ZGlmZiAtLWdpdCBhL0RlbW8vZW1iZWQvZGVtby5jIGIvRGVtby9lbWJlZC9kZW1vLmMKaW5kZXggNjAwNWYxMy4uNTViYzgwOCAxMDA2NDQKLS0tIGEvRGVtby9lbWJlZC9kZW1vLmMKKysrIGIvRGVtby9lbWJlZC9kZW1vLmMKQEAgLTYsNDAgKzYsNDAgQEAKIAogbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JLyogUGFzcyBhcmd2WzBdIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgKi8KLQlQeV9TZXRQcm9ncmFtTmFtZShhcmd2WzBdKTsKKyAgICAvKiBQYXNzIGFyZ3ZbMF0gdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlciAqLworICAgIFB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgUmVxdWlyZWQuICovCi0JUHlfSW5pdGlhbGl6ZSgpOworICAgIC8qIEluaXRpYWxpemUgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4gIFJlcXVpcmVkLiAqLworICAgIFB5X0luaXRpYWxpemUoKTsKIAotCS8qIEFkZCBhIHN0YXRpYyBtb2R1bGUgKi8KLQlpbml0eHl6enkoKTsKKyAgICAvKiBBZGQgYSBzdGF0aWMgbW9kdWxlICovCisgICAgaW5pdHh5enp5KCk7CiAKLQkvKiBEZWZpbmUgc3lzLmFyZ3YuICBJdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gaWYgeW91Ci0JICAgd2FudCB0aGlzOyB5b3UgY2FuIGFsc28gbGV0IGl0IHVuZGVmaW5lZCAoc2luY2UgdGhlIFB5dGhvbiAKLQkgICBjb2RlIGlzIGdlbmVyYWxseSBub3QgYSBtYWluIHByb2dyYW0gaXQgaGFzIG5vIGJ1c2luZXNzCi0JICAgdG91Y2hpbmcgc3lzLmFyZ3YuLi4pICovCi0JUHlTeXNfU2V0QXJndihhcmdjLCBhcmd2KTsKKyAgICAvKiBEZWZpbmUgc3lzLmFyZ3YuICBJdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gaWYgeW91CisgICAgICAgd2FudCB0aGlzOyB5b3UgY2FuIGFsc28gbGV0IGl0IHVuZGVmaW5lZCAoc2luY2UgdGhlIFB5dGhvbgorICAgICAgIGNvZGUgaXMgZ2VuZXJhbGx5IG5vdCBhIG1haW4gcHJvZ3JhbSBpdCBoYXMgbm8gYnVzaW5lc3MKKyAgICAgICB0b3VjaGluZyBzeXMuYXJndi4uLikgKi8KKyAgICBQeVN5c19TZXRBcmd2KGFyZ2MsIGFyZ3YpOwogCi0JLyogRG8gc29tZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBjb2RlICovCi0JcHJpbnRmKCJIZWxsbywgYnJhdmUgbmV3IHdvcmxkXG5cbiIpOworICAgIC8qIERvIHNvbWUgYXBwbGljYXRpb24gc3BlY2lmaWMgY29kZSAqLworICAgIHByaW50ZigiSGVsbG8sIGJyYXZlIG5ldyB3b3JsZFxuXG4iKTsKIAotCS8qIEV4ZWN1dGUgc29tZSBQeXRob24gc3RhdGVtZW50cyAoaW4gbW9kdWxlIF9fbWFpbl9fKSAqLwotCVB5UnVuX1NpbXBsZVN0cmluZygiaW1wb3J0IHN5c1xuIik7Ci0JUHlSdW5fU2ltcGxlU3RyaW5nKCJwcmludCBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXNcbiIpOwotCVB5UnVuX1NpbXBsZVN0cmluZygicHJpbnQgc3lzLm1vZHVsZXMua2V5cygpXG4iKTsKLQlQeVJ1bl9TaW1wbGVTdHJpbmcoInByaW50IHN5cy5leGVjdXRhYmxlXG4iKTsKLQlQeVJ1bl9TaW1wbGVTdHJpbmcoInByaW50IHN5cy5hcmd2XG4iKTsKKyAgICAvKiBFeGVjdXRlIHNvbWUgUHl0aG9uIHN0YXRlbWVudHMgKGluIG1vZHVsZSBfX21haW5fXykgKi8KKyAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoImltcG9ydCBzeXNcbiIpOworICAgIFB5UnVuX1NpbXBsZVN0cmluZygicHJpbnQgc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzXG4iKTsKKyAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoInByaW50IHN5cy5tb2R1bGVzLmtleXMoKVxuIik7CisgICAgUHlSdW5fU2ltcGxlU3RyaW5nKCJwcmludCBzeXMuZXhlY3V0YWJsZVxuIik7CisgICAgUHlSdW5fU2ltcGxlU3RyaW5nKCJwcmludCBzeXMuYXJndlxuIik7CiAKLQkvKiBOb3RlIHRoYXQgeW91IGNhbiBjYWxsIGFueSBwdWJsaWMgZnVuY3Rpb24gb2YgdGhlIFB5dGhvbgotCSAgIGludGVycHJldGVyIGhlcmUsIGUuZy4gY2FsbF9vYmplY3QoKS4gKi8KKyAgICAvKiBOb3RlIHRoYXQgeW91IGNhbiBjYWxsIGFueSBwdWJsaWMgZnVuY3Rpb24gb2YgdGhlIFB5dGhvbgorICAgICAgIGludGVycHJldGVyIGhlcmUsIGUuZy4gY2FsbF9vYmplY3QoKS4gKi8KIAotCS8qIFNvbWUgbW9yZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBjb2RlICovCi0JcHJpbnRmKCJcbkdvb2RieWUsIGNydWVsIHdvcmxkXG4iKTsKKyAgICAvKiBTb21lIG1vcmUgYXBwbGljYXRpb24gc3BlY2lmaWMgY29kZSAqLworICAgIHByaW50ZigiXG5Hb29kYnllLCBjcnVlbCB3b3JsZFxuIik7CiAKLQkvKiBFeGl0LCBjbGVhbmluZyB1cCB0aGUgaW50ZXJwcmV0ZXIgKi8KLQlQeV9FeGl0KDApOwotCS8qTk9UUkVBQ0hFRCovCisgICAgLyogRXhpdCwgY2xlYW5pbmcgdXAgdGhlIGludGVycHJldGVyICovCisgICAgUHlfRXhpdCgwKTsKKyAgICAvKk5PVFJFQUNIRUQqLwogfQogCiAvKiBBIHN0YXRpYyBtb2R1bGUgKi8KQEAgLTQ4LDE4ICs0OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHh5enp5X2ZvbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKDQyTCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDQyTCk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB4eXp6eV9tZXRob2RzW10gPSB7Ci0JeyJmb28iLAkJeHl6enlfZm9vLAlNRVRIX05PQVJHUywKLQkgIlJldHVybiB0aGUgbWVhbmluZyBvZiBldmVyeXRoaW5nLiJ9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJmb28iLCAgICAgICAgICAgICB4eXp6eV9mb28sICAgICAgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm4gdGhlIG1lYW5pbmcgb2YgZXZlcnl0aGluZy4ifSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogdm9pZAogaW5pdHh5enp5KHZvaWQpCiB7Ci0JUHlJbXBvcnRfQWRkTW9kdWxlKCJ4eXp6eSIpOwotCVB5X0luaXRNb2R1bGUoInh5enp5IiwgeHl6enlfbWV0aG9kcyk7CisgICAgUHlJbXBvcnRfQWRkTW9kdWxlKCJ4eXp6eSIpOworICAgIFB5X0luaXRNb2R1bGUoInh5enp5IiwgeHl6enlfbWV0aG9kcyk7CiB9CmRpZmYgLS1naXQgYS9EZW1vL2VtYmVkL2xvb3AuYyBiL0RlbW8vZW1iZWQvbG9vcC5jCmluZGV4IGQ1YWY4MjkuLjJmN2ZlNjIgMTAwNjQ0Ci0tLSBhL0RlbW8vZW1iZWQvbG9vcC5jCisrKyBiL0RlbW8vZW1iZWQvbG9vcC5jCkBAIC02LDI4ICs2LDI4IEBACiAKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCWludCBjb3VudCA9IC0xOwotCWNoYXIgKmNvbW1hbmQ7CisgICAgaW50IGNvdW50ID0gLTE7CisgICAgY2hhciAqY29tbWFuZDsKIAotCWlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgewotCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBsb29wIDxweXRob24tY29tbWFuZD4gW2NvdW50XVxuIik7Ci0JCWV4aXQoMik7Ci0JfQotCWNvbW1hbmQgPSBhcmd2WzFdOworICAgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBsb29wIDxweXRob24tY29tbWFuZD4gW2NvdW50XVxuIik7CisgICAgICAgIGV4aXQoMik7CisgICAgfQorICAgIGNvbW1hbmQgPSBhcmd2WzFdOwogCi0JaWYgKGFyZ2MgPT0gMykgewotCQljb3VudCA9IGF0b2koYXJndlsyXSk7Ci0JfQorICAgIGlmIChhcmdjID09IDMpIHsKKyAgICAgICAgY291bnQgPSBhdG9pKGFyZ3ZbMl0pOworICAgIH0KIAotCVB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOworICAgIFB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOwogCi0JLyogdW5jb21tZW50IHRoaXMgaWYgeW91IGRvbid0IHdhbnQgdG8gbG9hZCBzaXRlLnB5ICovCi0JLyogUHlfTm9TaXRlRmxhZyA9IDE7ICovCisgICAgLyogdW5jb21tZW50IHRoaXMgaWYgeW91IGRvbid0IHdhbnQgdG8gbG9hZCBzaXRlLnB5ICovCisgICAgLyogUHlfTm9TaXRlRmxhZyA9IDE7ICovCiAKLQl3aGlsZSAoY291bnQgPT0gLTEgfHwgLS1jb3VudCA+PSAwICkgewotCQlQeV9Jbml0aWFsaXplKCk7Ci0JCVB5UnVuX1NpbXBsZVN0cmluZyhjb21tYW5kKTsKLQkJUHlfRmluYWxpemUoKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgd2hpbGUgKGNvdW50ID09IC0xIHx8IC0tY291bnQgPj0gMCApIHsKKyAgICAgICAgUHlfSW5pdGlhbGl6ZSgpOworICAgICAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoY29tbWFuZCk7CisgICAgICAgIFB5X0ZpbmFsaXplKCk7CisgICAgfQorICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvRGVtby9weXN2ci9weXN2ci5jIGIvRGVtby9weXN2ci9weXN2ci5jCmluZGV4IGNjZWQ2ZGEuLjcwNmNkMmEgMTAwNjQ0Ci0tLSBhL0RlbW8vcHlzdnIvcHlzdnIuYworKysgYi9EZW1vL3B5c3ZyL3B5c3ZyLmMKQEAgLTM0LDggKzM0LDggQEAKICNlbmRpZgogCiBzdHJ1Y3Qgd29ya29yZGVyIHsKLQlpbnQgY29ubjsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKyAgICBpbnQgY29ubjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKIH07CiAKIC8qIEZvcndhcmQgKi8KQEAgLTU1LDQwICs1NSw0MCBAQAogCiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQlpbnQgcG9ydCA9IFBPUlQ7Ci0JaW50IGM7CisgICAgaW50IHBvcnQgPSBQT1JUOworICAgIGludCBjOwogCi0JaWYgKGFyZ2MgPiAwICYmIGFyZ3ZbMF0gIT0gTlVMTCAmJiBhcmd2WzBdWzBdICE9ICdcMCcpCi0JCXByb2duYW1lID0gYXJndlswXTsKKyAgICBpZiAoYXJnYyA+IDAgJiYgYXJndlswXSAhPSBOVUxMICYmIGFyZ3ZbMF1bMF0gIT0gJ1wwJykKKyAgICAgICAgcHJvZ25hbWUgPSBhcmd2WzBdOwogCi0Jd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ2IikpICE9IEVPRikgewotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSAndic6Ci0JCQlQeV9WZXJib3NlRmxhZysrOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl1c2FnZSgpOwotCQl9Ci0JfQorICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAidiIpKSAhPSBFT0YpIHsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgUHlfVmVyYm9zZUZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChvcHRpbmQgPCBhcmdjKSB7Ci0JCWlmIChvcHRpbmQrMSA8IGFyZ2MpIHsKLQkJCW9wcm9nbmFtZSgpOwotCQkJZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBhcmd1bWVudHNcbiIpOwotCQkJdXNhZ2UoKTsKLQkJfQotCQlwb3J0ID0gYXRvaShhcmd2W29wdGluZF0pOwotCQlpZiAocG9ydCA8PSAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImJhZCBwb3J0ICglcylcbiIsIGFyZ3Zbb3B0aW5kXSk7Ci0JCQl1c2FnZSgpOwotCQl9Ci0JfQorICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGlmIChvcHRpbmQrMSA8IGFyZ2MpIHsKKyAgICAgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBhcmd1bWVudHNcbiIpOworICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBwb3J0ID0gYXRvaShhcmd2W29wdGluZF0pOworICAgICAgICBpZiAocG9ydCA8PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBwb3J0ICglcylcbiIsIGFyZ3Zbb3B0aW5kXSk7CisgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgfQogCi0JbWFpbl90aHJlYWQocG9ydCk7CisgICAgbWFpbl90aHJlYWQocG9ydCk7CiAKLQlmcHJpbnRmKHN0ZGVyciwgIkJ5ZS5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiQnllLlxuIik7CiAKLQlleGl0KDApOworICAgIGV4aXQoMCk7CiB9CiAKIHN0YXRpYyBjaGFyIHVzYWdlX2xpbmVbXSA9ICJ1c2FnZTogJXMgW3BvcnRdXG4iOwpAQCAtOTYsMTIwICs5NiwxMjAgQEAKIHN0YXRpYyB2b2lkCiB1c2FnZSh2b2lkKQogewotCWZwcmludGYoc3RkZXJyLCB1c2FnZV9saW5lLCBwcm9nbmFtZSk7Ci0JZXhpdCgyKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgdXNhZ2VfbGluZSwgcHJvZ25hbWUpOworICAgIGV4aXQoMik7CiB9CiAKIHN0YXRpYyB2b2lkCiBtYWluX3RocmVhZChpbnQgcG9ydCkKIHsKLQlpbnQgc29jaywgY29ubiwgc2l6ZSwgaTsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciwgY2xpZW50YWRkcjsKKyAgICBpbnQgc29jaywgY29ubiwgc2l6ZSwgaTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciwgY2xpZW50YWRkcjsKIAotCXNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApOwotCWlmIChzb2NrIDwgMCkgewotCQlvcHJvZ25hbWUoKTsKLQkJcGVycm9yKCJjYW4ndCBjcmVhdGUgc29ja2V0Iik7Ci0JCWV4aXQoMSk7Ci0JfQorICAgIHNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICAgIGlmIChzb2NrIDwgMCkgeworICAgICAgICBvcHJvZ25hbWUoKTsKKyAgICAgICAgcGVycm9yKCJjYW4ndCBjcmVhdGUgc29ja2V0Iik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQogCiAjaWZkZWYgU09fUkVVU0VBRERSCi0JaSA9IDE7Ci0Jc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyICopICZpLCBzaXplb2YgaSk7CisgICAgaSA9IDE7CisgICAgc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyICopICZpLCBzaXplb2YgaSk7CiAjZW5kaWYKIAotCW1lbXNldCgoY2hhciAqKSZhZGRyLCAnXDAnLCBzaXplb2YgYWRkcik7Ci0JYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0JYWRkci5zaW5fYWRkci5zX2FkZHIgPSAwTDsKLQlpZiAoYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZiBhZGRyKSA8IDApIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgYmluZCBzb2NrZXQgdG8gYWRkcmVzcyIpOwotCQlleGl0KDEpOwotCX0KKyAgICBtZW1zZXQoKGNoYXIgKikmYWRkciwgJ1wwJywgc2l6ZW9mIGFkZHIpOworICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gMEw7CisgICAgaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YgYWRkcikgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGJpbmQgc29ja2V0IHRvIGFkZHJlc3MiKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CiAKLQlpZiAobGlzdGVuKHNvY2ssIDUpIDwgMCkgewotCQlvcHJvZ25hbWUoKTsKLQkJcGVycm9yKCJjYW4ndCBsaXN0ZW4gb24gc29ja2V0Iik7Ci0JCWV4aXQoMSk7Ci0JfQorICAgIGlmIChsaXN0ZW4oc29jaywgNSkgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGxpc3RlbiBvbiBzb2NrZXQiKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CiAKLQlmcHJpbnRmKHN0ZGVyciwgIkxpc3RlbmluZyBvbiBwb3J0ICVkLi4uXG4iLCBwb3J0KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3RlbmluZyBvbiBwb3J0ICVkLi4uXG4iLCBwb3J0KTsKIAotCWZvciAoaSA9IDA7IDsgaSsrKSB7Ci0JCXNpemUgPSBzaXplb2YgY2xpZW50YWRkcjsKLQkJbWVtc2V0KChjaGFyICopICZjbGllbnRhZGRyLCAnXDAnLCBzaXplKTsKLQkJY29ubiA9IGFjY2VwdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZjbGllbnRhZGRyLCAmc2l6ZSk7Ci0JCWlmIChjb25uIDwgMCkgewotCQkJb3Byb2duYW1lKCk7Ci0JCQlwZXJyb3IoImNhbid0IGFjY2VwdCBjb25uZWN0aW9uIGZyb20gc29ja2V0Iik7Ci0JCQlleGl0KDEpOwotCQl9CisgICAgZm9yIChpID0gMDsgOyBpKyspIHsKKyAgICAgICAgc2l6ZSA9IHNpemVvZiBjbGllbnRhZGRyOworICAgICAgICBtZW1zZXQoKGNoYXIgKikgJmNsaWVudGFkZHIsICdcMCcsIHNpemUpOworICAgICAgICBjb25uID0gYWNjZXB0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNsaWVudGFkZHIsICZzaXplKTsKKyAgICAgICAgaWYgKGNvbm4gPCAwKSB7CisgICAgICAgICAgICBvcHJvZ25hbWUoKTsKKyAgICAgICAgICAgIHBlcnJvcigiY2FuJ3QgYWNjZXB0IGNvbm5lY3Rpb24gZnJvbSBzb2NrZXQiKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KIAotCQlzaXplID0gc2l6ZW9mIGFkZHI7Ci0JCW1lbXNldCgoY2hhciAqKSAmYWRkciwgJ1wwJywgc2l6ZSk7Ci0JCWlmIChnZXRzb2NrbmFtZShjb25uLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZzaXplKSA8IDApIHsKLQkJCW9wcm9nbmFtZSgpOwotCQkJcGVycm9yKCJjYW4ndCBnZXQgc29ja2V0IG5hbWUgb2YgY29ubmVjdGlvbiIpOwotCQkJZXhpdCgxKTsKLQkJfQotCQlpZiAoY2xpZW50YWRkci5zaW5fYWRkci5zX2FkZHIgIT0gYWRkci5zaW5fYWRkci5zX2FkZHIpIHsKLQkJCW9wcm9nbmFtZSgpOwotCQkJcGVycm9yKCJjb25uZWN0aW9uIGZyb20gbm9uLWxvY2FsIGhvc3QgcmVmdXNlZCIpOwotCQkJZnByaW50ZihzdGRlcnIsICIoYWRkcj0lbHgsIGNsaWVudGFkZHI9JWx4KVxuIiwKLQkJCQludG9obChhZGRyLnNpbl9hZGRyLnNfYWRkciksCi0JCQkJbnRvaGwoY2xpZW50YWRkci5zaW5fYWRkci5zX2FkZHIpKTsKLQkJCWNsb3NlKGNvbm4pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGkgPT0gNCkgewotCQkJY2xvc2UoY29ubik7Ci0JCQlicmVhazsKLQkJfQotCQljcmVhdGVfdGhyZWFkKGNvbm4sICZjbGllbnRhZGRyKTsKLQl9CisgICAgICAgIHNpemUgPSBzaXplb2YgYWRkcjsKKyAgICAgICAgbWVtc2V0KChjaGFyICopICZhZGRyLCAnXDAnLCBzaXplKTsKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKGNvbm4sIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJnNpemUpIDwgMCkgeworICAgICAgICAgICAgb3Byb2duYW1lKCk7CisgICAgICAgICAgICBwZXJyb3IoImNhbid0IGdldCBzb2NrZXQgbmFtZSBvZiBjb25uZWN0aW9uIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRhZGRyLnNpbl9hZGRyLnNfYWRkciAhPSBhZGRyLnNpbl9hZGRyLnNfYWRkcikgeworICAgICAgICAgICAgb3Byb2duYW1lKCk7CisgICAgICAgICAgICBwZXJyb3IoImNvbm5lY3Rpb24gZnJvbSBub24tbG9jYWwgaG9zdCByZWZ1c2VkIik7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIihhZGRyPSVseCwgY2xpZW50YWRkcj0lbHgpXG4iLAorICAgICAgICAgICAgICAgIG50b2hsKGFkZHIuc2luX2FkZHIuc19hZGRyKSwKKyAgICAgICAgICAgICAgICBudG9obChjbGllbnRhZGRyLnNpbl9hZGRyLnNfYWRkcikpOworICAgICAgICAgICAgY2xvc2UoY29ubik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSA0KSB7CisgICAgICAgICAgICBjbG9zZShjb25uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZV90aHJlYWQoY29ubiwgJmNsaWVudGFkZHIpOworICAgIH0KIAotCWNsb3NlKHNvY2spOworICAgIGNsb3NlKHNvY2spOwogCi0JaWYgKGd0c3RhdGUpIHsKLQkJUHlFdmFsX0FjcXVpcmVUaHJlYWQoZ3RzdGF0ZSk7Ci0JCWd0c3RhdGUgPSBOVUxMOwotCQlQeV9GaW5hbGl6ZSgpOwotCQkvKiBBbmQgYSBzZWNvbmQgdGltZSwganVzdCBiZWNhdXNlIHdlIGNhbi4gKi8KLQkJUHlfRmluYWxpemUoKTsgLyogVGhpcyBzaG91bGQgYmUgaGFybWxlc3MuICovCi0JfQotCWV4aXQoMCk7CisgICAgaWYgKGd0c3RhdGUpIHsKKyAgICAgICAgUHlFdmFsX0FjcXVpcmVUaHJlYWQoZ3RzdGF0ZSk7CisgICAgICAgIGd0c3RhdGUgPSBOVUxMOworICAgICAgICBQeV9GaW5hbGl6ZSgpOworICAgICAgICAvKiBBbmQgYSBzZWNvbmQgdGltZSwganVzdCBiZWNhdXNlIHdlIGNhbi4gKi8KKyAgICAgICAgUHlfRmluYWxpemUoKTsgLyogVGhpcyBzaG91bGQgYmUgaGFybWxlc3MuICovCisgICAgfQorICAgIGV4aXQoMCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBjcmVhdGVfdGhyZWFkKGludCBjb25uLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIpCiB7Ci0Jc3RydWN0IHdvcmtvcmRlciAqd29yazsKLQlwdGhyZWFkX3QgdGRhdGE7CisgICAgc3RydWN0IHdvcmtvcmRlciAqd29yazsKKyAgICBwdGhyZWFkX3QgdGRhdGE7CiAKLQl3b3JrID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd29ya29yZGVyKSk7Ci0JaWYgKHdvcmsgPT0gTlVMTCkgewotCQlvcHJvZ25hbWUoKTsKLQkJZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5IGZvciB0aHJlYWQuXG4iKTsKLQkJY2xvc2UoY29ubik7Ci0JCXJldHVybjsKLQl9Ci0Jd29yay0+Y29ubiA9IGNvbm47Ci0Jd29yay0+YWRkciA9ICphZGRyOworICAgIHdvcmsgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB3b3Jrb3JkZXIpKTsKKyAgICBpZiAod29yayA9PSBOVUxMKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm91dCBvZiBtZW1vcnkgZm9yIHRocmVhZC5cbiIpOworICAgICAgICBjbG9zZShjb25uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3b3JrLT5jb25uID0gY29ubjsKKyAgICB3b3JrLT5hZGRyID0gKmFkZHI7CiAKLQlpbml0X3B5dGhvbigpOworICAgIGluaXRfcHl0aG9uKCk7CiAKLQlpZiAocHRocmVhZF9jcmVhdGUoJnRkYXRhLCBOVUxMLCAodm9pZCAqKXNlcnZpY2VfdGhyZWFkLCB3b3JrKSA8IDApIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgY3JlYXRlIG5ldyB0aHJlYWQiKTsKLQkJY2xvc2UoY29ubik7Ci0JCXJldHVybjsKLQl9CisgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0ZGF0YSwgTlVMTCwgKHZvaWQgKilzZXJ2aWNlX3RocmVhZCwgd29yaykgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGNyZWF0ZSBuZXcgdGhyZWFkIik7CisgICAgICAgIGNsb3NlKGNvbm4pOworICAgICAgICByZXR1cm47CisgICAgfQogCi0JaWYgKHB0aHJlYWRfZGV0YWNoKHRkYXRhKSA8IDApIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgZGV0YWNoIGZyb20gdGhyZWFkIik7Ci0JfQorICAgIGlmIChwdGhyZWFkX2RldGFjaCh0ZGF0YSkgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGRldGFjaCBmcm9tIHRocmVhZCIpOworICAgIH0KIH0KIAogc3RhdGljIFB5VGhyZWFkU3RhdGUgKnRoZV90c3RhdGU7CkBAIC0yMTksMTUyICsyMTksMTUyIEBACiBzdGF0aWMgdm9pZAogaW5pdF9weXRob24odm9pZCkKIHsKLQlpZiAoZ3RzdGF0ZSkKLQkJcmV0dXJuOwotCVB5X0luaXRpYWxpemUoKTsgLyogSW5pdGlhbGl6ZSB0aGUgaW50ZXJwcmV0ZXIgKi8KLQlQeUV2YWxfSW5pdFRocmVhZHMoKTsgLyogQ3JlYXRlIChhbmQgYWNxdWlyZSkgdGhlIGludGVycHJldGVyIGxvY2sgKi8KLQlndHN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsgLyogUmVsZWFzZSB0aGUgdGhyZWFkIHN0YXRlICovCisgICAgaWYgKGd0c3RhdGUpCisgICAgICAgIHJldHVybjsKKyAgICBQeV9Jbml0aWFsaXplKCk7IC8qIEluaXRpYWxpemUgdGhlIGludGVycHJldGVyICovCisgICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7IC8qIENyZWF0ZSAoYW5kIGFjcXVpcmUpIHRoZSBpbnRlcnByZXRlciBsb2NrICovCisgICAgZ3RzdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7IC8qIFJlbGVhc2UgdGhlIHRocmVhZCBzdGF0ZSAqLwogfQogCiBzdGF0aWMgdm9pZCAqCiBzZXJ2aWNlX3RocmVhZChzdHJ1Y3Qgd29ya29yZGVyICp3b3JrKQogewotCUZJTEUgKmlucHV0LCAqb3V0cHV0OworICAgIEZJTEUgKmlucHV0LCAqb3V0cHV0OwogCi0JZnByaW50ZihzdGRlcnIsICJTdGFydCB0aHJlYWQgZm9yIGNvbm5lY3Rpb24gJWQuXG4iLCB3b3JrLT5jb25uKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlN0YXJ0IHRocmVhZCBmb3IgY29ubmVjdGlvbiAlZC5cbiIsIHdvcmstPmNvbm4pOwogCi0JcHMoKTsKKyAgICBwcygpOwogCi0JaW5wdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInIiKTsKLQlpZiAoaW5wdXQgPT0gTlVMTCkgewotCQlvcHJvZ25hbWUoKTsKLQkJcGVycm9yKCJjYW4ndCBjcmVhdGUgaW5wdXQgc3RyZWFtIik7Ci0JCWdvdG8gZG9uZTsKLQl9CisgICAgaW5wdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInIiKTsKKyAgICBpZiAoaW5wdXQgPT0gTlVMTCkgeworICAgICAgICBvcHJvZ25hbWUoKTsKKyAgICAgICAgcGVycm9yKCJjYW4ndCBjcmVhdGUgaW5wdXQgc3RyZWFtIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQlvdXRwdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInciKTsKLQlpZiAob3V0cHV0ID09IE5VTEwpIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0iKTsKLQkJZmNsb3NlKGlucHV0KTsKLQkJZ290byBkb25lOwotCX0KKyAgICBvdXRwdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInciKTsKKyAgICBpZiAob3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgb3Byb2duYW1lKCk7CisgICAgICAgIHBlcnJvcigiY2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0iKTsKKyAgICAgICAgZmNsb3NlKGlucHV0KTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KIAotCXNldHZidWYoaW5wdXQsIE5VTEwsIF9JT05CRiwgMCk7Ci0Jc2V0dmJ1ZihvdXRwdXQsIE5VTEwsIF9JT05CRiwgMCk7CisgICAgc2V0dmJ1ZihpbnB1dCwgTlVMTCwgX0lPTkJGLCAwKTsKKyAgICBzZXR2YnVmKG91dHB1dCwgTlVMTCwgX0lPTkJGLCAwKTsKIAotCXJ1bl9pbnRlcnByZXRlcihpbnB1dCwgb3V0cHV0KTsKKyAgICBydW5faW50ZXJwcmV0ZXIoaW5wdXQsIG91dHB1dCk7CiAKLQlmY2xvc2UoaW5wdXQpOwotCWZjbG9zZShvdXRwdXQpOworICAgIGZjbG9zZShpbnB1dCk7CisgICAgZmNsb3NlKG91dHB1dCk7CiAKICAgZG9uZToKLQlmcHJpbnRmKHN0ZGVyciwgIkVuZCB0aHJlYWQgZm9yIGNvbm5lY3Rpb24gJWQuXG4iLCB3b3JrLT5jb25uKTsKLQljbG9zZSh3b3JrLT5jb25uKTsKLQlmcmVlKHdvcmspOworICAgIGZwcmludGYoc3RkZXJyLCAiRW5kIHRocmVhZCBmb3IgY29ubmVjdGlvbiAlZC5cbiIsIHdvcmstPmNvbm4pOworICAgIGNsb3NlKHdvcmstPmNvbm4pOworICAgIGZyZWUod29yayk7CiB9CiAKIHN0YXRpYyB2b2lkCiBvcHJvZ25hbWUodm9pZCkKIHsKLQlpbnQgc2F2ZSA9IGVycm5vOwotCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2duYW1lKTsKLQllcnJubyA9IHNhdmU7CisgICAgaW50IHNhdmUgPSBlcnJubzsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSk7CisgICAgZXJybm8gPSBzYXZlOwogfQogCiBzdGF0aWMgdm9pZAogcnVuX2ludGVycHJldGVyKEZJTEUgKmlucHV0LCBGSUxFICpvdXRwdXQpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwotCVB5T2JqZWN0ICpuZXdfc3RkaW4sICpuZXdfc3Rkb3V0OwotCVB5T2JqZWN0ICptYWlubW9kLCAqZ2xvYmFsczsKLQljaGFyIGJ1ZmZlclsxMDAwXTsKLQljaGFyICpwLCAqcTsKLQlpbnQgbiwgZW5kOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBQeU9iamVjdCAqbmV3X3N0ZGluLCAqbmV3X3N0ZG91dDsKKyAgICBQeU9iamVjdCAqbWFpbm1vZCwgKmdsb2JhbHM7CisgICAgY2hhciBidWZmZXJbMTAwMF07CisgICAgY2hhciAqcCwgKnE7CisgICAgaW50IG4sIGVuZDsKIAotCVB5RXZhbF9BY3F1aXJlTG9jaygpOwotCXRzdGF0ZSA9IFB5X05ld0ludGVycHJldGVyKCk7Ci0JaWYgKHRzdGF0ZSA9PSBOVUxMKSB7Ci0JCWZwcmludGYob3V0cHV0LCAiU29ycnkgLS0gY2FuJ3QgY3JlYXRlIGFuIGludGVycHJldGVyXG4iKTsKLQkJcmV0dXJuOwotCX0KKyAgICBQeUV2YWxfQWNxdWlyZUxvY2soKTsKKyAgICB0c3RhdGUgPSBQeV9OZXdJbnRlcnByZXRlcigpOworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKG91dHB1dCwgIlNvcnJ5IC0tIGNhbid0IGNyZWF0ZSBhbiBpbnRlcnByZXRlclxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQltYWlubW9kID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwotCWdsb2JhbHMgPSBQeU1vZHVsZV9HZXREaWN0KG1haW5tb2QpOwotCVB5X0lOQ1JFRihnbG9iYWxzKTsKKyAgICBtYWlubW9kID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOworICAgIGdsb2JhbHMgPSBQeU1vZHVsZV9HZXREaWN0KG1haW5tb2QpOworICAgIFB5X0lOQ1JFRihnbG9iYWxzKTsKIAotCW5ld19zdGRpbiA9IFB5RmlsZV9Gcm9tRmlsZShpbnB1dCwgIjxzb2NrZXQtaW4+IiwgInIiLCBOVUxMKTsKLQluZXdfc3Rkb3V0ID0gUHlGaWxlX0Zyb21GaWxlKG91dHB1dCwgIjxzb2NrZXQtb3V0PiIsICJ3IiwgTlVMTCk7CisgICAgbmV3X3N0ZGluID0gUHlGaWxlX0Zyb21GaWxlKGlucHV0LCAiPHNvY2tldC1pbj4iLCAiciIsIE5VTEwpOworICAgIG5ld19zdGRvdXQgPSBQeUZpbGVfRnJvbUZpbGUob3V0cHV0LCAiPHNvY2tldC1vdXQ+IiwgInciLCBOVUxMKTsKIAotCVB5U3lzX1NldE9iamVjdCgic3RkaW4iLCBuZXdfc3RkaW4pOwotCVB5U3lzX1NldE9iamVjdCgic3Rkb3V0IiwgbmV3X3N0ZG91dCk7Ci0JUHlTeXNfU2V0T2JqZWN0KCJzdGRlcnIiLCBuZXdfc3Rkb3V0KTsKKyAgICBQeVN5c19TZXRPYmplY3QoInN0ZGluIiwgbmV3X3N0ZGluKTsKKyAgICBQeVN5c19TZXRPYmplY3QoInN0ZG91dCIsIG5ld19zdGRvdXQpOworICAgIFB5U3lzX1NldE9iamVjdCgic3RkZXJyIiwgbmV3X3N0ZG91dCk7CiAKLQlmb3IgKG4gPSAxOyAhUHlFcnJfT2NjdXJyZWQoKTsgbisrKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnByaW50ZihvdXRwdXQsICIlZD4gIiwgbik7Ci0JCXAgPSBmZ2V0cyhidWZmZXIsIHNpemVvZiBidWZmZXIsIGlucHV0KTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBmb3IgKG4gPSAxOyAhUHlFcnJfT2NjdXJyZWQoKTsgbisrKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZnByaW50ZihvdXRwdXQsICIlZD4gIiwgbik7CisgICAgICAgIHAgPSBmZ2V0cyhidWZmZXIsIHNpemVvZiBidWZmZXIsIGlucHV0KTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCQlpZiAocCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWlmIChwWzBdID09ICdcMzc3JyAmJiBwWzFdID09ICdcMzU0JykKLQkJCWJyZWFrOworICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChwWzBdID09ICdcMzc3JyAmJiBwWzFdID09ICdcMzU0JykKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCXEgPSBzdHJyY2hyKHAsICdccicpOwotCQlpZiAocSAmJiBxWzFdID09ICdcbicgJiYgcVsyXSA9PSAnXDAnKSB7Ci0JCQkqcSsrID0gJ1xuJzsKLQkJCSpxKysgPSAnXDAnOwotCQl9CisgICAgICAgIHEgPSBzdHJyY2hyKHAsICdccicpOworICAgICAgICBpZiAocSAmJiBxWzFdID09ICdcbicgJiYgcVsyXSA9PSAnXDAnKSB7CisgICAgICAgICAgICAqcSsrID0gJ1xuJzsKKyAgICAgICAgICAgICpxKysgPSAnXDAnOworICAgICAgICB9CiAKLQkJd2hpbGUgKCpwICYmIGlzc3BhY2UoKnApKQotCQkJcCsrOwotCQlpZiAocFswXSA9PSAnIycgfHwgcFswXSA9PSAnXDAnKQotCQkJY29udGludWU7CisgICAgICAgIHdoaWxlICgqcCAmJiBpc3NwYWNlKCpwKSkKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgaWYgKHBbMF0gPT0gJyMnIHx8IHBbMF0gPT0gJ1wwJykKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWVuZCA9IHJ1bl9jb21tYW5kKGJ1ZmZlciwgZ2xvYmFscyk7Ci0JCWlmIChlbmQgPCAwKQotCQkJUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgZW5kID0gcnVuX2NvbW1hbmQoYnVmZmVyLCBnbG9iYWxzKTsKKyAgICAgICAgaWYgKGVuZCA8IDApCisgICAgICAgICAgICBQeUVycl9QcmludCgpOwogCi0JCWlmIChlbmQpCi0JCQlicmVhazsKLQl9CisgICAgICAgIGlmIChlbmQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQlQeV9YREVDUkVGKGdsb2JhbHMpOwotCVB5X1hERUNSRUYobmV3X3N0ZGluKTsKLQlQeV9YREVDUkVGKG5ld19zdGRvdXQpOworICAgIFB5X1hERUNSRUYoZ2xvYmFscyk7CisgICAgUHlfWERFQ1JFRihuZXdfc3RkaW4pOworICAgIFB5X1hERUNSRUYobmV3X3N0ZG91dCk7CiAKLQlQeV9FbmRJbnRlcnByZXRlcih0c3RhdGUpOwotCVB5RXZhbF9SZWxlYXNlTG9jaygpOworICAgIFB5X0VuZEludGVycHJldGVyKHRzdGF0ZSk7CisgICAgUHlFdmFsX1JlbGVhc2VMb2NrKCk7CiAKLQlmcHJpbnRmKG91dHB1dCwgIkdvb2RieWUhXG4iKTsKKyAgICBmcHJpbnRmKG91dHB1dCwgIkdvb2RieWUhXG4iKTsKIH0KIAogc3RhdGljIGludAogcnVuX2NvbW1hbmQoY2hhciAqYnVmZmVyLCBQeU9iamVjdCAqZ2xvYmFscykKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp2OwotCWZwcmludGYoc3RkZXJyLCAicnVuX2NvbW1hbmQ6ICVzIiwgYnVmZmVyKTsKLQlpZiAoc3RyY2hyKGJ1ZmZlciwgJ1xuJykgPT0gTlVMTCkKLQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCXYgPSBQeVJ1bl9TdHJpbmcoYnVmZmVyLCBQeV9zaW5nbGVfaW5wdXQsIGdsb2JhbHMsIGdsb2JhbHMpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkgPT0gUHlFeGNfU3lzdGVtRXhpdCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybiAwOwotCX0KLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKm0sICpkLCAqdjsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInJ1bl9jb21tYW5kOiAlcyIsIGJ1ZmZlcik7CisgICAgaWYgKHN0cmNocihidWZmZXIsICdcbicpID09IE5VTEwpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICB2ID0gUHlSdW5fU3RyaW5nKGJ1ZmZlciwgUHlfc2luZ2xlX2lucHV0LCBnbG9iYWxzLCBnbG9iYWxzKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpID09IFB5RXhjX1N5c3RlbUV4aXQpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogcHModm9pZCkKIHsKLQljaGFyIGJ1ZmZlclsxMDBdOwotCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJICAgICAgInBzIC1sIC1wICVkIDwvZGV2L251bGwgfCBzZWQgMWRcbiIsIGdldHBpZCgpKTsKLQlzeXN0ZW0oYnVmZmVyKTsKKyAgICBjaGFyIGJ1ZmZlclsxMDBdOworICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICJwcyAtbCAtcCAlZCA8L2Rldi9udWxsIHwgc2VkIDFkXG4iLCBnZXRwaWQoKSk7CisgICAgc3lzdGVtKGJ1ZmZlcik7CiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL2Fic3RyYWN0LmggYi9JbmNsdWRlL2Fic3RyYWN0LmgKaW5kZXggZmM5YzZiNS4uNmNhNDk4OCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9hYnN0cmFjdC5oCisrKyBiL0luY2x1ZGUvYWJzdHJhY3QuaApAQCAtMzIsNyArMzIsNyBAQAogCiAgIElmIHRoZSBwcm9ncmFtbWVyIHdhbnRzIHRvIGdldCBhbiBpdGVtIGZyb20gYW5vdGhlciB0eXBlIG9mIG9iamVjdAogICB0aGF0IHByb3ZpZGVzIHNlcXVlbmNlIGJlaGF2aW9yLCB0aGVyZSBpcyBubyBjbGVhciB3YXkgdG8gZG8gaXQKLSAgY29ycmVjdGx5LiAgCisgIGNvcnJlY3RseS4KIAogICBUaGUgcGVyc2lzdGVudCBwcm9ncmFtbWVyIG1heSBwZXJ1c2Ugb2JqZWN0LmggYW5kIGZpbmQgdGhhdCB0aGUKICAgX3R5cGVvYmplY3Qgc3RydWN0dXJlIHByb3ZpZGVzIGEgbWVhbnMgb2YgaW52b2tpbmcgdXAgdG8gKGN1cnJlbnRseQpAQCAtNDQsNyArNDQsNyBAQAogICBBbHNvLCBjZXJ0YWluIHNlbWFudGljcywgZXNwZWNpYWxseSBtZW1vcnkgbWFuYWdlbWVudCBzZW1hbnRpY3MsIG1heQogICBkaWZmZXIgYnkgdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHVzZWQuICBVbmZvcnR1bmF0ZWx5LCB0aGVzZQogICBzZW1hbnRpY3MgYXJlIG5vdCBjbGVhcmx5IGRlc2NyaWJlZCBpbiB0aGUgY3VycmVudCBpbmNsdWRlIGZpbGVzLgotICBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgcHJvdmlkaW5nIG1vcmUgY29uc2lzdGVudCBzZW1hbnRpY3MgaXMgbmVlZGVkLiAKKyAgQW4gYWJzdHJhY3QgaW50ZXJmYWNlIHByb3ZpZGluZyBtb3JlIGNvbnNpc3RlbnQgc2VtYW50aWNzIGlzIG5lZWRlZC4KIAogUHJvcG9zYWwKIApAQCAtNzcsNyArNzcsNyBAQAogICAgIFB5dGhvbiBkaXN0cmlidXRpb25zLgogCiAgIEZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgUHl0aG9uIGFjY2Vzc2luZyBzZXJ2aWNlcyBwcm92aWRlZCBieSBDCi0gIG1vZHVsZXM6IAorICBtb2R1bGVzOgogCiAgIC0gIlB5dGhvbiBtb2R1bGUgaW50ZXJmYWNlIjogdGhpcyBpbnRlcmZhY2UgY29uc2lzdCBvZiB0aGUgYmFzaWMKICAgICByb3V0aW5lcyB1c2VkIHRvIGRlZmluZSBtb2R1bGVzIGFuZCB0aGVpciBtZW1iZXJzLiAgTW9zdCBvZiB0aGUKQEAgLTEzMywxMSArMTMzLDExIEBACiAKICAgICAgaW50IFB5T2JqZWN0X1ByaW50KFB5T2JqZWN0ICpvLCBGSUxFICpmcCwgaW50IGZsYWdzKTsKIAotICAgICAgICAgUHJpbnQgYW4gb2JqZWN0LCBvLCBvbiBmaWxlLCBmcC4gIFJldHVybnMgLTEgb24KLQkgZXJyb3IuICBUaGUgZmxhZ3MgYXJndW1lbnQgaXMgdXNlZCB0byBlbmFibGUgY2VydGFpbiBwcmludGluZwotCSBvcHRpb25zLiBUaGUgb25seSBvcHRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBpcyBQeV9QcmludF9SQVcuIAorICAgICBQcmludCBhbiBvYmplY3QsIG8sIG9uIGZpbGUsIGZwLiAgUmV0dXJucyAtMSBvbgorICAgICBlcnJvci4gIFRoZSBmbGFncyBhcmd1bWVudCBpcyB1c2VkIHRvIGVuYWJsZSBjZXJ0YWluIHByaW50aW5nCisgICAgIG9wdGlvbnMuIFRoZSBvbmx5IG9wdGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGlzIFB5X1ByaW50X1JBVy4KIAotICAgICAgICAgKFdoYXQgc2hvdWxkIGJlIHNhaWQgYWJvdXQgUHlfUHJpbnRfUkFXPykJCisgICAgIChXaGF0IHNob3VsZCBiZSBzYWlkIGFib3V0IFB5X1ByaW50X1JBVz8pCiAKICAgICAgICAqLwogCkBAIC0xNDUsMTEgKzE0NSwxMSBAQAogCiAgICAgIGludCBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUpOwogCi0gICAgICAgICBSZXR1cm5zIDEgaWYgbyBoYXMgdGhlIGF0dHJpYnV0ZSBhdHRyX25hbWUsIGFuZCAwIG90aGVyd2lzZS4KLQkgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgaGFzYXR0cihvLGF0dHJfbmFtZSkuIAorICAgICBSZXR1cm5zIDEgaWYgbyBoYXMgdGhlIGF0dHJpYnV0ZSBhdHRyX25hbWUsIGFuZCAwIG90aGVyd2lzZS4KKyAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgaGFzYXR0cihvLGF0dHJfbmFtZSkuCiAKLQkgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgogCiAgICAgICAgKi8KIApAQCAtMTU3LDkgKzE1Nyw5IEBACiAKICAgICAgUHlPYmplY3QqIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmF0dHJfbmFtZSk7CiAKLQkgUmV0cmlldmUgYW4gYXR0cmlidXRlZCBuYW1lZCBhdHRyX25hbWUgZm9ybSBvYmplY3Qgby4KLQkgUmV0dXJucyB0aGUgYXR0cmlidXRlIHZhbHVlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8uYXR0cl9uYW1lLgorICAgICBSZXRyaWV2ZSBhbiBhdHRyaWJ1dGVkIG5hbWVkIGF0dHJfbmFtZSBmb3JtIG9iamVjdCBvLgorICAgICBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogby5hdHRyX25hbWUuCiAKICAgICAgICAqLwogCkBAIC0xNjcsMTEgKzE2NywxMSBAQAogCiAgICAgIGludCBQeU9iamVjdF9IYXNBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKIAotICAgICAgICAgUmV0dXJucyAxIGlmIG8gaGFzIHRoZSBhdHRyaWJ1dGUgYXR0cl9uYW1lLCBhbmQgMCBvdGhlcndpc2UuCi0JIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIGhhc2F0dHIobyxhdHRyX25hbWUpLiAKKyAgICAgUmV0dXJucyAxIGlmIG8gaGFzIHRoZSBhdHRyaWJ1dGUgYXR0cl9uYW1lLCBhbmQgMCBvdGhlcndpc2UuCisgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIGhhc2F0dHIobyxhdHRyX25hbWUpLgogCi0JIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KIAogICAgICAgICovCiAKQEAgLTE3OSw5ICsxNzksOSBAQAogCiAgICAgIFB5T2JqZWN0KiBQeU9iamVjdF9HZXRBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKIAotCSBSZXRyaWV2ZSBhbiBhdHRyaWJ1dGVkIG5hbWVkIGF0dHJfbmFtZSBmb3JtIG9iamVjdCBvLgotCSBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgotCSBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogby5hdHRyX25hbWUuCisgICAgIFJldHJpZXZlIGFuIGF0dHJpYnV0ZWQgbmFtZWQgYXR0cl9uYW1lIGZvcm0gb2JqZWN0IG8uCisgICAgIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvLmF0dHJfbmFtZS4KIAogICAgICAgICovCiAKQEAgLTE5MCw5ICsxOTAsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUsIFB5T2JqZWN0ICp2KTsKIAotCSBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8sCi0JIHRvIHRoZSB2YWx1ZSwgdi4gUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcwotCSB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogby5hdHRyX25hbWU9di4KKyAgICAgU2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG5hbWVkIGF0dHJfbmFtZSwgZm9yIG9iamVjdCBvLAorICAgICB0byB0aGUgdmFsdWUsIHYuIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IG8uYXR0cl9uYW1lPXYuCiAKICAgICAgICAqLwogCkBAIC0yMDAsOSArMjAwLDkgQEAKIAogICAgICBpbnQgUHlPYmplY3RfU2V0QXR0cihQeU9iamVjdCAqbywgUHlPYmplY3QgKmF0dHJfbmFtZSwgUHlPYmplY3QgKnYpOwogCi0JIFNldCB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lZCBhdHRyX25hbWUsIGZvciBvYmplY3QgbywKLQkgdG8gdGhlIHZhbHVlLCB2LiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50OiBvLmF0dHJfbmFtZT12LgorICAgICBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8sCisgICAgIHRvIHRoZSB2YWx1ZSwgdi4gUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogby5hdHRyX25hbWU9di4KIAogICAgICAgICovCiAKQEAgLTIxMCw5ICsyMTAsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9EZWxBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUpOwogCi0JIERlbGV0ZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8uIFJldHVybnMKLQkgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IGRlbCBvLmF0dHJfbmFtZS4KKyAgICAgRGVsZXRlIGF0dHJpYnV0ZSBuYW1lZCBhdHRyX25hbWUsIGZvciBvYmplY3Qgby4gUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogZGVsIG8uYXR0cl9uYW1lLgogCiAgICAgICAgKi8KICNkZWZpbmUgIFB5T2JqZWN0X0RlbEF0dHJTdHJpbmcoTyxBKSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKChPKSwoQSksTlVMTCkKQEAgLTIyMSw5ICsyMjEsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9EZWxBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKIAotCSBEZWxldGUgYXR0cmlidXRlIG5hbWVkIGF0dHJfbmFtZSwgZm9yIG9iamVjdCBvLiBSZXR1cm5zIC0xCi0JIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBkZWwgby5hdHRyX25hbWUuCisgICAgIERlbGV0ZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8uIFJldHVybnMgLTEKKyAgICAgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IGRlbCBvLmF0dHJfbmFtZS4KIAogICAgICAgICovCiAjZGVmaW5lICBQeU9iamVjdF9EZWxBdHRyKE8sQSkgUHlPYmplY3RfU2V0QXR0cigoTyksKEEpLE5VTEwpCkBAIC0yMzEsMTEgKzIzMSwxMSBAQAogICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQ21wKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yLCBpbnQgKnJlc3VsdCk7CiAKICAgICAgICAvKgotCSBDb21wYXJlIHRoZSB2YWx1ZXMgb2YgbzEgYW5kIG8yIHVzaW5nIGEgcm91dGluZSBwcm92aWRlZCBieQotCSBvMSwgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIHdpdGggYSByb3V0aW5lIHByb3ZpZGVkIGJ5IG8yLgotCSBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIHJldHVybmVkIGluIHJlc3VsdC4gIFJldHVybnMKLQkgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IHJlc3VsdD1jbXAobzEsbzIpLgorICAgICBDb21wYXJlIHRoZSB2YWx1ZXMgb2YgbzEgYW5kIG8yIHVzaW5nIGEgcm91dGluZSBwcm92aWRlZCBieQorICAgICBvMSwgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIHdpdGggYSByb3V0aW5lIHByb3ZpZGVkIGJ5IG8yLgorICAgICBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIHJldHVybmVkIGluIHJlc3VsdC4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IHJlc3VsdD1jbXAobzEsbzIpLgogCiAgICAgICAgKi8KIApAQCAtMjQzLDExICsyNDMsMTEgQEAKIAogICAgICBpbnQgUHlPYmplY3RfQ29tcGFyZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKLQkgQ29tcGFyZSB0aGUgdmFsdWVzIG9mIG8xIGFuZCBvMiB1c2luZyBhIHJvdXRpbmUgcHJvdmlkZWQgYnkKLQkgbzEsIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSB3aXRoIGEgcm91dGluZSBwcm92aWRlZCBieSBvMi4KLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwKLQkgdGhlIHZhbHVlIHJldHVybmVkIGlzIHVuZGVmaW5lZC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQotCSBQeXRob24gZXhwcmVzc2lvbjogY21wKG8xLG8yKS4KKyAgICAgQ29tcGFyZSB0aGUgdmFsdWVzIG9mIG8xIGFuZCBvMiB1c2luZyBhIHJvdXRpbmUgcHJvdmlkZWQgYnkKKyAgICAgbzEsIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSB3aXRoIGEgcm91dGluZSBwcm92aWRlZCBieSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwKKyAgICAgdGhlIHZhbHVlIHJldHVybmVkIGlzIHVuZGVmaW5lZC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQorICAgICBQeXRob24gZXhwcmVzc2lvbjogY21wKG8xLG8yKS4KIAogICAgICAgICovCiAKQEAgLTI1NSwxMSArMjU1LDExIEBACiAKICAgICAgUHlPYmplY3QgKlB5T2JqZWN0X1JlcHIoUHlPYmplY3QgKm8pOwogCi0JIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQotCSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcwotCSB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHJlcHIobykuCisgICAgIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQorICAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHJlcHIobykuCiAKLQkgQ2FsbGVkIGJ5IHRoZSByZXByKCkgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHJldmVyc2UgcXVvdGVzLgorICAgICBDYWxsZWQgYnkgdGhlIHJlcHIoKSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgcmV2ZXJzZSBxdW90ZXMuCiAKICAgICAgICAqLwogCkBAIC0yNjcsMTIgKzI2NywxMiBAQAogCiAgICAgIFB5T2JqZWN0ICpQeU9iamVjdF9TdHIoUHlPYmplY3QgKm8pOwogCi0JIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQotCSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcwotCSB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHN0cihvKS4pCisgICAgIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQorICAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHN0cihvKS4pCiAKLQkgQ2FsbGVkIGJ5IHRoZSBzdHIoKSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgdGhlIHByaW50Ci0JIHN0YXRlbWVudC4KKyAgICAgQ2FsbGVkIGJ5IHRoZSBzdHIoKSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgdGhlIHByaW50CisgICAgIHN0YXRlbWVudC4KIAogICAgICAgICovCiAKQEAgLTI4MCwxMSArMjgwLDExIEBACiAKICAgICAgUHlPYmplY3QgKlB5T2JqZWN0X1VuaWNvZGUoUHlPYmplY3QgKm8pOwogCi0JIENvbXB1dGUgdGhlIHVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0LCBvLiAgUmV0dXJucyB0aGUKLQkgdW5pY29kZSByZXByZXNlbnRhdGlvbiBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdW5pc3RyKG8pLikKKyAgICAgQ29tcHV0ZSB0aGUgdW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQorICAgICB1bmljb2RlIHJlcHJlc2VudGF0aW9uIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiB1bmlzdHIobykuKQogCi0JIENhbGxlZCBieSB0aGUgdW5pc3RyKCkgYnVpbHQtaW4gZnVuY3Rpb24uCisgICAgIENhbGxlZCBieSB0aGUgdW5pc3RyKCkgYnVpbHQtaW4gZnVuY3Rpb24uCiAKICAgICAgICAqLwogCkBAIC0yOTIsMzQgKzI5MiwzNCBAQAogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUNhbGxhYmxlX0NoZWNrKFB5T2JqZWN0ICpvKTsKIAotCSBEZXRlcm1pbmUgaWYgdGhlIG9iamVjdCwgbywgaXMgY2FsbGFibGUuICBSZXR1cm4gMSBpZiB0aGUKLQkgb2JqZWN0IGlzIGNhbGxhYmxlIGFuZCAwIG90aGVyd2lzZS4KKyAgICAgRGV0ZXJtaW5lIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNhbGxhYmxlLiAgUmV0dXJuIDEgaWYgdGhlCisgICAgIG9iamVjdCBpcyBjYWxsYWJsZSBhbmQgMCBvdGhlcndpc2UuCiAKLQkgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgogCiAgICAgICAgKi8KIAogCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9DYWxsKFB5T2JqZWN0ICpjYWxsYWJsZV9vYmplY3QsCi0JCQkJCSBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdyk7CiAKICAgICAgICAvKgotCSBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCwgY2FsbGFibGVfb2JqZWN0LCB3aXRoCi0JIGFyZ3VtZW50cyBhbmQga2V5d29yZHMgYXJndW1lbnRzLiAgVGhlICdhcmdzJyBhcmd1bWVudCBjYW4gbm90IGJlCi0JIE5VTEwsIGJ1dCB0aGUgJ2t3JyBhcmd1bWVudCBjYW4gYmUgTlVMTC4KKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aAorICAgICBhcmd1bWVudHMgYW5kIGtleXdvcmRzIGFyZ3VtZW50cy4gIFRoZSAnYXJncycgYXJndW1lbnQgY2FuIG5vdCBiZQorICAgICBOVUxMLCBidXQgdGhlICdrdycgYXJndW1lbnQgY2FuIGJlIE5VTEwuCiAKICAgICAgICAqLwotICAgICAKKwogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGxPYmplY3QoUHlPYmplY3QgKmNhbGxhYmxlX29iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpOwogCiAgICAgICAgLyoKLQkgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aAotCSBhcmd1bWVudHMgZ2l2ZW4gYnkgdGhlIHR1cGxlLCBhcmdzLiAgSWYgbm8gYXJndW1lbnRzIGFyZQotCSBuZWVkZWQsIHRoZW4gYXJncyBtYXkgYmUgTlVMTC4gIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUKLQkgY2FsbCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50Ci0JIG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYXBwbHkobyxhcmdzKS4KKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aAorICAgICBhcmd1bWVudHMgZ2l2ZW4gYnkgdGhlIHR1cGxlLCBhcmdzLiAgSWYgbm8gYXJndW1lbnRzIGFyZQorICAgICBuZWVkZWQsIHRoZW4gYXJncyBtYXkgYmUgTlVMTC4gIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUKKyAgICAgY2FsbCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50CisgICAgIG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYXBwbHkobyxhcmdzKS4KIAogICAgICAgICovCiAKQEAgLTMyNywxMiArMzI3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZm9ybWF0LCAuLi4pOwogCiAgICAgICAgLyoKLQkgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aCBhCi0JIHZhcmlhYmxlIG51bWJlciBvZiBDIGFyZ3VtZW50cy4gVGhlIEMgYXJndW1lbnRzIGFyZSBkZXNjcmliZWQKLQkgdXNpbmcgYSBta3ZhbHVlLXN0eWxlIGZvcm1hdCBzdHJpbmcuIFRoZSBmb3JtYXQgbWF5IGJlIE5VTEwsCi0JIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLiAgUmV0dXJucyB0aGUKLQkgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKLQkgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBhcHBseShvLGFyZ3MpLgorICAgICBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCwgY2FsbGFibGVfb2JqZWN0LCB3aXRoIGEKKyAgICAgdmFyaWFibGUgbnVtYmVyIG9mIEMgYXJndW1lbnRzLiBUaGUgQyBhcmd1bWVudHMgYXJlIGRlc2NyaWJlZAorICAgICB1c2luZyBhIG1rdmFsdWUtc3R5bGUgZm9ybWF0IHN0cmluZy4gVGhlIGZvcm1hdCBtYXkgYmUgTlVMTCwKKyAgICAgaW5kaWNhdGluZyB0aGF0IG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuICBSZXR1cm5zIHRoZQorICAgICByZXN1bHQgb2YgdGhlIGNhbGwgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGFwcGx5KG8sYXJncykuCiAKICAgICAgICAqLwogCkBAIC0zNDEsMjkgKzM0MSwyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CiAKICAgICAgICAvKgotCSBDYWxsIHRoZSBtZXRob2QgbmFtZWQgbSBvZiBvYmplY3QgbyB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0JIEMgYXJndW1lbnRzLiAgVGhlIEMgYXJndW1lbnRzIGFyZSBkZXNjcmliZWQgYnkgYSBta3ZhbHVlCi0JIGZvcm1hdCBzdHJpbmcuICBUaGUgZm9ybWF0IG1heSBiZSBOVUxMLCBpbmRpY2F0aW5nIHRoYXQgbm8KLQkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC4gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIG9uCi0JIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlCi0JIFB5dGhvbiBleHByZXNzaW9uOiBvLm1ldGhvZChhcmdzKS4KKyAgICAgQ2FsbCB0aGUgbWV0aG9kIG5hbWVkIG0gb2Ygb2JqZWN0IG8gd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgorICAgICBDIGFyZ3VtZW50cy4gIFRoZSBDIGFyZ3VtZW50cyBhcmUgZGVzY3JpYmVkIGJ5IGEgbWt2YWx1ZQorICAgICBmb3JtYXQgc3RyaW5nLiAgVGhlIGZvcm1hdCBtYXkgYmUgTlVMTCwgaW5kaWNhdGluZyB0aGF0IG5vCisgICAgIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBvbgorICAgICBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZQorICAgICBQeXRob24gZXhwcmVzc2lvbjogby5tZXRob2QoYXJncykuCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQoUHlPYmplY3QgKmNhbGxhYmxlLAotCQkJCQkJCSBjaGFyICpmb3JtYXQsIC4uLik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQoUHlPYmplY3QgKm8sCi0JCQkJCQkgICAgICAgY2hhciAqbmFtZSwKLQkJCQkJCSAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKFB5T2JqZWN0ICpjYWxsYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKTsKIAogICAgICAgIC8qCi0JIENhbGwgYSBjYWxsYWJsZSBQeXRob24gb2JqZWN0LCBjYWxsYWJsZV9vYmplY3QsIHdpdGggYQotCSB2YXJpYWJsZSBudW1iZXIgb2YgQyBhcmd1bWVudHMuICBUaGUgQyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkCi0JIGFzIFB5T2JqZWN0ICogdmFsdWVzLCB0ZXJtaW5hdGVkIGJ5IGEgTlVMTC4gIFJldHVybnMgdGhlCi0JIHJlc3VsdCBvZiB0aGUgY2FsbCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYXBwbHkobyxhcmdzKS4KKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aCBhCisgICAgIHZhcmlhYmxlIG51bWJlciBvZiBDIGFyZ3VtZW50cy4gIFRoZSBDIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQKKyAgICAgYXMgUHlPYmplY3QgKiB2YWx1ZXMsIHRlcm1pbmF0ZWQgYnkgYSBOVUxMLiAgUmV0dXJucyB0aGUKKyAgICAgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBhcHBseShvLGFyZ3MpLgogICAgICAgICovCiAKIApAQCAtMzcxLDExICszNzEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICptLCAuLi4pOwogCiAgICAgICAgLyoKLQkgQ2FsbCB0aGUgbWV0aG9kIG5hbWVkIG0gb2Ygb2JqZWN0IG8gd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgotCSBDIGFyZ3VtZW50cy4gIFRoZSBDIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgYXMgUHlPYmplY3QgKgotCSB2YWx1ZXMsIHRlcm1pbmF0ZWQgYnkgTlVMTC4gIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbAotCSBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mCi0JIHRoZSBQeXRob24gZXhwcmVzc2lvbjogby5tZXRob2QoYXJncykuCisgICAgIENhbGwgdGhlIG1ldGhvZCBuYW1lZCBtIG9mIG9iamVjdCBvIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YKKyAgICAgQyBhcmd1bWVudHMuICBUaGUgQyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIGFzIFB5T2JqZWN0ICoKKyAgICAgdmFsdWVzLCB0ZXJtaW5hdGVkIGJ5IE5VTEwuICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwKKyAgICAgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZgorICAgICB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8ubWV0aG9kKGFyZ3MpLgogICAgICAgICovCiAKIApAQCAtMzgzLDkgKzM4Myw5IEBACiAKICAgICAgbG9uZyBQeU9iamVjdF9IYXNoKFB5T2JqZWN0ICpvKTsKIAotICAgICAgICAgQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBoYXNoLCBoYXNoX3ZhbHVlLCBvZiBhbiBvYmplY3QsIG8uICBPbgotCSBmYWlsdXJlLCByZXR1cm4gLTEuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogaGFzaChvKS4KKyAgICAgQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBoYXNoLCBoYXNoX3ZhbHVlLCBvZiBhbiBvYmplY3QsIG8uICBPbgorICAgICBmYWlsdXJlLCByZXR1cm4gLTEuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogaGFzaChvKS4KIAogICAgICAgICovCiAKQEAgLTM5NCw5ICszOTQsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9Jc1RydWUoUHlPYmplY3QgKm8pOwogCi0JIFJldHVybnMgMSBpZiB0aGUgb2JqZWN0LCBvLCBpcyBjb25zaWRlcmVkIHRvIGJlIHRydWUsIDAgaWYgbyBpcwotCSBjb25zaWRlcmVkIHRvIGJlIGZhbHNlIGFuZCAtMSBvbiBmYWlsdXJlLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0JIFB5dGhvbiBleHByZXNzaW9uOiBub3Qgbm90IG8KKyAgICAgUmV0dXJucyAxIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZSwgMCBpZiBvIGlzCisgICAgIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgYW5kIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgUHl0aG9uIGV4cHJlc3Npb246IG5vdCBub3QgbwogCiAgICAgICAgKi8KIApAQCAtNDA0LDI3ICs0MDQsMjcgQEAKIAogICAgICBpbnQgUHlPYmplY3RfTm90KFB5T2JqZWN0ICpvKTsKIAotCSBSZXR1cm5zIDAgaWYgdGhlIG9iamVjdCwgbywgaXMgY29uc2lkZXJlZCB0byBiZSB0cnVlLCAxIGlmIG8gaXMKLQkgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBhbmQgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQotCSBQeXRob24gZXhwcmVzc2lvbjogbm90IG8KKyAgICAgUmV0dXJucyAwIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZSwgMSBpZiBvIGlzCisgICAgIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgYW5kIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgUHl0aG9uIGV4cHJlc3Npb246IG5vdCBvCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfVHlwZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBPbiBzdWNjZXNzLCByZXR1cm5zIGEgdHlwZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0Ci0JIHR5cGUgb2Ygb2JqZWN0IG8uIE9uIGZhaWx1cmUsIHJldHVybnMgTlVMTC4gIFRoaXMgaXMKLQkgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHR5cGUobykuCisgICAgIE9uIHN1Y2Nlc3MsIHJldHVybnMgYSB0eXBlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QKKyAgICAgdHlwZSBvZiBvYmplY3Qgby4gT24gZmFpbHVyZSwgcmV0dXJucyBOVUxMLiAgVGhpcyBpcworICAgICBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdHlwZShvKS4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlPYmplY3RfU2l6ZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJuIHRoZSBzaXplIG9mIG9iamVjdCBvLiAgSWYgdGhlIG9iamVjdCwgbywgcHJvdmlkZXMKLQkgYm90aCBzZXF1ZW5jZSBhbmQgbWFwcGluZyBwcm90b2NvbHMsIHRoZSBzZXF1ZW5jZSBzaXplIGlzCi0JIHJldHVybmVkLiBPbiBlcnJvciwgLTEgaXMgcmV0dXJuZWQuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50Ci0JIHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbGVuKG8pLgorICAgICBSZXR1cm4gdGhlIHNpemUgb2Ygb2JqZWN0IG8uICBJZiB0aGUgb2JqZWN0LCBvLCBwcm92aWRlcworICAgICBib3RoIHNlcXVlbmNlIGFuZCBtYXBwaW5nIHByb3RvY29scywgdGhlIHNlcXVlbmNlIHNpemUgaXMKKyAgICAgcmV0dXJuZWQuIE9uIGVycm9yLCAtMSBpcyByZXR1cm5lZC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQKKyAgICAgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOiBsZW4obykuCiAKICAgICAgICAqLwogCkBAIC00MzYsMjAzICs0MzYsMjAzIEBACiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5T2JqZWN0X0xlbmd0aEhpbnQoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QpOwogCiAgICAgICAgLyoKLSAgICAgICAgIEd1ZXNzIHRoZSBzaXplIG9mIG9iamVjdCBvIHVzaW5nIGxlbihvKSBvciBvLl9fbGVuZ3RoX2hpbnRfXygpLgotICAgICAgICAgSWYgbmVpdGhlciBvZiB0aG9zZSByZXR1cm4gYSBub24tbmVnYXRpdmUgdmFsdWUsIHRoZW4gcmV0dXJuIHRoZQotICAgICAgICAgZGVmYXVsdCB2YWx1ZS4gIElmIG9uZSBvZiB0aGUgY2FsbHMgZmFpbHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtMS4KKyAgICAgR3Vlc3MgdGhlIHNpemUgb2Ygb2JqZWN0IG8gdXNpbmcgbGVuKG8pIG9yIG8uX19sZW5ndGhfaGludF9fKCkuCisgICAgIElmIG5laXRoZXIgb2YgdGhvc2UgcmV0dXJuIGEgbm9uLW5lZ2F0aXZlIHZhbHVlLCB0aGVuIHJldHVybiB0aGUKKyAgICAgZGVmYXVsdCB2YWx1ZS4gIElmIG9uZSBvZiB0aGUgY2FsbHMgZmFpbHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtMS4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfR2V0SXRlbShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSk7CiAKICAgICAgICAvKgotCSBSZXR1cm4gZWxlbWVudCBvZiBvIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCwga2V5LCBvciBOVUxMCi0JIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvW2tleV0uCisgICAgIFJldHVybiBlbGVtZW50IG9mIG8gY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0LCBrZXksIG9yIE5VTEwKKyAgICAgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG9ba2V5XS4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X1NldEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2KTsKIAogICAgICAgIC8qCi0JIE1hcCB0aGUgb2JqZWN0LCBrZXksIHRvIHRoZSB2YWx1ZSwgdi4gIFJldHVybnMKLQkgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IG9ba2V5XT12LgorICAgICBNYXAgdGhlIG9iamVjdCwga2V5LCB0byB0aGUgdmFsdWUsIHYuICBSZXR1cm5zCisgICAgIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgc3RhdGVtZW50OiBvW2tleV09di4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9EZWxJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0LCBrZXksIGZyb20gdGhlIG9iamVjdCAqby4KLSAgICAgICAgIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAgICAgICAgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IGRlbCBvW2tleV0uCisgICAgIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0LCBrZXksIGZyb20gdGhlIG9iamVjdCAqby4KKyAgICAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAgIHRoZSBQeXRob24gc3RhdGVtZW50OiBkZWwgb1trZXldLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpOwogCiAgICAgICAgLyoKLQkgRGVsZXRlIHRoZSBtYXBwaW5nIGZvciBrZXkgZnJvbSAqby4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KKyAgICAgRGVsZXRlIHRoZSBtYXBwaW5nIGZvciBrZXkgZnJvbSAqby4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Bc0NoYXJCdWZmZXIoUHlPYmplY3QgKm9iaiwKLQkJCQkJICBjb25zdCBjaGFyICoqYnVmZmVyLAotCQkJCQkgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOwogCi0gICAgICAgLyogCi0JICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdoaWNoIG11c3Qgc3VwcG9ydCB0aGUgKGNoYXJhY3RlciwKLQkgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCi0JICByZWFkLW9ubHkgbWVtb3J5IGxvY2F0aW9uIHVzZWFibGUgYXMgY2hhcmFjdGVyIGJhc2VkIGlucHV0Ci0JICBmb3Igc3Vic2VxdWVudCBwcm9jZXNzaW5nLgorICAgICAgIC8qCisgICAgICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdoaWNoIG11c3Qgc3VwcG9ydCB0aGUgKGNoYXJhY3RlciwKKyAgICAgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCisgICAgICByZWFkLW9ubHkgbWVtb3J5IGxvY2F0aW9uIHVzZWFibGUgYXMgY2hhcmFjdGVyIGJhc2VkIGlucHV0CisgICAgICBmb3Igc3Vic2VxdWVudCBwcm9jZXNzaW5nLgogCi0JICAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuICBidWZmZXIgYW5kIGJ1ZmZlcl9sZW4gYXJlIG9ubHkKLQkgIHNldCBpbiBjYXNlIG5vIGVycm9yIG9jY3Vycy4gT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZCBhbmQKLQkgIGFuIGV4Y2VwdGlvbiBzZXQuCisgICAgICAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuICBidWZmZXIgYW5kIGJ1ZmZlcl9sZW4gYXJlIG9ubHkKKyAgICAgIHNldCBpbiBjYXNlIG5vIGVycm9yIG9jY3Vycy4gT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZCBhbmQKKyAgICAgIGFuIGV4Y2VwdGlvbiBzZXQuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaik7CiAKLSAgICAgIC8qICAKLQkgIENoZWNrcyB3aGV0aGVyIGFuIGFyYml0cmFyeSBvYmplY3Qgc3VwcG9ydHMgdGhlIChjaGFyYWN0ZXIsCi0JICBzaW5nbGUgc2VnbWVudCkgYnVmZmVyIGludGVyZmFjZS4gIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwCi0JICBvbiBmYWlsdXJlLgorICAgICAgLyoKKyAgICAgIENoZWNrcyB3aGV0aGVyIGFuIGFyYml0cmFyeSBvYmplY3Qgc3VwcG9ydHMgdGhlIChjaGFyYWN0ZXIsCisgICAgICBzaW5nbGUgc2VnbWVudCkgYnVmZmVyIGludGVyZmFjZS4gIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwCisgICAgICBvbiBmYWlsdXJlLgogCiAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Bc1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaiwKLQkJCQkJICBjb25zdCB2b2lkICoqYnVmZmVyLAotCQkJCQkgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOwogCi0gICAgICAgLyogCi0JICBTYW1lIGFzIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcigpIGV4Y2VwdCB0aGF0IHRoaXMgQVBJIGV4cGVjdHMKLQkgIChyZWFkYWJsZSwgc2luZ2xlIHNlZ21lbnQpIGJ1ZmZlciBpbnRlcmZhY2UgYW5kIHJldHVybnMgYQotCSAgcG9pbnRlciB0byBhIHJlYWQtb25seSBtZW1vcnkgbG9jYXRpb24gd2hpY2ggY2FuIGNvbnRhaW4KLQkgIGFyYml0cmFyeSBkYXRhLgorICAgICAgIC8qCisgICAgICBTYW1lIGFzIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcigpIGV4Y2VwdCB0aGF0IHRoaXMgQVBJIGV4cGVjdHMKKyAgICAgIChyZWFkYWJsZSwgc2luZ2xlIHNlZ21lbnQpIGJ1ZmZlciBpbnRlcmZhY2UgYW5kIHJldHVybnMgYQorICAgICAgcG9pbnRlciB0byBhIHJlYWQtb25seSBtZW1vcnkgbG9jYXRpb24gd2hpY2ggY2FuIGNvbnRhaW4KKyAgICAgIGFyYml0cmFyeSBkYXRhLgogCi0JICAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuICBidWZmZXIgYW5kIGJ1ZmZlcl9sZW4gYXJlIG9ubHkKLQkgIHNldCBpbiBjYXNlIG5vIGVycm9yIG9jY3VycnMuICBPdGhlcndpc2UsIC0xIGlzIHJldHVybmVkIGFuZAotCSAgYW4gZXhjZXB0aW9uIHNldC4KKyAgICAgIDAgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4gIGJ1ZmZlciBhbmQgYnVmZmVyX2xlbiBhcmUgb25seQorICAgICAgc2V0IGluIGNhc2Ugbm8gZXJyb3Igb2NjdXJycy4gIE90aGVyd2lzZSwgLTEgaXMgcmV0dXJuZWQgYW5kCisgICAgICBhbiBleGNlcHRpb24gc2V0LgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihQeU9iamVjdCAqb2JqLAotCQkJCQkgICB2b2lkICoqYnVmZmVyLAotCQkJCQkgICBQeV9zc2l6ZV90ICpidWZmZXJfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOwogCi0gICAgICAgLyogCi0JICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdoaWNoIG11c3Qgc3VwcG9ydCB0aGUgKHdyaXRlYWJsZSwKLQkgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCi0JICB3cml0ZWFibGUgbWVtb3J5IGxvY2F0aW9uIGluIGJ1ZmZlciBvZiBzaXplIGJ1ZmZlcl9sZW4uCisgICAgICAgLyoKKyAgICAgIFRha2VzIGFuIGFyYml0cmFyeSBvYmplY3Qgd2hpY2ggbXVzdCBzdXBwb3J0IHRoZSAod3JpdGVhYmxlLAorICAgICAgc2luZ2xlIHNlZ21lbnQpIGJ1ZmZlciBpbnRlcmZhY2UgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGEKKyAgICAgIHdyaXRlYWJsZSBtZW1vcnkgbG9jYXRpb24gaW4gYnVmZmVyIG9mIHNpemUgYnVmZmVyX2xlbi4KIAotCSAgMCBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLiAgYnVmZmVyIGFuZCBidWZmZXJfbGVuIGFyZSBvbmx5Ci0JICBzZXQgaW4gY2FzZSBubyBlcnJvciBvY2N1cnJzLiBPdGhlcndpc2UsIC0xIGlzIHJldHVybmVkIGFuZAotCSAgYW4gZXhjZXB0aW9uIHNldC4KKyAgICAgIDAgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4gIGJ1ZmZlciBhbmQgYnVmZmVyX2xlbiBhcmUgb25seQorICAgICAgc2V0IGluIGNhc2Ugbm8gZXJyb3Igb2NjdXJycy4gT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZCBhbmQKKyAgICAgIGFuIGV4Y2VwdGlvbiBzZXQuCiAKICAgICAgICAqLwogCi0JLyogbmV3IGJ1ZmZlciBBUEkgKi8KKyAgICAvKiBuZXcgYnVmZmVyIEFQSSAqLwogCiAjZGVmaW5lIFB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iaikgXAotCSgoKG9iaiktPm9iX3R5cGUtPnRwX2FzX2J1ZmZlciAhPSBOVUxMKSAmJgkJCVwKLQkgKFB5VHlwZV9IYXNGZWF0dXJlKChvYmopLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSKSkgJiYgXAotCSAoKG9iaiktPm9iX3R5cGUtPnRwX2FzX2J1ZmZlci0+YmZfZ2V0YnVmZmVyICE9IE5VTEwpKQotCQkJICAgIAotCS8qIFJldHVybiAxIGlmIHRoZSBnZXRidWZmZXIgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBvdGhlcndpc2UgCi0JICAgcmV0dXJuIDAgKi8KKyAgICAoKChvYmopLT5vYl90eXBlLT50cF9hc19idWZmZXIgIT0gTlVMTCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKFB5VHlwZV9IYXNGZWF0dXJlKChvYmopLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSKSkgJiYgXAorICAgICAoKG9iaiktPm9iX3R5cGUtPnRwX2FzX2J1ZmZlci0+YmZfZ2V0YnVmZmVyICE9IE5VTEwpKQogCi0gICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9HZXRCdWZmZXIoUHlPYmplY3QgKm9iaiwgUHlfYnVmZmVyICp2aWV3LCAKLQkJCQkJaW50IGZsYWdzKTsKKyAgICAvKiBSZXR1cm4gMSBpZiB0aGUgZ2V0YnVmZmVyIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlCisgICAgICAgcmV0dXJuIDAgKi8KIAotCS8qIFRoaXMgaXMgYSBDLUFQSSB2ZXJzaW9uIG9mIHRoZSBnZXRidWZmZXIgZnVuY3Rpb24gY2FsbC4gIEl0IGNoZWNrcwotICAgICAgIAkgICB0byBtYWtlIHN1cmUgb2JqZWN0IGhhcyB0aGUgcmVxdWlyZWQgZnVuY3Rpb24gcG9pbnRlciBhbmQgaXNzdWVzIHRoZQotCSAgIGNhbGwuICBSZXR1cm5zIC0xIGFuZCByYWlzZXMgYW4gZXJyb3Igb24gZmFpbHVyZSBhbmQgcmV0dXJucyAwIG9uIAotCSAgIHN1Y2Nlc3MKLSAgICAgICAgKi8KKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0dldEJ1ZmZlcihQeU9iamVjdCAqb2JqLCBQeV9idWZmZXIgKnZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKworICAgIC8qIFRoaXMgaXMgYSBDLUFQSSB2ZXJzaW9uIG9mIHRoZSBnZXRidWZmZXIgZnVuY3Rpb24gY2FsbC4gIEl0IGNoZWNrcworICAgICAgIHRvIG1ha2Ugc3VyZSBvYmplY3QgaGFzIHRoZSByZXF1aXJlZCBmdW5jdGlvbiBwb2ludGVyIGFuZCBpc3N1ZXMgdGhlCisgICAgICAgY2FsbC4gIFJldHVybnMgLTEgYW5kIHJhaXNlcyBhbiBlcnJvciBvbiBmYWlsdXJlIGFuZCByZXR1cm5zIDAgb24KKyAgICAgICBzdWNjZXNzCisgICAgKi8KIAogCiAgICAgIFB5QVBJX0ZVTkModm9pZCAqKSBQeUJ1ZmZlcl9HZXRQb2ludGVyKFB5X2J1ZmZlciAqdmlldywgUHlfc3NpemVfdCAqaW5kaWNlcyk7Ci0gICAgICAgIAotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBhcmVhIHBvaW50ZWQgdG8gYnkgdGhlIGluZGljZXMgZm9yIHRoZSBidWZmZXIgZ2l2ZW4uIAotICAgICAgICAgICBOb3RlIHRoYXQgdmlldy0+bmRpbSBpcyB0aGUgYXNzdW1lZCBzaXplIG9mIGluZGljZXMgCi0gICAgICAgICovCisKKyAgICAvKiBHZXQgdGhlIG1lbW9yeSBhcmVhIHBvaW50ZWQgdG8gYnkgdGhlIGluZGljZXMgZm9yIHRoZSBidWZmZXIgZ2l2ZW4uCisgICAgICAgTm90ZSB0aGF0IHZpZXctPm5kaW0gaXMgdGhlIGFzc3VtZWQgc2l6ZSBvZiBpbmRpY2VzCisgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlCdWZmZXJfU2l6ZUZyb21Gb3JtYXQoY29uc3QgY2hhciAqKTsKLQkJCi0JLyogUmV0dXJuIHRoZSBpbXBsaWVkIGl0ZW1zaXplIG9mIHRoZSBkYXRhLWZvcm1hdCBhcmVhIGZyb20gYSAKLQkgICBzdHJ1Y3Qtc3R5bGUgZGVzY3JpcHRpb24gKi8KLSAgICAKIAotCQorICAgIC8qIFJldHVybiB0aGUgaW1wbGllZCBpdGVtc2l6ZSBvZiB0aGUgZGF0YS1mb3JtYXQgYXJlYSBmcm9tIGEKKyAgICAgICBzdHJ1Y3Qtc3R5bGUgZGVzY3JpcHRpb24gKi8KKworCisKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5QnVmZmVyX1RvQ29udGlndW91cyh2b2lkICpidWYsIFB5X2J1ZmZlciAqdmlldywKLSAgICAJCQkJCSAgIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpOwogCi0gICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9Gcm9tQ29udGlndW91cyhQeV9idWZmZXIgKnZpZXcsIHZvaWQgKmJ1ZiwgCi0gICAgCQkJCQkgICAgIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpOworICAgICBQeUFQSV9GVU5DKGludCkgUHlCdWZmZXJfRnJvbUNvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3LCB2b2lkICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwgY2hhciBmb3J0KTsKIAogCi0JLyogQ29weSBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeQotCSAgIHBvaW50ZWQgdG8gYnkgYnVmIGludG8gdGhlIGJ1ZmZlciBleHBvcnRlZCBieSBvYmouICBSZXR1cm4KLQkgICAwIG9uIHN1Y2Nlc3MgYW5kIHJldHVybiAtMSBhbmQgcmFpc2UgYSBQeUJ1ZmZlcl9FcnJvciBvbgotCSAgIGVycm9yIChpLmUuIHRoZSBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIGJ1ZmZlciBpbnRlcmZhY2Ugb3IKLQkgICBpdCBpcyBub3Qgd29ya2luZykuCisgICAgLyogQ29weSBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeQorICAgICAgIHBvaW50ZWQgdG8gYnkgYnVmIGludG8gdGhlIGJ1ZmZlciBleHBvcnRlZCBieSBvYmouICBSZXR1cm4KKyAgICAgICAwIG9uIHN1Y2Nlc3MgYW5kIHJldHVybiAtMSBhbmQgcmFpc2UgYSBQeUJ1ZmZlcl9FcnJvciBvbgorICAgICAgIGVycm9yIChpLmUuIHRoZSBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIGJ1ZmZlciBpbnRlcmZhY2Ugb3IKKyAgICAgICBpdCBpcyBub3Qgd29ya2luZykuCiAKLQkgICBJZiBmb3J0IGlzICdGJyBhbmQgdGhlIG9iamVjdCBpcyBtdWx0aS1kaW1lbnNpb25hbCwKLQkgICB0aGVuIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGludG8gdGhlIGFycmF5IGluCi0JICAgRm9ydHJhbi1zdHlsZSAoZmlyc3QgZGltZW5zaW9uIHZhcmllcyB0aGUgZmFzdGVzdCkuICBJZgotCSAgIGZvcnQgaXMgJ0MnLCB0aGVuIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGludG8gdGhlIGFycmF5Ci0JICAgaW4gQy1zdHlsZSAobGFzdCBkaW1lbnNpb24gdmFyaWVzIHRoZSBmYXN0ZXN0KS4gIElmIGZvcnQKLQkgICBpcyAnQScsIHRoZW4gaXQgZG9lcyBub3QgbWF0dGVyIGFuZCB0aGUgY29weSB3aWxsIGJlIG1hZGUKLQkgICBpbiB3aGF0ZXZlciB3YXkgaXMgbW9yZSBlZmZpY2llbnQuCisgICAgICAgSWYgZm9ydCBpcyAnRicgYW5kIHRoZSBvYmplY3QgaXMgbXVsdGktZGltZW5zaW9uYWwsCisgICAgICAgdGhlbiB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBhcnJheSBpbgorICAgICAgIEZvcnRyYW4tc3R5bGUgKGZpcnN0IGRpbWVuc2lvbiB2YXJpZXMgdGhlIGZhc3Rlc3QpLiAgSWYKKyAgICAgICBmb3J0IGlzICdDJywgdGhlbiB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBhcnJheQorICAgICAgIGluIEMtc3R5bGUgKGxhc3QgZGltZW5zaW9uIHZhcmllcyB0aGUgZmFzdGVzdCkuICBJZiBmb3J0CisgICAgICAgaXMgJ0EnLCB0aGVuIGl0IGRvZXMgbm90IG1hdHRlciBhbmQgdGhlIGNvcHkgd2lsbCBiZSBtYWRlCisgICAgICAgaW4gd2hhdGV2ZXIgd2F5IGlzIG1vcmUgZWZmaWNpZW50LgogCi0gICAgICAgICovCisgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQ29weURhdGEoUHlPYmplY3QgKmRlc3QsIFB5T2JqZWN0ICpzcmMpOwotICAgICAgICAKLSAgICAgICAgLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBzcmMgYnVmZmVyIHRvIHRoZSBidWZmZXIgb2YgZGVzdGluYXRpb24KLSAgICAgICAgICovCisKKyAgICAvKiBDb3B5IHRoZSBkYXRhIGZyb20gdGhlIHNyYyBidWZmZXIgdG8gdGhlIGJ1ZmZlciBvZiBkZXN0aW5hdGlvbgorICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3LCBjaGFyIGZvcnQpOwogCiAKLSAgICAgUHlBUElfRlVOQyh2b2lkKSBQeUJ1ZmZlcl9GaWxsQ29udGlndW91c1N0cmlkZXMoaW50IG5kaW1zLCAKLQkgIAkJCQkJICAgIFB5X3NzaXplX3QgKnNoYXBlLCAKLQkJCQkJCSAgICBQeV9zc2l6ZV90ICpzdHJpZGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZW1zaXplLAotCSAgICAgCQkJCQkgICAgY2hhciBmb3J0KTsKKyAgICAgUHlBUElfRlVOQyh2b2lkKSBQeUJ1ZmZlcl9GaWxsQ29udGlndW91c1N0cmlkZXMoaW50IG5kaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnNoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZm9ydCk7CiAKLSAgICAgICAJLyogIEZpbGwgdGhlIHN0cmlkZXMgYXJyYXkgd2l0aCBieXRlLXN0cmlkZXMgb2YgYSBjb250aWd1b3VzCi0gICAgICAgICAgICAoRm9ydHJhbi1zdHlsZSBpZiBmb3J0IGlzICdGJyBvciBDLXN0eWxlIG90aGVyd2lzZSkKLSAgICAgICAgICAgIGFycmF5IG9mIHRoZSBnaXZlbiBzaGFwZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICAgIHBlciBlbGVtZW50LgotICAgICAgICAqLworICAgIC8qICBGaWxsIHRoZSBzdHJpZGVzIGFycmF5IHdpdGggYnl0ZS1zdHJpZGVzIG9mIGEgY29udGlndW91cworICAgICAgICAoRm9ydHJhbi1zdHlsZSBpZiBmb3J0IGlzICdGJyBvciBDLXN0eWxlIG90aGVyd2lzZSkKKyAgICAgICAgYXJyYXkgb2YgdGhlIGdpdmVuIHNoYXBlIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcworICAgICAgICBwZXIgZWxlbWVudC4KKyAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9GaWxsSW5mbyhQeV9idWZmZXIgKnZpZXcsIFB5T2JqZWN0ICpvLCB2b2lkICpidWYsCi0JCSAgICAgICAgICAgICAJICAgICAgIFB5X3NzaXplX3QgbGVuLCBpbnQgcmVhZG9ubHksCi0JCQkJICAgICAgIGludCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwgaW50IHJlYWRvbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKIAotICAgICAgICAvKiBGaWxscyBpbiBhIGJ1ZmZlci1pbmZvIHN0cnVjdHVyZSBjb3JyZWN0bHkgZm9yIGFuIGV4cG9ydGVyCi0gICAgICAgICAgIHRoYXQgY2FuIG9ubHkgc2hhcmUgYSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSBvZgotICAgICAgICAgICAidW5zaWduZWQgYnl0ZXMiIG9mIHRoZSBnaXZlbiBsZW5ndGguIFJldHVybnMgMCBvbiBzdWNjZXNzCi0gICAgICAgICAgIGFuZCAtMSAod2l0aCByYWlzaW5nIGFuIGVycm9yKSBvbiBlcnJvci4KLSAgICAgICAgICovCisgICAgLyogRmlsbHMgaW4gYSBidWZmZXItaW5mbyBzdHJ1Y3R1cmUgY29ycmVjdGx5IGZvciBhbiBleHBvcnRlcgorICAgICAgIHRoYXQgY2FuIG9ubHkgc2hhcmUgYSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSBvZgorICAgICAgICJ1bnNpZ25lZCBieXRlcyIgb2YgdGhlIGdpdmVuIGxlbmd0aC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgICAgICBhbmQgLTEgKHdpdGggcmFpc2luZyBhbiBlcnJvcikgb24gZXJyb3IuCisgICAgICovCiAKICAgICAgUHlBUElfRlVOQyh2b2lkKSBQeUJ1ZmZlcl9SZWxlYXNlKFB5X2J1ZmZlciAqdmlldyk7CiAKICAgICAgICAvKiBSZWxlYXNlcyBhIFB5X2J1ZmZlciBvYnRhaW5lZCBmcm9tIGdldGJ1ZmZlciBQYXJzZVR1cGxlJ3MgcyouCi0gICAgICAgICovCisgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0Zvcm1hdChQeU9iamVjdCogb2JqLAotCQkJCQkgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjKTsKICAgICAgICAvKgotCSBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKLQkgY2FsbGluZyBvYmouX19mb3JtYXRfXyhmb3JtYXRfc3BlYykuCisgICAgIFRha2VzIGFuIGFyYml0cmFyeSBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZgorICAgICBjYWxsaW5nIG9iai5fX2Zvcm1hdF9fKGZvcm1hdF9zcGVjKS4KICAgICAgICAqLwogCiAvKiBJdGVyYXRvcnMgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0dldEl0ZXIoUHlPYmplY3QgKik7CiAgICAgIC8qIFRha2VzIGFuIG9iamVjdCBhbmQgcmV0dXJucyBhbiBpdGVyYXRvciBmb3IgaXQuCi0gICAgICAgIFRoaXMgaXMgdHlwaWNhbGx5IGEgbmV3IGl0ZXJhdG9yIGJ1dCBpZiB0aGUgYXJndW1lbnQKLQlpcyBhbiBpdGVyYXRvciwgdGhpcyByZXR1cm5zIGl0c2VsZi4gKi8KKyAgICBUaGlzIGlzIHR5cGljYWxseSBhIG5ldyBpdGVyYXRvciBidXQgaWYgdGhlIGFyZ3VtZW50CisgICAgaXMgYW4gaXRlcmF0b3IsIHRoaXMgcmV0dXJucyBpdHNlbGYuICovCiAKICNkZWZpbmUgUHlJdGVyX0NoZWNrKG9iaikgXAogICAgIChQeVR5cGVfSGFzRmVhdHVyZSgob2JqKS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lURVIpICYmIFwKQEAgLTY0MSwyNyArNjQxLDI3IEBACiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUl0ZXJfTmV4dChQeU9iamVjdCAqKTsKICAgICAgLyogVGFrZXMgYW4gaXRlcmF0b3Igb2JqZWN0IGFuZCBjYWxscyBpdHMgdHBfaXRlcm5leHQgc2xvdCwKLQlyZXR1cm5pbmcgdGhlIG5leHQgdmFsdWUuICBJZiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkLAotCXRoaXMgcmV0dXJucyBOVUxMIHdpdGhvdXQgc2V0dGluZyBhbiBleGNlcHRpb24uCi0JTlVMTCB3aXRoIGFuIGV4Y2VwdGlvbiBtZWFucyBhbiBlcnJvciBvY2N1cnJlZC4gKi8KKyAgICByZXR1cm5pbmcgdGhlIG5leHQgdmFsdWUuICBJZiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkLAorICAgIHRoaXMgcmV0dXJucyBOVUxMIHdpdGhvdXQgc2V0dGluZyBhbiBleGNlcHRpb24uCisgICAgTlVMTCB3aXRoIGFuIGV4Y2VwdGlvbiBtZWFucyBhbiBlcnJvciBvY2N1cnJlZC4gKi8KIAogLyogIE51bWJlciBQcm90b2NvbDoqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU51bWJlcl9DaGVjayhQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJucyAxIGlmIHRoZSBvYmplY3QsIG8sIHByb3ZpZGVzIG51bWVyaWMgcHJvdG9jb2xzLCBhbmQKLQkgZmFsc2Ugb3RoZXJ3aXNlLiAKKyAgICAgUmV0dXJucyAxIGlmIHRoZSBvYmplY3QsIG8sIHByb3ZpZGVzIG51bWVyaWMgcHJvdG9jb2xzLCBhbmQKKyAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogCi0JIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9BZGQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFkZGluZyBvMSBhbmQgbzIsIG9yIG51bGwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xK28yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIG8xIGFuZCBvMiwgb3IgbnVsbCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzErbzIuCiAKIAogICAgICAgICovCkBAIC02NjksMTggKzY2OSwxOCBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1N1YnRyYWN0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyBvMiBmcm9tIG8xLCBvciBudWxsIG9uCi0JIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEtbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyBvMiBmcm9tIG8xLCBvciBudWxsIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEtbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfTXVsdGlwbHkoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIG8xIGFuZCBvMiwgb3IgbnVsbCBvbgotCSBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xKm8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgbzEgYW5kIG8yLCBvciBudWxsIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEqbzIuCiAKIAogICAgICAgICovCkBAIC02ODgsOCArNjg4LDggQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9EaXZpZGUoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS9vMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS9vMi4KIAogCiAgICAgICAgKi8KQEAgLTY5Nyw5ICs2OTcsOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0Zsb29yRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYW4gaW50ZWdyYWwgcmVzdWx0LAotCSBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS8vbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYW4gaW50ZWdyYWwgcmVzdWx0LAorICAgICBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS8vbzIuCiAKIAogICAgICAgICovCkBAIC03MDcsOSArNzA3LDkgQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9UcnVlRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYSBmbG9hdCByZXN1bHQsCi0JIG9yIG51bGwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xL28yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgbzEgYnkgbzIgZ2l2aW5nIGEgZmxvYXQgcmVzdWx0LAorICAgICBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS9vMi4KIAogCiAgICAgICAgKi8KQEAgLTcxNyw5ICs3MTcsOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1JlbWFpbmRlcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgbzEgYnkgbzIsIG9yIG51bGwgb24KLQkgZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSVvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBvciBudWxsIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzElbzIuCiAKIAogICAgICAgICovCkBAIC03MjcsOSArNzI3LDkgQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9EaXZtb2QoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgU2VlIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBkaXZtb2QuICBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIGRpdm1vZChvMSxvMikuCisgICAgIFNlZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gZGl2bW9kLiAgUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBkaXZtb2QobzEsbzIpLgogCiAKICAgICAgICAqLwpAQCAtNzM4LDQyICs3MzgsNDIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvMyk7CiAKICAgICAgICAvKgotCSBTZWUgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIHBvdy4gIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLgotCSBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgcG93KG8xLG8yLG8zKSwgd2hlcmUgbzMgaXMgb3B0aW9uYWwuCisgICAgIFNlZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gcG93LiAgUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBwb3cobzEsbzIsbzMpLCB3aGVyZSBvMyBpcyBvcHRpb25hbC4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9OZWdhdGl2ZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiBvIG9uIHN1Y2Nlc3MsIG9yIG51bGwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IC1vLgorICAgICBSZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiBvIG9uIHN1Y2Nlc3MsIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IC1vLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1Bvc2l0aXZlKFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0gICAgICAgICBSZXR1cm5zIHRoZSAod2hhdD8pIG9mIG8gb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgotCSBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogK28uCisgICAgIFJldHVybnMgdGhlICh3aGF0Pykgb2YgbyBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiArby4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9BYnNvbHV0ZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBvLCBvciBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYWJzKG8pLgorICAgICBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBvLCBvciBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzCisgICAgIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYWJzKG8pLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0ludmVydChQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBiaXR3aXNlIG5lZ2F0aW9uIG9mIG8gb24gc3VjY2Vzcywgb3IgTlVMTCBvbgotCSBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIH5vLgorICAgICBSZXR1cm5zIHRoZSBiaXR3aXNlIG5lZ2F0aW9uIG9mIG8gb24gc3VjY2Vzcywgb3IgTlVMTCBvbgorICAgICBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIH5vLgogCiAKICAgICAgICAqLwpAQCAtNzgxLDkgKzc4MSw5IEBACiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfTHNoaWZ0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBsZWZ0IHNoaWZ0aW5nIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSA8PCBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGxlZnQgc2hpZnRpbmcgbzEgYnkgbzIgb24gc3VjY2Vzcywgb3IKKyAgICAgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xIDw8IG8yLgogCiAKICAgICAgICAqLwpAQCAtNzkxLDE4ICs3OTEsMTggQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9Sc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJpZ2h0IHNoaWZ0aW5nIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSA+PiBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJpZ2h0IHNoaWZ0aW5nIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSA+PiBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9BbmQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2UgYW5kIG9mIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgotCSBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSZvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2UgYW5kIG9mIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSZvMi4KIAogCiAgICAgICAgKi8KQEAgLTgxMCw5ICs4MTAsOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1hvcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBiaXR3aXNlIGV4Y2x1c2l2ZSBvciBvZiBvMSBieSBvMiBvbiBzdWNjZXNzLCBvcgotCSBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzFebzIuCisgICAgIFJldHVybnMgdGhlIGJpdHdpc2UgZXhjbHVzaXZlIG9yIG9mIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMV5vMi4KIAogCiAgICAgICAgKi8KQEAgLTgyMCw5ICs4MjAsOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX09yKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9uIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgotCSBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzF8bzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9uIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbzF8bzIuCiAKICAgICAgICAqLwogCkBAIC04MzAsMTggKzgzMCwxOCBAQAogCiAgICAgIGludCBQeU51bWJlcl9Db2VyY2UoUHlPYmplY3QgKipwMSwgUHlPYmplY3QgKipwMik7CiAKLQkgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgYWRkcmVzc2VzIG9mIHR3byB2YXJpYWJsZXMgb2YgdHlwZQotCSBQeU9iamVjdCouCisgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIGFkZHJlc3NlcyBvZiB0d28gdmFyaWFibGVzIG9mIHR5cGUKKyAgICAgUHlPYmplY3QqLgogCi0JIElmIHRoZSBvYmplY3RzIHBvaW50ZWQgdG8gYnkgKnAxIGFuZCAqcDIgaGF2ZSB0aGUgc2FtZSB0eXBlLAotCSBpbmNyZW1lbnQgdGhlaXIgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm4gMCAoc3VjY2VzcykuCi0JIElmIHRoZSBvYmplY3RzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gbnVtZXJpYyB0eXBlLAotCSByZXBsYWNlICpwMSBhbmQgKnAyIGJ5IHRoZWlyIGNvbnZlcnRlZCB2YWx1ZSAod2l0aCAnbmV3JwotCSByZWZlcmVuY2UgY291bnRzKSwgYW5kIHJldHVybiAwLgotCSBJZiBubyBjb252ZXJzaW9uIGlzIHBvc3NpYmxlLCBvciBpZiBzb21lIG90aGVyIGVycm9yIG9jY3VycywKLQkgcmV0dXJuIC0xIChmYWlsdXJlKSBhbmQgZG9uJ3QgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnRzLgotCSBUaGUgY2FsbCBQeU51bWJlcl9Db2VyY2UoJm8xLCAmbzIpIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQgbzEsIG8yID0gY29lcmNlKG8xLCBvMikuCisgICAgIElmIHRoZSBvYmplY3RzIHBvaW50ZWQgdG8gYnkgKnAxIGFuZCAqcDIgaGF2ZSB0aGUgc2FtZSB0eXBlLAorICAgICBpbmNyZW1lbnQgdGhlaXIgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm4gMCAoc3VjY2VzcykuCisgICAgIElmIHRoZSBvYmplY3RzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gbnVtZXJpYyB0eXBlLAorICAgICByZXBsYWNlICpwMSBhbmQgKnAyIGJ5IHRoZWlyIGNvbnZlcnRlZCB2YWx1ZSAod2l0aCAnbmV3JworICAgICByZWZlcmVuY2UgY291bnRzKSwgYW5kIHJldHVybiAwLgorICAgICBJZiBubyBjb252ZXJzaW9uIGlzIHBvc3NpYmxlLCBvciBpZiBzb21lIG90aGVyIGVycm9yIG9jY3VycywKKyAgICAgcmV0dXJuIC0xIChmYWlsdXJlKSBhbmQgZG9uJ3QgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnRzLgorICAgICBUaGUgY2FsbCBQeU51bWJlcl9Db2VyY2UoJm8xLCAmbzIpIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQgbzEsIG8yID0gY29lcmNlKG8xLCBvMikuCiAKICAgICAgICAqLwogCkBAIC04NDksMTg0ICs4NDksMTg0IEBACiAgICAoKG9iaiktPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmIFwKICAgICBQeVR5cGVfSGFzRmVhdHVyZSgob2JqKS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lOREVYKSAmJiBcCiAgICAgKG9iaiktPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfaW5kZXggIT0gTlVMTCkKLSAgICAgICAgCisKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JbmRleChQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBvYmplY3QgY29udmVydGVkIHRvIGEgUHl0aG9uIGxvbmcgb3IgaW50Ci0JIG9yIE5VTEwgd2l0aCBhbiBlcnJvciByYWlzZWQgb24gZmFpbHVyZS4KKyAgICAgUmV0dXJucyB0aGUgb2JqZWN0IGNvbnZlcnRlZCB0byBhIFB5dGhvbiBsb25nIG9yIGludAorICAgICBvciBOVUxMIHdpdGggYW4gZXJyb3IgcmFpc2VkIG9uIGZhaWx1cmUuCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5TnVtYmVyX0FzU3NpemVfdChQeU9iamVjdCAqbywgUHlPYmplY3QgKmV4Yyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJucyB0aGUgSW50ZWdyYWwgaW5zdGFuY2UgY29udmVydGVkIHRvIGFuIGludC4gVGhlCi0gICAgICAgICBpbnN0YW5jZSBpcyBleHBlY3RlZCB0byBiZSBpbnQgb3IgbG9uZyBvciBoYXZlIGFuIF9faW50X18KLSAgICAgICAgIG1ldGhvZC4gU3RlYWxzIGludGVncmFsJ3MgcmVmZXJlbmNlLiBlcnJvcl9mb3JtYXQgd2lsbCBiZQotICAgICAgICAgdXNlZCB0byBjcmVhdGUgdGhlIFR5cGVFcnJvciBpZiBpbnRlZ3JhbCBpc24ndCBhY3R1YWxseSBhbgotICAgICAgICAgSW50ZWdyYWwgaW5zdGFuY2UuIGVycm9yX2Zvcm1hdCBzaG91bGQgYmUgYSBmb3JtYXQgc3RyaW5nCi0gICAgICAgICB0aGF0IGNhbiBhY2NlcHQgYSBjaGFyKiBuYW1pbmcgaW50ZWdyYWwncyB0eXBlLgorICAgICBSZXR1cm5zIHRoZSBJbnRlZ3JhbCBpbnN0YW5jZSBjb252ZXJ0ZWQgdG8gYW4gaW50LiBUaGUKKyAgICAgaW5zdGFuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgaW50IG9yIGxvbmcgb3IgaGF2ZSBhbiBfX2ludF9fCisgICAgIG1ldGhvZC4gU3RlYWxzIGludGVncmFsJ3MgcmVmZXJlbmNlLiBlcnJvcl9mb3JtYXQgd2lsbCBiZQorICAgICB1c2VkIHRvIGNyZWF0ZSB0aGUgVHlwZUVycm9yIGlmIGludGVncmFsIGlzbid0IGFjdHVhbGx5IGFuCisgICAgIEludGVncmFsIGluc3RhbmNlLiBlcnJvcl9mb3JtYXQgc2hvdWxkIGJlIGEgZm9ybWF0IHN0cmluZworICAgICB0aGF0IGNhbiBhY2NlcHQgYSBjaGFyKiBuYW1pbmcgaW50ZWdyYWwncyB0eXBlLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCi0gICAgICAgICAgICAgUHlPYmplY3QgKmludGVncmFsLAotICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yX2Zvcm1hdCk7CisgICAgICAgICBQeU9iamVjdCAqaW50ZWdyYWwsCisgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9mb3JtYXQpOwogCiAgICAgICAgLyoKLSAgICAgICAgUmV0dXJucyB0aGUgb2JqZWN0IGNvbnZlcnRlZCB0byBQeV9zc2l6ZV90IGJ5IGdvaW5nIHRocm91Z2gKLSAgICAgICAgUHlOdW1iZXJfSW5kZXggZmlyc3QuICBJZiBhbiBvdmVyZmxvdyBlcnJvciBvY2N1cnMgd2hpbGUKLSAgICAgICAgY29udmVydGluZyB0aGUgaW50LW9yLWxvbmcgdG8gUHlfc3NpemVfdCwgdGhlbiB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgICAgIGlzIHRoZSBlcnJvci10eXBlIHRvIHJldHVybi4gIElmIGl0IGlzIE5VTEwsIHRoZW4gdGhlIG92ZXJmbG93IGVycm9yCi0gICAgICAgIGlzIGNsZWFyZWQgYW5kIHRoZSB2YWx1ZSBpcyBjbGlwcGVkLiAKKyAgICBSZXR1cm5zIHRoZSBvYmplY3QgY29udmVydGVkIHRvIFB5X3NzaXplX3QgYnkgZ29pbmcgdGhyb3VnaAorICAgIFB5TnVtYmVyX0luZGV4IGZpcnN0LiAgSWYgYW4gb3ZlcmZsb3cgZXJyb3Igb2NjdXJzIHdoaWxlCisgICAgY29udmVydGluZyB0aGUgaW50LW9yLWxvbmcgdG8gUHlfc3NpemVfdCwgdGhlbiB0aGUgc2Vjb25kIGFyZ3VtZW50CisgICAgaXMgdGhlIGVycm9yLXR5cGUgdG8gcmV0dXJuLiAgSWYgaXQgaXMgTlVMTCwgdGhlbiB0aGUgb3ZlcmZsb3cgZXJyb3IKKyAgICBpcyBjbGVhcmVkIGFuZCB0aGUgdmFsdWUgaXMgY2xpcHBlZC4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW50KFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGFuIGludGVnZXIgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBpbnQobykuCisgICAgIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGFuIGludGVnZXIgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBpbnQobykuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfTG9uZyhQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBvIGNvbnZlcnRlZCB0byBhIGxvbmcgaW50ZWdlciBvYmplY3Qgb24gc3VjY2VzcywKLQkgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IGxvbmcobykuCisgICAgIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGEgbG9uZyBpbnRlZ2VyIG9iamVjdCBvbiBzdWNjZXNzLAorICAgICBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbG9uZyhvKS4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9GbG9hdChQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBvIGNvbnZlcnRlZCB0byBhIGZsb2F0IG9iamVjdCBvbiBzdWNjZXNzLCBvciBOVUxMCi0JIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgZmxvYXQobykuCisgICAgIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGEgZmxvYXQgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yIE5VTEwKKyAgICAgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBmbG9hdChvKS4KICAgICAgICAqLwotCSAKKwogLyogIEluLXBsYWNlIHZhcmlhbnRzIG9mIChzb21lIG9mKSB0aGUgYWJvdmUgbnVtYmVyIHByb3RvY29sIGZ1bmN0aW9ucyAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZUFkZChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIG8yIHRvIG8xLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbAotCSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xICs9IG8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIG8yIHRvIG8xLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbAorICAgICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xICs9IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgbzIgZnJvbSBvMSwgcG9zc2libHkgaW4tcGxhY2Ugb3IKLQkgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xIC09IG8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgbzIgZnJvbSBvMSwgcG9zc2libHkgaW4tcGxhY2Ugb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC09IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgotCSBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEgKj0gbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBtdWx0aXBseWluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yCisgICAgIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSAqPSBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yIG51bGwKLQkgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSAvPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbAorICAgICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC89IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZShQeU9iamVjdCAqbzEsCi0JCQkJCQkgICAgICAgUHlPYmplY3QgKm8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhbiBpbnRlZ3JhbCByZXN1bHQsCi0JIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSAvPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhbiBpbnRlZ3JhbCByZXN1bHQsCisgICAgIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSAvPSBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZShQeU9iamVjdCAqbzEsCi0JCQkJCQkgICAgICBQeU9iamVjdCAqbzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYSBmbG9hdCByZXN1bHQsCi0JIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSAvPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhIGZsb2F0IHJlc3VsdCwKKyAgICAgcG9zc2libHkgaW4tcGxhY2UsIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC89IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXIoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IKLQkgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xICU9IG8yLgorICAgICBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgorICAgICBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEgJT0gbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZVBvd2VyKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yLAotICAgICAJCQkJCQkgUHlPYmplY3QgKm8zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzMpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJhaXNpbmcgbzEgdG8gdGhlIHBvd2VyIG9mIG8yLCBwb3NzaWJseQotCSBpbi1wbGFjZSwgb3IgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IG8xICoqPSBvMiwgb3IgcG93KG8xLCBvMiwgbzMpIGlmIG8zIGlzIHByZXNlbnQuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByYWlzaW5nIG8xIHRvIHRoZSBwb3dlciBvZiBvMiwgcG9zc2libHkKKyAgICAgaW4tcGxhY2UsIG9yIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSAqKj0gbzIsIG9yIHBvdyhvMSwgbzIsIG8zKSBpZiBvMyBpcyBwcmVzZW50LgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VMc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGxlZnQgc2hpZnRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgotCSBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEgPDw9IG8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbGVmdCBzaGlmdGluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yCisgICAgIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSA8PD0gbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZVJzaGlmdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgcmlnaHQgc2hpZnRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlIG9yCi0JIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSA+Pj0gbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByaWdodCBzaGlmdGluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2Ugb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xID4+PSBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlQW5kKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIGFuZCBvZiBvMSBhbmQgbzIsIHBvc3NpYmx5IGluLXBsYWNlLAotCSBvciBudWxsIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSAmPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2UgYW5kIG9mIG8xIGFuZCBvMiwgcG9zc2libHkgaW4tcGxhY2UsCisgICAgIG9yIG51bGwgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xICY9IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VYb3IoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgYml0d2lzZSBleGNsdXNpdmUgb3Igb2YgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgotCSBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEgXj0gbzIuCisgICAgIFJldHVybnMgdGhlIGJpdHdpc2UgZXhjbHVzaXZlIG9yIG9mIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIF49IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VPcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYml0d2lzZSBvciBvZiBvMSBhbmQgbzIsIHBvc3NpYmx5IGluLXBsYWNlLAotCSBvciBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzEgfD0gbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9mIG8xIGFuZCBvMiwgcG9zc2libHkgaW4tcGxhY2UsCisgICAgIG9yIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSB8PSBvMi4KIAogICAgICAgICovCiAKQEAgLTEwMzQsOSArMTAzNCw5IEBACiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfVG9CYXNlKFB5T2JqZWN0ICpuLCBpbnQgYmFzZSk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBpbnRlZ2VyIG4gY29udmVydGVkIHRvIGEgc3RyaW5nIHdpdGggYSBiYXNlLCB3aXRoIGEgYmFzZQotCSBtYXJrZXIgb2YgMGIsIDBvIG9yIDB4IHByZWZpeGVkIGlmIGFwcGxpY2FibGUuCi0JIElmIG4gaXMgbm90IGFuIGludCBvYmplY3QsIGl0IGlzIGNvbnZlcnRlZCB3aXRoIFB5TnVtYmVyX0luZGV4IGZpcnN0LgorICAgICBSZXR1cm5zIHRoZSBpbnRlZ2VyIG4gY29udmVydGVkIHRvIGEgc3RyaW5nIHdpdGggYSBiYXNlLCB3aXRoIGEgYmFzZQorICAgICBtYXJrZXIgb2YgMGIsIDBvIG9yIDB4IHByZWZpeGVkIGlmIGFwcGxpY2FibGUuCisgICAgIElmIG4gaXMgbm90IGFuIGludCBvYmplY3QsIGl0IGlzIGNvbnZlcnRlZCB3aXRoIFB5TnVtYmVyX0luZGV4IGZpcnN0LgogICAgICAgICovCiAKIApAQCAtMTA0NSwxNyArMTA0NSwxNyBAQAogICAgICBQeUFQSV9GVU5DKGludCkgUHlTZXF1ZW5jZV9DaGVjayhQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJuIDEgaWYgdGhlIG9iamVjdCBwcm92aWRlcyBzZXF1ZW5jZSBwcm90b2NvbCwgYW5kIHplcm8KLQkgb3RoZXJ3aXNlLiAgCisgICAgIFJldHVybiAxIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgc2VxdWVuY2UgcHJvdG9jb2wsIGFuZCB6ZXJvCisgICAgIG90aGVyd2lzZS4KIAotCSBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KKyAgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlTZXF1ZW5jZV9TaXplKFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0gICAgICAgICBSZXR1cm4gdGhlIHNpemUgb2Ygc2VxdWVuY2Ugb2JqZWN0IG8sIG9yIC0xIG9uIGZhaWx1cmUuCisgICAgIFJldHVybiB0aGUgc2l6ZSBvZiBzZXF1ZW5jZSBvYmplY3Qgbywgb3IgLTEgb24gZmFpbHVyZS4KIAogICAgICAgICovCiAKQEAgLTEwNjgsMTUxICsxMDY4LDE1MSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfQ29uY2F0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBvMSBhbmQgbzIgb24gc3VjY2VzcywgYW5kIE5VTEwgb24KLQkgZmFpbHVyZS4gICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzErbzIuCisgICAgIFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBvMSBhbmQgbzIgb24gc3VjY2VzcywgYW5kIE5VTEwgb24KKyAgICAgZmFpbHVyZS4gICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbzErbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXF1ZW5jZV9SZXBlYXQoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgY291bnQpOwogCiAgICAgICAgLyoKLQkgUmV0dXJuIHRoZSByZXN1bHQgb2YgcmVwZWF0aW5nIHNlcXVlbmNlIG9iamVjdCBvIGNvdW50IHRpbWVzLAotCSBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzEqY291bnQuCisgICAgIFJldHVybiB0aGUgcmVzdWx0IG9mIHJlcGVhdGluZyBzZXF1ZW5jZSBvYmplY3QgbyBjb3VudCB0aW1lcywKKyAgICAgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xKmNvdW50LgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfR2V0SXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgaXRoIGVsZW1lbnQgb2Ygbywgb3IgTlVMTCBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZQotCSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogb1tpXS4KKyAgICAgUmV0dXJuIHRoZSBpdGggZWxlbWVudCBvZiBvLCBvciBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlCisgICAgIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvW2ldLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0dldFNsaWNlKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgc2xpY2Ugb2Ygc2VxdWVuY2Ugb2JqZWN0IG8gYmV0d2VlbiBpMSBhbmQgaTIsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IG9baTE6aTJdLgorICAgICBSZXR1cm4gdGhlIHNsaWNlIG9mIHNlcXVlbmNlIG9iamVjdCBvIGJldHdlZW4gaTEgYW5kIGkyLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvW2kxOmkyXS4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfU2V0SXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdik7CiAKICAgICAgICAvKgotCSBBc3NpZ24gb2JqZWN0IHYgdG8gdGhlIGl0aCBlbGVtZW50IG9mIG8uICBSZXR1cm5zCi0JIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBvW2ldPXYuCisgICAgIEFzc2lnbiBvYmplY3QgdiB0byB0aGUgaXRoIGVsZW1lbnQgb2Ygby4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IG9baV09di4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfRGVsSXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpKTsKIAogICAgICAgIC8qCi0JIERlbGV0ZSB0aGUgaXRoIGVsZW1lbnQgb2Ygb2JqZWN0IHYuICBSZXR1cm5zCi0JIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBkZWwgb1tpXS4KKyAgICAgRGVsZXRlIHRoZSBpdGggZWxlbWVudCBvZiBvYmplY3Qgdi4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IGRlbCBvW2ldLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfU2V0U2xpY2UoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnYpOwogCiAgICAgICAgLyoKLSAgICAgICAgIEFzc2lnbiB0aGUgc2VxdWVuY2Ugb2JqZWN0LCB2LCB0byB0aGUgc2xpY2UgaW4gc2VxdWVuY2UKLQkgb2JqZWN0LCBvLCBmcm9tIGkxIHRvIGkyLiAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZQotCSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50OiBvW2kxOmkyXT12LgorICAgICBBc3NpZ24gdGhlIHNlcXVlbmNlIG9iamVjdCwgdiwgdG8gdGhlIHNsaWNlIGluIHNlcXVlbmNlCisgICAgIG9iamVjdCwgbywgZnJvbSBpMSB0byBpMi4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUKKyAgICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogb1tpMTppMl09di4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeVNlcXVlbmNlX0RlbFNsaWNlKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKTsKIAogICAgICAgIC8qCi0JIERlbGV0ZSB0aGUgc2xpY2UgaW4gc2VxdWVuY2Ugb2JqZWN0LCBvLCBmcm9tIGkxIHRvIGkyLgotCSBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IGRlbCBvW2kxOmkyXS4KKyAgICAgRGVsZXRlIHRoZSBzbGljZSBpbiBzZXF1ZW5jZSBvYmplY3QsIG8sIGZyb20gaTEgdG8gaTIuCisgICAgIFJldHVybnMgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogZGVsIG9baTE6aTJdLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX1R1cGxlKFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIHR1cGxlIG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHR1cGxlKG8pCisgICAgIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIHR1cGxlIG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHR1cGxlKG8pCiAgICAgICAgKi8KIAogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXF1ZW5jZV9MaXN0KFB5T2JqZWN0ICpvKTsKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBzZXF1ZW5jZSwgbywgYXMgYSBsaXN0IG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGxpc3QobykKKyAgICAgUmV0dXJucyB0aGUgc2VxdWVuY2UsIG8sIGFzIGEgbGlzdCBvbiBzdWNjZXNzLCBhbmQgTlVMTCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOiBsaXN0KG8pCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfRmFzdChQeU9iamVjdCAqbywgY29uc3QgY2hhciogbSk7CiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIHR1cGxlLCB1bmxlc3MgaXQncyBhbHJlYWR5IGEKLSAgICAgICAgIHR1cGxlIG9yIGxpc3QuICBVc2UgUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNIHRvIGFjY2VzcyB0aGUKLSAgICAgICAgIG1lbWJlcnMgb2YgdGhpcyBsaXN0LCBhbmQgUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFIHRvIGdldCBpdHMgbGVuZ3RoLgorICAgICBSZXR1cm5zIHRoZSBzZXF1ZW5jZSwgbywgYXMgYSB0dXBsZSwgdW5sZXNzIGl0J3MgYWxyZWFkeSBhCisgICAgIHR1cGxlIG9yIGxpc3QuICBVc2UgUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNIHRvIGFjY2VzcyB0aGUKKyAgICAgbWVtYmVycyBvZiB0aGlzIGxpc3QsIGFuZCBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUgdG8gZ2V0IGl0cyBsZW5ndGguCiAKLSAgICAgICAgIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAgSWYgdGhlIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZXJhdGlvbiwKLSAgICAgICAgIHJhaXNlcyBhIFR5cGVFcnJvciBleGNlcHRpb24gd2l0aCBtIGFzIHRoZSBtZXNzYWdlIHRleHQuCisgICAgIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAgSWYgdGhlIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZXJhdGlvbiwKKyAgICAgcmFpc2VzIGEgVHlwZUVycm9yIGV4Y2VwdGlvbiB3aXRoIG0gYXMgdGhlIG1lc3NhZ2UgdGV4dC4KICAgICAgICAqLwogCiAjZGVmaW5lIFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShvKSBcCi0JKFB5TGlzdF9DaGVjayhvKSA/IFB5TGlzdF9HRVRfU0laRShvKSA6IFB5VHVwbGVfR0VUX1NJWkUobykpCisgICAgKFB5TGlzdF9DaGVjayhvKSA/IFB5TGlzdF9HRVRfU0laRShvKSA6IFB5VHVwbGVfR0VUX1NJWkUobykpCiAgICAgICAgLyoKLQkgUmV0dXJuIHRoZSBzaXplIG9mIG8sIGFzc3VtaW5nIHRoYXQgbyB3YXMgcmV0dXJuZWQgYnkKLSAgICAgICAgIFB5U2VxdWVuY2VfRmFzdCBhbmQgaXMgbm90IE5VTEwuCisgICAgIFJldHVybiB0aGUgc2l6ZSBvZiBvLCBhc3N1bWluZyB0aGF0IG8gd2FzIHJldHVybmVkIGJ5CisgICAgIFB5U2VxdWVuY2VfRmFzdCBhbmQgaXMgbm90IE5VTEwuCiAgICAgICAgKi8KIAogI2RlZmluZSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0obywgaSlcCiAgICAgIChQeUxpc3RfQ2hlY2sobykgPyBQeUxpc3RfR0VUX0lURU0obywgaSkgOiBQeVR1cGxlX0dFVF9JVEVNKG8sIGkpKQogICAgICAgIC8qCi0JIFJldHVybiB0aGUgaXRoIGVsZW1lbnQgb2YgbywgYXNzdW1pbmcgdGhhdCBvIHdhcyByZXR1cm5lZCBieQotICAgICAgICAgUHlTZXF1ZW5jZV9GYXN0LCBhbmQgdGhhdCBpIGlzIHdpdGhpbiBib3VuZHMuCisgICAgIFJldHVybiB0aGUgaXRoIGVsZW1lbnQgb2YgbywgYXNzdW1pbmcgdGhhdCBvIHdhcyByZXR1cm5lZCBieQorICAgICBQeVNlcXVlbmNlX0Zhc3QsIGFuZCB0aGF0IGkgaXMgd2l0aGluIGJvdW5kcy4KICAgICAgICAqLwogCiAjZGVmaW5lIFB5U2VxdWVuY2VfSVRFTShvLCBpKVwKLQkoIFB5X1RZUEUobyktPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKG8sIGkpICkKKyAgICAoIFB5X1RZUEUobyktPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKG8sIGkpICkKICAgICAgICAvKiBBc3N1bWUgdHBfYXNfc2VxdWVuY2UgYW5kIHNxX2l0ZW0gZXhpc3QgYW5kIHRoYXQgaSBkb2VzIG5vdAotCSAgbmVlZCB0byBiZSBjb3JyZWN0ZWQgZm9yIGEgbmVnYXRpdmUgaW5kZXgKLSAgICAgICAqLyAgICAgCisgICAgICBuZWVkIHRvIGJlIGNvcnJlY3RlZCBmb3IgYSBuZWdhdGl2ZSBpbmRleAorICAgICAgICovCiAKICNkZWZpbmUgUHlTZXF1ZW5jZV9GYXN0X0lURU1TKHNmKSBcCi0JKFB5TGlzdF9DaGVjayhzZikgPyAoKFB5TGlzdE9iamVjdCAqKShzZikpLT5vYl9pdGVtIFwKLQkJCSAgOiAoKFB5VHVwbGVPYmplY3QgKikoc2YpKS0+b2JfaXRlbSkKLQkvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIGl0ZW0gYXJyYXkgZm9yCi0gICAgICAgICAgIGFuIG9iamVjdCByZXR1cmVkIGJ5IFB5U2VxdWVuY2VfRmFzdCAqLworICAgIChQeUxpc3RfQ2hlY2soc2YpID8gKChQeUxpc3RPYmplY3QgKikoc2YpKS0+b2JfaXRlbSBcCisgICAgICAgICAgICAgICAgICAgICAgOiAoKFB5VHVwbGVPYmplY3QgKikoc2YpKS0+b2JfaXRlbSkKKyAgICAvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIGl0ZW0gYXJyYXkgZm9yCisgICAgICAgYW4gb2JqZWN0IHJldHVyZWQgYnkgUHlTZXF1ZW5jZV9GYXN0ICovCiAKICAgICAgUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVNlcXVlbmNlX0NvdW50KFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqdmFsdWUpOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9uIHZhbHVlIG9uIG8sIHRoYXQgaXMsCi0JIHJldHVybiB0aGUgbnVtYmVyIG9mIGtleXMgZm9yIHdoaWNoIG9ba2V5XT09dmFsdWUuICBPbgotCSBmYWlsdXJlLCByZXR1cm4gLTEuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvLmNvdW50KHZhbHVlKS4KKyAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb24gdmFsdWUgb24gbywgdGhhdCBpcywKKyAgICAgcmV0dXJuIHRoZSBudW1iZXIgb2Yga2V5cyBmb3Igd2hpY2ggb1trZXldPT12YWx1ZS4gIE9uCisgICAgIGZhaWx1cmUsIHJldHVybiAtMS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8uY291bnQodmFsdWUpLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfQ29udGFpbnMoUHlPYmplY3QgKnNlcSwgUHlPYmplY3QgKm9iKTsKICAgICAgICAvKgotICAgICAgICAgUmV0dXJuIC0xIGlmIGVycm9yOyAxIGlmIG9iIGluIHNlcTsgMCBpZiBvYiBub3QgaW4gc2VxLgotICAgICAgICAgVXNlIF9fY29udGFpbnNfXyBpZiBwb3NzaWJsZSwgZWxzZSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKCkuCisgICAgIFJldHVybiAtMSBpZiBlcnJvcjsgMSBpZiBvYiBpbiBzZXE7IDAgaWYgb2Igbm90IGluIHNlcS4KKyAgICAgVXNlIF9fY29udGFpbnNfXyBpZiBwb3NzaWJsZSwgZWxzZSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKCkuCiAgICAgICAgKi8KIAogI2RlZmluZSBQWV9JVEVSU0VBUkNIX0NPVU5UICAgIDEKICNkZWZpbmUgUFlfSVRFUlNFQVJDSF9JTkRFWCAgICAyCiAjZGVmaW5lIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMgMwogICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goUHlPYmplY3QgKnNlcSwKLSAgICAgCQkJCQlQeU9iamVjdCAqb2JqLCBpbnQgb3BlcmF0aW9uKTsKLQkvKgotCSAgSXRlcmF0ZSBvdmVyIHNlcS4gIFJlc3VsdCBkZXBlbmRzIG9uIHRoZSBvcGVyYXRpb246Ci0JICBQWV9JVEVSU0VBUkNIX0NPVU5UOiAgcmV0dXJuICMgb2YgdGltZXMgb2JqIGFwcGVhcnMgaW4gc2VxOyAtMSBpZgotCSAgCWVycm9yLgotCSAgUFlfSVRFUlNFQVJDSF9JTkRFWDogIHJldHVybiAwLWJhc2VkIGluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2Ugb2YKLQkgIAlvYmogaW4gc2VxOyBzZXQgVmFsdWVFcnJvciBhbmQgcmV0dXJuIC0xIGlmIG5vbmUgZm91bmQ7Ci0JICAJYWxzbyByZXR1cm4gLTEgb24gZXJyb3IuCi0JICBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TOiAgcmV0dXJuIDEgaWYgb2JqIGluIHNlcSwgZWxzZSAwOyAtMSBvbgotCSAgCWVycm9yLgotCSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9iaiwgaW50IG9wZXJhdGlvbik7CisgICAgLyoKKyAgICAgIEl0ZXJhdGUgb3ZlciBzZXEuICBSZXN1bHQgZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW9uOgorICAgICAgUFlfSVRFUlNFQVJDSF9DT1VOVDogIHJldHVybiAjIG9mIHRpbWVzIG9iaiBhcHBlYXJzIGluIHNlcTsgLTEgaWYKKyAgICAgICAgZXJyb3IuCisgICAgICBQWV9JVEVSU0VBUkNIX0lOREVYOiAgcmV0dXJuIDAtYmFzZWQgaW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZSBvZgorICAgICAgICBvYmogaW4gc2VxOyBzZXQgVmFsdWVFcnJvciBhbmQgcmV0dXJuIC0xIGlmIG5vbmUgZm91bmQ7CisgICAgICAgIGFsc28gcmV0dXJuIC0xIG9uIGVycm9yLgorICAgICAgUFlfSVRFUlNFQVJDSF9DT05UQUlOUzogIHJldHVybiAxIGlmIG9iaiBpbiBzZXEsIGVsc2UgMDsgLTEgb24KKyAgICAgICAgZXJyb3IuCisgICAgKi8KIAogLyogRm9yIERMTC1sZXZlbCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogI3VuZGVmIFB5U2VxdWVuY2VfSW4KQEAgLTEyMjIsMTcgKzEyMjIsMTcgQEAKICNkZWZpbmUgUHlTZXF1ZW5jZV9JbiBQeVNlcXVlbmNlX0NvbnRhaW5zCiAKICAgICAgICAvKgotCSBEZXRlcm1pbmUgaWYgbyBjb250YWlucyB2YWx1ZS4gIElmIGFuIGl0ZW0gaW4gbyBpcyBlcXVhbCB0bwotCSBYLCByZXR1cm4gMSwgb3RoZXJ3aXNlIHJldHVybiAwLiAgT24gZXJyb3IsIHJldHVybiAtMS4gIFRoaXMKLQkgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHZhbHVlIGluIG8uCisgICAgIERldGVybWluZSBpZiBvIGNvbnRhaW5zIHZhbHVlLiAgSWYgYW4gaXRlbSBpbiBvIGlzIGVxdWFsIHRvCisgICAgIFgsIHJldHVybiAxLCBvdGhlcndpc2UgcmV0dXJuIDAuICBPbiBlcnJvciwgcmV0dXJuIC0xLiAgVGhpcworICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdmFsdWUgaW4gby4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlTZXF1ZW5jZV9JbmRleChQeU9iamVjdCAqbywgUHlPYmplY3QgKnZhbHVlKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgZmlyc3QgaW5kZXggZm9yIHdoaWNoIG9baV09dmFsdWUuICBPbiBlcnJvciwKLQkgcmV0dXJuIC0xLiAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvLmluZGV4KHZhbHVlKS4KKyAgICAgUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBmb3Igd2hpY2ggb1tpXT12YWx1ZS4gIE9uIGVycm9yLAorICAgICByZXR1cm4gLTEuICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8uaW5kZXgodmFsdWUpLgogICAgICAgICovCiAKIC8qIEluLXBsYWNlIHZlcnNpb25zIG9mIHNvbWUgb2YgdGhlIGFib3ZlIFNlcXVlbmNlIGZ1bmN0aW9ucy4gKi8KQEAgLTEyNDAsMTggKzEyNDAsMTggQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0luUGxhY2VDb25jYXQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgQXBwZW5kIG8yIHRvIG8xLCBpbi1wbGFjZSB3aGVuIHBvc3NpYmxlLiBSZXR1cm4gdGhlIHJlc3VsdGluZwotCSBvYmplY3QsIHdoaWNoIGNvdWxkIGJlIG8xLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZQotCSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzEgKz0gbzIuCisgICAgIEFwcGVuZCBvMiB0byBvMSwgaW4tcGxhY2Ugd2hlbiBwb3NzaWJsZS4gUmV0dXJuIHRoZSByZXN1bHRpbmcKKyAgICAgb2JqZWN0LCB3aGljaCBjb3VsZCBiZSBvMSwgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUKKyAgICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xICs9IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdChQeU9iamVjdCAqbywgUHlfc3NpemVfdCBjb3VudCk7CiAKICAgICAgICAvKgotCSBSZXBlYXQgbzEgYnkgY291bnQsIGluLXBsYWNlIHdoZW4gcG9zc2libGUuIFJldHVybiB0aGUgcmVzdWx0aW5nCi0JIG9iamVjdCwgd2hpY2ggY291bGQgYmUgbzEsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlCi0JIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMSAqPSBjb3VudC4KKyAgICAgUmVwZWF0IG8xIGJ5IGNvdW50LCBpbi1wbGFjZSB3aGVuIHBvc3NpYmxlLiBSZXR1cm4gdGhlIHJlc3VsdGluZworICAgICBvYmplY3QsIHdoaWNoIGNvdWxkIGJlIG8xLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZQorICAgICBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzEgKj0gY291bnQuCiAKICAgICAgICAqLwogCkBAIC0xMjYwLDE4ICsxMjYwLDE4IEBACiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU1hcHBpbmdfQ2hlY2soUHlPYmplY3QgKm8pOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybiAxIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgbWFwcGluZyBwcm90b2NvbCwgYW5kIHplcm8KLQkgb3RoZXJ3aXNlLiAgCisgICAgIFJldHVybiAxIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgbWFwcGluZyBwcm90b2NvbCwgYW5kIHplcm8KKyAgICAgb3RoZXJ3aXNlLgogCi0JIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlNYXBwaW5nX1NpemUoUHlPYmplY3QgKm8pOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBrZXlzIGluIG9iamVjdCBvIG9uIHN1Y2Nlc3MsIGFuZCAtMSBvbgotCSBmYWlsdXJlLiAgRm9yIG9iamVjdHMgdGhhdCBkbyBub3QgcHJvdmlkZSBzZXF1ZW5jZSBwcm90b2NvbCwKLQkgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbGVuKG8pLgorICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBpbiBvYmplY3QgbyBvbiBzdWNjZXNzLCBhbmQgLTEgb24KKyAgICAgZmFpbHVyZS4gIEZvciBvYmplY3RzIHRoYXQgZG8gbm90IHByb3ZpZGUgc2VxdWVuY2UgcHJvdG9jb2wsCisgICAgIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGxlbihvKS4KICAgICAgICAqLwogCiAgICAgICAgLyogRm9yIERMTCBjb21wYXRpYmlsaXR5ICovCkBAIC0xMjg0LDkgKzEyODQsOSBAQAogCiAgICAgIGludCBQeU1hcHBpbmdfRGVsSXRlbVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5KTsKIAotCSBSZW1vdmUgdGhlIG1hcHBpbmcgZm9yIG9iamVjdCwga2V5LCBmcm9tIHRoZSBvYmplY3QgKm8uCi0JIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotCSB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KKyAgICAgUmVtb3ZlIHRoZSBtYXBwaW5nIGZvciBvYmplY3QsIGtleSwgZnJvbSB0aGUgb2JqZWN0ICpvLgorICAgICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IGRlbCBvW2tleV0uCiAgICAgICAgKi8KICNkZWZpbmUgUHlNYXBwaW5nX0RlbEl0ZW1TdHJpbmcoTyxLKSBQeU9iamVjdF9EZWxJdGVtU3RyaW5nKChPKSwoSykpCiAKQEAgLTEyOTQsMzAgKzEyOTQsMzAgQEAKIAogICAgICBpbnQgUHlNYXBwaW5nX0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpOwogCi0JIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0LCBrZXksIGZyb20gdGhlIG9iamVjdCAqby4KLQkgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCi0JIHRoZSBQeXRob24gc3RhdGVtZW50OiBkZWwgb1trZXldLgorICAgICBSZW1vdmUgdGhlIG1hcHBpbmcgZm9yIG9iamVjdCwga2V5LCBmcm9tIHRoZSBvYmplY3QgKm8uCisgICAgIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bworICAgICB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KICAgICAgICAqLwogI2RlZmluZSBQeU1hcHBpbmdfRGVsSXRlbShPLEspIFB5T2JqZWN0X0RlbEl0ZW0oKE8pLChLKSkKIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlNYXBwaW5nX0hhc0tleVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5KTsKIAogICAgICAgIC8qCi0JIE9uIHN1Y2Nlc3MsIHJldHVybiAxIGlmIHRoZSBtYXBwaW5nIG9iamVjdCBoYXMgdGhlIGtleSwga2V5LAotCSBhbmQgMCBvdGhlcndpc2UuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvLmhhc19rZXkoa2V5KS4gCisgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiAxIGlmIHRoZSBtYXBwaW5nIG9iamVjdCBoYXMgdGhlIGtleSwga2V5LAorICAgICBhbmQgMCBvdGhlcndpc2UuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvLmhhc19rZXkoa2V5KS4KIAotCSBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KKyAgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlNYXBwaW5nX0hhc0tleShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSk7CiAKICAgICAgICAvKgotCSBSZXR1cm4gMSBpZiB0aGUgbWFwcGluZyBvYmplY3QgaGFzIHRoZSBrZXksIGtleSwKLQkgYW5kIDAgb3RoZXJ3aXNlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgby5oYXNfa2V5KGtleSkuIAorICAgICBSZXR1cm4gMSBpZiB0aGUgbWFwcGluZyBvYmplY3QgaGFzIHRoZSBrZXksIGtleSwKKyAgICAgYW5kIDAgb3RoZXJ3aXNlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgby5oYXNfa2V5KGtleSkuCiAKLQkgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgogCiAgICAgICAgKi8KIApAQCAtMTMyNSw5ICsxMzI1LDkgQEAKIAogICAgICBQeU9iamVjdCAqUHlNYXBwaW5nX0tleXMoUHlPYmplY3QgKm8pOwogCi0gICAgICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBrZXlzIGluIG9iamVjdCBvLiAgT24KLQkgZmFpbHVyZSwgcmV0dXJuIE5VTEwuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IG8ua2V5cygpLgorICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBrZXlzIGluIG9iamVjdCBvLiAgT24KKyAgICAgZmFpbHVyZSwgcmV0dXJuIE5VTEwuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8ua2V5cygpLgogICAgICAgICovCiAjZGVmaW5lIFB5TWFwcGluZ19LZXlzKE8pIFB5T2JqZWN0X0NhbGxNZXRob2QoTywia2V5cyIsTlVMTCkKIApAQCAtMTMzNSw5ICsxMzM1LDkgQEAKIAogICAgICBQeU9iamVjdCAqUHlNYXBwaW5nX1ZhbHVlcyhQeU9iamVjdCAqbyk7CiAKLSAgICAgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBhIGxpc3Qgb2YgdGhlIHZhbHVlcyBpbiBvYmplY3Qgby4gIE9uCi0JIGZhaWx1cmUsIHJldHVybiBOVUxMLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvLnZhbHVlcygpLgorICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSB2YWx1ZXMgaW4gb2JqZWN0IG8uICBPbgorICAgICBmYWlsdXJlLCByZXR1cm4gTlVMTC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogby52YWx1ZXMoKS4KICAgICAgICAqLwogI2RlZmluZSBQeU1hcHBpbmdfVmFsdWVzKE8pIFB5T2JqZWN0X0NhbGxNZXRob2QoTywidmFsdWVzIixOVUxMKQogCkBAIC0xMzQ1LDEwICsxMzQ1LDEwIEBACiAKICAgICAgUHlPYmplY3QgKlB5TWFwcGluZ19JdGVtcyhQeU9iamVjdCAqbyk7CiAKLSAgICAgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBhIGxpc3Qgb2YgdGhlIGl0ZW1zIGluIG9iamVjdCBvLCB3aGVyZQotCSBlYWNoIGl0ZW0gaXMgYSB0dXBsZSBjb250YWluaW5nIGEga2V5LXZhbHVlIHBhaXIuICBPbgotCSBmYWlsdXJlLCByZXR1cm4gTlVMTC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogby5pdGVtcygpLgorICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBpdGVtcyBpbiBvYmplY3Qgbywgd2hlcmUKKyAgICAgZWFjaCBpdGVtIGlzIGEgdHVwbGUgY29udGFpbmluZyBhIGtleS12YWx1ZSBwYWlyLiAgT24KKyAgICAgZmFpbHVyZSwgcmV0dXJuIE5VTEwuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8uaXRlbXMoKS4KIAogICAgICAgICovCiAjZGVmaW5lIFB5TWFwcGluZ19JdGVtcyhPKSBQeU9iamVjdF9DYWxsTWV0aG9kKE8sIml0ZW1zIixOVUxMKQpAQCAtMTM1NiwxOCArMTM1NiwxOCBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpOwogCiAgICAgICAgLyoKLQkgUmV0dXJuIGVsZW1lbnQgb2YgbyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QsIGtleSwgb3IgTlVMTAotCSBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgb1trZXldLgorICAgICBSZXR1cm4gZWxlbWVudCBvZiBvIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCwga2V5LCBvciBOVUxMCisgICAgIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvW2tleV0uCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnZhbHVlKTsKIAogICAgICAgIC8qCi0JIE1hcCB0aGUgb2JqZWN0LCBrZXksIHRvIHRoZSB2YWx1ZSwgdi4gIFJldHVybnMgCi0JIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBvW2tleV09di4KKyAgICAgTWFwIHRoZSBvYmplY3QsIGtleSwgdG8gdGhlIHZhbHVlLCB2LiAgUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogb1trZXldPXYuCiAgICAgICAqLwogCiAKZGlmZiAtLWdpdCBhL0luY2x1ZGUvY2V2YWwuaCBiL0luY2x1ZGUvY2V2YWwuaAppbmRleCBhM2IzZGNmLi4wZThiZDJhIDEwMDY0NAotLS0gYS9JbmNsdWRlL2NldmFsLmgKKysrIGIvSW5jbHVkZS9jZXZhbC5oCkBAIC04LDExICs4LDExIEBACiAvKiBJbnRlcmZhY2UgdG8gcmFuZG9tIHBhcnRzIGluIGNldmFsLmMgKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcygKLQlQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIAogLyogSW5saW5lIHRoaXMgKi8KICNkZWZpbmUgUHlFdmFsX0NhbGxPYmplY3QoZnVuYyxhcmcpIFwKLSAgICAgICAgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJnLCAoUHlPYmplY3QgKilOVUxMKQorICAgIFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFyZywgKFB5T2JqZWN0ICopTlVMTCkKIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUV2YWxfQ2FsbEZ1bmN0aW9uKFB5T2JqZWN0ICpvYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwpAQCAtNDYsMTAgKzQ2LDEwIEBACiBQeUFQSV9GVU5DKGludCkgUHlfR2V0UmVjdXJzaW9uTGltaXQodm9pZCk7CiAKICNkZWZpbmUgUHlfRW50ZXJSZWN1cnNpdmVDYWxsKHdoZXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgKF9QeV9NYWtlUmVjQ2hlY2soUHlUaHJlYWRTdGF0ZV9HRVQoKS0+cmVjdXJzaW9uX2RlcHRoKSAmJiAgXAotCSAgICAgX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbCh3aGVyZSkpCi0jZGVmaW5lIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpCQkJCVwKLQkgICAgKC0tUHlUaHJlYWRTdGF0ZV9HRVQoKS0+cmVjdXJzaW9uX2RlcHRoKQorICAgICAgICAgICAgKF9QeV9NYWtlUmVjQ2hlY2soUHlUaHJlYWRTdGF0ZV9HRVQoKS0+cmVjdXJzaW9uX2RlcHRoKSAmJiAgXAorICAgICAgICAgICAgIF9QeV9DaGVja1JlY3Vyc2l2ZUNhbGwod2hlcmUpKQorI2RlZmluZSBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoLS1QeVRocmVhZFN0YXRlX0dFVCgpLT5yZWN1cnNpb25fZGVwdGgpCiBQeUFQSV9GVU5DKGludCkgX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbChjaGFyICp3aGVyZSk7CiBQeUFQSV9EQVRBKGludCkgX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQ7CiAjaWZkZWYgVVNFX1NUQUNLQ0hFQ0sKQEAgLTc1LDMxICs3NSwzMSBAQAogICAgdGhhdCBsYXN0cyBhIGxvbmcgdGltZSBhbmQgZG9lc24ndCB0b3VjaCBQeXRob24gZGF0YSkgY2FuIGFsbG93IG90aGVyCiAgICB0aHJlYWRzIHRvIHJ1biBhcyBmb2xsb3dzOgogCi0JLi4ucHJlcGFyYXRpb25zIGhlcmUuLi4KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JLi4uYmxvY2tpbmcgc3lzdGVtIGNhbGwgaGVyZS4uLgotCVB5X0VORF9BTExPV19USFJFQURTCi0JLi4uaW50ZXJwcmV0IHJlc3VsdCBoZXJlLi4uCisgICAgLi4ucHJlcGFyYXRpb25zIGhlcmUuLi4KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgLi4uYmxvY2tpbmcgc3lzdGVtIGNhbGwgaGVyZS4uLgorICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgLi4uaW50ZXJwcmV0IHJlc3VsdCBoZXJlLi4uCiAKICAgIFRoZSBQeV9CRUdJTl9BTExPV19USFJFQURTL1B5X0VORF9BTExPV19USFJFQURTIHBhaXIgZXhwYW5kcyB0byBhCiAgICB7fS1zdXJyb3VuZGVkIGJsb2NrLgogICAgVG8gbGVhdmUgdGhlIGJsb2NrIGluIHRoZSBtaWRkbGUgKGUuZy4sIHdpdGggcmV0dXJuKSwgeW91IG11c3QgaW5zZXJ0CiAgICBhIGxpbmUgY29udGFpbmluZyBQeV9CTE9DS19USFJFQURTIGJlZm9yZSB0aGUgcmV0dXJuLCBlLmcuCiAKLQlpZiAoLi4ucHJlbWF0dXJlX2V4aXQuLi4pIHsKLQkJUHlfQkxPQ0tfVEhSRUFEUwotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoLi4ucHJlbWF0dXJlX2V4aXQuLi4pIHsKKyAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogICAgQW4gYWx0ZXJuYXRpdmUgaXM6CiAKLQlQeV9CTE9DS19USFJFQURTCi0JaWYgKC4uLnByZW1hdHVyZV9leGl0Li4uKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X1VOQkxPQ0tfVEhSRUFEUworICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICBpZiAoLi4ucHJlbWF0dXJlX2V4aXQuLi4pIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfVU5CTE9DS19USFJFQURTCiAKICAgIEZvciBjb252ZW5pZW5jZSwgdGhhdCB0aGUgdmFsdWUgb2YgJ2Vycm5vJyBpcyByZXN0b3JlZCBhY3Jvc3MKICAgIFB5X0VORF9BTExPV19USFJFQURTIGFuZCBQeV9CTE9DS19USFJFQURTLgpAQCAtMTI4LDEyICsxMjgsMTIgQEAKIFB5QVBJX0ZVTkModm9pZCkgUHlFdmFsX1JlSW5pdFRocmVhZHModm9pZCk7CiAKICNkZWZpbmUgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyB7IFwKLQkJCVB5VGhyZWFkU3RhdGUgKl9zYXZlOyBcCi0JCQlfc2F2ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7Ci0jZGVmaW5lIFB5X0JMT0NLX1RIUkVBRFMJUHlFdmFsX1Jlc3RvcmVUaHJlYWQoX3NhdmUpOwotI2RlZmluZSBQeV9VTkJMT0NLX1RIUkVBRFMJX3NhdmUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOwotI2RlZmluZSBQeV9FTkRfQUxMT1dfVEhSRUFEUwlQeUV2YWxfUmVzdG9yZVRocmVhZChfc2F2ZSk7IFwKLQkJIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFB5VGhyZWFkU3RhdGUgKl9zYXZlOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBfc2F2ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisjZGVmaW5lIFB5X0JMT0NLX1RIUkVBRFMgICAgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKF9zYXZlKTsKKyNkZWZpbmUgUHlfVU5CTE9DS19USFJFQURTICAgICAgX3NhdmUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOworI2RlZmluZSBQeV9FTkRfQUxMT1dfVEhSRUFEUyAgICBQeUV2YWxfUmVzdG9yZVRocmVhZChfc2F2ZSk7IFwKKyAgICAgICAgICAgICAgICAgfQogCiAjZWxzZSAvKiAhV0lUSF9USFJFQUQgKi8KIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9kYXRldGltZS5oIGIvSW5jbHVkZS9kYXRldGltZS5oCmluZGV4IGUwMTcyOTkuLjQ3YWJlNWMgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZGF0ZXRpbWUuaAorKysgYi9JbmNsdWRlL2RhdGV0aW1lLmgKQEAgLTExLDEzICsxMSwxMyBAQAogICogYmlnLWVuZGlhbiwgdW5sZXNzIG90aGVyd2lzZSBub3RlZDoKICAqCiAgKiBieXRlIG9mZnNldAotICogIDAgCQl5ZWFyICAgICAyIGJ5dGVzLCAxLTk5OTkKLSAqICAyCQltb250aCAgICAxIGJ5dGUsIDEtMTIKLSAqICAzIAkJZGF5ICAgICAgMSBieXRlLCAxLTMxCi0gKiAgNAkJaG91ciAgICAgMSBieXRlLCAwLTIzCi0gKiAgNSAJCW1pbnV0ZSAgIDEgYnl0ZSwgMC01OQotICogIDYgCQlzZWNvbmQgICAxIGJ5dGUsIDAtNTkKLSAqICA3IAkJdXNlY29uZCAgMyBieXRlcywgMC05OTk5OTkKKyAqICAwICAgICAgICAgICB5ZWFyICAgICAyIGJ5dGVzLCAxLTk5OTkKKyAqICAyICAgICAgICAgICBtb250aCAgICAxIGJ5dGUsIDEtMTIKKyAqICAzICAgICAgICAgICBkYXkgICAgICAxIGJ5dGUsIDEtMzEKKyAqICA0ICAgICAgICAgICBob3VyICAgICAxIGJ5dGUsIDAtMjMKKyAqICA1ICAgICAgICAgICBtaW51dGUgICAxIGJ5dGUsIDAtNTkKKyAqICA2ICAgICAgICAgICBzZWNvbmQgICAxIGJ5dGUsIDAtNTkKKyAqICA3ICAgICAgICAgICB1c2Vjb25kICAzIGJ5dGVzLCAwLTk5OTk5OQogICogMTAKICAqLwogCkBAIC0zMywyNiArMzMsMjYgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlQeU9iamVjdF9IRUFECi0JbG9uZyBoYXNoY29kZTsJCS8qIC0xIHdoZW4gdW5rbm93biAqLwotCWludCBkYXlzOwkJLyogLU1BWF9ERUxUQV9EQVlTIDw9IGRheXMgPD0gTUFYX0RFTFRBX0RBWVMgKi8KLQlpbnQgc2Vjb25kczsJCS8qIDAgPD0gc2Vjb25kcyA8IDI0KjM2MDAgaXMgaW52YXJpYW50ICovCi0JaW50IG1pY3Jvc2Vjb25kczsJLyogMCA8PSBtaWNyb3NlY29uZHMgPCAxMDAwMDAwIGlzIGludmFyaWFudCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBsb25nIGhhc2hjb2RlOyAgICAgICAgICAgICAgLyogLTEgd2hlbiB1bmtub3duICovCisgICAgaW50IGRheXM7ICAgICAgICAgICAgICAgICAgIC8qIC1NQVhfREVMVEFfREFZUyA8PSBkYXlzIDw9IE1BWF9ERUxUQV9EQVlTICovCisgICAgaW50IHNlY29uZHM7ICAgICAgICAgICAgICAgIC8qIDAgPD0gc2Vjb25kcyA8IDI0KjM2MDAgaXMgaW52YXJpYW50ICovCisgICAgaW50IG1pY3Jvc2Vjb25kczsgICAgICAgICAgIC8qIDAgPD0gbWljcm9zZWNvbmRzIDwgMTAwMDAwMCBpcyBpbnZhcmlhbnQgKi8KIH0gUHlEYXRlVGltZV9EZWx0YTsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlQeU9iamVjdF9IRUFECQkvKiBhIHB1cmUgYWJzdHJhY3QgYmFzZSBjbGFzZSAqLworICAgIFB5T2JqZWN0X0hFQUQgICAgICAgICAgICAgICAvKiBhIHB1cmUgYWJzdHJhY3QgYmFzZSBjbGFzZSAqLwogfSBQeURhdGVUaW1lX1RaSW5mbzsKIAogCiAvKiBUaGUgZGF0ZXRpbWUgYW5kIHRpbWUgdHlwZXMgaGF2ZSBoYXNoY29kZXMsIGFuZCBhbiBvcHRpb25hbCB0emluZm8gbWVtYmVyLAogICogcHJlc2VudCBpZiBhbmQgb25seSBpZiBoYXN0emluZm8gaXMgdHJ1ZS4KICAqLwotI2RlZmluZSBfUHlUWklORk9fSEVBRAkJXAotCVB5T2JqZWN0X0hFQUQJCVwKLQlsb25nIGhhc2hjb2RlOwkJXAotCWNoYXIgaGFzdHppbmZvOwkJLyogYm9vbGVhbiBmbGFnICovCisjZGVmaW5lIF9QeVRaSU5GT19IRUFEICAgICAgICAgIFwKKyAgICBQeU9iamVjdF9IRUFEICAgICAgICAgICAgICAgXAorICAgIGxvbmcgaGFzaGNvZGU7ICAgICAgICAgICAgICBcCisgICAgY2hhciBoYXN0emluZm87ICAgICAgICAgICAgIC8qIGJvb2xlYW4gZmxhZyAqLwogCiAvKiBObyBfUHlEYXRlVGltZV9CYXNlVFpJbmZvIGlzIGFsbG9jYXRlZDsgaXQncyBqdXN0IHRvIGhhdmUgc29tZXRoaW5nCiAgKiBjb252ZW5pZW50IHRvIGNhc3QgdG8sIHdoZW4gZ2V0dGluZyBhdCB0aGUgaGFzdHppbmZvIG1lbWJlciBvZiBvYmplY3RzCkBAIC02MCw3ICs2MCw3IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0JX1B5VFpJTkZPX0hFQUQKKyAgICBfUHlUWklORk9fSEVBRAogfSBfUHlEYXRlVGltZV9CYXNlVFpJbmZvOwogCiAvKiBBbGwgdGltZSBvYmplY3RzIGFyZSBvZiBQeURhdGVUaW1lX1RpbWVUeXBlLCBidXQgdGhhdCBjYW4gYmUgYWxsb2NhdGVkCkBAIC02OSwyMCArNjksMjAgQEAKICAqIGludGVybmFsIHN0cnVjdCB1c2VkIHRvIGFsbG9jYXRlIHRoZSByaWdodCBhbW91bnQgb2Ygc3BhY2UgZm9yIHRoZQogICogIndpdGhvdXQiIGNhc2UuCiAgKi8KLSNkZWZpbmUgX1B5RGF0ZVRpbWVfVElNRUhFQUQJXAotCV9QeVRaSU5GT19IRUFECQlcCi0JdW5zaWduZWQgY2hhciBkYXRhW19QeURhdGVUaW1lX1RJTUVfREFUQVNJWkVdOworI2RlZmluZSBfUHlEYXRlVGltZV9USU1FSEVBRCAgICBcCisgICAgX1B5VFpJTkZPX0hFQUQgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGFbX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRV07CiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0JX1B5RGF0ZVRpbWVfVElNRUhFQUQKLX0gX1B5RGF0ZVRpbWVfQmFzZVRpbWU7CQkvKiBoYXN0emluZm8gZmFsc2UgKi8KKyAgICBfUHlEYXRlVGltZV9USU1FSEVBRAorfSBfUHlEYXRlVGltZV9CYXNlVGltZTsgICAgICAgICAvKiBoYXN0emluZm8gZmFsc2UgKi8KIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlfUHlEYXRlVGltZV9USU1FSEVBRAotCVB5T2JqZWN0ICp0emluZm87Ci19IFB5RGF0ZVRpbWVfVGltZTsJCS8qIGhhc3R6aW5mbyB0cnVlICovCisgICAgX1B5RGF0ZVRpbWVfVElNRUhFQUQKKyAgICBQeU9iamVjdCAqdHppbmZvOworfSBQeURhdGVUaW1lX1RpbWU7ICAgICAgICAgICAgICAvKiBoYXN0emluZm8gdHJ1ZSAqLwogCiAKIC8qIEFsbCBkYXRldGltZSBvYmplY3RzIGFyZSBvZiBQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSwgYnV0IHRoYXQgY2FuIGJlCkBAIC05Miw0OCArOTIsNDggQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlfUHlUWklORk9fSEVBRAotCXVuc2lnbmVkIGNoYXIgZGF0YVtfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFXTsKKyAgICBfUHlUWklORk9fSEVBRAorICAgIHVuc2lnbmVkIGNoYXIgZGF0YVtfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFXTsKIH0gUHlEYXRlVGltZV9EYXRlOwogCi0jZGVmaW5lIF9QeURhdGVUaW1lX0RBVEVUSU1FSEVBRAlcCi0JX1B5VFpJTkZPX0hFQUQJCQlcCi0JdW5zaWduZWQgY2hhciBkYXRhW19QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFXTsKKyNkZWZpbmUgX1B5RGF0ZVRpbWVfREFURVRJTUVIRUFEICAgICAgICBcCisgICAgX1B5VFpJTkZPX0hFQUQgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGNoYXIgZGF0YVtfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRV07CiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0JX1B5RGF0ZVRpbWVfREFURVRJTUVIRUFECi19IF9QeURhdGVUaW1lX0Jhc2VEYXRlVGltZTsJLyogaGFzdHppbmZvIGZhbHNlICovCisgICAgX1B5RGF0ZVRpbWVfREFURVRJTUVIRUFECit9IF9QeURhdGVUaW1lX0Jhc2VEYXRlVGltZTsgICAgIC8qIGhhc3R6aW5mbyBmYWxzZSAqLwogCiB0eXBlZGVmIHN0cnVjdAogewotCV9QeURhdGVUaW1lX0RBVEVUSU1FSEVBRAotCVB5T2JqZWN0ICp0emluZm87Ci19IFB5RGF0ZVRpbWVfRGF0ZVRpbWU7CQkvKiBoYXN0emluZm8gdHJ1ZSAqLworICAgIF9QeURhdGVUaW1lX0RBVEVUSU1FSEVBRAorICAgIFB5T2JqZWN0ICp0emluZm87Cit9IFB5RGF0ZVRpbWVfRGF0ZVRpbWU7ICAgICAgICAgIC8qIGhhc3R6aW5mbyB0cnVlICovCiAKIAogLyogQXBwbHkgZm9yIGRhdGUgYW5kIGRhdGV0aW1lIGluc3RhbmNlcy4gKi8KICNkZWZpbmUgUHlEYXRlVGltZV9HRVRfWUVBUihvKSAgICAgKCgoKFB5RGF0ZVRpbWVfRGF0ZSopbyktPmRhdGFbMF0gPDwgOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQeURhdGVUaW1lX0RhdGUqKW8pLT5kYXRhWzFdKQorICAgICAgICAgICAgICAgICAgICAgKChQeURhdGVUaW1lX0RhdGUqKW8pLT5kYXRhWzFdKQogI2RlZmluZSBQeURhdGVUaW1lX0dFVF9NT05USChvKSAgICAoKChQeURhdGVUaW1lX0RhdGUqKW8pLT5kYXRhWzJdKQogI2RlZmluZSBQeURhdGVUaW1lX0dFVF9EQVkobykgICAgICAoKChQeURhdGVUaW1lX0RhdGUqKW8pLT5kYXRhWzNdKQogCiAjZGVmaW5lIFB5RGF0ZVRpbWVfREFURV9HRVRfSE9VUihvKSAgICAgICAgKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbNF0pCiAjZGVmaW5lIFB5RGF0ZVRpbWVfREFURV9HRVRfTUlOVVRFKG8pICAgICAgKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbNV0pCiAjZGVmaW5lIFB5RGF0ZVRpbWVfREFURV9HRVRfU0VDT05EKG8pICAgICAgKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbNl0pCi0jZGVmaW5lIFB5RGF0ZVRpbWVfREFURV9HRVRfTUlDUk9TRUNPTkQobykgCQlcCi0JKCgoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzddIDw8IDE2KSB8CVwKLSAgICAgICAgICgoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzhdIDw8IDgpICB8CVwKLSAgICAgICAgICAoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzldKQorI2RlZmluZSBQeURhdGVUaW1lX0RBVEVfR0VUX01JQ1JPU0VDT05EKG8pICAgICAgICAgICAgICBcCisgICAgKCgoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzddIDw8IDE2KSB8ICAgICAgIFwKKyAgICAgKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbOF0gPDwgOCkgIHwgICAgICAgXAorICAgICAgKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs5XSkKIAogLyogQXBwbHkgZm9yIHRpbWUgaW5zdGFuY2VzLiAqLwogI2RlZmluZSBQeURhdGVUaW1lX1RJTUVfR0VUX0hPVVIobykgICAgICAgICgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbMF0pCiAjZGVmaW5lIFB5RGF0ZVRpbWVfVElNRV9HRVRfTUlOVVRFKG8pICAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVsxXSkKICNkZWZpbmUgUHlEYXRlVGltZV9USU1FX0dFVF9TRUNPTkQobykgICAgICAoKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzJdKQotI2RlZmluZSBQeURhdGVUaW1lX1RJTUVfR0VUX01JQ1JPU0VDT05EKG8pIAkJXAotCSgoKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzNdIDw8IDE2KSB8CVwKLSAgICAgICAgICgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbNF0gPDwgOCkgIHwJXAotICAgICAgICAgICgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVs1XSkKKyNkZWZpbmUgUHlEYXRlVGltZV9USU1FX0dFVF9NSUNST1NFQ09ORChvKSAgICAgICAgICAgICAgXAorICAgICgoKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzNdIDw8IDE2KSB8ICAgICAgICAgICBcCisgICAgICgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbNF0gPDwgOCkgIHwgICAgICAgICAgIFwKKyAgICAgICgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVs1XSkKIAogCiAvKiBEZWZpbmUgc3RydWN0dXJlIGZvciBDIEFQSS4gKi8KQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgIC8qIGNvbnN0cnVjdG9ycyAqLwogICAgIFB5T2JqZWN0ICooKkRhdGVfRnJvbURhdGUpKGludCwgaW50LCBpbnQsIFB5VHlwZU9iamVjdCopOwogICAgIFB5T2JqZWN0ICooKkRhdGVUaW1lX0Zyb21EYXRlQW5kVGltZSkoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LAotICAgICAgICAgICAgUHlPYmplY3QqLCBQeVR5cGVPYmplY3QqKTsKKyAgICAgICAgUHlPYmplY3QqLCBQeVR5cGVPYmplY3QqKTsKICAgICBQeU9iamVjdCAqKCpUaW1lX0Zyb21UaW1lKShpbnQsIGludCwgaW50LCBpbnQsIFB5T2JqZWN0KiwgUHlUeXBlT2JqZWN0Kik7CiAgICAgUHlPYmplY3QgKigqRGVsdGFfRnJvbURlbHRhKShpbnQsIGludCwgaW50LCBpbnQsIFB5VHlwZU9iamVjdCopOwogCkBAIC0xODgsNyArMTg4LDcgQEAKIHN0YXRpYyBQeURhdGVUaW1lX0NBUEkgKlB5RGF0ZVRpbWVBUEkgPSBOVUxMOwogCiAjZGVmaW5lIFB5RGF0ZVRpbWVfSU1QT1JUIFwKLSAgICAgICAgUHlEYXRlVGltZUFQSSA9IChQeURhdGVUaW1lX0NBUEkgKilQeUNhcHN1bGVfSW1wb3J0KFB5RGF0ZVRpbWVfQ0FQU1VMRV9OQU1FLCAwKQorICAgIFB5RGF0ZVRpbWVBUEkgPSAoUHlEYXRlVGltZV9DQVBJICopUHlDYXBzdWxlX0ltcG9ydChQeURhdGVUaW1lX0NBUFNVTEVfTkFNRSwgMCkKIAogLyogTWFjcm9zIGZvciB0eXBlIGNoZWNraW5nIHdoZW4gbm90IGJ1aWxkaW5nIHRoZSBQeXRob24gY29yZS4gKi8KICNkZWZpbmUgUHlEYXRlX0NoZWNrKG9wKSBQeU9iamVjdF9UeXBlQ2hlY2sob3AsIFB5RGF0ZVRpbWVBUEktPkRhdGVUeXBlKQpAQCAtMjA4LDMwICsyMDgsMzAgQEAKIAogLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgY29uc3RydWN0b3JzIGluIGEgc2ltcGxpZmllZCBmYXNoaW9uLiAqLwogI2RlZmluZSBQeURhdGVfRnJvbURhdGUoeWVhciwgbW9udGgsIGRheSkgXAotCVB5RGF0ZVRpbWVBUEktPkRhdGVfRnJvbURhdGUoeWVhciwgbW9udGgsIGRheSwgUHlEYXRlVGltZUFQSS0+RGF0ZVR5cGUpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZV9Gcm9tRGF0ZSh5ZWFyLCBtb250aCwgZGF5LCBQeURhdGVUaW1lQVBJLT5EYXRlVHlwZSkKIAogI2RlZmluZSBQeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW4sIHNlYywgdXNlYykgXAotCVB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lX0Zyb21EYXRlQW5kVGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBcCi0JCW1pbiwgc2VjLCB1c2VjLCBQeV9Ob25lLCBQeURhdGVUaW1lQVBJLT5EYXRlVGltZVR5cGUpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIFwKKyAgICAgICAgbWluLCBzZWMsIHVzZWMsIFB5X05vbmUsIFB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lVHlwZSkKIAogI2RlZmluZSBQeVRpbWVfRnJvbVRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQpIFwKLQlQeURhdGVUaW1lQVBJLT5UaW1lX0Zyb21UaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCBcCi0JCVB5X05vbmUsIFB5RGF0ZVRpbWVBUEktPlRpbWVUeXBlKQorICAgIFB5RGF0ZVRpbWVBUEktPlRpbWVfRnJvbVRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsIFwKKyAgICAgICAgUHlfTm9uZSwgUHlEYXRlVGltZUFQSS0+VGltZVR5cGUpCiAKICNkZWZpbmUgUHlEZWx0YV9Gcm9tRFNVKGRheXMsIHNlY29uZHMsIHVzZWNvbmRzKSBcCi0JUHlEYXRlVGltZUFQSS0+RGVsdGFfRnJvbURlbHRhKGRheXMsIHNlY29uZHMsIHVzZWNvbmRzLCAxLCBcCi0JCVB5RGF0ZVRpbWVBUEktPkRlbHRhVHlwZSkKKyAgICBQeURhdGVUaW1lQVBJLT5EZWx0YV9Gcm9tRGVsdGEoZGF5cywgc2Vjb25kcywgdXNlY29uZHMsIDEsIFwKKyAgICAgICAgUHlEYXRlVGltZUFQSS0+RGVsdGFUeXBlKQogCiAvKiBNYWNyb3Mgc3VwcG9ydGluZyB0aGUgREIgQVBJLiAqLwogI2RlZmluZSBQeURhdGVUaW1lX0Zyb21UaW1lc3RhbXAoYXJncykgXAotCVB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lX0Zyb21UaW1lc3RhbXAoIFwKLQkJKFB5T2JqZWN0KikgKFB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lVHlwZSksIGFyZ3MsIE5VTEwpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVfRnJvbVRpbWVzdGFtcCggXAorICAgICAgICAoUHlPYmplY3QqKSAoUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVUeXBlKSwgYXJncywgTlVMTCkKIAogI2RlZmluZSBQeURhdGVfRnJvbVRpbWVzdGFtcChhcmdzKSBcCi0JUHlEYXRlVGltZUFQSS0+RGF0ZV9Gcm9tVGltZXN0YW1wKCBcCi0JCShQeU9iamVjdCopIChQeURhdGVUaW1lQVBJLT5EYXRlVHlwZSksIGFyZ3MpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZV9Gcm9tVGltZXN0YW1wKCBcCisgICAgICAgIChQeU9iamVjdCopIChQeURhdGVUaW1lQVBJLT5EYXRlVHlwZSksIGFyZ3MpCiAKLSNlbmRpZgkvKiBQeV9CVUlMRF9DT1JFICovCisjZW5kaWYgIC8qIFB5X0JVSUxEX0NPUkUgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL2Rlc2Nyb2JqZWN0LmggYi9JbmNsdWRlL2Rlc2Nyb2JqZWN0LmgKaW5kZXggNzE4ZjlkNS4uYjU0MjczMiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9kZXNjcm9iamVjdC5oCisrKyBiL0luY2x1ZGUvZGVzY3JvYmplY3QuaApAQCAtOSwyNyArOSwyNyBAQAogdHlwZWRlZiBpbnQgKCpzZXR0ZXIpKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIHZvaWQgKik7CiAKIHR5cGVkZWYgc3RydWN0IFB5R2V0U2V0RGVmIHsKLQljaGFyICpuYW1lOwotCWdldHRlciBnZXQ7Ci0Jc2V0dGVyIHNldDsKLQljaGFyICpkb2M7Ci0Jdm9pZCAqY2xvc3VyZTsKKyAgICBjaGFyICpuYW1lOworICAgIGdldHRlciBnZXQ7CisgICAgc2V0dGVyIHNldDsKKyAgICBjaGFyICpkb2M7CisgICAgdm9pZCAqY2xvc3VyZTsKIH0gUHlHZXRTZXREZWY7CiAKIHR5cGVkZWYgUHlPYmplY3QgKigqd3JhcHBlcmZ1bmMpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywKLQkJCQkgdm9pZCAqd3JhcHBlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp3cmFwcGVkKTsKIAogdHlwZWRlZiBQeU9iamVjdCAqKCp3cmFwcGVyZnVuY19rd2RzKShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsCi0JCQkJICAgICAgdm9pZCAqd3JhcHBlZCwgUHlPYmplY3QgKmt3ZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp3cmFwcGVkLCBQeU9iamVjdCAqa3dkcyk7CiAKIHN0cnVjdCB3cmFwcGVyYmFzZSB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgb2Zmc2V0OwotCXZvaWQgKmZ1bmN0aW9uOwotCXdyYXBwZXJmdW5jIHdyYXBwZXI7Ci0JY2hhciAqZG9jOwotCWludCBmbGFnczsKLQlQeU9iamVjdCAqbmFtZV9zdHJvYmo7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgb2Zmc2V0OworICAgIHZvaWQgKmZ1bmN0aW9uOworICAgIHdyYXBwZXJmdW5jIHdyYXBwZXI7CisgICAgY2hhciAqZG9jOworICAgIGludCBmbGFnczsKKyAgICBQeU9iamVjdCAqbmFtZV9zdHJvYmo7CiB9OwogCiAvKiBGbGFncyBmb3IgYWJvdmUgc3RydWN0ICovCkBAIC0zOCwzMyArMzgsMzMgQEAKIC8qIFZhcmlvdXMga2luZHMgb2YgZGVzY3JpcHRvciBvYmplY3RzICovCiAKICNkZWZpbmUgUHlEZXNjcl9DT01NT04gXAotCVB5T2JqZWN0X0hFQUQgXAotCVB5VHlwZU9iamVjdCAqZF90eXBlOyBcCi0JUHlPYmplY3QgKmRfbmFtZQorICAgIFB5T2JqZWN0X0hFQUQgXAorICAgIFB5VHlwZU9iamVjdCAqZF90eXBlOyBcCisgICAgUHlPYmplY3QgKmRfbmFtZQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEZXNjcl9DT01NT047CisgICAgUHlEZXNjcl9DT01NT047CiB9IFB5RGVzY3JPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeURlc2NyX0NPTU1PTjsKLQlQeU1ldGhvZERlZiAqZF9tZXRob2Q7CisgICAgUHlEZXNjcl9DT01NT047CisgICAgUHlNZXRob2REZWYgKmRfbWV0aG9kOwogfSBQeU1ldGhvZERlc2NyT2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEZXNjcl9DT01NT047Ci0Jc3RydWN0IFB5TWVtYmVyRGVmICpkX21lbWJlcjsKKyAgICBQeURlc2NyX0NPTU1PTjsKKyAgICBzdHJ1Y3QgUHlNZW1iZXJEZWYgKmRfbWVtYmVyOwogfSBQeU1lbWJlckRlc2NyT2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEZXNjcl9DT01NT047Ci0JUHlHZXRTZXREZWYgKmRfZ2V0c2V0OworICAgIFB5RGVzY3JfQ09NTU9OOworICAgIFB5R2V0U2V0RGVmICpkX2dldHNldDsKIH0gUHlHZXRTZXREZXNjck9iamVjdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5RGVzY3JfQ09NTU9OOwotCXN0cnVjdCB3cmFwcGVyYmFzZSAqZF9iYXNlOwotCXZvaWQgKmRfd3JhcHBlZDsgLyogVGhpcyBjYW4gYmUgYW55IGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICBQeURlc2NyX0NPTU1PTjsKKyAgICBzdHJ1Y3Qgd3JhcHBlcmJhc2UgKmRfYmFzZTsKKyAgICB2b2lkICpkX3dyYXBwZWQ7IC8qIFRoaXMgY2FuIGJlIGFueSBmdW5jdGlvbiBwb2ludGVyICovCiB9IFB5V3JhcHBlckRlc2NyT2JqZWN0OwogCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlXcmFwcGVyRGVzY3JfVHlwZTsKQEAgLTc1LDExICs3NSwxMSBAQAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld01ldGhvZChQeVR5cGVPYmplY3QgKiwgUHlNZXRob2REZWYgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QoUHlUeXBlT2JqZWN0ICosIFB5TWV0aG9kRGVmICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld01lbWJlcihQeVR5cGVPYmplY3QgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBQeU1lbWJlckRlZiAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFB5TWVtYmVyRGVmICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld0dldFNldChQeVR5cGVPYmplY3QgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBQeUdldFNldERlZiAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFB5R2V0U2V0RGVmICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld1dyYXBwZXIoUHlUeXBlT2JqZWN0ICosCi0JCQkJCQlzdHJ1Y3Qgd3JhcHBlcmJhc2UgKiwgdm9pZCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3cmFwcGVyYmFzZSAqLCB2b2lkICopOwogI2RlZmluZSBQeURlc2NyX0lzRGF0YShkKSAoUHlfVFlQRShkKS0+dHBfZGVzY3Jfc2V0ICE9IE5VTEwpCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0UHJveHlfTmV3KFB5T2JqZWN0ICopOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9kaWN0b2JqZWN0LmggYi9JbmNsdWRlL2RpY3RvYmplY3QuaAppbmRleCBkZmQ0MmRjLi5lY2UwMWM2IDEwMDY0NAotLS0gYS9JbmNsdWRlL2RpY3RvYmplY3QuaAorKysgYi9JbmNsdWRlL2RpY3RvYmplY3QuaApAQCAtNDgsMTMgKzQ4LDEzIEBACiAjZGVmaW5lIFB5RGljdF9NSU5TSVpFIDgKIAogdHlwZWRlZiBzdHJ1Y3QgewotCS8qIENhY2hlZCBoYXNoIGNvZGUgb2YgbWVfa2V5LiAgTm90ZSB0aGF0IGhhc2ggY29kZXMgYXJlIEMgbG9uZ3MuCi0JICogV2UgaGF2ZSB0byB1c2UgUHlfc3NpemVfdCBpbnN0ZWFkIGJlY2F1c2UgZGljdF9wb3BpdGVtKCkgYWJ1c2VzCi0JICogbWVfaGFzaCB0byBob2xkIGEgc2VhcmNoIGZpbmdlci4KLQkgKi8KLQlQeV9zc2l6ZV90IG1lX2hhc2g7Ci0JUHlPYmplY3QgKm1lX2tleTsKLQlQeU9iamVjdCAqbWVfdmFsdWU7CisgICAgLyogQ2FjaGVkIGhhc2ggY29kZSBvZiBtZV9rZXkuICBOb3RlIHRoYXQgaGFzaCBjb2RlcyBhcmUgQyBsb25ncy4KKyAgICAgKiBXZSBoYXZlIHRvIHVzZSBQeV9zc2l6ZV90IGluc3RlYWQgYmVjYXVzZSBkaWN0X3BvcGl0ZW0oKSBhYnVzZXMKKyAgICAgKiBtZV9oYXNoIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyLgorICAgICAqLworICAgIFB5X3NzaXplX3QgbWVfaGFzaDsKKyAgICBQeU9iamVjdCAqbWVfa2V5OworICAgIFB5T2JqZWN0ICptZV92YWx1ZTsKIH0gUHlEaWN0RW50cnk7CiAKIC8qCkBAIC02OCwyNCArNjgsMjQgQEAKICovCiB0eXBlZGVmIHN0cnVjdCBfZGljdG9iamVjdCBQeURpY3RPYmplY3Q7CiBzdHJ1Y3QgX2RpY3RvYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90IG1hX2ZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KLQlQeV9zc2l6ZV90IG1hX3VzZWQ7ICAvKiAjIEFjdGl2ZSAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IG1hX2ZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KKyAgICBQeV9zc2l6ZV90IG1hX3VzZWQ7ICAvKiAjIEFjdGl2ZSAqLwogCi0JLyogVGhlIHRhYmxlIGNvbnRhaW5zIG1hX21hc2sgKyAxIHNsb3RzLCBhbmQgdGhhdCdzIGEgcG93ZXIgb2YgMi4KLQkgKiBXZSBzdG9yZSB0aGUgbWFzayBpbnN0ZWFkIG9mIHRoZSBzaXplIGJlY2F1c2UgdGhlIG1hc2sgaXMgbW9yZQotCSAqIGZyZXF1ZW50bHkgbmVlZGVkLgotCSAqLwotCVB5X3NzaXplX3QgbWFfbWFzazsKKyAgICAvKiBUaGUgdGFibGUgY29udGFpbnMgbWFfbWFzayArIDEgc2xvdHMsIGFuZCB0aGF0J3MgYSBwb3dlciBvZiAyLgorICAgICAqIFdlIHN0b3JlIHRoZSBtYXNrIGluc3RlYWQgb2YgdGhlIHNpemUgYmVjYXVzZSB0aGUgbWFzayBpcyBtb3JlCisgICAgICogZnJlcXVlbnRseSBuZWVkZWQuCisgICAgICovCisgICAgUHlfc3NpemVfdCBtYV9tYXNrOwogCi0JLyogbWFfdGFibGUgcG9pbnRzIHRvIG1hX3NtYWxsdGFibGUgZm9yIHNtYWxsIHRhYmxlcywgZWxzZSB0bwotCSAqIGFkZGl0aW9uYWwgbWFsbG9jJ2VkIG1lbW9yeS4gIG1hX3RhYmxlIGlzIG5ldmVyIE5VTEwhICBUaGlzIHJ1bGUKLQkgKiBzYXZlcyByZXBlYXRlZCBydW50aW1lIG51bGwtdGVzdHMgaW4gdGhlIHdvcmtob3JzZSBnZXRpdGVtIGFuZAotCSAqIHNldGl0ZW0gY2FsbHMuCi0JICovCi0JUHlEaWN0RW50cnkgKm1hX3RhYmxlOwotCVB5RGljdEVudHJ5ICooKm1hX2xvb2t1cCkoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoKTsKLQlQeURpY3RFbnRyeSBtYV9zbWFsbHRhYmxlW1B5RGljdF9NSU5TSVpFXTsKKyAgICAvKiBtYV90YWJsZSBwb2ludHMgdG8gbWFfc21hbGx0YWJsZSBmb3Igc21hbGwgdGFibGVzLCBlbHNlIHRvCisgICAgICogYWRkaXRpb25hbCBtYWxsb2MnZWQgbWVtb3J5LiAgbWFfdGFibGUgaXMgbmV2ZXIgTlVMTCEgIFRoaXMgcnVsZQorICAgICAqIHNhdmVzIHJlcGVhdGVkIHJ1bnRpbWUgbnVsbC10ZXN0cyBpbiB0aGUgd29ya2hvcnNlIGdldGl0ZW0gYW5kCisgICAgICogc2V0aXRlbSBjYWxscy4KKyAgICAgKi8KKyAgICBQeURpY3RFbnRyeSAqbWFfdGFibGU7CisgICAgUHlEaWN0RW50cnkgKigqbWFfbG9va3VwKShQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOworICAgIFB5RGljdEVudHJ5IG1hX3NtYWxsdGFibGVbUHlEaWN0X01JTlNJWkVdOwogfTsKIAogUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RGljdF9UeXBlOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAjZGVmaW5lIFB5RGljdFZhbHVlc19DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeURpY3RWYWx1ZXNfVHlwZSkKIC8qIFRoaXMgZXhjbHVkZXMgVmFsdWVzLCBzaW5jZSB0aGV5IGFyZSBub3Qgc2V0cy4gKi8KICMgZGVmaW5lIFB5RGljdFZpZXdTZXRfQ2hlY2sob3ApIFwKLQkoUHlEaWN0S2V5c19DaGVjayhvcCkgfHwgUHlEaWN0SXRlbXNfQ2hlY2sob3ApKQorICAgIChQeURpY3RLZXlzX0NoZWNrKG9wKSB8fCBQeURpY3RJdGVtc19DaGVjayhvcCkpCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0X05ldyh2b2lkKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0X0dldEl0ZW0oUHlPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5KTsKQEAgLTExMiw5ICsxMTIsOSBAQAogUHlBUElfRlVOQyhpbnQpIFB5RGljdF9EZWxJdGVtKFB5T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSk7CiBQeUFQSV9GVU5DKHZvaWQpIFB5RGljdF9DbGVhcihQeU9iamVjdCAqbXApOwogUHlBUElfRlVOQyhpbnQpIFB5RGljdF9OZXh0KAotCVB5T2JqZWN0ICptcCwgUHlfc3NpemVfdCAqcG9zLCBQeU9iamVjdCAqKmtleSwgUHlPYmplY3QgKip2YWx1ZSk7CisgICAgUHlPYmplY3QgKm1wLCBQeV9zc2l6ZV90ICpwb3MsIFB5T2JqZWN0ICoqa2V5LCBQeU9iamVjdCAqKnZhbHVlKTsKIFB5QVBJX0ZVTkMoaW50KSBfUHlEaWN0X05leHQoCi0JUHlPYmplY3QgKm1wLCBQeV9zc2l6ZV90ICpwb3MsIFB5T2JqZWN0ICoqa2V5LCBQeU9iamVjdCAqKnZhbHVlLCBsb25nICpoYXNoKTsKKyAgICBQeU9iamVjdCAqbXAsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXksIFB5T2JqZWN0ICoqdmFsdWUsIGxvbmcgKmhhc2gpOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURpY3RfS2V5cyhQeU9iamVjdCAqbXApOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURpY3RfVmFsdWVzKFB5T2JqZWN0ICptcCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdF9JdGVtcyhQeU9iamVjdCAqbXApOwpAQCAtMTM0LDggKzEzNCw4IEBACiAgICBkaWN0LnVwZGF0ZShvdGhlcikgaXMgZXF1aXZhbGVudCB0byBQeURpY3RfTWVyZ2UoZGljdCwgb3RoZXIsIDEpLgogKi8KIFB5QVBJX0ZVTkMoaW50KSBQeURpY3RfTWVyZ2UoUHlPYmplY3QgKm1wLAotCQkJCSAgIFB5T2JqZWN0ICpvdGhlciwKLQkJCQkgICBpbnQgb3ZlcnJpZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdmVycmlkZSk7CiAKIC8qIFB5RGljdF9NZXJnZUZyb21TZXEyIHVwZGF0ZXMvbWVyZ2VzIGZyb20gYW4gaXRlcmFibGUgb2JqZWN0IHByb2R1Y2luZwogICAgaXRlcmFibGUgb2JqZWN0cyBvZiBsZW5ndGggMi4gIElmIG92ZXJyaWRlIGlzIHRydWUsIHRoZSBsYXN0IG9jY3VycmVuY2UKQEAgLTE0Myw4ICsxNDMsOCBAQAogICAgaXMgZXF1aXZhbGVudCB0byBkaWN0PXt9OyBQeURpY3RfTWVyZ2VGcm9tU2VxKGRpY3QsIHNlcTIsIDEpLgogKi8KIFB5QVBJX0ZVTkMoaW50KSBQeURpY3RfTWVyZ2VGcm9tU2VxMihQeU9iamVjdCAqZCwKLQkJCQkJICAgUHlPYmplY3QgKnNlcTIsCi0JCQkJCSAgIGludCBvdmVycmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnNlcTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJyaWRlKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURpY3RfR2V0SXRlbVN0cmluZyhQeU9iamVjdCAqZHAsIGNvbnN0IGNoYXIgKmtleSk7CiBQeUFQSV9GVU5DKGludCkgUHlEaWN0X1NldEl0ZW1TdHJpbmcoUHlPYmplY3QgKmRwLCBjb25zdCBjaGFyICprZXksIFB5T2JqZWN0ICppdGVtKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvZmlsZW9iamVjdC5oIGIvSW5jbHVkZS9maWxlb2JqZWN0LmgKaW5kZXggODNlOWMyNS4uYmE1MDZlYyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9maWxlb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9maWxlb2JqZWN0LmgKQEAgLTgsMjggKzgsMjggQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUZJTEUgKmZfZnA7Ci0JUHlPYmplY3QgKmZfbmFtZTsKLQlQeU9iamVjdCAqZl9tb2RlOwotCWludCAoKmZfY2xvc2UpKEZJTEUgKik7Ci0JaW50IGZfc29mdHNwYWNlOwkvKiBGbGFnIHVzZWQgYnkgJ3ByaW50JyBjb21tYW5kICovCi0JaW50IGZfYmluYXJ5OwkJLyogRmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlsZSBpcyAKLQkJCQkgICBvcGVuIGluIGJpbmFyeSAoMSkgb3IgdGV4dCAoMCkgbW9kZSAqLwotCWNoYXIqIGZfYnVmOwkJLyogQWxsb2NhdGVkIHJlYWRhaGVhZCBidWZmZXIgKi8KLQljaGFyKiBmX2J1ZmVuZDsJCS8qIFBvaW50cyBhZnRlciBsYXN0IG9jY3VwaWVkIHBvc2l0aW9uICovCi0JY2hhciogZl9idWZwdHI7CQkvKiBDdXJyZW50IGJ1ZmZlciBwb3NpdGlvbiAqLwotCWNoYXIgKmZfc2V0YnVmOwkJLyogQnVmZmVyIGZvciBzZXRidWYoMykgYW5kIHNldHZidWYoMykgKi8KLQlpbnQgZl91bml2X25ld2xpbmU7CS8qIEhhbmRsZSBhbnkgbmV3bGluZSBjb252ZW50aW9uICovCi0JaW50IGZfbmV3bGluZXR5cGVzOwkvKiBUeXBlcyBvZiBuZXdsaW5lcyBzZWVuICovCi0JaW50IGZfc2tpcG5leHRsZjsJLyogU2tpcCBuZXh0IFxuICovCi0JUHlPYmplY3QgKmZfZW5jb2Rpbmc7Ci0JUHlPYmplY3QgKmZfZXJyb3JzOwotCVB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KLQlpbnQgdW5sb2NrZWRfY291bnQ7CS8qIE51bS4gY3VycmVudGx5IHJ1bm5pbmcgc2VjdGlvbnMgb2YgY29kZQotCQkJCSAgIHVzaW5nIGZfZnAgd2l0aCB0aGUgR0lMIHJlbGVhc2VkLiAqLwotCWludCByZWFkYWJsZTsKLQlpbnQgd3JpdGFibGU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZJTEUgKmZfZnA7CisgICAgUHlPYmplY3QgKmZfbmFtZTsKKyAgICBQeU9iamVjdCAqZl9tb2RlOworICAgIGludCAoKmZfY2xvc2UpKEZJTEUgKik7CisgICAgaW50IGZfc29mdHNwYWNlOyAgICAgICAgICAgIC8qIEZsYWcgdXNlZCBieSAncHJpbnQnIGNvbW1hbmQgKi8KKyAgICBpbnQgZl9iaW5hcnk7ICAgICAgICAgICAgICAgLyogRmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlsZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gaW4gYmluYXJ5ICgxKSBvciB0ZXh0ICgwKSBtb2RlICovCisgICAgY2hhciogZl9idWY7ICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlZCByZWFkYWhlYWQgYnVmZmVyICovCisgICAgY2hhciogZl9idWZlbmQ7ICAgICAgICAgICAgIC8qIFBvaW50cyBhZnRlciBsYXN0IG9jY3VwaWVkIHBvc2l0aW9uICovCisgICAgY2hhciogZl9idWZwdHI7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uICovCisgICAgY2hhciAqZl9zZXRidWY7ICAgICAgICAgICAgIC8qIEJ1ZmZlciBmb3Igc2V0YnVmKDMpIGFuZCBzZXR2YnVmKDMpICovCisgICAgaW50IGZfdW5pdl9uZXdsaW5lOyAgICAgICAgIC8qIEhhbmRsZSBhbnkgbmV3bGluZSBjb252ZW50aW9uICovCisgICAgaW50IGZfbmV3bGluZXR5cGVzOyAgICAgICAgIC8qIFR5cGVzIG9mIG5ld2xpbmVzIHNlZW4gKi8KKyAgICBpbnQgZl9za2lwbmV4dGxmOyAgICAgICAgICAgLyogU2tpcCBuZXh0IFxuICovCisgICAgUHlPYmplY3QgKmZfZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKmZfZXJyb3JzOworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KKyAgICBpbnQgdW5sb2NrZWRfY291bnQ7ICAgICAgICAgLyogTnVtLiBjdXJyZW50bHkgcnVubmluZyBzZWN0aW9ucyBvZiBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgZl9mcCB3aXRoIHRoZSBHSUwgcmVsZWFzZWQuICovCisgICAgaW50IHJlYWRhYmxlOworICAgIGludCB3cml0YWJsZTsKIH0gUHlGaWxlT2JqZWN0OwogCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlGaWxlX1R5cGU7CmRpZmYgLS1naXQgYS9JbmNsdWRlL29iamVjdC5oIGIvSW5jbHVkZS9vYmplY3QuaAppbmRleCAxMmUwYzQ2Li5kZmZlMGY4IDEwMDY0NAotLS0gYS9JbmNsdWRlL29iamVjdC5oCisrKyBiL0luY2x1ZGUvb2JqZWN0LmgKQEAgLTYzLDkgKzYzLDkgQEAKIAogI2lmZGVmIFB5X1RSQUNFX1JFRlMKIC8qIERlZmluZSBwb2ludGVycyB0byBzdXBwb3J0IGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9mIGFsbCBsaXZlIGhlYXAgb2JqZWN0cy4gKi8KLSNkZWZpbmUgX1B5T2JqZWN0X0hFQURfRVhUUkEJCVwKLQlzdHJ1Y3QgX29iamVjdCAqX29iX25leHQ7CVwKLQlzdHJ1Y3QgX29iamVjdCAqX29iX3ByZXY7CisjZGVmaW5lIF9QeU9iamVjdF9IRUFEX0VYVFJBICAgICAgICAgICAgXAorICAgIHN0cnVjdCBfb2JqZWN0ICpfb2JfbmV4dDsgICAgICAgICAgIFwKKyAgICBzdHJ1Y3QgX29iamVjdCAqX29iX3ByZXY7CiAKICNkZWZpbmUgX1B5T2JqZWN0X0VYVFJBX0lOSVQgMCwgMCwKIApAQCAtNzUsMTcgKzc1LDE3IEBACiAjZW5kaWYKIAogLyogUHlPYmplY3RfSEVBRCBkZWZpbmVzIHRoZSBpbml0aWFsIHNlZ21lbnQgb2YgZXZlcnkgUHlPYmplY3QuICovCi0jZGVmaW5lIFB5T2JqZWN0X0hFQUQJCQlcCi0JX1B5T2JqZWN0X0hFQURfRVhUUkEJCVwKLQlQeV9zc2l6ZV90IG9iX3JlZmNudDsJCVwKLQlzdHJ1Y3QgX3R5cGVvYmplY3QgKm9iX3R5cGU7CisjZGVmaW5lIFB5T2JqZWN0X0hFQUQgICAgICAgICAgICAgICAgICAgXAorICAgIF9QeU9iamVjdF9IRUFEX0VYVFJBICAgICAgICAgICAgICAgIFwKKyAgICBQeV9zc2l6ZV90IG9iX3JlZmNudDsgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IF90eXBlb2JqZWN0ICpvYl90eXBlOwogCi0jZGVmaW5lIFB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKQlcCi0JX1B5T2JqZWN0X0VYVFJBX0lOSVQJCVwKLQkxLCB0eXBlLAorI2RlZmluZSBQeU9iamVjdF9IRUFEX0lOSVQodHlwZSkgICAgICAgIFwKKyAgICBfUHlPYmplY3RfRVhUUkFfSU5JVCAgICAgICAgICAgICAgICBcCisgICAgMSwgdHlwZSwKIAotI2RlZmluZSBQeVZhck9iamVjdF9IRUFEX0lOSVQodHlwZSwgc2l6ZSkJXAotCVB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSBzaXplLAorI2RlZmluZSBQeVZhck9iamVjdF9IRUFEX0lOSVQodHlwZSwgc2l6ZSkgICAgICAgXAorICAgIFB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSBzaXplLAogCiAvKiBQeU9iamVjdF9WQVJfSEVBRCBkZWZpbmVzIHRoZSBpbml0aWFsIHNlZ21lbnQgb2YgYWxsIHZhcmlhYmxlLXNpemUKICAqIGNvbnRhaW5lciBvYmplY3RzLiAgVGhlc2UgZW5kIHdpdGggYSBkZWNsYXJhdGlvbiBvZiBhbiBhcnJheSB3aXRoIDEKQEAgLTkzLDkgKzkzLDkgQEAKICAqIGhhcyByb29tIGZvciBvYl9zaXplIGVsZW1lbnRzLiAgTm90ZSB0aGF0IG9iX3NpemUgaXMgYW4gZWxlbWVudCBjb3VudCwKICAqIG5vdCBuZWNlc3NhcmlseSBhIGJ5dGUgY291bnQuCiAgKi8KLSNkZWZpbmUgUHlPYmplY3RfVkFSX0hFQUQJCVwKLQlQeU9iamVjdF9IRUFECQkJXAotCVB5X3NzaXplX3Qgb2Jfc2l6ZTsgLyogTnVtYmVyIG9mIGl0ZW1zIGluIHZhcmlhYmxlIHBhcnQgKi8KKyNkZWZpbmUgUHlPYmplY3RfVkFSX0hFQUQgICAgICAgICAgICAgICBcCisgICAgUHlPYmplY3RfSEVBRCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFB5X3NzaXplX3Qgb2Jfc2l6ZTsgLyogTnVtYmVyIG9mIGl0ZW1zIGluIHZhcmlhYmxlIHBhcnQgKi8KICNkZWZpbmUgUHlfSU5WQUxJRF9TSVpFIChQeV9zc2l6ZV90KS0xCiAKIC8qIE5vdGhpbmcgaXMgYWN0dWFsbHkgZGVjbGFyZWQgdG8gYmUgYSBQeU9iamVjdCwgYnV0IGV2ZXJ5IHBvaW50ZXIgdG8KQEAgLTEwNCwxNiArMTA0LDE2IEBACiAgKiBpbiBhZGRpdGlvbiwgYmUgY2FzdCB0byBQeVZhck9iamVjdCouCiAgKi8KIHR5cGVkZWYgc3RydWN0IF9vYmplY3QgewotCVB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdF9IRUFECiB9IFB5T2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfVkFSX0hFQUQKKyAgICBQeU9iamVjdF9WQVJfSEVBRAogfSBQeVZhck9iamVjdDsKIAotI2RlZmluZSBQeV9SRUZDTlQob2IpCQkoKChQeU9iamVjdCopKG9iKSktPm9iX3JlZmNudCkKLSNkZWZpbmUgUHlfVFlQRShvYikJCSgoKFB5T2JqZWN0Kikob2IpKS0+b2JfdHlwZSkKLSNkZWZpbmUgUHlfU0laRShvYikJCSgoKFB5VmFyT2JqZWN0Kikob2IpKS0+b2Jfc2l6ZSkKKyNkZWZpbmUgUHlfUkVGQ05UKG9iKSAgICAgICAgICAgKCgoUHlPYmplY3QqKShvYikpLT5vYl9yZWZjbnQpCisjZGVmaW5lIFB5X1RZUEUob2IpICAgICAgICAgICAgICgoKFB5T2JqZWN0Kikob2IpKS0+b2JfdHlwZSkKKyNkZWZpbmUgUHlfU0laRShvYikgICAgICAgICAgICAgKCgoUHlWYXJPYmplY3QqKShvYikpLT5vYl9zaXplKQogCiAvKgogVHlwZSBvYmplY3RzIGNvbnRhaW4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgdHlwZSBuYW1lICh0byBoZWxwIHNvbWV3aGF0CkBAIC0xNjIsMjYgKzE2MiwyNiBAQAogCiAvKiBQeTNrIGJ1ZmZlciBpbnRlcmZhY2UgKi8KIHR5cGVkZWYgc3RydWN0IGJ1ZmZlcmluZm8gewotCXZvaWQgKmJ1ZjsgICAKLQlQeU9iamVjdCAqb2JqOyAgICAgICAgLyogb3duZWQgcmVmZXJlbmNlICovCi0JUHlfc3NpemVfdCBsZW47Ci0JUHlfc3NpemVfdCBpdGVtc2l6ZTsgIC8qIFRoaXMgaXMgUHlfc3NpemVfdCBzbyBpdCBjYW4gYmUgCi0JCQkgICAgICAgICBwb2ludGVkIHRvIGJ5IHN0cmlkZXMgaW4gc2ltcGxlIGNhc2UuKi8KLQlpbnQgcmVhZG9ubHk7Ci0JaW50IG5kaW07Ci0JY2hhciAqZm9ybWF0OwotCVB5X3NzaXplX3QgKnNoYXBlOwotCVB5X3NzaXplX3QgKnN0cmlkZXM7Ci0JUHlfc3NpemVfdCAqc3Vib2Zmc2V0czsKLQlQeV9zc2l6ZV90IHNtYWxsdGFibGVbMl07ICAvKiBzdGF0aWMgc3RvcmUgZm9yIHNoYXBlIGFuZCBzdHJpZGVzIG9mCi0JCQkJICAgICAgbW9uby1kaW1lbnNpb25hbCBidWZmZXJzLiAqLwotCXZvaWQgKmludGVybmFsOworICAgIHZvaWQgKmJ1ZjsKKyAgICBQeU9iamVjdCAqb2JqOyAgICAgICAgLyogb3duZWQgcmVmZXJlbmNlICovCisgICAgUHlfc3NpemVfdCBsZW47CisgICAgUHlfc3NpemVfdCBpdGVtc2l6ZTsgIC8qIFRoaXMgaXMgUHlfc3NpemVfdCBzbyBpdCBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCB0byBieSBzdHJpZGVzIGluIHNpbXBsZSBjYXNlLiovCisgICAgaW50IHJlYWRvbmx5OworICAgIGludCBuZGltOworICAgIGNoYXIgKmZvcm1hdDsKKyAgICBQeV9zc2l6ZV90ICpzaGFwZTsKKyAgICBQeV9zc2l6ZV90ICpzdHJpZGVzOworICAgIFB5X3NzaXplX3QgKnN1Ym9mZnNldHM7CisgICAgUHlfc3NpemVfdCBzbWFsbHRhYmxlWzJdOyAgLyogc3RhdGljIHN0b3JlIGZvciBzaGFwZSBhbmQgc3RyaWRlcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbm8tZGltZW5zaW9uYWwgYnVmZmVycy4gKi8KKyAgICB2b2lkICppbnRlcm5hbDsKIH0gUHlfYnVmZmVyOwogCiB0eXBlZGVmIGludCAoKmdldGJ1ZmZlcnByb2MpKFB5T2JqZWN0ICosIFB5X2J1ZmZlciAqLCBpbnQpOwogdHlwZWRlZiB2b2lkICgqcmVsZWFzZWJ1ZmZlcnByb2MpKFB5T2JqZWN0ICosIFB5X2J1ZmZlciAqKTsKIAotICAgICAgICAvKiBGbGFncyBmb3IgZ2V0dGluZyBidWZmZXJzICovCisgICAgLyogRmxhZ3MgZm9yIGdldHRpbmcgYnVmZmVycyAqLwogI2RlZmluZSBQeUJVRl9TSU1QTEUgMAogI2RlZmluZSBQeUJVRl9XUklUQUJMRSAweDAwMDEKIC8qICB3ZSB1c2VkIHRvIGluY2x1ZGUgYW4gRSwgYmFja3dhcmRzIGNvbXBhdGlibGUgYWxpYXMgICovCkBAIC0yMTcsODggKzIxNyw4OCBAQAogdHlwZWRlZiBpbnQgKCp0cmF2ZXJzZXByb2MpKFB5T2JqZWN0ICosIHZpc2l0cHJvYywgdm9pZCAqKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCS8qIEZvciBudW1iZXJzIHdpdGhvdXQgZmxhZyBiaXQgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHNldCwgYWxsCi0JICAgYXJndW1lbnRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9mIHRoZSBvYmplY3QncyB0eXBlIChtb2R1bG8KLQkgICBjb2VyY2lvbiBoYWNrcyAtLSBpLmUuIGlmIHRoZSB0eXBlJ3MgY29lcmNpb24gZnVuY3Rpb24KLQkgICByZXR1cm5zIG90aGVyIHR5cGVzLCB0aGVuIHRoZXNlIGFyZSBhbGxvd2VkIGFzIHdlbGwpLiAgTnVtYmVycyB0aGF0Ci0JICAgaGF2ZSB0aGUgUHlfVFBGTEFHU19DSEVDS1RZUEVTIGZsYWcgYml0IHNldCBzaG91bGQgY2hlY2sgKmJvdGgqCi0JICAgYXJndW1lbnRzIGZvciBwcm9wZXIgdHlwZSBhbmQgaW1wbGVtZW50IHRoZSBuZWNlc3NhcnkgY29udmVyc2lvbnMKLQkgICBpbiB0aGUgc2xvdCBmdW5jdGlvbnMgdGhlbXNlbHZlcy4gKi8KKyAgICAvKiBGb3IgbnVtYmVycyB3aXRob3V0IGZsYWcgYml0IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyBzZXQsIGFsbAorICAgICAgIGFyZ3VtZW50cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBvZiB0aGUgb2JqZWN0J3MgdHlwZSAobW9kdWxvCisgICAgICAgY29lcmNpb24gaGFja3MgLS0gaS5lLiBpZiB0aGUgdHlwZSdzIGNvZXJjaW9uIGZ1bmN0aW9uCisgICAgICAgcmV0dXJucyBvdGhlciB0eXBlcywgdGhlbiB0aGVzZSBhcmUgYWxsb3dlZCBhcyB3ZWxsKS4gIE51bWJlcnMgdGhhdAorICAgICAgIGhhdmUgdGhlIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyBmbGFnIGJpdCBzZXQgc2hvdWxkIGNoZWNrICpib3RoKgorICAgICAgIGFyZ3VtZW50cyBmb3IgcHJvcGVyIHR5cGUgYW5kIGltcGxlbWVudCB0aGUgbmVjZXNzYXJ5IGNvbnZlcnNpb25zCisgICAgICAgaW4gdGhlIHNsb3QgZnVuY3Rpb25zIHRoZW1zZWx2ZXMuICovCiAKLQliaW5hcnlmdW5jIG5iX2FkZDsKLQliaW5hcnlmdW5jIG5iX3N1YnRyYWN0OwotCWJpbmFyeWZ1bmMgbmJfbXVsdGlwbHk7Ci0JYmluYXJ5ZnVuYyBuYl9kaXZpZGU7Ci0JYmluYXJ5ZnVuYyBuYl9yZW1haW5kZXI7Ci0JYmluYXJ5ZnVuYyBuYl9kaXZtb2Q7Ci0JdGVybmFyeWZ1bmMgbmJfcG93ZXI7Ci0JdW5hcnlmdW5jIG5iX25lZ2F0aXZlOwotCXVuYXJ5ZnVuYyBuYl9wb3NpdGl2ZTsKLQl1bmFyeWZ1bmMgbmJfYWJzb2x1dGU7Ci0JaW5xdWlyeSBuYl9ub256ZXJvOwotCXVuYXJ5ZnVuYyBuYl9pbnZlcnQ7Ci0JYmluYXJ5ZnVuYyBuYl9sc2hpZnQ7Ci0JYmluYXJ5ZnVuYyBuYl9yc2hpZnQ7Ci0JYmluYXJ5ZnVuYyBuYl9hbmQ7Ci0JYmluYXJ5ZnVuYyBuYl94b3I7Ci0JYmluYXJ5ZnVuYyBuYl9vcjsKLQljb2VyY2lvbiBuYl9jb2VyY2U7Ci0JdW5hcnlmdW5jIG5iX2ludDsKLQl1bmFyeWZ1bmMgbmJfbG9uZzsKLQl1bmFyeWZ1bmMgbmJfZmxvYXQ7Ci0JdW5hcnlmdW5jIG5iX29jdDsKLQl1bmFyeWZ1bmMgbmJfaGV4OwotCS8qIEFkZGVkIGluIHJlbGVhc2UgMi4wICovCi0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2FkZDsKLQliaW5hcnlmdW5jIG5iX2lucGxhY2Vfc3VidHJhY3Q7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX211bHRpcGx5OwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9kaXZpZGU7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3JlbWFpbmRlcjsKLQl0ZXJuYXJ5ZnVuYyBuYl9pbnBsYWNlX3Bvd2VyOwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9sc2hpZnQ7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3JzaGlmdDsKLQliaW5hcnlmdW5jIG5iX2lucGxhY2VfYW5kOwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV94b3I7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX29yOworICAgIGJpbmFyeWZ1bmMgbmJfYWRkOworICAgIGJpbmFyeWZ1bmMgbmJfc3VidHJhY3Q7CisgICAgYmluYXJ5ZnVuYyBuYl9tdWx0aXBseTsKKyAgICBiaW5hcnlmdW5jIG5iX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX3JlbWFpbmRlcjsKKyAgICBiaW5hcnlmdW5jIG5iX2Rpdm1vZDsKKyAgICB0ZXJuYXJ5ZnVuYyBuYl9wb3dlcjsKKyAgICB1bmFyeWZ1bmMgbmJfbmVnYXRpdmU7CisgICAgdW5hcnlmdW5jIG5iX3Bvc2l0aXZlOworICAgIHVuYXJ5ZnVuYyBuYl9hYnNvbHV0ZTsKKyAgICBpbnF1aXJ5IG5iX25vbnplcm87CisgICAgdW5hcnlmdW5jIG5iX2ludmVydDsKKyAgICBiaW5hcnlmdW5jIG5iX2xzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX3JzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX2FuZDsKKyAgICBiaW5hcnlmdW5jIG5iX3hvcjsKKyAgICBiaW5hcnlmdW5jIG5iX29yOworICAgIGNvZXJjaW9uIG5iX2NvZXJjZTsKKyAgICB1bmFyeWZ1bmMgbmJfaW50OworICAgIHVuYXJ5ZnVuYyBuYl9sb25nOworICAgIHVuYXJ5ZnVuYyBuYl9mbG9hdDsKKyAgICB1bmFyeWZ1bmMgbmJfb2N0OworICAgIHVuYXJ5ZnVuYyBuYl9oZXg7CisgICAgLyogQWRkZWQgaW4gcmVsZWFzZSAyLjAgKi8KKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfYWRkOworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9zdWJ0cmFjdDsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfbXVsdGlwbHk7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfcmVtYWluZGVyOworICAgIHRlcm5hcnlmdW5jIG5iX2lucGxhY2VfcG93ZXI7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2xzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfcnNoaWZ0OworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9hbmQ7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3hvcjsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2Vfb3I7CiAKLQkvKiBBZGRlZCBpbiByZWxlYXNlIDIuMiAqLwotCS8qIFRoZSBmb2xsb3dpbmcgcmVxdWlyZSB0aGUgUHlfVFBGTEFHU19IQVZFX0NMQVNTIGZsYWcgKi8KLQliaW5hcnlmdW5jIG5iX2Zsb29yX2RpdmlkZTsKLQliaW5hcnlmdW5jIG5iX3RydWVfZGl2aWRlOwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGU7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3RydWVfZGl2aWRlOworICAgIC8qIEFkZGVkIGluIHJlbGVhc2UgMi4yICovCisgICAgLyogVGhlIGZvbGxvd2luZyByZXF1aXJlIHRoZSBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MgZmxhZyAqLworICAgIGJpbmFyeWZ1bmMgbmJfZmxvb3JfZGl2aWRlOworICAgIGJpbmFyeWZ1bmMgbmJfdHJ1ZV9kaXZpZGU7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGU7CiAKLQkvKiBBZGRlZCBpbiByZWxlYXNlIDIuNSAqLwotCXVuYXJ5ZnVuYyBuYl9pbmRleDsKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuNSAqLworICAgIHVuYXJ5ZnVuYyBuYl9pbmRleDsKIH0gUHlOdW1iZXJNZXRob2RzOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JbGVuZnVuYyBzcV9sZW5ndGg7Ci0JYmluYXJ5ZnVuYyBzcV9jb25jYXQ7Ci0Jc3NpemVhcmdmdW5jIHNxX3JlcGVhdDsKLQlzc2l6ZWFyZ2Z1bmMgc3FfaXRlbTsKLQlzc2l6ZXNzaXplYXJnZnVuYyBzcV9zbGljZTsKLQlzc2l6ZW9iamFyZ3Byb2Mgc3FfYXNzX2l0ZW07Ci0Jc3NpemVzc2l6ZW9iamFyZ3Byb2Mgc3FfYXNzX3NsaWNlOwotCW9iam9ianByb2Mgc3FfY29udGFpbnM7Ci0JLyogQWRkZWQgaW4gcmVsZWFzZSAyLjAgKi8KLQliaW5hcnlmdW5jIHNxX2lucGxhY2VfY29uY2F0OwotCXNzaXplYXJnZnVuYyBzcV9pbnBsYWNlX3JlcGVhdDsKKyAgICBsZW5mdW5jIHNxX2xlbmd0aDsKKyAgICBiaW5hcnlmdW5jIHNxX2NvbmNhdDsKKyAgICBzc2l6ZWFyZ2Z1bmMgc3FfcmVwZWF0OworICAgIHNzaXplYXJnZnVuYyBzcV9pdGVtOworICAgIHNzaXplc3NpemVhcmdmdW5jIHNxX3NsaWNlOworICAgIHNzaXplb2JqYXJncHJvYyBzcV9hc3NfaXRlbTsKKyAgICBzc2l6ZXNzaXplb2JqYXJncHJvYyBzcV9hc3Nfc2xpY2U7CisgICAgb2Jqb2JqcHJvYyBzcV9jb250YWluczsKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuMCAqLworICAgIGJpbmFyeWZ1bmMgc3FfaW5wbGFjZV9jb25jYXQ7CisgICAgc3NpemVhcmdmdW5jIHNxX2lucGxhY2VfcmVwZWF0OwogfSBQeVNlcXVlbmNlTWV0aG9kczsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWxlbmZ1bmMgbXBfbGVuZ3RoOwotCWJpbmFyeWZ1bmMgbXBfc3Vic2NyaXB0OwotCW9iam9iamFyZ3Byb2MgbXBfYXNzX3N1YnNjcmlwdDsKKyAgICBsZW5mdW5jIG1wX2xlbmd0aDsKKyAgICBiaW5hcnlmdW5jIG1wX3N1YnNjcmlwdDsKKyAgICBvYmpvYmphcmdwcm9jIG1wX2Fzc19zdWJzY3JpcHQ7CiB9IFB5TWFwcGluZ01ldGhvZHM7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlyZWFkYnVmZmVycHJvYyBiZl9nZXRyZWFkYnVmZmVyOwotCXdyaXRlYnVmZmVycHJvYyBiZl9nZXR3cml0ZWJ1ZmZlcjsKLQlzZWdjb3VudHByb2MgYmZfZ2V0c2VnY291bnQ7Ci0JY2hhcmJ1ZmZlcnByb2MgYmZfZ2V0Y2hhcmJ1ZmZlcjsKLSAgICAgICAgZ2V0YnVmZmVycHJvYyBiZl9nZXRidWZmZXI7Ci0JcmVsZWFzZWJ1ZmZlcnByb2MgYmZfcmVsZWFzZWJ1ZmZlcjsKKyAgICByZWFkYnVmZmVycHJvYyBiZl9nZXRyZWFkYnVmZmVyOworICAgIHdyaXRlYnVmZmVycHJvYyBiZl9nZXR3cml0ZWJ1ZmZlcjsKKyAgICBzZWdjb3VudHByb2MgYmZfZ2V0c2VnY291bnQ7CisgICAgY2hhcmJ1ZmZlcnByb2MgYmZfZ2V0Y2hhcmJ1ZmZlcjsKKyAgICBnZXRidWZmZXJwcm9jIGJmX2dldGJ1ZmZlcjsKKyAgICByZWxlYXNlYnVmZmVycHJvYyBiZl9yZWxlYXNlYnVmZmVyOwogfSBQeUJ1ZmZlclByb2NzOwogCiAKQEAgLTMyMiwxMTAgKzMyMiwxMTAgQEAKIHR5cGVkZWYgUHlPYmplY3QgKigqYWxsb2NmdW5jKShzdHJ1Y3QgX3R5cGVvYmplY3QgKiwgUHlfc3NpemVfdCk7CiAKIHR5cGVkZWYgc3RydWN0IF90eXBlb2JqZWN0IHsKLQlQeU9iamVjdF9WQVJfSEVBRAotCWNvbnN0IGNoYXIgKnRwX25hbWU7IC8qIEZvciBwcmludGluZywgaW4gZm9ybWF0ICI8bW9kdWxlPi48bmFtZT4iICovCi0JUHlfc3NpemVfdCB0cF9iYXNpY3NpemUsIHRwX2l0ZW1zaXplOyAvKiBGb3IgYWxsb2NhdGlvbiAqLworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgY29uc3QgY2hhciAqdHBfbmFtZTsgLyogRm9yIHByaW50aW5nLCBpbiBmb3JtYXQgIjxtb2R1bGU+LjxuYW1lPiIgKi8KKyAgICBQeV9zc2l6ZV90IHRwX2Jhc2ljc2l6ZSwgdHBfaXRlbXNpemU7IC8qIEZvciBhbGxvY2F0aW9uICovCiAKLQkvKiBNZXRob2RzIHRvIGltcGxlbWVudCBzdGFuZGFyZCBvcGVyYXRpb25zICovCisgICAgLyogTWV0aG9kcyB0byBpbXBsZW1lbnQgc3RhbmRhcmQgb3BlcmF0aW9ucyAqLwogCi0JZGVzdHJ1Y3RvciB0cF9kZWFsbG9jOwotCXByaW50ZnVuYyB0cF9wcmludDsKLQlnZXRhdHRyZnVuYyB0cF9nZXRhdHRyOwotCXNldGF0dHJmdW5jIHRwX3NldGF0dHI7Ci0JY21wZnVuYyB0cF9jb21wYXJlOwotCXJlcHJmdW5jIHRwX3JlcHI7CisgICAgZGVzdHJ1Y3RvciB0cF9kZWFsbG9jOworICAgIHByaW50ZnVuYyB0cF9wcmludDsKKyAgICBnZXRhdHRyZnVuYyB0cF9nZXRhdHRyOworICAgIHNldGF0dHJmdW5jIHRwX3NldGF0dHI7CisgICAgY21wZnVuYyB0cF9jb21wYXJlOworICAgIHJlcHJmdW5jIHRwX3JlcHI7CiAKLQkvKiBNZXRob2Qgc3VpdGVzIGZvciBzdGFuZGFyZCBjbGFzc2VzICovCisgICAgLyogTWV0aG9kIHN1aXRlcyBmb3Igc3RhbmRhcmQgY2xhc3NlcyAqLwogCi0JUHlOdW1iZXJNZXRob2RzICp0cF9hc19udW1iZXI7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKnRwX2FzX3NlcXVlbmNlOwotCVB5TWFwcGluZ01ldGhvZHMgKnRwX2FzX21hcHBpbmc7CisgICAgUHlOdW1iZXJNZXRob2RzICp0cF9hc19udW1iZXI7CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKnRwX2FzX3NlcXVlbmNlOworICAgIFB5TWFwcGluZ01ldGhvZHMgKnRwX2FzX21hcHBpbmc7CiAKLQkvKiBNb3JlIHN0YW5kYXJkIG9wZXJhdGlvbnMgKGhlcmUgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5KSAqLworICAgIC8qIE1vcmUgc3RhbmRhcmQgb3BlcmF0aW9ucyAoaGVyZSBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkpICovCiAKLQloYXNoZnVuYyB0cF9oYXNoOwotCXRlcm5hcnlmdW5jIHRwX2NhbGw7Ci0JcmVwcmZ1bmMgdHBfc3RyOwotCWdldGF0dHJvZnVuYyB0cF9nZXRhdHRybzsKLQlzZXRhdHRyb2Z1bmMgdHBfc2V0YXR0cm87CisgICAgaGFzaGZ1bmMgdHBfaGFzaDsKKyAgICB0ZXJuYXJ5ZnVuYyB0cF9jYWxsOworICAgIHJlcHJmdW5jIHRwX3N0cjsKKyAgICBnZXRhdHRyb2Z1bmMgdHBfZ2V0YXR0cm87CisgICAgc2V0YXR0cm9mdW5jIHRwX3NldGF0dHJvOwogCi0JLyogRnVuY3Rpb25zIHRvIGFjY2VzcyBvYmplY3QgYXMgaW5wdXQvb3V0cHV0IGJ1ZmZlciAqLwotCVB5QnVmZmVyUHJvY3MgKnRwX2FzX2J1ZmZlcjsKKyAgICAvKiBGdW5jdGlvbnMgdG8gYWNjZXNzIG9iamVjdCBhcyBpbnB1dC9vdXRwdXQgYnVmZmVyICovCisgICAgUHlCdWZmZXJQcm9jcyAqdHBfYXNfYnVmZmVyOwogCi0JLyogRmxhZ3MgdG8gZGVmaW5lIHByZXNlbmNlIG9mIG9wdGlvbmFsL2V4cGFuZGVkIGZlYXR1cmVzICovCi0JbG9uZyB0cF9mbGFnczsKKyAgICAvKiBGbGFncyB0byBkZWZpbmUgcHJlc2VuY2Ugb2Ygb3B0aW9uYWwvZXhwYW5kZWQgZmVhdHVyZXMgKi8KKyAgICBsb25nIHRwX2ZsYWdzOwogCi0JY29uc3QgY2hhciAqdHBfZG9jOyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKnRwX2RvYzsgLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KIAotCS8qIEFzc2lnbmVkIG1lYW5pbmcgaW4gcmVsZWFzZSAyLjAgKi8KLQkvKiBjYWxsIGZ1bmN0aW9uIGZvciBhbGwgYWNjZXNzaWJsZSBvYmplY3RzICovCi0JdHJhdmVyc2Vwcm9jIHRwX3RyYXZlcnNlOworICAgIC8qIEFzc2lnbmVkIG1lYW5pbmcgaW4gcmVsZWFzZSAyLjAgKi8KKyAgICAvKiBjYWxsIGZ1bmN0aW9uIGZvciBhbGwgYWNjZXNzaWJsZSBvYmplY3RzICovCisgICAgdHJhdmVyc2Vwcm9jIHRwX3RyYXZlcnNlOwogCi0JLyogZGVsZXRlIHJlZmVyZW5jZXMgdG8gY29udGFpbmVkIG9iamVjdHMgKi8KLQlpbnF1aXJ5IHRwX2NsZWFyOworICAgIC8qIGRlbGV0ZSByZWZlcmVuY2VzIHRvIGNvbnRhaW5lZCBvYmplY3RzICovCisgICAgaW5xdWlyeSB0cF9jbGVhcjsKIAotCS8qIEFzc2lnbmVkIG1lYW5pbmcgaW4gcmVsZWFzZSAyLjEgKi8KLQkvKiByaWNoIGNvbXBhcmlzb25zICovCi0JcmljaGNtcGZ1bmMgdHBfcmljaGNvbXBhcmU7CisgICAgLyogQXNzaWduZWQgbWVhbmluZyBpbiByZWxlYXNlIDIuMSAqLworICAgIC8qIHJpY2ggY29tcGFyaXNvbnMgKi8KKyAgICByaWNoY21wZnVuYyB0cF9yaWNoY29tcGFyZTsKIAotCS8qIHdlYWsgcmVmZXJlbmNlIGVuYWJsZXIgKi8KLQlQeV9zc2l6ZV90IHRwX3dlYWtsaXN0b2Zmc2V0OworICAgIC8qIHdlYWsgcmVmZXJlbmNlIGVuYWJsZXIgKi8KKyAgICBQeV9zc2l6ZV90IHRwX3dlYWtsaXN0b2Zmc2V0OwogCi0JLyogQWRkZWQgaW4gcmVsZWFzZSAyLjIgKi8KLQkvKiBJdGVyYXRvcnMgKi8KLQlnZXRpdGVyZnVuYyB0cF9pdGVyOwotCWl0ZXJuZXh0ZnVuYyB0cF9pdGVybmV4dDsKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuMiAqLworICAgIC8qIEl0ZXJhdG9ycyAqLworICAgIGdldGl0ZXJmdW5jIHRwX2l0ZXI7CisgICAgaXRlcm5leHRmdW5jIHRwX2l0ZXJuZXh0OwogCi0JLyogQXR0cmlidXRlIGRlc2NyaXB0b3IgYW5kIHN1YmNsYXNzaW5nIHN0dWZmICovCi0Jc3RydWN0IFB5TWV0aG9kRGVmICp0cF9tZXRob2RzOwotCXN0cnVjdCBQeU1lbWJlckRlZiAqdHBfbWVtYmVyczsKLQlzdHJ1Y3QgUHlHZXRTZXREZWYgKnRwX2dldHNldDsKLQlzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX2Jhc2U7Ci0JUHlPYmplY3QgKnRwX2RpY3Q7Ci0JZGVzY3JnZXRmdW5jIHRwX2Rlc2NyX2dldDsKLQlkZXNjcnNldGZ1bmMgdHBfZGVzY3Jfc2V0OwotCVB5X3NzaXplX3QgdHBfZGljdG9mZnNldDsKLQlpbml0cHJvYyB0cF9pbml0OwotCWFsbG9jZnVuYyB0cF9hbGxvYzsKLQluZXdmdW5jIHRwX25ldzsKLQlmcmVlZnVuYyB0cF9mcmVlOyAvKiBMb3ctbGV2ZWwgZnJlZS1tZW1vcnkgcm91dGluZSAqLwotCWlucXVpcnkgdHBfaXNfZ2M7IC8qIEZvciBQeU9iamVjdF9JU19HQyAqLwotCVB5T2JqZWN0ICp0cF9iYXNlczsKLQlQeU9iamVjdCAqdHBfbXJvOyAvKiBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciAqLwotCVB5T2JqZWN0ICp0cF9jYWNoZTsKLQlQeU9iamVjdCAqdHBfc3ViY2xhc3NlczsKLQlQeU9iamVjdCAqdHBfd2Vha2xpc3Q7Ci0JZGVzdHJ1Y3RvciB0cF9kZWw7CisgICAgLyogQXR0cmlidXRlIGRlc2NyaXB0b3IgYW5kIHN1YmNsYXNzaW5nIHN0dWZmICovCisgICAgc3RydWN0IFB5TWV0aG9kRGVmICp0cF9tZXRob2RzOworICAgIHN0cnVjdCBQeU1lbWJlckRlZiAqdHBfbWVtYmVyczsKKyAgICBzdHJ1Y3QgUHlHZXRTZXREZWYgKnRwX2dldHNldDsKKyAgICBzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX2Jhc2U7CisgICAgUHlPYmplY3QgKnRwX2RpY3Q7CisgICAgZGVzY3JnZXRmdW5jIHRwX2Rlc2NyX2dldDsKKyAgICBkZXNjcnNldGZ1bmMgdHBfZGVzY3Jfc2V0OworICAgIFB5X3NzaXplX3QgdHBfZGljdG9mZnNldDsKKyAgICBpbml0cHJvYyB0cF9pbml0OworICAgIGFsbG9jZnVuYyB0cF9hbGxvYzsKKyAgICBuZXdmdW5jIHRwX25ldzsKKyAgICBmcmVlZnVuYyB0cF9mcmVlOyAvKiBMb3ctbGV2ZWwgZnJlZS1tZW1vcnkgcm91dGluZSAqLworICAgIGlucXVpcnkgdHBfaXNfZ2M7IC8qIEZvciBQeU9iamVjdF9JU19HQyAqLworICAgIFB5T2JqZWN0ICp0cF9iYXNlczsKKyAgICBQeU9iamVjdCAqdHBfbXJvOyAvKiBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciAqLworICAgIFB5T2JqZWN0ICp0cF9jYWNoZTsKKyAgICBQeU9iamVjdCAqdHBfc3ViY2xhc3NlczsKKyAgICBQeU9iamVjdCAqdHBfd2Vha2xpc3Q7CisgICAgZGVzdHJ1Y3RvciB0cF9kZWw7CiAKLQkvKiBUeXBlIGF0dHJpYnV0ZSBjYWNoZSB2ZXJzaW9uIHRhZy4gQWRkZWQgaW4gdmVyc2lvbiAyLjYgKi8KLQl1bnNpZ25lZCBpbnQgdHBfdmVyc2lvbl90YWc7CisgICAgLyogVHlwZSBhdHRyaWJ1dGUgY2FjaGUgdmVyc2lvbiB0YWcuIEFkZGVkIGluIHZlcnNpb24gMi42ICovCisgICAgdW5zaWduZWQgaW50IHRwX3ZlcnNpb25fdGFnOwogCiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JLyogdGhlc2UgbXVzdCBiZSBsYXN0IGFuZCBuZXZlciBleHBsaWNpdGx5IGluaXRpYWxpemVkICovCi0JUHlfc3NpemVfdCB0cF9hbGxvY3M7Ci0JUHlfc3NpemVfdCB0cF9mcmVlczsKLQlQeV9zc2l6ZV90IHRwX21heGFsbG9jOwotCXN0cnVjdCBfdHlwZW9iamVjdCAqdHBfcHJldjsKLQlzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX25leHQ7CisgICAgLyogdGhlc2UgbXVzdCBiZSBsYXN0IGFuZCBuZXZlciBleHBsaWNpdGx5IGluaXRpYWxpemVkICovCisgICAgUHlfc3NpemVfdCB0cF9hbGxvY3M7CisgICAgUHlfc3NpemVfdCB0cF9mcmVlczsKKyAgICBQeV9zc2l6ZV90IHRwX21heGFsbG9jOworICAgIHN0cnVjdCBfdHlwZW9iamVjdCAqdHBfcHJldjsKKyAgICBzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX25leHQ7CiAjZW5kaWYKIH0gUHlUeXBlT2JqZWN0OwogCiAKIC8qIFRoZSAqcmVhbCogbGF5b3V0IG9mIGEgdHlwZSBvYmplY3Qgd2hlbiBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgKi8KIHR5cGVkZWYgc3RydWN0IF9oZWFwdHlwZW9iamVjdCB7Ci0JLyogTm90ZTogdGhlcmUncyBhIGRlcGVuZGVuY3kgb24gdGhlIG9yZGVyIG9mIHRoZXNlIG1lbWJlcnMKLQkgICBpbiBzbG90cHRyKCkgaW4gdHlwZW9iamVjdC5jIC4gKi8KLQlQeVR5cGVPYmplY3QgaHRfdHlwZTsKLQlQeU51bWJlck1ldGhvZHMgYXNfbnVtYmVyOwotCVB5TWFwcGluZ01ldGhvZHMgYXNfbWFwcGluZzsKLQlQeVNlcXVlbmNlTWV0aG9kcyBhc19zZXF1ZW5jZTsgLyogYXNfc2VxdWVuY2UgY29tZXMgYWZ0ZXIgYXNfbWFwcGluZywKLQkJCQkJICBzbyB0aGF0IHRoZSBtYXBwaW5nIHdpbnMgd2hlbiBib3RoCi0JCQkJCSAgdGhlIG1hcHBpbmcgYW5kIHRoZSBzZXF1ZW5jZSBkZWZpbmUKLQkJCQkJICBhIGdpdmVuIG9wZXJhdG9yIChlLmcuIF9fZ2V0aXRlbV9fKS4KLQkJCQkJICBzZWUgYWRkX29wZXJhdG9ycygpIGluIHR5cGVvYmplY3QuYyAuICovCi0JUHlCdWZmZXJQcm9jcyBhc19idWZmZXI7Ci0JUHlPYmplY3QgKmh0X25hbWUsICpodF9zbG90czsKLQkvKiBoZXJlIGFyZSBvcHRpb25hbCB1c2VyIHNsb3RzLCBmb2xsb3dlZCBieSB0aGUgbWVtYmVycy4gKi8KKyAgICAvKiBOb3RlOiB0aGVyZSdzIGEgZGVwZW5kZW5jeSBvbiB0aGUgb3JkZXIgb2YgdGhlc2UgbWVtYmVycworICAgICAgIGluIHNsb3RwdHIoKSBpbiB0eXBlb2JqZWN0LmMgLiAqLworICAgIFB5VHlwZU9iamVjdCBodF90eXBlOworICAgIFB5TnVtYmVyTWV0aG9kcyBhc19udW1iZXI7CisgICAgUHlNYXBwaW5nTWV0aG9kcyBhc19tYXBwaW5nOworICAgIFB5U2VxdWVuY2VNZXRob2RzIGFzX3NlcXVlbmNlOyAvKiBhc19zZXF1ZW5jZSBjb21lcyBhZnRlciBhc19tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IHRoZSBtYXBwaW5nIHdpbnMgd2hlbiBib3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXBwaW5nIGFuZCB0aGUgc2VxdWVuY2UgZGVmaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgZ2l2ZW4gb3BlcmF0b3IgKGUuZy4gX19nZXRpdGVtX18pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgYWRkX29wZXJhdG9ycygpIGluIHR5cGVvYmplY3QuYyAuICovCisgICAgUHlCdWZmZXJQcm9jcyBhc19idWZmZXI7CisgICAgUHlPYmplY3QgKmh0X25hbWUsICpodF9zbG90czsKKyAgICAvKiBoZXJlIGFyZSBvcHRpb25hbCB1c2VyIHNsb3RzLCBmb2xsb3dlZCBieSB0aGUgbWVtYmVycy4gKi8KIH0gUHlIZWFwVHlwZU9iamVjdDsKIAogLyogYWNjZXNzIG1hY3JvIHRvIHRoZSBtZW1iZXJzIHdoaWNoIGFyZSBmbG9hdGluZyAiYmVoaW5kIiB0aGUgb2JqZWN0ICovCkBAIC00MzYsMjAgKzQzNiwyMCBAQAogLyogR2VuZXJpYyB0eXBlIGNoZWNrICovCiBQeUFQSV9GVU5DKGludCkgUHlUeXBlX0lzU3VidHlwZShQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwogI2RlZmluZSBQeU9iamVjdF9UeXBlQ2hlY2sob2IsIHRwKSBcCi0JKFB5X1RZUEUob2IpID09ICh0cCkgfHwgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgKHRwKSkpCisgICAgKFB5X1RZUEUob2IpID09ICh0cCkgfHwgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgKHRwKSkpCiAKIFB5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVR5cGVfVHlwZTsgLyogYnVpbHQtaW4gJ3R5cGUnICovCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlCYXNlT2JqZWN0X1R5cGU7IC8qIGJ1aWx0LWluICdvYmplY3QnICovCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTdXBlcl9UeXBlOyAvKiBidWlsdC1pbiAnc3VwZXInICovCiAKICNkZWZpbmUgUHlUeXBlX0NoZWNrKG9wKSBcCi0JUHlUeXBlX0Zhc3RTdWJjbGFzcyhQeV9UWVBFKG9wKSwgUHlfVFBGTEFHU19UWVBFX1NVQkNMQVNTKQorICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoUHlfVFlQRShvcCksIFB5X1RQRkxBR1NfVFlQRV9TVUJDTEFTUykKICNkZWZpbmUgUHlUeXBlX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlUeXBlX1R5cGUpCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVR5cGVfUmVhZHkoUHlUeXBlT2JqZWN0ICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVR5cGVfR2VuZXJpY0FsbG9jKFB5VHlwZU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlUeXBlX0dlbmVyaWNOZXcoUHlUeXBlT2JqZWN0ICosCi0JCQkJCSAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVR5cGVfTG9va3VwKFB5VHlwZU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X0xvb2t1cFNwZWNpYWwoUHlPYmplY3QgKiwgY2hhciAqLCBQeU9iamVjdCAqKik7CiBQeUFQSV9GVU5DKHVuc2lnbmVkIGludCkgUHlUeXBlX0NsZWFyQ2FjaGUodm9pZCk7CkBAIC00NzksNyArNDc5LDcgQEAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X05leHROb3RJbXBsZW1lbnRlZChQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoUHlPYmplY3QgKiwKLQkJCQkJICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKGxvbmcpIFB5T2JqZWN0X0hhc2goUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKGxvbmcpIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZChQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Jc1RydWUoUHlPYmplY3QgKik7CkBAIC01MTQsNyArNTE0LDcgQEAKICNkZWZpbmUgUHlPYmplY3RfUkVQUihvYmopIFB5U3RyaW5nX0FTX1NUUklORyhQeU9iamVjdF9SZXByKG9iaikpCiAKIC8qIEZsYWcgYml0cyBmb3IgcHJpbnRpbmc6ICovCi0jZGVmaW5lIFB5X1BSSU5UX1JBVwkxCS8qIE5vIHN0cmluZyBxdW90ZXMgZXRjLiAqLworI2RlZmluZSBQeV9QUklOVF9SQVcgICAgMSAgICAgICAvKiBObyBzdHJpbmcgcXVvdGVzIGV0Yy4gKi8KIAogLyoKIGBUeXBlIGZsYWdzICh0cF9mbGFncykKQEAgLTYwNywyOSArNjA3LDI5IEBACiAjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgKDFMPDwyMSkKIAogLyogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgdHlwZSBpcyBhIHN1YmNsYXNzLiAqLwotI2RlZmluZSBQeV9UUEZMQUdTX0lOVF9TVUJDTEFTUwkJKDFMPDwyMykKLSNkZWZpbmUgUHlfVFBGTEFHU19MT05HX1NVQkNMQVNTCSgxTDw8MjQpCi0jZGVmaW5lIFB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUwkoMUw8PDI1KQotI2RlZmluZSBQeV9UUEZMQUdTX1RVUExFX1NVQkNMQVNTCSgxTDw8MjYpCi0jZGVmaW5lIFB5X1RQRkxBR1NfU1RSSU5HX1NVQkNMQVNTCSgxTDw8MjcpCi0jZGVmaW5lIFB5X1RQRkxBR1NfVU5JQ09ERV9TVUJDTEFTUwkoMUw8PDI4KQotI2RlZmluZSBQeV9UUEZMQUdTX0RJQ1RfU1VCQ0xBU1MJKDFMPDwyOSkKLSNkZWZpbmUgUHlfVFBGTEFHU19CQVNFX0VYQ19TVUJDTEFTUwkoMUw8PDMwKQotI2RlZmluZSBQeV9UUEZMQUdTX1RZUEVfU1VCQ0xBU1MJKDFMPDwzMSkKKyNkZWZpbmUgUHlfVFBGTEFHU19JTlRfU1VCQ0xBU1MgICAgICAgICAoMUw8PDIzKQorI2RlZmluZSBQeV9UUEZMQUdTX0xPTkdfU1VCQ0xBU1MgICAgICAgICgxTDw8MjQpCisjZGVmaW5lIFB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUyAgICAgICAgKDFMPDwyNSkKKyNkZWZpbmUgUHlfVFBGTEFHU19UVVBMRV9TVUJDTEFTUyAgICAgICAoMUw8PDI2KQorI2RlZmluZSBQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUyAgICAgICgxTDw8MjcpCisjZGVmaW5lIFB5X1RQRkxBR1NfVU5JQ09ERV9TVUJDTEFTUyAgICAgKDFMPDwyOCkKKyNkZWZpbmUgUHlfVFBGTEFHU19ESUNUX1NVQkNMQVNTICAgICAgICAoMUw8PDI5KQorI2RlZmluZSBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTICAgICgxTDw8MzApCisjZGVmaW5lIFB5X1RQRkxBR1NfVFlQRV9TVUJDTEFTUyAgICAgICAgKDFMPDwzMSkKIAogI2RlZmluZSBQeV9UUEZMQUdTX0RFRkFVTFRfRVhURVJOQUwgKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfU0VRVUVOQ0VfSU4gfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkUgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0lURVIgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9DTEFTUyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1NUQUNLTEVTU19FWFRFTlNJT04gfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9JTkRFWCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVIgfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTiB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFMgfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRSB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfSVRFUiB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0NMQVNTIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfU1RBQ0tMRVNTX0VYVEVOU0lPTiB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0lOREVYIHwgXAorICAgICAgICAgICAgICAgICAwKQogI2RlZmluZSBQeV9UUEZMQUdTX0RFRkFVTFRfQ09SRSAoUHlfVFBGTEFHU19ERUZBVUxUX0VYVEVSTkFMIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKQorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUcpCiAKICNpZmRlZiBQeV9CVUlMRF9DT1JFCiAjZGVmaW5lIFB5X1RQRkxBR1NfREVGQVVMVCBQeV9UUEZMQUdTX0RFRkFVTFRfQ09SRQpAQCAtNjg3LDMyICs2ODcsMzIgQEAKICNpZmRlZiBQeV9SRUZfREVCVUcKIFB5QVBJX0RBVEEoUHlfc3NpemVfdCkgX1B5X1JlZlRvdGFsOwogUHlBUElfRlVOQyh2b2lkKSBfUHlfTmVnYXRpdmVSZWZjb3VudChjb25zdCBjaGFyICpmbmFtZSwKLQkJCQkJICAgIGludCBsaW5lbm8sIFB5T2JqZWN0ICpvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lbm8sIFB5T2JqZWN0ICpvcCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeURpY3RfRHVtbXkodm9pZCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVNldF9EdW1teSh2b2lkKTsKIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5X0dldFJlZlRvdGFsKHZvaWQpOwotI2RlZmluZSBfUHlfSU5DX1JFRlRPVEFMCV9QeV9SZWZUb3RhbCsrCi0jZGVmaW5lIF9QeV9ERUNfUkVGVE9UQUwJX1B5X1JlZlRvdGFsLS0KLSNkZWZpbmUgX1B5X1JFRl9ERUJVR19DT01NQQksCi0jZGVmaW5lIF9QeV9DSEVDS19SRUZDTlQoT1ApCQkJCQlcCi17CWlmICgoKFB5T2JqZWN0KilPUCktPm9iX3JlZmNudCA8IDApCQkJCVwKLQkJX1B5X05lZ2F0aXZlUmVmY291bnQoX19GSUxFX18sIF9fTElORV9fLAlcCi0JCQkJICAgICAoUHlPYmplY3QgKikoT1ApKTsJCVwKKyNkZWZpbmUgX1B5X0lOQ19SRUZUT1RBTCAgICAgICAgX1B5X1JlZlRvdGFsKysKKyNkZWZpbmUgX1B5X0RFQ19SRUZUT1RBTCAgICAgICAgX1B5X1JlZlRvdGFsLS0KKyNkZWZpbmUgX1B5X1JFRl9ERUJVR19DT01NQSAgICAgLAorI2RlZmluZSBfUHlfQ0hFQ0tfUkVGQ05UKE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgaWYgKCgoUHlPYmplY3QqKU9QKS0+b2JfcmVmY250IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfUHlfTmVnYXRpdmVSZWZjb3VudChfX0ZJTEVfXywgX19MSU5FX18sICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopKE9QKSk7ICAgICAgICAgXAogfQogI2Vsc2UKICNkZWZpbmUgX1B5X0lOQ19SRUZUT1RBTAogI2RlZmluZSBfUHlfREVDX1JFRlRPVEFMCiAjZGVmaW5lIF9QeV9SRUZfREVCVUdfQ09NTUEKLSNkZWZpbmUgX1B5X0NIRUNLX1JFRkNOVChPUCkJLyogYSBzZW1pY29sb24gKi87CisjZGVmaW5lIF9QeV9DSEVDS19SRUZDTlQoT1ApICAgIC8qIGEgc2VtaWNvbG9uICovOwogI2VuZGlmIC8qIFB5X1JFRl9ERUJVRyAqLwogCiAjaWZkZWYgQ09VTlRfQUxMT0NTCiBQeUFQSV9GVU5DKHZvaWQpIGluY19jb3VudChQeVR5cGVPYmplY3QgKik7CiBQeUFQSV9GVU5DKHZvaWQpIGRlY19jb3VudChQeVR5cGVPYmplY3QgKik7Ci0jZGVmaW5lIF9QeV9JTkNfVFBBTExPQ1MoT1ApCWluY19jb3VudChQeV9UWVBFKE9QKSkKLSNkZWZpbmUgX1B5X0lOQ19UUEZSRUVTKE9QKQlkZWNfY291bnQoUHlfVFlQRShPUCkpCi0jZGVmaW5lIF9QeV9ERUNfVFBGUkVFUyhPUCkJUHlfVFlQRShPUCktPnRwX2ZyZWVzLS0KLSNkZWZpbmUgX1B5X0NPVU5UX0FMTE9DU19DT01NQQksCisjZGVmaW5lIF9QeV9JTkNfVFBBTExPQ1MoT1ApICAgIGluY19jb3VudChQeV9UWVBFKE9QKSkKKyNkZWZpbmUgX1B5X0lOQ19UUEZSRUVTKE9QKSAgICAgZGVjX2NvdW50KFB5X1RZUEUoT1ApKQorI2RlZmluZSBfUHlfREVDX1RQRlJFRVMoT1ApICAgICBQeV9UWVBFKE9QKS0+dHBfZnJlZXMtLQorI2RlZmluZSBfUHlfQ09VTlRfQUxMT0NTX0NPTU1BICAsCiAjZWxzZQogI2RlZmluZSBfUHlfSU5DX1RQQUxMT0NTKE9QKQogI2RlZmluZSBfUHlfSU5DX1RQRlJFRVMoT1ApCkBAIC03MzMsMzAgKzczMywzMCBAQAogLyogV2l0aG91dCBQeV9UUkFDRV9SRUZTLCB0aGVyZSdzIGxpdHRsZSBlbm91Z2ggdG8gZG8gdGhhdCB3ZSBleHBhbmQgY29kZQogICogaW5saW5lLgogICovCi0jZGVmaW5lIF9QeV9OZXdSZWZlcmVuY2Uob3ApICgJCQkJXAotCV9QeV9JTkNfVFBBTExPQ1Mob3ApIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEJXAotCV9QeV9JTkNfUkVGVE9UQUwgIF9QeV9SRUZfREVCVUdfQ09NTUEJCVwKLQlQeV9SRUZDTlQob3ApID0gMSkKKyNkZWZpbmUgX1B5X05ld1JlZmVyZW5jZShvcCkgKCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9QeV9JTkNfVFBBTExPQ1Mob3ApIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEgICAgICAgICBcCisgICAgX1B5X0lOQ19SRUZUT1RBTCAgX1B5X1JFRl9ERUJVR19DT01NQSAgICAgICAgICAgICAgIFwKKyAgICBQeV9SRUZDTlQob3ApID0gMSkKIAogI2RlZmluZSBfUHlfRm9yZ2V0UmVmZXJlbmNlKG9wKSBfUHlfSU5DX1RQRlJFRVMob3ApCiAKLSNkZWZpbmUgX1B5X0RlYWxsb2Mob3ApICgJCQkJXAotCV9QeV9JTkNfVFBGUkVFUyhvcCkgX1B5X0NPVU5UX0FMTE9DU19DT01NQQlcCi0JKCpQeV9UWVBFKG9wKS0+dHBfZGVhbGxvYykoKFB5T2JqZWN0ICopKG9wKSkpCisjZGVmaW5lIF9QeV9EZWFsbG9jKG9wKSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfUHlfSU5DX1RQRlJFRVMob3ApIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEgICAgICAgICAgXAorICAgICgqUHlfVFlQRShvcCktPnRwX2RlYWxsb2MpKChQeU9iamVjdCAqKShvcCkpKQogI2VuZGlmIC8qICFQeV9UUkFDRV9SRUZTICovCiAKLSNkZWZpbmUgUHlfSU5DUkVGKG9wKSAoCQkJCVwKLQlfUHlfSU5DX1JFRlRPVEFMICBfUHlfUkVGX0RFQlVHX0NPTU1BCVwKLQkoKFB5T2JqZWN0Kikob3ApKS0+b2JfcmVmY250KyspCisjZGVmaW5lIFB5X0lOQ1JFRihvcCkgKCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1B5X0lOQ19SRUZUT1RBTCAgX1B5X1JFRl9ERUJVR19DT01NQSAgICAgICBcCisgICAgKChQeU9iamVjdCopKG9wKSktPm9iX3JlZmNudCsrKQogCi0jZGVmaW5lIFB5X0RFQ1JFRihvcCkJCQkJCVwKLQlkbyB7CQkJCQkJXAotCSAgICBpZiAoX1B5X0RFQ19SRUZUT1RBTCAgX1B5X1JFRl9ERUJVR19DT01NQQlcCi0JCS0tKChQeU9iamVjdCopKG9wKSktPm9iX3JlZmNudCAhPSAwKQlcCi0JCSAgICBfUHlfQ0hFQ0tfUkVGQ05UKG9wKQkJXAotCSAgICBlbHNlCQkJCQlcCi0JCV9QeV9EZWFsbG9jKChQeU9iamVjdCAqKShvcCkpOwkJXAotICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBQeV9ERUNSRUYob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKF9QeV9ERUNfUkVGVE9UQUwgIF9QeV9SRUZfREVCVUdfQ09NTUEgICAgICAgXAorICAgICAgICAtLSgoUHlPYmplY3QqKShvcCkpLT5vYl9yZWZjbnQgIT0gMCkgICAgICAgICAgICBcCisgICAgICAgICAgICBfUHlfQ0hFQ0tfUkVGQ05UKG9wKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfUHlfRGVhbGxvYygoUHlPYmplY3QgKikob3ApKTsgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKIAogLyogU2FmZWx5IGRlY3JlZiBgb3BgIGFuZCBzZXQgYG9wYCB0byBOVUxMLCBlc3BlY2lhbGx5IHVzZWZ1bCBpbiB0cF9jbGVhcgogICogYW5kIHRwX2RlYWxsb2MgaW1wbGVtZW50YXRvbnMuCkBAIC03OTIsMTQgKzc5MiwxNCBAQAogICogUHl0aG9uIGludGVnZXJzIGFyZW4ndCBjdXJyZW50bHkgd2Vha2x5IHJlZmVyZW5jYWJsZS4gIEJlc3QgcHJhY3RpY2UgaXMKICAqIHRvIHVzZSBQeV9DTEVBUigpIGV2ZW4gaWYgeW91IGNhbid0IHRoaW5rIG9mIGEgcmVhc29uIGZvciB3aHkgeW91IG5lZWQgdG8uCiAgKi8KLSNkZWZpbmUgUHlfQ0xFQVIob3ApCQkJCVwKLSAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICAgICAgICAgICAgICAgIGlmIChvcCkgewkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpfcHlfdG1wID0gKFB5T2JqZWN0ICopKG9wKTsJXAotICAgICAgICAgICAgICAgICAgICAgICAgKG9wKSA9IE5VTEw7CQlcCi0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoX3B5X3RtcCk7CVwKLSAgICAgICAgICAgICAgICB9CQkJCVwKLSAgICAgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUHlfQ0xFQVIob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5T2JqZWN0ICpfcHlfdG1wID0gKFB5T2JqZWN0ICopKG9wKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAob3ApID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeV9ERUNSRUYoX3B5X3RtcCk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKIAogLyogTWFjcm9zIHRvIHVzZSBpbiBjYXNlIHRoZSBvYmplY3QgcG9pbnRlciBtYXkgYmUgTlVMTDogKi8KICNkZWZpbmUgUHlfWElOQ1JFRihvcCkgZG8geyBpZiAoKG9wKSA9PSBOVUxMKSA7IGVsc2UgUHlfSU5DUkVGKG9wKTsgfSB3aGlsZSAoMCkKQEAgLTkyNiwxMyArOTI2LDEzIEBACiBzdGF0aWMgdm9pZAogbXl0eXBlX2RlYWxsb2MobXl0eXBlICpwKQogewotICAgICAgICAuLi4gZGVjbGFyYXRpb25zIGdvIGhlcmUgLi4uCisgICAgLi4uIGRlY2xhcmF0aW9ucyBnbyBoZXJlIC4uLgogCi0gCVB5T2JqZWN0X0dDX1VuVHJhY2socCk7CSAgIC8vIG11c3QgdW50cmFjayBmaXJzdAotCVB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4ocCkKLQkuLi4gVGhlIGJvZHkgb2YgdGhlIGRlYWxsb2NhdG9yIGdvZXMgaGVyZSwgaW5jbHVkaW5nIGFsbCBjYWxscyAuLi4KLQkuLi4gdG8gUHlfREVDUkVGIG9uIGNvbnRhaW5lZCBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KLQlQeV9UUkFTSENBTl9TQUZFX0VORChwKQorICAgIFB5T2JqZWN0X0dDX1VuVHJhY2socCk7ICAgICAgICAvLyBtdXN0IHVudHJhY2sgZmlyc3QKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHApCisgICAgLi4uIFRoZSBib2R5IG9mIHRoZSBkZWFsbG9jYXRvciBnb2VzIGhlcmUsIGluY2x1ZGluZyBhbGwgY2FsbHMgLi4uCisgICAgLi4uIHRvIFB5X0RFQ1JFRiBvbiBjb250YWluZWQgb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQocCkKIH0KIAogQ0FVVElPTjogIE5ldmVyIHJldHVybiBmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIGJvZHkhICBJZiB0aGUgYm9keSBuZWVkcyB0bwpAQCAtOTYyLDE2ICs5NjIsMTYgQEAKICNkZWZpbmUgUHlUcmFzaF9VTldJTkRfTEVWRUwgNTAKIAogI2RlZmluZSBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG9wKSBcCi0JaWYgKF9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nIDwgUHlUcmFzaF9VTldJTkRfTEVWRUwpIHsgXAotCQkrK19QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOwotCQkvKiBUaGUgYm9keSBvZiB0aGUgZGVhbGxvY2F0b3IgaXMgaGVyZS4gKi8KKyAgICBpZiAoX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgPCBQeVRyYXNoX1VOV0lORF9MRVZFTCkgeyBcCisgICAgICAgICsrX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7CisgICAgICAgIC8qIFRoZSBib2R5IG9mIHRoZSBkZWFsbG9jYXRvciBpcyBoZXJlLiAqLwogI2RlZmluZSBQeV9UUkFTSENBTl9TQUZFX0VORChvcCkgXAotCQktLV9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOyBcCi0JCWlmIChfUHlUcmFzaF9kZWxldGVfbGF0ZXIgJiYgX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgPD0gMCkgXAotCQkJX1B5VHJhc2hfZGVzdHJveV9jaGFpbigpOyBcCi0JfSBcCi0JZWxzZSBcCi0JCV9QeVRyYXNoX2RlcG9zaXRfb2JqZWN0KChQeU9iamVjdCopb3ApOworICAgICAgICAtLV9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOyBcCisgICAgICAgIGlmIChfUHlUcmFzaF9kZWxldGVfbGF0ZXIgJiYgX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgPD0gMCkgXAorICAgICAgICAgICAgX1B5VHJhc2hfZGVzdHJveV9jaGFpbigpOyBcCisgICAgfSBcCisgICAgZWxzZSBcCisgICAgICAgIF9QeVRyYXNoX2RlcG9zaXRfb2JqZWN0KChQeU9iamVjdCopb3ApOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvb2JqaW1wbC5oIGIvSW5jbHVkZS9vYmppbXBsLmgKaW5kZXggNDE3NmM2Yi4uNTVlODNlYyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9vYmppbXBsLmgKKysrIGIvSW5jbHVkZS9vYmppbXBsLmgKQEAgLTEwMSw3ICsxMDEsNyBAQAogCiAvKiBNYWNyb3MgKi8KICNpZmRlZiBXSVRIX1BZTUFMTE9DCi0jaWZkZWYgUFlNQUxMT0NfREVCVUcJLyogV0lUSF9QWU1BTExPQyAmJiBQWU1BTExPQ19ERUJVRyAqLworI2lmZGVmIFBZTUFMTE9DX0RFQlVHICAgLyogV0lUSF9QWU1BTExPQyAmJiBQWU1BTExPQ19ERUJVRyAqLwogUHlBUElfRlVOQyh2b2lkICopIF9QeU9iamVjdF9EZWJ1Z01hbGxvYyhzaXplX3QgbmJ5dGVzKTsKIFB5QVBJX0ZVTkModm9pZCAqKSBfUHlPYmplY3RfRGVidWdSZWFsbG9jKHZvaWQgKnAsIHNpemVfdCBuYnl0ZXMpOwogUHlBUElfRlVOQyh2b2lkKSBfUHlPYmplY3RfRGVidWdGcmVlKHZvaWQgKnApOwpAQCAtMTE1LDMxICsxMTUsMzEgQEAKIFB5QVBJX0ZVTkModm9pZCAqKSBfUHlNZW1fRGVidWdNYWxsb2Moc2l6ZV90IG5ieXRlcyk7CiBQeUFQSV9GVU5DKHZvaWQgKikgX1B5TWVtX0RlYnVnUmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbmJ5dGVzKTsKIFB5QVBJX0ZVTkModm9pZCkgX1B5TWVtX0RlYnVnRnJlZSh2b2lkICpwKTsKLSNkZWZpbmUgUHlPYmplY3RfTUFMTE9DCQlfUHlPYmplY3RfRGVidWdNYWxsb2MKLSNkZWZpbmUgUHlPYmplY3RfTWFsbG9jCQlfUHlPYmplY3RfRGVidWdNYWxsb2MKLSNkZWZpbmUgUHlPYmplY3RfUkVBTExPQwlfUHlPYmplY3RfRGVidWdSZWFsbG9jCi0jZGVmaW5lIFB5T2JqZWN0X1JlYWxsb2MJX1B5T2JqZWN0X0RlYnVnUmVhbGxvYwotI2RlZmluZSBQeU9iamVjdF9GUkVFCQlfUHlPYmplY3RfRGVidWdGcmVlCi0jZGVmaW5lIFB5T2JqZWN0X0ZyZWUJCV9QeU9iamVjdF9EZWJ1Z0ZyZWUKKyNkZWZpbmUgUHlPYmplY3RfTUFMTE9DICAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X01hbGxvYyAgICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvYworI2RlZmluZSBQeU9iamVjdF9SRUFMTE9DICAgICAgICBfUHlPYmplY3RfRGVidWdSZWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X1JlYWxsb2MgICAgICAgIF9QeU9iamVjdF9EZWJ1Z1JlYWxsb2MKKyNkZWZpbmUgUHlPYmplY3RfRlJFRSAgICAgICAgICAgX1B5T2JqZWN0X0RlYnVnRnJlZQorI2RlZmluZSBQeU9iamVjdF9GcmVlICAgICAgICAgICBfUHlPYmplY3RfRGVidWdGcmVlCiAKLSNlbHNlCS8qIFdJVEhfUFlNQUxMT0MgJiYgISBQWU1BTExPQ19ERUJVRyAqLwotI2RlZmluZSBQeU9iamVjdF9NQUxMT0MJCVB5T2JqZWN0X01hbGxvYwotI2RlZmluZSBQeU9iamVjdF9SRUFMTE9DCVB5T2JqZWN0X1JlYWxsb2MKLSNkZWZpbmUgUHlPYmplY3RfRlJFRQkJUHlPYmplY3RfRnJlZQorI2Vsc2UgICAvKiBXSVRIX1BZTUFMTE9DICYmICEgUFlNQUxMT0NfREVCVUcgKi8KKyNkZWZpbmUgUHlPYmplY3RfTUFMTE9DICAgICAgICAgUHlPYmplY3RfTWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X1JFQUxMT0MgICAgICAgIFB5T2JqZWN0X1JlYWxsb2MKKyNkZWZpbmUgUHlPYmplY3RfRlJFRSAgICAgICAgICAgUHlPYmplY3RfRnJlZQogI2VuZGlmCiAKLSNlbHNlCS8qICEgV0lUSF9QWU1BTExPQyAqLwotI2RlZmluZSBQeU9iamVjdF9NQUxMT0MJCVB5TWVtX01BTExPQwotI2RlZmluZSBQeU9iamVjdF9SRUFMTE9DCVB5TWVtX1JFQUxMT0MKLSNkZWZpbmUgUHlPYmplY3RfRlJFRQkJUHlNZW1fRlJFRQorI2Vsc2UgICAvKiAhIFdJVEhfUFlNQUxMT0MgKi8KKyNkZWZpbmUgUHlPYmplY3RfTUFMTE9DICAgICAgICAgUHlNZW1fTUFMTE9DCisjZGVmaW5lIFB5T2JqZWN0X1JFQUxMT0MgICAgICAgIFB5TWVtX1JFQUxMT0MKKyNkZWZpbmUgUHlPYmplY3RfRlJFRSAgICAgICAgICAgUHlNZW1fRlJFRQogCi0jZW5kaWYJLyogV0lUSF9QWU1BTExPQyAqLworI2VuZGlmICAvKiBXSVRIX1BZTUFMTE9DICovCiAKLSNkZWZpbmUgUHlPYmplY3RfRGVsCQlQeU9iamVjdF9GcmVlCi0jZGVmaW5lIFB5T2JqZWN0X0RFTAkJUHlPYmplY3RfRlJFRQorI2RlZmluZSBQeU9iamVjdF9EZWwgICAgICAgICAgICBQeU9iamVjdF9GcmVlCisjZGVmaW5lIFB5T2JqZWN0X0RFTCAgICAgICAgICAgIFB5T2JqZWN0X0ZSRUUKIAogLyogZm9yIHNvdXJjZSBjb21wYXRpYmlsaXR5IHdpdGggMi4yICovCi0jZGVmaW5lIF9QeU9iamVjdF9EZWwJCVB5T2JqZWN0X0ZyZWUKKyNkZWZpbmUgX1B5T2JqZWN0X0RlbCAgICAgICAgICAgUHlPYmplY3RfRnJlZQogCiAvKgogICogR2VuZXJpYyBvYmplY3QgYWxsb2NhdG9yIGludGVyZmFjZQpAQCAtMTU0LDE2ICsxNTQsMTYgQEAKIFB5QVBJX0ZVTkMoUHlWYXJPYmplY3QgKikgX1B5T2JqZWN0X05ld1ZhcihQeVR5cGVPYmplY3QgKiwgUHlfc3NpemVfdCk7CiAKICNkZWZpbmUgUHlPYmplY3RfTmV3KHR5cGUsIHR5cGVvYmopIFwKLQkJKCAodHlwZSAqKSBfUHlPYmplY3RfTmV3KHR5cGVvYmopICkKKyAgICAgICAgICAgICAgICAoICh0eXBlICopIF9QeU9iamVjdF9OZXcodHlwZW9iaikgKQogI2RlZmluZSBQeU9iamVjdF9OZXdWYXIodHlwZSwgdHlwZW9iaiwgbikgXAotCQkoICh0eXBlICopIF9QeU9iamVjdF9OZXdWYXIoKHR5cGVvYmopLCAobikpICkKKyAgICAgICAgICAgICAgICAoICh0eXBlICopIF9QeU9iamVjdF9OZXdWYXIoKHR5cGVvYmopLCAobikpICkKIAogLyogTWFjcm9zIHRyYWRpbmcgYmluYXJ5IGNvbXBhdGliaWxpdHkgZm9yIHNwZWVkLiBTZWUgYWxzbyBweW1lbS5oLgogICAgTm90ZSB0aGF0IHRoZXNlIG1hY3JvcyBleHBlY3Qgbm9uLU5VTEwgb2JqZWN0IHBvaW50ZXJzLiovCiAjZGVmaW5lIFB5T2JqZWN0X0lOSVQob3AsIHR5cGVvYmopIFwKLQkoIFB5X1RZUEUob3ApID0gKHR5cGVvYmopLCBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKShvcCkpLCAob3ApICkKKyAgICAoIFB5X1RZUEUob3ApID0gKHR5cGVvYmopLCBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKShvcCkpLCAob3ApICkKICNkZWZpbmUgUHlPYmplY3RfSU5JVF9WQVIob3AsIHR5cGVvYmosIHNpemUpIFwKLQkoIFB5X1NJWkUob3ApID0gKHNpemUpLCBQeU9iamVjdF9JTklUKChvcCksICh0eXBlb2JqKSkgKQorICAgICggUHlfU0laRShvcCkgPSAoc2l6ZSksIFB5T2JqZWN0X0lOSVQoKG9wKSwgKHR5cGVvYmopKSApCiAKICNkZWZpbmUgX1B5T2JqZWN0X1NJWkUodHlwZW9iaikgKCAodHlwZW9iaiktPnRwX2Jhc2ljc2l6ZSApCiAKQEAgLTE4MSwxNyArMTgxLDE3IEBACiAjICAgZXJyb3IgIl9QeU9iamVjdF9WQVJfU0laRSByZXF1aXJlcyBTSVpFT0ZfVk9JRF9QIGJlIGEgcG93ZXIgb2YgMiIKICNlbmRpZgogCi0jZGVmaW5lIF9QeU9iamVjdF9WQVJfU0laRSh0eXBlb2JqLCBuaXRlbXMpCVwKLQkoc2l6ZV90KQkJCQlcCi0JKCAoICh0eXBlb2JqKS0+dHBfYmFzaWNzaXplICsJCVwKLQkgICAgKG5pdGVtcykqKHR5cGVvYmopLT50cF9pdGVtc2l6ZSArCVwKLQkgICAgKFNJWkVPRl9WT0lEX1AgLSAxKQkJCVwKLQkgICkgJiB+KFNJWkVPRl9WT0lEX1AgLSAxKQkJXAotCSkKKyNkZWZpbmUgX1B5T2JqZWN0X1ZBUl9TSVpFKHR5cGVvYmosIG5pdGVtcykgICAgIFwKKyAgICAoc2l6ZV90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICggKHR5cGVvYmopLT50cF9iYXNpY3NpemUgKyAgICAgICAgICAgICAgIFwKKyAgICAgICAgKG5pdGVtcykqKHR5cGVvYmopLT50cF9pdGVtc2l6ZSArICAgICAgIFwKKyAgICAgICAgKFNJWkVPRl9WT0lEX1AgLSAxKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgJiB+KFNJWkVPRl9WT0lEX1AgLSAxKSAgICAgICAgICAgICAgICAgIFwKKyAgICApCiAKICNkZWZpbmUgUHlPYmplY3RfTkVXKHR5cGUsIHR5cGVvYmopIFwKICggKHR5cGUgKikgUHlPYmplY3RfSW5pdCggXAotCShQeU9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0MoIF9QeU9iamVjdF9TSVpFKHR5cGVvYmopICksICh0eXBlb2JqKSkgKQorICAgIChQeU9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0MoIF9QeU9iamVjdF9TSVpFKHR5cGVvYmopICksICh0eXBlb2JqKSkgKQogCiAjZGVmaW5lIFB5T2JqZWN0X05FV19WQVIodHlwZSwgdHlwZW9iaiwgbikgXAogKCAodHlwZSAqKSBQeU9iamVjdF9Jbml0VmFyKCBcCkBAIC0yMDMsNyArMjAzLDcgQEAKICAgIGRpc3RpbmN0aW9uIGJldHdlZW4gdHdvIHN0ZXBzIChhdCBsZWFzdCk6CiAgICAgICAgMSkgdGhlIGFjdHVhbCBhbGxvY2F0aW9uIG9mIHRoZSBvYmplY3Qgc3RvcmFnZTsKICAgICAgICAyKSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIFB5dGhvbiBzcGVjaWZpYyBmaWVsZHMKLSAgICAgICAgICBpbiB0aGlzIHN0b3JhZ2Ugd2l0aCBQeU9iamVjdF97SW5pdCwgSW5pdFZhcn0uCisgICAgICBpbiB0aGlzIHN0b3JhZ2Ugd2l0aCBQeU9iamVjdF97SW5pdCwgSW5pdFZhcn0uCiAKICAgIFB5T2JqZWN0ICoKICAgIFlvdXJPYmplY3RfTmV3KC4uLikKQEAgLTIxMiw3ICsyMTIsNyBAQAogCiAgICAgICAgb3AgPSAoUHlPYmplY3QgKikgWW91cl9BbGxvY2F0b3IoX1B5T2JqZWN0X1NJWkUoWW91clR5cGVTdHJ1Y3QpKTsKICAgICAgICBpZiAob3AgPT0gTlVMTCkKLSAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKICAgICAgICBQeU9iamVjdF9Jbml0KG9wLCAmWW91clR5cGVTdHJ1Y3QpOwogCkBAIC0yMzksNDQgKzIzOSw0NCBAQAogCiAvKiBUZXN0IGlmIGFuIG9iamVjdCBoYXMgYSBHQyBoZWFkICovCiAjZGVmaW5lIFB5T2JqZWN0X0lTX0dDKG8pIChQeVR5cGVfSVNfR0MoUHlfVFlQRShvKSkgJiYgXAotCShQeV9UWVBFKG8pLT50cF9pc19nYyA9PSBOVUxMIHx8IFB5X1RZUEUobyktPnRwX2lzX2djKG8pKSkKKyAgICAoUHlfVFlQRShvKS0+dHBfaXNfZ2MgPT0gTlVMTCB8fCBQeV9UWVBFKG8pLT50cF9pc19nYyhvKSkpCiAKIFB5QVBJX0ZVTkMoUHlWYXJPYmplY3QgKikgX1B5T2JqZWN0X0dDX1Jlc2l6ZShQeVZhck9iamVjdCAqLCBQeV9zc2l6ZV90KTsKICNkZWZpbmUgUHlPYmplY3RfR0NfUmVzaXplKHR5cGUsIG9wLCBuKSBcCi0JCSggKHR5cGUgKikgX1B5T2JqZWN0X0dDX1Jlc2l6ZSgoUHlWYXJPYmplY3QgKikob3ApLCAobikpICkKKyAgICAgICAgICAgICAgICAoICh0eXBlICopIF9QeU9iamVjdF9HQ19SZXNpemUoKFB5VmFyT2JqZWN0ICopKG9wKSwgKG4pKSApCiAKIC8qIGZvciBzb3VyY2UgY29tcGF0aWJpbGl0eSB3aXRoIDIuMiAqLwogI2RlZmluZSBfUHlPYmplY3RfR0NfRGVsIFB5T2JqZWN0X0dDX0RlbAogCiAvKiBHQyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgQkVGT1JFIHRoZSBvYmplY3Qgc3RydWN0dXJlLiAqLwogdHlwZWRlZiB1bmlvbiBfZ2NfaGVhZCB7Ci0Jc3RydWN0IHsKLQkJdW5pb24gX2djX2hlYWQgKmdjX25leHQ7Ci0JCXVuaW9uIF9nY19oZWFkICpnY19wcmV2OwotCQlQeV9zc2l6ZV90IGdjX3JlZnM7Ci0JfSBnYzsKLQlsb25nIGRvdWJsZSBkdW1teTsgIC8qIGZvcmNlIHdvcnN0LWNhc2UgYWxpZ25tZW50ICovCisgICAgc3RydWN0IHsKKyAgICAgICAgdW5pb24gX2djX2hlYWQgKmdjX25leHQ7CisgICAgICAgIHVuaW9uIF9nY19oZWFkICpnY19wcmV2OworICAgICAgICBQeV9zc2l6ZV90IGdjX3JlZnM7CisgICAgfSBnYzsKKyAgICBsb25nIGRvdWJsZSBkdW1teTsgIC8qIGZvcmNlIHdvcnN0LWNhc2UgYWxpZ25tZW50ICovCiB9IFB5R0NfSGVhZDsKIAogZXh0ZXJuIFB5R0NfSGVhZCAqX1B5R0NfZ2VuZXJhdGlvbjA7CiAKICNkZWZpbmUgX1B5X0FTX0dDKG8pICgoUHlHQ19IZWFkICopKG8pLTEpCiAKLSNkZWZpbmUgX1B5R0NfUkVGU19VTlRSQUNLRUQJCQkoLTIpCi0jZGVmaW5lIF9QeUdDX1JFRlNfUkVBQ0hBQkxFCQkJKC0zKQotI2RlZmluZSBfUHlHQ19SRUZTX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFCSgtNCkKKyNkZWZpbmUgX1B5R0NfUkVGU19VTlRSQUNLRUQgICAgICAgICAgICAgICAgICAgICgtMikKKyNkZWZpbmUgX1B5R0NfUkVGU19SRUFDSEFCTEUgICAgICAgICAgICAgICAgICAgICgtMykKKyNkZWZpbmUgX1B5R0NfUkVGU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRSAgICAgICgtNCkKIAogLyogVGVsbCB0aGUgR0MgdG8gdHJhY2sgdGhpcyBvYmplY3QuICBOQjogV2hpbGUgdGhlIG9iamVjdCBpcyB0cmFja2VkIHRoZQogICogY29sbGVjdG9yIGl0IG11c3QgYmUgc2FmZSB0byBjYWxsIHRoZSBvYl90cmF2ZXJzZSBtZXRob2QuICovCiAjZGVmaW5lIF9QeU9iamVjdF9HQ19UUkFDSyhvKSBkbyB7IFwKLQlQeUdDX0hlYWQgKmcgPSBfUHlfQVNfR0Mobyk7IFwKLQlpZiAoZy0+Z2MuZ2NfcmVmcyAhPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCkgXAotCQlQeV9GYXRhbEVycm9yKCJHQyBvYmplY3QgYWxyZWFkeSB0cmFja2VkIik7IFwKLQlnLT5nYy5nY19yZWZzID0gX1B5R0NfUkVGU19SRUFDSEFCTEU7IFwKLQlnLT5nYy5nY19uZXh0ID0gX1B5R0NfZ2VuZXJhdGlvbjA7IFwKLQlnLT5nYy5nY19wcmV2ID0gX1B5R0NfZ2VuZXJhdGlvbjAtPmdjLmdjX3ByZXY7IFwKLQlnLT5nYy5nY19wcmV2LT5nYy5nY19uZXh0ID0gZzsgXAotCV9QeUdDX2dlbmVyYXRpb24wLT5nYy5nY19wcmV2ID0gZzsgXAorICAgIFB5R0NfSGVhZCAqZyA9IF9QeV9BU19HQyhvKTsgXAorICAgIGlmIChnLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKSBcCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkdDIG9iamVjdCBhbHJlYWR5IHRyYWNrZWQiKTsgXAorICAgIGctPmdjLmdjX3JlZnMgPSBfUHlHQ19SRUZTX1JFQUNIQUJMRTsgXAorICAgIGctPmdjLmdjX25leHQgPSBfUHlHQ19nZW5lcmF0aW9uMDsgXAorICAgIGctPmdjLmdjX3ByZXYgPSBfUHlHQ19nZW5lcmF0aW9uMC0+Z2MuZ2NfcHJldjsgXAorICAgIGctPmdjLmdjX3ByZXYtPmdjLmdjX25leHQgPSBnOyBcCisgICAgX1B5R0NfZ2VuZXJhdGlvbjAtPmdjLmdjX3ByZXYgPSBnOyBcCiAgICAgfSB3aGlsZSAoMCk7CiAKIC8qIFRlbGwgdGhlIEdDIHRvIHN0b3AgdHJhY2tpbmcgdGhpcyBvYmplY3QuCkBAIC0yODQsMjMgKzI4NCwyMyBAQAogICogd2F5IHRvIHByb3Zva2UgbWVtb3J5IGVycm9ycyBpZiBjYWxsaW5nIGNvZGUgaXMgY29uZnVzZWQuCiAgKi8KICNkZWZpbmUgX1B5T2JqZWN0X0dDX1VOVFJBQ0sobykgZG8geyBcCi0JUHlHQ19IZWFkICpnID0gX1B5X0FTX0dDKG8pOyBcCi0JYXNzZXJ0KGctPmdjLmdjX3JlZnMgIT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpOyBcCi0JZy0+Z2MuZ2NfcmVmcyA9IF9QeUdDX1JFRlNfVU5UUkFDS0VEOyBcCi0JZy0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IGctPmdjLmdjX25leHQ7IFwKLQlnLT5nYy5nY19uZXh0LT5nYy5nY19wcmV2ID0gZy0+Z2MuZ2NfcHJldjsgXAotCWctPmdjLmdjX25leHQgPSBOVUxMOyBcCisgICAgUHlHQ19IZWFkICpnID0gX1B5X0FTX0dDKG8pOyBcCisgICAgYXNzZXJ0KGctPmdjLmdjX3JlZnMgIT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpOyBcCisgICAgZy0+Z2MuZ2NfcmVmcyA9IF9QeUdDX1JFRlNfVU5UUkFDS0VEOyBcCisgICAgZy0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IGctPmdjLmdjX25leHQ7IFwKKyAgICBnLT5nYy5nY19uZXh0LT5nYy5nY19wcmV2ID0gZy0+Z2MuZ2NfcHJldjsgXAorICAgIGctPmdjLmdjX25leHQgPSBOVUxMOyBcCiAgICAgfSB3aGlsZSAoMCk7CiAKIC8qIFRydWUgaWYgdGhlIG9iamVjdCBpcyBjdXJyZW50bHkgdHJhY2tlZCBieSB0aGUgR0MuICovCiAjZGVmaW5lIF9QeU9iamVjdF9HQ19JU19UUkFDS0VEKG8pIFwKLQkoKF9QeV9BU19HQyhvKSktPmdjLmdjX3JlZnMgIT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpCi0gCisgICAgKChfUHlfQVNfR0MobykpLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKQorCiAvKiBUcnVlIGlmIHRoZSBvYmplY3QgbWF5IGJlIHRyYWNrZWQgYnkgdGhlIEdDIGluIHRoZSBmdXR1cmUsIG9yIGFscmVhZHkgaXMuCiAgICBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gaW1wbGVtZW50IHNvbWUgb3B0aW1pemF0aW9ucy4gKi8KICNkZWZpbmUgX1B5T2JqZWN0X0dDX01BWV9CRV9UUkFDS0VEKG9iaikgXAotCShQeU9iamVjdF9JU19HQyhvYmopICYmIFwKLQkJKCFQeVR1cGxlX0NoZWNrRXhhY3Qob2JqKSB8fCBfUHlPYmplY3RfR0NfSVNfVFJBQ0tFRChvYmopKSkKKyAgICAoUHlPYmplY3RfSVNfR0Mob2JqKSAmJiBcCisgICAgICAgICghUHlUdXBsZV9DaGVja0V4YWN0KG9iaikgfHwgX1B5T2JqZWN0X0dDX0lTX1RSQUNLRUQob2JqKSkpCiAKIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlPYmplY3RfR0NfTWFsbG9jKHNpemVfdCk7CkBAIC0zMTEsOSArMzExLDkgQEAKIFB5QVBJX0ZVTkModm9pZCkgUHlPYmplY3RfR0NfRGVsKHZvaWQgKik7CiAKICNkZWZpbmUgUHlPYmplY3RfR0NfTmV3KHR5cGUsIHR5cGVvYmopIFwKLQkJKCAodHlwZSAqKSBfUHlPYmplY3RfR0NfTmV3KHR5cGVvYmopICkKKyAgICAgICAgICAgICAgICAoICh0eXBlICopIF9QeU9iamVjdF9HQ19OZXcodHlwZW9iaikgKQogI2RlZmluZSBQeU9iamVjdF9HQ19OZXdWYXIodHlwZSwgdHlwZW9iaiwgbikgXAotCQkoICh0eXBlICopIF9QeU9iamVjdF9HQ19OZXdWYXIoKHR5cGVvYmopLCAobikpICkKKyAgICAgICAgICAgICAgICAoICh0eXBlICopIF9QeU9iamVjdF9HQ19OZXdWYXIoKHR5cGVvYmopLCAobikpICkKIAogCiAvKiBVdGlsaXR5IG1hY3JvIHRvIGhlbHAgd3JpdGUgdHBfdHJhdmVyc2UgZnVuY3Rpb25zLgpAQCAtMzIxLDE0ICszMjEsMTQgQEAKICAqICJ2aXNpdCIgYW5kICJhcmciLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBrZWVwIHRwX3RyYXZlcnNlIGZ1bmN0aW9ucwogICogbG9va2luZyBhcyBtdWNoIGFsaWtlIGFzIHBvc3NpYmxlLgogICovCi0jZGVmaW5lIFB5X1ZJU0lUKG9wKQkJCQkJCQlcCi0gICAgICAgIGRvIHsgCQkJCQkJCQlcCi0gICAgICAgICAgICAgICAgaWYgKG9wKSB7CQkJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZyZXQgPSB2aXNpdCgoUHlPYmplY3QgKikob3ApLCBhcmcpOwlcCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodnJldCkJCQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZyZXQ7CQkJCVwKLSAgICAgICAgICAgICAgICB9CQkJCQkJCVwKLSAgICAgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUHlfVklTSVQob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCB2cmV0ID0gdmlzaXQoKFB5T2JqZWN0ICopKG9wKSwgYXJnKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICh2cmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZXR1cm4gdnJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQogCiAvKiBUaGlzIGlzIGhlcmUgZm9yIHRoZSBzYWtlIG9mIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgRXh0ZW5zaW9ucyB0aGF0CiAgKiB1c2UgdGhlIG9sZCBHQyBBUEkgd2lsbCBzdGlsbCBjb21waWxlIGJ1dCB0aGUgb2JqZWN0cyB3aWxsIG5vdCBiZQpAQCAtMzQyLDExICszNDIsMTEgQEAKIAogLyogVGVzdCBpZiBhIHR5cGUgc3VwcG9ydHMgd2VhayByZWZlcmVuY2VzICovCiAjZGVmaW5lIFB5VHlwZV9TVVBQT1JUU19XRUFLUkVGUyh0KSBcCi0gICAgICAgIChQeVR5cGVfSGFzRmVhdHVyZSgodCksIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUykgXAotICAgICAgICAgJiYgKCh0KS0+dHBfd2Vha2xpc3RvZmZzZXQgPiAwKSkKKyAgICAoUHlUeXBlX0hhc0ZlYXR1cmUoKHQpLCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMpIFwKKyAgICAgJiYgKCh0KS0+dHBfd2Vha2xpc3RvZmZzZXQgPiAwKSkKIAogI2RlZmluZSBQeU9iamVjdF9HRVRfV0VBS1JFRlNfTElTVFBUUihvKSBcCi0JKChQeU9iamVjdCAqKikgKCgoY2hhciAqKSAobykpICsgUHlfVFlQRShvKS0+dHBfd2Vha2xpc3RvZmZzZXQpKQorICAgICgoUHlPYmplY3QgKiopICgoKGNoYXIgKikgKG8pKSArIFB5X1RZUEUobyktPnRwX3dlYWtsaXN0b2Zmc2V0KSkKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5ZXJyb3JzLmggYi9JbmNsdWRlL3B5ZXJyb3JzLmgKaW5kZXggNDMyMDA0YS4uZGJlM2JmYSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weWVycm9ycy5oCisrKyBiL0luY2x1ZGUvcHllcnJvcnMuaApAQCAtOTQsMjMgKzk0LDIzIEBACiAKIC8qICovCiAKLSNkZWZpbmUgUHlFeGNlcHRpb25DbGFzc19DaGVjayh4KQkJCQkJXAotCShQeUNsYXNzX0NoZWNrKCh4KSkgfHwgKFB5VHlwZV9DaGVjaygoeCkpICYmCQkJXAotCSAgUHlUeXBlX0Zhc3RTdWJjbGFzcygoUHlUeXBlT2JqZWN0KikoeCksIFB5X1RQRkxBR1NfQkFTRV9FWENfU1VCQ0xBU1MpKSkKKyNkZWZpbmUgUHlFeGNlcHRpb25DbGFzc19DaGVjayh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoUHlDbGFzc19DaGVjaygoeCkpIHx8IChQeVR5cGVfQ2hlY2soKHgpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoKFB5VHlwZU9iamVjdCopKHgpLCBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTKSkpCiAKLSNkZWZpbmUgUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh4KQkJCVwKLQkoUHlJbnN0YW5jZV9DaGVjaygoeCkpIHx8CQkJXAotCSBQeVR5cGVfRmFzdFN1YmNsYXNzKCh4KS0+b2JfdHlwZSwgUHlfVFBGTEFHU19CQVNFX0VYQ19TVUJDTEFTUykpCisjZGVmaW5lIFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2soeCkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoUHlJbnN0YW5jZV9DaGVjaygoeCkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBQeVR5cGVfRmFzdFN1YmNsYXNzKCh4KS0+b2JfdHlwZSwgUHlfVFBGTEFHU19CQVNFX0VYQ19TVUJDTEFTUykpCiAKLSNkZWZpbmUgUHlFeGNlcHRpb25DbGFzc19OYW1lKHgpCQkJCSAgIFwKLQkoUHlDbGFzc19DaGVjaygoeCkpCQkJCQkgICBcCi0JID8gUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlDbGFzc09iamVjdCopKHgpKS0+Y2xfbmFtZSkJICAgXAotCSA6IChjaGFyICopKCgoUHlUeXBlT2JqZWN0KikoeCkpLT50cF9uYW1lKSkKKyNkZWZpbmUgUHlFeGNlcHRpb25DbGFzc19OYW1lKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKFB5Q2xhc3NfQ2hlY2soKHgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICA/IFB5U3RyaW5nX0FTX1NUUklORygoKFB5Q2xhc3NPYmplY3QqKSh4KSktPmNsX25hbWUpICAgICAgICAgIFwKKyAgICAgOiAoY2hhciAqKSgoKFB5VHlwZU9iamVjdCopKHgpKS0+dHBfbmFtZSkpCiAKLSNkZWZpbmUgUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyh4KQkJCQkJXAotCSgoUHlJbnN0YW5jZV9DaGVjaygoeCkpCQkJCQkJXAotCSAgPyAoUHlPYmplY3QqKSgoUHlJbnN0YW5jZU9iamVjdCopKHgpKS0+aW5fY2xhc3MJCVwKLQkgIDogKFB5T2JqZWN0KikoKHgpLT5vYl90eXBlKSkpCisjZGVmaW5lIFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2xhc3MoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChQeUluc3RhbmNlX0NoZWNrKCh4KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA/IChQeU9iamVjdCopKChQeUluc3RhbmNlT2JqZWN0KikoeCkpLT5pbl9jbGFzcyAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IChQeU9iamVjdCopKCh4KS0+b2JfdHlwZSkpKQogCiAKIC8qIFByZWRlZmluZWQgZXhjZXB0aW9ucyAqLwpAQCAtMTg0LDMxICsxODQsMzEgQEAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfTm9NZW1vcnkodm9pZCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEZyb21FcnJubyhQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KAotCVB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUoCi0JUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKKyAgICBQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOwogI2lmZGVmIE1TX1dJTkRPV1MKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbUVycm5vV2l0aFVuaWNvZGVGaWxlbmFtZSgKLQlQeU9iamVjdCAqLCBjb25zdCBQeV9VTklDT0RFICopOworICAgIFB5T2JqZWN0ICosIGNvbnN0IFB5X1VOSUNPREUgKik7CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX0Zvcm1hdChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIC4uLikKLQkJCVB5X0dDQ19BVFRSSUJVVEUoKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOwogCiAjaWZkZWYgTVNfV0lORE9XUwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdCgKLQlpbnQsIGNvbnN0IGNoYXIgKik7CisgICAgaW50LCBjb25zdCBjaGFyICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgKLQlpbnQsIGNvbnN0IGNoYXIgKik7CisgICAgaW50LCBjb25zdCBjaGFyICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhVbmljb2RlRmlsZW5hbWUoCi0JaW50LCBjb25zdCBQeV9VTklDT0RFICopOworICAgIGludCwgY29uc3QgUHlfVU5JQ09ERSAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoaW50KTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoCi0JUHlPYmplY3QgKixpbnQsIFB5T2JqZWN0ICopOworICAgIFB5T2JqZWN0ICosaW50LCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoCi0JUHlPYmplY3QgKixpbnQsIGNvbnN0IGNoYXIgKik7CisgICAgUHlPYmplY3QgKixpbnQsIGNvbnN0IGNoYXIgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aFVuaWNvZGVGaWxlbmFtZSgKLQlQeU9iamVjdCAqLGludCwgY29uc3QgUHlfVU5JQ09ERSAqKTsKKyAgICBQeU9iamVjdCAqLGludCwgY29uc3QgUHlfVU5JQ09ERSAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoUHlPYmplY3QgKiwgaW50KTsKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKQEAgLTIyMSw5ICsyMjEsOSBAQAogCiAvKiBGdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZXhjZXB0aW9uICovCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX05ld0V4Y2VwdGlvbigKLQljaGFyICpuYW1lLCBQeU9iamVjdCAqYmFzZSwgUHlPYmplY3QgKmRpY3QpOworICAgIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpiYXNlLCBQeU9iamVjdCAqZGljdCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2MoCi0JY2hhciAqbmFtZSwgY2hhciAqZG9jLCBQeU9iamVjdCAqYmFzZSwgUHlPYmplY3QgKmRpY3QpOworICAgIGNoYXIgKm5hbWUsIGNoYXIgKmRvYywgUHlPYmplY3QgKmJhc2UsIFB5T2JqZWN0ICpkaWN0KTsKIFB5QVBJX0ZVTkModm9pZCkgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKFB5T2JqZWN0ICopOwogCiAvKiBJbiBzaWdjaGVjay5jIG9yIHNpZ25hbG1vZHVsZS5jICovCkBAIC0yNDMsMTUgKzI0MywxNSBAQAogCiAvKiBjcmVhdGUgYSBVbmljb2RlRGVjb2RlRXJyb3Igb2JqZWN0ICovCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZSgKLQljb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKKyAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKIAogLyogY3JlYXRlIGEgVW5pY29kZUVuY29kZUVycm9yIG9iamVjdCAqLwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9DcmVhdGUoCi0JY29uc3QgY2hhciAqLCBjb25zdCBQeV9VTklDT0RFICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKik7CisgICAgY29uc3QgY2hhciAqLCBjb25zdCBQeV9VTklDT0RFICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKik7CiAKIC8qIGNyZWF0ZSBhIFVuaWNvZGVUcmFuc2xhdGVFcnJvciBvYmplY3QgKi8KIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfQ3JlYXRlKAotCWNvbnN0IFB5X1VOSUNPREUgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKKyAgICBjb25zdCBQeV9VTklDT0RFICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKik7CiAKIC8qIGdldCB0aGUgZW5jb2RpbmcgYXR0cmlidXRlICovCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nKFB5T2JqZWN0ICopOwpAQCAtMjk0LDExICsyOTQsMTEgQEAKIC8qIGFzc2lnbiBhIG5ldyB2YWx1ZSB0byB0aGUgcmVhc29uIGF0dHJpYnV0ZQogICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAqLwogUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbigKLQlQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworICAgIFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CiBQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uKAotCVB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CisgICAgUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb24oCi0JUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKKyAgICBQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOwogI2VuZGlmCiAKIApAQCAtMzE4LDkgKzMxOCw5IEBACiAKICNpbmNsdWRlIDxzdGRhcmcuaD4KIFB5QVBJX0ZVTkMoaW50KSBQeU9TX3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgICpmb3JtYXQsIC4uLikKLQkJCVB5X0dDQ19BVFRSSUJVVEUoKGZvcm1hdChwcmludGYsIDMsIDQpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOwogUHlBUElfRlVOQyhpbnQpIFB5T1NfdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgICpmb3JtYXQsIHZhX2xpc3QgdmEpCi0JCQlQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAzLCAwKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMywgMCkpKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5bWFjY29uZmlnLmggYi9JbmNsdWRlL3B5bWFjY29uZmlnLmgKaW5kZXggODEzYTYxNy4uNmQ0YTk3MSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weW1hY2NvbmZpZy5oCisrKyBiL0luY2x1ZGUvcHltYWNjb25maWcuaApAQCAtNCw3ICs0LDcgQEAKICAgICAgICogVGhpcyBmaWxlIG1vdmVzIHNvbWUgb2YgdGhlIGF1dG9jb25mIG1hZ2ljIHRvIGNvbXBpbGUtdGltZQogICAgICAgKiB3aGVuIGJ1aWxkaW5nIG9uIE1hY09TWC4gVGhpcyBpcyBuZWVkZWQgZm9yIGJ1aWxkaW5nIDQtd2F5CiAgICAgICAqIHVuaXZlcnNhbCBiaW5hcmllcyBhbmQgZm9yIDY0LWJpdCB1bml2ZXJzYWwgYmluYXJpZXMgYmVjYXVzZQotICAgICAgKiB0aGUgdmFsdWVzIHJlZGVmaW5lZCBiZWxvdyBhcmVuJ3QgY29uZmlndXJlLXRpbWUgY29uc3RhbnQgYnV0IAorICAgICAgKiB0aGUgdmFsdWVzIHJlZGVmaW5lZCBiZWxvdyBhcmVuJ3QgY29uZmlndXJlLXRpbWUgY29uc3RhbnQgYnV0CiAgICAgICAqIG9ubHkgY29tcGlsZS10aW1lIGNvbnN0YW50IGluIHRoZXNlIHNjZW5hcmlvcy4KICAgICAgICovCiAKQEAgLTM2LDQwICszNiw0MCBAQAogCiAjICAgIHVuZGVmIFNJWkVPRl9MT05HCiAjICAgIGlmZGVmIF9fTFA2NF9fCi0jCSBkZWZpbmUgU0laRU9GX19CT09MCQkxCi0jICAgICAgICBkZWZpbmUgU0laRU9GX19CT09MCQkxCi0jICAgICAgICBkZWZpbmUgU0laRU9GX0xPTkcgCQk4Ci0jICAgICAgICBkZWZpbmUgU0laRU9GX1BUSFJFQURfVCAJOAotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9TSVpFX1QgCQk4Ci0jICAgICAgICBkZWZpbmUgU0laRU9GX1RJTUVfVCAJCTgKLSMgICAgICAgIGRlZmluZSBTSVpFT0ZfVk9JRF9QIAkJOAotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9VSU5UUFRSX1QJOAotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QJOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9fQk9PTCAgICAgICAgICAgIDEKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfX0JPT0wgICAgICAgICAgICAxCisjICAgICAgICBkZWZpbmUgU0laRU9GX0xPTkcgICAgICAgICAgICAgOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QgICAgICAgIDgKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfU0laRV9UICAgICAgICAgICA4CisjICAgICAgICBkZWZpbmUgU0laRU9GX1RJTUVfVCAgICAgICAgICAgOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9WT0lEX1AgICAgICAgICAgIDgKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfVUlOVFBUUl9UICAgICAgICA4CisjICAgICAgICBkZWZpbmUgU0laRU9GX1BUSFJFQURfVCAgICAgICAgOAogIyAgICBlbHNlCiAjICAgICAgICBpZmRlZiBfX3BwY19fCi0jCSAgICBkZWZpbmUgU0laRU9GX19CT09MCQk0CisjICAgICAgICAgICBkZWZpbmUgU0laRU9GX19CT09MICAgICAgICAgNAogIyAgICAgICAgZWxzZQotIwkgICAgZGVmaW5lIFNJWkVPRl9fQk9PTAkJMQorIyAgICAgICAgICAgZGVmaW5lIFNJWkVPRl9fQk9PTCAgICAgICAgIDEKICMgICAgICAgIGVuZGlmCi0jICAgICAgICBkZWZpbmUgU0laRU9GX0xPTkcgCQk0Ci0jICAgICAgICBkZWZpbmUgU0laRU9GX1BUSFJFQURfVCAJNAotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9TSVpFX1QgCQk0Ci0jICAgICAgICBkZWZpbmUgU0laRU9GX1RJTUVfVCAJCTQKLSMgICAgICAgIGRlZmluZSBTSVpFT0ZfVk9JRF9QIAkJNAotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9VSU5UUFRSX1QgCTQKLSMgICAgICAgIGRlZmluZSBTSVpFT0ZfUFRIUkVBRF9UIAk0CisjICAgICAgICBkZWZpbmUgU0laRU9GX0xPTkcgICAgICAgICAgICAgNAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QgICAgICAgIDQKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfU0laRV9UICAgICAgICAgICA0CisjICAgICAgICBkZWZpbmUgU0laRU9GX1RJTUVfVCAgICAgICAgICAgNAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9WT0lEX1AgICAgICAgICAgIDQKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfVUlOVFBUUl9UICAgICAgICA0CisjICAgICAgICBkZWZpbmUgU0laRU9GX1BUSFJFQURfVCAgICAgICAgNAogIyAgICBlbmRpZgogCiAjICAgIGlmIGRlZmluZWQoX19MUDY0X18pCi0JIC8qIE1hY09TWCAxMC40ICh0aGUgZmlyc3QgcmVsZWFzZSB0byBzdXBwcG9ydCA2NC1iaXQgY29kZQotCSAgKiBhdCBhbGwpIG9ubHkgc3VwcG9ydHMgNjQtYml0IGluIHRoZSBVTklYIGxheWVyLiAKLQkgICogVGhlcmVmb3JlIHN1cnByZXNzIHRoZSB0b29sYm94LWdsdWUgaW4gNjQtYml0IG1vZGUuCi0JICAqLworICAgICAvKiBNYWNPU1ggMTAuNCAodGhlIGZpcnN0IHJlbGVhc2UgdG8gc3VwcHBvcnQgNjQtYml0IGNvZGUKKyAgICAgICogYXQgYWxsKSBvbmx5IHN1cHBvcnRzIDY0LWJpdCBpbiB0aGUgVU5JWCBsYXllci4KKyAgICAgICogVGhlcmVmb3JlIHN1cnByZXNzIHRoZSB0b29sYm94LWdsdWUgaW4gNjQtYml0IG1vZGUuCisgICAgICAqLwogCi0JLyogSW4gNjQtYml0IG1vZGUgc2V0cGdycCBhbHdheXMgaGFzIG5vIGFyZ21lbnRzLCBpbiAzMi1iaXQKLQkgKiBtb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQKLQkgKi8KLSMJdW5kZWYgU0VUUEdSUF9IQVZFX0FSRworICAgIC8qIEluIDY0LWJpdCBtb2RlIHNldHBncnAgYWx3YXlzIGhhcyBubyBhcmdtZW50cywgaW4gMzItYml0CisgICAgICogbW9kZSB0aGF0IGRlcGVuZHMgb24gdGhlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50CisgICAgICovCisjICAgICAgIHVuZGVmIFNFVFBHUlBfSEFWRV9BUkcKIAogIyAgICBlbmRpZgogCkBAIC04NCwxNyArODQsMTcgQEAKICMgZGVmaW5lIEhBVkVfR0NDX0FTTV9GT1JfWDg3CiAjZW5kaWYKIAotCS8qIAotCSAqIFRoZSBkZWZpbml0aW9uIGluIHB5Y29uZmlnLmggaXMgb25seSB2YWxpZCBvbiB0aGUgT1MgcmVsZWFzZQotCSAqIHdoZXJlIGNvbmZpZ3VyZSByYW4gb24gYW5kIG5vdCBuZWNlc3NhcmlseSBmb3IgYWxsIHN5c3RlbXMgd2hlcmUKLQkgKiB0aGUgZXhlY3V0YWJsZSBjYW4gYmUgdXNlZCBvbi4gCi0JICogCi0JICogU3BlY2lmaWNhbGx5OiBPU1ggMTAuNCBoYXMgbGltaXRlZCBzdXBwb3J0ZWQgZm9yICclemQnLCB3aGlsZQotCSAqIDEwLjUgaGFzIGZ1bGwgc3VwcG9ydCBmb3IgJyV6ZCcuIEEgYmluYXJ5IGJ1aWx0IG9uIDEwLjUgd29uJ3QKLQkgKiB3b3JrIHByb3Blcmx5IG9uIDEwLjQgdW5sZXNzIHdlIHN1cnByZXNzIHRoZSBkZWZpbml0aW9uCi0JICogb2YgUFlfRk9STUFUX1NJWkVfVAotCSAqLwotI3VuZGVmCVBZX0ZPUk1BVF9TSVpFX1QKKyAgICAvKgorICAgICAqIFRoZSBkZWZpbml0aW9uIGluIHB5Y29uZmlnLmggaXMgb25seSB2YWxpZCBvbiB0aGUgT1MgcmVsZWFzZQorICAgICAqIHdoZXJlIGNvbmZpZ3VyZSByYW4gb24gYW5kIG5vdCBuZWNlc3NhcmlseSBmb3IgYWxsIHN5c3RlbXMgd2hlcmUKKyAgICAgKiB0aGUgZXhlY3V0YWJsZSBjYW4gYmUgdXNlZCBvbi4KKyAgICAgKgorICAgICAqIFNwZWNpZmljYWxseTogT1NYIDEwLjQgaGFzIGxpbWl0ZWQgc3VwcG9ydGVkIGZvciAnJXpkJywgd2hpbGUKKyAgICAgKiAxMC41IGhhcyBmdWxsIHN1cHBvcnQgZm9yICclemQnLiBBIGJpbmFyeSBidWlsdCBvbiAxMC41IHdvbid0CisgICAgICogd29yayBwcm9wZXJseSBvbiAxMC40IHVubGVzcyB3ZSBzdXJwcmVzcyB0aGUgZGVmaW5pdGlvbgorICAgICAqIG9mIFBZX0ZPUk1BVF9TSVpFX1QKKyAgICAgKi8KKyN1bmRlZiAgUFlfRk9STUFUX1NJWkVfVAogCiAKICNlbmRpZiAvKiBkZWZpbmVkKF9BUFBMRV9fKSAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXBvcnQuaCBiL0luY2x1ZGUvcHlwb3J0LmgKaW5kZXggZTAyYTVmZC4uN2MyZGFiMCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXBvcnQuaAorKysgYi9JbmNsdWRlL3B5cG9ydC5oCkBAIC0xNDMsMjAgKzE0MywyMCBAQAogICogaW50ZWdyYWwgdHlwZS4KICAqLwogI2lmZGVmIEhBVkVfVUlOVFBUUl9UCi10eXBlZGVmIHVpbnRwdHJfdAlQeV91aW50cHRyX3Q7Ci10eXBlZGVmIGludHB0cl90CVB5X2ludHB0cl90OwordHlwZWRlZiB1aW50cHRyX3QgICAgICAgUHlfdWludHB0cl90OwordHlwZWRlZiBpbnRwdHJfdCAgICAgICAgUHlfaW50cHRyX3Q7CiAKICNlbGlmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0lOVAotdHlwZWRlZiB1bnNpZ25lZCBpbnQJUHlfdWludHB0cl90OwotdHlwZWRlZiBpbnQJCVB5X2ludHB0cl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgUHlfdWludHB0cl90OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgUHlfaW50cHRyX3Q7CiAKICNlbGlmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcKLXR5cGVkZWYgdW5zaWduZWQgbG9uZwlQeV91aW50cHRyX3Q7Ci10eXBlZGVmIGxvbmcJCVB5X2ludHB0cl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgUHlfdWludHB0cl90OwordHlwZWRlZiBsb25nICAgICAgICAgICAgUHlfaW50cHRyX3Q7CiAKICNlbGlmIGRlZmluZWQoSEFWRV9MT05HX0xPTkcpICYmIChTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HX0xPTkcpCi10eXBlZGVmIHVuc2lnbmVkIFBZX0xPTkdfTE9ORwlQeV91aW50cHRyX3Q7Ci10eXBlZGVmIFBZX0xPTkdfTE9ORwkJUHlfaW50cHRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAgIFB5X3VpbnRwdHJfdDsKK3R5cGVkZWYgUFlfTE9OR19MT05HICAgICAgICAgICAgUHlfaW50cHRyX3Q7CiAKICNlbHNlCiAjICAgZXJyb3IgIlB5dGhvbiBuZWVkcyBhIHR5cGVkZWYgZm9yIFB5X3VpbnRwdHJfdCBpbiBweXBvcnQuaC4iCkBAIC0xNjcsOSArMTY3LDkgQEAKICAqIHVuc2lnbmVkIGludGVncmFsIHR5cGUpLiAgU2VlIFBFUCAzNTMgZm9yIGRldGFpbHMuCiAgKi8KICNpZmRlZiBIQVZFX1NTSVpFX1QKLXR5cGVkZWYgc3NpemVfdAkJUHlfc3NpemVfdDsKK3R5cGVkZWYgc3NpemVfdCAgICAgICAgIFB5X3NzaXplX3Q7CiAjZWxpZiBTSVpFT0ZfVk9JRF9QID09IFNJWkVPRl9TSVpFX1QKLXR5cGVkZWYgUHlfaW50cHRyX3QJUHlfc3NpemVfdDsKK3R5cGVkZWYgUHlfaW50cHRyX3QgICAgIFB5X3NzaXplX3Q7CiAjZWxzZQogIyAgIGVycm9yICJQeXRob24gbmVlZHMgYSB0eXBlZGVmIGZvciBQeV9zc2l6ZV90IGluIHB5cG9ydC5oLiIKICNlbmRpZgpAQCAtMTc3LDcgKzE3Nyw3IEBACiAvKiBMYXJnZXN0IHBvc3NpYmxlIHZhbHVlIG9mIHNpemVfdC4KICAgIFNJWkVfTUFYIGlzIHBhcnQgb2YgQzk5LCBzbyBpdCBtaWdodCBiZSBkZWZpbmVkIG9uIHNvbWUKICAgIHBsYXRmb3Jtcy4gSWYgaXQgaXMgbm90IGRlZmluZWQsIChzaXplX3QpLTEgaXMgYSBwb3J0YWJsZQotICAgZGVmaW5pdGlvbiBmb3IgQzg5LCBkdWUgdG8gdGhlIHdheSBzaWduZWQtPnVuc2lnbmVkIAorICAgZGVmaW5pdGlvbiBmb3IgQzg5LCBkdWUgdG8gdGhlIHdheSBzaWduZWQtPnVuc2lnbmVkCiAgICBjb252ZXJzaW9uIGlzIGRlZmluZWQuICovCiAjaWZkZWYgU0laRV9NQVgKICNkZWZpbmUgUFlfU0laRV9NQVggU0laRV9NQVgKQEAgLTI2OSw3ICsyNjksNyBAQAogLyogZW5hYmxlIG1vcmUgYWdncmVzc2l2ZSBvcHRpbWl6YXRpb24gZm9yIHZpc3VhbCBzdHVkaW8gKi8KICNwcmFnbWEgb3B0aW1pemUoImFndHciLCBvbikKICNlbmRpZgotLyogaWdub3JlIHdhcm5pbmdzIGlmIHRoZSBjb21waWxlciBkZWNpZGVzIG5vdCB0byBpbmxpbmUgYSBmdW5jdGlvbiAqLyAKKy8qIGlnbm9yZSB3YXJuaW5ncyBpZiB0aGUgY29tcGlsZXIgZGVjaWRlcyBub3QgdG8gaW5saW5lIGEgZnVuY3Rpb24gKi8KICNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0NzEwKQogLyogZmFzdGVzdCBwb3NzaWJsZSBsb2NhbCBjYWxsIHVuZGVyIE1TVkMgKi8KICNkZWZpbmUgUHlfTE9DQUwodHlwZSkgc3RhdGljIHR5cGUgX19mYXN0Y2FsbApAQCAtMjg5LDE2ICsyODksMTYgQEAKICAqLwogCiAjaWYgZGVmaW5lZChfTVNDX1ZFUikKLSNkZWZpbmUgUHlfTUVNQ1BZKHRhcmdldCwgc291cmNlLCBsZW5ndGgpIGRvIHsJCQkJXAotCQlzaXplX3QgaV8sIG5fID0gKGxlbmd0aCk7CQkJCVwKLQkJY2hhciAqdF8gPSAodm9pZCopICh0YXJnZXQpOwkJCQlcCi0JCWNvbnN0IGNoYXIgKnNfID0gKHZvaWQqKSAoc291cmNlKTsJCQlcCi0JCWlmIChuXyA+PSAxNikJCQkJCQlcCi0JCQltZW1jcHkodF8sIHNfLCBuXyk7CQkJCVwKLQkJZWxzZQkJCQkJCQlcCi0JCQlmb3IgKGlfID0gMDsgaV8gPCBuXzsgaV8rKykJCQlcCi0JCQkJdF9baV9dID0gc19baV9dOwkJCVwKLQl9IHdoaWxlICgwKQorI2RlZmluZSBQeV9NRU1DUFkodGFyZ2V0LCBzb3VyY2UsIGxlbmd0aCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzaXplX3QgaV8sIG5fID0gKGxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjaGFyICp0XyA9ICh2b2lkKikgKHRhcmdldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBjaGFyICpzXyA9ICh2b2lkKikgKHNvdXJjZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobl8gPj0gMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbWVtY3B5KHRfLCBzXywgbl8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChpXyA9IDA7IGlfIDwgbl87IGlfKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRfW2lfXSA9IHNfW2lfXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAjZWxzZQogI2RlZmluZSBQeV9NRU1DUFkgbWVtY3B5CiAjZW5kaWYKQEAgLTQyMCw3ICs0MjAsNyBAQAogICovCiAjaWZkZWYgU0lHTkVEX1JJR0hUX1NISUZUX1pFUk9fRklMTFMKICNkZWZpbmUgUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVChUWVBFLCBJLCBKKSBcCi0JKChJKSA8IDAgPyAtMS0oKC0xLShJKSkgPj4gKEopKSA6IChJKSA+PiAoSikpCisgICAgKChJKSA8IDAgPyAtMS0oKC0xLShJKSkgPj4gKEopKSA6IChJKSA+PiAoSikpCiAjZWxzZQogI2RlZmluZSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKFRZUEUsIEksIEopICgoSSkgPj4gKEopKQogI2VuZGlmCkBAIC00NDAsNyArNDQwLDcgQEAKICAqLwogI2lmZGVmIFB5X0RFQlVHCiAjZGVmaW5lIFB5X1NBRkVfRE9XTkNBU1QoVkFMVUUsIFdJREUsIE5BUlJPVykgXAotCShhc3NlcnQoKFdJREUpKE5BUlJPVykoVkFMVUUpID09IChWQUxVRSkpLCAoTkFSUk9XKShWQUxVRSkpCisgICAgKGFzc2VydCgoV0lERSkoTkFSUk9XKShWQUxVRSkgPT0gKFZBTFVFKSksIChOQVJST1cpKFZBTFVFKSkKICNlbHNlCiAjZGVmaW5lIFB5X1NBRkVfRE9XTkNBU1QoVkFMVUUsIFdJREUsIE5BUlJPVykgKE5BUlJPVykoVkFMVUUpCiAjZW5kaWYKQEAgLTQ2MCwxMyArNDYwLDEzIEBACiAjZGVmaW5lIF9QeV9TRVRfRURPTV9GT1JfTkFOKFgpIDsKICNlbmRpZgogI2RlZmluZSBQeV9TRVRfRVJSTk9fT05fTUFUSF9FUlJPUihYKSBcCi0JZG8geyBcCi0JCWlmIChlcnJubyA9PSAwKSB7IFwKLQkJCWlmICgoWCkgPT0gUHlfSFVHRV9WQUwgfHwgKFgpID09IC1QeV9IVUdFX1ZBTCkgXAotCQkJCWVycm5vID0gRVJBTkdFOyBcCi0JCQllbHNlIF9QeV9TRVRfRURPTV9GT1JfTkFOKFgpIFwKLQkJfSBcCi0JfSB3aGlsZSgwKQorICAgIGRvIHsgXAorICAgICAgICBpZiAoZXJybm8gPT0gMCkgeyBcCisgICAgICAgICAgICBpZiAoKFgpID09IFB5X0hVR0VfVkFMIHx8IChYKSA9PSAtUHlfSFVHRV9WQUwpIFwKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVSQU5HRTsgXAorICAgICAgICAgICAgZWxzZSBfUHlfU0VUX0VET01fRk9SX05BTihYKSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUoMCkKIAogLyogUHlfU0VUX0VSQU5HRV9PTl9PVkVSRkxPVyh4KQogICogQW4gYWxpYXMgb2YgUHlfU0VUX0VSUk5PX09OX01BVEhfRVJST1IgZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkuCkBAIC00ODcsMjYgKzQ4NywyNiBAQAogICogICAgVGhpcyBpc24ndCByZWxpYWJsZS4gIFNlZSBQeV9PVkVSRkxPV0VEIGNvbW1lbnRzLgogICogICAgWCBhbmQgWSBtYXkgYmUgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgogICovCi0jZGVmaW5lIFB5X0FESlVTVF9FUkFOR0UxKFgpCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKGVycm5vID09IDApIHsJCQkJCVwKLQkJCWlmICgoWCkgPT0gUHlfSFVHRV9WQUwgfHwgKFgpID09IC1QeV9IVUdFX1ZBTCkJXAotCQkJCWVycm5vID0gRVJBTkdFOwkJCQlcCi0JCX0JCQkJCQkJXAotCQllbHNlIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgKFgpID09IDAuMCkJCQlcCi0JCQllcnJubyA9IDA7CQkJCQlcCi0JfSB3aGlsZSgwKQorI2RlZmluZSBQeV9BREpVU1RfRVJBTkdFMShYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZXJybm8gPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKChYKSA9PSBQeV9IVUdFX1ZBTCB8fCAoWCkgPT0gLVB5X0hVR0VfVkFMKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgKFgpID09IDAuMCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKIAotI2RlZmluZSBQeV9BREpVU1RfRVJBTkdFMihYLCBZKQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWlmICgoWCkgPT0gUHlfSFVHRV9WQUwgfHwgKFgpID09IC1QeV9IVUdFX1ZBTCB8fAlcCi0JCSAgICAoWSkgPT0gUHlfSFVHRV9WQUwgfHwgKFkpID09IC1QeV9IVUdFX1ZBTCkgewlcCi0JCQkJaWYgKGVycm5vID09IDApCQkJCVwKLQkJCQkJZXJybm8gPSBFUkFOR0U7CQkJXAotCQl9CQkJCQkJCVwKLQkJZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKQkJCQlcCi0JCQllcnJubyA9IDA7CQkJCQlcCi0JfSB3aGlsZSgwKQorI2RlZmluZSBQeV9BREpVU1RfRVJBTkdFMihYLCBZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKFgpID09IFB5X0hVR0VfVkFMIHx8IChYKSA9PSAtUHlfSFVHRV9WQUwgfHwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKFkpID09IFB5X0hVR0VfVkFMIHx8IChZKSA9PSAtUHlfSFVHRV9WQUwpIHsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyA9IEVSQU5HRTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKIAogLyogIFRoZSBmdW5jdGlvbnMgX1B5X2RnX3N0cnRvZCBhbmQgX1B5X2RnX2R0b2EgaW4gUHl0aG9uL2R0b2EuYyAod2hpY2ggYXJlCiAgKiAgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGUgc2hvcnQgZmxvYXQgcmVwciBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjEpIHJlcXVpcmUKQEAgLTUzNSwxOCArNTM1LDE4IEBACiAjaWZkZWYgSEFWRV9HQ0NfQVNNX0ZPUl9YODcKICNkZWZpbmUgSEFWRV9QWV9TRVRfNTNCSVRfUFJFQ0lTSU9OIDEKIC8qIF9QeV9nZXQvc2V0XzM4N2NvbnRyb2x3b3JkIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBQeXRob24vcHltYXRoLmMgKi8KLSNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fSEVBREVSCQkJCVwKLQl1bnNpZ25lZCBzaG9ydCBvbGRfMzg3Y29udHJvbHdvcmQsIG5ld18zODdjb250cm9sd29yZAotI2RlZmluZSBfUHlfU0VUXzUzQklUX1BSRUNJU0lPTl9TVEFSVAkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJb2xkXzM4N2NvbnRyb2x3b3JkID0gX1B5X2dldF8zODdjb250cm9sd29yZCgpOwkJXAotCQluZXdfMzg3Y29udHJvbHdvcmQgPSAob2xkXzM4N2NvbnRyb2x3b3JkICYgfjB4MGYwMCkgfCAweDAyMDA7IFwKLQkJaWYgKG5ld18zODdjb250cm9sd29yZCAhPSBvbGRfMzg3Y29udHJvbHdvcmQpCQlcCi0JCQlfUHlfc2V0XzM4N2NvbnRyb2x3b3JkKG5ld18zODdjb250cm9sd29yZCk7CVwKLQl9IHdoaWxlICgwKQotI2RlZmluZSBfUHlfU0VUXzUzQklUX1BSRUNJU0lPTl9FTkQJCQkJXAotCWlmIChuZXdfMzg3Y29udHJvbHdvcmQgIT0gb2xkXzM4N2NvbnRyb2x3b3JkKQkJXAotCQlfUHlfc2V0XzM4N2NvbnRyb2x3b3JkKG9sZF8zODdjb250cm9sd29yZCkKKyNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgc2hvcnQgb2xkXzM4N2NvbnRyb2x3b3JkLCBuZXdfMzg3Y29udHJvbHdvcmQKKyNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkXzM4N2NvbnRyb2x3b3JkID0gX1B5X2dldF8zODdjb250cm9sd29yZCgpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3XzM4N2NvbnRyb2x3b3JkID0gKG9sZF8zODdjb250cm9sd29yZCAmIH4weDBmMDApIHwgMHgwMjAwOyBcCisgICAgICAgIGlmIChuZXdfMzg3Y29udHJvbHdvcmQgIT0gb2xkXzM4N2NvbnRyb2x3b3JkKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfUHlfc2V0XzM4N2NvbnRyb2x3b3JkKG5ld18zODdjb250cm9sd29yZCk7ICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKG5ld18zODdjb250cm9sd29yZCAhPSBvbGRfMzg3Y29udHJvbHdvcmQpICAgICAgICAgICAgICAgXAorICAgICAgICBfUHlfc2V0XzM4N2NvbnRyb2x3b3JkKG9sZF8zODdjb250cm9sd29yZCkKICNlbmRpZgogCiAvKiBkZWZhdWx0IGRlZmluaXRpb25zIGFyZSBlbXB0eSAqLwpAQCAtNTg5LDcgKzU4OSw3IEBACiAgKiAgICBleHRlcm4gaW50IHgoKSBQeV9ERVBSRUNBVEVEKDIuNSk7CiAgKi8KICNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fID49IDQpIHx8IFwKLQkJCSAgKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAxKSkKKyAgICAgICAgICAgICAgKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAxKSkKICNkZWZpbmUgUHlfREVQUkVDQVRFRChWRVJTSU9OX1VOVVNFRCkgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18pKQogI2Vsc2UKICNkZWZpbmUgUHlfREVQUkVDQVRFRChWRVJTSU9OX1VOVVNFRCkKQEAgLTYxNSw3ICs2MTUsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBIQVZFX19HRVRQVFkKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCS8qIHdlIG5lZWQgdG8gaW1wb3J0IG1vZGVfdCAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgICAgICAgICAvKiB3ZSBuZWVkIHRvIGltcG9ydCBtb2RlX3QgKi8KIGV4dGVybiBjaGFyICogX2dldHB0eShpbnQgKiwgaW50LCBtb2RlX3QsIGludCk7CiAjZW5kaWYKIApAQCAtNzE1LDcxICs3MTUsNzEgQEAKICAgbGlua2FnZSBoYW5kbGluZyBhbmQgYm90aCBvZiB0aGVzZSB1c2UgX19kZWNsc3BlYygpLgogKi8KICNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19CRU9TX18pCi0jCWRlZmluZSBIQVZFX0RFQ0xTUEVDX0RMTAorIyAgICAgICBkZWZpbmUgSEFWRV9ERUNMU1BFQ19ETEwKICNlbmRpZgogCiAvKiBvbmx5IGdldCBzcGVjaWFsIGxpbmthZ2UgaWYgYnVpbHQgYXMgc2hhcmVkIG9yIHBsYXRmb3JtIGlzIEN5Z3dpbiAqLwogI2lmIGRlZmluZWQoUHlfRU5BQkxFX1NIQVJFRCkgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotIwlpZiBkZWZpbmVkKEhBVkVfREVDTFNQRUNfRExMKQotIwkJaWZkZWYgUHlfQlVJTERfQ09SRQotIwkJCWRlZmluZSBQeUFQSV9GVU5DKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKLSMJCQlkZWZpbmUgUHlBUElfREFUQShSVFlQRSkgZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQotCQkJLyogbW9kdWxlIGluaXQgZnVuY3Rpb25zIGluc2lkZSB0aGUgY29yZSBuZWVkIG5vIGV4dGVybmFsIGxpbmthZ2UgKi8KLQkJCS8qIGV4Y2VwdCBmb3IgQ3lnd2luIHRvIGhhbmRsZSBlbWJlZGRpbmcgKEZJWE1FOiBCZU9TIHRvbz8pICovCi0jCQkJaWYgZGVmaW5lZChfX0NZR1dJTl9fKQotIwkJCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQKLSMJCQllbHNlIC8qIF9fQ1lHV0lOX18gKi8KLSMJCQkJZGVmaW5lIFB5TU9ESU5JVF9GVU5DIHZvaWQKLSMJCQllbmRpZiAvKiBfX0NZR1dJTl9fICovCi0jCQllbHNlIC8qIFB5X0JVSUxEX0NPUkUgKi8KLQkJCS8qIEJ1aWxkaW5nIGFuIGV4dGVuc2lvbiBtb2R1bGUsIG9yIGFuIGVtYmVkZGVkIHNpdHVhdGlvbiAqLwotCQkJLyogcHVibGljIFB5dGhvbiBmdW5jdGlvbnMgYW5kIGRhdGEgYXJlIGltcG9ydGVkICovCi0JCQkvKiBVbmRlciBDeWd3aW4sIGF1dG8taW1wb3J0IGZ1bmN0aW9ucyB0byBwcmV2ZW50IGNvbXBpbGF0aW9uICovCi0JCQkvKiBmYWlsdXJlcyBzaW1pbGFyIHRvIGh0dHA6Ly9weXRob24ub3JnL2RvYy9GQVEuaHRtbCMzLjI0ICovCi0jCQkJaWYgIWRlZmluZWQoX19DWUdXSU5fXykKLSMJCQkJZGVmaW5lIFB5QVBJX0ZVTkMoUlRZUEUpIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBSVFlQRQotIwkJCWVuZGlmIC8qICFfX0NZR1dJTl9fICovCi0jCQkJZGVmaW5lIFB5QVBJX0RBVEEoUlRZUEUpIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgUlRZUEUKLQkJCS8qIG1vZHVsZSBpbml0IGZ1bmN0aW9ucyBvdXRzaWRlIHRoZSBjb3JlIG11c3QgYmUgZXhwb3J0ZWQgKi8KLSMJCQlpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotIwkJCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZAotIwkJCWVsc2UgLyogX19jcGx1c3BsdXMgKi8KLSMJCQkJZGVmaW5lIFB5TU9ESU5JVF9GVU5DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkCi0jCQkJZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLSMJCWVuZGlmIC8qIFB5X0JVSUxEX0NPUkUgKi8KLSMJZW5kaWYgLyogSEFWRV9ERUNMU1BFQyAqLworIyAgICAgICBpZiBkZWZpbmVkKEhBVkVfREVDTFNQRUNfRExMKQorIyAgICAgICAgICAgICAgIGlmZGVmIFB5X0JVSUxEX0NPUkUKKyMgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeUFQSV9GVU5DKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKKyMgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeUFQSV9EQVRBKFJUWVBFKSBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCisgICAgICAgICAgICAvKiBtb2R1bGUgaW5pdCBmdW5jdGlvbnMgaW5zaWRlIHRoZSBjb3JlIG5lZWQgbm8gZXh0ZXJuYWwgbGlua2FnZSAqLworICAgICAgICAgICAgLyogZXhjZXB0IGZvciBDeWd3aW4gdG8gaGFuZGxlIGVtYmVkZGluZyAoRklYTUU6IEJlT1MgdG9vPykgKi8KKyMgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5TU9ESU5JVF9GVU5DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkCisjICAgICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIF9fQ1lHV0lOX18gKi8KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5TU9ESU5JVF9GVU5DIHZvaWQKKyMgICAgICAgICAgICAgICAgICAgICAgIGVuZGlmIC8qIF9fQ1lHV0lOX18gKi8KKyMgICAgICAgICAgICAgICBlbHNlIC8qIFB5X0JVSUxEX0NPUkUgKi8KKyAgICAgICAgICAgIC8qIEJ1aWxkaW5nIGFuIGV4dGVuc2lvbiBtb2R1bGUsIG9yIGFuIGVtYmVkZGVkIHNpdHVhdGlvbiAqLworICAgICAgICAgICAgLyogcHVibGljIFB5dGhvbiBmdW5jdGlvbnMgYW5kIGRhdGEgYXJlIGltcG9ydGVkICovCisgICAgICAgICAgICAvKiBVbmRlciBDeWd3aW4sIGF1dG8taW1wb3J0IGZ1bmN0aW9ucyB0byBwcmV2ZW50IGNvbXBpbGF0aW9uICovCisgICAgICAgICAgICAvKiBmYWlsdXJlcyBzaW1pbGFyIHRvIGh0dHA6Ly9weXRob24ub3JnL2RvYy9GQVEuaHRtbCMzLjI0ICovCisjICAgICAgICAgICAgICAgICAgICAgICBpZiAhZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlBUElfRlVOQyhSVFlQRSkgX19kZWNsc3BlYyhkbGxpbXBvcnQpIFJUWVBFCisjICAgICAgICAgICAgICAgICAgICAgICBlbmRpZiAvKiAhX19DWUdXSU5fXyAqLworIyAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5QVBJX0RBVEEoUlRZUEUpIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgUlRZUEUKKyAgICAgICAgICAgIC8qIG1vZHVsZSBpbml0IGZ1bmN0aW9ucyBvdXRzaWRlIHRoZSBjb3JlIG11c3QgYmUgZXhwb3J0ZWQgKi8KKyMgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkCisjICAgICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIF9fY3BsdXNwbHVzICovCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZAorIyAgICAgICAgICAgICAgICAgICAgICAgZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKyMgICAgICAgICAgICAgICBlbmRpZiAvKiBQeV9CVUlMRF9DT1JFICovCisjICAgICAgIGVuZGlmIC8qIEhBVkVfREVDTFNQRUMgKi8KICNlbmRpZiAvKiBQeV9FTkFCTEVfU0hBUkVEICovCiAKIC8qIElmIG5vIGV4dGVybmFsIGxpbmthZ2UgbWFjcm9zIGRlZmluZWQgYnkgbm93LCBjcmVhdGUgZGVmYXVsdHMgKi8KICNpZm5kZWYgUHlBUElfRlVOQwotIwlkZWZpbmUgUHlBUElfRlVOQyhSVFlQRSkgUlRZUEUKKyMgICAgICAgZGVmaW5lIFB5QVBJX0ZVTkMoUlRZUEUpIFJUWVBFCiAjZW5kaWYKICNpZm5kZWYgUHlBUElfREFUQQotIwlkZWZpbmUgUHlBUElfREFUQShSVFlQRSkgZXh0ZXJuIFJUWVBFCisjICAgICAgIGRlZmluZSBQeUFQSV9EQVRBKFJUWVBFKSBleHRlcm4gUlRZUEUKICNlbmRpZgogI2lmbmRlZiBQeU1PRElOSVRfRlVOQwotIwlpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotIwkJZGVmaW5lIFB5TU9ESU5JVF9GVU5DIGV4dGVybiAiQyIgdm9pZAotIwllbHNlIC8qIF9fY3BsdXNwbHVzICovCi0jCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAotIwllbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICBpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyBleHRlcm4gIkMiIHZvaWQKKyMgICAgICAgZWxzZSAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyB2b2lkCisjICAgICAgIGVuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAjZW5kaWYKIAogLyogRGVwcmVjYXRlZCBETF9JTVBPUlQgYW5kIERMX0VYUE9SVCBtYWNyb3MgKi8KICNpZiBkZWZpbmVkKFB5X0VOQUJMRV9TSEFSRUQpICYmIGRlZmluZWQgKEhBVkVfREVDTFNQRUNfRExMKQotIwlpZiBkZWZpbmVkKFB5X0JVSUxEX0NPUkUpCi0jCQlkZWZpbmUgRExfSU1QT1JUKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKLSMJCWRlZmluZSBETF9FWFBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQotIwllbHNlCi0jCQlkZWZpbmUgRExfSU1QT1JUKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgUlRZUEUKLSMJCWRlZmluZSBETF9FWFBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQotIwllbmRpZgorIyAgICAgICBpZiBkZWZpbmVkKFB5X0JVSUxEX0NPUkUpCisjICAgICAgICAgICAgICAgZGVmaW5lIERMX0lNUE9SVChSVFlQRSkgX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCisjICAgICAgICAgICAgICAgZGVmaW5lIERMX0VYUE9SVChSVFlQRSkgX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCisjICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgICBkZWZpbmUgRExfSU1QT1JUKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgUlRZUEUKKyMgICAgICAgICAgICAgICBkZWZpbmUgRExfRVhQT1JUKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKKyMgICAgICAgZW5kaWYKICNlbmRpZgogI2lmbmRlZiBETF9FWFBPUlQKLSMJZGVmaW5lIERMX0VYUE9SVChSVFlQRSkgUlRZUEUKKyMgICAgICAgZGVmaW5lIERMX0VYUE9SVChSVFlQRSkgUlRZUEUKICNlbmRpZgogI2lmbmRlZiBETF9JTVBPUlQKLSMJZGVmaW5lIERMX0lNUE9SVChSVFlQRSkgUlRZUEUKKyMgICAgICAgZGVmaW5lIERMX0lNUE9SVChSVFlQRSkgUlRZUEUKICNlbmRpZgogLyogRW5kIG9mIGRlcHJlY2F0ZWQgRExfKiBtYWNyb3MgKi8KIApAQCAtNzg4LDI3ICs3ODgsMjcgQEAKIAogI2lmIDAgLyogZGlzYWJsZWQgYW5kIHByb2JhYmx5IG9ic29sZXRlICovCiAKLSNpZm5kZWYJRkRfU0VUU0laRQotI2RlZmluZQlGRF9TRVRTSVpFCTI1NgorI2lmbmRlZiBGRF9TRVRTSVpFCisjZGVmaW5lIEZEX1NFVFNJWkUgICAgICAyNTYKICNlbmRpZgogCiAjaWZuZGVmIEZEX1NFVAogCiB0eXBlZGVmIGxvbmcgZmRfbWFzazsKIAotI2RlZmluZSBORkRCSVRTCShzaXplb2YoZmRfbWFzaykgKiBOQkJZKQkvKiBiaXRzIHBlciBtYXNrICovCisjZGVmaW5lIE5GREJJVFMgKHNpemVvZihmZF9tYXNrKSAqIE5CQlkpICAgICAgICAvKiBiaXRzIHBlciBtYXNrICovCiAjaWZuZGVmIGhvd21hbnkKLSNkZWZpbmUJaG93bWFueSh4LCB5KQkoKCh4KSsoKHkpLTEpKS8oeSkpCisjZGVmaW5lIGhvd21hbnkoeCwgeSkgICAoKCh4KSsoKHkpLTEpKS8oeSkpCiAjZW5kaWYgLyogaG93bWFueSAqLwogCi10eXBlZGVmCXN0cnVjdCBmZF9zZXQgewotCWZkX21hc2sJZmRzX2JpdHNbaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKV07Cit0eXBlZGVmIHN0cnVjdCBmZF9zZXQgeworICAgIGZkX21hc2sgICAgIGZkc19iaXRzW2hvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUyldOwogfSBmZF9zZXQ7CiAKLSNkZWZpbmUJRkRfU0VUKG4sIHApCSgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSB8PSAoMSA8PCAoKG4pICUgTkZEQklUUykpKQotI2RlZmluZQlGRF9DTFIobiwgcCkJKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICY9IH4oMSA8PCAoKG4pICUgTkZEQklUUykpKQotI2RlZmluZQlGRF9JU1NFVChuLCBwKQkoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQotI2RlZmluZSBGRF9aRVJPKHApCW1lbXNldCgoY2hhciAqKShwKSwgJ1wwJywgc2l6ZW9mKCoocCkpKQorI2RlZmluZSBGRF9TRVQobiwgcCkgICAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdIHw9ICgxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lIEZEX0NMUihuLCBwKSAgICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJj0gfigxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lIEZEX0lTU0VUKG4sIHApICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQorI2RlZmluZSBGRF9aRVJPKHApICAgICAgbWVtc2V0KChjaGFyICopKHApLCAnXDAnLCBzaXplb2YoKihwKSkpCiAKICNlbmRpZiAvKiBGRF9TRVQgKi8KIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXRob25ydW4uaCBiL0luY2x1ZGUvcHl0aG9ucnVuLmgKaW5kZXggNGNlMDUzNi4uZjhlZDcxOCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXRob25ydW4uaAorKysgYi9JbmNsdWRlL3B5dGhvbnJ1bi5oCkBAIC0xNiw3ICsxNiw3IEBACiAjZGVmaW5lIFB5Q0ZfT05MWV9BU1QgMHgwNDAwCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlpbnQgY2ZfZmxhZ3M7ICAvKiBiaXRtYXNrIG9mIENPX3h4eCBmbGFncyByZWxldmFudCB0byBmdXR1cmUgKi8KKyAgICBpbnQgY2ZfZmxhZ3M7ICAvKiBiaXRtYXNrIG9mIENPX3h4eCBmbGFncyByZWxldmFudCB0byBmdXR1cmUgKi8KIH0gUHlDb21waWxlckZsYWdzOwogCiBQeUFQSV9GVU5DKHZvaWQpIFB5X1NldFByb2dyYW1OYW1lKGNoYXIgKik7CkBAIC0zOSwzMiArMzksMzIgQEAKIFB5QVBJX0ZVTkMoaW50KSBQeVJ1bl9JbnRlcmFjdGl2ZU9uZUZsYWdzKEZJTEUgKiwgY29uc3QgY2hhciAqLCBQeUNvbXBpbGVyRmxhZ3MgKik7CiBQeUFQSV9GVU5DKGludCkgUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosIFB5Q29tcGlsZXJGbGFncyAqKTsKIAotUHlBUElfRlVOQyhzdHJ1Y3QgX21vZCAqKSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAKLQkJCQkJCSBpbnQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsCitQeUFQSV9GVU5DKHN0cnVjdCBfbW9kICopIFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKik7Ci1QeUFQSV9GVU5DKHN0cnVjdCBfbW9kICopIFB5UGFyc2VyX0FTVEZyb21GaWxlKEZJTEUgKiwgY29uc3QgY2hhciAqLCBpbnQsIAotCQkJCQkgICAgICAgY2hhciAqLCBjaGFyICosCitQeUFQSV9GVU5DKHN0cnVjdCBfbW9kICopIFB5UGFyc2VyX0FTVEZyb21GaWxlKEZJTEUgKiwgY29uc3QgY2hhciAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgY2hhciAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKiwgaW50ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKik7CiAjZGVmaW5lIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nKFMsIEIpIFwKLSAgICAgICAgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhTLCBCLCAwKQorICAgIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3MoUywgQiwgMCkKICNkZWZpbmUgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlKEZQLCBTLCBCKSBcCi0gICAgICAgIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzKEZQLCBTLCBCLCAwKQotUHlBUElfRlVOQyhzdHJ1Y3QgX25vZGUgKikgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhjb25zdCBjaGFyICosIGludCwgCi0JCQkJCQkJICBpbnQpOworICAgIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzKEZQLCBTLCBCLCAwKQorUHlBUElfRlVOQyhzdHJ1Y3QgX25vZGUgKikgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhjb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpOwogUHlBUElfRlVOQyhzdHJ1Y3QgX25vZGUgKikgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosCi0JCQkJCQkJaW50LCBpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIGludCk7CiAKLVB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlSdW5fU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqLCBpbnQsIFB5T2JqZWN0ICosIAotCQkJCQkgUHlPYmplY3QgKiwgUHlDb21waWxlckZsYWdzICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVJ1bl9TdHJpbmdGbGFncyhjb25zdCBjaGFyICosIGludCwgUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlDb21waWxlckZsYWdzICopOwogCi1QeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5UnVuX0ZpbGVFeEZsYWdzKEZJTEUgKiwgY29uc3QgY2hhciAqLCBpbnQsIAotCQkJCQkgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgaW50LCAKLQkJCQkJIFB5Q29tcGlsZXJGbGFncyAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlSdW5fRmlsZUV4RmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKik7CiAKICNkZWZpbmUgUHlfQ29tcGlsZVN0cmluZyhzdHIsIHAsIHMpIFB5X0NvbXBpbGVTdHJpbmdGbGFncyhzdHIsIHAsIHMsIE5VTEwpCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5X0NvbXBpbGVTdHJpbmdGbGFncyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LAotCQkJCQkgICAgIFB5Q29tcGlsZXJGbGFncyAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqKTsKIFB5QVBJX0ZVTkMoc3RydWN0IHN5bXRhYmxlICopIFB5X1N5bXRhYmxlU3RyaW5nKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOwogCiBQeUFQSV9GVU5DKHZvaWQpIFB5RXJyX1ByaW50KHZvaWQpOwpAQCAtODQsMjAgKzg0LDIwIEBACiAjZGVmaW5lIFB5UnVuX1N0cmluZyhzdHIsIHMsIGcsIGwpIFB5UnVuX1N0cmluZ0ZsYWdzKHN0ciwgcywgZywgbCwgTlVMTCkKICNkZWZpbmUgUHlSdW5fQW55RmlsZShmcCwgbmFtZSkgUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIE5VTEwpCiAjZGVmaW5lIFB5UnVuX0FueUZpbGVFeChmcCwgbmFtZSwgY2xvc2VpdCkgXAotCVB5UnVuX0FueUZpbGVFeEZsYWdzKGZwLCBuYW1lLCBjbG9zZWl0LCBOVUxMKQorICAgIFB5UnVuX0FueUZpbGVFeEZsYWdzKGZwLCBuYW1lLCBjbG9zZWl0LCBOVUxMKQogI2RlZmluZSBQeVJ1bl9BbnlGaWxlRmxhZ3MoZnAsIG5hbWUsIGZsYWdzKSBcCi0JUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIGZsYWdzKQorICAgIFB5UnVuX0FueUZpbGVFeEZsYWdzKGZwLCBuYW1lLCAwLCBmbGFncykKICNkZWZpbmUgUHlSdW5fU2ltcGxlU3RyaW5nKHMpIFB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzKHMsIE5VTEwpCiAjZGVmaW5lIFB5UnVuX1NpbXBsZUZpbGUoZiwgcCkgUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgMCwgTlVMTCkKICNkZWZpbmUgUHlSdW5fU2ltcGxlRmlsZUV4KGYsIHAsIGMpIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKGYsIHAsIGMsIE5VTEwpCiAjZGVmaW5lIFB5UnVuX0ludGVyYWN0aXZlT25lKGYsIHApIFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoZiwgcCwgTlVMTCkKICNkZWZpbmUgUHlSdW5fSW50ZXJhY3RpdmVMb29wKGYsIHApIFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzKGYsIHAsIE5VTEwpCiAjZGVmaW5lIFB5UnVuX0ZpbGUoZnAsIHAsIHMsIGcsIGwpIFwKLSAgICAgICAgUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIE5VTEwpCisgICAgUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIE5VTEwpCiAjZGVmaW5lIFB5UnVuX0ZpbGVFeChmcCwgcCwgcywgZywgbCwgYykgXAotICAgICAgICBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgYywgTlVMTCkKKyAgICBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgYywgTlVMTCkKICNkZWZpbmUgUHlSdW5fRmlsZUZsYWdzKGZwLCBwLCBzLCBnLCBsLCBmbGFncykgXAotICAgICAgICBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgMCwgZmxhZ3MpCisgICAgUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIGZsYWdzKQogCiAvKiBJbiBnZXRwYXRoLmMgKi8KIFB5QVBJX0ZVTkMoY2hhciAqKSBQeV9HZXRQcm9ncmFtRnVsbFBhdGgodm9pZCk7CmRpZmYgLS1naXQgYS9JbmNsdWRlL3NldG9iamVjdC5oIGIvSW5jbHVkZS9zZXRvYmplY3QuaAppbmRleCA5MmFkZjUyLi41MmIwN2Q1IDEwMDY0NAotLS0gYS9JbmNsdWRlL3NldG9iamVjdC5oCisrKyBiL0luY2x1ZGUvc2V0b2JqZWN0LmgKQEAgLTIyLDggKzIyLDggQEAKICNkZWZpbmUgUHlTZXRfTUlOU0laRSA4CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlsb25nIGhhc2g7ICAgICAgLyogY2FjaGVkIGhhc2ggY29kZSBmb3IgdGhlIGVudHJ5IGtleSAqLwotCVB5T2JqZWN0ICprZXk7CisgICAgbG9uZyBoYXNoOyAgICAgIC8qIGNhY2hlZCBoYXNoIGNvZGUgZm9yIHRoZSBlbnRyeSBrZXkgKi8KKyAgICBQeU9iamVjdCAqa2V5OwogfSBzZXRlbnRyeTsKIAogCkBAIC0zMywyNyArMzMsMjcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgX3NldG9iamVjdCBQeVNldE9iamVjdDsKIHN0cnVjdCBfc2V0b2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3RfSEVBRAogCi0JUHlfc3NpemVfdCBmaWxsOyAgLyogIyBBY3RpdmUgKyAjIER1bW15ICovCi0JUHlfc3NpemVfdCB1c2VkOyAgLyogIyBBY3RpdmUgKi8KKyAgICBQeV9zc2l6ZV90IGZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KKyAgICBQeV9zc2l6ZV90IHVzZWQ7ICAvKiAjIEFjdGl2ZSAqLwogCi0JLyogVGhlIHRhYmxlIGNvbnRhaW5zIG1hc2sgKyAxIHNsb3RzLCBhbmQgdGhhdCdzIGEgcG93ZXIgb2YgMi4KLQkgKiBXZSBzdG9yZSB0aGUgbWFzayBpbnN0ZWFkIG9mIHRoZSBzaXplIGJlY2F1c2UgdGhlIG1hc2sgaXMgbW9yZQotCSAqIGZyZXF1ZW50bHkgbmVlZGVkLgotCSAqLwotCVB5X3NzaXplX3QgbWFzazsKKyAgICAvKiBUaGUgdGFibGUgY29udGFpbnMgbWFzayArIDEgc2xvdHMsIGFuZCB0aGF0J3MgYSBwb3dlciBvZiAyLgorICAgICAqIFdlIHN0b3JlIHRoZSBtYXNrIGluc3RlYWQgb2YgdGhlIHNpemUgYmVjYXVzZSB0aGUgbWFzayBpcyBtb3JlCisgICAgICogZnJlcXVlbnRseSBuZWVkZWQuCisgICAgICovCisgICAgUHlfc3NpemVfdCBtYXNrOwogCi0JLyogdGFibGUgcG9pbnRzIHRvIHNtYWxsdGFibGUgZm9yIHNtYWxsIHRhYmxlcywgZWxzZSB0bwotCSAqIGFkZGl0aW9uYWwgbWFsbG9jJ2VkIG1lbW9yeS4gIHRhYmxlIGlzIG5ldmVyIE5VTEwhICBUaGlzIHJ1bGUKLQkgKiBzYXZlcyByZXBlYXRlZCBydW50aW1lIG51bGwtdGVzdHMuCi0JICovCi0Jc2V0ZW50cnkgKnRhYmxlOwotCXNldGVudHJ5ICooKmxvb2t1cCkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOwotCXNldGVudHJ5IHNtYWxsdGFibGVbUHlTZXRfTUlOU0laRV07CisgICAgLyogdGFibGUgcG9pbnRzIHRvIHNtYWxsdGFibGUgZm9yIHNtYWxsIHRhYmxlcywgZWxzZSB0bworICAgICAqIGFkZGl0aW9uYWwgbWFsbG9jJ2VkIG1lbW9yeS4gIHRhYmxlIGlzIG5ldmVyIE5VTEwhICBUaGlzIHJ1bGUKKyAgICAgKiBzYXZlcyByZXBlYXRlZCBydW50aW1lIG51bGwtdGVzdHMuCisgICAgICovCisgICAgc2V0ZW50cnkgKnRhYmxlOworICAgIHNldGVudHJ5ICooKmxvb2t1cCkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOworICAgIHNldGVudHJ5IHNtYWxsdGFibGVbUHlTZXRfTUlOU0laRV07CiAKLQlsb25nIGhhc2g7CQkvKiBvbmx5IHVzZWQgYnkgZnJvemVuc2V0IG9iamVjdHMgKi8KLQlQeU9iamVjdCAqd2Vha3JlZmxpc3Q7CS8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCisgICAgbG9uZyBoYXNoOyAgICAgICAgICAgICAgICAgIC8qIG9ubHkgdXNlZCBieSBmcm96ZW5zZXQgb2JqZWN0cyAqLworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgICAgICAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwogfTsKIAogUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5U2V0X1R5cGU7CkBAIC02OCwxNyArNjgsMTcgQEAKIAogI2RlZmluZSBQeUZyb3plblNldF9DaGVja0V4YWN0KG9iKSAoUHlfVFlQRShvYikgPT0gJlB5RnJvemVuU2V0X1R5cGUpCiAjZGVmaW5lIFB5QW55U2V0X0NoZWNrRXhhY3Qob2IpIFwKLQkoUHlfVFlQRShvYikgPT0gJlB5U2V0X1R5cGUgfHwgUHlfVFlQRShvYikgPT0gJlB5RnJvemVuU2V0X1R5cGUpCisgICAgKFB5X1RZUEUob2IpID09ICZQeVNldF9UeXBlIHx8IFB5X1RZUEUob2IpID09ICZQeUZyb3plblNldF9UeXBlKQogI2RlZmluZSBQeUFueVNldF9DaGVjayhvYikgXAotCShQeV9UWVBFKG9iKSA9PSAmUHlTZXRfVHlwZSB8fCBQeV9UWVBFKG9iKSA9PSAmUHlGcm96ZW5TZXRfVHlwZSB8fCBcCi0JICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlTZXRfVHlwZSkgfHwgXAotCSAgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgJlB5RnJvemVuU2V0X1R5cGUpKQorICAgIChQeV9UWVBFKG9iKSA9PSAmUHlTZXRfVHlwZSB8fCBQeV9UWVBFKG9iKSA9PSAmUHlGcm96ZW5TZXRfVHlwZSB8fCBcCisgICAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlTZXRfVHlwZSkgfHwgXAorICAgICAgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgJlB5RnJvemVuU2V0X1R5cGUpKQogI2RlZmluZSBQeVNldF9DaGVjayhvYikgXAotCShQeV9UWVBFKG9iKSA9PSAmUHlTZXRfVHlwZSB8fCBcCi0JUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgJlB5U2V0X1R5cGUpKQorICAgIChQeV9UWVBFKG9iKSA9PSAmUHlTZXRfVHlwZSB8fCBcCisgICAgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgJlB5U2V0X1R5cGUpKQogI2RlZmluZSAgIFB5RnJvemVuU2V0X0NoZWNrKG9iKSBcCi0JKFB5X1RZUEUob2IpID09ICZQeUZyb3plblNldF9UeXBlIHx8IFwKLQkgIFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYiksICZQeUZyb3plblNldF9UeXBlKSkKKyAgICAoUHlfVFlQRShvYikgPT0gJlB5RnJvemVuU2V0X1R5cGUgfHwgXAorICAgICAgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgJlB5RnJvemVuU2V0X1R5cGUpKQogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2V0X05ldyhQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGcm96ZW5TZXRfTmV3KFB5T2JqZWN0ICopOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9zdHJ1Y3RtZW1iZXIuaCBiL0luY2x1ZGUvc3RydWN0bWVtYmVyLmgKaW5kZXggMWYyNmI0Mi4uZmU1YjQ0ZSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zdHJ1Y3RtZW1iZXIuaAorKysgYi9JbmNsdWRlL3N0cnVjdG1lbWJlci5oCkBAIC0yNiw1MCArMjYsNTAgQEAKICAgIHBvaW50ZXIgaXMgTlVMTC4gKi8KIAogc3RydWN0IG1lbWJlcmxpc3QgewotCS8qIE9ic29sZXRlIHZlcnNpb24sIGZvciBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLQljaGFyICpuYW1lOwotCWludCB0eXBlOwotCWludCBvZmZzZXQ7Ci0JaW50IGZsYWdzOworICAgIC8qIE9ic29sZXRlIHZlcnNpb24sIGZvciBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyAgICBjaGFyICpuYW1lOworICAgIGludCB0eXBlOworICAgIGludCBvZmZzZXQ7CisgICAgaW50IGZsYWdzOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgUHlNZW1iZXJEZWYgewotCS8qIEN1cnJlbnQgdmVyc2lvbiwgdXNlIHRoaXMgKi8KLQljaGFyICpuYW1lOwotCWludCB0eXBlOwotCVB5X3NzaXplX3Qgb2Zmc2V0OwotCWludCBmbGFnczsKLQljaGFyICpkb2M7CisgICAgLyogQ3VycmVudCB2ZXJzaW9uLCB1c2UgdGhpcyAqLworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IHR5cGU7CisgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgaW50IGZsYWdzOworICAgIGNoYXIgKmRvYzsKIH0gUHlNZW1iZXJEZWY7CiAKIC8qIFR5cGVzICovCi0jZGVmaW5lIFRfU0hPUlQJCTAKLSNkZWZpbmUgVF9JTlQJCTEKLSNkZWZpbmUgVF9MT05HCQkyCi0jZGVmaW5lIFRfRkxPQVQJCTMKLSNkZWZpbmUgVF9ET1VCTEUJNAotI2RlZmluZSBUX1NUUklORwk1Ci0jZGVmaW5lIFRfT0JKRUNUCTYKKyNkZWZpbmUgVF9TSE9SVCAgICAgICAgIDAKKyNkZWZpbmUgVF9JTlQgICAgICAgICAgIDEKKyNkZWZpbmUgVF9MT05HICAgICAgICAgIDIKKyNkZWZpbmUgVF9GTE9BVCAgICAgICAgIDMKKyNkZWZpbmUgVF9ET1VCTEUgICAgICAgIDQKKyNkZWZpbmUgVF9TVFJJTkcgICAgICAgIDUKKyNkZWZpbmUgVF9PQkpFQ1QgICAgICAgIDYKIC8qIFhYWCB0aGUgb3JkZXJpbmcgaGVyZSBpcyB3ZWlyZCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgVF9DSEFSCQk3CS8qIDEtY2hhcmFjdGVyIHN0cmluZyAqLwotI2RlZmluZSBUX0JZVEUJCTgJLyogOC1iaXQgc2lnbmVkIGludCAqLworI2RlZmluZSBUX0NIQVIgICAgICAgICAgNyAgICAgICAvKiAxLWNoYXJhY3RlciBzdHJpbmcgKi8KKyNkZWZpbmUgVF9CWVRFICAgICAgICAgIDggICAgICAgLyogOC1iaXQgc2lnbmVkIGludCAqLwogLyogdW5zaWduZWQgdmFyaWFudHM6ICovCi0jZGVmaW5lIFRfVUJZVEUJCTkKLSNkZWZpbmUgVF9VU0hPUlQJMTAKLSNkZWZpbmUgVF9VSU5UCQkxMQotI2RlZmluZSBUX1VMT05HCQkxMgorI2RlZmluZSBUX1VCWVRFICAgICAgICAgOQorI2RlZmluZSBUX1VTSE9SVCAgICAgICAgMTAKKyNkZWZpbmUgVF9VSU5UICAgICAgICAgIDExCisjZGVmaW5lIFRfVUxPTkcgICAgICAgICAxMgogCiAvKiBBZGRlZCBieSBKYWNrOiBzdHJpbmdzIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlICovCi0jZGVmaW5lIFRfU1RSSU5HX0lOUExBQ0UJMTMKKyNkZWZpbmUgVF9TVFJJTkdfSU5QTEFDRSAgICAgICAgMTMKIAogLyogQWRkZWQgYnkgTGlsbG86IGJvb2xzIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlIChhc3N1bWVkIGNoYXIpICovCi0jZGVmaW5lIFRfQk9PTAkJMTQKKyNkZWZpbmUgVF9CT09MICAgICAgICAgIDE0CiAKLSNkZWZpbmUgVF9PQkpFQ1RfRVgJMTYJLyogTGlrZSBUX09CSkVDVCwgYnV0IHJhaXNlcyBBdHRyaWJ1dGVFcnJvcgotCQkJCSAgIHdoZW4gdGhlIHZhbHVlIGlzIE5VTEwsIGluc3RlYWQgb2YKLQkJCQkgICBjb252ZXJ0aW5nIHRvIE5vbmUuICovCisjZGVmaW5lIFRfT0JKRUNUX0VYICAgICAxNiAgICAgIC8qIExpa2UgVF9PQkpFQ1QsIGJ1dCByYWlzZXMgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB2YWx1ZSBpcyBOVUxMLCBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgY29udmVydGluZyB0byBOb25lLiAqLwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0jZGVmaW5lIFRfTE9OR0xPTkcgICAgICAxNyAgCisjZGVmaW5lIFRfTE9OR0xPTkcgICAgICAxNwogI2RlZmluZSBUX1VMT05HTE9ORyAgICAgIDE4CiAjZW5kaWYgLyogSEFWRV9MT05HX0xPTkcgKi8KIApAQCAtNzcsMTEgKzc3LDExIEBACiAKIAogLyogRmxhZ3MgKi8KLSNkZWZpbmUgUkVBRE9OTFkJMQotI2RlZmluZSBSTwkJUkVBRE9OTFkJCS8qIFNob3J0aGFuZCAqLwotI2RlZmluZSBSRUFEX1JFU1RSSUNURUQJMgorI2RlZmluZSBSRUFET05MWSAgICAgICAgMQorI2RlZmluZSBSTyAgICAgICAgICAgICAgUkVBRE9OTFkgICAgICAgICAgICAgICAgLyogU2hvcnRoYW5kICovCisjZGVmaW5lIFJFQURfUkVTVFJJQ1RFRCAyCiAjZGVmaW5lIFBZX1dSSVRFX1JFU1RSSUNURUQgNAotI2RlZmluZSBSRVNUUklDVEVECShSRUFEX1JFU1RSSUNURUQgfCBQWV9XUklURV9SRVNUUklDVEVEKQorI2RlZmluZSBSRVNUUklDVEVEICAgICAgKFJFQURfUkVTVFJJQ1RFRCB8IFBZX1dSSVRFX1JFU1RSSUNURUQpCiAKIAogLyogT2Jzb2xldGUgQVBJLCBmb3IgYmluYXJ5IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3N5bXRhYmxlLmggYi9JbmNsdWRlL3N5bXRhYmxlLmgKaW5kZXggMDgxZmQzYi4uZTBhMGJlNCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zeW10YWJsZS5oCisrKyBiL0luY2x1ZGUvc3ltdGFibGUuaApAQCAtMTEsMzkgKzExLDM5IEBACiBzdHJ1Y3QgX3N5bXRhYmxlX2VudHJ5OwogCiBzdHJ1Y3Qgc3ltdGFibGUgewotCWNvbnN0IGNoYXIgKnN0X2ZpbGVuYW1lOyAvKiBuYW1lIG9mIGZpbGUgYmVpbmcgY29tcGlsZWQgKi8KLQlzdHJ1Y3QgX3N5bXRhYmxlX2VudHJ5ICpzdF9jdXI7IC8qIGN1cnJlbnQgc3ltYm9sIHRhYmxlIGVudHJ5ICovCi0Jc3RydWN0IF9zeW10YWJsZV9lbnRyeSAqc3RfdG9wOyAvKiBtb2R1bGUgZW50cnkgKi8KLQlQeU9iamVjdCAqc3Rfc3ltYm9sczsgICAgLyogZGljdGlvbmFyeSBvZiBzeW1ib2wgdGFibGUgZW50cmllcyAqLwotICAgICAgICBQeU9iamVjdCAqc3Rfc3RhY2s7ICAgICAgLyogc3RhY2sgb2YgbmFtZXNwYWNlIGluZm8gKi8KLQlQeU9iamVjdCAqc3RfZ2xvYmFsOyAgICAgLyogYm9ycm93ZWQgcmVmIHRvIE1PRFVMRSBpbiBzdF9zeW1ib2xzICovCi0JaW50IHN0X25ibG9ja3M7ICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKi8KLQlQeU9iamVjdCAqc3RfcHJpdmF0ZTsgICAgICAgIC8qIG5hbWUgb2YgY3VycmVudCBjbGFzcyBvciBOVUxMICovCi0JUHlGdXR1cmVGZWF0dXJlcyAqc3RfZnV0dXJlOyAvKiBtb2R1bGUncyBmdXR1cmUgZmVhdHVyZXMgKi8KKyAgICBjb25zdCBjaGFyICpzdF9maWxlbmFtZTsgLyogbmFtZSBvZiBmaWxlIGJlaW5nIGNvbXBpbGVkICovCisgICAgc3RydWN0IF9zeW10YWJsZV9lbnRyeSAqc3RfY3VyOyAvKiBjdXJyZW50IHN5bWJvbCB0YWJsZSBlbnRyeSAqLworICAgIHN0cnVjdCBfc3ltdGFibGVfZW50cnkgKnN0X3RvcDsgLyogbW9kdWxlIGVudHJ5ICovCisgICAgUHlPYmplY3QgKnN0X3N5bWJvbHM7ICAgIC8qIGRpY3Rpb25hcnkgb2Ygc3ltYm9sIHRhYmxlIGVudHJpZXMgKi8KKyAgICBQeU9iamVjdCAqc3Rfc3RhY2s7ICAgICAgLyogc3RhY2sgb2YgbmFtZXNwYWNlIGluZm8gKi8KKyAgICBQeU9iamVjdCAqc3RfZ2xvYmFsOyAgICAgLyogYm9ycm93ZWQgcmVmIHRvIE1PRFVMRSBpbiBzdF9zeW1ib2xzICovCisgICAgaW50IHN0X25ibG9ja3M7ICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICBQeU9iamVjdCAqc3RfcHJpdmF0ZTsgICAgICAgIC8qIG5hbWUgb2YgY3VycmVudCBjbGFzcyBvciBOVUxMICovCisgICAgUHlGdXR1cmVGZWF0dXJlcyAqc3RfZnV0dXJlOyAvKiBtb2R1bGUncyBmdXR1cmUgZmVhdHVyZXMgKi8KIH07CiAKIHR5cGVkZWYgc3RydWN0IF9zeW10YWJsZV9lbnRyeSB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpzdGVfaWQ7ICAgICAgICAvKiBpbnQ6IGtleSBpbiBzdF9zeW1ib2xzICovCi0JUHlPYmplY3QgKnN0ZV9zeW1ib2xzOyAgIC8qIGRpY3Q6IG5hbWUgdG8gZmxhZ3MgKi8KLQlQeU9iamVjdCAqc3RlX25hbWU7ICAgICAgLyogc3RyaW5nOiBuYW1lIG9mIGJsb2NrICovCi0JUHlPYmplY3QgKnN0ZV92YXJuYW1lczsgIC8qIGxpc3Qgb2YgdmFyaWFibGUgbmFtZXMgKi8KLQlQeU9iamVjdCAqc3RlX2NoaWxkcmVuOyAgLyogbGlzdCBvZiBjaGlsZCBpZHMgKi8KLQlfUHlfYmxvY2tfdHkgc3RlX3R5cGU7ICAgLyogbW9kdWxlLCBjbGFzcywgb3IgZnVuY3Rpb24gKi8KLQlpbnQgc3RlX3Vub3B0aW1pemVkOyAgICAgLyogZmFsc2UgaWYgbmFtZXNwYWNlIGlzIG9wdGltaXplZCAqLwotCWludCBzdGVfbmVzdGVkOyAgICAgIC8qIHRydWUgaWYgYmxvY2sgaXMgbmVzdGVkICovCi0JdW5zaWduZWQgc3RlX2ZyZWUgOiAxOyAgICAgICAgLyogdHJ1ZSBpZiBibG9jayBoYXMgZnJlZSB2YXJpYWJsZXMgKi8KLQl1bnNpZ25lZCBzdGVfY2hpbGRfZnJlZSA6IDE7ICAvKiB0cnVlIGlmIGEgY2hpbGQgYmxvY2sgaGFzIGZyZWUgdmFycywKLQkJCQkgICAgICAgICBpbmNsdWRpbmcgZnJlZSByZWZzIHRvIGdsb2JhbHMgKi8KLQl1bnNpZ25lZCBzdGVfZ2VuZXJhdG9yIDogMTsgICAvKiB0cnVlIGlmIG5hbWVzcGFjZSBpcyBhIGdlbmVyYXRvciAqLwotCXVuc2lnbmVkIHN0ZV92YXJhcmdzIDogMTsgICAgIC8qIHRydWUgaWYgYmxvY2sgaGFzIHZhcmFyZ3MgKi8KLQl1bnNpZ25lZCBzdGVfdmFya2V5d29yZHMgOiAxOyAvKiB0cnVlIGlmIGJsb2NrIGhhcyB2YXJrZXl3b3JkcyAqLwotCXVuc2lnbmVkIHN0ZV9yZXR1cm5zX3ZhbHVlIDogMTsgIC8qIHRydWUgaWYgbmFtZXNwYWNlIHVzZXMgcmV0dXJuIHdpdGgKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBhcmd1bWVudCAqLwotCWludCBzdGVfbGluZW5vOyAgICAgICAgICAvKiBmaXJzdCBsaW5lIG9mIGJsb2NrICovCi0JaW50IHN0ZV9vcHRfbGluZW5vOyAgICAgIC8qIGxpbmVubyBvZiBsYXN0IGV4ZWMgb3IgaW1wb3J0ICogKi8KLQlpbnQgc3RlX3RtcG5hbWU7ICAgICAgICAgLyogY291bnRlciBmb3IgbGlzdGNvbXAgdGVtcCB2YXJzICovCi0Jc3RydWN0IHN5bXRhYmxlICpzdGVfdGFibGU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpzdGVfaWQ7ICAgICAgICAvKiBpbnQ6IGtleSBpbiBzdF9zeW1ib2xzICovCisgICAgUHlPYmplY3QgKnN0ZV9zeW1ib2xzOyAgIC8qIGRpY3Q6IG5hbWUgdG8gZmxhZ3MgKi8KKyAgICBQeU9iamVjdCAqc3RlX25hbWU7ICAgICAgLyogc3RyaW5nOiBuYW1lIG9mIGJsb2NrICovCisgICAgUHlPYmplY3QgKnN0ZV92YXJuYW1lczsgIC8qIGxpc3Qgb2YgdmFyaWFibGUgbmFtZXMgKi8KKyAgICBQeU9iamVjdCAqc3RlX2NoaWxkcmVuOyAgLyogbGlzdCBvZiBjaGlsZCBpZHMgKi8KKyAgICBfUHlfYmxvY2tfdHkgc3RlX3R5cGU7ICAgLyogbW9kdWxlLCBjbGFzcywgb3IgZnVuY3Rpb24gKi8KKyAgICBpbnQgc3RlX3Vub3B0aW1pemVkOyAgICAgLyogZmFsc2UgaWYgbmFtZXNwYWNlIGlzIG9wdGltaXplZCAqLworICAgIGludCBzdGVfbmVzdGVkOyAgICAgIC8qIHRydWUgaWYgYmxvY2sgaXMgbmVzdGVkICovCisgICAgdW5zaWduZWQgc3RlX2ZyZWUgOiAxOyAgICAgICAgLyogdHJ1ZSBpZiBibG9jayBoYXMgZnJlZSB2YXJpYWJsZXMgKi8KKyAgICB1bnNpZ25lZCBzdGVfY2hpbGRfZnJlZSA6IDE7ICAvKiB0cnVlIGlmIGEgY2hpbGQgYmxvY2sgaGFzIGZyZWUgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgZnJlZSByZWZzIHRvIGdsb2JhbHMgKi8KKyAgICB1bnNpZ25lZCBzdGVfZ2VuZXJhdG9yIDogMTsgICAvKiB0cnVlIGlmIG5hbWVzcGFjZSBpcyBhIGdlbmVyYXRvciAqLworICAgIHVuc2lnbmVkIHN0ZV92YXJhcmdzIDogMTsgICAgIC8qIHRydWUgaWYgYmxvY2sgaGFzIHZhcmFyZ3MgKi8KKyAgICB1bnNpZ25lZCBzdGVfdmFya2V5d29yZHMgOiAxOyAvKiB0cnVlIGlmIGJsb2NrIGhhcyB2YXJrZXl3b3JkcyAqLworICAgIHVuc2lnbmVkIHN0ZV9yZXR1cm5zX3ZhbHVlIDogMTsgIC8qIHRydWUgaWYgbmFtZXNwYWNlIHVzZXMgcmV0dXJuIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBhcmd1bWVudCAqLworICAgIGludCBzdGVfbGluZW5vOyAgICAgICAgICAvKiBmaXJzdCBsaW5lIG9mIGJsb2NrICovCisgICAgaW50IHN0ZV9vcHRfbGluZW5vOyAgICAgIC8qIGxpbmVubyBvZiBsYXN0IGV4ZWMgb3IgaW1wb3J0ICogKi8KKyAgICBpbnQgc3RlX3RtcG5hbWU7ICAgICAgICAgLyogY291bnRlciBmb3IgbGlzdGNvbXAgdGVtcCB2YXJzICovCisgICAgc3RydWN0IHN5bXRhYmxlICpzdGVfdGFibGU7CiB9IFB5U1RFbnRyeU9iamVjdDsKIAogUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5U1RFbnRyeV9UeXBlOwpAQCAtNTIsOCArNTIsOCBAQAogCiBQeUFQSV9GVU5DKGludCkgUHlTVF9HZXRTY29wZShQeVNURW50cnlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKLVB5QVBJX0ZVTkMoc3RydWN0IHN5bXRhYmxlICopIFB5U3ltdGFibGVfQnVpbGQobW9kX3R5LCBjb25zdCBjaGFyICosIAotCQkJCQkgICAgICBQeUZ1dHVyZUZlYXR1cmVzICopOworUHlBUElfRlVOQyhzdHJ1Y3Qgc3ltdGFibGUgKikgUHlTeW10YWJsZV9CdWlsZChtb2RfdHksIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUZ1dHVyZUZlYXR1cmVzICopOwogUHlBUElfRlVOQyhQeVNURW50cnlPYmplY3QgKikgUHlTeW10YWJsZV9Mb29rdXAoc3RydWN0IHN5bXRhYmxlICosIHZvaWQgKik7CiAKIFB5QVBJX0ZVTkModm9pZCkgUHlTeW10YWJsZV9GcmVlKHN0cnVjdCBzeW10YWJsZSAqKTsKQEAgLTcxLDcgKzcxLDcgQEAKICNkZWZpbmUgREVGX0JPVU5EIChERUZfTE9DQUwgfCBERUZfUEFSQU0gfCBERUZfSU1QT1JUKQogCiAvKiBHTE9CQUxfRVhQTElDSVQgYW5kIEdMT0JBTF9JTVBMSUNJVCBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBzeW1ib2wKLSAgIHRhYmxlLiAgR0xPQkFMIGlzIHJldHVybmVkIGZyb20gUHlTVF9HZXRTY29wZSgpIGZvciBlaXRoZXIgb2YgdGhlbS4gCisgICB0YWJsZS4gIEdMT0JBTCBpcyByZXR1cm5lZCBmcm9tIFB5U1RfR2V0U2NvcGUoKSBmb3IgZWl0aGVyIG9mIHRoZW0uCiAgICBJdCBpcyBzdG9yZWQgaW4gc3RlX3N5bWJvbHMgYXQgYml0cyAxMi0xNC4KICovCiAjZGVmaW5lIFNDT1BFX09GRiAxMQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmggYi9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaAppbmRleCBiM2ZlMmY3Li45YWI3MjRhIDEwMDY0NAotLS0gYS9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaAorKysgYi9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaApAQCAtMjgsMTQgKzI4LDE0IEBACiAgKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFRoaXMgVW5pY29kZSBTdHJpbmcgVHlwZSBpcwotICogCisgKgogICogQ29weXJpZ2h0IChjKSAxOTk5IGJ5IFNlY3JldCBMYWJzIEFCCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgYnkgRnJlZHJpayBMdW5kaAotICogCisgKgogICogQnkgb2J0YWluaW5nLCB1c2luZywgYW5kL29yIGNvcHlpbmcgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgaXRzCiAgKiBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24sIHlvdSBhZ3JlZSB0aGF0IHlvdSBoYXZlIHJlYWQsIHVuZGVyc3Rvb2QsCiAgKiBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zOgotICogCisgKgogICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAgKiBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkKICAqIGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwKQEAgLTQ0LDcgKzQ0LDcgQEAKICAqIEFCIG9yIHRoZSBhdXRob3Igbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KICAqIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgogICogcGVybWlzc2lvbi4KLSAqIAorICoKICAqIFNFQ1JFVCBMQUJTIEFCIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwogICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAogICogRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIFNFQ1JFVCBMQUJTIEFCIE9SIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgpAQCAtMTI0LDEwICsxMjQsMTAgQEAKICAqIFVzZSB0aGlzIHR5cGVkZWYgd2hlbiB5b3UgbmVlZCB0byByZXByZXNlbnQgYSBVVEYtMTYgc3Vycm9nYXRlIHBhaXIKICAqIGFzIHNpbmdsZSB1bnNpZ25lZCBpbnRlZ2VyLgogICovCi0jaWYgU0laRU9GX0lOVCA+PSA0IAotdHlwZWRlZiB1bnNpZ25lZCBpbnQgUHlfVUNTNDsgCisjaWYgU0laRU9GX0lOVCA+PSA0Cit0eXBlZGVmIHVuc2lnbmVkIGludCBQeV9VQ1M0OwogI2VsaWYgU0laRU9GX0xPTkcgPj0gNAotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFB5X1VDUzQ7IAordHlwZWRlZiB1bnNpZ25lZCBsb25nIFB5X1VDUzQ7CiAjZW5kaWYKIAogLyogUHlfVU5JQ09ERSBpcyB0aGUgbmF0aXZlIFVuaWNvZGUgc3RvcmFnZSBmb3JtYXQgKGNvZGUgdW5pdCkgdXNlZCBieQpAQCAtMzYxLDcgKzM2MSw3IEBACiAKICAqLwogI2RlZmluZSBQeV9VTklDT0RFX0lTU1BBQ0UoY2gpIFwKLQkoKGNoKSA8IDEyOFUgPyBfUHlfYXNjaWlfd2hpdGVzcGFjZVsoY2gpXSA6IF9QeVVuaWNvZGVfSXNXaGl0ZXNwYWNlKGNoKSkKKyAgICAoKGNoKSA8IDEyOFUgPyBfUHlfYXNjaWlfd2hpdGVzcGFjZVsoY2gpXSA6IF9QeVVuaWNvZGVfSXNXaGl0ZXNwYWNlKGNoKSkKIAogI2RlZmluZSBQeV9VTklDT0RFX0lTTE9XRVIoY2gpIF9QeVVuaWNvZGVfSXNMb3dlcmNhc2UoY2gpCiAjZGVmaW5lIFB5X1VOSUNPREVfSVNVUFBFUihjaCkgX1B5VW5pY29kZV9Jc1VwcGVyY2FzZShjaCkKQEAgLTM4NiwxNiArMzg2LDE2IEBACiAKICNkZWZpbmUgUHlfVU5JQ09ERV9JU0FMTlVNKGNoKSBcCiAgICAgICAgKFB5X1VOSUNPREVfSVNBTFBIQShjaCkgfHwgXAotICAgICAgICBQeV9VTklDT0RFX0lTREVDSU1BTChjaCkgfHwgXAotICAgICAgICBQeV9VTklDT0RFX0lTRElHSVQoY2gpIHx8IFwKLSAgICAgICAgUHlfVU5JQ09ERV9JU05VTUVSSUMoY2gpKQorICAgIFB5X1VOSUNPREVfSVNERUNJTUFMKGNoKSB8fCBcCisgICAgUHlfVU5JQ09ERV9JU0RJR0lUKGNoKSB8fCBcCisgICAgUHlfVU5JQ09ERV9JU05VTUVSSUMoY2gpKQogCi0jZGVmaW5lIFB5X1VOSUNPREVfQ09QWSh0YXJnZXQsIHNvdXJjZSwgbGVuZ3RoKQkJCQlcCi0JUHlfTUVNQ1BZKCh0YXJnZXQpLCAoc291cmNlKSwgKGxlbmd0aCkqc2l6ZW9mKFB5X1VOSUNPREUpKQorI2RlZmluZSBQeV9VTklDT0RFX0NPUFkodGFyZ2V0LCBzb3VyY2UsIGxlbmd0aCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFB5X01FTUNQWSgodGFyZ2V0KSwgKHNvdXJjZSksIChsZW5ndGgpKnNpemVvZihQeV9VTklDT0RFKSkKIAogI2RlZmluZSBQeV9VTklDT0RFX0ZJTEwodGFyZ2V0LCB2YWx1ZSwgbGVuZ3RoKSBcCiAgICAgZG8ge1B5X3NzaXplX3QgaV87IFB5X1VOSUNPREUgKnRfID0gKHRhcmdldCk7IFB5X1VOSUNPREUgdl8gPSAodmFsdWUpO1wKLSAgICAgICAgZm9yIChpXyA9IDA7IGlfIDwgKGxlbmd0aCk7IGlfKyspIHRfW2lfXSA9IHZfO1wKKyAgICBmb3IgKGlfID0gMDsgaV8gPCAobGVuZ3RoKTsgaV8rKykgdF9baV9dID0gdl87XAogICAgIH0gd2hpbGUgKDApCiAKIC8qIENoZWNrIGlmIHN1YnN0cmluZyBtYXRjaGVzIGF0IGdpdmVuIG9mZnNldC4gIHRoZSBvZmZzZXQgbXVzdCBiZQpAQCAtNDE0LDEyICs0MTQsMTIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeV9zc2l6ZV90IGxlbmd0aDsJCS8qIExlbmd0aCBvZiByYXcgVW5pY29kZSBkYXRhIGluIGJ1ZmZlciAqLwotICAgIFB5X1VOSUNPREUgKnN0cjsJCS8qIFJhdyBVbmljb2RlIGJ1ZmZlciAqLwotICAgIGxvbmcgaGFzaDsJCQkvKiBIYXNoIHZhbHVlOyAtMSBpZiBub3Qgc2V0ICovCi0gICAgUHlPYmplY3QgKmRlZmVuYzsJCS8qIChEZWZhdWx0KSBFbmNvZGVkIHZlcnNpb24gYXMgUHl0aG9uCi0JCQkJICAgc3RyaW5nLCBvciBOVUxMOyB0aGlzIGlzIHVzZWQgZm9yCi0JCQkJICAgaW1wbGVtZW50aW5nIHRoZSBidWZmZXIgcHJvdG9jb2wgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aDsgICAgICAgICAgLyogTGVuZ3RoIG9mIHJhdyBVbmljb2RlIGRhdGEgaW4gYnVmZmVyICovCisgICAgUHlfVU5JQ09ERSAqc3RyOyAgICAgICAgICAgIC8qIFJhdyBVbmljb2RlIGJ1ZmZlciAqLworICAgIGxvbmcgaGFzaDsgICAgICAgICAgICAgICAgICAvKiBIYXNoIHZhbHVlOyAtMSBpZiBub3Qgc2V0ICovCisgICAgUHlPYmplY3QgKmRlZmVuYzsgICAgICAgICAgIC8qIChEZWZhdWx0KSBFbmNvZGVkIHZlcnNpb24gYXMgUHl0aG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgb3IgTlVMTDsgdGhpcyBpcyB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRpbmcgdGhlIGJ1ZmZlciBwcm90b2NvbCAqLwogfSBQeVVuaWNvZGVPYmplY3Q7CiAKIFB5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVVuaWNvZGVfVHlwZTsKQEAgLTQzMCwxMyArNDMwLDEzIEBACiAKIC8qIEZhc3QgYWNjZXNzIG1hY3JvcyAqLwogI2RlZmluZSBQeVVuaWNvZGVfR0VUX1NJWkUob3ApIFwKLSAgICAgICAgKCgoUHlVbmljb2RlT2JqZWN0ICopKG9wKSktPmxlbmd0aCkKKyAgICAoKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+bGVuZ3RoKQogI2RlZmluZSBQeVVuaWNvZGVfR0VUX0RBVEFfU0laRShvcCkgXAotICAgICAgICAoKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+bGVuZ3RoICogc2l6ZW9mKFB5X1VOSUNPREUpKQorICAgICgoKFB5VW5pY29kZU9iamVjdCAqKShvcCkpLT5sZW5ndGggKiBzaXplb2YoUHlfVU5JQ09ERSkpCiAjZGVmaW5lIFB5VW5pY29kZV9BU19VTklDT0RFKG9wKSBcCi0gICAgICAgICgoKFB5VW5pY29kZU9iamVjdCAqKShvcCkpLT5zdHIpCisgICAgKCgoUHlVbmljb2RlT2JqZWN0ICopKG9wKSktPnN0cikKICNkZWZpbmUgUHlVbmljb2RlX0FTX0RBVEEob3ApIFwKLSAgICAgICAgKChjb25zdCBjaGFyICopKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+c3RyKQorICAgICgoY29uc3QgY2hhciAqKSgoUHlVbmljb2RlT2JqZWN0ICopKG9wKSktPnN0cikKIAogLyogLS0tIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTQ1Miw3ICs0NTIsNyBAQAogLyogLS0tIFBsYWluIFB5X1VOSUNPREUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIENyZWF0ZSBhIFVuaWNvZGUgT2JqZWN0IGZyb20gdGhlIFB5X1VOSUNPREUgYnVmZmVyIHUgb2YgdGhlIGdpdmVuCi0gICBzaXplLiAKKyAgIHNpemUuCiAKICAgIHUgbWF5IGJlIE5VTEwgd2hpY2ggY2F1c2VzIHRoZSBjb250ZW50cyB0byBiZSB1bmRlZmluZWQuIEl0IGlzIHRoZQogICAgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZpbGwgaW4gdGhlIG5lZWRlZCBkYXRhIGFmdGVyd2FyZHMuIE5vdGUKQEAgLTQ4MiwxMyArNDgyLDEzIEBACiAgICBQeV9VTklDT0RFIGJ1ZmZlci4gKi8KIAogUHlBUElfRlVOQyhQeV9VTklDT0RFICopIFB5VW5pY29kZV9Bc1VuaWNvZGUoCi0gICAgUHlPYmplY3QgKnVuaWNvZGUJIAkvKiBVbmljb2RlIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlICAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLwogICAgICk7CiAKIC8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBVbmljb2RlIG9iamVjdC4gKi8KIAogUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVVuaWNvZGVfR2V0U2l6ZSgKLSAgICBQeU9iamVjdCAqdW5pY29kZQkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKIAogLyogR2V0IHRoZSBtYXhpbXVtIG9yZGluYWwgZm9yIGEgVW5pY29kZSBjaGFyYWN0ZXIuICovCkBAIC01MDksOCArNTA5LDggQEAKICovCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVfUmVzaXplKAotICAgIFB5T2JqZWN0ICoqdW5pY29kZSwJCS8qIFBvaW50ZXIgdG8gdGhlIFVuaWNvZGUgb2JqZWN0ICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgJCS8qIE5ldyBsZW5ndGggKi8KKyAgICBQeU9iamVjdCAqKnVuaWNvZGUsICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCAgICAgICAgICAgLyogTmV3IGxlbmd0aCAqLwogICAgICk7CiAKIC8qIENvZXJjZSBvYmogdG8gYW4gVW5pY29kZSBvYmplY3QgYW5kIHJldHVybiBhIHJlZmVyZW5jZSB3aXRoCkBAIC01MzEsMTQgKzUzMSwxNCBAQAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCgKLSAgICByZWdpc3RlciBQeU9iamVjdCAqb2JqLCAJLyogT2JqZWN0ICovCisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9iaiwgICAgIC8qIE9iamVjdCAqLwogICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAgICAgICAvKiBlbmNvZGluZyAqLwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIC8qIENvZXJjZSBvYmogdG8gYW4gVW5pY29kZSBvYmplY3QgYW5kIHJldHVybiBhIHJlZmVyZW5jZSB3aXRoCiAgICAqaW5jcmVtZW50ZWQqIHJlZmNvdW50LgotICAgCisKICAgIFVuaWNvZGUgb2JqZWN0cyBhcmUgcGFzc2VkIGJhY2sgYXMtaXMgKHN1YmNsYXNzZXMgYXJlIGNvbnZlcnRlZCB0bwogICAgdHJ1ZSBVbmljb2RlIG9iamVjdHMpLCBhbGwgb3RoZXIgb2JqZWN0cyBhcmUgZGVsZWdhdGVkIHRvCiAgICBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3Qob2JqLCBOVUxMLCAic3RyaWN0Iikgd2hpY2ggcmVzdWx0cyBpbgpAQCAtNTUwLDcgKzU1MCw3IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0Zyb21PYmplY3QoCi0gICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9iaiAJLyogT2JqZWN0ICovCisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9iaiAgICAgIC8qIE9iamVjdCAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlX0Zyb21Gb3JtYXRWKGNvbnN0IGNoYXIqLCB2YV9saXN0KTsKQEAgLTU1OSw4ICs1NTksOCBAQAogLyogRm9ybWF0IHRoZSBvYmplY3QgYmFzZWQgb24gdGhlIGZvcm1hdF9zcGVjLCBhcyBkZWZpbmVkIGluIFBFUCAzMTAxCiAgICAoQWR2YW5jZWQgU3RyaW5nIEZvcm1hdHRpbmcpLiAqLwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlVbmljb2RlX0Zvcm1hdEFkdmFuY2VkKFB5T2JqZWN0ICpvYmosCi0JCQkJCQkgUHlfVU5JQ09ERSAqZm9ybWF0X3NwZWMsCi0JCQkJCQkgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1VOSUNPREUgKmZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKTsKIAogLyogLS0tIHdjaGFyX3Qgc3VwcG9ydCBmb3IgcGxhdGZvcm1zIHdoaWNoIHN1cHBvcnQgaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTU5OCw4ICs1OTgsOCBAQAogCiAvKiAtLS0gVW5pY29kZSBvcmRpbmFscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyogQ3JlYXRlIGEgVW5pY29kZSBPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlIHBvaW50IG9yZGluYWwuIAotIAorLyogQ3JlYXRlIGEgVW5pY29kZSBPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlIHBvaW50IG9yZGluYWwuCisKICAgIFRoZSBvcmRpbmFsIG11c3QgYmUgaW4gcmFuZ2UoMHgxMDAwMCkgb24gbmFycm93IFB5dGhvbiBidWlsZHMKICAgIChVQ1MyKSwgYW5kIHJhbmdlKDB4MTEwMDAwKSBvbiB3aWRlIGJ1aWxkcyAoVUNTNCkuIEEgVmFsdWVFcnJvciBpcwogICAgcmFpc2VkIGluIGNhc2UgaXQgaXMgbm90LgpAQCAtNjE5LDExICs2MTksMTEgQEAKIAogUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZV9DbGVhckZyZWVMaXN0KHZvaWQpOwogCi0vKiA9PT0gQnVpbHRpbiBDb2RlY3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisvKiA9PT0gQnVpbHRpbiBDb2RlY3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogICAgTWFueSBvZiB0aGVzZSBBUElzIHRha2UgdHdvIGFyZ3VtZW50cyBlbmNvZGluZyBhbmQgZXJyb3JzLiBUaGVzZQogICAgcGFyYW1ldGVycyBlbmNvZGluZyBhbmQgZXJyb3JzIGhhdmUgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBvbmVzCi0gICBvZiB0aGUgYnVpbHRpbiB1bmljb2RlKCkgQVBJLiAKKyAgIG9mIHRoZSBidWlsdGluIHVuaWNvZGUoKSBBUEkuCiAKICAgIFNldHRpbmcgZW5jb2RpbmcgdG8gTlVMTCBjYXVzZXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcgdG8gYmUgdXNlZC4KIApAQCAtNjQwLDcgKzY0MCw3IEBACiAvKiAtLS0gTWFuYWdlIHRoZSBkZWZhdWx0IGVuY29kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyogUmV0dXJuIGEgUHl0aG9uIHN0cmluZyBob2xkaW5nIHRoZSBkZWZhdWx0IGVuY29kZWQgdmFsdWUgb2YgdGhlCi0gICBVbmljb2RlIG9iamVjdC4gCisgICBVbmljb2RlIG9iamVjdC4KIAogICAgVGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgY2FjaGVkIGluIHRoZSBVbmljb2RlIG9iamVjdCBmb3Igc3Vic2VxdWVudAogICAgdXNhZ2UgYnkgdGhpcyBmdW5jdGlvbi4gVGhlIGNhY2hlZCB2ZXJzaW9uIGlzIG5lZWRlZCB0byBpbXBsZW1lbnQKQEAgLTY2Miw3ICs2NjIsNyBAQAogICAgcHJvY2VzcyBnbG9iYWwuICBUaGlzIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoZQogICAgaW50ZXJwcmV0ZXIgdG8gYmVjb21lIGEgcGFyYW1ldGVyIHdoaWNoIGlzIG1hbmFnZWQgb24gYSBwZXItdGhyZWFkCiAgICBiYXNpcy4KLSAgIAorCiAgKi8KIAogUHlBUElfRlVOQyhjb25zdCBjaGFyKikgUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZyh2b2lkKTsKQEAgLTY3MCwxMSArNjcwLDExIEBACiAvKiBTZXRzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGRlZmF1bHQgZW5jb2RpbmcuCiAKICAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBpbiBjYXNlIG9mIGFuIGVycm9yLgotICAgCisKICAqLwogCiBQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZygKLSAgICBjb25zdCBjaGFyICplbmNvZGluZwkvKiBFbmNvZGluZyBuYW1lIGluIHN0YW5kYXJkIGZvcm0gKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZyAgICAgICAgLyogRW5jb2RpbmcgbmFtZSBpbiBzdGFuZGFyZCBmb3JtICovCiAgICAgKTsKIAogLyogLS0tIEdlbmVyaWMgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC02ODksNyArNjg5LDcgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCi0vKiBFbmNvZGVzIGEgUHlfVU5JQ09ERSBidWZmZXIgb2YgdGhlIGdpdmVuIHNpemUgYW5kIHJldHVybnMgYSAKKy8qIEVuY29kZXMgYSBQeV9VTklDT0RFIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSBhbmQgcmV0dXJucyBhCiAgICBQeXRob24gc3RyaW5nIG9iamVjdC4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGUoCkBAIC03MDMsMTggKzcwMywxOCBAQAogICAgb2JqZWN0LiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdCgKLSAgICBQeU9iamVjdCAqdW5pY29kZSwJIAkvKiBVbmljb2RlIG9iamVjdCAqLwotICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAkvKiBlbmNvZGluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBQeU9iamVjdCAqdW5pY29kZSwgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgICAgICAgLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiAvKiBFbmNvZGVzIGEgVW5pY29kZSBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nCiAgICBvYmplY3QuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAotICAgIFB5T2JqZWN0ICp1bmljb2RlLAkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCi0gICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCS8qIGVuY29kaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlLCAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAgICAgICAvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQnVpbGRFbmNvZGluZ01hcCgKQEAgLTcyNSw0OSArNzI1LDQ5IEBACiAvKiAtLS0gVVRGLTcgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEY3KAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIFVURi03IGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVURi03IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWwoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTcgZW5jb2RlZCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBzaXplIG9mIHN0cmluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycywJCS8qIGVycm9yIGhhbmRsaW5nICovCi0gICAgUHlfc3NpemVfdCAqY29uc3VtZWQJLyogYnl0ZXMgY29uc3VtZWQgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTcgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBQeV9zc2l6ZV90ICpjb25zdW1lZCAgICAgICAgLyogYnl0ZXMgY29uc3VtZWQgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZVVURjcoCi0gICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgCS8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkJLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCi0gICAgaW50IGJhc2U2NFNldE8sCQkvKiBFbmNvZGUgUkZDMjE1MiBTZXQgTyBjaGFyYWN0ZXJzIGluIGJhc2U2NCAqLwotICAgIGludCBiYXNlNjRXaGl0ZVNwYWNlLAkvKiBFbmNvZGUgd2hpdGVzcGFjZSAoc3AsIGh0LCBubCwgY3IpIGluIGJhc2U2NCAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGludCBiYXNlNjRTZXRPLCAgICAgICAgICAgICAvKiBFbmNvZGUgUkZDMjE1MiBTZXQgTyBjaGFyYWN0ZXJzIGluIGJhc2U2NCAqLworICAgIGludCBiYXNlNjRXaGl0ZVNwYWNlLCAgICAgICAvKiBFbmNvZGUgd2hpdGVzcGFjZSAoc3AsIGh0LCBubCwgY3IpIGluIGJhc2U2NCAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIC8qIC0tLSBVVEYtOCBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjgoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTggZW5jb2RlZCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBzaXplIG9mIHN0cmluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTggZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bCgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBVVEYtOCBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzLAkJLyogZXJyb3IgaGFuZGxpbmcgKi8KLSAgICBQeV9zc2l6ZV90ICpjb25zdW1lZAkJLyogYnl0ZXMgY29uc3VtZWQgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTggZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBQeV9zc2l6ZV90ICpjb25zdW1lZCAgICAgICAgICAgICAgICAvKiBieXRlcyBjb25zdW1lZCAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKAotICAgIFB5T2JqZWN0ICp1bmljb2RlCSAJLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZVVURjgoCi0gICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgCS8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkJLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogLyogLS0tIFVURi0zMiBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03NzYsMTQgKzc3NiwxNCBAQAogICAgdGhlIGNvcnJlc3BvbmRpbmcgVW5pY29kZSBvYmplY3QuCiAKICAgIGVycm9ycyAoaWYgbm9uLU5VTEwpIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nLiBJdCBkZWZhdWx0cwotICAgdG8gInN0cmljdCIuIAorICAgdG8gInN0cmljdCIuCiAKICAgIElmIGJ5dGVvcmRlciBpcyBub24tTlVMTCwgdGhlIGRlY29kZXIgc3RhcnRzIGRlY29kaW5nIHVzaW5nIHRoZQogICAgZ2l2ZW4gYnl0ZSBvcmRlcjoKIAotCSpieXRlb3JkZXIgPT0gLTE6IGxpdHRsZSBlbmRpYW4KLQkqYnl0ZW9yZGVyID09IDA6ICBuYXRpdmUgb3JkZXIKLQkqYnl0ZW9yZGVyID09IDE6ICBiaWcgZW5kaWFuCisgICAgKmJ5dGVvcmRlciA9PSAtMTogbGl0dGxlIGVuZGlhbgorICAgICpieXRlb3JkZXIgPT0gMDogIG5hdGl2ZSBvcmRlcgorICAgICpieXRlb3JkZXIgPT0gMTogIGJpZyBlbmRpYW4KIAogICAgSW4gbmF0aXZlIG1vZGUsIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBzdHJlYW0gYXJlIGNoZWNrZWQgZm9yIGEKICAgIEJPTSBtYXJrLiBJZiBmb3VuZCwgdGhlIEJPTSBtYXJrIGlzIGFuYWx5c2VkLCB0aGUgYnl0ZSBvcmRlcgpAQCAtNzk2LDI5ICs3OTYsMjkgQEAKICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlVVRGMzIoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTMyIGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMsCQkvKiBlcnJvciBoYW5kbGluZyAqLwotICAgIGludCAqYnl0ZW9yZGVyCQkvKiBwb2ludGVyIHRvIGJ5dGVvcmRlciB0byB1c2UKLQkJCQkgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCi0JCQkJICAgZXhpdCAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtMzIgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgKmJ5dGVvcmRlciAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9bmF0aXZlOy0xPUxFLDE9QkU7IHVwZGF0ZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bCgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBVVEYtMzIgZW5jb2RlZCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBzaXplIG9mIHN0cmluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycywJCS8qIGVycm9yIGhhbmRsaW5nICovCi0gICAgaW50ICpieXRlb3JkZXIsCQkvKiBwb2ludGVyIHRvIGJ5dGVvcmRlciB0byB1c2UKLQkJCQkgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCi0JCQkJICAgZXhpdCAqLwotICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkCS8qIGJ5dGVzIGNvbnN1bWVkICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVURi0zMiBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycywgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGludCAqYnl0ZW9yZGVyLCAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGJ5dGVvcmRlciB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0ICovCisgICAgUHlfc3NpemVfdCAqY29uc3VtZWQgICAgICAgIC8qIGJ5dGVzIGNvbnN1bWVkICovCiAgICAgKTsKIAogLyogUmV0dXJucyBhIFB5dGhvbiBzdHJpbmcgdXNpbmcgdGhlIFVURi0zMiBlbmNvZGluZyBpbiBuYXRpdmUgYnl0ZQogICAgb3JkZXIuIFRoZSBzdHJpbmcgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgQk9NIG1hcmsuICAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzVVRGMzJTdHJpbmcoCi0gICAgUHlPYmplY3QgKnVuaWNvZGUJIAkvKiBVbmljb2RlIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlICAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLwogICAgICk7CiAKIC8qIFJldHVybnMgYSBQeXRob24gc3RyaW5nIG9iamVjdCBob2xkaW5nIHRoZSBVVEYtMzIgZW5jb2RlZCB2YWx1ZSBvZgpAQCAtODM4LDEwICs4MzgsMTAgQEAKICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlVVRGMzIoCi0gICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgCS8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBudW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMsCQkvKiBlcnJvciBoYW5kbGluZyAqLwotICAgIGludCBieXRlb3JkZXIJCS8qIGJ5dGVvcmRlciB0byB1c2UgMD1CT00rbmF0aXZlOy0xPUxFLDE9QkUgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBudW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgYnl0ZW9yZGVyICAgICAgICAgICAgICAgLyogYnl0ZW9yZGVyIHRvIHVzZSAwPUJPTStuYXRpdmU7LTE9TEUsMT1CRSAqLwogICAgICk7CiAKIC8qIC0tLSBVVEYtMTYgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtODUwLDE0ICs4NTAsMTQgQEAKICAgIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUgb2JqZWN0LgogCiAgICBlcnJvcnMgKGlmIG5vbi1OVUxMKSBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZy4gSXQgZGVmYXVsdHMKLSAgIHRvICJzdHJpY3QiLiAKKyAgIHRvICJzdHJpY3QiLgogCiAgICBJZiBieXRlb3JkZXIgaXMgbm9uLU5VTEwsIHRoZSBkZWNvZGVyIHN0YXJ0cyBkZWNvZGluZyB1c2luZyB0aGUKICAgIGdpdmVuIGJ5dGUgb3JkZXI6CiAKLQkqYnl0ZW9yZGVyID09IC0xOiBsaXR0bGUgZW5kaWFuCi0JKmJ5dGVvcmRlciA9PSAwOiAgbmF0aXZlIG9yZGVyCi0JKmJ5dGVvcmRlciA9PSAxOiAgYmlnIGVuZGlhbgorICAgICpieXRlb3JkZXIgPT0gLTE6IGxpdHRsZSBlbmRpYW4KKyAgICAqYnl0ZW9yZGVyID09IDA6ICBuYXRpdmUgb3JkZXIKKyAgICAqYnl0ZW9yZGVyID09IDE6ICBiaWcgZW5kaWFuCiAKICAgIEluIG5hdGl2ZSBtb2RlLCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBzdHJlYW0gYXJlIGNoZWNrZWQgZm9yIGEKICAgIEJPTSBtYXJrLiBJZiBmb3VuZCwgdGhlIEJPTSBtYXJrIGlzIGFuYWx5c2VkLCB0aGUgYnl0ZSBvcmRlcgpAQCAtODcwLDI5ICs4NzAsMjkgQEAKICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlVVRGMTYoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTE2IGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMsCQkvKiBlcnJvciBoYW5kbGluZyAqLwotICAgIGludCAqYnl0ZW9yZGVyCQkvKiBwb2ludGVyIHRvIGJ5dGVvcmRlciB0byB1c2UKLQkJCQkgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCi0JCQkJICAgZXhpdCAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtMTYgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgKmJ5dGVvcmRlciAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9bmF0aXZlOy0xPUxFLDE9QkU7IHVwZGF0ZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bCgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBVVEYtMTYgZW5jb2RlZCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBzaXplIG9mIHN0cmluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycywJCS8qIGVycm9yIGhhbmRsaW5nICovCi0gICAgaW50ICpieXRlb3JkZXIsCQkvKiBwb2ludGVyIHRvIGJ5dGVvcmRlciB0byB1c2UKLQkJCQkgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCi0JCQkJICAgZXhpdCAqLwotICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkCQkvKiBieXRlcyBjb25zdW1lZCAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtMTYgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgKmJ5dGVvcmRlciwgICAgICAgICAgICAgLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9bmF0aXZlOy0xPUxFLDE9QkU7IHVwZGF0ZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAqLworICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkICAgICAgICAgICAgICAgIC8qIGJ5dGVzIGNvbnN1bWVkICovCiAgICAgKTsKIAogLyogUmV0dXJucyBhIFB5dGhvbiBzdHJpbmcgdXNpbmcgdGhlIFVURi0xNiBlbmNvZGluZyBpbiBuYXRpdmUgYnl0ZQogICAgb3JkZXIuIFRoZSBzdHJpbmcgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgQk9NIG1hcmsuICAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzVVRGMTZTdHJpbmcoCi0gICAgUHlPYmplY3QgKnVuaWNvZGUJIAkvKiBVbmljb2RlIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlICAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLwogICAgICk7CiAKIC8qIFJldHVybnMgYSBQeXRob24gc3RyaW5nIG9iamVjdCBob2xkaW5nIHRoZSBVVEYtMTYgZW5jb2RlZCB2YWx1ZSBvZgpAQCAtOTE2LDQ0ICs5MTYsNDQgQEAKICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlVVRGMTYoCi0gICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgCS8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkJLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzLAkJLyogZXJyb3IgaGFuZGxpbmcgKi8KLSAgICBpbnQgYnl0ZW9yZGVyCQkvKiBieXRlb3JkZXIgdG8gdXNlIDA9Qk9NK25hdGl2ZTstMT1MRSwxPUJFICovCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgYnl0ZW9yZGVyICAgICAgICAgICAgICAgLyogYnl0ZW9yZGVyIHRvIHVzZSAwPUJPTStuYXRpdmU7LTE9TEUsMT1CRSAqLwogICAgICk7CiAKIC8qIC0tLSBVbmljb2RlLUVzY2FwZSBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVW5pY29kZS1Fc2NhcGUgZW5jb2RlZCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBzaXplIG9mIHN0cmluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVW5pY29kZS1Fc2NhcGUgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZygKLSAgICBQeU9iamVjdCAqdW5pY29kZQkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVVbmljb2RlRXNjYXBlKAotICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsIAkvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgJIAkJLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KICAgICApOwogCiAvKiAtLS0gUmF3LVVuaWNvZGUtRXNjYXBlIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlKAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIFJhdy1Vbmljb2RlLUVzY2FwZSBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBSYXctVW5pY29kZS1Fc2NhcGUgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZygKLSAgICBQeU9iamVjdCAqdW5pY29kZQkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVSYXdVbmljb2RlRXNjYXBlKAotICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsIAkvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgJIAkJLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KICAgICApOwogCiAvKiAtLS0gVW5pY29kZSBJbnRlcm5hbCBDb2RlYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk2Niw1MyArOTY2LDUzIEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzCiAgICAgKTsKIAotLyogLS0tIExhdGluLTEgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLyogLS0tIExhdGluLTEgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgIE5vdGU6IExhdGluLTEgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IDI1NiBVbmljb2RlIG9yZGluYWxzLgogCiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZUxhdGluMSgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBMYXRpbi0xIGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIExhdGluLTEgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nKAotICAgIFB5T2JqZWN0ICp1bmljb2RlCSAJLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZUxhdGluMSgKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCQkvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCi0vKiAtLS0gQVNDSUkgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvKiAtLS0gQVNDSUkgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgT25seSA3LWJpdCBBU0NJSSBkYXRhIGlzIGV4Y2VwdGVkLiBBbGwgb3RoZXIgY29kZXMgZ2VuZXJhdGUgZXJyb3JzLgogCiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZUFTQ0lJKAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIEFTQ0lJIGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIEFTQ0lJIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nKAotICAgIFB5T2JqZWN0ICp1bmljb2RlCSAJLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZUFTQ0lJKAotICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsIAkvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJCS8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKLS8qIC0tLSBDaGFyYWN0ZXIgTWFwIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8qIC0tLSBDaGFyYWN0ZXIgTWFwIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICBUaGlzIGNvZGVjIHVzZXMgbWFwcGluZ3MgdG8gZW5jb2RlIGFuZCBkZWNvZGUgY2hhcmFjdGVycy4gCisgICBUaGlzIGNvZGVjIHVzZXMgbWFwcGluZ3MgdG8gZW5jb2RlIGFuZCBkZWNvZGUgY2hhcmFjdGVycy4KIAogICAgRGVjb2RpbmcgbWFwcGluZ3MgbXVzdCBtYXAgc2luZ2xlIHN0cmluZyBjaGFyYWN0ZXJzIHRvIHNpbmdsZQogICAgVW5pY29kZSBjaGFyYWN0ZXJzLCBpbnRlZ2VycyAod2hpY2ggYXJlIHRoZW4gaW50ZXJwcmV0ZWQgYXMgVW5pY29kZQpAQCAtMTAzMywyNSArMTAzMywyNSBAQAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVDaGFybWFwKAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIEVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBQeU9iamVjdCAqbWFwcGluZywJCS8qIGNoYXJhY3RlciBtYXBwaW5nIAotCQkJCSAgIChjaGFyIG9yZGluYWwgLT4gdW5pY29kZSBvcmRpbmFsKSAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogRW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqbWFwcGluZywgICAgICAgICAgLyogY2hhcmFjdGVyIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgb3JkaW5hbCAtPiB1bmljb2RlIG9yZGluYWwpICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc0NoYXJtYXBTdHJpbmcoCi0gICAgUHlPYmplY3QgKnVuaWNvZGUsCSAJLyogVW5pY29kZSBvYmplY3QgKi8KLSAgICBQeU9iamVjdCAqbWFwcGluZwkJLyogY2hhcmFjdGVyIG1hcHBpbmcgCi0JCQkJICAgKHVuaWNvZGUgb3JkaW5hbCAtPiBjaGFyIG9yZGluYWwpICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUsICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKm1hcHBpbmcgICAgICAgICAgIC8qIGNoYXJhY3RlciBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmljb2RlIG9yZGluYWwgLT4gY2hhciBvcmRpbmFsKSAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcCgKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLwotICAgIFB5T2JqZWN0ICptYXBwaW5nLAkJLyogY2hhcmFjdGVyIG1hcHBpbmcgCi0JCQkJICAgKHVuaWNvZGUgb3JkaW5hbCAtPiBjaGFyIG9yZGluYWwpICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIFB5T2JqZWN0ICptYXBwaW5nLCAgICAgICAgICAvKiBjaGFyYWN0ZXIgbWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pY29kZSBvcmRpbmFsIC0+IGNoYXIgb3JkaW5hbCkgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiAvKiBUcmFuc2xhdGUgYSBQeV9VTklDT0RFIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gbGVuZ3RoIGJ5IGFwcGx5aW5nIGEKQEAgLTEwNTksNyArMTA1OSw3IEBACiAgICBvYmplY3QuCiAKICAgIFRoZSBtYXBwaW5nIHRhYmxlIG11c3QgbWFwIFVuaWNvZGUgb3JkaW5hbCBpbnRlZ2VycyB0byBVbmljb2RlCi0gICBvcmRpbmFsIGludGVnZXJzIG9yIE5vbmUgKGNhdXNpbmcgZGVsZXRpb24gb2YgdGhlIGNoYXJhY3RlcikuIAorICAgb3JkaW5hbCBpbnRlZ2VycyBvciBOb25lIChjYXVzaW5nIGRlbGV0aW9uIG9mIHRoZSBjaGFyYWN0ZXIpLgogCiAgICBNYXBwaW5nIHRhYmxlcyBtYXkgYmUgZGljdGlvbmFyaWVzIG9yIHNlcXVlbmNlcy4gVW5tYXBwZWQgY2hhcmFjdGVyCiAgICBvcmRpbmFscyAob25lcyB3aGljaCBjYXVzZSBhIExvb2t1cEVycm9yKSBhcmUgbGVmdCB1bnRvdWNoZWQgYW5kCkBAIC0xMDY4LDEwICsxMDY4LDEwIEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZV9UcmFuc2xhdGVDaGFybWFwKAotICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsIAkvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJCS8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLwotICAgIFB5T2JqZWN0ICp0YWJsZSwJCS8qIFRyYW5zbGF0ZSB0YWJsZSAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIFB5T2JqZWN0ICp0YWJsZSwgICAgICAgICAgICAvKiBUcmFuc2xhdGUgdGFibGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiAjaWZkZWYgTVNfV0lOMzIKQEAgLTExMjAsNyArMTEyMCw3IEBACiAKICAgICAgIE5VTEwgb3IgInN0cmljdCI6IHJhaXNlIGEgVmFsdWVFcnJvcgogICAgICAgImlnbm9yZSI6IGlnbm9yZSB0aGUgd3JvbmcgY2hhcmFjdGVycyAodGhlc2UgYXJlIG5vdCBjb3BpZWQgdG8gdGhlCi0JCW91dHB1dCBidWZmZXIpCisgICAgICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlcikKICAgICAgICJyZXBsYWNlIjogcmVwbGFjZXMgaWxsZWdhbCBjaGFyYWN0ZXJzIHdpdGggJz8nCiAKICAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgpAQCAtMTEyOCwxMCArMTEyOCwxMCBAQAogKi8KIAogUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsKAotICAgIFB5X1VOSUNPREUgKnMsCQkvKiBVbmljb2RlIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkJCS8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLwotICAgIGNoYXIgKm91dHB1dCwJCS8qIE91dHB1dCBidWZmZXI7IG11c3QgaGF2ZSBzaXplID49IGxlbmd0aCAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBQeV9VTklDT0RFICpzLCAgICAgICAgICAgICAgLyogVW5pY29kZSBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjaGFyICpvdXRwdXQsICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZmZlcjsgbXVzdCBoYXZlIHNpemUgPj0gbGVuZ3RoICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogLyogLS0tIE1ldGhvZHMgJiBTbG90cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMTQzLDggKzExNDMsOCBAQAogLyogQ29uY2F0IHR3byBzdHJpbmdzIGdpdmluZyBhIG5ldyBVbmljb2RlIHN0cmluZy4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Db25jYXQoCi0gICAgUHlPYmplY3QgKmxlZnQsCSAJLyogTGVmdCBzdHJpbmcgKi8KLSAgICBQeU9iamVjdCAqcmlnaHQJIAkvKiBSaWdodCBzdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqbGVmdCwgICAgICAgICAgICAgLyogTGVmdCBzdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqcmlnaHQgICAgICAgICAgICAgLyogUmlnaHQgc3RyaW5nICovCiAgICAgKTsKIAogLyogU3BsaXQgYSBzdHJpbmcgZ2l2aW5nIGEgbGlzdCBvZiBVbmljb2RlIHN0cmluZ3MuCkBAIC0xMTU5LDM1ICsxMTU5LDM1IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX1NwbGl0KAotICAgIFB5T2JqZWN0ICpzLAkJLyogU3RyaW5nIHRvIHNwbGl0ICovCi0gICAgUHlPYmplY3QgKnNlcCwJCS8qIFN0cmluZyBzZXBhcmF0b3IgKi8KLSAgICBQeV9zc2l6ZV90IG1heHNwbGl0CQkvKiBNYXhzcGxpdCBjb3VudCAqLwotICAgICk7CQkKKyAgICBQeU9iamVjdCAqcywgICAgICAgICAgICAgICAgLyogU3RyaW5nIHRvIHNwbGl0ICovCisgICAgUHlPYmplY3QgKnNlcCwgICAgICAgICAgICAgIC8qIFN0cmluZyBzZXBhcmF0b3IgKi8KKyAgICBQeV9zc2l6ZV90IG1heHNwbGl0ICAgICAgICAgLyogTWF4c3BsaXQgY291bnQgKi8KKyAgICApOwogCiAvKiBEaXRvLCBidXQgc3BsaXQgYXQgbGluZSBicmVha3MuCiAKICAgIENSTEYgaXMgY29uc2lkZXJlZCB0byBiZSBvbmUgbGluZSBicmVhay4gTGluZSBicmVha3MgYXJlIG5vdAogICAgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0LiAqLwotICAgIAorCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX1NwbGl0bGluZXMoCi0gICAgUHlPYmplY3QgKnMsCQkvKiBTdHJpbmcgdG8gc3BsaXQgKi8KLSAgICBpbnQga2VlcGVuZHMJCS8qIElmIHRydWUsIGxpbmUgZW5kIG1hcmtlcnMgYXJlIGluY2x1ZGVkICovCi0gICAgKTsJCQorICAgIFB5T2JqZWN0ICpzLCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdG8gc3BsaXQgKi8KKyAgICBpbnQga2VlcGVuZHMgICAgICAgICAgICAgICAgLyogSWYgdHJ1ZSwgbGluZSBlbmQgbWFya2VycyBhcmUgaW5jbHVkZWQgKi8KKyAgICApOwogCiAvKiBQYXJ0aXRpb24gYSBzdHJpbmcgdXNpbmcgYSBnaXZlbiBzZXBhcmF0b3IuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfUGFydGl0aW9uKAotICAgIFB5T2JqZWN0ICpzLAkJLyogU3RyaW5nIHRvIHBhcnRpdGlvbiAqLwotICAgIFB5T2JqZWN0ICpzZXAJCS8qIFN0cmluZyBzZXBhcmF0b3IgKi8KLSAgICApOwkJCisgICAgUHlPYmplY3QgKnMsICAgICAgICAgICAgICAgIC8qIFN0cmluZyB0byBwYXJ0aXRpb24gKi8KKyAgICBQeU9iamVjdCAqc2VwICAgICAgICAgICAgICAgLyogU3RyaW5nIHNlcGFyYXRvciAqLworICAgICk7CiAKIC8qIFBhcnRpdGlvbiBhIHN0cmluZyB1c2luZyBhIGdpdmVuIHNlcGFyYXRvciwgc2VhcmNoaW5nIGZyb20gdGhlIGVuZCBvZiB0aGUKICAgIHN0cmluZy4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9SUGFydGl0aW9uKAotICAgIFB5T2JqZWN0ICpzLAkJLyogU3RyaW5nIHRvIHBhcnRpdGlvbiAqLwotICAgIFB5T2JqZWN0ICpzZXAJCS8qIFN0cmluZyBzZXBhcmF0b3IgKi8KLSAgICApOwkJCisgICAgUHlPYmplY3QgKnMsICAgICAgICAgICAgICAgIC8qIFN0cmluZyB0byBwYXJ0aXRpb24gKi8KKyAgICBQeU9iamVjdCAqc2VwICAgICAgICAgICAgICAgLyogU3RyaW5nIHNlcGFyYXRvciAqLworICAgICk7CiAKIC8qIFNwbGl0IGEgc3RyaW5nIGdpdmluZyBhIGxpc3Qgb2YgVW5pY29kZSBzdHJpbmdzLgogCkBAIC0xMjAzLDE2ICsxMjAzLDE2IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX1JTcGxpdCgKLSAgICBQeU9iamVjdCAqcywJCS8qIFN0cmluZyB0byBzcGxpdCAqLwotICAgIFB5T2JqZWN0ICpzZXAsCQkvKiBTdHJpbmcgc2VwYXJhdG9yICovCi0gICAgUHlfc3NpemVfdCBtYXhzcGxpdAkJLyogTWF4c3BsaXQgY291bnQgKi8KLSAgICApOwkJCisgICAgUHlPYmplY3QgKnMsICAgICAgICAgICAgICAgIC8qIFN0cmluZyB0byBzcGxpdCAqLworICAgIFB5T2JqZWN0ICpzZXAsICAgICAgICAgICAgICAvKiBTdHJpbmcgc2VwYXJhdG9yICovCisgICAgUHlfc3NpemVfdCBtYXhzcGxpdCAgICAgICAgIC8qIE1heHNwbGl0IGNvdW50ICovCisgICAgKTsKIAogLyogVHJhbnNsYXRlIGEgc3RyaW5nIGJ5IGFwcGx5aW5nIGEgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUgdG8gaXQgYW5kCiAgICByZXR1cm4gdGhlIHJlc3VsdGluZyBVbmljb2RlIG9iamVjdC4KIAogICAgVGhlIG1hcHBpbmcgdGFibGUgbXVzdCBtYXAgVW5pY29kZSBvcmRpbmFsIGludGVnZXJzIHRvIFVuaWNvZGUKLSAgIG9yZGluYWwgaW50ZWdlcnMgb3IgTm9uZSAoY2F1c2luZyBkZWxldGlvbiBvZiB0aGUgY2hhcmFjdGVyKS4gCisgICBvcmRpbmFsIGludGVnZXJzIG9yIE5vbmUgKGNhdXNpbmcgZGVsZXRpb24gb2YgdGhlIGNoYXJhY3RlcikuCiAKICAgIE1hcHBpbmcgdGFibGVzIG1heSBiZSBkaWN0aW9uYXJpZXMgb3Igc2VxdWVuY2VzLiBVbm1hcHBlZCBjaGFyYWN0ZXIKICAgIG9yZGluYWxzIChvbmVzIHdoaWNoIGNhdXNlIGEgTG9va3VwRXJyb3IpIGFyZSBsZWZ0IHVudG91Y2hlZCBhbmQKQEAgLTEyMjEsMjggKzEyMjEsMjggQEAKICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlX1RyYW5zbGF0ZSgKLSAgICBQeU9iamVjdCAqc3RyLAkJLyogU3RyaW5nICovIAotICAgIFB5T2JqZWN0ICp0YWJsZSwJCS8qIFRyYW5zbGF0ZSB0YWJsZSAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBQeU9iamVjdCAqc3RyLCAgICAgICAgICAgICAgLyogU3RyaW5nICovCisgICAgUHlPYmplY3QgKnRhYmxlLCAgICAgICAgICAgIC8qIFRyYW5zbGF0ZSB0YWJsZSAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIC8qIEpvaW4gYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IgYW5kIHJldHVybgogICAgdGhlIHJlc3VsdGluZyBVbmljb2RlIHN0cmluZy4gKi8KLSAgICAKKwogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Kb2luKAotICAgIFB5T2JqZWN0ICpzZXBhcmF0b3IsIAkvKiBTZXBhcmF0b3Igc3RyaW5nICovCi0gICAgUHlPYmplY3QgKnNlcQkgCS8qIFNlcXVlbmNlIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICpzZXBhcmF0b3IsICAgICAgICAvKiBTZXBhcmF0b3Igc3RyaW5nICovCisgICAgUHlPYmplY3QgKnNlcSAgICAgICAgICAgICAgIC8qIFNlcXVlbmNlIG9iamVjdCAqLwogICAgICk7CiAKIC8qIFJldHVybiAxIGlmIHN1YnN0ciBtYXRjaGVzIHN0cltzdGFydDplbmRdIGF0IHRoZSBnaXZlbiB0YWlsIGVuZCwgMAogICAgb3RoZXJ3aXNlLiAqLwogCiBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5VW5pY29kZV9UYWlsbWF0Y2goCi0gICAgUHlPYmplY3QgKnN0ciwJCS8qIFN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqc3Vic3RyLAkJLyogUHJlZml4IG9yIFN1ZmZpeCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IHN0YXJ0LAkJLyogU3RhcnQgaW5kZXggKi8KLSAgICBQeV9zc2l6ZV90IGVuZCwJCS8qIFN0b3AgaW5kZXggKi8KLSAgICBpbnQgZGlyZWN0aW9uCQkvKiBUYWlsIGVuZDogLTEgcHJlZml4LCArMSBzdWZmaXggKi8KKyAgICBQeU9iamVjdCAqc3RyLCAgICAgICAgICAgICAgLyogU3RyaW5nICovCisgICAgUHlPYmplY3QgKnN1YnN0ciwgICAgICAgICAgIC8qIFByZWZpeCBvciBTdWZmaXggc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBzdGFydCwgICAgICAgICAgIC8qIFN0YXJ0IGluZGV4ICovCisgICAgUHlfc3NpemVfdCBlbmQsICAgICAgICAgICAgIC8qIFN0b3AgaW5kZXggKi8KKyAgICBpbnQgZGlyZWN0aW9uICAgICAgICAgICAgICAgLyogVGFpbCBlbmQ6IC0xIHByZWZpeCwgKzEgc3VmZml4ICovCiAgICAgKTsKIAogLyogUmV0dXJuIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiBzdWJzdHIgaW4gc3RyW3N0YXJ0OmVuZF0gdXNpbmcgdGhlCkBAIC0xMjUwLDM5ICsxMjUwLDM5IEBACiAgICBhbiBlcnJvciBvY2N1cnJlZCBhbmQgYW4gZXhjZXB0aW9uIGlzIHNldC4gKi8KIAogUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVVuaWNvZGVfRmluZCgKLSAgICBQeU9iamVjdCAqc3RyLAkJLyogU3RyaW5nICovIAotICAgIFB5T2JqZWN0ICpzdWJzdHIsCQkvKiBTdWJzdHJpbmcgdG8gZmluZCAqLwotICAgIFB5X3NzaXplX3Qgc3RhcnQsCQkvKiBTdGFydCBpbmRleCAqLwotICAgIFB5X3NzaXplX3QgZW5kLAkJLyogU3RvcCBpbmRleCAqLwotICAgIGludCBkaXJlY3Rpb24JCS8qIEZpbmQgZGlyZWN0aW9uOiArMSBmb3J3YXJkLCAtMSBiYWNrd2FyZCAqLworICAgIFB5T2JqZWN0ICpzdHIsICAgICAgICAgICAgICAvKiBTdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqc3Vic3RyLCAgICAgICAgICAgLyogU3Vic3RyaW5nIHRvIGZpbmQgKi8KKyAgICBQeV9zc2l6ZV90IHN0YXJ0LCAgICAgICAgICAgLyogU3RhcnQgaW5kZXggKi8KKyAgICBQeV9zc2l6ZV90IGVuZCwgICAgICAgICAgICAgLyogU3RvcCBpbmRleCAqLworICAgIGludCBkaXJlY3Rpb24gICAgICAgICAgICAgICAvKiBGaW5kIGRpcmVjdGlvbjogKzEgZm9yd2FyZCwgLTEgYmFja3dhcmQgKi8KICAgICApOwogCiAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHN1YnN0ciBpbiBzdHJbc3RhcnQ6ZW5kXS4gKi8KIAogUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVVuaWNvZGVfQ291bnQoCi0gICAgUHlPYmplY3QgKnN0ciwJCS8qIFN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqc3Vic3RyLAkJLyogU3Vic3RyaW5nIHRvIGNvdW50ICovCi0gICAgUHlfc3NpemVfdCBzdGFydCwJCS8qIFN0YXJ0IGluZGV4ICovCi0gICAgUHlfc3NpemVfdCBlbmQJCS8qIFN0b3AgaW5kZXggKi8KKyAgICBQeU9iamVjdCAqc3RyLCAgICAgICAgICAgICAgLyogU3RyaW5nICovCisgICAgUHlPYmplY3QgKnN1YnN0ciwgICAgICAgICAgIC8qIFN1YnN0cmluZyB0byBjb3VudCAqLworICAgIFB5X3NzaXplX3Qgc3RhcnQsICAgICAgICAgICAvKiBTdGFydCBpbmRleCAqLworICAgIFB5X3NzaXplX3QgZW5kICAgICAgICAgICAgICAvKiBTdG9wIGluZGV4ICovCiAgICAgKTsKIAogLyogUmVwbGFjZSBhdCBtb3N0IG1heGNvdW50IG9jY3VycmVuY2VzIG9mIHN1YnN0ciBpbiBzdHIgd2l0aCByZXBsc3RyCiAgICBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgVW5pY29kZSBvYmplY3QuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlX1JlcGxhY2UoCi0gICAgUHlPYmplY3QgKnN0ciwJCS8qIFN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqc3Vic3RyLAkJLyogU3Vic3RyaW5nIHRvIGZpbmQgKi8KLSAgICBQeU9iamVjdCAqcmVwbHN0ciwJCS8qIFN1YnN0cmluZyB0byByZXBsYWNlICovCi0gICAgUHlfc3NpemVfdCBtYXhjb3VudAkJLyogTWF4LiBudW1iZXIgb2YgcmVwbGFjZW1lbnRzIHRvIGFwcGx5OwotCQkJCSAgIC0xID0gYWxsICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIFN0cmluZyAqLworICAgIFB5T2JqZWN0ICpzdWJzdHIsICAgICAgICAgICAvKiBTdWJzdHJpbmcgdG8gZmluZCAqLworICAgIFB5T2JqZWN0ICpyZXBsc3RyLCAgICAgICAgICAvKiBTdWJzdHJpbmcgdG8gcmVwbGFjZSAqLworICAgIFB5X3NzaXplX3QgbWF4Y291bnQgICAgICAgICAvKiBNYXguIG51bWJlciBvZiByZXBsYWNlbWVudHMgdG8gYXBwbHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xID0gYWxsICovCiAgICAgKTsKIAogLyogQ29tcGFyZSB0d28gc3RyaW5ncyBhbmQgcmV0dXJuIC0xLCAwLCAxIGZvciBsZXNzIHRoYW4sIGVxdWFsLAogICAgZ3JlYXRlciB0aGFuIHJlc3AuICovCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVfQ29tcGFyZSgKLSAgICBQeU9iamVjdCAqbGVmdCwJCS8qIExlZnQgc3RyaW5nICovIAotICAgIFB5T2JqZWN0ICpyaWdodAkJLyogUmlnaHQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKmxlZnQsICAgICAgICAgICAgIC8qIExlZnQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKnJpZ2h0ICAgICAgICAgICAgIC8qIFJpZ2h0IHN0cmluZyAqLwogICAgICk7CiAKIC8qIFJpY2ggY29tcGFyZSB0d28gc3RyaW5ncyBhbmQgcmV0dXJuIG9uZSBvZiB0aGUgZm9sbG93aW5nOgpAQCAtMTMwMiwxNyArMTMwMiwxNyBAQAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVfUmljaENvbXBhcmUoCi0gICAgUHlPYmplY3QgKmxlZnQsCQkvKiBMZWZ0IHN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqcmlnaHQsCQkvKiBSaWdodCBzdHJpbmcgKi8KLSAgICBpbnQgb3AJCQkvKiBPcGVyYXRpb246IFB5X0VRLCBQeV9ORSwgUHlfR1QsIGV0Yy4gKi8KKyAgICBQeU9iamVjdCAqbGVmdCwgICAgICAgICAgICAgLyogTGVmdCBzdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqcmlnaHQsICAgICAgICAgICAgLyogUmlnaHQgc3RyaW5nICovCisgICAgaW50IG9wICAgICAgICAgICAgICAgICAgICAgIC8qIE9wZXJhdGlvbjogUHlfRVEsIFB5X05FLCBQeV9HVCwgZXRjLiAqLwogICAgICk7CiAKIC8qIEFwcGx5IGEgYXJndW1lbnQgdHVwbGUgb3IgZGljdGlvbmFyeSB0byBhIGZvcm1hdCBzdHJpbmcgYW5kIHJldHVybgogICAgdGhlIHJlc3VsdGluZyBVbmljb2RlIHN0cmluZy4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVfRm9ybWF0KAotICAgIFB5T2JqZWN0ICpmb3JtYXQsCQkvKiBGb3JtYXQgc3RyaW5nICovIAotICAgIFB5T2JqZWN0ICphcmdzCQkvKiBBcmd1bWVudCB0dXBsZSBvciBkaWN0aW9uYXJ5ICovCisgICAgUHlPYmplY3QgKmZvcm1hdCwgICAgICAgICAgIC8qIEZvcm1hdCBzdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqYXJncyAgICAgICAgICAgICAgLyogQXJndW1lbnQgdHVwbGUgb3IgZGljdGlvbmFyeSAqLwogICAgICk7CiAKIC8qIENoZWNrcyB3aGV0aGVyIGVsZW1lbnQgaXMgY29udGFpbmVkIGluIGNvbnRhaW5lciBhbmQgcmV0dXJuIDEvMApAQCAtMTMyMiw4ICsxMzIyLDggQEAKICAgIHJldHVybmVkIGluIGNhc2Ugb2YgYW4gZXJyb3IuICovCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVfQ29udGFpbnMoCi0gICAgUHlPYmplY3QgKmNvbnRhaW5lciwJLyogQ29udGFpbmVyIHN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqZWxlbWVudAkJLyogRWxlbWVudCBzdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqY29udGFpbmVyLCAgICAgICAgLyogQ29udGFpbmVyIHN0cmluZyAqLworICAgIFB5T2JqZWN0ICplbGVtZW50ICAgICAgICAgICAvKiBFbGVtZW50IHN0cmluZyAqLwogICAgICk7CiAKIC8qIEV4dGVybmFsbHkgdmlzaWJsZSBmb3Igc3RyLnN0cmlwKHVuaWNvZGUpICovCkBAIC0xMzQwLDcwICsxMzQwLDcwIEBACiBQeUFQSV9EQVRBKGNvbnN0IHVuc2lnbmVkIGNoYXIpIF9QeV9hc2NpaV93aGl0ZXNwYWNlW107CiAKIC8qIFRoZXNlIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS4gVXNlIHRoZSBQeV9VTklDT0RFX0lTKiBhbmQKLSAgIFB5X1VOSUNPREVfVE8qIG1hY3JvcyBpbnN0ZWFkLiAKKyAgIFB5X1VOSUNPREVfVE8qIG1hY3JvcyBpbnN0ZWFkLgogCiAgICBUaGVzZSBBUElzIGFyZSBpbXBsZW1lbnRlZCBpbiBPYmplY3RzL3VuaWNvZGVjdHlwZS5jLgogCiAqLwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0xvd2VyY2FzZSgKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc1VwcGVyY2FzZSgKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc1RpdGxlY2FzZSgKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc1doaXRlc3BhY2UoCi0gICAgY29uc3QgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFIGNoICAgICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0xpbmVicmVhaygKLSAgICBjb25zdCBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIGNvbnN0IFB5X1VOSUNPREUgY2ggICAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlfVU5JQ09ERSkgX1B5VW5pY29kZV9Ub0xvd2VyY2FzZSgKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5X1VOSUNPREUpIF9QeVVuaWNvZGVfVG9VcHBlcmNhc2UoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeV9VTklDT0RFKSBfUHlVbmljb2RlX1RvVGl0bGVjYXNlKAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX1RvRGVjaW1hbERpZ2l0KAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX1RvRGlnaXQoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhkb3VibGUpIF9QeVVuaWNvZGVfVG9OdW1lcmljKAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0lzRGVjaW1hbERpZ2l0KAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0lzRGlnaXQoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNOdW1lcmljKAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0lzQWxwaGEoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9Db2xvclBpY2tlcm1vZHVsZS5jIGIvTWFjL01vZHVsZXMvQ29sb3JQaWNrZXJtb2R1bGUuYwppbmRleCA1MWQ3YzM3Li42ODhjNDY4IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9Db2xvclBpY2tlcm1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL0NvbG9yUGlja2VybW9kdWxlLmMKQEAgLTcsMTUgKzcsMTUgQEAKIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBKdXN0IHZhbiBSb3NzdW0gbm90IGJlIAotdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBKdXN0IHZhbiBSb3NzdW0gbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KIAotSlVTVCBWQU4gUk9TU1VNIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCAKLUlOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gCi1FVkVOVCBTSEFMTCBKVVNUIFZBTiBST1NTVU0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgCi1DT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIAotVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIAorSlVTVCBWQU4gUk9TU1VNIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworRVZFTlQgU0hBTEwgSlVTVCBWQU4gUk9TU1VNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCitVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAKQEAgLTM3LDE3ICszNywxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNwX0dldENvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlSR0JDb2xvciBpbkNvbG9yLCBvdXRDb2xvcjsKLQlCb29sZWFuIG9rOwotCVBvaW50IHdoZXJlID0gezAsIDB9OwotCVN0cjI1NSBwcm9tcHQ7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mIiwgUHlNYWNfR2V0U3RyMjU1LCBwcm9tcHQsIFFkUkdCX0NvbnZlcnQsICZpbkNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0Jb2sgPSBHZXRDb2xvcih3aGVyZSwgcHJvbXB0LCAmaW5Db2xvciwgJm91dENvbG9yKTsKLQkKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZoIiwgUWRSR0JfTmV3LCAmb3V0Q29sb3IsIG9rKTsKKyAgICBSR0JDb2xvciBpbkNvbG9yLCBvdXRDb2xvcjsKKyAgICBCb29sZWFuIG9rOworICAgIFBvaW50IHdoZXJlID0gezAsIDB9OworICAgIFN0cjI1NSBwcm9tcHQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyYiLCBQeU1hY19HZXRTdHIyNTUsIHByb21wdCwgUWRSR0JfQ29udmVydCwgJmluQ29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG9rID0gR2V0Q29sb3Iod2hlcmUsIHByb21wdCwgJmluQ29sb3IsICZvdXRDb2xvcik7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZoIiwgUWRSR0JfTmV3LCAmb3V0Q29sb3IsIG9rKTsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCkBAIC01NSwzNiArNTUsMzYgQEAKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBjcF9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJHZXRDb2xvciIsCShQeUNGdW5jdGlvbiljcF9HZXRDb2xvciwJTUVUSF9WQVJBUkdTLAljcF9HZXRDb2xvcl9fZG9jX199LAorICAgIHsiR2V0Q29sb3IiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWNwX0dldENvbG9yLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgY3BfR2V0Q29sb3JfX2RvY19ffSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLAkgCQkoUHlDRnVuY3Rpb24pTlVMTCwgCQkJMCwgCQkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pTlVMTCwgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIAogLyogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBtb2R1bGUgKCptdXN0KiBiZSBjYWxsZWQgaW5pdENvbG9yUGlja2VyKSAqLwogCi1zdGF0aWMgY2hhciBjcF9tb2R1bGVfZG9jdW1lbnRhdGlvbltdID0gCitzdGF0aWMgY2hhciBjcF9tb2R1bGVfZG9jdW1lbnRhdGlvbltdID0KICIiCiA7CiAKIHZvaWQgaW5pdENvbG9yUGlja2VyKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHRoZSBDb2xvclBpY2tlciBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSA8IDApCi0JCXJldHVybjsKKyAgICBQeU9iamVjdCAqbTsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlNCgiQ29sb3JQaWNrZXIiLCBjcF9tZXRob2RzLAotCQljcF9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKLQkJKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHRoZSBDb2xvclBpY2tlciBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSBoZXJlICovCi0JCi0JLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KLQkKLQkvKiBDaGVjayBmb3IgZXJyb3JzICovCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIENvbG9yUGlja2VyIik7CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJDb2xvclBpY2tlciIsIGNwX21ldGhvZHMsCisgICAgICAgIGNwX21vZHVsZV9kb2N1bWVudGF0aW9uLAorICAgICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKworICAgIC8qIEFkZCBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSBoZXJlICovCisKKyAgICAvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLworCisgICAgLyogQ2hlY2sgZm9yIGVycm9ycyAqLworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIG1vZHVsZSBDb2xvclBpY2tlciIpOwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9NYWNPUy5jIGIvTWFjL01vZHVsZXMvTWFjT1MuYwppbmRleCAxOWRlYjQ0Li4yOGRlNGY1IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9NYWNPUy5jCisrKyBiL01hYy9Nb2R1bGVzL01hY09TLmMKQEAgLTQsMTAgKzQsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAogCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIFN0aWNodGluZyBNYXRoZW1hdGlzY2gKIENlbnRydW0gb3IgQ1dJIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCiBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KQEAgLTM0LDcgKzM0LDcgQEAKIAogCiAjaWZuZGVmIEhBVkVfT1NYMTA1X1NESwotdHlwZWRlZiBTSW50MTYJRlNJT1JlZk51bTsKK3R5cGVkZWYgU0ludDE2ICBGU0lPUmVmTnVtOwogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqTWFjT1NfRXJyb3I7IC8qIEV4Y2VwdGlvbiBNYWNPUy5FcnJvciAqLwpAQCAtNDYsOSArNDYsOSBAQAogLyogRGVjbGFyYXRpb25zIGZvciBvYmplY3RzIG9mIHR5cGUgUmVzb3VyY2UgZm9yayAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUZTSU9SZWZOdW0gZlJlZk51bTsKLQlpbnQgaXNjbG9zZWQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZTSU9SZWZOdW0gZlJlZk51bTsKKyAgICBpbnQgaXNjbG9zZWQ7CiB9IHJmb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFJmdHlwZTsKQEAgLTYwLDE2NiArNjAsMTY2IEBACiBzdGF0aWMgdm9pZAogZG9fY2xvc2UocmZvYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmlzY2xvc2VkICkgcmV0dXJuOwotCSh2b2lkKUZTQ2xvc2VGb3JrKHNlbGYtPmZSZWZOdW0pOwotCXNlbGYtPmlzY2xvc2VkID0gMTsKKyAgICBpZiAoc2VsZi0+aXNjbG9zZWQgKSByZXR1cm47CisgICAgKHZvaWQpRlNDbG9zZUZvcmsoc2VsZi0+ZlJlZk51bSk7CisgICAgc2VsZi0+aXNjbG9zZWQgPSAxOwogfQogCi1zdGF0aWMgY2hhciByZl9yZWFkX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciByZl9yZWFkX19kb2NfX1tdID0KICJSZWFkIGRhdGEgZnJvbSByZXNvdXJjZSBmb3JrIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogcmZfcmVhZChyZm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBuOwotCVB5T2JqZWN0ICp2OwotCU9TRXJyIGVycjsKLQlCeXRlQ291bnQgbjI7Ci0JCi0JaWYgKHNlbGYtPmlzY2xvc2VkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiT3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmbikpCi0JCXJldHVybiBOVUxMOwotCQkKLQl2ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG4pOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCQkKLQllcnIgPSBGU1JlYWRGb3JrKHNlbGYtPmZSZWZOdW0sIGZzQXRNYXJrLCAwLCBuLCBQeVN0cmluZ19Bc1N0cmluZyh2KSwgJm4yKTsKLQlpZiAoZXJyICYmIGVyciAhPSBlb2ZFcnIpIHsKLQkJUHlNYWNfRXJyb3IoZXJyKTsKLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgbjIpOwotCXJldHVybiB2OworICAgIGxvbmcgbjsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBPU0VyciBlcnI7CisgICAgQnl0ZUNvdW50IG4yOworCisgICAgaWYgKHNlbGYtPmlzY2xvc2VkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiT3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB2ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZXJyID0gRlNSZWFkRm9yayhzZWxmLT5mUmVmTnVtLCBmc0F0TWFyaywgMCwgbiwgUHlTdHJpbmdfQXNTdHJpbmcodiksICZuMik7CisgICAgaWYgKGVyciAmJiBlcnIgIT0gZW9mRXJyKSB7CisgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIF9QeVN0cmluZ19SZXNpemUoJnYsIG4yKTsKKyAgICByZXR1cm4gdjsKIH0KIAogCi1zdGF0aWMgY2hhciByZl93cml0ZV9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgcmZfd3JpdGVfX2RvY19fW10gPQogIldyaXRlIHRvIHJlc291cmNlIGZvcmsiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZl93cml0ZShyZm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqYnVmZmVyOwotCWxvbmcgc2l6ZTsKLQlPU0VyciBlcnI7Ci0JCi0JaWYgKHNlbGYtPmlzY2xvc2VkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiT3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjIiwgJmJ1ZmZlciwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBGU1dyaXRlRm9yayhzZWxmLT5mUmVmTnVtLCBmc0F0TWFyaywgMCwgc2l6ZSwgYnVmZmVyLCBOVUxMKTsKLQlpZiAoZXJyKSB7Ci0JCVB5TWFjX0Vycm9yKGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqYnVmZmVyOworICAgIGxvbmcgc2l6ZTsKKyAgICBPU0VyciBlcnI7CisKKyAgICBpZiAoc2VsZi0+aXNjbG9zZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJPcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyMiLCAmYnVmZmVyLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IEZTV3JpdGVGb3JrKHNlbGYtPmZSZWZOdW0sIGZzQXRNYXJrLCAwLCBzaXplLCBidWZmZXIsIE5VTEwpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCi1zdGF0aWMgY2hhciByZl9zZWVrX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciByZl9zZWVrX19kb2NfX1tdID0KICJTZXQgZmlsZSBwb3NpdGlvbiIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJmX3NlZWsocmZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYW1vdW50OwotCWludCB3aGVuY2UgPSBTRUVLX1NFVDsKLQlpbnQgbW9kZTsKLQlPU0VyciBlcnI7Ci0JCi0JaWYgKHNlbGYtPmlzY2xvc2VkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiT3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImx8aSIsICZhbW91bnQsICZ3aGVuY2UpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlzd2l0Y2ggKHdoZW5jZSkgewotCWNhc2UgU0VFS19DVVI6Ci0JCW1vZGUgPSBmc0Zyb21NYXJrOwotCQlicmVhazsKLQljYXNlIFNFRUtfRU5EOgotCQltb2RlID0gZnNGcm9tTEVPRjsKLQkJYnJlYWs7Ci0JY2FzZSBTRUVLX1NFVDoKLQkJbW9kZSA9IGZzRnJvbVN0YXJ0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbG9uZyBhbW91bnQ7CisgICAgaW50IHdoZW5jZSA9IFNFRUtfU0VUOworICAgIGludCBtb2RlOworICAgIE9TRXJyIGVycjsKIAotCWVyciA9IEZTU2V0Rm9ya1Bvc2l0aW9uKHNlbGYtPmZSZWZOdW0sIG1vZGUsIGFtb3VudCk7Ci0JaWYgKGVyciAhPSBub0VycikgewotCQlQeU1hY19FcnJvcihlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChzZWxmLT5pc2Nsb3NlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsfGkiLCAmYW1vdW50LCAmd2hlbmNlKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHdoZW5jZSkgeworICAgIGNhc2UgU0VFS19DVVI6CisgICAgICAgIG1vZGUgPSBmc0Zyb21NYXJrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFRUtfRU5EOgorICAgICAgICBtb2RlID0gZnNGcm9tTEVPRjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUVLX1NFVDoKKyAgICAgICAgbW9kZSA9IGZzRnJvbVN0YXJ0OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBlcnIgPSBGU1NldEZvcmtQb3NpdGlvbihzZWxmLT5mUmVmTnVtLCBtb2RlLCBhbW91bnQpOworICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCi1zdGF0aWMgY2hhciByZl90ZWxsX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciByZl90ZWxsX19kb2NfX1tdID0KICJHZXQgZmlsZSBwb3NpdGlvbiIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJmX3RlbGwocmZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgbG9uZyB3aGVyZTsKLQlPU0VyciBlcnI7Ci0JCi0JaWYgKHNlbGYtPmlzY2xvc2VkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiT3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBsb25nIGxvbmcgd2hlcmU7CisgICAgT1NFcnIgZXJyOwogCi0JZXJyID0gRlNHZXRGb3JrUG9zaXRpb24oc2VsZi0+ZlJlZk51bSwgJndoZXJlKTsKLQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCVB5TWFjX0Vycm9yKGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh3aGVyZSk7CisgICAgaWYgKHNlbGYtPmlzY2xvc2VkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiT3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGVyciA9IEZTR2V0Rm9ya1Bvc2l0aW9uKHNlbGYtPmZSZWZOdW0sICZ3aGVyZSk7CisgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcod2hlcmUpOwogfQogCi1zdGF0aWMgY2hhciByZl9jbG9zZV9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgcmZfY2xvc2VfX2RvY19fW10gPQogIkNsb3NlIHJlc291cmNlIGZvcmsiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZl9jbG9zZShyZm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZG9fY2xvc2Uoc2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRvX2Nsb3NlKHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHJmX21ldGhvZHNbXSA9IHsKLSB7InJlYWQiLAkoUHlDRnVuY3Rpb24pcmZfcmVhZCwJMSwJcmZfcmVhZF9fZG9jX199LAotIHsid3JpdGUiLAkoUHlDRnVuY3Rpb24pcmZfd3JpdGUsCTEsCXJmX3dyaXRlX19kb2NfX30sCi0geyJzZWVrIiwJKFB5Q0Z1bmN0aW9uKXJmX3NlZWssCTEsCXJmX3NlZWtfX2RvY19ffSwKLSB7InRlbGwiLAkoUHlDRnVuY3Rpb24pcmZfdGVsbCwJMSwJcmZfdGVsbF9fZG9jX199LAotIHsiY2xvc2UiLAkoUHlDRnVuY3Rpb24pcmZfY2xvc2UsCTEsCXJmX2Nsb3NlX19kb2NfX30sCi0gCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyB7InJlYWQiLCAgICAgICAoUHlDRnVuY3Rpb24pcmZfcmVhZCwgICAxLCAgICAgIHJmX3JlYWRfX2RvY19ffSwKKyB7IndyaXRlIiwgICAgICAoUHlDRnVuY3Rpb24pcmZfd3JpdGUsICAxLCAgICAgIHJmX3dyaXRlX19kb2NfX30sCisgeyJzZWVrIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXJmX3NlZWssICAgMSwgICAgICByZl9zZWVrX19kb2NfX30sCisgeyJ0ZWxsIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXJmX3RlbGwsICAgMSwgICAgICByZl90ZWxsX19kb2NfX30sCisgeyJjbG9zZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXJmX2Nsb3NlLCAgMSwgICAgICByZl9jbG9zZV9fZG9jX199LAorCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0gKi8KQEAgLTIyOCw1NiArMjI4LDU2IEBACiBzdGF0aWMgcmZvYmplY3QgKgogbmV3cmZvYmplY3Qodm9pZCkKIHsKLQlyZm9iamVjdCAqc2VsZjsKLQkKLQlzZWxmID0gUHlPYmplY3RfTkVXKHJmb2JqZWN0LCAmUmZ0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5pc2Nsb3NlZCA9IDE7Ci0JcmV0dXJuIHNlbGY7CisgICAgcmZvYmplY3QgKnNlbGY7CisKKyAgICBzZWxmID0gUHlPYmplY3RfTkVXKHJmb2JqZWN0LCAmUmZ0eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5pc2Nsb3NlZCA9IDE7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIAogc3RhdGljIHZvaWQKIHJmX2RlYWxsb2MocmZvYmplY3QgKnNlbGYpCiB7Ci0JZG9fY2xvc2Uoc2VsZik7Ci0JUHlPYmplY3RfREVMKHNlbGYpOworICAgIGRvX2Nsb3NlKHNlbGYpOworICAgIFB5T2JqZWN0X0RFTChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJmX2dldGF0dHIocmZvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QocmZfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QocmZfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKLXN0YXRpYyBjaGFyIFJmdHlwZV9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgUmZ0eXBlX19kb2NfX1tdID0KICJSZXNvdXJjZSBmb3JrIGZpbGUgb2JqZWN0IgogOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFJmdHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJCS8qb2Jfc2l6ZSovCi0JIk1hY09TLlJlc291cmNlRm9yayIsCQkvKnRwX25hbWUqLwotCXNpemVvZihyZm9iamVjdCksCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXJmX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JKHByaW50ZnVuYykwLAkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKXJmX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsCS8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpMCwJCS8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwJCS8qdHBfaGFzaCovCi0JKHRlcm5hcnlmdW5jKTAsCQkvKnRwX2NhbGwqLwotCShyZXByZnVuYykwLAkJLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiTWFjT1MuUmVzb3VyY2VGb3JrIiwgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihyZm9iamVjdCksICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpcmZfZGVhbGxvYywgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylyZl9nZXRhdHRyLCAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsICAgICAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKTAsICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgKGhhc2hmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgKHRlcm5hcnlmdW5jKTAsICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgKHJlcHJmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KIAotCS8qIFNwYWNlIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCi0JMEwsMEwsMEwsMEwsCi0JUmZ0eXBlX19kb2NfXyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLworICAgIC8qIFNwYWNlIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgICAgMEwsMEwsMEwsMEwsCisgICAgUmZ0eXBlX19kb2NfXyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLwogfTsKIAogCkBAIC0yOTIsNzEgKzI5Miw3MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIE1hY09TX0dldENyZWF0b3JBbmRUeXBlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqY3JlYXRvciwgKnR5cGUsICpyZXM7Ci0JT1NFcnIgZXJyOwotCUZTUmVmIHJlZjsKLQlGU0NhdGFsb2dJbmZvCWNhdGFsb2dpbmZvOwotCUZpbGVJbmZvKiBmaW5mbzsKKyAgICBQeU9iamVjdCAqY3JlYXRvciwgKnR5cGUsICpyZXM7CisgICAgT1NFcnIgZXJyOworICAgIEZTUmVmIHJlZjsKKyAgICBGU0NhdGFsb2dJbmZvICAgICAgIGNhdGFsb2dpbmZvOworICAgIEZpbGVJbmZvKiBmaW5mbzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRGU1JlZiwgJnJlZikpIHsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0RlNSZWYsICZyZWYpKSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JCS8qIFRoaXMgZnVuY3Rpb24gaXMgZG9jdW1lbnRlZCB0byB0YWtlIGFuIEZTU3BlYyBhcyB3ZWxsLAotCQkgKiB3aGljaCBvbmx5IHdvcmtzIGluIDMyLWJpdCBtb2RlLgotCQkgKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJRlNTcGVjIGZzczsKLQkJRkluZm8gaW5mbzsKKyAgICAgICAgLyogVGhpcyBmdW5jdGlvbiBpcyBkb2N1bWVudGVkIHRvIHRha2UgYW4gRlNTcGVjIGFzIHdlbGwsCisgICAgICAgICAqIHdoaWNoIG9ubHkgd29ya3MgaW4gMzItYml0IG1vZGUuCisgICAgICAgICAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBGU1NwZWMgZnNzOworICAgICAgICBGSW5mbyBpbmZvOwogCi0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRGU1NwZWMsICZmc3MpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRGU1NwZWMsICZmc3MpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKChlcnIgPSBGU3BHZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKSB7Ci0JCQlyZXR1cm4gUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBlcnIpOwotCQl9CisgICAgICAgIGlmICgoZXJyID0gRlNwR2V0RkluZm8oJmZzcywgJmluZm8pKSAhPSBub0VycikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgfQogCi0JCWluZm8uZmRDcmVhdG9yID0gbnRvaGwoaW5mby5mZENyZWF0b3IpOwotCQlpbmZvLmZkVHlwZSA9IG50b2hsKGluZm8uZmRUeXBlKTsKKyAgICAgICAgaW5mby5mZENyZWF0b3IgPSBudG9obChpbmZvLmZkQ3JlYXRvcik7CisgICAgICAgIGluZm8uZmRUeXBlID0gbnRvaGwoaW5mby5mZFR5cGUpOwogCi0JCWNyZWF0b3IgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkJCQkoY2hhciAqKSZpbmZvLmZkQ3JlYXRvciwgNCk7Ci0JCXR5cGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZpbmZvLmZkVHlwZSwgNCk7Ci0JCXJlcyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgY3JlYXRvciwgdHlwZSk7Ci0JCVB5X0RFQ1JFRihjcmVhdG9yKTsKLQkJUHlfREVDUkVGKHR5cGUpOwotCQlyZXR1cm4gcmVzOwotI2Vsc2UJLyogX19MUDY0X18gKi8KLQkJcmV0dXJuIE5VTEw7Ci0jZW5kaWYJLyogX19MUDY0X18gKi8KLQl9CisgICAgICAgIGNyZWF0b3IgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmluZm8uZmRDcmVhdG9yLCA0KTsKKyAgICAgICAgdHlwZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJmluZm8uZmRUeXBlLCA0KTsKKyAgICAgICAgcmVzID0gUHlfQnVpbGRWYWx1ZSgiT08iLCBjcmVhdG9yLCB0eXBlKTsKKyAgICAgICAgUHlfREVDUkVGKGNyZWF0b3IpOworICAgICAgICBQeV9ERUNSRUYodHlwZSk7CisgICAgICAgIHJldHVybiByZXM7CisjZWxzZSAgIC8qIF9fTFA2NF9fICovCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmICAvKiBfX0xQNjRfXyAqLworICAgIH0KIAotCWVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJnJlZiwgCi0JCQlrRlNDYXRJbmZvRmluZGVySW5mb3xrRlNDYXRJbmZvTm9kZUZsYWdzLCAmY2F0YWxvZ2luZm8sIAotCQkJTlVMTCwgTlVMTCwgTlVMTCk7Ci0JaWYgKGVyciAhPSBub0VycikgewotCQlQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBlcnIgPSBGU0dldENhdGFsb2dJbmZvKCZyZWYsCisgICAgICAgICAgICAgICAgICAgIGtGU0NhdEluZm9GaW5kZXJJbmZvfGtGU0NhdEluZm9Ob2RlRmxhZ3MsICZjYXRhbG9naW5mbywKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICBQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICgoY2F0YWxvZ2luZm8ubm9kZUZsYWdzICYga0ZTTm9kZUlzRGlyZWN0b3J5TWFzaykgIT0gMCkgewotCQkvKiBEaXJlY3Rvcnk6IGRvZXNuJ3QgaGF2ZSB0eXBlL2NyZWF0b3IgaW5mby4KLQkJICoKLQkJICogVGhlIHNwZWNpZmljIGVycm9yIGNvZGUgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAotCQkgKiBlYXJsaWVyIHZlcnNpb25zLgotCQkgKi8KLQkJUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBmbmZFcnIpOwotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKGNhdGFsb2dpbmZvLm5vZGVGbGFncyAmIGtGU05vZGVJc0RpcmVjdG9yeU1hc2spICE9IDApIHsKKyAgICAgICAgLyogRGlyZWN0b3J5OiBkb2Vzbid0IGhhdmUgdHlwZS9jcmVhdG9yIGluZm8uCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBzcGVjaWZpYyBlcnJvciBjb2RlIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICAgICAgICogZWFybGllciB2ZXJzaW9ucy4KKyAgICAgICAgICovCisgICAgICAgIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZm5mRXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl9IAotCWZpbmZvID0gKEZpbGVJbmZvKikmKGNhdGFsb2dpbmZvLmZpbmRlckluZm8pOwotCWZpbmZvLT5maWxlQ3JlYXRvciA9IG50b2hsKGZpbmZvLT5maWxlQ3JlYXRvcik7Ci0JZmluZm8tPmZpbGVUeXBlID0gbnRvaGwoZmluZm8tPmZpbGVUeXBlKTsKLQljcmVhdG9yID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKSYoZmluZm8tPmZpbGVDcmVhdG9yKSwgNCk7Ci0JdHlwZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKikmKGZpbmZvLT5maWxlVHlwZSksIDQpOworICAgIH0KKyAgICBmaW5mbyA9IChGaWxlSW5mbyopJihjYXRhbG9naW5mby5maW5kZXJJbmZvKTsKKyAgICBmaW5mby0+ZmlsZUNyZWF0b3IgPSBudG9obChmaW5mby0+ZmlsZUNyZWF0b3IpOworICAgIGZpbmZvLT5maWxlVHlwZSA9IG50b2hsKGZpbmZvLT5maWxlVHlwZSk7CisgICAgY3JlYXRvciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKikmKGZpbmZvLT5maWxlQ3JlYXRvciksIDQpOworICAgIHR5cGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopJihmaW5mby0+ZmlsZVR5cGUpLCA0KTsKIAotCXJlcyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgY3JlYXRvciwgdHlwZSk7Ci0JUHlfREVDUkVGKGNyZWF0b3IpOwotCVB5X0RFQ1JFRih0eXBlKTsKLQlyZXR1cm4gcmVzOworICAgIHJlcyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgY3JlYXRvciwgdHlwZSk7CisgICAgUHlfREVDUkVGKGNyZWF0b3IpOworICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgY2hhciBzZXRjcnRwX2RvY1tdID0gIlNldCBNYWNPUyA0LWNoYXIgY3JlYXRvciBhbmQgdHlwZSBmb3IgYSBmaWxlIjsKQEAgLTM2NCw2OCArMzY0LDY4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfU2V0Q3JlYXRvckFuZFR5cGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVJlc1R5cGUgY3JlYXRvciwgdHlwZTsKLQlGU1JlZiByZWY7Ci0JRmlsZUluZm8qIGZpbmZvOwotCU9TRXJyIGVycjsKLQlGU0NhdGFsb2dJbmZvCWNhdGFsb2dpbmZvOworICAgIFJlc1R5cGUgY3JlYXRvciwgdHlwZTsKKyAgICBGU1JlZiByZWY7CisgICAgRmlsZUluZm8qIGZpbmZvOworICAgIE9TRXJyIGVycjsKKyAgICBGU0NhdGFsb2dJbmZvICAgICAgIGNhdGFsb2dpbmZvOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyYiLAotCQkJUHlNYWNfR2V0RlNSZWYsICZyZWYsIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsIFB5TWFjX0dldE9TVHlwZSwgJnR5cGUpKSB7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnJlZiwgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZSkpIHsKICNpZm5kZWYgX19MUDY0X18KLQkJLyogVHJ5IHRvIGhhbmRsZSBGU1NwZWMgYXJndW1lbnRzLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCQlGU1NwZWMgZnNzOwotCQlGSW5mbyBpbmZvOworICAgICAgICAvKiBUcnkgdG8gaGFuZGxlIEZTU3BlYyBhcmd1bWVudHMsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisgICAgICAgIEZTU3BlYyBmc3M7CisgICAgICAgIEZJbmZvIGluZm87CiAKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyYiLAotCQkJUHlNYWNfR2V0RlNTcGVjLCAmZnNzLCBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLCBQeU1hY19HZXRPU1R5cGUsICZ0eXBlKSkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsIFB5TWFjX0dldE9TVHlwZSwgJnR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKChlcnIgPSBGU3BHZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQotCQkJcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgaWYgKChlcnIgPSBGU3BHZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKIAotCQlpbmZvLmZkQ3JlYXRvciA9IGNyZWF0b3I7Ci0JCWluZm8uZmRUeXBlID0gdHlwZTsKKyAgICAgICAgaW5mby5mZENyZWF0b3IgPSBjcmVhdG9yOworICAgICAgICBpbmZvLmZkVHlwZSA9IHR5cGU7CiAKLQkJaWYgKChlcnIgPSBGU3BTZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQotCQkJcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgaWYgKChlcnIgPSBGU3BTZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKICNlbHNlIC8qIF9fTFA2NF9fICovCi0JCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCX0KLQkKLQllcnIgPSBGU0dldENhdGFsb2dJbmZvKCZyZWYsIAotCQkJa0ZTQ2F0SW5mb0ZpbmRlckluZm98a0ZTQ2F0SW5mb05vZGVGbGFncywgJmNhdGFsb2dpbmZvLCAKLQkJCU5VTEwsIE5VTEwsIE5VTEwpOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgfQogCi0JaWYgKChjYXRhbG9naW5mby5ub2RlRmxhZ3MgJiBrRlNOb2RlSXNEaXJlY3RvcnlNYXNrKSAhPSAwKSB7Ci0JCS8qIERpcmVjdG9yeTogZG9lc24ndCBoYXZlIHR5cGUvY3JlYXRvciBpbmZvLgotCQkgKgotCQkgKiBUaGUgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCi0JCSAqIGVhcmxpZXIgdmVyc2lvbnMuCi0JCSAqLwotCQlQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGZuZkVycik7Ci0JCXJldHVybiBOVUxMOworICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJnJlZiwKKyAgICAgICAgICAgICAgICAgICAga0ZTQ2F0SW5mb0ZpbmRlckluZm98a0ZTQ2F0SW5mb05vZGVGbGFncywgJmNhdGFsb2dpbmZvLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JfSAKLQlmaW5mbyA9IChGaWxlSW5mbyopJihjYXRhbG9naW5mby5maW5kZXJJbmZvKTsKLQlmaW5mby0+ZmlsZUNyZWF0b3IgPSBjcmVhdG9yOwotCWZpbmZvLT5maWxlVHlwZSA9IHR5cGU7CisgICAgaWYgKChjYXRhbG9naW5mby5ub2RlRmxhZ3MgJiBrRlNOb2RlSXNEaXJlY3RvcnlNYXNrKSAhPSAwKSB7CisgICAgICAgIC8qIERpcmVjdG9yeTogZG9lc24ndCBoYXZlIHR5cGUvY3JlYXRvciBpbmZvLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgICAgICAqIGVhcmxpZXIgdmVyc2lvbnMuCisgICAgICAgICAqLworICAgICAgICBQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGZuZkVycik7CisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyID0gRlNTZXRDYXRhbG9nSW5mbygmcmVmLCBrRlNDYXRJbmZvRmluZGVySW5mbywgJmNhdGFsb2dpbmZvKTsKLQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCVB5RXJyX01hYyhNYWNPU19FcnJvciwgZm5mRXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIH0KKyAgICBmaW5mbyA9IChGaWxlSW5mbyopJihjYXRhbG9naW5mby5maW5kZXJJbmZvKTsKKyAgICBmaW5mby0+ZmlsZUNyZWF0b3IgPSBjcmVhdG9yOworICAgIGZpbmZvLT5maWxlVHlwZSA9IHR5cGU7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZXJyID0gRlNTZXRDYXRhbG9nSW5mbygmcmVmLCBrRlNDYXRJbmZvRmluZGVySW5mbywgJmNhdGFsb2dpbmZvKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZm5mRXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTQzNCw2NSArNDM0LDY1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfR2V0RXJyb3JTdHJpbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBlcnI7Ci0JY2hhciBidWZbMjU2XTsKLQlIYW5kbGUgaDsKLQljaGFyICpzdHI7Ci0Jc3RhdGljIGludCBlcnJvcnNfbG9hZGVkOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZlcnIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpbnQgZXJyOworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgSGFuZGxlIGg7CisgICAgY2hhciAqc3RyOworICAgIHN0YXRpYyBpbnQgZXJyb3JzX2xvYWRlZDsKIAotCWggPSBHZXRSZXNvdXJjZSgnRXN0cicsIGVycik7Ci0JaWYgKCFoICYmICFlcnJvcnNfbG9hZGVkKSB7Ci0JCS8qCi0JCSoqIEF0dGVtcHQgdG8gb3BlbiB0aGUgcmVzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZQotCQkqKiBFc3RyIHJlc291cmNlcy4gV2UgaWdub3JlIGFsbCBlcnJvcnMuIFdlIGFsc28gdHJ5Ci0JCSoqIHRoaXMgb25seSBvbmNlLgotCQkqLwotCQlQeU9iamVjdCAqbSwgKnJ2OwotCQllcnJvcnNfbG9hZGVkID0gMTsKLQkJCi0JCW0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJtYWNyZXNvdXJjZSIpOwotCQlpZiAoIW0pIHsKLQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQlQeUVycl9QcmludCgpOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJ2ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChtLCAib3Blbl9lcnJvcl9yZXNvdXJjZSIsICIiKTsKLQkJCWlmICghcnYpIHsKLQkJCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQkJCVB5RXJyX1ByaW50KCk7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJLyogQW5kIHRyeSBhZ2Fpbi4uLiAqLwotCQkJCWggPSBHZXRSZXNvdXJjZSgnRXN0cicsIGVycik7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYobSk7Ci0JCX0KLQl9Ci0JLyoKLQkqKiBXaGV0aGVyIHRoZSBjb2RlIGFib3ZlIHN1Y2NlZWRlZCBvciBub3QsIHdlIHdvbid0IHRyeQotCSoqIGFnYWluLgotCSovCi0JZXJyb3JzX2xvYWRlZCA9IDE7Ci0JCQotCWlmIChoKSB7Ci0JCUhMb2NrKGgpOwotCQlzdHIgPSAoY2hhciAqKSpoOwotCQltZW1jcHkoYnVmLCBzdHIrMSwgKHVuc2lnbmVkIGNoYXIpc3RyWzBdKTsKLQkJYnVmWyh1bnNpZ25lZCBjaGFyKXN0clswXV0gPSAnXDAnOwotCQlIVW5sb2NrKGgpOwotCQlSZWxlYXNlUmVzb3VyY2UoaCk7Ci0JfQotCWVsc2UgewotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJNYWMgT1MgZXJyb3IgY29kZSAlZCIsIGVycik7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZlcnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJzIiwgYnVmKTsKKyAgICBoID0gR2V0UmVzb3VyY2UoJ0VzdHInLCBlcnIpOworICAgIGlmICghaCAmJiAhZXJyb3JzX2xvYWRlZCkgeworICAgICAgICAvKgorICAgICAgICAqKiBBdHRlbXB0IHRvIG9wZW4gdGhlIHJlc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICAgICAgKiogRXN0ciByZXNvdXJjZXMuIFdlIGlnbm9yZSBhbGwgZXJyb3JzLiBXZSBhbHNvIHRyeQorICAgICAgICAqKiB0aGlzIG9ubHkgb25jZS4KKyAgICAgICAgKi8KKyAgICAgICAgUHlPYmplY3QgKm0sICpydjsKKyAgICAgICAgZXJyb3JzX2xvYWRlZCA9IDE7CisKKyAgICAgICAgbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIm1hY3Jlc291cmNlIik7CisgICAgICAgIGlmICghbSkgeworICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcnYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG0sICJvcGVuX2Vycm9yX3Jlc291cmNlIiwgIiIpOworICAgICAgICAgICAgaWYgKCFydikgeworICAgICAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgICAgICAvKiBBbmQgdHJ5IGFnYWluLi4uICovCisgICAgICAgICAgICAgICAgaCA9IEdldFJlc291cmNlKCdFc3RyJywgZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICoqIFdoZXRoZXIgdGhlIGNvZGUgYWJvdmUgc3VjY2VlZGVkIG9yIG5vdCwgd2Ugd29uJ3QgdHJ5CisgICAgKiogYWdhaW4uCisgICAgKi8KKyAgICBlcnJvcnNfbG9hZGVkID0gMTsKKworICAgIGlmIChoKSB7CisgICAgICAgIEhMb2NrKGgpOworICAgICAgICBzdHIgPSAoY2hhciAqKSpoOworICAgICAgICBtZW1jcHkoYnVmLCBzdHIrMSwgKHVuc2lnbmVkIGNoYXIpc3RyWzBdKTsKKyAgICAgICAgYnVmWyh1bnNpZ25lZCBjaGFyKXN0clswXV0gPSAnXDAnOworICAgICAgICBIVW5sb2NrKGgpOworICAgICAgICBSZWxlYXNlUmVzb3VyY2UoaCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJNYWMgT1MgZXJyb3IgY29kZSAlZCIsIGVycik7CisgICAgfQorCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCBidWYpOwogfQogCiAKQEAgLTUwMyw0MiArNTAzLDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1Nfc3BsYXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzaWQgPSAtMTsKLQlzdGF0aWMgRGlhbG9nUHRyIGN1cmRpYWxvZyA9IE5VTEw7Ci0JRGlhbG9nUHRyIG9sZGRpYWxvZzsKLQlXaW5kb3dSZWYgdGhlV2luZG93OwotCUNHcmFmUHRyIHRoZVBvcnQ7CisgICAgaW50IHJlc2lkID0gLTE7CisgICAgc3RhdGljIERpYWxvZ1B0ciBjdXJkaWFsb2cgPSBOVUxMOworICAgIERpYWxvZ1B0ciBvbGRkaWFsb2c7CisgICAgV2luZG93UmVmIHRoZVdpbmRvdzsKKyAgICBDR3JhZlB0ciB0aGVQb3J0OwogI2lmIDAKLQlzaG9ydCB4cG9zLCB5cG9zLCB3aWR0aCwgaGVpZ2h0LCBzd2lkdGgsIHNoZWlnaHQ7CisgICAgc2hvcnQgeHBvcywgeXBvcywgd2lkdGgsIGhlaWdodCwgc3dpZHRoLCBzaGVpZ2h0OwogI2VuZGlmCi0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aSIsICZyZXNpZCkpCi0JCXJldHVybiBOVUxMOwotCW9sZGRpYWxvZyA9IGN1cmRpYWxvZzsKLQljdXJkaWFsb2cgPSBOVUxMOwogCi0JaWYgKCByZXNpZCAhPSAtMSApIHsKLQkJY3VyZGlhbG9nID0gR2V0TmV3RGlhbG9nKHJlc2lkLCBOVUxMLCAoV2luZG93UHRyKS0xKTsKLQkJaWYgKCBjdXJkaWFsb2cgKSB7Ci0JCQl0aGVXaW5kb3cgPSBHZXREaWFsb2dXaW5kb3coY3VyZGlhbG9nKTsKLQkJCXRoZVBvcnQgPSBHZXRXaW5kb3dQb3J0KHRoZVdpbmRvdyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aSIsICZyZXNpZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9sZGRpYWxvZyA9IGN1cmRpYWxvZzsKKyAgICBjdXJkaWFsb2cgPSBOVUxMOworCisgICAgaWYgKCByZXNpZCAhPSAtMSApIHsKKyAgICAgICAgY3VyZGlhbG9nID0gR2V0TmV3RGlhbG9nKHJlc2lkLCBOVUxMLCAoV2luZG93UHRyKS0xKTsKKyAgICAgICAgaWYgKCBjdXJkaWFsb2cgKSB7CisgICAgICAgICAgICB0aGVXaW5kb3cgPSBHZXREaWFsb2dXaW5kb3coY3VyZGlhbG9nKTsKKyAgICAgICAgICAgIHRoZVBvcnQgPSBHZXRXaW5kb3dQb3J0KHRoZVdpbmRvdyk7CiAjaWYgMAotCQkJd2lkdGggPSB0aGVQb3J0LT5wb3J0UmVjdC5yaWdodCAtIHRoZVBvcnQtPnBvcnRSZWN0LmxlZnQ7Ci0JCQloZWlnaHQgPSB0aGVQb3J0LT5wb3J0UmVjdC5ib3R0b20gLSB0aGVQb3J0LT5wb3J0UmVjdC50b3A7Ci0JCQlzd2lkdGggPSBxZC5zY3JlZW5CaXRzLmJvdW5kcy5yaWdodCAtIHFkLnNjcmVlbkJpdHMuYm91bmRzLmxlZnQ7Ci0JCQlzaGVpZ2h0ID0gcWQuc2NyZWVuQml0cy5ib3VuZHMuYm90dG9tIC0gcWQuc2NyZWVuQml0cy5ib3VuZHMudG9wIC0gTE1HZXRNQmFySGVpZ2h0KCk7Ci0JCQl4cG9zID0gKHN3aWR0aC13aWR0aCkvMjsKLQkJCXlwb3MgPSAoc2hlaWdodC1oZWlnaHQpLzUgKyBMTUdldE1CYXJIZWlnaHQoKTsKLQkJCU1vdmVXaW5kb3codGhlV2luZG93LCB4cG9zLCB5cG9zLCAwKTsKLQkJCVNob3dXaW5kb3codGhlV2luZG93KTsKKyAgICAgICAgICAgIHdpZHRoID0gdGhlUG9ydC0+cG9ydFJlY3QucmlnaHQgLSB0aGVQb3J0LT5wb3J0UmVjdC5sZWZ0OworICAgICAgICAgICAgaGVpZ2h0ID0gdGhlUG9ydC0+cG9ydFJlY3QuYm90dG9tIC0gdGhlUG9ydC0+cG9ydFJlY3QudG9wOworICAgICAgICAgICAgc3dpZHRoID0gcWQuc2NyZWVuQml0cy5ib3VuZHMucmlnaHQgLSBxZC5zY3JlZW5CaXRzLmJvdW5kcy5sZWZ0OworICAgICAgICAgICAgc2hlaWdodCA9IHFkLnNjcmVlbkJpdHMuYm91bmRzLmJvdHRvbSAtIHFkLnNjcmVlbkJpdHMuYm91bmRzLnRvcCAtIExNR2V0TUJhckhlaWdodCgpOworICAgICAgICAgICAgeHBvcyA9IChzd2lkdGgtd2lkdGgpLzI7CisgICAgICAgICAgICB5cG9zID0gKHNoZWlnaHQtaGVpZ2h0KS81ICsgTE1HZXRNQmFySGVpZ2h0KCk7CisgICAgICAgICAgICBNb3ZlV2luZG93KHRoZVdpbmRvdywgeHBvcywgeXBvcywgMCk7CisgICAgICAgICAgICBTaG93V2luZG93KHRoZVdpbmRvdyk7CiAjZW5kaWYKLQkJCURyYXdEaWFsb2coY3VyZGlhbG9nKTsKLQkJfQotCX0KLQlpZiAob2xkZGlhbG9nKQotCQlEaXNwb3NlRGlhbG9nKG9sZGRpYWxvZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgICAgICAgICAgRHJhd0RpYWxvZyhjdXJkaWFsb2cpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvbGRkaWFsb2cpCisgICAgICAgIERpc3Bvc2VEaWFsb2cob2xkZGlhbG9nKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBjaGFyIERlYnVnU3RyX2RvY1tdID0gIlN3aXRjaCB0byBsb3ctbGV2ZWwgZGVidWdnZXIgd2l0aCBhIG1lc3NhZ2UiOwpAQCAtNTQ2LDE1ICs1NDYsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19EZWJ1Z1N0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JU3RyMjU1IG1lc3NhZ2U7Ci0JUHlPYmplY3QgKm9iamVjdCA9IDA7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnxPIiwgUHlNYWNfR2V0U3RyMjU1LCBtZXNzYWdlLCAmb2JqZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JRGVidWdTdHIobWVzc2FnZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFN0cjI1NSBtZXNzYWdlOworICAgIFB5T2JqZWN0ICpvYmplY3QgPSAwOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnxPIiwgUHlNYWNfR2V0U3RyMjU1LCBtZXNzYWdlLCAmb2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBEZWJ1Z1N0cihtZXNzYWdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtNTYzLDU5ICs1NjMsNTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19TeXNCZWVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZHVyYXRpb24gPSA2OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGkiLCAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTeXNCZWVwKGR1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IGR1cmF0aW9uID0gNjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGkiLCAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTeXNCZWVwKGR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCi1zdGF0aWMgY2hhciBXTUF2YWlsYWJsZV9kb2NbXSA9IAotCSJUcnVlIGlmIHRoaXMgcHJvY2VzcyBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgZGlzcGxheS4iCi0JIldpbGwgZm9yZWdyb3VuZCB0aGUgYXBwbGljYXRpb24gb24gdGhlIGZpcnN0IGNhbGwgYXMgYSBzaWRlLWVmZmVjdC4iCi0JOworc3RhdGljIGNoYXIgV01BdmFpbGFibGVfZG9jW10gPQorICAgICJUcnVlIGlmIHRoaXMgcHJvY2VzcyBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgZGlzcGxheS4iCisgICAgIldpbGwgZm9yZWdyb3VuZCB0aGUgYXBwbGljYXRpb24gb24gdGhlIGZpcnN0IGNhbGwgYXMgYSBzaWRlLWVmZmVjdC4iCisgICAgOwogCiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfV01BdmFpbGFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0YXRpYyBQeU9iamVjdCAqcnYgPSBOVUxMOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWlmICghcnYpIHsKLQkJUHJvY2Vzc1NlcmlhbE51bWJlciBwc247Ci0JCQotCQkvKgotCQkqKiBUaGlzIGlzIGEgZmFpcmx5IGlubm9jdW91cyBjYWxsIHRvIG1ha2UgaWYgd2UgZG9uJ3QgaGF2ZSBhIHdpbmRvdwotCQkqKiBtYW5hZ2VyLCBvciBpZiB3ZSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gdGFsayB0byBpdC4gSXQgd2lsbCBwcmludAotCQkqKiBhIG1lc3NhZ2Ugb24gc3RkZXJyLCBidXQgYXQgbGVhc3QgaXQgd29uJ3QgYWJvcnQgdGhlIHByb2Nlc3MuCi0JCSoqIEl0IGFwcGVhcnMgdGhlIGZ1bmN0aW9uIGNhY2hlcyB0aGUgcmVzdWx0IGl0c2VsZiwgYW5kIGl0J3MgY2hlYXAsIHNvCi0JCSoqIG5vIG5lZWQgZm9yIHVzIHRvIGNhY2hlLgotCQkqLworICAgIHN0YXRpYyBQeU9iamVjdCAqcnYgPSBOVUxMOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFydikgeworICAgICAgICBQcm9jZXNzU2VyaWFsTnVtYmVyIHBzbjsKKworICAgICAgICAvKgorICAgICAgICAqKiBUaGlzIGlzIGEgZmFpcmx5IGlubm9jdW91cyBjYWxsIHRvIG1ha2UgaWYgd2UgZG9uJ3QgaGF2ZSBhIHdpbmRvdworICAgICAgICAqKiBtYW5hZ2VyLCBvciBpZiB3ZSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gdGFsayB0byBpdC4gSXQgd2lsbCBwcmludAorICAgICAgICAqKiBhIG1lc3NhZ2Ugb24gc3RkZXJyLCBidXQgYXQgbGVhc3QgaXQgd29uJ3QgYWJvcnQgdGhlIHByb2Nlc3MuCisgICAgICAgICoqIEl0IGFwcGVhcnMgdGhlIGZ1bmN0aW9uIGNhY2hlcyB0aGUgcmVzdWx0IGl0c2VsZiwgYW5kIGl0J3MgY2hlYXAsIHNvCisgICAgICAgICoqIG5vIG5lZWQgZm9yIHVzIHRvIGNhY2hlLgorICAgICAgICAqLwogI2lmZGVmIGtDR051bGxEaXJlY3REaXNwbGF5Ci0JCS8qIE9uIDEwLjEgQ0dNYWluRGlzcGxheUlEKCkgaXNuJ3QgYXZhaWxhYmxlLCBhbmQKLQkJKioga0NHTnVsbERpcmVjdERpc3BsYXkgaXNuJ3QgZGVmaW5lZC4KLQkJKi8KLQkJaWYgKENHTWFpbkRpc3BsYXlJRCgpID09IDApIHsKLQkJCXJ2ID0gUHlfRmFsc2U7Ci0JCX0gZWxzZSB7CisgICAgICAgIC8qIE9uIDEwLjEgQ0dNYWluRGlzcGxheUlEKCkgaXNuJ3QgYXZhaWxhYmxlLCBhbmQKKyAgICAgICAgKioga0NHTnVsbERpcmVjdERpc3BsYXkgaXNuJ3QgZGVmaW5lZC4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKENHTWFpbkRpc3BsYXlJRCgpID09IDApIHsKKyAgICAgICAgICAgIHJ2ID0gUHlfRmFsc2U7CisgICAgICAgIH0gZWxzZSB7CiAjZWxzZQotCQl7CisgICAgICAgIHsKICNlbmRpZgotCQkJaWYgKEdldEN1cnJlbnRQcm9jZXNzKCZwc24pIDwgMCB8fAotCQkJCVNldEZyb250UHJvY2VzcygmcHNuKSA8IDApIHsKLQkJCQlydiA9IFB5X0ZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlydiA9IFB5X1RydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0JUHlfSU5DUkVGKHJ2KTsKLQlyZXR1cm4gcnY7CisgICAgICAgICAgICBpZiAoR2V0Q3VycmVudFByb2Nlc3MoJnBzbikgPCAwIHx8CisgICAgICAgICAgICAgICAgU2V0RnJvbnRQcm9jZXNzKCZwc24pIDwgMCkgeworICAgICAgICAgICAgICAgIHJ2ID0gUHlfRmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ2ID0gUHlfVHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYocnYpOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIGNoYXIgR2V0VGlja3NfZG9jW10gPSAiUmV0dXJuIG51bWJlciBvZiB0aWNrcyBzaW5jZSBib290dXAiOwpAQCAtNjIzLDcgKzYyMyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfR2V0VGlja3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgKGludClUaWNrQ291bnQoKSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KVRpY2tDb3VudCgpKTsKIH0KIAogc3RhdGljIGNoYXIgb3BlbnJmX2RvY1tdID0gIk9wZW4gcmVzb3VyY2UgZm9yayBvZiBhIGZpbGUiOwpAQCAtNjMxLDEwMCArNjMxLDEwMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIE1hY09TX29wZW5yZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NFcnIgZXJyOwotCWNoYXIgKm1vZGUgPSAiciI7Ci0JRlNSZWYgcmVmOwotCVNJbnQ4IHBlcm1pc3Npb24gPSBmc1JkUGVybTsKLQlyZm9iamVjdCAqZnA7Ci0JSEZTVW5pU3RyMjU1IG5hbWU7Ci0JCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ8cyIsIFB5TWFjX0dldEZTUmVmLCAmcmVmLCAmbW9kZSkpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgqbW9kZSkgewotCQlzd2l0Y2ggKCptb2RlKyspIHsKLQkJY2FzZSAnKic6IGJyZWFrOwotCQljYXNlICdyJzogcGVybWlzc2lvbiA9IGZzUmRQZXJtOyBicmVhazsKLQkJY2FzZSAndyc6IHBlcm1pc3Npb24gPSBmc1dyUGVybTsgYnJlYWs7Ci0JCWNhc2UgJ2InOiBicmVhazsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBPU0VyciBlcnI7CisgICAgY2hhciAqbW9kZSA9ICJyIjsKKyAgICBGU1JlZiByZWY7CisgICAgU0ludDggcGVybWlzc2lvbiA9IGZzUmRQZXJtOworICAgIHJmb2JqZWN0ICpmcDsKKyAgICBIRlNVbmlTdHIyNTUgbmFtZTsKIAotCWVyciA9IEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgmbmFtZSk7Ci0JaWYgKGVyciAhPSBub0VycikgewotCQlQeU1hY19FcnJvcihlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JaWYgKCAoZnAgPSBuZXdyZm9iamVjdCgpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnxzIiwgUHlNYWNfR2V0RlNSZWYsICZyZWYsICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2hpbGUgKCptb2RlKSB7CisgICAgICAgIHN3aXRjaCAoKm1vZGUrKykgeworICAgICAgICBjYXNlICcqJzogYnJlYWs7CisgICAgICAgIGNhc2UgJ3InOiBwZXJtaXNzaW9uID0gZnNSZFBlcm07IGJyZWFrOworICAgICAgICBjYXNlICd3JzogcGVybWlzc2lvbiA9IGZzV3JQZXJtOyBicmVhazsKKyAgICAgICAgY2FzZSAnYic6IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JCi0JZXJyID0gRlNPcGVuRm9yaygmcmVmLCBuYW1lLmxlbmd0aCwgbmFtZS51bmljb2RlLCBwZXJtaXNzaW9uLCAmZnAtPmZSZWZOdW0pOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJUHlfREVDUkVGKGZwKTsKLQkJUHlNYWNfRXJyb3IoZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZwLT5pc2Nsb3NlZCA9IDA7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWZwOworICAgIGVyciA9IEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgmbmFtZSk7CisgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIChmcCA9IG5ld3Jmb2JqZWN0KCkpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKKworCisgICAgZXJyID0gRlNPcGVuRm9yaygmcmVmLCBuYW1lLmxlbmd0aCwgbmFtZS51bmljb2RlLCBwZXJtaXNzaW9uLCAmZnAtPmZSZWZOdW0pOworICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgUHlfREVDUkVGKGZwKTsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZwLT5pc2Nsb3NlZCA9IDA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWZwOwogfQogCiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIE1hY09TX01ldGhvZHNbXSA9IHsKLQl7IkdldENyZWF0b3JBbmRUeXBlIiwJCU1hY09TX0dldENyZWF0b3JBbmRUeXBlLCAxLAlnZXRjcnRwX2RvY30sCi0JeyJTZXRDcmVhdG9yQW5kVHlwZSIsCQlNYWNPU19TZXRDcmVhdG9yQW5kVHlwZSwgMSwJc2V0Y3J0cF9kb2N9LAotCXsiR2V0RXJyb3JTdHJpbmciLAkJTWFjT1NfR2V0RXJyb3JTdHJpbmcsCTEsCWdldGVycl9kb2N9LAotCXsib3BlbnJmIiwJCQlNYWNPU19vcGVucmYsIAkJMSwgCW9wZW5yZl9kb2N9LAorICAgIHsiR2V0Q3JlYXRvckFuZFR5cGUiLCAgICAgICAgICAgICAgIE1hY09TX0dldENyZWF0b3JBbmRUeXBlLCAxLCAgICAgZ2V0Y3J0cF9kb2N9LAorICAgIHsiU2V0Q3JlYXRvckFuZFR5cGUiLCAgICAgICAgICAgICAgIE1hY09TX1NldENyZWF0b3JBbmRUeXBlLCAxLCAgICAgc2V0Y3J0cF9kb2N9LAorICAgIHsiR2V0RXJyb3JTdHJpbmciLCAgICAgICAgICAgICAgICAgIE1hY09TX0dldEVycm9yU3RyaW5nLCAgIDEsICAgICAgZ2V0ZXJyX2RvY30sCisgICAgeyJvcGVucmYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1Nfb3BlbnJmLCAgICAgICAgICAgMSwgICAgICBvcGVucmZfZG9jfSwKICNpZm5kZWYgX19MUDY0X18KLQl7InNwbGFzaCIsCQkJTWFjT1Nfc3BsYXNoLAkJMSwgCXNwbGFzaF9kb2N9LAotCXsiRGVidWdTdHIiLAkJCU1hY09TX0RlYnVnU3RyLAkJMSwJRGVidWdTdHJfZG9jfSwKLQl7IlN5c0JlZXAiLAkJCU1hY09TX1N5c0JlZXAsCQkxLAlTeXNCZWVwX2RvY30sCisgICAgeyJzcGxhc2giLCAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1Nfc3BsYXNoLCAgICAgICAgICAgMSwgICAgICBzcGxhc2hfZG9jfSwKKyAgICB7IkRlYnVnU3RyIiwgICAgICAgICAgICAgICAgICAgICAgICBNYWNPU19EZWJ1Z1N0ciwgICAgICAgICAxLCAgICAgIERlYnVnU3RyX2RvY30sCisgICAgeyJTeXNCZWVwIiwgICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1NfU3lzQmVlcCwgICAgICAgICAgMSwgICAgICBTeXNCZWVwX2RvY30sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7IkdldFRpY2tzIiwJCQlNYWNPU19HZXRUaWNrcywJCTEsCUdldFRpY2tzX2RvY30sCi0JeyJXTUF2YWlsYWJsZSIsCQkJTWFjT1NfV01BdmFpbGFibGUsCQkxLAlXTUF2YWlsYWJsZV9kb2N9LAotCXtOVUxMLAkJCQlOVUxMfQkJIC8qIFNlbnRpbmVsICovCisgICAgeyJHZXRUaWNrcyIsICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1NfR2V0VGlja3MsICAgICAgICAgMSwgICAgICBHZXRUaWNrc19kb2N9LAorICAgIHsiV01BdmFpbGFibGUiLCAgICAgICAgICAgICAgICAgICAgIE1hY09TX1dNQXZhaWxhYmxlLCAgICAgICAgICAgICAgMSwgICAgICBXTUF2YWlsYWJsZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIAogdm9pZAogaW5pdE1hY09TKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCB0aGUgTWFjT1MgbW9kdWxlIGlzIHJlbW92ZWQuIiwgMSkpCi0JCXJldHVybjsKLQkKLQltID0gUHlfSW5pdE1vZHVsZSgiTWFjT1MiLCBNYWNPU19NZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQkKLQkvKiBJbml0aWFsaXplIE1hY09TLkVycm9yIGV4Y2VwdGlvbiAqLwotCU1hY09TX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoTWFjT1NfRXJyb3IgPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBNYWNPU19FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCVJmdHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCVB5X0lOQ1JFRigmUmZ0eXBlKTsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJlc291cmNlRm9ya1R5cGUiLCAoUHlPYmplY3QgKikmUmZ0eXBlKSAhPSAwKQotCQlyZXR1cm47Ci0JLyoKLQkqKiBUaGlzIGlzIGEgaGFjazogdGhlIGZvbGxvd2luZyBjb25zdGFudCBhZGRlZCB0byB0aGUgaWQoKSBvZiBhIHN0cmluZwotCSoqIG9iamVjdCBnaXZlcyB5b3UgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEuIFVuZm9ydHVuYXRlbHksIGl0IGlzIG5lZWRlZCBmb3IKLQkqKiBzb21lIG9mIHRoZSBpbWFnZSBhbmQgc291bmQgcHJvY2Vzc2luZyBpbnRlcmZhY2VzIG9uIHRoZSBtYWM6LSgKLQkqLwotCXsKLQkJUHlTdHJpbmdPYmplY3QgKnAgPSAwOwotCQlsb25nIG9mZiA9IChsb25nKSYocC0+b2Jfc3ZhbFswXSk7Ci0JCQotCQlpZiggUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInN0cmluZ19pZF90b19idWZmZXIiLCBQeV9CdWlsZFZhbHVlKCJpIiwgb2ZmKSkgIT0gMCkKLQkJCXJldHVybjsKLQl9CisgICAgUHlPYmplY3QgKm0sICpkOworCisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHRoZSBNYWNPUyBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbSA9IFB5X0luaXRNb2R1bGUoIk1hY09TIiwgTWFjT1NfTWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisKKyAgICAvKiBJbml0aWFsaXplIE1hY09TLkVycm9yIGV4Y2VwdGlvbiAqLworICAgIE1hY09TX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoTWFjT1NfRXJyb3IgPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBNYWNPU19FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFJmdHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIFB5X0lOQ1JFRigmUmZ0eXBlKTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJlc291cmNlRm9ya1R5cGUiLCAoUHlPYmplY3QgKikmUmZ0eXBlKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgLyoKKyAgICAqKiBUaGlzIGlzIGEgaGFjazogdGhlIGZvbGxvd2luZyBjb25zdGFudCBhZGRlZCB0byB0aGUgaWQoKSBvZiBhIHN0cmluZworICAgICoqIG9iamVjdCBnaXZlcyB5b3UgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEuIFVuZm9ydHVuYXRlbHksIGl0IGlzIG5lZWRlZCBmb3IKKyAgICAqKiBzb21lIG9mIHRoZSBpbWFnZSBhbmQgc291bmQgcHJvY2Vzc2luZyBpbnRlcmZhY2VzIG9uIHRoZSBtYWM6LSgKKyAgICAqLworICAgIHsKKyAgICAgICAgUHlTdHJpbmdPYmplY3QgKnAgPSAwOworICAgICAgICBsb25nIG9mZiA9IChsb25nKSYocC0+b2Jfc3ZhbFswXSk7CisKKyAgICAgICAgaWYoIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJzdHJpbmdfaWRfdG9fYnVmZmVyIiwgUHlfQnVpbGRWYWx1ZSgiaSIsIG9mZikpICE9IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgfQogI2RlZmluZSBQWV9SVU5USU1FTU9ERUwgIm1hY2hvIgotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicnVudGltZW1vZGVsIiwgCi0JCQkJUHlfQnVpbGRWYWx1ZSgicyIsIFBZX1JVTlRJTUVNT0RFTCkpICE9IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJ1bnRpbWVtb2RlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgicyIsIFBZX1JVTlRJTUVNT0RFTCkpICE9IDApCisgICAgICAgIHJldHVybjsKICNpZiBkZWZpbmVkKFdJVEhfTkVYVF9GUkFNRVdPUkspCiAjZGVmaW5lIFBZX0xJTktNT0RFTCAiZnJhbWV3b3JrIgogI2VsaWYgZGVmaW5lZChQeV9FTkFCTEVfU0hBUkVEKQpAQCAtNzMyLDggKzczMiw4IEBACiAjZWxzZQogI2RlZmluZSBQWV9MSU5LTU9ERUwgInN0YXRpYyIKICNlbmRpZgotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibGlua21vZGVsIiwgCi0JCQkJUHlfQnVpbGRWYWx1ZSgicyIsIFBZX0xJTktNT0RFTCkpICE9IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImxpbmttb2RlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgicyIsIFBZX0xJTktNT0RFTCkpICE9IDApCisgICAgICAgIHJldHVybjsKIAogfQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvTmF2LmMgYi9NYWMvTW9kdWxlcy9OYXYuYwppbmRleCBmN2IxOWI5Li43MTE4ZDQzIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9OYXYuYworKysgYi9NYWMvTW9kdWxlcy9OYXYuYwpAQCAtNDQsMTcyICs0NCwxNzIgQEAKIC8qIENhbGxiYWNrIGZ1bmN0aW9ucyAqLwogc3RhdGljIHBhc2NhbCB2b2lkCiBteV9ldmVudFByb2MoTmF2RXZlbnRDYWxsYmFja01lc3NhZ2UgY2FsbEJhY2tTZWxlY3RvciwKLQkJCSBOYXZDQlJlY1B0ciBjYWxsQmFja1Bhcm1zLAotCQkJIE5hdkNhbGxCYWNrVXNlckRhdGEgY2FsbGJhY2tVRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBOYXZDQlJlY1B0ciBjYWxsQmFja1Bhcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5hdkNhbGxCYWNrVXNlckRhdGEgY2FsbGJhY2tVRCkKIHsKLQlQeU9iamVjdCAqZGljdCA9IChQeU9iamVjdCAqKWNhbGxiYWNrVUQ7Ci0JUHlPYmplY3QgKnB5ZnVuYzsKLQlQeU9iamVjdCAqcnY7Ci0JCi0JaWYgKCFkaWN0KSByZXR1cm47Ci0JaWYgKCAocHlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgImV2ZW50UHJvYyIpKSA9PSBOVUxMICkgewotCQlQeUVycl9QcmludCgpOwotCQlyZXR1cm47Ci0JfQotCWlmICggcHlmdW5jID09IFB5X05vbmUgKSB7Ci0JCXJldHVybjsKLQl9Ci0JcnYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24ocHlmdW5jLCAibHMjIiwgKGxvbmcpY2FsbEJhY2tTZWxlY3RvciwKLQkJCSh2b2lkICopY2FsbEJhY2tQYXJtcywgc2l6ZW9mKE5hdkNCUmVjKSk7Ci0JaWYgKCBydiApCi0JCVB5X0RFQ1JFRihydik7Ci0JZWxzZSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJOYXY6IGV4Y2VwdGlvbiBpbiBldmVudFByb2MgY2FsbGJhY2tcbiIpOwotCQlQeUVycl9QcmludCgpOwotCX0KKyAgICBQeU9iamVjdCAqZGljdCA9IChQeU9iamVjdCAqKWNhbGxiYWNrVUQ7CisgICAgUHlPYmplY3QgKnB5ZnVuYzsKKyAgICBQeU9iamVjdCAqcnY7CisKKyAgICBpZiAoIWRpY3QpIHJldHVybjsKKyAgICBpZiAoIChweWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiZXZlbnRQcm9jIikpID09IE5VTEwgKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCBweWZ1bmMgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBydiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweWZ1bmMsICJscyMiLCAobG9uZyljYWxsQmFja1NlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNhbGxCYWNrUGFybXMsIHNpemVvZihOYXZDQlJlYykpOworICAgIGlmICggcnYgKQorICAgICAgICBQeV9ERUNSRUYocnYpOworICAgIGVsc2UgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiTmF2OiBleGNlcHRpb24gaW4gZXZlbnRQcm9jIGNhbGxiYWNrXG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBwYXNjYWwgQm9vbGVhbgogbXlfcHJldmlld1Byb2MoTmF2Q0JSZWNQdHIgY2FsbEJhY2tQYXJtcywKLQkJCSAgIE5hdkNhbGxCYWNrVXNlckRhdGEgY2FsbGJhY2tVRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdkNhbGxCYWNrVXNlckRhdGEgY2FsbGJhY2tVRCkKIHsKLQlQeU9iamVjdCAqZGljdCA9IChQeU9iamVjdCAqKWNhbGxiYWNrVUQ7Ci0JUHlPYmplY3QgKnB5ZnVuYzsKLQlQeU9iamVjdCAqcnY7Ci0JQm9vbGVhbiBjX3J2ID0gZmFsc2U7Ci0JCi0JaWYgKCFkaWN0KSByZXR1cm4gZmFsc2U7Ci0JaWYgKCAocHlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgInByZXZpZXdQcm9jIikpID09IE5VTEwgKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcnYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24ocHlmdW5jLCAicyMiLCAodm9pZCAqKWNhbGxCYWNrUGFybXMsIHNpemVvZihOYXZDQlJlYykpOwotCWlmICggcnYgKSB7Ci0JCWNfcnYgPSBQeU9iamVjdF9Jc1RydWUocnYpOwotCQlQeV9ERUNSRUYocnYpOwotCX0gZWxzZSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJOYXY6IGV4Y2VwdGlvbiBpbiBwcmV2aWV3UHJvYyBjYWxsYmFja1xuIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfQotCXJldHVybiBjX3J2OworICAgIFB5T2JqZWN0ICpkaWN0ID0gKFB5T2JqZWN0ICopY2FsbGJhY2tVRDsKKyAgICBQeU9iamVjdCAqcHlmdW5jOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBCb29sZWFuIGNfcnYgPSBmYWxzZTsKKworICAgIGlmICghZGljdCkgcmV0dXJuIGZhbHNlOworICAgIGlmICggKHB5ZnVuYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJwcmV2aWV3UHJvYyIpKSA9PSBOVUxMICkgeworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJ2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHB5ZnVuYywgInMjIiwgKHZvaWQgKiljYWxsQmFja1Bhcm1zLCBzaXplb2YoTmF2Q0JSZWMpKTsKKyAgICBpZiAoIHJ2ICkgeworICAgICAgICBjX3J2ID0gUHlPYmplY3RfSXNUcnVlKHJ2KTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiTmF2OiBleGNlcHRpb24gaW4gcHJldmlld1Byb2MgY2FsbGJhY2tcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KKyAgICByZXR1cm4gY19ydjsKIH0KIAogc3RhdGljIHBhc2NhbCBCb29sZWFuCiBteV9maWx0ZXJQcm9jKEFFRGVzYyAqdGhlSXRlbSwgdm9pZCAqaW5mbywKLQkJCSAgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VELAotCQkJICBOYXZGaWx0ZXJNb2RlcyBmaWx0ZXJNb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICBOYXZDYWxsQmFja1VzZXJEYXRhIGNhbGxiYWNrVUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdkZpbHRlck1vZGVzIGZpbHRlck1vZGUpCiB7Ci0JUHlPYmplY3QgKmRpY3QgPSAoUHlPYmplY3QgKiljYWxsYmFja1VEOwotCVB5T2JqZWN0ICpweWZ1bmM7Ci0JUHlPYmplY3QgKnJ2OwotCUJvb2xlYW4gY19ydiA9IGZhbHNlOwotCQotCWlmICghZGljdCkgcmV0dXJuIGZhbHNlOwotCWlmICggKHB5ZnVuYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJmaWx0ZXJQcm9jIikpID09IE5VTEwgKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcnYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24ocHlmdW5jLCAiTyZzI2giLAotCQlBRURlc2NfTmV3Qm9ycm93ZWQsIHRoZUl0ZW0sIGluZm8sIHNpemVvZihOYXZGaWxlT3JGb2xkZXJJbmZvKSwgKHNob3J0KWZpbHRlck1vZGUpOwotCWlmICggcnYgKSB7Ci0JCWNfcnYgPSBQeU9iamVjdF9Jc1RydWUocnYpOwotCQlQeV9ERUNSRUYocnYpOwotCX0gZWxzZSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJOYXY6IGV4Y2VwdGlvbiBpbiBmaWx0ZXJQcm9jIGNhbGxiYWNrXG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQl9Ci0JcmV0dXJuIGNfcnY7CisgICAgUHlPYmplY3QgKmRpY3QgPSAoUHlPYmplY3QgKiljYWxsYmFja1VEOworICAgIFB5T2JqZWN0ICpweWZ1bmM7CisgICAgUHlPYmplY3QgKnJ2OworICAgIEJvb2xlYW4gY19ydiA9IGZhbHNlOworCisgICAgaWYgKCFkaWN0KSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCAocHlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgImZpbHRlclByb2MiKSkgPT0gTlVMTCApIHsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBydiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweWZ1bmMsICJPJnMjaCIsCisgICAgICAgIEFFRGVzY19OZXdCb3Jyb3dlZCwgdGhlSXRlbSwgaW5mbywgc2l6ZW9mKE5hdkZpbGVPckZvbGRlckluZm8pLCAoc2hvcnQpZmlsdGVyTW9kZSk7CisgICAgaWYgKCBydiApIHsKKyAgICAgICAgY19ydiA9IFB5T2JqZWN0X0lzVHJ1ZShydik7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIk5hdjogZXhjZXB0aW9uIGluIGZpbHRlclByb2MgY2FsbGJhY2tcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KKyAgICByZXR1cm4gY19ydjsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBpbnQKIGZpbGxkaWFsb2dvcHRpb25zKFB5T2JqZWN0ICpkLAotCQlBRURlc2MgKipkZWZhdWx0TG9jYXRpb25QLAotCQlOYXZEaWFsb2dPcHRpb25zICpvcHQsCi0JCU5hdkV2ZW50VVBQICpldmVudFByb2NQLAotCQlOYXZQcmV2aWV3VVBQICpwcmV2aWV3UHJvY1AsCi0JCU5hdk9iamVjdEZpbHRlclVQUCAqZmlsdGVyUHJvY1AsCi0JCU5hdlR5cGVMaXN0SGFuZGxlICp0eXBlTGlzdFAsCi0JCU9TVHlwZSAqZmlsZVR5cGVQLAotCQlPU1R5cGUgKmZpbGVDcmVhdG9yUCkKKyAgICAgICAgICAgICAgICBBRURlc2MgKipkZWZhdWx0TG9jYXRpb25QLAorICAgICAgICAgICAgICAgIE5hdkRpYWxvZ09wdGlvbnMgKm9wdCwKKyAgICAgICAgICAgICAgICBOYXZFdmVudFVQUCAqZXZlbnRQcm9jUCwKKyAgICAgICAgICAgICAgICBOYXZQcmV2aWV3VVBQICpwcmV2aWV3UHJvY1AsCisgICAgICAgICAgICAgICAgTmF2T2JqZWN0RmlsdGVyVVBQICpmaWx0ZXJQcm9jUCwKKyAgICAgICAgICAgICAgICBOYXZUeXBlTGlzdEhhbmRsZSAqdHlwZUxpc3RQLAorICAgICAgICAgICAgICAgIE9TVHlwZSAqZmlsZVR5cGVQLAorICAgICAgICAgICAgICAgIE9TVHlwZSAqZmlsZUNyZWF0b3JQKQogewotCVB5X3NzaXplX3QgcG9zID0gMDsKLQlQeU9iamVjdCAqa2V5LCAqdmFsdWU7Ci0JY2hhciAqa2V5c3RyOwotCUFFRGVzYyAqZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2U7Ci0JCi0JTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMob3B0KTsKKyAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgIGNoYXIgKmtleXN0cjsKKyAgICBBRURlc2MgKmRlZmF1bHRMb2NhdGlvbl9zdG9yYWdlOwogCi0Jd2hpbGUgKCBQeURpY3RfTmV4dChkLCAmcG9zLCAma2V5LCAmdmFsdWUpICkgewotCQlpZiAoICFrZXkgfHwgIXZhbHVlIHx8ICFQeVN0cmluZ19DaGVjayhrZXkpICkgewotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiRGlhbG9nT3B0aW9uIGhhcyBub24tc3RyaW5nIGtleSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJa2V5c3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoa2V5KTsKLQkJaWYoIHN0cmNtcChrZXlzdHIsICJkZWZhdWx0TG9jYXRpb24iKSA9PSAwICkgewotCQkJaWYgKCAoZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2UgPSBQeU1lbV9ORVcoQUVEZXNjLCAxKSkgPT0gTlVMTCApIHsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIEFFRGVzY19Db252ZXJ0LCBkZWZhdWx0TG9jYXRpb25fc3RvcmFnZSkgKSB7Ci0JCQkJUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbl9zdG9yYWdlKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCSpkZWZhdWx0TG9jYXRpb25QID0gZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2U7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInZlcnNpb24iKSA9PSAwICkgewotCQkJaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJIIiwgJm9wdC0+dmVyc2lvbikgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJkaWFsb2dPcHRpb25GbGFncyIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgImsiLCAmb3B0LT5kaWFsb2dPcHRpb25GbGFncykgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJsb2NhdGlvbiIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICZvcHQtPmxvY2F0aW9uKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImNsaWVudE5hbWUiKSA9PSAwICkgewotCQkJaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgJm9wdC0+Y2xpZW50TmFtZSkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJ3aW5kb3dUaXRsZSIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT53aW5kb3dUaXRsZSkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJhY3Rpb25CdXR0b25MYWJlbCIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5hY3Rpb25CdXR0b25MYWJlbCkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJjYW5jZWxCdXR0b25MYWJlbCIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5jYW5jZWxCdXR0b25MYWJlbCkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJzYXZlZEZpbGVOYW1lIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPnNhdmVkRmlsZU5hbWUpICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAibWVzc2FnZSIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5tZXNzYWdlKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInByZWZlcmVuY2VLZXkiKSA9PSAwICkgewotCQkJaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJm9wdC0+cHJlZmVyZW5jZUtleSkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJwb3B1cEV4dGVuc2lvbiIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUmVzT2JqX0NvbnZlcnQsICZvcHQtPnBvcHVwRXh0ZW5zaW9uKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggZXZlbnRQcm9jUCAmJiBzdHJjbXAoa2V5c3RyLCAiZXZlbnRQcm9jIikgPT0gMCApIHsKLQkJCSpldmVudFByb2NQID0gbXlfZXZlbnRQcm9jVVBQOwotCQl9IGVsc2UgaWYoIHByZXZpZXdQcm9jUCAmJiBzdHJjbXAoa2V5c3RyLCAicHJldmlld1Byb2MiKSA9PSAwICkgewotCQkJKnByZXZpZXdQcm9jUCA9IG15X3ByZXZpZXdQcm9jVVBQOwotCQl9IGVsc2UgaWYoIGZpbHRlclByb2NQICYmIHN0cmNtcChrZXlzdHIsICJmaWx0ZXJQcm9jIikgPT0gMCApIHsKLQkJCSpmaWx0ZXJQcm9jUCA9IG15X2ZpbHRlclByb2NVUFA7Ci0JCX0gZWxzZSBpZiggdHlwZUxpc3RQICYmIHN0cmNtcChrZXlzdHIsICJ0eXBlTGlzdCIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUmVzT2JqX0NvbnZlcnQsIHR5cGVMaXN0UCkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYoIGZpbGVUeXBlUCAmJiBzdHJjbXAoa2V5c3RyLCAiZmlsZVR5cGUiKSA9PSAwICkgewotCQkJaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgZmlsZVR5cGVQKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggZmlsZUNyZWF0b3JQICYmIHN0cmNtcChrZXlzdHIsICJmaWxlQ3JlYXRvciIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCBmaWxlQ3JlYXRvclApICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIHsKLQkJCVB5RXJyX0Zvcm1hdChFcnJvck9iamVjdCwgIlVua25vd24gRGlhbG9nT3B0aW9uIGtleTogJXMiLCBrZXlzdHIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMob3B0KTsKKworICAgIHdoaWxlICggUHlEaWN0X05leHQoZCwgJnBvcywgJmtleSwgJnZhbHVlKSApIHsKKyAgICAgICAgaWYgKCAha2V5IHx8ICF2YWx1ZSB8fCAhUHlTdHJpbmdfQ2hlY2soa2V5KSApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgIkRpYWxvZ09wdGlvbiBoYXMgbm9uLXN0cmluZyBrZXkiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGtleXN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGtleSk7CisgICAgICAgIGlmKCBzdHJjbXAoa2V5c3RyLCAiZGVmYXVsdExvY2F0aW9uIikgPT0gMCApIHsKKyAgICAgICAgICAgIGlmICggKGRlZmF1bHRMb2NhdGlvbl9zdG9yYWdlID0gUHlNZW1fTkVXKEFFRGVzYywgMSkpID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBBRURlc2NfQ29udmVydCwgZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2UpICkgeworICAgICAgICAgICAgICAgIFB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb25fc3RvcmFnZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVmYXVsdExvY2F0aW9uUCA9IGRlZmF1bHRMb2NhdGlvbl9zdG9yYWdlOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJ2ZXJzaW9uIikgPT0gMCApIHsKKyAgICAgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiSCIsICZvcHQtPnZlcnNpb24pICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAiZGlhbG9nT3B0aW9uRmxhZ3MiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJrIiwgJm9wdC0+ZGlhbG9nT3B0aW9uRmxhZ3MpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAibG9jYXRpb24iKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFBvaW50LCAmb3B0LT5sb2NhdGlvbikgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJjbGllbnROYW1lIikgPT0gMCApIHsKKyAgICAgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPmNsaWVudE5hbWUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAid2luZG93VGl0bGUiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgJm9wdC0+d2luZG93VGl0bGUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAiYWN0aW9uQnV0dG9uTGFiZWwiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgJm9wdC0+YWN0aW9uQnV0dG9uTGFiZWwpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAiY2FuY2VsQnV0dG9uTGFiZWwiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgJm9wdC0+Y2FuY2VsQnV0dG9uTGFiZWwpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAic2F2ZWRGaWxlTmFtZSIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5zYXZlZEZpbGVOYW1lKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgIm1lc3NhZ2UiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgJm9wdC0+bWVzc2FnZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJwcmVmZXJlbmNlS2V5IikgPT0gMCApIHsKKyAgICAgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRPU1R5cGUsICZvcHQtPnByZWZlcmVuY2VLZXkpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAicG9wdXBFeHRlbnNpb24iKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFJlc09ial9Db252ZXJ0LCAmb3B0LT5wb3B1cEV4dGVuc2lvbikgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIGV2ZW50UHJvY1AgJiYgc3RyY21wKGtleXN0ciwgImV2ZW50UHJvYyIpID09IDAgKSB7CisgICAgICAgICAgICAqZXZlbnRQcm9jUCA9IG15X2V2ZW50UHJvY1VQUDsKKyAgICAgICAgfSBlbHNlIGlmKCBwcmV2aWV3UHJvY1AgJiYgc3RyY21wKGtleXN0ciwgInByZXZpZXdQcm9jIikgPT0gMCApIHsKKyAgICAgICAgICAgICpwcmV2aWV3UHJvY1AgPSBteV9wcmV2aWV3UHJvY1VQUDsKKyAgICAgICAgfSBlbHNlIGlmKCBmaWx0ZXJQcm9jUCAmJiBzdHJjbXAoa2V5c3RyLCAiZmlsdGVyUHJvYyIpID09IDAgKSB7CisgICAgICAgICAgICAqZmlsdGVyUHJvY1AgPSBteV9maWx0ZXJQcm9jVVBQOworICAgICAgICB9IGVsc2UgaWYoIHR5cGVMaXN0UCAmJiBzdHJjbXAoa2V5c3RyLCAidHlwZUxpc3QiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFJlc09ial9Db252ZXJ0LCB0eXBlTGlzdFApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmKCBmaWxlVHlwZVAgJiYgc3RyY21wKGtleXN0ciwgImZpbGVUeXBlIikgPT0gMCApIHsKKyAgICAgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRPU1R5cGUsIGZpbGVUeXBlUCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIGZpbGVDcmVhdG9yUCAmJiBzdHJjbXAoa2V5c3RyLCAiZmlsZUNyZWF0b3IiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgZmlsZUNyZWF0b3JQKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoRXJyb3JPYmplY3QsICJVbmtub3duIERpYWxvZ09wdGlvbiBrZXk6ICVzIiwga2V5c3RyKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjE3LDggKzIxNyw4IEBACiAvKiBEZWNsYXJhdGlvbnMgZm9yIG9iamVjdHMgb2YgdHlwZSBOYXZSZXBseVJlY29yZCAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCU5hdlJlcGx5UmVjb3JkIGl0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgTmF2UmVwbHlSZWNvcmQgaXRzZWxmOwogfSBuYXZycm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBOYXZycnR5cGU7CkBAIC0yMzQsMTggKzIzNCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZUcmFuc2xhdGVGaWxlKG5hdnJyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlOYXZUcmFuc2xhdGlvbk9wdGlvbnMgaG93VG9UcmFuc2xhdGU7Ci0JT1NFcnIgZXJyOworICAgIE5hdlRyYW5zbGF0aW9uT3B0aW9ucyBob3dUb1RyYW5zbGF0ZTsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImsiLCAmaG93VG9UcmFuc2xhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZUcmFuc2xhdGVGaWxlKCZzZWxmLT5pdHNlbGYsIGhvd1RvVHJhbnNsYXRlKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiayIsICZob3dUb1RyYW5zbGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdlRyYW5zbGF0ZUZpbGUoJnNlbGYtPml0c2VsZiwgaG93VG9UcmFuc2xhdGUpOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDb21wbGV0ZVNhdmVfX2RvY19fW10gPQpAQCAtMjU1LDI2ICsyNTUsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q29tcGxldGVTYXZlKG5hdnJyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlOYXZUcmFuc2xhdGlvbk9wdGlvbnMgaG93VG9UcmFuc2xhdGU7Ci0JT1NFcnIgZXJyOworICAgIE5hdlRyYW5zbGF0aW9uT3B0aW9ucyBob3dUb1RyYW5zbGF0ZTsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImsiLCAmaG93VG9UcmFuc2xhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZDb21wbGV0ZVNhdmUoJnNlbGYtPml0c2VsZiwgaG93VG9UcmFuc2xhdGUpOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJmhvd1RvVHJhbnNsYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2Q29tcGxldGVTYXZlKCZzZWxmLT5pdHNlbGYsIGhvd1RvVHJhbnNsYXRlKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbmF2cnJfbWV0aG9kc1tdID0gewotIHsiTmF2VHJhbnNsYXRlRmlsZSIsCShQeUNGdW5jdGlvbiluYXZfTmF2VHJhbnNsYXRlRmlsZSwJTUVUSF9WQVJBUkdTLAluYXZfTmF2VHJhbnNsYXRlRmlsZV9fZG9jX199LAotIHsiTmF2Q29tcGxldGVTYXZlIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDb21wbGV0ZVNhdmUsCU1FVEhfVkFSQVJHUywJbmF2X05hdkNvbXBsZXRlU2F2ZV9fZG9jX199LAotCQotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgeyJOYXZUcmFuc2xhdGVGaWxlIiwgICAoUHlDRnVuY3Rpb24pbmF2X05hdlRyYW5zbGF0ZUZpbGUsICAgICAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZUcmFuc2xhdGVGaWxlX19kb2NfX30sCisgeyJOYXZDb21wbGV0ZVNhdmUiLCAgICAoUHlDRnVuY3Rpb24pbmF2X05hdkNvbXBsZXRlU2F2ZSwgICAgICAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZDb21wbGV0ZVNhdmVfX2RvY19ffSwKKworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiAtLS0tLS0tLS0tICovCkBAIC0yODMsMTYxICsyODMsMTYxIEBACiBzdGF0aWMgbmF2cnJvYmplY3QgKgogbmV3bmF2cnJvYmplY3QoTmF2UmVwbHlSZWNvcmQgKml0c2VsZikKIHsKLQluYXZycm9iamVjdCAqc2VsZjsKLQkKLQlzZWxmID0gUHlPYmplY3RfTkVXKG5hdnJyb2JqZWN0LCAmTmF2cnJ0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5pdHNlbGYgPSAqaXRzZWxmOwotCXJldHVybiBzZWxmOworICAgIG5hdnJyb2JqZWN0ICpzZWxmOworCisgICAgc2VsZiA9IFB5T2JqZWN0X05FVyhuYXZycm9iamVjdCwgJk5hdnJydHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+aXRzZWxmID0gKml0c2VsZjsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogCiBzdGF0aWMgdm9pZAogbmF2cnJfZGVhbGxvYyhuYXZycm9iamVjdCAqc2VsZikKIHsKLQlOYXZEaXNwb3NlUmVwbHkoJnNlbGYtPml0c2VsZik7Ci0JUHlPYmplY3RfREVMKHNlbGYpOworICAgIE5hdkRpc3Bvc2VSZXBseSgmc2VsZi0+aXRzZWxmKTsKKyAgICBQeU9iamVjdF9ERUwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZycl9nZXRhdHRyKG5hdnJyb2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCUZTUmVmIGZzcjsKLQlGU1NwZWMgZnNzOwotCQotCWlmKCBzdHJjbXAobmFtZSwgIl9fbWVtYmVyc19fIikgPT0gMCApCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKAotCQkJCSJzc3Nzc3Nzc3NzIiwgCi0JCQkJInZlcnNpb24iLCAidmFsaWRSZWNvcmQiLCAicmVwbGFjaW5nIiwKLQkJCSJpc1N0YXRpb25lcnkiLCAidHJhbnNsYXRpb25OZWVkZWQiLCAKLQkJCSJzZWxlY3Rpb24iLCAKLQkJCSJzZWxlY3Rpb25fZnNyIiwKLQkJCSJmaWxlVHJhbnNsYXRpb24iLCAia2V5U2NyaXB0IiwgInNhdmVGaWxlTmFtZSIpOworICAgIEZTUmVmIGZzcjsKKyAgICBGU1NwZWMgZnNzOwogCi0JaWYoIHN0cmNtcChuYW1lLCAidmVyc2lvbiIpID09IDAgKQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNlbGYtPml0c2VsZi52ZXJzaW9uKTsKLQlpZiggc3RyY21wKG5hbWUsICJ2YWxpZFJlY29yZCIpID09IDAgKQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXNlbGYtPml0c2VsZi52YWxpZFJlY29yZCk7Ci0JaWYoIHN0cmNtcChuYW1lLCAicmVwbGFjaW5nIikgPT0gMCApCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpc2VsZi0+aXRzZWxmLnJlcGxhY2luZyk7Ci0JaWYoIHN0cmNtcChuYW1lLCAiaXNTdGF0aW9uZXJ5IikgPT0gMCApCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpc2VsZi0+aXRzZWxmLmlzU3RhdGlvbmVyeSk7Ci0JaWYoIHN0cmNtcChuYW1lLCAidHJhbnNsYXRpb25OZWVkZWQiKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYudHJhbnNsYXRpb25OZWVkZWQpOwotCWlmKCBzdHJjbXAobmFtZSwgInNlbGVjdGlvbiIpID09IDAgKSB7Ci0JCVNJbnQzMiBpOwotCQlsb25nIGNvdW50OwotCQlPU0VyciBlcnI7Ci0JCVB5T2JqZWN0ICpydiwgKnJ2aXRlbTsKLQkJQUVEZXNjIGRlc2M7Ci0JCQotCQlpZiAoKGVycj1BRUNvdW50SXRlbXMoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sICZjb3VudCkpKSB7Ci0JCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIChydj1QeUxpc3RfTmV3KGNvdW50KSkgPT0gTlVMTCApCi0JCQlyZXR1cm4gTlVMTDsKLQkJZm9yKGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0JCQlkZXNjLmRhdGFIYW5kbGUgPSBOVUxMOwotCQkJaWYgKChlcnI9QUVHZXROdGhEZXNjKCZzZWxmLT5pdHNlbGYuc2VsZWN0aW9uLCBpKzEsIHR5cGVGU1MsIE5VTEwsICZkZXNjKSkpIHsKLQkJCQlQeV9ERUNSRUYocnYpOwotCQkJCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWlmICgoZXJyPUFFR2V0RGVzY0RhdGEoJmRlc2MsICZmc3MsIHNpemVvZihGU1NwZWMpKSkpIHsKLQkJCQlQeV9ERUNSRUYocnYpOwotCQkJCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXJ2aXRlbSA9IFB5TWFjX0J1aWxkRlNTcGVjKCZmc3MpOwotCQkJUHlMaXN0X1NldEl0ZW0ocnYsIGksIHJ2aXRlbSk7Ci0JCQlBRURpc3Bvc2VEZXNjKCZkZXNjKTsKLQkJfQotCQlyZXR1cm4gcnY7Ci0JfQotCWlmKCBzdHJjbXAobmFtZSwgInNlbGVjdGlvbl9mc3IiKSA9PSAwICkgewotCQlTSW50MzIgaTsKLQkJbG9uZyBjb3VudDsKLQkJT1NFcnIgZXJyOwotCQlQeU9iamVjdCAqcnYsICpydml0ZW07Ci0JCUFFRGVzYyBkZXNjOwotCQkKLQkJaWYgKChlcnI9QUVDb3VudEl0ZW1zKCZzZWxmLT5pdHNlbGYuc2VsZWN0aW9uLCAmY291bnQpKSkgewotCQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKCAocnY9UHlMaXN0X05ldyhjb3VudCkpID09IE5VTEwgKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWZvcihpPTA7IGk8Y291bnQ7IGkrKykgewotCQkJZGVzYy5kYXRhSGFuZGxlID0gTlVMTDsKLQkJCWlmICgoZXJyPUFFR2V0TnRoRGVzYygmc2VsZi0+aXRzZWxmLnNlbGVjdGlvbiwgaSsxLCB0eXBlRlNSZWYsIE5VTEwsICZkZXNjKSkpIHsKLQkJCQlQeV9ERUNSRUYocnYpOwotCQkJCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWlmICgoZXJyPUFFR2V0RGVzY0RhdGEoJmRlc2MsICZmc3IsIHNpemVvZihGU1JlZikpKSkgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJcnZpdGVtID0gUHlNYWNfQnVpbGRGU1JlZigmZnNyKTsKLQkJCVB5TGlzdF9TZXRJdGVtKHJ2LCBpLCBydml0ZW0pOwotCQkJQUVEaXNwb3NlRGVzYygmZGVzYyk7Ci0JCX0KLQkJcmV0dXJuIHJ2OwotCX0KLQlpZiggc3RyY21wKG5hbWUsICJmaWxlVHJhbnNsYXRpb24iKSA9PSAwICkKLQkJcmV0dXJuIFJlc09ial9OZXcoKEhhbmRsZSlzZWxmLT5pdHNlbGYuZmlsZVRyYW5zbGF0aW9uKTsKLQlpZiggc3RyY21wKG5hbWUsICJrZXlTY3JpcHQiKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoc2hvcnQpc2VsZi0+aXRzZWxmLmtleVNjcmlwdCk7Ci0JaWYoIHN0cmNtcChuYW1lLCAic2F2ZUZpbGVOYW1lIikgPT0gMCApCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGU3RyaW5nUmVmT2JqX05ldywgc2VsZi0+aXRzZWxmLnNhdmVGaWxlTmFtZSk7CisgICAgaWYoIHN0cmNtcChuYW1lLCAiX19tZW1iZXJzX18iKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAic3Nzc3Nzc3NzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiIsICJ2YWxpZFJlY29yZCIsICJyZXBsYWNpbmciLAorICAgICAgICAgICAgImlzU3RhdGlvbmVyeSIsICJ0cmFuc2xhdGlvbk5lZWRlZCIsCisgICAgICAgICAgICAic2VsZWN0aW9uIiwKKyAgICAgICAgICAgICJzZWxlY3Rpb25fZnNyIiwKKyAgICAgICAgICAgICJmaWxlVHJhbnNsYXRpb24iLCAia2V5U2NyaXB0IiwgInNhdmVGaWxlTmFtZSIpOworCisgICAgaWYoIHN0cmNtcChuYW1lLCAidmVyc2lvbiIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNlbGYtPml0c2VsZi52ZXJzaW9uKTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJ2YWxpZFJlY29yZCIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXNlbGYtPml0c2VsZi52YWxpZFJlY29yZCk7CisgICAgaWYoIHN0cmNtcChuYW1lLCAicmVwbGFjaW5nIikgPT0gMCApCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpc2VsZi0+aXRzZWxmLnJlcGxhY2luZyk7CisgICAgaWYoIHN0cmNtcChuYW1lLCAiaXNTdGF0aW9uZXJ5IikgPT0gMCApCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpc2VsZi0+aXRzZWxmLmlzU3RhdGlvbmVyeSk7CisgICAgaWYoIHN0cmNtcChuYW1lLCAidHJhbnNsYXRpb25OZWVkZWQiKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYudHJhbnNsYXRpb25OZWVkZWQpOworICAgIGlmKCBzdHJjbXAobmFtZSwgInNlbGVjdGlvbiIpID09IDAgKSB7CisgICAgICAgIFNJbnQzMiBpOworICAgICAgICBsb25nIGNvdW50OworICAgICAgICBPU0VyciBlcnI7CisgICAgICAgIFB5T2JqZWN0ICpydiwgKnJ2aXRlbTsKKyAgICAgICAgQUVEZXNjIGRlc2M7CisKKyAgICAgICAgaWYgKChlcnI9QUVDb3VudEl0ZW1zKCZzZWxmLT5pdHNlbGYuc2VsZWN0aW9uLCAmY291bnQpKSkgeworICAgICAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAocnY9UHlMaXN0X05ldyhjb3VudCkpID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZvcihpPTA7IGk8Y291bnQ7IGkrKykgeworICAgICAgICAgICAgZGVzYy5kYXRhSGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIGlmICgoZXJyPUFFR2V0TnRoRGVzYygmc2VsZi0+aXRzZWxmLnNlbGVjdGlvbiwgaSsxLCB0eXBlRlNTLCBOVUxMLCAmZGVzYykpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGVycj1BRUdldERlc2NEYXRhKCZkZXNjLCAmZnNzLCBzaXplb2YoRlNTcGVjKSkpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydml0ZW0gPSBQeU1hY19CdWlsZEZTU3BlYygmZnNzKTsKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKHJ2LCBpLCBydml0ZW0pOworICAgICAgICAgICAgQUVEaXNwb3NlRGVzYygmZGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKyAgICBpZiggc3RyY21wKG5hbWUsICJzZWxlY3Rpb25fZnNyIikgPT0gMCApIHsKKyAgICAgICAgU0ludDMyIGk7CisgICAgICAgIGxvbmcgY291bnQ7CisgICAgICAgIE9TRXJyIGVycjsKKyAgICAgICAgUHlPYmplY3QgKnJ2LCAqcnZpdGVtOworICAgICAgICBBRURlc2MgZGVzYzsKKworICAgICAgICBpZiAoKGVycj1BRUNvdW50SXRlbXMoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sICZjb3VudCkpKSB7CisgICAgICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChydj1QeUxpc3RfTmV3KGNvdW50KSkgPT0gTlVMTCApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yKGk9MDsgaTxjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBkZXNjLmRhdGFIYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaWYgKChlcnI9QUVHZXROdGhEZXNjKCZzZWxmLT5pdHNlbGYuc2VsZWN0aW9uLCBpKzEsIHR5cGVGU1JlZiwgTlVMTCwgJmRlc2MpKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgICAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChlcnI9QUVHZXREZXNjRGF0YSgmZGVzYywgJmZzciwgc2l6ZW9mKEZTUmVmKSkpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydml0ZW0gPSBQeU1hY19CdWlsZEZTUmVmKCZmc3IpOworICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0ocnYsIGksIHJ2aXRlbSk7CisgICAgICAgICAgICBBRURpc3Bvc2VEZXNjKCZkZXNjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CisgICAgfQorICAgIGlmKCBzdHJjbXAobmFtZSwgImZpbGVUcmFuc2xhdGlvbiIpID09IDAgKQorICAgICAgICByZXR1cm4gUmVzT2JqX05ldygoSGFuZGxlKXNlbGYtPml0c2VsZi5maWxlVHJhbnNsYXRpb24pOworICAgIGlmKCBzdHJjbXAobmFtZSwgImtleVNjcmlwdCIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIChzaG9ydClzZWxmLT5pdHNlbGYua2V5U2NyaXB0KTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJzYXZlRmlsZU5hbWUiKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBzZWxmLT5pdHNlbGYuc2F2ZUZpbGVOYW1lKTsKIAogCi0JcmV0dXJuIFB5X0ZpbmRNZXRob2QobmF2cnJfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QobmF2cnJfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKIHN0YXRpYyBpbnQKIG5hdnJyX3NldGF0dHIobmF2cnJvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQogewotCS8qIFNldCBhdHRyaWJ1dGUgJ25hbWUnIHRvIHZhbHVlICd2Jy4gdj09TlVMTCBtZWFucyBkZWxldGUgKi8KLQkKLQkvKiBYWFhYIEFkZCB5b3VyIG93biBzZXRhdHRyIGNvZGUgaGVyZSAqLwotCXJldHVybiAtMTsKKyAgICAvKiBTZXQgYXR0cmlidXRlICduYW1lJyB0byB2YWx1ZSAndicuIHY9PU5VTEwgbWVhbnMgZGVsZXRlICovCisKKyAgICAvKiBYWFhYIEFkZCB5b3VyIG93biBzZXRhdHRyIGNvZGUgaGVyZSAqLworICAgIHJldHVybiAtMTsKIH0KIAotc3RhdGljIGNoYXIgTmF2cnJ0eXBlX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBOYXZycnR5cGVfX2RvY19fW10gPQogIlJlY29yZCBjb250YWluaW5nIHJlc3VsdCBvZiBhIE5hdiBmaWxlIHNlbGVjdGlvbiBjYWxsLiBVc2UgZGlyKCkgZm9yIG1lbWJlciBuYW1lcy4iCiA7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTmF2cnJ0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkiTmF2Lk5hdlJlcGx5UmVjb3JkIiwJCQkvKnRwX25hbWUqLwotCXNpemVvZihuYXZycm9iamVjdCksCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKW5hdnJyX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JKHByaW50ZnVuYykwLAkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKW5hdnJyX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKW5hdnJyX3NldGF0dHIsCS8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpMCwJCS8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwJCS8qdHBfaGFzaCovCi0JKHRlcm5hcnlmdW5jKTAsCQkvKnRwX2NhbGwqLwotCShyZXByZnVuYykwLAkJLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiTmF2Lk5hdlJlcGx5UmVjb3JkIiwgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKG5hdnJyb2JqZWN0KSwgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciluYXZycl9kZWFsbG9jLCAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpbmF2cnJfZ2V0YXR0ciwgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYyluYXZycl9zZXRhdHRyLCAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpMCwgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwogCi0JLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KLQkwTCwwTCwwTCwwTCwKLQlOYXZycnR5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCisgICAgLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgICAwTCwwTCwwTCwwTCwKKyAgICBOYXZycnR5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCiB9OwogCiAvKiBFbmQgb2YgY29kZSBmb3IgTmF2UmVwbHlSZWNvcmQgb2JqZWN0cyAqLwotCQkKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIGNoYXIgbmF2X05hdkdldEZpbGVfX2RvY19fW10gPQpAQCAtNDQ3LDMyICs0NDcsMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2R2V0RmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlBRURlc2MJKmRlZmF1bHRMb2NhdGlvbiA9IE5VTEw7Ci0JTmF2UmVwbHlSZWNvcmQgcmVwbHk7Ci0JTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOwotCU5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7Ci0JTmF2UHJldmlld1VQUCBwcmV2aWV3UHJvYyA9IE5VTEw7Ci0JTmF2T2JqZWN0RmlsdGVyVVBQIGZpbHRlclByb2MgPSBOVUxMOwotCU5hdlR5cGVMaXN0SGFuZGxlIHR5cGVMaXN0ID0gTlVMTDsKLQlPU0VyciBlcnI7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgQUVEZXNjICAgICAgKmRlZmF1bHRMb2NhdGlvbiA9IE5VTEw7CisgICAgTmF2UmVwbHlSZWNvcmQgcmVwbHk7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7CisgICAgTmF2UHJldmlld1VQUCBwcmV2aWV3UHJvYyA9IE5VTEw7CisgICAgTmF2T2JqZWN0RmlsdGVyVVBQIGZpbHRlclByb2MgPSBOVUxMOworICAgIE5hdlR5cGVMaXN0SGFuZGxlIHR5cGVMaXN0ID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsICZwcmV2aWV3UHJvYywgJmZpbHRlclByb2MsICZ0eXBlTGlzdCwgTlVMTCwgTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdkdldEZpbGUoZGVmYXVsdExvY2F0aW9uLCAmcmVwbHksICZkaWFsb2dPcHRpb25zLAotCQkJZXZlbnRQcm9jLCBwcmV2aWV3UHJvYywgZmlsdGVyUHJvYywgdHlwZUxpc3QsICh2b2lkICopZGljdCk7Ci0JUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOworICAgIGlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBkaWN0ID0ga3c7CisgICAgfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgJnByZXZpZXdQcm9jLCAmZmlsdGVyUHJvYywgJnR5cGVMaXN0LCBOVUxMLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2R2V0RmlsZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgcHJldmlld1Byb2MsIGZpbHRlclByb2MsIHR5cGVMaXN0LCAodm9pZCAqKWRpY3QpOworICAgIFB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdlB1dEZpbGVfX2RvY19fW10gPQpAQCAtNDgyLDMxICs0ODIsMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2UHV0RmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlBRURlc2MJKmRlZmF1bHRMb2NhdGlvbiA9IE5VTEw7Ci0JTmF2UmVwbHlSZWNvcmQgcmVwbHk7Ci0JTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOwotCU5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCU9TVHlwZSBmaWxlQ3JlYXRvcjsKLQlPU0VyciBlcnI7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgQUVEZXNjICAgICAgKmRlZmF1bHRMb2NhdGlvbiA9IE5VTEw7CisgICAgTmF2UmVwbHlSZWNvcmQgcmVwbHk7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsICZmaWxlVHlwZSwgJmZpbGVDcmVhdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2UHV0RmlsZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCi0JCQlldmVudFByb2MsIGZpbGVUeXBlLCBmaWxlQ3JlYXRvciwgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCAmZmlsZVR5cGUsICZmaWxlQ3JlYXRvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdlB1dEZpbGUoZGVmYXVsdExvY2F0aW9uLCAmcmVwbHksICZkaWFsb2dPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBldmVudFByb2MsIGZpbGVUeXBlLCBmaWxlQ3JlYXRvciwgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZBc2tTYXZlQ2hhbmdlc19fZG9jX19bXSA9CkBAIC01MTcsMjcgKzUxNywyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZBc2tTYXZlQ2hhbmdlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2QXNrU2F2ZUNoYW5nZXNBY3Rpb24gYWN0aW9uOwotCU5hdkFza1NhdmVDaGFuZ2VzUmVzdWx0IHJlcGx5OwotCU5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZBc2tTYXZlQ2hhbmdlc0FjdGlvbiBhY3Rpb247CisgICAgTmF2QXNrU2F2ZUNoYW5nZXNSZXN1bHQgcmVwbHk7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiayIsICZhY3Rpb24pKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWRpY3QgPSBrdzsKLQl9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsTyEiLCAmYWN0aW9uLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCBOVUxMLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdkFza1NhdmVDaGFuZ2VzKCZkaWFsb2dPcHRpb25zLCBhY3Rpb24sICZyZXBseSwgZXZlbnRQcm9jLCAodm9pZCAqKWRpY3QpOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXJlcGx5KTsKKyAgICBpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiayIsICZhY3Rpb24pKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsTyEiLCAmYWN0aW9uLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCBOVUxMLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkFza1NhdmVDaGFuZ2VzKCZkaWFsb2dPcHRpb25zLCBhY3Rpb24sICZyZXBseSwgZXZlbnRQcm9jLCAodm9pZCAqKWRpY3QpOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXJlcGx5KTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkN1c3RvbUFza1NhdmVDaGFuZ2VzX19kb2NfX1tdID0KQEAgLTU0NywyNiArNTQ3LDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkN1c3RvbUFza1NhdmVDaGFuZ2VzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlOYXZBc2tTYXZlQ2hhbmdlc1Jlc3VsdCByZXBseTsKLQlOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2QXNrU2F2ZUNoYW5nZXNSZXN1bHQgcmVwbHk7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgTlVMTCwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZDdXN0b21Bc2tTYXZlQ2hhbmdlcygmZGlhbG9nT3B0aW9ucywgJnJlcGx5LCBldmVudFByb2MsICh2b2lkICopZGljdCk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcmVwbHkpOworICAgIGlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBkaWN0ID0ga3c7CisgICAgfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCBOVUxMLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkN1c3RvbUFza1NhdmVDaGFuZ2VzKCZkaWFsb2dPcHRpb25zLCAmcmVwbHksIGV2ZW50UHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZBc2tEaXNjYXJkQ2hhbmdlc19fZG9jX19bXSA9CkBAIC01NzYsMjYgKzU3NiwyNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZBc2tEaXNjYXJkQ2hhbmdlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2QXNrU2F2ZUNoYW5nZXNSZXN1bHQgcmVwbHk7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlPU0VyciBlcnI7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE5hdkFza1NhdmVDaGFuZ2VzUmVzdWx0IHJlcGx5OworICAgIE5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWRpY3QgPSBrdzsKLQl9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsIE5VTEwsICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2QXNrRGlzY2FyZENoYW5nZXMoJmRpYWxvZ09wdGlvbnMsICZyZXBseSwgZXZlbnRQcm9jLCAodm9pZCAqKWRpY3QpOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXJlcGx5KTsKKyAgICBpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgTlVMTCwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZBc2tEaXNjYXJkQ2hhbmdlcygmZGlhbG9nT3B0aW9ucywgJnJlcGx5LCBldmVudFByb2MsICh2b2lkICopZGljdCk7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcmVwbHkpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2Q2hvb3NlRmlsZV9fZG9jX19bXSA9CkBAIC02MDUsMzIgKzYwNSwzMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZDaG9vc2VGaWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZQcmV2aWV3VVBQIHByZXZpZXdQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JTmF2VHlwZUxpc3RIYW5kbGUgdHlwZUxpc3QgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBBRURlc2MgICAgICAqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKKyAgICBOYXZSZXBseVJlY29yZCByZXBseTsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBOYXZQcmV2aWV3VVBQIHByZXZpZXdQcm9jID0gTlVMTDsKKyAgICBOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7CisgICAgTmF2VHlwZUxpc3RIYW5kbGUgdHlwZUxpc3QgPSBOVUxMOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKLQkJCXJldHVybiBOVUxMOwotCQlkaWN0ID0ga3c7Ci0JfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgJnByZXZpZXdQcm9jLCAmZmlsdGVyUHJvYywgJnR5cGVMaXN0LCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2Q2hvb3NlRmlsZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCi0JCQlldmVudFByb2MsIHByZXZpZXdQcm9jLCBmaWx0ZXJQcm9jLCB0eXBlTGlzdCwgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCAmcHJldmlld1Byb2MsICZmaWx0ZXJQcm9jLCAmdHlwZUxpc3QsIE5VTEwsIE5VTEwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZDaG9vc2VGaWxlKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRQcm9jLCBwcmV2aWV3UHJvYywgZmlsdGVyUHJvYywgdHlwZUxpc3QsICh2b2lkICopZGljdCk7CisgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2Q2hvb3NlRm9sZGVyX19kb2NfX1tdID0KQEAgLTY0MCwzMCArNjQwLDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkNob29zZUZvbGRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlBRURlc2MJKmRlZmF1bHRMb2NhdGlvbiA9IE5VTEw7Ci0JTmF2UmVwbHlSZWNvcmQgcmVwbHk7Ci0JTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOwotCU5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7Ci0JTmF2T2JqZWN0RmlsdGVyVVBQIGZpbHRlclByb2MgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBBRURlc2MgICAgICAqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKKyAgICBOYXZSZXBseVJlY29yZCByZXBseTsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWRpY3QgPSBrdzsKLQl9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdkNob29zZUZvbGRlcihkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCi0JCQlldmVudFByb2MsIGZpbHRlclByb2MsICh2b2lkICopZGljdCk7Ci0JUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOworICAgIGlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBkaWN0ID0ga3c7CisgICAgfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgJmZpbHRlclByb2MsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZDaG9vc2VGb2xkZXIoZGVmYXVsdExvY2F0aW9uLCAmcmVwbHksICZkaWFsb2dPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBldmVudFByb2MsIGZpbHRlclByb2MsICh2b2lkICopZGljdCk7CisgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2Q2hvb3NlVm9sdW1lX19kb2NfX1tdID0KQEAgLTY3MywzMCArNjczLDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkNob29zZVZvbHVtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlBRURlc2MJKmRlZmF1bHRMb2NhdGlvbiA9IE5VTEw7Ci0JTmF2UmVwbHlSZWNvcmQgcmVwbHk7Ci0JTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOwotCU5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7Ci0JTmF2T2JqZWN0RmlsdGVyVVBQIGZpbHRlclByb2MgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBBRURlc2MgICAgICAqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKKyAgICBOYXZSZXBseVJlY29yZCByZXBseTsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWRpY3QgPSBrdzsKLQl9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdkNob29zZVZvbHVtZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCi0JCQlldmVudFByb2MsIGZpbHRlclByb2MsICh2b2lkICopZGljdCk7Ci0JUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOworICAgIGlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBkaWN0ID0ga3c7CisgICAgfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgJmZpbHRlclByb2MsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZDaG9vc2VWb2x1bWUoZGVmYXVsdExvY2F0aW9uLCAmcmVwbHksICZkaWFsb2dPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBldmVudFByb2MsIGZpbHRlclByb2MsICh2b2lkICopZGljdCk7CisgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2Q2hvb3NlT2JqZWN0X19kb2NfX1tdID0KQEAgLTcwNiwzMCArNzA2LDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkNob29zZU9iamVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlBRURlc2MJKmRlZmF1bHRMb2NhdGlvbiA9IE5VTEw7Ci0JTmF2UmVwbHlSZWNvcmQgcmVwbHk7Ci0JTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOwotCU5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7Ci0JTmF2T2JqZWN0RmlsdGVyVVBQIGZpbHRlclByb2MgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBBRURlc2MgICAgICAqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKKyAgICBOYXZSZXBseVJlY29yZCByZXBseTsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWRpY3QgPSBrdzsKLQl9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdkNob29zZU9iamVjdChkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCi0JCQlldmVudFByb2MsIGZpbHRlclByb2MsICh2b2lkICopZGljdCk7Ci0JUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOworICAgIGlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBkaWN0ID0ga3c7CisgICAgfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgJmZpbHRlclByb2MsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZDaG9vc2VPYmplY3QoZGVmYXVsdExvY2F0aW9uLCAmcmVwbHksICZkaWFsb2dPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBldmVudFByb2MsIGZpbHRlclByb2MsICh2b2lkICopZGljdCk7CisgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2TmV3Rm9sZGVyX19kb2NfX1tdID0KQEAgLTczOSwyOCArNzM5LDI4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdk5ld0ZvbGRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlBRURlc2MJKmRlZmF1bHRMb2NhdGlvbiA9IE5VTEw7Ci0JTmF2UmVwbHlSZWNvcmQgcmVwbHk7Ci0JTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOwotCU5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKLQkJCXJldHVybiBOVUxMOwotCQlkaWN0ID0ga3c7Ci0JfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdk5ld0ZvbGRlcihkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsIGV2ZW50UHJvYywgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2TmV3Rm9sZGVyKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywgZXZlbnRQcm9jLCAodm9pZCAqKWRpY3QpOworICAgIFB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKIH0KIAogI2lmIDAKQEAgLTc3NCwxMCArNzc0LDEwIEBACiBuYXZfTmF2Q3VzdG9tQ29udHJvbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmCiAKQEAgLTc4OCwxMSArNzg4LDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdlNlcnZpY2VzQ2FuUnVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlCb29sZWFuIHJ2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gTmF2U2VydmljZXNDYW5SdW4oKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXJ2KTsKKyAgICBCb29sZWFuIHJ2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gTmF2U2VydmljZXNDYW5SdW4oKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXJ2KTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdlNlcnZpY2VzQXZhaWxhYmxlX19kb2NfX1tdID0KQEAgLTgwMiwxMiArODAyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdlNlcnZpY2VzQXZhaWxhYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlCb29sZWFuIHJ2OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gTmF2U2VydmljZXNBdmFpbGFibGUoKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXJ2KTsKKyAgICBCb29sZWFuIHJ2OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBOYXZTZXJ2aWNlc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOwogfQogLyogWFggKi8KIHN0YXRpYyBjaGFyIG5hdl9OYXZMb2FkX19kb2NfX1tdID0KQEAgLTgxOCwxMSArODE4LDExIEBACiBuYXZfTmF2TG9hZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlOYXZMb2FkKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE5hdkxvYWQoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZVbmxvYWRfX2RvY19fW10gPQpAQCAtODMzLDExICs4MzMsMTEgQEAKIG5hdl9OYXZVbmxvYWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTmF2VW5sb2FkKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE5hdlVubG9hZCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkxpYnJhcnlWZXJzaW9uX19kb2NfX1tdID0KQEAgLTg0NywxMiArODQ3LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkxpYnJhcnlWZXJzaW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlVSW50MzIgcnY7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnYgPSBOYXZMaWJyYXJ5VmVyc2lvbigpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOworICAgIFVJbnQzMiBydjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gTmF2TGlicmFyeVZlcnNpb24oKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXJ2KTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkdldERlZmF1bHREaWFsb2dPcHRpb25zX19kb2NfX1tdID0KQEAgLTg2Miw1OSArODYyLDU5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkdldERlZmF1bHREaWFsb2dPcHRpb25zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JT1NFcnIgZXJyOwotCQotCWVyciA9IE5hdkdldERlZmF1bHREaWFsb2dPcHRpb25zKCZkaWFsb2dPcHRpb25zKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoCi0JCQkie3M6aCxzOmwsczpPJixzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJixzOk8mLHM6TyZ9IiwKLQkJInZlcnNpb24iLCBkaWFsb2dPcHRpb25zLnZlcnNpb24sCi0JCSJkaWFsb2dPcHRpb25GbGFncyIsIGRpYWxvZ09wdGlvbnMuZGlhbG9nT3B0aW9uRmxhZ3MsCi0JCSJsb2NhdGlvbiIsIFB5TWFjX0J1aWxkUG9pbnQsIGRpYWxvZ09wdGlvbnMubG9jYXRpb24sCi0JCSJjbGllbnROYW1lIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLmNsaWVudE5hbWUsCi0JCSJ3aW5kb3dUaXRsZSIsIFB5TWFjX0J1aWxkU3RyMjU1LCAmZGlhbG9nT3B0aW9ucy53aW5kb3dUaXRsZSwKLQkJImFjdGlvbkJ1dHRvbkxhYmVsIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLmFjdGlvbkJ1dHRvbkxhYmVsLAotCQkiY2FuY2VsQnV0dG9uTGFiZWwiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuY2FuY2VsQnV0dG9uTGFiZWwsCi0JCSJzYXZlZEZpbGVOYW1lIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLnNhdmVkRmlsZU5hbWUsCi0JCSJtZXNzYWdlIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLm1lc3NhZ2UsCi0JCSJwcmVmZXJlbmNlS2V5IiwgUHlNYWNfQnVpbGRPU1R5cGUsIGRpYWxvZ09wdGlvbnMucHJlZmVyZW5jZUtleQotCQksInBvcHVwRXh0ZW5zaW9uIiwgT3B0UmVzT2JqX05ldywgZGlhbG9nT3B0aW9ucy5wb3B1cEV4dGVuc2lvbgotCQkpOworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBPU0VyciBlcnI7CisKKyAgICBlcnIgPSBOYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucygmZGlhbG9nT3B0aW9ucyk7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKAorICAgICAgICAgICAgICAgICAgICAie3M6aCxzOmwsczpPJixzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJixzOk8mLHM6TyZ9IiwKKyAgICAgICAgInZlcnNpb24iLCBkaWFsb2dPcHRpb25zLnZlcnNpb24sCisgICAgICAgICJkaWFsb2dPcHRpb25GbGFncyIsIGRpYWxvZ09wdGlvbnMuZGlhbG9nT3B0aW9uRmxhZ3MsCisgICAgICAgICJsb2NhdGlvbiIsIFB5TWFjX0J1aWxkUG9pbnQsIGRpYWxvZ09wdGlvbnMubG9jYXRpb24sCisgICAgICAgICJjbGllbnROYW1lIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLmNsaWVudE5hbWUsCisgICAgICAgICJ3aW5kb3dUaXRsZSIsIFB5TWFjX0J1aWxkU3RyMjU1LCAmZGlhbG9nT3B0aW9ucy53aW5kb3dUaXRsZSwKKyAgICAgICAgImFjdGlvbkJ1dHRvbkxhYmVsIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLmFjdGlvbkJ1dHRvbkxhYmVsLAorICAgICAgICAiY2FuY2VsQnV0dG9uTGFiZWwiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuY2FuY2VsQnV0dG9uTGFiZWwsCisgICAgICAgICJzYXZlZEZpbGVOYW1lIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLnNhdmVkRmlsZU5hbWUsCisgICAgICAgICJtZXNzYWdlIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLm1lc3NhZ2UsCisgICAgICAgICJwcmVmZXJlbmNlS2V5IiwgUHlNYWNfQnVpbGRPU1R5cGUsIGRpYWxvZ09wdGlvbnMucHJlZmVyZW5jZUtleQorICAgICAgICAsInBvcHVwRXh0ZW5zaW9uIiwgT3B0UmVzT2JqX05ldywgZGlhbG9nT3B0aW9ucy5wb3B1cEV4dGVuc2lvbgorICAgICAgICApOwogfQogCiAvKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbmF2X21ldGhvZHNbXSA9IHsKLQl7Ik5hdkdldEZpbGUiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkdldEZpbGUsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2R2V0RmlsZV9fZG9jX199LAotIHsiTmF2UHV0RmlsZSIsCShQeUNGdW5jdGlvbiluYXZfTmF2UHV0RmlsZSwJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZQdXRGaWxlX19kb2NfX30sCi0geyJOYXZBc2tTYXZlQ2hhbmdlcyIsCShQeUNGdW5jdGlvbiluYXZfTmF2QXNrU2F2ZUNoYW5nZXMsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2QXNrU2F2ZUNoYW5nZXNfX2RvY19ffSwKLSB7Ik5hdkN1c3RvbUFza1NhdmVDaGFuZ2VzIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDdXN0b21Bc2tTYXZlQ2hhbmdlcywJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZDdXN0b21Bc2tTYXZlQ2hhbmdlc19fZG9jX199LAotIHsiTmF2QXNrRGlzY2FyZENoYW5nZXMiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzLAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzX19kb2NfX30sCi0geyJOYXZDaG9vc2VGaWxlIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VGaWxlLAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdkNob29zZUZpbGVfX2RvY19ffSwKLSB7Ik5hdkNob29zZUZvbGRlciIsCShQeUNGdW5jdGlvbiluYXZfTmF2Q2hvb3NlRm9sZGVyLAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdkNob29zZUZvbGRlcl9fZG9jX199LAotIHsiTmF2Q2hvb3NlVm9sdW1lIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VWb2x1bWUsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2Q2hvb3NlVm9sdW1lX19kb2NfX30sCi0geyJOYXZDaG9vc2VPYmplY3QiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkNob29zZU9iamVjdCwJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZDaG9vc2VPYmplY3RfX2RvY19ffSwKLSB7Ik5hdk5ld0ZvbGRlciIsCShQeUNGdW5jdGlvbiluYXZfTmF2TmV3Rm9sZGVyLAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdk5ld0ZvbGRlcl9fZG9jX199LAorICAgIHsiTmF2R2V0RmlsZSIsICAgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZHZXRGaWxlLCAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZHZXRGaWxlX19kb2NfX30sCisgeyJOYXZQdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZQdXRGaWxlLCAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZQdXRGaWxlX19kb2NfX30sCisgeyJOYXZBc2tTYXZlQ2hhbmdlcyIsICAoUHlDRnVuY3Rpb24pbmF2X05hdkFza1NhdmVDaGFuZ2VzLCAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsICAgICBuYXZfTmF2QXNrU2F2ZUNoYW5nZXNfX2RvY19ffSwKKyB7Ik5hdkN1c3RvbUFza1NhdmVDaGFuZ2VzIiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDdXN0b21Bc2tTYXZlQ2hhbmdlcywgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsICAgICBuYXZfTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXNfX2RvY19ffSwKKyB7Ik5hdkFza0Rpc2NhcmRDaGFuZ2VzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZBc2tEaXNjYXJkQ2hhbmdlcywgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzX19kb2NfX30sCisgeyJOYXZDaG9vc2VGaWxlIiwgICAgICAoUHlDRnVuY3Rpb24pbmF2X05hdkNob29zZUZpbGUsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkNob29zZUZpbGVfX2RvY19ffSwKKyB7Ik5hdkNob29zZUZvbGRlciIsICAgIChQeUNGdW5jdGlvbiluYXZfTmF2Q2hvb3NlRm9sZGVyLCAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZDaG9vc2VGb2xkZXJfX2RvY19ffSwKKyB7Ik5hdkNob29zZVZvbHVtZSIsICAgIChQeUNGdW5jdGlvbiluYXZfTmF2Q2hvb3NlVm9sdW1lLCAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZDaG9vc2VWb2x1bWVfX2RvY19ffSwKKyB7Ik5hdkNob29zZU9iamVjdCIsICAgIChQeUNGdW5jdGlvbiluYXZfTmF2Q2hvb3NlT2JqZWN0LCAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZDaG9vc2VPYmplY3RfX2RvY19ffSwKKyB7Ik5hdk5ld0ZvbGRlciIsICAgICAgIChQeUNGdW5jdGlvbiluYXZfTmF2TmV3Rm9sZGVyLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsICAgICBuYXZfTmF2TmV3Rm9sZGVyX19kb2NfX30sCiAjaWYgMAotIHsiTmF2Q3VzdG9tQ29udHJvbCIsCShQeUNGdW5jdGlvbiluYXZfTmF2Q3VzdG9tQ29udHJvbCwJTUVUSF9WQVJBUkdTLAluYXZfTmF2Q3VzdG9tQ29udHJvbF9fZG9jX199LAorIHsiTmF2Q3VzdG9tQ29udHJvbCIsICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDdXN0b21Db250cm9sLCAgICAgIE1FVEhfVkFSQVJHUywgICBuYXZfTmF2Q3VzdG9tQ29udHJvbF9fZG9jX199LAogI2VuZGlmCi0geyJOYXZTZXJ2aWNlc0NhblJ1biIsCShQeUNGdW5jdGlvbiluYXZfTmF2U2VydmljZXNDYW5SdW4sCU1FVEhfVkFSQVJHUywJbmF2X05hdlNlcnZpY2VzQ2FuUnVuX19kb2NfX30sCi0geyJOYXZTZXJ2aWNlc0F2YWlsYWJsZSIsCShQeUNGdW5jdGlvbiluYXZfTmF2U2VydmljZXNBdmFpbGFibGUsCU1FVEhfVkFSQVJHUywJbmF2X05hdlNlcnZpY2VzQXZhaWxhYmxlX19kb2NfX30sCi0geyJOYXZMb2FkIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZMb2FkLAlNRVRIX1ZBUkFSR1MsCW5hdl9OYXZMb2FkX19kb2NfX30sCi0geyJOYXZVbmxvYWQiLAkoUHlDRnVuY3Rpb24pbmF2X05hdlVubG9hZCwJTUVUSF9WQVJBUkdTLAluYXZfTmF2VW5sb2FkX19kb2NfX30sCi0geyJOYXZMaWJyYXJ5VmVyc2lvbiIsCShQeUNGdW5jdGlvbiluYXZfTmF2TGlicmFyeVZlcnNpb24sCU1FVEhfVkFSQVJHUywJbmF2X05hdkxpYnJhcnlWZXJzaW9uX19kb2NfX30sCi0geyJOYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucyIsCShQeUNGdW5jdGlvbiluYXZfTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMsCU1FVEhfVkFSQVJHUywJbmF2X05hdkdldERlZmF1bHREaWFsb2dPcHRpb25zX19kb2NfX30sCi0Je05VTEwsCSAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgeyJOYXZTZXJ2aWNlc0NhblJ1biIsICAoUHlDRnVuY3Rpb24pbmF2X05hdlNlcnZpY2VzQ2FuUnVuLCAgICAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZTZXJ2aWNlc0NhblJ1bl9fZG9jX199LAorIHsiTmF2U2VydmljZXNBdmFpbGFibGUiLCAgICAgICAoUHlDRnVuY3Rpb24pbmF2X05hdlNlcnZpY2VzQXZhaWxhYmxlLCAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZTZXJ2aWNlc0F2YWlsYWJsZV9fZG9jX199LAorIHsiTmF2TG9hZCIsICAgIChQeUNGdW5jdGlvbiluYXZfTmF2TG9hZCwgICAgICAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZMb2FkX19kb2NfX30sCisgeyJOYXZVbmxvYWQiLCAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZVbmxvYWQsICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdlVubG9hZF9fZG9jX199LAorIHsiTmF2TGlicmFyeVZlcnNpb24iLCAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZMaWJyYXJ5VmVyc2lvbiwgICAgIE1FVEhfVkFSQVJHUywgICBuYXZfTmF2TGlicmFyeVZlcnNpb25fX2RvY19ffSwKKyB7Ik5hdkdldERlZmF1bHREaWFsb2dPcHRpb25zIiwgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucywgICAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9uc19fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0gICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCiAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1vZHVsZSAoKm11c3QqIGJlIGNhbGxlZCBpbml0TmF2KSAqLwogCi1zdGF0aWMgY2hhciBOYXZfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9IAorc3RhdGljIGNoYXIgTmF2X21vZHVsZV9kb2N1bWVudGF0aW9uW10gPQogIkludGVyZmFjZSB0byBOYXZpZ2F0aW9uIFNlcnZpY2VzXG4iCiAiTW9zdCBjYWxscyBhY2NlcHQgYSBOYXZEaWFsb2dPcHRpb25zIGRpY3Rpb25hcnkgb3Iga2V5d29yZHMgd2l0aCB0aGUgc2FtZSBuYW1lcywgcGFzcyB7fVxuIgogImlmIHlvdSB3YW50IHRoZSBkZWZhdWx0IG9wdGlvbnMuXG4iCkBAIC05MzAsMzkgKzkzMCwzOSBAQAogdm9pZAogaW5pdE5hdih2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQkKLQlpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgdGhlIE5hdiBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqZDsKKworICAgIGlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCB0aGUgTmF2IG1vZHVsZSBpcyByZW1vdmVkLiIsIDEpKQorICAgICAgICByZXR1cm47CiAKICNpZmRlZiBfX0xQNjRfXwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgIk5hdmlnYXRpb24gU2VydmljZXMgbm90IGF2YWlsYWJsZSBpbiA2NC1iaXQgbW9kZSIpOwotCXJldHVybjsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJOYXZpZ2F0aW9uIFNlcnZpY2VzIG5vdCBhdmFpbGFibGUgaW4gNjQtYml0IG1vZGUiKTsKKyAgICByZXR1cm47CiAKLSNlbHNlCS8qICFfX0xQNjRfXyAqLworI2Vsc2UgICAvKiAhX19MUDY0X18gKi8KIAotCS8qIFRlc3QgdGhhdCB3ZSBoYXZlIE5hdlNlcnZpY2VzICovCi0JaWYgKCAhTmF2U2VydmljZXNBdmFpbGFibGUoKSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiTmF2aWdhdGlvbiBTZXJ2aWNlcyBub3QgYXZhaWxhYmxlIik7Ci0JCXJldHVybjsKLQl9Ci0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJOYXYiLCBuYXZfbWV0aG9kcywKLQkJTmF2X21vZHVsZV9kb2N1bWVudGF0aW9uLAotCQkoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICAvKiBUZXN0IHRoYXQgd2UgaGF2ZSBOYXZTZXJ2aWNlcyAqLworICAgIGlmICggIU5hdlNlcnZpY2VzQXZhaWxhYmxlKCkgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgIk5hdmlnYXRpb24gU2VydmljZXMgbm90IGF2YWlsYWJsZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgiTmF2IiwgbmF2X21ldGhvZHMsCisgICAgICAgIE5hdl9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKKyAgICAgICAgKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUVycm9yT2JqZWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiTmF2LmVycm9yIik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpOworICAgIC8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgRXJyb3JPYmplY3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJOYXYuZXJyb3IiKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBFcnJvck9iamVjdCk7CiAKLQkvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLwotCQotCS8qIFNldCBVUFBzICovCi0JbXlfZXZlbnRQcm9jVVBQID0gTmV3TmF2RXZlbnRVUFAobXlfZXZlbnRQcm9jKTsKLQlteV9wcmV2aWV3UHJvY1VQUCA9IE5ld05hdlByZXZpZXdVUFAobXlfcHJldmlld1Byb2MpOwotCW15X2ZpbHRlclByb2NVUFAgPSBOZXdOYXZPYmplY3RGaWx0ZXJVUFAobXlfZmlsdGVyUHJvYyk7CisgICAgLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KKworICAgIC8qIFNldCBVUFBzICovCisgICAgbXlfZXZlbnRQcm9jVVBQID0gTmV3TmF2RXZlbnRVUFAobXlfZXZlbnRQcm9jKTsKKyAgICBteV9wcmV2aWV3UHJvY1VQUCA9IE5ld05hdlByZXZpZXdVUFAobXlfcHJldmlld1Byb2MpOworICAgIG15X2ZpbHRlclByb2NVUFAgPSBOZXdOYXZPYmplY3RGaWx0ZXJVUFAobXlfZmlsdGVyUHJvYyk7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JCisKIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvT1NBVGVybWlub2xvZ3kuYyBiL01hYy9Nb2R1bGVzL09TQVRlcm1pbm9sb2d5LmMKaW5kZXggYTdiZWNmNy4uMjExNGQwNyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvT1NBVGVybWlub2xvZ3kuYworKysgYi9NYWMvTW9kdWxlcy9PU0FUZXJtaW5vbG9neS5jCkBAIC0xOCw4NSArMTgsODUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeU9TQV9HZXRBcHBUZXJtaW5vbG9neShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JQUVEZXNjIHRoZURlc2MgPSB7MCwwfTsKLQlGU1NwZWMgZnNzOwotCUNvbXBvbmVudEluc3RhbmNlIGRlZmF1bHRDb21wb25lbnQgPSBOVUxMOwotCVNJbnQxNiBkZWZhdWx0VGVybWlub2xvZ3kgPSAwOwotCUJvb2xlYW4gZGlkTGF1bmNoID0gMDsKLQlPU0FFcnJvciBlcnI7Ci0JbG9uZyBtb2RlRmxhZ3MgPSAwOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ8aSIsIFB5TWFjX0dldEZTU3BlYywgJmZzcywgJm1vZGVGbGFncykpCi0JCSByZXR1cm4gTlVMTDsKLQkKLQkvKgotCSoqIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHVzZSB0aGUgQXBwbGVTY3JpcHQgY29tcG9uZW50IGhlcmUuIFdobyBrbm93cyB3aHkKLQkqKiBPU0FHZXRBcHBUZXJtaW5vbG9neSBzaG91bGQgcmVxdWlyZSBhIHNjcmlwdGluZyBjb21wb25lbnQgaW4gdGhlCi0JKiogZmlyc3QgcGxhY2UsIGJ1dCBpdCBkb2VzLiBOb3RlOiBkb2Vzbid0IHdvcmsgd2l0aCB0aGUgZ2VuZXJpYyBzY3JpcHRpbmcKLQkqKiBjb21wb25lbnQsIHdoaWNoIGlzIHVuZm9ydHVuYXRlIGFzIHRoZSBBUyBjb21wb25lbnQgaXMgY3VycmVudGx5IHZlcnkKLQkqKiBzbG93ICh+MSBzZWM/KSB0byBsb2FkLCBidXQgd2UganVzdCBoYXZlIHRvIGxpdmUgd2l0aCB0aGlzLgotCSovCi0JZGVmYXVsdENvbXBvbmVudCA9IE9wZW5EZWZhdWx0Q29tcG9uZW50IChrT1NBQ29tcG9uZW50VHlwZSwgJ2FzY3InKTsKLQllcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIChkZWZhdWx0Q29tcG9uZW50KTsKLQlpZiAoZXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQllcnIgPSBPU0FHZXRBcHBUZXJtaW5vbG9neSAoCi0gICAgCWRlZmF1bHRDb21wb25lbnQsIAotICAgIAlrT1NBTW9kZU51bGwsCi0gICAgCSZmc3MsIAotICAgIAlkZWZhdWx0VGVybWlub2xvZ3ksIAotICAgIAkmZGlkTGF1bmNoLCAKLSAgICAJJnRoZURlc2MKLQkpOwotCWlmIChlcnIpIHJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmkiLCBBRURlc2NfTmV3LCAmdGhlRGVzYywgZGlkTGF1bmNoKTsKKyAgICBBRURlc2MgdGhlRGVzYyA9IHswLDB9OworICAgIEZTU3BlYyBmc3M7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgZGVmYXVsdENvbXBvbmVudCA9IE5VTEw7CisgICAgU0ludDE2IGRlZmF1bHRUZXJtaW5vbG9neSA9IDA7CisgICAgQm9vbGVhbiBkaWRMYXVuY2ggPSAwOworICAgIE9TQUVycm9yIGVycjsKKyAgICBsb25nIG1vZGVGbGFncyA9IDA7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfGkiLCBQeU1hY19HZXRGU1NwZWMsICZmc3MsICZtb2RlRmxhZ3MpKQorICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyoKKyAgICAqKiBOb3RlIHRoYXQgd2UgaGF2ZSB0byB1c2UgdGhlIEFwcGxlU2NyaXB0IGNvbXBvbmVudCBoZXJlLiBXaG8ga25vd3Mgd2h5CisgICAgKiogT1NBR2V0QXBwVGVybWlub2xvZ3kgc2hvdWxkIHJlcXVpcmUgYSBzY3JpcHRpbmcgY29tcG9uZW50IGluIHRoZQorICAgICoqIGZpcnN0IHBsYWNlLCBidXQgaXQgZG9lcy4gTm90ZTogZG9lc24ndCB3b3JrIHdpdGggdGhlIGdlbmVyaWMgc2NyaXB0aW5nCisgICAgKiogY29tcG9uZW50LCB3aGljaCBpcyB1bmZvcnR1bmF0ZSBhcyB0aGUgQVMgY29tcG9uZW50IGlzIGN1cnJlbnRseSB2ZXJ5CisgICAgKiogc2xvdyAofjEgc2VjPykgdG8gbG9hZCwgYnV0IHdlIGp1c3QgaGF2ZSB0byBsaXZlIHdpdGggdGhpcy4KKyAgICAqLworICAgIGRlZmF1bHRDb21wb25lbnQgPSBPcGVuRGVmYXVsdENvbXBvbmVudCAoa09TQUNvbXBvbmVudFR5cGUsICdhc2NyJyk7CisgICAgZXJyID0gR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciAoZGVmYXVsdENvbXBvbmVudCk7CisgICAgaWYgKGVycikgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgZXJyID0gT1NBR2V0QXBwVGVybWlub2xvZ3kgKAorICAgIGRlZmF1bHRDb21wb25lbnQsCisgICAga09TQU1vZGVOdWxsLAorICAgICZmc3MsCisgICAgZGVmYXVsdFRlcm1pbm9sb2d5LAorICAgICZkaWRMYXVuY2gsCisgICAgJnRoZURlc2MKKyAgICApOworICAgIGlmIChlcnIpIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmkiLCBBRURlc2NfTmV3LCAmdGhlRGVzYywgZGlkTGF1bmNoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5T1NBX0dldFN5c1Rlcm1pbm9sb2d5KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlBRURlc2MgdGhlRGVzYyA9IHswLDB9OwotCUNvbXBvbmVudEluc3RhbmNlIGRlZmF1bHRDb21wb25lbnQgPSBOVUxMOwotCVNJbnQxNiBkZWZhdWx0VGVybWlub2xvZ3kgPSAwOwotCU9TQUVycm9yIGVycjsKLQkKLQkvKiBBY2NlcHQgYW55IGFyZ3MgZm9yIHNha2Ugb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoZW4gaWdub3JlIHRoZW0uICovCisgICAgQUVEZXNjIHRoZURlc2MgPSB7MCwwfTsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBkZWZhdWx0Q29tcG9uZW50ID0gTlVMTDsKKyAgICBTSW50MTYgZGVmYXVsdFRlcm1pbm9sb2d5ID0gMDsKKyAgICBPU0FFcnJvciBlcnI7CiAKLQlkZWZhdWx0Q29tcG9uZW50ID0gT3BlbkRlZmF1bHRDb21wb25lbnQgKGtPU0FDb21wb25lbnRUeXBlLCAnYXNjcicpOwotCWVyciA9IEdldENvbXBvbmVudEluc3RhbmNlRXJyb3IgKGRlZmF1bHRDb21wb25lbnQpOwotCWlmIChlcnIpIHJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCWVyciA9IE9TQUdldFN5c1Rlcm1pbm9sb2d5ICgKLSAgICAJZGVmYXVsdENvbXBvbmVudCwgCi0gICAgCWtPU0FNb2RlTnVsbCwKLSAgICAJZGVmYXVsdFRlcm1pbm9sb2d5LCAKLSAgICAJJnRoZURlc2MKLQkpOwotCWlmIChlcnIpIHJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIEFFRGVzY19OZXcsICZ0aGVEZXNjKTsKKyAgICAvKiBBY2NlcHQgYW55IGFyZ3MgZm9yIHNha2Ugb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoZW4gaWdub3JlIHRoZW0uICovCisKKyAgICBkZWZhdWx0Q29tcG9uZW50ID0gT3BlbkRlZmF1bHRDb21wb25lbnQgKGtPU0FDb21wb25lbnRUeXBlLCAnYXNjcicpOworICAgIGVyciA9IEdldENvbXBvbmVudEluc3RhbmNlRXJyb3IgKGRlZmF1bHRDb21wb25lbnQpOworICAgIGlmIChlcnIpIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIGVyciA9IE9TQUdldFN5c1Rlcm1pbm9sb2d5ICgKKyAgICBkZWZhdWx0Q29tcG9uZW50LAorICAgIGtPU0FNb2RlTnVsbCwKKyAgICBkZWZhdWx0VGVybWlub2xvZ3ksCisgICAgJnRoZURlc2MKKyAgICApOworICAgIGlmIChlcnIpIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIEFFRGVzY19OZXcsICZ0aGVEZXNjKTsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAotLyogCisvKgogICogTGlzdCBvZiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIG1vZHVsZQogICovCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIE9TQVRlcm1pbm9sb2d5X21ldGhvZHNbXSA9CiB7CiAjaWZuZGVmIF9fTFA2NF9fCi0gIAl7IkdldEFwcFRlcm1pbm9sb2d5IiwgCi0JCShQeUNGdW5jdGlvbikgUHlPU0FfR2V0QXBwVGVybWlub2xvZ3ksCi0JCU1FVEhfVkFSQVJHUywKLQkJIkdldCBhbiBhcHBsaWNhdGlvbidzIHRlcm1pbm9sb2d5LiBHZXRBcHBUZXJtaW5vbG9neShwYXRoKSAtLT4gQUVEZXNjIn0sCi0gIAl7IkdldFN5c1Rlcm1pbm9sb2d5IiwgCi0JCShQeUNGdW5jdGlvbikgUHlPU0FfR2V0U3lzVGVybWlub2xvZ3ksCi0JCU1FVEhfVkFSQVJHUywKLQkJIkdldCB0aGUgQXBwbGVTY3JpcHQgbGFuZ3VhZ2UncyB0ZXJtaW5vbG9neS4gR2V0U3lzVGVybWlub2xvZ3koKSAtLT4gQUVEZXNjIn0sCisgICAgeyJHZXRBcHBUZXJtaW5vbG9neSIsCisgICAgICAgIChQeUNGdW5jdGlvbikgUHlPU0FfR2V0QXBwVGVybWlub2xvZ3ksCisgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgIkdldCBhbiBhcHBsaWNhdGlvbidzIHRlcm1pbm9sb2d5LiBHZXRBcHBUZXJtaW5vbG9neShwYXRoKSAtLT4gQUVEZXNjIn0sCisgICAgeyJHZXRTeXNUZXJtaW5vbG9neSIsCisgICAgICAgIChQeUNGdW5jdGlvbikgUHlPU0FfR2V0U3lzVGVybWlub2xvZ3ksCisgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgIkdldCB0aGUgQXBwbGVTY3JpcHQgbGFuZ3VhZ2UncyB0ZXJtaW5vbG9neS4gR2V0U3lzVGVybWlub2xvZ3koKSAtLT4gQUVEZXNjIn0sCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0Je05VTEwsIChQeUNGdW5jdGlvbikgTlVMTCwgMCwgTlVMTH0KKyAgICB7TlVMTCwgKFB5Q0Z1bmN0aW9uKSBOVUxMLCAwLCBOVUxMfQogfTsKIAogdm9pZAogaW5pdE9TQVRlcm1pbm9sb2d5KHZvaWQpCiB7Ci0JaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHRoZSBPU0FUZXJtaW5vbG9neSBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSA8IDApCi0JCXJldHVybjsKLQlQeV9Jbml0TW9kdWxlKCJPU0FUZXJtaW5vbG9neSIsIE9TQVRlcm1pbm9sb2d5X21ldGhvZHMpOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCB0aGUgT1NBVGVybWlub2xvZ3kgbW9kdWxlIGlzIHJlbW92ZWQuIiwgMSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSW5pdE1vZHVsZSgiT1NBVGVybWlub2xvZ3kiLCBPU0FUZXJtaW5vbG9neV9tZXRob2RzKTsKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL19zY3Byb3h5LmMgYi9NYWMvTW9kdWxlcy9fc2Nwcm94eS5jCmluZGV4IDlmNGMxYTQuLmRkNWEyOTMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL19zY3Byb3h5LmMKKysrIGIvTWFjL01vZHVsZXMvX3NjcHJveHkuYwpAQCAtNSwxNjIgKzUsMTYyIEBACiAjaW5jbHVkZSA8UHl0aG9uLmg+CiAjaW5jbHVkZSA8U3lzdGVtQ29uZmlndXJhdGlvbi9TeXN0ZW1Db25maWd1cmF0aW9uLmg+CiAKLXN0YXRpYyBpbnQzMl90IAorc3RhdGljIGludDMyX3QKIGNmbnVtX3RvX2ludDMyKENGTnVtYmVyUmVmIG51bSkKIHsKLQlpbnQzMl90IHJlc3VsdDsKKyAgICBpbnQzMl90IHJlc3VsdDsKIAotCUNGTnVtYmVyR2V0VmFsdWUobnVtLCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmcmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIENGTnVtYmVyR2V0VmFsdWUobnVtLCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBjZnN0cmluZ190b19weXN0cmluZyhDRlN0cmluZ1JlZiByZWYpCiB7Ci0JY29uc3QgY2hhciogczsgCisgICAgY29uc3QgY2hhciogczsKIAotCXMgPSBDRlN0cmluZ0dldENTdHJpbmdQdHIocmVmLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwotCWlmIChzKSB7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOworICAgIHMgPSBDRlN0cmluZ0dldENTdHJpbmdQdHIocmVmLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOworICAgIGlmIChzKSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOwogCi0JfSBlbHNlIHsKLQkJQ0ZJbmRleCBsZW4gPSBDRlN0cmluZ0dldExlbmd0aChyZWYpOwotCQlCb29sZWFuIG9rOwotCQlQeU9iamVjdCogcmVzdWx0OwotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qNCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0ZJbmRleCBsZW4gPSBDRlN0cmluZ0dldExlbmd0aChyZWYpOworICAgICAgICBCb29sZWFuIG9rOworICAgICAgICBQeU9iamVjdCogcmVzdWx0OworICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qNCk7CiAKLQkJb2sgPSBDRlN0cmluZ0dldENTdHJpbmcocmVmLCAKLQkJCQlQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSwKLQkJCQlQeVN0cmluZ19HRVRfU0laRShyZXN1bHQpLAotCQkJCWtDRlN0cmluZ0VuY29kaW5nVVRGOCk7Ci0JCWlmICghb2spIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIAotCQkJCXN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgICAgICBvayA9IENGU3RyaW5nR2V0Q1N0cmluZyhyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOworICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LAorICAgICAgICAgICAgICAgIHN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQogCiAKIHN0YXRpYyBQeU9iamVjdCoKIGdldF9wcm94eV9zZXR0aW5ncyhQeU9iamVjdCogbW9kIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSkKIHsKLQlDRkRpY3Rpb25hcnlSZWYgcHJveHlEaWN0ID0gTlVMTDsKLQlDRk51bWJlclJlZiBhTnVtID0gTlVMTDsKLQlDRkFycmF5UmVmIGFuQXJyYXkgPSBOVUxMOwotCVB5T2JqZWN0KiByZXN1bHQgPSBOVUxMOwotCVB5T2JqZWN0KiB2OwotCWludCByOworICAgIENGRGljdGlvbmFyeVJlZiBwcm94eURpY3QgPSBOVUxMOworICAgIENGTnVtYmVyUmVmIGFOdW0gPSBOVUxMOworICAgIENGQXJyYXlSZWYgYW5BcnJheSA9IE5VTEw7CisgICAgUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QqIHY7CisgICAgaW50IHI7CiAKLQlwcm94eURpY3QgPSBTQ0R5bmFtaWNTdG9yZUNvcHlQcm94aWVzKE5VTEwpOwotCWlmICghcHJveHlEaWN0KSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIHByb3h5RGljdCA9IFNDRHluYW1pY1N0b3JlQ29weVByb3hpZXMoTlVMTCk7CisgICAgaWYgKCFwcm94eURpY3QpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiAKLQlyZXN1bHQgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIHJlc3VsdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIGdvdG8gZXJyb3I7CiAKLQlpZiAoJmtTQ1Byb3BOZXRQcm94aWVzRXhjbHVkZVNpbXBsZUhvc3RuYW1lcyAhPSBOVUxMKSB7Ci0JCWFOdW0gPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIAotCQkJa1NDUHJvcE5ldFByb3hpZXNFeGNsdWRlU2ltcGxlSG9zdG5hbWVzKTsKLQkJaWYgKGFOdW0gPT0gTlVMTCkgewotCQkJdiA9IFB5Qm9vbF9Gcm9tTG9uZygxKTsKLQkJfSBlbHNlIHsKLQkJCXYgPSBQeUJvb2xfRnJvbUxvbmcoY2ZudW1fdG9faW50MzIoYU51bSkpOwotCQl9Ci0JfSAgZWxzZSB7Ci0JCXYgPSBQeUJvb2xfRnJvbUxvbmcoMSk7Ci0JfQorICAgIGlmICgma1NDUHJvcE5ldFByb3hpZXNFeGNsdWRlU2ltcGxlSG9zdG5hbWVzICE9IE5VTEwpIHsKKyAgICAgICAgYU51bSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwKKyAgICAgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzRXhjbHVkZVNpbXBsZUhvc3RuYW1lcyk7CisgICAgICAgIGlmIChhTnVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIHYgPSBQeUJvb2xfRnJvbUxvbmcoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ID0gUHlCb29sX0Zyb21Mb25nKGNmbnVtX3RvX2ludDMyKGFOdW0pKTsKKyAgICAgICAgfQorICAgIH0gIGVsc2UgeworICAgICAgICB2ID0gUHlCb29sX0Zyb21Mb25nKDEpOworICAgIH0KIAotCWlmICh2ID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgaWYgKHYgPT0gTlVMTCkgZ290byBlcnJvcjsKIAotCXIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsICJleGNsdWRlX3NpbXBsZSIsIHYpOwotCVB5X0RFQ1JFRih2KTsgdiA9IE5VTEw7Ci0JaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CisgICAgciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwgImV4Y2x1ZGVfc2ltcGxlIiwgdik7CisgICAgUHlfREVDUkVGKHYpOyB2ID0gTlVMTDsKKyAgICBpZiAociA9PSAtMSkgZ290byBlcnJvcjsKIAotCWFuQXJyYXkgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIAotCQkJa1NDUHJvcE5ldFByb3hpZXNFeGNlcHRpb25zTGlzdCk7Ci0JaWYgKGFuQXJyYXkgIT0gTlVMTCkgewotCQlDRkluZGV4IGxlbiA9IENGQXJyYXlHZXRDb3VudChhbkFycmF5KTsKLQkJQ0ZJbmRleCBpOwotCQl2ID0gUHlUdXBsZV9OZXcobGVuKTsKLQkJaWYgKHYgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICBhbkFycmF5ID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LAorICAgICAgICAgICAgICAgICAgICBrU0NQcm9wTmV0UHJveGllc0V4Y2VwdGlvbnNMaXN0KTsKKyAgICBpZiAoYW5BcnJheSAhPSBOVUxMKSB7CisgICAgICAgIENGSW5kZXggbGVuID0gQ0ZBcnJheUdldENvdW50KGFuQXJyYXkpOworICAgICAgICBDRkluZGV4IGk7CisgICAgICAgIHYgPSBQeVR1cGxlX05ldyhsZW4pOworICAgICAgICBpZiAodiA9PSBOVUxMKSBnb3RvIGVycm9yOwogCi0JCXIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsICJleGNlcHRpb25zIiwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CisgICAgICAgIHIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsICJleGNlcHRpb25zIiwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CiAKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlDRlN0cmluZ1JlZiBhU3RyaW5nID0gTlVMTDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBDRlN0cmluZ1JlZiBhU3RyaW5nID0gTlVMTDsKIAotCQkJYVN0cmluZyA9IENGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoYW5BcnJheSwgaSk7Ci0JCQlpZiAoYVN0cmluZyA9PSBOVUxMKSB7Ci0JCQkJUHlUdXBsZV9TZXRJdGVtKHYsIGksIFB5X05vbmUpOwotCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUHlPYmplY3QqIHQgPSBjZnN0cmluZ190b19weXN0cmluZyhhU3RyaW5nKTsKLQkJCQlpZiAoIXQpIHsKLQkJCQkJUHlUdXBsZV9TZXRJdGVtKHYsIGksIFB5X05vbmUpOwotCQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUHlUdXBsZV9TZXRJdGVtKHYsIGksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIGFTdHJpbmcgPSBDRkFycmF5R2V0VmFsdWVBdEluZGV4KGFuQXJyYXksIGkpOworICAgICAgICAgICAgaWYgKGFTdHJpbmcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0KiB0ID0gY2ZzdHJpbmdfdG9fcHlzdHJpbmcoYVN0cmluZyk7CisgICAgICAgICAgICAgICAgaWYgKCF0KSB7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlDRlJlbGVhc2UocHJveHlEaWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIENGUmVsZWFzZShwcm94eURpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiAKIGVycm9yOgotCWlmIChwcm94eURpY3QpICBDRlJlbGVhc2UocHJveHlEaWN0KTsKLQlQeV9YREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKHByb3h5RGljdCkgIENGUmVsZWFzZShwcm94eURpY3QpOworICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogc2V0X3Byb3h5KFB5T2JqZWN0KiBwcm94aWVzLCBjaGFyKiBwcm90bywgQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCwKLQkJQ0ZTdHJpbmdSZWYgZW5hYmxlZEtleSwgCi0JCUNGU3RyaW5nUmVmIGhvc3RLZXksIENGU3RyaW5nUmVmIHBvcnRLZXkpCisgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgZW5hYmxlZEtleSwKKyAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBob3N0S2V5LCBDRlN0cmluZ1JlZiBwb3J0S2V5KQogewotCUNGTnVtYmVyUmVmIGFOdW07CisgICAgQ0ZOdW1iZXJSZWYgYU51bTsKIAotCWFOdW0gPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIGVuYWJsZWRLZXkpOwotCWlmIChhTnVtICYmIGNmbnVtX3RvX2ludDMyKGFOdW0pKSB7Ci0JCUNGU3RyaW5nUmVmIGhvc3RTdHJpbmc7CisgICAgYU51bSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwgZW5hYmxlZEtleSk7CisgICAgaWYgKGFOdW0gJiYgY2ZudW1fdG9faW50MzIoYU51bSkpIHsKKyAgICAgICAgQ0ZTdHJpbmdSZWYgaG9zdFN0cmluZzsKIAotCQlob3N0U3RyaW5nID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LCBob3N0S2V5KTsKLQkJYU51bSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwgcG9ydEtleSk7CisgICAgICAgIGhvc3RTdHJpbmcgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIGhvc3RLZXkpOworICAgICAgICBhTnVtID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LCBwb3J0S2V5KTsKIAotCQlpZiAoaG9zdFN0cmluZykgewotCQkJaW50IHI7Ci0JCQlQeU9iamVjdCogaCA9IGNmc3RyaW5nX3RvX3B5c3RyaW5nKGhvc3RTdHJpbmcpOwotCQkJUHlPYmplY3QqIHY7Ci0JCQlpZiAoaCkgewotCQkJCWlmIChhTnVtKSB7Ci0JCQkJCWludDMyX3QgcG9ydCA9IGNmbnVtX3RvX2ludDMyKGFOdW0pOwotCQkJCQl2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzOiVsZCIsCi0JCQkJCQlQeVN0cmluZ19BU19TVFJJTkcoaCksCi0JCQkJCQkobG9uZylwb3J0KTsKLQkJCQl9IGVsc2UgewotCQkJCQl2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzIiwKLQkJCQkJCVB5U3RyaW5nX0FTX1NUUklORyhoKSk7Ci0JCQkJfQotCQkJCVB5X0RFQ1JFRihoKTsKLQkJCQlpZiAoIXYpIHJldHVybiAtMTsKLQkJCQlyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcocHJveGllcywgcHJvdG8sCi0JCQkJCXYpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlyZXR1cm4gcjsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoaG9zdFN0cmluZykgeworICAgICAgICAgICAgaW50IHI7CisgICAgICAgICAgICBQeU9iamVjdCogaCA9IGNmc3RyaW5nX3RvX3B5c3RyaW5nKGhvc3RTdHJpbmcpOworICAgICAgICAgICAgUHlPYmplY3QqIHY7CisgICAgICAgICAgICBpZiAoaCkgeworICAgICAgICAgICAgICAgIGlmIChhTnVtKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcG9ydCA9IGNmbnVtX3RvX2ludDMyKGFOdW0pOworICAgICAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzOiVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoaCksCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZylwb3J0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXYpIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICByID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcocHJveGllcywgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgIHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JfQotCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0xNjgsNjQgKzE2OCw2NCBAQAogc3RhdGljIFB5T2JqZWN0KgogZ2V0X3Byb3hpZXMoUHlPYmplY3QqIG1vZCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkpCiB7Ci0JUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7Ci0JaW50IHI7Ci0JQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCA9IE5VTEw7CisgICAgUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7CisgICAgaW50IHI7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCA9IE5VTEw7CiAKLQlwcm94eURpY3QgPSBTQ0R5bmFtaWNTdG9yZUNvcHlQcm94aWVzKE5VTEwpOwotCWlmIChwcm94eURpY3QgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlEaWN0X05ldygpOwotCX0KKyAgICBwcm94eURpY3QgPSBTQ0R5bmFtaWNTdG9yZUNvcHlQcm94aWVzKE5VTEwpOworICAgIGlmIChwcm94eURpY3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlEaWN0X05ldygpOworICAgIH0KIAotCXJlc3VsdCA9IFB5RGljdF9OZXcoKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgcmVzdWx0ID0gUHlEaWN0X05ldygpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgZ290byBlcnJvcjsKIAotCXIgPSBzZXRfcHJveHkocmVzdWx0LCAiaHR0cCIsIHByb3h5RGljdCwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQRW5hYmxlLAotCQlrU0NQcm9wTmV0UHJveGllc0hUVFBQcm94eSwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQUG9ydCk7Ci0JaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7Ci0JciA9IHNldF9wcm94eShyZXN1bHQsICJodHRwcyIsIHByb3h5RGljdCwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQU0VuYWJsZSwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQU1Byb3h5LAotCQlrU0NQcm9wTmV0UHJveGllc0hUVFBTUG9ydCk7Ci0JaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7Ci0JciA9IHNldF9wcm94eShyZXN1bHQsICJmdHAiLCBwcm94eURpY3QsCi0JCWtTQ1Byb3BOZXRQcm94aWVzRlRQRW5hYmxlLAotCQlrU0NQcm9wTmV0UHJveGllc0ZUUFByb3h5LAotCQlrU0NQcm9wTmV0UHJveGllc0ZUUFBvcnQpOwotCWlmIChyID09IC0xKSBnb3RvIGVycm9yOwotCXIgPSBzZXRfcHJveHkocmVzdWx0LCAiZ29waGVyIiwgcHJveHlEaWN0LAotCQlrU0NQcm9wTmV0UHJveGllc0dvcGhlckVuYWJsZSwKLQkJa1NDUHJvcE5ldFByb3hpZXNHb3BoZXJQcm94eSwKLQkJa1NDUHJvcE5ldFByb3hpZXNHb3BoZXJQb3J0KTsKLQlpZiAociA9PSAtMSkgZ290byBlcnJvcjsKKyAgICByID0gc2V0X3Byb3h5KHJlc3VsdCwgImh0dHAiLCBwcm94eURpY3QsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUEVuYWJsZSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNIVFRQUHJveHksCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUFBvcnQpOworICAgIGlmIChyID09IC0xKSBnb3RvIGVycm9yOworICAgIHIgPSBzZXRfcHJveHkocmVzdWx0LCAiaHR0cHMiLCBwcm94eURpY3QsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUFNFbmFibGUsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUFNQcm94eSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNIVFRQU1BvcnQpOworICAgIGlmIChyID09IC0xKSBnb3RvIGVycm9yOworICAgIHIgPSBzZXRfcHJveHkocmVzdWx0LCAiZnRwIiwgcHJveHlEaWN0LAorICAgICAgICBrU0NQcm9wTmV0UHJveGllc0ZUUEVuYWJsZSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNGVFBQcm94eSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNGVFBQb3J0KTsKKyAgICBpZiAociA9PSAtMSkgZ290byBlcnJvcjsKKyAgICByID0gc2V0X3Byb3h5KHJlc3VsdCwgImdvcGhlciIsIHByb3h5RGljdCwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNHb3BoZXJFbmFibGUsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzR29waGVyUHJveHksCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzR29waGVyUG9ydCk7CisgICAgaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CiAKLQlDRlJlbGVhc2UocHJveHlEaWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIENGUmVsZWFzZShwcm94eURpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiBlcnJvcjoKLQlpZiAocHJveHlEaWN0KSAgQ0ZSZWxlYXNlKHByb3h5RGljdCk7Ci0JUHlfWERFQ1JFRihyZXN1bHQpOwotCXJldHVybiBOVUxMOworICAgIGlmIChwcm94eURpY3QpICBDRlJlbGVhc2UocHJveHlEaWN0KTsKKyAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2RfbWV0aG9kc1tdID0gewotCXsKLQkJIl9nZXRfcHJveHlfc2V0dGluZ3MiLAotCQkoUHlDRnVuY3Rpb24pZ2V0X3Byb3h5X3NldHRpbmdzLAotCQlNRVRIX05PQVJHUywKLQkJTlVMTCwKLQl9LAotCXsKLQkJIl9nZXRfcHJveGllcyIsCi0JCShQeUNGdW5jdGlvbilnZXRfcHJveGllcywKLQkJTUVUSF9OT0FSR1MsCi0JCU5VTEwsCi0JfSwKLQl7IDAsIDAsIDAsIDAgfQorICAgIHsKKyAgICAgICAgIl9nZXRfcHJveHlfc2V0dGluZ3MiLAorICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X3Byb3h5X3NldHRpbmdzLAorICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgICAgTlVMTCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgIl9nZXRfcHJveGllcyIsCisgICAgICAgIChQeUNGdW5jdGlvbilnZXRfcHJveGllcywKKyAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgICAgIE5VTEwsCisgICAgfSwKKyAgICB7IDAsIDAsIDAsIDAgfQogfTsKIAogdm9pZCBpbml0X3NjcHJveHkodm9pZCkKIHsKLQkodm9pZClQeV9Jbml0TW9kdWxlNCgiX3NjcHJveHkiLCBtb2RfbWV0aG9kcywgTlVMTCwgTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICAodm9pZClQeV9Jbml0TW9kdWxlNCgiX3NjcHJveHkiLCBtb2RfbWV0aG9kcywgTlVMTCwgTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2FlL19BRW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKaW5kZXggMDkxMDVhNS4uMjFhMmQ0MCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKQEAgLTEzLDkgKzEzLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM4LDkgKzM4LDkgQEAKIAogc3RhdGljIHBhc2NhbCBCb29sZWFuIEFFSWRsZVByb2MoRXZlbnRSZWNvcmQgKnRoZUV2ZW50LCBsb25nICpzbGVlcFRpbWUsIFJnbkhhbmRsZSAqbW91c2VSZ24pCiB7Ci0gICAgICAgIGlmICggUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCgpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBQeU9TX0ludGVycnVwdE9jY3VycmVkKCkgKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogQUVJZGxlVVBQIHVwcF9BRUlkbGVQcm9jOwpAQCAtNTQsODA3ICs1NCw4MDcgQEAKICNkZWZpbmUgQUVEZXNjX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkFFRGVzY19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZBRURlc2NfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEFFRGVzY09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUFFRGVzYyBvYl9pdHNlbGY7Ci0JaW50IG9iX293bmVkOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBBRURlc2Mgb2JfaXRzZWxmOworICAgIGludCBvYl9vd25lZDsKIH0gQUVEZXNjT2JqZWN0OwogCiBQeU9iamVjdCAqQUVEZXNjX05ldyhBRURlc2MgKml0c2VsZikKIHsKLQlBRURlc2NPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEFFRGVzY09iamVjdCwgJkFFRGVzY19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JaXQtPm9iX293bmVkID0gMTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQUVEZXNjT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhBRURlc2NPYmplY3QsICZBRURlc2NfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSAqaXRzZWxmOworICAgIGl0LT5vYl9vd25lZCA9IDE7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQUVEZXNjX0NvbnZlcnQoUHlPYmplY3QgKnYsIEFFRGVzYyAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFBRURlc2NfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQUVEZXNjIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEFFRGVzY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFBRURlc2NfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQUVEZXNjIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEFFRGVzY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEFFRGVzY19kZWFsbG9jKEFFRGVzY09iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2Jfb3duZWQpIEFFRGlzcG9zZURlc2MoJnNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2Jfb3duZWQpIEFFRGlzcG9zZURlc2MoJnNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVDb2VyY2VEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEZXNjVHlwZSB0b1R5cGU7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSB0b1R5cGU7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVDb2VyY2VEZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVDb2VyY2VEZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNvZXJjZURlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0b1R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVDb2VyY2VEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgdG9UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdG9UeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFQ29lcmNlRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVEdXBsaWNhdGVEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRURlc2MgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFRGVzYyByZXN1bHQ7CiAjaWZuZGVmIEFFRHVwbGljYXRlRGVzYwotCVB5TWFjX1BSRUNIRUNLKEFFRHVwbGljYXRlRGVzYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVEdXBsaWNhdGVEZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVEdXBsaWNhdGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVEdXBsaWNhdGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUNvdW50SXRlbXMoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgdGhlQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyB0aGVDb3VudDsKICNpZm5kZWYgQUVDb3VudEl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soQUVDb3VudEl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNvdW50SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUNvdW50SXRlbXMoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmdGhlQ291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFQ291bnRJdGVtcygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVB1dFB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpbmRleDsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQljaGFyICpkYXRhUHRyX19pbl9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKICNpZm5kZWYgQUVQdXRQdHIKLQlQeU1hY19QUkVDSEVDSyhBRVB1dFB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVQdXRQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVQdXRQdHIoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICB0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFUHV0UHRyKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVQdXREZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OwotCUFFRGVzYyB0aGVBRURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpbmRleDsKKyAgICBBRURlc2MgdGhlQUVEZXNjOwogI2lmbmRlZiBBRVB1dERlc2MKLQlQeU1hY19QUkVDSEVDSyhBRVB1dERlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUHV0RGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQUVEZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUHV0RGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgJnRoZUFFRGVzYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVB1dERlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVBRURlc2MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUdldE50aFB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpbmRleDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX291dF9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19vdXRfXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKICNpZm5kZWYgQUVHZXROdGhQdHIKLQlQeU1hY19QUkVDSEVDSyhBRUdldE50aFB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXROdGhQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8maSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRUdldE50aFB0cigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCBkYXRhUHRyX19sZW5fXywgJmRhdGFQdHJfX2xlbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKLQlmcmVlKGRhdGFQdHJfX291dF9fKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGRhdGFQdHJfX2Vycm9yX187CisgICAgfQorICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFR2V0TnRoUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICZ0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIGRhdGFQdHJfX2xlbl9fLCAmZGF0YVB0cl9fbGVuX18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXROdGhEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluZGV4OworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVHZXROdGhEZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXROdGhEZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldE50aERlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUdldE50aERlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUdldE50aERlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFU2l6ZU9mTnRoSXRlbShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpbmRleDsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQlTaXplIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgU2l6ZSBkYXRhU2l6ZTsKICNpZm5kZWYgQUVTaXplT2ZOdGhJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soQUVTaXplT2ZOdGhJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVNpemVPZk50aEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNpemVPZk50aEl0ZW0oJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVTaXplT2ZOdGhJdGVtKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVEZWxldGVJdGVtKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIEFFRGVsZXRlSXRlbQotCVB5TWFjX1BSRUNIRUNLKEFFRGVsZXRlSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVEZWxldGVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVEZWxldGVJdGVtKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVEZWxldGVJdGVtKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVB1dFBhcmFtUHRyKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRVB1dFBhcmFtUHRyCi0JUHlNYWNfUFJFQ0hFQ0soQUVQdXRQYXJhbVB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVQdXRQYXJhbVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVQdXRQYXJhbVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBRVB1dFBhcmFtUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUHV0UGFyYW1EZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCUFFRGVzYyB0aGVBRURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBBRURlc2MgdGhlQUVEZXNjOwogI2lmbmRlZiBBRVB1dFBhcmFtRGVzYwotCVB5TWFjX1BSRUNIRUNLKEFFUHV0UGFyYW1EZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVB1dFBhcmFtRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVB1dFBhcmFtRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVB1dFBhcmFtRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXRQYXJhbVB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQljaGFyICpkYXRhUHRyX19vdXRfXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIGNoYXIgKmRhdGFQdHJfX291dF9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRUdldFBhcmFtUHRyCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXRQYXJhbVB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXRQYXJhbVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maSIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRUdldFBhcmFtUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIGRhdGFQdHJfX2xlbl9fLCAmZGF0YVB0cl9fbGVuX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgKGludClkYXRhUHRyX19sZW5fXyk7Ci0JZnJlZShkYXRhUHRyX19vdXRfXyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGRhdGFQdHJfX291dF9fID0gbWFsbG9jKGRhdGFQdHJfX2luX2xlbl9fKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZGF0YVB0cl9fZXJyb3JfXzsKKyAgICB9CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gQUVHZXRQYXJhbVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCBkYXRhUHRyX19sZW5fXywgJmRhdGFQdHJfX2xlbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXRQYXJhbURlc2MoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JRGVzY1R5cGUgZGVzaXJlZFR5cGU7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIEFFRGVzYyByZXN1bHQ7CiAjaWZuZGVmIEFFR2V0UGFyYW1EZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXRQYXJhbURlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFR2V0UGFyYW1EZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFR2V0UGFyYW1EZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVHZXRQYXJhbURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVTaXplT2ZQYXJhbShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQlTaXplIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgU2l6ZSBkYXRhU2l6ZTsKICNpZm5kZWYgQUVTaXplT2ZQYXJhbQotCVB5TWFjX1BSRUNIRUNLKEFFU2l6ZU9mUGFyYW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU2l6ZU9mUGFyYW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVTaXplT2ZQYXJhbSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFU2l6ZU9mUGFyYW0oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVEZWxldGVQYXJhbShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwogI2lmbmRlZiBBRURlbGV0ZVBhcmFtCi0JUHlNYWNfUFJFQ0hFQ0soQUVEZWxldGVQYXJhbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVEZWxldGVQYXJhbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRURlbGV0ZVBhcmFtKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVEZWxldGVQYXJhbSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUdldEF0dHJpYnV0ZVB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQljaGFyICpkYXRhUHRyX19vdXRfXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIGNoYXIgKmRhdGFQdHJfX291dF9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRUdldEF0dHJpYnV0ZVB0cgotCVB5TWFjX1BSRUNIRUNLKEFFR2V0QXR0cmlidXRlUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldEF0dHJpYnV0ZVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maSIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRUdldEF0dHJpYnV0ZVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgZGF0YVB0cl9fbGVuX18sICZkYXRhUHRyX19sZW5fXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKLQlmcmVlKGRhdGFQdHJfX291dF9fKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBkYXRhUHRyX19lcnJvcl9fOworICAgIH0KKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBRUdldEF0dHJpYnV0ZVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgZGF0YVB0cl9fbGVuX18sICZkYXRhUHRyX19sZW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKKyAgICBmcmVlKGRhdGFQdHJfX291dF9fKTsKICBkYXRhUHRyX19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFR2V0QXR0cmlidXRlRGVzYyhBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlBRURlc2MgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVHZXRBdHRyaWJ1dGVEZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXRBdHRyaWJ1dGVEZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldEF0dHJpYnV0ZURlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVHZXRBdHRyaWJ1dGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVHZXRBdHRyaWJ1dGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFU2l6ZU9mQXR0cmlidXRlKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCVNpemUgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBTaXplIGRhdGFTaXplOwogI2lmbmRlZiBBRVNpemVPZkF0dHJpYnV0ZQotCVB5TWFjX1BSRUNIRUNLKEFFU2l6ZU9mQXR0cmlidXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVNpemVPZkF0dHJpYnV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNpemVPZkF0dHJpYnV0ZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFU2l6ZU9mQXR0cmlidXRlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUHV0QXR0cmlidXRlUHRyKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRVB1dEF0dHJpYnV0ZVB0cgotCVB5TWFjX1BSRUNIRUNLKEFFUHV0QXR0cmlidXRlUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVB1dEF0dHJpYnV0ZVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVQdXRBdHRyaWJ1dGVQdHIoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gQUVQdXRBdHRyaWJ1dGVQdHIoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVQdXRBdHRyaWJ1dGVEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCUFFRGVzYyB0aGVBRURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBBRURlc2MgdGhlQUVEZXNjOwogI2lmbmRlZiBBRVB1dEF0dHJpYnV0ZURlc2MKLQlQeU1hY19QUkVDSEVDSyhBRVB1dEF0dHJpYnV0ZURlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUHV0QXR0cmlidXRlRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVB1dEF0dHJpYnV0ZURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVB1dEF0dHJpYnV0ZURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXREZXNjRGF0YVNpemUoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTaXplIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU2l6ZSBfcnY7CiAjaWZuZGVmIEFFR2V0RGVzY0RhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXREZXNjRGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFR2V0RGVzY0RhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBBRUdldERlc2NEYXRhU2l6ZSgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEFFR2V0RGVzY0RhdGFTaXplKCZfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVTZW5kKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBcHBsZUV2ZW50IHJlcGx5OwotCUFFU2VuZE1vZGUgc2VuZE1vZGU7Ci0JQUVTZW5kUHJpb3JpdHkgc2VuZFByaW9yaXR5OwotCWxvbmcgdGltZU91dEluVGlja3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQXBwbGVFdmVudCByZXBseTsKKyAgICBBRVNlbmRNb2RlIHNlbmRNb2RlOworICAgIEFFU2VuZFByaW9yaXR5IHNlbmRQcmlvcml0eTsKKyAgICBsb25nIHRpbWVPdXRJblRpY2tzOwogI2lmbmRlZiBBRVNlbmQKLQlQeU1hY19QUkVDSEVDSyhBRVNlbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU2VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VuZE1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZW5kUHJpb3JpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lT3V0SW5UaWNrcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNlbmQoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAmcmVwbHksCi0JICAgICAgICAgICAgICBzZW5kTW9kZSwKLQkgICAgICAgICAgICAgIHNlbmRQcmlvcml0eSwKLQkgICAgICAgICAgICAgIHRpbWVPdXRJblRpY2tzLAotCSAgICAgICAgICAgICAgdXBwX0FFSWRsZVByb2MsCi0JICAgICAgICAgICAgICAoQUVGaWx0ZXJVUFApMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXBseSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbmRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VuZFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZU91dEluVGlja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVTZW5kKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgJnJlcGx5LAorICAgICAgICAgICAgICAgICAgc2VuZE1vZGUsCisgICAgICAgICAgICAgICAgICBzZW5kUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICB0aW1lT3V0SW5UaWNrcywKKyAgICAgICAgICAgICAgICAgIHVwcF9BRUlkbGVQcm9jLAorICAgICAgICAgICAgICAgICAgKEFFRmlsdGVyVVBQKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVwbHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVJlc2V0VGltZXIoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBRVJlc2V0VGltZXIKLQlQeU1hY19QUkVDSEVDSyhBRVJlc2V0VGltZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUmVzZXRUaW1lcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUmVzZXRUaW1lcigmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVJlc2V0VGltZXIoJl9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQoJl9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVJlc3VtZVRoZUN1cnJlbnRFdmVudChBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQXBwbGVFdmVudCByZXBseTsKLQlBRUV2ZW50SGFuZGxlclVQUCBkaXNwYXRjaGVyX19wcm9jX18gPSB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlcjsKLQlQeU9iamVjdCAqZGlzcGF0Y2hlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBcHBsZUV2ZW50IHJlcGx5OworICAgIEFFRXZlbnRIYW5kbGVyVVBQIGRpc3BhdGNoZXJfX3Byb2NfXyA9IHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyOworICAgIFB5T2JqZWN0ICpkaXNwYXRjaGVyOwogI2lmbmRlZiBBRVJlc3VtZVRoZUN1cnJlbnRFdmVudAotCVB5TWFjX1BSRUNIRUNLKEFFUmVzdW1lVGhlQ3VycmVudEV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVJlc3VtZVRoZUN1cnJlbnRFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8iLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnJlcGx5LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVJlc3VtZVRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVyX19wcm9jX18sIAotCQkJCSAgICAgICAoU1JlZkNvbilkaXNwYXRjaGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYoZGlzcGF0Y2hlcik7IC8qIFhYWCBsZWFrLCBidXQgbmVlZGVkICovCi0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVSZXN1bWVUaGVDdXJyZW50RXZlbnQoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcl9fcHJvY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1JlZkNvbilkaXNwYXRjaGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoZGlzcGF0Y2hlcik7IC8qIFhYWCBsZWFrLCBidXQgbmVlZGVkICovCisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFR2V0VGhlQ3VycmVudEV2ZW50KEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQUVHZXRUaGVDdXJyZW50RXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRUdldFRoZUN1cnJlbnRFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXRUaGVDdXJyZW50RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUdldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUdldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFU2V0VGhlQ3VycmVudEV2ZW50KEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQUVTZXRUaGVDdXJyZW50RXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRVNldFRoZUN1cnJlbnRFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVTZXRUaGVDdXJyZW50RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVNldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUmVzb2x2ZShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgY2FsbGJhY2tGbGFnczsKLQlBRURlc2MgdGhlVG9rZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgY2FsbGJhY2tGbGFnczsKKyAgICBBRURlc2MgdGhlVG9rZW47CiAjaWZuZGVmIEFFUmVzb2x2ZQotCVB5TWFjX1BSRUNIRUNLKEFFUmVzb2x2ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVSZXNvbHZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2tGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVJlc29sdmUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBjYWxsYmFja0ZsYWdzLAotCSAgICAgICAgICAgICAgICAgJnRoZVRva2VuKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnRoZVRva2VuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbGxiYWNrRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVSZXNvbHZlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVUb2tlbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVUb2tlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0F1dG9EaXNwb3NlKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IG9ub2ZmLCBvbGQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZvbm9mZikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlvbGQgPSBfc2VsZi0+b2Jfb3duZWQ7Ci0JX3NlbGYtPm9iX293bmVkID0gb25vZmY7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOwotCXJldHVybiBfcmVzOworICAgIGludCBvbm9mZiwgb2xkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmb25vZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvbGQgPSBfc2VsZi0+b2Jfb3duZWQ7CisgICAgX3NlbGYtPm9iX293bmVkID0gb25vZmY7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBBRURlc2NfbWV0aG9kc1tdID0gewotCXsiQUVDb2VyY2VEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUNvZXJjZURlc2MsIDEsCi0JIFB5RG9jX1NUUigiKERlc2NUeXBlIHRvVHlwZSkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVEdXBsaWNhdGVEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUR1cGxpY2F0ZURlc2MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVDb3VudEl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUNvdW50SXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgdGhlQ291bnQpIil9LAotCXsiQUVQdXRQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0UHRyLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4LCBEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IE5vbmUiKX0sCi0JeyJBRVB1dERlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0RGVzYywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgQUVEZXNjIHRoZUFFRGVzYykgLT4gTm9uZSIpfSwKLQl7IkFFR2V0TnRoUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldE50aFB0ciwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSIpfSwKLQl7IkFFR2V0TnRoRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXROdGhEZXNjLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4LCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVTaXplT2ZOdGhJdGVtIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNpemVPZk50aEl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgU2l6ZSBkYXRhU2l6ZSkiKX0sCi0JeyJBRURlbGV0ZUl0ZW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFRGVsZXRlSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkFFUHV0UGFyYW1QdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0UGFyYW1QdHIsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gTm9uZSIpfSwKLQl7IkFFUHV0UGFyYW1EZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVB1dFBhcmFtRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgQUVEZXNjIHRoZUFFRGVzYykgLT4gTm9uZSIpfSwKLQl7IkFFR2V0UGFyYW1QdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0UGFyYW1QdHIsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIGRlc2lyZWRUeXBlLCBCdWZmZXIgZGF0YVB0cikgLT4gKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikiKX0sCi0JeyJBRUdldFBhcmFtRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRQYXJhbURlc2MsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCi0JeyJBRVNpemVPZlBhcmFtIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNpemVPZlBhcmFtLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIFNpemUgZGF0YVNpemUpIil9LAotCXsiQUVEZWxldGVQYXJhbSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVEZWxldGVQYXJhbSwgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCkgLT4gTm9uZSIpfSwKLQl7IkFFR2V0QXR0cmlidXRlUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldEF0dHJpYnV0ZVB0ciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSIpfSwKLQl7IkFFR2V0QXR0cmlidXRlRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRBdHRyaWJ1dGVEZXNjLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVTaXplT2ZBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2l6ZU9mQXR0cmlidXRlLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIFNpemUgZGF0YVNpemUpIil9LAotCXsiQUVQdXRBdHRyaWJ1dGVQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0QXR0cmlidXRlUHRyLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IE5vbmUiKX0sCi0JeyJBRVB1dEF0dHJpYnV0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0QXR0cmlidXRlRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgQUVEZXNjIHRoZUFFRGVzYykgLT4gTm9uZSIpfSwKLQl7IkFFR2V0RGVzY0RhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldERlc2NEYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU2l6ZSBfcnYpIil9LAotCXsiQUVTZW5kIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNlbmQsIDEsCi0JIFB5RG9jX1NUUigiKEFFU2VuZE1vZGUgc2VuZE1vZGUsIEFFU2VuZFByaW9yaXR5IHNlbmRQcmlvcml0eSwgbG9uZyB0aW1lT3V0SW5UaWNrcykgLT4gKEFwcGxlRXZlbnQgcmVwbHkpIil9LAotCXsiQUVSZXNldFRpbWVyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVJlc2V0VGltZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTdXNwZW5kVGhlQ3VycmVudEV2ZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBRVJlc3VtZVRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVSZXN1bWVUaGVDdXJyZW50RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEFwcGxlRXZlbnQgcmVwbHksIEV2ZW50SGFuZGxlciBkaXNwYXRjaGVyKSAtPiBOb25lIil9LAotCXsiQUVHZXRUaGVDdXJyZW50RXZlbnQiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0VGhlQ3VycmVudEV2ZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBRVNldFRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTZXRUaGVDdXJyZW50RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFFUmVzb2x2ZSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVSZXNvbHZlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjYWxsYmFja0ZsYWdzKSAtPiAoQUVEZXNjIHRoZVRva2VuKSIpfSwKLQl7IkF1dG9EaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BdXRvRGlzcG9zZSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IEFFRGlzcG9zZURlc2MgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJBRUNvZXJjZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFQ29lcmNlRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGVzY1R5cGUgdG9UeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRUR1cGxpY2F0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFRHVwbGljYXRlRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRUNvdW50SXRlbXMiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFQ291bnRJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyB0aGVDb3VudCkiKX0sCisgICAgeyJBRVB1dFB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRQdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gTm9uZSIpfSwKKyAgICB7IkFFUHV0RGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXREZXNjLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluZGV4LCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXROdGhQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0TnRoUHRyLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluZGV4LCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIil9LAorICAgIHsiQUVHZXROdGhEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldE50aERlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRVNpemVPZk50aEl0ZW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2l6ZU9mTnRoSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKERlc2NUeXBlIHR5cGVDb2RlLCBTaXplIGRhdGFTaXplKSIpfSwKKyAgICB7IkFFRGVsZXRlSXRlbSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVEZWxldGVJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiQUVQdXRQYXJhbVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRQYXJhbVB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiBOb25lIil9LAorICAgIHsiQUVQdXRQYXJhbURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0UGFyYW1EZXNjLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXRQYXJhbVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRQYXJhbVB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSIpfSwKKyAgICB7IkFFR2V0UGFyYW1EZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldFBhcmFtRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKKyAgICB7IkFFU2l6ZU9mUGFyYW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2l6ZU9mUGFyYW0sIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgU2l6ZSBkYXRhU2l6ZSkiKX0sCisgICAgeyJBRURlbGV0ZVBhcmFtIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRURlbGV0ZVBhcmFtLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXRBdHRyaWJ1dGVQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0QXR0cmlidXRlUHRyLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIil9LAorICAgIHsiQUVHZXRBdHRyaWJ1dGVEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldEF0dHJpYnV0ZURlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRVNpemVPZkF0dHJpYnV0ZSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTaXplT2ZBdHRyaWJ1dGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgU2l6ZSBkYXRhU2l6ZSkiKX0sCisgICAgeyJBRVB1dEF0dHJpYnV0ZVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRBdHRyaWJ1dGVQdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gTm9uZSIpfSwKKyAgICB7IkFFUHV0QXR0cmlidXRlRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRBdHRyaWJ1dGVEZXNjLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXREZXNjRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0RGVzY0RhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTaXplIF9ydikiKX0sCisgICAgeyJBRVNlbmQiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2VuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVTZW5kTW9kZSBzZW5kTW9kZSwgQUVTZW5kUHJpb3JpdHkgc2VuZFByaW9yaXR5LCBsb25nIHRpbWVPdXRJblRpY2tzKSAtPiAoQXBwbGVFdmVudCByZXBseSkiKX0sCisgICAgeyJBRVJlc2V0VGltZXIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUmVzZXRUaW1lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQUVTdXNwZW5kVGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkFFUmVzdW1lVGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVJlc3VtZVRoZUN1cnJlbnRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQXBwbGVFdmVudCByZXBseSwgRXZlbnRIYW5kbGVyIGRpc3BhdGNoZXIpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldFRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRUaGVDdXJyZW50RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkFFU2V0VGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNldFRoZUN1cnJlbnRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQUVSZXNvbHZlIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVJlc29sdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGNhbGxiYWNrRmxhZ3MpIC0+IChBRURlc2MgdGhlVG9rZW4pIil9LAorICAgIHsiQXV0b0Rpc3Bvc2UiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0F1dG9EaXNwb3NlLCAxLAorICAgICBQeURvY19TVFIoIihpbnQpLT5pbnQuIEF1dG9tYXRpY2FsbHkgQUVEaXNwb3NlRGVzYyB0aGUgb2JqZWN0IG9uIFB5dGhvbiBvYmplY3QgY2xlYW51cCIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX2dldF90eXBlKEFFRGVzY09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlNYWNfQnVpbGRPU1R5cGUoc2VsZi0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlKTsKKyAgICByZXR1cm4gUHlNYWNfQnVpbGRPU1R5cGUoc2VsZi0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlKTsKIH0KIAogI2RlZmluZSBBRURlc2Nfc2V0X3R5cGUgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19nZXRfZGF0YShBRURlc2NPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlTaXplIHNpemU7Ci0JY2hhciAqcHRyOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFNpemUgc2l6ZTsKKyAgICBjaGFyICpwdHI7CisgICAgT1NFcnIgZXJyOwogCi0Jc2l6ZSA9IEFFR2V0RGVzY0RhdGFTaXplKCZzZWxmLT5vYl9pdHNlbGYpOwotCWlmICggKHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCAocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCWlmICggKGVycj1BRUdldERlc2NEYXRhKCZzZWxmLT5vYl9pdHNlbGYsIHB0ciwgc2l6ZSkpIDwgMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiByZXM7CisgICAgc2l6ZSA9IEFFR2V0RGVzY0RhdGFTaXplKCZzZWxmLT5vYl9pdHNlbGYpOworICAgIGlmICggKHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCAocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggKGVycj1BRUdldERlc2NEYXRhKCZzZWxmLT5vYl9pdHNlbGYsIHB0ciwgc2l6ZSkpIDwgMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiByZXM7CiB9CiAKICNkZWZpbmUgQUVEZXNjX3NldF9kYXRhIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIEFFRGVzY19nZXRzZXRsaXN0W10gPSB7Ci0JeyJ0eXBlIiwgKGdldHRlcilBRURlc2NfZ2V0X3R5cGUsIChzZXR0ZXIpQUVEZXNjX3NldF90eXBlLCAiVHlwZSBvZiB0aGlzIEFFRGVzYyJ9LAotCXsiZGF0YSIsIChnZXR0ZXIpQUVEZXNjX2dldF9kYXRhLCAoc2V0dGVyKUFFRGVzY19zZXRfZGF0YSwgIlRoZSByYXcgZGF0YSBpbiB0aGlzIEFFRGVzYyJ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7InR5cGUiLCAoZ2V0dGVyKUFFRGVzY19nZXRfdHlwZSwgKHNldHRlcilBRURlc2Nfc2V0X3R5cGUsICJUeXBlIG9mIHRoaXMgQUVEZXNjIn0sCisgICAgeyJkYXRhIiwgKGdldHRlcilBRURlc2NfZ2V0X2RhdGEsIChzZXR0ZXIpQUVEZXNjX3NldF9kYXRhLCAiVGhlIHJhdyBkYXRhIGluIHRoaXMgQUVEZXNjIn0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC04NjksNjEgKzg2OSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY190cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQUVEZXNjIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQUVEZXNjIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEFFRGVzY19Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEFFRGVzY09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBBRURlc2NfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChBRURlc2NPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQUVEZXNjX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEFFRGVzY19UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9BRS5BRURlc2MiLCAvKnRwX25hbWUqLwotCXNpemVvZihBRURlc2NPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBBRURlc2NfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQUVEZXNjX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBBRURlc2NfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEFFRGVzY19oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlBRURlc2NfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQUVEZXNjX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUFFRGVzY190cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQUVEZXNjX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUFFRGVzY190cF9uZXcsIC8qIHRwX25ldyAqLwotCUFFRGVzY190cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0FFLkFFRGVzYyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEFFRGVzY09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEFFRGVzY19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBBRURlc2NfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEFFRGVzY19yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQUVEZXNjX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEFFRGVzY19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBBRURlc2NfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQUVEZXNjX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBBRURlc2NfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQUVEZXNjX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQUVEZXNjX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQUVEZXNjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtOTMxLDQ1NSArOTMxLDQ1NSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFQ29lcmNlUHRyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JRGVzY1R5cGUgdG9UeXBlOwotCUFFRGVzYyByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBEZXNjVHlwZSB0b1R5cGU7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVDb2VyY2VQdHIKLQlQeU1hY19QUkVDSEVDSyhBRUNvZXJjZVB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDb2VyY2VQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzI08mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRvVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFQ29lcmNlUHRyKHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgdG9UeXBlLAotCSAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzI08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRvVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFQ29lcmNlUHRyKHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgdG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVDcmVhdGVEZXNjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIEFFRGVzYyByZXN1bHQ7CiAjaWZuZGVmIEFFQ3JlYXRlRGVzYwotCVB5TWFjX1BSRUNIRUNLKEFFQ3JlYXRlRGVzYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVEZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFQ3JlYXRlRGVzYyh0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFQ3JlYXRlRGVzYyh0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFQ3JlYXRlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQljaGFyICpmYWN0b3JpbmdQdHJfX2luX187Ci0JbG9uZyBmYWN0b3JpbmdQdHJfX2xlbl9fOwotCWludCBmYWN0b3JpbmdQdHJfX2luX2xlbl9fOwotCUJvb2xlYW4gaXNSZWNvcmQ7Ci0JQUVEZXNjTGlzdCByZXN1bHRMaXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGNoYXIgKmZhY3RvcmluZ1B0cl9faW5fXzsKKyAgICBsb25nIGZhY3RvcmluZ1B0cl9fbGVuX187CisgICAgaW50IGZhY3RvcmluZ1B0cl9faW5fbGVuX187CisgICAgQm9vbGVhbiBpc1JlY29yZDsKKyAgICBBRURlc2NMaXN0IHJlc3VsdExpc3Q7CiAjaWZuZGVmIEFFQ3JlYXRlTGlzdAotCVB5TWFjX1BSRUNIRUNLKEFFQ3JlYXRlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYWN0b3JpbmdQdHJfX2luX18sICZmYWN0b3JpbmdQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNSZWNvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlmYWN0b3JpbmdQdHJfX2xlbl9fID0gZmFjdG9yaW5nUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVDcmVhdGVMaXN0KGZhY3RvcmluZ1B0cl9faW5fXywgZmFjdG9yaW5nUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgIGlzUmVjb3JkLAotCSAgICAgICAgICAgICAgICAgICAgJnJlc3VsdExpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0TGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY3RvcmluZ1B0cl9faW5fXywgJmZhY3RvcmluZ1B0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1JlY29yZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZhY3RvcmluZ1B0cl9fbGVuX18gPSBmYWN0b3JpbmdQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBRUNyZWF0ZUxpc3QoZmFjdG9yaW5nUHRyX19pbl9fLCBmYWN0b3JpbmdQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0TGlzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRMaXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUNyZWF0ZUFwcGxlRXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKLQlBRUV2ZW50SUQgdGhlQUVFdmVudElEOwotCUFFQWRkcmVzc0Rlc2MgdGFyZ2V0OwotCUFFUmV0dXJuSUQgcmV0dXJuSUQ7Ci0JQUVUcmFuc2FjdGlvbklEIHRyYW5zYWN0aW9uSUQ7Ci0JQXBwbGVFdmVudCByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKKyAgICBBRUV2ZW50SUQgdGhlQUVFdmVudElEOworICAgIEFFQWRkcmVzc0Rlc2MgdGFyZ2V0OworICAgIEFFUmV0dXJuSUQgcmV0dXJuSUQ7CisgICAgQUVUcmFuc2FjdGlvbklEIHRyYW5zYWN0aW9uSUQ7CisgICAgQXBwbGVFdmVudCByZXN1bHQ7CiAjaWZuZGVmIEFFQ3JlYXRlQXBwbGVFdmVudAotCVB5TWFjX1BSRUNIRUNLKEFFQ3JlYXRlQXBwbGVFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVBcHBsZUV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmV0dXJuSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2FjdGlvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFQ3JlYXRlQXBwbGVFdmVudCh0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dXJuSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2FjdGlvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFQ3JlYXRlQXBwbGVFdmVudCh0aGVBRUV2ZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFUmVwbGFjZURlc2NEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JQUVEZXNjIHRoZUFFRGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIEFFRGVzYyB0aGVBRURlc2M7CiAjaWZuZGVmIEFFUmVwbGFjZURlc2NEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soQUVSZXBsYWNlRGVzY0RhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUmVwbGFjZURlc2NEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFUmVwbGFjZURlc2NEYXRhKHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFFRGVzYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVBRURlc2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFUmVwbGFjZURlc2NEYXRhKHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFFRGVzYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVBRURlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFUHJvY2Vzc0FwcGxlRXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnRSZWNvcmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnRSZWNvcmQ7CiAjaWZuZGVmIEFFUHJvY2Vzc0FwcGxlRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRVByb2Nlc3NBcHBsZUV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVByb2Nlc3NBcHBsZUV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZ0aGVFdmVudFJlY29yZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVByb2Nlc3NBcHBsZUV2ZW50KCZ0aGVFdmVudFJlY29yZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50UmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFUHJvY2Vzc0FwcGxlRXZlbnQoJnRoZUV2ZW50UmVjb3JkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUdldEludGVyYWN0aW9uQWxsb3dlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUludGVyYWN0QWxsb3dlZCBsZXZlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUludGVyYWN0QWxsb3dlZCBsZXZlbDsKICNpZm5kZWYgQUVHZXRJbnRlcmFjdGlvbkFsbG93ZWQKLQlQeU1hY19QUkVDSEVDSyhBRUdldEludGVyYWN0aW9uQWxsb3dlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXRJbnRlcmFjdGlvbkFsbG93ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUdldEludGVyYWN0aW9uQWxsb3dlZCgmbGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFR2V0SW50ZXJhY3Rpb25BbGxvd2VkKCZsZXZlbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFSW50ZXJhY3RBbGxvd2VkIGxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFSW50ZXJhY3RBbGxvd2VkIGxldmVsOwogI2lmbmRlZiBBRVNldEludGVyYWN0aW9uQWxsb3dlZAotCVB5TWFjX1BSRUNIRUNLKEFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVNldEludGVyYWN0aW9uQWxsb3dlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKGxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKGxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUludGVyYWN0V2l0aFVzZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyB0aW1lT3V0SW5UaWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIHRpbWVPdXRJblRpY2tzOwogI2lmbmRlZiBBRUludGVyYWN0V2l0aFVzZXIKLQlQeU1hY19QUkVDSEVDSyhBRUludGVyYWN0V2l0aFVzZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFSW50ZXJhY3RXaXRoVXNlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWVPdXRJblRpY2tzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFSW50ZXJhY3RXaXRoVXNlcih0aW1lT3V0SW5UaWNrcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIChOTVJlY1B0cikwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0FFSWRsZVByb2MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZU91dEluVGlja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVJbnRlcmFjdFdpdGhVc2VyKHRpbWVPdXRJblRpY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5NUmVjUHRyKTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBfQUVJZGxlUHJvYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVJbnN0YWxsRXZlbnRIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3M7Ci0JQUVFdmVudElEIHRoZUFFRXZlbnRJRDsKLQlBRUV2ZW50SGFuZGxlclVQUCBoYW5kbGVyX19wcm9jX18gPSB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlcjsKLQlQeU9iamVjdCAqaGFuZGxlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOworICAgIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7CisgICAgQUVFdmVudEhhbmRsZXJVUFAgaGFuZGxlcl9fcHJvY19fID0gdXBwX0dlbmVyaWNFdmVudEhhbmRsZXI7CisgICAgUHlPYmplY3QgKmhhbmRsZXI7CiAjaWZuZGVmIEFFSW5zdGFsbEV2ZW50SGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEFFSW5zdGFsbEV2ZW50SGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVJbnN0YWxsRXZlbnRIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcih0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyX19wcm9jX18sIChTUmVmQ29uKWhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYoaGFuZGxlcik7IC8qIFhYWCBsZWFrLCBidXQgbmVlZGVkICovCi0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFRXZlbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKHRoZUFFRXZlbnRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFRXZlbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfX3Byb2NfXywgKFNSZWZDb24paGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihoYW5kbGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRVJlbW92ZUV2ZW50SGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOwotCUFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKKyAgICBBRUV2ZW50SUQgdGhlQUVFdmVudElEOwogI2lmbmRlZiBBRVJlbW92ZUV2ZW50SGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEFFUmVtb3ZlRXZlbnRIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVJlbW92ZUV2ZW50SGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVSZW1vdmVFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVSZW1vdmVFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUdldEV2ZW50SGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOwotCUFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7Ci0JQUVFdmVudEhhbmRsZXJVUFAgaGFuZGxlcl9fcHJvY19fID0gdXBwX0dlbmVyaWNFdmVudEhhbmRsZXI7Ci0JUHlPYmplY3QgKmhhbmRsZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKKyAgICBBRUV2ZW50SUQgdGhlQUVFdmVudElEOworICAgIEFFRXZlbnRIYW5kbGVyVVBQIGhhbmRsZXJfX3Byb2NfXyA9IHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyOworICAgIFB5T2JqZWN0ICpoYW5kbGVyOwogI2lmbmRlZiBBRUdldEV2ZW50SGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEFFR2V0RXZlbnRIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldEV2ZW50SGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVHZXRFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVyX19wcm9jX18sIChTUmVmQ29uICopJmhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLAotCSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIpOwotCVB5X0lOQ1JFRihoYW5kbGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVHZXRFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVyX19wcm9jX18sIChTUmVmQ29uICopJmhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIpOworICAgIFB5X0lOQ1JFRihoYW5kbGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUluc3RhbGxTcGVjaWFsSGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgZnVuY3Rpb25DbGFzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgZnVuY3Rpb25DbGFzczsKICNpZm5kZWYgQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhBRUluc3RhbGxTcGVjaWFsSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmdW5jdGlvbkNsYXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFSW5zdGFsbFNwZWNpYWxIYW5kbGVyKGZ1bmN0aW9uQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZ1bmN0aW9uQ2xhc3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIoZnVuY3Rpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFUmVtb3ZlU3BlY2lhbEhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIGZ1bmN0aW9uQ2xhc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIGZ1bmN0aW9uQ2xhc3M7CiAjaWZuZGVmIEFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhBRVJlbW92ZVNwZWNpYWxIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVJlbW92ZVNwZWNpYWxIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZnVuY3Rpb25DbGFzcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVJlbW92ZVNwZWNpYWxIYW5kbGVyKGZ1bmN0aW9uQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmdW5jdGlvbkNsYXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIoZnVuY3Rpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRU1hbmFnZXJJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCBrZXlXb3JkOwotCWxvbmcgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCBrZXlXb3JkOworICAgIGxvbmcgcmVzdWx0OwogI2lmbmRlZiBBRU1hbmFnZXJJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soQUVNYW5hZ2VySW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVNYW5hZ2VySW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmtleVdvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVNYW5hZ2VySW5mbyhrZXlXb3JkLAotCSAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZrZXlXb3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFTWFuYWdlckluZm8oa2V5V29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFT2JqZWN0SW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQUVPYmplY3RJbml0Ci0JUHlNYWNfUFJFQ0hFQ0soQUVPYmplY3RJbml0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRU9iamVjdEluaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRU9iamVjdEluaXQoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFT2JqZWN0SW5pdCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFRGlzcG9zZVRva2VuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRGVzYyB0aGVUb2tlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRURlc2MgdGhlVG9rZW47CiAjaWZuZGVmIEFFRGlzcG9zZVRva2VuCi0JUHlNYWNfUFJFQ0hFQ0soQUVEaXNwb3NlVG9rZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEFFRGlzcG9zZVRva2VuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVEaXNwb3NlVG9rZW4oJnRoZVRva2VuKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnRoZVRva2VuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFRGlzcG9zZVRva2VuKCZ0aGVUb2tlbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVUb2tlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVDYWxsT2JqZWN0QWNjZXNzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRGVzY1R5cGUgZGVzaXJlZENsYXNzOwotCUFFRGVzYyBjb250YWluZXJUb2tlbjsKLQlEZXNjVHlwZSBjb250YWluZXJDbGFzczsKLQlEZXNjVHlwZSBrZXlGb3JtOwotCUFFRGVzYyBrZXlEYXRhOwotCUFFRGVzYyB0b2tlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSBkZXNpcmVkQ2xhc3M7CisgICAgQUVEZXNjIGNvbnRhaW5lclRva2VuOworICAgIERlc2NUeXBlIGNvbnRhaW5lckNsYXNzOworICAgIERlc2NUeXBlIGtleUZvcm07CisgICAgQUVEZXNjIGtleURhdGE7CisgICAgQUVEZXNjIHRva2VuOwogI2lmbmRlZiBBRUNhbGxPYmplY3RBY2Nlc3NvcgotCVB5TWFjX1BSRUNIRUNLKEFFQ2FsbE9iamVjdEFjY2Vzc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNhbGxPYmplY3RBY2Nlc3Nvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJmNvbnRhaW5lclRva2VuLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb250YWluZXJDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2V5Rm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZrZXlEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFQ2FsbE9iamVjdEFjY2Vzc29yKGRlc2lyZWRDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lclRva2VuLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Rm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleURhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b2tlbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0b2tlbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZjb250YWluZXJUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29udGFpbmVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmtleUZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAma2V5RGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUNhbGxPYmplY3RBY2Nlc3NvcihkZXNpcmVkQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXJUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9rZW4pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmdG9rZW4pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQUVfbWV0aG9kc1tdID0gewotCXsiQUVDb2VyY2VQdHIiLCAoUHlDRnVuY3Rpb24pQUVfQUVDb2VyY2VQdHIsIDEsCi0JIFB5RG9jX1NUUigiKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0ciwgRGVzY1R5cGUgdG9UeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCi0JeyJBRUNyZWF0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVfQUVDcmVhdGVEZXNjLCAxLAotCSBQeURvY19TVFIoIihEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKLQl7IkFFQ3JlYXRlTGlzdCIsIChQeUNGdW5jdGlvbilBRV9BRUNyZWF0ZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBmYWN0b3JpbmdQdHIsIEJvb2xlYW4gaXNSZWNvcmQpIC0+IChBRURlc2NMaXN0IHJlc3VsdExpc3QpIil9LAotCXsiQUVDcmVhdGVBcHBsZUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ3JlYXRlQXBwbGVFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCwgQUVBZGRyZXNzRGVzYyB0YXJnZXQsIEFFUmV0dXJuSUQgcmV0dXJuSUQsIEFFVHJhbnNhY3Rpb25JRCB0cmFuc2FjdGlvbklEKSAtPiAoQXBwbGVFdmVudCByZXN1bHQpIil9LAotCXsiQUVSZXBsYWNlRGVzY0RhdGEiLCAoUHlDRnVuY3Rpb24pQUVfQUVSZXBsYWNlRGVzY0RhdGEsIDEsCi0JIFB5RG9jX1NUUigiKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gKEFFRGVzYyB0aGVBRURlc2MpIil9LAotCXsiQUVQcm9jZXNzQXBwbGVFdmVudCIsIChQeUNGdW5jdGlvbilBRV9BRVByb2Nlc3NBcHBsZUV2ZW50LCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlY29yZCB0aGVFdmVudFJlY29yZCkgLT4gTm9uZSIpfSwKLQl7IkFFR2V0SW50ZXJhY3Rpb25BbGxvd2VkIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFR2V0SW50ZXJhY3Rpb25BbGxvd2VkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBRUludGVyYWN0QWxsb3dlZCBsZXZlbCkiKX0sCi0JeyJBRVNldEludGVyYWN0aW9uQWxsb3dlZCIsIChQeUNGdW5jdGlvbilBRV9BRVNldEludGVyYWN0aW9uQWxsb3dlZCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVJbnRlcmFjdEFsbG93ZWQgbGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJBRUludGVyYWN0V2l0aFVzZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVJbnRlcmFjdFdpdGhVc2VyLCAxLAotCSBQeURvY19TVFIoIihsb25nIHRpbWVPdXRJblRpY2tzKSAtPiBOb25lIil9LAotCXsiQUVJbnN0YWxsRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFSW5zdGFsbEV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCwgRXZlbnRIYW5kbGVyIGhhbmRsZXIpIC0+IE5vbmUiKX0sCi0JeyJBRVJlbW92ZUV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRVJlbW92ZUV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCkgLT4gTm9uZSIpfSwKLQl7IkFFR2V0RXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFR2V0RXZlbnRIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzLCBBRUV2ZW50SUQgdGhlQUVFdmVudElEKSAtPiAoRXZlbnRIYW5kbGVyIGhhbmRsZXIpIil9LAotCXsiQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCBmdW5jdGlvbkNsYXNzKSAtPiBOb25lIil9LAotCXsiQUVSZW1vdmVTcGVjaWFsSGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRVJlbW92ZVNwZWNpYWxIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgZnVuY3Rpb25DbGFzcykgLT4gTm9uZSIpfSwKLQl7IkFFTWFuYWdlckluZm8iLCAoUHlDRnVuY3Rpb24pQUVfQUVNYW5hZ2VySW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIGtleVdvcmQpIC0+IChsb25nIHJlc3VsdCkiKX0sCi0JeyJBRU9iamVjdEluaXQiLCAoUHlDRnVuY3Rpb24pQUVfQUVPYmplY3RJbml0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBRURpc3Bvc2VUb2tlbiIsIChQeUNGdW5jdGlvbilBRV9BRURpc3Bvc2VUb2tlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHRoZVRva2VuKSIpfSwKLQl7IkFFQ2FsbE9iamVjdEFjY2Vzc29yIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ2FsbE9iamVjdEFjY2Vzc29yLCAxLAotCSBQeURvY19TVFIoIihEZXNjVHlwZSBkZXNpcmVkQ2xhc3MsIEFFRGVzYyBjb250YWluZXJUb2tlbiwgRGVzY1R5cGUgY29udGFpbmVyQ2xhc3MsIERlc2NUeXBlIGtleUZvcm0sIEFFRGVzYyBrZXlEYXRhKSAtPiAoQUVEZXNjIHRva2VuKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkFFQ29lcmNlUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ29lcmNlUHRyLCAxLAorICAgICBQeURvY19TVFIoIihEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIsIERlc2NUeXBlIHRvVHlwZSkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAorICAgIHsiQUVDcmVhdGVEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ3JlYXRlRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRUNyZWF0ZUxpc3QiLCAoUHlDRnVuY3Rpb24pQUVfQUVDcmVhdGVMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgZmFjdG9yaW5nUHRyLCBCb29sZWFuIGlzUmVjb3JkKSAtPiAoQUVEZXNjTGlzdCByZXN1bHRMaXN0KSIpfSwKKyAgICB7IkFFQ3JlYXRlQXBwbGVFdmVudCIsIChQeUNGdW5jdGlvbilBRV9BRUNyZWF0ZUFwcGxlRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3MsIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQsIEFFQWRkcmVzc0Rlc2MgdGFyZ2V0LCBBRVJldHVybklEIHJldHVybklELCBBRVRyYW5zYWN0aW9uSUQgdHJhbnNhY3Rpb25JRCkgLT4gKEFwcGxlRXZlbnQgcmVzdWx0KSIpfSwKKyAgICB7IkFFUmVwbGFjZURlc2NEYXRhIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFUmVwbGFjZURlc2NEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChBRURlc2MgdGhlQUVEZXNjKSIpfSwKKyAgICB7IkFFUHJvY2Vzc0FwcGxlRXZlbnQiLCAoUHlDRnVuY3Rpb24pQUVfQUVQcm9jZXNzQXBwbGVFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnRSZWNvcmQpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldEludGVyYWN0aW9uQWxsb3dlZCIsIChQeUNGdW5jdGlvbilBRV9BRUdldEludGVyYWN0aW9uQWxsb3dlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVJbnRlcmFjdEFsbG93ZWQgbGV2ZWwpIil9LAorICAgIHsiQUVTZXRJbnRlcmFjdGlvbkFsbG93ZWQiLCAoUHlDRnVuY3Rpb24pQUVfQUVTZXRJbnRlcmFjdGlvbkFsbG93ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFSW50ZXJhY3RBbGxvd2VkIGxldmVsKSAtPiBOb25lIil9LAorICAgIHsiQUVJbnRlcmFjdFdpdGhVc2VyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFSW50ZXJhY3RXaXRoVXNlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyB0aW1lT3V0SW5UaWNrcykgLT4gTm9uZSIpfSwKKyAgICB7IkFFSW5zdGFsbEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRUluc3RhbGxFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3MsIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQsIEV2ZW50SGFuZGxlciBoYW5kbGVyKSAtPiBOb25lIil9LAorICAgIHsiQUVSZW1vdmVFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVSZW1vdmVFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3MsIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRUdldEV2ZW50SGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCkgLT4gKEV2ZW50SGFuZGxlciBoYW5kbGVyKSIpfSwKKyAgICB7IkFFSW5zdGFsbFNwZWNpYWxIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFSW5zdGFsbFNwZWNpYWxIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgZnVuY3Rpb25DbGFzcykgLT4gTm9uZSIpfSwKKyAgICB7IkFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVSZW1vdmVTcGVjaWFsSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIGZ1bmN0aW9uQ2xhc3MpIC0+IE5vbmUiKX0sCisgICAgeyJBRU1hbmFnZXJJbmZvIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFTWFuYWdlckluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCBrZXlXb3JkKSAtPiAobG9uZyByZXN1bHQpIil9LAorICAgIHsiQUVPYmplY3RJbml0IiwgKFB5Q0Z1bmN0aW9uKUFFX0FFT2JqZWN0SW5pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQUVEaXNwb3NlVG9rZW4iLCAoUHlDRnVuY3Rpb24pQUVfQUVEaXNwb3NlVG9rZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyB0aGVUb2tlbikiKX0sCisgICAgeyJBRUNhbGxPYmplY3RBY2Nlc3NvciIsIChQeUNGdW5jdGlvbilBRV9BRUNhbGxPYmplY3RBY2Nlc3NvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGVzY1R5cGUgZGVzaXJlZENsYXNzLCBBRURlc2MgY29udGFpbmVyVG9rZW4sIERlc2NUeXBlIGNvbnRhaW5lckNsYXNzLCBEZXNjVHlwZSBrZXlGb3JtLCBBRURlc2Mga2V5RGF0YSkgLT4gKEFFRGVzYyB0b2tlbikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTEzODcsNzIgKzEzODcsNzIgQEAKIHN0YXRpYyBwYXNjYWwgT1NFcnIKIEdlbmVyaWNFdmVudEhhbmRsZXIoY29uc3QgQXBwbGVFdmVudCAqcmVxdWVzdCwgQXBwbGVFdmVudCAqcmVwbHksIHJlZmNvbnR5cGUgcmVmY29uKQogewotICAgICAgICBQeU9iamVjdCAqaGFuZGxlciA9IChQeU9iamVjdCAqKXJlZmNvbjsKLSAgICAgICAgQUVEZXNjT2JqZWN0ICpyZXF1ZXN0T2JqZWN0LCAqcmVwbHlPYmplY3Q7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOwotICAgICAgICBpZiAoKHJlcXVlc3RPYmplY3QgPSAoQUVEZXNjT2JqZWN0ICopQUVEZXNjX05ldygoQXBwbGVFdmVudCAqKXJlcXVlc3QpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgocmVwbHlPYmplY3QgPSAoQUVEZXNjT2JqZWN0ICopQUVEZXNjX05ldyhyZXBseSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVxdWVzdE9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoYXJncyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgcmVxdWVzdE9iamVjdCwgcmVwbHlPYmplY3QpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcXVlc3RPYmplY3QpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXBseU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGhhbmRsZXIsIGFyZ3MpOwotICAgICAgICByZXF1ZXN0T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7Ci0gICAgICAgIHJlcXVlc3RPYmplY3QtPm9iX2l0c2VsZi5kYXRhSGFuZGxlID0gTlVMTDsKLSAgICAgICAgcmVwbHlPYmplY3QtPm9iX2l0c2VsZi5kZXNjcmlwdG9yVHlwZSA9ICdudWxsJzsKLSAgICAgICAgcmVwbHlPYmplY3QtPm9iX2l0c2VsZi5kYXRhSGFuZGxlID0gTlVMTDsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIEFFIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiIpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gbm9FcnI7CisgICAgUHlPYmplY3QgKmhhbmRsZXIgPSAoUHlPYmplY3QgKilyZWZjb247CisgICAgQUVEZXNjT2JqZWN0ICpyZXF1ZXN0T2JqZWN0LCAqcmVwbHlPYmplY3Q7CisgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgaWYgKChyZXF1ZXN0T2JqZWN0ID0gKEFFRGVzY09iamVjdCAqKUFFRGVzY19OZXcoKEFwcGxlRXZlbnQgKilyZXF1ZXN0KSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgocmVwbHlPYmplY3QgPSAoQUVEZXNjT2JqZWN0ICopQUVEZXNjX05ldyhyZXBseSkpID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcXVlc3RPYmplY3QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoYXJncyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgcmVxdWVzdE9iamVjdCwgcmVwbHlPYmplY3QpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXF1ZXN0T2JqZWN0KTsKKyAgICAgICAgUHlfREVDUkVGKHJlcGx5T2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChoYW5kbGVyLCBhcmdzKTsKKyAgICByZXF1ZXN0T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7CisgICAgcmVxdWVzdE9iamVjdC0+b2JfaXRzZWxmLmRhdGFIYW5kbGUgPSBOVUxMOworICAgIHJlcGx5T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7CisgICAgcmVwbHlPYmplY3QtPm9iX2l0c2VsZi5kYXRhSGFuZGxlID0gTlVMTDsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gQUUgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIG5vRXJyOwogfQogCiBQeU9iamVjdCAqQUVEZXNjX05ld0JvcnJvd2VkKEFFRGVzYyAqaXRzZWxmKQogewotICAgICAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKml0OwogCi0gICAgICAgIGl0ID0gQUVEZXNjX05ldyhpdHNlbGYpOwotICAgICAgICBpZiAoaXQpCi0gICAgICAgICAgICAgICAgKChBRURlc2NPYmplY3QgKilpdCktPm9iX293bmVkID0gMDsKLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGl0ID0gQUVEZXNjX05ldyhpdHNlbGYpOworICAgIGlmIChpdCkKKyAgICAgICAgKChBRURlc2NPYmplY3QgKilpdCktPm9iX293bmVkID0gMDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIAogCiB2b2lkIGluaXRfQUUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAotICAgICAgICB1cHBfQUVJZGxlUHJvYyA9IE5ld0FFSWRsZVVQUChBRUlkbGVQcm9jKTsKLSAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIgPSBOZXdBRUV2ZW50SGFuZGxlclVQUChHZW5lcmljRXZlbnRIYW5kbGVyKTsKLSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXcpOwotICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhBRURlc2MgKiwgQUVEZXNjX05ld0JvcnJvd2VkKTsKLSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEFFRGVzYywgQUVEZXNjX0NvbnZlcnQpOworICAgIHVwcF9BRUlkbGVQcm9jID0gTmV3QUVJZGxlVVBQKEFFSWRsZVByb2MpOworICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyID0gTmV3QUVFdmVudEhhbmRsZXJVUFAoR2VuZXJpY0V2ZW50SGFuZGxlcik7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEFFRGVzYyAqLCBBRURlc2NfTmV3Qm9ycm93ZWQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChBRURlc2MsIEFFRGVzY19Db252ZXJ0KTsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQUUiLCBBRV9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlBRV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEFFX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQUVfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlBRURlc2NfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkFFRGVzY19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkFFRGVzY19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFFRGVzYyIsIChQeU9iamVjdCAqKSZBRURlc2NfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZBRURlc2NfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBRURlc2NUeXBlIiwgKFB5T2JqZWN0ICopJkFFRGVzY19UeXBlKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0FFIiwgQUVfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQUVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChBRV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEFFX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgQUVEZXNjX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZBRURlc2NfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZBRURlc2NfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBRURlc2MiLCAoUHlPYmplY3QgKikmQUVEZXNjX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQUVEZXNjX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQUVEZXNjVHlwZSIsIChQeU9iamVjdCAqKSZBRURlc2NfVHlwZSk7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQUUgPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYWgvX0FIbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9haC9fQUhtb2R1bGUuYwppbmRleCAxNjBhODQ1Li43M2FiNDM3IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9haC9fQUhtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9haC9fQUhtb2R1bGUuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDEwMyArMjIsMTAzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQWhfQUhTZWFyY2goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgYm9va25hbWU7Ci0JQ0ZTdHJpbmdSZWYgcXVlcnk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnF1ZXJ5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFIU2VhcmNoKGJvb2tuYW1lLAotCSAgICAgICAgICAgICAgICBxdWVyeSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgYm9va25hbWU7CisgICAgQ0ZTdHJpbmdSZWYgcXVlcnk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnF1ZXJ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFIU2VhcmNoKGJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICBxdWVyeSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWhfQUhHb3RvTWFpblRPQyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlBSFRPQ1R5cGUgdG9jdHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvY3R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUhHb3RvTWFpblRPQyh0b2N0eXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBBSFRPQ1R5cGUgdG9jdHlwZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvY3R5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUhHb3RvTWFpblRPQyh0b2N0eXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBaF9BSEdvdG9QYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGJvb2tuYW1lOwotCUNGU3RyaW5nUmVmIHBhdGg7Ci0JQ0ZTdHJpbmdSZWYgYW5jaG9yOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhbmNob3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUhHb3RvUGFnZShib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICBwYXRoLAotCSAgICAgICAgICAgICAgICAgIGFuY2hvcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgYm9va25hbWU7CisgICAgQ0ZTdHJpbmdSZWYgcGF0aDsKKyAgICBDRlN0cmluZ1JlZiBhbmNob3I7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFuY2hvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBSEdvdG9QYWdlKGJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBaF9BSExvb2t1cEFuY2hvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBib29rbmFtZTsKLQlDRlN0cmluZ1JlZiBhbmNob3I7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFuY2hvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBSExvb2t1cEFuY2hvcihib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBib29rbmFtZTsKKyAgICBDRlN0cmluZ1JlZiBhbmNob3I7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFuY2hvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBSExvb2t1cEFuY2hvcihib29rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBaF9BSFJlZ2lzdGVySGVscEJvb2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNSZWYgYXBwQnVuZGxlUmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZhcHBCdW5kbGVSZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUhSZWdpc3RlckhlbHBCb29rKCZhcHBCdW5kbGVSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIGFwcEJ1bmRsZVJlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmYXBwQnVuZGxlUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFIUmVnaXN0ZXJIZWxwQm9vaygmYXBwQnVuZGxlUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEFoX21ldGhvZHNbXSA9IHsKLQl7IkFIU2VhcmNoIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIU2VhcmNoLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBib29rbmFtZSwgQ0ZTdHJpbmdSZWYgcXVlcnkpIC0+IE5vbmUiKX0sCi0JeyJBSEdvdG9NYWluVE9DIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIR290b01haW5UT0MsIDEsCi0JIFB5RG9jX1NUUigiKEFIVE9DVHlwZSB0b2N0eXBlKSAtPiBOb25lIil9LAotCXsiQUhHb3RvUGFnZSIsIChQeUNGdW5jdGlvbilBaF9BSEdvdG9QYWdlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBib29rbmFtZSwgQ0ZTdHJpbmdSZWYgcGF0aCwgQ0ZTdHJpbmdSZWYgYW5jaG9yKSAtPiBOb25lIil9LAotCXsiQUhMb29rdXBBbmNob3IiLCAoUHlDRnVuY3Rpb24pQWhfQUhMb29rdXBBbmNob3IsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGJvb2tuYW1lLCBDRlN0cmluZ1JlZiBhbmNob3IpIC0+IE5vbmUiKX0sCi0JeyJBSFJlZ2lzdGVySGVscEJvb2siLCAoUHlDRnVuY3Rpb24pQWhfQUhSZWdpc3RlckhlbHBCb29rLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBhcHBCdW5kbGVSZWYpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJBSFNlYXJjaCIsIChQeUNGdW5jdGlvbilBaF9BSFNlYXJjaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYm9va25hbWUsIENGU3RyaW5nUmVmIHF1ZXJ5KSAtPiBOb25lIil9LAorICAgIHsiQUhHb3RvTWFpblRPQyIsIChQeUNGdW5jdGlvbilBaF9BSEdvdG9NYWluVE9DLCAxLAorICAgICBQeURvY19TVFIoIihBSFRPQ1R5cGUgdG9jdHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkFIR290b1BhZ2UiLCAoUHlDRnVuY3Rpb24pQWhfQUhHb3RvUGFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYm9va25hbWUsIENGU3RyaW5nUmVmIHBhdGgsIENGU3RyaW5nUmVmIGFuY2hvcikgLT4gTm9uZSIpfSwKKyAgICB7IkFITG9va3VwQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKUFoX0FITG9va3VwQW5jaG9yLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBib29rbmFtZSwgQ0ZTdHJpbmdSZWYgYW5jaG9yKSAtPiBOb25lIil9LAorICAgIHsiQUhSZWdpc3RlckhlbHBCb29rIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIUmVnaXN0ZXJIZWxwQm9vaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgYXBwQnVuZGxlUmVmKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0xMjYsMTggKzEyNiwxOCBAQAogCiB2b2lkIGluaXRfQUgodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQUgiLCBBaF9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlBaF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEFoX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQWhfRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0FIIiwgQWhfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQWhfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChBaF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEFoX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQUggPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYXBwL19BcHBtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2FwcC9fQXBwbW9kdWxlLmMKaW5kZXggNTJkMTdmNS4uYzc5MTgwNyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvYXBwL19BcHBtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9hcHAvX0FwcG1vZHVsZS5jCkBAIC00LDE2ICs0LDE2IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKICNpZm5kZWYgX19MUDY0X18KLQkvKiBDYXJib24gR1VJIHN0dWZmLCBub3QgYXZhaWxhYmxlIGluIDY0LWJpdCBtb2RlICovCisgICAgLyogQ2FyYm9uIEdVSSBzdHVmZiwgbm90IGF2YWlsYWJsZSBpbiA2NC1iaXQgbW9kZSAqLwogCiAKICNpbmNsdWRlICJweW1hY3Rvb2xib3guaCIKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDcgKzIyLDcgQEAKIAogc3RhdGljIGludCBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRoZW1lQnV0dG9uRHJhd0luZm8gKnBfaXRzZWxmKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihpSEgpIiwgJnBfaXRzZWxmLT5zdGF0ZSwgJnBfaXRzZWxmLT52YWx1ZSwgJnBfaXRzZWxmLT5hZG9ybm1lbnQpOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGlISCkiLCAmcF9pdHNlbGYtPnN0YXRlLCAmcF9pdHNlbGYtPnZhbHVlLCAmcF9pdHNlbGYtPmFkb3JubWVudCk7CiB9CiAKIApAQCAtMzUsNzUgKzM1LDc1IEBACiAjZGVmaW5lIFRoZW1lRHJhd2luZ1N0YXRlT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVRoZW1lRHJhd2luZ1N0YXRlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgVGhlbWVEcmF3aW5nU3RhdGUgb2JfaXRzZWxmOwogfSBUaGVtZURyYXdpbmdTdGF0ZU9iamVjdDsKIAogUHlPYmplY3QgKlRoZW1lRHJhd2luZ1N0YXRlT2JqX05ldyhUaGVtZURyYXdpbmdTdGF0ZSBpdHNlbGYpCiB7Ci0JVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0LCAmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCwgJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IFRoZW1lRHJhd2luZ1N0YXRlT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRoZW1lRHJhd2luZ1N0YXRlICpwX2l0c2VsZikKIHsKLQlpZiAoIVRoZW1lRHJhd2luZ1N0YXRlT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRoZW1lRHJhd2luZ1N0YXRlIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIVRoZW1lRHJhd2luZ1N0YXRlT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRoZW1lRHJhd2luZ1N0YXRlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgVGhlbWVEcmF3aW5nU3RhdGVPYmpfZGVhbGxvYyhUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGhlbWVEcmF3aW5nU3RhdGVPYmpfU2V0VGhlbWVEcmF3aW5nU3RhdGUoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9ydjsKLQlCb29sZWFuIGluRGlzcG9zZU5vdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX3J2OworICAgIEJvb2xlYW4gaW5EaXNwb3NlTm93OwogI2lmbmRlZiBTZXRUaGVtZURyYXdpbmdTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKFNldFRoZW1lRHJhd2luZ1N0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaGVtZURyYXdpbmdTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGlzcG9zZU5vdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNldFRoZW1lRHJhd2luZ1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EaXNwb3NlTm93KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGlzcG9zZU5vdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNldFRoZW1lRHJhd2luZ1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EaXNwb3NlTm93KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaGVtZURyYXdpbmdTdGF0ZU9ial9EaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX3J2OwogI2lmbmRlZiBEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VUaGVtZURyYXdpbmdTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGlzcG9zZVRoZW1lRHJhd2luZ1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUaGVtZURyYXdpbmdTdGF0ZU9ial9tZXRob2RzW10gPSB7Ci0JeyJTZXRUaGVtZURyYXdpbmdTdGF0ZSIsIChQeUNGdW5jdGlvbilUaGVtZURyYXdpbmdTdGF0ZU9ial9TZXRUaGVtZURyYXdpbmdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbkRpc3Bvc2VOb3cpIC0+IChPU1N0YXR1cyBfcnYpIil9LAotCXsiRGlzcG9zZVRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKVRoZW1lRHJhd2luZ1N0YXRlT2JqX0Rpc3Bvc2VUaGVtZURyYXdpbmdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoT1NTdGF0dXMgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlNldFRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKVRoZW1lRHJhd2luZ1N0YXRlT2JqX1NldFRoZW1lRHJhd2luZ1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluRGlzcG9zZU5vdykgLT4gKE9TU3RhdHVzIF9ydikiKX0sCisgICAgeyJEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUiLCAoUHlDRnVuY3Rpb24pVGhlbWVEcmF3aW5nU3RhdGVPYmpfRGlzcG9zZVRoZW1lRHJhd2luZ1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChPU1N0YXR1cyBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBUaGVtZURyYXdpbmdTdGF0ZU9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTEyMCw2MSArMTIwLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVRoZW1lRHJhd2luZ1N0YXRlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVGhlbWVEcmF3aW5nU3RhdGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVGhlbWVEcmF3aW5nU3RhdGVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUaGVtZURyYXdpbmdTdGF0ZU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFRoZW1lRHJhd2luZ1N0YXRlT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFRoZW1lRHJhd2luZ1N0YXRlX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0FwcC5UaGVtZURyYXdpbmdTdGF0ZSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgVGhlbWVEcmF3aW5nU3RhdGVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgVGhlbWVEcmF3aW5nU3RhdGVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFRoZW1lRHJhd2luZ1N0YXRlT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBUaGVtZURyYXdpbmdTdGF0ZU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0FwcC5UaGVtZURyYXdpbmdTdGF0ZSIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgVGhlbWVEcmF3aW5nU3RhdGVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVGhlbWVEcmF3aW5nU3RhdGVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFRoZW1lRHJhd2luZ1N0YXRlT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBUaGVtZURyYXdpbmdTdGF0ZU9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRoZW1lRHJhd2luZ1N0YXRlIC0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE4MiwxNjIyICsxODIsMTYyMiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9SZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudAotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50Ci0JUHlNYWNfUFJFQ0hFQ0soVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lUGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lQnJ1c2ggaW5CcnVzaDsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluSXNDb2xvckRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUJydXNoIGluQnJ1c2g7CisgICAgU0ludDE2IGluRGVwdGg7CisgICAgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CiAjaWZuZGVmIFNldFRoZW1lUGVuCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVQZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRoZW1lUGVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUaGVtZVBlbihpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICBpbklzQ29sb3JEZXZpY2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUaGVtZVBlbihpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbklzQ29sb3JEZXZpY2UpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9TZXRUaGVtZUJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVCcnVzaCBpbkJydXNoOwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lQnJ1c2ggaW5CcnVzaDsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluSXNDb2xvckRldmljZTsKICNpZm5kZWYgU2V0VGhlbWVCYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVCYWNrZ3JvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaGVtZUJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRoZW1lQmFja2dyb3VuZChpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lQmFja2dyb3VuZChpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lVGV4dENvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lVGV4dENvbG9yIGluQ29sb3I7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVUZXh0Q29sb3IgaW5Db2xvcjsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluSXNDb2xvckRldmljZTsKICNpZm5kZWYgU2V0VGhlbWVUZXh0Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRUaGVtZVRleHRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVUZXh0Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRoZW1lVGV4dENvbG9yKGluQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lVGV4dENvbG9yKGluQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lV2luZG93QmFja2dyb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JVGhlbWVCcnVzaCBpbkJydXNoOwotCUJvb2xlYW4gaW5VcGRhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIFRoZW1lQnJ1c2ggaW5CcnVzaDsKKyAgICBCb29sZWFuIGluVXBkYXRlOwogI2lmbmRlZiBTZXRUaGVtZVdpbmRvd0JhY2tncm91bmQKLQlQeU1hY19QUkVDSEVDSyhTZXRUaGVtZVdpbmRvd0JhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRoZW1lV2luZG93QmFja2dyb3VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblVwZGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUaGVtZVdpbmRvd0JhY2tncm91bmQoaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5VcGRhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CcnVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXBkYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lV2luZG93QmFja2dyb3VuZChpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblVwZGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVdpbmRvd0hlYWRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVdpbmRvd0hlYWRlcgotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVdpbmRvd0hlYWRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lV2luZG93SGVhZGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVdpbmRvd0hlYWRlcigmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lV2luZG93SGVhZGVyKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lV2luZG93TGlzdFZpZXdIZWFkZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcgotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcigmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcigmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lUGxhY2FyZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVBsYWNhcmQKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVQbGFjYXJkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVQbGFjYXJkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVBsYWNhcmQoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVQbGFjYXJkKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZUVkaXRUZXh0RnJhbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVFZGl0VGV4dEZyYW1lCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lRWRpdFRleHRGcmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lRWRpdFRleHRGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVFZGl0VGV4dEZyYW1lKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lRWRpdFRleHRGcmFtZSgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVMaXN0Qm94RnJhbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVMaXN0Qm94RnJhbWUKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVMaXN0Qm94RnJhbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUxpc3RCb3hGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVMaXN0Qm94RnJhbWUoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZUxpc3RCb3hGcmFtZSgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZUZvY3VzUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlCb29sZWFuIGluSGFzRm9jdXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgQm9vbGVhbiBpbkhhc0ZvY3VzOwogI2lmbmRlZiBEcmF3VGhlbWVGb2N1c1JlY3QKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVGb2N1c1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUZvY3VzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IYXNGb2N1cykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVGb2N1c1JlY3QoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGFzRm9jdXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhhc0ZvY3VzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZUZvY3VzUmVjdCgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IYXNGb2N1cyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVByaW1hcnlHcm91cChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVByaW1hcnlHcm91cAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVByaW1hcnlHcm91cCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lUHJpbWFyeUdyb3VwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVByaW1hcnlHcm91cCgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lUHJpbWFyeUdyb3VwKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU2Vjb25kYXJ5R3JvdXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVTZWNvbmRhcnlHcm91cAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVNlY29uZGFyeUdyb3VwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU2VwYXJhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lU2VwYXJhdG9yCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU2VwYXJhdG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTZXBhcmF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lU2VwYXJhdG9yKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVTZXBhcmF0b3IoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZQotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lR2VuZXJpY1dlbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKLQlCb29sZWFuIGluRmlsbENlbnRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIEJvb2xlYW4gaW5GaWxsQ2VudGVyOwogI2lmbmRlZiBEcmF3VGhlbWVHZW5lcmljV2VsbAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUdlbmVyaWNXZWxsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVHZW5lcmljV2VsbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZpbGxDZW50ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lR2VuZXJpY1dlbGwoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GaWxsQ2VudGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZpbGxDZW50ZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lR2VuZXJpY1dlbGwoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GaWxsQ2VudGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lRm9jdXNSZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBpbkhhc0ZvY3VzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5IYXNGb2N1czsKICNpZm5kZWYgRHJhd1RoZW1lRm9jdXNSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVGb2N1c1JlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lRm9jdXNSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhhc0ZvY3VzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZUZvY3VzUmVnaW9uKChSZ25IYW5kbGUpMCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IYXNGb2N1cyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhhc0ZvY3VzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZUZvY3VzUmVnaW9uKChSZ25IYW5kbGUpMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IYXNGb2N1cyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0lzVGhlbWVJbkNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluSXNDb2xvckRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgU0ludDE2IGluRGVwdGg7CisgICAgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CiAjaWZuZGVmIElzVGhlbWVJbkNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soSXNUaGVtZUluQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKElzVGhlbWVJbkNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1RoZW1lSW5Db2xvcihpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVGhlbWVJbkNvbG9yKGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVBY2NlbnRDb2xvcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ1RhYkhhbmRsZSBvdXRDb2xvcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ1RhYkhhbmRsZSBvdXRDb2xvcnM7CiAjaWZuZGVmIEdldFRoZW1lQWNjZW50Q29sb3JzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVBY2NlbnRDb2xvcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQWNjZW50Q29sb3JzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVBY2NlbnRDb2xvcnMoJm91dENvbG9ycyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dENvbG9ycyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZUFjY2VudENvbG9ycygmb3V0Q29sb3JzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0Q29sb3JzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbkJvdW5kczsKLQlUaGVtZU1lbnVCYXJTdGF0ZSBpblN0YXRlOwotCVVJbnQzMiBpbkF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbkJvdW5kczsKKyAgICBUaGVtZU1lbnVCYXJTdGF0ZSBpblN0YXRlOworICAgIFVJbnQzMiBpbkF0dHJpYnV0ZXM7CiAjaWZuZGVmIERyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kKCZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVNZW51QmFyQmFja2dyb3VuZCgmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lTWVudUJhckhlaWdodChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0SGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNJbnQxNiBvdXRIZWlnaHQ7CiAjaWZuZGVmIEdldFRoZW1lTWVudUJhckhlaWdodAotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lTWVudUJhckhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51QmFySGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVNZW51QmFySGVpZ2h0KCZvdXRIZWlnaHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZU1lbnVCYXJIZWlnaHQoJm91dEhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lTWVudUJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbk1lbnVSZWN0OwotCVRoZW1lTWVudVR5cGUgaW5NZW51VHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluTWVudVJlY3Q7CisgICAgVGhlbWVNZW51VHlwZSBpbk1lbnVUeXBlOwogI2lmbmRlZiBEcmF3VGhlbWVNZW51QmFja2dyb3VuZAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVNZW51QmFja2dyb3VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5NZW51UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWVudVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lTWVudUJhY2tncm91bmQoJmluTWVudVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVudVR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbk1lbnVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NZW51VHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVNZW51QmFja2dyb3VuZCgmaW5NZW51UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZW51VHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbk1lbnVSZWN0OwotCVRoZW1lTWVudVR5cGUgbWVudVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbk1lbnVSZWN0OworICAgIFRoZW1lTWVudVR5cGUgbWVudVR5cGU7CiAjaWZuZGVmIEdldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbk1lbnVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVNZW51QmFja2dyb3VuZFJlZ2lvbigmaW5NZW51UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbk1lbnVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVNZW51QmFja2dyb3VuZFJlZ2lvbigmaW5NZW51UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVNZW51U2VwYXJhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5JdGVtUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluSXRlbVJlY3Q7CiAjaWZuZGVmIERyYXdUaGVtZU1lbnVTZXBhcmF0b3IKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVNZW51U2VwYXJhdG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVNZW51U2VwYXJhdG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluSXRlbVJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lTWVudVNlcGFyYXRvcigmaW5JdGVtUmVjdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5JdGVtUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVNZW51U2VwYXJhdG9yKCZpbkl0ZW1SZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNJbnQxNiBvdXRIZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IG91dEhlaWdodDsKICNpZm5kZWYgR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQoJm91dEhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCgmb3V0SGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWlnaHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZU1lbnVJdGVtRXh0cmEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVNZW51SXRlbVR5cGUgaW5JdGVtVHlwZTsKLQlTSW50MTYgb3V0SGVpZ2h0OwotCVNJbnQxNiBvdXRXaWR0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZU1lbnVJdGVtVHlwZSBpbkl0ZW1UeXBlOworICAgIFNJbnQxNiBvdXRIZWlnaHQ7CisgICAgU0ludDE2IG91dFdpZHRoOwogI2lmbmRlZiBHZXRUaGVtZU1lbnVJdGVtRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVJdGVtRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lTWVudUl0ZW1FeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVNZW51SXRlbUV4dHJhKGluSXRlbVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpZHRoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVNZW51SXRlbUV4dHJhKGluSXRlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpZHRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVNZW51VGl0bGVFeHRyYShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0V2lkdGg7Ci0JQm9vbGVhbiBpbklzU3F1aXNoZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IG91dFdpZHRoOworICAgIEJvb2xlYW4gaW5Jc1NxdWlzaGVkOwogI2lmbmRlZiBHZXRUaGVtZU1lbnVUaXRsZUV4dHJhCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51VGl0bGVFeHRyYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51VGl0bGVFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXNTcXVpc2hlZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1lbnVUaXRsZUV4dHJhKCZvdXRXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzU3F1aXNoZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNTcXVpc2hlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZU1lbnVUaXRsZUV4dHJhKCZvdXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzU3F1aXNoZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lVGFiUGFuZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVRhYlBhbmUKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVUYWJQYW5lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVUYWJQYW5lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVRhYlBhbmUoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVUYWJQYW5lKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lVGFiUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lVGFiU3R5bGUgaW5TdHlsZTsKLQlUaGVtZVRhYkRpcmVjdGlvbiBpbkRpcmVjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZVRhYlN0eWxlIGluU3R5bGU7CisgICAgVGhlbWVUYWJEaXJlY3Rpb24gaW5EaXJlY3Rpb247CiAjaWZuZGVmIEdldFRoZW1lVGFiUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUYWJSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGFiUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSEgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGlyZWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lVGFiUmVnaW9uKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGlyZWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lVGFiUmVnaW9uKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9TZXRUaGVtZUN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUN1cnNvciBpbkN1cnNvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUN1cnNvciBpbkN1cnNvcjsKICNpZm5kZWYgU2V0VGhlbWVDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRUaGVtZUN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkN1cnNvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUaGVtZUN1cnNvcihpbkN1cnNvcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkN1cnNvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUaGVtZUN1cnNvcihpbkN1cnNvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldEFuaW1hdGVkVGhlbWVDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVDdXJzb3IgaW5DdXJzb3I7Ci0JVUludDMyIGluQW5pbWF0aW9uU3RlcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUN1cnNvciBpbkN1cnNvcjsKKyAgICBVSW50MzIgaW5BbmltYXRpb25TdGVwOwogI2lmbmRlZiBTZXRBbmltYXRlZFRoZW1lQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QW5pbWF0ZWRUaGVtZUN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0QW5pbWF0ZWRUaGVtZUN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkN1cnNvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQW5pbWF0aW9uU3RlcCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRBbmltYXRlZFRoZW1lQ3Vyc29yKGluQ3Vyc29yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQW5pbWF0aW9uU3RlcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5DdXJzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFuaW1hdGlvblN0ZXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QW5pbWF0ZWRUaGVtZUN1cnNvcihpbkN1cnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkFuaW1hdGlvblN0ZXApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlIG91dFN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSBvdXRTdHlsZTsKICNpZm5kZWYgR2V0VGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUoJm91dFN0eWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUoJm91dFN0eWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZVNjcm9sbEJhckFycm93U3R5bGUgb3V0U3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlIG91dFN0eWxlOwogI2lmbmRlZiBHZXRUaGVtZVNjcm9sbEJhckFycm93U3R5bGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVNjcm9sbEJhckFycm93U3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSgmb3V0U3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSgmb3V0U3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0eWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVDaGVja0JveFN0eWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lQ2hlY2tCb3hTdHlsZSBvdXRTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUNoZWNrQm94U3R5bGUgb3V0U3R5bGU7CiAjaWZuZGVmIEdldFRoZW1lQ2hlY2tCb3hTdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQ2hlY2tCb3hTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVDaGVja0JveFN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVDaGVja0JveFN0eWxlKCZvdXRTdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVDaGVja0JveFN0eWxlKCZvdXRTdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9Vc2VUaGVtZUZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVGb250SUQgaW5Gb250SUQ7Ci0JU2NyaXB0Q29kZSBpblNjcmlwdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUZvbnRJRCBpbkZvbnRJRDsKKyAgICBTY3JpcHRDb2RlIGluU2NyaXB0OwogI2lmbmRlZiBVc2VUaGVtZUZvbnQKLQlQeU1hY19QUkVDSEVDSyhVc2VUaGVtZUZvbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVzZVRoZW1lRm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU2NyaXB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVzZVRoZW1lRm9udChpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgIGluU2NyaXB0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2NyaXB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVzZVRoZW1lRm9udChpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluU2NyaXB0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lVGV4dEJveChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKLQlUaGVtZUZvbnRJRCBpbkZvbnRJRDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCUJvb2xlYW4gaW5XcmFwVG9XaWR0aDsKLQlSZWN0IGluQm91bmRpbmdCb3g7Ci0JU0ludDE2IGluSnVzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBUaGVtZUZvbnRJRCBpbkZvbnRJRDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIEJvb2xlYW4gaW5XcmFwVG9XaWR0aDsKKyAgICBSZWN0IGluQm91bmRpbmdCb3g7CisgICAgU0ludDE2IGluSnVzdDsKICNpZm5kZWYgRHJhd1RoZW1lVGV4dEJveAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVRleHRCb3gpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVRleHRCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldyYXBUb1dpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZGluZ0JveCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSnVzdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVUZXh0Qm94KGluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5XcmFwVG9XaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZGluZ0JveCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkp1c3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldyYXBUb1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZGluZ0JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSnVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVUZXh0Qm94KGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XcmFwVG9XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZGluZ0JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkp1c3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1RydW5jYXRlVGhlbWVUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGTXV0YWJsZVN0cmluZ1JlZiBpblN0cmluZzsKLQlUaGVtZUZvbnRJRCBpbkZvbnRJRDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCVNJbnQxNiBpblBpeGVsV2lkdGhMaW1pdDsKLQlUcnVuY0NvZGUgaW5UcnVuY1doZXJlOwotCUJvb2xlYW4gb3V0VHJ1bmNhdGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGTXV0YWJsZVN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBUaGVtZUZvbnRJRCBpbkZvbnRJRDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFNJbnQxNiBpblBpeGVsV2lkdGhMaW1pdDsKKyAgICBUcnVuY0NvZGUgaW5UcnVuY1doZXJlOworICAgIEJvb2xlYW4gb3V0VHJ1bmNhdGVkOwogI2lmbmRlZiBUcnVuY2F0ZVRoZW1lVGV4dAotCVB5TWFjX1BSRUNIRUNLKFRydW5jYXRlVGhlbWVUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcnVuY2F0ZVRoZW1lVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhsaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QaXhlbFdpZHRoTGltaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRydW5jV2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJ1bmNhdGVUaGVtZVRleHQoaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblBpeGVsV2lkdGhMaW1pdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcnVuY1doZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VHJ1bmNhdGVkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRUcnVuY2F0ZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGxoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBpeGVsV2lkdGhMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVHJ1bmNXaGVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcnVuY2F0ZVRoZW1lVGV4dChpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGl4ZWxXaWR0aExpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRydW5jV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcnVuY2F0ZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFRydW5jYXRlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lVGV4dERpbWVuc2lvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7Ci0JVGhlbWVGb250SUQgaW5Gb250SUQ7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKLQlCb29sZWFuIGluV3JhcFRvV2lkdGg7Ci0JUG9pbnQgaW9Cb3VuZHM7Ci0JU0ludDE2IG91dEJhc2VsaW5lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluU3RyaW5nOworICAgIFRoZW1lRm9udElEIGluRm9udElEOworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgQm9vbGVhbiBpbldyYXBUb1dpZHRoOworICAgIFBvaW50IGlvQm91bmRzOworICAgIFNJbnQxNiBvdXRCYXNlbGluZTsKICNpZm5kZWYgR2V0VGhlbWVUZXh0RGltZW5zaW9ucwotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGV4dERpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGV4dERpbWVuc2lvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV3JhcFRvV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW9Cb3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVUZXh0RGltZW5zaW9ucyhpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV3JhcFRvV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCYXNlbGluZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBpb0JvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICBvdXRCYXNlbGluZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV3JhcFRvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW9Cb3VuZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVUZXh0RGltZW5zaW9ucyhpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV3JhcFRvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCYXNlbGluZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBpb0JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCYXNlbGluZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lVGV4dFNoYWRvd091dHNldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUZvbnRJRCBpbkZvbnRJRDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCVJlY3Qgb3V0T3V0c2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lRm9udElEIGluRm9udElEOworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUmVjdCBvdXRPdXRzZXQ7CiAjaWZuZGVmIEdldFRoZW1lVGV4dFNoYWRvd091dHNldAotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGV4dFNoYWRvd091dHNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVRleHRTaGFkb3dPdXRzZXQoaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE91dHNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dE91dHNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lVGV4dFNoYWRvd091dHNldChpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0T3V0c2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0T3V0c2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgYm91bmRzOwotCVRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZTsKLQlUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlOwotCUJvb2xlYW4gaXNIb3JpejsKLQlSZWN0IHRyYWNrQm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgYm91bmRzOworICAgIFRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZTsKKyAgICBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlOworICAgIEJvb2xlYW4gaXNIb3JpejsKKyAgICBSZWN0IHRyYWNrQm91bmRzOwogI2lmbmRlZiBEcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVNjcm9sbEJhckFycm93cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZXNzU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0hvcml6KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVNjcm9sbEJhckFycm93cygmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzc1N0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0hvcml6KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVNjcm9sbEJhckFycm93cygmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzc1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBib3VuZHM7Ci0JVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlOwotCVRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGU7Ci0JQm9vbGVhbiBpc0hvcml6OwotCVJlY3QgdHJhY2tCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlOworICAgIFRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGU7CisgICAgQm9vbGVhbiBpc0hvcml6OworICAgIFJlY3QgdHJhY2tCb3VuZHM7CiAjaWZuZGVmIEdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZVN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlc3NTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzSG9yaXopKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QoJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0hvcml6KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0KCZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzc1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tCb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0cmFja0JvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0hpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCBzY3JvbGxCYXJCb3VuZHM7Ci0JVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlOwotCVRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGU7Ci0JQm9vbGVhbiBpc0hvcml6OwotCVBvaW50IHB0SGl0OwotCVJlY3QgdHJhY2tCb3VuZHM7Ci0JQ29udHJvbFBhcnRDb2RlIHBhcnRjb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHNjcm9sbEJhckJvdW5kczsKKyAgICBUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGU7CisgICAgVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZTsKKyAgICBCb29sZWFuIGlzSG9yaXo7CisgICAgUG9pbnQgcHRIaXQ7CisgICAgUmVjdCB0cmFja0JvdW5kczsKKyAgICBDb250cm9sUGFydENvZGUgcGFydGNvZGU7CiAjaWZuZGVmIEhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cwotCVB5TWFjX1BSRUNIRUNLKEhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc2Nyb2xsQmFyQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVzc1N0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNIb3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdEhpdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cygmc2Nyb2xsQmFyQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc3NTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRIaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnRjb2RlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgIHBhcnRjb2RlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNjcm9sbEJhckJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc3NTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzSG9yaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHRIaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBIaXRUZXN0VGhlbWVTY3JvbGxCYXJBcnJvd3MoJnNjcm9sbEJhckJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSG9yaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0SGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tCb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0Y29kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0cmFja0JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0Y29kZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVNjcm9sbEJhckRlbGltaXRlcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVXaW5kb3dUeXBlIGZsYXZvcjsKLQlSZWN0IGluQ29udFJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7Ci0JVGhlbWVXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVXaW5kb3dUeXBlIGZsYXZvcjsKKyAgICBSZWN0IGluQ29udFJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgVGhlbWVXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CiAjaWZuZGVmIERyYXdUaGVtZVNjcm9sbEJhckRlbGltaXRlcnMKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQ29udFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lU2Nyb2xsQmFyRGVsaW1pdGVycyhmbGF2b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSE8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhdm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Db250UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzKGZsYXZvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lQnV0dG9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5Cb3VuZHM7Ci0JVUludDE2IGluS2luZDsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbzsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluUHJldkluZm87Ci0JVUludDMyIGluVXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbkJvdW5kczsKKyAgICBVSW50MTYgaW5LaW5kOworICAgIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5OZXdJbmZvOworICAgIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5QcmV2SW5mbzsKKyAgICBVSW50MzIgaW5Vc2VyRGF0YTsKICNpZm5kZWYgRHJhd1RoZW1lQnV0dG9uCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lQnV0dG9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVCdXR0b24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluTmV3SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0LCAmaW5QcmV2SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVXNlckRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lQnV0dG9uKCZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZpbk5ld0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAmaW5QcmV2SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5Vc2VyRGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluTmV3SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0LCAmaW5QcmV2SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXNlckRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lQnV0dG9uKCZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk5ld0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QcmV2SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Vc2VyRGF0YSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lQnV0dG9uUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5Cb3VuZHM7Ci0JVUludDE2IGluS2luZDsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluQm91bmRzOworICAgIFVJbnQxNiBpbktpbmQ7CisgICAgVGhlbWVCdXR0b25EcmF3SW5mbyBpbk5ld0luZm87CiAjaWZuZGVmIEdldFRoZW1lQnV0dG9uUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCdXR0b25SZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQnV0dG9uUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQsICZpbk5ld0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVCdXR0b25SZWdpb24oJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk5ld0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZ25IYW5kbGUpMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluTmV3SW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZUJ1dHRvblJlZ2lvbigmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTmV3SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJnbkhhbmRsZSkwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5Cb3VuZHM7Ci0JVUludDE2IGluS2luZDsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluRHJhd0luZm87Ci0JUmVjdCBvdXRCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbkJvdW5kczsKKyAgICBVSW50MTYgaW5LaW5kOworICAgIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbzsKKyAgICBSZWN0IG91dEJvdW5kczsKICNpZm5kZWYgR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluRHJhd0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKCZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluRHJhd0luZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKCZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluQm91bmRzOwotCVVJbnQxNiBpbktpbmQ7Ci0JVGhlbWVCdXR0b25EcmF3SW5mbyBpbkRyYXdJbmZvOwotCVJlY3Qgb3V0Qm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5Cb3VuZHM7CisgICAgVUludDE2IGluS2luZDsKKyAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluRHJhd0luZm87CisgICAgUmVjdCBvdXRCb3VuZHM7CiAjaWZuZGVmIEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQsICZpbkRyYXdJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcygmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EcmF3SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQsICZpbkRyYXdJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcygmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EcmF3SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRCb3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9QbGF5VGhlbWVTb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZVNvdW5kS2luZCBraW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lU291bmRLaW5kIGtpbmQ7CiAjaWZuZGVmIFBsYXlUaGVtZVNvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soUGxheVRoZW1lU291bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBsYXlUaGVtZVNvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2luZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbGF5VGhlbWVTb3VuZChraW5kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmtpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxheVRoZW1lU291bmQoa2luZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0JlZ2luVGhlbWVEcmFnU291bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVEcmFnU291bmRLaW5kIGtpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVEcmFnU291bmRLaW5kIGtpbmQ7CiAjaWZuZGVmIEJlZ2luVGhlbWVEcmFnU291bmQKLQlQeU1hY19QUkVDSEVDSyhCZWdpblRoZW1lRHJhZ1NvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCZWdpblRoZW1lRHJhZ1NvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2luZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBCZWdpblRoZW1lRHJhZ1NvdW5kKGtpbmQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2luZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCZWdpblRoZW1lRHJhZ1NvdW5kKGtpbmQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9FbmRUaGVtZURyYWdTb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgRW5kVGhlbWVEcmFnU291bmQKLQlQeU1hY19QUkVDSEVDSyhFbmRUaGVtZURyYWdTb3VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5kVGhlbWVEcmFnU291bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmRUaGVtZURyYWdTb3VuZCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRW5kVGhlbWVEcmFnU291bmQoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lVGlja01hcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBib3VuZHM7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVEcmF3U3RhdGUgc3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVRpY2tNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lVGlja01hcmspOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVRpY2tNYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVUaWNrTWFyaygmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVRpY2tNYXJrKCZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lQ2hhc2luZ0Fycm93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKLQlVSW50MzIgaW5kZXg7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7Ci0JVUludDMyIGVyYXNlRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBVSW50MzIgaW5kZXg7CisgICAgVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgVUludDMyIGVyYXNlRGF0YTsKICNpZm5kZWYgRHJhd1RoZW1lQ2hhc2luZ0Fycm93cwotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUNoYXNpbmdBcnJvd3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUNoYXNpbmdBcnJvd3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVyYXNlRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVDaGFzaW5nQXJyb3dzKCZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZURhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlcmFzZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lQ2hhc2luZ0Fycm93cygmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2VEYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lUG9wdXBBcnJvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKLQlUaGVtZUFycm93T3JpZW50YXRpb24gb3JpZW50YXRpb247Ci0JVGhlbWVQb3B1cEFycm93U2l6ZSBzaXplOwotCVRoZW1lRHJhd1N0YXRlIHN0YXRlOwotCVVJbnQzMiBlcmFzZURhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVBcnJvd09yaWVudGF0aW9uIG9yaWVudGF0aW9uOworICAgIFRoZW1lUG9wdXBBcnJvd1NpemUgc2l6ZTsKKyAgICBUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKKyAgICBVSW50MzIgZXJhc2VEYXRhOwogI2lmbmRlZiBEcmF3VGhlbWVQb3B1cEFycm93Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lUG9wdXBBcnJvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lUG9wdXBBcnJvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhIbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZlcmFzZURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lUG9wdXBBcnJvdygmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZURhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSEhsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyYXNlRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVQb3B1cEFycm93KCZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyYXNlRGF0YSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVN0YW5kYWxvbmVHcm93Qm94KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBvaW50IG9yaWdpbjsKLQlUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbjsKLQlCb29sZWFuIGlzU21hbGw7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgb3JpZ2luOworICAgIFRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uOworICAgIEJvb2xlYW4gaXNTbWFsbDsKKyAgICBUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm9yaWdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyb3dEaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpc1NtYWxsLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gob3JpZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NtYWxsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3dEaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1NtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gob3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgb3JpZ2luOwotCVRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uOwotCUJvb2xlYW4gaXNTbWFsbDsKLQlUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBvcmlnaW47CisgICAgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb247CisgICAgQm9vbGVhbiBpc1NtYWxsOworICAgIFRoZW1lRHJhd1N0YXRlIHN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU3RhbmRhbG9uZU5vR3Jvd0JveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU3RhbmRhbG9uZU5vR3Jvd0JveCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhibCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb3JpZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ3Jvd0RpcmVjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzU21hbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94KG9yaWdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU21hbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZncm93RGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNTbWFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3gob3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3dEaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTbWFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lU3RhbmRhbG9uZUdyb3dCb3hCb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgb3JpZ2luOwotCVRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uOwotCUJvb2xlYW4gaXNTbWFsbDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBvcmlnaW47CisgICAgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb247CisgICAgQm9vbGVhbiBpc1NtYWxsOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZvcmlnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNTbWFsbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzKG9yaWdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU21hbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3Jvd0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzU21hbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyhvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvd0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9Ob3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVEcmF3aW5nU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVEcmF3aW5nU3RhdGUgb3V0U3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVEcmF3aW5nU3RhdGUgb3V0U3RhdGU7CiAjaWZuZGVmIEdldFRoZW1lRHJhd2luZ1N0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVEcmF3aW5nU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lRHJhd2luZ1N0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVEcmF3aW5nU3RhdGUoJm91dFN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVGhlbWVEcmF3aW5nU3RhdGVPYmpfTmV3LCBvdXRTdGF0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZURyYXdpbmdTdGF0ZSgmb3V0U3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial9OZXcsIG91dFN0YXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfQXBwbHlUaGVtZUJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVCYWNrZ3JvdW5kS2luZCBpbktpbmQ7Ci0JUmVjdCBib3VuZHM7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluQ29sb3JEZXY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVCYWNrZ3JvdW5kS2luZCBpbktpbmQ7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluQ29sb3JEZXY7CiAjaWZuZGVmIEFwcGx5VGhlbWVCYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soQXBwbHlUaGVtZUJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGx5VGhlbWVCYWNrZ3JvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmxoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3JEZXYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXBwbHlUaGVtZUJhY2tncm91bmQoaW5LaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbG9yRGV2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFwcGx5VGhlbWVCYWNrZ3JvdW5kKGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db2xvckRldik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lVGV4dENvbG9yRm9yV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JQm9vbGVhbiBpc0FjdGl2ZTsKLQlTSW50MTYgZGVwdGg7Ci0JQm9vbGVhbiBpc0NvbG9yRGV2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgQm9vbGVhbiBpc0FjdGl2ZTsKKyAgICBTSW50MTYgZGVwdGg7CisgICAgQm9vbGVhbiBpc0NvbG9yRGV2OwogI2lmbmRlZiBTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFNldFRoZW1lVGV4dENvbG9yRm9yV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNBY3RpdmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzQ29sb3JEZXYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3cod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29sb3JEZXYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0FjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNDb2xvckRldikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdyh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb2xvckRldik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0lzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCU9TVHlwZSBmaWxlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBJc1ZhbGlkQXBwZWFyYW5jZUZpbGVUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZShmaWxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUoZmlsZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZUJydXNoQXNDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUJydXNoIGluQnJ1c2g7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbkNvbG9yRGV2OwotCVJHQkNvbG9yIG91dENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lQnJ1c2ggaW5CcnVzaDsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluQ29sb3JEZXY7CisgICAgUkdCQ29sb3Igb3V0Q29sb3I7CiAjaWZuZGVmIEdldFRoZW1lQnJ1c2hBc0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCcnVzaEFzQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQnJ1c2hBc0NvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3JEZXYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVCcnVzaEFzQ29sb3IoaW5CcnVzaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db2xvckRldiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3V0Q29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3JEZXYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVCcnVzaEFzQ29sb3IoaW5CcnVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db2xvckRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbG9yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3V0Q29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZVRleHRDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZVRleHRDb2xvciBpbkNvbG9yOwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Db2xvckRldjsKLQlSR0JDb2xvciBvdXRDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZVRleHRDb2xvciBpbkNvbG9yOworICAgIFNJbnQxNiBpbkRlcHRoOworICAgIEJvb2xlYW4gaW5Db2xvckRldjsKKyAgICBSR0JDb2xvciBvdXRDb2xvcjsKICNpZm5kZWYgR2V0VGhlbWVUZXh0Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVRleHRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUZXh0Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvckRldikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVRleHRDb2xvcihpbkNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29sb3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvdXRDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvckRldikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZVRleHRDb2xvcihpbkNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29sb3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvdXRDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lTWV0cmljKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lTWV0cmljIGluTWV0cmljOwotCVNJbnQzMiBvdXRNZXRyaWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVNZXRyaWMgaW5NZXRyaWM7CisgICAgU0ludDMyIG91dE1ldHJpYzsKICNpZm5kZWYgR2V0VGhlbWVNZXRyaWMKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1ldHJpYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZXRyaWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1ldHJpYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1ldHJpYyhpbk1ldHJpYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm91dE1ldHJpYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0TWV0cmljKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWV0cmljKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lTWV0cmljKGluTWV0cmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWV0cmljKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNZXRyaWMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQXBwX21ldGhvZHNbXSA9IHsKLQl7IlJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCIsIChQeUNGdW5jdGlvbilBcHBfUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJVbnJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCIsIChQeUNGdW5jdGlvbilBcHBfVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldFRoZW1lUGVuIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVBlbiwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCcnVzaCBpbkJydXNoLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRUaGVtZUJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCcnVzaCBpbkJydXNoLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRUaGVtZVRleHRDb2xvciIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVUZXh0Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lVGV4dENvbG9yIGluQ29sb3IsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKLQl7IlNldFRoZW1lV2luZG93QmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFRoZW1lQnJ1c2ggaW5CcnVzaCwgQm9vbGVhbiBpblVwZGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVdpbmRvd0hlYWRlciIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lV2luZG93SGVhZGVyLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlciwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVQbGFjYXJkIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVQbGFjYXJkLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZUVkaXRUZXh0RnJhbWUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUVkaXRUZXh0RnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lTGlzdEJveEZyYW1lIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVMaXN0Qm94RnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lRm9jdXNSZWN0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVGb2N1c1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBCb29sZWFuIGluSGFzRm9jdXMpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVQcmltYXJ5R3JvdXAiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVByaW1hcnlHcm91cCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU2Vjb25kYXJ5R3JvdXAsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lU2VwYXJhdG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTZXBhcmF0b3IsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVHZW5lcmljV2VsbCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lR2VuZXJpY1dlbGwsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlLCBCb29sZWFuIGluRmlsbENlbnRlcikgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZUZvY3VzUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVGb2N1c1JlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbkhhc0ZvY3VzKSAtPiBOb25lIil9LAotCXsiSXNUaGVtZUluQ29sb3IiLCAoUHlDRnVuY3Rpb24pQXBwX0lzVGhlbWVJbkNvbG9yLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRUaGVtZUFjY2VudENvbG9ycyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVBY2NlbnRDb2xvcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENUYWJIYW5kbGUgb3V0Q29sb3JzKSIpfSwKLQl7IkRyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNZW51QmFyQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVGhlbWVNZW51QmFyU3RhdGUgaW5TdGF0ZSwgVUludDMyIGluQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IkdldFRoZW1lTWVudUJhckhlaWdodCIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51QmFySGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgb3V0SGVpZ2h0KSIpfSwKLQl7IkRyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNZW51QmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbk1lbnVSZWN0LCBUaGVtZU1lbnVUeXBlIGluTWVudVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluTWVudVJlY3QsIFRoZW1lTWVudVR5cGUgbWVudVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVNZW51U2VwYXJhdG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNZW51U2VwYXJhdG9yLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluSXRlbVJlY3QpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEhlaWdodCkiKX0sCi0JeyJHZXRUaGVtZU1lbnVJdGVtRXh0cmEiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudUl0ZW1FeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVNZW51SXRlbVR5cGUgaW5JdGVtVHlwZSkgLT4gKFNJbnQxNiBvdXRIZWlnaHQsIFNJbnQxNiBvdXRXaWR0aCkiKX0sCi0JeyJHZXRUaGVtZU1lbnVUaXRsZUV4dHJhIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVUaXRsZUV4dHJhLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluSXNTcXVpc2hlZCkgLT4gKFNJbnQxNiBvdXRXaWR0aCkiKX0sCi0JeyJEcmF3VGhlbWVUYWJQYW5lIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVUYWJQYW5lLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkdldFRoZW1lVGFiUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVRhYlJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lVGFiU3R5bGUgaW5TdHlsZSwgVGhlbWVUYWJEaXJlY3Rpb24gaW5EaXJlY3Rpb24pIC0+IE5vbmUiKX0sCi0JeyJTZXRUaGVtZUN1cnNvciIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lQ3Vyc29yIGluQ3Vyc29yKSAtPiBOb25lIil9LAotCXsiU2V0QW5pbWF0ZWRUaGVtZUN1cnNvciIsIChQeUNGdW5jdGlvbilBcHBfU2V0QW5pbWF0ZWRUaGVtZUN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVDdXJzb3IgaW5DdXJzb3IsIFVJbnQzMiBpbkFuaW1hdGlvblN0ZXApIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlIG91dFN0eWxlKSIpfSwKLQl7IkdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaGVtZVNjcm9sbEJhckFycm93U3R5bGUgb3V0U3R5bGUpIil9LAotCXsiR2V0VGhlbWVDaGVja0JveFN0eWxlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUNoZWNrQm94U3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRoZW1lQ2hlY2tCb3hTdHlsZSBvdXRTdHlsZSkiKX0sCi0JeyJVc2VUaGVtZUZvbnQiLCAoUHlDRnVuY3Rpb24pQXBwX1VzZVRoZW1lRm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVGb250SUQgaW5Gb250SUQsIFNjcmlwdENvZGUgaW5TY3JpcHQpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVUZXh0Qm94IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVUZXh0Qm94LCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgVGhlbWVGb250SUQgaW5Gb250SUQsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIEJvb2xlYW4gaW5XcmFwVG9XaWR0aCwgUmVjdCBpbkJvdW5kaW5nQm94LCBTSW50MTYgaW5KdXN0KSAtPiBOb25lIil9LAotCXsiVHJ1bmNhdGVUaGVtZVRleHQiLCAoUHlDRnVuY3Rpb24pQXBwX1RydW5jYXRlVGhlbWVUZXh0LCAxLAotCSBQeURvY19TVFIoIihDRk11dGFibGVTdHJpbmdSZWYgaW5TdHJpbmcsIFRoZW1lRm9udElEIGluRm9udElELCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlLCBTSW50MTYgaW5QaXhlbFdpZHRoTGltaXQsIFRydW5jQ29kZSBpblRydW5jV2hlcmUpIC0+IChCb29sZWFuIG91dFRydW5jYXRlZCkiKX0sCi0JeyJHZXRUaGVtZVRleHREaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVRleHREaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgVGhlbWVGb250SUQgaW5Gb250SUQsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIEJvb2xlYW4gaW5XcmFwVG9XaWR0aCwgUG9pbnQgaW9Cb3VuZHMpIC0+IChQb2ludCBpb0JvdW5kcywgU0ludDE2IG91dEJhc2VsaW5lKSIpfSwKLQl7IkdldFRoZW1lVGV4dFNoYWRvd091dHNldCIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0LCAxLAotCSBQeURvY19TVFIoIihUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gKFJlY3Qgb3V0T3V0c2V0KSIpfSwKLQl7IkRyYXdUaGVtZVNjcm9sbEJhckFycm93cyIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlLCBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlLCBCb29sZWFuIGlzSG9yaXopIC0+IChSZWN0IHRyYWNrQm91bmRzKSIpfSwKLQl7IkdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVNjcm9sbEJhclRyYWNrUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMsIFRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZSwgVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZSwgQm9vbGVhbiBpc0hvcml6KSAtPiAoUmVjdCB0cmFja0JvdW5kcykiKX0sCi0JeyJIaXRUZXN0VGhlbWVTY3JvbGxCYXJBcnJvd3MiLCAoUHlDRnVuY3Rpb24pQXBwX0hpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBzY3JvbGxCYXJCb3VuZHMsIFRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZSwgVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZSwgQm9vbGVhbiBpc0hvcml6LCBQb2ludCBwdEhpdCkgLT4gKEJvb2xlYW4gX3J2LCBSZWN0IHRyYWNrQm91bmRzLCBDb250cm9sUGFydENvZGUgcGFydGNvZGUpIil9LAotCXsiRHJhd1RoZW1lU2Nyb2xsQmFyRGVsaW1pdGVycyIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU2Nyb2xsQmFyRGVsaW1pdGVycywgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVXaW5kb3dUeXBlIGZsYXZvciwgUmVjdCBpbkNvbnRSZWN0LCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSwgVGhlbWVXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVCdXR0b24iLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUJ1dHRvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbk5ld0luZm8sIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5QcmV2SW5mbywgVUludDMyIGluVXNlckRhdGEpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZUJ1dHRvblJlZ2lvbiIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVCdXR0b25SZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFVJbnQxNiBpbktpbmQsIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5OZXdJbmZvKSAtPiBOb25lIil9LAotCXsiR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFVJbnQxNiBpbktpbmQsIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbykgLT4gKFJlY3Qgb3V0Qm91bmRzKSIpfSwKLQl7IkdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBVSW50MTYgaW5LaW5kLCBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluRHJhd0luZm8pIC0+IChSZWN0IG91dEJvdW5kcykiKX0sCi0JeyJQbGF5VGhlbWVTb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfUGxheVRoZW1lU291bmQsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lU291bmRLaW5kIGtpbmQpIC0+IE5vbmUiKX0sCi0JeyJCZWdpblRoZW1lRHJhZ1NvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9CZWdpblRoZW1lRHJhZ1NvdW5kLCAxLAotCSBQeURvY19TVFIoIihUaGVtZURyYWdTb3VuZEtpbmQga2luZCkgLT4gTm9uZSIpfSwKLQl7IkVuZFRoZW1lRHJhZ1NvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9FbmRUaGVtZURyYWdTb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lVGlja01hcmsiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVRpY2tNYXJrLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVGhlbWVEcmF3U3RhdGUgc3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVDaGFzaW5nQXJyb3dzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVDaGFzaW5nQXJyb3dzLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVUludDMyIGluZGV4LCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSwgVUludDMyIGVyYXNlRGF0YSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVBvcHVwQXJyb3ciLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVBvcHVwQXJyb3csIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZUFycm93T3JpZW50YXRpb24gb3JpZW50YXRpb24sIFRoZW1lUG9wdXBBcnJvd1NpemUgc2l6ZSwgVGhlbWVEcmF3U3RhdGUgc3RhdGUsIFVJbnQzMiBlcmFzZURhdGEpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IG9yaWdpbiwgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb24sIEJvb2xlYW4gaXNTbWFsbCwgVGhlbWVEcmF3U3RhdGUgc3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBvcmlnaW4sIFRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uLCBCb29sZWFuIGlzU21hbGwsIFRoZW1lRHJhd1N0YXRlIHN0YXRlKSAtPiBOb25lIil9LAotCXsiR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgb3JpZ2luLCBUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbiwgQm9vbGVhbiBpc1NtYWxsKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUiLCAoUHlDRnVuY3Rpb24pQXBwX05vcm1hbGl6ZVRoZW1lRHJhd2luZ1N0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZURyYXdpbmdTdGF0ZSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVEcmF3aW5nU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRoZW1lRHJhd2luZ1N0YXRlIG91dFN0YXRlKSIpfSwKLQl7IkFwcGx5VGhlbWVCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9BcHBseVRoZW1lQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCYWNrZ3JvdW5kS2luZCBpbktpbmQsIFJlY3QgYm91bmRzLCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbkNvbG9yRGV2KSAtPiBOb25lIil9LAotCXsiU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lVGV4dENvbG9yRm9yV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBCb29sZWFuIGlzQWN0aXZlLCBTSW50MTYgZGVwdGgsIEJvb2xlYW4gaXNDb2xvckRldikgLT4gTm9uZSIpfSwKLQl7IklzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUiLCAoUHlDRnVuY3Rpb24pQXBwX0lzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFRoZW1lQnJ1c2hBc0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJydXNoQXNDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCcnVzaCBpbkJydXNoLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbkNvbG9yRGV2KSAtPiAoUkdCQ29sb3Igb3V0Q29sb3IpIil9LAotCXsiR2V0VGhlbWVUZXh0Q29sb3IiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGV4dENvbG9yLCAxLAotCSBQeURvY19TVFIoIihUaGVtZVRleHRDb2xvciBpbkNvbG9yLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbkNvbG9yRGV2KSAtPiAoUkdCQ29sb3Igb3V0Q29sb3IpIil9LAotCXsiR2V0VGhlbWVNZXRyaWMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWV0cmljLCAxLAotCSBQeURvY19TVFIoIihUaGVtZU1ldHJpYyBpbk1ldHJpYykgLT4gKFNJbnQzMiBvdXRNZXRyaWMpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50IiwgKFB5Q0Z1bmN0aW9uKUFwcF9SZWdpc3RlckFwcGVhcmFuY2VDbGllbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50IiwgKFB5Q0Z1bmN0aW9uKUFwcF9VbnJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0VGhlbWVQZW4iLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lUGVuLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRoZW1lQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRoZW1lVGV4dENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVRleHRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVUZXh0Q29sb3IgaW5Db2xvciwgU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAorICAgIHsiU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVdpbmRvd0JhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgVGhlbWVCcnVzaCBpbkJydXNoLCBCb29sZWFuIGluVXBkYXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lV2luZG93SGVhZGVyIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVXaW5kb3dIZWFkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lV2luZG93TGlzdFZpZXdIZWFkZXIiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVBsYWNhcmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVBsYWNhcmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lRWRpdFRleHRGcmFtZSIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lRWRpdFRleHRGcmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVMaXN0Qm94RnJhbWUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUxpc3RCb3hGcmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVGb2N1c1JlY3QiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUZvY3VzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIEJvb2xlYW4gaW5IYXNGb2N1cykgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVByaW1hcnlHcm91cCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lUHJpbWFyeUdyb3VwLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVNlY29uZGFyeUdyb3VwIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTZWNvbmRhcnlHcm91cCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVTZXBhcmF0b3IiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVNlcGFyYXRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZUdlbmVyaWNXZWxsIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVHZW5lcmljV2VsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIEJvb2xlYW4gaW5GaWxsQ2VudGVyKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lRm9jdXNSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUZvY3VzUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluSGFzRm9jdXMpIC0+IE5vbmUiKX0sCisgICAgeyJJc1RoZW1lSW5Db2xvciIsIChQeUNGdW5jdGlvbilBcHBfSXNUaGVtZUluQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldFRoZW1lQWNjZW50Q29sb3JzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUFjY2VudENvbG9ycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ1RhYkhhbmRsZSBvdXRDb2xvcnMpIil9LAorICAgIHsiRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBUaGVtZU1lbnVCYXJTdGF0ZSBpblN0YXRlLCBVSW50MzIgaW5BdHRyaWJ1dGVzKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGhlbWVNZW51QmFySGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVCYXJIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRIZWlnaHQpIil9LAorICAgIHsiRHJhd1RoZW1lTWVudUJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluTWVudVJlY3QsIFRoZW1lTWVudVR5cGUgaW5NZW51VHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5NZW51UmVjdCwgVGhlbWVNZW51VHlwZSBtZW51VHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZU1lbnVTZXBhcmF0b3IiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVTZXBhcmF0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5JdGVtUmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgb3V0SGVpZ2h0KSIpfSwKKyAgICB7IkdldFRoZW1lTWVudUl0ZW1FeHRyYSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51SXRlbUV4dHJhLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZU1lbnVJdGVtVHlwZSBpbkl0ZW1UeXBlKSAtPiAoU0ludDE2IG91dEhlaWdodCwgU0ludDE2IG91dFdpZHRoKSIpfSwKKyAgICB7IkdldFRoZW1lTWVudVRpdGxlRXh0cmEiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudVRpdGxlRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5Jc1NxdWlzaGVkKSAtPiAoU0ludDE2IG91dFdpZHRoKSIpfSwKKyAgICB7IkRyYXdUaGVtZVRhYlBhbmUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVRhYlBhbmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGhlbWVUYWJSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGFiUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVUYWJTdHlsZSBpblN0eWxlLCBUaGVtZVRhYkRpcmVjdGlvbiBpbkRpcmVjdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRoZW1lQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZUN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVDdXJzb3IgaW5DdXJzb3IpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRBbmltYXRlZFRoZW1lQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRBbmltYXRlZFRoZW1lQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUN1cnNvciBpbkN1cnNvciwgVUludDMyIGluQW5pbWF0aW9uU3RlcCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUgb3V0U3R5bGUpIil9LAorICAgIHsiR2V0VGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVNjcm9sbEJhckFycm93U3R5bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSBvdXRTdHlsZSkiKX0sCisgICAgeyJHZXRUaGVtZUNoZWNrQm94U3R5bGUiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQ2hlY2tCb3hTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVDaGVja0JveFN0eWxlIG91dFN0eWxlKSIpfSwKKyAgICB7IlVzZVRoZW1lRm9udCIsIChQeUNGdW5jdGlvbilBcHBfVXNlVGhlbWVGb250LCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUZvbnRJRCBpbkZvbnRJRCwgU2NyaXB0Q29kZSBpblNjcmlwdCkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVRleHRCb3giLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVRleHRCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nLCBUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSwgQm9vbGVhbiBpbldyYXBUb1dpZHRoLCBSZWN0IGluQm91bmRpbmdCb3gsIFNJbnQxNiBpbkp1c3QpIC0+IE5vbmUiKX0sCisgICAgeyJUcnVuY2F0ZVRoZW1lVGV4dCIsIChQeUNGdW5jdGlvbilBcHBfVHJ1bmNhdGVUaGVtZVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGTXV0YWJsZVN0cmluZ1JlZiBpblN0cmluZywgVGhlbWVGb250SUQgaW5Gb250SUQsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIFNJbnQxNiBpblBpeGVsV2lkdGhMaW1pdCwgVHJ1bmNDb2RlIGluVHJ1bmNXaGVyZSkgLT4gKEJvb2xlYW4gb3V0VHJ1bmNhdGVkKSIpfSwKKyAgICB7IkdldFRoZW1lVGV4dERpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGV4dERpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nLCBUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSwgQm9vbGVhbiBpbldyYXBUb1dpZHRoLCBQb2ludCBpb0JvdW5kcykgLT4gKFBvaW50IGlvQm91bmRzLCBTSW50MTYgb3V0QmFzZWxpbmUpIil9LAorICAgIHsiR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVRleHRTaGFkb3dPdXRzZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lRm9udElEIGluRm9udElELCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiAoUmVjdCBvdXRPdXRzZXQpIil9LAorICAgIHsiRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGUsIFRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGUsIEJvb2xlYW4gaXNIb3JpeikgLT4gKFJlY3QgdHJhY2tCb3VuZHMpIil9LAorICAgIHsiR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlLCBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlLCBCb29sZWFuIGlzSG9yaXopIC0+IChSZWN0IHRyYWNrQm91bmRzKSIpfSwKKyAgICB7IkhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cyIsIChQeUNGdW5jdGlvbilBcHBfSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHNjcm9sbEJhckJvdW5kcywgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlLCBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlLCBCb29sZWFuIGlzSG9yaXosIFBvaW50IHB0SGl0KSAtPiAoQm9vbGVhbiBfcnYsIFJlY3QgdHJhY2tCb3VuZHMsIENvbnRyb2xQYXJ0Q29kZSBwYXJ0Y29kZSkiKX0sCisgICAgeyJEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZVdpbmRvd1R5cGUgZmxhdm9yLCBSZWN0IGluQ29udFJlY3QsIFRoZW1lRHJhd1N0YXRlIHN0YXRlLCBUaGVtZVdpbmRvd0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZUJ1dHRvbiIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lQnV0dG9uLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBVSW50MTYgaW5LaW5kLCBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbywgVGhlbWVCdXR0b25EcmF3SW5mbyBpblByZXZJbmZvLCBVSW50MzIgaW5Vc2VyRGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lQnV0dG9uUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJ1dHRvblJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbk5ld0luZm8pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbkRyYXdJbmZvKSAtPiAoUmVjdCBvdXRCb3VuZHMpIil9LAorICAgIHsiR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJ1dHRvbkJhY2tncm91bmRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFVJbnQxNiBpbktpbmQsIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbykgLT4gKFJlY3Qgb3V0Qm91bmRzKSIpfSwKKyAgICB7IlBsYXlUaGVtZVNvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9QbGF5VGhlbWVTb3VuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVTb3VuZEtpbmQga2luZCkgLT4gTm9uZSIpfSwKKyAgICB7IkJlZ2luVGhlbWVEcmFnU291bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0JlZ2luVGhlbWVEcmFnU291bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lRHJhZ1NvdW5kS2luZCBraW5kKSAtPiBOb25lIil9LAorICAgIHsiRW5kVGhlbWVEcmFnU291bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0VuZFRoZW1lRHJhZ1NvdW5kLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVUaWNrTWFyayIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lVGlja01hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZUNoYXNpbmdBcnJvd3MiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUNoYXNpbmdBcnJvd3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBVSW50MzIgaW5kZXgsIFRoZW1lRHJhd1N0YXRlIHN0YXRlLCBVSW50MzIgZXJhc2VEYXRhKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lUG9wdXBBcnJvdyIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lUG9wdXBBcnJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMsIFRoZW1lQXJyb3dPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgVGhlbWVQb3B1cEFycm93U2l6ZSBzaXplLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSwgVUludDMyIGVyYXNlRGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVN0YW5kYWxvbmVHcm93Qm94IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgb3JpZ2luLCBUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbiwgQm9vbGVhbiBpc1NtYWxsLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3giLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IG9yaWdpbiwgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb24sIEJvb2xlYW4gaXNTbWFsbCwgVGhlbWVEcmF3U3RhdGUgc3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBvcmlnaW4sIFRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uLCBCb29sZWFuIGlzU21hbGwpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSIsIChQeUNGdW5jdGlvbilBcHBfTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZURyYXdpbmdTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVEcmF3aW5nU3RhdGUgb3V0U3RhdGUpIil9LAorICAgIHsiQXBwbHlUaGVtZUJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0FwcGx5VGhlbWVCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJhY2tncm91bmRLaW5kIGluS2luZCwgUmVjdCBib3VuZHMsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIEJvb2xlYW4gaXNBY3RpdmUsIFNJbnQxNiBkZXB0aCwgQm9vbGVhbiBpc0NvbG9yRGV2KSAtPiBOb25lIil9LAorICAgIHsiSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilBcHBfSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVUeXBlKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0VGhlbWVCcnVzaEFzQ29sb3IiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQnJ1c2hBc0NvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IChSR0JDb2xvciBvdXRDb2xvcikiKX0sCisgICAgeyJHZXRUaGVtZVRleHRDb2xvciIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVUZXh0Q29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lVGV4dENvbG9yIGluQ29sb3IsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IChSR0JDb2xvciBvdXRDb2xvcikiKX0sCisgICAgeyJHZXRUaGVtZU1ldHJpYyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZXRyaWMsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lTWV0cmljIGluTWV0cmljKSAtPiAoU0ludDMyIG91dE1ldHJpYykiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKLSNlbHNlICAJLyogX19MUDY0X18gKi8KKyNlbHNlICAgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIEFwcF9tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KQEAgLTE4MDUsMjYgKzE4MDUsMjYgQEAKIAogdm9pZCBpbml0X0FwcCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0FwcCIsIEFwcF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0FwcCIsIEFwcF9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlBcHBfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChBcHBfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBBcHBfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlUaGVtZURyYXdpbmdTdGF0ZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZUaGVtZURyYXdpbmdTdGF0ZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5T2JqZWN0ICopJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaGVtZURyYXdpbmdTdGF0ZVR5cGUiLCAoUHlPYmplY3QgKikmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQXBwX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoQXBwX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQXBwX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgVGhlbWVEcmF3aW5nU3RhdGVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaGVtZURyYXdpbmdTdGF0ZSIsIChQeU9iamVjdCAqKSZUaGVtZURyYXdpbmdTdGF0ZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVGhlbWVEcmF3aW5nU3RhdGVUeXBlIiwgKFB5T2JqZWN0ICopJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2F1dG9HSUwuYyBiL01hYy9Nb2R1bGVzL2F1dG9HSUwuYwppbmRleCBhZjJlNjk5Li4zYmMxNTkzIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9hdXRvR0lMLmMKKysrIGIvTWFjL01vZHVsZXMvYXV0b0dJTC5jCkBAIC0xNiw5MyArMTYsOTMgQEAKIAogCiBzdGF0aWMgdm9pZCBhdXRvR0lMQ2FsbGJhY2soQ0ZSdW5Mb29wT2JzZXJ2ZXJSZWYgb2JzZXJ2ZXIsCi0JCQkgICAgQ0ZSdW5Mb29wQWN0aXZpdHkgYWN0aXZpdHksCi0JCQkgICAgdm9pZCAqaW5mbykgewotCVB5VGhyZWFkU3RhdGUgKipwX3RzdGF0ZSA9IChQeVRocmVhZFN0YXRlICoqKWluZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSdW5Mb29wQWN0aXZpdHkgYWN0aXZpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaW5mbykgeworICAgIFB5VGhyZWFkU3RhdGUgKipwX3RzdGF0ZSA9IChQeVRocmVhZFN0YXRlICoqKWluZm87CiAKLQlzd2l0Y2ggKGFjdGl2aXR5KSB7Ci0JY2FzZSBrQ0ZSdW5Mb29wQmVmb3JlV2FpdGluZzoKLQkJLyogZ29pbmcgdG8gc2xlZXAsIHJlbGVhc2UgR0lMICovCisgICAgc3dpdGNoIChhY3Rpdml0eSkgeworICAgIGNhc2Uga0NGUnVuTG9vcEJlZm9yZVdhaXRpbmc6CisgICAgICAgIC8qIGdvaW5nIHRvIHNsZWVwLCByZWxlYXNlIEdJTCAqLwogI2lmZGVmIEFVVE9HSUxfREVCVUcKLQkJZnByaW50ZihzdGRlcnIsICJnb2luZyB0byBzbGVlcCwgcmVsZWFzZSBHSUxcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdvaW5nIHRvIHNsZWVwLCByZWxlYXNlIEdJTFxuIik7CiAjZW5kaWYKLQkJKnBfdHN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKLQkJYnJlYWs7Ci0JY2FzZSBrQ0ZSdW5Mb29wQWZ0ZXJXYWl0aW5nOgotCQkvKiB3YWtpbmcgdXAsIGFjcXVpcmUgR0lMICovCisgICAgICAgICpwX3RzdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0NGUnVuTG9vcEFmdGVyV2FpdGluZzoKKyAgICAgICAgLyogd2FraW5nIHVwLCBhY3F1aXJlIEdJTCAqLwogI2lmZGVmIEFVVE9HSUxfREVCVUcKLQkJZnByaW50ZihzdGRlcnIsICJ3YWtpbmcgdXAsIGFjcXVpcmUgR0lMXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3YWtpbmcgdXAsIGFjcXVpcmUgR0lMXG4iKTsKICNlbmRpZgotCQlQeUV2YWxfUmVzdG9yZVRocmVhZCgqcF90c3RhdGUpOwotCQkqcF90c3RhdGUgPSBOVUxMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisgICAgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKCpwX3RzdGF0ZSk7CisgICAgICAgICpwX3RzdGF0ZSA9IE5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaW5mb1JlbGVhc2UoY29uc3Qgdm9pZCAqaW5mbykgewotCS8qIFhYWCBUaGlzIHNob3VsZCBnZXQgY2FsbGVkIHdoZW4gdGhlIHJ1biBsb29wIGlzIGRlYWxsb2NhdGVkLAotCSAgIGJ1dCB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4uIFNvIGZvciBub3c6IGxlYWsuICovCi0JUHlNZW1fRnJlZSgodm9pZCAqKWluZm8pOworICAgIC8qIFhYWCBUaGlzIHNob3VsZCBnZXQgY2FsbGVkIHdoZW4gdGhlIHJ1biBsb29wIGlzIGRlYWxsb2NhdGVkLAorICAgICAgIGJ1dCB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4uIFNvIGZvciBub3c6IGxlYWsuICovCisgICAgUHlNZW1fRnJlZSgodm9pZCAqKWluZm8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXV0b0dJTF9pbnN0YWxsQXV0b0dJTChQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqdHN0YXRlX2RpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKLQlQeU9iamVjdCAqdjsKLQlDRlJ1bkxvb3BSZWYgcmw7Ci0JUHlUaHJlYWRTdGF0ZSAqKnBfdHN0YXRlOyAgLyogZm9yIHVzZSBpbiB0aGUgaW5mbyBmaWVsZCAqLwotCUNGUnVuTG9vcE9ic2VydmVyQ29udGV4dCBjb250ZXh0ID0gezAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OwotCUNGUnVuTG9vcE9ic2VydmVyUmVmIG9ic2VydmVyOworICAgIFB5T2JqZWN0ICp0c3RhdGVfZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOworICAgIFB5T2JqZWN0ICp2OworICAgIENGUnVuTG9vcFJlZiBybDsKKyAgICBQeVRocmVhZFN0YXRlICoqcF90c3RhdGU7ICAvKiBmb3IgdXNlIGluIHRoZSBpbmZvIGZpZWxkICovCisgICAgQ0ZSdW5Mb29wT2JzZXJ2ZXJDb250ZXh0IGNvbnRleHQgPSB7MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07CisgICAgQ0ZSdW5Mb29wT2JzZXJ2ZXJSZWYgb2JzZXJ2ZXI7CiAKLQlpZiAodHN0YXRlX2RpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHRzdGF0ZV9kaWN0LCAiYXV0b0dJTC5JbnN0YWxsZWRBdXRvR0lMIik7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQkvKiB3ZSd2ZSBhbHJlYWR5IGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICBpZiAodHN0YXRlX2RpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHRzdGF0ZV9kaWN0LCAiYXV0b0dJTC5JbnN0YWxsZWRBdXRvR0lMIik7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICAvKiB3ZSd2ZSBhbHJlYWR5IGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIAotCXJsID0gQ0ZSdW5Mb29wR2V0Q3VycmVudCgpOwotCWlmIChybCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdXRvR0lMRXJyb3IsCi0JCQkJImNhbid0IGdldCBydW4gbG9vcCBmb3IgY3VycmVudCB0aHJlYWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHJsID0gQ0ZSdW5Mb29wR2V0Q3VycmVudCgpOworICAgIGlmIChybCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdXRvR0lMRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZ2V0IHJ1biBsb29wIGZvciBjdXJyZW50IHRocmVhZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwX3RzdGF0ZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlUaHJlYWRTdGF0ZSAqKSk7Ci0JaWYgKHBfdHN0YXRlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJCSJub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSAiCi0JCQkJInRzdGF0ZSBwb2ludGVyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkqcF90c3RhdGUgPSBOVUxMOwotCWNvbnRleHQuaW5mbyA9ICh2b2lkICopcF90c3RhdGU7Ci0JY29udGV4dC5yZWxlYXNlID0gaW5mb1JlbGVhc2U7CisgICAgcF90c3RhdGUgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5VGhyZWFkU3RhdGUgKikpOworICAgIGlmIChwX3RzdGF0ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAidHN0YXRlIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICpwX3RzdGF0ZSA9IE5VTEw7CisgICAgY29udGV4dC5pbmZvID0gKHZvaWQgKilwX3RzdGF0ZTsKKyAgICBjb250ZXh0LnJlbGVhc2UgPSBpbmZvUmVsZWFzZTsKIAotCW9ic2VydmVyID0gQ0ZSdW5Mb29wT2JzZXJ2ZXJDcmVhdGUoCi0JCU5VTEwsCi0JCWtDRlJ1bkxvb3BCZWZvcmVXYWl0aW5nIHwga0NGUnVuTG9vcEFmdGVyV2FpdGluZywKLQkJMSwgMCwgYXV0b0dJTENhbGxiYWNrLCAmY29udGV4dCk7Ci0JaWYgKG9ic2VydmVyID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1dG9HSUxFcnJvciwKLQkJCQkiY2FuJ3QgY3JlYXRlIGV2ZW50IGxvb3Agb2JzZXJ2ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUNGUnVuTG9vcEFkZE9ic2VydmVyKHJsLCBvYnNlcnZlciwga0NGUnVuTG9vcERlZmF1bHRNb2RlKTsKLQkvKiBYWFggaG93IHRvIGNoZWNrIGZvciBlcnJvcnM/ICovCisgICAgb2JzZXJ2ZXIgPSBDRlJ1bkxvb3BPYnNlcnZlckNyZWF0ZSgKKyAgICAgICAgTlVMTCwKKyAgICAgICAga0NGUnVuTG9vcEJlZm9yZVdhaXRpbmcgfCBrQ0ZSdW5Mb29wQWZ0ZXJXYWl0aW5nLAorICAgICAgICAxLCAwLCBhdXRvR0lMQ2FsbGJhY2ssICZjb250ZXh0KTsKKyAgICBpZiAob2JzZXJ2ZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXV0b0dJTEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGNyZWF0ZSBldmVudCBsb29wIG9ic2VydmVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBDRlJ1bkxvb3BBZGRPYnNlcnZlcihybCwgb2JzZXJ2ZXIsIGtDRlJ1bkxvb3BEZWZhdWx0TW9kZSk7CisgICAgLyogWFhYIGhvdyB0byBjaGVjayBmb3IgZXJyb3JzPyAqLwogCi0JLyogcmVnaXN0ZXIgdGhhdCB3ZSBoYXZlIGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0c3RhdGVfZGljdCwgImF1dG9HSUwuSW5zdGFsbGVkQXV0b0dJTCIsCi0JCQkJIFB5X05vbmUpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogcmVnaXN0ZXIgdGhhdCB3ZSBoYXZlIGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0c3RhdGVfZGljdCwgImF1dG9HSUwuSW5zdGFsbGVkQXV0b0dJTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoYXV0b0dJTF9pbnN0YWxsQXV0b0dJTF9kb2MsCkBAIC0xMTQsMTMgKzExNCwxMyBAQAogKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGF1dG9HSUxfbWV0aG9kc1tdID0gewotCXsKLQkJImluc3RhbGxBdXRvR0lMIiwKLQkJKFB5Q0Z1bmN0aW9uKWF1dG9HSUxfaW5zdGFsbEF1dG9HSUwsCi0JCU1FVEhfTk9BUkdTLAotCQlhdXRvR0lMX2luc3RhbGxBdXRvR0lMX2RvYwotCX0sCi0JeyAwLCAwLCAwLCAwIH0gLyogc2VudGluZWwgKi8KKyAgICB7CisgICAgICAgICJpbnN0YWxsQXV0b0dJTCIsCisgICAgICAgIChQeUNGdW5jdGlvbilhdXRvR0lMX2luc3RhbGxBdXRvR0lMLAorICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgICAgYXV0b0dJTF9pbnN0YWxsQXV0b0dJTF9kb2MKKyAgICB9LAorICAgIHsgMCwgMCwgMCwgMCB9IC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoYXV0b0dJTF9kb2NzLApAQCAtMTMyLDIxICsxMzIsMjEgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0YXV0b0dJTCh2b2lkKQogewotCVB5T2JqZWN0ICptb2Q7CisgICAgUHlPYmplY3QgKm1vZDsKIAotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCB0aGUgYXV0b0dJTCBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgdGhlIGF1dG9HSUwgbW9kdWxlIGlzIHJlbW92ZWQuIiwgMSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQltb2QgPSBQeV9Jbml0TW9kdWxlNCgiYXV0b0dJTCIsIGF1dG9HSUxfbWV0aG9kcywgYXV0b0dJTF9kb2NzLAotCQkJICAgICBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtb2QgPT0gTlVMTCkKLQkJcmV0dXJuOwotCUF1dG9HSUxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYXV0b0dJTC5BdXRvR0lMRXJyb3IiLAotCQkJCQkgIFB5RXhjX0V4Y2VwdGlvbiwgTlVMTCk7Ci0JaWYgKEF1dG9HSUxFcnJvciA9PSBOVUxMKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKEF1dG9HSUxFcnJvcik7Ci0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2QsICJBdXRvR0lMRXJyb3IiLAotCQkJICAgICAgIEF1dG9HSUxFcnJvcikgPCAwKQotCQlyZXR1cm47CisgICAgbW9kID0gUHlfSW5pdE1vZHVsZTQoImF1dG9HSUwiLCBhdXRvR0lMX21ldGhvZHMsIGF1dG9HSUxfZG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIEF1dG9HSUxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYXV0b0dJTC5BdXRvR0lMRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19FeGNlcHRpb24sIE5VTEwpOworICAgIGlmIChBdXRvR0lMRXJyb3IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRihBdXRvR0lMRXJyb3IpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kLCAiQXV0b0dJTEVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9HSUxFcnJvcikgPCAwKQorICAgICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jYXJib25ldnQvX0NhcmJvbkV2dG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L19DYXJib25FdnRtb2R1bGUuYwppbmRleCA4OTNiZWVjLi42MjNhM2U1IDEwMDc1NQotLS0gYS9NYWMvTW9kdWxlcy9jYXJib25ldnQvX0NhcmJvbkV2dG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2NhcmJvbmV2dC9fQ2FyYm9uRXZ0bW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zMCwxMSArMzAsMTEgQEAKIHN0YXRpYyBpbnQKIEV2ZW50VHlwZVNwZWNfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRUeXBlU3BlYyAqb3V0KQogewotICAgICAgICBpZiAoUHlBcmdfUGFyc2UodiwgIihPJmwpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJihvdXQtPmV2ZW50Q2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgJihvdXQtPmV2ZW50S2luZCkpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlBcmdfUGFyc2UodiwgIihPJmwpIiwKKyAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmKG91dC0+ZXZlbnRDbGFzcyksCisgICAgICAgICAgICAgICAgICAgICYob3V0LT5ldmVudEtpbmQpKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqIGVuZCBFdmVudFR5cGVTcGVjICoqKioqKiovCkBAIC00NSwxNSArNDUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCoKIEhJUG9pbnRfTmV3KEhJUG9pbnQgKmluKQogewotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZmYiLCBpbi0+eCwgaW4tPnkpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJmZiIsIGluLT54LCBpbi0+eSk7CiB9CiAKIHN0YXRpYyBpbnQKIEhJUG9pbnRfQ29udmVydChQeU9iamVjdCAqdiwgSElQb2ludCAqb3V0KQogewotICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAiZmYiLCAmKG91dC0+eCksICYob3V0LT55KSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJmZiIsICYob3V0LT54KSwgJihvdXQtPnkpKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYKIApAQCAtNjQsOSArNjQsOSBAQAogc3RhdGljIGludAogRXZlbnRIb3RLZXlJRF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudEhvdEtleUlEICpvdXQpCiB7Ci0gICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJsbCIsICZvdXQtPnNpZ25hdHVyZSwgJm91dC0+aWQpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAibGwiLCAmb3V0LT5zaWduYXR1cmUsICZvdXQtPmlkKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqIGVuZCBFdmVudEhvdEtleUlEICoqKioqKiovCkBAIC03NywyNyArNzcsMjcgQEAKIAogc3RhdGljIHBhc2NhbCBPU1N0YXR1cwogbXlFdmVudEhhbmRsZXIoRXZlbnRIYW5kbGVyQ2FsbFJlZiBoYW5kbGVyUmVmLCBFdmVudFJlZiBldmVudCwgdm9pZCAqb3V0UHlPYmplY3QpIHsKLSAgICAgICAgUHlPYmplY3QgKnJldFZhbHVlOwotICAgICAgICBpbnQgc3RhdHVzOworICAgIFB5T2JqZWN0ICpyZXRWYWx1ZTsKKyAgICBpbnQgc3RhdHVzOwogCi0gICAgICAgIHJldFZhbHVlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKW91dFB5T2JqZWN0LCAiTyZPJiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlckNhbGxSZWZfTmV3LCBoYW5kbGVyUmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9OZXcsIGV2ZW50KTsKLSAgICAgICAgaWYgKHJldFZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXJyb3IgaW4gZXZlbnQgaGFuZGxlciBjYWxsYmFjazpcbiIpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7ICAvKiB0aGlzIGFsc28gY2xlYXJzIHRoZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5vRXJyOyAvKiBjb21wbGFpbj8gaG93PyAqLwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZXRWYWx1ZSA9PSBQeV9Ob25lKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbm9FcnI7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2socmV0VmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQeUludF9Bc0xvbmcocmV0VmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbm9FcnI7IC8qIHdyb25nIG9iamVjdCB0eXBlLCBjb21wbGFpbj8gKi8KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmV0VmFsdWUpOwotICAgICAgICB9CisgICAgcmV0VmFsdWUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopb3V0UHlPYmplY3QsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXJDYWxsUmVmX05ldywgaGFuZGxlclJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9OZXcsIGV2ZW50KTsKKyAgICBpZiAocmV0VmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXJyb3IgaW4gZXZlbnQgaGFuZGxlciBjYWxsYmFjazpcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOyAgLyogdGhpcyBhbHNvIGNsZWFycyB0aGUgZXJyb3IgKi8KKyAgICAgICAgc3RhdHVzID0gbm9FcnI7IC8qIGNvbXBsYWluPyBob3c/ICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJldFZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICBzdGF0dXMgPSBub0VycjsKKyAgICAgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2socmV0VmFsdWUpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBQeUludF9Bc0xvbmcocmV0VmFsdWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHN0YXR1cyA9IG5vRXJyOyAvKiB3cm9uZyBvYmplY3QgdHlwZSwgY29tcGxhaW4/ICovCisgICAgICAgIFB5X0RFQ1JFRihyZXRWYWx1ZSk7CisgICAgfQogCi0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqKioqKioqIGVuZCBteUV2ZW50SGFuZGxlciAqKioqKioqKioqKi8KQEAgLTExMiwyNjggKzExMiwyNjggQEAKICNkZWZpbmUgRXZlbnRSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRXZlbnRSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50UmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBFdmVudFJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50UmVmT2JqZWN0OwogCiBQeU9iamVjdCAqRXZlbnRSZWZfTmV3KEV2ZW50UmVmIGl0c2VsZikKIHsKLQlFdmVudFJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRSZWZPYmplY3QsICZFdmVudFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50UmVmT2JqZWN0LCAmRXZlbnRSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRSZWYgKnBfaXRzZWxmKQogewotCWlmICghRXZlbnRSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRXZlbnRSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBFdmVudFJlZl9kZWFsbG9jKEV2ZW50UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9SZXRhaW5FdmVudChFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZXRhaW5FdmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZXRhaW5FdmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9HZXRFdmVudFJldGFpbkNvdW50KEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRFdmVudFJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRFdmVudFJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX1JlbGVhc2VFdmVudChFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVJlbGVhc2VFdmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZWxlYXNlRXZlbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX1NldEV2ZW50UGFyYW1ldGVyKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBpbk5hbWU7Ci0JT1NUeXBlIGluVHlwZTsKLQljaGFyICppbkRhdGFQdHJfX2luX187Ci0JbG9uZyBpbkRhdGFQdHJfX2xlbl9fOwotCWludCBpbkRhdGFQdHJfX2luX2xlbl9fOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EYXRhUHRyX19pbl9fLCAmaW5EYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWluRGF0YVB0cl9fbGVuX18gPSBpbkRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBTZXRFdmVudFBhcmFtZXRlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5EYXRhUHRyX19sZW5fXywgaW5EYXRhUHRyX19pbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgaW5OYW1lOworICAgIE9TVHlwZSBpblR5cGU7CisgICAgY2hhciAqaW5EYXRhUHRyX19pbl9fOworICAgIGxvbmcgaW5EYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgaW5EYXRhUHRyX19pbl9sZW5fXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGF0YVB0cl9faW5fXywgJmluRGF0YVB0cl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbkRhdGFQdHJfX2xlbl9fID0gaW5EYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gU2V0RXZlbnRQYXJhbWV0ZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGF0YVB0cl9fbGVuX18sIGluRGF0YVB0cl9faW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfR2V0RXZlbnRDbGFzcyhFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RXZlbnRDbGFzcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RXZlbnRDbGFzcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9HZXRFdmVudEtpbmQoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQzMiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEV2ZW50S2luZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RXZlbnRLaW5kKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0dldEV2ZW50VGltZShFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZG91YmxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RXZlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBkb3VibGUgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRFdmVudFRpbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfU2V0RXZlbnRUaW1lKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWRvdWJsZSBpblRpbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RXZlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpblRpbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGRvdWJsZSBpblRpbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RXZlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpblRpbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0lzVXNlckNhbmNlbEV2ZW50UmVmKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNVc2VyQ2FuY2VsRXZlbnRSZWYoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1VzZXJDYW5jZWxFdmVudFJlZihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9Db252ZXJ0RXZlbnRSZWZUb0V2ZW50UmVjb3JkKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCBvdXRFdmVudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJm91dEV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRSZWNvcmQgb3V0RXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRFdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZvdXRFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfSXNFdmVudEluTWFzayhFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JVUludDE2IGluTWFzazsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzRXZlbnRJbk1hc2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGluTWFzayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFVJbnQxNiBpbk1hc2s7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0V2ZW50SW5NYXNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbk1hc2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX1NlbmRFdmVudFRvRXZlbnRUYXJnZXQoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9Db252ZXJ0LCAmaW5UYXJnZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2VuZEV2ZW50VG9FdmVudFRhcmdldChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFyZ2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBFdmVudFRhcmdldFJlZiBpblRhcmdldDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX0NvbnZlcnQsICZpblRhcmdldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZW5kRXZlbnRUb0V2ZW50VGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYXJnZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0dldEV2ZW50UGFyYW1ldGVyKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlVSW50MzIgYnVmZmVyU2l6ZTsKLQlFdmVudFBhcmFtTmFtZSBpbk5hbWU7Ci0JRXZlbnRQYXJhbVR5cGUgaW5UeXBlOwotCU9TRXJyIF9lcnI7Ci0Jdm9pZCAqIGJ1ZmZlcjsKKyAgICBVSW50MzIgYnVmZmVyU2l6ZTsKKyAgICBFdmVudFBhcmFtTmFtZSBpbk5hbWU7CisgICAgRXZlbnRQYXJhbVR5cGUgaW5UeXBlOworICAgIE9TRXJyIF9lcnI7CisgICAgdm9pZCAqIGJ1ZmZlcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLCBQeU1hY19HZXRPU1R5cGUsICZpbk5hbWUsIFB5TWFjX0dldE9TVHlwZSwgJmluVHlwZSkpCi0JICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsIFB5TWFjX0dldE9TVHlwZSwgJmluTmFtZSwgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlKSkKKyAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEZpZ3VyZSBvdXQgdGhlIHNpemUgYnkgcGFzc2luZyBhIG51bGwgYnVmZmVyIHRvIEdldEV2ZW50UGFyYW1ldGVyICovCi0JX2VyciA9IEdldEV2ZW50UGFyYW1ldGVyKF9zZWxmLT5vYl9pdHNlbGYsIGluTmFtZSwgaW5UeXBlLCBOVUxMLCAwLCAmYnVmZmVyU2l6ZSwgTlVMTCk7CisgICAgLyogRmlndXJlIG91dCB0aGUgc2l6ZSBieSBwYXNzaW5nIGEgbnVsbCBidWZmZXIgdG8gR2V0RXZlbnRQYXJhbWV0ZXIgKi8KKyAgICBfZXJyID0gR2V0RXZlbnRQYXJhbWV0ZXIoX3NlbGYtPm9iX2l0c2VsZiwgaW5OYW1lLCBpblR5cGUsIE5VTEwsIDAsICZidWZmZXJTaXplLCBOVUxMKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgYnVmZmVyU2l6ZSk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKQotCSAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JX2VyciA9IEdldEV2ZW50UGFyYW1ldGVyKF9zZWxmLT5vYl9pdHNlbGYsIGluTmFtZSwgaW5UeXBlLCBOVUxMLCBidWZmZXJTaXplLCBOVUxMLCBidWZmZXIpOworICAgIF9lcnIgPSBHZXRFdmVudFBhcmFtZXRlcihfc2VsZi0+b2JfaXRzZWxmLCBpbk5hbWUsIGluVHlwZSwgTlVMTCwgYnVmZmVyU2l6ZSwgTlVMTCwgYnVmZmVyKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JICAgICAgUHlNZW1fREVMKGJ1ZmZlcik7Ci0JICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBidWZmZXIsIGJ1ZmZlclNpemUpOwotCVB5TWVtX0RFTChidWZmZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKSB7CisgICAgICAgICAgUHlNZW1fREVMKGJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBidWZmZXIsIGJ1ZmZlclNpemUpOworICAgIFB5TWVtX0RFTChidWZmZXIpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudFJlZl9tZXRob2RzW10gPSB7Ci0JeyJSZXRhaW5FdmVudCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9SZXRhaW5FdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRSZWYgX3J2KSIpfSwKLQl7IkdldEV2ZW50UmV0YWluQ291bnQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRSZXRhaW5Db3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJSZWxlYXNlRXZlbnQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfUmVsZWFzZUV2ZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTZXRFdmVudFBhcmFtZXRlciIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9TZXRFdmVudFBhcmFtZXRlciwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGluTmFtZSwgT1NUeXBlIGluVHlwZSwgQnVmZmVyIGluRGF0YVB0cikgLT4gTm9uZSIpfSwKLQl7IkdldEV2ZW50Q2xhc3MiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRDbGFzcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJHZXRFdmVudEtpbmQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRLaW5kLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKLQl7IkdldEV2ZW50VGltZSIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGRvdWJsZSBfcnYpIil9LAotCXsiU2V0RXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1NldEV2ZW50VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoZG91YmxlIGluVGltZSkgLT4gTm9uZSIpfSwKLQl7IklzVXNlckNhbmNlbEV2ZW50UmVmIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0lzVXNlckNhbmNlbEV2ZW50UmVmLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDb252ZXJ0RXZlbnRSZWZUb0V2ZW50UmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0NvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCBvdXRFdmVudCkiKX0sCi0JeyJJc0V2ZW50SW5NYXNrIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0lzRXZlbnRJbk1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQxNiBpbk1hc2spIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZW5kRXZlbnRUb0V2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1NlbmRFdmVudFRvRXZlbnRUYXJnZXQsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50VGFyZ2V0UmVmIGluVGFyZ2V0KSAtPiBOb25lIil9LAotCXsiR2V0RXZlbnRQYXJhbWV0ZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRQYXJhbWV0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UGFyYW1OYW1lIGV2ZW50TmFtZSwgRXZlbnRQYXJhbVR5cGUgZXZlbnRUeXBlKSAtPiAoU3RyaW5nIGV2ZW50UGFyYW1EYXRhKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlJldGFpbkV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1JldGFpbkV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChFdmVudFJlZiBfcnYpIil9LAorICAgIHsiR2V0RXZlbnRSZXRhaW5Db3VudCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudFJldGFpbkNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IlJlbGVhc2VFdmVudCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9SZWxlYXNlRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEV2ZW50UGFyYW1ldGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1NldEV2ZW50UGFyYW1ldGVyLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgaW5OYW1lLCBPU1R5cGUgaW5UeXBlLCBCdWZmZXIgaW5EYXRhUHRyKSAtPiBOb25lIil9LAorICAgIHsiR2V0RXZlbnRDbGFzcyIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudENsYXNzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IkdldEV2ZW50S2luZCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudEtpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAorICAgIHsiR2V0RXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0dldEV2ZW50VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCisgICAgeyJTZXRFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfU2V0RXZlbnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihkb3VibGUgaW5UaW1lKSAtPiBOb25lIil9LAorICAgIHsiSXNVc2VyQ2FuY2VsRXZlbnRSZWYiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfSXNVc2VyQ2FuY2VsRXZlbnRSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIG91dEV2ZW50KSIpfSwKKyAgICB7IklzRXZlbnRJbk1hc2siLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfSXNFdmVudEluTWFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDE2IGluTWFzaykgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNlbmRFdmVudFRvRXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfU2VuZEV2ZW50VG9FdmVudFRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRFdmVudFBhcmFtZXRlciIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudFBhcmFtZXRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRQYXJhbU5hbWUgZXZlbnROYW1lLCBFdmVudFBhcmFtVHlwZSBldmVudFR5cGUpIC0+IChTdHJpbmcgZXZlbnRQYXJhbURhdGEpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudFJlZl9nZXRzZXRsaXN0IE5VTEwKQEAgLTM5MCw2MSArMzkwLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUV2ZW50UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChFdmVudFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEV2ZW50UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIEV2ZW50UmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50UmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NhcmJvbkV2dC5FdmVudFJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEV2ZW50UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRXZlbnRSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEV2ZW50UmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudFJlZl9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlFdmVudFJlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlFdmVudFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRXZlbnRSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRXZlbnRSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NhcmJvbkV2dC5FdmVudFJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEV2ZW50UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRXZlbnRSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEV2ZW50UmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudFJlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBFdmVudFJlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBFdmVudFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRXZlbnRSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRXZlbnRSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ1NywxNDQgKzQ1NywxNDQgQEAKICNkZWZpbmUgRXZlbnRRdWV1ZVJlZl9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZFdmVudFF1ZXVlUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50UXVldWVSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50UXVldWVSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlFdmVudFF1ZXVlUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRXZlbnRRdWV1ZVJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50UXVldWVSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX05ldyhFdmVudFF1ZXVlUmVmIGl0c2VsZikKIHsKLQlFdmVudFF1ZXVlUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudFF1ZXVlUmVmT2JqZWN0LCAmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRRdWV1ZVJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRRdWV1ZVJlZk9iamVjdCwgJkV2ZW50UXVldWVSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRRdWV1ZVJlZl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudFF1ZXVlUmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50UXVldWVSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRRdWV1ZVJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChFdmVudFF1ZXVlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50UXVldWVSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRRdWV1ZVJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChFdmVudFF1ZXVlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRRdWV1ZVJlZl9kZWFsbG9jKEV2ZW50UXVldWVSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UXVldWVSZWZfUG9zdEV2ZW50VG9RdWV1ZShFdmVudFF1ZXVlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUV2ZW50UmVmIGluRXZlbnQ7Ci0JU0ludDE2IGluUHJpb3JpdHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfQ29udmVydCwgJmluRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblByaW9yaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFBvc3RFdmVudFRvUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUHJpb3JpdHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgU0ludDE2IGluUHJpb3JpdHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfQ29udmVydCwgJmluRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblByaW9yaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBvc3RFdmVudFRvUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJpb3JpdHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UXVldWVSZWZfRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUoRXZlbnRRdWV1ZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaW5OdW1UeXBlczsKLQlFdmVudFR5cGVTcGVjIGluTGlzdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZsdXNoRXZlbnRzTWF0Y2hpbmdMaXN0RnJvbVF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbk51bVR5cGVzOworICAgIEV2ZW50VHlwZVNwZWMgaW5MaXN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpbkxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTGlzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRRdWV1ZVJlZl9GbHVzaEV2ZW50UXVldWUoRXZlbnRRdWV1ZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZsdXNoRXZlbnRRdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZsdXNoRXZlbnRRdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX0dldE51bUV2ZW50c0luUXVldWUoRXZlbnRRdWV1ZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TnVtRXZlbnRzSW5RdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TnVtRXZlbnRzSW5RdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX1JlbW92ZUV2ZW50RnJvbVF1ZXVlKEV2ZW50UXVldWVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRSZWYgaW5FdmVudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX0NvbnZlcnQsICZpbkV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUV2ZW50RnJvbVF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXZlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVFdmVudEZyb21RdWV1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX0lzRXZlbnRJblF1ZXVlKEV2ZW50UXVldWVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVmIGluRXZlbnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzRXZlbnRJblF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5FdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzRXZlbnRJblF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5FdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudFF1ZXVlUmVmX21ldGhvZHNbXSA9IHsKLQl7IlBvc3RFdmVudFRvUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9Qb3N0RXZlbnRUb1F1ZXVlLCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlZiBpbkV2ZW50LCBTSW50MTYgaW5Qcmlvcml0eSkgLT4gTm9uZSIpfSwKLQl7IkZsdXNoRXZlbnRzTWF0Y2hpbmdMaXN0RnJvbVF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpbk51bVR5cGVzLCBFdmVudFR5cGVTcGVjIGluTGlzdCkgLT4gTm9uZSIpfSwKLQl7IkZsdXNoRXZlbnRRdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0ZsdXNoRXZlbnRRdWV1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0TnVtRXZlbnRzSW5RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0dldE51bUV2ZW50c0luUXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiUmVtb3ZlRXZlbnRGcm9tUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9SZW1vdmVFdmVudEZyb21RdWV1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCkgLT4gTm9uZSIpfSwKLQl7IklzRXZlbnRJblF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfSXNFdmVudEluUXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVmIGluRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJQb3N0RXZlbnRUb1F1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfUG9zdEV2ZW50VG9RdWV1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCwgU0ludDE2IGluUHJpb3JpdHkpIC0+IE5vbmUiKX0sCisgICAgeyJGbHVzaEV2ZW50c01hdGNoaW5nTGlzdEZyb21RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0ZsdXNoRXZlbnRzTWF0Y2hpbmdMaXN0RnJvbVF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaW5OdW1UeXBlcywgRXZlbnRUeXBlU3BlYyBpbkxpc3QpIC0+IE5vbmUiKX0sCisgICAgeyJGbHVzaEV2ZW50UXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9GbHVzaEV2ZW50UXVldWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE51bUV2ZW50c0luUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9HZXROdW1FdmVudHNJblF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IlJlbW92ZUV2ZW50RnJvbVF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfUmVtb3ZlRXZlbnRGcm9tUXVldWUsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVmIGluRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJJc0V2ZW50SW5RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0lzRXZlbnRJblF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlZiBpbkV2ZW50KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudFF1ZXVlUmVmX2dldHNldGxpc3QgTlVMTApAQCAtNjExLDYxICs2MTEsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlFdmVudFF1ZXVlUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRRdWV1ZVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudFF1ZXVlUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRXZlbnRRdWV1ZVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudFF1ZXVlUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRXZlbnRRdWV1ZVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBFdmVudFF1ZXVlUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50UXVldWVSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ2FyYm9uRXZ0LkV2ZW50UXVldWVSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihFdmVudFF1ZXVlUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRRdWV1ZVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBFdmVudFF1ZXVlUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBFdmVudFF1ZXVlUmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudFF1ZXVlUmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUV2ZW50UXVldWVSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRXZlbnRRdWV1ZVJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudFF1ZXVlUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlFdmVudFF1ZXVlUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUV2ZW50UXVldWVSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudFF1ZXVlUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ2FyYm9uRXZ0LkV2ZW50UXVldWVSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihFdmVudFF1ZXVlUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRRdWV1ZVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBFdmVudFF1ZXVlUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBFdmVudFF1ZXVlUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudFF1ZXVlUmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEV2ZW50UXVldWVSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRXZlbnRRdWV1ZVJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudFF1ZXVlUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBFdmVudFF1ZXVlUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEV2ZW50UXVldWVSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudFF1ZXVlUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudFF1ZXVlUmVmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNjc4LDUzICs2NzgsNTMgQEAKICNkZWZpbmUgRXZlbnRMb29wUmVmX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkV2ZW50TG9vcFJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZFdmVudExvb3BSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50TG9vcFJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUV2ZW50TG9vcFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50TG9vcFJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50TG9vcFJlZk9iamVjdDsKIAogUHlPYmplY3QgKkV2ZW50TG9vcFJlZl9OZXcoRXZlbnRMb29wUmVmIGl0c2VsZikKIHsKLQlFdmVudExvb3BSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEV2ZW50TG9vcFJlZk9iamVjdCwgJkV2ZW50TG9vcFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRMb29wUmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhFdmVudExvb3BSZWZPYmplY3QsICZFdmVudExvb3BSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRMb29wUmVmX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50TG9vcFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFFdmVudExvb3BSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRMb29wUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEV2ZW50TG9vcFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFFdmVudExvb3BSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRMb29wUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEV2ZW50TG9vcFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEV2ZW50TG9vcFJlZl9kZWFsbG9jKEV2ZW50TG9vcFJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRMb29wUmVmX1F1aXRFdmVudExvb3AoRXZlbnRMb29wUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUXVpdEV2ZW50TG9vcChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFF1aXRFdmVudExvb3AoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudExvb3BSZWZfbWV0aG9kc1tdID0gewotCXsiUXVpdEV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilFdmVudExvb3BSZWZfUXVpdEV2ZW50TG9vcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiUXVpdEV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilFdmVudExvb3BSZWZfUXVpdEV2ZW50TG9vcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudExvb3BSZWZfZ2V0c2V0bGlzdCBOVUxMCkBAIC03NDEsNjEgKzc0MSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50TG9vcFJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRMb29wUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRMb29wUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50TG9vcFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50TG9vcFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudExvb3BSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudExvb3BSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRMb29wUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50TG9vcFJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRMb29wUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRMb29wUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRMb29wUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50TG9vcFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRMb29wUmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudExvb3BSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRMb29wUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50TG9vcFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudExvb3BSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50TG9vcFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudExvb3BSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudExvb3BSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRMb29wUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRMb29wUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRMb29wUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50TG9vcFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRMb29wUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudExvb3BSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRMb29wUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50TG9vcFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudExvb3BSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50TG9vcFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudExvb3BSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudExvb3BSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudExvb3BSZWYgLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04MDgsNzEgKzgwOCw3MSBAQAogI2RlZmluZSBFdmVudExvb3BUaW1lclJlZl9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZFdmVudExvb3BUaW1lclJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZFdmVudExvb3BUaW1lclJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRXZlbnRMb29wVGltZXJSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlFdmVudExvb3BUaW1lclJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50TG9vcFRpbWVyUmVmIG9iX2l0c2VsZjsKIH0gRXZlbnRMb29wVGltZXJSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudExvb3BUaW1lclJlZl9OZXcoRXZlbnRMb29wVGltZXJSZWYgaXRzZWxmKQogewotCUV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudExvb3BUaW1lclJlZk9iamVjdCwgJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBFdmVudExvb3BUaW1lclJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRMb29wVGltZXJSZWZPYmplY3QsICZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBFdmVudExvb3BUaW1lclJlZl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudExvb3BUaW1lclJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFFdmVudExvb3BUaW1lclJlZl9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudExvb3BUaW1lclJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChFdmVudExvb3BUaW1lclJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFFdmVudExvb3BUaW1lclJlZl9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudExvb3BUaW1lclJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChFdmVudExvb3BUaW1lclJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEV2ZW50TG9vcFRpbWVyUmVmX2RlYWxsb2MoRXZlbnRMb29wVGltZXJSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50TG9vcFRpbWVyUmVmX1JlbW92ZUV2ZW50TG9vcFRpbWVyKEV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRXZlbnRMb29wVGltZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVFdmVudExvb3BUaW1lcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudExvb3BUaW1lclJlZl9TZXRFdmVudExvb3BUaW1lck5leHRGaXJlVGltZShFdmVudExvb3BUaW1lclJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlkb3VibGUgaW5OZXh0RmlyZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTmV4dEZpcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RXZlbnRMb29wVGltZXJOZXh0RmlyZVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OZXh0RmlyZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgZG91YmxlIGluTmV4dEZpcmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk5leHRGaXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmV4dEZpcmUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZlbnRMb29wVGltZXJSZWZfbWV0aG9kc1tdID0gewotCXsiUmVtb3ZlRXZlbnRMb29wVGltZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRMb29wVGltZXJSZWZfUmVtb3ZlRXZlbnRMb29wVGltZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50TG9vcFRpbWVyUmVmX1NldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lLCAxLAotCSBQeURvY19TVFIoIihkb3VibGUgaW5OZXh0RmlyZSkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlJlbW92ZUV2ZW50TG9vcFRpbWVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50TG9vcFRpbWVyUmVmX1JlbW92ZUV2ZW50TG9vcFRpbWVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRFdmVudExvb3BUaW1lck5leHRGaXJlVGltZSIsIChQeUNGdW5jdGlvbilFdmVudExvb3BUaW1lclJlZl9TZXRFdmVudExvb3BUaW1lck5leHRGaXJlVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZG91YmxlIGluTmV4dEZpcmUpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50TG9vcFRpbWVyUmVmX2dldHNldGxpc3QgTlVMTApAQCAtODg5LDYxICs4ODksNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudExvb3BUaW1lclJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRMb29wVGltZXJSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBFdmVudExvb3BUaW1lclJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudExvb3BUaW1lclJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50TG9vcFRpbWVyUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRXZlbnRMb29wVGltZXJSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRMb29wVGltZXJSZWZfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRXZlbnRMb29wVGltZXJSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ2FyYm9uRXZ0LkV2ZW50TG9vcFRpbWVyUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRMb29wVGltZXJSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBFdmVudExvb3BUaW1lclJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBFdmVudExvb3BUaW1lclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRMb29wVGltZXJSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEV2ZW50TG9vcFRpbWVyUmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUV2ZW50TG9vcFRpbWVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50TG9vcFRpbWVyUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUV2ZW50TG9vcFRpbWVyUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlFdmVudExvb3BUaW1lclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudExvb3BUaW1lclJlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUV2ZW50TG9vcFRpbWVyUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ2FyYm9uRXZ0LkV2ZW50TG9vcFRpbWVyUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRMb29wVGltZXJSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBFdmVudExvb3BUaW1lclJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBFdmVudExvb3BUaW1lclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRMb29wVGltZXJSZWZfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEV2ZW50TG9vcFRpbWVyUmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBFdmVudExvb3BUaW1lclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudExvb3BUaW1lclJlZl90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRMb29wVGltZXJSZWYgLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtOTU2LDExNiArOTU2LDExNiBAQAogI2RlZmluZSBFdmVudEhhbmRsZXJSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRIYW5kbGVyUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50SGFuZGxlclJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRXZlbnRIYW5kbGVyUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRIYW5kbGVyUmVmIG9iX2l0c2VsZjsKLQlQeU9iamVjdCAqb2JfY2FsbGJhY2s7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50SGFuZGxlclJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3QgKm9iX2NhbGxiYWNrOwogfSBFdmVudEhhbmRsZXJSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJSZWZfTmV3KEV2ZW50SGFuZGxlclJlZiBpdHNlbGYpCiB7Ci0JRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudEhhbmRsZXJSZWZPYmplY3QsICZFdmVudEhhbmRsZXJSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2NhbGxiYWNrID0gTlVMTDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhFdmVudEhhbmRsZXJSZWZPYmplY3QsICZFdmVudEhhbmRsZXJSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2NhbGxiYWNrID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBFdmVudEhhbmRsZXJSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRIYW5kbGVyUmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50SGFuZGxlclJlZl9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudEhhbmRsZXJSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50SGFuZGxlclJlZl9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudEhhbmRsZXJSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRIYW5kbGVyUmVmX2RlYWxsb2MoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9pdHNlbGYgIT0gTlVMTCkgewotCQlSZW1vdmVFdmVudEhhbmRsZXIoc2VsZi0+b2JfaXRzZWxmKTsKLQkJUHlfREVDUkVGKHNlbGYtPm9iX2NhbGxiYWNrKTsKLQl9Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfaXRzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgUmVtb3ZlRXZlbnRIYW5kbGVyKHNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5vYl9jYWxsYmFjayk7CisgICAgfQorICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIYW5kbGVyUmVmX0FkZEV2ZW50VHlwZXNUb0hhbmRsZXIoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpbk51bVR5cGVzOwotCUV2ZW50VHlwZVNwZWMgaW5MaXN0OwotCWlmIChfc2VsZi0+b2JfaXRzZWxmID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKENhcmJvbkV2ZW50c19FcnJvciwgIkhhbmRsZXIgaGFzIGJlZW4gcmVtb3ZlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTnVtVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluTGlzdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRFdmVudFR5cGVzVG9IYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5MaXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5OdW1UeXBlczsKKyAgICBFdmVudFR5cGVTcGVjIGluTGlzdDsKKyAgICBpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDYXJib25FdmVudHNfRXJyb3IsICJIYW5kbGVyIGhhcyBiZWVuIHJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpbkxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkRXZlbnRUeXBlc1RvSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTGlzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIYW5kbGVyUmVmX1JlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlcihFdmVudEhhbmRsZXJSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluTnVtVHlwZXM7Ci0JRXZlbnRUeXBlU3BlYyBpbkxpc3Q7Ci0JaWYgKF9zZWxmLT5vYl9pdHNlbGYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoQ2FyYm9uRXZlbnRzX0Vycm9yLCAiSGFuZGxlciBoYXMgYmVlbiByZW1vdmVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbk51bVR5cGVzOworICAgIEV2ZW50VHlwZVNwZWMgaW5MaXN0OworICAgIGlmIChfc2VsZi0+b2JfaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENhcmJvbkV2ZW50c19FcnJvciwgIkhhbmRsZXIgaGFzIGJlZW4gcmVtb3ZlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluTGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVFdmVudFR5cGVzRnJvbUhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5MaXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJSZWZfUmVtb3ZlRXZlbnRIYW5kbGVyKEV2ZW50SGFuZGxlclJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NTdGF0dXMgX2VycjsKLQlpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2FyYm9uRXZlbnRzX0Vycm9yLCAiSGFuZGxlciBoYXMgYmVlbiByZW1vdmVkIik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JUHlfREVDUkVGKF9zZWxmLT5vYl9jYWxsYmFjayk7Ci0JX3NlbGYtPm9iX2NhbGxiYWNrID0gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDYXJib25FdmVudHNfRXJyb3IsICJIYW5kbGVyIGhhcyBiZWVuIHJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgUHlfREVDUkVGKF9zZWxmLT5vYl9jYWxsYmFjayk7CisgICAgX3NlbGYtPm9iX2NhbGxiYWNrID0gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudEhhbmRsZXJSZWZfbWV0aG9kc1tdID0gewotCXsiQWRkRXZlbnRUeXBlc1RvSGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudEhhbmRsZXJSZWZfQWRkRXZlbnRUeXBlc1RvSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0KSAtPiBOb25lIil9LAotCXsiUmVtb3ZlRXZlbnRUeXBlc0Zyb21IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlclJlZl9SZW1vdmVFdmVudFR5cGVzRnJvbUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpbk51bVR5cGVzLCBFdmVudFR5cGVTcGVjIGluTGlzdCkgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZUV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudEhhbmRsZXJSZWZfUmVtb3ZlRXZlbnRIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJBZGRFdmVudFR5cGVzVG9IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlclJlZl9BZGRFdmVudFR5cGVzVG9IYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaW5OdW1UeXBlcywgRXZlbnRUeXBlU3BlYyBpbkxpc3QpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVFdmVudFR5cGVzRnJvbUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRIYW5kbGVyUmVmX1JlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0KSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlclJlZl9SZW1vdmVFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgRXZlbnRIYW5kbGVyUmVmX2dldHNldGxpc3QgTlVMTApAQCAtMTA4Miw2MSArMTA4Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50SGFuZGxlclJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRIYW5kbGVyUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRIYW5kbGVyUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50SGFuZGxlclJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50SGFuZGxlclJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudEhhbmRsZXJSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudEhhbmRsZXJSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRIYW5kbGVyUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50SGFuZGxlclJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRIYW5kbGVyUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRIYW5kbGVyUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRIYW5kbGVyUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50SGFuZGxlclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRIYW5kbGVyUmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudEhhbmRsZXJSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRIYW5kbGVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50SGFuZGxlclJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudEhhbmRsZXJSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50SGFuZGxlclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudEhhbmRsZXJSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudEhhbmRsZXJSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRIYW5kbGVyUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRIYW5kbGVyUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRIYW5kbGVyUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50SGFuZGxlclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRIYW5kbGVyUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudEhhbmRsZXJSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRIYW5kbGVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50SGFuZGxlclJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudEhhbmRsZXJSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50SGFuZGxlclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudEhhbmRsZXJSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudEhhbmRsZXJSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRIYW5kbGVyUmVmIC0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMTQ5LDU2ICsxMTQ5LDU2IEBACiAjZGVmaW5lIEV2ZW50SGFuZGxlckNhbGxSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRIYW5kbGVyQ2FsbFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50SGFuZGxlckNhbGxSZWYgb2JfaXRzZWxmOwogfSBFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqRXZlbnRIYW5kbGVyQ2FsbFJlZl9OZXcoRXZlbnRIYW5kbGVyQ2FsbFJlZiBpdHNlbGYpCiB7Ci0JRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCwgJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QsICZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEV2ZW50SGFuZGxlckNhbGxSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRIYW5kbGVyQ2FsbFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFFdmVudEhhbmRsZXJDYWxsUmVmX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SGFuZGxlckNhbGxSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFFdmVudEhhbmRsZXJDYWxsUmVmX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SGFuZGxlckNhbGxSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEV2ZW50SGFuZGxlckNhbGxSZWZfZGVhbGxvYyhFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJDYWxsUmVmX0NhbGxOZXh0RXZlbnRIYW5kbGVyKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRSZWYgaW5FdmVudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX0NvbnZlcnQsICZpbkV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENhbGxOZXh0RXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXZlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDYWxsTmV4dEV2ZW50SGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEV2ZW50SGFuZGxlckNhbGxSZWZfbWV0aG9kc1tdID0gewotCXsiQ2FsbE5leHRFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRIYW5kbGVyQ2FsbFJlZl9DYWxsTmV4dEV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkNhbGxOZXh0RXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlckNhbGxSZWZfQ2FsbE5leHRFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVmIGluRXZlbnQpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50SGFuZGxlckNhbGxSZWZfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xMjE1LDYxICsxMjE1LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRIYW5kbGVyQ2FsbFJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEV2ZW50SGFuZGxlckNhbGxSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRIYW5kbGVyQ2FsbFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRIYW5kbGVyQ2FsbFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NhcmJvbkV2dC5FdmVudEhhbmRsZXJDYWxsUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEV2ZW50SGFuZGxlckNhbGxSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlFdmVudEhhbmRsZXJDYWxsUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50SGFuZGxlckNhbGxSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudEhhbmRsZXJDYWxsUmVmX3RwX25ldywgLyogdHBfbmV3ICovCi0JRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NhcmJvbkV2dC5FdmVudEhhbmRsZXJDYWxsUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEV2ZW50SGFuZGxlckNhbGxSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBFdmVudEhhbmRsZXJDYWxsUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50SGFuZGxlckNhbGxSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudEhhbmRsZXJDYWxsUmVmX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRIYW5kbGVyQ2FsbFJlZiAtLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEyODIsNzggKzEyODIsNzggQEAKICNkZWZpbmUgRXZlbnRUYXJnZXRSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRUYXJnZXRSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRXZlbnRUYXJnZXRSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50VGFyZ2V0UmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRUYXJnZXRSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBFdmVudFRhcmdldFJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50VGFyZ2V0UmVmT2JqZWN0OwogCiBQeU9iamVjdCAqRXZlbnRUYXJnZXRSZWZfTmV3KEV2ZW50VGFyZ2V0UmVmIGl0c2VsZikKIHsKLQlFdmVudFRhcmdldFJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRUYXJnZXRSZWZPYmplY3QsICZFdmVudFRhcmdldFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRUYXJnZXRSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50VGFyZ2V0UmVmT2JqZWN0LCAmRXZlbnRUYXJnZXRSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRUYXJnZXRSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRUYXJnZXRSZWYgKnBfaXRzZWxmKQogewotCWlmICghRXZlbnRUYXJnZXRSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRUYXJnZXRSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRUYXJnZXRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRXZlbnRUYXJnZXRSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRUYXJnZXRSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRUYXJnZXRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBFdmVudFRhcmdldFJlZl9kZWFsbG9jKEV2ZW50VGFyZ2V0UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFRhcmdldFJlZl9JbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIoRXZlbnRUYXJnZXRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRUYXJnZXRSZWZfSW5zdGFsbEV2ZW50SGFuZGxlcihFdmVudFRhcmdldFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JRXZlbnRUeXBlU3BlYyBpblNwZWM7Ci0JUHlPYmplY3QgKmNhbGxiYWNrOwotCUV2ZW50SGFuZGxlclJlZiBvdXRSZWY7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBFdmVudFR5cGVTcGVjIGluU3BlYzsKKyAgICBQeU9iamVjdCAqY2FsbGJhY2s7CisgICAgRXZlbnRIYW5kbGVyUmVmIG91dFJlZjsKKyAgICBPU1N0YXR1cyBfZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPIiwgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5TcGVjLCAmY2FsbGJhY2spKQotCSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPIiwgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5TcGVjLCAmY2FsbGJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCV9lcnIgPSBJbnN0YWxsRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsIG15RXZlbnRIYW5kbGVyVVBQLCAxLCAmaW5TcGVjLCAodm9pZCAqKWNhbGxiYWNrLCAmb3V0UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9lcnIgPSBJbnN0YWxsRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsIG15RXZlbnRIYW5kbGVyVVBQLCAxLCAmaW5TcGVjLCAodm9pZCAqKWNhbGxiYWNrLCAmb3V0UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogCi0JX3JlcyA9IEV2ZW50SGFuZGxlclJlZl9OZXcob3V0UmVmKTsKLQlpZiAoX3JlcyAhPSBOVUxMKSB7Ci0JICAgICAgICAoKEV2ZW50SGFuZGxlclJlZk9iamVjdCopX3JlcyktPm9iX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci0JICAgICAgICBQeV9JTkNSRUYoY2FsbGJhY2spOwotCX0KLQlyZXR1cm4gX3JlczsKKyAgICBfcmVzID0gRXZlbnRIYW5kbGVyUmVmX05ldyhvdXRSZWYpOworICAgIGlmIChfcmVzICE9IE5VTEwpIHsKKyAgICAgICAgKChFdmVudEhhbmRsZXJSZWZPYmplY3QqKV9yZXMpLT5vYl9jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBQeV9JTkNSRUYoY2FsbGJhY2spOworICAgIH0KKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEV2ZW50VGFyZ2V0UmVmX21ldGhvZHNbXSA9IHsKLQl7Ikluc3RhbGxTdGFuZGFyZEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudFRhcmdldFJlZl9JbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ikluc3RhbGxFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRUYXJnZXRSZWZfSW5zdGFsbEV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRUeXBlU3BlYyBpblNwZWMsIE1ldGhvZCBjYWxsYmFjaykgLT4gKEV2ZW50SGFuZGxlclJlZiBvdXRSZWYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiSW5zdGFsbFN0YW5kYXJkRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50VGFyZ2V0UmVmX0luc3RhbGxTdGFuZGFyZEV2ZW50SGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSW5zdGFsbEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudFRhcmdldFJlZl9JbnN0YWxsRXZlbnRIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFR5cGVTcGVjIGluU3BlYywgTWV0aG9kIGNhbGxiYWNrKSAtPiAoRXZlbnRIYW5kbGVyUmVmIG91dFJlZikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50VGFyZ2V0UmVmX2dldHNldGxpc3QgTlVMTApAQCAtMTM3MCw2MSArMTM3MCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50VGFyZ2V0UmVmX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlFdmVudFRhcmdldFJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEV2ZW50VGFyZ2V0UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50VGFyZ2V0UmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRXZlbnRUYXJnZXRSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRUYXJnZXRSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudFRhcmdldFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBFdmVudFRhcmdldFJlZl90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBFdmVudFRhcmdldFJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRUYXJnZXRSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihFdmVudFRhcmdldFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEV2ZW50VGFyZ2V0UmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50VGFyZ2V0UmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBFdmVudFRhcmdldFJlZl9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRXZlbnRUYXJnZXRSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRUYXJnZXRSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRXZlbnRUYXJnZXRSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRXZlbnRUYXJnZXRSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50VGFyZ2V0UmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUV2ZW50VGFyZ2V0UmVmX3RwX25ldywgLyogdHBfbmV3ICovCi0JRXZlbnRUYXJnZXRSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRUYXJnZXRSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihFdmVudFRhcmdldFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEV2ZW50VGFyZ2V0UmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50VGFyZ2V0UmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBFdmVudFRhcmdldFJlZl9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgRXZlbnRUYXJnZXRSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRUYXJnZXRSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRXZlbnRUYXJnZXRSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgRXZlbnRUYXJnZXRSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50VGFyZ2V0UmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEV2ZW50VGFyZ2V0UmVmX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgRXZlbnRUYXJnZXRSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIEV2ZW50VGFyZ2V0UmVmIC0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNDM3LDUzICsxNDM3LDUzIEBACiAjZGVmaW5lIEV2ZW50SG90S2V5UmVmX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkV2ZW50SG90S2V5UmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50SG90S2V5UmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBFdmVudEhvdEtleVJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUV2ZW50SG90S2V5UmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRXZlbnRIb3RLZXlSZWYgb2JfaXRzZWxmOwogfSBFdmVudEhvdEtleVJlZk9iamVjdDsKIAogUHlPYmplY3QgKkV2ZW50SG90S2V5UmVmX05ldyhFdmVudEhvdEtleVJlZiBpdHNlbGYpCiB7Ci0JRXZlbnRIb3RLZXlSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEV2ZW50SG90S2V5UmVmT2JqZWN0LCAmRXZlbnRIb3RLZXlSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEV2ZW50SG90S2V5UmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhFdmVudEhvdEtleVJlZk9iamVjdCwgJkV2ZW50SG90S2V5UmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEV2ZW50SG90S2V5UmVmX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50SG90S2V5UmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50SG90S2V5UmVmX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SG90S2V5UmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEV2ZW50SG90S2V5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50SG90S2V5UmVmX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SG90S2V5UmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEV2ZW50SG90S2V5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRIb3RLZXlSZWZfZGVhbGxvYyhFdmVudEhvdEtleVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIb3RLZXlSZWZfVW5yZWdpc3RlckV2ZW50SG90S2V5KEV2ZW50SG90S2V5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3RlckV2ZW50SG90S2V5KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVW5yZWdpc3RlckV2ZW50SG90S2V5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZlbnRIb3RLZXlSZWZfbWV0aG9kc1tdID0gewotCXsiVW5yZWdpc3RlckV2ZW50SG90S2V5IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SG90S2V5UmVmX1VucmVnaXN0ZXJFdmVudEhvdEtleSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiVW5yZWdpc3RlckV2ZW50SG90S2V5IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SG90S2V5UmVmX1VucmVnaXN0ZXJFdmVudEhvdEtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudEhvdEtleVJlZl9nZXRzZXRsaXN0IE5VTEwKQEAgLTE1MDAsNjEgKzE1MDAsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhvdEtleVJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRIb3RLZXlSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBFdmVudEhvdEtleVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudEhvdEtleVJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50SG90S2V5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50SG90S2V5UmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRXZlbnRIb3RLZXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRIb3RLZXlSZWZfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRXZlbnRIb3RLZXlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ2FyYm9uRXZ0LkV2ZW50SG90S2V5UmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRIb3RLZXlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBFdmVudEhvdEtleVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBFdmVudEhvdEtleVJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRIb3RLZXlSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEV2ZW50SG90S2V5UmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUV2ZW50SG90S2V5UmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50SG90S2V5UmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUV2ZW50SG90S2V5UmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlFdmVudEhvdEtleVJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudEhvdEtleVJlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUV2ZW50SG90S2V5UmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ2FyYm9uRXZ0LkV2ZW50SG90S2V5UmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRIb3RLZXlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBFdmVudEhvdEtleVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBFdmVudEhvdEtleVJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRIb3RLZXlSZWZfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEV2ZW50SG90S2V5UmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEV2ZW50SG90S2V5UmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50SG90S2V5UmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEV2ZW50SG90S2V5UmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBFdmVudEhvdEtleVJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudEhvdEtleVJlZl90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEV2ZW50SG90S2V5UmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudEhvdEtleVJlZiAtLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTU2Miw1NzcgKzE1NjIsNTc3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudExvb3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50TG9vcFJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnJlbnRFdmVudExvb3AoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50TG9vcFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEN1cnJlbnRFdmVudExvb3AoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldE1haW5FdmVudExvb3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50TG9vcFJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1haW5FdmVudExvb3AoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50TG9vcFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1haW5FdmVudExvb3AoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1J1bkN1cnJlbnRFdmVudExvb3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JZG91YmxlIGluVGltZW91dDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSdW5DdXJyZW50RXZlbnRMb29wKGluVGltZW91dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgZG91YmxlIGluVGltZW91dDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSdW5DdXJyZW50RXZlbnRMb29wKGluVGltZW91dCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1JlY2VpdmVOZXh0RXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluTnVtVHlwZXM7Ci0JRXZlbnRUeXBlU3BlYyBpbkxpc3Q7Ci0JZG91YmxlIGluVGltZW91dDsKLQlCb29sZWFuIGluUHVsbEV2ZW50OwotCUV2ZW50UmVmIG91dEV2ZW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmRiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTnVtVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluTGlzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUHVsbEV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlY2VpdmVOZXh0RXZlbnQoaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5MaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluVGltZW91dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblB1bGxFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RXZlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9OZXcsIG91dEV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5OdW1UeXBlczsKKyAgICBFdmVudFR5cGVTcGVjIGluTGlzdDsKKyAgICBkb3VibGUgaW5UaW1lb3V0OworICAgIEJvb2xlYW4gaW5QdWxsRXZlbnQ7CisgICAgRXZlbnRSZWYgb3V0RXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mZGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QdWxsRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVjZWl2ZU5leHRFdmVudChpbk51bVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHVsbEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRFdmVudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgb3V0RXZlbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRRdWV1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRRdWV1ZVJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnJlbnRFdmVudFF1ZXVlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlUmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRRdWV1ZVJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEN1cnJlbnRFdmVudFF1ZXVlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlUmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50UXVldWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50UXVldWVSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNYWluRXZlbnRRdWV1ZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRRdWV1ZVJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50UXVldWVSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNYWluRXZlbnRRdWV1ZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRRdWV1ZVJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWRvdWJsZSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnJlbnRFdmVudFRpbWUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZG91YmxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q3VycmVudEV2ZW50VGltZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19UcmFja01vdXNlTG9jYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JR3JhZlB0ciBpblBvcnQ7Ci0JUG9pbnQgb3V0UHQ7Ci0JVUludDE2IG91dFJlc3VsdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmluUG9ydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcmFja01vdXNlTG9jYXRpb24oaW5Qb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFB0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBvdXRQdCwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEdyYWZQdHIgaW5Qb3J0OworICAgIFBvaW50IG91dFB0OworICAgIFVJbnQxNiBvdXRSZXN1bHQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZpblBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVHJhY2tNb3VzZUxvY2F0aW9uKGluUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgb3V0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JR3JhZlB0ciBpblBvcnQ7Ci0JT3B0aW9uQml0cyBpbk9wdGlvbnM7Ci0JZG91YmxlIGluVGltZW91dDsKLQlQb2ludCBvdXRQdDsKLQlVSW50MzIgb3V0TW9kaWZpZXJzOwotCVVJbnQxNiBvdXRSZXN1bHQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsZCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmluUG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9ucyhpblBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaW1lb3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbEgiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIG91dFB0LAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEdyYWZQdHIgaW5Qb3J0OworICAgIE9wdGlvbkJpdHMgaW5PcHRpb25zOworICAgIGRvdWJsZSBpblRpbWVvdXQ7CisgICAgUG9pbnQgb3V0UHQ7CisgICAgVUludDMyIG91dE1vZGlmaWVyczsKKyAgICBVSW50MTYgb3V0UmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZpblBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRpbWVvdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMoaW5Qb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBvdXRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfVHJhY2tNb3VzZVJlZ2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlHcmFmUHRyIGluUG9ydDsKLQlSZ25IYW5kbGUgaW5SZWdpb247Ci0JQm9vbGVhbiBpb1dhc0luUmduOwotCVVJbnQxNiBvdXRSZXN1bHQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZpblBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5SZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpb1dhc0luUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRyYWNrTW91c2VSZWdpb24oaW5Qb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpb1dhc0luUmduLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBpb1dhc0luUmduLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgR3JhZlB0ciBpblBvcnQ7CisgICAgUmduSGFuZGxlIGluUmVnaW9uOworICAgIEJvb2xlYW4gaW9XYXNJblJnbjsKKyAgICBVSW50MTYgb3V0UmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmaW5Qb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9XYXNJblJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja01vdXNlUmVnaW9uKGluUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9XYXNJblJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9XYXNJblJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRMYXN0VXNlckV2ZW50VGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZG91YmxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGFzdFVzZXJFdmVudFRpbWUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZG91YmxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGFzdFVzZXJFdmVudFRpbWUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfSXNNb3VzZUNvYWxlc2NpbmdFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNb3VzZUNvYWxlc2NpbmdFbmFibGVkKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc01vdXNlQ29hbGVzY2luZ0VuYWJsZWQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGluTmV3U3RhdGU7Ci0JQm9vbGVhbiBvdXRPbGRTdGF0ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTmV3U3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZChpbk5ld1N0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRPbGRTdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0T2xkU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5OZXdTdGF0ZTsKKyAgICBCb29sZWFuIG91dE9sZFN0YXRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5OZXdTdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkKGluTmV3U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE9sZFN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRPbGRTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0V2ZW50VGFyZ2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFRhcmdldFJlZiBfcnY7Ci0JV2luZG93UHRyIGluV2luZG93OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdpbmRvd0V2ZW50VGFyZ2V0KGluV2luZG93KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRXaW5kb3dFdmVudFRhcmdldChpbldpbmRvdyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldENvbnRyb2xFdmVudFRhcmdldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRUYXJnZXRSZWYgX3J2OwotCUNvbnRyb2xIYW5kbGUgaW5Db250cm9sOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkNvbnRyb2wpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sRXZlbnRUYXJnZXQoaW5Db250cm9sKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIENvbnRyb2xIYW5kbGUgaW5Db250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkNvbnRyb2wpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sRXZlbnRUYXJnZXQoaW5Db250cm9sKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0TWVudUV2ZW50VGFyZ2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFRhcmdldFJlZiBfcnY7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51RXZlbnRUYXJnZXQoaW5NZW51KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5NZW51KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudUV2ZW50VGFyZ2V0KGluTWVudSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50VGFyZ2V0UmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudFRhcmdldFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0VXNlckZvY3VzRXZlbnRUYXJnZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50VGFyZ2V0UmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VXNlckZvY3VzRXZlbnRUYXJnZXQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRVc2VyRm9jdXNFdmVudFRhcmdldCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRFdmVudERpc3BhdGNoZXJUYXJnZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50VGFyZ2V0UmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50VGFyZ2V0UmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1J1bkFwcGxpY2F0aW9uRXZlbnRMb29wKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUnVuQXBwbGljYXRpb25FdmVudExvb3AoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSdW5BcHBsaWNhdGlvbkV2ZW50TG9vcCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19SdW5BcHBNb2RhbExvb3BGb3JXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSdW5BcHBNb2RhbExvb3BGb3JXaW5kb3coaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUnVuQXBwTW9kYWxMb29wRm9yV2luZG93KGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfUXVpdEFwcE1vZGFsTG9vcEZvcldpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFF1aXRBcHBNb2RhbExvb3BGb3JXaW5kb3coaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUXVpdEFwcE1vZGFsTG9vcEZvcldpbmRvdyhpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0JlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEJlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyhpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCZWdpbkFwcE1vZGFsU3RhdGVGb3JXaW5kb3coaW5XaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19FbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW5kQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyhpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93KGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfU2V0VXNlckZvY3VzV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VXNlckZvY3VzV2luZG93KGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFVzZXJGb2N1c1dpbmRvdyhpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldFVzZXJGb2N1c1dpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VXNlckZvY3VzV2luZG93KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRVc2VyRm9jdXNXaW5kb3coKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0RlZmF1bHRCdXR0b24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgaW5Db250cm9sOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dEZWZhdWx0QnV0dG9uKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgaW5Db250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dEZWZhdWx0QnV0dG9uKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0NhbmNlbEJ1dHRvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBpbkNvbnRyb2w7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Db250cm9sKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0NhbmNlbEJ1dHRvbihpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgaW5Db250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dDYW5jZWxCdXR0b24oaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRXaW5kb3dEZWZhdWx0QnV0dG9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0RlZmF1bHRCdXR0b24oaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dEZWZhdWx0QnV0dG9uKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0NhbmNlbEJ1dHRvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dDYW5jZWxCdXR0b24oaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd0NhbmNlbEJ1dHRvbihpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1JlZ2lzdGVyRXZlbnRIb3RLZXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluSG90S2V5Q29kZTsKLQlVSW50MzIgaW5Ib3RLZXlNb2RpZmllcnM7Ci0JRXZlbnRIb3RLZXlJRCBpbkhvdEtleUlEOwotCUV2ZW50VGFyZ2V0UmVmIGluVGFyZ2V0OwotCU9wdGlvbkJpdHMgaW5PcHRpb25zOwotCUV2ZW50SG90S2V5UmVmIG91dFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG90S2V5Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG90S2V5TW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudEhvdEtleUlEX0NvbnZlcnQsICZpbkhvdEtleUlELAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9Db252ZXJ0LCAmaW5UYXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVnaXN0ZXJFdmVudEhvdEtleShpbkhvdEtleUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Ib3RLZXlNb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Ib3RLZXlJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50SG90S2V5UmVmX05ldywgb3V0UmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5Ib3RLZXlDb2RlOworICAgIFVJbnQzMiBpbkhvdEtleU1vZGlmaWVyczsKKyAgICBFdmVudEhvdEtleUlEIGluSG90S2V5SUQ7CisgICAgRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQ7CisgICAgT3B0aW9uQml0cyBpbk9wdGlvbnM7CisgICAgRXZlbnRIb3RLZXlSZWYgb3V0UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3RLZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3RLZXlNb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SG90S2V5SURfQ29udmVydCwgJmluSG90S2V5SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX0NvbnZlcnQsICZpblRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWdpc3RlckV2ZW50SG90S2V5KGluSG90S2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhvdEtleU1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhvdEtleUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIb3RLZXlSZWZfTmV3LCBvdXRSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ2FyYm9uRXZlbnRzX21ldGhvZHNbXSA9IHsKLQl7IkdldEN1cnJlbnRFdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudExvb3AsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TG9vcFJlZiBfcnYpIil9LAotCXsiR2V0TWFpbkV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50TG9vcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRMb29wUmVmIF9ydikiKX0sCi0JeyJSdW5DdXJyZW50RXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SdW5DdXJyZW50RXZlbnRMb29wLCAxLAotCSBQeURvY19TVFIoIihkb3VibGUgaW5UaW1lb3V0KSAtPiBOb25lIil9LAotCXsiUmVjZWl2ZU5leHRFdmVudCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUmVjZWl2ZU5leHRFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0LCBkb3VibGUgaW5UaW1lb3V0LCBCb29sZWFuIGluUHVsbEV2ZW50KSAtPiAoRXZlbnRSZWYgb3V0RXZlbnQpIil9LAotCXsiR2V0Q3VycmVudEV2ZW50UXVldWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFF1ZXVlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChFdmVudFF1ZXVlUmVmIF9ydikiKX0sCi0JeyJHZXRNYWluRXZlbnRRdWV1ZSIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50UXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50UXVldWVSZWYgX3J2KSIpfSwKLQl7IkdldEN1cnJlbnRFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGRvdWJsZSBfcnYpIil9LAotCXsiVHJhY2tNb3VzZUxvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19UcmFja01vdXNlTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYWZQdHIgaW5Qb3J0KSAtPiAoUG9pbnQgb3V0UHQsIFVJbnQxNiBvdXRSZXN1bHQpIil9LAotCXsiVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zLCAxLAotCSBQeURvY19TVFIoIihHcmFmUHRyIGluUG9ydCwgT3B0aW9uQml0cyBpbk9wdGlvbnMsIGRvdWJsZSBpblRpbWVvdXQpIC0+IChQb2ludCBvdXRQdCwgVUludDMyIG91dE1vZGlmaWVycywgVUludDE2IG91dFJlc3VsdCkiKX0sCi0JeyJUcmFja01vdXNlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19UcmFja01vdXNlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihHcmFmUHRyIGluUG9ydCwgUmduSGFuZGxlIGluUmVnaW9uLCBCb29sZWFuIGlvV2FzSW5SZ24pIC0+IChCb29sZWFuIGlvV2FzSW5SZ24sIFVJbnQxNiBvdXRSZXN1bHQpIil9LAotCXsiR2V0TGFzdFVzZXJFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldExhc3RVc2VyRXZlbnRUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChkb3VibGUgX3J2KSIpfSwKLQl7IklzTW91c2VDb2FsZXNjaW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfSXNNb3VzZUNvYWxlc2NpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19TZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluTmV3U3RhdGUpIC0+IChCb29sZWFuIG91dE9sZFN0YXRlKSIpfSwKLQl7IkdldFdpbmRvd0V2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRXaW5kb3dFdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKLQl7IkdldENvbnRyb2xFdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0Q29udHJvbEV2ZW50VGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIihDb250cm9sSGFuZGxlIGluQ29udHJvbCkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCi0JeyJHZXRNZW51RXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldE1lbnVFdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAotCXsiR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKLQl7IkdldFVzZXJGb2N1c0V2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRVc2VyRm9jdXNFdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKLQl7IkdldEV2ZW50RGlzcGF0Y2hlclRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAotCXsiUnVuQXBwbGljYXRpb25FdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1J1bkFwcGxpY2F0aW9uRXZlbnRMb29wLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJRdWl0QXBwbGljYXRpb25FdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1F1aXRBcHBsaWNhdGlvbkV2ZW50TG9vcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUnVuQXBwTW9kYWxMb29wRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SdW5BcHBNb2RhbExvb3BGb3JXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlF1aXRBcHBNb2RhbExvb3BGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1F1aXRBcHBNb2RhbExvb3BGb3JXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkJlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfQmVnaW5BcHBNb2RhbFN0YXRlRm9yV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJFbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19FbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJTZXRVc2VyRm9jdXNXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1NldFVzZXJGb2N1c1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiR2V0VXNlckZvY3VzV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRVc2VyRm9jdXNXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiU2V0V2luZG93RGVmYXVsdEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0V2luZG93RGVmYXVsdEJ1dHRvbiwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSGFuZGxlIGluQ29udHJvbCkgLT4gTm9uZSIpfSwKLQl7IlNldFdpbmRvd0NhbmNlbEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0V2luZG93Q2FuY2VsQnV0dG9uLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xIYW5kbGUgaW5Db250cm9sKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93RGVmYXVsdEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0V2luZG93RGVmYXVsdEJ1dHRvbiwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkdldFdpbmRvd0NhbmNlbEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0V2luZG93Q2FuY2VsQnV0dG9uLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiUmVnaXN0ZXJFdmVudEhvdEtleSIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUmVnaXN0ZXJFdmVudEhvdEtleSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGluSG90S2V5Q29kZSwgVUludDMyIGluSG90S2V5TW9kaWZpZXJzLCBFdmVudEhvdEtleUlEIGluSG90S2V5SUQsIEV2ZW50VGFyZ2V0UmVmIGluVGFyZ2V0LCBPcHRpb25CaXRzIGluT3B0aW9ucykgLT4gKEV2ZW50SG90S2V5UmVmIG91dFJlZikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJHZXRDdXJyZW50RXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRMb29wLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChFdmVudExvb3BSZWYgX3J2KSIpfSwKKyAgICB7IkdldE1haW5FdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldE1haW5FdmVudExvb3AsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TG9vcFJlZiBfcnYpIil9LAorICAgIHsiUnVuQ3VycmVudEV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUnVuQ3VycmVudEV2ZW50TG9vcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZG91YmxlIGluVGltZW91dCkgLT4gTm9uZSIpfSwKKyAgICB7IlJlY2VpdmVOZXh0RXZlbnQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1JlY2VpdmVOZXh0RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpbk51bVR5cGVzLCBFdmVudFR5cGVTcGVjIGluTGlzdCwgZG91YmxlIGluVGltZW91dCwgQm9vbGVhbiBpblB1bGxFdmVudCkgLT4gKEV2ZW50UmVmIG91dEV2ZW50KSIpfSwKKyAgICB7IkdldEN1cnJlbnRFdmVudFF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRRdWV1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRRdWV1ZVJlZiBfcnYpIil9LAorICAgIHsiR2V0TWFpbkV2ZW50UXVldWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldE1haW5FdmVudFF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChFdmVudFF1ZXVlUmVmIF9ydikiKX0sCisgICAgeyJHZXRDdXJyZW50RXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChkb3VibGUgX3J2KSIpfSwKKyAgICB7IlRyYWNrTW91c2VMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfVHJhY2tNb3VzZUxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFmUHRyIGluUG9ydCkgLT4gKFBvaW50IG91dFB0LCBVSW50MTYgb3V0UmVzdWx0KSIpfSwKKyAgICB7IlRyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19UcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhZlB0ciBpblBvcnQsIE9wdGlvbkJpdHMgaW5PcHRpb25zLCBkb3VibGUgaW5UaW1lb3V0KSAtPiAoUG9pbnQgb3V0UHQsIFVJbnQzMiBvdXRNb2RpZmllcnMsIFVJbnQxNiBvdXRSZXN1bHQpIil9LAorICAgIHsiVHJhY2tNb3VzZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfVHJhY2tNb3VzZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhZlB0ciBpblBvcnQsIFJnbkhhbmRsZSBpblJlZ2lvbiwgQm9vbGVhbiBpb1dhc0luUmduKSAtPiAoQm9vbGVhbiBpb1dhc0luUmduLCBVSW50MTYgb3V0UmVzdWx0KSIpfSwKKyAgICB7IkdldExhc3RVc2VyRXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRMYXN0VXNlckV2ZW50VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCisgICAgeyJJc01vdXNlQ29hbGVzY2luZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0lzTW91c2VDb2FsZXNjaW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbk5ld1N0YXRlKSAtPiAoQm9vbGVhbiBvdXRPbGRTdGF0ZSkiKX0sCisgICAgeyJHZXRXaW5kb3dFdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0V2luZG93RXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sRXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldENvbnRyb2xFdmVudFRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEhhbmRsZSBpbkNvbnRyb2wpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAorICAgIHsiR2V0TWVudUV2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRNZW51RXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51KSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKKyAgICB7IkdldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCisgICAgeyJHZXRVc2VyRm9jdXNFdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0VXNlckZvY3VzRXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCisgICAgeyJHZXRFdmVudERpc3BhdGNoZXJUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEV2ZW50RGlzcGF0Y2hlclRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKKyAgICB7IlJ1bkFwcGxpY2F0aW9uRXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SdW5BcHBsaWNhdGlvbkV2ZW50TG9vcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19RdWl0QXBwbGljYXRpb25FdmVudExvb3AsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlJ1bkFwcE1vZGFsTG9vcEZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUnVuQXBwTW9kYWxMb29wRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJRdWl0QXBwTW9kYWxMb29wRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19RdWl0QXBwTW9kYWxMb29wRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJCZWdpbkFwcE1vZGFsU3RhdGVGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0JlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiRW5kQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfRW5kQXBwTW9kYWxTdGF0ZUZvcldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiU2V0VXNlckZvY3VzV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19TZXRVc2VyRm9jdXNXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFVzZXJGb2N1c1dpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0VXNlckZvY3VzV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IlNldFdpbmRvd0RlZmF1bHRCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0RlZmF1bHRCdXR0b24sIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgQ29udHJvbEhhbmRsZSBpbkNvbnRyb2wpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRXaW5kb3dDYW5jZWxCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0NhbmNlbEJ1dHRvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSGFuZGxlIGluQ29udHJvbCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd0RlZmF1bHRCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0RlZmF1bHRCdXR0b24sIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJHZXRXaW5kb3dDYW5jZWxCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0NhbmNlbEJ1dHRvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IlJlZ2lzdGVyRXZlbnRIb3RLZXkiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1JlZ2lzdGVyRXZlbnRIb3RLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpbkhvdEtleUNvZGUsIFVJbnQzMiBpbkhvdEtleU1vZGlmaWVycywgRXZlbnRIb3RLZXlJRCBpbkhvdEtleUlELCBFdmVudFRhcmdldFJlZiBpblRhcmdldCwgT3B0aW9uQml0cyBpbk9wdGlvbnMpIC0+IChFdmVudEhvdEtleVJlZiBvdXRSZWYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2Vsc2UgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIENhcmJvbkV2ZW50c19tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KQEAgLTIxNDEsNzcgKzIxNDEsNzcgQEAKIAogdm9pZCBpbml0X0NhcmJvbkV2dCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0NhcmJvbkV2dCIsIENhcmJvbkV2ZW50c19tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0NhcmJvbkV2dCIsIENhcmJvbkV2ZW50c19tZXRob2RzKTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCW15RXZlbnRIYW5kbGVyVVBQID0gTmV3RXZlbnRIYW5kbGVyVVBQKG15RXZlbnRIYW5kbGVyKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDYXJib25FdmVudHNfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChDYXJib25FdmVudHNfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDYXJib25FdmVudHNfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlFdmVudFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRSZWZfVHlwZSk7Ci0JRXZlbnRRdWV1ZVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRRdWV1ZVJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50UXVldWVSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFF1ZXVlUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UXVldWVSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudFF1ZXVlUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRRdWV1ZVJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKLQlFdmVudExvb3BSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkV2ZW50TG9vcFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50TG9vcFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFJlZiIsIChQeU9iamVjdCAqKSZFdmVudExvb3BSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudExvb3BSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFJlZl9UeXBlKTsKLQlFdmVudExvb3BUaW1lclJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRMb29wVGltZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFRpbWVyUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BUaW1lclJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7Ci0JRXZlbnRIYW5kbGVyUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZFdmVudEhhbmRsZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudEhhbmRsZXJSZWZfVHlwZSk7Ci0JRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJDYWxsUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyQ2FsbFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKTsKLQlFdmVudFRhcmdldFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRUYXJnZXRSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudFRhcmdldFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50VGFyZ2V0UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50VGFyZ2V0UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRUYXJnZXRSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFRhcmdldFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRUYXJnZXRSZWZfVHlwZSk7Ci0JRXZlbnRIb3RLZXlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkV2ZW50SG90S2V5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRXZlbnRIb3RLZXlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhvdEtleVJlZiIsIChQeU9iamVjdCAqKSZFdmVudEhvdEtleVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkV2ZW50SG90S2V5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIb3RLZXlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50SG90S2V5UmVmX1R5cGUpOworICAgIG15RXZlbnRIYW5kbGVyVVBQID0gTmV3RXZlbnRIYW5kbGVyVVBQKG15RXZlbnRIYW5kbGVyKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBDYXJib25FdmVudHNfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChDYXJib25FdmVudHNfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDYXJib25FdmVudHNfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBFdmVudFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRSZWZfVHlwZSk7CisgICAgRXZlbnRRdWV1ZVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRRdWV1ZVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50UXVldWVSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFF1ZXVlUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UXVldWVSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudFF1ZXVlUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRRdWV1ZVJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKKyAgICBFdmVudExvb3BSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkV2ZW50TG9vcFJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50TG9vcFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFJlZiIsIChQeU9iamVjdCAqKSZFdmVudExvb3BSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudExvb3BSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFJlZl9UeXBlKTsKKyAgICBFdmVudExvb3BUaW1lclJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRMb29wVGltZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFRpbWVyUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BUaW1lclJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7CisgICAgRXZlbnRIYW5kbGVyUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZFdmVudEhhbmRsZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudEhhbmRsZXJSZWZfVHlwZSk7CisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJDYWxsUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyQ2FsbFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKTsKKyAgICBFdmVudFRhcmdldFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRUYXJnZXRSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudFRhcmdldFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50VGFyZ2V0UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50VGFyZ2V0UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRUYXJnZXRSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFRhcmdldFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRUYXJnZXRSZWZfVHlwZSk7CisgICAgRXZlbnRIb3RLZXlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkV2ZW50SG90S2V5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRXZlbnRIb3RLZXlSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhvdEtleVJlZiIsIChQeU9iamVjdCAqKSZFdmVudEhvdEtleVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkV2ZW50SG90S2V5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIb3RLZXlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50SG90S2V5UmVmX1R5cGUpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZi9fQ0Ztb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jCmluZGV4IDA5MDRhZTEuLmVlNjdjNzAgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jCkBAIC05LDkgKzksOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtODQsMTkgKzg0LDE5IEBACiBQeU9iamVjdCAqQ0ZSYW5nZV9OZXcoQ0ZSYW5nZSAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIChsb25nKWl0c2VsZi0+bG9jYXRpb24sIChsb25nKWl0c2VsZi0+bGVuZ3RoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCAobG9uZylpdHNlbGYtPmxvY2F0aW9uLCAobG9uZylpdHNlbGYtPmxlbmd0aCk7CiB9CiAKIGludAogQ0ZSYW5nZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRlJhbmdlICpwX2l0c2VsZikKIHsKLSAgICAgICAgbG9uZyBsb2NhdGlvbiwgbGVuZ3RoOworICAgIGxvbmcgbG9jYXRpb24sIGxlbmd0aDsKIAotICAgICAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsIiwgJmxvY2F0aW9uLCAmbGVuZ3RoKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHBfaXRzZWxmLT5sb2NhdGlvbiA9IChDRkluZGV4KWxvY2F0aW9uOwotICAgICAgICBwX2l0c2VsZi0+bGVuZ3RoID0gKENGSW5kZXgpbGVuZ3RoOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsIiwgJmxvY2F0aW9uLCAmbGVuZ3RoKSApCisgICAgICAgIHJldHVybiAwOworICAgIHBfaXRzZWxmLT5sb2NhdGlvbiA9IChDRkluZGV4KWxvY2F0aW9uOworICAgIHBfaXRzZWxmLT5sZW5ndGggPSAoQ0ZJbmRleClsZW5ndGg7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIE9wdGlvbmFsIENGVVJMIGFyZ3VtZW50IG9yIE5vbmUgKHBhc3NlZCBhcyBOVUxMKSAqLwpAQCAtMTA0LDggKzEwNCw4IEBACiBPcHRpb25hbENGVVJMUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGVVJMUmVmICpwX2l0c2VsZikKIHsKICAgICBpZiAoIHYgPT0gUHlfTm9uZSApIHsKLSAgICAgICAgcF9pdHNlbGYgPSBOVUxMOwotICAgICAgICByZXR1cm4gMTsKKyAgICBwX2l0c2VsZiA9IE5VTEw7CisgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIHJldHVybiBDRlVSTFJlZk9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKIH0KQEAgLTExOSwyNjIgKzExOSwyNjIgQEAKICNkZWZpbmUgQ0ZUeXBlUmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGVHlwZVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRlR5cGVSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGVHlwZVJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGVHlwZVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGVHlwZVJlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGVHlwZVJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGVHlwZVJlZk9ial9OZXcoQ0ZUeXBlUmVmIGl0c2VsZikKIHsKLQlDRlR5cGVSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRlR5cGVSZWZPYmplY3QsICZDRlR5cGVSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZUeXBlUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZUeXBlUmVmT2JqZWN0LCAmQ0ZUeXBlUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGVHlwZVJlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLworICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCiAKLQlpZiAoIUNGVHlwZVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlR5cGVSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZUeXBlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGVHlwZVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlR5cGVSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZUeXBlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZUeXBlUmVmT2JqX2RlYWxsb2MoQ0ZUeXBlUmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGR2V0VHlwZUlEKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGR2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZHZXRUeXBlSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkdldFR5cGVJRChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZHZXRUeXBlSUQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGUmV0YWluKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZUeXBlUmVmIF9ydjsKICNpZm5kZWYgQ0ZSZXRhaW4KLQlQeU1hY19QUkVDSEVDSyhDRlJldGFpbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZSZXRhaW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUmV0YWluKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZSZXRhaW4oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlJlbGVhc2UoQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGUmVsZWFzZQotCVB5TWFjX1BSRUNIRUNLKENGUmVsZWFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZSZWxlYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlJlbGVhc2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlJlbGVhc2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRkdldFJldGFpbkNvdW50KENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZJbmRleCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OwogI2lmbmRlZiBDRkdldFJldGFpbkNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZHZXRSZXRhaW5Db3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZHZXRSZXRhaW5Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZHZXRSZXRhaW5Db3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZHZXRSZXRhaW5Db3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfQ0ZFcXVhbChDRlR5cGVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGVHlwZVJlZiBjZjI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGVHlwZVJlZiBjZjI7CiAjaWZuZGVmIENGRXF1YWwKLQlQeU1hY19QUkVDSEVDSyhDRkVxdWFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkVxdWFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZjZjIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkVxdWFsKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBjZjIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZjZjIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkVxdWFsKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBjZjIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRkhhc2goQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkhhc2hDb2RlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZIYXNoQ29kZSBfcnY7CiAjaWZuZGVmIENGSGFzaAotCVB5TWFjX1BSRUNIRUNLKENGSGFzaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZIYXNoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkhhc2goX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGSGFzaChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfQ0ZDb3B5RGVzY3JpcHRpb24oQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZDb3B5RGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhDRkNvcHlEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZDb3B5RGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQ29weURlc2NyaXB0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkNvcHlEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZEYXRhUmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJvcGVydHlMaXN0Q3JlYXRlWE1MRGF0YSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlByb3BlcnR5TGlzdENyZWF0ZURlZXBDb3B5KENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlUmVmIF9ydjsKLQlDRk9wdGlvbkZsYWdzIG11dGFiaWxpdHlPcHRpb247Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtdXRhYmlsaXR5T3B0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVEZWVwQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmlsaXR5T3B0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZVJlZiBfcnY7CisgICAgQ0ZPcHRpb25GbGFncyBtdXRhYmlsaXR5T3B0aW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbXV0YWJpbGl0eU9wdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJpbGl0eU9wdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlNob3coQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGU2hvdwotCVB5TWFjX1BSRUNIRUNLKENGU2hvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTaG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlNob3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlNob3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlByb3BlcnR5TGlzdENyZWF0ZUZyb21YTUxEYXRhKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQ0ZUeXBlUmVmIF9ydjsKLQlDRk9wdGlvbkZsYWdzIG11dGFiaWxpdHlPcHRpb247Ci0JQ0ZTdHJpbmdSZWYgZXJyb3JTdHJpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtdXRhYmlsaXR5T3B0aW9uKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9ydiA9IENGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJpbGl0eU9wdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvclN0cmluZyk7Ci0JaWYgKGVycm9yU3RyaW5nKQotCSAgICAgICAgQ0ZSZWxlYXNlKGVycm9yU3RyaW5nKTsKLQlpZiAoX3J2ID09IE5VTEwpIHsKLQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJQYXJzZSBlcnJvciBpbiBYTUwgZGF0YSIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBDRlR5cGVSZWYgX3J2OworICAgIENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbjsKKyAgICBDRlN0cmluZ1JlZiBlcnJvclN0cmluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm11dGFiaWxpdHlPcHRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlByb3BlcnR5TGlzdENyZWF0ZUZyb21YTUxEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFiaWxpdHlPcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JTdHJpbmcpOworICAgIGlmIChlcnJvclN0cmluZykKKyAgICAgICAgQ0ZSZWxlYXNlKGVycm9yU3RyaW5nKTsKKyAgICBpZiAoX3J2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIlBhcnNlIGVycm9yIGluIFhNTCBkYXRhIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfdG9QeXRob24oQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlfcmVzID0gUHlDRl9DRjJQeXRob24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IFB5Q0ZfQ0YyUHl0aG9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRlR5cGVSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGR2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZSZXRhaW4iLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUmV0YWluLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVSZWYgX3J2KSIpfSwKLQl7IkNGUmVsZWFzZSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZSZWxlYXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDRkdldFJldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkdldFJldGFpbkNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCi0JeyJDRkVxdWFsIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkVxdWFsLCAxLAotCSBQeURvY19TVFIoIihDRlR5cGVSZWYgY2YyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZIYXNoIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkhhc2gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSGFzaENvZGUgX3J2KSIpfSwKLQl7IkNGQ29weURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkNvcHlEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGUHJvcGVydHlMaXN0Q3JlYXRlWE1MRGF0YSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKLQl7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHksIDEsCi0JIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZiBfcnYpIil9LAotCXsiQ0ZTaG93IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRlNob3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEsIDEsCi0JIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZk9iaikiKX0sCi0JeyJ0b1B5dGhvbiIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfdG9QeXRob24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHB5dGhvbl9vYmplY3QpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGR2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZSZXRhaW4iLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUmV0YWluLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVSZWYgX3J2KSIpfSwKKyAgICB7IkNGUmVsZWFzZSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZSZWxlYXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDRkdldFJldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkdldFJldGFpbkNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRkVxdWFsIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkVxdWFsLCAxLAorICAgICBQeURvY19TVFIoIihDRlR5cGVSZWYgY2YyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZIYXNoIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkhhc2gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSGFzaENvZGUgX3J2KSIpfSwKKyAgICB7IkNGQ29weURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkNvcHlEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGUHJvcGVydHlMaXN0Q3JlYXRlWE1MRGF0YSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZiBfcnYpIil9LAorICAgIHsiQ0ZTaG93IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRlNob3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZk9iaikiKX0sCisgICAgeyJ0b1B5dGhvbiIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfdG9QeXRob24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHB5dGhvbl9vYmplY3QpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRlR5cGVSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zODIsOTMgKzM4Miw5MyBAQAogCiBzdGF0aWMgaW50IENGVHlwZVJlZk9ial9jb21wYXJlKENGVHlwZVJlZk9iamVjdCAqc2VsZiwgQ0ZUeXBlUmVmT2JqZWN0ICpvdGhlcikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCi0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIENGVHlwZVJlZk9ial9yZXByKENGVHlwZVJlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGVHlwZVJlZiB0eXBlLSVkIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsIChpbnQpQ0ZHZXRUeXBlSUQoc2VsZi0+b2JfaXRzZWxmKSwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRlR5cGVSZWYgdHlwZS0lZCBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAoaW50KUNGR2V0VHlwZUlEKHNlbGYtPm9iX2l0c2VsZiksICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGVHlwZVJlZk9ial9oYXNoKENGVHlwZVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRlR5cGVSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGVHlwZVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZUeXBlUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRlR5cGVSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZUeXBlUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgQ0ZUeXBlUmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZUeXBlUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChDRlR5cGVSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGVHlwZVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZUeXBlUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBDRlR5cGVSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZUeXBlUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGVHlwZVJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENGVHlwZVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGVHlwZVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRlR5cGVSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENGVHlwZVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZUeXBlUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGVHlwZVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDRlR5cGVSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZUeXBlUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRlR5cGVSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0ZUeXBlUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZUeXBlUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZUeXBlUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0ZUeXBlUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZUeXBlUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGVHlwZVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0ZUeXBlUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRlR5cGVSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZUeXBlUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENGVHlwZVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRlR5cGVSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGVHlwZVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDRlR5cGVSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRlR5cGVSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZUeXBlUmVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00ODEsMTA0ICs0ODEsMTA0IEBACiAjZGVmaW5lIENGQXJyYXlSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZBcnJheVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRkFycmF5UmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRkFycmF5UmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZBcnJheVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGQXJyYXlSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRkFycmF5UmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZBcnJheVJlZk9ial9OZXcoQ0ZBcnJheVJlZiBpdHNlbGYpCiB7Ci0JQ0ZBcnJheVJlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGQXJyYXlSZWZPYmplY3QsICZDRkFycmF5UmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRkFycmF5UmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZBcnJheVJlZk9iamVjdCwgJkNGQXJyYXlSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZBcnJheVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRkFycmF5UmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZBcnJheVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkFycmF5UmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENGQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZBcnJheVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkFycmF5UmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRkFycmF5UmVmT2JqX2RlYWxsb2MoQ0ZBcnJheVJlZk9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKLQl7Ci0JCXNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7Ci0JCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JfQotCUNGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGQXJyYXlSZWZPYmpfQ0ZBcnJheUNyZWF0ZUNvcHkoQ0ZBcnJheVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZBcnJheVJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQXJyYXlDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQXJyYXlSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkFycmF5Q3JlYXRlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGQXJyYXlSZWZPYmpfQ0ZBcnJheUdldENvdW50KENGQXJyYXlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKICNpZm5kZWYgQ0ZBcnJheUdldENvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZBcnJheUdldENvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5R2V0Q291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQXJyYXlHZXRDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZBcnJheUdldENvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGQXJyYXlSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MoQ0ZBcnJheVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCUNGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzZXBhcmF0b3JTdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUJ5Q29tYmluaW5nU3RyaW5ncygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvclN0cmluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBzZXBhcmF0b3JTdHJpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc2VwYXJhdG9yU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JTdHJpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZBcnJheVJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRkFycmF5Q3JlYXRlQ29weSIsIChQeUNGdW5jdGlvbilDRkFycmF5UmVmT2JqX0NGQXJyYXlDcmVhdGVDb3B5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkFycmF5UmVmIF9ydikiKX0sCi0JeyJDRkFycmF5R2V0Q291bnQiLCAoUHlDRnVuY3Rpb24pQ0ZBcnJheVJlZk9ial9DRkFycmF5R2V0Q291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlQnlDb21iaW5pbmdTdHJpbmdzIiwgKFB5Q0Z1bmN0aW9uKUNGQXJyYXlSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkFycmF5Q3JlYXRlQ29weSIsIChQeUNGdW5jdGlvbilDRkFycmF5UmVmT2JqX0NGQXJyYXlDcmVhdGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkFycmF5UmVmIF9ydikiKX0sCisgICAgeyJDRkFycmF5R2V0Q291bnQiLCAoUHlDRnVuY3Rpb24pQ0ZBcnJheVJlZk9ial9DRkFycmF5R2V0Q291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlQnlDb21iaW5pbmdTdHJpbmdzIiwgKFB5Q0Z1bmN0aW9uKUNGQXJyYXlSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGQXJyYXlSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC01ODYsMTAwICs1ODYsMTAwIEBACiAKIHN0YXRpYyBpbnQgQ0ZBcnJheVJlZk9ial9jb21wYXJlKENGQXJyYXlSZWZPYmplY3QgKnNlbGYsIENGQXJyYXlSZWZPYmplY3QgKm90aGVyKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogQ0ZBcnJheVJlZk9ial9yZXByKENGQXJyYXlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRkFycmF5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8Q0ZBcnJheVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRkFycmF5UmVmT2JqX2hhc2goQ0ZBcnJheVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRkFycmF5UmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRkFycmF5UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRkFycmF5UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZBcnJheVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRkFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRkFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGQXJyYXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBDRkFycmF5UmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRkFycmF5UmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQkoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIENGQXJyYXlSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZBcnJheVJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRkFycmF5UmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ0ZBcnJheVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGQXJyYXlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZBcnJheVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ0ZBcnJheVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZBcnJheVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRkFycmF5UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNGQXJyYXlSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZBcnJheVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZBcnJheVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDRkFycmF5UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZBcnJheVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGQXJyYXlSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDRkFycmF5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZBcnJheVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRkFycmF5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDRkFycmF5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRkFycmF5UmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGQXJyYXlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ0ZBcnJheVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRkFycmF5UmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRkFycmF5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIENGQXJyYXlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRkFycmF5UmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGQXJyYXlSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNjkyLDEzMyArNjkyLDEzMyBAQAogI2RlZmluZSBDRk11dGFibGVBcnJheVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRk11dGFibGVBcnJheVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRk11dGFibGVBcnJheVJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRk11dGFibGVBcnJheVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGTXV0YWJsZUFycmF5UmVmIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKIH0gQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial9OZXcoQ0ZNdXRhYmxlQXJyYXlSZWYgaXRzZWxmKQogewotCUNGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QsICZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVBcnJheVJlZk9iamVjdCwgJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENGTXV0YWJsZUFycmF5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGTXV0YWJsZUFycmF5UmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0ZNdXRhYmxlQXJyYXlSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0ZNdXRhYmxlQXJyYXlSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRk11dGFibGVBcnJheVJlZk9ial9kZWFsbG9jKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZBcnJheVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRkFycmF5UmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGlkeDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBpZHg7CiAjaWZuZGVmIENGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWR4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZBcnJheVJlbW92ZVZhbHVlQXRJbmRleChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZHgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5UmVtb3ZlQWxsVmFsdWVzKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGQXJyYXlSZW1vdmVBbGxWYWx1ZXMKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlQWxsVmFsdWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlQWxsVmFsdWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkFycmF5UmVtb3ZlQWxsVmFsdWVzKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZBcnJheVJlbW92ZUFsbFZhbHVlcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheUV4Y2hhbmdlVmFsdWVzQXRJbmRpY2VzKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGlkeDE7Ci0JQ0ZJbmRleCBpZHgyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IGlkeDE7CisgICAgQ0ZJbmRleCBpZHgyOwogI2lmbmRlZiBDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZHgxLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWR4MikpCi0JCXJldHVybiBOVUxMOwotCUNGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgxLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkeDIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4Mik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlBcHBlbmRBcnJheShDRk11dGFibGVBcnJheVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZBcnJheVJlZiBvdGhlckFycmF5OwotCUNGUmFuZ2Ugb3RoZXJSYW5nZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBvdGhlckFycmF5OworICAgIENGUmFuZ2Ugb3RoZXJSYW5nZTsKICNpZm5kZWYgQ0ZBcnJheUFwcGVuZEFycmF5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZBcnJheUFwcGVuZEFycmF5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5QXBwZW5kQXJyYXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJm90aGVyQXJyYXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJm90aGVyUmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkFycmF5QXBwZW5kQXJyYXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgb3RoZXJBcnJheSwKLQkgICAgICAgICAgICAgICAgICAgb3RoZXJSYW5nZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZvdGhlckFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZvdGhlclJhbmdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZBcnJheUFwcGVuZEFycmF5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIG90aGVyQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgIG90aGVyUmFuZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGTXV0YWJsZUFycmF5UmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheVJlbW92ZVZhbHVlQXRJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBpZHgpIC0+IE5vbmUiKX0sCi0JeyJDRkFycmF5UmVtb3ZlQWxsVmFsdWVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlSZW1vdmVBbGxWYWx1ZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggaWR4MSwgQ0ZJbmRleCBpZHgyKSAtPiBOb25lIil9LAotCXsiQ0ZBcnJheUFwcGVuZEFycmF5IiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlBcHBlbmRBcnJheSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZBcnJheVJlZiBvdGhlckFycmF5LCBDRlJhbmdlIG90aGVyUmFuZ2UpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4IiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggaWR4KSAtPiBOb25lIil9LAorICAgIHsiQ0ZBcnJheVJlbW92ZUFsbFZhbHVlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5UmVtb3ZlQWxsVmFsdWVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheUV4Y2hhbmdlVmFsdWVzQXRJbmRpY2VzLCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGlkeDEsIENGSW5kZXggaWR4MikgLT4gTm9uZSIpfSwKKyAgICB7IkNGQXJyYXlBcHBlbmRBcnJheSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5QXBwZW5kQXJyYXksIDEsCisgICAgIFB5RG9jX1NUUigiKENGQXJyYXlSZWYgb3RoZXJBcnJheSwgQ0ZSYW5nZSBvdGhlclJhbmdlKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRk11dGFibGVBcnJheVJlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTgyNiwxMDAgKzgyNiwxMDAgQEAKIAogc3RhdGljIGludCBDRk11dGFibGVBcnJheVJlZk9ial9jb21wYXJlKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmLCBDRk11dGFibGVBcnJheVJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRk11dGFibGVBcnJheVJlZk9ial9yZXByKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlQXJyYXlSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVBcnJheVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRk11dGFibGVBcnJheVJlZk9ial9oYXNoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGTXV0YWJsZUFycmF5UmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRk11dGFibGVBcnJheVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVBcnJheVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGTXV0YWJsZUFycmF5UmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZNdXRhYmxlQXJyYXlSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRk11dGFibGVBcnJheVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGTXV0YWJsZUFycmF5UmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGTXV0YWJsZUFycmF5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRk11dGFibGVBcnJheVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGTXV0YWJsZUFycmF5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGTXV0YWJsZUFycmF5UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRk11dGFibGVBcnJheVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGTXV0YWJsZUFycmF5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRk11dGFibGVBcnJheVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGTXV0YWJsZUFycmF5UmVmIC0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTkzMiw4NiArOTMyLDg2IEBACiAjZGVmaW5lIENGRGljdGlvbmFyeVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRkRpY3Rpb25hcnlSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRkRpY3Rpb25hcnlSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRkRpY3Rpb25hcnlSZWYgb2JfaXRzZWxmOwotCXZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDRkRpY3Rpb25hcnlSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRkRpY3Rpb25hcnlSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KENGRGljdGlvbmFyeVJlZiBpdHNlbGYpCiB7Ci0JQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0LCAmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRkRpY3Rpb25hcnlSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRkRpY3Rpb25hcnlSZWZPYmplY3QsICZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGRGljdGlvbmFyeVJlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLworICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCiAKLQlpZiAoIUNGRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2RlYWxsb2MoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NGRGljdGlvbmFyeUNyZWF0ZUNvcHkoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRpY3Rpb25hcnlSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkRpY3Rpb25hcnlSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlHZXRDb3VudChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKICNpZm5kZWYgQ0ZEaWN0aW9uYXJ5R2V0Q291bnQKLQlQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlHZXRDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5R2V0Q291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGljdGlvbmFyeUdldENvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlHZXRDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGRGljdGlvbmFyeVJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRkRpY3Rpb25hcnlDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlDcmVhdGVDb3B5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkRpY3Rpb25hcnlSZWYgX3J2KSIpfSwKLQl7IkNGRGljdGlvbmFyeUdldENvdW50IiwgKFB5Q0Z1bmN0aW9uKUNGRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlHZXRDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZJbmRleCBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZEaWN0aW9uYXJ5Q3JlYXRlQ29weSIsIChQeUNGdW5jdGlvbilDRkRpY3Rpb25hcnlSZWZPYmpfQ0ZEaWN0aW9uYXJ5Q3JlYXRlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCisgICAgeyJDRkRpY3Rpb25hcnlHZXRDb3VudCIsIChQeUNGdW5jdGlvbilDRkRpY3Rpb25hcnlSZWZPYmpfQ0ZEaWN0aW9uYXJ5R2V0Q291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTAxOSwxMDAgKzEwMTksMTAwIEBACiAKIHN0YXRpYyBpbnQgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2NvbXBhcmUoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmLCBDRkRpY3Rpb25hcnlSZWZPYmplY3QgKm90aGVyKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogQ0ZEaWN0aW9uYXJ5UmVmT2JqX3JlcHIoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZEaWN0aW9uYXJ5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8Q0ZEaWN0aW9uYXJ5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGRGljdGlvbmFyeVJlZk9ial9oYXNoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRkRpY3Rpb25hcnlSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGRGljdGlvbmFyeVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBDRkRpY3Rpb25hcnlSZWZPYmpfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGljdGlvbmFyeVJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQkoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIENGRGljdGlvbmFyeVJlZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDRkRpY3Rpb25hcnlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZEaWN0aW9uYXJ5UmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGRGljdGlvbmFyeVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ0ZEaWN0aW9uYXJ5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDRkRpY3Rpb25hcnlSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZEaWN0aW9uYXJ5UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNGRGljdGlvbmFyeVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDRkRpY3Rpb25hcnlSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGRGljdGlvbmFyeVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDRkRpY3Rpb25hcnlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDRkRpY3Rpb25hcnlSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRkRpY3Rpb25hcnlSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDRkRpY3Rpb25hcnlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDRkRpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDRkRpY3Rpb25hcnlSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENGRGljdGlvbmFyeVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRkRpY3Rpb25hcnlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENGRGljdGlvbmFyeVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIENGRGljdGlvbmFyeVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENGRGljdGlvbmFyeVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRkRpY3Rpb25hcnlSZWYgLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTExMjUsNzAgKzExMjUsNzAgQEAKICNkZWZpbmUgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX05ldyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGl0c2VsZikKIHsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCwgJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0LCAmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0JaWYgKCFDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZURpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZURpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGRGljdGlvbmFyeVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMKLQlQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGljdGlvbmFyeVJlbW92ZUFsbFZhbHVlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTExOTYsMTAwICsxMTk2LDEwMCBAQAogCiBzdGF0aWMgaW50IENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfY29tcGFyZShDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpvdGhlcikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCi0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfcmVwcihDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNwcmludGYoYnVmLCAiPENGTXV0YWJsZURpY3Rpb25hcnlSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9oYXNoKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCi0JcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLworICAgIHJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKIH0KIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRk11dGFibGVEaWN0aW9uYXJ5UmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIC0tLS0tLS0tLS0tLS0gKi8KQEAgLTEzMDIsMTI0ICsxMzAyLDEyNCBAQAogI2RlZmluZSBDRkRhdGFSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZEYXRhUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGRGF0YVJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQ0ZEYXRhUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZEYXRhUmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZEYXRhUmVmIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKIH0gQ0ZEYXRhUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX05ldyhDRkRhdGFSZWYgaXRzZWxmKQogewotCUNGRGF0YVJlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGRGF0YVJlZk9iamVjdCwgJkNGRGF0YVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZEYXRhUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZEYXRhUmVmT2JqZWN0LCAmQ0ZEYXRhUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENGRGF0YVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRkRhdGFSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCWlmIChQeVN0cmluZ19DaGVjayh2KSkgewotCSAgICBjaGFyICpjU3RyOwotCSAgICBQeV9zc2l6ZV90IGNMZW47Ci0JICAgIGlmKCBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgJmNTdHIsICZjTGVuKSA8IDAgKSByZXR1cm4gMDsKLQkgICAgKnBfaXRzZWxmID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLCAodW5zaWduZWQgY2hhciAqKWNTdHIsIGNMZW4pOwotCSAgICByZXR1cm4gMTsKLQl9CisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICBjaGFyICpjU3RyOworICAgICAgICBQeV9zc2l6ZV90IGNMZW47CisgICAgICAgIGlmKCBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgJmNTdHIsICZjTGVuKSA8IDAgKSByZXR1cm4gMDsKKyAgICAgICAgKnBfaXRzZWxmID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLCAodW5zaWduZWQgY2hhciAqKWNTdHIsIGNMZW4pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQlpZiAoIUNGRGF0YVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRhdGFSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZEYXRhUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGRGF0YVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRhdGFSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZEYXRhUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZEYXRhUmVmT2JqX2RlYWxsb2MoQ0ZEYXRhUmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX0NGRGF0YUNyZWF0ZUNvcHkoQ0ZEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRhdGFDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkRhdGFSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRhdGFDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGF0YVJlZk9ial9DRkRhdGFHZXRMZW5ndGgoQ0ZEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBfcnY7CiAjaWZuZGVmIENGRGF0YUdldExlbmd0aAotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUdldExlbmd0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhR2V0TGVuZ3RoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRhdGFHZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGF0YUdldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRkRhdGFSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVGcm9tRXh0ZXJuYWxSZXByZXNlbnRhdGlvbihDRkRhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUZyb21FeHRlcm5hbFJlcHJlc2VudGF0aW9uKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGF0YVJlZk9ial9DRkRhdGFHZXREYXRhKENGRGF0YVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IHNpemUgPSBDRkRhdGFHZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JY2hhciAqZGF0YSA9IChjaGFyICopQ0ZEYXRhR2V0Qnl0ZVB0cihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpbnQgc2l6ZSA9IENGRGF0YUdldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBjaGFyICpkYXRhID0gKGNoYXIgKilDRkRhdGFHZXRCeXRlUHRyKF9zZWxmLT5vYl9pdHNlbGYpOwogCi0JX3JlcyA9IChQeU9iamVjdCAqKVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIF9yZXMgPSAoUHlPYmplY3QgKilQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZEYXRhUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGRGF0YUNyZWF0ZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGRGF0YUNyZWF0ZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGRGF0YVJlZiBfcnYpIil9LAotCXsiQ0ZEYXRhR2V0TGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGRGF0YVJlZk9ial9DRkRhdGFHZXRMZW5ndGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZEYXRhR2V0RGF0YSIsIChQeUNGdW5jdGlvbilDRkRhdGFSZWZPYmpfQ0ZEYXRhR2V0RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc3RyaW5nIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkRhdGFDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGRGF0YVJlZk9ial9DRkRhdGFDcmVhdGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUdldExlbmd0aCIsIChQeUNGdW5jdGlvbilDRkRhdGFSZWZPYmpfQ0ZEYXRhR2V0TGVuZ3RoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZUZyb21FeHRlcm5hbFJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGRGF0YVJlZk9ial9DRlN0cmluZ0NyZWF0ZUZyb21FeHRlcm5hbFJlcHJlc2VudGF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUdldERhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGRGF0YUdldERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHN0cmluZyBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRkRhdGFSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xNDI3LDEwMCArMTQyNywxMDAgQEAKIAogc3RhdGljIGludCBDRkRhdGFSZWZPYmpfY29tcGFyZShDRkRhdGFSZWZPYmplY3QgKnNlbGYsIENGRGF0YVJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRkRhdGFSZWZPYmpfcmVwcihDRkRhdGFSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRkRhdGFSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRkRhdGFSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZEYXRhUmVmT2JqX2hhc2goQ0ZEYXRhUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGRGF0YVJlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZEYXRhUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRkRhdGFSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkRhdGFSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkRhdGFSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZEYXRhUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGRGF0YVJlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZEYXRhUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRkRhdGFSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZEYXRhUmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGRGF0YVJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRkRhdGFSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRkRhdGFSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRkRhdGFSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZEYXRhUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRkRhdGFSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGRGF0YVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRkRhdGFSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZEYXRhUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGRGF0YVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZEYXRhUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGRGF0YVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGRGF0YVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGRGF0YVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGRGF0YVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGRGF0YVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRkRhdGFSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGRGF0YVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZEYXRhUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGRGF0YVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRkRhdGFSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZEYXRhUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRkRhdGFSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZEYXRhUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZEYXRhUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGRGF0YVJlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTUzMywxNTggKzE1MzMsMTU4IEBACiAjZGVmaW5lIENGTXV0YWJsZURhdGFSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRk11dGFibGVEYXRhUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRk11dGFibGVEYXRhUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZNdXRhYmxlRGF0YVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGTXV0YWJsZURhdGFSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRk11dGFibGVEYXRhUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9OZXcoQ0ZNdXRhYmxlRGF0YVJlZiBpdHNlbGYpCiB7Ci0JQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGTXV0YWJsZURhdGFSZWZPYmplY3QsICZDRk11dGFibGVEYXRhUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRk11dGFibGVEYXRhUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCwgJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZNdXRhYmxlRGF0YVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRk11dGFibGVEYXRhUmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRk11dGFibGVEYXRhUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRk11dGFibGVEYXRhUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRk11dGFibGVEYXRhUmVmT2JqX2RlYWxsb2MoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKLQl7Ci0JCXNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7Ci0JCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JfQotCUNGRGF0YVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRkRhdGFSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhU2V0TGVuZ3RoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggbGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IGxlbmd0aDsKICNpZm5kZWYgQ0ZEYXRhU2V0TGVuZ3RoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhU2V0TGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFTZXRMZW5ndGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkRhdGFTZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkRhdGFTZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFJbmNyZWFzZUxlbmd0aChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGV4dHJhTGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IGV4dHJhTGVuZ3RoOwogI2lmbmRlZiBDRkRhdGFJbmNyZWFzZUxlbmd0aAotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUluY3JlYXNlTGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFJbmNyZWFzZUxlbmd0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhTGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZEYXRhSW5jcmVhc2VMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBleHRyYUxlbmd0aCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFMZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkRhdGFJbmNyZWFzZUxlbmd0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhTGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFBcHBlbmRCeXRlcyhDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyICpieXRlc19faW5fXzsKLQlsb25nIGJ5dGVzX19sZW5fXzsKLQlpbnQgYnl0ZXNfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBjaGFyICpieXRlc19faW5fXzsKKyAgICBsb25nIGJ5dGVzX19sZW5fXzsKKyAgICBpbnQgYnl0ZXNfX2luX2xlbl9fOwogI2lmbmRlZiBDRkRhdGFBcHBlbmRCeXRlcwotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUFwcGVuZEJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFBcHBlbmRCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZieXRlc19faW5fXywgJmJ5dGVzX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKLQlDRkRhdGFBcHBlbmRCeXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGJ5dGVzX19pbl9fLCBieXRlc19fbGVuX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc19faW5fXywgJmJ5dGVzX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBDRkRhdGFBcHBlbmRCeXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX19pbl9fLCBieXRlc19fbGVuX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YVJlcGxhY2VCeXRlcyhDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOwotCXVuc2lnbmVkIGNoYXIgKm5ld0J5dGVzX19pbl9fOwotCWxvbmcgbmV3Qnl0ZXNfX2xlbl9fOwotCWludCBuZXdCeXRlc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgcmFuZ2U7CisgICAgdW5zaWduZWQgY2hhciAqbmV3Qnl0ZXNfX2luX187CisgICAgbG9uZyBuZXdCeXRlc19fbGVuX187CisgICAgaW50IG5ld0J5dGVzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZEYXRhUmVwbGFjZUJ5dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhUmVwbGFjZUJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFSZXBsYWNlQnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3Qnl0ZXNfX2luX18sICZuZXdCeXRlc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQluZXdCeXRlc19fbGVuX18gPSBuZXdCeXRlc19faW5fbGVuX187Ci0JQ0ZEYXRhUmVwbGFjZUJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICAgICBuZXdCeXRlc19faW5fXywgbmV3Qnl0ZXNfX2xlbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3Qnl0ZXNfX2luX18sICZuZXdCeXRlc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXdCeXRlc19fbGVuX18gPSBuZXdCeXRlc19faW5fbGVuX187CisgICAgQ0ZEYXRhUmVwbGFjZUJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdCeXRlc19faW5fXywgbmV3Qnl0ZXNfX2xlbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFEZWxldGVCeXRlcyhDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlJhbmdlIHJhbmdlOwogI2lmbmRlZiBDRkRhdGFEZWxldGVCeXRlcwotCVB5TWFjX1BSRUNIRUNLKENGRGF0YURlbGV0ZUJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFEZWxldGVCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZEYXRhRGVsZXRlQnl0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICByYW5nZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkRhdGFEZWxldGVCeXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHJhbmdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRk11dGFibGVEYXRhUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGRGF0YVNldExlbmd0aCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YVNldExlbmd0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBsZW5ndGgpIC0+IE5vbmUiKX0sCi0JeyJDRkRhdGFJbmNyZWFzZUxlbmd0aCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YUluY3JlYXNlTGVuZ3RoLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGV4dHJhTGVuZ3RoKSAtPiBOb25lIil9LAotCXsiQ0ZEYXRhQXBwZW5kQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFBcHBlbmRCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzKSAtPiBOb25lIil9LAotCXsiQ0ZEYXRhUmVwbGFjZUJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhUmVwbGFjZUJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlLCBCdWZmZXIgbmV3Qnl0ZXMpIC0+IE5vbmUiKX0sCi0JeyJDRkRhdGFEZWxldGVCeXRlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YURlbGV0ZUJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZEYXRhU2V0TGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhU2V0TGVuZ3RoLCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGxlbmd0aCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGRGF0YUluY3JlYXNlTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhSW5jcmVhc2VMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggZXh0cmFMZW5ndGgpIC0+IE5vbmUiKX0sCisgICAgeyJDRkRhdGFBcHBlbmRCeXRlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YUFwcGVuZEJ5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMpIC0+IE5vbmUiKX0sCisgICAgeyJDRkRhdGFSZXBsYWNlQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFSZXBsYWNlQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UsIEJ1ZmZlciBuZXdCeXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkNGRGF0YURlbGV0ZUJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhRGVsZXRlQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGTXV0YWJsZURhdGFSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xNjkyLDEwMCArMTY5MiwxMDAgQEAKIAogc3RhdGljIGludCBDRk11dGFibGVEYXRhUmVmT2JqX2NvbXBhcmUoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqc2VsZiwgQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRk11dGFibGVEYXRhUmVmT2JqX3JlcHIoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGTXV0YWJsZURhdGFSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVEYXRhUmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGTXV0YWJsZURhdGFSZWZPYmpfaGFzaChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGTXV0YWJsZURhdGFSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGTXV0YWJsZURhdGFSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIENGTXV0YWJsZURhdGFSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVEYXRhUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGTXV0YWJsZURhdGFSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICAvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZURhdGFSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDRk11dGFibGVEYXRhUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGTXV0YWJsZURhdGFSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRk11dGFibGVEYXRhUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ0ZNdXRhYmxlRGF0YVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRk11dGFibGVEYXRhUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRk11dGFibGVEYXRhUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDRk11dGFibGVEYXRhUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGTXV0YWJsZURhdGFSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZNdXRhYmxlRGF0YVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDRk11dGFibGVEYXRhUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRk11dGFibGVEYXRhUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGTXV0YWJsZURhdGFSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDRk11dGFibGVEYXRhUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZNdXRhYmxlRGF0YVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGTXV0YWJsZURhdGFSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDRk11dGFibGVEYXRhUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRk11dGFibGVEYXRhUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZNdXRhYmxlRGF0YVJlZiAtLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNzk4LDYzNiArMTc5OCw2MzYgQEAKICNkZWZpbmUgQ0ZTdHJpbmdSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZTdHJpbmdSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ0ZTdHJpbmdSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGU3RyaW5nUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZTdHJpbmdSZWYgb2JfaXRzZWxmOwotCXZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDRlN0cmluZ1JlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGU3RyaW5nUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfTmV3KENGU3RyaW5nUmVmIGl0c2VsZikKIHsKLQlDRlN0cmluZ1JlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGU3RyaW5nUmVmT2JqZWN0LCAmQ0ZTdHJpbmdSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGU3RyaW5nUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZTdHJpbmdSZWZPYmplY3QsICZDRlN0cmluZ1JlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRlN0cmluZ1JlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JICAgIGNoYXIgKmNTdHI7Ci0JICAgIGlmICghUHlBcmdfUGFyc2UodiwgImVzIiwgImFzY2lpIiwgJmNTdHIpKQotCSAgICAgICAgcmV0dXJuIDA7Ci0JICAgICAgICAqcF9pdHNlbGYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLCBjU3RyLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKTsKLQkJUHlNZW1fRnJlZShjU3RyKTsKLQkgICAgICAgIHJldHVybiAxOwotCX0KLQlpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JICAgICAgICAvKiBXZSB1c2UgdGhlIENGIHR5cGVzIGhlcmUsIGlmIFB5dGhvbiB3YXMgY29uZmlndXJlZCBkaWZmZXJlbnRseSB0aGF0IHdpbGwgZ2l2ZSBhbiBlcnJvciAqLwotCSAgICAgICAgQ0ZJbmRleCBzaXplID0gUHlVbmljb2RlX0dldFNpemUodik7Ci0JICAgICAgICBVbmlDaGFyICp1bmljaGFycyA9IFB5VW5pY29kZV9Bc1VuaWNvZGUodik7Ci0JICAgICAgICBpZiAoIXVuaWNoYXJzKSByZXR1cm4gMDsKLQkgICAgICAgICpwX2l0c2VsZiA9IENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoKENGQWxsb2NhdG9yUmVmKU5VTEwsIHVuaWNoYXJzLCBzaXplKTsKLQkgICAgICAgIHJldHVybiAxOwotCX0KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgIGNoYXIgKmNTdHI7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UodiwgImVzIiwgImFzY2lpIiwgJmNTdHIpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKnBfaXRzZWxmID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgY1N0ciwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSk7CisgICAgICAgIFB5TWVtX0ZyZWUoY1N0cik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgIC8qIFdlIHVzZSB0aGUgQ0YgdHlwZXMgaGVyZSwgaWYgUHl0aG9uIHdhcyBjb25maWd1cmVkIGRpZmZlcmVudGx5IHRoYXQgd2lsbCBnaXZlIGFuIGVycm9yICovCisgICAgICAgIENGSW5kZXggc2l6ZSA9IFB5VW5pY29kZV9HZXRTaXplKHYpOworICAgICAgICBVbmlDaGFyICp1bmljaGFycyA9IFB5VW5pY29kZV9Bc1VuaWNvZGUodik7CisgICAgICAgIGlmICghdW5pY2hhcnMpIHJldHVybiAwOworICAgICAgICAqcF9pdHNlbGYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLCB1bmljaGFycywgc2l6ZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAogCi0JaWYgKCFDRlN0cmluZ1JlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlN0cmluZ1JlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRlN0cmluZ1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRlN0cmluZ1JlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlN0cmluZ1JlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRlN0cmluZ1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGU3RyaW5nUmVmT2JqX2RlYWxsb2MoQ0ZTdHJpbmdSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICB9CisgICAgQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZVdpdGhTdWJzdHJpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlJhbmdlIHJhbmdlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhTdWJzdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGUmFuZ2UgcmFuZ2U7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQ29weShDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMZW5ndGgoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKICNpZm5kZWYgQ0ZTdHJpbmdHZXRMZW5ndGgKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldExlbmd0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRMZW5ndGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEJ5dGVzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IF9ydjsKLQlDRlJhbmdlIHJhbmdlOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7Ci0JVUludDggbG9zc0J5dGU7Ci0JQm9vbGVhbiBpc0V4dGVybmFsUmVwcmVzZW50YXRpb247Ci0JVUludDggYnVmZmVyOwotCUNGSW5kZXggbWF4QnVmTGVuOwotCUNGSW5kZXggdXNlZEJ1ZkxlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBfcnY7CisgICAgQ0ZSYW5nZSByYW5nZTsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFVJbnQ4IGxvc3NCeXRlOworICAgIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uOworICAgIFVJbnQ4IGJ1ZmZlcjsKKyAgICBDRkluZGV4IG1heEJ1ZkxlbjsKKyAgICBDRkluZGV4IHVzZWRCdWZMZW47CiAjaWZuZGVmIENGU3RyaW5nR2V0Qnl0ZXMKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldEJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldEJ5dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb3NzQnl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heEJ1ZkxlbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0Qnl0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICBsb3NzQnl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZMZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAmdXNlZEJ1Zkxlbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKLQkgICAgICAgICAgICAgICAgICAgICB1c2VkQnVmTGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9zc0J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0V4dGVybmFsUmVwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhCdWZMZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldEJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zc0J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsUmVwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZWRCdWZMZW4pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJ1Zkxlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7Ci0JVUludDggbG9zc0J5dGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb3NzQnl0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlRXh0ZXJuYWxSZXByZXNlbnRhdGlvbigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc3NCeXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBVSW50OCBsb3NzQnl0ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvc3NCeXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zc0J5dGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nRW5jb2RpbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIF9ydjsKICNpZm5kZWYgQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CiAjaWZuZGVmIENGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0dldEZhc3Rlc3RFbmNvZGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDb21wYXJlV2l0aE9wdGlvbnMoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGQ29tcGFyaXNvblJlc3VsdCBfcnY7Ci0JQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMjsKLQlDRlJhbmdlIHJhbmdlVG9Db21wYXJlOwotCUNGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQ29tcGFyaXNvblJlc3VsdCBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMjsKKyAgICBDRlJhbmdlIHJhbmdlVG9Db21wYXJlOworICAgIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CiAjaWZuZGVmIENGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb21wYXJlV2l0aE9wdGlvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRoZVN0cmluZzIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9Db21wYXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb0NvbXBhcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRoZVN0cmluZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9Db21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb0NvbXBhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29tcGFyZShDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZDb21wYXJpc29uUmVzdWx0IF9ydjsKLQlDRlN0cmluZ1JlZiB0aGVTdHJpbmcyOwotCUNGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQ29tcGFyaXNvblJlc3VsdCBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMjsKKyAgICBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zOwogI2lmbmRlZiBDRlN0cmluZ0NvbXBhcmUKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbXBhcmUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29tcGFyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nMiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbXBhcmVPcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDb21wYXJlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCi0JICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBhcmVPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDb21wYXJlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyhDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kOwotCUNGUmFuZ2UgcmFuZ2VUb1NlYXJjaDsKLQlDRk9wdGlvbkZsYWdzIHNlYXJjaE9wdGlvbnM7Ci0JQ0ZSYW5nZSByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZDsKKyAgICBDRlJhbmdlIHJhbmdlVG9TZWFyY2g7CisgICAgQ0ZPcHRpb25GbGFncyBzZWFyY2hPcHRpb25zOworICAgIENGUmFuZ2UgcmVzdWx0OwogI2lmbmRlZiBDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nRmluZFdpdGhPcHRpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9TZWFyY2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hPcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb1NlYXJjaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgcmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9TZWFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb1NlYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQ7Ci0JQ0ZSYW5nZSByYW5nZVRvU2VhcmNoOwotCUNGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc3RyaW5nVG9GaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZVRvU2VhcmNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvRmluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlVG9TZWFyY2gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlT3B0aW9ucyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kOworICAgIENGUmFuZ2UgcmFuZ2VUb1NlYXJjaDsKKyAgICBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN0cmluZ1RvRmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2VUb1NlYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBhcmVPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVBcnJheVdpdGhGaW5kUmVzdWx0cygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVRvU2VhcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdGaW5kKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIF9ydjsKLQlDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQ7Ci0JQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZSYW5nZSBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kOworICAgIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CiAjaWZuZGVmIENGU3RyaW5nRmluZAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nRmluZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdGaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21wYXJlT3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nRmluZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wYXJlT3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nRmluZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nSGFzUHJlZml4KENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlDRlN0cmluZ1JlZiBwcmVmaXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIHByZWZpeDsKICNpZm5kZWYgQ0ZTdHJpbmdIYXNQcmVmaXgKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0hhc1ByZWZpeCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdIYXNQcmVmaXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcHJlZml4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdIYXNQcmVmaXgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnByZWZpeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nSGFzUHJlZml4KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0hhc1N1ZmZpeChDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgc3VmZml4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBzdWZmaXg7CiAjaWZuZGVmIENGU3RyaW5nSGFzU3VmZml4Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdIYXNTdWZmaXgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nSGFzU3VmZml4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN1ZmZpeCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nSGFzU3VmZml4KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdWZmaXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0hhc1N1ZmZpeChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMaW5lQm91bmRzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOwotCUNGSW5kZXggbGluZUJlZ2luSW5kZXg7Ci0JQ0ZJbmRleCBsaW5lRW5kSW5kZXg7Ci0JQ0ZJbmRleCBjb250ZW50c0VuZEluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlJhbmdlIHJhbmdlOworICAgIENGSW5kZXggbGluZUJlZ2luSW5kZXg7CisgICAgQ0ZJbmRleCBsaW5lRW5kSW5kZXg7CisgICAgQ0ZJbmRleCBjb250ZW50c0VuZEluZGV4OwogI2lmbmRlZiBDRlN0cmluZ0dldExpbmVCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldExpbmVCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TGluZUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdHZXRMaW5lQm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGluZUJlZ2luSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaW5lRW5kSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50c0VuZEluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBsaW5lQmVnaW5JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICBsaW5lRW5kSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgY29udGVudHNFbmRJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nR2V0TGluZUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbmVCZWdpbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGluZUVuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudHNFbmRJbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJlZ2luSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzRW5kSW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQXJyYXlCeVNlcGFyYXRpbmdTdHJpbmdzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBzZXBhcmF0b3JTdHJpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc2VwYXJhdG9yU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVBcnJheUJ5U2VwYXJhdGluZ1N0cmluZ3MoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQXJyYXlSZWYgX3J2OworICAgIENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzZXBhcmF0b3JTdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvclN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEludFZhbHVlKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldEludFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRJbnRWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRJbnRWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRJbnRWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRJbnRWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldERvdWJsZVZhbHVlKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlkb3VibGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBkb3VibGUgX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldERvdWJsZVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU2hvd1N0cihDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDRlNob3dTdHIKLQlQeU1hY19QUkVDSEVDSyhDRlNob3dTdHIpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU2hvd1N0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTaG93U3RyKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTaG93U3RyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhTdHJpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlVSTFJlZiBiYXNlVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlV2l0aFN0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBDRlVSTFJlZiBiYXNlVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlV2l0aFN0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGU7Ci0JQm9vbGVhbiBpc0RpcmVjdG9yeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXRoU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZTsKKyAgICBCb29sZWFuIGlzRGlyZWN0b3J5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoUmVsYXRpdmVUb0Jhc2UoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGU7Ci0JQm9vbGVhbiBpc0RpcmVjdG9yeTsKLQlDRlVSTFJlZiBiYXNlVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0aFN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmJhc2VVUkwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGU7CisgICAgQm9vbGVhbiBpc0RpcmVjdG9yeTsKKyAgICBDRlVSTFJlZiBiYXNlVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmJhc2VVUkwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlU3RyaW5nQnlSZXBsYWNpbmdQZXJjZW50RXNjYXBlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZVN0cmluZ0J5UmVwbGFjaW5nUGVyY2VudEVzY2FwZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQ7Ci0JQ0ZTdHJpbmdSZWYgbGVnYWxVUkxDaGFyYWN0ZXJzVG9CZUVzY2FwZWQ7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZVVuZXNjYXBlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZVN0cmluZ0J5QWRkaW5nUGVyY2VudEVzY2FwZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlVW5lc2NhcGVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhbFVSTENoYXJhY3RlcnNUb0JlRXNjYXBlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQ7CisgICAgQ0ZTdHJpbmdSZWYgbGVnYWxVUkxDaGFyYWN0ZXJzVG9CZUVzY2FwZWQ7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZVVuZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZVN0cmluZ0J5QWRkaW5nUGVyY2VudEVzY2FwZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlVW5lc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhbFVSTENoYXJhY3RlcnNUb0JlRXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U3RyaW5nKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpbnQgc2l6ZSA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpKzE7Ci0JY2hhciAqZGF0YSA9IG1hbGxvYyhzaXplKTsKKyAgICBpbnQgc2l6ZSA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpKzE7CisgICAgY2hhciAqZGF0YSA9IG1hbGxvYyhzaXplKTsKIAotCWlmKCBkYXRhID09IE5VTEwgKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIENGU3RyaW5nR2V0Q1N0cmluZyhfc2VsZi0+b2JfaXRzZWxmLCBkYXRhLCBzaXplLCAwKSApIHsKLQkgICAgICAgIF9yZXMgPSAoUHlPYmplY3QgKilQeVN0cmluZ19Gcm9tU3RyaW5nKGRhdGEpOwotCX0gZWxzZSB7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiQ0ZTdHJpbmdHZXRDU3RyaW5nIGNvdWxkIG5vdCBmaXQgdGhlIHN0cmluZyIpOwotCSAgICAgICAgX3JlcyA9IE5VTEw7Ci0JfQotCWZyZWUoZGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYoIGRhdGEgPT0gTlVMTCApIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICggQ0ZTdHJpbmdHZXRDU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsIGRhdGEsIHNpemUsIDApICkgeworICAgICAgICBfcmVzID0gKFB5T2JqZWN0ICopUHlTdHJpbmdfRnJvbVN0cmluZyhkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiQ0ZTdHJpbmdHZXRDU3RyaW5nIGNvdWxkIG5vdCBmaXQgdGhlIHN0cmluZyIpOworICAgICAgICBfcmVzID0gTlVMTDsKKyAgICB9CisgICAgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0VW5pY29kZShDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKSsxOwotCVB5X1VOSUNPREUgKmRhdGEgPSBtYWxsb2Moc2l6ZSpzaXplb2YoUHlfVU5JQ09ERSkpOwotCUNGUmFuZ2UgcmFuZ2U7CisgICAgaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKSsxOworICAgIFB5X1VOSUNPREUgKmRhdGEgPSBtYWxsb2Moc2l6ZSpzaXplb2YoUHlfVU5JQ09ERSkpOworICAgIENGUmFuZ2UgcmFuZ2U7CiAKLQlyYW5nZS5sb2NhdGlvbiA9IDA7Ci0JcmFuZ2UubGVuZ3RoID0gc2l6ZTsKLQlpZiggZGF0YSA9PSBOVUxMICkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKF9zZWxmLT5vYl9pdHNlbGYsIHJhbmdlLCBkYXRhKTsKLQlfcmVzID0gKFB5T2JqZWN0ICopUHlVbmljb2RlX0Zyb21Vbmljb2RlKGRhdGEsIHNpemUtMSk7Ci0JZnJlZShkYXRhKTsKLQlyZXR1cm4gX3JlczsKKyAgICByYW5nZS5sb2NhdGlvbiA9IDA7CisgICAgcmFuZ2UubGVuZ3RoID0gc2l6ZTsKKyAgICBpZiggZGF0YSA9PSBOVUxMICkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKF9zZWxmLT5vYl9pdHNlbGYsIHJhbmdlLCBkYXRhKTsKKyAgICBfcmVzID0gKFB5T2JqZWN0ICopUHlVbmljb2RlX0Zyb21Vbmljb2RlKGRhdGEsIHNpemUtMSk7CisgICAgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZTdHJpbmdSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoU3Vic3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVDb3B5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRMZW5ndGgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMZW5ndGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgVUludDggbG9zc0J5dGUsIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uLCBDRkluZGV4IG1heEJ1ZkxlbikgLT4gKENGSW5kZXggX3J2LCBVSW50OCBidWZmZXIsIENGSW5kZXggdXNlZEJ1ZkxlbikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUV4dGVybmFsUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBVSW50OCBsb3NzQnl0ZSkgLT4gKENGRGF0YVJlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0aGVTdHJpbmcyLCBDRlJhbmdlIHJhbmdlVG9Db21wYXJlLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZDb21wYXJpc29uUmVzdWx0IF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbXBhcmUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDb21wYXJlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0aGVTdHJpbmcyLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZDb21wYXJpc29uUmVzdWx0IF9ydikiKX0sCi0JeyJDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kLCBDRlJhbmdlIHJhbmdlVG9TZWFyY2gsIENGT3B0aW9uRmxhZ3Mgc2VhcmNoT3B0aW9ucykgLT4gKEJvb2xlYW4gX3J2LCBDRlJhbmdlIHJlc3VsdCkiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQXJyYXlXaXRoRmluZFJlc3VsdHMsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZCwgQ0ZSYW5nZSByYW5nZVRvU2VhcmNoLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdGaW5kIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nRmluZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZSYW5nZSBfcnYpIil9LAotCXsiQ0ZTdHJpbmdIYXNQcmVmaXgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdIYXNQcmVmaXgsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHByZWZpeCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNGU3RyaW5nSGFzU3VmZml4IiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nSGFzU3VmZml4LCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBzdWZmaXgpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDRlN0cmluZ0dldExpbmVCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMaW5lQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlKSAtPiAoQ0ZJbmRleCBsaW5lQmVnaW5JbmRleCwgQ0ZJbmRleCBsaW5lRW5kSW5kZXgsIENGSW5kZXggY29udGVudHNFbmRJbmRleCkiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc2VwYXJhdG9yU3RyaW5nKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRJbnRWYWx1ZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEludFZhbHVlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0RG91YmxlVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU2hvd1N0ciIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlNob3dTdHIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNGVVJMQ3JlYXRlV2l0aFN0cmluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGJhc2VVUkwpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSwgQm9vbGVhbiBpc0RpcmVjdG9yeSkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoUmVsYXRpdmVUb0Jhc2UsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSwgQm9vbGVhbiBpc0RpcmVjdG9yeSwgQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZVN0cmluZ0J5UmVwbGFjaW5nUGVyY2VudEVzY2FwZXMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlU3RyaW5nQnlBZGRpbmdQZXJjZW50RXNjYXBlcywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQsIENGU3RyaW5nUmVmIGxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U3RyaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzdHJpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0VW5pY29kZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFVuaWNvZGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHVuaWNvZGUgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkNGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZVdpdGhTdWJzdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0TGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0TGVuZ3RoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0Qnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIFVJbnQ4IGxvc3NCeXRlLCBCb29sZWFuIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwgQ0ZJbmRleCBtYXhCdWZMZW4pIC0+IChDRkluZGV4IF9ydiwgVUludDggYnVmZmVyLCBDRkluZGV4IHVzZWRCdWZMZW4pIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgVUludDggbG9zc0J5dGUpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMiwgQ0ZSYW5nZSByYW5nZVRvQ29tcGFyZSwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGQ29tcGFyaXNvblJlc3VsdCBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDb21wYXJlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29tcGFyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMiwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGQ29tcGFyaXNvblJlc3VsdCBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZCwgQ0ZSYW5nZSByYW5nZVRvU2VhcmNoLCBDRk9wdGlvbkZsYWdzIHNlYXJjaE9wdGlvbnMpIC0+IChCb29sZWFuIF9ydiwgQ0ZSYW5nZSByZXN1bHQpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVBcnJheVdpdGhGaW5kUmVzdWx0cyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQsIENGUmFuZ2UgcmFuZ2VUb1NlYXJjaCwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nRmluZCIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0ZpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZCwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGUmFuZ2UgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nSGFzUHJlZml4IiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nSGFzUHJlZml4LCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBwcmVmaXgpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0hhc1N1ZmZpeCIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0hhc1N1ZmZpeCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3VmZml4KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRMaW5lQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0TGluZUJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSkgLT4gKENGSW5kZXggbGluZUJlZ2luSW5kZXgsIENGSW5kZXggbGluZUVuZEluZGV4LCBDRkluZGV4IGNvbnRlbnRzRW5kSW5kZXgpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVBcnJheUJ5U2VwYXJhdGluZ1N0cmluZ3MiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVBcnJheUJ5U2VwYXJhdGluZ1N0cmluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZykgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0SW50VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRJbnRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldERvdWJsZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0RG91YmxlVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGRvdWJsZSBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDb252ZXJ0SUFOQUNoYXJTZXROYW1lVG9FbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCisgICAgeyJDRlNob3dTdHIiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTaG93U3RyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDRlVSTENyZWF0ZVdpdGhTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBiYXNlVVJMKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGUsIEJvb2xlYW4gaXNEaXJlY3RvcnkpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGhSZWxhdGl2ZVRvQmFzZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGUsIEJvb2xlYW4gaXNEaXJlY3RvcnksIENGVVJMUmVmIGJhc2VVUkwpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlU3RyaW5nQnlSZXBsYWNpbmdQZXJjZW50RXNjYXBlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlU3RyaW5nQnlBZGRpbmdQZXJjZW50RXNjYXBlcyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVN0cmluZ0J5QWRkaW5nUGVyY2VudEVzY2FwZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlVW5lc2NhcGVkLCBDRlN0cmluZ1JlZiBsZWdhbFVSTENoYXJhY3RlcnNUb0JlRXNjYXBlZCwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldFN0cmluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc3RyaW5nIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldFVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRVbmljb2RlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bmljb2RlIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGU3RyaW5nUmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMjQzNSwxMDAgKzI0MzUsMTAwIEBACiAKIHN0YXRpYyBpbnQgQ0ZTdHJpbmdSZWZPYmpfY29tcGFyZShDRlN0cmluZ1JlZk9iamVjdCAqc2VsZiwgQ0ZTdHJpbmdSZWZPYmplY3QgKm90aGVyKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogQ0ZTdHJpbmdSZWZPYmpfcmVwcihDRlN0cmluZ1JlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGU3RyaW5nUmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8Q0ZTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZTdHJpbmdSZWZPYmpfaGFzaChDRlN0cmluZ1JlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRlN0cmluZ1JlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZTdHJpbmdSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIENGU3RyaW5nUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGU3RyaW5nUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRlN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZTdHJpbmdSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICAvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZTdHJpbmdSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBDRlN0cmluZ1JlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZTdHJpbmdSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQkoKENGU3RyaW5nUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRlN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZTdHJpbmdSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIENGU3RyaW5nUmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGU3RyaW5nUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGU3RyaW5nUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ0ZTdHJpbmdSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRlN0cmluZ1JlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRlN0cmluZ1JlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ0ZTdHJpbmdSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGU3RyaW5nUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGU3RyaW5nUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNGU3RyaW5nUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGU3RyaW5nUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRlN0cmluZ1JlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDRlN0cmluZ1JlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGU3RyaW5nUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZTdHJpbmdSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDRlN0cmluZ1JlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGU3RyaW5nUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGU3RyaW5nUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDRlN0cmluZ1JlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZTdHJpbmdSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZTdHJpbmdSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ0ZTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZTdHJpbmdSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGU3RyaW5nUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIENGU3RyaW5nUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZTdHJpbmdSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRlN0cmluZ1JlZiAtLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNTQxLDI4MSArMjU0MSwyODEgQEAKICNkZWZpbmUgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGTXV0YWJsZVN0cmluZ1JlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGTXV0YWJsZVN0cmluZ1JlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9OZXcoQ0ZNdXRhYmxlU3RyaW5nUmVmIGl0c2VsZikKIHsKLQlDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVTdHJpbmdSZWZPYmplY3QsICZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCwgJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZNdXRhYmxlU3RyaW5nUmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZVN0cmluZ1JlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZVN0cmluZ1JlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRk11dGFibGVTdHJpbmdSZWZPYmpfZGVhbGxvYyhDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRlN0cmluZ1JlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRlN0cmluZ1JlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgYXBwZW5kZWRTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIGFwcGVuZGVkU3RyaW5nOwogI2lmbmRlZiBDRlN0cmluZ0FwcGVuZAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0FwcGVuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBlbmRlZFN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nQXBwZW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgYXBwZW5kZWRTdHJpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBlbmRlZFN0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nQXBwZW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgYXBwZW5kZWRTdHJpbmcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVW5pQ2hhciAqY2hhcnNfX2luX187Ci0JVW5pQ2hhckNvdW50IGNoYXJzX19sZW5fXzsKLQlpbnQgY2hhcnNfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVbmlDaGFyICpjaGFyc19faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgY2hhcnNfX2xlbl9fOworICAgIGludCBjaGFyc19faW5fbGVuX187CiAjaWZuZGVmIENGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzX19pbl9fLCAmY2hhcnNfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2hhcnNfX2xlbl9fID0gY2hhcnNfX2luX2xlbl9fOwotCUNGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc19faW5fXywgY2hhcnNfX2xlbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187CisgICAgQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmcoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgcFN0cjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgcFN0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBTdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kQ1N0cmluZyhDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIqIGNTdHI7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciogY1N0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0FwcGVuZENTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0FwcGVuZENTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kQ1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ0FwcGVuZENTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ0FwcGVuZENTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdJbnNlcnQoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGlkeDsKLQlDRlN0cmluZ1JlZiBpbnNlcnRlZFN0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBpZHg7CisgICAgQ0ZTdHJpbmdSZWYgaW5zZXJ0ZWRTdHI7CiAjaWZuZGVmIENGU3RyaW5nSW5zZXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdJbnNlcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nSW5zZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZHgsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbnNlcnRlZFN0cikpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nSW5zZXJ0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgaWR4LAotCSAgICAgICAgICAgICAgIGluc2VydGVkU3RyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluc2VydGVkU3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdJbnNlcnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBpZHgsCisgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRTdHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdEZWxldGUoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlJhbmdlIHJhbmdlOwogI2lmbmRlZiBDRlN0cmluZ0RlbGV0ZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nRGVsZXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0RlbGV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdEZWxldGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICByYW5nZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ0RlbGV0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIHJhbmdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZShDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGUmFuZ2UgcmFuZ2U7Ci0JQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgcmFuZ2U7CisgICAgQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQ7CiAjaWZuZGVmIENGU3RyaW5nUmVwbGFjZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nUmVwbGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdSZXBsYWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnJlcGxhY2VtZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdSZXBsYWNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICByZXBsYWNlbWVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnJlcGxhY2VtZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdSZXBsYWNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1JlcGxhY2VBbGwoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiByZXBsYWNlbWVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQ7CiAjaWZuZGVmIENGU3RyaW5nUmVwbGFjZUFsbAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nUmVwbGFjZUFsbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdSZXBsYWNlQWxsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnJlcGxhY2VtZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdSZXBsYWNlQWxsKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcmVwbGFjZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ1JlcGxhY2VBbGwoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdQYWQoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBwYWRTdHJpbmc7Ci0JQ0ZJbmRleCBsZW5ndGg7Ci0JQ0ZJbmRleCBpbmRleEludG9QYWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIHBhZFN0cmluZzsKKyAgICBDRkluZGV4IGxlbmd0aDsKKyAgICBDRkluZGV4IGluZGV4SW50b1BhZDsKICNpZm5kZWYgQ0ZTdHJpbmdQYWQKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ1BhZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdQYWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwYWRTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleEludG9QYWQpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ1BhZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIHBhZFN0cmluZywKLQkgICAgICAgICAgICBsZW5ndGgsCi0JICAgICAgICAgICAgaW5kZXhJbnRvUGFkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwYWRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleEludG9QYWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ1BhZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIHBhZFN0cmluZywKKyAgICAgICAgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgaW5kZXhJbnRvUGFkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nVHJpbShDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIHRyaW1TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIHRyaW1TdHJpbmc7CiAjaWZuZGVmIENGU3RyaW5nVHJpbQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nVHJpbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdUcmltKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRyaW1TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ1RyaW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgdHJpbVN0cmluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRyaW1TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ1RyaW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgdHJpbVN0cmluZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1RyaW1XaGl0ZXNwYWNlKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDRlN0cmluZ1RyaW1XaGl0ZXNwYWNlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nVHJpbVdoaXRlc3BhY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGU3RyaW5nQXBwZW5kIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwZW5kZWRTdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ0FwcGVuZENoYXJhY3RlcnMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGNoYXJzKSAtPiBOb25lIil9LAotCXsiQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgcFN0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gTm9uZSIpfSwKLQl7IkNGU3RyaW5nQXBwZW5kQ1N0cmluZyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRDU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihjaGFyKiBjU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiBOb25lIil9LAotCXsiQ0ZTdHJpbmdJbnNlcnQiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nSW5zZXJ0LCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGlkeCwgQ0ZTdHJpbmdSZWYgaW5zZXJ0ZWRTdHIpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ0RlbGV0ZSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdEZWxldGUsIDEsCi0JIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1JlcGxhY2UiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSwgQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1JlcGxhY2VBbGwiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZUFsbCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1BhZCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdQYWQsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHBhZFN0cmluZywgQ0ZJbmRleCBsZW5ndGgsIENGSW5kZXggaW5kZXhJbnRvUGFkKSAtPiBOb25lIil9LAotCXsiQ0ZTdHJpbmdUcmltIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1RyaW0sIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHRyaW1TdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1RyaW1XaGl0ZXNwYWNlIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1RyaW1XaGl0ZXNwYWNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRlN0cmluZ0FwcGVuZCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGVuZGVkU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZENoYXJhY3RlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBjaGFycykgLT4gTm9uZSIpfSwKKyAgICB7IkNGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHBTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDRlN0cmluZ0FwcGVuZENTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kQ1N0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoY2hhciogY1N0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gTm9uZSIpfSwKKyAgICB7IkNGU3RyaW5nSW5zZXJ0IiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0luc2VydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBpZHgsIENGU3RyaW5nUmVmIGluc2VydGVkU3RyKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdEZWxldGUiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nRGVsZXRlLCAxLAorICAgICBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdSZXBsYWNlIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1JlcGxhY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UsIENGU3RyaW5nUmVmIHJlcGxhY2VtZW50KSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdSZXBsYWNlQWxsIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1JlcGxhY2VBbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHJlcGxhY2VtZW50KSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdQYWQiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUGFkLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBwYWRTdHJpbmcsIENGSW5kZXggbGVuZ3RoLCBDRkluZGV4IGluZGV4SW50b1BhZCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGU3RyaW5nVHJpbSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdUcmltLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0cmltU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRk11dGFibGVTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0yODIzLDEwMCArMjgyMywxMDAgQEAKIAogc3RhdGljIGludCBDRk11dGFibGVTdHJpbmdSZWZPYmpfY29tcGFyZShDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKnNlbGYsIENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRk11dGFibGVTdHJpbmdSZWZPYmpfcmVwcihDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2hhc2goQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZNdXRhYmxlU3RyaW5nUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRk11dGFibGVTdHJpbmdSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGTXV0YWJsZVN0cmluZ1JlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRk11dGFibGVTdHJpbmdSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRk11dGFibGVTdHJpbmdSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRk11dGFibGVTdHJpbmdSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRk11dGFibGVTdHJpbmdSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRk11dGFibGVTdHJpbmdSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGTXV0YWJsZVN0cmluZ1JlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRk11dGFibGVTdHJpbmdSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZNdXRhYmxlU3RyaW5nUmVmIC0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjkyOSw1NDUgKzI5MjksNTQ1IEBACiAjZGVmaW5lIENGVVJMUmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGVVJMUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGVVJMUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRlVSTFJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGVVJMUmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZVUkxSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRlVSTFJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGVVJMUmVmT2JqX05ldyhDRlVSTFJlZiBpdHNlbGYpCiB7Ci0JQ0ZVUkxSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRlVSTFJlZk9iamVjdCwgJkNGVVJMUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRlVSTFJlZk9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKENGVVJMUmVmT2JqZWN0LCAmQ0ZVUkxSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZVUkxSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZVUkxSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0JaWYgKCFDRlVSTFJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlVSTFJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRlVSTFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRlVSTFJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlVSTFJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRlVSTFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGVVJMUmVmT2JqX2RlYWxsb2MoQ0ZVUkxSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICB9CisgICAgQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENyZWF0ZURhdGEoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGF0YVJlZiBfcnY7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKLQlCb29sZWFuIGVzY2FwZVdoaXRlc3BhY2U7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZlc2NhcGVXaGl0ZXNwYWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlV2hpdGVzcGFjZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkRhdGFSZWYgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgQm9vbGVhbiBlc2NhcGVXaGl0ZXNwYWNlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXNjYXBlV2hpdGVzcGFjZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlRGF0YSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZVdoaXRlc3BhY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQm9vbGVhbiByZXNvbHZlQWdhaW5zdEJhc2U7Ci0JVUludDggYnVmZmVyOwotCUNGSW5kZXggbWF4QnVmTGVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBCb29sZWFuIHJlc29sdmVBZ2FpbnN0QmFzZTsKKyAgICBVSW50OCBidWZmZXI7CisgICAgQ0ZJbmRleCBtYXhCdWZMZW47CiAjaWZuZGVmIENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBZ2FpbnN0QmFzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heEJ1ZkxlbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFnYWluc3RCYXNlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmTGVuKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBZ2FpbnN0QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heEJ1ZkxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFnYWluc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmTGVuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUFic29sdXRlVVJMKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5QWJzb2x1dGVVUkwKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlBYnNvbHV0ZVVSTCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5QWJzb2x1dGVVUkwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weUFic29sdXRlVVJMKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlBYnNvbHV0ZVVSTChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTEdldFN0cmluZyhDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CiAjaWZuZGVmIENGVVJMR2V0U3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0U3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTEdldFN0cmluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxHZXRTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRCYXNlVVJMKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxHZXRCYXNlVVJMCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRCYXNlVVJMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTEdldEJhc2VVUkwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMR2V0QmFzZVVSTChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxHZXRCYXNlVVJMKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ2FuQmVEZWNvbXBvc2VkKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIENGVVJMQ2FuQmVEZWNvbXBvc2VkCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDYW5CZURlY29tcG9zZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ2FuQmVEZWNvbXBvc2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENhbkJlRGVjb21wb3NlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDYW5CZURlY29tcG9zZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U2NoZW1lKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5U2NoZW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5U2NoZW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlTY2hlbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVNjaGVtZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5U2NoZW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weU5ldExvY2F0aW9uKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5TmV0TG9jYXRpb24KLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlOZXRMb2NhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5TmV0TG9jYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weU5ldExvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlOZXRMb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlQYXRoKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UGF0aAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U3RyaWN0UGF0aChDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCUJvb2xlYW4gaXNBYnNvbHV0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIEJvb2xlYW4gaXNBYnNvbHV0ZTsKICNpZm5kZWYgQ0ZVUkxDb3B5U3RyaWN0UGF0aAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVN0cmljdFBhdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVN0cmljdFBhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVN0cmljdFBhdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0Fic29sdXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpc0Fic29sdXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5U3RyaWN0UGF0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzQWJzb2x1dGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZVUkxQYXRoU3R5bGUgcGF0aFN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZVUkxQYXRoU3R5bGUgcGF0aFN0eWxlOwogI2lmbmRlZiBDRlVSTENvcHlGaWxlU3lzdGVtUGF0aAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlGaWxlU3lzdGVtUGF0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhdGhTdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0eWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhTdHlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0eWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTEhhc0RpcmVjdG9yeVBhdGgoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTEhhc0RpcmVjdG9yeVBhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMSGFzRGlyZWN0b3J5UGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVJlc291cmNlU3BlY2lmaWVyKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVJlc291cmNlU3BlY2lmaWVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlIb3N0TmFtZShDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CiAjaWZuZGVmIENGVVJMQ29weUhvc3ROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5SG9zdE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUhvc3ROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENvcHlIb3N0TmFtZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5SG9zdE5hbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRQb3J0TnVtYmVyKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBDRlVSTEdldFBvcnROdW1iZXIKLQlQeU1hY19QUkVDSEVDSyhDRlVSTEdldFBvcnROdW1iZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0UG9ydE51bWJlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxHZXRQb3J0TnVtYmVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTEdldFBvcnROdW1iZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5VXNlck5hbWUoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OwogI2lmbmRlZiBDRlVSTENvcHlVc2VyTmFtZQotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVVzZXJOYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlVc2VyTmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5VXNlck5hbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVVzZXJOYW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVBhc3N3b3JkKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UGFzc3dvcmQKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlQYXNzd29yZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UGFzc3dvcmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhc3N3b3JkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlQYXNzd29yZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlQYXJhbWV0ZXJTdHJpbmcoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQ7CiAjaWZuZGVmIENGVVJMQ29weVBhcmFtZXRlclN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhcmFtZXRlclN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhcmFtZXRlclN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVBhcmFtZXRlclN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVF1ZXJ5U3RyaW5nKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOwogI2lmbmRlZiBDRlVSTENvcHlRdWVyeVN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVF1ZXJ5U3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlRdWVyeVN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENvcHlRdWVyeVN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5UXVlcnlTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUZyYWdtZW50KENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOwogI2lmbmRlZiBDRlVSTENvcHlGcmFnbWVudAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUZyYWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlGcmFnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENvcHlGcmFnbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5RnJhZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50KENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlQYXRoRXh0ZW5zaW9uKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGhFeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGhFeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhdGhFeHRlbnNpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVBhdGhFeHRlbnNpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudChDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCUNGU3RyaW5nUmVmIHBhdGhDb21wb25lbnQ7Ci0JQm9vbGVhbiBpc0RpcmVjdG9yeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcGF0aENvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudCgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoQ29tcG9uZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlVSTFJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgcGF0aENvbXBvbmVudDsKKyAgICBCb29sZWFuIGlzRGlyZWN0b3J5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwYXRoQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudChDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudCgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhFeHRlbnNpb24oQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBleHRlbnNpb247Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmZXh0ZW5zaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aEV4dGVuc2lvbigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlVSTFJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgZXh0ZW5zaW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmV4dGVuc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhFeHRlbnNpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24oQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdQYXRoRXh0ZW5zaW9uKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMR2V0RlNSZWYoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUZTUmVmIGZzUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBGU1JlZiBmc1JlZjsKICNpZm5kZWYgQ0ZVUkxHZXRGU1JlZgotCVB5TWFjX1BSRUNIRUNLKENGVVJMR2V0RlNSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0RlNSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMR2V0RlNSZWYoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZmc1JlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZmc1JlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMR2V0RlNSZWYoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmc1JlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZmc1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRlVSTFJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRlVSTENyZWF0ZURhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVEYXRhLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBCb29sZWFuIGVzY2FwZVdoaXRlc3BhY2UpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKLQl7IkNGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIHJlc29sdmVBZ2FpbnN0QmFzZSwgQ0ZJbmRleCBtYXhCdWZMZW4pIC0+IChCb29sZWFuIF9ydiwgVUludDggYnVmZmVyKSIpfSwKLQl7IkNGVVJMQ29weUFic29sdXRlVVJMIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUFic29sdXRlVVJMLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxHZXRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTEdldEJhc2VVUkwiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRCYXNlVVJMLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxDYW5CZURlY29tcG9zZWQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDYW5CZURlY29tcG9zZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNGVVJMQ29weVNjaGVtZSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlTY2hlbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTENvcHlOZXRMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlOZXRMb2NhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVN0cmljdFBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U3RyaWN0UGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2LCBCb29sZWFuIGlzQWJzb2x1dGUpIil9LAotCXsiQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTEhhc0RpcmVjdG9yeVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllciIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weUhvc3ROYW1lIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUhvc3ROYW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxHZXRQb3J0TnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0UG9ydE51bWJlciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJDRlVSTENvcHlVc2VyTmFtZSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlVc2VyTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVBhc3N3b3JkIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhc3N3b3JkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhcmFtZXRlclN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVF1ZXJ5U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVF1ZXJ5U3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5RnJhZ21lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5RnJhZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVBhdGhFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgcGF0aENvbXBvbmVudCwgQm9vbGVhbiBpc0RpcmVjdG9yeSkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nTGFzdFBhdGhDb21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhFeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGV4dGVuc2lvbikgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdQYXRoRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxHZXRGU1JlZiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldEZTUmVmLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgRlNSZWYgZnNSZWYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZVUkxDcmVhdGVEYXRhIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgQm9vbGVhbiBlc2NhcGVXaGl0ZXNwYWNlKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiByZXNvbHZlQWdhaW5zdEJhc2UsIENGSW5kZXggbWF4QnVmTGVuKSAtPiAoQm9vbGVhbiBfcnYsIFVJbnQ4IGJ1ZmZlcikiKX0sCisgICAgeyJDRlVSTENvcHlBYnNvbHV0ZVVSTCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlBYnNvbHV0ZVVSTCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0U3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxHZXRCYXNlVVJMIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0QmFzZVVSTCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ2FuQmVEZWNvbXBvc2VkIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ2FuQmVEZWNvbXBvc2VkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlTY2hlbWUiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U2NoZW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5TmV0TG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5TmV0TG9jYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlTdHJpY3RQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVN0cmljdFBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydiwgQm9vbGVhbiBpc0Fic29sdXRlKSIpfSwKKyAgICB7IkNGVVJMQ29weUZpbGVTeXN0ZW1QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUZpbGVTeXN0ZW1QYXRoLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGUpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMSGFzRGlyZWN0b3J5UGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlIb3N0TmFtZSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlIb3N0TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0UG9ydE51bWJlciIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldFBvcnROdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5VXNlck5hbWUiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5VXNlck5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlQYXNzd29yZCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlQYXNzd29yZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weVBhcmFtZXRlclN0cmluZyIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlQYXJhbWV0ZXJTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlRdWVyeVN0cmluZyIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlRdWVyeVN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weUZyYWdtZW50IiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUZyYWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlQYXRoRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhdGhFeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHBhdGhDb21wb25lbnQsIEJvb2xlYW4gaXNEaXJlY3RvcnkpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aEV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBleHRlbnNpb24pIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdQYXRoRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nUGF0aEV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0RlNSZWYiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRGU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIEZTUmVmIGZzUmVmKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZVUkxSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zNDc1LDEwMCArMzQ3NSwxMDAgQEAKIAogc3RhdGljIGludCBDRlVSTFJlZk9ial9jb21wYXJlKENGVVJMUmVmT2JqZWN0ICpzZWxmLCBDRlVSTFJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRlVSTFJlZk9ial9yZXByKENGVVJMUmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZVUkwgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRlVSTCBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRlVSTFJlZk9ial9oYXNoKENGVVJMUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGVVJMUmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRlVSTFJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZVUkxSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZVUkxSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGVVJMUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRlVSTFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRlVSTFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGVVJMUmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRlVSTFJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZVUkxSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGVVJMUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRlVSTFJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZVUkxSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZVUkxSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZVUkxSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRlVSTFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGVVJMUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGVVJMUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRlVSTFJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZVUkxSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZVUkxSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZVUkxSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZVUkxSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGVVJMUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGVVJMUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZVUkxSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRlVSTFJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGVVJMUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZVUkxSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZVUkxSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGVVJMUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRlVSTFJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRlVSTFJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRlVSTFJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRlVSTFJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZVUkxSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZVUkxSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRlVSTFJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZVUkxSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTM1NzYsMTI1MCArMzU3NiwxMjUwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfX19DRlJhbmdlTWFrZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZSYW5nZSBfcnY7Ci0JQ0ZJbmRleCBsb2M7Ci0JQ0ZJbmRleCBsZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgX3J2OworICAgIENGSW5kZXggbG9jOworICAgIENGSW5kZXggbGVuOwogI2lmbmRlZiBfX0NGUmFuZ2VNYWtlCi0JUHlNYWNfUFJFQ0hFQ0soX19DRlJhbmdlTWFrZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soX19DRlJhbmdlTWFrZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBfX0NGUmFuZ2VNYWtlKGxvYywKLQkgICAgICAgICAgICAgICAgICAgIGxlbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBfX0NGUmFuZ2VNYWtlKGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkFsbG9jYXRvckdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGQWxsb2NhdG9yR2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZBbGxvY2F0b3JHZXRUeXBlSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQWxsb2NhdG9yR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkFsbG9jYXRvckdldFR5cGVJRCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkFsbG9jYXRvckdldFR5cGVJRCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OwotCUNGSW5kZXggc2l6ZTsKLQlDRk9wdGlvbkZsYWdzIGhpbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OworICAgIENGSW5kZXggc2l6ZTsKKyAgICBDRk9wdGlvbkZsYWdzIGhpbnQ7CiAjaWZuZGVmIENGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUKLQlQeU1hY19QUkVDSEVDSyhDRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZBbGxvY2F0b3JHZXRQcmVmZXJyZWRTaXplRm9yU2l6ZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGludCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlR5cGVJRCB0eXBlX2lkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZUeXBlSUQgdHlwZV9pZDsKICNpZm5kZWYgQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhDRkNvcHlUeXBlSUREZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX2lkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24odHlwZV9pZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX2lkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24odHlwZV9pZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZBcnJheUdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGQXJyYXlHZXRUeXBlSUQKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5R2V0VHlwZUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5R2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkFycmF5R2V0VHlwZUlEKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQXJyYXlHZXRUeXBlSUQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkFycmF5Q3JlYXRlTXV0YWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGTXV0YWJsZUFycmF5UmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OwogI2lmbmRlZiBDRkFycmF5Q3JlYXRlTXV0YWJsZQotCVB5TWFjX1BSRUNIRUNLKENGQXJyYXlDcmVhdGVNdXRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5Q3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZBcnJheUNyZWF0ZU11dGFibGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVBcnJheVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQXJyYXlDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlQXJyYXlDYWxsQmFja3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGQXJyYXlDcmVhdGVNdXRhYmxlQ29weShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7Ci0JQ0ZBcnJheVJlZiB0aGVBcnJheTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2OworICAgIENGSW5kZXggY2FwYWNpdHk7CisgICAgQ0ZBcnJheVJlZiB0aGVBcnJheTsKICNpZm5kZWYgQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZ0aGVBcnJheSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQXJyYXlDcmVhdGVNdXRhYmxlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFycmF5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZUFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJnRoZUFycmF5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXJyYXkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGRGF0YUdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGRGF0YUdldFR5cGVJRAotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUdldFR5cGVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRhdGFHZXRUeXBlSUQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZEYXRhR2V0VHlwZUlEKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEYXRhQ3JlYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCXVuc2lnbmVkIGNoYXIgKmJ5dGVzX19pbl9fOwotCWxvbmcgYnl0ZXNfX2xlbl9fOwotCWludCBieXRlc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187CisgICAgbG9uZyBieXRlc19fbGVuX187CisgICAgaW50IGJ5dGVzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZEYXRhQ3JlYXRlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFDcmVhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCXVuc2lnbmVkIGNoYXIgKmJ5dGVzX19pbl9fOwotCWxvbmcgYnl0ZXNfX2xlbl9fOwotCWludCBieXRlc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187CisgICAgbG9uZyBieXRlc19fbGVuX187CisgICAgaW50IGJ5dGVzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX19pbl9fLCAmYnl0ZXNfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnl0ZXNfX2xlbl9fID0gYnl0ZXNfX2luX2xlbl9fOworICAgIF9ydiA9IENGRGF0YUNyZWF0ZVdpdGhCeXRlc05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfX2luX18sIGJ5dGVzX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGQWxsb2NhdG9yUmVmKU5VTEwpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkRhdGFDcmVhdGVNdXRhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVEYXRhUmVmIF9ydjsKLQlDRkluZGV4IGNhcGFjaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVEYXRhUmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OwogI2lmbmRlZiBDRkRhdGFDcmVhdGVNdXRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlTXV0YWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZURhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRhdGFDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGTXV0YWJsZURhdGFSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7Ci0JQ0ZEYXRhUmVmIHRoZURhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGTXV0YWJsZURhdGFSZWYgX3J2OworICAgIENGSW5kZXggY2FwYWNpdHk7CisgICAgQ0ZEYXRhUmVmIHRoZURhdGE7CiAjaWZuZGVmIENGRGF0YUNyZWF0ZU11dGFibGVDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGF0YUNyZWF0ZU11dGFibGVDb3B5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX0NvbnZlcnQsICZ0aGVEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVEYXRhUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9Db252ZXJ0LCAmdGhlRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGF0YUNyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZUlEIF9ydjsKICNpZm5kZWYgQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlHZXRUeXBlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGljdGlvbmFyeUdldFR5cGVJRCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKLQlDRkluZGV4IGNhcGFjaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OwogI2lmbmRlZiBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKLQlDRkluZGV4IGNhcGFjaXR5OwotCUNGRGljdGlvbmFyeVJlZiB0aGVEaWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OworICAgIENGRGljdGlvbmFyeVJlZiB0aGVEaWN0OwogI2lmbmRlZiBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weQotCVB5TWFjX1BSRUNIRUNLKENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0LCAmdGhlRGljdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURpY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCwgJnRoZURpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEaWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVHlwZVJlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYga2V5OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nUmVmIGtleTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIGtleTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIEJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OwotCUNGU3RyaW5nUmVmIGtleTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OworICAgIENGU3RyaW5nUmVmIGtleTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIEJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGVHlwZVJlZiB2YWx1ZTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBrZXk7CisgICAgQ0ZUeXBlUmVmIHZhbHVlOworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlKGtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfQ29udmVydCwgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZShrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiBzdWl0ZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIENGU3RyaW5nUmVmIHN1aXRlSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHAKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN1aXRlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwKGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc3VpdGVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHAoYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7Ci0JQ0ZTdHJpbmdSZWYgc3VpdGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKKyAgICBDRlN0cmluZ1JlZiBzdWl0ZUlEOwogI2lmbmRlZiBDRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHApOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdWl0ZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwKGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdWl0ZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwKGFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0FwcFN5bmNocm9uaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUoYXBwbGljYXRpb25JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZShhcHBsaWNhdGlvbklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzQ29weVZhbHVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVSZWYgX3J2OwotCUNGU3RyaW5nUmVmIGtleTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUNGU3RyaW5nUmVmIHVzZXJOYW1lOwotCUNGU3RyaW5nUmVmIGhvc3ROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVSZWYgX3J2OworICAgIENGU3RyaW5nUmVmIGtleTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIENGU3RyaW5nUmVmIHVzZXJOYW1lOworICAgIENGU3RyaW5nUmVmIGhvc3ROYW1lOwogI2lmbmRlZiBDRlByZWZlcmVuY2VzQ29weVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5VmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5VmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzQ29weU11bHRpcGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRpY3Rpb25hcnlSZWYgX3J2OwotCUNGQXJyYXlSZWYga2V5c1RvRmV0Y2g7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIF9ydjsKKyAgICBDRkFycmF5UmVmIGtleXNUb0ZldGNoOworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weU11bHRpcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weU11bHRpcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAma2V5c1RvRmV0Y2gsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUoa2V5c1RvRmV0Y2gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAma2V5c1RvRmV0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUoa2V5c1RvRmV0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNTZXRWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGVHlwZVJlZiB2YWx1ZTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUNGU3RyaW5nUmVmIHVzZXJOYW1lOwotCUNGU3RyaW5nUmVmIGhvc3ROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBrZXk7CisgICAgQ0ZUeXBlUmVmIHZhbHVlOworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNTZXRWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTZXRWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1NldFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfQ29udmVydCwgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaG9zdE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlByZWZlcmVuY2VzU2V0VmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGUHJlZmVyZW5jZXNTZXRWYWx1ZShrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGljdGlvbmFyeVJlZiBrZXlzVG9TZXQ7Ci0JQ0ZBcnJheVJlZiBrZXlzVG9SZW1vdmU7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIGtleXNUb1NldDsKKyAgICBDRkFycmF5UmVmIGtleXNUb1JlbW92ZTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIENGU3RyaW5nUmVmIHVzZXJOYW1lOworICAgIENGU3RyaW5nUmVmIGhvc3ROYW1lOwogI2lmbmRlZiBDRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTZXRNdWx0aXBsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZrZXlzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJmtleXNUb1JlbW92ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZQcmVmZXJlbmNlc1NldE11bHRpcGxlKGtleXNUb1NldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1RvUmVtb3ZlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZrZXlzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJmtleXNUb1JlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZQcmVmZXJlbmNlc1NldE11bHRpcGxlKGtleXNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1RvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzU3luY2hyb25pemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7Ci0JQ0ZTdHJpbmdSZWYgdXNlck5hbWU7Ci0JQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZShhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZShhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIF9ydjsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KHVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KHVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZBcnJheVJlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKKyAgICBDRlN0cmluZ1JlZiB1c2VyTmFtZTsKKyAgICBDRlN0cmluZ1JlZiBob3N0TmFtZTsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weUtleUxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0KGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaG9zdE5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlByZWZlcmVuY2VzQ29weUtleUxpc3QoYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nR2V0VHlwZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZUlEIF9ydjsKICNpZm5kZWYgQ0ZTdHJpbmdHZXRUeXBlSUQKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldFR5cGVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRUeXBlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0VHlwZUlEKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nR2V0VHlwZUlEKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JU3RyMjU1IHBTdHI7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIFN0cjI1NSBwU3RyOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcFN0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JY2hhciogY1N0cjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgY2hhciogY1N0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JVW5pQ2hhciAqY2hhcnNfX2luX187Ci0JVW5pQ2hhckNvdW50IGNoYXJzX19sZW5fXzsKLQlpbnQgY2hhcnNfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgVW5pQ2hhciAqY2hhcnNfX2luX187CisgICAgVW5pQ2hhckNvdW50IGNoYXJzX19sZW5fXzsKKyAgICBpbnQgY2hhcnNfX2luX2xlbl9fOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaGFyc19faW5fXywgJmNoYXJzX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWNoYXJzX19sZW5fXyA9IGNoYXJzX19pbl9sZW5fXzsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNfX2luX18sIGNoYXJzX19sZW5fXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCVN0cjI1NSBwU3RyOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBTdHIyNTUgcFN0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmdOb0NvcHkKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmdOb0NvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBTdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRkFsbG9jYXRvclJlZilOVUxMKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRkFsbG9jYXRvclJlZilOVUxMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JY2hhciogY1N0cjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgY2hhciogY1N0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGQWxsb2NhdG9yUmVmKU5VTEwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCVVuaUNoYXIgKmNoYXJzX19pbl9fOwotCVVuaUNoYXJDb3VudCBjaGFyc19fbGVuX187Ci0JaW50IGNoYXJzX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIFVuaUNoYXIgKmNoYXJzX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBjaGFyc19fbGVuX187CisgICAgaW50IGNoYXJzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQljaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVTdHJpbmdSZWYgX3J2OwotCUNGSW5kZXggbWF4TGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVTdHJpbmdSZWYgX3J2OworICAgIENGSW5kZXggbWF4TGVuZ3RoOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZU11dGFibGUKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZU11dGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heExlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhMZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZU11dGFibGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGTXV0YWJsZVN0cmluZ1JlZiBfcnY7Ci0JQ0ZJbmRleCBtYXhMZW5ndGg7Ci0JQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVTdHJpbmdSZWYgX3J2OworICAgIENGSW5kZXggbWF4TGVuZ3RoOworICAgIENGU3RyaW5nUmVmIHRoZVN0cmluZzsKICNpZm5kZWYgQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heExlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRoZVN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187Ci0JbG9uZyBieXRlc19fbGVuX187Ci0JaW50IGJ5dGVzX19pbl9sZW5fXzsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwotCUJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187CisgICAgbG9uZyBieXRlc19fbGVuX187CisgICAgaW50IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX19pbl9fLCAmYnl0ZXNfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0V4dGVybmFsUmVwcmVzZW50YXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfX2luX18sIGJ5dGVzX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsUmVwcmVzZW50YXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nRW5jb2RpbmcgX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdHZXRNYXhpbXVtU2l6ZUZvckVuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IF9ydjsKLQlDRkluZGV4IGxlbmd0aDsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKKyAgICBDRkluZGV4IGxlbmd0aDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyhsZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyhsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUoZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUoZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKICNpZm5kZWYgQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcoZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldE5hbWVPZkVuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb05TU3RyaW5nRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZyhlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBfcnY7Ci0JVUludDMyIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBVSW50MzIgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZyhlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKICNpZm5kZWYgQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UoZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKLQlVSW50MzIgY29kZXBhZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nRW5jb2RpbmcgX3J2OworICAgIFVJbnQzMiBjb2RlcGFnZTsKICNpZm5kZWYgQ0ZTdHJpbmdDb252ZXJ0V2luZG93c0NvZGVwYWdlVG9FbmNvZGluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2RlcGFnZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcoY29kZXBhZ2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZXBhZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nKGNvZGVwYWdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb0lBTkFDaGFyU2V0TmFtZShlbmNvZGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TW9zdENvbXBhdGlibGVNYWNTdHJpbmdFbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nKGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9fX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JY2hhciogY1N0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIGNoYXIqIGNTdHI7CiAjaWZuZGVmIF9fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhfX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhfX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY1N0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IF9fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcoY1N0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjU3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZyhjU3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlVSTEdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGVVJMR2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRUeXBlSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTEdldFR5cGVJRCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTEdldFR5cGVJRCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7Ci0JdW5zaWduZWQgY2hhciAqVVJMQnl0ZXNfX2luX187Ci0JbG9uZyBVUkxCeXRlc19fbGVuX187Ci0JaW50IFVSTEJ5dGVzX19pbl9sZW5fXzsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwotCUNGVVJMUmVmIGJhc2VVUkw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpVUkxCeXRlc19faW5fXzsKKyAgICBsb25nIFVSTEJ5dGVzX19sZW5fXzsKKyAgICBpbnQgVVJMQnl0ZXNfX2luX2xlbl9fOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgQ0ZVUkxSZWYgYmFzZVVSTDsKICNpZm5kZWYgQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENyZWF0ZVdpdGhCeXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmVVJMQnl0ZXNfX2luX18sICZVUkxCeXRlc19faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCi0JCXJldHVybiBOVUxMOwotCVVSTEJ5dGVzX19sZW5fXyA9IFVSTEJ5dGVzX19pbl9sZW5fXzsKLQlfcnYgPSBDRlVSTENyZWF0ZVdpdGhCeXRlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxCeXRlc19faW5fXywgVVJMQnl0ZXNfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlVSTEJ5dGVzX19pbl9fLCAmVVJMQnl0ZXNfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmJhc2VVUkwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVUkxCeXRlc19fbGVuX18gPSBVUkxCeXRlc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMQnl0ZXNfX2luX18sIFVSTEJ5dGVzX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVVJMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQl1bnNpZ25lZCBjaGFyICpidWZmZXJfX2luX187Ci0JbG9uZyBidWZmZXJfX2xlbl9fOwotCWludCBidWZmZXJfX2luX2xlbl9fOwotCUJvb2xlYW4gaXNEaXJlY3Rvcnk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmZXJfX2luX187CisgICAgbG9uZyBidWZmZXJfX2xlbl9fOworICAgIGludCBidWZmZXJfX2luX2xlbl9fOworICAgIEJvb2xlYW4gaXNEaXJlY3Rvcnk7CiAjaWZuZGVmIENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbgotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJfX2luX18sICZidWZmZXJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpKQotCQlyZXR1cm4gTlVMTDsKLQlidWZmZXJfX2xlbl9fID0gYnVmZmVyX19pbl9sZW5fXzsKLQlfcnYgPSBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9faW5fXywgYnVmZmVyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJfX2luX18sICZidWZmZXJfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBidWZmZXJfX2xlbl9fID0gYnVmZmVyX19pbl9sZW5fXzsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9faW5fXywgYnVmZmVyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyX19pbl9fOwotCWxvbmcgYnVmZmVyX19sZW5fXzsKLQlpbnQgYnVmZmVyX19pbl9sZW5fXzsKLQlCb29sZWFuIGlzRGlyZWN0b3J5OwotCUNGVVJMUmVmIGJhc2VVUkw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmZXJfX2luX187CisgICAgbG9uZyBidWZmZXJfX2xlbl9fOworICAgIGludCBidWZmZXJfX2luX2xlbl9fOworICAgIEJvb2xlYW4gaXNEaXJlY3Rvcnk7CisgICAgQ0ZVUkxSZWYgYmFzZVVSTDsKICNpZm5kZWYgQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyX19pbl9fLCAmYnVmZmVyX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbENGVVJMUmVmT2JqX0NvbnZlcnQsICZiYXNlVVJMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVmZmVyX19sZW5fXyA9IGJ1ZmZlcl9faW5fbGVuX187Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX19pbl9fLCBidWZmZXJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcl9faW5fXywgJmJ1ZmZlcl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJ1ZmZlcl9fbGVuX18gPSBidWZmZXJfX2luX2xlbl9fOworICAgIF9ydiA9IENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9faW5fXywgYnVmZmVyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVVJMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlVSTENyZWF0ZUZyb21GU1JlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCUZTUmVmIGZzUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlVSTFJlZiBfcnY7CisgICAgRlNSZWYgZnNSZWY7CiAjaWZuZGVmIENGVVJMQ3JlYXRlRnJvbUZTUmVmCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVGcm9tRlNSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ3JlYXRlRnJvbUZTUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZmc1JlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlRnJvbUZTUmVmKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc1JlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmZzUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVGcm9tRlNSZWYoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl90b0NGKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlDRlR5cGVSZWYgcnY7Ci0JQ0ZUeXBlSUQgdHlwZWlkOworICAgIENGVHlwZVJlZiBydjsKKyAgICBDRlR5cGVJRCB0eXBlaWQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsIFB5Q0ZfUHl0aG9uMkNGLCAmcnYpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JdHlwZWlkID0gQ0ZHZXRUeXBlSUQocnYpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgUHlDRl9QeXRob24yQ0YsICZydikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHR5cGVpZCA9IENGR2V0VHlwZUlEKHJ2KTsKIAotCWlmICh0eXBlaWQgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkKLQkgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGU3RyaW5nUmVmT2JqX05ldywgcnYpOwotCWlmICh0eXBlaWQgPT0gQ0ZBcnJheUdldFR5cGVJRCgpKQotCSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZBcnJheVJlZk9ial9OZXcsIHJ2KTsKLQlpZiAodHlwZWlkID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKQotCSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldywgcnYpOwotCWlmICh0eXBlaWQgPT0gQ0ZVUkxHZXRUeXBlSUQoKSkKLQkgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGVVJMUmVmT2JqX05ldywgcnYpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBydik7CisgICAgaWYgKHR5cGVpZCA9PSBDRkFycmF5R2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGQXJyYXlSZWZPYmpfTmV3LCBydik7CisgICAgaWYgKHR5cGVpZCA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldywgcnYpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZVUkxHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZVUkxSZWZPYmpfTmV3LCBydik7CiAKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlR5cGVSZWZPYmpfTmV3LCBydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZUeXBlUmVmT2JqX05ldywgcnYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRl9tZXRob2RzW10gPSB7Ci0JeyJfX0NGUmFuZ2VNYWtlIiwgKFB5Q0Z1bmN0aW9uKUNGX19fQ0ZSYW5nZU1ha2UsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggbG9jLCBDRkluZGV4IGxlbikgLT4gKENGUmFuZ2UgX3J2KSIpfSwKLQl7IkNGQWxsb2NhdG9yR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQWxsb2NhdG9yR2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZBbGxvY2F0b3JHZXRQcmVmZXJyZWRTaXplRm9yU2l6ZSIsIChQeUNGdW5jdGlvbilDRl9DRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IHNpemUsIENGT3B0aW9uRmxhZ3MgaGludCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGQ29weVR5cGVJRERlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQ29weVR5cGVJRERlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihDRlR5cGVJRCB0eXBlX2lkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGQXJyYXlHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBcnJheUdldFR5cGVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKLQl7IkNGQXJyYXlDcmVhdGVNdXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQXJyYXlDcmVhdGVNdXRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5KSAtPiAoQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2KSIpfSwKLQl7IkNGQXJyYXlDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHksIENGQXJyYXlSZWYgdGhlQXJyYXkpIC0+IChDRk11dGFibGVBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZEYXRhR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUdldFR5cGVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKLQl7IkNGRGF0YUNyZWF0ZSIsIChQeUNGdW5jdGlvbilDRl9DRkRhdGFDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBieXRlcykgLT4gKENGRGF0YVJlZiBfcnYpIil9LAotCXsiQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZVdpdGhCeXRlc05vQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCi0JeyJDRkRhdGFDcmVhdGVNdXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZU11dGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHkpIC0+IChDRk11dGFibGVEYXRhUmVmIF9ydikiKX0sCi0JeyJDRkRhdGFDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRkRhdGFDcmVhdGVNdXRhYmxlQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSwgQ0ZEYXRhUmVmIHRoZURhdGEpIC0+IChDRk11dGFibGVEYXRhUmVmIF9ydikiKX0sCi0JeyJDRkRpY3Rpb25hcnlHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSIsIChQeUNGdW5jdGlvbilDRl9DRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5KSAtPiAoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBfcnYpIil9LAotCXsiQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHksIENGRGljdGlvbmFyeVJlZiB0aGVEaWN0KSAtPiAoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChDRlR5cGVSZWYgX3J2KSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0dldEFwcEJvb2xlYW5WYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYga2V5LCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiAoQm9vbGVhbiBfcnYsIEJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0dldEFwcEludGVnZXJWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChDRkluZGV4IF9ydiwgQm9vbGVhbiBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCkiKX0sCi0JeyJDRlByZWZlcmVuY2VzU2V0QXBwVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGVHlwZVJlZiB2YWx1ZSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gTm9uZSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHAiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgc3VpdGVJRCkgLT4gTm9uZSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHN1aXRlSUQpIC0+IE5vbmUiKX0sCi0JeyJDRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0FwcFN5bmNocm9uaXplLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weVZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGVHlwZVJlZiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlNdWx0aXBsZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weU11bHRpcGxlLCAxLAotCSBQeURvY19TVFIoIihDRkFycmF5UmVmIGtleXNUb0ZldGNoLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IChDRkRpY3Rpb25hcnlSZWYgX3J2KSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNTZXRWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU2V0VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZUeXBlUmVmIHZhbHVlLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IE5vbmUiKX0sCi0JeyJDRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1NldE11bHRpcGxlLCAxLAotCSBQeURvY19TVFIoIihDRkRpY3Rpb25hcnlSZWYga2V5c1RvU2V0LCBDRkFycmF5UmVmIGtleXNUb1JlbW92ZSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiBOb25lIil9LAotCXsiQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weUtleUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHBTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihjaGFyKiBjU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGNoYXJzKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmdOb0NvcHksIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBwU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoY2hhciogY1N0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzTm9Db3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHksIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBjaGFycykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IG1heExlbmd0aCkgLT4gKENGTXV0YWJsZVN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZU11dGFibGVDb3B5LCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IG1heExlbmd0aCwgQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nKSAtPiAoQ0ZNdXRhYmxlU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBCb29sZWFuIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbikgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggbGVuZ3RoLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZJbmRleCBfcnYpIil9LAotCXsiQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBlbmNvZGluZykgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDb252ZXJ0V2luZG93c0NvZGVwYWdlVG9FbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29kZXBhZ2UpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0TW9zdENvbXBhdGlibGVNYWNTdHJpbmdFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7Il9fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoY2hhciogY1N0cikgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTEdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRlVSTEdldFR5cGVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlV2l0aEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgVVJMQnl0ZXMsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIENGVVJMUmVmIGJhc2VVUkwpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ1ZmZlciwgQm9vbGVhbiBpc0RpcmVjdG9yeSkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZSIsIChQeUNGdW5jdGlvbilDRl9DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ1ZmZlciwgQm9vbGVhbiBpc0RpcmVjdG9yeSwgQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUZyb21GU1JlZiIsIChQeUNGdW5jdGlvbilDRl9DRlVSTENyZWF0ZUZyb21GU1JlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgZnNSZWYpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsidG9DRiIsIChQeUNGdW5jdGlvbilDRl90b0NGLCAxLAotCSBQeURvY19TVFIoIihweXRob25fb2JqZWN0KSAtPiAoQ0Zfb2JqZWN0KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Il9fQ0ZSYW5nZU1ha2UiLCAoUHlDRnVuY3Rpb24pQ0ZfX19DRlJhbmdlTWFrZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBsb2MsIENGSW5kZXggbGVuKSAtPiAoQ0ZSYW5nZSBfcnYpIil9LAorICAgIHsiQ0ZBbGxvY2F0b3JHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBbGxvY2F0b3JHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggc2l6ZSwgQ0ZPcHRpb25GbGFncyBoaW50KSAtPiAoQ0ZJbmRleCBfcnYpIil9LAorICAgIHsiQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKENGVHlwZUlEIHR5cGVfaWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZBcnJheUdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRkFycmF5R2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZBcnJheUNyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBcnJheUNyZWF0ZU11dGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHkpIC0+IChDRk11dGFibGVBcnJheVJlZiBfcnYpIil9LAorICAgIHsiQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQXJyYXlDcmVhdGVNdXRhYmxlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSwgQ0ZBcnJheVJlZiB0aGVBcnJheSkgLT4gKENGTXV0YWJsZUFycmF5UmVmIF9ydikiKX0sCisgICAgeyJDRkRhdGFHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhR2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZEYXRhQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCisgICAgeyJDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5LCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUNyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhQ3JlYXRlTXV0YWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSkgLT4gKENGTXV0YWJsZURhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUNyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZU11dGFibGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5LCBDRkRhdGFSZWYgdGhlRGF0YSkgLT4gKENGTXV0YWJsZURhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGljdGlvbmFyeUdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRkRpY3Rpb25hcnlHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHkpIC0+IChDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCisgICAgeyJDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSwgQ0ZEaWN0aW9uYXJ5UmVmIHRoZURpY3QpIC0+IChDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gKENGVHlwZVJlZiBfcnYpIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc0dldEFwcEJvb2xlYW5WYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChCb29sZWFuIF9ydiwgQm9vbGVhbiBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCkiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gKENGSW5kZXggX3J2LCBCb29sZWFuIGtleUV4aXN0c0FuZEhhc1ZhbGlkRm9ybWF0KSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU2V0QXBwVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZUeXBlUmVmIHZhbHVlLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiBOb25lIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiBzdWl0ZUlEKSAtPiBOb25lIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgc3VpdGVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5VmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZUeXBlUmVmIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weU11bHRpcGxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGQXJyYXlSZWYga2V5c1RvRmV0Y2gsIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGRGljdGlvbmFyeVJlZiBfcnYpIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc1NldFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNTZXRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYga2V5LCBDRlR5cGVSZWYgdmFsdWUsIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNTZXRNdWx0aXBsZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGRGljdGlvbmFyeVJlZiBrZXlzVG9TZXQsIENGQXJyYXlSZWYga2V5c1RvUmVtb3ZlLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzU3luY2hyb25pemUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weUFwcGxpY2F0aW9uTGlzdCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weUFwcGxpY2F0aW9uTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgcFN0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGNoYXIqIGNTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgY2hhcnMpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nTm9Db3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHBTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5LCAxLAorICAgICBQeURvY19TVFIoIihjaGFyKiBjU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGNoYXJzKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlTXV0YWJsZSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZU11dGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggbWF4TGVuZ3RoKSAtPiAoQ0ZNdXRhYmxlU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggbWF4TGVuZ3RoLCBDRlN0cmluZ1JlZiB0aGVTdHJpbmcpIC0+IChDRk11dGFibGVTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRNYXhpbXVtU2l6ZUZvckVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBsZW5ndGgsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0dldE5hbWVPZkVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2RlcGFnZSkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb0lBTkFDaGFyU2V0TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAorICAgIHsiX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZyIsIChQeUNGdW5jdGlvbilDRl9fX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihjaGFyKiBjU3RyKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMR2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBVUkxCeXRlcywgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnVmZmVyLCBCb29sZWFuIGlzRGlyZWN0b3J5KSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnVmZmVyLCBCb29sZWFuIGlzRGlyZWN0b3J5LCBDRlVSTFJlZiBiYXNlVVJMKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlRnJvbUZTUmVmLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBmc1JlZikgLT4gKENGVVJMUmVmIF9ydikiKX0sCisgICAgeyJ0b0NGIiwgKFB5Q0Z1bmN0aW9uKUNGX3RvQ0YsIDEsCisgICAgIFB5RG9jX1NUUigiKHB5dGhvbl9vYmplY3QpIC0+IChDRl9vYmplY3QpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC00ODI4LDE2NSArNDgyOCwxNjUgQEAKIC8qIFJvdXRpbmVzIHRvIGNvbnZlcnQgYW55IENGIHR5cGUgdG8vZnJvbSB0aGUgY29ycmVzcG9uZGluZyBDRnh4eE9iaiAqLwogUHlPYmplY3QgKkNGT2JqX05ldyhDRlR5cGVSZWYgaXRzZWxmKQogewotICAgICAgICBpZiAoaXRzZWxmID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGQXJyYXlHZXRUeXBlSUQoKSkgcmV0dXJuIENGQXJyYXlSZWZPYmpfTmV3KChDRkFycmF5UmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldygoQ0ZEaWN0aW9uYXJ5UmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGF0YUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEYXRhUmVmT2JqX05ldygoQ0ZEYXRhUmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGU3RyaW5nR2V0VHlwZUlEKCkpIHJldHVybiBDRlN0cmluZ1JlZk9ial9OZXcoKENGU3RyaW5nUmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGVVJMR2V0VHlwZUlEKCkpIHJldHVybiBDRlVSTFJlZk9ial9OZXcoKENGVVJMUmVmKWl0c2VsZik7Ci0gICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBQeUNGX0NGMlB5dGhvbiBoZXJlPz8gKi8KLSAgICAgICAgcmV0dXJuIENGVHlwZVJlZk9ial9OZXcoaXRzZWxmKTsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZBcnJheUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZBcnJheVJlZk9ial9OZXcoKENGQXJyYXlSZWYpaXRzZWxmKTsKKyAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkgcmV0dXJuIENGRGljdGlvbmFyeVJlZk9ial9OZXcoKENGRGljdGlvbmFyeVJlZilpdHNlbGYpOworICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGF0YUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEYXRhUmVmT2JqX05ldygoQ0ZEYXRhUmVmKWl0c2VsZik7CisgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldygoQ0ZTdHJpbmdSZWYpaXRzZWxmKTsKKyAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRlVSTEdldFR5cGVJRCgpKSByZXR1cm4gQ0ZVUkxSZWZPYmpfTmV3KChDRlVSTFJlZilpdHNlbGYpOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBQeUNGX0NGMlB5dGhvbiBoZXJlPz8gKi8KKyAgICByZXR1cm4gQ0ZUeXBlUmVmT2JqX05ldyhpdHNlbGYpOwogfQogaW50IENGT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGVHlwZVJlZiAqcF9pdHNlbGYpCiB7CiAKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotICAgICAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotICAgICAgICBpZiAoIUNGVHlwZVJlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRkFycmF5UmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGTXV0YWJsZUFycmF5UmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGRGF0YVJlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRk11dGFibGVEYXRhUmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGU3RyaW5nUmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRlVSTFJlZk9ial9DaGVjayh2KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgUHlDRl9QeXRob24yQ0YgaGVyZT8/ICovCi0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGIG9iamVjdCByZXF1aXJlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgICpwX2l0c2VsZiA9ICgoQ0ZUeXBlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKCFDRlR5cGVSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGQXJyYXlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGTXV0YWJsZUFycmF5UmVmT2JqX0NoZWNrKHYpICYmCisgICAgICAgICFDRkRpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGRGF0YVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZTdHJpbmdSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZVUkxSZWZPYmpfQ2hlY2sodikgKQorICAgIHsKKyAgICAgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIFB5Q0ZfUHl0aG9uMkNGIGhlcmU/PyAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0Ygb2JqZWN0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGVHlwZVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIAogdm9pZCBpbml0X0NGKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZUeXBlUmVmLCBDRk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlR5cGVSZWYsIENGT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGU3RyaW5nUmVmLCBDRlN0cmluZ1JlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlN0cmluZ1JlZiwgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZBcnJheVJlZiwgQ0ZBcnJheVJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRkFycmF5UmVmLCBDRkFycmF5UmVmT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGTXV0YWJsZUFycmF5UmVmLCBDRk11dGFibGVBcnJheVJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVBcnJheVJlZiwgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiwgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVEaWN0aW9uYXJ5UmVmLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVVJMUmVmLCBDRlVSTFJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlVSTFJlZiwgQ0ZVUkxSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZUeXBlUmVmLCBDRk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlR5cGVSZWYsIENGT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGU3RyaW5nUmVmLCBDRlN0cmluZ1JlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlN0cmluZ1JlZiwgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZBcnJheVJlZiwgQ0ZBcnJheVJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRkFycmF5UmVmLCBDRkFycmF5UmVmT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGTXV0YWJsZUFycmF5UmVmLCBDRk11dGFibGVBcnJheVJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVBcnJheVJlZiwgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiwgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVEaWN0aW9uYXJ5UmVmLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVVJMUmVmLCBDRlVSTFJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlVSTFJlZiwgQ0ZVUkxSZWZPYmpfQ29udmVydCk7CiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQ0YiLCBDRl9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDRl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKENGX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ0ZfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlDRlR5cGVSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGVHlwZVJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGVHlwZVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVHlwZVJlZiIsIChQeU9iamVjdCAqKSZDRlR5cGVSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRlR5cGVSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlR5cGVSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGVHlwZVJlZl9UeXBlKTsKLQlDRkFycmF5UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlDRkFycmF5UmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRkFycmF5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZBcnJheVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGQXJyYXlSZWYiLCAoUHlPYmplY3QgKikmQ0ZBcnJheVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGQXJyYXlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkFycmF5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRkFycmF5UmVmX1R5cGUpOwotCUNGTXV0YWJsZUFycmF5UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlDRk11dGFibGVBcnJheVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZBcnJheVJlZl9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVBcnJheVJlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlQXJyYXlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOwotCUNGRGljdGlvbmFyeVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRkRpY3Rpb25hcnlSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkRpY3Rpb25hcnlSZWYiLCAoUHlPYmplY3QgKikmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEaWN0aW9uYXJ5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVEaWN0aW9uYXJ5UmVmIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKLQlDRkRhdGFSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGRGF0YVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ0ZEYXRhUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZEYXRhUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEYXRhUmVmIiwgKFB5T2JqZWN0ICopJkNGRGF0YVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGRGF0YVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGRGF0YVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZEYXRhUmVmX1R5cGUpOwotCUNGTXV0YWJsZURhdGFSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGTXV0YWJsZURhdGFSZWZfVHlwZS50cF9iYXNlID0gJkNGRGF0YVJlZl9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZURhdGFSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRk11dGFibGVEYXRhUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGF0YVJlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVEYXRhUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZURhdGFSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7Ci0JQ0ZTdHJpbmdSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGU3RyaW5nUmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRlN0cmluZ1JlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGU3RyaW5nUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZTdHJpbmdSZWYiLCAoUHlPYmplY3QgKikmQ0ZTdHJpbmdSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRlN0cmluZ1JlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGU3RyaW5nUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRlN0cmluZ1JlZl9UeXBlKTsKLQlDRk11dGFibGVTdHJpbmdSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZTdHJpbmdSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVTdHJpbmdSZWYiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlU3RyaW5nUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7Ci0JQ0ZVUkxSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGVVJMUmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRlVSTFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGVVJMUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZVUkxSZWYiLCAoUHlPYmplY3QgKikmQ0ZVUkxSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRlVSTFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVVJMUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRlVSTFJlZl9UeXBlKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0NGIiwgQ0ZfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQ0ZfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChDRl9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIENGX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgQ0ZUeXBlUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRlR5cGVSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRlR5cGVSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlR5cGVSZWYiLCAoUHlPYmplY3QgKikmQ0ZUeXBlUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZUeXBlUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZUeXBlUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRlR5cGVSZWZfVHlwZSk7CisgICAgQ0ZBcnJheVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgQ0ZBcnJheVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZBcnJheVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGQXJyYXlSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkFycmF5UmVmIiwgKFB5T2JqZWN0ICopJkNGQXJyYXlSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRkFycmF5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZBcnJheVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZBcnJheVJlZl9UeXBlKTsKKyAgICBDRk11dGFibGVBcnJheVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZS50cF9iYXNlID0gJkNGQXJyYXlSZWZfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRk11dGFibGVBcnJheVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlQXJyYXlSZWYiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZUFycmF5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKKyAgICBDRkRpY3Rpb25hcnlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIENGRGljdGlvbmFyeVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEaWN0aW9uYXJ5UmVmIiwgKFB5T2JqZWN0ICopJkNGRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGRGljdGlvbmFyeVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZS50cF9iYXNlID0gJkNGRGljdGlvbmFyeVJlZl9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZURpY3Rpb25hcnlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7CisgICAgQ0ZEYXRhUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRkRhdGFSZWZfVHlwZS50cF9iYXNlID0gJkNGVHlwZVJlZl9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNGRGF0YVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGRGF0YVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGRGF0YVJlZiIsIChQeU9iamVjdCAqKSZDRkRhdGFSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRkRhdGFSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkRhdGFSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGRGF0YVJlZl9UeXBlKTsKKyAgICBDRk11dGFibGVEYXRhUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRk11dGFibGVEYXRhUmVmX1R5cGUudHBfYmFzZSA9ICZDRkRhdGFSZWZfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRk11dGFibGVEYXRhUmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZURhdGFSZWYiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVEYXRhUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRk11dGFibGVEYXRhUmVmX1R5cGUpOworICAgIENGU3RyaW5nUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRlN0cmluZ1JlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZTdHJpbmdSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRlN0cmluZ1JlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGU3RyaW5nUmVmIiwgKFB5T2JqZWN0ICopJkNGU3RyaW5nUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZTdHJpbmdSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlN0cmluZ1JlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZTdHJpbmdSZWZfVHlwZSk7CisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRk11dGFibGVTdHJpbmdSZWZfVHlwZS50cF9iYXNlID0gJkNGU3RyaW5nUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlU3RyaW5nUmVmIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZVN0cmluZ1JlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOworICAgIENGVVJMUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRlVSTFJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZVUkxSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRlVSTFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVVJMUmVmIiwgKFB5T2JqZWN0ICopJkNGVVJMUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZVUkxSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlVSTFJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZVUkxSZWZfVHlwZSk7CiAKICNkZWZpbmUgX1NUUklOR0NPTlNUKG5hbWUpIFB5TW9kdWxlX0FkZE9iamVjdChtLCAjbmFtZSwgQ0ZTdHJpbmdSZWZPYmpfTmV3KG5hbWUpKQotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0FueUFwcGxpY2F0aW9uKTsKLQlfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNDdXJyZW50QXBwbGljYXRpb24pOwotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0FueUhvc3QpOwotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRIb3N0KTsKLQlfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNBbnlVc2VyKTsKLQlfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNDdXJyZW50VXNlcik7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQW55QXBwbGljYXRpb24pOworICAgIF9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRBcHBsaWNhdGlvbik7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQW55SG9zdCk7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQ3VycmVudEhvc3QpOworICAgIF9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0FueVVzZXIpOworICAgIF9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRVc2VyKTsKIAogCiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NmL3B5Y2ZicmlkZ2UuYyBiL01hYy9Nb2R1bGVzL2NmL3B5Y2ZicmlkZ2UuYwppbmRleCAwNjcwMGIzLi43MDhjMWU2IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jZi9weWNmYnJpZGdlLmMKKysrIGIvTWFjL01vZHVsZXMvY2YvcHljZmJyaWRnZS5jCkBAIC0xNSwxMjggKzE1LDEyOCBAQAogCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbihDRlR5cGVSZWYgc3JjKSB7Ci0JQ0ZUeXBlSUQgdHlwZWlkOwotCQotCWlmKCBzcmMgPT0gTlVMTCApIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JdHlwZWlkID0gQ0ZHZXRUeXBlSUQoc3JjKTsKLQlpZiAodHlwZWlkID09IENGQXJyYXlHZXRUeXBlSUQoKSkKLQkJcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX3NlcXVlbmNlKChDRkFycmF5UmVmKXNyYyk7Ci0JaWYgKHR5cGVpZCA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkKLQkJcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX21hcHBpbmcoKENGRGljdGlvbmFyeVJlZilzcmMpOwotCXJldHVybiBQeUNGX0NGMlB5dGhvbl9zaW1wbGUoc3JjKTsKKyAgICBDRlR5cGVJRCB0eXBlaWQ7CisKKyAgICBpZiggc3JjID09IE5VTEwgKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHR5cGVpZCA9IENGR2V0VHlwZUlEKHNyYyk7CisgICAgaWYgKHR5cGVpZCA9PSBDRkFycmF5R2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeUNGX0NGMlB5dGhvbl9zZXF1ZW5jZSgoQ0ZBcnJheVJlZilzcmMpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeUNGX0NGMlB5dGhvbl9tYXBwaW5nKChDRkRpY3Rpb25hcnlSZWYpc3JjKTsKKyAgICByZXR1cm4gUHlDRl9DRjJQeXRob25fc2ltcGxlKHNyYyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5Q0ZfQ0YyUHl0aG9uX3NlcXVlbmNlKENGQXJyYXlSZWYgc3JjKSB7Ci0JaW50IHNpemUgPSBDRkFycmF5R2V0Q291bnQoc3JjKTsKLQlQeU9iamVjdCAqcnY7Ci0JQ0ZUeXBlUmVmIGl0ZW1fY2Y7Ci0JUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMOwotCWludCBpOwotCQotCWlmICggKHJ2PVB5TGlzdF9OZXcoc2l6ZSkpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IoaT0wOyBpPHNpemU7IGkrKykgewotCQlpdGVtX2NmID0gQ0ZBcnJheUdldFZhbHVlQXRJbmRleChzcmMsIGkpOwotCQlpZiAoaXRlbV9jZiA9PSBOVUxMICkgZ290byBlcnI7Ci0JCWl0ZW1fcHkgPSBQeUNGX0NGMlB5dGhvbihpdGVtX2NmKTsKLQkJaWYgKGl0ZW1fcHkgPT0gTlVMTCApIGdvdG8gZXJyOwotCQlpZiAoUHlMaXN0X1NldEl0ZW0ocnYsIGksIGl0ZW1fcHkpIDwgMCkgZ290byBlcnI7Ci0JCWl0ZW1fcHkgPSBOVUxMOwotCX0KLQlyZXR1cm4gcnY7CisgICAgaW50IHNpemUgPSBDRkFycmF5R2V0Q291bnQoc3JjKTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgQ0ZUeXBlUmVmIGl0ZW1fY2Y7CisgICAgUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMOworICAgIGludCBpOworCisgICAgaWYgKCAocnY9UHlMaXN0X05ldyhzaXplKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvcihpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgIGl0ZW1fY2YgPSBDRkFycmF5R2V0VmFsdWVBdEluZGV4KHNyYywgaSk7CisgICAgICAgIGlmIChpdGVtX2NmID09IE5VTEwgKSBnb3RvIGVycjsKKyAgICAgICAgaXRlbV9weSA9IFB5Q0ZfQ0YyUHl0aG9uKGl0ZW1fY2YpOworICAgICAgICBpZiAoaXRlbV9weSA9PSBOVUxMICkgZ290byBlcnI7CisgICAgICAgIGlmIChQeUxpc3RfU2V0SXRlbShydiwgaSwgaXRlbV9weSkgPCAwKSBnb3RvIGVycjsKKyAgICAgICAgaXRlbV9weSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBydjsKIGVycjoKLQlQeV9YREVDUkVGKGl0ZW1fcHkpOwotCVB5X0RFQ1JFRihydik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihpdGVtX3B5KTsKKyAgICBQeV9ERUNSRUYocnYpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbl9tYXBwaW5nKENGVHlwZVJlZiBzcmMpIHsKLQlpbnQgc2l6ZSA9IENGRGljdGlvbmFyeUdldENvdW50KHNyYyk7Ci0JUHlPYmplY3QgKnJ2ID0gTlVMTDsKLQlDRlR5cGVSZWYgKmFsbGtleXMgPSBOVUxMLCAqYWxsdmFsdWVzID0gTlVMTDsKLQlDRlR5cGVSZWYga2V5X2NmLCB2YWx1ZV9jZjsKLQlQeU9iamVjdCAqa2V5X3B5ID0gTlVMTCwgKnZhbHVlX3B5ID0gTlVMTDsKLQlpbnQgaTsKLQkKLQlhbGxrZXlzID0gbWFsbG9jKHNpemUqc2l6ZW9mKENGVHlwZVJlZiAqKSk7Ci0JaWYgKGFsbGtleXMgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGVycjsKLQl9Ci0JYWxsdmFsdWVzID0gbWFsbG9jKHNpemUqc2l6ZW9mKENGVHlwZVJlZiAqKSk7Ci0JaWYgKGFsbHZhbHVlcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAoIChydj1QeURpY3RfTmV3KCkpID09IE5VTEwgKSBnb3RvIGVycjsKLQlDRkRpY3Rpb25hcnlHZXRLZXlzQW5kVmFsdWVzKHNyYywgYWxsa2V5cywgYWxsdmFsdWVzKTsKLQlmb3IoaT0wOyBpPHNpemU7IGkrKykgewotCQlrZXlfY2YgPSBhbGxrZXlzW2ldOwotCQl2YWx1ZV9jZiA9IGFsbHZhbHVlc1tpXTsKLQkJa2V5X3B5ID0gUHlDRl9DRjJQeXRob24oa2V5X2NmKTsKLQkJaWYgKGtleV9weSA9PSBOVUxMICkgZ290byBlcnI7Ci0JCXZhbHVlX3B5ID0gUHlDRl9DRjJQeXRob24odmFsdWVfY2YpOwotCQlpZiAodmFsdWVfcHkgPT0gTlVMTCApIGdvdG8gZXJyOwotCQlpZiAoUHlEaWN0X1NldEl0ZW0ocnYsIGtleV9weSwgdmFsdWVfcHkpIDwgMCkgZ290byBlcnI7Ci0JCWtleV9weSA9IE5VTEw7Ci0JCXZhbHVlX3B5ID0gTlVMTDsKLQl9Ci0JcmV0dXJuIHJ2OworICAgIGludCBzaXplID0gQ0ZEaWN0aW9uYXJ5R2V0Q291bnQoc3JjKTsKKyAgICBQeU9iamVjdCAqcnYgPSBOVUxMOworICAgIENGVHlwZVJlZiAqYWxsa2V5cyA9IE5VTEwsICphbGx2YWx1ZXMgPSBOVUxMOworICAgIENGVHlwZVJlZiBrZXlfY2YsIHZhbHVlX2NmOworICAgIFB5T2JqZWN0ICprZXlfcHkgPSBOVUxMLCAqdmFsdWVfcHkgPSBOVUxMOworICAgIGludCBpOworCisgICAgYWxsa2V5cyA9IG1hbGxvYyhzaXplKnNpemVvZihDRlR5cGVSZWYgKikpOworICAgIGlmIChhbGxrZXlzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGFsbHZhbHVlcyA9IG1hbGxvYyhzaXplKnNpemVvZihDRlR5cGVSZWYgKikpOworICAgIGlmIChhbGx2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCAocnY9UHlEaWN0X05ldygpKSA9PSBOVUxMICkgZ290byBlcnI7CisgICAgQ0ZEaWN0aW9uYXJ5R2V0S2V5c0FuZFZhbHVlcyhzcmMsIGFsbGtleXMsIGFsbHZhbHVlcyk7CisgICAgZm9yKGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICAgICAga2V5X2NmID0gYWxsa2V5c1tpXTsKKyAgICAgICAgdmFsdWVfY2YgPSBhbGx2YWx1ZXNbaV07CisgICAgICAgIGtleV9weSA9IFB5Q0ZfQ0YyUHl0aG9uKGtleV9jZik7CisgICAgICAgIGlmIChrZXlfcHkgPT0gTlVMTCApIGdvdG8gZXJyOworICAgICAgICB2YWx1ZV9weSA9IFB5Q0ZfQ0YyUHl0aG9uKHZhbHVlX2NmKTsKKyAgICAgICAgaWYgKHZhbHVlX3B5ID09IE5VTEwgKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHJ2LCBrZXlfcHksIHZhbHVlX3B5KSA8IDApIGdvdG8gZXJyOworICAgICAgICBrZXlfcHkgPSBOVUxMOworICAgICAgICB2YWx1ZV9weSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBydjsKIGVycjoKLQlQeV9YREVDUkVGKGtleV9weSk7Ci0JUHlfWERFQ1JFRih2YWx1ZV9weSk7Ci0JUHlfWERFQ1JFRihydik7Ci0JZnJlZShhbGxrZXlzKTsKLQlmcmVlKGFsbHZhbHVlcyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihrZXlfcHkpOworICAgIFB5X1hERUNSRUYodmFsdWVfcHkpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIGZyZWUoYWxsa2V5cyk7CisgICAgZnJlZShhbGx2YWx1ZXMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbl9zaW1wbGUoQ0ZUeXBlUmVmIHNyYykgewotCUNGVHlwZUlEIHR5cGVpZDsKLQkKLQl0eXBlaWQgPSBDRkdldFR5cGVJRChzcmMpOwotCWlmICh0eXBlaWQgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkKLQkJcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX3N0cmluZygoQ0ZTdHJpbmdSZWYpc3JjKTsKLQlpZiAodHlwZWlkID09IENGQm9vbGVhbkdldFR5cGVJRCgpKQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKUNGQm9vbGVhbkdldFZhbHVlKHNyYykpOwotCWlmICh0eXBlaWQgPT0gQ0ZOdW1iZXJHZXRUeXBlSUQoKSkgewotCQlpZiAoQ0ZOdW1iZXJJc0Zsb2F0VHlwZShzcmMpKSB7Ci0JCQlkb3VibGUgZDsKLQkJCUNGTnVtYmVyR2V0VmFsdWUoc3JjLCBrQ0ZOdW1iZXJEb3VibGVUeXBlLCAmZCk7Ci0JCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGQpOwotCQl9IGVsc2UgewotCQkJbG9uZyBsOwotCQkJaWYgKCFDRk51bWJlckdldFZhbHVlKHNyYywga0NGTnVtYmVyTG9uZ1R5cGUsICZsKSkKLQkJCQkvKiBYWFhYIE91dCBvZiByYW5nZSEgKi87Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobCk7Ci0JCX0KLQl9Ci0JLyogWFhYWCBTaG91bGQgcmV0dXJuIGFzIENGVHlwZVJlZiwgcmVhbGx5Li4uICovCi0JUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCXJldHVybiBOVUxMOworICAgIENGVHlwZUlEIHR5cGVpZDsKKworICAgIHR5cGVpZCA9IENGR2V0VHlwZUlEKHNyYyk7CisgICAgaWYgKHR5cGVpZCA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKQorICAgICAgICByZXR1cm4gUHlDRl9DRjJQeXRob25fc3RyaW5nKChDRlN0cmluZ1JlZilzcmMpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZCb29sZWFuR2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpQ0ZCb29sZWFuR2V0VmFsdWUoc3JjKSk7CisgICAgaWYgKHR5cGVpZCA9PSBDRk51bWJlckdldFR5cGVJRCgpKSB7CisgICAgICAgIGlmIChDRk51bWJlcklzRmxvYXRUeXBlKHNyYykpIHsKKyAgICAgICAgICAgIGRvdWJsZSBkOworICAgICAgICAgICAgQ0ZOdW1iZXJHZXRWYWx1ZShzcmMsIGtDRk51bWJlckRvdWJsZVR5cGUsICZkKTsKKyAgICAgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb25nIGw7CisgICAgICAgICAgICBpZiAoIUNGTnVtYmVyR2V0VmFsdWUoc3JjLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJmwpKQorICAgICAgICAgICAgICAgIC8qIFhYWFggT3V0IG9mIHJhbmdlISAqLzsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBYWFhYIFNob3VsZCByZXR1cm4gYXMgQ0ZUeXBlUmVmLCByZWFsbHkuLi4gKi8KKyAgICBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFVuc3VyZSAtIFJldHVybiB1bmljb2RlIG9yIDggYml0IHN0cmluZ3M/ICovCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbl9zdHJpbmcoQ0ZTdHJpbmdSZWYgc3JjKSB7Ci0JaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChzcmMpKzE7Ci0JUHlfVU5JQ09ERSAqZGF0YSA9IG1hbGxvYyhzaXplKnNpemVvZihQeV9VTklDT0RFKSk7Ci0JQ0ZSYW5nZSByYW5nZTsKLQlQeU9iamVjdCAqcnY7CisgICAgaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChzcmMpKzE7CisgICAgUHlfVU5JQ09ERSAqZGF0YSA9IG1hbGxvYyhzaXplKnNpemVvZihQeV9VTklDT0RFKSk7CisgICAgQ0ZSYW5nZSByYW5nZTsKKyAgICBQeU9iamVjdCAqcnY7CiAKLQlyYW5nZS5sb2NhdGlvbiA9IDA7Ci0JcmFuZ2UubGVuZ3RoID0gc2l6ZTsKLQlpZiggZGF0YSA9PSBOVUxMICkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKHNyYywgcmFuZ2UsIGRhdGEpOwotCXJ2ID0gKFB5T2JqZWN0ICopUHlVbmljb2RlX0Zyb21Vbmljb2RlKGRhdGEsIHNpemUtMSk7Ci0JZnJlZShkYXRhKTsKLQlyZXR1cm4gcnY7CisgICAgcmFuZ2UubG9jYXRpb24gPSAwOworICAgIHJhbmdlLmxlbmd0aCA9IHNpemU7CisgICAgaWYoIGRhdGEgPT0gTlVMTCApIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIENGU3RyaW5nR2V0Q2hhcmFjdGVycyhzcmMsIHJhbmdlLCBkYXRhKTsKKyAgICBydiA9IChQeU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tVW5pY29kZShkYXRhLCBzaXplLTEpOworICAgIGZyZWUoZGF0YSk7CisgICAgcmV0dXJuIHJ2OwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNDYsMTU4ICsxNDYsMTU4IEBACiBpbnQKIFB5Q0ZfUHl0aG9uMkNGKFB5T2JqZWN0ICpzcmMsIENGVHlwZVJlZiAqZHN0KSB7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSB8fCBQeVVuaWNvZGVfQ2hlY2soc3JjKSkKLQkJcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NpbXBsZShzcmMsIGRzdCk7Ci0JaWYgKFB5U2VxdWVuY2VfQ2hlY2soc3JjKSkKLQkJcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NlcXVlbmNlKHNyYywgKENGQXJyYXlSZWYgKilkc3QpOwotCWlmIChQeU1hcHBpbmdfQ2hlY2soc3JjKSkKLQkJcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX21hcHBpbmcoc3JjLCAoQ0ZEaWN0aW9uYXJ5UmVmICopZHN0KTsKLQlyZXR1cm4gUHlDRl9QeXRob24yQ0Zfc2ltcGxlKHNyYywgZHN0KTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSB8fCBQeVVuaWNvZGVfQ2hlY2soc3JjKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NpbXBsZShzcmMsIGRzdCk7CisgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2soc3JjKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NlcXVlbmNlKHNyYywgKENGQXJyYXlSZWYgKilkc3QpOworICAgIGlmIChQeU1hcHBpbmdfQ2hlY2soc3JjKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX21hcHBpbmcoc3JjLCAoQ0ZEaWN0aW9uYXJ5UmVmICopZHN0KTsKKyAgICByZXR1cm4gUHlDRl9QeXRob24yQ0Zfc2ltcGxlKHNyYywgZHN0KTsKIH0KIAogaW50CiBQeUNGX1B5dGhvbjJDRl9zZXF1ZW5jZShQeU9iamVjdCAqc3JjLCBDRkFycmF5UmVmICpkc3QpIHsKLQlDRk11dGFibGVBcnJheVJlZiBydiA9IE5VTEw7Ci0JQ0ZUeXBlUmVmIGl0ZW1fY2YgPSBOVUxMOwotCVB5T2JqZWN0ICppdGVtX3B5ID0gTlVMTDsKLQlpbnQgc2l6ZSwgaTsKLQkKLQlpZiggIVB5U2VxdWVuY2VfQ2hlY2soc3JjKSApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkFycmF5IiwKLQkJCXNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQlzaXplID0gUHlTZXF1ZW5jZV9TaXplKHNyYyk7Ci0JcnYgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7Ci0JaWYgKHJ2ID09IE5VTEwpIHsKLQkJUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyAKLQkJZ290byBlcnI7Ci0JfQorICAgIENGTXV0YWJsZUFycmF5UmVmIHJ2ID0gTlVMTDsKKyAgICBDRlR5cGVSZWYgaXRlbV9jZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMOworICAgIGludCBzaXplLCBpOwogCi0JZm9yKCBpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0JCWl0ZW1fcHkgPSBQeVNlcXVlbmNlX0dldEl0ZW0oc3JjLCBpKTsKLQkJaWYgKGl0ZW1fcHkgPT0gTlVMTCkgZ290byBlcnI7Ci0JCWlmICggIVB5Q0ZfUHl0aG9uMkNGKGl0ZW1fcHksICZpdGVtX2NmKSkgZ290byBlcnI7Ci0JCVB5X0RFQ1JFRihpdGVtX3B5KTsKLQkJQ0ZBcnJheVNldFZhbHVlQXRJbmRleChydiwgaSwgaXRlbV9jZik7Ci0JCUNGUmVsZWFzZShpdGVtX2NmKTsKLQkJaXRlbV9jZiA9IE5VTEw7Ci0JfQotCSpkc3QgPSBydjsKLQlyZXR1cm4gMTsKKyAgICBpZiggIVB5U2VxdWVuY2VfQ2hlY2soc3JjKSApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkFycmF5IiwKKyAgICAgICAgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaXplID0gUHlTZXF1ZW5jZV9TaXplKHNyYyk7CisgICAgcnYgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7CisgICAgaWYgKHJ2ID09IE5VTEwpIHsKKyAgICAgICAgUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBmb3IoIGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICAgICAgaXRlbV9weSA9IFB5U2VxdWVuY2VfR2V0SXRlbShzcmMsIGkpOworICAgICAgICBpZiAoaXRlbV9weSA9PSBOVUxMKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKCAhUHlDRl9QeXRob24yQ0YoaXRlbV9weSwgJml0ZW1fY2YpKSBnb3RvIGVycjsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW1fcHkpOworICAgICAgICBDRkFycmF5U2V0VmFsdWVBdEluZGV4KHJ2LCBpLCBpdGVtX2NmKTsKKyAgICAgICAgQ0ZSZWxlYXNlKGl0ZW1fY2YpOworICAgICAgICBpdGVtX2NmID0gTlVMTDsKKyAgICB9CisgICAgKmRzdCA9IHJ2OworICAgIHJldHVybiAxOwogZXJyOgotCVB5X1hERUNSRUYoaXRlbV9weSk7Ci0JaWYgKHJ2KSBDRlJlbGVhc2UocnYpOwotCWlmIChpdGVtX2NmKSBDRlJlbGVhc2UoaXRlbV9jZik7Ci0JcmV0dXJuIDA7CQkKKyAgICBQeV9YREVDUkVGKGl0ZW1fcHkpOworICAgIGlmIChydikgQ0ZSZWxlYXNlKHJ2KTsKKyAgICBpZiAoaXRlbV9jZikgQ0ZSZWxlYXNlKGl0ZW1fY2YpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5Q0ZfUHl0aG9uMkNGX21hcHBpbmcoUHlPYmplY3QgKnNyYywgQ0ZEaWN0aW9uYXJ5UmVmICpkc3QpIHsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIHJ2ID0gTlVMTDsKLQlQeU9iamVjdCAqYXNsaXN0ID0gTlVMTDsKLQlDRlR5cGVSZWYga2V5X2NmID0gTlVMTCwgdmFsdWVfY2YgPSBOVUxMOwotCVB5T2JqZWN0ICppdGVtX3B5ID0gTlVMTCwgKmtleV9weSA9IE5VTEwsICp2YWx1ZV9weSA9IE5VTEw7Ci0JaW50IHNpemUsIGk7Ci0JCi0JaWYoICFQeU1hcHBpbmdfQ2hlY2soc3JjKSApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkRpY3Rpb25hcnkiLAotCQkJc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNpemUgPSBQeU1hcHBpbmdfU2l6ZShzcmMpOwotCXJ2ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwKLQkJCQkJJmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOwotCWlmIChydiA9PSBOVUxMKSB7Ci0JCVB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsgCi0JCWdvdG8gZXJyOwotCX0KLQlpZiAoIChhc2xpc3QgPSBQeU1hcHBpbmdfSXRlbXMoc3JjKSkgPT0gTlVMTCApIGdvdG8gZXJyOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgcnYgPSBOVUxMOworICAgIFB5T2JqZWN0ICphc2xpc3QgPSBOVUxMOworICAgIENGVHlwZVJlZiBrZXlfY2YgPSBOVUxMLCB2YWx1ZV9jZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMLCAqa2V5X3B5ID0gTlVMTCwgKnZhbHVlX3B5ID0gTlVMTDsKKyAgICBpbnQgc2l6ZSwgaTsKIAotCWZvciggaT0wOyBpPHNpemU7IGkrKykgewotCQlpdGVtX3B5ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFzbGlzdCwgaSk7Ci0JCWlmIChpdGVtX3B5ID09IE5VTEwpIGdvdG8gZXJyOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoaXRlbV9weSwgIk9PIiwgJmtleV9weSwgJnZhbHVlX3B5KSkgZ290byBlcnI7Ci0JCWlmICggIVB5Q0ZfUHl0aG9uMkNGKGtleV9weSwgJmtleV9jZikgKSBnb3RvIGVycjsKLQkJaWYgKCAhUHlDRl9QeXRob24yQ0YodmFsdWVfcHksICZ2YWx1ZV9jZikgKSBnb3RvIGVycjsKLQkJQ0ZEaWN0aW9uYXJ5QWRkVmFsdWUocnYsIGtleV9jZiwgdmFsdWVfY2YpOwotCQlDRlJlbGVhc2Uoa2V5X2NmKTsKLQkJa2V5X2NmID0gTlVMTDsKLQkJQ0ZSZWxlYXNlKHZhbHVlX2NmKTsKLQkJdmFsdWVfY2YgPSBOVUxMOwotCX0KLQkqZHN0ID0gcnY7Ci0JcmV0dXJuIDE7CisgICAgaWYoICFQeU1hcHBpbmdfQ2hlY2soc3JjKSApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkRpY3Rpb25hcnkiLAorICAgICAgICAgICAgc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNpemUgPSBQeU1hcHBpbmdfU2l6ZShzcmMpOworICAgIHJ2ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKyAgICBpZiAocnYgPT0gTlVMTCkgeworICAgICAgICBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoIChhc2xpc3QgPSBQeU1hcHBpbmdfSXRlbXMoc3JjKSkgPT0gTlVMTCApIGdvdG8gZXJyOworCisgICAgZm9yKCBpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgIGl0ZW1fcHkgPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXNsaXN0LCBpKTsKKyAgICAgICAgaWYgKGl0ZW1fcHkgPT0gTlVMTCkgZ290byBlcnI7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShpdGVtX3B5LCAiT08iLCAma2V5X3B5LCAmdmFsdWVfcHkpKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKCAhUHlDRl9QeXRob24yQ0Yoa2V5X3B5LCAma2V5X2NmKSApIGdvdG8gZXJyOworICAgICAgICBpZiAoICFQeUNGX1B5dGhvbjJDRih2YWx1ZV9weSwgJnZhbHVlX2NmKSApIGdvdG8gZXJyOworICAgICAgICBDRkRpY3Rpb25hcnlBZGRWYWx1ZShydiwga2V5X2NmLCB2YWx1ZV9jZik7CisgICAgICAgIENGUmVsZWFzZShrZXlfY2YpOworICAgICAgICBrZXlfY2YgPSBOVUxMOworICAgICAgICBDRlJlbGVhc2UodmFsdWVfY2YpOworICAgICAgICB2YWx1ZV9jZiA9IE5VTEw7CisgICAgfQorICAgICpkc3QgPSBydjsKKyAgICByZXR1cm4gMTsKIGVycjoKLQlQeV9YREVDUkVGKGl0ZW1fcHkpOwotCVB5X1hERUNSRUYoYXNsaXN0KTsKLQlpZiAocnYpIENGUmVsZWFzZShydik7Ci0JaWYgKGtleV9jZikgQ0ZSZWxlYXNlKGtleV9jZik7Ci0JaWYgKHZhbHVlX2NmKSBDRlJlbGVhc2UodmFsdWVfY2YpOwotCXJldHVybiAwOwkJCisgICAgUHlfWERFQ1JFRihpdGVtX3B5KTsKKyAgICBQeV9YREVDUkVGKGFzbGlzdCk7CisgICAgaWYgKHJ2KSBDRlJlbGVhc2UocnYpOworICAgIGlmIChrZXlfY2YpIENGUmVsZWFzZShrZXlfY2YpOworICAgIGlmICh2YWx1ZV9jZikgQ0ZSZWxlYXNlKHZhbHVlX2NmKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeUNGX1B5dGhvbjJDRl9zaW1wbGUoUHlPYmplY3QgKnNyYywgQ0ZUeXBlUmVmICpkc3QpIHsKLQkKKwogI2lmIDAKLQlpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhzcmMsICJDRlR5cGUiKSkgewotCQkqZHN0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzcmMsICJDRlR5cGUiLCAiIik7Ci0JCXJldHVybiAoKmRzdCAhPSBOVUxMKTsKLQl9CisgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoc3JjLCAiQ0ZUeXBlIikpIHsKKyAgICAgICAgKmRzdCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3JjLCAiQ0ZUeXBlIiwgIiIpOworICAgICAgICByZXR1cm4gKCpkc3QgIT0gTlVMTCk7CisgICAgfQogI2VuZGlmCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHNyYykgfHwgUHlVbmljb2RlX0NoZWNrKHNyYykpIAotCQlyZXR1cm4gUHlDRl9QeXRob24yQ0Zfc3RyaW5nKHNyYywgKENGU3RyaW5nUmVmICopZHN0KTsKLQlpZiAoUHlCb29sX0NoZWNrKHNyYykpIHsKLQkJaWYgKHNyYyA9PSBQeV9UcnVlKQotCQkJKmRzdCA9IGtDRkJvb2xlYW5UcnVlOwotCQllbHNlCi0JCQkqZHN0ID0ga0NGQm9vbGVhbkZhbHNlOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5SW50X0NoZWNrKHNyYykpIHsKLQkJbG9uZyB2ID0gUHlJbnRfQXNMb25nKHNyYyk7Ci0JCSpkc3QgPSBDRk51bWJlckNyZWF0ZShOVUxMLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJnYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5RmxvYXRfQ2hlY2soc3JjKSkgewotCQlkb3VibGUgZCA9IFB5RmxvYXRfQXNEb3VibGUoc3JjKTsKLQkJKmRzdCA9IENGTnVtYmVyQ3JlYXRlKE5VTEwsIGtDRk51bWJlckRvdWJsZVR5cGUsICZkKTsKLQkJcmV0dXJuIDE7Ci0JfQotCQkJCi0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAiQ2Fubm90IGNvbnZlcnQgJS41MDBzIG9iamVjdHMgdG8gQ0ZUeXBlIiwKLQkJCQkgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHNyYykgfHwgUHlVbmljb2RlX0NoZWNrKHNyYykpCisgICAgICAgIHJldHVybiBQeUNGX1B5dGhvbjJDRl9zdHJpbmcoc3JjLCAoQ0ZTdHJpbmdSZWYgKilkc3QpOworICAgIGlmIChQeUJvb2xfQ2hlY2soc3JjKSkgeworICAgICAgICBpZiAoc3JjID09IFB5X1RydWUpCisgICAgICAgICAgICAqZHN0ID0ga0NGQm9vbGVhblRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QgPSBrQ0ZCb29sZWFuRmFsc2U7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlJbnRfQ2hlY2soc3JjKSkgeworICAgICAgICBsb25nIHYgPSBQeUludF9Bc0xvbmcoc3JjKTsKKyAgICAgICAgKmRzdCA9IENGTnVtYmVyQ3JlYXRlKE5VTEwsIGtDRk51bWJlckxvbmdUeXBlLCAmdik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlGbG9hdF9DaGVjayhzcmMpKSB7CisgICAgICAgIGRvdWJsZSBkID0gUHlGbG9hdF9Bc0RvdWJsZShzcmMpOworICAgICAgICAqZHN0ID0gQ0ZOdW1iZXJDcmVhdGUoTlVMTCwga0NGTnVtYmVyRG91YmxlVHlwZSwgJmQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAiQ2Fubm90IGNvbnZlcnQgJS41MDBzIG9iamVjdHMgdG8gQ0ZUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlDRl9QeXRob24yQ0Zfc3RyaW5nKFB5T2JqZWN0ICpzcmMsIENGU3RyaW5nUmVmICpkc3QpIHsKLQljaGFyICpjaGFyczsKLQlDRkluZGV4IHNpemU7Ci0JVW5pQ2hhciAqdW5pY2hhcnM7Ci0JCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHNyYykpIHsKLQkJaWYgKCFQeUFyZ19QYXJzZShzcmMsICJlcyIsICJhc2NpaSIsICZjaGFycykpCi0JCQlyZXR1cm4gMDsgLyogVGhpcyBlcnJvciBpcyBtb3JlIGRlc2NyaXB0aXZlIHRoYW4gdGhlIGdlbmVyYWwgb25lIGJlbG93ICovCi0JCSpkc3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLCBjaGFycywga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSk7Ci0JCVB5TWVtX0ZyZWUoY2hhcnMpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5VW5pY29kZV9DaGVjayhzcmMpKSB7Ci0JCS8qIFdlIHVzZSB0aGUgQ0YgdHlwZXMgaGVyZSwgaWYgUHl0aG9uIHdhcyBjb25maWd1cmVkIGRpZmZlcmVudGx5IHRoYXQgd2lsbCBnaXZlIGFuIGVycm9yICovCi0JCXNpemUgPSBQeVVuaWNvZGVfR2V0U2l6ZShzcmMpOwotCQlpZiAoKHVuaWNoYXJzID0gUHlVbmljb2RlX0FzVW5pY29kZShzcmMpKSA9PSBOVUxMICkgZ290byBlcnI7Ci0JCSpkc3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLCB1bmljaGFycywgc2l6ZSk7Ci0JCXJldHVybiAxOwotCX0KKyAgICBjaGFyICpjaGFyczsKKyAgICBDRkluZGV4IHNpemU7CisgICAgVW5pQ2hhciAqdW5pY2hhcnM7CisKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHNyYywgImVzIiwgImFzY2lpIiwgJmNoYXJzKSkKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiBUaGlzIGVycm9yIGlzIG1vcmUgZGVzY3JpcHRpdmUgdGhhbiB0aGUgZ2VuZXJhbCBvbmUgYmVsb3cgKi8KKyAgICAgICAgKmRzdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsIGNoYXJzLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKTsKKyAgICAgICAgUHlNZW1fRnJlZShjaGFycyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHNyYykpIHsKKyAgICAgICAgLyogV2UgdXNlIHRoZSBDRiB0eXBlcyBoZXJlLCBpZiBQeXRob24gd2FzIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkgdGhhdCB3aWxsIGdpdmUgYW4gZXJyb3IgKi8KKyAgICAgICAgc2l6ZSA9IFB5VW5pY29kZV9HZXRTaXplKHNyYyk7CisgICAgICAgIGlmICgodW5pY2hhcnMgPSBQeVVuaWNvZGVfQXNVbmljb2RlKHNyYykpID09IE5VTEwgKSBnb3RvIGVycjsKKyAgICAgICAgKmRzdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoKENGQWxsb2NhdG9yUmVmKU5VTEwsIHVuaWNoYXJzLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogZXJyOgotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgIkNhbm5vdCBjb252ZXJ0ICUuNTAwcyBvYmplY3RzIHRvIENGU3RyaW5nIiwKLQkJCQkgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgIkNhbm5vdCBjb252ZXJ0ICUuNTAwcyBvYmplY3RzIHRvIENGU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmMgYi9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmMKaW5kZXggYmMyOTc2ZS4uOTU1YWNmYiAxMDA3NTUKLS0tIGEvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5jCisrKyBiL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuYwpAQCAtMSw0NSArMSw0NSBAQAogLyoKLQlGaWxlOgkJQ0ZNTGF0ZUltcG9ydC5jCisgICAgRmlsZTogICAgICAgICAgICAgICBDRk1MYXRlSW1wb3J0LmMKIAotCUNvbnRhaW5zOglJbXBsZW1lbnRhdGlvbiBvZiBDRk0gbGF0ZSBpbXBvcnQgbGlicmFyeS4KKyAgICBDb250YWluczogICAgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIENGTSBsYXRlIGltcG9ydCBsaWJyYXJ5LgogCi0JV3JpdHRlbiBieToJUXVpbm4KKyAgICBXcml0dGVuIGJ5OiAgICAgICAgIFF1aW5uCiAKLQlDb3B5cmlnaHQ6CUNvcHlyaWdodCCpIDE5OTkgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAgQ29weXJpZ2h0OiAgICAgICAgICBDb3B5cmlnaHQgqSAxOTk5IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgogCi0JCQkJWW91IG1heSBpbmNvcnBvcmF0ZSB0aGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBpbnRvIHlvdXIgcHJvZ3JhbShzKSB3aXRob3V0Ci0JCQkJcmVzdHJpY3Rpb24uIFRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGhhcyBiZWVuIHByb3ZpZGVkICJBUyBJUyIgYW5kIHRoZQotCQkJCXJlc3BvbnNpYmlsaXR5IGZvciBpdHMgb3BlcmF0aW9uIGlzIHlvdXJzLiBZb3UgYXJlIG5vdCBwZXJtaXR0ZWQgdG8gcmVkaXN0cmlidXRlCi0JCQkJdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgYXMgIkFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSIgYWZ0ZXIgaGF2aW5nIG1hZGUKLQkJCQljaGFuZ2VzLiBJZiB5b3UncmUgZ29pbmcgdG8gcmUtZGlzdHJpYnV0ZSB0aGUgc291cmNlLCB3ZSByZXF1aXJlIHRoYXQgeW91IG1ha2UKLQkJCQlpdCBjbGVhciBpbiB0aGUgc291cmNlIHRoYXQgdGhlIGNvZGUgd2FzIGRlc2NlbmRlZCBmcm9tIEFwcGxlIHNhbXBsZSBzb3VyY2UKLQkJCQljb2RlLCBidXQgdGhhdCB5b3UndmUgbWFkZSBjaGFuZ2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgaW5jb3Jwb3JhdGUgdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaW50byB5b3VyIHByb2dyYW0ocykgd2l0aG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uLiBUaGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBoYXMgYmVlbiBwcm92aWRlZCAiQVMgSVMiIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zaWJpbGl0eSBmb3IgaXRzIG9wZXJhdGlvbiBpcyB5b3Vycy4gWW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHJlZGlzdHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGFzICJBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUiIGFmdGVyIGhhdmluZyBtYWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy4gSWYgeW91J3JlIGdvaW5nIHRvIHJlLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSwgd2UgcmVxdWlyZSB0aGF0IHlvdSBtYWtlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgY2xlYXIgaW4gdGhlIHNvdXJjZSB0aGF0IHRoZSBjb2RlIHdhcyBkZXNjZW5kZWQgZnJvbSBBcHBsZSBzYW1wbGUgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSwgYnV0IHRoYXQgeW91J3ZlIG1hZGUgY2hhbmdlcy4KIAotCUNoYW5nZSBIaXN0b3J5IChtb3N0IHJlY2VudCBmaXJzdCk6CisgICAgQ2hhbmdlIEhpc3RvcnkgKG1vc3QgcmVjZW50IGZpcnN0KToKIAotICAgICAgICA8MTM+ICAgICAyNC85LzAxICAgIFF1aW5uICAgRml4ZXMgdG8gY29tcGlsZSB3aXRoIEMrKyBhY3RpdmF0ZWQuCi0gICAgICAgIDwxMj4gICAgIDIxLzkvMDEgICAgUXVpbm4gICBbMjcxMDQ4OV0gRml4IHR5cG8gaW4gdGhlIGNvbW1lbnRzIGZvciBGcmFnbWVudExvb2t1cC4KLSAgICAgICAgPDExPiAgICAgMjEvOS8wMSAgICBRdWlubiAgIENoYW5nZXMgZm9yIENXUHJvNyBNYWNoLU8gYnVpbGQuCi0gICAgICAgIDwxMD4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDb3JyZWN0ZWQgaW1wbGVtZW50YXRpb24gb2Yga1BFRlJlbG9jU21CeVNlY3Rpb24uIEFkZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgb2Yga1BFRlJlbG9jU2V0UG9zaXRpb24gYW5kIGtQRUZSZWxvY0xnQnlJbXBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tIGNvZGUgY29udHJpYnV0ZWQgYnkgRXJpYyBHcmFudCwgTmVkIEhvbGJyb29rLCBhbmQgU3RldmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEthbGt3YXJmKSwgYWx0aG91Z2ggSSBjYW4ndCB0ZXN0IHRoZW0geWV0LgotICAgICAgICAgPDk+ICAgICAxOS85LzAxICAgIFF1aW5uICAgV2Ugbm93IGhhbmRsZSB1bnBhY2tlZCBkYXRhIHNlY3Rpb25zLCBjb3VydGVzeSBvZiBzb21lIGNvZGUgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVkIEhvbGJyb29rLgotICAgICAgICAgPDg+ICAgICAxOS85LzAxICAgIFF1aW5uICAgTWlub3IgZml4ZXMgZm9yIHRoZSBwcmV2aW91cyBjaGVja2luLiBVcGRhdGVkIHNvbWUgY29tbWVudHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraWxsZWQgc29tZSBkZWFkIGNvZGUuCi0gICAgICAgICA8Nz4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBTaW1wbGlmaWVkIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gYWZ0ZXIgYSBzdWdnZXN0aW9uIGJ5IEVyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW50LiBZb3Ugbm8gbG9uZ2VyIGhhdmUgdG8gQ0ZNIGV4cG9ydCBhIGR1bW15IGZ1bmN0aW9uOyB5b3UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBqdXN0IHBhc3MgaW4gdGhlIGFkZHJlc3Mgb2YgeW91ciBmcmFnbWVudCdzIGluaXQgcm91dGluZS4KLSAgICAgICAgIDw2PiAgICAgMTUvMi8wMSAgICBRdWlubiAgIE1vZGlmeSBjb21waWxlLXRpbWUgd2FybmluZ3MgdG8gY29tcGxhaW4gaWYgeW91IHRyeSB0byBidWlsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtb2R1bGUgaW50byBhIE1hY2gtTyBiaW5hcnkuCi0gICAgICAgICA8NT4gICAgICA1LzIvMDEgICAgUXVpbm4gICBSZW1vdmVkIHJlZHVuZGFudCBhc3NpZ25tZW50IGluIENGTUxhdGVJbXBvcnRDb3JlLgotICAgICAgICAgPDQ+ICAgIDMwLzExLzAwICAgIFF1aW5uICAgQWRkZWQgY29tbWVudCBhYm91dCBmdXR1cmUgb2YgZGF0YSBzeW1ib2xzIGluIENGLgotICAgICAgICAgPDM+ICAgIDE2LzExLzAwICAgIFF1aW5uICAgQWxsb3cgc3ltYm9sIGZpbmRpbmcgdmlhIGEgY2FsbGJhY2sgYW5kIHVzZSB0aGF0IHRvIGltcGxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZCdW5kbGUgc3VwcG9ydC4KLSAgICAgICAgIDwyPiAgICAxOC8xMC85OSAgICBRdWlubiAgIFJlbmFtZWQgQ0ZNTGF0ZUltcG9ydCB0byBDRk1MYXRlSW1wb3J0TGlicmFyeSB0byBhbGxvdyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZ1dHVyZSBBUEkgZXhwYW5zaW9uLgotICAgICAgICAgPDE+ICAgICAxNS82Lzk5ICAgIFF1aW5uICAgRmlyc3QgY2hlY2tlZCBpbi4KKyAgICA8MTM+ICAgICAyNC85LzAxICAgIFF1aW5uICAgRml4ZXMgdG8gY29tcGlsZSB3aXRoIEMrKyBhY3RpdmF0ZWQuCisgICAgPDEyPiAgICAgMjEvOS8wMSAgICBRdWlubiAgIFsyNzEwNDg5XSBGaXggdHlwbyBpbiB0aGUgY29tbWVudHMgZm9yIEZyYWdtZW50TG9va3VwLgorICAgIDwxMT4gICAgIDIxLzkvMDEgICAgUXVpbm4gICBDaGFuZ2VzIGZvciBDV1BybzcgTWFjaC1PIGJ1aWxkLgorICAgIDwxMD4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDb3JyZWN0ZWQgaW1wbGVtZW50YXRpb24gb2Yga1BFRlJlbG9jU21CeVNlY3Rpb24uIEFkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBvZiBrUEVGUmVsb2NTZXRQb3NpdGlvbiBhbmQga1BFRlJlbG9jTGdCeUltcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbSBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEVyaWMgR3JhbnQsIE5lZCBIb2xicm9vaywgYW5kIFN0ZXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEthbGt3YXJmKSwgYWx0aG91Z2ggSSBjYW4ndCB0ZXN0IHRoZW0geWV0LgorICAgICA8OT4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBXZSBub3cgaGFuZGxlIHVucGFja2VkIGRhdGEgc2VjdGlvbnMsIGNvdXJ0ZXN5IG9mIHNvbWUgY29kZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZCBIb2xicm9vay4KKyAgICAgPDg+ICAgICAxOS85LzAxICAgIFF1aW5uICAgTWlub3IgZml4ZXMgZm9yIHRoZSBwcmV2aW91cyBjaGVja2luLiBVcGRhdGVkIHNvbWUgY29tbWVudHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxlZCBzb21lIGRlYWQgY29kZS4KKyAgICAgPDc+ICAgICAxOS85LzAxICAgIFF1aW5uICAgU2ltcGxpZmllZCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGFmdGVyIGEgc3VnZ2VzdGlvbiBieSBFcmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW50LiBZb3Ugbm8gbG9uZ2VyIGhhdmUgdG8gQ0ZNIGV4cG9ydCBhIGR1bW15IGZ1bmN0aW9uOyB5b3UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGp1c3QgcGFzcyBpbiB0aGUgYWRkcmVzcyBvZiB5b3VyIGZyYWdtZW50J3MgaW5pdCByb3V0aW5lLgorICAgICA8Nj4gICAgIDE1LzIvMDEgICAgUXVpbm4gICBNb2RpZnkgY29tcGlsZS10aW1lIHdhcm5pbmdzIHRvIGNvbXBsYWluIGlmIHlvdSB0cnkgdG8gYnVpbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtb2R1bGUgaW50byBhIE1hY2gtTyBiaW5hcnkuCisgICAgIDw1PiAgICAgIDUvMi8wMSAgICBRdWlubiAgIFJlbW92ZWQgcmVkdW5kYW50IGFzc2lnbm1lbnQgaW4gQ0ZNTGF0ZUltcG9ydENvcmUuCisgICAgIDw0PiAgICAzMC8xMS8wMCAgICBRdWlubiAgIEFkZGVkIGNvbW1lbnQgYWJvdXQgZnV0dXJlIG9mIGRhdGEgc3ltYm9scyBpbiBDRi4KKyAgICAgPDM+ICAgIDE2LzExLzAwICAgIFF1aW5uICAgQWxsb3cgc3ltYm9sIGZpbmRpbmcgdmlhIGEgY2FsbGJhY2sgYW5kIHVzZSB0aGF0IHRvIGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZSBzdXBwb3J0LgorICAgICA8Mj4gICAgMTgvMTAvOTkgICAgUXVpbm4gICBSZW5hbWVkIENGTUxhdGVJbXBvcnQgdG8gQ0ZNTGF0ZUltcG9ydExpYnJhcnkgdG8gYWxsb3cgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZ1dHVyZSBBUEkgZXhwYW5zaW9uLgorICAgICA8MT4gICAgIDE1LzYvOTkgICAgUXVpbm4gICBGaXJzdCBjaGVja2VkIGluLgogKi8KIAogLy8gVG8gRG8gTGlzdDoKQEAgLTY2LDggKzY2LDggQEAKIC8vIE1hYyBPUyBJbnRlcmZhY2VzCiAKICNpZiAhIE1PUkVfRlJBTUVXT1JLX0lOQ0xVREVTCi0JI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KLQkjaW5jbHVkZSA8UEVGQmluYXJ5Rm9ybWF0Lmg+CisgICAgI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KKyAgICAjaW5jbHVkZSA8UEVGQmluYXJ5Rm9ybWF0Lmg+CiAjZW5kaWYKIAogLy8gU3RhbmRhcmQgQyBJbnRlcmZhY2VzCkBAIC04NiwzMiArODYsMzIgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKICNpZiBUQVJHRVRfUlRfTUFDX01BQ0hPCi0JI2Vycm9yIENGTUxhdGVJbXBvcnQgaXMgbm90IHN1aXRhYmxlIGZvciB1c2UgaW4gYSBNYWNoLU8gcHJvamVjdC4KKyAgICAjZXJyb3IgQ0ZNTGF0ZUltcG9ydCBpcyBub3Qgc3VpdGFibGUgZm9yIHVzZSBpbiBhIE1hY2gtTyBwcm9qZWN0LgogI2VsaWYgIVRBUkdFVF9SVF9NQUNfQ0ZNIHx8ICFUQVJHRVRfQ1BVX1BQQwotCSNlcnJvciBDRk1MYXRlSW1wb3J0IGhhcyBub3QgYmVlbiBxdWFsaWZpZWQgZm9yIDY4SyBvciBDRk0tNjhLIHVzZS4KKyAgICAjZXJyb3IgQ0ZNTGF0ZUltcG9ydCBoYXMgbm90IGJlZW4gcXVhbGlmaWVkIGZvciA2OEsgb3IgQ0ZNLTY4SyB1c2UuCiAjZW5kaWYKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICNwcmFnbWEgbWFyayAtLS0tLSBVdGlsaXR5IFJvdXRpbmVzIC0tLS0tCiAKIHN0YXRpYyBPU1N0YXR1cyBGU1JlYWRBdE9mZnNldChTSW50MTYgcmVmTnVtLCBTSW50MzIgb2Zmc2V0LCBTSW50MzIgY291bnQsIHZvaWQgKmJ1ZmZlcikKLQkvLyBBIGNvbnZlbmllbnQgd3JhcHBlciBhcm91bmQgUEJSZWFkIHdoaWNoIGhhcyB0d28gYWR2YW50YWdlcwotCS8vIG92ZXIgRlNSZWFkLiAgRmlyc3QsIGl0IHRha2VzIGNvdW50IGFzIGEgdmFsdWUgcGFyYW1ldGVyLgotCS8vIFNlY29uZCwgaXQgcmVhZHMgZnJvbSBhbiBhcmJpdHJhcnkgb2Zmc2V0IGludG8gdGhlIGZpbGUsCi0JLy8gd2hpY2ggYXZvaWRzIGEgYnVuY2ggb2YgU2V0RlBvcyBjYWxscy4KLQkvLwotCS8vIEkgZ3Vlc3MgdGhpcyBzaG91bGQgZ28gaW50byAiTW9yZUZpbGVzLmgiLCBidXQgSSdtIG5vdCBzdXJlCi0JLy8gaG93IHdlJ3JlIGdvaW5nIHRvIGludGVncmF0ZSBzdWNoIGEgY29uY2VwdCBpbnRvIE1JQiB5ZXQuCisgICAgLy8gQSBjb252ZW5pZW50IHdyYXBwZXIgYXJvdW5kIFBCUmVhZCB3aGljaCBoYXMgdHdvIGFkdmFudGFnZXMKKyAgICAvLyBvdmVyIEZTUmVhZC4gIEZpcnN0LCBpdCB0YWtlcyBjb3VudCBhcyBhIHZhbHVlIHBhcmFtZXRlci4KKyAgICAvLyBTZWNvbmQsIGl0IHJlYWRzIGZyb20gYW4gYXJiaXRyYXJ5IG9mZnNldCBpbnRvIHRoZSBmaWxlLAorICAgIC8vIHdoaWNoIGF2b2lkcyBhIGJ1bmNoIG9mIFNldEZQb3MgY2FsbHMuCisgICAgLy8KKyAgICAvLyBJIGd1ZXNzIHRoaXMgc2hvdWxkIGdvIGludG8gIk1vcmVGaWxlcy5oIiwgYnV0IEknbSBub3Qgc3VyZQorICAgIC8vIGhvdyB3ZSdyZSBnb2luZyB0byBpbnRlZ3JhdGUgc3VjaCBhIGNvbmNlcHQgaW50byBNSUIgeWV0LgogewotCVBhcmFtQmxvY2tSZWMgcGI7Ci0JCi0JcGIuaW9QYXJhbS5pb1JlZk51bSAgICAgPSByZWZOdW07Ci0JcGIuaW9QYXJhbS5pb0J1ZmZlciAgICAgPSAoUHRyKSBidWZmZXI7Ci0JcGIuaW9QYXJhbS5pb1JlcUNvdW50ICAgPSBjb3VudDsKLQlwYi5pb1BhcmFtLmlvUG9zTW9kZSAgICA9IGZzRnJvbVN0YXJ0OwotCXBiLmlvUGFyYW0uaW9Qb3NPZmZzZXQgID0gb2Zmc2V0OwotCQotCXJldHVybiBQQlJlYWRTeW5jKCZwYik7CisgICAgUGFyYW1CbG9ja1JlYyBwYjsKKworICAgIHBiLmlvUGFyYW0uaW9SZWZOdW0gICAgID0gcmVmTnVtOworICAgIHBiLmlvUGFyYW0uaW9CdWZmZXIgICAgID0gKFB0cikgYnVmZmVyOworICAgIHBiLmlvUGFyYW0uaW9SZXFDb3VudCAgID0gY291bnQ7CisgICAgcGIuaW9QYXJhbS5pb1Bvc01vZGUgICAgPSBmc0Zyb21TdGFydDsKKyAgICBwYi5pb1BhcmFtLmlvUG9zT2Zmc2V0ICA9IG9mZnNldDsKKworICAgIHJldHVybiBQQlJlYWRTeW5jKCZwYik7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xMjQsMTYgKzEyNCwxNiBAQAogLy8gd2UgZmlsbCBvdXQgbW9yZSBmaWVsZHMuCiAKIHN0cnVjdCBGcmFnVG9GaXhJbmZvIHsKLQlDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IJbG9jYXRvcjsJCQkJLy8gSG93IHRvIGZpbmQgdGhlIGZyYWdtZW50J3MgY29udGFpbmVyLgotCUNGcmFnQ29ubmVjdGlvbklEIAkJCWNvbm5JRDsJCQkJCS8vIENGTSBjb25uZWN0aW9uIHRvIHRoZSBmcmFnbWVudC4KLQlDRnJhZ0luaXRGdW5jdGlvbiAJCQlpbml0Um91dGluZTsJCQkvLyBUaGUgQ0ZNIGluaXQgcm91dGluZSBmb3IgdGhlIGZyYWdtZW50LgotCVBFRkNvbnRhaW5lckhlYWRlciAJCQljb250YWluZXJIZWFkZXI7CQkvLyBUaGUgQ0ZNIGhlYWRlciwgcmVhZCBpbiBmcm9tIHRoZSBjb250YWluZXIuCi0JUEVGU2VjdGlvbkhlYWRlcgkJCSpzZWN0aW9uSGVhZGVyczsJCS8vIFRoZSBDRk0gc2VjdGlvbiBoZWFkZXJzLiAgQSBwb2ludGVyIGJsb2NrIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgY29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCBlbGVtZW50cy4KLQlQRUZMb2FkZXJJbmZvSGVhZGVyCQkJKmxvYWRlclNlY3Rpb247CQkJLy8gVGhlIGVudGlyZSBDRk0gbG9hZGVyIHNlY3Rpb24gaW4gYSBwb2ludGVyIGJsb2NrLgotCVNJbnQxNgkJCQkJCWZpbGVSZWY7CQkJCS8vIEEgcmVhZC1vbmx5IHBhdGggdG8gdGhlIENGTSBjb250YWluZXIuICBXZSBrZWVwIHRoaXMgaGVyZSBiZWNhdXNlIG9uZSB0aGF0IG9uZSByb3V0aW5lIG5lZWRzIHRvIHJlYWQgZnJvbSB0aGUgY29udGFpbmVyLgotCXZvaWQgCQkJCQkJKnNlY3Rpb24wQmFzZTsJCQkvLyBUaGUgYmFzZSBhZGRyZXNzIG9mIHNlY3Rpb24gMCwgd2hpY2ggd2UgZ28gdGhyb3VnaCBob29wcyB0byBjYWxjdWxhdGUuCi0Jdm9pZCAJCQkJCQkqc2VjdGlvbjFCYXNlOwkJCS8vIFRoZSBiYXNlIGFkZHJlc3Mgb2Ygc2VjdGlvbiAxLCB3aGljaCB3ZSBnbyB0aHJvdWdoIGhvb3BzIHRvIGNhbGN1bGF0ZS4KLQlCb29sZWFuCQkJCQkJZGlzcG9zZVNlY3Rpb25Qb2ludGVyczsJLy8gU2VlIGJlbG93LgorICAgIENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciAgICAgICAgIGxvY2F0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3cgdG8gZmluZCB0aGUgZnJhZ21lbnQncyBjb250YWluZXIuCisgICAgQ0ZyYWdDb25uZWN0aW9uSUQgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0ZNIGNvbm5lY3Rpb24gdG8gdGhlIGZyYWdtZW50LgorICAgIENGcmFnSW5pdEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFJvdXRpbmU7ICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQ0ZNIGluaXQgcm91dGluZSBmb3IgdGhlIGZyYWdtZW50LgorICAgIFBFRkNvbnRhaW5lckhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVySGVhZGVyOyAgICAgICAgICAgICAgICAvLyBUaGUgQ0ZNIGhlYWRlciwgcmVhZCBpbiBmcm9tIHRoZSBjb250YWluZXIuCisgICAgUEVGU2VjdGlvbkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VjdGlvbkhlYWRlcnM7ICAgICAgICAgICAgICAgIC8vIFRoZSBDRk0gc2VjdGlvbiBoZWFkZXJzLiAgQSBwb2ludGVyIGJsb2NrIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgY29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCBlbGVtZW50cy4KKyAgICBQRUZMb2FkZXJJbmZvSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICpsb2FkZXJTZWN0aW9uOyAgICAgICAgICAgICAgICAgLy8gVGhlIGVudGlyZSBDRk0gbG9hZGVyIHNlY3Rpb24gaW4gYSBwb2ludGVyIGJsb2NrLgorICAgIFNJbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUmVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSByZWFkLW9ubHkgcGF0aCB0byB0aGUgQ0ZNIGNvbnRhaW5lci4gIFdlIGtlZXAgdGhpcyBoZXJlIGJlY2F1c2Ugb25lIHRoYXQgb25lIHJvdXRpbmUgbmVlZHMgdG8gcmVhZCBmcm9tIHRoZSBjb250YWluZXIuCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZWN0aW9uMEJhc2U7ICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhc2UgYWRkcmVzcyBvZiBzZWN0aW9uIDAsIHdoaWNoIHdlIGdvIHRocm91Z2ggaG9vcHMgdG8gY2FsY3VsYXRlLgorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VjdGlvbjFCYXNlOyAgICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlIGFkZHJlc3Mgb2Ygc2VjdGlvbiAxLCB3aGljaCB3ZSBnbyB0aHJvdWdoIGhvb3BzIHRvIGNhbGN1bGF0ZS4KKyAgICBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZVNlY3Rpb25Qb2ludGVyczsgLy8gU2VlIGJlbG93LgogfTsKIHR5cGVkZWYgc3RydWN0IEZyYWdUb0ZpeEluZm8gRnJhZ1RvRml4SW5mbzsKIApAQCAtMTUxLDYxNCArMTUxLDYxNCBAQAogLy8gZGlzcG9zZVNlY3Rpb25Qb2ludGVycyByZW1haW5zIGFzIHZlc3RpZ2lhbCBzdXBwb3J0IGZvciB0aGUgY29uY2VwdC4KIAogc3RhdGljIE9TU3RhdHVzIFJlYWRDb250YWluZXJCYXNpY3MoRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4KQotCS8vIFJlYWRzIHNvbWUgYmFzaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgY29udGFpbmVyIG9mIHRoZQotCS8vIGZyYWdtZW50IHRvIGZpeCBhbmQgc3RvcmVzIGl0IGluIHZhcmlvdXMgZmllbGRzIG9mCi0JLy8gZnJhZ1RvRml4LiAgVGhpcyBpbmNsdWRlczoKLQkvLwotCS8vIG8gY29udGFpbmVySGVhZGVyIC0tIFRoZSBjb250YWluIGhlYWRlciBpdHNlbGYuCi0JLy8gbyBzZWN0aW9uSGVhZGVycyAgLS0gVGhlIGFycmF5IG9mIHNlY3Rpb24gaGVhZGVycyAoaW4gYSBuZXdseSBhbGxvY2F0ZWQgcG9pbnRlciBibG9jaykuCi0JLy8gbyBsb2FkZXJTZWN0aW9uICAgLS0gVGhlIGVudGlyZSBsb2FkZXIgc2VjdGlvbiAoaW4gYSBuZXdseSBhbGxvY2F0ZWQgcG9pbnRlciBibG9jaykuCi0JLy8KLQkvLyBBbHNvIHNldHMgZGlzcG9zZVNlY3Rpb25Qb2ludGVycyB0byBpbmRpY2F0ZSB3aGV0aGVyCi0JLy8gdGhlIGxhc3QgdHdvIHBvaW50ZXJzIHNob3VsZCBiZSBkaXNwb3NlZCBvZi4KLQkvLwotCS8vIEZpbmFsbHksIGl0IGxlYXZlcyB0aGUgY29udGFpbmVyIGZpbGUgb3BlbiBmb3IgbGF0ZXIKLQkvLyBmb2xrcyB3aG8gd2FudCB0byByZWFkIGRhdGEgZnJvbSBpdC4KKyAgICAvLyBSZWFkcyBzb21lIGJhc2ljIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbnRhaW5lciBvZiB0aGUKKyAgICAvLyBmcmFnbWVudCB0byBmaXggYW5kIHN0b3JlcyBpdCBpbiB2YXJpb3VzIGZpZWxkcyBvZgorICAgIC8vIGZyYWdUb0ZpeC4gIFRoaXMgaW5jbHVkZXM6CisgICAgLy8KKyAgICAvLyBvIGNvbnRhaW5lckhlYWRlciAtLSBUaGUgY29udGFpbiBoZWFkZXIgaXRzZWxmLgorICAgIC8vIG8gc2VjdGlvbkhlYWRlcnMgIC0tIFRoZSBhcnJheSBvZiBzZWN0aW9uIGhlYWRlcnMgKGluIGEgbmV3bHkgYWxsb2NhdGVkIHBvaW50ZXIgYmxvY2spLgorICAgIC8vIG8gbG9hZGVyU2VjdGlvbiAgIC0tIFRoZSBlbnRpcmUgbG9hZGVyIHNlY3Rpb24gKGluIGEgbmV3bHkgYWxsb2NhdGVkIHBvaW50ZXIgYmxvY2spLgorICAgIC8vCisgICAgLy8gQWxzbyBzZXRzIGRpc3Bvc2VTZWN0aW9uUG9pbnRlcnMgdG8gaW5kaWNhdGUgd2hldGhlcgorICAgIC8vIHRoZSBsYXN0IHR3byBwb2ludGVycyBzaG91bGQgYmUgZGlzcG9zZWQgb2YuCisgICAgLy8KKyAgICAvLyBGaW5hbGx5LCBpdCBsZWF2ZXMgdGhlIGNvbnRhaW5lciBmaWxlIG9wZW4gZm9yIGxhdGVyCisgICAgLy8gZm9sa3Mgd2hvIHdhbnQgdG8gcmVhZCBkYXRhIGZyb20gaXQuCiB7Ci0JT1NTdGF0dXMgCWVycjsKLQlVSW50MTYgCQlzZWN0aW9uSW5kZXg7Ci0JQm9vbGVhbiAJZm91bmQ7CisgICAgT1NTdGF0dXMgICAgICAgICAgICBlcnI7CisgICAgVUludDE2ICAgICAgICAgICAgICBzZWN0aW9uSW5kZXg7CisgICAgQm9vbGVhbiAgICAgICAgICAgICBmb3VuZDsKIAotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9jYXRvci5maWxlU3BlYyAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+Y29ubklEICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uID09IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyA9PSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+ZmlsZVJlZiA9PSAwKTsKLQkKLQlmcmFnVG9GaXgtPmRpc3Bvc2VTZWN0aW9uUG9pbnRlcnMgPSB0cnVlOwotCQotCS8vIE9wZW4gdXAgdGhlIGZpbGUsIHJlYWQgdGhlIGNvbnRhaW5lciBoZWFkLCB0aGVuIHJlYWQgaW4KLQkvLyBhbGwgdGhlIHNlY3Rpb24gaGVhZGVycywgdGhlbiBnbyBsb29raW5nIHRocm91Z2ggdGhlCi0JLy8gc2VjdGlvbiBoZWFkZXJzIGZvciB0aGUgbG9hZGVyIHNlY3Rpb24gKFBFRiBkZWZpbmVzCi0JLy8gdGhhdCB0aGVyZSBjYW4gYmUgb25seSBvbmUpLgotCQotCWVyciA9IEZTcE9wZW5ERihmcmFnVG9GaXgtPmxvY2F0b3IuZmlsZVNwZWMsIGZzUmRQZXJtLCAmZnJhZ1RvRml4LT5maWxlUmVmKTsKLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCWVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwKLQkJCQkJCQkJZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCwKLQkJCQkJCQkJc2l6ZW9mKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyKSwKLQkJCQkJCQkJJmZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyKTsKLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJaWYgKCAgIGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnRhZzEgIT0ga1BFRlRhZzEKLQkJCQl8fCBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcyICE9IGtQRUZUYWcyCi0JCQkJfHwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuYXJjaGl0ZWN0dXJlICE9IGtDb21waWxlZENGcmFnQXJjaAotCQkJCXx8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLmZvcm1hdFZlcnNpb24gIT0ga1BFRlZlcnNpb24pIHsKLQkJCQllcnIgPSBjZnJhZ0ZyYWdtZW50Rm9ybWF0RXJyOwotCQkJfQotCQl9Ci0JCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJCWZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnMgPSAoUEVGU2VjdGlvbkhlYWRlciAqKSBOZXdQdHIoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICogc2l6ZW9mKFBFRlNlY3Rpb25IZWFkZXIpKTsKLQkJCWVyciA9IE1lbUVycm9yKCk7Ci0JCX0KLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLAotCQkJCQkJCQkJZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCArIHNpemVvZihmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlciksCi0JCQkJCQkJCQlmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5zZWN0aW9uQ291bnQgKiBzaXplb2YoUEVGU2VjdGlvbkhlYWRlciksIAotCQkJCQkJCQkJZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyk7Ci0JCX0KLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJc2VjdGlvbkluZGV4ID0gMDsKLQkJCWZvdW5kID0gZmFsc2U7Ci0JCQl3aGlsZSAoIHNlY3Rpb25JbmRleCA8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCAmJiAhIGZvdW5kICkgewotCQkJCWZvdW5kID0gKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5zZWN0aW9uS2luZCA9PSBrUEVGTG9hZGVyU2VjdGlvbik7Ci0JCQkJaWYgKCAhIGZvdW5kICkgewotCQkJCQlzZWN0aW9uSW5kZXggKz0gMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGVyciA9PSBub0VyciAmJiAhIGZvdW5kKSB7Ci0JCQllcnIgPSBjZnJhZ05vU2VjdGlvbkVycjsKLQkJfQotCQkKLQkJLy8gTm93IHJlYWQgYWxsb2NhdGUgYSBwb2ludGVyIGJsb2NrIGFuZCByZWFkIHRoZSBsb2FkZXIgc2VjdGlvbiBpbnRvIGl0LgotCQkKLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uID0gKFBFRkxvYWRlckluZm9IZWFkZXIgKikgTmV3UHRyKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5jb250YWluZXJMZW5ndGgpOwotCQkJZXJyID0gTWVtRXJyb3IoKTsKLQkJfQotCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQllcnIgPSBGU1JlYWRBdE9mZnNldChmcmFnVG9GaXgtPmZpbGVSZWYsIAotCQkJCQkJCQkJZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCArIGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5jb250YWluZXJPZmZzZXQsCi0JCQkJCQkJCQlmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW3NlY3Rpb25JbmRleF0uY29udGFpbmVyTGVuZ3RoLCAKLQkJCQkJCQkJCWZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbik7Ci0JCX0JCQkJCi0JfQotCQotCS8vIE5vIGNsZWFuIHVwLiAgVGhlIGNsaWVudCBtdXN0IGluaXQgZnJhZ1RvRml4IHRvIHplcm9zIGFuZCB0aGVuCi0JLy8gY2xlYW4gdXAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIHJldHVybiBhbiBlcnJvci4KLQkJCi0JcmV0dXJuIGVycjsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXggIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmxvY2F0b3IuZmlsZVNwZWMgIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmNvbm5JRCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiA9PSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnMgPT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmZpbGVSZWYgPT0gMCk7CisKKyAgICBmcmFnVG9GaXgtPmRpc3Bvc2VTZWN0aW9uUG9pbnRlcnMgPSB0cnVlOworCisgICAgLy8gT3BlbiB1cCB0aGUgZmlsZSwgcmVhZCB0aGUgY29udGFpbmVyIGhlYWQsIHRoZW4gcmVhZCBpbgorICAgIC8vIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzLCB0aGVuIGdvIGxvb2tpbmcgdGhyb3VnaCB0aGUKKyAgICAvLyBzZWN0aW9uIGhlYWRlcnMgZm9yIHRoZSBsb2FkZXIgc2VjdGlvbiAoUEVGIGRlZmluZXMKKyAgICAvLyB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSkuCisKKyAgICBlcnIgPSBGU3BPcGVuREYoZnJhZ1RvRml4LT5sb2NhdG9yLmZpbGVTcGVjLCBmc1JkUGVybSwgJmZyYWdUb0ZpeC0+ZmlsZVJlZik7CisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICBlcnIgPSBGU1JlYWRBdE9mZnNldChmcmFnVG9GaXgtPmZpbGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlcik7CisgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgIGlmICggICBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcxICE9IGtQRUZUYWcxCisgICAgICAgICAgICAgICAgfHwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIudGFnMiAhPSBrUEVGVGFnMgorICAgICAgICAgICAgICAgIHx8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLmFyY2hpdGVjdHVyZSAhPSBrQ29tcGlsZWRDRnJhZ0FyY2gKKyAgICAgICAgICAgICAgICB8fCBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5mb3JtYXRWZXJzaW9uICE9IGtQRUZWZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgZXJyID0gY2ZyYWdGcmFnbWVudEZvcm1hdEVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzID0gKFBFRlNlY3Rpb25IZWFkZXIgKikgTmV3UHRyKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCAqIHNpemVvZihQRUZTZWN0aW9uSGVhZGVyKSk7CisgICAgICAgICAgICBlcnIgPSBNZW1FcnJvcigpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgIGVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQgKyBzaXplb2YoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICogc2l6ZW9mKFBFRlNlY3Rpb25IZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAgICAgc2VjdGlvbkluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAoIHNlY3Rpb25JbmRleCA8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCAmJiAhIGZvdW5kICkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5zZWN0aW9uS2luZCA9PSBrUEVGTG9hZGVyU2VjdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKCAhIGZvdW5kICkgeworICAgICAgICAgICAgICAgICAgICBzZWN0aW9uSW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSBub0VyciAmJiAhIGZvdW5kKSB7CisgICAgICAgICAgICBlcnIgPSBjZnJhZ05vU2VjdGlvbkVycjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyByZWFkIGFsbG9jYXRlIGEgcG9pbnRlciBibG9jayBhbmQgcmVhZCB0aGUgbG9hZGVyIHNlY3Rpb24gaW50byBpdC4KKworICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24gPSAoUEVGTG9hZGVySW5mb0hlYWRlciAqKSBOZXdQdHIoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLmNvbnRhaW5lckxlbmd0aCk7CisgICAgICAgICAgICBlcnIgPSBNZW1FcnJvcigpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgIGVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQgKyBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW3NlY3Rpb25JbmRleF0uY29udGFpbmVyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLmNvbnRhaW5lckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBObyBjbGVhbiB1cC4gIFRoZSBjbGllbnQgbXVzdCBpbml0IGZyYWdUb0ZpeCB0byB6ZXJvcyBhbmQgdGhlbgorICAgIC8vIGNsZWFuIHVwIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSByZXR1cm4gYW4gZXJyb3IuCisKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgVUludDMyIERlY29kZVZDb3VudFZhbHVlKGNvbnN0IFVJbnQ4ICpzdGFydCwgVUludDMyICpvdXRDb3VudCkKLQkvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgbGVuZ3RoIFBFRiB2YWx1ZSwgCi0JLy8gd29yayBvdXQgdGhlIHZhbHVlIChpbiAqb3V0Q291bnQpLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIAotCS8vIGNvbnN1bWVkIGJ5IHRoZSB2YWx1ZS4KKyAgICAvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgbGVuZ3RoIFBFRiB2YWx1ZSwKKyAgICAvLyB3b3JrIG91dCB0aGUgdmFsdWUgKGluICpvdXRDb3VudCkuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICAvLyBjb25zdW1lZCBieSB0aGUgdmFsdWUuCiB7Ci0JVUludDggKgkJCWJ5dGVQdHI7Ci0JVUludDgJCQlieXRlOwotCVVJbnQzMgkJCWNvdW50OwotCQotCWJ5dGVQdHIgPSAoVUludDggKilzdGFydDsKLQkKLQkvLyBDb2RlIHRha2VuIGZyb20gIlBFRkJpbmFyeUZvcm1hdC5oIi4KLQljb3VudCA9IDA7Ci0JZG8gewotCQlieXRlID0gKmJ5dGVQdHIrKzsKLQkJY291bnQgPSAoY291bnQgPDwga1BFRlBrRGF0YVZDb3VudFNoaWZ0KSB8IChieXRlICYga1BFRlBrRGF0YVZDb3VudE1hc2spOwotCX0gd2hpbGUgKChieXRlICYga1BFRlBrRGF0YVZDb3VudEVuZE1hc2spICE9IDApOwotCQotCSpvdXRDb3VudCA9IGNvdW50OwotCXJldHVybiBieXRlUHRyIC0gc3RhcnQ7CisgICAgVUludDggKiAgICAgICAgICAgICAgICAgICAgIGJ5dGVQdHI7CisgICAgVUludDggICAgICAgICAgICAgICAgICAgICAgIGJ5dGU7CisgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIGNvdW50OworCisgICAgYnl0ZVB0ciA9IChVSW50OCAqKXN0YXJ0OworCisgICAgLy8gQ29kZSB0YWtlbiBmcm9tICJQRUZCaW5hcnlGb3JtYXQuaCIuCisgICAgY291bnQgPSAwOworICAgIGRvIHsKKyAgICAgICAgYnl0ZSA9ICpieXRlUHRyKys7CisgICAgICAgIGNvdW50ID0gKGNvdW50IDw8IGtQRUZQa0RhdGFWQ291bnRTaGlmdCkgfCAoYnl0ZSAmIGtQRUZQa0RhdGFWQ291bnRNYXNrKTsKKyAgICB9IHdoaWxlICgoYnl0ZSAmIGtQRUZQa0RhdGFWQ291bnRFbmRNYXNrKSAhPSAwKTsKKworICAgICpvdXRDb3VudCA9IGNvdW50OworICAgIHJldHVybiBieXRlUHRyIC0gc3RhcnQ7CiB9CiAKIHN0YXRpYyBVSW50MzIgRGVjb2RlSW5zdHJDb3VudFZhbHVlKGNvbnN0IFVJbnQ4ICppbk9wU3RhcnQsIFVJbnQzMiAqb3V0Q291bnQpCi0JLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhbiBvcGNvZGUgKGluT3BTdGFydCksIHdvcmsgb3V0IHRoZSAKLQkvLyBjb3VudCBhcmd1bWVudCBmb3IgdGhhdCBvcGNvZGUgKCpvdXRDb3VudCkuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgCi0JLy8gYnl0ZXMgY29uc3VtZWQgYnkgdGhlIG9wY29kZSBhbmQgY291bnQgY29tYmluYXRpb24uCisgICAgLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhbiBvcGNvZGUgKGluT3BTdGFydCksIHdvcmsgb3V0IHRoZQorICAgIC8vIGNvdW50IGFyZ3VtZW50IGZvciB0aGF0IG9wY29kZSAoKm91dENvdW50KS4gIFJldHVybnMgdGhlIG51bWJlciBvZgorICAgIC8vIGJ5dGVzIGNvbnN1bWVkIGJ5IHRoZSBvcGNvZGUgYW5kIGNvdW50IGNvbWJpbmF0aW9uLgogewotCU1vcmVBc3NlcnRRKGluT3BTdGFydCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKG91dENvdW50ICAhPSBuaWwpOwotCQotCWlmIChQRUZQa0RhdGFDb3VudDUoKmluT3BTdGFydCkgIT0gMCkKLQl7Ci0JCS8vIFNpbXBsZSBjYXNlLCBjb3VudCBlbmNvZGVkIGluIG9wY29kZS4KLQkJKm91dENvdW50ID0gUEVGUGtEYXRhQ291bnQ1KCppbk9wU3RhcnQpOwotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gVmFyaWFibGUtbGVuZ3RoIGNhc2UuCi0JCXJldHVybiAxICsgRGVjb2RlVkNvdW50VmFsdWUoaW5PcFN0YXJ0ICsgMSwgb3V0Q291bnQpOwotCX0KKyAgICBNb3JlQXNzZXJ0UShpbk9wU3RhcnQgIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShvdXRDb3VudCAgIT0gbmlsKTsKKworICAgIGlmIChQRUZQa0RhdGFDb3VudDUoKmluT3BTdGFydCkgIT0gMCkKKyAgICB7CisgICAgICAgIC8vIFNpbXBsZSBjYXNlLCBjb3VudCBlbmNvZGVkIGluIG9wY29kZS4KKyAgICAgICAgKm91dENvdW50ID0gUEVGUGtEYXRhQ291bnQ1KCppbk9wU3RhcnQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gVmFyaWFibGUtbGVuZ3RoIGNhc2UuCisgICAgICAgIHJldHVybiAxICsgRGVjb2RlVkNvdW50VmFsdWUoaW5PcFN0YXJ0ICsgMSwgb3V0Q291bnQpOworICAgIH0KIH0KIAogc3RhdGljIE9TU3RhdHVzIFVucGFja1BFRkRhdGFTZWN0aW9uKGNvbnN0IFVJbnQ4ICogY29uc3QgcGFja2VkRGF0YSwgICBVSW50MzIgcGFja2VkU2l6ZSwKLQkJCQkJCQkJICAgICAgICAgICBVSW50OCAqIGNvbnN0IHVucGFja2VkRGF0YSwgVUludDMyIHVucGFja2VkU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQ4ICogY29uc3QgdW5wYWNrZWREYXRhLCBVSW50MzIgdW5wYWNrZWRTaXplKQogewotCU9TRXJyCQkJZXJyOwotCVVJbnQzMgkJCW9mZnNldDsKLQlVSW50OAkJCW9wQ29kZTsKLQlVSW50OCAqCQkJdW5wYWNrQ3Vyc29yOwotCQotCU1vcmVBc3NlcnRRKHBhY2tlZERhdGEgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0USh1bnBhY2tlZERhdGEgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0USh1bnBhY2tlZFNpemUgPj0gcGFja2VkU2l6ZSk7CisgICAgT1NFcnIgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKyAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OworICAgIFVJbnQ4ICAgICAgICAgICAgICAgICAgICAgICBvcENvZGU7CisgICAgVUludDggKiAgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvcjsKIAotCS8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0cyBhc3N1bWUgdGhhdCB0aGUgY2xpZW50IGFsbG9jYXRlZCB0aGUgbWVtb3J5IHdpdGggTmV3UHRyLCAKLQkvLyB3aGljaCBtYXkgbm90IGFsd2F5cyBiZSB0cnVlLiAgSG93ZXZlciwgdGhlIGFzc2VydHMnIHZhbHVlIGluIHByZXZlbnRpbmcgYWNjaWRlbnRhbCAKLQkvLyBtZW1vcnkgYmxvY2sgb3ZlcnJ1bnMgb3V0d2VpZ2hzIHRoZSBwb3NzaWJsZSBtYWludGVuYW5jZSBlZmZvcnQuCi0JCi0JTW9yZUFzc2VydFEoIHBhY2tlZFNpemUgICA9PSBHZXRQdHJTaXplKCAoUHRyKSBwYWNrZWREYXRhICApICk7Ci0JTW9yZUFzc2VydFEoIHVucGFja2VkU2l6ZSA9PSBHZXRQdHJTaXplKCAoUHRyKSB1bnBhY2tlZERhdGEpICk7Ci0JCi0JZXJyICAgICAgICAgID0gbm9FcnI7Ci0Jb2Zmc2V0ICAgICAgID0gMDsKLQl1bnBhY2tDdXJzb3IgPSB1bnBhY2tlZERhdGE7Ci0Jd2hpbGUgKG9mZnNldCA8IHBhY2tlZFNpemUpIHsKLQkJTW9yZUFzc2VydFEodW5wYWNrQ3Vyc29yIDwgJnVucGFja2VkRGF0YVt1bnBhY2tlZFNpemVdKTsKLQkJCi0JCW9wQ29kZSA9IHBhY2tlZERhdGFbb2Zmc2V0XTsKLQkJCi0JCXN3aXRjaCAoUEVGUGtEYXRhT3Bjb2RlKG9wQ29kZSkpIHsKLQkJCWNhc2Uga1BFRlBrRGF0YVplcm86Ci0JCQkJewotCQkJCQlVSW50MzIJY291bnQ7Ci0JCQkJCQotCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjb3VudCk7Ci0JCQkJCQotCQkJCQlNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY291bnQpOwotCQkJCQl1bnBhY2tDdXJzb3IgKz0gY291bnQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCi0JCQljYXNlIGtQRUZQa0RhdGFCbG9jazoKLQkJCQl7Ci0JCQkJCVVJbnQzMglibG9ja1NpemU7Ci0JCQkJCQotCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOwotCQkJCQkKLQkJCQkJQmxvY2tNb3ZlRGF0YSgmcGFja2VkRGF0YVtvZmZzZXRdLCB1bnBhY2tDdXJzb3IsIGJsb2NrU2l6ZSk7Ci0JCQkJCXVucGFja0N1cnNvciArPSBibG9ja1NpemU7Ci0JCQkJCW9mZnNldCArPSBibG9ja1NpemU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCi0JCQljYXNlIGtQRUZQa0RhdGFSZXBlYXQ6Ci0JCQkJewotCQkJCQlVSW50MzIJYmxvY2tTaXplOwotCQkJCQlVSW50MzIJcmVwZWF0Q291bnQ7Ci0JCQkJCVVJbnQzMiAgbG9vcENvdW50ZXI7Ci0JCQkJCQotCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOwotCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKLQkJCQkJcmVwZWF0Q291bnQgKz0gMTsJLy8gc3RvcmVkIHZhbHVlIGlzIChyZXBlYXRDb3VudCAtIDEpCi0JCQkJCQotCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgewotCQkJCQkJQmxvY2tNb3ZlRGF0YSgmcGFja2VkRGF0YVtvZmZzZXRdLCB1bnBhY2tDdXJzb3IsIGJsb2NrU2l6ZSk7Ci0JCQkJCQl1bnBhY2tDdXJzb3IgKz0gYmxvY2tTaXplOwotCQkJCQl9Ci0JCQkJCW9mZnNldCArPSBibG9ja1NpemU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCi0JCQljYXNlIGtQRUZQa0RhdGFSZXBlYXRCbG9jazoKLQkJCQl7Ci0JCQkJCVVJbnQzMgljb21tb25TaXplOwotCQkJCQlVSW50MzIJY3VzdG9tU2l6ZTsKLQkJCQkJVUludDMyCXJlcGVhdENvdW50OwotCQkJCQljb25zdCBVSW50OCAqY29tbW9uRGF0YTsKLQkJCQkJY29uc3QgVUludDggKmN1c3RvbURhdGE7Ci0JCQkJCVVJbnQzMiBsb29wQ291bnRlcjsKLQkJCQkJCi0JCQkJCW9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvbW1vblNpemUpOwotCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmN1c3RvbVNpemUpOwotCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKLQkJCQkJCi0JCQkJCWNvbW1vbkRhdGEgPSAmcGFja2VkRGF0YVtvZmZzZXRdOwotCQkJCQljdXN0b21EYXRhID0gJnBhY2tlZERhdGFbb2Zmc2V0ICsgY29tbW9uU2l6ZV07Ci0JCQkJCQotCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgewotCQkJCQkJQmxvY2tNb3ZlRGF0YShjb21tb25EYXRhLCB1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOwotCQkJCQkJdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7Ci0JCQkJCQlCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7Ci0JCQkJCQl1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJCWN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJfQotCQkJCQlCbG9ja01vdmVEYXRhKGNvbW1vbkRhdGEsIHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7Ci0JCQkJCXVucGFja0N1cnNvciArPSBjb21tb25TaXplOwotCQkJCQlvZmZzZXQgKz0gKHJlcGVhdENvdW50ICogKGNvbW1vblNpemUgKyBjdXN0b21TaXplKSkgKyBjb21tb25TaXplOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQotCQkJY2FzZSBrUEVGUGtEYXRhUmVwZWF0WmVybzoKLQkJCQl7Ci0JCQkJCVVJbnQzMgljb21tb25TaXplOwotCQkJCQlVSW50MzIJY3VzdG9tU2l6ZTsKLQkJCQkJVUludDMyCXJlcGVhdENvdW50OwotCQkJCQljb25zdCBVSW50OCAqY3VzdG9tRGF0YTsKLQkJCQkJVUludDMyIGxvb3BDb3VudGVyOwotCQkJCQkKLQkJCQkJb2Zmc2V0ICs9IERlY29kZUluc3RyQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY29tbW9uU2l6ZSk7Ci0JCQkJCW9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY3VzdG9tU2l6ZSk7Ci0JCQkJCW9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmcmVwZWF0Q291bnQpOwotCQkJCQkKLQkJCQkJY3VzdG9tRGF0YSA9ICZwYWNrZWREYXRhW29mZnNldF07Ci0JCQkJCQotCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgewotCQkJCQkJTW9yZUJsb2NrWmVybyh1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOwotCQkJCQkJdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7Ci0JCQkJCQlCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7Ci0JCQkJCQl1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJCWN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJfQotCQkJCQlNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7Ci0JCQkJCXVucGFja0N1cnNvciArPSBjb21tb25TaXplOwotCQkJCQlvZmZzZXQgKz0gcmVwZWF0Q291bnQgKiBjdXN0b21TaXplOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQotCQkJZGVmYXVsdDoKLQkJCQkjaWYgTU9SRV9ERUJVRwotCQkJCQlEZWJ1Z1N0cigiXHBVbnBhY2tQRUZEYXRhU2VjdGlvbjogVW5leHBlY3RlZCBkYXRhIG9wY29kZSIpOwotCQkJCSNlbmRpZgotCQkJCWVyciA9IGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyOwotCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCisgICAgTW9yZUFzc2VydFEocGFja2VkRGF0YSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHVucGFja2VkRGF0YSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHVucGFja2VkU2l6ZSA+PSBwYWNrZWRTaXplKTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0cyBhc3N1bWUgdGhhdCB0aGUgY2xpZW50IGFsbG9jYXRlZCB0aGUgbWVtb3J5IHdpdGggTmV3UHRyLAorICAgIC8vIHdoaWNoIG1heSBub3QgYWx3YXlzIGJlIHRydWUuICBIb3dldmVyLCB0aGUgYXNzZXJ0cycgdmFsdWUgaW4gcHJldmVudGluZyBhY2NpZGVudGFsCisgICAgLy8gbWVtb3J5IGJsb2NrIG92ZXJydW5zIG91dHdlaWdocyB0aGUgcG9zc2libGUgbWFpbnRlbmFuY2UgZWZmb3J0LgorCisgICAgTW9yZUFzc2VydFEoIHBhY2tlZFNpemUgICA9PSBHZXRQdHJTaXplKCAoUHRyKSBwYWNrZWREYXRhICApICk7CisgICAgTW9yZUFzc2VydFEoIHVucGFja2VkU2l6ZSA9PSBHZXRQdHJTaXplKCAoUHRyKSB1bnBhY2tlZERhdGEpICk7CisKKyAgICBlcnIgICAgICAgICAgPSBub0VycjsKKyAgICBvZmZzZXQgICAgICAgPSAwOworICAgIHVucGFja0N1cnNvciA9IHVucGFja2VkRGF0YTsKKyAgICB3aGlsZSAob2Zmc2V0IDwgcGFja2VkU2l6ZSkgeworICAgICAgICBNb3JlQXNzZXJ0USh1bnBhY2tDdXJzb3IgPCAmdW5wYWNrZWREYXRhW3VucGFja2VkU2l6ZV0pOworCisgICAgICAgIG9wQ29kZSA9IHBhY2tlZERhdGFbb2Zmc2V0XTsKKworICAgICAgICBzd2l0Y2ggKFBFRlBrRGF0YU9wY29kZShvcENvZGUpKSB7CisgICAgICAgICAgICBjYXNlIGtQRUZQa0RhdGFaZXJvOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIGNvdW50OworCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvdW50KTsKKworICAgICAgICAgICAgICAgICAgICBNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY291bnQpOworICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGtQRUZQa0RhdGFCbG9jazoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBibG9ja1NpemU7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IERlY29kZUluc3RyQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmYmxvY2tTaXplKTsKKworICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKCZwYWNrZWREYXRhW29mZnNldF0sIHVucGFja0N1cnNvciwgYmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yICs9IGJsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga1BFRlBrRGF0YVJlcGVhdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBibG9ja1NpemU7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICByZXBlYXRDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICBsb29wQ291bnRlcjsKKworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgcmVwZWF0Q291bnQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZWQgdmFsdWUgaXMgKHJlcGVhdENvdW50IC0gMSkKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tNb3ZlRGF0YSgmcGFja2VkRGF0YVtvZmZzZXRdLCB1bnBhY2tDdXJzb3IsIGJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gYmxvY2tTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBibG9ja1NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGtQRUZQa0RhdGFSZXBlYXRCbG9jazoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdENvdW50OworICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50OCAqY29tbW9uRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUludDggKmN1c3RvbURhdGE7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBsb29wQ291bnRlcjsKKworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjb21tb25TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IERlY29kZVZDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjdXN0b21TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IERlY29kZVZDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZyZXBlYXRDb3VudCk7CisKKyAgICAgICAgICAgICAgICAgICAgY29tbW9uRGF0YSA9ICZwYWNrZWREYXRhW29mZnNldF07CisgICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgPSAmcGFja2VkRGF0YVtvZmZzZXQgKyBjb21tb25TaXplXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tNb3ZlRGF0YShjb21tb25EYXRhLCB1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKGNvbW1vbkRhdGEsIHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvciArPSBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKHJlcGVhdENvdW50ICogKGNvbW1vblNpemUgKyBjdXN0b21TaXplKSkgKyBjb21tb25TaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBrUEVGUGtEYXRhUmVwZWF0WmVybzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdENvdW50OworICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50OCAqY3VzdG9tRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyIGxvb3BDb3VudGVyOworCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvbW1vblNpemUpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmN1c3RvbVNpemUpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKKworICAgICAgICAgICAgICAgICAgICBjdXN0b21EYXRhID0gJnBhY2tlZERhdGFbb2Zmc2V0XTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgTW9yZUJsb2NrWmVybyh1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvciArPSBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gcmVwZWF0Q291bnQgKiBjdXN0b21TaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgICAgICAgICBEZWJ1Z1N0cigiXHBVbnBhY2tQRUZEYXRhU2VjdGlvbjogVW5leHBlY3RlZCBkYXRhIG9wY29kZSIpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGVyciA9IGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyOworICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKIGxlYXZlTm93OgotCXJldHVybiBlcnI7CisgICAgcmV0dXJuIGVycjsKIH0KIAotLyoJU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyBSYXRpb25hbGUKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCU9LLCBoZXJlJ3Mgd2hlcmUgdGhpbmdzIGdldCB3ZWlyZC4gIEluIG9yZGVyIHRvIHJ1biB0aGUgcmVsb2NhdGlvbgotCWVuZ2luZSwgSSBuZWVkIHRvIGJlIGFibGUgdG8gZmluZCB0aGUgYmFzZSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZAotCXNlY3Rpb24gb2YgdGhlIGZyYWdtZW50IHdlJ3JlIGZpeGluZyB1cCBnaXZlbiBvbmx5IGl0cyBzZWN0aW9uIG51bWJlci4KLQlUaGlzIGlzbid0IGhhcmQgZm9yIENGTSB0byBkbyBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IGluc3RhbnRpYXRlZCB0aGUKLQlzZWN0aW9ucyBpbiB0aGUgZmlyc3QgcGxhY2UuICBJdCdzIHN1cnByaXNpbmdseSBkaWZmaWN1bHQgdG8gZG8gaWYKLQl5b3UncmUgbm90IENGTS4gIFtBbmQgeW91IGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBwcml2YXRlIENGTSBBUGlzIGZvciAKLQlkb2luZyBpdC5dCi0JCi0JW0FsYW4gTGlsbGljaCBpcyBnb2luZyB0byBraWxsIG1lIHdoZW4gaGUgcmVhZHMgdGhpcyEgIEkgc2hvdWxkIHBvaW50IG91dAotCSB0aGF0IFRWZWN0b3IncyBkb24ndCBoYXZlIHRvIGNvbnRhaW4gdHdvIHdvcmRzLCB0aGV5IGNhbiBiZSBsb25nZXIsCi0JIGFuZCB0aGF0IHRoZSBzZWNvbmQgd29yZCBpc24ndCBuZWNlc3NhcmlseSBhIFRPQyBwb2ludGVyLCBpdCdzCi0JIGp1c3QgdGhhdCB0aGUgY2FsbGluZyBjb252ZW50aW9ucyByZXF1aXJlIHRoYXQgaXQgYmUgcHV0IGluIHRoZQotCSBUT0MgcmVnaXN0ZXIgd2hlbiB0aGUgY29kZSBpcyBjYWxsZWQuCi0JIAotCSBGdXJ0aGVybW9yZSwgdGhlIGNvZGUgc2VjdGlvbiBpc24ndCBhbHdheXMgc2VjdGlvbiAwLCBhbmQgdGhlIGRhdGEKLQkgc2VjdGlvbiBpc24ndCBhbHdheXMgc2VjdGlvbiAxLCBhbmQgdGhlcmUgY2FuIGJlIHplcm8gdG8gbWFueSBzZWN0aW9ucwotCSBvZiBlYWNoIHR5cGUuCi0JIAotCSBCdXQgdGhlc2UgbmljZXRpZXMgYXJlIGJlc2lkZXMgdGhlIHBvaW50OiBJJ20gZG9pbmcgc29tZXRoaW5nIHRyaWNreSAKLQkgYmVjYXVzZSBJIGRvbid0IGhhdmUgYSBuaWNlIEFQSSBmb3IgZ2V0dGluZyBzZWN0aW9uIGJhc2UgYWRkcmVzc2VzLiAgCi0JIElmIEkgaGFkIGEgbmljZSBBUEkgZm9yIGRvaW5nIHRoYXQsIG5vbmUgb2YgdGhpcyBjb2RlIHdvdWxkIGV4aXN0LgotCV0KKy8qICAgICAgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyBSYXRpb25hbGUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0JVGhlIHRlY2huaXF1ZSBpcyB2ZXJ5IHNuZWFreSAodGhhbmtzIHRvIEVyaWMgR3JhbnQpLiAgVGhlIGZyYWdtZW50IHRvIAotCWZpeCBuZWNlc3NhcmlseSBoYXMgYSBDRk0gaW5pdCByb3V0aW5lIChiZWNhdXNlIGl0IG5lZWRzIHRoYXQgcm91dGluZSAKLQlpbiBvcmRlciB0byBjYXB0dXJlIHRoZSBmcmFnbWVudCBsb2NhdGlvbiBhbmQgY29ubmVjdGlvbiBJRCkuICBUaHVzIHRoZSAKLQlmcmFnbWVudCB0byBmaXggbXVzdCBoYXZlIGEgVFZlY3RvciBpbiBpdHMgZGF0YSBzZWN0aW9uLiAgVFZlY3RvcnMgYXJlIAotCWludGVyZXN0aW5nIGJlY2F1c2UgdGhleSdyZSBtYWRlIHVwIG9mIHR3byB3b3Jkcy4gIFRoZSBmaXJzdCBpcyBhIHBvaW50ZXIgCi0JdG8gdGhlIGNvZGUgdGhhdCBpbXBsZW1lbnRzIHRoZSByb3V0aW5lOyB0aGUgc2Vjb25kIGlzIGEgcG9pbnRlciB0byB0aGUgVE9DCi0JZm9yIHRoZSBmcmFnbWVudCB0aGF0J3MgZXhwb3J0aW5nIHRoZSBUVmVjdG9yLiAgSG93IFRWZWN0b3JzIGFyZQotCWNyZWF0ZWQgaXMgaW50ZXJlc3RpbmcgdG9vLiAgT24gZGlzaywgYSBUVmVjdG9yIGNvbnNpc3RzIG9mIHR3byB3b3JkcywKLQl0aGUgZmlyc3QgYmVpbmcgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY29kZSBzZWN0aW9uIHRvIHRoZQotCXJvdXRpbmUsIHRoZSBzZWNvbmQgYmVpbmcgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWN0aW9uCi0JdG8gdGhlIFRPQyBiYXNlLiAgV2hlbiBDRk0gcHJlcGFyZXMgYSBUVmVjdG9yLCBpdCBhcHBsaWVzIHRoZSBmb2xsb3dpbmcKLQl0cmFuc2Zvcm06Ci0JCi0JCXR2ZWN0b3IuY29kZVB0ciA9IHR2ZWN0b3IuY29kZU9mZnNldCArIGJhc2Ugb2YgY29kZSBzZWN0aW9uCi0JCXR2ZWN0b3IudG9jUHRyICA9IHR2ZWN0b3IudG9jT2Zmc2V0ICArIGJhc2Ugb2YgZGF0YSBzZWN0aW9uCi0JCQotCU5vdywgeW91IGNhbiByZXZlcnNlIHRoZXNlIHF1ZXN0aW9ucyB0byBtYWtlIHRoZW06Ci0JCi0JCWJhc2Ugb2YgY29kZSBzZWN0aW9uID0gdHZlY3Rvci5jb2RlUHRyIC0gdHZlY3Rvci5jb2RlT2Zmc2V0Ci0JCWJhc2Ugb2YgZGF0YSBzZWN0aW9uID0gdHZlY3Rvci5kYXRhUHRyIC0gdHZlY3Rvci5kYXRhT2Zmc2V0Ci0JCi0JU28gaWYgeW91IGNhbiBmaW5kIHRoZSByZWxvY2F0ZWQgY29udGVudHMgb2YgdGhlIFRWZWN0b3IgYW5kCi0JZmluZCB0aGUgb3JpZ2luYWwgb2Zmc2V0cyB0aGF0IG1hZGUgdXAgdGhlIFRWZWN0b3IsIHlvdSBjYW4gdGhlbgotCWNhbGN1bGF0ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIGJvdGggdGhlIGNvZGUgYW5kIGRhdGEgc2VjdGlvbnMuCi0JCi0JRmluZGluZyB0aGUgcmVsb2NhdGVkIGNvbnRlbnRzIG9mIHRoZSBUVmVjdG9yIGlzIGVhc3k7IEkgc2ltcGx5IAotCXJlcXVpcmUgdGhlIGNsaWVudCB0byBwYXNzIGluIGEgcG9pbnRlciB0byBpdHMgaW5pdCByb3V0aW5lLiAKLQlBIHJvdXRpbmUgcG9pbnRlciBpcyBhIFRWZWN0b3IgcG9pbnRlciwgc28geW91IGNhbiBqdXN0IGNhc3QgaXQgCi0JYW5kIGV4dHJhY3QgdGhlIHBhaXIgb2Ygd29yZHMuCisgICAgT0ssIGhlcmUncyB3aGVyZSB0aGluZ3MgZ2V0IHdlaXJkLiAgSW4gb3JkZXIgdG8gcnVuIHRoZSByZWxvY2F0aW9uCisgICAgZW5naW5lLCBJIG5lZWQgdG8gYmUgYWJsZSB0byBmaW5kIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkCisgICAgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQgd2UncmUgZml4aW5nIHVwIGdpdmVuIG9ubHkgaXRzIHNlY3Rpb24gbnVtYmVyLgorICAgIFRoaXMgaXNuJ3QgaGFyZCBmb3IgQ0ZNIHRvIGRvIGJlY2F1c2UgaXQncyB0aGUgb25lIHRoYXQgaW5zdGFudGlhdGVkIHRoZQorICAgIHNlY3Rpb25zIGluIHRoZSBmaXJzdCBwbGFjZS4gIEl0J3Mgc3VycHJpc2luZ2x5IGRpZmZpY3VsdCB0byBkbyBpZgorICAgIHlvdSdyZSBub3QgQ0ZNLiAgW0FuZCB5b3UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHByaXZhdGUgQ0ZNIEFQaXMgZm9yCisgICAgZG9pbmcgaXQuXQogCi0JRmluZGluZyB0aGUgb3JpZ2luYWwgb2Zmc2V0cyBpcyBhIHRyaWNraWVyLiAgTXkgdGVjaG5pcXVlIGlzIHRvCi0JbG9vayB1cCB0aGUgaW5pdCByb3V0aW5lIGluIHRoZSBmcmFnbWVudCdzIGxvYWRlciBpbmZvIGhlYWRlci4gIFRoaXMKLQl5aWVsZHMgdGhlIHNlY3Rpb24gbnVtYmVyIGFuZCBvZmZzZXQgd2hlcmUgdGhlIGluaXQgcm91dGluZSdzIHVucmVsb2NhdGVkIAotCVRWZWN0b3IgZXhpc3RzLiAgT25jZSBJIGhhdmUgdGhhdCwgSSBjYW4ganVzdCByZWFkIHRoZSB1bnJlbG9jYXRlZCBUVmVjdG9yCi0Jb3V0IG9mIHRoZSBmaWxlIGFuZCBleHRyYWN0IHRoZSBvZmZzZXRzLgorICAgIFtBbGFuIExpbGxpY2ggaXMgZ29pbmcgdG8ga2lsbCBtZSB3aGVuIGhlIHJlYWRzIHRoaXMhICBJIHNob3VsZCBwb2ludCBvdXQKKyAgICAgdGhhdCBUVmVjdG9yJ3MgZG9uJ3QgaGF2ZSB0byBjb250YWluIHR3byB3b3JkcywgdGhleSBjYW4gYmUgbG9uZ2VyLAorICAgICBhbmQgdGhhdCB0aGUgc2Vjb25kIHdvcmQgaXNuJ3QgbmVjZXNzYXJpbHkgYSBUT0MgcG9pbnRlciwgaXQncworICAgICBqdXN0IHRoYXQgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgcmVxdWlyZSB0aGF0IGl0IGJlIHB1dCBpbiB0aGUKKyAgICAgVE9DIHJlZ2lzdGVyIHdoZW4gdGhlIGNvZGUgaXMgY2FsbGVkLgorCisgICAgIEZ1cnRoZXJtb3JlLCB0aGUgY29kZSBzZWN0aW9uIGlzbid0IGFsd2F5cyBzZWN0aW9uIDAsIGFuZCB0aGUgZGF0YQorICAgICBzZWN0aW9uIGlzbid0IGFsd2F5cyBzZWN0aW9uIDEsIGFuZCB0aGVyZSBjYW4gYmUgemVybyB0byBtYW55IHNlY3Rpb25zCisgICAgIG9mIGVhY2ggdHlwZS4KKworICAgICBCdXQgdGhlc2UgbmljZXRpZXMgYXJlIGJlc2lkZXMgdGhlIHBvaW50OiBJJ20gZG9pbmcgc29tZXRoaW5nIHRyaWNreQorICAgICBiZWNhdXNlIEkgZG9uJ3QgaGF2ZSBhIG5pY2UgQVBJIGZvciBnZXR0aW5nIHNlY3Rpb24gYmFzZSBhZGRyZXNzZXMuCisgICAgIElmIEkgaGFkIGEgbmljZSBBUEkgZm9yIGRvaW5nIHRoYXQsIG5vbmUgb2YgdGhpcyBjb2RlIHdvdWxkIGV4aXN0LgorICAgIF0KKworICAgIFRoZSB0ZWNobmlxdWUgaXMgdmVyeSBzbmVha3kgKHRoYW5rcyB0byBFcmljIEdyYW50KS4gIFRoZSBmcmFnbWVudCB0bworICAgIGZpeCBuZWNlc3NhcmlseSBoYXMgYSBDRk0gaW5pdCByb3V0aW5lIChiZWNhdXNlIGl0IG5lZWRzIHRoYXQgcm91dGluZQorICAgIGluIG9yZGVyIHRvIGNhcHR1cmUgdGhlIGZyYWdtZW50IGxvY2F0aW9uIGFuZCBjb25uZWN0aW9uIElEKS4gIFRodXMgdGhlCisgICAgZnJhZ21lbnQgdG8gZml4IG11c3QgaGF2ZSBhIFRWZWN0b3IgaW4gaXRzIGRhdGEgc2VjdGlvbi4gIFRWZWN0b3JzIGFyZQorICAgIGludGVyZXN0aW5nIGJlY2F1c2UgdGhleSdyZSBtYWRlIHVwIG9mIHR3byB3b3Jkcy4gIFRoZSBmaXJzdCBpcyBhIHBvaW50ZXIKKyAgICB0byB0aGUgY29kZSB0aGF0IGltcGxlbWVudHMgdGhlIHJvdXRpbmU7IHRoZSBzZWNvbmQgaXMgYSBwb2ludGVyIHRvIHRoZSBUT0MKKyAgICBmb3IgdGhlIGZyYWdtZW50IHRoYXQncyBleHBvcnRpbmcgdGhlIFRWZWN0b3IuICBIb3cgVFZlY3RvcnMgYXJlCisgICAgY3JlYXRlZCBpcyBpbnRlcmVzdGluZyB0b28uICBPbiBkaXNrLCBhIFRWZWN0b3IgY29uc2lzdHMgb2YgdHdvIHdvcmRzLAorICAgIHRoZSBmaXJzdCBiZWluZyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjb2RlIHNlY3Rpb24gdG8gdGhlCisgICAgcm91dGluZSwgdGhlIHNlY29uZCBiZWluZyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlY3Rpb24KKyAgICB0byB0aGUgVE9DIGJhc2UuICBXaGVuIENGTSBwcmVwYXJlcyBhIFRWZWN0b3IsIGl0IGFwcGxpZXMgdGhlIGZvbGxvd2luZworICAgIHRyYW5zZm9ybToKKworICAgICAgICB0dmVjdG9yLmNvZGVQdHIgPSB0dmVjdG9yLmNvZGVPZmZzZXQgKyBiYXNlIG9mIGNvZGUgc2VjdGlvbgorICAgICAgICB0dmVjdG9yLnRvY1B0ciAgPSB0dmVjdG9yLnRvY09mZnNldCAgKyBiYXNlIG9mIGRhdGEgc2VjdGlvbgorCisgICAgTm93LCB5b3UgY2FuIHJldmVyc2UgdGhlc2UgcXVlc3Rpb25zIHRvIG1ha2UgdGhlbToKKworICAgICAgICBiYXNlIG9mIGNvZGUgc2VjdGlvbiA9IHR2ZWN0b3IuY29kZVB0ciAtIHR2ZWN0b3IuY29kZU9mZnNldAorICAgICAgICBiYXNlIG9mIGRhdGEgc2VjdGlvbiA9IHR2ZWN0b3IuZGF0YVB0ciAtIHR2ZWN0b3IuZGF0YU9mZnNldAorCisgICAgU28gaWYgeW91IGNhbiBmaW5kIHRoZSByZWxvY2F0ZWQgY29udGVudHMgb2YgdGhlIFRWZWN0b3IgYW5kCisgICAgZmluZCB0aGUgb3JpZ2luYWwgb2Zmc2V0cyB0aGF0IG1hZGUgdXAgdGhlIFRWZWN0b3IsIHlvdSBjYW4gdGhlbgorICAgIGNhbGN1bGF0ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIGJvdGggdGhlIGNvZGUgYW5kIGRhdGEgc2VjdGlvbnMuCisKKyAgICBGaW5kaW5nIHRoZSByZWxvY2F0ZWQgY29udGVudHMgb2YgdGhlIFRWZWN0b3IgaXMgZWFzeTsgSSBzaW1wbHkKKyAgICByZXF1aXJlIHRoZSBjbGllbnQgdG8gcGFzcyBpbiBhIHBvaW50ZXIgdG8gaXRzIGluaXQgcm91dGluZS4KKyAgICBBIHJvdXRpbmUgcG9pbnRlciBpcyBhIFRWZWN0b3IgcG9pbnRlciwgc28geW91IGNhbiBqdXN0IGNhc3QgaXQKKyAgICBhbmQgZXh0cmFjdCB0aGUgcGFpciBvZiB3b3Jkcy4KKworICAgIEZpbmRpbmcgdGhlIG9yaWdpbmFsIG9mZnNldHMgaXMgYSB0cmlja2llci4gIE15IHRlY2huaXF1ZSBpcyB0bworICAgIGxvb2sgdXAgdGhlIGluaXQgcm91dGluZSBpbiB0aGUgZnJhZ21lbnQncyBsb2FkZXIgaW5mbyBoZWFkZXIuICBUaGlzCisgICAgeWllbGRzIHRoZSBzZWN0aW9uIG51bWJlciBhbmQgb2Zmc2V0IHdoZXJlIHRoZSBpbml0IHJvdXRpbmUncyB1bnJlbG9jYXRlZAorICAgIFRWZWN0b3IgZXhpc3RzLiAgT25jZSBJIGhhdmUgdGhhdCwgSSBjYW4ganVzdCByZWFkIHRoZSB1bnJlbG9jYXRlZCBUVmVjdG9yCisgICAgb3V0IG9mIHRoZSBmaWxlIGFuZCBleHRyYWN0IHRoZSBvZmZzZXRzLgogKi8KIAogc3RydWN0IFRWZWN0b3IgewotCXZvaWQgKmNvZGVQdHI7Ci0Jdm9pZCAqdG9jUHRyOworICAgIHZvaWQgKmNvZGVQdHI7CisgICAgdm9pZCAqdG9jUHRyOwogfTsKIHR5cGVkZWYgc3RydWN0IFRWZWN0b3IgVFZlY3RvcjsKIAogc3RhdGljIE9TU3RhdHVzIFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMoRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4KQotCS8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgc2VjdGlvbjBCYXNlIGFuZCBzZWN0aW9uMUJhc2UKLQkvLyBiYXNlIGZpZWxkcyBvZiBmcmFnVG9GaXggdG8gdGhlIGJhc2UgYWRkcmVzc2VzIG9mIHRoZQotCS8vIGluc3RhbnRpYXRlZCBmcmFnbWVudCByZXByZXNlbnRlZCBieSB0aGUgb3RoZXIgZmllbGRzCi0JLy8gb2YgZnJhZ1RvRml4LiAgVGhlIHByb2Nlc3Mgd29ya3MgaW4gdGhyZWUgc3RhdGVzOgotCS8vCi0JLy8gMS4gCUZpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWxvY2F0ZWQgVFZlY3RvciBvZiB0aGUgCi0JLy8gICAgICBmcmFnbWVudCdzIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUsIHByb3ZpZGVkIHRvIHVzIGJ5IAotCS8vICAgICAgdGhlIGNhbGxlci4KLQkvLwotCS8vIDIuCUZpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBub24tcmVsb2NhdGVkIFRWZWN0b3IgYnkgCi0JLy8gICAgICBsb29raW5nIGl0IHVwIGluIHRoZSBQRUYgbG9hZGVyIGluZm8gaGVhZGVyIGFuZCB0aGVuIAotCS8vICAgICAgdXNpbmcgdGhhdCB0byByZWFkIHRoZSBUVmVjdG9yIGNvbnRlbnRzIGZyb20gZGlzay4KLQkvLyAgICAgIFRoaXMgeWllbGRzIHRoZSBvZmZzZXRzIGZyb20gdGhlIHNlY3Rpb24gYmFzZXMgZm9yIAotCS8vICAgICAgdGhlIGluaXQgcm91dGluZS4KLQkvLwotCS8vIDMuCVN1YnRyYWN0IDIgZnJvbSAzLgorICAgIC8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgc2VjdGlvbjBCYXNlIGFuZCBzZWN0aW9uMUJhc2UKKyAgICAvLyBiYXNlIGZpZWxkcyBvZiBmcmFnVG9GaXggdG8gdGhlIGJhc2UgYWRkcmVzc2VzIG9mIHRoZQorICAgIC8vIGluc3RhbnRpYXRlZCBmcmFnbWVudCByZXByZXNlbnRlZCBieSB0aGUgb3RoZXIgZmllbGRzCisgICAgLy8gb2YgZnJhZ1RvRml4LiAgVGhlIHByb2Nlc3Mgd29ya3MgaW4gdGhyZWUgc3RhdGVzOgorICAgIC8vCisgICAgLy8gMS4gICAgICAgRmluZCB0aGUgY29udGVudHMgb2YgdGhlIHJlbG9jYXRlZCBUVmVjdG9yIG9mIHRoZQorICAgIC8vICAgICAgZnJhZ21lbnQncyBpbml0aWFsaXNhdGlvbiByb3V0aW5lLCBwcm92aWRlZCB0byB1cyBieQorICAgIC8vICAgICAgdGhlIGNhbGxlci4KKyAgICAvLworICAgIC8vIDIuICAgICAgIEZpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBub24tcmVsb2NhdGVkIFRWZWN0b3IgYnkKKyAgICAvLyAgICAgIGxvb2tpbmcgaXQgdXAgaW4gdGhlIFBFRiBsb2FkZXIgaW5mbyBoZWFkZXIgYW5kIHRoZW4KKyAgICAvLyAgICAgIHVzaW5nIHRoYXQgdG8gcmVhZCB0aGUgVFZlY3RvciBjb250ZW50cyBmcm9tIGRpc2suCisgICAgLy8gICAgICBUaGlzIHlpZWxkcyB0aGUgb2Zmc2V0cyBmcm9tIHRoZSBzZWN0aW9uIGJhc2VzIGZvcgorICAgIC8vICAgICAgdGhlIGluaXQgcm91dGluZS4KKyAgICAvLworICAgIC8vIDMuICAgICAgIFN1YnRyYWN0IDIgZnJvbSAzLgogewotCU9TU3RhdHVzIAkJCWVycjsKLQlUVmVjdG9yICoJCQlyZWxvY2F0ZWRFeHBvcnQ7Ci0JU0ludDMyCQkJCWluaXRTZWN0aW9uOwotCVVJbnQzMgkJCQlpbml0T2Zmc2V0OwotCVBFRlNlY3Rpb25IZWFkZXIgKglpbml0U2VjdGlvbkhlYWRlcjsKLQlQdHIJCQkJCXBhY2tlZERhdGFTZWN0aW9uOwotCVB0cgkJCQkJdW5wYWNrZWREYXRhU2VjdGlvbjsKLQlUVmVjdG9yIAkJCW9yaWdpbmFsT2Zmc2V0czsKKyAgICBPU1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI7CisgICAgVFZlY3RvciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGVkRXhwb3J0OworICAgIFNJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTZWN0aW9uOworICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRPZmZzZXQ7CisgICAgUEVGU2VjdGlvbkhlYWRlciAqICAgICAgICAgIGluaXRTZWN0aW9uSGVhZGVyOworICAgIFB0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2VkRGF0YVNlY3Rpb247CisgICAgUHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tlZERhdGFTZWN0aW9uOworICAgIFRWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsT2Zmc2V0czsKIAotCXBhY2tlZERhdGFTZWN0aW9uICAgPSBuaWw7Ci0JdW5wYWNrZWREYXRhU2VjdGlvbiA9IG5pbDsKLQkKLQkvLyBTdGVwIDEuCisgICAgcGFja2VkRGF0YVNlY3Rpb24gICA9IG5pbDsKKyAgICB1bnBhY2tlZERhdGFTZWN0aW9uID0gbmlsOwogCi0JLy8gRmlyc3QgZmluZCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3Rvciwgd2hpY2ggZ2l2ZXMgdXMgdGhlIHJlbG9jYXRlZCAKLQkvLyBvZmZzZXRzIG9mIHRoZSBpbml0IHJvdXRpbmUgaW50byB0aGUgZGF0YSBhbmQgY29kZSBzZWN0aW9ucy4KKyAgICAvLyBTdGVwIDEuCiAKLQlyZWxvY2F0ZWRFeHBvcnQgPSAoVFZlY3RvciAqKSBmcmFnVG9GaXgtPmluaXRSb3V0aW5lOwotCQkKLQkvLyBTdGVwIDIuCi0JCi0JLy8gTm93IGZpbmQgdGhlIGluaXQgcm91dGluZSdzIFRWZWN0b3IncyBvZmZzZXRzIGluIHRoZSBkYXRhIHNlY3Rpb24gb24gCi0JLy8gZGlzay4gIFRoaXMgZ2l2ZXMgdXMgdGhlIHJhdyBvZmZzZXRzIGZyb20gdGhlIGRhdGEgYW5kIGNvZGUgc2VjdGlvbiAKLQkvLyBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbml0IHJvdXRpbmUuCi0JCi0JZXJyID0gbm9FcnI7Ci0JaW5pdFNlY3Rpb24gPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmluaXRTZWN0aW9uOwotCWluaXRPZmZzZXQgID0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5pbml0T2Zmc2V0OwotCWlmIChpbml0U2VjdGlvbiA9PSAtMSkgewotCQllcnIgPSBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnI7Ci0JfQotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uID49IDAgKTsJCS8vIE5lZ2F0aXZlIGluZGV4ZXMgYXJlIHBzZXVkby1zZWN0aW9ucyB3aGljaCBhcmUganVzdCBub3QgYWxsb3dlZCEKLQkJTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uIDwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICk7CisgICAgLy8gRmlyc3QgZmluZCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3Rvciwgd2hpY2ggZ2l2ZXMgdXMgdGhlIHJlbG9jYXRlZAorICAgIC8vIG9mZnNldHMgb2YgdGhlIGluaXQgcm91dGluZSBpbnRvIHRoZSBkYXRhIGFuZCBjb2RlIHNlY3Rpb25zLgogCi0JCWluaXRTZWN0aW9uSGVhZGVyID0gJmZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbaW5pdFNlY3Rpb25dOwotCQkKLQkJLy8gSWYgdGhlIGRhdGEgc2VjdGlvbiBpcyBwYWNrZWQsIHVucGFjayBpdCB0byBhIHRlbXBvcmFyeSBidWZmZXIgYW5kIHRoZW4gZ2V0IHRoZSAKLQkJLy8gb3JpZ2luYWwgb2Zmc2V0cyBmcm9tIHRoYXQgYnVmZmVyLiAgSWYgdGhlIGRhdGEgc2VjdGlvbiBpcyB1bnBhY2tlZCwganVzdCByZWFkIAotCQkvLyB0aGUgb3JpZ2luYWwgb2Zmc2V0cyBkaXJlY3RseSBvZmYgdGhlIGRpc2suCi0JCQotCQlpZiAoIGluaXRTZWN0aW9uSGVhZGVyLT5zZWN0aW9uS2luZCA9PSBrUEVGUGFja2VkRGF0YVNlY3Rpb24gKSB7CisgICAgcmVsb2NhdGVkRXhwb3J0ID0gKFRWZWN0b3IgKikgZnJhZ1RvRml4LT5pbml0Um91dGluZTsKIAotCQkJLy8gQWxsb2NhdGUgc3BhY2UgZm9yIHBhY2tlZCBhbmQgdW5wYWNrZWQgY29waWVzIG9mIHRoZSBzZWN0aW9uLgotCQkJCi0JCQlwYWNrZWREYXRhU2VjdGlvbiA9IE5ld1B0cihpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoKTsKLQkJCWVyciA9IE1lbUVycm9yKCk7CisgICAgLy8gU3RlcCAyLgogCi0JCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQkJdW5wYWNrZWREYXRhU2VjdGlvbiA9IE5ld1B0cihpbml0U2VjdGlvbkhlYWRlci0+dW5wYWNrZWRMZW5ndGgpOwotCQkJCWVyciA9IE1lbUVycm9yKCk7Ci0JCQl9CisgICAgLy8gTm93IGZpbmQgdGhlIGluaXQgcm91dGluZSdzIFRWZWN0b3IncyBvZmZzZXRzIGluIHRoZSBkYXRhIHNlY3Rpb24gb24KKyAgICAvLyBkaXNrLiAgVGhpcyBnaXZlcyB1cyB0aGUgcmF3IG9mZnNldHMgZnJvbSB0aGUgZGF0YSBhbmQgY29kZSBzZWN0aW9uCisgICAgLy8gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5pdCByb3V0aW5lLgogCi0JCQkvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgcGFja2VkIHNlY3Rpb24uCi0JCQkKLQkJCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJCQllcnIgPSBGU1JlYWRBdE9mZnNldCgJZnJhZ1RvRml4LT5maWxlUmVmLAotCQkJCQkJCQkJCWZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQKLQkJCQkJCQkJCQkrIGluaXRTZWN0aW9uSGVhZGVyLT5jb250YWluZXJPZmZzZXQsCi0JCQkJCQkJCQkJaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lckxlbmd0aCwKLQkJCQkJCQkJCQlwYWNrZWREYXRhU2VjdGlvbik7Ci0JCQl9Ci0JCQkKLQkJCS8vIFVucGFjayB0aGUgZGF0YSBpbnRvIHRoZSB1bnBhY2tlZCBzZWN0aW9uLgotCQkJCi0JCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQkJZXJyID0gVW5wYWNrUEVGRGF0YVNlY3Rpb24oIChVSW50OCAqKSBwYWNrZWREYXRhU2VjdGlvbiwgICBpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoLAotCQkJCQkJCQkgICAgICAgICAgICAoVUludDggKikgdW5wYWNrZWREYXRhU2VjdGlvbiwgaW5pdFNlY3Rpb25IZWFkZXItPnVucGFja2VkTGVuZ3RoKTsKLQkJCX0KLQkJCQotCQkJLy8gRXh0cmFjdCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3RvciBmcm9tIHRoZSB1bnBhY2tlZCBzZWN0aW9uLgotCQkJCi0JCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQkJQmxvY2tNb3ZlRGF0YSh1bnBhY2tlZERhdGFTZWN0aW9uICsgaW5pdE9mZnNldCwgJm9yaWdpbmFsT2Zmc2V0cywgc2l6ZW9mKFRWZWN0b3IpKTsKLQkJCX0KLQkJCQotCQl9IGVsc2UgewotCQkJTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl0uc2VjdGlvbktpbmQgPT0ga1BFRlVucGFja2VkRGF0YVNlY3Rpb24pOwotCQkJZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLCAKLQkJCQkJCQkJCWZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQKLQkJCQkJCQkJCSsgZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl0uY29udGFpbmVyT2Zmc2V0Ci0JCQkJCQkJCQkrIGluaXRPZmZzZXQsCi0JCQkJCQkJCQlzaXplb2YoVFZlY3RvciksIAotCQkJCQkJCQkJJm9yaWdpbmFsT2Zmc2V0cyk7Ci0JCX0KLQl9CisgICAgZXJyID0gbm9FcnI7CisgICAgaW5pdFNlY3Rpb24gPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmluaXRTZWN0aW9uOworICAgIGluaXRPZmZzZXQgID0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5pbml0T2Zmc2V0OworICAgIGlmIChpbml0U2VjdGlvbiA9PSAtMSkgeworICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnI7CisgICAgfQorICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uID49IDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBpbmRleGVzIGFyZSBwc2V1ZG8tc2VjdGlvbnMgd2hpY2ggYXJlIGp1c3Qgbm90IGFsbG93ZWQhCisgICAgICAgIE1vcmVBc3NlcnRRKCBpbml0U2VjdGlvbiA8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCApOwogCi0JLy8gU3RlcCAzLgotCQkKLQkvLyBEbyB0aGUgbWF0aHMgdG8gc3VidHJhY3QgdGhlIHVucmVsb2NhdGVkIG9mZnNldHMgZnJvbSB0aGUgY3VycmVudCBhZGRyZXNzIAotCS8vIHRvIGdldCB0aGUgYmFzZSBhZGRyZXNzLgotCQotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJZnJhZ1RvRml4LT5zZWN0aW9uMEJhc2UgPSAoKGNoYXIgKikgcmVsb2NhdGVkRXhwb3J0LT5jb2RlUHRyKSAtIChVSW50MzIpIG9yaWdpbmFsT2Zmc2V0cy5jb2RlUHRyOwotCQlmcmFnVG9GaXgtPnNlY3Rpb24xQmFzZSA9ICgoY2hhciAqKSByZWxvY2F0ZWRFeHBvcnQtPnRvY1B0cikgIC0gKFVJbnQzMikgb3JpZ2luYWxPZmZzZXRzLnRvY1B0cjsKLQl9Ci0JCi0JLy8gQ2xlYW4gdXAuCi0JCi0JaWYgKHBhY2tlZERhdGFTZWN0aW9uICE9IG5pbCkgewotCQlEaXNwb3NlUHRyKHBhY2tlZERhdGFTZWN0aW9uKTsKLQkJTW9yZUFzc2VydFEoIE1lbUVycm9yKCkgPT0gbm9FcnIgKTsKLQl9Ci0JaWYgKHVucGFja2VkRGF0YVNlY3Rpb24gIT0gbmlsKSB7Ci0JCURpc3Bvc2VQdHIodW5wYWNrZWREYXRhU2VjdGlvbik7Ci0JCU1vcmVBc3NlcnRRKCBNZW1FcnJvcigpID09IG5vRXJyICk7Ci0JfQotCXJldHVybiBlcnI7CisgICAgICAgIGluaXRTZWN0aW9uSGVhZGVyID0gJmZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbaW5pdFNlY3Rpb25dOworCisgICAgICAgIC8vIElmIHRoZSBkYXRhIHNlY3Rpb24gaXMgcGFja2VkLCB1bnBhY2sgaXQgdG8gYSB0ZW1wb3JhcnkgYnVmZmVyIGFuZCB0aGVuIGdldCB0aGUKKyAgICAgICAgLy8gb3JpZ2luYWwgb2Zmc2V0cyBmcm9tIHRoYXQgYnVmZmVyLiAgSWYgdGhlIGRhdGEgc2VjdGlvbiBpcyB1bnBhY2tlZCwganVzdCByZWFkCisgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBvZmZzZXRzIGRpcmVjdGx5IG9mZiB0aGUgZGlzay4KKworICAgICAgICBpZiAoIGluaXRTZWN0aW9uSGVhZGVyLT5zZWN0aW9uS2luZCA9PSBrUEVGUGFja2VkRGF0YVNlY3Rpb24gKSB7CisKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBwYWNrZWQgYW5kIHVucGFja2VkIGNvcGllcyBvZiB0aGUgc2VjdGlvbi4KKworICAgICAgICAgICAgcGFja2VkRGF0YVNlY3Rpb24gPSBOZXdQdHIoaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lckxlbmd0aCk7CisgICAgICAgICAgICBlcnIgPSBNZW1FcnJvcigpOworCisgICAgICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICAgICAgdW5wYWNrZWREYXRhU2VjdGlvbiA9IE5ld1B0cihpbml0U2VjdGlvbkhlYWRlci0+dW5wYWNrZWRMZW5ndGgpOworICAgICAgICAgICAgICAgIGVyciA9IE1lbUVycm9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZWQgc2VjdGlvbi4KKworICAgICAgICAgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAgICAgICAgIGVyciA9IEZTUmVhZEF0T2Zmc2V0KCAgICAgICAgICAgICAgICAgICBmcmFnVG9GaXgtPmZpbGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tlZERhdGFTZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5wYWNrIHRoZSBkYXRhIGludG8gdGhlIHVucGFja2VkIHNlY3Rpb24uCisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBVbnBhY2tQRUZEYXRhU2VjdGlvbiggKFVJbnQ4ICopIHBhY2tlZERhdGFTZWN0aW9uLCAgIGluaXRTZWN0aW9uSGVhZGVyLT5jb250YWluZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUludDggKikgdW5wYWNrZWREYXRhU2VjdGlvbiwgaW5pdFNlY3Rpb25IZWFkZXItPnVucGFja2VkTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3RvciBmcm9tIHRoZSB1bnBhY2tlZCBzZWN0aW9uLgorCisgICAgICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICAgICAgQmxvY2tNb3ZlRGF0YSh1bnBhY2tlZERhdGFTZWN0aW9uICsgaW5pdE9mZnNldCwgJm9yaWdpbmFsT2Zmc2V0cywgc2l6ZW9mKFRWZWN0b3IpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl0uc2VjdGlvbktpbmQgPT0ga1BFRlVucGFja2VkRGF0YVNlY3Rpb24pOworICAgICAgICAgICAgZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW2luaXRTZWN0aW9uXS5jb250YWluZXJPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5pdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihUVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmlnaW5hbE9mZnNldHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RlcCAzLgorCisgICAgLy8gRG8gdGhlIG1hdGhzIHRvIHN1YnRyYWN0IHRoZSB1bnJlbG9jYXRlZCBvZmZzZXRzIGZyb20gdGhlIGN1cnJlbnQgYWRkcmVzcworICAgIC8vIHRvIGdldCB0aGUgYmFzZSBhZGRyZXNzLgorCisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICBmcmFnVG9GaXgtPnNlY3Rpb24wQmFzZSA9ICgoY2hhciAqKSByZWxvY2F0ZWRFeHBvcnQtPmNvZGVQdHIpIC0gKFVJbnQzMikgb3JpZ2luYWxPZmZzZXRzLmNvZGVQdHI7CisgICAgICAgIGZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlID0gKChjaGFyICopIHJlbG9jYXRlZEV4cG9ydC0+dG9jUHRyKSAgLSAoVUludDMyKSBvcmlnaW5hbE9mZnNldHMudG9jUHRyOworICAgIH0KKworICAgIC8vIENsZWFuIHVwLgorCisgICAgaWYgKHBhY2tlZERhdGFTZWN0aW9uICE9IG5pbCkgeworICAgICAgICBEaXNwb3NlUHRyKHBhY2tlZERhdGFTZWN0aW9uKTsKKyAgICAgICAgTW9yZUFzc2VydFEoIE1lbUVycm9yKCkgPT0gbm9FcnIgKTsKKyAgICB9CisgICAgaWYgKHVucGFja2VkRGF0YVNlY3Rpb24gIT0gbmlsKSB7CisgICAgICAgIERpc3Bvc2VQdHIodW5wYWNrZWREYXRhU2VjdGlvbik7CisgICAgICAgIE1vcmVBc3NlcnRRKCBNZW1FcnJvcigpID09IG5vRXJyICk7CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkICpHZXRTZWN0aW9uQmFzZUFkZHJlc3MoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LCBVSW50MTYgc2VjdGlvbkluZGV4KQotCS8vIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBiYXNlIG9mIHRoZSBpbnN0YW50aWF0ZWQgc2VjdGlvbgotCS8vIHdob3NlIGluZGV4IGlzIHNlY3Rpb25JbmRleC4gIFRoaXMgcm91dGluZSBpcyB0aGUgZXZpbCB0d2luCi0JLy8gb2YgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3Nlcy4gIEl0IHNpbXBseSByZXR1cm5zIHRoZSB2YWx1ZXMKLQkvLyBmb3Igc2VjdGlvbiAwIGFuZCAxIHRoYXQgd2UgZGVyaXZlZCBpbiBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzLgotCS8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyByb3V0aW5lIHdvdWxkIGNhbGwgQ0ZNIEFQSQotCS8vIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uLCBhbmQgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyB3b3VsZAotCS8vIG5vdCBleGlzdCwgYnV0IENGTSBkb2VzIG5vdCBleHBvcnQgdGhlIG5lY2Vzc2FyeSBBUElzIHRvCi0JLy8gdGhpcmQgcGFydGllcy4KKyAgICAvLyBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgYmFzZSBvZiB0aGUgaW5zdGFudGlhdGVkIHNlY3Rpb24KKyAgICAvLyB3aG9zZSBpbmRleCBpcyBzZWN0aW9uSW5kZXguICBUaGlzIHJvdXRpbmUgaXMgdGhlIGV2aWwgdHdpbgorICAgIC8vIG9mIFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMuICBJdCBzaW1wbHkgcmV0dXJucyB0aGUgdmFsdWVzCisgICAgLy8gZm9yIHNlY3Rpb24gMCBhbmQgMSB0aGF0IHdlIGRlcml2ZWQgaW4gU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3Nlcy4KKyAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoaXMgcm91dGluZSB3b3VsZCBjYWxsIENGTSBBUEkKKyAgICAvLyB0byBnZXQgdGhpcyBpbmZvcm1hdGlvbiwgYW5kIFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMgd291bGQKKyAgICAvLyBub3QgZXhpc3QsIGJ1dCBDRk0gZG9lcyBub3QgZXhwb3J0IHRoZSBuZWNlc3NhcnkgQVBJcyB0bworICAgIC8vIHRoaXJkIHBhcnRpZXMuCiB7Ci0Jdm9pZCAqcmVzdWx0OwotCQotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnRhZzEgPT0ga1BFRlRhZzEpOwotCQotCXN3aXRjaCAoc2VjdGlvbkluZGV4KSB7Ci0JCWNhc2UgMDoKLQkJCXJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjBCYXNlOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXN1bHQgPSBuaWw7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICB2b2lkICpyZXN1bHQ7CisKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXggIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcxID09IGtQRUZUYWcxKTsKKworICAgIHN3aXRjaCAoc2VjdGlvbkluZGV4KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjBCYXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXN1bHQgPSBuaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCiBzdGF0aWMgT1NTdGF0dXMgRmluZEltcG9ydExpYnJhcnkoUEVGTG9hZGVySW5mb0hlYWRlciAqbG9hZGVyU2VjdGlvbiwgY29uc3QgY2hhciAqbGlicmFyeU5hbWUsIFBFRkltcG9ydGVkTGlicmFyeSAqKmltcG9ydExpYnJhcnkpCi0JLy8gVGhpcyByb3V0aW5lIGZpbmRzIHRoZSBpbXBvcnQgbGlicmFyeSBkZXNjcmlwdGlvbiAoUEVGSW1wb3J0ZWRMaWJyYXJ5KQotCS8vIGZvciB0aGUgaW1wb3J0IGxpYnJhcnkgbGlicmFyeU5hbWUgaW4gdGhlIFBFRiBsb2FkZXIgc2VjdGlvbi4KLQkvLyBJdCBzZXRzICppbXBvcnRMaWJyYXJ5IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXNjcmlwdGlvbi4KKyAgICAvLyBUaGlzIHJvdXRpbmUgZmluZHMgdGhlIGltcG9ydCBsaWJyYXJ5IGRlc2NyaXB0aW9uIChQRUZJbXBvcnRlZExpYnJhcnkpCisgICAgLy8gZm9yIHRoZSBpbXBvcnQgbGlicmFyeSBsaWJyYXJ5TmFtZSBpbiB0aGUgUEVGIGxvYWRlciBzZWN0aW9uLgorICAgIC8vIEl0IHNldHMgKmltcG9ydExpYnJhcnkgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0aW9uLgogewotCU9TU3RhdHVzIAkJCWVycjsKLQlVSW50MzIgCQkJCWxpYnJhcmllc1JlbWFpbmluZzsKLQlQRUZJbXBvcnRlZExpYnJhcnkgCSp0aGlzSW1wb3J0TGlicmFyeTsKLQlCb29sZWFuIAkJCWZvdW5kOwotCQotCU1vcmVBc3NlcnRRKGxvYWRlclNlY3Rpb24gIT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShsaWJyYXJ5TmFtZSAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGltcG9ydExpYnJhcnkgIT0gbmlsKTsKLQkKLQkvLyBMb29wIHRocm91Z2ggZWFjaCBpbXBvcnQgbGlicmFyeSBsb29raW5nIGZvciBhIG1hdGNoaW5nIG5hbWUuCi0JCi0JLy8gSW5pdGlhbGlzZSB0aGlzSW1wb3J0TGlicmFyeSB0byBwb2ludCB0byB0aGUgYnl0ZSBhZnRlciB0aGUKLQkvLyBlbmQgb2YgdGhlIGxvYWRlciBzZWN0aW9uJ3MgaGVhZGVyLgotCQotCXRoaXNJbXBvcnRMaWJyYXJ5ID0gKFBFRkltcG9ydGVkTGlicmFyeSAqKSAobG9hZGVyU2VjdGlvbiArIDEpOwotCWxpYnJhcmllc1JlbWFpbmluZyA9IGxvYWRlclNlY3Rpb24tPmltcG9ydGVkTGlicmFyeUNvdW50OwotCWZvdW5kID0gZmFsc2U7Ci0Jd2hpbGUgKCBsaWJyYXJpZXNSZW1haW5pbmcgPiAwICYmICEgZm91bmQgKSB7Ci0JCS8vIFBFRiBkZWZpbmVzIHRoYXQgaW1wb3J0IGxpYnJhcnkgbmFtZXMgd2lsbCBoYXZlCi0JCS8vIGEgbnVsbCB0ZXJtaW5hdG9yLCBzbyB3ZSBjYW4ganVzdCB1c2Ugc3RyY21wLgotCQlmb3VuZCA9IChzdHJjbXAoIGxpYnJhcnlOYW1lLAotCQkJCQkJKChjaGFyICopbG9hZGVyU2VjdGlvbikKLQkJCQkJCSsgbG9hZGVyU2VjdGlvbi0+bG9hZGVyU3RyaW5nc09mZnNldCAKLQkJCQkJCSsgdGhpc0ltcG9ydExpYnJhcnktPm5hbWVPZmZzZXQpID09IDApOwotCQkvLyAqKiogUmVtb3ZlIEFOU0kgc3RyY21wIGV2ZW50dWFsbHkuCi0JCWlmICggISBmb3VuZCApIHsKLQkJCXRoaXNJbXBvcnRMaWJyYXJ5ICs9IDE7Ci0JCQlsaWJyYXJpZXNSZW1haW5pbmcgLT0gMTsKLQkJfQotCX0KLQkKLQlpZiAoZm91bmQpIHsKLQkJKmltcG9ydExpYnJhcnkgPSB0aGlzSW1wb3J0TGlicmFyeTsKLQkJZXJyID0gbm9FcnI7Ci0JfSBlbHNlIHsKLQkJKmltcG9ydExpYnJhcnkgPSBuaWw7Ci0JCWVyciA9IGNmcmFnTm9MaWJyYXJ5RXJyOwotCX0KLQlyZXR1cm4gZXJyOworICAgIE9TU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKyAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXNSZW1haW5pbmc7CisgICAgUEVGSW1wb3J0ZWRMaWJyYXJ5ICAgICAgICAgICp0aGlzSW1wb3J0TGlicmFyeTsKKyAgICBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZDsKKworICAgIE1vcmVBc3NlcnRRKGxvYWRlclNlY3Rpb24gIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShsaWJyYXJ5TmFtZSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGltcG9ydExpYnJhcnkgIT0gbmlsKTsKKworICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGltcG9ydCBsaWJyYXJ5IGxvb2tpbmcgZm9yIGEgbWF0Y2hpbmcgbmFtZS4KKworICAgIC8vIEluaXRpYWxpc2UgdGhpc0ltcG9ydExpYnJhcnkgdG8gcG9pbnQgdG8gdGhlIGJ5dGUgYWZ0ZXIgdGhlCisgICAgLy8gZW5kIG9mIHRoZSBsb2FkZXIgc2VjdGlvbidzIGhlYWRlci4KKworICAgIHRoaXNJbXBvcnRMaWJyYXJ5ID0gKFBFRkltcG9ydGVkTGlicmFyeSAqKSAobG9hZGVyU2VjdGlvbiArIDEpOworICAgIGxpYnJhcmllc1JlbWFpbmluZyA9IGxvYWRlclNlY3Rpb24tPmltcG9ydGVkTGlicmFyeUNvdW50OworICAgIGZvdW5kID0gZmFsc2U7CisgICAgd2hpbGUgKCBsaWJyYXJpZXNSZW1haW5pbmcgPiAwICYmICEgZm91bmQgKSB7CisgICAgICAgIC8vIFBFRiBkZWZpbmVzIHRoYXQgaW1wb3J0IGxpYnJhcnkgbmFtZXMgd2lsbCBoYXZlCisgICAgICAgIC8vIGEgbnVsbCB0ZXJtaW5hdG9yLCBzbyB3ZSBjYW4ganVzdCB1c2Ugc3RyY21wLgorICAgICAgICBmb3VuZCA9IChzdHJjbXAoIGxpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhciAqKWxvYWRlclNlY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsb2FkZXJTZWN0aW9uLT5sb2FkZXJTdHJpbmdzT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzSW1wb3J0TGlicmFyeS0+bmFtZU9mZnNldCkgPT0gMCk7CisgICAgICAgIC8vICoqKiBSZW1vdmUgQU5TSSBzdHJjbXAgZXZlbnR1YWxseS4KKyAgICAgICAgaWYgKCAhIGZvdW5kICkgeworICAgICAgICAgICAgdGhpc0ltcG9ydExpYnJhcnkgKz0gMTsKKyAgICAgICAgICAgIGxpYnJhcmllc1JlbWFpbmluZyAtPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICppbXBvcnRMaWJyYXJ5ID0gdGhpc0ltcG9ydExpYnJhcnk7CisgICAgICAgIGVyciA9IG5vRXJyOworICAgIH0gZWxzZSB7CisgICAgICAgICppbXBvcnRMaWJyYXJ5ID0gbmlsOworICAgICAgICBlcnIgPSBjZnJhZ05vTGlicmFyeUVycjsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIE9TU3RhdHVzIExvb2t1cFN5bWJvbChDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBsb29rdXAsIHZvaWQgKnJlZkNvbiwKLQkJCQkJCQlQRUZMb2FkZXJJbmZvSGVhZGVyICpsb2FkZXJTZWN0aW9uLAotCQkJCQkJCVVJbnQzMiBzeW1ib2xJbmRleCwKLQkJCQkJCQlVSW50MzIgKnN5bWJvbFZhbHVlKQotCS8vIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGxvb2sgdXAgYSBzeW1ib2wgZHVyaW5nIHJlbG9jYXRpb24uCi0JLy8gImxvb2t1cCIgaXMgYSBjbGllbnQgY2FsbGJhY2sgYW5kIHJlZkNvbiBpcyBpdHMgYXJndW1lbnQuCi0JLy8gVHlwaWNhbGx5IHJlZkNvbiBpcyB0aGUgQ0ZNIGNvbm5lY3Rpb24gdG8gdGhlIGxpYnJhcnkgdGhhdCBpcwotCS8vIHN1YnN0aXR1dGluZyBmb3IgdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkuICBsb2FkZXJTZWN0aW9uCi0JLy8gaXMgYSBwb2ludGVyIHRvIHRoZSBsb2FkZXIgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQgdG8gZml4IHVwLgotCS8vIHN5bWJvbEluZGV4IGlzIHRoZSBpbmRleCBvZiB0aGUgaW1wb3J0ZWQgc3ltYm9sIGluIHRoZSBsb2FkZXIgc2VjdGlvbi4KLQkvLyBUaGUgcm91dGluZSBzZXRzIHRoZSB3b3JkIHBvaW50ZWQgdG8gYnkgc3ltYm9sVmFsdWUgdG8gdGhlCi0JLy8gdmFsdWUgb2YgdGhlIHN5bWJvbC4KLQkvLwotCS8vIFRoZSByb3V0aW5lIHdvcmtzIGJ5IHVzaW5nIHN5bWJvbEluZGV4IHRvIGluZGV4IGludG8gdGhlIGltcG9ydGVkCi0JLy8gc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIG9mZnNldCBvZiB0aGUgc3ltYm9sJ3MgbmFtZSBpbiB0aGUgc3RyaW5nCi0JLy8gdGFibGUuICBJdCB0aGVuIGxvb2tzIHVwIHRoZSBzeW1ib2wgYnkgY2FsbGluZyB0aGUgY2xpZW50J3MgImxvb2t1cCIKLQkvLyBmdW5jdGlvbiBhbmQgcGFzc2VzIHRoZSByZXN1bHRpbmcgc3ltYm9sIGFkZHJlc3MgYmFjayBpbiBzeW1ib2xWYWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVGTG9hZGVySW5mb0hlYWRlciAqbG9hZGVyU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIHN5bWJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgKnN5bWJvbFZhbHVlKQorICAgIC8vIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGxvb2sgdXAgYSBzeW1ib2wgZHVyaW5nIHJlbG9jYXRpb24uCisgICAgLy8gImxvb2t1cCIgaXMgYSBjbGllbnQgY2FsbGJhY2sgYW5kIHJlZkNvbiBpcyBpdHMgYXJndW1lbnQuCisgICAgLy8gVHlwaWNhbGx5IHJlZkNvbiBpcyB0aGUgQ0ZNIGNvbm5lY3Rpb24gdG8gdGhlIGxpYnJhcnkgdGhhdCBpcworICAgIC8vIHN1YnN0aXR1dGluZyBmb3IgdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkuICBsb2FkZXJTZWN0aW9uCisgICAgLy8gaXMgYSBwb2ludGVyIHRvIHRoZSBsb2FkZXIgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQgdG8gZml4IHVwLgorICAgIC8vIHN5bWJvbEluZGV4IGlzIHRoZSBpbmRleCBvZiB0aGUgaW1wb3J0ZWQgc3ltYm9sIGluIHRoZSBsb2FkZXIgc2VjdGlvbi4KKyAgICAvLyBUaGUgcm91dGluZSBzZXRzIHRoZSB3b3JkIHBvaW50ZWQgdG8gYnkgc3ltYm9sVmFsdWUgdG8gdGhlCisgICAgLy8gdmFsdWUgb2YgdGhlIHN5bWJvbC4KKyAgICAvLworICAgIC8vIFRoZSByb3V0aW5lIHdvcmtzIGJ5IHVzaW5nIHN5bWJvbEluZGV4IHRvIGluZGV4IGludG8gdGhlIGltcG9ydGVkCisgICAgLy8gc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIG9mZnNldCBvZiB0aGUgc3ltYm9sJ3MgbmFtZSBpbiB0aGUgc3RyaW5nCisgICAgLy8gdGFibGUuICBJdCB0aGVuIGxvb2tzIHVwIHRoZSBzeW1ib2wgYnkgY2FsbGluZyB0aGUgY2xpZW50J3MgImxvb2t1cCIKKyAgICAvLyBmdW5jdGlvbiBhbmQgcGFzc2VzIHRoZSByZXN1bHRpbmcgc3ltYm9sIGFkZHJlc3MgYmFjayBpbiBzeW1ib2xWYWx1ZS4KIHsKLQlPU1N0YXR1cyAJCQllcnI7Ci0JVUludDMyIAkJCQkqaW1wb3J0U3ltYm9sVGFibGU7Ci0JVUludDMyIAkJCQlzeW1ib2xTdHJpbmdPZmZzZXQ7Ci0JQm9vbGVhbiAJCQlzeW1ib2xJc1dlYWs7Ci0JQ0ZyYWdTeW1ib2xDbGFzcyAJc3ltYm9sQ2xhc3M7Ci0JY2hhciAJCQkJKnN5bWJvbFN0cmluZ0FkZHJlc3M7Ci0JU3RyMjU1IAkJCQlzeW1ib2xTdHJpbmc7Ci0JCi0JTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEobG9hZGVyU2VjdGlvbiAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHN5bWJvbEluZGV4IDwgbG9hZGVyU2VjdGlvbi0+dG90YWxJbXBvcnRlZFN5bWJvbENvdW50KTsKLQlNb3JlQXNzZXJ0UShzeW1ib2xWYWx1ZSAhPSBuaWwpOwotCQotCS8vIEZpbmQgdGhlIGJhc2Ugb2YgdGhlIGltcG9ydGVkIHN5bWJvbCB0YWJsZS4KLQkKLQlpbXBvcnRTeW1ib2xUYWJsZSA9IChVSW50MzIgKikoKChjaGFyICopKGxvYWRlclNlY3Rpb24gKyAxKSkgKyAobG9hZGVyU2VjdGlvbi0+aW1wb3J0ZWRMaWJyYXJ5Q291bnQgKiBzaXplb2YoUEVGSW1wb3J0ZWRMaWJyYXJ5KSkpOwotCQotCS8vIEdyYWIgdGhlIGFwcHJvcHJpYXRlIGVudHJ5IG91dCBvZiB0aGUgdGFibGUgYW5kCi0JLy8gZXh0cmFjdCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGF0IGVudHJ5LgotCQotCXN5bWJvbFN0cmluZ09mZnNldCA9IGltcG9ydFN5bWJvbFRhYmxlW3N5bWJvbEluZGV4XTsKLQlzeW1ib2xDbGFzcyA9IFBFRkltcG9ydGVkU3ltYm9sQ2xhc3Moc3ltYm9sU3RyaW5nT2Zmc2V0KTsKLQlzeW1ib2xJc1dlYWsgPSAoKHN5bWJvbENsYXNzICYga1BFRldlYWtJbXBvcnRTeW1NYXNrKSAhPSAwKTsKLQlzeW1ib2xDbGFzcyA9IHN5bWJvbENsYXNzICYgfmtQRUZXZWFrSW1wb3J0U3ltTWFzazsKLQlzeW1ib2xTdHJpbmdPZmZzZXQgPSBQRUZJbXBvcnRlZFN5bWJvbE5hbWVPZmZzZXQoc3ltYm9sU3RyaW5nT2Zmc2V0KTsKLQkKLQkvLyBGaW5kIHRoZSBzdHJpbmcgZm9yIHRoZSBzeW1ib2wgaW4gdGhlIHN0cmluZ3MgdGFibGUgYW5kCi0JLy8gZXh0cmFjdCBpdCBmcm9tIHRoZSB0YWJsZSBpbnRvIGEgUGFzY2FsIHN0cmluZyBvbiB0aGUgc3RhY2suCi0JCi0Jc3ltYm9sU3RyaW5nQWRkcmVzcyA9ICgoY2hhciAqKWxvYWRlclNlY3Rpb24pICsgbG9hZGVyU2VjdGlvbi0+bG9hZGVyU3RyaW5nc09mZnNldCArIHN5bWJvbFN0cmluZ09mZnNldDsKLQlzeW1ib2xTdHJpbmdbMF0gPSBzdHJsZW4oc3ltYm9sU3RyaW5nQWRkcmVzcyk7CQkvLyAqKiogcmVtb3ZlIEFOU0kgc3RybGVuCi0JQmxvY2tNb3ZlRGF0YShzeW1ib2xTdHJpbmdBZGRyZXNzLCAmc3ltYm9sU3RyaW5nWzFdLCBzeW1ib2xTdHJpbmdbMF0pOwotCQotCS8vIExvb2sgdXAgdGhlIHN5bWJvbCBpbiBzdWJzdGl0dXRlIGxpYnJhcnkuICBJZiBpdCBmYWlscywgcmV0dXJuCi0JLy8gYSAwIHZhbHVlIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBlcnJvciBpcyBmYXRhbCAoYSBzdHJvbmcgbGlua2VkCi0JLy8gc3ltYm9sKSBvciBiZW5pZ24gKGEgd2VhayBsaW5rZWQgc3ltYm9sKS4KLQkKLQllcnIgPSBsb29rdXAoc3ltYm9sU3RyaW5nLCBzeW1ib2xDbGFzcywgKHZvaWQgKiopIHN5bWJvbFZhbHVlLCByZWZDb24pOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJKnN5bWJvbFZhbHVlID0gMDsKLQkJaWYgKHN5bWJvbElzV2VhaykgewotCQkJZXJyID0gbm9FcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBPU1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI7CisgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmltcG9ydFN5bWJvbFRhYmxlOworICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbFN0cmluZ09mZnNldDsKKyAgICBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJc1dlYWs7CisgICAgQ0ZyYWdTeW1ib2xDbGFzcyAgICAgICAgICAgIHN5bWJvbENsYXNzOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzeW1ib2xTdHJpbmdBZGRyZXNzOworICAgIFN0cjI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbFN0cmluZzsKKworICAgIE1vcmVBc3NlcnRRKGxvb2t1cCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGxvYWRlclNlY3Rpb24gIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShzeW1ib2xJbmRleCA8IGxvYWRlclNlY3Rpb24tPnRvdGFsSW1wb3J0ZWRTeW1ib2xDb3VudCk7CisgICAgTW9yZUFzc2VydFEoc3ltYm9sVmFsdWUgIT0gbmlsKTsKKworICAgIC8vIEZpbmQgdGhlIGJhc2Ugb2YgdGhlIGltcG9ydGVkIHN5bWJvbCB0YWJsZS4KKworICAgIGltcG9ydFN5bWJvbFRhYmxlID0gKFVJbnQzMiAqKSgoKGNoYXIgKikobG9hZGVyU2VjdGlvbiArIDEpKSArIChsb2FkZXJTZWN0aW9uLT5pbXBvcnRlZExpYnJhcnlDb3VudCAqIHNpemVvZihQRUZJbXBvcnRlZExpYnJhcnkpKSk7CisKKyAgICAvLyBHcmFiIHRoZSBhcHByb3ByaWF0ZSBlbnRyeSBvdXQgb2YgdGhlIHRhYmxlIGFuZAorICAgIC8vIGV4dHJhY3QgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhhdCBlbnRyeS4KKworICAgIHN5bWJvbFN0cmluZ09mZnNldCA9IGltcG9ydFN5bWJvbFRhYmxlW3N5bWJvbEluZGV4XTsKKyAgICBzeW1ib2xDbGFzcyA9IFBFRkltcG9ydGVkU3ltYm9sQ2xhc3Moc3ltYm9sU3RyaW5nT2Zmc2V0KTsKKyAgICBzeW1ib2xJc1dlYWsgPSAoKHN5bWJvbENsYXNzICYga1BFRldlYWtJbXBvcnRTeW1NYXNrKSAhPSAwKTsKKyAgICBzeW1ib2xDbGFzcyA9IHN5bWJvbENsYXNzICYgfmtQRUZXZWFrSW1wb3J0U3ltTWFzazsKKyAgICBzeW1ib2xTdHJpbmdPZmZzZXQgPSBQRUZJbXBvcnRlZFN5bWJvbE5hbWVPZmZzZXQoc3ltYm9sU3RyaW5nT2Zmc2V0KTsKKworICAgIC8vIEZpbmQgdGhlIHN0cmluZyBmb3IgdGhlIHN5bWJvbCBpbiB0aGUgc3RyaW5ncyB0YWJsZSBhbmQKKyAgICAvLyBleHRyYWN0IGl0IGZyb20gdGhlIHRhYmxlIGludG8gYSBQYXNjYWwgc3RyaW5nIG9uIHRoZSBzdGFjay4KKworICAgIHN5bWJvbFN0cmluZ0FkZHJlc3MgPSAoKGNoYXIgKilsb2FkZXJTZWN0aW9uKSArIGxvYWRlclNlY3Rpb24tPmxvYWRlclN0cmluZ3NPZmZzZXQgKyBzeW1ib2xTdHJpbmdPZmZzZXQ7CisgICAgc3ltYm9sU3RyaW5nWzBdID0gc3RybGVuKHN5bWJvbFN0cmluZ0FkZHJlc3MpOyAgICAgICAgICAgICAgLy8gKioqIHJlbW92ZSBBTlNJIHN0cmxlbgorICAgIEJsb2NrTW92ZURhdGEoc3ltYm9sU3RyaW5nQWRkcmVzcywgJnN5bWJvbFN0cmluZ1sxXSwgc3ltYm9sU3RyaW5nWzBdKTsKKworICAgIC8vIExvb2sgdXAgdGhlIHN5bWJvbCBpbiBzdWJzdGl0dXRlIGxpYnJhcnkuICBJZiBpdCBmYWlscywgcmV0dXJuCisgICAgLy8gYSAwIHZhbHVlIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBlcnJvciBpcyBmYXRhbCAoYSBzdHJvbmcgbGlua2VkCisgICAgLy8gc3ltYm9sKSBvciBiZW5pZ24gKGEgd2VhayBsaW5rZWQgc3ltYm9sKS4KKworICAgIGVyciA9IGxvb2t1cChzeW1ib2xTdHJpbmcsIHN5bWJvbENsYXNzLCAodm9pZCAqKikgc3ltYm9sVmFsdWUsIHJlZkNvbik7CisgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICAqc3ltYm9sVmFsdWUgPSAwOworICAgICAgICBpZiAoc3ltYm9sSXNXZWFrKSB7CisgICAgICAgICAgICBlcnIgPSBub0VycjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiAvLyBUaGUgRW5naW5lU3RhdGUgc3RydWN0dXJlIGVuY2Fwc3VsYXRlcyBhbGwgb2YgdGhlIHBlcnNpc3RlbnQgc3RhdGUKQEAgLTc3MSwxMyArNzcxLDEzIEBACiAvLyBpbnN0cnVjdGlvbmFsIGRlc2lnbi4KIAogc3RydWN0IEVuZ2luZVN0YXRlIHsKLQlVSW50MzIgY3VycmVudFJlbG9jOwkJLy8gSW5kZXggb2YgY3VycmVudCByZWxvY2F0aW9uIG9wY29kZXMKLQlVSW50MzIgdGVybWluYXRpbmdSZWxvYzsJLy8gSW5kZXggb2YgcmVsb2NhdGlvbiBvcGNvZGVzIHdoaWNoIHRlcm1pbmF0ZXMgcmVsb2NhdGlvbgotCVVJbnQzMiAqc2VjdGlvbkJhc2U7CQkvLyBTdGFydCBvZiB0aGUgc2VjdGlvbgotCVVJbnQzMiAqcmVsb2NBZGRyZXNzOwkJLy8gQWRkcmVzcyB3aXRoaW4gdGhlIHNlY3Rpb24gd2hlcmUgdGhlIHJlbG9jYXRpb25zIGFyZSB0byBiZSBwZXJmb3JtZWQKLQlVSW50MzIgaW1wb3J0SW5kZXg7CQkJLy8gU3ltYm9sIGluZGV4LCB3aGljaCBpcyB1c2VkIHRvIGFjY2VzcyBhbiBpbXBvcnRlZCBzeW1ib2wncyBhZGRyZXNzCi0Jdm9pZCAgKnNlY3Rpb25DOwkJCS8vIE1lbW9yeSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZCBzZWN0aW9uIHdpdGhpbiB0aGUgUEVGIGNvbnRhaW5lcjsgdGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IHJlbG9jYXRpb24gb3Bjb2RlcyB0aGF0IHJlbG9jYXRlIHNlY3Rpb24gYWRkcmVzc2VzCi0Jdm9pZCAgKnNlY3Rpb25EOwkJCS8vIE1lbW9yeSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZCBzZWN0aW9uIHdpdGhpbiB0aGUgUEVGIGNvbnRhaW5lcjsgdGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IHJlbG9jYXRpb24gb3Bjb2RlcyB0aGF0IHJlbG9jYXRlIHNlY3Rpb24gYWRkcmVzc2VzCisgICAgVUludDMyIGN1cnJlbnRSZWxvYzsgICAgICAgICAgICAgICAgLy8gSW5kZXggb2YgY3VycmVudCByZWxvY2F0aW9uIG9wY29kZXMKKyAgICBVSW50MzIgdGVybWluYXRpbmdSZWxvYzsgICAgICAgICAgICAvLyBJbmRleCBvZiByZWxvY2F0aW9uIG9wY29kZXMgd2hpY2ggdGVybWluYXRlcyByZWxvY2F0aW9uCisgICAgVUludDMyICpzZWN0aW9uQmFzZTsgICAgICAgICAgICAgICAgLy8gU3RhcnQgb2YgdGhlIHNlY3Rpb24KKyAgICBVSW50MzIgKnJlbG9jQWRkcmVzczsgICAgICAgICAgICAgICAvLyBBZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbiB3aGVyZSB0aGUgcmVsb2NhdGlvbnMgYXJlIHRvIGJlIHBlcmZvcm1lZAorICAgIFVJbnQzMiBpbXBvcnRJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ltYm9sIGluZGV4LCB3aGljaCBpcyB1c2VkIHRvIGFjY2VzcyBhbiBpbXBvcnRlZCBzeW1ib2wncyBhZGRyZXNzCisgICAgdm9pZCAgKnNlY3Rpb25DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1vcnkgYWRkcmVzcyBvZiBhbiBpbnN0YW50aWF0ZWQgc2VjdGlvbiB3aXRoaW4gdGhlIFBFRiBjb250YWluZXI7IHRoaXMgdmFyaWFibGUgaXMgdXNlZCBieSByZWxvY2F0aW9uIG9wY29kZXMgdGhhdCByZWxvY2F0ZSBzZWN0aW9uIGFkZHJlc3NlcworICAgIHZvaWQgICpzZWN0aW9uRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gd2l0aGluIHRoZSBQRUYgY29udGFpbmVyOyB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgcmVsb2NhdGlvbiBvcGNvZGVzIHRoYXQgcmVsb2NhdGUgc2VjdGlvbiBhZGRyZXNzZXMKIH07CiB0eXBlZGVmIHN0cnVjdCBFbmdpbmVTdGF0ZSBFbmdpbmVTdGF0ZTsKIApAQCAtNzg2LDgzICs3ODYsODMgQEAKIC8vIGhhdmUgdG8gYWRkIGEgcmVwZWF0IGNvdW50ZXIgdG8gRW5naW5lU3RhdGUuCiAKIHN0YXRpYyBPU1N0YXR1cyBJbml0RW5naW5lU3RhdGUoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LAotCQkJCQkJCQlVSW50MTYgcmVsb2NIZWFkZXJJbmRleCwKLQkJCQkJCQkJRW5naW5lU3RhdGUgKnN0YXRlKQotCS8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgZW5naW5lIHN0YXRlIHN1aXRhYmx5IGZvcgotCS8vIHJ1bm5pbmcgdGhlIHJlbG9jYXRpb24gb3Bjb2RlcyBmb3IgdGhlIHNlY3Rpb24gd2hvc2UKLQkvLyBpbmRleCBpcyByZWxvY0hlYWRlckluZGV4LiAgcmVsb2NIZWFkZXJJbmRleCBpcyBub3QgYQotCS8vIGEgc2VjdGlvbiBudW1iZXIuICBTZWUgdGhlIGNvbW1lbnQgd2hlcmUgaXQncyB1c2VkIGJlbG93Ci0JLy8gZm9yIGRldGFpbHMuICBUaGUgcm91dGluZSBiYXNpY2FsbHkgZmlsbHMgb3V0IGFsbCB0aGUgZmllbGRzCi0JLy8gaW4gdGhlIEVuZ2luZVN0YXRlIHN0cnVjdHVyZSBhcyBkZXNjcmliZWQgYnkKLQkvLyAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDE2IHJlbG9jSGVhZGVySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lU3RhdGUgKnN0YXRlKQorICAgIC8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgZW5naW5lIHN0YXRlIHN1aXRhYmx5IGZvcgorICAgIC8vIHJ1bm5pbmcgdGhlIHJlbG9jYXRpb24gb3Bjb2RlcyBmb3IgdGhlIHNlY3Rpb24gd2hvc2UKKyAgICAvLyBpbmRleCBpcyByZWxvY0hlYWRlckluZGV4LiAgcmVsb2NIZWFkZXJJbmRleCBpcyBub3QgYQorICAgIC8vIGEgc2VjdGlvbiBudW1iZXIuICBTZWUgdGhlIGNvbW1lbnQgd2hlcmUgaXQncyB1c2VkIGJlbG93CisgICAgLy8gZm9yIGRldGFpbHMuICBUaGUgcm91dGluZSBiYXNpY2FsbHkgZmlsbHMgb3V0IGFsbCB0aGUgZmllbGRzCisgICAgLy8gaW4gdGhlIEVuZ2luZVN0YXRlIHN0cnVjdHVyZSBhcyBkZXNjcmliZWQgYnkKKyAgICAvLyAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyIuCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVBFRkxvYWRlclJlbG9jYXRpb25IZWFkZXIgKnJlbG9jSGVhZGVyOwotCQotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHN0YXRlICE9IG5pbCk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFBFRkxvYWRlclJlbG9jYXRpb25IZWFkZXIgKnJlbG9jSGVhZGVyOwogCi0JLy8gVGhpcyBiaXQgaXMgdHJpY2t5LiAgcmVsb2NIZWFkZXJJbmRleCBpcyBhbiBpbmRleCBpbnRvIHRoZSByZWxvY2F0aW9uCi0JLy8gaGVhZGVyIHRhYmxlLCBzdGFydGluZyBhdCByZWxvY1NlY3Rpb25Db3VudCAod2hpY2ggaXMgaW4gdGhlIGxvYWRlcgotCS8vIHNlY3Rpb24gaGVhZGVyKSBmb3IgdGhlIGZpcnN0IHJlbG9jYXRlZCBzZWN0aW9uIGFuZCBkZWNyZW1lbnRpbmcKLQkvLyBkb3duIHRvIDEgZm9yIHRoZSBsYXN0IHJlbG9jYXRlZCBzZWN0aW9uLiAgSSBmaW5kIHRoZSByZWxvY2F0aW9uCi0JLy8gaGVhZGVyIGJ5IHVzaW5nIHJlbG9jSGVhZGVySW5kZXggYXMgYSBpbmRleCBiYWNrd2FyZHMgZnJvbSB0aGUKLQkvLyBzdGFydCBvZiB0aGUgcmVsb2NhdGlvbiBvcGNvZGVzIChpZSByZWxvY0luc3RyT2Zmc2V0KS4gIElmIHlvdQotCS8vIGxvb2sgYXQgdGhlIGRpYWdyYW0gb2YgdGhlIGxheW91dCBvZiB0aGUgY29udGFpbmVyIGluCi0JLy8gIlBFRkJpbmFyeUZvcm1hdC5oIiwgeW91J2xsIHNlZSB0aGF0IHRoZSByZWxvY2F0aW9uIG9wY29kZXMKLQkvLyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIHJlbG9jYXRpb24gaGVhZGVycy4KLQkvLwotCS8vIEkgZGlkIHRoaXMgYmVjYXVzZSB0aGUgYWx0ZXJuYXRpdmUgKHN0YXJ0aW5nIGF0IHRoZSBsb2FkZXIKLQkvLyBoZWFkZXIgYW5kIHN0ZXBwaW5nIHBhc3QgdGhlIGltcG9ydCBsaWJyYXJ5IHRhYmxlIGFuZCB0aGUKLQkvLyBpbXBvcnQgc3ltYm9sIHRhYmxlKSB3YXMgYSBwYWluLgorICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHN0YXRlICE9IG5pbCk7CiAKLQlyZWxvY0hlYWRlciA9IChQRUZMb2FkZXJSZWxvY2F0aW9uSGVhZGVyICopICgoKGNoYXIgKikgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uKSArIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NJbnN0ck9mZnNldCAtIHJlbG9jSGVhZGVySW5kZXggKiBzaXplb2YoUEVGTG9hZGVyUmVsb2NhdGlvbkhlYWRlcikpOwotCQotCU1vcmVBc3NlcnRRKHJlbG9jSGVhZGVyLT5yZXNlcnZlZEEgPT0gMCk7CQkvLyBQRUYgc3BlYyBzYXlzIGl0IG11c3QgYmU7IHdlIGNoZWNrIHRvIHRyeSB0byBjYXRjaCBidWdzIGluIGNhbGN1bGF0aW9uIG9mIHJlbG9jSGVhZGVyCi0JCi0Jc3RhdGUtPmN1cnJlbnRSZWxvYyA9IHJlbG9jSGVhZGVyLT5maXJzdFJlbG9jT2Zmc2V0OwotCXN0YXRlLT50ZXJtaW5hdGluZ1JlbG9jID0gcmVsb2NIZWFkZXItPmZpcnN0UmVsb2NPZmZzZXQgKyByZWxvY0hlYWRlci0+cmVsb2NDb3VudDsKLQlzdGF0ZS0+c2VjdGlvbkJhc2UgPSAoVUludDMyICopIEdldFNlY3Rpb25CYXNlQWRkcmVzcyhmcmFnVG9GaXgsIHJlbG9jSGVhZGVyLT5zZWN0aW9uSW5kZXgpOwotCXN0YXRlLT5yZWxvY0FkZHJlc3MgPSBzdGF0ZS0+c2VjdGlvbkJhc2U7Ci0Jc3RhdGUtPmltcG9ydEluZGV4ID0gMDsKKyAgICAvLyBUaGlzIGJpdCBpcyB0cmlja3kuICByZWxvY0hlYWRlckluZGV4IGlzIGFuIGluZGV4IGludG8gdGhlIHJlbG9jYXRpb24KKyAgICAvLyBoZWFkZXIgdGFibGUsIHN0YXJ0aW5nIGF0IHJlbG9jU2VjdGlvbkNvdW50ICh3aGljaCBpcyBpbiB0aGUgbG9hZGVyCisgICAgLy8gc2VjdGlvbiBoZWFkZXIpIGZvciB0aGUgZmlyc3QgcmVsb2NhdGVkIHNlY3Rpb24gYW5kIGRlY3JlbWVudGluZworICAgIC8vIGRvd24gdG8gMSBmb3IgdGhlIGxhc3QgcmVsb2NhdGVkIHNlY3Rpb24uICBJIGZpbmQgdGhlIHJlbG9jYXRpb24KKyAgICAvLyBoZWFkZXIgYnkgdXNpbmcgcmVsb2NIZWFkZXJJbmRleCBhcyBhIGluZGV4IGJhY2t3YXJkcyBmcm9tIHRoZQorICAgIC8vIHN0YXJ0IG9mIHRoZSByZWxvY2F0aW9uIG9wY29kZXMgKGllIHJlbG9jSW5zdHJPZmZzZXQpLiAgSWYgeW91CisgICAgLy8gbG9vayBhdCB0aGUgZGlhZ3JhbSBvZiB0aGUgbGF5b3V0IG9mIHRoZSBjb250YWluZXIgaW4KKyAgICAvLyAiUEVGQmluYXJ5Rm9ybWF0LmgiLCB5b3UnbGwgc2VlIHRoYXQgdGhlIHJlbG9jYXRpb24gb3Bjb2RlcworICAgIC8vIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgcmVsb2NhdGlvbiBoZWFkZXJzLgorICAgIC8vCisgICAgLy8gSSBkaWQgdGhpcyBiZWNhdXNlIHRoZSBhbHRlcm5hdGl2ZSAoc3RhcnRpbmcgYXQgdGhlIGxvYWRlcgorICAgIC8vIGhlYWRlciBhbmQgc3RlcHBpbmcgcGFzdCB0aGUgaW1wb3J0IGxpYnJhcnkgdGFibGUgYW5kIHRoZQorICAgIC8vIGltcG9ydCBzeW1ib2wgdGFibGUpIHdhcyBhIHBhaW4uCiAKLQkvLyBGcm9tICJNYWMgT1MgUnVudGltZSBBcmNoaXRlY3R1cmVzIjoKLQkvLwotCS8vIFRoZSBzZWN0aW9uQyBhbmQgc2VjdGlvbkQgdmFyaWFibGVzIGFjdHVhbGx5IGNvbnRhaW4gdGhlCi0JLy8gbWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gbWludXMgdGhlCi0JLy8gZGVmYXVsdCBhZGRyZXNzIGZvciB0aGF0IHNlY3Rpb24uIFRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIGEKLQkvLyBzZWN0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgZGVmYXVsdEFkZHJlc3MgZmllbGQgb2YgdGhlCi0JLy8gc2VjdGlvbiBoZWFkZXIuIEhvd2V2ZXIsIGluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIGRlZmF1bHQKLQkvLyBhZGRyZXNzIHNob3VsZCBiZSAwLCBzbyB0aGUgc2ltcGxpZmllZCBkZWZpbml0aW9uIHN1ZmZpY2VzLgotCS8vIAotCS8vIEluIHRoZSBkZWJ1ZyB2ZXJzaW9uLCB3ZSBkcm9wIGludG8gTWFjc0J1ZyBpZiB0aGlzIHdlaXJkIGNhc2UKLQkvLyBldmVyIGV4ZWN1dGVzIGJlY2F1c2UgaXQncyBtb3JlIGxpa2VseSB3ZSBtYWRlIGEgbWlzdGFrZSB0aGFuCi0JLy8gd2UgZW5jb3VudGVyZWQgYSBzZWN0aW9uIHdpdGggYSBkZWZhdWx0IGFkZHJlc3MuCisgICAgcmVsb2NIZWFkZXIgPSAoUEVGTG9hZGVyUmVsb2NhdGlvbkhlYWRlciAqKSAoKChjaGFyICopIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbikgKyBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jSW5zdHJPZmZzZXQgLSByZWxvY0hlYWRlckluZGV4ICogc2l6ZW9mKFBFRkxvYWRlclJlbG9jYXRpb25IZWFkZXIpKTsKIAotCXN0YXRlLT5zZWN0aW9uQyA9IEdldFNlY3Rpb25CYXNlQWRkcmVzcyhmcmFnVG9GaXgsIDApOwotCWlmIChzdGF0ZS0+c2VjdGlvbkMgIT0gbmlsKSB7Ci0JCSNpZiBNT1JFX0RFQlVHCi0JCQlpZiAoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1swXS5kZWZhdWx0QWRkcmVzcyAhPSAwKSB7Ci0JCQkJRGVidWdTdHIoIlxwSW5pdEVuZ2luZVN0YXRlOiBFeGVjdXRpbmcgd2VpcmQgY2FzZS4iKTsKLQkJCX0KLQkJI2VuZGlmCi0JCShjaGFyICopIHN0YXRlLT5zZWN0aW9uQyAtPSBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzWzBdLmRlZmF1bHRBZGRyZXNzOwotCX0KLQlzdGF0ZS0+c2VjdGlvbkQgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCAxKTsKLQlpZiAoc3RhdGUtPnNlY3Rpb25EICE9IG5pbCkgewotCQkjaWYgTU9SRV9ERUJVRwotCQkJaWYgKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMV0uZGVmYXVsdEFkZHJlc3MgIT0gMCkgewotCQkJCURlYnVnU3RyKCJccEluaXRFbmdpbmVTdGF0ZTogRXhlY3V0aW5nIHdlaXJkIGNhc2UuIik7Ci0JCQl9Ci0JCSNlbmRpZgotCQkoY2hhciAqKSBzdGF0ZS0+c2VjdGlvbkQgLT0gZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1sxXS5kZWZhdWx0QWRkcmVzczsKLQl9CisgICAgTW9yZUFzc2VydFEocmVsb2NIZWFkZXItPnJlc2VydmVkQSA9PSAwKTsgICAgICAgICAgICAgICAgICAgLy8gUEVGIHNwZWMgc2F5cyBpdCBtdXN0IGJlOyB3ZSBjaGVjayB0byB0cnkgdG8gY2F0Y2ggYnVncyBpbiBjYWxjdWxhdGlvbiBvZiByZWxvY0hlYWRlcgogCi0JZXJyID0gbm9FcnI7Ci0JaWYgKHN0YXRlLT5yZWxvY0FkZHJlc3MgPT0gbmlsKSB7Ci0JCWVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBzdGF0ZS0+Y3VycmVudFJlbG9jID0gcmVsb2NIZWFkZXItPmZpcnN0UmVsb2NPZmZzZXQ7CisgICAgc3RhdGUtPnRlcm1pbmF0aW5nUmVsb2MgPSByZWxvY0hlYWRlci0+Zmlyc3RSZWxvY09mZnNldCArIHJlbG9jSGVhZGVyLT5yZWxvY0NvdW50OworICAgIHN0YXRlLT5zZWN0aW9uQmFzZSA9IChVSW50MzIgKikgR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgcmVsb2NIZWFkZXItPnNlY3Rpb25JbmRleCk7CisgICAgc3RhdGUtPnJlbG9jQWRkcmVzcyA9IHN0YXRlLT5zZWN0aW9uQmFzZTsKKyAgICBzdGF0ZS0+aW1wb3J0SW5kZXggPSAwOworCisgICAgLy8gRnJvbSAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyI6CisgICAgLy8KKyAgICAvLyBUaGUgc2VjdGlvbkMgYW5kIHNlY3Rpb25EIHZhcmlhYmxlcyBhY3R1YWxseSBjb250YWluIHRoZQorICAgIC8vIG1lbW9yeSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZCBzZWN0aW9uIG1pbnVzIHRoZQorICAgIC8vIGRlZmF1bHQgYWRkcmVzcyBmb3IgdGhhdCBzZWN0aW9uLiBUaGUgZGVmYXVsdCBhZGRyZXNzIGZvciBhCisgICAgLy8gc2VjdGlvbiBpcyBjb250YWluZWQgaW4gdGhlIGRlZmF1bHRBZGRyZXNzIGZpZWxkIG9mIHRoZQorICAgIC8vIHNlY3Rpb24gaGVhZGVyLiBIb3dldmVyLCBpbiBhbG1vc3QgYWxsIGNhc2VzIHRoZSBkZWZhdWx0CisgICAgLy8gYWRkcmVzcyBzaG91bGQgYmUgMCwgc28gdGhlIHNpbXBsaWZpZWQgZGVmaW5pdGlvbiBzdWZmaWNlcy4KKyAgICAvLworICAgIC8vIEluIHRoZSBkZWJ1ZyB2ZXJzaW9uLCB3ZSBkcm9wIGludG8gTWFjc0J1ZyBpZiB0aGlzIHdlaXJkIGNhc2UKKyAgICAvLyBldmVyIGV4ZWN1dGVzIGJlY2F1c2UgaXQncyBtb3JlIGxpa2VseSB3ZSBtYWRlIGEgbWlzdGFrZSB0aGFuCisgICAgLy8gd2UgZW5jb3VudGVyZWQgYSBzZWN0aW9uIHdpdGggYSBkZWZhdWx0IGFkZHJlc3MuCisKKyAgICBzdGF0ZS0+c2VjdGlvbkMgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCAwKTsKKyAgICBpZiAoc3RhdGUtPnNlY3Rpb25DICE9IG5pbCkgeworICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgaWYgKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMF0uZGVmYXVsdEFkZHJlc3MgIT0gMCkgeworICAgICAgICAgICAgICAgIERlYnVnU3RyKCJccEluaXRFbmdpbmVTdGF0ZTogRXhlY3V0aW5nIHdlaXJkIGNhc2UuIik7CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICAoY2hhciAqKSBzdGF0ZS0+c2VjdGlvbkMgLT0gZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1swXS5kZWZhdWx0QWRkcmVzczsKKyAgICB9CisgICAgc3RhdGUtPnNlY3Rpb25EID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgMSk7CisgICAgaWYgKHN0YXRlLT5zZWN0aW9uRCAhPSBuaWwpIHsKKyAgICAgICAgI2lmIE1PUkVfREVCVUcKKyAgICAgICAgICAgIGlmIChmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzWzFdLmRlZmF1bHRBZGRyZXNzICE9IDApIHsKKyAgICAgICAgICAgICAgICBEZWJ1Z1N0cigiXHBJbml0RW5naW5lU3RhdGU6IEV4ZWN1dGluZyB3ZWlyZCBjYXNlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgKGNoYXIgKikgc3RhdGUtPnNlY3Rpb25EIC09IGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMV0uZGVmYXVsdEFkZHJlc3M7CisgICAgfQorCisgICAgZXJyID0gbm9FcnI7CisgICAgaWYgKHN0YXRlLT5yZWxvY0FkZHJlc3MgPT0gbmlsKSB7CisgICAgICAgIGVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogLy8ga1BFRlJlbG9jQmFzaWNPcGNvZGVzIGlzIGEgdGFibGUgdGhhdCBtYXBzIHRoZSB0b3AgNyBiaXRzIG9mIHRoZSBvcGNvZGUKQEAgLTg3MSw0OTAgKzg3MSw0OTAgQEAKIAogc3RhdGljIFVJbnQ4IGtQRUZSZWxvY0Jhc2ljT3Bjb2Rlc1trUEVGUmVsb2NCYXNpY09wY29kZVJhbmdlXSA9IHsgUEVGTWFza2VkQmFzaWNPcGNvZGVzIH07CiAKLXN0YXRpYyBPU1N0YXR1cyBSdW5SZWxvY2F0aW9uRW5naW5lKGNvbnN0IEZyYWdUb0ZpeEluZm8gKmZyYWdUb0ZpeCwgCi0JCQkJCQkJCQkJUEVGSW1wb3J0ZWRMaWJyYXJ5ICAqaW1wb3J0TGlicmFyeSwgCi0JCQkJCQkJCQkJQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgbG9va3VwLCB2b2lkICpyZWZDb24pCi0JLy8gVGhpcyBpcyB3aGVyZSB0aGUgcnViYmVyIHJlYWxseSBoaXRzIHRoZS4gIEdpdmVuIGEgZnVsbHkKLQkvLyBwb3B1bGF0ZWQgZnJhZ1RvRml4IHN0cnVjdHVyZSwgdGhlIGltcG9ydCBsaWJyYXJ5IGRlc2NyaXB0aW9uCi0JLy8gb2YgdGhlIHdlYWsgaW1wb3J0ZWQgbGlicmFyeSB3ZSdyZSByZXNvbHZpbmcsIGFuZCBhIGNvbm5lY3Rpb24KLQkvLyB0byB0aGUgbGlicmFyeSB3ZSdyZSBnb2luZyB0byBzdWJzdGl0dXRlIGl0LCByZS1leGVjdXRlIHRoZQotCS8vIHJlbG9jYXRpb24gaW5zdHJ1Y3Rpb25zIChDRk0gaGFzIGFscmVhZHkgZXhlY3V0ZWQgdGhlbSBvbmNlKQotCS8vIGJ1dCBvbmx5ICpkbyogaW5zdHJ1Y3Rpb25zIChpZSBzdG9yZSB0aGUgY2hhbmdlIHRvIHRoZSBkYXRhIHNlY3Rpb24pCi0JLy8gdGhhdCBDRk0gc2tpcHBlZCBiZWNhdXNlIHRoZSB3ZWFrIHN5bWJvbHMgd2VyZSBtaXNzaW5nLgorc3RhdGljIE9TU3RhdHVzIFJ1blJlbG9jYXRpb25FbmdpbmUoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUZJbXBvcnRlZExpYnJhcnkgICppbXBvcnRMaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBsb29rdXAsIHZvaWQgKnJlZkNvbikKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgcmVhbGx5IGhpdHMgdGhlLiAgR2l2ZW4gYSBmdWxseQorICAgIC8vIHBvcHVsYXRlZCBmcmFnVG9GaXggc3RydWN0dXJlLCB0aGUgaW1wb3J0IGxpYnJhcnkgZGVzY3JpcHRpb24KKyAgICAvLyBvZiB0aGUgd2VhayBpbXBvcnRlZCBsaWJyYXJ5IHdlJ3JlIHJlc29sdmluZywgYW5kIGEgY29ubmVjdGlvbgorICAgIC8vIHRvIHRoZSBsaWJyYXJ5IHdlJ3JlIGdvaW5nIHRvIHN1YnN0aXR1dGUgaXQsIHJlLWV4ZWN1dGUgdGhlCisgICAgLy8gcmVsb2NhdGlvbiBpbnN0cnVjdGlvbnMgKENGTSBoYXMgYWxyZWFkeSBleGVjdXRlZCB0aGVtIG9uY2UpCisgICAgLy8gYnV0IG9ubHkgKmRvKiBpbnN0cnVjdGlvbnMgKGllIHN0b3JlIHRoZSBjaGFuZ2UgdG8gdGhlIGRhdGEgc2VjdGlvbikKKyAgICAvLyB0aGF0IENGTSBza2lwcGVkIGJlY2F1c2UgdGhlIHdlYWsgc3ltYm9scyB3ZXJlIG1pc3NpbmcuCiB7Ci0JT1NTdGF0dXMgCWVycjsKLQlFbmdpbmVTdGF0ZQlzdGF0ZTsKLQlVSW50MTYgCQlzZWN0aW9uc0xlZnRUb1JlbG9jYXRlOwotCVVJbnQzMiAJCXRvdGFsUmVsb2NzOwotCVVJbnQxNgkJKnJlbG9jSW5zdHJUYWJsZTsKLQlVSW50MTYgCQlvcENvZGU7Ci0JCi0JTW9yZUFzc2VydFEoZnJhZ1RvRml4ICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIudGFnMSA9PSBrUEVGVGFnMSk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+c2VjdGlvbjBCYXNlICE9IG5pbCk7CS8vIFRlY2huaWNhbGx5LCBoYXZpbmcgYSBuaWwgZm9yIHRoZXNlIHR3byBpcyBub3QgYSBwcm9ibGVtLCAuLi4KLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb24xQmFzZSAhPSBuaWwpOwkvLyBidXQgaW4gcHJhY3Rpc2UgaXQgYSB3aWxkbHkgZGV2aWFudCBjYXNlIGFuZCB3ZSBzaG91bGQga25vdyBhYm91dCBpdC4KLQlNb3JlQXNzZXJ0UShpbXBvcnRMaWJyYXJ5ICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7CisgICAgT1NTdGF0dXMgICAgICAgICAgICBlcnI7CisgICAgRW5naW5lU3RhdGUgICAgICAgICBzdGF0ZTsKKyAgICBVSW50MTYgICAgICAgICAgICAgIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGU7CisgICAgVUludDMyICAgICAgICAgICAgICB0b3RhbFJlbG9jczsKKyAgICBVSW50MTYgICAgICAgICAgICAgICpyZWxvY0luc3RyVGFibGU7CisgICAgVUludDE2ICAgICAgICAgICAgICBvcENvZGU7CiAKLQkvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGxvb3AsIHdvcmsgb3V0IHNvbWUgaW5mb3JtYXRpb24gaW4gYWR2YW5jZS4KKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXggIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcxID09IGtQRUZUYWcxKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uMEJhc2UgIT0gbmlsKTsgICAgICAgIC8vIFRlY2huaWNhbGx5LCBoYXZpbmcgYSBuaWwgZm9yIHRoZXNlIHR3byBpcyBub3QgYSBwcm9ibGVtLCAuLi4KKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb24xQmFzZSAhPSBuaWwpOyAgICAgICAgLy8gYnV0IGluIHByYWN0aXNlIGl0IGEgd2lsZGx5IGRldmlhbnQgY2FzZSBhbmQgd2Ugc2hvdWxkIGtub3cgYWJvdXQgaXQuCisgICAgTW9yZUFzc2VydFEoaW1wb3J0TGlicmFyeSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGxvb2t1cCAhPSBuaWwpOwogCi0JLy8gdG90YWxSZWxvY3MgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHRvIG1ha2Ugc3VyZSBvdXIKLQkvLyByZWxvY2F0aW9uIFBDIChzdGF0ZS5jdXJyZW50UmVsb2MpIGRvZXNuJ3QgcnVuIHdpbGQuCi0JCi0JdG90YWxSZWxvY3MgPSAoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5sb2FkZXJTdHJpbmdzT2Zmc2V0IC0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY0luc3RyT2Zmc2V0KSAvIHNpemVvZihVSW50MTYpOwotCQotCS8vIHJlbG9jSW5zdHJUYWJsZSBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSB0YWJsZSBvZiByZWxvY2F0aW9uCi0JLy8gaW5zdHJ1Y3Rpb25zIGluIHRoZSBmcmFnbWVudCB0byBmaXguCi0JCi0JcmVsb2NJbnN0clRhYmxlID0gKFVJbnQxNiAqKSgoY2hhciAqKSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24gKyBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jSW5zdHJPZmZzZXQpOwotCQotCS8vIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgaXMgdGhlIGxvb3AgY291bnRlciBmb3IgdGhlIG91dGVyIGxvb3AuCi0JCi0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY1NlY3Rpb25Db3VudCA8PSAweDBGRkZGKTsKLQlzZWN0aW9uc0xlZnRUb1JlbG9jYXRlID0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY1NlY3Rpb25Db3VudDsKKyAgICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGxvb3AsIHdvcmsgb3V0IHNvbWUgaW5mb3JtYXRpb24gaW4gYWR2YW5jZS4KIAotCS8vIE5vdyBsZXQncyBydW4gdGhlIHJlbG9jYXRpb24gZW5naW5lLiAgV2UgcnVuIGl0IG9uY2UgcGVyCi0JLy8gc2VjdGlvbiBpbiB0aGUgdGFibGUuICBFYWNoIHRpbWUgYXJvdW5kLCB3ZSBpbml0IHRoZSBlbmdpbmUKLQkvLyBhbmQgdGhlbiBsb29wIGFnYWluLCB0aGlzIHRpbWUgZXhlY3V0aW5nIGluZGl2aWR1YWwgb3Bjb2Rlcy4KLQkvLyBUaGUgb3Bjb2RlIGxvb3AgdGVybWluYXRlcyB3aGVuIHRoZSByZWxvY2F0aW9uIFBDCi0JLy8gKHN0YXRlLmN1cnJlbnRSZWxvYykgaGl0cyB0aGUgZmluYWwgb3Bjb2RlIChzdGF0ZS50ZXJtaW5hdGluZ1JlbG9jKS4KLQkKLQkvLyBOb3RlOgotCS8vIE9uZSBkZXNpZ24gZGVjaXNpb24gSSBtYWRlIHdhcyB0byB0b3RhbGx5IHJlLWluaXQgdGhlIGVuZ2luZSBzdGF0ZQotCS8vIGZvciBlYWNoIHNlY3Rpb24uICBUaGUgQ0ZNIHNwZWMgaXMgdW5jbGVhciBhcyB0byB3aGV0aGVyIHlvdSdyZSBzdXBwb3NlZAotCS8vIHRvIHRvdGFsbHkgcmUtaW5pdCB0aGUgZW5naW5lIHN0YXRlLCBvciBqdXN0IHJlLWluaXQgdGhlIHNlY3Rpb24tc3BlY2lmaWMKLQkvLyBzdGF0ZSAoaWUgY3VycmVudFJlbG9jLCB0ZXJtaW5hdGluZ1JlbG9jLCBhbmQgcmVsb2NBZGRyZXNzKS4gIEkgaG9wZSB0aGlzCi0JLy8gaXMgY29ycmVjdCwgYnV0IGl0J3MgaGFyZCB0byB0ZXN0IHdpdGhvdXQgaGF2aW5nIGEgZnJhZ21lbnQgd2l0aCBtdWx0aXBsZQotCS8vIHJlbG9jYXRlZCBzZWN0aW9ucywgd2hpY2ggaXMgZGlmZmljdWx0IHRvIGNyZWF0ZS4KLQkKLQkvLyBIb3cgZG8gSSBkZWNpZGUgd2hpY2ggb3Bjb2RlcyBzaG91bGQgYmUgZWZmZWN0aXZlIChpZSBtYWtlIGNoYW5nZXMgdG8KLQkvLyB0aGUgc2VjdGlvbiBiZWluZyByZWxvY2F0ZWQpIGFuZCB3aGljaCBvcGNvZGVzIHNob3VsZCBqdXN0IGJlIGV4ZWN1dGVkCi0JLy8gZm9yIHRoZWlyIHNpZGUgZWZmZWN0cyAoaWUgdXBkYXRlZCBzdGF0ZS5yZWxvY0FkZHJlc3Mgb3Igc3RhdGUuaW1wb3J0SW5kZXgpPwotCS8vIFRoZSBhbnN3ZXIgaXMgYm90aCBzaW1wbGUgYW5kIHN1YnRsZS4gIE9wY29kZXMgd2hvc2UgYWN0aW9ucyBhcmUgZGVwZW5kZW50Ci0JLy8gb24gYSBzeW1ib2wgdGhhdCB3YXMgaW4gdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkgYXJlIGVmZmVjdGl2ZSwgdGhvc2UgdGhhdAotCS8vIGFuIGluZGVwZW5kZW50IG9mIHRob3NlIHN5bWJvbHMgYXJlIG5vdC4gIFRoZSBvbmx5IG9wY29kZXMgdGhhdCB1c2UKLQkvLyBzeW1ib2xpYyB2YWx1ZXMgYXJlIGtQRUZSZWxvY0ltcG9ydFJ1biBhbmQga1BFRlJlbG9jU21CeUltcG9ydCwgYW5kCi0JLy8gdGhlc2UgYXJlIG9ubHkgaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeS4KLQkvLyBBbGwgb3RoZXIgY2FzZXMgYXJlIGV4ZWN1dGVkIGZvciB0aGVpciBzaWRlIGVmZmVjdHMgb25seS4KLQkvLwotCS8vIEhvdyBkbyBJIGRldGVybWluZSBpZiBhIHN5bWJvbCBpcyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeT8KLQkvLyBXZWxsIEkga25vdyB0aGUgc3ltYm9sJ3MgaW5kZXggYW5kIEkga25vdyB0aGUgbG93ZXIgYm91bmQgYW5kIGNvdW50Ci0JLy8gb2YgdGhlIHN5bWJvbHMgaW4gdGhlIHdlYWsgbGlua2VkIGxpYnJhcnksIHNvIEkganVzdCBkbyBhIHNpbXBsZQotCS8vIGJvdW5kcyB0ZXN0LCBpZSAKLQkvLwotCS8vICAgZmlyc3RJbXBvcnRlZFN5bWJvbCA8PSBpbXBvcnRJbmRleCA8IGZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRlZFN5bWJvbENvdW50CisgICAgLy8gdG90YWxSZWxvY3MgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHRvIG1ha2Ugc3VyZSBvdXIKKyAgICAvLyByZWxvY2F0aW9uIFBDIChzdGF0ZS5jdXJyZW50UmVsb2MpIGRvZXNuJ3QgcnVuIHdpbGQuCiAKLQkvLyBGcm9tIHRoaXMgY29kZSwgaXQncyByZWxhdGl2ZWx5IGVhc3kgdG8gc2VlIHdoaWNoIHJlbG9jYXRpb24gb3Bjb2RlcwotCS8vIGFyZW4ndCBpbXBsZW1lbnRlZC4gIElmIHlvdSBldmVyIGVuY291bnRlciBvbmUsIHlvdSdsbCBmaW5kIHlvdXJzZWxmCi0JLy8gaW4gTWFjc0J1ZyB3aXRoIGEgbWVzc2FnZSB0ZWxsaW5nIHlvdSB3aGljaCBvcGNvZGUgd2FzIGZvdW5kLiAgVGhlCi0JLy8gdHdvIGJpZyBncm91cHMgb2Ygb3Bjb2RlcyBJIHNraXBwZWQgd2VyZSB0aGUgbGFyZ2UgZm9ybWF0IG9wY29kZXMKLQkvLyBhbmQgdGhlIHJlcGVhdGluZyBvcGNvZGVzLiAgSSBza2lwcGVkIHRoZW0gYmVjYXVzZToKLQkvLwotCS8vIGEpIEkgaGF2ZW4ndCBnb3QgYSB3YXkgdG8gZ2VuZXJhdGUgdGhlbSBpbiBhIFBFRiBjb250YWluZXIgdGhhdCBJIGNhbiAKLQkvLyAgICB0ZXN0IGFnYWluc3QuIFdpdGhvdXQgdGhhdCwgdGhlcmUncyBubyB3YXkgSSBjb3VsZCBiZSBhc3N1cmVkIHRoYXQKLQkvLyAgICB0aGUgY29kZSB3b3JrZWQuCi0JLy8KLQkvLyBiKSBJJ20gbGF6eS4KKyAgICB0b3RhbFJlbG9jcyA9IChmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmxvYWRlclN0cmluZ3NPZmZzZXQgLSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jSW5zdHJPZmZzZXQpIC8gc2l6ZW9mKFVJbnQxNik7CiAKLQllcnIgPSBub0VycjsKLQl3aGlsZSAoIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgPiAwICkgewotCQllcnIgPSBJbml0RW5naW5lU3RhdGUoZnJhZ1RvRml4LCBzZWN0aW9uc0xlZnRUb1JlbG9jYXRlLCAmc3RhdGUpOwotCQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCQlnb3RvIGxlYXZlTm93OwotCQl9Ci0JCQotCQl3aGlsZSAoIHN0YXRlLmN1cnJlbnRSZWxvYyAhPSBzdGF0ZS50ZXJtaW5hdGluZ1JlbG9jICkgewotCQkJCi0JCQlNb3JlQXNzZXJ0USggc3RhdGUuY3VycmVudFJlbG9jIDwgdG90YWxSZWxvY3MgKTsKKyAgICAvLyByZWxvY0luc3RyVGFibGUgaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgdGFibGUgb2YgcmVsb2NhdGlvbgorICAgIC8vIGluc3RydWN0aW9ucyBpbiB0aGUgZnJhZ21lbnQgdG8gZml4LgogCi0JCQlvcENvZGUgPSByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXTsKLQkJCXN3aXRjaCAoIFBFRlJlbG9jQmFzaWNPcGNvZGUob3BDb2RlKSApIHsKLQkJCQljYXNlIGtQRUZSZWxvY0J5U2VjdERXaXRoU2tpcDoKLQkJCQkJewotCQkJCQkJVUludDE2IHNraXBDb3VudDsKLQkJCQkJCVVJbnQxNiByZWxvY0NvdW50OwotCQkJCQkJCi0JCQkJCQlza2lwQ291bnQgPSAoKG9wQ29kZSA+PiA2KSAmIDB4MDBGRik7Ci0JCQkJCQlyZWxvY0NvdW50ID0gKG9wQ29kZSAmIDB4MDAzRik7Ci0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gc2tpcENvdW50OwotCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IHJlbG9jQ291bnQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NCeVNlY3RDOgotCQkJCWNhc2Uga1BFRlJlbG9jQnlTZWN0RDoKLQkJCQkJewotCQkJCQkJVUludDE2IHJ1bkxlbmd0aDsKKyAgICByZWxvY0luc3RyVGFibGUgPSAoVUludDE2ICopKChjaGFyICopIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiArIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NJbnN0ck9mZnNldCk7CiAKLQkJCQkJCXJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKLQkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSBydW5MZW5ndGg7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NUVmVjdG9yMTI6Ci0JCQkJCXsKLQkJCQkJCVVJbnQxNiBydW5MZW5ndGg7CisgICAgLy8gc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSBpcyB0aGUgbG9vcCBjb3VudGVyIGZvciB0aGUgb3V0ZXIgbG9vcC4KIAotCQkJCQkJcnVuTGVuZ3RoID0gKG9wQ29kZSAmIDB4MDFGRikgKyAxOwotCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IChydW5MZW5ndGggKiAzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY1RWZWN0b3I4OgotCQkJCWNhc2Uga1BFRlJlbG9jVlRhYmxlODoKLQkJCQkJewotCQkJCQkJVUludDE2IHJ1bkxlbmd0aDsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jU2VjdGlvbkNvdW50IDw9IDB4MEZGRkYpOworICAgIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jU2VjdGlvbkNvdW50OwogCi0JCQkJCQlydW5MZW5ndGggPSAob3BDb2RlICYgMHgwMUZGKSArIDE7Ci0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gKHJ1bkxlbmd0aCAqIDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jSW1wb3J0UnVuOgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgc3ltYm9sVmFsdWU7Ci0JCQkJCQlVSW50MTYgcnVuTGVuZ3RoOwotCQkJCQkJCi0JCQkJCQlydW5MZW5ndGggPSAob3BDb2RlICYgMHgwMUZGKSArIDE7Ci0JCQkJCQl3aGlsZSAocnVuTGVuZ3RoID4gMCkgewotCQkJCQkJCWlmICggc3RhdGUuaW1wb3J0SW5kZXggPj0gaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCAmJiBzdGF0ZS5pbXBvcnRJbmRleCA8IChpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0TGlicmFyeS0+aW1wb3J0ZWRTeW1ib2xDb3VudCkgKSB7Ci0JCQkJCQkJCWVyciA9IExvb2t1cFN5bWJvbChsb29rdXAsIHJlZkNvbiwgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLCBzdGF0ZS5pbXBvcnRJbmRleCwgJnN5bWJvbFZhbHVlKTsKLQkJCQkJCQkJaWYgKGVyciAhPSBub0VycikgewotCQkJCQkJCQkJZ290byBsZWF2ZU5vdzsKLQkJCQkJCQkJfQotCQkJCQkJCQkqKHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gc3ltYm9sVmFsdWU7Ci0JCQkJCQkJfQotCQkJCQkJCXN0YXRlLmltcG9ydEluZGV4ICs9IDE7Ci0JCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IDE7Ci0JCQkJCQkJcnVuTGVuZ3RoIC09IDE7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NTbUJ5SW1wb3J0OgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgc3ltYm9sVmFsdWU7Ci0JCQkJCQlVSW50MzIgaW5kZXg7CisgICAgLy8gTm93IGxldCdzIHJ1biB0aGUgcmVsb2NhdGlvbiBlbmdpbmUuICBXZSBydW4gaXQgb25jZSBwZXIKKyAgICAvLyBzZWN0aW9uIGluIHRoZSB0YWJsZS4gIEVhY2ggdGltZSBhcm91bmQsIHdlIGluaXQgdGhlIGVuZ2luZQorICAgIC8vIGFuZCB0aGVuIGxvb3AgYWdhaW4sIHRoaXMgdGltZSBleGVjdXRpbmcgaW5kaXZpZHVhbCBvcGNvZGVzLgorICAgIC8vIFRoZSBvcGNvZGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW4gdGhlIHJlbG9jYXRpb24gUEMKKyAgICAvLyAoc3RhdGUuY3VycmVudFJlbG9jKSBoaXRzIHRoZSBmaW5hbCBvcGNvZGUgKHN0YXRlLnRlcm1pbmF0aW5nUmVsb2MpLgogCi0JCQkJCQlpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOwotCQkJCQkJaWYgKCBpbmRleCA+PSBpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICYmIGluZGV4IDwgKGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRMaWJyYXJ5LT5pbXBvcnRlZFN5bWJvbENvdW50KSApIHsKLQkJCQkJCQllcnIgPSBMb29rdXBTeW1ib2wobG9va3VwLCByZWZDb24sIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiwgaW5kZXgsICZzeW1ib2xWYWx1ZSk7Ci0JCQkJCQkJaWYgKGVyciAhPSBub0VycikgewotCQkJCQkJCQlnb3RvIGxlYXZlTm93OwotCQkJCQkJCX0KLQkJCQkJCQkqKHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gc3ltYm9sVmFsdWU7Ci0JCQkJCQl9Ci0JCQkJCQlzdGF0ZS5pbXBvcnRJbmRleCA9IGluZGV4ICsgMTsKLQkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSAxOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21TZXRTZWN0QzoKLQkJCQkJewotCQkJCQkJVUludDMyIGluZGV4OworICAgIC8vIE5vdGU6CisgICAgLy8gT25lIGRlc2lnbiBkZWNpc2lvbiBJIG1hZGUgd2FzIHRvIHRvdGFsbHkgcmUtaW5pdCB0aGUgZW5naW5lIHN0YXRlCisgICAgLy8gZm9yIGVhY2ggc2VjdGlvbi4gIFRoZSBDRk0gc3BlYyBpcyB1bmNsZWFyIGFzIHRvIHdoZXRoZXIgeW91J3JlIHN1cHBvc2VkCisgICAgLy8gdG8gdG90YWxseSByZS1pbml0IHRoZSBlbmdpbmUgc3RhdGUsIG9yIGp1c3QgcmUtaW5pdCB0aGUgc2VjdGlvbi1zcGVjaWZpYworICAgIC8vIHN0YXRlIChpZSBjdXJyZW50UmVsb2MsIHRlcm1pbmF0aW5nUmVsb2MsIGFuZCByZWxvY0FkZHJlc3MpLiAgSSBob3BlIHRoaXMKKyAgICAvLyBpcyBjb3JyZWN0LCBidXQgaXQncyBoYXJkIHRvIHRlc3Qgd2l0aG91dCBoYXZpbmcgYSBmcmFnbWVudCB3aXRoIG11bHRpcGxlCisgICAgLy8gcmVsb2NhdGVkIHNlY3Rpb25zLCB3aGljaCBpcyBkaWZmaWN1bHQgdG8gY3JlYXRlLgogCi0JCQkJCQlpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOwotCQkJCQkJc3RhdGUuc2VjdGlvbkMgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCBpbmRleCk7Ci0JCQkJCQlNb3JlQXNzZXJ0UShzdGF0ZS5zZWN0aW9uQyAhPSBuaWwpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21TZXRTZWN0RDoKLQkJCQkJewotCQkJCQkJVUludDMyIGluZGV4OworICAgIC8vIEhvdyBkbyBJIGRlY2lkZSB3aGljaCBvcGNvZGVzIHNob3VsZCBiZSBlZmZlY3RpdmUgKGllIG1ha2UgY2hhbmdlcyB0bworICAgIC8vIHRoZSBzZWN0aW9uIGJlaW5nIHJlbG9jYXRlZCkgYW5kIHdoaWNoIG9wY29kZXMgc2hvdWxkIGp1c3QgYmUgZXhlY3V0ZWQKKyAgICAvLyBmb3IgdGhlaXIgc2lkZSBlZmZlY3RzIChpZSB1cGRhdGVkIHN0YXRlLnJlbG9jQWRkcmVzcyBvciBzdGF0ZS5pbXBvcnRJbmRleCk/CisgICAgLy8gVGhlIGFuc3dlciBpcyBib3RoIHNpbXBsZSBhbmQgc3VidGxlLiAgT3Bjb2RlcyB3aG9zZSBhY3Rpb25zIGFyZSBkZXBlbmRlbnQKKyAgICAvLyBvbiBhIHN5bWJvbCB0aGF0IHdhcyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeSBhcmUgZWZmZWN0aXZlLCB0aG9zZSB0aGF0CisgICAgLy8gYW4gaW5kZXBlbmRlbnQgb2YgdGhvc2Ugc3ltYm9scyBhcmUgbm90LiAgVGhlIG9ubHkgb3Bjb2RlcyB0aGF0IHVzZQorICAgIC8vIHN5bWJvbGljIHZhbHVlcyBhcmUga1BFRlJlbG9jSW1wb3J0UnVuIGFuZCBrUEVGUmVsb2NTbUJ5SW1wb3J0LCBhbmQKKyAgICAvLyB0aGVzZSBhcmUgb25seSBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5LgorICAgIC8vIEFsbCBvdGhlciBjYXNlcyBhcmUgZXhlY3V0ZWQgZm9yIHRoZWlyIHNpZGUgZWZmZWN0cyBvbmx5LgorICAgIC8vCisgICAgLy8gSG93IGRvIEkgZGV0ZXJtaW5lIGlmIGEgc3ltYm9sIGlzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5PworICAgIC8vIFdlbGwgSSBrbm93IHRoZSBzeW1ib2wncyBpbmRleCBhbmQgSSBrbm93IHRoZSBsb3dlciBib3VuZCBhbmQgY291bnQKKyAgICAvLyBvZiB0aGUgc3ltYm9scyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeSwgc28gSSBqdXN0IGRvIGEgc2ltcGxlCisgICAgLy8gYm91bmRzIHRlc3QsIGllCisgICAgLy8KKyAgICAvLyAgIGZpcnN0SW1wb3J0ZWRTeW1ib2wgPD0gaW1wb3J0SW5kZXggPCBmaXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0ZWRTeW1ib2xDb3VudAogCi0JCQkJCQlpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOwotCQkJCQkJc3RhdGUuc2VjdGlvbkQgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCBpbmRleCk7Ci0JCQkJCQlNb3JlQXNzZXJ0UShzdGF0ZS5zZWN0aW9uRCAhPSBuaWwpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21CeVNlY3Rpb246Ci0JCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY0luY3JQb3NpdGlvbjoKLQkJCQkJewotCQkJCQkJVUludDE2IG9mZnNldDsKLQkJCQkJCQotCQkJCQkJb2Zmc2V0ID0gKG9wQ29kZSAmIDB4MEZGRikgKyAxOwotCQkJCQkJKChjaGFyICopIHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gb2Zmc2V0OwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21SZXBlYXQ6Ci0JCQkJCSNpZiBNT1JFX0RFQlVHCi0JCQkJCQlEZWJ1Z1N0cigiXHBSdW5SZWxvY2F0aW9uRW5naW5lOiBrUEVGUmVsb2NTbVJlcGVhdCBub3QgeWV0IGltcGxlbWVudGVkIik7Ci0JCQkJCSNlbmRpZgotCQkJCQllcnIgPSB1bmltcEVycjsKLQkJCQkJZ290byBsZWF2ZU5vdzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NTZXRQb3NpdGlvbjoKLQkJCQkJewotCQkJCQkJVUludDMyIG9mZnNldDsKKyAgICAvLyBGcm9tIHRoaXMgY29kZSwgaXQncyByZWxhdGl2ZWx5IGVhc3kgdG8gc2VlIHdoaWNoIHJlbG9jYXRpb24gb3Bjb2RlcworICAgIC8vIGFyZW4ndCBpbXBsZW1lbnRlZC4gIElmIHlvdSBldmVyIGVuY291bnRlciBvbmUsIHlvdSdsbCBmaW5kIHlvdXJzZWxmCisgICAgLy8gaW4gTWFjc0J1ZyB3aXRoIGEgbWVzc2FnZSB0ZWxsaW5nIHlvdSB3aGljaCBvcGNvZGUgd2FzIGZvdW5kLiAgVGhlCisgICAgLy8gdHdvIGJpZyBncm91cHMgb2Ygb3Bjb2RlcyBJIHNraXBwZWQgd2VyZSB0aGUgbGFyZ2UgZm9ybWF0IG9wY29kZXMKKyAgICAvLyBhbmQgdGhlIHJlcGVhdGluZyBvcGNvZGVzLiAgSSBza2lwcGVkIHRoZW0gYmVjYXVzZToKKyAgICAvLworICAgIC8vIGEpIEkgaGF2ZW4ndCBnb3QgYSB3YXkgdG8gZ2VuZXJhdGUgdGhlbSBpbiBhIFBFRiBjb250YWluZXIgdGhhdCBJIGNhbgorICAgIC8vICAgIHRlc3QgYWdhaW5zdC4gV2l0aG91dCB0aGF0LCB0aGVyZSdzIG5vIHdheSBJIGNvdWxkIGJlIGFzc3VyZWQgdGhhdAorICAgIC8vICAgIHRoZSBjb2RlIHdvcmtlZC4KKyAgICAvLworICAgIC8vIGIpIEknbSBsYXp5LgogCi0JCQkJCQkvLyBMb3QncyBvZiBmb2xrcyBoYXZlIHRyaWVkIHZhcmlvdXMgaW50ZXJwcmV0YXRpb25zIG9mIHRoZSBkZXNjcmlwdGlvbiBvZiAKLQkJCQkJCS8vIHRoaXMgb3BDb2RlIGluICJNYWMgT1MgUnVudGltZSBBcmNoaXRlY3R1cmVzIiAod2hpY2ggc3RhdGVzICJUaGlzIGluc3RydWN0aW9uIAotCQkJCQkJLy8gc2V0cyByZWxvY0FkZHJlc3MgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gb2Zmc2V0IG9mZnNldC4iICAqc21pbGUqKS4KLQkJCQkJCS8vIEkgZXZlbnR1YWxseSBkdWcgaW50byB0aGUgQ0ZNIHNvdXJjZSBjb2RlIHRvIGZpbmQgbXkgaW50ZXJwcmV0YXRpb24sIHdoaWNoIAotCQkJCQkJLy8gSSBiZWxpZXZlIGlzIGNvcnJlY3QuICBUaGUga2V5IHBvaW50IGlzIHRodCB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIAotCQkJCQkJLy8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGZvciB3aGljaCB0aGVzZSByZWxvY2F0aW9ucyBhcmUgYmVpbmcgcGVyZm9ybWVkLgotCQkJCQkJCi0JCQkJCQkvLyBTa2lwIHRvIG5leHQgcmVsb2Mgd29yZCwgd2hpY2ggaXMgdGhlIHNlY29uZCBjaHVuayBvZiB0aGUgb2Zmc2V0LgotCQkJCQkJCi0JCQkJCQlzdGF0ZS5jdXJyZW50UmVsb2MgKz0gMTsKLQkJCQkJCQotCQkJCQkJLy8gRXh0cmFjdCBvZmZzZXQgYmFzZWQgb24gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgMTAgYml0cyBpbiBvcENvZGUgYW5kIAotCQkJCQkJLy8gdGhlIG5leHQgc2lnbmlmaWNhbnQgMTYgYml0cyBpbiB0aGUgbmV4dCByZWxvYyB3b3JkLgotCQkJCQkJCi0JCQkJCQlvZmZzZXQgPSBQRUZSZWxvY1NldFBvc0Z1bGxPZmZzZXQob3BDb2RlLCByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXSk7CisgICAgZXJyID0gbm9FcnI7CisgICAgd2hpbGUgKCBzZWN0aW9uc0xlZnRUb1JlbG9jYXRlID4gMCApIHsKKyAgICAgICAgZXJyID0gSW5pdEVuZ2luZVN0YXRlKGZyYWdUb0ZpeCwgc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSwgJnN0YXRlKTsKKyAgICAgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgfQogCi0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgPSAoVUludDMyICopICggKChjaGFyICopIHN0YXRlLnNlY3Rpb25CYXNlKSArIG9mZnNldCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NMZ0J5SW1wb3J0OgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgc3ltYm9sVmFsdWU7Ci0JCQkJCQlVSW50MzIgaW5kZXg7CisgICAgICAgIHdoaWxlICggc3RhdGUuY3VycmVudFJlbG9jICE9IHN0YXRlLnRlcm1pbmF0aW5nUmVsb2MgKSB7CiAKLQkJCQkJCS8vIEdldCB0aGUgMjYgYml0IHN5bWJvbCBpbmRleCBmcm9tIHRoZSBjdXJyZW50IGFuZCBuZXh0IHJlbG9jIHdvcmRzLgotCQkJCQkJCi0JCQkJCQlzdGF0ZS5jdXJyZW50UmVsb2MgKz0gMTsKLQkJCQkJCWluZGV4ID0gUEVGUmVsb2NMZ0J5SW1wb3J0RnVsbEluZGV4KG9wQ29kZSwgcmVsb2NJbnN0clRhYmxlW3N0YXRlLmN1cnJlbnRSZWxvY10pOwotCQkJCQkJCi0JCQkJCQlpZiAoIGluZGV4ID49IGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgJiYgaW5kZXggPCAoaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCArIGltcG9ydExpYnJhcnktPmltcG9ydGVkU3ltYm9sQ291bnQpICkgewotCQkJCQkJCWVyciA9IExvb2t1cFN5bWJvbChsb29rdXAsIHJlZkNvbiwgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLCBpbmRleCwgJnN5bWJvbFZhbHVlKTsKLQkJCQkJCQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCQkJCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCQkJfQotCQkJCQkJCSooc3RhdGUucmVsb2NBZGRyZXNzKSArPSBzeW1ib2xWYWx1ZTsKLQkJCQkJCX0KLQkJCQkJCXN0YXRlLmltcG9ydEluZGV4ID0gaW5kZXggKyAxOwotCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IDE7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NMZ1JlcGVhdDoKLQkJCQkJI2lmIE1PUkVfREVCVUcKLQkJCQkJCURlYnVnU3RyKCJccFJ1blJlbG9jYXRpb25FbmdpbmU6IGtQRUZSZWxvY0xnUmVwZWF0IG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLQkJCQkJI2VuZGlmCi0JCQkJCWVyciA9IHVuaW1wRXJyOwotCQkJCQlnb3RvIGxlYXZlTm93OwotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY0xnU2V0T3JCeVNlY3Rpb246Ci0JCQkJCSNpZiBNT1JFX0RFQlVHCi0JCQkJCQlEZWJ1Z1N0cigiXHBSdW5SZWxvY2F0aW9uRW5naW5lOiBrUEVGUmVsb2NMZ1NldE9yQnlTZWN0aW9uIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLQkJCQkJI2VuZGlmCi0JCQkJCWVyciA9IHVuaW1wRXJyOwotCQkJCQlnb3RvIGxlYXZlTm93OwotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY1VuZGVmaW5lZE9wY29kZToKLQkJCQkJZXJyID0gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnI7Ci0JCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCU1vcmVBc3NlcnRRKGZhbHNlKTsKLQkJCQkJZXJyID0gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnI7Ci0JCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJc3RhdGUuY3VycmVudFJlbG9jICs9IDE7Ci0JCX0KLQkJCi0JCXNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgLT0gMTsKLQl9CisgICAgICAgICAgICBNb3JlQXNzZXJ0USggc3RhdGUuY3VycmVudFJlbG9jIDwgdG90YWxSZWxvY3MgKTsKKworICAgICAgICAgICAgb3BDb2RlID0gcmVsb2NJbnN0clRhYmxlW3N0YXRlLmN1cnJlbnRSZWxvY107CisgICAgICAgICAgICBzd2l0Y2ggKCBQRUZSZWxvY0Jhc2ljT3Bjb2RlKG9wQ29kZSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NCeVNlY3REV2l0aFNraXA6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBza2lwQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBVSW50MTYgcmVsb2NDb3VudDsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcENvdW50ID0gKChvcENvZGUgPj4gNikgJiAweDAwRkYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NDb3VudCA9IChvcENvZGUgJiAweDAwM0YpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucmVsb2NBZGRyZXNzICs9IHNraXBDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSByZWxvY0NvdW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jQnlTZWN0QzoKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0J5U2VjdEQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSBydW5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NUVmVjdG9yMTI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSAocnVuTGVuZ3RoICogMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NUVmVjdG9yODoKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1ZUYWJsZTg6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSAocnVuTGVuZ3RoICogMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NJbXBvcnRSdW46CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW5MZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5pbXBvcnRJbmRleCA+PSBpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICYmIHN0YXRlLmltcG9ydEluZGV4IDwgKGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRMaWJyYXJ5LT5pbXBvcnRlZFN5bWJvbENvdW50KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIHN0YXRlLmltcG9ydEluZGV4LCAmc3ltYm9sVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlTm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooc3RhdGUucmVsb2NBZGRyZXNzKSArPSBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0SW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5MZW5ndGggLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtQnlJbXBvcnQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXggPj0gaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCAmJiBpbmRleCA8IChpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0TGlicmFyeS0+aW1wb3J0ZWRTeW1ib2xDb3VudCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIGluZGV4LCAmc3ltYm9sVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IHN5bWJvbFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0SW5kZXggPSBpbmRleCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtU2V0U2VjdEM6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnNlY3Rpb25DID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgTW9yZUFzc2VydFEoc3RhdGUuc2VjdGlvbkMgIT0gbmlsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtU2V0U2VjdEQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnNlY3Rpb25EID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgTW9yZUFzc2VydFEoc3RhdGUuc2VjdGlvbkQgIT0gbmlsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtQnlTZWN0aW9uOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NJbmNyUG9zaXRpb246CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBvZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IChvcENvZGUgJiAweDBGRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhciAqKSBzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtUmVwZWF0OgorICAgICAgICAgICAgICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdTdHIoIlxwUnVuUmVsb2NhdGlvbkVuZ2luZToga1BFRlJlbG9jU21SZXBlYXQgbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdW5pbXBFcnI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jU2V0UG9zaXRpb246CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBvZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvdCdzIG9mIGZvbGtzIGhhdmUgdHJpZWQgdmFyaW91cyBpbnRlcnByZXRhdGlvbnMgb2YgdGhlIGRlc2NyaXB0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG9wQ29kZSBpbiAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyIgKHdoaWNoIHN0YXRlcyAiVGhpcyBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0cyByZWxvY0FkZHJlc3MgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gb2Zmc2V0IG9mZnNldC4iICAqc21pbGUqKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEkgZXZlbnR1YWxseSBkdWcgaW50byB0aGUgQ0ZNIHNvdXJjZSBjb2RlIHRvIGZpbmQgbXkgaW50ZXJwcmV0YXRpb24sIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJIGJlbGlldmUgaXMgY29ycmVjdC4gIFRoZSBrZXkgcG9pbnQgaXMgdGh0IHRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiBmb3Igd2hpY2ggdGhlc2UgcmVsb2NhdGlvbnMgYXJlIGJlaW5nIHBlcmZvcm1lZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0byBuZXh0IHJlbG9jIHdvcmQsIHdoaWNoIGlzIHRoZSBzZWNvbmQgY2h1bmsgb2YgdGhlIG9mZnNldC4KKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuY3VycmVudFJlbG9jICs9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3Qgb2Zmc2V0IGJhc2VkIG9uIHRoZSBtb3N0IHNpZ25pZmljYW50IDEwIGJpdHMgaW4gb3BDb2RlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgc2lnbmlmaWNhbnQgMTYgYml0cyBpbiB0aGUgbmV4dCByZWxvYyB3b3JkLgorCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBQRUZSZWxvY1NldFBvc0Z1bGxPZmZzZXQob3BDb2RlLCByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyA9IChVSW50MzIgKikgKCAoKGNoYXIgKikgc3RhdGUuc2VjdGlvbkJhc2UpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0xnQnlJbXBvcnQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSAyNiBiaXQgc3ltYm9sIGluZGV4IGZyb20gdGhlIGN1cnJlbnQgYW5kIG5leHQgcmVsb2Mgd29yZHMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRSZWxvYyArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBQRUZSZWxvY0xnQnlJbXBvcnRGdWxsSW5kZXgob3BDb2RlLCByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXggPj0gaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCAmJiBpbmRleCA8IChpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0TGlicmFyeS0+aW1wb3J0ZWRTeW1ib2xDb3VudCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIGluZGV4LCAmc3ltYm9sVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IHN5bWJvbFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0SW5kZXggPSBpbmRleCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0xnUmVwZWF0OgorICAgICAgICAgICAgICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdTdHIoIlxwUnVuUmVsb2NhdGlvbkVuZ2luZToga1BFRlJlbG9jTGdSZXBlYXQgbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdW5pbXBFcnI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jTGdTZXRPckJ5U2VjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgI2lmIE1PUkVfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnU3RyKCJccFJ1blJlbG9jYXRpb25FbmdpbmU6IGtQRUZSZWxvY0xnU2V0T3JCeVNlY3Rpb24gbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdW5pbXBFcnI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jVW5kZWZpbmVkT3Bjb2RlOgorICAgICAgICAgICAgICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50Q29ycnVwdEVycjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTW9yZUFzc2VydFEoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50Q29ycnVwdEVycjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS5jdXJyZW50UmVsb2MgKz0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgLT0gMTsKKyAgICB9CiAKIGxlYXZlTm93OgotCXJldHVybiBlcnI7CisgICAgcmV0dXJuIGVycjsKIH0KIAogZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0Q29yZShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCi0JCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAotCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAotCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAotCQkJCQkJCQkJCUNGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwKLQkJCQkJCQkJCQl2b2lkICpyZWZDb24pCi0JLy8gU2VlIGNvbW1lbnRzIGluIGludGVyZmFjZSBwYXJ0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgbG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWZDb24pCisgICAgLy8gU2VlIGNvbW1lbnRzIGluIGludGVyZmFjZSBwYXJ0LgogewotCU9TU3RhdHVzIGVycjsKLQlPU1N0YXR1cyBqdW5rOwotCUZyYWdUb0ZpeEluZm8gZnJhZ1RvRml4OwotCVBFRkltcG9ydGVkTGlicmFyeSAqaW1wb3J0TGlicmFyeTsKLQljaGFyIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmdbMjU2XTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgT1NTdGF0dXMganVuazsKKyAgICBGcmFnVG9GaXhJbmZvIGZyYWdUb0ZpeDsKKyAgICBQRUZJbXBvcnRlZExpYnJhcnkgKmltcG9ydExpYnJhcnk7CisgICAgY2hhciB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nWzI1Nl07CiAKLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXhMb2NhdG9yICE9IG5pbCk7CQotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeENvbm5JRCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeEluaXRSb3V0aW5lICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEod2Vha0xpbmtlZExpYnJhcnlOYW1lICE9IG5pbCk7CQotCU1vcmVBc3NlcnRRKGxvb2t1cCAhPSBuaWwpOwkKLQkKLQkvLyBGaWxsIG91dCB0aGUgYml0cyBvZiBmcmFnVG9GaXggd2hpY2ggYXJlIHBhc3NlZCBpbgotCS8vIGJ5IHRoZSBjbGllbnQuCi0JCi0JTW9yZUJsb2NrWmVybygmZnJhZ1RvRml4LCBzaXplb2YoZnJhZ1RvRml4KSk7Ci0JZnJhZ1RvRml4LmxvY2F0b3IgPSAqZnJhZ1RvRml4TG9jYXRvcjsKLQlmcmFnVG9GaXguY29ubklEICA9IGZyYWdUb0ZpeENvbm5JRDsKLQlmcmFnVG9GaXguaW5pdFJvdXRpbmUgPSBmcmFnVG9GaXhJbml0Um91dGluZTsKLQkKLQkvLyBNYWtlIGEgQyBzdHJpbmcgZnJvbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUuCi0JCi0JQmxvY2tNb3ZlRGF0YSh3ZWFrTGlua2VkTGlicmFyeU5hbWUgKyAxLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVbMF0pOwotCXdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmdbd2Vha0xpbmtlZExpYnJhcnlOYW1lWzBdXSA9IDA7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4TG9jYXRvciAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeENvbm5JRCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeEluaXRSb3V0aW5lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEod2Vha0xpbmtlZExpYnJhcnlOYW1lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7CiAKLQkvLyBHZXQgdGhlIGJhc2ljIGluZm9ybWF0aW9uIGZyb20gdGhlIGZyYWdtZW50LgotCS8vIEZpbGxzIG91dCB0aGUgY29udGFpbmVySGVhZGVyLCBzZWN0aW9uSGVhZGVycywgbG9hZGVyU2VjdGlvbiBhbmQgZmlsZVJlZiBmaWVsZHMKLQkvLyBvZiBmcmFnVG9GaXguCi0JCi0JZXJyID0gUmVhZENvbnRhaW5lckJhc2ljcygmZnJhZ1RvRml4KTsKKyAgICAvLyBGaWxsIG91dCB0aGUgYml0cyBvZiBmcmFnVG9GaXggd2hpY2ggYXJlIHBhc3NlZCBpbgorICAgIC8vIGJ5IHRoZSBjbGllbnQuCiAKLQkvLyBTZXQgdXAgdGhlIGJhc2UgYWRkcmVzcyBmaWVsZHMgaW4gZnJhZ1RvRml4IChpZSBzZWN0aW9uMEJhc2UgYW5kIHNlY3Rpb24xQmFzZSkKLQkvLyBieSBsb29raW5nIHVwIG91ciBpbml0IHJvdXRpbmUgKGZyYWdUb0ZpeC5pbml0Um91dGluZSkgYW5kIHN1YnRyYWN0aW5nCi0JLy8gYXdheSB0aGUgc2VjdGlvbiBvZmZzZXRzICh3aGljaCB3ZSBnZXQgZnJvbSB0aGUgZGlzayBjb3B5IG9mIHRoZSBzZWN0aW9uKQotCS8vIHRvIGRlcml2ZSB0aGUgYmFzZXMgb2YgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMuCi0JCi0JaWYgKGVyciA9PSBub0VycikgewotCQllcnIgPSBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzKCZmcmFnVG9GaXgpOwotCX0KLQkKLQkvLyBMb29rIGluc2lkZSB0aGUgbG9hZGVyIHNlY3Rpb24gZm9yIHRoZSBpbXBvcnQgbGlicmFyeSBkZXNjcmlwdGlvbgotCS8vIG9mIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4gIFdlIG5lZWQgdGhpcyB0byBrbm93IHRoZSByYW5nZSBvZiBzeW1ib2wKLQkvLyBpbmRleGVzIHdlJ3JlIGdvaW5nIHRvIGZpeCB1cC4KLQkKLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCWVyciA9IEZpbmRJbXBvcnRMaWJyYXJ5KGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nLCAmaW1wb3J0TGlicmFyeSk7Ci0JfQotCQotCS8vIERvIGEgcXVpY2sgY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIGxpYnJhcnkgd2FzIGFjdHVhbGx5IGltcG9ydGVkIHdlYWsuCi0JLy8gSWYgaXQgd2Fzbid0LCBpdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB0byByZXNvbHZlIGl0cyB3ZWFrIGltcG9ydHMKLQkvLyBsYXRlciBvbi4gIFJlc29sdmluZyB0aGVtIGFnYWluIGlzIGxpa2VseSB0byBiZSBiYWQuCi0JCi0JaWYgKGVyciA9PSBub0VycikgewotCQlpZiAoKGltcG9ydExpYnJhcnktPm9wdGlvbnMgJiBrUEVGV2Vha0ltcG9ydExpYk1hc2spID09IDApIHsKLQkJCWVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKLQkJfQotCX0KLQkKLQkvLyBOb3cgcnVuIHRoZSBtYWluIHJlbG9jYXRpb24gZW5naW5lLgotCQotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJZXJyID0gUnVuUmVsb2NhdGlvbkVuZ2luZSgmZnJhZ1RvRml4LCBpbXBvcnRMaWJyYXJ5LCBsb29rdXAsIHJlZkNvbik7Ci0JfQotCQotCS8vIENsZWFuIHVwLgotCQotCWlmIChmcmFnVG9GaXguZGlzcG9zZVNlY3Rpb25Qb2ludGVycykgewotCQlpZiAoZnJhZ1RvRml4LmZpbGVSZWYgIT0gMCkgewotCQkJanVuayA9IEZTQ2xvc2UoZnJhZ1RvRml4LmZpbGVSZWYpOwotCQkJTW9yZUFzc2VydFEoanVuayA9PSBub0Vycik7Ci0JCX0KLQkJaWYgKGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uICE9IG5pbCkgewotCQkJRGlzcG9zZVB0ciggKFB0cikgZnJhZ1RvRml4LmxvYWRlclNlY3Rpb24pOwotCQkJTW9yZUFzc2VydFEoTWVtRXJyb3IoKSA9PSBub0Vycik7Ci0JCX0KLQkJaWYgKGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyAhPSBuaWwpIHsKLQkJCURpc3Bvc2VQdHIoIChQdHIpIGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyk7Ci0JCQlNb3JlQXNzZXJ0UShNZW1FcnJvcigpID09IG5vRXJyKTsKLQkJfQotCX0KLQlyZXR1cm4gZXJyOworICAgIE1vcmVCbG9ja1plcm8oJmZyYWdUb0ZpeCwgc2l6ZW9mKGZyYWdUb0ZpeCkpOworICAgIGZyYWdUb0ZpeC5sb2NhdG9yID0gKmZyYWdUb0ZpeExvY2F0b3I7CisgICAgZnJhZ1RvRml4LmNvbm5JRCAgPSBmcmFnVG9GaXhDb25uSUQ7CisgICAgZnJhZ1RvRml4LmluaXRSb3V0aW5lID0gZnJhZ1RvRml4SW5pdFJvdXRpbmU7CisKKyAgICAvLyBNYWtlIGEgQyBzdHJpbmcgZnJvbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUuCisKKyAgICBCbG9ja01vdmVEYXRhKHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSArIDEsIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmcsIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZVswXSk7CisgICAgd2Vha0xpbmtlZExpYnJhcnlOYW1lQ1N0cmluZ1t3ZWFrTGlua2VkTGlicmFyeU5hbWVbMF1dID0gMDsKKworICAgIC8vIEdldCB0aGUgYmFzaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgZnJhZ21lbnQuCisgICAgLy8gRmlsbHMgb3V0IHRoZSBjb250YWluZXJIZWFkZXIsIHNlY3Rpb25IZWFkZXJzLCBsb2FkZXJTZWN0aW9uIGFuZCBmaWxlUmVmIGZpZWxkcworICAgIC8vIG9mIGZyYWdUb0ZpeC4KKworICAgIGVyciA9IFJlYWRDb250YWluZXJCYXNpY3MoJmZyYWdUb0ZpeCk7CisKKyAgICAvLyBTZXQgdXAgdGhlIGJhc2UgYWRkcmVzcyBmaWVsZHMgaW4gZnJhZ1RvRml4IChpZSBzZWN0aW9uMEJhc2UgYW5kIHNlY3Rpb24xQmFzZSkKKyAgICAvLyBieSBsb29raW5nIHVwIG91ciBpbml0IHJvdXRpbmUgKGZyYWdUb0ZpeC5pbml0Um91dGluZSkgYW5kIHN1YnRyYWN0aW5nCisgICAgLy8gYXdheSB0aGUgc2VjdGlvbiBvZmZzZXRzICh3aGljaCB3ZSBnZXQgZnJvbSB0aGUgZGlzayBjb3B5IG9mIHRoZSBzZWN0aW9uKQorICAgIC8vIHRvIGRlcml2ZSB0aGUgYmFzZXMgb2YgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMuCisKKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIGVyciA9IFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMoJmZyYWdUb0ZpeCk7CisgICAgfQorCisgICAgLy8gTG9vayBpbnNpZGUgdGhlIGxvYWRlciBzZWN0aW9uIGZvciB0aGUgaW1wb3J0IGxpYnJhcnkgZGVzY3JpcHRpb24KKyAgICAvLyBvZiB3ZWFrTGlua2VkTGlicmFyeU5hbWUuICBXZSBuZWVkIHRoaXMgdG8ga25vdyB0aGUgcmFuZ2Ugb2Ygc3ltYm9sCisgICAgLy8gaW5kZXhlcyB3ZSdyZSBnb2luZyB0byBmaXggdXAuCisKKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIGVyciA9IEZpbmRJbXBvcnRMaWJyYXJ5KGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nLCAmaW1wb3J0TGlicmFyeSk7CisgICAgfQorCisgICAgLy8gRG8gYSBxdWljayBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgbGlicmFyeSB3YXMgYWN0dWFsbHkgaW1wb3J0ZWQgd2Vhay4KKyAgICAvLyBJZiBpdCB3YXNuJ3QsIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHJlc29sdmUgaXRzIHdlYWsgaW1wb3J0cworICAgIC8vIGxhdGVyIG9uLiAgUmVzb2x2aW5nIHRoZW0gYWdhaW4gaXMgbGlrZWx5IHRvIGJlIGJhZC4KKworICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgaWYgKChpbXBvcnRMaWJyYXJ5LT5vcHRpb25zICYga1BFRldlYWtJbXBvcnRMaWJNYXNrKSA9PSAwKSB7CisgICAgICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3cgcnVuIHRoZSBtYWluIHJlbG9jYXRpb24gZW5naW5lLgorCisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICBlcnIgPSBSdW5SZWxvY2F0aW9uRW5naW5lKCZmcmFnVG9GaXgsIGltcG9ydExpYnJhcnksIGxvb2t1cCwgcmVmQ29uKTsKKyAgICB9CisKKyAgICAvLyBDbGVhbiB1cC4KKworICAgIGlmIChmcmFnVG9GaXguZGlzcG9zZVNlY3Rpb25Qb2ludGVycykgeworICAgICAgICBpZiAoZnJhZ1RvRml4LmZpbGVSZWYgIT0gMCkgeworICAgICAgICAgICAganVuayA9IEZTQ2xvc2UoZnJhZ1RvRml4LmZpbGVSZWYpOworICAgICAgICAgICAgTW9yZUFzc2VydFEoanVuayA9PSBub0Vycik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uICE9IG5pbCkgeworICAgICAgICAgICAgRGlzcG9zZVB0ciggKFB0cikgZnJhZ1RvRml4LmxvYWRlclNlY3Rpb24pOworICAgICAgICAgICAgTW9yZUFzc2VydFEoTWVtRXJyb3IoKSA9PSBub0Vycik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyAhPSBuaWwpIHsKKyAgICAgICAgICAgIERpc3Bvc2VQdHIoIChQdHIpIGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyk7CisgICAgICAgICAgICBNb3JlQXNzZXJ0UShNZW1FcnJvcigpID09IG5vRXJyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgcGFzY2FsIE9TU3RhdHVzIEZyYWdtZW50TG9va3VwKENvbnN0U3RyMjU1UGFyYW0gc3ltTmFtZSwgQ0ZyYWdTeW1ib2xDbGFzcyBzeW1DbGFzcywKLQkJCQkJCQkJCXZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pCi0JLy8gVGhpcyBpcyB0aGUgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgY2FsbGJhY2sgdXNlZCB3aGVuIAotCS8vIGxhdGUgaW1wb3J0aW5nIGZyb20gYSBDRk0gc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqc3ltQWRkciwgdm9pZCAqcmVmQ29uKQorICAgIC8vIFRoaXMgaXMgdGhlIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGNhbGxiYWNrIHVzZWQgd2hlbgorICAgIC8vIGxhdGUgaW1wb3J0aW5nIGZyb20gYSBDRk0gc2hhcmVkIGxpYnJhcnkuCiB7Ci0JT1NTdGF0dXMgZXJyOwotCUNGcmFnQ29ubmVjdGlvbklEIGNvbm5JRFRvSW1wb3J0OwotCUNGcmFnU3ltYm9sQ2xhc3MgIGZvdW5kU3ltQ2xhc3M7Ci0JCi0JTW9yZUFzc2VydFEoc3ltTmFtZSAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHN5bUFkZHIgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShyZWZDb24gICE9IG5pbCk7Ci0JCi0JY29ubklEVG9JbXBvcnQgPSAoQ0ZyYWdDb25uZWN0aW9uSUQpIHJlZkNvbjsKLQkKLQkvLyBTaGFtZSB0aGVyZSdzIG5vIHdheSB0byB2YWxpZGF0ZSB0aGF0IGNvbm5JRFRvSW1wb3J0IGlzIHZhbGlkLgorICAgIE9TU3RhdHVzIGVycjsKKyAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydDsKKyAgICBDRnJhZ1N5bWJvbENsYXNzICBmb3VuZFN5bUNsYXNzOwogCi0JZXJyID0gRmluZFN5bWJvbChjb25uSURUb0ltcG9ydCwgc3ltTmFtZSwgKFB0ciAqKSBzeW1BZGRyLCAmZm91bmRTeW1DbGFzcyk7Ci0JaWYgKGVyciA9PSBub0VycikgewotCQkvLyBJZiB0aGUgc3ltYm9sIGlzbid0IG9mIHRoZSByaWdodCBjbGFzcywgd2UgYWN0IGxpa2Ugd2UgZGlkbid0IAotCQkvLyBmaW5kIGl0LCBidXQgYWxzbyBhc3NlcnQgaW4gdGhlIGRlYnVnIGJ1aWxkIGJlY2F1c2Ugd2VpcmQgdGhpbmdzIAotCQkvLyBhcmUgYWZvb3QuCi0JCWlmIChmb3VuZFN5bUNsYXNzICE9IHN5bUNsYXNzKSB7Ci0JCQlNb3JlQXNzZXJ0UShmYWxzZSk7Ci0JCQkqc3ltQWRkciA9IG5pbDsKLQkJCWVyciA9IGNmcmFnTm9TeW1ib2xFcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBNb3JlQXNzZXJ0UShzeW1OYW1lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoc3ltQWRkciAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHJlZkNvbiAgIT0gbmlsKTsKKworICAgIGNvbm5JRFRvSW1wb3J0ID0gKENGcmFnQ29ubmVjdGlvbklEKSByZWZDb247CisKKyAgICAvLyBTaGFtZSB0aGVyZSdzIG5vIHdheSB0byB2YWxpZGF0ZSB0aGF0IGNvbm5JRFRvSW1wb3J0IGlzIHZhbGlkLgorCisgICAgZXJyID0gRmluZFN5bWJvbChjb25uSURUb0ltcG9ydCwgc3ltTmFtZSwgKFB0ciAqKSBzeW1BZGRyLCAmZm91bmRTeW1DbGFzcyk7CisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAvLyBJZiB0aGUgc3ltYm9sIGlzbid0IG9mIHRoZSByaWdodCBjbGFzcywgd2UgYWN0IGxpa2Ugd2UgZGlkbid0CisgICAgICAgIC8vIGZpbmQgaXQsIGJ1dCBhbHNvIGFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGQgYmVjYXVzZSB3ZWlyZCB0aGluZ3MKKyAgICAgICAgLy8gYXJlIGFmb290LgorICAgICAgICBpZiAoZm91bmRTeW1DbGFzcyAhPSBzeW1DbGFzcykgeworICAgICAgICAgICAgTW9yZUFzc2VydFEoZmFsc2UpOworICAgICAgICAgICAgKnN5bUFkZHIgPSBuaWw7CisgICAgICAgICAgICBlcnIgPSBjZnJhZ05vU3ltYm9sRXJyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIGV4dGVybiBwYXNjYWwgT1NTdGF0dXMgQ0ZNTGF0ZUltcG9ydExpYnJhcnkoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKLQkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKLQkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCkKLQkvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCkKKyAgICAvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCiB7Ci0JTW9yZUFzc2VydFEoY29ubklEVG9JbXBvcnQgIT0gbmlsKTsKLQlyZXR1cm4gQ0ZNTGF0ZUltcG9ydENvcmUoZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklELCBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQl3ZWFrTGlua2VkTGlicmFyeU5hbWUsIEZyYWdtZW50TG9va3VwLCBjb25uSURUb0ltcG9ydCk7CisgICAgTW9yZUFzc2VydFEoY29ubklEVG9JbXBvcnQgIT0gbmlsKTsKKyAgICByZXR1cm4gQ0ZNTGF0ZUltcG9ydENvcmUoZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklELCBmcmFnVG9GaXhJbml0Um91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrTGlua2VkTGlicmFyeU5hbWUsIEZyYWdtZW50TG9va3VwLCBjb25uSURUb0ltcG9ydCk7CiB9CiAKIHN0YXRpYyBwYXNjYWwgT1NTdGF0dXMgQnVuZGxlTG9va3VwKENvbnN0U3RyMjU1UGFyYW0gc3ltTmFtZSwgQ0ZyYWdTeW1ib2xDbGFzcyBzeW1DbGFzcywKLQkJCQkJCQkJCXZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pCi0JLy8gVGhpcyBpcyB0aGUgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgY2FsbGJhY2sgdXNlZCB3aGVuIAotCS8vIGxhdGUgaW1wb3J0aW5nIGZyb20gYSBDRkJ1bmRsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pCisgICAgLy8gVGhpcyBpcyB0aGUgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgY2FsbGJhY2sgdXNlZCB3aGVuCisgICAgLy8gbGF0ZSBpbXBvcnRpbmcgZnJvbSBhIENGQnVuZGxlLgogewotCU9TU3RhdHVzIAllcnI7Ci0JQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQ7Ci0JQ0ZTdHJpbmdSZWYgc3ltTmFtZVN0cjsKLQkKLQlNb3JlQXNzZXJ0UShzeW1OYW1lICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoc3ltQWRkciAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHJlZkNvbiAgIT0gbmlsKTsKLQkKLQlzeW1OYW1lU3RyID0gbmlsOwotCQotCWJ1bmRsZVRvSW1wb3J0ID0gKENGQnVuZGxlUmVmKSByZWZDb247Ci0JCi0JLy8gU2hhbWUgdGhlcmUncyBubyB3YXkgdG8gdmFsaWRhdGUgdGhhdCBidW5kbGVUb0ltcG9ydCBpcyByZWFsbHkgYSBidW5kbGUuCi0JCi0JLy8gV2UgY2FuIG9ubHkgZmluZCBmdW5jdGlvbiBwb2ludGVycyBiZWNhdXNlIENGQnVuZGxlR2V0RnVuY3Rpb25Qb2ludGVyRm9yTmFtZSAKLQkvLyBvbmx5IHdvcmtzIGZvciBmdW5jdGlvbiBwb2ludGVycy4gIFNvIGlmIHRoZSBjbGllbnQgaXMgYXNraW5nIGZvciBzb21ldGhpbmcgCi0JLy8gb3RoZXIgdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgKGllIFRWZWN0b3Igc3ltYm9sKSB0aGVuIHdlIGRvbid0IGV2ZW4gdHJ1ZS4KLQkvLyBBbHNvIGFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGQgYmVjYXVzZSB0aGlzIHNob3dzIGEgY2VydGFpbiBsYWNrIG9mIAotCS8vIHVuZGVyc3RhbmRpbmcgb24gdGhlIHBhcnQgb2YgdGhlIGNsaWVudC4KLQkvLwotCS8vIENGIGlzIGJlaW5nIHJldmlzZSB0byBzdXBwb3J0IGFjY2Vzc2luZyBkYXRhIHN5bWJvbHMgdXNpbmcgYSBuZXcgQVBJCi0JLy8gKGN1cnJlbnRseSB0aGlzIGlzIGF2YWlsYWJsZSB0byBBcHBsZSBpbnRlcm5hbCBkZXZlbG9wZXJzIGFzIAotCS8vIENGQnVuZGxlR2V0RGF0YVBvaW50ZXJGb3JOYW1lKS4gIFdoZW4gdGhlIG5ldyBBUEkgaXMgYXZhaWxhYmxlIGluIGEgCi0JLy8gcHVibGljIGhlYWRlciBmaWxlIEkgc2hvdWxkIHJldmlzZSB0aGlzIGNvZGUgdG8gbGlmdCB0aGlzIHJlc3RyaWN0aW9uLgotCQotCWVyciA9IG5vRXJyOwotCWlmIChzeW1DbGFzcyAhPSBrVFZlY3RvckNGcmFnU3ltYm9sKSB7Ci0JCU1vcmVBc3NlcnRRKGZhbHNlKTsKLQkJZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKLQl9Ci0JaWYgKGVyciA9PSBub0VycikgewotCQlzeW1OYW1lU3RyID0gQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKGtDRkFsbG9jYXRvclN5c3RlbURlZmF1bHQsIAotCQkJCQkJCQkJCQkJCXN5bU5hbWUsIGtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4pOwotCQlpZiAoc3ltTmFtZVN0ciA9PSBuaWwpIHsKLQkJCWVyciA9IGNvcmVGb3VuZGF0aW9uVW5rbm93bkVycjsKLQkJfQotCX0KLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCSpzeW1BZGRyID0gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lKGJ1bmRsZVRvSW1wb3J0LCBzeW1OYW1lU3RyKTsKLQkJaWYgKCpzeW1BZGRyID09IG5pbCkgewotCQkJZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKLQkJfQotCX0KLQlpZiAoc3ltTmFtZVN0ciAhPSBuaWwpIHsKLQkJQ0ZSZWxlYXNlKHN5bU5hbWVTdHIpOwotCX0KLQlyZXR1cm4gZXJyOworICAgIE9TU3RhdHVzICAgICAgICAgICAgZXJyOworICAgIENGQnVuZGxlUmVmIGJ1bmRsZVRvSW1wb3J0OworICAgIENGU3RyaW5nUmVmIHN5bU5hbWVTdHI7CisKKyAgICBNb3JlQXNzZXJ0UShzeW1OYW1lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoc3ltQWRkciAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHJlZkNvbiAgIT0gbmlsKTsKKworICAgIHN5bU5hbWVTdHIgPSBuaWw7CisKKyAgICBidW5kbGVUb0ltcG9ydCA9IChDRkJ1bmRsZVJlZikgcmVmQ29uOworCisgICAgLy8gU2hhbWUgdGhlcmUncyBubyB3YXkgdG8gdmFsaWRhdGUgdGhhdCBidW5kbGVUb0ltcG9ydCBpcyByZWFsbHkgYSBidW5kbGUuCisKKyAgICAvLyBXZSBjYW4gb25seSBmaW5kIGZ1bmN0aW9uIHBvaW50ZXJzIGJlY2F1c2UgQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lCisgICAgLy8gb25seSB3b3JrcyBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuICBTbyBpZiB0aGUgY2xpZW50IGlzIGFza2luZyBmb3Igc29tZXRoaW5nCisgICAgLy8gb3RoZXIgdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgKGllIFRWZWN0b3Igc3ltYm9sKSB0aGVuIHdlIGRvbid0IGV2ZW4gdHJ1ZS4KKyAgICAvLyBBbHNvIGFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGQgYmVjYXVzZSB0aGlzIHNob3dzIGEgY2VydGFpbiBsYWNrIG9mCisgICAgLy8gdW5kZXJzdGFuZGluZyBvbiB0aGUgcGFydCBvZiB0aGUgY2xpZW50LgorICAgIC8vCisgICAgLy8gQ0YgaXMgYmVpbmcgcmV2aXNlIHRvIHN1cHBvcnQgYWNjZXNzaW5nIGRhdGEgc3ltYm9scyB1c2luZyBhIG5ldyBBUEkKKyAgICAvLyAoY3VycmVudGx5IHRoaXMgaXMgYXZhaWxhYmxlIHRvIEFwcGxlIGludGVybmFsIGRldmVsb3BlcnMgYXMKKyAgICAvLyBDRkJ1bmRsZUdldERhdGFQb2ludGVyRm9yTmFtZSkuICBXaGVuIHRoZSBuZXcgQVBJIGlzIGF2YWlsYWJsZSBpbiBhCisgICAgLy8gcHVibGljIGhlYWRlciBmaWxlIEkgc2hvdWxkIHJldmlzZSB0aGlzIGNvZGUgdG8gbGlmdCB0aGlzIHJlc3RyaWN0aW9uLgorCisgICAgZXJyID0gbm9FcnI7CisgICAgaWYgKHN5bUNsYXNzICE9IGtUVmVjdG9yQ0ZyYWdTeW1ib2wpIHsKKyAgICAgICAgTW9yZUFzc2VydFEoZmFsc2UpOworICAgICAgICBlcnIgPSBjZnJhZ05vU3ltYm9sRXJyOworICAgIH0KKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIHN5bU5hbWVTdHIgPSBDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmcoa0NGQWxsb2NhdG9yU3lzdGVtRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bU5hbWUsIGtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4pOworICAgICAgICBpZiAoc3ltTmFtZVN0ciA9PSBuaWwpIHsKKyAgICAgICAgICAgIGVyciA9IGNvcmVGb3VuZGF0aW9uVW5rbm93bkVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICpzeW1BZGRyID0gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lKGJ1bmRsZVRvSW1wb3J0LCBzeW1OYW1lU3RyKTsKKyAgICAgICAgaWYgKCpzeW1BZGRyID09IG5pbCkgeworICAgICAgICAgICAgZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3ltTmFtZVN0ciAhPSBuaWwpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKHN5bU5hbWVTdHIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBleHRlcm4gcGFzY2FsIE9TU3RhdHVzIENGTUxhdGVJbXBvcnRCdW5kbGUoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKLQkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKLQkJCQkJCQkJCQlDRkJ1bmRsZVJlZiBidW5kbGVUb0ltcG9ydCkKLQkvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZVJlZiBidW5kbGVUb0ltcG9ydCkKKyAgICAvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCiB7Ci0JTW9yZUFzc2VydFEoYnVuZGxlVG9JbXBvcnQgIT0gbmlsKTsKLQlyZXR1cm4gQ0ZNTGF0ZUltcG9ydENvcmUoZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklELCBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQl3ZWFrTGlua2VkTGlicmFyeU5hbWUsIEJ1bmRsZUxvb2t1cCwgYnVuZGxlVG9JbXBvcnQpOworICAgIE1vcmVBc3NlcnRRKGJ1bmRsZVRvSW1wb3J0ICE9IG5pbCk7CisgICAgcmV0dXJuIENGTUxhdGVJbXBvcnRDb3JlKGZyYWdUb0ZpeExvY2F0b3IsIGZyYWdUb0ZpeENvbm5JRCwgZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vha0xpbmtlZExpYnJhcnlOYW1lLCBCdW5kbGVMb29rdXAsIGJ1bmRsZVRvSW1wb3J0KTsKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuaCBiL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuaAppbmRleCBmM2E4OWJjLi4wODc4OTYwIDEwMDc1NQotLS0gYS9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmgKKysrIGIvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5oCkBAIC0xLDMzICsxLDMzIEBACiAvKgotCUZpbGU6CQlDRk1MYXRlSW1wb3J0LmgKKyAgICBGaWxlOiAgICAgICAgICAgICAgIENGTUxhdGVJbXBvcnQuaAogCi0JQ29udGFpbnM6CUludGVyZmFjZSB0byBDRk0gbGF0ZSBpbXBvcnQgbGlicmFyeS4KKyAgICBDb250YWluczogICAgICAgICAgIEludGVyZmFjZSB0byBDRk0gbGF0ZSBpbXBvcnQgbGlicmFyeS4KIAotCVdyaXR0ZW4gYnk6CVF1aW5uCisgICAgV3JpdHRlbiBieTogICAgICAgICBRdWlubgogCi0JQ29weXJpZ2h0OglDb3B5cmlnaHQgqSAxOTk5IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorICAgIENvcHlyaWdodDogICAgICAgICAgQ29weXJpZ2h0IKkgMTk5OSBieSBBcHBsZSBDb21wdXRlciwgSW5jLiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KIAotCQkJCVlvdSBtYXkgaW5jb3Jwb3JhdGUgdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaW50byB5b3VyIHByb2dyYW0ocykgd2l0aG91dAotCQkJCXJlc3RyaWN0aW9uLiBUaGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBoYXMgYmVlbiBwcm92aWRlZCAiQVMgSVMiIGFuZCB0aGUKLQkJCQlyZXNwb25zaWJpbGl0eSBmb3IgaXRzIG9wZXJhdGlvbiBpcyB5b3Vycy4gWW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHJlZGlzdHJpYnV0ZQotCQkJCXRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGFzICJBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUiIGFmdGVyIGhhdmluZyBtYWRlCi0JCQkJY2hhbmdlcy4gSWYgeW91J3JlIGdvaW5nIHRvIHJlLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSwgd2UgcmVxdWlyZSB0aGF0IHlvdSBtYWtlCi0JCQkJaXQgY2xlYXIgaW4gdGhlIHNvdXJjZSB0aGF0IHRoZSBjb2RlIHdhcyBkZXNjZW5kZWQgZnJvbSBBcHBsZSBzYW1wbGUgc291cmNlCi0JCQkJY29kZSwgYnV0IHRoYXQgeW91J3ZlIG1hZGUgY2hhbmdlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IGluY29ycG9yYXRlIHRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGludG8geW91ciBwcm9ncmFtKHMpIHdpdGhvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvbi4gVGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaGFzIGJlZW4gcHJvdmlkZWQgIkFTIElTIiBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvcGVyYXRpb24gaXMgeW91cnMuIFlvdSBhcmUgbm90IHBlcm1pdHRlZCB0byByZWRpc3RyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBhcyAiQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIiBhZnRlciBoYXZpbmcgbWFkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuIElmIHlvdSdyZSBnb2luZyB0byByZS1kaXN0cmlidXRlIHRoZSBzb3VyY2UsIHdlIHJlcXVpcmUgdGhhdCB5b3UgbWFrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGNsZWFyIGluIHRoZSBzb3VyY2UgdGhhdCB0aGUgY29kZSB3YXMgZGVzY2VuZGVkIGZyb20gQXBwbGUgc2FtcGxlIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsIGJ1dCB0aGF0IHlvdSd2ZSBtYWRlIGNoYW5nZXMuCiAKLQlDaGFuZ2UgSGlzdG9yeSAobW9zdCByZWNlbnQgZmlyc3QpOgorICAgIENoYW5nZSBIaXN0b3J5IChtb3N0IHJlY2VudCBmaXJzdCk6CiAKLSAgICAgICAgIDw2PiAgICAgMjEvOS8wMSAgICBRdWlubiAgIENoYW5nZXMgZm9yIENXUHJvNyBNYWNoLU8gYnVpbGQuCi0gICAgICAgICA8NT4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDaGFuZ2UgY29tbWVudHMgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGFuIHVucGFja2VkIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgotICAgICAgICAgPDQ+ICAgICAxOS85LzAxICAgIFF1aW5uICAgU2ltcGxpZmllZCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGFmdGVyIGEgc3VnZ2VzdGlvbiBieSBFcmljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFudC4gWW91IG5vIGxvbmdlciBoYXZlIHRvIENGTSBleHBvcnQgYSBkdW1teSBmdW5jdGlvbjsgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4ganVzdCBwYXNzIGluIHRoZSBhZGRyZXNzIG9mIHlvdXIgZnJhZ21lbnQncyBpbml0IHJvdXRpbmUuCi0gICAgICAgICA8Mz4gICAgMTYvMTEvMDAgICAgUXVpbm4gICBBbGxvdyBzeW1ib2wgZmluZGluZyB2aWEgYSBjYWxsYmFjayBhbmQgdXNlIHRoYXQgdG8gaW1wbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZSBzdXBwb3J0LgotICAgICAgICAgPDI+ICAgIDE4LzEwLzk5ICAgIFF1aW5uICAgUmVuYW1lZCBDRk1MYXRlSW1wb3J0IHRvIENGTUxhdGVJbXBvcnRMaWJyYXJ5IHRvIGFsbG93IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZnV0dXJlIEFQSSBleHBhbnNpb24uCi0gICAgICAgICA8MT4gICAgIDE1LzYvOTkgICAgUXVpbm4gICBGaXJzdCBjaGVja2VkIGluLgorICAgICA8Nj4gICAgIDIxLzkvMDEgICAgUXVpbm4gICBDaGFuZ2VzIGZvciBDV1BybzcgTWFjaC1PIGJ1aWxkLgorICAgICA8NT4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDaGFuZ2UgY29tbWVudHMgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGFuIHVucGFja2VkIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpcyBubyBsb25nZXIgcmVxdWlyZWQuCisgICAgIDw0PiAgICAgMTkvOS8wMSAgICBRdWlubiAgIFNpbXBsaWZpZWQgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBhZnRlciBhIHN1Z2dlc3Rpb24gYnkgRXJpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFudC4gWW91IG5vIGxvbmdlciBoYXZlIHRvIENGTSBleHBvcnQgYSBkdW1teSBmdW5jdGlvbjsgeW91CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBqdXN0IHBhc3MgaW4gdGhlIGFkZHJlc3Mgb2YgeW91ciBmcmFnbWVudCdzIGluaXQgcm91dGluZS4KKyAgICAgPDM+ICAgIDE2LzExLzAwICAgIFF1aW5uICAgQWxsb3cgc3ltYm9sIGZpbmRpbmcgdmlhIGEgY2FsbGJhY2sgYW5kIHVzZSB0aGF0IHRvIGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZSBzdXBwb3J0LgorICAgICA8Mj4gICAgMTgvMTAvOTkgICAgUXVpbm4gICBSZW5hbWVkIENGTUxhdGVJbXBvcnQgdG8gQ0ZNTGF0ZUltcG9ydExpYnJhcnkgdG8gYWxsb3cgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZ1dHVyZSBBUEkgZXhwYW5zaW9uLgorICAgICA8MT4gICAgIDE1LzYvOTkgICAgUXVpbm4gICBGaXJzdCBjaGVja2VkIGluLgogKi8KIAogI3ByYWdtYSBvbmNlCkBAIC00MSwxMCArNDEsMTAgQEAKIC8vIE1hYyBPUyBJbnRlcmZhY2VzCiAKICNpZiAhIE1PUkVfRlJBTUVXT1JLX0lOQ0xVREVTCi0JI2luY2x1ZGUgPE1hY1R5cGVzLmg+Ci0JI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KLQkjaW5jbHVkZSA8RGV2aWNlcy5oPgotCSNpbmNsdWRlIDxDRkJ1bmRsZS5oPgorICAgICNpbmNsdWRlIDxNYWNUeXBlcy5oPgorICAgICNpbmNsdWRlIDxDb2RlRnJhZ21lbnRzLmg+CisgICAgI2luY2x1ZGUgPERldmljZXMuaD4KKyAgICAjaW5jbHVkZSA8Q0ZCdW5kbGUuaD4KICNlbmRpZgogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTMsMjE5ICs1MywyMTkgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLS8qCUZBUQotCS0tLQotCQotCVE6CVdoYXQgZG9lcyB0aGlzIGxpYnJhcnkgZG8/Ci0JQToJSXQgYWxsb3dzIHlvdSB0byByZXNvbHZlIGEgd2VhayBsaW5rZWQgbGlicmFyeSBhdCBydW50aW1lLAotCSAgIAlieSBzdXBwbHkgYSBDRk0gY29ubmVjdGlvbiB0byB0aGUgbGlicmFyeSB0aGF0IHNob3VsZCBzdWJzdGl0dXRlCi0JICAgCWZvciB0aGUgd2VhayBsaW5rZWQgb25lLgotCQotCVE6CURvZXMgdGhlIHN1YnN0aXR1dGVkIGxpYnJhcnkgaGF2ZSB0byBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgdGhlCi0JCXdlYWsgbGlua2VkIGxpYnJhcnkuCi0JQToJTm8uCi0JCi0JUToJV2hhdCdzIHRoaXMgdXNlZnVsIGZvcj8KLQlBOglUaGUgbW9zdCBvYnZpb3VzIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyBpcyB1c2VmdWwgaXMgd2hlbgotCQl5b3UgcmVseSBvbiBzaGFyZWQgbGlicmFyaWVzIHRoYXQgdGhlIHVzZXIgbWlnaHQgZGVsZXRlCi0JCW9yIG1vdmUuICBUbyBjYW4gZmluZCB0aGUgc2hhcmVkIGxpYnJhcnkgKHBvc3NpYmx5IGV2ZW4KLQkJdXNpbmcgQ2F0U2VhcmNoKSwgY2FsbCBHZXREaXNrRnJhZ21lbnQgdG8gb3BlbiBhIGNvbm5lY3Rpb24KLQkJdG8gaXQsIGxhdGUgaW1wb3J0IGl0IHVzaW5nIHRoaXMgbGlicmFyeSwgYW5kIHRoZW4gdGhlCi0JCXJlc3Qgb2YgeW91ciBjb2RlIGNhbiBjb250aW51ZSB0byB1c2UgdGhlIHNoYXJlZCBsaWJyYXJ5Ci0JCWFzIGlmIG5vdGhpbmcgaGFkIGhhcHBlbmVkLiAgTm8gbW9yZSBkZWZpbmluZyB0aG91c2FuZHMKLQkJb2Ygc3R1YiByb3V0aW5lcyB3aGljaCBjYWxsIHRocm91Z2ggcm91dGluZSBwb2ludGVycy4KLQkJCi0JCVRoZXJlIGFyZSwgaG93ZXZlciwgbnVtZXJvdXMgbGVzcyBvYnZpb3VzIHVzZXMuICBZb3UgY2FuCi0JCXVzZSB0aGlzIGNvZGUgdG8gbWFrZSBhICdzZWxmIHJlcGFpcmluZycgYXBwbGljYXRpb24uICBJZgotCQl0aGUgdXNlciByZW1vdmVzIHlvdXIgc2hhcmVkIGxpYnJhcnkgZnJvbSB0aGUgRXh0ZW5zaW9ucwotCQlmb2xkZXIsIHRoZSBzdGFydHVwIGNvZGUgZm9yIHlvdXIgYXBwbGljYXRpb24gY2FuIG9mZmVyCi0JCXRvciByZS1pbnN0YWxsIGl0LiAgSWYgdGhlIHVzZXIgYWdyZWVzLCB5b3UgY2FuIHRoZW4KLQkJcmUtaW5zdGFsbCB5b3VyIHNoYXJlZCBsaWJyYXJ5LCBsYXRlIGltcG9ydCBpdCwgYW5kIHRoZW4KLQkJY29udGludWUgcnVubmluZyB5b3VyIGFwcGxpY2F0aW9uIGlmIG5vdGhpbmcgaGFwcGVuZWQuCi0JCQotCQlZb3UgY2FuIGV2ZW4gdXNlIHRoaXMgY29kZSB0byBmcmVlIHlvdXJzZWxmIGZyb20gdGhlCi0JCUV4dGVuc2lvbnMgZm9sZGVyIGVudGlyZWx5LiAgU2F5IHlvdSBoYXZlIGEgc3VpdGUgb2YKLQkJYXBwbGljYXRpb25zIHRoYXQgY3VycmVudGx5IGluc3RhbGxzIGEgZG96ZW4gc2hhcmVkIAotCQlsaWJyYXJpZXMgaW4gdGhlIEV4dGVuc2lvbnMgZm9sZGVyLiAgWW91IGNhbiBtb3ZlIHRob3NlCi0JCWxpYnJhcmllcyB0byBhbm90aGVyIGZvbGRlciBlbnRpcmVseSBhbmQgZWFjaCBhcHBsaWNhdGlvbidzCi0JCXN0YXJ0dXAgY29kZSBjYW4gdHJhY2sgZG93biB0aGUgbGlicmFyeSAodXNpbmcgYW4gYWxpYXMKLQkJaW4gdGhlIFByZWZlcmVuY2VzIGZpbGUpIGFuZCBsYXRlIGltcG9ydCBpdC4KLQkJCi0JCUFuIGV2ZW4gY29vbGVyIHVzZSBpcyB0byBwcm92aWRlIGVhc3kgYWJzdHJhY3Rpb24gbGF5ZXJzLgotCQlTYXkgeW91IGhhdmUgYSBuZXR3b3JrIGNvZGUgZm9yIGJvdGggdGhlIE1hY1RDUAotCQlBUEkgYW5kIHRoZSBPcGVuIFRyYW5zcG9ydCBBUEkuICBUeXBpY2FsbHksIHlvdSB3b3VsZCBiZQotCQlmb3JjZSB0byBkbyB0aGlzIGJ5IGhhdmluZyBhbiBhYnN0cmFjdGlvbiBsYXllciB3aGVyZSBldmVyeQotCQlyb3V0aW5lIGNvbnRhaW5zIGEgc3dpdGNoIGJldHdlZW4gTWFjVENQIGFuZCBPVC4gIFlvdXIKLQkJT3BlblNvY2tldCByb3V0aW5lIG1pZ2h0IGxvb2sgbGlrZToKKy8qICAgICAgRkFRCisgICAgLS0tCiAKLQkJCXN0YXRpYyBpbnQgT3BlblNvY2tldCh2b2lkKQotCQkJewotCQkJICAgIGlmIChnT1RBdmFpbGFibGUpIHsKLQkJCSAgICAgICAgcmV0dXJuIE9wZW5Tb2NrZXRPVCgpOwotCQkJICAgIH0gZWxzZSB7Ci0JCQkgICAgICAgIHJldHVybiBPcGVuU29ja2V0TWFjVENQKCk7Ci0JCQkgICAgfQotCQkJfQotCQkKLQkJV2l0aCB0aGlzIGNvZGUsIHlvdSBjYW4gYXZvaWQgdGhhdCBlbnRpcmVseS4gIFNpbXBseQotCQl3ZWFrIGxpbmsgdG8gYSBzaGFyZWQgbGlicmFyeSB0aGF0IHlvdSBrbm93IGlzIG5ldmVyCi0JCWdvaW5nIHRvIGJlIGltcGxlbWVudGVkICgiY3JlYTtNeVNvY2tldHNEdW1teSIpIGFuZCB0aGVuLCAKLQkJYXQgcnVudGltZSwgZGVjaWRlIHdoZXRoZXIgdGhlIHN5c3RlbSBoYXMgTWFjVENQIG9yIE9UCi0JCWFuZCBsYXRlIGltcG9ydCB0aGUgcmVsZXZhbnQgcmVhbCBpbXBsZW1lbnRhdGlvbgotCQkoImNyZWE7TXlTb2NrZXRzTWFjVENQIiBvciAiY3JlYTtNeVNvY2tldHNPVCIpLgotCQlPbmUgYmVuZWZpdCBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgb25seSB0aGUgTWFjVENQIG9yCi0JCXRoZSBPVCBjb2RlIGlzIHJlc2lkZW50IGluIG1lbW9yeSBvbiBhbnkgZ2l2ZW4gc3lzdGVtLgorICAgIFE6ICAgICAgICAgIFdoYXQgZG9lcyB0aGlzIGxpYnJhcnkgZG8/CisgICAgQTogICAgICAgICAgSXQgYWxsb3dzIHlvdSB0byByZXNvbHZlIGEgd2VhayBsaW5rZWQgbGlicmFyeSBhdCBydW50aW1lLAorICAgICAgICBieSBzdXBwbHkgYSBDRk0gY29ubmVjdGlvbiB0byB0aGUgbGlicmFyeSB0aGF0IHNob3VsZCBzdWJzdGl0dXRlCisgICAgICAgIGZvciB0aGUgd2VhayBsaW5rZWQgb25lLgorCisgICAgUTogICAgICAgICAgRG9lcyB0aGUgc3Vic3RpdHV0ZWQgbGlicmFyeSBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUKKyAgICAgICAgd2VhayBsaW5rZWQgbGlicmFyeS4KKyAgICBBOiAgICAgICAgICBOby4KKworICAgIFE6ICAgICAgICAgIFdoYXQncyB0aGlzIHVzZWZ1bCBmb3I/CisgICAgQTogICAgICAgICAgVGhlIG1vc3Qgb2J2aW91cyBleGFtcGxlIG9mIHdoZXJlIHRoaXMgaXMgdXNlZnVsIGlzIHdoZW4KKyAgICAgICAgeW91IHJlbHkgb24gc2hhcmVkIGxpYnJhcmllcyB0aGF0IHRoZSB1c2VyIG1pZ2h0IGRlbGV0ZQorICAgICAgICBvciBtb3ZlLiAgVG8gY2FuIGZpbmQgdGhlIHNoYXJlZCBsaWJyYXJ5IChwb3NzaWJseSBldmVuCisgICAgICAgIHVzaW5nIENhdFNlYXJjaCksIGNhbGwgR2V0RGlza0ZyYWdtZW50IHRvIG9wZW4gYSBjb25uZWN0aW9uCisgICAgICAgIHRvIGl0LCBsYXRlIGltcG9ydCBpdCB1c2luZyB0aGlzIGxpYnJhcnksIGFuZCB0aGVuIHRoZQorICAgICAgICByZXN0IG9mIHlvdXIgY29kZSBjYW4gY29udGludWUgdG8gdXNlIHRoZSBzaGFyZWQgbGlicmFyeQorICAgICAgICBhcyBpZiBub3RoaW5nIGhhZCBoYXBwZW5lZC4gIE5vIG1vcmUgZGVmaW5pbmcgdGhvdXNhbmRzCisgICAgICAgIG9mIHN0dWIgcm91dGluZXMgd2hpY2ggY2FsbCB0aHJvdWdoIHJvdXRpbmUgcG9pbnRlcnMuCisKKyAgICAgICAgVGhlcmUgYXJlLCBob3dldmVyLCBudW1lcm91cyBsZXNzIG9idmlvdXMgdXNlcy4gIFlvdSBjYW4KKyAgICAgICAgdXNlIHRoaXMgY29kZSB0byBtYWtlIGEgJ3NlbGYgcmVwYWlyaW5nJyBhcHBsaWNhdGlvbi4gIElmCisgICAgICAgIHRoZSB1c2VyIHJlbW92ZXMgeW91ciBzaGFyZWQgbGlicmFyeSBmcm9tIHRoZSBFeHRlbnNpb25zCisgICAgICAgIGZvbGRlciwgdGhlIHN0YXJ0dXAgY29kZSBmb3IgeW91ciBhcHBsaWNhdGlvbiBjYW4gb2ZmZXIKKyAgICAgICAgdG9yIHJlLWluc3RhbGwgaXQuICBJZiB0aGUgdXNlciBhZ3JlZXMsIHlvdSBjYW4gdGhlbgorICAgICAgICByZS1pbnN0YWxsIHlvdXIgc2hhcmVkIGxpYnJhcnksIGxhdGUgaW1wb3J0IGl0LCBhbmQgdGhlbgorICAgICAgICBjb250aW51ZSBydW5uaW5nIHlvdXIgYXBwbGljYXRpb24gaWYgbm90aGluZyBoYXBwZW5lZC4KKworICAgICAgICBZb3UgY2FuIGV2ZW4gdXNlIHRoaXMgY29kZSB0byBmcmVlIHlvdXJzZWxmIGZyb20gdGhlCisgICAgICAgIEV4dGVuc2lvbnMgZm9sZGVyIGVudGlyZWx5LiAgU2F5IHlvdSBoYXZlIGEgc3VpdGUgb2YKKyAgICAgICAgYXBwbGljYXRpb25zIHRoYXQgY3VycmVudGx5IGluc3RhbGxzIGEgZG96ZW4gc2hhcmVkCisgICAgICAgIGxpYnJhcmllcyBpbiB0aGUgRXh0ZW5zaW9ucyBmb2xkZXIuICBZb3UgY2FuIG1vdmUgdGhvc2UKKyAgICAgICAgbGlicmFyaWVzIHRvIGFub3RoZXIgZm9sZGVyIGVudGlyZWx5IGFuZCBlYWNoIGFwcGxpY2F0aW9uJ3MKKyAgICAgICAgc3RhcnR1cCBjb2RlIGNhbiB0cmFjayBkb3duIHRoZSBsaWJyYXJ5ICh1c2luZyBhbiBhbGlhcworICAgICAgICBpbiB0aGUgUHJlZmVyZW5jZXMgZmlsZSkgYW5kIGxhdGUgaW1wb3J0IGl0LgorCisgICAgICAgIEFuIGV2ZW4gY29vbGVyIHVzZSBpcyB0byBwcm92aWRlIGVhc3kgYWJzdHJhY3Rpb24gbGF5ZXJzLgorICAgICAgICBTYXkgeW91IGhhdmUgYSBuZXR3b3JrIGNvZGUgZm9yIGJvdGggdGhlIE1hY1RDUAorICAgICAgICBBUEkgYW5kIHRoZSBPcGVuIFRyYW5zcG9ydCBBUEkuICBUeXBpY2FsbHksIHlvdSB3b3VsZCBiZQorICAgICAgICBmb3JjZSB0byBkbyB0aGlzIGJ5IGhhdmluZyBhbiBhYnN0cmFjdGlvbiBsYXllciB3aGVyZSBldmVyeQorICAgICAgICByb3V0aW5lIGNvbnRhaW5zIGEgc3dpdGNoIGJldHdlZW4gTWFjVENQIGFuZCBPVC4gIFlvdXIKKyAgICAgICAgT3BlblNvY2tldCByb3V0aW5lIG1pZ2h0IGxvb2sgbGlrZToKKworICAgICAgICAgICAgc3RhdGljIGludCBPcGVuU29ja2V0KHZvaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGdPVEF2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPcGVuU29ja2V0T1QoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBPcGVuU29ja2V0TWFjVENQKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIFdpdGggdGhpcyBjb2RlLCB5b3UgY2FuIGF2b2lkIHRoYXQgZW50aXJlbHkuICBTaW1wbHkKKyAgICAgICAgd2VhayBsaW5rIHRvIGEgc2hhcmVkIGxpYnJhcnkgdGhhdCB5b3Uga25vdyBpcyBuZXZlcgorICAgICAgICBnb2luZyB0byBiZSBpbXBsZW1lbnRlZCAoImNyZWE7TXlTb2NrZXRzRHVtbXkiKSBhbmQgdGhlbiwKKyAgICAgICAgYXQgcnVudGltZSwgZGVjaWRlIHdoZXRoZXIgdGhlIHN5c3RlbSBoYXMgTWFjVENQIG9yIE9UCisgICAgICAgIGFuZCBsYXRlIGltcG9ydCB0aGUgcmVsZXZhbnQgcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAoImNyZWE7TXlTb2NrZXRzTWFjVENQIiBvciAiY3JlYTtNeVNvY2tldHNPVCIpLgorICAgICAgICBPbmUgYmVuZWZpdCBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgb25seSB0aGUgTWFjVENQIG9yCisgICAgICAgIHRoZSBPVCBjb2RlIGlzIHJlc2lkZW50IGluIG1lbW9yeSBvbiBhbnkgZ2l2ZW4gc3lzdGVtLgogKi8KIAogdHlwZWRlZiBwYXNjYWwgT1NTdGF0dXMgKCpDRk1MYXRlSW1wb3J0TG9va3VwUHJvYykoQ29uc3RTdHIyNTVQYXJhbSBzeW1OYW1lLCBDRnJhZ1N5bWJvbENsYXNzIHN5bUNsYXNzLAotCQkJCQkJCQkJCQkJCXZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pOwotCS8vIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGRlZmluZXMgYSBjYWxsYmFjayBmb3IgQ0ZNTGF0ZUltcG9ydENvcmUuCi0JLy8gVGhlIHJvdXRpbmUgaXMgZXhwZWN0ZWQgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIG5hbWVkIAotCS8vIHN5bU5hbWUgYW5kIHJldHVybiBpdCBpbiAqc3ltQWRkci4gIFRoZSBzeW1ib2wgc2hvdWxkIGJlIG9mIGNsYXNzIAotCS8vIHN5bUNsYXNzLCBhbHRob3VnaCB0aGUgY2FsbGJhY2sgZGVjaWRlcyB3aGV0aGVyIGEgY2xhc3MgbWlzbWF0Y2ggaXMgCi0JLy8gYW4gZXJyb3IuICByZWZDb24gaXMgYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBvcmlnaW5hbGx5IAotCS8vIHBhc3NlZCBpbiB0byBDRk1MYXRlSW1wb3J0Q29yZS4KLQkvLwotCS8vIElmIHRoaXMgcm91dGluZSByZXR1cm5zIGFuIGVycm9yLCBhIHN5bWJvbCBhZGRyZXNzIG9mIDAgaXMgYXNzdW1lZC4gCi0JLy8gSWYgdGhlIHN5bWJvbCBpcyBtYXJrZWQgYXMgYSB3ZWFrIGltcG9ydCwgdGhlIENGTUxhdGVJbXBvcnRDb3JlIHdpbGwgCi0JLy8gY29udGludWUsIG90aGVyd2lzZSB0aGUgQ0ZNTGF0ZUltcG9ydENvcmUgcm91dGluZSB3aWxsIGZhaWwgd2l0aCB0aGUgCi0JLy8gZXJyb3IuCi0JCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pOworICAgIC8vIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGRlZmluZXMgYSBjYWxsYmFjayBmb3IgQ0ZNTGF0ZUltcG9ydENvcmUuCisgICAgLy8gVGhlIHJvdXRpbmUgaXMgZXhwZWN0ZWQgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIG5hbWVkCisgICAgLy8gc3ltTmFtZSBhbmQgcmV0dXJuIGl0IGluICpzeW1BZGRyLiAgVGhlIHN5bWJvbCBzaG91bGQgYmUgb2YgY2xhc3MKKyAgICAvLyBzeW1DbGFzcywgYWx0aG91Z2ggdGhlIGNhbGxiYWNrIGRlY2lkZXMgd2hldGhlciBhIGNsYXNzIG1pc21hdGNoIGlzCisgICAgLy8gYW4gZXJyb3IuICByZWZDb24gaXMgYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBvcmlnaW5hbGx5CisgICAgLy8gcGFzc2VkIGluIHRvIENGTUxhdGVJbXBvcnRDb3JlLgorICAgIC8vCisgICAgLy8gSWYgdGhpcyByb3V0aW5lIHJldHVybnMgYW4gZXJyb3IsIGEgc3ltYm9sIGFkZHJlc3Mgb2YgMCBpcyBhc3N1bWVkLgorICAgIC8vIElmIHRoZSBzeW1ib2wgaXMgbWFya2VkIGFzIGEgd2VhayBpbXBvcnQsIHRoZSBDRk1MYXRlSW1wb3J0Q29yZSB3aWxsCisgICAgLy8gY29udGludWUsIG90aGVyd2lzZSB0aGUgQ0ZNTGF0ZUltcG9ydENvcmUgcm91dGluZSB3aWxsIGZhaWwgd2l0aCB0aGUKKyAgICAvLyBlcnJvci4KKwogZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0Q29yZShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCi0JCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAotCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAotCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAotCQkJCQkJCQkJCUNGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwKLQkJCQkJCQkJCQl2b2lkICpyZWZDb24pOwotCS8vIFRoaXMgcm91dGluZSB3aWxsIGxpbmsgeW91LCBhdCBydW50aW1lLCB0byBzb21lIGxpYnJhcnkgCi0JLy8gdGhhdCB5b3Ugd2VyZSB3ZWFrIGxpbmtlZCB0byBhbmQgd2Fzbid0IHByZXNlbnQgd2hlbiB5b3VyCi0JLy8gZnJhZ21lbnQgd2FzIHByZXBhcmVkLiAgQXMgd2VsbCBhcyB0aGUgb2J2aW91cyBmdW5jdGlvbmFsaXR5Ci0JLy8gb2YgYmVpbmcgYWJsZSB0byByZXNvbHZlIHdlYWsgbGlua3MgYWZ0ZXIgcHJlcGFyZSB0aW1lLAotCS8vIHRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgcHV0IHRvIGEgbnVtYmVyIG9mIGxlc3Mgb2J2aW91cyB1c2VzLAotCS8vIHNvbWUgb2Ygd2hpY2ggYXJlIGRpc2N1c3NlZCBhdCB0aGUgdG9wIG9mIHRoaXMgaGVhZGVyIGZpbGUuCi0JLy8KLQkvLyBUbyBjYWxsIHRoaXMgcm91dGluZSwgeW91IG5lZWQgYSBudW1iZXIgb2YgcGllY2VzIG9mIGluZm9ybWF0aW9uOgotCS8vCi0JLy8gMS4gZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklEOiAgVGhlIGxvY2F0aW9uIG9mIHlvdXIgb3duCi0JLy8gICAgY29kZSBmcmFnbWVudCBvbiBkaXNrIGFuZCB0aGUgQ0ZNIGNvbm5lY3Rpb24gSUQgdG8geW91ciBvd24KLQkvLyAgICBjb2RlIGZyYWdtZW50LiAgVHlwaWNhbGx5IHlvdSBnZXQgdGhpcyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgCi0JLy8gICAgZnJhZ21lbnQncyBDRk0gaW5pdCByb3V0aW5lLiAgWW91IG11c3QgZW5zdXJlIHRoYXQKLQkvLyAgICBmcmFnVG9GaXhMb2NhdG9yLT5maWxlU3BlYyBwb2ludHMgdG8gYW4gRlNTcGVjIG9mIHRoZQotCS8vICAgIGZpbGUgd2hpY2ggaG9sZHMgeW91ciBjb2RlIGZyYWdtZW50LgotCS8vCi0JLy8gICAgSU1QT1JUQU5UOgotCS8vICAgIFRoZSBmYWN0IHRoYXQgeW91IHBhc3MgaW4gYSBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgYXMgdGhlCi0JLy8gICAgZnJhZ1RvRml4TG9jYXRvciBpbXBsaWVzIHRoYXQgdGhlIGZyYWdtZW50IHRvIGJlIGZpeGVkIHVwIG11c3QKLQkvLyAgICBiZSBpbiB0aGUgZGF0YSBmb3JrIG9mIGEgZmlsZS4gIFRoZSBjb2RlIGNvdWxkIGJlIG1vZGlmaWVkCi0JLy8gICAgdG8gcmVtb3ZlIHRoaXMgcmVxdWlyZW1lbnQsIGJ1dCBvbiBkaXNrIGNvZGUgZnJhZ21lbnRzIGFyZSB0aGUgbW9zdAotCS8vICAgIGNvbW1vbiBjYXNlLgotCS8vCi0JLy8gICAgSU1QT1JUQU5UOgotCS8vICAgIFRoZSBmcmFnbWVudCB0byBmaXggbWF5IGhhdmUgYSBwYWNrZWQgZGF0YSBzZWN0aW9uLiAgUGFja2luZyB0aGUgCi0JLy8gICAgZGF0YSBzZWN0aW9uIHdpbGwgcmVkdWNlIHRoZSBzaXplIG9mIHlvdXIgZnJhZ21lbnQgb24gZGlzaywgYnV0IGl0IAotCS8vICAgIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgbWVtb3J5IG5lZWRlZCBieSB0aGlzIHJvdXRpbmUgCi0JLy8gICAgKGl0IGluY3JlYXNlcyBtZW1vcnkgdXNhZ2UgYnkgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgdGhlIHBhY2tlZCAKLQkvLyAgICBhbmQgdW5wYWNrZWQgZGF0YSBzZWN0aW9uKS4gIFNlZSBiZWxvdyBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byAKLQkvLyAgICBjcmVhdGUgYW4gdW5wYWNrZWQgZGF0YSBzZWN0aW9uLgotCS8vCi0JLy8gMi4gZnJhZ1RvRml4SW5pdFJvdXRpbmU6ICBBIHBvaW50ZXIgdG8geW91ciBvd24gY29kZSBmcmFnbWVudCdzCi0JLy8gICAgZnJhZ21lbnQgaW5pdGlhbGlzZXIgcm91dGluZS4gIFlvdSBuZWNlc3NhcmlseSBoYXZlIG9uZSBvZiB0aGVzZSAKLQkvLyAgICBiZWNhdXNlIHlvdSBuZWVkIGl0IHRvIGdldCB2YWx1ZXMgZm9yIHRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCAKLQkvLyAgICBmcmFnVG9GaXhDb25uSUQgcGFyYW1ldGVycy4gIEp1c3QgcGFzcyBpdHMgYWRkcmVzcyBpbiBhcyBhIHBhcmFtZXRlciAKLQkvLyAgICBhcyB3ZWxsLiAKLQkvLwotCS8vIDMuIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZTogIFRoZSBuYW1lIG9mIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5IHdoaWNoCi0JLy8gICAgZmFpbGVkIHRvIGxpbmsuICBZb3UgbXVzdCBoYXZlIHdlYWsgbGlua2VkIHRvIHRoaXMgbGlicmFyeS4KLQkvLyAgICBJdCBpcyBveHltb3JpYyBmb3IgeW91IHRvIHBhc3MgYSBzdHJvbmcgbGlua2VkIGxpYnJhcnkgaGVyZSwKLQkvLyAgICBiZWNhdXNlIHlvdXIgY29kZSB3b3VsZCBub3QgaGF2ZSBwcmVwYXJlZCBpZiBhIHN0cm9uZyBsaW5rZWQKLQkvLyAgICBsaWJyYXJ5IGZhaWxlZCB0byBwcmVwYXJlLCBhbmQgc28geW91IGNvdWxkbid0IHN1cHBseSBhIHZhbGlkCi0JLy8vICAgZnJhZ1RvRml4LgotCS8vCi0JLy8gNC4gbG9va3VwLCByZWZDb246ICBBIHBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRoZSAKLQkvLwkgIHJvdXRpbmUgY2FsbHMgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiBhIHN5bWJvbCwgYW5kIGEgcmVmQ29uIAotCS8vICAgIGZvciB0aGF0IGNhbGxiYWNrIHJvdXRpbmUuCi0JLy8KLQkvLyBOb3RlOgotCS8vIFRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCBmcmFnVG9GaXhJbml0Um91dGluZSBwYXJhbWV0ZXJzCi0JLy8gYXJlIGFydGlmYWN0cyBvZiB0aGUgd2F5IGluIHdoaWNoIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZC4KLQkvLyBJbiBhbiBpZGVhbCB3b3JsZCwgd2hlcmUgQ0ZNIGV4cG9ydGVkIGRlY2VudCBpbnRyb3NwZWN0aW9uIEFQSXMKLQkvLyB0byB0aGlyZCBwYXJ0eSBkZXZlbG9wZXJzLCB0aGVzZSBwYXJhbWV0ZXJzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkuCi0JLy8gSWYgeW91J3JlIHVzaW5nIHRoaXMgY29kZSBpbnNpZGUgQXBwbGUsIHlvdSBwcm9iYWJseSBzaG91bGQgaW52ZXN0aWdhdGUKLQkvLyB1c2luZyB0aGUgQ0ZNIHByaXZhdGUgQVBJcyBmb3IgZ2V0dGluZyBhdCB0aGUgaW5mb3JtYXRpb24gdGhlc2UKLQkvLyBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQgZm9yLiAgU2VlIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uCi0JLy8gZm9yIG1vcmUgZGV0YWlscy4KLQkvLwotCS8vIE5vdGU6Ci0JLy8gVGhlIGV4dHJhIG1lbW9yeSB0YWtlbiB3aGVuIHlvdSB1c2UgYSBwYWNrZWQgZGF0YSBzZWN0aW9uIGlzIGFsc28gYW4gCi0JLy8gYXJ0aWZhY3Qgb2YgbXkgd29ya2Fyb3VuZCBmb3IgdGhlIGxhY2sgb2YgQ0ZNIGludHJvc3BlY3Rpb24gQVBJcy4gIEluIAotCS8vIG15IG9waW5pb24gaXQncyBiZXR0ZXIgdG8gdXNlIGFuIHVucGFja2VkIGRhdGEgc2VjdGlvbiBhbmQgY29uc3VtZSBtb3JlIAotCS8vIHNwYWNlIG9uIGRpc2sgd2hpbGUgc2F2aW5nIG1lbW9yeS4gIEluIENvZGVXYXJyaW9yIHlvdSBjYW4gc3dpdGNoIHRvIGFuIAotCS8vIHVucGFja2VkIGRhdGEgc2VjdGlvbiBieSBjaGVja2luZyB0aGUgIkV4cGFuZCBVbmluaXRpYWxpemVkIERhdGEiIAotCS8vIGNoZWNrYm94IGluIHRoZSAiUFBDIFBFRiIgc2V0dGluZ3MgcGFuZWwuICBJbiBNUFcsIHNwZWNpZmllZCB0aGUKLQkvLyAiLXBhY2tkYXRhIG9mZiIgb3B0aW9uIHRvIFBQQ0xpbmsuCi0JLy8KLQkvLyBXaGVuIHRoZSByb3V0aW5lIHJldHVybnMsIGFueSBzeW1ib2xzIHRoYXQgeW91IGltcG9ydGVkIGZyb20gdGhlCi0JLy8gbGlicmFyeSBuYW1lZCB3ZWFrTGlua2VkTGlicmFyeU5hbWUgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgYWRkcmVzcwotCS8vIG9mIHRoZSBzeW1ib2wgcHJvdmlkZWQgYnkgdGhlICJsb29rdXAiIGNhbGxiYWNrIHJvdXRpbmUuCi0JLy8KLQkvLyBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gdW5yZXNvbHZlZCBpbXBvcnQgdG8gcmVtYWluIHVucmVzb2x2ZWQgYWZ0ZXIKLQkvLyB0aGlzIHJvdXRpbmUgcmV0dXJucy4gIElmIHRoZSBzeW1ib2wgaW1wb3J0IGlzIG1hcmtlZCBhcyB3ZWFrIChhcwotCS8vIG9wcG9zZWQgdG8gdGhlIGxpYnJhcnksIHdoaWNoICptdXN0KiBiZSBtYXJrZWQgYXMgd2VhaykgYW5kIHRoZSBzeW1ib2wKLQkvLyBpcyBub3QgZm91bmQgYnkgdGhlICJsb29rdXAiIGNhbGxiYWNrLCB0aGUgcm91dGluZSB3aWxsIHNpbXBsZSBza2lwIAotCS8vIHRoYXQgc3ltYm9sLiAgSWYgdGhlIHN5bWJvbCBpc24ndCBtYXJrZWQgYXMgd2VhaywgdGhlIHJvdXRpbmUgd2lsbCBmYWlsIAotCS8vIGluIHRoYXQgY2FzZS4KLQkvLwotCS8vIE1vc3Qgb2YgdGhlIHBvc3NpYmxlIGVycm9yIHJlc3VsdHMgYXJlIGNvLW9wdGVkIENGTSBlcnJvcnMuICBUaGVzZQotCS8vIGluY2x1ZGU6Ci0JLy8KLQkvLyBjZnJhZ0ZyYWdtZW50Rm9ybWF0RXJyICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGlzIGlzIGFuIHVua25vd24gZm9ybWF0LgotCS8vIGNmcmFnTm9TZWN0aW9uRXJyICAgICAgIC0tIENvdWxkIG5vdCBmaW5kIHRoZSBsb2FkZXIgc2VjdGlvbiBpbiB0aGUgZnJhZ21lbnQgdG8gZml4LgotCS8vIGNmcmFnTm9MaWJyYXJ5RXJyICAgICAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgbm90IHdlYWsgbGlua2VkIHRvIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4KLQkvLyBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnIgICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGRvZXNuJ3QgaGF2ZSBhIGRhdGEgc2VjdGlvbi4KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGlzIHN0cm9uZyBsaW5rZWQgdG8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLgotCS8vICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFRoZSBmcmFnbWVudCBkb2Vzbid0IGhhdmUgYW4gaW5pdCByb3V0aW5lLgotCS8vIGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyIC0tIEVuY291bnRlcmVkIGFuIHVuZGVmaW5lZCByZWxvY2F0aW9uIG9wY29kZS4KLQkvLyB1bmltcEVyciAgICAgICAgICAgICAgICAtLSBFbmNvdW50ZXJlZCBhbiB1bmltcGxlbWVudCByZWxvY2F0aW9uIG9wY29kZS4gIFRoZQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gZW5naW5lIG9ubHkgaW1wbGVtZW50cyBhIHN1YnNldCBvZiB0aGUgQ0ZNCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBvcGNvZGVzLCB0aGUgc3Vic2V0IG1vc3QgY29tbW9ubHkgdXNlZCBieQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QVyBhbmQgQ29kZVdhcnJpb3IgUEVGIGNvbnRhaW5lcnMuICBJZiB5b3UgZW5jb3VudGVyCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlcnJvciwgeW91J2xsIHByb2JhYmx5IGhhdmUgdG8gYWRkIHRoZSB3ZWlyZAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gb3Bjb2RlIHRvIHRoZSBlbmdpbmUsIHdoaWNoIHNob3VsZG4ndCBiZQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHRvbyBoYXJkLgotCS8vIG1lbUZ1bGxFcnIJCQkgICAtLSBJdCdzIGxpa2VseSB0aGF0IHRoaXMgZXJyb3IgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBtZW1vcnkgCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIHVucGFjayB5b3VyIGRhdGEgc2VjdGlvbi4gIEVpdGhlciBtYWtlIHlvdXIgCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBzZWN0aW9uIHNtYWxsZXIsIG9yIHVucGFjayBpdCAoc2VlIGFib3ZlKS4KLQkvLyBlcnJvcnMgcmV0dXJuZWQgYnkgRmluZFN5bWJvbAotCS8vIGVycm9ycyByZXR1cm5lZCBieSBNZW1vcnkgTWFuYWdlcgotCS8vCi0JLy8gVGhlIHJvdXRpbmUgbmVlZHMgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBsb2FkZXIgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQKLQkvLyB0byBmaXggaW4gbWVtb3J5LiAgSXQgYWxsb2NhdGVzIHRoYXQgbWVtb3J5IHVzaW5nIE5ld1B0ciBhbmQgZGlzcHNvc2VzIG9mIAotCS8vIGl0IGJlZm9yZSBpdCByZXR1cm5zLiAgWW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGUgbWVtb3J5IGFsbG9jYXRvciwgd2hpY2gKLQkvLyBpcyB2ZXJ5IHNpbXBsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVmQ29uKTsKKyAgICAvLyBUaGlzIHJvdXRpbmUgd2lsbCBsaW5rIHlvdSwgYXQgcnVudGltZSwgdG8gc29tZSBsaWJyYXJ5CisgICAgLy8gdGhhdCB5b3Ugd2VyZSB3ZWFrIGxpbmtlZCB0byBhbmQgd2Fzbid0IHByZXNlbnQgd2hlbiB5b3VyCisgICAgLy8gZnJhZ21lbnQgd2FzIHByZXBhcmVkLiAgQXMgd2VsbCBhcyB0aGUgb2J2aW91cyBmdW5jdGlvbmFsaXR5CisgICAgLy8gb2YgYmVpbmcgYWJsZSB0byByZXNvbHZlIHdlYWsgbGlua3MgYWZ0ZXIgcHJlcGFyZSB0aW1lLAorICAgIC8vIHRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgcHV0IHRvIGEgbnVtYmVyIG9mIGxlc3Mgb2J2aW91cyB1c2VzLAorICAgIC8vIHNvbWUgb2Ygd2hpY2ggYXJlIGRpc2N1c3NlZCBhdCB0aGUgdG9wIG9mIHRoaXMgaGVhZGVyIGZpbGUuCisgICAgLy8KKyAgICAvLyBUbyBjYWxsIHRoaXMgcm91dGluZSwgeW91IG5lZWQgYSBudW1iZXIgb2YgcGllY2VzIG9mIGluZm9ybWF0aW9uOgorICAgIC8vCisgICAgLy8gMS4gZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklEOiAgVGhlIGxvY2F0aW9uIG9mIHlvdXIgb3duCisgICAgLy8gICAgY29kZSBmcmFnbWVudCBvbiBkaXNrIGFuZCB0aGUgQ0ZNIGNvbm5lY3Rpb24gSUQgdG8geW91ciBvd24KKyAgICAvLyAgICBjb2RlIGZyYWdtZW50LiAgVHlwaWNhbGx5IHlvdSBnZXQgdGhpcyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIKKyAgICAvLyAgICBmcmFnbWVudCdzIENGTSBpbml0IHJvdXRpbmUuICBZb3UgbXVzdCBlbnN1cmUgdGhhdAorICAgIC8vICAgIGZyYWdUb0ZpeExvY2F0b3ItPmZpbGVTcGVjIHBvaW50cyB0byBhbiBGU1NwZWMgb2YgdGhlCisgICAgLy8gICAgZmlsZSB3aGljaCBob2xkcyB5b3VyIGNvZGUgZnJhZ21lbnQuCisgICAgLy8KKyAgICAvLyAgICBJTVBPUlRBTlQ6CisgICAgLy8gICAgVGhlIGZhY3QgdGhhdCB5b3UgcGFzcyBpbiBhIENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciBhcyB0aGUKKyAgICAvLyAgICBmcmFnVG9GaXhMb2NhdG9yIGltcGxpZXMgdGhhdCB0aGUgZnJhZ21lbnQgdG8gYmUgZml4ZWQgdXAgbXVzdAorICAgIC8vICAgIGJlIGluIHRoZSBkYXRhIGZvcmsgb2YgYSBmaWxlLiAgVGhlIGNvZGUgY291bGQgYmUgbW9kaWZpZWQKKyAgICAvLyAgICB0byByZW1vdmUgdGhpcyByZXF1aXJlbWVudCwgYnV0IG9uIGRpc2sgY29kZSBmcmFnbWVudHMgYXJlIHRoZSBtb3N0CisgICAgLy8gICAgY29tbW9uIGNhc2UuCisgICAgLy8KKyAgICAvLyAgICBJTVBPUlRBTlQ6CisgICAgLy8gICAgVGhlIGZyYWdtZW50IHRvIGZpeCBtYXkgaGF2ZSBhIHBhY2tlZCBkYXRhIHNlY3Rpb24uICBQYWNraW5nIHRoZQorICAgIC8vICAgIGRhdGEgc2VjdGlvbiB3aWxsIHJlZHVjZSB0aGUgc2l6ZSBvZiB5b3VyIGZyYWdtZW50IG9uIGRpc2ssIGJ1dCBpdAorICAgIC8vICAgIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgbWVtb3J5IG5lZWRlZCBieSB0aGlzIHJvdXRpbmUKKyAgICAvLyAgICAoaXQgaW5jcmVhc2VzIG1lbW9yeSB1c2FnZSBieSB0aGUgc3VtIG9mIHRoZSBzaXplcyBvZiB0aGUgcGFja2VkCisgICAgLy8gICAgYW5kIHVucGFja2VkIGRhdGEgc2VjdGlvbikuICBTZWUgYmVsb3cgZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8KKyAgICAvLyAgICBjcmVhdGUgYW4gdW5wYWNrZWQgZGF0YSBzZWN0aW9uLgorICAgIC8vCisgICAgLy8gMi4gZnJhZ1RvRml4SW5pdFJvdXRpbmU6ICBBIHBvaW50ZXIgdG8geW91ciBvd24gY29kZSBmcmFnbWVudCdzCisgICAgLy8gICAgZnJhZ21lbnQgaW5pdGlhbGlzZXIgcm91dGluZS4gIFlvdSBuZWNlc3NhcmlseSBoYXZlIG9uZSBvZiB0aGVzZQorICAgIC8vICAgIGJlY2F1c2UgeW91IG5lZWQgaXQgdG8gZ2V0IHZhbHVlcyBmb3IgdGhlIGZyYWdUb0ZpeExvY2F0b3IgYW5kCisgICAgLy8gICAgZnJhZ1RvRml4Q29ubklEIHBhcmFtZXRlcnMuICBKdXN0IHBhc3MgaXRzIGFkZHJlc3MgaW4gYXMgYSBwYXJhbWV0ZXIKKyAgICAvLyAgICBhcyB3ZWxsLgorICAgIC8vCisgICAgLy8gMy4gd2Vha0xpbmtlZExpYnJhcnlOYW1lOiAgVGhlIG5hbWUgb2YgdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkgd2hpY2gKKyAgICAvLyAgICBmYWlsZWQgdG8gbGluay4gIFlvdSBtdXN0IGhhdmUgd2VhayBsaW5rZWQgdG8gdGhpcyBsaWJyYXJ5LgorICAgIC8vICAgIEl0IGlzIG94eW1vcmljIGZvciB5b3UgdG8gcGFzcyBhIHN0cm9uZyBsaW5rZWQgbGlicmFyeSBoZXJlLAorICAgIC8vICAgIGJlY2F1c2UgeW91ciBjb2RlIHdvdWxkIG5vdCBoYXZlIHByZXBhcmVkIGlmIGEgc3Ryb25nIGxpbmtlZAorICAgIC8vICAgIGxpYnJhcnkgZmFpbGVkIHRvIHByZXBhcmUsIGFuZCBzbyB5b3UgY291bGRuJ3Qgc3VwcGx5IGEgdmFsaWQKKyAgICAvLy8gICBmcmFnVG9GaXguCisgICAgLy8KKyAgICAvLyA0LiBsb29rdXAsIHJlZkNvbjogIEEgcG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdGhlCisgICAgLy8gICAgICAgICAgICByb3V0aW5lIGNhbGxzIHRvIGxvb2sgdXAgdGhlIGFkZHJlc3Mgb2YgYSBzeW1ib2wsIGFuZCBhIHJlZkNvbgorICAgIC8vICAgIGZvciB0aGF0IGNhbGxiYWNrIHJvdXRpbmUuCisgICAgLy8KKyAgICAvLyBOb3RlOgorICAgIC8vIFRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCBmcmFnVG9GaXhJbml0Um91dGluZSBwYXJhbWV0ZXJzCisgICAgLy8gYXJlIGFydGlmYWN0cyBvZiB0aGUgd2F5IGluIHdoaWNoIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZC4KKyAgICAvLyBJbiBhbiBpZGVhbCB3b3JsZCwgd2hlcmUgQ0ZNIGV4cG9ydGVkIGRlY2VudCBpbnRyb3NwZWN0aW9uIEFQSXMKKyAgICAvLyB0byB0aGlyZCBwYXJ0eSBkZXZlbG9wZXJzLCB0aGVzZSBwYXJhbWV0ZXJzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkuCisgICAgLy8gSWYgeW91J3JlIHVzaW5nIHRoaXMgY29kZSBpbnNpZGUgQXBwbGUsIHlvdSBwcm9iYWJseSBzaG91bGQgaW52ZXN0aWdhdGUKKyAgICAvLyB1c2luZyB0aGUgQ0ZNIHByaXZhdGUgQVBJcyBmb3IgZ2V0dGluZyBhdCB0aGUgaW5mb3JtYXRpb24gdGhlc2UKKyAgICAvLyBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQgZm9yLiAgU2VlIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uCisgICAgLy8gZm9yIG1vcmUgZGV0YWlscy4KKyAgICAvLworICAgIC8vIE5vdGU6CisgICAgLy8gVGhlIGV4dHJhIG1lbW9yeSB0YWtlbiB3aGVuIHlvdSB1c2UgYSBwYWNrZWQgZGF0YSBzZWN0aW9uIGlzIGFsc28gYW4KKyAgICAvLyBhcnRpZmFjdCBvZiBteSB3b3JrYXJvdW5kIGZvciB0aGUgbGFjayBvZiBDRk0gaW50cm9zcGVjdGlvbiBBUElzLiAgSW4KKyAgICAvLyBteSBvcGluaW9uIGl0J3MgYmV0dGVyIHRvIHVzZSBhbiB1bnBhY2tlZCBkYXRhIHNlY3Rpb24gYW5kIGNvbnN1bWUgbW9yZQorICAgIC8vIHNwYWNlIG9uIGRpc2sgd2hpbGUgc2F2aW5nIG1lbW9yeS4gIEluIENvZGVXYXJyaW9yIHlvdSBjYW4gc3dpdGNoIHRvIGFuCisgICAgLy8gdW5wYWNrZWQgZGF0YSBzZWN0aW9uIGJ5IGNoZWNraW5nIHRoZSAiRXhwYW5kIFVuaW5pdGlhbGl6ZWQgRGF0YSIKKyAgICAvLyBjaGVja2JveCBpbiB0aGUgIlBQQyBQRUYiIHNldHRpbmdzIHBhbmVsLiAgSW4gTVBXLCBzcGVjaWZpZWQgdGhlCisgICAgLy8gIi1wYWNrZGF0YSBvZmYiIG9wdGlvbiB0byBQUENMaW5rLgorICAgIC8vCisgICAgLy8gV2hlbiB0aGUgcm91dGluZSByZXR1cm5zLCBhbnkgc3ltYm9scyB0aGF0IHlvdSBpbXBvcnRlZCBmcm9tIHRoZQorICAgIC8vIGxpYnJhcnkgbmFtZWQgd2Vha0xpbmtlZExpYnJhcnlOYW1lIHdpbGwgYmUgcmVzb2x2ZWQgdG8gdGhlIGFkZHJlc3MKKyAgICAvLyBvZiB0aGUgc3ltYm9sIHByb3ZpZGVkIGJ5IHRoZSAibG9va3VwIiBjYWxsYmFjayByb3V0aW5lLgorICAgIC8vCisgICAgLy8gSXQgaXMgcG9zc2libGUgZm9yIGFuIHVucmVzb2x2ZWQgaW1wb3J0IHRvIHJlbWFpbiB1bnJlc29sdmVkIGFmdGVyCisgICAgLy8gdGhpcyByb3V0aW5lIHJldHVybnMuICBJZiB0aGUgc3ltYm9sIGltcG9ydCBpcyBtYXJrZWQgYXMgd2VhayAoYXMKKyAgICAvLyBvcHBvc2VkIHRvIHRoZSBsaWJyYXJ5LCB3aGljaCAqbXVzdCogYmUgbWFya2VkIGFzIHdlYWspIGFuZCB0aGUgc3ltYm9sCisgICAgLy8gaXMgbm90IGZvdW5kIGJ5IHRoZSAibG9va3VwIiBjYWxsYmFjaywgdGhlIHJvdXRpbmUgd2lsbCBzaW1wbGUgc2tpcAorICAgIC8vIHRoYXQgc3ltYm9sLiAgSWYgdGhlIHN5bWJvbCBpc24ndCBtYXJrZWQgYXMgd2VhaywgdGhlIHJvdXRpbmUgd2lsbCBmYWlsCisgICAgLy8gaW4gdGhhdCBjYXNlLgorICAgIC8vCisgICAgLy8gTW9zdCBvZiB0aGUgcG9zc2libGUgZXJyb3IgcmVzdWx0cyBhcmUgY28tb3B0ZWQgQ0ZNIGVycm9ycy4gIFRoZXNlCisgICAgLy8gaW5jbHVkZToKKyAgICAvLworICAgIC8vIGNmcmFnRnJhZ21lbnRGb3JtYXRFcnIgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgaXMgYW4gdW5rbm93biBmb3JtYXQuCisgICAgLy8gY2ZyYWdOb1NlY3Rpb25FcnIgICAgICAgLS0gQ291bGQgbm90IGZpbmQgdGhlIGxvYWRlciBzZWN0aW9uIGluIHRoZSBmcmFnbWVudCB0byBmaXguCisgICAgLy8gY2ZyYWdOb0xpYnJhcnlFcnIgICAgICAgLS0gVGhlIGZyYWdtZW50IHRvIGZpeCBpcyBub3Qgd2VhayBsaW5rZWQgdG8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLgorICAgIC8vIGNmcmFnRnJhZ21lbnRVc2FnZUVyciAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggZG9lc24ndCBoYXZlIGEgZGF0YSBzZWN0aW9uLgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgc3Ryb25nIGxpbmtlZCB0byB3ZWFrTGlua2VkTGlicmFyeU5hbWUuCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgLS0gVGhlIGZyYWdtZW50IGRvZXNuJ3QgaGF2ZSBhbiBpbml0IHJvdXRpbmUuCisgICAgLy8gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnIgLS0gRW5jb3VudGVyZWQgYW4gdW5kZWZpbmVkIHJlbG9jYXRpb24gb3Bjb2RlLgorICAgIC8vIHVuaW1wRXJyICAgICAgICAgICAgICAgIC0tIEVuY291bnRlcmVkIGFuIHVuaW1wbGVtZW50IHJlbG9jYXRpb24gb3Bjb2RlLiAgVGhlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBlbmdpbmUgb25seSBpbXBsZW1lbnRzIGEgc3Vic2V0IG9mIHRoZSBDRk0KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uIG9wY29kZXMsIHRoZSBzdWJzZXQgbW9zdCBjb21tb25seSB1c2VkIGJ5CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBXIGFuZCBDb2RlV2FycmlvciBQRUYgY29udGFpbmVycy4gIElmIHlvdSBlbmNvdW50ZXIKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVycm9yLCB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byBhZGQgdGhlIHdlaXJkCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBvcGNvZGUgdG8gdGhlIGVuZ2luZSwgd2hpY2ggc2hvdWxkbid0IGJlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdG9vIGhhcmQuCisgICAgLy8gbWVtRnVsbEVyciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gSXQncyBsaWtlbHkgdGhhdCB0aGlzIGVycm9yIGlzIHRyaWdnZXJlZCBieSB0aGUgbWVtb3J5CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIHVucGFjayB5b3VyIGRhdGEgc2VjdGlvbi4gIEVpdGhlciBtYWtlIHlvdXIKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHNlY3Rpb24gc21hbGxlciwgb3IgdW5wYWNrIGl0IChzZWUgYWJvdmUpLgorICAgIC8vIGVycm9ycyByZXR1cm5lZCBieSBGaW5kU3ltYm9sCisgICAgLy8gZXJyb3JzIHJldHVybmVkIGJ5IE1lbW9yeSBNYW5hZ2VyCisgICAgLy8KKyAgICAvLyBUaGUgcm91dGluZSBuZWVkcyBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIGxvYWRlciBzZWN0aW9uIG9mIHRoZSBmcmFnbWVudAorICAgIC8vIHRvIGZpeCBpbiBtZW1vcnkuICBJdCBhbGxvY2F0ZXMgdGhhdCBtZW1vcnkgdXNpbmcgTmV3UHRyIGFuZCBkaXNwc29zZXMgb2YKKyAgICAvLyBpdCBiZWZvcmUgaXQgcmV0dXJucy4gIFlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIG1lbW9yeSBhbGxvY2F0b3IsIHdoaWNoCisgICAgLy8gaXMgdmVyeSBzaW1wbGUuCiAKIGV4dGVybiBwYXNjYWwgT1NTdGF0dXMgQ0ZNTGF0ZUltcG9ydExpYnJhcnkoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKLQkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKLQkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCk7Ci0JLy8gQSB3cmFwcGVyIGFyb3VuZCBDRk1MYXRlSW1wb3J0Q29yZSB0aGF0IGxvb2tzIHVwIHN5bWJvbHMgYnkgY2FsbGluZyAKLQkvLyBGaW5kU3ltYm9sIG9uIGEgY29ubmVjdGlvbiB0byBhIENGTSBsaWJyYXJ5IChjb25uSURUb0ltcG9ydCkuCi0JLy8gWW91IGNhbiBnZXQgdGhpcyBjb25uZWN0aW9uIElEIHRocm91Z2ggYW55IHN0YW5kYXJkIENGTSBBUEksIGZvciBleGFtcGxlCi0JLy8gR2V0U2hhcmVkTGlicmFyeSwgR2V0RGlza0ZyYWdtZW50LCBvciBHZXRNZW1GcmFnbWVudC4KLQkvLwotCS8vIElNUE9SVEFOVDoKLQkvLyBUaGUgZnJhZ21lbnQgbmFtZSBmb3IgY29ubklEVG9JbXBvcnQgKmRvZXMgbm90KiBoYXZlIHRvIG1hdGNoCi0JLy8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLiAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBwb3dlciBvZiB0aGlzIGxpYnJhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCk7CisgICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBDRk1MYXRlSW1wb3J0Q29yZSB0aGF0IGxvb2tzIHVwIHN5bWJvbHMgYnkgY2FsbGluZworICAgIC8vIEZpbmRTeW1ib2wgb24gYSBjb25uZWN0aW9uIHRvIGEgQ0ZNIGxpYnJhcnkgKGNvbm5JRFRvSW1wb3J0KS4KKyAgICAvLyBZb3UgY2FuIGdldCB0aGlzIGNvbm5lY3Rpb24gSUQgdGhyb3VnaCBhbnkgc3RhbmRhcmQgQ0ZNIEFQSSwgZm9yIGV4YW1wbGUKKyAgICAvLyBHZXRTaGFyZWRMaWJyYXJ5LCBHZXREaXNrRnJhZ21lbnQsIG9yIEdldE1lbUZyYWdtZW50LgorICAgIC8vCisgICAgLy8gSU1QT1JUQU5UOgorICAgIC8vIFRoZSBmcmFnbWVudCBuYW1lIGZvciBjb25uSURUb0ltcG9ydCAqZG9lcyBub3QqIGhhdmUgdG8gbWF0Y2gKKyAgICAvLyB3ZWFrTGlua2VkTGlicmFyeU5hbWUuICBUaGlzIGlzIHBhcnQgb2YgdGhlIHBvd2VyIG9mIHRoaXMgbGlicmFyeS4KIAogZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0QnVuZGxlKGNvbnN0IENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciAqZnJhZ1RvRml4TG9jYXRvciwKLQkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCi0JCQkJCQkJCQkJQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCi0JCQkJCQkJCQkJQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCi0JCQkJCQkJCQkJQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQpOwotCS8vIEEgd3JhcHBlciBhcm91bmQgQ0ZNTGF0ZUltcG9ydENvcmUgdGhhdCBsb29rcyB1cCBzeW1ib2xzIGJ5IGNhbGxpbmcgCi0JLy8gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lIG9uIGEgcmVmZXJlbmNlIHRvIGEgQ29yZSBGb3VuZGF0aW9uIAotCS8vIGJ1bmRsZSAoYnVuZGxlVG9JbXBvcnQpLiAgWW91IGNhbiBnZXQgdGhpcyByZWZlcmVuY2UgdGhyb3VnaCBhbnkgCi0JLy8gQ29yZSBGb3VuZGF0aW9uIGJ1bmRsZSBBUEksIGZvciBleGFtcGxlIENGQnVuZGxlQ3JlYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQpOworICAgIC8vIEEgd3JhcHBlciBhcm91bmQgQ0ZNTGF0ZUltcG9ydENvcmUgdGhhdCBsb29rcyB1cCBzeW1ib2xzIGJ5IGNhbGxpbmcKKyAgICAvLyBDRkJ1bmRsZUdldEZ1bmN0aW9uUG9pbnRlckZvck5hbWUgb24gYSByZWZlcmVuY2UgdG8gYSBDb3JlIEZvdW5kYXRpb24KKyAgICAvLyBidW5kbGUgKGJ1bmRsZVRvSW1wb3J0KS4gIFlvdSBjYW4gZ2V0IHRoaXMgcmVmZXJlbmNlIHRocm91Z2ggYW55CisgICAgLy8gQ29yZSBGb3VuZGF0aW9uIGJ1bmRsZSBBUEksIGZvciBleGFtcGxlIENGQnVuZGxlQ3JlYXRlLgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL19DR21vZHVsZS5jIGIvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMKaW5kZXggZTM2ZmNlOS4uNzE2OTEwMSAxMDA3NTUKLS0tIGEvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yNiw2NyArMjYsNjcgQEAKIFB5T2JqZWN0ICpDR1BvaW50X05ldyhDR1BvaW50ICppdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT55KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+eCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT55KTsKIH0KIAogaW50CiBDR1BvaW50X0NvbnZlcnQoUHlPYmplY3QgKnYsIENHUG9pbnQgKnBfaXRzZWxmKQogewotICAgICAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+eSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT54LAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnkpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIFB5T2JqZWN0ICpDR1JlY3RfTmV3KENHUmVjdCAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5vcmlnaW4ueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+b3JpZ2luLnksCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUuaGVpZ2h0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5vcmlnaW4ueCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5vcmlnaW4ueSwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5zaXplLndpZHRoLAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUuaGVpZ2h0KTsKIH0KIAogaW50CiBDR1JlY3RfQ29udmVydChQeU9iamVjdCAqdiwgQ0dSZWN0ICpwX2l0c2VsZikKIHsKLSAgICAgICAgaWYoICFQeUFyZ19QYXJzZSh2LCAiKGZmZmYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+b3JpZ2luLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPm9yaWdpbi55LAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5zaXplLndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5zaXplLmhlaWdodCkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmZmZikiLAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPm9yaWdpbi54LAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPm9yaWdpbi55LAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnNpemUud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+c2l6ZS5oZWlnaHQpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIFB5T2JqZWN0ICpDR0FmZmluZVRyYW5zZm9ybV9OZXcoQ0dBZmZpbmVUcmFuc2Zvcm0gKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmZmZmZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5hLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5iLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5jLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5kLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT50eCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+dHkpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZmZmKSIsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+YSwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5iLAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmMsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+ZCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT50eCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT50eSk7CiB9CiAKIGludAogQ0dBZmZpbmVUcmFuc2Zvcm1fQ29udmVydChQeU9iamVjdCAqdiwgQ0dBZmZpbmVUcmFuc2Zvcm0gKnBfaXRzZWxmKQogewotICAgICAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmZmZmZmKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnR4LAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT50eSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmZmZmZmKSIsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+YSwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5iLAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmMsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+ZCwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT50eCwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT50eSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR19FcnJvcjsKQEAgLTk4LDEwOTAgKzk4LDEwOTAgQEAKICNkZWZpbmUgQ0dDb250ZXh0UmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNHQ29udGV4dFJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDR0NvbnRleHRSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENHQ29udGV4dFJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNHQ29udGV4dFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENHQ29udGV4dFJlZiBvYl9pdHNlbGY7CiB9IENHQ29udGV4dFJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9OZXcoQ0dDb250ZXh0UmVmIGl0c2VsZikKIHsKLQlDR0NvbnRleHRSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKENHQ29udGV4dFJlZk9iamVjdCwgJkNHQ29udGV4dFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0dDb250ZXh0UmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDR0NvbnRleHRSZWZPYmplY3QsICZDR0NvbnRleHRSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0dDb250ZXh0UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENHQ29udGV4dFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFDR0NvbnRleHRSZWZPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0dDb250ZXh0UmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENHQ29udGV4dFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDR0NvbnRleHRSZWZPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0dDb250ZXh0UmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENHQ29udGV4dFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENHQ29udGV4dFJlZk9ial9kZWFsbG9jKENHQ29udGV4dFJlZk9iamVjdCAqc2VsZikKIHsKLQlDR0NvbnRleHRSZWxlYXNlKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBDR0NvbnRleHRSZWxlYXNlKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2F2ZUdTdGF0ZShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTYXZlR1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSZXN0b3JlR1N0YXRlKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFJlc3RvcmVHU3RhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNjYWxlQ1RNKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgc3g7Ci0JZmxvYXQgc3k7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3gsCi0JICAgICAgICAgICAgICAgICAgICAgICZzeSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNjYWxlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc3gsCi0JICAgICAgICAgICAgICAgICAgc3kpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgc3g7CisgICAgZmxvYXQgc3k7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzeSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNjYWxlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgc3gsCisgICAgICAgICAgICAgICAgICAgICAgc3kpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgdHg7Ci0JZmxvYXQgdHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0eSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFRyYW5zbGF0ZUNUTShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICB0eCwKLQkgICAgICAgICAgICAgICAgICAgICAgdHkpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgdHg7CisgICAgZmxvYXQgdHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Um90YXRlQ1RNKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgYW5nbGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbmdsZSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFJvdGF0ZUNUTShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBhbmdsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBhbmdsZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0Um90YXRlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENvbmNhdENUTShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX0NvbnZlcnQsICZ0cmFuc2Zvcm0pKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRDb25jYXRDVE0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX0NvbnZlcnQsICZ0cmFuc2Zvcm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRDb25jYXRDVE0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldENUTShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHQWZmaW5lVHJhbnNmb3JtIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0dDb250ZXh0R2V0Q1RNKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1fTmV3LCAmX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDR0NvbnRleHRHZXRDVE0oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lV2lkdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB3aWR0aDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0TGluZVdpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHdpZHRoOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRMaW5lV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TGluZUNhcChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWludCBjYXA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYXApKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRMaW5lQ2FwKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBjYXApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaW50IGNhcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldExpbmVDYXAoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lSm9pbihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWludCBqb2luOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAotCSAgICAgICAgICAgICAgICAgICAgICAmam9pbikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldExpbmVKb2luKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgam9pbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpbnQgam9pbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmpvaW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRMaW5lSm9pbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TWl0ZXJMaW1pdChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGxpbWl0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRNaXRlckxpbWl0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBsaW1pdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0TWl0ZXJMaW1pdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0RmxhdG5lc3MoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBmbGF0bmVzczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXRuZXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0RmxhdG5lc3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGF0bmVzcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBmbGF0bmVzczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXRuZXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0RmxhdG5lc3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0bmVzcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRBbHBoYShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRBbHBoYShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGFscGhhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRBbHBoYShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEJlZ2luUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRCZWdpblBhdGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QmVnaW5QYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0TW92ZVRvUG9pbnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRNb3ZlVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHgsCi0JICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCB4OworICAgIGZsb2F0IHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRNb3ZlVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgeSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRMaW5lVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHg7Ci0JZmxvYXQgeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4LAotCSAgICAgICAgICAgICAgICAgICAgICAmeSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEFkZExpbmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICB5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEFkZExpbmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEN1cnZlVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGNwMXg7Ci0JZmxvYXQgY3AxeTsKLQlmbG9hdCBjcDJ4OwotCWZsb2F0IGNwMnk7Ci0JZmxvYXQgeDsKLQlmbG9hdCB5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcDF4LAotCSAgICAgICAgICAgICAgICAgICAgICAmY3AxeSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNwMngsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcDJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRDdXJ2ZVRvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AxeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AxeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AyeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBjcDF4OworICAgIGZsb2F0IGNwMXk7CisgICAgZmxvYXQgY3AyeDsKKyAgICBmbG9hdCBjcDJ5OworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AxeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwMXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcDJ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGNweDsKLQlmbG9hdCBjcHk7Ci0JZmxvYXQgeDsKLQlmbG9hdCB5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3B4LAotCSAgICAgICAgICAgICAgICAgICAgICAmY3B5LAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRRdWFkQ3VydmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBjcHg7CisgICAgZmxvYXQgY3B5OworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNweCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xvc2VQYXRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dENsb3NlUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRDbG9zZVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRSZWN0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dSZWN0IHJlY3Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICByZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUmVjdCByZWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgcmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRBcmMoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JZmxvYXQgcmFkaXVzOwotCWZsb2F0IHN0YXJ0QW5nbGU7Ci0JZmxvYXQgZW5kQW5nbGU7Ci0JaW50IGNsb2Nrd2lzZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZmkiLAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnksCi0JICAgICAgICAgICAgICAgICAgICAgICZyYWRpdXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5kQW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZjbG9ja3dpc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRBcmMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgeSwKLQkgICAgICAgICAgICAgICAgcmFkaXVzLAotCSAgICAgICAgICAgICAgICBzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICBlbmRBbmdsZSwKLQkgICAgICAgICAgICAgICAgY2xvY2t3aXNlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBmbG9hdCByYWRpdXM7CisgICAgZmxvYXQgc3RhcnRBbmdsZTsKKyAgICBmbG9hdCBlbmRBbmdsZTsKKyAgICBpbnQgY2xvY2t3aXNlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2Nrd2lzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEFkZEFyYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICByYWRpdXMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgIGVuZEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICBjbG9ja3dpc2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQXJjVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHgxOwotCWZsb2F0IHkxOwotCWZsb2F0IHgyOwotCWZsb2F0IHkyOwotCWZsb2F0IHJhZGl1czsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4MSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkxLAotCSAgICAgICAgICAgICAgICAgICAgICAmeDIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ5MiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cykpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEFkZEFyY1RvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHgxLAotCSAgICAgICAgICAgICAgICAgICAgICAgeTEsCi0JICAgICAgICAgICAgICAgICAgICAgICB4MiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHkyLAotCSAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHgxOworICAgIGZsb2F0IHkxOworICAgIGZsb2F0IHgyOworICAgIGZsb2F0IHkyOworICAgIGZsb2F0IHJhZGl1czsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEFkZEFyY1RvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dElzUGF0aEVtcHR5KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaW50IF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0dDb250ZXh0SXNQYXRoRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENHQ29udGV4dElzUGF0aEVtcHR5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQ3VycmVudFBvaW50KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dQb2ludCBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENHQ29udGV4dEdldFBhdGhDdXJyZW50UG9pbnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDR1BvaW50X05ldywgJl9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUG9pbnQgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDR0NvbnRleHRHZXRQYXRoQ3VycmVudFBvaW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludF9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3goQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3goX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfTmV3LCAmX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X05ldywgJl9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dERyYXdQYXRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaW50IG1vZGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RHJhd1BhdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBtb2RlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBtb2RlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dERyYXdQYXRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRGaWxsUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRGaWxsUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEVPRmlsbFBhdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RU9GaWxsUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRFT0ZpbGxQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTdHJva2VQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFN0cm9rZVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUmVjdChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHUmVjdCByZWN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RmlsbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICByZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUmVjdCByZWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0RmlsbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICByZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFN0cm9rZVJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTdHJva2VSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3RXaXRoV2lkdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlmbG9hdCB3aWR0aDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFN0cm9rZVJlY3RXaXRoV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR1JlY3QgcmVjdDsKKyAgICBmbG9hdCB3aWR0aDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFN0cm9rZVJlY3RXaXRoV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGVhclJlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dENsZWFyUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICByZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUmVjdCByZWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0Q2xlYXJSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRDbGlwKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dENsaXAoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0NsaXAoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RU9DbGlwKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEVPQ2xpcChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsaXBUb1JlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dENsaXBUb1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRDbGlwVG9SZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlGaWxsQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBncmF5OwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldEdyYXlGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBncmF5OworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldEdyYXlGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRHcmF5U3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBncmF5OwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmF5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBncmF5OworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCByZWQ7Ci0JZmxvYXQgZ3JlZW47Ci0JZmxvYXQgYmx1ZTsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyZWVuLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHJlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHJlZDsKKyAgICBmbG9hdCBncmVlbjsKKyAgICBmbG9hdCBibHVlOworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCByZWQ7Ci0JZmxvYXQgZ3JlZW47Ci0JZmxvYXQgYmx1ZTsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyZWVuLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCByZWQ7CisgICAgZmxvYXQgZ3JlZW47CisgICAgZmxvYXQgYmx1ZTsKKyAgICBmbG9hdCBhbHBoYTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgY3lhbjsKLQlmbG9hdCBtYWdlbnRhOwotCWZsb2F0IHllbGxvdzsKLQlmbG9hdCBibGFjazsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjeWFuLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHllbGxvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgY3lhbjsKKyAgICBmbG9hdCBtYWdlbnRhOworICAgIGZsb2F0IHllbGxvdzsKKyAgICBmbG9hdCBibGFjazsKKyAgICBmbG9hdCBhbHBoYTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS1N0cm9rZUNvbG9yKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgY3lhbjsKLQlmbG9hdCBtYWdlbnRhOwotCWZsb2F0IHllbGxvdzsKLQlmbG9hdCBibGFjazsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lhbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVsbG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgY3lhbjsKKyAgICBmbG9hdCBtYWdlbnRhOworICAgIGZsb2F0IHllbGxvdzsKKyAgICBmbG9hdCBibGFjazsKKyAgICBmbG9hdCBhbHBoYTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVsbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaW50IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaW50IHF1YWxpdHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBxdWFsaXR5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRDaGFyYWN0ZXJTcGFjaW5nKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgc3BhY2luZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwYWNpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRDaGFyYWN0ZXJTcGFjaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHNwYWNpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGFjaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0Q2hhcmFjdGVyU3BhY2luZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCB4OworICAgIGZsb2F0IHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0UG9zaXRpb24oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1BvaW50IF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludF9OZXcsICZfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR1BvaW50IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludF9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0TWF0cml4KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1fQ29udmVydCwgJnRyYW5zZm9ybSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldFRleHRNYXRyaXgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR0FmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9Db252ZXJ0LCAmdHJhbnNmb3JtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0VGV4dE1hdHJpeChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFRleHRNYXRyaXgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR0FmZmluZVRyYW5zZm9ybSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENHQ29udGV4dEdldFRleHRNYXRyaXgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9OZXcsICZfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENHQ29udGV4dEdldFRleHRNYXRyaXgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgbW9kZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpbnQgbW9kZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRGb250U2l6ZShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHNpemU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0Rm9udFNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHNpemU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNlbGVjdEZvbnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICogbmFtZTsKLQlmbG9hdCBzaXplOwotCWludCB0ZXh0RW5jb2Rpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2ZpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2VsZWN0Rm9udChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2RpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqIG5hbWU7CisgICAgZmxvYXQgc2l6ZTsKKyAgICBpbnQgdGV4dEVuY29kaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNmaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRFbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNlbGVjdEZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVuY29kaW5nKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNob3dUZXh0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqY3N0cmluZ19faW5fXzsKLQlsb25nIGNzdHJpbmdfX2xlbl9fOwotCWludCBjc3RyaW5nX19pbl9sZW5fXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjc3RyaW5nX19pbl9fLCAmY3N0cmluZ19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQljc3RyaW5nX19sZW5fXyA9IGNzdHJpbmdfX2luX2xlbl9fOwotCUNHQ29udGV4dFNob3dUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgY3N0cmluZ19faW5fXywgY3N0cmluZ19fbGVuX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqY3N0cmluZ19faW5fXzsKKyAgICBsb25nIGNzdHJpbmdfX2xlbl9fOworICAgIGludCBjc3RyaW5nX19pbl9sZW5fXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjc3RyaW5nX19pbl9fLCAmY3N0cmluZ19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjc3RyaW5nX19sZW5fXyA9IGNzdHJpbmdfX2luX2xlbl9fOworICAgIENHQ29udGV4dFNob3dUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgY3N0cmluZ19faW5fXywgY3N0cmluZ19fbGVuX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgeDsKLQlmbG9hdCB5OwotCWNoYXIgKmNzdHJpbmdfX2luX187Ci0JbG9uZyBjc3RyaW5nX19sZW5fXzsKLQlpbnQgY3N0cmluZ19faW5fbGVuX187Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4LAotCSAgICAgICAgICAgICAgICAgICAgICAmeSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNzdHJpbmdfX2luX18sICZjc3RyaW5nX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWNzdHJpbmdfX2xlbl9fID0gY3N0cmluZ19faW5fbGVuX187Ci0JQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJpbmdfX2luX18sIGNzdHJpbmdfX2xlbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBjaGFyICpjc3RyaW5nX19pbl9fOworICAgIGxvbmcgY3N0cmluZ19fbGVuX187CisgICAgaW50IGNzdHJpbmdfX2luX2xlbl9fOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjc3RyaW5nX19pbl9fLCAmY3N0cmluZ19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjc3RyaW5nX19sZW5fXyA9IGNzdHJpbmdfX2luX2xlbl9fOworICAgIENHQ29udGV4dFNob3dUZXh0QXRQb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyaW5nX19pbl9fLCBjc3RyaW5nX19sZW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFbmRQYWdlKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEVuZFBhZ2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0RW5kUGFnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZsdXNoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEZsdXNoKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEZsdXNoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3luY2hyb25pemUoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U3luY2hyb25pemUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U3luY2hyb25pemUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRTaG91bGRBbnRpYWxpYXMoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgc2hvdWxkQW50aWFsaWFzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2hvdWxkQW50aWFsaWFzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFudGlhbGlhcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpbnQgc2hvdWxkQW50aWFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hvdWxkQW50aWFsaWFzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFudGlhbGlhcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9TeW5jQ0dDb250ZXh0T3JpZ2luV2l0aFBvcnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBwb3J0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCi0JCXJldHVybiBOVUxMOwotCVN5bmNDR0NvbnRleHRPcmlnaW5XaXRoUG9ydChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ2xpcENHQ29udGV4dFRvUmVnaW9uKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBwb3J0UmVjdDsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcG9ydFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2xpcENHQ29udGV4dFRvUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3J0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcG9ydFJlY3Q7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnBvcnRSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsaXBDR0NvbnRleHRUb1JlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDR0NvbnRleHRSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0dDb250ZXh0U2F2ZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2F2ZUdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2NhbGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNjYWxlQ1RNLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBzeCwgZmxvYXQgc3kpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRUcmFuc2xhdGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFRyYW5zbGF0ZUNUTSwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgdHgsIGZsb2F0IHR5KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Um90YXRlQ1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSb3RhdGVDVE0sIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IGFuZ2xlKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Q29uY2F0Q1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDb25jYXRDVE0sIDEsCi0JIFB5RG9jX1NUUigiKENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEdldENUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0Q1RNLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAotCXsiQ0dDb250ZXh0U2V0TGluZVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lV2lkdGgsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0TGluZUNhcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TGluZUNhcCwgMSwKLQkgUHlEb2NfU1RSKCIoaW50IGNhcCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldExpbmVKb2luIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lSm9pbiwgMSwKLQkgUHlEb2NfU1RSKCIoaW50IGpvaW4pIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRNaXRlckxpbWl0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRNaXRlckxpbWl0LCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBsaW1pdCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldEZsYXRuZXNzIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRGbGF0bmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgZmxhdG5lc3MpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRBbHBoYSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0QWxwaGEsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QmVnaW5QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRCZWdpblBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dE1vdmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRNb3ZlVG9Qb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEFkZExpbmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRMaW5lVG9Qb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEFkZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50LCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBjcDF4LCBmbG9hdCBjcDF5LCBmbG9hdCBjcDJ4LCBmbG9hdCBjcDJ5LCBmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgY3B4LCBmbG9hdCBjcHksIGZsb2F0IHgsIGZsb2F0IHkpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRDbG9zZVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsb3NlUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QWRkUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRBZGRBcmMiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyYywgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBmbG9hdCBzdGFydEFuZ2xlLCBmbG9hdCBlbmRBbmdsZSwgaW50IGNsb2Nrd2lzZSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEFkZEFyY1RvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyY1RvUG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCByYWRpdXMpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRJc1BhdGhFbXB0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0SXNQYXRoRW1wdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAotCXsiQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dQb2ludCBfcnYpIil9LAotCXsiQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHUmVjdCBfcnYpIil9LAotCXsiQ0dDb250ZXh0RHJhd1BhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dERyYXdQYXRoLCAxLAotCSBQeURvY19TVFIoIihpbnQgbW9kZSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEZpbGxQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RU9GaWxsUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RU9GaWxsUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U3Ryb2tlUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RmlsbFJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZpbGxSZWN0LCAxLAotCSBQeURvY19TVFIoIihDR1JlY3QgcmVjdCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFN0cm9rZVJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QsIGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Q2xlYXJSZWN0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGVhclJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Q2xpcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RU9DbGlwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0NsaXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dENsaXBUb1JlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsaXBUb1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRHcmF5U3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENNWUtTdHJva2VDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAotCXsiQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihpbnQgcXVhbGl0eSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmciLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHNwYWNpbmcpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEdldFRleHRQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR1BvaW50IF9ydikiKX0sCi0JeyJDR0NvbnRleHRTZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0TWF0cml4LCAxLAotCSBQeURvY19TVFIoIihDR0FmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0pIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRHZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0TWF0cml4LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAotCXsiQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKGludCBtb2RlKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0Rm9udFNpemUiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZvbnRTaXplLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBzaXplKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2VsZWN0Rm9udCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2VsZWN0Rm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoY2hhciAqIG5hbWUsIGZsb2F0IHNpemUsIGludCB0ZXh0RW5jb2RpbmcpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTaG93VGV4dCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2hvd1RleHQsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dEF0UG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHgsIGZsb2F0IHksIEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RW5kUGFnZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RW5kUGFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Rmx1c2giLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZsdXNoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3luY2hyb25pemUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcyIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzLCAxLAotCSBQeURvY19TVFIoIihpbnQgc2hvdWxkQW50aWFsaWFzKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2F2ZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2F2ZUdTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2NhbGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNjYWxlQ1RNLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBzeCwgZmxvYXQgc3kpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRUcmFuc2xhdGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFRyYW5zbGF0ZUNUTSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgdHgsIGZsb2F0IHR5KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Um90YXRlQ1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSb3RhdGVDVE0sIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IGFuZ2xlKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Q29uY2F0Q1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDb25jYXRDVE0sIDEsCisgICAgIFB5RG9jX1NUUigiKENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEdldENUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0Q1RNLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0U2V0TGluZVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lV2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0TGluZUNhcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TGluZUNhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50IGNhcCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldExpbmVKb2luIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lSm9pbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50IGpvaW4pIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRNaXRlckxpbWl0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRNaXRlckxpbWl0LCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBsaW1pdCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldEZsYXRuZXNzIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRGbGF0bmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgZmxhdG5lc3MpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRBbHBoYSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0QWxwaGEsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QmVnaW5QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRCZWdpblBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dE1vdmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRNb3ZlVG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEFkZExpbmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRMaW5lVG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEFkZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50LCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBjcDF4LCBmbG9hdCBjcDF5LCBmbG9hdCBjcDJ4LCBmbG9hdCBjcDJ5LCBmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgY3B4LCBmbG9hdCBjcHksIGZsb2F0IHgsIGZsb2F0IHkpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRDbG9zZVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsb3NlUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QWRkUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRBZGRBcmMiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBmbG9hdCBzdGFydEFuZ2xlLCBmbG9hdCBlbmRBbmdsZSwgaW50IGNsb2Nrd2lzZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEFkZEFyY1RvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyY1RvUG9pbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCByYWRpdXMpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRJc1BhdGhFbXB0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0SXNQYXRoRW1wdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dQb2ludCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHUmVjdCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0RHJhd1BhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dERyYXdQYXRoLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgbW9kZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEZpbGxQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RU9GaWxsUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RU9GaWxsUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U3Ryb2tlUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RmlsbFJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZpbGxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihDR1JlY3QgcmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFN0cm9rZVJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QsIGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Q2xlYXJSZWN0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGVhclJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Q2xpcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RU9DbGlwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0NsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dENsaXBUb1JlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsaXBUb1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRHcmF5U3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENNWUtTdHJva2VDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5LCAxLAorICAgICBQeURvY19TVFIoIihpbnQgcXVhbGl0eSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmciLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHNwYWNpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEdldFRleHRQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR1BvaW50IF9ydikiKX0sCisgICAgeyJDR0NvbnRleHRTZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0TWF0cml4LCAxLAorICAgICBQeURvY19TVFIoIihDR0FmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0pIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRHZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0TWF0cml4LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKGludCBtb2RlKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0Rm9udFNpemUiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZvbnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBzaXplKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2VsZWN0Rm9udCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2VsZWN0Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoY2hhciAqIG5hbWUsIGZsb2F0IHNpemUsIGludCB0ZXh0RW5jb2RpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTaG93VGV4dCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2hvd1RleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dEF0UG9pbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHgsIGZsb2F0IHksIEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RW5kUGFnZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RW5kUGFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Rmx1c2giLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZsdXNoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3luY2hyb25pemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcyIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgc2hvdWxkQW50aWFsaWFzKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9TeW5jQ0dDb250ZXh0T3JpZ2luV2l0aFBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQpIC0+IE5vbmUiKX0sCi0JeyJDbGlwQ0dDb250ZXh0VG9SZWdpb24iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NsaXBDR0NvbnRleHRUb1JlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBwb3J0UmVjdCwgUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IlN5bmNDR0NvbnRleHRPcmlnaW5XaXRoUG9ydCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0LCAxLAorICAgICBQeURvY19TVFIoIihDR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAorICAgIHsiQ2xpcENHQ29udGV4dFRvUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DbGlwQ0dDb250ZXh0VG9SZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcG9ydFJlY3QsIFJnbkhhbmRsZSByZWdpb24pIC0+IE5vbmUiKX0sCiAjZW5kaWYKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0dDb250ZXh0UmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTE5OCw2MSArMTE5OCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ0dDb250ZXh0UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQ0dDb250ZXh0UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENHQ29udGV4dFJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENHQ29udGV4dFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDR0NvbnRleHRSZWZPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDR0NvbnRleHRSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQ0dDb250ZXh0UmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENHQ29udGV4dFJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRy5DR0NvbnRleHRSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDR0NvbnRleHRSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDR0NvbnRleHRSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0dDb250ZXh0UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDR0NvbnRleHRSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENHQ29udGV4dFJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDR0NvbnRleHRSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0dDb250ZXh0UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNHQ29udGV4dFJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0dDb250ZXh0UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNHQ29udGV4dFJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNHQ29udGV4dFJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NHLkNHQ29udGV4dFJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENHQ29udGV4dFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENHQ29udGV4dFJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDR0NvbnRleHRSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENHQ29udGV4dFJlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0dDb250ZXh0UmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENHQ29udGV4dFJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDR0NvbnRleHRSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0dDb250ZXh0UmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDR0NvbnRleHRSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0dDb250ZXh0UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0dDb250ZXh0UmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0dDb250ZXh0UmVmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTI2MSwyOSArMTI2MSwyOSBAQAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpDR19DcmVhdGVDR0NvbnRleHRGb3JQb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHcmFmUHRyIHBvcnQ7Ci0JQ0dDb250ZXh0UmVmIGN0eDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHcmFmUHRyIHBvcnQ7CisgICAgQ0dDb250ZXh0UmVmIGN0eDsKKyAgICBPU1N0YXR1cyBfZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLCBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JX2VyciA9IENyZWF0ZUNHQ29udGV4dEZvclBvcnQocG9ydCwgJmN0eCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpCi0JICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIENHQ29udGV4dFJlZk9ial9OZXcsIGN0eCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgX2VyciA9IENyZWF0ZUNHQ29udGV4dEZvclBvcnQocG9ydCwgJmN0eCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpCisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0dDb250ZXh0UmVmT2JqX05ldywgY3R4KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDR19tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJDcmVhdGVDR0NvbnRleHRGb3JQb3J0IiwgKFB5Q0Z1bmN0aW9uKUNHX0NyZWF0ZUNHQ29udGV4dEZvclBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyKSAtPiBDR0NvbnRleHRSZWYiKX0sCisgICAgeyJDcmVhdGVDR0NvbnRleHRGb3JQb3J0IiwgKFB5Q0Z1bmN0aW9uKUNHX0NyZWF0ZUNHQ29udGV4dEZvclBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENHcmFmUHRyKSAtPiBDR0NvbnRleHRSZWYiKX0sCiAjZW5kaWYKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTI5MSwyNSArMTI5MSwyNSBAQAogCiB2b2lkIGluaXRfQ0codm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQ0ciLCBDR19tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDR19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKENHX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ0dfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlDR0NvbnRleHRSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNHQ29udGV4dFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNHQ29udGV4dFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNHQ29udGV4dFJlZiIsIChQeU9iamVjdCAqKSZDR0NvbnRleHRSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDR0NvbnRleHRSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDR0NvbnRleHRSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNHQ29udGV4dFJlZl9UeXBlKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0NHIiwgQ0dfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQ0dfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChDR19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIENHX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgQ0dDb250ZXh0UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDR0NvbnRleHRSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDR0NvbnRleHRSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDR0NvbnRleHRSZWYiLCAoUHlPYmplY3QgKikmQ0dDb250ZXh0UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0dDb250ZXh0UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0dDb250ZXh0UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDR0NvbnRleHRSZWZfVHlwZSk7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQ0cgPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY20vX0NtbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9jbS9fQ21tb2R1bGUuYwppbmRleCAwM2EyNWRkLi5mMDdmMTIxIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jbS9fQ21tb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9jbS9fQ21tb2R1bGUuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM2LDIxICszNiwyMSBAQAogQ21wRGVzY19OZXcoQ29tcG9uZW50RGVzY3JpcHRpb24gKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZPJk8mbGwiLAotICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFR5cGUsCi0gICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKLSAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5jb21wb25lbnRNYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgICAgaXRzZWxmLT5jb21wb25lbnRGbGFncywgaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJk8mTyZsbCIsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFR5cGUsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFN1YlR5cGUsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudE1hbnVmYWN0dXJlciwKKyAgICAgICAgaXRzZWxmLT5jb21wb25lbnRGbGFncywgaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOwogfQogCiBzdGF0aWMgaW50CiBDbXBEZXNjX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbXBvbmVudERlc2NyaXB0aW9uICpwX2l0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUodiwgIk8mTyZPJmxsIiwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50VHlwZSwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50TWFudWZhY3R1cmVyLAotICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3MsICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3NNYXNrKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mbGwiLAorICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50VHlwZSwKKyAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcF9pdHNlbGYtPmNvbXBvbmVudFN1YlR5cGUsCisgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRNYW51ZmFjdHVyZXIsCisgICAgICAgICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3MsICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3NNYXNrKTsKIH0KIAogCkBAIC02MywxOTQgKzYzLDE5NCBAQAogI2RlZmluZSBDbXBJbnN0T2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNvbXBvbmVudEluc3RhbmNlX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDb21wb25lbnRJbnN0YW5jZU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNvbXBvbmVudEluc3RhbmNlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ29tcG9uZW50SW5zdGFuY2Ugb2JfaXRzZWxmOwogfSBDb21wb25lbnRJbnN0YW5jZU9iamVjdDsKIAogUHlPYmplY3QgKkNtcEluc3RPYmpfTmV3KENvbXBvbmVudEluc3RhbmNlIGl0c2VsZikKIHsKLQlDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhDb21wb25lbnRJbnN0YW5jZU9iamVjdCwgJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDb21wb25lbnRJbnN0YW5jZU9iamVjdCwgJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENtcEluc3RPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ29tcG9uZW50SW5zdGFuY2UgKnBfaXRzZWxmKQogewotCWlmICghQ21wSW5zdE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb21wb25lbnRJbnN0YW5jZSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDbXBJbnN0T2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNvbXBvbmVudEluc3RhbmNlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ21wSW5zdE9ial9kZWFsbG9jKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0Nsb3NlQ29tcG9uZW50KENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBDbG9zZUNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKENsb3NlQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZUNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENsb3NlQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2xvc2VDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wSW5zdE9ial9HZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXBvbmVudEluc3RhbmNlRXJyb3IoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcEluc3RPYmpfU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcihDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgdGhlRXJyb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIHRoZUVycm9yOwogI2lmbmRlZiBTZXRDb21wb25lbnRJbnN0YW5jZUVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUVycm9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRXJyb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUVycm9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRXJyb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0dldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZShDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wSW5zdE9ial9TZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB0aGVTdG9yYWdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgdGhlU3RvcmFnZTsKICNpZm5kZWYgU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN0b3JhZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3RvcmFnZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVTdG9yYWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0b3JhZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0NvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCXNob3J0IGZ0bk51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgc2hvcnQgZnRuTnVtYmVyOwogI2lmbmRlZiBDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZ0bk51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0bk51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdG5OdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdG5OdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcEluc3RPYmpfR2V0Q29tcG9uZW50VmVyc2lvbihDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRDb21wb25lbnRWZXJzaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50VmVyc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50VmVyc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29tcG9uZW50VmVyc2lvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29tcG9uZW50VmVyc2lvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0NvbXBvbmVudFNldFRhcmdldChDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSB0YXJnZXQ7CiAjaWZuZGVmIENvbXBvbmVudFNldFRhcmdldAotCVB5TWFjX1BSRUNIRUNLKENvbXBvbmVudFNldFRhcmdldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcG9uZW50U2V0VGFyZ2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdGFyZ2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ29tcG9uZW50U2V0VGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wb25lbnRTZXRUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18qLwogCiBzdGF0aWMgUHlNZXRob2REZWYgQ21wSW5zdE9ial9tZXRob2RzW10gPSB7Ci0JeyJDbG9zZUNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0Nsb3NlQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlRXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKE9TRXJyIHRoZUVycm9yKSAtPiBOb25lIil9LAotCXsiR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlNldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZVN0b3JhZ2UpIC0+IE5vbmUiKX0sCisgICAgeyJDbG9zZUNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0Nsb3NlQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlRXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TRXJyIHRoZUVycm9yKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZVN0b3JhZ2UpIC0+IE5vbmUiKX0sCiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZnRuTnVtYmVyKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0Q29tcG9uZW50VmVyc2lvbiIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0dldENvbXBvbmVudFZlcnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkNvbXBvbmVudFNldFRhcmdldCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0NvbXBvbmVudFNldFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgdGFyZ2V0KSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0NvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGZ0bk51bWJlcikgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldENvbXBvbmVudFZlcnNpb24iLCAoUHlDRnVuY3Rpb24pQ21wSW5zdE9ial9HZXRDb21wb25lbnRWZXJzaW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJDb21wb25lbnRTZXRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ21wSW5zdE9ial9Db21wb25lbnRTZXRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHRhcmdldCkgLT4gKGxvbmcgX3J2KSIpfSwKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ21wSW5zdE9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTI2Nyw2MSArMjY3LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wSW5zdE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIENtcEluc3RPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ29tcG9uZW50SW5zdGFuY2VfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ20uQ29tcG9uZW50SW5zdGFuY2UiLCAvKnRwX25hbWUqLwotCXNpemVvZihDb21wb25lbnRJbnN0YW5jZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENtcEluc3RPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ21wSW5zdE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ21wSW5zdE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ21wSW5zdE9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDbXBJbnN0T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNtcEluc3RPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ21wSW5zdE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ21wSW5zdE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDbXBJbnN0T2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ21wSW5zdE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NtLkNvbXBvbmVudEluc3RhbmNlIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDbXBJbnN0T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENtcEluc3RPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENtcEluc3RPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENtcEluc3RPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ21wSW5zdE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDbXBJbnN0T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENtcEluc3RPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENtcEluc3RPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ21wSW5zdE9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENtcEluc3RPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDb21wb25lbnRJbnN0YW5jZSAtLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMzQsMzYxICszMzQsMzYxIEBACiAjZGVmaW5lIENtcE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDb21wb25lbnRfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ29tcG9uZW50X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDb21wb25lbnRPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDb21wb25lbnQgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDb21wb25lbnQgb2JfaXRzZWxmOwogfSBDb21wb25lbnRPYmplY3Q7CiAKIFB5T2JqZWN0ICpDbXBPYmpfTmV3KENvbXBvbmVudCBpdHNlbGYpCiB7Ci0JQ29tcG9uZW50T2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHJldHVybiBOb25lPyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENtX0Vycm9yLCJObyBzdWNoIGNvbXBvbmVudCIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKENvbXBvbmVudE9iamVjdCwgJkNvbXBvbmVudF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ29tcG9uZW50T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHJldHVybiBOb25lPyAqLworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5vIHN1Y2ggY29tcG9uZW50Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDb21wb25lbnRPYmplY3QsICZDb21wb25lbnRfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ21wT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbXBvbmVudCAqcF9pdHNlbGYpCiB7Ci0JaWYgKCB2ID09IFB5X05vbmUgKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSAwOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0JICAgICAgICB9Ci0JaWYgKCFDbXBPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ29tcG9uZW50IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENvbXBvbmVudE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCB2ID09IFB5X05vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICBpZiAoIUNtcE9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb21wb25lbnQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ29tcG9uZW50T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ21wT2JqX2RlYWxsb2MoQ29tcG9uZW50T2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfVW5yZWdpc3RlckNvbXBvbmVudChDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFVucmVnaXN0ZXJDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhVbnJlZ2lzdGVyQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbnJlZ2lzdGVyQ29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3RlckNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVucmVnaXN0ZXJDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX0dldENvbXBvbmVudEluZm8oQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvbXBvbmVudERlc2NyaXB0aW9uIGNkOwotCUhhbmRsZSBjb21wb25lbnROYW1lOwotCUhhbmRsZSBjb21wb25lbnRJbmZvOwotCUhhbmRsZSBjb21wb25lbnRJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbXBvbmVudERlc2NyaXB0aW9uIGNkOworICAgIEhhbmRsZSBjb21wb25lbnROYW1lOworICAgIEhhbmRsZSBjb21wb25lbnRJbmZvOworICAgIEhhbmRsZSBjb21wb25lbnRJY29uOwogI2lmbmRlZiBHZXRDb21wb25lbnRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXBvbmVudE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9uZW50SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wb25lbnRJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXBvbmVudEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmY2QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEljb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX05ldywgJmNkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9uZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wb25lbnRJY29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbXBvbmVudEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX05ldywgJmNkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfT3BlbkNvbXBvbmVudChDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudEluc3RhbmNlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgX3J2OwogI2lmbmRlZiBPcGVuQ29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soT3BlbkNvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlbkNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gT3BlbkNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBPcGVuQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX1Jlc29sdmVDb21wb25lbnRBbGlhcyhDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBfcnY7CiAjaWZuZGVmIFJlc29sdmVDb21wb25lbnRBbGlhcwotCVB5TWFjX1BSRUNIRUNLKFJlc29sdmVDb21wb25lbnRBbGlhcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVzb2x2ZUNvbXBvbmVudEFsaWFzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZXNvbHZlQ29tcG9uZW50QWxpYXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZXNvbHZlQ29tcG9uZW50QWxpYXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9HZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjI1NSB0aGVTdHJpbmc7Ci0Jc2hvcnQgc3RyTGlzdElEOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjI1NSB0aGVTdHJpbmc7CisgICAgc2hvcnQgc3RyTGlzdElEOworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFB1YmxpY0luZFN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdHJMaXN0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckxpc3RJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJMaXN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckxpc3RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfR2V0Q29tcG9uZW50UmVmY29uKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRDb21wb25lbnRSZWZjb24KLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRSZWZjb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFJlZmNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29tcG9uZW50UmVmY29uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb21wb25lbnRSZWZjb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX1NldENvbXBvbmVudFJlZmNvbihDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgdGhlUmVmY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIHRoZVJlZmNvbjsKICNpZm5kZWYgU2V0Q29tcG9uZW50UmVmY29uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50UmVmY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb21wb25lbnRSZWZjb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZWZjb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb21wb25lbnRSZWZjb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgdGhlUmVmY29uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZWZjb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb21wb25lbnRSZWZjb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlUmVmY29uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX09wZW5Db21wb25lbnRSZXNGaWxlKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIE9wZW5Db21wb25lbnRSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soT3BlbkNvbXBvbmVudFJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5Db21wb25lbnRSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBPcGVuQ29tcG9uZW50UmVzRmlsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT3BlbkNvbXBvbmVudFJlc0ZpbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX0dldENvbXBvbmVudFJlc291cmNlKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgcmVzVHlwZTsKLQlzaG9ydCByZXNJRDsKLQlIYW5kbGUgdGhlUmVzb3VyY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHJlc1R5cGU7CisgICAgc2hvcnQgcmVzSUQ7CisgICAgSGFuZGxlIHRoZVJlc291cmNlOwogI2lmbmRlZiBHZXRDb21wb25lbnRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZXNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29tcG9uZW50UmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNvdXJjZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVJlc291cmNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZXNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcG9uZW50UmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNvdXJjZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVJlc291cmNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfR2V0Q29tcG9uZW50SW5kU3RyaW5nKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHIyNTUgdGhlU3RyaW5nOwotCXNob3J0IHN0ckxpc3RJRDsKLQlzaG9ydCBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHIyNTUgdGhlU3RyaW5nOworICAgIHNob3J0IHN0ckxpc3RJRDsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0Q29tcG9uZW50SW5kU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5kU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbmRTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGhlU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RyTGlzdElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29tcG9uZW50SW5kU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJMaXN0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGhlU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyTGlzdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcG9uZW50SW5kU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJMaXN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX0NvdW50Q29tcG9uZW50SW5zdGFuY2VzKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBDb3VudENvbXBvbmVudEluc3RhbmNlcwotCVB5TWFjX1BSRUNIRUNLKENvdW50Q29tcG9uZW50SW5zdGFuY2VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudENvbXBvbmVudEluc3RhbmNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRDb21wb25lbnRJbnN0YW5jZXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50Q29tcG9uZW50SW5zdGFuY2VzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9TZXREZWZhdWx0Q29tcG9uZW50KENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBmbGFnczsKICNpZm5kZWYgU2V0RGVmYXVsdENvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNldERlZmF1bHRDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERlZmF1bHRDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREZWZhdWx0Q29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGVmYXVsdENvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfQ2FwdHVyZUNvbXBvbmVudChDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7Ci0JQ29tcG9uZW50IGNhcHR1cmluZ0NvbXBvbmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50IF9ydjsKKyAgICBDb21wb25lbnQgY2FwdHVyaW5nQ29tcG9uZW50OwogI2lmbmRlZiBDYXB0dXJlQ29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soQ2FwdHVyZUNvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FwdHVyZUNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY2FwdHVyaW5nQ29tcG9uZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2FwdHVyZUNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyaW5nQ29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNhcHR1cmluZ0NvbXBvbmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENhcHR1cmVDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmluZ0NvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9VbmNhcHR1cmVDb21wb25lbnQoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBVbmNhcHR1cmVDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhVbmNhcHR1cmVDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVuY2FwdHVyZUNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVuY2FwdHVyZUNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVuY2FwdHVyZUNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfR2V0Q29tcG9uZW50SWNvblN1aXRlKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgaWNvblN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBpY29uU3VpdGU7CiAjaWZuZGVmIEdldENvbXBvbmVudEljb25TdWl0ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudEljb25TdWl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29tcG9uZW50SWNvblN1aXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblN1aXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvblN1aXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbXBvbmVudEljb25TdWl0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TdWl0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25TdWl0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDbXBPYmpfbWV0aG9kc1tdID0gewotCXsiVW5yZWdpc3RlckNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfVW5yZWdpc3RlckNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0Q29tcG9uZW50SW5mbyIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGNvbXBvbmVudE5hbWUsIEhhbmRsZSBjb21wb25lbnRJbmZvLCBIYW5kbGUgY29tcG9uZW50SWNvbikgLT4gKENvbXBvbmVudERlc2NyaXB0aW9uIGNkKSIpfSwKLQl7Ik9wZW5Db21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX09wZW5Db21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCi0JeyJSZXNvbHZlQ29tcG9uZW50QWxpYXMiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1Jlc29sdmVDb21wb25lbnRBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudFB1YmxpY0luZFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkdldENvbXBvbmVudFJlZmNvbiIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVmY29uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRDb21wb25lbnRSZWZjb24iLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1NldENvbXBvbmVudFJlZmNvbiwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyB0aGVSZWZjb24pIC0+IE5vbmUiKX0sCi0JeyJPcGVuQ29tcG9uZW50UmVzRmlsZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfT3BlbkNvbXBvbmVudFJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRDb21wb25lbnRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZXNUeXBlLCBzaG9ydCByZXNJRCkgLT4gKEhhbmRsZSB0aGVSZXNvdXJjZSkiKX0sCi0JeyJHZXRDb21wb25lbnRJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudEluZFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50Q29tcG9uZW50SW5zdGFuY2VzIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9Db3VudENvbXBvbmVudEluc3RhbmNlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU2V0RGVmYXVsdENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfU2V0RGVmYXVsdENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJDYXB0dXJlQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9DYXB0dXJlQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnQgY2FwdHVyaW5nQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJVbmNhcHR1cmVDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1VuY2FwdHVyZUNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVW5yZWdpc3RlckNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfVW5yZWdpc3RlckNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29tcG9uZW50SW5mbyIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGNvbXBvbmVudE5hbWUsIEhhbmRsZSBjb21wb25lbnRJbmZvLCBIYW5kbGUgY29tcG9uZW50SWNvbikgLT4gKENvbXBvbmVudERlc2NyaXB0aW9uIGNkKSIpfSwKKyAgICB7Ik9wZW5Db21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX09wZW5Db21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCisgICAgeyJSZXNvbHZlQ29tcG9uZW50QWxpYXMiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1Jlc29sdmVDb21wb25lbnRBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudFB1YmxpY0luZFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbXBvbmVudFJlZmNvbiIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVmY29uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJTZXRDb21wb25lbnRSZWZjb24iLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1NldENvbXBvbmVudFJlZmNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyB0aGVSZWZjb24pIC0+IE5vbmUiKX0sCisgICAgeyJPcGVuQ29tcG9uZW50UmVzRmlsZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfT3BlbkNvbXBvbmVudFJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRDb21wb25lbnRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZXNUeXBlLCBzaG9ydCByZXNJRCkgLT4gKEhhbmRsZSB0aGVSZXNvdXJjZSkiKX0sCisgICAgeyJHZXRDb21wb25lbnRJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudEluZFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvdW50Q29tcG9uZW50SW5zdGFuY2VzIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9Db3VudENvbXBvbmVudEluc3RhbmNlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0RGVmYXVsdENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfU2V0RGVmYXVsdENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJDYXB0dXJlQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9DYXB0dXJlQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnQgY2FwdHVyaW5nQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJVbmNhcHR1cmVDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1VuY2FwdHVyZUNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0Q29tcG9uZW50SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBpY29uU3VpdGUpIil9LAorICAgIHsiR2V0Q29tcG9uZW50SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBpY29uU3VpdGUpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDbXBPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC03MDUsNjEgKzcwNSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ29tcG9uZW50IGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQ29tcG9uZW50IGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENtcE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENvbXBvbmVudE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDbXBPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDb21wb25lbnRPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQ21wT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENvbXBvbmVudF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DbS5Db21wb25lbnQiLCAvKnRwX25hbWUqLwotCXNpemVvZihDb21wb25lbnRPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDbXBPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ21wT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDbXBPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENtcE9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDbXBPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ21wT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNtcE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ21wT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNtcE9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNtcE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NtLkNvbXBvbmVudCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENvbXBvbmVudE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENtcE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDbXBPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENtcE9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ21wT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENtcE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDbXBPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ21wT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDbXBPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ21wT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ21wT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENvbXBvbmVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzY3LDE1MCArNzY3LDE1MCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkNtX1JlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7Ci0JQ29tcG9uZW50UmVzb3VyY2VIYW5kbGUgY3I7Ci0Jc2hvcnQgZ2xvYmFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnQgX3J2OworICAgIENvbXBvbmVudFJlc291cmNlSGFuZGxlIGNyOworICAgIHNob3J0IGdsb2JhbDsKICNpZm5kZWYgUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UoY3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZShjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0ZpbmROZXh0Q29tcG9uZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnQgX3J2OwotCUNvbXBvbmVudCBhQ29tcG9uZW50OwotCUNvbXBvbmVudERlc2NyaXB0aW9uIGxvb2tpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBfcnY7CisgICAgQ29tcG9uZW50IGFDb21wb25lbnQ7CisgICAgQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZzsKICNpZm5kZWYgRmluZE5leHRDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhGaW5kTmV4dENvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZE5leHRDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmYUNvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wRGVzY19Db252ZXJ0LCAmbG9va2luZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZpbmROZXh0Q29tcG9uZW50KGFDb21wb25lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmxvb2tpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZhQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX0NvbnZlcnQsICZsb29raW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmluZE5leHRDb21wb25lbnQoYUNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9va2luZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0NvdW50Q29tcG9uZW50cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZzsKICNpZm5kZWYgQ291bnRDb21wb25lbnRzCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnRDb21wb25lbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudENvbXBvbmVudHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX0NvbnZlcnQsICZsb29raW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRDb21wb25lbnRzKCZsb29raW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcERlc2NfQ29udmVydCwgJmxvb2tpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudENvbXBvbmVudHMoJmxvb2tpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0dldENvbXBvbmVudExpc3RNb2RTZWVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldENvbXBvbmVudExpc3RNb2RTZWVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudExpc3RNb2RTZWVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb21wb25lbnRMaXN0TW9kU2VlZCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb21wb25lbnRMaXN0TW9kU2VlZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0Nsb3NlQ29tcG9uZW50UmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZudW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVmbnVtOwogI2lmbmRlZiBDbG9zZUNvbXBvbmVudFJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhDbG9zZUNvbXBvbmVudFJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlQ29tcG9uZW50UmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZm51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDbG9zZUNvbXBvbmVudFJlc0ZpbGUocmVmbnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZm51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbG9zZUNvbXBvbmVudFJlc0ZpbGUocmVmbnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbV9PcGVuRGVmYXVsdENvbXBvbmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50SW5zdGFuY2UgX3J2OwotCU9TVHlwZSBjb21wb25lbnRUeXBlOwotCU9TVHlwZSBjb21wb25lbnRTdWJUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBfcnY7CisgICAgT1NUeXBlIGNvbXBvbmVudFR5cGU7CisgICAgT1NUeXBlIGNvbXBvbmVudFN1YlR5cGU7CiAjaWZuZGVmIE9wZW5EZWZhdWx0Q29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soT3BlbkRlZmF1bHRDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5EZWZhdWx0Q29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRTdWJUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gT3BlbkRlZmF1bHRDb21wb25lbnQoY29tcG9uZW50VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdWJUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRTdWJUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT3BlbkRlZmF1bHRDb21wb25lbnQoY29tcG9uZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdWJUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX1JlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlzaG9ydCByZXNSZWZOdW07Ci0Jc2hvcnQgZ2xvYmFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgc2hvcnQgZ2xvYmFsOwogI2lmbmRlZiBSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZQotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZShyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZShyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENtX21ldGhvZHNbXSA9IHsKLQl7IlJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pQ21fUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50UmVzb3VyY2VIYW5kbGUgY3IsIHNob3J0IGdsb2JhbCkgLT4gKENvbXBvbmVudCBfcnYpIil9LAotCXsiRmluZE5leHRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21fRmluZE5leHRDb21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudCBhQ29tcG9uZW50LCBDb21wb25lbnREZXNjcmlwdGlvbiBsb29raW5nKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJDb3VudENvbXBvbmVudHMiLCAoUHlDRnVuY3Rpb24pQ21fQ291bnRDb21wb25lbnRzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnREZXNjcmlwdGlvbiBsb29raW5nKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQiLCAoUHlDRnVuY3Rpb24pQ21fR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkNsb3NlQ29tcG9uZW50UmVzRmlsZSIsIChQeUNGdW5jdGlvbilDbV9DbG9zZUNvbXBvbmVudFJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZm51bSkgLT4gTm9uZSIpfSwKLQl7Ik9wZW5EZWZhdWx0Q29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtX09wZW5EZWZhdWx0Q29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgY29tcG9uZW50VHlwZSwgT1NUeXBlIGNvbXBvbmVudFN1YlR5cGUpIC0+IChDb21wb25lbnRJbnN0YW5jZSBfcnYpIil9LAotCXsiUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pQ21fUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgc2hvcnQgZ2xvYmFsKSAtPiAobG9uZyBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDbV9SZWdpc3RlckNvbXBvbmVudFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRSZXNvdXJjZUhhbmRsZSBjciwgc2hvcnQgZ2xvYmFsKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJGaW5kTmV4dENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbV9GaW5kTmV4dENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGFDb21wb25lbnQsIENvbXBvbmVudERlc2NyaXB0aW9uIGxvb2tpbmcpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKKyAgICB7IkNvdW50Q29tcG9uZW50cyIsIChQeUNGdW5jdGlvbilDbV9Db3VudENvbXBvbmVudHMsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudERlc2NyaXB0aW9uIGxvb2tpbmcpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRDb21wb25lbnRMaXN0TW9kU2VlZCIsIChQeUNGdW5jdGlvbilDbV9HZXRDb21wb25lbnRMaXN0TW9kU2VlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiQ2xvc2VDb21wb25lbnRSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUNtX0Nsb3NlQ29tcG9uZW50UmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmbnVtKSAtPiBOb25lIil9LAorICAgIHsiT3BlbkRlZmF1bHRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21fT3BlbkRlZmF1bHRDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjb21wb25lbnRUeXBlLCBPU1R5cGUgY29tcG9uZW50U3ViVHlwZSkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCisgICAgeyJSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilDbV9SZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCBnbG9iYWwpIC0+IChsb25nIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTkxOCwzNyArOTE4LDM3IEBACiAKIHZvaWQgaW5pdF9DbSh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50LCBDbXBPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnQsIENtcE9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudEluc3RhbmNlLCBDbXBJbnN0T2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29tcG9uZW50SW5zdGFuY2UsIENtcEluc3RPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudCwgQ21wT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnQsIENtcE9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50SW5zdGFuY2UsIENtcEluc3RPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENvbXBvbmVudEluc3RhbmNlLCBDbXBJbnN0T2JqX0NvbnZlcnQpOwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0NtIiwgQ21fbWV0aG9kcyk7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JQ21fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChDbV9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIENtX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JQ29tcG9uZW50SW5zdGFuY2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnRJbnN0YW5jZSIsIChQeU9iamVjdCAqKSZDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29tcG9uZW50SW5zdGFuY2VUeXBlIiwgKFB5T2JqZWN0ICopJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCUNvbXBvbmVudF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ29tcG9uZW50X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ29tcG9uZW50X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29tcG9uZW50IiwgKFB5T2JqZWN0ICopJkNvbXBvbmVudF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNvbXBvbmVudF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbXBvbmVudFR5cGUiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50X1R5cGUpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfQ20iLCBDbV9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBDbV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKENtX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ21fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBDb21wb25lbnRJbnN0YW5jZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbXBvbmVudEluc3RhbmNlIiwgKFB5T2JqZWN0ICopJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnRJbnN0YW5jZVR5cGUiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgQ29tcG9uZW50X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDb21wb25lbnRfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDb21wb25lbnRfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnQiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50X1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ29tcG9uZW50X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29tcG9uZW50VHlwZSIsIChQeU9iamVjdCAqKSZDb21wb25lbnRfVHlwZSk7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQ20gPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY3RsL19DdGxtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2N0bC9fQ3RsbW9kdWxlLmMKaW5kZXggY2RiODU1Ny4uYTk1OWViNCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY3RsL19DdGxtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9jdGwvX0N0bG1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC00MSwxOSArNDEsMTkgQEAKIENvbnRyb2xGb250U3R5bGVfTmV3KENvbnRyb2xGb250U3R5bGVSZWMgKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaGhoTyZPJiIsIGl0c2VsZi0+ZmxhZ3MsIGl0c2VsZi0+Zm9udCwKLSAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUsIGl0c2VsZi0+c3R5bGUsIGl0c2VsZi0+bW9kZSwgaXRzZWxmLT5qdXN0LAotICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJml0c2VsZi0+Zm9yZUNvbG9yLCBRZFJHQl9OZXcsICZpdHNlbGYtPmJhY2tDb2xvcik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhoaGhoaE8mTyYiLCBpdHNlbGYtPmZsYWdzLCBpdHNlbGYtPmZvbnQsCisgICAgICAgIGl0c2VsZi0+c2l6ZSwgaXRzZWxmLT5zdHlsZSwgaXRzZWxmLT5tb2RlLCBpdHNlbGYtPmp1c3QsCisgICAgICAgIFFkUkdCX05ldywgJml0c2VsZi0+Zm9yZUNvbG9yLCBRZFJHQl9OZXcsICZpdHNlbGYtPmJhY2tDb2xvcik7CiB9CiAjZW5kaWYKIAogc3RhdGljIGludAogQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sRm9udFN0eWxlUmVjICppdHNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGhoaGhoaE8mTyYpIiwgJml0c2VsZi0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgJml0c2VsZi0+Zm9udCwgJml0c2VsZi0+c2l6ZSwgJml0c2VsZi0+c3R5bGUsICZpdHNlbGYtPm1vZGUsCi0gICAgICAgICAgICAgICAgJml0c2VsZi0+anVzdCwgUWRSR0JfQ29udmVydCwgJml0c2VsZi0+Zm9yZUNvbG9yLAotICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZpdHNlbGYtPmJhY2tDb2xvcik7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaGhoaGhoTyZPJikiLCAmaXRzZWxmLT5mbGFncywKKyAgICAgICAgJml0c2VsZi0+Zm9udCwgJml0c2VsZi0+c2l6ZSwgJml0c2VsZi0+c3R5bGUsICZpdHNlbGYtPm1vZGUsCisgICAgICAgICZpdHNlbGYtPmp1c3QsIFFkUkdCX0NvbnZlcnQsICZpdHNlbGYtPmZvcmVDb2xvciwKKyAgICAgICAgUWRSR0JfQ29udmVydCwgJml0c2VsZi0+YmFja0NvbG9yKTsKIH0KIAogLyoKQEAgLTYzLDEzICs2MywxMyBAQAogUHlDb250cm9sSURfTmV3KENvbnRyb2xJRCAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5zaWduYXR1cmUsIGl0c2VsZi0+aWQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5zaWduYXR1cmUsIGl0c2VsZi0+aWQpOwogfQogCiBzdGF0aWMgaW50CiBQeUNvbnRyb2xJRF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sSUQgKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+c2lnbmF0dXJlLCAmaXRzZWxmLT5pZCk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+c2lnbmF0dXJlLCAmaXRzZWxmLT5pZCk7CiB9CiAKIC8qCkBAIC03OCw0MCArNzgsNDAgQEAKIHN0YXRpYyBpbnQKIERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uRGVzY19Db252ZXJ0KFB5T2JqZWN0ICp2LCBEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2MgKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIobE8mbCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+cHJvcGVydHlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlGbGFncyk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIobE8mbCkiLAorICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5wcm9wZXJ0eUlELAorICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpdHNlbGYtPnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlGbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaE8mKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5jb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmaXRzZWxmLT51Lmljb25TdWl0ZSk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaE8mKSIsCisgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPmNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJml0c2VsZi0+dS5pY29uU3VpdGUpOwogfQogCiBzdGF0aWMgaW50CiBEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19Db252ZXJ0KFB5T2JqZWN0ICp2LCBEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzYyAqaXRzZWxmKQogewotICAgICAgICBpdHNlbGYtPnZlcnNpb24gPSBrRGF0YUJyb3dzZXJMaXN0Vmlld0xhdGVzdEhlYWRlckRlc2M7Ci0gICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKEhIaE8mSE8mTyYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPm1pbmltdW1XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPm1heGltdW1XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnRpdGxlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZi0+dGl0bGVTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5pbml0aWFsT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkZvbnRTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaXRzZWxmLT5idG5Db250ZW50SW5mbyk7CisgICAgaXRzZWxmLT52ZXJzaW9uID0ga0RhdGFCcm93c2VyTGlzdFZpZXdMYXRlc3RIZWFkZXJEZXNjOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKEhIaE8mSE8mTyYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+bWluaW11bVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5tYXhpbXVtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnRpdGxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaXRzZWxmLT50aXRsZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+aW5pdGlhbE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkZvbnRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkNvbnRlbnRJbmZvKTsKIH0KIAogc3RhdGljIGludAogRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfQ29udmVydChQeU9iamVjdCAqdiwgRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZPJikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjX0NvbnZlcnQsICZpdHNlbGYtPnByb3BlcnR5RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX0NvbnZlcnQsICZpdHNlbGYtPmhlYWRlckJ0bkRlc2MpOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKE8mTyYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjX0NvbnZlcnQsICZpdHNlbGYtPnByb3BlcnR5RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfQ29udmVydCwgJml0c2VsZi0+aGVhZGVyQnRuRGVzYyk7CiB9CiAKIC8qIFRyYWNrQ29udHJvbCBhbmQgSGFuZGxlQ29udHJvbENsaWNrIGNhbGxiYWNrIHN1cHBvcnQgKi8KQEAgLTEzOSwzNjgzICsxMzksMzY4MyBAQAogI2RlZmluZSBDdGxPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ29udHJvbF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDb250cm9sX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDb250cm9sT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ29udHJvbEhhbmRsZSBvYl9pdHNlbGY7Ci0JUHlPYmplY3QgKm9iX2NhbGxiYWNrZGljdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ29udHJvbEhhbmRsZSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3QgKm9iX2NhbGxiYWNrZGljdDsKIH0gQ29udHJvbE9iamVjdDsKIAogUHlPYmplY3QgKkN0bE9ial9OZXcoQ29udHJvbEhhbmRsZSBpdHNlbGYpCiB7Ci0JQ29udHJvbE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCVNldENvbnRyb2xSZWZlcmVuY2UoaXRzZWxmLCAobG9uZylpdCk7Ci0JaXQtPm9iX2NhbGxiYWNrZGljdCA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENvbnRyb2xPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDb250cm9sT2JqZWN0LCAmQ29udHJvbF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBTZXRDb250cm9sUmVmZXJlbmNlKGl0c2VsZiwgKGxvbmcpaXQpOworICAgIGl0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEN0bE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sSGFuZGxlICpwX2l0c2VsZikKIHsKLQlpZiAoIUN0bE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb250cm9sIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENvbnRyb2xPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ3RsT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNvbnRyb2wgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ29udHJvbE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEN0bE9ial9kZWFsbG9jKENvbnRyb2xPYmplY3QgKnNlbGYpCiB7Ci0JUHlfWERFQ1JFRihzZWxmLT5vYl9jYWxsYmFja2RpY3QpOwotCWlmIChzZWxmLT5vYl9pdHNlbGYpU2V0Q29udHJvbFJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jYWxsYmFja2RpY3QpOworICAgIGlmIChzZWxmLT5vYl9pdHNlbGYpU2V0Q29udHJvbFJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0hpbGl0ZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbFBhcnRDb2RlIGhpbGl0ZVN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sUGFydENvZGUgaGlsaXRlU3RhdGU7CiAjaWZuZGVmIEhpbGl0ZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWxpdGVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWxpdGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBoaWxpdGVTdGF0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWxpdGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBoaWxpdGVTdGF0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TaG93Q29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNob3dDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93Q29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSGlkZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBIaWRlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEhpZGVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWRlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0lzQ29udHJvbEFjdGl2ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzQ29udHJvbEFjdGl2ZQotCVB5TWFjX1BSRUNIRUNLKElzQ29udHJvbEFjdGl2ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNDb250cm9sQWN0aXZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0NvbnRyb2xBY3RpdmUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzQ29udHJvbEFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSXNDb250cm9sVmlzaWJsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzQ29udHJvbFZpc2libGUKLQlQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xWaXNpYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xWaXNpYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0NvbnRyb2xWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0NvbnRyb2xWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9BY3RpdmF0ZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQWN0aXZhdGVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQWN0aXZhdGVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBY3RpdmF0ZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBY3RpdmF0ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBY3RpdmF0ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0RlYWN0aXZhdGVDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIERlYWN0aXZhdGVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soRGVhY3RpdmF0ZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKERlYWN0aXZhdGVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVhY3RpdmF0ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEZWFjdGl2YXRlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFZpc2liaWxpdHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlCb29sZWFuIGluSXNWaXNpYmxlOwotCUJvb2xlYW4gaW5Eb0RyYXc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQm9vbGVhbiBpbklzVmlzaWJsZTsKKyAgICBCb29sZWFuIGluRG9EcmF3OwogI2lmbmRlZiBTZXRDb250cm9sVmlzaWJpbGl0eQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xWaXNpYmlsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVmlzaWJpbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzVmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRG9EcmF3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldENvbnRyb2xWaXNpYmlsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNWaXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRvRHJhdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc1Zpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRvRHJhdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRDb250cm9sVmlzaWJpbGl0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Eb0RyYXcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Jc0NvbnRyb2xFbmFibGVkKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNDb250cm9sRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzQ29udHJvbEVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzQ29udHJvbEVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzQ29udHJvbEVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzQ29udHJvbEVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0VuYWJsZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgRW5hYmxlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmFibGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRW5hYmxlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfRGlzYWJsZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgRGlzYWJsZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEaXNhYmxlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERpc2FibGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9EcmF3MUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEcmF3MUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhEcmF3MUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXcxQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRHJhdzFDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhdzFDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0QmVzdENvbnRyb2xSZWN0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmVjdCBvdXRSZWN0OwotCVNJbnQxNiBvdXRCYXNlTGluZU9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZWN0IG91dFJlY3Q7CisgICAgU0ludDE2IG91dEJhc2VMaW5lT2Zmc2V0OwogI2lmbmRlZiBHZXRCZXN0Q29udHJvbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhHZXRCZXN0Q29udHJvbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEJlc3RDb250cm9sUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEJlc3RDb250cm9sUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QmFzZUxpbmVPZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRCYXNlTGluZU9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRCZXN0Q29udHJvbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJhc2VMaW5lT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QmFzZUxpbmVPZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sRm9udFN0eWxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbEZvbnRTdHlsZVJlYyBpblN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xGb250U3R5bGVSZWMgaW5TdHlsZTsKICNpZm5kZWYgU2V0Q29udHJvbEZvbnRTdHlsZQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xGb250U3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xGb250U3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpblN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldENvbnRyb2xGb250U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpblN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xGb250U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0RyYXdDb250cm9sSW5DdXJyZW50UG9ydChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERyYXdDb250cm9sSW5DdXJyZW50UG9ydAotCVB5TWFjX1BSRUNIRUNLKERyYXdDb250cm9sSW5DdXJyZW50UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd0NvbnRyb2xJbkN1cnJlbnRQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmF3Q29udHJvbEluQ3VycmVudFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmF3Q29udHJvbEluQ3VycmVudFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRVcENvbnRyb2xCYWNrZ3JvdW5kKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluRGVwdGg7CisgICAgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CiAjaWZuZGVmIFNldFVwQ29udHJvbEJhY2tncm91bmQKLQlQeU1hY19QUkVDSEVDSyhTZXRVcENvbnRyb2xCYWNrZ3JvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRVcENvbnRyb2xCYWNrZ3JvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VXBDb250cm9sQmFja2dyb3VuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFVwQ29udHJvbEJhY2tncm91bmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldFVwQ29udHJvbFRleHRDb2xvcihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkRlcHRoOworICAgIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOwogI2lmbmRlZiBTZXRVcENvbnRyb2xUZXh0Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRVcENvbnRyb2xUZXh0Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFVwQ29udHJvbFRleHRDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFVwQ29udHJvbFRleHRDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRVcENvbnRyb2xUZXh0Q29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzQ29sb3JEZXZpY2UpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9EcmFnQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBzdGFydFBvaW50OwotCVJlY3QgbGltaXRSZWN0OwotCVJlY3Qgc2xvcFJlY3Q7Ci0JRHJhZ0NvbnN0cmFpbnQgYXhpczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgc3RhcnRQb2ludDsKKyAgICBSZWN0IGxpbWl0UmVjdDsKKyAgICBSZWN0IHNsb3BSZWN0OworICAgIERyYWdDb25zdHJhaW50IGF4aXM7CiAjaWZuZGVmIERyYWdDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soRHJhZ0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYWdDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZsaW1pdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzbG9wUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF4aXMpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmFnQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIHN0YXJ0UG9pbnQsCi0JICAgICAgICAgICAgJmxpbWl0UmVjdCwKLQkgICAgICAgICAgICAmc2xvcFJlY3QsCi0JICAgICAgICAgICAgYXhpcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZsaW1pdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzbG9wUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF4aXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmFnQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgJmxpbWl0UmVjdCwKKyAgICAgICAgICAgICAgICAmc2xvcFJlY3QsCisgICAgICAgICAgICAgICAgYXhpcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9UZXN0Q29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sUGFydENvZGUgX3J2OwotCVBvaW50IHRlc3RQb2ludDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbFBhcnRDb2RlIF9ydjsKKyAgICBQb2ludCB0ZXN0UG9pbnQ7CiAjaWZuZGVmIFRlc3RDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soVGVzdENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKFRlc3RDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UG9pbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXN0Q29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHRlc3RQb2ludCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQb2ludCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRlc3RDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGVzdFBvaW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2soQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQb2ludCBpbldoZXJlOwotCUJvb2xlYW4gbWVudURpc3BsYXllZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBpbldoZXJlOworICAgIEJvb2xlYW4gbWVudURpc3BsYXllZDsKICNpZm5kZWYgSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2sKLQlQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluV2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVEaXNwbGF5ZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG1lbnVEaXNwbGF5ZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpbldoZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhhbmRsZUNvbnRyb2xDb250ZXh0dWFsTWVudUNsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51RGlzcGxheWVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZW51RGlzcGxheWVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBvaW50IGluV2hlcmU7Ci0JRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnM7Ci0JQ2xpY2tBY3RpdmF0aW9uUmVzdWx0IG91dFJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBpbldoZXJlOworICAgIEV2ZW50TW9kaWZpZXJzIGluTW9kaWZpZXJzOworICAgIENsaWNrQWN0aXZhdGlvblJlc3VsdCBvdXRSZXN1bHQ7CiAjaWZuZGVmIEdldENvbnRyb2xDbGlja0FjdGl2YXRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQ2xpY2tBY3RpdmF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQ2xpY2tBY3RpdmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5XaGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbnRyb2xDbGlja0FjdGl2YXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpbldoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Nb2RpZmllcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Nb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSGFuZGxlQ29udHJvbEtleShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sUGFydENvZGUgX3J2OwotCVNJbnQxNiBpbktleUNvZGU7Ci0JU0ludDE2IGluQ2hhckNvZGU7Ci0JRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xQYXJ0Q29kZSBfcnY7CisgICAgU0ludDE2IGluS2V5Q29kZTsKKyAgICBTSW50MTYgaW5DaGFyQ29kZTsKKyAgICBFdmVudE1vZGlmaWVycyBpbk1vZGlmaWVyczsKICNpZm5kZWYgSGFuZGxlQ29udHJvbEtleQotCVB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xLZXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluS2V5Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhckNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGlmaWVycykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEhhbmRsZUNvbnRyb2xLZXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluS2V5Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhckNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhhbmRsZUNvbnRyb2xLZXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGlmaWVycyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0hhbmRsZUNvbnRyb2xTZXRDdXJzb3IoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQb2ludCBsb2NhbFBvaW50OwotCUV2ZW50TW9kaWZpZXJzIG1vZGlmaWVyczsKLQlCb29sZWFuIGN1cnNvcldhc1NldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBsb2NhbFBvaW50OworICAgIEV2ZW50TW9kaWZpZXJzIG1vZGlmaWVyczsKKyAgICBCb29sZWFuIGN1cnNvcldhc1NldDsKICNpZm5kZWYgSGFuZGxlQ29udHJvbFNldEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xTZXRDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xTZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2NhbFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhhbmRsZUNvbnRyb2xTZXRDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29yV2FzU2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBjdXJzb3JXYXNTZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jYWxQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIYW5kbGVDb250cm9sU2V0Q3Vyc29yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnNvcldhc1NldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yV2FzU2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfTW92ZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IGg7Ci0JU0ludDE2IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBoOworICAgIFNJbnQxNiB2OwogI2lmbmRlZiBNb3ZlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKE1vdmVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCU1vdmVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgaCwKLQkgICAgICAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIGgsCisgICAgICAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TaXplQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgdzsKLQlTSW50MTYgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHc7CisgICAgU0ludDE2IGg7CiAjaWZuZGVmIFNpemVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soU2l6ZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKFNpemVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJncsCi0JICAgICAgICAgICAgICAgICAgICAgICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2l6ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICB3LAotCSAgICAgICAgICAgIGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNpemVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICBoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xUaXRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgdGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSB0aXRsZTsKICNpZm5kZWYgU2V0Q29udHJvbFRpdGxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFRpdGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVGl0bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIHRpdGxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbFRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHRpdGxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xUaXRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgdGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSB0aXRsZTsKICNpZm5kZWYgR2V0Q29udHJvbFRpdGxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFRpdGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sVGl0bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldENvbnRyb2xUaXRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aXRsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgdGl0bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRDb250cm9sVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdGl0bGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIHRpdGxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CiAjaWZuZGVmIFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIG91dFN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBvdXRTdHJpbmc7CiAjaWZuZGVmIENvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sVmFsdWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgbmV3VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBuZXdWYWx1ZTsKICNpZm5kZWYgU2V0Q29udHJvbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sVmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbE1pbmltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbE1pbmltdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sTWluaW11bSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbE1pbmltdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xNaW5pbXVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sTWluaW11bShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbE1pbmltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IG5ld01pbmltdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBuZXdNaW5pbXVtOwogI2lmbmRlZiBTZXRDb250cm9sTWluaW11bQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xNaW5pbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sTWluaW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01pbmltdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sTWluaW11bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIG5ld01pbmltdW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01pbmltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sTWluaW11bShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIG5ld01pbmltdW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbE1heGltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbE1heGltdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sTWF4aW11bSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbE1heGltdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sTWF4aW11bShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbE1heGltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IG5ld01heGltdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBuZXdNYXhpbXVtOwogI2lmbmRlZiBTZXRDb250cm9sTWF4aW11bQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xNYXhpbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sTWF4aW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01heGltdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sTWF4aW11bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIG5ld01heGltdW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01heGltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sTWF4aW11bShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIG5ld01heGltdW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFZpZXdTaXplKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xWaWV3U2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xWaWV3U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFZpZXdTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sVmlld1NpemUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xWaWV3U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFZpZXdTaXplKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBuZXdWaWV3U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIG5ld1ZpZXdTaXplOwogI2lmbmRlZiBTZXRDb250cm9sVmlld1NpemUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVmlld1NpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xWaWV3U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld1ZpZXdTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFZpZXdTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIG5ld1ZpZXdTaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdWaWV3U2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xWaWV3U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3U2l6ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sMzJCaXRWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sMzJCaXRWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2wzMkJpdFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sMzJCaXRWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbDMyQml0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2wzMkJpdFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sMzJCaXRWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgbmV3VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBuZXdWYWx1ZTsKICNpZm5kZWYgU2V0Q29udHJvbDMyQml0VmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sMzJCaXRWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbDMyQml0VmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2wzMkJpdFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1ZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbDMyQml0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sMzJCaXRNYXhpbXVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2wzMkJpdE1heGltdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sMzJCaXRNYXhpbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sMzJCaXRNYXhpbXVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sMzJCaXRNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sMzJCaXRNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sMzJCaXRNYXhpbXVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBuZXdNYXhpbXVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgbmV3TWF4aW11bTsKICNpZm5kZWYgU2V0Q29udHJvbDMyQml0TWF4aW11bQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2wzMkJpdE1heGltdW0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2wzMkJpdE1heGltdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNYXhpbXVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbDMyQml0TWF4aW11bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgbmV3TWF4aW11bSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TWF4aW11bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2wzMkJpdE1heGltdW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01heGltdW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbDMyQml0TWluaW11bShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sMzJCaXRNaW5pbXVtCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbDMyQml0TWluaW11bSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbDMyQml0TWluaW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbDMyQml0TWluaW11bShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbDMyQml0TWluaW11bShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbDMyQml0TWluaW11bShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgbmV3TWluaW11bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIG5ld01pbmltdW07CiAjaWZuZGVmIFNldENvbnRyb2wzMkJpdE1pbmltdW0KLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sMzJCaXRNaW5pbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sMzJCaXRNaW5pbXVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TWluaW11bSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2wzMkJpdE1pbmltdW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIG5ld01pbmltdW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01pbmltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sMzJCaXRNaW5pbXVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNaW5pbXVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0lzVmFsaWRDb250cm9sSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNWYWxpZENvbnRyb2xIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhJc1ZhbGlkQ29udHJvbEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZENvbnRyb2xIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzVmFsaWRDb250cm9sSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1ZhbGlkQ29udHJvbEhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbElEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ29udHJvbElEIGluSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ29udHJvbElEIGluSUQ7CiAjaWZuZGVmIFNldENvbnRyb2xJRAotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlDb250cm9sSURfQ29udmVydCwgJmluSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmaW5JRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRyb2xJRF9Db252ZXJ0LCAmaW5JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRDb250cm9sSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpbklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbElEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ29udHJvbElEIG91dElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENvbnRyb2xJRCBvdXRJRDsKICNpZm5kZWYgR2V0Q29udHJvbElECi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb250cm9sSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZvdXRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5Q29udHJvbElEX05ldywgJm91dElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJm91dElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb250cm9sSURfTmV3LCAmb3V0SUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sQ29tbWFuZElEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbkNvbW1hbmRJRDsKICNpZm5kZWYgU2V0Q29udHJvbENvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xDb21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRDb250cm9sQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q29udHJvbENvbW1hbmRJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbENvbW1hbmRJRChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBvdXRDb21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIG91dENvbW1hbmRJRDsKICNpZm5kZWYgR2V0Q29udHJvbENvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xDb21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb250cm9sQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbW1hbmRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Q29tbWFuZElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xDb21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29tbWFuZElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDb21tYW5kSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9SZW1vdmVDb250cm9sUHJvcGVydHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKICNpZm5kZWYgUmVtb3ZlQ29udHJvbFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlQ29udHJvbFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVDb250cm9sUHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlQ29udHJvbFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlQ29udHJvbFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBVSW50MzIgYXR0cmlidXRlczsKICNpZm5kZWYgR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0NoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlc1RvU2V0OwotCVVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBVSW50MzIgYXR0cmlidXRlc1RvU2V0OworICAgIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKICNpZm5kZWYgQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKENoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb1NldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb0NsZWFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNUb0NsZWFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvQ2xlYXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvQ2xlYXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sUmVnaW9uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZ25IYW5kbGUgb3V0UmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmduSGFuZGxlIG91dFJlZ2lvbjsKICNpZm5kZWYgR2V0Q29udHJvbFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRSZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZWdpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0UmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVnaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFZhcmlhbnQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbFZhcmlhbnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sVmFyaWFudCBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xWYXJpYW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFZhcmlhbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xWYXJpYW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sVmFyaWFudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbFZhcmlhbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xBY3Rpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUHlPYmplY3QqIGFjdGlvblByb2M7Ci0JVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCogYWN0aW9uUHJvYzsKKyAgICBVbml2ZXJzYWxQcm9jUHRyIGNfY2FsbGJhY2s7CiAjaWZuZGVmIFNldENvbnRyb2xBY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sQWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sQWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8iLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uUHJvYykpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xBY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIG15YWN0aW9ucHJvY191cHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlzZXRjYWxsYmFjaygoUHlPYmplY3QqKV9zZWxmLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYWN0aW9uUHJvYywgJmNfY2FsbGJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uUHJvYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xBY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIG15YWN0aW9ucHJvY191cHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICBzZXRjYWxsYmFjaygoUHlPYmplY3QqKV9zZWxmLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYWN0aW9uUHJvYywgJmNfY2FsbGJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sUmVmZXJlbmNlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgZGF0YTsKICNpZm5kZWYgU2V0Q29udHJvbFJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFJlZmVyZW5jZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfRW1iZWRDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbEhhbmRsZSBpbkNvbnRhaW5lcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBDb250cm9sSGFuZGxlIGluQ29udGFpbmVyOwogI2lmbmRlZiBFbWJlZENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhFbWJlZENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEVtYmVkQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW1iZWRDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbkNvbnRhaW5lcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udGFpbmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVtYmVkQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5Db250YWluZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9BdXRvRW1iZWRDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKICNpZm5kZWYgQXV0b0VtYmVkQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEF1dG9FbWJlZENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEF1dG9FbWJlZENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEF1dG9FbWJlZENvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEF1dG9FbWJlZENvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldFN1cGVyQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xIYW5kbGUgb3V0UGFyZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xIYW5kbGUgb3V0UGFyZW50OwogI2lmbmRlZiBHZXRTdXBlckNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhHZXRTdXBlckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFN1cGVyQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFN1cGVyQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcmVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIG91dFBhcmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTdXBlckNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQYXJlbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBvdXRQYXJlbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Db3VudFN1YkNvbnRyb2xzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDE2IG91dE51bUNoaWxkcmVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQxNiBvdXROdW1DaGlsZHJlbjsKICNpZm5kZWYgQ291bnRTdWJDb250cm9scwotCVB5TWFjX1BSRUNIRUNLKENvdW50U3ViQ29udHJvbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50U3ViQ29udHJvbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3VudFN1YkNvbnRyb2xzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dE51bUNoaWxkcmVuKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXROdW1DaGlsZHJlbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3VudFN1YkNvbnRyb2xzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE51bUNoaWxkcmVuKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXROdW1DaGlsZHJlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldEluZGV4ZWRTdWJDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDE2IGluSW5kZXg7Ci0JQ29udHJvbEhhbmRsZSBvdXRTdWJDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQxNiBpbkluZGV4OworICAgIENvbnRyb2xIYW5kbGUgb3V0U3ViQ29udHJvbDsKICNpZm5kZWYgR2V0SW5kZXhlZFN1YkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhHZXRJbmRleGVkU3ViQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SW5kZXhlZFN1YkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEluZGV4ZWRTdWJDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdWJDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0U3ViQ29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEluZGV4ZWRTdWJDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdWJDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0U3ViQ29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xTdXBlcnZpc29yKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbEhhbmRsZSBpbkJvc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbEhhbmRsZSBpbkJvc3M7CiAjaWZuZGVmIFNldENvbnRyb2xTdXBlcnZpc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFN1cGVydmlzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xTdXBlcnZpc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkJvc3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbFN1cGVydmlzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Cb3NzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Cb3NzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xTdXBlcnZpc29yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQm9zcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xGZWF0dXJlcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVJbnQzMiBvdXRGZWF0dXJlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVSW50MzIgb3V0RmVhdHVyZXM7CiAjaWZuZGVmIEdldENvbnRyb2xGZWF0dXJlcwotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xGZWF0dXJlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbEZlYXR1cmVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbEZlYXR1cmVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmVhdHVyZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZlYXR1cmVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xGZWF0dXJlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZlYXR1cmVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGZWF0dXJlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xEYXRhU2l6ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7Ci0JUmVzVHlwZSBpblRhZ05hbWU7Ci0JU2l6ZSBvdXRNYXhTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgU2l6ZSBvdXRNYXhTaXplOwogI2lmbmRlZiBHZXRDb250cm9sRGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sRGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xEYXRhU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbERhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWF4U2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0TWF4U2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1heFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1heFNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRHJhZ1RyYWNraW5nTWVzc2FnZSBpbk1lc3NhZ2U7Ci0JRHJhZ1JlZmVyZW5jZSBpbkRyYWc7Ci0JQm9vbGVhbiBvdXRMaWtlc0RyYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRHJhZ1RyYWNraW5nTWVzc2FnZSBpbk1lc3NhZ2U7CisgICAgRHJhZ1JlZmVyZW5jZSBpbkRyYWc7CisgICAgQm9vbGVhbiBvdXRMaWtlc0RyYWc7CiAjaWZuZGVmIEhhbmRsZUNvbnRyb2xEcmFnVHJhY2tpbmcKLQlQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmluRHJhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TGlrZXNEcmFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRMaWtlc0RyYWcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmluRHJhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TGlrZXNEcmFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRMaWtlc0RyYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEcmFnUmVmZXJlbmNlIGluRHJhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEcmFnUmVmZXJlbmNlIGluRHJhZzsKICNpZm5kZWYgSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlCi0JUHlNYWNfUFJFQ0hFQ0soSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX0NvbnZlcnQsICZpbkRyYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRyYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaW5EcmFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhhbmRsZUNvbnRyb2xEcmFnUmVjZWl2ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EcmFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGluVHJhY2tzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5UcmFja3M7CiAjaWZuZGVmIFNldENvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UcmFja3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UcmFja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Jc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBvdXRUcmFja3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBvdXRUcmFja3M7CiAjaWZuZGVmIElzQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSXNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFRyYWNrcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRyYWNrcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VHJhY2tzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbEJvdW5kcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIEdldENvbnRyb2xCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRDb250cm9sQm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldENvbnRyb2xCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSXNDb250cm9sSGlsaXRlZChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzQ29udHJvbEhpbGl0ZWQKLQlQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xIaWxpdGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xIaWxpdGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0NvbnRyb2xIaWxpdGVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0NvbnRyb2xIaWxpdGVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sSGlsaXRlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQxNiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xIaWxpdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sSGlsaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sSGlsaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sSGlsaXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sSGlsaXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sT3duZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbE93bmVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbE93bmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sT3duZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xPd25lcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xPd25lcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xEYXRhSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xEYXRhSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbERhdGFIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xEYXRhSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sRGF0YUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xEYXRhSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFBvcHVwTWVudUlEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sUG9wdXBNZW51SUQKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUG9wdXBNZW51SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQb3B1cE1lbnVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbFBvcHVwTWVudUlEKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sUG9wdXBNZW51SUQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xEYXRhSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBkYXRhSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgZGF0YUhhbmRsZTsKICNpZm5kZWYgU2V0Q29udHJvbERhdGFIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sRGF0YUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbERhdGFIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFIYW5kbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sRGF0YUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFIYW5kbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xEYXRhSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sQm91bmRzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgU2V0Q29udHJvbEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIHBvcHVwTWVudTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBwb3B1cE1lbnU7CiAjaWZuZGVmIFNldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmcG9wdXBNZW51KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBNZW51KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZwb3B1cE1lbnUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cE1lbnUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFBvcHVwTWVudUlEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IG1lbnVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbWVudUlEOwogI2lmbmRlZiBTZXRDb250cm9sUG9wdXBNZW51SUQKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sUG9wdXBNZW51SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xQb3B1cE1lbnVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xQb3B1cE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xQb3B1cE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlVSW50MTYgb3V0VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVUludDE2IG91dFZhbHVlOwogI2lmbmRlZiBHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKEdldEJldmVsQnV0dG9uTWVudVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEJldmVsQnV0dG9uTWVudVZhbHVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRWYWx1ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0VmFsdWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFZhbHVlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRWYWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldEJldmVsQnV0dG9uTWVudVZhbHVlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluVmFsdWU7CiAjaWZuZGVmIFNldEJldmVsQnV0dG9uTWVudVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEJldmVsQnV0dG9uTWVudVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZhbHVlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WYWx1ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldEJldmVsQnV0dG9uTWVudUhhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1lbnVIYW5kbGUgb3V0SGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1lbnVIYW5kbGUgb3V0SGFuZGxlOwogI2lmbmRlZiBHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEJldmVsQnV0dG9uTWVudUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEJldmVsQnV0dG9uTWVudUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRIYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QmV2ZWxCdXR0b25NZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGFuZGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dEhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldEJldmVsQnV0dG9uQ29udGVudEluZm8oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQ7CiAjaWZuZGVmIFNldEJldmVsQnV0dG9uQ29udGVudEluZm8KLQlQeU1hY19QUkVDSEVDSyhTZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkNvbnRlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkNvbnRlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRlbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRCZXZlbEJ1dHRvblRyYW5zZm9ybShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CiAjaWZuZGVmIFNldEJldmVsQnV0dG9uVHJhbnNmb3JtCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEJldmVsQnV0dG9uVHJhbnNmb3JtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldEJldmVsQnV0dG9uVHJhbnNmb3JtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluVmFsdWU7CiAjaWZuZGVmIFNldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFNldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFsdWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFsdWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRUYWJDb250ZW50UmVjdChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3Qgb3V0Q29udGVudFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCBvdXRDb250ZW50UmVjdDsKICNpZm5kZWYgR2V0VGFiQ29udGVudFJlY3QKLQlQeU1hY19QUkVDSEVDSyhHZXRUYWJDb250ZW50UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGFiQ29udGVudFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUYWJDb250ZW50UmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udGVudFJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRDb250ZW50UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUYWJDb250ZW50UmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udGVudFJlY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRDb250ZW50UmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldFRhYkVuYWJsZWQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5UYWJUb0hpbGl0ZTsKLQlCb29sZWFuIGluRW5hYmxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5UYWJUb0hpbGl0ZTsKKyAgICBCb29sZWFuIGluRW5hYmxlZDsKICNpZm5kZWYgU2V0VGFiRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKFNldFRhYkVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRhYkVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UYWJUb0hpbGl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRW5hYmxlZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUYWJFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5UYWJUb0hpbGl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICBpbkVuYWJsZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGFiVG9IaWxpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkVuYWJsZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0VGFiRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFiVG9IaWxpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5FbmFibGVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0SW1hZ2VXZWxsQ29udGVudEluZm8oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQ7CiAjaWZuZGVmIFNldEltYWdlV2VsbENvbnRlbnRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VXZWxsQ29udGVudEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEltYWdlV2VsbENvbnRlbnRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkNvbnRlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0SW1hZ2VXZWxsQ29udGVudEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udGVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmluQ29udGVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRJbWFnZVdlbGxDb250ZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250ZW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0SW1hZ2VXZWxsVHJhbnNmb3JtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblRyYW5zZm9ybVR5cGUgaW5UcmFuc2Zvcm07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblRyYW5zZm9ybVR5cGUgaW5UcmFuc2Zvcm07CiAjaWZuZGVmIFNldEltYWdlV2VsbFRyYW5zZm9ybQotCVB5TWFjX1BSRUNIRUNLKFNldEltYWdlV2VsbFRyYW5zZm9ybSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VXZWxsVHJhbnNmb3JtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UcmFuc2Zvcm0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0SW1hZ2VXZWxsVHJhbnNmb3JtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRyYW5zZm9ybSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRyYW5zZm9ybSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRJbWFnZVdlbGxUcmFuc2Zvcm0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVHJhbnNmb3JtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgc3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHN0eWxlOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclZpZXdTdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVmlld1N0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclZpZXdTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVmlld1N0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBzdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclZpZXdTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgc3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclZpZXdTdHlsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBzdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgc3R5bGU7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVmlld1N0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVmlld1N0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9FbmFibGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVVJbnQzMiBjb21tYW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBVSW50MzIgY29tbWFuZDsKICNpZm5kZWYgRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZAotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0V4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbW1hbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbW1hbmQ7CiAjaWZuZGVmIEV4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kCi0JUHlNYWNfUFJFQ0hFQ0soRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEV4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFeGVjdXRlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGZpcnN0OwotCVVJbnQzMiBsYXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBmaXJzdDsKKyAgICBVSW50MzIgbGFzdDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgZmlyc3QsCi0JICAgICAgICAgICAgICAgICAgICAgbGFzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX01vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBkaXJlY3Rpb247Ci0JQm9vbGVhbiBleHRlbmRTZWxlY3Rpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGRpcmVjdGlvbjsKKyAgICBCb29sZWFuIGV4dGVuZFNlbGVjdGlvbjsKICNpZm5kZWYgTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yCi0JUHlNYWNfUFJFQ0hFQ0soTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5kU2VsZWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE1vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kU2VsZWN0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbmRTZWxlY3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRTZWxlY3Rpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9PcGVuRGF0YUJyb3dzZXJDb250YWluZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29udGFpbmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb250YWluZXI7CiAjaWZuZGVmIE9wZW5EYXRhQnJvd3NlckNvbnRhaW5lcgotCVB5TWFjX1BSRUNIRUNLKE9wZW5EYXRhQnJvd3NlckNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9wZW5EYXRhQnJvd3NlckNvbnRhaW5lcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPcGVuRGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0Nsb3NlRGF0YUJyb3dzZXJDb250YWluZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29udGFpbmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb250YWluZXI7CiAjaWZuZGVmIENsb3NlRGF0YUJyb3dzZXJDb250YWluZXIKLQlQeU1hY19QUkVDSEVDSyhDbG9zZURhdGFCcm93c2VyQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZURhdGFCcm93c2VyQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENsb3NlRGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENsb3NlRGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Tb3J0RGF0YUJyb3dzZXJDb250YWluZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29udGFpbmVyOwotCUJvb2xlYW4gc29ydENoaWxkcmVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb250YWluZXI7CisgICAgQm9vbGVhbiBzb3J0Q2hpbGRyZW47CiAjaWZuZGVmIFNvcnREYXRhQnJvd3NlckNvbnRhaW5lcgotCVB5TWFjX1BSRUNIRUNLKFNvcnREYXRhQnJvd3NlckNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU29ydERhdGFCcm93c2VyQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNvcnRDaGlsZHJlbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTb3J0RGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRDaGlsZHJlbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc29ydENoaWxkcmVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNvcnREYXRhQnJvd3NlckNvbnRhaW5lcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydENoaWxkcmVuKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb250YWluZXI7Ci0JQm9vbGVhbiByZWN1cnNlOwotCVVJbnQzMiBzdGF0ZTsKLQlIYW5kbGUgaXRlbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbnRhaW5lcjsKKyAgICBCb29sZWFuIHJlY3Vyc2U7CisgICAgVUludDMyIHN0YXRlOworICAgIEhhbmRsZSBpdGVtczsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJJdGVtcwotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VySXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbUNvdW50KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbnRhaW5lcjsKLQlCb29sZWFuIHJlY3Vyc2U7Ci0JVUludDMyIHN0YXRlOwotCVVJbnQzMiBudW1JdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29udGFpbmVyOworICAgIEJvb2xlYW4gcmVjdXJzZTsKKyAgICBVSW50MzIgc3RhdGU7CisgICAgVUludDMyIG51bUl0ZW1zOwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckl0ZW1Db3VudAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbUNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckl0ZW1Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VySXRlbUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1JdGVtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtSXRlbXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN1cnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUl0ZW1zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1JdGVtcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JVUludDMyIGl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFVJbnQzMiBpdGVtOwogI2lmbmRlZiBJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkCi0JUHlNYWNfUFJFQ0hFQ0soSXNEYXRhQnJvd3Nlckl0ZW1TZWxlY3RlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNEYXRhQnJvd3Nlckl0ZW1TZWxlY3RlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHN0YXRlOwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbVN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySXRlbVN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9SZXZlYWxEYXRhQnJvd3Nlckl0ZW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgcHJvcGVydHlJRDsKLQlVSW50OCBvcHRpb25zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiBwcm9wZXJ0eUlEOworICAgIFVJbnQ4IG9wdGlvbnM7CiAjaWZuZGVmIFJldmVhbERhdGFCcm93c2VySXRlbQotCVB5TWFjX1BSRUNIRUNLKFJldmVhbERhdGFCcm93c2VySXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmV2ZWFsRGF0YUJyb3dzZXJJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV2ZWFsRGF0YUJyb3dzZXJJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmV2ZWFsRGF0YUJyb3dzZXJJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBhY3RpdmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBhY3RpdmU7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBhY3RpdmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBhY3RpdmU7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyQWN0aXZlSXRlbXMKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5zZXRSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5zZXRSZWN0OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5zZXRSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5zZXRSZWN0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYXJnZXQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiB0YXJnZXQ7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFyZ2V0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYXJnZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFyZ2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYXJnZXQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiB0YXJnZXQ7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFyZ2V0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYXJnZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFyZ2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyU29ydE9yZGVyKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IG9yZGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBvcmRlcjsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNvcnRPcmRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvcmRlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclNvcnRPcmRlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclNvcnRPcmRlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyU29ydE9yZGVyKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IG9yZGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBvcmRlcjsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNvcnRPcmRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclNvcnRPcmRlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JkZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG9yZGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyU29ydE9yZGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHRvcDsKLQlVSW50MzIgbGVmdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgdG9wOworICAgIFVJbnQzMiBsZWZ0OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZWZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHRvcDsKLQlVSW50MzIgbGVmdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgdG9wOworICAgIFVJbnQzMiBsZWZ0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgdG9wLAotCSAgICAgICAgICAgICAgICAgICAgIGxlZnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gaG9yaXo7Ci0JQm9vbGVhbiB2ZXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaG9yaXo7CisgICAgQm9vbGVhbiB2ZXJ0OwogI2lmbmRlZiBTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZob3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZlcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gaG9yaXo7Ci0JQm9vbGVhbiB2ZXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaG9yaXo7CisgICAgQm9vbGVhbiB2ZXJ0OwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBob3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICB2ZXJ0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBob3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgcHJvcGVydHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHByb3BlcnR5OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyU29ydFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU29ydFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyU29ydFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgcHJvcGVydHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHByb3BlcnR5OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU29ydFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU29ydFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgc2VsZWN0aW9uRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHNlbGVjdGlvbkZsYWdzOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3Rpb25GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHNlbGVjdGlvbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBzZWxlY3Rpb25GbGFnczsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncwotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBwcm9wZXJ0eTsKLQlVSW50MzIgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHByb3BlcnR5OworICAgIFVJbnQzMiBmbGFnczsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHksCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHByb3BlcnR5OwotCVVJbnQzMiBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgcHJvcGVydHk7CisgICAgVUludDMyIGZsYWdzOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJFZGl0VGV4dChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIHRleHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgdGV4dDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJFZGl0VGV4dAotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdFRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdFRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0NvcHlEYXRhQnJvd3NlckVkaXRUZXh0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgdGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiB0ZXh0OwogI2lmbmRlZiBDb3B5RGF0YUJyb3dzZXJFZGl0VGV4dAotCVB5TWFjX1BSRUNIRUNLKENvcHlEYXRhQnJvd3NlckVkaXRUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5RGF0YUJyb3dzZXJFZGl0VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvcHlEYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCB0ZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlEYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCB0ZXh0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJFZGl0VGV4dChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGTXV0YWJsZVN0cmluZ1JlZiB0ZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGTXV0YWJsZVN0cmluZ1JlZiB0ZXh0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlckVkaXRUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRleHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJFZGl0VGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlckVkaXRJdGVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGl0ZW07Ci0JVUludDMyIHByb3BlcnR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiBwcm9wZXJ0eTsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJFZGl0SXRlbQotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyRWRpdEl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJFZGl0SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRJdGVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGl0ZW07Ci0JVUludDMyIHByb3BlcnR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiBwcm9wZXJ0eTsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJFZGl0SXRlbQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyRWRpdEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyRWRpdEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlckVkaXRJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckVkaXRJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgcHJvcGVydHk7Ci0JT1NUeXBlIHBhcnQ7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHByb3BlcnR5OworICAgIE9TVHlwZSBwYXJ0OworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcGFydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbHVtbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOwogI2lmbmRlZiBSZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbgotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgbnVtQ29sdW1uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgbnVtQ29sdW1uczsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUNvbHVtbnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG51bUNvbHVtbnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1Db2x1bW5zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1Db2x1bW5zKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBoaWxpdGVTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaGlsaXRlU3R5bGU7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0eWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaGlsaXRlU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGhpbGl0ZVN0eWxlOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0eWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBoZWlnaHQ7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBoZWlnaHQ7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgd2lkdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDE2IHdpZHRoOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IHdpZHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiB3aWR0aDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpdGVtOwotCVVJbnQxNiBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDE2IGhlaWdodDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibEgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGl0ZW07Ci0JVUludDE2IGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaXRlbTsKKyAgICBVSW50MTYgaGVpZ2h0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbHVtbjsKLQlVSW50MTYgd2lkdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbHVtbjsKKyAgICBVSW50MTYgd2lkdGg7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aAotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOwotCVVJbnQxNiB3aWR0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIFVJbnQxNiB3aWR0aDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1uczsKLQlCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIHZhcmlhYmxlV2lkdGhDb2x1bW5zOworICAgIEJvb2xlYW4gdmFyaWFibGVIZWlnaHRSb3dzOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoQ29sdW1ucywKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSGVpZ2h0Um93cykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aENvbHVtbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVIZWlnaHRSb3dzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSGVpZ2h0Um93cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVIZWlnaHRSb3dzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gdmFyaWFibGVXaWR0aENvbHVtbnM7Ci0JQm9vbGVhbiB2YXJpYWJsZUhlaWdodFJvd3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1uczsKKyAgICBCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93czsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlV2lkdGhDb2x1bW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUhlaWdodFJvd3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVdpZHRoQ29sdW1ucywKLQkgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUhlaWdodFJvd3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVIZWlnaHRSb3dzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVIZWlnaHRSb3dzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgcm93OwotCVVJbnQzMiBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiByb3c7CisgICAgVUludDMyIGl0ZW07CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlECi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcm93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3coQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgcm93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiByb3c7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdwotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZyb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpdGVtOwotCVVJbnQzMiByb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHJvdzsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHJvdyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOwotCVVJbnQzMiBwb3NpdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIFVJbnQzMiBwb3NpdGlvbjsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOwotCVVJbnQzMiBwb3NpdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIFVJbnQzMiBwb3NpdGlvbjsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbHVtbjsKLQlVSW50MzIgcHJvcGVydHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbHVtbjsKKyAgICBVSW50MzIgcHJvcGVydHk7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zCi0JUHlNYWNfUFJFQ0hFQ0soQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEF1dG9TaXplRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbnMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgY29sdW1uRGVzYzsKLQlVSW50MzIgcG9zaXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgY29sdW1uRGVzYzsKKyAgICBVSW50MzIgcG9zaXRpb247CiAjaWZuZGVmIEFkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW4KLQlQeU1hY19QUkVDSEVDSyhBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX0NvbnZlcnQsICZjb2x1bW5EZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW5EZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19Db252ZXJ0LCAmY29sdW1uRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBoZWlnaHQ7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MTYgaGVpZ2h0OwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZAotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VQbGFpbkJhY2tncm91bmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBsYWluQmFja2dyb3VuZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VQbGFpbkJhY2tncm91bmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBsYWluQmFja2dyb3VuZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZVBsYWluQmFja2dyb3VuZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgdXNlUGxhaW5CYWNrZ3JvdW5kKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlUGxhaW5CYWNrZ3JvdW5kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQbGFpbkJhY2tncm91bmQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb2x1bW47Ci0JQm9vbGVhbiBleHBhbmRhYmxlUm93czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3M7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV4cGFuZGFibGVSb3dzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVJvd3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4cGFuZGFibGVSb3dzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVJvd3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb2x1bW47Ci0JQm9vbGVhbiBleHBhbmRhYmxlUm93czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3M7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4cGFuZGFibGVSb3dzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGFibGVSb3dzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHBhbmRhYmxlUm93cyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRhYmxlUm93cyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlIYW5kbGUgcGF0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBIYW5kbGUgcGF0aDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBhdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwYXRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBwYXRoTGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBwYXRoTGVuZ3RoOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aExlbmd0aCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aExlbmd0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhMZW5ndGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhMZW5ndGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBwcm9wZXJ0eVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHByb3BlcnR5VHlwZTsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBwcm9wZXJ0eVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHByb3BlcnR5VHlwZTsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHByb3BlcnR5VHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHByb3BlcnR5VHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX2FzX1Jlc291cmNlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIGFzX1Jlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soYXNfUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKGFzX1Jlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBhc19SZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFJlY3QoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIEdldENvbnRyb2xSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRDb250cm9sUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICZyZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRDb250cm9sUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICZyZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9EaXNwb3NlQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQkgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgIGlmICggX3NlbGYtPm9iX2l0c2VsZiApIHsKLQkgICAgICAgICAgICAgICAgU2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsgLyogTWFrZSBpdCBmb3JnZXQgYWJvdXQgdXMgKi8KLQkgICAgICAgICAgICAgICAgRGlzcG9zZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCSAgICAgICAgfQotCSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotCSAgICAgICAgX3JlcyA9IFB5X05vbmU7Ci0JICAgICAgICByZXR1cm4gX3JlczsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCBfc2VsZi0+b2JfaXRzZWxmICkgeworICAgICAgICAgICAgU2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsgLyogTWFrZSBpdCBmb3JnZXQgYWJvdXQgdXMgKi8KKyAgICAgICAgICAgIERpc3Bvc2VDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfVHJhY2tDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCUNvbnRyb2xQYXJ0Q29kZSBfcnY7Ci0JUG9pbnQgc3RhcnRQb2ludDsKLQlDb250cm9sQWN0aW9uVVBQIHVwcCA9IDA7Ci0JUHlPYmplY3QgKmNhbGxiYWNrID0gMDsKKyAgICBDb250cm9sUGFydENvZGUgX3J2OworICAgIFBvaW50IHN0YXJ0UG9pbnQ7CisgICAgQ29udHJvbEFjdGlvblVQUCB1cHAgPSAwOworICAgIFB5T2JqZWN0ICpjYWxsYmFjayA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnxPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFBvaW50LCAmY2FsbGJhY2spKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKGNhbGxiYWNrICYmIGNhbGxiYWNrICE9IFB5X05vbmUpIHsKLQkgICAgICAgIGlmIChQeUludF9DaGVjayhjYWxsYmFjaykgJiYgUHlJbnRfQVNfTE9ORyhjYWxsYmFjaykgPT0gLTEpCi0JICAgICAgICAgICAgICAgIHVwcCA9IChDb250cm9sQWN0aW9uVVBQKS0xOwotCSAgICAgICAgZWxzZSB7Ci0JICAgICAgICAgICAgICAgIHNldHRyYWNrZnVuYyhjYWxsYmFjayk7Ci0JICAgICAgICAgICAgICAgIHVwcCA9IG15dHJhY2tlcl91cHA7Ci0JICAgICAgICB9Ci0JfQotCV9ydiA9IFRyYWNrQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBzdGFydFBvaW50LAotCSAgICAgICAgICAgICAgICAgICB1cHApOwotCWNscnRyYWNrZnVuYygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mfE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsICZjYWxsYmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjYWxsYmFjayAmJiBjYWxsYmFjayAhPSBQeV9Ob25lKSB7CisgICAgICAgIGlmIChQeUludF9DaGVjayhjYWxsYmFjaykgJiYgUHlJbnRfQVNfTE9ORyhjYWxsYmFjaykgPT0gLTEpCisgICAgICAgICAgICB1cHAgPSAoQ29udHJvbEFjdGlvblVQUCktMTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZXR0cmFja2Z1bmMoY2FsbGJhY2spOworICAgICAgICAgICAgdXBwID0gbXl0cmFja2VyX3VwcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBfcnYgPSBUcmFja0NvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgdXBwKTsKKyAgICBjbHJ0cmFja2Z1bmMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IYW5kbGVDb250cm9sQ2xpY2soQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQ29udHJvbFBhcnRDb2RlIF9ydjsKLQlQb2ludCBzdGFydFBvaW50OwotCVNJbnQxNiBtb2RpZmllcnM7Ci0JQ29udHJvbEFjdGlvblVQUCB1cHAgPSAwOwotCVB5T2JqZWN0ICpjYWxsYmFjayA9IDA7CisgICAgQ29udHJvbFBhcnRDb2RlIF9ydjsKKyAgICBQb2ludCBzdGFydFBvaW50OworICAgIFNJbnQxNiBtb2RpZmllcnM7CisgICAgQ29udHJvbEFjdGlvblVQUCB1cHAgPSAwOworICAgIFB5T2JqZWN0ICpjYWxsYmFjayA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmh8TyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQb2ludCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhbGxiYWNrKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWlmIChjYWxsYmFjayAmJiBjYWxsYmFjayAhPSBQeV9Ob25lKSB7Ci0JICAgICAgICBpZiAoUHlJbnRfQ2hlY2soY2FsbGJhY2spICYmIFB5SW50X0FTX0xPTkcoY2FsbGJhY2spID09IC0xKQotCSAgICAgICAgICAgICAgICB1cHAgPSAoQ29udHJvbEFjdGlvblVQUCktMTsKLQkgICAgICAgIGVsc2UgewotCSAgICAgICAgICAgICAgICBzZXR0cmFja2Z1bmMoY2FsbGJhY2spOwotCSAgICAgICAgICAgICAgICB1cHAgPSBteXRyYWNrZXJfdXBwOwotCSAgICAgICAgfQotCX0KLQlfcnYgPSBIYW5kbGVDb250cm9sQ2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgc3RhcnRQb2ludCwKLQkgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICB1cHApOwotCWNscnRyYWNrZnVuYygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maHxPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoY2FsbGJhY2sgJiYgY2FsbGJhY2sgIT0gUHlfTm9uZSkgeworICAgICAgICBpZiAoUHlJbnRfQ2hlY2soY2FsbGJhY2spICYmIFB5SW50X0FTX0xPTkcoY2FsbGJhY2spID09IC0xKQorICAgICAgICAgICAgdXBwID0gKENvbnRyb2xBY3Rpb25VUFApLTE7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2V0dHJhY2tmdW5jKGNhbGxiYWNrKTsKKyAgICAgICAgICAgIHVwcCA9IG15dHJhY2tlcl91cHA7CisgICAgICAgIH0KKyAgICB9CisgICAgX3J2ID0gSGFuZGxlQ29udHJvbENsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgdXBwKTsKKyAgICBjbHJ0cmFja2Z1bmMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sRGF0YShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7Ci0JUmVzVHlwZSBpblRhZ05hbWU7Ci0JU2l6ZSBidWZmZXJTaXplOwotCVB0ciBidWZmZXI7CisgICAgT1NFcnIgX2VycjsKKyAgICBDb250cm9sUGFydENvZGUgaW5QYXJ0OworICAgIFJlc1R5cGUgaW5UYWdOYW1lOworICAgIFNpemUgYnVmZmVyU2l6ZTsKKyAgICBQdHIgYnVmZmVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsICZidWZmZXJTaXplKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLCAmYnVmZmVyU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JX2VyciA9IFNldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIF9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbERhdGEoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NFcnIgX2VycjsKLQlDb250cm9sUGFydENvZGUgaW5QYXJ0OwotCVJlc1R5cGUgaW5UYWdOYW1lOwotCVNpemUgYnVmZmVyU2l6ZTsKLQlQdHIgYnVmZmVyOwotCVNpemUgb3V0U2l6ZTsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgU2l6ZSBidWZmZXJTaXplOworICAgIFB0ciBidWZmZXI7CisgICAgU2l6ZSBvdXRTaXplOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogYWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBkYXRhICovCi0JX2VyciA9IEdldENvbnRyb2xEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCWJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBidWZmZXJTaXplKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpCi0JICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAvKiBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGRhdGEgKi8KKyAgICBfZXJyID0gR2V0Q29udHJvbERhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCV9lcnIgPSBHZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0U2l6ZSk7CisgICAgX2VyciA9IEdldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JICAgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKLQkgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwgYnVmZmVyLCBvdXRTaXplKTsKLQlQeU1lbV9ERUwoYnVmZmVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoX2VyciAhPSBub0VycikgeworICAgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBidWZmZXIsIG91dFNpemUpOworICAgIFB5TWVtX0RFTChidWZmZXIpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xEYXRhX0hhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7Ci0JUmVzVHlwZSBpblRhZ05hbWU7Ci0JSGFuZGxlIGJ1ZmZlcjsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgSGFuZGxlIGJ1ZmZlcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmJ1ZmZlcikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZidWZmZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCV9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZmZlciksCi0JICAgICAgICAgICAgICAgICAgICAgIChQdHIpJmJ1ZmZlcik7CisgICAgX2VyciA9IFNldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFB0cikmYnVmZmVyKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbERhdGFfSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZXNUeXBlIGluVGFnTmFtZTsKLQlTaXplIGJ1ZmZlclNpemU7Ci0JSGFuZGxlIGhkbDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgU2l6ZSBidWZmZXJTaXplOworICAgIEhhbmRsZSBoZGw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBDaGVjayBpdCBpcyBoYW5kbGUtc2l6ZWQgKi8KLQlfZXJyID0gR2V0Q29udHJvbERhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpCi0JICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JaWYgKGJ1ZmZlclNpemUgIT0gc2l6ZW9mKEhhbmRsZSkpIHsKLQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJHZXRDb250cm9sRGF0YVNpemUoKSAhPSBzaXplb2YoSGFuZGxlKSIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIENoZWNrIGl0IGlzIGhhbmRsZS1zaXplZCAqLworICAgIF9lcnIgPSBHZXRDb250cm9sRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIGlmIChidWZmZXJTaXplICE9IHNpemVvZihIYW5kbGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJHZXRDb250cm9sRGF0YVNpemUoKSAhPSBzaXplb2YoSGFuZGxlKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlfZXJyID0gR2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIYW5kbGUpLAotCSAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZoZGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKKyAgICBfZXJyID0gR2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIYW5kbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZoZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIE9wdFJlc09ial9OZXcsIGhkbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBPcHRSZXNPYmpfTmV3LCBoZGwpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xEYXRhX0NhbGxiYWNrKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZXNUeXBlIGluVGFnTmFtZTsKLQlQeU9iamVjdCAqY2FsbGJhY2s7Ci0JVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbFBhcnRDb2RlIGluUGFydDsKKyAgICBSZXNUeXBlIGluVGFnTmFtZTsKKyAgICBQeU9iamVjdCAqY2FsbGJhY2s7CisgICAgVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhbGxiYWNrKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCBzZXRjYWxsYmFjaygoUHlPYmplY3QgKilfc2VsZiwgaW5UYWdOYW1lLCBjYWxsYmFjaywgJmNfY2FsbGJhY2spIDwgMCApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjX2NhbGxiYWNrKSwKLQkgICAgICAgICAgICAgICAgICAgICAgKFB0cikmY19jYWxsYmFjayk7CisgICAgaWYgKCBzZXRjYWxsYmFjaygoUHlPYmplY3QgKilfc2VsZiwgaW5UYWdOYW1lLCBjYWxsYmFjaywgJmNfY2FsbGJhY2spIDwgMCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNfY2FsbGJhY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZjX2NhbGxiYWNrKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEN0bE9ial9tZXRob2RzW10gPSB7Ci0JeyJIaWxpdGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IaWxpdGVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihDb250cm9sUGFydENvZGUgaGlsaXRlU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJTaG93Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2hvd0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkhpZGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IaWRlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSXNDb250cm9sQWN0aXZlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzQ29udHJvbFZpc2libGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbFZpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkFjdGl2YXRlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfQWN0aXZhdGVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEZWFjdGl2YXRlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRGVhY3RpdmF0ZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldENvbnRyb2xWaXNpYmlsaXR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sVmlzaWJpbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbklzVmlzaWJsZSwgQm9vbGVhbiBpbkRvRHJhdykgLT4gTm9uZSIpfSwKLQl7IklzQ29udHJvbEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbEVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkVuYWJsZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0VuYWJsZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EaXNhYmxlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRHJhdzFDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EcmF3MUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldEJlc3RDb250cm9sUmVjdCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0QmVzdENvbnRyb2xSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dFJlY3QsIFNJbnQxNiBvdXRCYXNlTGluZU9mZnNldCkiKX0sCi0JeyJTZXRDb250cm9sRm9udFN0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRm9udFN0eWxlLCAxLAotCSBQeURvY19TVFIoIihDb250cm9sRm9udFN0eWxlUmVjIGluU3R5bGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3Q29udHJvbEluQ3VycmVudFBvcnQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RyYXdDb250cm9sSW5DdXJyZW50UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0VXBDb250cm9sQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0VXBDb250cm9sQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAotCXsiU2V0VXBDb250cm9sVGV4dENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRVcENvbnRyb2xUZXh0Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKLQl7IkRyYWdDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EcmFnQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQb2ludCwgUmVjdCBsaW1pdFJlY3QsIFJlY3Qgc2xvcFJlY3QsIERyYWdDb25zdHJhaW50IGF4aXMpIC0+IE5vbmUiKX0sCi0JeyJUZXN0Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfVGVzdENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQb2ludCkgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYpIil9LAotCXsiSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2siLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xDb250ZXh0dWFsTWVudUNsaWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpbldoZXJlKSAtPiAoQm9vbGVhbiBtZW51RGlzcGxheWVkKSIpfSwKLQl7IkdldENvbnRyb2xDbGlja0FjdGl2YXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xDbGlja0FjdGl2YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGluV2hlcmUsIEV2ZW50TW9kaWZpZXJzIGluTW9kaWZpZXJzKSAtPiAoQ2xpY2tBY3RpdmF0aW9uUmVzdWx0IG91dFJlc3VsdCkiKX0sCi0JeyJIYW5kbGVDb250cm9sS2V5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sS2V5LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5LZXlDb2RlLCBTSW50MTYgaW5DaGFyQ29kZSwgRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnMpIC0+IChDb250cm9sUGFydENvZGUgX3J2KSIpfSwKLQl7IkhhbmRsZUNvbnRyb2xTZXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xTZXRDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGxvY2FsUG9pbnQsIEV2ZW50TW9kaWZpZXJzIG1vZGlmaWVycykgLT4gKEJvb2xlYW4gY3Vyc29yV2FzU2V0KSIpfSwKLQl7Ik1vdmVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Nb3ZlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGgsIFNJbnQxNiB2KSAtPiBOb25lIil9LAotCXsiU2l6ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NpemVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdywgU0ludDE2IGgpIC0+IE5vbmUiKX0sCi0JeyJTZXRDb250cm9sVGl0bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xUaXRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHRpdGxlKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbFRpdGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVGl0bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFN0cjI1NSB0aXRsZSkiKX0sCi0JeyJTZXRDb250cm9sVGl0bGVXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDb3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZyIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFN0cmluZykiKX0sCi0JeyJHZXRDb250cm9sVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJTZXRDb250cm9sVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IG5ld1ZhbHVlKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xNaW5pbXVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IlNldENvbnRyb2xNaW5pbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sTWluaW11bSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IG5ld01pbmltdW0pIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sTWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbE1heGltdW0sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiU2V0Q29udHJvbE1heGltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xNYXhpbXVtLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgbmV3TWF4aW11bSkgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xWaWV3U2l6ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFZpZXdTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IlNldENvbnRyb2xWaWV3U2l6ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFZpZXdTaXplLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgbmV3Vmlld1NpemUpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sMzJCaXRWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbDMyQml0VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAotCXsiU2V0Q29udHJvbDMyQml0VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2wzMkJpdFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgbmV3VmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sMzJCaXRNYXhpbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sMzJCaXRNYXhpbXVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IlNldENvbnRyb2wzMkJpdE1heGltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2wzMkJpdE1heGltdW0sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdNYXhpbXVtKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbDMyQml0TWluaW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbDMyQml0TWluaW11bSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJTZXRDb250cm9sMzJCaXRNaW5pbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sMzJCaXRNaW5pbXVtLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgbmV3TWluaW11bSkgLT4gTm9uZSIpfSwKLQl7IklzVmFsaWRDb250cm9sSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc1ZhbGlkQ29udHJvbEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0Q29udHJvbElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sSUQsIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xJRCBpbklEKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sSUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xJRCBvdXRJRCkiKX0sCi0JeyJTZXRDb250cm9sQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgb3V0Q29tbWFuZElEKSIpfSwKLQl7IlJlbW92ZUNvbnRyb2xQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfUmVtb3ZlQ29udHJvbFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IChVSW50MzIgYXR0cmlidXRlcykiKX0sCi0JeyJDaGFuZ2VDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9DaGFuZ2VDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcsIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQsIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcikgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xSZWdpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xQYXJ0Q29kZSBpblBhcnQsIFJnbkhhbmRsZSBvdXRSZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sVmFyaWFudCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFZhcmlhbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xWYXJpYW50IF9ydikiKX0sCi0JeyJTZXRDb250cm9sQWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sQWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihQeU9iamVjdCogYWN0aW9uUHJvYykgLT4gTm9uZSIpfSwKLQl7IlNldENvbnRyb2xSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBkYXRhKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbFJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJFbWJlZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0VtYmVkQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29udHJvbEhhbmRsZSBpbkNvbnRhaW5lcikgLT4gTm9uZSIpfSwKLQl7IkF1dG9FbWJlZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0F1dG9FbWJlZENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkdldFN1cGVyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0U3VwZXJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb250cm9sSGFuZGxlIG91dFBhcmVudCkiKX0sCi0JeyJDb3VudFN1YkNvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Db3VudFN1YkNvbnRyb2xzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgb3V0TnVtQ2hpbGRyZW4pIil9LAotCXsiR2V0SW5kZXhlZFN1YkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldEluZGV4ZWRTdWJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihVSW50MTYgaW5JbmRleCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0U3ViQ29udHJvbCkiKX0sCi0JeyJTZXRDb250cm9sU3VwZXJ2aXNvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFN1cGVydmlzb3IsIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xIYW5kbGUgaW5Cb3NzKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbEZlYXR1cmVzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRmVhdHVyZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRGZWF0dXJlcykiKX0sCi0JeyJHZXRDb250cm9sRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xEYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29udHJvbFBhcnRDb2RlIGluUGFydCwgUmVzVHlwZSBpblRhZ05hbWUpIC0+IChTaXplIG91dE1heFNpemUpIil9LAotCXsiSGFuZGxlQ29udHJvbERyYWdUcmFja2luZyIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbERyYWdUcmFja2luZywgMSwKLQkgUHlEb2NfU1RSKCIoRHJhZ1RyYWNraW5nTWVzc2FnZSBpbk1lc3NhZ2UsIERyYWdSZWZlcmVuY2UgaW5EcmFnKSAtPiAoQm9vbGVhbiBvdXRMaWtlc0RyYWcpIil9LAotCXsiSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUsIDEsCi0JIFB5RG9jX1NUUigiKERyYWdSZWZlcmVuY2UgaW5EcmFnKSAtPiBOb25lIil9LAotCXsiU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluVHJhY2tzKSAtPiBOb25lIil9LAotCXsiSXNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBvdXRUcmFja3MpIil9LAotCXsiR2V0Q29udHJvbEJvdW5kcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiSXNDb250cm9sSGlsaXRlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sSGlsaXRlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0Q29udHJvbEhpbGl0ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbEhpbGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IF9ydikiKX0sCi0JeyJHZXRDb250cm9sT3duZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xPd25lciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJHZXRDb250cm9sRGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbERhdGFIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q29udHJvbFBvcHVwTWVudUlEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUG9wdXBNZW51SUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJTZXRDb250cm9sRGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERhdGFIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhSGFuZGxlKSAtPiBOb25lIil9LAotCXsiU2V0Q29udHJvbEJvdW5kcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sUG9wdXBNZW51SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIHBvcHVwTWVudSkgLT4gTm9uZSIpfSwKLQl7IlNldENvbnRyb2xQb3B1cE1lbnVJRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFBvcHVwTWVudUlELCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtZW51SUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRWYWx1ZSkiKX0sCi0JeyJTZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpblZhbHVlKSAtPiBOb25lIil9LAotCXsiR2V0QmV2ZWxCdXR0b25NZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgb3V0SGFuZGxlKSIpfSwKLQl7IlNldEJldmVsQnV0dG9uQ29udGVudEluZm8iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldEJldmVsQnV0dG9uQ29udGVudEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQpIC0+IE5vbmUiKX0sCi0JeyJTZXRCZXZlbEJ1dHRvblRyYW5zZm9ybSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0sIDEsCi0JIFB5RG9jX1NUUigiKEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKLQl7IlNldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5WYWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkdldFRhYkNvbnRlbnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRUYWJDb250ZW50UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvdXRDb250ZW50UmVjdCkiKX0sCi0JeyJTZXRUYWJFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRUYWJFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5UYWJUb0hpbGl0ZSwgQm9vbGVhbiBpbkVuYWJsZWQpIC0+IE5vbmUiKX0sCi0JeyJTZXRJbWFnZVdlbGxDb250ZW50SW5mbyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0SW1hZ2VXZWxsQ29udGVudEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQpIC0+IE5vbmUiKX0sCi0JeyJTZXRJbWFnZVdlbGxUcmFuc2Zvcm0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldEltYWdlV2VsbFRyYW5zZm9ybSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblRyYW5zZm9ybVR5cGUgaW5UcmFuc2Zvcm0pIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclZpZXdTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9TVHlwZSBzdHlsZSkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclZpZXdTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBzdHlsZSkgLT4gTm9uZSIpfSwKLQl7IkVuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0VuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb21tYW5kKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0V4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29tbWFuZCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGZpcnN0LCBVSW50MzIgbGFzdCkiKX0sCi0JeyJNb3ZlRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX01vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGRpcmVjdGlvbiwgQm9vbGVhbiBleHRlbmRTZWxlY3Rpb24pIC0+IE5vbmUiKX0sCi0JeyJPcGVuRGF0YUJyb3dzZXJDb250YWluZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX09wZW5EYXRhQnJvd3NlckNvbnRhaW5lciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lcikgLT4gTm9uZSIpfSwKLQl7IkNsb3NlRGF0YUJyb3dzZXJDb250YWluZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0Nsb3NlRGF0YUJyb3dzZXJDb250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIpIC0+IE5vbmUiKX0sCi0JeyJTb3J0RGF0YUJyb3dzZXJDb250YWluZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NvcnREYXRhQnJvd3NlckNvbnRhaW5lciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lciwgQm9vbGVhbiBzb3J0Q2hpbGRyZW4pIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1zLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyLCBCb29sZWFuIHJlY3Vyc2UsIFVJbnQzMiBzdGF0ZSwgSGFuZGxlIGl0ZW1zKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbUNvdW50LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyLCBCb29sZWFuIHJlY3Vyc2UsIFVJbnQzMiBzdGF0ZSkgLT4gKFVJbnQzMiBudW1JdGVtcykiKX0sCi0JeyJJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldERhdGFCcm93c2VySXRlbVN0YXRlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0pIC0+IChVSW50MzIgc3RhdGUpIil9LAotCXsiUmV2ZWFsRGF0YUJyb3dzZXJJdGVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9SZXZlYWxEYXRhQnJvd3Nlckl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHlJRCwgVUludDggb3B0aW9ucykgLT4gTm9uZSIpfSwKLQl7IlNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyQWN0aXZlSXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gYWN0aXZlKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBhY3RpdmUpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBpbnNldFJlY3QpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBpbnNldFJlY3QpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgdGFyZ2V0KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgdGFyZ2V0KSIpfSwKLQl7IlNldERhdGFCcm93c2VyU29ydE9yZGVyIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNvcnRPcmRlciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IG9yZGVyKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU29ydE9yZGVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgb3JkZXIpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHRvcCwgVUludDMyIGxlZnQpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgdG9wLCBVSW50MzIgbGVmdCkiKX0sCi0JeyJTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBob3JpeiwgQm9vbGVhbiB2ZXJ0KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gaG9yaXosIEJvb2xlYW4gdmVydCkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBwcm9wZXJ0eSkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyU29ydFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIHByb3BlcnR5KSIpfSwKLQl7IlNldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBzZWxlY3Rpb25GbGFncykgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBzZWxlY3Rpb25GbGFncykiKX0sCi0JeyJTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyUHJvcGVydHlGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHByb3BlcnR5LCBVSW50MzIgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyUHJvcGVydHlGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHByb3BlcnR5KSAtPiAoVUludDMyIGZsYWdzKSIpfSwKLQl7IlNldERhdGFCcm93c2VyRWRpdFRleHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyRWRpdFRleHQsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHRleHQpIC0+IE5vbmUiKX0sCi0JeyJDb3B5RGF0YUJyb3dzZXJFZGl0VGV4dCIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ29weURhdGFCcm93c2VyRWRpdFRleHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIHRleHQpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZNdXRhYmxlU3RyaW5nUmVmIHRleHQpIC0+IE5vbmUiKX0sCi0JeyJTZXREYXRhQnJvd3NlckVkaXRJdGVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlckVkaXRJdGVtLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSwgVUludDMyIHByb3BlcnR5KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJFZGl0SXRlbSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJFZGl0SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGl0ZW0sIFVJbnQzMiBwcm9wZXJ0eSkiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSwgVUludDMyIHByb3BlcnR5LCBPU1R5cGUgcGFydCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7IlJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9SZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbikgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBudW1Db2x1bW5zKSIpfSwKLQl7IlNldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBoaWxpdGVTdHlsZSkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBoaWxpdGVTdHlsZSkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQxNiBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBoZWlnaHQpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IHdpZHRoKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IHdpZHRoKSIpfSwKLQl7IlNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSwgVUludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSkgLT4gKFVJbnQxNiBoZWlnaHQpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4sIFVJbnQxNiB3aWR0aCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29sdW1uKSAtPiAoVUludDE2IHdpZHRoKSIpfSwKLQl7IlNldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnksIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gdmFyaWFibGVXaWR0aENvbHVtbnMsIEJvb2xlYW4gdmFyaWFibGVIZWlnaHRSb3dzKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1ucywgQm9vbGVhbiB2YXJpYWJsZUhlaWdodFJvd3MpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlELCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgcm93KSAtPiAoVUludDMyIGl0ZW0pIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3csIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcm93KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3csIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoVUludDMyIHJvdykiKX0sCi0JeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29sdW1uLCBVSW50MzIgcG9zaXRpb24pIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29sdW1uKSAtPiAoVUludDMyIHBvc2l0aW9uKSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IChVSW50MzIgcHJvcGVydHkpIil9LAotCXsiQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyIsIChQeUNGdW5jdGlvbilDdGxPYmpfQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgY29sdW1uRGVzYywgVUludDMyIHBvc2l0aW9uKSAtPiBOb25lIil9LAotCXsiU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBoZWlnaHQpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiB1c2VQbGFpbkJhY2tncm91bmQpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZCkiKX0sCi0JeyJTZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4sIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4sIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3MpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBjb2x1bW4sIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3MpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHBhdGgpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgcGF0aExlbmd0aCkiKX0sCi0JeyJTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9TVHlwZSBwcm9wZXJ0eVR5cGUpIil9LAotCXsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX2FzX1Jlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldENvbnRyb2xSZWN0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCByZWN0KSIpfSwKLQl7IkRpc3Bvc2VDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EaXNwb3NlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVHJhY2tDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9UcmFja0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UG9pbnQgWyx0cmFja2VyY2FsbGJhY2tdKSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCi0JeyJIYW5kbGVDb250cm9sQ2xpY2siLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xDbGljaywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQb2ludCwgSW50ZWdlciBtb2RpZmllcnMsIFssdHJhY2tlcmNhbGxiYWNrXSkgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYpIil9LAotCXsiU2V0Q29udHJvbERhdGEiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEYXRhLCAxLAotCSBQeURvY19TVFIoIihzdHVmZikgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xEYXRhIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIocGFydCwgdHlwZSkgLT4gU3RyaW5nIil9LAotCXsiU2V0Q29udHJvbERhdGFfSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YV9IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlc09iaikgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xEYXRhX0hhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbERhdGFfSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihwYXJ0LCB0eXBlKSAtPiBSZXNPYmoiKX0sCi0JeyJTZXRDb250cm9sRGF0YV9DYWxsYmFjayIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERhdGFfQ2FsbGJhY2ssIDEsCi0JIFB5RG9jX1NUUigiKGNhbGxiYWNrZnVuYykgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkhpbGl0ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hpbGl0ZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbnRyb2xQYXJ0Q29kZSBoaWxpdGVTdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TaG93Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlkZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hpZGVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJc0NvbnRyb2xBY3RpdmUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbEFjdGl2ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNDb250cm9sVmlzaWJsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sVmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQWN0aXZhdGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BY3RpdmF0ZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRlYWN0aXZhdGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EZWFjdGl2YXRlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29udHJvbFZpc2liaWxpdHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xWaXNpYmlsaXR5LCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluSXNWaXNpYmxlLCBCb29sZWFuIGluRG9EcmF3KSAtPiBOb25lIil9LAorICAgIHsiSXNDb250cm9sRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiRW5hYmxlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW5hYmxlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0Rpc2FibGVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3MUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RyYXcxQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0QmVzdENvbnRyb2xSZWN0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRCZXN0Q29udHJvbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3Qgb3V0UmVjdCwgU0ludDE2IG91dEJhc2VMaW5lT2Zmc2V0KSIpfSwKKyAgICB7IlNldENvbnRyb2xGb250U3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xGb250U3R5bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbnRyb2xGb250U3R5bGVSZWMgaW5TdHlsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdDb250cm9sSW5DdXJyZW50UG9ydCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRHJhd0NvbnRyb2xJbkN1cnJlbnRQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRVcENvbnRyb2xCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRVcENvbnRyb2xCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRVcENvbnRyb2xUZXh0Q29sb3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldFVwQ29udHJvbFRleHRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAorICAgIHsiRHJhZ0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RyYWdDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFBvaW50LCBSZWN0IGxpbWl0UmVjdCwgUmVjdCBzbG9wUmVjdCwgRHJhZ0NvbnN0cmFpbnQgYXhpcykgLT4gTm9uZSIpfSwKKyAgICB7IlRlc3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9UZXN0Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFBvaW50KSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCisgICAgeyJIYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljayIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IGluV2hlcmUpIC0+IChCb29sZWFuIG1lbnVEaXNwbGF5ZWQpIil9LAorICAgIHsiR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgaW5XaGVyZSwgRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnMpIC0+IChDbGlja0FjdGl2YXRpb25SZXN1bHQgb3V0UmVzdWx0KSIpfSwKKyAgICB7IkhhbmRsZUNvbnRyb2xLZXkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbktleUNvZGUsIFNJbnQxNiBpbkNoYXJDb2RlLCBFdmVudE1vZGlmaWVycyBpbk1vZGlmaWVycykgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYpIil9LAorICAgIHsiSGFuZGxlQ29udHJvbFNldEN1cnNvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbFNldEN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgbG9jYWxQb2ludCwgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzKSAtPiAoQm9vbGVhbiBjdXJzb3JXYXNTZXQpIil9LAorICAgIHsiTW92ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX01vdmVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaCwgU0ludDE2IHYpIC0+IE5vbmUiKX0sCisgICAgeyJTaXplQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2l6ZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB3LCBTSW50MTYgaCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldENvbnRyb2xUaXRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFRpdGxlLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgdGl0bGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sVGl0bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3RyMjU1IHRpdGxlKSIpfSwKKyAgICB7IlNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nKSIpfSwKKyAgICB7IkdldENvbnRyb2xWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgbmV3VmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sTWluaW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbE1pbmltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xNaW5pbXVtLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgbmV3TWluaW11bSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xNYXhpbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sTWF4aW11bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sTWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbE1heGltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBuZXdNYXhpbXVtKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbFZpZXdTaXplIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVmlld1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbFZpZXdTaXplIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sVmlld1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdWaWV3U2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2wzMkJpdFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sMzJCaXRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sMzJCaXRWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbDMyQml0VmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdWYWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2wzMkJpdE1heGltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2wzMkJpdE1heGltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbDMyQml0TWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbDMyQml0TWF4aW11bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIG5ld01heGltdW0pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sMzJCaXRNaW5pbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sMzJCaXRNaW5pbXVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2wzMkJpdE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2wzMkJpdE1pbmltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdNaW5pbXVtKSAtPiBOb25lIil9LAorICAgIHsiSXNWYWxpZENvbnRyb2xIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzVmFsaWRDb250cm9sSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbElEIGluSUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbElEIG91dElEKSIpfSwKKyAgICB7IlNldENvbnRyb2xDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xDb21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xDb21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRDb21tYW5kSUQpIil9LAorICAgIHsiUmVtb3ZlQ29udHJvbFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9SZW1vdmVDb250cm9sUHJvcGVydHksIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gKFVJbnQzMiBhdHRyaWJ1dGVzKSIpfSwKKyAgICB7IkNoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0NoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZywgVUludDMyIGF0dHJpYnV0ZXNUb1NldCwgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbFJlZ2lvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbFBhcnRDb2RlIGluUGFydCwgUmduSGFuZGxlIG91dFJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xWYXJpYW50IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVmFyaWFudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbFZhcmlhbnQgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xBY3Rpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xBY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFB5T2JqZWN0KiBhY3Rpb25Qcm9jKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29udHJvbFJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIGRhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkVtYmVkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW1iZWRDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sSGFuZGxlIGluQ29udGFpbmVyKSAtPiBOb25lIil9LAorICAgIHsiQXV0b0VtYmVkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfQXV0b0VtYmVkQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiR2V0U3VwZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRTdXBlckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0UGFyZW50KSIpfSwKKyAgICB7IkNvdW50U3ViQ29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0NvdW50U3ViQ29udHJvbHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBvdXROdW1DaGlsZHJlbikiKX0sCisgICAgeyJHZXRJbmRleGVkU3ViQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0SW5kZXhlZFN1YkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiBpbkluZGV4KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRTdWJDb250cm9sKSIpfSwKKyAgICB7IlNldENvbnRyb2xTdXBlcnZpc29yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sU3VwZXJ2aXNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEhhbmRsZSBpbkJvc3MpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sRmVhdHVyZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xGZWF0dXJlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG91dEZlYXR1cmVzKSIpfSwKKyAgICB7IkdldENvbnRyb2xEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbERhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sUGFydENvZGUgaW5QYXJ0LCBSZXNUeXBlIGluVGFnTmFtZSkgLT4gKFNpemUgb3V0TWF4U2l6ZSkiKX0sCisgICAgeyJIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nLCAxLAorICAgICBQeURvY19TVFIoIihEcmFnVHJhY2tpbmdNZXNzYWdlIGluTWVzc2FnZSwgRHJhZ1JlZmVyZW5jZSBpbkRyYWcpIC0+IChCb29sZWFuIG91dExpa2VzRHJhZykiKX0sCisgICAgeyJIYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xEcmFnUmVjZWl2ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRHJhZ1JlZmVyZW5jZSBpbkRyYWcpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5UcmFja3MpIC0+IE5vbmUiKX0sCisgICAgeyJJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIG91dFRyYWNrcykiKX0sCisgICAgeyJHZXRDb250cm9sQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJJc0NvbnRyb2xIaWxpdGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xIaWxpdGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sSGlsaXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MTYgX3J2KSIpfSwKKyAgICB7IkdldENvbnRyb2xPd25lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbE93bmVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkdldENvbnRyb2xEYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUG9wdXBNZW51SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sUG9wdXBNZW51SUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xQb3B1cE1lbnVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xEYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFIYW5kbGUpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDb250cm9sQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcykgLT4gTm9uZSIpfSwKKyAgICB7IlNldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgcG9wdXBNZW51KSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29udHJvbFBvcHVwTWVudUlEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sUG9wdXBNZW51SUQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IG1lbnVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEJldmVsQnV0dG9uTWVudVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dFZhbHVlKSIpfSwKKyAgICB7IlNldEJldmVsQnV0dG9uTWVudVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluVmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldEJldmVsQnV0dG9uTWVudUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBvdXRIYW5kbGUpIil9LAorICAgIHsiU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEJldmVsQnV0dG9uVHJhbnNmb3JtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRCZXZlbEJ1dHRvblRyYW5zZm9ybSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtKSAtPiBOb25lIil9LAorICAgIHsiU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpblZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGFiQ29udGVudFJlY3QiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldFRhYkNvbnRlbnRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dENvbnRlbnRSZWN0KSIpfSwKKyAgICB7IlNldFRhYkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldFRhYkVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpblRhYlRvSGlsaXRlLCBCb29sZWFuIGluRW5hYmxlZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEltYWdlV2VsbENvbnRlbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRJbWFnZVdlbGxDb250ZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEltYWdlV2VsbFRyYW5zZm9ybSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0SW1hZ2VXZWxsVHJhbnNmb3JtLCAxLAorICAgICBQeURvY19TVFIoIihJY29uVHJhbnNmb3JtVHlwZSBpblRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVmlld1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclZpZXdTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoT1NUeXBlIHN0eWxlKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVmlld1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclZpZXdTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHN0eWxlKSAtPiBOb25lIil9LAorICAgIHsiRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbW1hbmQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJFeGVjdXRlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb21tYW5kKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgZmlyc3QsIFVJbnQzMiBsYXN0KSIpfSwKKyAgICB7Ik1vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgZGlyZWN0aW9uLCBCb29sZWFuIGV4dGVuZFNlbGVjdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7Ik9wZW5EYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyKSAtPiBOb25lIil9LAorICAgIHsiQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lcikgLT4gTm9uZSIpfSwKKyAgICB7IlNvcnREYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfU29ydERhdGFCcm93c2VyQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyLCBCb29sZWFuIHNvcnRDaGlsZHJlbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VySXRlbXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIsIEJvb2xlYW4gcmVjdXJzZSwgVUludDMyIHN0YXRlLCBIYW5kbGUgaXRlbXMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3Nlckl0ZW1Db3VudCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIsIEJvb2xlYW4gcmVjdXJzZSwgVUludDMyIHN0YXRlKSAtPiAoVUludDMyIG51bUl0ZW1zKSIpfSwKKyAgICB7IklzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbVN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaXRlbSkgLT4gKFVJbnQzMiBzdGF0ZSkiKX0sCisgICAgeyJSZXZlYWxEYXRhQnJvd3Nlckl0ZW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1JldmVhbERhdGFCcm93c2VySXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0sIFVJbnQzMiBwcm9wZXJ0eUlELCBVSW50OCBvcHRpb25zKSAtPiBOb25lIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBhY3RpdmUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGFjdGl2ZSkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGluc2V0UmVjdCkiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGluc2V0UmVjdCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhcmdldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiB0YXJnZXQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhcmdldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiB0YXJnZXQpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyU29ydE9yZGVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgb3JkZXIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclNvcnRPcmRlciIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBvcmRlcikiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgdG9wLCBVSW50MzIgbGVmdCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiB0b3AsIFVJbnQzMiBsZWZ0KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGhvcml6LCBCb29sZWFuIHZlcnQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBob3JpeiwgQm9vbGVhbiB2ZXJ0KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyU29ydFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIHByb3BlcnR5KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU29ydFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgcHJvcGVydHkpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIHNlbGVjdGlvbkZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIHNlbGVjdGlvbkZsYWdzKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgcHJvcGVydHksIFVJbnQzMiBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgcHJvcGVydHkpIC0+IChVSW50MzIgZmxhZ3MpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJFZGl0VGV4dCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJFZGl0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdGV4dCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlEYXRhQnJvd3NlckVkaXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Db3B5RGF0YUJyb3dzZXJFZGl0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgdGV4dCkiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckVkaXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihDRk11dGFibGVTdHJpbmdSZWYgdGV4dCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyRWRpdEl0ZW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyRWRpdEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHkpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckVkaXRJdGVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRJdGVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgaXRlbSwgVUludDMyIHByb3BlcnR5KSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHksIE9TVHlwZSBwYXJ0KSAtPiAoUmVjdCBib3VuZHMpIil9LAorICAgIHsiUmVtb3ZlRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW4iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29sdW1uKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG51bUNvbHVtbnMpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGhpbGl0ZVN0eWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGhpbGl0ZVN0eWxlKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgd2lkdGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MTYgd2lkdGgpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MTYgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbiwgVUludDE2IHdpZHRoKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IChVSW50MTYgd2lkdGgpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1ucywgQm9vbGVhbiB2YXJpYWJsZUhlaWdodFJvd3MpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIHZhcmlhYmxlV2lkdGhDb2x1bW5zLCBCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93cykiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1JRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiByb3cpIC0+IChVSW50MzIgaXRlbSkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3ciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0sIFVJbnQzMiByb3cpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3ciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0pIC0+IChVSW50MzIgcm93KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4sIFVJbnQzMiBwb3NpdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IChVSW50MzIgcG9zaXRpb24pIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbikgLT4gKFVJbnQzMiBwcm9wZXJ0eSkiKX0sCisgICAgeyJBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzYyBjb2x1bW5EZXNjLCBVSW50MzIgcG9zaXRpb24pIC0+IE5vbmUiKX0sCisgICAgeyJTZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0LCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gdXNlUGxhaW5CYWNrZ3JvdW5kKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbiwgQm9vbGVhbiBleHBhbmRhYmxlUm93cykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGNvbHVtbiwgQm9vbGVhbiBleHBhbmRhYmxlUm93cykiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgcGF0aCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBwYXRoTGVuZ3RoKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5VHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoT1NUeXBlIHByb3BlcnR5VHlwZSkiKX0sCisgICAgeyJhc19SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfYXNfUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0Q29udHJvbFJlY3QiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAorICAgIHsiRGlzcG9zZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0Rpc3Bvc2VDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFja0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1RyYWNrQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQb2ludCBbLHRyYWNrZXJjYWxsYmFja10pIC0+IChDb250cm9sUGFydENvZGUgX3J2KSIpfSwKKyAgICB7IkhhbmRsZUNvbnRyb2xDbGljayIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFBvaW50LCBJbnRlZ2VyIG1vZGlmaWVycywgWyx0cmFja2VyY2FsbGJhY2tdKSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sRGF0YSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKHN0dWZmKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbERhdGEiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihwYXJ0LCB0eXBlKSAtPiBTdHJpbmciKX0sCisgICAgeyJTZXRDb250cm9sRGF0YV9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEYXRhX0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzT2JqKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbERhdGFfSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YV9IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHBhcnQsIHR5cGUpIC0+IFJlc09iaiIpfSwKKyAgICB7IlNldENvbnRyb2xEYXRhX0NhbGxiYWNrIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YV9DYWxsYmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoY2FsbGJhY2tmdW5jKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDdGxPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zODIzLDI4ICszODIzLDI4IEBACiAKIHN0YXRpYyBpbnQgQ3RsT2JqX2NvbXBhcmUoQ29udHJvbE9iamVjdCAqc2VsZiwgQ29udHJvbE9iamVjdCAqb3RoZXIpCiB7Ci0JdW5zaWduZWQgbG9uZyB2LCB3OworICAgIHVuc2lnbmVkIGxvbmcgdiwgdzsKIAotCWlmICghQ3RsT2JqX0NoZWNrKChQeU9iamVjdCAqKW90aGVyKSkKLQl7Ci0JCXY9KHVuc2lnbmVkIGxvbmcpc2VsZjsKLQkJdz0odW5zaWduZWQgbG9uZylvdGhlcjsKLQl9Ci0JZWxzZQotCXsKLQkJdj0odW5zaWduZWQgbG9uZylzZWxmLT5vYl9pdHNlbGY7Ci0JCXc9KHVuc2lnbmVkIGxvbmcpb3RoZXItPm9iX2l0c2VsZjsKLQl9Ci0JaWYoIHYgPCB3ICkgcmV0dXJuIC0xOwotCWlmKCB2ID4gdyApIHJldHVybiAxOwotCXJldHVybiAwOworICAgIGlmICghQ3RsT2JqX0NoZWNrKChQeU9iamVjdCAqKW90aGVyKSkKKyAgICB7CisgICAgICAgIHY9KHVuc2lnbmVkIGxvbmcpc2VsZjsKKyAgICAgICAgdz0odW5zaWduZWQgbG9uZylvdGhlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdj0odW5zaWduZWQgbG9uZylzZWxmLT5vYl9pdHNlbGY7CisgICAgICAgIHc9KHVuc2lnbmVkIGxvbmcpb3RoZXItPm9iX2l0c2VsZjsKKyAgICB9CisgICAgaWYoIHYgPCB3ICkgcmV0dXJuIC0xOworICAgIGlmKCB2ID4gdyApIHJldHVybiAxOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIEN0bE9ial9yZXByIE5VTEwKIAogc3RhdGljIGxvbmcgQ3RsT2JqX2hhc2goQ29udHJvbE9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKGxvbmcpc2VsZi0+b2JfaXRzZWxmOworICAgIHJldHVybiAobG9uZylzZWxmLT5vYl9pdHNlbGY7CiB9CiAjZGVmaW5lIEN0bE9ial90cF9pbml0IDAKIApAQCAtMzg1Miw2MSArMzg1Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ29udHJvbEhhbmRsZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIENvbnRyb2xIYW5kbGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ3RsT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ29udHJvbE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDdGxPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDb250cm9sT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIEN0bE9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDb250cm9sX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0N0bC5Db250cm9sIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ29udHJvbE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEN0bE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDdGxPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEN0bE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ3RsT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUN0bE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDdGxPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ3RsT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDdGxPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ3RsT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ3RsT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ3RsLkNvbnRyb2wiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDb250cm9sT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ3RsT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEN0bE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ3RsT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDdGxPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ3RsT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEN0bE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDdGxPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEN0bE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDdGxPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDdGxPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENvbnRyb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zOTE0LDE2MTYgKzM5MTQsMTYxNiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9OZXdDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sSGFuZGxlIF9ydjsKLQlXaW5kb3dQdHIgb3duaW5nV2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTdHIyNTUgY29udHJvbFRpdGxlOwotCUJvb2xlYW4gaW5pdGlhbGx5VmlzaWJsZTsKLQlTSW50MTYgaW5pdGlhbFZhbHVlOwotCVNJbnQxNiBtaW5pbXVtVmFsdWU7Ci0JU0ludDE2IG1heGltdW1WYWx1ZTsKLQlTSW50MTYgcHJvY0lEOwotCVNJbnQzMiBjb250cm9sUmVmZXJlbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sSGFuZGxlIF9ydjsKKyAgICBXaW5kb3dQdHIgb3duaW5nV2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBTdHIyNTUgY29udHJvbFRpdGxlOworICAgIEJvb2xlYW4gaW5pdGlhbGx5VmlzaWJsZTsKKyAgICBTSW50MTYgaW5pdGlhbFZhbHVlOworICAgIFNJbnQxNiBtaW5pbXVtVmFsdWU7CisgICAgU0ludDE2IG1heGltdW1WYWx1ZTsKKyAgICBTSW50MTYgcHJvY0lEOworICAgIFNJbnQzMiBjb250cm9sUmVmZXJlbmNlOwogI2lmbmRlZiBOZXdDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soTmV3Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiaGhoaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJm93bmluZ1dpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY29udHJvbFRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbGx5VmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb2NJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xSZWZlcmVuY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdDb250cm9sKG93bmluZ1dpbmRvdywKLQkgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgY29udHJvbFRpdGxlLAotCSAgICAgICAgICAgICAgICAgaW5pdGlhbGx5VmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgIG1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgIG1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgIHByb2NJRCwKLQkgICAgICAgICAgICAgICAgIGNvbnRyb2xSZWZlcmVuY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiaGhoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJm93bmluZ1dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY29udHJvbFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbGx5VmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xSZWZlcmVuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdDb250cm9sKG93bmluZ1dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgY29udHJvbFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGx5VmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIG1heGltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIHByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xSZWZlcmVuY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfR2V0TmV3Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbEhhbmRsZSBfcnY7Ci0JU0ludDE2IHJlc291cmNlSUQ7Ci0JV2luZG93UHRyIG93bmluZ1dpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbEhhbmRsZSBfcnY7CisgICAgU0ludDE2IHJlc291cmNlSUQ7CisgICAgV2luZG93UHRyIG93bmluZ1dpbmRvdzsKICNpZm5kZWYgR2V0TmV3Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEdldE5ld0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5ld0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmb3duaW5nV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV3Q29udHJvbChyZXNvdXJjZUlELAotCSAgICAgICAgICAgICAgICAgICAgb3duaW5nV2luZG93KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmb3duaW5nV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV3Q29udHJvbChyZXNvdXJjZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgb3duaW5nV2luZG93KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0RyYXdDb250cm9scyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIHRoZVdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIHRoZVdpbmRvdzsKICNpZm5kZWYgRHJhd0NvbnRyb2xzCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd0NvbnRyb2xzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3Q29udHJvbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCURyYXdDb250cm9scyh0aGVXaW5kb3cpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhd0NvbnRyb2xzKHRoZVdpbmRvdyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9VcGRhdGVDb250cm9scyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJnbkhhbmRsZSBpblVwZGF0ZVJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIFJnbkhhbmRsZSBpblVwZGF0ZVJlZ2lvbjsKICNpZm5kZWYgVXBkYXRlQ29udHJvbHMKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVDb250cm9scyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlQ29udHJvbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5VcGRhdGVSZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlVcGRhdGVDb250cm9scyhpbldpbmRvdywKLQkgICAgICAgICAgICAgICBpblVwZGF0ZVJlZ2lvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluVXBkYXRlUmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVXBkYXRlQ29udHJvbHMoaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgaW5VcGRhdGVSZWdpb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfRmluZENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xQYXJ0Q29kZSBfcnY7Ci0JUG9pbnQgdGVzdFBvaW50OwotCVdpbmRvd1B0ciB0aGVXaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSB0aGVDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sUGFydENvZGUgX3J2OworICAgIFBvaW50IHRlc3RQb2ludDsKKyAgICBXaW5kb3dQdHIgdGhlV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgdGhlQ29udHJvbDsKICNpZm5kZWYgRmluZENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhGaW5kQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGVzdFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZpbmRDb250cm9sKHRlc3RQb2ludCwKLQkgICAgICAgICAgICAgICAgICB0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgJnRoZUNvbnRyb2wpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCB0aGVDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmluZENvbnRyb2wodGVzdFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAmdGhlQ29udHJvbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIHRoZUNvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9JZGxlQ29udHJvbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIGluV2luZG93OwogI2lmbmRlZiBJZGxlQ29udHJvbHMKLQlQeU1hY19QUkVDSEVDSyhJZGxlQ29udHJvbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKElkbGVDb250cm9scyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlJZGxlQ29udHJvbHMoaW5XaW5kb3cpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJZGxlQ29udHJvbHMoaW5XaW5kb3cpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfR2V0Q29udHJvbEJ5SUQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xJRCBpbklEOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbElEIGluSUQ7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBHZXRDb250cm9sQnlJRAotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xCeUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQnlJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlDb250cm9sSURfQ29udmVydCwgJmluSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbEJ5SUQoaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklELAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRyb2xJRF9Db252ZXJ0LCAmaW5JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb250cm9sQnlJRChpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0R1bXBDb250cm9sSGllcmFyY2h5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlGU1NwZWMgaW5EdW1wRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgRlNTcGVjIGluRHVtcEZpbGU7CiAjaWZuZGVmIER1bXBDb250cm9sSGllcmFyY2h5Ci0JUHlNYWNfUFJFQ0hFQ0soRHVtcENvbnRyb2xIaWVyYXJjaHkpOworICAgIFB5TWFjX1BSRUNIRUNLKER1bXBDb250cm9sSGllcmFyY2h5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZpbkR1bXBGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IER1bXBDb250cm9sSGllcmFyY2h5KGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EdW1wRmlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmluRHVtcEZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHVtcENvbnRyb2xIaWVyYXJjaHkoaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkR1bXBGaWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUm9vdENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVSb290Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVJvb3RDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVSb290Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUm9vdENvbnRyb2woaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVJvb3RDb250cm9sKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9HZXRSb290Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIEdldFJvb3RDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Um9vdENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJvb3RDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRSb290Q29udHJvbChpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Um9vdENvbnRyb2woaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0dldEtleWJvYXJkRm9jdXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBHZXRLZXlib2FyZEZvY3VzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0S2V5Ym9hcmRGb2N1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0S2V5Ym9hcmRGb2N1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0S2V5Ym9hcmRGb2N1cyhpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRLZXlib2FyZEZvY3VzKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX1NldEtleWJvYXJkRm9jdXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgaW5Db250cm9sOwotCUNvbnRyb2xGb2N1c1BhcnQgaW5QYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIGluQ29udHJvbDsKKyAgICBDb250cm9sRm9jdXNQYXJ0IGluUGFydDsKICNpZm5kZWYgU2V0S2V5Ym9hcmRGb2N1cwotCVB5TWFjX1BSRUNIRUNLKFNldEtleWJvYXJkRm9jdXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEtleWJvYXJkRm9jdXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRLZXlib2FyZEZvY3VzKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0S2V5Ym9hcmRGb2N1cyhpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQWR2YW5jZUtleWJvYXJkRm9jdXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKICNpZm5kZWYgQWR2YW5jZUtleWJvYXJkRm9jdXMKLQlQeU1hY19QUkVDSEVDSyhBZHZhbmNlS2V5Ym9hcmRGb2N1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWR2YW5jZUtleWJvYXJkRm9jdXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkdmFuY2VLZXlib2FyZEZvY3VzKGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWR2YW5jZUtleWJvYXJkRm9jdXMoaW5XaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9SZXZlcnNlS2V5Ym9hcmRGb2N1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OwogI2lmbmRlZiBSZXZlcnNlS2V5Ym9hcmRGb2N1cwotCVB5TWFjX1BSRUNIRUNLKFJldmVyc2VLZXlib2FyZEZvY3VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXZlcnNlS2V5Ym9hcmRGb2N1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV2ZXJzZUtleWJvYXJkRm9jdXMoaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXZlcnNlS2V5Ym9hcmRGb2N1cyhpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NsZWFyS2V5Ym9hcmRGb2N1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OwogI2lmbmRlZiBDbGVhcktleWJvYXJkRm9jdXMKLQlQeU1hY19QUkVDSEVDSyhDbGVhcktleWJvYXJkRm9jdXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENsZWFyS2V5Ym9hcmRGb2N1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xlYXJLZXlib2FyZEZvY3VzKGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2xlYXJLZXlib2FyZEZvY3VzKGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUJvb2xlYW4gaW5UcmFja3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIEJvb2xlYW4gaW5UcmFja3M7CiAjaWZuZGVmIFNldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRyYWNrcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyhpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRyYWNrcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyhpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9Jc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlCb29sZWFuIG91dFRyYWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQm9vbGVhbiBvdXRUcmFja3M7CiAjaWZuZGVmIElzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFRyYWNrcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IElzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3coaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRyYWNrcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VHJhY2tzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCVVJbnQxNiB0aGlja25lc3M7Ci0JVUludDE2IGJlaGF2aW9yOwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbmZvOwotCVNJbnQxNiBtZW51SUQ7Ci0JVUludDE2IG1lbnVCZWhhdmlvcjsKLQlVSW50MTYgbWVudVBsYWNlbWVudDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgVUludDE2IHRoaWNrbmVzczsKKyAgICBVSW50MTYgYmVoYXZpb3I7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm87CisgICAgU0ludDE2IG1lbnVJRDsKKyAgICBVSW50MTYgbWVudUJlaGF2aW9yOworICAgIFVJbnQxNiBtZW51UGxhY2VtZW50OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mSEhPJmhISCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhpY2tuZXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmVoYXZpb3IsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVCZWhhdmlvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVQbGFjZW1lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUJlaGF2aW9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudVBsYWNlbWVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mSEhPJmhISCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhpY2tuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmVoYXZpb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVCZWhhdmlvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVQbGFjZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUJlaGF2aW9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudVBsYWNlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVNsaWRlckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCVVJbnQxNiBvcmllbnRhdGlvbjsKLQlVSW50MTYgbnVtVGlja01hcmtzOwotCUJvb2xlYW4gbGl2ZVRyYWNraW5nOwotCVB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jOwotCVVuaXZlcnNhbFByb2NQdHIgY19jYWxsYmFjazsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDMyIHZhbHVlOworICAgIFNJbnQzMiBtaW5pbXVtOworICAgIFNJbnQzMiBtYXhpbXVtOworICAgIFVJbnQxNiBvcmllbnRhdGlvbjsKKyAgICBVSW50MTYgbnVtVGlja01hcmtzOworICAgIEJvb2xlYW4gbGl2ZVRyYWNraW5nOworICAgIFB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jOworICAgIFVuaXZlcnNhbFByb2NQdHIgY19jYWxsYmFjazsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVNsaWRlckNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVTbGlkZXJDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVTbGlkZXJDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxISGJPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9yaWVudGF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtVGlja01hcmtzLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nUHJvYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTbGlkZXJDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGlja01hcmtzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVUcmFja2luZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBteWFjdGlvbnByb2NfdXBwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0Jc2V0Y2FsbGJhY2soX3Jlcywga015Q29udHJvbEFjdGlvblByb2NUYWcsIGxpdmVUcmFja2luZ1Byb2MsICZjX2NhbGxiYWNrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsSEhiTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bVRpY2tNYXJrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZ1Byb2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU2xpZGVyQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRpY2tNYXJrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlVHJhY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlhY3Rpb25wcm9jX3VwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHNldGNhbGxiYWNrKF9yZXMsIGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnLCBsaXZlVHJhY2tpbmdQcm9jLCAmY19jYWxsYmFjayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJlY3QgaW5Cb3VuZHNSZWN0OwotCVVJbnQxNiBpbk9yaWVudGF0aW9uOwotCUNGU3RyaW5nUmVmIGluVGl0bGU7Ci0JU0ludDMyIGluSW5pdGlhbFZhbHVlOwotCUJvb2xlYW4gaW5EcmF3VGl0bGU7Ci0JQm9vbGVhbiBpbkF1dG9Ub2dnbGVzOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUmVjdCBpbkJvdW5kc1JlY3Q7CisgICAgVUludDE2IGluT3JpZW50YXRpb247CisgICAgQ0ZTdHJpbmdSZWYgaW5UaXRsZTsKKyAgICBTSW50MzIgaW5Jbml0aWFsVmFsdWU7CisgICAgQm9vbGVhbiBpbkRyYXdUaXRsZTsKKyAgICBCb29sZWFuIGluQXV0b1RvZ2dsZXM7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVEaXNjbG9zdXJlVHJpYW5nbGVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSE8mbGJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jbml0aWFsVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdUaXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQXV0b1RvZ2dsZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbChpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRyYXdUaXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF1dG9Ub2dnbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJkhPJmxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5UaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EcmF3VGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF1dG9Ub2dnbGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2woaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EcmF3VGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdXRvVG9nZ2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQcm9ncmVzc0JhckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCUJvb2xlYW4gaW5kZXRlcm1pbmF0ZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDMyIHZhbHVlOworICAgIFNJbnQzMiBtaW5pbXVtOworICAgIFNJbnQzMiBtYXhpbXVtOworICAgIEJvb2xlYW4gaW5kZXRlcm1pbmF0ZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVByb2dyZXNzQmFyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVByb2dyZXNzQmFyQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV0ZXJtaW5hdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV0ZXJtaW5hdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVSZWxldmFuY2VCYXJDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVNJbnQzMiB2YWx1ZTsKLQlTSW50MzIgbWluaW11bTsKLQlTSW50MzIgbWF4aW11bTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDMyIHZhbHVlOworICAgIFNJbnQzMiBtaW5pbXVtOworICAgIFNJbnQzMiBtYXhpbXVtOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCVNJbnQzMiBpbmNyZW1lbnQ7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFNJbnQzMiB2YWx1ZTsKKyAgICBTSW50MzIgbWluaW11bTsKKyAgICBTSW50MzIgbWF4aW11bTsKKyAgICBTSW50MzIgaW5jcmVtZW50OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5jcmVtZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmNyZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVTZXBhcmF0b3JDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVNlcGFyYXRvckNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVTZXBhcmF0b3JDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVTZXBhcmF0b3JDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlU2VwYXJhdG9yQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVNlcGFyYXRvckNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUdyb3VwQm94Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0aXRsZTsKLQlCb29sZWFuIHByaW1hcnk7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENGU3RyaW5nUmVmIHRpdGxlOworICAgIEJvb2xlYW4gcHJpbWFyeTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZUdyb3VwQm94Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUdyb3VwQm94Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlR3JvdXBCb3hDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByaW1hcnkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlR3JvdXBCb3hDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUdyb3VwQm94Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUNoZWNrR3JvdXBCb3hDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCVNJbnQzMiBpbml0aWFsVmFsdWU7Ci0JQm9vbGVhbiBwcmltYXJ5OwotCUJvb2xlYW4gYXV0b1RvZ2dsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgU0ludDMyIGluaXRpYWxWYWx1ZTsKKyAgICBCb29sZWFuIHByaW1hcnk7CisgICAgQm9vbGVhbiBhdXRvVG9nZ2xlOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1RvZ2dsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvVG9nZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dG9Ub2dnbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RvZ2dsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGl0bGU7Ci0JQm9vbGVhbiBwcmltYXJ5OwotCVNJbnQxNiBtZW51SUQ7Ci0JQm9vbGVhbiB2YXJpYWJsZVdpZHRoOwotCVNJbnQxNiB0aXRsZVdpZHRoOwotCVNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb247Ci0JU3R5bGUgdGl0bGVTdHlsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgQm9vbGVhbiBwcmltYXJ5OworICAgIFNJbnQxNiBtZW51SUQ7CisgICAgQm9vbGVhbiB2YXJpYWJsZVdpZHRoOworICAgIFNJbnQxNiB0aXRsZVdpZHRoOworICAgIFNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb247CisgICAgU3R5bGUgdGl0bGVTdHlsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmJoYmhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJpbWFyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGl0bGVKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGl0bGVTdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVQb3B1cEdyb3VwQm94Q29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYmhiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZUp1c3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbzsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm87CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVJbWFnZVdlbGxDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVJbWFnZVdlbGxDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUltYWdlV2VsbENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVVJbnQxNiBvcmllbnRhdGlvbjsKLQlVSW50MTYgc2l6ZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgVUludDE2IG9yaWVudGF0aW9uOworICAgIFVJbnQxNiBzaXplOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQb3B1cEFycm93Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJkhIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVBvcHVwQXJyb3dDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZISCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVQb3B1cEFycm93Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUGxhY2FyZENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUGxhY2FyZENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQbGFjYXJkQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUGxhY2FyZENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVQbGFjYXJkQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUGxhY2FyZENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlQ2xvY2tDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVVJbnQxNiBjbG9ja1R5cGU7Ci0JVUludDMyIGNsb2NrRmxhZ3M7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFVJbnQxNiBjbG9ja1R5cGU7CisgICAgVUludDMyIGNsb2NrRmxhZ3M7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVDbG9ja0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVDbG9ja0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUNsb2NrQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZjbG9ja1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZjbG9ja0ZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUNsb2NrQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZIbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlQ2xvY2tDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVVzZXJQYW5lQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlVSW50MzIgZmVhdHVyZXM7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFVJbnQzMiBmZWF0dXJlczsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVVzZXJQYW5lQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVVzZXJQYW5lQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlVXNlclBhbmVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlVXNlclBhbmVDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlVXNlclBhbmVDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVFZGl0VGV4dENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGV4dDsKLQlCb29sZWFuIGlzUGFzc3dvcmQ7Ci0JQm9vbGVhbiB1c2VJbmxpbmVJbnB1dDsKLQlDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0ZXh0OworICAgIEJvb2xlYW4gaXNQYXNzd29yZDsKKyAgICBCb29sZWFuIHVzZUlubGluZUlucHV0OworICAgIENvbnRyb2xGb250U3R5bGVSZWMgc3R5bGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVFZGl0VGV4dENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVFZGl0VGV4dENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUVkaXRUZXh0Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzUGFzc3dvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VJbmxpbmVJbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmc3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlRWRpdFRleHRDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFzc3dvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VJbmxpbmVJbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYmJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlSW5saW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJnN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUVkaXRUZXh0Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSW5saW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVTdGF0aWNUZXh0Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0ZXh0OwotCUNvbnRyb2xGb250U3R5bGVSZWMgc3R5bGU7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENGU3RyaW5nUmVmIHRleHQ7CisgICAgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVN0YXRpY1RleHRDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVN0YXRpY1RleHRDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmc3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmc3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQaWN0dXJlQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gY29udGVudDsKLQlCb29sZWFuIGRvbnRUcmFjazsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGNvbnRlbnQ7CisgICAgQm9vbGVhbiBkb250VHJhY2s7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVQaWN0dXJlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVBpY3R1cmVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVQaWN0dXJlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmNvbnRlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkb250VHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUGljdHVyZUNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkb250VHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUGljdHVyZUNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlSWNvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJlY3QgaW5Cb3VuZHNSZWN0OwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkljb25Db250ZW50OwotCUJvb2xlYW4gaW5Eb250VHJhY2s7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBSZWN0IGluQm91bmRzUmVjdDsKKyAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5JY29uQ29udGVudDsKKyAgICBCb29sZWFuIGluRG9udFRyYWNrOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlSWNvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVJY29uQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlSWNvbkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5JY29uQ29udGVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRG9udFRyYWNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUljb25Db250cm9sKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JY29uQ29udGVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5Eb250VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5JY29uQ29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRG9udFRyYWNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUljb25Db250cm9sKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JY29uQ29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Eb250VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVdpbmRvd0hlYWRlckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQm9vbGVhbiBpc0xpc3RIZWFkZXI7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIEJvb2xlYW4gaXNMaXN0SGVhZGVyOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVdpbmRvd0hlYWRlckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVdpbmRvd0hlYWRlckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0xpc3RIZWFkZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMaXN0SGVhZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0xpc3RIZWFkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMaXN0SGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVB1c2hCdXR0b25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVB1c2hCdXR0b25Db250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVB1c2hCdXR0b25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVB1c2hCdXR0b25Db250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVB1c2hCdXR0b25Db250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpY29uOwotCVVJbnQxNiBpY29uQWxpZ25tZW50OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaWNvbjsKKyAgICBVSW50MTYgaWNvbkFsaWdubWVudDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmljb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uQWxpZ25tZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25BbGlnbm1lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkFsaWdubWVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0aXRsZTsKLQlTSW50MzIgaW5pdGlhbFZhbHVlOwotCUJvb2xlYW4gYXV0b1RvZ2dsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgU0ludDMyIGluaXRpYWxWYWx1ZTsKKyAgICBCb29sZWFuIGF1dG9Ub2dnbGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1RvZ2dsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Ub2dnbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRvVG9nZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RvZ2dsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUNoZWNrQm94Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0aXRsZTsKLQlTSW50MzIgaW5pdGlhbFZhbHVlOwotCUJvb2xlYW4gYXV0b1RvZ2dsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgU0ludDMyIGluaXRpYWxWYWx1ZTsKKyAgICBCb29sZWFuIGF1dG9Ub2dnbGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVDaGVja0JveENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVDaGVja0JveENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUNoZWNrQm94Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1RvZ2dsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVDaGVja0JveENvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Ub2dnbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRvVG9nZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUNoZWNrQm94Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RvZ2dsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCVNJbnQzMiB2aWV3U2l6ZTsKLQlCb29sZWFuIGxpdmVUcmFja2luZzsKLQlQeU9iamVjdCogbGl2ZVRyYWNraW5nUHJvYzsKLQlVbml2ZXJzYWxQcm9jUHRyIGNfY2FsbGJhY2s7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFNJbnQzMiB2YWx1ZTsKKyAgICBTSW50MzIgbWluaW11bTsKKyAgICBTSW50MzIgbWF4aW11bTsKKyAgICBTSW50MzIgdmlld1NpemU7CisgICAgQm9vbGVhbiBsaXZlVHJhY2tpbmc7CisgICAgUHlPYmplY3QqIGxpdmVUcmFja2luZ1Byb2M7CisgICAgVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVNjcm9sbEJhckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVNjcm9sbEJhckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbGxiTyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZ2aWV3U2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZ1Byb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVUcmFja2luZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteWFjdGlvbnByb2NfdXBwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0Jc2V0Y2FsbGJhY2soX3Jlcywga015Q29udHJvbEFjdGlvblByb2NUYWcsIGxpdmVUcmFja2luZ1Byb2MsICZjX2NhbGxiYWNrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsbGJPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpZXdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nUHJvYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTY3JvbGxCYXJDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZVRyYWNraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15YWN0aW9ucHJvY191cHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICBzZXRjYWxsYmFjayhfcmVzLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgbGl2ZVRyYWNraW5nUHJvYywgJmNfY2FsbGJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGl0bGU7Ci0JU0ludDE2IG1lbnVJRDsKLQlCb29sZWFuIHZhcmlhYmxlV2lkdGg7Ci0JU0ludDE2IHRpdGxlV2lkdGg7Ci0JU0ludDE2IHRpdGxlSnVzdGlmaWNhdGlvbjsKLQlTdHlsZSB0aXRsZVN0eWxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBTSW50MTYgbWVudUlEOworICAgIEJvb2xlYW4gdmFyaWFibGVXaWR0aDsKKyAgICBTSW50MTYgdGl0bGVXaWR0aDsKKyAgICBTSW50MTYgdGl0bGVKdXN0aWZpY2F0aW9uOworICAgIFN0eWxlIHRpdGxlU3R5bGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoYmhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZUp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoYmhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZUp1c3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUp1c3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVSYWRpb0dyb3VwQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVSYWRpb0dyb3VwQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDE2IGNvbnRlbnRSZXNJRDsKLQlCb29sZWFuIGF1dG9TY3JvbGw7Ci0JVUludDMyIGRlbGF5QmVmb3JlQXV0b1Njcm9sbDsKLQlVSW50MzIgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbDsKLQlVSW50MTYgYXV0b1Njcm9sbEFtb3VudDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDE2IGNvbnRlbnRSZXNJRDsKKyAgICBCb29sZWFuIGF1dG9TY3JvbGw7CisgICAgVUludDMyIGRlbGF5QmVmb3JlQXV0b1Njcm9sbDsKKyAgICBVSW50MzIgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbDsKKyAgICBVSW50MTYgYXV0b1Njcm9sbEFtb3VudDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoYmxsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRSZXNJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF1dG9TY3JvbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWxheUJlZm9yZUF1dG9TY3JvbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWxheUJldHdlZW5BdXRvU2Nyb2xsLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1Njcm9sbEFtb3VudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9TY3JvbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5QmVmb3JlQXV0b1Njcm9sbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1Njcm9sbEFtb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGJsbEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50UmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRvU2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsYXlCZWZvcmVBdXRvU2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dG9TY3JvbGxBbW91bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheUJlZm9yZUF1dG9TY3JvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5QmV0d2VlbkF1dG9TY3JvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9TY3JvbGxBbW91bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlSZWN0IGluQm91bmRzUmVjdDsKLQlTSW50MzIgaW5WYWx1ZTsKLQlCb29sZWFuIGluQXV0b1RvZ2dsZXM7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBSZWN0IGluQm91bmRzUmVjdDsKKyAgICBTSW50MzIgaW5WYWx1ZTsKKyAgICBCb29sZWFuIGluQXV0b1RvZ2dsZXM7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQXV0b1RvZ2dsZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2woaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXV0b1RvZ2dsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF1dG9Ub2dnbGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF1dG9Ub2dnbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJlY3QgaW5Cb3VuZHNSZWN0OwotCVNJbnQxNiBpblNpemU7Ci0JQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIFJlY3QgaW5Cb3VuZHNSZWN0OworICAgIFNJbnQxNiBpblNpemU7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUm91bmRCdXR0b25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmluQ29udGVudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2woaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udGVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5Db250ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbChpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCU9TVHlwZSBzdHlsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgT1NUeXBlIHN0eWxlOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzdHlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGV4dDsKLQlCb29sZWFuIGlzUGFzc3dvcmQ7Ci0JQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGV4dDsKKyAgICBCb29sZWFuIGlzUGFzc3dvcmQ7CisgICAgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc1Bhc3N3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZzdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFzc3dvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJnN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfRmluZENvbnRyb2xVbmRlck1vdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sSGFuZGxlIF9ydjsKLQlQb2ludCBpbldoZXJlOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlTSW50MTYgb3V0UGFydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbEhhbmRsZSBfcnY7CisgICAgUG9pbnQgaW5XaGVyZTsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgU0ludDE2IG91dFBhcnQ7CiAjaWZuZGVmIEZpbmRDb250cm9sVW5kZXJNb3VzZQotCVB5TWFjX1BSRUNIRUNLKEZpbmRDb250cm9sVW5kZXJNb3VzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZENvbnRyb2xVbmRlck1vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluV2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaW5kQ29udHJvbFVuZGVyTW91c2UoaW5XaGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQYXJ0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UGFydCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5XaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZpbmRDb250cm9sVW5kZXJNb3VzZShpbldoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQYXJ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfYXNfQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbEhhbmRsZSBfcnY7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xIYW5kbGUgX3J2OworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBhc19Db250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soYXNfQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soYXNfQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX0NvbnRyb2woaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfQ29udHJvbChoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVRhYnNDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVVJbnQxNiBzaXplOwotCVVJbnQxNiBkaXJlY3Rpb247Ci0JaW50IGk7Ci0JVUludDE2IG51bVRhYnM7Ci0JQ29udHJvbFRhYkVudHJ5IHRhYkFycmF5W01BWFRBQlNdOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKLQlQeU9iamVjdCAqdGFiQXJyYXlPYmosICp0YWJFbnRyeTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBVSW50MTYgc2l6ZTsKKyAgICBVSW50MTYgZGlyZWN0aW9uOworICAgIGludCBpOworICAgIFVJbnQxNiBudW1UYWJzOworICAgIENvbnRyb2xUYWJFbnRyeSB0YWJBcnJheVtNQVhUQUJTXTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKnRhYkFycmF5T2JqLCAqdGFiRW50cnk7CiAKICNpZm5kZWYgQ3JlYXRlVGFic0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVUYWJzQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlVGFic0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJkhITyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0YWJBcnJheU9iaikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSEhPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYkFycmF5T2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gUHlTZXF1ZW5jZV9MZW5ndGgodGFiQXJyYXlPYmopOwotCWlmIChpID09IC0xKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKGkgPiBNQVhUQUJTKSB7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ3RsX0Vycm9yLCAiVG9vIG1hbnkgdGFicyIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCW51bVRhYnMgPSBpOwotCWZvciAoaT0wOyBpPG51bVRhYnM7IGkrKykgewotCSAgICAgICAgdGFiRW50cnkgPSBQeVNlcXVlbmNlX0dldEl0ZW0odGFiQXJyYXlPYmosIGkpOwotCSAgICAgICAgaWYgKHRhYkVudHJ5ID09IE5VTEwpCi0JICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh0YWJFbnRyeSwgIihPJk8mQikiLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJnRhYkFycmF5W2ldLmljb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0YWJBcnJheVtpXS5uYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdGFiQXJyYXlbaV0uZW5hYmxlZAotCSAgICAgICAgICAgICAgICAgICAgICAgICApKQotCSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQl9CisgICAgaSA9IFB5U2VxdWVuY2VfTGVuZ3RoKHRhYkFycmF5T2JqKTsKKyAgICBpZiAoaSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGkgPiBNQVhUQUJTKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJUb28gbWFueSB0YWJzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBudW1UYWJzID0gaTsKKyAgICBmb3IgKGk9MDsgaTxudW1UYWJzOyBpKyspIHsKKyAgICAgICAgdGFiRW50cnkgPSBQeVNlcXVlbmNlX0dldEl0ZW0odGFiQXJyYXlPYmosIGkpOworICAgICAgICBpZiAodGFiRW50cnkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHRhYkVudHJ5LCAiKE8mTyZCKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZ0YWJBcnJheVtpXS5pY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0YWJBcnJheVtpXS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJBcnJheVtpXS5lbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCV9lcnIgPSBDcmVhdGVUYWJzQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRhYnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkFycmF5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIF9lcnIgPSBDcmVhdGVUYWJzQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRhYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ3RsX21ldGhvZHNbXSA9IHsKLQl7Ik5ld0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX05ld0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBvd25pbmdXaW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU3RyMjU1IGNvbnRyb2xUaXRsZSwgQm9vbGVhbiBpbml0aWFsbHlWaXNpYmxlLCBTSW50MTYgaW5pdGlhbFZhbHVlLCBTSW50MTYgbWluaW11bVZhbHVlLCBTSW50MTYgbWF4aW11bVZhbHVlLCBTSW50MTYgcHJvY0lELCBTSW50MzIgY29udHJvbFJlZmVyZW5jZSkgLT4gKENvbnRyb2xIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE5ld0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldE5ld0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiByZXNvdXJjZUlELCBXaW5kb3dQdHIgb3duaW5nV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiRHJhd0NvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9EcmF3Q29udHJvbHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB0aGVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVDb250cm9scyIsIChQeUNGdW5jdGlvbilDdGxfVXBkYXRlQ29udHJvbHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmduSGFuZGxlIGluVXBkYXRlUmVnaW9uKSAtPiBOb25lIil9LAotCXsiRmluZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0ZpbmRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0ZXN0UG9pbnQsIFdpbmRvd1B0ciB0aGVXaW5kb3cpIC0+IChDb250cm9sUGFydENvZGUgX3J2LCBDb250cm9sSGFuZGxlIHRoZUNvbnRyb2wpIil9LAotCXsiSWRsZUNvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9JZGxlQ29udHJvbHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xCeUlEIiwgKFB5Q0Z1bmN0aW9uKUN0bF9HZXRDb250cm9sQnlJRCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSUQgaW5JRCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJEdW1wQ29udHJvbEhpZXJhcmNoeSIsIChQeUNGdW5jdGlvbilDdGxfRHVtcENvbnRyb2xIaWVyYXJjaHksIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgRlNTcGVjIGluRHVtcEZpbGUpIC0+IE5vbmUiKX0sCi0JeyJDcmVhdGVSb290Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUm9vdENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJHZXRSb290Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfR2V0Um9vdENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJHZXRLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9HZXRLZXlib2FyZEZvY3VzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiU2V0S2V5Ym9hcmRGb2N1cyIsIChQeUNGdW5jdGlvbilDdGxfU2V0S2V5Ym9hcmRGb2N1cywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSGFuZGxlIGluQ29udHJvbCwgQ29udHJvbEZvY3VzUGFydCBpblBhcnQpIC0+IE5vbmUiKX0sCi0JeyJBZHZhbmNlS2V5Ym9hcmRGb2N1cyIsIChQeUNGdW5jdGlvbilDdGxfQWR2YW5jZUtleWJvYXJkRm9jdXMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlJldmVyc2VLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9SZXZlcnNlS2V5Ym9hcmRGb2N1cywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiQ2xlYXJLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DbGVhcktleWJvYXJkRm9jdXMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlNldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUN0bF9TZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBCb29sZWFuIGluVHJhY2tzKSAtPiBOb25lIil9LAotCXsiSXNBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDdGxfSXNBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQm9vbGVhbiBvdXRUcmFja3MpIil9LAotCXsiQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFVJbnQxNiB0aGlja25lc3MsIFVJbnQxNiBiZWhhdmlvciwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm8sIFNJbnQxNiBtZW51SUQsIFVJbnQxNiBtZW51QmVoYXZpb3IsIFVJbnQxNiBtZW51UGxhY2VtZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVNsaWRlckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNsaWRlckNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0sIFVJbnQxNiBvcmllbnRhdGlvbiwgVUludDE2IG51bVRpY2tNYXJrcywgQm9vbGVhbiBsaXZlVHJhY2tpbmcsIFB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIFVJbnQxNiBpbk9yaWVudGF0aW9uLCBDRlN0cmluZ1JlZiBpblRpdGxlLCBTSW50MzIgaW5Jbml0aWFsVmFsdWUsIEJvb2xlYW4gaW5EcmF3VGl0bGUsIEJvb2xlYW4gaW5BdXRvVG9nZ2xlcykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQcm9ncmVzc0JhckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVByb2dyZXNzQmFyQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSwgQm9vbGVhbiBpbmRldGVybWluYXRlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0pIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSwgU0ludDMyIGluY3JlbWVudCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlQ2hhc2luZ0Fycm93c0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTZXBhcmF0b3JDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTZXBhcmF0b3JDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlR3JvdXBCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVHcm91cEJveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIEJvb2xlYW4gcHJpbWFyeSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFNJbnQzMiBpbml0aWFsVmFsdWUsIEJvb2xlYW4gcHJpbWFyeSwgQm9vbGVhbiBhdXRvVG9nZ2xlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQb3B1cEdyb3VwQm94Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgQm9vbGVhbiBwcmltYXJ5LCBTSW50MTYgbWVudUlELCBCb29sZWFuIHZhcmlhYmxlV2lkdGgsIFNJbnQxNiB0aXRsZVdpZHRoLCBTSW50MTYgdGl0bGVKdXN0aWZpY2F0aW9uLCBTdHlsZSB0aXRsZVN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUltYWdlV2VsbENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUltYWdlV2VsbENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm8pIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFVJbnQxNiBvcmllbnRhdGlvbiwgVUludDE2IHNpemUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUGxhY2FyZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBsYWNhcmRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlQ2xvY2tDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDbG9ja0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDE2IGNsb2NrVHlwZSwgVUludDMyIGNsb2NrRmxhZ3MpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlVXNlclBhbmVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVVc2VyUGFuZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDMyIGZlYXR1cmVzKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUVkaXRUZXh0Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRWRpdFRleHRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRleHQsIEJvb2xlYW4gaXNQYXNzd29yZCwgQm9vbGVhbiB1c2VJbmxpbmVJbnB1dCwgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTdGF0aWNUZXh0Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGV4dCwgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQaWN0dXJlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUGljdHVyZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGNvbnRlbnQsIEJvb2xlYW4gZG9udFRyYWNrKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUljb25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVJY29uQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZWN0IGluQm91bmRzUmVjdCwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluSWNvbkNvbnRlbnQsIEJvb2xlYW4gaW5Eb250VHJhY2spIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBCb29sZWFuIGlzTGlzdEhlYWRlcikgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQdXNoQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUHVzaEJ1dHRvbldpdGhJY29uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUHVzaEJ1dHRvbldpdGhJY29uQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGljb24sIFVJbnQxNiBpY29uQWxpZ25tZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUmFkaW9CdXR0b25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBTSW50MzIgaW5pdGlhbFZhbHVlLCBCb29sZWFuIGF1dG9Ub2dnbGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlQ2hlY2tCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDaGVja0JveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFNJbnQzMiBpbml0aWFsVmFsdWUsIEJvb2xlYW4gYXV0b1RvZ2dsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTY3JvbGxCYXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTY3JvbGxCYXJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBTSW50MzIgdmlld1NpemUsIEJvb2xlYW4gbGl2ZVRyYWNraW5nLCBQeU9iamVjdCogbGl2ZVRyYWNraW5nUHJvYykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDE2IG1lbnVJRCwgQm9vbGVhbiB2YXJpYWJsZVdpZHRoLCBTSW50MTYgdGl0bGVXaWR0aCwgU0ludDE2IHRpdGxlSnVzdGlmaWNhdGlvbiwgU3R5bGUgdGl0bGVTdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVSYWRpb0dyb3VwQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDE2IGNvbnRlbnRSZXNJRCwgQm9vbGVhbiBhdXRvU2Nyb2xsLCBVSW50MzIgZGVsYXlCZWZvcmVBdXRvU2Nyb2xsLCBVSW50MzIgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbCwgVUludDE2IGF1dG9TY3JvbGxBbW91bnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJlY3QgaW5Cb3VuZHNSZWN0LCBTSW50MzIgaW5WYWx1ZSwgQm9vbGVhbiBpbkF1dG9Ub2dnbGVzKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUm91bmRCdXR0b25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJlY3QgaW5Cb3VuZHNSZWN0LCBTSW50MTYgaW5TaXplLCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZURhdGFCcm93c2VyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIE9TVHlwZSBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRleHQsIEJvb2xlYW4gaXNQYXNzd29yZCwgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJGaW5kQ29udHJvbFVuZGVyTW91c2UiLCAoUHlDRnVuY3Rpb24pQ3RsX0ZpbmRDb250cm9sVW5kZXJNb3VzZSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgaW5XaGVyZSwgV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBfcnYsIFNJbnQxNiBvdXRQYXJ0KSIpfSwKLQl7ImFzX0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX2FzX0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiQ3JlYXRlVGFic0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVRhYnNDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFVJbnQxNiBzaXplLCBVSW50MTYgZGlyZWN0aW9uLCBDb250cm9sVGFiRW50cnkgdGFiQXJyYXkpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTmV3Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfTmV3Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIG93bmluZ1dpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgY29udHJvbFRpdGxlLCBCb29sZWFuIGluaXRpYWxseVZpc2libGUsIFNJbnQxNiBpbml0aWFsVmFsdWUsIFNJbnQxNiBtaW5pbXVtVmFsdWUsIFNJbnQxNiBtYXhpbXVtVmFsdWUsIFNJbnQxNiBwcm9jSUQsIFNJbnQzMiBjb250cm9sUmVmZXJlbmNlKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TmV3Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfR2V0TmV3Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHJlc291cmNlSUQsIFdpbmRvd1B0ciBvd25pbmdXaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIF9ydikiKX0sCisgICAgeyJEcmF3Q29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsX0RyYXdDb250cm9scywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHRoZVdpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IlVwZGF0ZUNvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9VcGRhdGVDb250cm9scywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZ25IYW5kbGUgaW5VcGRhdGVSZWdpb24pIC0+IE5vbmUiKX0sCisgICAgeyJGaW5kQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfRmluZENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQb2ludCwgV2luZG93UHRyIHRoZVdpbmRvdykgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYsIENvbnRyb2xIYW5kbGUgdGhlQ29udHJvbCkiKX0sCisgICAgeyJJZGxlQ29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsX0lkbGVDb250cm9scywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbEJ5SUQiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldENvbnRyb2xCeUlELCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xJRCBpbklEKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkR1bXBDb250cm9sSGllcmFyY2h5IiwgKFB5Q0Z1bmN0aW9uKUN0bF9EdW1wQ29udHJvbEhpZXJhcmNoeSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBGU1NwZWMgaW5EdW1wRmlsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNyZWF0ZVJvb3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSb290Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkdldFJvb3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9HZXRSb290Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkdldEtleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldEtleWJvYXJkRm9jdXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJTZXRLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9TZXRLZXlib2FyZEZvY3VzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xIYW5kbGUgaW5Db250cm9sLCBDb250cm9sRm9jdXNQYXJ0IGluUGFydCkgLT4gTm9uZSIpfSwKKyAgICB7IkFkdmFuY2VLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9BZHZhbmNlS2V5Ym9hcmRGb2N1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiUmV2ZXJzZUtleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX1JldmVyc2VLZXlib2FyZEZvY3VzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJDbGVhcktleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX0NsZWFyS2V5Ym9hcmRGb2N1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ3RsX1NldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIEJvb2xlYW4gaW5UcmFja3MpIC0+IE5vbmUiKX0sCisgICAgeyJJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUN0bF9Jc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChCb29sZWFuIG91dFRyYWNrcykiKX0sCisgICAgeyJDcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgVUludDE2IHRoaWNrbmVzcywgVUludDE2IGJlaGF2aW9yLCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbywgU0ludDE2IG1lbnVJRCwgVUludDE2IG1lbnVCZWhhdmlvciwgVUludDE2IG1lbnVQbGFjZW1lbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlU2xpZGVyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU2xpZGVyQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSwgVUludDE2IG9yaWVudGF0aW9uLCBVSW50MTYgbnVtVGlja01hcmtzLCBCb29sZWFuIGxpdmVUcmFja2luZywgUHlPYmplY3QqIGxpdmVUcmFja2luZ1Byb2MpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZWN0IGluQm91bmRzUmVjdCwgVUludDE2IGluT3JpZW50YXRpb24sIENGU3RyaW5nUmVmIGluVGl0bGUsIFNJbnQzMiBpbkluaXRpYWxWYWx1ZSwgQm9vbGVhbiBpbkRyYXdUaXRsZSwgQm9vbGVhbiBpbkF1dG9Ub2dnbGVzKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVByb2dyZXNzQmFyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBCb29sZWFuIGluZGV0ZXJtaW5hdGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBTSW50MzIgaW5jcmVtZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVNlcGFyYXRvckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNlcGFyYXRvckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVHcm91cEJveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUdyb3VwQm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgQm9vbGVhbiBwcmltYXJ5KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUNoZWNrR3JvdXBCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDMyIGluaXRpYWxWYWx1ZSwgQm9vbGVhbiBwcmltYXJ5LCBCb29sZWFuIGF1dG9Ub2dnbGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBCb29sZWFuIHByaW1hcnksIFNJbnQxNiBtZW51SUQsIEJvb2xlYW4gdmFyaWFibGVXaWR0aCwgU0ludDE2IHRpdGxlV2lkdGgsIFNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb24sIFN0eWxlIHRpdGxlU3R5bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVQb3B1cEFycm93Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDE2IG9yaWVudGF0aW9uLCBVSW50MTYgc2l6ZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVQbGFjYXJkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUGxhY2FyZENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVDbG9ja0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUNsb2NrQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBVSW50MTYgY2xvY2tUeXBlLCBVSW50MzIgY2xvY2tGbGFncykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVVc2VyUGFuZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVVzZXJQYW5lQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBVSW50MzIgZmVhdHVyZXMpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlRWRpdFRleHRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVFZGl0VGV4dENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGV4dCwgQm9vbGVhbiBpc1Bhc3N3b3JkLCBCb29sZWFuIHVzZUlubGluZUlucHV0LCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVN0YXRpY1RleHRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTdGF0aWNUZXh0Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0ZXh0LCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVBpY3R1cmVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQaWN0dXJlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gY29udGVudCwgQm9vbGVhbiBkb250VHJhY2spIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlSWNvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUljb25Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJlY3QgaW5Cb3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5JY29uQ29udGVudCwgQm9vbGVhbiBpbkRvbnRUcmFjaykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVXaW5kb3dIZWFkZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVXaW5kb3dIZWFkZXJDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIEJvb2xlYW4gaXNMaXN0SGVhZGVyKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVB1c2hCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQdXNoQnV0dG9uQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaWNvbiwgVUludDE2IGljb25BbGlnbm1lbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUmFkaW9CdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFNJbnQzMiBpbml0aWFsVmFsdWUsIEJvb2xlYW4gYXV0b1RvZ2dsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVDaGVja0JveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUNoZWNrQm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDMyIGluaXRpYWxWYWx1ZSwgQm9vbGVhbiBhdXRvVG9nZ2xlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVNjcm9sbEJhckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0sIFNJbnQzMiB2aWV3U2l6ZSwgQm9vbGVhbiBsaXZlVHJhY2tpbmcsIFB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBTSW50MTYgbWVudUlELCBCb29sZWFuIHZhcmlhYmxlV2lkdGgsIFNJbnQxNiB0aXRsZVdpZHRoLCBTSW50MTYgdGl0bGVKdXN0aWZpY2F0aW9uLCBTdHlsZSB0aXRsZVN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVJhZGlvR3JvdXBDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSYWRpb0dyb3VwQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MTYgY29udGVudFJlc0lELCBCb29sZWFuIGF1dG9TY3JvbGwsIFVJbnQzMiBkZWxheUJlZm9yZUF1dG9TY3JvbGwsIFVJbnQzMiBkZWxheUJldHdlZW5BdXRvU2Nyb2xsLCBVSW50MTYgYXV0b1Njcm9sbEFtb3VudCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIFNJbnQzMiBpblZhbHVlLCBCb29sZWFuIGluQXV0b1RvZ2dsZXMpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUm91bmRCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIFNJbnQxNiBpblNpemUsIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgT1NUeXBlIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGV4dCwgQm9vbGVhbiBpc1Bhc3N3b3JkLCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkZpbmRDb250cm9sVW5kZXJNb3VzZSIsIChQeUNGdW5jdGlvbilDdGxfRmluZENvbnRyb2xVbmRlck1vdXNlLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBpbldoZXJlLCBXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIF9ydiwgU0ludDE2IG91dFBhcnQpIil9LAorICAgIHsiYXNfQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfYXNfQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IChDb250cm9sSGFuZGxlIF9ydikiKX0sCisgICAgeyJDcmVhdGVUYWJzQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlVGFic0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDE2IHNpemUsIFVJbnQxNiBkaXJlY3Rpb24sIENvbnRyb2xUYWJFbnRyeSB0YWJBcnJheSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTU1MzEsMjgzICs1NTMxLDI4MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEN0bE9ial9OZXdVbm1hbmFnZWQoQ29udHJvbEhhbmRsZSBpdHNlbGYpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKml0OwotICAgICAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0gICAgICAgIGl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOwotICAgICAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0gICAgICAgIGl0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ29udHJvbE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEN0bE9ial9XaGljaENvbnRyb2woQ29udHJvbEhhbmRsZSBjKQogewotICAgICAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKml0OwogCi0gICAgICAgIGlmIChjID09IE5VTEwpCi0gICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpdCA9IChQeU9iamVjdCAqKSBHZXRDb250cm9sUmVmZXJlbmNlKGMpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgKiogSWYgdGhlIHJlZmNvbiBpcyB6ZXJvIG9yIGRvZXNuJ3QgcG9pbnQgYmFjayB0byB0aGUgUHl0aG9uIG9iamVjdAotICAgICAgICAgICAgICAgICoqIHRoZSBjb250cm9sIGlzIG5vdCBvdXJzLiBSZXR1cm4gYSB0ZW1wb3Jhcnkgb2JqZWN0LgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgKChDb250cm9sT2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gYykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDdGxPYmpfTmV3VW5tYW5hZ2VkKGMpOwotICAgICAgICB9Ci0gICAgICAgIFB5X0lOQ1JFRihpdCk7Ci0gICAgICAgIHJldHVybiBpdDsKKyAgICBpZiAoYyA9PSBOVUxMKQorICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgZWxzZSB7CisgICAgICAgIGl0ID0gKFB5T2JqZWN0ICopIEdldENvbnRyb2xSZWZlcmVuY2UoYyk7CisgICAgICAgIC8qCisgICAgICAgICoqIElmIHRoZSByZWZjb24gaXMgemVybyBvciBkb2Vzbid0IHBvaW50IGJhY2sgdG8gdGhlIFB5dGhvbiBvYmplY3QKKyAgICAgICAgKiogdGhlIGNvbnRyb2wgaXMgbm90IG91cnMuIFJldHVybiBhIHRlbXBvcmFyeSBvYmplY3QuCisgICAgICAgICovCisgICAgICAgIGlmIChpdCA9PSBOVUxMIHx8ICgoQ29udHJvbE9iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IGMpCisgICAgICAgICAgICByZXR1cm4gQ3RsT2JqX05ld1VubWFuYWdlZChjKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0KTsKKyAgICByZXR1cm4gaXQ7CiB9CiAKIHN0YXRpYyBpbnQKIHNldHRyYWNrZnVuYyhQeU9iamVjdCAqb2JqKQogewotICAgICAgICBpZiAodHJhY2tlcikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJUcmFja2VyIGZ1bmN0aW9uIGluIHVzZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrZXIgPSBvYmo7Ci0gICAgICAgIFB5X0lOQ1JFRih0cmFja2VyKTsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHRyYWNrZXIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEN0bF9FcnJvciwgIlRyYWNrZXIgZnVuY3Rpb24gaW4gdXNlIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB0cmFja2VyID0gb2JqOworICAgIFB5X0lOQ1JFRih0cmFja2VyKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQKIGNscnRyYWNrZnVuYyh2b2lkKQogewotICAgICAgICBQeV9YREVDUkVGKHRyYWNrZXIpOwotICAgICAgICB0cmFja2VyID0gMDsKKyAgICBQeV9YREVDUkVGKHRyYWNrZXIpOworICAgIHRyYWNrZXIgPSAwOwogfQogCiBzdGF0aWMgcGFzY2FsIHZvaWQKIG15dHJhY2tlcihDb250cm9sSGFuZGxlIGN0bCwgc2hvcnQgcGFydCkKIHsKLSAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpydj0wOworICAgIFB5T2JqZWN0ICphcmdzLCAqcnY9MDsKIAotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8maSkiLCBDdGxPYmpfV2hpY2hDb250cm9sLCBjdGwsIChpbnQpcGFydCk7Ci0gICAgICAgIGlmIChhcmdzICYmIHRyYWNrZXIpIHsKLSAgICAgICAgICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KHRyYWNrZXIsIGFyZ3MpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnYpCi0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIlRyYWNrQ29udHJvbCBvciBIYW5kbGVDb250cm9sQ2xpY2s6IGV4Y2VwdGlvbiBpbiB0cmFja2VyIGZ1bmN0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICB9CisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIihPJmkpIiwgQ3RsT2JqX1doaWNoQ29udHJvbCwgY3RsLCAoaW50KXBhcnQpOworICAgIGlmIChhcmdzICYmIHRyYWNrZXIpIHsKKyAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdCh0cmFja2VyLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICBpZiAocnYpCisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgZWxzZSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJUcmFja0NvbnRyb2wgb3IgSGFuZGxlQ29udHJvbENsaWNrOiBleGNlcHRpb24gaW4gdHJhY2tlciBmdW5jdGlvblxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBzZXRjYWxsYmFjayhQeU9iamVjdCAqbXlzZWxmLCBPU1R5cGUgd2hpY2gsIFB5T2JqZWN0ICpjYWxsYmFjaywgVW5pdmVyc2FsUHJvY1B0ciAqdXBwcCkKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqc2VsZiA9IChDb250cm9sT2JqZWN0ICopbXlzZWxmOwotICAgICAgICBjaGFyIGtleWJ1Zls5XTsKKyAgICBDb250cm9sT2JqZWN0ICpzZWxmID0gKENvbnRyb2xPYmplY3QgKilteXNlbGY7CisgICAgY2hhciBrZXlidWZbOV07CiAKLSAgICAgICAgaWYgKCB3aGljaCA9PSBrTXlDb250cm9sQWN0aW9uUHJvY1RhZyApCi0gICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWFjdGlvbnByb2NfdXBwOwotICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUtleURvd25Qcm9jVGFnICkKLSAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15a2V5ZG93bnByb2NfdXBwOwotICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUZvY3VzUHJvY1RhZyApCi0gICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWZvY3VzcHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lRHJhd1Byb2NUYWcgKQotICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlkcmF3cHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lSWRsZVByb2NUYWcgKQotICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlpZGxlcHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lSGl0VGVzdFByb2NUYWcgKQotICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXloaXR0ZXN0cHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lVHJhY2tpbmdQcm9jVGFnICkKLSAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15dHJhY2tpbmdwcm9jX3VwcDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgLyogT25seSBub3cgZG8gd2UgdGVzdCBmb3IgY2xlYXJpbmcgb2YgdGhlIGNhbGxiYWNrOiAqLwotICAgICAgICBpZiAoIGNhbGxiYWNrID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgICp1cHBwID0gTlVMTDsKLSAgICAgICAgLyogQ3JlYXRlIHRoZSBkaWN0IGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0IChzbyB3ZSBkb24ndCBnZXQgc3VjaCBhIGRpY3QgZm9yIGV2ZXJ5IGNvbnRyb2wpICovCi0gICAgICAgIGlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgKQotICAgICAgICAgICAgICAgIGlmICggKHNlbGYtPm9iX2NhbGxiYWNrZGljdCA9IFB5RGljdF9OZXcoKSkgPT0gTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIC8qIEFuZCBzdG9yZSB0aGUgUHl0aG9uIGNhbGxiYWNrICovCi0gICAgICAgIHNwcmludGYoa2V5YnVmLCAiJXgiLCAodW5zaWduZWQpd2hpY2gpOwotICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoc2VsZi0+b2JfY2FsbGJhY2tkaWN0LCBrZXlidWYsIGNhbGxiYWNrKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHdoaWNoID09IGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnICkKKyAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWFjdGlvbnByb2NfdXBwOworICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lS2V5RG93blByb2NUYWcgKQorICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15a2V5ZG93bnByb2NfdXBwOworICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lRm9jdXNQcm9jVGFnICkKKyAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWZvY3VzcHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVEcmF3UHJvY1RhZyApCisgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlkcmF3cHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZyApCisgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlpZGxlcHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVIaXRUZXN0UHJvY1RhZyApCisgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXloaXR0ZXN0cHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVUcmFja2luZ1Byb2NUYWcgKQorICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15dHJhY2tpbmdwcm9jX3VwcDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBPbmx5IG5vdyBkbyB3ZSB0ZXN0IGZvciBjbGVhcmluZyBvZiB0aGUgY2FsbGJhY2s6ICovCisgICAgaWYgKCBjYWxsYmFjayA9PSBQeV9Ob25lICkKKyAgICAgICAgKnVwcHAgPSBOVUxMOworICAgIC8qIENyZWF0ZSB0aGUgZGljdCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldCAoc28gd2UgZG9uJ3QgZ2V0IHN1Y2ggYSBkaWN0IGZvciBldmVyeSBjb250cm9sKSAqLworICAgIGlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgKQorICAgICAgICBpZiAoIChzZWxmLT5vYl9jYWxsYmFja2RpY3QgPSBQeURpY3RfTmV3KCkpID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIEFuZCBzdG9yZSB0aGUgUHl0aG9uIGNhbGxiYWNrICovCisgICAgc3ByaW50ZihrZXlidWYsICIleCIsICh1bnNpZ25lZCl3aGljaCk7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHNlbGYtPm9iX2NhbGxiYWNrZGljdCwga2V5YnVmLCBjYWxsYmFjaykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsY2FsbGJhY2soQ29udHJvbE9iamVjdCAqc2VsZiwgT1NUeXBlIHdoaWNoLCBQeU9iamVjdCAqYXJnbGlzdCkKIHsKLSAgICAgICAgY2hhciBrZXlidWZbOV07Ci0gICAgICAgIFB5T2JqZWN0ICpmdW5jLCAqcnY7CisgICAgY2hhciBrZXlidWZbOV07CisgICAgUHlPYmplY3QgKmZ1bmMsICpydjsKIAotICAgICAgICBzcHJpbnRmKGtleWJ1ZiwgIiV4IiwgKHVuc2lnbmVkKXdoaWNoKTsKLSAgICAgICAgaWYgKCBzZWxmLT5vYl9jYWxsYmFja2RpY3QgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5vYl9jYWxsYmFja2RpY3QsIGtleWJ1ZikpID09IE5VTEwgKSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkNvbnRyb2wgY2FsbGJhY2sgJXggd2l0aG91dCBjYWxsYmFjayBvYmplY3RcbiIsICh1bnNpZ25lZCl3aGljaCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdsaXN0KTsKLSAgICAgICAgaWYgKCBydiA9PSBOVUxMICkgewotICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gY29udHJvbCBjYWxsYmFjayAleCBoYW5kbGVyXG4iLCAodW5zaWduZWQpd2hpY2gpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgIHNwcmludGYoa2V5YnVmLCAiJXgiLCAodW5zaWduZWQpd2hpY2gpOworICAgIGlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgKGZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5vYl9jYWxsYmFja2RpY3QsIGtleWJ1ZikpID09IE5VTEwgKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJDb250cm9sIGNhbGxiYWNrICV4IHdpdGhvdXQgY2FsbGJhY2sgb2JqZWN0XG4iLCAodW5zaWduZWQpd2hpY2gpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdsaXN0KTsKKyAgICBpZiAoIHJ2ID09IE5VTEwgKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gY29udHJvbCBjYWxsYmFjayAleCBoYW5kbGVyXG4iLCAodW5zaWduZWQpd2hpY2gpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZAogbXlhY3Rpb25wcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgU0ludDE2IHBhcnQpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaCIsIGN0bF9vYmosIHBhcnQpOwotICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYocnYpOworICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7CisgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga015Q29udHJvbEFjdGlvblByb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihydik7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteWtleWRvd25wcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgU0ludDE2IGtleUNvZGUsIFNJbnQxNiBjaGFyQ29kZSwgU0ludDE2IG1vZGlmaWVycykKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKLSAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLSAgICAgICAgc2hvcnQgY19ydiA9IDA7CisgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworICAgIHNob3J0IGNfcnYgPSAwOwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaGhoIiwgY3RsX29iaiwga2V5Q29kZSwgY2hhckNvZGUsIG1vZGlmaWVycyk7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVLZXlEb3duUHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIGlmICggcnYgKQotICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2UocnYsICJoIiwgJmNfcnYpKQotICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgUHlfWERFQ1JFRihydik7Ci0gICAgICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CisgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2hoaCIsIGN0bF9vYmosIGtleUNvZGUsIGNoYXJDb2RlLCBtb2RpZmllcnMpOworICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVLZXlEb3duUHJvY1RhZywgYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICBpZiAoIHJ2ICkKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteWZvY3VzcHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIENvbnRyb2xQYXJ0Q29kZSBwYXJ0KQogewotICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwotICAgICAgICBzaG9ydCBjX3J2ID0ga0NvbnRyb2xGb2N1c05vUGFydDsKKyAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgc2hvcnQgY19ydiA9IGtDb250cm9sRm9jdXNOb1BhcnQ7CiAKLSAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLSAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVGb2N1c1Byb2NUYWcsIGFyZ2xpc3QpOwotICAgICAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOwotICAgICAgICBpZiAoIHJ2ICkKLSAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIFB5X1hERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OworICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7CisgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUZvY3VzUHJvY1RhZywgYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICBpZiAoIHJ2ICkKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZAogbXlkcmF3cHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIFNJbnQxNiBwYXJ0KQogewotICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKIAotICAgICAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOwotICAgICAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKLSAgICAgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZURyYXdQcm9jVGFnLCBhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihydik7CisgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKKyAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lRHJhd1Byb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihydik7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZAogbXlpZGxlcHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPIiwgY3RsX29iaik7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYocnYpOworICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk8iLCBjdGxfb2JqKTsKKyAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lSWRsZVByb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihydik7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteWhpdHRlc3Rwcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgUG9pbnQgd2hlcmUpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7Ci0gICAgICAgIHNob3J0IGNfcnYgPSAtMTsKKyAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgc2hvcnQgY19ydiA9IC0xOwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPTyYiLCBjdGxfb2JqLCBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVIaXRUZXN0UHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIC8qIElnbm9yZSBlcnJvcnMsIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoZW0gKi8KLSAgICAgICAgaWYgKCBydiApCi0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCi0gICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBQeV9YREVDUkVGKHJ2KTsKLSAgICAgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKKyAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOworICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPTyYiLCBjdGxfb2JqLCBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7CisgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUhpdFRlc3RQcm9jVGFnLCBhcmdsaXN0KTsKKyAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgIC8qIElnbm9yZSBlcnJvcnMsIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoZW0gKi8KKyAgICBpZiAoIHJ2ICkKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteXRyYWNraW5ncHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIFBvaW50IHN0YXJ0UHQsIENvbnRyb2xBY3Rpb25VUFAgYWN0aW9uUHJvYykKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKLSAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLSAgICAgICAgc2hvcnQgY19ydiA9IC0xOworICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKyAgICBzaG9ydCBjX3J2ID0gLTE7CiAKLSAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLSAgICAgICAgLyogV2UgY2Fubm90IHBhc3MgdGhlIGFjdGlvblByb2Mgd2l0aG91dCBsb3RzIG9mIHdvcmsgKi8KLSAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9PJiIsIGN0bF9vYmosIFB5TWFjX0J1aWxkUG9pbnQsIHN0YXJ0UHQpOwotICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lVHJhY2tpbmdQcm9jVGFnLCBhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKLSAgICAgICAgaWYgKCBydiApCi0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCi0gICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBQeV9YREVDUkVGKHJ2KTsKLSAgICAgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKKyAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOworICAgIC8qIFdlIGNhbm5vdCBwYXNzIHRoZSBhY3Rpb25Qcm9jIHdpdGhvdXQgbG90cyBvZiB3b3JrICovCisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9PJiIsIGN0bF9vYmosIFB5TWFjX0J1aWxkUG9pbnQsIHN0YXJ0UHQpOworICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVUcmFja2luZ1Byb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgaWYgKCBydiApCisgICAgICAgIGlmICghUHlBcmdfUGFyc2UocnYsICJoIiwgJmNfcnYpKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9YREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OwogfQogCiAjZWxzZSAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgQ3RsX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiB2b2lkIGluaXRfQ3RsKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAotCW15dHJhY2tlcl91cHAgPSBOZXdDb250cm9sQWN0aW9uVVBQKG15dHJhY2tlcik7Ci0JbXlhY3Rpb25wcm9jX3VwcCA9IE5ld0NvbnRyb2xBY3Rpb25VUFAobXlhY3Rpb25wcm9jKTsKLQlteWtleWRvd25wcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUtleURvd25VUFAobXlrZXlkb3ducHJvYyk7Ci0JbXlmb2N1c3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRm9jdXNVUFAobXlmb2N1c3Byb2MpOwotCW15ZHJhd3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRHJhd1VQUChteWRyYXdwcm9jKTsKLQlteWlkbGVwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUlkbGVVUFAobXlpZGxlcHJvYyk7Ci0JbXloaXR0ZXN0cHJvY191cHAgPSBOZXdDb250cm9sVXNlclBhbmVIaXRUZXN0VVBQKG15aGl0dGVzdHByb2MpOwotCW15dHJhY2tpbmdwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nVVBQKG15dHJhY2tpbmdwcm9jKTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb250cm9sSGFuZGxlLCBDdGxPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29udHJvbEhhbmRsZSwgQ3RsT2JqX0NvbnZlcnQpOworICAgIG15dHJhY2tlcl91cHAgPSBOZXdDb250cm9sQWN0aW9uVVBQKG15dHJhY2tlcik7CisgICAgbXlhY3Rpb25wcm9jX3VwcCA9IE5ld0NvbnRyb2xBY3Rpb25VUFAobXlhY3Rpb25wcm9jKTsKKyAgICBteWtleWRvd25wcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUtleURvd25VUFAobXlrZXlkb3ducHJvYyk7CisgICAgbXlmb2N1c3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRm9jdXNVUFAobXlmb2N1c3Byb2MpOworICAgIG15ZHJhd3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRHJhd1VQUChteWRyYXdwcm9jKTsKKyAgICBteWlkbGVwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUlkbGVVUFAobXlpZGxlcHJvYyk7CisgICAgbXloaXR0ZXN0cHJvY191cHAgPSBOZXdDb250cm9sVXNlclBhbmVIaXRUZXN0VVBQKG15aGl0dGVzdHByb2MpOworICAgIG15dHJhY2tpbmdwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nVVBQKG15dHJhY2tpbmdwcm9jKTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb250cm9sSGFuZGxlLCBDdGxPYmpfTmV3KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29udHJvbEhhbmRsZSwgQ3RsT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9DdGwiLCBDdGxfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9DdGwiLCBDdGxfbWV0aG9kcyk7CiAKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDdGxfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChDdGxfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDdGxfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlDb250cm9sX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDb250cm9sX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ29udHJvbF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbnRyb2wiLCAoUHlPYmplY3QgKikmQ29udHJvbF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNvbnRyb2xfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb250cm9sVHlwZSIsIChQeU9iamVjdCAqKSZDb250cm9sX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEN0bF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEN0bF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEN0bF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIENvbnRyb2xfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNvbnRyb2xfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDb250cm9sX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29udHJvbCIsIChQeU9iamVjdCAqKSZDb250cm9sX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ29udHJvbF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbnRyb2xUeXBlIiwgKFB5T2JqZWN0ICopJkNvbnRyb2xfVHlwZSk7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2RsZy9fRGxnbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9kbGcvX0RsZ21vZHVsZS5jCmluZGV4IDlhZmE0NzcuLmM0ZDY2YTkgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2RsZy9fRGxnbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZGxnL19EbGdtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzUsNTUgKzM1LDU1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVjb3JkICpldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKml0ZW1IaXQpCiB7Ci0gICAgICAgIEJvb2xlYW4gcnY7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOwotICAgICAgICBQeU9iamVjdCAqY2FsbGJhY2sgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKLSAgICAgICAgaWYgKGNhbGxiYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8qIERlZmF1bHQgYmVoYXZpb3IgKi8KLSAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOyAvKiBXZSdsbCByZXN0b3JlIGl0IHdoZW4gY2FsbCBzdWNjZXNzZnVsICovCi0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgRGxnT2JqX1doaWNoRGlhbG9nLCBkaWFsb2csIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsIGV2ZW50KTsKLSAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXMgPSBOVUxMOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChjYWxsYmFjaywgYXJncyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIEJvb2xlYW4gcnY7CisgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgUHlPYmplY3QgKmNhbGxiYWNrID0gRGxnX0ZpbHRlclByb2NfY2FsbGJhY2s7CisgICAgaWYgKGNhbGxiYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOyAvKiBEZWZhdWx0IGJlaGF2aW9yICovCisgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOyAvKiBXZSdsbCByZXN0b3JlIGl0IHdoZW4gY2FsbCBzdWNjZXNzZnVsICovCisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBEbGdPYmpfV2hpY2hEaWFsb2csIGRpYWxvZywgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgZXZlbnQpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJlcyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGNhbGxiYWNrLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBEaWFsb2cgRmlsdGVyXG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgKml0ZW1IaXQgPSAtMTsgLyogRmFrZSByZXR1cm4gaXRlbSAqLworICAgICAgICByZXR1cm4gMTsgLyogV2UgaGFuZGxlZCBpdCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJlcykpIHsKKyAgICAgICAgICAgICppdGVtSGl0ID0gUHlJbnRfQXNMb25nKHJlcyk7CisgICAgICAgICAgICBydiA9IDE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBEaWFsb2cgRmlsdGVyXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICAgICAgICAgICppdGVtSGl0ID0gLTE7IC8qIEZha2UgcmV0dXJuIGl0ZW0gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogV2UgaGFuZGxlZCBpdCAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICppdGVtSGl0ID0gUHlJbnRfQXNMb25nKHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydiA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHJlcyk7Ci0gICAgICAgIHJldHVybiBydjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnYgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgTW9kYWxGaWx0ZXJVUFAKIERsZ19QYXNzRmlsdGVyUHJvYyhQeU9iamVjdCAqY2FsbGJhY2spCiB7Ci0gICAgICAgIFB5T2JqZWN0ICp0bXAgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKLSAgICAgICAgc3RhdGljIE1vZGFsRmlsdGVyVVBQIFVuaXZGaWx0ZXJVcHAgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0bXAgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKKyAgICBzdGF0aWMgTW9kYWxGaWx0ZXJVUFAgVW5pdkZpbHRlclVwcCA9IE5VTEw7CiAKLSAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOwotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodG1wKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBQeV9JTkNSRUYoY2FsbGJhY2spOwotICAgICAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IGNhbGxiYWNrOworICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsKKyAgICBpZiAoY2FsbGJhY2sgPT0gUHlfTm9uZSkgewogICAgICAgICBQeV9YREVDUkVGKHRtcCk7Ci0gICAgICAgIGlmICggVW5pdkZpbHRlclVwcCA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICBVbml2RmlsdGVyVXBwID0gTmV3TW9kYWxGaWx0ZXJVUFAoJkRsZ19Vbml2RmlsdGVyUHJvYyk7Ci0gICAgICAgIHJldHVybiBVbml2RmlsdGVyVXBwOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsKKyAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IGNhbGxiYWNrOworICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICBpZiAoIFVuaXZGaWx0ZXJVcHAgPT0gTlVMTCApCisgICAgICAgIFVuaXZGaWx0ZXJVcHAgPSBOZXdNb2RhbEZpbHRlclVQUCgmRGxnX1VuaXZGaWx0ZXJQcm9jKTsKKyAgICByZXR1cm4gVW5pdkZpbHRlclVwcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID0gTlVMTDsKQEAgLTkxLDI0ICs5MSwyNCBAQAogc3RhdGljIHBhc2NhbCB2b2lkIERsZ19Vbml2VXNlckl0ZW1Qcm9jKERpYWxvZ1B0ciBkaWFsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGl0ZW0pCiB7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOworICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOwogCi0gICAgICAgIGlmIChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAvKiBEZWZhdWx0IGJlaGF2aW9yICovCi0gICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsgLyogV2UnbGwgcmVzdG9yZSBpdCB3aGVuIGNhbGwgc3VjY2Vzc2Z1bCAqLwotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwgRGxnT2JqX1doaWNoRGlhbG9nLCBkaWFsb2csIGl0ZW0pOwotICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJlcyA9IE5VTEw7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2ssIGFyZ3MpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIERpYWxvZyBVc2VySXRlbSBwcm9jXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICB9Ci0gICAgICAgIFB5X1hERUNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybjsgLyogRGVmYXVsdCBiZWhhdmlvciAqLworICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsgLyogV2UnbGwgcmVzdG9yZSBpdCB3aGVuIGNhbGwgc3VjY2Vzc2Z1bCAqLworICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLCBEbGdPYmpfV2hpY2hEaWFsb2csIGRpYWxvZywgaXRlbSk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmVzID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjaywgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gRGlhbG9nIFVzZXJJdGVtIHByb2NcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KKyAgICBQeV9YREVDUkVGKHJlcyk7CisgICAgcmV0dXJuOwogfQogCiAjaWYgMApAQCAtMTMzLDgxMSArMTMzLDgxMSBAQAogI2RlZmluZSBEbGdPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRGlhbG9nX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkRpYWxvZ19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRGlhbG9nT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRGlhbG9nUHRyIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRGlhbG9nUHRyIG9iX2l0c2VsZjsKIH0gRGlhbG9nT2JqZWN0OwogCiBQeU9iamVjdCAqRGxnT2JqX05ldyhEaWFsb2dQdHIgaXRzZWxmKQogewotCURpYWxvZ09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7IFB5X0lOQ1JFRihQeV9Ob25lKTsgcmV0dXJuIFB5X05vbmU7IH0KLQlpdCA9IFB5T2JqZWN0X05FVyhEaWFsb2dPYmplY3QsICZEaWFsb2dfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JU2V0V1JlZkNvbihHZXREaWFsb2dXaW5kb3coaXRzZWxmKSwgKGxvbmcpaXQpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBEaWFsb2dPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeyBQeV9JTkNSRUYoUHlfTm9uZSk7IHJldHVybiBQeV9Ob25lOyB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRGlhbG9nT2JqZWN0LCAmRGlhbG9nX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIFNldFdSZWZDb24oR2V0RGlhbG9nV2luZG93KGl0c2VsZiksIChsb25nKWl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBEbGdPYmpfQ29udmVydChQeU9iamVjdCAqdiwgRGlhbG9nUHRyICpwX2l0c2VsZikKIHsKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChEaWFsb2dQdHIpUHlJbnRfQXNMb25nKHYpOwotCSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsgfQotCWlmICghRGxnT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkRpYWxvZyByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChEaWFsb2dPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICBpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKERpYWxvZ1B0cilQeUludF9Bc0xvbmcodik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOyB9CisgICAgaWYgKCFEbGdPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRGlhbG9nIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKERpYWxvZ09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIERsZ09ial9kZWFsbG9jKERpYWxvZ09iamVjdCAqc2VsZikKIHsKLQlEaXNwb3NlRGlhbG9nKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBEaXNwb3NlRGlhbG9nKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRHJhd0RpYWxvZyhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRHJhd0RpYWxvZwotCVB5TWFjX1BSRUNIRUNLKERyYXdEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURyYXdEaWFsb2coX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmF3RGlhbG9nKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfVXBkYXRlRGlhbG9nKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHVwZGF0ZVJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHVwZGF0ZVJnbjsKICNpZm5kZWYgVXBkYXRlRGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCi0JCXJldHVybiBOVUxMOwotCVVwZGF0ZURpYWxvZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICB1cGRhdGVSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXBkYXRlUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVXBkYXRlRGlhbG9nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIHVwZGF0ZVJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9IaWRlRGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CiAjaWZuZGVmIEhpZGVEaWFsb2dJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZURpYWxvZ0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVEaWFsb2dJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZURpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpdGVtTm8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1ObykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpZGVEaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaXRlbU5vKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX1Nob3dEaWFsb2dJdGVtKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKICNpZm5kZWYgU2hvd0RpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhTaG93RGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd0RpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8pKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIGl0ZW1Obyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hvd0RpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBpdGVtTm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRmluZERpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2OwotCVBvaW50IHRoZVB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2OworICAgIFBvaW50IHRoZVB0OwogI2lmbmRlZiBGaW5kRGlhbG9nSXRlbQotCVB5TWFjX1BSRUNIRUNLKEZpbmREaWFsb2dJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaW5kRGlhbG9nSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaW5kRGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZVB0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaW5kRGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nQ3V0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEaWFsb2dDdXQKLQlQeU1hY19QUkVDSEVDSyhEaWFsb2dDdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ0N1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlhbG9nQ3V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlhbG9nQ3V0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nUGFzdGUoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERpYWxvZ1Bhc3RlCi0JUHlNYWNfUFJFQ0hFQ0soRGlhbG9nUGFzdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ1Bhc3RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEaWFsb2dQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpYWxvZ1Bhc3RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nQ29weShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGlhbG9nQ29weQotCVB5TWFjX1BSRUNIRUNLKERpYWxvZ0NvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURpYWxvZ0NvcHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaWFsb2dDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nRGVsZXRlKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEaWFsb2dEZWxldGUKLQlQeU1hY19QUkVDSEVDSyhEaWFsb2dEZWxldGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ0RlbGV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlhbG9nRGVsZXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlhbG9nRGVsZXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfR2V0RGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtTm87Ci0JRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGU7Ci0JSGFuZGxlIGl0ZW07Ci0JUmVjdCBib3g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGU7CisgICAgSGFuZGxlIGl0ZW07CisgICAgUmVjdCBib3g7CiAjaWZuZGVmIEdldERpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgaXRlbU5vLAotCSAgICAgICAgICAgICAgJml0ZW1UeXBlLAotCSAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAmYm94KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm94KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1ObykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGl0ZW1ObywKKyAgICAgICAgICAgICAgICAgICZpdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgJmJveCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX1NldERpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggaXRlbU5vOwotCURpYWxvZ0l0ZW1UeXBlIGl0ZW1UeXBlOwotCUhhbmRsZSBpdGVtOwotCVJlY3QgYm94OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbU5vOworICAgIERpYWxvZ0l0ZW1UeXBlIGl0ZW1UeXBlOworICAgIEhhbmRsZSBpdGVtOworICAgIFJlY3QgYm94OwogI2lmbmRlZiBTZXREaWFsb2dJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveCkpCi0JCXJldHVybiBOVUxMOwotCVNldERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGl0ZW1ObywKLQkgICAgICAgICAgICAgIGl0ZW1UeXBlLAotCSAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICZib3gpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGl0ZW1ObywKKyAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlLAorICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICZib3gpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2VsZWN0RGlhbG9nSXRlbVRleHQoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggaXRlbU5vOwotCVNJbnQxNiBzdHJ0U2VsOwotCVNJbnQxNiBlbmRTZWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgU0ludDE2IHN0cnRTZWw7CisgICAgU0ludDE2IGVuZFNlbDsKICNpZm5kZWYgU2VsZWN0RGlhbG9nSXRlbVRleHQKLQlQeU1hY19QUkVDSEVDSyhTZWxlY3REaWFsb2dJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2VsZWN0RGlhbG9nSXRlbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1ObywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0cnRTZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmRTZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlTZWxlY3REaWFsb2dJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW1ObywKLQkgICAgICAgICAgICAgICAgICAgICBzdHJ0U2VsLAotCSAgICAgICAgICAgICAgICAgICAgIGVuZFNlbCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ0U2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kU2VsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2VsZWN0RGlhbG9nSXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmRTZWwpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfQXBwZW5kRElUTChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB0aGVIYW5kbGU7Ci0JRElUTE1ldGhvZCBtZXRob2Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSB0aGVIYW5kbGU7CisgICAgRElUTE1ldGhvZCBtZXRob2Q7CiAjaWZuZGVmIEFwcGVuZERJVEwKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRESVRMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBcHBlbmRESVRMKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQXBwZW5kRElUTChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgdGhlSGFuZGxlLAotCSAgICAgICAgICAgbWV0aG9kKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXRob2QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBcHBlbmRESVRMKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICB0aGVIYW5kbGUsCisgICAgICAgICAgICAgICBtZXRob2QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfQ291bnRESVRMKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IF9ydjsKICNpZm5kZWYgQ291bnRESVRMCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnRESVRMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudERJVEwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvdW50RElUTChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRESVRMKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TaG9ydGVuRElUTChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBudW1iZXJJdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IG51bWJlckl0ZW1zOwogI2lmbmRlZiBTaG9ydGVuRElUTAotCVB5TWFjX1BSRUNIRUNLKFNob3J0ZW5ESVRMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG9ydGVuRElUTCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bWJlckl0ZW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2hvcnRlbkRJVEwoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBudW1iZXJJdGVtcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVySXRlbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaG9ydGVuRElUTChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIG51bWJlckl0ZW1zKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0luc2VydERpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURpYWxvZ0l0ZW1JbmRleCBhZnRlckl0ZW07Ci0JRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGU7Ci0JSGFuZGxlIGl0ZW1IYW5kbGU7Ci0JUmVjdCBib3g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRGlhbG9nSXRlbUluZGV4IGFmdGVySXRlbTsKKyAgICBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZTsKKyAgICBIYW5kbGUgaXRlbUhhbmRsZTsKKyAgICBSZWN0IGJveDsKICNpZm5kZWYgSW5zZXJ0RGlhbG9nSXRlbQotCVB5TWFjX1BSRUNIRUNLKEluc2VydERpYWxvZ0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydERpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1IYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3gpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZib3gpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluc2VydERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm94KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfUmVtb3ZlRGlhbG9nSXRlbXMoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtTm87Ci0JRGlhbG9nSXRlbUluZGV4IGFtb3VudFRvUmVtb3ZlOwotCUJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgRGlhbG9nSXRlbUluZGV4IGFtb3VudFRvUmVtb3ZlOworICAgIEJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhOwogI2lmbmRlZiBSZW1vdmVEaWFsb2dJdGVtcwotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZURpYWxvZ0l0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVEaWFsb2dJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAmYW1vdW50VG9SZW1vdmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXNwb3NlSXRlbURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRGlhbG9nSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnRUb1JlbW92ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZUl0ZW1EYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYW1vdW50VG9SZW1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwb3NlSXRlbURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRGlhbG9nSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnRUb1JlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZUl0ZW1EYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU3RkRmlsdGVyUHJvYyhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIGV2ZW50OwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCBldmVudDsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKICNpZm5kZWYgU3RkRmlsdGVyUHJvYwotCVB5TWFjX1BSRUNIRUNLKFN0ZEZpbHRlclByb2MpOworICAgIFB5TWFjX1BSRUNIRUNLKFN0ZEZpbHRlclByb2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZldmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTdGRGaWx0ZXJQcm9jKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmZXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTdGRGaWx0ZXJQcm9jKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX1NldERpYWxvZ0RlZmF1bHRJdGVtKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEaWFsb2dJdGVtSW5kZXggbmV3SXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEaWFsb2dJdGVtSW5kZXggbmV3SXRlbTsKICNpZm5kZWYgU2V0RGlhbG9nRGVmYXVsdEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dEZWZhdWx0SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nRGVmYXVsdEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERpYWxvZ0RlZmF1bHRJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3SXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREaWFsb2dEZWZhdWx0SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJdGVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0RGlhbG9nQ2FuY2VsSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW07CiAjaWZuZGVmIFNldERpYWxvZ0NhbmNlbEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dDYW5jZWxJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dDYW5jZWxJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3SXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREaWFsb2dDYW5jZWxJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SXRlbSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdJdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERpYWxvZ0NhbmNlbEl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJdGVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0RGlhbG9nVHJhY2tzQ3Vyc29yKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlCb29sZWFuIHRyYWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBCb29sZWFuIHRyYWNrczsKICNpZm5kZWYgU2V0RGlhbG9nVHJhY2tzQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nVHJhY2tzQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dUcmFja3NDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFja3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGlhbG9nVHJhY2tzQ3Vyc29yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERpYWxvZ1RyYWNrc0N1cnNvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfQXV0b1NpemVEaWFsb2coRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBdXRvU2l6ZURpYWxvZwotCVB5TWFjX1BSRUNIRUNLKEF1dG9TaXplRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBdXRvU2l6ZURpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEF1dG9TaXplRGlhbG9nKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQXV0b1NpemVEaWFsb2coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0dldERpYWxvZ0l0ZW1Bc0NvbnRyb2woRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW1ObzsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbU5vOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgR2V0RGlhbG9nSXRlbUFzQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1ObykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREaWFsb2dJdGVtQXNDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtTm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1ObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9Nb3ZlRGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbU5vOwotCVNJbnQxNiBpbkhvcml6OwotCVNJbnQxNiBpblZlcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbU5vOworICAgIFNJbnQxNiBpbkhvcml6OworICAgIFNJbnQxNiBpblZlcnQ7CiAjaWZuZGVmIE1vdmVEaWFsb2dJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soTW92ZURpYWxvZ0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVEaWFsb2dJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1ObywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZlcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTW92ZURpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtTm8sCi0JICAgICAgICAgICAgICAgICAgICAgIGluSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgIGluVmVydCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVmVydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBNb3ZlRGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1ObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Ib3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WZXJ0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2l6ZURpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW1ObzsKLQlTSW50MTYgaW5XaWR0aDsKLQlTSW50MTYgaW5IZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbU5vOworICAgIFNJbnQxNiBpbldpZHRoOworICAgIFNJbnQxNiBpbkhlaWdodDsKICNpZm5kZWYgU2l6ZURpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhTaXplRGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2l6ZURpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5XaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNpemVEaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGluSXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICBpbldpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBpbkhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNpemVEaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0FwcGVuZERpYWxvZ0l0ZW1MaXN0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgZGl0bElEOwotCURJVExNZXRob2QgbWV0aG9kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBkaXRsSUQ7CisgICAgRElUTE1ldGhvZCBtZXRob2Q7CiAjaWZuZGVmIEFwcGVuZERpYWxvZ0l0ZW1MaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soQXBwZW5kRGlhbG9nSXRlbUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZERpYWxvZ0l0ZW1MaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpdGxJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1ldGhvZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBcHBlbmREaWFsb2dJdGVtTGlzdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXRsSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGl0bElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFwcGVuZERpYWxvZ0l0ZW1MaXN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdGxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0RGlhbG9nVGltZW91dChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IGluQnV0dG9uVG9QcmVzczsKLQlVSW50MzIgaW5TZWNvbmRzVG9XYWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNJbnQxNiBpbkJ1dHRvblRvUHJlc3M7CisgICAgVUludDMyIGluU2Vjb25kc1RvV2FpdDsKICNpZm5kZWYgU2V0RGlhbG9nVGltZW91dAotCVB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ1RpbWVvdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ1RpbWVvdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5CdXR0b25Ub1ByZXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TZWNvbmRzVG9XYWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERpYWxvZ1RpbWVvdXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1dHRvblRvUHJlc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5TZWNvbmRzVG9XYWl0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1dHRvblRvUHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblNlY29uZHNUb1dhaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGlhbG9nVGltZW91dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnV0dG9uVG9QcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNlY29uZHNUb1dhaXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dUaW1lb3V0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0QnV0dG9uVG9QcmVzczsKLQlVSW50MzIgb3V0U2Vjb25kc1RvV2FpdDsKLQlVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgb3V0QnV0dG9uVG9QcmVzczsKKyAgICBVSW50MzIgb3V0U2Vjb25kc1RvV2FpdDsKKyAgICBVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZzsKICNpZm5kZWYgR2V0RGlhbG9nVGltZW91dAotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1RpbWVvdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1RpbWVvdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREaWFsb2dUaW1lb3V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1dHRvblRvUHJlc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNlY29uZHNUb1dhaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNlY29uZHNSZW1haW5pbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0QnV0dG9uVG9QcmVzcywKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTZWNvbmRzVG9XYWl0LAotCSAgICAgICAgICAgICAgICAgICAgIG91dFNlY29uZHNSZW1haW5pbmcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGlhbG9nVGltZW91dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCdXR0b25Ub1ByZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTZWNvbmRzVG9XYWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTZWNvbmRzUmVtYWluaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJobGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1dHRvblRvUHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2Vjb25kc1RvV2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTZWNvbmRzUmVtYWluaW5nKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0TW9kYWxEaWFsb2dFdmVudE1hc2soRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUV2ZW50TWFzayBpbk1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRXZlbnRNYXNrIGluTWFzazsKICNpZm5kZWYgU2V0TW9kYWxEaWFsb2dFdmVudE1hc2sKLQlQeU1hY19QUkVDSEVDSyhTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW9kYWxEaWFsb2dFdmVudE1hc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TW9kYWxEaWFsb2dFdmVudE1hc2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NYXNrKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hc2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXRNb2RhbERpYWxvZ0V2ZW50TWFzayhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRNYXNrIG91dE1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRXZlbnRNYXNrIG91dE1hc2s7CiAjaWZuZGVmIEdldE1vZGFsRGlhbG9nRXZlbnRNYXNrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW9kYWxEaWFsb2dFdmVudE1hc2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vZGFsRGlhbG9nRXZlbnRNYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TW9kYWxEaWFsb2dFdmVudE1hc2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hc2spOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1hc2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW9kYWxEaWFsb2dFdmVudE1hc2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hc2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1hc2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dXaW5kb3coRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBHZXREaWFsb2dXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlURUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRFSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dUZXh0RWRpdEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldERpYWxvZ1RleHRFZGl0SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dEZWZhdWx0SXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIEdldERpYWxvZ0RlZmF1bHRJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nRGVmYXVsdEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0RlZmF1bHRJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXREaWFsb2dEZWZhdWx0SXRlbShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nRGVmYXVsdEl0ZW0oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0dldERpYWxvZ0NhbmNlbEl0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXREaWFsb2dDYW5jZWxJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nQ2FuY2VsSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nQ2FuY2VsSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nQ2FuY2VsSXRlbShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nQ2FuY2VsSXRlbShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfR2V0RGlhbG9nS2V5Ym9hcmRGb2N1c0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbQotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nS2V5Ym9hcmRGb2N1c0l0ZW0oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TZXRQb3J0RGlhbG9nUG9ydChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2V0UG9ydERpYWxvZ1BvcnQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0RGlhbG9nUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydERpYWxvZ1BvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnREaWFsb2dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydERpYWxvZ1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dQb3J0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR3JhZlB0ciBfcnY7CiAjaWZuZGVmIEdldERpYWxvZ1BvcnQKLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dQb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXREaWFsb2dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldERpYWxvZ1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIERsZ09ial9tZXRob2RzW10gPSB7Ci0JeyJEcmF3RGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EcmF3RGlhbG9nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1VwZGF0ZURpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKLQl7IkhpZGVEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9IaWRlRGlhbG9nSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKLQl7IlNob3dEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TaG93RGlhbG9nSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKLQl7IkZpbmREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9GaW5kRGlhbG9nSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2KSIpfSwKLQl7IkRpYWxvZ0N1dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nQ3V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEaWFsb2dQYXN0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nUGFzdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRpYWxvZ0NvcHkiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0RpYWxvZ0NvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRpYWxvZ0RlbGV0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nRGVsZXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vKSAtPiAoRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGUsIEhhbmRsZSBpdGVtLCBSZWN0IGJveCkiKX0sCi0JeyJTZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW0sIFJlY3QgYm94KSAtPiBOb25lIil9LAotCXsiU2VsZWN0RGlhbG9nSXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NlbGVjdERpYWxvZ0l0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBTSW50MTYgc3RydFNlbCwgU0ludDE2IGVuZFNlbCkgLT4gTm9uZSIpfSwKLQl7IkFwcGVuZERJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0FwcGVuZERJVEwsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSB0aGVIYW5kbGUsIERJVExNZXRob2QgbWV0aG9kKSAtPiBOb25lIil9LAotCXsiQ291bnRESVRMIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9Db3VudERJVEwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAotCXsiU2hvcnRlbkRJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1Nob3J0ZW5ESVRMLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggbnVtYmVySXRlbXMpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9JbnNlcnREaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggYWZ0ZXJJdGVtLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW1IYW5kbGUsIFJlY3QgYm94KSAtPiBOb25lIil9LAotCXsiUmVtb3ZlRGlhbG9nSXRlbXMiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1JlbW92ZURpYWxvZ0l0ZW1zLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtSW5kZXggYW1vdW50VG9SZW1vdmUsIEJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhKSAtPiBOb25lIil9LAotCXsiU3RkRmlsdGVyUHJvYyIsIChQeUNGdW5jdGlvbilEbGdPYmpfU3RkRmlsdGVyUHJvYywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZXZlbnQsIERpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0KSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIGV2ZW50LCBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdCkiKX0sCi0JeyJTZXREaWFsb2dEZWZhdWx0SXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nRGVmYXVsdEl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBuZXdJdGVtKSAtPiBOb25lIil9LAotCXsiU2V0RGlhbG9nQ2FuY2VsSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nQ2FuY2VsSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW0pIC0+IE5vbmUiKX0sCi0JeyJTZXREaWFsb2dUcmFja3NDdXJzb3IiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NldERpYWxvZ1RyYWNrc0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiB0cmFja3MpIC0+IE5vbmUiKX0sCi0JeyJBdXRvU2l6ZURpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdPYmpfQXV0b1NpemVEaWFsb2csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0l0ZW1Bc0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJNb3ZlRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfTW92ZURpYWxvZ0l0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluSG9yaXosIFNJbnQxNiBpblZlcnQpIC0+IE5vbmUiKX0sCi0JeyJTaXplRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2l6ZURpYWxvZ0l0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluV2lkdGgsIFNJbnQxNiBpbkhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkFwcGVuZERpYWxvZ0l0ZW1MaXN0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9BcHBlbmREaWFsb2dJdGVtTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGRpdGxJRCwgRElUTE1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCi0JeyJTZXREaWFsb2dUaW1lb3V0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dUaW1lb3V0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5CdXR0b25Ub1ByZXNzLCBVSW50MzIgaW5TZWNvbmRzVG9XYWl0KSAtPiBOb25lIil9LAotCXsiR2V0RGlhbG9nVGltZW91dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nVGltZW91dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEJ1dHRvblRvUHJlc3MsIFVJbnQzMiBvdXRTZWNvbmRzVG9XYWl0LCBVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZykiKX0sCi0JeyJTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50TWFzayBpbk1hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TWFzayBvdXRNYXNrKSIpfSwKLQl7IkdldERpYWxvZ1dpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkdldERpYWxvZ1RleHRFZGl0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dUZXh0RWRpdEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKLQl7IkdldERpYWxvZ0RlZmF1bHRJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dEZWZhdWx0SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJHZXREaWFsb2dDYW5jZWxJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dDYW5jZWxJdGVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IkdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJTZXRQb3J0RGlhbG9nUG9ydCIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0UG9ydERpYWxvZ1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldERpYWxvZ1BvcnQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJEcmF3RGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EcmF3RGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1VwZGF0ZURpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkhpZGVEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9IaWRlRGlhbG9nSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TaG93RGlhbG9nSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKKyAgICB7IkZpbmREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9GaW5kRGlhbG9nSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2KSIpfSwKKyAgICB7IkRpYWxvZ0N1dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nQ3V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEaWFsb2dQYXN0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nUGFzdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpYWxvZ0NvcHkiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0RpYWxvZ0NvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpYWxvZ0RlbGV0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nRGVsZXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vKSAtPiAoRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGUsIEhhbmRsZSBpdGVtLCBSZWN0IGJveCkiKX0sCisgICAgeyJTZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW0sIFJlY3QgYm94KSAtPiBOb25lIil9LAorICAgIHsiU2VsZWN0RGlhbG9nSXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NlbGVjdERpYWxvZ0l0ZW1UZXh0LCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBTSW50MTYgc3RydFNlbCwgU0ludDE2IGVuZFNlbCkgLT4gTm9uZSIpfSwKKyAgICB7IkFwcGVuZERJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0FwcGVuZERJVEwsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB0aGVIYW5kbGUsIERJVExNZXRob2QgbWV0aG9kKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRESVRMIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9Db3VudERJVEwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAorICAgIHsiU2hvcnRlbkRJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1Nob3J0ZW5ESVRMLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggbnVtYmVySXRlbXMpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9JbnNlcnREaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggYWZ0ZXJJdGVtLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW1IYW5kbGUsIFJlY3QgYm94KSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlRGlhbG9nSXRlbXMiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1JlbW92ZURpYWxvZ0l0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtSW5kZXggYW1vdW50VG9SZW1vdmUsIEJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhKSAtPiBOb25lIil9LAorICAgIHsiU3RkRmlsdGVyUHJvYyIsIChQeUNGdW5jdGlvbilEbGdPYmpfU3RkRmlsdGVyUHJvYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZXZlbnQsIERpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0KSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIGV2ZW50LCBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdCkiKX0sCisgICAgeyJTZXREaWFsb2dEZWZhdWx0SXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nRGVmYXVsdEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBuZXdJdGVtKSAtPiBOb25lIil9LAorICAgIHsiU2V0RGlhbG9nQ2FuY2VsSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nQ2FuY2VsSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJTZXREaWFsb2dUcmFja3NDdXJzb3IiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NldERpYWxvZ1RyYWNrc0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiB0cmFja3MpIC0+IE5vbmUiKX0sCisgICAgeyJBdXRvU2l6ZURpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdPYmpfQXV0b1NpemVEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0l0ZW1Bc0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJNb3ZlRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfTW92ZURpYWxvZ0l0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluSG9yaXosIFNJbnQxNiBpblZlcnQpIC0+IE5vbmUiKX0sCisgICAgeyJTaXplRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2l6ZURpYWxvZ0l0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluV2lkdGgsIFNJbnQxNiBpbkhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7IkFwcGVuZERpYWxvZ0l0ZW1MaXN0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9BcHBlbmREaWFsb2dJdGVtTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGRpdGxJRCwgRElUTE1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCisgICAgeyJTZXREaWFsb2dUaW1lb3V0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dUaW1lb3V0LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5CdXR0b25Ub1ByZXNzLCBVSW50MzIgaW5TZWNvbmRzVG9XYWl0KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGlhbG9nVGltZW91dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nVGltZW91dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEJ1dHRvblRvUHJlc3MsIFVJbnQzMiBvdXRTZWNvbmRzVG9XYWl0LCBVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZykiKX0sCisgICAgeyJTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50TWFzayBpbk1hc2spIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TWFzayBvdXRNYXNrKSIpfSwKKyAgICB7IkdldERpYWxvZ1dpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkdldERpYWxvZ1RleHRFZGl0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dUZXh0RWRpdEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldERpYWxvZ0RlZmF1bHRJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dEZWZhdWx0SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJHZXREaWFsb2dDYW5jZWxJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dDYW5jZWxJdGVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJTZXRQb3J0RGlhbG9nUG9ydCIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0UG9ydERpYWxvZ1BvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERpYWxvZ1BvcnQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ1BvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIERsZ09ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTk0NSwxNiArOTQ1LDE2IEBACiAKIHN0YXRpYyBpbnQgRGxnT2JqX2NvbXBhcmUoRGlhbG9nT2JqZWN0ICpzZWxmLCBEaWFsb2dPYmplY3QgKm90aGVyKQogewotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgRGxnT2JqX3JlcHIgTlVMTAogCiBzdGF0aWMgaW50IERsZ09ial9oYXNoKERpYWxvZ09iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogI2RlZmluZSBEbGdPYmpfdHBfaW5pdCAwCiAKQEAgLTk2Miw2MSArOTYyLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlEaWFsb2dQdHIgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBEaWFsb2dQdHIgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRGxnT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRGlhbG9nT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIERsZ09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKERpYWxvZ09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBEbGdPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRGlhbG9nX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0RsZy5EaWFsb2ciLCAvKnRwX25hbWUqLwotCXNpemVvZihEaWFsb2dPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBEbGdPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRGxnT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBEbGdPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIERsZ09ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlEbGdPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRGxnT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCURsZ09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRGxnT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCURsZ09ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCURsZ09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0RsZy5EaWFsb2ciLCAvKnRwX25hbWUqLworICAgIHNpemVvZihEaWFsb2dPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBEbGdPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRGxnT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBEbGdPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIERsZ09ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBEbGdPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRGxnT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIERsZ09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRGxnT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIERsZ09ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIERsZ09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIERpYWxvZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEwMjQsNTAzICsxMDI0LDUwMyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19OZXdEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ1B0ciBfcnY7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVN0cjI1NSB0aXRsZTsKLQlCb29sZWFuIHZpc2libGU7Ci0JU0ludDE2IHByb2NJRDsKLQlXaW5kb3dQdHIgYmVoaW5kOwotCUJvb2xlYW4gZ29Bd2F5RmxhZzsKLQlTSW50MzIgcmVmQ29uOwotCUhhbmRsZSBpdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nUHRyIF9ydjsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU3RyMjU1IHRpdGxlOworICAgIEJvb2xlYW4gdmlzaWJsZTsKKyAgICBTSW50MTYgcHJvY0lEOworICAgIFdpbmRvd1B0ciBiZWhpbmQ7CisgICAgQm9vbGVhbiBnb0F3YXlGbGFnOworICAgIFNJbnQzMiByZWZDb247CisgICAgSGFuZGxlIGl0ZW1zOwogI2lmbmRlZiBOZXdEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhOZXdEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld0RpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld0RpYWxvZygodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgdmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgcHJvY0lELAotCSAgICAgICAgICAgICAgICBiZWhpbmQsCi0JICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgIHJlZkNvbiwKLQkgICAgICAgICAgICAgICAgaXRlbXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld0RpYWxvZygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvY0lELAorICAgICAgICAgICAgICAgICAgICBiZWhpbmQsCisgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfR2V0TmV3RGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dQdHIgX3J2OwotCVNJbnQxNiBkaWFsb2dJRDsKLQlXaW5kb3dQdHIgYmVoaW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dQdHIgX3J2OworICAgIFNJbnQxNiBkaWFsb2dJRDsKKyAgICBXaW5kb3dQdHIgYmVoaW5kOwogI2lmbmRlZiBHZXROZXdEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhHZXROZXdEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5ld0RpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlhbG9nSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV3RGlhbG9nKGRpYWxvZ0lELAotCSAgICAgICAgICAgICAgICAgICAodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICAgIGJlaGluZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWFsb2dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXdEaWFsb2coZGlhbG9nSUQsCisgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopMCwKKyAgICAgICAgICAgICAgICAgICAgICAgYmVoaW5kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX05ld0NvbG9yRGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dQdHIgX3J2OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTdHIyNTUgdGl0bGU7Ci0JQm9vbGVhbiB2aXNpYmxlOwotCVNJbnQxNiBwcm9jSUQ7Ci0JV2luZG93UHRyIGJlaGluZDsKLQlCb29sZWFuIGdvQXdheUZsYWc7Ci0JU0ludDMyIHJlZkNvbjsKLQlIYW5kbGUgaXRlbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ1B0ciBfcnY7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFN0cjI1NSB0aXRsZTsKKyAgICBCb29sZWFuIHZpc2libGU7CisgICAgU0ludDE2IHByb2NJRDsKKyAgICBXaW5kb3dQdHIgYmVoaW5kOworICAgIEJvb2xlYW4gZ29Bd2F5RmxhZzsKKyAgICBTSW50MzIgcmVmQ29uOworICAgIEhhbmRsZSBpdGVtczsKICNpZm5kZWYgTmV3Q29sb3JEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhOZXdDb2xvckRpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3Q29sb3JEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvY0lELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdDb2xvckRpYWxvZygodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICBwcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgYmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdDb2xvckRpYWxvZygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX01vZGFsRGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQeU9iamVjdCogbW9kYWxGaWx0ZXI7Ci0JRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKICNpZm5kZWYgTW9kYWxEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhNb2RhbERpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW9kYWxEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCU1vZGFsRGlhbG9nKERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlciksCi0JICAgICAgICAgICAgJml0ZW1IaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTW9kYWxEaWFsb2coRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSwKKyAgICAgICAgICAgICAgICAmaXRlbUhpdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1IaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19Jc0RpYWxvZ0V2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CiAjaWZuZGVmIElzRGlhbG9nRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhJc0RpYWxvZ0V2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0RpYWxvZ0V2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZ0aGVFdmVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzRGlhbG9nRXZlbnQoJnRoZUV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0RpYWxvZ0V2ZW50KCZ0aGVFdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0RpYWxvZ1NlbGVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7Ci0JRGlhbG9nUHRyIHRoZURpYWxvZzsKLQlEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgRGlhbG9nUHRyIHRoZURpYWxvZzsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKICNpZm5kZWYgRGlhbG9nU2VsZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRGlhbG9nU2VsZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaWFsb2dTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGlhbG9nU2VsZWN0KCZ0aGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgJnRoZURpYWxvZywKLQkgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX1doaWNoRGlhbG9nLCB0aGVEaWFsb2csCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGlhbG9nU2VsZWN0KCZ0aGVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnRoZURpYWxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX1doaWNoRGlhbG9nLCB0aGVEaWFsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0FsZXJ0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggX3J2OwotCVNJbnQxNiBhbGVydElEOwotCVB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IF9ydjsKKyAgICBTSW50MTYgYWxlcnRJRDsKKyAgICBQeU9iamVjdCogbW9kYWxGaWx0ZXI7CiAjaWZuZGVmIEFsZXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soQWxlcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFsZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsZXJ0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFsZXJ0KGFsZXJ0SUQsCi0JICAgICAgICAgICAgRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQWxlcnQoYWxlcnRJRCwKKyAgICAgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfU3RvcEFsZXJ0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggX3J2OwotCVNJbnQxNiBhbGVydElEOwotCVB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IF9ydjsKKyAgICBTSW50MTYgYWxlcnRJRDsKKyAgICBQeU9iamVjdCogbW9kYWxGaWx0ZXI7CiAjaWZuZGVmIFN0b3BBbGVydAotCVB5TWFjX1BSRUNIRUNLKFN0b3BBbGVydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RvcEFsZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsZXJ0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN0b3BBbGVydChhbGVydElELAotCSAgICAgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGVydElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kYWxGaWx0ZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTdG9wQWxlcnQoYWxlcnRJRCwKKyAgICAgICAgICAgICAgICAgICAgRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX05vdGVBbGVydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IF9ydjsKLQlTSW50MTYgYWxlcnRJRDsKLQlQeU9iamVjdCogbW9kYWxGaWx0ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBfcnY7CisgICAgU0ludDE2IGFsZXJ0SUQ7CisgICAgUHlPYmplY3QqIG1vZGFsRmlsdGVyOwogI2lmbmRlZiBOb3RlQWxlcnQKLQlQeU1hY19QUkVDSEVDSyhOb3RlQWxlcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE5vdGVBbGVydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGVydElELAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kYWxGaWx0ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOb3RlQWxlcnQoYWxlcnRJRCwKLQkgICAgICAgICAgICAgICAgRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTm90ZUFsZXJ0KGFsZXJ0SUQsCisgICAgICAgICAgICAgICAgICAgIERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlcikpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19DYXV0aW9uQWxlcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBfcnY7Ci0JU0ludDE2IGFsZXJ0SUQ7Ci0JUHlPYmplY3QqIG1vZGFsRmlsdGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXggX3J2OworICAgIFNJbnQxNiBhbGVydElEOworICAgIFB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKICNpZm5kZWYgQ2F1dGlvbkFsZXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soQ2F1dGlvbkFsZXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYXV0aW9uQWxlcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2F1dGlvbkFsZXJ0KGFsZXJ0SUQsCi0JICAgICAgICAgICAgICAgICAgIERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlcikpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsZXJ0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENhdXRpb25BbGVydChhbGVydElELAorICAgICAgICAgICAgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfUGFyYW1UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgcGFyYW0wOwotCVN0cjI1NSBwYXJhbTE7Ci0JU3RyMjU1IHBhcmFtMjsKLQlTdHIyNTUgcGFyYW0zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgcGFyYW0wOworICAgIFN0cjI1NSBwYXJhbTE7CisgICAgU3RyMjU1IHBhcmFtMjsKKyAgICBTdHIyNTUgcGFyYW0zOwogI2lmbmRlZiBQYXJhbVRleHQKLQlQeU1hY19QUkVDSEVDSyhQYXJhbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBhcmFtVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0wLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFyYW1UZXh0KHBhcmFtMCwKLQkgICAgICAgICAgcGFyYW0xLAotCSAgICAgICAgICBwYXJhbTIsCi0JICAgICAgICAgIHBhcmFtMyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQYXJhbVRleHQocGFyYW0wLAorICAgICAgICAgICAgICBwYXJhbTEsCisgICAgICAgICAgICAgIHBhcmFtMiwKKyAgICAgICAgICAgICAgcGFyYW0zKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0dldERpYWxvZ0l0ZW1UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgaXRlbTsKLQlTdHIyNTUgdGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIGl0ZW07CisgICAgU3RyMjU1IHRleHQ7CiAjaWZuZGVmIEdldERpYWxvZ0l0ZW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nSXRlbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0l0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0RGlhbG9nSXRlbVRleHQoaXRlbSwKLQkgICAgICAgICAgICAgICAgICB0ZXh0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0ZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldERpYWxvZ0l0ZW1UZXh0KGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgdGV4dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX1NldERpYWxvZ0l0ZW1UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgaXRlbTsKLQlTdHIyNTUgdGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIGl0ZW07CisgICAgU3RyMjU1IHRleHQ7CiAjaWZuZGVmIFNldERpYWxvZ0l0ZW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nSXRlbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0l0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGV4dCkpCi0JCXJldHVybiBOVUxMOwotCVNldERpYWxvZ0l0ZW1UZXh0KGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgdGV4dCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGV4dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldERpYWxvZ0l0ZW1UZXh0KGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19HZXRBbGVydFN0YWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRBbGVydFN0YWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0QWxlcnRTdGFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0QWxlcnRTdGFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0QWxlcnRTdGFnZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRBbGVydFN0YWdlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX1NldERpYWxvZ0ZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBmb250TnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgZm9udE51bTsKICNpZm5kZWYgU2V0RGlhbG9nRm9udAotCVB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0ZvbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0ZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0RGlhbG9nRm9udChmb250TnVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0RGlhbG9nRm9udChmb250TnVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX1Jlc2V0QWxlcnRTdGFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBSZXNldEFsZXJ0U3RhZ2UKLQlQeU1hY19QUkVDSEVDSyhSZXNldEFsZXJ0U3RhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlc2V0QWxlcnRTdGFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVzZXRBbGVydFN0YWdlKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZXNldEFsZXJ0U3RhZ2UoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0dldFBhcmFtVGV4dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RyMjU1IHBhcmFtMDsKLQlTdHIyNTUgcGFyYW0xOwotCVN0cjI1NSBwYXJhbTI7Ci0JU3RyMjU1IHBhcmFtMzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IHBhcmFtMDsKKyAgICBTdHIyNTUgcGFyYW0xOworICAgIFN0cjI1NSBwYXJhbTI7CisgICAgU3RyMjU1IHBhcmFtMzsKICNpZm5kZWYgR2V0UGFyYW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UGFyYW1UZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQYXJhbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMykpCi0JCXJldHVybiBOVUxMOwotCUdldFBhcmFtVGV4dChwYXJhbTAsCi0JICAgICAgICAgICAgIHBhcmFtMSwKLQkgICAgICAgICAgICAgcGFyYW0yLAotCSAgICAgICAgICAgICBwYXJhbTMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UGFyYW1UZXh0KHBhcmFtMCwKKyAgICAgICAgICAgICAgICAgcGFyYW0xLAorICAgICAgICAgICAgICAgICBwYXJhbTIsCisgICAgICAgICAgICAgICAgIHBhcmFtMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19OZXdGZWF0dXJlc0RpYWxvZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nUHRyIF9ydjsKLQlSZWN0IGluQm91bmRzUmVjdDsKLQlTdHIyNTUgaW5UaXRsZTsKLQlCb29sZWFuIGluSXNWaXNpYmxlOwotCVNJbnQxNiBpblByb2NJRDsKLQlXaW5kb3dQdHIgaW5CZWhpbmQ7Ci0JQm9vbGVhbiBpbkdvQXdheUZsYWc7Ci0JU0ludDMyIGluUmVmQ29uOwotCUhhbmRsZSBpbkl0ZW1MaXN0SGFuZGxlOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dQdHIgX3J2OworICAgIFJlY3QgaW5Cb3VuZHNSZWN0OworICAgIFN0cjI1NSBpblRpdGxlOworICAgIEJvb2xlYW4gaW5Jc1Zpc2libGU7CisgICAgU0ludDE2IGluUHJvY0lEOworICAgIFdpbmRvd1B0ciBpbkJlaGluZDsKKyAgICBCb29sZWFuIGluR29Bd2F5RmxhZzsKKyAgICBTSW50MzIgaW5SZWZDb247CisgICAgSGFuZGxlIGluSXRlbUxpc3RIYW5kbGU7CisgICAgVUludDMyIGluRmxhZ3M7CiAjaWZuZGVmIE5ld0ZlYXR1cmVzRGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soTmV3RmVhdHVyZXNEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld0ZlYXR1cmVzRGlhbG9nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGluVGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzVmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUHJvY0lELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluQmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Hb0F3YXlGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5JdGVtTGlzdEhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdGZWF0dXJlc0RpYWxvZygodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmluQm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluSXNWaXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvY0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluQmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluR29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1MaXN0SGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpblRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc1Zpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbkJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluR29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluSXRlbUxpc3RIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3RmVhdHVyZXNEaWFsb2coKHZvaWQgKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtTGlzdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0dldERpYWxvZ0Zyb21XaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ1B0ciBfcnY7Ci0JV2luZG93UHRyIHdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nUHRyIF9ydjsKKyAgICBXaW5kb3dQdHIgd2luZG93OwogI2lmbmRlZiBHZXREaWFsb2dGcm9tV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nRnJvbVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nRnJvbVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nRnJvbVdpbmRvdyh3aW5kb3cpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nRnJvbVdpbmRvdyh3aW5kb3cpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfU2V0VXNlckl0ZW1IYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQkgICAgICAgIFB5T2JqZWN0ICpuZXcgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqbmV3ID0gTlVMTDsKIAogCi0JICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ8TyIsICZuZXcpKQotCSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAifE8iLCAmbmV3KSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JICAgICAgICBpZiAoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayAmJiBuZXcgJiYgbmV3ICE9IFB5X05vbmUpIHsKLQkgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERsZ19FcnJvciwgIkFub3RoZXIgVXNlckl0ZW1Qcm9jIGlzIGFscmVhZHkgaW5zdGFsbGVkIik7Ci0JICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgfQorICAgICAgICBpZiAoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayAmJiBuZXcgJiYgbmV3ICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEbGdfRXJyb3IsICJBbm90aGVyIFVzZXJJdGVtUHJvYyBpcyBhbHJlYWR5IGluc3RhbGxlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCSAgICAgICAgaWYgKG5ldyA9PSBOVUxMIHx8IG5ldyA9PSBQeV9Ob25lKSB7Ci0JICAgICAgICAgICAgICAgIG5ldyA9IE5VTEw7Ci0JICAgICAgICAgICAgICAgIF9yZXMgPSBQeV9Ob25lOwotCSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgICAgICBQeV9JTkNSRUYobmV3KTsKLQkgICAgICAgICAgICAgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlOZXdVc2VySXRlbVVQUChEbGdfVW5pdlVzZXJJdGVtUHJvYykpOwotCSAgICAgICAgfQorICAgICAgICBpZiAobmV3ID09IE5VTEwgfHwgbmV3ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIG5ldyA9IE5VTEw7CisgICAgICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihuZXcpOworICAgICAgICAgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlOZXdVc2VySXRlbVVQUChEbGdfVW5pdlVzZXJJdGVtUHJvYykpOworICAgICAgICB9CiAKLQkgICAgICAgIERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2sgPSBuZXc7Ci0JICAgICAgICByZXR1cm4gX3JlczsKKyAgICAgICAgRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayA9IG5ldzsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIERsZ19tZXRob2RzW10gPSB7Ci0JeyJOZXdEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnX05ld0RpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKLQl7IkdldE5ld0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfR2V0TmV3RGlhbG9nLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZGlhbG9nSUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKLQl7Ik5ld0NvbG9yRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19OZXdDb2xvckRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKLQl7Ik1vZGFsRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19Nb2RhbERpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAotCXsiSXNEaWFsb2dFdmVudCIsIChQeUNGdW5jdGlvbilEbGdfSXNEaWFsb2dFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJEaWFsb2dTZWxlY3QiLCAoUHlDRnVuY3Rpb24pRGxnX0RpYWxvZ1NlbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydiwgRGlhbG9nUHRyIHRoZURpYWxvZywgRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAotCXsiQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX0FsZXJ0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCi0JeyJTdG9wQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX1N0b3BBbGVydCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGFsZXJ0SUQsIFB5T2JqZWN0KiBtb2RhbEZpbHRlcikgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAotCXsiTm90ZUFsZXJ0IiwgKFB5Q0Z1bmN0aW9uKURsZ19Ob3RlQWxlcnQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBhbGVydElELCBQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggX3J2KSIpfSwKLQl7IkNhdXRpb25BbGVydCIsIChQeUNGdW5jdGlvbilEbGdfQ2F1dGlvbkFsZXJ0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCi0JeyJQYXJhbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnX1BhcmFtVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHBhcmFtMCwgU3RyMjU1IHBhcmFtMSwgU3RyMjU1IHBhcmFtMiwgU3RyMjU1IHBhcmFtMykgLT4gTm9uZSIpfSwKLQl7IkdldERpYWxvZ0l0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXREaWFsb2dJdGVtVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGl0ZW0pIC0+IChTdHIyNTUgdGV4dCkiKX0sCi0JeyJTZXREaWFsb2dJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nSXRlbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBpdGVtLCBTdHIyNTUgdGV4dCkgLT4gTm9uZSIpfSwKLQl7IkdldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX0dldEFsZXJ0U3RhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiU2V0RGlhbG9nRm9udCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nRm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGZvbnROdW0pIC0+IE5vbmUiKX0sCi0JeyJSZXNldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX1Jlc2V0QWxlcnRTdGFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0UGFyYW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXRQYXJhbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBwYXJhbTAsIFN0cjI1NSBwYXJhbTEsIFN0cjI1NSBwYXJhbTIsIFN0cjI1NSBwYXJhbTMpIC0+IE5vbmUiKX0sCi0JeyJOZXdGZWF0dXJlc0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfTmV3RmVhdHVyZXNEaWFsb2csIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHNSZWN0LCBTdHIyNTUgaW5UaXRsZSwgQm9vbGVhbiBpbklzVmlzaWJsZSwgU0ludDE2IGluUHJvY0lELCBXaW5kb3dQdHIgaW5CZWhpbmQsIEJvb2xlYW4gaW5Hb0F3YXlGbGFnLCBTSW50MzIgaW5SZWZDb24sIEhhbmRsZSBpbkl0ZW1MaXN0SGFuZGxlLCBVSW50MzIgaW5GbGFncykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAotCXsiR2V0RGlhbG9nRnJvbVdpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdfR2V0RGlhbG9nRnJvbVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAotCXsiU2V0VXNlckl0ZW1IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKURsZ19TZXRVc2VySXRlbUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJOZXdEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnX05ld0RpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKKyAgICB7IkdldE5ld0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfR2V0TmV3RGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZGlhbG9nSUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKKyAgICB7Ik5ld0NvbG9yRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19OZXdDb2xvckRpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKKyAgICB7Ik1vZGFsRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19Nb2RhbERpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAorICAgIHsiSXNEaWFsb2dFdmVudCIsIChQeUNGdW5jdGlvbilEbGdfSXNEaWFsb2dFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJEaWFsb2dTZWxlY3QiLCAoUHlDRnVuY3Rpb24pRGxnX0RpYWxvZ1NlbGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydiwgRGlhbG9nUHRyIHRoZURpYWxvZywgRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAorICAgIHsiQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX0FsZXJ0LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCisgICAgeyJTdG9wQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX1N0b3BBbGVydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGFsZXJ0SUQsIFB5T2JqZWN0KiBtb2RhbEZpbHRlcikgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAorICAgIHsiTm90ZUFsZXJ0IiwgKFB5Q0Z1bmN0aW9uKURsZ19Ob3RlQWxlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBhbGVydElELCBQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggX3J2KSIpfSwKKyAgICB7IkNhdXRpb25BbGVydCIsIChQeUNGdW5jdGlvbilEbGdfQ2F1dGlvbkFsZXJ0LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCisgICAgeyJQYXJhbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnX1BhcmFtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHBhcmFtMCwgU3RyMjU1IHBhcmFtMSwgU3RyMjU1IHBhcmFtMiwgU3RyMjU1IHBhcmFtMykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERpYWxvZ0l0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXREaWFsb2dJdGVtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGl0ZW0pIC0+IChTdHIyNTUgdGV4dCkiKX0sCisgICAgeyJTZXREaWFsb2dJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nSXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBpdGVtLCBTdHIyNTUgdGV4dCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX0dldEFsZXJ0U3RhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiU2V0RGlhbG9nRm9udCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nRm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGZvbnROdW0pIC0+IE5vbmUiKX0sCisgICAgeyJSZXNldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX1Jlc2V0QWxlcnRTdGFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGFyYW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXRQYXJhbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBwYXJhbTAsIFN0cjI1NSBwYXJhbTEsIFN0cjI1NSBwYXJhbTIsIFN0cjI1NSBwYXJhbTMpIC0+IE5vbmUiKX0sCisgICAgeyJOZXdGZWF0dXJlc0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfTmV3RmVhdHVyZXNEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHNSZWN0LCBTdHIyNTUgaW5UaXRsZSwgQm9vbGVhbiBpbklzVmlzaWJsZSwgU0ludDE2IGluUHJvY0lELCBXaW5kb3dQdHIgaW5CZWhpbmQsIEJvb2xlYW4gaW5Hb0F3YXlGbGFnLCBTSW50MzIgaW5SZWZDb24sIEhhbmRsZSBpbkl0ZW1MaXN0SGFuZGxlLCBVSW50MzIgaW5GbGFncykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAorICAgIHsiR2V0RGlhbG9nRnJvbVdpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdfR2V0RGlhbG9nRnJvbVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAorICAgIHsiU2V0VXNlckl0ZW1IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKURsZ19TZXRVc2VySXRlbUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTE1MzAsOSArMTUzMCw5IEBACiBXaW5kb3dQdHIKIERsZ09ial9Db252ZXJ0VG9XaW5kb3coUHlPYmplY3QgKnNlbGYpCiB7Ci0gICAgICAgIGlmICggRGxnT2JqX0NoZWNrKHNlbGYpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0RGlhbG9nV2luZG93KCgoRGlhbG9nT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggRGxnT2JqX0NoZWNrKHNlbGYpICkKKyAgICAgICAgcmV0dXJuIEdldERpYWxvZ1dpbmRvdygoKERpYWxvZ09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBOVUxMOwogfQogI2VuZGlmCiAvKiBSZXR1cm4gdGhlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaWFsb2csIG9yIE5vbmUgKi8KQEAgLTE1NDAsMzUgKzE1NDAsMzUgQEAKIFB5T2JqZWN0ICoKIERsZ09ial9XaGljaERpYWxvZyhEaWFsb2dQdHIgZCkKIHsKLSAgICAgICAgUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdDsKIAotICAgICAgICBpZiAoZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOwotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgV2luZG93UHRyIHcgPSBHZXREaWFsb2dXaW5kb3coZCk7CisgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgV2luZG93UHRyIHcgPSBHZXREaWFsb2dXaW5kb3coZCk7CiAKLSAgICAgICAgICAgICAgICBpdCA9IChQeU9iamVjdCAqKSBHZXRXUmVmQ29uKHcpOwotICAgICAgICAgICAgICAgIGlmIChpdCA9PSBOVUxMIHx8ICgoRGlhbG9nT2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gZCB8fCAhRGxnT2JqX0NoZWNrKGl0KSkgeworICAgICAgICBpdCA9IChQeU9iamVjdCAqKSBHZXRXUmVmQ29uKHcpOworICAgICAgICBpZiAoaXQgPT0gTlVMTCB8fCAoKERpYWxvZ09iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IGQgfHwgIURsZ09ial9DaGVjayhpdCkpIHsKICNpZiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG91bGQgZG8gdGhpcywgYnV0IHdlIGRvbid0IGhhdmUgYW4gb2JfZnJlZWl0IGZvciBkaWFsb2dzIHlldC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gV2luT2JqX05ldyh3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9mcmVlaXQgPSBOVUxMOworICAgICAgICAgICAgLyogU2hvdWxkIGRvIHRoaXMsIGJ1dCB3ZSBkb24ndCBoYXZlIGFuIG9iX2ZyZWVpdCBmb3IgZGlhbG9ncyB5ZXQuICovCisgICAgICAgICAgICBpdCA9IFdpbk9ial9OZXcodyk7CisgICAgICAgICAgICAoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfZnJlZWl0ID0gTlVMTDsKICNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpdCA9IFB5X05vbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgICAgICAgICAgaXQgPSBQeV9Ob25lOworICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKICNlbmRpZgotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0OworICAgIH0KKyAgICByZXR1cm4gaXQ7CiB9CiAKICNlbHNlIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBEbGdfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCkBAIC0xNTc2LDMyICsxNTc2LDMyIEBACiAKIHZvaWQgaW5pdF9EbGcodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhEaWFsb2dQdHIsIERsZ09ial9XaGljaERpYWxvZyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoRGlhbG9nUHRyLCBEbGdPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX1doaWNoRGlhbG9nKTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKERpYWxvZ1B0ciwgRGxnT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9EbGciLCBEbGdfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9EbGciLCBEbGdfbWV0aG9kcyk7CiAKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlEbGdfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChEbGdfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBEbGdfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlEaWFsb2dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkRpYWxvZ19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkRpYWxvZ19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRpYWxvZyIsIChQeU9iamVjdCAqKSZEaWFsb2dfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZEaWFsb2dfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEaWFsb2dUeXBlIiwgKFB5T2JqZWN0ICopJkRpYWxvZ19UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBEbGdfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChEbGdfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBEbGdfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBEaWFsb2dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkRpYWxvZ19UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkRpYWxvZ19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRpYWxvZyIsIChQeU9iamVjdCAqKSZEaWFsb2dfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZEaWFsb2dfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEaWFsb2dUeXBlIiwgKFB5T2JqZWN0ICopJkRpYWxvZ19UeXBlKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZHJhZy9fRHJhZ21vZHVsZS5jIGIvTWFjL01vZHVsZXMvZHJhZy9fRHJhZ21vZHVsZS5jCmluZGV4IDc5N2ZiMzIuLmFhODc2OTAgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2RyYWcvX0RyYWdtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9kcmFnL19EcmFnbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTQ0LDY5MyArNDQsNjkzIEBACiAjZGVmaW5lIERyYWdPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRHJhZ09ial9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZEcmFnT2JqX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBEcmFnT2JqT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRHJhZ1JlZiBvYl9pdHNlbGY7Ci0JUHlPYmplY3QgKnNlbmRwcm9jOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBEcmFnUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdCAqc2VuZHByb2M7CiB9IERyYWdPYmpPYmplY3Q7CiAKIFB5T2JqZWN0ICpEcmFnT2JqX05ldyhEcmFnUmVmIGl0c2VsZikKIHsKLQlEcmFnT2JqT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEcmFnX0Vycm9yLCJDYW5ub3QgY3JlYXRlIG51bGwgRHJhZyIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKERyYWdPYmpPYmplY3QsICZEcmFnT2JqX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5zZW5kcHJvYyA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIERyYWdPYmpPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERyYWdfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBEcmFnIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRHJhZ09iak9iamVjdCwgJkRyYWdPYmpfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPnNlbmRwcm9jID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBEcmFnT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIERyYWdSZWYgKnBfaXRzZWxmKQogewotCWlmICghRHJhZ09ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJEcmFnT2JqIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKERyYWdPYmpPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRHJhZ09ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJEcmFnT2JqIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKERyYWdPYmpPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBEcmFnT2JqX2RlYWxsb2MoRHJhZ09iak9iamVjdCAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPnNlbmRwcm9jKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+c2VuZHByb2MpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9EaXNwb3NlRHJhZyhEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBEaXNwb3NlRHJhZwotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VEcmFnKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlRHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERpc3Bvc2VEcmFnKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGlzcG9zZURyYWcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9BZGREcmFnSXRlbUZsYXZvcihEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JY2hhciAqZGF0YVB0cl9faW5fXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKLQlGbGF2b3JGbGFncyB0aGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgRmxhdm9yVHlwZSB0aGVUeXBlOworICAgIGNoYXIgKmRhdGFQdHJfX2luX187CisgICAgbG9uZyBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgRmxhdm9yRmxhZ3MgdGhlRmxhZ3M7CiAjaWZuZGVmIEFkZERyYWdJdGVtRmxhdm9yCi0JUHlNYWNfUFJFQ0hFQ0soQWRkRHJhZ0l0ZW1GbGF2b3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZERyYWdJdGVtRmxhdm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJnojbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBZGREcmFnSXRlbUZsYXZvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJnojbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBZGREcmFnSXRlbUZsYXZvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCUZsYXZvclR5cGUgdGhlVHlwZTsKLQljaGFyICpkYXRhUHRyX19pbl9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOwotCVVJbnQzMiBkYXRhT2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKKyAgICBGbGF2b3JUeXBlIHRoZVR5cGU7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBVSW50MzIgZGF0YU9mZnNldDsKICNpZm5kZWYgU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcmFnSXRlbUZsYXZvckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8meiNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8meiNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9TZXREcmFnSW1hZ2UoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgaW1hZ2VQaXhNYXA7Ci0JUmduSGFuZGxlIGltYWdlUmduOwotCVBvaW50IGltYWdlT2Zmc2V0UHQ7Ci0JRHJhZ0ltYWdlRmxhZ3MgdGhlSW1hZ2VGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgaW1hZ2VQaXhNYXA7CisgICAgUmduSGFuZGxlIGltYWdlUmduOworICAgIFBvaW50IGltYWdlT2Zmc2V0UHQ7CisgICAgRHJhZ0ltYWdlRmxhZ3MgdGhlSW1hZ2VGbGFnczsKICNpZm5kZWYgU2V0RHJhZ0ltYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RHJhZ0ltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcmFnSW1hZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VQaXhNYXAsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW1hZ2VPZmZzZXRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUltYWdlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RHJhZ0ltYWdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbWFnZVBpeE1hcCwKLQkgICAgICAgICAgICAgICAgICAgIGltYWdlUmduLAotCSAgICAgICAgICAgICAgICAgICAgaW1hZ2VPZmZzZXRQdCwKLQkgICAgICAgICAgICAgICAgICAgIHRoZUltYWdlRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmltYWdlUGl4TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmltYWdlUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmltYWdlT2Zmc2V0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJbWFnZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERyYWdJbWFnZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQaXhNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlT2Zmc2V0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVJbWFnZUZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0NoYW5nZURyYWdCZWhhdmlvcnMoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEcmFnQmVoYXZpb3JzIGluQmVoYXZpb3JzVG9TZXQ7Ci0JRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvQ2xlYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvU2V0OworICAgIERyYWdCZWhhdmlvcnMgaW5CZWhhdmlvcnNUb0NsZWFyOwogI2lmbmRlZiBDaGFuZ2VEcmFnQmVoYXZpb3JzCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlRHJhZ0JlaGF2aW9ycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlRHJhZ0JlaGF2aW9ycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkJlaGF2aW9yc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5CZWhhdmlvcnNUb0NsZWFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZURyYWdCZWhhdmlvcnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJlaGF2aW9yc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQmVoYXZpb3JzVG9DbGVhcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CZWhhdmlvcnNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQmVoYXZpb3JzVG9DbGVhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDaGFuZ2VEcmFnQmVoYXZpb3JzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CZWhhdmlvcnNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJlaGF2aW9yc1RvQ2xlYXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfVHJhY2tEcmFnKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7Ci0JUmduSGFuZGxlIHRoZVJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBSZ25IYW5kbGUgdGhlUmVnaW9uOwogI2lmbmRlZiBUcmFja0RyYWcKLQlQeU1hY19QUkVDSEVDSyhUcmFja0RyYWcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYWNrRHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZ0aGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJhY2tEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmdGhlRXZlbnQsCi0JICAgICAgICAgICAgICAgICB0aGVSZWdpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja0RyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgIHRoZVJlZ2lvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9Db3VudERyYWdJdGVtcyhEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVJbnQxNiBudW1JdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVSW50MTYgbnVtSXRlbXM7CiAjaWZuZGVmIENvdW50RHJhZ0l0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnREcmFnSXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50RHJhZ0l0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ291bnREcmFnSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bUl0ZW1zKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBudW1JdGVtcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3VudERyYWdJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtSXRlbXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDE2IGluZGV4OwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVSW50MTYgaW5kZXg7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwogI2lmbmRlZiBHZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcgotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfQ291bnREcmFnSXRlbUZsYXZvcnMoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7Ci0JVUludDE2IG51bUZsYXZvcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIFVJbnQxNiBudW1GbGF2b3JzOwogI2lmbmRlZiBDb3VudERyYWdJdGVtRmxhdm9ycwotCVB5TWFjX1BSRUNIRUNLKENvdW50RHJhZ0l0ZW1GbGF2b3JzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudERyYWdJdGVtRmxhdm9ycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ291bnREcmFnSXRlbUZsYXZvcnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUZsYXZvcnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG51bUZsYXZvcnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3VudERyYWdJdGVtRmxhdm9ycyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRmxhdm9ycyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRmxhdm9ycyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXRGbGF2b3JUeXBlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCVVJbnQxNiBpbmRleDsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIFVJbnQxNiBpbmRleDsKKyAgICBGbGF2b3JUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEdldEZsYXZvclR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXRGbGF2b3JUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGbGF2b3JUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRGbGF2b3JUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAmdGhlVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Rmxhdm9yVHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXRGbGF2b3JGbGFncyhEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JRmxhdm9yRmxhZ3MgdGhlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIEZsYXZvclR5cGUgdGhlVHlwZTsKKyAgICBGbGF2b3JGbGFncyB0aGVGbGFnczsKICNpZm5kZWYgR2V0Rmxhdm9yRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhHZXRGbGF2b3JGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rmxhdm9yRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Rmxhdm9yRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Rmxhdm9yRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXRGbGF2b3JEYXRhU2l6ZShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JU2l6ZSBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgRmxhdm9yVHlwZSB0aGVUeXBlOworICAgIFNpemUgZGF0YVNpemU7CiAjaWZuZGVmIEdldEZsYXZvckRhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Rmxhdm9yRGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZsYXZvckRhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEZsYXZvckRhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEZsYXZvckRhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfR2V0Rmxhdm9yRGF0YShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JY2hhciAqZGF0YVB0cl9fb3V0X187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JVUludDMyIGRhdGFPZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIEZsYXZvclR5cGUgdGhlVHlwZTsKKyAgICBjaGFyICpkYXRhUHRyX19vdXRfXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBVSW50MzIgZGF0YU9mZnNldDsKICNpZm5kZWYgR2V0Rmxhdm9yRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldEZsYXZvckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZsYXZvckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8maWwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBHZXRGbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAmZGF0YVB0cl9fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKLQlmcmVlKGRhdGFQdHJfX291dF9fKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZpbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGRhdGFQdHJfX2Vycm9yX187CisgICAgfQorICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEdldEZsYXZvckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sICZkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdJdGVtQm91bmRzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCVJlY3QgaXRlbUJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgUmVjdCBpdGVtQm91bmRzOwogI2lmbmRlZiBHZXREcmFnSXRlbUJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdJdGVtQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREcmFnSXRlbUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RHJhZ0l0ZW1Cb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1Cb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZpdGVtQm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RHJhZ0l0ZW1Cb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1Cb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZpdGVtQm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX1NldERyYWdJdGVtQm91bmRzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCVJlY3QgaXRlbUJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgUmVjdCBpdGVtQm91bmRzOwogI2lmbmRlZiBTZXREcmFnSXRlbUJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldERyYWdJdGVtQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcmFnSXRlbUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJml0ZW1Cb3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RHJhZ0l0ZW1Cb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1Cb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaXRlbUJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREcmFnSXRlbUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXREcm9wTG9jYXRpb24oRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRURlc2MgZHJvcExvY2F0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFRGVzYyBkcm9wTG9jYXRpb247CiAjaWZuZGVmIEdldERyb3BMb2NhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldERyb3BMb2NhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RHJvcExvY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RHJvcExvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZHJvcExvY2F0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJmRyb3BMb2NhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcm9wTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcm9wTG9jYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmZHJvcExvY2F0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX1NldERyb3BMb2NhdGlvbihEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRGVzYyBkcm9wTG9jYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVEZXNjIGRyb3BMb2NhdGlvbjsKICNpZm5kZWYgU2V0RHJvcExvY2F0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RHJvcExvY2F0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcm9wTG9jYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJmRyb3BMb2NhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREcm9wTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkcm9wTG9jYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZkcm9wTG9jYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RHJvcExvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJvcExvY2F0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdBdHRyaWJ1dGVzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRHJhZ0F0dHJpYnV0ZXMgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRHJhZ0F0dHJpYnV0ZXMgZmxhZ3M7CiAjaWZuZGVmIEdldERyYWdBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ0F0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RHJhZ0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdNb3VzZShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBvaW50IG1vdXNlOwotCVBvaW50IGdsb2JhbFBpbm5lZE1vdXNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBvaW50IG1vdXNlOworICAgIFBvaW50IGdsb2JhbFBpbm5lZE1vdXNlOwogI2lmbmRlZiBHZXREcmFnTW91c2UKLQlQeU1hY19QUkVDSEVDSyhHZXREcmFnTW91c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdNb3VzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERyYWdNb3VzZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJm1vdXNlLAotCSAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFBpbm5lZE1vdXNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBtb3VzZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBnbG9iYWxQaW5uZWRNb3VzZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnTW91c2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtb3VzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxQaW5uZWRNb3VzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgbW91c2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZ2xvYmFsUGlubmVkTW91c2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfU2V0RHJhZ01vdXNlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUG9pbnQgZ2xvYmFsUGlubmVkTW91c2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUG9pbnQgZ2xvYmFsUGlubmVkTW91c2U7CiAjaWZuZGVmIFNldERyYWdNb3VzZQotCVB5TWFjX1BSRUNIRUNLKFNldERyYWdNb3VzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RHJhZ01vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZnbG9iYWxQaW5uZWRNb3VzZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREcmFnTW91c2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGdsb2JhbFBpbm5lZE1vdXNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmZ2xvYmFsUGlubmVkTW91c2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RHJhZ01vdXNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxQaW5uZWRNb3VzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXREcmFnT3JpZ2luKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUG9pbnQgZ2xvYmFsSW5pdGlhbE1vdXNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBvaW50IGdsb2JhbEluaXRpYWxNb3VzZTsKICNpZm5kZWYgR2V0RHJhZ09yaWdpbgotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdPcmlnaW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdPcmlnaW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcmFnT3JpZ2luKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbEluaXRpYWxNb3VzZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGdsb2JhbEluaXRpYWxNb3VzZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnT3JpZ2luKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbEluaXRpYWxNb3VzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGdsb2JhbEluaXRpYWxNb3VzZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXREcmFnTW9kaWZpZXJzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IG1vZGlmaWVyczsKLQlTSW50MTYgbW91c2VEb3duTW9kaWZpZXJzOwotCVNJbnQxNiBtb3VzZVVwTW9kaWZpZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBtb2RpZmllcnM7CisgICAgU0ludDE2IG1vdXNlRG93bk1vZGlmaWVyczsKKyAgICBTSW50MTYgbW91c2VVcE1vZGlmaWVyczsKICNpZm5kZWYgR2V0RHJhZ01vZGlmaWVycwotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdNb2RpZmllcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdNb2RpZmllcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcmFnTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmbW91c2VEb3duTW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZtb3VzZVVwTW9kaWZpZXJzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICBtb3VzZURvd25Nb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgbW91c2VVcE1vZGlmaWVycyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW91c2VEb3duTW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VzZVVwTW9kaWZpZXJzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZURvd25Nb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VVcE1vZGlmaWVycyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9TaG93RHJhZ0hpbGl0ZShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJnbkhhbmRsZSBoaWxpdGVGcmFtZTsKLQlCb29sZWFuIGluc2lkZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgaGlsaXRlRnJhbWU7CisgICAgQm9vbGVhbiBpbnNpZGU7CiAjaWZuZGVmIFNob3dEcmFnSGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0RyYWdIaWxpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dEcmFnSGlsaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaGlsaXRlRnJhbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnNpZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2hvd0RyYWdIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRnJhbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIGluc2lkZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoaWxpdGVGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc2lkZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTaG93RHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0hpZGVEcmFnSGlsaXRlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEhpZGVEcmFnSGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZURyYWdIaWxpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVEcmFnSGlsaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGlkZURyYWdIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWRlRHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0RyYWdQcmVTY3JvbGwoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgZEg7Ci0JU0ludDE2IGRWOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBkSDsKKyAgICBTSW50MTYgZFY7CiAjaWZuZGVmIERyYWdQcmVTY3JvbGwKLQlQeU1hY19QUkVDSEVDSyhEcmFnUHJlU2Nyb2xsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmFnUHJlU2Nyb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRILAotCSAgICAgICAgICAgICAgICAgICAgICAmZFYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhZ1ByZVNjcm9sbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGRILAotCSAgICAgICAgICAgICAgICAgICAgIGRWKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRWKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYWdQcmVTY3JvbGwoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkVik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9EcmFnUG9zdFNjcm9sbChEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBEcmFnUG9zdFNjcm9sbAotCVB5TWFjX1BSRUNIRUNLKERyYWdQb3N0U2Nyb2xsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmFnUG9zdFNjcm9sbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYWdQb3N0U2Nyb2xsKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhZ1Bvc3RTY3JvbGwoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9VcGRhdGVEcmFnSGlsaXRlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIHVwZGF0ZVJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdXBkYXRlUmduOwogI2lmbmRlZiBVcGRhdGVEcmFnSGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlRHJhZ0hpbGl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlRHJhZ0hpbGl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXBkYXRlUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVwZGF0ZURyYWdIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSZ24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ1cGRhdGVSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlRHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJnbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBEcmFnT2JqX21ldGhvZHNbXSA9IHsKLQl7IkRpc3Bvc2VEcmFnIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRGlzcG9zZURyYWcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFkZERyYWdJdGVtRmxhdm9yIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfQWRkRHJhZ0l0ZW1GbGF2b3IsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgRmxhdm9yRmxhZ3MgdGhlRmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJTZXREcmFnSXRlbUZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUZsYXZvckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IE5vbmUiKX0sCi0JeyJTZXREcmFnSW1hZ2UiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSW1hZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBpbWFnZVBpeE1hcCwgUmduSGFuZGxlIGltYWdlUmduLCBQb2ludCBpbWFnZU9mZnNldFB0LCBEcmFnSW1hZ2VGbGFncyB0aGVJbWFnZUZsYWdzKSAtPiBOb25lIil9LAotCXsiQ2hhbmdlRHJhZ0JlaGF2aW9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NoYW5nZURyYWdCZWhhdmlvcnMsIDEsCi0JIFB5RG9jX1NUUigiKERyYWdCZWhhdmlvcnMgaW5CZWhhdmlvcnNUb1NldCwgRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCi0JeyJUcmFja0RyYWciLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9UcmFja0RyYWcsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIHRoZUV2ZW50LCBSZ25IYW5kbGUgdGhlUmVnaW9uKSAtPiBOb25lIil9LAotCXsiQ291bnREcmFnSXRlbXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9Db3VudERyYWdJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IG51bUl0ZW1zKSIpfSwKLQl7IkdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQxNiBpbmRleCkgLT4gKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZikiKX0sCi0JeyJDb3VudERyYWdJdGVtRmxhdm9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NvdW50RHJhZ0l0ZW1GbGF2b3JzLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChVSW50MTYgbnVtRmxhdm9ycykiKX0sCi0JeyJHZXRGbGF2b3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0Rmxhdm9yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBVSW50MTYgaW5kZXgpIC0+IChGbGF2b3JUeXBlIHRoZVR5cGUpIil9LAotCXsiR2V0Rmxhdm9yRmxhZ3MiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXRGbGF2b3JGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUpIC0+IChGbGF2b3JGbGFncyB0aGVGbGFncykiKX0sCi0JeyJHZXRGbGF2b3JEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGFTaXplLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIEZsYXZvclR5cGUgdGhlVHlwZSkgLT4gKFNpemUgZGF0YVNpemUpIil9LAotCXsiR2V0Rmxhdm9yRGF0YSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IChCdWZmZXIgZGF0YVB0cikiKX0sCi0JeyJHZXREcmFnSXRlbUJvdW5kcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdJdGVtQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChSZWN0IGl0ZW1Cb3VuZHMpIil9LAotCXsiU2V0RHJhZ0l0ZW1Cb3VuZHMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBSZWN0IGl0ZW1Cb3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJHZXREcm9wTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcm9wTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyBkcm9wTG9jYXRpb24pIil9LAotCXsiU2V0RHJvcExvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJvcExvY2F0aW9uLCAxLAotCSBQeURvY19TVFIoIihBRURlc2MgZHJvcExvY2F0aW9uKSAtPiBOb25lIil9LAotCXsiR2V0RHJhZ0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnQXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRHJhZ0F0dHJpYnV0ZXMgZmxhZ3MpIil9LAotCXsiR2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ01vdXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQb2ludCBtb3VzZSwgUG9pbnQgZ2xvYmFsUGlubmVkTW91c2UpIil9LAotCXsiU2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJhZ01vdXNlLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBnbG9iYWxQaW5uZWRNb3VzZSkgLT4gTm9uZSIpfSwKLQl7IkdldERyYWdPcmlnaW4iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnT3JpZ2luLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQb2ludCBnbG9iYWxJbml0aWFsTW91c2UpIil9LAotCXsiR2V0RHJhZ01vZGlmaWVycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdNb2RpZmllcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBtb2RpZmllcnMsIFNJbnQxNiBtb3VzZURvd25Nb2RpZmllcnMsIFNJbnQxNiBtb3VzZVVwTW9kaWZpZXJzKSIpfSwKLQl7IlNob3dEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2hvd0RyYWdIaWxpdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBoaWxpdGVGcmFtZSwgQm9vbGVhbiBpbnNpZGUpIC0+IE5vbmUiKX0sCi0JeyJIaWRlRHJhZ0hpbGl0ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0hpZGVEcmFnSGlsaXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEcmFnUHJlU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRHJhZ1ByZVNjcm9sbCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGRILCBTSW50MTYgZFYpIC0+IE5vbmUiKX0sCi0JeyJEcmFnUG9zdFNjcm9sbCIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0RyYWdQb3N0U2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfVXBkYXRlRHJhZ0hpbGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkRpc3Bvc2VEcmFnIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRGlzcG9zZURyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkFkZERyYWdJdGVtRmxhdm9yIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfQWRkRHJhZ0l0ZW1GbGF2b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgRmxhdm9yRmxhZ3MgdGhlRmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJTZXREcmFnSXRlbUZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUZsYXZvckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXREcmFnSW1hZ2UiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBpbWFnZVBpeE1hcCwgUmduSGFuZGxlIGltYWdlUmduLCBQb2ludCBpbWFnZU9mZnNldFB0LCBEcmFnSW1hZ2VGbGFncyB0aGVJbWFnZUZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiQ2hhbmdlRHJhZ0JlaGF2aW9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NoYW5nZURyYWdCZWhhdmlvcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKERyYWdCZWhhdmlvcnMgaW5CZWhhdmlvcnNUb1NldCwgRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFja0RyYWciLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9UcmFja0RyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIHRoZUV2ZW50LCBSZ25IYW5kbGUgdGhlUmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiQ291bnREcmFnSXRlbXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9Db3VudERyYWdJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IG51bUl0ZW1zKSIpfSwKKyAgICB7IkdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiBpbmRleCkgLT4gKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZikiKX0sCisgICAgeyJDb3VudERyYWdJdGVtRmxhdm9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NvdW50RHJhZ0l0ZW1GbGF2b3JzLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChVSW50MTYgbnVtRmxhdm9ycykiKX0sCisgICAgeyJHZXRGbGF2b3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0Rmxhdm9yVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBVSW50MTYgaW5kZXgpIC0+IChGbGF2b3JUeXBlIHRoZVR5cGUpIil9LAorICAgIHsiR2V0Rmxhdm9yRmxhZ3MiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXRGbGF2b3JGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUpIC0+IChGbGF2b3JGbGFncyB0aGVGbGFncykiKX0sCisgICAgeyJHZXRGbGF2b3JEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIEZsYXZvclR5cGUgdGhlVHlwZSkgLT4gKFNpemUgZGF0YVNpemUpIil9LAorICAgIHsiR2V0Rmxhdm9yRGF0YSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IChCdWZmZXIgZGF0YVB0cikiKX0sCisgICAgeyJHZXREcmFnSXRlbUJvdW5kcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdJdGVtQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChSZWN0IGl0ZW1Cb3VuZHMpIil9LAorICAgIHsiU2V0RHJhZ0l0ZW1Cb3VuZHMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBSZWN0IGl0ZW1Cb3VuZHMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREcm9wTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcm9wTG9jYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyBkcm9wTG9jYXRpb24pIil9LAorICAgIHsiU2V0RHJvcExvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJvcExvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihBRURlc2MgZHJvcExvY2F0aW9uKSAtPiBOb25lIil9LAorICAgIHsiR2V0RHJhZ0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnQXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRHJhZ0F0dHJpYnV0ZXMgZmxhZ3MpIil9LAorICAgIHsiR2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ01vdXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBtb3VzZSwgUG9pbnQgZ2xvYmFsUGlubmVkTW91c2UpIil9LAorICAgIHsiU2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJhZ01vdXNlLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBnbG9iYWxQaW5uZWRNb3VzZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERyYWdPcmlnaW4iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnT3JpZ2luLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBnbG9iYWxJbml0aWFsTW91c2UpIil9LAorICAgIHsiR2V0RHJhZ01vZGlmaWVycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdNb2RpZmllcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBtb2RpZmllcnMsIFNJbnQxNiBtb3VzZURvd25Nb2RpZmllcnMsIFNJbnQxNiBtb3VzZVVwTW9kaWZpZXJzKSIpfSwKKyAgICB7IlNob3dEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2hvd0RyYWdIaWxpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBoaWxpdGVGcmFtZSwgQm9vbGVhbiBpbnNpZGUpIC0+IE5vbmUiKX0sCisgICAgeyJIaWRlRHJhZ0hpbGl0ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0hpZGVEcmFnSGlsaXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEcmFnUHJlU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRHJhZ1ByZVNjcm9sbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGRILCBTSW50MTYgZFYpIC0+IE5vbmUiKX0sCisgICAgeyJEcmFnUG9zdFNjcm9sbCIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0RyYWdQb3N0U2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfVXBkYXRlRHJhZ0hpbGl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgRHJhZ09ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTc0Nyw2MSArNzQ3LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRHJhZ1JlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIERyYWdSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRHJhZ09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKERyYWdPYmpPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRHJhZ09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKERyYWdPYmpPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRHJhZ09ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBEcmFnT2JqX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0RyYWcuRHJhZ09iaiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKERyYWdPYmpPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBEcmFnT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIERyYWdPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIERyYWdPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIERyYWdPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRHJhZ09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlEcmFnT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCURyYWdPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCURyYWdPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRHJhZ09ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCURyYWdPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9EcmFnLkRyYWdPYmoiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihEcmFnT2JqT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRHJhZ09ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBEcmFnT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBEcmFnT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBEcmFnT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIERyYWdPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRHJhZ09ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBEcmFnT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBEcmFnT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIERyYWdPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBEcmFnT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBEcmFnT2JqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtODA5LDIwNCArODA5LDIwNCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfTmV3RHJhZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEcmFnUmVmIHRoZURyYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRHJhZ1JlZiB0aGVEcmFnOwogI2lmbmRlZiBOZXdEcmFnCi0JUHlNYWNfUFJFQ0hFQ0soTmV3RHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3RHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld0RyYWcoJnRoZURyYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX05ldywgdGhlRHJhZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdEcmFnKCZ0aGVEcmFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9OZXcsIHRoZURyYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfR2V0RHJhZ0hpbGl0ZUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgR2V0RHJhZ0hpbGl0ZUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ0hpbGl0ZUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREcmFnSGlsaXRlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcmFnSGlsaXRlQ29sb3Iod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RHJhZ0hpbGl0ZUNvbG9yKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX1dhaXRNb3VzZU1vdmVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBpbml0aWFsTW91c2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IGluaXRpYWxNb3VzZTsKICNpZm5kZWYgV2FpdE1vdXNlTW92ZWQKLQlQeU1hY19QUkVDSEVDSyhXYWl0TW91c2VNb3ZlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soV2FpdE1vdXNlTW92ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluaXRpYWxNb3VzZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFdhaXRNb3VzZU1vdmVkKGluaXRpYWxNb3VzZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluaXRpYWxNb3VzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFdhaXRNb3VzZU1vdmVkKGluaXRpYWxNb3VzZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ19ab29tUmVjdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmVjdCBmcm9tUmVjdDsKLQlSZWN0IHRvUmVjdDsKLQlTSW50MTYgem9vbVN0ZXBzOwotCVpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgZnJvbVJlY3Q7CisgICAgUmVjdCB0b1JlY3Q7CisgICAgU0ludDE2IHpvb21TdGVwczsKKyAgICBab29tQWNjZWxlcmF0aW9uIGFjY2VsZXJhdGlvbjsKICNpZm5kZWYgWm9vbVJlY3RzCi0JUHlNYWNfUFJFQ0hFQ0soWm9vbVJlY3RzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhab29tUmVjdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmZyb21SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdG9SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmem9vbVN0ZXBzLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWNjZWxlcmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFpvb21SZWN0cygmZnJvbVJlY3QsCi0JICAgICAgICAgICAgICAgICAmdG9SZWN0LAotCSAgICAgICAgICAgICAgICAgem9vbVN0ZXBzLAotCSAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZnJvbVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0b1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ6b29tU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2NlbGVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gWm9vbVJlY3RzKCZmcm9tUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICZ0b1JlY3QsCisgICAgICAgICAgICAgICAgICAgICB6b29tU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfWm9vbVJlZ2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCVBvaW50IHpvb21EaXN0YW5jZTsKLQlTSW50MTYgem9vbVN0ZXBzOwotCVpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJnbkhhbmRsZSByZWdpb247CisgICAgUG9pbnQgem9vbURpc3RhbmNlOworICAgIFNJbnQxNiB6b29tU3RlcHM7CisgICAgWm9vbUFjY2VsZXJhdGlvbiBhY2NlbGVyYXRpb247CiAjaWZuZGVmIFpvb21SZWdpb24KLQlQeU1hY19QUkVDSEVDSyhab29tUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhab29tUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnpvb21EaXN0YW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnpvb21TdGVwcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjY2VsZXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBab29tUmVnaW9uKHJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgICB6b29tRGlzdGFuY2UsCi0JICAgICAgICAgICAgICAgICAgem9vbVN0ZXBzLAotCSAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmem9vbURpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmem9vbVN0ZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjZWxlcmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFpvb21SZWdpb24ocmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgIHpvb21EaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICB6b29tU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX0luc3RhbGxUcmFja2luZ0hhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCSAgICBQeU9iamVjdCAqY2FsbGJhY2s7Ci0JICAgIFdpbmRvd1B0ciB0aGVXaW5kb3cgPSBOVUxMOwotCSAgICBPU0VyciBfZXJyOworICAgICAgICBQeU9iamVjdCAqY2FsbGJhY2s7CisgICAgICAgIFdpbmRvd1B0ciB0aGVXaW5kb3cgPSBOVUxMOworICAgICAgICBPU0VyciBfZXJyOwogCi0JICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPfE8mIiwgJmNhbGxiYWNrLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7ICAgICAgICAvKiBDYW5ub3QgZGVjcmVmIGxhdGVyLCB0b28gYmFkICovCi0JICAgIF9lcnIgPSBJbnN0YWxsVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKLQkgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICBfcmVzID0gUHlfTm9uZTsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiT3xPJiIsICZjYWxsYmFjaywgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7ICAgICAgICAvKiBDYW5ub3QgZGVjcmVmIGxhdGVyLCB0b28gYmFkICovCisgICAgICAgIF9lcnIgPSBJbnN0YWxsVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX0luc3RhbGxSZWNlaXZlSGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKLQkgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7Ci0JICAgIE9TRXJyIF9lcnI7CisgICAgICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKKyAgICAgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7CisgICAgICAgIE9TRXJyIF9lcnI7CiAKLQkgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk98TyYiLCAmY2FsbGJhY2ssIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsgICAgICAgIC8qIENhbm5vdCBkZWNyZWYgbGF0ZXIsIHRvbyBiYWQgKi8KLQkgICAgX2VyciA9IEluc3RhbGxSZWNlaXZlSGFuZGxlcihkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKLQkgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICBfcmVzID0gUHlfTm9uZTsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiT3xPJiIsICZjYWxsYmFjaywgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7ICAgICAgICAvKiBDYW5ub3QgZGVjcmVmIGxhdGVyLCB0b28gYmFkICovCisgICAgICAgIF9lcnIgPSBJbnN0YWxsUmVjZWl2ZUhhbmRsZXIoZHJhZ2dsdWVfUmVjZWl2ZUhhbmRsZXJVUFAsIHRoZVdpbmRvdywgKHZvaWQgKiljYWxsYmFjayk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgX3JlcyA9IFB5X05vbmU7CisgICAgICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ19SZW1vdmVUcmFja2luZ0hhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCSAgICBXaW5kb3dQdHIgdGhlV2luZG93ID0gTlVMTDsKLQkgICAgT1NFcnIgX2VycjsKKyAgICAgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7CisgICAgICAgIE9TRXJyIF9lcnI7CiAKLQkgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInxPJiIsIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgX2VyciA9IFJlbW92ZVRyYWNraW5nSGFuZGxlcihkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXJVUFAsIHRoZVdpbmRvdyk7Ci0JICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotCSAgICAgICAgX3JlcyA9IFB5X05vbmU7Ci0JICAgICAgICByZXR1cm4gX3JlczsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInxPJiIsIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBfZXJyID0gUmVtb3ZlVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93KTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX1JlbW92ZVJlY2VpdmVIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQkgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7Ci0JICAgIE9TRXJyIF9lcnI7CisgICAgICAgIFdpbmRvd1B0ciB0aGVXaW5kb3cgPSBOVUxMOworICAgICAgICBPU0VyciBfZXJyOwogCi0JICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ8TyYiLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIF9lcnIgPSBSZW1vdmVSZWNlaXZlSGFuZGxlcihkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlclVQUCwgdGhlV2luZG93KTsKLQkgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICBfcmVzID0gUHlfTm9uZTsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAifE8mIiwgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIF9lcnIgPSBSZW1vdmVSZWNlaXZlSGFuZGxlcihkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlclVQUCwgdGhlV2luZG93KTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIERyYWdfbWV0aG9kc1tdID0gewotCXsiTmV3RHJhZyIsIChQeUNGdW5jdGlvbilEcmFnX05ld0RyYWcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKERyYWdSZWYgdGhlRHJhZykiKX0sCi0JeyJHZXREcmFnSGlsaXRlQ29sb3IiLCAoUHlDRnVuY3Rpb24pRHJhZ19HZXREcmFnSGlsaXRlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3cpIC0+IChSR0JDb2xvciBjb2xvcikiKX0sCi0JeyJXYWl0TW91c2VNb3ZlZCIsIChQeUNGdW5jdGlvbilEcmFnX1dhaXRNb3VzZU1vdmVkLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpbml0aWFsTW91c2UpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJab29tUmVjdHMiLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVjdHMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgZnJvbVJlY3QsIFJlY3QgdG9SZWN0LCBTSW50MTYgem9vbVN0ZXBzLCBab29tQWNjZWxlcmF0aW9uIGFjY2VsZXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7Ilpvb21SZWdpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBQb2ludCB6b29tRGlzdGFuY2UsIFNJbnQxNiB6b29tU3RlcHMsIFpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uKSAtPiBOb25lIil9LAotCXsiSW5zdGFsbFRyYWNraW5nSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX0luc3RhbGxUcmFja2luZ0hhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0JeyJJbnN0YWxsUmVjZWl2ZUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19JbnN0YWxsUmVjZWl2ZUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0JeyJSZW1vdmVUcmFja2luZ0hhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19SZW1vdmVUcmFja2luZ0hhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0JeyJSZW1vdmVSZWNlaXZlSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX1JlbW92ZVJlY2VpdmVIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoTlVMTCl9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTmV3RHJhZyIsIChQeUNGdW5jdGlvbilEcmFnX05ld0RyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKERyYWdSZWYgdGhlRHJhZykiKX0sCisgICAgeyJHZXREcmFnSGlsaXRlQ29sb3IiLCAoUHlDRnVuY3Rpb24pRHJhZ19HZXREcmFnSGlsaXRlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3cpIC0+IChSR0JDb2xvciBjb2xvcikiKX0sCisgICAgeyJXYWl0TW91c2VNb3ZlZCIsIChQeUNGdW5jdGlvbilEcmFnX1dhaXRNb3VzZU1vdmVkLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBpbml0aWFsTW91c2UpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJab29tUmVjdHMiLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVjdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgZnJvbVJlY3QsIFJlY3QgdG9SZWN0LCBTSW50MTYgem9vbVN0ZXBzLCBab29tQWNjZWxlcmF0aW9uIGFjY2VsZXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7Ilpvb21SZWdpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBQb2ludCB6b29tRGlzdGFuY2UsIFNJbnQxNiB6b29tU3RlcHMsIFpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiSW5zdGFsbFRyYWNraW5nSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX0luc3RhbGxUcmFja2luZ0hhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJJbnN0YWxsUmVjZWl2ZUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19JbnN0YWxsUmVjZWl2ZUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJSZW1vdmVUcmFja2luZ0hhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19SZW1vdmVUcmFja2luZ0hhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJSZW1vdmVSZWNlaXZlSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX1JlbW92ZVJlY2VpdmVIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoTlVMTCl9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0xMDE1LDgxICsxMDE1LDgxIEBACiBkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXIoRHJhZ1RyYWNraW5nTWVzc2FnZSB0aGVNZXNzYWdlLCBXaW5kb3dQdHIgdGhlV2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmhhbmRsZXJSZWZDb24sIERyYWdSZWZlcmVuY2UgdGhlRHJhZykKIHsKLSAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpydjsKLSAgICAgICAgaW50IGk7CisgICAgUHlPYmplY3QgKmFyZ3MsICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLCB0aGVNZXNzYWdlLCBEcmFnT2JqX05ldywgdGhlRHJhZywgV2luT2JqX1doaWNoV2luZG93LCB0aGVXaW5kb3cpOwotICAgICAgICBpZiAoIGFyZ3MgPT0gTlVMTCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKWhhbmRsZXJSZWZDb24sIGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmICggcnYgPT0gTlVMTCApIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFRyYWNraW5nSGFuZGxlclxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IC0xOwotICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gaTsKKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLCB0aGVNZXNzYWdlLCBEcmFnT2JqX05ldywgdGhlRHJhZywgV2luT2JqX1doaWNoV2luZG93LCB0aGVXaW5kb3cpOworICAgIGlmICggYXJncyA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QoKFB5T2JqZWN0ICopaGFuZGxlclJlZkNvbiwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIGlmICggcnYgPT0gTlVMTCApIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkRyYWc6IEV4Y2VwdGlvbiBpbiBUcmFja2luZ0hhbmRsZXJcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGkgPSAtMTsKKyAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQorICAgICAgICBpID0gMDsKKyAgICBlbHNlCisgICAgICAgIFB5QXJnX1BhcnNlKHJ2LCAibCIsICZpKTsKKyAgICBQeV9ERUNSRUYocnYpOworICAgIHJldHVybiBpOwogfQogCiBzdGF0aWMgcGFzY2FsIE9TRXJyCiBkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlcihXaW5kb3dQdHIgdGhlV2luZG93LCB2b2lkICpoYW5kbGVyUmVmQ29uLAogICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKQogewotICAgICAgICBQeU9iamVjdCAqYXJncywgKnJ2OwotICAgICAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqYXJncywgKnJ2OworICAgIGludCBpOwogCi0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgRHJhZ09ial9OZXcsIHRoZURyYWcsIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKLSAgICAgICAgaWYgKCBhcmdzID09IE5VTEwgKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdCgoUHlPYmplY3QgKiloYW5kbGVyUmVmQ29uLCBhcmdzKTsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAoIHJ2ID09IE5VTEwgKSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkRyYWc6IEV4Y2VwdGlvbiBpbiBSZWNlaXZlSGFuZGxlclxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IC0xOwotICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gaTsKKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsIERyYWdPYmpfTmV3LCB0aGVEcmFnLCBXaW5PYmpfV2hpY2hXaW5kb3csIHRoZVdpbmRvdyk7CisgICAgaWYgKCBhcmdzID09IE5VTEwgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdCgoUHlPYmplY3QgKiloYW5kbGVyUmVmQ29uLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFJlY2VpdmVIYW5kbGVyXG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpID0gLTE7CisgICAgaWYgKCBydiA9PSBQeV9Ob25lICkKKyAgICAgICAgaSA9IDA7CisgICAgZWxzZQorICAgICAgICBQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7CisgICAgUHlfREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gaTsKIH0KIAogc3RhdGljIHBhc2NhbCBPU0VycgogZHJhZ2dsdWVfU2VuZERhdGEoRmxhdm9yVHlwZSB0aGVUeXBlLCB2b2lkICpkcmFnU2VuZFJlZkNvbiwKICAgICAgICAgICAgICAgICAgICAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW0sIERyYWdSZWZlcmVuY2UgdGhlRHJhZykKIHsKLSAgICAgICAgRHJhZ09iak9iamVjdCAqc2VsZiA9IChEcmFnT2JqT2JqZWN0ICopZHJhZ1NlbmRSZWZDb247Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIERyYWdPYmpPYmplY3QgKnNlbGYgPSAoRHJhZ09iak9iamVjdCAqKWRyYWdTZW5kUmVmQ29uOworICAgIFB5T2JqZWN0ICphcmdzLCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCBzZWxmLT5zZW5kcHJvYyA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSwgdGhlSXRlbSk7Ci0gICAgICAgIGlmICggYXJncyA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3Qoc2VsZi0+c2VuZHByb2MsIGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmICggcnYgPT0gTlVMTCApIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFNlbmREYXRhSGFuZGxlclxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IC0xOwotICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gaTsKKyAgICBpZiAoIHNlbGYtPnNlbmRwcm9jID09IE5VTEwgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlLCB0aGVJdGVtKTsKKyAgICBpZiAoIGFyZ3MgPT0gTlVMTCApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KHNlbGYtPnNlbmRwcm9jLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFNlbmREYXRhSGFuZGxlclxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaSA9IC0xOworICAgIGlmICggcnYgPT0gUHlfTm9uZSApCisgICAgICAgIGkgPSAwOworICAgIGVsc2UKKyAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOworICAgIFB5X0RFQ1JFRihydik7CisgICAgcmV0dXJuIGk7CiB9CiAKICNpZiAwCkBAIC0xMTA5LDQ1ICsxMTA5LDQ1IEBACiAjZW5kaWYKICNlbHNlIC8qIF9fTFA2NF9fICovCiBzdGF0aWMgUHlNZXRob2REZWYgRHJhZ19tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAogdm9pZCBpbml0X0RyYWcodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERyYWdSZWYsIERyYWdPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChEcmFnUmVmLCBEcmFnT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhEcmFnUmVmLCBEcmFnT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChEcmFnUmVmLCBEcmFnT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0RyYWciLCBEcmFnX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRHJhZyIsIERyYWdfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JRHJhZ19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKERyYWdfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBEcmFnX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JRHJhZ09ial9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRHJhZ09ial9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkRyYWdPYmpfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEcmFnT2JqIiwgKFB5T2JqZWN0ICopJkRyYWdPYmpfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZEcmFnT2JqX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRHJhZ09ialR5cGUiLCAoUHlPYmplY3QgKikmRHJhZ09ial9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBEcmFnX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoRHJhZ19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIERyYWdfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBEcmFnT2JqX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZEcmFnT2JqX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRHJhZ09ial9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRyYWdPYmoiLCAoUHlPYmplY3QgKikmRHJhZ09ial9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkRyYWdPYmpfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEcmFnT2JqVHlwZSIsIChQeU9iamVjdCAqKSZEcmFnT2JqX1R5cGUpOwogCi0JZHJhZ2dsdWVfVHJhY2tpbmdIYW5kbGVyVVBQID0gTmV3RHJhZ1RyYWNraW5nSGFuZGxlclVQUChkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXIpOwotCWRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyVVBQID0gTmV3RHJhZ1JlY2VpdmVIYW5kbGVyVVBQKGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyKTsKLQlkcmFnZ2x1ZV9TZW5kRGF0YVVQUCA9IE5ld0RyYWdTZW5kRGF0YVVQUChkcmFnZ2x1ZV9TZW5kRGF0YSk7CisgICAgZHJhZ2dsdWVfVHJhY2tpbmdIYW5kbGVyVVBQID0gTmV3RHJhZ1RyYWNraW5nSGFuZGxlclVQUChkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXIpOworICAgIGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyVVBQID0gTmV3RHJhZ1JlY2VpdmVIYW5kbGVyVVBQKGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyKTsKKyAgICBkcmFnZ2x1ZV9TZW5kRGF0YVVQUCA9IE5ld0RyYWdTZW5kRGF0YVVQUChkcmFnZ2x1ZV9TZW5kRGF0YSk7CiAjaWYgMAotCWRyYWdnbHVlX0lucHV0VVBQID0gTmV3RHJhZ0lucHV0VVBQKGRyYWdnbHVlX0lucHV0KTsKLQlkcmFnZ2x1ZV9EcmF3aW5nVVBQID0gTmV3RHJhZ0RyYXdpbmdVUFAoZHJhZ2dsdWVfRHJhd2luZyk7CisgICAgZHJhZ2dsdWVfSW5wdXRVUFAgPSBOZXdEcmFnSW5wdXRVUFAoZHJhZ2dsdWVfSW5wdXQpOworICAgIGRyYWdnbHVlX0RyYXdpbmdVUFAgPSBOZXdEcmFnRHJhd2luZ1VQUChkcmFnZ2x1ZV9EcmF3aW5nKTsKICNlbmRpZgogCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9ldnQvX0V2dG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvZXZ0L19FdnRtb2R1bGUuYwppbmRleCAwNGYzYjIzLi5iZDYxZWZhIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9ldnQvX0V2dG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2V2dC9fRXZ0bW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIzLDUzNSArMjMsNTM1IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldE1vdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBtb3VzZUxvYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgbW91c2VMb2M7CiAjaWZuZGVmIEdldE1vdXNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW91c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNb3VzZSgmbW91c2VMb2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgbW91c2VMb2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3VzZSgmbW91c2VMb2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgbW91c2VMb2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9CdXR0b24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQnV0dG9uCi0JUHlNYWNfUFJFQ0hFQ0soQnV0dG9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCdXR0b24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEJ1dHRvbigpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBCdXR0b24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfU3RpbGxEb3duKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFN0aWxsRG93bgotCVB5TWFjX1BSRUNIRUNLKFN0aWxsRG93bik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RpbGxEb3duKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTdGlsbERvd24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3RpbGxEb3duKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1dhaXRNb3VzZVVwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFdhaXRNb3VzZVVwCi0JUHlNYWNfUFJFQ0hFQ0soV2FpdE1vdXNlVXApOworICAgIFB5TWFjX1BSRUNIRUNLKFdhaXRNb3VzZVVwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBXYWl0TW91c2VVcCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBXYWl0TW91c2VVcCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9HZXRDYXJldFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENhcmV0VGltZQotCVB5TWFjX1BSRUNIRUNLKEdldENhcmV0VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q2FyZXRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDYXJldFRpbWUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q2FyZXRUaW1lKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldEtleXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUtleU1hcCB0aGVLZXlzX19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgS2V5TWFwIHRoZUtleXNfX291dF9fOwogI2lmbmRlZiBHZXRLZXlzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0S2V5cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0S2V5cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0S2V5cyh0aGVLZXlzX19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVLZXlzX19vdXRfXywgKGludClzaXplb2YoS2V5TWFwKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEtleXModGhlS2V5c19fb3V0X18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlS2V5c19fb3V0X18sIChpbnQpc2l6ZW9mKEtleU1hcCkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9HZXREYmxUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OwogI2lmbmRlZiBHZXREYmxUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGJsVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGJsVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGJsVGltZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXREYmxUaW1lKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1NldEV2ZW50TWFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRNYXNrIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudE1hc2sgdmFsdWU7CiAjaWZuZGVmIFNldEV2ZW50TWFzawotCVB5TWFjX1BSRUNIRUNLKFNldEV2ZW50TWFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RXZlbnRNYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRFdmVudE1hc2sodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0RXZlbnRNYXNrKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldE5leHRFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRNYXNrIGV2ZW50TWFzazsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRNYXNrIGV2ZW50TWFzazsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKICNpZm5kZWYgR2V0TmV4dEV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dEV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXh0RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0RXZlbnQoZXZlbnRNYXNrLAotCSAgICAgICAgICAgICAgICAgICAmdGhlRXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dEV2ZW50KGV2ZW50TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfRXZlbnRBdmFpbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRNYXNrIGV2ZW50TWFzazsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRNYXNrIGV2ZW50TWFzazsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKICNpZm5kZWYgRXZlbnRBdmFpbAotCVB5TWFjX1BSRUNIRUNLKEV2ZW50QXZhaWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEV2ZW50QXZhaWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBFdmVudEF2YWlsKGV2ZW50TWFzaywKLQkgICAgICAgICAgICAgICAgICZ0aGVFdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZ0aGVFdmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBFdmVudEF2YWlsKGV2ZW50TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVFdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZ0aGVFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1Bvc3RFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlFdmVudEtpbmQgZXZlbnROdW07Ci0JVUludDMyIGV2ZW50TXNnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEV2ZW50S2luZCBldmVudE51bTsKKyAgICBVSW50MzIgZXZlbnRNc2c7CiAjaWZuZGVmIFBvc3RFdmVudAotCVB5TWFjX1BSRUNIRUNLKFBvc3RFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUG9zdEV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRNc2cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUG9zdEV2ZW50KGV2ZW50TnVtLAotCSAgICAgICAgICAgICAgICAgZXZlbnRNc2cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRNc2cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUG9zdEV2ZW50KGV2ZW50TnVtLAorICAgICAgICAgICAgICAgICAgICAgZXZlbnRNc2cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9GbHVzaEV2ZW50cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRNYXNrIHdoaWNoTWFzazsKLQlFdmVudE1hc2sgc3RvcE1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50TWFzayB3aGljaE1hc2s7CisgICAgRXZlbnRNYXNrIHN0b3BNYXNrOwogI2lmbmRlZiBGbHVzaEV2ZW50cwotCVB5TWFjX1BSRUNIRUNLKEZsdXNoRXZlbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbHVzaEV2ZW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJISCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaE1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzdG9wTWFzaykpCi0JCXJldHVybiBOVUxMOwotCUZsdXNoRXZlbnRzKHdoaWNoTWFzaywKLQkgICAgICAgICAgICBzdG9wTWFzayk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0b3BNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmx1c2hFdmVudHMod2hpY2hNYXNrLAorICAgICAgICAgICAgICAgIHN0b3BNYXNrKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldEdsb2JhbE1vdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBnbG9iYWxNb3VzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgZ2xvYmFsTW91c2U7CiAjaWZuZGVmIEdldEdsb2JhbE1vdXNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R2xvYmFsTW91c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdsb2JhbE1vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRHbG9iYWxNb3VzZSgmZ2xvYmFsTW91c2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZ2xvYmFsTW91c2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRHbG9iYWxNb3VzZSgmZ2xvYmFsTW91c2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZ2xvYmFsTW91c2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9HZXRDdXJyZW50S2V5TW9kaWZpZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDdXJyZW50S2V5TW9kaWZpZXJzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q3VycmVudEtleU1vZGlmaWVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q3VycmVudEtleU1vZGlmaWVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q3VycmVudEtleU1vZGlmaWVycygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDdXJyZW50S2V5TW9kaWZpZXJzKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0NoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbAotCVB5TWFjX1BSRUNIRUNLKENoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKENoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9LZXlTY3JpcHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGNvZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGNvZGU7CiAjaWZuZGVmIEtleVNjcmlwdAotCVB5TWFjX1BSRUNIRUNLKEtleVNjcmlwdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soS2V5U2NyaXB0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29kZSkpCi0JCXJldHVybiBOVUxMOwotCUtleVNjcmlwdChjb2RlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgS2V5U2NyaXB0KGNvZGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfSXNDbWRDaGFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCBldmVudDsKLQlzaG9ydCB0ZXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCBldmVudDsKKyAgICBzaG9ydCB0ZXN0OwogI2lmbmRlZiBJc0NtZENoYXIKLQlQeU1hY19QUkVDSEVDSyhJc0NtZENoYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKElzQ21kQ2hhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVzdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzQ21kQ2hhcigmZXZlbnQsCi0JICAgICAgICAgICAgICAgIHRlc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNDbWRDaGFyKCZldmVudCwKKyAgICAgICAgICAgICAgICAgICAgdGVzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0xNR2V0S2V5VGhyZXNoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBMTUdldEtleVRocmVzaAotCVB5TWFjX1BSRUNIRUNLKExNR2V0S2V5VGhyZXNoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldEtleVRocmVzaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRLZXlUaHJlc2goKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRLZXlUaHJlc2goKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1TZXRLZXlUaHJlc2goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHZhbHVlOwogI2lmbmRlZiBMTVNldEtleVRocmVzaAotCVB5TWFjX1BSRUNIRUNLKExNU2V0S2V5VGhyZXNoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEtleVRocmVzaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRLZXlUaHJlc2godmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRLZXlUaHJlc2godmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1HZXRLZXlSZXBUaHJlc2goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIExNR2V0S2V5UmVwVGhyZXNoCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRLZXlSZXBUaHJlc2gpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0S2V5UmVwVGhyZXNoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldEtleVJlcFRocmVzaCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEtleVJlcFRocmVzaCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTVNldEtleVJlcFRocmVzaChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgdmFsdWU7CiAjaWZuZGVmIExNU2V0S2V5UmVwVGhyZXNoCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRLZXlSZXBUaHJlc2gpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0S2V5UmVwVGhyZXNoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldEtleVJlcFRocmVzaCh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEtleVJlcFRocmVzaCh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTUdldEtiZExhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggX3J2OwogI2lmbmRlZiBMTUdldEtiZExhc3QKLQlQeU1hY19QUkVDSEVDSyhMTUdldEtiZExhc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0S2JkTGFzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRLYmRMYXN0KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0S2JkTGFzdCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTVNldEtiZExhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50OCB2YWx1ZTsKICNpZm5kZWYgTE1TZXRLYmRMYXN0Ci0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRLYmRMYXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEtiZExhc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0S2JkTGFzdCh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEtiZExhc3QodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1HZXRLYmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IF9ydjsKICNpZm5kZWYgTE1HZXRLYmRUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRLYmRUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldEtiZFR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0S2JkVHlwZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEtiZFR5cGUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1TZXRLYmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggdmFsdWU7CiAjaWZuZGVmIExNU2V0S2JkVHlwZQotCVB5TWFjX1BSRUNIRUNLKExNU2V0S2JkVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRLYmRUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldEtiZFR5cGUodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRLYmRUeXBlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1RpY2tDb3VudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKICNpZm5kZWYgVGlja0NvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soVGlja0NvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUaWNrQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRpY2tDb3VudCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUaWNrQ291bnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfV2FpdE5leHRFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRNYXNrIGV2ZW50TWFzazsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKLQlVSW50MzIgc2xlZXA7Ci0JSGFuZGxlIG1vdXNlcmVnaW9uID0gKEhhbmRsZSkwOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50TWFzayBldmVudE1hc2s7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgVUludDMyIHNsZWVwOworICAgIEhhbmRsZSBtb3VzZXJlZ2lvbiA9IChIYW5kbGUpMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsfE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNsZWVwLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJm1vdXNlcmVnaW9uKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9ydiA9IFdhaXROZXh0RXZlbnQoZXZlbnRNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgc2xlZXAsCi0JICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKW1vdXNlcmVnaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIbHxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGVlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtb3VzZXJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFdhaXROZXh0RXZlbnQoZXZlbnRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKW1vdXNlcmVnaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZ0X21ldGhvZHNbXSA9IHsKLQl7IkdldE1vdXNlIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRNb3VzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUG9pbnQgbW91c2VMb2MpIil9LAotCXsiQnV0dG9uIiwgKFB5Q0Z1bmN0aW9uKUV2dF9CdXR0b24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlN0aWxsRG93biIsIChQeUNGdW5jdGlvbilFdnRfU3RpbGxEb3duLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJXYWl0TW91c2VVcCIsIChQeUNGdW5jdGlvbilFdnRfV2FpdE1vdXNlVXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldENhcmV0VGltZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0Q2FyZXRUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKLQl7IkdldEtleXMiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldEtleXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEtleU1hcCB0aGVLZXlzKSIpfSwKLQl7IkdldERibFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldERibFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiU2V0RXZlbnRNYXNrIiwgKFB5Q0Z1bmN0aW9uKUV2dF9TZXRFdmVudE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50TWFzayB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkdldE5leHRFdmVudCIsIChQeUNGdW5jdGlvbilFdnRfR2V0TmV4dEV2ZW50LCAxLAotCSBQeURvY19TVFIoIihFdmVudE1hc2sgZXZlbnRNYXNrKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKLQl7IkV2ZW50QXZhaWwiLCAoUHlDRnVuY3Rpb24pRXZ0X0V2ZW50QXZhaWwsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50TWFzayBldmVudE1hc2spIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIil9LAotCXsiUG9zdEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUV2dF9Qb3N0RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50S2luZCBldmVudE51bSwgVUludDMyIGV2ZW50TXNnKSAtPiBOb25lIil9LAotCXsiRmx1c2hFdmVudHMiLCAoUHlDRnVuY3Rpb24pRXZ0X0ZsdXNoRXZlbnRzLCAxLAotCSBQeURvY19TVFIoIihFdmVudE1hc2sgd2hpY2hNYXNrLCBFdmVudE1hc2sgc3RvcE1hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRHbG9iYWxNb3VzZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0R2xvYmFsTW91c2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IGdsb2JhbE1vdXNlKSIpfSwKLQl7IkdldEN1cnJlbnRLZXlNb2RpZmllcnMiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldEN1cnJlbnRLZXlNb2RpZmllcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCIsIChQeUNGdW5jdGlvbilFdnRfQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiS2V5U2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKUV2dF9LZXlTY3JpcHQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvZGUpIC0+IE5vbmUiKX0sCi0JeyJJc0NtZENoYXIiLCAoUHlDRnVuY3Rpb24pRXZ0X0lzQ21kQ2hhciwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZXZlbnQsIHNob3J0IHRlc3QpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJMTUdldEtleVRocmVzaCIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLZXlUaHJlc2gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiTE1TZXRLZXlUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2V5VGhyZXNoLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEtleVJlcFRocmVzaCIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLZXlSZXBUaHJlc2gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiTE1TZXRLZXlSZXBUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2V5UmVwVGhyZXNoLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEtiZExhc3QiLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2JkTGFzdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKLQl7IkxNU2V0S2JkTGFzdCIsIChQeUNGdW5jdGlvbilFdnRfTE1TZXRLYmRMYXN0LCAxLAotCSBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0S2JkVHlwZSIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLYmRUeXBlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAotCXsiTE1TZXRLYmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTVNldEtiZFR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAotCXsiVGlja0NvdW50IiwgKFB5Q0Z1bmN0aW9uKUV2dF9UaWNrQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiV2FpdE5leHRFdmVudCIsIChQeUNGdW5jdGlvbilFdnRfV2FpdE5leHRFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIGV2ZW50TWFzaywgVUludDMyIHNsZWVwIFssUmVnaW9uSGFuZGxlXSkgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCB0aGVFdmVudCkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJHZXRNb3VzZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0TW91c2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IG1vdXNlTG9jKSIpfSwKKyAgICB7IkJ1dHRvbiIsIChQeUNGdW5jdGlvbilFdnRfQnV0dG9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTdGlsbERvd24iLCAoUHlDRnVuY3Rpb24pRXZ0X1N0aWxsRG93biwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiV2FpdE1vdXNlVXAiLCAoUHlDRnVuY3Rpb24pRXZ0X1dhaXRNb3VzZVVwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRDYXJldFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldENhcmV0VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJHZXRLZXlzIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRLZXlzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChLZXlNYXAgdGhlS2V5cykiKX0sCisgICAgeyJHZXREYmxUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXREYmxUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IlNldEV2ZW50TWFzayIsIChQeUNGdW5jdGlvbilFdnRfU2V0RXZlbnRNYXNrLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudE1hc2sgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXROZXh0RXZlbnQiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldE5leHRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIGV2ZW50TWFzaykgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCB0aGVFdmVudCkiKX0sCisgICAgeyJFdmVudEF2YWlsIiwgKFB5Q0Z1bmN0aW9uKUV2dF9FdmVudEF2YWlsLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudE1hc2sgZXZlbnRNYXNrKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKKyAgICB7IlBvc3RFdmVudCIsIChQeUNGdW5jdGlvbilFdnRfUG9zdEV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudEtpbmQgZXZlbnROdW0sIFVJbnQzMiBldmVudE1zZykgLT4gTm9uZSIpfSwKKyAgICB7IkZsdXNoRXZlbnRzIiwgKFB5Q0Z1bmN0aW9uKUV2dF9GbHVzaEV2ZW50cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIHdoaWNoTWFzaywgRXZlbnRNYXNrIHN0b3BNYXNrKSAtPiBOb25lIil9LAorICAgIHsiR2V0R2xvYmFsTW91c2UiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldEdsb2JhbE1vdXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBnbG9iYWxNb3VzZSkiKX0sCisgICAgeyJHZXRDdXJyZW50S2V5TW9kaWZpZXJzIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRDdXJyZW50S2V5TW9kaWZpZXJzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IkNoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwiLCAoUHlDRnVuY3Rpb24pRXZ0X0NoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IktleVNjcmlwdCIsIChQeUNGdW5jdGlvbilFdnRfS2V5U2NyaXB0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb2RlKSAtPiBOb25lIil9LAorICAgIHsiSXNDbWRDaGFyIiwgKFB5Q0Z1bmN0aW9uKUV2dF9Jc0NtZENoYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGV2ZW50LCBzaG9ydCB0ZXN0KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTE1HZXRLZXlUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2V5VGhyZXNoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkxNU2V0S2V5VGhyZXNoIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTVNldEtleVRocmVzaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRLZXlSZXBUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2V5UmVwVGhyZXNoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkxNU2V0S2V5UmVwVGhyZXNoIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTVNldEtleVJlcFRocmVzaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRLYmRMYXN0IiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTUdldEtiZExhc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCisgICAgeyJMTVNldEtiZExhc3QiLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2JkTGFzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDggdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldEtiZFR5cGUiLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2JkVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKKyAgICB7IkxNU2V0S2JkVHlwZSIsIChQeUNGdW5jdGlvbilFdnRfTE1TZXRLYmRUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlRpY2tDb3VudCIsIChQeUNGdW5jdGlvbilFdnRfVGlja0NvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IldhaXROZXh0RXZlbnQiLCAoUHlDRnVuY3Rpb24pRXZ0X1dhaXROZXh0RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50TWFzayBldmVudE1hc2ssIFVJbnQzMiBzbGVlcCBbLFJlZ2lvbkhhbmRsZV0pIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCiAjZWxzZSAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZ0X21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiB2b2lkIGluaXRfRXZ0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfRXZ0IiwgRXZ0X21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRXZ0IiwgRXZ0X21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUV2dF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEV2dF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEV2dF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEV2dF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEV2dF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEV2dF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2ZpbGUvX0ZpbGVtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2ZpbGUvX0ZpbGVtb2R1bGUuYwppbmRleCAyMmUxMmVjLi5lYjViMTZkIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9maWxlL19GaWxlbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZmlsZS9fRmlsZW1vZHVsZS5jCkBAIC04LDE0ICs4LDE0IEBACiAjaW5jbHVkZSAicHltYWN0b29sYm94LmgiCiAKICNpZm5kZWYgSEFWRV9PU1gxMDVfU0RLCi10eXBlZGVmIFNJbnQxNglGU0lPUmVmTnVtOwordHlwZWRlZiBTSW50MTYgIEZTSU9SZWZOdW07CiAjZW5kaWYKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM1LDcgKzM1LDcgQEAKICNkZWZpbmUgUHlNYWNfR2V0RlNTcGVjIF9QeU1hY19HZXRGU1NwZWMKICNkZWZpbmUgUHlNYWNfR2V0RlNSZWYgX1B5TWFjX0dldEZTUmVmCiAKLSNlbHNlCS8qICFVU0VfVE9PTEJPWF9PQkpFQ1RfR0xVRSAqLworI2Vsc2UgICAvKiAhVVNFX1RPT0xCT1hfT0JKRUNUX0dMVUUgKi8KIAogI2lmbmRlZiBfX0xQNjRfXwogZXh0ZXJuIGludCBQeU1hY19HZXRGU1NwZWMoUHlPYmplY3QgKnYsIEZTU3BlYyAqc3BlYyk7CkBAIC00NSw3ICs0NSw3IEBACiBleHRlcm4gaW50IFB5TWFjX0dldEZTUmVmKFB5T2JqZWN0ICp2LCBGU1JlZiAqZnNyKTsKIGV4dGVybiBQeU9iamVjdCAqUHlNYWNfQnVpbGRGU1JlZihGU1JlZiAqc3BlYyk7CiAKLSNlbmRpZgkvKiAhVVNFX1RPT0xCT1hfT0JKRUNUX0dMVUUgKi8KKyNlbmRpZiAgLyogIVVTRV9UT09MQk9YX09CSkVDVF9HTFVFICovCiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX05ldyhGU1JlZiAqaXRzZWxmKTsKQEAgLTY5LDEzICs2OSwxMyBAQAogc3RhdGljIGludAogVVRDRGF0ZVRpbWVfQ29udmVydChQeU9iamVjdCAqdiwgVVRDRGF0ZVRpbWUgKnB0cikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSGxIKSIsICZwdHItPmhpZ2hTZWNvbmRzLCAmcHRyLT5sb3dTZWNvbmRzLCAmcHRyLT5mcmFjdGlvbik7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSGxIKSIsICZwdHItPmhpZ2hTZWNvbmRzLCAmcHRyLT5sb3dTZWNvbmRzLCAmcHRyLT5mcmFjdGlvbik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBVVENEYXRlVGltZV9OZXcoVVRDRGF0ZVRpbWUgKnB0cikKIHsKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihIbEgpIiwgcHRyLT5oaWdoU2Vjb25kcywgcHRyLT5sb3dTZWNvbmRzLCBwdHItPmZyYWN0aW9uKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKEhsSCkiLCBwdHItPmhpZ2hTZWNvbmRzLCBwdHItPmxvd1NlY29uZHMsIHB0ci0+ZnJhY3Rpb24pOwogfQogCiAvKgpAQCAtODUsMjIgKzg1LDIyIEBACiBzdGF0aWMgaW50CiBteVB5TWFjX0dldE9wdEZTU3BlY1B0cihQeU9iamVjdCAqdiwgRlNTcGVjICoqc3BlYykKIHsKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgICpzcGVjID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUHlNYWNfR2V0RlNTcGVjKHYsICpzcGVjKTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgICpzcGVjID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBQeU1hY19HZXRGU1NwZWModiwgKnNwZWMpOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgaW50CiBteVB5TWFjX0dldE9wdEZTUmVmUHRyKFB5T2JqZWN0ICp2LCBGU1JlZiAqKnJlZikKIHsKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgICpyZWYgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQeU1hY19HZXRGU1JlZih2LCAqcmVmKTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgICpyZWYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIFB5TWFjX0dldEZTUmVmKHYsICpyZWYpOwogfQogCiAvKgpAQCAtMTEwLDUyICsxMTAsNTIgQEAKIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1KEhGU1VuaVN0cjI1NSAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ1IyIsIGl0c2VsZi0+dW5pY29kZSwgaXRzZWxmLT5sZW5ndGgpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ1IyIsIGl0c2VsZi0+dW5pY29kZSwgaXRzZWxmLT5sZW5ndGgpOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgT1NFcnIKIF9QeU1hY19HZXRGdWxsUGF0aG5hbWUoRlNTcGVjICpmc3MsIGNoYXIgKnBhdGgsIGludCBsZW4pCiB7Ci0JRlNSZWYgZnNyOwotCU9TRXJyIGVycjsKKyAgICBGU1JlZiBmc3I7CisgICAgT1NFcnIgZXJyOwogCi0JKnBhdGggPSAnXDAnOwotCWVyciA9IEZTcE1ha2VGU1JlZihmc3MsICZmc3IpOwotCWlmIChlcnIgPT0gZm5mRXJyKSB7Ci0JCS8qIEZTU3BlY3MgY2FuIHBvaW50IHRvIG5vbi1leGlzdGluZyBmaWxlcywgZnNyZWZzIGNhbid0LiAqLwotCQlGU1NwZWMgZnNzMjsKLQkJaW50IHRvY29weTsKKyAgICAqcGF0aCA9ICdcMCc7CisgICAgZXJyID0gRlNwTWFrZUZTUmVmKGZzcywgJmZzcik7CisgICAgaWYgKGVyciA9PSBmbmZFcnIpIHsKKyAgICAgICAgLyogRlNTcGVjcyBjYW4gcG9pbnQgdG8gbm9uLWV4aXN0aW5nIGZpbGVzLCBmc3JlZnMgY2FuJ3QuICovCisgICAgICAgIEZTU3BlYyBmc3MyOworICAgICAgICBpbnQgdG9jb3B5OwogCi0JCWVyciA9IEZTTWFrZUZTU3BlYyhmc3MtPnZSZWZOdW0sIGZzcy0+cGFySUQsCi0JCQkJICAgKHVuc2lnbmVkIGNoYXIqKSIiLCAmZnNzMik7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQllcnIgPSBGU3BNYWtlRlNSZWYoJmZzczIsICZmc3IpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gKE9TRXJyKUZTUmVmTWFrZVBhdGgoJmZzciwgKHVuc2lnbmVkIGNoYXIqKXBhdGgsIGxlbi0xKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCS8qIFRoaXMgcGFydCBpcyBub3QgMTAwJSBzYWZlOiB3ZSBhcHBlbmQgdGhlIGZpbGVuYW1lIHBhcnQsIGJ1dAotCQkqKiBJJ20gbm90IHN1cmUgdGhhdCB3ZSBkb24ndCBydW4gYWZvdWwgb2YgdGhlIHZhcmlvdXMgOGJpdAotCQkqKiBlbmNvZGluZ3MgaGVyZS4gV2lsbCBoYXZlIHRvIGxvb2sgdGhpcyB1cCBhdCBzb21lIHBvaW50Li4uCi0JCSovCi0JCXN0cmNhdChwYXRoLCAiLyIpOwotCQl0b2NvcHkgPSBmc3MtPm5hbWVbMF07Ci0JCWlmICgoc3RybGVuKHBhdGgpICsgdG9jb3B5KSA+PSBsZW4pCi0JCQl0b2NvcHkgPSBsZW4gLSBzdHJsZW4ocGF0aCkgLSAxOwotCQlpZiAodG9jb3B5ID4gMCkKLQkJCXN0cm5jYXQocGF0aCwgKGNoYXIqKWZzcy0+bmFtZSsxLCB0b2NvcHkpOwotCX0KLQllbHNlIHsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWVyciA9IChPU0VycilGU1JlZk1ha2VQYXRoKCZmc3IsICh1bnNpZ25lZCBjaGFyKilwYXRoLCBsZW4pOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGVyciA9IEZTTWFrZUZTU3BlYyhmc3MtPnZSZWZOdW0sIGZzcy0+cGFySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciopIiIsICZmc3MyKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGVyciA9IEZTcE1ha2VGU1JlZigmZnNzMiwgJmZzcik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBlcnIgPSAoT1NFcnIpRlNSZWZNYWtlUGF0aCgmZnNyLCAodW5zaWduZWQgY2hhciopcGF0aCwgbGVuLTEpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgLyogVGhpcyBwYXJ0IGlzIG5vdCAxMDAlIHNhZmU6IHdlIGFwcGVuZCB0aGUgZmlsZW5hbWUgcGFydCwgYnV0CisgICAgICAgICoqIEknbSBub3Qgc3VyZSB0aGF0IHdlIGRvbid0IHJ1biBhZm91bCBvZiB0aGUgdmFyaW91cyA4Yml0CisgICAgICAgICoqIGVuY29kaW5ncyBoZXJlLiBXaWxsIGhhdmUgdG8gbG9vayB0aGlzIHVwIGF0IHNvbWUgcG9pbnQuLi4KKyAgICAgICAgKi8KKyAgICAgICAgc3RyY2F0KHBhdGgsICIvIik7CisgICAgICAgIHRvY29weSA9IGZzcy0+bmFtZVswXTsKKyAgICAgICAgaWYgKChzdHJsZW4ocGF0aCkgKyB0b2NvcHkpID49IGxlbikKKyAgICAgICAgICAgIHRvY29weSA9IGxlbiAtIHN0cmxlbihwYXRoKSAtIDE7CisgICAgICAgIGlmICh0b2NvcHkgPiAwKQorICAgICAgICAgICAgc3RybmNhdChwYXRoLCAoY2hhciopZnNzLT5uYW1lKzEsIHRvY29weSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgZXJyID0gKE9TRXJyKUZTUmVmTWFrZVBhdGgoJmZzciwgKHVuc2lnbmVkIGNoYXIqKXBhdGgsIGxlbik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIApAQCAtMTY5LDI2MyArMTY5LDI2MyBAQAogI2RlZmluZSBGU0NhdGFsb2dJbmZvX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkZTQ2F0YWxvZ0luZm9fVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRlNDYXRhbG9nSW5mb19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRlNDYXRhbG9nSW5mb09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUZTQ2F0YWxvZ0luZm8gb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGU0NhdGFsb2dJbmZvIG9iX2l0c2VsZjsKIH0gRlNDYXRhbG9nSW5mb09iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX05ldyhGU0NhdGFsb2dJbmZvICppdHNlbGYpCiB7Ci0JRlNDYXRhbG9nSW5mb09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7IFB5X0lOQ1JFRihQeV9Ob25lKTsgcmV0dXJuIFB5X05vbmU7IH0KLQlpdCA9IFB5T2JqZWN0X05FVyhGU0NhdGFsb2dJbmZvT2JqZWN0LCAmRlNDYXRhbG9nSW5mb19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEZTQ2F0YWxvZ0luZm9PYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeyBQeV9JTkNSRUYoUHlfTm9uZSk7IHJldHVybiBQeV9Ob25lOyB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRlNDYXRhbG9nSW5mb09iamVjdCwgJkZTQ2F0YWxvZ0luZm9fVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSAqaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX0NvbnZlcnQoUHlPYmplY3QgKnYsIEZTQ2F0YWxvZ0luZm8gKnBfaXRzZWxmKQogewotCWlmICghRlNDYXRhbG9nSW5mb19DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU0NhdGFsb2dJbmZvIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRlNDYXRhbG9nSW5mb19DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU0NhdGFsb2dJbmZvIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBGU0NhdGFsb2dJbmZvX2RlYWxsb2MoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGU0NhdGFsb2dJbmZvX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfbm9kZUZsYWdzKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIkgiLCBzZWxmLT5vYl9pdHNlbGYubm9kZUZsYWdzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSCIsIHNlbGYtPm9iX2l0c2VsZi5ub2RlRmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X25vZGVGbGFncyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVGbGFncyktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVGbGFncyktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF92b2x1bWUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNlbGYtPm9iX2l0c2VsZi52b2x1bWUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+b2JfaXRzZWxmLnZvbHVtZSk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfdm9sdW1lKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiaCIsICZzZWxmLT5vYl9pdHNlbGYudm9sdW1lKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiaCIsICZzZWxmLT5vYl9pdHNlbGYudm9sdW1lKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X3BhcmVudERpcklEKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYucGFyZW50RGlySUQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLnBhcmVudERpcklEKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9wYXJlbnREaXJJRChGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnBhcmVudERpcklEKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucGFyZW50RGlySUQpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfbm9kZUlEKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYubm9kZUlEKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5ub2RlSUQpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X25vZGVJRChGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVJRCktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVJRCktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9jcmVhdGVEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNyZWF0ZURhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5jcmVhdGVEYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9jcmVhdGVEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmNyZWF0ZURhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuY3JlYXRlRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9jb250ZW50TW9kRGF0ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9jb250ZW50TW9kRGF0ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9hdHRyaWJ1dGVNb2REYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5hdHRyaWJ1dGVNb2REYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9hdHRyaWJ1dGVNb2REYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9hY2Nlc3NEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5hY2Nlc3NEYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9hY2Nlc3NEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9iYWNrdXBEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmJhY2t1cERhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5iYWNrdXBEYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9iYWNrdXBEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmJhY2t1cERhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9wZXJtaXNzaW9ucyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCUZTUGVybWlzc2lvbkluZm8qIGluZm8gPSAoRlNQZXJtaXNzaW9uSW5mbyopJihzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnMpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIobGxsbCkiLCBpbmZvLT51c2VySUQsIGluZm8tPmdyb3VwSUQsIGluZm8tPnVzZXJBY2Nlc3MsIGluZm8tPm1vZGUpOworICAgIEZTUGVybWlzc2lvbkluZm8qIGluZm8gPSAoRlNQZXJtaXNzaW9uSW5mbyopJihzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnMpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobGxsbCkiLCBpbmZvLT51c2VySUQsIGluZm8tPmdyb3VwSUQsIGluZm8tPnVzZXJBY2Nlc3MsIGluZm8tPm1vZGUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X3Blcm1pc3Npb25zKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCWxvbmcgdXNlcklEOwotCWxvbmcgZ3JvdXBJRDsKLQlsb25nIHVzZXJBY2Nlc3M7Ci0JbG9uZyBtb2RlOwotCWludCByOworICAgIGxvbmcgdXNlcklEOworICAgIGxvbmcgZ3JvdXBJRDsKKyAgICBsb25nIHVzZXJBY2Nlc3M7CisgICAgbG9uZyBtb2RlOworICAgIGludCByOwogCi0JRlNQZXJtaXNzaW9uSW5mbyogaW5mbyA9IChGU1Blcm1pc3Npb25JbmZvKikmKHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9ucyk7CisgICAgRlNQZXJtaXNzaW9uSW5mbyogaW5mbyA9IChGU1Blcm1pc3Npb25JbmZvKikmKHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9ucyk7CiAKLQlyID0gUHlBcmdfUGFyc2UodiwgIihsbGxsKSIsICZ1c2VySUQsICZncm91cElELCAmdXNlckFjY2VzcywgJm1vZGUpOwotCWlmICghcikgewotCQlyZXR1cm4gLTE7Ci0JfQotCWluZm8tPnVzZXJJRCA9IHVzZXJJRDsKLQlpbmZvLT5ncm91cElEID0gZ3JvdXBJRDsKLQlpbmZvLT51c2VyQWNjZXNzID0gdXNlckFjY2VzczsKLQlpbmZvLT5tb2RlID0gbW9kZTsKLQlyZXR1cm4gMDsKKyAgICByID0gUHlBcmdfUGFyc2UodiwgIihsbGxsKSIsICZ1c2VySUQsICZncm91cElELCAmdXNlckFjY2VzcywgJm1vZGUpOworICAgIGlmICghcikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGluZm8tPnVzZXJJRCA9IHVzZXJJRDsKKyAgICBpbmZvLT5ncm91cElEID0gZ3JvdXBJRDsKKyAgICBpbmZvLT51c2VyQWNjZXNzID0gdXNlckFjY2VzczsKKyAgICBpbmZvLT5tb2RlID0gbW9kZTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF92YWxlbmNlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYudmFsZW5jZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYudmFsZW5jZSk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfdmFsZW5jZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnZhbGVuY2UpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi52YWxlbmNlKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X2RhdGFMb2dpY2FsU2l6ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLmRhdGFMb2dpY2FsU2l6ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9kYXRhTG9naWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfZGF0YVBoeXNpY2FsU2l6ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFQaHlzaWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYuZGF0YVBoeXNpY2FsU2l6ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9yc3JjTG9naWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLnJzcmNMb2dpY2FsU2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfcnNyY0xvZ2ljYWxTaXplKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNQaHlzaWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9yc3JjUGh5c2ljYWxTaXplKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY1BoeXNpY2FsU2l6ZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfc2hhcmluZ0ZsYWdzKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYuc2hhcmluZ0ZsYWdzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5zaGFyaW5nRmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X3NoYXJpbmdGbGFncyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncyktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncyktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF91c2VyUHJpdmlsZWdlcyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJiIiwgc2VsZi0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiYiIsIHNlbGYtPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcyk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfdXNlclByaXZpbGVnZXMoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJiIiwgJnNlbGYtPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcyktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImIiLCAmc2VsZi0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgRlNDYXRhbG9nSW5mb19nZXRzZXRsaXN0W10gPSB7Ci0JeyJub2RlRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlRmxhZ3MsIE5VTEx9LAotCXsidm9sdW1lIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF92b2x1bWUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfdm9sdW1lLCBOVUxMfSwKLQl7InBhcmVudERpcklEIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9wYXJlbnREaXJJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9wYXJlbnREaXJJRCwgTlVMTH0sCi0JeyJub2RlSUQiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlSUQsIE5VTEx9LAotCXsiY3JlYXRlRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfY3JlYXRlRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jcmVhdGVEYXRlLCBOVUxMfSwKLQl7ImNvbnRlbnRNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9jb250ZW50TW9kRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jb250ZW50TW9kRGF0ZSwgTlVMTH0sCi0JeyJhdHRyaWJ1dGVNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9hdHRyaWJ1dGVNb2REYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2F0dHJpYnV0ZU1vZERhdGUsIE5VTEx9LAotCXsiYWNjZXNzRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfYWNjZXNzRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9hY2Nlc3NEYXRlLCBOVUxMfSwKLQl7ImJhY2t1cERhdGUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2JhY2t1cERhdGUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfYmFja3VwRGF0ZSwgTlVMTH0sCi0JeyJwZXJtaXNzaW9ucyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfcGVybWlzc2lvbnMsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcGVybWlzc2lvbnMsIE5VTEx9LAotCXsidmFsZW5jZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfdmFsZW5jZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF92YWxlbmNlLCBOVUxMfSwKLQl7ImRhdGFMb2dpY2FsU2l6ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfZGF0YUxvZ2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFMb2dpY2FsU2l6ZSwgTlVMTH0sCi0JeyJkYXRhUGh5c2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9kYXRhUGh5c2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFQaHlzaWNhbFNpemUsIE5VTEx9LAotCXsicnNyY0xvZ2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9yc3JjTG9naWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY0xvZ2ljYWxTaXplLCBOVUxMfSwKLQl7InJzcmNQaHlzaWNhbFNpemUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNQaHlzaWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY1BoeXNpY2FsU2l6ZSwgTlVMTH0sCi0JeyJzaGFyaW5nRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3NoYXJpbmdGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9zaGFyaW5nRmxhZ3MsIE5VTEx9LAotCXsidXNlclByaXZpbGVnZXMiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3VzZXJQcml2aWxlZ2VzLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3VzZXJQcml2aWxlZ2VzLCBOVUxMfSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJub2RlRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlRmxhZ3MsIE5VTEx9LAorICAgIHsidm9sdW1lIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF92b2x1bWUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfdm9sdW1lLCBOVUxMfSwKKyAgICB7InBhcmVudERpcklEIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9wYXJlbnREaXJJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9wYXJlbnREaXJJRCwgTlVMTH0sCisgICAgeyJub2RlSUQiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlSUQsIE5VTEx9LAorICAgIHsiY3JlYXRlRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfY3JlYXRlRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jcmVhdGVEYXRlLCBOVUxMfSwKKyAgICB7ImNvbnRlbnRNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9jb250ZW50TW9kRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jb250ZW50TW9kRGF0ZSwgTlVMTH0sCisgICAgeyJhdHRyaWJ1dGVNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9hdHRyaWJ1dGVNb2REYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2F0dHJpYnV0ZU1vZERhdGUsIE5VTEx9LAorICAgIHsiYWNjZXNzRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfYWNjZXNzRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9hY2Nlc3NEYXRlLCBOVUxMfSwKKyAgICB7ImJhY2t1cERhdGUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2JhY2t1cERhdGUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfYmFja3VwRGF0ZSwgTlVMTH0sCisgICAgeyJwZXJtaXNzaW9ucyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfcGVybWlzc2lvbnMsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcGVybWlzc2lvbnMsIE5VTEx9LAorICAgIHsidmFsZW5jZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfdmFsZW5jZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF92YWxlbmNlLCBOVUxMfSwKKyAgICB7ImRhdGFMb2dpY2FsU2l6ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfZGF0YUxvZ2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFMb2dpY2FsU2l6ZSwgTlVMTH0sCisgICAgeyJkYXRhUGh5c2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9kYXRhUGh5c2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFQaHlzaWNhbFNpemUsIE5VTEx9LAorICAgIHsicnNyY0xvZ2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9yc3JjTG9naWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY0xvZ2ljYWxTaXplLCBOVUxMfSwKKyAgICB7InJzcmNQaHlzaWNhbFNpemUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNQaHlzaWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY1BoeXNpY2FsU2l6ZSwgTlVMTH0sCisgICAgeyJzaGFyaW5nRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3NoYXJpbmdGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9zaGFyaW5nRmxhZ3MsIE5VTEx9LAorICAgIHsidXNlclByaXZpbGVnZXMiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3VzZXJQcml2aWxlZ2VzLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3VzZXJQcml2aWxlZ2VzLCBOVUxMfSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTQzNiwxMDMgKzQzNiwxMDMgQEAKICNkZWZpbmUgRlNDYXRhbG9nSW5mb19oYXNoIE5VTEwKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb190cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Ci0JICAgICAgICAgICAgIm5vZGVGbGFncyIsCi0JICAgICAgICAgICAgInZvbHVtZSIsCi0JICAgICAgICAgICAgInBhcmVudERpcklEIiwKLQkgICAgICAgICAgICAibm9kZUlEIiwKLQkgICAgICAgICAgICAiY3JlYXRlRGF0ZSIsCi0JICAgICAgICAgICAgImNvbnRlbnRNb2REYXRlIiwKLQkgICAgICAgICAgICAiYXRyaWJ1dGVNb2REYXRlIiwKLQkgICAgICAgICAgICAiYWNjZXNzRGF0ZSIsCi0JICAgICAgICAgICAgImJhY2t1cERhdGUiLAotCSAgICAgICAgICAgICJ2YWxlbmNlIiwKLQkgICAgICAgICAgICAiZGF0YUxvZ2ljYWxTaXplIiwKLQkgICAgICAgICAgICAiZGF0YVBoeXNpY2FsU2l6ZSIsCi0JICAgICAgICAgICAgInJzcmNMb2dpY2FsU2l6ZSIsCi0JICAgICAgICAgICAgInJzcmNQaHlzaWNhbFNpemUiLAotCSAgICAgICAgICAgICJzaGFyaW5nRmxhZ3MiLAotCSAgICAgICAgICAgICJ1c2VyUHJpdmlsZWdlcyIKLQkgICAgICAgICAgICAsIDB9OworICAgIHN0YXRpYyBjaGFyICprd1tdID0geworICAgICAgICAgICAgICAgICJub2RlRmxhZ3MiLAorICAgICAgICAgICAgICAgICJ2b2x1bWUiLAorICAgICAgICAgICAgICAgICJwYXJlbnREaXJJRCIsCisgICAgICAgICAgICAgICAgIm5vZGVJRCIsCisgICAgICAgICAgICAgICAgImNyZWF0ZURhdGUiLAorICAgICAgICAgICAgICAgICJjb250ZW50TW9kRGF0ZSIsCisgICAgICAgICAgICAgICAgImF0cmlidXRlTW9kRGF0ZSIsCisgICAgICAgICAgICAgICAgImFjY2Vzc0RhdGUiLAorICAgICAgICAgICAgICAgICJiYWNrdXBEYXRlIiwKKyAgICAgICAgICAgICAgICAidmFsZW5jZSIsCisgICAgICAgICAgICAgICAgImRhdGFMb2dpY2FsU2l6ZSIsCisgICAgICAgICAgICAgICAgImRhdGFQaHlzaWNhbFNpemUiLAorICAgICAgICAgICAgICAgICJyc3JjTG9naWNhbFNpemUiLAorICAgICAgICAgICAgICAgICJyc3JjUGh5c2ljYWxTaXplIiwKKyAgICAgICAgICAgICAgICAic2hhcmluZ0ZsYWdzIiwKKyAgICAgICAgICAgICAgICAidXNlclByaXZpbGVnZXMiCisgICAgICAgICAgICAgICAgLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxIaGxsTyZPJk8mTyZPJmxsbGxsbGIiLCBrdywgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLm5vZGVGbGFncywKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudm9sdW1lLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5wYXJlbnREaXJJRCwKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYubm9kZUlELAotCSAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5jcmVhdGVEYXRlLAotCSAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSwKLQkgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSwKLQkgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSwKLQkgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSwKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudmFsZW5jZSwKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUsCi0JICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUsCi0JICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncywKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudXNlclByaXZpbGVnZXMpKQotCXsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8SGhsbE8mTyZPJk8mTyZsbGxsbGxiIiwga3csICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5ub2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnZvbHVtZSwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYucGFyZW50RGlySUQsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLm5vZGVJRCwKKyAgICAgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuY3JlYXRlRGF0ZSwKKyAgICAgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuY29udGVudE1vZERhdGUsCisgICAgICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUsCisgICAgICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUsCisgICAgICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmJhY2t1cERhdGUsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnZhbGVuY2UsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmRhdGFMb2dpY2FsU2l6ZSwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuZGF0YVBoeXNpY2FsU2l6ZSwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplLAorICAgICAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplLAorICAgICAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5zaGFyaW5nRmxhZ3MsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKSkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgRlNDYXRhbG9nSW5mb190cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb190cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQltZW1zZXQoJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU0NhdGFsb2dJbmZvKSk7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZTQ2F0YWxvZ0luZm8pKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBGU0NhdGFsb2dJbmZvX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBGU0NhdGFsb2dJbmZvX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiQ2FyYm9uLkZpbGUuRlNDYXRhbG9nSW5mbyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEZTQ2F0YWxvZ0luZm9PYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBGU0NhdGFsb2dJbmZvX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEZTQ2F0YWxvZ0luZm9fY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEZTQ2F0YWxvZ0luZm9fcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEZTQ2F0YWxvZ0luZm9faGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRlNDYXRhbG9nSW5mb19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlGU0NhdGFsb2dJbmZvX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUZTQ2F0YWxvZ0luZm9fdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUZTQ2F0YWxvZ0luZm9fdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRlNDYXRhbG9nSW5mb190cF9uZXcsIC8qIHRwX25ldyAqLwotCUZTQ2F0YWxvZ0luZm9fdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIkNhcmJvbi5GaWxlLkZTQ2F0YWxvZ0luZm8iLCAvKnRwX25hbWUqLworICAgIHNpemVvZihGU0NhdGFsb2dJbmZvT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRlNDYXRhbG9nSW5mb19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBGU0NhdGFsb2dJbmZvX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBGU0NhdGFsb2dJbmZvX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBGU0NhdGFsb2dJbmZvX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEZTQ2F0YWxvZ0luZm9fbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRlNDYXRhbG9nSW5mb19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBGU0NhdGFsb2dJbmZvX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBGU0NhdGFsb2dJbmZvX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEZTQ2F0YWxvZ0luZm9fdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBGU0NhdGFsb2dJbmZvX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBGU0NhdGFsb2dJbmZvIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNTQ3LDEwMyArNTQ3LDEwMyBAQAogI2RlZmluZSBGSW5mb19DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZGSW5mb19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZGSW5mb19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRkluZm9PYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlGSW5mbyBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZJbmZvIG9iX2l0c2VsZjsKIH0gRkluZm9PYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fTmV3KEZJbmZvICppdHNlbGYpCiB7Ci0JRkluZm9PYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhGSW5mb09iamVjdCwgJkZJbmZvX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRkluZm9PYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhGSW5mb09iamVjdCwgJkZJbmZvX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBpbnQgRkluZm9fQ29udmVydChQeU9iamVjdCAqdiwgRkluZm8gKnBfaXRzZWxmKQogewotCWlmICghRkluZm9fQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRkluZm8gcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRkluZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRkluZm9fQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRkluZm8gcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRkluZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBGSW5mb19kZWFsbG9jKEZJbmZvT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEZJbmZvX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fZ2V0X1R5cGUoRkluZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkT1NUeXBlLCBzZWxmLT5vYl9pdHNlbGYuZmRUeXBlKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfVHlwZShGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fZ2V0X0NyZWF0b3IoRkluZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkT1NUeXBlLCBzZWxmLT5vYl9pdHNlbGYuZmRDcmVhdG9yKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfQ3JlYXRvcihGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fZ2V0X0ZsYWdzKEZJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJIIiwgc2VsZi0+b2JfaXRzZWxmLmZkRmxhZ3MpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJIIiwgc2VsZi0+b2JfaXRzZWxmLmZkRmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IEZJbmZvX3NldF9GbGFncyhGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJIIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsYWdzKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiSCIsICZzZWxmLT5vYl9pdHNlbGYuZmRGbGFncyktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGSW5mb19nZXRfTG9jYXRpb24oRkluZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRQb2ludCwgc2VsZi0+b2JfaXRzZWxmLmZkTG9jYXRpb24pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUG9pbnQsIHNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfTG9jYXRpb24oRkluZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBQeU1hY19HZXRQb2ludCwgJnNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBQeU1hY19HZXRQb2ludCwgJnNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZJbmZvX2dldF9GbGRyKEZJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+b2JfaXRzZWxmLmZkRmxkcik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzZWxmLT5vYl9pdHNlbGYuZmRGbGRyKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfRmxkcihGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJoIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsZHIpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJoIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsZHIpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBGSW5mb19nZXRzZXRsaXN0W10gPSB7Ci0JeyJUeXBlIiwgKGdldHRlcilGSW5mb19nZXRfVHlwZSwgKHNldHRlcilGSW5mb19zZXRfVHlwZSwgIjQtY2hhciBmaWxlIHR5cGUifSwKLQl7IkNyZWF0b3IiLCAoZ2V0dGVyKUZJbmZvX2dldF9DcmVhdG9yLCAoc2V0dGVyKUZJbmZvX3NldF9DcmVhdG9yLCAiNC1jaGFyIGZpbGUgY3JlYXRvciJ9LAotCXsiRmxhZ3MiLCAoZ2V0dGVyKUZJbmZvX2dldF9GbGFncywgKHNldHRlcilGSW5mb19zZXRfRmxhZ3MsICJGaW5kZXIgZmxhZyBiaXRzIn0sCi0JeyJMb2NhdGlvbiIsIChnZXR0ZXIpRkluZm9fZ2V0X0xvY2F0aW9uLCAoc2V0dGVyKUZJbmZvX3NldF9Mb2NhdGlvbiwgIih4LCB5KSBsb2NhdGlvbiBvZiB0aGUgZmlsZSdzIGljb24gaW4gaXRzIHBhcmVudCBmaW5kZXIgd2luZG93In0sCi0JeyJGbGRyIiwgKGdldHRlcilGSW5mb19nZXRfRmxkciwgKHNldHRlcilGSW5mb19zZXRfRmxkciwgIk9yaWdpbmFsIGZvbGRlciwgZm9yICdwdXQgYXdheScifSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJUeXBlIiwgKGdldHRlcilGSW5mb19nZXRfVHlwZSwgKHNldHRlcilGSW5mb19zZXRfVHlwZSwgIjQtY2hhciBmaWxlIHR5cGUifSwKKyAgICB7IkNyZWF0b3IiLCAoZ2V0dGVyKUZJbmZvX2dldF9DcmVhdG9yLCAoc2V0dGVyKUZJbmZvX3NldF9DcmVhdG9yLCAiNC1jaGFyIGZpbGUgY3JlYXRvciJ9LAorICAgIHsiRmxhZ3MiLCAoZ2V0dGVyKUZJbmZvX2dldF9GbGFncywgKHNldHRlcilGSW5mb19zZXRfRmxhZ3MsICJGaW5kZXIgZmxhZyBiaXRzIn0sCisgICAgeyJMb2NhdGlvbiIsIChnZXR0ZXIpRkluZm9fZ2V0X0xvY2F0aW9uLCAoc2V0dGVyKUZJbmZvX3NldF9Mb2NhdGlvbiwgIih4LCB5KSBsb2NhdGlvbiBvZiB0aGUgZmlsZSdzIGljb24gaW4gaXRzIHBhcmVudCBmaW5kZXIgd2luZG93In0sCisgICAgeyJGbGRyIiwgKGdldHRlcilGSW5mb19nZXRfRmxkciwgKHNldHRlcilGSW5mb19zZXRfRmxkciwgIk9yaWdpbmFsIGZvbGRlciwgZm9yICdwdXQgYXdheScifSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTY1NCw3MyArNjU0LDczIEBACiAjZGVmaW5lIEZJbmZvX2hhc2ggTlVMTAogc3RhdGljIGludCBGSW5mb190cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JRkluZm8gKml0c2VsZiA9IE5VTEw7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIEZJbmZvICppdHNlbGYgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifE8mIiwga3csIEZJbmZvX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJaWYgKGl0c2VsZikgbWVtY3B5KCYoKEZJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYsIGl0c2VsZiwgc2l6ZW9mKEZJbmZvKSk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8TyYiLCBrdywgRkluZm9fQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICBpZiAoaXRzZWxmKSBtZW1jcHkoJigoRkluZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiwgaXRzZWxmLCBzaXplb2YoRkluZm8pKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBGSW5mb190cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCYoKEZJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZJbmZvKSk7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmKChGSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGSW5mbykpOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIEZJbmZvX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBGSW5mb19UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIkNhcmJvbi5GaWxlLkZJbmZvIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRkluZm9PYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBGSW5mb19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBGSW5mb19jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRkluZm9fcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEZJbmZvX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUZJbmZvX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUZJbmZvX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUZJbmZvX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlGSW5mb190cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlGSW5mb190cF9uZXcsIC8qIHRwX25ldyAqLwotCUZJbmZvX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJDYXJib24uRmlsZS5GSW5mbyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEZJbmZvT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRkluZm9fZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRkluZm9fY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEZJbmZvX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBGSW5mb19oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBGSW5mb19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBGSW5mb19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBGSW5mb190cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRkluZm9fdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRkluZm9fdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBGSW5mb190cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCkBAIC03MzQsMjQ0ICs3MzQsMjQ0IEBACiAjZGVmaW5lIEFsaWFzX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkFsaWFzX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkFsaWFzX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBBbGlhc09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUFsaWFzSGFuZGxlIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShBbGlhc0hhbmRsZSBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBBbGlhc0hhbmRsZSBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQWxpYXNIYW5kbGUgcHRyKTsKIH0gQWxpYXNPYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfTmV3KEFsaWFzSGFuZGxlIGl0c2VsZikKIHsKLQlBbGlhc09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEFsaWFzT2JqZWN0LCAmQWxpYXNfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEFsaWFzT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQWxpYXNPYmplY3QsICZBbGlhc19UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBpbnQgQWxpYXNfQ29udmVydChQeU9iamVjdCAqdiwgQWxpYXNIYW5kbGUgKnBfaXRzZWxmKQogewotCWlmICghQWxpYXNfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQWxpYXMgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQWxpYXNPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQWxpYXNfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQWxpYXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQWxpYXNPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBBbGlhc19kZWFsbG9jKEFsaWFzT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KHNlbGYtPm9iX2l0c2VsZik7Ci0JfQotCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOworICAgIH0KKyAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfUmVzb2x2ZUFsaWFzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlc29sdmVBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXNvbHZlQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfR2V0QWxpYXNJbmZvKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFsaWFzSW5mb1R5cGUgaW5kZXg7Ci0JU3RyNjMgdGhlU3RyaW5nOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0QWxpYXNJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0aGVTdHJpbmcpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFsaWFzSW5mb1R5cGUgaW5kZXg7CisgICAgU3RyNjMgdGhlU3RyaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QWxpYXNJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0aGVTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX1Jlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjIHRhcmdldDsKKyAgICBCb29sZWFuIHdhc0NoYW5nZWQ7CisgICAgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKGZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX0ZvbGxvd0ZpbmRlckFsaWFzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JQm9vbGVhbiBsb2dvbjsKLQlGU1NwZWMgdGFyZ2V0OwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbG9nb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRm9sbG93RmluZGVyQWxpYXMoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgQm9vbGVhbiBsb2dvbjsKKyAgICBGU1NwZWMgdGFyZ2V0OworICAgIEJvb2xlYW4gd2FzQ2hhbmdlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9nb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRm9sbG93RmluZGVyQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX0ZTUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MoQWxpYXNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNSZWYgdGFyZ2V0OwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQl1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1JlZlB0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW91bnRGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU1Jlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBmcm9tRmlsZV9fYnVmX187CisgICAgRlNSZWYgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50RmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX0ZTUmVzb2x2ZUFsaWFzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIGZyb21GaWxlX19idWZfXzsKLQlGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNSZXNvbHZlQWxpYXMoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBmcm9tRmlsZV9fYnVmX187CisgICAgRlNSZWYgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1JlZlB0ciwgJmZyb21GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTUmVzb2x2ZUFsaWFzKGZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfRlNGb2xsb3dGaW5kZXJBbGlhcyhBbGlhc09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiBmcm9tRmlsZTsKLQlCb29sZWFuIGxvZ29uOwotCUZTUmVmIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2dvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0ZvbGxvd0ZpbmRlckFsaWFzKCZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgZnJvbUZpbGU7CisgICAgQm9vbGVhbiBsb2dvbjsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9nb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNGb2xsb3dGaW5kZXJBbGlhcygmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQWxpYXNfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiUmVzb2x2ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX1Jlc29sdmVBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGZyb21GaWxlKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7IkdldEFsaWFzSW5mbyIsIChQeUNGdW5jdGlvbilBbGlhc19HZXRBbGlhc0luZm8sIDEsCi0JIFB5RG9jX1NUUigiKEFsaWFzSW5mb1R5cGUgaW5kZXgpIC0+IChTdHI2MyB0aGVTdHJpbmcpIil9LAotCXsiUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQWxpYXNfUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7IkZvbGxvd0ZpbmRlckFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0ZvbGxvd0ZpbmRlckFsaWFzLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEJvb2xlYW4gbG9nb24pIC0+IChGU1NwZWMgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAorICAgIHsiUmVzb2x2ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX1Jlc29sdmVBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGZyb21GaWxlKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkdldEFsaWFzSW5mbyIsIChQeUNGdW5jdGlvbilBbGlhc19HZXRBbGlhc0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEFsaWFzSW5mb1R5cGUgaW5kZXgpIC0+IChTdHI2MyB0aGVTdHJpbmcpIil9LAorICAgIHsiUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQWxpYXNfUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkZvbGxvd0ZpbmRlckFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0ZvbGxvd0ZpbmRlckFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEJvb2xlYW4gbG9nb24pIC0+IChGU1NwZWMgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXsiRlNSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncyIsIChQeUNGdW5jdGlvbilBbGlhc19GU1Jlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSwgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNSZWYgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXsiRlNSZXNvbHZlQWxpYXMiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRlNSZXNvbHZlQWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlKSAtPiAoRlNSZWYgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXsiRlNGb2xsb3dGaW5kZXJBbGlhcyIsIChQeUNGdW5jdGlvbilBbGlhc19GU0ZvbGxvd0ZpbmRlckFsaWFzLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGxvZ29uKSAtPiAoRlNSZWYgZnJvbUZpbGUsIEZTUmVmIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkZTUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRlNSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgZnJvbUZpbGUsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTUmVmIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkZTUmVzb2x2ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0ZTUmVzb2x2ZUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSkgLT4gKEZTUmVmIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkZTRm9sbG93RmluZGVyQWxpYXMiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRlNGb2xsb3dGaW5kZXJBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBsb2dvbikgLT4gKEZTUmVmIGZyb21GaWxlLCBGU1JlZiB0YXJnZXQsIEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX2dldF9kYXRhKEFsaWFzT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCWludCBzaXplOwotCSAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJ2OwogCi0JICAgICAgICAgICAgICAgICAgICBzaXplID0gR2V0SGFuZGxlU2l6ZSgoSGFuZGxlKXNlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgICAgICAgICBITG9jaygoSGFuZGxlKXNlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCooSGFuZGxlKXNlbGYtPm9iX2l0c2VsZiwgc2l6ZSk7Ci0JICAgICAgICAgICAgICAgICAgICBIVW5sb2NrKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBydjsKLQkgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBHZXRIYW5kbGVTaXplKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhMb2NrKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKihIYW5kbGUpc2VsZi0+b2JfaXRzZWxmLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhVbmxvY2soKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ2OworCiB9CiAKICNkZWZpbmUgQWxpYXNfc2V0X2RhdGEgTlVMTAogCiBzdGF0aWMgUHlHZXRTZXREZWYgQWxpYXNfZ2V0c2V0bGlzdFtdID0gewotCXsiZGF0YSIsIChnZXR0ZXIpQWxpYXNfZ2V0X2RhdGEsIChzZXR0ZXIpQWxpYXNfc2V0X2RhdGEsICJSYXcgZGF0YSBvZiB0aGUgYWxpYXMgb2JqZWN0In0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiZGF0YSIsIChnZXR0ZXIpQWxpYXNfZ2V0X2RhdGEsIChzZXR0ZXIpQWxpYXNfc2V0X2RhdGEsICJSYXcgZGF0YSBvZiB0aGUgYWxpYXMgb2JqZWN0In0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC05ODIsOTcgKzk4Miw5NyBAQAogI2RlZmluZSBBbGlhc19oYXNoIE5VTEwKIHN0YXRpYyBpbnQgQWxpYXNfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUFsaWFzSGFuZGxlIGl0c2VsZiA9IE5VTEw7Ci0JY2hhciAqcmF3ZGF0YSA9IE5VTEw7Ci0JaW50IHJhd2RhdGFsZW4gPSAwOwotCUhhbmRsZSBoOwotCXN0YXRpYyBjaGFyICprd1tdID0geyJpdHNlbGYiLCAicmF3ZGF0YSIsIDB9OworICAgIEFsaWFzSGFuZGxlIGl0c2VsZiA9IE5VTEw7CisgICAgY2hhciAqcmF3ZGF0YSA9IE5VTEw7CisgICAgaW50IHJhd2RhdGFsZW4gPSAwOworICAgIEhhbmRsZSBoOworICAgIHN0YXRpYyBjaGFyICprd1tdID0geyJpdHNlbGYiLCAicmF3ZGF0YSIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifE8mcyMiLCBrdywgQWxpYXNfQ29udmVydCwgJml0c2VsZiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkKLQlyZXR1cm4gLTE7Ci0JaWYgKGl0c2VsZiAmJiByYXdkYXRhKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWl0c2VsZiAmJiAhcmF3ZGF0YSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmF3ZGF0YSkKLQl7Ci0JCWlmICgoaCA9IE5ld0hhbmRsZShyYXdkYXRhbGVuKSkgPT0gTlVMTCkKLQkJewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlITG9jayhoKTsKLQkJbWVtY3B5KChjaGFyICopKmgsIHJhd2RhdGEsIHJhd2RhdGFsZW4pOwotCQlIVW5sb2NrKGgpOwotCQkoKEFsaWFzT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSAoQWxpYXNIYW5kbGUpaDsKLQkJcmV0dXJuIDA7Ci0JfQotCSgoQWxpYXNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8TyZzIyIsIGt3LCBBbGlhc19Db252ZXJ0LCAmaXRzZWxmLCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKQorICAgIHJldHVybiAtMTsKKyAgICBpZiAoaXRzZWxmICYmIHJhd2RhdGEpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghaXRzZWxmICYmICFyYXdkYXRhKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyYXdkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKChoID0gTmV3SGFuZGxlKHJhd2RhdGFsZW4pKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIEhMb2NrKGgpOworICAgICAgICBtZW1jcHkoKGNoYXIgKikqaCwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7CisgICAgICAgIEhVbmxvY2soaCk7CisgICAgICAgICgoQWxpYXNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IChBbGlhc0hhbmRsZSloOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKChBbGlhc09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIEFsaWFzX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpBbGlhc190cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEFsaWFzT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQWxpYXNPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBBbGlhc190cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQWxpYXNfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJDYXJib24uRmlsZS5BbGlhcyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEFsaWFzT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQWxpYXNfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQWxpYXNfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEFsaWFzX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBBbGlhc19oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlBbGlhc19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlBbGlhc19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlBbGlhc190cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQWxpYXNfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQWxpYXNfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlBbGlhc190cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiQ2FyYm9uLkZpbGUuQWxpYXMiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihBbGlhc09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEFsaWFzX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEFsaWFzX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBBbGlhc19yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQWxpYXNfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQWxpYXNfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQWxpYXNfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQWxpYXNfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEFsaWFzX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEFsaWFzX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQWxpYXNfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBBbGlhcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMDg2LDM0NyArMTA4NiwzNDcgQEAKICNkZWZpbmUgRlNTcGVjX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkZTU3BlY19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZGU1NwZWNfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEZTU3BlY09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUZTU3BlYyBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZTU3BlYyBvYl9pdHNlbGY7CiB9IEZTU3BlY09iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfTmV3KEZTU3BlYyAqaXRzZWxmKQogewotCUZTU3BlY09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEZTU3BlY09iamVjdCwgJkZTU3BlY19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEZTU3BlY09iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKEZTU3BlY09iamVjdCwgJkZTU3BlY19UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgdm9pZCBGU1NwZWNfZGVhbGxvYyhGU1NwZWNPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BPcGVuREYoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQ4IHBlcm1pc3Npb247Ci0Jc2hvcnQgcmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BPcGVuREYoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAotCSAgICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50OCBwZXJtaXNzaW9uOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwT3BlbkRGKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcE9wZW5SRihGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDggcGVybWlzc2lvbjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcE9wZW5SRigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24sCi0JICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQ4IHBlcm1pc3Npb247CisgICAgc2hvcnQgcmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BPcGVuUkYoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwQ3JlYXRlKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BDcmVhdGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcENyZWF0ZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcERpckNyZWF0ZShGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7Ci0JbG9uZyBjcmVhdGVkRGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwRGlyQ3JlYXRlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZERpcklEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBsb25nIGNyZWF0ZWREaXJJRDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BEaXJDcmVhdGUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpcklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRGlySUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BEZWxldGUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwRGVsZXRlKCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcERlbGV0ZSgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcEdldEZJbmZvKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGSW5mbyBmbmRySW5mbzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcEdldEZJbmZvKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmZm5kckluZm8pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGSW5mb19OZXcsICZmbmRySW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRkluZm8gZm5kckluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BHZXRGSW5mbygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkluZm9fTmV3LCAmZm5kckluZm8pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BTZXRGSW5mbyhGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRkluZm8gZm5kckluZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBGSW5mb19Db252ZXJ0LCAmZm5kckluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwU2V0RkluZm8oJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZmbmRySW5mbyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRkluZm8gZm5kckluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSW5mb19Db252ZXJ0LCAmZm5kckluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwU2V0RkluZm8oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICZmbmRySW5mbyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcFNldEZMb2NrKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcFNldEZMb2NrKCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcFNldEZMb2NrKCZfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwUnN0RkxvY2soRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwUnN0RkxvY2soJl9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwUnN0RkxvY2soJl9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BSZW5hbWUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjI1NSBuZXdOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcFJlbmFtZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIG5ld05hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjI1NSBuZXdOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcFJlbmFtZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BDYXRNb3ZlKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZGVzdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmZGVzdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BDYXRNb3ZlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICZkZXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZGVzdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmZGVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BDYXRNb3ZlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICZkZXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwRXhjaGFuZ2VGaWxlcyhGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGRlc3Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJmRlc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwRXhjaGFuZ2VGaWxlcygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGRlc3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJmRlc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwRXhjaGFuZ2VGaWxlcygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcE1ha2VGU1JlZihGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgbmV3UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwTWFrZUZTUmVmKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgbmV3UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwTWFrZUZTUmVmKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX05ld0FsaWFzTWluaW1hbChGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQWxpYXNIYW5kbGUgYWxpYXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdBbGlhc01pbmltYWwoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmYWxpYXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBbGlhc19OZXcsIGFsaWFzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld0FsaWFzTWluaW1hbCgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19Jc0FsaWFzRmlsZShGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQm9vbGVhbiBhbGlhc0ZpbGVGbGFnOwotCUJvb2xlYW4gZm9sZGVyRmxhZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IElzQWxpYXNGaWxlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmYWxpYXNGaWxlRmxhZywKLQkgICAgICAgICAgICAgICAgICAgJmZvbGRlckZsYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBhbGlhc0ZpbGVGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgIGZvbGRlckZsYWcpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEJvb2xlYW4gYWxpYXNGaWxlRmxhZzsKKyAgICBCb29sZWFuIGZvbGRlckZsYWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJc0FsaWFzRmlsZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmFsaWFzRmlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICZmb2xkZXJGbGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNGaWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJGbGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfYXNfcGF0aG5hbWUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQljaGFyIHN0cmJ1ZlsxMDI0XTsKLQlPU0VyciBlcnI7CisgICAgY2hhciBzdHJidWZbMTAyNF07CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQllcnIgPSBfUHlNYWNfR2V0RnVsbFBhdGhuYW1lKCZfc2VsZi0+b2JfaXRzZWxmLCBzdHJidWYsIHNpemVvZihzdHJidWYpKTsKLQlpZiAoIGVyciApIHsKLQkgICAgICAgIFB5TWFjX0Vycm9yKGVycik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JX3JlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyYnVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gX1B5TWFjX0dldEZ1bGxQYXRobmFtZSgmX3NlbGYtPm9iX2l0c2VsZiwgc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSk7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHJidWYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX2FzX3R1cGxlKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiKGlpcyMpIiwgX3NlbGYtPm9iX2l0c2VsZi52UmVmTnVtLCBfc2VsZi0+b2JfaXRzZWxmLnBhcklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX3NlbGYtPm9iX2l0c2VsZi5uYW1lWzFdLCBfc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiKGlpcyMpIiwgX3NlbGYtPm9iX2l0c2VsZi52UmVmTnVtLCBfc2VsZi0+b2JfaXRzZWxmLnBhcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX3NlbGYtPm9iX2l0c2VsZi5uYW1lWzFdLCBfc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0pOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGU1NwZWNfbWV0aG9kc1tdID0gewotCXsiRlNwT3BlbkRGIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BPcGVuREYsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAotCXsiRlNwT3BlblJGIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BPcGVuUkYsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAotCXsiRlNwQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiBOb25lIil9LAotCXsiRlNwRGlyQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BEaXJDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAobG9uZyBjcmVhdGVkRGlySUQpIil9LAotCXsiRlNwRGVsZXRlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BEZWxldGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkZTcEdldEZJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BHZXRGSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRkluZm8gZm5kckluZm8pIil9LAotCXsiRlNwU2V0RkluZm8iLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFNldEZJbmZvLCAxLAotCSBQeURvY19TVFIoIihGSW5mbyBmbmRySW5mbykgLT4gTm9uZSIpfSwKLQl7IkZTcFNldEZMb2NrIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BTZXRGTG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRlNwUnN0RkxvY2siLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFJzdEZMb2NrLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJGU3BSZW5hbWUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFJlbmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IG5ld05hbWUpIC0+IE5vbmUiKX0sCi0JeyJGU3BDYXRNb3ZlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BDYXRNb3ZlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZGVzdCkgLT4gTm9uZSIpfSwKLQl7IkZTcEV4Y2hhbmdlRmlsZXMiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcEV4Y2hhbmdlRmlsZXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBkZXN0KSAtPiBOb25lIil9LAotCXsiRlNwTWFrZUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BNYWtlRlNSZWYsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCi0JeyJOZXdBbGlhc01pbmltYWwiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX05ld0FsaWFzTWluaW1hbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAotCXsiSXNBbGlhc0ZpbGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0lzQWxpYXNGaWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGFsaWFzRmlsZUZsYWcsIEJvb2xlYW4gZm9sZGVyRmxhZykiKX0sCi0JeyJhc19wYXRobmFtZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfYXNfcGF0aG5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gc3RyaW5nIil9LAotCXsiYXNfdHVwbGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX2FzX3R1cGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh2UmVmTnVtLCBkaXJJRCwgbmFtZSkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJGU3BPcGVuREYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE9wZW5ERiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCisgICAgeyJGU3BPcGVuUkYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE9wZW5SRiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCisgICAgeyJGU3BDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcENyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BEaXJDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcERpckNyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChsb25nIGNyZWF0ZWREaXJJRCkiKX0sCisgICAgeyJGU3BEZWxldGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcERlbGV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRlNwR2V0RkluZm8iLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcEdldEZJbmZvLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGSW5mbyBmbmRySW5mbykiKX0sCisgICAgeyJGU3BTZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwU2V0RkluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEZJbmZvIGZuZHJJbmZvKSAtPiBOb25lIil9LAorICAgIHsiRlNwU2V0RkxvY2siLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFNldEZMb2NrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BSc3RGTG9jayIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwUnN0RkxvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkZTcFJlbmFtZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwUmVuYW1lLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgbmV3TmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTcENhdE1vdmUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcENhdE1vdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBkZXN0KSAtPiBOb25lIil9LAorICAgIHsiRlNwRXhjaGFuZ2VGaWxlcyIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwRXhjaGFuZ2VGaWxlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGRlc3QpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BNYWtlRlNSZWYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE1ha2VGU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRlNSZWYgbmV3UmVmKSIpfSwKKyAgICB7Ik5ld0FsaWFzTWluaW1hbCIsIChQeUNGdW5jdGlvbilGU1NwZWNfTmV3QWxpYXNNaW5pbWFsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCisgICAgeyJJc0FsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfSXNBbGlhc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gYWxpYXNGaWxlRmxhZywgQm9vbGVhbiBmb2xkZXJGbGFnKSIpfSwKKyAgICB7ImFzX3BhdGhuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19hc19wYXRobmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBzdHJpbmciKX0sCisgICAgeyJhc190dXBsZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfYXNfdHVwbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHZSZWZOdW0sIGRpcklELCBuYW1lKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX2dldF9kYXRhKEZTU3BlY09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc2VsZi0+b2JfaXRzZWxmLCBzaXplb2Yoc2VsZi0+b2JfaXRzZWxmKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKHNlbGYtPm9iX2l0c2VsZikpOwogfQogCiAjZGVmaW5lIEZTU3BlY19zZXRfZGF0YSBOVUxMCiAKIHN0YXRpYyBQeUdldFNldERlZiBGU1NwZWNfZ2V0c2V0bGlzdFtdID0gewotCXsiZGF0YSIsIChnZXR0ZXIpRlNTcGVjX2dldF9kYXRhLCAoc2V0dGVyKUZTU3BlY19zZXRfZGF0YSwgIlJhdyBkYXRhIG9mIHRoZSBGU1NwZWMgb2JqZWN0In0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiZGF0YSIsIChnZXR0ZXIpRlNTcGVjX2dldF9kYXRhLCAoc2V0dGVyKUZTU3BlY19zZXRfZGF0YSwgIlJhdyBkYXRhIG9mIHRoZSBGU1NwZWMgb2JqZWN0In0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC0xNDM0LDEwNSArMTQzNCwxMDUgQEAKIAogc3RhdGljIFB5T2JqZWN0ICogRlNTcGVjX3JlcHIoRlNTcGVjT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzUxMl07Ci0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMoKCVkLCAlbGQsICclLipzJykpIiwKLQkgICAgICAgIHNlbGYtPm9iX3R5cGUtPnRwX25hbWUsCi0JICAgICAgICBzZWxmLT5vYl9pdHNlbGYudlJlZk51bSwKLQkgICAgICAgIHNlbGYtPm9iX2l0c2VsZi5wYXJJRCwKLQkgICAgICAgIHNlbGYtPm9iX2l0c2VsZi5uYW1lWzBdLCBzZWxmLT5vYl9pdHNlbGYubmFtZSsxKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzUxMl07CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMoKCVkLCAlbGQsICclLipzJykpIiwKKyAgICAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmLnZSZWZOdW0sCisgICAgICAgIHNlbGYtPm9iX2l0c2VsZi5wYXJJRCwKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0sIHNlbGYtPm9iX2l0c2VsZi5uYW1lKzEpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKICNkZWZpbmUgRlNTcGVjX2hhc2ggTlVMTAogc3RhdGljIGludCBGU1NwZWNfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICp2ID0gTlVMTDsKLQljaGFyICpyYXdkYXRhID0gTlVMTDsKLQlpbnQgcmF3ZGF0YWxlbiA9IDA7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsICJyYXdkYXRhIiwgMH07CisgICAgUHlPYmplY3QgKnYgPSBOVUxMOworICAgIGNoYXIgKnJhd2RhdGEgPSBOVUxMOworICAgIGludCByYXdkYXRhbGVuID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgInJhd2RhdGEiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxPcyMiLCBrdywgJnYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpCi0JcmV0dXJuIC0xOwotCWlmICh2ICYmIHJhd2RhdGEpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghdiAmJiAhcmF3ZGF0YSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmF3ZGF0YSkKLQl7Ci0JCWlmIChyYXdkYXRhbGVuICE9IHNpemVvZihGU1NwZWMpKQotCQl7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRlNTcGVjIHJhd2RhdGEgaW5jb3JyZWN0IHNpemUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQltZW1jcHkoJigoRlNTcGVjT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYsIHJhd2RhdGEsIHJhd2RhdGFsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5TWFjX0dldEZTU3BlYyh2LCAmKChGU1NwZWNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZikpIHJldHVybiAwOwotCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8T3MjIiwga3csICZ2LCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKQorICAgIHJldHVybiAtMTsKKyAgICBpZiAodiAmJiByYXdkYXRhKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXYgJiYgIXJhd2RhdGEpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG11c3QgYmUgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHJhd2RhdGEpCisgICAgeworICAgICAgICBpZiAocmF3ZGF0YWxlbiAhPSBzaXplb2YoRlNTcGVjKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTU3BlYyByYXdkYXRhIGluY29ycmVjdCBzaXplIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KCYoKEZTU3BlY09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLCByYXdkYXRhLCByYXdkYXRhbGVuKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChQeU1hY19HZXRGU1NwZWModiwgJigoRlNTcGVjT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYpKSByZXR1cm4gMDsKKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgRlNTcGVjX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCYoKEZTU3BlY09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU1NwZWMpKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KCYoKEZTU3BlY09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU1NwZWMpKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBGU1NwZWNfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZTU3BlY19UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIkNhcmJvbi5GaWxlLkZTU3BlYyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEZTU3BlY09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEZTU3BlY19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBGU1NwZWNfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEZTU3BlY19yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRlNTcGVjX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUZTU3BlY19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlGU1NwZWNfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRlNTcGVjX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlGU1NwZWNfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRlNTcGVjX3RwX25ldywgLyogdHBfbmV3ICovCi0JRlNTcGVjX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJDYXJib24uRmlsZS5GU1NwZWMiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihGU1NwZWNPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBGU1NwZWNfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRlNTcGVjX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBGU1NwZWNfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEZTU3BlY19oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBGU1NwZWNfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRlNTcGVjX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEZTU3BlY190cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRlNTcGVjX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEZTU3BlY190cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEZTU3BlY190cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCkBAIC0xNTQ2LDQ4MyArMTU0Niw0ODMgQEAKICNkZWZpbmUgRlNSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRlNSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRlNSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEZTUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRlNSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGU1JlZiBvYl9pdHNlbGY7CiB9IEZTUmVmT2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX05ldyhGU1JlZiAqaXRzZWxmKQogewotCUZTUmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRlNSZWZPYmplY3QsICZGU1JlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEZTUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRlNSZWZPYmplY3QsICZGU1JlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgdm9pZCBGU1JlZl9kZWFsbG9jKEZTUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU01ha2VGU1JlZlVuaWNvZGUoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCVRleHRFbmNvZGluZyB0ZXh0RW5jb2RpbmdIaW50OwotCUZTUmVmIG5ld1JlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1I2wiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZUxlbmd0aF9faW5fXywgJm5hbWVMZW5ndGhfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEVuY29kaW5nSGludCkpCi0JCXJldHVybiBOVUxMOwotCW5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JX2VyciA9IEZTTWFrZUZTUmVmVW5pY29kZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVuY29kaW5nSGludCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludDsKKyAgICBGU1JlZiBuZXdSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRFbmNvZGluZ0hpbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU01ha2VGU1JlZlVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGluZ0hpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0NvbXBhcmVGU1JlZnMoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgcmVmMjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZyZWYyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTQ29tcGFyZUZTUmVmcygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZWYyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiByZWYyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnJlZjIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNDb21wYXJlRlNSZWZzKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZjIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTQ3JlYXRlRmlsZVVuaWNvZGUoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCUZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOwotCUZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87Ci0JRlNSZWYgbmV3UmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKKyAgICBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOworICAgIEZTUmVmIG5ld1JlZjsKICNpZm5kZWYgX19MUDY0X18KLQlGU1NwZWMgbmV3U3BlYzsKKyAgICBGU1NwZWMgbmV3U3BlYzsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU0NyZWF0ZUZpbGVVbmljb2RlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2F0YWxvZ0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZiwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1I2xPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTQ2F0YWxvZ0luZm9fQ29udmVydCwgJmNhdGFsb2dJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmFtZUxlbmd0aF9fbGVuX18gPSBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBfZXJyID0gRlNDcmVhdGVGaWxlVW5pY29kZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhdGFsb2dJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCiAjaWZuZGVmIF9fTFA2NF9fCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1NwZWMKLSNlbHNlCS8qIF9fTFA2NF9fICovCi0JCQkJICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjCisjZWxzZSAgIC8qIF9fTFA2NF9fICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAogI2VuZGlmIC8qIF9fTFA2NF9fKi8KLQkJCQkgICk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJm5ld1NwZWMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJm5ld1NwZWMpOwogI2Vsc2UgLyogX19MUDY0X18gKi8KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPIiwgRlNSZWZfTmV3LCAmbmV3UmVmLCBQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPIiwgRlNSZWZfTmV3LCAmbmV3UmVmLCBQeV9Ob25lKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCi0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNDcmVhdGVEaXJlY3RvcnlVbmljb2RlKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOwotCWludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKLQlGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOwotCUZTUmVmIG5ld1JlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpuYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBuYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm87CisgICAgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbzsKKyAgICBGU1JlZiBuZXdSZWY7CiAjaWZuZGVmIF9fTFA2NF9fCi0JRlNTcGVjIG5ld1NwZWM7CisgICAgRlNTcGVjIG5ld1NwZWM7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JVUludDMyIG5ld0RpcklEOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCisgICAgVUludDMyIG5ld0RpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCiAjaWZuZGVmIF9fTFA2NF9fCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjLAogI2Vsc2UgLyogIV9fTFA2NF9fICovCi0JCQkJCU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0RpcklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0RpcklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJm5ld1NwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgbmV3RGlySUQpOwotI2Vsc2UJLyogX19MUDY0X18gKi8KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPbCIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsCi0JICAgICAgICAgICAgICAgICAgICAgbmV3RGlySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZuZXdTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RpcklEKTsKKyNlbHNlICAgLyogX19MUDY0X18gKi8KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGlySUQpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNEZWxldGVPYmplY3QoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0RlbGV0ZU9iamVjdCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0RlbGV0ZU9iamVjdCgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNNb3ZlT2JqZWN0KEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIGRlc3REaXJlY3Rvcnk7Ci0JRlNSZWYgbmV3UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJmRlc3REaXJlY3RvcnkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNNb3ZlT2JqZWN0KCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJmRlc3REaXJlY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBkZXN0RGlyZWN0b3J5OworICAgIEZTUmVmIG5ld1JlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZkZXN0RGlyZWN0b3J5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTTW92ZU9iamVjdCgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0RGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNFeGNoYW5nZU9iamVjdHMoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZGVzdFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZkZXN0UmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTRXhjaGFuZ2VPYmplY3RzKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdFJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgZGVzdFJlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZkZXN0UmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTRXhjaGFuZ2VPYmplY3RzKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNSZW5hbWVVbmljb2RlKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOwotCWludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludDsKLQlGU1JlZiBuZXdSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRFbmNvZGluZ0hpbnQpKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU1JlbmFtZVVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGluZ0hpbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpuYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBuYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ0hpbnQ7CisgICAgRlNSZWYgbmV3UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RW5jb2RpbmdIaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmFtZUxlbmd0aF9fbGVuX18gPSBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBfZXJyID0gRlNSZW5hbWVVbmljb2RlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUxlbmd0aF9fbGVuX18sIG5hbWVMZW5ndGhfX2luX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2RpbmdIaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNHZXRDYXRhbG9nSW5mbyhGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKLQlGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOwotCUhGU1VuaVN0cjI1NSBvdXROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOworICAgIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87CisgICAgSEZTVW5pU3RyMjU1IG91dE5hbWU7CiAjaWZuZGVmIF9fTFA2NF9fCi0JRlNTcGVjIGZzU3BlYzsKKyAgICBGU1NwZWMgZnNTcGVjOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCUZTUmVmIHBhcmVudFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0dldENhdGFsb2dJbmZvKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmY2F0YWxvZ0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dE5hbWUsCisgICAgRlNSZWYgcGFyZW50UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmFtZSwKICNpZm5kZWYgX19MUDY0X18KLQkgICAgICAgICAgICAgICAgICAgICAgICAmZnNTcGVjLAotI2Vsc2UJLyogX19MUDY0X18gKi8KLQkJCQlOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc1NwZWMsCisjZWxzZSAgIC8qIF9fTFA2NF9fICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmVudFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19OZXcsICZjYXRhbG9nSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJm91dE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJmZzU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZwYXJlbnRSZWYpOwotI2Vsc2UJLyogX19MUDY0X18gKi8KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJk9PJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19OZXcsICZjYXRhbG9nSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJm91dE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZwYXJlbnRSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19OZXcsICZjYXRhbG9nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJm91dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJmZzU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZwYXJlbnRSZWYpOworI2Vsc2UgICAvKiBfX0xQNjRfXyAqLworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mT08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU0NhdGFsb2dJbmZvX05ldywgJmNhdGFsb2dJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmb3V0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnBhcmVudFJlZik7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU1NldENhdGFsb2dJbmZvKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOwotCUZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNTZXRDYXRhbG9nSW5mbygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEluZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmNhdGFsb2dJbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKKyAgICBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTQ2F0YWxvZ0luZm9fQ29udmVydCwgJmNhdGFsb2dJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTU2V0Q2F0YWxvZ0luZm8oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNDcmVhdGVGb3JrKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOwotCVVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlfZXJyID0gRlNDcmVhdGVGb3JrKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fLCBmb3JrTmFtZUxlbmd0aF9faW5fXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU0NyZWF0ZUZvcmsoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0RlbGV0ZUZvcmsoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU0RlbGV0ZUZvcmsoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18gPSBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgX2VyciA9IEZTRGVsZXRlRm9yaygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTT3BlbkZvcmsoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCVNJbnQ4IHBlcm1pc3Npb25zOwotCUZTSU9SZWZOdW0gZm9ya1JlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1I2IiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9ucykpCi0JCXJldHVybiBOVUxMOwotCWZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlfZXJyID0gRlNPcGVuRm9yaygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zLAotCSAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3JrUmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgU0ludDggcGVybWlzc2lvbnM7CisgICAgRlNJT1JlZk51bSBmb3JrUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU09wZW5Gb3JrKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18sCisgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtSZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZOTm90aWZ5KEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZOTWVzc2FnZSBtZXNzYWdlOwotCU9wdGlvbkJpdHMgZmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZOTm90aWZ5KCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBtZXNzYWdlLAotCSAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRk5NZXNzYWdlIG1lc3NhZ2U7CisgICAgT3B0aW9uQml0cyBmbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRk5Ob3RpZnkoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU05ld0FsaWFzTWluaW1hbChGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBbGlhc0hhbmRsZSBpbkFsaWFzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNOZXdBbGlhc01pbmltYWwoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFsaWFzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBpbkFsaWFzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBpbkFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNOZXdBbGlhc01pbmltYWwoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFsaWFzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBpbkFsaWFzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0lzQWxpYXNGaWxlKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUJvb2xlYW4gYWxpYXNGaWxlRmxhZzsKLQlCb29sZWFuIGZvbGRlckZsYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0lzQWxpYXNGaWxlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICZhbGlhc0ZpbGVGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICZmb2xkZXJGbGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgYWxpYXNGaWxlRmxhZywKLQkgICAgICAgICAgICAgICAgICAgICBmb2xkZXJGbGFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBCb29sZWFuIGFsaWFzRmlsZUZsYWc7CisgICAgQm9vbGVhbiBmb2xkZXJGbGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNJc0FsaWFzRmlsZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpYXNGaWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZm9sZGVyRmxhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzRmlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyRmxhZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNSZWZNYWtlUGF0aChGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NTdGF0dXMgX2VycjsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2RlZmluZSBNQVhQQVRITkFNRSAxMDI0Ci0JVUludDggcGF0aFtNQVhQQVRITkFNRV07Ci0JVUludDMyIG1heFBhdGhTaXplID0gTUFYUEFUSE5BTUU7CisgICAgVUludDggcGF0aFtNQVhQQVRITkFNRV07CisgICAgVUludDMyIG1heFBhdGhTaXplID0gTUFYUEFUSE5BTUU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9lcnIgPSBGU1JlZk1ha2VQYXRoKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhdGhTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIiwgcGF0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1JlZk1ha2VQYXRoKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhdGhTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIiwgcGF0aCk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9hc19wYXRobmFtZShGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfcmVzID0gRlNSZWZfRlNSZWZNYWtlUGF0aChfc2VsZiwgX2FyZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcmVzID0gRlNSZWZfRlNSZWZNYWtlUGF0aChfc2VsZiwgX2FyZ3MpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGU1JlZl9tZXRob2RzW10gPSB7Ci0JeyJGU01ha2VGU1JlZlVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNNYWtlRlNSZWZVbmljb2RlLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ0hpbnQpIC0+IChGU1JlZiBuZXdSZWYpIil9LAotCXsiRlNDb21wYXJlRlNSZWZzIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTQ29tcGFyZUZTUmVmcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgcmVmMikgLT4gTm9uZSIpfSwKLQl7IkZTQ3JlYXRlRmlsZVVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNDcmVhdGVGaWxlVW5pY29kZSwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIG5hbWVMZW5ndGgsIEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvLCBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYykiKX0sCi0JeyJGU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNDcmVhdGVEaXJlY3RvcnlVbmljb2RlLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm8sIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm8pIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjLCBVSW50MzIgbmV3RGlySUQpIil9LAotCXsiRlNEZWxldGVPYmplY3QiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNEZWxldGVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkZTTW92ZU9iamVjdCIsIChQeUNGdW5jdGlvbilGU1JlZl9GU01vdmVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGRlc3REaXJlY3RvcnkpIC0+IChGU1JlZiBuZXdSZWYpIil9LAotCXsiRlNFeGNoYW5nZU9iamVjdHMiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNFeGNoYW5nZU9iamVjdHMsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGRlc3RSZWYpIC0+IE5vbmUiKX0sCi0JeyJGU1JlbmFtZVVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNSZW5hbWVVbmljb2RlLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ0hpbnQpIC0+IChGU1JlZiBuZXdSZWYpIil9LAotCXsiRlNHZXRDYXRhbG9nSW5mbyIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0dldENhdGFsb2dJbmZvLCAxLAotCSBQeURvY19TVFIoIihGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbykgLT4gKEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm8sIEhGU1VuaVN0cjI1NSBvdXROYW1lLCBGU1NwZWMgZnNTcGVjLCBGU1JlZiBwYXJlbnRSZWYpIil9LAotCXsiRlNTZXRDYXRhbG9nSW5mbyIsIChQeUNGdW5jdGlvbilGU1JlZl9GU1NldENhdGFsb2dJbmZvLCAxLAotCSBQeURvY19TVFIoIihGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbywgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbykgLT4gTm9uZSIpfSwKLQl7IkZTQ3JlYXRlRm9yayIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NyZWF0ZUZvcmssIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCkgLT4gTm9uZSIpfSwKLQl7IkZTRGVsZXRlRm9yayIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0RlbGV0ZUZvcmssIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCkgLT4gTm9uZSIpfSwKLQl7IkZTT3BlbkZvcmsiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNPcGVuRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGZvcmtOYW1lTGVuZ3RoLCBTSW50OCBwZXJtaXNzaW9ucykgLT4gKFNJbnQxNiBmb3JrUmVmTnVtKSIpfSwKLQl7IkZOTm90aWZ5IiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZOTm90aWZ5LCAxLAotCSBQeURvY19TVFIoIihGTk1lc3NhZ2UgbWVzc2FnZSwgT3B0aW9uQml0cyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkZTTmV3QWxpYXNNaW5pbWFsIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTTmV3QWxpYXNNaW5pbWFsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBbGlhc0hhbmRsZSBpbkFsaWFzKSIpfSwKLQl7IkZTSXNBbGlhc0ZpbGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNJc0FsaWFzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBhbGlhc0ZpbGVGbGFnLCBCb29sZWFuIGZvbGRlckZsYWcpIil9LAotCXsiRlNSZWZNYWtlUGF0aCIsIChQeUNGdW5jdGlvbilGU1JlZl9GU1JlZk1ha2VQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IHN0cmluZyIpfSwKLQl7ImFzX3BhdGhuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX2FzX3BhdGhuYW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IHN0cmluZyIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkZTTWFrZUZTUmVmVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU01ha2VGU1JlZlVuaWNvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludCkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCisgICAgeyJGU0NvbXBhcmVGU1JlZnMiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNDb21wYXJlRlNSZWZzLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiByZWYyKSAtPiBOb25lIil9LAorICAgIHsiRlNDcmVhdGVGaWxlVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NyZWF0ZUZpbGVVbmljb2RlLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm8sIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm8pIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjKSIpfSwKKyAgICB7IkZTQ3JlYXRlRGlyZWN0b3J5VW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbywgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbykgLT4gKEZTUmVmIG5ld1JlZiwgRlNTcGVjIG5ld1NwZWMsIFVJbnQzMiBuZXdEaXJJRCkiKX0sCisgICAgeyJGU0RlbGV0ZU9iamVjdCIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0RlbGV0ZU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRlNNb3ZlT2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTTW92ZU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgZGVzdERpcmVjdG9yeSkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCisgICAgeyJGU0V4Y2hhbmdlT2JqZWN0cyIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0V4Y2hhbmdlT2JqZWN0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgZGVzdFJlZikgLT4gTm9uZSIpfSwKKyAgICB7IkZTUmVuYW1lVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU1JlbmFtZVVuaWNvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludCkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCisgICAgeyJGU0dldENhdGFsb2dJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTR2V0Q2F0YWxvZ0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvKSAtPiAoRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbywgSEZTVW5pU3RyMjU1IG91dE5hbWUsIEZTU3BlYyBmc1NwZWMsIEZTUmVmIHBhcmVudFJlZikiKX0sCisgICAgeyJGU1NldENhdGFsb2dJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTU2V0Q2F0YWxvZ0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvLCBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvKSAtPiBOb25lIil9LAorICAgIHsiRlNDcmVhdGVGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTQ3JlYXRlRm9yaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiBOb25lIil9LAorICAgIHsiRlNEZWxldGVGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTRGVsZXRlRm9yaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiBOb25lIil9LAorICAgIHsiRlNPcGVuRm9yayIsIChQeUNGdW5jdGlvbilGU1JlZl9GU09wZW5Gb3JrLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgZm9ya05hbWVMZW5ndGgsIFNJbnQ4IHBlcm1pc3Npb25zKSAtPiAoU0ludDE2IGZvcmtSZWZOdW0pIil9LAorICAgIHsiRk5Ob3RpZnkiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRk5Ob3RpZnksIDEsCisgICAgIFB5RG9jX1NUUigiKEZOTWVzc2FnZSBtZXNzYWdlLCBPcHRpb25CaXRzIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiRlNOZXdBbGlhc01pbmltYWwiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNOZXdBbGlhc01pbmltYWwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFsaWFzSGFuZGxlIGluQWxpYXMpIil9LAorICAgIHsiRlNJc0FsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0lzQWxpYXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGFsaWFzRmlsZUZsYWcsIEJvb2xlYW4gZm9sZGVyRmxhZykiKX0sCisgICAgeyJGU1JlZk1ha2VQYXRoIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTUmVmTWFrZVBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gc3RyaW5nIil9LAorICAgIHsiYXNfcGF0aG5hbWUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfYXNfcGF0aG5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gc3RyaW5nIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9nZXRfZGF0YShGU1JlZk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc2VsZi0+b2JfaXRzZWxmLCBzaXplb2Yoc2VsZi0+b2JfaXRzZWxmKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKHNlbGYtPm9iX2l0c2VsZikpOwogfQogCiAjZGVmaW5lIEZTUmVmX3NldF9kYXRhIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIEZTUmVmX2dldHNldGxpc3RbXSA9IHsKLQl7ImRhdGEiLCAoZ2V0dGVyKUZTUmVmX2dldF9kYXRhLCAoc2V0dGVyKUZTUmVmX3NldF9kYXRhLCAiUmF3IGRhdGEgb2YgdGhlIEZTUmVmIG9iamVjdCJ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7ImRhdGEiLCAoZ2V0dGVyKUZTUmVmX2dldF9kYXRhLCAoc2V0dGVyKUZTUmVmX3NldF9kYXRhLCAiUmF3IGRhdGEgb2YgdGhlIEZTUmVmIG9iamVjdCJ9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtMjAzMyw5MyArMjAzMyw5MyBAQAogI2RlZmluZSBGU1JlZl9oYXNoIE5VTEwKIHN0YXRpYyBpbnQgRlNSZWZfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICp2ID0gTlVMTDsKLQljaGFyICpyYXdkYXRhID0gTlVMTDsKLQlpbnQgcmF3ZGF0YWxlbiA9IDA7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsICJyYXdkYXRhIiwgMH07CisgICAgUHlPYmplY3QgKnYgPSBOVUxMOworICAgIGNoYXIgKnJhd2RhdGEgPSBOVUxMOworICAgIGludCByYXdkYXRhbGVuID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgInJhd2RhdGEiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxPcyMiLCBrdywgJnYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpCi0JcmV0dXJuIC0xOwotCWlmICh2ICYmIHJhd2RhdGEpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghdiAmJiAhcmF3ZGF0YSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmF3ZGF0YSkKLQl7Ci0JCWlmIChyYXdkYXRhbGVuICE9IHNpemVvZihGU1JlZikpCi0JCXsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU1JlZiByYXdkYXRhIGluY29ycmVjdCBzaXplIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbWVtY3B5KCYoKEZTUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYsIHJhd2RhdGEsIHJhd2RhdGFsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5TWFjX0dldEZTUmVmKHYsICYoKEZTUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYpKSByZXR1cm4gMDsKLQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifE9zIyIsIGt3LCAmdiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkKKyAgICByZXR1cm4gLTE7CisgICAgaWYgKHYgJiYgcmF3ZGF0YSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmx5IG9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtYXkgYmUgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCF2ICYmICFyYXdkYXRhKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyYXdkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKHJhd2RhdGFsZW4gIT0gc2l6ZW9mKEZTUmVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTUmVmIHJhd2RhdGEgaW5jb3JyZWN0IHNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoJigoRlNSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoUHlNYWNfR2V0RlNSZWYodiwgJigoRlNSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZikpIHJldHVybiAwOworICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBGU1JlZl90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCYoKEZTUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZTUmVmKSk7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmKChGU1JlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU1JlZikpOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIEZTUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBGU1JlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIkNhcmJvbi5GaWxlLkZTUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRlNSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBGU1JlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBGU1JlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRlNSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEZTUmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUZTUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUZTUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUZTUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlGU1JlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlGU1JlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUZTUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJDYXJib24uRmlsZS5GU1JlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEZTUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRlNSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRlNSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEZTUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBGU1JlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBGU1JlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBGU1JlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBGU1JlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRlNSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRlNSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBGU1JlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIEZTUmVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIxMjcsMTEyMyArMjEyNywxMTIzIEBACiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfVW5tb3VudFZvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHI2MyB2b2xOYW1lOwotCXNob3J0IHZSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB2b2xOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVbm1vdW50Vm9sKHZvbE5hbWUsCi0JICAgICAgICAgICAgICAgICAgdlJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU3RyNjMgdm9sTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVW5tb3VudFZvbCh2b2xOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRmx1c2hWb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU3RyNjMgdm9sTmFtZTsKLQlzaG9ydCB2UmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdm9sTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmx1c2hWb2wodm9sTmFtZSwKLQkgICAgICAgICAgICAgICAgdlJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU3RyNjMgdm9sTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmx1c2hWb2wodm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdlJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IU2V0Vm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjYzIHZvbE5hbWU7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHZvbE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSFNldFZvbCh2b2xOYW1lLAotCSAgICAgICAgICAgICAgIHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjYzIHZvbE5hbWU7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHZvbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSFNldFZvbCh2b2xOYW1lLAorICAgICAgICAgICAgICAgICAgIHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNDbG9zZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNDbG9zZShyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0Nsb3NlKHJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9BbGxvY2F0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0JbG9uZyBjb3VudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBbGxvY2F0ZShyZWZOdW0sCi0JICAgICAgICAgICAgICAgICZjb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgY291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGNvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFsbG9jYXRlKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgJmNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9HZXRFT0YoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVmTnVtOwotCWxvbmcgbG9nRU9GOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEVPRihyZWZOdW0sCi0JICAgICAgICAgICAgICAmbG9nRU9GKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBsb2dFT0YpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGxvZ0VPRjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRFT0YocmVmTnVtLAorICAgICAgICAgICAgICAgICAgJmxvZ0VPRik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRU9GKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX1NldEVPRihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0JbG9uZyBsb2dFT0Y7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbG9nRU9GKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldEVPRihyZWZOdW0sCi0JICAgICAgICAgICAgICBsb2dFT0YpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGxvZ0VPRjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2dFT0YpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RU9GKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgIGxvZ0VPRik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9HZXRGUG9zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlZk51bTsKLQlsb25nIGZpbGVQb3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RlBvcyhyZWZOdW0sCi0JICAgICAgICAgICAgICAgJmZpbGVQb3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGZpbGVQb3MpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGZpbGVQb3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RlBvcyhyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgJmZpbGVQb3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQb3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfU2V0RlBvcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0Jc2hvcnQgcG9zTW9kZTsKLQlsb25nIHBvc09mZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc09mZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRGUG9zKHJlZk51bSwKLQkgICAgICAgICAgICAgICBwb3NNb2RlLAotCSAgICAgICAgICAgICAgIHBvc09mZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVmTnVtOworICAgIHNob3J0IHBvc01vZGU7CisgICAgbG9uZyBwb3NPZmY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NPZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RlBvcyhyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgcG9zTW9kZSwKKyAgICAgICAgICAgICAgICAgICBwb3NPZmYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfR2V0VlJlZk51bShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBmaWxlUmVmTnVtOwotCXNob3J0IHZSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmaWxlUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFZSZWZOdW0oZmlsZVJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAmdlJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgdlJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgZmlsZVJlZk51bTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRWUmVmTnVtKGZpbGVSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSEdldFZvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHJpbmdQdHIgdm9sTmFtZTsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsICZ2b2xOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhHZXRWb2wodm9sTmFtZSwKLQkgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAmZGlySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICB2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIGRpcklEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHJpbmdQdHIgdm9sTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsICZ2b2xOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhHZXRWb2wodm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAmZGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRpcklEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hPcGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JU0ludDggcGVybWlzc2lvbjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIT3Blbih2UmVmTnVtLAotCSAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgZmlsZU5hbWUsCi0JICAgICAgICAgICAgIHBlcm1pc3Npb24sCi0JICAgICAgICAgICAgICZyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBTSW50OCBwZXJtaXNzaW9uOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhPcGVuKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hPcGVuREYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBmaWxlTmFtZTsKLQlTSW50OCBwZXJtaXNzaW9uOwotCXNob3J0IHJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhPcGVuREYodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAotCSAgICAgICAgICAgICAgICZyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBTSW50OCBwZXJtaXNzaW9uOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhPcGVuREYodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IT3BlblJGKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JU0ludDggcGVybWlzc2lvbjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIT3BlblJGKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKLQkgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgZmlsZU5hbWU7CisgICAgU0ludDggcGVybWlzc2lvbjsKKyAgICBzaG9ydCByZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIT3BlblJGKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfQWxsb2NDb250aWcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVmTnVtOwotCWxvbmcgY291bnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWxsb2NDb250aWcocmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAmY291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZWZOdW07CisgICAgbG9uZyBjb3VudDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBbGxvY0NvbnRpZyhyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICZjb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSENyZWF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOwotCU9TVHlwZSBjcmVhdG9yOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhDcmVhdGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgIGZpbGVUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhDcmVhdGUodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0RpckNyZWF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgcGFyZW50RGlySUQ7Ci0JU3RyMjU1IGRpcmVjdG9yeU5hbWU7Ci0JbG9uZyBjcmVhdGVkRGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFyZW50RGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZGlyZWN0b3J5TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEaXJDcmVhdGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgIHBhcmVudERpcklELAotCSAgICAgICAgICAgICAgICAgZGlyZWN0b3J5TmFtZSwKLQkgICAgICAgICAgICAgICAgICZjcmVhdGVkRGlySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWREaXJJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIHBhcmVudERpcklEOworICAgIFN0cjI1NSBkaXJlY3RvcnlOYW1lOworICAgIGxvbmcgY3JlYXRlZERpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmVudERpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRpcmVjdG9yeU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGlyQ3JlYXRlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBwYXJlbnREaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpcklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRGlySUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSERlbGV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhEZWxldGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBmaWxlTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIRGVsZXRlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSEdldEZJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JRkluZm8gZm5kckluZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSEdldEZJbmZvKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRkluZm9fTmV3LCAmZm5kckluZm8pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgZmlsZU5hbWU7CisgICAgRkluZm8gZm5kckluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSEdldEZJbmZvKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkluZm9fTmV3LCAmZm5kckluZm8pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSFNldEZJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JRkluZm8gZm5kckluZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRkluZm9fQ29udmVydCwgJmZuZHJJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhTZXRGSW5mbyh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICZmbmRySW5mbyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBGSW5mbyBmbmRySW5mbzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSW5mb19Db252ZXJ0LCAmZm5kckluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSFNldEZJbmZvKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hTZXRGTG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhTZXRGTG9jayh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICBmaWxlTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIU2V0RkxvY2sodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSFJzdEZMb2NrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSFJzdEZMb2NrKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgIGZpbGVOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhSc3RGTG9jayh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IUmVuYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgb2xkTmFtZTsKLQlTdHIyNTUgbmV3TmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG9sZE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmV3TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIUmVuYW1lKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgb2xkTmFtZSwKLQkgICAgICAgICAgICAgICBuZXdOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IG9sZE5hbWU7CisgICAgU3RyMjU1IG5ld05hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5ld05hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSFJlbmFtZSh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgIG9sZE5hbWUsCisgICAgICAgICAgICAgICAgICAgbmV3TmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9DYXRNb3ZlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgb2xkTmFtZTsKLQlsb25nIG5ld0RpcklEOwotCVN0cjI1NSBuZXdOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG9sZE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdEaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENhdE1vdmUodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBvbGROYW1lLAotCSAgICAgICAgICAgICAgIG5ld0RpcklELAotCSAgICAgICAgICAgICAgIG5ld05hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgb2xkTmFtZTsKKyAgICBsb25nIG5ld0RpcklEOworICAgIFN0cjI1NSBuZXdOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG9sZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdEaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENhdE1vdmUodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICBvbGROYW1lLAorICAgICAgICAgICAgICAgICAgIG5ld0RpcklELAorICAgICAgICAgICAgICAgICAgIG5ld05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNNYWtlRlNTcGVjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JRlNTcGVjIHNwZWM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNNYWtlRlNTcGVjKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgJnNwZWMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmc3BlYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBGU1NwZWMgc3BlYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU01ha2VGU1NwZWModlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmc3BlYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZzcGVjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTR2V0Rm9ya1Bvc2l0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCVNJbnQ2NCBwb3NpdGlvbjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNHZXRGb3JrUG9zaXRpb24oZm9ya1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJMIiwKLQkgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgU0ludDY0IHBvc2l0aW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0dldEZvcmtQb3NpdGlvbihmb3JrUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTU2V0Rm9ya1Bvc2l0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCVVJbnQxNiBwb3NpdGlvbk1vZGU7Ci0JU0ludDY0IHBvc2l0aW9uT2Zmc2V0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhITCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25Nb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25PZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNTZXRGb3JrUG9zaXRpb24oZm9ya1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Nb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgVUludDE2IHBvc2l0aW9uTW9kZTsKKyAgICBTSW50NjQgcG9zaXRpb25PZmZzZXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEhMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1NldEZvcmtQb3NpdGlvbihmb3JrUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTR2V0Rm9ya1NpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGZvcmtSZWZOdW07Ci0JU0ludDY0IGZvcmtTaXplOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0dldEZvcmtTaXplKGZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgJmZvcmtTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJMIiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3JrU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgU0ludDY0IGZvcmtTaXplOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0dldEZvcmtTaXplKGZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU1NldEZvcmtTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCVVJbnQxNiBwb3NpdGlvbk1vZGU7Ci0JU0ludDY0IHBvc2l0aW9uT2Zmc2V0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhITCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25Nb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25PZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNTZXRGb3JrU2l6ZShmb3JrUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgVUludDE2IHBvc2l0aW9uTW9kZTsKKyAgICBTSW50NjQgcG9zaXRpb25PZmZzZXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEhMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1NldEZvcmtTaXplKGZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTQWxsb2NhdGVGb3JrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCUZTQWxsb2NhdGlvbkZsYWdzIGZsYWdzOwotCVVJbnQxNiBwb3NpdGlvbk1vZGU7Ci0JU0ludDY0IHBvc2l0aW9uT2Zmc2V0OwotCVVJbnQ2NCByZXF1ZXN0Q291bnQ7Ci0JVUludDY0IGFjdHVhbENvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhISExMIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdENvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTQWxsb2NhdGVGb3JrKGZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxDb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTCIsCi0JICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBmb3JrUmVmTnVtOworICAgIEZTQWxsb2NhdGlvbkZsYWdzIGZsYWdzOworICAgIFVJbnQxNiBwb3NpdGlvbk1vZGU7CisgICAgU0ludDY0IHBvc2l0aW9uT2Zmc2V0OworICAgIFVJbnQ2NCByZXF1ZXN0Q291bnQ7CisgICAgVUludDY0IGFjdHVhbENvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhISExMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdENvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTQWxsb2NhdGVGb3JrKGZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNGbHVzaEZvcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGZvcmtSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTRmx1c2hGb3JrKGZvcmtSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBmb3JrUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0ZsdXNoRm9yayhmb3JrUmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTQ2xvc2VGb3JrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0Nsb3NlRm9yayhmb3JrUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgZm9ya1JlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNDbG9zZUZvcmsoZm9ya1JlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU0dldERhdGFGb3JrTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIRlNVbmlTdHIyNTUgZGF0YUZvcmtOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNHZXREYXRhRm9ya05hbWUoJmRhdGFGb3JrTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmZGF0YUZvcmtOYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIRlNVbmlTdHIyNTUgZGF0YUZvcmtOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNHZXREYXRhRm9ya05hbWUoJmRhdGFGb3JrTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmZGF0YUZvcmtOYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTR2V0UmVzb3VyY2VGb3JrTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIRlNVbmlTdHIyNTUgcmVzb3VyY2VGb3JrTmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgmcmVzb3VyY2VGb3JrTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmcmVzb3VyY2VGb3JrTmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSEZTVW5pU3RyMjU1IHJlc291cmNlRm9ya05hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0dldFJlc291cmNlRm9ya05hbWUoJnJlc291cmNlRm9ya05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJnJlc291cmNlRm9ya05hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNQYXRoTWFrZVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50OCAqIHBhdGg7Ci0JRlNSZWYgcmVmOwotCUJvb2xlYW4gaXNEaXJlY3Rvcnk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTUGF0aE1ha2VSZWYocGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZyZWYsCi0JICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQ4ICogcGF0aDsKKyAgICBGU1JlZiByZWY7CisgICAgQm9vbGVhbiBpc0RpcmVjdG9yeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNQYXRoTWFrZVJlZihwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GTk5vdGlmeUJ5UGF0aChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50OCAqIHBhdGg7Ci0JRk5NZXNzYWdlIG1lc3NhZ2U7Ci0JT3B0aW9uQml0cyBmbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGTk5vdGlmeUJ5UGF0aChwYXRoLAotCSAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDggKiBwYXRoOworICAgIEZOTWVzc2FnZSBtZXNzYWdlOworICAgIE9wdGlvbkJpdHMgZmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2xsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRk5Ob3RpZnlCeVBhdGgocGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRk5Ob3RpZnlBbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRk5NZXNzYWdlIG1lc3NhZ2U7Ci0JT3B0aW9uQml0cyBmbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRk5Ob3RpZnlBbGwobWVzc2FnZSwKLQkgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZOTWVzc2FnZSBtZXNzYWdlOworICAgIE9wdGlvbkJpdHMgZmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZOTm90aWZ5QWxsKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpGaWxlX05ld0FsaWFzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0YXJnZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3QWxpYXMoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICZhbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjIHRhcmdldDsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3QWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfTmV3QWxpYXNNaW5pbWFsRnJvbUZ1bGxQYXRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWNoYXIgKmZ1bGxQYXRoX19pbl9fOwotCWludCBmdWxsUGF0aF9fbGVuX187Ci0JaW50IGZ1bGxQYXRoX19pbl9sZW5fXzsKLQlTdHIzMiB6b25lTmFtZTsKLQlTdHIzMSBzZXJ2ZXJOYW1lOwotCUFsaWFzSGFuZGxlIGFsaWFzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmdWxsUGF0aF9faW5fXywgJmZ1bGxQYXRoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB6b25lTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzZXJ2ZXJOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZnVsbFBhdGhfX2xlbl9fID0gZnVsbFBhdGhfX2luX2xlbl9fOwotCV9lcnIgPSBOZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgoZnVsbFBhdGhfX2xlbl9fLCBmdWxsUGF0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGNoYXIgKmZ1bGxQYXRoX19pbl9fOworICAgIGludCBmdWxsUGF0aF9fbGVuX187CisgICAgaW50IGZ1bGxQYXRoX19pbl9sZW5fXzsKKyAgICBTdHIzMiB6b25lTmFtZTsKKyAgICBTdHIzMSBzZXJ2ZXJOYW1lOworICAgIEFsaWFzSGFuZGxlIGFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsUGF0aF9faW5fXywgJmZ1bGxQYXRoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB6b25lTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzZXJ2ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZnVsbFBhdGhfX2xlbl9fID0gZnVsbFBhdGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBOZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgoZnVsbFBhdGhfX2xlbl9fLCBmdWxsUGF0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfUmVzb2x2ZUFsaWFzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgdGhlU3BlYzsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRoZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZSgmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWxpYXNDaGFpbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgdGhlU3BlYzsKKyAgICBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKKyAgICBCb29sZWFuIHRhcmdldElzRm9sZGVyOworICAgIEJvb2xlYW4gd2FzQWxpYXNlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZSgmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWxpYXNDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgdGhlU3BlYzsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQl1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgdGhlU3BlYzsKKyAgICBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKKyAgICBCb29sZWFuIHRhcmdldElzRm9sZGVyOworICAgIEJvb2xlYW4gd2FzQWxpYXNlZDsKKyAgICB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX1VwZGF0ZUFsaWFzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX0NvbnZlcnQsICZhbGlhcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgYWxpYXMsCi0JICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyB0YXJnZXQ7CisgICAgQWxpYXNIYW5kbGUgYWxpYXM7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc19Db252ZXJ0LCAmYWxpYXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9SZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3NOb1VJKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyB0aGVTcGVjOwotCUJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zOwotCUJvb2xlYW4gdGFyZ2V0SXNGb2xkZXI7Ci0JQm9vbGVhbiB3YXNBbGlhc2VkOwotCXVuc2lnbmVkIGxvbmcgbW91bnRGbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW91bnRGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3NOb1VJKCZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0SXNGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJnRoZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SXNGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzQWxpYXNlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIHRoZVNwZWM7CisgICAgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnM7CisgICAgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlcjsKKyAgICBCb29sZWFuIHdhc0FsaWFzZWQ7CisgICAgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUkoJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTTmV3QWxpYXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNSZWYgdGFyZ2V0OwotCUFsaWFzSGFuZGxlIGluQWxpYXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNSZWZQdHIsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRhcmdldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU05ld0FsaWFzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgJmluQWxpYXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBbGlhc19OZXcsIGluQWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIGZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTUmVmIHRhcmdldDsKKyAgICBBbGlhc0hhbmRsZSBpbkFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNOZXdBbGlhcyhmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICZpbkFsaWFzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBpbkFsaWFzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIHRoZVJlZjsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQl1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZ0aGVSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGhlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIHRoZVJlZjsKKyAgICBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKKyAgICBCb29sZWFuIHRhcmdldElzRm9sZGVyOworICAgIEJvb2xlYW4gd2FzQWxpYXNlZDsKKyAgICB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZ0aGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGhlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIHRoZVJlZjsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9Db252ZXJ0LCAmdGhlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZUFsaWFzQ2hhaW5zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTUmVzb2x2ZUFsaWFzRmlsZSgmdGhlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRoZVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiB0aGVSZWY7CisgICAgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnM7CisgICAgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlcjsKKyAgICBCb29sZWFuIHdhc0FsaWFzZWQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRoZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1Jlc29sdmVBbGlhc0ZpbGUoJnRoZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0aGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SXNGb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQWxpYXNlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU1VwZGF0ZUFsaWFzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIGZyb21GaWxlX19idWZfXzsKLQlGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmIHRhcmdldDsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1JlZlB0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9Db252ZXJ0LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICBBbGlhc19Db252ZXJ0LCAmYWxpYXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNVcGRhdGVBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIGFsaWFzLAotCSAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBmcm9tRmlsZV9fYnVmX187CisgICAgRlNSZWYgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQWxpYXNIYW5kbGUgYWxpYXM7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNSZWZQdHIsICZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfQ29udmVydCwgJmFsaWFzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTVXBkYXRlQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9wYXRobmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JUHlPYmplY3QgKm9iajsKKyAgICBQeU9iamVjdCAqb2JqOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyIsICZvYmopKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikpIHsKLQkgICAgICAgIFB5X0lOQ1JFRihvYmopOwotCSAgICAgICAgcmV0dXJuIG9iajsKLQl9Ci0JaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKQotCSAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcob2JqLCAidXRmOCIsICJzdHJpY3QiKTsKLQlfcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChvYmosICJhc19wYXRobmFtZSIsIE5VTEwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8iLCAmb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgIHJldHVybiBvYmo7CisgICAgfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcob2JqLCAidXRmOCIsICJzdHJpY3QiKTsKKyAgICBfcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChvYmosICJhc19wYXRobmFtZSIsIE5VTEwpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGaWxlX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IlVubW91bnRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9Vbm1vdW50Vm9sLCAxLAotCSBQeURvY19TVFIoIihTdHI2MyB2b2xOYW1lLCBzaG9ydCB2UmVmTnVtKSAtPiBOb25lIil9LAotCXsiRmx1c2hWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9GbHVzaFZvbCwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyNjMgdm9sTmFtZSwgc2hvcnQgdlJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IkhTZXRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9IU2V0Vm9sLCAxLAotCSBQeURvY19TVFIoIihTdHI2MyB2b2xOYW1lLCBzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiBOb25lIil9LAotCXsiRlNDbG9zZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTQ2xvc2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IkFsbG9jYXRlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfQWxsb2NhdGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gKGxvbmcgY291bnQpIil9LAotCXsiR2V0RU9GIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfR2V0RU9GLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGxvZ0VPRikiKX0sCi0JeyJTZXRFT0YiLCAoUHlDRnVuY3Rpb24pRmlsZV9TZXRFT0YsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgbG9uZyBsb2dFT0YpIC0+IE5vbmUiKX0sCi0JeyJHZXRGUG9zIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfR2V0RlBvcywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAobG9uZyBmaWxlUG9zKSIpfSwKLQl7IlNldEZQb3MiLCAoUHlDRnVuY3Rpb24pRmlsZV9TZXRGUG9zLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIHNob3J0IHBvc01vZGUsIGxvbmcgcG9zT2ZmKSAtPiBOb25lIil9LAotCXsiR2V0VlJlZk51bSIsIChQeUNGdW5jdGlvbilGaWxlX0dldFZSZWZOdW0sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZpbGVSZWZOdW0pIC0+IChzaG9ydCB2UmVmTnVtKSIpfSwKLQl7IkhHZXRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9IR2V0Vm9sLCAxLAotCSBQeURvY19TVFIoIihTdHJpbmdQdHIgdm9sTmFtZSkgLT4gKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQpIil9LAotCXsiSE9wZW4iLCAoUHlDRnVuY3Rpb24pRmlsZV9IT3BlbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBTSW50OCBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgcmVmTnVtKSIpfSwKLQl7IkhPcGVuREYiLCAoUHlDRnVuY3Rpb24pRmlsZV9IT3BlbkRGLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAotCXsiSE9wZW5SRiIsIChQeUNGdW5jdGlvbilGaWxlX0hPcGVuUkYsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCi0JeyJBbGxvY0NvbnRpZyIsIChQeUNGdW5jdGlvbilGaWxlX0FsbG9jQ29udGlnLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGNvdW50KSIpfSwKLQl7IkhDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9IQ3JlYXRlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJEaXJDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9EaXJDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgcGFyZW50RGlySUQsIFN0cjI1NSBkaXJlY3RvcnlOYW1lKSAtPiAobG9uZyBjcmVhdGVkRGlySUQpIil9LAotCXsiSERlbGV0ZSIsIChQeUNGdW5jdGlvbilGaWxlX0hEZWxldGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKLQl7IkhHZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGaWxlX0hHZXRGSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiAoRkluZm8gZm5kckluZm8pIil9LAotCXsiSFNldEZJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFNldEZJbmZvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIEZJbmZvIGZuZHJJbmZvKSAtPiBOb25lIil9LAotCXsiSFNldEZMb2NrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFNldEZMb2NrLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IE5vbmUiKX0sCi0JeyJIUnN0RkxvY2siLCAoUHlDRnVuY3Rpb24pRmlsZV9IUnN0RkxvY2ssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKLQl7IkhSZW5hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9IUmVuYW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgb2xkTmFtZSwgU3RyMjU1IG5ld05hbWUpIC0+IE5vbmUiKX0sCi0JeyJDYXRNb3ZlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfQ2F0TW92ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IG9sZE5hbWUsIGxvbmcgbmV3RGlySUQsIFN0cjI1NSBuZXdOYW1lKSAtPiBOb25lIil9LAotCXsiRlNNYWtlRlNTcGVjIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNNYWtlRlNTcGVjLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IChGU1NwZWMgc3BlYykiKX0sCisgICAgeyJVbm1vdW50Vm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfVW5tb3VudFZvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyNjMgdm9sTmFtZSwgc2hvcnQgdlJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkZsdXNoVm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRmx1c2hWb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjYzIHZvbE5hbWUsIHNob3J0IHZSZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJIU2V0Vm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFNldFZvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyNjMgdm9sTmFtZSwgc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkZTQ2xvc2UiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0Nsb3NlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJBbGxvY2F0ZSIsIChQeUNGdW5jdGlvbilGaWxlX0FsbG9jYXRlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGNvdW50KSIpfSwKKyAgICB7IkdldEVPRiIsIChQeUNGdW5jdGlvbilGaWxlX0dldEVPRiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAobG9uZyBsb2dFT0YpIil9LAorICAgIHsiU2V0RU9GIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfU2V0RU9GLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIGxvbmcgbG9nRU9GKSAtPiBOb25lIil9LAorICAgIHsiR2V0RlBvcyIsIChQeUNGdW5jdGlvbilGaWxlX0dldEZQb3MsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gKGxvbmcgZmlsZVBvcykiKX0sCisgICAgeyJTZXRGUG9zIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfU2V0RlBvcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtLCBzaG9ydCBwb3NNb2RlLCBsb25nIHBvc09mZikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFZSZWZOdW0iLCAoUHlDRnVuY3Rpb24pRmlsZV9HZXRWUmVmTnVtLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmaWxlUmVmTnVtKSAtPiAoc2hvcnQgdlJlZk51bSkiKX0sCisgICAgeyJIR2V0Vm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSEdldFZvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyaW5nUHRyIHZvbE5hbWUpIC0+IChzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSIpfSwKKyAgICB7IkhPcGVuIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSE9wZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCisgICAgeyJIT3BlbkRGIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSE9wZW5ERiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBTSW50OCBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgcmVmTnVtKSIpfSwKKyAgICB7IkhPcGVuUkYiLCAoUHlDRnVuY3Rpb24pRmlsZV9IT3BlblJGLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAorICAgIHsiQWxsb2NDb250aWciLCAoUHlDRnVuY3Rpb24pRmlsZV9BbGxvY0NvbnRpZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAobG9uZyBjb3VudCkiKX0sCisgICAgeyJIQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSENyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGZpbGVUeXBlKSAtPiBOb25lIil9LAorICAgIHsiRGlyQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRGlyQ3JlYXRlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIHBhcmVudERpcklELCBTdHIyNTUgZGlyZWN0b3J5TmFtZSkgLT4gKGxvbmcgY3JlYXRlZERpcklEKSIpfSwKKyAgICB7IkhEZWxldGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9IRGVsZXRlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJIR2V0RkluZm8iLCAoUHlDRnVuY3Rpb24pRmlsZV9IR2V0RkluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gKEZJbmZvIGZuZHJJbmZvKSIpfSwKKyAgICB7IkhTZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGaWxlX0hTZXRGSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBGSW5mbyBmbmRySW5mbykgLT4gTm9uZSIpfSwKKyAgICB7IkhTZXRGTG9jayIsIChQeUNGdW5jdGlvbilGaWxlX0hTZXRGTG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiBOb25lIil9LAorICAgIHsiSFJzdEZMb2NrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFJzdEZMb2NrLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJIUmVuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFJlbmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IG9sZE5hbWUsIFN0cjI1NSBuZXdOYW1lKSAtPiBOb25lIil9LAorICAgIHsiQ2F0TW92ZSIsIChQeUNGdW5jdGlvbilGaWxlX0NhdE1vdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBvbGROYW1lLCBsb25nIG5ld0RpcklELCBTdHIyNTUgbmV3TmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTTWFrZUZTU3BlYyIsIChQeUNGdW5jdGlvbilGaWxlX0ZTTWFrZUZTU3BlYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiAoRlNTcGVjIHNwZWMpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyovCi0JeyJGU0dldEZvcmtQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilGaWxlX0ZTR2V0Rm9ya1Bvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSkgLT4gKFNJbnQ2NCBwb3NpdGlvbikiKX0sCi0JeyJGU1NldEZvcmtQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilGaWxlX0ZTU2V0Rm9ya1Bvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSwgVUludDE2IHBvc2l0aW9uTW9kZSwgU0ludDY0IHBvc2l0aW9uT2Zmc2V0KSAtPiBOb25lIil9LAotCXsiRlNHZXRGb3JrU2l6ZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTR2V0Rm9ya1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiAoU0ludDY0IGZvcmtTaXplKSIpfSwKLQl7IkZTU2V0Rm9ya1NpemUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1NldEZvcmtTaXplLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSwgVUludDE2IHBvc2l0aW9uTW9kZSwgU0ludDY0IHBvc2l0aW9uT2Zmc2V0KSAtPiBOb25lIil9LAotCXsiRlNBbGxvY2F0ZUZvcmsiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0FsbG9jYXRlRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0sIEZTQWxsb2NhdGlvbkZsYWdzIGZsYWdzLCBVSW50MTYgcG9zaXRpb25Nb2RlLCBTSW50NjQgcG9zaXRpb25PZmZzZXQsIFVJbnQ2NCByZXF1ZXN0Q291bnQpIC0+IChVSW50NjQgYWN0dWFsQ291bnQpIil9LAotCXsiRlNGbHVzaEZvcmsiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0ZsdXNoRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJGU0Nsb3NlRm9yayIsIChQeUNGdW5jdGlvbilGaWxlX0ZTQ2xvc2VGb3JrLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSkgLT4gTm9uZSIpfSwKLQl7IkZTR2V0RGF0YUZvcmtOYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXREYXRhRm9ya05hbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhGU1VuaVN0cjI1NSBkYXRhRm9ya05hbWUpIil9LAotCXsiRlNHZXRSZXNvdXJjZUZvcmtOYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXRSZXNvdXJjZUZvcmtOYW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIRlNVbmlTdHIyNTUgcmVzb3VyY2VGb3JrTmFtZSkiKX0sCi0JeyJGU1BhdGhNYWtlUmVmIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNQYXRoTWFrZVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDggKiBwYXRoKSAtPiAoRlNSZWYgcmVmLCBCb29sZWFuIGlzRGlyZWN0b3J5KSIpfSwKLQl7IkZOTm90aWZ5QnlQYXRoIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRk5Ob3RpZnlCeVBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4ICogcGF0aCwgRk5NZXNzYWdlIG1lc3NhZ2UsIE9wdGlvbkJpdHMgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJGTk5vdGlmeUFsbCIsIChQeUNGdW5jdGlvbilGaWxlX0ZOTm90aWZ5QWxsLCAxLAotCSBQeURvY19TVFIoIihGTk1lc3NhZ2UgbWVzc2FnZSwgT3B0aW9uQml0cyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkZTR2V0Rm9ya1Bvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXRGb3JrUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiAoU0ludDY0IHBvc2l0aW9uKSIpfSwKKyAgICB7IkZTU2V0Rm9ya1Bvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNTZXRGb3JrUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtLCBVSW50MTYgcG9zaXRpb25Nb2RlLCBTSW50NjQgcG9zaXRpb25PZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJGU0dldEZvcmtTaXplIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXRGb3JrU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0pIC0+IChTSW50NjQgZm9ya1NpemUpIil9LAorICAgIHsiRlNTZXRGb3JrU2l6ZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTU2V0Rm9ya1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtLCBVSW50MTYgcG9zaXRpb25Nb2RlLCBTSW50NjQgcG9zaXRpb25PZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJGU0FsbG9jYXRlRm9yayIsIChQeUNGdW5jdGlvbilGaWxlX0ZTQWxsb2NhdGVGb3JrLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSwgRlNBbGxvY2F0aW9uRmxhZ3MgZmxhZ3MsIFVJbnQxNiBwb3NpdGlvbk1vZGUsIFNJbnQ2NCBwb3NpdGlvbk9mZnNldCwgVUludDY0IHJlcXVlc3RDb3VudCkgLT4gKFVJbnQ2NCBhY3R1YWxDb3VudCkiKX0sCisgICAgeyJGU0ZsdXNoRm9yayIsIChQeUNGdW5jdGlvbilGaWxlX0ZTRmx1c2hGb3JrLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTQ2xvc2VGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNDbG9zZUZvcmssIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiRlNHZXREYXRhRm9ya05hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0dldERhdGFGb3JrTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSEZTVW5pU3RyMjU1IGRhdGFGb3JrTmFtZSkiKX0sCisgICAgeyJGU0dldFJlc291cmNlRm9ya05hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0dldFJlc291cmNlRm9ya05hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhGU1VuaVN0cjI1NSByZXNvdXJjZUZvcmtOYW1lKSIpfSwKKyAgICB7IkZTUGF0aE1ha2VSZWYiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1BhdGhNYWtlUmVmLCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCAqIHBhdGgpIC0+IChGU1JlZiByZWYsIEJvb2xlYW4gaXNEaXJlY3RvcnkpIil9LAorICAgIHsiRk5Ob3RpZnlCeVBhdGgiLCAoUHlDRnVuY3Rpb24pRmlsZV9GTk5vdGlmeUJ5UGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDggKiBwYXRoLCBGTk1lc3NhZ2UgbWVzc2FnZSwgT3B0aW9uQml0cyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkZOTm90aWZ5QWxsIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRk5Ob3RpZnlBbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKEZOTWVzc2FnZSBtZXNzYWdlLCBPcHRpb25CaXRzIGZsYWdzKSAtPiBOb25lIil9LAogI2lmbmRlZiAgX19MUDY0X18KLQl7Ik5ld0FsaWFzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfTmV3QWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgRlNTcGVjIHRhcmdldCkgLT4gKEFsaWFzSGFuZGxlIGFsaWFzKSIpfSwKLQl7Ik5ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aCIsIChQeUNGdW5jdGlvbilGaWxlX05ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGZ1bGxQYXRoLCBTdHIzMiB6b25lTmFtZSwgU3RyMzEgc2VydmVyTmFtZSkgLT4gKEFsaWFzSGFuZGxlIGFsaWFzKSIpfSwKLQl7IlJlc29sdmVBbGlhc0ZpbGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9SZXNvbHZlQWxpYXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMpIC0+IChGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IlJlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncyIsIChQeUNGdW5jdGlvbilGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zLCB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3MpIC0+IChGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IlVwZGF0ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfVXBkYXRlQWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgRlNTcGVjIHRhcmdldCwgQWxpYXNIYW5kbGUgYWxpYXMpIC0+IChCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXsiUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzTm9VSSIsIChQeUNGdW5jdGlvbilGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUksIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucywgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXIsIEJvb2xlYW4gd2FzQWxpYXNlZCkiKX0sCisgICAgeyJOZXdBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX05ld0FsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEZTU3BlYyB0YXJnZXQpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCisgICAgeyJOZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgiLCAoUHlDRnVuY3Rpb24pRmlsZV9OZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBmdWxsUGF0aCwgU3RyMzIgem9uZU5hbWUsIFN0cjMxIHNlcnZlck5hbWUpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCisgICAgeyJSZXNvbHZlQWxpYXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfUmVzb2x2ZUFsaWFzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zKSAtPiAoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXIsIEJvb2xlYW4gd2FzQWxpYXNlZCkiKX0sCisgICAgeyJSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pRmlsZV9SZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucywgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXIsIEJvb2xlYW4gd2FzQWxpYXNlZCkiKX0sCisgICAgeyJVcGRhdGVBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX1VwZGF0ZUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEZTU3BlYyB0YXJnZXQsIEFsaWFzSGFuZGxlIGFsaWFzKSAtPiAoQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IlJlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUkiLCAoUHlDRnVuY3Rpb24pRmlsZV9SZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3NOb1VJLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHRhcmdldElzRm9sZGVyLCBCb29sZWFuIHdhc0FsaWFzZWQpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXsiRlNOZXdBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX0ZTTmV3QWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlLCBGU1JlZiB0YXJnZXQpIC0+IChBbGlhc0hhbmRsZSBpbkFsaWFzKSIpfSwKLQl7IkZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IkZTUmVzb2x2ZUFsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTUmVzb2x2ZUFsaWFzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IkZTVXBkYXRlQWxpYXMiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1VwZGF0ZUFsaWFzLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSwgRlNSZWYgdGFyZ2V0LCBBbGlhc0hhbmRsZSBhbGlhcykgLT4gKEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCi0JeyJwYXRobmFtZSIsIChQeUNGdW5jdGlvbilGaWxlX3BhdGhuYW1lLCAxLAotCSBQeURvY19TVFIoIihzdHJ8dW5pY29kZXxGU1NwZWN8RlNyZWYpIC0+IHBhdGhuYW1lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiRlNOZXdBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX0ZTTmV3QWxpYXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlLCBGU1JlZiB0YXJnZXQpIC0+IChBbGlhc0hhbmRsZSBpbkFsaWFzKSIpfSwKKyAgICB7IkZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKKyAgICB7IkZTUmVzb2x2ZUFsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTUmVzb2x2ZUFsaWFzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKKyAgICB7IkZTVXBkYXRlQWxpYXMiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1VwZGF0ZUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSwgRlNSZWYgdGFyZ2V0LCBBbGlhc0hhbmRsZSBhbGlhcykgLT4gKEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCisgICAgeyJwYXRobmFtZSIsIChQeUNGdW5jdGlvbilGaWxlX3BhdGhuYW1lLCAxLAorICAgICBQeURvY19TVFIoIihzdHJ8dW5pY29kZXxGU1NwZWN8RlNyZWYpIC0+IHBhdGhuYW1lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0zMjUxLDE1OSArMzI1MSwxNTkgQEAKIGludAogUHlNYWNfR2V0RlNTcGVjKFB5T2JqZWN0ICp2LCBGU1NwZWMgKnNwZWMpCiB7Ci0gICAgICAgIFN0cjI1NSBwYXRoOwotICAgICAgICBzaG9ydCByZWZudW07Ci0gICAgICAgIGxvbmcgcGFyaWQ7Ci0gICAgICAgIE9TRXJyIGVycjsKLSAgICAgICAgRlNSZWYgZnNyOworICAgIFN0cjI1NSBwYXRoOworICAgIHNob3J0IHJlZm51bTsKKyAgICBsb25nIHBhcmlkOworICAgIE9TRXJyIGVycjsKKyAgICBGU1JlZiBmc3I7CiAKLSAgICAgICAgaWYgKEZTU3BlY19DaGVjayh2KSkgewotICAgICAgICAgICAgICAgICpzcGVjID0gKChGU1NwZWNPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9CisgICAgaWYgKEZTU3BlY19DaGVjayh2KSkgeworICAgICAgICAqc3BlYyA9ICgoRlNTcGVjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogCi0gICAgICAgIGlmIChQeUFyZ19QYXJzZSh2LCAiKGhsTyYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZudW0sICZwYXJpZCwgUHlNYWNfR2V0U3RyMjU1LCAmcGF0aCkpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBGU01ha2VGU1NwZWMocmVmbnVtLCBwYXJpZCwgcGF0aCwgc3BlYyk7Ci0gICAgICAgICAgICAgICAgaWYgKCBlcnIgJiYgZXJyICE9IGZuZkVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKFB5QXJnX1BhcnNlKHYsICIoaGxPJikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmbnVtLCAmcGFyaWQsIFB5TWFjX0dldFN0cjI1NSwgJnBhdGgpKSB7CisgICAgICAgIGVyciA9IEZTTWFrZUZTU3BlYyhyZWZudW0sIHBhcmlkLCBwYXRoLCBzcGVjKTsKKyAgICAgICAgaWYgKCBlcnIgJiYgZXJyICE9IGZuZkVyciApIHsKKyAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAvKiBPdGhlcndpc2Ugd2UgdHJ5IHRvIGdvIHZpYSBhbiBGU1JlZi4gT24gT1NYIHdlIGdvIGFsbCB0aGUgd2F5LAotICAgICAgICAqKiBvbiBPUzkgd2UgYWNjZXB0IG9ubHkgYSByZWFsIEZTUmVmIG9iamVjdAotICAgICAgICAqLwotICAgICAgICBpZiAoIFB5TWFjX0dldEZTUmVmKHYsICZmc3IpICkgewotICAgICAgICAgICAgICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJmZzciwga0ZTQ2F0SW5mb05vbmUsIE5VTEwsIE5VTEwsIHNwZWMsIE5VTEwpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIC8qIE90aGVyd2lzZSB3ZSB0cnkgdG8gZ28gdmlhIGFuIEZTUmVmLiBPbiBPU1ggd2UgZ28gYWxsIHRoZSB3YXksCisgICAgKiogb24gT1M5IHdlIGFjY2VwdCBvbmx5IGEgcmVhbCBGU1JlZiBvYmplY3QKKyAgICAqLworICAgIGlmICggUHlNYWNfR2V0RlNSZWYodiwgJmZzcikgKSB7CisgICAgICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJmZzciwga0ZTQ2F0SW5mb05vbmUsIE5VTEwsIE5VTEwsIHNwZWMsIE5VTEwpOworICAgICAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogaW50CiBQeU1hY19HZXRGU1JlZihQeU9iamVjdCAqdiwgRlNSZWYgKmZzcikKIHsKLSAgICAgICAgT1NTdGF0dXMgZXJyOworICAgIE9TU3RhdHVzIGVycjsKICNpZm5kZWYgX19MUDY0X18KLSAgICAgICAgRlNTcGVjIGZzczsKKyAgICBGU1NwZWMgZnNzOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0gICAgICAgIGlmIChGU1JlZl9DaGVjayh2KSkgewotICAgICAgICAgICAgICAgICpmc3IgPSAoKEZTUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQorICAgIGlmIChGU1JlZl9DaGVjayh2KSkgeworICAgICAgICAqZnNyID0gKChGU1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAotICAgICAgICAvKiBPbiBPU1ggd2Ugbm93IHRyeSBhIHBhdGhuYW1lICovCi0gICAgICAgIGlmICggUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqcGF0aCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiZXQiLCBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICBpZiAoIChlcnI9RlNQYXRoTWFrZVJlZigodW5zaWduZWQgY2hhciopcGF0aCwgZnNyLCBOVUxMKSkgKQotICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKLSAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKHBhdGgpOwotICAgICAgICAgICAgICAgIHJldHVybiAhZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qIFhYWFggU2hvdWxkIHRyeSB1bmljb2RlIGhlcmUgdG9vICovCisgICAgLyogT24gT1NYIHdlIG5vdyB0cnkgYSBwYXRobmFtZSAqLworICAgIGlmICggUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgIGNoYXIgKnBhdGggPSBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJldCIsIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIChlcnI9RlNQYXRoTWFrZVJlZigodW5zaWduZWQgY2hhciopcGF0aCwgZnNyLCBOVUxMKSkgKQorICAgICAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgUHlNZW1fRnJlZShwYXRoKTsKKyAgICAgICAgcmV0dXJuICFlcnI7CisgICAgfQorICAgIC8qIFhYWFggU2hvdWxkIHRyeSB1bmljb2RlIGhlcmUgdG9vICovCiAKICNpZm5kZWYgX19MUDY0X18KLSAgICAgICAgLyogT3RoZXJ3aXNlIHdlIHRyeSB0byBnbyB2aWEgYW4gRlNTcGVjICovCi0gICAgICAgIGlmIChGU1NwZWNfQ2hlY2sodikpIHsKLSAgICAgICAgICAgICAgICBmc3MgPSAoKEZTU3BlY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0gICAgICAgICAgICAgICAgaWYgKChlcnI9RlNwTWFrZUZTUmVmKCZmc3MsIGZzcikpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICBQeU1hY19FcnJvcihlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0jZW5kaWYgLyogIV9fTFA2NF9fICovCi0KLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTUmVmLCBGU1NwZWMgb3IgcGF0aG5hbWUgcmVxdWlyZWQiKTsKKyAgICAvKiBPdGhlcndpc2Ugd2UgdHJ5IHRvIGdvIHZpYSBhbiBGU1NwZWMgKi8KKyAgICBpZiAoRlNTcGVjX0NoZWNrKHYpKSB7CisgICAgICAgIGZzcyA9ICgoRlNTcGVjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgaWYgKChlcnI9RlNwTWFrZUZTUmVmKCZmc3MsIGZzcikpID09IDApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VuZGlmIC8qICFfX0xQNjRfXyAqLworCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTUmVmLCBGU1NwZWMgb3IgcGF0aG5hbWUgcmVxdWlyZWQiKTsKKyAgICByZXR1cm4gMDsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogZXh0ZXJuIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkRlNTcGVjKEZTU3BlYyAqc3BlYykKIHsKLSAgICAgICAgcmV0dXJuIEZTU3BlY19OZXcoc3BlYyk7CisgICAgcmV0dXJuIEZTU3BlY19OZXcoc3BlYyk7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIGV4dGVybiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZEZTUmVmKEZTUmVmICpzcGVjKQogewotICAgICAgICByZXR1cm4gRlNSZWZfTmV3KHNwZWMpOworICAgIHJldHVybiBGU1JlZl9OZXcoc3BlYyk7CiB9CiAKIAogdm9pZCBpbml0X0ZpbGUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRlNTcGVjICosIFB5TWFjX0J1aWxkRlNTcGVjKTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoRlNTcGVjLCBQeU1hY19HZXRGU1NwZWMpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEZTU3BlYyAqLCBQeU1hY19CdWlsZEZTU3BlYyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEZTU3BlYywgUHlNYWNfR2V0RlNTcGVjKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEZTUmVmICosIFB5TWFjX0J1aWxkRlNSZWYpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChGU1JlZiwgUHlNYWNfR2V0RlNSZWYpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEZTUmVmICosIFB5TWFjX0J1aWxkRlNSZWYpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChGU1JlZiwgUHlNYWNfR2V0RlNSZWYpOwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0ZpbGUiLCBGaWxlX21ldGhvZHMpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUZpbGVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChGaWxlX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRmlsZV9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUZTQ2F0YWxvZ0luZm9fVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkZTQ2F0YWxvZ0luZm9fVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZGU0NhdGFsb2dJbmZvX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNDYXRhbG9nSW5mbyIsIChQeU9iamVjdCAqKSZGU0NhdGFsb2dJbmZvX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRlNDYXRhbG9nSW5mb19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTQ2F0YWxvZ0luZm9UeXBlIiwgKFB5T2JqZWN0ICopJkZTQ2F0YWxvZ0luZm9fVHlwZSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9GaWxlIiwgRmlsZV9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBGaWxlX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoRmlsZV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEZpbGVfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBGU0NhdGFsb2dJbmZvX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGU0NhdGFsb2dJbmZvX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRlNDYXRhbG9nSW5mb19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTQ2F0YWxvZ0luZm8iLCAoUHlPYmplY3QgKikmRlNDYXRhbG9nSW5mb19UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkZTQ2F0YWxvZ0luZm9fVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU0NhdGFsb2dJbmZvVHlwZSIsIChQeU9iamVjdCAqKSZGU0NhdGFsb2dJbmZvX1R5cGUpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JRkluZm9fVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkZJbmZvX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRkluZm9fVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGSW5mbyIsIChQeU9iamVjdCAqKSZGSW5mb19UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkZJbmZvX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRkluZm9UeXBlIiwgKFB5T2JqZWN0ICopJkZJbmZvX1R5cGUpOworICAgIEZJbmZvX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGSW5mb19UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkZJbmZvX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRkluZm8iLCAoUHlPYmplY3QgKikmRkluZm9fVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZGSW5mb19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZJbmZvVHlwZSIsIChQeU9iamVjdCAqKSZGSW5mb19UeXBlKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQlBbGlhc19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQWxpYXNfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZBbGlhc19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFsaWFzIiwgKFB5T2JqZWN0ICopJkFsaWFzX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQWxpYXNfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBbGlhc1R5cGUiLCAoUHlPYmplY3QgKikmQWxpYXNfVHlwZSk7CisgICAgQWxpYXNfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkFsaWFzX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQWxpYXNfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBbGlhcyIsIChQeU9iamVjdCAqKSZBbGlhc19UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkFsaWFzX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQWxpYXNUeXBlIiwgKFB5T2JqZWN0ICopJkFsaWFzX1R5cGUpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JRlNTcGVjX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZGU1NwZWNfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZGU1NwZWNfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1NwZWMiLCAoUHlPYmplY3QgKikmRlNTcGVjX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRlNTcGVjX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNTcGVjVHlwZSIsIChQeU9iamVjdCAqKSZGU1NwZWNfVHlwZSk7CisgICAgRlNTcGVjX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGU1NwZWNfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZGU1NwZWNfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1NwZWMiLCAoUHlPYmplY3QgKikmRlNTcGVjX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRlNTcGVjX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNTcGVjVHlwZSIsIChQeU9iamVjdCAqKSZGU1NwZWNfVHlwZSk7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JRlNSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkZTUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRlNSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1JlZiIsIChQeU9iamVjdCAqKSZGU1JlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkZTUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkZTUmVmX1R5cGUpOworICAgIEZTUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGU1JlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkZTUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNSZWYiLCAoUHlPYmplY3QgKikmRlNSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZGU1JlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTUmVmVHlwZSIsIChQeU9iamVjdCAqKSZGU1JlZl9UeXBlKTsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09IEVuZCBtb2R1bGUgX0ZpbGUgPT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9mbS9fRm1tb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2ZtL19GbW1vZHVsZS5jCmluZGV4IGI5ODJjYzMuLmFkYzQ3YWEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2ZtL19GbW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2ZtL19GbW1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yNiwxMiArMjYsMTIgQEAKIEZNUmVjX05ldyhGTWV0cmljUmVjICppdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mTyZPJk8mTyYiLAotICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+YXNjZW50LAotICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+ZGVzY2VudCwKLSAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPmxlYWRpbmcsCi0gICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT53aWRNYXgsCi0gICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaXRzZWxmLT53VGFiSGFuZGxlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZPJk8mTyZPJiIsCisgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+YXNjZW50LAorICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPmRlc2NlbnQsCisgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+bGVhZGluZywKKyAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT53aWRNYXgsCisgICAgICAgIFJlc09ial9OZXcsIGl0c2VsZi0+d1RhYkhhbmRsZSk7CiB9CiAKICNpZiAwCkBAIC0zOSwxMiArMzksMTIgQEAKIHN0YXRpYyBpbnQKIEZNUmVjX0NvbnZlcnQoUHlPYmplY3QgKnYsIEZNZXRyaWNSZWMgKnBfaXRzZWxmKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mTyZPJiIsCi0gICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPmFzY2VudCwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+ZGVzY2VudCwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+bGVhZGluZywKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+d2lkTWF4LAotICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRzZWxmLT53VGFiSGFuZGxlKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mTyZPJiIsCisgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5hc2NlbnQsCisgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5kZXNjZW50LAorICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+bGVhZGluZywKKyAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPndpZE1heCwKKyAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdHNlbGYtPndUYWJIYW5kbGUpOwogfQogI2VuZGlmCiAKQEAgLTUzLDMxNCArNTMsMzE0IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0Rm9udE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGZhbWlseUlEOwotCVN0cjI1NSBuYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBmYW1pbHlJRDsKKyAgICBTdHIyNTUgbmFtZTsKICNpZm5kZWYgR2V0Rm9udE5hbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRGb250TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rm9udE5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYW1pbHlJRCkpCi0JCXJldHVybiBOVUxMOwotCUdldEZvbnROYW1lKGZhbWlseUlELAotCSAgICAgICAgICAgIG5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIG5hbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFtaWx5SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRGb250TmFtZShmYW1pbHlJRCwKKyAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9HZXRGTnVtKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgbmFtZTsKLQlzaG9ydCBmYW1pbHlJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IG5hbWU7CisgICAgc2hvcnQgZmFtaWx5SUQ7CiAjaWZuZGVmIEdldEZOdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRGTnVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGTnVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0Rk51bShuYW1lLAotCSAgICAgICAgJmZhbWlseUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgZmFtaWx5SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0Rk51bShuYW1lLAorICAgICAgICAmZmFtaWx5SUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHlJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fUmVhbEZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCXNob3J0IGZvbnROdW07Ci0Jc2hvcnQgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgc2hvcnQgZm9udE51bTsKKyAgICBzaG9ydCBzaXplOwogI2lmbmRlZiBSZWFsRm9udAotCVB5TWFjX1BSRUNIRUNLKFJlYWxGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWFsRm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJlYWxGb250KGZvbnROdW0sCi0JICAgICAgICAgICAgICAgc2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWFsRm9udChmb250TnVtLAorICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX1NldEZTY2FsZURpc2FibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZnNjYWxlRGlzYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBmc2NhbGVEaXNhYmxlOwogI2lmbmRlZiBTZXRGU2NhbGVEaXNhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RlNjYWxlRGlzYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RlNjYWxlRGlzYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZzY2FsZURpc2FibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRGU2NhbGVEaXNhYmxlKGZzY2FsZURpc2FibGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzY2FsZURpc2FibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRGU2NhbGVEaXNhYmxlKGZzY2FsZURpc2FibGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9Gb250TWV0cmljcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRk1ldHJpY1JlYyB0aGVNZXRyaWNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGTWV0cmljUmVjIHRoZU1ldHJpY3M7CiAjaWZuZGVmIEZvbnRNZXRyaWNzCi0JUHlNYWNfUFJFQ0hFQ0soRm9udE1ldHJpY3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEZvbnRNZXRyaWNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlGb250TWV0cmljcygmdGhlTWV0cmljcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGTVJlY19OZXcsICZ0aGVNZXRyaWNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRm9udE1ldHJpY3MoJnRoZU1ldHJpY3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRk1SZWNfTmV3LCAmdGhlTWV0cmljcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fU2V0RnJhY3RFbmFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZnJhY3RFbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gZnJhY3RFbmFibGU7CiAjaWZuZGVmIFNldEZyYWN0RW5hYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RnJhY3RFbmFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEZyYWN0RW5hYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJhY3RFbmFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRGcmFjdEVuYWJsZShmcmFjdEVuYWJsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhY3RFbmFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRGcmFjdEVuYWJsZShmcmFjdEVuYWJsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX0dldERlZkZvbnRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0RGVmRm9udFNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXREZWZGb250U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGVmRm9udFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldERlZkZvbnRTaXplKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldERlZkZvbnRTaXplKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fSXNPdXRsaW5lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBudW1lcjsKLQlQb2ludCBkZW5vbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgbnVtZXI7CisgICAgUG9pbnQgZGVub207CiAjaWZuZGVmIElzT3V0bGluZQotCVB5TWFjX1BSRUNIRUNLKElzT3V0bGluZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNPdXRsaW5lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm51bWVyLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRlbm9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNPdXRsaW5lKG51bWVyLAotCSAgICAgICAgICAgICAgICBkZW5vbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbnVtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmZGVub20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc091dGxpbmUobnVtZXIsCisgICAgICAgICAgICAgICAgICAgIGRlbm9tKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9TZXRPdXRsaW5lUHJlZmVycmVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIG91dGxpbmVQcmVmZXJyZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gb3V0bGluZVByZWZlcnJlZDsKICNpZm5kZWYgU2V0T3V0bGluZVByZWZlcnJlZAotCVB5TWFjX1BSRUNIRUNLKFNldE91dGxpbmVQcmVmZXJyZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE91dGxpbmVQcmVmZXJyZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdXRsaW5lUHJlZmVycmVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0T3V0bGluZVByZWZlcnJlZChvdXRsaW5lUHJlZmVycmVkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRsaW5lUHJlZmVycmVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0T3V0bGluZVByZWZlcnJlZChvdXRsaW5lUHJlZmVycmVkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0T3V0bGluZVByZWZlcnJlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBHZXRPdXRsaW5lUHJlZmVycmVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0T3V0bGluZVByZWZlcnJlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0T3V0bGluZVByZWZlcnJlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0T3V0bGluZVByZWZlcnJlZCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRPdXRsaW5lUHJlZmVycmVkKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fU2V0UHJlc2VydmVHbHlwaChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBwcmVzZXJ2ZUdseXBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIHByZXNlcnZlR2x5cGg7CiAjaWZuZGVmIFNldFByZXNlcnZlR2x5cGgKLQlQeU1hY19QUkVDSEVDSyhTZXRQcmVzZXJ2ZUdseXBoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQcmVzZXJ2ZUdseXBoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlc2VydmVHbHlwaCkpCi0JCXJldHVybiBOVUxMOwotCVNldFByZXNlcnZlR2x5cGgocHJlc2VydmVHbHlwaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc2VydmVHbHlwaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFByZXNlcnZlR2x5cGgocHJlc2VydmVHbHlwaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX0dldFByZXNlcnZlR2x5cGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgR2V0UHJlc2VydmVHbHlwaAotCVB5TWFjX1BSRUNIRUNLKEdldFByZXNlcnZlR2x5cGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFByZXNlcnZlR2x5cGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFByZXNlcnZlR2x5cGgoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UHJlc2VydmVHbHlwaCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX0dldFN5c0ZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRTeXNGb250Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0U3lzRm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0U3lzRm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0U3lzRm9udCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRTeXNGb250KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0QXBwRm9udChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldEFwcEZvbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRBcHBGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRBcHBGb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRBcHBGb250KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEFwcEZvbnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9RRFRleHRCb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKmluVGV4dF9faW5fXzsKLQlpbnQgaW5UZXh0X19sZW5fXzsKLQlpbnQgaW5UZXh0X19pbl9sZW5fXzsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqaW5UZXh0X19pbl9fOworICAgIGludCBpblRleHRfX2xlbl9fOworICAgIGludCBpblRleHRfX2luX2xlbl9fOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBRRFRleHRCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhRRFRleHRCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFEVGV4dEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRleHRfX2luX18sICZpblRleHRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5UZXh0X19sZW5fXyA9IGluVGV4dF9faW5fbGVuX187Ci0JUURUZXh0Qm91bmRzKGluVGV4dF9fbGVuX18sIGluVGV4dF9faW5fXywKLQkgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGV4dF9faW5fXywgJmluVGV4dF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpblRleHRfX2xlbl9fID0gaW5UZXh0X19pbl9sZW5fXzsKKyAgICBRRFRleHRCb3VuZHMoaW5UZXh0X19sZW5fXywgaW5UZXh0X19pbl9fLAorICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGbV9tZXRob2RzW10gPSB7Ci0JeyJHZXRGb250TmFtZSIsIChQeUNGdW5jdGlvbilGbV9HZXRGb250TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZmFtaWx5SUQpIC0+IChTdHIyNTUgbmFtZSkiKX0sCi0JeyJHZXRGTnVtIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldEZOdW0sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBuYW1lKSAtPiAoc2hvcnQgZmFtaWx5SUQpIil9LAotCXsiUmVhbEZvbnQiLCAoUHlDRnVuY3Rpb24pRm1fUmVhbEZvbnQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZvbnROdW0sIHNob3J0IHNpemUpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRGU2NhbGVEaXNhYmxlIiwgKFB5Q0Z1bmN0aW9uKUZtX1NldEZTY2FsZURpc2FibGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZnNjYWxlRGlzYWJsZSkgLT4gTm9uZSIpfSwKLQl7IkZvbnRNZXRyaWNzIiwgKFB5Q0Z1bmN0aW9uKUZtX0ZvbnRNZXRyaWNzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGTWV0cmljUmVjIHRoZU1ldHJpY3MpIil9LAotCXsiU2V0RnJhY3RFbmFibGUiLCAoUHlDRnVuY3Rpb24pRm1fU2V0RnJhY3RFbmFibGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZnJhY3RFbmFibGUpIC0+IE5vbmUiKX0sCi0JeyJHZXREZWZGb250U2l6ZSIsIChQeUNGdW5jdGlvbilGbV9HZXREZWZGb250U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IklzT3V0bGluZSIsIChQeUNGdW5jdGlvbilGbV9Jc091dGxpbmUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IG51bWVyLCBQb2ludCBkZW5vbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldE91dGxpbmVQcmVmZXJyZWQiLCAoUHlDRnVuY3Rpb24pRm1fU2V0T3V0bGluZVByZWZlcnJlZCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBvdXRsaW5lUHJlZmVycmVkKSAtPiBOb25lIil9LAotCXsiR2V0T3V0bGluZVByZWZlcnJlZCIsIChQeUNGdW5jdGlvbilGbV9HZXRPdXRsaW5lUHJlZmVycmVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRQcmVzZXJ2ZUdseXBoIiwgKFB5Q0Z1bmN0aW9uKUZtX1NldFByZXNlcnZlR2x5cGgsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gcHJlc2VydmVHbHlwaCkgLT4gTm9uZSIpfSwKLQl7IkdldFByZXNlcnZlR2x5cGgiLCAoUHlDRnVuY3Rpb24pRm1fR2V0UHJlc2VydmVHbHlwaCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0U3lzRm9udCIsIChQeUNGdW5jdGlvbilGbV9HZXRTeXNGb250LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0QXBwRm9udCIsIChQeUNGdW5jdGlvbilGbV9HZXRBcHBGb250LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiUURUZXh0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUZtX1FEVGV4dEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGluVGV4dCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldEZvbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldEZvbnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmYW1pbHlJRCkgLT4gKFN0cjI1NSBuYW1lKSIpfSwKKyAgICB7IkdldEZOdW0iLCAoUHlDRnVuY3Rpb24pRm1fR2V0Rk51bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IG5hbWUpIC0+IChzaG9ydCBmYW1pbHlJRCkiKX0sCisgICAgeyJSZWFsRm9udCIsIChQeUNGdW5jdGlvbilGbV9SZWFsRm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZm9udE51bSwgc2hvcnQgc2l6ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldEZTY2FsZURpc2FibGUiLCAoUHlDRnVuY3Rpb24pRm1fU2V0RlNjYWxlRGlzYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBmc2NhbGVEaXNhYmxlKSAtPiBOb25lIil9LAorICAgIHsiRm9udE1ldHJpY3MiLCAoUHlDRnVuY3Rpb24pRm1fRm9udE1ldHJpY3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZNZXRyaWNSZWMgdGhlTWV0cmljcykiKX0sCisgICAgeyJTZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilGbV9TZXRGcmFjdEVuYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBmcmFjdEVuYWJsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERlZkZvbnRTaXplIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldERlZkZvbnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiSXNPdXRsaW5lIiwgKFB5Q0Z1bmN0aW9uKUZtX0lzT3V0bGluZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgbnVtZXIsIFBvaW50IGRlbm9tKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0T3V0bGluZVByZWZlcnJlZCIsIChQeUNGdW5jdGlvbilGbV9TZXRPdXRsaW5lUHJlZmVycmVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIG91dGxpbmVQcmVmZXJyZWQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRPdXRsaW5lUHJlZmVycmVkIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldE91dGxpbmVQcmVmZXJyZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldFByZXNlcnZlR2x5cGgiLCAoUHlDRnVuY3Rpb24pRm1fU2V0UHJlc2VydmVHbHlwaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBwcmVzZXJ2ZUdseXBoKSAtPiBOb25lIil9LAorICAgIHsiR2V0UHJlc2VydmVHbHlwaCIsIChQeUNGdW5jdGlvbilGbV9HZXRQcmVzZXJ2ZUdseXBoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRTeXNGb250IiwgKFB5Q0Z1bmN0aW9uKUZtX0dldFN5c0ZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRBcHBGb250IiwgKFB5Q0Z1bmN0aW9uKUZtX0dldEFwcEZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJRRFRleHRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pRm1fUURUZXh0Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgaW5UZXh0KSAtPiAoUmVjdCBib3VuZHMpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2Vsc2UgIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGbV9tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZW5kaWYgIC8qIF9fTFA2NF9fICovCiAKIHZvaWQgaW5pdF9GbSh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmICAvKiBfX0xQNjRfXyAqLwogCiAKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9GbSIsIEZtX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRm0iLCBGbV9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlGbV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEZtX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRm1fRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBGbV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEZtX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRm1fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKICNlbmRpZiAgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZm9sZGVyL19Gb2xkZXJtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2ZvbGRlci9fRm9sZGVybW9kdWxlLmMKaW5kZXggMDM1ZGFiOC4uMTA1OTdmNSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZm9sZGVyL19Gb2xkZXJtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9mb2xkZXIvX0ZvbGRlcm1vZHVsZS5jCkBAIC05LDkgKzksOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMjIsMzAxICsyMiwzMDEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfRmluZEZvbGRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCU9TVHlwZSBmb2xkZXJUeXBlOwotCUJvb2xlYW4gY3JlYXRlRm9sZGVyOwotCUZTVm9sdW1lUmVmTnVtICBmb3VuZFZSZWZOdW07Ci0JU0ludDMyIGZvdW5kRGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkZXJUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlRm9sZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZpbmRGb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICBmb2xkZXJUeXBlLAotCSAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAmZm91bmRWUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICZmb3VuZERpcklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgZm91bmRWUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIGZvdW5kRGlySUQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgT1NUeXBlIGZvbGRlclR5cGU7CisgICAgQm9vbGVhbiBjcmVhdGVGb2xkZXI7CisgICAgRlNWb2x1bWVSZWZOdW0gIGZvdW5kVlJlZk51bTsKKyAgICBTSW50MzIgZm91bmREaXJJRDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvbGRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVGb2xkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmluZEZvbGRlcih2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgJmZvdW5kRGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmREaXJJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX1JlbGVhc2VGb2xkZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlPU1R5cGUgZm9sZGVyVHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZGVyVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWxlYXNlRm9sZGVyKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBPU1R5cGUgZm9sZGVyVHlwZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZGVyVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWxlYXNlRm9sZGVyKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0ZTRmluZEZvbGRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCU9TVHlwZSBmb2xkZXJUeXBlOwotCUJvb2xlYW4gY3JlYXRlRm9sZGVyOwotCUZTUmVmIGZvdW5kUmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZGVyVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZUZvbGRlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0ZpbmRGb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgIGZvbGRlclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICBjcmVhdGVGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAmZm91bmRSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmZm91bmRSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgT1NUeXBlIGZvbGRlclR5cGU7CisgICAgQm9vbGVhbiBjcmVhdGVGb2xkZXI7CisgICAgRlNSZWYgZm91bmRSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlRm9sZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTRmluZEZvbGRlcih2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZmb3VuZFJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0FkZEZvbGRlckRlc2NyaXB0b3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRm9sZGVyVHlwZSBmb2xkVHlwZTsKLQlGb2xkZXJEZXNjRmxhZ3MgZmxhZ3M7Ci0JRm9sZGVyQ2xhc3MgZm9sZENsYXNzOwotCUZvbGRlckxvY2F0aW9uIGZvbGRMb2NhdGlvbjsKLQlPU1R5cGUgYmFkZ2VTaWduYXR1cmU7Ci0JT1NUeXBlIGJhZGdlVHlwZTsKLQlTdHIyNTUgbmFtZTsKLQlCb29sZWFuIHJlcGxhY2VGbGFnOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyZPJk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkTG9jYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmJhZGdlU2lnbmF0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZiYWRnZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlcGxhY2VGbGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZEZvbGRlckRlc2NyaXB0b3IoZm9sZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRMb2NhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVNpZ25hdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmxhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRm9sZGVyVHlwZSBmb2xkVHlwZTsKKyAgICBGb2xkZXJEZXNjRmxhZ3MgZmxhZ3M7CisgICAgRm9sZGVyQ2xhc3MgZm9sZENsYXNzOworICAgIEZvbGRlckxvY2F0aW9uIGZvbGRMb2NhdGlvbjsKKyAgICBPU1R5cGUgYmFkZ2VTaWduYXR1cmU7CisgICAgT1NUeXBlIGJhZGdlVHlwZTsKKyAgICBTdHIyNTUgbmFtZTsKKyAgICBCb29sZWFuIHJlcGxhY2VGbGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyZPJk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmJhZGdlU2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZiYWRnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGxhY2VGbGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZEZvbGRlckRlc2NyaXB0b3IoZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmxhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0dldEZvbGRlclR5cGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQ7Ci0JVUludDMyIHRvdGFsVHlwZUNvdW50OwotCUZvbGRlclR5cGUgdGhlVHlwZXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWRUeXBlQ291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Rm9sZGVyVHlwZXMocmVxdWVzdGVkVHlwZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmdG90YWxUeXBlQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVUeXBlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICB0b3RhbFR5cGVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQ7CisgICAgVUludDMyIHRvdGFsVHlwZUNvdW50OworICAgIEZvbGRlclR5cGUgdGhlVHlwZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWRUeXBlQ291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Rm9sZGVyVHlwZXMocmVxdWVzdGVkVHlwZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxUeXBlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVUeXBlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFR5cGVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9SZW1vdmVGb2xkZXJEZXNjcmlwdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZvbGRlclR5cGUgZm9sZFR5cGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVGb2xkZXJEZXNjcmlwdG9yKGZvbGRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGb2xkZXJUeXBlIGZvbGRUeXBlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRm9sZGVyRGVzY3JpcHRvcihmb2xkVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0dldEZvbGRlck5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlPU1R5cGUgZm9sZFR5cGU7Ci0Jc2hvcnQgZm91bmRWUmVmTnVtOwotCVN0cjI1NSBuYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvbGRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Rm9sZGVyTmFtZSh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIGZvbGRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICZmb3VuZFZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgZm91bmRWUmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIE9TVHlwZSBmb2xkVHlwZTsKKyAgICBzaG9ydCBmb3VuZFZSZWZOdW07CisgICAgU3RyMjU1IG5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRGb2xkZXJOYW1lKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmZvdW5kVlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFZSZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9BZGRGb2xkZXJSb3V0aW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlcjsKLQlGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXI7Ci0JUm91dGluZ0ZsYWdzIGZsYWdzOwotCUJvb2xlYW4gcmVwbGFjZUZsYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVGcm9tRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyb3V0ZVRvRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXBsYWNlRmxhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRGb2xkZXJSb3V0aW5nKGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlRnJvbUZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVRvRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VGbGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7CisgICAgRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyOworICAgIFJvdXRpbmdGbGFncyBmbGFnczsKKyAgICBCb29sZWFuIHJlcGxhY2VGbGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJvdXRlRnJvbUZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVUb0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbGFjZUZsYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZUZyb21Gb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVUb0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmxhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX1JlbW92ZUZvbGRlclJvdXRpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCUZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVGcm9tRm9sZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUZvbGRlclJvdXRpbmcoZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVGcm9tRm9sZGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyb3V0ZUZyb21Gb2xkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZUZyb21Gb2xkZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9GaW5kRm9sZGVyUm91dGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7Ci0JRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyOwotCVJvdXRpbmdGbGFncyBmbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJvdXRlRnJvbUZvbGRlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGaW5kRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVGcm9tRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmcm91dGVUb0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCByb3V0ZVRvRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7CisgICAgRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyOworICAgIFJvdXRpbmdGbGFncyBmbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJvdXRlRnJvbUZvbGRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGaW5kRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVGcm9tRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcm91dGVUb0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCByb3V0ZVRvRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfSW52YWxpZGF0ZUZvbGRlckRlc2NyaXB0b3JDYWNoZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsaWRhdGVGb2xkZXJEZXNjcmlwdG9yQ2FjaGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9JZGVudGlmeUZvbGRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JRm9sZGVyVHlwZSBmb2xkVHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWRlbnRpZnlGb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb2xkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmb2xkVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIEZvbGRlclR5cGUgZm9sZFR5cGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IElkZW50aWZ5Rm9sZGVyKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9sZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZm9sZFR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRm9sZGVyX21ldGhvZHNbXSA9IHsKLQl7IkZpbmRGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ZpbmRGb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKHNob3J0IGZvdW5kVlJlZk51bSwgbG9uZyBmb3VuZERpcklEKSIpfSwKLQl7IlJlbGVhc2VGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX1JlbGVhc2VGb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlKSAtPiBOb25lIil9LAotCXsiRlNGaW5kRm9sZGVyIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9GU0ZpbmRGb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKEZTUmVmIGZvdW5kUmVmKSIpfSwKLQl7IkFkZEZvbGRlckRlc2NyaXB0b3IiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0FkZEZvbGRlckRlc2NyaXB0b3IsIDEsCi0JIFB5RG9jX1NUUigiKEZvbGRlclR5cGUgZm9sZFR5cGUsIEZvbGRlckRlc2NGbGFncyBmbGFncywgRm9sZGVyQ2xhc3MgZm9sZENsYXNzLCBGb2xkZXJMb2NhdGlvbiBmb2xkTG9jYXRpb24sIE9TVHlwZSBiYWRnZVNpZ25hdHVyZSwgT1NUeXBlIGJhZGdlVHlwZSwgU3RyMjU1IG5hbWUsIEJvb2xlYW4gcmVwbGFjZUZsYWcpIC0+IE5vbmUiKX0sCi0JeyJHZXRGb2xkZXJUeXBlcyIsIChQeUNGdW5jdGlvbilGb2xkZXJfR2V0Rm9sZGVyVHlwZXMsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQpIC0+IChVSW50MzIgdG90YWxUeXBlQ291bnQsIEZvbGRlclR5cGUgdGhlVHlwZXMpIil9LAotCXsiUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciIsIChQeUNGdW5jdGlvbilGb2xkZXJfUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciwgMSwKLQkgUHlEb2NfU1RSKCIoRm9sZGVyVHlwZSBmb2xkVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbmRGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ZpbmRGb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKHNob3J0IGZvdW5kVlJlZk51bSwgbG9uZyBmb3VuZERpcklEKSIpfSwKKyAgICB7IlJlbGVhc2VGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX1JlbGVhc2VGb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlKSAtPiBOb25lIil9LAorICAgIHsiRlNGaW5kRm9sZGVyIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9GU0ZpbmRGb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKEZTUmVmIGZvdW5kUmVmKSIpfSwKKyAgICB7IkFkZEZvbGRlckRlc2NyaXB0b3IiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0FkZEZvbGRlckRlc2NyaXB0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEZvbGRlclR5cGUgZm9sZFR5cGUsIEZvbGRlckRlc2NGbGFncyBmbGFncywgRm9sZGVyQ2xhc3MgZm9sZENsYXNzLCBGb2xkZXJMb2NhdGlvbiBmb2xkTG9jYXRpb24sIE9TVHlwZSBiYWRnZVNpZ25hdHVyZSwgT1NUeXBlIGJhZGdlVHlwZSwgU3RyMjU1IG5hbWUsIEJvb2xlYW4gcmVwbGFjZUZsYWcpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRGb2xkZXJUeXBlcyIsIChQeUNGdW5jdGlvbilGb2xkZXJfR2V0Rm9sZGVyVHlwZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQpIC0+IChVSW50MzIgdG90YWxUeXBlQ291bnQsIEZvbGRlclR5cGUgdGhlVHlwZXMpIil9LAorICAgIHsiUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciIsIChQeUNGdW5jdGlvbilGb2xkZXJfUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRm9sZGVyVHlwZSBmb2xkVHlwZSkgLT4gTm9uZSIpfSwKICNpZm5kZWYgX19MUDY0X18KLQl7IkdldEZvbGRlck5hbWUiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0dldEZvbGRlck5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkVHlwZSwgU3RyMjU1IG5hbWUpIC0+IChzaG9ydCBmb3VuZFZSZWZOdW0pIil9LAotCXsiQWRkRm9sZGVyUm91dGluZyIsIChQeUNGdW5jdGlvbilGb2xkZXJfQWRkRm9sZGVyUm91dGluZywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVUeXBlLCBGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlciwgRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyLCBSb3V0aW5nRmxhZ3MgZmxhZ3MsIEJvb2xlYW4gcmVwbGFjZUZsYWcpIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVGb2xkZXJSb3V0aW5nIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9SZW1vdmVGb2xkZXJSb3V0aW5nLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZmlsZVR5cGUsIEZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyKSAtPiBOb25lIil9LAotCXsiRmluZEZvbGRlclJvdXRpbmciLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ZpbmRGb2xkZXJSb3V0aW5nLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZmlsZVR5cGUsIEZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyKSAtPiAoRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyLCBSb3V0aW5nRmxhZ3MgZmxhZ3MpIil9LAorICAgIHsiR2V0Rm9sZGVyTmFtZSIsIChQeUNGdW5jdGlvbilGb2xkZXJfR2V0Rm9sZGVyTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgT1NUeXBlIGZvbGRUeXBlLCBTdHIyNTUgbmFtZSkgLT4gKHNob3J0IGZvdW5kVlJlZk51bSkiKX0sCisgICAgeyJBZGRGb2xkZXJSb3V0aW5nIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9BZGRGb2xkZXJSb3V0aW5nLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgZmlsZVR5cGUsIEZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyLCBGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXIsIFJvdXRpbmdGbGFncyBmbGFncywgQm9vbGVhbiByZXBsYWNlRmxhZykgLT4gTm9uZSIpfSwKKyAgICB7IlJlbW92ZUZvbGRlclJvdXRpbmciLCAoUHlDRnVuY3Rpb24pRm9sZGVyX1JlbW92ZUZvbGRlclJvdXRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSwgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXIpIC0+IE5vbmUiKX0sCisgICAgeyJGaW5kRm9sZGVyUm91dGluZyIsIChQeUNGdW5jdGlvbilGb2xkZXJfRmluZEZvbGRlclJvdXRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSwgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXIpIC0+IChGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXIsIFJvdXRpbmdGbGFncyBmbGFncykiKX0sCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JeyJJbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9JbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiBOb25lIil9LAotCXsiSWRlbnRpZnlGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0lkZW50aWZ5Rm9sZGVyLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiAoRm9sZGVyVHlwZSBmb2xkVHlwZSkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJJbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9JbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiBOb25lIil9LAorICAgIHsiSWRlbnRpZnlGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0lkZW50aWZ5Rm9sZGVyLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiAoRm9sZGVyVHlwZSBmb2xkVHlwZSkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTMyNCwxOCArMzI0LDE4IEBACiAKIHZvaWQgaW5pdF9Gb2xkZXIodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfRm9sZGVyIiwgRm9sZGVyX21ldGhvZHMpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUZvbGRlcl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEZvbGRlcl9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEZvbGRlcl9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRm9sZGVyIiwgRm9sZGVyX21ldGhvZHMpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEZvbGRlcl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEZvbGRlcl9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEZvbGRlcl9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PSBFbmQgbW9kdWxlIF9Gb2xkZXIgPT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2dlc3RhbHRtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2dlc3RhbHRtb2R1bGUuYwppbmRleCBmYTFjOTNjLi41Njc1N2FiIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9nZXN0YWx0bW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZ2VzdGFsdG1vZHVsZS5jCkBAIC00LDEwICs0LDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKIAotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAotZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBTdGljaHRpbmcgTWF0aGVtYXRpc2NoCiBDZW50cnVtIG9yIENXSSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bwogZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCkBAIC0zMiwyNCArMzIsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXN0YWx0X2dlc3RhbHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TRXJyIGlFcnI7Ci0JT1NUeXBlIHNlbGVjdG9yOwotCVNJbnQzMiByZXNwb25zZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlpRXJyID0gR2VzdGFsdCAoIHNlbGVjdG9yLCAmcmVzcG9uc2UgKTsKLQlpZiAoaUVyciAhPSAwKSAKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGlFcnIpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZXNwb25zZSk7CisgICAgT1NFcnIgaUVycjsKKyAgICBPU1R5cGUgc2VsZWN0b3I7CisgICAgU0ludDMyIHJlc3BvbnNlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlFcnIgPSBHZXN0YWx0ICggc2VsZWN0b3IsICZyZXNwb25zZSApOworICAgIGlmIChpRXJyICE9IDApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihpRXJyKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzcG9uc2UpOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGdlc3RhbHRfbWV0aG9kc1tdID0gewotCXsiZ2VzdGFsdCIsIGdlc3RhbHRfZ2VzdGFsdCwgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwgTlVMTH0gLyogU2VudGluZWwgKi8KKyAgICB7Imdlc3RhbHQiLCBnZXN0YWx0X2dlc3RhbHQsIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsIE5VTEx9IC8qIFNlbnRpbmVsICovCiB9OwogCiB2b2lkCiBpbml0Z2VzdGFsdCh2b2lkKQogewotCVB5X0luaXRNb2R1bGUoImdlc3RhbHQiLCBnZXN0YWx0X21ldGhvZHMpOworICAgIFB5X0luaXRNb2R1bGUoImdlc3RhbHQiLCBnZXN0YWx0X21ldGhvZHMpOwogfQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaGVscC9fSGVscG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvaGVscC9fSGVscG1vZHVsZS5jCmluZGV4IGE2ZWNjZjMuLmVhYTJlOGEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2hlbHAvX0hlbHBtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9oZWxwL19IZWxwbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDE1MSArMjIsMTUxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqSGVscF9ITUdldEhlbHBNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVSZWYgb3V0SGVscE1lbnU7Ci0JTWVudUl0ZW1JbmRleCBvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhNR2V0SGVscE1lbnUoJm91dEhlbHBNZW51LAotCSAgICAgICAgICAgICAgICAgICAgICZvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0SGVscE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Rmlyc3RDdXN0b21JdGVtSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVSZWYgb3V0SGVscE1lbnU7CisgICAgTWVudUl0ZW1JbmRleCBvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhNR2V0SGVscE1lbnUoJm91dEhlbHBNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0SGVscE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Rmlyc3RDdXN0b21JdGVtSW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1BcmVIZWxwVGFnc0Rpc3BsYXllZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEhNQXJlSGVscFRhZ3NEaXNwbGF5ZWQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhNQXJlSGVscFRhZ3NEaXNwbGF5ZWQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpIZWxwX0hNU2V0SGVscFRhZ3NEaXNwbGF5ZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBpbkRpc3BsYXlUYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EaXNwbGF5VGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBITVNldEhlbHBUYWdzRGlzcGxheWVkKGluRGlzcGxheVRhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5EaXNwbGF5VGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGlzcGxheVRhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSE1TZXRIZWxwVGFnc0Rpc3BsYXllZChpbkRpc3BsYXlUYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpIZWxwX0hNU2V0VGFnRGVsYXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRHVyYXRpb24gaW5EZWxheTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVsYXkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSE1TZXRUYWdEZWxheShpbkRlbGF5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEdXJhdGlvbiBpbkRlbGF5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZWxheSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBITVNldFRhZ0RlbGF5KGluRGVsYXkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1HZXRUYWdEZWxheShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEdXJhdGlvbiBvdXREZWxheTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhNR2V0VGFnRGVsYXkoJm91dERlbGF5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXREZWxheSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRHVyYXRpb24gb3V0RGVsYXk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBITUdldFRhZ0RlbGF5KCZvdXREZWxheSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RGVsYXkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1TZXRNZW51SGVscEZyb21CYWxsb29uUnNyYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51UmVmIGluTWVudTsKLQlTSW50MTYgaW5IbW51UnNyY0lEOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG1udVJzcmNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBITVNldE1lbnVIZWxwRnJvbUJhbGxvb25Sc3JjKGluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhtbnVSc3JjSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVSZWYgaW5NZW51OworICAgIFNJbnQxNiBpbkhtbnVSc3JjSUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IbW51UnNyY0lEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhNU2V0TWVudUhlbHBGcm9tQmFsbG9vblJzcmMoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSG1udVJzcmNJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSGVscF9ITVNldERpYWxvZ0hlbHBGcm9tQmFsbG9vblJzcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRGlhbG9nUHRyIGluRGlhbG9nOwotCVNJbnQxNiBpbkhkbGdSc3JjSUQ7Ci0JU0ludDE2IGluSXRlbVN0YXJ0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmluRGlhbG9nLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IZGxnUnNyY0lELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtU3RhcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjKGluRGlhbG9nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZGxnUnNyY0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtU3RhcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIERpYWxvZ1B0ciBpbkRpYWxvZzsKKyAgICBTSW50MTYgaW5IZGxnUnNyY0lEOworICAgIFNJbnQxNiBpbkl0ZW1TdGFydDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX0NvbnZlcnQsICZpbkRpYWxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSGRsZ1JzcmNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbVN0YXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhNU2V0RGlhbG9nSGVscEZyb21CYWxsb29uUnNyYyhpbkRpYWxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGRsZ1JzcmNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbVN0YXJ0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpIZWxwX0hNSGlkZVRhZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhNSGlkZVRhZygpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSE1IaWRlVGFnKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgSGVscF9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJITUdldEhlbHBNZW51IiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1HZXRIZWxwTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVudVJlZiBvdXRIZWxwTWVudSwgTWVudUl0ZW1JbmRleCBvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleCkiKX0sCi0JeyJITUFyZUhlbHBUYWdzRGlzcGxheWVkIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1BcmVIZWxwVGFnc0Rpc3BsYXllZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSE1TZXRIZWxwVGFnc0Rpc3BsYXllZCIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0SGVscFRhZ3NEaXNwbGF5ZWQsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5EaXNwbGF5VGFncykgLT4gTm9uZSIpfSwKLQl7IkhNU2V0VGFnRGVsYXkiLCAoUHlDRnVuY3Rpb24pSGVscF9ITVNldFRhZ0RlbGF5LCAxLAotCSBQeURvY19TVFIoIihEdXJhdGlvbiBpbkRlbGF5KSAtPiBOb25lIil9LAotCXsiSE1HZXRUYWdEZWxheSIsIChQeUNGdW5jdGlvbilIZWxwX0hNR2V0VGFnRGVsYXksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKER1cmF0aW9uIG91dERlbGF5KSIpfSwKLQl7IkhNU2V0TWVudUhlbHBGcm9tQmFsbG9vblJzcmMiLCAoUHlDRnVuY3Rpb24pSGVscF9ITVNldE1lbnVIZWxwRnJvbUJhbGxvb25Sc3JjLCAxLAotCSBQeURvY19TVFIoIihNZW51UmVmIGluTWVudSwgU0ludDE2IGluSG1udVJzcmNJRCkgLT4gTm9uZSIpfSwKLQl7IkhNU2V0RGlhbG9nSGVscEZyb21CYWxsb29uUnNyYyIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0RGlhbG9nSGVscEZyb21CYWxsb29uUnNyYywgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nUHRyIGluRGlhbG9nLCBTSW50MTYgaW5IZGxnUnNyY0lELCBTSW50MTYgaW5JdGVtU3RhcnQpIC0+IE5vbmUiKX0sCi0JeyJITUhpZGVUYWciLCAoUHlDRnVuY3Rpb24pSGVscF9ITUhpZGVUYWcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkhNR2V0SGVscE1lbnUiLCAoUHlDRnVuY3Rpb24pSGVscF9ITUdldEhlbHBNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51UmVmIG91dEhlbHBNZW51LCBNZW51SXRlbUluZGV4IG91dEZpcnN0Q3VzdG9tSXRlbUluZGV4KSIpfSwKKyAgICB7IkhNQXJlSGVscFRhZ3NEaXNwbGF5ZWQiLCAoUHlDRnVuY3Rpb24pSGVscF9ITUFyZUhlbHBUYWdzRGlzcGxheWVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJITVNldEhlbHBUYWdzRGlzcGxheWVkIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1TZXRIZWxwVGFnc0Rpc3BsYXllZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbkRpc3BsYXlUYWdzKSAtPiBOb25lIil9LAorICAgIHsiSE1TZXRUYWdEZWxheSIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0VGFnRGVsYXksIDEsCisgICAgIFB5RG9jX1NUUigiKER1cmF0aW9uIGluRGVsYXkpIC0+IE5vbmUiKX0sCisgICAgeyJITUdldFRhZ0RlbGF5IiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1HZXRUYWdEZWxheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRHVyYXRpb24gb3V0RGVsYXkpIil9LAorICAgIHsiSE1TZXRNZW51SGVscEZyb21CYWxsb29uUnNyYyIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0TWVudUhlbHBGcm9tQmFsbG9vblJzcmMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVSZWYgaW5NZW51LCBTSW50MTYgaW5IbW51UnNyY0lEKSAtPiBOb25lIil9LAorICAgIHsiSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dQdHIgaW5EaWFsb2csIFNJbnQxNiBpbkhkbGdSc3JjSUQsIFNJbnQxNiBpbkl0ZW1TdGFydCkgLT4gTm9uZSIpfSwKKyAgICB7IkhNSGlkZVRhZyIsIChQeUNGdW5jdGlvbilIZWxwX0hNSGlkZVRhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTE3NCwyMSArMTc0LDIxIEBACiAKIHZvaWQgaW5pdF9IZWxwKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfSGVscCIsIEhlbHBfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9IZWxwIiwgSGVscF9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlIZWxwX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoSGVscF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEhlbHBfRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBIZWxwX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoSGVscF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEhlbHBfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9pYmNhcmJvbi9fSUJDYXJib24uYyBiL01hYy9Nb2R1bGVzL2liY2FyYm9uL19JQkNhcmJvbi5jCmluZGV4IGM3YzgxOWMuLjJhNjVmNDIgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2liY2FyYm9uL19JQkNhcmJvbi5jCisrKyBiL01hYy9Nb2R1bGVzL2liY2FyYm9uL19JQkNhcmJvbi5jCkBAIC0yMywxMTYgKzIzLDExNiBAQAogI2RlZmluZSBJQk5pYlJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZJQk5pYlJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZJQk5pYlJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgSUJOaWJSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlJQk5pYlJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIElCTmliUmVmIG9iX2l0c2VsZjsKIH0gSUJOaWJSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpJQk5pYlJlZk9ial9OZXcoSUJOaWJSZWYgaXRzZWxmKQogewotCUlCTmliUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhJQk5pYlJlZk9iamVjdCwgJklCTmliUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBJQk5pYlJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoSUJOaWJSZWZPYmplY3QsICZJQk5pYlJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBJQk5pYlJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBJQk5pYlJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFJQk5pYlJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJQk5pYlJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChJQk5pYlJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFJQk5pYlJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJQk5pYlJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChJQk5pYlJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIElCTmliUmVmT2JqX2RlYWxsb2MoSUJOaWJSZWZPYmplY3QgKnNlbGYpCiB7Ci0JRGlzcG9zZU5pYlJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgRGlzcG9zZU5pYlJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSUJOaWJSZWZPYmpfQ3JlYXRlV2luZG93RnJvbU5pYihJQk5pYlJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpbk5hbWU7Ci0JV2luZG93UHRyIG91dFdpbmRvdzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlV2luZG93RnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpbk5hbWU7CisgICAgV2luZG93UHRyIG91dFdpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlV2luZG93RnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJQk5pYlJlZk9ial9DcmVhdGVNZW51RnJvbU5pYihJQk5pYlJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpbk5hbWU7Ci0JTWVudUhhbmRsZSBvdXRNZW51UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVNZW51RnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnVSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluTmFtZTsKKyAgICBNZW51SGFuZGxlIG91dE1lbnVSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZU1lbnVGcm9tTmliKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSUJOaWJSZWZPYmpfQ3JlYXRlTWVudUJhckZyb21OaWIoSUJOaWJSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5OYW1lOwotCUhhbmRsZSBvdXRNZW51QmFyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVNZW51QmFyRnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51QmFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0TWVudUJhcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5OYW1lOworICAgIEhhbmRsZSBvdXRNZW51QmFyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVNZW51QmFyRnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51QmFyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0TWVudUJhcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSUJOaWJSZWZPYmpfU2V0TWVudUJhckZyb21OaWIoSUJOaWJSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5OYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51QmFyRnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluTmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUJhckZyb21OaWIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIElCTmliUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNyZWF0ZVdpbmRvd0Zyb21OaWIiLCAoUHlDRnVuY3Rpb24pSUJOaWJSZWZPYmpfQ3JlYXRlV2luZG93RnJvbU5pYiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiAoV2luZG93UHRyIG91dFdpbmRvdykiKX0sCi0JeyJDcmVhdGVNZW51RnJvbU5pYiIsIChQeUNGdW5jdGlvbilJQk5pYlJlZk9ial9DcmVhdGVNZW51RnJvbU5pYiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51UmVmKSIpfSwKLQl7IkNyZWF0ZU1lbnVCYXJGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX0NyZWF0ZU1lbnVCYXJGcm9tTmliLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChIYW5kbGUgb3V0TWVudUJhcikiKX0sCi0JeyJTZXRNZW51QmFyRnJvbU5pYiIsIChQeUNGdW5jdGlvbilJQk5pYlJlZk9ial9TZXRNZW51QmFyRnJvbU5pYiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ3JlYXRlV2luZG93RnJvbU5pYiIsIChQeUNGdW5jdGlvbilJQk5pYlJlZk9ial9DcmVhdGVXaW5kb3dGcm9tTmliLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKKyAgICB7IkNyZWF0ZU1lbnVGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX0NyZWF0ZU1lbnVGcm9tTmliLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChNZW51SGFuZGxlIG91dE1lbnVSZWYpIil9LAorICAgIHsiQ3JlYXRlTWVudUJhckZyb21OaWIiLCAoUHlDRnVuY3Rpb24pSUJOaWJSZWZPYmpfQ3JlYXRlTWVudUJhckZyb21OaWIsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluTmFtZSkgLT4gKEhhbmRsZSBvdXRNZW51QmFyKSIpfSwKKyAgICB7IlNldE1lbnVCYXJGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX1NldE1lbnVCYXJGcm9tTmliLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIElCTmliUmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTQ5LDYxICsxNDksNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpJQk5pYlJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JSUJOaWJSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBJQk5pYlJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBJQk5pYlJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKElCTmliUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIElCTmliUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoSUJOaWJSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgSUJOaWJSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgSUJOaWJSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfSUJDYXJib24uSUJOaWJSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihJQk5pYlJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIElCTmliUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIElCTmliUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBJQk5pYlJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgSUJOaWJSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JSUJOaWJSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JSUJOaWJSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JSUJOaWJSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUlCTmliUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUlCTmliUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JSUJOaWJSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9JQkNhcmJvbi5JQk5pYlJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKElCTmliUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgSUJOaWJSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgSUJOaWJSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIElCTmliUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBJQk5pYlJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBJQk5pYlJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBJQk5pYlJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBJQk5pYlJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgSUJOaWJSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgSUJOaWJSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBJQk5pYlJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgSUJOaWJSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIxMSwyOCArMjExLDI4IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqSUJDYXJib25fQ3JlYXRlTmliUmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGluTmliTmFtZTsKLQlJQk5pYlJlZiBvdXROaWJSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OaWJOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZU5pYlJlZmVyZW5jZShpbk5pYk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmliUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgSUJOaWJSZWZPYmpfTmV3LCBvdXROaWJSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluTmliTmFtZTsKKyAgICBJQk5pYlJlZiBvdXROaWJSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OaWJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZU5pYlJlZmVyZW5jZShpbk5pYk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmliUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgSUJOaWJSZWZPYmpfTmV3LCBvdXROaWJSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBJQkNhcmJvbl9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJDcmVhdGVOaWJSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pSUJDYXJib25fQ3JlYXRlTmliUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5pYk5hbWUpIC0+IChJQk5pYlJlZiBvdXROaWJSZWYpIil9LAorICAgIHsiQ3JlYXRlTmliUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKUlCQ2FyYm9uX0NyZWF0ZU5pYlJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OaWJOYW1lKSAtPiAoSUJOaWJSZWYgb3V0TmliUmVmKSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0yNDAsMjkgKzI0MCwyOSBAQAogCiB2b2lkIGluaXRfSUJDYXJib24odm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0lCQ2FyYm9uIiwgSUJDYXJib25fbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9JQkNhcmJvbiIsIElCQ2FyYm9uX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUlCQ2FyYm9uX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoSUJDYXJib25fRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBJQkNhcmJvbl9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUlCTmliUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZJQk5pYlJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJklCTmliUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSUJOaWJSZWYiLCAoUHlPYmplY3QgKikmSUJOaWJSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZJQk5pYlJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIklCTmliUmVmVHlwZSIsIChQeU9iamVjdCAqKSZJQk5pYlJlZl9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBJQkNhcmJvbl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKElCQ2FyYm9uX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgSUJDYXJib25fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBJQk5pYlJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmSUJOaWJSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZJQk5pYlJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIklCTmliUmVmIiwgKFB5T2JqZWN0ICopJklCTmliUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmSUJOaWJSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJQk5pYlJlZlR5cGUiLCAoUHlPYmplY3QgKikmSUJOaWJSZWZfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaWNnbHVlbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9pY2dsdWVtb2R1bGUuYwppbmRleCA3MGNhMWUzLi40ZDE3YmY3IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9pY2dsdWVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9pY2dsdWVtb2R1bGUuYwpAQCAtNDMsOCArNDMsOCBAQAogLyogRGVjbGFyYXRpb25zIGZvciBvYmplY3RzIG9mIHR5cGUgaWNfaW5zdGFuY2UgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlJQ0luc3RhbmNlIGluc3Q7CisgICAgUHlPYmplY3RfSEVBRAorICAgIElDSW5zdGFuY2UgaW5zdDsKIH0gaWNpb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEljaXR5cGU7CkBAIC01NCwzMDMgKzU0LDMwMyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0dldFNlZWRfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0dldFNlZWRfX2RvY19fW10gPQogIigpLT5pbnQ7IFJldHVybnMgaW50IHRoYXQgY2hhbmdlcyB3aGVuIGNvbmZpZ3VyYXRpb24gZG9lcyIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0dldFNlZWQoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JbG9uZyBzZWVkOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDR2V0U2VlZChzZWxmLT5pbnN0LCAmc2VlZCkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpc2VlZCk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIGxvbmcgc2VlZDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDR2V0U2VlZChzZWxmLT5pbnN0LCAmc2VlZCkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpc2VlZCk7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDQmVnaW5fX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0JlZ2luX19kb2NfX1tdID0KICIocGVybSktPk5vbmU7IExvY2sgY29uZmlnIGZpbGUgZm9yIHJlYWQvd3JpdGUiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNCZWdpbihpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlpbnQgcGVybTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmcGVybSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDQmVnaW4oc2VsZi0+aW5zdCwgKElDUGVybSlwZXJtKSkgIT0gMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgaW50IHBlcm07CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmcGVybSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDQmVnaW4oc2VsZi0+aW5zdCwgKElDUGVybSlwZXJtKSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCi1zdGF0aWMgY2hhciBpY2lfSUNGaW5kUHJlZkhhbmRsZV9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDRmluZFByZWZIYW5kbGVfX2RvY19fW10gPQogIihrZXksIGhhbmRsZSktPmF0dHJzOyBMb29rdXAga2V5LCBzdG9yZSByZXN1bHQgaW4gaGFuZGxlLCByZXR1cm4gYXR0cmlidXRlcyIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0ZpbmRQcmVmSGFuZGxlKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVN0cjI1NSBrZXk7Ci0JSUNBdHRyIGF0dHI7Ci0JSGFuZGxlIGg7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAma2V5LCBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ0ZpbmRQcmVmSGFuZGxlKHNlbGYtPmluc3QsIGtleSwgJmF0dHIsIGgpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KWF0dHIpOworICAgIE9TU3RhdHVzIGVycjsKKyAgICBTdHIyNTUga2V5OworICAgIElDQXR0ciBhdHRyOworICAgIEhhbmRsZSBoOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAma2V5LCBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ0ZpbmRQcmVmSGFuZGxlKHNlbGYtPmluc3QsIGtleSwgJmF0dHIsIGgpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KWF0dHIpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ1NldFByZWZfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ1NldFByZWZfX2RvY19fW10gPQogIihrZXksIGF0dHIsIGRhdGEpLT5Ob25lOyBTZXQgcHJlZmVyZW5jZSBrZXkgdG8gZGF0YSB3aXRoIGF0dHJpYnV0ZXMiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNTZXRQcmVmKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVN0cjI1NSBrZXk7Ci0JaW50IGF0dHI7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YWxlbjsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maXMjIiwgUHlNYWNfR2V0U3RyMjU1LCAma2V5LCAmYXR0ciwgCi0JCQkJCSZkYXRhLCAmZGF0YWxlbikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDU2V0UHJlZihzZWxmLT5pbnN0LCBrZXksIChJQ0F0dHIpYXR0ciwgKFB0cilkYXRhLCAKLQkJCShsb25nKWRhdGFsZW4pKSAhPSAwKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFN0cjI1NSBrZXk7CisgICAgaW50IGF0dHI7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgZGF0YWxlbjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpcyMiLCBQeU1hY19HZXRTdHIyNTUsICZrZXksICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsICZkYXRhbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNTZXRQcmVmKHNlbGYtPmluc3QsIGtleSwgKElDQXR0cilhdHRyLCAoUHRyKWRhdGEsCisgICAgICAgICAgICAgICAgICAgIChsb25nKWRhdGFsZW4pKSAhPSAwKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDQ291bnRQcmVmX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNDb3VudFByZWZfX2RvY19fW10gPQogIigpLT5pbnQ7IFJldHVybiBudW1iZXIgb2YgcHJlZmVyZW5jZXMiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNDb3VudFByZWYoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JbG9uZyBjb3VudDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ0NvdW50UHJlZihzZWxmLT5pbnN0LCAmY291bnQpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KWNvdW50KTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgbG9uZyBjb3VudDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDQ291bnRQcmVmKHNlbGYtPmluc3QsICZjb3VudCkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpY291bnQpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0dldEluZFByZWZfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0dldEluZFByZWZfX2RvY19fW10gPQogIihudW0pLT5rZXk7IFJldHVybiBrZXkgb2YgcHJlZmVyZW5jZSB3aXRoIGdpdmVuIGluZGV4IgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDR2V0SW5kUHJlZihpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlsb25nIG51bTsKLQlTdHIyNTUga2V5OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZudW0pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ0dldEluZFByZWYoc2VsZi0+aW5zdCwgbnVtLCBrZXkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRTdHIyNTUsIGtleSk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIGxvbmcgbnVtOworICAgIFN0cjI1NSBrZXk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmbnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNHZXRJbmRQcmVmKHNlbGYtPmluc3QsIG51bSwga2V5KSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkU3RyMjU1LCBrZXkpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0RlbGV0ZVByZWZfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0RlbGV0ZVByZWZfX2RvY19fW10gPQogIihrZXkpLT5Ob25lOyBEZWxldGUgcHJlZmVyZW5jZSIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0RlbGV0ZVByZWYoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGtleTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGtleTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsIGtleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDRGVsZXRlUHJlZihzZWxmLT5pbnN0LCBrZXkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsIGtleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDRGVsZXRlUHJlZihzZWxmLT5pbnN0LCBrZXkpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0VuZF9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDRW5kX19kb2NfX1tdID0KICIoKS0+Tm9uZTsgVW5sb2NrIGZpbGUgYWZ0ZXIgSUNCZWdpbiBjYWxsIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDRW5kKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDRW5kKHNlbGYtPmluc3QpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIE9TU3RhdHVzIGVycjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDRW5kKHNlbGYtPmluc3QpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0VkaXRQcmVmZXJlbmNlc19fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDRWRpdFByZWZlcmVuY2VzX19kb2NfX1tdID0KICIoa2V5KS0+Tm9uZTsgQXNrIHVzZXIgdG8gZWRpdCBwcmVmZXJlbmNlcywgc3RhcmluZyB3aXRoIGtleSIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0VkaXRQcmVmZXJlbmNlcyhpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlTdHIyNTUga2V5OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsIGtleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDRWRpdFByZWZlcmVuY2VzKHNlbGYtPmluc3QsIGtleSkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFN0cjI1NSBrZXk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCBrZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ0VkaXRQcmVmZXJlbmNlcyhzZWxmLT5pbnN0LCBrZXkpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ1BhcnNlVVJMX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNQYXJzZVVSTF9fZG9jX19bXSA9CiAiKGhpbnQsIGRhdGEsIHNlbFN0YXJ0LCBzZWxFbmQsIGhhbmRsZSktPnNlbFN0YXJ0LCBzZWxFbmQ7IEZpbmQgYW4gVVJMLCByZXR1cm4gaW4gaGFuZGxlIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDUGFyc2VVUkwoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGhpbnQ7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YWxlbjsKLQlsb25nIHNlbFN0YXJ0LCBzZWxFbmQ7Ci0JSGFuZGxlIGg7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnMjbGxPJiIsIFB5TWFjX0dldFN0cjI1NSwgaGludCwgJmRhdGEsICZkYXRhbGVuLAotCQkJCSZzZWxTdGFydCwgJnNlbEVuZCwgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNQYXJzZVVSTChzZWxmLT5pbnN0LCBoaW50LCAoUHRyKWRhdGEsIChsb25nKWRhdGFsZW4sCi0JCQkJJnNlbFN0YXJ0LCAmc2VsRW5kLCBoKSkgIT0gMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIChpbnQpc2VsU3RhcnQsIChpbnQpc2VsRW5kKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGhpbnQ7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgZGF0YWxlbjsKKyAgICBsb25nIHNlbFN0YXJ0LCBzZWxFbmQ7CisgICAgSGFuZGxlIGg7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mcyNsbE8mIiwgUHlNYWNfR2V0U3RyMjU1LCBoaW50LCAmZGF0YSwgJmRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbFN0YXJ0LCAmc2VsRW5kLCBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ1BhcnNlVVJMKHNlbGYtPmluc3QsIGhpbnQsIChQdHIpZGF0YSwgKGxvbmcpZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsU3RhcnQsICZzZWxFbmQsIGgpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgKGludClzZWxTdGFydCwgKGludClzZWxFbmQpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0xhdW5jaFVSTF9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDTGF1bmNoVVJMX19kb2NfX1tdID0KICIoaGludCwgZGF0YSwgc2VsU3RhcnQsIHNlbEVuZCktPk5vbmU7IEZpbmQgYW4gVVJMIGFuZCBsYXVuY2ggdGhlIGNvcnJlY3QgYXBwIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDTGF1bmNoVVJMKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVN0cjI1NSBoaW50OwotCWNoYXIgKmRhdGE7Ci0JaW50IGRhdGFsZW47Ci0JbG9uZyBzZWxTdGFydCwgc2VsRW5kOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZzI2xsIiwgUHlNYWNfR2V0U3RyMjU1LCBoaW50LCAmZGF0YSwgJmRhdGFsZW4sCi0JCQkJJnNlbFN0YXJ0LCAmc2VsRW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNMYXVuY2hVUkwoc2VsZi0+aW5zdCwgaGludCwgKFB0cilkYXRhLCAobG9uZylkYXRhbGVuLAotCQkJCSZzZWxTdGFydCwgJnNlbEVuZCkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCAoaW50KXNlbFN0YXJ0LCAoaW50KXNlbEVuZCk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFN0cjI1NSBoaW50OworICAgIGNoYXIgKmRhdGE7CisgICAgaW50IGRhdGFsZW47CisgICAgbG9uZyBzZWxTdGFydCwgc2VsRW5kOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnMjbGwiLCBQeU1hY19HZXRTdHIyNTUsIGhpbnQsICZkYXRhLCAmZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsU3RhcnQsICZzZWxFbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ0xhdW5jaFVSTChzZWxmLT5pbnN0LCBoaW50LCAoUHRyKWRhdGEsIChsb25nKWRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbFN0YXJ0LCAmc2VsRW5kKSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIChpbnQpc2VsU3RhcnQsIChpbnQpc2VsRW5kKTsKIH0KIAogCi1zdGF0aWMgY2hhciBpY2lfSUNNYXBGaWxlbmFtZV9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDTWFwRmlsZW5hbWVfX2RvY19fW10gPQogIihmaWxlbmFtZSktPm1hcGluZm87IEdldCBmaWxlbWFwIGluZm8gZm9yIGdpdmVuIGZpbGVuYW1lIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDTWFwRmlsZW5hbWUoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGZpbGVuYW1lOwotCUlDTWFwRW50cnkgZW50cnk7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgZmlsZW5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ01hcEZpbGVuYW1lKHNlbGYtPmluc3QsIGZpbGVuYW1lLCAmZW50cnkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPJk8mTyZsTyZPJk8mTyZPJiIsIGVudHJ5LnZlcnNpb24sIAotCQlQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkuZmlsZVR5cGUsCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlQ3JlYXRvciwgCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5wb3N0Q3JlYXRvciwgCi0JCWVudHJ5LmZsYWdzLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZXh0ZW5zaW9uLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuY3JlYXRvckFwcE5hbWUsCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5wb3N0QXBwTmFtZSwKLQkJUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5Lk1JTUVUeXBlLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZW50cnlOYW1lKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGZpbGVuYW1lOworICAgIElDTWFwRW50cnkgZW50cnk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCBmaWxlbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDTWFwRmlsZW5hbWUoc2VsZi0+aW5zdCwgZmlsZW5hbWUsICZlbnRyeSkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaE8mTyZPJmxPJk8mTyZPJk8mIiwgZW50cnkudmVyc2lvbiwKKyAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LmZpbGVUeXBlLAorICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkuZmlsZUNyZWF0b3IsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5wb3N0Q3JlYXRvciwKKyAgICAgICAgZW50cnkuZmxhZ3MsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5leHRlbnNpb24sCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5jcmVhdG9yQXBwTmFtZSwKKyAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5LnBvc3RBcHBOYW1lLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuTUlNRVR5cGUsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5lbnRyeU5hbWUpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ01hcFR5cGVDcmVhdG9yX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNNYXBUeXBlQ3JlYXRvcl9fZG9jX19bXSA9CiAiKHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lKS0+bWFwaW5mbzsgR2V0IGZpbGVtYXAgaW5mbyBmb3IgZ2l2ZW4gdHAvY3IvZmlsZW5hbWUiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNNYXBUeXBlQ3JlYXRvcihpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlPU1R5cGUgdHlwZSwgY3JlYXRvcjsKLQlTdHIyNTUgZmlsZW5hbWU7Ci0JSUNNYXBFbnRyeSBlbnRyeTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCi0JCQlQeU1hY19HZXRPU1R5cGUsICZ0eXBlLAotCQkJUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkJCVB5TWFjX0dldFN0cjI1NSwgZmlsZW5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ01hcFR5cGVDcmVhdG9yKHNlbGYtPmluc3QsIHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lLCAmZW50cnkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPJk8mTyZsTyZPJk8mTyZPJiIsIGVudHJ5LnZlcnNpb24sIAotCQlQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkuZmlsZVR5cGUsCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlQ3JlYXRvciwgCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5wb3N0Q3JlYXRvciwgCi0JCWVudHJ5LmZsYWdzLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZXh0ZW5zaW9uLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuY3JlYXRvckFwcE5hbWUsCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5wb3N0QXBwTmFtZSwKLQkJUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5Lk1JTUVUeXBlLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZW50cnlOYW1lKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgT1NUeXBlIHR5cGUsIGNyZWF0b3I7CisgICAgU3RyMjU1IGZpbGVuYW1lOworICAgIElDTWFwRW50cnkgZW50cnk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGUsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ01hcFR5cGVDcmVhdG9yKHNlbGYtPmluc3QsIHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lLCAmZW50cnkpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPJk8mTyZsTyZPJk8mTyZPJiIsIGVudHJ5LnZlcnNpb24sCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlVHlwZSwKKyAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LmZpbGVDcmVhdG9yLAorICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkucG9zdENyZWF0b3IsCisgICAgICAgIGVudHJ5LmZsYWdzLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZXh0ZW5zaW9uLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuY3JlYXRvckFwcE5hbWUsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5wb3N0QXBwTmFtZSwKKyAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5Lk1JTUVUeXBlLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZW50cnlOYW1lKTsKIH0KIAogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGljaV9tZXRob2RzW10gPSB7Ci0geyJJQ0dldFNlZWQiLAkoUHlDRnVuY3Rpb24paWNpX0lDR2V0U2VlZCwJTUVUSF9WQVJBUkdTLAlpY2lfSUNHZXRTZWVkX19kb2NfX30sCi0geyJJQ0JlZ2luIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ0JlZ2luLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ0JlZ2luX19kb2NfX30sCi0geyJJQ0ZpbmRQcmVmSGFuZGxlIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ0ZpbmRQcmVmSGFuZGxlLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ0ZpbmRQcmVmSGFuZGxlX19kb2NfX30sCi0geyJJQ1NldFByZWYiLAkoUHlDRnVuY3Rpb24paWNpX0lDU2V0UHJlZiwJTUVUSF9WQVJBUkdTLAlpY2lfSUNTZXRQcmVmX19kb2NfX30sCi0geyJJQ0NvdW50UHJlZiIsCShQeUNGdW5jdGlvbilpY2lfSUNDb3VudFByZWYsCU1FVEhfVkFSQVJHUywJaWNpX0lDQ291bnRQcmVmX19kb2NfX30sCi0geyJJQ0dldEluZFByZWYiLAkoUHlDRnVuY3Rpb24paWNpX0lDR2V0SW5kUHJlZiwJTUVUSF9WQVJBUkdTLAlpY2lfSUNHZXRJbmRQcmVmX19kb2NfX30sCi0geyJJQ0RlbGV0ZVByZWYiLAkoUHlDRnVuY3Rpb24paWNpX0lDRGVsZXRlUHJlZiwJTUVUSF9WQVJBUkdTLAlpY2lfSUNEZWxldGVQcmVmX19kb2NfX30sCi0geyJJQ0VuZCIsCShQeUNGdW5jdGlvbilpY2lfSUNFbmQsCU1FVEhfVkFSQVJHUywJaWNpX0lDRW5kX19kb2NfX30sCi0geyJJQ0VkaXRQcmVmZXJlbmNlcyIsCShQeUNGdW5jdGlvbilpY2lfSUNFZGl0UHJlZmVyZW5jZXMsCU1FVEhfVkFSQVJHUywJaWNpX0lDRWRpdFByZWZlcmVuY2VzX19kb2NfX30sCi0geyJJQ1BhcnNlVVJMIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ1BhcnNlVVJMLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ1BhcnNlVVJMX19kb2NfX30sCi0geyJJQ0xhdW5jaFVSTCIsCShQeUNGdW5jdGlvbilpY2lfSUNMYXVuY2hVUkwsCU1FVEhfVkFSQVJHUywJaWNpX0lDTGF1bmNoVVJMX19kb2NfX30sCi0geyJJQ01hcEZpbGVuYW1lIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ01hcEZpbGVuYW1lLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ01hcEZpbGVuYW1lX19kb2NfX30sCi0geyJJQ01hcFR5cGVDcmVhdG9yIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ01hcFR5cGVDcmVhdG9yLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ01hcFR5cGVDcmVhdG9yX19kb2NfX30sCi0gCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyB7IklDR2V0U2VlZCIsICAoUHlDRnVuY3Rpb24paWNpX0lDR2V0U2VlZCwgICAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNHZXRTZWVkX19kb2NfX30sCisgeyJJQ0JlZ2luIiwgICAgKFB5Q0Z1bmN0aW9uKWljaV9JQ0JlZ2luLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDQmVnaW5fX2RvY19ffSwKKyB7IklDRmluZFByZWZIYW5kbGUiLCAgIChQeUNGdW5jdGlvbilpY2lfSUNGaW5kUHJlZkhhbmRsZSwgICAgICBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDRmluZFByZWZIYW5kbGVfX2RvY19ffSwKKyB7IklDU2V0UHJlZiIsICAoUHlDRnVuY3Rpb24paWNpX0lDU2V0UHJlZiwgICAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNTZXRQcmVmX19kb2NfX30sCisgeyJJQ0NvdW50UHJlZiIsICAgICAgICAoUHlDRnVuY3Rpb24paWNpX0lDQ291bnRQcmVmLCAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNDb3VudFByZWZfX2RvY19ffSwKKyB7IklDR2V0SW5kUHJlZiIsICAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNHZXRJbmRQcmVmLCAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0dldEluZFByZWZfX2RvY19ffSwKKyB7IklDRGVsZXRlUHJlZiIsICAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNEZWxldGVQcmVmLCAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0RlbGV0ZVByZWZfX2RvY19ffSwKKyB7IklDRW5kIiwgICAgICAoUHlDRnVuY3Rpb24paWNpX0lDRW5kLCBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDRW5kX19kb2NfX30sCisgeyJJQ0VkaXRQcmVmZXJlbmNlcyIsICAoUHlDRnVuY3Rpb24paWNpX0lDRWRpdFByZWZlcmVuY2VzLCAgICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0VkaXRQcmVmZXJlbmNlc19fZG9jX199LAorIHsiSUNQYXJzZVVSTCIsIChQeUNGdW5jdGlvbilpY2lfSUNQYXJzZVVSTCwgICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ1BhcnNlVVJMX19kb2NfX30sCisgeyJJQ0xhdW5jaFVSTCIsICAgICAgICAoUHlDRnVuY3Rpb24paWNpX0lDTGF1bmNoVVJMLCAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNMYXVuY2hVUkxfX2RvY19ffSwKKyB7IklDTWFwRmlsZW5hbWUiLCAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNNYXBGaWxlbmFtZSwgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ01hcEZpbGVuYW1lX19kb2NfX30sCisgeyJJQ01hcFR5cGVDcmVhdG9yIiwgICAoUHlDRnVuY3Rpb24paWNpX0lDTWFwVHlwZUNyZWF0b3IsICAgICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ01hcFR5cGVDcmVhdG9yX19kb2NfX30sCisKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogLS0tLS0tLS0tLSAqLwpAQCAtMzU5LDYxICszNTksNjEgQEAKIHN0YXRpYyBpY2lvYmplY3QgKgogbmV3aWNpb2JqZWN0KE9TVHlwZSBjcmVhdG9yKQogewotCWljaW9iamVjdCAqc2VsZjsKLQlPU1N0YXR1cyBlcnI7Ci0JCi0Jc2VsZiA9IFB5T2JqZWN0X05FVyhpY2lvYmplY3QsICZJY2l0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ1N0YXJ0KCZzZWxmLT5pbnN0LCBjcmVhdG9yKSkgIT0gMCApIHsKLQkJKHZvaWQpUHlNYWNfRXJyb3IoZXJyKTsKLQkJUHlPYmplY3RfREVMKHNlbGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgaWNpb2JqZWN0ICpzZWxmOworICAgIE9TU3RhdHVzIGVycjsKKworICAgIHNlbGYgPSBQeU9iamVjdF9ORVcoaWNpb2JqZWN0LCAmSWNpdHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNTdGFydCgmc2VsZi0+aW5zdCwgY3JlYXRvcikpICE9IDAgKSB7CisgICAgICAgICh2b2lkKVB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIFB5T2JqZWN0X0RFTChzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiAKIHN0YXRpYyB2b2lkCiBpY2lfZGVhbGxvYyhpY2lvYmplY3QgKnNlbGYpCiB7Ci0JKHZvaWQpSUNTdG9wKHNlbGYtPmluc3QpOwotCVB5T2JqZWN0X0RFTChzZWxmKTsKKyAgICAodm9pZClJQ1N0b3Aoc2VsZi0+aW5zdCk7CisgICAgUHlPYmplY3RfREVMKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX2dldGF0dHIoaWNpb2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKGljaV9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChpY2lfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKLXN0YXRpYyBjaGFyIEljaXR5cGVfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIEljaXR5cGVfX2RvY19fW10gPQogIkludGVybmV0IENvbmZpZyBpbnN0YW5jZSIKIDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBJY2l0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkiaWNnbHVlLmljX2luc3RhbmNlIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGljaW9iamVjdCksCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWljaV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylpY2lfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYykwLAkJLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwJCS8qdHBfY2FsbCovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3N0ciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJpY2dsdWUuaWNfaW5zdGFuY2UiLCAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKGljaW9iamVjdCksICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpY2lfZGVhbGxvYywgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpaWNpX2dldGF0dHIsICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAKLQkvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotCTBMLDBMLDBMLDBMLAotCUljaXR5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCisgICAgLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgICAwTCwwTCwwTCwwTCwKKyAgICBJY2l0eXBlX19kb2NfXyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLwogfTsKIAogLyogRW5kIG9mIGNvZGUgZm9yIGljX2luc3RhbmNlIG9iamVjdHMgKi8KQEAgLTQyNyw1MiArNDI3LDUyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaWNfSUNTdGFydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGNyZWF0b3I7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvcikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoUHlPYmplY3QgKiluZXdpY2lvYmplY3QoY3JlYXRvcik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3aWNpb2JqZWN0KGNyZWF0b3IpOwogfQogCiAvKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgaWNfbWV0aG9kc1tdID0gewotCXsiSUNTdGFydCIsCShQeUNGdW5jdGlvbilpY19JQ1N0YXJ0LAlNRVRIX1ZBUkFSR1MsCWljX0lDU3RhcnRfX2RvY19ffSwKLSAKLQl7TlVMTCwJIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7IklDU3RhcnQiLCAgICAgICAgIChQeUNGdW5jdGlvbilpY19JQ1N0YXJ0LCAgICAgICAgTUVUSF9WQVJBUkdTLCAgIGljX0lDU3RhcnRfX2RvY19ffSwKKworICAgIHtOVUxMLCAgICAgICAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0gICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCiAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1vZHVsZSAoKm11c3QqIGJlIGNhbGxlZCBpbml0aWNnbHVlKSAqLwogCi1zdGF0aWMgY2hhciBpY2dsdWVfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9IAorc3RhdGljIGNoYXIgaWNnbHVlX21vZHVsZV9kb2N1bWVudGF0aW9uW10gPQogIkltcGxlbWVudHMgbG93LWxldmVsIEludGVybmV0IENvbmZpZyBpbnRlcmZhY2UiCiA7CiAKIHZvaWQKIGluaXRpY2dsdWUodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHRoZSBpY2dsdWUgbW9kdWxlIGlzIHJlbW92ZWQuIiwgMSkpCi0JCXJldHVybjsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CiAKLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KLQltID0gUHlfSW5pdE1vZHVsZTQoImljZ2x1ZSIsIGljX21ldGhvZHMsCi0JCWljZ2x1ZV9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKLQkJKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHRoZSBpY2dsdWUgbW9kdWxlIGlzIHJlbW92ZWQuIiwgMSkpCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JRXJyb3JPYmplY3QgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChFcnJvck9iamVjdCA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KSAhPSAwKQotCQlyZXR1cm47CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJpY2dsdWUiLCBpY19tZXRob2RzLAorICAgICAgICBpY2dsdWVfbW9kdWxlX2RvY3VtZW50YXRpb24sCisgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOwogCi0JLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KLQkKLQkvKiBDaGVjayBmb3IgZXJyb3JzICovCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIGljZ2x1ZSIpOworICAgIC8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgRXJyb3JPYmplY3QgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChFcnJvck9iamVjdCA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KSAhPSAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLworCisgICAgLyogQ2hlY2sgZm9yIGVycm9ycyAqLworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIG1vZHVsZSBpY2dsdWUiKTsKIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaWNuL19JY25tb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2ljbi9fSWNubW9kdWxlLmMKaW5kZXggODAyMDFhMi4uNjk2N2FlNCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvaWNuL19JY25tb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9pY24vX0ljbm1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yMywxNTYxICsyMywxNTYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldENJY29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDSWNvbkhhbmRsZSBfcnY7Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ljb25IYW5kbGUgX3J2OworICAgIFNJbnQxNiBpY29uSUQ7CiAjaWZuZGVmIEdldENJY29uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q0ljb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENJY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q0ljb24oaWNvbklEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDSWNvbihpY29uSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUGxvdENJY29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHRoZVJlY3Q7Ci0JQ0ljb25IYW5kbGUgdGhlSWNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCB0aGVSZWN0OworICAgIENJY29uSGFuZGxlIHRoZUljb247CiAjaWZuZGVmIFBsb3RDSWNvbgotCVB5TWFjX1BSRUNIRUNLKFBsb3RDSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGxvdENJY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGxvdENJY29uKCZ0aGVSZWN0LAotCSAgICAgICAgICB0aGVJY29uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQbG90Q0ljb24oJnRoZVJlY3QsCisgICAgICAgICAgICAgIHRoZUljb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fRGlzcG9zZUNJY29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDSWNvbkhhbmRsZSB0aGVJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDSWNvbkhhbmRsZSB0aGVJY29uOwogI2lmbmRlZiBEaXNwb3NlQ0ljb24KLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlQ0ljb24pOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDSWNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbikpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VDSWNvbih0aGVJY29uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlQ0ljb24odGhlSWNvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9HZXRJY29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCVNJbnQxNiBpY29uSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgU0ludDE2IGljb25JRDsKICNpZm5kZWYgR2V0SWNvbgotCVB5TWFjX1BSRUNIRUNLKEdldEljb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRJY29uKGljb25JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0SWNvbihpY29uSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUGxvdEljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgdGhlUmVjdDsKLQlIYW5kbGUgdGhlSWNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEhhbmRsZSB0aGVJY29uOwogI2lmbmRlZiBQbG90SWNvbgotCVB5TWFjX1BSRUNIRUNLKFBsb3RJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90SWNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbikpCi0JCXJldHVybiBOVUxMOwotCVBsb3RJY29uKCZ0aGVSZWN0LAotCSAgICAgICAgIHRoZUljb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBsb3RJY29uKCZ0aGVSZWN0LAorICAgICAgICAgICAgIHRoZUljb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUGxvdEljb25JRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCVNJbnQxNiB0aGVSZXNJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOworICAgIFNJbnQxNiB0aGVSZXNJRDsKICNpZm5kZWYgUGxvdEljb25JRAotCVB5TWFjX1BSRUNIRUNLKFBsb3RJY29uSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBsb3RJY29uSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlUmVzSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUGxvdEljb25JRCgmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgdGhlUmVzSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVJlc0lEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBsb3RJY29uSUQoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgIHRoZVJlc0lEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fTmV3SWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKICNpZm5kZWYgTmV3SWNvblN1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soTmV3SWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdJY29uU3VpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdJY29uU3VpdGUoJnRoZUljb25TdWl0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25TdWl0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdJY29uU3VpdGUoJnRoZUljb25TdWl0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25TdWl0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0FkZEljb25Ub1N1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSB0aGVJY29uRGF0YTsKLQlJY29uU3VpdGVSZWYgdGhlU3VpdGU7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSB0aGVJY29uRGF0YTsKKyAgICBJY29uU3VpdGVSZWYgdGhlU3VpdGU7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBBZGRJY29uVG9TdWl0ZQotCVB5TWFjX1BSRUNIRUNLKEFkZEljb25Ub1N1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRJY29uVG9TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25EYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZEljb25Ub1N1aXRlKHRoZUljb25EYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVTdWl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRJY29uVG9TdWl0ZSh0aGVJY29uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9HZXRJY29uRnJvbVN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSB0aGVJY29uRGF0YTsKLQlJY29uU3VpdGVSZWYgdGhlU3VpdGU7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSB0aGVJY29uRGF0YTsKKyAgICBJY29uU3VpdGVSZWYgdGhlU3VpdGU7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBHZXRJY29uRnJvbVN1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvbkZyb21TdWl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvbkZyb21TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVTdWl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJY29uRnJvbVN1aXRlKCZ0aGVJY29uRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdWl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvbkRhdGEpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEljb25Gcm9tU3VpdGUoJnRoZUljb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uRGF0YSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25TdWl0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOwotCVNJbnQxNiB0aGVSZXNJRDsKLQlJY29uU2VsZWN0b3JWYWx1ZSBzZWxlY3RvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOworICAgIFNJbnQxNiB0aGVSZXNJRDsKKyAgICBJY29uU2VsZWN0b3JWYWx1ZSBzZWxlY3RvcjsKICNpZm5kZWYgR2V0SWNvblN1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uU3VpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlUmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJY29uU3VpdGUoJnRoZUljb25TdWl0ZSwKLQkgICAgICAgICAgICAgICAgICAgIHRoZVJlc0lELAotCSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uU3VpdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvblN1aXRlKCZ0aGVJY29uU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVSZXNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblN1aXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fRGlzcG9zZUljb25TdWl0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOwotCUJvb2xlYW4gZGlzcG9zZURhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKKyAgICBCb29sZWFuIGRpc3Bvc2VEYXRhOwogI2lmbmRlZiBEaXNwb3NlSWNvblN1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZUljb25TdWl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZUljb25TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25TdWl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpc3Bvc2VEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERpc3Bvc2VJY29uU3VpdGUodGhlSWNvblN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2VEYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25TdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3Bvc2VEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERpc3Bvc2VJY29uU3VpdGUodGhlSWNvblN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2VEYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUGxvdEljb25TdWl0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOwogI2lmbmRlZiBQbG90SWNvblN1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25TdWl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25TdWl0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90SWNvblN1aXRlKCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVJY29uU3VpdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBsb3RJY29uU3VpdGUoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25TdWl0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0xvYWRJY29uQ2FjaGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmVjdCB0aGVSZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKLQlJY29uQ2FjaGVSZWYgdGhlSWNvbkNhY2hlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgdGhlUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CisgICAgSWNvbkNhY2hlUmVmIHRoZUljb25DYWNoZTsKICNpZm5kZWYgTG9hZEljb25DYWNoZQotCVB5TWFjX1BSRUNIRUNLKExvYWRJY29uQ2FjaGUpOworICAgIFB5TWFjX1BSRUNIRUNLKExvYWRJY29uQ2FjaGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uQ2FjaGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTG9hZEljb25DYWNoZSgmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgdGhlSWNvbkNhY2hlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25DYWNoZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMb2FkSWNvbkNhY2hlKCZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uQ2FjaGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9HZXRMYWJlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgbGFiZWxOdW1iZXI7Ci0JUkdCQ29sb3IgbGFiZWxDb2xvcjsKLQlTdHIyNTUgbGFiZWxTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGxhYmVsTnVtYmVyOworICAgIFJHQkNvbG9yIGxhYmVsQ29sb3I7CisgICAgU3RyMjU1IGxhYmVsU3RyaW5nOwogI2lmbmRlZiBHZXRMYWJlbAotCVB5TWFjX1BSRUNIRUNLKEdldExhYmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRMYWJlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGFiZWxOdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbGFiZWxTdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TGFiZWwobGFiZWxOdW1iZXIsCi0JICAgICAgICAgICAgICAgICZsYWJlbENvbG9yLAotCSAgICAgICAgICAgICAgICBsYWJlbFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmxhYmVsQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsYWJlbE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBsYWJlbFN0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRMYWJlbChsYWJlbE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgJmxhYmVsQ29sb3IsCisgICAgICAgICAgICAgICAgICAgIGxhYmVsU3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbGFiZWxDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1B0SW5JY29uSUQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHRlc3RQdDsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCVNJbnQxNiBpY29uSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHRlc3RQdDsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIFNJbnQxNiBpY29uSUQ7CiAjaWZuZGVmIFB0SW5JY29uSUQKLQlQeU1hY19QUkVDSEVDSyhQdEluSWNvbklEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdEluSWNvbklEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGVzdFB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmljb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFB0SW5JY29uSUQodGVzdFB0LAotCSAgICAgICAgICAgICAgICAgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICBpY29uSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGVzdFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFB0SW5JY29uSUQodGVzdFB0LAorICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICBpY29uSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QdEluSWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCB0ZXN0UHQ7Ci0JUmVjdCBpY29uUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCB0ZXN0UHQ7CisgICAgUmVjdCBpY29uUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOwogI2lmbmRlZiBQdEluSWNvblN1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soUHRJbkljb25TdWl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHRJbkljb25TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25TdWl0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFB0SW5JY29uU3VpdGUodGVzdFB0LAotCSAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICB0aGVJY29uU3VpdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJbkljb25TdWl0ZSh0ZXN0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25TdWl0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1JlY3RJbkljb25JRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCB0ZXN0UmVjdDsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCVNJbnQxNiBpY29uSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3QgdGVzdFJlY3Q7CisgICAgUmVjdCBpY29uUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBTSW50MTYgaWNvbklEOwogI2lmbmRlZiBSZWN0SW5JY29uSUQKLQlQeU1hY19QUkVDSEVDSyhSZWN0SW5JY29uSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlY3RJbkljb25JRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGVzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVjdEluSWNvbklEKCZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgaWNvbklEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGVzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUmVjdEluSWNvbklEKCZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWNvbklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVjdEluSWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZWN0IHRlc3RSZWN0OwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmVjdCB0ZXN0UmVjdDsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CiAjaWZuZGVmIFJlY3RJbkljb25TdWl0ZQotCVB5TWFjX1BSRUNIRUNLKFJlY3RJbkljb25TdWl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGVzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25TdWl0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJlY3RJbkljb25TdWl0ZSgmdGVzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25TdWl0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUmVjdEluSWNvblN1aXRlKCZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fSWNvbklEVG9SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIHRoZVJnbjsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCVNJbnQxNiBpY29uSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmduSGFuZGxlIHRoZVJnbjsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIFNJbnQxNiBpY29uSUQ7CiAjaWZuZGVmIEljb25JRFRvUmduCi0JUHlNYWNfUFJFQ0hFQ0soSWNvbklEVG9SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEljb25JRFRvUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlUmduLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmljb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJY29uSURUb1Jnbih0aGVSZ24sCi0JICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgIGljb25JRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEljb25JRFRvUmduKHRoZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWNvbklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fSWNvblN1aXRlVG9SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIHRoZVJnbjsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmduSGFuZGxlIHRoZVJnbjsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CiAjaWZuZGVmIEljb25TdWl0ZVRvUmduCi0JUHlNYWNfUFJFQ0hFQ0soSWNvblN1aXRlVG9SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEljb25TdWl0ZVRvUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEljb25TdWl0ZVRvUmduKHRoZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25TdWl0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJY29uU3VpdGVUb1Jnbih0aGVSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25TdWl0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1NldFN1aXRlTGFiZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblN1aXRlUmVmIHRoZVN1aXRlOwotCVNJbnQxNiB0aGVMYWJlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uU3VpdGVSZWYgdGhlU3VpdGU7CisgICAgU0ludDE2IHRoZUxhYmVsOwogI2lmbmRlZiBTZXRTdWl0ZUxhYmVsCi0JUHlNYWNfUFJFQ0hFQ0soU2V0U3VpdGVMYWJlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0U3VpdGVMYWJlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlTGFiZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0U3VpdGVMYWJlbCh0aGVTdWl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUxhYmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFN1aXRlTGFiZWwodGhlU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGFiZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9HZXRTdWl0ZUxhYmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OwotCUljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKKyAgICBJY29uU3VpdGVSZWYgdGhlU3VpdGU7CiAjaWZuZGVmIEdldFN1aXRlTGFiZWwKLQlQeU1hY19QUkVDSEVDSyhHZXRTdWl0ZUxhYmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRTdWl0ZUxhYmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVTdWl0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFN1aXRlTGFiZWwodGhlU3VpdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVTdWl0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFN1aXRlTGFiZWwodGhlU3VpdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvbkhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUhhbmRsZSB0aGVJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgdGhlUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CisgICAgSGFuZGxlIHRoZUljb247CiAjaWZuZGVmIFBsb3RJY29uSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBsb3RJY29uSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90SWNvbkhhbmRsZSgmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBsb3RJY29uSGFuZGxlKCZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUGxvdFNJQ05IYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmVjdCB0aGVSZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKLQlIYW5kbGUgdGhlU0lDTjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOworICAgIEhhbmRsZSB0aGVTSUNOOwogI2lmbmRlZiBQbG90U0lDTkhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFBsb3RTSUNOSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90U0lDTkhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVNJQ04pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUGxvdFNJQ05IYW5kbGUoJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgIHRoZVNJQ04pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU0lDTikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBQbG90U0lDTkhhbmRsZSgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU0lDTik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1Bsb3RDSWNvbkhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUNJY29uSGFuZGxlIHRoZUNJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgdGhlUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CisgICAgQ0ljb25IYW5kbGUgdGhlQ0ljb247CiAjaWZuZGVmIFBsb3RDSWNvbkhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFBsb3RDSWNvbkhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGxvdENJY29uSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ0ljb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUGxvdENJY29uSGFuZGxlKCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgICB0aGVDSWNvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDSWNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBQbG90Q0ljb25IYW5kbGUoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUNJY29uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fSWNvblJlZlRvSWNvbkZhbWlseShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uUmVmIHRoZUljb25SZWY7Ci0JSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOworICAgIEljb25TZWxlY3RvclZhbHVlIHdoaWNoSWNvbnM7CisgICAgSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwogI2lmbmRlZiBJY29uUmVmVG9JY29uRmFtaWx5Ci0JUHlNYWNfUFJFQ0hFQ0soSWNvblJlZlRvSWNvbkZhbWlseSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvblJlZlRvSWNvbkZhbWlseSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEljb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEljb25SZWZUb0ljb25GYW1pbHkodGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmFtaWx5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvbkZhbWlseSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJY29ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJY29uUmVmVG9JY29uRmFtaWx5KHRoZUljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJY29ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZhbWlseSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25GYW1pbHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9JY29uRmFtaWx5VG9JY29uU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwotCUljb25TZWxlY3RvclZhbHVlIHdoaWNoSWNvbnM7Ci0JSWNvblN1aXRlUmVmIGljb25TdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKKyAgICBJY29uU3VpdGVSZWYgaWNvblN1aXRlOwogI2lmbmRlZiBJY29uRmFtaWx5VG9JY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhJY29uRmFtaWx5VG9JY29uU3VpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEljb25GYW1pbHlUb0ljb25TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEljb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEljb25GYW1pbHlUb0ljb25TdWl0ZShpY29uRmFtaWx5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJY29ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uU3VpdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uU3VpdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSWNvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSWNvbkZhbWlseVRvSWNvblN1aXRlKGljb25GYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TdWl0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25TdWl0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0ljb25TdWl0ZVRvSWNvbkZhbWlseShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uU3VpdGVSZWYgaWNvblN1aXRlOwotCUljb25TZWxlY3RvclZhbHVlIHdoaWNoSWNvbnM7Ci0JSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25TdWl0ZVJlZiBpY29uU3VpdGU7CisgICAgSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKKyAgICBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CiAjaWZuZGVmIEljb25TdWl0ZVRvSWNvbkZhbWlseQotCVB5TWFjX1BSRUNIRUNLKEljb25TdWl0ZVRvSWNvbkZhbWlseSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvblN1aXRlVG9JY29uRmFtaWx5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvblN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJY29ucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJY29uU3VpdGVUb0ljb25GYW1pbHkoaWNvblN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJY29ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmFtaWx5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvbkZhbWlseSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEljb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEljb25TdWl0ZVRvSWNvbkZhbWlseShpY29uU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fU2V0SWNvbkZhbWlseURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwotCU9TVHlwZSBpY29uVHlwZTsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgT1NUeXBlIGljb25UeXBlOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBTZXRJY29uRmFtaWx5RGF0YQotCVB5TWFjX1BSRUNIRUNLKFNldEljb25GYW1pbHlEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRJY29uRmFtaWx5RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0SWNvbkZhbWlseURhdGEoaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRJY29uRmFtaWx5RGF0YShpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25GYW1pbHlEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKLQlPU1R5cGUgaWNvblR5cGU7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OworICAgIE9TVHlwZSBpY29uVHlwZTsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgR2V0SWNvbkZhbWlseURhdGEKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uRmFtaWx5RGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvbkZhbWlseURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25GYW1pbHlEYXRhKGljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvbkZhbWlseURhdGEoaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9HZXRJY29uUmVmT3duZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgdGhlSWNvblJlZjsKLQlVSW50MTYgb3duZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKKyAgICBVSW50MTYgb3duZXJzOwogI2lmbmRlZiBHZXRJY29uUmVmT3duZXJzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZk93bmVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZk93bmVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJY29uUmVmT3duZXJzKHRoZUljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm93bmVycyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3duZXJzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJY29uUmVmT3duZXJzKHRoZUljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm93bmVycyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fQWNxdWlyZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgQWNxdWlyZUljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhBY3F1aXJlSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWNxdWlyZUljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWNxdWlyZUljb25SZWYodGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWNxdWlyZUljb25SZWYodGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1JlbGVhc2VJY29uUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIFJlbGVhc2VJY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soUmVsZWFzZUljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbGVhc2VJY29uUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbGVhc2VJY29uUmVmKHRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbGVhc2VJY29uUmVmKHRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9HZXRJY29uUmVmRnJvbUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JSWNvblJlZiB0aGVJY29uUmVmOwotCVNJbnQxNiB0aGVMYWJlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CisgICAgU0ludDE2IHRoZUxhYmVsOwogI2lmbmRlZiBHZXRJY29uUmVmRnJvbUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uUmVmRnJvbUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25SZWZGcm9tRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SWNvblJlZkZyb21GaWxlKCZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTGFiZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEljb25SZWZGcm9tRmlsZSgmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUxhYmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGFiZWwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9HZXRJY29uUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiB2UmVmTnVtOwotCU9TVHlwZSBjcmVhdG9yOwotCU9TVHlwZSBpY29uVHlwZTsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IHZSZWZOdW07CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGljb25UeXBlOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgR2V0SWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKEdldEljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SWNvblJlZih2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJY29uUmVmKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9HZXRJY29uUmVmRnJvbUZvbGRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgdlJlZk51bTsKLQlTSW50MzIgcGFyZW50Rm9sZGVySUQ7Ci0JU0ludDMyIGZvbGRlcklEOwotCVNJbnQ4IGF0dHJpYnV0ZXM7Ci0JU0ludDggYWNjZXNzUHJpdmlsZWdlczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IHZSZWZOdW07CisgICAgU0ludDMyIHBhcmVudEZvbGRlcklEOworICAgIFNJbnQzMiBmb2xkZXJJRDsKKyAgICBTSW50OCBhdHRyaWJ1dGVzOworICAgIFNJbnQ4IGFjY2Vzc1ByaXZpbGVnZXM7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBHZXRJY29uUmVmRnJvbUZvbGRlcgotCVB5TWFjX1BSRUNIRUNLKEdldEljb25SZWZGcm9tRm9sZGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uUmVmRnJvbUZvbGRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGxiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFyZW50Rm9sZGVySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb2xkZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY2Nlc3NQcml2aWxlZ2VzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25SZWZGcm9tRm9sZGVyKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEZvbGRlcklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzUHJpdmlsZWdlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyZW50Rm9sZGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb2xkZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2Nlc3NQcml2aWxlZ2VzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEljb25SZWZGcm9tRm9sZGVyKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEZvbGRlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzUHJpdmlsZWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGljb25UeXBlOwotCUljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGljb25UeXBlOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmFtaWx5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmFtaWx5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHkoY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseShjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVnaXN0ZXJJY29uUmVmRnJvbVJlc291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBjcmVhdG9yOwotCU9TVHlwZSBpY29uVHlwZTsKLQlGU1NwZWMgcmVzb3VyY2VGaWxlOwotCVNJbnQxNiByZXNvdXJjZUlEOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgRlNTcGVjIHJlc291cmNlRmlsZTsKKyAgICBTSW50MTYgcmVzb3VyY2VJRDsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIFJlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmcmVzb3VyY2VGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UoY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmcmVzb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UoY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWdpc3Rlckljb25SZWZGcm9tRlNSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGljb25UeXBlOwotCUZTUmVmIGljb25GaWxlOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgRlNSZWYgaWNvbkZpbGU7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBSZWdpc3Rlckljb25SZWZGcm9tRlNSZWYKLQlQeU1hY19QUkVDSEVDSyhSZWdpc3Rlckljb25SZWZGcm9tRlNSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpY29uRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWdpc3Rlckljb25SZWZGcm9tRlNSZWYoY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpY29uRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWdpc3Rlckljb25SZWZGcm9tRlNSZWYoY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fVW5yZWdpc3Rlckljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGljb25UeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBpY29uVHlwZTsKICNpZm5kZWYgVW5yZWdpc3Rlckljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhVbnJlZ2lzdGVySWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVW5yZWdpc3Rlckljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVucmVnaXN0ZXJJY29uUmVmKGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVW5yZWdpc3Rlckljb25SZWYoY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9VcGRhdGVJY29uUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIFVwZGF0ZUljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVJY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVJY29uUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVwZGF0ZUljb25SZWYodGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlSWNvblJlZih0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fT3ZlcnJpZGVJY29uUmVmRnJvbVJlc291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgdGhlSWNvblJlZjsKLQlGU1NwZWMgcmVzb3VyY2VGaWxlOwotCVNJbnQxNiByZXNvdXJjZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKKyAgICBGU1NwZWMgcmVzb3VyY2VGaWxlOworICAgIFNJbnQxNiByZXNvdXJjZUlEOwogI2lmbmRlZiBPdmVycmlkZUljb25SZWZGcm9tUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhPdmVycmlkZUljb25SZWZGcm9tUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmcmVzb3VyY2VGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPdmVycmlkZUljb25SZWZGcm9tUmVzb3VyY2UodGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUlEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmcmVzb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPdmVycmlkZUljb25SZWZGcm9tUmVzb3VyY2UodGhlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUlEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fT3ZlcnJpZGVJY29uUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgb2xkSWNvblJlZjsKLQlJY29uUmVmIG5ld0ljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiBvbGRJY29uUmVmOworICAgIEljb25SZWYgbmV3SWNvblJlZjsKICNpZm5kZWYgT3ZlcnJpZGVJY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soT3ZlcnJpZGVJY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPdmVycmlkZUljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb2xkSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZuZXdJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE92ZXJyaWRlSWNvblJlZihvbGRJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgbmV3SWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb2xkSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZuZXdJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE92ZXJyaWRlSWNvblJlZihvbGRJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1JlbW92ZUljb25SZWZPdmVycmlkZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBSZW1vdmVJY29uUmVmT3ZlcnJpZGUKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVJY29uUmVmT3ZlcnJpZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZUljb25SZWZPdmVycmlkZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVJY29uUmVmT3ZlcnJpZGUodGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlSWNvblJlZk92ZXJyaWRlKHRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9Db21wb3NpdGVJY29uUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgYmFja2dyb3VuZEljb25SZWY7Ci0JSWNvblJlZiBmb3JlZ3JvdW5kSWNvblJlZjsKLQlJY29uUmVmIGNvbXBvc2l0ZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiBiYWNrZ3JvdW5kSWNvblJlZjsKKyAgICBJY29uUmVmIGZvcmVncm91bmRJY29uUmVmOworICAgIEljb25SZWYgY29tcG9zaXRlSWNvblJlZjsKICNpZm5kZWYgQ29tcG9zaXRlSWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKENvbXBvc2l0ZUljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBvc2l0ZUljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYmFja2dyb3VuZEljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZm9yZWdyb3VuZEljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29tcG9zaXRlSWNvblJlZihiYWNrZ3JvdW5kSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9zaXRlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGNvbXBvc2l0ZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmJhY2tncm91bmRJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmZvcmVncm91bmRJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbXBvc2l0ZUljb25SZWYoYmFja2dyb3VuZEljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWdyb3VuZEljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBvc2l0ZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjb21wb3NpdGVJY29uUmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fSXNJY29uUmVmQ29tcG9zaXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgY29tcG9zaXRlSWNvblJlZjsKLQlJY29uUmVmIGJhY2tncm91bmRJY29uUmVmOwotCUljb25SZWYgZm9yZWdyb3VuZEljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiBjb21wb3NpdGVJY29uUmVmOworICAgIEljb25SZWYgYmFja2dyb3VuZEljb25SZWY7CisgICAgSWNvblJlZiBmb3JlZ3JvdW5kSWNvblJlZjsKICNpZm5kZWYgSXNJY29uUmVmQ29tcG9zaXRlCi0JUHlNYWNfUFJFQ0hFQ0soSXNJY29uUmVmQ29tcG9zaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0ljb25SZWZDb21wb3NpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXBvc2l0ZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSXNJY29uUmVmQ29tcG9zaXRlKGNvbXBvc2l0ZUljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFja2dyb3VuZEljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9yZWdyb3VuZEljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGJhY2tncm91bmRJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGZvcmVncm91bmRJY29uUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9zaXRlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJc0ljb25SZWZDb21wb3NpdGUoY29tcG9zaXRlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWNrZ3JvdW5kSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JlZ3JvdW5kSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYmFja2dyb3VuZEljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZm9yZWdyb3VuZEljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9Jc1ZhbGlkSWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIElzVmFsaWRJY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZEljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKElzVmFsaWRJY29uUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNWYWxpZEljb25SZWYodGhlSWNvblJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1ZhbGlkSWNvblJlZih0aGVJY29uUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUGxvdEljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmVjdCB0aGVSZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKLQlJY29uU2VydmljZXNVc2FnZUZsYWdzIHRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3M7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgdGhlUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CisgICAgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUGxvdEljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhQbG90SWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUGxvdEljb25SZWYoJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgIHRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBsb3RJY29uUmVmKCZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUHRJbkljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHRlc3RQdDsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHRlc3RQdDsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIFB0SW5JY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soUHRJbkljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFB0SW5JY29uUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJbkljb25SZWYoJnRlc3RQdCwKLQkgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICB0aGVJY29uUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGVzdFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFB0SW5JY29uUmVmKCZ0ZXN0UHQsCisgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1JlY3RJbkljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJlY3QgdGVzdFJlY3Q7Ci0JUmVjdCBpY29uUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3M7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHRlc3RSZWN0OworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyBpY29uU2VydmljZXNVc2FnZUZsYWdzOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUmVjdEluSWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKFJlY3RJbkljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlY3RJbkljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGVzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVjdEluSWNvblJlZigmdGVzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICB0aGVJY29uUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VydmljZXNVc2FnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWN0SW5JY29uUmVmKCZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9JY29uUmVmVG9SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIHRoZVJnbjsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmduSGFuZGxlIHRoZVJnbjsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIEljb25SZWZUb1JnbgotCVB5TWFjX1BSRUNIRUNLKEljb25SZWZUb1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvblJlZlRvUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEljb25SZWZUb1Jnbih0aGVSZ24sCi0JICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICB0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJY29uUmVmVG9SZ24odGhlUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICBpY29uU2VydmljZXNVc2FnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25TaXplc0Zyb21JY29uUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25TZWxlY3RvclZhbHVlIGljb25TZWxlY3RvcklucHV0OwotCUljb25TZWxlY3RvclZhbHVlIGljb25TZWxlY3Rvck91dHB1dFB0cjsKLQlJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3M7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25TZWxlY3RvclZhbHVlIGljb25TZWxlY3RvcklucHV0OworICAgIEljb25TZWxlY3RvclZhbHVlIGljb25TZWxlY3Rvck91dHB1dFB0cjsKKyAgICBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3M7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBHZXRJY29uU2l6ZXNGcm9tSWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKEdldEljb25TaXplc0Zyb21JY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uU2l6ZXNGcm9tSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmljb25TZWxlY3RvcklucHV0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25TaXplc0Zyb21JY29uUmVmKGljb25TZWxlY3RvcklucHV0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblNlbGVjdG9yT3V0cHV0UHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBpY29uU2VsZWN0b3JPdXRwdXRQdHIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblNlbGVjdG9ySW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VydmljZXNVc2FnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvblNpemVzRnJvbUljb25SZWYoaWNvblNlbGVjdG9ySW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VsZWN0b3JPdXRwdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGljb25TZWxlY3Rvck91dHB1dFB0cik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0ZsdXNoSWNvblJlZnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGljb25UeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBpY29uVHlwZTsKICNpZm5kZWYgRmx1c2hJY29uUmVmcwotCVB5TWFjX1BSRUNIRUNLKEZsdXNoSWNvblJlZnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsdXNoSWNvblJlZnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZsdXNoSWNvblJlZnMoY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZsdXNoSWNvblJlZnMoY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0ZsdXNoSWNvblJlZnNCeVZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgdlJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgdlJlZk51bTsKICNpZm5kZWYgRmx1c2hJY29uUmVmc0J5Vm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soRmx1c2hJY29uUmVmc0J5Vm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbHVzaEljb25SZWZzQnlWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZsdXNoSWNvblJlZnNCeVZvbHVtZSh2UmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmx1c2hJY29uUmVmc0J5Vm9sdW1lKHZSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9TZXRDdXN0b21JY29uc0VuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IHZSZWZOdW07Ci0JQm9vbGVhbiBlbmFibGVDdXN0b21JY29uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgdlJlZk51bTsKKyAgICBCb29sZWFuIGVuYWJsZUN1c3RvbUljb25zOwogI2lmbmRlZiBTZXRDdXN0b21JY29uc0VuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhTZXRDdXN0b21JY29uc0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEN1c3RvbUljb25zRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlQ3VzdG9tSWNvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q3VzdG9tSWNvbnNFbmFibGVkKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVDdXN0b21JY29ucyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZUN1c3RvbUljb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldEN1c3RvbUljb25zRW5hYmxlZCh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQ3VzdG9tSWNvbnMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9HZXRDdXN0b21JY29uc0VuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IHZSZWZOdW07Ci0JQm9vbGVhbiBjdXN0b21JY29uc0VuYWJsZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IHZSZWZOdW07CisgICAgQm9vbGVhbiBjdXN0b21JY29uc0VuYWJsZWQ7CiAjaWZuZGVmIEdldEN1c3RvbUljb25zRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKEdldEN1c3RvbUljb25zRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q3VzdG9tSWNvbnNFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDdXN0b21JY29uc0VuYWJsZWQodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXN0b21JY29uc0VuYWJsZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUljb25zRW5hYmxlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEN1c3RvbUljb25zRW5hYmxlZCh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1c3RvbUljb25zRW5hYmxlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tSWNvbnNFbmFibGVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fSXNJY29uUmVmTWFza0VtcHR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlJY29uUmVmIGljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEljb25SZWYgaWNvblJlZjsKICNpZm5kZWYgSXNJY29uUmVmTWFza0VtcHR5Ci0JUHlNYWNfUFJFQ0hFQ0soSXNJY29uUmVmTWFza0VtcHR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0ljb25SZWZNYXNrRW1wdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0ljb25SZWZNYXNrRW1wdHkoaWNvblJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0ljb25SZWZNYXNrRW1wdHkoaWNvblJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWZWYXJpYW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJY29uUmVmIF9ydjsKLQlJY29uUmVmIGluSWNvblJlZjsKLQlPU1R5cGUgaW5WYXJpYW50OwotCUljb25UcmFuc2Zvcm1UeXBlIG91dFRyYW5zZm9ybTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSWNvblJlZiBfcnY7CisgICAgSWNvblJlZiBpbkljb25SZWY7CisgICAgT1NUeXBlIGluVmFyaWFudDsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSBvdXRUcmFuc2Zvcm07CiAjaWZuZGVmIEdldEljb25SZWZWYXJpYW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZlZhcmlhbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25SZWZWYXJpYW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5WYXJpYW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0SWNvblJlZlZhcmlhbnQoaW5JY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluVmFyaWFudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VHJhbnNmb3JtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0VHJhbnNmb3JtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVmFyaWFudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEljb25SZWZWYXJpYW50KGluSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZhcmlhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRyYW5zZm9ybSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFRyYW5zZm9ybSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1JlZ2lzdGVySWNvblJlZkZyb21JY29uRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7Ci0JRlNTcGVjIGljb25GaWxlOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgRlNTcGVjIGljb25GaWxlOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlCi0JUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmlsZShjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZpY29uRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUoY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVhZEljb25GaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBpY29uRmlsZTsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGljb25GaWxlOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKICNpZm5kZWYgUmVhZEljb25GaWxlCi0JUHlNYWNfUFJFQ0hFQ0soUmVhZEljb25GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWFkSWNvbkZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZpY29uRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWFkSWNvbkZpbGUoJmljb25GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlYWRJY29uRmlsZSgmaWNvbkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZhbWlseSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25GYW1pbHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWFkSWNvbkZyb21GU1JlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiByZWY7Ci0JSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIHJlZjsKKyAgICBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CiAjaWZuZGVmIFJlYWRJY29uRnJvbUZTUmVmCi0JUHlNYWNfUFJFQ0hFQ0soUmVhZEljb25Gcm9tRlNSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlYWRJY29uRnJvbUZTUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVhZEljb25Gcm9tRlNSZWYoJnJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlYWRJY29uRnJvbUZTUmVmKCZyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmFtaWx5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvbkZhbWlseSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1dyaXRlSWNvbkZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwotCUZTU3BlYyBpY29uRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgRlNTcGVjIGljb25GaWxlOwogI2lmbmRlZiBXcml0ZUljb25GaWxlCi0JUHlNYWNfUFJFQ0hFQ0soV3JpdGVJY29uRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soV3JpdGVJY29uRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZpY29uRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBXcml0ZUljb25GaWxlKGljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgJmljb25GaWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZpY29uRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBXcml0ZUljb25GaWxlKGljb25GYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GaWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgSWNuX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkdldENJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRDSWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGljb25JRCkgLT4gKENJY29uSGFuZGxlIF9ydikiKX0sCi0JeyJQbG90Q0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RDSWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBDSWNvbkhhbmRsZSB0aGVJY29uKSAtPiBOb25lIil9LAotCXsiRGlzcG9zZUNJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9EaXNwb3NlQ0ljb24sIDEsCi0JIFB5RG9jX1NUUigiKENJY29uSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCi0JeyJHZXRJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaWNvbklEKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJQbG90SWNvbiIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb24sIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCi0JeyJQbG90SWNvbklEIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbklELCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIFNJbnQxNiB0aGVSZXNJRCkgLT4gTm9uZSIpfSwKLQl7Ik5ld0ljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fTmV3SWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSIpfSwKLQl7IkFkZEljb25Ub1N1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9BZGRJY29uVG9TdWl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZUljb25EYXRhLCBJY29uU3VpdGVSZWYgdGhlU3VpdGUsIFJlc1R5cGUgdGhlVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkdldEljb25Gcm9tU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25Gcm9tU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25TdWl0ZVJlZiB0aGVTdWl0ZSwgUmVzVHlwZSB0aGVUeXBlKSAtPiAoSGFuZGxlIHRoZUljb25EYXRhKSIpfSwKLQl7IkdldEljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdGhlUmVzSUQsIEljb25TZWxlY3RvclZhbHVlIHNlbGVjdG9yKSAtPiAoSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkiKX0sCi0JeyJEaXNwb3NlSWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9EaXNwb3NlSWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlLCBCb29sZWFuIGRpc3Bvc2VEYXRhKSAtPiBOb25lIil9LAotCXsiUGxvdEljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb25TdWl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSAtPiBOb25lIil9LAotCXsiTG9hZEljb25DYWNoZSIsIChQeUNGdW5jdGlvbilJY25fTG9hZEljb25DYWNoZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBJY29uQ2FjaGVSZWYgdGhlSWNvbkNhY2hlKSAtPiBOb25lIil9LAotCXsiR2V0TGFiZWwiLCAoUHlDRnVuY3Rpb24pSWNuX0dldExhYmVsLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgbGFiZWxOdW1iZXIsIFN0cjI1NSBsYWJlbFN0cmluZykgLT4gKFJHQkNvbG9yIGxhYmVsQ29sb3IpIil9LAotCXsiUHRJbkljb25JRCIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25JRCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFB0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgU0ludDE2IGljb25JRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlB0SW5JY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX1B0SW5JY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJSZWN0SW5JY29uSUQiLCAoUHlDRnVuY3Rpb24pSWNuX1JlY3RJbkljb25JRCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0ZXN0UmVjdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIFNJbnQxNiBpY29uSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJSZWN0SW5JY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX1JlY3RJbkljb25TdWl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0ZXN0UmVjdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJY29uSURUb1JnbiIsIChQeUNGdW5jdGlvbilJY25fSWNvbklEVG9SZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBTSW50MTYgaWNvbklEKSAtPiBOb25lIil9LAotCXsiSWNvblN1aXRlVG9SZ24iLCAoUHlDRnVuY3Rpb24pSWNuX0ljb25TdWl0ZVRvUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdGhlUmduLCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gTm9uZSIpfSwKLQl7IlNldFN1aXRlTGFiZWwiLCAoUHlDRnVuY3Rpb24pSWNuX1NldFN1aXRlTGFiZWwsIDEsCi0JIFB5RG9jX1NUUigiKEljb25TdWl0ZVJlZiB0aGVTdWl0ZSwgU0ludDE2IHRoZUxhYmVsKSAtPiBOb25lIil9LAotCXsiR2V0U3VpdGVMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fR2V0U3VpdGVMYWJlbCwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJQbG90SWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb25IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCi0JeyJQbG90U0lDTkhhbmRsZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdFNJQ05IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgSGFuZGxlIHRoZVNJQ04pIC0+IE5vbmUiKX0sCi0JeyJQbG90Q0ljb25IYW5kbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RDSWNvbkhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBDSWNvbkhhbmRsZSB0aGVDSWNvbikgLT4gTm9uZSIpfSwKLQl7Ikljb25SZWZUb0ljb25GYW1pbHkiLCAoUHlDRnVuY3Rpb24pSWNuX0ljb25SZWZUb0ljb25GYW1pbHksIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZiwgSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29ucykgLT4gKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkiKX0sCi0JeyJJY29uRmFtaWx5VG9JY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0ljb25GYW1pbHlUb0ljb25TdWl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5LCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvblN1aXRlUmVmIGljb25TdWl0ZSkiKX0sCi0JeyJJY29uU3VpdGVUb0ljb25GYW1pbHkiLCAoUHlDRnVuY3Rpb24pSWNuX0ljb25TdWl0ZVRvSWNvbkZhbWlseSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIGljb25TdWl0ZSwgSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29ucykgLT4gKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkiKX0sCi0JeyJTZXRJY29uRmFtaWx5RGF0YSIsIChQeUNGdW5jdGlvbilJY25fU2V0SWNvbkZhbWlseURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSwgT1NUeXBlIGljb25UeXBlLCBIYW5kbGUgaCkgLT4gTm9uZSIpfSwKLQl7IkdldEljb25GYW1pbHlEYXRhIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uRmFtaWx5RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5LCBPU1R5cGUgaWNvblR5cGUsIEhhbmRsZSBoKSAtPiBOb25lIil9LAotCXsiR2V0SWNvblJlZk93bmVycyIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblJlZk93bmVycywgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoVUludDE2IG93bmVycykiKX0sCi0JeyJBY3F1aXJlSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fQWNxdWlyZUljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKLQl7IlJlbGVhc2VJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWxlYXNlSWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiBOb25lIil9LAotCXsiR2V0SWNvblJlZkZyb21GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmRnJvbUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVGaWxlKSAtPiAoSWNvblJlZiB0aGVJY29uUmVmLCBTSW50MTYgdGhlTGFiZWwpIil9LAotCXsiR2V0SWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0sIE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAotCXsiR2V0SWNvblJlZkZyb21Gb2xkZXIiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZGcm9tRm9sZGVyLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdlJlZk51bSwgU0ludDMyIHBhcmVudEZvbGRlcklELCBTSW50MzIgZm9sZGVySUQsIFNJbnQ4IGF0dHJpYnV0ZXMsIFNJbnQ4IGFjY2Vzc1ByaXZpbGVnZXMpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAotCXsiUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHkiLCAoUHlDRnVuY3Rpb24pSWNuX1JlZ2lzdGVySWNvblJlZkZyb21JY29uRmFtaWx5LCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGljb25UeXBlLCBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHkpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAotCXsiUmVnaXN0ZXJJY29uUmVmRnJvbVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTU3BlYyByZXNvdXJjZUZpbGUsIFNJbnQxNiByZXNvdXJjZUlEKSAtPiAoSWNvblJlZiB0aGVJY29uUmVmKSIpfSwKLQl7IlJlZ2lzdGVySWNvblJlZkZyb21GU1JlZiIsIChQeUNGdW5jdGlvbilJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUZTUmVmLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGljb25UeXBlLCBGU1JlZiBpY29uRmlsZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJVbnJlZ2lzdGVySWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fVW5yZWdpc3Rlckljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9VcGRhdGVJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCi0JeyJPdmVycmlkZUljb25SZWZGcm9tUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pSWNuX092ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmLCBGU1NwZWMgcmVzb3VyY2VGaWxlLCBTSW50MTYgcmVzb3VyY2VJRCkgLT4gTm9uZSIpfSwKLQl7Ik92ZXJyaWRlSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fT3ZlcnJpZGVJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIG9sZEljb25SZWYsIEljb25SZWYgbmV3SWNvblJlZikgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZUljb25SZWZPdmVycmlkZSIsIChQeUNGdW5jdGlvbilJY25fUmVtb3ZlSWNvblJlZk92ZXJyaWRlLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCi0JeyJDb21wb3NpdGVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9Db21wb3NpdGVJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIGJhY2tncm91bmRJY29uUmVmLCBJY29uUmVmIGZvcmVncm91bmRJY29uUmVmKSAtPiAoSWNvblJlZiBjb21wb3NpdGVJY29uUmVmKSIpfSwKLQl7IklzSWNvblJlZkNvbXBvc2l0ZSIsIChQeUNGdW5jdGlvbilJY25fSXNJY29uUmVmQ29tcG9zaXRlLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIGNvbXBvc2l0ZUljb25SZWYpIC0+IChJY29uUmVmIGJhY2tncm91bmRJY29uUmVmLCBJY29uUmVmIGZvcmVncm91bmRJY29uUmVmKSIpfSwKLQl7IklzVmFsaWRJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9Jc1ZhbGlkSWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiUGxvdEljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiBOb25lIil9LAotCXsiUHRJbkljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1B0SW5JY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0ZXN0UHQsIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU2VydmljZXNVc2FnZUZsYWdzIHRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlJlY3RJbkljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1JlY3RJbkljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgdGVzdFJlY3QsIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ikljb25SZWZUb1JnbiIsIChQeUNGdW5jdGlvbilJY25fSWNvblJlZlRvUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdGhlUmduLCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyBpY29uU2VydmljZXNVc2FnZUZsYWdzLCBJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCi0JeyJHZXRJY29uU2l6ZXNGcm9tSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblNpemVzRnJvbUljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKEljb25TZWxlY3RvclZhbHVlIGljb25TZWxlY3RvcklucHV0LCBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gKEljb25TZWxlY3RvclZhbHVlIGljb25TZWxlY3Rvck91dHB1dFB0cikiKX0sCi0JeyJGbHVzaEljb25SZWZzIiwgKFB5Q0Z1bmN0aW9uKUljbl9GbHVzaEljb25SZWZzLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGljb25UeXBlKSAtPiBOb25lIil9LAotCXsiRmx1c2hJY29uUmVmc0J5Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKUljbl9GbHVzaEljb25SZWZzQnlWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtKSAtPiBOb25lIil9LAotCXsiU2V0Q3VzdG9tSWNvbnNFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUljbl9TZXRDdXN0b21JY29uc0VuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtLCBCb29sZWFuIGVuYWJsZUN1c3RvbUljb25zKSAtPiBOb25lIil9LAotCXsiR2V0Q3VzdG9tSWNvbnNFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRDdXN0b21JY29uc0VuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtKSAtPiAoQm9vbGVhbiBjdXN0b21JY29uc0VuYWJsZWQpIil9LAotCXsiSXNJY29uUmVmTWFza0VtcHR5IiwgKFB5Q0Z1bmN0aW9uKUljbl9Jc0ljb25SZWZNYXNrRW1wdHksIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgaWNvblJlZikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldEljb25SZWZWYXJpYW50IiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmVmFyaWFudCwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiBpbkljb25SZWYsIE9TVHlwZSBpblZhcmlhbnQpIC0+IChJY29uUmVmIF9ydiwgSWNvblRyYW5zZm9ybVR5cGUgb3V0VHJhbnNmb3JtKSIpfSwKLQl7IlJlZ2lzdGVySWNvblJlZkZyb21JY29uRmlsZSIsIChQeUNGdW5jdGlvbilJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGljb25UeXBlLCBGU1NwZWMgaWNvbkZpbGUpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAotCXsiUmVhZEljb25GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWFkSWNvbkZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBpY29uRmlsZSkgLT4gKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkiKX0sCi0JeyJSZWFkSWNvbkZyb21GU1JlZiIsIChQeUNGdW5jdGlvbilJY25fUmVhZEljb25Gcm9tRlNSZWYsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIHJlZikgLT4gKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkiKX0sCi0JeyJXcml0ZUljb25GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Xcml0ZUljb25GaWxlLCAxLAotCSBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIEZTU3BlYyBpY29uRmlsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRDSWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGljb25JRCkgLT4gKENJY29uSGFuZGxlIF9ydikiKX0sCisgICAgeyJQbG90Q0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RDSWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBDSWNvbkhhbmRsZSB0aGVJY29uKSAtPiBOb25lIil9LAorICAgIHsiRGlzcG9zZUNJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9EaXNwb3NlQ0ljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKENJY29uSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaWNvbklEKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJQbG90SWNvbiIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCisgICAgeyJQbG90SWNvbklEIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbklELCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIFNJbnQxNiB0aGVSZXNJRCkgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld0ljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fTmV3SWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSIpfSwKKyAgICB7IkFkZEljb25Ub1N1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9BZGRJY29uVG9TdWl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZUljb25EYXRhLCBJY29uU3VpdGVSZWYgdGhlU3VpdGUsIFJlc1R5cGUgdGhlVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEljb25Gcm9tU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25Gcm9tU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25TdWl0ZVJlZiB0aGVTdWl0ZSwgUmVzVHlwZSB0aGVUeXBlKSAtPiAoSGFuZGxlIHRoZUljb25EYXRhKSIpfSwKKyAgICB7IkdldEljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgdGhlUmVzSUQsIEljb25TZWxlY3RvclZhbHVlIHNlbGVjdG9yKSAtPiAoSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkiKX0sCisgICAgeyJEaXNwb3NlSWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9EaXNwb3NlSWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlLCBCb29sZWFuIGRpc3Bvc2VEYXRhKSAtPiBOb25lIil9LAorICAgIHsiUGxvdEljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb25TdWl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSAtPiBOb25lIil9LAorICAgIHsiTG9hZEljb25DYWNoZSIsIChQeUNGdW5jdGlvbilJY25fTG9hZEljb25DYWNoZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBJY29uQ2FjaGVSZWYgdGhlSWNvbkNhY2hlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TGFiZWwiLCAoUHlDRnVuY3Rpb24pSWNuX0dldExhYmVsLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgbGFiZWxOdW1iZXIsIFN0cjI1NSBsYWJlbFN0cmluZykgLT4gKFJHQkNvbG9yIGxhYmVsQ29sb3IpIil9LAorICAgIHsiUHRJbkljb25JRCIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25JRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFB0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgU0ludDE2IGljb25JRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlB0SW5JY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX1B0SW5JY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJSZWN0SW5JY29uSUQiLCAoUHlDRnVuY3Rpb24pSWNuX1JlY3RJbkljb25JRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0ZXN0UmVjdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIFNJbnQxNiBpY29uSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJSZWN0SW5JY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX1JlY3RJbkljb25TdWl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0ZXN0UmVjdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJY29uSURUb1JnbiIsIChQeUNGdW5jdGlvbilJY25fSWNvbklEVG9SZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBTSW50MTYgaWNvbklEKSAtPiBOb25lIil9LAorICAgIHsiSWNvblN1aXRlVG9SZ24iLCAoUHlDRnVuY3Rpb24pSWNuX0ljb25TdWl0ZVRvUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgdGhlUmduLCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFN1aXRlTGFiZWwiLCAoUHlDRnVuY3Rpb24pSWNuX1NldFN1aXRlTGFiZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25TdWl0ZVJlZiB0aGVTdWl0ZSwgU0ludDE2IHRoZUxhYmVsKSAtPiBOb25lIil9LAorICAgIHsiR2V0U3VpdGVMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fR2V0U3VpdGVMYWJlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJQbG90SWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb25IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCisgICAgeyJQbG90U0lDTkhhbmRsZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdFNJQ05IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgSGFuZGxlIHRoZVNJQ04pIC0+IE5vbmUiKX0sCisgICAgeyJQbG90Q0ljb25IYW5kbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RDSWNvbkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBDSWNvbkhhbmRsZSB0aGVDSWNvbikgLT4gTm9uZSIpfSwKKyAgICB7Ikljb25SZWZUb0ljb25GYW1pbHkiLCAoUHlDRnVuY3Rpb24pSWNuX0ljb25SZWZUb0ljb25GYW1pbHksIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZiwgSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29ucykgLT4gKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkiKX0sCisgICAgeyJJY29uRmFtaWx5VG9JY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0ljb25GYW1pbHlUb0ljb25TdWl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5LCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvblN1aXRlUmVmIGljb25TdWl0ZSkiKX0sCisgICAgeyJJY29uU3VpdGVUb0ljb25GYW1pbHkiLCAoUHlDRnVuY3Rpb24pSWNuX0ljb25TdWl0ZVRvSWNvbkZhbWlseSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIGljb25TdWl0ZSwgSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29ucykgLT4gKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkiKX0sCisgICAgeyJTZXRJY29uRmFtaWx5RGF0YSIsIChQeUNGdW5jdGlvbilJY25fU2V0SWNvbkZhbWlseURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSwgT1NUeXBlIGljb25UeXBlLCBIYW5kbGUgaCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEljb25GYW1pbHlEYXRhIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uRmFtaWx5RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5LCBPU1R5cGUgaWNvblR5cGUsIEhhbmRsZSBoKSAtPiBOb25lIil9LAorICAgIHsiR2V0SWNvblJlZk93bmVycyIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblJlZk93bmVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoVUludDE2IG93bmVycykiKX0sCisgICAgeyJBY3F1aXJlSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fQWNxdWlyZUljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKKyAgICB7IlJlbGVhc2VJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWxlYXNlSWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiBOb25lIil9LAorICAgIHsiR2V0SWNvblJlZkZyb21GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmRnJvbUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVGaWxlKSAtPiAoSWNvblJlZiB0aGVJY29uUmVmLCBTSW50MTYgdGhlTGFiZWwpIil9LAorICAgIHsiR2V0SWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0sIE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAorICAgIHsiR2V0SWNvblJlZkZyb21Gb2xkZXIiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZGcm9tRm9sZGVyLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgdlJlZk51bSwgU0ludDMyIHBhcmVudEZvbGRlcklELCBTSW50MzIgZm9sZGVySUQsIFNJbnQ4IGF0dHJpYnV0ZXMsIFNJbnQ4IGFjY2Vzc1ByaXZpbGVnZXMpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAorICAgIHsiUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHkiLCAoUHlDRnVuY3Rpb24pSWNuX1JlZ2lzdGVySWNvblJlZkZyb21JY29uRmFtaWx5LCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGljb25UeXBlLCBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHkpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAorICAgIHsiUmVnaXN0ZXJJY29uUmVmRnJvbVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTU3BlYyByZXNvdXJjZUZpbGUsIFNJbnQxNiByZXNvdXJjZUlEKSAtPiAoSWNvblJlZiB0aGVJY29uUmVmKSIpfSwKKyAgICB7IlJlZ2lzdGVySWNvblJlZkZyb21GU1JlZiIsIChQeUNGdW5jdGlvbilJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUZTUmVmLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGljb25UeXBlLCBGU1JlZiBpY29uRmlsZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJVbnJlZ2lzdGVySWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fVW5yZWdpc3Rlckljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9VcGRhdGVJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCisgICAgeyJPdmVycmlkZUljb25SZWZGcm9tUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pSWNuX092ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmLCBGU1NwZWMgcmVzb3VyY2VGaWxlLCBTSW50MTYgcmVzb3VyY2VJRCkgLT4gTm9uZSIpfSwKKyAgICB7Ik92ZXJyaWRlSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fT3ZlcnJpZGVJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIG9sZEljb25SZWYsIEljb25SZWYgbmV3SWNvblJlZikgLT4gTm9uZSIpfSwKKyAgICB7IlJlbW92ZUljb25SZWZPdmVycmlkZSIsIChQeUNGdW5jdGlvbilJY25fUmVtb3ZlSWNvblJlZk92ZXJyaWRlLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCisgICAgeyJDb21wb3NpdGVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9Db21wb3NpdGVJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIGJhY2tncm91bmRJY29uUmVmLCBJY29uUmVmIGZvcmVncm91bmRJY29uUmVmKSAtPiAoSWNvblJlZiBjb21wb3NpdGVJY29uUmVmKSIpfSwKKyAgICB7IklzSWNvblJlZkNvbXBvc2l0ZSIsIChQeUNGdW5jdGlvbilJY25fSXNJY29uUmVmQ29tcG9zaXRlLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIGNvbXBvc2l0ZUljb25SZWYpIC0+IChJY29uUmVmIGJhY2tncm91bmRJY29uUmVmLCBJY29uUmVmIGZvcmVncm91bmRJY29uUmVmKSIpfSwKKyAgICB7IklzVmFsaWRJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9Jc1ZhbGlkSWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUGxvdEljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiBOb25lIil9LAorICAgIHsiUHRJbkljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1B0SW5JY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0ZXN0UHQsIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU2VydmljZXNVc2FnZUZsYWdzIHRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlJlY3RJbkljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1JlY3RJbkljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGVzdFJlY3QsIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ikljb25SZWZUb1JnbiIsIChQeUNGdW5jdGlvbilJY25fSWNvblJlZlRvUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgdGhlUmduLCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyBpY29uU2VydmljZXNVc2FnZUZsYWdzLCBJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRJY29uU2l6ZXNGcm9tSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblNpemVzRnJvbUljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25TZWxlY3RvclZhbHVlIGljb25TZWxlY3RvcklucHV0LCBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gKEljb25TZWxlY3RvclZhbHVlIGljb25TZWxlY3Rvck91dHB1dFB0cikiKX0sCisgICAgeyJGbHVzaEljb25SZWZzIiwgKFB5Q0Z1bmN0aW9uKUljbl9GbHVzaEljb25SZWZzLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGljb25UeXBlKSAtPiBOb25lIil9LAorICAgIHsiRmx1c2hJY29uUmVmc0J5Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKUljbl9GbHVzaEljb25SZWZzQnlWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q3VzdG9tSWNvbnNFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUljbl9TZXRDdXN0b21JY29uc0VuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtLCBCb29sZWFuIGVuYWJsZUN1c3RvbUljb25zKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q3VzdG9tSWNvbnNFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRDdXN0b21JY29uc0VuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtKSAtPiAoQm9vbGVhbiBjdXN0b21JY29uc0VuYWJsZWQpIil9LAorICAgIHsiSXNJY29uUmVmTWFza0VtcHR5IiwgKFB5Q0Z1bmN0aW9uKUljbl9Jc0ljb25SZWZNYXNrRW1wdHksIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgaWNvblJlZikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldEljb25SZWZWYXJpYW50IiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmVmFyaWFudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiBpbkljb25SZWYsIE9TVHlwZSBpblZhcmlhbnQpIC0+IChJY29uUmVmIF9ydiwgSWNvblRyYW5zZm9ybVR5cGUgb3V0VHJhbnNmb3JtKSIpfSwKKyAgICB7IlJlZ2lzdGVySWNvblJlZkZyb21JY29uRmlsZSIsIChQeUNGdW5jdGlvbilJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGljb25UeXBlLCBGU1NwZWMgaWNvbkZpbGUpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAorICAgIHsiUmVhZEljb25GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWFkSWNvbkZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBpY29uRmlsZSkgLT4gKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkiKX0sCisgICAgeyJSZWFkSWNvbkZyb21GU1JlZiIsIChQeUNGdW5jdGlvbilJY25fUmVhZEljb25Gcm9tRlNSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIHJlZikgLT4gKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkiKX0sCisgICAgeyJXcml0ZUljb25GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Xcml0ZUljb25GaWxlLCAxLAorICAgICBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIEZTU3BlYyBpY29uRmlsZSkgLT4gTm9uZSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0xNTg1LDIxICsxNTg1LDIxIEBACiAKIHZvaWQgaW5pdF9JY24odm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9JY24iLCBJY25fbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9JY24iLCBJY25fbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JSWNuX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoSWNuX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgSWNuX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgSWNuX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoSWNuX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgSWNuX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvbGF1bmNoL19MYXVuY2htb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2xhdW5jaC9fTGF1bmNobW9kdWxlLmMKaW5kZXggZmEyMWVjZS4uODg5MTJiMiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbGF1bmNoL19MYXVuY2htb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9sYXVuY2gvX0xhdW5jaG1vZHVsZS5jCkBAIC05LDkgKzksOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMjcsMjEgKzI3LDIxIEBACiBzdGF0aWMgaW50CiBPcHRDRlN0cmluZ1JlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRlN0cmluZ1JlZiAqc3BlYykKIHsKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgICpzcGVjID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCh2LCBzcGVjKTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgICpzcGVjID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KHYsIHNwZWMpOwogfQogCiBQeU9iamVjdCAqCiBPcHRDRlN0cmluZ1JlZk9ial9OZXcoQ0ZTdHJpbmdSZWYgaXQpCiB7Ci0gICAgICAgIGlmIChpdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDRlN0cmluZ1JlZk9ial9OZXcoaXQpOworICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBDRlN0cmluZ1JlZk9ial9OZXcoaXQpOwogfQogCiAvKgpAQCAtNTEsMTkgKzUxLDE5IEBACiBMU0l0ZW1JbmZvUmVjb3JkX05ldyhMU0l0ZW1JbmZvUmVjb3JkICppdCkKIHsKICNpZm5kZWYgX19MUDY0X18KLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIntzOmlzOk8mczpPJnM6TyZzOk8mczppfSIsCi0gICAgICAgICAgICAgICAgImZsYWdzIiwgaXQtPmZsYWdzLAotICAgICAgICAgICAgICAgICJmaWxldHlwZSIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+ZmlsZXR5cGUsCi0gICAgICAgICAgICAgICAgImNyZWF0b3IiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXQtPmNyZWF0b3IsCi0gICAgICAgICAgICAgICAgImV4dGVuc2lvbiIsIE9wdENGU3RyaW5nUmVmT2JqX05ldywgaXQtPmV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAiaWNvbkZpbGVOYW1lIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+aWNvbkZpbGVOYW1lLAotICAgICAgICAgICAgICAgICJraW5kSUQiLCBpdC0+a2luZElEKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgie3M6aXM6TyZzOk8mczpPJnM6TyZzOml9IiwKKyAgICAgICAgImZsYWdzIiwgaXQtPmZsYWdzLAorICAgICAgICAiZmlsZXR5cGUiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXQtPmZpbGV0eXBlLAorICAgICAgICAiY3JlYXRvciIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+Y3JlYXRvciwKKyAgICAgICAgImV4dGVuc2lvbiIsIE9wdENGU3RyaW5nUmVmT2JqX05ldywgaXQtPmV4dGVuc2lvbiwKKyAgICAgICAgImljb25GaWxlTmFtZSIsIE9wdENGU3RyaW5nUmVmT2JqX05ldywgaXQtPmljb25GaWxlTmFtZSwKKyAgICAgICAgImtpbmRJRCIsIGl0LT5raW5kSUQpOwogI2Vsc2UKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIntzOmlzOk8mczpPJnM6TyZ9IiwKLSAgICAgICAgICAgICAgICAiZmxhZ3MiLCBpdC0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgImZpbGV0eXBlIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5maWxldHlwZSwKLSAgICAgICAgICAgICAgICAiY3JlYXRvciIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+Y3JlYXRvciwKLSAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+ZXh0ZW5zaW9uKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgie3M6aXM6TyZzOk8mczpPJn0iLAorICAgICAgICAiZmxhZ3MiLCBpdC0+ZmxhZ3MsCisgICAgICAgICJmaWxldHlwZSIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+ZmlsZXR5cGUsCisgICAgICAgICJjcmVhdG9yIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5jcmVhdG9yLAorICAgICAgICAiZXh0ZW5zaW9uIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+ZXh0ZW5zaW9uKTsKICNlbmRpZgogfQogCkBAIC03MSwzOTEgKzcxLDM5MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0NvcHlJdGVtSW5mb0ZvclJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpbkl0ZW1SZWY7Ci0JTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvOwotCUxTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpbkl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldoaWNoSW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0NvcHlJdGVtSW5mb0ZvclJlZigmaW5JdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEl0ZW1JbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTFNJdGVtSW5mb1JlY29yZF9OZXcsICZvdXRJdGVtSW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgaW5JdGVtUmVmOworICAgIExTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbzsKKyAgICBMU0l0ZW1JbmZvUmVjb3JkIG91dEl0ZW1JbmZvOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5JdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XaGljaEluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNDb3B5SXRlbUluZm9Gb3JSZWYoJmluSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJdGVtSW5mbyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIExTSXRlbUluZm9SZWNvcmRfTmV3LCAmb3V0SXRlbUluZm8pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0NvcHlJdGVtSW5mb0ZvclVSTChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlVSTFJlZiBpblVSTDsKLQlMU1JlcXVlc3RlZEluZm8gaW5XaGljaEluZm87Ci0JTFNJdGVtSW5mb1JlY29yZCBvdXRJdGVtSW5mbzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldoaWNoSW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0NvcHlJdGVtSW5mb0ZvclVSTChpblVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaGljaEluZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJdGVtSW5mbyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIExTSXRlbUluZm9SZWNvcmRfTmV3LCAmb3V0SXRlbUluZm8pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGVVJMUmVmIGluVVJMOworICAgIExTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbzsKKyAgICBMU0l0ZW1JbmZvUmVjb3JkIG91dEl0ZW1JbmZvOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV2hpY2hJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ29weUl0ZW1JbmZvRm9yVVJMKGluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEl0ZW1JbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFNJdGVtSW5mb1JlY29yZF9OZXcsICZvdXRJdGVtSW5mbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTR2V0RXh0ZW5zaW9uSW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVbmlDaGFyICppbk5hbWVMZW5fX2luX187Ci0JVW5pQ2hhckNvdW50IGluTmFtZUxlbl9fbGVuX187Ci0JaW50IGluTmFtZUxlbl9faW5fbGVuX187Ci0JVW5pQ2hhckNvdW50IG91dEV4dFN0YXJ0SW5kZXg7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OYW1lTGVuX19pbl9fLCAmaW5OYW1lTGVuX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWluTmFtZUxlbl9fbGVuX18gPSBpbk5hbWVMZW5fX2luX2xlbl9fOwotCV9lcnIgPSBMU0dldEV4dGVuc2lvbkluZm8oaW5OYW1lTGVuX19sZW5fXywgaW5OYW1lTGVuX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEV4dFN0YXJ0SW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEV4dFN0YXJ0SW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVuaUNoYXIgKmluTmFtZUxlbl9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgaW5OYW1lTGVuX19sZW5fXzsKKyAgICBpbnQgaW5OYW1lTGVuX19pbl9sZW5fXzsKKyAgICBVbmlDaGFyQ291bnQgb3V0RXh0U3RhcnRJbmRleDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk5hbWVMZW5fX2luX18sICZpbk5hbWVMZW5fX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaW5OYW1lTGVuX19sZW5fXyA9IGluTmFtZUxlbl9faW5fbGVuX187CisgICAgX2VyciA9IExTR2V0RXh0ZW5zaW9uSW5mbyhpbk5hbWVMZW5fX2xlbl9fLCBpbk5hbWVMZW5fX2luX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RXh0U3RhcnRJbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RXh0U3RhcnRJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weURpc3BsYXlOYW1lRm9yUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIGluUmVmOwotCUNGU3RyaW5nUmVmIG91dERpc3BsYXlOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0NvcHlEaXNwbGF5TmFtZUZvclJlZigmaW5SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXREaXNwbGF5TmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0RGlzcGxheU5hbWUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIGluUmVmOworICAgIENGU3RyaW5nUmVmIG91dERpc3BsYXlOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0NvcHlEaXNwbGF5TmFtZUZvclJlZigmaW5SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXREaXNwbGF5TmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0RGlzcGxheU5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0NvcHlEaXNwbGF5TmFtZUZvclVSTChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlVSTFJlZiBpblVSTDsKLQlDRlN0cmluZ1JlZiBvdXREaXNwbGF5TmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0NvcHlEaXNwbGF5TmFtZUZvclVSTChpblVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERpc3BsYXlOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXREaXNwbGF5TmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5VUkw7CisgICAgQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNDb3B5RGlzcGxheU5hbWVGb3JVUkwoaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXREaXNwbGF5TmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0RGlzcGxheU5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU1NldEV4dGVuc2lvbkhpZGRlbkZvclJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpblJlZjsKLQlCb29sZWFuIGluSGlkZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IaWRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmKCZpblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IaWRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1JlZiBpblJlZjsKKyAgICBCb29sZWFuIGluSGlkZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IaWRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmKCZpblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IaWRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZVUkxSZWYgaW5VUkw7Ci0JQm9vbGVhbiBpbkhpZGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IaWRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yVVJMKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGVVJMUmVmIGluVVJMOworICAgIEJvb2xlYW4gaW5IaWRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSGlkZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU1NldEV4dGVuc2lvbkhpZGRlbkZvclVSTChpblVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IaWRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNDb3B5S2luZFN0cmluZ0ZvclJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpbkZTUmVmOwotCUNGU3RyaW5nUmVmIG91dEtpbmRTdHJpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluRlNSZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNDb3B5S2luZFN0cmluZ0ZvclJlZigmaW5GU1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0S2luZFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0S2luZFN0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgaW5GU1JlZjsKKyAgICBDRlN0cmluZ1JlZiBvdXRLaW5kU3RyaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpbkZTUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ29weUtpbmRTdHJpbmdGb3JSZWYoJmluRlNSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEtpbmRTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dEtpbmRTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0NvcHlLaW5kU3RyaW5nRm9yVVJMKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUNGU3RyaW5nUmVmIG91dEtpbmRTdHJpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNDb3B5S2luZFN0cmluZ0ZvclVSTChpblVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0S2luZFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0S2luZFN0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5VUkw7CisgICAgQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0NvcHlLaW5kU3RyaW5nRm9yVVJMKGluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRLaW5kU3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRLaW5kU3RyaW5nKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckl0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNSZWYgaW5JdGVtUmVmOwotCUxTUm9sZXNNYXNrIGluUm9sZU1hc2s7Ci0JRlNSZWYgb3V0QXBwUmVmOwotCUNGVVJMUmVmIG91dEFwcFVSTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNHZXRBcHBsaWNhdGlvbkZvckl0ZW0oJmluSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFVSTCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm91dEFwcFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dEFwcFVSTCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgaW5JdGVtUmVmOworICAgIExTUm9sZXNNYXNrIGluUm9sZU1hc2s7CisgICAgRlNSZWYgb3V0QXBwUmVmOworICAgIENGVVJMUmVmIG91dEFwcFVSTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNHZXRBcHBsaWNhdGlvbkZvckl0ZW0oJmluSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFVSTCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm91dEFwcFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dEFwcFVSTCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTR2V0QXBwbGljYXRpb25Gb3JJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBpblR5cGU7Ci0JT1NUeXBlIGluQ3JlYXRvcjsKLQlDRlN0cmluZ1JlZiBpbkV4dGVuc2lvbjsKLQlMU1JvbGVzTWFzayBpblJvbGVNYXNrOwotCUZTUmVmIG91dEFwcFJlZjsKLQlDRlVSTFJlZiBvdXRBcHBVUkw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5DcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5FeHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJvbGVNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTR2V0QXBwbGljYXRpb25Gb3JJbmZvKGluVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFVSTCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm91dEFwcFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dEFwcFVSTCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIGluVHlwZTsKKyAgICBPU1R5cGUgaW5DcmVhdG9yOworICAgIENGU3RyaW5nUmVmIGluRXh0ZW5zaW9uOworICAgIExTUm9sZXNNYXNrIGluUm9sZU1hc2s7CisgICAgRlNSZWYgb3V0QXBwUmVmOworICAgIENGVVJMUmVmIG91dEFwcFVSTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbkNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbkV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNHZXRBcHBsaWNhdGlvbkZvckluZm8oaW5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvclVSTChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlVSTFJlZiBpblVSTDsKLQlMU1JvbGVzTWFzayBpblJvbGVNYXNrOwotCUZTUmVmIG91dEFwcFJlZjsKLQlDRlVSTFJlZiBvdXRBcHBVUkw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0dldEFwcGxpY2F0aW9uRm9yVVJMKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlVSTFJlZiBpblVSTDsKKyAgICBMU1JvbGVzTWFzayBpblJvbGVNYXNrOworICAgIEZTUmVmIG91dEFwcFJlZjsKKyAgICBDRlVSTFJlZiBvdXRBcHBVUkw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0dldEFwcGxpY2F0aW9uRm9yVVJMKGluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBpbkNyZWF0b3I7Ci0JQ0ZTdHJpbmdSZWYgaW5CdW5kbGVJRDsKLQlDRlN0cmluZ1JlZiBpbk5hbWU7Ci0JRlNSZWYgb3V0QXBwUmVmOwotCUNGVVJMUmVmIG91dEFwcFVSTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbkNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbkJ1bmRsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTRmluZEFwcGxpY2F0aW9uRm9ySW5mbyhpbkNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1bmRsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBVUkwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRBcHBSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRBcHBVUkwpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE9TVHlwZSBpbkNyZWF0b3I7CisgICAgQ0ZTdHJpbmdSZWYgaW5CdW5kbGVJRDsKKyAgICBDRlN0cmluZ1JlZiBpbk5hbWU7CisgICAgRlNSZWYgb3V0QXBwUmVmOworICAgIENGVVJMUmVmIG91dEFwcFVSTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbkNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbkJ1bmRsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTRmluZEFwcGxpY2F0aW9uRm9ySW5mbyhpbkNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1bmRsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBVUkwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRBcHBSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRBcHBVUkwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0NhblJlZkFjY2VwdEl0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNSZWYgaW5JdGVtRlNSZWY7Ci0JRlNSZWYgaW5UYXJnZXRSZWY7Ci0JTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKLQlMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzOwotCUJvb2xlYW4gb3V0QWNjZXB0c0l0ZW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpbkl0ZW1GU1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpblRhcmdldFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ2FuUmVmQWNjZXB0SXRlbSgmaW5JdGVtRlNSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UYXJnZXRSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBY2NlcHRzSXRlbSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0QWNjZXB0c0l0ZW0pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIGluSXRlbUZTUmVmOworICAgIEZTUmVmIGluVGFyZ2V0UmVmOworICAgIExTUm9sZXNNYXNrIGluUm9sZU1hc2s7CisgICAgTFNBY2NlcHRhbmNlRmxhZ3MgaW5GbGFnczsKKyAgICBCb29sZWFuIG91dEFjY2VwdHNJdGVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5JdGVtRlNSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5UYXJnZXRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJvbGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0NhblJlZkFjY2VwdEl0ZW0oJmluSXRlbUZTUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGFyZ2V0UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QWNjZXB0c0l0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEFjY2VwdHNJdGVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNDYW5VUkxBY2NlcHRVUkwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZVUkxSZWYgaW5JdGVtVVJMOwotCUNGVVJMUmVmIGluVGFyZ2V0VVJMOwotCUxTUm9sZXNNYXNrIGluUm9sZU1hc2s7Ci0JTFNBY2NlcHRhbmNlRmxhZ3MgaW5GbGFnczsKLQlCb29sZWFuIG91dEFjY2VwdHNJdGVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpbkl0ZW1VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblRhcmdldFVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ2FuVVJMQWNjZXB0VVJMKGluSXRlbVVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYXJnZXRVUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBY2NlcHRzSXRlbSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0QWNjZXB0c0l0ZW0pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGVVJMUmVmIGluSXRlbVVSTDsKKyAgICBDRlVSTFJlZiBpblRhcmdldFVSTDsKKyAgICBMU1JvbGVzTWFzayBpblJvbGVNYXNrOworICAgIExTQWNjZXB0YW5jZUZsYWdzIGluRmxhZ3M7CisgICAgQm9vbGVhbiBvdXRBY2NlcHRzSXRlbTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5JdGVtVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5UYXJnZXRVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJvbGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0NhblVSTEFjY2VwdFVSTChpbkl0ZW1VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFyZ2V0VVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QWNjZXB0c0l0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEFjY2VwdHNJdGVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNPcGVuRlNSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNSZWYgaW5SZWY7Ci0JRlNSZWYgb3V0TGF1bmNoZWRSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTT3BlbkZTUmVmKCZpblJlZiwKLQkgICAgICAgICAgICAgICAgICAgJm91dExhdW5jaGVkUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm91dExhdW5jaGVkUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1JlZiBpblJlZjsKKyAgICBGU1JlZiBvdXRMYXVuY2hlZFJlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNPcGVuRlNSZWYoJmluUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAmb3V0TGF1bmNoZWRSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0TGF1bmNoZWRSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU09wZW5DRlVSTFJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlVSTFJlZiBpblVSTDsKLQlDRlVSTFJlZiBvdXRMYXVuY2hlZFVSTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU09wZW5DRlVSTFJlZihpblVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm91dExhdW5jaGVkVVJMKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRMYXVuY2hlZFVSTCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5VUkw7CisgICAgQ0ZVUkxSZWYgb3V0TGF1bmNoZWRVUkw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNPcGVuQ0ZVUkxSZWYoaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRMYXVuY2hlZFVSTCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0TGF1bmNoZWRVUkwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgTGF1bmNoX21ldGhvZHNbXSA9IHsKLQl7IkxTQ29weUl0ZW1JbmZvRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlJdGVtSW5mb0ZvclJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgaW5JdGVtUmVmLCBMU1JlcXVlc3RlZEluZm8gaW5XaGljaEluZm8pIC0+IChMU0l0ZW1JbmZvUmVjb3JkIG91dEl0ZW1JbmZvKSIpfSwKLQl7IkxTQ29weUl0ZW1JbmZvRm9yVVJMIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlJdGVtSW5mb0ZvclVSTCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZVUkxSZWYgaW5VUkwsIExTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbykgLT4gKExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm8pIil9LAotCXsiTFNHZXRFeHRlbnNpb25JbmZvIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEV4dGVuc2lvbkluZm8sIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBpbk5hbWVMZW4pIC0+IChVbmlDaGFyQ291bnQgb3V0RXh0U3RhcnRJbmRleCkiKX0sCi0JeyJMU0NvcHlEaXNwbGF5TmFtZUZvclJlZiIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDb3B5RGlzcGxheU5hbWVGb3JSZWYsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGluUmVmKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWUpIil9LAotCXsiTFNDb3B5RGlzcGxheU5hbWVGb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weURpc3BsYXlOYW1lRm9yVVJMLCAxLAotCSBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCkgLT4gKENGU3RyaW5nUmVmIG91dERpc3BsYXlOYW1lKSIpfSwKLQl7IkxTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU1NldEV4dGVuc2lvbkhpZGRlbkZvclJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYsIEJvb2xlYW4gaW5IaWRlKSAtPiBOb25lIil9LAotCXsiTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yVVJMLCAxLAotCSBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgQm9vbGVhbiBpbkhpZGUpIC0+IE5vbmUiKX0sCi0JeyJMU0NvcHlLaW5kU3RyaW5nRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlLaW5kU3RyaW5nRm9yUmVmLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBpbkZTUmVmKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZykiKX0sCi0JeyJMU0NvcHlLaW5kU3RyaW5nRm9yVVJMIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlLaW5kU3RyaW5nRm9yVVJMLCAxLAotCSBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCkgLT4gKENGU3RyaW5nUmVmIG91dEtpbmRTdHJpbmcpIil9LAotCXsiTFNHZXRBcHBsaWNhdGlvbkZvckl0ZW0iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTR2V0QXBwbGljYXRpb25Gb3JJdGVtLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBpbkl0ZW1SZWYsIExTUm9sZXNNYXNrIGluUm9sZU1hc2spIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCi0JeyJMU0dldEFwcGxpY2F0aW9uRm9ySW5mbyIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckluZm8sIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBpblR5cGUsIE9TVHlwZSBpbkNyZWF0b3IsIENGU3RyaW5nUmVmIGluRXh0ZW5zaW9uLCBMU1JvbGVzTWFzayBpblJvbGVNYXNrKSAtPiAoRlNSZWYgb3V0QXBwUmVmLCBDRlVSTFJlZiBvdXRBcHBVUkwpIil9LAotCXsiTFNHZXRBcHBsaWNhdGlvbkZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvclVSTCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZVUkxSZWYgaW5VUkwsIExTUm9sZXNNYXNrIGluUm9sZU1hc2spIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCi0JeyJMU0ZpbmRBcHBsaWNhdGlvbkZvckluZm8iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTRmluZEFwcGxpY2F0aW9uRm9ySW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGluQ3JlYXRvciwgQ0ZTdHJpbmdSZWYgaW5CdW5kbGVJRCwgQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiAoRlNSZWYgb3V0QXBwUmVmLCBDRlVSTFJlZiBvdXRBcHBVUkwpIil9LAotCXsiTFNDYW5SZWZBY2NlcHRJdGVtIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NhblJlZkFjY2VwdEl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGluSXRlbUZTUmVmLCBGU1JlZiBpblRhcmdldFJlZiwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaywgTFNBY2NlcHRhbmNlRmxhZ3MgaW5GbGFncykgLT4gKEJvb2xlYW4gb3V0QWNjZXB0c0l0ZW0pIil9LAotCXsiTFNDYW5VUkxBY2NlcHRVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ2FuVVJMQWNjZXB0VVJMLCAxLAotCSBQeURvY19TVFIoIihDRlVSTFJlZiBpbkl0ZW1VUkwsIENGVVJMUmVmIGluVGFyZ2V0VVJMLCBMU1JvbGVzTWFzayBpblJvbGVNYXNrLCBMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRBY2NlcHRzSXRlbSkiKX0sCi0JeyJMU09wZW5GU1JlZiIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNPcGVuRlNSZWYsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGluUmVmKSAtPiAoRlNSZWYgb3V0TGF1bmNoZWRSZWYpIil9LAotCXsiTFNPcGVuQ0ZVUkxSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTT3BlbkNGVVJMUmVmLCAxLAotCSBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCkgLT4gKENGVVJMUmVmIG91dExhdW5jaGVkVVJMKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkxTQ29weUl0ZW1JbmZvRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlJdGVtSW5mb0ZvclJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgaW5JdGVtUmVmLCBMU1JlcXVlc3RlZEluZm8gaW5XaGljaEluZm8pIC0+IChMU0l0ZW1JbmZvUmVjb3JkIG91dEl0ZW1JbmZvKSIpfSwKKyAgICB7IkxTQ29weUl0ZW1JbmZvRm9yVVJMIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlJdGVtSW5mb0ZvclVSTCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZVUkxSZWYgaW5VUkwsIExTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbykgLT4gKExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm8pIil9LAorICAgIHsiTFNHZXRFeHRlbnNpb25JbmZvIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEV4dGVuc2lvbkluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBpbk5hbWVMZW4pIC0+IChVbmlDaGFyQ291bnQgb3V0RXh0U3RhcnRJbmRleCkiKX0sCisgICAgeyJMU0NvcHlEaXNwbGF5TmFtZUZvclJlZiIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDb3B5RGlzcGxheU5hbWVGb3JSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGluUmVmKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWUpIil9LAorICAgIHsiTFNDb3B5RGlzcGxheU5hbWVGb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weURpc3BsYXlOYW1lRm9yVVJMLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCkgLT4gKENGU3RyaW5nUmVmIG91dERpc3BsYXlOYW1lKSIpfSwKKyAgICB7IkxTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU1NldEV4dGVuc2lvbkhpZGRlbkZvclJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYsIEJvb2xlYW4gaW5IaWRlKSAtPiBOb25lIil9LAorICAgIHsiTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yVVJMLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgQm9vbGVhbiBpbkhpZGUpIC0+IE5vbmUiKX0sCisgICAgeyJMU0NvcHlLaW5kU3RyaW5nRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlLaW5kU3RyaW5nRm9yUmVmLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBpbkZTUmVmKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZykiKX0sCisgICAgeyJMU0NvcHlLaW5kU3RyaW5nRm9yVVJMIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlLaW5kU3RyaW5nRm9yVVJMLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCkgLT4gKENGU3RyaW5nUmVmIG91dEtpbmRTdHJpbmcpIil9LAorICAgIHsiTFNHZXRBcHBsaWNhdGlvbkZvckl0ZW0iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTR2V0QXBwbGljYXRpb25Gb3JJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBpbkl0ZW1SZWYsIExTUm9sZXNNYXNrIGluUm9sZU1hc2spIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCisgICAgeyJMU0dldEFwcGxpY2F0aW9uRm9ySW5mbyIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBpblR5cGUsIE9TVHlwZSBpbkNyZWF0b3IsIENGU3RyaW5nUmVmIGluRXh0ZW5zaW9uLCBMU1JvbGVzTWFzayBpblJvbGVNYXNrKSAtPiAoRlNSZWYgb3V0QXBwUmVmLCBDRlVSTFJlZiBvdXRBcHBVUkwpIil9LAorICAgIHsiTFNHZXRBcHBsaWNhdGlvbkZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvclVSTCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZVUkxSZWYgaW5VUkwsIExTUm9sZXNNYXNrIGluUm9sZU1hc2spIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCisgICAgeyJMU0ZpbmRBcHBsaWNhdGlvbkZvckluZm8iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTRmluZEFwcGxpY2F0aW9uRm9ySW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGluQ3JlYXRvciwgQ0ZTdHJpbmdSZWYgaW5CdW5kbGVJRCwgQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiAoRlNSZWYgb3V0QXBwUmVmLCBDRlVSTFJlZiBvdXRBcHBVUkwpIil9LAorICAgIHsiTFNDYW5SZWZBY2NlcHRJdGVtIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NhblJlZkFjY2VwdEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGluSXRlbUZTUmVmLCBGU1JlZiBpblRhcmdldFJlZiwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaywgTFNBY2NlcHRhbmNlRmxhZ3MgaW5GbGFncykgLT4gKEJvb2xlYW4gb3V0QWNjZXB0c0l0ZW0pIil9LAorICAgIHsiTFNDYW5VUkxBY2NlcHRVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ2FuVVJMQWNjZXB0VVJMLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBpbkl0ZW1VUkwsIENGVVJMUmVmIGluVGFyZ2V0VVJMLCBMU1JvbGVzTWFzayBpblJvbGVNYXNrLCBMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRBY2NlcHRzSXRlbSkiKX0sCisgICAgeyJMU09wZW5GU1JlZiIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNPcGVuRlNSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGluUmVmKSAtPiAoRlNSZWYgb3V0TGF1bmNoZWRSZWYpIil9LAorICAgIHsiTFNPcGVuQ0ZVUkxSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTT3BlbkNGVVJMUmVmLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCkgLT4gKENGVVJMUmVmIG91dExhdW5jaGVkVVJMKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtNDYzLDE4ICs0NjMsMTggQEAKIAogdm9pZCBpbml0X0xhdW5jaCh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9MYXVuY2giLCBMYXVuY2hfbWV0aG9kcyk7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JTGF1bmNoX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoTGF1bmNoX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTGF1bmNoX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9MYXVuY2giLCBMYXVuY2hfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgTGF1bmNoX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoTGF1bmNoX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTGF1bmNoX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09IEVuZCBtb2R1bGUgX0xhdW5jaCA9PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvbGlzdC9fTGlzdG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvbGlzdC9fTGlzdG1vZHVsZS5jCmluZGV4IDA3OTc0MDQuLjNmNDNiMDYgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2xpc3QvX0xpc3Rtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9saXN0L19MaXN0bW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTQxLDY5MyArNDEsNjkzIEBACiAjZGVmaW5lIExpc3RPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmTGlzdF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZMaXN0X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBMaXN0T2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JTGlzdEhhbmRsZSBvYl9pdHNlbGY7Ci0JUHlPYmplY3QgKm9iX2xkZWZfZnVuYzsKLQlpbnQgb2JfbXVzdF9iZV9kaXNwb3NlZDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgTGlzdEhhbmRsZSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3QgKm9iX2xkZWZfZnVuYzsKKyAgICBpbnQgb2JfbXVzdF9iZV9kaXNwb3NlZDsKIH0gTGlzdE9iamVjdDsKIAogUHlPYmplY3QgKkxpc3RPYmpfTmV3KExpc3RIYW5kbGUgaXRzZWxmKQogewotCUxpc3RPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKExpc3RfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBMaXN0Iik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoTGlzdE9iamVjdCwgJkxpc3RfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2xkZWZfZnVuYyA9IE5VTEw7Ci0JaXQtPm9iX211c3RfYmVfZGlzcG9zZWQgPSAxOwotCVNldExpc3RSZWZDb24oaXRzZWxmLCAobG9uZylpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIExpc3RPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKExpc3RfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBMaXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoTGlzdE9iamVjdCwgJkxpc3RfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2xkZWZfZnVuYyA9IE5VTEw7CisgICAgaXQtPm9iX211c3RfYmVfZGlzcG9zZWQgPSAxOworICAgIFNldExpc3RSZWZDb24oaXRzZWxmLCAobG9uZylpdCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgTGlzdE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBMaXN0SGFuZGxlICpwX2l0c2VsZikKIHsKLQlpZiAoIUxpc3RPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTGlzdCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChMaXN0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUxpc3RPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTGlzdCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChMaXN0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgTGlzdE9ial9kZWFsbG9jKExpc3RPYmplY3QgKnNlbGYpCiB7Ci0JUHlfWERFQ1JFRihzZWxmLT5vYl9sZGVmX2Z1bmMpOwotCXNlbGYtPm9iX2xkZWZfZnVuYyA9IE5VTEw7Ci0JU2V0TGlzdFJlZkNvbihzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOwotCWlmIChzZWxmLT5vYl9tdXN0X2JlX2Rpc3Bvc2VkICYmIHNlbGYtPm9iX2l0c2VsZikgTERpc3Bvc2Uoc2VsZi0+b2JfaXRzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfbGRlZl9mdW5jKTsKKyAgICBzZWxmLT5vYl9sZGVmX2Z1bmMgPSBOVUxMOworICAgIFNldExpc3RSZWZDb24oc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsKKyAgICBpZiAoc2VsZi0+b2JfbXVzdF9iZV9kaXNwb3NlZCAmJiBzZWxmLT5vYl9pdHNlbGYpIExEaXNwb3NlKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xBZGRDb2x1bW4oTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCXNob3J0IGNvdW50OwotCXNob3J0IGNvbE51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbE51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExBZGRDb2x1bW4oY291bnQsCi0JICAgICAgICAgICAgICAgICBjb2xOdW0sCi0JICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIHNob3J0IGNvdW50OworICAgIHNob3J0IGNvbE51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbE51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExBZGRDb2x1bW4oY291bnQsCisgICAgICAgICAgICAgICAgICAgICBjb2xOdW0sCisgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xBZGRSb3coTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCXNob3J0IGNvdW50OwotCXNob3J0IHJvd051bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJvd051bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExBZGRSb3coY291bnQsCi0JICAgICAgICAgICAgICByb3dOdW0sCi0JICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIHNob3J0IGNvdW50OworICAgIHNob3J0IHJvd051bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJvd051bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExBZGRSb3coY291bnQsCisgICAgICAgICAgICAgICAgICByb3dOdW0sCisgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xEZWxDb2x1bW4oTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgY291bnQ7Ci0Jc2hvcnQgY29sTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTERlbENvbHVtbihjb3VudCwKLQkgICAgICAgICAgIGNvbE51bSwKLQkgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgY291bnQ7CisgICAgc2hvcnQgY29sTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTERlbENvbHVtbihjb3VudCwKKyAgICAgICAgICAgICAgIGNvbE51bSwKKyAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xEZWxSb3coTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgY291bnQ7Ci0Jc2hvcnQgcm93TnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmcm93TnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTERlbFJvdyhjb3VudCwKLQkgICAgICAgIHJvd051bSwKLQkgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgY291bnQ7CisgICAgc2hvcnQgcm93TnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93TnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTERlbFJvdyhjb3VudCwKKyAgICAgICAgcm93TnVtLAorICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MR2V0U2VsZWN0KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUJvb2xlYW4gbmV4dDsKLQlQb2ludCB0aGVDZWxsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMR2V0U2VsZWN0KG5leHQsCi0JICAgICAgICAgICAgICAgICAmdGhlQ2VsbCwKLQkgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB0aGVDZWxsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQm9vbGVhbiBuZXh0OworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExHZXRTZWxlY3QobmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTExhc3RDbGljayhMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExMYXN0Q2xpY2soX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExMYXN0Q2xpY2soX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTE5leHRDZWxsKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUJvb2xlYW4gaE5leHQ7Ci0JQm9vbGVhbiB2TmV4dDsKLQlQb2ludCB0aGVDZWxsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaE5leHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2TmV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE5leHRDZWxsKGhOZXh0LAotCSAgICAgICAgICAgICAgICB2TmV4dCwKLQkgICAgICAgICAgICAgICAgJnRoZUNlbGwsCi0JICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB0aGVDZWxsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQm9vbGVhbiBoTmV4dDsKKyAgICBCb29sZWFuIHZOZXh0OworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYmJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoTmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZOZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTmV4dENlbGwoaE5leHQsCisgICAgICAgICAgICAgICAgICAgIHZOZXh0LAorICAgICAgICAgICAgICAgICAgICAmdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTFNpemUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbGlzdFdpZHRoOwotCXNob3J0IGxpc3RIZWlnaHQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGlzdFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGlzdEhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCUxTaXplKGxpc3RXaWR0aCwKLQkgICAgICBsaXN0SGVpZ2h0LAotCSAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbGlzdFdpZHRoOworICAgIHNob3J0IGxpc3RIZWlnaHQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGlzdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGlzdEhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExTaXplKGxpc3RXaWR0aCwKKyAgICAgICAgICBsaXN0SGVpZ2h0LAorICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xTZXREcmF3aW5nTW9kZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGRyYXdJdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRyYXdJdCkpCi0JCXJldHVybiBOVUxMOwotCUxTZXREcmF3aW5nTW9kZShkcmF3SXQsCi0JICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBkcmF3SXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkcmF3SXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMU2V0RHJhd2luZ01vZGUoZHJhd0l0LAorICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MU2Nyb2xsKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRDb2xzOwotCXNob3J0IGRSb3dzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRDb2xzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZFJvd3MpKQotCQlyZXR1cm4gTlVMTDsKLQlMU2Nyb2xsKGRDb2xzLAotCSAgICAgICAgZFJvd3MsCi0JICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGRDb2xzOworICAgIHNob3J0IGRSb3dzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRDb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZFJvd3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMU2Nyb2xsKGRDb2xzLAorICAgICAgICBkUm93cywKKyAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEF1dG9TY3JvbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUxBdXRvU2Nyb2xsKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExBdXRvU2Nyb2xsKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xVcGRhdGUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHRoZVJnbjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTFVwZGF0ZSh0aGVSZ24sCi0JICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSB0aGVSZ247CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExVcGRhdGUodGhlUmduLAorICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MQWN0aXZhdGUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBhY3Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlMQWN0aXZhdGUoYWN0LAotCSAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gYWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTEFjdGl2YXRlKGFjdCwKKyAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTENlbGxTaXplKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IGNTaXplOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZjU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCUxDZWxsU2l6ZShjU2l6ZSwKLQkgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBjU2l6ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmY1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMQ2VsbFNpemUoY1NpemUsCisgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xDbGljayhMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBwdDsKLQlFdmVudE1vZGlmaWVycyBtb2RpZmllcnM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExDbGljayhwdCwKLQkgICAgICAgICAgICAgbW9kaWZpZXJzLAotCSAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgcHQ7CisgICAgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMQ2xpY2socHQsCisgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MQWRkVG9DZWxsKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0Jc2hvcnQgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JTEFkZFRvQ2VsbChkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICAgIHRoZUNlbGwsCi0JICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKmRhdGFQdHJfX2luX187CisgICAgc2hvcnQgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgTEFkZFRvQ2VsbChkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgIHRoZUNlbGwsCisgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MQ2xyQ2VsbChMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCB0aGVDZWxsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTENsckNlbGwodGhlQ2VsbCwKLQkgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMQ2xyQ2VsbCh0aGVDZWxsLAorICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xHZXRDZWxsKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKmRhdGFQdHJfX291dF9fOwotCXNob3J0IGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKLQlQb2ludCB0aGVDZWxsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCi0JewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGRhdGFQdHJfX2Vycm9yX187Ci0JfQotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JTEdldENlbGwoZGF0YVB0cl9fb3V0X18sICZkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICB0aGVDZWxsLAotCSAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOwotCWZyZWUoZGF0YVB0cl9fb3V0X18pOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICpkYXRhUHRyX19vdXRfXzsKKyAgICBzaG9ydCBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBkYXRhUHRyX19lcnJvcl9fOworICAgIH0KKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIExHZXRDZWxsKGRhdGFQdHJfX291dF9fLCAmZGF0YVB0cl9fbGVuX18sCisgICAgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKKyAgICBmcmVlKGRhdGFQdHJfX291dF9fKTsKICBkYXRhUHRyX19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MUmVjdChMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGNlbGxSZWN0OwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlMUmVjdCgmY2VsbFJlY3QsCi0JICAgICAgdGhlQ2VsbCwKLQkgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNlbGxSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBjZWxsUmVjdDsKKyAgICBQb2ludCB0aGVDZWxsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTFJlY3QoJmNlbGxSZWN0LAorICAgICAgICAgIHRoZUNlbGwsCisgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZjZWxsUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MU2V0Q2VsbChMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICpkYXRhUHRyX19pbl9fOwotCXNob3J0IGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKLQlQb2ludCB0aGVDZWxsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCUxTZXRDZWxsKGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgIHRoZUNlbGwsCi0JICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIHNob3J0IGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQb2ludCB0aGVDZWxsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIExTZXRDZWxsKGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgIHRoZUNlbGwsCisgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTFNldFNlbGVjdChMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIHNldEl0OwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldEl0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlMU2V0U2VsZWN0KHNldEl0LAotCSAgICAgICAgICAgdGhlQ2VsbCwKLQkgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBzZXRJdDsKKyAgICBQb2ludCB0aGVDZWxsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRJdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTFNldFNlbGVjdChzZXRJdCwKKyAgICAgICAgICAgICAgIHRoZUNlbGwsCisgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MRHJhdyhMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCB0aGVDZWxsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTERyYXcodGhlQ2VsbCwKLQkgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMRHJhdyh0aGVDZWxsLAorICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xHZXRDZWxsRGF0YUxvY2F0aW9uKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IG9mZnNldDsKLQlzaG9ydCBsZW47Ci0JUG9pbnQgdGhlQ2VsbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCUxHZXRDZWxsRGF0YUxvY2F0aW9uKCZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgJmxlbiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVDZWxsLAotCSAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIGxlbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IG9mZnNldDsKKyAgICBzaG9ydCBsZW47CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExHZXRDZWxsRGF0YUxvY2F0aW9uKCZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0UG9ydChMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldExpc3RQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RWZXJ0aWNhbFNjcm9sbEJhcihMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sSGFuZGxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdFZlcnRpY2FsU2Nyb2xsQmFyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbEhhbmRsZSBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldExpc3RWZXJ0aWNhbFNjcm9sbEJhcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhcihMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sSGFuZGxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdEhvcml6b250YWxTY3JvbGxCYXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdEhvcml6b250YWxTY3JvbGxCYXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdEFjdGl2ZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdEFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldExpc3RBY3RpdmUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0Q2xpY2tUaW1lKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldExpc3RDbGlja1RpbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldExpc3RDbGlja1RpbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0UmVmQ29uKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldExpc3RSZWZDb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldExpc3RSZWZDb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0RGVmaW5pdGlvbihMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0RGVmaW5pdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldExpc3REZWZpbml0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RVc2VySGFuZGxlKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldExpc3RVc2VySGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdFVzZXJIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdERhdGFIYW5kbGUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGF0YUhhbmRsZSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldExpc3REYXRhSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGF0YUhhbmRsZSBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldExpc3REYXRhSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RGbGFncyhMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPcHRpb25CaXRzIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdEZsYWdzKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPcHRpb25CaXRzIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdEZsYWdzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdFNlbGVjdGlvbkZsYWdzKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9wdGlvbkJpdHMgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0U2VsZWN0aW9uRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9wdGlvbkJpdHMgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0U2VsZWN0aW9uRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9hc19SZXNvdXJjZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBhc19SZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIExpc3RPYmpfbWV0aG9kc1tdID0gewotCXsiTEFkZENvbHVtbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBZGRDb2x1bW4sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvdW50LCBzaG9ydCBjb2xOdW0pIC0+IChzaG9ydCBfcnYpIil9LAotCXsiTEFkZFJvdyIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBZGRSb3csIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvdW50LCBzaG9ydCByb3dOdW0pIC0+IChzaG9ydCBfcnYpIil9LAotCXsiTERlbENvbHVtbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xEZWxDb2x1bW4sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvdW50LCBzaG9ydCBjb2xOdW0pIC0+IE5vbmUiKX0sCi0JeyJMRGVsUm93IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERlbFJvdywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IHJvd051bSkgLT4gTm9uZSIpfSwKLQl7IkxHZXRTZWxlY3QiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MR2V0U2VsZWN0LCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIG5leHQsIFBvaW50IHRoZUNlbGwpIC0+IChCb29sZWFuIF9ydiwgUG9pbnQgdGhlQ2VsbCkiKX0sCi0JeyJMTGFzdENsaWNrIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTExhc3RDbGljaywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUG9pbnQgX3J2KSIpfSwKLQl7IkxOZXh0Q2VsbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xOZXh0Q2VsbCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBoTmV4dCwgQm9vbGVhbiB2TmV4dCwgUG9pbnQgdGhlQ2VsbCkgLT4gKEJvb2xlYW4gX3J2LCBQb2ludCB0aGVDZWxsKSIpfSwKLQl7IkxTaXplIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGxpc3RXaWR0aCwgc2hvcnQgbGlzdEhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkxTZXREcmF3aW5nTW9kZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xTZXREcmF3aW5nTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBkcmF3SXQpIC0+IE5vbmUiKX0sCi0JeyJMU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNjcm9sbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZENvbHMsIHNob3J0IGRSb3dzKSAtPiBOb25lIil9LAotCXsiTEF1dG9TY3JvbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQXV0b1Njcm9sbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiTFVwZGF0ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xVcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24pIC0+IE5vbmUiKX0sCi0JeyJMQWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQWN0aXZhdGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gYWN0KSAtPiBOb25lIil9LAotCXsiTENlbGxTaXplIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTENlbGxTaXplLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBjU2l6ZSkgLT4gTm9uZSIpfSwKLQl7IkxDbGljayIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xDbGljaywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIEV2ZW50TW9kaWZpZXJzIG1vZGlmaWVycykgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkxBZGRUb0NlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQWRkVG9DZWxsLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgZGF0YVB0ciwgUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKLQl7IkxDbHJDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTENsckNlbGwsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCi0JeyJMR2V0Q2VsbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRDZWxsLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgZGF0YVB0ciwgUG9pbnQgdGhlQ2VsbCkgLT4gKEJ1ZmZlciBkYXRhUHRyKSIpfSwKLQl7IkxSZWN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZUNlbGwpIC0+IChSZWN0IGNlbGxSZWN0KSIpfSwKLQl7IkxTZXRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldENlbGwsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiBOb25lIil9LAotCXsiTFNldFNlbGVjdCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xTZXRTZWxlY3QsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gc2V0SXQsIFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCi0JeyJMRHJhdyIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xEcmF3LCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0aGVDZWxsKSAtPiBOb25lIil9LAotCXsiTEdldENlbGxEYXRhTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MR2V0Q2VsbERhdGFMb2NhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gKHNob3J0IG9mZnNldCwgc2hvcnQgbGVuKSIpfSwKLQl7IkdldExpc3RQb3J0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdFBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCi0JeyJHZXRMaXN0VmVydGljYWxTY3JvbGxCYXIiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0VmVydGljYWxTY3JvbGxCYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xIYW5kbGUgX3J2KSIpfSwKLQl7IkdldExpc3RIb3Jpem9udGFsU2Nyb2xsQmFyIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdEhvcml6b250YWxTY3JvbGxCYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xIYW5kbGUgX3J2KSIpfSwKLQl7IkdldExpc3RBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0QWN0aXZlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRMaXN0Q2xpY2tUaW1lIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdENsaWNrVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJHZXRMaXN0UmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdFJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJHZXRMaXN0RGVmaW5pdGlvbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3REZWZpbml0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldExpc3RVc2VySGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdFVzZXJIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0TGlzdERhdGFIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0RGF0YUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRGF0YUhhbmRsZSBfcnYpIil9LAotCXsiR2V0TGlzdEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdEZsYWdzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChPcHRpb25CaXRzIF9ydikiKX0sCi0JeyJHZXRMaXN0U2VsZWN0aW9uRmxhZ3MiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0U2VsZWN0aW9uRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9wdGlvbkJpdHMgX3J2KSIpfSwKLQl7ImFzX1Jlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfYXNfUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTEFkZENvbHVtbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBZGRDb2x1bW4sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGNvdW50LCBzaG9ydCBjb2xOdW0pIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiTEFkZFJvdyIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBZGRSb3csIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGNvdW50LCBzaG9ydCByb3dOdW0pIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiTERlbENvbHVtbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xEZWxDb2x1bW4sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGNvdW50LCBzaG9ydCBjb2xOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJMRGVsUm93IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERlbFJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IHJvd051bSkgLT4gTm9uZSIpfSwKKyAgICB7IkxHZXRTZWxlY3QiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MR2V0U2VsZWN0LCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIG5leHQsIFBvaW50IHRoZUNlbGwpIC0+IChCb29sZWFuIF9ydiwgUG9pbnQgdGhlQ2VsbCkiKX0sCisgICAgeyJMTGFzdENsaWNrIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTExhc3RDbGljaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUG9pbnQgX3J2KSIpfSwKKyAgICB7IkxOZXh0Q2VsbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xOZXh0Q2VsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBoTmV4dCwgQm9vbGVhbiB2TmV4dCwgUG9pbnQgdGhlQ2VsbCkgLT4gKEJvb2xlYW4gX3J2LCBQb2ludCB0aGVDZWxsKSIpfSwKKyAgICB7IkxTaXplIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGxpc3RXaWR0aCwgc2hvcnQgbGlzdEhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7IkxTZXREcmF3aW5nTW9kZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xTZXREcmF3aW5nTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBkcmF3SXQpIC0+IE5vbmUiKX0sCisgICAgeyJMU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNjcm9sbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZENvbHMsIHNob3J0IGRSb3dzKSAtPiBOb25lIil9LAorICAgIHsiTEF1dG9TY3JvbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQXV0b1Njcm9sbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTFVwZGF0ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xVcGRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJMQWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQWN0aXZhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gYWN0KSAtPiBOb25lIil9LAorICAgIHsiTENlbGxTaXplIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTENlbGxTaXplLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBjU2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxDbGljayIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xDbGljaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIEV2ZW50TW9kaWZpZXJzIG1vZGlmaWVycykgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkxBZGRUb0NlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQWRkVG9DZWxsLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgZGF0YVB0ciwgUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKKyAgICB7IkxDbHJDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTENsckNlbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCisgICAgeyJMR2V0Q2VsbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRDZWxsLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgZGF0YVB0ciwgUG9pbnQgdGhlQ2VsbCkgLT4gKEJ1ZmZlciBkYXRhUHRyKSIpfSwKKyAgICB7IkxSZWN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRoZUNlbGwpIC0+IChSZWN0IGNlbGxSZWN0KSIpfSwKKyAgICB7IkxTZXRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldENlbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiBOb25lIil9LAorICAgIHsiTFNldFNlbGVjdCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xTZXRTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gc2V0SXQsIFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCisgICAgeyJMRHJhdyIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xEcmF3LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0aGVDZWxsKSAtPiBOb25lIil9LAorICAgIHsiTEdldENlbGxEYXRhTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MR2V0Q2VsbERhdGFMb2NhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gKHNob3J0IG9mZnNldCwgc2hvcnQgbGVuKSIpfSwKKyAgICB7IkdldExpc3RQb3J0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdFBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCisgICAgeyJHZXRMaXN0VmVydGljYWxTY3JvbGxCYXIiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0VmVydGljYWxTY3JvbGxCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldExpc3RIb3Jpem9udGFsU2Nyb2xsQmFyIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdEhvcml6b250YWxTY3JvbGxCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldExpc3RBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0QWN0aXZlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRMaXN0Q2xpY2tUaW1lIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdENsaWNrVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJHZXRMaXN0UmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJHZXRMaXN0RGVmaW5pdGlvbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3REZWZpbml0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldExpc3RVc2VySGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdFVzZXJIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TGlzdERhdGFIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0RGF0YUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRGF0YUhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TGlzdEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChPcHRpb25CaXRzIF9ydikiKX0sCisgICAgeyJHZXRMaXN0U2VsZWN0aW9uRmxhZ3MiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0U2VsZWN0aW9uRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE9wdGlvbkJpdHMgX3J2KSIpfSwKKyAgICB7ImFzX1Jlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfYXNfUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX2dldF9saXN0RmxhZ3MoTGlzdE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RGbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylHZXRMaXN0RmxhZ3Moc2VsZi0+b2JfaXRzZWxmKSAmIDB4ZmYpOwogfQogCiBzdGF0aWMgaW50IExpc3RPYmpfc2V0X2xpc3RGbGFncyhMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJCIiwgJigqc2VsZi0+b2JfaXRzZWxmKS0+bGlzdEZsYWdzKSkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2UodiwgIkIiLCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5saXN0RmxhZ3MpKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9nZXRfc2VsRmxhZ3MoTGlzdE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RTZWxlY3Rpb25GbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylHZXRMaXN0U2VsZWN0aW9uRmxhZ3Moc2VsZi0+b2JfaXRzZWxmKSAmIDB4ZmYpOwogfQogCiBzdGF0aWMgaW50IExpc3RPYmpfc2V0X3NlbEZsYWdzKExpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCWlmICghUHlBcmdfUGFyc2UodiwgIkIiLCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxGbGFncykpIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJCIiwgJigqc2VsZi0+b2JfaXRzZWxmKS0+c2VsRmxhZ3MpKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9nZXRfY2VsbFNpemUoTGlzdE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKTsKIH0KIAogc3RhdGljIGludCBMaXN0T2JqX3NldF9jZWxsU2l6ZShMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldFBvaW50LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5jZWxsU2l6ZSkpIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldFBvaW50LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5jZWxsU2l6ZSkpIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIExpc3RPYmpfZ2V0c2V0bGlzdFtdID0gewotCXsibGlzdEZsYWdzIiwgKGdldHRlcilMaXN0T2JqX2dldF9saXN0RmxhZ3MsIChzZXR0ZXIpTGlzdE9ial9zZXRfbGlzdEZsYWdzLCBOVUxMfSwKLQl7InNlbEZsYWdzIiwgKGdldHRlcilMaXN0T2JqX2dldF9zZWxGbGFncywgKHNldHRlcilMaXN0T2JqX3NldF9zZWxGbGFncywgTlVMTH0sCi0JeyJjZWxsU2l6ZSIsIChnZXR0ZXIpTGlzdE9ial9nZXRfY2VsbFNpemUsIChzZXR0ZXIpTGlzdE9ial9zZXRfY2VsbFNpemUsIE5VTEx9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7Imxpc3RGbGFncyIsIChnZXR0ZXIpTGlzdE9ial9nZXRfbGlzdEZsYWdzLCAoc2V0dGVyKUxpc3RPYmpfc2V0X2xpc3RGbGFncywgTlVMTH0sCisgICAgeyJzZWxGbGFncyIsIChnZXR0ZXIpTGlzdE9ial9nZXRfc2VsRmxhZ3MsIChzZXR0ZXIpTGlzdE9ial9zZXRfc2VsRmxhZ3MsIE5VTEx9LAorICAgIHsiY2VsbFNpemUiLCAoZ2V0dGVyKUxpc3RPYmpfZ2V0X2NlbGxTaXplLCAoc2V0dGVyKUxpc3RPYmpfc2V0X2NlbGxTaXplLCBOVUxMfSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTc0Miw2MSArNzQyLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JTGlzdEhhbmRsZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIExpc3RIYW5kbGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTGlzdE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKExpc3RPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTGlzdE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKExpc3RPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgTGlzdE9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBMaXN0X1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0xpc3QuTGlzdCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKExpc3RPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBMaXN0T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIExpc3RPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIExpc3RPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIExpc3RPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JTGlzdE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlMaXN0T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUxpc3RPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUxpc3RPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JTGlzdE9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUxpc3RPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9MaXN0Lkxpc3QiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihMaXN0T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgTGlzdE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBMaXN0T2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBMaXN0T2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBMaXN0T2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIExpc3RPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgTGlzdE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBMaXN0T2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBMaXN0T2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIExpc3RPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBMaXN0T2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIExpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtODA0LDI2MyArODA0LDI2MyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RfQ3JlYXRlQ3VzdG9tTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByVmlldzsKLQlSZWN0IGRhdGFCb3VuZHM7Ci0JUG9pbnQgY2VsbFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgclZpZXc7CisgICAgUmVjdCBkYXRhQm91bmRzOworICAgIFBvaW50IGNlbGxTaXplOwogCi0JUHlPYmplY3QgKmxpc3REZWZGdW5jOwotCUxpc3REZWZTcGVjIHRoZVNwZWM7Ci0JV2luZG93UHRyIHRoZVdpbmRvdzsKLQlCb29sZWFuIGRyYXdJdDsKLQlCb29sZWFuIGhhc0dyb3c7Ci0JQm9vbGVhbiBzY3JvbGxIb3JpejsKLQlCb29sZWFuIHNjcm9sbFZlcnQ7Ci0JTGlzdEhhbmRsZSBvdXRMaXN0OworICAgIFB5T2JqZWN0ICpsaXN0RGVmRnVuYzsKKyAgICBMaXN0RGVmU3BlYyB0aGVTcGVjOworICAgIFdpbmRvd1B0ciB0aGVXaW5kb3c7CisgICAgQm9vbGVhbiBkcmF3SXQ7CisgICAgQm9vbGVhbiBoYXNHcm93OworICAgIEJvb2xlYW4gc2Nyb2xsSG9yaXo7CisgICAgQm9vbGVhbiBzY3JvbGxWZXJ0OworICAgIExpc3RIYW5kbGUgb3V0TGlzdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJihpTylPJmJiYmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmclZpZXcsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkYXRhQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNlbGxTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlU3BlYy5kZWZUeXBlLCAmbGlzdERlZkZ1bmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmZHJhd0l0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaGFzR3JvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbEhvcml6LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsVmVydCkpCi0JICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYoaU8pTyZiYmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZGF0YUJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZjZWxsU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVNwZWMuZGVmVHlwZSwgJmxpc3REZWZGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyYXdJdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc0dyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxIb3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbFZlcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogCi0JLyogQ2FyYm9uIGFwcGxpY2F0aW9ucyB1c2UgdGhlIENyZWF0ZUN1c3RvbUxpc3QgQVBJICovCi0JdGhlU3BlYy51LnVzZXJQcm9jID0gbXlMaXN0RGVmRnVuY3Rpb25VUFA7Ci0JQ3JlYXRlQ3VzdG9tTGlzdCgmclZpZXcsCi0JICAgICAgICAgICAgICAgICAmZGF0YUJvdW5kcywKLQkgICAgICAgICAgICAgICAgIGNlbGxTaXplLAotCSAgICAgICAgICAgICAgICAgJnRoZVNwZWMsCi0JICAgICAgICAgICAgICAgICB0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICBkcmF3SXQsCi0JICAgICAgICAgICAgICAgICBoYXNHcm93LAotCSAgICAgICAgICAgICAgICAgc2Nyb2xsSG9yaXosCi0JICAgICAgICAgICAgICAgICBzY3JvbGxWZXJ0LAotCSAgICAgICAgICAgICAgICAgJm91dExpc3QpOworICAgIC8qIENhcmJvbiBhcHBsaWNhdGlvbnMgdXNlIHRoZSBDcmVhdGVDdXN0b21MaXN0IEFQSSAqLworICAgIHRoZVNwZWMudS51c2VyUHJvYyA9IG15TGlzdERlZkZ1bmN0aW9uVVBQOworICAgIENyZWF0ZUN1c3RvbUxpc3QoJnJWaWV3LAorICAgICAgICAgICAgICAgICAgICAgJmRhdGFCb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICBjZWxsU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgdGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgZHJhd0l0LAorICAgICAgICAgICAgICAgICAgICAgaGFzR3JvdywKKyAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEhvcml6LAorICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVmVydCwKKyAgICAgICAgICAgICAgICAgICAgICZvdXRMaXN0KTsKIAogCi0JX3JlcyA9IExpc3RPYmpfTmV3KG91dExpc3QpOwotCWlmIChfcmVzID09IE5VTEwpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYobGlzdERlZkZ1bmMpOwotCSgoTGlzdE9iamVjdCopX3JlcyktPm9iX2xkZWZfZnVuYyA9IGxpc3REZWZGdW5jOwotCXJldHVybiBfcmVzOworICAgIF9yZXMgPSBMaXN0T2JqX05ldyhvdXRMaXN0KTsKKyAgICBpZiAoX3JlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYobGlzdERlZkZ1bmMpOworICAgICgoTGlzdE9iamVjdCopX3JlcyktPm9iX2xkZWZfZnVuYyA9IGxpc3REZWZGdW5jOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RfTE5ldyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBfcnY7Ci0JUmVjdCByVmlldzsKLQlSZWN0IGRhdGFCb3VuZHM7Ci0JUG9pbnQgY1NpemU7Ci0Jc2hvcnQgdGhlUHJvYzsKLQlXaW5kb3dQdHIgdGhlV2luZG93OwotCUJvb2xlYW4gZHJhd0l0OwotCUJvb2xlYW4gaGFzR3JvdzsKLQlCb29sZWFuIHNjcm9sbEhvcml6OwotCUJvb2xlYW4gc2Nyb2xsVmVydDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoTyZiYmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJWaWV3LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZGF0YUJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZjU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZVByb2MsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmZHJhd0l0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaGFzR3JvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbEhvcml6LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsVmVydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExOZXcoJnJWaWV3LAotCSAgICAgICAgICAgJmRhdGFCb3VuZHMsCi0JICAgICAgICAgICBjU2l6ZSwKLQkgICAgICAgICAgIHRoZVByb2MsCi0JICAgICAgICAgICB0aGVXaW5kb3csCi0JICAgICAgICAgICBkcmF3SXQsCi0JICAgICAgICAgICBoYXNHcm93LAotCSAgICAgICAgICAgc2Nyb2xsSG9yaXosCi0JICAgICAgICAgICBzY3JvbGxWZXJ0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIF9ydjsKKyAgICBSZWN0IHJWaWV3OworICAgIFJlY3QgZGF0YUJvdW5kczsKKyAgICBQb2ludCBjU2l6ZTsKKyAgICBzaG9ydCB0aGVQcm9jOworICAgIFdpbmRvd1B0ciB0aGVXaW5kb3c7CisgICAgQm9vbGVhbiBkcmF3SXQ7CisgICAgQm9vbGVhbiBoYXNHcm93OworICAgIEJvb2xlYW4gc2Nyb2xsSG9yaXo7CisgICAgQm9vbGVhbiBzY3JvbGxWZXJ0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhPJmJiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmclZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkYXRhQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkcmF3SXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXNHcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsSG9yaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxWZXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE5ldygmclZpZXcsCisgICAgICAgICAgICAgICAmZGF0YUJvdW5kcywKKyAgICAgICAgICAgICAgIGNTaXplLAorICAgICAgICAgICAgICAgdGhlUHJvYywKKyAgICAgICAgICAgICAgIHRoZVdpbmRvdywKKyAgICAgICAgICAgICAgIGRyYXdJdCwKKyAgICAgICAgICAgICAgIGhhc0dyb3csCisgICAgICAgICAgICAgICBzY3JvbGxIb3JpeiwKKyAgICAgICAgICAgICAgIHNjcm9sbFZlcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0Vmlld0JvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBsaXN0OwotCVJlY3QgdmlldzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXcpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRMaXN0Vmlld0JvdW5kcyhsaXN0LAotCSAgICAgICAgICAgICAgICAgICZ2aWV3KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIExpc3RIYW5kbGUgbGlzdDsKKyAgICBSZWN0IHZpZXc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ2aWV3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TGlzdFZpZXdCb3VuZHMobGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAmdmlldyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RfU2V0TGlzdFBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUxpc3RIYW5kbGUgbGlzdDsKLQlDR3JhZlB0ciBwb3J0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TGlzdFBvcnQobGlzdCwKLQkgICAgICAgICAgICBwb3J0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIExpc3RIYW5kbGUgbGlzdDsKKyAgICBDR3JhZlB0ciBwb3J0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TGlzdFBvcnQobGlzdCwKKyAgICAgICAgICAgICAgICBwb3J0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0Q2VsbEluZGVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBsaXN0OwotCVBvaW50IGluZGVudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpbmRlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRMaXN0Q2VsbEluZGVudChsaXN0LAotCSAgICAgICAgICAgICAgICAgICZpbmRlbnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIFBvaW50IGluZGVudDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpbmRlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0Q2VsbEluZGVudChsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICZpbmRlbnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X1NldExpc3RDbGlja1RpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUxpc3RIYW5kbGUgbGlzdDsKLQlTSW50MzIgdGltZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSkpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RDbGlja1RpbWUobGlzdCwKLQkgICAgICAgICAgICAgICAgIHRpbWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIFNJbnQzMiB0aW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TGlzdENsaWNrVGltZShsaXN0LAorICAgICAgICAgICAgICAgICAgICAgdGltZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RfU2V0TGlzdFJlZkNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBsaXN0OwotCVNJbnQzMiByZWZDb247Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RSZWZDb24obGlzdCwKLQkgICAgICAgICAgICAgIHJlZkNvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgU0ludDMyIHJlZkNvbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TGlzdFJlZkNvbihsaXN0LAorICAgICAgICAgICAgICAgICAgcmVmQ29uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0VXNlckhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBsaXN0OwotCUhhbmRsZSB1c2VySGFuZGxlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVzZXJIYW5kbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRMaXN0VXNlckhhbmRsZShsaXN0LAotCSAgICAgICAgICAgICAgICAgIHVzZXJIYW5kbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIEhhbmRsZSB1c2VySGFuZGxlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVzZXJIYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0VXNlckhhbmRsZShsaXN0LAorICAgICAgICAgICAgICAgICAgICAgIHVzZXJIYW5kbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X1NldExpc3RGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBsaXN0OwotCU9wdGlvbkJpdHMgbGlzdEZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaXN0RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRMaXN0RmxhZ3MobGlzdCwKLQkgICAgICAgICAgICAgbGlzdEZsYWdzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIExpc3RIYW5kbGUgbGlzdDsKKyAgICBPcHRpb25CaXRzIGxpc3RGbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGlzdEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TGlzdEZsYWdzKGxpc3QsCisgICAgICAgICAgICAgICAgIGxpc3RGbGFncyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RfU2V0TGlzdFNlbGVjdGlvbkZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JT3B0aW9uQml0cyBzZWxlY3Rpb25GbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRMaXN0U2VsZWN0aW9uRmxhZ3MobGlzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRmxhZ3MpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIE9wdGlvbkJpdHMgc2VsZWN0aW9uRmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TGlzdFNlbGVjdGlvbkZsYWdzKGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkZsYWdzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9hc19MaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlIYW5kbGUgaDsKLQlMaXN0T2JqZWN0ICpsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWwgPSAoTGlzdE9iamVjdCAqKUxpc3RPYmpfTmV3KGFzX0xpc3QoaCkpOwotCWwtPm9iX211c3RfYmVfZGlzcG9zZWQgPSAwOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPIiwgbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgSGFuZGxlIGg7CisgICAgTGlzdE9iamVjdCAqbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGwgPSAoTGlzdE9iamVjdCAqKUxpc3RPYmpfTmV3KGFzX0xpc3QoaCkpOworICAgIGwtPm9iX211c3RfYmVfZGlzcG9zZWQgPSAwOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPIiwgbCk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgTGlzdF9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJDcmVhdGVDdXN0b21MaXN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfQ3JlYXRlQ3VzdG9tTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByVmlldywgUmVjdCBkYXRhQm91bmRzLCBQb2ludCBjZWxsU2l6ZSwgTGlzdERlZlNwZWMgdGhlU3BlYywgV2luZG93UHRyIHRoZVdpbmRvdywgQm9vbGVhbiBkcmF3SXQsIEJvb2xlYW4gaGFzR3JvdywgQm9vbGVhbiBzY3JvbGxIb3JpeiwgQm9vbGVhbiBzY3JvbGxWZXJ0KSAtPiAoTGlzdEhhbmRsZSBvdXRMaXN0KSIpfSwKLQl7IkxOZXciLCAoUHlDRnVuY3Rpb24pTGlzdF9MTmV3LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHJWaWV3LCBSZWN0IGRhdGFCb3VuZHMsIFBvaW50IGNTaXplLCBzaG9ydCB0aGVQcm9jLCBXaW5kb3dQdHIgdGhlV2luZG93LCBCb29sZWFuIGRyYXdJdCwgQm9vbGVhbiBoYXNHcm93LCBCb29sZWFuIHNjcm9sbEhvcml6LCBCb29sZWFuIHNjcm9sbFZlcnQpIC0+IChMaXN0SGFuZGxlIF9ydikiKX0sCi0JeyJTZXRMaXN0Vmlld0JvdW5kcyIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RWaWV3Qm91bmRzLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIFJlY3QgdmlldykgLT4gTm9uZSIpfSwKLQl7IlNldExpc3RQb3J0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgQ0dyYWZQdHIgcG9ydCkgLT4gTm9uZSIpfSwKLQl7IlNldExpc3RDZWxsSW5kZW50IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdENlbGxJbmRlbnQsIDEsCi0JIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgUG9pbnQgaW5kZW50KSAtPiBOb25lIil9LAotCXsiU2V0TGlzdENsaWNrVGltZSIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RDbGlja1RpbWUsIDEsCi0JIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgU0ludDMyIHRpbWUpIC0+IE5vbmUiKX0sCi0JeyJTZXRMaXN0UmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBTSW50MzIgcmVmQ29uKSAtPiBOb25lIil9LAotCXsiU2V0TGlzdFVzZXJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0VXNlckhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBIYW5kbGUgdXNlckhhbmRsZSkgLT4gTm9uZSIpfSwKLQl7IlNldExpc3RGbGFncyIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBPcHRpb25CaXRzIGxpc3RGbGFncykgLT4gTm9uZSIpfSwKLQl7IlNldExpc3RTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RTZWxlY3Rpb25GbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBPcHRpb25CaXRzIHNlbGVjdGlvbkZsYWdzKSAtPiBOb25lIil9LAotCXsiYXNfTGlzdCIsIChQeUNGdW5jdGlvbilMaXN0X2FzX0xpc3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlc291cmNlKS0+TGlzdC5cblJldHVybnMgTGlzdCBvYmplY3QgKHdoaWNoIGlzIG5vdCBhdXRvLWZyZWVkISkiKX0sCisgICAgeyJDcmVhdGVDdXN0b21MaXN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfQ3JlYXRlQ3VzdG9tTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByVmlldywgUmVjdCBkYXRhQm91bmRzLCBQb2ludCBjZWxsU2l6ZSwgTGlzdERlZlNwZWMgdGhlU3BlYywgV2luZG93UHRyIHRoZVdpbmRvdywgQm9vbGVhbiBkcmF3SXQsIEJvb2xlYW4gaGFzR3JvdywgQm9vbGVhbiBzY3JvbGxIb3JpeiwgQm9vbGVhbiBzY3JvbGxWZXJ0KSAtPiAoTGlzdEhhbmRsZSBvdXRMaXN0KSIpfSwKKyAgICB7IkxOZXciLCAoUHlDRnVuY3Rpb24pTGlzdF9MTmV3LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJWaWV3LCBSZWN0IGRhdGFCb3VuZHMsIFBvaW50IGNTaXplLCBzaG9ydCB0aGVQcm9jLCBXaW5kb3dQdHIgdGhlV2luZG93LCBCb29sZWFuIGRyYXdJdCwgQm9vbGVhbiBoYXNHcm93LCBCb29sZWFuIHNjcm9sbEhvcml6LCBCb29sZWFuIHNjcm9sbFZlcnQpIC0+IChMaXN0SGFuZGxlIF9ydikiKX0sCisgICAgeyJTZXRMaXN0Vmlld0JvdW5kcyIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RWaWV3Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIFJlY3QgdmlldykgLT4gTm9uZSIpfSwKKyAgICB7IlNldExpc3RQb3J0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgQ0dyYWZQdHIgcG9ydCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldExpc3RDZWxsSW5kZW50IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdENlbGxJbmRlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgUG9pbnQgaW5kZW50KSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdENsaWNrVGltZSIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RDbGlja1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgU0ludDMyIHRpbWUpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRMaXN0UmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBTSW50MzIgcmVmQ29uKSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdFVzZXJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0VXNlckhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBIYW5kbGUgdXNlckhhbmRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldExpc3RGbGFncyIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBPcHRpb25CaXRzIGxpc3RGbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IlNldExpc3RTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RTZWxlY3Rpb25GbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBPcHRpb25CaXRzIHNlbGVjdGlvbkZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiYXNfTGlzdCIsIChQeUNGdW5jdGlvbilMaXN0X2FzX0xpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc291cmNlKS0+TGlzdC5cblJldHVybnMgTGlzdCBvYmplY3QgKHdoaWNoIGlzIG5vdCBhdXRvLWZyZWVkISkiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNpZm5kZWYgX19MUDY0X18KQEAgLTEwNzQsNjUgKzEwNzQsNjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgU0ludDE2IGRhdGFMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIExpc3RIYW5kbGUgdGhlTGlzdCkKIHsKLSAgICAgICAgUHlPYmplY3QgKmxpc3REZWZGdW5jLCAqYXJncywgKnJ2PU5VTEw7Ci0gICAgICAgIExpc3RPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKmxpc3REZWZGdW5jLCAqYXJncywgKnJ2PU5VTEw7CisgICAgTGlzdE9iamVjdCAqc2VsZjsKIAotICAgICAgICBzZWxmID0gKExpc3RPYmplY3QqKUdldExpc3RSZWZDb24odGhlTGlzdCk7Ci0gICAgICAgIGlmIChzZWxmID09IE5VTEwgfHwgc2VsZi0+b2JfaXRzZWxmICE9IHRoZUxpc3QpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KLSAgICAgICAgbGlzdERlZkZ1bmMgPSBzZWxmLT5vYl9sZGVmX2Z1bmM7Ci0gICAgICAgIGlmIChsaXN0RGVmRnVuYyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybjsgIC8qIG5vdGhpbmcgd2UgY2FuIGRvICovCi0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJoYk8mTyZoaE8iLCBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsIGNlbGxSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgdGhlQ2VsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZik7Ci0gICAgICAgIGlmIChhcmdzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KGxpc3REZWZGdW5jLCBhcmdzKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ2ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiZXJyb3IgaW4gbGlzdCBkZWZpbml0aW9uIGNhbGxiYWNrOlxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICB9CisgICAgc2VsZiA9IChMaXN0T2JqZWN0KilHZXRMaXN0UmVmQ29uKHRoZUxpc3QpOworICAgIGlmIChzZWxmID09IE5VTEwgfHwgc2VsZi0+b2JfaXRzZWxmICE9IHRoZUxpc3QpCisgICAgICAgIHJldHVybjsgIC8qIG5vdGhpbmcgd2UgY2FuIGRvICovCisgICAgbGlzdERlZkZ1bmMgPSBzZWxmLT5vYl9sZGVmX2Z1bmM7CisgICAgaWYgKGxpc3REZWZGdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybjsgIC8qIG5vdGhpbmcgd2UgY2FuIGRvICovCisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoImhiTyZPJmhoTyIsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsIGNlbGxSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKKyAgICBpZiAoYXJncyAhPSBOVUxMKSB7CisgICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QobGlzdERlZkZ1bmMsIGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgfQorICAgIGlmIChydiA9PSBOVUxMKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJlcnJvciBpbiBsaXN0IGRlZmluaXRpb24gY2FsbGJhY2s6XG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgIH0KIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKIHZvaWQgaW5pdF9MaXN0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JbXlMaXN0RGVmRnVuY3Rpb25VUFAgPSBOZXdMaXN0RGVmVVBQKChMaXN0RGVmUHJvY1B0cilteUxpc3REZWZGdW5jdGlvbik7CisgICAgbXlMaXN0RGVmRnVuY3Rpb25VUFAgPSBOZXdMaXN0RGVmVVBQKChMaXN0RGVmUHJvY1B0cilteUxpc3REZWZGdW5jdGlvbik7CiAKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhMaXN0SGFuZGxlLCBMaXN0T2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKExpc3RIYW5kbGUsIExpc3RPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoTGlzdEhhbmRsZSwgTGlzdE9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChMaXN0SGFuZGxlLCBMaXN0T2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfTGlzdCIsIExpc3RfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9MaXN0IiwgTGlzdF9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlMaXN0X0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoTGlzdF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIExpc3RfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlMaXN0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZMaXN0X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmTGlzdF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxpc3QiLCAoUHlPYmplY3QgKikmTGlzdF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkxpc3RfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMaXN0VHlwZSIsIChQeU9iamVjdCAqKSZMaXN0X1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIExpc3RfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChMaXN0X0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTGlzdF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIExpc3RfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkxpc3RfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZMaXN0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTGlzdCIsIChQeU9iamVjdCAqKSZMaXN0X1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmTGlzdF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxpc3RUeXBlIiwgKFB5T2JqZWN0ICopJkxpc3RfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvbWVudS9fTWVudW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvbWVudS9fTWVudW1vZHVsZS5jCmluZGV4IDY2ZWJmNzkuLmRiYjA3NWMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL21lbnUvX01lbnVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9tZW51L19NZW51bW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM1LDIxICszNSwyMSBAQAogLyogQWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiBNZW51T2JqX05ldywgd2hpY2ggcmV0dXJucyBOb25lIGZvciBOVUxMIGFyZ3VtZW50ICovCiBQeU9iamVjdCAqT3B0TWVudU9ial9OZXcoTWVudVJlZiBpdHNlbGYpCiB7Ci0gICAgICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVudU9ial9OZXcoaXRzZWxmKTsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIE1lbnVPYmpfTmV3KGl0c2VsZik7CiB9CiAKIC8qIEFsdGVybmF0aXZlIHZlcnNpb24gb2YgTWVudU9ial9Db252ZXJ0LCB3aGljaCByZXR1cm5zIE5VTEwgZm9yIGEgTm9uZSBhcmd1bWVudCAqLwogaW50IE9wdE1lbnVPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTWVudVJlZiAqcF9pdHNlbGYpCiB7Ci0gICAgICAgIGlmICggdiA9PSBQeV9Ob25lICkgewotICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lbnVPYmpfQ29udmVydCh2LCBwX2l0c2VsZik7CisgICAgaWYgKCB2ID09IFB5X05vbmUgKSB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gTWVudU9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0Vycm9yOwpAQCAtNjEsMjQ2OSArNjEsMjQ2OSBAQAogI2RlZmluZSBNZW51T2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJk1lbnVfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmTWVudV9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgTWVudU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCU1lbnVIYW5kbGUgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBNZW51SGFuZGxlIG9iX2l0c2VsZjsKIH0gTWVudU9iamVjdDsKIAogUHlPYmplY3QgKk1lbnVPYmpfTmV3KE1lbnVIYW5kbGUgaXRzZWxmKQogewotCU1lbnVPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKE1lbnVPYmplY3QsICZNZW51X1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBNZW51T2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhNZW51T2JqZWN0LCAmTWVudV9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBNZW51T2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIE1lbnVIYW5kbGUgKnBfaXRzZWxmKQogewotCWlmICghTWVudU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNZW51IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKE1lbnVPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghTWVudU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNZW51IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKE1lbnVPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBNZW51T2JqX2RlYWxsb2MoTWVudU9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EaXNwb3NlTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERpc3Bvc2VNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZU1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlTWVudShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VNZW51KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0NhbGNNZW51U2l6ZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENhbGNNZW51U2l6ZQotCVB5TWFjX1BSRUNIRUNLKENhbGNNZW51U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FsY01lbnVTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDYWxjTWVudVNpemUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDYWxjTWVudVNpemUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ291bnRNZW51SXRlbXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDE2IF9ydjsKICNpZm5kZWYgQ291bnRNZW51SXRlbXMKLQlQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ291bnRNZW51SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvdW50TWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudE1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVGb250KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IG91dEZvbnRJRDsKLQlVSW50MTYgb3V0Rm9udFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IG91dEZvbnRJRDsKKyAgICBVSW50MTYgb3V0Rm9udFNpemU7CiAjaWZuZGVmIEdldE1lbnVGb250Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUZvbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVGb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgJm91dEZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgJm91dEZvbnRTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoSCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Rm9udElELAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVGb250KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICZvdXRGb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgICZvdXRGb250U2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGb250U2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51Rm9udChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNJbnQxNiBpbkZvbnRJRDsKLQlVSW50MTYgaW5Gb250U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgaW5Gb250SUQ7CisgICAgVUludDE2IGluRm9udFNpemU7CiAjaWZuZGVmIFNldE1lbnVGb250Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUZvbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVGb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250U2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51Rm9udChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgaW5Gb250U2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVGb250KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICBpbkZvbnRTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGV4Y2x1ZGVzTWFyazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIGV4Y2x1ZGVzTWFyazsKICNpZm5kZWYgU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbgotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZleGNsdWRlc01hcmspKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVzTWFyayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZleGNsdWRlc01hcmspKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVzTWFyayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc1ZhbGlkTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzVmFsaWRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzVmFsaWRNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1ZhbGlkTWVudShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNWYWxpZE1lbnUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51UmV0YWluQ291bnQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSXRlbUNvdW50IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSXRlbUNvdW50IF9ydjsKICNpZm5kZWYgR2V0TWVudVJldGFpbkNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudVJldGFpbkNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51UmV0YWluQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lbnVSZXRhaW5Db3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudVJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfUmV0YWluTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBSZXRhaW5NZW51Ci0JUHlNYWNfUFJFQ0hFQ0soUmV0YWluTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmV0YWluTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJldGFpbk1lbnUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXRhaW5NZW51KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfUmVsZWFzZU1lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgUmVsZWFzZU1lbnUKLQlQeU1hY19QUkVDSEVDSyhSZWxlYXNlTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVsZWFzZU1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWxlYXNlTWVudShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbGVhc2VNZW51KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfRHVwbGljYXRlTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgb3V0TWVudTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIG91dE1lbnU7CiAjaWZuZGVmIER1cGxpY2F0ZU1lbnUKLQlQeU1hY19QUkVDSEVDSyhEdXBsaWNhdGVNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEdXBsaWNhdGVNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHVwbGljYXRlTWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHVwbGljYXRlTWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ29weU1lbnVUaXRsZUFzQ0ZTdHJpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBvdXRTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nOwogI2lmbmRlZiBDb3B5TWVudVRpdGxlQXNDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENvcHlNZW51VGl0bGVBc0NGU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TWVudVRpdGxlQXNDRlN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvcHlNZW51VGl0bGVBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFN0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5TWVudVRpdGxlQXNDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CiAjaWZuZGVmIFNldE1lbnVUaXRsZVdpdGhDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVUaXRsZVdpdGhDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVUaXRsZVdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVUaXRsZVdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW52YWxpZGF0ZU1lbnVTaXplKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIEludmFsaWRhdGVNZW51U2l6ZQotCVB5TWFjX1BSRUNIRUNLKEludmFsaWRhdGVNZW51U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52YWxpZGF0ZU1lbnVTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW52YWxpZGF0ZU1lbnVTaXplKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW52YWxpZGF0ZU1lbnVTaXplKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSXNNZW51U2l6ZUludmFsaWQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc01lbnVTaXplSW52YWxpZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudVNpemVJbnZhbGlkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc01lbnVTaXplSW52YWxpZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNZW51U2l6ZUludmFsaWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudVNpemVJbnZhbGlkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfTWFjQXBwZW5kTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgZGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IGRhdGE7CiAjaWZuZGVmIE1hY0FwcGVuZE1lbnUKLQlQeU1hY19QUkVDSEVDSyhNYWNBcHBlbmRNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNBcHBlbmRNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjQXBwZW5kTWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgZGF0YSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjQXBwZW5kTWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgZGF0YSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW5zZXJ0UmVzTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgYWZ0ZXJJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CisgICAgc2hvcnQgYWZ0ZXJJdGVtOwogI2lmbmRlZiBJbnNlcnRSZXNNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0UmVzTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0UmVzTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXJ0UmVzTWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICAgIGFmdGVySXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhZnRlckl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnNlcnRSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICB0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9BcHBlbmRSZXNNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlc1R5cGUgdGhlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBBcHBlbmRSZXNNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soQXBwZW5kUmVzTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQXBwZW5kUmVzTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlBcHBlbmRSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICB0aGVUeXBlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQXBwZW5kUmVzTWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgdGhlVHlwZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfTWFjSW5zZXJ0TWVudUl0ZW0oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RyMjU1IGl0ZW1TdHJpbmc7Ci0Jc2hvcnQgYWZ0ZXJJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgaXRlbVN0cmluZzsKKyAgICBzaG9ydCBhZnRlckl0ZW07CiAjaWZuZGVmIE1hY0luc2VydE1lbnVJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXJ0TWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0luc2VydE1lbnVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaXRlbVN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCi0JCXJldHVybiBOVUxMOwotCU1hY0luc2VydE1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZywKLQkgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGl0ZW1TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhZnRlckl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNJbnNlcnRNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGl0ZW1TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EZWxldGVNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOwogI2lmbmRlZiBEZWxldGVNZW51SXRlbQotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZU1lbnVJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVNZW51SXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlEZWxldGVNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIGl0ZW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEZWxldGVNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0luc2VydEZvbnRSZXNNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGFmdGVySXRlbTsKLQlzaG9ydCBzY3JpcHRGaWx0ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGFmdGVySXRlbTsKKyAgICBzaG9ydCBzY3JpcHRGaWx0ZXI7CiAjaWZuZGVmIEluc2VydEZvbnRSZXNNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0Rm9udFJlc01lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydEZvbnRSZXNNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCUluc2VydEZvbnRSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgIHNjcmlwdEZpbHRlcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdEZpbHRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydEZvbnRSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdEZpbHRlcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW5zZXJ0SW50bFJlc01lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVzVHlwZSB0aGVUeXBlOwotCXNob3J0IGFmdGVySXRlbTsKLQlzaG9ydCBzY3JpcHRGaWx0ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBhZnRlckl0ZW07CisgICAgc2hvcnQgc2NyaXB0RmlsdGVyOwogI2lmbmRlZiBJbnNlcnRJbnRsUmVzTWVudQotCVB5TWFjX1BSRUNIRUNLKEluc2VydEludGxSZXNNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRJbnRsUmVzTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCUluc2VydEludGxSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCi0JICAgICAgICAgICAgICAgICAgc2NyaXB0RmlsdGVyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRGaWx0ZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnNlcnRJbnRsUmVzTWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdEZpbHRlcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQXBwZW5kTWVudUl0ZW1UZXh0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU3RyMjU1IGluU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFN0cjI1NSBpblN0cmluZzsKICNpZm5kZWYgQXBwZW5kTWVudUl0ZW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soQXBwZW5kTWVudUl0ZW1UZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBcHBlbmRNZW51SXRlbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGluU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFwcGVuZE1lbnVJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpblN0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBcHBlbmRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0luc2VydE1lbnVJdGVtVGV4dChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVN0cjI1NSBpblN0cmluZzsKLQlNZW51SXRlbUluZGV4IGFmdGVySXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTdHIyNTUgaW5TdHJpbmc7CisgICAgTWVudUl0ZW1JbmRleCBhZnRlckl0ZW07CiAjaWZuZGVmIEluc2VydE1lbnVJdGVtVGV4dAotCVB5TWFjX1BSRUNIRUNLKEluc2VydE1lbnVJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVudUl0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZhZnRlckl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0TWVudUl0ZW1UZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnNlcnRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0NvcHlNZW51SXRlbXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtOwotCUl0ZW1Db3VudCBpbk51bUl0ZW1zOwotCU1lbnVIYW5kbGUgaW5EZXN0TWVudTsKLQlNZW51SXRlbUluZGV4IGluSW5zZXJ0QWZ0ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkZpcnN0SXRlbTsKKyAgICBJdGVtQ291bnQgaW5OdW1JdGVtczsKKyAgICBNZW51SGFuZGxlIGluRGVzdE1lbnU7CisgICAgTWVudUl0ZW1JbmRleCBpbkluc2VydEFmdGVyOwogI2lmbmRlZiBDb3B5TWVudUl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weU1lbnVJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZpcnN0SXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTnVtSXRlbXMsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmluRGVzdE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkluc2VydEFmdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvcHlNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBpbkZpcnN0SXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICBpbk51bUl0ZW1zLAotCSAgICAgICAgICAgICAgICAgICAgIGluRGVzdE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgaW5JbnNlcnRBZnRlcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GaXJzdEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bUl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZpbkRlc3RNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JbnNlcnRBZnRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5TWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5GaXJzdEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1JdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlc3RNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5zZXJ0QWZ0ZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfRGVsZXRlTWVudUl0ZW1zKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkZpcnN0SXRlbTsKLQlJdGVtQ291bnQgaW5OdW1JdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtOworICAgIEl0ZW1Db3VudCBpbk51bUl0ZW1zOwogI2lmbmRlZiBEZWxldGVNZW51SXRlbXMKLQlQeU1hY19QUkVDSEVDSyhEZWxldGVNZW51SXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKERlbGV0ZU1lbnVJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZpcnN0SXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTnVtSXRlbXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVsZXRlTWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbkZpcnN0SXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluTnVtSXRlbXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmlyc3RJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1JdGVtcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEZWxldGVNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmlyc3RJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1JdGVtcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9BcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKLQlNZW51SXRlbUF0dHJpYnV0ZXMgaW5BdHRyaWJ1dGVzOwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCU1lbnVJdGVtSW5kZXggb3V0TmV3SXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBNZW51SXRlbUF0dHJpYnV0ZXMgaW5BdHRyaWJ1dGVzOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIE1lbnVJdGVtSW5kZXggb3V0TmV3SXRlbTsKICNpZm5kZWYgQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF0dHJpYnV0ZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROZXdJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXROZXdJdGVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE5ld0l0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE5ld0l0ZW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7Ci0JTWVudUl0ZW1JbmRleCBpbkFmdGVySXRlbTsKLQlNZW51SXRlbUF0dHJpYnV0ZXMgaW5BdHRyaWJ1dGVzOwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluU3RyaW5nOworICAgIE1lbnVJdGVtSW5kZXggaW5BZnRlckl0ZW07CisgICAgTWVudUl0ZW1BdHRyaWJ1dGVzIGluQXR0cmlidXRlczsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZobGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfUG9wVXBNZW51U2VsZWN0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCXNob3J0IHRvcDsKLQlzaG9ydCBsZWZ0OwotCXNob3J0IHBvcFVwSXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgc2hvcnQgdG9wOworICAgIHNob3J0IGxlZnQ7CisgICAgc2hvcnQgcG9wVXBJdGVtOwogI2lmbmRlZiBQb3BVcE1lbnVTZWxlY3QKLQlQeU1hY19QUkVDSEVDSyhQb3BVcE1lbnVTZWxlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFBvcFVwTWVudVNlbGVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvcFVwSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFBvcFVwTWVudVNlbGVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICB0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgIHBvcFVwSXRlbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3BVcEl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBQb3BVcE1lbnVTZWxlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BVcEl0ZW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW52YWxpZGF0ZU1lbnVFbmFibGluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBJbnZhbGlkYXRlTWVudUVuYWJsaW5nCi0JUHlNYWNfUFJFQ0hFQ0soSW52YWxpZGF0ZU1lbnVFbmFibGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52YWxpZGF0ZU1lbnVFbmFibGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsaWRhdGVNZW51RW5hYmxpbmcoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnZhbGlkYXRlTWVudUVuYWJsaW5nKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSXNNZW51QmFySW52YWxpZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzTWVudUJhckludmFsaWQKLQlQeU1hY19QUkVDSEVDSyhJc01lbnVCYXJJbnZhbGlkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc01lbnVCYXJJbnZhbGlkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVCYXJJbnZhbGlkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc01lbnVCYXJJbnZhbGlkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfTWFjSW5zZXJ0TWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SUQgYmVmb3JlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBiZWZvcmVJRDsKICNpZm5kZWYgTWFjSW5zZXJ0TWVudQotCVB5TWFjX1BSRUNIRUNLKE1hY0luc2VydE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0luc2VydE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZiZWZvcmVJRCkpCi0JCXJldHVybiBOVUxMOwotCU1hY0luc2VydE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGJlZm9yZUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiZWZvcmVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0luc2VydE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGJlZm9yZUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRSb290TWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBTZXRSb290TWVudQotCVB5TWFjX1BSRUNIRUNLKFNldFJvb3RNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSb290TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFJvb3RNZW51KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Um9vdE1lbnUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNDaGVja01lbnVJdGVtKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JQm9vbGVhbiBjaGVja2VkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIEJvb2xlYW4gY2hlY2tlZDsKICNpZm5kZWYgTWFjQ2hlY2tNZW51SXRlbQotCVB5TWFjX1BSRUNIRUNLKE1hY0NoZWNrTWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0NoZWNrTWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoZWNrZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNDaGVja01lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgY2hlY2tlZCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGVja2VkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjQ2hlY2tNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtVGV4dChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCVN0cjI1NSBpdGVtU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIFN0cjI1NSBpdGVtU3RyaW5nOwogI2lmbmRlZiBTZXRNZW51SXRlbVRleHQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpdGVtU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TWVudUl0ZW1UZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgIGl0ZW1TdHJpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpdGVtU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVudUl0ZW1UZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgIGl0ZW1TdHJpbmcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVJdGVtVGV4dChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCVN0cjI1NSBpdGVtU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIFN0cjI1NSBpdGVtU3RyaW5nOwogI2lmbmRlZiBHZXRNZW51SXRlbVRleHQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgaXRlbVN0cmluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgaXRlbVN0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TWVudUl0ZW1UZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgIGl0ZW1TdHJpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGl0ZW1TdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0SXRlbU1hcmsoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaXRlbTsKLQlDaGFyUGFyYW1ldGVyIG1hcmtDaGFyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIENoYXJQYXJhbWV0ZXIgbWFya0NoYXI7CiAjaWZuZGVmIFNldEl0ZW1NYXJrCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbU1hcmspOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEl0ZW1NYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXJrQ2hhcikpCi0JCXJldHVybiBOVUxMOwotCVNldEl0ZW1NYXJrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICBtYXJrQ2hhcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXJrQ2hhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEl0ZW1NYXJrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICBtYXJrQ2hhcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0SXRlbU1hcmsoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaXRlbTsKLQlDaGFyUGFyYW1ldGVyIG1hcmtDaGFyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIENoYXJQYXJhbWV0ZXIgbWFya0NoYXI7CiAjaWZuZGVmIEdldEl0ZW1NYXJrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbU1hcmspOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEl0ZW1NYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUdldEl0ZW1NYXJrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAmbWFya0NoYXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBtYXJrQ2hhcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0SXRlbU1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICZtYXJrQ2hhcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtDaGFyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldEl0ZW1DbWQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaXRlbTsKLQlDaGFyUGFyYW1ldGVyIGNtZENoYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgQ2hhclBhcmFtZXRlciBjbWRDaGFyOwogI2lmbmRlZiBTZXRJdGVtQ21kCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbUNtZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbUNtZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmY21kQ2hhcikpCi0JCXJldHVybiBOVUxMOwotCVNldEl0ZW1DbWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICBjbWRDaGFyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtZENoYXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRJdGVtQ21kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgY21kQ2hhcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0SXRlbUNtZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCUNoYXJQYXJhbWV0ZXIgY21kQ2hhcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaXRlbTsKKyAgICBDaGFyUGFyYW1ldGVyIGNtZENoYXI7CiAjaWZuZGVmIEdldEl0ZW1DbWQKLQlQeU1hY19QUkVDSEVDSyhHZXRJdGVtQ21kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJdGVtQ21kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUdldEl0ZW1DbWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAmY21kQ2hhcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIGNtZENoYXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEl0ZW1DbWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAmY21kQ2hhcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNtZENoYXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0SXRlbUljb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaXRlbTsKLQlzaG9ydCBpY29uSW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgc2hvcnQgaWNvbkluZGV4OwogI2lmbmRlZiBTZXRJdGVtSWNvbgotCVB5TWFjX1BSRUNIRUNLKFNldEl0ZW1JY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRJdGVtSWNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvbkluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0SXRlbUljb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgIGljb25JbmRleCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRJdGVtSWNvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgaWNvbkluZGV4KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRJdGVtSWNvbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCXNob3J0IGljb25JbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaXRlbTsKKyAgICBzaG9ydCBpY29uSW5kZXg7CiAjaWZuZGVmIEdldEl0ZW1JY29uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbUljb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEl0ZW1JY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUdldEl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAmaWNvbkluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgaWNvbkluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRJdGVtSWNvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgJmljb25JbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGljb25JbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRJdGVtU3R5bGUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaXRlbTsKLQlTdHlsZVBhcmFtZXRlciBjaFN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIFN0eWxlUGFyYW1ldGVyIGNoU3R5bGU7CiAjaWZuZGVmIFNldEl0ZW1TdHlsZQotCVB5TWFjX1BSRUNIRUNLKFNldEl0ZW1TdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbVN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZjaFN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0SXRlbVN0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgIGNoU3R5bGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hTdHlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEl0ZW1TdHlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICBjaFN0eWxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRJdGVtU3R5bGUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaXRlbTsKLQlTdHlsZSBjaFN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIFN0eWxlIGNoU3R5bGU7CiAjaWZuZGVmIEdldEl0ZW1TdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdldEl0ZW1TdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbVN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUdldEl0ZW1TdHlsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAmY2hTdHlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIGNoU3R5bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEl0ZW1TdHlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAmY2hTdHlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoU3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1Db21tYW5kSUQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CiAjaWZuZGVmIFNldE1lbnVJdGVtQ29tbWFuZElECi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Db21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtQ29tbWFuZElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1Db21tYW5kSUQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCU1lbnVDb21tYW5kIG91dENvbW1hbmRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIE1lbnVDb21tYW5kIG91dENvbW1hbmRJRDsKICNpZm5kZWYgR2V0TWVudUl0ZW1Db21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUNvbW1hbmRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Db21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1Db21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29tbWFuZElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRDb21tYW5kSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbW1hbmRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q29tbWFuZElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtTW9kaWZpZXJzKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlVSW50OCBpbk1vZGlmaWVyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQ4IGluTW9kaWZpZXJzOwogI2lmbmRlZiBTZXRNZW51SXRlbU1vZGlmaWVycwotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtTW9kaWZpZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbU1vZGlmaWVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGlmaWVycykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbU1vZGlmaWVycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTW9kaWZpZXJzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51SXRlbU1vZGlmaWVycyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTW9kaWZpZXJzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVJdGVtTW9kaWZpZXJzKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlVSW50OCBvdXRNb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBVSW50OCBvdXRNb2RpZmllcnM7CiAjaWZuZGVmIEdldE1lbnVJdGVtTW9kaWZpZXJzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Nb2RpZmllcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtTW9kaWZpZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVJdGVtTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1vZGlmaWVycyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0TW9kaWZpZXJzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbU1vZGlmaWVycyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNb2RpZmllcnMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1vZGlmaWVycyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUljb25IYW5kbGUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVVJbnQ4IGluSWNvblR5cGU7Ci0JSGFuZGxlIGluSWNvbkhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQ4IGluSWNvblR5cGU7CisgICAgSGFuZGxlIGluSWNvbkhhbmRsZTsKICNpZm5kZWYgU2V0TWVudUl0ZW1JY29uSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1JY29uSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUljb25IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluSWNvbkhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbUljb25IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkljb25IYW5kbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkljb25IYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1JY29uSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JY29uSGFuZGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVJdGVtSWNvbkhhbmRsZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JVUludDggb3V0SWNvblR5cGU7Ci0JSGFuZGxlIG91dEljb25IYW5kbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBVSW50OCBvdXRJY29uVHlwZTsKKyAgICBIYW5kbGUgb3V0SWNvbkhhbmRsZTsKICNpZm5kZWYgR2V0TWVudUl0ZW1JY29uSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1JY29uSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUljb25IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1JY29uSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SWNvbkhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRJY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvdXRJY29uSGFuZGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbUljb25IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uSGFuZGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dEljb25IYW5kbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVRleHRFbmNvZGluZyBpblNjcmlwdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgVGV4dEVuY29kaW5nIGluU2NyaXB0SUQ7CiAjaWZuZGVmIFNldE1lbnVJdGVtVGV4dEVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtVGV4dEVuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU2NyaXB0SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblNjcmlwdElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtVGV4dEVuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TY3JpcHRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbVRleHRFbmNvZGluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JVGV4dEVuY29kaW5nIG91dFNjcmlwdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgVGV4dEVuY29kaW5nIG91dFNjcmlwdElEOwogI2lmbmRlZiBHZXRNZW51SXRlbVRleHRFbmNvZGluZwotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtVGV4dEVuY29kaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbVRleHRFbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbVRleHRFbmNvZGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTY3JpcHRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0U2NyaXB0SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtVGV4dEVuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTY3JpcHRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlNZW51SUQgaW5IaWVySUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBNZW51SUQgaW5IaWVySUQ7CiAjaWZuZGVmIFNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSGllcklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IaWVySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSGllcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IaWVySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JTWVudUlEIG91dEhpZXJJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIE1lbnVJRCBvdXRIaWVySUQ7CiAjaWZuZGVmIEdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEhpZXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SGllcklEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhpZXJJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUZvbnRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JU0ludDE2IGluRm9udElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgU0ludDE2IGluRm9udElEOwogI2lmbmRlZiBTZXRNZW51SXRlbUZvbnRJRAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtRm9udElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUZvbnRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbUZvbnRJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51SXRlbUZvbnRJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVJdGVtRm9udElEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlTSW50MTYgb3V0Rm9udElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgU0ludDE2IG91dEZvbnRJRDsKICNpZm5kZWYgR2V0TWVudUl0ZW1Gb250SUQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUZvbnRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Gb250SUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1Gb250SUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Rm9udElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRGb250SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtRm9udElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZvbnRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Rm9udElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtUmVmQ29uKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlVSW50MzIgaW5SZWZDb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBVSW50MzIgaW5SZWZDb247CiAjaWZuZGVmIFNldE1lbnVJdGVtUmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1SZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtUmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmQ29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtUmVmQ29uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWZDb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtUmVmQ29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWZDb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1SZWZDb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVVJbnQzMiBvdXRSZWZDb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBVSW50MzIgb3V0UmVmQ29uOwogI2lmbmRlZiBHZXRNZW51SXRlbVJlZkNvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtUmVmQ29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbVJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbVJlZkNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZWZDb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFJlZkNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1SZWZDb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVmQ29uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZWZDb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1LZXlHbHlwaChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JU0ludDE2IGluR2x5cGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBTSW50MTYgaW5HbHlwaDsKICNpZm5kZWYgU2V0TWVudUl0ZW1LZXlHbHlwaAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtS2V5R2x5cGgpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtS2V5R2x5cGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5HbHlwaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbUtleUdseXBoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluR2x5cGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluR2x5cGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1LZXlHbHlwaChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkdseXBoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVJdGVtS2V5R2x5cGgoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVNJbnQxNiBvdXRHbHlwaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFNJbnQxNiBvdXRHbHlwaDsKICNpZm5kZWYgR2V0TWVudUl0ZW1LZXlHbHlwaAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtS2V5R2x5cGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtS2V5R2x5cGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1LZXlHbHlwaChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0R2x5cGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEdseXBoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbUtleUdseXBoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHbHlwaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0R2x5cGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfTWFjRW5hYmxlTWVudUl0ZW0oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIE1hY0VuYWJsZU1lbnVJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soTWFjRW5hYmxlTWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0VuYWJsZU1lbnVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCU1hY0VuYWJsZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgaXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0VuYWJsZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfRGlzYWJsZU1lbnVJdGVtKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJdGVtSW5kZXggaXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOwogI2lmbmRlZiBEaXNhYmxlTWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKERpc2FibGVNZW51SXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNhYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc2FibGVNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVJdGVtRW5hYmxlZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlNZW51SXRlbUluZGV4IGl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIE1lbnVJdGVtSW5kZXggaXRlbTsKICNpZm5kZWYgSXNNZW51SXRlbUVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhJc01lbnVJdGVtRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNNZW51SXRlbUVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNZW51SXRlbUVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc01lbnVJdGVtRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfRW5hYmxlTWVudUl0ZW1JY29uKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJdGVtSW5kZXggaXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOwogI2lmbmRlZiBFbmFibGVNZW51SXRlbUljb24KLQlQeU1hY19QUkVDSEVDSyhFbmFibGVNZW51SXRlbUljb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVJdGVtSWNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlFbmFibGVNZW51SXRlbUljb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEVuYWJsZU1lbnVJdGVtSWNvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EaXNhYmxlTWVudUl0ZW1JY29uKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJdGVtSW5kZXggaXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOwogI2lmbmRlZiBEaXNhYmxlTWVudUl0ZW1JY29uCi0JUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZU1lbnVJdGVtSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZU1lbnVJdGVtSWNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNhYmxlTWVudUl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzYWJsZU1lbnVJdGVtSWNvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSXNNZW51SXRlbUljb25FbmFibGVkKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCU1lbnVJdGVtSW5kZXggaXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOwogI2lmbmRlZiBJc01lbnVJdGVtSWNvbkVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhJc01lbnVJdGVtSWNvbkVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudUl0ZW1JY29uRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVJdGVtSWNvbkVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51SXRlbUljb25FbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JTWVudUhhbmRsZSBpbkhpZXJNZW51OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5JdGVtOworICAgIE1lbnVIYW5kbGUgaW5IaWVyTWVudTsKICNpZm5kZWYgU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5IaWVyTWVudSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGllck1lbnUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmluSGllck1lbnUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZXJNZW51KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5JdGVtOwotCU1lbnVIYW5kbGUgb3V0SGllck1lbnU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgTWVudUhhbmRsZSBvdXRIaWVyTWVudTsKICNpZm5kZWYgR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGllck1lbnUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX05ldywgb3V0SGllck1lbnUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEhpZXJNZW51KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9OZXcsIG91dEhpZXJNZW51KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0NvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5JdGVtOworICAgIENGU3RyaW5nUmVmIG91dFN0cmluZzsKICNpZm5kZWYgQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhDb3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRTdHJpbmcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5JdGVtOwotCUNGU3RyaW5nUmVmIGluU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5JdGVtOworICAgIENGU3RyaW5nUmVmIGluU3RyaW5nOwogI2lmbmRlZiBTZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1JbmRlbnQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKLQlVSW50MzIgb3V0SW5kZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5JdGVtOworICAgIFVJbnQzMiBvdXRJbmRlbnQ7CiAjaWZuZGVmIEdldE1lbnVJdGVtSW5kZW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1JbmRlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSW5kZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVJdGVtSW5kZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SW5kZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbUluZGVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJbmRlbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEluZGVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUluZGVudChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5JdGVtOwotCVVJbnQzMiBpbkluZGVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluSXRlbTsKKyAgICBVSW50MzIgaW5JbmRlbnQ7CiAjaWZuZGVmIFNldE1lbnVJdGVtSW5kZW50Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1JbmRlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSW5kZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSW5kZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtSW5kZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmRlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSW5kZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtSW5kZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmRlbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1Db21tYW5kS2V5KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JQm9vbGVhbiBpbkdldFZpcnR1YWxLZXk7Ci0JVUludDE2IG91dEtleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluSXRlbTsKKyAgICBCb29sZWFuIGluR2V0VmlydHVhbEtleTsKKyAgICBVSW50MTYgb3V0S2V5OwogI2lmbmRlZiBHZXRNZW51SXRlbUNvbW1hbmRLZXkKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUNvbW1hbmRLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtQ29tbWFuZEtleSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkdldFZpcnR1YWxLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1Db21tYW5kS2V5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkdldFZpcnR1YWxLZXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0S2V5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRLZXkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluR2V0VmlydHVhbEtleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbUNvbW1hbmRLZXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluR2V0VmlydHVhbEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRLZXkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEtleSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUNvbW1hbmRLZXkoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKLQlCb29sZWFuIGluU2V0VmlydHVhbEtleTsKLQlVSW50MTYgaW5LZXk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgQm9vbGVhbiBpblNldFZpcnR1YWxLZXk7CisgICAgVUludDE2IGluS2V5OwogI2lmbmRlZiBTZXRNZW51SXRlbUNvbW1hbmRLZXkKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUNvbW1hbmRLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtQ29tbWFuZEtleSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TZXRWaXJ0dWFsS2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5LZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1Db21tYW5kS2V5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNldFZpcnR1YWxLZXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktleSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2V0VmlydHVhbEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtQ29tbWFuZEtleShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TZXRWaXJ0dWFsS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5LZXkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGl0ZW07Ci0JT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgcHJvcGVydHlUYWc7Ci0JVUludDMyIGF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOworICAgIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIHByb3BlcnR5VGFnOworICAgIFVJbnQzMiBhdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0NoYW5nZU1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOwotCU9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7Ci0JT1NUeXBlIHByb3BlcnR5VGFnOwotCVVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQ7Ci0JVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaXRlbTsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBVSW50MzIgYXR0cmlidXRlc1RvU2V0OworICAgIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKICNpZm5kZWYgQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvQ2xlYXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9DbGVhcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvQ2xlYXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9DbGVhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51QXR0cmlidXRlcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVBdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUF0dHJpYnV0ZXMgb3V0QXR0cmlidXRlczsKICNpZm5kZWYgR2V0TWVudUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0QXR0cmlidXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QXR0cmlidXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9DaGFuZ2VNZW51QXR0cmlidXRlcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlczsKLQlNZW51QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51QXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXM7CisgICAgTWVudUF0dHJpYnV0ZXMgY2xlYXJUaGVzZUF0dHJpYnV0ZXM7CiAjaWZuZGVmIENoYW5nZU1lbnVBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlTWVudUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENoYW5nZU1lbnVBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZU1lbnVBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRoZXNlQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaGVzZUF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENoYW5nZU1lbnVBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRoZXNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaGVzZUF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1BdHRyaWJ1dGVzKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOwotCU1lbnVJdGVtQXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaXRlbTsKKyAgICBNZW51SXRlbUF0dHJpYnV0ZXMgb3V0QXR0cmlidXRlczsKICNpZm5kZWYgR2V0TWVudUl0ZW1BdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1BdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVJdGVtQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRBdHRyaWJ1dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1BdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEF0dHJpYnV0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ2hhbmdlTWVudUl0ZW1BdHRyaWJ1dGVzKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOwotCU1lbnVJdGVtQXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXM7Ci0JTWVudUl0ZW1BdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaXRlbTsKKyAgICBNZW51SXRlbUF0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzOworICAgIE1lbnVJdGVtQXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlczsKICNpZm5kZWYgQ2hhbmdlTWVudUl0ZW1BdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlTWVudUl0ZW1BdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZzZXRUaGVzZUF0dHJpYnV0ZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZjbGVhclRoZXNlQXR0cmlidXRlcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaGVzZUF0dHJpYnV0ZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRoZXNlQXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRUaGVzZUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGVhclRoZXNlQXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaGVzZUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRoZXNlQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EaXNhYmxlQWxsTWVudUl0ZW1zKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGlzYWJsZUFsbE1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKERpc2FibGVBbGxNZW51SXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc2FibGVBbGxNZW51SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURpc2FibGVBbGxNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNhYmxlQWxsTWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0VuYWJsZUFsbE1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEVuYWJsZUFsbE1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZUFsbE1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlQWxsTWVudUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlFbmFibGVBbGxNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFbmFibGVBbGxNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfTWVudUhhc0VuYWJsZWRJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIE1lbnVIYXNFbmFibGVkSXRlbXMKLQlQeU1hY19QUkVDSEVDSyhNZW51SGFzRW5hYmxlZEl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZW51SGFzRW5hYmxlZEl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZW51SGFzRW5hYmxlZEl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZW51SGFzRW5hYmxlZEl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudVR5cGUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgb3V0VHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MTYgb3V0VHlwZTsKICNpZm5kZWYgR2V0TWVudVR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51VHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51VHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmb3V0VHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0VHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51VHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmb3V0VHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Db3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSXRlbUNvdW50IF9ydjsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSXRlbUNvdW50IF9ydjsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElECi0JUHlNYWNfUFJFQ0hFQ0soQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlVSW50MzIgaW5JdGVtSW5kZXg7Ci0JTWVudUhhbmRsZSBvdXRNZW51OwotCU1lbnVJdGVtSW5kZXggb3V0SW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgVUludDMyIGluSXRlbUluZGV4OworICAgIE1lbnVIYW5kbGUgb3V0TWVudTsKKyAgICBNZW51SXRlbUluZGV4IG91dEluZGV4OwogI2lmbmRlZiBHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbUluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51LAotCSAgICAgICAgICAgICAgICAgICAgIG91dEluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbUluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0VuYWJsZU1lbnVDb21tYW5kKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgRW5hYmxlTWVudUNvbW1hbmQKLQlQeU1hY19QUkVDSEVDSyhFbmFibGVNZW51Q29tbWFuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlTWVudUNvbW1hbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCUVuYWJsZU1lbnVDb21tYW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRW5hYmxlTWVudUNvbW1hbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfRGlzYWJsZU1lbnVDb21tYW5kKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgRGlzYWJsZU1lbnVDb21tYW5kCi0JUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZU1lbnVDb21tYW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUNvbW1hbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCURpc2FibGVNZW51Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNhYmxlTWVudUNvbW1hbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0lzTWVudUNvbW1hbmRFbmFibGVkKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgSXNNZW51Q29tbWFuZEVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhJc01lbnVDb21tYW5kRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNNZW51Q29tbWFuZEVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzTWVudUNvbW1hbmRFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc01lbnVDb21tYW5kRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVDb21tYW5kTWFyayhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCVVuaUNoYXIgaW5NYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFVuaUNoYXIgaW5NYXJrOwogI2lmbmRlZiBTZXRNZW51Q29tbWFuZE1hcmsKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51Q29tbWFuZE1hcmspOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVDb21tYW5kTWFyayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWFyaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51Q29tbWFuZE1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NYXJrKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWFyaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51Q29tbWFuZE1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NYXJrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVDb21tYW5kTWFyayhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCVVuaUNoYXIgb3V0TWFyazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBVbmlDaGFyIG91dE1hcms7CiAjaWZuZGVmIEdldE1lbnVDb21tYW5kTWFyawotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVDb21tYW5kTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRNYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUNvbW1hbmRNYXJrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYXJrKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRNYXJrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVDb21tYW5kTWFyayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWFyayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TWFyayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCU9TVHlwZSBpblByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgaW5Qcm9wZXJ0eVRhZzsKLQlCeXRlQ291bnQgb3V0U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIGluUHJvcGVydHlUYWc7CisgICAgQnl0ZUNvdW50IG91dFNpemU7CiAjaWZuZGVmIEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eVRhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9SZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBpblByb3BlcnR5VGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvcjsKKyAgICBPU1R5cGUgaW5Qcm9wZXJ0eVRhZzsKICNpZm5kZWYgUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5VGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSXNNZW51SXRlbUludmFsaWQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIE1lbnVJdGVtSW5kZXggaW5JdGVtOwogI2lmbmRlZiBJc01lbnVJdGVtSW52YWxpZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUl0ZW1JbnZhbGlkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc01lbnVJdGVtSW52YWxpZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzTWVudUl0ZW1JbnZhbGlkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUl0ZW1JbnZhbGlkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0ludmFsaWRhdGVNZW51SXRlbXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtOwotCUl0ZW1Db3VudCBpbk51bUl0ZW1zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW07CisgICAgSXRlbUNvdW50IGluTnVtSXRlbXM7CiAjaWZuZGVmIEludmFsaWRhdGVNZW51SXRlbXMKLQlQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTWVudUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTWVudUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1JdGVtcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnZhbGlkYXRlTWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GaXJzdEl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1JdGVtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GaXJzdEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bUl0ZW1zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEludmFsaWRhdGVNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZpcnN0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bUl0ZW1zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1VwZGF0ZUludmFsaWRNZW51SXRlbXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgVXBkYXRlSW52YWxpZE1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZUludmFsaWRNZW51SXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZUludmFsaWRNZW51SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVJbnZhbGlkTWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlSW52YWxpZE1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0NyZWF0ZVN0YW5kYXJkRm9udE1lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGFmdGVySXRlbTsKLQlNZW51SUQgZmlyc3RIaWVyTWVudUlEOwotCU9wdGlvbkJpdHMgb3B0aW9uczsKLQlJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGFmdGVySXRlbTsKKyAgICBNZW51SUQgZmlyc3RIaWVyTWVudUlEOworICAgIE9wdGlvbkJpdHMgb3B0aW9uczsKKyAgICBJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudDsKICNpZm5kZWYgQ3JlYXRlU3RhbmRhcmRGb250TWVudQotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVN0YW5kYXJkRm9udE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVN0YW5kYXJkRm9udE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0SGllck1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlU3RhbmRhcmRGb250TWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEhpZXJNZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGllck1lbnVDb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SGllck1lbnVDb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0SGllck1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU3RhbmRhcmRGb250TWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEhpZXJNZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGllck1lbnVDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGllck1lbnVDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9VcGRhdGVTdGFuZGFyZEZvbnRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JSXRlbUNvdW50IG91dEhpZXJNZW51Q291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgSXRlbUNvdW50IG91dEhpZXJNZW51Q291bnQ7CiAjaWZuZGVmIFVwZGF0ZVN0YW5kYXJkRm9udE1lbnUKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVTdGFuZGFyZEZvbnRNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVTdGFuZGFyZEZvbnRNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVXBkYXRlU3RhbmRhcmRGb250TWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRIaWVyTWVudUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVwZGF0ZVN0YW5kYXJkRm9udE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGllck1lbnVDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGllck1lbnVDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGl0ZW07Ci0JRk1Gb250RmFtaWx5IG91dEZvbnRGYW1pbHk7Ci0JRk1Gb250U3R5bGUgb3V0U3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOworICAgIEZNRm9udEZhbWlseSBvdXRGb250RmFtaWx5OworICAgIEZNRm9udFN0eWxlIG91dFN0eWxlOwogI2lmbmRlZiBHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Rm9udEZhbWlseUZyb21NZW51U2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZvbnRGYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRGb250RmFtaWx5LAotCSAgICAgICAgICAgICAgICAgICAgIG91dFN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Rm9udEZhbWlseUZyb21NZW51U2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZvbnRGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGb250RmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0eWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SUQgX3J2OwogI2lmbmRlZiBHZXRNZW51SUQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVudUlEKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51SUQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51V2lkdGgoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgR2V0TWVudVdpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudVdpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51V2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lbnVXaWR0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudVdpZHRoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUhlaWdodChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRNZW51SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVudUhlaWdodChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudUhlaWdodChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SUQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SUQgbWVudUlEOwogI2lmbmRlZiBTZXRNZW51SUQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICBtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICBtZW51SUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVXaWR0aChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgd2lkdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiB3aWR0aDsKICNpZm5kZWYgU2V0TWVudVdpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudVdpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51V2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1lbnVXaWR0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICB3aWR0aCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZW51V2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVIZWlnaHQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IGhlaWdodDsKICNpZm5kZWYgU2V0TWVudUhlaWdodAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZW51SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBoZWlnaHQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1lbnVIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfYXNfUmVzb3VyY2UoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgYXNfUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhhc19SZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soYXNfUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQXBwZW5kTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgZGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IGRhdGE7CiAjaWZuZGVmIEFwcGVuZE1lbnUKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBcHBlbmRNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQXBwZW5kTWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgZGF0YSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQXBwZW5kTWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgZGF0YSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW5zZXJ0TWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBiZWZvcmVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgYmVmb3JlSUQ7CiAjaWZuZGVmIEluc2VydE1lbnUKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmVmb3JlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnNlcnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICBiZWZvcmVJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmVmb3JlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnNlcnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBiZWZvcmVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW5zZXJ0TWVudUl0ZW0oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RyMjU1IGl0ZW1TdHJpbmc7Ci0Jc2hvcnQgYWZ0ZXJJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgaXRlbVN0cmluZzsKKyAgICBzaG9ydCBhZnRlckl0ZW07CiAjaWZuZGVmIEluc2VydE1lbnVJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydE1lbnVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaXRlbVN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUluc2VydE1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgaXRlbVN0cmluZywKLQkgICAgICAgICAgICAgICBhZnRlckl0ZW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGl0ZW1TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhZnRlckl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnNlcnRNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIGl0ZW1TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9FbmFibGVNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MTYgaXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDE2IGl0ZW07CiAjaWZuZGVmIEVuYWJsZU1lbnVJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlTWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUVuYWJsZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgaXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEVuYWJsZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ2hlY2tNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCUJvb2xlYW4gY2hlY2tlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaXRlbTsKKyAgICBCb29sZWFuIGNoZWNrZWQ7CiAjaWZuZGVmIENoZWNrTWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhDaGVja01lbnVJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGVja01lbnVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZjaGVja2VkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2hlY2tNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgIGNoZWNrZWQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hlY2tlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENoZWNrTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICBjaGVja2VkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBNZW51T2JqX21ldGhvZHNbXSA9IHsKLQl7IkRpc3Bvc2VNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGlzcG9zZU1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNhbGNNZW51U2l6ZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NhbGNNZW51U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ291bnRNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3VudE1lbnVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IF9ydikiKX0sCi0JeyJHZXRNZW51Rm9udCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVGb250LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgb3V0Rm9udElELCBVSW50MTYgb3V0Rm9udFNpemUpIil9LAotCXsiU2V0TWVudUZvbnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51Rm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluRm9udElELCBVSW50MTYgaW5Gb250U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBleGNsdWRlc01hcmspIC0+IE5vbmUiKX0sCi0JeyJJc1ZhbGlkTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzVmFsaWRNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRNZW51UmV0YWluQ291bnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51UmV0YWluQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEl0ZW1Db3VudCBfcnYpIil9LAotCXsiUmV0YWluTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1JldGFpbk1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlJlbGVhc2VNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUmVsZWFzZU1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkR1cGxpY2F0ZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EdXBsaWNhdGVNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIG91dE1lbnUpIil9LAotCXsiQ29weU1lbnVUaXRsZUFzQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3B5TWVudVRpdGxlQXNDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nKSIpfSwKLQl7IlNldE1lbnVUaXRsZVdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVUaXRsZVdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJJbnZhbGlkYXRlTWVudVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnZhbGlkYXRlTWVudVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IklzTWVudVNpemVJbnZhbGlkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51U2l6ZUludmFsaWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik1hY0FwcGVuZE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNBcHBlbmRNZW51LCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgZGF0YSkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydFJlc01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRSZXNNZW51LCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IGFmdGVySXRlbSkgLT4gTm9uZSIpfSwKLQl7IkFwcGVuZFJlc01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9BcHBlbmRSZXNNZW51LCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJNYWNJbnNlcnRNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0luc2VydE1lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgaXRlbVN0cmluZywgc2hvcnQgYWZ0ZXJJdGVtKSAtPiBOb25lIil9LAotCXsiRGVsZXRlTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EZWxldGVNZW51SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydEZvbnRSZXNNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0Rm9udFJlc01lbnUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGFmdGVySXRlbSwgc2hvcnQgc2NyaXB0RmlsdGVyKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0SW50bFJlc01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRJbnRsUmVzTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCBhZnRlckl0ZW0sIHNob3J0IHNjcmlwdEZpbHRlcikgLT4gTm9uZSIpfSwKLQl7IkFwcGVuZE1lbnVJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZE1lbnVJdGVtVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IGluU3RyaW5nKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0TWVudUl0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0TWVudUl0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgaW5TdHJpbmcsIE1lbnVJdGVtSW5kZXggYWZ0ZXJJdGVtKSAtPiBOb25lIil9LAotCXsiQ29weU1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvcHlNZW51SXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW0sIEl0ZW1Db3VudCBpbk51bUl0ZW1zLCBNZW51SGFuZGxlIGluRGVzdE1lbnUsIE1lbnVJdGVtSW5kZXggaW5JbnNlcnRBZnRlcikgLT4gTm9uZSIpfSwKLQl7IkRlbGV0ZU1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0RlbGV0ZU1lbnVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkZpcnN0SXRlbSwgSXRlbUNvdW50IGluTnVtSXRlbXMpIC0+IE5vbmUiKX0sCi0JeyJBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9BcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nLCBNZW51SXRlbUF0dHJpYnV0ZXMgaW5BdHRyaWJ1dGVzLCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKE1lbnVJdGVtSW5kZXggb3V0TmV3SXRlbSkiKX0sCi0JeyJJbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nLCBNZW51SXRlbUluZGV4IGluQWZ0ZXJJdGVtLCBNZW51SXRlbUF0dHJpYnV0ZXMgaW5BdHRyaWJ1dGVzLCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKLQl7IlBvcFVwTWVudVNlbGVjdCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1BvcFVwTWVudVNlbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdG9wLCBzaG9ydCBsZWZ0LCBzaG9ydCBwb3BVcEl0ZW0pIC0+IChsb25nIF9ydikiKX0sCi0JeyJJbnZhbGlkYXRlTWVudUVuYWJsaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW52YWxpZGF0ZU1lbnVFbmFibGluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSXNNZW51QmFySW52YWxpZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUJhckludmFsaWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik1hY0luc2VydE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNJbnNlcnRNZW51LCAxLAotCSBQeURvY19TVFIoIihNZW51SUQgYmVmb3JlSUQpIC0+IE5vbmUiKX0sCi0JeyJTZXRSb290TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldFJvb3RNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJNYWNDaGVja01lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjQ2hlY2tNZW51SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgQm9vbGVhbiBjaGVja2VkKSAtPiBOb25lIil9LAotCXsiU2V0TWVudUl0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBTdHIyNTUgaXRlbVN0cmluZykgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKFN0cjI1NSBpdGVtU3RyaW5nKSIpfSwKLQl7IlNldEl0ZW1NYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0SXRlbU1hcmssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIENoYXJQYXJhbWV0ZXIgbWFya0NoYXIpIC0+IE5vbmUiKX0sCi0JeyJHZXRJdGVtTWFyayIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEl0ZW1NYXJrLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoQ2hhclBhcmFtZXRlciBtYXJrQ2hhcikiKX0sCi0JeyJTZXRJdGVtQ21kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0SXRlbUNtZCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgQ2hhclBhcmFtZXRlciBjbWRDaGFyKSAtPiBOb25lIil9LAotCXsiR2V0SXRlbUNtZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEl0ZW1DbWQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChDaGFyUGFyYW1ldGVyIGNtZENoYXIpIil9LAotCXsiU2V0SXRlbUljb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRJdGVtSWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgc2hvcnQgaWNvbkluZGV4KSAtPiBOb25lIil9LAotCXsiR2V0SXRlbUljb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJdGVtSWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKHNob3J0IGljb25JbmRleCkiKX0sCi0JeyJTZXRJdGVtU3R5bGUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRJdGVtU3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIFN0eWxlUGFyYW1ldGVyIGNoU3R5bGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRJdGVtU3R5bGUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJdGVtU3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChTdHlsZSBjaFN0eWxlKSIpfSwKLQl7IlNldE1lbnVJdGVtQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1Db21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1Db21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUNvbW1hbmRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKE1lbnVDb21tYW5kIG91dENvbW1hbmRJRCkiKX0sCi0JeyJTZXRNZW51SXRlbU1vZGlmaWVycyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtTW9kaWZpZXJzLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBVSW50OCBpbk1vZGlmaWVycykgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtTW9kaWZpZXJzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1Nb2RpZmllcnMsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChVSW50OCBvdXRNb2RpZmllcnMpIil9LAotCXsiU2V0TWVudUl0ZW1JY29uSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1JY29uSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBVSW50OCBpbkljb25UeXBlLCBIYW5kbGUgaW5JY29uSGFuZGxlKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1JY29uSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1JY29uSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoVUludDggb3V0SWNvblR5cGUsIEhhbmRsZSBvdXRJY29uSGFuZGxlKSIpfSwKLQl7IlNldE1lbnVJdGVtVGV4dEVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFRleHRFbmNvZGluZyBpblNjcmlwdElEKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1UZXh0RW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbVRleHRFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFRleHRFbmNvZGluZyBvdXRTY3JpcHRJRCkiKX0sCi0JeyJTZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgTWVudUlEIGluSGllcklEKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChNZW51SUQgb3V0SGllcklEKSIpfSwKLQl7IlNldE1lbnVJdGVtRm9udElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1Gb250SUQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFNJbnQxNiBpbkZvbnRJRCkgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtRm9udElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1Gb250SUQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChTSW50MTYgb3V0Rm9udElEKSIpfSwKLQl7IlNldE1lbnVJdGVtUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1SZWZDb24sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFVJbnQzMiBpblJlZkNvbikgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1SZWZDb24sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChVSW50MzIgb3V0UmVmQ29uKSIpfSwKLQl7IlNldE1lbnVJdGVtS2V5R2x5cGgiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUtleUdseXBoLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBTSW50MTYgaW5HbHlwaCkgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtS2V5R2x5cGgiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUtleUdseXBoLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoU0ludDE2IG91dEdseXBoKSIpfSwKLQl7Ik1hY0VuYWJsZU1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjRW5hYmxlTWVudUl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc2FibGVNZW51SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiBOb25lIil9LAotCXsiSXNNZW51SXRlbUVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVJdGVtRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiRW5hYmxlTWVudUl0ZW1JY29uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRW5hYmxlTWVudUl0ZW1JY29uLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJEaXNhYmxlTWVudUl0ZW1JY29uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGlzYWJsZU1lbnVJdGVtSWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiBOb25lIil9LAotCXsiSXNNZW51SXRlbUljb25FbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51SXRlbUljb25FbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBNZW51SGFuZGxlIGluSGllck1lbnUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtKSAtPiAoTWVudUhhbmRsZSBvdXRIaWVyTWVudSkiKX0sCi0JeyJDb3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSkgLT4gKENGU3RyaW5nUmVmIG91dFN0cmluZykiKX0sCi0JeyJTZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtSW5kZW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1JbmRlbnQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtKSAtPiAoVUludDMyIG91dEluZGVudCkiKX0sCi0JeyJTZXRNZW51SXRlbUluZGVudCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtSW5kZW50LCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgVUludDMyIGluSW5kZW50KSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1Db21tYW5kS2V5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1Db21tYW5kS2V5LCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgQm9vbGVhbiBpbkdldFZpcnR1YWxLZXkpIC0+IChVSW50MTYgb3V0S2V5KSIpfSwKLQl7IlNldE1lbnVJdGVtQ29tbWFuZEtleSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtQ29tbWFuZEtleSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIEJvb2xlYW4gaW5TZXRWaXJ0dWFsS2V5LCBVSW50MTYgaW5LZXkpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0sIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gKFVJbnQzMiBhdHRyaWJ1dGVzKSIpfSwKLQl7IkNoYW5nZU1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSwgT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnLCBVSW50MzIgYXR0cmlidXRlc1RvU2V0LCBVSW50MzIgYXR0cmlidXRlc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51QXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzKSIpfSwKLQl7IkNoYW5nZU1lbnVBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ2hhbmdlTWVudUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlcywgTWVudUF0dHJpYnV0ZXMgY2xlYXJUaGVzZUF0dHJpYnV0ZXMpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKE1lbnVJdGVtQXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzKSIpfSwKLQl7IkNoYW5nZU1lbnVJdGVtQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NoYW5nZU1lbnVJdGVtQXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtLCBNZW51SXRlbUF0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzLCBNZW51SXRlbUF0dHJpYnV0ZXMgY2xlYXJUaGVzZUF0dHJpYnV0ZXMpIC0+IE5vbmUiKX0sCi0JeyJEaXNhYmxlQWxsTWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGlzYWJsZUFsbE1lbnVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRW5hYmxlQWxsTWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRW5hYmxlQWxsTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJNZW51SGFzRW5hYmxlZEl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWVudUhhc0VuYWJsZWRJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0TWVudVR5cGUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51VHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IG91dFR5cGUpIil9LAotCXsiQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKEl0ZW1Db3VudCBfcnYpIil9LAotCXsiR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgVUludDMyIGluSXRlbUluZGV4KSAtPiAoTWVudUhhbmRsZSBvdXRNZW51LCBNZW51SXRlbUluZGV4IG91dEluZGV4KSIpfSwKLQl7IkVuYWJsZU1lbnVDb21tYW5kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRW5hYmxlTWVudUNvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAotCXsiRGlzYWJsZU1lbnVDb21tYW5kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGlzYWJsZU1lbnVDb21tYW5kLCAxLAotCSBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKLQl7IklzTWVudUNvbW1hbmRFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51Q29tbWFuZEVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUNvbW1hbmRNYXJrLCAxLAotCSBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgVW5pQ2hhciBpbk1hcmspIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51Q29tbWFuZE1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51Q29tbWFuZE1hcmssIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoVW5pQ2hhciBvdXRNYXJrKSIpfSwKLQl7IkdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBpblByb3BlcnR5VGFnKSAtPiAoQnl0ZUNvdW50IG91dFNpemUpIil9LAotCXsiUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1JlbW92ZU1lbnVDb21tYW5kUHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBpblByb3BlcnR5VGFnKSAtPiBOb25lIil9LAotCXsiSXNNZW51SXRlbUludmFsaWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVJdGVtSW52YWxpZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJbnZhbGlkYXRlTWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW52YWxpZGF0ZU1lbnVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkZpcnN0SXRlbSwgSXRlbUNvdW50IGluTnVtSXRlbXMpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVJbnZhbGlkTWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfVXBkYXRlSW52YWxpZE1lbnVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ3JlYXRlU3RhbmRhcmRGb250TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NyZWF0ZVN0YW5kYXJkRm9udE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggYWZ0ZXJJdGVtLCBNZW51SUQgZmlyc3RIaWVyTWVudUlELCBPcHRpb25CaXRzIG9wdGlvbnMpIC0+IChJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudCkiKX0sCi0JeyJVcGRhdGVTdGFuZGFyZEZvbnRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfVXBkYXRlU3RhbmRhcmRGb250TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IG91dEhpZXJNZW51Q291bnQpIil9LAotCXsiR2V0Rm9udEZhbWlseUZyb21NZW51U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0Rm9udEZhbWlseUZyb21NZW51U2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IChGTUZvbnRGYW1pbHkgb3V0Rm9udEZhbWlseSwgRk1Gb250U3R5bGUgb3V0U3R5bGUpIil9LAotCXsiR2V0TWVudUlEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51SUQgX3J2KSIpfSwKLQl7IkdldE1lbnVXaWR0aCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVXaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJHZXRNZW51SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUhlaWdodCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJTZXRNZW51SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IE5vbmUiKX0sCi0JeyJTZXRNZW51V2lkdGgiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51V2lkdGgsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB3aWR0aCkgLT4gTm9uZSIpfSwKLQl7IlNldE1lbnVIZWlnaHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaGVpZ2h0KSAtPiBOb25lIil9LAotCXsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9hc19SZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJBcHBlbmRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQXBwZW5kTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IGRhdGEpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgYmVmb3JlSUQpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnRNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydE1lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgaXRlbVN0cmluZywgc2hvcnQgYWZ0ZXJJdGVtKSAtPiBOb25lIil9LAotCXsiRW5hYmxlTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVNZW51SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IGl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJDaGVja01lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ2hlY2tNZW51SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgQm9vbGVhbiBjaGVja2VkKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiRGlzcG9zZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNwb3NlTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ2FsY01lbnVTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ2FsY01lbnVTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDb3VudE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvdW50TWVudUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MTYgX3J2KSIpfSwKKyAgICB7IkdldE1lbnVGb250IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRGb250SUQsIFVJbnQxNiBvdXRGb250U2l6ZSkiKX0sCisgICAgeyJTZXRNZW51Rm9udCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVGb250LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5Gb250SUQsIFVJbnQxNiBpbkZvbnRTaXplKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGV4Y2x1ZGVzTWFyaykgLT4gTm9uZSIpfSwKKyAgICB7IklzVmFsaWRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNWYWxpZE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldE1lbnVSZXRhaW5Db3VudCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVSZXRhaW5Db3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCisgICAgeyJSZXRhaW5NZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUmV0YWluTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUmVsZWFzZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9SZWxlYXNlTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRHVwbGljYXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0R1cGxpY2F0ZU1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSkiKX0sCisgICAgeyJDb3B5TWVudVRpdGxlQXNDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvcHlNZW51VGl0bGVBc0NGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAorICAgIHsiU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKKyAgICB7IkludmFsaWRhdGVNZW51U2l6ZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0ludmFsaWRhdGVNZW51U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSXNNZW51U2l6ZUludmFsaWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVTaXplSW52YWxpZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTWFjQXBwZW5kTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0FwcGVuZE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBkYXRhKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0UmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydFJlc01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgYWZ0ZXJJdGVtKSAtPiBOb25lIil9LAorICAgIHsiQXBwZW5kUmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZFJlc01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY0luc2VydE1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjSW5zZXJ0TWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBpdGVtU3RyaW5nLCBzaG9ydCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJEZWxldGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0RlbGV0ZU1lbnVJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0Rm9udFJlc01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRGb250UmVzTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgYWZ0ZXJJdGVtLCBzaG9ydCBzY3JpcHRGaWx0ZXIpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnRJbnRsUmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydEludGxSZXNNZW51LCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IGFmdGVySXRlbSwgc2hvcnQgc2NyaXB0RmlsdGVyKSAtPiBOb25lIil9LAorICAgIHsiQXBwZW5kTWVudUl0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQXBwZW5kTWVudUl0ZW1UZXh0LCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51SXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBpblN0cmluZywgTWVudUl0ZW1JbmRleCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5TWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ29weU1lbnVJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkZpcnN0SXRlbSwgSXRlbUNvdW50IGluTnVtSXRlbXMsIE1lbnVIYW5kbGUgaW5EZXN0TWVudSwgTWVudUl0ZW1JbmRleCBpbkluc2VydEFmdGVyKSAtPiBOb25lIil9LAorICAgIHsiRGVsZXRlTWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGVsZXRlTWVudUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtLCBJdGVtQ291bnQgaW5OdW1JdGVtcykgLT4gTm9uZSIpfSwKKyAgICB7IkFwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcsIE1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXMsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoTWVudUl0ZW1JbmRleCBvdXROZXdJdGVtKSIpfSwKKyAgICB7Ikluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcsIE1lbnVJdGVtSW5kZXggaW5BZnRlckl0ZW0sIE1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXMsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAorICAgIHsiUG9wVXBNZW51U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUG9wVXBNZW51U2VsZWN0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB0b3AsIHNob3J0IGxlZnQsIHNob3J0IHBvcFVwSXRlbSkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkludmFsaWRhdGVNZW51RW5hYmxpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnZhbGlkYXRlTWVudUVuYWJsaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVCYXJJbnZhbGlkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51QmFySW52YWxpZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTWFjSW5zZXJ0TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0luc2VydE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJRCBiZWZvcmVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFJvb3RNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0Um9vdE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY0NoZWNrTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNDaGVja01lbnVJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBCb29sZWFuIGNoZWNrZWQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIFN0cjI1NSBpdGVtU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1UZXh0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoU3RyMjU1IGl0ZW1TdHJpbmcpIil9LAorICAgIHsiU2V0SXRlbU1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRJdGVtTWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgQ2hhclBhcmFtZXRlciBtYXJrQ2hhcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldEl0ZW1NYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbU1hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChDaGFyUGFyYW1ldGVyIG1hcmtDaGFyKSIpfSwKKyAgICB7IlNldEl0ZW1DbWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRJdGVtQ21kLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBDaGFyUGFyYW1ldGVyIGNtZENoYXIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRJdGVtQ21kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbUNtZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKENoYXJQYXJhbWV0ZXIgY21kQ2hhcikiKX0sCisgICAgeyJTZXRJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1JY29uLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBzaG9ydCBpY29uSW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEl0ZW1JY29uLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoc2hvcnQgaWNvbkluZGV4KSIpfSwKKyAgICB7IlNldEl0ZW1TdHlsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1TdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgU3R5bGVQYXJhbWV0ZXIgY2hTdHlsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEl0ZW1TdHlsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEl0ZW1TdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKFN0eWxlIGNoU3R5bGUpIil9LAorICAgIHsiU2V0TWVudUl0ZW1Db21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUNvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUNvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtQ29tbWFuZElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoTWVudUNvbW1hbmQgb3V0Q29tbWFuZElEKSIpfSwKKyAgICB7IlNldE1lbnVJdGVtTW9kaWZpZXJzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1Nb2RpZmllcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFVJbnQ4IGluTW9kaWZpZXJzKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1Nb2RpZmllcnMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbU1vZGlmaWVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFVJbnQ4IG91dE1vZGlmaWVycykiKX0sCisgICAgeyJTZXRNZW51SXRlbUljb25IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUljb25IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFVJbnQ4IGluSWNvblR5cGUsIEhhbmRsZSBpbkljb25IYW5kbGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUljb25IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUljb25IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChVSW50OCBvdXRJY29uVHlwZSwgSGFuZGxlIG91dEljb25IYW5kbGUpIil9LAorICAgIHsiU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVRleHRFbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVGV4dEVuY29kaW5nIGluU2NyaXB0SUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbVRleHRFbmNvZGluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtVGV4dEVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoVGV4dEVuY29kaW5nIG91dFNjcmlwdElEKSIpfSwKKyAgICB7IlNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUhpZXJhcmNoaWNhbElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBNZW51SUQgaW5IaWVySUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKE1lbnVJRCBvdXRIaWVySUQpIil9LAorICAgIHsiU2V0TWVudUl0ZW1Gb250SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUZvbnRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgU0ludDE2IGluRm9udElEKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1Gb250SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUZvbnRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFNJbnQxNiBvdXRGb250SUQpIil9LAorICAgIHsiU2V0TWVudUl0ZW1SZWZDb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVUludDMyIGluUmVmQ29uKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1SZWZDb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbVJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFVJbnQzMiBvdXRSZWZDb24pIil9LAorICAgIHsiU2V0TWVudUl0ZW1LZXlHbHlwaCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtS2V5R2x5cGgsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFNJbnQxNiBpbkdseXBoKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1LZXlHbHlwaCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtS2V5R2x5cGgsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChTSW50MTYgb3V0R2x5cGgpIil9LAorICAgIHsiTWFjRW5hYmxlTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNFbmFibGVNZW51SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZU1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGlzYWJsZU1lbnVJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVJdGVtRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUl0ZW1FbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJFbmFibGVNZW51SXRlbUljb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVNZW51SXRlbUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IkRpc2FibGVNZW51SXRlbUljb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlTWVudUl0ZW1JY29uLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVJdGVtSWNvbkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVJdGVtSWNvbkVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIE1lbnVIYW5kbGUgaW5IaWVyTWVudSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChNZW51SGFuZGxlIG91dEhpZXJNZW51KSIpfSwKKyAgICB7IkNvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nKSIpfSwKKyAgICB7IlNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIENGU3RyaW5nUmVmIGluU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1JbmRlbnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUluZGVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChVSW50MzIgb3V0SW5kZW50KSIpfSwKKyAgICB7IlNldE1lbnVJdGVtSW5kZW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1JbmRlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBVSW50MzIgaW5JbmRlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUNvbW1hbmRLZXkiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUNvbW1hbmRLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBCb29sZWFuIGluR2V0VmlydHVhbEtleSkgLT4gKFVJbnQxNiBvdXRLZXkpIil9LAorICAgIHsiU2V0TWVudUl0ZW1Db21tYW5kS2V5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1Db21tYW5kS2V5LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgQm9vbGVhbiBpblNldFZpcnR1YWxLZXksIFVJbnQxNiBpbktleSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSwgT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnKSAtPiAoVUludDMyIGF0dHJpYnV0ZXMpIil9LAorICAgIHsiQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtLCBPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcsIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQsIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVBdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXMpIil9LAorICAgIHsiQ2hhbmdlTWVudUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGFuZ2VNZW51QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUF0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzLCBNZW51QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtQXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiAoTWVudUl0ZW1BdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXMpIil9LAorICAgIHsiQ2hhbmdlTWVudUl0ZW1BdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ2hhbmdlTWVudUl0ZW1BdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0sIE1lbnVJdGVtQXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXMsIE1lbnVJdGVtQXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkRpc2FibGVBbGxNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlQWxsTWVudUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJFbmFibGVBbGxNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVBbGxNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1lbnVIYXNFbmFibGVkSXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NZW51SGFzRW5hYmxlZEl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRNZW51VHlwZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVUeXBlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MTYgb3V0VHlwZSkiKX0sCisgICAgeyJDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCisgICAgeyJHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVSW50MzIgaW5JdGVtSW5kZXgpIC0+IChNZW51SGFuZGxlIG91dE1lbnUsIE1lbnVJdGVtSW5kZXggb3V0SW5kZXgpIil9LAorICAgIHsiRW5hYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVNZW51Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCisgICAgeyJEaXNhYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlTWVudUNvbW1hbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAorICAgIHsiSXNNZW51Q29tbWFuZEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVDb21tYW5kRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRNZW51Q29tbWFuZE1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51Q29tbWFuZE1hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVbmlDaGFyIGluTWFyaykgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVDb21tYW5kTWFyayIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVDb21tYW5kTWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChVbmlDaGFyIG91dE1hcmspIil9LAorICAgIHsiR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IChCeXRlQ291bnQgb3V0U2l6ZSkiKX0sCisgICAgeyJSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVJdGVtSW52YWxpZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUl0ZW1JbnZhbGlkLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkludmFsaWRhdGVNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnZhbGlkYXRlTWVudUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtLCBJdGVtQ291bnQgaW5OdW1JdGVtcykgLT4gTm9uZSIpfSwKKyAgICB7IlVwZGF0ZUludmFsaWRNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9VcGRhdGVJbnZhbGlkTWVudUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDcmVhdGVTdGFuZGFyZEZvbnRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ3JlYXRlU3RhbmRhcmRGb250TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBhZnRlckl0ZW0sIE1lbnVJRCBmaXJzdEhpZXJNZW51SUQsIE9wdGlvbkJpdHMgb3B0aW9ucykgLT4gKEl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50KSIpfSwKKyAgICB7IlVwZGF0ZVN0YW5kYXJkRm9udE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9VcGRhdGVTdGFuZGFyZEZvbnRNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudCkiKX0sCisgICAgeyJHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKEZNRm9udEZhbWlseSBvdXRGb250RmFtaWx5LCBGTUZvbnRTdHlsZSBvdXRTdHlsZSkiKX0sCisgICAgeyJHZXRNZW51SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVJRCBfcnYpIil9LAorICAgIHsiR2V0TWVudVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudVdpZHRoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkdldE1lbnVIZWlnaHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SGVpZ2h0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IlNldE1lbnVJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1lbnVXaWR0aCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHdpZHRoKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVudUhlaWdodCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBoZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJhc19SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX2FzX1Jlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkFwcGVuZE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9BcHBlbmRNZW51LCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgZGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBiZWZvcmVJRCkgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydE1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0TWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBpdGVtU3RyaW5nLCBzaG9ydCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJFbmFibGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZU1lbnVJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgaXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IkNoZWNrTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGVja01lbnVJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBCb29sZWFuIGNoZWNrZWQpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIE1lbnVPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0yNTQwLDYxICsyNTQwLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JTWVudUhhbmRsZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIE1lbnVIYW5kbGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTWVudU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKE1lbnVPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTWVudU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKE1lbnVPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgTWVudU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBNZW51X1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX01lbnUuTWVudSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKE1lbnVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBNZW51T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIE1lbnVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIE1lbnVPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIE1lbnVPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JTWVudU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlNZW51T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCU1lbnVPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCU1lbnVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JTWVudU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCU1lbnVPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9NZW51Lk1lbnUiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihNZW51T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgTWVudU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBNZW51T2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBNZW51T2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBNZW51T2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIE1lbnVPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgTWVudU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBNZW51T2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBNZW51T2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIE1lbnVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBNZW51T2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIE1lbnUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjYwMiw4NDIgKzI2MDIsODQyIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9OZXdNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKLQlNZW51SUQgbWVudUlEOwotCVN0cjI1NSBtZW51VGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVIYW5kbGUgX3J2OworICAgIE1lbnVJRCBtZW51SUQ7CisgICAgU3RyMjU1IG1lbnVUaXRsZTsKICNpZm5kZWYgTmV3TWVudQotCVB5TWFjX1BSRUNIRUNLKE5ld01lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBtZW51VGl0bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdNZW51KG1lbnVJRCwKLQkgICAgICAgICAgICAgIG1lbnVUaXRsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG1lbnVUaXRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01lbnUobWVudUlELAorICAgICAgICAgICAgICAgICAgbWVudVRpdGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfTWFjR2V0TWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUhhbmRsZSBfcnY7Ci0Jc2hvcnQgcmVzb3VyY2VJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBfcnY7CisgICAgc2hvcnQgcmVzb3VyY2VJRDsKICNpZm5kZWYgTWFjR2V0TWVudQotCVB5TWFjX1BSRUNIRUNLKE1hY0dldE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0dldE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWFjR2V0TWVudShyZXNvdXJjZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1hY0dldE1lbnUocmVzb3VyY2VJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0NyZWF0ZU5ld01lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUlEIGluTWVudUlEOwotCU1lbnVBdHRyaWJ1dGVzIGluTWVudUF0dHJpYnV0ZXM7Ci0JTWVudUhhbmRsZSBvdXRNZW51UmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJRCBpbk1lbnVJRDsKKyAgICBNZW51QXR0cmlidXRlcyBpbk1lbnVBdHRyaWJ1dGVzOworICAgIE1lbnVIYW5kbGUgb3V0TWVudVJlZjsKICNpZm5kZWYgQ3JlYXRlTmV3TWVudQotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZU5ld01lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZU5ld01lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5NZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1lbnVBdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZU5ld01lbnUoaW5NZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgaW5NZW51QXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAmb3V0TWVudVJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51UmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWVudUF0dHJpYnV0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlTmV3TWVudShpbk1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbk1lbnVBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnVSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfTWVudUtleShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JQ2hhclBhcmFtZXRlciBjaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgQ2hhclBhcmFtZXRlciBjaDsKICNpZm5kZWYgTWVudUtleQotCVB5TWFjX1BSRUNIRUNLKE1lbnVLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lbnVLZXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lbnVLZXkoY2gpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2gpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZW51S2V5KGNoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X01lbnVTZWxlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVBvaW50IHN0YXJ0UHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFBvaW50IHN0YXJ0UHQ7CiAjaWZuZGVmIE1lbnVTZWxlY3QKLQlQeU1hY19QUkVDSEVDSyhNZW51U2VsZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZW51U2VsZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVudVNlbGVjdChzdGFydFB0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lbnVTZWxlY3Qoc3RhcnRQdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NZW51Q2hvaWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIE1lbnVDaG9pY2UKLQlQeU1hY19QUkVDSEVDSyhNZW51Q2hvaWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZW51Q2hvaWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZW51Q2hvaWNlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lbnVDaG9pY2UoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X01lbnVFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKLQlFdmVudFJlY29yZCBpbkV2ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OworICAgIEV2ZW50UmVjb3JkIGluRXZlbnQ7CiAjaWZuZGVmIE1lbnVFdmVudAotCVB5TWFjX1BSRUNIRUNLKE1lbnVFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVudUV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpbkV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVudUV2ZW50KCZpbkV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmaW5FdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lbnVFdmVudCgmaW5FdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNQmFySGVpZ2h0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0TUJhckhlaWdodAotCVB5TWFjX1BSRUNIRUNLKEdldE1CYXJIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1CYXJIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1CYXJIZWlnaHQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TUJhckhlaWdodCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfTWFjRHJhd01lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgTWFjRHJhd01lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhNYWNEcmF3TWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRHJhd01lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU1hY0RyYXdNZW51QmFyKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNEcmF3TWVudUJhcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0ludmFsTWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBJbnZhbE1lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhJbnZhbE1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmFsTWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW52YWxNZW51QmFyKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnZhbE1lbnVCYXIoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9IaWxpdGVNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SUQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SUQgbWVudUlEOwogI2lmbmRlZiBIaWxpdGVNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soSGlsaXRlTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlsaXRlTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCUhpbGl0ZU1lbnUobWVudUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWxpdGVNZW51KG1lbnVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfR2V0TmV3TUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUJhckhhbmRsZSBfcnY7Ci0Jc2hvcnQgbWVudUJhcklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51QmFySGFuZGxlIF9ydjsKKyAgICBzaG9ydCBtZW51QmFySUQ7CiAjaWZuZGVmIEdldE5ld01CYXIKLQlQeU1hY19QUkVDSEVDSyhHZXROZXdNQmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXdNQmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUJhcklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV3TUJhcihtZW51QmFySUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVCYXJJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5ld01CYXIobWVudUJhcklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51QmFySGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUJhckhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51QmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51QmFyKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51QmFyKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfU2V0TWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUJhckhhbmRsZSBtYmFyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51QmFySGFuZGxlIG1iYXI7CiAjaWZuZGVmIFNldE1lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51QmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZtYmFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TWVudUJhcihtYmFyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1iYXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZW51QmFyKG1iYXIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0R1cGxpY2F0ZU1lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUJhckhhbmRsZSBpbk1iYXI7Ci0JTWVudUJhckhhbmRsZSBvdXRNYmFyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVCYXJIYW5kbGUgaW5NYmFyOworICAgIE1lbnVCYXJIYW5kbGUgb3V0TWJhcjsKICNpZm5kZWYgRHVwbGljYXRlTWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKER1cGxpY2F0ZU1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKER1cGxpY2F0ZU1lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluTWJhcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEdXBsaWNhdGVNZW51QmFyKGluTWJhciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWJhcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dE1iYXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbk1iYXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHVwbGljYXRlTWVudUJhcihpbk1iYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1iYXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvdXRNYmFyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0Rpc3Bvc2VNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVCYXJIYW5kbGUgaW5NYmFyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVCYXJIYW5kbGUgaW5NYmFyOwogI2lmbmRlZiBEaXNwb3NlTWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VNZW51QmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlTWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5NYmFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERpc3Bvc2VNZW51QmFyKGluTWJhcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluTWJhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEaXNwb3NlTWVudUJhcihpbk1iYXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfR2V0TWVudUhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUhhbmRsZSBfcnY7Ci0JTWVudUlEIG1lbnVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBfcnY7CisgICAgTWVudUlEIG1lbnVJRDsKICNpZm5kZWYgR2V0TWVudUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51SGFuZGxlKG1lbnVJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lbnVIYW5kbGUobWVudUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfTWFjRGVsZXRlTWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUlEIG1lbnVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUlEIG1lbnVJRDsKICNpZm5kZWYgTWFjRGVsZXRlTWVudQotCVB5TWFjX1BSRUNIRUNLKE1hY0RlbGV0ZU1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0RlbGV0ZU1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNEZWxldGVNZW51KG1lbnVJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjRGVsZXRlTWVudShtZW51SUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0NsZWFyTWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDbGVhck1lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhDbGVhck1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKENsZWFyTWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2xlYXJNZW51QmFyKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbGVhck1lbnVCYXIoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9TZXRNZW51Rmxhc2hDb3VudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgY291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGNvdW50OwogI2lmbmRlZiBTZXRNZW51Rmxhc2hDb3VudAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVGbGFzaENvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51Rmxhc2hDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TWVudUZsYXNoQ291bnQoY291bnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVudUZsYXNoQ291bnQoY291bnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0ZsYXNoTWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUlEIG1lbnVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUlEIG1lbnVJRDsKICNpZm5kZWYgRmxhc2hNZW51QmFyCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZW51QmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlGbGFzaE1lbnVCYXIobWVudUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGbGFzaE1lbnVCYXIobWVudUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9Jc01lbnVCYXJWaXNpYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzTWVudUJhclZpc2libGUKLQlQeU1hY19QUkVDSEVDSyhJc01lbnVCYXJWaXNpYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc01lbnVCYXJWaXNpYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVCYXJWaXNpYmxlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUJhclZpc2libGUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X1Nob3dNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNob3dNZW51QmFyCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd01lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93TWVudUJhcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hvd01lbnVCYXIoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9IaWRlTWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBIaWRlTWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKEhpZGVNZW51QmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlTWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZU1lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpZGVNZW51QmFyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfQWNxdWlyZVJvb3RNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBfcnY7CiAjaWZuZGVmIEFjcXVpcmVSb290TWVudQotCVB5TWFjX1BSRUNIRUNLKEFjcXVpcmVSb290TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWNxdWlyZVJvb3RNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBBY3F1aXJlUm9vdE1lbnUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBBY3F1aXJlUm9vdE1lbnUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRGVsZXRlTUNFbnRyaWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SUQgbWVudUlEOwotCXNob3J0IG1lbnVJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SUQgbWVudUlEOworICAgIHNob3J0IG1lbnVJdGVtOwogI2lmbmRlZiBEZWxldGVNQ0VudHJpZXMKLQlQeU1hY19QUkVDSEVDSyhEZWxldGVNQ0VudHJpZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKERlbGV0ZU1DRW50cmllcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZW51SXRlbSkpCi0JCXJldHVybiBOVUxMOwotCURlbGV0ZU1DRW50cmllcyhtZW51SUQsCi0JICAgICAgICAgICAgICAgIG1lbnVJdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEZWxldGVNQ0VudHJpZXMobWVudUlELAorICAgICAgICAgICAgICAgICAgICBtZW51SXRlbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfSW5pdENvbnRleHR1YWxNZW51cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgSW5pdENvbnRleHR1YWxNZW51cwotCVB5TWFjX1BSRUNIRUNLKEluaXRDb250ZXh0dWFsTWVudXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEluaXRDb250ZXh0dWFsTWVudXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbml0Q29udGV4dHVhbE1lbnVzKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbml0Q29udGV4dHVhbE1lbnVzKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9Jc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCBpbkV2ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCBpbkV2ZW50OwogI2lmbmRlZiBJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrCi0JUHlNYWNfUFJFQ0hFQ0soSXNTaG93Q29udGV4dHVhbE1lbnVDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNTaG93Q29udGV4dHVhbE1lbnVDbGljayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmaW5FdmVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2soJmluRXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpbkV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNTaG93Q29udGV4dHVhbE1lbnVDbGljaygmaW5FdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9MTUdldFRoZU1lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIExNR2V0VGhlTWVudQotCVB5TWFjX1BSRUNIRUNLKExNR2V0VGhlTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRUaGVNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldFRoZU1lbnUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRUaGVNZW51KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9hc19NZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBfcnY7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIGFzX01lbnUKLQlQeU1hY19QUkVDSEVDSyhhc19NZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhhc19NZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gYXNfTWVudShoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfTWVudShoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfR2V0TWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUhhbmRsZSBfcnY7Ci0Jc2hvcnQgcmVzb3VyY2VJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBfcnY7CisgICAgc2hvcnQgcmVzb3VyY2VJRDsKICNpZm5kZWYgR2V0TWVudQotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVudShyZXNvdXJjZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lbnUocmVzb3VyY2VJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0RlbGV0ZU1lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IG1lbnVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbWVudUlEOwogI2lmbmRlZiBEZWxldGVNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCURlbGV0ZU1lbnUobWVudUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEZWxldGVNZW51KG1lbnVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRHJhd01lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRHJhd01lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhEcmF3TWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd01lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURyYXdNZW51QmFyKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmF3TWVudUJhcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0NvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSXRlbUNvdW50IF9ydjsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSXRlbUNvdW50IF9ydjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElECi0JUHlNYWNfUFJFQ0hFQ0soQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JVUludDMyIGluSXRlbUluZGV4OwotCU1lbnVIYW5kbGUgb3V0TWVudTsKLQlNZW51SXRlbUluZGV4IG91dEluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFVJbnQzMiBpbkl0ZW1JbmRleDsKKyAgICBNZW51SGFuZGxlIG91dE1lbnU7CisgICAgTWVudUl0ZW1JbmRleCBvdXRJbmRleDsKICNpZm5kZWYgR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElECi0JUHlNYWNfUFJFQ0hFQ0soR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKGluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKGluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9FbmFibGVNZW51Q29tbWFuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBFbmFibGVNZW51Q29tbWFuZAotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVDb21tYW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbmFibGVNZW51Q29tbWFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCUVuYWJsZU1lbnVDb21tYW5kKGluTWVudSwKLQkgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRW5hYmxlTWVudUNvbW1hbmQoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9EaXNhYmxlTWVudUNvbW1hbmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgRGlzYWJsZU1lbnVDb21tYW5kCi0JUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZU1lbnVDb21tYW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUNvbW1hbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNhYmxlTWVudUNvbW1hbmQoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzYWJsZU1lbnVDb21tYW5kKGluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0lzTWVudUNvbW1hbmRFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgTWVudUhhbmRsZSBpbk1lbnU7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CiAjaWZuZGVmIElzTWVudUNvbW1hbmRFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soSXNNZW51Q29tbWFuZEVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudUNvbW1hbmRFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNZW51Q29tbWFuZEVuYWJsZWQoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUNvbW1hbmRFbmFibGVkKGluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9TZXRNZW51Q29tbWFuZE1hcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JVW5pQ2hhciBpbk1hcms7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUhhbmRsZSBpbk1lbnU7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgVW5pQ2hhciBpbk1hcms7CiAjaWZuZGVmIFNldE1lbnVDb21tYW5kTWFyawotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVDb21tYW5kTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUNvbW1hbmRNYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWFyaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51Q29tbWFuZE1hcmsoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hcmspOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWFyaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51Q29tbWFuZE1hcmsoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hcmspOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfR2V0TWVudUNvbW1hbmRNYXJrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCVVuaUNoYXIgb3V0TWFyazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBVbmlDaGFyIG91dE1hcms7CiAjaWZuZGVmIEdldE1lbnVDb21tYW5kTWFyawotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVDb21tYW5kTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRNYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVDb21tYW5kTWFyayhpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYXJrKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRNYXJrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51Q29tbWFuZE1hcmsoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWFyayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TWFyayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7Ci0JT1NUeXBlIGluUHJvcGVydHlUYWc7Ci0JQnl0ZUNvdW50IG91dFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUhhbmRsZSBpbk1lbnU7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBpblByb3BlcnR5VGFnOworICAgIEJ5dGVDb3VudCBvdXRTaXplOwogI2lmbmRlZiBHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKGluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0U2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZShpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7Ci0JT1NUeXBlIGluUHJvcGVydHlUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUhhbmRsZSBpbk1lbnU7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBpblByb3BlcnR5VGFnOwogI2lmbmRlZiBSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eShpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eVRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIE1lbnVfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiTmV3TWVudSIsIChQeUNGdW5jdGlvbilNZW51X05ld01lbnUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQsIFN0cjI1NSBtZW51VGl0bGUpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCi0JeyJNYWNHZXRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWFjR2V0TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzb3VyY2VJRCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKLQl7IkNyZWF0ZU5ld01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9DcmVhdGVOZXdNZW51LCAxLAotCSBQeURvY19TVFIoIihNZW51SUQgaW5NZW51SUQsIE1lbnVBdHRyaWJ1dGVzIGluTWVudUF0dHJpYnV0ZXMpIC0+IChNZW51SGFuZGxlIG91dE1lbnVSZWYpIil9LAotCXsiTWVudUtleSIsIChQeUNGdW5jdGlvbilNZW51X01lbnVLZXksIDEsCi0JIFB5RG9jX1NUUigiKENoYXJQYXJhbWV0ZXIgY2gpIC0+IChsb25nIF9ydikiKX0sCi0JeyJNZW51U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWVudVNlbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQdCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik1lbnVDaG9pY2UiLCAoUHlDRnVuY3Rpb24pTWVudV9NZW51Q2hvaWNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJNZW51RXZlbnQiLCAoUHlDRnVuY3Rpb24pTWVudV9NZW51RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGluRXZlbnQpIC0+IChVSW50MzIgX3J2KSIpfSwKLQl7IkdldE1CYXJIZWlnaHQiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNQmFySGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiTWFjRHJhd01lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9NYWNEcmF3TWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSW52YWxNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSW52YWxNZW51QmFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJIaWxpdGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSGlsaXRlTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKLQl7IkdldE5ld01CYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXROZXdNQmFyLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtZW51QmFySUQpIC0+IChNZW51QmFySGFuZGxlIF9ydikiKX0sCi0JeyJHZXRNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUJhckhhbmRsZSBfcnYpIil9LAotCXsiU2V0TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X1NldE1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVCYXJIYW5kbGUgbWJhcikgLT4gTm9uZSIpfSwKLQl7IkR1cGxpY2F0ZU1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9EdXBsaWNhdGVNZW51QmFyLCAxLAotCSBQeURvY19TVFIoIihNZW51QmFySGFuZGxlIGluTWJhcikgLT4gKE1lbnVCYXJIYW5kbGUgb3V0TWJhcikiKX0sCi0JeyJEaXNwb3NlTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0Rpc3Bvc2VNZW51QmFyLCAxLAotCSBQeURvY19TVFIoIihNZW51QmFySGFuZGxlIGluTWJhcikgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAotCXsiTWFjRGVsZXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51X01hY0RlbGV0ZU1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IE5vbmUiKX0sCi0JeyJDbGVhck1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9DbGVhck1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldE1lbnVGbGFzaENvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfU2V0TWVudUZsYXNoQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvdW50KSAtPiBOb25lIil9LAotCXsiRmxhc2hNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRmxhc2hNZW51QmFyLCAxLAotCSBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiBOb25lIil9LAotCXsiSXNNZW51QmFyVmlzaWJsZSIsIChQeUNGdW5jdGlvbilNZW51X0lzTWVudUJhclZpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNob3dNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfU2hvd01lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkhpZGVNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSGlkZU1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFjcXVpcmVSb290TWVudSIsIChQeUNGdW5jdGlvbilNZW51X0FjcXVpcmVSb290TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAotCXsiRGVsZXRlTUNFbnRyaWVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRGVsZXRlTUNFbnRyaWVzLCAxLAotCSBQeURvY19TVFIoIihNZW51SUQgbWVudUlELCBzaG9ydCBtZW51SXRlbSkgLT4gTm9uZSIpfSwKLQl7IkluaXRDb250ZXh0dWFsTWVudXMiLCAoUHlDRnVuY3Rpb24pTWVudV9Jbml0Q29udGV4dHVhbE1lbnVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSXNTaG93Q29udGV4dHVhbE1lbnVDbGljaywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaW5FdmVudCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkxNR2V0VGhlTWVudSIsIChQeUNGdW5jdGlvbilNZW51X0xNR2V0VGhlTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJhc19NZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfYXNfTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCi0JeyJHZXRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzb3VyY2VJRCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKLQl7IkRlbGV0ZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9EZWxldGVNZW51LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtZW51SUQpIC0+IE5vbmUiKX0sCi0JeyJEcmF3TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0RyYXdNZW51QmFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudV9Db3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKEl0ZW1Db3VudCBfcnYpIil9LAotCXsiR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIFVJbnQzMiBpbkl0ZW1JbmRleCkgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSwgTWVudUl0ZW1JbmRleCBvdXRJbmRleCkiKX0sCi0JeyJFbmFibGVNZW51Q29tbWFuZCIsIChQeUNGdW5jdGlvbilNZW51X0VuYWJsZU1lbnVDb21tYW5kLCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCi0JeyJEaXNhYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudV9EaXNhYmxlTWVudUNvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKLQl7IklzTWVudUNvbW1hbmRFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSXNNZW51Q29tbWFuZEVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldE1lbnVDb21tYW5kTWFyayIsIChQeUNGdW5jdGlvbilNZW51X1NldE1lbnVDb21tYW5kTWFyaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVbmlDaGFyIGluTWFyaykgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVDb21tYW5kTWFyayIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnVDb21tYW5kTWFyaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoVW5pQ2hhciBvdXRNYXJrKSIpfSwKLQl7IkdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgaW5Qcm9wZXJ0eVRhZykgLT4gKEJ5dGVDb3VudCBvdXRTaXplKSIpfSwKLQl7IlJlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pTWVudV9SZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IE5vbmUiKX0sCisgICAgeyJOZXdNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTmV3TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCwgU3RyMjU1IG1lbnVUaXRsZSkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik1hY0dldE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9NYWNHZXRNZW51LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZXNvdXJjZUlEKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAorICAgIHsiQ3JlYXRlTmV3TWVudSIsIChQeUNGdW5jdGlvbilNZW51X0NyZWF0ZU5ld01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJRCBpbk1lbnVJRCwgTWVudUF0dHJpYnV0ZXMgaW5NZW51QXR0cmlidXRlcykgLT4gKE1lbnVIYW5kbGUgb3V0TWVudVJlZikiKX0sCisgICAgeyJNZW51S2V5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWVudUtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7Ik1lbnVTZWxlY3QiLCAoUHlDRnVuY3Rpb24pTWVudV9NZW51U2VsZWN0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFB0KSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiTWVudUNob2ljZSIsIChQeUNGdW5jdGlvbilNZW51X01lbnVDaG9pY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7Ik1lbnVFdmVudCIsIChQeUNGdW5jdGlvbilNZW51X01lbnVFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaW5FdmVudCkgLT4gKFVJbnQzMiBfcnYpIil9LAorICAgIHsiR2V0TUJhckhlaWdodCIsIChQeUNGdW5jdGlvbilNZW51X0dldE1CYXJIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJNYWNEcmF3TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X01hY0RyYXdNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJbnZhbE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9JbnZhbE1lbnVCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkhpbGl0ZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9IaWxpdGVNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiBOb25lIil9LAorICAgIHsiR2V0TmV3TUJhciIsIChQeUNGdW5jdGlvbilNZW51X0dldE5ld01CYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IG1lbnVCYXJJRCkgLT4gKE1lbnVCYXJIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51QmFySGFuZGxlIF9ydikiKX0sCisgICAgeyJTZXRNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfU2V0TWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUJhckhhbmRsZSBtYmFyKSAtPiBOb25lIil9LAorICAgIHsiRHVwbGljYXRlTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0R1cGxpY2F0ZU1lbnVCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVCYXJIYW5kbGUgaW5NYmFyKSAtPiAoTWVudUJhckhhbmRsZSBvdXRNYmFyKSIpfSwKKyAgICB7IkRpc3Bvc2VNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRGlzcG9zZU1lbnVCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVCYXJIYW5kbGUgaW5NYmFyKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUhhbmRsZSIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnVIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCisgICAgeyJNYWNEZWxldGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWFjRGVsZXRlTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkNsZWFyTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0NsZWFyTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVudUZsYXNoQ291bnQiLCAoUHlDRnVuY3Rpb24pTWVudV9TZXRNZW51Rmxhc2hDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQpIC0+IE5vbmUiKX0sCisgICAgeyJGbGFzaE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9GbGFzaE1lbnVCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVCYXJWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSXNNZW51QmFyVmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2hvd01lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9TaG93TWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlkZU1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9IaWRlTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQWNxdWlyZVJvb3RNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQWNxdWlyZVJvb3RNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCisgICAgeyJEZWxldGVNQ0VudHJpZXMiLCAoUHlDRnVuY3Rpb24pTWVudV9EZWxldGVNQ0VudHJpZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQsIHNob3J0IG1lbnVJdGVtKSAtPiBOb25lIil9LAorICAgIHsiSW5pdENvbnRleHR1YWxNZW51cyIsIChQeUNGdW5jdGlvbilNZW51X0luaXRDb250ZXh0dWFsTWVudXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IklzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2siLCAoUHlDRnVuY3Rpb24pTWVudV9Jc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpbkV2ZW50KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTE1HZXRUaGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTE1HZXRUaGVNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7ImFzX01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9hc19NZW51LCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZXNvdXJjZUlEKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAorICAgIHsiRGVsZXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51X0RlbGV0ZU1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IG1lbnVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRHJhd01lbnVCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51X0NvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCisgICAgeyJHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgVUludDMyIGluSXRlbUluZGV4KSAtPiAoTWVudUhhbmRsZSBvdXRNZW51LCBNZW51SXRlbUluZGV4IG91dEluZGV4KSIpfSwKKyAgICB7IkVuYWJsZU1lbnVDb21tYW5kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRW5hYmxlTWVudUNvbW1hbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpc2FibGVNZW51Q29tbWFuZCIsIChQeUNGdW5jdGlvbilNZW51X0Rpc2FibGVNZW51Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAorICAgIHsiSXNNZW51Q29tbWFuZEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudV9Jc01lbnVDb21tYW5kRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfU2V0TWVudUNvbW1hbmRNYXJrLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIFVuaUNoYXIgaW5NYXJrKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TWVudUNvbW1hbmRNYXJrLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChVbmlDaGFyIG91dE1hcmspIil9LAorICAgIHsiR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBpblByb3BlcnR5VGFnKSAtPiAoQnl0ZUNvdW50IG91dFNpemUpIil9LAorICAgIHsiUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilNZW51X1JlbW92ZU1lbnVDb21tYW5kUHJvcGVydHksIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgaW5Qcm9wZXJ0eVRhZykgLT4gTm9uZSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0zNDQ1LDMxICszNDQ1LDMxIEBACiAKIHZvaWQgaW5pdF9NZW51KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNZW51SGFuZGxlLCBNZW51T2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTWVudUhhbmRsZSwgTWVudU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoTWVudUhhbmRsZSwgTWVudU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTWVudUhhbmRsZSwgTWVudU9ial9Db252ZXJ0KTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX01lbnUiLCBNZW51X21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfTWVudSIsIE1lbnVfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JTWVudV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKE1lbnVfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBNZW51X0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JTWVudV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmTWVudV9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJk1lbnVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZW51IiwgKFB5T2JqZWN0ICopJk1lbnVfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZNZW51X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVudVR5cGUiLCAoUHlPYmplY3QgKikmTWVudV9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBNZW51X0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoTWVudV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIE1lbnVfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBNZW51X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZNZW51X1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmTWVudV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lbnUiLCAoUHlPYmplY3QgKikmTWVudV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJk1lbnVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZW51VHlwZSIsIChQeU9iamVjdCAqKSZNZW51X1R5cGUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL21sdGUvX01sdGVtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL21sdGUvX01sdGVtb2R1bGUuYwppbmRleCAxYTZiNmE0Li5jZDY5OGY0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9tbHRlL19NbHRlbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvbWx0ZS9fTWx0ZW1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zOSwxNCArMzksMTQgQEAKIHN0YXRpYyBpbnQKIE9wdEZTU3BlY1B0cl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBGU1NwZWMgKipwX2l0c2VsZikKIHsKLSAgICAgICAgc3RhdGljIEZTU3BlYyBmc3M7Ci0gICAgICAgIGlmICh2ID09IFB5X05vbmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgICpwX2l0c2VsZiA9ICZmc3M7Ci0gICAgICAgIHJldHVybiBQeU1hY19HZXRGU1NwZWModiwgKnBfaXRzZWxmKTsKKyAgICBzdGF0aWMgRlNTcGVjIGZzczsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICZmc3M7CisgICAgcmV0dXJuIFB5TWFjX0dldEZTU3BlYyh2LCAqcF9pdHNlbGYpOwogfQogCiAvKgpAQCAtNTUsMTIgKzU1LDEyIEBACiBzdGF0aWMgaW50CiBPcHRHV29ybGRPYmpfQ29udmVydChQeU9iamVjdCAqdiwgR1dvcmxkUHRyICpwX2l0c2VsZikKIHsKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEdXb3JsZE9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBHV29ybGRPYmpfQ29udmVydCh2LCBwX2l0c2VsZik7CiB9CiAKIApAQCAtNzMsMTE1OSArNzMsMTE1OSBAQAogI2RlZmluZSBUWE5PYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmVFhOT2JqZWN0X1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlRYTk9iamVjdF9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgVFhOT2JqZWN0T2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVFhOT2JqZWN0IG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgVFhOT2JqZWN0IG9iX2l0c2VsZjsKIH0gVFhOT2JqZWN0T2JqZWN0OwogCiBQeU9iamVjdCAqVFhOT2JqX05ldyhUWE5PYmplY3QgaXRzZWxmKQogewotCVRYTk9iamVjdE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKFRYTk9iamVjdE9iamVjdCwgJlRYTk9iamVjdF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgVFhOT2JqZWN0T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoVFhOT2JqZWN0T2JqZWN0LCAmVFhOT2JqZWN0X1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IFRYTk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBUWE5PYmplY3QgKnBfaXRzZWxmKQogewotCWlmICghVFhOT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRYTk9iamVjdCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChUWE5PYmplY3RPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghVFhOT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRYTk9iamVjdCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChUWE5PYmplY3RPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBUWE5PYmpfZGVhbGxvYyhUWE5PYmplY3RPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5EZWxldGVPYmplY3QoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRYTkRlbGV0ZU9iamVjdAotCVB5TWFjX1BSRUNIRUNLKFRYTkRlbGV0ZU9iamVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORGVsZXRlT2JqZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5EZWxldGVPYmplY3QoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5EZWxldGVPYmplY3QoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5SZXNpemVGcmFtZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQzMiBpV2lkdGg7Ci0JVUludDMyIGlIZWlnaHQ7Ci0JVFhORnJhbWVJRCBpVFhORnJhbWVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIGlXaWR0aDsKKyAgICBVSW50MzIgaUhlaWdodDsKKyAgICBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOwogI2lmbmRlZiBUWE5SZXNpemVGcmFtZQotCVB5TWFjX1BSRUNIRUNLKFRYTlJlc2l6ZUZyYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5SZXNpemVGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUhlaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlUWE5GcmFtZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOUmVzaXplRnJhbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpV2lkdGgsCi0JICAgICAgICAgICAgICAgaUhlaWdodCwKLQkgICAgICAgICAgICAgICBpVFhORnJhbWVJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5SZXNpemVGcmFtZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIGlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICBpSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGlUWE5GcmFtZUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNldEZyYW1lQm91bmRzKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIGlUb3A7Ci0JU0ludDMyIGlMZWZ0OwotCVNJbnQzMiBpQm90dG9tOwotCVNJbnQzMiBpUmlnaHQ7Ci0JVFhORnJhbWVJRCBpVFhORnJhbWVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIGlUb3A7CisgICAgU0ludDMyIGlMZWZ0OworICAgIFNJbnQzMiBpQm90dG9tOworICAgIFNJbnQzMiBpUmlnaHQ7CisgICAgVFhORnJhbWVJRCBpVFhORnJhbWVJRDsKICNpZm5kZWYgVFhOU2V0RnJhbWVCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhUWE5TZXRGcmFtZUJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2V0RnJhbWVCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlMZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaUJvdHRvbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlSaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlUWE5GcmFtZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOU2V0RnJhbWVCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpVG9wLAotCSAgICAgICAgICAgICAgICAgIGlMZWZ0LAotCSAgICAgICAgICAgICAgICAgIGlCb3R0b20sCi0JICAgICAgICAgICAgICAgICAgaVJpZ2h0LAotCSAgICAgICAgICAgICAgICAgIGlUWE5GcmFtZUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlUWE5GcmFtZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOU2V0RnJhbWVCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBpVG9wLAorICAgICAgICAgICAgICAgICAgICAgIGlMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIGlCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgaVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGlUWE5GcmFtZUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTktleURvd24oVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFJlY29yZCBpRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50UmVjb3JkIGlFdmVudDsKICNpZm5kZWYgVFhOS2V5RG93bgotCVB5TWFjX1BSRUNIRUNLKFRYTktleURvd24pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTktleURvd24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmlFdmVudCkpCi0JCXJldHVybiBOVUxMOwotCVRYTktleURvd24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICZpRXZlbnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmaUV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOS2V5RG93bihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgJmlFdmVudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5BZGp1c3RDdXJzb3IoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgaW9DdXJzb3JSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBpb0N1cnNvclJnbjsKICNpZm5kZWYgVFhOQWRqdXN0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQWRqdXN0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5BZGp1c3RDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmlvQ3Vyc29yUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOQWRqdXN0Q3Vyc29yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIGlvQ3Vyc29yUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmlvQ3Vyc29yUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOQWRqdXN0Q3Vyc29yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIGlvQ3Vyc29yUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkNsaWNrKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRSZWNvcmQgaUV2ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudFJlY29yZCBpRXZlbnQ7CiAjaWZuZGVmIFRYTkNsaWNrCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQ2xpY2spOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkNsaWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpRXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5DbGljayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICZpRXZlbnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmaUV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOQ2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAmaUV2ZW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNlbGVjdEFsbChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhOU2VsZWN0QWxsCi0JUHlNYWNfUFJFQ0hFQ0soVFhOU2VsZWN0QWxsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5TZWxlY3RBbGwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTlNlbGVjdEFsbChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlNlbGVjdEFsbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkZvY3VzKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBpQmVjb21pbmdGb2N1c2VkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGlCZWNvbWluZ0ZvY3VzZWQ7CiAjaWZuZGVmIFRYTkZvY3VzCi0JUHlNYWNfUFJFQ0hFQ0soVFhORm9jdXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkZvY3VzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUJlY29taW5nRm9jdXNlZCkpCi0JCXJldHVybiBOVUxMOwotCVRYTkZvY3VzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgaUJlY29taW5nRm9jdXNlZCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUJlY29taW5nRm9jdXNlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkZvY3VzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgaUJlY29taW5nRm9jdXNlZCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5VcGRhdGUoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRYTlVwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKFRYTlVwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOVXBkYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5VcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5VcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5EcmF3KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR1dvcmxkUHRyIGlEcmF3UG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR1dvcmxkUHRyIGlEcmF3UG9ydDsKICNpZm5kZWYgVFhORHJhdwotCVB5TWFjX1BSRUNIRUNLKFRYTkRyYXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkRyYXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRHV29ybGRPYmpfQ29udmVydCwgJmlEcmF3UG9ydCkpCi0JCXJldHVybiBOVUxMOwotCVRYTkRyYXcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgIGlEcmF3UG9ydCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0R1dvcmxkT2JqX0NvbnZlcnQsICZpRHJhd1BvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5EcmF3KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgIGlEcmF3UG9ydCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5Gb3JjZVVwZGF0ZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhORm9yY2VVcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhUWE5Gb3JjZVVwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORm9yY2VVcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTkZvcmNlVXBkYXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhORm9yY2VVcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5HZXRTbGVlcFRpY2tzKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKICNpZm5kZWYgVFhOR2V0U2xlZXBUaWNrcwotCVB5TWFjX1BSRUNIRUNLKFRYTkdldFNsZWVwVGlja3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkdldFNsZWVwVGlja3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTkdldFNsZWVwVGlja3MoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTkdldFNsZWVwVGlja3MoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTklkbGUoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRYTklkbGUKLQlQeU1hY19QUkVDSEVDSyhUWE5JZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5JZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5JZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOSWRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdyb3dXaW5kb3coVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFJlY29yZCBpRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50UmVjb3JkIGlFdmVudDsKICNpZm5kZWYgVFhOR3Jvd1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFRYTkdyb3dXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkdyb3dXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmlFdmVudCkpCi0JCXJldHVybiBOVUxMOwotCVRYTkdyb3dXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICZpRXZlbnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmaUV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOR3Jvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgJmlFdmVudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5ab29tV2luZG93KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IGlQYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgaVBhcnQ7CiAjaWZuZGVmIFRYTlpvb21XaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhUWE5ab29tV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5ab29tV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVBhcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5ab29tV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBpUGFydCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVBhcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5ab29tV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBpUGFydCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5DYW5VbmRvKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JVFhOQWN0aW9uS2V5IG9UWE5BY3Rpb25LZXk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFRYTkFjdGlvbktleSBvVFhOQWN0aW9uS2V5OwogI2lmbmRlZiBUWE5DYW5VbmRvCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQ2FuVW5kbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ2FuVW5kbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVFhOQ2FuVW5kbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgJm9UWE5BY3Rpb25LZXkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9UWE5BY3Rpb25LZXkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUWE5DYW5VbmRvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAmb1RYTkFjdGlvbktleSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb1RYTkFjdGlvbktleSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlVuZG8oVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRYTlVuZG8KLQlQeU1hY19QUkVDSEVDSyhUWE5VbmRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5VbmRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5VbmRvKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOVW5kbyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkNhblJlZG8oVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgVFhOQWN0aW9uS2V5IG9UWE5BY3Rpb25LZXk7CiAjaWZuZGVmIFRYTkNhblJlZG8KLQlQeU1hY19QUkVDSEVDSyhUWE5DYW5SZWRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5DYW5SZWRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5DYW5SZWRvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmb1RYTkFjdGlvbktleSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb1RYTkFjdGlvbktleSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTkNhblJlZG8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZvVFhOQWN0aW9uS2V5KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvVFhOQWN0aW9uS2V5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOUmVkbyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhOUmVkbwotCVB5TWFjX1BSRUNIRUNLKFRYTlJlZG8pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlJlZG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTlJlZG8oX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5SZWRvKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ3V0KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgVFhOQ3V0Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOQ3V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5DdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5DdXQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5DdXQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkNvcHkoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5Db3B5Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOQ29weSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkNvcHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5Db3B5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5QYXN0ZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTlBhc3RlCi0JUHlNYWNfUFJFQ0hFQ0soVFhOUGFzdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlBhc3RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOUGFzdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5QYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ2xlYXIoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5DbGVhcgotCVB5TWFjX1BSRUNIRUNLKFRYTkNsZWFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5DbGVhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkNsZWFyKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQ2xlYXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldFNlbGVjdGlvbihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRYTk9mZnNldCBvU3RhcnRPZmZzZXQ7Ci0JVFhOT2Zmc2V0IG9FbmRPZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRYTk9mZnNldCBvU3RhcnRPZmZzZXQ7CisgICAgVFhOT2Zmc2V0IG9FbmRPZmZzZXQ7CiAjaWZuZGVmIFRYTkdldFNlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKFRYTkdldFNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0U2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5HZXRTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgJm9TdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgJm9FbmRPZmZzZXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgb1N0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIG9FbmRPZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5HZXRTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgJm9TdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgJm9FbmRPZmZzZXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb1N0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9FbmRPZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5TaG93U2VsZWN0aW9uKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBpU2hvd0VuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBpU2hvd0VuZDsKICNpZm5kZWYgVFhOU2hvd1NlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKFRYTlNob3dTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlNob3dTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU2hvd0VuZCkpCi0JCXJldHVybiBOVUxMOwotCVRYTlNob3dTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGlTaG93RW5kKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpU2hvd0VuZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlNob3dTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGlTaG93RW5kKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTklzU2VsZWN0aW9uRW1wdHkoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFRYTklzU2VsZWN0aW9uRW1wdHkKLQlQeU1hY19QUkVDSEVDSyhUWE5Jc1NlbGVjdGlvbkVtcHR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Jc1NlbGVjdGlvbkVtcHR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5Jc1NlbGVjdGlvbkVtcHR5KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUWE5Jc1NlbGVjdGlvbkVtcHR5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5TZXRTZWxlY3Rpb24oVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRYTk9mZnNldCBpU3RhcnRPZmZzZXQ7Ci0JVFhOT2Zmc2V0IGlFbmRPZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgaUVuZE9mZnNldDsKICNpZm5kZWYgVFhOU2V0U2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhOU2V0U2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5TZXRTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaUVuZE9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5TZXRTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlFbmRPZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOU2V0U2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpRW5kT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ291bnRSdW5zSW5SYW5nZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKLQlUWE5PZmZzZXQgaUVuZE9mZnNldDsKLQlJdGVtQ291bnQgb1J1bkNvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTk9mZnNldCBpU3RhcnRPZmZzZXQ7CisgICAgVFhOT2Zmc2V0IGlFbmRPZmZzZXQ7CisgICAgSXRlbUNvdW50IG9SdW5Db3VudDsKICNpZm5kZWYgVFhOQ291bnRSdW5zSW5SYW5nZQotCVB5TWFjX1BSRUNIRUNLKFRYTkNvdW50UnVuc0luUmFuZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkNvdW50UnVuc0luUmFuZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaUVuZE9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Db3VudFJ1bnNJblJhbmdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9SdW5Db3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb1J1bkNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkNvdW50UnVuc0luUmFuZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb1J1bkNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvUnVuQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5EYXRhU2l6ZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJ5dGVDb3VudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJ5dGVDb3VudCBfcnY7CiAjaWZuZGVmIFRYTkRhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soVFhORGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkRhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5EYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhORGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldERhdGEoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRYTk9mZnNldCBpU3RhcnRPZmZzZXQ7Ci0JVFhOT2Zmc2V0IGlFbmRPZmZzZXQ7Ci0JSGFuZGxlIG9EYXRhSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTk9mZnNldCBpU3RhcnRPZmZzZXQ7CisgICAgVFhOT2Zmc2V0IGlFbmRPZmZzZXQ7CisgICAgSGFuZGxlIG9EYXRhSGFuZGxlOwogI2lmbmRlZiBUWE5HZXREYXRhCi0JUHlNYWNfUFJFQ0hFQ0soVFhOR2V0RGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkdldERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAmb0RhdGFIYW5kbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvRGF0YUhhbmRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVuZE9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5HZXREYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgJm9EYXRhSGFuZGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb0RhdGFIYW5kbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5HZXREYXRhRW5jb2RlZChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKLQlUWE5PZmZzZXQgaUVuZE9mZnNldDsKLQlIYW5kbGUgb0RhdGFIYW5kbGU7Ci0JVFhORGF0YVR5cGUgaUVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTk9mZnNldCBpU3RhcnRPZmZzZXQ7CisgICAgVFhOT2Zmc2V0IGlFbmRPZmZzZXQ7CisgICAgSGFuZGxlIG9EYXRhSGFuZGxlOworICAgIFRYTkRhdGFUeXBlIGlFbmNvZGluZzsKICNpZm5kZWYgVFhOR2V0RGF0YUVuY29kZWQKLQlQeU1hY19QUkVDSEVDSyhUWE5HZXREYXRhRW5jb2RlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0RGF0YUVuY29kZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpRW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOR2V0RGF0YUVuY29kZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpRW5kT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb0RhdGFIYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmNvZGluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG9EYXRhSGFuZGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlFbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlFbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5HZXREYXRhRW5jb2RlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvRGF0YUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUVuY29kaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb0RhdGFIYW5kbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5TZXREYXRhRnJvbUZpbGUoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNJbnQxNiBpRmlsZVJlZk51bTsKLQlPU1R5cGUgaUZpbGVUeXBlOwotCUJ5dGVDb3VudCBpRmlsZUxlbmd0aDsKLQlUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0OwotCVRYTk9mZnNldCBpRW5kT2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNJbnQxNiBpRmlsZVJlZk51bTsKKyAgICBPU1R5cGUgaUZpbGVUeXBlOworICAgIEJ5dGVDb3VudCBpRmlsZUxlbmd0aDsKKyAgICBUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0OworICAgIFRYTk9mZnNldCBpRW5kT2Zmc2V0OwogI2lmbmRlZiBUWE5TZXREYXRhRnJvbUZpbGUKLQlQeU1hY19QUkVDSEVDSyhUWE5TZXREYXRhRnJvbUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlNldERhdGFGcm9tRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUZpbGVSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlGaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlGaWxlTGVuZ3RoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaUVuZE9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5TZXREYXRhRnJvbUZpbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGlGaWxlUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpRW5kT2Zmc2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUZpbGVSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlGaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlGaWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVuZE9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5TZXREYXRhRnJvbUZpbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlGaWxlUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRW5kT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR2V0Q2hhbmdlQ291bnQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJdGVtQ291bnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJdGVtQ291bnQgX3J2OwogI2lmbmRlZiBUWE5HZXRDaGFuZ2VDb3VudAotCVB5TWFjX1BSRUNIRUNLKFRYTkdldENoYW5nZUNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRDaGFuZ2VDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVFhOR2V0Q2hhbmdlQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTkdldENoYW5nZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5TYXZlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUWE5GaWxlVHlwZSBpVHlwZTsKLQlPU1R5cGUgaVJlc1R5cGU7Ci0JVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2Rpbmc7Ci0JRlNTcGVjIGlGaWxlU3BlY2lmaWNhdGlvbjsKLQlTSW50MTYgaURhdGFSZWZlcmVuY2U7Ci0JU0ludDE2IGlSZXNvdXJjZVJlZmVyZW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5GaWxlVHlwZSBpVHlwZTsKKyAgICBPU1R5cGUgaVJlc1R5cGU7CisgICAgVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2Rpbmc7CisgICAgRlNTcGVjIGlGaWxlU3BlY2lmaWNhdGlvbjsKKyAgICBTSW50MTYgaURhdGFSZWZlcmVuY2U7CisgICAgU0ludDE2IGlSZXNvdXJjZVJlZmVyZW5jZTsKICNpZm5kZWYgVFhOU2F2ZQotCVB5TWFjX1BSRUNIRUNLKFRYTlNhdmUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlNhdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlSZXNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVBlcm1hbmVudEVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZpRmlsZVNwZWNpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpRGF0YVJlZmVyZW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlSZXNvdXJjZVJlZmVyZW5jZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5TYXZlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgaVR5cGUsCi0JICAgICAgICAgICAgICAgaVJlc1R5cGUsCi0JICAgICAgICAgICAgICAgaVBlcm1hbmVudEVuY29kaW5nLAotCSAgICAgICAgICAgICAgICZpRmlsZVNwZWNpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgaURhdGFSZWZlcmVuY2UsCi0JICAgICAgICAgICAgICAgaVJlc291cmNlUmVmZXJlbmNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbE8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaVJlc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpUGVybWFuZW50RW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmlGaWxlU3BlY2lmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlEYXRhUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVJlc291cmNlUmVmZXJlbmNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlNhdmUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBpVHlwZSwKKyAgICAgICAgICAgICAgICAgICBpUmVzVHlwZSwKKyAgICAgICAgICAgICAgICAgICBpUGVybWFuZW50RW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgJmlGaWxlU3BlY2lmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICBpRGF0YVJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICBpUmVzb3VyY2VSZWZlcmVuY2UpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5SZXZlcnQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5SZXZlcnQKLQlQeU1hY19QUkVDSEVDSyhUWE5SZXZlcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlJldmVydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlJldmVydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlJldmVydChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOUGFnZVNldHVwKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgVFhOUGFnZVNldHVwCi0JUHlNYWNfUFJFQ0hFQ0soVFhOUGFnZVNldHVwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5QYWdlU2V0dXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5QYWdlU2V0dXAoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5QYWdlU2V0dXAoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlByaW50KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgVFhOUHJpbnQKLQlQeU1hY19QUkVDSEVDSyhUWE5QcmludCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUHJpbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5QcmludChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlByaW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5HZXRWaWV3UmVjdChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3Qgb1ZpZXdSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IG9WaWV3UmVjdDsKICNpZm5kZWYgVFhOR2V0Vmlld1JlY3QKLQlQeU1hY19QUkVDSEVDSyhUWE5HZXRWaWV3UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0Vmlld1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTkdldFZpZXdSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgJm9WaWV3UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvVmlld1JlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5HZXRWaWV3UmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICZvVmlld1JlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb1ZpZXdSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOU2V0Vmlld1JlY3QoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGlWaWV3UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBpVmlld1JlY3Q7CiAjaWZuZGVmIFRYTlNldFZpZXdSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOU2V0Vmlld1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlNldFZpZXdSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmlWaWV3UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCVRYTlNldFZpZXdSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgJmlWaWV3UmVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmlWaWV3UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlNldFZpZXdSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgJmlWaWV3UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5BdHRhY2hPYmplY3RUb1dpbmRvdyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JR1dvcmxkUHRyIGlXaW5kb3c7Ci0JQm9vbGVhbiBpSXNBY3R1YWxXaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgR1dvcmxkUHRyIGlXaW5kb3c7CisgICAgQm9vbGVhbiBpSXNBY3R1YWxXaW5kb3c7CiAjaWZuZGVmIFRYTkF0dGFjaE9iamVjdFRvV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOQXR0YWNoT2JqZWN0VG9XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkF0dGFjaE9iamVjdFRvV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlJc0FjdHVhbFdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5BdHRhY2hPYmplY3RUb1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpSXNBY3R1YWxXaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmaVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlJc0FjdHVhbFdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5BdHRhY2hPYmplY3RUb1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpSXNBY3R1YWxXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3coVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFRYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFRYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhORHJhZ1RyYWNrZXIoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRYTkZyYW1lSUQgaVRYTkZyYW1lSUQ7Ci0JRHJhZ1RyYWNraW5nTWVzc2FnZSBpTWVzc2FnZTsKLQlXaW5kb3dQdHIgaVdpbmRvdzsKLQlEcmFnUmVmZXJlbmNlIGlEcmFnUmVmZXJlbmNlOwotCUJvb2xlYW4gaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVFhORnJhbWVJRCBpVFhORnJhbWVJRDsKKyAgICBEcmFnVHJhY2tpbmdNZXNzYWdlIGlNZXNzYWdlOworICAgIFdpbmRvd1B0ciBpV2luZG93OworICAgIERyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2U7CisgICAgQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdzsKICNpZm5kZWYgVFhORHJhZ1RyYWNrZXIKLQlQeU1hY19QUkVDSEVDSyhUWE5EcmFnVHJhY2tlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORHJhZ1RyYWNrZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGhPJk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpVFhORnJhbWVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlNZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmlEcmFnUmVmZXJlbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhORHJhZ1RyYWNrZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIGlNZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBpRHJhZ1JlZmVyZW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICAgaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxoTyZPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX0NvbnZlcnQsICZpRHJhZ1JlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkRyYWdUcmFja2VyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlUWE5GcmFtZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICBpTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaURyYWdSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhORHJhZ1JlY2VpdmVyKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOwotCVdpbmRvd1B0ciBpV2luZG93OwotCURyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2U7Ci0JQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIFdpbmRvd1B0ciBpV2luZG93OworICAgIERyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2U7CisgICAgQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdzsKICNpZm5kZWYgVFhORHJhZ1JlY2VpdmVyCi0JUHlNYWNfUFJFQ0hFQ0soVFhORHJhZ1JlY2VpdmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5EcmFnUmVjZWl2ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlUWE5GcmFtZUlELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmlEcmFnUmVmZXJlbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhORHJhZ1JlY2VpdmVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpVFhORnJhbWVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICBpRHJhZ1JlZmVyZW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaURyYWdSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5EcmFnUmVjZWl2ZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlUWE5GcmFtZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEcmFnUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5BY3RpdmF0ZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhORnJhbWVJRCBpVFhORnJhbWVJRDsKLQlUWE5TY3JvbGxCYXJTdGF0ZSBpQWN0aXZlU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhORnJhbWVJRCBpVFhORnJhbWVJRDsKKyAgICBUWE5TY3JvbGxCYXJTdGF0ZSBpQWN0aXZlU3RhdGU7CiAjaWZuZGVmIFRYTkFjdGl2YXRlCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQWN0aXZhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkFjdGl2YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlUWE5GcmFtZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmaUFjdGl2ZVN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkFjdGl2YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGlUWE5GcmFtZUlELAotCSAgICAgICAgICAgICAgICAgICBpQWN0aXZlU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlUWE5GcmFtZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUFjdGl2ZVN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkFjdGl2YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGlUWE5GcmFtZUlELAorICAgICAgICAgICAgICAgICAgICAgICBpQWN0aXZlU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5FY2hvTW9kZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVW5pQ2hhciBpRWNob0NoYXJhY3RlcjsKLQlUZXh0RW5jb2RpbmcgaUVuY29kaW5nOwotCUJvb2xlYW4gaU9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVuaUNoYXIgaUVjaG9DaGFyYWN0ZXI7CisgICAgVGV4dEVuY29kaW5nIGlFbmNvZGluZzsKKyAgICBCb29sZWFuIGlPbjsKICNpZm5kZWYgVFhORWNob01vZGUKLQlQeU1hY19QUkVDSEVDSyhUWE5FY2hvTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORWNob01vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlFY2hvQ2hhcmFjdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmaU9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkVjaG9Nb2RlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGlFY2hvQ2hhcmFjdGVyLAotCSAgICAgICAgICAgICAgICAgICBpRW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgIGlPbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlFY2hvQ2hhcmFjdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaU9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkVjaG9Nb2RlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGlFY2hvQ2hhcmFjdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBpRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIGlPbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkRvRm9udE1lbnVTZWxlY3Rpb24oVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdDsKLQlTSW50MTYgaU1lbnVJRDsKLQlTSW50MTYgaU1lbnVJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdDsKKyAgICBTSW50MTYgaU1lbnVJRDsKKyAgICBTSW50MTYgaU1lbnVJdGVtOwogI2lmbmRlZiBUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhORG9Gb250TWVudVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORG9Gb250TWVudVNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVFhORm9udE1lbnVPYmpfQ29udmVydCwgJmlUWE5Gb250TWVudU9iamVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlNZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpTWVudUl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhORG9Gb250TWVudVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlUWE5Gb250TWVudU9iamVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW51SXRlbSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRYTkZvbnRNZW51T2JqX0NvbnZlcnQsICZpVFhORm9udE1lbnVPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaU1lbnVJdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkRvRm9udE1lbnVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVFhORm9udE1lbnVPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTWVudUl0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5QcmVwYXJlRm9udE1lbnUoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5Gb250TWVudU9iamVjdCBpVFhORm9udE1lbnVPYmplY3Q7CiAjaWZuZGVmIFRYTlByZXBhcmVGb250TWVudQotCVB5TWFjX1BSRUNIRUNLKFRYTlByZXBhcmVGb250TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUHJlcGFyZUZvbnRNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVFhORm9udE1lbnVPYmpfQ29udmVydCwgJmlUWE5Gb250TWVudU9iamVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5QcmVwYXJlRm9udE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGlUWE5Gb250TWVudU9iamVjdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUWE5Gb250TWVudU9ial9Db252ZXJ0LCAmaVRYTkZvbnRNZW51T2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlByZXBhcmVGb250TWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZvbnRNZW51T2JqZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOUG9pbnRUb09mZnNldChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgaVBvaW50OwotCVRYTk9mZnNldCBvT2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFBvaW50IGlQb2ludDsKKyAgICBUWE5PZmZzZXQgb09mZnNldDsKICNpZm5kZWYgVFhOUG9pbnRUb09mZnNldAotCVB5TWFjX1BSRUNIRUNLKFRYTlBvaW50VG9PZmZzZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlBvaW50VG9PZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmlQb2ludCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Qb2ludFRvT2Zmc2V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaVBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvT2Zmc2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvT2Zmc2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaVBvaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlBvaW50VG9PZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9PZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9PZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5PZmZzZXRUb1BvaW50KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUWE5PZmZzZXQgaU9mZnNldDsKLQlQb2ludCBvUG9pbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhOT2Zmc2V0IGlPZmZzZXQ7CisgICAgUG9pbnQgb1BvaW50OwogI2lmbmRlZiBUWE5PZmZzZXRUb1BvaW50Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOT2Zmc2V0VG9Qb2ludCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOT2Zmc2V0VG9Qb2ludCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlPZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOT2Zmc2V0VG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGlPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm9Qb2ludCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIG9Qb2ludCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTk9mZnNldFRvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvUG9pbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBvUG9pbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5HZXRMaW5lQ291bnQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUl0ZW1Db3VudCBvTGluZVRvdGFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEl0ZW1Db3VudCBvTGluZVRvdGFsOwogI2lmbmRlZiBUWE5HZXRMaW5lQ291bnQKLQlQeU1hY19QUkVDSEVDSyhUWE5HZXRMaW5lQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkdldExpbmVDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkdldExpbmVDb3VudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJm9MaW5lVG90YWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG9MaW5lVG90YWwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOR2V0TGluZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb0xpbmVUb3RhbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb0xpbmVUb3RhbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldExpbmVNZXRyaWNzKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaUxpbmVOdW1iZXI7Ci0JRml4ZWQgb0xpbmVXaWR0aDsKLQlGaXhlZCBvTGluZUhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaUxpbmVOdW1iZXI7CisgICAgRml4ZWQgb0xpbmVXaWR0aDsKKyAgICBGaXhlZCBvTGluZUhlaWdodDsKICNpZm5kZWYgVFhOR2V0TGluZU1ldHJpY3MKLQlQeU1hY19QUkVDSEVDSyhUWE5HZXRMaW5lTWV0cmljcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0TGluZU1ldHJpY3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpTGluZU51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5HZXRMaW5lTWV0cmljcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpTGluZU51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm9MaW5lV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvTGluZUhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgb0xpbmVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBvTGluZUhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpTGluZU51bWJlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5HZXRMaW5lTWV0cmljcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9MaW5lV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvTGluZUhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgb0xpbmVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBvTGluZUhlaWdodCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaVdpbmRvdzsKLQlCb29sZWFuIG9BdHRhY2hlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaVdpbmRvdzsKKyAgICBCb29sZWFuIG9BdHRhY2hlZDsKICNpZm5kZWYgVFhOSXNPYmplY3RBdHRhY2hlZFRvU3BlY2lmaWNXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOSXNPYmplY3RBdHRhY2hlZFRvU3BlY2lmaWNXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmlXaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOSXNPYmplY3RBdHRhY2hlZFRvU3BlY2lmaWNXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9BdHRhY2hlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb0F0dGFjaGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb0F0dGFjaGVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvQXR0YWNoZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5SZWNhbGNUZXh0TGF5b3V0KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBUWE5SZWNhbGNUZXh0TGF5b3V0Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOUmVjYWxjVGV4dExheW91dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUmVjYWxjVGV4dExheW91dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOUmVjYWxjVGV4dExheW91dChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlJlY2FsY1RleHRMYXlvdXQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVFhOT2JqX21ldGhvZHNbXSA9IHsKLQl7IlRYTkRlbGV0ZU9iamVjdCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORGVsZXRlT2JqZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5SZXNpemVGcmFtZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUmVzaXplRnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpV2lkdGgsIFVJbnQzMiBpSGVpZ2h0LCBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEKSAtPiBOb25lIil9LAotCXsiVFhOU2V0RnJhbWVCb3VuZHMiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNldEZyYW1lQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgaVRvcCwgU0ludDMyIGlMZWZ0LCBTSW50MzIgaUJvdHRvbSwgU0ludDMyIGlSaWdodCwgVFhORnJhbWVJRCBpVFhORnJhbWVJRCkgLT4gTm9uZSIpfSwKLQl7IlRYTktleURvd24iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTktleURvd24sIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGlFdmVudCkgLT4gTm9uZSIpfSwKLQl7IlRYTkFkanVzdEN1cnNvciIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQWRqdXN0Q3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgaW9DdXJzb3JSZ24pIC0+IE5vbmUiKX0sCi0JeyJUWE5DbGljayIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2xpY2ssIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGlFdmVudCkgLT4gTm9uZSIpfSwKLQl7IlRYTlNlbGVjdEFsbCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2VsZWN0QWxsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5Gb2N1cyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORm9jdXMsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaUJlY29taW5nRm9jdXNlZCkgLT4gTm9uZSIpfSwKLQl7IlRYTlVwZGF0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOVXBkYXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5EcmF3IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EcmF3LCAxLAotCSBQeURvY19TVFIoIihHV29ybGRQdHIgaURyYXdQb3J0KSAtPiBOb25lIil9LAotCXsiVFhORm9yY2VVcGRhdGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkZvcmNlVXBkYXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5HZXRTbGVlcFRpY2tzIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRTbGVlcFRpY2tzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKLQl7IlRYTklkbGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTklkbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdyb3dXaW5kb3ciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdyb3dXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGlFdmVudCkgLT4gTm9uZSIpfSwKLQl7IlRYTlpvb21XaW5kb3ciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlpvb21XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpUGFydCkgLT4gTm9uZSIpfSwKLQl7IlRYTkNhblVuZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkNhblVuZG8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2LCBUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleSkiKX0sCi0JeyJUWE5VbmRvIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5VbmRvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5DYW5SZWRvIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DYW5SZWRvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgVFhOQWN0aW9uS2V5IG9UWE5BY3Rpb25LZXkpIil9LAotCXsiVFhOUmVkbyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUmVkbywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOQ3V0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DdXQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkNvcHkiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkNvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTlBhc3RlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5QYXN0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOQ2xlYXIiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkNsZWFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5HZXRTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldFNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVFhOT2Zmc2V0IG9TdGFydE9mZnNldCwgVFhOT2Zmc2V0IG9FbmRPZmZzZXQpIil9LAotCXsiVFhOU2hvd1NlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2hvd1NlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpU2hvd0VuZCkgLT4gTm9uZSIpfSwKLQl7IlRYTklzU2VsZWN0aW9uRW1wdHkiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTklzU2VsZWN0aW9uRW1wdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlRYTlNldFNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2V0U2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gTm9uZSIpfSwKLQl7IlRYTkNvdW50UnVuc0luUmFuZ2UiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkNvdW50UnVuc0luUmFuZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0KSAtPiAoSXRlbUNvdW50IG9SdW5Db3VudCkiKX0sCi0JeyJUWE5EYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORGF0YVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJ5dGVDb3VudCBfcnYpIil9LAotCXsiVFhOR2V0RGF0YSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQpIC0+IChIYW5kbGUgb0RhdGFIYW5kbGUpIil9LAotCXsiVFhOR2V0RGF0YUVuY29kZWQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldERhdGFFbmNvZGVkLCAxLAotCSBQeURvY19TVFIoIihUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCwgVFhORGF0YVR5cGUgaUVuY29kaW5nKSAtPiAoSGFuZGxlIG9EYXRhSGFuZGxlKSIpfSwKLQl7IlRYTlNldERhdGFGcm9tRmlsZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2V0RGF0YUZyb21GaWxlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaUZpbGVSZWZOdW0sIE9TVHlwZSBpRmlsZVR5cGUsIEJ5dGVDb3VudCBpRmlsZUxlbmd0aCwgVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQpIC0+IE5vbmUiKX0sCi0JeyJUWE5HZXRDaGFuZ2VDb3VudCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0Q2hhbmdlQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEl0ZW1Db3VudCBfcnYpIil9LAotCXsiVFhOU2F2ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2F2ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVFhORmlsZVR5cGUgaVR5cGUsIE9TVHlwZSBpUmVzVHlwZSwgVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2RpbmcsIEZTU3BlYyBpRmlsZVNwZWNpZmljYXRpb24sIFNJbnQxNiBpRGF0YVJlZmVyZW5jZSwgU0ludDE2IGlSZXNvdXJjZVJlZmVyZW5jZSkgLT4gTm9uZSIpfSwKLQl7IlRYTlJldmVydCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUmV2ZXJ0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5QYWdlU2V0dXAiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlBhZ2VTZXR1cCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOUHJpbnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlByaW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5HZXRWaWV3UmVjdCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0Vmlld1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3Qgb1ZpZXdSZWN0KSIpfSwKLQl7IlRYTlNldFZpZXdSZWN0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXRWaWV3UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpVmlld1JlY3QpIC0+IE5vbmUiKX0sCi0JeyJUWE5BdHRhY2hPYmplY3RUb1dpbmRvdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQXR0YWNoT2JqZWN0VG9XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKEdXb3JsZFB0ciBpV2luZG93LCBCb29sZWFuIGlJc0FjdHVhbFdpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlRYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJUWE5EcmFnVHJhY2tlciIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORHJhZ1RyYWNrZXIsIDEsCi0JIFB5RG9jX1NUUigiKFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQsIERyYWdUcmFja2luZ01lc3NhZ2UgaU1lc3NhZ2UsIFdpbmRvd1B0ciBpV2luZG93LCBEcmFnUmVmZXJlbmNlIGlEcmFnUmVmZXJlbmNlLCBCb29sZWFuIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93KSAtPiBOb25lIil9LAotCXsiVFhORHJhZ1JlY2VpdmVyIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EcmFnUmVjZWl2ZXIsIDEsCi0JIFB5RG9jX1NUUigiKFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQsIFdpbmRvd1B0ciBpV2luZG93LCBEcmFnUmVmZXJlbmNlIGlEcmFnUmVmZXJlbmNlLCBCb29sZWFuIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93KSAtPiBOb25lIil9LAotCXsiVFhOQWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkFjdGl2YXRlLCAxLAotCSBQeURvY19TVFIoIihUWE5GcmFtZUlEIGlUWE5GcmFtZUlELCBUWE5TY3JvbGxCYXJTdGF0ZSBpQWN0aXZlU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJUWE5FY2hvTW9kZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORWNob01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKFVuaUNoYXIgaUVjaG9DaGFyYWN0ZXIsIFRleHRFbmNvZGluZyBpRW5jb2RpbmcsIEJvb2xlYW4gaU9uKSAtPiBOb25lIil9LAotCXsiVFhORG9Gb250TWVudVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORG9Gb250TWVudVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0LCBTSW50MTYgaU1lbnVJRCwgU0ludDE2IGlNZW51SXRlbSkgLT4gTm9uZSIpfSwKLQl7IlRYTlByZXBhcmVGb250TWVudSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUHJlcGFyZUZvbnRNZW51LCAxLAotCSBQeURvY19TVFIoIihUWE5Gb250TWVudU9iamVjdCBpVFhORm9udE1lbnVPYmplY3QpIC0+IE5vbmUiKX0sCi0JeyJUWE5Qb2ludFRvT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Qb2ludFRvT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpUG9pbnQpIC0+IChUWE5PZmZzZXQgb09mZnNldCkiKX0sCi0JeyJUWE5PZmZzZXRUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5PZmZzZXRUb1BvaW50LCAxLAotCSBQeURvY19TVFIoIihUWE5PZmZzZXQgaU9mZnNldCkgLT4gKFBvaW50IG9Qb2ludCkiKX0sCi0JeyJUWE5HZXRMaW5lQ291bnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldExpbmVDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IG9MaW5lVG90YWwpIil9LAotCXsiVFhOR2V0TGluZU1ldHJpY3MiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldExpbmVNZXRyaWNzLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaUxpbmVOdW1iZXIpIC0+IChGaXhlZCBvTGluZVdpZHRoLCBGaXhlZCBvTGluZUhlaWdodCkiKX0sCi0JeyJUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOSXNPYmplY3RBdHRhY2hlZFRvU3BlY2lmaWNXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpV2luZG93KSAtPiAoQm9vbGVhbiBvQXR0YWNoZWQpIil9LAotCXsiVFhOUmVjYWxjVGV4dExheW91dCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUmVjYWxjVGV4dExheW91dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiVFhORGVsZXRlT2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EZWxldGVPYmplY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTlJlc2l6ZUZyYW1lIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZXNpemVGcmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGlXaWR0aCwgVUludDMyIGlIZWlnaHQsIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5TZXRGcmFtZUJvdW5kcyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2V0RnJhbWVCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiBpVG9wLCBTSW50MzIgaUxlZnQsIFNJbnQzMiBpQm90dG9tLCBTSW50MzIgaVJpZ2h0LCBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEKSAtPiBOb25lIil9LAorICAgIHsiVFhOS2V5RG93biIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOS2V5RG93biwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAorICAgIHsiVFhOQWRqdXN0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5BZGp1c3RDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpb0N1cnNvclJnbikgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkNsaWNrIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DbGljaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAorICAgIHsiVFhOU2VsZWN0QWxsIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZWxlY3RBbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkZvY3VzIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Gb2N1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBpQmVjb21pbmdGb2N1c2VkKSAtPiBOb25lIil9LAorICAgIHsiVFhOVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5VcGRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkRyYXciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRyYXcsIDEsCisgICAgIFB5RG9jX1NUUigiKEdXb3JsZFB0ciBpRHJhd1BvcnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Gb3JjZVVwZGF0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORm9yY2VVcGRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkdldFNsZWVwVGlja3MiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldFNsZWVwVGlja3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAorICAgIHsiVFhOSWRsZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOSWRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOR3Jvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR3Jvd1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAorICAgIHsiVFhOWm9vbVdpbmRvdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOWm9vbVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGlQYXJ0KSAtPiBOb25lIil9LAorICAgIHsiVFhOQ2FuVW5kbyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2FuVW5kbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIFRYTkFjdGlvbktleSBvVFhOQWN0aW9uS2V5KSIpfSwKKyAgICB7IlRYTlVuZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlVuZG8sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkNhblJlZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkNhblJlZG8sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2LCBUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleSkiKX0sCisgICAgeyJUWE5SZWRvIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZWRvLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5DdXQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkN1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOQ29weSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOUGFzdGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlBhc3RlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5DbGVhciIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2xlYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkdldFNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0U2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUWE5PZmZzZXQgb1N0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgb0VuZE9mZnNldCkiKX0sCisgICAgeyJUWE5TaG93U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TaG93U2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGlTaG93RW5kKSAtPiBOb25lIil9LAorICAgIHsiVFhOSXNTZWxlY3Rpb25FbXB0eSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOSXNTZWxlY3Rpb25FbXB0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiVFhOU2V0U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXRTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0KSAtPiBOb25lIil9LAorICAgIHsiVFhOQ291bnRSdW5zSW5SYW5nZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ291bnRSdW5zSW5SYW5nZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQpIC0+IChJdGVtQ291bnQgb1J1bkNvdW50KSIpfSwKKyAgICB7IlRYTkRhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EYXRhU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQnl0ZUNvdW50IF9ydikiKX0sCisgICAgeyJUWE5HZXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXREYXRhLCAxLAorICAgICBQeURvY19TVFIoIihUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gKEhhbmRsZSBvRGF0YUhhbmRsZSkiKX0sCisgICAgeyJUWE5HZXREYXRhRW5jb2RlZCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0RGF0YUVuY29kZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0LCBUWE5EYXRhVHlwZSBpRW5jb2RpbmcpIC0+IChIYW5kbGUgb0RhdGFIYW5kbGUpIil9LAorICAgIHsiVFhOU2V0RGF0YUZyb21GaWxlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXREYXRhRnJvbUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpRmlsZVJlZk51bSwgT1NUeXBlIGlGaWxlVHlwZSwgQnl0ZUNvdW50IGlGaWxlTGVuZ3RoLCBUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkdldENoYW5nZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRDaGFuZ2VDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCisgICAgeyJUWE5TYXZlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TYXZlLCAxLAorICAgICBQeURvY19TVFIoIihUWE5GaWxlVHlwZSBpVHlwZSwgT1NUeXBlIGlSZXNUeXBlLCBUWE5QZXJtYW5lbnRUZXh0RW5jb2RpbmdUeXBlIGlQZXJtYW5lbnRFbmNvZGluZywgRlNTcGVjIGlGaWxlU3BlY2lmaWNhdGlvbiwgU0ludDE2IGlEYXRhUmVmZXJlbmNlLCBTSW50MTYgaVJlc291cmNlUmVmZXJlbmNlKSAtPiBOb25lIil9LAorICAgIHsiVFhOUmV2ZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZXZlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTlBhZ2VTZXR1cCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUGFnZVNldHVwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5QcmludCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUHJpbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkdldFZpZXdSZWN0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRWaWV3UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvVmlld1JlY3QpIil9LAorICAgIHsiVFhOU2V0Vmlld1JlY3QiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNldFZpZXdSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGlWaWV3UmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkF0dGFjaE9iamVjdFRvV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5BdHRhY2hPYmplY3RUb1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR1dvcmxkUHRyIGlXaW5kb3csIEJvb2xlYW4gaUlzQWN0dWFsV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlRYTkRyYWdUcmFja2VyIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EcmFnVHJhY2tlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhORnJhbWVJRCBpVFhORnJhbWVJRCwgRHJhZ1RyYWNraW5nTWVzc2FnZSBpTWVzc2FnZSwgV2luZG93UHRyIGlXaW5kb3csIERyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2UsIEJvb2xlYW4gaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5EcmFnUmVjZWl2ZXIiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRyYWdSZWNlaXZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhORnJhbWVJRCBpVFhORnJhbWVJRCwgV2luZG93UHRyIGlXaW5kb3csIERyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2UsIEJvb2xlYW4gaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5BY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQWN0aXZhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQsIFRYTlNjcm9sbEJhclN0YXRlIGlBY3RpdmVTdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkVjaG9Nb2RlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5FY2hvTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVW5pQ2hhciBpRWNob0NoYXJhY3RlciwgVGV4dEVuY29kaW5nIGlFbmNvZGluZywgQm9vbGVhbiBpT24pIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Eb0ZvbnRNZW51U2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihUWE5Gb250TWVudU9iamVjdCBpVFhORm9udE1lbnVPYmplY3QsIFNJbnQxNiBpTWVudUlELCBTSW50MTYgaU1lbnVJdGVtKSAtPiBOb25lIil9LAorICAgIHsiVFhOUHJlcGFyZUZvbnRNZW51IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5QcmVwYXJlRm9udE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTlBvaW50VG9PZmZzZXQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlBvaW50VG9PZmZzZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IGlQb2ludCkgLT4gKFRYTk9mZnNldCBvT2Zmc2V0KSIpfSwKKyAgICB7IlRYTk9mZnNldFRvUG9pbnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTk9mZnNldFRvUG9pbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpT2Zmc2V0KSAtPiAoUG9pbnQgb1BvaW50KSIpfSwKKyAgICB7IlRYTkdldExpbmVDb3VudCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0TGluZUNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgb0xpbmVUb3RhbCkiKX0sCisgICAgeyJUWE5HZXRMaW5lTWV0cmljcyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0TGluZU1ldHJpY3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpTGluZU51bWJlcikgLT4gKEZpeGVkIG9MaW5lV2lkdGgsIEZpeGVkIG9MaW5lSGVpZ2h0KSIpfSwKKyAgICB7IlRYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGlXaW5kb3cpIC0+IChCb29sZWFuIG9BdHRhY2hlZCkiKX0sCisgICAgeyJUWE5SZWNhbGNUZXh0TGF5b3V0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZWNhbGNUZXh0TGF5b3V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFRYTk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTEyNDIsNjEgKzEyNDIsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVRYTk9iamVjdCBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFRYTk9iamVjdCBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUWE5PYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChUWE5PYmplY3RPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVFhOT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoVFhOT2JqZWN0T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFRYTk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBUWE5PYmplY3RfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfTWx0ZS5UWE5PYmplY3QiLCAvKnRwX25hbWUqLwotCXNpemVvZihUWE5PYmplY3RPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBUWE5PYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgVFhOT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBUWE5PYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFRYTk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlUWE5PYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JVFhOT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVRYTk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JVFhOT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCVRYTk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVRYTk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX01sdGUuVFhOT2JqZWN0IiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoVFhOT2JqZWN0T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgVFhOT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFRYTk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgVFhOT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBUWE5PYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgVFhOT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIFRYTk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBUWE5PYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFRYTk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBUWE5PYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBUWE5PYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgVFhOT2JqZWN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMzA5LDc3ICsxMzA5LDc3IEBACiAjZGVmaW5lIFRYTkZvbnRNZW51T2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBUWE5Gb250TWVudU9iamVjdE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVRYTkZvbnRNZW51T2JqZWN0IG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgVFhORm9udE1lbnVPYmplY3Qgb2JfaXRzZWxmOwogfSBUWE5Gb250TWVudU9iamVjdE9iamVjdDsKIAogUHlPYmplY3QgKlRYTkZvbnRNZW51T2JqX05ldyhUWE5Gb250TWVudU9iamVjdCBpdHNlbGYpCiB7Ci0JVFhORm9udE1lbnVPYmplY3RPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhUWE5Gb250TWVudU9iamVjdE9iamVjdCwgJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBUWE5Gb250TWVudU9iamVjdE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0LCAmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVFhORm9udE1lbnVPYmpfQ29udmVydChQeU9iamVjdCAqdiwgVFhORm9udE1lbnVPYmplY3QgKnBfaXRzZWxmKQogewotCWlmICghVFhORm9udE1lbnVPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVFhORm9udE1lbnVPYmplY3QgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghVFhORm9udE1lbnVPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVFhORm9udE1lbnVPYmplY3QgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBUWE5Gb250TWVudU9ial9kZWFsbG9jKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5Gb250TWVudU9ial9UWE5HZXRGb250TWVudUhhbmRsZShUWE5Gb250TWVudU9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SGFuZGxlIG9Gb250TWVudUhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIG9Gb250TWVudUhhbmRsZTsKICNpZm5kZWYgVFhOR2V0Rm9udE1lbnVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhUWE5HZXRGb250TWVudUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0Rm9udE1lbnVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5HZXRGb250TWVudUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb0ZvbnRNZW51SGFuZGxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG9Gb250TWVudUhhbmRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5HZXRGb250TWVudUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb0ZvbnRNZW51SGFuZGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG9Gb250TWVudUhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhORm9udE1lbnVPYmpfVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0KFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5EaXNwb3NlRm9udE1lbnVPYmplY3QKLQlQeU1hY19QUkVDSEVDSyhUWE5EaXNwb3NlRm9udE1lbnVPYmplY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkRpc3Bvc2VGb250TWVudU9iamVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkRpc3Bvc2VGb250TWVudU9iamVjdChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkRpc3Bvc2VGb250TWVudU9iamVjdChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFRYTkZvbnRNZW51T2JqX21ldGhvZHNbXSA9IHsKLQl7IlRYTkdldEZvbnRNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRYTkZvbnRNZW51T2JqX1RYTkdldEZvbnRNZW51SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIG9Gb250TWVudUhhbmRsZSkiKX0sCi0JeyJUWE5EaXNwb3NlRm9udE1lbnVPYmplY3QiLCAoUHlDRnVuY3Rpb24pVFhORm9udE1lbnVPYmpfVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJUWE5HZXRGb250TWVudUhhbmRsZSIsIChQeUNGdW5jdGlvbilUWE5Gb250TWVudU9ial9UWE5HZXRGb250TWVudUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBvRm9udE1lbnVIYW5kbGUpIil9LAorICAgIHsiVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKVRYTkZvbnRNZW51T2JqX1RYTkRpc3Bvc2VGb250TWVudU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBUWE5Gb250TWVudU9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTEzOTYsNjEgKzEzOTYsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpUWE5Gb250TWVudU9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JVFhORm9udE1lbnVPYmplY3QgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBUWE5Gb250TWVudU9iamVjdCBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUWE5Gb250TWVudU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRYTkZvbnRNZW51T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgVFhORm9udE1lbnVPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgVFhORm9udE1lbnVPYmplY3RfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfTWx0ZS5UWE5Gb250TWVudU9iamVjdCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgVFhORm9udE1lbnVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgVFhORm9udE1lbnVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFRYTkZvbnRNZW51T2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBUWE5Gb250TWVudU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlUWE5Gb250TWVudU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlUWE5Gb250TWVudU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlUWE5Gb250TWVudU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JVFhORm9udE1lbnVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVFhORm9udE1lbnVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlUWE5Gb250TWVudU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX01sdGUuVFhORm9udE1lbnVPYmplY3QiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihUWE5Gb250TWVudU9iamVjdE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFRYTkZvbnRNZW51T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFRYTkZvbnRNZW51T2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBUWE5Gb250TWVudU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgVFhORm9udE1lbnVPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgVFhORm9udE1lbnVPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgVFhORm9udE1lbnVPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgVFhORm9udE1lbnVPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFRYTkZvbnRNZW51T2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFRYTkZvbnRNZW51T2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgVFhORm9udE1lbnVPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBUWE5Gb250TWVudU9iamVjdCAtLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNDU4LDE2OCArMTQ1OCwxNjggQEAKIAogc3RhdGljIFB5T2JqZWN0ICpNbHRlX1RYTk5ld09iamVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1NwZWMgKiBpRmlsZVNwZWM7Ci0JV2luZG93UHRyIGlXaW5kb3c7Ci0JUmVjdCBpRnJhbWU7Ci0JVFhORnJhbWVPcHRpb25zIGlGcmFtZU9wdGlvbnM7Ci0JVFhORnJhbWVUeXBlIGlGcmFtZVR5cGU7Ci0JVFhORmlsZVR5cGUgaUZpbGVUeXBlOwotCVRYTlBlcm1hbmVudFRleHRFbmNvZGluZ1R5cGUgaVBlcm1hbmVudEVuY29kaW5nOwotCVRYTk9iamVjdCBvVFhOT2JqZWN0OwotCVRYTkZyYW1lSUQgb1RYTkZyYW1lSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNTcGVjICogaUZpbGVTcGVjOworICAgIFdpbmRvd1B0ciBpV2luZG93OworICAgIFJlY3QgaUZyYW1lOworICAgIFRYTkZyYW1lT3B0aW9ucyBpRnJhbWVPcHRpb25zOworICAgIFRYTkZyYW1lVHlwZSBpRnJhbWVUeXBlOworICAgIFRYTkZpbGVUeXBlIGlGaWxlVHlwZTsKKyAgICBUWE5QZXJtYW5lbnRUZXh0RW5jb2RpbmdUeXBlIGlQZXJtYW5lbnRFbmNvZGluZzsKKyAgICBUWE5PYmplY3Qgb1RYTk9iamVjdDsKKyAgICBUWE5GcmFtZUlEIG9UWE5GcmFtZUlEOwogI2lmbmRlZiBUWE5OZXdPYmplY3QKLQlQeU1hY19QUkVDSEVDSyhUWE5OZXdPYmplY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTk5ld09iamVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsbE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdEZTU3BlY1B0cl9Db252ZXJ0LCAmaUZpbGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpRnJhbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRnJhbWVPcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUZyYW1lVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVBlcm1hbmVudEVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTk5ld09iamVjdChpRmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICBpV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgJmlGcmFtZSwKLQkgICAgICAgICAgICAgICAgICAgIGlGcmFtZU9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICBpRnJhbWVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgaUZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgaVBlcm1hbmVudEVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgJm9UWE5PYmplY3QsCi0JICAgICAgICAgICAgICAgICAgICAmb1RYTkZyYW1lSUQsCi0JICAgICAgICAgICAgICAgICAgICAoVFhOT2JqZWN0UmVmY29uKTApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgVFhOT2JqX05ldywgb1RYTk9iamVjdCwKLQkgICAgICAgICAgICAgICAgICAgICBvVFhORnJhbWVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRGU1NwZWNQdHJfQ29udmVydCwgJmlGaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaUZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUZyYW1lT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlGcmFtZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlGaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlQZXJtYW5lbnRFbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5OZXdPYmplY3QoaUZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgaVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICZpRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpRnJhbWVPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgaUZyYW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlGaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlQZXJtYW5lbnRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZvVFhOT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgJm9UWE5GcmFtZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgKFRYTk9iamVjdFJlZmNvbikwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRYTk9ial9OZXcsIG9UWE5PYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgb1RYTkZyYW1lSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOVGVybWluYXRlVGV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhOVGVybWluYXRlVGV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOVGVybWluYXRlVGV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOVGVybWluYXRlVGV4dGVuc2lvbigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOVGVybWluYXRlVGV4dGVuc2lvbigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNbHRlX1RYTklzU2NyYXBQYXN0YWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBUWE5Jc1NjcmFwUGFzdGFibGUKLQlQeU1hY19QUkVDSEVDSyhUWE5Jc1NjcmFwUGFzdGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTklzU2NyYXBQYXN0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVFhOSXNTY3JhcFBhc3RhYmxlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTklzU2NyYXBQYXN0YWJsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOQ29udmVydFRvUHVibGljU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkNvbnZlcnRUb1B1YmxpY1NjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQ29udmVydFRvUHVibGljU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkNvbnZlcnRUb1B1YmxpY1NjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQ29udmVydFRvUHVibGljU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkNvbnZlcnRUb1B1YmxpY1NjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWx0ZV9UWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkNvbnZlcnRGcm9tUHVibGljU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkNvbnZlcnRGcm9tUHVibGljU2NyYXAoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNbHRlX1RYTk5ld0ZvbnRNZW51T2JqZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgaUZvbnRNZW51SGFuZGxlOwotCVNJbnQxNiBpTWVudUlEOwotCVNJbnQxNiBpU3RhcnRIaWVyTWVudUlEOwotCVRYTkZvbnRNZW51T2JqZWN0IG9UWE5Gb250TWVudU9iamVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIGlGb250TWVudUhhbmRsZTsKKyAgICBTSW50MTYgaU1lbnVJRDsKKyAgICBTSW50MTYgaVN0YXJ0SGllck1lbnVJRDsKKyAgICBUWE5Gb250TWVudU9iamVjdCBvVFhORm9udE1lbnVPYmplY3Q7CiAjaWZuZGVmIFRYTk5ld0ZvbnRNZW51T2JqZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOTmV3Rm9udE1lbnVPYmplY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTk5ld0ZvbnRNZW51T2JqZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZpRm9udE1lbnVIYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpTWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0SGllck1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5OZXdGb250TWVudU9iamVjdChpRm9udE1lbnVIYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydEhpZXJNZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvVFhORm9udE1lbnVPYmplY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUWE5Gb250TWVudU9ial9OZXcsIG9UWE5Gb250TWVudU9iamVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmlGb250TWVudUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlNZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRIaWVyTWVudUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTk5ld0ZvbnRNZW51T2JqZWN0KGlGb250TWVudUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0SGllck1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9UWE5Gb250TWVudU9iamVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRYTkZvbnRNZW51T2JqX05ldywgb1RYTkZvbnRNZW51T2JqZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNbHRlX1RYTlZlcnNpb25JbmZvcm1hdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVFhOVmVyc2lvblZhbHVlIF9ydjsKLQlUWE5GZWF0dXJlQml0cyBvRmVhdHVyZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUWE5WZXJzaW9uVmFsdWUgX3J2OworICAgIFRYTkZlYXR1cmVCaXRzIG9GZWF0dXJlRmxhZ3M7CiAjaWZuZGVmIFRYTlZlcnNpb25JbmZvcm1hdGlvbgotCVB5TWFjX1BSRUNIRUNLKFRYTlZlcnNpb25JbmZvcm1hdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOVmVyc2lvbkluZm9ybWF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5WZXJzaW9uSW5mb3JtYXRpb24oJm9GZWF0dXJlRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9GZWF0dXJlRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUWE5WZXJzaW9uSW5mb3JtYXRpb24oJm9GZWF0dXJlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9GZWF0dXJlRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOSW5pdFRleHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCU9TU3RhdHVzIF9lcnI7Ci0JVFhOTWFjT1NQcmVmZXJyZWRGb250RGVzY3JpcHRpb24gKiBpRGVmYXVsdEZvbnRzID0gTlVMTDsKLQlJdGVtQ291bnQgaUNvdW50RGVmYXVsdEZvbnRzID0gMDsKLQlUWE5Jbml0T3B0aW9ucyBpVXNhZ2VGbGFnczsKLQlQeU1hY19QUkVDSEVDSyhUWE5Jbml0VGV4dGVuc2lvbik7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsICZpVXNhZ2VGbGFncykpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOSW5pdFRleHRlbnNpb24oaURlZmF1bHRGb250cywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaUNvdW50RGVmYXVsdEZvbnRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpVXNhZ2VGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5NYWNPU1ByZWZlcnJlZEZvbnREZXNjcmlwdGlvbiAqIGlEZWZhdWx0Rm9udHMgPSBOVUxMOworICAgIEl0ZW1Db3VudCBpQ291bnREZWZhdWx0Rm9udHMgPSAwOworICAgIFRYTkluaXRPcHRpb25zIGlVc2FnZUZsYWdzOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkluaXRUZXh0ZW5zaW9uKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwgJmlVc2FnZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkluaXRUZXh0ZW5zaW9uKGlEZWZhdWx0Rm9udHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudERlZmF1bHRGb250cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVVzYWdlRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKQEAgLTE2MjcsMjQgKzE2MjcsMjQgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmIE1sdGVfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiVFhOTmV3T2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOTmV3T2JqZWN0LCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgKiBpRmlsZVNwZWMsIFdpbmRvd1B0ciBpV2luZG93LCBSZWN0IGlGcmFtZSwgVFhORnJhbWVPcHRpb25zIGlGcmFtZU9wdGlvbnMsIFRYTkZyYW1lVHlwZSBpRnJhbWVUeXBlLCBUWE5GaWxlVHlwZSBpRmlsZVR5cGUsIFRYTlBlcm1hbmVudFRleHRFbmNvZGluZ1R5cGUgaVBlcm1hbmVudEVuY29kaW5nKSAtPiAoVFhOT2JqZWN0IG9UWE5PYmplY3QsIFRYTkZyYW1lSUQgb1RYTkZyYW1lSUQpIil9LAotCXsiVFhOVGVybWluYXRlVGV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilNbHRlX1RYTlRlcm1pbmF0ZVRleHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTklzU2NyYXBQYXN0YWJsZSIsIChQeUNGdW5jdGlvbilNbHRlX1RYTklzU2NyYXBQYXN0YWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiVFhOQ29udmVydFRvUHVibGljU2NyYXAiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCIsIChQeUNGdW5jdGlvbilNbHRlX1RYTkNvbnZlcnRGcm9tUHVibGljU2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTk5ld0ZvbnRNZW51T2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOTmV3Rm9udE1lbnVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaUZvbnRNZW51SGFuZGxlLCBTSW50MTYgaU1lbnVJRCwgU0ludDE2IGlTdGFydEhpZXJNZW51SUQpIC0+IChUWE5Gb250TWVudU9iamVjdCBvVFhORm9udE1lbnVPYmplY3QpIil9LAotCXsiVFhOVmVyc2lvbkluZm9ybWF0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOVmVyc2lvbkluZm9ybWF0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUWE5WZXJzaW9uVmFsdWUgX3J2LCBUWE5GZWF0dXJlQml0cyBvRmVhdHVyZUZsYWdzKSIpfSwKLQl7IlRYTkluaXRUZXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOSW5pdFRleHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKFRYTkluaXRPcHRpb25zKSAtPiBOb25lIil9LAorICAgIHsiVFhOTmV3T2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOTmV3T2JqZWN0LCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgKiBpRmlsZVNwZWMsIFdpbmRvd1B0ciBpV2luZG93LCBSZWN0IGlGcmFtZSwgVFhORnJhbWVPcHRpb25zIGlGcmFtZU9wdGlvbnMsIFRYTkZyYW1lVHlwZSBpRnJhbWVUeXBlLCBUWE5GaWxlVHlwZSBpRmlsZVR5cGUsIFRYTlBlcm1hbmVudFRleHRFbmNvZGluZ1R5cGUgaVBlcm1hbmVudEVuY29kaW5nKSAtPiAoVFhOT2JqZWN0IG9UWE5PYmplY3QsIFRYTkZyYW1lSUQgb1RYTkZyYW1lSUQpIil9LAorICAgIHsiVFhOVGVybWluYXRlVGV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilNbHRlX1RYTlRlcm1pbmF0ZVRleHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTklzU2NyYXBQYXN0YWJsZSIsIChQeUNGdW5jdGlvbilNbHRlX1RYTklzU2NyYXBQYXN0YWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiVFhOQ29udmVydFRvUHVibGljU2NyYXAiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCIsIChQeUNGdW5jdGlvbilNbHRlX1RYTkNvbnZlcnRGcm9tUHVibGljU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTk5ld0ZvbnRNZW51T2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOTmV3Rm9udE1lbnVPYmplY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaUZvbnRNZW51SGFuZGxlLCBTSW50MTYgaU1lbnVJRCwgU0ludDE2IGlTdGFydEhpZXJNZW51SUQpIC0+IChUWE5Gb250TWVudU9iamVjdCBvVFhORm9udE1lbnVPYmplY3QpIil9LAorICAgIHsiVFhOVmVyc2lvbkluZm9ybWF0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOVmVyc2lvbkluZm9ybWF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUWE5WZXJzaW9uVmFsdWUgX3J2LCBUWE5GZWF0dXJlQml0cyBvRmVhdHVyZUZsYWdzKSIpfSwKKyAgICB7IlRYTkluaXRUZXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOSW5pdFRleHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTkluaXRPcHRpb25zKSAtPiBOb25lIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTE2NTIsMzcgKzE2NTIsMzcgQEAKIAogdm9pZCBpbml0X01sdGUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkvLyAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKHh4eHgpOworICAgIC8vICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoeHh4eCk7CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9NbHRlIiwgTWx0ZV9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX01sdGUiLCBNbHRlX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCU1sdGVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChNbHRlX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTWx0ZV9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCVRYTk9iamVjdF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVFhOT2JqZWN0X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmVFhOT2JqZWN0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhOT2JqZWN0IiwgKFB5T2JqZWN0ICopJlRYTk9iamVjdF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlRYTk9iamVjdF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRYTk9iamVjdFR5cGUiLCAoUHlPYmplY3QgKikmVFhOT2JqZWN0X1R5cGUpOwotCVRYTkZvbnRNZW51T2JqZWN0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZUWE5Gb250TWVudU9iamVjdF9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhORm9udE1lbnVPYmplY3QiLCAoUHlPYmplY3QgKikmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRYTkZvbnRNZW51T2JqZWN0VHlwZSIsIChQeU9iamVjdCAqKSZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBNbHRlX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoTWx0ZV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIE1sdGVfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBUWE5PYmplY3RfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlRYTk9iamVjdF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJlRYTk9iamVjdF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRYTk9iamVjdCIsIChQeU9iamVjdCAqKSZUWE5PYmplY3RfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZUWE5PYmplY3RfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUWE5PYmplY3RUeXBlIiwgKFB5T2JqZWN0ICopJlRYTk9iamVjdF9UeXBlKTsKKyAgICBUWE5Gb250TWVudU9iamVjdF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVFhORm9udE1lbnVPYmplY3RfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRYTkZvbnRNZW51T2JqZWN0IiwgKFB5T2JqZWN0ICopJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUWE5Gb250TWVudU9iamVjdFR5cGUiLCAoUHlPYmplY3QgKikmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvb3NhL19PU0Ftb2R1bGUuYyBiL01hYy9Nb2R1bGVzL29zYS9fT1NBbW9kdWxlLmMKaW5kZXggYWIzMDMyMC4uMTBkZDBmZiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvb3NhL19PU0Ftb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9vc2EvX09TQW1vZHVsZS5jCkBAIC05LDkgKzksOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzcsNzUzICszNyw3NTMgQEAKICNkZWZpbmUgT1NBT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNvbXBvbmVudEluc3RhbmNlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ29tcG9uZW50SW5zdGFuY2Ugb2JfaXRzZWxmOwogfSBPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdDsKIAogUHlPYmplY3QgKk9TQU9ial9OZXcoQ29tcG9uZW50SW5zdGFuY2UgaXRzZWxmKQogewotCU9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhPU0FfRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCwgJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoT1NBX0Vycm9yLCJOVUxMIENvbXBvbmVudEluc3RhbmNlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QsICZPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBPU0FPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ29tcG9uZW50SW5zdGFuY2UgKnBfaXRzZWxmKQogewogCi0JICAgICAgICAgICAgICAgIGlmIChDbXBJbnN0T2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpKQotCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotCSAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotCSAgICAgICAgICAgICAgICAKLQlpZiAoIU9TQU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPU0FDb21wb25lbnRJbnN0YW5jZSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ21wSW5zdE9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworCisgICAgaWYgKCFPU0FPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT1NBQ29tcG9uZW50SW5zdGFuY2UgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBPU0FPYmpfZGVhbGxvYyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUxvYWQoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHNjcmlwdERhdGE7Ci0JbG9uZyBtb2RlRmxhZ3M7Ci0JT1NBSUQgcmVzdWx0aW5nU2NyaXB0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHNjcmlwdERhdGE7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgT1NBSUQgcmVzdWx0aW5nU2NyaXB0SUQ7CiAjaWZuZGVmIE9TQUxvYWQKLQlQeU1hY19QUkVDSEVDSyhPU0FMb2FkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FMb2FkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc2NyaXB0RGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FMb2FkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FMb2FkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgJnNjcmlwdERhdGEsCisgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0SUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FTdG9yZShPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBzY3JpcHRJRDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlsb25nIG1vZGVGbGFnczsKLQlBRURlc2MgcmVzdWx0aW5nU2NyaXB0RGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRJRDsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBBRURlc2MgcmVzdWx0aW5nU2NyaXB0RGF0YTsKICNpZm5kZWYgT1NBU3RvcmUKLQlQeU1hY19QUkVDSEVDSyhPU0FTdG9yZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU3RvcmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBU3RvcmUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHREYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NjcmlwdERhdGEpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQVN0b3JlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAorICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0RGF0YSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdTY3JpcHREYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBRXhlY3V0ZShPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBjb21waWxlZFNjcmlwdElEOwotCU9TQUlEIGNvbnRleHRJRDsKLQlsb25nIG1vZGVGbGFnczsKLQlPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIGNvbXBpbGVkU2NyaXB0SUQ7CisgICAgT1NBSUQgY29udGV4dElEOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CiAjaWZuZGVmIE9TQUV4ZWN1dGUKLQlQeU1hY19QUkVDSEVDSyhPU0FFeGVjdXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FFeGVjdXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21waWxlZFNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUV4ZWN1dGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBjb21waWxlZFNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21waWxlZFNjcmlwdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUV4ZWN1dGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZFNjcmlwdElELAorICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FEaXNwbGF5KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIHNjcmlwdFZhbHVlSUQ7Ci0JRGVzY1R5cGUgZGVzaXJlZFR5cGU7Ci0JbG9uZyBtb2RlRmxhZ3M7Ci0JQUVEZXNjIHJlc3VsdGluZ1RleHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgT1NBSUQgc2NyaXB0VmFsdWVJRDsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBBRURlc2MgcmVzdWx0aW5nVGV4dDsKICNpZm5kZWYgT1NBRGlzcGxheQotCVB5TWFjX1BSRUNIRUNLKE9TQURpc3BsYXkpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQURpc3BsYXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRWYWx1ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FEaXNwbGF5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc2NyaXB0VmFsdWVJRCwKLQkgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1RleHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nVGV4dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRWYWx1ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FEaXNwbGF5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VmFsdWVJRCwKKyAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1RleHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nVGV4dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQVNjcmlwdEVycm9yKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TVHlwZSBzZWxlY3RvcjsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlBRURlc2MgcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU1R5cGUgc2VsZWN0b3I7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgQUVEZXNjIHJlc3VsdGluZ0Vycm9yRGVzY3JpcHRpb247CiAjaWZuZGVmIE9TQVNjcmlwdEVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soT1NBU2NyaXB0RXJyb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQVNjcmlwdEVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBU2NyaXB0RXJyb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdFcnJvckRlc2NyaXB0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQVNjcmlwdEVycm9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ0Vycm9yRGVzY3JpcHRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQURpc3Bvc2UoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgc2NyaXB0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgT1NBSUQgc2NyaXB0SUQ7CiAjaWZuZGVmIE9TQURpc3Bvc2UKLQlQeU1hY19QUkVDSEVDSyhPU0FEaXNwb3NlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FEaXNwb3NlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBRGlzcG9zZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHNjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQURpc3Bvc2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQVNldFNjcmlwdEluZm8oT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgc2NyaXB0SUQ7Ci0JT1NUeXBlIHNlbGVjdG9yOwotCWxvbmcgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgT1NBSUQgc2NyaXB0SUQ7CisgICAgT1NUeXBlIHNlbGVjdG9yOworICAgIGxvbmcgdmFsdWU7CiAjaWZuZGVmIE9TQVNldFNjcmlwdEluZm8KLQlQeU1hY19QUkVDSEVDSyhPU0FTZXRTY3JpcHRJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FTZXRTY3JpcHRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBU2V0U2NyaXB0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQVNldFNjcmlwdEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUdldFNjcmlwdEluZm8oT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgc2NyaXB0SUQ7Ci0JT1NUeXBlIHNlbGVjdG9yOwotCWxvbmcgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIHNjcmlwdElEOworICAgIE9TVHlwZSBzZWxlY3RvcjsKKyAgICBsb25nIHJlc3VsdDsKICNpZm5kZWYgT1NBR2V0U2NyaXB0SW5mbwotCVB5TWFjX1BSRUNIRUNLKE9TQUdldFNjcmlwdEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUdldFNjcmlwdEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FHZXRTY3JpcHRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUdldFNjcmlwdEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FTY3JpcHRpbmdDb21wb25lbnROYW1lKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyByZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyByZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lOwogI2lmbmRlZiBPU0FTY3JpcHRpbmdDb21wb25lbnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0aW5nQ29tcG9uZW50TmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0aW5nQ29tcG9uZW50TmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBQ29tcGlsZShPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlBRURlc2Mgc291cmNlRGF0YTsKLQlsb25nIG1vZGVGbGFnczsKLQlPU0FJRCBwcmV2aW91c0FuZFJlc3VsdGluZ1NjcmlwdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBzb3VyY2VEYXRhOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQ7CiAjaWZuZGVmIE9TQUNvbXBpbGUKLQlQeU1hY19QUkVDSEVDSyhPU0FDb21waWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FDb21waWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc291cmNlRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FDb21waWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgJnNvdXJjZURhdGEsCi0JICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICZwcmV2aW91c0FuZFJlc3VsdGluZ1NjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0FuZFJlc3VsdGluZ1NjcmlwdElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNvdXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBQ29tcGlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAmcHJldmlvdXNBbmRSZXN1bHRpbmdTY3JpcHRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNBbmRSZXN1bHRpbmdTY3JpcHRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUNvcHlJRChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBmcm9tSUQ7Ci0JT1NBSUQgdG9JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBmcm9tSUQ7CisgICAgT1NBSUQgdG9JRDsKICNpZm5kZWYgT1NBQ29weUlECi0JUHlNYWNfUFJFQ0hFQ0soT1NBQ29weUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FDb3B5SUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmcm9tSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQ29weUlEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBmcm9tSUQsCi0JICAgICAgICAgICAgICAgICAmdG9JRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdG9JRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmcm9tSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBQ29weUlEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBmcm9tSUQsCisgICAgICAgICAgICAgICAgICAgICAmdG9JRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9JRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUdldFNvdXJjZShPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBzY3JpcHRJRDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlBRURlc2MgcmVzdWx0aW5nU291cmNlRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRJRDsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBBRURlc2MgcmVzdWx0aW5nU291cmNlRGF0YTsKICNpZm5kZWYgT1NBR2V0U291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soT1NBR2V0U291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FHZXRTb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FHZXRTb3VyY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU291cmNlRGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdTb3VyY2VEYXRhKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUdldFNvdXJjZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTb3VyY2VEYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NvdXJjZURhdGEpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FDb2VyY2VGcm9tRGVzYyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlBRURlc2Mgc2NyaXB0RGF0YTsKLQlsb25nIG1vZGVGbGFnczsKLQlPU0FJRCByZXN1bHRpbmdTY3JpcHRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBRURlc2Mgc2NyaXB0RGF0YTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBPU0FJRCByZXN1bHRpbmdTY3JpcHRJRDsKICNpZm5kZWYgT1NBQ29lcmNlRnJvbURlc2MKLQlQeU1hY19QUkVDSEVDSyhPU0FDb2VyY2VGcm9tRGVzYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBQ29lcmNlRnJvbURlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzY3JpcHREYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUNvZXJjZUZyb21EZXNjKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHREYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FDb2VyY2VGcm9tRGVzYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0SUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ1NjcmlwdElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBQ29lcmNlVG9EZXNjKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIHNjcmlwdElEOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCWxvbmcgbW9kZUZsYWdzOwotCUFFRGVzYyByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgT1NBSUQgc2NyaXB0SUQ7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgT1NBQ29lcmNlVG9EZXNjCi0JUHlNYWNfUFJFQ0hFQ0soT1NBQ29lcmNlVG9EZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FDb2VyY2VUb0Rlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQ29lcmNlVG9EZXNjKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUNvZXJjZVRvRGVzYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU2V0RGVmYXVsdFRhcmdldChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlBRUFkZHJlc3NEZXNjIHRhcmdldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBRUFkZHJlc3NEZXNjIHRhcmdldDsKICNpZm5kZWYgT1NBU2V0RGVmYXVsdFRhcmdldAotCVB5TWFjX1BSRUNIRUNLKE9TQVNldERlZmF1bHRUYXJnZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQVNldERlZmF1bHRUYXJnZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRhcmdldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTZXREZWZhdWx0VGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRhcmdldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FTZXREZWZhdWx0VGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQVN0YXJ0UmVjb3JkaW5nKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIGNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBjb21waWxlZFNjcmlwdFRvTW9kaWZ5SUQ7CiAjaWZuZGVmIE9TQVN0YXJ0UmVjb3JkaW5nCi0JUHlNYWNfUFJFQ0hFQ0soT1NBU3RhcnRSZWNvcmRpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQVN0YXJ0UmVjb3JkaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBU3RhcnRSZWNvcmRpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRTY3JpcHRUb01vZGlmeUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQVN0YXJ0UmVjb3JkaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21waWxlZFNjcmlwdFRvTW9kaWZ5SUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQVN0b3BSZWNvcmRpbmcoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgY29tcGlsZWRTY3JpcHRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBjb21waWxlZFNjcmlwdElEOwogI2lmbmRlZiBPU0FTdG9wUmVjb3JkaW5nCi0JUHlNYWNfUFJFQ0hFQ0soT1NBU3RvcFJlY29yZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU3RvcFJlY29yZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbXBpbGVkU2NyaXB0SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBU3RvcFJlY29yZGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NyaXB0SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcGlsZWRTY3JpcHRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FTdG9wUmVjb3JkaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRTY3JpcHRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUxvYWRFeGVjdXRlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyBzY3JpcHREYXRhOwotCU9TQUlEIGNvbnRleHRJRDsKLQlsb25nIG1vZGVGbGFnczsKLQlPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBzY3JpcHREYXRhOworICAgIE9TQUlEIGNvbnRleHRJRDsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEOwogI2lmbmRlZiBPU0FMb2FkRXhlY3V0ZQotCVB5TWFjX1BSRUNIRUNLKE9TQUxvYWRFeGVjdXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FMb2FkRXhlY3V0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzY3JpcHREYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUxvYWRFeGVjdXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHREYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNjcmlwdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBTG9hZEV4ZWN1dGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUNvbXBpbGVFeGVjdXRlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyBzb3VyY2VEYXRhOwotCU9TQUlEIGNvbnRleHRJRDsKLQlsb25nIG1vZGVGbGFnczsKLQlPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBzb3VyY2VEYXRhOworICAgIE9TQUlEIGNvbnRleHRJRDsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEOwogI2lmbmRlZiBPU0FDb21waWxlRXhlY3V0ZQotCVB5TWFjX1BSRUNIRUNLKE9TQUNvbXBpbGVFeGVjdXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FDb21waWxlRXhlY3V0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzb3VyY2VEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUNvbXBpbGVFeGVjdXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNvdXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBQ29tcGlsZUV4ZWN1dGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQURvU2NyaXB0KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyBzb3VyY2VEYXRhOwotCU9TQUlEIGNvbnRleHRJRDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlsb25nIG1vZGVGbGFnczsKLQlBRURlc2MgcmVzdWx0aW5nVGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBRURlc2Mgc291cmNlRGF0YTsKKyAgICBPU0FJRCBjb250ZXh0SUQ7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgQUVEZXNjIHJlc3VsdGluZ1RleHQ7CiAjaWZuZGVmIE9TQURvU2NyaXB0Ci0JUHlNYWNfUFJFQ0hFQ0soT1NBRG9TY3JpcHQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQURvU2NyaXB0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc291cmNlRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBRG9TY3JpcHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgJnNvdXJjZURhdGEsCi0JICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1RleHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nVGV4dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzb3VyY2VEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FEb1NjcmlwdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nVGV4dCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdUZXh0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU2V0Q3VycmVudERpYWxlY3QoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0Jc2hvcnQgZGlhbGVjdENvZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgc2hvcnQgZGlhbGVjdENvZGU7CiAjaWZuZGVmIE9TQVNldEN1cnJlbnREaWFsZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soT1NBU2V0Q3VycmVudERpYWxlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQVNldEN1cnJlbnREaWFsZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlhbGVjdENvZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBU2V0Q3VycmVudERpYWxlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdENvZGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlhbGVjdENvZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU2V0Q3VycmVudERpYWxlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdENvZGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FHZXRDdXJyZW50RGlhbGVjdChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlzaG9ydCByZXN1bHRpbmdEaWFsZWN0Q29kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBzaG9ydCByZXN1bHRpbmdEaWFsZWN0Q29kZTsKICNpZm5kZWYgT1NBR2V0Q3VycmVudERpYWxlY3QKLQlQeU1hY19QUkVDSEVDSyhPU0FHZXRDdXJyZW50RGlhbGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBR2V0Q3VycmVudERpYWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FHZXRDdXJyZW50RGlhbGVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdENvZGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ0RpYWxlY3RDb2RlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUdldEN1cnJlbnREaWFsZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0Q29kZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nRGlhbGVjdENvZGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FBdmFpbGFibGVEaWFsZWN0cyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlBRURlc2MgcmVzdWx0aW5nRGlhbGVjdEluZm9MaXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mb0xpc3Q7CiAjaWZuZGVmIE9TQUF2YWlsYWJsZURpYWxlY3RzCi0JUHlNYWNfUFJFQ0hFQ0soT1NBQXZhaWxhYmxlRGlhbGVjdHMpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUF2YWlsYWJsZURpYWxlY3RzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQXZhaWxhYmxlRGlhbGVjdHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdEaWFsZWN0SW5mb0xpc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBQXZhaWxhYmxlRGlhbGVjdHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdEaWFsZWN0SW5mb0xpc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FHZXREaWFsZWN0SW5mbyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlzaG9ydCBkaWFsZWN0Q29kZTsKLQlPU1R5cGUgc2VsZWN0b3I7Ci0JQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RJbmZvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIHNob3J0IGRpYWxlY3RDb2RlOworICAgIE9TVHlwZSBzZWxlY3RvcjsKKyAgICBBRURlc2MgcmVzdWx0aW5nRGlhbGVjdEluZm87CiAjaWZuZGVmIE9TQUdldERpYWxlY3RJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soT1NBR2V0RGlhbGVjdEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUdldERpYWxlY3RJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaWFsZWN0Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBR2V0RGlhbGVjdEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdENvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdEluZm8pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nRGlhbGVjdEluZm8pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWFsZWN0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBR2V0RGlhbGVjdEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdEluZm8pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nRGlhbGVjdEluZm8pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FBdmFpbGFibGVEaWFsZWN0Q29kZUxpc3QoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RDb2RlTGlzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBRURlc2MgcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0OwogI2lmbmRlZiBPU0FBdmFpbGFibGVEaWFsZWN0Q29kZUxpc3QKLQlQeU1hY19QUkVDSEVDSyhPU0FBdmFpbGFibGVEaWFsZWN0Q29kZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ0RpYWxlY3RDb2RlTGlzdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdEaWFsZWN0Q29kZUxpc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBQXZhaWxhYmxlRGlhbGVjdENvZGVMaXN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0RpYWxlY3RDb2RlTGlzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUV4ZWN1dGVFdmVudChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQ7Ci0JT1NBSUQgY29udGV4dElEOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQXBwbGVFdmVudCB0aGVBcHBsZUV2ZW50OworICAgIE9TQUlEIGNvbnRleHRJRDsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEOwogI2lmbmRlZiBPU0FFeGVjdXRlRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhPU0FFeGVjdXRlRXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUV4ZWN1dGVFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZ0aGVBcHBsZUV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUV4ZWN1dGVFdmVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFwcGxlRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQXBwbGVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FFeGVjdXRlRXZlbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVBcHBsZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FEb0V2ZW50KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFwcGxlRXZlbnQgdGhlQXBwbGVFdmVudDsKLQlPU0FJRCBjb250ZXh0SUQ7Ci0JbG9uZyBtb2RlRmxhZ3M7Ci0JQXBwbGVFdmVudCByZXBseTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQ7CisgICAgT1NBSUQgY29udGV4dElEOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIEFwcGxlRXZlbnQgcmVwbHk7CiAjaWZuZGVmIE9TQURvRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhPU0FEb0V2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FEb0V2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFwcGxlRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBRG9FdmVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICZ0aGVBcHBsZUV2ZW50LAotCSAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlcGx5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZ0aGVBcHBsZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQURvRXZlbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAmdGhlQXBwbGVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXBseSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQU1ha2VDb250ZXh0KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyBjb250ZXh0TmFtZTsKLQlPU0FJRCBwYXJlbnRDb250ZXh0OwotCU9TQUlEIHJlc3VsdGluZ0NvbnRleHRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBRURlc2MgY29udGV4dE5hbWU7CisgICAgT1NBSUQgcGFyZW50Q29udGV4dDsKKyAgICBPU0FJRCByZXN1bHRpbmdDb250ZXh0SUQ7CiAjaWZuZGVmIE9TQU1ha2VDb250ZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soT1NBTWFrZUNvbnRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQU1ha2VDb250ZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmY29udGV4dE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRDb250ZXh0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQU1ha2VDb250ZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29udGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ0NvbnRleHRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nQ29udGV4dElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJmNvbnRleHROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyZW50Q29udGV4dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FNYWtlQ29udGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdDb250ZXh0SUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ0NvbnRleHRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBPU0FPYmpfbWV0aG9kc1tdID0gewotCXsiT1NBTG9hZCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBTG9hZCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0SUQpIil9LAotCXsiT1NBU3RvcmUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVN0b3JlLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1NjcmlwdERhdGEpIil9LAotCXsiT1NBRXhlY3V0ZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRXhlY3V0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgY29tcGlsZWRTY3JpcHRJRCwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpIil9LAotCXsiT1NBRGlzcGxheSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRGlzcGxheSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0VmFsdWVJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1RleHQpIil9LAotCXsiT1NBU2NyaXB0RXJyb3IiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNjcmlwdEVycm9yLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgc2VsZWN0b3IsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0Vycm9yRGVzY3JpcHRpb24pIil9LAotCXsiT1NBRGlzcG9zZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRGlzcG9zZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQpIC0+IE5vbmUiKX0sCi0JeyJPU0FTZXRTY3JpcHRJbmZvIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTZXRTY3JpcHRJbmZvLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgT1NUeXBlIHNlbGVjdG9yLCBsb25nIHZhbHVlKSAtPiBOb25lIil9LAotCXsiT1NBR2V0U2NyaXB0SW5mbyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBR2V0U2NyaXB0SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIE9TVHlwZSBzZWxlY3RvcikgLT4gKGxvbmcgcmVzdWx0KSIpfSwKLQl7Ik9TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyByZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKSIpfSwKLQl7Ik9TQUNvbXBpbGUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvbXBpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEFFRGVzYyBzb3VyY2VEYXRhLCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQpIil9LAotCXsiT1NBQ29weUlEIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb3B5SUQsIDEsCi0JIFB5RG9jX1NUUigiKE9TQUlEIGZyb21JRCkgLT4gKE9TQUlEIHRvSUQpIil9LAotCXsiT1NBR2V0U291cmNlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXRTb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFRGVzYyByZXN1bHRpbmdTb3VyY2VEYXRhKSIpfSwKLQl7Ik9TQUNvZXJjZUZyb21EZXNjIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb2VyY2VGcm9tRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0SUQpIil9LAotCXsiT1NBQ29lcmNlVG9EZXNjIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb2VyY2VUb0Rlc2MsIDEsCi0JIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKLQl7Ik9TQVNldERlZmF1bHRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNldERlZmF1bHRUYXJnZXQsIDEsCi0JIFB5RG9jX1NUUigiKEFFQWRkcmVzc0Rlc2MgdGFyZ2V0KSAtPiBOb25lIil9LAotCXsiT1NBU3RhcnRSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVN0YXJ0UmVjb3JkaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChPU0FJRCBjb21waWxlZFNjcmlwdFRvTW9kaWZ5SUQpIil9LAotCXsiT1NBU3RvcFJlY29yZGluZyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU3RvcFJlY29yZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgY29tcGlsZWRTY3JpcHRJRCkgLT4gTm9uZSIpfSwKLQl7Ik9TQUxvYWRFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FMb2FkRXhlY3V0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKLQl7Ik9TQUNvbXBpbGVFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb21waWxlRXhlY3V0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQUVEZXNjIHNvdXJjZURhdGEsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKLQl7Ik9TQURvU2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEb1NjcmlwdCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVEZXNjIHNvdXJjZURhdGEsIE9TQUlEIGNvbnRleHRJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1RleHQpIil9LAotCXsiT1NBU2V0Q3VycmVudERpYWxlY3QiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNldEN1cnJlbnREaWFsZWN0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkaWFsZWN0Q29kZSkgLT4gTm9uZSIpfSwKLQl7Ik9TQUdldEN1cnJlbnREaWFsZWN0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXRDdXJyZW50RGlhbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgcmVzdWx0aW5nRGlhbGVjdENvZGUpIil9LAotCXsiT1NBQXZhaWxhYmxlRGlhbGVjdHMiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBRURlc2MgcmVzdWx0aW5nRGlhbGVjdEluZm9MaXN0KSIpfSwKLQl7Ik9TQUdldERpYWxlY3RJbmZvIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXREaWFsZWN0SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZGlhbGVjdENvZGUsIE9TVHlwZSBzZWxlY3RvcikgLT4gKEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mbykiKX0sCi0JeyJPU0FBdmFpbGFibGVEaWFsZWN0Q29kZUxpc3QiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RDb2RlTGlzdCkiKX0sCi0JeyJPU0FFeGVjdXRlRXZlbnQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUV4ZWN1dGVFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQXBwbGVFdmVudCB0aGVBcHBsZUV2ZW50LCBPU0FJRCBjb250ZXh0SUQsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCkiKX0sCi0JeyJPU0FEb0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEb0V2ZW50LCAxLAotCSBQeURvY19TVFIoIihBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBcHBsZUV2ZW50IHJlcGx5KSIpfSwKLQl7Ik9TQU1ha2VDb250ZXh0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FNYWtlQ29udGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVEZXNjIGNvbnRleHROYW1lLCBPU0FJRCBwYXJlbnRDb250ZXh0KSAtPiAoT1NBSUQgcmVzdWx0aW5nQ29udGV4dElEKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Ik9TQUxvYWQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUxvYWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRGVzYyBzY3JpcHREYXRhLCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdElEKSIpfSwKKyAgICB7Ik9TQVN0b3JlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTdG9yZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIERlc2NUeXBlIGRlc2lyZWRUeXBlLCBsb25nIG1vZGVGbGFncykgLT4gKEFFRGVzYyByZXN1bHRpbmdTY3JpcHREYXRhKSIpfSwKKyAgICB7Ik9TQUV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUV4ZWN1dGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIGNvbXBpbGVkU2NyaXB0SUQsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKKyAgICB7Ik9TQURpc3BsYXkiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQURpc3BsYXksIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdFZhbHVlSUQsIERlc2NUeXBlIGRlc2lyZWRUeXBlLCBsb25nIG1vZGVGbGFncykgLT4gKEFFRGVzYyByZXN1bHRpbmdUZXh0KSIpfSwKKyAgICB7Ik9TQVNjcmlwdEVycm9yIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTY3JpcHRFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHNlbGVjdG9yLCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFRGVzYyByZXN1bHRpbmdFcnJvckRlc2NyaXB0aW9uKSIpfSwKKyAgICB7Ik9TQURpc3Bvc2UiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQURpc3Bvc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElEKSAtPiBOb25lIil9LAorICAgIHsiT1NBU2V0U2NyaXB0SW5mbyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2V0U2NyaXB0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIE9TVHlwZSBzZWxlY3RvciwgbG9uZyB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7Ik9TQUdldFNjcmlwdEluZm8iLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUdldFNjcmlwdEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBPU1R5cGUgc2VsZWN0b3IpIC0+IChsb25nIHJlc3VsdCkiKX0sCisgICAgeyJPU0FTY3JpcHRpbmdDb21wb25lbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTY3JpcHRpbmdDb21wb25lbnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChBRURlc2MgcmVzdWx0aW5nU2NyaXB0aW5nQ29tcG9uZW50TmFtZSkiKX0sCisgICAgeyJPU0FDb21waWxlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb21waWxlLCAxLAorICAgICBQeURvY19TVFIoIihBRURlc2Mgc291cmNlRGF0YSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCBwcmV2aW91c0FuZFJlc3VsdGluZ1NjcmlwdElEKSIpfSwKKyAgICB7Ik9TQUNvcHlJRCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQ29weUlELCAxLAorICAgICBQeURvY19TVFIoIihPU0FJRCBmcm9tSUQpIC0+IChPU0FJRCB0b0lEKSIpfSwKKyAgICB7Ik9TQUdldFNvdXJjZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBR2V0U291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUpIC0+IChBRURlc2MgcmVzdWx0aW5nU291cmNlRGF0YSkiKX0sCisgICAgeyJPU0FDb2VyY2VGcm9tRGVzYyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQ29lcmNlRnJvbURlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRGVzYyBzY3JpcHREYXRhLCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdElEKSIpfSwKKyAgICB7Ik9TQUNvZXJjZVRvRGVzYyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQ29lcmNlVG9EZXNjLCAxLAorICAgICBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJPU0FTZXREZWZhdWx0VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTZXREZWZhdWx0VGFyZ2V0LCAxLAorICAgICBQeURvY19TVFIoIihBRUFkZHJlc3NEZXNjIHRhcmdldCkgLT4gTm9uZSIpfSwKKyAgICB7Ik9TQVN0YXJ0UmVjb3JkaW5nIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTdGFydFJlY29yZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoT1NBSUQgY29tcGlsZWRTY3JpcHRUb01vZGlmeUlEKSIpfSwKKyAgICB7Ik9TQVN0b3BSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVN0b3BSZWNvcmRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIGNvbXBpbGVkU2NyaXB0SUQpIC0+IE5vbmUiKX0sCisgICAgeyJPU0FMb2FkRXhlY3V0ZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBTG9hZEV4ZWN1dGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRGVzYyBzY3JpcHREYXRhLCBPU0FJRCBjb250ZXh0SUQsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCkiKX0sCisgICAgeyJPU0FDb21waWxlRXhlY3V0ZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQ29tcGlsZUV4ZWN1dGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRGVzYyBzb3VyY2VEYXRhLCBPU0FJRCBjb250ZXh0SUQsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCkiKX0sCisgICAgeyJPU0FEb1NjcmlwdCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRG9TY3JpcHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRGVzYyBzb3VyY2VEYXRhLCBPU0FJRCBjb250ZXh0SUQsIERlc2NUeXBlIGRlc2lyZWRUeXBlLCBsb25nIG1vZGVGbGFncykgLT4gKEFFRGVzYyByZXN1bHRpbmdUZXh0KSIpfSwKKyAgICB7Ik9TQVNldEN1cnJlbnREaWFsZWN0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTZXRDdXJyZW50RGlhbGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZGlhbGVjdENvZGUpIC0+IE5vbmUiKX0sCisgICAgeyJPU0FHZXRDdXJyZW50RGlhbGVjdCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBR2V0Q3VycmVudERpYWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IHJlc3VsdGluZ0RpYWxlY3RDb2RlKSIpfSwKKyAgICB7Ik9TQUF2YWlsYWJsZURpYWxlY3RzIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FBdmFpbGFibGVEaWFsZWN0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdCkiKX0sCisgICAgeyJPU0FHZXREaWFsZWN0SW5mbyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBR2V0RGlhbGVjdEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGRpYWxlY3RDb2RlLCBPU1R5cGUgc2VsZWN0b3IpIC0+IChBRURlc2MgcmVzdWx0aW5nRGlhbGVjdEluZm8pIil9LAorICAgIHsiT1NBQXZhaWxhYmxlRGlhbGVjdENvZGVMaXN0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FBdmFpbGFibGVEaWFsZWN0Q29kZUxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0Q29kZUxpc3QpIil9LAorICAgIHsiT1NBRXhlY3V0ZUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FFeGVjdXRlRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFwcGxlRXZlbnQgdGhlQXBwbGVFdmVudCwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpIil9LAorICAgIHsiT1NBRG9FdmVudCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRG9FdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQXBwbGVFdmVudCB0aGVBcHBsZUV2ZW50LCBPU0FJRCBjb250ZXh0SUQsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQXBwbGVFdmVudCByZXBseSkiKX0sCisgICAgeyJPU0FNYWtlQ29udGV4dCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBTWFrZUNvbnRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRGVzYyBjb250ZXh0TmFtZSwgT1NBSUQgcGFyZW50Q29udGV4dCkgLT4gKE9TQUlEIHJlc3VsdGluZ0NvbnRleHRJRCkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIE9TQU9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTgwMCw2OCArODAwLDY4IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlDb21wb25lbnRJbnN0YW5jZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIENvbXBvbmVudEluc3RhbmNlIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIE9TQU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIE9TQU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIE9TQU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9PU0EuT1NBQ29tcG9uZW50SW5zdGFuY2UiLCAvKnRwX25hbWUqLwotCXNpemVvZihPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIE9TQU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBPU0FPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIE9TQU9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgT1NBT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCU9TQU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlPU0FPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JT1NBT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlPU0FPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JT1NBT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JT1NBT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfT1NBLk9TQUNvbXBvbmVudEluc3RhbmNlIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBPU0FPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgT1NBT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBPU0FPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIE9TQU9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBPU0FPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgT1NBT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIE9TQU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgT1NBT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIE9TQU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIE9TQU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgT1NBQ29tcG9uZW50SW5zdGFuY2UgLS0tLS0tLS0tLS0tLS0gKi8KIAogCiBzdGF0aWMgUHlNZXRob2REZWYgT1NBX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtODY5LDMwICs4NjksMzAgQEAKIAogdm9pZCBpbml0X09TQSh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCS8qCi0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb21wb25lbnRJbnN0YW5jZSwgT1NBT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29tcG9uZW50SW5zdGFuY2UsIE9TQU9ial9Db252ZXJ0KTsKLQkqLworICAgIC8qCisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudEluc3RhbmNlLCBPU0FPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENvbXBvbmVudEluc3RhbmNlLCBPU0FPYmpfQ29udmVydCk7CisgICAgKi8KIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9PU0EiLCBPU0FfbWV0aG9kcyk7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JT1NBX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoT1NBX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgT1NBX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJPU0FDb21wb25lbnRJbnN0YW5jZSIsIChQeU9iamVjdCAqKSZPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiT1NBQ29tcG9uZW50SW5zdGFuY2VUeXBlIiwgKFB5T2JqZWN0ICopJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfT1NBIiwgT1NBX21ldGhvZHMpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIE9TQV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKE9TQV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIE9TQV9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIE9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiT1NBQ29tcG9uZW50SW5zdGFuY2UiLCAoUHlPYmplY3QgKikmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk9TQUNvbXBvbmVudEluc3RhbmNlVHlwZSIsIChQeU9iamVjdCAqKSZPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09IEVuZCBtb2R1bGUgX09TQSA9PT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9xZC9fUWRtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL3FkL19RZG1vZHVsZS5jCmluZGV4IDhjOThmYTEuLmM3NTk0YjkgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3FkL19RZG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3FkL19RZG1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC00MiwxOSArNDIsMTkgQEAKIFB5T2JqZWN0ICpRZFJHQl9OZXcoUkdCQ29sb3JQdHIgaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbGwiLCAobG9uZylpdHNlbGYtPnJlZCwgKGxvbmcpaXRzZWxmLT5ncmVlbiwgKGxvbmcpaXRzZWxmLT5ibHVlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGxsIiwgKGxvbmcpaXRzZWxmLT5yZWQsIChsb25nKWl0c2VsZi0+Z3JlZW4sIChsb25nKWl0c2VsZi0+Ymx1ZSk7CiB9CiAKIGludCBRZFJHQl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBSR0JDb2xvclB0ciBwX2l0c2VsZikKIHsKLSAgICAgICAgbG9uZyByZWQsIGdyZWVuLCBibHVlOworICAgIGxvbmcgcmVkLCBncmVlbiwgYmx1ZTsKIAotICAgICAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsbCIsICZyZWQsICZncmVlbiwgJmJsdWUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcF9pdHNlbGYtPnJlZCA9ICh1bnNpZ25lZCBzaG9ydClyZWQ7Ci0gICAgICAgIHBfaXRzZWxmLT5ncmVlbiA9ICh1bnNpZ25lZCBzaG9ydClncmVlbjsKLSAgICAgICAgcF9pdHNlbGYtPmJsdWUgPSAodW5zaWduZWQgc2hvcnQpYmx1ZTsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJsbGwiLCAmcmVkLCAmZ3JlZW4sICZibHVlKSApCisgICAgICAgIHJldHVybiAwOworICAgIHBfaXRzZWxmLT5yZWQgPSAodW5zaWduZWQgc2hvcnQpcmVkOworICAgIHBfaXRzZWxmLT5ncmVlbiA9ICh1bnNpZ25lZCBzaG9ydClncmVlbjsKKyAgICBwX2l0c2VsZi0+Ymx1ZSA9ICh1bnNpZ25lZCBzaG9ydClibHVlOworICAgIHJldHVybiAxOwogfQogCiAvKgpAQCAtNjQsOCArNjQsOCBAQAogUHlPYmplY3QgKlFkRklfTmV3KEZvbnRJbmZvICppdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhoaGgiLCBpdHNlbGYtPmFzY2VudCwgaXRzZWxmLT5kZXNjZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT53aWRNYXgsIGl0c2VsZi0+bGVhZGluZyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhoaGgiLCBpdHNlbGYtPmFzY2VudCwgaXRzZWxmLT5kZXNjZW50LAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPndpZE1heCwgaXRzZWxmLT5sZWFkaW5nKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcnJvcjsKQEAgLTc3LDEyNjAgKzc3LDEyNjAgQEAKICNkZWZpbmUgR3JhZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZHcmFmUG9ydF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZHcmFmUG9ydF9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgR3JhZlBvcnRPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlHcmFmUHRyIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgR3JhZlB0ciBvYl9pdHNlbGY7CiB9IEdyYWZQb3J0T2JqZWN0OwogCiBQeU9iamVjdCAqR3JhZk9ial9OZXcoR3JhZlB0ciBpdHNlbGYpCiB7Ci0JR3JhZlBvcnRPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhHcmFmUG9ydE9iamVjdCwgJkdyYWZQb3J0X1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBHcmFmUG9ydE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKEdyYWZQb3J0T2JqZWN0LCAmR3JhZlBvcnRfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgR3JhZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBHcmFmUHRyICpwX2l0c2VsZikKIHsKICNpZiAxCi0JewotCQlXaW5kb3dSZWYgd2luOwotCQlpZiAoV2luT2JqX0NvbnZlcnQodiwgJndpbikgJiYgdikgewotCQkJKnBfaXRzZWxmID0gKEdyYWZQdHIpR2V0V2luZG93UG9ydCh3aW4pOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJUHlFcnJfQ2xlYXIoKTsKLQl9CisgICAgeworICAgICAgICBXaW5kb3dSZWYgd2luOworICAgICAgICBpZiAoV2luT2JqX0NvbnZlcnQodiwgJndpbikgJiYgdikgeworICAgICAgICAgICAgKnBfaXRzZWxmID0gKEdyYWZQdHIpR2V0V2luZG93UG9ydCh3aW4pOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CiAjZWxzZQotCWlmIChEbGdPYmpfQ2hlY2sodikpIHsKLQkJRGlhbG9nUmVmIGRsZyA9IChEaWFsb2dSZWYpKChHcmFmUG9ydE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JCSpwX2l0c2VsZiA9IChHcmFmUHRyKUdldFdpbmRvd1BvcnQoR2V0RGlhbG9nV2luZG93KGRsZykpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFdpbk9ial9DaGVjayh2KSkgewotCQlXaW5kb3dSZWYgd2luID0gKFdpbmRvd1JlZikoKEdyYWZQb3J0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQkJKnBfaXRzZWxmID0gKEdyYWZQdHIpR2V0V2luZG93UG9ydCh3aW4pOwotCQlyZXR1cm4gMTsKLQl9CisgICAgaWYgKERsZ09ial9DaGVjayh2KSkgeworICAgICAgICBEaWFsb2dSZWYgZGxnID0gKERpYWxvZ1JlZikoKEdyYWZQb3J0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgKnBfaXRzZWxmID0gKEdyYWZQdHIpR2V0V2luZG93UG9ydChHZXREaWFsb2dXaW5kb3coZGxnKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoV2luT2JqX0NoZWNrKHYpKSB7CisgICAgICAgIFdpbmRvd1JlZiB3aW4gPSAoV2luZG93UmVmKSgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgICAgICAqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KICNlbmRpZgotCWlmICghR3JhZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJHcmFmUG9ydCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChHcmFmUG9ydE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFHcmFmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkdyYWZQb3J0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEdyYWZQb3J0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgR3JhZk9ial9kZWFsbG9jKEdyYWZQb3J0T2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX01hY1NldFBvcnQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgTWFjU2V0UG9ydAotCVB5TWFjX1BSRUNIRUNLKE1hY1NldFBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1NldFBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU1hY1NldFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNTZXRQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FEU3dhcFBvcnQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNHcmFmUHRyIG91dE9sZFBvcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENHcmFmUHRyIG91dE9sZFBvcnQ7CiAjaWZuZGVmIFFEU3dhcFBvcnQKLQlQeU1hY19QUkVDSEVDSyhRRFN3YXBQb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRRFN3YXBQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRRFN3YXBQb3J0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmb3V0T2xkUG9ydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBvdXRPbGRQb3J0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUURTd2FwUG9ydChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgJm91dE9sZFBvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgb3V0T2xkUG9ydCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Jc1ZhbGlkUG9ydChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc1ZhbGlkUG9ydAotCVB5TWFjX1BSRUNIRUNLKElzVmFsaWRQb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1ZhbGlkUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNWYWxpZFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVmFsaWRQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFBpeE1hcChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0UG9ydFBpeE1hcAotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRQaXhNYXApOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRQaXhNYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRQaXhNYXAoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0UGl4TWFwKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRCaXRNYXBGb3JDb3B5Qml0cyhHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY29uc3QgQml0TWFwICogX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjb25zdCBCaXRNYXAgKiBfcnY7CiAjaWZuZGVmIEdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cwotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBCTU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRCb3VuZHMoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByZWN0OwogI2lmbmRlZiBHZXRQb3J0Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgJnJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICZyZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEZvcmVDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgZm9yZUNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBmb3JlQ29sb3I7CiAjaWZuZGVmIEdldFBvcnRGb3JlQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0Rm9yZUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0Rm9yZUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3J0Rm9yZUNvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmZm9yZUNvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmZvcmVDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRGb3JlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZmb3JlQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmZm9yZUNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRCYWNrQ29sb3IoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGJhY2tDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3IgYmFja0NvbG9yOwogI2lmbmRlZiBHZXRQb3J0QmFja0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEJhY2tDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEJhY2tDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydEJhY2tDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgJmJhY2tDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZiYWNrQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRQb3J0QmFja0NvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAmYmFja0NvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmJhY2tDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0T3BDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3Igb3BDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3Igb3BDb2xvcjsKICNpZm5kZWYgR2V0UG9ydE9wQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0T3BDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydE9wQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvcnRPcENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgJm9wQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3BDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRPcENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3BDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0SGlsaXRlQ29sb3IoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGhpbGl0ZUNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBoaWxpdGVDb2xvcjsKICNpZm5kZWYgR2V0UG9ydEhpbGl0ZUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEhpbGl0ZUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0SGlsaXRlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvcnRIaWxpdGVDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmaGlsaXRlQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmaGlsaXRlQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRQb3J0SGlsaXRlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmhpbGl0ZUNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRUZXh0Rm9udChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFBvcnRUZXh0Rm9udAotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRUZXh0Rm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRGb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0VGV4dEZvbnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRUZXh0Rm9udChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRUZXh0RmFjZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3R5bGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHlsZSBfcnY7CiAjaWZuZGVmIEdldFBvcnRUZXh0RmFjZQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRUZXh0RmFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRGYWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0VGV4dEZhY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRUZXh0RmFjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRUZXh0TW9kZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFBvcnRUZXh0TW9kZQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRUZXh0TW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0VGV4dE1vZGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRUZXh0TW9kZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRUZXh0U2l6ZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFBvcnRUZXh0U2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRUZXh0U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0VGV4dFNpemUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRUZXh0U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRDaEV4dHJhKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0UG9ydENoRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0Q2hFeHRyYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydENoRXh0cmEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRDaEV4dHJhKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0Q2hFeHRyYShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRGcmFjSFBlbkxvY2F0aW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRGcmFjSFBlbkxvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRTcEV4dHJhKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKICNpZm5kZWYgR2V0UG9ydFNwRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0U3BFeHRyYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFNwRXh0cmEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRTcEV4dHJhKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFNwRXh0cmEoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFBlblZpc2liaWxpdHkoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRQb3J0UGVuVmlzaWJpbGl0eQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5WaXNpYmlsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0UGVuVmlzaWJpbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydFBlblZpc2liaWxpdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRQZW5WaXNpYmlsaXR5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFZpc2libGVSZWdpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7Ci0JUmduSGFuZGxlIHZpc1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKKyAgICBSZ25IYW5kbGUgdmlzUmduOwogI2lmbmRlZiBHZXRQb3J0VmlzaWJsZVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRWaXNpYmxlUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VmlzaWJsZVJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmlzUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydFZpc2libGVSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmlzUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFZpc2libGVSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRDbGlwUmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVJnbkhhbmRsZSBjbGlwUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OworICAgIFJnbkhhbmRsZSBjbGlwUmduOwogI2lmbmRlZiBHZXRQb3J0Q2xpcFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRDbGlwUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0Q2xpcFJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJnbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRDbGlwUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydENsaXBSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0QmFja1BpeFBhdChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIF9ydjsKLQlQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBfcnY7CisgICAgUGl4UGF0SGFuZGxlIGJhY2tQYXR0ZXJuOwogI2lmbmRlZiBHZXRQb3J0QmFja1BpeFBhdAotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRCYWNrUGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0QmFja1BpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYmFja1BhdHRlcm4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0QmFja1BpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXR0ZXJuKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmJhY2tQYXR0ZXJuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydEJhY2tQaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0dGVybik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFBlblBpeFBhdChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIF9ydjsKLQlQaXhQYXRIYW5kbGUgcGVuUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIF9ydjsKKyAgICBQaXhQYXRIYW5kbGUgcGVuUGF0dGVybjsKICNpZm5kZWYgR2V0UG9ydFBlblBpeFBhdAotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5QaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5QaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBlblBhdHRlcm4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0UGVuUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBwZW5QYXR0ZXJuKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBlblBhdHRlcm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0UGVuUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5QYXR0ZXJuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0RmlsbFBpeFBhdChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIF9ydjsKLQlQaXhQYXRIYW5kbGUgZmlsbFBhdHRlcm47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBfcnY7CisgICAgUGl4UGF0SGFuZGxlIGZpbGxQYXR0ZXJuOwogI2lmbmRlZiBHZXRQb3J0RmlsbFBpeFBhdAotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRGaWxsUGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0RmlsbFBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZmlsbFBhdHRlcm4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0RmlsbFBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxQYXR0ZXJuKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmZpbGxQYXR0ZXJuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydEZpbGxQaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsUGF0dGVybik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFBlblNpemUoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHBlblNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHBlblNpemU7CiAjaWZuZGVmIEdldFBvcnRQZW5TaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5TaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5TaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydFBlblNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmcGVuU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwZW5TaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcGVuU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRQZW5TaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgJnBlblNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcGVuU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGVuTW9kZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIF9ydjsKICNpZm5kZWYgR2V0UG9ydFBlbk1vZGUKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0UGVuTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlbk1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRQZW5Nb2RlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0UGVuTW9kZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRQZW5Mb2NhdGlvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcGVuTG9jYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHBlbkxvY2F0aW9uOwogI2lmbmRlZiBHZXRQb3J0UGVuTG9jYXRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0UGVuTG9jYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5Mb2NhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcGVuTG9jYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3J0UGVuTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgJnBlbkxvY2F0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBlbkxvY2F0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcGVuTG9jYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRQb3J0UGVuTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBlbkxvY2F0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBlbkxvY2F0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc1BvcnRSZWdpb25CZWluZ0RlZmluZWQKLQlQeU1hY19QUkVDSEVDSyhJc1BvcnRSZWdpb25CZWluZ0RlZmluZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1BvcnRSZWdpb25CZWluZ0RlZmluZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Jc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQKLQlQeU1hY19QUkVDSEVDSyhJc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfSXNQb3J0UG9seUJlaW5nRGVmaW5lZChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc1BvcnRQb2x5QmVpbmdEZWZpbmVkCi0JUHlNYWNfUFJFQ0hFQ0soSXNQb3J0UG9seUJlaW5nRGVmaW5lZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNQb3J0UG9seUJlaW5nRGVmaW5lZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNQb3J0UG9seUJlaW5nRGVmaW5lZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNQb3J0UG9seUJlaW5nRGVmaW5lZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzUG9ydE9mZnNjcmVlbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc1BvcnRPZmZzY3JlZW4KLQlQeU1hY19QUkVDSEVDSyhJc1BvcnRPZmZzY3JlZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKElzUG9ydE9mZnNjcmVlbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNQb3J0T2Zmc2NyZWVuKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1BvcnRPZmZzY3JlZW4oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Jc1BvcnRDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc1BvcnRDb2xvcgotCVB5TWFjX1BSRUNIRUNLKElzUG9ydENvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1BvcnRDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNQb3J0Q29sb3IoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydENvbG9yKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydFZpc2libGVSZWdpb25FbXB0eQotCVB5TWFjX1BSRUNIRUNLKElzUG9ydFZpc2libGVSZWdpb25FbXB0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydFZpc2libGVSZWdpb25FbXB0eShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzUG9ydENsaXBSZWdpb25FbXB0eShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc1BvcnRDbGlwUmVnaW9uRW1wdHkKLQlQeU1hY19QUkVDSEVDSyhJc1BvcnRDbGlwUmVnaW9uRW1wdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKElzUG9ydENsaXBSZWdpb25FbXB0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNQb3J0Q2xpcFJlZ2lvbkVtcHR5KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1BvcnRDbGlwUmVnaW9uRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgaW9SZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBpb1JlZ2lvbjsKICNpZm5kZWYgU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFNlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlvUmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9SZWdpb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW9SZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb1JlZ2lvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIGlvUmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgaW9SZWdpb247CiAjaWZuZGVmIFNlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhTZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpb1JlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCVNlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvUmVnaW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlvUmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9SZWdpb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1N3YXBQb3J0UGljU2F2ZUhhbmRsZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlIYW5kbGUgaW5QaWNTYXZlSGRsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OworICAgIEhhbmRsZSBpblBpY1NhdmVIZGw7CiAjaWZuZGVmIFN3YXBQb3J0UGljU2F2ZUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFN3YXBQb3J0UGljU2F2ZUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3dhcFBvcnRQaWNTYXZlSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpblBpY1NhdmVIZGwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTd2FwUG9ydFBpY1NhdmVIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QaWNTYXZlSGRsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUGljU2F2ZUhkbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFN3YXBQb3J0UGljU2F2ZUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBpY1NhdmVIZGwpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1N3YXBQb3J0UG9seVNhdmVIYW5kbGUoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JSGFuZGxlIGluUG9seVNhdmVIZGw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgSGFuZGxlIGluUG9seVNhdmVIZGw7CiAjaWZuZGVmIFN3YXBQb3J0UG9seVNhdmVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTd2FwUG9ydFBvbHlTYXZlSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTd2FwUG9ydFBvbHlTYXZlSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpblBvbHlTYXZlSGRsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qb2x5U2F2ZUhkbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpblBvbHlTYXZlSGRsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qb2x5U2F2ZUhkbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCUhhbmRsZSBpblJlZ2lvblNhdmVIZGw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgSGFuZGxlIGluUmVnaW9uU2F2ZUhkbDsKICNpZm5kZWYgU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTd2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUmVnaW9uU2F2ZUhkbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvblNhdmVIZGwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5SZWdpb25TYXZlSGRsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uU2F2ZUhkbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydEJvdW5kcyhHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIFNldFBvcnRCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0Qm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAmcmVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAmcmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydE9wQ29sb3IoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIG9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIG9wQ29sb3I7CiAjaWZuZGVmIFNldFBvcnRPcENvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydE9wQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRPcENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm9wQ29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0T3BDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICZvcENvbG9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmb3BDb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRPcENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRUZXh0Rm9udChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgdHhGb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB0eEZvbnQ7CiAjaWZuZGVmIFNldFBvcnRUZXh0Rm9udAotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRUZXh0Rm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFRleHRGb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHhGb250KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFRleHRGb250KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIHR4Rm9udCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHhGb250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFRleHRGb250KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHR4Rm9udCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFRleHRTaXplKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB0eFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHR4U2l6ZTsKICNpZm5kZWYgU2V0UG9ydFRleHRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFRleHRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0eFNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0VGV4dFNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgdHhTaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0VGV4dFNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdHhTaXplKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0VGV4dEZhY2UoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0eWxlUGFyYW1ldGVyIGZhY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0eWxlUGFyYW1ldGVyIGZhY2U7CiAjaWZuZGVmIFNldFBvcnRUZXh0RmFjZQotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRUZXh0RmFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFRleHRGYWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmFjZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRUZXh0RmFjZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBmYWNlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFRleHRGYWNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIGZhY2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRUZXh0TW9kZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbW9kZTsKICNpZm5kZWYgU2V0UG9ydFRleHRNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFRleHRNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dE1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFRleHRNb2RlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIG1vZGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0VGV4dE1vZGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgbW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFZpc2libGVSZWdpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSB2aXNSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSB2aXNSZ247CiAjaWZuZGVmIFNldFBvcnRWaXNpYmxlUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFZpc2libGVSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRWaXNpYmxlUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2aXNSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHZpc1Jnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2aXNSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1Jnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydENsaXBSZWdpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBjbGlwUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgY2xpcFJnbjsKICNpZm5kZWYgU2V0UG9ydENsaXBSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0Q2xpcFJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydENsaXBSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0Q2xpcFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGNsaXBSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRDbGlwUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgY2xpcFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFBlblBpeFBhdChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIHBlblBhdHRlcm47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuOwogI2lmbmRlZiBTZXRQb3J0UGVuUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBlblBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBlblBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGVuUGF0dGVybikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRQZW5QaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGVuUGF0dGVybikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRQZW5QaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRGaWxsUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgcGVuUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIHBlblBhdHRlcm47CiAjaWZuZGVmIFNldFBvcnRGaWxsUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEZpbGxQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRGaWxsUGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwZW5QYXR0ZXJuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydEZpbGxQaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBwZW5QYXR0ZXJuKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBlblBhdHRlcm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0RmlsbFBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRCYWNrUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBiYWNrUGF0dGVybjsKICNpZm5kZWYgU2V0UG9ydEJhY2tQaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0QmFja1BpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEJhY2tQaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmJhY2tQYXR0ZXJuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydEJhY2tQaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBiYWNrUGF0dGVybik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZiYWNrUGF0dGVybikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRCYWNrUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdHRlcm4pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRQZW5TaXplKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwZW5TaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwZW5TaXplOwogI2lmbmRlZiBTZXRQb3J0UGVuU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRQZW5TaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0UGVuU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcGVuU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRQZW5TaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgcGVuU2l6ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5TaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFBlblNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBwZW5TaXplKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0UGVuTW9kZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIHBlbk1vZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBwZW5Nb2RlOwogI2lmbmRlZiBTZXRQb3J0UGVuTW9kZQotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRQZW5Nb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0UGVuTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlbk1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0UGVuTW9kZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHBlbk1vZGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlbk1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0UGVuTW9kZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIHBlbk1vZGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRGcmFjSFBlbkxvY2F0aW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBwbkxvY0hGcmFjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBwbkxvY0hGcmFjOwogI2lmbmRlZiBTZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRGcmFjSFBlbkxvY2F0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBuTG9jSEZyYWMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHBuTG9jSEZyYWMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBuTG9jSEZyYWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuTG9jSEZyYWMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0Rpc3Bvc2VQb3J0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERpc3Bvc2VQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FETG9jYWxUb0dsb2JhbFBvaW50KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwb2ludDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcG9pbnQ7CiAjaWZuZGVmIFFETG9jYWxUb0dsb2JhbFBvaW50Ci0JUHlNYWNfUFJFQ0hFQ0soUURMb2NhbFRvR2xvYmFsUG9pbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFETG9jYWxUb0dsb2JhbFBvaW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwb2ludCkpCi0JCXJldHVybiBOVUxMOwotCVFETG9jYWxUb0dsb2JhbFBvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJnBvaW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBvaW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBRRExvY2FsVG9HbG9iYWxQb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwb2ludCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RREdsb2JhbFRvTG9jYWxQb2ludChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcG9pbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHBvaW50OwogI2lmbmRlZiBRREdsb2JhbFRvTG9jYWxQb2ludAotCVB5TWFjX1BSRUNIRUNLKFFER2xvYmFsVG9Mb2NhbFBvaW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRREdsb2JhbFRvTG9jYWxQb2ludCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcG9pbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlRREdsb2JhbFRvTG9jYWxQb2ludChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICZwb2ludCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwb2ludCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnBvaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUURHbG9iYWxUb0xvY2FsUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcG9pbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcG9pbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUmVjdChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBRRExvY2FsVG9HbG9iYWxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soUURMb2NhbFRvR2xvYmFsUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURMb2NhbFRvR2xvYmFsUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUURMb2NhbFRvR2xvYmFsUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBRRExvY2FsVG9HbG9iYWxSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RREdsb2JhbFRvTG9jYWxSZWN0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIFFER2xvYmFsVG9Mb2NhbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhRREdsb2JhbFRvTG9jYWxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRREdsb2JhbFRvTG9jYWxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlRREdsb2JhbFRvTG9jYWxSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFFER2xvYmFsVG9Mb2NhbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FETG9jYWxUb0dsb2JhbFJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKLQlSZ25IYW5kbGUgcmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OworICAgIFJnbkhhbmRsZSByZWdpb247CiAjaWZuZGVmIFFETG9jYWxUb0dsb2JhbFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFFETG9jYWxUb0dsb2JhbFJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURMb2NhbFRvR2xvYmFsUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRRExvY2FsVG9HbG9iYWxSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFETG9jYWxUb0dsb2JhbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKLQlSZ25IYW5kbGUgcmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OworICAgIFJnbkhhbmRsZSByZWdpb247CiAjaWZuZGVmIFFER2xvYmFsVG9Mb2NhbFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFFER2xvYmFsVG9Mb2NhbFJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURHbG9iYWxUb0xvY2FsUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRREdsb2JhbFRvTG9jYWxSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFER2xvYmFsVG9Mb2NhbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FESXNQb3J0QnVmZmVyZWQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgUURJc1BvcnRCdWZmZXJlZAotCVB5TWFjX1BSRUNIRUNLKFFESXNQb3J0QnVmZmVyZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFESXNQb3J0QnVmZmVyZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFESXNQb3J0QnVmZmVyZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFESXNQb3J0QnVmZmVyZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RRElzUG9ydEJ1ZmZlckRpcnR5KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFFESXNQb3J0QnVmZmVyRGlydHkKLQlQeU1hY19QUkVDSEVDSyhRRElzUG9ydEJ1ZmZlckRpcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRRElzUG9ydEJ1ZmZlckRpcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRRElzUG9ydEJ1ZmZlckRpcnR5KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRRElzUG9ydEJ1ZmZlckRpcnR5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURGbHVzaFBvcnRCdWZmZXIoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZWdpb247CiAjaWZuZGVmIFFERmx1c2hQb3J0QnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soUURGbHVzaFBvcnRCdWZmZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFFERmx1c2hQb3J0QnVmZmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlRREZsdXNoUG9ydEJ1ZmZlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHJlZ2lvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBRREZsdXNoUG9ydEJ1ZmZlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURHZXREaXJ0eVJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIFFER2V0RGlydHlSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhRREdldERpcnR5UmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRREdldERpcnR5UmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUURHZXREaXJ0eVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRREdldERpcnR5UmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FEU2V0RGlydHlSZWdpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBRRFNldERpcnR5UmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soUURTZXREaXJ0eVJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURTZXREaXJ0eVJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFEU2V0RGlydHlSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICByZ24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUURTZXREaXJ0eVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBHcmFmT2JqX21ldGhvZHNbXSA9IHsKLQl7Ik1hY1NldFBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9NYWNTZXRQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJRRFN3YXBQb3J0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURTd2FwUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIENHcmFmUHRyIG91dE9sZFBvcnQpIil9LAotCXsiSXNWYWxpZFBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1ZhbGlkUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0UG9ydFBpeE1hcCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQaXhNYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAotCXsiR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChjb25zdCBCaXRNYXAgKiBfcnYpIil9LAotCXsiR2V0UG9ydEJvdW5kcyIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgcmVjdCkiKX0sCi0JeyJHZXRQb3J0Rm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEZvcmVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgZm9yZUNvbG9yKSIpfSwKLQl7IkdldFBvcnRCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0QmFja0NvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBiYWNrQ29sb3IpIil9LAotCXsiR2V0UG9ydE9wQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0T3BDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3Igb3BDb2xvcikiKX0sCi0JeyJHZXRQb3J0SGlsaXRlQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0SGlsaXRlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGhpbGl0ZUNvbG9yKSIpfSwKLQl7IkdldFBvcnRUZXh0Rm9udCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0Rm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFBvcnRUZXh0RmFjZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0RmFjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU3R5bGUgX3J2KSIpfSwKLQl7IkdldFBvcnRUZXh0TW9kZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0TW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFBvcnRUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFBvcnRDaEV4dHJhIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydENoRXh0cmEsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRGcmFjSFBlbkxvY2F0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UG9ydFNwRXh0cmEiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0U3BFeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IkdldFBvcnRQZW5WaXNpYmlsaXR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBlblZpc2liaWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRQb3J0VmlzaWJsZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRWaXNpYmxlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdmlzUmduKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQb3J0Q2xpcFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRDbGlwUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgY2xpcFJnbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiR2V0UG9ydEJhY2tQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0QmFja1BpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIGJhY2tQYXR0ZXJuKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQb3J0UGVuUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBlblBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBlblBhdHRlcm4pIC0+IChQaXhQYXRIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFBvcnRGaWxsUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEZpbGxQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBmaWxsUGF0dGVybikgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAotCXsiR2V0UG9ydFBlblNpemUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcGVuU2l6ZSkgLT4gKFBvaW50IHBlblNpemUpIil9LAotCXsiR2V0UG9ydFBlbk1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJHZXRQb3J0UGVuTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHBlbkxvY2F0aW9uKSAtPiAoUG9pbnQgcGVuTG9jYXRpb24pIil9LAotCXsiSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0UGljdHVyZUJlaW5nRGVmaW5lZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSXNQb3J0UG9seUJlaW5nRGVmaW5lZCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydFBvbHlCZWluZ0RlZmluZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzUG9ydE9mZnNjcmVlbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydE9mZnNjcmVlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSXNQb3J0Q29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1BvcnRDbGlwUmVnaW9uRW1wdHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRDbGlwUmVnaW9uRW1wdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgaW9SZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJTZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGlvUmVnaW9uKSAtPiBOb25lIil9LAotCXsiU3dhcFBvcnRQaWNTYXZlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU3dhcFBvcnRQaWNTYXZlSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaW5QaWNTYXZlSGRsKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJTd2FwUG9ydFBvbHlTYXZlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGluUG9seVNhdmVIZGwpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlN3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1N3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGluUmVnaW9uU2F2ZUhkbCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiU2V0UG9ydEJvdW5kcyIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcmVjdCkgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRPcENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydE9wQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJHQkNvbG9yIG9wQ29sb3IpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0VGV4dEZvbnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VGV4dEZvbnQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHR4Rm9udCkgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRUZXh0U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdHhTaXplKSAtPiBOb25lIil9LAotCXsiU2V0UG9ydFRleHRGYWNlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRGYWNlLCAxLAotCSBQeURvY19TVFIoIihTdHlsZVBhcmFtZXRlciBmYWNlKSAtPiBOb25lIil9LAotCXsiU2V0UG9ydFRleHRNb2RlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRNb2RlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtb2RlKSAtPiBOb25lIil9LAotCXsiU2V0UG9ydFZpc2libGVSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VmlzaWJsZVJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHZpc1JnbikgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRDbGlwUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydENsaXBSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbGlwUmduKSAtPiBOb25lIil9LAotCXsiU2V0UG9ydFBlblBpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRQZW5QaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuKSAtPiBOb25lIil9LAotCXsiU2V0UG9ydEZpbGxQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0RmlsbFBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBlblBhdHRlcm4pIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0QmFja1BpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRCYWNrUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm4pIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0UGVuU2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRQZW5TaXplLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwZW5TaXplKSAtPiBOb25lIil9LAotCXsiU2V0UG9ydFBlbk1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0UGVuTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDMyIHBlbk1vZGUpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRGcmFjSFBlbkxvY2F0aW9uLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBwbkxvY0hGcmFjKSAtPiBOb25lIil9LAotCXsiRGlzcG9zZVBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9EaXNwb3NlUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUURMb2NhbFRvR2xvYmFsUG9pbnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRExvY2FsVG9HbG9iYWxQb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcG9pbnQpIC0+IChQb2ludCBwb2ludCkiKX0sCi0JeyJRREdsb2JhbFRvTG9jYWxQb2ludCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFBvaW50LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwb2ludCkgLT4gKFBvaW50IHBvaW50KSIpfSwKLQl7IlFETG9jYWxUb0dsb2JhbFJlY3QiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRExvY2FsVG9HbG9iYWxSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCi0JeyJRREdsb2JhbFRvTG9jYWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURHbG9iYWxUb0xvY2FsUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiUURMb2NhbFRvR2xvYmFsUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJRREdsb2JhbFRvTG9jYWxSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdsb2JhbFRvTG9jYWxSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IlFESXNQb3J0QnVmZmVyZWQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRElzUG9ydEJ1ZmZlcmVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJRRElzUG9ydEJ1ZmZlckRpcnR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURJc1BvcnRCdWZmZXJEaXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiUURGbHVzaFBvcnRCdWZmZXIiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREZsdXNoUG9ydEJ1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKLQl7IlFER2V0RGlydHlSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdldERpcnR5UmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiUURTZXREaXJ0eVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FEU2V0RGlydHlSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJNYWNTZXRQb3J0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfTWFjU2V0UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUURTd2FwUG9ydCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FEU3dhcFBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2LCBDR3JhZlB0ciBvdXRPbGRQb3J0KSIpfSwKKyAgICB7IklzVmFsaWRQb3J0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNWYWxpZFBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldFBvcnRQaXhNYXAiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGl4TWFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQaXhNYXBIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cyIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRCaXRNYXBGb3JDb3B5Qml0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoY29uc3QgQml0TWFwICogX3J2KSIpfSwKKyAgICB7IkdldFBvcnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAorICAgIHsiR2V0UG9ydEZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRGb3JlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGZvcmVDb2xvcikiKX0sCisgICAgeyJHZXRQb3J0QmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEJhY2tDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgYmFja0NvbG9yKSIpfSwKKyAgICB7IkdldFBvcnRPcENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydE9wQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIG9wQ29sb3IpIil9LAorICAgIHsiR2V0UG9ydEhpbGl0ZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEhpbGl0ZUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBoaWxpdGVDb2xvcikiKX0sCisgICAgeyJHZXRQb3J0VGV4dEZvbnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0VGV4dEZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRQb3J0VGV4dEZhY2UiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0VGV4dEZhY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFN0eWxlIF9ydikiKX0sCisgICAgeyJHZXRQb3J0VGV4dE1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0VGV4dE1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRQb3J0VGV4dFNpemUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0VGV4dFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRQb3J0Q2hFeHRyYSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRDaEV4dHJhLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRTcEV4dHJhIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFNwRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJHZXRQb3J0UGVuVmlzaWJpbGl0eSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQZW5WaXNpYmlsaXR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0UG9ydFZpc2libGVSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0VmlzaWJsZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHZpc1JnbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UG9ydENsaXBSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0Q2xpcFJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGNsaXBSZ24pIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRCYWNrUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEJhY2tQaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBiYWNrUGF0dGVybikgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UG9ydFBlblBpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQZW5QaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRQb3J0RmlsbFBpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRGaWxsUGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgZmlsbFBhdHRlcm4pIC0+IChQaXhQYXRIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRQZW5TaXplIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBlblNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHBlblNpemUpIC0+IChQb2ludCBwZW5TaXplKSIpfSwKKyAgICB7IkdldFBvcnRQZW5Nb2RlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBlbk1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiR2V0UG9ydFBlbkxvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBlbkxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwZW5Mb2NhdGlvbikgLT4gKFBvaW50IHBlbkxvY2F0aW9uKSIpfSwKKyAgICB7IklzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNQb3J0UGljdHVyZUJlaW5nRGVmaW5lZCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IklzUG9ydFBvbHlCZWluZ0RlZmluZWQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRQb2x5QmVpbmdEZWZpbmVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJc1BvcnRPZmZzY3JlZW4iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRPZmZzY3JlZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IklzUG9ydENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0Q29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IklzUG9ydFZpc2libGVSZWdpb25FbXB0eSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydFZpc2libGVSZWdpb25FbXB0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNQb3J0Q2xpcFJlZ2lvbkVtcHR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0Q2xpcFJlZ2lvbkVtcHR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGlvUmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpb1JlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IlN3YXBQb3J0UGljU2F2ZUhhbmRsZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1N3YXBQb3J0UGljU2F2ZUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGluUGljU2F2ZUhkbCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1N3YXBQb3J0UG9seVNhdmVIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBpblBvbHlTYXZlSGRsKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJTd2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Td2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBpblJlZ2lvblNhdmVIZGwpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldFBvcnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0T3BDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRPcENvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihSR0JDb2xvciBvcENvbG9yKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFRleHRGb250IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRGb250LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB0eEZvbnQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0VGV4dFNpemUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VGV4dFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHR4U2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRUZXh0RmFjZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRUZXh0RmFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3R5bGVQYXJhbWV0ZXIgZmFjZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRUZXh0TW9kZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRUZXh0TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRWaXNpYmxlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFZpc2libGVSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB2aXNSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0Q2xpcFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRDbGlwUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgY2xpcFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRQZW5QaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0UGVuUGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcGVuUGF0dGVybikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRGaWxsUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydEZpbGxQaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydEJhY2tQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0QmFja1BpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIGJhY2tQYXR0ZXJuKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFBlblNpemUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0UGVuU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcGVuU2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRQZW5Nb2RlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFBlbk1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiBwZW5Nb2RlKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydEZyYWNIUGVuTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcG5Mb2NIRnJhYykgLT4gTm9uZSIpfSwKKyAgICB7IkRpc3Bvc2VQb3J0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfRGlzcG9zZVBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlFETG9jYWxUb0dsb2JhbFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUG9pbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHBvaW50KSAtPiAoUG9pbnQgcG9pbnQpIil9LAorICAgIHsiUURHbG9iYWxUb0xvY2FsUG9pbnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdsb2JhbFRvTG9jYWxQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcG9pbnQpIC0+IChQb2ludCBwb2ludCkiKX0sCisgICAgeyJRRExvY2FsVG9HbG9iYWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3VuZHMpIil9LAorICAgIHsiUURHbG9iYWxUb0xvY2FsUmVjdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKKyAgICB7IlFETG9jYWxUb0dsb2JhbFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FETG9jYWxUb0dsb2JhbFJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiUURHbG9iYWxUb0xvY2FsUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURHbG9iYWxUb0xvY2FsUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJRRElzUG9ydEJ1ZmZlcmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURJc1BvcnRCdWZmZXJlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUURJc1BvcnRCdWZmZXJEaXJ0eSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FESXNQb3J0QnVmZmVyRGlydHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlFERmx1c2hQb3J0QnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURGbHVzaFBvcnRCdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IE5vbmUiKX0sCisgICAgeyJRREdldERpcnR5UmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURHZXREaXJ0eVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7IlFEU2V0RGlydHlSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRFNldERpcnR5UmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX2dldF92aXNSZ24oR3JhZlBvcnRPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUmduSGFuZGxlIGg9TmV3UmduKCk7IC8qIFhYWFggd3JvbmcgZGlzcG9zZSByb3V0aW5lICovCi0JICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlHZXRQb3J0VmlzaWJsZVJlZ2lvbihzZWxmLT5vYl9pdHNlbGYsIGgpKTsKLQkgICAgICAgICAgICAKKyAgICBSZ25IYW5kbGUgaD1OZXdSZ24oKTsgLyogWFhYWCB3cm9uZyBkaXNwb3NlIHJvdXRpbmUgKi8KKyAgICAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFJlc09ial9OZXcsIChIYW5kbGUpR2V0UG9ydFZpc2libGVSZWdpb24oc2VsZi0+b2JfaXRzZWxmLCBoKSk7CisKIH0KIAogI2RlZmluZSBHcmFmT2JqX3NldF92aXNSZ24gTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfZ2V0X2NsaXBSZ24oR3JhZlBvcnRPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUmduSGFuZGxlIGg9TmV3UmduKCk7IC8qIFhYWFggd3JvbmcgZGlzcG9zZSByb3V0aW5lICovCi0JICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlHZXRQb3J0Q2xpcFJlZ2lvbihzZWxmLT5vYl9pdHNlbGYsIGgpKTsKLQkgICAgICAgICAgICAKKyAgICBSZ25IYW5kbGUgaD1OZXdSZ24oKTsgLyogWFhYWCB3cm9uZyBkaXNwb3NlIHJvdXRpbmUgKi8KKyAgICAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFJlc09ial9OZXcsIChIYW5kbGUpR2V0UG9ydENsaXBSZWdpb24oc2VsZi0+b2JfaXRzZWxmLCBoKSk7CisKIH0KIAogI2RlZmluZSBHcmFmT2JqX3NldF9jbGlwUmduIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIEdyYWZPYmpfZ2V0c2V0bGlzdFtdID0gewotCXsidmlzUmduIiwgKGdldHRlcilHcmFmT2JqX2dldF92aXNSZ24sIChzZXR0ZXIpR3JhZk9ial9zZXRfdmlzUmduLCAiQ29udmVuaWVuY2UgYXR0cmlidXRlOiByZXR1cm4gYSBjb3B5IG9mIHRoZSB2aXNpYmxlIHJlZ2lvbiJ9LAotCXsiY2xpcFJnbiIsIChnZXR0ZXIpR3JhZk9ial9nZXRfY2xpcFJnbiwgKHNldHRlcilHcmFmT2JqX3NldF9jbGlwUmduLCAiQ29udmVuaWVuY2UgYXR0cmlidXRlOiByZXR1cm4gYSBjb3B5IG9mIHRoZSBjbGlwcGluZyByZWdpb24ifSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJ2aXNSZ24iLCAoZ2V0dGVyKUdyYWZPYmpfZ2V0X3Zpc1JnbiwgKHNldHRlcilHcmFmT2JqX3NldF92aXNSZ24sICJDb252ZW5pZW5jZSBhdHRyaWJ1dGU6IHJldHVybiBhIGNvcHkgb2YgdGhlIHZpc2libGUgcmVnaW9uIn0sCisgICAgeyJjbGlwUmduIiwgKGdldHRlcilHcmFmT2JqX2dldF9jbGlwUmduLCAoc2V0dGVyKUdyYWZPYmpfc2V0X2NsaXBSZ24sICJDb252ZW5pZW5jZSBhdHRyaWJ1dGU6IHJldHVybiBhIGNvcHkgb2YgdGhlIGNsaXBwaW5nIHJlZ2lvbiJ9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtMTM0NSw2MSArMTM0NSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUdyYWZQdHIgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBHcmFmUHRyIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEdyYWZPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChHcmFmUG9ydE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBHcmFmT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoR3JhZlBvcnRPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgR3JhZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBHcmFmUG9ydF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RZC5HcmFmUG9ydCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEdyYWZQb3J0T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgR3JhZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBHcmFmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBHcmFmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBHcmFmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUdyYWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JR3JhZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlHcmFmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlHcmFmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUdyYWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlHcmFmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUWQuR3JhZlBvcnQiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihHcmFmUG9ydE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEdyYWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgR3JhZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgR3JhZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgR3JhZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBHcmFmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEdyYWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgR3JhZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgR3JhZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBHcmFmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgR3JhZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgR3JhZlBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE0MTIsMTI0ICsxNDEyLDEyNCBAQAogI2RlZmluZSBCTU9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZCaXRNYXBfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQml0TWFwX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBCaXRNYXBPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlCaXRNYXBQdHIgb2JfaXRzZWxmOwotCVB5T2JqZWN0ICpyZWZlcnJlZF9vYmplY3Q7Ci0JQml0TWFwICpyZWZlcnJlZF9iaXRtYXA7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEJpdE1hcFB0ciBvYl9pdHNlbGY7CisgICAgUHlPYmplY3QgKnJlZmVycmVkX29iamVjdDsKKyAgICBCaXRNYXAgKnJlZmVycmVkX2JpdG1hcDsKIH0gQml0TWFwT2JqZWN0OwogCiBQeU9iamVjdCAqQk1PYmpfTmV3KEJpdE1hcFB0ciBpdHNlbGYpCiB7Ci0JQml0TWFwT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JaXQgPSBQeU9iamVjdF9ORVcoQml0TWFwT2JqZWN0LCAmQml0TWFwX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5yZWZlcnJlZF9vYmplY3QgPSBOVUxMOwotCWl0LT5yZWZlcnJlZF9iaXRtYXAgPSBOVUxMOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBCaXRNYXBPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhCaXRNYXBPYmplY3QsICZCaXRNYXBfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPnJlZmVycmVkX29iamVjdCA9IE5VTEw7CisgICAgaXQtPnJlZmVycmVkX2JpdG1hcCA9IE5VTEw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQk1PYmpfQ29udmVydChQeU9iamVjdCAqdiwgQml0TWFwUHRyICpwX2l0c2VsZikKIHsKLQlpZiAoIUJNT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkJpdE1hcCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChCaXRNYXBPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQk1PYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQml0TWFwIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEJpdE1hcE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEJNT2JqX2RlYWxsb2MoQml0TWFwT2JqZWN0ICpzZWxmKQogewotCVB5X1hERUNSRUYoc2VsZi0+cmVmZXJyZWRfb2JqZWN0KTsKLQlpZiAoc2VsZi0+cmVmZXJyZWRfYml0bWFwKSBmcmVlKHNlbGYtPnJlZmVycmVkX2JpdG1hcCk7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJlZmVycmVkX29iamVjdCk7CisgICAgaWYgKHNlbGYtPnJlZmVycmVkX2JpdG1hcCkgZnJlZShzZWxmLT5yZWZlcnJlZF9iaXRtYXApOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQk1PYmpfZ2V0ZGF0YShCaXRNYXBPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCWludCBmcm9tLCBsZW5ndGg7Ci0JY2hhciAqY3A7CisgICAgaW50IGZyb20sIGxlbmd0aDsKKyAgICBjaGFyICpjcDsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpaSIsICZmcm9tLCAmbGVuZ3RoKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQljcCA9IF9zZWxmLT5vYl9pdHNlbGYtPmJhc2VBZGRyK2Zyb207Ci0JX3JlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNwLCBsZW5ndGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpaSIsICZmcm9tLCAmbGVuZ3RoKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNwID0gX3NlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIrZnJvbTsKKyAgICBfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY3AsIGxlbmd0aCk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpCTU9ial9wdXRkYXRhKEJpdE1hcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IGZyb20sIGxlbmd0aDsKLQljaGFyICpjcCwgKmljcDsKKyAgICBpbnQgZnJvbSwgbGVuZ3RoOworICAgIGNoYXIgKmNwLCAqaWNwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlzIyIsICZmcm9tLCAmaWNwLCAmbGVuZ3RoKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQljcCA9IF9zZWxmLT5vYl9pdHNlbGYtPmJhc2VBZGRyK2Zyb207Ci0JbWVtY3B5KGNwLCBpY3AsIGxlbmd0aCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpcyMiLCAmZnJvbSwgJmljcCwgJmxlbmd0aCkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjcCA9IF9zZWxmLT5vYl9pdHNlbGYtPmJhc2VBZGRyK2Zyb207CisgICAgbWVtY3B5KGNwLCBpY3AsIGxlbmd0aCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBCTU9ial9tZXRob2RzW10gPSB7Ci0JeyJnZXRkYXRhIiwgKFB5Q0Z1bmN0aW9uKUJNT2JqX2dldGRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKGludCBzdGFydCwgaW50IHNpemUpIC0+IHN0cmluZy4gUmV0dXJuIGJ5dGVzIGZyb20gdGhlIGJpdG1hcCIpfSwKLQl7InB1dGRhdGEiLCAoUHlDRnVuY3Rpb24pQk1PYmpfcHV0ZGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50IHN0YXJ0LCBzdHJpbmcgZGF0YSkuIFN0b3JlIGJ5dGVzIGludG8gdGhlIGJpdG1hcCIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7ImdldGRhdGEiLCAoUHlDRnVuY3Rpb24pQk1PYmpfZ2V0ZGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50IHN0YXJ0LCBpbnQgc2l6ZSkgLT4gc3RyaW5nLiBSZXR1cm4gYnl0ZXMgZnJvbSB0aGUgYml0bWFwIil9LAorICAgIHsicHV0ZGF0YSIsIChQeUNGdW5jdGlvbilCTU9ial9wdXRkYXRhLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgc3RhcnQsIHN0cmluZyBkYXRhKS4gU3RvcmUgYnl0ZXMgaW50byB0aGUgYml0bWFwIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpCTU9ial9nZXRfYmFzZUFkZHIoQml0TWFwT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5vYl9pdHNlbGYtPmJhc2VBZGRyKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc2VsZi0+b2JfaXRzZWxmLT5iYXNlQWRkcik7CiB9CiAKICNkZWZpbmUgQk1PYmpfc2V0X2Jhc2VBZGRyIE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpCTU9ial9nZXRfcm93Qnl0ZXMoQml0TWFwT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5vYl9pdHNlbGYtPnJvd0J5dGVzKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc2VsZi0+b2JfaXRzZWxmLT5yb3dCeXRlcyk7CiB9CiAKICNkZWZpbmUgQk1PYmpfc2V0X3Jvd0J5dGVzIE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpCTU9ial9nZXRfYm91bmRzKEJpdE1hcE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICZzZWxmLT5vYl9pdHNlbGYtPmJvdW5kcyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmc2VsZi0+b2JfaXRzZWxmLT5ib3VuZHMpOwogfQogCiAjZGVmaW5lIEJNT2JqX3NldF9ib3VuZHMgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9iaXRtYXBfZGF0YShCaXRNYXBPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoQml0TWFwKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoQml0TWFwKSk7CiB9CiAKICNkZWZpbmUgQk1PYmpfc2V0X2JpdG1hcF9kYXRhIE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpCTU9ial9nZXRfcGl4bWFwX2RhdGEoQml0TWFwT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKFBpeE1hcCkpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKFBpeE1hcCkpOwogfQogCiAjZGVmaW5lIEJNT2JqX3NldF9waXhtYXBfZGF0YSBOVUxMCiAKIHN0YXRpYyBQeUdldFNldERlZiBCTU9ial9nZXRzZXRsaXN0W10gPSB7Ci0JeyJiYXNlQWRkciIsIChnZXR0ZXIpQk1PYmpfZ2V0X2Jhc2VBZGRyLCAoc2V0dGVyKUJNT2JqX3NldF9iYXNlQWRkciwgTlVMTH0sCi0JeyJyb3dCeXRlcyIsIChnZXR0ZXIpQk1PYmpfZ2V0X3Jvd0J5dGVzLCAoc2V0dGVyKUJNT2JqX3NldF9yb3dCeXRlcywgTlVMTH0sCi0JeyJib3VuZHMiLCAoZ2V0dGVyKUJNT2JqX2dldF9ib3VuZHMsIChzZXR0ZXIpQk1PYmpfc2V0X2JvdW5kcywgTlVMTH0sCi0JeyJiaXRtYXBfZGF0YSIsIChnZXR0ZXIpQk1PYmpfZ2V0X2JpdG1hcF9kYXRhLCAoc2V0dGVyKUJNT2JqX3NldF9iaXRtYXBfZGF0YSwgTlVMTH0sCi0JeyJwaXhtYXBfZGF0YSIsIChnZXR0ZXIpQk1PYmpfZ2V0X3BpeG1hcF9kYXRhLCAoc2V0dGVyKUJNT2JqX3NldF9waXhtYXBfZGF0YSwgTlVMTH0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiYmFzZUFkZHIiLCAoZ2V0dGVyKUJNT2JqX2dldF9iYXNlQWRkciwgKHNldHRlcilCTU9ial9zZXRfYmFzZUFkZHIsIE5VTEx9LAorICAgIHsicm93Qnl0ZXMiLCAoZ2V0dGVyKUJNT2JqX2dldF9yb3dCeXRlcywgKHNldHRlcilCTU9ial9zZXRfcm93Qnl0ZXMsIE5VTEx9LAorICAgIHsiYm91bmRzIiwgKGdldHRlcilCTU9ial9nZXRfYm91bmRzLCAoc2V0dGVyKUJNT2JqX3NldF9ib3VuZHMsIE5VTEx9LAorICAgIHsiYml0bWFwX2RhdGEiLCAoZ2V0dGVyKUJNT2JqX2dldF9iaXRtYXBfZGF0YSwgKHNldHRlcilCTU9ial9zZXRfYml0bWFwX2RhdGEsIE5VTEx9LAorICAgIHsicGl4bWFwX2RhdGEiLCAoZ2V0dGVyKUJNT2JqX2dldF9waXhtYXBfZGF0YSwgKHNldHRlcilCTU9ial9zZXRfcGl4bWFwX2RhdGEsIE5VTEx9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtMTU0NCw2MSArMTU0NCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlCaXRNYXBQdHIgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBCaXRNYXBQdHIgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQk1PYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChCaXRNYXBPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQk1PYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChCaXRNYXBPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQk1PYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQml0TWFwX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1FkLkJpdE1hcCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEJpdE1hcE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEJNT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEJNT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBCTU9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQk1PYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQk1PYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQk1PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQk1PYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUJNT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUJNT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQk1PYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RZC5CaXRNYXAiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihCaXRNYXBPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBCTU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBCTU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQk1PYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEJNT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEJNT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEJNT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEJNT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBCTU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBCTU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEJNT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQml0TWFwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTYwNiw1NDg1ICsxNjA2LDU0ODUgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRQb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHcmFmUHRyIHBvcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdyYWZQdHIgcG9ydDsKICNpZm5kZWYgR2V0UG9ydAotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvcnQoJnBvcnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRQb3J0KCZwb3J0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBwb3J0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HcmFmRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBkZXZpY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGRldmljZTsKICNpZm5kZWYgR3JhZkRldmljZQotCVB5TWFjX1BSRUNIRUNLKEdyYWZEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYWZEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlHcmFmRGV2aWNlKGRldmljZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR3JhZkRldmljZShkZXZpY2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRQb3J0Qml0cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQml0TWFwUHRyIGJtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCaXRNYXBQdHIgYm07CiAjaWZuZGVmIFNldFBvcnRCaXRzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEJpdHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRCaXRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJmJtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydEJpdHMoYm0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZibSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRCaXRzKGJtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUG9ydFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHdpZHRoOwotCXNob3J0IGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgd2lkdGg7CisgICAgc2hvcnQgaGVpZ2h0OwogI2lmbmRlZiBQb3J0U2l6ZQotCVB5TWFjX1BSRUNIRUNLKFBvcnRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQb3J0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCVBvcnRTaXplKHdpZHRoLAotCSAgICAgICAgIGhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUG9ydFNpemUod2lkdGgsCisgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTW92ZVBvcnRUbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbGVmdEdsb2JhbDsKLQlzaG9ydCB0b3BHbG9iYWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGxlZnRHbG9iYWw7CisgICAgc2hvcnQgdG9wR2xvYmFsOwogI2lmbmRlZiBNb3ZlUG9ydFRvCi0JUHlNYWNfUFJFQ0hFQ0soTW92ZVBvcnRUbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92ZVBvcnRUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZWZ0R2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAmdG9wR2xvYmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTW92ZVBvcnRUbyhsZWZ0R2xvYmFsLAotCSAgICAgICAgICAgdG9wR2xvYmFsKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdEdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvcEdsb2JhbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1vdmVQb3J0VG8obGVmdEdsb2JhbCwKKyAgICAgICAgICAgICAgIHRvcEdsb2JhbCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldE9yaWdpbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaDsKLQlzaG9ydCB2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBoOworICAgIHNob3J0IHY7CiAjaWZuZGVmIFNldE9yaWdpbgotCVB5TWFjX1BSRUNIRUNLKFNldE9yaWdpbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0T3JpZ2luKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0T3JpZ2luKGgsCi0JICAgICAgICAgIHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE9yaWdpbihoLAorICAgICAgICAgICAgICB2KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0Q2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgU2V0Q2xpcAotCVB5TWFjX1BSRUNIRUNLKFNldENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCVNldENsaXAocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENsaXAocmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Q2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgR2V0Q2xpcAotCVB5TWFjX1BSRUNIRUNLKEdldENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCUdldENsaXAocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldENsaXAocmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ2xpcFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBDbGlwUmVjdAotCVB5TWFjX1BSRUNIRUNLKENsaXBSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGlwUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2xpcFJlY3QoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xpcFJlY3QoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9CYWNrUGF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBhdHRlcm4gKnBhdF9faW5fXzsKKyAgICBpbnQgcGF0X19pbl9sZW5fXzsKICNpZm5kZWYgQmFja1BhdAotCVB5TWFjX1BSRUNIRUNLKEJhY2tQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEJhY2tQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKLQkJZ290byBwYXRfX2Vycm9yX187Ci0JfQotCUJhY2tQYXQocGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEJhY2tQYXQocGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW5pdEN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBJbml0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soSW5pdEN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5pdEN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5pdEN1cnNvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW5pdEN1cnNvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNTZXRDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNvciAqY3Jzcl9faW5fXzsKLQlpbnQgY3Jzcl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEN1cnNvciAqY3Jzcl9faW5fXzsKKyAgICBpbnQgY3Jzcl9faW5fbGVuX187CiAjaWZuZGVmIE1hY1NldEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKE1hY1NldEN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjU2V0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJmNyc3JfX2luX18sICZjcnNyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChjcnNyX19pbl9sZW5fXyAhPSBzaXplb2YoQ3Vyc29yKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoQ3Vyc29yKSIpOwotCQlnb3RvIGNyc3JfX2Vycm9yX187Ci0JfQotCU1hY1NldEN1cnNvcihjcnNyX19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmY3Jzcl9faW5fXywgJmNyc3JfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGNyc3JfX2luX2xlbl9fICE9IHNpemVvZihDdXJzb3IpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihDdXJzb3IpIik7CisgICAgICAgIGdvdG8gY3Jzcl9fZXJyb3JfXzsKKyAgICB9CisgICAgTWFjU2V0Q3Vyc29yKGNyc3JfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBjcnNyX19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSGlkZUN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBIaWRlQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZUN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlkZUN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZUN1cnNvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSGlkZUN1cnNvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNTaG93Q3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIE1hY1Nob3dDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhNYWNTaG93Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNTaG93Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNTaG93Q3Vyc29yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNTaG93Q3Vyc29yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX09ic2N1cmVDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgT2JzY3VyZUN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKE9ic2N1cmVDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKE9ic2N1cmVDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU9ic2N1cmVDdXJzb3IoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE9ic2N1cmVDdXJzb3IoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSGlkZVBlbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBIaWRlUGVuCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZVBlbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlkZVBlbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZVBlbigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSGlkZVBlbigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TaG93UGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNob3dQZW4KLQlQeU1hY19QUkVDSEVDSyhTaG93UGVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93UGVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93UGVuKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaG93UGVuKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFBlbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHB0OwogI2lmbmRlZiBHZXRQZW4KLQlQeU1hY19QUkVDSEVDSyhHZXRQZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBlbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UGVuKCZwdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBlbigmcHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFBlblN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQZW5TdGF0ZSBwblN0YXRlX19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGVuU3RhdGUgcG5TdGF0ZV9fb3V0X187CiAjaWZuZGVmIEdldFBlblN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UGVuU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBlblN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQZW5TdGF0ZSgmcG5TdGF0ZV9fb3V0X18pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmcG5TdGF0ZV9fb3V0X18sIChpbnQpc2l6ZW9mKFBlblN0YXRlKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBlblN0YXRlKCZwblN0YXRlX19vdXRfXyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZwblN0YXRlX19vdXRfXywgKGludClzaXplb2YoUGVuU3RhdGUpKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRQZW5TdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGVuU3RhdGUgKnBuU3RhdGVfX2luX187Ci0JaW50IHBuU3RhdGVfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQZW5TdGF0ZSAqcG5TdGF0ZV9faW5fXzsKKyAgICBpbnQgcG5TdGF0ZV9faW5fbGVuX187CiAjaWZuZGVmIFNldFBlblN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UGVuU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBlblN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBuU3RhdGVfX2luX18sICZwblN0YXRlX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwblN0YXRlX19pbl9sZW5fXyAhPSBzaXplb2YoUGVuU3RhdGUpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQZW5TdGF0ZSkiKTsKLQkJZ290byBwblN0YXRlX19lcnJvcl9fOwotCX0KLQlTZXRQZW5TdGF0ZShwblN0YXRlX19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcG5TdGF0ZV9faW5fXywgJnBuU3RhdGVfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBuU3RhdGVfX2luX2xlbl9fICE9IHNpemVvZihQZW5TdGF0ZSkpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBlblN0YXRlKSIpOworICAgICAgICBnb3RvIHBuU3RhdGVfX2Vycm9yX187CisgICAgfQorICAgIFNldFBlblN0YXRlKHBuU3RhdGVfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwblN0YXRlX19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGVuU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgd2lkdGg7Ci0Jc2hvcnQgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB3aWR0aDsKKyAgICBzaG9ydCBoZWlnaHQ7CiAjaWZuZGVmIFBlblNpemUKLQlQeU1hY19QUkVDSEVDSyhQZW5TaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQZW5TaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGVuU2l6ZSh3aWR0aCwKLQkgICAgICAgIGhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGVuU2l6ZSh3aWR0aCwKKyAgICAgICAgaGVpZ2h0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGVuTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbW9kZTsKICNpZm5kZWYgUGVuTW9kZQotCVB5TWFjX1BSRUNIRUNLKFBlbk1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBlbk1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGVuTW9kZShtb2RlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGVuTW9kZShtb2RlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGVuUGF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBhdHRlcm4gKnBhdF9faW5fXzsKKyAgICBpbnQgcGF0X19pbl9sZW5fXzsKICNpZm5kZWYgUGVuUGF0Ci0JUHlNYWNfUFJFQ0hFQ0soUGVuUGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQZW5QYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKLQkJZ290byBwYXRfX2Vycm9yX187Ci0JfQotCVBlblBhdChwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgUGVuUGF0KHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Blbk5vcm1hbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBQZW5Ob3JtYWwKLQlQeU1hY19QUkVDSEVDSyhQZW5Ob3JtYWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFBlbk5vcm1hbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGVuTm9ybWFsKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQZW5Ob3JtYWwoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTW92ZVRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBoOwotCXNob3J0IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKICNpZm5kZWYgTW92ZVRvCi0JUHlNYWNfUFJFQ0hFQ0soTW92ZVRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlVG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlNb3ZlVG8oaCwKLQkgICAgICAgdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTW92ZVRvKGgsCisgICAgICAgICAgIHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Nb3ZlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE1vdmUKLQlQeU1hY19QUkVDSEVDSyhNb3ZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlNb3ZlKGRoLAotCSAgICAgZHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTW92ZShkaCwKKyAgICAgICAgIGR2KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjTGluZVRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBoOwotCXNob3J0IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKICNpZm5kZWYgTWFjTGluZVRvCi0JUHlNYWNfUFJFQ0hFQ0soTWFjTGluZVRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNMaW5lVG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNMaW5lVG8oaCwKLQkgICAgICAgICAgdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjTGluZVRvKGgsCisgICAgICAgICAgICAgIHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MaW5lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIExpbmUKLQlQeU1hY19QUkVDSEVDSyhMaW5lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMaW5lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlMaW5lKGRoLAotCSAgICAgZHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTGluZShkaCwKKyAgICAgICAgIGR2KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRm9yZUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGNvbG9yOwogI2lmbmRlZiBGb3JlQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhGb3JlQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEZvcmVDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRm9yZUNvbG9yKGNvbG9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZvcmVDb2xvcihjb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0JhY2tDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBjb2xvcjsKICNpZm5kZWYgQmFja0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soQmFja0NvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCYWNrQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xvcikpCi0JCXJldHVybiBOVUxMOwotCUJhY2tDb2xvcihjb2xvcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBCYWNrQ29sb3IoY29sb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Db2xvckJpdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgd2hpY2hCaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHdoaWNoQml0OwogI2lmbmRlZiBDb2xvckJpdAotCVB5TWFjX1BSRUNIRUNLKENvbG9yQml0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb2xvckJpdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoQml0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29sb3JCaXQod2hpY2hCaXQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoQml0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29sb3JCaXQod2hpY2hCaXQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNTZXRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgbGVmdDsKLQlzaG9ydCB0b3A7Ci0Jc2hvcnQgcmlnaHQ7Ci0Jc2hvcnQgYm90dG9tOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgbGVmdDsKKyAgICBzaG9ydCB0b3A7CisgICAgc2hvcnQgcmlnaHQ7CisgICAgc2hvcnQgYm90dG9tOwogI2lmbmRlZiBNYWNTZXRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjU2V0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjU2V0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCi0JCXJldHVybiBOVUxMOwotCU1hY1NldFJlY3QoJnIsCi0JICAgICAgICAgICBsZWZ0LAotCSAgICAgICAgICAgdG9wLAotCSAgICAgICAgICAgcmlnaHQsCi0JICAgICAgICAgICBib3R0b20pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNTZXRSZWN0KCZyLAorICAgICAgICAgICAgICAgbGVmdCwKKyAgICAgICAgICAgICAgIHRvcCwKKyAgICAgICAgICAgICAgIHJpZ2h0LAorICAgICAgICAgICAgICAgYm90dG9tKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY09mZnNldFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IGRoOworICAgIHNob3J0IGR2OwogI2lmbmRlZiBNYWNPZmZzZXRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjT2Zmc2V0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjT2Zmc2V0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjT2Zmc2V0UmVjdCgmciwKLQkgICAgICAgICAgICAgIGRoLAotCSAgICAgICAgICAgICAgZHYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY09mZnNldFJlY3QoJnIsCisgICAgICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgICAgIGR2KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY0luc2V0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE1hY0luc2V0UmVjdAotCVB5TWFjX1BSRUNIRUNLKE1hY0luc2V0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNJbnNldFJlY3QoJnIsCi0JICAgICAgICAgICAgIGRoLAotCSAgICAgICAgICAgICBkdik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjSW5zZXRSZWN0KCZyLAorICAgICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgICAgZHYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2VjdFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJlY3Qgc3JjMTsKLQlSZWN0IHNyYzI7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHNyYzE7CisgICAgUmVjdCBzcmMyOworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgU2VjdFJlY3QKLQlQeU1hY19QUkVDSEVDSyhTZWN0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2VjdFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMxLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNlY3RSZWN0KCZzcmMxLAotCSAgICAgICAgICAgICAgICZzcmMyLAotCSAgICAgICAgICAgICAgICZkc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZHN0UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNlY3RSZWN0KCZzcmMxLAorICAgICAgICAgICAgICAgICAgICZzcmMyLAorICAgICAgICAgICAgICAgICAgICZkc3RSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZHN0UmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjVW5pb25SZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHNyYzE7Ci0JUmVjdCBzcmMyOwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBzcmMxOworICAgIFJlY3Qgc3JjMjsKKyAgICBSZWN0IGRzdFJlY3Q7CiAjaWZuZGVmIE1hY1VuaW9uUmVjdAotCVB5TWFjX1BSRUNIRUNLKE1hY1VuaW9uUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjVW5pb25SZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzIpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNVbmlvblJlY3QoJnNyYzEsCi0JICAgICAgICAgICAgICZzcmMyLAotCSAgICAgICAgICAgICAmZHN0UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjVW5pb25SZWN0KCZzcmMxLAorICAgICAgICAgICAgICAgICAmc3JjMiwKKyAgICAgICAgICAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZHN0UmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRXF1YWxSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZWN0IHJlY3QxOwotCVJlY3QgcmVjdDI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3QgcmVjdDE7CisgICAgUmVjdCByZWN0MjsKICNpZm5kZWYgTWFjRXF1YWxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRXF1YWxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNFcXVhbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0MSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWFjRXF1YWxSZWN0KCZyZWN0MSwKLQkgICAgICAgICAgICAgICAgICAgJnJlY3QyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNFcXVhbFJlY3QoJnJlY3QxLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVjdDIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VtcHR5UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIEVtcHR5UmVjdAotCVB5TWFjX1BSRUNIRUNLKEVtcHR5UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW1wdHlSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBFbXB0eVJlY3QoJnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBFbXB0eVJlY3QoJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY0ZyYW1lUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIE1hY0ZyYW1lUmVjdAotCVB5TWFjX1BSRUNIRUNLKE1hY0ZyYW1lUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRnJhbWVSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNGcmFtZVJlY3QoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjRnJhbWVSZWN0KCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGFpbnRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgUGFpbnRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soUGFpbnRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQYWludFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCVBhaW50UmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQYWludFJlY3QoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBFcmFzZVJlY3QKLQlQeU1hY19QUkVDSEVDSyhFcmFzZVJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEVyYXNlUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRXJhc2VSZWN0KCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEVyYXNlUmVjdCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY0ludmVydFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBNYWNJbnZlcnRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjSW52ZXJ0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjSW52ZXJ0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjSW52ZXJ0UmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNJbnZlcnRSZWN0KCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRmlsbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIE1hY0ZpbGxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRmlsbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0ZpbGxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlNYWNGaWxsUmVjdCgmciwKLQkgICAgICAgICAgICBwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgTWFjRmlsbFJlY3QoJnIsCisgICAgICAgICAgICAgICAgcGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRnJhbWVPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgRnJhbWVPdmFsCi0JUHlNYWNfUFJFQ0hFQ0soRnJhbWVPdmFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGcmFtZU92YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUZyYW1lT3ZhbCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGcmFtZU92YWwoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QYWludE92YWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBQYWludE92YWwKLQlQeU1hY19QUkVDSEVDSyhQYWludE92YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFBhaW50T3ZhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRPdmFsKCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50T3ZhbCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VyYXNlT3ZhbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIEVyYXNlT3ZhbAotCVB5TWFjX1BSRUNIRUNLKEVyYXNlT3ZhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXJhc2VPdmFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZU92YWwoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXJhc2VPdmFsKCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW52ZXJ0T3ZhbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIEludmVydE92YWwKLQlQeU1hY19QUkVDSEVDSyhJbnZlcnRPdmFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZlcnRPdmFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRPdmFsKCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEludmVydE92YWwoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsT3ZhbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIFBhdHRlcm4gKnBhdF9faW5fXzsKKyAgICBpbnQgcGF0X19pbl9sZW5fXzsKICNpZm5kZWYgRmlsbE92YWwKLQlQeU1hY19QUkVDSEVDSyhGaWxsT3ZhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbE92YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKLQkJZ290byBwYXRfX2Vycm9yX187Ci0JfQotCUZpbGxPdmFsKCZyLAotCSAgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBGaWxsT3ZhbCgmciwKKyAgICAgICAgICAgICBwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GcmFtZVJvdW5kUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IG92YWxXaWR0aDsKLQlzaG9ydCBvdmFsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgb3ZhbFdpZHRoOworICAgIHNob3J0IG92YWxIZWlnaHQ7CiAjaWZuZGVmIEZyYW1lUm91bmRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRnJhbWVSb3VuZFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyYW1lUm91bmRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlGcmFtZVJvdW5kUmVjdCgmciwKLQkgICAgICAgICAgICAgICBvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGcmFtZVJvdW5kUmVjdCgmciwKKyAgICAgICAgICAgICAgICAgICBvdmFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1BhaW50Um91bmRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgb3ZhbFdpZHRoOwotCXNob3J0IG92YWxIZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBvdmFsV2lkdGg7CisgICAgc2hvcnQgb3ZhbEhlaWdodDsKICNpZm5kZWYgUGFpbnRSb3VuZFJlY3QKLQlQeU1hY19QUkVDSEVDSyhQYWludFJvdW5kUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRSb3VuZFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCVBhaW50Um91bmRSZWN0KCZyLAotCSAgICAgICAgICAgICAgIG92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICBvdmFsSGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50Um91bmRSZWN0KCZyLAorICAgICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICBvdmFsSGVpZ2h0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRXJhc2VSb3VuZFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBvdmFsV2lkdGg7Ci0Jc2hvcnQgb3ZhbEhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IG92YWxXaWR0aDsKKyAgICBzaG9ydCBvdmFsSGVpZ2h0OwogI2lmbmRlZiBFcmFzZVJvdW5kUmVjdAotCVB5TWFjX1BSRUNIRUNLKEVyYXNlUm91bmRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhFcmFzZVJvdW5kUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsSGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JRXJhc2VSb3VuZFJlY3QoJnIsCi0JICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgIG92YWxIZWlnaHQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmFsSGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXJhc2VSb3VuZFJlY3QoJnIsCisgICAgICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgIG92YWxIZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbnZlcnRSb3VuZFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBvdmFsV2lkdGg7Ci0Jc2hvcnQgb3ZhbEhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IG92YWxXaWR0aDsKKyAgICBzaG9ydCBvdmFsSGVpZ2h0OwogI2lmbmRlZiBJbnZlcnRSb3VuZFJlY3QKLQlQeU1hY19QUkVDSEVDSyhJbnZlcnRSb3VuZFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydFJvdW5kUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsSGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW52ZXJ0Um91bmRSZWN0KCZyLAotCSAgICAgICAgICAgICAgICBvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgIG92YWxIZWlnaHQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmFsSGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0Um91bmRSZWN0KCZyLAorICAgICAgICAgICAgICAgICAgICBvdmFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIG92YWxIZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsUm91bmRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgb3ZhbFdpZHRoOwotCXNob3J0IG92YWxIZWlnaHQ7Ci0JUGF0dGVybiAqcGF0X19pbl9fOwotCWludCBwYXRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgb3ZhbFdpZHRoOworICAgIHNob3J0IG92YWxIZWlnaHQ7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBGaWxsUm91bmRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRmlsbFJvdW5kUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbFJvdW5kUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhocyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JRmlsbFJvdW5kUmVjdCgmciwKLQkgICAgICAgICAgICAgIG92YWxXaWR0aCwKLQkgICAgICAgICAgICAgIG92YWxIZWlnaHQsCi0JICAgICAgICAgICAgICBwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhocyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgRmlsbFJvdW5kUmVjdCgmciwKKyAgICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgIG92YWxIZWlnaHQsCisgICAgICAgICAgICAgICAgICBwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GcmFtZUFyYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IHN0YXJ0QW5nbGU7Ci0Jc2hvcnQgYXJjQW5nbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBzdGFydEFuZ2xlOworICAgIHNob3J0IGFyY0FuZ2xlOwogI2lmbmRlZiBGcmFtZUFyYwotCVB5TWFjX1BSRUNIRUNLKEZyYW1lQXJjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGcmFtZUFyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlGcmFtZUFyYygmciwKLQkgICAgICAgICBzdGFydEFuZ2xlLAotCSAgICAgICAgIGFyY0FuZ2xlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRnJhbWVBcmMoJnIsCisgICAgICAgICAgICAgc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICBhcmNBbmdsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1BhaW50QXJjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgc3RhcnRBbmdsZTsKLQlzaG9ydCBhcmNBbmdsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IHN0YXJ0QW5nbGU7CisgICAgc2hvcnQgYXJjQW5nbGU7CiAjaWZuZGVmIFBhaW50QXJjCi0JUHlNYWNfUFJFQ0hFQ0soUGFpbnRBcmMpOworICAgIFB5TWFjX1BSRUNIRUNLKFBhaW50QXJjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSkpCi0JCXJldHVybiBOVUxMOwotCVBhaW50QXJjKCZyLAotCSAgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICAgYXJjQW5nbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQYWludEFyYygmciwKKyAgICAgICAgICAgICBzdGFydEFuZ2xlLAorICAgICAgICAgICAgIGFyY0FuZ2xlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRXJhc2VBcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBzdGFydEFuZ2xlOwotCXNob3J0IGFyY0FuZ2xlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgc3RhcnRBbmdsZTsKKyAgICBzaG9ydCBhcmNBbmdsZTsKICNpZm5kZWYgRXJhc2VBcmMKLQlQeU1hY19QUkVDSEVDSyhFcmFzZUFyYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXJhc2VBcmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRXJhc2VBcmMoJnIsCi0JICAgICAgICAgc3RhcnRBbmdsZSwKLQkgICAgICAgICBhcmNBbmdsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEVyYXNlQXJjKCZyLAorICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgYXJjQW5nbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbnZlcnRBcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBzdGFydEFuZ2xlOwotCXNob3J0IGFyY0FuZ2xlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgc3RhcnRBbmdsZTsKKyAgICBzaG9ydCBhcmNBbmdsZTsKICNpZm5kZWYgSW52ZXJ0QXJjCi0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0QXJjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZlcnRBcmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW52ZXJ0QXJjKCZyLAotCSAgICAgICAgICBzdGFydEFuZ2xlLAotCSAgICAgICAgICBhcmNBbmdsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEludmVydEFyYygmciwKKyAgICAgICAgICAgICAgc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICAgYXJjQW5nbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsQXJjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgc3RhcnRBbmdsZTsKLQlzaG9ydCBhcmNBbmdsZTsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBzdGFydEFuZ2xlOworICAgIHNob3J0IGFyY0FuZ2xlOworICAgIFBhdHRlcm4gKnBhdF9faW5fXzsKKyAgICBpbnQgcGF0X19pbl9sZW5fXzsKICNpZm5kZWYgRmlsbEFyYwotCVB5TWFjX1BSRUNIRUNLKEZpbGxBcmMpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxBcmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaHMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JRmlsbEFyYygmciwKLQkgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICBhcmNBbmdsZSwKLQkgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEZpbGxBcmMoJnIsCisgICAgICAgIHN0YXJ0QW5nbGUsCisgICAgICAgIGFyY0FuZ2xlLAorICAgICAgICBwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9OZXdSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIE5ld1JnbgotCVB5TWFjX1BSRUNIRUNLKE5ld1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdSZ24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld1JnbigpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9PcGVuUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIE9wZW5SZ24KLQlQeU1hY19QUkVDSEVDSyhPcGVuUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPcGVuUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlPcGVuUmduKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBPcGVuUmduKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Nsb3NlUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgZHN0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgZHN0UmduOwogI2lmbmRlZiBDbG9zZVJnbgotCVB5TWFjX1BSRUNIRUNLKENsb3NlUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2xvc2VSZ24oZHN0UmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsb3NlUmduKGRzdFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0JpdE1hcFRvUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJnbkhhbmRsZSByZWdpb247Ci0JQml0TWFwUHRyIGJNYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBCaXRNYXBQdHIgYk1hcDsKICNpZm5kZWYgQml0TWFwVG9SZWdpb24KLQlQeU1hY19QUkVDSEVDSyhCaXRNYXBUb1JlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQml0TWFwVG9SZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmYk1hcCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBCaXRNYXBUb1JlZ2lvbihyZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIGJNYXApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJmJNYXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQml0TWFwVG9SZWdpb24ocmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiTWFwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9SZ25Ub0hhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKLQlIYW5kbGUgZmxhdHRlbmVkUmduRGF0YUhkbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBIYW5kbGUgZmxhdHRlbmVkUmduRGF0YUhkbDsKICNpZm5kZWYgUmduVG9IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhSZ25Ub0hhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmduVG9IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmZsYXR0ZW5lZFJnbkRhdGFIZGwpKQotCQlyZXR1cm4gTlVMTDsKLQlSZ25Ub0hhbmRsZShyZWdpb24sCi0JICAgICAgICAgICAgZmxhdHRlbmVkUmduRGF0YUhkbCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZmbGF0dGVuZWRSZ25EYXRhSGRsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUmduVG9IYW5kbGUocmVnaW9uLAorICAgICAgICAgICAgICAgIGZsYXR0ZW5lZFJnbkRhdGFIZGwpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9EaXNwb3NlUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBEaXNwb3NlUmduCi0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzcG9zZVJnbihyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZVJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNDb3B5UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgc3JjUmduOwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBzcmNSZ247CisgICAgUmduSGFuZGxlIGRzdFJnbjsKICNpZm5kZWYgTWFjQ29weVJnbgotCVB5TWFjX1BSRUNIRUNLKE1hY0NvcHlSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0NvcHlSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCi0JCXJldHVybiBOVUxMOwotCU1hY0NvcHlSZ24oc3JjUmduLAotCSAgICAgICAgICAgZHN0UmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0NvcHlSZ24oc3JjUmduLAorICAgICAgICAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0RW1wdHlSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIFNldEVtcHR5UmduCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RW1wdHlSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEVtcHR5UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRFbXB0eVJnbihyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0RW1wdHlSZ24ocmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjU2V0UmVjdFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlzaG9ydCBsZWZ0OwotCXNob3J0IHRvcDsKLQlzaG9ydCByaWdodDsKLQlzaG9ydCBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgc2hvcnQgbGVmdDsKKyAgICBzaG9ydCB0b3A7CisgICAgc2hvcnQgcmlnaHQ7CisgICAgc2hvcnQgYm90dG9tOwogI2lmbmRlZiBNYWNTZXRSZWN0UmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjU2V0UmVjdFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjU2V0UmVjdFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCi0JCXJldHVybiBOVUxMOwotCU1hY1NldFJlY3RSZ24ocmduLAotCSAgICAgICAgICAgICAgbGVmdCwKLQkgICAgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgICAgIHJpZ2h0LAotCSAgICAgICAgICAgICAgYm90dG9tKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNTZXRSZWN0UmduKHJnbiwKKyAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICAgICByaWdodCwKKyAgICAgICAgICAgICAgICAgIGJvdHRvbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JlY3RSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOworICAgIFJlY3QgcjsKICNpZm5kZWYgUmVjdFJnbgotCVB5TWFjX1BSRUNIRUNLKFJlY3RSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFJlY3RSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCVJlY3RSZ24ocmduLAotCSAgICAgICAgJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUmVjdFJnbihyZ24sCisgICAgICAgICZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjT2Zmc2V0UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOworICAgIHNob3J0IGRoOworICAgIHNob3J0IGR2OwogI2lmbmRlZiBNYWNPZmZzZXRSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNPZmZzZXRSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY09mZnNldFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjT2Zmc2V0UmduKHJnbiwKLQkgICAgICAgICAgICAgZGgsCi0JICAgICAgICAgICAgIGR2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY09mZnNldFJnbihyZ24sCisgICAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgICBkdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0luc2V0UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOworICAgIHNob3J0IGRoOworICAgIHNob3J0IGR2OwogI2lmbmRlZiBJbnNldFJnbgotCVB5TWFjX1BSRUNIRUNLKEluc2V0UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNldFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXRSZ24ocmduLAotCSAgICAgICAgIGRoLAotCSAgICAgICAgIGR2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2V0UmduKHJnbiwKKyAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICBkdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NlY3RSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ25BOwotCVJnbkhhbmRsZSBzcmNSZ25COwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBzcmNSZ25BOworICAgIFJnbkhhbmRsZSBzcmNSZ25COworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIFNlY3RSZ24KLQlQeU1hY19QUkVDSEVDSyhTZWN0UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZWN0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCi0JCXJldHVybiBOVUxMOwotCVNlY3RSZ24oc3JjUmduQSwKLQkgICAgICAgIHNyY1JnbkIsCi0JICAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZWN0UmduKHNyY1JnbkEsCisgICAgICAgIHNyY1JnbkIsCisgICAgICAgIGRzdFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY1VuaW9uUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgc3JjUmduQTsKLQlSZ25IYW5kbGUgc3JjUmduQjsKLQlSZ25IYW5kbGUgZHN0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgc3JjUmduQTsKKyAgICBSZ25IYW5kbGUgc3JjUmduQjsKKyAgICBSZ25IYW5kbGUgZHN0UmduOwogI2lmbmRlZiBNYWNVbmlvblJnbgotCVB5TWFjX1BSRUNIRUNLKE1hY1VuaW9uUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNVbmlvblJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNVbmlvblJnbihzcmNSZ25BLAotCSAgICAgICAgICAgIHNyY1JnbkIsCi0JICAgICAgICAgICAgZHN0UmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjVW5pb25SZ24oc3JjUmduQSwKKyAgICAgICAgICAgICAgICBzcmNSZ25CLAorICAgICAgICAgICAgICAgIGRzdFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0RpZmZSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ25BOwotCVJnbkhhbmRsZSBzcmNSZ25COwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBzcmNSZ25BOworICAgIFJnbkhhbmRsZSBzcmNSZ25COworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIERpZmZSZ24KLQlQeU1hY19QUkVDSEVDSyhEaWZmUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaWZmUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCi0JCXJldHVybiBOVUxMOwotCURpZmZSZ24oc3JjUmduQSwKLQkgICAgICAgIHNyY1JnbkIsCi0JICAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaWZmUmduKHNyY1JnbkEsCisgICAgICAgIHNyY1JnbkIsCisgICAgICAgIGRzdFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY1hvclJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbkE7Ci0JUmduSGFuZGxlIHNyY1JnbkI7Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbkE7CisgICAgUmduSGFuZGxlIHNyY1JnbkI7CisgICAgUmduSGFuZGxlIGRzdFJnbjsKICNpZm5kZWYgTWFjWG9yUmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjWG9yUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNYb3JSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjWG9yUmduKHNyY1JnbkEsCi0JICAgICAgICAgIHNyY1JnbkIsCi0JICAgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1hvclJnbihzcmNSZ25BLAorICAgICAgICAgICAgICBzcmNSZ25CLAorICAgICAgICAgICAgICBkc3RSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9SZWN0SW5SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJlY3QgcjsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHI7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgUmVjdEluUmduCi0JUHlNYWNfUFJFQ0hFQ0soUmVjdEluUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWN0SW5SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJlY3RJblJnbigmciwKLQkgICAgICAgICAgICAgICAgcmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUmVjdEluUmduKCZyLAorICAgICAgICAgICAgICAgICAgICByZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY0VxdWFsUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZ25IYW5kbGUgcmduQTsKLQlSZ25IYW5kbGUgcmduQjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmduSGFuZGxlIHJnbkE7CisgICAgUmduSGFuZGxlIHJnbkI7CiAjaWZuZGVmIE1hY0VxdWFsUmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjRXF1YWxSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0VxdWFsUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbkEsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduQikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1hY0VxdWFsUmduKHJnbkEsCi0JICAgICAgICAgICAgICAgICAgcmduQik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25CKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjRXF1YWxSZ24ocmduQSwKKyAgICAgICAgICAgICAgICAgICAgICByZ25CKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FbXB0eVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgRW1wdHlSZ24KLQlQeU1hY19QUkVDSEVDSyhFbXB0eVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW1wdHlSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEVtcHR5UmduKHJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEVtcHR5UmduKHJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRnJhbWVSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIE1hY0ZyYW1lUmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjRnJhbWVSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0ZyYW1lUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNGcmFtZVJnbihyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjRnJhbWVSZ24ocmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjUGFpbnRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIE1hY1BhaW50UmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjUGFpbnRSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1BhaW50UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNQYWludFJnbihyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjUGFpbnRSZ24ocmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRXJhc2VSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIEVyYXNlUmduCi0JUHlNYWNfUFJFQ0hFQ0soRXJhc2VSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEVyYXNlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZVJnbihyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXJhc2VSZ24ocmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjSW52ZXJ0UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBNYWNJbnZlcnRSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNJbnZlcnRSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0ludmVydFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjSW52ZXJ0UmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNJbnZlcnRSZ24ocmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRmlsbFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBNYWNGaWxsUmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjRmlsbFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRmlsbFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JTWFjRmlsbFJnbihyZ24sCi0JICAgICAgICAgICBwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgTWFjRmlsbFJnbihyZ24sCisgICAgICAgICAgICAgICBwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TY3JvbGxSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7Ci0JUmduSGFuZGxlIHVwZGF0ZVJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IGRoOworICAgIHNob3J0IGR2OworICAgIFJnbkhhbmRsZSB1cGRhdGVSZ247CiAjaWZuZGVmIFNjcm9sbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhTY3JvbGxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTY3JvbGxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ1cGRhdGVSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlTY3JvbGxSZWN0KCZyLAotCSAgICAgICAgICAgZGgsCi0JICAgICAgICAgICBkdiwKLQkgICAgICAgICAgIHVwZGF0ZVJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ1cGRhdGVSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTY3JvbGxSZWN0KCZyLAorICAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICBkdiwKKyAgICAgICAgICAgICAgIHVwZGF0ZVJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NvcHlCaXRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCaXRNYXBQdHIgc3JjQml0czsKLQlCaXRNYXBQdHIgZHN0Qml0czsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OwotCXNob3J0IG1vZGU7Ci0JUmduSGFuZGxlIG1hc2tSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcFB0ciBzcmNCaXRzOworICAgIEJpdE1hcFB0ciBkc3RCaXRzOworICAgIFJlY3Qgc3JjUmVjdDsKKyAgICBSZWN0IGRzdFJlY3Q7CisgICAgc2hvcnQgbW9kZTsKKyAgICBSZ25IYW5kbGUgbWFza1JnbjsKICNpZm5kZWYgQ29weUJpdHMKLQlQeU1hY19QUkVDSEVDSyhDb3B5Qml0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weUJpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmc3JjQml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJmRzdEJpdHMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmbWFza1JnbikpCi0JCXJldHVybiBOVUxMOwotCUNvcHlCaXRzKHNyY0JpdHMsCi0JICAgICAgICAgZHN0Qml0cywKLQkgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAmZHN0UmVjdCwKLQkgICAgICAgICBtb2RlLAotCSAgICAgICAgIG1hc2tSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZzcmNCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmZHN0Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtYXNrUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29weUJpdHMoc3JjQml0cywKKyAgICAgICAgICAgICBkc3RCaXRzLAorICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICZkc3RSZWN0LAorICAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgbWFza1Jnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NvcHlNYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCaXRNYXBQdHIgc3JjQml0czsKLQlCaXRNYXBQdHIgbWFza0JpdHM7Ci0JQml0TWFwUHRyIGRzdEJpdHM7Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgbWFza1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCaXRNYXBQdHIgc3JjQml0czsKKyAgICBCaXRNYXBQdHIgbWFza0JpdHM7CisgICAgQml0TWFwUHRyIGRzdEJpdHM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgbWFza1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBDb3B5TWFzawotCVB5TWFjX1BSRUNIRUNLKENvcHlNYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TWFzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmc3JjQml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJm1hc2tCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmZHN0Qml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZtYXNrUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlDb3B5TWFzayhzcmNCaXRzLAotCSAgICAgICAgIG1hc2tCaXRzLAotCSAgICAgICAgIGRzdEJpdHMsCi0JICAgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICAgJm1hc2tSZWN0LAotCSAgICAgICAgICZkc3RSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZtYXNrQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJmRzdEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbWFza1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29weU1hc2soc3JjQml0cywKKyAgICAgICAgICAgICBtYXNrQml0cywKKyAgICAgICAgICAgICBkc3RCaXRzLAorICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICZtYXNrUmVjdCwKKyAgICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX09wZW5QaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaWNIYW5kbGUgX3J2OwotCVJlY3QgcGljRnJhbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBfcnY7CisgICAgUmVjdCBwaWNGcmFtZTsKICNpZm5kZWYgT3BlblBpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhPcGVuUGljdHVyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlblBpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcGljRnJhbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBPcGVuUGljdHVyZSgmcGljRnJhbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZwaWNGcmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE9wZW5QaWN0dXJlKCZwaWNGcmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1BpY0NvbW1lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGtpbmQ7Ci0Jc2hvcnQgZGF0YVNpemU7Ci0JSGFuZGxlIGRhdGFIYW5kbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGtpbmQ7CisgICAgc2hvcnQgZGF0YVNpemU7CisgICAgSGFuZGxlIGRhdGFIYW5kbGU7CiAjaWZuZGVmIFBpY0NvbW1lbnQKLQlQeU1hY19QUkVDSEVDSyhQaWNDb21tZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQaWNDb21tZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAma2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFIYW5kbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlQaWNDb21tZW50KGtpbmQsCi0JICAgICAgICAgICBkYXRhU2l6ZSwKLQkgICAgICAgICAgIGRhdGFIYW5kbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhSGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGljQ29tbWVudChraW5kLAorICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgICAgICAgICAgICBkYXRhSGFuZGxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ2xvc2VQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsb3NlUGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKENsb3NlUGljdHVyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvc2VQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbG9zZVBpY3R1cmUoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsb3NlUGljdHVyZSgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9EcmF3UGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGljSGFuZGxlIG15UGljdHVyZTsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBteVBpY3R1cmU7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBEcmF3UGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKERyYXdQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3UGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZteVBpY3R1cmUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JRHJhd1BpY3R1cmUobXlQaWN0dXJlLAotCSAgICAgICAgICAgICZkc3RSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbXlQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdQaWN0dXJlKG15UGljdHVyZSwKKyAgICAgICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0tpbGxQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaWNIYW5kbGUgbXlQaWN0dXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaWNIYW5kbGUgbXlQaWN0dXJlOwogI2lmbmRlZiBLaWxsUGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKEtpbGxQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhLaWxsUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbXlQaWN0dXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JS2lsbFBpY3R1cmUobXlQaWN0dXJlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm15UGljdHVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEtpbGxQaWN0dXJlKG15UGljdHVyZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX09wZW5Qb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9seUhhbmRsZSBfcnY7CiAjaWZuZGVmIE9wZW5Qb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soT3BlblBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5Qb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBPcGVuUG9seSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT3BlblBvbHkoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ2xvc2VQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsb3NlUG9seQotCVB5TWFjX1BSRUNIRUNLKENsb3NlUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvc2VQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbG9zZVBvbHkoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsb3NlUG9seSgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9LaWxsUG9seShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9seUhhbmRsZSBwb2x5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CiAjaWZuZGVmIEtpbGxQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soS2lsbFBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEtpbGxQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JS2lsbFBvbHkocG9seSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgS2lsbFBvbHkocG9seSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX09mZnNldFBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9seUhhbmRsZSBwb2x5OworICAgIHNob3J0IGRoOworICAgIHNob3J0IGR2OwogI2lmbmRlZiBPZmZzZXRQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soT2Zmc2V0UG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT2Zmc2V0UG9seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU9mZnNldFBvbHkocG9seSwKLQkgICAgICAgICAgIGRoLAotCSAgICAgICAgICAgZHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE9mZnNldFBvbHkocG9seSwKKyAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgZHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GcmFtZVBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9seUhhbmRsZSBwb2x5OwogI2lmbmRlZiBGcmFtZVBvbHkKLQlQeU1hY19QUkVDSEVDSyhGcmFtZVBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyYW1lUG9seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCi0JCXJldHVybiBOVUxMOwotCUZyYW1lUG9seShwb2x5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGcmFtZVBvbHkocG9seSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1BhaW50UG9seShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9seUhhbmRsZSBwb2x5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CiAjaWZuZGVmIFBhaW50UG9seQotCVB5TWFjX1BSRUNIRUNLKFBhaW50UG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRQb2x5KHBvbHkpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50UG9seShwb2x5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRXJhc2VQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIHBvbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKICNpZm5kZWYgRXJhc2VQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soRXJhc2VQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhFcmFzZVBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZVBvbHkocG9seSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXJhc2VQb2x5KHBvbHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbnZlcnRQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIHBvbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKICNpZm5kZWYgSW52ZXJ0UG9seQotCVB5TWFjX1BSRUNIRUNLKEludmVydFBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydFBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRQb2x5KHBvbHkpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEludmVydFBvbHkocG9seSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIHBvbHk7Ci0JUGF0dGVybiAqcGF0X19pbl9fOwotCWludCBwYXRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBGaWxsUG9seQotCVB5TWFjX1BSRUNIRUNLKEZpbGxQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsUG9seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKLQkJZ290byBwYXRfX2Vycm9yX187Ci0JfQotCUZpbGxQb2x5KHBvbHksCi0JICAgICAgICAgcGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBGaWxsUG9seShwb2x5LAorICAgICAgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFB0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKLQlzaG9ydCBoOwotCXNob3J0IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHB0OworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKICNpZm5kZWYgU2V0UHQKLQlQeU1hY19QUkVDSEVDSyhTZXRQdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQdCgmcHQsCi0JICAgICAgaCwKLQkgICAgICB2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFB0KCZwdCwKKyAgICAgICAgICBoLAorICAgICAgICAgIHYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xvY2FsVG9HbG9iYWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwdDsKICNpZm5kZWYgTG9jYWxUb0dsb2JhbAotCVB5TWFjX1BSRUNIRUNLKExvY2FsVG9HbG9iYWwpOworICAgIFB5TWFjX1BSRUNIRUNLKExvY2FsVG9HbG9iYWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTG9jYWxUb0dsb2JhbCgmcHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExvY2FsVG9HbG9iYWwoJnB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HbG9iYWxUb0xvY2FsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CiAjaWZuZGVmIEdsb2JhbFRvTG9jYWwKLQlQeU1hY19QUkVDSEVDSyhHbG9iYWxUb0xvY2FsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHbG9iYWxUb0xvY2FsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCi0JCXJldHVybiBOVUxMOwotCUdsb2JhbFRvTG9jYWwoJnB0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHbG9iYWxUb0xvY2FsKCZwdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmFuZG9tKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgUmFuZG9tCi0JUHlNYWNfUFJFQ0hFQ0soUmFuZG9tKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSYW5kb20pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJhbmRvbSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSYW5kb20oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNHZXRQaXhlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0Jc2hvcnQgaDsKLQlzaG9ydCB2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBzaG9ydCBoOworICAgIHNob3J0IHY7CiAjaWZuZGVmIE1hY0dldFBpeGVsCi0JUHlNYWNfUFJFQ0hFQ0soTWFjR2V0UGl4ZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0dldFBpeGVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWFjR2V0UGl4ZWwoaCwKLQkgICAgICAgICAgICAgICAgICB2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1hY0dldFBpeGVsKGgsCisgICAgICAgICAgICAgICAgICAgICAgdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2NhbGVQdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcHQ7Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgU2NhbGVQdAotCVB5TWFjX1BSRUNIRUNLKFNjYWxlUHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNjYWxlUHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2NhbGVQdCgmcHQsCi0JICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICZkc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTY2FsZVB0KCZwdCwKKyAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICZkc3RSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYXBQdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcHQ7Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgTWFwUHQKLQlQeU1hY19QUkVDSEVDSyhNYXBQdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFwUHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFwUHQoJnB0LAotCSAgICAgICZzcmNSZWN0LAotCSAgICAgICZkc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYXBQdCgmcHQsCisgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hcFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgTWFwUmVjdAotCVB5TWFjX1BSRUNIRUNLKE1hcFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hcFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCU1hcFJlY3QoJnIsCi0JICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICZkc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYXBSZWN0KCZyLAorICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFwUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOwotCVJlY3Qgc3JjUmVjdDsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgTWFwUmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFwUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYXBSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCU1hcFJnbihyZ24sCi0JICAgICAgICZzcmNSZWN0LAotCSAgICAgICAmZHN0UmVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYXBSZ24ocmduLAorICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgJmRzdFJlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYXBQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIHBvbHk7Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9seUhhbmRsZSBwb2x5OworICAgIFJlY3Qgc3JjUmVjdDsKKyAgICBSZWN0IGRzdFJlY3Q7CiAjaWZuZGVmIE1hcFBvbHkKLQlQeU1hY19QUkVDSEVDSyhNYXBQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYXBQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFwUG9seShwb2x5LAotCSAgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICAmZHN0UmVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFwUG9seShwb2x5LAorICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgJmRzdFJlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TdGRCaXRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCaXRNYXBQdHIgc3JjQml0czsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OwotCXNob3J0IG1vZGU7Ci0JUmduSGFuZGxlIG1hc2tSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcFB0ciBzcmNCaXRzOworICAgIFJlY3Qgc3JjUmVjdDsKKyAgICBSZWN0IGRzdFJlY3Q7CisgICAgc2hvcnQgbW9kZTsKKyAgICBSZ25IYW5kbGUgbWFza1JnbjsKICNpZm5kZWYgU3RkQml0cwotCVB5TWFjX1BSRUNIRUNLKFN0ZEJpdHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFN0ZEJpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmbWFza1JnbikpCi0JCXJldHVybiBOVUxMOwotCVN0ZEJpdHMoc3JjQml0cywKLQkgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgJmRzdFJlY3QsCi0JICAgICAgICBtb2RlLAotCSAgICAgICAgbWFza1Jnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZzcmNCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJm1hc2tSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTdGRCaXRzKHNyY0JpdHMsCisgICAgICAgICZzcmNSZWN0LAorICAgICAgICAmZHN0UmVjdCwKKyAgICAgICAgbW9kZSwKKyAgICAgICAgbWFza1Jnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0FkZFB0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBzcmM7Ci0JUG9pbnQgZHN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBzcmM7CisgICAgUG9pbnQgZHN0OwogI2lmbmRlZiBBZGRQdAotCVB5TWFjX1BSRUNIRUNLKEFkZFB0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRQdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmZHN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQWRkUHQoc3JjLAotCSAgICAgICZkc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmZHN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQWRkUHQoc3JjLAorICAgICAgICAgICZkc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcXVhbFB0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBwdDE7Ci0JUG9pbnQgcHQyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCBwdDE7CisgICAgUG9pbnQgcHQyOwogI2lmbmRlZiBFcXVhbFB0Ci0JUHlNYWNfUFJFQ0hFQ0soRXF1YWxQdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXF1YWxQdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdDEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRXF1YWxQdChwdDEsCi0JICAgICAgICAgICAgICBwdDIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdDIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBFcXVhbFB0KHB0MSwKKyAgICAgICAgICAgICAgICAgIHB0Mik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjUHRJblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0OwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgcHQ7CisgICAgUmVjdCByOwogI2lmbmRlZiBNYWNQdEluUmVjdAotCVB5TWFjX1BSRUNIRUNLKE1hY1B0SW5SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNQdEluUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNQdEluUmVjdChwdCwKLQkgICAgICAgICAgICAgICAgICAmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjUHRJblJlY3QocHQsCisgICAgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1B0MlJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHB0MTsKLQlQb2ludCBwdDI7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwdDE7CisgICAgUG9pbnQgcHQyOworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgUHQyUmVjdAotCVB5TWFjX1BSRUNIRUNLKFB0MlJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFB0MlJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQxLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0MikpCi0JCXJldHVybiBOVUxMOwotCVB0MlJlY3QocHQxLAotCSAgICAgICAgcHQyLAotCSAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZHN0UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB0MlJlY3QocHQxLAorICAgICAgICBwdDIsCisgICAgICAgICZkc3RSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1B0VG9BbmdsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCVBvaW50IHB0OwotCXNob3J0IGFuZ2xlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgUG9pbnQgcHQ7CisgICAgc2hvcnQgYW5nbGU7CiAjaWZuZGVmIFB0VG9BbmdsZQotCVB5TWFjX1BSRUNIRUNLKFB0VG9BbmdsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHRUb0FuZ2xlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCi0JCXJldHVybiBOVUxMOwotCVB0VG9BbmdsZSgmciwKLQkgICAgICAgICAgcHQsCi0JICAgICAgICAgICZhbmdsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIGFuZ2xlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQdFRvQW5nbGUoJnIsCisgICAgICAgICAgICAgIHB0LAorICAgICAgICAgICAgICAmYW5nbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU3ViUHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHNyYzsKLQlQb2ludCBkc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHNyYzsKKyAgICBQb2ludCBkc3Q7CiAjaWZuZGVmIFN1YlB0Ci0JUHlNYWNfUFJFQ0hFQ0soU3ViUHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFN1YlB0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlTdWJQdChzcmMsCi0JICAgICAgJmRzdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTdWJQdChzcmMsCisgICAgICAgICAgJmRzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBkc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1B0SW5SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0OwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHB0OworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIFB0SW5SZ24KLQlQeU1hY19QUkVDSEVDSyhQdEluUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdEluUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFB0SW5SZ24ocHQsCi0JICAgICAgICAgICAgICByZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFB0SW5SZ24ocHQsCisgICAgICAgICAgICAgICAgICByZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX05ld1BpeE1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIF9ydjsKICNpZm5kZWYgTmV3UGl4TWFwCi0JUHlNYWNfUFJFQ0hFQ0soTmV3UGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdQaXhNYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld1BpeE1hcCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3UGl4TWFwKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Rpc3Bvc2VQaXhNYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBEaXNwb3NlUGl4TWFwCi0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBpeE1hcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlUGl4TWFwKHBtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZVBpeE1hcChwbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NvcHlQaXhNYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBzcmNQTTsKLQlQaXhNYXBIYW5kbGUgZHN0UE07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeE1hcEhhbmRsZSBzcmNQTTsKKyAgICBQaXhNYXBIYW5kbGUgZHN0UE07CiAjaWZuZGVmIENvcHlQaXhNYXAKLQlQeU1hY19QUkVDSEVDSyhDb3B5UGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5UGl4TWFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BNLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBNKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29weVBpeE1hcChzcmNQTSwKLQkgICAgICAgICAgIGRzdFBNKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UE0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5UGl4TWFwKHNyY1BNLAorICAgICAgICAgICAgICAgZHN0UE0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9OZXdQaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBfcnY7CiAjaWZuZGVmIE5ld1BpeFBhdAotCVB5TWFjX1BSRUNIRUNLKE5ld1BpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3UGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdQaXhQYXQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld1BpeFBhdCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9EaXNwb3NlUGl4UGF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwcDsKICNpZm5kZWYgRGlzcG9zZVBpeFBhdAotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VQaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzcG9zZVBpeFBhdChwcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VQaXhQYXQocHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Db3B5UGl4UGF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgc3JjUFA7Ci0JUGl4UGF0SGFuZGxlIGRzdFBQOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhQYXRIYW5kbGUgc3JjUFA7CisgICAgUGl4UGF0SGFuZGxlIGRzdFBQOwogI2lmbmRlZiBDb3B5UGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soQ29weVBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weVBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQUCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RQUCkpCi0JCXJldHVybiBOVUxMOwotCUNvcHlQaXhQYXQoc3JjUFAsCi0JICAgICAgICAgICBkc3RQUCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBQKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29weVBpeFBhdChzcmNQUCwKKyAgICAgICAgICAgICAgIGRzdFBQKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGVuUGl4UGF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwcDsKICNpZm5kZWYgUGVuUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soUGVuUGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQZW5QaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGVuUGl4UGF0KHBwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGVuUGl4UGF0KHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQmFja1BpeFBhdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIHBwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhQYXRIYW5kbGUgcHA7CiAjaWZuZGVmIEJhY2tQaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhCYWNrUGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhCYWNrUGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCi0JCXJldHVybiBOVUxMOwotCUJhY2tQaXhQYXQocHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBCYWNrUGl4UGF0KHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGl4UGF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgX3J2OwotCXNob3J0IHBhdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhQYXRIYW5kbGUgX3J2OworICAgIHNob3J0IHBhdElEOwogI2lmbmRlZiBHZXRQaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhHZXRQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhdElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UGl4UGF0KHBhdElEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpeFBhdChwYXRJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01ha2VSR0JQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBwcDsKLQlSR0JDb2xvciBteUNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhQYXRIYW5kbGUgcHA7CisgICAgUkdCQ29sb3IgbXlDb2xvcjsKICNpZm5kZWYgTWFrZVJHQlBhdAotCVB5TWFjX1BSRUNIRUNLKE1ha2VSR0JQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1ha2VSR0JQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHAsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZteUNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFrZVJHQlBhdChwcCwKLQkgICAgICAgICAgICZteUNvbG9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZteUNvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFrZVJHQlBhdChwcCwKKyAgICAgICAgICAgICAgICZteUNvbG9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbENSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0JUGl4UGF0SGFuZGxlIHBwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ1JlY3QKLQlQeU1hY19QUkVDSEVDSyhGaWxsQ1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxDUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ1JlY3QoJnIsCi0JICAgICAgICAgIHBwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmlsbENSZWN0KCZyLAorICAgICAgICAgICAgICBwcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxDT3ZhbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCVBpeFBhdEhhbmRsZSBwcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIFBpeFBhdEhhbmRsZSBwcDsKICNpZm5kZWYgRmlsbENPdmFsCi0JUHlNYWNfUFJFQ0hFQ0soRmlsbENPdmFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsQ092YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRmlsbENPdmFsKCZyLAotCSAgICAgICAgICBwcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZpbGxDT3ZhbCgmciwKKyAgICAgICAgICAgICAgcHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsQ1JvdW5kUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IG92YWxXaWR0aDsKLQlzaG9ydCBvdmFsSGVpZ2h0OwotCVBpeFBhdEhhbmRsZSBwcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IG92YWxXaWR0aDsKKyAgICBzaG9ydCBvdmFsSGVpZ2h0OworICAgIFBpeFBhdEhhbmRsZSBwcDsKICNpZm5kZWYgRmlsbENSb3VuZFJlY3QKLQlQeU1hY19QUkVDSEVDSyhGaWxsQ1JvdW5kUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbENSb3VuZFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsSGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRmlsbENSb3VuZFJlY3QoJnIsCi0JICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgIG92YWxIZWlnaHQsCi0JICAgICAgICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGaWxsQ1JvdW5kUmVjdCgmciwKKyAgICAgICAgICAgICAgICAgICBvdmFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBwcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxDQXJjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgc3RhcnRBbmdsZTsKLQlzaG9ydCBhcmNBbmdsZTsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBzdGFydEFuZ2xlOworICAgIHNob3J0IGFyY0FuZ2xlOworICAgIFBpeFBhdEhhbmRsZSBwcDsKICNpZm5kZWYgRmlsbENBcmMKLQlQeU1hY19QUkVDSEVDSyhGaWxsQ0FyYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbENBcmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ0FyYygmciwKLQkgICAgICAgICBzdGFydEFuZ2xlLAotCSAgICAgICAgIGFyY0FuZ2xlLAotCSAgICAgICAgIHBwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGaWxsQ0FyYygmciwKKyAgICAgICAgICAgICBzdGFydEFuZ2xlLAorICAgICAgICAgICAgIGFyY0FuZ2xlLAorICAgICAgICAgICAgIHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbENSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0JUGl4UGF0SGFuZGxlIHBwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOworICAgIFBpeFBhdEhhbmRsZSBwcDsKICNpZm5kZWYgRmlsbENSZ24KLQlQeU1hY19QUkVDSEVDSyhGaWxsQ1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbENSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRmlsbENSZ24ocmduLAotCSAgICAgICAgIHBwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmlsbENSZ24ocmduLAorICAgICAgICAgICAgIHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbENQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIHBvbHk7Ci0JUGl4UGF0SGFuZGxlIHBwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ1BvbHkKLQlQeU1hY19QUkVDSEVDSyhGaWxsQ1BvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxDUG9seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRmlsbENQb2x5KHBvbHksCi0JICAgICAgICAgIHBwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZpbGxDUG9seShwb2x5LAorICAgICAgICAgICAgICBwcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JHQkZvcmVDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGNvbG9yOwogI2lmbmRlZiBSR0JGb3JlQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhSR0JGb3JlQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFJHQkZvcmVDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCi0JCXJldHVybiBOVUxMOwotCVJHQkZvcmVDb2xvcigmY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJHQkZvcmVDb2xvcigmY29sb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9SR0JCYWNrQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgUkdCQmFja0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soUkdCQmFja0NvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSR0JCYWNrQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlSR0JCYWNrQ29sb3IoJmNvbG9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSR0JCYWNrQ29sb3IoJmNvbG9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0Q1BpeGVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBoOwotCXNob3J0IHY7Ci0JUkdCQ29sb3IgY1BpeDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OworICAgIFJHQkNvbG9yIGNQaXg7CiAjaWZuZGVmIFNldENQaXhlbAotCVB5TWFjX1BSRUNIRUNLKFNldENQaXhlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q1BpeGVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjUGl4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q1BpeGVsKGgsCi0JICAgICAgICAgIHYsCi0JICAgICAgICAgICZjUGl4KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNQaXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDUGl4ZWwoaCwKKyAgICAgICAgICAgICAgdiwKKyAgICAgICAgICAgICAgJmNQaXgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRQb3J0UGl4KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgU2V0UG9ydFBpeAotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRQaXgpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRQaXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFBpeChwbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRQaXgocG0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRDUGl4ZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKLQlSR0JDb2xvciBjUGl4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBoOworICAgIHNob3J0IHY7CisgICAgUkdCQ29sb3IgY1BpeDsKICNpZm5kZWYgR2V0Q1BpeGVsCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q1BpeGVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDUGl4ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRDUGl4ZWwoaCwKLQkgICAgICAgICAgdiwKLQkgICAgICAgICAgJmNQaXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY1BpeCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRDUGl4ZWwoaCwKKyAgICAgICAgICAgICAgdiwKKyAgICAgICAgICAgICAgJmNQaXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY1BpeCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Rm9yZUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIEdldEZvcmVDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldEZvcmVDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rm9yZUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRGb3JlQ29sb3IoJmNvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0Rm9yZUNvbG9yKCZjb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0QmFja0NvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIEdldEJhY2tDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldEJhY2tDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0QmFja0NvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRCYWNrQ29sb3IoJmNvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0QmFja0NvbG9yKCZjb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT3BDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGNvbG9yOwogI2lmbmRlZiBPcENvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soT3BDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCi0JCXJldHVybiBOVUxMOwotCU9wQ29sb3IoJmNvbG9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBPcENvbG9yKCZjb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0hpbGl0ZUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIEhpbGl0ZUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soSGlsaXRlQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpbGl0ZUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlsaXRlQ29sb3IoJmNvbG9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWxpdGVDb2xvcigmY29sb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9EaXNwb3NlQ1RhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDVGFiSGFuZGxlIGNUYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ1RhYkhhbmRsZSBjVGFibGU7CiAjaWZuZGVmIERpc3Bvc2VDVGFibGUKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlQ1RhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlQ1RhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjVGFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlQ1RhYmxlKGNUYWJsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjVGFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlQ1RhYmxlKGNUYWJsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldENUYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ1RhYkhhbmRsZSBfcnY7Ci0Jc2hvcnQgY3RJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ1RhYkhhbmRsZSBfcnY7CisgICAgc2hvcnQgY3RJRDsKICNpZm5kZWYgR2V0Q1RhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q1RhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjdElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q1RhYmxlKGN0SUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDVGFibGUoY3RJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldENDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNDcnNySGFuZGxlIF9ydjsKLQlzaG9ydCBjcnNySUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENDcnNySGFuZGxlIF9ydjsKKyAgICBzaG9ydCBjcnNySUQ7CiAjaWZuZGVmIEdldENDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRDQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JzcklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q0N1cnNvcihjcnNySUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyc3JJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENDdXJzb3IoY3JzcklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0Q0N1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0Nyc3JIYW5kbGUgY0Nyc3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENDcnNySGFuZGxlIGNDcnNyOwogI2lmbmRlZiBTZXRDQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q0N1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q0N1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY0Nyc3IpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDQ3Vyc29yKGNDcnNyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNDcnNyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q0N1cnNvcihjQ3Jzcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0FsbG9jQ3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEFsbG9jQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soQWxsb2NDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEFsbG9jQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlBbGxvY0N1cnNvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQWxsb2NDdXJzb3IoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGlzcG9zZUNDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNDcnNySGFuZGxlIGNDcnNyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDQ3JzckhhbmRsZSBjQ3JzcjsKICNpZm5kZWYgRGlzcG9zZUNDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlQ0N1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZUNDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNDcnNyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzcG9zZUNDdXJzb3IoY0Nyc3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY0Nyc3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlQ0N1cnNvcihjQ3Jzcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldE1heERldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OwotCVJlY3QgZ2xvYmFsUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OworICAgIFJlY3QgZ2xvYmFsUmVjdDsKICNpZm5kZWYgR2V0TWF4RGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWF4RGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNYXhEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1heERldmljZSgmZ2xvYmFsUmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmdsb2JhbFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNYXhEZXZpY2UoJmdsb2JhbFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRDVFNlZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0Q1RTZWVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q1RTZWVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDVFNlZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENUU2VlZCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDVFNlZWQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXREZXZpY2VMaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0RGV2aWNlTGlzdAotCVB5TWFjX1BSRUNIRUNLKEdldERldmljZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERldmljZUxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldERldmljZUxpc3QoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldERldmljZUxpc3QoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0TWFpbkRldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1haW5EZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRNYWluRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNYWluRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNYWluRGV2aWNlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNYWluRGV2aWNlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldE5leHREZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIF9ydjsKLQlHREhhbmRsZSBjdXJEZXZpY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKKyAgICBHREhhbmRsZSBjdXJEZXZpY2U7CiAjaWZuZGVmIEdldE5leHREZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0RGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXh0RGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdXJEZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0RGV2aWNlKGN1ckRldmljZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdXJEZXZpY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXh0RGV2aWNlKGN1ckRldmljZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Rlc3REZXZpY2VBdHRyaWJ1dGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUdESGFuZGxlIGdkaDsKLQlzaG9ydCBhdHRyaWJ1dGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEdESGFuZGxlIGdkaDsKKyAgICBzaG9ydCBhdHRyaWJ1dGU7CiAjaWZuZGVmIFRlc3REZXZpY2VBdHRyaWJ1dGUKLQlQeU1hY19QUkVDSEVDSyhUZXN0RGV2aWNlQXR0cmlidXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXN0RGV2aWNlQXR0cmlidXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGVzdERldmljZUF0dHJpYnV0ZShnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGVzdERldmljZUF0dHJpYnV0ZShnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldERldmljZUF0dHJpYnV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgZ2RoOwotCXNob3J0IGF0dHJpYnV0ZTsKLQlCb29sZWFuIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBnZGg7CisgICAgc2hvcnQgYXR0cmlidXRlOworICAgIEJvb2xlYW4gdmFsdWU7CiAjaWZuZGVmIFNldERldmljZUF0dHJpYnV0ZQotCVB5TWFjX1BSRUNIRUNLKFNldERldmljZUF0dHJpYnV0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGV2aWNlQXR0cmlidXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0RGV2aWNlQXR0cmlidXRlKGdkaCwKLQkgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLAotCSAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0RGV2aWNlQXR0cmlidXRlKGdkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0luaXRHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBxZFJlZk51bTsKLQlsb25nIG1vZGU7Ci0JR0RIYW5kbGUgZ2RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBxZFJlZk51bTsKKyAgICBsb25nIG1vZGU7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBJbml0R0RldmljZQotCVB5TWFjX1BSRUNIRUNLKEluaXRHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbml0R0RldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnFkUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlJbml0R0RldmljZShxZFJlZk51bSwKLQkgICAgICAgICAgICBtb2RlLAotCSAgICAgICAgICAgIGdkaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcWRSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluaXRHRGV2aWNlKHFkUmVmTnVtLAorICAgICAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgZ2RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTmV3R0RldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OwotCXNob3J0IHJlZk51bTsKLQlsb25nIG1vZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKKyAgICBzaG9ydCByZWZOdW07CisgICAgbG9uZyBtb2RlOwogI2lmbmRlZiBOZXdHRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soTmV3R0RldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3R0RldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3R0RldmljZShyZWZOdW0sCi0JICAgICAgICAgICAgICAgICBtb2RlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld0dEZXZpY2UocmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Rpc3Bvc2VHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIGdkaDsKICNpZm5kZWYgRGlzcG9zZUdEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlR0RldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZUdEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkaCkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VHRGV2aWNlKGdkaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlR0RldmljZShnZGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBnZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgZ2Q7CiAjaWZuZGVmIFNldEdEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhTZXRHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRHRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZCkpCi0JCXJldHVybiBOVUxMOwotCVNldEdEZXZpY2UoZ2QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRHRGV2aWNlKGdkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0R0RldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldEdEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRHRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRHRGV2aWNlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRHRGV2aWNlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NvbG9yMkluZGV4KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlSR0JDb2xvciBteUNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBSR0JDb2xvciBteUNvbG9yOwogI2lmbmRlZiBDb2xvcjJJbmRleAotCVB5TWFjX1BSRUNIRUNLKENvbG9yMkluZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb2xvcjJJbmRleCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZteUNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ29sb3IySW5kZXgoJm15Q29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm15Q29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb2xvcjJJbmRleCgmbXlDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW5kZXgyQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgaW5kZXg7Ci0JUkdCQ29sb3IgYUNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGluZGV4OworICAgIFJHQkNvbG9yIGFDb2xvcjsKICNpZm5kZWYgSW5kZXgyQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhJbmRleDJDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5kZXgyQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCUluZGV4MkNvbG9yKGluZGV4LAotCSAgICAgICAgICAgICZhQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmYUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW5kZXgyQ29sb3IoaW5kZXgsCisgICAgICAgICAgICAgICAgJmFDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZhQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydENvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBteUNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBteUNvbG9yOwogI2lmbmRlZiBJbnZlcnRDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEludmVydENvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZlcnRDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW52ZXJ0Q29sb3IoJm15Q29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbXlDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEludmVydENvbG9yKCZteUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm15Q29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JlYWxDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJHQkNvbG9yIGNvbG9yOwogI2lmbmRlZiBSZWFsQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhSZWFsQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlYWxDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJlYWxDb2xvcigmY29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUmVhbENvbG9yKCZjb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0U3ViVGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNUYWJIYW5kbGUgbXlDb2xvcnM7Ci0Jc2hvcnQgaVRhYlJlczsKLQlDVGFiSGFuZGxlIHRhcmdldFRibDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ1RhYkhhbmRsZSBteUNvbG9yczsKKyAgICBzaG9ydCBpVGFiUmVzOworICAgIENUYWJIYW5kbGUgdGFyZ2V0VGJsOwogI2lmbmRlZiBHZXRTdWJUYWJsZQotCVB5TWFjX1BSRUNIRUNLKEdldFN1YlRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRTdWJUYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbXlDb2xvcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpVGFiUmVzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRhcmdldFRibCkpCi0JCXJldHVybiBOVUxMOwotCUdldFN1YlRhYmxlKG15Q29sb3JzLAotCSAgICAgICAgICAgIGlUYWJSZXMsCi0JICAgICAgICAgICAgdGFyZ2V0VGJsKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm15Q29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVRhYlJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0YXJnZXRUYmwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRTdWJUYWJsZShteUNvbG9ycywKKyAgICAgICAgICAgICAgICBpVGFiUmVzLAorICAgICAgICAgICAgICAgIHRhcmdldFRibCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01ha2VJVGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNUYWJIYW5kbGUgY1RhYkg7Ci0JSVRhYkhhbmRsZSBpVGFiSDsKLQlzaG9ydCByZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENUYWJIYW5kbGUgY1RhYkg7CisgICAgSVRhYkhhbmRsZSBpVGFiSDsKKyAgICBzaG9ydCByZXM7CiAjaWZuZGVmIE1ha2VJVGFibGUKLQlQeU1hY19QUkVDSEVDSyhNYWtlSVRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWtlSVRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjVGFiSCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpVGFiSCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlcykpCi0JCXJldHVybiBOVUxMOwotCU1ha2VJVGFibGUoY1RhYkgsCi0JICAgICAgICAgICBpVGFiSCwKLQkgICAgICAgICAgIHJlcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjVGFiSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpVGFiSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1ha2VJVGFibGUoY1RhYkgsCisgICAgICAgICAgICAgICBpVGFiSCwKKyAgICAgICAgICAgICAgIHJlcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldENsaWVudElEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaWQ7CiAjaWZuZGVmIFNldENsaWVudElECi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q2xpZW50SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENsaWVudElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDbGllbnRJRChpZCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDbGllbnRJRChpZCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Byb3RlY3RFbnRyeShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaW5kZXg7Ci0JQm9vbGVhbiBwcm90ZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpbmRleDsKKyAgICBCb29sZWFuIHByb3RlY3Q7CiAjaWZuZGVmIFByb3RlY3RFbnRyeQotCVB5TWFjX1BSRUNIRUNLKFByb3RlY3RFbnRyeSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHJvdGVjdEVudHJ5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvdGVjdCkpCi0JCXJldHVybiBOVUxMOwotCVByb3RlY3RFbnRyeShpbmRleCwKLQkgICAgICAgICAgICAgcHJvdGVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdGVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFByb3RlY3RFbnRyeShpbmRleCwKKyAgICAgICAgICAgICAgICAgcHJvdGVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Jlc2VydmVFbnRyeShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaW5kZXg7Ci0JQm9vbGVhbiByZXNlcnZlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpbmRleDsKKyAgICBCb29sZWFuIHJlc2VydmU7CiAjaWZuZGVmIFJlc2VydmVFbnRyeQotCVB5TWFjX1BSRUNIRUNLKFJlc2VydmVFbnRyeSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVzZXJ2ZUVudHJ5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzZXJ2ZSkpCi0JCXJldHVybiBOVUxMOwotCVJlc2VydmVFbnRyeShpbmRleCwKLQkgICAgICAgICAgICAgcmVzZXJ2ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzZXJ2ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJlc2VydmVFbnRyeShpbmRleCwKKyAgICAgICAgICAgICAgICAgcmVzZXJ2ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1FERXJyb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBRREVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soUURFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUURFcnJvcigpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRREVycm9yKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weURlZXBNYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCaXRNYXBQdHIgc3JjQml0czsKLQlCaXRNYXBQdHIgbWFza0JpdHM7Ci0JQml0TWFwUHRyIGRzdEJpdHM7Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgbWFza1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OwotCXNob3J0IG1vZGU7Ci0JUmduSGFuZGxlIG1hc2tSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcFB0ciBzcmNCaXRzOworICAgIEJpdE1hcFB0ciBtYXNrQml0czsKKyAgICBCaXRNYXBQdHIgZHN0Qml0czsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBtYXNrUmVjdDsKKyAgICBSZWN0IGRzdFJlY3Q7CisgICAgc2hvcnQgbW9kZTsKKyAgICBSZ25IYW5kbGUgbWFza1JnbjsKICNpZm5kZWYgQ29weURlZXBNYXNrCi0JUHlNYWNfUFJFQ0hFQ0soQ29weURlZXBNYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5RGVlcE1hc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZtYXNrQml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJmRzdEJpdHMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbWFza1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtYXNrUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29weURlZXBNYXNrKHNyY0JpdHMsCi0JICAgICAgICAgICAgIG1hc2tCaXRzLAotCSAgICAgICAgICAgICBkc3RCaXRzLAotCSAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgJm1hc2tSZWN0LAotCSAgICAgICAgICAgICAmZHN0UmVjdCwKLQkgICAgICAgICAgICAgbW9kZSwKLQkgICAgICAgICAgICAgbWFza1Jnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZzcmNCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmbWFza0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZkc3RCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJm1hc2tSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmbWFza1JnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvcHlEZWVwTWFzayhzcmNCaXRzLAorICAgICAgICAgICAgICAgICBtYXNrQml0cywKKyAgICAgICAgICAgICAgICAgZHN0Qml0cywKKyAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICZtYXNrUmVjdCwKKyAgICAgICAgICAgICAgICAgJmRzdFJlY3QsCisgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgIG1hc2tSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRQYXR0ZXJuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXRIYW5kbGUgX3J2OwotCXNob3J0IHBhdHRlcm5JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0SGFuZGxlIF9ydjsKKyAgICBzaG9ydCBwYXR0ZXJuSUQ7CiAjaWZuZGVmIEdldFBhdHRlcm4KLQlQeU1hY19QUkVDSEVDSyhHZXRQYXR0ZXJuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQYXR0ZXJuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0dGVybklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UGF0dGVybihwYXR0ZXJuSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdHRlcm5JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBhdHRlcm4ocGF0dGVybklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjR2V0Q3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDdXJzSGFuZGxlIF9ydjsKLQlzaG9ydCBjdXJzb3JJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ3Vyc0hhbmRsZSBfcnY7CisgICAgc2hvcnQgY3Vyc29ySUQ7CiAjaWZuZGVmIE1hY0dldEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKE1hY0dldEN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjR2V0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29ySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNHZXRDdXJzb3IoY3Vyc29ySUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnNvcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjR2V0Q3Vyc29yKGN1cnNvcklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGljSGFuZGxlIF9ydjsKLQlzaG9ydCBwaWN0dXJlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBfcnY7CisgICAgc2hvcnQgcGljdHVyZUlEOwogI2lmbmRlZiBHZXRQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UGljdHVyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBpY3R1cmVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBpY3R1cmUocGljdHVyZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWN0dXJlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQaWN0dXJlKHBpY3R1cmVJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0RlbHRhUG9pbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVBvaW50IHB0QTsKLQlQb2ludCBwdEI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFBvaW50IHB0QTsKKyAgICBQb2ludCBwdEI7CiAjaWZuZGVmIERlbHRhUG9pbnQKLQlQeU1hY19QUkVDSEVDSyhEZWx0YVBvaW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWx0YVBvaW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0QSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdEIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEZWx0YVBvaW50KHB0QSwKLQkgICAgICAgICAgICAgICAgIHB0Qik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0QikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERlbHRhUG9pbnQocHRBLAorICAgICAgICAgICAgICAgICAgICAgcHRCKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TaGllbGRDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3Qgc2hpZWxkUmVjdDsKLQlQb2ludCBvZmZzZXRQdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBzaGllbGRSZWN0OworICAgIFBvaW50IG9mZnNldFB0OwogI2lmbmRlZiBTaGllbGRDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhTaGllbGRDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNoaWVsZEN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNoaWVsZFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb2Zmc2V0UHQpKQotCQlyZXR1cm4gTlVMTDsKLQlTaGllbGRDdXJzb3IoJnNoaWVsZFJlY3QsCi0JICAgICAgICAgICAgIG9mZnNldFB0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzaGllbGRSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm9mZnNldFB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hpZWxkQ3Vyc29yKCZzaGllbGRSZWN0LAorICAgICAgICAgICAgICAgICBvZmZzZXRQdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NjcmVlblJlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgc2NybkhSZXM7Ci0Jc2hvcnQgc2NyblZSZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHNjcm5IUmVzOworICAgIHNob3J0IHNjcm5WUmVzOwogI2lmbmRlZiBTY3JlZW5SZXMKLQlQeU1hY19QUkVDSEVDSyhTY3JlZW5SZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNjcmVlblJlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2NyZWVuUmVzKCZzY3JuSFJlcywKLQkgICAgICAgICAgJnNjcm5WUmVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgIHNjcm5IUmVzLAotCSAgICAgICAgICAgICAgICAgICAgIHNjcm5WUmVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2NyZWVuUmVzKCZzY3JuSFJlcywKKyAgICAgICAgICAgICAgJnNjcm5WUmVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm5IUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm5WUmVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRJbmRQYXR0ZXJuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuIHRoZVBhdF9fb3V0X187Ci0Jc2hvcnQgcGF0dGVybkxpc3RJRDsKLQlzaG9ydCBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiB0aGVQYXRfX291dF9fOworICAgIHNob3J0IHBhdHRlcm5MaXN0SUQ7CisgICAgc2hvcnQgaW5kZXg7CiAjaWZuZGVmIEdldEluZFBhdHRlcm4KLQlQeU1hY19QUkVDSEVDSyhHZXRJbmRQYXR0ZXJuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJbmRQYXR0ZXJuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhdHRlcm5MaXN0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCUdldEluZFBhdHRlcm4oJnRoZVBhdF9fb3V0X18sCi0JICAgICAgICAgICAgICBwYXR0ZXJuTGlzdElELAotCSAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlUGF0X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdHRlcm5MaXN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEluZFBhdHRlcm4oJnRoZVBhdF9fb3V0X18sCisgICAgICAgICAgICAgICAgICBwYXR0ZXJuTGlzdElELAorICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlUGF0X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Nsb3BlRnJvbUFuZ2xlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7Ci0Jc2hvcnQgYW5nbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBzaG9ydCBhbmdsZTsKICNpZm5kZWYgU2xvcGVGcm9tQW5nbGUKLQlQeU1hY19QUkVDSEVDSyhTbG9wZUZyb21BbmdsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2xvcGVGcm9tQW5nbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbmdsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNsb3BlRnJvbUFuZ2xlKGFuZ2xlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbmdsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNsb3BlRnJvbUFuZ2xlKGFuZ2xlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQW5nbGVGcm9tU2xvcGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlGaXhlZCBzbG9wZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIEZpeGVkIHNsb3BlOwogI2lmbmRlZiBBbmdsZUZyb21TbG9wZQotCVB5TWFjX1BSRUNIRUNLKEFuZ2xlRnJvbVNsb3BlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBbmdsZUZyb21TbG9wZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc2xvcGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBBbmdsZUZyb21TbG9wZShzbG9wZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnNsb3BlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQW5nbGVGcm9tU2xvcGUoc2xvcGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFBpeEJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHBpeE1hcDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHBpeE1hcDsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgR2V0UGl4Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UGl4Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQaXhCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeE1hcCkpCi0JCXJldHVybiBOVUxMOwotCUdldFBpeEJvdW5kcyhwaXhNYXAsCi0JICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGl4TWFwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UGl4Qm91bmRzKHBpeE1hcCwKKyAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFBpeERlcHRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUGl4TWFwSGFuZGxlIHBpeE1hcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIFBpeE1hcEhhbmRsZSBwaXhNYXA7CiAjaWZuZGVmIEdldFBpeERlcHRoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UGl4RGVwdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBpeERlcHRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhNYXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQaXhEZXB0aChwaXhNYXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhNYXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQaXhEZXB0aChwaXhNYXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc1JhbmRvbVNlZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0UURHbG9iYWxzUmFuZG9tU2VlZAotCVB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc1JhbmRvbVNlZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc1JhbmRvbVNlZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFFER2xvYmFsc1JhbmRvbVNlZWQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UURHbG9iYWxzUmFuZG9tU2VlZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc1NjcmVlbkJpdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcCBzY3JlZW5CaXRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCaXRNYXAgc2NyZWVuQml0czsKICNpZm5kZWYgR2V0UURHbG9iYWxzU2NyZWVuQml0cwotCVB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc1NjcmVlbkJpdHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc1NjcmVlbkJpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFFER2xvYmFsc1NjcmVlbkJpdHMoJnNjcmVlbkJpdHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQk1PYmpfTmV3Q29waWVkLCAmc2NyZWVuQml0cyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFFER2xvYmFsc1NjcmVlbkJpdHMoJnNjcmVlbkJpdHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfTmV3Q29waWVkLCAmc2NyZWVuQml0cyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UURHbG9iYWxzQXJyb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNvciBhcnJvd19fb3V0X187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEN1cnNvciBhcnJvd19fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc0Fycm93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzQXJyb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc0Fycm93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNBcnJvdygmYXJyb3dfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmFycm93X19vdXRfXywgKGludClzaXplb2YoQ3Vyc29yKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFFER2xvYmFsc0Fycm93KCZhcnJvd19fb3V0X18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmYXJyb3dfX291dF9fLCAoaW50KXNpemVvZihDdXJzb3IpKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRRREdsb2JhbHNEYXJrR3JheShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGF0dGVybiBka0dyYXlfX291dF9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQYXR0ZXJuIGRrR3JheV9fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc0RhcmtHcmF5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzRGFya0dyYXkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc0RhcmtHcmF5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNEYXJrR3JheSgmZGtHcmF5X19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZka0dyYXlfX291dF9fLCAoaW50KXNpemVvZihQYXR0ZXJuKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFFER2xvYmFsc0RhcmtHcmF5KCZka0dyYXlfX291dF9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmRrR3JheV9fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRRREdsb2JhbHNMaWdodEdyYXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gbHRHcmF5X19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiBsdEdyYXlfX291dF9fOwogI2lmbmRlZiBHZXRRREdsb2JhbHNMaWdodEdyYXkKLQlQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNMaWdodEdyYXkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc0xpZ2h0R3JheSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UURHbG9iYWxzTGlnaHRHcmF5KCZsdEdyYXlfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmx0R3JheV9fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzTGlnaHRHcmF5KCZsdEdyYXlfX291dF9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmx0R3JheV9fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRRREdsb2JhbHNHcmF5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuIGdyYXlfX291dF9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQYXR0ZXJuIGdyYXlfX291dF9fOwogI2lmbmRlZiBHZXRRREdsb2JhbHNHcmF5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzR3JheSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzR3JheSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UURHbG9iYWxzR3JheSgmZ3JheV9fb3V0X18pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmZ3JheV9fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzR3JheSgmZ3JheV9fb3V0X18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmZ3JheV9fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRRREdsb2JhbHNCbGFjayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGF0dGVybiBibGFja19fb3V0X187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBhdHRlcm4gYmxhY2tfX291dF9fOwogI2lmbmRlZiBHZXRRREdsb2JhbHNCbGFjawotCVB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc0JsYWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNCbGFjayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UURHbG9iYWxzQmxhY2soJmJsYWNrX19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZibGFja19fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzQmxhY2soJmJsYWNrX19vdXRfXyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZibGFja19fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRRREdsb2JhbHNXaGl0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGF0dGVybiB3aGl0ZV9fb3V0X187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBhdHRlcm4gd2hpdGVfX291dF9fOwogI2lmbmRlZiBHZXRRREdsb2JhbHNXaGl0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc1doaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNXaGl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UURHbG9iYWxzV2hpdGUoJndoaXRlX19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ3aGl0ZV9fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzV2hpdGUoJndoaXRlX19vdXRfXyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ3aGl0ZV9fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRRREdsb2JhbHNUaGVQb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIF9ydjsKICNpZm5kZWYgR2V0UURHbG9iYWxzVGhlUG9ydAotCVB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc1RoZVBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc1RoZVBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFFER2xvYmFsc1RoZVBvcnQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRRREdsb2JhbHNUaGVQb3J0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRRREdsb2JhbHNSYW5kb21TZWVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHJhbmRvbVNlZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgcmFuZG9tU2VlZDsKICNpZm5kZWYgU2V0UURHbG9iYWxzUmFuZG9tU2VlZAotCVB5TWFjX1BSRUNIRUNLKFNldFFER2xvYmFsc1JhbmRvbVNlZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFFER2xvYmFsc1JhbmRvbVNlZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyYW5kb21TZWVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UURHbG9iYWxzUmFuZG9tU2VlZChyYW5kb21TZWVkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5kb21TZWVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UURHbG9iYWxzUmFuZG9tU2VlZChyYW5kb21TZWVkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0UURHbG9iYWxzQXJyb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNvciAqYXJyb3dfX2luX187Ci0JaW50IGFycm93X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ3Vyc29yICphcnJvd19faW5fXzsKKyAgICBpbnQgYXJyb3dfX2luX2xlbl9fOwogI2lmbmRlZiBTZXRRREdsb2JhbHNBcnJvdwotCVB5TWFjX1BSRUNIRUNLKFNldFFER2xvYmFsc0Fycm93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRRREdsb2JhbHNBcnJvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZhcnJvd19faW5fXywgJmFycm93X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChhcnJvd19faW5fbGVuX18gIT0gc2l6ZW9mKEN1cnNvcikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKEN1cnNvcikiKTsKLQkJZ290byBhcnJvd19fZXJyb3JfXzsKLQl9Ci0JU2V0UURHbG9iYWxzQXJyb3coYXJyb3dfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZhcnJvd19faW5fXywgJmFycm93X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhcnJvd19faW5fbGVuX18gIT0gc2l6ZW9mKEN1cnNvcikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKEN1cnNvcikiKTsKKyAgICAgICAgZ290byBhcnJvd19fZXJyb3JfXzsKKyAgICB9CisgICAgU2V0UURHbG9iYWxzQXJyb3coYXJyb3dfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBhcnJvd19fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFJlZ2lvbkJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgR2V0UmVnaW9uQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UmVnaW9uQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRSZWdpb25Cb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCUdldFJlZ2lvbkJvdW5kcyhyZWdpb24sCi0JICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UmVnaW9uQm91bmRzKHJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0lzUmVnaW9uUmVjdGFuZ3VsYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJnbkhhbmRsZSByZWdpb247CiAjaWZuZGVmIElzUmVnaW9uUmVjdGFuZ3VsYXIKLQlQeU1hY19QUkVDSEVDSyhJc1JlZ2lvblJlY3Rhbmd1bGFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1JlZ2lvblJlY3Rhbmd1bGFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1JlZ2lvblJlY3Rhbmd1bGFyKHJlZ2lvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUmVnaW9uUmVjdGFuZ3VsYXIocmVnaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DcmVhdGVOZXdQb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIF9ydjsKICNpZm5kZWYgQ3JlYXRlTmV3UG9ydAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZU5ld1BvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZU5ld1BvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENyZWF0ZU5ld1BvcnQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDcmVhdGVOZXdQb3J0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRRREVycm9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBlcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIGVycjsKICNpZm5kZWYgU2V0UURFcnJvcgotCVB5TWFjX1BSRUNIRUNLKFNldFFERXJyb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFFERXJyb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlcnIpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRRREVycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UURFcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldFNjclZSZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIExNR2V0U2NyVlJlcwotCVB5TWFjX1BSRUNIRUNLKExNR2V0U2NyVlJlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRTY3JWUmVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldFNjclZSZXMoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRTY3JWUmVzKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRTY3JWUmVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiB2YWx1ZTsKICNpZm5kZWYgTE1TZXRTY3JWUmVzCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRTY3JWUmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldFNjclZSZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0U2NyVlJlcyh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFNjclZSZXModmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldFNjckhSZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIExNR2V0U2NySFJlcwotCVB5TWFjX1BSRUNIRUNLKExNR2V0U2NySFJlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRTY3JIUmVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldFNjckhSZXMoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRTY3JIUmVzKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRTY3JIUmVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiB2YWx1ZTsKICNpZm5kZWYgTE1TZXRTY3JIUmVzCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRTY3JIUmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldFNjckhSZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0U2NySFJlcyh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFNjckhSZXModmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldE1haW5EZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OwogI2lmbmRlZiBMTUdldE1haW5EZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhMTUdldE1haW5EZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0TWFpbkRldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRNYWluRGV2aWNlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldE1haW5EZXZpY2UoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRNYWluRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgdmFsdWU7CiAjaWZuZGVmIExNU2V0TWFpbkRldmljZQotCVB5TWFjX1BSRUNIRUNLKExNU2V0TWFpbkRldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRNYWluRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0TWFpbkRldmljZSh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0TWFpbkRldmljZSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0RGV2aWNlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0RGV2aWNlTGlzdAotCVB5TWFjX1BSRUNIRUNLKExNR2V0RGV2aWNlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXREZXZpY2VMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldERldmljZUxpc3QoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0RGV2aWNlTGlzdCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldERldmljZUxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSB2YWx1ZTsKICNpZm5kZWYgTE1TZXREZXZpY2VMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soTE1TZXREZXZpY2VMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldERldmljZUxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXREZXZpY2VMaXN0KHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXREZXZpY2VMaXN0KHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXRRRENvbG9ycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgTE1HZXRRRENvbG9ycwotCVB5TWFjX1BSRUNIRUNLKExNR2V0UURDb2xvcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0UURDb2xvcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0UURDb2xvcnMoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0UURDb2xvcnMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRRRENvbG9ycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgdmFsdWU7CiAjaWZuZGVmIExNU2V0UURDb2xvcnMKLQlQeU1hY19QUkVDSEVDSyhMTVNldFFEQ29sb3JzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldFFEQ29sb3JzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0UURDb2xvcnModmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFFEQ29sb3JzKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXRXaWR0aExpc3RIYW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBMTUdldFdpZHRoTGlzdEhhbmQKLQlQeU1hY19QUkVDSEVDSyhMTUdldFdpZHRoTGlzdEhhbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0V2lkdGhMaXN0SGFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRXaWR0aExpc3RIYW5kKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFdpZHRoTGlzdEhhbmQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRXaWR0aExpc3RIYW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSB2YWx1ZTsKICNpZm5kZWYgTE1TZXRXaWR0aExpc3RIYW5kCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRXaWR0aExpc3RIYW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldFdpZHRoTGlzdEhhbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRXaWR0aExpc3RIYW5kKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRXaWR0aExpc3RIYW5kKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXRIaWxpdGVNb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IF9ydjsKICNpZm5kZWYgTE1HZXRIaWxpdGVNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRIaWxpdGVNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldEhpbGl0ZU1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0SGlsaXRlTW9kZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEhpbGl0ZU1vZGUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldEhpbGl0ZU1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50OCB2YWx1ZTsKICNpZm5kZWYgTE1TZXRIaWxpdGVNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRIaWxpdGVNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEhpbGl0ZU1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0SGlsaXRlTW9kZSh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEhpbGl0ZU1vZGUodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldFdpZHRoVGFiSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBMTUdldFdpZHRoVGFiSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRXaWR0aFRhYkhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRXaWR0aFRhYkhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRXaWR0aFRhYkhhbmRsZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRXaWR0aFRhYkhhbmRsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFdpZHRoVGFiSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSB2YWx1ZTsKICNpZm5kZWYgTE1TZXRXaWR0aFRhYkhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKExNU2V0V2lkdGhUYWJIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0V2lkdGhUYWJIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRXaWR0aFRhYkhhbmRsZSh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0V2lkdGhUYWJIYW5kbGUodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldExhc3RTUEV4dHJhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBMTUdldExhc3RTUEV4dHJhCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRMYXN0U1BFeHRyYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRMYXN0U1BFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRMYXN0U1BFeHRyYSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldExhc3RTUEV4dHJhKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRMYXN0U1BFeHRyYShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgdmFsdWU7CiAjaWZuZGVmIExNU2V0TGFzdFNQRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhMTVNldExhc3RTUEV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldExhc3RTUEV4dHJhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldExhc3RTUEV4dHJhKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0TGFzdFNQRXh0cmEodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldExhc3RGT05EKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBMTUdldExhc3RGT05ECi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRMYXN0Rk9ORCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRMYXN0Rk9ORCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRMYXN0Rk9ORCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRMYXN0Rk9ORCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldExhc3RGT05EKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSB2YWx1ZTsKICNpZm5kZWYgTE1TZXRMYXN0Rk9ORAotCVB5TWFjX1BSRUNIRUNLKExNU2V0TGFzdEZPTkQpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0TGFzdEZPTkQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRMYXN0Rk9ORCh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0TGFzdEZPTkQodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldEZyYWN0RW5hYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IF9ydjsKICNpZm5kZWYgTE1HZXRGcmFjdEVuYWJsZQotCVB5TWFjX1BSRUNIRUNLKExNR2V0RnJhY3RFbmFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0RnJhY3RFbmFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0RnJhY3RFbmFibGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRGcmFjdEVuYWJsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0RnJhY3RFbmFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50OCB2YWx1ZTsKICNpZm5kZWYgTE1TZXRGcmFjdEVuYWJsZQotCVB5TWFjX1BSRUNIRUNLKExNU2V0RnJhY3RFbmFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0RnJhY3RFbmFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0RnJhY3RFbmFibGUodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRGcmFjdEVuYWJsZSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0VGhlR0RldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0VGhlR0RldmljZQotCVB5TWFjX1BSRUNIRUNLKExNR2V0VGhlR0RldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRUaGVHRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldFRoZUdEZXZpY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0VGhlR0RldmljZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFRoZUdEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSB2YWx1ZTsKICNpZm5kZWYgTE1TZXRUaGVHRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRUaGVHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldFRoZUdEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRUaGVHRGV2aWNlKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRUaGVHRGV2aWNlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXRIaWxpdGVSR0IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBoaWxpdGVSR0JWYWx1ZTsKICNpZm5kZWYgTE1HZXRIaWxpdGVSR0IKLQlQeU1hY19QUkVDSEVDSyhMTUdldEhpbGl0ZVJHQik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRIaWxpdGVSR0IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUxNR2V0SGlsaXRlUkdCKCZoaWxpdGVSR0JWYWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZoaWxpdGVSR0JWYWx1ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNR2V0SGlsaXRlUkdCKCZoaWxpdGVSR0JWYWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZoaWxpdGVSR0JWYWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRIaWxpdGVSR0IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBoaWxpdGVSR0JWYWx1ZTsKICNpZm5kZWYgTE1TZXRIaWxpdGVSR0IKLQlQeU1hY19QUkVDSEVDSyhMTVNldEhpbGl0ZVJHQik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRIaWxpdGVSR0IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmaGlsaXRlUkdCVmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldEhpbGl0ZVJHQigmaGlsaXRlUkdCVmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZoaWxpdGVSR0JWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0SGlsaXRlUkdCKCZoaWxpdGVSR0JWYWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0Q3Vyc29yTmV3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIExNR2V0Q3Vyc29yTmV3Ci0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRDdXJzb3JOZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0Q3Vyc29yTmV3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldEN1cnNvck5ldygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEN1cnNvck5ldygpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0Q3Vyc29yTmV3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIHZhbHVlOwogI2lmbmRlZiBMTVNldEN1cnNvck5ldwotCVB5TWFjX1BSRUNIRUNLKExNU2V0Q3Vyc29yTmV3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEN1cnNvck5ldyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRDdXJzb3JOZXcodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRDdXJzb3JOZXcodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9UZXh0Rm9udChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgZm9udDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgZm9udDsKICNpZm5kZWYgVGV4dEZvbnQKLQlQeU1hY19QUkVDSEVDSyhUZXh0Rm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dEZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb250KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVGV4dEZvbnQoZm9udCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRleHRGb250KGZvbnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9UZXh0RmFjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3R5bGVQYXJhbWV0ZXIgZmFjZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3R5bGVQYXJhbWV0ZXIgZmFjZTsKICNpZm5kZWYgVGV4dEZhY2UKLQlQeU1hY19QUkVDSEVDSyhUZXh0RmFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dEZhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVGV4dEZhY2UoZmFjZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFjZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRleHRGYWNlKGZhY2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9UZXh0TW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbW9kZTsKICNpZm5kZWYgVGV4dE1vZGUKLQlQeU1hY19QUkVDSEVDSyhUZXh0TW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVGV4dE1vZGUobW9kZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRleHRNb2RlKG1vZGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9UZXh0U2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgc2l6ZTsKICNpZm5kZWYgVGV4dFNpemUKLQlQeU1hY19QUkVDSEVDSyhUZXh0U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVGV4dFNpemUoc2l6ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRleHRTaXplKHNpemUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TcGFjZUV4dHJhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBleHRyYTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgZXh0cmE7CiAjaWZuZGVmIFNwYWNlRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhTcGFjZUV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcGFjZUV4dHJhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZleHRyYSkpCi0JCXJldHVybiBOVUxMOwotCVNwYWNlRXh0cmEoZXh0cmEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXh0cmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTcGFjZUV4dHJhKGV4dHJhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRHJhd0NoYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNoYXJQYXJhbWV0ZXIgY2g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENoYXJQYXJhbWV0ZXIgY2g7CiAjaWZuZGVmIERyYXdDaGFyCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd0NoYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdDaGFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2gpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmF3Q2hhcihjaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2gpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmF3Q2hhcihjaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0RyYXdTdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgczsKICNpZm5kZWYgRHJhd1N0cmluZwotCVB5TWFjX1BSRUNIRUNLKERyYXdTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHMpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmF3U3RyaW5nKHMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdTdHJpbmcocyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY0RyYXdUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICp0ZXh0QnVmX19pbl9fOwotCWludCB0ZXh0QnVmX19pbl9sZW5fXzsKLQlzaG9ydCBmaXJzdEJ5dGU7Ci0Jc2hvcnQgYnl0ZUNvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICp0ZXh0QnVmX19pbl9fOworICAgIGludCB0ZXh0QnVmX19pbl9sZW5fXzsKKyAgICBzaG9ydCBmaXJzdEJ5dGU7CisgICAgc2hvcnQgYnl0ZUNvdW50OwogI2lmbmRlZiBNYWNEcmF3VGV4dAotCVB5TWFjX1BSRUNIRUNLKE1hY0RyYXdUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNEcmF3VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2hoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRCdWZfX2luX18sICZ0ZXh0QnVmX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0Qnl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCkpCi0JCXJldHVybiBOVUxMOwotCS8qIEZvb2wgY29tcGlsZXIgd2FybmluZ3MgKi8KLQl0ZXh0QnVmX19pbl9sZW5fXyA9IHRleHRCdWZfX2luX2xlbl9fOwotCU1hY0RyYXdUZXh0KHRleHRCdWZfX2luX18sCi0JICAgICAgICAgICAgZmlyc3RCeXRlLAotCSAgICAgICAgICAgIGJ5dGVDb3VudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dEJ1Zl9faW5fXywgJnRleHRCdWZfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogRm9vbCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHRleHRCdWZfX2luX2xlbl9fID0gdGV4dEJ1Zl9faW5fbGVuX187CisgICAgTWFjRHJhd1RleHQodGV4dEJ1Zl9faW5fXywKKyAgICAgICAgICAgICAgICBmaXJzdEJ5dGUsCisgICAgICAgICAgICAgICAgYnl0ZUNvdW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ2hhcldpZHRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JQ2hhclBhcmFtZXRlciBjaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIENoYXJQYXJhbWV0ZXIgY2g7CiAjaWZuZGVmIENoYXJXaWR0aAotCVB5TWFjX1BSRUNIRUNLKENoYXJXaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhcldpZHRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2gpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDaGFyV2lkdGgoY2gpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2gpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDaGFyV2lkdGgoY2gpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1N0cmluZ1dpZHRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JU3RyMjU1IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBTdHIyNTUgczsKICNpZm5kZWYgU3RyaW5nV2lkdGgKLQlQeU1hY19QUkVDSEVDSyhTdHJpbmdXaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RyaW5nV2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTdHJpbmdXaWR0aChzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFN0cmluZ1dpZHRoKHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRXaWR0aChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCWNoYXIgKnRleHRCdWZfX2luX187Ci0JaW50IHRleHRCdWZfX2luX2xlbl9fOwotCXNob3J0IGZpcnN0Qnl0ZTsKLQlzaG9ydCBieXRlQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBjaGFyICp0ZXh0QnVmX19pbl9fOworICAgIGludCB0ZXh0QnVmX19pbl9sZW5fXzsKKyAgICBzaG9ydCBmaXJzdEJ5dGU7CisgICAgc2hvcnQgYnl0ZUNvdW50OwogI2lmbmRlZiBUZXh0V2lkdGgKLQlQeU1hY19QUkVDSEVDSyhUZXh0V2lkdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRXaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2hoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRCdWZfX2luX18sICZ0ZXh0QnVmX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0Qnl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCkpCi0JCXJldHVybiBOVUxMOwotCS8qIEZvb2wgY29tcGlsZXIgd2FybmluZ3MgKi8KLQl0ZXh0QnVmX19pbl9sZW5fXyA9IHRleHRCdWZfX2luX2xlbl9fOwotCV9ydiA9IFRleHRXaWR0aCh0ZXh0QnVmX19pbl9fLAotCSAgICAgICAgICAgICAgICBmaXJzdEJ5dGUsCi0JICAgICAgICAgICAgICAgIGJ5dGVDb3VudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0QnVmX19pbl9fLCAmdGV4dEJ1Zl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdEJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBGb29sIGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgdGV4dEJ1Zl9faW5fbGVuX18gPSB0ZXh0QnVmX19pbl9sZW5fXzsKKyAgICBfcnYgPSBUZXh0V2lkdGgodGV4dEJ1Zl9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RCeXRlLAorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldEZvbnRJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGb250SW5mbyBpbmZvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGb250SW5mbyBpbmZvOwogI2lmbmRlZiBHZXRGb250SW5mbwotCVB5TWFjX1BSRUNIRUNLKEdldEZvbnRJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGb250SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0Rm9udEluZm8oJmluZm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRGSV9OZXcsICZpbmZvKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0Rm9udEluZm8oJmluZm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRGSV9OZXcsICZpbmZvKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DaGFyRXh0cmEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIGV4dHJhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBleHRyYTsKICNpZm5kZWYgQ2hhckV4dHJhCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhckV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFyRXh0cmEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmV4dHJhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2hhckV4dHJhKGV4dHJhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmV4dHJhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2hhckV4dHJhKGV4dHJhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfVHJ1bmNTdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlzaG9ydCB3aWR0aDsKLQlTdHIyNTUgdGhlU3RyaW5nOwotCVRydW5jQ29kZSB0cnVuY1doZXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgc2hvcnQgd2lkdGg7CisgICAgU3RyMjU1IHRoZVN0cmluZzsKKyAgICBUcnVuY0NvZGUgdHJ1bmNXaGVyZTsKICNpZm5kZWYgVHJ1bmNTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhUcnVuY1N0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHJ1bmNTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cnVuY1doZXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHJ1bmNTdHJpbmcod2lkdGgsCi0JICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgIHRydW5jV2hlcmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGhlU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJ1bmNXaGVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRydW5jU3RyaW5nKHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICB0cnVuY1doZXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRQb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHcmFmUHRyIHRoZVBvcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdyYWZQdHIgdGhlUG9ydDsKICNpZm5kZWYgU2V0UG9ydAotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZ0aGVQb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydCh0aGVQb3J0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZ0aGVQb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydCh0aGVQb3J0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Q3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDdXJzSGFuZGxlIF9ydjsKLQlzaG9ydCBjdXJzb3JJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ3Vyc0hhbmRsZSBfcnY7CisgICAgc2hvcnQgY3Vyc29ySUQ7CiAjaWZuZGVmIEdldEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKEdldEN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29ySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDdXJzb3IoY3Vyc29ySUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnNvcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q3Vyc29yKGN1cnNvcklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0Q3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDdXJzb3IgKmNyc3JfX2luX187Ci0JaW50IGNyc3JfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDdXJzb3IgKmNyc3JfX2luX187CisgICAgaW50IGNyc3JfX2luX2xlbl9fOwogI2lmbmRlZiBTZXRDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZjcnNyX19pbl9fLCAmY3Jzcl9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoY3Jzcl9faW5fbGVuX18gIT0gc2l6ZW9mKEN1cnNvcikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKEN1cnNvcikiKTsKLQkJZ290byBjcnNyX19lcnJvcl9fOwotCX0KLQlTZXRDdXJzb3IoY3Jzcl9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJmNyc3JfX2luX18sICZjcnNyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjcnNyX19pbl9sZW5fXyAhPSBzaXplb2YoQ3Vyc29yKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoQ3Vyc29yKSIpOworICAgICAgICBnb3RvIGNyc3JfX2Vycm9yX187CisgICAgfQorICAgIFNldEN1cnNvcihjcnNyX19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgY3Jzcl9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Nob3dDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2hvd0N1cnNvcgotCVB5TWFjX1BSRUNIRUNLKFNob3dDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNob3dDdXJzb3IoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dDdXJzb3IoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTGluZVRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBoOwotCXNob3J0IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKICNpZm5kZWYgTGluZVRvCi0JUHlNYWNfUFJFQ0hFQ0soTGluZVRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMaW5lVG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlMaW5lVG8oaCwKLQkgICAgICAgdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTGluZVRvKGgsCisgICAgICAgICAgIHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgbGVmdDsKLQlzaG9ydCB0b3A7Ci0Jc2hvcnQgcmlnaHQ7Ci0Jc2hvcnQgYm90dG9tOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgbGVmdDsKKyAgICBzaG9ydCB0b3A7CisgICAgc2hvcnQgcmlnaHQ7CisgICAgc2hvcnQgYm90dG9tOwogI2lmbmRlZiBTZXRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCi0JCXJldHVybiBOVUxMOwotCVNldFJlY3QoJnIsCi0JICAgICAgICBsZWZ0LAotCSAgICAgICAgdG9wLAotCSAgICAgICAgcmlnaHQsCi0JICAgICAgICBib3R0b20pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRSZWN0KCZyLAorICAgICAgICBsZWZ0LAorICAgICAgICB0b3AsCisgICAgICAgIHJpZ2h0LAorICAgICAgICBib3R0b20pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT2Zmc2V0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE9mZnNldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhPZmZzZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhPZmZzZXRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlPZmZzZXRSZWN0KCZyLAotCSAgICAgICAgICAgZGgsCi0JICAgICAgICAgICBkdik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgT2Zmc2V0UmVjdCgmciwKKyAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgZHYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW5zZXRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgSW5zZXRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNldFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCUluc2V0UmVjdCgmciwKLQkgICAgICAgICAgZGgsCi0JICAgICAgICAgIGR2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnNldFJlY3QoJnIsCisgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICBkdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9VbmlvblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3Qgc3JjMTsKLQlSZWN0IHNyYzI7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHNyYzE7CisgICAgUmVjdCBzcmMyOworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgVW5pb25SZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVW5pb25SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbmlvblJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMxLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMikpCi0JCXJldHVybiBOVUxMOwotCVVuaW9uUmVjdCgmc3JjMSwKLQkgICAgICAgICAgJnNyYzIsCi0JICAgICAgICAgICZkc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVbmlvblJlY3QoJnNyYzEsCisgICAgICAgICAgICAgICZzcmMyLAorICAgICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcXVhbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJlY3QgcmVjdDE7Ci0JUmVjdCByZWN0MjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmVjdCByZWN0MTsKKyAgICBSZWN0IHJlY3QyOwogI2lmbmRlZiBFcXVhbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhFcXVhbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEVxdWFsUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QxLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBFcXVhbFJlY3QoJnJlY3QxLAotCSAgICAgICAgICAgICAgICAmcmVjdDIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEVxdWFsUmVjdCgmcmVjdDEsCisgICAgICAgICAgICAgICAgICAgICZyZWN0Mik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRnJhbWVSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgRnJhbWVSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRnJhbWVSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGcmFtZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUZyYW1lUmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGcmFtZVJlY3QoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbnZlcnRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgSW52ZXJ0UmVjdAotCVB5TWFjX1BSRUNIRUNLKEludmVydFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUludmVydFJlY3QoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0UmVjdCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0JUGF0dGVybiAqcGF0X19pbl9fOwotCWludCBwYXRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBGaWxsUmVjdAotCVB5TWFjX1BSRUNIRUNLKEZpbGxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JRmlsbFJlY3QoJnIsCi0JICAgICAgICAgcGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEZpbGxSZWN0KCZyLAorICAgICAgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NvcHlSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ247Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbjsKKyAgICBSZ25IYW5kbGUgZHN0UmduOwogI2lmbmRlZiBDb3B5UmduCi0JUHlNYWNfUFJFQ0hFQ0soQ29weVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29weVJnbihzcmNSZ24sCi0JICAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29weVJnbihzcmNSZ24sCisgICAgICAgIGRzdFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFJlY3RSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0Jc2hvcnQgbGVmdDsKLQlzaG9ydCB0b3A7Ci0Jc2hvcnQgcmlnaHQ7Ci0Jc2hvcnQgYm90dG9tOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOworICAgIHNob3J0IGxlZnQ7CisgICAgc2hvcnQgdG9wOworICAgIHNob3J0IHJpZ2h0OworICAgIHNob3J0IGJvdHRvbTsKICNpZm5kZWYgU2V0UmVjdFJnbgotCVB5TWFjX1BSRUNIRUNLKFNldFJlY3RSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFJlY3RSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRSZWN0UmduKHJnbiwKLQkgICAgICAgICAgIGxlZnQsCi0JICAgICAgICAgICB0b3AsCi0JICAgICAgICAgICByaWdodCwKLQkgICAgICAgICAgIGJvdHRvbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVjdFJnbihyZ24sCisgICAgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgICAgdG9wLAorICAgICAgICAgICAgICAgcmlnaHQsCisgICAgICAgICAgICAgICBib3R0b20pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9PZmZzZXRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE9mZnNldFJnbgotCVB5TWFjX1BSRUNIRUNLKE9mZnNldFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soT2Zmc2V0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlPZmZzZXRSZ24ocmduLAotCSAgICAgICAgICBkaCwKLQkgICAgICAgICAgZHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgT2Zmc2V0UmduKHJnbiwKKyAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgIGR2KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfVW5pb25SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ25BOwotCVJnbkhhbmRsZSBzcmNSZ25COwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBzcmNSZ25BOworICAgIFJnbkhhbmRsZSBzcmNSZ25COworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIFVuaW9uUmduCi0JUHlNYWNfUFJFQ0hFQ0soVW5pb25SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFVuaW9uUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCi0JCXJldHVybiBOVUxMOwotCVVuaW9uUmduKHNyY1JnbkEsCi0JICAgICAgICAgc3JjUmduQiwKLQkgICAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVbmlvblJnbihzcmNSZ25BLAorICAgICAgICAgICAgIHNyY1JnbkIsCisgICAgICAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfWG9yUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgc3JjUmduQTsKLQlSZ25IYW5kbGUgc3JjUmduQjsKLQlSZ25IYW5kbGUgZHN0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgc3JjUmduQTsKKyAgICBSZ25IYW5kbGUgc3JjUmduQjsKKyAgICBSZ25IYW5kbGUgZHN0UmduOwogI2lmbmRlZiBYb3JSZ24KLQlQeU1hY19QUkVDSEVDSyhYb3JSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFhvclJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlYb3JSZ24oc3JjUmduQSwKLQkgICAgICAgc3JjUmduQiwKLQkgICAgICAgZHN0UmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgWG9yUmduKHNyY1JnbkEsCisgICAgICAgICAgIHNyY1JnbkIsCisgICAgICAgICAgIGRzdFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VxdWFsUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZ25IYW5kbGUgcmduQTsKLQlSZ25IYW5kbGUgcmduQjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmduSGFuZGxlIHJnbkE7CisgICAgUmduSGFuZGxlIHJnbkI7CiAjaWZuZGVmIEVxdWFsUmduCi0JUHlNYWNfUFJFQ0hFQ0soRXF1YWxSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEVxdWFsUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbkEsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduQikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEVxdWFsUmduKHJnbkEsCi0JICAgICAgICAgICAgICAgcmduQik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25CKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRXF1YWxSZ24ocmduQSwKKyAgICAgICAgICAgICAgICAgICByZ25CKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GcmFtZVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgRnJhbWVSZ24KLQlQeU1hY19QUkVDSEVDSyhGcmFtZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRnJhbWVSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCUZyYW1lUmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGcmFtZVJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QYWludFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgUGFpbnRSZ24KLQlQeU1hY19QUkVDSEVDSyhQYWludFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCVBhaW50UmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQYWludFJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbnZlcnRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIEludmVydFJnbgotCVB5TWFjX1BSRUNIRUNLKEludmVydFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRSZ24ocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEludmVydFJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIEZpbGxSZ24KLQlQeU1hY19QUkVDSEVDSyhGaWxsUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlGaWxsUmduKHJnbiwKLQkgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBGaWxsUmduKHJnbiwKKyAgICAgICAgcGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGl4ZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBHZXRQaXhlbAotCVB5TWFjX1BSRUNIRUNLKEdldFBpeGVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQaXhlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBpeGVsKGgsCi0JICAgICAgICAgICAgICAgdik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQaXhlbChoLAorICAgICAgICAgICAgICAgICAgIHYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1B0SW5SZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBwdDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHB0OworICAgIFJlY3QgcjsKICNpZm5kZWYgUHRJblJlY3QKLQlQeU1hY19QUkVDSEVDSyhQdEluUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHRJblJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJblJlY3QocHQsCi0JICAgICAgICAgICAgICAgJnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFB0SW5SZWN0KHB0LAorICAgICAgICAgICAgICAgICAgICZyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9EcmF3VGV4dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqdGV4dEJ1Zl9faW5fXzsKLQlpbnQgdGV4dEJ1Zl9faW5fbGVuX187Ci0Jc2hvcnQgZmlyc3RCeXRlOwotCXNob3J0IGJ5dGVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqdGV4dEJ1Zl9faW5fXzsKKyAgICBpbnQgdGV4dEJ1Zl9faW5fbGVuX187CisgICAgc2hvcnQgZmlyc3RCeXRlOworICAgIHNob3J0IGJ5dGVDb3VudDsKICNpZm5kZWYgRHJhd1RleHQKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0QnVmX19pbl9fLCAmdGV4dEJ1Zl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZmaXJzdEJ5dGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBGb29sIGNvbXBpbGVyIHdhcm5pbmdzICovCi0JdGV4dEJ1Zl9faW5fbGVuX18gPSB0ZXh0QnVmX19pbl9sZW5fXzsKLQlEcmF3VGV4dCh0ZXh0QnVmX19pbl9fLAotCSAgICAgICAgIGZpcnN0Qnl0ZSwKLQkgICAgICAgICBieXRlQ291bnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2hoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCdWZfX2luX18sICZ0ZXh0QnVmX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0Qnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIEZvb2wgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICB0ZXh0QnVmX19pbl9sZW5fXyA9IHRleHRCdWZfX2luX2xlbl9fOworICAgIERyYXdUZXh0KHRleHRCdWZfX2luX18sCisgICAgICAgICAgICAgZmlyc3RCeXRlLAorICAgICAgICAgICAgIGJ5dGVDb3VudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0JpdE1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQml0TWFwICpwdHI7Ci0JUHlPYmplY3QgKnNvdXJjZTsKLQlSZWN0IGJvdW5kczsKLQlpbnQgcm93Ynl0ZXM7Ci0JY2hhciAqZGF0YTsKKyAgICBCaXRNYXAgKnB0cjsKKyAgICBQeU9iamVjdCAqc291cmNlOworICAgIFJlY3QgYm91bmRzOworICAgIGludCByb3dieXRlczsKKyAgICBjaGFyICpkYXRhOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8haU8mIiwgJlB5U3RyaW5nX1R5cGUsICZzb3VyY2UsICZyb3dieXRlcywgUHlNYWNfR2V0UmVjdCwKLQkgICAgICAgICAgICAgICAgJmJvdW5kcykgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JZGF0YSA9IFB5U3RyaW5nX0FzU3RyaW5nKHNvdXJjZSk7Ci0JaWYgKChwdHI9KEJpdE1hcCAqKW1hbGxvYyhzaXplb2YoQml0TWFwKSkpID09IE5VTEwgKQotCSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JcHRyLT5iYXNlQWRkciA9IChQdHIpZGF0YTsKLQlwdHItPnJvd0J5dGVzID0gcm93Ynl0ZXM7Ci0JcHRyLT5ib3VuZHMgPSBib3VuZHM7Ci0JaWYgKCAoX3JlcyA9IEJNT2JqX05ldyhwdHIpKSA9PSBOVUxMICkgewotCSAgICAgICAgZnJlZShwdHIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCSgoQml0TWFwT2JqZWN0ICopX3JlcyktPnJlZmVycmVkX29iamVjdCA9IHNvdXJjZTsKLQlQeV9JTkNSRUYoc291cmNlKTsKLQkoKEJpdE1hcE9iamVjdCAqKV9yZXMpLT5yZWZlcnJlZF9iaXRtYXAgPSBwdHI7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8haU8mIiwgJlB5U3RyaW5nX1R5cGUsICZzb3VyY2UsICZyb3dieXRlcywgUHlNYWNfR2V0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgJmJvdW5kcykgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcoc291cmNlKTsKKyAgICBpZiAoKHB0cj0oQml0TWFwICopbWFsbG9jKHNpemVvZihCaXRNYXApKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIHB0ci0+YmFzZUFkZHIgPSAoUHRyKWRhdGE7CisgICAgcHRyLT5yb3dCeXRlcyA9IHJvd2J5dGVzOworICAgIHB0ci0+Ym91bmRzID0gYm91bmRzOworICAgIGlmICggKF9yZXMgPSBCTU9ial9OZXcocHRyKSkgPT0gTlVMTCApIHsKKyAgICAgICAgZnJlZShwdHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgKChCaXRNYXBPYmplY3QgKilfcmVzKS0+cmVmZXJyZWRfb2JqZWN0ID0gc291cmNlOworICAgIFB5X0lOQ1JFRihzb3VyY2UpOworICAgICgoQml0TWFwT2JqZWN0ICopX3JlcyktPnJlZmVycmVkX2JpdG1hcCA9IHB0cjsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Jhd0JpdE1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQml0TWFwICpwdHI7Ci0JUHlPYmplY3QgKnNvdXJjZTsKKyAgICBCaXRNYXAgKnB0cjsKKyAgICBQeU9iamVjdCAqc291cmNlOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8hIiwgJlB5U3RyaW5nX1R5cGUsICZzb3VyY2UpICkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWlmICggUHlTdHJpbmdfU2l6ZShzb3VyY2UpICE9IHNpemVvZihCaXRNYXApICYmIFB5U3RyaW5nX1NpemUoc291cmNlKSAhPSBzaXplb2YoUGl4TWFwKSApIHsKLQkgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JICAgICAgICAgICAgICAgICJBcmd1bWVudCBzaXplIHdhcyAlbGQsIHNob3VsZCBiZSAlbHUgKHNpemVvZiBCaXRNYXApIG9yICVsdSAoc2l6ZW9mIFBpeE1hcCkiLAotCSAgICAgICAgICAgICAgICBQeVN0cmluZ19TaXplKHNvdXJjZSksIHNpemVvZihCaXRNYXApLCBzaXplb2YoUGl4TWFwKSk7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JcHRyID0gKEJpdE1hcFB0cilQeVN0cmluZ19Bc1N0cmluZyhzb3VyY2UpOwotCWlmICggKF9yZXMgPSBCTU9ial9OZXcocHRyKSkgPT0gTlVMTCApIHsKLQkgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQkoKEJpdE1hcE9iamVjdCAqKV9yZXMpLT5yZWZlcnJlZF9vYmplY3QgPSBzb3VyY2U7Ci0JUHlfSU5DUkVGKHNvdXJjZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8hIiwgJlB5U3RyaW5nX1R5cGUsICZzb3VyY2UpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCBQeVN0cmluZ19TaXplKHNvdXJjZSkgIT0gc2l6ZW9mKEJpdE1hcCkgJiYgUHlTdHJpbmdfU2l6ZShzb3VyY2UpICE9IHNpemVvZihQaXhNYXApICkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIkFyZ3VtZW50IHNpemUgd2FzICVsZCwgc2hvdWxkIGJlICVsdSAoc2l6ZW9mIEJpdE1hcCkgb3IgJWx1IChzaXplb2YgUGl4TWFwKSIsCisgICAgICAgICAgICBQeVN0cmluZ19TaXplKHNvdXJjZSksIHNpemVvZihCaXRNYXApLCBzaXplb2YoUGl4TWFwKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwdHIgPSAoQml0TWFwUHRyKVB5U3RyaW5nX0FzU3RyaW5nKHNvdXJjZSk7CisgICAgaWYgKCAoX3JlcyA9IEJNT2JqX05ldyhwdHIpKSA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgKChCaXRNYXBPYmplY3QgKilfcmVzKS0+cmVmZXJyZWRfb2JqZWN0ID0gc291cmNlOworICAgIFB5X0lOQ1JFRihzb3VyY2UpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIFFkX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkdldFBvcnQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR3JhZlB0ciBwb3J0KSIpfSwKLQl7IkdyYWZEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR3JhZkRldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZGV2aWNlKSAtPiBOb25lIil9LAotCXsiU2V0UG9ydEJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UG9ydEJpdHMsIDEsCi0JIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBibSkgLT4gTm9uZSIpfSwKLQl7IlBvcnRTaXplIiwgKFB5Q0Z1bmN0aW9uKVFkX1BvcnRTaXplLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB3aWR0aCwgc2hvcnQgaGVpZ2h0KSAtPiBOb25lIil9LAotCXsiTW92ZVBvcnRUbyIsIChQeUNGdW5jdGlvbilRZF9Nb3ZlUG9ydFRvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBsZWZ0R2xvYmFsLCBzaG9ydCB0b3BHbG9iYWwpIC0+IE5vbmUiKX0sCi0JeyJTZXRPcmlnaW4iLCAoUHlDRnVuY3Rpb24pUWRfU2V0T3JpZ2luLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAotCXsiU2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRZF9TZXRDbGlwLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiR2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRZF9HZXRDbGlwLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiQ2xpcFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfQ2xpcFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7IkJhY2tQYXQiLCAoUHlDRnVuY3Rpb24pUWRfQmFja1BhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCi0JeyJJbml0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0luaXRDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1hY1NldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9NYWNTZXRDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKEN1cnNvciBjcnNyKSAtPiBOb25lIil9LAotCXsiSGlkZUN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9IaWRlQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJNYWNTaG93Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1Nob3dDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik9ic2N1cmVDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfT2JzY3VyZUN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSGlkZVBlbiIsIChQeUNGdW5jdGlvbilRZF9IaWRlUGVuLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTaG93UGVuIiwgKFB5Q0Z1bmN0aW9uKVFkX1Nob3dQZW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldFBlbiIsIChQeUNGdW5jdGlvbilRZF9HZXRQZW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IHB0KSIpfSwKLQl7IkdldFBlblN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBlblN0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQZW5TdGF0ZSBwblN0YXRlKSIpfSwKLQl7IlNldFBlblN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBlblN0YXRlLCAxLAotCSBQeURvY19TVFIoIihQZW5TdGF0ZSBwblN0YXRlKSAtPiBOb25lIil9LAotCXsiUGVuU2l6ZSIsIChQeUNGdW5jdGlvbilRZF9QZW5TaXplLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB3aWR0aCwgc2hvcnQgaGVpZ2h0KSAtPiBOb25lIil9LAotCXsiUGVuTW9kZSIsIChQeUNGdW5jdGlvbilRZF9QZW5Nb2RlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtb2RlKSAtPiBOb25lIil9LAotCXsiUGVuUGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BlblBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCi0JeyJQZW5Ob3JtYWwiLCAoUHlDRnVuY3Rpb24pUWRfUGVuTm9ybWFsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJNb3ZlVG8iLCAoUHlDRnVuY3Rpb24pUWRfTW92ZVRvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAotCXsiTW92ZSIsIChQeUNGdW5jdGlvbilRZF9Nb3ZlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJNYWNMaW5lVG8iLCAoUHlDRnVuY3Rpb24pUWRfTWFjTGluZVRvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAotCXsiTGluZSIsIChQeUNGdW5jdGlvbilRZF9MaW5lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfRm9yZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihsb25nIGNvbG9yKSAtPiBOb25lIil9LAotCXsiQmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0JhY2tDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IkNvbG9yQml0IiwgKFB5Q0Z1bmN0aW9uKVFkX0NvbG9yQml0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB3aGljaEJpdCkgLT4gTm9uZSIpfSwKLQl7Ik1hY1NldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiAoUmVjdCByKSIpfSwKLQl7Ik1hY09mZnNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjT2Zmc2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAotCXsiTWFjSW5zZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0luc2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAotCXsiU2VjdFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfU2VjdFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgc3JjMSwgUmVjdCBzcmMyKSAtPiAoQm9vbGVhbiBfcnYsIFJlY3QgZHN0UmVjdCkiKX0sCi0JeyJNYWNVbmlvblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjVW5pb25SZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHNyYzEsIFJlY3Qgc3JjMikgLT4gKFJlY3QgZHN0UmVjdCkiKX0sCi0JeyJNYWNFcXVhbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjRXF1YWxSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHJlY3QxLCBSZWN0IHJlY3QyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiRW1wdHlSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VtcHR5UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjRnJhbWVSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZyYW1lUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiUGFpbnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiRXJhc2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiTWFjSW52ZXJ0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNJbnZlcnRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJNYWNGaWxsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNGaWxsUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IkZyYW1lT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9GcmFtZU92YWwsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7IlBhaW50T3ZhbCIsIChQeUNGdW5jdGlvbilRZF9QYWludE92YWwsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7IkVyYXNlT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9FcmFzZU92YWwsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7IkludmVydE92YWwiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0T3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiRmlsbE92YWwiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbE92YWwsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCi0JeyJGcmFtZVJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GcmFtZVJvdW5kUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJQYWludFJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9QYWludFJvdW5kUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJFcmFzZVJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9FcmFzZVJvdW5kUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJJbnZlcnRSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0Um91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkZpbGxSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbFJvdW5kUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiRnJhbWVBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVBcmMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgc3RhcnRBbmdsZSwgc2hvcnQgYXJjQW5nbGUpIC0+IE5vbmUiKX0sCi0JeyJQYWludEFyYyIsIChQeUNGdW5jdGlvbilRZF9QYWludEFyYywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKLQl7IkVyYXNlQXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlQXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlKSAtPiBOb25lIil9LAotCXsiSW52ZXJ0QXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydEFyYywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKLQl7IkZpbGxBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbEFyYywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCi0JeyJOZXdSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTmV3UmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7Ik9wZW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfT3BlblJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ2xvc2VSZ24iLCAoUHlDRnVuY3Rpb24pUWRfQ2xvc2VSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJCaXRNYXBUb1JlZ2lvbiIsIChQeUNGdW5jdGlvbilRZF9CaXRNYXBUb1JlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbiwgQml0TWFwUHRyIGJNYXApIC0+IE5vbmUiKX0sCi0JeyJSZ25Ub0hhbmRsZSIsIChQeUNGdW5jdGlvbilRZF9SZ25Ub0hhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbiwgSGFuZGxlIGZsYXR0ZW5lZFJnbkRhdGFIZGwpIC0+IE5vbmUiKX0sCi0JeyJEaXNwb3NlUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJNYWNDb3B5UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0NvcHlSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ24sIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJTZXRFbXB0eVJnbiIsIChQeUNGdW5jdGlvbilRZF9TZXRFbXB0eVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY1NldFJlY3RSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2V0UmVjdFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiBOb25lIil9LAotCXsiUmVjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9SZWN0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJNYWNPZmZzZXRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjT2Zmc2V0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJJbnNldFJnbiIsIChQeUNGdW5jdGlvbilRZF9JbnNldFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAotCXsiU2VjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9TZWN0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJNYWNVbmlvblJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNVbmlvblJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAotCXsiRGlmZlJnbiIsIChQeUNGdW5jdGlvbilRZF9EaWZmUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJNYWNYb3JSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjWG9yUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJSZWN0SW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfUmVjdEluUmduLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJNYWNFcXVhbFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNFcXVhbFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbkEsIFJnbkhhbmRsZSByZ25CKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiRW1wdHlSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRW1wdHlSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJNYWNGcmFtZVJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNGcmFtZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY1BhaW50UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1BhaW50UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiRXJhc2VSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJNYWNJbnZlcnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjSW52ZXJ0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiTWFjRmlsbFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNGaWxsUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IlNjcm9sbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfU2Nyb2xsUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYsIFJnbkhhbmRsZSB1cGRhdGVSZ24pIC0+IE5vbmUiKX0sCi0JeyJDb3B5Qml0cyIsIChQeUNGdW5jdGlvbilRZF9Db3B5Qml0cywgMSwKLQkgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIEJpdE1hcFB0ciBkc3RCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2tSZ24pIC0+IE5vbmUiKX0sCi0JeyJDb3B5TWFzayIsIChQeUNGdW5jdGlvbilRZF9Db3B5TWFzaywgMSwKLQkgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIEJpdE1hcFB0ciBtYXNrQml0cywgQml0TWFwUHRyIGRzdEJpdHMsIFJlY3Qgc3JjUmVjdCwgUmVjdCBtYXNrUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiBOb25lIil9LAotCXsiT3BlblBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfT3BlblBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcGljRnJhbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IlBpY0NvbW1lbnQiLCAoUHlDRnVuY3Rpb24pUWRfUGljQ29tbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQga2luZCwgc2hvcnQgZGF0YVNpemUsIEhhbmRsZSBkYXRhSGFuZGxlKSAtPiBOb25lIil9LAotCXsiQ2xvc2VQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Nsb3NlUGljdHVyZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRHJhd1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfRHJhd1BpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBteVBpY3R1cmUsIFJlY3QgZHN0UmVjdCkgLT4gTm9uZSIpfSwKLQl7IktpbGxQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0tpbGxQaWN0dXJlLCAxLAotCSBQeURvY19TVFIoIihQaWNIYW5kbGUgbXlQaWN0dXJlKSAtPiBOb25lIil9LAotCXsiT3BlblBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfT3BlblBvbHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBvbHlIYW5kbGUgX3J2KSIpfSwKLQl7IkNsb3NlUG9seSIsIChQeUNGdW5jdGlvbilRZF9DbG9zZVBvbHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IktpbGxQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0tpbGxQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCi0JeyJPZmZzZXRQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX09mZnNldFBvbHksIDEsCi0JIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAotCXsiRnJhbWVQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAotCXsiUGFpbnRQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50UG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAotCXsiRXJhc2VQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAotCXsiSW52ZXJ0UG9seSIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCi0JeyJGaWxsUG9seSIsIChQeUNGdW5jdGlvbilRZF9GaWxsUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IlNldFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFB0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiAoUG9pbnQgcHQpIil9LAotCXsiTG9jYWxUb0dsb2JhbCIsIChQeUNGdW5jdGlvbilRZF9Mb2NhbFRvR2xvYmFsLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKFBvaW50IHB0KSIpfSwKLQl7Ikdsb2JhbFRvTG9jYWwiLCAoUHlDRnVuY3Rpb24pUWRfR2xvYmFsVG9Mb2NhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChQb2ludCBwdCkiKX0sCi0JeyJSYW5kb20iLCAoUHlDRnVuY3Rpb24pUWRfUmFuZG9tLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiTWFjR2V0UGl4ZWwiLCAoUHlDRnVuY3Rpb24pUWRfTWFjR2V0UGl4ZWwsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTY2FsZVB0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NjYWxlUHQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gKFBvaW50IHB0KSIpfSwKLQl7Ik1hcFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFB0LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChQb2ludCBwdCkiKX0sCi0JeyJNYXBSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChSZWN0IHIpIil9LAotCXsiTWFwUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCi0JeyJNYXBQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFBvbHksIDEsCi0JIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCi0JeyJTdGRCaXRzIiwgKFB5Q0Z1bmN0aW9uKVFkX1N0ZEJpdHMsIDEsCi0JIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBzcmNCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2tSZ24pIC0+IE5vbmUiKX0sCi0JeyJBZGRQdCIsIChQeUNGdW5jdGlvbilRZF9BZGRQdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3JjLCBQb2ludCBkc3QpIC0+IChQb2ludCBkc3QpIil9LAotCXsiRXF1YWxQdCIsIChQeUNGdW5jdGlvbilRZF9FcXVhbFB0LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdDEsIFBvaW50IHB0MikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik1hY1B0SW5SZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1B0SW5SZWN0LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCwgUmVjdCByKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiUHQyUmVjdCIsIChQeUNGdW5jdGlvbilRZF9QdDJSZWN0LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdDEsIFBvaW50IHB0MikgLT4gKFJlY3QgZHN0UmVjdCkiKX0sCi0JeyJQdFRvQW5nbGUiLCAoUHlDRnVuY3Rpb24pUWRfUHRUb0FuZ2xlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIFBvaW50IHB0KSAtPiAoc2hvcnQgYW5nbGUpIil9LAotCXsiU3ViUHQiLCAoUHlDRnVuY3Rpb24pUWRfU3ViUHQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHNyYywgUG9pbnQgZHN0KSAtPiAoUG9pbnQgZHN0KSIpfSwKLQl7IlB0SW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfUHRJblJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJOZXdQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUWRfTmV3UGl4TWFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQaXhNYXBIYW5kbGUgX3J2KSIpfSwKLQl7IkRpc3Bvc2VQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZVBpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAotCXsiQ29weVBpeE1hcCIsIChQeUNGdW5jdGlvbilRZF9Db3B5UGl4TWFwLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjUE0sIFBpeE1hcEhhbmRsZSBkc3RQTSkgLT4gTm9uZSIpfSwKLQl7Ik5ld1BpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9OZXdQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAotCXsiRGlzcG9zZVBpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJDb3B5UGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBzcmNQUCwgUGl4UGF0SGFuZGxlIGRzdFBQKSAtPiBOb25lIil9LAotCXsiUGVuUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BlblBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAotCXsiQmFja1BpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9CYWNrUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJHZXRQaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBwYXRJRCkgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAotCXsiTWFrZVJHQlBhdCIsIChQeUNGdW5jdGlvbilRZF9NYWtlUkdCUGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHAsIFJHQkNvbG9yIG15Q29sb3IpIC0+IE5vbmUiKX0sCi0JeyJGaWxsQ1JlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKLQl7IkZpbGxDT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ092YWwsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAotCXsiRmlsbENSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSb3VuZFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgb3ZhbFdpZHRoLCBzaG9ydCBvdmFsSGVpZ2h0LCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJGaWxsQ0FyYyIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ0FyYywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAotCXsiRmlsbENSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKLQl7IkZpbGxDUG9seSIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1BvbHksIDEsCi0JIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAotCXsiUkdCRm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX1JHQkZvcmVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCi0JeyJSR0JCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfUkdCQmFja0NvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IlNldENQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9TZXRDUGl4ZWwsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYsIFJHQkNvbG9yIGNQaXgpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0UGl4IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBvcnRQaXgsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gTm9uZSIpfSwKLQl7IkdldENQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9HZXRDUGl4ZWwsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChSR0JDb2xvciBjUGl4KSIpfSwKLQl7IkdldEZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9HZXRGb3JlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGNvbG9yKSIpfSwKLQl7IkdldEJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilRZF9HZXRCYWNrQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGNvbG9yKSIpfSwKLQl7Ik9wQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfT3BDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCi0JeyJIaWxpdGVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9IaWxpdGVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCi0JeyJEaXNwb3NlQ1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VDVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY1RhYmxlKSAtPiBOb25lIil9LAotCXsiR2V0Q1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENUYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY3RJRCkgLT4gKENUYWJIYW5kbGUgX3J2KSIpfSwKLQl7IkdldENDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Q0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY3JzcklEKSAtPiAoQ0Nyc3JIYW5kbGUgX3J2KSIpfSwKLQl7IlNldENDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQ0Nyc3JIYW5kbGUgY0Nyc3IpIC0+IE5vbmUiKX0sCi0JeyJBbGxvY0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9BbGxvY0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRGlzcG9zZUNDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZUNDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKENDcnNySGFuZGxlIGNDcnNyKSAtPiBOb25lIil9LAotCXsiR2V0TWF4RGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldE1heERldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBnbG9iYWxSZWN0KSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkdldENUU2VlZCIsIChQeUNGdW5jdGlvbilRZF9HZXRDVFNlZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldERldmljZUxpc3QiLCAoUHlDRnVuY3Rpb24pUWRfR2V0RGV2aWNlTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE1haW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0TWFpbkRldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE5leHREZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0TmV4dERldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgY3VyRGV2aWNlKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IlRlc3REZXZpY2VBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pUWRfVGVzdERldmljZUF0dHJpYnV0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBzaG9ydCBhdHRyaWJ1dGUpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXREZXZpY2VBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pUWRfU2V0RGV2aWNlQXR0cmlidXRlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIHNob3J0IGF0dHJpYnV0ZSwgQm9vbGVhbiB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkluaXRHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0luaXRHRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBxZFJlZk51bSwgbG9uZyBtb2RlLCBHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCi0JeyJOZXdHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX05ld0dEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgbG9uZyBtb2RlKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkRpc3Bvc2VHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VHRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCi0JeyJTZXRHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldEdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkKSAtPiBOb25lIil9LAotCXsiR2V0R0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9HZXRHRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiQ29sb3IySW5kZXgiLCAoUHlDRnVuY3Rpb24pUWRfQ29sb3IySW5kZXgsIDEsCi0JIFB5RG9jX1NUUigiKFJHQkNvbG9yIG15Q29sb3IpIC0+IChsb25nIF9ydikiKX0sCi0JeyJJbmRleDJDb2xvciIsIChQeUNGdW5jdGlvbilRZF9JbmRleDJDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKFJHQkNvbG9yIGFDb2xvcikiKX0sCi0JeyJJbnZlcnRDb2xvciIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgbXlDb2xvcikiKX0sCi0JeyJSZWFsQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfUmVhbENvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFN1YlRhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFN1YlRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDVGFiSGFuZGxlIG15Q29sb3JzLCBzaG9ydCBpVGFiUmVzLCBDVGFiSGFuZGxlIHRhcmdldFRibCkgLT4gTm9uZSIpfSwKLQl7Ik1ha2VJVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfTWFrZUlUYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBjVGFiSCwgSVRhYkhhbmRsZSBpVGFiSCwgc2hvcnQgcmVzKSAtPiBOb25lIil9LAotCXsiU2V0Q2xpZW50SUQiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q2xpZW50SUQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGlkKSAtPiBOb25lIil9LAotCXsiUHJvdGVjdEVudHJ5IiwgKFB5Q0Z1bmN0aW9uKVFkX1Byb3RlY3RFbnRyeSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIEJvb2xlYW4gcHJvdGVjdCkgLT4gTm9uZSIpfSwKLQl7IlJlc2VydmVFbnRyeSIsIChQeUNGdW5jdGlvbilRZF9SZXNlcnZlRW50cnksIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBCb29sZWFuIHJlc2VydmUpIC0+IE5vbmUiKX0sCi0JeyJRREVycm9yIiwgKFB5Q0Z1bmN0aW9uKVFkX1FERXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJDb3B5RGVlcE1hc2siLCAoUHlDRnVuY3Rpb24pUWRfQ29weURlZXBNYXNrLCAxLAotCSBQeURvY19TVFIoIihCaXRNYXBQdHIgc3JjQml0cywgQml0TWFwUHRyIG1hc2tCaXRzLCBCaXRNYXBQdHIgZHN0Qml0cywgUmVjdCBzcmNSZWN0LCBSZWN0IG1hc2tSZWN0LCBSZWN0IGRzdFJlY3QsIHNob3J0IG1vZGUsIFJnbkhhbmRsZSBtYXNrUmduKSAtPiBOb25lIil9LAotCXsiR2V0UGF0dGVybiIsIChQeUNGdW5jdGlvbilRZF9HZXRQYXR0ZXJuLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBwYXR0ZXJuSUQpIC0+IChQYXRIYW5kbGUgX3J2KSIpfSwKLQl7Ik1hY0dldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9NYWNHZXRDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGN1cnNvcklEKSAtPiAoQ3Vyc0hhbmRsZSBfcnYpIil9LAotCXsiR2V0UGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9HZXRQaWN0dXJlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBwaWN0dXJlSUQpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IkRlbHRhUG9pbnQiLCAoUHlDRnVuY3Rpb24pUWRfRGVsdGFQb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHRBLCBQb2ludCBwdEIpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTaGllbGRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2hpZWxkQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHNoaWVsZFJlY3QsIFBvaW50IG9mZnNldFB0KSAtPiBOb25lIil9LAotCXsiU2NyZWVuUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX1NjcmVlblJlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgc2NybkhSZXMsIHNob3J0IHNjcm5WUmVzKSIpfSwKLQl7IkdldEluZFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pUWRfR2V0SW5kUGF0dGVybiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcGF0dGVybkxpc3RJRCwgc2hvcnQgaW5kZXgpIC0+IChQYXR0ZXJuIHRoZVBhdCkiKX0sCi0JeyJTbG9wZUZyb21BbmdsZSIsIChQeUNGdW5jdGlvbilRZF9TbG9wZUZyb21BbmdsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgYW5nbGUpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiQW5nbGVGcm9tU2xvcGUiLCAoUHlDRnVuY3Rpb24pUWRfQW5nbGVGcm9tU2xvcGUsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHNsb3BlKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFBpeEJvdW5kcyIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwaXhNYXApIC0+IChSZWN0IGJvdW5kcykiKX0sCi0JeyJHZXRQaXhEZXB0aCIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhEZXB0aCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBpeE1hcCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRRREdsb2JhbHNSYW5kb21TZWVkIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc1JhbmRvbVNlZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldFFER2xvYmFsc1NjcmVlbkJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzU2NyZWVuQml0cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQml0TWFwIHNjcmVlbkJpdHMpIil9LAotCXsiR2V0UURHbG9iYWxzQXJyb3ciLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzQXJyb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEN1cnNvciBhcnJvdykiKX0sCi0JeyJHZXRRREdsb2JhbHNEYXJrR3JheSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNEYXJrR3JheSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBka0dyYXkpIil9LAotCXsiR2V0UURHbG9iYWxzTGlnaHRHcmF5IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0xpZ2h0R3JheSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBsdEdyYXkpIil9LAotCXsiR2V0UURHbG9iYWxzR3JheSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNHcmF5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIGdyYXkpIil9LAotCXsiR2V0UURHbG9iYWxzQmxhY2siLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzQmxhY2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gYmxhY2spIil9LAotCXsiR2V0UURHbG9iYWxzV2hpdGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzV2hpdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gd2hpdGUpIil9LAotCXsiR2V0UURHbG9iYWxzVGhlUG9ydCIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNUaGVQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAotCXsiU2V0UURHbG9iYWxzUmFuZG9tU2VlZCIsIChQeUNGdW5jdGlvbilRZF9TZXRRREdsb2JhbHNSYW5kb21TZWVkLCAxLAotCSBQeURvY19TVFIoIihsb25nIHJhbmRvbVNlZWQpIC0+IE5vbmUiKX0sCi0JeyJTZXRRREdsb2JhbHNBcnJvdyIsIChQeUNGdW5jdGlvbilRZF9TZXRRREdsb2JhbHNBcnJvdywgMSwKLQkgUHlEb2NfU1RSKCIoQ3Vyc29yIGFycm93KSAtPiBOb25lIil9LAotCXsiR2V0UmVnaW9uQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFJlZ2lvbkJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7IklzUmVnaW9uUmVjdGFuZ3VsYXIiLCAoUHlDRnVuY3Rpb24pUWRfSXNSZWdpb25SZWN0YW5ndWxhciwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNyZWF0ZU5ld1BvcnQiLCAoUHlDRnVuY3Rpb24pUWRfQ3JlYXRlTmV3UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKLQl7IlNldFFERXJyb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UURFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoT1NFcnIgZXJyKSAtPiBOb25lIil9LAotCXsiTE1HZXRTY3JWUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0U2NyVlJlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJMTVNldFNjclZSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRTY3JWUmVzLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldFNjckhSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRTY3JIUmVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IkxNU2V0U2NySFJlcyIsIChQeUNGdW5jdGlvbilRZF9MTVNldFNjckhSZXMsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0TWFpbkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldE1haW5EZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCi0JeyJMTVNldE1haW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRNYWluRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0RGV2aWNlTGlzdCIsIChQeUNGdW5jdGlvbilRZF9MTUdldERldmljZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCi0JeyJMTVNldERldmljZUxpc3QiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXREZXZpY2VMaXN0LCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0UURDb2xvcnMiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRRRENvbG9ycywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJMTVNldFFEQ29sb3JzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0UURDb2xvcnMsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0V2lkdGhMaXN0SGFuZCIsIChQeUNGdW5jdGlvbilRZF9MTUdldFdpZHRoTGlzdEhhbmQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiTE1TZXRXaWR0aExpc3RIYW5kIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0V2lkdGhMaXN0SGFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRIaWxpdGVNb2RlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0SGlsaXRlTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKLQl7IkxNU2V0SGlsaXRlTW9kZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldEhpbGl0ZU1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRXaWR0aFRhYkhhbmRsZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldFdpZHRoVGFiSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0V2lkdGhUYWJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRXaWR0aFRhYkhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRMYXN0U1BFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9MTUdldExhc3RTUEV4dHJhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkxNU2V0TGFzdFNQRXh0cmEiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRMYXN0U1BFeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDMyIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRMYXN0Rk9ORCIsIChQeUNGdW5jdGlvbilRZF9MTUdldExhc3RGT05ELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0TGFzdEZPTkQiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRMYXN0Rk9ORCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldEZyYWN0RW5hYmxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAotCXsiTE1TZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldEZyYWN0RW5hYmxlLCAxLAotCSBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0VGhlR0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldFRoZUdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCi0JeyJMTVNldFRoZUdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRUaGVHRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0SGlsaXRlUkdCIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0SGlsaXRlUkdCLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBoaWxpdGVSR0JWYWx1ZSkiKX0sCi0JeyJMTVNldEhpbGl0ZVJHQiIsIChQeUNGdW5jdGlvbilRZF9MTVNldEhpbGl0ZVJHQiwgMSwKLQkgUHlEb2NfU1RSKCIoUkdCQ29sb3IgaGlsaXRlUkdCVmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEN1cnNvck5ldyIsIChQeUNGdW5jdGlvbilRZF9MTUdldEN1cnNvck5ldywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTE1TZXRDdXJzb3JOZXciLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRDdXJzb3JOZXcsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJUZXh0Rm9udCIsIChQeUNGdW5jdGlvbilRZF9UZXh0Rm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZm9udCkgLT4gTm9uZSIpfSwKLQl7IlRleHRGYWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRGYWNlLCAxLAotCSBQeURvY19TVFIoIihTdHlsZVBhcmFtZXRlciBmYWNlKSAtPiBOb25lIil9LAotCXsiVGV4dE1vZGUiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dE1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1vZGUpIC0+IE5vbmUiKX0sCi0JeyJUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilRZF9UZXh0U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgc2l6ZSkgLT4gTm9uZSIpfSwKLQl7IlNwYWNlRXh0cmEiLCAoUHlDRnVuY3Rpb24pUWRfU3BhY2VFeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgZXh0cmEpIC0+IE5vbmUiKX0sCi0JeyJEcmF3Q2hhciIsIChQeUNGdW5jdGlvbilRZF9EcmF3Q2hhciwgMSwKLQkgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gTm9uZSIpfSwKLQl7IkRyYXdTdHJpbmciLCAoUHlDRnVuY3Rpb24pUWRfRHJhd1N0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHMpIC0+IE5vbmUiKX0sCi0JeyJNYWNEcmF3VGV4dCIsIChQeUNGdW5jdGlvbilRZF9NYWNEcmF3VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiBOb25lIil9LAotCXsiQ2hhcldpZHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX0NoYXJXaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJTdHJpbmdXaWR0aCIsIChQeUNGdW5jdGlvbilRZF9TdHJpbmdXaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHMpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiVGV4dFdpZHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRXaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldEZvbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEZvbnRJbmZvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGb250SW5mbyBpbmZvKSIpfSwKLQl7IkNoYXJFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9DaGFyRXh0cmEsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIGV4dHJhKSAtPiBOb25lIil9LAotCXsiVHJ1bmNTdHJpbmciLCAoUHlDRnVuY3Rpb24pUWRfVHJ1bmNTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpZHRoLCBTdHIyNTUgdGhlU3RyaW5nLCBUcnVuY0NvZGUgdHJ1bmNXaGVyZSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJTZXRQb3J0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYWZQdHIgdGhlUG9ydCkgLT4gTm9uZSIpfSwKLQl7IkdldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9HZXRDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGN1cnNvcklEKSAtPiAoQ3Vyc0hhbmRsZSBfcnYpIil9LAotCXsiU2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQ3Vyc29yIGNyc3IpIC0+IE5vbmUiKX0sCi0JeyJTaG93Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX1Nob3dDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkxpbmVUbyIsIChQeUNGdW5jdGlvbilRZF9MaW5lVG8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCi0JeyJTZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGxlZnQsIHNob3J0IHRvcCwgc2hvcnQgcmlnaHQsIHNob3J0IGJvdHRvbSkgLT4gKFJlY3QgcikiKX0sCi0JeyJPZmZzZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX09mZnNldFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiAoUmVjdCByKSIpfSwKLQl7Ikluc2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9JbnNldFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiAoUmVjdCByKSIpfSwKLQl7IlVuaW9uUmVjdCIsIChQeUNGdW5jdGlvbilRZF9VbmlvblJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgc3JjMSwgUmVjdCBzcmMyKSAtPiAoUmVjdCBkc3RSZWN0KSIpfSwKLQl7IkVxdWFsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9FcXVhbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcmVjdDEsIFJlY3QgcmVjdDIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJGcmFtZVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJJbnZlcnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7IkZpbGxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiQ29weVJnbiIsIChQeUNGdW5jdGlvbilRZF9Db3B5UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAotCXsiU2V0UmVjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9TZXRSZWN0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20pIC0+IE5vbmUiKX0sCi0JeyJPZmZzZXRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfT2Zmc2V0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJVbmlvblJnbiIsIChQeUNGdW5jdGlvbilRZF9VbmlvblJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAotCXsiWG9yUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1hvclJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAotCXsiRXF1YWxSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRXF1YWxSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ25BLCBSZ25IYW5kbGUgcmduQikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkZyYW1lUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiUGFpbnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJJbnZlcnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiRmlsbFJnbiIsIChQeUNGdW5jdGlvbilRZF9GaWxsUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IkdldFBpeGVsIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpeGVsLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiUHRJblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfUHRJblJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJEcmF3VGV4dCIsIChQeUNGdW5jdGlvbilRZF9EcmF3VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiBOb25lIil9LAotCXsiQml0TWFwIiwgKFB5Q0Z1bmN0aW9uKVFkX0JpdE1hcCwgMSwKLQkgUHlEb2NfU1RSKCJUYWtlIChzdHJpbmcsIGludCwgUmVjdCkgYXJndW1lbnQgYW5kIGNyZWF0ZSBCaXRNYXAiKX0sCi0JeyJSYXdCaXRNYXAiLCAoUHlDRnVuY3Rpb24pUWRfUmF3Qml0TWFwLCAxLAotCSBQeURvY19TVFIoIlRha2Ugc3RyaW5nIEJpdE1hcCBhbmQgdHVybiBpbnRvIEJpdE1hcCBvYmplY3QiKX0sCisgICAgeyJHZXRQb3J0IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdyYWZQdHIgcG9ydCkiKX0sCisgICAgeyJHcmFmRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dyYWZEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGRldmljZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRCaXRzIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBvcnRCaXRzLCAxLAorICAgICBQeURvY19TVFIoIihCaXRNYXBQdHIgYm0pIC0+IE5vbmUiKX0sCisgICAgeyJQb3J0U2l6ZSIsIChQeUNGdW5jdGlvbilRZF9Qb3J0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgd2lkdGgsIHNob3J0IGhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1vdmVQb3J0VG8iLCAoUHlDRnVuY3Rpb24pUWRfTW92ZVBvcnRUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbGVmdEdsb2JhbCwgc2hvcnQgdG9wR2xvYmFsKSAtPiBOb25lIil9LAorICAgIHsiU2V0T3JpZ2luIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldE9yaWdpbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gTm9uZSIpfSwKKyAgICB7IlNldENsaXAiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q2xpcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldENsaXAiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Q2xpcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkNsaXBSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0NsaXBSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJCYWNrUGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0JhY2tQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAorICAgIHsiSW5pdEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9Jbml0Q3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNTZXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2V0Q3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihDdXJzb3IgY3JzcikgLT4gTm9uZSIpfSwKKyAgICB7IkhpZGVDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfSGlkZUN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTWFjU2hvd0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9NYWNTaG93Q3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJPYnNjdXJlQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX09ic2N1cmVDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkhpZGVQZW4iLCAoUHlDRnVuY3Rpb24pUWRfSGlkZVBlbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2hvd1BlbiIsIChQeUNGdW5jdGlvbilRZF9TaG93UGVuLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRQZW4iLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGVuLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBwdCkiKX0sCisgICAgeyJHZXRQZW5TdGF0ZSIsIChQeUNGdW5jdGlvbilRZF9HZXRQZW5TdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGVuU3RhdGUgcG5TdGF0ZSkiKX0sCisgICAgeyJTZXRQZW5TdGF0ZSIsIChQeUNGdW5jdGlvbilRZF9TZXRQZW5TdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGVuU3RhdGUgcG5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlBlblNpemUiLCAoUHlDRnVuY3Rpb24pUWRfUGVuU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgd2lkdGgsIHNob3J0IGhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7IlBlbk1vZGUiLCAoUHlDRnVuY3Rpb24pUWRfUGVuTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSkgLT4gTm9uZSIpfSwKKyAgICB7IlBlblBhdCIsIChQeUNGdW5jdGlvbilRZF9QZW5QYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAorICAgIHsiUGVuTm9ybWFsIiwgKFB5Q0Z1bmN0aW9uKVFkX1Blbk5vcm1hbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTW92ZVRvIiwgKFB5Q0Z1bmN0aW9uKVFkX01vdmVUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gTm9uZSIpfSwKKyAgICB7Ik1vdmUiLCAoUHlDRnVuY3Rpb24pUWRfTW92ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAorICAgIHsiTWFjTGluZVRvIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0xpbmVUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gTm9uZSIpfSwKKyAgICB7IkxpbmUiLCAoUHlDRnVuY3Rpb24pUWRfTGluZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAorICAgIHsiRm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZvcmVDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBjb2xvcikgLT4gTm9uZSIpfSwKKyAgICB7IkJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilRZF9CYWNrQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJDb2xvckJpdCIsIChQeUNGdW5jdGlvbilRZF9Db2xvckJpdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgd2hpY2hCaXQpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNTZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1NldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGxlZnQsIHNob3J0IHRvcCwgc2hvcnQgcmlnaHQsIHNob3J0IGJvdHRvbSkgLT4gKFJlY3QgcikiKX0sCisgICAgeyJNYWNPZmZzZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY09mZnNldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiAoUmVjdCByKSIpfSwKKyAgICB7Ik1hY0luc2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNJbnNldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiAoUmVjdCByKSIpfSwKKyAgICB7IlNlY3RSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NlY3RSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHNyYzEsIFJlY3Qgc3JjMikgLT4gKEJvb2xlYW4gX3J2LCBSZWN0IGRzdFJlY3QpIil9LAorICAgIHsiTWFjVW5pb25SZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1VuaW9uUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBzcmMxLCBSZWN0IHNyYzIpIC0+IChSZWN0IGRzdFJlY3QpIil9LAorICAgIHsiTWFjRXF1YWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0VxdWFsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByZWN0MSwgUmVjdCByZWN0MikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkVtcHR5UmVjdCIsIChQeUNGdW5jdGlvbilRZF9FbXB0eVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ik1hY0ZyYW1lUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNGcmFtZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IlBhaW50UmVjdCIsIChQeUNGdW5jdGlvbilRZF9QYWludFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkVyYXNlUmVjdCIsIChQeUNGdW5jdGlvbilRZF9FcmFzZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY0ludmVydFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjSW52ZXJ0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiTWFjRmlsbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjRmlsbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgciwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJGcmFtZU92YWwiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVPdmFsLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJQYWludE92YWwiLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRPdmFsLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJFcmFzZU92YWwiLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VPdmFsLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJJbnZlcnRPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydE92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxPdmFsLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAorICAgIHsiRnJhbWVSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVSb3VuZFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgb3ZhbFdpZHRoLCBzaG9ydCBvdmFsSGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRSb3VuZFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgb3ZhbFdpZHRoLCBzaG9ydCBvdmFsSGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiRXJhc2VSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VSb3VuZFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgb3ZhbFdpZHRoLCBzaG9ydCBvdmFsSGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiSW52ZXJ0Um91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydFJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsUm91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxSb3VuZFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgb3ZhbFdpZHRoLCBzaG9ydCBvdmFsSGVpZ2h0LCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IkZyYW1lQXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lQXJjLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlKSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRBcmMiLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRBcmMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgc3RhcnRBbmdsZSwgc2hvcnQgYXJjQW5nbGUpIC0+IE5vbmUiKX0sCisgICAgeyJFcmFzZUFyYyIsIChQeUNGdW5jdGlvbilRZF9FcmFzZUFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkludmVydEFyYyIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRBcmMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgc3RhcnRBbmdsZSwgc2hvcnQgYXJjQW5nbGUpIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsQXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxBcmMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgc3RhcnRBbmdsZSwgc2hvcnQgYXJjQW5nbGUsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAorICAgIHsiTmV3UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX05ld1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJPcGVuUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX09wZW5SZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNsb3NlUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0Nsb3NlUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiQml0TWFwVG9SZWdpb24iLCAoUHlDRnVuY3Rpb24pUWRfQml0TWFwVG9SZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24sIEJpdE1hcFB0ciBiTWFwKSAtPiBOb25lIil9LAorICAgIHsiUmduVG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUWRfUmduVG9IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24sIEhhbmRsZSBmbGF0dGVuZWRSZ25EYXRhSGRsKSAtPiBOb25lIil9LAorICAgIHsiRGlzcG9zZVJnbiIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiTWFjQ29weVJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNDb3B5UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiU2V0RW1wdHlSZ24iLCAoUHlDRnVuY3Rpb24pUWRfU2V0RW1wdHlSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNTZXRSZWN0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1NldFJlY3RSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIHNob3J0IGxlZnQsIHNob3J0IHRvcCwgc2hvcnQgcmlnaHQsIHNob3J0IGJvdHRvbSkgLT4gTm9uZSIpfSwKKyAgICB7IlJlY3RSZ24iLCAoUHlDRnVuY3Rpb24pUWRfUmVjdFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiTWFjT2Zmc2V0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY09mZnNldFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAorICAgIHsiSW5zZXRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfSW5zZXRSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKKyAgICB7IlNlY3RSZ24iLCAoUHlDRnVuY3Rpb24pUWRfU2VjdFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiTWFjVW5pb25SZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjVW5pb25SZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkRpZmZSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRGlmZlJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiTWFjWG9yUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1hvclJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiUmVjdEluUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1JlY3RJblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBSZ25IYW5kbGUgcmduKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTWFjRXF1YWxSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjRXF1YWxSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ25BLCBSZ25IYW5kbGUgcmduQikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkVtcHR5UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0VtcHR5UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTWFjRnJhbWVSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjRnJhbWVSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNQYWludFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNQYWludFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkVyYXNlUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiTWFjSW52ZXJ0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ludmVydFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY0ZpbGxSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjRmlsbFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJTY3JvbGxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1Njcm9sbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgZGgsIHNob3J0IGR2LCBSZ25IYW5kbGUgdXBkYXRlUmduKSAtPiBOb25lIil9LAorICAgIHsiQ29weUJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfQ29weUJpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBzcmNCaXRzLCBCaXRNYXBQdHIgZHN0Qml0cywgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QsIHNob3J0IG1vZGUsIFJnbkhhbmRsZSBtYXNrUmduKSAtPiBOb25lIil9LAorICAgIHsiQ29weU1hc2siLCAoUHlDRnVuY3Rpb24pUWRfQ29weU1hc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBzcmNCaXRzLCBCaXRNYXBQdHIgbWFza0JpdHMsIEJpdE1hcFB0ciBkc3RCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgbWFza1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7Ik9wZW5QaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX09wZW5QaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHBpY0ZyYW1lKSAtPiAoUGljSGFuZGxlIF9ydikiKX0sCisgICAgeyJQaWNDb21tZW50IiwgKFB5Q0Z1bmN0aW9uKVFkX1BpY0NvbW1lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGtpbmQsIHNob3J0IGRhdGFTaXplLCBIYW5kbGUgZGF0YUhhbmRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNsb3NlUGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9DbG9zZVBpY3R1cmUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0RyYXdQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihQaWNIYW5kbGUgbXlQaWN0dXJlLCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJLaWxsUGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9LaWxsUGljdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGljSGFuZGxlIG15UGljdHVyZSkgLT4gTm9uZSIpfSwKKyAgICB7Ik9wZW5Qb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX09wZW5Qb2x5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2x5SGFuZGxlIF9ydikiKX0sCisgICAgeyJDbG9zZVBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfQ2xvc2VQb2x5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJLaWxsUG9seSIsIChQeUNGdW5jdGlvbilRZF9LaWxsUG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAorICAgIHsiT2Zmc2V0UG9seSIsIChQeUNGdW5jdGlvbilRZF9PZmZzZXRQb2x5LCAxLAorICAgICBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHksIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKKyAgICB7IkZyYW1lUG9seSIsIChQeUNGdW5jdGlvbilRZF9GcmFtZVBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSkgLT4gTm9uZSIpfSwKKyAgICB7IlBhaW50UG9seSIsIChQeUNGdW5jdGlvbilRZF9QYWludFBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSkgLT4gTm9uZSIpfSwKKyAgICB7IkVyYXNlUG9seSIsIChQeUNGdW5jdGlvbilRZF9FcmFzZVBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSkgLT4gTm9uZSIpfSwKKyAgICB7IkludmVydFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0UG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAorICAgIHsiRmlsbFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbFBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQdCIsIChQeUNGdW5jdGlvbilRZF9TZXRQdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gKFBvaW50IHB0KSIpfSwKKyAgICB7IkxvY2FsVG9HbG9iYWwiLCAoUHlDRnVuY3Rpb24pUWRfTG9jYWxUb0dsb2JhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChQb2ludCBwdCkiKX0sCisgICAgeyJHbG9iYWxUb0xvY2FsIiwgKFB5Q0Z1bmN0aW9uKVFkX0dsb2JhbFRvTG9jYWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHB0KSAtPiAoUG9pbnQgcHQpIil9LAorICAgIHsiUmFuZG9tIiwgKFB5Q0Z1bmN0aW9uKVFkX1JhbmRvbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7Ik1hY0dldFBpeGVsIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0dldFBpeGVsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2NhbGVQdCIsIChQeUNGdW5jdGlvbilRZF9TY2FsZVB0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChQb2ludCBwdCkiKX0sCisgICAgeyJNYXBQdCIsIChQeUNGdW5jdGlvbilRZF9NYXBQdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiAoUG9pbnQgcHQpIil9LAorICAgIHsiTWFwUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYXBSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiAoUmVjdCByKSIpfSwKKyAgICB7Ik1hcFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYXBSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiBOb25lIil9LAorICAgIHsiTWFwUG9seSIsIChQeUNGdW5jdGlvbilRZF9NYXBQb2x5LCAxLAorICAgICBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHksIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiBOb25lIil9LAorICAgIHsiU3RkQml0cyIsIChQeUNGdW5jdGlvbilRZF9TdGRCaXRzLCAxLAorICAgICBQeURvY19TVFIoIihCaXRNYXBQdHIgc3JjQml0cywgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QsIHNob3J0IG1vZGUsIFJnbkhhbmRsZSBtYXNrUmduKSAtPiBOb25lIil9LAorICAgIHsiQWRkUHQiLCAoUHlDRnVuY3Rpb24pUWRfQWRkUHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHNyYywgUG9pbnQgZHN0KSAtPiAoUG9pbnQgZHN0KSIpfSwKKyAgICB7IkVxdWFsUHQiLCAoUHlDRnVuY3Rpb24pUWRfRXF1YWxQdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQxLCBQb2ludCBwdDIpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNQdEluUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNQdEluUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJlY3QgcikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlB0MlJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfUHQyUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQxLCBQb2ludCBwdDIpIC0+IChSZWN0IGRzdFJlY3QpIil9LAorICAgIHsiUHRUb0FuZ2xlIiwgKFB5Q0Z1bmN0aW9uKVFkX1B0VG9BbmdsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBQb2ludCBwdCkgLT4gKHNob3J0IGFuZ2xlKSIpfSwKKyAgICB7IlN1YlB0IiwgKFB5Q0Z1bmN0aW9uKVFkX1N1YlB0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzcmMsIFBvaW50IGRzdCkgLT4gKFBvaW50IGRzdCkiKX0sCisgICAgeyJQdEluUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1B0SW5SZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZ25IYW5kbGUgcmduKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTmV3UGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKVFkX05ld1BpeE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGl4TWFwSGFuZGxlIF9ydikiKX0sCisgICAgeyJEaXNwb3NlUGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUWRfQ29weVBpeE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHNyY1BNLCBQaXhNYXBIYW5kbGUgZHN0UE0pIC0+IE5vbmUiKX0sCisgICAgeyJOZXdQaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfTmV3UGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQaXhQYXRIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRpc3Bvc2VQaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZVBpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiQ29weVBpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9Db3B5UGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgc3JjUFAsIFBpeFBhdEhhbmRsZSBkc3RQUCkgLT4gTm9uZSIpfSwKKyAgICB7IlBlblBpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9QZW5QaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKKyAgICB7IkJhY2tQaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfQmFja1BpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcGF0SUQpIC0+IChQaXhQYXRIYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik1ha2VSR0JQYXQiLCAoUHlDRnVuY3Rpb24pUWRfTWFrZVJHQlBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBwLCBSR0JDb2xvciBteUNvbG9yKSAtPiBOb25lIil9LAorICAgIHsiRmlsbENSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsQ092YWwiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENPdmFsLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxDUm91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDUm91bmRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiRmlsbENBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENBcmMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgc3RhcnRBbmdsZSwgc2hvcnQgYXJjQW5nbGUsIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxDUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsQ1BvbHkiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENQb2x5LCAxLAorICAgICBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHksIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKKyAgICB7IlJHQkZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9SR0JGb3JlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJHQkNvbG9yIGNvbG9yKSAtPiBOb25lIil9LAorICAgIHsiUkdCQmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX1JHQkJhY2tDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDUGl4ZWwiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q1BpeGVsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2LCBSR0JDb2xvciBjUGl4KSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFBpeCIsIChQeUNGdW5jdGlvbilRZF9TZXRQb3J0UGl4LCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDUGl4ZWwiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Q1BpeGVsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiAoUkdCQ29sb3IgY1BpeCkiKX0sCisgICAgeyJHZXRGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Rm9yZUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBjb2xvcikiKX0sCisgICAgeyJHZXRCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfR2V0QmFja0NvbG9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBjb2xvcikiKX0sCisgICAgeyJPcENvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX09wQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJHQkNvbG9yIGNvbG9yKSAtPiBOb25lIil9LAorICAgIHsiSGlsaXRlQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfSGlsaXRlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJHQkNvbG9yIGNvbG9yKSAtPiBOb25lIil9LAorICAgIHsiRGlzcG9zZUNUYWJsZSIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlQ1RhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihDVGFiSGFuZGxlIGNUYWJsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENUYWJsZSIsIChQeUNGdW5jdGlvbilRZF9HZXRDVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGN0SUQpIC0+IChDVGFiSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRDQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGNyc3JJRCkgLT4gKENDcnNySGFuZGxlIF9ydikiKX0sCisgICAgeyJTZXRDQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldENDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKENDcnNySGFuZGxlIGNDcnNyKSAtPiBOb25lIil9LAorICAgIHsiQWxsb2NDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfQWxsb2NDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpc3Bvc2VDQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VDQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihDQ3JzckhhbmRsZSBjQ3JzcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1heERldmljZSIsIChQeUNGdW5jdGlvbilRZF9HZXRNYXhEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgZ2xvYmFsUmVjdCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRDVFNlZWQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Q1RTZWVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXREZXZpY2VMaXN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldERldmljZUxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRNYWluRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldE1haW5EZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXROZXh0RGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldE5leHREZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdESGFuZGxlIGN1ckRldmljZSkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJUZXN0RGV2aWNlQXR0cmlidXRlIiwgKFB5Q0Z1bmN0aW9uKVFkX1Rlc3REZXZpY2VBdHRyaWJ1dGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkaCwgc2hvcnQgYXR0cmlidXRlKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0RGV2aWNlQXR0cmlidXRlIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldERldmljZUF0dHJpYnV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBzaG9ydCBhdHRyaWJ1dGUsIEJvb2xlYW4gdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJJbml0R0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9Jbml0R0RldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcWRSZWZOdW0sIGxvbmcgbW9kZSwgR0RIYW5kbGUgZ2RoKSAtPiBOb25lIil9LAorICAgIHsiTmV3R0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9OZXdHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIGxvbmcgbW9kZSkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJEaXNwb3NlR0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlR0RldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoKSAtPiBOb25lIil9LAorICAgIHsiU2V0R0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9TZXRHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSBnZCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0R0RldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkNvbG9yMkluZGV4IiwgKFB5Q0Z1bmN0aW9uKVFkX0NvbG9yMkluZGV4LCAxLAorICAgICBQeURvY19TVFIoIihSR0JDb2xvciBteUNvbG9yKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiSW5kZXgyQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfSW5kZXgyQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgpIC0+IChSR0JDb2xvciBhQ29sb3IpIil9LAorICAgIHsiSW52ZXJ0Q29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0Q29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIG15Q29sb3IpIil9LAorICAgIHsiUmVhbENvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX1JlYWxDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRTdWJUYWJsZSIsIChQeUNGdW5jdGlvbilRZF9HZXRTdWJUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBteUNvbG9ycywgc2hvcnQgaVRhYlJlcywgQ1RhYkhhbmRsZSB0YXJnZXRUYmwpIC0+IE5vbmUiKX0sCisgICAgeyJNYWtlSVRhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX01ha2VJVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY1RhYkgsIElUYWJIYW5kbGUgaVRhYkgsIHNob3J0IHJlcykgLT4gTm9uZSIpfSwKKyAgICB7IlNldENsaWVudElEIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldENsaWVudElELCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpZCkgLT4gTm9uZSIpfSwKKyAgICB7IlByb3RlY3RFbnRyeSIsIChQeUNGdW5jdGlvbilRZF9Qcm90ZWN0RW50cnksIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBCb29sZWFuIHByb3RlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJSZXNlcnZlRW50cnkiLCAoUHlDRnVuY3Rpb24pUWRfUmVzZXJ2ZUVudHJ5LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgQm9vbGVhbiByZXNlcnZlKSAtPiBOb25lIil9LAorICAgIHsiUURFcnJvciIsIChQeUNGdW5jdGlvbilRZF9RREVycm9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiQ29weURlZXBNYXNrIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlEZWVwTWFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIEJpdE1hcFB0ciBtYXNrQml0cywgQml0TWFwUHRyIGRzdEJpdHMsIFJlY3Qgc3JjUmVjdCwgUmVjdCBtYXNrUmVjdCwgUmVjdCBkc3RSZWN0LCBzaG9ydCBtb2RlLCBSZ25IYW5kbGUgbWFza1JnbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGF0dGVybiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcGF0dGVybklEKSAtPiAoUGF0SGFuZGxlIF9ydikiKX0sCisgICAgeyJNYWNHZXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfTWFjR2V0Q3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjdXJzb3JJRCkgLT4gKEN1cnNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGljdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcGljdHVyZUlEKSAtPiAoUGljSGFuZGxlIF9ydikiKX0sCisgICAgeyJEZWx0YVBvaW50IiwgKFB5Q0Z1bmN0aW9uKVFkX0RlbHRhUG9pbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHB0QSwgUG9pbnQgcHRCKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2hpZWxkQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX1NoaWVsZEN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBzaGllbGRSZWN0LCBQb2ludCBvZmZzZXRQdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNjcmVlblJlcyIsIChQeUNGdW5jdGlvbilRZF9TY3JlZW5SZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IHNjcm5IUmVzLCBzaG9ydCBzY3JuVlJlcykiKX0sCisgICAgeyJHZXRJbmRQYXR0ZXJuIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEluZFBhdHRlcm4sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHBhdHRlcm5MaXN0SUQsIHNob3J0IGluZGV4KSAtPiAoUGF0dGVybiB0aGVQYXQpIil9LAorICAgIHsiU2xvcGVGcm9tQW5nbGUiLCAoUHlDRnVuY3Rpb24pUWRfU2xvcGVGcm9tQW5nbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGFuZ2xlKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkFuZ2xlRnJvbVNsb3BlIiwgKFB5Q0Z1bmN0aW9uKVFkX0FuZ2xlRnJvbVNsb3BlLCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCBzbG9wZSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRQaXhCb3VuZHMiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGl4Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcGl4TWFwKSAtPiAoUmVjdCBib3VuZHMpIil9LAorICAgIHsiR2V0UGl4RGVwdGgiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGl4RGVwdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwaXhNYXApIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0UURHbG9iYWxzUmFuZG9tU2VlZCIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNSYW5kb21TZWVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRRREdsb2JhbHNTY3JlZW5CaXRzIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc1NjcmVlbkJpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJpdE1hcCBzY3JlZW5CaXRzKSIpfSwKKyAgICB7IkdldFFER2xvYmFsc0Fycm93IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0Fycm93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDdXJzb3IgYXJyb3cpIil9LAorICAgIHsiR2V0UURHbG9iYWxzRGFya0dyYXkiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzRGFya0dyYXksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gZGtHcmF5KSIpfSwKKyAgICB7IkdldFFER2xvYmFsc0xpZ2h0R3JheSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNMaWdodEdyYXksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gbHRHcmF5KSIpfSwKKyAgICB7IkdldFFER2xvYmFsc0dyYXkiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzR3JheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBncmF5KSIpfSwKKyAgICB7IkdldFFER2xvYmFsc0JsYWNrIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0JsYWNrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIGJsYWNrKSIpfSwKKyAgICB7IkdldFFER2xvYmFsc1doaXRlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc1doaXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIHdoaXRlKSIpfSwKKyAgICB7IkdldFFER2xvYmFsc1RoZVBvcnQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzVGhlUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7IlNldFFER2xvYmFsc1JhbmRvbVNlZWQiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UURHbG9iYWxzUmFuZG9tU2VlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyByYW5kb21TZWVkKSAtPiBOb25lIil9LAorICAgIHsiU2V0UURHbG9iYWxzQXJyb3ciLCAoUHlDRnVuY3Rpb24pUWRfU2V0UURHbG9iYWxzQXJyb3csIDEsCisgICAgIFB5RG9jX1NUUigiKEN1cnNvciBhcnJvdykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFJlZ2lvbkJvdW5kcyIsIChQeUNGdW5jdGlvbilRZF9HZXRSZWdpb25Cb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJJc1JlZ2lvblJlY3Rhbmd1bGFyIiwgKFB5Q0Z1bmN0aW9uKVFkX0lzUmVnaW9uUmVjdGFuZ3VsYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDcmVhdGVOZXdQb3J0IiwgKFB5Q0Z1bmN0aW9uKVFkX0NyZWF0ZU5ld1BvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCisgICAgeyJTZXRRREVycm9yIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFFERXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TRXJyIGVycikgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0U2NyVlJlcyIsIChQeUNGdW5jdGlvbilRZF9MTUdldFNjclZSZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiTE1TZXRTY3JWUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0U2NyVlJlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRTY3JIUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0U2NySFJlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJMTVNldFNjckhSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRTY3JIUmVzLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldE1haW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRNYWluRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAorICAgIHsiTE1TZXRNYWluRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0TWFpbkRldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldERldmljZUxpc3QiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXREZXZpY2VMaXN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAorICAgIHsiTE1TZXREZXZpY2VMaXN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0RGV2aWNlTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldFFEQ29sb3JzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0UURDb2xvcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiTE1TZXRRRENvbG9ycyIsIChQeUNGdW5jdGlvbilRZF9MTVNldFFEQ29sb3JzLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldFdpZHRoTGlzdEhhbmQiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRXaWR0aExpc3RIYW5kLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkxNU2V0V2lkdGhMaXN0SGFuZCIsIChQeUNGdW5jdGlvbilRZF9MTVNldFdpZHRoTGlzdEhhbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0SGlsaXRlTW9kZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldEhpbGl0ZU1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCisgICAgeyJMTVNldEhpbGl0ZU1vZGUiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRIaWxpdGVNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0V2lkdGhUYWJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRXaWR0aFRhYkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldFdpZHRoVGFiSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0V2lkdGhUYWJIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0TGFzdFNQRXh0cmEiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRMYXN0U1BFeHRyYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJMTVNldExhc3RTUEV4dHJhIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0TGFzdFNQRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0TGFzdEZPTkQiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRMYXN0Rk9ORCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldExhc3RGT05EIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0TGFzdEZPTkQsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0RnJhY3RFbmFibGUiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRGcmFjdEVuYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKKyAgICB7IkxNU2V0RnJhY3RFbmFibGUiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRGcmFjdEVuYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDggdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldFRoZUdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRUaGVHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAorICAgIHsiTE1TZXRUaGVHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0VGhlR0RldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldEhpbGl0ZVJHQiIsIChQeUNGdW5jdGlvbilRZF9MTUdldEhpbGl0ZVJHQiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgaGlsaXRlUkdCVmFsdWUpIil9LAorICAgIHsiTE1TZXRIaWxpdGVSR0IiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRIaWxpdGVSR0IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRDdXJzb3JOZXciLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRDdXJzb3JOZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkxNU2V0Q3Vyc29yTmV3IiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0Q3Vyc29yTmV3LCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiVGV4dEZvbnQiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dEZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGZvbnQpIC0+IE5vbmUiKX0sCisgICAgeyJUZXh0RmFjZSIsIChQeUNGdW5jdGlvbilRZF9UZXh0RmFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3R5bGVQYXJhbWV0ZXIgZmFjZSkgLT4gTm9uZSIpfSwKKyAgICB7IlRleHRNb2RlIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlKSAtPiBOb25lIil9LAorICAgIHsiVGV4dFNpemUiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHNpemUpIC0+IE5vbmUiKX0sCisgICAgeyJTcGFjZUV4dHJhIiwgKFB5Q0Z1bmN0aW9uKVFkX1NwYWNlRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIGV4dHJhKSAtPiBOb25lIil9LAorICAgIHsiRHJhd0NoYXIiLCAoUHlDRnVuY3Rpb24pUWRfRHJhd0NoYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKENoYXJQYXJhbWV0ZXIgY2gpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVFkX0RyYXdTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBzKSAtPiBOb25lIil9LAorICAgIHsiTWFjRHJhd1RleHQiLCAoUHlDRnVuY3Rpb24pUWRfTWFjRHJhd1RleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0QnVmLCBzaG9ydCBmaXJzdEJ5dGUsIHNob3J0IGJ5dGVDb3VudCkgLT4gTm9uZSIpfSwKKyAgICB7IkNoYXJXaWR0aCIsIChQeUNGdW5jdGlvbilRZF9DaGFyV2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKENoYXJQYXJhbWV0ZXIgY2gpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiU3RyaW5nV2lkdGgiLCAoUHlDRnVuY3Rpb24pUWRfU3RyaW5nV2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBzKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlRleHRXaWR0aCIsIChQeUNGdW5jdGlvbilRZF9UZXh0V2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0QnVmLCBzaG9ydCBmaXJzdEJ5dGUsIHNob3J0IGJ5dGVDb3VudCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRGb250SW5mbyIsIChQeUNGdW5jdGlvbilRZF9HZXRGb250SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRm9udEluZm8gaW5mbykiKX0sCisgICAgeyJDaGFyRXh0cmEiLCAoUHlDRnVuY3Rpb24pUWRfQ2hhckV4dHJhLCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCBleHRyYSkgLT4gTm9uZSIpfSwKKyAgICB7IlRydW5jU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVFkX1RydW5jU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB3aWR0aCwgU3RyMjU1IHRoZVN0cmluZywgVHJ1bmNDb2RlIHRydW5jV2hlcmUpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiU2V0UG9ydCIsIChQeUNGdW5jdGlvbilRZF9TZXRQb3J0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFmUHRyIHRoZVBvcnQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Q3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjdXJzb3JJRCkgLT4gKEN1cnNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9TZXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEN1cnNvciBjcnNyKSAtPiBOb25lIil9LAorICAgIHsiU2hvd0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9TaG93Q3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJMaW5lVG8iLCAoUHlDRnVuY3Rpb24pUWRfTGluZVRvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAorICAgIHsiU2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9TZXRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20pIC0+IChSZWN0IHIpIil9LAorICAgIHsiT2Zmc2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9PZmZzZXRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gKFJlY3QgcikiKX0sCisgICAgeyJJbnNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfSW5zZXRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gKFJlY3QgcikiKX0sCisgICAgeyJVbmlvblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfVW5pb25SZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHNyYzEsIFJlY3Qgc3JjMikgLT4gKFJlY3QgZHN0UmVjdCkiKX0sCisgICAgeyJFcXVhbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRXF1YWxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJlY3QxLCBSZWN0IHJlY3QyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiRnJhbWVSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiSW52ZXJ0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GaWxsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlSZ24iLCAoUHlDRnVuY3Rpb24pUWRfQ29weVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFJlY3RSZ24iLCAoUHlDRnVuY3Rpb24pUWRfU2V0UmVjdFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiBOb25lIil9LAorICAgIHsiT2Zmc2V0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX09mZnNldFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAorICAgIHsiVW5pb25SZ24iLCAoUHlDRnVuY3Rpb24pUWRfVW5pb25SZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IlhvclJnbiIsIChQeUNGdW5jdGlvbilRZF9Yb3JSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkVxdWFsUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0VxdWFsUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduQSwgUmduSGFuZGxlIHJnbkIpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJGcmFtZVJnbiIsIChQeUNGdW5jdGlvbilRZF9GcmFtZVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7IlBhaW50UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiSW52ZXJ0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRmlsbFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlB0SW5SZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1B0SW5SZWN0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgUmVjdCByKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiRHJhd1RleHQiLCAoUHlDRnVuY3Rpb24pUWRfRHJhd1RleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0QnVmLCBzaG9ydCBmaXJzdEJ5dGUsIHNob3J0IGJ5dGVDb3VudCkgLT4gTm9uZSIpfSwKKyAgICB7IkJpdE1hcCIsIChQeUNGdW5jdGlvbilRZF9CaXRNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiVGFrZSAoc3RyaW5nLCBpbnQsIFJlY3QpIGFyZ3VtZW50IGFuZCBjcmVhdGUgQml0TWFwIil9LAorICAgIHsiUmF3Qml0TWFwIiwgKFB5Q0Z1bmN0aW9uKVFkX1Jhd0JpdE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCJUYWtlIHN0cmluZyBCaXRNYXAgYW5kIHR1cm4gaW50byBCaXRNYXAgb2JqZWN0Iil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTcwOTUsMTUgKzcwOTUsMTUgQEAKICovCiBQeU9iamVjdCAqQk1PYmpfTmV3Q29waWVkKEJpdE1hcFB0ciBpdHNlbGYpCiB7Ci0gICAgICAgIEJpdE1hcE9iamVjdCAqaXQ7Ci0gICAgICAgIEJpdE1hcFB0ciBpdHNlbGZfY29weTsKKyAgICBCaXRNYXBPYmplY3QgKml0OworICAgIEJpdE1hcFB0ciBpdHNlbGZfY29weTsKIAotICAgICAgICBpZiAoKGl0c2VsZl9jb3B5PShCaXRNYXBQdHIpbWFsbG9jKHNpemVvZihCaXRNYXApKSkgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgKml0c2VsZl9jb3B5ID0gKml0c2VsZjsKLSAgICAgICAgaXQgPSAoQml0TWFwT2JqZWN0ICopQk1PYmpfTmV3KGl0c2VsZl9jb3B5KTsKLSAgICAgICAgaXQtPnJlZmVycmVkX2JpdG1hcCA9IGl0c2VsZl9jb3B5OwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgaWYgKChpdHNlbGZfY29weT0oQml0TWFwUHRyKW1hbGxvYyhzaXplb2YoQml0TWFwKSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICppdHNlbGZfY29weSA9ICppdHNlbGY7CisgICAgaXQgPSAoQml0TWFwT2JqZWN0ICopQk1PYmpfTmV3KGl0c2VsZl9jb3B5KTsKKyAgICBpdC0+cmVmZXJyZWRfYml0bWFwID0gaXRzZWxmX2NvcHk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KQEAgLTcxMTEsNDIgKzcxMTEsNDIgQEAKIAogdm9pZCBpbml0X1FkKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhCaXRNYXBQdHIsIEJNT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQml0TWFwUHRyLCBCTU9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEdyYWZQdHIsIEdyYWZPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChHcmFmUHRyLCBHcmFmT2JqX0NvbnZlcnQpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoUkdCQ29sb3JQdHIsIFFkUkdCX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoUkdCQ29sb3IsIFFkUkdCX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhCaXRNYXBQdHIsIEJNT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChCaXRNYXBQdHIsIEJNT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhHcmFmUHRyLCBHcmFmT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChHcmFmUHRyLCBHcmFmT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhSR0JDb2xvclB0ciwgUWRSR0JfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFJHQkNvbG9yLCBRZFJHQl9Db252ZXJ0KTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1FkIiwgUWRfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9RZCIsIFFkX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVFkX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoUWRfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBRZF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUdyYWZQb3J0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZHcmFmUG9ydF9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkdyYWZQb3J0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiR3JhZlBvcnQiLCAoUHlPYmplY3QgKikmR3JhZlBvcnRfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZHcmFmUG9ydF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdyYWZQb3J0VHlwZSIsIChQeU9iamVjdCAqKSZHcmFmUG9ydF9UeXBlKTsKLQlCaXRNYXBfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkJpdE1hcF9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkJpdE1hcF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJpdE1hcCIsIChQeU9iamVjdCAqKSZCaXRNYXBfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZCaXRNYXBfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCaXRNYXBUeXBlIiwgKFB5T2JqZWN0ICopJkJpdE1hcF9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBRZF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFFkX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgUWRfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBHcmFmUG9ydF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmR3JhZlBvcnRfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZHcmFmUG9ydF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdyYWZQb3J0IiwgKFB5T2JqZWN0ICopJkdyYWZQb3J0X1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmR3JhZlBvcnRfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJHcmFmUG9ydFR5cGUiLCAoUHlPYmplY3QgKikmR3JhZlBvcnRfVHlwZSk7CisgICAgQml0TWFwX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZCaXRNYXBfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZCaXRNYXBfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCaXRNYXAiLCAoUHlPYmplY3QgKikmQml0TWFwX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQml0TWFwX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQml0TWFwVHlwZSIsIChQeU9iamVjdCAqKSZCaXRNYXBfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvcWRvZmZzL19RZG9mZnNtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL3Fkb2Zmcy9fUWRvZmZzbW9kdWxlLmMKaW5kZXggYjQ1MTQ3Mi4uNjg2ZWNhNCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcWRvZmZzL19RZG9mZnNtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9xZG9mZnMvX1Fkb2Zmc21vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zOCw5MCArMzgsOTAgQEAKICNkZWZpbmUgR1dvcmxkT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkdXb3JsZF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZHV29ybGRfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEdXb3JsZE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUdXb3JsZFB0ciBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEdXb3JsZFB0ciBvYl9pdHNlbGY7CiB9IEdXb3JsZE9iamVjdDsKIAogUHlPYmplY3QgKkdXb3JsZE9ial9OZXcoR1dvcmxkUHRyIGl0c2VsZikKIHsKLQlHV29ybGRPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhHV29ybGRPYmplY3QsICZHV29ybGRfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEdXb3JsZE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKEdXb3JsZE9iamVjdCwgJkdXb3JsZF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBHV29ybGRPYmpfQ29udmVydChQeU9iamVjdCAqdiwgR1dvcmxkUHRyICpwX2l0c2VsZikKIHsKLQlpZiAoIUdXb3JsZE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJHV29ybGQgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoR1dvcmxkT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUdXb3JsZE9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJHV29ybGQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoR1dvcmxkT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgR1dvcmxkT2JqX2RlYWxsb2MoR1dvcmxkT2JqZWN0ICpzZWxmKQogewotCURpc3Bvc2VHV29ybGQoc2VsZi0+b2JfaXRzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIERpc3Bvc2VHV29ybGQoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdXb3JsZE9ial9HZXRHV29ybGREZXZpY2UoR1dvcmxkT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0R1dvcmxkRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R1dvcmxkRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRHV29ybGREZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEdXb3JsZERldmljZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEdXb3JsZERldmljZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR1dvcmxkT2JqX0dldEdXb3JsZFBpeE1hcChHV29ybGRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeE1hcEhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldEdXb3JsZFBpeE1hcAotCVB5TWFjX1BSRUNIRUNLKEdldEdXb3JsZFBpeE1hcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0R1dvcmxkUGl4TWFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRHV29ybGRQaXhNYXAoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRHV29ybGRQaXhNYXAoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdXb3JsZE9ial9hc19HcmFmUHRyKEdXb3JsZE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR3JhZlB0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdyYWZQdHIgX3J2OwogI2lmbmRlZiBhc19HcmFmUHRyCi0JUHlNYWNfUFJFQ0hFQ0soYXNfR3JhZlB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soYXNfR3JhZlB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gYXNfR3JhZlB0cihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBhc19HcmFmUHRyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBHV29ybGRPYmpfbWV0aG9kc1tdID0gewotCXsiR2V0R1dvcmxkRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKUdXb3JsZE9ial9HZXRHV29ybGREZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCi0JeyJHZXRHV29ybGRQaXhNYXAiLCAoUHlDRnVuY3Rpb24pR1dvcmxkT2JqX0dldEdXb3JsZFBpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGl4TWFwSGFuZGxlIF9ydikiKX0sCi0JeyJhc19HcmFmUHRyIiwgKFB5Q0Z1bmN0aW9uKUdXb3JsZE9ial9hc19HcmFmUHRyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHcmFmUHRyIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJHZXRHV29ybGREZXZpY2UiLCAoUHlDRnVuY3Rpb24pR1dvcmxkT2JqX0dldEdXb3JsZERldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldEdXb3JsZFBpeE1hcCIsIChQeUNGdW5jdGlvbilHV29ybGRPYmpfR2V0R1dvcmxkUGl4TWFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQaXhNYXBIYW5kbGUgX3J2KSIpfSwKKyAgICB7ImFzX0dyYWZQdHIiLCAoUHlDRnVuY3Rpb24pR1dvcmxkT2JqX2FzX0dyYWZQdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdyYWZQdHIgX3J2KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgR1dvcmxkT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTM4LDYxICsxMzgsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpHV29ybGRPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUdXb3JsZFB0ciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEdXb3JsZFB0ciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBHV29ybGRPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChHV29ybGRPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgR1dvcmxkT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoR1dvcmxkT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIEdXb3JsZE9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBHV29ybGRfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUWRvZmZzLkdXb3JsZCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEdXb3JsZE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEdXb3JsZE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBHV29ybGRPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEdXb3JsZE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgR1dvcmxkT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUdXb3JsZE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlHV29ybGRPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JR1dvcmxkT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlHV29ybGRPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JR1dvcmxkT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JR1dvcmxkT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUWRvZmZzLkdXb3JsZCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEdXb3JsZE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEdXb3JsZE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBHV29ybGRPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEdXb3JsZE9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgR1dvcmxkT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEdXb3JsZE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBHV29ybGRPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgR1dvcmxkT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBHV29ybGRPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgR1dvcmxkT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgR1dvcmxkT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgR1dvcmxkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjAwLDQ4OSArMjAwLDQ4OSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19OZXdHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVFERXJyIF9lcnI7Ci0JR1dvcmxkUHRyIG9mZnNjcmVlbkdXb3JsZDsKLQlzaG9ydCBQaXhlbERlcHRoOwotCVJlY3QgYm91bmRzUmVjdDsKLQlDVGFiSGFuZGxlIGNUYWJsZTsKLQlHREhhbmRsZSBhR0RldmljZTsKLQlHV29ybGRGbGFncyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUURFcnIgX2VycjsKKyAgICBHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkOworICAgIHNob3J0IFBpeGVsRGVwdGg7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENUYWJIYW5kbGUgY1RhYmxlOworICAgIEdESGFuZGxlIGFHRGV2aWNlOworICAgIEdXb3JsZEZsYWdzIGZsYWdzOwogI2lmbmRlZiBOZXdHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhOZXdHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld0dXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZQaXhlbERlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZjVGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmYUdEZXZpY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdHV29ybGQoJm9mZnNjcmVlbkdXb3JsZCwKLQkgICAgICAgICAgICAgICAgIFBpeGVsRGVwdGgsCi0JICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgIGNUYWJsZSwKLQkgICAgICAgICAgICAgICAgIGFHRGV2aWNlLAotCSAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfTmV3LCBvZmZzY3JlZW5HV29ybGQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlBpeGVsRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmNUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZhR0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld0dXb3JsZCgmb2Zmc2NyZWVuR1dvcmxkLAorICAgICAgICAgICAgICAgICAgICAgUGl4ZWxEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgY1RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgYUdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIG9mZnNjcmVlbkdXb3JsZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX0xvY2tQaXhlbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBMb2NrUGl4ZWxzCi0JUHlNYWNfUFJFQ0hFQ0soTG9ja1BpeGVscyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTG9ja1BpeGVscyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMb2NrUGl4ZWxzKHBtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMb2NrUGl4ZWxzKHBtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfVW5sb2NrUGl4ZWxzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgVW5sb2NrUGl4ZWxzCi0JUHlNYWNfUFJFQ0hFQ0soVW5sb2NrUGl4ZWxzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbmxvY2tQaXhlbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVW5sb2NrUGl4ZWxzKHBtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVW5sb2NrUGl4ZWxzKHBtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1VwZGF0ZUdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR1dvcmxkRmxhZ3MgX3J2OwotCUdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQ7Ci0Jc2hvcnQgcGl4ZWxEZXB0aDsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ1RhYkhhbmRsZSBjVGFibGU7Ci0JR0RIYW5kbGUgYUdEZXZpY2U7Ci0JR1dvcmxkRmxhZ3MgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdXb3JsZEZsYWdzIF9ydjsKKyAgICBHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkOworICAgIHNob3J0IHBpeGVsRGVwdGg7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENUYWJIYW5kbGUgY1RhYmxlOworICAgIEdESGFuZGxlIGFHRGV2aWNlOworICAgIEdXb3JsZEZsYWdzIGZsYWdzOwogI2lmbmRlZiBVcGRhdGVHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZUdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwaXhlbERlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZjVGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmYUdEZXZpY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFVwZGF0ZUdXb3JsZCgmb2Zmc2NyZWVuR1dvcmxkLAotCSAgICAgICAgICAgICAgICAgICBwaXhlbERlcHRoLAotCSAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgY1RhYmxlLAotCSAgICAgICAgICAgICAgICAgICBhR0RldmljZSwKLQkgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfTmV3LCBvZmZzY3JlZW5HV29ybGQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpeGVsRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmNUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZhR0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVXBkYXRlR1dvcmxkKCZvZmZzY3JlZW5HV29ybGQsCisgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBjVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgIGFHRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIG9mZnNjcmVlbkdXb3JsZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX0dldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgcG9ydDsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBHZXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhHZXRHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0R1dvcmxkKCZwb3J0LAotCSAgICAgICAgICAmZ2RoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZ2RoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0R1dvcmxkKCZwb3J0LAorICAgICAgICAgICAgICAmZ2RoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZ2RoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfU2V0R1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBwb3J0OwotCUdESGFuZGxlIGdkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgcG9ydDsKKyAgICBHREhhbmRsZSBnZGg7CiAjaWZuZGVmIFNldEdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKFNldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkaCkpCi0JCXJldHVybiBOVUxMOwotCVNldEdXb3JsZChwb3J0LAotCSAgICAgICAgICBnZGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRHV29ybGQocG9ydCwKKyAgICAgICAgICAgICAgZ2RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX0NUYWJDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDVGFiSGFuZGxlIGN0YWI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENUYWJIYW5kbGUgY3RhYjsKICNpZm5kZWYgQ1RhYkNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhDVGFiQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ1RhYkNoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmN0YWIpKQotCQlyZXR1cm4gTlVMTDsKLQlDVGFiQ2hhbmdlZChjdGFiKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmN0YWIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDVGFiQ2hhbmdlZChjdGFiKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1BpeFBhdENoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBwcGF0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhQYXRIYW5kbGUgcHBhdDsKICNpZm5kZWYgUGl4UGF0Q2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKFBpeFBhdENoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBpeFBhdENoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwYXQpKQotCQlyZXR1cm4gTlVMTDsKLQlQaXhQYXRDaGFuZ2VkKHBwYXQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHBhdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBpeFBhdENoYW5nZWQocHBhdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19Qb3J0Q2hhbmdlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR3JhZlB0ciBwb3J0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHcmFmUHRyIHBvcnQ7CiAjaWZuZGVmIFBvcnRDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soUG9ydENoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBvcnRDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCi0JCXJldHVybiBOVUxMOwotCVBvcnRDaGFuZ2VkKHBvcnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQb3J0Q2hhbmdlZChwb3J0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX0dEZXZpY2VDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIGdkaDsKICNpZm5kZWYgR0RldmljZUNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhHRGV2aWNlQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR0RldmljZUNoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkaCkpCi0JCXJldHVybiBOVUxMOwotCUdEZXZpY2VDaGFuZ2VkKGdkaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHRGV2aWNlQ2hhbmdlZChnZGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfQWxsb3dQdXJnZVBpeGVscyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIEFsbG93UHVyZ2VQaXhlbHMKLQlQeU1hY19QUkVDSEVDSyhBbGxvd1B1cmdlUGl4ZWxzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBbGxvd1B1cmdlUGl4ZWxzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCUFsbG93UHVyZ2VQaXhlbHMocG0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBbGxvd1B1cmdlUGl4ZWxzKHBtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX05vUHVyZ2VQaXhlbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBOb1B1cmdlUGl4ZWxzCi0JUHlNYWNfUFJFQ0hFQ0soTm9QdXJnZVBpeGVscyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTm9QdXJnZVBpeGVscyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlOb1B1cmdlUGl4ZWxzKHBtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTm9QdXJnZVBpeGVscyhwbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19HZXRQaXhlbHNTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR1dvcmxkRmxhZ3MgX3J2OwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR1dvcmxkRmxhZ3MgX3J2OworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgR2V0UGl4ZWxzU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRQaXhlbHNTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGl4ZWxzU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UGl4ZWxzU3RhdGUocG0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpeGVsc1N0YXRlKHBtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfU2V0UGl4ZWxzU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBwbTsKLQlHV29ybGRGbGFncyBzdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHBtOworICAgIEdXb3JsZEZsYWdzIHN0YXRlOwogI2lmbmRlZiBTZXRQaXhlbHNTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKFNldFBpeGVsc1N0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQaXhlbHNTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQaXhlbHNTdGF0ZShwbSwKLQkgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBpeGVsc1N0YXRlKHBtLAorICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX0dldFBpeFJvd0J5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgR2V0UGl4Um93Qnl0ZXMKLQlQeU1hY19QUkVDSEVDSyhHZXRQaXhSb3dCeXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGl4Um93Qnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UGl4Um93Qnl0ZXMocG0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpeFJvd0J5dGVzKHBtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfTmV3U2NyZWVuQnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlRREVyciBfZXJyOwotCVJlY3QgZ2xvYmFsUmVjdDsKLQlCb29sZWFuIHB1cmdlYWJsZTsKLQlHREhhbmRsZSBnZGg7Ci0JUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUURFcnIgX2VycjsKKyAgICBSZWN0IGdsb2JhbFJlY3Q7CisgICAgQm9vbGVhbiBwdXJnZWFibGU7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXA7CiAjaWZuZGVmIE5ld1NjcmVlbkJ1ZmZlcgotCVB5TWFjX1BSRUNIRUNLKE5ld1NjcmVlbkJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3U2NyZWVuQnVmZmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZnbG9iYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcHVyZ2VhYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld1NjcmVlbkJ1ZmZlcigmZ2xvYmFsUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHB1cmdlYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2NyZWVuUGl4TWFwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb2Zmc2NyZWVuUGl4TWFwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnB1cmdlYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdTY3JlZW5CdWZmZXIoJmdsb2JhbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJnZWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNjcmVlblBpeE1hcCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG9mZnNjcmVlblBpeE1hcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX0Rpc3Bvc2VTY3JlZW5CdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXA7CiAjaWZuZGVmIERpc3Bvc2VTY3JlZW5CdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlU2NyZWVuQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlU2NyZWVuQnVmZmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvZmZzY3JlZW5QaXhNYXApKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlU2NyZWVuQnVmZmVyKG9mZnNjcmVlblBpeE1hcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvZmZzY3JlZW5QaXhNYXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlU2NyZWVuQnVmZmVyKG9mZnNjcmVlblBpeE1hcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19RRERvbmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUdyYWZQdHIgcG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgR3JhZlB0ciBwb3J0OwogI2lmbmRlZiBRRERvbmUKLQlQeU1hY19QUkVDSEVDSyhRRERvbmUpOworICAgIFB5TWFjX1BSRUNIRUNLKFFERG9uZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRRERvbmUocG9ydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUUREb25lKHBvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19PZmZzY3JlZW5WZXJzaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIE9mZnNjcmVlblZlcnNpb24KLQlQeU1hY19QUkVDSEVDSyhPZmZzY3JlZW5WZXJzaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPZmZzY3JlZW5WZXJzaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBPZmZzY3JlZW5WZXJzaW9uKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE9mZnNjcmVlblZlcnNpb24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfTmV3VGVtcFNjcmVlbkJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUURFcnIgX2VycjsKLQlSZWN0IGdsb2JhbFJlY3Q7Ci0JQm9vbGVhbiBwdXJnZWFibGU7Ci0JR0RIYW5kbGUgZ2RoOwotCVBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFFERXJyIF9lcnI7CisgICAgUmVjdCBnbG9iYWxSZWN0OworICAgIEJvb2xlYW4gcHVyZ2VhYmxlOworICAgIEdESGFuZGxlIGdkaDsKKyAgICBQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwOwogI2lmbmRlZiBOZXdUZW1wU2NyZWVuQnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soTmV3VGVtcFNjcmVlbkJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3VGVtcFNjcmVlbkJ1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnB1cmdlYWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdUZW1wU2NyZWVuQnVmZmVyKCZnbG9iYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cmdlYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzY3JlZW5QaXhNYXApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGdkaCwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvZmZzY3JlZW5QaXhNYXApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZnbG9iYWxSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHVyZ2VhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld1RlbXBTY3JlZW5CdWZmZXIoJmdsb2JhbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZ2VhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNjcmVlblBpeE1hcCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG9mZnNjcmVlblBpeE1hcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1BpeE1hcDMyQml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQaXhNYXBIYW5kbGUgcG1IYW5kbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBpeE1hcEhhbmRsZSBwbUhhbmRsZTsKICNpZm5kZWYgUGl4TWFwMzJCaXQKLQlQeU1hY19QUkVDSEVDSyhQaXhNYXAzMkJpdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGl4TWFwMzJCaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtSGFuZGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUGl4TWFwMzJCaXQocG1IYW5kbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbUhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFBpeE1hcDMyQml0KHBtSGFuZGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfR2V0UGl4TWFwQnl0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCVBpeE1hcEhhbmRsZSBwbTsKLQlpbnQgZnJvbSwgbGVuZ3RoOwotCWNoYXIgKmNwOworICAgIFBpeE1hcEhhbmRsZSBwbTsKKyAgICBpbnQgZnJvbSwgbGVuZ3RoOworICAgIGNoYXIgKmNwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maWkiLCBSZXNPYmpfQ29udmVydCwgJnBtLCAmZnJvbSwgJmxlbmd0aCkgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JY3AgPSBHZXRQaXhCYXNlQWRkcihwbSkrZnJvbTsKLQlfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY3AsIGxlbmd0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maWkiLCBSZXNPYmpfQ29udmVydCwgJnBtLCAmZnJvbSwgJmxlbmd0aCkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOworICAgIF9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjcCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19QdXRQaXhNYXBCeXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JUGl4TWFwSGFuZGxlIHBtOwotCWludCBmcm9tLCBsZW5ndGg7Ci0JY2hhciAqY3AsICppY3A7CisgICAgUGl4TWFwSGFuZGxlIHBtOworICAgIGludCBmcm9tLCBsZW5ndGg7CisgICAgY2hhciAqY3AsICppY3A7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpcyMiLCBSZXNPYmpfQ29udmVydCwgJnBtLCAmZnJvbSwgJmljcCwgJmxlbmd0aCkgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JY3AgPSBHZXRQaXhCYXNlQWRkcihwbSkrZnJvbTsKLQltZW1jcHkoY3AsIGljcCwgbGVuZ3RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maXMjIiwgUmVzT2JqX0NvbnZlcnQsICZwbSwgJmZyb20sICZpY3AsICZsZW5ndGgpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3AgPSBHZXRQaXhCYXNlQWRkcihwbSkrZnJvbTsKKyAgICBtZW1jcHkoY3AsIGljcCwgbGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgUWRvZmZzX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7Ik5ld0dXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfTmV3R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBQaXhlbERlcHRoLCBSZWN0IGJvdW5kc1JlY3QsIENUYWJIYW5kbGUgY1RhYmxlLCBHREhhbmRsZSBhR0RldmljZSwgR1dvcmxkRmxhZ3MgZmxhZ3MpIC0+IChHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkKSIpfSwKLQl7IkxvY2tQaXhlbHMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0xvY2tQaXhlbHMsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlVubG9ja1BpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfVW5sb2NrUGl4ZWxzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVHV29ybGQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1VwZGF0ZUdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcGl4ZWxEZXB0aCwgUmVjdCBib3VuZHNSZWN0LCBDVGFiSGFuZGxlIGNUYWJsZSwgR0RIYW5kbGUgYUdEZXZpY2UsIEdXb3JsZEZsYWdzIGZsYWdzKSAtPiAoR1dvcmxkRmxhZ3MgX3J2LCBHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkKSIpfSwKLQl7IkdldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIil9LAotCXsiU2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19TZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKLQl7IkNUYWJDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19DVGFiQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBjdGFiKSAtPiBOb25lIil9LAotCXsiUGl4UGF0Q2hhbmdlZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfUGl4UGF0Q2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBwYXQpIC0+IE5vbmUiKX0sCi0JeyJQb3J0Q2hhbmdlZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfUG9ydENoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYWZQdHIgcG9ydCkgLT4gTm9uZSIpfSwKLQl7IkdEZXZpY2VDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HRGV2aWNlQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoKSAtPiBOb25lIil9LAotCXsiQWxsb3dQdXJnZVBpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfQWxsb3dQdXJnZVBpeGVscywgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAotCXsiTm9QdXJnZVBpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfTm9QdXJnZVBpeGVscywgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAotCXsiR2V0UGl4ZWxzU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dldFBpeGVsc1N0YXRlLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChHV29ybGRGbGFncyBfcnYpIil9LAotCXsiU2V0UGl4ZWxzU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1NldFBpeGVsc1N0YXRlLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIEdXb3JsZEZsYWdzIHN0YXRlKSAtPiBOb25lIil9LAotCXsiR2V0UGl4Um93Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dldFBpeFJvd0J5dGVzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChsb25nIF9ydikiKX0sCi0JeyJOZXdTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX05ld1NjcmVlbkJ1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBnbG9iYWxSZWN0LCBCb29sZWFuIHB1cmdlYWJsZSkgLT4gKEdESGFuZGxlIGdkaCwgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcCkiKX0sCi0JeyJEaXNwb3NlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19EaXNwb3NlU2NyZWVuQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwKSAtPiBOb25lIil9LAotCXsiUUREb25lIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19RRERvbmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYWZQdHIgcG9ydCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik9mZnNjcmVlblZlcnNpb24iLCAoUHlDRnVuY3Rpb24pUWRvZmZzX09mZnNjcmVlblZlcnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik5ld1RlbXBTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX05ld1RlbXBTY3JlZW5CdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgZ2xvYmFsUmVjdCwgQm9vbGVhbiBwdXJnZWFibGUpIC0+IChHREhhbmRsZSBnZGgsIFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXApIil9LAotCXsiUGl4TWFwMzJCaXQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1BpeE1hcDMyQml0LCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG1IYW5kbGUpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRQaXhNYXBCeXRlcyIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0UGl4TWFwQnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKHBpeG1hcCwgaW50IHN0YXJ0LCBpbnQgc2l6ZSkgLT4gc3RyaW5nLiBSZXR1cm4gYnl0ZXMgZnJvbSB0aGUgcGl4bWFwIil9LAotCXsiUHV0UGl4TWFwQnl0ZXMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1B1dFBpeE1hcEJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihwaXhtYXAsIGludCBzdGFydCwgc3RyaW5nIGRhdGEpLiBTdG9yZSBieXRlcyBpbnRvIHRoZSBwaXhtYXAiKX0sCisgICAgeyJOZXdHV29ybGQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX05ld0dXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgUGl4ZWxEZXB0aCwgUmVjdCBib3VuZHNSZWN0LCBDVGFiSGFuZGxlIGNUYWJsZSwgR0RIYW5kbGUgYUdEZXZpY2UsIEdXb3JsZEZsYWdzIGZsYWdzKSAtPiAoR1dvcmxkUHRyIG9mZnNjcmVlbkdXb3JsZCkiKX0sCisgICAgeyJMb2NrUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19Mb2NrUGl4ZWxzLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJVbmxvY2tQaXhlbHMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1VubG9ja1BpeGVscywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAorICAgIHsiVXBkYXRlR1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19VcGRhdGVHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHBpeGVsRGVwdGgsIFJlY3QgYm91bmRzUmVjdCwgQ1RhYkhhbmRsZSBjVGFibGUsIEdESGFuZGxlIGFHRGV2aWNlLCBHV29ybGRGbGFncyBmbGFncykgLT4gKEdXb3JsZEZsYWdzIF9ydiwgR1dvcmxkUHRyIG9mZnNjcmVlbkdXb3JsZCkiKX0sCisgICAgeyJHZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dldEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2RoKSIpfSwKKyAgICB7IlNldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfU2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCisgICAgeyJDVGFiQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfQ1RhYkNoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY3RhYikgLT4gTm9uZSIpfSwKKyAgICB7IlBpeFBhdENoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1BpeFBhdENoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwcGF0KSAtPiBOb25lIil9LAorICAgIHsiUG9ydENoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1BvcnRDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihHcmFmUHRyIHBvcnQpIC0+IE5vbmUiKX0sCisgICAgeyJHRGV2aWNlQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfR0RldmljZUNoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKKyAgICB7IkFsbG93UHVyZ2VQaXhlbHMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0FsbG93UHVyZ2VQaXhlbHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gTm9uZSIpfSwKKyAgICB7Ik5vUHVyZ2VQaXhlbHMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX05vUHVyZ2VQaXhlbHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFBpeGVsc1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HZXRQaXhlbHNTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAoR1dvcmxkRmxhZ3MgX3J2KSIpfSwKKyAgICB7IlNldFBpeGVsc1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19TZXRQaXhlbHNTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtLCBHV29ybGRGbGFncyBzdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFBpeFJvd0J5dGVzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HZXRQaXhSb3dCeXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiTmV3U2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19OZXdTY3JlZW5CdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgZ2xvYmFsUmVjdCwgQm9vbGVhbiBwdXJnZWFibGUpIC0+IChHREhhbmRsZSBnZGgsIFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXApIil9LAorICAgIHsiRGlzcG9zZVNjcmVlbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRZG9mZnNfRGlzcG9zZVNjcmVlbkJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcCkgLT4gTm9uZSIpfSwKKyAgICB7IlFERG9uZSIsIChQeUNGdW5jdGlvbilRZG9mZnNfUUREb25lLCAxLAorICAgICBQeURvY19TVFIoIihHcmFmUHRyIHBvcnQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJPZmZzY3JlZW5WZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19PZmZzY3JlZW5WZXJzaW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJOZXdUZW1wU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19OZXdUZW1wU2NyZWVuQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGdsb2JhbFJlY3QsIEJvb2xlYW4gcHVyZ2VhYmxlKSAtPiAoR0RIYW5kbGUgZ2RoLCBQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwKSIpfSwKKyAgICB7IlBpeE1hcDMyQml0IiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19QaXhNYXAzMkJpdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtSGFuZGxlKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0UGl4TWFwQnl0ZXMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dldFBpeE1hcEJ5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihwaXhtYXAsIGludCBzdGFydCwgaW50IHNpemUpIC0+IHN0cmluZy4gUmV0dXJuIGJ5dGVzIGZyb20gdGhlIHBpeG1hcCIpfSwKKyAgICB7IlB1dFBpeE1hcEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19QdXRQaXhNYXBCeXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIocGl4bWFwLCBpbnQgc3RhcnQsIHN0cmluZyBkYXRhKS4gU3RvcmUgYnl0ZXMgaW50byB0aGUgcGl4bWFwIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTY5MCwzMSArNjkwLDMxIEBACiAKIHZvaWQgaW5pdF9RZG9mZnModm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEdXb3JsZFB0ciwgR1dvcmxkT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoR1dvcmxkUHRyLCBHV29ybGRPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEdXb3JsZFB0ciwgR1dvcmxkT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChHV29ybGRQdHIsIEdXb3JsZE9ial9Db252ZXJ0KTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1Fkb2ZmcyIsIFFkb2Zmc19tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1Fkb2ZmcyIsIFFkb2Zmc19tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlRZG9mZnNfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChRZG9mZnNfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBRZG9mZnNfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlHV29ybGRfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkdXb3JsZF9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkdXb3JsZF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdXb3JsZCIsIChQeU9iamVjdCAqKSZHV29ybGRfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZHV29ybGRfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJHV29ybGRUeXBlIiwgKFB5T2JqZWN0ICopJkdXb3JsZF9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBRZG9mZnNfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChRZG9mZnNfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBRZG9mZnNfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBHV29ybGRfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkdXb3JsZF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkdXb3JsZF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdXb3JsZCIsIChQeU9iamVjdCAqKSZHV29ybGRfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZHV29ybGRfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJHV29ybGRUeXBlIiwgKFB5T2JqZWN0ICopJkdXb3JsZF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9xdC9fUXRtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL3F0L19RdG1vZHVsZS5jCmluZGV4IDQ4NDVlNGEuLmJmNjdjZGEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3F0L19RdG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3F0L19RdG1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC01NiwzNyArNTYsMzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBRdFRpbWVSZWNvcmRfTmV3KFRpbWVSZWNvcmQgKml0c2VsZikKIHsKLSAgICAgICAgaWYgKGl0c2VsZi0+YmFzZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZsTyYiLCBQeU1hY19CdWlsZHdpZGUsICZpdHNlbGYtPnZhbHVlLCBpdHNlbGYtPnNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBpdHNlbGYtPmJhc2UpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuICBQeV9CdWlsZFZhbHVlKCJPJmxPIiwgUHlNYWNfQnVpbGR3aWRlLCAmaXRzZWxmLT52YWx1ZSwgaXRzZWxmLT5zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpOworICAgIGlmIChpdHNlbGYtPmJhc2UpCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmxPJiIsIFB5TWFjX0J1aWxkd2lkZSwgJml0c2VsZi0+dmFsdWUsIGl0c2VsZi0+c2NhbGUsCisgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIGl0c2VsZi0+YmFzZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gIFB5X0J1aWxkVmFsdWUoIk8mbE8iLCBQeU1hY19CdWlsZHdpZGUsICZpdHNlbGYtPnZhbHVlLCBpdHNlbGYtPnNjYWxlLAorICAgICAgICAgICAgUHlfTm9uZSk7CiB9CiAKIHN0YXRpYyBpbnQKIFF0VGltZVJlY29yZF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBUaW1lUmVjb3JkICpwX2l0c2VsZikKIHsKLSAgICAgICAgUHlPYmplY3QgKmJhc2UgPSBOVUxMOwotICAgICAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgIk8mbHxPIiwgUHlNYWNfR2V0d2lkZSwgJnBfaXRzZWxmLT52YWx1ZSwgJnBfaXRzZWxmLT5zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZiYXNlKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggYmFzZSA9PSBOVUxMIHx8IGJhc2UgPT0gUHlfTm9uZSApCi0gICAgICAgICAgICAgICAgcF9pdHNlbGYtPmJhc2UgPSBOVUxMOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKCAhVGltZUJhc2VPYmpfQ29udmVydChiYXNlLCAmcF9pdHNlbGYtPmJhc2UpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gMTsKKyAgICBQeU9iamVjdCAqYmFzZSA9IE5VTEw7CisgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJPJmx8TyIsIFB5TWFjX0dldHdpZGUsICZwX2l0c2VsZi0+dmFsdWUsICZwX2l0c2VsZi0+c2NhbGUsCisgICAgICAgICAgICAgICAgICAgICZiYXNlKSApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICggYmFzZSA9PSBOVUxMIHx8IGJhc2UgPT0gUHlfTm9uZSApCisgICAgICAgIHBfaXRzZWxmLT5iYXNlID0gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIGlmICggIVRpbWVCYXNlT2JqX0NvbnZlcnQoYmFzZSwgJnBfaXRzZWxmLT5iYXNlKSApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogUXRNdXNpY01JRElQYWNrZXRfQ29udmVydChQeU9iamVjdCAqdiwgTXVzaWNNSURJUGFja2V0ICpwX2l0c2VsZikKIHsKLSAgICAgICAgaW50IGR1bW15OworICAgIGludCBkdW1teTsKIAotICAgICAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImhscyMiLCAmcF9pdHNlbGYtPmxlbmd0aCwgJnBfaXRzZWxmLT5yZXNlcnZlZCwgcF9pdHNlbGYtPmRhdGEsIGR1bW15KSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiAxOworICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAiaGxzIyIsICZwX2l0c2VsZi0+bGVuZ3RoLCAmcF9pdHNlbGYtPnJlc2VydmVkLCBwX2l0c2VsZi0+ZGF0YSwgZHVtbXkpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIApAQCAtMTAxLDQ3ICsxMDEsNDcgQEAKICNkZWZpbmUgSWRsZU1hbmFnZXJPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmSWRsZU1hbmFnZXJfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmSWRsZU1hbmFnZXJfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IElkbGVNYW5hZ2VyT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JSWRsZU1hbmFnZXIgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBJZGxlTWFuYWdlciBvYl9pdHNlbGY7CiB9IElkbGVNYW5hZ2VyT2JqZWN0OwogCiBQeU9iamVjdCAqSWRsZU1hbmFnZXJPYmpfTmV3KElkbGVNYW5hZ2VyIGl0c2VsZikKIHsKLQlJZGxlTWFuYWdlck9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUXRfRXJyb3IsIkNhbm5vdCBjcmVhdGUgSWRsZU1hbmFnZXIgZnJvbSBOVUxMIHBvaW50ZXIiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhJZGxlTWFuYWdlck9iamVjdCwgJklkbGVNYW5hZ2VyX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBJZGxlTWFuYWdlck9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUXRfRXJyb3IsIkNhbm5vdCBjcmVhdGUgSWRsZU1hbmFnZXIgZnJvbSBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhJZGxlTWFuYWdlck9iamVjdCwgJklkbGVNYW5hZ2VyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIElkbGVNYW5hZ2VyICpwX2l0c2VsZikKIHsKLQlpZiAodiA9PSBQeV9Ob25lKQotCXsKLQkJKnBfaXRzZWxmID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghSWRsZU1hbmFnZXJPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiSWRsZU1hbmFnZXIgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoSWRsZU1hbmFnZXJPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFJZGxlTWFuYWdlck9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJZGxlTWFuYWdlciByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChJZGxlTWFuYWdlck9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIElkbGVNYW5hZ2VyT2JqX2RlYWxsb2MoSWRsZU1hbmFnZXJPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgSWRsZU1hbmFnZXJPYmpfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBJZGxlTWFuYWdlck9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTE1OCw2MSArMTU4LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqSWRsZU1hbmFnZXJPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUlkbGVNYW5hZ2VyIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgSWRsZU1hbmFnZXIgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgSWRsZU1hbmFnZXJPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChJZGxlTWFuYWdlck9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKElkbGVNYW5hZ2VyT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIElkbGVNYW5hZ2VyT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IElkbGVNYW5hZ2VyX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0LklkbGVNYW5hZ2VyIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoSWRsZU1hbmFnZXJPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBJZGxlTWFuYWdlck9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBJZGxlTWFuYWdlck9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgSWRsZU1hbmFnZXJPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIElkbGVNYW5hZ2VyT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUlkbGVNYW5hZ2VyT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUlkbGVNYW5hZ2VyT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUlkbGVNYW5hZ2VyT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlJZGxlTWFuYWdlck9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlJZGxlTWFuYWdlck9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUlkbGVNYW5hZ2VyT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuSWRsZU1hbmFnZXIiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihJZGxlTWFuYWdlck9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIElkbGVNYW5hZ2VyT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIElkbGVNYW5hZ2VyT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBJZGxlTWFuYWdlck9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgSWRsZU1hbmFnZXJPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgSWRsZU1hbmFnZXJPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgSWRsZU1hbmFnZXJPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgSWRsZU1hbmFnZXJPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIElkbGVNYW5hZ2VyT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIElkbGVNYW5hZ2VyT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgSWRsZU1hbmFnZXJPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBJZGxlTWFuYWdlciAtLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMjUsMTA0MyArMjI1LDEwNDMgQEAKICNkZWZpbmUgTW92aWVDdGxPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmTW92aWVDb250cm9sbGVyX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJk1vdmllQ29udHJvbGxlcl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgTW92aWVDb250cm9sbGVyT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JTW92aWVDb250cm9sbGVyIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgTW92aWVDb250cm9sbGVyIG9iX2l0c2VsZjsKIH0gTW92aWVDb250cm9sbGVyT2JqZWN0OwogCiBQeU9iamVjdCAqTW92aWVDdGxPYmpfTmV3KE1vdmllQ29udHJvbGxlciBpdHNlbGYpCiB7Ci0JTW92aWVDb250cm9sbGVyT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNb3ZpZUNvbnRyb2xsZXIgZnJvbSBOVUxMIHBvaW50ZXIiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QsICZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIE1vdmllQ29udHJvbGxlck9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUXRfRXJyb3IsIkNhbm5vdCBjcmVhdGUgTW92aWVDb250cm9sbGVyIGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoTW92aWVDb250cm9sbGVyT2JqZWN0LCAmTW92aWVDb250cm9sbGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IE1vdmllQ3RsT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIE1vdmllQ29udHJvbGxlciAqcF9pdHNlbGYpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIU1vdmllQ3RsT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1vdmllQ29udHJvbGxlciByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFNb3ZpZUN0bE9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNb3ZpZUNvbnRyb2xsZXIgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoTW92aWVDb250cm9sbGVyT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgTW92aWVDdGxPYmpfZGVhbGxvYyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZU1vdmllQ29udHJvbGxlcihzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZU1vdmllQ29udHJvbGxlcihzZWxmLT5vYl9pdHNlbGYpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXRNb3ZpZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWUgdGhlTW92aWU7Ci0JV2luZG93UHRyIG1vdmllV2luZG93OwotCVBvaW50IHdoZXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllIHRoZU1vdmllOworICAgIFdpbmRvd1B0ciBtb3ZpZVdpbmRvdzsKKyAgICBQb2ludCB3aGVyZTsKICNpZm5kZWYgTUNTZXRNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKE1DU2V0TW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0TW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJm1vdmllV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJndoZXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICBtb3ZpZVdpbmRvdywKLQkgICAgICAgICAgICAgICAgIHdoZXJlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmbW92aWVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1NldE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgIG1vdmllV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgd2hlcmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0SW5kTW92aWUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgTUNHZXRJbmRNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKE1DR2V0SW5kTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DR2V0SW5kTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0SW5kTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRJbmRNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DUmVtb3ZlQWxsTW92aWVzKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKICNpZm5kZWYgTUNSZW1vdmVBbGxNb3ZpZXMKLQlQeU1hY19QUkVDSEVDSyhNQ1JlbW92ZUFsbE1vdmllcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNSZW1vdmVBbGxNb3ZpZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DUmVtb3ZlQWxsTW92aWVzKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1JlbW92ZUFsbE1vdmllcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1JlbW92ZUFNb3ZpZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWUgbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZSBtOwogI2lmbmRlZiBNQ1JlbW92ZUFNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKE1DUmVtb3ZlQU1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1JlbW92ZUFNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNSZW1vdmVBTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNSZW1vdmVBTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1JlbW92ZU1vdmllKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKICNpZm5kZWYgTUNSZW1vdmVNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKE1DUmVtb3ZlTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DUmVtb3ZlTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DUmVtb3ZlTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DUmVtb3ZlTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNJc1BsYXllckV2ZW50KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlFdmVudFJlY29yZCBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEV2ZW50UmVjb3JkIGU7CiAjaWZuZGVmIE1DSXNQbGF5ZXJFdmVudAotCVB5TWFjX1BSRUNIRUNLKE1DSXNQbGF5ZXJFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNJc1BsYXllckV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNJc1BsYXllckV2ZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICZlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DSXNQbGF5ZXJFdmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNEb0FjdGlvbihNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0Jc2hvcnQgYWN0aW9uOwotCXZvaWQgKiBwYXJhbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgc2hvcnQgYWN0aW9uOworICAgIHZvaWQgKiBwYXJhbXM7CiAjaWZuZGVmIE1DRG9BY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhNQ0RvQWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0RvQWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DRG9BY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGFjdGlvbiwKLQkgICAgICAgICAgICAgICAgIHBhcmFtcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNEb0FjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJBdHRhY2hlZChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQm9vbGVhbiBhdHRhY2g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQm9vbGVhbiBhdHRhY2g7CiAjaWZuZGVmIE1DU2V0Q29udHJvbGxlckF0dGFjaGVkCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyQXR0YWNoZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0Q29udHJvbGxlckF0dGFjaGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0YWNoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRDb250cm9sbGVyQXR0YWNoZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2gpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0YWNoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRDb250cm9sbGVyQXR0YWNoZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2gpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DSXNDb250cm9sbGVyQXR0YWNoZWQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ0lzQ29udHJvbGxlckF0dGFjaGVkCi0JUHlNYWNfUFJFQ0hFQ0soTUNJc0NvbnRyb2xsZXJBdHRhY2hlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNJc0NvbnRyb2xsZXJBdHRhY2hlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNJc0NvbnRyb2xsZXJBdHRhY2hlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNJc0NvbnRyb2xsZXJBdHRhY2hlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJQb3J0KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDR3JhZlB0ciBncDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDR3JhZlB0ciBncDsKICNpZm5kZWYgTUNTZXRDb250cm9sbGVyUG9ydAotCVB5TWFjX1BSRUNIRUNLKE1DU2V0Q29udHJvbGxlclBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0Q29udHJvbGxlclBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZncCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0Q29udHJvbGxlclBvcnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGdwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmdwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRDb250cm9sbGVyUG9ydChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlclBvcnQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIF9ydjsKICNpZm5kZWYgTUNHZXRDb250cm9sbGVyUG9ydAotCVB5TWFjX1BSRUNIRUNLKE1DR2V0Q29udHJvbGxlclBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DR2V0Q29udHJvbGxlclBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0Q29udHJvbGxlclBvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRDb250cm9sbGVyUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0VmlzaWJsZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQm9vbGVhbiB2aXNpYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEJvb2xlYW4gdmlzaWJsZTsKICNpZm5kZWYgTUNTZXRWaXNpYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRWaXNpYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1NldFZpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHZpc2libGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlzaWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DU2V0VmlzaWJsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0dldFZpc2libGUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ0dldFZpc2libGUKLQlQeU1hY19QUkVDSEVDSyhNQ0dldFZpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DR2V0VmlzaWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNHZXRWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldFZpc2libGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyQm91bmRzUmVjdChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIE1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QKLQlQeU1hY19QUkVDSEVDSyhNQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRDb250cm9sbGVyQm91bmRzUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIE1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QKLQlQeU1hY19QUkVDSEVDSyhNQ1NldENvbnRyb2xsZXJCb3VuZHNSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1NldENvbnRyb2xsZXJCb3VuZHNSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckJvdW5kc1JnbihNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIE1DR2V0Q29udHJvbGxlckJvdW5kc1JnbgotCVB5TWFjX1BSRUNIRUNLKE1DR2V0Q29udHJvbGxlckJvdW5kc1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVyQm91bmRzUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldENvbnRyb2xsZXJCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldENvbnRyb2xsZXJCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0V2luZG93UmduKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKLQlXaW5kb3dQdHIgdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKKyAgICBXaW5kb3dQdHIgdzsKICNpZm5kZWYgTUNHZXRXaW5kb3dSZ24KLQlQeU1hY19QUkVDSEVDSyhNQ0dldFdpbmRvd1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRXaW5kb3dSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldFdpbmRvd1Jnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DR2V0V2luZG93UmduKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DTW92aWVDaGFuZ2VkKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZSBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllIG07CiAjaWZuZGVmIE1DTW92aWVDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soTUNNb3ZpZUNoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DTW92aWVDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJm0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ01vdmllQ2hhbmdlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIG0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ01vdmllQ2hhbmdlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0RHVyYXRpb24oTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIE1DU2V0RHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhNQ1NldER1cmF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1NldER1cmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldER1cmF0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DU2V0RHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0dldEN1cnJlbnRUaW1lKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKLQlUaW1lU2NhbGUgc2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CisgICAgVGltZVNjYWxlIHNjYWxlOwogI2lmbmRlZiBNQ0dldEN1cnJlbnRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRDdXJyZW50VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRDdXJyZW50VGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNHZXRDdXJyZW50VGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DR2V0Q3VycmVudFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DTmV3QXR0YWNoZWRDb250cm9sbGVyKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlXaW5kb3dQdHIgdzsKLQlQb2ludCB3aGVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBXaW5kb3dQdHIgdzsKKyAgICBQb2ludCB3aGVyZTsKICNpZm5kZWYgTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIKLQlQeU1hY19QUkVDSEVDSyhNQ05ld0F0dGFjaGVkQ29udHJvbGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ05ld0F0dGFjaGVkQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJndoZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0RyYXcoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVdpbmRvd1B0ciB3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFdpbmRvd1B0ciB3OwogI2lmbmRlZiBNQ0RyYXcKLQlQeU1hY19QUkVDSEVDSyhNQ0RyYXcpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DRHJhdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DRHJhdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICB3KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DRHJhdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICB3KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0FjdGl2YXRlKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlXaW5kb3dQdHIgdzsKLQlCb29sZWFuIGFjdGl2YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFdpbmRvd1B0ciB3OworICAgIEJvb2xlYW4gYWN0aXZhdGU7CiAjaWZuZGVmIE1DQWN0aXZhdGUKLQlQeU1hY19QUkVDSEVDSyhNQ0FjdGl2YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0FjdGl2YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNBY3RpdmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgdywKLQkgICAgICAgICAgICAgICAgIGFjdGl2YXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DQWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNJZGxlKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKICNpZm5kZWYgTUNJZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTUNJZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0lkbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DSWRsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNJZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DS2V5KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTSW50OCBrZXk7Ci0JbG9uZyBtb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0ludDgga2V5OworICAgIGxvbmcgbW9kaWZpZXJzOwogI2lmbmRlZiBNQ0tleQotCVB5TWFjX1BSRUNIRUNLKE1DS2V5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0tleSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZrZXksCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0tleShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIGtleSwKLQkgICAgICAgICAgICBtb2RpZmllcnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DS2V5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgIG1vZGlmaWVycyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNDbGljayhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JV2luZG93UHRyIHc7Ci0JUG9pbnQgd2hlcmU7Ci0JbG9uZyB3aGVuOwotCWxvbmcgbW9kaWZpZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFdpbmRvd1B0ciB3OworICAgIFBvaW50IHdoZXJlOworICAgIGxvbmcgd2hlbjsKKyAgICBsb25nIG1vZGlmaWVyczsKICNpZm5kZWYgTUNDbGljawotCVB5TWFjX1BSRUNIRUNLKE1DQ2xpY2spOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQ2xpY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJndoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DQ2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIHcsCi0JICAgICAgICAgICAgICB3aGVyZSwKLQkgICAgICAgICAgICAgIHdoZW4sCi0JICAgICAgICAgICAgICBtb2RpZmllcnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ3aGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0NsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgd2hlcmUsCisgICAgICAgICAgICAgICAgICB3aGVuLAorICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0VuYWJsZUVkaXRpbmcoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUJvb2xlYW4gZW5hYmxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBCb29sZWFuIGVuYWJsZWQ7CiAjaWZuZGVmIE1DRW5hYmxlRWRpdGluZwotCVB5TWFjX1BSRUNIRUNLKE1DRW5hYmxlRWRpdGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNFbmFibGVFZGl0aW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DRW5hYmxlRWRpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0VuYWJsZUVkaXRpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNJc0VkaXRpbmdFbmFibGVkKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBNQ0lzRWRpdGluZ0VuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhNQ0lzRWRpdGluZ0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DSXNFZGl0aW5nRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNJc0VkaXRpbmdFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0lzRWRpdGluZ0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNDb3B5KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CiAjaWZuZGVmIE1DQ29weQotCVB5TWFjX1BSRUNIRUNLKE1DQ29weSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNDb3B5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0NvcHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DQ29weShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0N1dChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OwogI2lmbmRlZiBNQ0N1dAotCVB5TWFjX1BSRUNIRUNLKE1DQ3V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0N1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNDdXQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DQ3V0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DUGFzdGUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllIHNyY01vdmllOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllIHNyY01vdmllOwogI2lmbmRlZiBNQ1Bhc3RlCi0JUHlNYWNfUFJFQ0hFQ0soTUNQYXN0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNQYXN0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmNNb3ZpZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DUGFzdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIHNyY01vdmllKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmNNb3ZpZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DUGFzdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIHNyY01vdmllKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0NsZWFyKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKICNpZm5kZWYgTUNDbGVhcgotCVB5TWFjX1BSRUNIRUNLKE1DQ2xlYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQ2xlYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DQ2xlYXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DQ2xlYXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNVbmRvKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKICNpZm5kZWYgTUNVbmRvCi0JUHlNYWNfUFJFQ0hFQ0soTUNVbmRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1VuZG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DVW5kbyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNVbmRvKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DUG9zaXRpb25Db250cm9sbGVyKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlSZWN0IG1vdmllUmVjdDsKLQlSZWN0IGNvbnRyb2xsZXJSZWN0OwotCWxvbmcgc29tZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFJlY3QgbW92aWVSZWN0OworICAgIFJlY3QgY29udHJvbGxlclJlY3Q7CisgICAgbG9uZyBzb21lRmxhZ3M7CiAjaWZuZGVmIE1DUG9zaXRpb25Db250cm9sbGVyCi0JUHlNYWNfUFJFQ0hFQ0soTUNQb3NpdGlvbkNvbnRyb2xsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DUG9zaXRpb25Db250cm9sbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJm1vdmllUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmNvbnRyb2xsZXJSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc29tZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNQb3NpdGlvbkNvbnRyb2xsZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cm9sbGVyUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJm1vdmllUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmNvbnRyb2xsZXJSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc29tZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNQb3NpdGlvbkNvbnRyb2xsZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cm9sbGVyUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckluZm8oTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCWxvbmcgc29tZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIGxvbmcgc29tZUZsYWdzOwogI2lmbmRlZiBNQ0dldENvbnRyb2xsZXJJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVySW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVySW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNHZXRDb250cm9sbGVySW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvbWVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc29tZUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRDb250cm9sbGVySW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvbWVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc29tZUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldENsaXAoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVJnbkhhbmRsZSB0aGVDbGlwOwotCVJnbkhhbmRsZSBtb3ZpZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUmduSGFuZGxlIG1vdmllQ2xpcDsKICNpZm5kZWYgTUNTZXRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRDbGlwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1NldENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZtb3ZpZUNsaXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldENsaXAoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgdGhlQ2xpcCwKLQkgICAgICAgICAgICAgICAgbW92aWVDbGlwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1vdmllQ2xpcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DU2V0Q2xpcChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICB0aGVDbGlwLAorICAgICAgICAgICAgICAgICAgICBtb3ZpZUNsaXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0Q2xpcChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUmduSGFuZGxlIHRoZUNsaXA7Ci0JUmduSGFuZGxlIG1vdmllQ2xpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKKyAgICBSZ25IYW5kbGUgbW92aWVDbGlwOwogI2lmbmRlZiBNQ0dldENsaXAKLQlQeU1hY19QUkVDSEVDSyhNQ0dldENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKE1DR2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNHZXRDbGlwKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICZ0aGVDbGlwLAotCSAgICAgICAgICAgICAgICAmbW92aWVDbGlwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVDbGlwLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG1vdmllQ2xpcCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DR2V0Q2xpcChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAmdGhlQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgJm1vdmllQ2xpcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBtb3ZpZUNsaXApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DRHJhd0JhZGdlKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlSZ25IYW5kbGUgbW92aWVSZ247Ci0JUmduSGFuZGxlIGJhZGdlUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFJnbkhhbmRsZSBtb3ZpZVJnbjsKKyAgICBSZ25IYW5kbGUgYmFkZ2VSZ247CiAjaWZuZGVmIE1DRHJhd0JhZGdlCi0JUHlNYWNfUFJFQ0hFQ0soTUNEcmF3QmFkZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DRHJhd0JhZGdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZtb3ZpZVJnbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DRHJhd0JhZGdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgbW92aWVSZ24sCi0JICAgICAgICAgICAgICAgICAgJmJhZGdlUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYmFkZ2VSZ24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZtb3ZpZVJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DRHJhd0JhZGdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgbW92aWVSZ24sCisgICAgICAgICAgICAgICAgICAgICAgJmJhZGdlUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYmFkZ2VSZ24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0VXBFZGl0TWVudShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JbG9uZyBtb2RpZmllcnM7Ci0JTWVudUhhbmRsZSBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBsb25nIG1vZGlmaWVyczsKKyAgICBNZW51SGFuZGxlIG1oOwogI2lmbmRlZiBNQ1NldFVwRWRpdE1lbnUKLQlQeU1hY19QUkVDSEVDSyhNQ1NldFVwRWRpdE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0VXBFZGl0TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0VXBFZGl0TWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgIG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DU2V0VXBFZGl0TWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0dldE1lbnVTdHJpbmcoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCWxvbmcgbW9kaWZpZXJzOwotCXNob3J0IGl0ZW07Ci0JU3RyMjU1IGFTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgbG9uZyBtb2RpZmllcnM7CisgICAgc2hvcnQgaXRlbTsKKyAgICBTdHIyNTUgYVN0cmluZzsKICNpZm5kZWYgTUNHZXRNZW51U3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRNZW51U3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldE1lbnVTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGFTdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldE1lbnVTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBhU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgYVN0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DR2V0TWVudVN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFTdHJpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DUHRJbkNvbnRyb2xsZXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVBvaW50IHRoZVB0OwotCUJvb2xlYW4gaW5Db250cm9sbGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFBvaW50IHRoZVB0OworICAgIEJvb2xlYW4gaW5Db250cm9sbGVyOwogI2lmbmRlZiBNQ1B0SW5Db250cm9sbGVyCi0JUHlNYWNfUFJFQ0hFQ0soTUNQdEluQ29udHJvbGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNQdEluQ29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1B0SW5Db250cm9sbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICB0aGVQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRyb2xsZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbGxlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNQdEluQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250cm9sbGVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbnRyb2xsZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DSW52YWxpZGF0ZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JV2luZG93UHRyIHc7Ci0JUmduSGFuZGxlIGludmFsaWRSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CisgICAgUmduSGFuZGxlIGludmFsaWRSZ247CiAjaWZuZGVmIE1DSW52YWxpZGF0ZQotCVB5TWFjX1BSRUNIRUNLKE1DSW52YWxpZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNJbnZhbGlkYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW52YWxpZFJnbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DSW52YWxpZGF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICB3LAotCSAgICAgICAgICAgICAgICAgICBpbnZhbGlkUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmludmFsaWRSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0ludmFsaWRhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNBZGp1c3RDdXJzb3IoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVdpbmRvd1B0ciB3OwotCVBvaW50IHdoZXJlOwotCWxvbmcgbW9kaWZpZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFdpbmRvd1B0ciB3OworICAgIFBvaW50IHdoZXJlOworICAgIGxvbmcgbW9kaWZpZXJzOwogI2lmbmRlZiBNQ0FkanVzdEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKE1DQWRqdXN0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0FkanVzdEN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ3aGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DQWRqdXN0Q3Vyc29yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdywKLQkgICAgICAgICAgICAgICAgICAgICB3aGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJndoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNBZGp1c3RDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRJbnRlcmZhY2VFbGVtZW50KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNQ0ludGVyZmFjZUVsZW1lbnQgd2hpY2hFbGVtZW50OwotCXZvaWQgKiBlbGVtZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1DSW50ZXJmYWNlRWxlbWVudCB3aGljaEVsZW1lbnQ7CisgICAgdm9pZCAqIGVsZW1lbnQ7CiAjaWZuZGVmIE1DR2V0SW50ZXJmYWNlRWxlbWVudAotCVB5TWFjX1BSRUNIRUNLKE1DR2V0SW50ZXJmYWNlRWxlbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRJbnRlcmZhY2VFbGVtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoRWxlbWVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldEludGVyZmFjZUVsZW1lbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hFbGVtZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRJbnRlcmZhY2VFbGVtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNBZGRNb3ZpZVNlZ21lbnQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllIHNyY01vdmllOwotCUJvb2xlYW4gc2NhbGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllIHNyY01vdmllOworICAgIEJvb2xlYW4gc2NhbGVkOwogI2lmbmRlZiBNQ0FkZE1vdmllU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKE1DQWRkTW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0FkZE1vdmllU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmc3JjTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY2FsZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0FkZE1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHNyY01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnNyY01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNBZGRNb3ZpZVNlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DVHJpbU1vdmllU2VnbWVudChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CiAjaWZuZGVmIE1DVHJpbU1vdmllU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKE1DVHJpbU1vdmllU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNUcmltTW92aWVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1RyaW1Nb3ZpZVNlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DVHJpbU1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldElkbGVNYW5hZ2VyKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlJZGxlTWFuYWdlciBpbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBJZGxlTWFuYWdlciBpbTsKICNpZm5kZWYgTUNTZXRJZGxlTWFuYWdlcgotCVB5TWFjX1BSRUNIRUNLKE1DU2V0SWRsZU1hbmFnZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldElkbGVNYW5hZ2VyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1NldElkbGVNYW5hZ2VyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlsb25nIGZsYWdzOwotCWxvbmcgZmxhZ3NNYXNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIGxvbmcgZmxhZ3M7CisgICAgbG9uZyBmbGFnc01hc2s7CiAjaWZuZGVmIE1DU2V0Q29udHJvbGxlckNhcGFiaWxpdGllcwotCVB5TWFjX1BSRUNIRUNLKE1DU2V0Q29udHJvbGxlckNhcGFiaWxpdGllcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgTW92aWVDdGxPYmpfbWV0aG9kc1tdID0gewotCXsiTUNTZXRNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldE1vdmllLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSB0aGVNb3ZpZSwgV2luZG93UHRyIG1vdmllV2luZG93LCBQb2ludCB3aGVyZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRJbmRNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldEluZE1vdmllLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJNQ1JlbW92ZUFsbE1vdmllcyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1JlbW92ZUFsbE1vdmllcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ1JlbW92ZUFNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1JlbW92ZUFNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNSZW1vdmVNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1JlbW92ZU1vdmllLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DSXNQbGF5ZXJFdmVudCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0lzUGxheWVyRXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DRG9BY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNEb0FjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgYWN0aW9uLCB2b2lkICogcGFyYW1zKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ1NldENvbnRyb2xsZXJBdHRhY2hlZCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJBdHRhY2hlZCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBhdHRhY2gpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DSXNDb250cm9sbGVyQXR0YWNoZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJc0NvbnRyb2xsZXJBdHRhY2hlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ1NldENvbnRyb2xsZXJQb3J0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlclBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyIGdwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0dldENvbnRyb2xsZXJQb3J0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlclBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCi0JeyJNQ1NldFZpc2libGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRWaXNpYmxlLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIHZpc2libGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0VmlzaWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldFZpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRDb250cm9sbGVyQm91bmRzUmVjdCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCi0JeyJNQ1NldENvbnRyb2xsZXJCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0dldENvbnRyb2xsZXJCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyQm91bmRzUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7Ik1DR2V0V2luZG93UmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0V2luZG93UmduLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgdykgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiTUNNb3ZpZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNNb3ZpZUNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllIG0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DU2V0RHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXREdXJhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0dldEN1cnJlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q3VycmVudFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVTY2FsZSBzY2FsZSkiKX0sCi0JeyJNQ05ld0F0dGFjaGVkQ29udHJvbGxlciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ05ld0F0dGFjaGVkQ29udHJvbGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgdGhlTW92aWUsIFdpbmRvd1B0ciB3LCBQb2ludCB3aGVyZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNEcmF3IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DRHJhdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DQWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNBY3RpdmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcsIEJvb2xlYW4gYWN0aXZhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DSWRsZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0lkbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNLZXkiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNLZXksIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQ4IGtleSwgbG9uZyBtb2RpZmllcnMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DQ2xpY2siLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNDbGljaywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcsIFBvaW50IHdoZXJlLCBsb25nIHdoZW4sIGxvbmcgbW9kaWZpZXJzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0VuYWJsZUVkaXRpbmciLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNFbmFibGVFZGl0aW5nLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGVuYWJsZWQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DSXNFZGl0aW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0lzRWRpdGluZ0VuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik1DQ29weSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0NvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJNQ0N1dCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0N1dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7Ik1DUGFzdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNQYXN0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgc3JjTW92aWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DQ2xlYXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNDbGVhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ1VuZG8iLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNVbmRvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DUG9zaXRpb25Db250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUG9zaXRpb25Db250cm9sbGVyLCAxLAotCSBQeURvY19TVFIoIihSZWN0IG1vdmllUmVjdCwgUmVjdCBjb250cm9sbGVyUmVjdCwgbG9uZyBzb21lRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0Q29udHJvbGxlckluZm8iLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVySW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzb21lRmxhZ3MpIil9LAotCXsiTUNTZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXAsIFJnbkhhbmRsZSBtb3ZpZUNsaXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0Q2xpcCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSB0aGVDbGlwLCBSZ25IYW5kbGUgbW92aWVDbGlwKSIpfSwKLQl7Ik1DRHJhd0JhZGdlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DRHJhd0JhZGdlLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgbW92aWVSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgYmFkZ2VSZ24pIil9LAotCXsiTUNTZXRVcEVkaXRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0VXBFZGl0TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtb2RpZmllcnMsIE1lbnVIYW5kbGUgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0TWVudVN0cmluZyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldE1lbnVTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbW9kaWZpZXJzLCBzaG9ydCBpdGVtLCBTdHIyNTUgYVN0cmluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNQdEluQ29udHJvbGxlciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1B0SW5Db250cm9sbGVyLCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0aGVQdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaW5Db250cm9sbGVyKSIpfSwKLQl7Ik1DSW52YWxpZGF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0ludmFsaWRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3LCBSZ25IYW5kbGUgaW52YWxpZFJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNBZGp1c3RDdXJzb3IiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNBZGp1c3RDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3LCBQb2ludCB3aGVyZSwgbG9uZyBtb2RpZmllcnMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0SW50ZXJmYWNlRWxlbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldEludGVyZmFjZUVsZW1lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE1DSW50ZXJmYWNlRWxlbWVudCB3aGljaEVsZW1lbnQsIHZvaWQgKiBlbGVtZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0FkZE1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0FkZE1vdmllU2VnbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgc3JjTW92aWUsIEJvb2xlYW4gc2NhbGVkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ1RyaW1Nb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNUcmltTW92aWVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DU2V0SWRsZU1hbmFnZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRJZGxlTWFuYWdlciwgMSwKLQkgUHlEb2NfU1RSKCIoSWRsZU1hbmFnZXIgaW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DU2V0Q29udHJvbGxlckNhcGFiaWxpdGllcyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJNQ1NldE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0TW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIHRoZU1vdmllLCBXaW5kb3dQdHIgbW92aWVXaW5kb3csIFBvaW50IHdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldEluZE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0SW5kTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoTW92aWUgX3J2KSIpfSwKKyAgICB7Ik1DUmVtb3ZlQWxsTW92aWVzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlQWxsTW92aWVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DUmVtb3ZlQU1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlQU1vdmllLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1JlbW92ZU1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNJc1BsYXllckV2ZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSXNQbGF5ZXJFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNEb0FjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0RvQWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBhY3Rpb24sIHZvaWQgKiBwYXJhbXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DU2V0Q29udHJvbGxlckF0dGFjaGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckF0dGFjaGVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGF0dGFjaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNJc0NvbnRyb2xsZXJBdHRhY2hlZCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0lzQ29udHJvbGxlckF0dGFjaGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DU2V0Q29udHJvbGxlclBvcnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dyYWZQdHIgZ3ApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DR2V0Q29udHJvbGxlclBvcnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7Ik1DU2V0VmlzaWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldFZpc2libGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gdmlzaWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0VmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKKyAgICB7Ik1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DR2V0Q29udHJvbGxlckJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJCb3VuZHNSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiTUNHZXRXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRXaW5kb3dSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3KSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJNQ01vdmllQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ01vdmllQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNTZXREdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldER1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DR2V0Q3VycmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDdXJyZW50VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydiwgVGltZVNjYWxlIHNjYWxlKSIpfSwKKyAgICB7Ik1DTmV3QXR0YWNoZWRDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DTmV3QXR0YWNoZWRDb250cm9sbGVyLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSB0aGVNb3ZpZSwgV2luZG93UHRyIHcsIFBvaW50IHdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0RyYXciLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNEcmF3LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0FjdGl2YXRlLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgQm9vbGVhbiBhY3RpdmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNJZGxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSWRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0tleSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0tleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDgga2V5LCBsb25nIG1vZGlmaWVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNDbGljayIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0NsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgUG9pbnQgd2hlcmUsIGxvbmcgd2hlbiwgbG9uZyBtb2RpZmllcnMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DRW5hYmxlRWRpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0VuYWJsZUVkaXRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gZW5hYmxlZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNJc0VkaXRpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSXNFZGl0aW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiTUNDb3B5IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKKyAgICB7Ik1DQ3V0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ3V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiTUNQYXN0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1Bhc3RlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBzcmNNb3ZpZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNDbGVhciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0NsZWFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DVW5kbyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1VuZG8sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNQb3NpdGlvbkNvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNQb3NpdGlvbkNvbnRyb2xsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgbW92aWVSZWN0LCBSZWN0IGNvbnRyb2xsZXJSZWN0LCBsb25nIHNvbWVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRDb250cm9sbGVySW5mbyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJJbmZvLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNvbWVGbGFncykiKX0sCisgICAgeyJNQ1NldENsaXAiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgdGhlQ2xpcCwgUmduSGFuZGxlIG1vdmllQ2xpcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q2xpcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIHRoZUNsaXAsIFJnbkhhbmRsZSBtb3ZpZUNsaXApIil9LAorICAgIHsiTUNEcmF3QmFkZ2UiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNEcmF3QmFkZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBtb3ZpZVJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSBiYWRnZVJnbikiKX0sCisgICAgeyJNQ1NldFVwRWRpdE1lbnUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRVcEVkaXRNZW51LCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1vZGlmaWVycywgTWVudUhhbmRsZSBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRNZW51U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0TWVudVN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtb2RpZmllcnMsIHNob3J0IGl0ZW0sIFN0cjI1NSBhU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1B0SW5Db250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUHRJbkNvbnRyb2xsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRoZVB0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBpbkNvbnRyb2xsZXIpIil9LAorICAgIHsiTUNJbnZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSW52YWxpZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcsIFJnbkhhbmRsZSBpbnZhbGlkUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0FkanVzdEN1cnNvciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0FkanVzdEN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcsIFBvaW50IHdoZXJlLCBsb25nIG1vZGlmaWVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRJbnRlcmZhY2VFbGVtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0SW50ZXJmYWNlRWxlbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTUNJbnRlcmZhY2VFbGVtZW50IHdoaWNoRWxlbWVudCwgdm9pZCAqIGVsZW1lbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DQWRkTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQWRkTW92aWVTZWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBzcmNNb3ZpZSwgQm9vbGVhbiBzY2FsZWQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DVHJpbU1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1RyaW1Nb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNTZXRJZGxlTWFuYWdlciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldElkbGVNYW5hZ2VyLCAxLAorICAgICBQeURvY19TVFIoIihJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckNhcGFiaWxpdGllcywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgTW92aWVDdGxPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xMjc4LDYxICsxMjc4LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCU1vdmllQ29udHJvbGxlciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIE1vdmllQ29udHJvbGxlciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNb3ZpZUN0bE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKE1vdmllQ29udHJvbGxlck9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNb3ZpZUN0bE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKE1vdmllQ29udHJvbGxlck9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBNb3ZpZUN0bE9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBNb3ZpZUNvbnRyb2xsZXJfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUXQuTW92aWVDb250cm9sbGVyIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTW92aWVDb250cm9sbGVyT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgTW92aWVDdGxPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgTW92aWVDdGxPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIE1vdmllQ3RsT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBNb3ZpZUN0bE9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlNb3ZpZUN0bE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlNb3ZpZUN0bE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlNb3ZpZUN0bE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JTW92aWVDdGxPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JTW92aWVDdGxPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlNb3ZpZUN0bE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1F0Lk1vdmllQ29udHJvbGxlciIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKE1vdmllQ29udHJvbGxlck9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIE1vdmllQ3RsT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIE1vdmllQ3RsT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBNb3ZpZUN0bE9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgTW92aWVDdGxPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTW92aWVDdGxPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgTW92aWVDdGxPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgTW92aWVDdGxPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIE1vdmllQ3RsT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIE1vdmllQ3RsT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgTW92aWVDdGxPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgTW92aWVDb250cm9sbGVyIC0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMzQ1LDQxNyArMTM0NSw0MTcgQEAKICNkZWZpbmUgVGltZUJhc2VPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmVGltZUJhc2VfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVGltZUJhc2VfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFRpbWVCYXNlT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVGltZUJhc2Ugb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUaW1lQmFzZSBvYl9pdHNlbGY7CiB9IFRpbWVCYXNlT2JqZWN0OwogCiBQeU9iamVjdCAqVGltZUJhc2VPYmpfTmV3KFRpbWVCYXNlIGl0c2VsZikKIHsKLQlUaW1lQmFzZU9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUXRfRXJyb3IsIkNhbm5vdCBjcmVhdGUgVGltZUJhc2UgZnJvbSBOVUxMIHBvaW50ZXIiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhUaW1lQmFzZU9iamVjdCwgJlRpbWVCYXNlX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBUaW1lQmFzZU9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUXRfRXJyb3IsIkNhbm5vdCBjcmVhdGUgVGltZUJhc2UgZnJvbSBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhUaW1lQmFzZU9iamVjdCwgJlRpbWVCYXNlX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IFRpbWVCYXNlT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRpbWVCYXNlICpwX2l0c2VsZikKIHsKLQlpZiAodiA9PSBQeV9Ob25lKQotCXsKLQkJKnBfaXRzZWxmID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghVGltZUJhc2VPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVGltZUJhc2UgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoVGltZUJhc2VPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFUaW1lQmFzZU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUaW1lQmFzZSByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChUaW1lQmFzZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFRpbWVCYXNlT2JqX2RlYWxsb2MoVGltZUJhc2VPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0Rpc3Bvc2VUaW1lQmFzZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEaXNwb3NlVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlVGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzcG9zZVRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZVRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVRpbWUoVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7Ci0JVGltZVNjYWxlIHM7Ci0JVGltZVJlY29yZCB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKKyAgICBUaW1lU2NhbGUgczsKKyAgICBUaW1lUmVjb3JkIHRyOwogI2lmbmRlZiBHZXRUaW1lQmFzZVRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUaW1lQmFzZVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJnRyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUaW1lQmFzZVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJnRyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVRpbWUoVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVSZWNvcmQgdHI7CiAjaWZuZGVmIFNldFRpbWVCYXNlVGltZQotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VGltZUJhc2VUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0cikpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAmdHIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUaW1lQmFzZVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgJnRyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VWYWx1ZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHQ7Ci0JVGltZVNjYWxlIHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSB0OworICAgIFRpbWVTY2FsZSBzOwogI2lmbmRlZiBTZXRUaW1lQmFzZVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGltZUJhc2VWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VGltZUJhc2VWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcykpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlVmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIHQsCi0JICAgICAgICAgICAgICAgICBzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUaW1lQmFzZVZhbHVlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlUmF0ZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CiAjaWZuZGVmIEdldFRpbWVCYXNlUmF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUaW1lQmFzZVJhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUaW1lQmFzZVJhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX1NldFRpbWVCYXNlUmF0ZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgcjsKICNpZm5kZWYgU2V0VGltZUJhc2VSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGltZUJhc2VSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUaW1lQmFzZVJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VSYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXJ0VGltZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKLQlUaW1lU2NhbGUgczsKLQlUaW1lUmVjb3JkIHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OworICAgIFRpbWVTY2FsZSBzOworICAgIFRpbWVSZWNvcmQgdHI7CiAjaWZuZGVmIEdldFRpbWVCYXNlU3RhcnRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VTdGFydFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlU3RhcnRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlU3RhcnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdHIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlU3RhcnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdHIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX1NldFRpbWVCYXNlU3RhcnRUaW1lKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lUmVjb3JkIHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIHRyOwogI2lmbmRlZiBTZXRUaW1lQmFzZVN0YXJ0VGltZQotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlU3RhcnRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVN0YXJ0VGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUaW1lQmFzZVN0YXJ0VGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICZ0cik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlU3RhcnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VTdG9wVGltZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKLQlUaW1lU2NhbGUgczsKLQlUaW1lUmVjb3JkIHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OworICAgIFRpbWVTY2FsZSBzOworICAgIFRpbWVSZWNvcmQgdHI7CiAjaWZuZGVmIEdldFRpbWVCYXNlU3RvcFRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVN0b3BUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVN0b3BUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlU3RvcFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdHIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlU3RvcFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdHIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX1NldFRpbWVCYXNlU3RvcFRpbWUoVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVSZWNvcmQgdHI7CiAjaWZuZGVmIFNldFRpbWVCYXNlU3RvcFRpbWUKLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVN0b3BUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVN0b3BUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0cikpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlU3RvcFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZ0cik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlU3RvcFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlRmxhZ3MoVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0VGltZUJhc2VGbGFncwotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VGbGFncyhUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyB0aW1lQmFzZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIHRpbWVCYXNlRmxhZ3M7CiAjaWZuZGVmIFNldFRpbWVCYXNlRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZUZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZUZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZUJhc2VGbGFncykpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIHRpbWVCYXNlRmxhZ3MpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVCYXNlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUaW1lQmFzZUZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICB0aW1lQmFzZUZsYWdzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZUJhc2UgbWFzdGVyOwotCVRpbWVSZWNvcmQgc2xhdmVaZXJvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lQmFzZSBtYXN0ZXI7CisgICAgVGltZVJlY29yZCBzbGF2ZVplcm87CiAjaWZuZGVmIFNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmbWFzdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJm1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzbGF2ZVplcm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xhdmVaZXJvKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZUJhc2UgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lQmFzZSBfcnY7CiAjaWZuZGVmIEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX1NldFRpbWVCYXNlTWFzdGVyQ2xvY2soVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBjbG9ja01laXN0ZXI7Ci0JVGltZVJlY29yZCBzbGF2ZVplcm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBjbG9ja01laXN0ZXI7CisgICAgVGltZVJlY29yZCBzbGF2ZVplcm87CiAjaWZuZGVmIFNldFRpbWVCYXNlTWFzdGVyQ2xvY2sKLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZU1hc3RlckNsb2NrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZU1hc3RlckNsb2NrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNsb2NrTWVpc3RlciwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzbGF2ZVplcm8pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUaW1lQmFzZU1hc3RlckNsb2NrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBjbG9ja01laXN0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2xhdmVaZXJvKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY2xvY2tNZWlzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlTWFzdGVyQ2xvY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrTWVpc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9HZXRUaW1lQmFzZU1hc3RlckNsb2NrKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRJbnN0YW5jZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudEluc3RhbmNlIF9ydjsKICNpZm5kZWYgR2V0VGltZUJhc2VNYXN0ZXJDbG9jawotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlTWFzdGVyQ2xvY2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlTWFzdGVyQ2xvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlTWFzdGVyQ2xvY2soX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VGltZUJhc2VNYXN0ZXJDbG9jayhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlU3RhdHVzKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlUaW1lUmVjb3JkIHVucGlubmVkVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgVGltZVJlY29yZCB1bnBpbm5lZFRpbWU7CiAjaWZuZGVmIEdldFRpbWVCYXNlU3RhdHVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VTdGF0dXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlU3RhdHVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUaW1lQmFzZVN0YXR1cyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ1bnBpbm5lZFRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdW5waW5uZWRUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VGltZUJhc2VTdGF0dXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5waW5uZWRUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJnVucGlubmVkVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VaZXJvKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lUmVjb3JkIHplcm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVSZWNvcmQgemVybzsKICNpZm5kZWYgU2V0VGltZUJhc2VaZXJvCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGltZUJhc2VaZXJvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVplcm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnplcm8pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUaW1lQmFzZVplcm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgJnplcm8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmemVybykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlWmVybyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAmemVybyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CiAjaWZuZGVmIEdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVGltZUJhc2VPYmpfbWV0aG9kc1tdID0gewotCXsiRGlzcG9zZVRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0Rpc3Bvc2VUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHMpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIHRyKSIpfSwKLQl7IlNldFRpbWVCYXNlVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgdHIpIC0+IE5vbmUiKX0sCi0JeyJTZXRUaW1lQmFzZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0LCBUaW1lU2NhbGUgcykgLT4gTm9uZSIpfSwKLQl7IkdldFRpbWVCYXNlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJTZXRUaW1lQmFzZVJhdGUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VSYXRlLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCByKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VTdGFydFRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VTdGFydFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVTY2FsZSBzKSAtPiAoVGltZVZhbHVlIF9ydiwgVGltZVJlY29yZCB0cikiKX0sCi0JeyJTZXRUaW1lQmFzZVN0YXJ0VGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVN0YXJ0VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0cikgLT4gTm9uZSIpfSwKLQl7IkdldFRpbWVCYXNlU3RvcFRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VTdG9wVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHMpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIHRyKSIpfSwKLQl7IlNldFRpbWVCYXNlU3RvcFRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VTdG9wVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0cikgLT4gTm9uZSIpfSwKLQl7IkdldFRpbWVCYXNlRmxhZ3MiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU2V0VGltZUJhc2VGbGFncyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihsb25nIHRpbWVCYXNlRmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJTZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVCYXNlIG1hc3RlciwgVGltZVJlY29yZCBzbGF2ZVplcm8pIC0+IE5vbmUiKX0sCi0JeyJHZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVCYXNlIF9ydikiKX0sCi0JeyJTZXRUaW1lQmFzZU1hc3RlckNsb2NrIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlTWFzdGVyQ2xvY2ssIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudCBjbG9ja01laXN0ZXIsIFRpbWVSZWNvcmQgc2xhdmVaZXJvKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VNYXN0ZXJDbG9jayIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZU1hc3RlckNsb2NrLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRJbnN0YW5jZSBfcnYpIil9LAotCXsiR2V0VGltZUJhc2VTdGF0dXMiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VTdGF0dXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2LCBUaW1lUmVjb3JkIHVucGlubmVkVGltZSkiKX0sCi0JeyJTZXRUaW1lQmFzZVplcm8iLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VaZXJvLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHplcm8pIC0+IE5vbmUiKX0sCi0JeyJHZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGaXhlZCBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiRGlzcG9zZVRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0Rpc3Bvc2VUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHMpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIHRyKSIpfSwKKyAgICB7IlNldFRpbWVCYXNlVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgdHIpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRUaW1lQmFzZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0LCBUaW1lU2NhbGUgcykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRpbWVCYXNlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJTZXRUaW1lQmFzZVJhdGUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCByKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VTdGFydFRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VTdGFydFRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVTY2FsZSBzKSAtPiAoVGltZVZhbHVlIF9ydiwgVGltZVJlY29yZCB0cikiKX0sCisgICAgeyJTZXRUaW1lQmFzZVN0YXJ0VGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVN0YXJ0VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0cikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRpbWVCYXNlU3RvcFRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VTdG9wVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHMpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIHRyKSIpfSwKKyAgICB7IlNldFRpbWVCYXNlU3RvcFRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VTdG9wVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0cikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRpbWVCYXNlRmxhZ3MiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0VGltZUJhc2VGbGFncyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHRpbWVCYXNlRmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVCYXNlIG1hc3RlciwgVGltZVJlY29yZCBzbGF2ZVplcm8pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVCYXNlIF9ydikiKX0sCisgICAgeyJTZXRUaW1lQmFzZU1hc3RlckNsb2NrIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlTWFzdGVyQ2xvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudCBjbG9ja01laXN0ZXIsIFRpbWVSZWNvcmQgc2xhdmVaZXJvKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VNYXN0ZXJDbG9jayIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZU1hc3RlckNsb2NrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRJbnN0YW5jZSBfcnYpIil9LAorICAgIHsiR2V0VGltZUJhc2VTdGF0dXMiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VTdGF0dXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2LCBUaW1lUmVjb3JkIHVucGlubmVkVGltZSkiKX0sCisgICAgeyJTZXRUaW1lQmFzZVplcm8iLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VaZXJvLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIHplcm8pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBUaW1lQmFzZU9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTE3NzIsNjEgKzE3NzIsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JVGltZUJhc2UgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBUaW1lQmFzZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUaW1lQmFzZU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFRpbWVCYXNlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoVGltZUJhc2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgVGltZUJhc2VPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgVGltZUJhc2VfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUXQuVGltZUJhc2UiLCAvKnRwX25hbWUqLwotCXNpemVvZihUaW1lQmFzZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFRpbWVCYXNlT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIFRpbWVCYXNlT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBUaW1lQmFzZU9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgVGltZUJhc2VPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JVGltZUJhc2VPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JVGltZUJhc2VPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JVGltZUJhc2VPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCVRpbWVCYXNlT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCVRpbWVCYXNlT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JVGltZUJhc2VPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RdC5UaW1lQmFzZSIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFRpbWVCYXNlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgVGltZUJhc2VPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVGltZUJhc2VPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFRpbWVCYXNlT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBUaW1lQmFzZU9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUaW1lQmFzZU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBUaW1lQmFzZU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBUaW1lQmFzZU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVGltZUJhc2VPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgVGltZUJhc2VPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBUaW1lQmFzZU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgVGltZUJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE4MzksMjk0ICsxODM5LDI5NCBAQAogI2RlZmluZSBVc2VyRGF0YU9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZVc2VyRGF0YV9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZVc2VyRGF0YV9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgVXNlckRhdGFPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlVc2VyRGF0YSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFVzZXJEYXRhIG9iX2l0c2VsZjsKIH0gVXNlckRhdGFPYmplY3Q7CiAKIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9OZXcoVXNlckRhdGEgaXRzZWxmKQogewotCVVzZXJEYXRhT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBVc2VyRGF0YSBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKFVzZXJEYXRhT2JqZWN0LCAmVXNlckRhdGFfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFVzZXJEYXRhT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBVc2VyRGF0YSBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKFVzZXJEYXRhT2JqZWN0LCAmVXNlckRhdGFfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVXNlckRhdGFPYmpfQ29udmVydChQeU9iamVjdCAqdiwgVXNlckRhdGEgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFVc2VyRGF0YU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJVc2VyRGF0YSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChVc2VyRGF0YU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIVVzZXJEYXRhT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlVzZXJEYXRhIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFVzZXJEYXRhT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgVXNlckRhdGFPYmpfZGVhbGxvYyhVc2VyRGF0YU9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlVXNlckRhdGEoc2VsZi0+b2JfaXRzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9pdHNlbGYpIERpc3Bvc2VVc2VyRGF0YShzZWxmLT5vYl9pdHNlbGYpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfR2V0VXNlckRhdGEoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGE7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhOworICAgIE9TVHlwZSB1ZFR5cGU7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgR2V0VXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhHZXRVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9BZGRVc2VyRGF0YShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YTsKLQlPU1R5cGUgdWRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhOworICAgIE9TVHlwZSB1ZFR5cGU7CiAjaWZuZGVmIEFkZFVzZXJEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soQWRkVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFVzZXJEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICB1ZFR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX1JlbW92ZVVzZXJEYXRhKFVzZXJEYXRhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSB1ZFR5cGU7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgdWRUeXBlOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIFJlbW92ZVVzZXJEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZVVzZXJEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZVVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZVVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX0NvdW50VXNlckRhdGFUeXBlKFVzZXJEYXRhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JT1NUeXBlIHVkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIE9TVHlwZSB1ZFR5cGU7CiAjaWZuZGVmIENvdW50VXNlckRhdGFUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnRVc2VyRGF0YVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50VXNlckRhdGFUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRVc2VyRGF0YVR5cGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRVc2VyRGF0YVR5cGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX0dldE5leHRVc2VyRGF0YVR5cGUoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCU9TVHlwZSB1ZFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIE9TVHlwZSB1ZFR5cGU7CiAjaWZuZGVmIEdldE5leHRVc2VyRGF0YVR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0VXNlckRhdGFUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXh0VXNlckRhdGFUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV4dFVzZXJEYXRhVHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHRVc2VyRGF0YVR5cGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfQWRkVXNlckRhdGFUZXh0KFVzZXJEYXRhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhOwotCU9TVHlwZSB1ZFR5cGU7Ci0JbG9uZyBpbmRleDsKLQlzaG9ydCBpdGxSZWdpb25UYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGE7CisgICAgT1NUeXBlIHVkVHlwZTsKKyAgICBsb25nIGluZGV4OworICAgIHNob3J0IGl0bFJlZ2lvblRhZzsKICNpZm5kZWYgQWRkVXNlckRhdGFUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soQWRkVXNlckRhdGFUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRVc2VyRGF0YVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0bFJlZ2lvblRhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRVc2VyRGF0YVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGl0bFJlZ2lvblRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0bFJlZ2lvblRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRVc2VyRGF0YVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0bFJlZ2lvblRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfR2V0VXNlckRhdGFUZXh0KFVzZXJEYXRhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhOwotCU9TVHlwZSB1ZFR5cGU7Ci0JbG9uZyBpbmRleDsKLQlzaG9ydCBpdGxSZWdpb25UYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGE7CisgICAgT1NUeXBlIHVkVHlwZTsKKyAgICBsb25nIGluZGV4OworICAgIHNob3J0IGl0bFJlZ2lvblRhZzsKICNpZm5kZWYgR2V0VXNlckRhdGFUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VXNlckRhdGFUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRVc2VyRGF0YVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0bFJlZ2lvblRhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRVc2VyRGF0YVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGl0bFJlZ2lvblRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0bFJlZ2lvblRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRVc2VyRGF0YVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0bFJlZ2lvblRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfUmVtb3ZlVXNlckRhdGFUZXh0KFVzZXJEYXRhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSB1ZFR5cGU7Ci0JbG9uZyBpbmRleDsKLQlzaG9ydCBpdGxSZWdpb25UYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHVkVHlwZTsKKyAgICBsb25nIGluZGV4OworICAgIHNob3J0IGl0bFJlZ2lvblRhZzsKICNpZm5kZWYgUmVtb3ZlVXNlckRhdGFUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlVXNlckRhdGFUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVVc2VyRGF0YVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZVVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpdGxSZWdpb25UYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0bFJlZ2lvblRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVVc2VyRGF0YVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9QdXRVc2VyRGF0YUludG9IYW5kbGUoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIFB1dFVzZXJEYXRhSW50b0hhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFB1dFVzZXJEYXRhSW50b0hhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHV0VXNlckRhdGFJbnRvSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFB1dFVzZXJEYXRhSW50b0hhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0VXNlckRhdGFJbnRvSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9Db3B5VXNlckRhdGEoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVXNlckRhdGEgZHN0VXNlckRhdGE7Ci0JT1NUeXBlIGNvcHlSdWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVzZXJEYXRhIGRzdFVzZXJEYXRhOworICAgIE9TVHlwZSBjb3B5UnVsZTsKICNpZm5kZWYgQ29weVVzZXJEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soQ29weVVzZXJEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5VXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZkc3RVc2VyRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29weVJ1bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weVVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBkc3RVc2VyRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgIGNvcHlSdWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJmRzdFVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5VXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVXNlckRhdGFPYmpfbWV0aG9kc1tdID0gewotCXsiR2V0VXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfR2V0VXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAotCXsiQWRkVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQWRkVXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlKSAtPiBOb25lIil9LAotCXsiUmVtb3ZlVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfUmVtb3ZlVXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCi0JeyJDb3VudFVzZXJEYXRhVHlwZSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9Db3VudFVzZXJEYXRhVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXROZXh0VXNlckRhdGFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0dldE5leHRVc2VyRGF0YVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUpIC0+IChsb25nIF9ydikiKX0sCi0JeyJBZGRVc2VyRGF0YVRleHQiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQWRkVXNlckRhdGFUZXh0LCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YSwgT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCwgc2hvcnQgaXRsUmVnaW9uVGFnKSAtPiBOb25lIil9LAotCXsiR2V0VXNlckRhdGFUZXh0IiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0dldFVzZXJEYXRhVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGEsIE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgsIHNob3J0IGl0bFJlZ2lvblRhZykgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZVVzZXJEYXRhVGV4dCIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9SZW1vdmVVc2VyRGF0YVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgsIHNob3J0IGl0bFJlZ2lvblRhZykgLT4gTm9uZSIpfSwKLQl7IlB1dFVzZXJEYXRhSW50b0hhbmRsZSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9QdXRVc2VyRGF0YUludG9IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiBOb25lIil9LAotCXsiQ29weVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0NvcHlVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoVXNlckRhdGEgZHN0VXNlckRhdGEsIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldFVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0dldFVzZXJEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YSwgT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkFkZFVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0FkZFVzZXJEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YSwgT1NUeXBlIHVkVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IlJlbW92ZVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX1JlbW92ZVVzZXJEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgdWRUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiQ291bnRVc2VyRGF0YVR5cGUiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQ291bnRVc2VyRGF0YVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0TmV4dFVzZXJEYXRhVHlwZSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9HZXROZXh0VXNlckRhdGFUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgdWRUeXBlKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiQWRkVXNlckRhdGFUZXh0IiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0FkZFVzZXJEYXRhVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGEsIE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgsIHNob3J0IGl0bFJlZ2lvblRhZykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFVzZXJEYXRhVGV4dCIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9HZXRVc2VyRGF0YVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlLCBsb25nIGluZGV4LCBzaG9ydCBpdGxSZWdpb25UYWcpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVVc2VyRGF0YVRleHQiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfUmVtb3ZlVXNlckRhdGFUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgdWRUeXBlLCBsb25nIGluZGV4LCBzaG9ydCBpdGxSZWdpb25UYWcpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRVc2VyRGF0YUludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfUHV0VXNlckRhdGFJbnRvSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9Db3B5VXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKFVzZXJEYXRhIGRzdFVzZXJEYXRhLCBPU1R5cGUgY29weVJ1bGUpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFVzZXJEYXRhT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMjE0Myw2MSArMjE0Myw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlVc2VyRGF0YSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFVzZXJEYXRhIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoVXNlckRhdGFPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVXNlckRhdGFPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChVc2VyRGF0YU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBVc2VyRGF0YU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBVc2VyRGF0YV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RdC5Vc2VyRGF0YSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFVzZXJEYXRhT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgVXNlckRhdGFPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgVXNlckRhdGFPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFVzZXJEYXRhT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBVc2VyRGF0YU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlVc2VyRGF0YU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlVc2VyRGF0YU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlVc2VyRGF0YU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JVXNlckRhdGFPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVXNlckRhdGFPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlVc2VyRGF0YU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1F0LlVzZXJEYXRhIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoVXNlckRhdGFPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBVc2VyRGF0YU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBVc2VyRGF0YU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgVXNlckRhdGFPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFVzZXJEYXRhT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIFVzZXJEYXRhT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIFVzZXJEYXRhT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFVzZXJEYXRhT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBVc2VyRGF0YU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBVc2VyRGF0YU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFVzZXJEYXRhT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBVc2VyRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjIxMCwxMTY1ICsyMjEwLDExNjUgQEAKICNkZWZpbmUgTWVkaWFPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmTWVkaWFfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmTWVkaWFfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IE1lZGlhT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JTWVkaWEgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBNZWRpYSBvYl9pdHNlbGY7CiB9IE1lZGlhT2JqZWN0OwogCiBQeU9iamVjdCAqTWVkaWFPYmpfTmV3KE1lZGlhIGl0c2VsZikKIHsKLQlNZWRpYU9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUXRfRXJyb3IsIkNhbm5vdCBjcmVhdGUgTWVkaWEgZnJvbSBOVUxMIHBvaW50ZXIiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhNZWRpYU9iamVjdCwgJk1lZGlhX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBNZWRpYU9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUXRfRXJyb3IsIkNhbm5vdCBjcmVhdGUgTWVkaWEgZnJvbSBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhNZWRpYU9iamVjdCwgJk1lZGlhX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IE1lZGlhT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIE1lZGlhICpwX2l0c2VsZikKIHsKLQlpZiAodiA9PSBQeV9Ob25lKQotCXsKLQkJKnBfaXRzZWxmID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghTWVkaWFPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTWVkaWEgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoTWVkaWFPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFNZWRpYU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNZWRpYSByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChNZWRpYU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIE1lZGlhT2JqX2RlYWxsb2MoTWVkaWFPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZVRyYWNrTWVkaWEoc2VsZi0+b2JfaXRzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9pdHNlbGYpIERpc3Bvc2VUcmFja01lZGlhKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9Mb2FkTWVkaWFJbnRvUmFtKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRpbWVWYWx1ZSB0aW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBMb2FkTWVkaWFJbnRvUmFtCi0JUHlNYWNfUFJFQ0hFQ0soTG9hZE1lZGlhSW50b1JhbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTG9hZE1lZGlhSW50b1JhbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTG9hZE1lZGlhSW50b1JhbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMb2FkTWVkaWFJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFUcmFjayhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CiAjaWZuZGVmIEdldE1lZGlhVHJhY2sKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVRyYWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVRyYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZWRpYVRyYWNrKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYVRyYWNrKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhQ3JlYXRpb25UaW1lKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgdW5zaWduZWQgbG9uZyBfcnY7CiAjaWZuZGVmIEdldE1lZGlhQ3JlYXRpb25UaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFDcmVhdGlvblRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhQ3JlYXRpb25UaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZWRpYUNyZWF0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFDcmVhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgdW5zaWduZWQgbG9uZyBfcnY7CiAjaWZuZGVmIEdldE1lZGlhTW9kaWZpY2F0aW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhTW9kaWZpY2F0aW9uVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhTW9kaWZpY2F0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVRpbWVTY2FsZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVNjYWxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVNjYWxlIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFUaW1lU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYVRpbWVTY2FsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVRpbWVTY2FsZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVNjYWxlIHRpbWVTY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVNjYWxlIHRpbWVTY2FsZTsKICNpZm5kZWYgU2V0TWVkaWFUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFUaW1lU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lU2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZWRpYVRpbWVTY2FsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHRpbWVTY2FsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZVNjYWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVkaWFUaW1lU2NhbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICB0aW1lU2NhbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYUR1cmF0aW9uKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OwogI2lmbmRlZiBHZXRNZWRpYUR1cmF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEdXJhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEdXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFEdXJhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFEdXJhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYUxhbmd1YWdlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0TWVkaWFMYW5ndWFnZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhTGFuZ3VhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhTGFuZ3VhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhTGFuZ3VhZ2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhTGFuZ3VhZ2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfU2V0TWVkaWFMYW5ndWFnZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbGFuZ3VhZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGxhbmd1YWdlOwogI2lmbmRlZiBTZXRNZWRpYUxhbmd1YWdlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFMYW5ndWFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFMYW5ndWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxhbmd1YWdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TWVkaWFMYW5ndWFnZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxhbmd1YWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVkaWFMYW5ndWFnZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVF1YWxpdHkoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVF1YWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhUXVhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFRdWFsaXR5KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYVF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfU2V0TWVkaWFRdWFsaXR5KE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBxdWFsaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBxdWFsaXR5OwogI2lmbmRlZiBTZXRNZWRpYVF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVF1YWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhUXVhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZWRpYVF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgcXVhbGl0eSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1lZGlhUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBxdWFsaXR5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFIYW5kbGVyRGVzY3JpcHRpb24oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TVHlwZSBtZWRpYVR5cGU7Ci0JU3RyMjU1IGNyZWF0b3JOYW1lOwotCU9TVHlwZSBjcmVhdG9yTWFudWZhY3R1cmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOworICAgIFN0cjI1NSBjcmVhdG9yTmFtZTsKKyAgICBPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcjsKICNpZm5kZWYgR2V0TWVkaWFIYW5kbGVyRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFIYW5kbGVyRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGNyZWF0b3JOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFIYW5kbGVyRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdG9yTWFudWZhY3R1cmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIG1lZGlhVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgY3JlYXRvck1hbnVmYWN0dXJlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGNyZWF0b3JOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TWVkaWFIYW5kbGVyRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdG9yTWFudWZhY3R1cmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgY3JlYXRvck1hbnVmYWN0dXJlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFVc2VyRGF0YShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVXNlckRhdGEgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVc2VyRGF0YSBfcnY7CiAjaWZuZGVmIEdldE1lZGlhVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVVzZXJEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVVzZXJEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZWRpYVVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYVVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhSGFuZGxlcihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVkaWFIYW5kbGVyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVkaWFIYW5kbGVyIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFIYW5kbGVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUhhbmRsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYUhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYUhhbmRsZXIoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTWVkaWFIYW5kbGVyQ29tcG9uZW50IG1IOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1lZGlhSGFuZGxlckNvbXBvbmVudCBtSDsKICNpZm5kZWYgU2V0TWVkaWFIYW5kbGVyCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYUhhbmRsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJm1IKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lZGlhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgbUgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZtSCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYUhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9CZWdpbk1lZGlhRWRpdHMoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEJlZ2luTWVkaWFFZGl0cwotCVB5TWFjX1BSRUNIRUNLKEJlZ2luTWVkaWFFZGl0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQmVnaW5NZWRpYUVkaXRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQmVnaW5NZWRpYUVkaXRzKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQmVnaW5NZWRpYUVkaXRzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0VuZE1lZGlhRWRpdHMoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEVuZE1lZGlhRWRpdHMKLQlQeU1hY19QUkVDSEVDSyhFbmRNZWRpYUVkaXRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbmRNZWRpYUVkaXRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW5kTWVkaWFFZGl0cyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVuZE1lZGlhRWRpdHMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4KE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBTZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpbmRleDsKLQlPU1R5cGUgZGhUeXBlOwotCVN0cjI1NSBjcmVhdG9yTmFtZTsKLQlPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaW5kZXg7CisgICAgT1NUeXBlIGRoVHlwZTsKKyAgICBTdHIyNTUgY3JlYXRvck5hbWU7CisgICAgT1NUeXBlIGNyZWF0b3JNYW51ZmFjdHVyZXI7CiAjaWZuZGVmIEdldE1lZGlhRGF0YUhhbmRsZXJEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhRGF0YUhhbmRsZXJEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBjcmVhdG9yTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCUdldE1lZGlhRGF0YUhhbmRsZXJEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdG9yTWFudWZhY3R1cmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRoVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgY3JlYXRvck1hbnVmYWN0dXJlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGNyZWF0b3JOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0b3JNYW51ZmFjdHVyZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yTWFudWZhY3R1cmVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYURhdGFIYW5kbGVyKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEYXRhSGFuZGxlciBfcnY7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERhdGFIYW5kbGVyIF9ydjsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0TWVkaWFEYXRhSGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhRGF0YUhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhRGF0YUhhbmRsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhRGF0YUhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYURhdGFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYURhdGFIYW5kbGVyKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGluZGV4OwotCURhdGFIYW5kbGVyQ29tcG9uZW50IGRhdGFIYW5kbGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGluZGV4OworICAgIERhdGFIYW5kbGVyQ29tcG9uZW50IGRhdGFIYW5kbGVyOwogI2lmbmRlZiBTZXRNZWRpYURhdGFIYW5kbGVyCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFEYXRhSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFEYXRhSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmZGF0YUhhbmRsZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFEYXRhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFIYW5kbGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmZGF0YUhhbmRsZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVkaWFEYXRhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFIYW5kbGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgaW5kZXg7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgaW5kZXg7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0g7CiAjaWZuZGVmIEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjSCkpCi0JCXJldHVybiBOVUxMOwotCUdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY0gpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzY0gpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NIKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfU2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OwotCVNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2NIOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0g7CiAjaWZuZGVmIFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjSCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY0gpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjSCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY0gpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhU2FtcGxlQ291bnQoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFTYW1wbGVDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhU2FtcGxlQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhU2FtcGxlQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTeW5jU2FtcGxlQ291bnQoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFTeW5jU2FtcGxlQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVN5bmNTYW1wbGVDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFTeW5jU2FtcGxlQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhU3luY1NhbXBsZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYVN5bmNTYW1wbGVDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TYW1wbGVOdW1Ub01lZGlhVGltZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBsb2dpY2FsU2FtcGxlTnVtOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOwotCVRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBsb2dpY2FsU2FtcGxlTnVtOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbjsKICNpZm5kZWYgU2FtcGxlTnVtVG9NZWRpYVRpbWUKLQlQeU1hY19QUkVDSEVDSyhTYW1wbGVOdW1Ub01lZGlhVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2FtcGxlTnVtVG9NZWRpYVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2dpY2FsU2FtcGxlTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2FtcGxlTnVtVG9NZWRpYVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsU2FtcGxlTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVEdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvZ2ljYWxTYW1wbGVOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTYW1wbGVOdW1Ub01lZGlhVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxTYW1wbGVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX01lZGlhVGltZVRvU2FtcGxlTnVtKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgdGltZTsKLQlsb25nIHNhbXBsZU51bTsKLQlUaW1lVmFsdWUgc2FtcGxlVGltZTsKLQlUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIGxvbmcgc2FtcGxlTnVtOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbjsKICNpZm5kZWYgTWVkaWFUaW1lVG9TYW1wbGVOdW0KLQlQeU1hY19QUkVDSEVDSyhNZWRpYVRpbWVUb1NhbXBsZU51bSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFUaW1lVG9TYW1wbGVOdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWVkaWFUaW1lVG9TYW1wbGVOdW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWVkaWFUaW1lVG9TYW1wbGVOdW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfQWRkTWVkaWFTYW1wbGUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFJbjsKLQlsb25nIGluT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOwotCWxvbmcgbnVtYmVyT2ZTYW1wbGVzOwotCXNob3J0IHNhbXBsZUZsYWdzOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhSW47CisgICAgbG9uZyBpbk9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlOworICAgIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSDsKKyAgICBsb25nIG51bWJlck9mU2FtcGxlczsKKyAgICBzaG9ydCBzYW1wbGVGbGFnczsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKICNpZm5kZWYgQWRkTWVkaWFTYW1wbGUKLQlQeU1hY19QUkVDSEVDSyhBZGRNZWRpYVNhbXBsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkTWVkaWFTYW1wbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxPJmxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhSW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgsCi0JICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRNZWRpYVNhbXBsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBkYXRhSW4sCi0JICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblBlclNhbXBsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxPJmxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRNZWRpYVNhbXBsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBkYXRhT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOwotCWxvbmcgbnVtYmVyT2ZTYW1wbGVzOwotCXNob3J0IHNhbXBsZUZsYWdzOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgZGF0YU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlOworICAgIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSDsKKyAgICBsb25nIG51bWJlck9mU2FtcGxlczsKKyAgICBzaG9ydCBzYW1wbGVGbGFnczsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKICNpZm5kZWYgQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhBZGRNZWRpYVNhbXBsZVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsTyZsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZE1lZGlhU2FtcGxlUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxPJmxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb25QZXJTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25QZXJTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhU2FtcGxlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhT3V0OwotCWxvbmcgbWF4U2l6ZVRvR3JvdzsKLQlsb25nIHNpemU7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlOwotCVNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSDsKLQlsb25nIHNhbXBsZURlc2NyaXB0aW9uSW5kZXg7Ci0JbG9uZyBtYXhOdW1iZXJPZlNhbXBsZXM7Ci0JbG9uZyBudW1iZXJPZlNhbXBsZXM7Ci0Jc2hvcnQgc2FtcGxlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFPdXQ7CisgICAgbG9uZyBtYXhTaXplVG9Hcm93OworICAgIGxvbmcgc2l6ZTsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOworICAgIGxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleDsKKyAgICBsb25nIG1heE51bWJlck9mU2FtcGxlczsKKyAgICBsb25nIG51bWJlck9mU2FtcGxlczsKKyAgICBzaG9ydCBzYW1wbGVGbGFnczsKICNpZm5kZWYgR2V0TWVkaWFTYW1wbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFTYW1wbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YU91dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemVUb0dyb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heE51bWJlck9mU2FtcGxlcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZWRpYVNhbXBsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBkYXRhT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplVG9Hcm93LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRGVzY3JpcHRpb25JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgbWF4TnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGxsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZVRvR3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4TnVtYmVyT2ZTYW1wbGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lZGlhU2FtcGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemVUb0dyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uUGVyU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVEZXNjcmlwdGlvbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOdW1iZXJPZlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbGxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25QZXJTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhU2FtcGxlUmVmZXJlbmNlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgZGF0YU9mZnNldDsKLQlsb25nIHNpemU7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlOwotCVNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSDsKLQlsb25nIHNhbXBsZURlc2NyaXB0aW9uSW5kZXg7Ci0JbG9uZyBtYXhOdW1iZXJPZlNhbXBsZXM7Ci0JbG9uZyBudW1iZXJPZlNhbXBsZXM7Ci0Jc2hvcnQgc2FtcGxlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBkYXRhT2Zmc2V0OworICAgIGxvbmcgc2l6ZTsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOworICAgIGxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleDsKKyAgICBsb25nIG1heE51bWJlck9mU2FtcGxlczsKKyAgICBsb25nIG51bWJlck9mU2FtcGxlczsKKyAgICBzaG9ydCBzYW1wbGVGbGFnczsKICNpZm5kZWYgR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heE51bWJlck9mU2FtcGxlcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb25QZXJTYW1wbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE51bWJlck9mU2FtcGxlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsbGxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblBlclNhbXBsZSwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE51bWJlck9mU2FtcGxlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb25QZXJTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsbGxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBtYXhDaHVua1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBtYXhDaHVua1NpemU7CiAjaWZuZGVmIFNldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4Q2h1bmtTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heENodW5rU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhDaHVua1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q2h1bmtTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIG1heENodW5rU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIG1heENodW5rU2l6ZTsKICNpZm5kZWYgR2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4Q2h1bmtTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBtYXhDaHVua1NpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heENodW5rU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q2h1bmtTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVNoYWRvd1N5bmMoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBmcmFtZURpZmZTYW1wbGVOdW07Ci0JbG9uZyBzeW5jU2FtcGxlTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgZnJhbWVEaWZmU2FtcGxlTnVtOworICAgIGxvbmcgc3luY1NhbXBsZU51bTsKICNpZm5kZWYgU2V0TWVkaWFTaGFkb3dTeW5jCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFTaGFkb3dTeW5jKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVNoYWRvd1N5bmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVEaWZmU2FtcGxlTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3luY1NhbXBsZU51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZWRpYVNoYWRvd1N5bmMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGlmZlNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lRGlmZlNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN5bmNTYW1wbGVOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVkaWFTaGFkb3dTeW5jKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZURpZmZTYW1wbGVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVNoYWRvd1N5bmMoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBmcmFtZURpZmZTYW1wbGVOdW07Ci0JbG9uZyBzeW5jU2FtcGxlTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgZnJhbWVEaWZmU2FtcGxlTnVtOworICAgIGxvbmcgc3luY1NhbXBsZU51bTsKICNpZm5kZWYgR2V0TWVkaWFTaGFkb3dTeW5jCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFTaGFkb3dTeW5jKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNoYWRvd1N5bmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmcmFtZURpZmZTYW1wbGVOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVkaWFTaGFkb3dTeW5jKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZURpZmZTYW1wbGVOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmc3luY1NhbXBsZU51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgc3luY1NhbXBsZU51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZURpZmZTYW1wbGVOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVkaWFTaGFkb3dTeW5jKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZURpZmZTYW1wbGVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3luY1NhbXBsZU51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3luY1NhbXBsZU51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFEYXRhU2l6ZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBHZXRNZWRpYURhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYURhdGFTaXplNjQoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247Ci0Jd2lkZSBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICB3aWRlIGRhdGFTaXplOwogI2lmbmRlZiBHZXRNZWRpYURhdGFTaXplNjQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhRGF0YVNpemU2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZWRpYURhdGFTaXplNjQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVkaWFEYXRhU2l6ZTY0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0NvcHlNZWRpYVVzZXJEYXRhKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1lZGlhIGRzdE1lZGlhOwotCU9TVHlwZSBjb3B5UnVsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNZWRpYSBkc3RNZWRpYTsKKyAgICBPU1R5cGUgY29weVJ1bGU7CiAjaWZuZGVmIENvcHlNZWRpYVVzZXJEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1lZGlhVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlNZWRpYVVzZXJEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNZWRpYU9ial9Db252ZXJ0LCAmZHN0TWVkaWEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvcHlSdWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvcHlNZWRpYVVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE1lZGlhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UnVsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX0NvbnZlcnQsICZkc3RNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29weVJ1bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weU1lZGlhVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TWVkaWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlSdWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzOwotCVRpbWVWYWx1ZSB0aW1lOwotCUZpeGVkIHJhdGU7Ci0JVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKLQlUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgRml4ZWQgcmF0ZTsKKyAgICBUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lOworICAgIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uOwogI2lmbmRlZiBHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdEdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdEdXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nRHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nRHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhRGF0YVJlZihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBpbmRleDsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JbG9uZyBkYXRhUmVmQXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBpbmRleDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgbG9uZyBkYXRhUmVmQXR0cmlidXRlczsKICNpZm5kZWYgR2V0TWVkaWFEYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZWRpYURhdGFSZWYoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZkF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmQXR0cmlidXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYURhdGFSZWYoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZkF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmQXR0cmlidXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfU2V0TWVkaWFEYXRhUmVmKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGluZGV4OwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBpbmRleDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIFNldE1lZGlhRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgaW5kZXg7Ci0JbG9uZyBkYXRhUmVmQXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBpbmRleDsKKyAgICBsb25nIGRhdGFSZWZBdHRyaWJ1dGVzOwogI2lmbmRlZiBTZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZBdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmQXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmQXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZkF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0FkZE1lZGlhRGF0YVJlZihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBpbmRleDsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgaW5kZXg7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBBZGRNZWRpYURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhBZGRNZWRpYURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZE1lZGlhRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRNZWRpYURhdGFSZWYoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFEYXRhUmVmQ291bnQoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgY291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgY291bnQ7CiAjaWZuZGVmIEdldE1lZGlhRGF0YVJlZkNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhUmVmQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhRGF0YVJlZkNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVkaWFEYXRhUmVmQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBjb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYURhdGFSZWZDb3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVBsYXlIaW50cyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGZsYWdzTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGZsYWdzTWFzazsKICNpZm5kZWYgU2V0TWVkaWFQbGF5SGludHMKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVBsYXlIaW50cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFQbGF5SGludHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZWRpYVBsYXlIaW50cyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVkaWFQbGF5SGludHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVBsYXlIaW50cyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgR2V0TWVkaWFQbGF5SGludHMKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVBsYXlIaW50cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFQbGF5SGludHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldE1lZGlhUGxheUhpbnRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZWRpYVBsYXlIaW50cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5KE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFnczsKLQlUaW1lVmFsdWUgdGltZTsKLQlGaXhlZCByYXRlOwotCVRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIEZpeGVkIHJhdGU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKICNpZm5kZWYgR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCUdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgTWVkaWFPYmpfbWV0aG9kc1tdID0gewotCXsiTG9hZE1lZGlhSW50b1JhbSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9Mb2FkTWVkaWFJbnRvUmFtLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFUcmFjayIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVRyYWNrLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUcmFjayBfcnYpIil9LAotCXsiR2V0TWVkaWFDcmVhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFDcmVhdGlvblRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKLQl7IkdldE1lZGlhTW9kaWZpY2F0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKLQl7IkdldE1lZGlhVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lU2NhbGUgX3J2KSIpfSwKLQl7IlNldE1lZGlhVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihUaW1lU2NhbGUgdGltZVNjYWxlKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUR1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7IkdldE1lZGlhTGFuZ3VhZ2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFMYW5ndWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldE1lZGlhTGFuZ3VhZ2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFMYW5ndWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbGFuZ3VhZ2UpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFRdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiU2V0TWVkaWFRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhUXVhbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcXVhbGl0eSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lZGlhSGFuZGxlckRlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhSGFuZGxlckRlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgY3JlYXRvck5hbWUpIC0+IChPU1R5cGUgbWVkaWFUeXBlLCBPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcikiKX0sCi0JeyJHZXRNZWRpYVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhVXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCi0JeyJHZXRNZWRpYUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZWRpYUhhbmRsZXIgX3J2KSIpfSwKLQl7IlNldE1lZGlhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlckNvbXBvbmVudCBtSCkgLT4gTm9uZSIpfSwKLQl7IkJlZ2luTWVkaWFFZGl0cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9CZWdpbk1lZGlhRWRpdHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkVuZE1lZGlhRWRpdHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfRW5kTWVkaWFFZGl0cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgU3RyMjU1IGNyZWF0b3JOYW1lKSAtPiAoT1NUeXBlIGRoVHlwZSwgT1NUeXBlIGNyZWF0b3JNYW51ZmFjdHVyZXIpIil9LAotCXsiR2V0TWVkaWFEYXRhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKERhdGFIYW5kbGVyIF9ydikiKX0sCi0JeyJTZXRNZWRpYURhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGF0YUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBEYXRhSGFuZGxlckNvbXBvbmVudCBkYXRhSGFuZGxlcikgLT4gTm9uZSIpfSwKLQl7IkdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0gpIC0+IE5vbmUiKX0sCi0JeyJTZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2NIKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFTYW1wbGVDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZUNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJHZXRNZWRpYVN5bmNTYW1wbGVDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVN5bmNTYW1wbGVDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU2FtcGxlTnVtVG9NZWRpYVRpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2FtcGxlTnVtVG9NZWRpYVRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbG9naWNhbFNhbXBsZU51bSkgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb24pIil9LAotCXsiTWVkaWFUaW1lVG9TYW1wbGVOdW0iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfTWVkaWFUaW1lVG9TYW1wbGVOdW0sIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lKSAtPiAobG9uZyBzYW1wbGVOdW0sIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb24pIil9LAotCXsiQWRkTWVkaWFTYW1wbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQWRkTWVkaWFTYW1wbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhSW4sIGxvbmcgaW5PZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKLQl7IkFkZE1lZGlhU2FtcGxlUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0FkZE1lZGlhU2FtcGxlUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKLQl7IkdldE1lZGlhU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YU91dCwgbG9uZyBtYXhTaXplVG9Hcm93LCBUaW1lVmFsdWUgdGltZSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25ILCBsb25nIG1heE51bWJlck9mU2FtcGxlcykgLT4gKGxvbmcgc2l6ZSwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZSwgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LCBsb25nIG51bWJlck9mU2FtcGxlcywgc2hvcnQgc2FtcGxlRmxhZ3MpIil9LAotCXsiR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzKSAtPiAobG9uZyBkYXRhT2Zmc2V0LCBsb25nIHNpemUsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGUsIGxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleCwgbG9uZyBudW1iZXJPZlNhbXBsZXMsIHNob3J0IHNhbXBsZUZsYWdzKSIpfSwKLQl7IlNldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplLCAxLAotCSBQeURvY19TVFIoIihsb25nIG1heENodW5rU2l6ZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIG1heENodW5rU2l6ZSkiKX0sCi0JeyJTZXRNZWRpYVNoYWRvd1N5bmMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFTaGFkb3dTeW5jLCAxLAotCSBQeURvY19TVFIoIihsb25nIGZyYW1lRGlmZlNhbXBsZU51bSwgbG9uZyBzeW5jU2FtcGxlTnVtKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFTaGFkb3dTeW5jIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2hhZG93U3luYywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmcmFtZURpZmZTYW1wbGVOdW0pIC0+IChsb25nIHN5bmNTYW1wbGVOdW0pIil9LAotCXsiR2V0TWVkaWFEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFTaXplLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChsb25nIF9ydikiKX0sCi0JeyJHZXRNZWRpYURhdGFTaXplNjQiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhU2l6ZTY0LCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+ICh3aWRlIGRhdGFTaXplKSIpfSwKLQl7IkNvcHlNZWRpYVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0NvcHlNZWRpYVVzZXJEYXRhLCAxLAotCSBQeURvY19TVFIoIihNZWRpYSBkc3RNZWRpYSwgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoVGltZVZhbHVlIGludGVyZXN0aW5nVGltZSwgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb24pIil9LAotCXsiR2V0TWVkaWFEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGRhdGFSZWZBdHRyaWJ1dGVzKSIpfSwKLQl7IlNldE1lZGlhRGF0YVJlZiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAotCXsiU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgbG9uZyBkYXRhUmVmQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IkFkZE1lZGlhRGF0YVJlZiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9BZGRNZWRpYURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChzaG9ydCBpbmRleCkiKX0sCi0JeyJHZXRNZWRpYURhdGFSZWZDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFSZWZDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgY291bnQpIil9LAotCXsiU2V0TWVkaWFQbGF5SGludHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFQbGF5SGludHMsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFQbGF5SGludHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFQbGF5SGludHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgZmxhZ3MpIil9LAotCXsiR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFncywgVGltZVZhbHVlIHRpbWUsIEZpeGVkIHJhdGUpIC0+IChUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkxvYWRNZWRpYUludG9SYW0iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfTG9hZE1lZGlhSW50b1JhbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbiwgbG9uZyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhVHJhY2siLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFUcmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVHJhY2sgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhQ3JlYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhQ3JlYXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYVRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVNjYWxlIF9ydikiKX0sCisgICAgeyJTZXRNZWRpYVRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYVRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHRpbWVTY2FsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhRHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEdXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYUxhbmd1YWdlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhTGFuZ3VhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJTZXRNZWRpYUxhbmd1YWdlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhTGFuZ3VhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGxhbmd1YWdlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhUXVhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldE1lZGlhUXVhbGl0eSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYVF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHF1YWxpdHkpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGNyZWF0b3JOYW1lKSAtPiAoT1NUeXBlIG1lZGlhVHlwZSwgT1NUeXBlIGNyZWF0b3JNYW51ZmFjdHVyZXIpIil9LAorICAgIHsiR2V0TWVkaWFVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVVzZXJEYXRhLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVc2VyRGF0YSBfcnYpIil9LAorICAgIHsiR2V0TWVkaWFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVkaWFIYW5kbGVyIF9ydikiKX0sCisgICAgeyJTZXRNZWRpYUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXJDb21wb25lbnQgbUgpIC0+IE5vbmUiKX0sCisgICAgeyJCZWdpbk1lZGlhRWRpdHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQmVnaW5NZWRpYUVkaXRzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJFbmRNZWRpYUVkaXRzIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0VuZE1lZGlhRWRpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YUhhbmRsZXJEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIFN0cjI1NSBjcmVhdG9yTmFtZSkgLT4gKE9TVHlwZSBkaFR5cGUsIE9TVHlwZSBjcmVhdG9yTWFudWZhY3R1cmVyKSIpfSwKKyAgICB7IkdldE1lZGlhRGF0YUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChEYXRhSGFuZGxlciBfcnYpIil9LAorICAgIHsiU2V0TWVkaWFEYXRhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYURhdGFIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgRGF0YUhhbmRsZXJDb21wb25lbnQgZGF0YUhhbmRsZXIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2NIKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluZGV4LCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhU2FtcGxlQ291bnQiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiR2V0TWVkaWFTeW5jU2FtcGxlQ291bnQiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTeW5jU2FtcGxlQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlNhbXBsZU51bVRvTWVkaWFUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NhbXBsZU51bVRvTWVkaWFUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGxvZ2ljYWxTYW1wbGVOdW0pIC0+IChUaW1lVmFsdWUgc2FtcGxlVGltZSwgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uKSIpfSwKKyAgICB7Ik1lZGlhVGltZVRvU2FtcGxlTnVtIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX01lZGlhVGltZVRvU2FtcGxlTnVtLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSkgLT4gKGxvbmcgc2FtcGxlTnVtLCBUaW1lVmFsdWUgc2FtcGxlVGltZSwgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uKSIpfSwKKyAgICB7IkFkZE1lZGlhU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0FkZE1lZGlhU2FtcGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YUluLCBsb25nIGluT2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25ILCBsb25nIG51bWJlck9mU2FtcGxlcywgc2hvcnQgc2FtcGxlRmxhZ3MpIC0+IChUaW1lVmFsdWUgc2FtcGxlVGltZSkiKX0sCisgICAgeyJBZGRNZWRpYVNhbXBsZVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9BZGRNZWRpYVNhbXBsZVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25ILCBsb25nIG51bWJlck9mU2FtcGxlcywgc2hvcnQgc2FtcGxlRmxhZ3MpIC0+IChUaW1lVmFsdWUgc2FtcGxlVGltZSkiKX0sCisgICAgeyJHZXRNZWRpYVNhbXBsZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFPdXQsIGxvbmcgbWF4U2l6ZVRvR3JvdywgVGltZVZhbHVlIHRpbWUsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCwgbG9uZyBtYXhOdW1iZXJPZlNhbXBsZXMpIC0+IChsb25nIHNpemUsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGUsIGxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleCwgbG9uZyBudW1iZXJPZlNhbXBsZXMsIHNob3J0IHNhbXBsZUZsYWdzKSIpfSwKKyAgICB7IkdldE1lZGlhU2FtcGxlUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25ILCBsb25nIG1heE51bWJlck9mU2FtcGxlcykgLT4gKGxvbmcgZGF0YU9mZnNldCwgbG9uZyBzaXplLCBUaW1lVmFsdWUgc2FtcGxlVGltZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBsb25nIHNhbXBsZURlc2NyaXB0aW9uSW5kZXgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykiKX0sCisgICAgeyJTZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtYXhDaHVua1NpemUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBtYXhDaHVua1NpemUpIil9LAorICAgIHsiU2V0TWVkaWFTaGFkb3dTeW5jIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhU2hhZG93U3luYywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmcmFtZURpZmZTYW1wbGVOdW0sIGxvbmcgc3luY1NhbXBsZU51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhU2hhZG93U3luYyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNoYWRvd1N5bmMsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZnJhbWVEaWZmU2FtcGxlTnVtKSAtPiAobG9uZyBzeW5jU2FtcGxlTnVtKSIpfSwKKyAgICB7IkdldE1lZGlhRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiR2V0TWVkaWFEYXRhU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YVNpemU2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAod2lkZSBkYXRhU2l6ZSkiKX0sCisgICAgeyJDb3B5TWVkaWFVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9Db3B5TWVkaWFVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWEgZHN0TWVkaWEsIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUsIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uKSIpfSwKKyAgICB7IkdldE1lZGlhRGF0YVJlZiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyBkYXRhUmVmQXR0cmlidXRlcykiKX0sCisgICAgeyJTZXRNZWRpYURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIGxvbmcgZGF0YVJlZkF0dHJpYnV0ZXMpIC0+IE5vbmUiKX0sCisgICAgeyJBZGRNZWRpYURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQWRkTWVkaWFEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoc2hvcnQgaW5kZXgpIil9LAorICAgIHsiR2V0TWVkaWFEYXRhUmVmQ291bnQiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhUmVmQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IGNvdW50KSIpfSwKKyAgICB7IlNldE1lZGlhUGxheUhpbnRzIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhUGxheUhpbnRzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhUGxheUhpbnRzIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhUGxheUhpbnRzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIGZsYWdzKSIpfSwKKyAgICB7IkdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHkiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoVGltZVZhbHVlIGludGVyZXN0aW5nVGltZSkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIE1lZGlhT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMzM4NSw2MSArMzM4NSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlNZWRpYSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIE1lZGlhIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIE1lZGlhT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoTWVkaWFPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTWVkaWFPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChNZWRpYU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBNZWRpYU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBNZWRpYV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RdC5NZWRpYSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKE1lZGlhT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgTWVkaWFPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgTWVkaWFPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIE1lZGlhT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBNZWRpYU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlNZWRpYU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlNZWRpYU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlNZWRpYU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JTWVkaWFPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JTWVkaWFPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlNZWRpYU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1F0Lk1lZGlhIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoTWVkaWFPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBNZWRpYU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBNZWRpYU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgTWVkaWFPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIE1lZGlhT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIE1lZGlhT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIE1lZGlhT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIE1lZGlhT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBNZWRpYU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBNZWRpYU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIE1lZGlhT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgTWVkaWEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzQ1MiwxMjcxICszNDUyLDEyNzEgQEAKICNkZWZpbmUgVHJhY2tPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmVHJhY2tfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVHJhY2tfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFRyYWNrT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVHJhY2sgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUcmFjayBvYl9pdHNlbGY7CiB9IFRyYWNrT2JqZWN0OwogCiBQeU9iamVjdCAqVHJhY2tPYmpfTmV3KFRyYWNrIGl0c2VsZikKIHsKLQlUcmFja09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUXRfRXJyb3IsIkNhbm5vdCBjcmVhdGUgVHJhY2sgZnJvbSBOVUxMIHBvaW50ZXIiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhUcmFja09iamVjdCwgJlRyYWNrX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBUcmFja09iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUXRfRXJyb3IsIkNhbm5vdCBjcmVhdGUgVHJhY2sgZnJvbSBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhUcmFja09iamVjdCwgJlRyYWNrX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IFRyYWNrT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRyYWNrICpwX2l0c2VsZikKIHsKLQlpZiAodiA9PSBQeV9Ob25lKQotCXsKLQkJKnBfaXRzZWxmID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghVHJhY2tPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVHJhY2sgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoVHJhY2tPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFUcmFja09ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUcmFjayByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChUcmFja09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFRyYWNrT2JqX2RlYWxsb2MoVHJhY2tPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZU1vdmllVHJhY2soc2VsZi0+b2JfaXRzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9pdHNlbGYpIERpc3Bvc2VNb3ZpZVRyYWNrKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9Mb2FkVHJhY2tJbnRvUmFtKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRpbWVWYWx1ZSB0aW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBMb2FkVHJhY2tJbnRvUmFtCi0JUHlNYWNfUFJFQ0hFQ0soTG9hZFRyYWNrSW50b1JhbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTG9hZFRyYWNrSW50b1JhbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTG9hZFRyYWNrSW50b1JhbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMb2FkVHJhY2tJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tQaWN0KFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaWNIYW5kbGUgX3J2OwotCVRpbWVWYWx1ZSB0aW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaWNIYW5kbGUgX3J2OworICAgIFRpbWVWYWx1ZSB0aW1lOwogI2lmbmRlZiBHZXRUcmFja1BpY3QKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja1BpY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrUGljdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja1BpY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgdGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrUGljdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICB0aW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tDbGlwUmduKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRUcmFja0NsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0NsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQ2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tDbGlwUmduKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tDbGlwUmduKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja0NsaXBSZ24oVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSB0aGVDbGlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKICNpZm5kZWYgU2V0VHJhY2tDbGlwUmduCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tDbGlwUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja0NsaXBSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja0NsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgdGhlQ2xpcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDbGlwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tDbGlwUmduKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24oVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldFRyYWNrRGlzcGxheUJvdW5kc1JnbgotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRGlzcGxheUJvdW5kc1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTW92aWVCb3VuZHNSZ24oVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldFRyYWNrTW92aWVCb3VuZHNSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja01vdmllQm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja01vdmllQm91bmRzUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja01vdmllQm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tNb3ZpZUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tCb3VuZHNSZ24oVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldFRyYWNrQm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tCb3VuZHNSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQm91bmRzUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0JvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrQm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja01hdHRlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRUcmFja01hdHRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNYXR0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNYXR0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tNYXR0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrTWF0dGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrTWF0dGUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSB0aGVNYXR0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHRoZU1hdHRlOwogI2lmbmRlZiBTZXRUcmFja01hdHRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tNYXR0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tNYXR0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlTWF0dGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja01hdHRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICB0aGVNYXR0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVNYXR0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRyYWNrTWF0dGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIHRoZU1hdHRlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tJRChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUcmFja0lECi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tJRChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tJRChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja01vdmllKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tDcmVhdGlvblRpbWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tDcmVhdGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0NyZWF0aW9uVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tDcmVhdGlvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrQ3JlYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0NyZWF0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja01vZGlmaWNhdGlvblRpbWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja01vZGlmaWNhdGlvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrTW9kaWZpY2F0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrRW5hYmxlZChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBHZXRUcmFja0VuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tFbmFibGVkKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGlzRW5hYmxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBpc0VuYWJsZWQ7CiAjaWZuZGVmIFNldFRyYWNrRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNFbmFibGVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VHJhY2tFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIGlzRW5hYmxlZCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNFbmFibGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIGlzRW5hYmxlZCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrVXNhZ2UoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tVc2FnZQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrVXNhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrVXNhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrVXNhZ2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrVXNhZ2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tVc2FnZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyB1c2FnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyB1c2FnZTsKICNpZm5kZWYgU2V0VHJhY2tVc2FnZQotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrVXNhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrVXNhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2FnZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFRyYWNrVXNhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIHVzYWdlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2FnZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRyYWNrVXNhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIHVzYWdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tEdXJhdGlvbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tEdXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrRHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrRHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tPZmZzZXQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CiAjaWZuZGVmIEdldFRyYWNrT2Zmc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tPZmZzZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrT2Zmc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja09mZnNldChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tPZmZzZXQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tPZmZzZXQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBtb3ZpZU9mZnNldFRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBtb3ZpZU9mZnNldFRpbWU7CiAjaWZuZGVmIFNldFRyYWNrT2Zmc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tPZmZzZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrT2Zmc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW92aWVPZmZzZXRUaW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VHJhY2tPZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBtb3ZpZU9mZnNldFRpbWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllT2Zmc2V0VGltZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRyYWNrT2Zmc2V0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgbW92aWVPZmZzZXRUaW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tMYXllcihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFRyYWNrTGF5ZXIKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0xheWVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0xheWVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0xheWVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0xheWVyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrTGF5ZXIoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGxheWVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBsYXllcjsKICNpZm5kZWYgU2V0VHJhY2tMYXllcgotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrTGF5ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrTGF5ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsYXllcikpCi0JCXJldHVybiBOVUxMOwotCVNldFRyYWNrTGF5ZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGxheWVyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXllcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRyYWNrTGF5ZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGxheWVyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tBbHRlcm5hdGUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRyYWNrIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVHJhY2sgX3J2OwogI2lmbmRlZiBHZXRUcmFja0FsdGVybmF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQWx0ZXJuYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0FsdGVybmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tBbHRlcm5hdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrQWx0ZXJuYXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrQWx0ZXJuYXRlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBhbHRlcm5hdGVUOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBhbHRlcm5hdGVUOwogI2lmbmRlZiBTZXRUcmFja0FsdGVybmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrQWx0ZXJuYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja0FsdGVybmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZhbHRlcm5hdGVUKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VHJhY2tBbHRlcm5hdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBhbHRlcm5hdGVUKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmYWx0ZXJuYXRlVCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRyYWNrQWx0ZXJuYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlVCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrVm9sdW1lKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0VHJhY2tWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja1ZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja1ZvbHVtZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja1ZvbHVtZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgdm9sdW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIFNldFRyYWNrVm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VHJhY2tWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICB2b2x1bWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRyYWNrVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tEaW1lbnNpb25zKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCB3aWR0aDsKLQlGaXhlZCBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIHdpZHRoOworICAgIEZpeGVkIGhlaWdodDsKICNpZm5kZWYgR2V0VHJhY2tEaW1lbnNpb25zCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEaW1lbnNpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0RpbWVuc2lvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFRyYWNrRGltZW5zaW9ucyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBoZWlnaHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRUcmFja0RpbWVuc2lvbnMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja0RpbWVuc2lvbnMoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIHdpZHRoOwotCUZpeGVkIGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgd2lkdGg7CisgICAgRml4ZWQgaGVpZ2h0OwogI2lmbmRlZiBTZXRUcmFja0RpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja0RpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrRGltZW5zaW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja0RpbWVuc2lvbnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRyYWNrRGltZW5zaW9ucyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tVc2VyRGF0YShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVXNlckRhdGEgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVc2VyRGF0YSBfcnY7CiAjaWZuZGVmIEdldFRyYWNrVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja1VzZXJEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja1VzZXJEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja1VzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja1VzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgc2V0dGluZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIHNldHRpbmdzOwogI2lmbmRlZiBHZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgc2V0dGluZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5ncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBzZXR0aW5nczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgc2V0dGluZ3M7CiAjaWZuZGVmIFNldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzZXR0aW5ncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2V0dGluZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfTmV3VHJhY2tNZWRpYShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVkaWEgX3J2OwotCU9TVHlwZSBtZWRpYVR5cGU7Ci0JVGltZVNjYWxlIHRpbWVTY2FsZTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lZGlhIF9ydjsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOworICAgIFRpbWVTY2FsZSB0aW1lU2NhbGU7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBOZXdUcmFja01lZGlhCi0JUHlNYWNfUFJFQ0hFQ0soTmV3VHJhY2tNZWRpYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3VHJhY2tNZWRpYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmbWVkaWFUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZVNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3VHJhY2tNZWRpYShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgdGltZVNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZVNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3VHJhY2tNZWRpYShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZVNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja01lZGlhKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZWRpYSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lZGlhIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tNZWRpYQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTWVkaWEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTWVkaWEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrTWVkaWEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZWRpYU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrTWVkaWEoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfSW5zZXJ0TWVkaWFJbnRvVHJhY2soVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRyYWNrU3RhcnQ7Ci0JVGltZVZhbHVlIG1lZGlhVGltZTsKLQlUaW1lVmFsdWUgbWVkaWFEdXJhdGlvbjsKLQlGaXhlZCBtZWRpYVJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRyYWNrU3RhcnQ7CisgICAgVGltZVZhbHVlIG1lZGlhVGltZTsKKyAgICBUaW1lVmFsdWUgbWVkaWFEdXJhdGlvbjsKKyAgICBGaXhlZCBtZWRpYVJhdGU7CiAjaWZuZGVmIEluc2VydE1lZGlhSW50b1RyYWNrCi0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVkaWFJbnRvVHJhY2spOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydE1lZGlhSW50b1RyYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZWRpYUR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJm1lZGlhUmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnNlcnRNZWRpYUludG9UcmFjayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1N0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhUmF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmbWVkaWFSYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluc2VydE1lZGlhSW50b1RyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFSYXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9JbnNlcnRUcmFja1NlZ21lbnQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVHJhY2sgZHN0VHJhY2s7Ci0JVGltZVZhbHVlIHNyY0luOwotCVRpbWVWYWx1ZSBzcmNEdXJhdGlvbjsKLQlUaW1lVmFsdWUgZHN0SW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgZHN0VHJhY2s7CisgICAgVGltZVZhbHVlIHNyY0luOworICAgIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbjsKKyAgICBUaW1lVmFsdWUgZHN0SW47CiAjaWZuZGVmIEluc2VydFRyYWNrU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKEluc2VydFRyYWNrU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0VHJhY2tTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJmRzdFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjSW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNEdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdEluKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydFRyYWNrU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0R1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW4pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJmRzdFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdEluKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluc2VydFRyYWNrU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW4pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0luc2VydEVtcHR5VHJhY2tTZWdtZW50KFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRpbWVWYWx1ZSBkc3RJbjsKLQlUaW1lVmFsdWUgZHN0RHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIGRzdEluOworICAgIFRpbWVWYWx1ZSBkc3REdXJhdGlvbjsKICNpZm5kZWYgSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRFbXB0eVRyYWNrU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3REdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnNlcnRFbXB0eVRyYWNrU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RHVyYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0RHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdER1cmF0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9EZWxldGVUcmFja1NlZ21lbnQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIERlbGV0ZVRyYWNrU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZVRyYWNrU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlVHJhY2tTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlbGV0ZVRyYWNrU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERlbGV0ZVRyYWNrU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NjYWxlVHJhY2tTZWdtZW50KFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIG9sZER1cmF0aW9uOwotCVRpbWVWYWx1ZSBuZXdEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBvbGREdXJhdGlvbjsKKyAgICBUaW1lVmFsdWUgbmV3RHVyYXRpb247CiAjaWZuZGVmIFNjYWxlVHJhY2tTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soU2NhbGVUcmFja1NlZ21lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNjYWxlVHJhY2tTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZvbGREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld0R1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNjYWxlVHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0R1cmF0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdEdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTY2FsZVRyYWNrU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEdXJhdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfSXNTY3JhcE1vdmllKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnQgX3J2OwogI2lmbmRlZiBJc1NjcmFwTW92aWUKLQlQeU1hY19QUkVDSEVDSyhJc1NjcmFwTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzU2NyYXBNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNTY3JhcE1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNTY3JhcE1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9Db3B5VHJhY2tTZXR0aW5ncyhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUcmFjayBkc3RUcmFjazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUcmFjayBkc3RUcmFjazsKICNpZm5kZWYgQ29weVRyYWNrU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhDb3B5VHJhY2tTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weVRyYWNrU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weVRyYWNrU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VHJhY2spOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJmRzdFRyYWNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlUcmFja1NldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFRyYWNrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9BZGRFbXB0eVRyYWNrVG9Nb3ZpZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSBkc3RNb3ZpZTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JVHJhY2sgZHN0VHJhY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTW92aWUgZHN0TW92aWU7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFRyYWNrIGRzdFRyYWNrOwogI2lmbmRlZiBBZGRFbXB0eVRyYWNrVG9Nb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEFkZEVtcHR5VHJhY2tUb01vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRFbXB0eVRyYWNrVG9Nb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkRW1wdHlUcmFja1RvTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0VHJhY2spOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIGRzdFRyYWNrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkRW1wdHlUcmFja1RvTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0VHJhY2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIGRzdFRyYWNrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9BZGRDbG9uZWRUcmFja1RvTW92aWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgZHN0TW92aWU7Ci0JbG9uZyBmbGFnczsKLQlUcmFjayBkc3RUcmFjazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBkc3RNb3ZpZTsKKyAgICBsb25nIGZsYWdzOworICAgIFRyYWNrIGRzdFRyYWNrOwogI2lmbmRlZiBBZGRDbG9uZWRUcmFja1RvTW92aWUKLQlQeU1hY19QUkVDSEVDSyhBZGRDbG9uZWRUcmFja1RvTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZENsb25lZFRyYWNrVG9Nb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRDbG9uZWRUcmFja1RvTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0VHJhY2spOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIGRzdFRyYWNrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRDbG9uZWRUcmFja1RvTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0VHJhY2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIGRzdFRyYWNrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9BZGRUcmFja1JlZmVyZW5jZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUcmFjayByZWZUcmFjazsKLQlPU1R5cGUgcmVmVHlwZTsKLQlsb25nIGFkZGVkSW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgcmVmVHJhY2s7CisgICAgT1NUeXBlIHJlZlR5cGU7CisgICAgbG9uZyBhZGRlZEluZGV4OwogI2lmbmRlZiBBZGRUcmFja1JlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEFkZFRyYWNrUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRUcmFja1JlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnJlZlRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZFRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYWRkZWRJbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgYWRkZWRJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZyZWZUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRUcmFja1JlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZGVkSW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkSW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0RlbGV0ZVRyYWNrUmVmZXJlbmNlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSByZWZUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHJlZlR5cGU7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgRGVsZXRlVHJhY2tSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhEZWxldGVUcmFja1JlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlVHJhY2tSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlbGV0ZVRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGVsZXRlVHJhY2tSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrUmVmZXJlbmNlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRyYWNrIHJlZlRyYWNrOwotCU9TVHlwZSByZWZUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgcmVmVHJhY2s7CisgICAgT1NUeXBlIHJlZlR5cGU7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgU2V0VHJhY2tSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja1JlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmcmVmVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUcmFja1JlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICByZWZUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnJlZlRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0VHJhY2tSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja1JlZmVyZW5jZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OwotCU9TVHlwZSByZWZUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKKyAgICBPU1R5cGUgcmVmVHlwZTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBHZXRUcmFja1JlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja1JlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja1JlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0TmV4dFRyYWNrUmVmZXJlbmNlVHlwZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NUeXBlIF9ydjsKLQlPU1R5cGUgcmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NUeXBlIF9ydjsKKyAgICBPU1R5cGUgcmVmVHlwZTsKICNpZm5kZWYgR2V0TmV4dFRyYWNrUmVmZXJlbmNlVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldE5leHRUcmFja1JlZmVyZW5jZVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHRUcmFja1JlZmVyZW5jZVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV4dFRyYWNrUmVmZXJlbmNlVHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlQ291bnQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCU9TVHlwZSByZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBPU1R5cGUgcmVmVHlwZTsKICNpZm5kZWYgR2V0VHJhY2tSZWZlcmVuY2VDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrUmVmZXJlbmNlQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrUmVmZXJlbmNlQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tSZWZlcmVuY2VDb3VudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tSZWZlcmVuY2VDb3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tFZGl0UmF0ZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OwotCVRpbWVWYWx1ZSBhdFRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBUaW1lVmFsdWUgYXRUaW1lOwogI2lmbmRlZiBHZXRUcmFja0VkaXRSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tFZGl0UmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tFZGl0UmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0VGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrRWRpdFJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGF0VGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tFZGl0UmF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tEYXRhU2l6ZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBHZXRUcmFja0RhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEYXRhU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0RhdGFTaXplNjQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247Ci0Jd2lkZSBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICB3aWRlIGRhdGFTaXplOwogI2lmbmRlZiBHZXRUcmFja0RhdGFTaXplNjQKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0RhdGFTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRGF0YVNpemU2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUcmFja0RhdGFTaXplNjQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VHJhY2tEYXRhU2l6ZTY0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1B0SW5UcmFjayhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgcHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHB0OwogI2lmbmRlZiBQdEluVHJhY2sKLQlQeU1hY19QUkVDSEVDSyhQdEluVHJhY2spOworICAgIFB5TWFjX1BSRUNIRUNLKFB0SW5UcmFjayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQdEluVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgcHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFB0SW5UcmFjayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBwdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfQ29weVRyYWNrVXNlckRhdGEoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVHJhY2sgZHN0VHJhY2s7Ci0JT1NUeXBlIGNvcHlSdWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRyYWNrIGRzdFRyYWNrOworICAgIE9TVHlwZSBjb3B5UnVsZTsKICNpZm5kZWYgQ29weVRyYWNrVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhDb3B5VHJhY2tVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weVRyYWNrVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZkc3RUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29weVJ1bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weVRyYWNrVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlSdWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJmRzdFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5VHJhY2tVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JRml4ZWQgcmF0ZTsKLQlUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lOwotCVRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFnczsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBGaXhlZCByYXRlOworICAgIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb247CiAjaWZuZGVmIEdldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRUcmFja05leHRJbnRlcmVzdGluZ1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ0R1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ0R1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdEdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tTZWdtZW50RGlzcGxheUJvdW5kc1JnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKLQlUaW1lVmFsdWUgdGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBHZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tTZWdtZW50RGlzcGxheUJvdW5kc1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tTZWdtZW50RGlzcGxheUJvdW5kc1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja1N0YXR1cyhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKICNpZm5kZWYgR2V0VHJhY2tTdGF0dXMKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja1N0YXR1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tTdGF0dXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja1N0YXR1cyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja0xvYWRTZXR0aW5ncyhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHByZWxvYWRUaW1lOwotCVRpbWVWYWx1ZSBwcmVsb2FkRHVyYXRpb247Ci0JbG9uZyBwcmVsb2FkRmxhZ3M7Ci0JbG9uZyBkZWZhdWx0SGludHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwcmVsb2FkVGltZTsKKyAgICBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uOworICAgIGxvbmcgcHJlbG9hZEZsYWdzOworICAgIGxvbmcgZGVmYXVsdEhpbnRzOwogI2lmbmRlZiBTZXRUcmFja0xvYWRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrTG9hZFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja0xvYWRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdEhpbnRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VHJhY2tMb2FkU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRIaW50cyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0SGludHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUcmFja0xvYWRTZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhpbnRzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tMb2FkU2V0dGluZ3MoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBwcmVsb2FkVGltZTsKLQlUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uOwotCWxvbmcgcHJlbG9hZEZsYWdzOwotCWxvbmcgZGVmYXVsdEhpbnRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgcHJlbG9hZFRpbWU7CisgICAgVGltZVZhbHVlIHByZWxvYWREdXJhdGlvbjsKKyAgICBsb25nIHByZWxvYWRGbGFnczsKKyAgICBsb25nIGRlZmF1bHRIaW50czsKICNpZm5kZWYgR2V0VHJhY2tMb2FkU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0xvYWRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tMb2FkU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFRyYWNrTG9hZFNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdEhpbnRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SGludHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRUcmFja0xvYWRTZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRIaW50cyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhpbnRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFRyYWNrT2JqX21ldGhvZHNbXSA9IHsKLQl7IkxvYWRUcmFja0ludG9SYW0iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfTG9hZFRyYWNrSW50b1JhbSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbiwgbG9uZyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrUGljdCIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1BpY3QsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lKSAtPiAoUGljSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRUcmFja0NsaXBSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tDbGlwUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IlNldFRyYWNrQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0NsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGlzcGxheUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRUcmFja01vdmllQm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTW92aWVCb3VuZHNSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiR2V0VHJhY2tCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tCb3VuZHNSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiR2V0VHJhY2tNYXR0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja01hdHRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQaXhNYXBIYW5kbGUgX3J2KSIpfSwKLQl7IlNldFRyYWNrTWF0dGUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tNYXR0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHRoZU1hdHRlKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tJRCIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0lELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJHZXRUcmFja01vdmllIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJHZXRUcmFja0NyZWF0aW9uVGltZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0NyZWF0aW9uVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAotCXsiR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTW9kaWZpY2F0aW9uVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAotCXsiR2V0VHJhY2tFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0VHJhY2tFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpc0VuYWJsZWQpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja1VzYWdlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrVXNhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IlNldFRyYWNrVXNhZ2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tVc2FnZSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyB1c2FnZSkgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrRHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEdXJhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydikiKX0sCi0JeyJHZXRUcmFja09mZnNldCIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja09mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydikiKX0sCi0JeyJTZXRUcmFja09mZnNldCIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja09mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIG1vdmllT2Zmc2V0VGltZSkgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrTGF5ZXIiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tMYXllciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldFRyYWNrTGF5ZXIiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tMYXllciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbGF5ZXIpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0FsdGVybmF0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0FsdGVybmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVHJhY2sgX3J2KSIpfSwKLQl7IlNldFRyYWNrQWx0ZXJuYXRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrQWx0ZXJuYXRlLCAxLAotCSBQeURvY19TVFIoIihUcmFjayBhbHRlcm5hdGVUKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tWb2x1bWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJTZXRUcmFja1ZvbHVtZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja1ZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdm9sdW1lKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGltZW5zaW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgd2lkdGgsIEZpeGVkIGhlaWdodCkiKX0sCi0JeyJTZXRUcmFja0RpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tEaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1VzZXJEYXRhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVc2VyRGF0YSBfcnYpIil9LAotCXsiR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIHNldHRpbmdzKSIpfSwKLQl7IlNldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBzZXR0aW5ncykgLT4gTm9uZSIpfSwKLQl7Ik5ld1RyYWNrTWVkaWEiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfTmV3VHJhY2tNZWRpYSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIG1lZGlhVHlwZSwgVGltZVNjYWxlIHRpbWVTY2FsZSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKE1lZGlhIF9ydikiKX0sCi0JeyJHZXRUcmFja01lZGlhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTWVkaWEsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lZGlhIF9ydikiKX0sCi0JeyJJbnNlcnRNZWRpYUludG9UcmFjayIsIChQeUNGdW5jdGlvbilUcmFja09ial9JbnNlcnRNZWRpYUludG9UcmFjaywgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRyYWNrU3RhcnQsIFRpbWVWYWx1ZSBtZWRpYVRpbWUsIFRpbWVWYWx1ZSBtZWRpYUR1cmF0aW9uLCBGaXhlZCBtZWRpYVJhdGUpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnRUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfSW5zZXJ0VHJhY2tTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihUcmFjayBkc3RUcmFjaywgVGltZVZhbHVlIHNyY0luLCBUaW1lVmFsdWUgc3JjRHVyYXRpb24sIFRpbWVWYWx1ZSBkc3RJbikgLT4gTm9uZSIpfSwKLQl7Ikluc2VydEVtcHR5VHJhY2tTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0luc2VydEVtcHR5VHJhY2tTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgZHN0SW4sIFRpbWVWYWx1ZSBkc3REdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IkRlbGV0ZVRyYWNrU2VnbWVudCIsIChQeUNGdW5jdGlvbilUcmFja09ial9EZWxldGVUcmFja1NlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IlNjYWxlVHJhY2tTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NjYWxlVHJhY2tTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgb2xkRHVyYXRpb24sIFRpbWVWYWx1ZSBuZXdEdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IklzU2NyYXBNb3ZpZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9Jc1NjcmFwTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudCBfcnYpIil9LAotCXsiQ29weVRyYWNrU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfQ29weVRyYWNrU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIGRzdFRyYWNrKSAtPiBOb25lIil9LAotCXsiQWRkRW1wdHlUcmFja1RvTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfQWRkRW1wdHlUcmFja1RvTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoVHJhY2sgZHN0VHJhY2spIil9LAotCXsiQWRkQ2xvbmVkVHJhY2tUb01vdmllIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0FkZENsb25lZFRyYWNrVG9Nb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIGxvbmcgZmxhZ3MpIC0+IChUcmFjayBkc3RUcmFjaykiKX0sCi0JeyJBZGRUcmFja1JlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9BZGRUcmFja1JlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgcmVmVHJhY2ssIE9TVHlwZSByZWZUeXBlKSAtPiAobG9uZyBhZGRlZEluZGV4KSIpfSwKLQl7IkRlbGV0ZVRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0RlbGV0ZVRyYWNrUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IlNldFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihUcmFjayByZWZUcmFjaywgT1NUeXBlIHJlZlR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja1JlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1JlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHJlZlR5cGUsIGxvbmcgaW5kZXgpIC0+IChUcmFjayBfcnYpIil9LAotCXsiR2V0TmV4dFRyYWNrUmVmZXJlbmNlVHlwZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSkgLT4gKE9TVHlwZSBfcnYpIil9LAotCXsiR2V0VHJhY2tSZWZlcmVuY2VDb3VudCIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1JlZmVyZW5jZUNvdW50LCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldFRyYWNrRWRpdFJhdGUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tFZGl0UmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIGF0VGltZSkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJHZXRUcmFja0RhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGF0YVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldFRyYWNrRGF0YVNpemU2NCIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0RhdGFTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKHdpZGUgZGF0YVNpemUpIil9LAotCXsiUHRJblRyYWNrIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1B0SW5UcmFjaywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDb3B5VHJhY2tVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilUcmFja09ial9Db3B5VHJhY2tVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgZHN0VHJhY2ssIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja05leHRJbnRlcmVzdGluZ1RpbWUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUsIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uKSIpfSwKLQl7IkdldFRyYWNrU2VnbWVudERpc3BsYXlCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tTZWdtZW50RGlzcGxheUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiR2V0VHJhY2tTdGF0dXMiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tTdGF0dXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU2V0VHJhY2tMb2FkU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tMb2FkU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBwcmVsb2FkVGltZSwgVGltZVZhbHVlIHByZWxvYWREdXJhdGlvbiwgbG9uZyBwcmVsb2FkRmxhZ3MsIGxvbmcgZGVmYXVsdEhpbnRzKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tMb2FkU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tMb2FkU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBwcmVsb2FkVGltZSwgVGltZVZhbHVlIHByZWxvYWREdXJhdGlvbiwgbG9uZyBwcmVsb2FkRmxhZ3MsIGxvbmcgZGVmYXVsdEhpbnRzKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkxvYWRUcmFja0ludG9SYW0iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfTG9hZFRyYWNrSW50b1JhbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbiwgbG9uZyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrUGljdCIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1BpY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lKSAtPiAoUGljSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja0NsaXBSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldFRyYWNrQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0NsaXBSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGlzcGxheUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja01vdmllQm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTW92aWVCb3VuZHNSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tCb3VuZHNSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tNYXR0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja01hdHRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQaXhNYXBIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldFRyYWNrTWF0dGUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tNYXR0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHRoZU1hdHRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tJRCIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0lELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRUcmFja01vdmllIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJHZXRUcmFja0NyZWF0aW9uVGltZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0NyZWF0aW9uVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTW9kaWZpY2F0aW9uVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBpc0VuYWJsZWQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja1VzYWdlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrVXNhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlNldFRyYWNrVXNhZ2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tVc2FnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyB1c2FnZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrRHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEdXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja09mZnNldCIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja09mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydikiKX0sCisgICAgeyJTZXRUcmFja09mZnNldCIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja09mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIG1vdmllT2Zmc2V0VGltZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrTGF5ZXIiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tMYXllciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldFRyYWNrTGF5ZXIiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tMYXllciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbGF5ZXIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0FsdGVybmF0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0FsdGVybmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVHJhY2sgX3J2KSIpfSwKKyAgICB7IlNldFRyYWNrQWx0ZXJuYXRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrQWx0ZXJuYXRlLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayBhbHRlcm5hdGVUKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tWb2x1bWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJTZXRUcmFja1ZvbHVtZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja1ZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdm9sdW1lKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgd2lkdGgsIEZpeGVkIGhlaWdodCkiKX0sCisgICAgeyJTZXRUcmFja0RpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tEaW1lbnNpb25zLCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1VzZXJEYXRhLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVc2VyRGF0YSBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIHNldHRpbmdzKSIpfSwKKyAgICB7IlNldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBzZXR0aW5ncykgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld1RyYWNrTWVkaWEiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfTmV3VHJhY2tNZWRpYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIG1lZGlhVHlwZSwgVGltZVNjYWxlIHRpbWVTY2FsZSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKE1lZGlhIF9ydikiKX0sCisgICAgeyJHZXRUcmFja01lZGlhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTWVkaWEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lZGlhIF9ydikiKX0sCisgICAgeyJJbnNlcnRNZWRpYUludG9UcmFjayIsIChQeUNGdW5jdGlvbilUcmFja09ial9JbnNlcnRNZWRpYUludG9UcmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRyYWNrU3RhcnQsIFRpbWVWYWx1ZSBtZWRpYVRpbWUsIFRpbWVWYWx1ZSBtZWRpYUR1cmF0aW9uLCBGaXhlZCBtZWRpYVJhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnRUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfSW5zZXJ0VHJhY2tTZWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayBkc3RUcmFjaywgVGltZVZhbHVlIHNyY0luLCBUaW1lVmFsdWUgc3JjRHVyYXRpb24sIFRpbWVWYWx1ZSBkc3RJbikgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydEVtcHR5VHJhY2tTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0luc2VydEVtcHR5VHJhY2tTZWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgZHN0SW4sIFRpbWVWYWx1ZSBkc3REdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkRlbGV0ZVRyYWNrU2VnbWVudCIsIChQeUNGdW5jdGlvbilUcmFja09ial9EZWxldGVUcmFja1NlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNjYWxlVHJhY2tTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NjYWxlVHJhY2tTZWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgb2xkRHVyYXRpb24sIFRpbWVWYWx1ZSBuZXdEdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IklzU2NyYXBNb3ZpZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9Jc1NjcmFwTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudCBfcnYpIil9LAorICAgIHsiQ29weVRyYWNrU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfQ29weVRyYWNrU2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIGRzdFRyYWNrKSAtPiBOb25lIil9LAorICAgIHsiQWRkRW1wdHlUcmFja1RvTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfQWRkRW1wdHlUcmFja1RvTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoVHJhY2sgZHN0VHJhY2spIil9LAorICAgIHsiQWRkQ2xvbmVkVHJhY2tUb01vdmllIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0FkZENsb25lZFRyYWNrVG9Nb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIGxvbmcgZmxhZ3MpIC0+IChUcmFjayBkc3RUcmFjaykiKX0sCisgICAgeyJBZGRUcmFja1JlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9BZGRUcmFja1JlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgcmVmVHJhY2ssIE9TVHlwZSByZWZUeXBlKSAtPiAobG9uZyBhZGRlZEluZGV4KSIpfSwKKyAgICB7IkRlbGV0ZVRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0RlbGV0ZVRyYWNrUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayByZWZUcmFjaywgT1NUeXBlIHJlZlR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja1JlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1JlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHJlZlR5cGUsIGxvbmcgaW5kZXgpIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiR2V0TmV4dFRyYWNrUmVmZXJlbmNlVHlwZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSkgLT4gKE9TVHlwZSBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tSZWZlcmVuY2VDb3VudCIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1JlZmVyZW5jZUNvdW50LCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrRWRpdFJhdGUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tFZGl0UmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIGF0VGltZSkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJHZXRUcmFja0RhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrRGF0YVNpemU2NCIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0RhdGFTaXplNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKHdpZGUgZGF0YVNpemUpIil9LAorICAgIHsiUHRJblRyYWNrIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1B0SW5UcmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDb3B5VHJhY2tVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilUcmFja09ial9Db3B5VHJhY2tVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgZHN0VHJhY2ssIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja05leHRJbnRlcmVzdGluZ1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUsIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uKSIpfSwKKyAgICB7IkdldFRyYWNrU2VnbWVudERpc3BsYXlCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tTZWdtZW50RGlzcGxheUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tTdGF0dXMiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tTdGF0dXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tMb2FkU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tMb2FkU2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBwcmVsb2FkVGltZSwgVGltZVZhbHVlIHByZWxvYWREdXJhdGlvbiwgbG9uZyBwcmVsb2FkRmxhZ3MsIGxvbmcgZGVmYXVsdEhpbnRzKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tMb2FkU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tMb2FkU2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBwcmVsb2FkVGltZSwgVGltZVZhbHVlIHByZWxvYWREdXJhdGlvbiwgbG9uZyBwcmVsb2FkRmxhZ3MsIGxvbmcgZGVmYXVsdEhpbnRzKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgVHJhY2tPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC00NzMzLDYxICs0NzMzLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVRyYWNrIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVHJhY2sgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVHJhY2tPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChUcmFja09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUcmFja09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFRyYWNrT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFRyYWNrT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFRyYWNrX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0LlRyYWNrIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoVHJhY2tPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBUcmFja09ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBUcmFja09ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgVHJhY2tPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFRyYWNrT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVRyYWNrT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVRyYWNrT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVRyYWNrT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlUcmFja09ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlUcmFja09ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVRyYWNrT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuVHJhY2siLCAvKnRwX25hbWUqLworICAgIHNpemVvZihUcmFja09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFRyYWNrT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFRyYWNrT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBUcmFja09ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgVHJhY2tPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgVHJhY2tPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgVHJhY2tPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgVHJhY2tPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFRyYWNrT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFRyYWNrT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgVHJhY2tPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBUcmFjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00ODAwLDI0NzYgKzQ4MDAsMjQ3NiBAQAogI2RlZmluZSBNb3ZpZU9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZNb3ZpZV9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZNb3ZpZV9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgTW92aWVPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlNb3ZpZSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIE1vdmllIG9iX2l0c2VsZjsKIH0gTW92aWVPYmplY3Q7CiAKIFB5T2JqZWN0ICpNb3ZpZU9ial9OZXcoTW92aWUgaXRzZWxmKQogewotCU1vdmllT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNb3ZpZSBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKE1vdmllT2JqZWN0LCAmTW92aWVfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIE1vdmllT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNb3ZpZSBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKE1vdmllT2JqZWN0LCAmTW92aWVfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgTW92aWVPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTW92aWUgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFNb3ZpZU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNb3ZpZSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChNb3ZpZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIU1vdmllT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1vdmllIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKE1vdmllT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgTW92aWVPYmpfZGVhbGxvYyhNb3ZpZU9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlTW92aWUoc2VsZi0+b2JfaXRzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9pdHNlbGYpIERpc3Bvc2VNb3ZpZShzZWxmLT5vYl9pdHNlbGYpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfTW92aWVzVGFzayhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBtYXhNaWxsaVNlY1RvVXNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIG1heE1pbGxpU2VjVG9Vc2U7CiAjaWZuZGVmIE1vdmllc1Rhc2sKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZXNUYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZXNUYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4TWlsbGlTZWNUb1VzZSkpCi0JCXJldHVybiBOVUxMOwotCU1vdmllc1Rhc2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIG1heE1pbGxpU2VjVG9Vc2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE1pbGxpU2VjVG9Vc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZpZXNUYXNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBtYXhNaWxsaVNlY1RvVXNlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfUHJlcm9sbE1vdmllKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRpbWVWYWx1ZSB0aW1lOwotCUZpeGVkIFJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgRml4ZWQgUmF0ZTsKICNpZm5kZWYgUHJlcm9sbE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soUHJlcm9sbE1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQcmVyb2xsTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmUmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQcmVyb2xsTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICBSYXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZSYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFByZXJvbGxNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0Fib3J0UHJlUHJlcm9sbE1vdmllKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBlcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIGVycjsKICNpZm5kZWYgQWJvcnRQcmVQcmVyb2xsTW92aWUKLQlQeU1hY19QUkVDSEVDSyhBYm9ydFByZVByZXJvbGxNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWJvcnRQcmVQcmVyb2xsTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlcnIpKQotCQlyZXR1cm4gTlVMTDsKLQlBYm9ydFByZVByZXJvbGxNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQWJvcnRQcmVQcmVyb2xsTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9Mb2FkTW92aWVJbnRvUmFtKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRpbWVWYWx1ZSB0aW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBMb2FkTW92aWVJbnRvUmFtCi0JUHlNYWNfUFJFQ0hFQ0soTG9hZE1vdmllSW50b1JhbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTG9hZE1vdmllSW50b1JhbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTG9hZE1vdmllSW50b1JhbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMb2FkTW92aWVJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVBY3RpdmUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gYWN0aXZlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGFjdGl2ZTsKICNpZm5kZWYgU2V0TW92aWVBY3RpdmUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUFjdGl2ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVBY3RpdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZUFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIGFjdGl2ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVBY3RpdmUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBhY3RpdmUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUFjdGl2ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBHZXRNb3ZpZUFjdGl2ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQWN0aXZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUFjdGl2ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVBY3RpdmUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllQWN0aXZlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1N0YXJ0TW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU3RhcnRNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKFN0YXJ0TW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFN0YXJ0TW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVN0YXJ0TW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTdGFydE1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TdG9wTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU3RvcE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soU3RvcE1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTdG9wTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVN0b3BNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFN0b3BNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR29Ub0JlZ2lubmluZ09mTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgR29Ub0JlZ2lubmluZ09mTW92aWUKLQlQeU1hY19QUkVDSEVDSyhHb1RvQmVnaW5uaW5nT2ZNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR29Ub0JlZ2lubmluZ09mTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdvVG9CZWdpbm5pbmdPZk1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR29Ub0JlZ2lubmluZ09mTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dvVG9FbmRPZk1vdmllKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEdvVG9FbmRPZk1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soR29Ub0VuZE9mTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdvVG9FbmRPZk1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHb1RvRW5kT2ZNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdvVG9FbmRPZk1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9Jc01vdmllRG9uZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc01vdmllRG9uZQotCVB5TWFjX1BSRUNIRUNLKElzTW92aWVEb25lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc01vdmllRG9uZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNb3ZpZURvbmUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTW92aWVEb25lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUHJldmlld01vZGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgR2V0TW92aWVQcmV2aWV3TW9kZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJldmlld01vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJldmlld01vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllUHJldmlld01vZGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllUHJldmlld01vZGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVQcmV2aWV3TW9kZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiB1c2VQcmV2aWV3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIHVzZVByZXZpZXc7CiAjaWZuZGVmIFNldE1vdmllUHJldmlld01vZGUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVByZXZpZXdNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVByZXZpZXdNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXNlUHJldmlldykpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllUHJldmlld01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHVzZVByZXZpZXcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZVByZXZpZXcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVByZXZpZXdNb2RlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VQcmV2aWV3KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2hvd01vdmllUG9zdGVyKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNob3dNb3ZpZVBvc3RlcgotCVB5TWFjX1BSRUNIRUNLKFNob3dNb3ZpZVBvc3Rlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd01vdmllUG9zdGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93TW92aWVQb3N0ZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaG93TW92aWVQb3N0ZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllVGltZUJhc2UoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVCYXNlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZUJhc2UgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZVRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVUaW1lQmFzZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVUaW1lQmFzZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZU1hc3RlclRpbWVCYXNlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lQmFzZSB0YjsKLQlUaW1lUmVjb3JkIHNsYXZlWmVybzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZUJhc2UgdGI7CisgICAgVGltZVJlY29yZCBzbGF2ZVplcm87CiAjaWZuZGVmIFNldE1vdmllTWFzdGVyVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZU1hc3RlclRpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZU1hc3RlclRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmdGIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmc2xhdmVaZXJvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVNYXN0ZXJUaW1lQmFzZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgdGIsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2xhdmVaZXJvKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzbGF2ZVplcm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZU1hc3RlclRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZU1hc3RlckNsb2NrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnQgY2xvY2tNZWlzdGVyOwotCVRpbWVSZWNvcmQgc2xhdmVaZXJvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnQgY2xvY2tNZWlzdGVyOworICAgIFRpbWVSZWNvcmQgc2xhdmVaZXJvOwogI2lmbmRlZiBTZXRNb3ZpZU1hc3RlckNsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVNYXN0ZXJDbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVNYXN0ZXJDbG9jayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjbG9ja01laXN0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmc2xhdmVaZXJvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVNYXN0ZXJDbG9jayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgY2xvY2tNZWlzdGVyLAotCSAgICAgICAgICAgICAgICAgICAgJnNsYXZlWmVybyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNsb2NrTWVpc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzbGF2ZVplcm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZU1hc3RlckNsb2NrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9ja01laXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAmc2xhdmVaZXJvKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQ2hvb3NlTW92aWVDbG9jayhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgQ2hvb3NlTW92aWVDbG9jawotCVB5TWFjX1BSRUNIRUNLKENob29zZU1vdmllQ2xvY2spOworICAgIFB5TWFjX1BSRUNIRUNLKENob29zZU1vdmllQ2xvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCUNob29zZU1vdmllQ2xvY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENob29zZU1vdmllQ2xvY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVHV29ybGQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIHBvcnQ7Ci0JR0RIYW5kbGUgZ2RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR3JhZlB0ciBwb3J0OworICAgIEdESGFuZGxlIGdkaDsKICNpZm5kZWYgR2V0TW92aWVHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldE1vdmllR1dvcmxkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgJnBvcnQsCi0JICAgICAgICAgICAgICAgJmdkaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBwb3J0LAotCSAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGdkaCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1vdmllR1dvcmxkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgJnBvcnQsCisgICAgICAgICAgICAgICAgICAgJmdkaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGdkaCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVHV29ybGQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIHBvcnQ7Ci0JR0RIYW5kbGUgZ2RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR3JhZlB0ciBwb3J0OworICAgIEdESGFuZGxlIGdkaDsKICNpZm5kZWYgU2V0TW92aWVHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVHV29ybGQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBwb3J0LAotCSAgICAgICAgICAgICAgIGdkaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllR1dvcmxkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgcG9ydCwKKyAgICAgICAgICAgICAgICAgICBnZGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZU5hdHVyYWxCb3VuZHNSZWN0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IG5hdHVyYWxCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgbmF0dXJhbEJvdW5kczsKICNpZm5kZWYgR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZuYXR1cmFsQm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm5hdHVyYWxCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZU5hdHVyYWxCb3VuZHNSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmF0dXJhbEJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZuYXR1cmFsQm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZyhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OwotCVRyYWNrIHRoZVRyYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CisgICAgVHJhY2sgdGhlVHJhY2s7CiAjaWZuZGVmIEdldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFRyYWNrRm9yQ29tcG9zaXRpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRoZVRyYWNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV4dFRyYWNrRm9yQ29tcG9zaXRpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUcmFjayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVRyYWNrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OwotCVRyYWNrIHRoZVRyYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CisgICAgVHJhY2sgdGhlVHJhY2s7CiAjaWZuZGVmIEdldFByZXZUcmFja0ZvckNvbXBvc2l0aW5nCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFByZXZUcmFja0ZvckNvbXBvc2l0aW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRoZVRyYWNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUcmFjayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVRyYWNrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVBpY3QoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBfcnY7Ci0JVGltZVZhbHVlIHRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBfcnY7CisgICAgVGltZVZhbHVlIHRpbWU7CiAjaWZuZGVmIEdldE1vdmllUGljdAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllUGljdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQaWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllUGljdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICB0aW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVQaWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclBpY3QoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllUG9zdGVyUGljdAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllUG9zdGVyUGljdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQb3N0ZXJQaWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVBvc3RlclBpY3QoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVBvc3RlclBpY3QoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1VwZGF0ZU1vdmllKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBVcGRhdGVNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZU1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVwZGF0ZU1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfSW52YWxpZGF0ZU1vdmllUmVnaW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJnbkhhbmRsZSBpbnZhbGlkUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJnbkhhbmRsZSBpbnZhbGlkUmduOwogI2lmbmRlZiBJbnZhbGlkYXRlTW92aWVSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTW92aWVSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEludmFsaWRhdGVNb3ZpZVJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW52YWxpZFJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnZhbGlkYXRlTW92aWVSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRSZ24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbnZhbGlkUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEludmFsaWRhdGVNb3ZpZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFJnbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVCb3goTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgYm94UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBib3hSZWN0OwogI2lmbmRlZiBHZXRNb3ZpZUJveAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUJveCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVCb3goX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAmYm94UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3hSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TW92aWVCb3goX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAmYm94UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3hSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZUJveChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3hSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJveFJlY3Q7CiAjaWZuZGVmIFNldE1vdmllQm94Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVCb3gpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllQm94KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZUJveChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICZib3hSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllQm94KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgJmJveFJlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZURpc3BsYXlDbGlwUmduKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZURpc3BsYXlDbGlwUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEaXNwbGF5Q2xpcFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEaXNwbGF5Q2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVEaXNwbGF5Q2xpcFJnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllRGlzcGxheUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllRGlzcGxheUNsaXBSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSB0aGVDbGlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKICNpZm5kZWYgU2V0TW92aWVEaXNwbGF5Q2xpcFJnbgotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllRGlzcGxheUNsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllRGlzcGxheUNsaXBSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZURpc3BsYXlDbGlwUmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICB0aGVDbGlwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZURpc3BsYXlDbGlwUmduKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVDbGlwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVDbGlwUmduKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZUNsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUNsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllQ2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVDbGlwUmduKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVDbGlwUmduKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZUNsaXBSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSB0aGVDbGlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKICNpZm5kZWYgU2V0TW92aWVDbGlwUmduCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVDbGlwUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUNsaXBSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgdGhlQ2xpcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDbGlwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVDbGlwUmduKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZURpc3BsYXlCb3VuZHNSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllRGlzcGxheUJvdW5kc1JnbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGlzcGxheUJvdW5kc1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZURpc3BsYXlCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZURpc3BsYXlCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllQm91bmRzUmduKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZUJvdW5kc1JnbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUJvdW5kc1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVWaWRlb091dHB1dChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50SW5zdGFuY2Ugdm91dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50SW5zdGFuY2Ugdm91dDsKICNpZm5kZWYgU2V0TW92aWVWaWRlb091dHB1dAotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllVmlkZW9PdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllVmlkZW9PdXRwdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2b3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVWaWRlb091dHB1dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgdm91dCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm91dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllVmlkZW9PdXRwdXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvdXQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QdXRNb3ZpZUludG9IYW5kbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIHB1YmxpY01vdmllOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBwdWJsaWNNb3ZpZTsKICNpZm5kZWYgUHV0TW92aWVJbnRvSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVJbnRvSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFB1dE1vdmllSW50b0hhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljTW92aWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwdWJsaWNNb3ZpZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBQdXRNb3ZpZUludG9IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QdXRNb3ZpZUludG9EYXRhRm9yayhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBmUmVmTnVtOwotCWxvbmcgb2Zmc2V0OwotCWxvbmcgbWF4U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBmUmVmTnVtOworICAgIGxvbmcgb2Zmc2V0OworICAgIGxvbmcgbWF4U2l6ZTsKICNpZm5kZWYgUHV0TW92aWVJbnRvRGF0YUZvcmsKLQlQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9EYXRhRm9yayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVJbnRvRGF0YUZvcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFB1dE1vdmllSW50b0RhdGFGb3JrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllSW50b0RhdGFGb3JrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfUHV0TW92aWVJbnRvRGF0YUZvcms2NChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGZSZWZOdW07Ci0Jd2lkZSBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBtYXhTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgZlJlZk51bTsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIG1heFNpemU7CiAjaWZuZGVmIFB1dE1vdmllSW50b0RhdGFGb3JrNjQKLQlQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9EYXRhRm9yazY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9EYXRhRm9yazY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVJbnRvRGF0YUZvcms2NChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllSW50b0RhdGFGb3JrNjQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfUHV0TW92aWVJbnRvU3RvcmFnZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEYXRhSGFuZGxlciBkaDsKLQl3aWRlIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIG1heFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgd2lkZSBvZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBtYXhTaXplOwogI2lmbmRlZiBQdXRNb3ZpZUludG9TdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVJbnRvU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVJbnRvU3RvcmFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQdXRNb3ZpZUludG9TdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBQdXRNb3ZpZUludG9TdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QdXRNb3ZpZUZvckRhdGFSZWZJbnRvSGFuZGxlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlIYW5kbGUgcHVibGljTW92aWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIEhhbmRsZSBwdWJsaWNNb3ZpZTsKICNpZm5kZWYgUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwdWJsaWNNb3ZpZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQdXRNb3ZpZUZvckRhdGFSZWZJbnRvSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNNb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwdWJsaWNNb3ZpZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBQdXRNb3ZpZUZvckRhdGFSZWZJbnRvSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNNb3ZpZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVDcmVhdGlvblRpbWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIF9ydjsKICNpZm5kZWYgR2V0TW92aWVDcmVhdGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUNyZWF0aW9uVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVDcmVhdGlvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllQ3JlYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZUNyZWF0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIF9ydjsKICNpZm5kZWYgR2V0TW92aWVNb2RpZmljYXRpb25UaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVNb2RpZmljYXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllTW9kaWZpY2F0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVNb2RpZmljYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllVGltZVNjYWxlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lU2NhbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lU2NhbGUgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllVGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVUaW1lU2NhbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllVGltZVNjYWxlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lU2NhbGUgdGltZVNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lU2NhbGUgdGltZVNjYWxlOwogI2lmbmRlZiBTZXRNb3ZpZVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllVGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWVTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgdGltZVNjYWxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lU2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVRpbWVTY2FsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHRpbWVTY2FsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllRHVyYXRpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllRHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUR1cmF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUR1cmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUR1cmF0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZUR1cmF0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUmF0ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CiAjaWZuZGVmIEdldE1vdmllUmF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVJhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVJhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllUmF0ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgcmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgcmF0ZTsKICNpZm5kZWYgU2V0TW92aWVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgcmF0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVSYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIHJhdGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFJhdGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZVByZWZlcnJlZFJhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVByZWZlcnJlZFJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJlZmVycmVkUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVQcmVmZXJyZWRSYXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVQcmVmZXJyZWRSYXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVByZWZlcnJlZFJhdGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIHJhdGU7CiAjaWZuZGVmIFNldE1vdmllUHJlZmVycmVkUmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJlZmVycmVkUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQcmVmZXJyZWRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVQcmVmZXJyZWRSYXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllUHJlZmVycmVkUmF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZVByZWZlcnJlZFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJlZmVycmVkVm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllUHJlZmVycmVkVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllUHJlZmVycmVkVm9sdW1lKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB2b2x1bWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHZvbHVtZTsKICNpZm5kZWYgU2V0TW92aWVQcmVmZXJyZWRWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQcmVmZXJyZWRWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVQcmVmZXJyZWRWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVZvbHVtZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldE1vdmllVm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVZvbHVtZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVWb2x1bWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdm9sdW1lOwogI2lmbmRlZiBTZXRNb3ZpZVZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllVm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVZvbHVtZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUHJldmlld1RpbWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBwcmV2aWV3VGltZTsKLQlUaW1lVmFsdWUgcHJldmlld0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgcHJldmlld1RpbWU7CisgICAgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbjsKICNpZm5kZWYgR2V0TW92aWVQcmV2aWV3VGltZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJldmlld1RpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJldmlld1RpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldE1vdmllUHJldmlld1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3RHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgcHJldmlld1RpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgcHJldmlld0R1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TW92aWVQcmV2aWV3VGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdEdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllUHJldmlld1RpbWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBwcmV2aWV3VGltZTsKLQlUaW1lVmFsdWUgcHJldmlld0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgcHJldmlld1RpbWU7CisgICAgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbjsKICNpZm5kZWYgU2V0TW92aWVQcmV2aWV3VGltZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJldmlld1RpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJldmlld1RpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1RpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3RHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVByZXZpZXdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VGltZSwKLQkgICAgICAgICAgICAgICAgICAgIHByZXZpZXdEdXJhdGlvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld0R1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVQcmV2aWV3VGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlld1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RHVyYXRpb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclRpbWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllUG9zdGVyVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllUG9zdGVyVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQb3N0ZXJUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVBvc3RlclRpbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllUG9zdGVyVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVBvc3RlclRpbWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBwb3N0ZXJUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgcG9zdGVyVGltZTsKICNpZm5kZWYgU2V0TW92aWVQb3N0ZXJUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQb3N0ZXJUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVBvc3RlclRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3N0ZXJUaW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVQb3N0ZXJUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHBvc3RlclRpbWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc3RlclRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVBvc3RlclRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgcG9zdGVyVGltZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllU2VsZWN0aW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgc2VsZWN0aW9uVGltZTsKLQlUaW1lVmFsdWUgc2VsZWN0aW9uRHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBzZWxlY3Rpb25UaW1lOworICAgIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbjsKICNpZm5kZWYgR2V0TW92aWVTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldE1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvblRpbWUsCi0JICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3Rpb25UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3Rpb25EdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkR1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVNlbGVjdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHNlbGVjdGlvblRpbWU7Ci0JVGltZVZhbHVlIHNlbGVjdGlvbkR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgc2VsZWN0aW9uVGltZTsKKyAgICBUaW1lVmFsdWUgc2VsZWN0aW9uRHVyYXRpb247CiAjaWZuZGVmIFNldE1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllU2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvblRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3Rpb25EdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uVGltZSwKLQkgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EdXJhdGlvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3Rpb25EdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EdXJhdGlvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllQWN0aXZlU2VnbWVudChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBTZXRNb3ZpZUFjdGl2ZVNlZ21lbnQKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUFjdGl2ZVNlZ21lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllQWN0aXZlU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllQWN0aXZlU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZUFjdGl2ZVNlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllQWN0aXZlU2VnbWVudChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZUFjdGl2ZVNlZ21lbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUFjdGl2ZVNlZ21lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllQWN0aXZlU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVBY3RpdmVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZUFjdGl2ZVNlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVUaW1lKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OwotCVRpbWVSZWNvcmQgY3VycmVudFRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CisgICAgVGltZVJlY29yZCBjdXJyZW50VGltZTsKICNpZm5kZWYgR2V0TW92aWVUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmY3VycmVudFRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmY3VycmVudFRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnRUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmN1cnJlbnRUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVRpbWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgbmV3dGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCBuZXd0aW1lOwogI2lmbmRlZiBTZXRNb3ZpZVRpbWUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmbmV3dGltZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAmbmV3dGltZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZuZXd0aW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICZuZXd0aW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVUaW1lVmFsdWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBuZXd0aW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgbmV3dGltZTsKICNpZm5kZWYgU2V0TW92aWVUaW1lVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVRpbWVWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVUaW1lVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXd0aW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVUaW1lVmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBuZXd0aW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXd0aW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVUaW1lVmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBuZXd0aW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVVc2VyRGF0YShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVXNlckRhdGEgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVc2VyRGF0YSBfcnY7CiAjaWZuZGVmIEdldE1vdmllVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVVzZXJEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVVzZXJEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllVHJhY2tDb3VudChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZVRyYWNrQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRyYWNrQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVHJhY2tDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVUcmFja0NvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVRyYWNrQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVUcmFjayhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OwotCWxvbmcgdHJhY2tJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVHJhY2sgX3J2OworICAgIGxvbmcgdHJhY2tJRDsKICNpZm5kZWYgR2V0TW92aWVUcmFjawotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllVHJhY2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVHJhY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0lEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVUcmFjayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgdHJhY2tJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0lEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVUcmFjayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVJbmRUcmFjayhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBHZXRNb3ZpZUluZFRyYWNrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVJbmRUcmFjayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVJbmRUcmFjayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVJbmRUcmFjayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZUluZFRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVJbmRUcmFja1R5cGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRyYWNrIF9ydjsKLQlsb25nIGluZGV4OwotCU9TVHlwZSB0cmFja1R5cGU7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVHJhY2sgX3J2OworICAgIGxvbmcgaW5kZXg7CisgICAgT1NUeXBlIHRyYWNrVHlwZTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBHZXRNb3ZpZUluZFRyYWNrVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllSW5kVHJhY2tUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUluZFRyYWNrVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0cmFja1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllSW5kVHJhY2tUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0cmFja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllSW5kVHJhY2tUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9OZXdNb3ZpZVRyYWNrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JRml4ZWQgd2lkdGg7Ci0JRml4ZWQgaGVpZ2h0OwotCXNob3J0IHRyYWNrVm9sdW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CisgICAgRml4ZWQgd2lkdGg7CisgICAgRml4ZWQgaGVpZ2h0OworICAgIHNob3J0IHRyYWNrVm9sdW1lOwogI2lmbmRlZiBOZXdNb3ZpZVRyYWNrCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVUcmFjayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVUcmFjayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tWb2x1bWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdNb3ZpZVRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgIGhlaWdodCwKLQkgICAgICAgICAgICAgICAgICAgIHRyYWNrVm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tWb2x1bWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdNb3ZpZVRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrVm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRBdXRvVHJhY2tBbHRlcm5hdGVzRW5hYmxlZChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBlbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gZW5hYmxlOwogI2lmbmRlZiBTZXRBdXRvVHJhY2tBbHRlcm5hdGVzRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKFNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRBdXRvVHJhY2tBbHRlcm5hdGVzRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSkpCi0JCXJldHVybiBOVUxMOwotCVNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRBdXRvVHJhY2tBbHRlcm5hdGVzRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NlbGVjdE1vdmllQWx0ZXJuYXRlcyhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTZWxlY3RNb3ZpZUFsdGVybmF0ZXMKLQlQeU1hY19QUkVDSEVDSyhTZWxlY3RNb3ZpZUFsdGVybmF0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNlbGVjdE1vdmllQWx0ZXJuYXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2VsZWN0TW92aWVBbHRlcm5hdGVzKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2VsZWN0TW92aWVBbHRlcm5hdGVzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9JbnNlcnRNb3ZpZVNlZ21lbnQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgZHN0TW92aWU7Ci0JVGltZVZhbHVlIHNyY0luOwotCVRpbWVWYWx1ZSBzcmNEdXJhdGlvbjsKLQlUaW1lVmFsdWUgZHN0SW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTW92aWUgZHN0TW92aWU7CisgICAgVGltZVZhbHVlIHNyY0luOworICAgIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbjsKKyAgICBUaW1lVmFsdWUgZHN0SW47CiAjaWZuZGVmIEluc2VydE1vdmllU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKEluc2VydE1vdmllU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TW92aWVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJmRzdE1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjSW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNEdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdEluKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydE1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0R1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW4pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJmRzdE1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdEluKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluc2VydE1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW4pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0luc2VydEVtcHR5TW92aWVTZWdtZW50KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRpbWVWYWx1ZSBkc3RJbjsKLQlUaW1lVmFsdWUgZHN0RHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIGRzdEluOworICAgIFRpbWVWYWx1ZSBkc3REdXJhdGlvbjsKICNpZm5kZWYgSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRFbXB0eU1vdmllU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3REdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnNlcnRFbXB0eU1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RHVyYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0RHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0SW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdER1cmF0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9EZWxldGVNb3ZpZVNlZ21lbnQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIERlbGV0ZU1vdmllU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZU1vdmllU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTW92aWVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlbGV0ZU1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERlbGV0ZU1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NjYWxlTW92aWVTZWdtZW50KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIG9sZER1cmF0aW9uOwotCVRpbWVWYWx1ZSBuZXdEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBvbGREdXJhdGlvbjsKKyAgICBUaW1lVmFsdWUgbmV3RHVyYXRpb247CiAjaWZuZGVmIFNjYWxlTW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soU2NhbGVNb3ZpZVNlZ21lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNjYWxlTW92aWVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZvbGREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld0R1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNjYWxlTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0R1cmF0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdEdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTY2FsZU1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEdXJhdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQ3V0TW92aWVTZWxlY3Rpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OwogI2lmbmRlZiBDdXRNb3ZpZVNlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKEN1dE1vdmllU2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDdXRNb3ZpZVNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ3V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEN1dE1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0NvcHlNb3ZpZVNlbGVjdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CiAjaWZuZGVmIENvcHlNb3ZpZVNlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKENvcHlNb3ZpZVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weU1vdmllU2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3B5TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvcHlNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QYXN0ZU1vdmllU2VsZWN0aW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBzcmM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIHNyYzsKICNpZm5kZWYgUGFzdGVNb3ZpZVNlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKFBhc3RlTW92aWVTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFBhc3RlTW92aWVTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmc3JjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFzdGVNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgc3JjKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmc3JjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGFzdGVNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQWRkTW92aWVTZWxlY3Rpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIHNyYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgc3JjOwogI2lmbmRlZiBBZGRNb3ZpZVNlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKEFkZE1vdmllU2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNb3ZpZVNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlBZGRNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHNyYyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnNyYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFkZE1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgc3JjKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQ2xlYXJNb3ZpZVNlbGVjdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDbGVhck1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ2xlYXJNb3ZpZVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xlYXJNb3ZpZVNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2xlYXJNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsZWFyTW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllSW50b1R5cGVkSGFuZGxlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRyYWNrIHRhcmdldFRyYWNrOwotCU9TVHlwZSBoYW5kbGVUeXBlOwotCUhhbmRsZSBwdWJsaWNNb3ZpZTsKLQlUaW1lVmFsdWUgc3RhcnQ7Ci0JVGltZVZhbHVlIGR1cjsKLQlsb25nIGZsYWdzOwotCUNvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRyYWNrIHRhcmdldFRyYWNrOworICAgIE9TVHlwZSBoYW5kbGVUeXBlOworICAgIEhhbmRsZSBwdWJsaWNNb3ZpZTsKKyAgICBUaW1lVmFsdWUgc3RhcnQ7CisgICAgVGltZVZhbHVlIGR1cjsKKyAgICBsb25nIGZsYWdzOworICAgIENvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wOwogI2lmbmRlZiBQdXRNb3ZpZUludG9UeXBlZEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b1R5cGVkSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9UeXBlZEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsbGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0YXJnZXRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaGFuZGxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwdWJsaWNNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnVzZXJDb21wKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFB1dE1vdmllSW50b1R5cGVkSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJDb21wKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0YXJnZXRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaGFuZGxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwdWJsaWNNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnVzZXJDb21wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllSW50b1R5cGVkSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJDb21wKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9Db3B5TW92aWVTZXR0aW5ncyhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSBkc3RNb3ZpZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBkc3RNb3ZpZTsKICNpZm5kZWYgQ29weU1vdmllU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhDb3B5TW92aWVTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weU1vdmllU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1vdmllU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJmRzdE1vdmllKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlNb3ZpZVNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE1vdmllKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9Db252ZXJ0TW92aWVUb0ZpbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVHJhY2sgb25seVRyYWNrOwotCUZTU3BlYyBvdXRwdXRGaWxlOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlPU1R5cGUgY3JlYXRvcjsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlzaG9ydCByZXNJRDsKLQlsb25nIGZsYWdzOwotCUNvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRyYWNrIG9ubHlUcmFjazsKKyAgICBGU1NwZWMgb3V0cHV0RmlsZTsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgc2hvcnQgcmVzSUQ7CisgICAgbG9uZyBmbGFnczsKKyAgICBDb21wb25lbnRJbnN0YW5jZSB1c2VyQ29tcDsKICNpZm5kZWYgQ29udmVydE1vdmllVG9GaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ29udmVydE1vdmllVG9GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb252ZXJ0TW92aWVUb0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmb3V0cHV0RmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29udmVydE1vdmllVG9GaWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckNvbXApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc0lEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZvdXRwdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ1c2VyQ29tcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb252ZXJ0TW92aWVUb0ZpbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQ29tcCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllRGF0YVNpemUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgR2V0TW92aWVEYXRhU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZURhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZURhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVEYXRhU2l6ZTY0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCXdpZGUgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgd2lkZSBkYXRhU2l6ZTsKICNpZm5kZWYgR2V0TW92aWVEYXRhU2l6ZTY0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEYXRhU2l6ZTY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURhdGFTaXplNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TW92aWVEYXRhU2l6ZTY0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1vdmllRGF0YVNpemU2NChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRhdGFTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QdEluTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCBwdDsKICNpZm5kZWYgUHRJbk1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soUHRJbk1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdEluTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJbk1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIHB0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBQdEluTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgcHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllTGFuZ3VhZ2UoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgbGFuZ3VhZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbGFuZ3VhZ2U7CiAjaWZuZGVmIFNldE1vdmllTGFuZ3VhZ2UKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUxhbmd1YWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUxhbmd1YWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGFuZ3VhZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZUxhbmd1YWdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBsYW5ndWFnZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGFuZ3VhZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZUxhbmd1YWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0NvcHlNb3ZpZVVzZXJEYXRhKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1vdmllIGRzdE1vdmllOwotCU9TVHlwZSBjb3B5UnVsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBkc3RNb3ZpZTsKKyAgICBPU1R5cGUgY29weVJ1bGU7CiAjaWZuZGVmIENvcHlNb3ZpZVVzZXJEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1vdmllVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlNb3ZpZVVzZXJEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvcHlSdWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvcHlNb3ZpZVVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UnVsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29weVJ1bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weU1vdmllVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlSdWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzOwotCXNob3J0IG51bU1lZGlhVHlwZXM7Ci0JT1NUeXBlIHdoaWNoTWVkaWFUeXBlczsKLQlUaW1lVmFsdWUgdGltZTsKLQlGaXhlZCByYXRlOwotCVRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWU7Ci0JVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzOworICAgIHNob3J0IG51bU1lZGlhVHlwZXM7CisgICAgT1NUeXBlIHdoaWNoTWVkaWFUeXBlczsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBGaXhlZCByYXRlOworICAgIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb247CiAjaWZuZGVmIEdldE1vdmllTmV4dEludGVyZXN0aW5nVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllTmV4dEludGVyZXN0aW5nVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVOZXh0SW50ZXJlc3RpbmdUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZudW1NZWRpYVR5cGVzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ3aGljaE1lZGlhVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU1lZGlhVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaE1lZGlhVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ0R1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ0R1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtTWVkaWFUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmd2hpY2hNZWRpYVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TW92aWVOZXh0SW50ZXJlc3RpbmdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1NZWRpYVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hNZWRpYVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdEdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQWRkTW92aWVSZXNvdXJjZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZXNSZWZOdW07Ci0Jc2hvcnQgcmVzSWQ7Ci0JU3RyMjU1IHJlc05hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVzUmVmTnVtOworICAgIHNob3J0IHJlc0lkOworICAgIFN0cjI1NSByZXNOYW1lOwogI2lmbmRlZiBBZGRNb3ZpZVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soQWRkTW92aWVSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkTW92aWVSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHJlc05hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkTW92aWVSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVzTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRNb3ZpZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNJZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfVXBkYXRlTW92aWVSZXNvdXJjZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZXNSZWZOdW07Ci0Jc2hvcnQgcmVzSWQ7Ci0JU3RyMjU1IHJlc05hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVzUmVmTnVtOworICAgIHNob3J0IHJlc0lkOworICAgIFN0cjI1NSByZXNOYW1lOwogI2lmbmRlZiBVcGRhdGVNb3ZpZVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlTW92aWVSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlTW92aWVSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc0lkLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHJlc05hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVXBkYXRlTW92aWVSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHJlc05hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlTW92aWVSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9BZGRNb3ZpZVRvU3RvcmFnZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEYXRhSGFuZGxlciBkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEYXRhSGFuZGxlciBkaDsKICNpZm5kZWYgQWRkTW92aWVUb1N0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhBZGRNb3ZpZVRvU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkTW92aWVUb1N0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRNb3ZpZVRvU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRNb3ZpZVRvU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfVXBkYXRlTW92aWVJblN0b3JhZ2UoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIFVwZGF0ZU1vdmllSW5TdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlTW92aWVJblN0b3JhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZU1vdmllSW5TdG9yYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVXBkYXRlTW92aWVJblN0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlTW92aWVJblN0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0hhc01vdmllQ2hhbmdlZChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBIYXNNb3ZpZUNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhIYXNNb3ZpZUNoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEhhc01vdmllQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSGFzTW92aWVDaGFuZ2VkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBIYXNNb3ZpZUNoYW5nZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQ2xlYXJNb3ZpZUNoYW5nZWQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2xlYXJNb3ZpZUNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xlYXJNb3ZpZUNoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNsZWFyTW92aWVDaGFuZ2VkKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xlYXJNb3ZpZUNoYW5nZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllRGVmYXVsdERhdGFSZWYoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgU2V0TW92aWVEZWZhdWx0RGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllRGVmYXVsdERhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllRGVmYXVsdERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TW92aWVEZWZhdWx0RGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1vdmllRGVmYXVsdERhdGFSZWYoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZURlZmF1bHREYXRhUmVmKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIEdldE1vdmllRGVmYXVsdERhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURlZmF1bHREYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURlZmF1bHREYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TW92aWVEZWZhdWx0RGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVEZWZhdWx0RGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllQ29sb3JUYWJsZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlDVGFiSGFuZGxlIGN0YWI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ1RhYkhhbmRsZSBjdGFiOwogI2lmbmRlZiBTZXRNb3ZpZUNvbG9yVGFibGUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUNvbG9yVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllQ29sb3JUYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY3RhYikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNb3ZpZUNvbG9yVGFibGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGN0YWIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdGFiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1vdmllQ29sb3JUYWJsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVDb2xvclRhYmxlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNUYWJIYW5kbGUgY3RhYjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBDVGFiSGFuZGxlIGN0YWI7CiAjaWZuZGVmIEdldE1vdmllQ29sb3JUYWJsZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQ29sb3JUYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVDb2xvclRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TW92aWVDb2xvclRhYmxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmY3RhYik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGN0YWIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVDb2xvclRhYmxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3RhYik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGN0YWIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBtb3ZpZUZsYXR0ZW5GbGFnczsKLQlGU1NwZWMgdGhlRmlsZTsKLQlPU1R5cGUgY3JlYXRvcjsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOwotCXNob3J0IHJlc0lkOwotCVN0cjI1NSByZXNOYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIG1vdmllRmxhdHRlbkZsYWdzOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7CisgICAgc2hvcnQgcmVzSWQ7CisgICAgU3RyMjU1IHJlc05hbWU7CiAjaWZuZGVmIEZsYXR0ZW5Nb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEZsYXR0ZW5Nb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhdHRlbk1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8maGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZsYXR0ZW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHJlc05hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlGbGF0dGVuTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgbW92aWVGbGF0dGVuRmxhZ3MsCi0JICAgICAgICAgICAgICZ0aGVGaWxlLAotCSAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICBzY3JpcHRUYWcsCi0JICAgICAgICAgICAgIGNyZWF0ZU1vdmllRmlsZUZsYWdzLAotCSAgICAgICAgICAgICAmcmVzSWQsCi0JICAgICAgICAgICAgIHJlc05hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXNJZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyZobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZsYXR0ZW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKKyAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MsCisgICAgICAgICAgICAgICAgICZyZXNJZCwKKyAgICAgICAgICAgICAgICAgcmVzTmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9GbGF0dGVuTW92aWVEYXRhKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7Ci0JbG9uZyBtb3ZpZUZsYXR0ZW5GbGFnczsKLQlGU1NwZWMgdGhlRmlsZTsKLQlPU1R5cGUgY3JlYXRvcjsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CisgICAgbG9uZyBtb3ZpZUZsYXR0ZW5GbGFnczsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOwogI2lmbmRlZiBGbGF0dGVuTW92aWVEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soRmxhdHRlbk1vdmllRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhdHRlbk1vdmllRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGF0dGVuTW92aWVEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1vdmllRmlsZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGF0dGVuTW92aWVEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1vdmllRmlsZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9GbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7Ci0JbG9uZyBtb3ZpZUZsYXR0ZW5GbGFnczsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7Ci0JbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OworICAgIGxvbmcgbW92aWVGbGF0dGVuRmxhZ3M7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7CiAjaWZuZGVmIEZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mTyZobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZsYXR0ZW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRmxhdHRlbk1vdmllRGF0YVRvRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVGbGF0dGVuRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mTyZobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZsYXR0ZW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhdHRlbk1vdmllRGF0YVRvRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVGbGF0dGVuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX01vdmllU2VhcmNoVGV4dChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQdHIgdGV4dDsKLQlsb25nIHNpemU7Ci0JbG9uZyBzZWFyY2hGbGFnczsKLQlUcmFjayBzZWFyY2hUcmFjazsKLQlUaW1lVmFsdWUgc2VhcmNoVGltZTsKLQlsb25nIHNlYXJjaE9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQdHIgdGV4dDsKKyAgICBsb25nIHNpemU7CisgICAgbG9uZyBzZWFyY2hGbGFnczsKKyAgICBUcmFjayBzZWFyY2hUcmFjazsKKyAgICBUaW1lVmFsdWUgc2VhcmNoVGltZTsKKyAgICBsb25nIHNlYXJjaE9mZnNldDsKICNpZm5kZWYgTW92aWVTZWFyY2hUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soTW92aWVTZWFyY2hUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZVNlYXJjaFRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VhcmNoRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTW92aWVTZWFyY2hUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnNlYXJjaFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnNlYXJjaFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2VhcmNoT2Zmc2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIHNlYXJjaFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgc2VhcmNoT2Zmc2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBNb3ZpZVNlYXJjaFRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VhcmNoVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VhcmNoVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hPZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgc2VhcmNoVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldFBvc3RlckJveChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3hSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJveFJlY3Q7CiAjaWZuZGVmIEdldFBvc3RlckJveAotCVB5TWFjX1BSRUNIRUNLKEdldFBvc3RlckJveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9zdGVyQm94KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3N0ZXJCb3goX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgJmJveFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm94UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvc3RlckJveChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAmYm94UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3hSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRQb3N0ZXJCb3goTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgYm94UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBib3hSZWN0OwogI2lmbmRlZiBTZXRQb3N0ZXJCb3gKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3N0ZXJCb3gpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvc3RlckJveCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3hSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9zdGVyQm94KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICZib3hSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvc3RlckJveChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAmYm94UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllU2VnbWVudERpc3BsYXlCb3VuZHNSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllU2VnbWVudERpc3BsYXlCb3VuZHNSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllU2VnbWVudERpc3BsYXlCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVTdGF0dXMoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHJhY2sgZmlyc3RQcm9ibGVtVHJhY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHJhY2sgZmlyc3RQcm9ibGVtVHJhY2s7CiAjaWZuZGVmIEdldE1vdmllU3RhdHVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVTdGF0dXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllU3RhdHVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVN0YXR1cyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICZmaXJzdFByb2JsZW1UcmFjayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZmlyc3RQcm9ibGVtVHJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVN0YXR1cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdFByb2JsZW1UcmFjayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZmlyc3RQcm9ibGVtVHJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX05ld01vdmllQ29udHJvbGxlcihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWVDb250cm9sbGVyIF9ydjsKLQlSZWN0IG1vdmllUmVjdDsKLQlsb25nIHNvbWVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWVDb250cm9sbGVyIF9ydjsKKyAgICBSZWN0IG1vdmllUmVjdDsKKyAgICBsb25nIHNvbWVGbGFnczsKICNpZm5kZWYgTmV3TW92aWVDb250cm9sbGVyCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVDb250cm9sbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUNvbnRyb2xsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJm1vdmllUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNvbWVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld01vdmllQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVDdGxPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZtb3ZpZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzb21lRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdNb3ZpZUNvbnRyb2xsZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllQ3RsT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QdXRNb3ZpZU9uU2NyYXAoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBtb3ZpZVNjcmFwRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBtb3ZpZVNjcmFwRmxhZ3M7CiAjaWZuZGVmIFB1dE1vdmllT25TY3JhcAotCVB5TWFjX1BSRUNIRUNLKFB1dE1vdmllT25TY3JhcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVPblNjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW92aWVTY3JhcEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFB1dE1vdmllT25TY3JhcChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgbW92aWVTY3JhcEZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllU2NyYXBGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBQdXRNb3ZpZU9uU2NyYXAoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllU2NyYXBGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVQbGF5SGludHMoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBmbGFnc01hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgZmxhZ3M7CisgICAgbG9uZyBmbGFnc01hc2s7CiAjaWZuZGVmIFNldE1vdmllUGxheUhpbnRzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQbGF5SGludHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllUGxheUhpbnRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVQbGF5SGludHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllUGxheUhpbnRzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TWF4TG9hZGVkVGltZUluTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRpbWU7CiAjaWZuZGVmIEdldE1heExvYWRlZFRpbWVJbk1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWF4TG9hZGVkVGltZUluTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1heExvYWRlZFRpbWVJbk1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWF4TG9hZGVkVGltZUluTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWF4TG9hZGVkVGltZUluTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1FUTW92aWVOZWVkc1RpbWVUYWJsZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlCb29sZWFuIG5lZWRzVGltZVRhYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEJvb2xlYW4gbmVlZHNUaW1lVGFibGU7CiAjaWZuZGVmIFFUTW92aWVOZWVkc1RpbWVUYWJsZQotCVB5TWFjX1BSRUNIRUNLKFFUTW92aWVOZWVkc1RpbWVUYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRNb3ZpZU5lZWRzVGltZVRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRNb3ZpZU5lZWRzVGltZVRhYmxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmVlZHNUaW1lVGFibGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG5lZWRzVGltZVRhYmxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUTW92aWVOZWVkc1RpbWVUYWJsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5lZWRzVGltZVRhYmxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkc1RpbWVUYWJsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JbG9uZyBvZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIGxvbmcgb2Zmc2V0OwogI2lmbmRlZiBRVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBNb3ZpZU9ial9tZXRob2RzW10gPSB7Ci0JeyJNb3ZpZXNUYXNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX01vdmllc1Rhc2ssIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbWF4TWlsbGlTZWNUb1VzZSkgLT4gTm9uZSIpfSwKLQl7IlByZXJvbGxNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QcmVyb2xsTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCBSYXRlKSAtPiBOb25lIil9LAotCXsiQWJvcnRQcmVQcmVyb2xsTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWJvcnRQcmVQcmVyb2xsTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKE9TRXJyIGVycikgLT4gTm9uZSIpfSwKLQl7IkxvYWRNb3ZpZUludG9SYW0iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTG9hZE1vdmllSW50b1JhbSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbiwgbG9uZyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllQWN0aXZlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllQWN0aXZlLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGFjdGl2ZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllQWN0aXZlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllQWN0aXZlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTdGFydE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1N0YXJ0TW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlN0b3BNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TdG9wTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdvVG9CZWdpbm5pbmdPZk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dvVG9CZWdpbm5pbmdPZk1vdmllLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHb1RvRW5kT2ZNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Hb1RvRW5kT2ZNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSXNNb3ZpZURvbmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSXNNb3ZpZURvbmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldE1vdmllUHJldmlld01vZGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVQcmV2aWV3TW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0TW92aWVQcmV2aWV3TW9kZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZXZpZXdNb2RlLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIHVzZVByZXZpZXcpIC0+IE5vbmUiKX0sCi0JeyJTaG93TW92aWVQb3N0ZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2hvd01vdmllUG9zdGVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVCYXNlIF9ydikiKX0sCi0JeyJTZXRNb3ZpZU1hc3RlclRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllTWFzdGVyVGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVCYXNlIHRiLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllTWFzdGVyQ2xvY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVNYXN0ZXJDbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGNsb2NrTWVpc3RlciwgVGltZVJlY29yZCBzbGF2ZVplcm8pIC0+IE5vbmUiKX0sCi0JeyJDaG9vc2VNb3ZpZUNsb2NrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0Nob29zZU1vdmllQ2xvY2ssIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZUdXb3JsZCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2RoKSIpfSwKLQl7IlNldE1vdmllR1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllR1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZU5hdHVyYWxCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgbmF0dXJhbEJvdW5kcykiKX0sCi0JeyJHZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZywgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgdGhlVHJhY2spIC0+IChUcmFjayBfcnYpIil9LAotCXsiR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmciLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIHRoZVRyYWNrKSAtPiAoVHJhY2sgX3J2KSIpfSwKLQl7IkdldE1vdmllUGljdCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBpY3QsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lKSAtPiAoUGljSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRNb3ZpZVBvc3RlclBpY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVQb3N0ZXJQaWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IlVwZGF0ZU1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1VwZGF0ZU1vdmllLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJbnZhbGlkYXRlTW92aWVSZWdpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSW52YWxpZGF0ZU1vdmllUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgaW52YWxpZFJnbikgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllQm94IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllQm94LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IGJveFJlY3QpIil9LAotCXsiU2V0TW92aWVCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVCb3gsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm94UmVjdCkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllRGlzcGxheUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVEaXNwbGF5Q2xpcFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJTZXRNb3ZpZURpc3BsYXlDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllRGlzcGxheUNsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllQ2xpcFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJTZXRNb3ZpZUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVDbGlwUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdGhlQ2xpcCkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllRGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURpc3BsYXlCb3VuZHNSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiR2V0TW92aWVCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVCb3VuZHNSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiU2V0TW92aWVWaWRlb091dHB1dCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVZpZGVvT3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSB2b3V0KSAtPiBOb25lIil9LAotCXsiUHV0TW92aWVJbnRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B1dE1vdmllSW50b0hhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHB1YmxpY01vdmllKSAtPiBOb25lIil9LAotCXsiUHV0TW92aWVJbnRvRGF0YUZvcmsiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvRGF0YUZvcmssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZSZWZOdW0sIGxvbmcgb2Zmc2V0LCBsb25nIG1heFNpemUpIC0+IE5vbmUiKX0sCi0JeyJQdXRNb3ZpZUludG9EYXRhRm9yazY0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B1dE1vdmllSW50b0RhdGFGb3JrNjQsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZlJlZk51bSwgd2lkZSBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IlB1dE1vdmllSW50b1N0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIHdpZGUgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG1heFNpemUpIC0+IE5vbmUiKX0sCi0JeyJQdXRNb3ZpZUZvckRhdGFSZWZJbnRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIEhhbmRsZSBwdWJsaWNNb3ZpZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllQ3JlYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllQ3JlYXRpb25UaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCi0JeyJHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVNb2RpZmljYXRpb25UaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCi0JeyJHZXRNb3ZpZVRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVNjYWxlIF9ydikiKX0sCi0JeyJTZXRNb3ZpZVRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHRpbWVTY2FsZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllRHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVEdXJhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydikiKX0sCi0JeyJHZXRNb3ZpZVJhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVSYXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiU2V0TW92aWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgcmF0ZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllUHJlZmVycmVkUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJTZXRNb3ZpZVByZWZlcnJlZFJhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVQcmVmZXJyZWRSYXRlLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCByYXRlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdm9sdW1lKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVWb2x1bWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJTZXRNb3ZpZVZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdm9sdW1lKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVQcmV2aWV3VGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZXZpZXdUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgcHJldmlld1RpbWUsIFRpbWVWYWx1ZSBwcmV2aWV3RHVyYXRpb24pIil9LAotCXsiU2V0TW92aWVQcmV2aWV3VGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZXZpZXdUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgcHJldmlld1RpbWUsIFRpbWVWYWx1ZSBwcmV2aWV3RHVyYXRpb24pIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVBvc3RlclRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVQb3N0ZXJUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7IlNldE1vdmllUG9zdGVyVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVBvc3RlclRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBwb3N0ZXJUaW1lKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBzZWxlY3Rpb25UaW1lLCBUaW1lVmFsdWUgc2VsZWN0aW9uRHVyYXRpb24pIil9LAotCXsiU2V0TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzZWxlY3Rpb25UaW1lLCBUaW1lVmFsdWUgc2VsZWN0aW9uRHVyYXRpb24pIC0+IE5vbmUiKX0sCi0JeyJTZXRNb3ZpZUFjdGl2ZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVBY3RpdmVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZUFjdGl2ZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVBY3RpdmVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIil9LAotCXsiR2V0TW92aWVUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydiwgVGltZVJlY29yZCBjdXJyZW50VGltZSkiKX0sCi0JeyJTZXRNb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIG5ld3RpbWUpIC0+IE5vbmUiKX0sCi0JeyJTZXRNb3ZpZVRpbWVWYWx1ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVRpbWVWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIG5ld3RpbWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCi0JeyJHZXRNb3ZpZVRyYWNrQ291bnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUcmFja0NvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJHZXRNb3ZpZVRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVHJhY2ssIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgdHJhY2tJRCkgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXRNb3ZpZUluZFRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllSW5kVHJhY2ssIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgpIC0+IChUcmFjayBfcnYpIil9LAotCXsiR2V0TW92aWVJbmRUcmFja1R5cGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVJbmRUcmFja1R5cGUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIE9TVHlwZSB0cmFja1R5cGUsIGxvbmcgZmxhZ3MpIC0+IChUcmFjayBfcnYpIil9LAotCXsiTmV3TW92aWVUcmFjayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9OZXdNb3ZpZVRyYWNrLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0LCBzaG9ydCB0cmFja1ZvbHVtZSkgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJTZXRBdXRvVHJhY2tBbHRlcm5hdGVzRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRBdXRvVHJhY2tBbHRlcm5hdGVzRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBlbmFibGUpIC0+IE5vbmUiKX0sCi0JeyJTZWxlY3RNb3ZpZUFsdGVybmF0ZXMiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2VsZWN0TW92aWVBbHRlcm5hdGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnRNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSW5zZXJ0TW92aWVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBkc3RNb3ZpZSwgVGltZVZhbHVlIHNyY0luLCBUaW1lVmFsdWUgc3JjRHVyYXRpb24sIFRpbWVWYWx1ZSBkc3RJbikgLT4gTm9uZSIpfSwKLQl7Ikluc2VydEVtcHR5TW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0luc2VydEVtcHR5TW92aWVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgZHN0SW4sIFRpbWVWYWx1ZSBkc3REdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IkRlbGV0ZU1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9EZWxldGVNb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IlNjYWxlTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NjYWxlTW92aWVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgb2xkRHVyYXRpb24sIFRpbWVWYWx1ZSBuZXdEdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IkN1dE1vdmllU2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0N1dE1vdmllU2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiQ29weU1vdmllU2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0NvcHlNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7IlBhc3RlTW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUGFzdGVNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgc3JjKSAtPiBOb25lIil9LAotCXsiQWRkTW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWRkTW92aWVTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllIHNyYykgLT4gTm9uZSIpfSwKLQl7IkNsZWFyTW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ2xlYXJNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIHRhcmdldFRyYWNrLCBPU1R5cGUgaGFuZGxlVHlwZSwgSGFuZGxlIHB1YmxpY01vdmllLCBUaW1lVmFsdWUgc3RhcnQsIFRpbWVWYWx1ZSBkdXIsIGxvbmcgZmxhZ3MsIENvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wKSAtPiBOb25lIil9LAotCXsiQ29weU1vdmllU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29weU1vdmllU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllKSAtPiBOb25lIil9LAotCXsiQ29udmVydE1vdmllVG9GaWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0NvbnZlcnRNb3ZpZVRvRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgb25seVRyYWNrLCBGU1NwZWMgb3V0cHV0RmlsZSwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgZmxhZ3MsIENvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wKSAtPiAoc2hvcnQgcmVzSUQpIil9LAotCXsiR2V0TW92aWVEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURhdGFTaXplLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChsb25nIF9ydikiKX0sCi0JeyJHZXRNb3ZpZURhdGFTaXplNjQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVEYXRhU2l6ZTY0LCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+ICh3aWRlIGRhdGFTaXplKSIpfSwKLQl7IlB0SW5Nb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdEluTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0TW92aWVMYW5ndWFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUxhbmd1YWdlLCAxLAotCSBQeURvY19TVFIoIihsb25nIGxhbmd1YWdlKSAtPiBOb25lIil9LAotCXsiQ29weU1vdmllVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29weU1vdmllVXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllLCBPU1R5cGUgY29weVJ1bGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVOZXh0SW50ZXJlc3RpbmdUaW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFncywgc2hvcnQgbnVtTWVkaWFUeXBlcywgT1NUeXBlIHdoaWNoTWVkaWFUeXBlcywgVGltZVZhbHVlIHRpbWUsIEZpeGVkIHJhdGUpIC0+IChUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lLCBUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbikiKX0sCi0JeyJBZGRNb3ZpZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0FkZE1vdmllUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgU3RyMjU1IHJlc05hbWUpIC0+IChzaG9ydCByZXNJZCkiKX0sCi0JeyJVcGRhdGVNb3ZpZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1VwZGF0ZU1vdmllUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgc2hvcnQgcmVzSWQsIFN0cjI1NSByZXNOYW1lKSAtPiBOb25lIil9LAotCXsiQWRkTW92aWVUb1N0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWRkTW92aWVUb1N0b3JhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiBOb25lIil9LAotCXsiVXBkYXRlTW92aWVJblN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWVJblN0b3JhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiBOb25lIil9LAotCXsiSGFzTW92aWVDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0hhc01vdmllQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ2xlYXJNb3ZpZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ2xlYXJNb3ZpZUNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllRGVmYXVsdERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVEZWZhdWx0RGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllRGVmYXVsdERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVEZWZhdWx0RGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCi0JeyJTZXRNb3ZpZUNvbG9yVGFibGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVDb2xvclRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDVGFiSGFuZGxlIGN0YWIpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZUNvbG9yVGFibGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDb2xvclRhYmxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDVGFiSGFuZGxlIGN0YWIpIil9LAotCXsiRmxhdHRlbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtb3ZpZUZsYXR0ZW5GbGFncywgRlNTcGVjIHRoZUZpbGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncywgU3RyMjU1IHJlc05hbWUpIC0+IChzaG9ydCByZXNJZCkiKX0sCi0JeyJGbGF0dGVuTW92aWVEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbW92aWVGbGF0dGVuRmxhZ3MsIEZTU3BlYyB0aGVGaWxlLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3MpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiRmxhdHRlbk1vdmllRGF0YVRvRGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9GbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihsb25nIG1vdmllRmxhdHRlbkZsYWdzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3MpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiTW92aWVTZWFyY2hUZXh0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX01vdmllU2VhcmNoVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoUHRyIHRleHQsIGxvbmcgc2l6ZSwgbG9uZyBzZWFyY2hGbGFncykgLT4gKFRyYWNrIHNlYXJjaFRyYWNrLCBUaW1lVmFsdWUgc2VhcmNoVGltZSwgbG9uZyBzZWFyY2hPZmZzZXQpIil9LAotCXsiR2V0UG9zdGVyQm94IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldFBvc3RlckJveCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3hSZWN0KSIpfSwKLQl7IlNldFBvc3RlckJveCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRQb3N0ZXJCb3gsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm94UmVjdCkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllU2VnbWVudERpc3BsYXlCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiR2V0TW92aWVTdGF0dXMiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVTdGF0dXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRyYWNrIGZpcnN0UHJvYmxlbVRyYWNrKSIpfSwKLQl7Ik5ld01vdmllQ29udHJvbGxlciIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9OZXdNb3ZpZUNvbnRyb2xsZXIsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgbW92aWVSZWN0LCBsb25nIHNvbWVGbGFncykgLT4gKE1vdmllQ29udHJvbGxlciBfcnYpIil9LAotCXsiUHV0TW92aWVPblNjcmFwIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B1dE1vdmllT25TY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtb3ZpZVNjcmFwRmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJTZXRNb3ZpZVBsYXlIaW50cyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVBsYXlIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHRpbWUpIil9LAotCXsiUVRNb3ZpZU5lZWRzVGltZVRhYmxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1FUTW92aWVOZWVkc1RpbWVUYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBuZWVkc1RpbWVUYWJsZSkiKX0sCi0JeyJRVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1FUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIGRhdGFSZWYpIC0+IChsb25nIG9mZnNldCkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJNb3ZpZXNUYXNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX01vdmllc1Rhc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbWF4TWlsbGlTZWNUb1VzZSkgLT4gTm9uZSIpfSwKKyAgICB7IlByZXJvbGxNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QcmVyb2xsTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCBSYXRlKSAtPiBOb25lIil9LAorICAgIHsiQWJvcnRQcmVQcmVyb2xsTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWJvcnRQcmVQcmVyb2xsTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TRXJyIGVycikgLT4gTm9uZSIpfSwKKyAgICB7IkxvYWRNb3ZpZUludG9SYW0iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTG9hZE1vdmllSW50b1JhbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbiwgbG9uZyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllQWN0aXZlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllQWN0aXZlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGFjdGl2ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllQWN0aXZlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllQWN0aXZlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTdGFydE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1N0YXJ0TW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlN0b3BNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TdG9wTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdvVG9CZWdpbm5pbmdPZk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dvVG9CZWdpbm5pbmdPZk1vdmllLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHb1RvRW5kT2ZNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Hb1RvRW5kT2ZNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSXNNb3ZpZURvbmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSXNNb3ZpZURvbmUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldE1vdmllUHJldmlld01vZGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVQcmV2aWV3TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TW92aWVQcmV2aWV3TW9kZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZXZpZXdNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHVzZVByZXZpZXcpIC0+IE5vbmUiKX0sCisgICAgeyJTaG93TW92aWVQb3N0ZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2hvd01vdmllUG9zdGVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVCYXNlIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZU1hc3RlclRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllTWFzdGVyVGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVCYXNlIHRiLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllTWFzdGVyQ2xvY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVNYXN0ZXJDbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGNsb2NrTWVpc3RlciwgVGltZVJlY29yZCBzbGF2ZVplcm8pIC0+IE5vbmUiKX0sCisgICAgeyJDaG9vc2VNb3ZpZUNsb2NrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0Nob29zZU1vdmllQ2xvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZUdXb3JsZCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2RoKSIpfSwKKyAgICB7IlNldE1vdmllR1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllR1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZU5hdHVyYWxCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgbmF0dXJhbEJvdW5kcykiKX0sCisgICAgeyJHZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgdGhlVHJhY2spIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmciLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIHRoZVRyYWNrKSAtPiAoVHJhY2sgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllUGljdCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBpY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lKSAtPiAoUGljSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZVBvc3RlclBpY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVQb3N0ZXJQaWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlVwZGF0ZU1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1VwZGF0ZU1vdmllLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJbnZhbGlkYXRlTW92aWVSZWdpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSW52YWxpZGF0ZU1vdmllUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgaW52YWxpZFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllQm94IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllQm94LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGJveFJlY3QpIil9LAorICAgIHsiU2V0TW92aWVCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm94UmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllRGlzcGxheUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVEaXNwbGF5Q2xpcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZURpc3BsYXlDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllRGlzcGxheUNsaXBSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllQ2xpcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgdGhlQ2xpcCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllRGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURpc3BsYXlCb3VuZHNSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TW92aWVCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVCb3VuZHNSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0TW92aWVWaWRlb091dHB1dCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVZpZGVvT3V0cHV0LCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSB2b3V0KSAtPiBOb25lIil9LAorICAgIHsiUHV0TW92aWVJbnRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B1dE1vdmllSW50b0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHB1YmxpY01vdmllKSAtPiBOb25lIil9LAorICAgIHsiUHV0TW92aWVJbnRvRGF0YUZvcmsiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvRGF0YUZvcmssIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGZSZWZOdW0sIGxvbmcgb2Zmc2V0LCBsb25nIG1heFNpemUpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRNb3ZpZUludG9EYXRhRm9yazY0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B1dE1vdmllSW50b0RhdGFGb3JrNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZlJlZk51bSwgd2lkZSBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlB1dE1vdmllSW50b1N0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIHdpZGUgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG1heFNpemUpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRNb3ZpZUZvckRhdGFSZWZJbnRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIEhhbmRsZSBwdWJsaWNNb3ZpZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllQ3JlYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllQ3JlYXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVNb2RpZmljYXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZVRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVNjYWxlIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHRpbWVTY2FsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllRHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVEdXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZVJhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVSYXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiU2V0TW92aWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgcmF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllUHJlZmVycmVkUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVByZWZlcnJlZFJhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVQcmVmZXJyZWRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCByYXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdm9sdW1lKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVWb2x1bWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdm9sdW1lKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVQcmV2aWV3VGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZXZpZXdUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgcHJldmlld1RpbWUsIFRpbWVWYWx1ZSBwcmV2aWV3RHVyYXRpb24pIil9LAorICAgIHsiU2V0TW92aWVQcmV2aWV3VGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZXZpZXdUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgcHJldmlld1RpbWUsIFRpbWVWYWx1ZSBwcmV2aWV3RHVyYXRpb24pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVBvc3RlclRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVQb3N0ZXJUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllUG9zdGVyVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVBvc3RlclRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBwb3N0ZXJUaW1lKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBzZWxlY3Rpb25UaW1lLCBUaW1lVmFsdWUgc2VsZWN0aW9uRHVyYXRpb24pIil9LAorICAgIHsiU2V0TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzZWxlY3Rpb25UaW1lLCBUaW1lVmFsdWUgc2VsZWN0aW9uRHVyYXRpb24pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNb3ZpZUFjdGl2ZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVBY3RpdmVTZWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZUFjdGl2ZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVBY3RpdmVTZWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIil9LAorICAgIHsiR2V0TW92aWVUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydiwgVGltZVJlY29yZCBjdXJyZW50VGltZSkiKX0sCisgICAgeyJTZXRNb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIG5ld3RpbWUpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNb3ZpZVRpbWVWYWx1ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVRpbWVWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIG5ld3RpbWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZVRyYWNrQ291bnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUcmFja0NvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZVRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVHJhY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgdHJhY2tJRCkgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZUluZFRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllSW5kVHJhY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgpIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiR2V0TW92aWVJbmRUcmFja1R5cGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVJbmRUcmFja1R5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIE9TVHlwZSB0cmFja1R5cGUsIGxvbmcgZmxhZ3MpIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiTmV3TW92aWVUcmFjayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9OZXdNb3ZpZVRyYWNrLCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0LCBzaG9ydCB0cmFja1ZvbHVtZSkgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJTZXRBdXRvVHJhY2tBbHRlcm5hdGVzRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRBdXRvVHJhY2tBbHRlcm5hdGVzRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBlbmFibGUpIC0+IE5vbmUiKX0sCisgICAgeyJTZWxlY3RNb3ZpZUFsdGVybmF0ZXMiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2VsZWN0TW92aWVBbHRlcm5hdGVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnRNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSW5zZXJ0TW92aWVTZWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBkc3RNb3ZpZSwgVGltZVZhbHVlIHNyY0luLCBUaW1lVmFsdWUgc3JjRHVyYXRpb24sIFRpbWVWYWx1ZSBkc3RJbikgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydEVtcHR5TW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0luc2VydEVtcHR5TW92aWVTZWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgZHN0SW4sIFRpbWVWYWx1ZSBkc3REdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkRlbGV0ZU1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9EZWxldGVNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNjYWxlTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NjYWxlTW92aWVTZWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgb2xkRHVyYXRpb24sIFRpbWVWYWx1ZSBuZXdEdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkN1dE1vdmllU2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0N1dE1vdmllU2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiQ29weU1vdmllU2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0NvcHlNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKKyAgICB7IlBhc3RlTW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUGFzdGVNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgc3JjKSAtPiBOb25lIil9LAorICAgIHsiQWRkTW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWRkTW92aWVTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIHNyYykgLT4gTm9uZSIpfSwKKyAgICB7IkNsZWFyTW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ2xlYXJNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIHRhcmdldFRyYWNrLCBPU1R5cGUgaGFuZGxlVHlwZSwgSGFuZGxlIHB1YmxpY01vdmllLCBUaW1lVmFsdWUgc3RhcnQsIFRpbWVWYWx1ZSBkdXIsIGxvbmcgZmxhZ3MsIENvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wKSAtPiBOb25lIil9LAorICAgIHsiQ29weU1vdmllU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29weU1vdmllU2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllKSAtPiBOb25lIil9LAorICAgIHsiQ29udmVydE1vdmllVG9GaWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0NvbnZlcnRNb3ZpZVRvRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgb25seVRyYWNrLCBGU1NwZWMgb3V0cHV0RmlsZSwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgZmxhZ3MsIENvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wKSAtPiAoc2hvcnQgcmVzSUQpIil9LAorICAgIHsiR2V0TW92aWVEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZURhdGFTaXplNjQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVEYXRhU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+ICh3aWRlIGRhdGFTaXplKSIpfSwKKyAgICB7IlB0SW5Nb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdEluTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHB0KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TW92aWVMYW5ndWFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUxhbmd1YWdlLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGxhbmd1YWdlKSAtPiBOb25lIil9LAorICAgIHsiQ29weU1vdmllVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29weU1vdmllVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllLCBPU1R5cGUgY29weVJ1bGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVOZXh0SW50ZXJlc3RpbmdUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFncywgc2hvcnQgbnVtTWVkaWFUeXBlcywgT1NUeXBlIHdoaWNoTWVkaWFUeXBlcywgVGltZVZhbHVlIHRpbWUsIEZpeGVkIHJhdGUpIC0+IChUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lLCBUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbikiKX0sCisgICAgeyJBZGRNb3ZpZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0FkZE1vdmllUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgU3RyMjU1IHJlc05hbWUpIC0+IChzaG9ydCByZXNJZCkiKX0sCisgICAgeyJVcGRhdGVNb3ZpZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1VwZGF0ZU1vdmllUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgc2hvcnQgcmVzSWQsIFN0cjI1NSByZXNOYW1lKSAtPiBOb25lIil9LAorICAgIHsiQWRkTW92aWVUb1N0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWRkTW92aWVUb1N0b3JhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiBOb25lIil9LAorICAgIHsiVXBkYXRlTW92aWVJblN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWVJblN0b3JhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiBOb25lIil9LAorICAgIHsiSGFzTW92aWVDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0hhc01vdmllQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ2xlYXJNb3ZpZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ2xlYXJNb3ZpZUNoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllRGVmYXVsdERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVEZWZhdWx0RGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllRGVmYXVsdERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVEZWZhdWx0RGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCisgICAgeyJTZXRNb3ZpZUNvbG9yVGFibGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVDb2xvclRhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihDVGFiSGFuZGxlIGN0YWIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZUNvbG9yVGFibGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDb2xvclRhYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDVGFiSGFuZGxlIGN0YWIpIil9LAorICAgIHsiRmxhdHRlbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtb3ZpZUZsYXR0ZW5GbGFncywgRlNTcGVjIHRoZUZpbGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncywgU3RyMjU1IHJlc05hbWUpIC0+IChzaG9ydCByZXNJZCkiKX0sCisgICAgeyJGbGF0dGVuTW92aWVEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbW92aWVGbGF0dGVuRmxhZ3MsIEZTU3BlYyB0aGVGaWxlLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3MpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiRmxhdHRlbk1vdmllRGF0YVRvRGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9GbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1vdmllRmxhdHRlbkZsYWdzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3MpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiTW92aWVTZWFyY2hUZXh0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX01vdmllU2VhcmNoVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUHRyIHRleHQsIGxvbmcgc2l6ZSwgbG9uZyBzZWFyY2hGbGFncykgLT4gKFRyYWNrIHNlYXJjaFRyYWNrLCBUaW1lVmFsdWUgc2VhcmNoVGltZSwgbG9uZyBzZWFyY2hPZmZzZXQpIil9LAorICAgIHsiR2V0UG9zdGVyQm94IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldFBvc3RlckJveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3hSZWN0KSIpfSwKKyAgICB7IlNldFBvc3RlckJveCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRQb3N0ZXJCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm94UmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllU2VnbWVudERpc3BsYXlCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TW92aWVTdGF0dXMiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVTdGF0dXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRyYWNrIGZpcnN0UHJvYmxlbVRyYWNrKSIpfSwKKyAgICB7Ik5ld01vdmllQ29udHJvbGxlciIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9OZXdNb3ZpZUNvbnRyb2xsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgbW92aWVSZWN0LCBsb25nIHNvbWVGbGFncykgLT4gKE1vdmllQ29udHJvbGxlciBfcnYpIil9LAorICAgIHsiUHV0TW92aWVPblNjcmFwIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B1dE1vdmllT25TY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtb3ZpZVNjcmFwRmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNb3ZpZVBsYXlIaW50cyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVBsYXlIaW50cywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHRpbWUpIil9LAorICAgIHsiUVRNb3ZpZU5lZWRzVGltZVRhYmxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1FUTW92aWVOZWVkc1RpbWVUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBuZWVkc1RpbWVUYWJsZSkiKX0sCisgICAgeyJRVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1FUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIGRhdGFSZWYpIC0+IChsb25nIG9mZnNldCkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIE1vdmllT2JqX2dldHNldGxpc3QgTlVMTApAQCAtNzI4Niw2MSArNzI4Niw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlNb3ZpZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIE1vdmllIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIE1vdmllT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoTW92aWVPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTW92aWVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChNb3ZpZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBNb3ZpZU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBNb3ZpZV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RdC5Nb3ZpZSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKE1vdmllT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgTW92aWVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgTW92aWVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIE1vdmllT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBNb3ZpZU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlNb3ZpZU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlNb3ZpZU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlNb3ZpZU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JTW92aWVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JTW92aWVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlNb3ZpZU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1F0Lk1vdmllIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoTW92aWVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBNb3ZpZU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBNb3ZpZU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgTW92aWVPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIE1vdmllT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIE1vdmllT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIE1vdmllT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIE1vdmllT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBNb3ZpZU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBNb3ZpZU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIE1vdmllT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgTW92aWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzM1Myw0NyArNzM1Myw0NyBAQAogI2RlZmluZSBTR091dHB1dE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZTR091dHB1dF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZTR091dHB1dF9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgU0dPdXRwdXRPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlTR091dHB1dCBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFNHT3V0cHV0IG9iX2l0c2VsZjsKIH0gU0dPdXRwdXRPYmplY3Q7CiAKIFB5T2JqZWN0ICpTR091dHB1dE9ial9OZXcoU0dPdXRwdXQgaXRzZWxmKQogewotCVNHT3V0cHV0T2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBTR091dHB1dCBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKFNHT3V0cHV0T2JqZWN0LCAmU0dPdXRwdXRfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFNHT3V0cHV0T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBTR091dHB1dCBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKFNHT3V0cHV0T2JqZWN0LCAmU0dPdXRwdXRfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgU0dPdXRwdXRPYmpfQ29udmVydChQeU9iamVjdCAqdiwgU0dPdXRwdXQgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFTR091dHB1dE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJTR091dHB1dCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChTR091dHB1dE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIVNHT3V0cHV0T2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlNHT3V0cHV0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFNHT3V0cHV0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgU0dPdXRwdXRPYmpfZGVhbGxvYyhTR091dHB1dE9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBTR091dHB1dE9ial9tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFNHT3V0cHV0T2JqX2dldHNldGxpc3QgTlVMTApAQCAtNzQxMCw2MSArNzQxMCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlNHT3V0cHV0T2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlTR091dHB1dCBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFNHT3V0cHV0IGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoU0dPdXRwdXRPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgU0dPdXRwdXRPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChTR091dHB1dE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBTR091dHB1dE9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBTR091dHB1dF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RdC5TR091dHB1dCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFNHT3V0cHV0T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgU0dPdXRwdXRPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgU0dPdXRwdXRPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFNHT3V0cHV0T2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBTR091dHB1dE9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlTR091dHB1dE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlTR091dHB1dE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlTR091dHB1dE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JU0dPdXRwdXRPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JU0dPdXRwdXRPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlTR091dHB1dE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1F0LlNHT3V0cHV0IiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoU0dPdXRwdXRPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBTR091dHB1dE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBTR091dHB1dE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgU0dPdXRwdXRPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFNHT3V0cHV0T2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIFNHT3V0cHV0T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIFNHT3V0cHV0T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFNHT3V0cHV0T2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBTR091dHB1dE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBTR091dHB1dE9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFNHT3V0cHV0T2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBTR091dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzQ3MiwyMDUyNyArNzQ3MiwyMDUyNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0VudGVyTW92aWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBFbnRlck1vdmllcwotCVB5TWFjX1BSRUNIRUNLKEVudGVyTW92aWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbnRlck1vdmllcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEVudGVyTW92aWVzKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFbnRlck1vdmllcygpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0V4aXRNb3ZpZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRXhpdE1vdmllcwotCVB5TWFjX1BSRUNIRUNLKEV4aXRNb3ZpZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEV4aXRNb3ZpZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUV4aXRNb3ZpZXMoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEV4aXRNb3ZpZXMoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0TW92aWVzRXJyb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEdldE1vdmllc0Vycm9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVzRXJyb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllc0Vycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TW92aWVzRXJyb3IoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1vdmllc0Vycm9yKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2xlYXJNb3ZpZXNTdGlja3lFcnJvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDbGVhck1vdmllc1N0aWNreUVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soQ2xlYXJNb3ZpZXNTdGlja3lFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xlYXJNb3ZpZXNTdGlja3lFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2xlYXJNb3ZpZXNTdGlja3lFcnJvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xlYXJNb3ZpZXNTdGlja3lFcnJvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRNb3ZpZXNTdGlja3lFcnJvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgR2V0TW92aWVzU3RpY2t5RXJyb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZXNTdGlja3lFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVzU3RpY2t5RXJyb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZXNTdGlja3lFcnJvcigpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVzU3RpY2t5RXJyb3IoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFdhbGxDbG9ja1RpbWVCYXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRpbWVCYXNlIHdhbGxDbG9ja1RpbWVCYXNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVCYXNlIHdhbGxDbG9ja1RpbWVCYXNlOwogI2lmbmRlZiBRVEdldFdhbGxDbG9ja1RpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUR2V0V2FsbENsb2NrVGltZUJhc2UoJndhbGxDbG9ja1RpbWVCYXNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCB3YWxsQ2xvY2tUaW1lQmFzZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVEdldFdhbGxDbG9ja1RpbWVCYXNlKCZ3YWxsQ2xvY2tUaW1lQmFzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgd2FsbENsb2NrVGltZUJhc2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUSWRsZU1hbmFnZXJPcGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJZGxlTWFuYWdlciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIElkbGVNYW5hZ2VyIF9ydjsKICNpZm5kZWYgUVRJZGxlTWFuYWdlck9wZW4KLQlQeU1hY19QUkVDSEVDSyhRVElkbGVNYW5hZ2VyT3Blbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRJZGxlTWFuYWdlck9wZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUSWRsZU1hbmFnZXJPcGVuKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUSWRsZU1hbmFnZXJPcGVuKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ3JlYXRlTW92aWVDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVdpbmRvd1B0ciB0aGVXaW5kb3c7Ci0JUmVjdCBsb2NhbFJlY3Q7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVUludDMyIG9wdGlvbnM7Ci0JQ29udHJvbEhhbmRsZSByZXR1cm5lZENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIHRoZVdpbmRvdzsKKyAgICBSZWN0IGxvY2FsUmVjdDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBVSW50MzIgb3B0aW9uczsKKyAgICBDb250cm9sSGFuZGxlIHJldHVybmVkQ29udHJvbDsKICNpZm5kZWYgQ3JlYXRlTW92aWVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTW92aWVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVNb3ZpZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVNb3ZpZUNvbnRyb2wodGhlV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2FsUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXR1cm5lZENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmxvY2FsUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCByZXR1cm5lZENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlTW92aWVDb250cm9sKHRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2NhbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dXJuZWRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZsb2NhbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgcmV0dXJuZWRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EaXNwb3NlTWF0dGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSB0aGVNYXR0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHRoZU1hdHRlOwogI2lmbmRlZiBEaXNwb3NlTWF0dGUKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlTWF0dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VNYXR0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlTWF0dGUpKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlTWF0dGUodGhlTWF0dGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlTWF0dGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlTWF0dGUodGhlTWF0dGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdNb3ZpZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgX3J2OwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBOZXdNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3TW92aWUoZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdNb3ZpZShmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRHZXRUaW1lVW50aWxOZXh0VGFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGR1cmF0aW9uOwotCWxvbmcgc2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBkdXJhdGlvbjsKKyAgICBsb25nIHNjYWxlOwogI2lmbmRlZiBRVEdldFRpbWVVbnRpbE5leHRUYXNrCi0JUHlNYWNfUFJFQ0hFQ0soUVRHZXRUaW1lVW50aWxOZXh0VGFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRHZXRUaW1lVW50aWxOZXh0VGFzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUR2V0VGltZVVudGlsTmV4dFRhc2soJmR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVEdldFRpbWVVbnRpbE5leHRUYXNrKCZkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldERhdGFIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnQgX3J2OwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhSGFuZGxlclN1YlR5cGU7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50IF9ydjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YUhhbmRsZXJTdWJUeXBlOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIEdldERhdGFIYW5kbGVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhSGFuZGxlclN1YlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldERhdGFIYW5kbGVyKGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZXJTdWJUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFIYW5kbGVyU3ViVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGF0YUhhbmRsZXIoZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSGFuZGxlclN1YlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9QYXN0ZUhhbmRsZUludG9Nb3ZpZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgaDsKLQlPU1R5cGUgaGFuZGxlVHlwZTsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlsb25nIGZsYWdzOwotCUNvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBoOworICAgIE9TVHlwZSBoYW5kbGVUeXBlOworICAgIE1vdmllIHRoZU1vdmllOworICAgIGxvbmcgZmxhZ3M7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CiAjaWZuZGVmIFBhc3RlSGFuZGxlSW50b01vdmllCi0JUHlNYWNfUFJFQ0hFQ0soUGFzdGVIYW5kbGVJbnRvTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBhc3RlSGFuZGxlSW50b01vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaGFuZGxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnVzZXJDb21wKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFBhc3RlSGFuZGxlSW50b01vdmllKGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckNvbXApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaGFuZGxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnVzZXJDb21wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBhc3RlSGFuZGxlSW50b01vdmllKGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckNvbXApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlsb25nIGZsYWdzOwotCUNvbXBvbmVudCBpbXBvcnRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgbG9uZyBmbGFnczsKKyAgICBDb21wb25lbnQgaW1wb3J0ZXI7CiAjaWZuZGVmIEdldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmKGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltcG9ydGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgaW1wb3J0ZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmKGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltcG9ydGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgaW1wb3J0ZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0TUlNRVR5cGVJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWNoYXIqIG1pbWVTdHJpbmdTdGFydDsKLQlzaG9ydCBtaW1lU3RyaW5nTGVuZ3RoOwotCU9TVHlwZSBpbmZvU2VsZWN0b3I7Ci0Jdm9pZCAqIGluZm9EYXRhUHRyOwotCWxvbmcgaW5mb0RhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGNoYXIqIG1pbWVTdHJpbmdTdGFydDsKKyAgICBzaG9ydCBtaW1lU3RyaW5nTGVuZ3RoOworICAgIE9TVHlwZSBpbmZvU2VsZWN0b3I7CisgICAgdm9pZCAqIGluZm9EYXRhUHRyOworICAgIGxvbmcgaW5mb0RhdGFTaXplOwogI2lmbmRlZiBRVEdldE1JTUVUeXBlSW5mbwotCVB5TWFjX1BSRUNIRUNLKFFUR2V0TUlNRVR5cGVJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldE1JTUVUeXBlSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzaE8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW1lU3RyaW5nU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW1lU3RyaW5nTGVuZ3RoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvU2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVB0cikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVEdldE1JTUVUeXBlSW5mbyhtaW1lU3RyaW5nU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVTdHJpbmdMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9TZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2hPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWltZVN0cmluZ1N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWltZVN0cmluZ0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1NlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb0RhdGFQdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRHZXRNSU1FVHlwZUluZm8obWltZVN0cmluZ1N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lU3RyaW5nTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb0RhdGFTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RyYWNrVGltZVRvTWVkaWFUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OwotCVRpbWVWYWx1ZSB2YWx1ZTsKLQlUcmFjayB0aGVUcmFjazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKKyAgICBUaW1lVmFsdWUgdmFsdWU7CisgICAgVHJhY2sgdGhlVHJhY2s7CiAjaWZuZGVmIFRyYWNrVGltZVRvTWVkaWFUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soVHJhY2tUaW1lVG9NZWRpYVRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYWNrVGltZVRvTWVkaWFUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRoZVRyYWNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHJhY2tUaW1lVG9NZWRpYVRpbWUodmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHJhY2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRoZVRyYWNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHJhY2tUaW1lVG9NZWRpYVRpbWUodmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHJhY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld1VzZXJEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVzZXJEYXRhIHRoZVVzZXJEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVzZXJEYXRhIHRoZVVzZXJEYXRhOwogI2lmbmRlZiBOZXdVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKE5ld1VzZXJEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdVc2VyRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld1VzZXJEYXRhKCZ0aGVVc2VyRGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX05ldywgdGhlVXNlckRhdGEpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3VXNlckRhdGEoJnRoZVVzZXJEYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB0aGVVc2VyRGF0YSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3VXNlckRhdGFGcm9tSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBoOwotCVVzZXJEYXRhIHRoZVVzZXJEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBoOworICAgIFVzZXJEYXRhIHRoZVVzZXJEYXRhOwogI2lmbmRlZiBOZXdVc2VyRGF0YUZyb21IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhOZXdVc2VyRGF0YUZyb21IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld1VzZXJEYXRhRnJvbUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdVc2VyRGF0YUZyb21IYW5kbGUoaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVVc2VyRGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX05ldywgdGhlVXNlckRhdGEpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld1VzZXJEYXRhRnJvbUhhbmRsZShoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVVzZXJEYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB0aGVVc2VyRGF0YSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ3JlYXRlTW92aWVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmaWxlU3BlYzsKLQlPU1R5cGUgY3JlYXRvcjsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOwotCXNob3J0IHJlc1JlZk51bTsKLQlNb3ZpZSBuZXdtb3ZpZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZmlsZVNwZWM7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgTW92aWUgbmV3bW92aWU7CiAjaWZuZGVmIENyZWF0ZU1vdmllRmlsZQotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZU1vdmllRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTW92aWVGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZpbGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlTW92aWVGaWxlKCZmaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAmbmV3bW92aWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgbmV3bW92aWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlTW92aWVGaWxlKCZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3bW92aWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgbmV3bW92aWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X09wZW5Nb3ZpZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZpbGVTcGVjOwotCXNob3J0IHJlc1JlZk51bTsKLQlTSW50OCBwZXJtaXNzaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmaWxlU3BlYzsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgU0ludDggcGVybWlzc2lvbjsKICNpZm5kZWYgT3Blbk1vdmllRmlsZQotCVB5TWFjX1BSRUNIRUNLKE9wZW5Nb3ZpZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5Nb3ZpZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9wZW5Nb3ZpZUZpbGUoJmZpbGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT3Blbk1vdmllRmlsZSgmZmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0Nsb3NlTW92aWVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlc1JlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZXNSZWZOdW07CiAjaWZuZGVmIENsb3NlTW92aWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VNb3ZpZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlTW92aWVGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENsb3NlTW92aWVGaWxlKHJlc1JlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2xvc2VNb3ZpZUZpbGUocmVzUmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EZWxldGVNb3ZpZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZpbGVTcGVjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmaWxlU3BlYzsKICNpZm5kZWYgRGVsZXRlTW92aWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTW92aWVGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVNb3ZpZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEZWxldGVNb3ZpZUZpbGUoJmZpbGVTcGVjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZpbGVTcGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERlbGV0ZU1vdmllRmlsZSgmZmlsZVNwZWMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllRnJvbUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgdGhlTW92aWU7Ci0Jc2hvcnQgcmVzUmVmTnVtOwotCXNob3J0IHJlc0lkOwotCXNob3J0IG5ld01vdmllRmxhZ3M7Ci0JQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgc2hvcnQgcmVzSWQ7CisgICAgc2hvcnQgbmV3TW92aWVGbGFnczsKKyAgICBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOwogI2lmbmRlZiBOZXdNb3ZpZUZyb21GaWxlCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbUZpbGUoJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZ1B0cikwLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmhiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc0lkLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld01vdmllRnJvbUZpbGUoJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZ1B0cikwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdNb3ZpZUZyb21IYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgdGhlTW92aWU7Ci0JSGFuZGxlIGg7Ci0Jc2hvcnQgbmV3TW92aWVGbGFnczsKLQlCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIHRoZU1vdmllOworICAgIEhhbmRsZSBoOworICAgIHNob3J0IG5ld01vdmllRmxhZ3M7CisgICAgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKICNpZm5kZWYgTmV3TW92aWVGcm9tSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdNb3ZpZUZyb21IYW5kbGUoJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2hhbmdlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdNb3ZpZUZyb21IYW5kbGUoJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tRGF0YUZvcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgdGhlTW92aWU7Ci0Jc2hvcnQgZlJlZk51bTsKLQlsb25nIGZpbGVPZmZzZXQ7Ci0Jc2hvcnQgbmV3TW92aWVGbGFnczsKLQlCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIHRoZU1vdmllOworICAgIHNob3J0IGZSZWZOdW07CisgICAgbG9uZyBmaWxlT2Zmc2V0OworICAgIHNob3J0IG5ld01vdmllRmxhZ3M7CisgICAgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKICNpZm5kZWYgTmV3TW92aWVGcm9tRGF0YUZvcmsKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21EYXRhRm9yayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tRGF0YUZvcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZmaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdNb3ZpZUZyb21EYXRhRm9yaygmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld01vdmllRnJvbURhdGFGb3JrKCZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllRnJvbURhdGFGb3JrNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgdGhlTW92aWU7Ci0JbG9uZyBmUmVmTnVtOwotCXdpZGUgZmlsZU9mZnNldDsKLQlzaG9ydCBuZXdNb3ZpZUZsYWdzOwotCUJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgbG9uZyBmUmVmTnVtOworICAgIHdpZGUgZmlsZU9mZnNldDsKKyAgICBzaG9ydCBuZXdNb3ZpZUZsYWdzOworICAgIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CiAjaWZuZGVmIE5ld01vdmllRnJvbURhdGFGb3JrNjQKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21EYXRhRm9yazY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21EYXRhRm9yazY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbURhdGFGb3JrNjQoJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2hhbmdlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3TW92aWVGcm9tRGF0YUZvcms2NCgmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdNb3ZpZUZyb21EYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1vdmllIG07Ci0Jc2hvcnQgZmxhZ3M7Ci0Jc2hvcnQgaWQ7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGR0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTW92aWUgbTsKKyAgICBzaG9ydCBmbGFnczsKKyAgICBzaG9ydCBpZDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZHRhUmVmVHlwZTsKICNpZm5kZWYgTmV3TW92aWVGcm9tRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbURhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZHRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdNb3ZpZUZyb21EYXRhUmVmKCZtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0YVJlZlR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBtLAotCSAgICAgICAgICAgICAgICAgICAgIGlkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld01vdmllRnJvbURhdGFSZWYoJm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRhUmVmVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgdGhlTW92aWU7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jd2lkZSBmaWxlT2Zmc2V0OwotCXNob3J0IG5ld01vdmllRmxhZ3M7Ci0JQm9vbGVhbiBkYXRhUmVmV2FzQ2F0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgd2lkZSBmaWxlT2Zmc2V0OworICAgIHNob3J0IG5ld01vdmllRmxhZ3M7CisgICAgQm9vbGVhbiBkYXRhUmVmV2FzQ2F0YVJlZlR5cGU7CiAjaWZuZGVmIE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21TdG9yYWdlT2Zmc2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21TdG9yYWdlT2Zmc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZmaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdNb3ZpZUZyb21TdG9yYWdlT2Zmc2V0KCZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2F0YVJlZlR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2F0YVJlZlR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdNb3ZpZUZyb21TdG9yYWdlT2Zmc2V0KCZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2F0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2F0YVJlZlR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgdGhlTW92aWU7Ci0JSGFuZGxlIGg7Ci0Jc2hvcnQgbmV3TW92aWVGbGFnczsKLQlCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBIYW5kbGUgaDsKKyAgICBzaG9ydCBuZXdNb3ZpZUZsYWdzOworICAgIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlKCZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2hhbmdlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZSgmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1JlbW92ZU1vdmllUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVzUmVmTnVtOwotCXNob3J0IHJlc0lkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlc1JlZk51bTsKKyAgICBzaG9ydCByZXNJZDsKICNpZm5kZWYgUmVtb3ZlTW92aWVSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZU1vdmllUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZU1vdmllUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlTW92aWVSZXNvdXJjZShyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZU1vdmllUmVzb3VyY2UocmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DcmVhdGVNb3ZpZVN0b3JhZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCWxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7Ci0JRGF0YUhhbmRsZXIgb3V0RGF0YUhhbmRsZXI7Ci0JTW92aWUgbmV3bW92aWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7CisgICAgRGF0YUhhbmRsZXIgb3V0RGF0YUhhbmRsZXI7CisgICAgTW92aWUgbmV3bW92aWU7CiAjaWZuZGVmIENyZWF0ZU1vdmllU3RvcmFnZQotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZU1vdmllU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTW92aWVTdG9yYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZU1vdmllU3RvcmFnZShkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGF0YUhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3bW92aWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBvdXREYXRhSGFuZGxlciwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIG5ld21vdmllKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVNb3ZpZVN0b3JhZ2UoZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1vdmllRmlsZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERhdGFIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld21vdmllKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgb3V0RGF0YUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBuZXdtb3ZpZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfT3Blbk1vdmllU3RvcmFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JbG9uZyBmbGFnczsKLQlEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgbG9uZyBmbGFnczsKKyAgICBEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlcjsKICNpZm5kZWYgT3Blbk1vdmllU3RvcmFnZQotCVB5TWFjX1BSRUNIRUNLKE9wZW5Nb3ZpZVN0b3JhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5Nb3ZpZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT3Blbk1vdmllU3RvcmFnZShkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXREYXRhSGFuZGxlcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBvdXREYXRhSGFuZGxlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT3Blbk1vdmllU3RvcmFnZShkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXREYXRhSGFuZGxlcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBvdXREYXRhSGFuZGxlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2xvc2VNb3ZpZVN0b3JhZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIENsb3NlTW92aWVTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VNb3ZpZVN0b3JhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlTW92aWVTdG9yYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xvc2VNb3ZpZVN0b3JhZ2UoZGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2xvc2VNb3ZpZVN0b3JhZ2UoZGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RlbGV0ZU1vdmllU3RvcmFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBEZWxldGVNb3ZpZVN0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhEZWxldGVNb3ZpZVN0b3JhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKERlbGV0ZU1vdmllU3RvcmFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEZWxldGVNb3ZpZVN0b3JhZ2UoZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEZWxldGVNb3ZpZVN0b3JhZ2UoZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DcmVhdGVTaG9ydGN1dE1vdmllRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZmlsZVNwZWM7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7Ci0JbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKLQlIYW5kbGUgdGFyZ2V0RGF0YVJlZjsKLQlPU1R5cGUgdGFyZ2V0RGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZpbGVTcGVjOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7CisgICAgSGFuZGxlIHRhcmdldERhdGFSZWY7CisgICAgT1NUeXBlIHRhcmdldERhdGFSZWZUeXBlOwogI2lmbmRlZiBDcmVhdGVTaG9ydGN1dE1vdmllRmlsZQotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVTaG9ydGN1dE1vdmllRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0YXJnZXREYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0YXJnZXREYXRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTaG9ydGN1dE1vdmllRmlsZSgmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERhdGFSZWZUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0YXJnZXREYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0YXJnZXREYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTaG9ydGN1dE1vdmllRmlsZSgmZmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERhdGFSZWZUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DYW5RdWlja1RpbWVPcGVuRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZmlsZVNwZWM7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCU9TVHlwZSBmaWxlTmFtZUV4dGVuc2lvbjsKLQlCb29sZWFuIG91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlcjsKLQlCb29sZWFuIG91dENhbk9wZW5Bc01vdmllOwotCUJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcjsKLQlVSW50MzIgaW5GbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZmlsZVNwZWM7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlTmFtZUV4dGVuc2lvbjsKKyAgICBCb29sZWFuIG91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlcjsKKyAgICBCb29sZWFuIG91dENhbk9wZW5Bc01vdmllOworICAgIEJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcjsKKyAgICBVSW50MzIgaW5GbGFnczsKICNpZm5kZWYgQ2FuUXVpY2tUaW1lT3BlbkZpbGUKLQlQeU1hY19QUkVDSEVDSyhDYW5RdWlja1RpbWVPcGVuRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FuUXVpY2tUaW1lT3BlbkZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZpbGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZU5hbWVFeHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENhblF1aWNrVGltZU9wZW5GaWxlKCZmaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lRXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q2FuT3BlbkFzTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRDYW5PcGVuQXNNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlTmFtZUV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2FuUXVpY2tUaW1lT3BlbkZpbGUoJmZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVFeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuQXNNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dENhbk9wZW5Bc01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NhblF1aWNrVGltZU9wZW5EYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlCb29sZWFuIG91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlcjsKLQlCb29sZWFuIG91dENhbk9wZW5Bc01vdmllOwotCUJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcjsKLQlVSW50MzIgaW5GbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgQm9vbGVhbiBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXI7CisgICAgQm9vbGVhbiBvdXRDYW5PcGVuQXNNb3ZpZTsKKyAgICBCb29sZWFuIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXI7CisgICAgVUludDMyIGluRmxhZ3M7CiAjaWZuZGVmIENhblF1aWNrVGltZU9wZW5EYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKENhblF1aWNrVGltZU9wZW5EYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYoZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuQXNNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLAotCSAgICAgICAgICAgICAgICAgICAgIG91dENhbk9wZW5Bc01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYoZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuQXNNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dENhbk9wZW5Bc01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllRnJvbVNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7Ci0JbG9uZyBuZXdNb3ZpZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CisgICAgbG9uZyBuZXdNb3ZpZUZsYWdzOwogI2lmbmRlZiBOZXdNb3ZpZUZyb21TY3JhcAotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbVNjcmFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21TY3JhcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdNb3ZpZUZyb21TY3JhcChuZXdNb3ZpZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdNb3ZpZUZyb21TY3JhcChuZXdNb3ZpZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVE5ld0FsaWFzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmc3M7Ci0JQWxpYXNIYW5kbGUgYWxpYXM7Ci0JQm9vbGVhbiBtaW5pbWFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmc3M7CisgICAgQWxpYXNIYW5kbGUgYWxpYXM7CisgICAgQm9vbGVhbiBtaW5pbWFsOwogI2lmbmRlZiBRVE5ld0FsaWFzCi0JUHlNYWNfUFJFQ0hFQ0soUVROZXdBbGlhcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVROZXdBbGlhcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5pbWFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUTmV3QWxpYXMoJmZzcywKLQkgICAgICAgICAgICAgICAgICAmYWxpYXMsCi0JICAgICAgICAgICAgICAgICAgbWluaW1hbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGFsaWFzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5pbWFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUTmV3QWxpYXMoJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAmYWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgbWluaW1hbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGFsaWFzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9FbmRGdWxsU2NyZWVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVB0ciBmdWxsU3RhdGU7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQdHIgZnVsbFN0YXRlOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIEVuZEZ1bGxTY3JlZW4KLQlQeU1hY19QUkVDSEVDSyhFbmRGdWxsU2NyZWVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbmRGdWxsU2NyZWVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEVuZEZ1bGxTY3JlZW4oZnVsbFN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFbmRGdWxsU2NyZWVuKGZ1bGxTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JSGFuZGxlIGV4dGVuc2lvbjsKLQlPU1R5cGUgaWRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBIYW5kbGUgZXh0ZW5zaW9uOworICAgIE9TVHlwZSBpZFR5cGU7CiAjaWZuZGVmIEFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhBZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uKGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlIYW5kbGUgZXh0ZW5zaW9uOwotCU9TVHlwZSBpZFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIEhhbmRsZSBleHRlbnNpb247CisgICAgT1NUeXBlIGlkVHlwZTsKICNpZm5kZWYgR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEdldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JT1NUeXBlIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgT1NUeXBlIGlkVHlwZTsKICNpZm5kZWYgUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZVNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZVNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZVNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlkVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uKGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlFdmVudFJlY29yZCBwRXZlbnQ7Ci0JUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBFdmVudFJlY29yZCBwRXZlbnQ7CisgICAgUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZzsKICNpZm5kZWYgUVRJc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRJc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVkRGlhbG9nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50KCZwRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWREaWFsb2cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmcEV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaWFsb2cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRJc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRXZlbnQoJnBFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZERpYWxvZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZwRXZlbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVFUUGFyYW1ldGVyRGlhbG9nIGNyZWF0ZWREaWFsb2c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZzsKICNpZm5kZWYgUVREaXNtaXNzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVREaXNtaXNzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVkRGlhbG9nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nKGNyZWF0ZWREaWFsb2cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpYWxvZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZyhjcmVhdGVkRGlhbG9nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZzsKLQlsb25nIGFjdGlvbjsKLQl2b2lkICogcGFyYW1zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFFUUGFyYW1ldGVyRGlhbG9nIGNyZWF0ZWREaWFsb2c7CisgICAgbG9uZyBhY3Rpb247CisgICAgdm9pZCAqIHBhcmFtczsKICNpZm5kZWYgUVRTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0RvQWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soUVRTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0RvQWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaWFsb2csCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0RvQWN0aW9uKGNyZWF0ZWREaWFsb2csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVkRGlhbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbihjcmVhdGVkRGlhbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFJlZ2lzdGVyQWNjZXNzS2V5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjI1NSBhY2Nlc3NLZXlUeXBlOwotCWxvbmcgZmxhZ3M7Ci0JSGFuZGxlIGFjY2Vzc0tleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHIyNTUgYWNjZXNzS2V5VHlwZTsKKyAgICBsb25nIGZsYWdzOworICAgIEhhbmRsZSBhY2Nlc3NLZXk7CiAjaWZuZGVmIFFUUmVnaXN0ZXJBY2Nlc3NLZXkKLQlQeU1hY19QUkVDSEVDSyhRVFJlZ2lzdGVyQWNjZXNzS2V5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFJlZ2lzdGVyQWNjZXNzS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBhY2Nlc3NLZXlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYWNjZXNzS2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUUmVnaXN0ZXJBY2Nlc3NLZXkoYWNjZXNzS2V5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NLZXkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBhY2Nlc3NLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYWNjZXNzS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUUmVnaXN0ZXJBY2Nlc3NLZXkoYWNjZXNzS2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NLZXkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVW5yZWdpc3RlckFjY2Vzc0tleShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHIyNTUgYWNjZXNzS2V5VHlwZTsKLQlsb25nIGZsYWdzOwotCUhhbmRsZSBhY2Nlc3NLZXk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU3RyMjU1IGFjY2Vzc0tleVR5cGU7CisgICAgbG9uZyBmbGFnczsKKyAgICBIYW5kbGUgYWNjZXNzS2V5OwogI2lmbmRlZiBRVFVucmVnaXN0ZXJBY2Nlc3NLZXkKLQlQeU1hY19QUkVDSEVDSyhRVFVucmVnaXN0ZXJBY2Nlc3NLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVW5yZWdpc3RlckFjY2Vzc0tleSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgYWNjZXNzS2V5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmFjY2Vzc0tleSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVFVucmVnaXN0ZXJBY2Nlc3NLZXkoYWNjZXNzS2V5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzS2V5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgYWNjZXNzS2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmFjY2Vzc0tleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVFVucmVnaXN0ZXJBY2Nlc3NLZXkoYWNjZXNzS2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzS2V5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgaW5SZXN0cmljdGlvbkNsYXNzOwotCVVJbnQzMiBvdXRSZXN0cmljdGlvbklEczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgaW5SZXN0cmljdGlvbkNsYXNzOworICAgIFVJbnQzMiBvdXRSZXN0cmljdGlvbklEczsKICNpZm5kZWYgUVRHZXRTdXBwb3J0ZWRSZXN0cmljdGlvbnMKLQlQeU1hY19QUkVDSEVDSyhRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRHZXRTdXBwb3J0ZWRSZXN0cmljdGlvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblJlc3RyaWN0aW9uQ2xhc3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRHZXRTdXBwb3J0ZWRSZXN0cmljdGlvbnMoaW5SZXN0cmljdGlvbkNsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVzdHJpY3Rpb25JRHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFJlc3RyaWN0aW9uSURzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUmVzdHJpY3Rpb25DbGFzcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyhpblJlc3RyaWN0aW9uQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN0cmljdGlvbklEcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdHJpY3Rpb25JRHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVGV4dFRvTmF0aXZlVGV4dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgdGhlVGV4dDsKLQlsb25nIGVuY29kaW5nOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIHRoZVRleHQ7CisgICAgbG9uZyBlbmNvZGluZzsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBRVFRleHRUb05hdGl2ZVRleHQKLQlQeU1hY19QUkVDSEVDSyhRVFRleHRUb05hdGl2ZVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVGV4dFRvTmF0aXZlVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVFRleHRUb05hdGl2ZVRleHQodGhlVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUVGV4dFRvTmF0aXZlVGV4dCh0aGVUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOwogI2lmbmRlZiBWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzCi0JUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljcyhtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZpZGVvTWVkaWFSZXNldFN0YXRpc3RpY3MobWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZpZGVvTWVkaWFHZXRTdGF0aXN0aWNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIFZpZGVvTWVkaWFHZXRTdGF0aXN0aWNzCi0JUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFZpZGVvTWVkaWFHZXRTdGF0aXN0aWNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWaWRlb01lZGlhR2V0U3RhdGlzdGljcyhtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZpZGVvTWVkaWFHZXRTdGF0aXN0aWNzKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WaWRlb01lZGlhR2V0U3RhbGxDb3VudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JdW5zaWduZWQgbG9uZyBzdGFsbHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHVuc2lnbmVkIGxvbmcgc3RhbGxzOwogI2lmbmRlZiBWaWRlb01lZGlhR2V0U3RhbGxDb3VudAotCVB5TWFjX1BSRUNIRUNLKFZpZGVvTWVkaWFHZXRTdGFsbENvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhR2V0U3RhbGxDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVmlkZW9NZWRpYUdldFN0YWxsQ291bnQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YWxscyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc3RhbGxzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYUdldFN0YWxsQ291bnQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YWxscyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbGxzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvZGVjVHlwZSBjVHlwZTsKLQlPU1R5cGUgcGFyYW1ldGVySUQ7Ci0JbG9uZyBwYXJhbWV0ZXJDaGFuZ2VTZWVkOwotCXZvaWQgKiBkYXRhUHRyOwotCWxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvZGVjVHlwZSBjVHlwZTsKKyAgICBPU1R5cGUgcGFyYW1ldGVySUQ7CisgICAgbG9uZyBwYXJhbWV0ZXJDaGFuZ2VTZWVkOworICAgIHZvaWQgKiBkYXRhUHRyOworICAgIGxvbmcgZGF0YVNpemU7CiAjaWZuZGVmIFZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlcgotCVB5TWFjX1BSRUNIRUNLKFZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcGFyYW1ldGVySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJhbWV0ZXJDaGFuZ2VTZWVkLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckNoYW5nZVNlZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsc2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBhcmFtZXRlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1ldGVyQ2hhbmdlU2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlcihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJDaGFuZ2VTZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlDb2RlY1R5cGUgY1R5cGU7Ci0JT1NUeXBlIHBhcmFtZXRlcklEOwotCUhhbmRsZSBvdXRQYXJhbWV0ZXJEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBDb2RlY1R5cGUgY1R5cGU7CisgICAgT1NUeXBlIHBhcmFtZXRlcklEOworICAgIEhhbmRsZSBvdXRQYXJhbWV0ZXJEYXRhOwogI2lmbmRlZiBWaWRlb01lZGlhR2V0Q29kZWNQYXJhbWV0ZXIKLQlQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhR2V0Q29kZWNQYXJhbWV0ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcGFyYW1ldGVySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0UGFyYW1ldGVyRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlcihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQYXJhbWV0ZXJEYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcGFyYW1ldGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0UGFyYW1ldGVyRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlcihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQYXJhbWV0ZXJEYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFBZGRUZXh0U2FtcGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlQdHIgdGV4dDsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0Jc2hvcnQgZm9udE51bWJlcjsKLQlzaG9ydCBmb250U2l6ZTsKLQlTdHlsZSB0ZXh0RmFjZTsKLQlSR0JDb2xvciB0ZXh0Q29sb3I7Ci0JUkdCQ29sb3IgYmFja0NvbG9yOwotCXNob3J0IHRleHRKdXN0aWZpY2F0aW9uOwotCVJlY3QgdGV4dEJveDsKLQlsb25nIGRpc3BsYXlGbGFnczsKLQlUaW1lVmFsdWUgc2Nyb2xsRGVsYXk7Ci0Jc2hvcnQgaGlsaXRlU3RhcnQ7Ci0Jc2hvcnQgaGlsaXRlRW5kOwotCVJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQlUaW1lVmFsdWUgc2FtcGxlVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUHRyIHRleHQ7CisgICAgdW5zaWduZWQgbG9uZyBzaXplOworICAgIHNob3J0IGZvbnROdW1iZXI7CisgICAgc2hvcnQgZm9udFNpemU7CisgICAgU3R5bGUgdGV4dEZhY2U7CisgICAgUkdCQ29sb3IgdGV4dENvbG9yOworICAgIFJHQkNvbG9yIGJhY2tDb2xvcjsKKyAgICBzaG9ydCB0ZXh0SnVzdGlmaWNhdGlvbjsKKyAgICBSZWN0IHRleHRCb3g7CisgICAgbG9uZyBkaXNwbGF5RmxhZ3M7CisgICAgVGltZVZhbHVlIHNjcm9sbERlbGF5OworICAgIHNob3J0IGhpbGl0ZVN0YXJ0OworICAgIHNob3J0IGhpbGl0ZUVuZDsKKyAgICBSR0JDb2xvciByZ2JIaWxpdGVDb2xvcjsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CiAjaWZuZGVmIFRleHRNZWRpYUFkZFRleHRTYW1wbGUKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFBZGRUZXh0U2FtcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFBZGRUZXh0U2FtcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xoaGJobGxoaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9udE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvbnRTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEZhY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SnVzdGlmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbERlbGF5LAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYUFkZFRleHRTYW1wbGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnROdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGYWNlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWNrQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SnVzdGlmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0Qm94LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsRGVsYXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JIaWxpdGVDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmdGV4dENvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmJhY2tDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0ZXh0Qm94LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnJnYkhpbGl0ZUNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xoaGJobGxoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbERlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYUFkZFRleHRTYW1wbGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWNrQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0Qm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JIaWxpdGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmdGV4dENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmJhY2tDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0ZXh0Qm94LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnJnYkhpbGl0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYUFkZFRFU2FtcGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlURUhhbmRsZSBoVEU7Ci0JUkdCQ29sb3IgYmFja0NvbG9yOwotCXNob3J0IHRleHRKdXN0aWZpY2F0aW9uOwotCVJlY3QgdGV4dEJveDsKLQlsb25nIGRpc3BsYXlGbGFnczsKLQlUaW1lVmFsdWUgc2Nyb2xsRGVsYXk7Ci0Jc2hvcnQgaGlsaXRlU3RhcnQ7Ci0Jc2hvcnQgaGlsaXRlRW5kOwotCVJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQlUaW1lVmFsdWUgc2FtcGxlVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVEVIYW5kbGUgaFRFOworICAgIFJHQkNvbG9yIGJhY2tDb2xvcjsKKyAgICBzaG9ydCB0ZXh0SnVzdGlmaWNhdGlvbjsKKyAgICBSZWN0IHRleHRCb3g7CisgICAgbG9uZyBkaXNwbGF5RmxhZ3M7CisgICAgVGltZVZhbHVlIHNjcm9sbERlbGF5OworICAgIHNob3J0IGhpbGl0ZVN0YXJ0OworICAgIHNob3J0IGhpbGl0ZUVuZDsKKyAgICBSR0JDb2xvciByZ2JIaWxpdGVDb2xvcjsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CiAjaWZuZGVmIFRleHRNZWRpYUFkZFRFU2FtcGxlCi0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhQWRkVEVTYW1wbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUFkZFRFU2FtcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobGxoaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoVEUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SnVzdGlmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbERlbGF5LAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYUFkZFRFU2FtcGxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhURSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFja0NvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0Qm94LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEZWxheSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVFbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZiYWNrQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGV4dEJveCwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZyZ2JIaWxpdGVDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxsaGhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaFRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dEp1c3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwbGF5RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFBZGRURVNhbXBsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhY2tDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dEJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JIaWxpdGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmYmFja0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRleHRCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBoaWxpdGVTdGFydDsKLQlzaG9ydCBoaWxpdGVFbmQ7Ci0JUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3I7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBoaWxpdGVTdGFydDsKKyAgICBzaG9ydCBoaWxpdGVFbmQ7CisgICAgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3I7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOwogI2lmbmRlZiBUZXh0TWVkaWFBZGRIaWxpdGVTYW1wbGUKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFBZGRIaWxpdGVTYW1wbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFBZGRIaWxpdGVTYW1wbGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JIaWxpdGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnJnYkhpbGl0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYURyYXdSYXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUdXb3JsZFB0ciBndzsKLQlHREhhbmRsZSBnZDsKLQl2b2lkICogZGF0YTsKLQlsb25nIGRhdGFTaXplOwotCVRleHREZXNjcmlwdGlvbkhhbmRsZSB0ZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEdXb3JsZFB0ciBndzsKKyAgICBHREhhbmRsZSBnZDsKKyAgICB2b2lkICogZGF0YTsKKyAgICBsb25nIGRhdGFTaXplOworICAgIFRleHREZXNjcmlwdGlvbkhhbmRsZSB0ZGg7CiAjaWZuZGVmIFRleHRNZWRpYURyYXdSYXcKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFEcmF3UmF3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFEcmF3UmF3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJnNsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZndywKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0TWVkaWFEcmF3UmF3KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgZ3csCi0JICAgICAgICAgICAgICAgICAgICAgICBnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRkaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mc2xPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfQ29udmVydCwgJmd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYURyYXdSYXcobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKLQlsb25nIHByb3BlcnR5VHlwZTsKLQl2b2lkICogZGF0YTsKLQlsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgYXRNZWRpYVRpbWU7CisgICAgbG9uZyBwcm9wZXJ0eVR5cGU7CisgICAgdm9pZCAqIGRhdGE7CisgICAgbG9uZyBkYXRhU2l6ZTsKICNpZm5kZWYgVGV4dE1lZGlhU2V0VGV4dFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhU2V0VGV4dFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdE1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYVNldFRleHRQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRNZWRpYVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXRNZWRpYVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFSYXdTZXR1cChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JR1dvcmxkUHRyIGd3OwotCUdESGFuZGxlIGdkOwotCXZvaWQgKiBkYXRhOwotCWxvbmcgZGF0YVNpemU7Ci0JVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaDsKLQlUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEdXb3JsZFB0ciBndzsKKyAgICBHREhhbmRsZSBnZDsKKyAgICB2b2lkICogZGF0YTsKKyAgICBsb25nIGRhdGFTaXplOworICAgIFRleHREZXNjcmlwdGlvbkhhbmRsZSB0ZGg7CisgICAgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uOwogI2lmbmRlZiBUZXh0TWVkaWFSYXdTZXR1cAotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVJhd1NldHVwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFSYXdTZXR1cCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZzbE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfQ29udmVydCwgJmd3LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhUmF3U2V0dXAobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZ3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgZ2QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICB0ZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJnNsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFSYXdTZXR1cChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhUmF3SWRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JR1dvcmxkUHRyIGd3OwotCUdESGFuZGxlIGdkOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOwotCWxvbmcgZmxhZ3NJbjsKLQlsb25nIGZsYWdzT3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBHV29ybGRQdHIgZ3c7CisgICAgR0RIYW5kbGUgZ2Q7CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgbG9uZyBmbGFnc0luOworICAgIGxvbmcgZmxhZ3NPdXQ7CiAjaWZuZGVmIFRleHRNZWRpYVJhd0lkbGUKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFSYXdJZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFSYXdJZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3csCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NJbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYVJhd0lkbGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICBndywKLQkgICAgICAgICAgICAgICAgICAgICAgIGdkLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzSW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NPdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzT3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfQ29udmVydCwgJmd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzSW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFSYXdJZGxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzT3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc091dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlUaW1lVmFsdWUgYXRNZWRpYVRpbWU7Ci0JbG9uZyBwcm9wZXJ0eVR5cGU7Ci0Jdm9pZCAqIGRhdGE7Ci0JbG9uZyBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZVZhbHVlIGF0TWVkaWFUaW1lOworICAgIGxvbmcgcHJvcGVydHlUeXBlOworICAgIHZvaWQgKiBkYXRhOworICAgIGxvbmcgZGF0YVNpemU7CiAjaWZuZGVmIFRleHRNZWRpYUdldFRleHRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUdldFRleHRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXRNZWRpYVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsc2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdE1lZGlhVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhRmluZE5leHRUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlQdHIgdGV4dDsKLQlsb25nIHNpemU7Ci0Jc2hvcnQgZmluZEZsYWdzOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGZvdW5kVGltZTsKLQlUaW1lVmFsdWUgZm91bmREdXJhdGlvbjsKLQlsb25nIG9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUHRyIHRleHQ7CisgICAgbG9uZyBzaXplOworICAgIHNob3J0IGZpbmRGbGFnczsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBmb3VuZFRpbWU7CisgICAgVGltZVZhbHVlIGZvdW5kRHVyYXRpb247CisgICAgbG9uZyBvZmZzZXQ7CiAjaWZuZGVmIFRleHRNZWRpYUZpbmROZXh0VGV4dAotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUZpbmROZXh0VGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhRmluZE5leHRUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmaW5kRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0TWVkaWFGaW5kTmV4dFRleHQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm91bmRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm91bmREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3VuZFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgZm91bmREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaW5kRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFGaW5kTmV4dFRleHQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm91bmRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm91bmREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYUhpbGl0ZVRleHRTYW1wbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOwotCXNob3J0IGhpbGl0ZVN0YXJ0OwotCXNob3J0IGhpbGl0ZUVuZDsKLQlSR0JDb2xvciByZ2JIaWxpdGVDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgc2hvcnQgaGlsaXRlU3RhcnQ7CisgICAgc2hvcnQgaGlsaXRlRW5kOworICAgIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOwogI2lmbmRlZiBUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlCi0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlRW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JIaWxpdGVDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnJnYkhpbGl0ZUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlRW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JIaWxpdGVDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnJnYkhpbGl0ZUNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFTZXRUZXh0U2FtcGxlRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jdm9pZCAqIGRhdGE7Ci0JT1NUeXBlIGRhdGFUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogZGF0YTsKKyAgICBPU1R5cGUgZGF0YVR5cGU7CiAjaWZuZGVmIFRleHRNZWRpYVNldFRleHRTYW1wbGVEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVNldFRleHRTYW1wbGVEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc08mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYVNldFRleHRTYW1wbGVEYXRhKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYVNldFRleHRTYW1wbGVEYXRhKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhU2V0UHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IHNwcml0ZUluZGV4OwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBwcm9wZXJ0eVZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBzcHJpdGVJbmRleDsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogcHJvcGVydHlWYWx1ZTsKICNpZm5kZWYgU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU2V0UHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU2V0UHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZobHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhU2V0UHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYVNldFByb3BlcnR5KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUdldFByb3BlcnR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBzcHJpdGVJbmRleDsKLQlsb25nIHByb3BlcnR5VHlwZTsKLQl2b2lkICogcHJvcGVydHlWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgc3ByaXRlSW5kZXg7CisgICAgbG9uZyBwcm9wZXJ0eVR5cGU7CisgICAgdm9pZCAqIHByb3BlcnR5VmFsdWU7CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0UHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldFByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUdldFByb3BlcnR5KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFIaXRUZXN0U3ByaXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmbGFnczsKLQlQb2ludCBsb2M7Ci0Jc2hvcnQgc3ByaXRlSGl0SW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhZ3M7CisgICAgUG9pbnQgbG9jOworICAgIHNob3J0IHNwcml0ZUhpdEluZGV4OwogI2lmbmRlZiBTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFIaXRUZXN0U3ByaXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFIaXRUZXN0U3ByaXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFIaXRUZXN0U3ByaXRlcyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUhpdEluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzcHJpdGVIaXRJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmxvYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXMobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVIaXRJbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSGl0SW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhQ291bnRTcHJpdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBudW1TcHJpdGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBudW1TcHJpdGVzOwogI2lmbmRlZiBTcHJpdGVNZWRpYUNvdW50U3ByaXRlcwotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhQ291bnRTcHJpdGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUNvdW50U3ByaXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bVNwcml0ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG51bVNwcml0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUNvdW50U3ByaXRlcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtU3ByaXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU3ByaXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFDb3VudEltYWdlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgbnVtSW1hZ2VzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBudW1JbWFnZXM7CiAjaWZuZGVmIFNwcml0ZU1lZGlhQ291bnRJbWFnZXMKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUNvdW50SW1hZ2VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUNvdW50SW1hZ2VzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUNvdW50SW1hZ2VzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUltYWdlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtSW1hZ2VzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFDb3VudEltYWdlcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1JbWFnZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bUltYWdlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBpbWFnZUluZGV4OwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgaW1hZ2VEZXNjcmlwdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgaW1hZ2VJbmRleDsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGltYWdlRGVzY3JpcHRpb247CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmltYWdlRGVzY3JpcHRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRGVzY3JpcHRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmltYWdlRGVzY3JpcHRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRGVzY3JpcHRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHNhbXBsZU51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBzYW1wbGVOdW07CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUdldERpc3BsYXllZFNhbXBsZU51bWJlcihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlTnVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldERpc3BsYXllZFNhbXBsZU51bWJlcihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlTnVtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRBdG9tSUQgc3ByaXRlSUQ7Ci0JU3RyMjU1IHNwcml0ZU5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFUQXRvbUlEIHNwcml0ZUlEOworICAgIFN0cjI1NSBzcHJpdGVOYW1lOwogI2lmbmRlZiBTcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc3ByaXRlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZU5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzcHJpdGVOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlTmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGltYWdlSW5kZXg7Ci0JU3RyMjU1IGltYWdlTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgaW1hZ2VJbmRleDsKKyAgICBTdHIyNTUgaW1hZ2VOYW1lOwogI2lmbmRlZiBTcHJpdGVNZWRpYUdldEltYWdlTmFtZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEltYWdlTmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpbWFnZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUdldEltYWdlTmFtZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaW1hZ2VOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhU2V0U3ByaXRlUHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHNwcml0ZUlEOwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBwcm9wZXJ0eVZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBzcHJpdGVJRDsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogcHJvcGVydHlWYWx1ZTsKICNpZm5kZWYgU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU2V0U3ByaXRlUHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU2V0U3ByaXRlUHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhU2V0U3ByaXRlUHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYVNldFNwcml0ZVByb3BlcnR5KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUdldFNwcml0ZVByb3BlcnR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKLQlsb25nIHByb3BlcnR5VHlwZTsKLQl2b2lkICogcHJvcGVydHlWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CisgICAgbG9uZyBwcm9wZXJ0eVR5cGU7CisgICAgdm9pZCAqIHByb3BlcnR5VmFsdWU7CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldFNwcml0ZVByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldFNwcml0ZVByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUdldFNwcml0ZVByb3BlcnR5KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFHZXRTcHJpdGVQcm9wZXJ0eShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFIaXRUZXN0QWxsU3ByaXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmbGFnczsKLQlQb2ludCBsb2M7Ci0JUVRBdG9tSUQgc3ByaXRlSGl0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhZ3M7CisgICAgUG9pbnQgbG9jOworICAgIFFUQXRvbUlEIHNwcml0ZUhpdElEOwogI2lmbmRlZiBTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFIaXRUZXN0QWxsU3ByaXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFIaXRUZXN0QWxsU3ByaXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFIaXRUZXN0QWxsU3ByaXRlcyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUhpdElEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzcHJpdGVIaXRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmxvYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhSGl0VGVzdEFsbFNwcml0ZXMobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVIaXRJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSGl0SUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRBdG9tSUQgc3ByaXRlSUQ7Ci0JbG9uZyBmbGFnczsKLQlQb2ludCBsb2M7Ci0JQm9vbGVhbiB3YXNIaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFUQXRvbUlEIHNwcml0ZUlEOworICAgIGxvbmcgZmxhZ3M7CisgICAgUG9pbnQgbG9jOworICAgIEJvb2xlYW4gd2FzSGl0OwogI2lmbmRlZiBTcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0hpdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzSGl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0hpdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzSGl0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgc3ByaXRlSW5kZXg7Ci0JUVRBdG9tSUQgc3ByaXRlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IHNwcml0ZUluZGV4OworICAgIFFUQXRvbUlEIHNwcml0ZUlEOwogI2lmbmRlZiBTcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRAotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lEKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKLQlzaG9ydCBzcHJpdGVJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CisgICAgc2hvcnQgc3ByaXRlSW5kZXg7CiAjaWZuZGVmIFNwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4Ci0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRBdG9tSUQgdmFyaWFibGVJRDsKLQlmbG9hdCB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgdmFyaWFibGVJRDsKKyAgICBmbG9hdCB2YWx1ZTsKICNpZm5kZWYgU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsZiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCB2YXJpYWJsZUlEOwotCWZsb2F0IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCB2YXJpYWJsZUlEOworICAgIGZsb2F0IHZhbHVlOwogI2lmbmRlZiBTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxmIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhRGlzcG9zZVNwcml0ZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhRGlzcG9zZVNwcml0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCB2YXJpYWJsZUlEOwotCVB0ciB0aGVDU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCB2YXJpYWJsZUlEOworICAgIFB0ciB0aGVDU3RyaW5nOwogI2lmbmRlZiBTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlQ1N0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ1N0cmluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUNTdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmcobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUNTdHJpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGVBc1N0cmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRBdG9tSUQgdmFyaWFibGVJRDsKLQlIYW5kbGUgdGhlQ1N0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgdmFyaWFibGVJRDsKKyAgICBIYW5kbGUgdGhlQ1N0cmluZzsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ1N0cmluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUNTdHJpbmcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGVBc1N0cmluZyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUNTdHJpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVDU3RyaW5nKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYU5ld0ltYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JUVRBdG9tSUQgZGVzaXJlZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUVRBdG9tSUQgZGVzaXJlZElEOwogI2lmbmRlZiBTcHJpdGVNZWRpYU5ld0ltYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFOZXdJbWFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFOZXdJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXNpcmVkSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYU5ld0ltYWdlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZElEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNpcmVkSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYU5ld0ltYWdlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYURpc3Bvc2VJbWFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgaW1hZ2VJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgaW1hZ2VJbmRleDsKICNpZm5kZWYgU3ByaXRlTWVkaWFEaXNwb3NlSW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFEaXNwb3NlSW1hZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFEaXNwb3NlSW1hZ2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFEaXNwb3NlSW1hZ2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgaW1hZ2VJbmRleDsKLQlRVEF0b21JRCBpbWFnZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBpbWFnZUluZGV4OworICAgIFFUQXRvbUlEIGltYWdlSUQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUltYWdlSW5kZXhUb0lEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUltYWdlSW5kZXhUb0lEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGltYWdlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIGltYWdlSUQ7Ci0Jc2hvcnQgaW1hZ2VJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgaW1hZ2VJRDsKKyAgICBzaG9ydCBpbWFnZUluZGV4OwogI2lmbmRlZiBTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4Ci0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFJbWFnZUlEVG9JbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFJbWFnZUlEVG9JbmRleCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhU2V0UGFuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCB4UGVyY2VudDsKLQlzaG9ydCB5UGVyY2VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgeFBlcmNlbnQ7CisgICAgc2hvcnQgeVBlcmNlbnQ7CiAjaWZuZGVmIEZsYXNoTWVkaWFTZXRQYW4KLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhU2V0UGFuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhU2V0UGFuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnhQZXJjZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmeVBlcmNlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhU2V0UGFuKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgeFBlcmNlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICB5UGVyY2VudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeFBlcmNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5UGVyY2VudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFTZXRQYW4obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4UGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHlQZXJjZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhU2V0Wm9vbShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgZmFjdG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBmYWN0b3I7CiAjaWZuZGVmIEZsYXNoTWVkaWFTZXRab29tCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYVNldFpvb20pOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRab29tKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmFjdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRmxhc2hNZWRpYVNldFpvb20obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFTZXRab29tKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYVNldFpvb21SZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGxlZnQ7Ci0JbG9uZyB0b3A7Ci0JbG9uZyByaWdodDsKLQlsb25nIGJvdHRvbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBsZWZ0OworICAgIGxvbmcgdG9wOworICAgIGxvbmcgcmlnaHQ7CisgICAgbG9uZyBib3R0b207CiAjaWZuZGVmIEZsYXNoTWVkaWFTZXRab29tUmVjdAotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRab29tUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYVNldFpvb21SZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRmxhc2hNZWRpYVNldFpvb21SZWN0KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYVNldFpvb21SZWN0KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFHZXRSZWZDb25Cb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgcmVmQ29uOwotCWxvbmcgbGVmdDsKLQlsb25nIHRvcDsKLQlsb25nIHJpZ2h0OwotCWxvbmcgYm90dG9tOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIHJlZkNvbjsKKyAgICBsb25nIGxlZnQ7CisgICAgbG9uZyB0b3A7CisgICAgbG9uZyByaWdodDsKKyAgICBsb25nIGJvdHRvbTsKICNpZm5kZWYgRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFHZXRSZWZDb25Cb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFHZXRSZWZDb25Cb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICB0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgcmlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgYm90dG9tKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFHZXRSZWZDb25Cb3VuZHMobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFHZXRSZWZDb25JRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyByZWZDb247Ci0JbG9uZyByZWZDb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyByZWZDb247CisgICAgbG9uZyByZWZDb25JRDsKICNpZm5kZWYgRmxhc2hNZWRpYUdldFJlZkNvbklECi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldFJlZkNvbklEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0UmVmQ29uSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhR2V0UmVmQ29uSUQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbklEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZDb25JRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGFzaE1lZGlhR2V0UmVmQ29uSUQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb25JRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUlEVG9SZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgcmVmQ29uSUQ7Ci0JbG9uZyByZWZDb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgcmVmQ29uSUQ7CisgICAgbG9uZyByZWZDb247CiAjaWZuZGVmIEZsYXNoTWVkaWFJRFRvUmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUlEVG9SZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFJRFRvUmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhSURUb1JlZkNvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZDb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGFzaE1lZGlhSURUb1JlZkNvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmbGFzaEZyYW1lTnVtYmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZsYXNoRnJhbWVOdW1iZXI7CiAjaWZuZGVmIEZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlcgotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFzaEZyYW1lTnVtYmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFzaEZyYW1lTnVtYmVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhc2hGcmFtZU51bWJlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhc2hGcmFtZU51bWJlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUZyYW1lTnVtYmVyVG9Nb3ZpZVRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgZmxhc2hGcmFtZU51bWJlcjsKLQlUaW1lVmFsdWUgbW92aWVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZsYXNoRnJhbWVOdW1iZXI7CisgICAgVGltZVZhbHVlIG1vdmllVGltZTsKICNpZm5kZWYgRmxhc2hNZWRpYUZyYW1lTnVtYmVyVG9Nb3ZpZVRpbWUKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUZyYW1lTnVtYmVyVG9Nb3ZpZVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFzaEZyYW1lTnVtYmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRmxhc2hNZWRpYUZyYW1lTnVtYmVyVG9Nb3ZpZVRpbWUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhc2hGcmFtZU51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtb3ZpZVRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhc2hGcmFtZU51bWJlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFGcmFtZU51bWJlclRvTW92aWVUaW1lKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXNoRnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllVGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhRnJhbWVMYWJlbFRvTW92aWVUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlQdHIgdGhlTGFiZWw7Ci0JVGltZVZhbHVlIG1vdmllVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUHRyIHRoZUxhYmVsOworICAgIFRpbWVWYWx1ZSBtb3ZpZVRpbWU7CiAjaWZuZGVmIEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRnJhbWVMYWJlbFRvTW92aWVUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRnJhbWVMYWJlbFRvTW92aWVUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlTGFiZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhRnJhbWVMYWJlbFRvTW92aWVUaW1lKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGFiZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtb3ZpZVRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTGFiZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGFzaE1lZGlhRnJhbWVMYWJlbFRvTW92aWVUaW1lKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZVRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQljaGFyIHBhdGg7Ci0JY2hhciBuYW1lOwotCUhhbmRsZSB0aGVWYXJpYWJsZUNTdHJpbmdPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGNoYXIgcGF0aDsKKyAgICBjaGFyIG5hbWU7CisgICAgSGFuZGxlIHRoZVZhcmlhYmxlQ1N0cmluZ091dDsKICNpZm5kZWYgRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0Rmxhc2hWYXJpYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVWYXJpYWJsZUNTdHJpbmdPdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2NPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVWYXJpYWJsZUNTdHJpbmdPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGFzaE1lZGlhR2V0Rmxhc2hWYXJpYWJsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlVmFyaWFibGVDU3RyaW5nT3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNjTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlVmFyaWFibGVDU3RyaW5nT3V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JY2hhciBwYXRoOwotCWNoYXIgbmFtZTsKLQljaGFyIHZhbHVlOwotCUJvb2xlYW4gdXBkYXRlRm9jdXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGNoYXIgcGF0aDsKKyAgICBjaGFyIG5hbWU7CisgICAgY2hhciB2YWx1ZTsKKyAgICBCb29sZWFuIHVwZGF0ZUZvY3VzOwogI2lmbmRlZiBGbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZQotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVwZGF0ZUZvY3VzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRmxhc2hNZWRpYVNldEZsYXNoVmFyaWFibGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZvY3VzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNjYyIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cGRhdGVGb2N1cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVGb2N1cyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjY2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWNoYXIgcGF0aDsKLQlsb25nIGJ1dHRvbklEOwotCWxvbmcgdHJhbnNpdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgY2hhciBwYXRoOworICAgIGxvbmcgYnV0dG9uSUQ7CisgICAgbG9uZyB0cmFuc2l0aW9uOwogI2lmbmRlZiBGbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZidXR0b25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zaXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYyIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHBhdGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1dHRvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNpdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVVJbnQ4IHN3ZlZlcnNpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFVJbnQ4IHN3ZlZlcnNpb247CiAjaWZuZGVmIEZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3dmVmVyc2lvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc3dmVmVyc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzd2ZWZXJzaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzd2ZWZXJzaW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYTNER2V0Q3VycmVudEdyb3VwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogZ3JvdXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHZvaWQgKiBncm91cDsKICNpZm5kZWYgTWVkaWEzREdldEN1cnJlbnRHcm91cAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RHZXRDdXJyZW50R3JvdXApOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RHZXRDdXJyZW50R3JvdXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZncm91cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RHZXRDdXJyZW50R3JvdXAobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZncm91cCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RHZXRDdXJyZW50R3JvdXAobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzRFRyYW5zbGF0ZU5hbWVkT2JqZWN0VG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWNoYXIgb2JqZWN0TmFtZTsKLQlGaXhlZCB4OwotCUZpeGVkIHk7Ci0JRml4ZWQgejsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgY2hhciBvYmplY3ROYW1lOworICAgIEZpeGVkIHg7CisgICAgRml4ZWQgeTsKKyAgICBGaXhlZCB6OwogI2lmbmRlZiBNZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJngsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ6KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzRFRyYW5zbGF0ZU5hbWVkT2JqZWN0VG8obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iamVjdE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHopOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYyIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzRFNjYWxlTmFtZWRPYmplY3RUbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JY2hhciBvYmplY3ROYW1lOwotCUZpeGVkIHhTY2FsZTsKLQlGaXhlZCB5U2NhbGU7Ci0JRml4ZWQgelNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBjaGFyIG9iamVjdE5hbWU7CisgICAgRml4ZWQgeFNjYWxlOworICAgIEZpeGVkIHlTY2FsZTsKKyAgICBGaXhlZCB6U2NhbGU7CiAjaWZuZGVmIE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeFNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnlTY2FsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ6U2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iamVjdE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4U2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5U2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6U2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYyIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnlTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ6U2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6U2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQljaGFyIG9iamVjdE5hbWU7Ci0JRml4ZWQgeERlZ3JlZXM7Ci0JRml4ZWQgeURlZ3JlZXM7Ci0JRml4ZWQgekRlZ3JlZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGNoYXIgb2JqZWN0TmFtZTsKKyAgICBGaXhlZCB4RGVncmVlczsKKyAgICBGaXhlZCB5RGVncmVlczsKKyAgICBGaXhlZCB6RGVncmVlczsKICNpZm5kZWYgTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ4RGVncmVlcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ5RGVncmVlcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ6RGVncmVlcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmplY3ROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhEZWdyZWVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlEZWdyZWVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpEZWdyZWVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGMiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnhEZWdyZWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnlEZWdyZWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnpEZWdyZWVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeERlZ3JlZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeURlZ3JlZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgekRlZ3JlZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RTZXRDYW1lcmFEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogY2FtZXJhRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgdm9pZCAqIGNhbWVyYURhdGE7CiAjaWZuZGVmIE1lZGlhM0RTZXRDYW1lcmFEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFNldENhbWVyYURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTZXRDYW1lcmFEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FtZXJhRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RTZXRDYW1lcmFEYXRhKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYURhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FtZXJhRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RTZXRDYW1lcmFEYXRhKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYURhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RHZXRDYW1lcmFEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogY2FtZXJhRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgdm9pZCAqIGNhbWVyYURhdGE7CiAjaWZuZGVmIE1lZGlhM0RHZXRDYW1lcmFEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldENhbWVyYURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RHZXRDYW1lcmFEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FtZXJhRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RHZXRDYW1lcmFEYXRhKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYURhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FtZXJhRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RHZXRDYW1lcmFEYXRhKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYURhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRGbG9hdFNpbmdsZSBmb3Y7Ci0JUVRGbG9hdFNpbmdsZSBhc3BlY3RSYXRpb1hUb1k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFURmxvYXRTaW5nbGUgZm92OworICAgIFFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZOwogI2lmbmRlZiBNZWRpYTNEU2V0Q2FtZXJhQW5nbGVBc3BlY3QKLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNEU2V0Q2FtZXJhQW5nbGVBc3BlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3YsCi0JICAgICAgICAgICAgICAgICAgICAgICZhc3BlY3RSYXRpb1hUb1kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYTNEU2V0Q2FtZXJhQW5nbGVBc3BlY3QobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0UmF0aW9YVG9ZKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhc3BlY3RSYXRpb1hUb1kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYTNEU2V0Q2FtZXJhQW5nbGVBc3BlY3QobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0UmF0aW9YVG9ZKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFURmxvYXRTaW5nbGUgZm92OwotCVFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEZsb2F0U2luZ2xlIGZvdjsKKyAgICBRVEZsb2F0U2luZ2xlIGFzcGVjdFJhdGlvWFRvWTsKICNpZm5kZWYgTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvdiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzcGVjdFJhdGlvWFRvWSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZvdiwKLQkgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpb1hUb1kpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhc3BlY3RSYXRpb1hUb1kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0UmF0aW9YVG9ZKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYTNEU2V0Q2FtZXJhUmFuZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXZvaWQgKiB0UTNDYW1lcmFSYW5nZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgdm9pZCAqIHRRM0NhbWVyYVJhbmdlOwogI2lmbmRlZiBNZWRpYTNEU2V0Q2FtZXJhUmFuZ2UKLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNEU2V0Q2FtZXJhUmFuZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTZXRDYW1lcmFSYW5nZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRRM0NhbWVyYVJhbmdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzRFNldENhbWVyYVJhbmdlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UTNDYW1lcmFSYW5nZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0UTNDYW1lcmFSYW5nZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RTZXRDYW1lcmFSYW5nZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFEzQ2FtZXJhUmFuZ2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RHZXRDYW1lcmFSYW5nZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jdm9pZCAqIHRRM0NhbWVyYVJhbmdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogdFEzQ2FtZXJhUmFuZ2U7CiAjaWZuZGVmIE1lZGlhM0RHZXRDYW1lcmFSYW5nZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RHZXRDYW1lcmFSYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldENhbWVyYVJhbmdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdFEzQ2FtZXJhUmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYTNER2V0Q2FtZXJhUmFuZ2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRRM0NhbWVyYVJhbmdlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRRM0NhbWVyYVJhbmdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzREdldENhbWVyYVJhbmdlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UTNDYW1lcmFSYW5nZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3VGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVCYXNlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZUJhc2UgX3J2OwogI2lmbmRlZiBOZXdUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKE5ld1RpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3VGltZUJhc2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3VGltZUJhc2UoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db252ZXJ0VGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVJlY29yZCB0aGVUaW1lOwotCVRpbWVCYXNlIG5ld0Jhc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVSZWNvcmQgdGhlVGltZTsKKyAgICBUaW1lQmFzZSBuZXdCYXNlOwogI2lmbmRlZiBDb252ZXJ0VGltZQotCVB5TWFjX1BSRUNIRUNLKENvbnZlcnRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb252ZXJ0VGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0aGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmbmV3QmFzZSkpCi0JCXJldHVybiBOVUxMOwotCUNvbnZlcnRUaW1lKCZ0aGVUaW1lLAotCSAgICAgICAgICAgIG5ld0Jhc2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJnRoZVRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRoZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZuZXdCYXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29udmVydFRpbWUoJnRoZVRpbWUsCisgICAgICAgICAgICAgICAgbmV3QmFzZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdGhlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29udmVydFRpbWVTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVJlY29yZCB0aGVUaW1lOwotCVRpbWVTY2FsZSBuZXdTY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB0aGVUaW1lOworICAgIFRpbWVTY2FsZSBuZXdTY2FsZTsKICNpZm5kZWYgQ29udmVydFRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKENvbnZlcnRUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbnZlcnRUaW1lU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0aGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3U2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlDb252ZXJ0VGltZVNjYWxlKCZ0aGVUaW1lLAotCSAgICAgICAgICAgICAgICAgbmV3U2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJnRoZVRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmdGhlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1NjYWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29udmVydFRpbWVTY2FsZSgmdGhlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgIG5ld1NjYWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0aGVUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9BZGRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lUmVjb3JkIGRzdDsKLQlUaW1lUmVjb3JkIHNyYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCBkc3Q7CisgICAgVGltZVJlY29yZCBzcmM7CiAjaWZuZGVmIEFkZFRpbWUKLQlQeU1hY19QUkVDSEVDSyhBZGRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJmRzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlBZGRUaW1lKCZkc3QsCi0JICAgICAgICAmc3JjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBZGRUaW1lKCZkc3QsCisgICAgICAgICZzcmMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmRzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3VidHJhY3RUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lUmVjb3JkIGRzdDsKLQlUaW1lUmVjb3JkIHNyYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCBkc3Q7CisgICAgVGltZVJlY29yZCBzcmM7CiAjaWZuZGVmIFN1YnRyYWN0VGltZQotCVB5TWFjX1BSRUNIRUNLKFN1YnRyYWN0VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3VidHJhY3RUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJmRzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlTdWJ0cmFjdFRpbWUoJmRzdCwKLQkgICAgICAgICAgICAgJnNyYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmZHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmc3JjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU3VidHJhY3RUaW1lKCZkc3QsCisgICAgICAgICAgICAgICAgICZzcmMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmRzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIHRpOwotCWxvbmcgc2FtcGxlRGVzY0luZGV4OwotCUNvbXBvbmVudEluc3RhbmNlIHRwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIHRpOworICAgIGxvbmcgc2FtcGxlRGVzY0luZGV4OworICAgIENvbXBvbmVudEluc3RhbmNlIHRwOwogI2lmbmRlZiBNdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIKLQlQeU1hY19QUkVDSEVDSyhNdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0aSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZURlc2NJbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllcih0aSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY0luZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgdHApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRGVzY0luZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyKHRpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCB0cCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29kZWNNYW5hZ2VyVmVyc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIHZlcnNpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyB2ZXJzaW9uOwogI2lmbmRlZiBDb2RlY01hbmFnZXJWZXJzaW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ29kZWNNYW5hZ2VyVmVyc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29kZWNNYW5hZ2VyVmVyc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvZGVjTWFuYWdlclZlcnNpb24oJnZlcnNpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29kZWNNYW5hZ2VyVmVyc2lvbigmdmVyc2lvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0TWF4Q29tcHJlc3Npb25TaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBpeE1hcEhhbmRsZSBzcmM7Ci0JUmVjdCBzcmNSZWN0OwotCXNob3J0IGNvbG9yRGVwdGg7Ci0JQ29kZWNRIHF1YWxpdHk7Ci0JQ29kZWNUeXBlIGNUeXBlOwotCUNvbXByZXNzb3JDb21wb25lbnQgY29kZWM7Ci0JbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIHNob3J0IGNvbG9yRGVwdGg7CisgICAgQ29kZWNRIHF1YWxpdHk7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIENvbXByZXNzb3JDb21wb25lbnQgY29kZWM7CisgICAgbG9uZyBzaXplOwogI2lmbmRlZiBHZXRNYXhDb21wcmVzc2lvblNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRNYXhDb21wcmVzc2lvblNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1heENvbXByZXNzaW9uU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sb3JEZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNvZGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1heENvbXByZXNzaW9uU2l6ZShzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNvZGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1heENvbXByZXNzaW9uU2l6ZShzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRDb21wcmVzc2lvblRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHNyYzsKLQlSZWN0IHNyY1JlY3Q7Ci0Jc2hvcnQgY29sb3JEZXB0aDsKLQlDb2RlY1R5cGUgY1R5cGU7Ci0JQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYzsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7Ci0JQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKLQl1bnNpZ25lZCBsb25nIGNvbXByZXNzVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgc3JjOworICAgIFJlY3Qgc3JjUmVjdDsKKyAgICBzaG9ydCBjb2xvckRlcHRoOworICAgIENvZGVjVHlwZSBjVHlwZTsKKyAgICBDb21wcmVzc29yQ29tcG9uZW50IGNvZGVjOworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKKyAgICBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OworICAgIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lOwogI2lmbmRlZiBHZXRDb21wcmVzc2lvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wcmVzc2lvblRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXByZXNzaW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xvckRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjb2RlYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb21wcmVzc2lvblRpbWUoc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NUaW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc1RpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNvZGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbXByZXNzaW9uVGltZShzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc1RpbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcHJlc3NJbWFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCVJlY3Qgc3JjUmVjdDsKLQlDb2RlY1EgcXVhbGl0eTsKLQlDb2RlY1R5cGUgY1R5cGU7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCVB0ciBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIENvZGVjUSBxdWFsaXR5OworICAgIENvZGVjVHlwZSBjVHlwZTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHRyIGRhdGE7CiAjaWZuZGVmIENvbXByZXNzSW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhDb21wcmVzc0ltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wcmVzc0ltYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsTyZPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb21wcmVzc0ltYWdlKHNyYywKLQkgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgIGNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbXByZXNzSW1hZ2Uoc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EZWNvbXByZXNzSW1hZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUHRyIGRhdGE7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCVBpeE1hcEhhbmRsZSBkc3Q7Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgZHN0UmVjdDsKLQlzaG9ydCBtb2RlOwotCVJnbkhhbmRsZSBtYXNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFB0ciBkYXRhOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQaXhNYXBIYW5kbGUgZHN0OworICAgIFJlY3Qgc3JjUmVjdDsKKyAgICBSZWN0IGRzdFJlY3Q7CisgICAgc2hvcnQgbW9kZTsKKyAgICBSZ25IYW5kbGUgbWFzazsKICNpZm5kZWYgRGVjb21wcmVzc0ltYWdlCi0JUHlNYWNfUFJFQ0hFQ0soRGVjb21wcmVzc0ltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWNvbXByZXNzSW1hZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic08mTyZPJk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEZWNvbXByZXNzSW1hZ2UoZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICBkc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIG1hc2spOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNPJk8mTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGVjb21wcmVzc0ltYWdlKGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRTaW1pbGFyaXR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBpeE1hcEhhbmRsZSBzcmM7Ci0JUmVjdCBzcmNSZWN0OwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlQdHIgZGF0YTsKLQlGaXhlZCBzaW1pbGFyaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQdHIgZGF0YTsKKyAgICBGaXhlZCBzaW1pbGFyaXR5OwogI2lmbmRlZiBHZXRTaW1pbGFyaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0U2ltaWxhcml0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0U2ltaWxhcml0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFNpbWlsYXJpdHkoc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAmc2ltaWxhcml0eSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIHNpbWlsYXJpdHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2ltaWxhcml0eShzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzaW1pbGFyaXR5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgc2ltaWxhcml0eSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JQ1RhYkhhbmRsZSBjdGFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIENUYWJIYW5kbGUgY3RhYmxlOwogI2lmbmRlZiBHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0YWJsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGN0YWJsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZShkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdGFibGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjdGFibGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NldEltYWdlRGVzY3JpcHRpb25DVGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCUNUYWJIYW5kbGUgY3RhYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBDVGFiSGFuZGxlIGN0YWJsZTsKICNpZm5kZWYgU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZQotCVB5TWFjX1BSRUNIRUNLKFNldEltYWdlRGVzY3JpcHRpb25DVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEltYWdlRGVzY3JpcHRpb25DVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdGFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZShkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0YWJsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdGFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZShkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0YWJsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JSGFuZGxlIGV4dGVuc2lvbjsKLQlsb25nIGlkVHlwZTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBIYW5kbGUgZXh0ZW5zaW9uOworICAgIGxvbmcgaWRUeXBlOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBleHRlbnNpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBleHRlbnNpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0FkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCUhhbmRsZSBleHRlbnNpb247Ci0JbG9uZyBpZFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIEhhbmRsZSBleHRlbnNpb247CisgICAgbG9uZyBpZFR5cGU7CiAjaWZuZGVmIEFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhBZGRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9SZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlsb25nIGlkVHlwZTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBsb25nIGlkVHlwZTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCWxvbmcgaWRUeXBlOwotCWxvbmcgY291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIGxvbmcgaWRUeXBlOworICAgIGxvbmcgY291bnQ7CiAjaWZuZGVmIENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUKLQlQeU1hY19QUkVDSEVDSyhDb3VudEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3VudEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlKGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgY291bnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3VudEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlKGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JbG9uZyBpZFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIGxvbmcgaWRUeXBlOwogI2lmbmRlZiBHZXROZXh0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXROZXh0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUoZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TmV4dEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlKGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZpbmRDb2RlYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlDb2RlY1R5cGUgY1R5cGU7Ci0JQ29kZWNDb21wb25lbnQgc3BlY0NvZGVjOwotCUNvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvcjsKLQlEZWNvbXByZXNzb3JDb21wb25lbnQgZGVjb21wcmVzc29yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvZGVjVHlwZSBjVHlwZTsKKyAgICBDb2RlY0NvbXBvbmVudCBzcGVjQ29kZWM7CisgICAgQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yOworICAgIERlY29tcHJlc3NvckNvbXBvbmVudCBkZWNvbXByZXNzb3I7CiAjaWZuZGVmIEZpbmRDb2RlYwotCVB5TWFjX1BSRUNIRUNLKEZpbmRDb2RlYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZENvZGVjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZzcGVjQ29kZWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmluZENvZGVjKGNUeXBlLAotCSAgICAgICAgICAgICAgICAgc3BlY0NvZGVjLAotCSAgICAgICAgICAgICAgICAgJmNvbXByZXNzb3IsCi0JICAgICAgICAgICAgICAgICAmZGVjb21wcmVzc29yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBjb21wcmVzc29yLAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIGRlY29tcHJlc3Nvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJnNwZWNDb2RlYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGaW5kQ29kZWMoY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICBzcGVjQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICZkZWNvbXByZXNzb3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIGNvbXByZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgZGVjb21wcmVzc29yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wcmVzc1BpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGljSGFuZGxlIHNyY1BpY3R1cmU7Ci0JUGljSGFuZGxlIGRzdFBpY3R1cmU7Ci0JQ29kZWNRIHF1YWxpdHk7Ci0JQ29kZWNUeXBlIGNUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBpY0hhbmRsZSBzcmNQaWN0dXJlOworICAgIFBpY0hhbmRsZSBkc3RQaWN0dXJlOworICAgIENvZGVjUSBxdWFsaXR5OworICAgIENvZGVjVHlwZSBjVHlwZTsKICNpZm5kZWYgQ29tcHJlc3NQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcHJlc3NQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wcmVzc1BpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RQaWN0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29tcHJlc3NQaWN0dXJlKHNyY1BpY3R1cmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBkc3RQaWN0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGNUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb21wcmVzc1BpY3R1cmUoc3JjUGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXByZXNzUGljdHVyZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgc3JjUmVmTnVtOwotCXNob3J0IGRzdFJlZk51bTsKLQlDb2RlY1EgcXVhbGl0eTsKLQlDb2RlY1R5cGUgY1R5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgc3JjUmVmTnVtOworICAgIHNob3J0IGRzdFJlZk51bTsKKyAgICBDb2RlY1EgcXVhbGl0eTsKKyAgICBDb2RlY1R5cGUgY1R5cGU7CiAjaWZuZGVmIENvbXByZXNzUGljdHVyZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhDb21wcmVzc1BpY3R1cmVGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wcmVzc1BpY3R1cmVGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvbXByZXNzUGljdHVyZUZpbGUoc3JjUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb21wcmVzc1BpY3R1cmVGaWxlKHNyY1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29udmVydEltYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgc3JjREQ7Ci0JUHRyIHNyY0RhdGE7Ci0Jc2hvcnQgY29sb3JEZXB0aDsKLQlDVGFiSGFuZGxlIGN0YWJsZTsKLQlDb2RlY1EgYWNjdXJhY3k7Ci0JQ29kZWNRIHF1YWxpdHk7Ci0JQ29kZWNUeXBlIGNUeXBlOwotCUNvZGVjQ29tcG9uZW50IGNvZGVjOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0REQ7Ci0JUHRyIGRzdERhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNERDsKKyAgICBQdHIgc3JjRGF0YTsKKyAgICBzaG9ydCBjb2xvckRlcHRoOworICAgIENUYWJIYW5kbGUgY3RhYmxlOworICAgIENvZGVjUSBhY2N1cmFjeTsKKyAgICBDb2RlY1EgcXVhbGl0eTsKKyAgICBDb2RlY1R5cGUgY1R5cGU7CisgICAgQ29kZWNDb21wb25lbnQgY29kZWM7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkc3RERDsKKyAgICBQdHIgZHN0RGF0YTsKICNpZm5kZWYgQ29udmVydEltYWdlCi0JUHlNYWNfUFJFQ0hFQ0soQ29udmVydEltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb252ZXJ0SW1hZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzaE8mbGxPJk8mTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNERCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY0RhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xvckRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjY3VyYWN5LAotCSAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29kZWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0REQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3REYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvbnZlcnRJbWFnZShzcmNERCwKLQkgICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsCi0JICAgICAgICAgICAgICAgICAgICBjb2xvckRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgY3RhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3ksCi0JICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgY1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICBjb2RlYywKLQkgICAgICAgICAgICAgICAgICAgIGRzdERELAotCSAgICAgICAgICAgICAgICAgICAgZHN0RGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzaE8mbGxPJk8mTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNERCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvckRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjY3VyYWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0REQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbnZlcnRJbWFnZShzcmNERCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgY3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3ksCisgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdERELAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0RGF0YSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQWRkRmlsZVByZXZpZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVzUmVmTnVtOwotCU9TVHlwZSBwcmV2aWV3VHlwZTsKLQlIYW5kbGUgcHJldmlld0RhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVzUmVmTnVtOworICAgIE9TVHlwZSBwcmV2aWV3VHlwZTsKKyAgICBIYW5kbGUgcHJldmlld0RhdGE7CiAjaWZuZGVmIEFkZEZpbGVQcmV2aWV3Ci0JUHlNYWNfUFJFQ0hFQ0soQWRkRmlsZVByZXZpZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZEZpbGVQcmV2aWV3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJldmlld1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHJldmlld0RhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkRmlsZVByZXZpZXcocmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgcHJldmlld0RhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJldmlld1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHJldmlld0RhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkRmlsZVByZXZpZXcocmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlld0RhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldEJlc3REZXZpY2VSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUdESGFuZGxlIGdkaDsKLQlSZWN0IHJwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEdESGFuZGxlIGdkaDsKKyAgICBSZWN0IHJwOwogI2lmbmRlZiBHZXRCZXN0RGV2aWNlUmVjdAotCVB5TWFjX1BSRUNIRUNLKEdldEJlc3REZXZpY2VSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRCZXN0RGV2aWNlUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEJlc3REZXZpY2VSZWN0KCZnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZycCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEJlc3REZXZpY2VSZWN0KCZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZycCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HREhhc1NjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUdESGFuZGxlIGdkaDsKLQlzaG9ydCBkZXB0aDsKLQlGaXhlZCBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBHREhhbmRsZSBnZGg7CisgICAgc2hvcnQgZGVwdGg7CisgICAgRml4ZWQgc2NhbGU7CiAjaWZuZGVmIEdESGFzU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhHREhhc1NjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHREhhc1NjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR0RIYXNTY2FsZShnZGgsCi0JICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgc2NhbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR0RIYXNTY2FsZShnZGgsCisgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgc2NhbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dER2V0U2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JR0RIYW5kbGUgZ2RoOwotCUZpeGVkIHNjYWxlOwotCXNob3J0IGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEdESGFuZGxlIGdkaDsKKyAgICBGaXhlZCBzY2FsZTsKKyAgICBzaG9ydCBmbGFnczsKICNpZm5kZWYgR0RHZXRTY2FsZQotCVB5TWFjX1BSRUNIRUNLKEdER2V0U2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdER2V0U2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHREdldFNjYWxlKGdkaCwKLQkgICAgICAgICAgICAgICAgICAmc2NhbGUsCi0JICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIHNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdER2V0U2NhbGUoZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICZzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dEU2V0U2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JR0RIYW5kbGUgZ2RoOwotCUZpeGVkIHNjYWxlOwotCXNob3J0IGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEdESGFuZGxlIGdkaDsKKyAgICBGaXhlZCBzY2FsZTsKKyAgICBzaG9ydCBmbGFnczsKICNpZm5kZWYgR0RTZXRTY2FsZQotCVB5TWFjX1BSRUNIRUNLKEdEU2V0U2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdEU2V0U2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzY2FsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdEU2V0U2NhbGUoZ2RoLAotCSAgICAgICAgICAgICAgICAgIHNjYWxlLAotCSAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR0RTZXRTY2FsZShnZGgsCisgICAgICAgICAgICAgICAgICAgICAgc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyB0aGVGaWxlOwotCUNvbXBvbmVudEluc3RhbmNlIGdpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIENvbXBvbmVudEluc3RhbmNlIGdpOwogI2lmbmRlZiBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZQotCVB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUoJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlKCZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2kpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ2kpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlDb21wb25lbnRJbnN0YW5jZSBnaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgZ2k7CiAjaWZuZGVmIEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmKGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2kpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ2kpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmKGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2kpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ2kpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyB0aGVGaWxlOwotCUNvbXBvbmVudEluc3RhbmNlIGdpOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgZ2k7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzKCZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGdpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MoJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ2kpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlDb21wb25lbnRJbnN0YW5jZSBnaTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBnaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZldpdGhGbGFncwotCVB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZldpdGhGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZldpdGhGbGFncyhkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MoZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ2kpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01ha2VJbWFnZURlc2NyaXB0aW9uRm9yUGl4TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBpeE1hcEhhbmRsZSBwaXhtYXA7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBpZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHBpeG1hcDsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaDsKICNpZm5kZWYgTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAKLQlQeU1hY19QUkVDSEVDSyhNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeG1hcCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcChwaXhtYXAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpZGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhtYXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAocGl4bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgZWZmZWN0VHlwZTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZWZmZWN0VHlwZTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaDsKICNpZm5kZWYgTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JFZmZlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JFZmZlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZlZmZlY3RUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0KGVmZmVjdFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpZGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZWZmZWN0VHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdChlZmZlY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFBpeGVsU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCU9TVHlwZSBQaXhlbEZvcm1hdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIE9TVHlwZSBQaXhlbEZvcm1hdDsKICNpZm5kZWYgUVRHZXRQaXhlbFNpemUKLQlQeU1hY19QUkVDSEVDSyhRVEdldFBpeGVsU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRHZXRQaXhlbFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZQaXhlbEZvcm1hdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUR2V0UGl4ZWxTaXplKFBpeGVsRm9ybWF0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJlBpeGVsRm9ybWF0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRHZXRQaXhlbFNpemUoUGl4ZWxGb3JtYXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlPU1R5cGUgUGl4ZWxGb3JtYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBPU1R5cGUgUGl4ZWxGb3JtYXQ7CiAjaWZuZGVmIFFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhRVEdldFBpeGVsRm9ybWF0RGVwdGhGb3JJbWFnZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFBpeGVsRm9ybWF0RGVwdGhGb3JJbWFnZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmUGl4ZWxGb3JtYXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVEdldFBpeGVsRm9ybWF0RGVwdGhGb3JJbWFnZURlc2NyaXB0aW9uKFBpeGVsRm9ybWF0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJlBpeGVsRm9ybWF0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbihQaXhlbEZvcm1hdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIFFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMKLQlQeU1hY19QUkVDSEVDSyhRVEdldFBpeE1hcEhhbmRsZVJvd0J5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFBpeE1hcEhhbmRsZVJvd0J5dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMocG0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMocG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHBtOwotCWxvbmcgcm93Qnl0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHBtOworICAgIGxvbmcgcm93Qnl0ZXM7CiAjaWZuZGVmIFFUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMKLQlQeU1hY19QUkVDSEVDSyhRVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCi0JICAgICAgICAgICAgICAgICAgICAgICZyb3dCeXRlcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzKHBtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0J5dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93Qnl0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyhwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dCeXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRHZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBRVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwKLQlQeU1hY19QUkVDSEVDSyhRVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwocG0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwocG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHBtOwotCUZpeGVkIGdhbW1hTGV2ZWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHBtOworICAgIEZpeGVkIGdhbW1hTGV2ZWw7CiAjaWZuZGVmIFFUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbAotCVB5TWFjX1BSRUNIRUNLKFFUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmdhbW1hTGV2ZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsKHBtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtbWFMZXZlbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZ2FtbWFMZXZlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwocG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1tYUxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIFFUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbAotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbChwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbChwbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgcG07Ci0JRml4ZWQgcmVxdWVzdGVkR2FtbWFMZXZlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgRml4ZWQgcmVxdWVzdGVkR2FtbWFMZXZlbDsKICNpZm5kZWYgUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsCi0JUHlNYWNfUFJFQ0hFQ0soUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmVxdWVzdGVkR2FtbWFMZXZlbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwocG0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRHYW1tYUxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyZXF1ZXN0ZWRHYW1tYUxldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbChwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEdhbW1hTGV2ZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXBBZGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXdpZGUgc3JjOwotCXdpZGUgZHN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB3aWRlIHNyYzsKKyAgICB3aWRlIGRzdDsKICNpZm5kZWYgQ29tcEFkZAotCVB5TWFjX1BSRUNIRUNLKENvbXBBZGQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBBZGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNvbXBBZGQoJnNyYywKLQkgICAgICAgICZkc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNyYywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvbXBBZGQoJnNyYywKKyAgICAgICAgJmRzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wU3ViKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl3aWRlIHNyYzsKLQl3aWRlIGRzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgd2lkZSBzcmM7CisgICAgd2lkZSBkc3Q7CiAjaWZuZGVmIENvbXBTdWIKLQlQeU1hY19QUkVDSEVDSyhDb21wU3ViKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wU3ViKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDb21wU3ViKCZzcmMsCi0JICAgICAgICAmZHN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb21wU3ViKCZzcmMsCisgICAgICAgICZkc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcE5lZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBkc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgZHN0OwogI2lmbmRlZiBDb21wTmVnCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcE5lZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcE5lZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcE5lZygmZHN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcE5lZygmZHN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wU2hpZnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXdpZGUgc3JjOwotCXNob3J0IHNoaWZ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB3aWRlIHNyYzsKKyAgICBzaG9ydCBzaGlmdDsKICNpZm5kZWYgQ29tcFNoaWZ0Ci0JUHlNYWNfUFJFQ0hFQ0soQ29tcFNoaWZ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wU2hpZnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaGlmdCkpCi0JCXJldHVybiBOVUxMOwotCUNvbXBTaGlmdCgmc3JjLAotCSAgICAgICAgICBzaGlmdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNyYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGlmdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvbXBTaGlmdCgmc3JjLAorICAgICAgICAgICAgICBzaGlmdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNyYyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcE11bChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBzcmMxOwotCWxvbmcgc3JjMjsKLQl3aWRlIGRzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBzcmMxOworICAgIGxvbmcgc3JjMjsKKyAgICB3aWRlIGRzdDsKICNpZm5kZWYgQ29tcE11bAotCVB5TWFjX1BSRUNIRUNLKENvbXBNdWwpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBNdWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjMSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyYzIpKQotCQlyZXR1cm4gTlVMTDsKLQlDb21wTXVsKHNyYzEsCi0JICAgICAgICBzcmMyLAotCSAgICAgICAgJmRzdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyYzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb21wTXVsKHNyYzEsCisgICAgICAgIHNyYzIsCisgICAgICAgICZkc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXBEaXYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCXdpZGUgbnVtZXJhdG9yOwotCWxvbmcgZGVub21pbmF0b3I7Ci0JbG9uZyByZW1haW5kZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIHdpZGUgbnVtZXJhdG9yOworICAgIGxvbmcgZGVub21pbmF0b3I7CisgICAgbG9uZyByZW1haW5kZXI7CiAjaWZuZGVmIENvbXBEaXYKLQlQeU1hY19QUkVDSEVDSyhDb21wRGl2KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wRGl2KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVub21pbmF0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb21wRGl2KCZudW1lcmF0b3IsCi0JICAgICAgICAgICAgICBkZW5vbWluYXRvciwKLQkgICAgICAgICAgICAgICZyZW1haW5kZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBudW1lcmF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbm9taW5hdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ29tcERpdigmbnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICAmcmVtYWluZGVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgbnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcEZpeE11bChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBjb21wU3JjOwotCUZpeGVkIGZpeFNyYzsKLQl3aWRlIGNvbXBEc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgY29tcFNyYzsKKyAgICBGaXhlZCBmaXhTcmM7CisgICAgd2lkZSBjb21wRHN0OwogI2lmbmRlZiBDb21wRml4TXVsCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcEZpeE11bCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcEZpeE11bCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZml4U3JjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcEZpeE11bCgmY29tcFNyYywKLQkgICAgICAgICAgIGZpeFNyYywKLQkgICAgICAgICAgICZjb21wRHN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBjb21wU3JjLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY29tcERzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmZpeFNyYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvbXBGaXhNdWwoJmNvbXBTcmMsCisgICAgICAgICAgICAgICBmaXhTcmMsCisgICAgICAgICAgICAgICAmY29tcERzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY29tcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGNvbXBEc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXBNdWxEaXYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXdpZGUgY287Ci0JbG9uZyBtdWw7Ci0JbG9uZyBkaXZpc29yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB3aWRlIGNvOworICAgIGxvbmcgbXVsOworICAgIGxvbmcgZGl2aXNvcjsKICNpZm5kZWYgQ29tcE11bERpdgotCVB5TWFjX1BSRUNIRUNLKENvbXBNdWxEaXYpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBNdWxEaXYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbXVsLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGl2aXNvcikpCi0JCXJldHVybiBOVUxMOwotCUNvbXBNdWxEaXYoJmNvLAotCSAgICAgICAgICAgbXVsLAotCSAgICAgICAgICAgZGl2aXNvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGNvKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXZpc29yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcE11bERpdigmY28sCisgICAgICAgICAgICAgICBtdWwsCisgICAgICAgICAgICAgICBkaXZpc29yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY28pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXBNdWxEaXZUcnVuYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBjbzsKLQlsb25nIG11bDsKLQlsb25nIGRpdmlzb3I7Ci0JbG9uZyByZW1haW5kZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgY287CisgICAgbG9uZyBtdWw7CisgICAgbG9uZyBkaXZpc29yOworICAgIGxvbmcgcmVtYWluZGVyOwogI2lmbmRlZiBDb21wTXVsRGl2VHJ1bmMKLQlQeU1hY19QUkVDSEVDSyhDb21wTXVsRGl2VHJ1bmMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBNdWxEaXZUcnVuYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtdWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXZpc29yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcE11bERpdlRydW5jKCZjbywKLQkgICAgICAgICAgICAgICAgbXVsLAotCSAgICAgICAgICAgICAgICBkaXZpc29yLAotCSAgICAgICAgICAgICAgICAmcmVtYWluZGVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGNvLAotCSAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGl2aXNvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvbXBNdWxEaXZUcnVuYygmY28sCisgICAgICAgICAgICAgICAgICAgIG11bCwKKyAgICAgICAgICAgICAgICAgICAgZGl2aXNvciwKKyAgICAgICAgICAgICAgICAgICAgJnJlbWFpbmRlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBjbywKKyAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXBDb21wYXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQl3aWRlIGE7Ci0Jd2lkZSBtaW51c2I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIHdpZGUgYTsKKyAgICB3aWRlIG1pbnVzYjsKICNpZm5kZWYgQ29tcENvbXBhcmUKLQlQeU1hY19QUkVDSEVDSyhDb21wQ29tcGFyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcENvbXBhcmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWludXNiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ29tcENvbXBhcmUoJmEsCi0JICAgICAgICAgICAgICAgICAgJm1pbnVzYik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWludXNiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ29tcENvbXBhcmUoJmEsCisgICAgICAgICAgICAgICAgICAgICAgJm1pbnVzYik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcFNxdWFyZVJvb3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgX3J2OwotCXdpZGUgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIF9ydjsKKyAgICB3aWRlIHNyYzsKICNpZm5kZWYgQ29tcFNxdWFyZVJvb3QKLQlQeU1hY19QUkVDSEVDSyhDb21wU3F1YXJlUm9vdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcFNxdWFyZVJvb3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmc3JjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ29tcFNxdWFyZVJvb3QoJnNyYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmc3JjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ29tcFNxdWFyZVJvb3QoJnNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRml4TXVsRGl2KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7Ci0JRml4ZWQgc3JjOwotCUZpeGVkIG11bDsKLQlGaXhlZCBkaXZpc29yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CisgICAgRml4ZWQgc3JjOworICAgIEZpeGVkIG11bDsKKyAgICBGaXhlZCBkaXZpc29yOwogI2lmbmRlZiBGaXhNdWxEaXYKLQlQeU1hY19QUkVDSEVDSyhGaXhNdWxEaXYpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpeE11bERpdik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZtdWwsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZGl2aXNvcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZpeE11bERpdihzcmMsCi0JICAgICAgICAgICAgICAgIG11bCwKLQkgICAgICAgICAgICAgICAgZGl2aXNvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJm11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZkaXZpc29yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRml4TXVsRGl2KHNyYywKKyAgICAgICAgICAgICAgICAgICAgbXVsLAorICAgICAgICAgICAgICAgICAgICBkaXZpc29yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVW5zaWduZWRGaXhNdWxEaXYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlGaXhlZCBzcmM7Ci0JRml4ZWQgbXVsOwotCUZpeGVkIGRpdmlzb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBGaXhlZCBzcmM7CisgICAgRml4ZWQgbXVsOworICAgIEZpeGVkIGRpdmlzb3I7CiAjaWZuZGVmIFVuc2lnbmVkRml4TXVsRGl2Ci0JUHlNYWNfUFJFQ0hFQ0soVW5zaWduZWRGaXhNdWxEaXYpOworICAgIFB5TWFjX1BSRUNIRUNLKFVuc2lnbmVkRml4TXVsRGl2KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJm11bCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZkaXZpc29yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVW5zaWduZWRGaXhNdWxEaXYoc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG11bCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc29yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmRpdmlzb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBVbnNpZ25lZEZpeE11bERpdihzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GaXhFeHAyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7Ci0JRml4ZWQgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CisgICAgRml4ZWQgc3JjOwogI2lmbmRlZiBGaXhFeHAyCi0JUHlNYWNfUFJFQ0hFQ0soRml4RXhwMik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRml4RXhwMik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc3JjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRml4RXhwMihzcmMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc3JjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRml4RXhwMihzcmMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GaXhMb2cyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7Ci0JRml4ZWQgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CisgICAgRml4ZWQgc3JjOwogI2lmbmRlZiBGaXhMb2cyCi0JUHlNYWNfUFJFQ0hFQ0soRml4TG9nMik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRml4TG9nMik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc3JjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRml4TG9nMihzcmMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc3JjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRml4TG9nMihzcmMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GaXhQb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlGaXhlZCBiYXNlOwotCUZpeGVkIGV4cDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIEZpeGVkIGJhc2U7CisgICAgRml4ZWQgZXhwOwogI2lmbmRlZiBGaXhQb3cKLQlQeU1hY19QUkVDSEVDSyhGaXhQb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpeFBvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZiYXNlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmV4cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZpeFBvdyhiYXNlLAotCSAgICAgICAgICAgICBleHApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmV4cCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZpeFBvdyhiYXNlLAorICAgICAgICAgICAgICAgICBleHApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZVR5cGU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlVHlwZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZVR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldERhdGFGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldERhdGFGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldERhdGFGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyB0aGVGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEZTU3BlYyB0aGVGaWxlOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YUhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YUhhbmRsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlc2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIHNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBzaXplOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFJlYWREYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBkYXRhUHRyOwotCXVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBkYXRhUHRyOworICAgIHVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFJlYWREYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRSZWFkRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRSZWFkRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0UmVhZERhdGEoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0UmVhZERhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldENsaXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmduSGFuZGxlIGNsaXBSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgUmduSGFuZGxlIGNsaXBSZ247CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0Q2xpcAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRDbGlwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRDbGlwKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0Q2xpcChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJnbkhhbmRsZSBjbGlwUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJnbkhhbmRsZSBjbGlwUmduOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldENsaXAKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRDbGlwKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpcFJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGNsaXBSZ24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldENsaXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGlwUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY2xpcFJnbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJlY3Qgc291cmNlUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IHNvdXJjZVJlY3Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0U291cmNlUmVjdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0U291cmNlUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNvdXJjZVJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzb3VyY2VSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJlY3Qgc291cmNlUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IHNvdXJjZVJlY3Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldFNvdXJjZVJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmc291cmNlUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZVJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZzb3VyY2VSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBuYXR1cmFsQm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgbmF0dXJhbEJvdW5kczsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hdHVyYWxCb3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZuYXR1cmFsQm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmF0dXJhbEJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm5hdHVyYWxCb3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0RHJhdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnREcmF3Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnREcmF3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydERyYXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0RHJhdyhjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0RHJhdyhjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JQ0dyYWZQdHIgcG9ydDsKLQlHREhhbmRsZSBnZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBDR3JhZlB0ciBwb3J0OworICAgIEdESGFuZGxlIGdkOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldEdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JQ0dyYWZQdHIgcG9ydDsKLQlHREhhbmRsZSBnZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBDR3JhZlB0ciBwb3J0OworICAgIEdESGFuZGxlIGdkOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBnZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRCb3VuZHNSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRCb3VuZHNSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRCb3VuZHNSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0Qm91bmRzUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEJvdW5kc1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0Qm91bmRzUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0Qm91bmRzUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyBmc3M7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIGZzczsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2F2ZUFzUGljdHVyZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGdyYXBoaWNzTW9kZTsKLQlSR0JDb2xvciBvcENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgZ3JhcGhpY3NNb2RlOworICAgIFJHQkNvbG9yIG9wQ29sb3I7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZncmFwaGljc01vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZvcENvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY3NNb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JhcGhpY3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmb3BDb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBncmFwaGljc01vZGU7Ci0JUkdCQ29sb3Igb3BDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIGdyYXBoaWNzTW9kZTsKKyAgICBSR0JDb2xvciBvcENvbG9yOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEdyYXBoaWNzTW9kZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEdyYXBoaWNzTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYXBoaWNzTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBncmFwaGljc01vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3BDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZncmFwaGljc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm9wQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlDb2RlY1EgcXVhbGl0eTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBDb2RlY1EgcXVhbGl0eTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRRdWFsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRRdWFsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRRdWFsaXR5KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlDb2RlY1EgcXVhbGl0eTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBDb2RlY1EgcXVhbGl0eTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldFF1YWxpdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldFF1YWxpdHkoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgZnNzOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEZTU3BlYyBmc3M7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGxpbWl0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBsaW1pdDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldEFsaWFzZWREYXRhUmVmZXJlbmNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFZhbGlkYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gdmFsaWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiB2YWxpZDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0VmFsaWRhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0VmFsaWRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0VmFsaWRhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHZhbGlkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHVzZXJEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiB1c2VyRGF0YTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VyRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldE1JTUVUeXBlTGlzdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldE1JTUVUeXBlTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXJQdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldE1JTUVUeXBlTGlzdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jc2hvcnQgZHJhd3NBbGxQaXhlbHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgc2hvcnQgZHJhd3NBbGxQaXhlbHM7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydERvZXNEcmF3QWxsUGl4ZWxzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydERvZXNEcmF3QWxsUGl4ZWxzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydERvZXNEcmF3QWxsUGl4ZWxzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyYXdzQWxsUGl4ZWxzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkcmF3c0FsbFBpeGVscyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJhd3NBbGxQaXhlbHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdzQWxsUGl4ZWxzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEFzUGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlQaWNIYW5kbGUgcGljdHVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBQaWNIYW5kbGUgcGljdHVyZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEFzUGljdHVyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWN0dXJlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGljdHVyZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWN0dXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGljdHVyZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCU9TVHlwZSBmaWxlQ3JlYXRvcjsKLQlGU1NwZWMgZnNzOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgRlNTcGVjIGZzczsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEV4cG9ydEltYWdlVHlwZUxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEV4cG9ydEltYWdlVHlwZUxpc3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEV4cG9ydEltYWdlVHlwZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXJQdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RXhwb3J0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXI7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0RXhwb3J0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RXhwb3J0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIGltYWdlQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBpbWFnZUNvdW50OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEltYWdlQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEltYWdlQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VDb3VudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlQ291bnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIGltYWdlSW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBpbWFnZUluZGV4OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXgKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXgoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgaW1hZ2VJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIGltYWdlSW5kZXg7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXdpZGUgb2Zmc2V0OwotCXdpZGUgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB3aWRlIHNpemU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0UmVhZERhdGE2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogZGF0YVB0cjsKLQl3aWRlIGRhdGFPZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB2b2lkICogZGF0YVB0cjsKKyAgICB3aWRlIGRhdGFPZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc08mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0UmVhZERhdGE2NChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXdpZGUgb2Zmc2V0OwotCXdpZGUgbGltaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgd2lkZSBvZmZzZXQ7CisgICAgd2lkZSBsaW1pdDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZsaW1pdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmxpbWl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB3aWRlIGxpbWl0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgbGltaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBsaW1pdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZ25IYW5kbGUgZGVmYXVsdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZ25IYW5kbGUgZGVmYXVsdFJnbjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdFJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlZmF1bHRSZ24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZWZhdWx0UmduKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBkZWZhdWx0R3JhcGhpY3NNb2RlOwotCVJHQkNvbG9yIGRlZmF1bHRPcENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgZGVmYXVsdEdyYXBoaWNzTW9kZTsKKyAgICBSR0JDb2xvciBkZWZhdWx0T3BDb2xvcjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRHcmFwaGljc01vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0T3BDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0R3JhcGhpY3NNb2RlLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmRlZmF1bHRPcENvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdEdyYXBoaWNzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRPcENvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRHcmFwaGljc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmZGVmYXVsdE9wQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdFNvdXJjZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBkZWZhdWx0U291cmNlUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRlZmF1bHRTb3VyY2VSZWN0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0U291cmNlUmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRlZmF1bHRTb3VyY2VSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0U291cmNlUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRlZmF1bHRTb3VyY2VSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldENvbG9yU3luY1Byb2ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIHByb2ZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIHByb2ZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldENvbG9yU3luY1Byb2ZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9maWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcHJvZmlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2ZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwcm9maWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldERlc3RSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJlY3QgZGVzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgUmVjdCBkZXN0UmVjdDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZGVzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldERlc3RSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGVzdFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBkZXN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRlc3RSZWN0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRlc3RSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRlc3RSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRGbGFncwotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RmxhZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RmxhZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEZsYWdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXdpZGUgb2Zmc2V0OwotCXdpZGUgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB3aWRlIHNpemU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbChjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnREb0V4cG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIGFjdHVhbFNpemVXcml0dGVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgYWN0dWFsU2l6ZVdyaXR0ZW47CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0RG9FeHBvcnQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydERvRXhwb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydERvRXhwb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydERvRXhwb3J0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbFNpemVXcml0dGVuKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTaXplV3JpdHRlbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0RG9FeHBvcnQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0dWFsU2l6ZVdyaXR0ZW4pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNpemVXcml0dGVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydENhblRyYW5zY29kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGNhblRyYW5zY29kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGNhblRyYW5zY29kZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRDYW5UcmFuc2NvZGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRDYW5UcmFuc2NvZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5UcmFuc2NvZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGNhblRyYW5zY29kZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5UcmFuc2NvZGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhblRyYW5zY29kZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBjYW5Vc2VDb21wcmVzc29yOwotCXZvaWQgKiBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lclB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGNhblVzZUNvbXByZXNzb3I7CisgICAgdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3Nvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRDYW5Vc2VDb21wcmVzc29yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FuVXNlQ29tcHJlc3NvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNTZXR0aW5nc0F0b21Db250YWluZXJQdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGNhblVzZUNvbXByZXNzb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNTZXR0aW5nc0F0b21Db250YWluZXJQdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5Vc2VDb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lclB0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FuVXNlQ29tcHJlc3Nvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgb3V0RGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBvdXREZXNjOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3Nvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNTZXR0aW5nc0F0b21Db250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvdXREZXNjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNTZXR0aW5nc0F0b21Db250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvdXREZXNjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0KGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVUeXBlQW5kQ3JlYXRvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBPU1R5cGUgZmlsZUNyZWF0b3I7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVUeXBlQW5kQ3JlYXRvcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVUeXBlQW5kQ3JlYXRvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlVHlwZUFuZENyZWF0b3IoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVDcmVhdG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVDcmVhdG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlQ3JlYXRvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlQ3JlYXRvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBmaWxlTmFtZUV4dGVuc2lvbjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVOYW1lRXh0ZW5zaW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlTmFtZUV4dGVuc2lvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlTmFtZUV4dGVuc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVOYW1lRXh0ZW5zaW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlTmFtZUV4dGVuc2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlTmFtZUV4dGVuc2lvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXJQdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXI7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc0F0b21Db250YWluZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc0F0b21Db250YWluZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgdGhlVGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgdGhlVGV4dDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc1RleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc1RleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc1RleHQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlVGV4dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVRleHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVRleHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVUZXh0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldERvbnRSZWNvbXByZXNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gZG9udFJlY29tcHJlc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBkb250UmVjb21wcmVzczsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcwotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkb250UmVjb21wcmVzcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb250UmVjb21wcmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkb250UmVjb21wcmVzcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb250UmVjb21wcmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGRvbnRSZWNvbXByZXNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gZG9udFJlY29tcHJlc3M7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldERvbnRSZWNvbXByZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldERvbnRSZWNvbXByZXNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldERvbnRSZWNvbXByZXNzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvbnRSZWNvbXByZXNzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkb250UmVjb21wcmVzcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9udFJlY29tcHJlc3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRSZWNvbXByZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldEludGVybGFjZVN0eWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBpbnRlcmxhY2VTdHlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmxhY2VTdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxhY2VTdHlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmxhY2VTdHlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxhY2VTdHlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIGludGVybGFjZVN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldEludGVybGFjZVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldEludGVybGFjZVN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldEludGVybGFjZVN0eWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybGFjZVN0eWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnRlcmxhY2VTdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJsYWNlU3R5bGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZVN0eWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldE1ldGFEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiB1c2VyRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB2b2lkICogdXNlckRhdGE7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE1ldGFEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE1ldGFEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXNlckRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldE1ldGFEYXRhKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlckRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE1ldGFEYXRhKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0TWV0YURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHVzZXJEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiB1c2VyRGF0YTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0TWV0YURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0TWV0YURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VyRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0TWV0YURhdGEoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0TWV0YURhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRUYXJnZXREYXRhU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgdGFyZ2V0RGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0RGF0YVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0RGF0YVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyB0YXJnZXREYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRUYXJnZXREYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRUYXJnZXREYXRhU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRUYXJnZXREYXRhU2l6ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXREYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldERhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvbk1ldGhvZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGNvbXByZXNzaW9uTWV0aG9kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgY29tcHJlc3Npb25NZXRob2Q7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25NZXRob2QpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25NZXRob2QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25NZXRob2QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25NZXRob2QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBjb21wcmVzc2lvbk1ldGhvZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIGNvbXByZXNzaW9uTWV0aG9kOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvbk1ldGhvZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvbk1ldGhvZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvbk1ldGhvZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbk1ldGhvZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25NZXRob2QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzaW9uTWV0aG9kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk1ldGhvZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvblF1YWxpdHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQ29kZWNRIHNwYXRpYWxRdWFsaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvblF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvblF1YWxpdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25RdWFsaXR5KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvblF1YWxpdHkoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25RdWFsaXR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUNvZGVjUSBzcGF0aWFsUXVhbGl0eTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBDb2RlY1Egc3BhdGlhbFF1YWxpdHk7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25RdWFsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25RdWFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uOwotCUZpeGVkIHZlcnRpY2FsUmVzb2x1dGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBGaXhlZCBob3Jpem9udGFsUmVzb2x1dGlvbjsKKyAgICBGaXhlZCB2ZXJ0aWNhbFJlc29sdXRpb247CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0UmVzb2x1dGlvbgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0UmVzb2x1dGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmhvcml6b250YWxSZXNvbHV0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnZlcnRpY2FsUmVzb2x1dGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0UmVzb2x1dGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbFJlc29sdXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsUmVzb2x1dGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaG9yaXpvbnRhbFJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmdmVydGljYWxSZXNvbHV0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWxSZXNvbHV0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JRml4ZWQgaG9yaXpvbnRhbFJlc29sdXRpb247Ci0JRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uOworICAgIEZpeGVkIHZlcnRpY2FsUmVzb2x1dGlvbjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRSZXNvbHV0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRSZXNvbHV0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6b250YWxSZXNvbHV0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydGljYWxSZXNvbHV0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBob3Jpem9udGFsUmVzb2x1dGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCB2ZXJ0aWNhbFJlc29sdXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZob3Jpem9udGFsUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnRpY2FsUmVzb2x1dGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaG9yaXpvbnRhbFJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgdmVydGljYWxSZXNvbHV0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldERlcHRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgZGVwdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBkZXB0aDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXREZXB0aAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0RGVwdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0RGVwdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0RGVwdGgoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0RGVwdGgoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXREZXB0aChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGRlcHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgZGVwdGg7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0RGVwdGgKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldERlcHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldERlcHRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldERlcHRoKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkZXB0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RGVwdGgoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldENvbG9yU3luY1Byb2ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0Q29sb3JTeW5jUHJvZmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0Q29sb3JTeW5jUHJvZmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb2xvclN5bmNQcm9maWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclN5bmNQcm9maWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29sb3JTeW5jUHJvZmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0Q29sb3JTeW5jUHJvZmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTeW5jUHJvZmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRDb2xvclN5bmNQcm9maWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBjb2xvclN5bmNQcm9maWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBjb2xvclN5bmNQcm9maWxlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRDb2xvclN5bmNQcm9maWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JTeW5jUHJvZmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGNvbG9yU3luY1Byb2ZpbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclN5bmNQcm9maWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29sb3JTeW5jUHJvZmlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldElucHV0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0RGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0RGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFSZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldElucHV0RmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldElucHV0RmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0RmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyB0aGVGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEZTU3BlYyB0aGVGaWxlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldElucHV0RmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0RmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGg7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBoOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0cihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlQdHIgcDsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIFB0ciBwOworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0UHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0UHRyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGdyaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgZ3JpcDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZncmlwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZncmlwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgZ3JpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ3JpcCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZncmlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGdyaXApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVBpY0hhbmRsZSBwaWN0dXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIFBpY0hhbmRsZSBwaWN0dXJlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldElucHV0UGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0UGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGljdHVyZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaWN0dXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JUGljSGFuZGxlIHBpY3R1cmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUGljSGFuZGxlIHBpY3R1cmU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0UGljdHVyZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGljdHVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHBpY3R1cmUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0UGljdHVyZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGljdHVyZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHBpY3R1cmUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JR1dvcmxkUHRyIGd3b3JsZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBHV29ybGRQdHIgZ3dvcmxkOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3dvcmxkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd3b3JsZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfQ29udmVydCwgJmd3b3JsZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHV29ybGQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnd29ybGQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JR1dvcmxkUHRyIGd3b3JsZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBHV29ybGRQdHIgZ3dvcmxkOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnd29ybGQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfTmV3LCBnd29ybGQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmd3b3JsZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGd3b3JsZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlQaXhNYXBIYW5kbGUgcGl4bWFwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIFBpeE1hcEhhbmRsZSBwaXhtYXA7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXAKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhtYXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4bWFwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGl4bWFwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeG1hcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlQaXhNYXBIYW5kbGUgcGl4bWFwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIFBpeE1hcEhhbmRsZSBwaXhtYXA7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXAKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0UGl4bWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0UGl4bWFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0UGl4bWFwKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpeG1hcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHBpeG1hcCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl4bWFwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGl4bWFwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldElucHV0T2Zmc2V0QW5kTGltaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGxpbWl0OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldElucHV0T2Zmc2V0QW5kTGltaXQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0T2Zmc2V0QW5kTGltaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0T2Zmc2V0QW5kTGltaXQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbGltaXQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0T2Zmc2V0QW5kTGltaXQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIG1heVJlYWRJbnB1dERhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBtYXlSZWFkSW5wdXREYXRhOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRNYXlFeHBvcnRlclJlYWRJbnB1dERhdGEoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heVJlYWRJbnB1dERhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1heVJlYWRJbnB1dERhdGEpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF5UmVhZElucHV0RGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF5UmVhZElucHV0RGF0YSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBkYXRhUHRyOwotCXVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBkYXRhUHRyOworICAgIHVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGltZW5zaW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IGRpbWVuc2lvbnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUmVjdCBkaW1lbnNpb25zOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGltZW5zaW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGltZW5zaW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGltZW5zaW9ucyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaW1lbnNpb25zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGltZW5zaW9ucyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURpbWVuc2lvbnMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGltZW5zaW9ucyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRpbWVuc2lvbnMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgaW5wdXREZXB0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIGlucHV0RGVwdGg7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXB0aChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXREZXB0aCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXB0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlcHRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlcHRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUNHcmFmUHRyIGd3OwotCUdESGFuZGxlIGdkOwotCVJlY3Qgc3JjUmVjdDsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgQ0dyYWZQdHIgZ3c7CisgICAgR0RIYW5kbGUgZ2Q7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZndywKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd3LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyB0aGVGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEZTU3BlYyB0aGVGaWxlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIG1heFNpemU7Ci0JQm9vbGVhbiB0cnVuY2F0ZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBtYXhTaXplOworICAgIEJvb2xlYW4gdHJ1bmNhdGVGaWxlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRydW5jYXRlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJ1bmNhdGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydW5jYXRlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKLQlCb29sZWFuIHRydW5jYXRlRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIG1heFNpemU7CisgICAgQm9vbGVhbiB0cnVuY2F0ZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJ1bmNhdGVGaWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICBtYXhTaXplLAotCSAgICAgICAgICAgICAgICAgICAgIHRydW5jYXRlRmlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVuY2F0ZUZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVGaWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBPU1R5cGUgZmlsZUNyZWF0b3I7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZUNyZWF0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ3JlYXRvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlQ3JlYXRvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDcmVhdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBPU1R5cGUgZmlsZUNyZWF0b3I7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVDcmVhdG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVDcmVhdG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlQ3JlYXRvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlQ3JlYXRvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgbWFyazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG1hcms7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0TWFyawotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0TWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWFyaykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0TWFyayhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXJrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBtYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgbWFyazsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyayhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcmspOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1hcmspOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmsoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXJrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBkYXRhUHRyOwotCXVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBkYXRhUHRyOworICAgIHVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBlbmFibGVUaHVtYm5haWw7Ci0JbG9uZyBtYXhUaHVtYm5haWxXaWR0aDsKLQlsb25nIG1heFRodW1ibmFpbEhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGVuYWJsZVRodW1ibmFpbDsKKyAgICBsb25nIG1heFRodW1ibmFpbFdpZHRoOworICAgIGxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlVGh1bWJuYWlsLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4VGh1bWJuYWlsV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhUaHVtYm5haWxIZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVRodW1ibmFpbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRodW1ibmFpbEhlaWdodCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZVRodW1ibmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VGh1bWJuYWlsSGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRUaHVtYm5haWxFbmFibGVkKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVUaHVtYm5haWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRodW1ibmFpbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUaHVtYm5haWxIZWlnaHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0VGh1bWJuYWlsRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIHRodW1ibmFpbEVuYWJsZWQ7Ci0JbG9uZyBtYXhUaHVtYm5haWxXaWR0aDsKLQlsb25nIG1heFRodW1ibmFpbEhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIHRodW1ibmFpbEVuYWJsZWQ7CisgICAgbG9uZyBtYXhUaHVtYm5haWxXaWR0aDsKKyAgICBsb25nIG1heFRodW1ibmFpbEhlaWdodDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0VGh1bWJuYWlsRW5hYmxlZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRodW1ibmFpbEVuYWJsZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhUaHVtYm5haWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbEhlaWdodCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWxFbmFibGVkLAotCSAgICAgICAgICAgICAgICAgICAgIG1heFRodW1ibmFpbFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgIG1heFRodW1ibmFpbEhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0VGh1bWJuYWlsRW5hYmxlZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRodW1ibmFpbEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhUaHVtYm5haWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbEhlaWdodCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWxFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRodW1ibmFpbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRodW1ibmFpbEhlaWdodCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRFeGlmRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGVuYWJsZUV4aWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBlbmFibGVFeGlmOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRFeGlmRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRFeGlmRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZUV4aWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlRXhpZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVFeGlmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRFeGlmRW5hYmxlZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUV4aWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0RXhpZkVuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBleGlmRW5hYmxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGV4aWZFbmFibGVkOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleGlmRW5hYmxlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZXhpZkVuYWJsZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4aWZFbmFibGVkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleGlmRW5hYmxlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgc3JjRGVzYzsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRzdERlc2M7Ci0Jdm9pZCAqIGRhdGE7Ci0JbG9uZyBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgc3JjRGVzYzsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRzdERlc2M7CisgICAgdm9pZCAqIGRhdGE7CisgICAgbG9uZyBkYXRhU2l6ZTsKICNpZm5kZWYgSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZQotCVB5TWFjX1BSRUNIRUNLKEltYWdlVHJhbnNjb2RlckJlZ2luU2VxdWVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEltYWdlVHJhbnNjb2RlckJlZ2luU2VxdWVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY0Rlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlKGl0YywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0Rlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0RGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRzdERlc2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJml0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZShpdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkc3REZXNjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9JbWFnZVRyYW5zY29kZXJEaXNwb3NlRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjOwotCXZvaWQgKiBkc3REYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7CisgICAgdm9pZCAqIGRzdERhdGE7CiAjaWZuZGVmIEltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJml0YywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJbWFnZVRyYW5zY29kZXJEaXNwb3NlRGF0YShpdGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0RGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhKGl0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9JbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7CiAjaWZuZGVmIEltYWdlVHJhbnNjb2RlckVuZFNlcXVlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEltYWdlVHJhbnNjb2RlckVuZFNlcXVlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UoaXRjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJml0YykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEltYWdlVHJhbnNjb2RlckVuZFNlcXVlbmNlKGl0Yyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2xvY2tHZXRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGFDbG9jazsKLQlUaW1lUmVjb3JkIG91dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhQ2xvY2s7CisgICAgVGltZVJlY29yZCBvdXQ7CiAjaWZuZGVmIENsb2NrR2V0VGltZQotCVB5TWFjX1BSRUNIRUNLKENsb2NrR2V0VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvY2tHZXRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYUNsb2NrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2xvY2tHZXRUaW1lKGFDbG9jaywKLQkgICAgICAgICAgICAgICAgICAgJm91dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZvdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYUNsb2NrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ2xvY2tHZXRUaW1lKGFDbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgJm91dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZvdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0Nsb2NrU2V0VGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOwotCVRpbWVCYXNlIHRiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFDbG9jazsKKyAgICBUaW1lQmFzZSB0YjsKICNpZm5kZWYgQ2xvY2tTZXRUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKENsb2NrU2V0VGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb2NrU2V0VGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFDbG9jaywKLQkgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJnRiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2xvY2tTZXRUaW1lQmFzZShhQ2xvY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICB0Yik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFDbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJnRiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ2xvY2tTZXRUaW1lQmFzZShhQ2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2xvY2tHZXRSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGFDbG9jazsKLQlGaXhlZCByYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFDbG9jazsKKyAgICBGaXhlZCByYXRlOwogI2lmbmRlZiBDbG9ja0dldFJhdGUKLQlQeU1hY19QUkVDSEVDSyhDbG9ja0dldFJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb2NrR2V0UmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFDbG9jaykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENsb2NrR2V0UmF0ZShhQ2xvY2ssCi0JICAgICAgICAgICAgICAgICAgICZyYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgcmF0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhQ2xvY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDbG9ja0dldFJhdGUoYUNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAmcmF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIHJhdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDUG9zaXRpb25SZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVJlY3QgcnA7Ci0JUG9pbnQgd2hlcmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUmVjdCBycDsKKyAgICBQb2ludCB3aGVyZTsKICNpZm5kZWYgU0NQb3NpdGlvblJlY3QKLQlQeU1hY19QUkVDSEVDSyhTQ1Bvc2l0aW9uUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NQb3NpdGlvblJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDUG9zaXRpb25SZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICZycCwKLQkgICAgICAgICAgICAgICAgICAgICAmd2hlcmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJwLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHdoZXJlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NQb3NpdGlvblJlY3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgd2hlcmUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDUG9zaXRpb25EaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0Jc2hvcnQgaWQ7Ci0JUG9pbnQgd2hlcmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgc2hvcnQgaWQ7CisgICAgUG9pbnQgd2hlcmU7CiAjaWZuZGVmIFNDUG9zaXRpb25EaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhTQ1Bvc2l0aW9uRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1Bvc2l0aW9uRGlhbG9nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ1Bvc2l0aW9uRGlhbG9nKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgaWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAmd2hlcmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDUG9zaXRpb25EaWFsb2coY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHdoZXJlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JUGljSGFuZGxlIHRlc3RQaWN0OwotCVJlY3QgdGVzdFJlY3Q7Ci0Jc2hvcnQgdGVzdEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpY0hhbmRsZSB0ZXN0UGljdDsKKyAgICBSZWN0IHRlc3RSZWN0OworICAgIHNob3J0IHRlc3RGbGFnczsKICNpZm5kZWYgU0NTZXRUZXN0SW1hZ2VQaWN0SGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soU0NTZXRUZXN0SW1hZ2VQaWN0SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZXN0UGljdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDU2V0VGVzdEltYWdlUGljdEhhbmRsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBpY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGVzdFBpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RQaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRlc3RSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ1NldFRlc3RJbWFnZVBpY3RGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCXNob3J0IHRlc3RGaWxlUmVmOwotCVJlY3QgdGVzdFJlY3Q7Ci0Jc2hvcnQgdGVzdEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIHNob3J0IHRlc3RGaWxlUmVmOworICAgIFJlY3QgdGVzdFJlY3Q7CisgICAgc2hvcnQgdGVzdEZsYWdzOwogI2lmbmRlZiBTQ1NldFRlc3RJbWFnZVBpY3RGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0RmlsZVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDU2V0VGVzdEltYWdlUGljdEZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RmlsZVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRlc3RSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0RmlsZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDU2V0VGVzdEltYWdlUGljdEZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RmlsZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRlc3RSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ1NldFRlc3RJbWFnZVBpeE1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaXhNYXBIYW5kbGUgdGVzdFBpeE1hcDsKLQlSZWN0IHRlc3RSZWN0OwotCXNob3J0IHRlc3RGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQaXhNYXBIYW5kbGUgdGVzdFBpeE1hcDsKKyAgICBSZWN0IHRlc3RSZWN0OworICAgIHNob3J0IHRlc3RGbGFnczsKICNpZm5kZWYgU0NTZXRUZXN0SW1hZ2VQaXhNYXAKLQlQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpeE1hcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NTZXRUZXN0SW1hZ2VQaXhNYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZXN0UGl4TWFwLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaXhNYXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBpeE1hcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGVzdFBpeE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDU2V0VGVzdEltYWdlUGl4TWFwKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RQaXhNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRlc3RSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ0dldEJlc3REZXZpY2VSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIFNDR2V0QmVzdERldmljZVJlY3QKLQlQeU1hY19QUkVDSEVDSyhTQ0dldEJlc3REZXZpY2VSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0dldEJlc3REZXZpY2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0dldEJlc3REZXZpY2VSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NHZXRCZXN0RGV2aWNlUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKICNpZm5kZWYgU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNDUmVxdWVzdEltYWdlU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDUmVxdWVzdEltYWdlU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDUmVxdWVzdEltYWdlU2V0dGluZ3MoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1JlcXVlc3RJbWFnZVNldHRpbmdzKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ0NvbXByZXNzSW1hZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JUGl4TWFwSGFuZGxlIHNyYzsKLQlSZWN0IHNyY1JlY3Q7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCUhhbmRsZSBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBIYW5kbGUgZGF0YTsKICNpZm5kZWYgU0NDb21wcmVzc0ltYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc0ltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzSW1hZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDQ29tcHJlc3NJbWFnZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGEpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0NvbXByZXNzSW1hZ2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ0NvbXByZXNzUGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaWNIYW5kbGUgc3JjUGljdHVyZTsKLQlQaWNIYW5kbGUgZHN0UGljdHVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQaWNIYW5kbGUgc3JjUGljdHVyZTsKKyAgICBQaWNIYW5kbGUgZHN0UGljdHVyZTsKICNpZm5kZWYgU0NDb21wcmVzc1BpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzUGljdHVyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1BpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RQaWN0dXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NDb21wcmVzc1BpY3R1cmUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkc3RQaWN0dXJlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBpY3R1cmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0NvbXByZXNzUGljdHVyZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFBpY3R1cmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NQaWN0dXJlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlzaG9ydCBzcmNSZWZOdW07Ci0Jc2hvcnQgZHN0UmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIHNob3J0IHNyY1JlZk51bTsKKyAgICBzaG9ydCBkc3RSZWZOdW07CiAjaWZuZGVmIFNDQ29tcHJlc3NQaWN0dXJlRmlsZQotCVB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NQaWN0dXJlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1BpY3R1cmVGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDQ29tcHJlc3NQaWN0dXJlRmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RSZWZOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NQaWN0dXJlRmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RSZWZOdW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CiAjaWZuZGVmIFNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTQ1JlcXVlc3RTZXF1ZW5jZVNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1JlcXVlc3RTZXF1ZW5jZVNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ1JlcXVlc3RTZXF1ZW5jZVNldHRpbmdzKGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncyhjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JUGl4TWFwSGFuZGxlIHNyYzsKLQlSZWN0IHNyY1JlY3Q7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKICNpZm5kZWYgU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4KLQlQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzU2VxdWVuY2VCZWdpbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlc2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0NvbXByZXNzU2VxdWVuY2VCZWdpbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ0NvbXByZXNzU2VxdWVuY2VGcmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCVJlY3Qgc3JjUmVjdDsKLQlIYW5kbGUgZGF0YTsKLQlsb25nIGRhdGFTaXplOwotCXNob3J0IG5vdFN5bmNGbGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIEhhbmRsZSBkYXRhOworICAgIGxvbmcgZGF0YVNpemU7CisgICAgc2hvcnQgbm90U3luY0ZsYWc7CiAjaWZuZGVmIFNDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0NvbXByZXNzU2VxdWVuY2VGcmFtZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub3RTeW5jRmxhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICBub3RTeW5jRmxhZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vdFN5bmNGbGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vdFN5bmNGbGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ0NvbXByZXNzU2VxdWVuY2VFbmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CiAjaWZuZGVmIFNDQ29tcHJlc3NTZXF1ZW5jZUVuZAotCVB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NTZXF1ZW5jZUVuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1NlcXVlbmNlRW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0NvbXByZXNzU2VxdWVuY2VFbmQoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0NvbXByZXNzU2VxdWVuY2VFbmQoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaWNIYW5kbGUgc3JjUGljdHVyZTsKLQlzaG9ydCBtb3Rpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGljSGFuZGxlIHNyY1BpY3R1cmU7CisgICAgc2hvcnQgbW90aW9uOwogI2lmbmRlZiBTQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BpY3R1cmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3Rpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BpY3R1cmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW90aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0Jc2hvcnQgc3JjUmVmOwotCXNob3J0IG1vdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBzaG9ydCBzcmNSZWY7CisgICAgc2hvcnQgbW90aW9uOwogI2lmbmRlZiBTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0NEZWZhdWx0UGljdEZpbGVTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NEZWZhdWx0UGljdEZpbGVTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3Rpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ0RlZmF1bHRQaXhNYXBTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCXNob3J0IG1vdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQaXhNYXBIYW5kbGUgc3JjOworICAgIHNob3J0IG1vdGlvbjsKICNpZm5kZWYgU0NEZWZhdWx0UGl4TWFwU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTQ0RlZmF1bHRQaXhNYXBTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NEZWZhdWx0UGl4TWFwU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3Rpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0RlZmF1bHRQaXhNYXBTZXR0aW5ncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDRGVmYXVsdFBpeE1hcFNldHRpbmdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDR2V0SW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlPU1R5cGUgaW5mb1R5cGU7Ci0Jdm9pZCAqIGluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgT1NUeXBlIGluZm9UeXBlOworICAgIHZvaWQgKiBpbmZvOwogI2lmbmRlZiBTQ0dldEluZm8KLQlQeU1hY19QUkVDSEVDSyhTQ0dldEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNDR2V0SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0dldEluZm8oY2ksCi0JICAgICAgICAgICAgICAgIGluZm9UeXBlLAotCSAgICAgICAgICAgICAgICBpbmZvKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0dldEluZm8oY2ksCisgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgICAgICAgICAgICAgICAgICBpbmZvKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ1NldEluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JT1NUeXBlIGluZm9UeXBlOwotCXZvaWQgKiBpbmZvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIE9TVHlwZSBpbmZvVHlwZTsKKyAgICB2b2lkICogaW5mbzsKICNpZm5kZWYgU0NTZXRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soU0NTZXRJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1NldEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NTZXRJbmZvKGNpLAotCSAgICAgICAgICAgICAgICBpbmZvVHlwZSwKLQkgICAgICAgICAgICAgICAgaW5mbyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NTZXRJbmZvKGNpLAorICAgICAgICAgICAgICAgICAgICBpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW5mbyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NTZXRDb21wcmVzc0ZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0NTZXRDb21wcmVzc0ZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU0NTZXRDb21wcmVzc0ZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1NldENvbXByZXNzRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDU2V0Q29tcHJlc3NGbGFncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1NldENvbXByZXNzRmxhZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ0dldENvbXByZXNzRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTQ0dldENvbXByZXNzRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTQ0dldENvbXByZXNzRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDR2V0Q29tcHJlc3NGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NHZXRDb21wcmVzc0ZsYWdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NHZXRDb21wcmVzc0ZsYWdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ0dldFNldHRpbmdzQXNUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCUhhbmRsZSB0ZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIEhhbmRsZSB0ZXh0OwogI2lmbmRlZiBTQ0dldFNldHRpbmdzQXNUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soU0NHZXRTZXR0aW5nc0FzVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NHZXRTZXR0aW5nc0FzVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NHZXRTZXR0aW5nc0FzVGV4dChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGV4dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDR2V0U2V0dGluZ3NBc1RleHQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRleHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQXN5bmNJZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOwogI2lmbmRlZiBTQ0FzeW5jSWRsZQotCVB5TWFjX1BSRUNIRUNLKFNDQXN5bmNJZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0FzeW5jSWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NBc3luY0lkbGUoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0FzeW5jSWRsZShjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHdlZW5lclJlc2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR3ZWVuZXJDb21wb25lbnQgdGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHdlZW5lckNvbXBvbmVudCB0YzsKICNpZm5kZWYgVHdlZW5lclJlc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soVHdlZW5lclJlc2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUd2VlbmVyUmVzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0YykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR3ZWVuZXJSZXNldCh0Yyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0YykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR3ZWVuZXJSZXNldCh0Yyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVENHZXRTb3VyY2VSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZXJFcnJvciBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVDb2RlRGVzY3JpcHRpb25IYW5kbGUgdGNkSDsKLQlVc2VyRGF0YSBzcmVmSDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlckVycm9yIF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RIOworICAgIFVzZXJEYXRhIHNyZWZIOwogI2lmbmRlZiBUQ0dldFNvdXJjZVJlZgotCVB5TWFjX1BSRUNIRUNLKFRDR2V0U291cmNlUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUQ0dldFNvdXJjZVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGNkSCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRDR2V0U291cmNlUmVmKG1oLAotCSAgICAgICAgICAgICAgICAgICAgIHRjZEgsCi0JICAgICAgICAgICAgICAgICAgICAgJnNyZWZIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCBzcmVmSCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRjZEgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUQ0dldFNvdXJjZVJlZihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0Y2RILAorICAgICAgICAgICAgICAgICAgICAgICAgICZzcmVmSCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX05ldywgc3JlZkgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RDU2V0U291cmNlUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGVyRXJyb3IgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlUaW1lQ29kZURlc2NyaXB0aW9uSGFuZGxlIHRjZEg7Ci0JVXNlckRhdGEgc3JlZkg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZXJFcnJvciBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFRpbWVDb2RlRGVzY3JpcHRpb25IYW5kbGUgdGNkSDsKKyAgICBVc2VyRGF0YSBzcmVmSDsKICNpZm5kZWYgVENTZXRTb3VyY2VSZWYKLQlQeU1hY19QUkVDSEVDSyhUQ1NldFNvdXJjZVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVENTZXRTb3VyY2VSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGNkSCwKLQkgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJnNyZWZIKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVENTZXRTb3VyY2VSZWYobWgsCi0JICAgICAgICAgICAgICAgICAgICAgdGNkSCwKLQkgICAgICAgICAgICAgICAgICAgICBzcmVmSCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGNkSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJnNyZWZIKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVENTZXRTb3VyY2VSZWYobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGNkSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmVmSCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVENTZXRUaW1lQ29kZUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGVyRXJyb3IgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYWdzOwotCWxvbmcgZmxhZ3NNYXNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGVyRXJyb3IgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZsYWdzOworICAgIGxvbmcgZmxhZ3NNYXNrOwogI2lmbmRlZiBUQ1NldFRpbWVDb2RlRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhUQ1NldFRpbWVDb2RlRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFRDU2V0VGltZUNvZGVGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRDU2V0VGltZUNvZGVGbGFncyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUQ1NldFRpbWVDb2RlRmxhZ3MobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RDR2V0VGltZUNvZGVGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlckVycm9yIF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlckVycm9yIF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgVENHZXRUaW1lQ29kZUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soVENHZXRUaW1lQ29kZUZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUQ0dldFRpbWVDb2RlRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRDR2V0VGltZUNvZGVGbGFncyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRDR2V0VGltZUNvZGVGbGFncyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFIOwotCU1vdmllIHRoZU1vdmllOwotCVRyYWNrIHRhcmdldFRyYWNrOwotCVRyYWNrIHVzZWRUcmFjazsKLQlUaW1lVmFsdWUgYXRUaW1lOwotCVRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uOwotCWxvbmcgaW5GbGFnczsKLQlsb25nIG91dEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhSDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBUcmFjayB0YXJnZXRUcmFjazsKKyAgICBUcmFjayB1c2VkVHJhY2s7CisgICAgVGltZVZhbHVlIGF0VGltZTsKKyAgICBUaW1lVmFsdWUgYWRkZWREdXJhdGlvbjsKKyAgICBsb25nIGluRmxhZ3M7CisgICAgbG9uZyBvdXRGbGFnczsKICNpZm5kZWYgTW92aWVJbXBvcnRIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFILAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0YXJnZXRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydEhhbmRsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSCwKLQkgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGF0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmYWRkZWREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCB1c2VkVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgYWRkZWREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFILAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0YXJnZXRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydEhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRkZWREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCB1c2VkVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyB0aGVGaWxlOwotCU1vdmllIHRoZU1vdmllOwotCVRyYWNrIHRhcmdldFRyYWNrOwotCVRyYWNrIHVzZWRUcmFjazsKLQlUaW1lVmFsdWUgYXRUaW1lOwotCVRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uOwotCWxvbmcgaW5GbGFnczsKLQlsb25nIG91dEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIHRhcmdldFRyYWNrOworICAgIFRyYWNrIHVzZWRUcmFjazsKKyAgICBUaW1lVmFsdWUgYXRUaW1lOworICAgIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uOworICAgIGxvbmcgaW5GbGFnczsKKyAgICBsb25nIG91dEZsYWdzOwogI2lmbmRlZiBNb3ZpZUltcG9ydEZpbGUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZWRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWRkZWREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIHVzZWRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICBhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0RmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZWRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRkZWREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIHVzZWRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQlUaW1lU2NhbGUgc2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFRpbWVTY2FsZSBzY2FsZTsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0U2FtcGxlRHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0U2FtcGxlRHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZzY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0U2V0U2FtcGxlRHVyYXRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlPU1R5cGUgbWVkaWFUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgT1NUeXBlIG1lZGlhVHlwZTsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmbWVkaWFUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJm1lZGlhVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldE1lZGlhRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRNZWRpYUZpbGUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE1lZGlhRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRNZWRpYUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmFsaWFzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRNZWRpYUZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhbGlhcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0TWVkaWFGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldERpbWVuc2lvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JRml4ZWQgd2lkdGg7Ci0JRml4ZWQgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEZpeGVkIHdpZHRoOworICAgIEZpeGVkIGhlaWdodDsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXREaW1lbnNpb25zCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXREaW1lbnNpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXREaW1lbnNpb25zKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0Q2h1bmtTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgY2h1bmtTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgY2h1bmtTaXplOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldENodW5rU2l6ZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0Q2h1bmtTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldENodW5rU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNodW5rU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0U2V0Q2h1bmtTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaHVua1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldENodW5rU2l6ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1NpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YTsKLQlPU1R5cGUgaGFuZGxlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YTsKKyAgICBPU1R5cGUgaGFuZGxlVHlwZTsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldEF1eGlsaWFyeURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaGFuZGxlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaGFuZGxlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBmcm9tU2NyYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBmcm9tU2NyYXA7CiAjaWZuZGVmIE1vdmllSW1wb3J0U2V0RnJvbVNjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRGcm9tU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0RnJvbVNjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJvbVNjcmFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNjcmFwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb21TY3JhcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0RnJvbVNjcmFwKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21TY3JhcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnREb1VzZXJEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JSGFuZGxlIHRoZURhdGE7Ci0JQm9vbGVhbiBjYW5jZWxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBIYW5kbGUgdGhlRGF0YTsKKyAgICBCb29sZWFuIGNhbmNlbGVkOwogI2lmbmRlZiBNb3ZpZUltcG9ydERvVXNlckRpYWxvZwotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RG9Vc2VyRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydERvVXNlckRpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnREb1VzZXJEaWFsb2coY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FuY2VsZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnREb1VzZXJEaWFsb2coY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FuY2VsZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldER1cmF0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIE1vdmllSW1wb3J0U2V0RHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldER1cmF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldER1cmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldER1cmF0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldER1cmF0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JT1NUeXBlIGF1eFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGF1eFR5cGU7CiAjaWZuZGVmIE1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEdldEF1eGlsaWFyeURhdGFUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEdldEF1eGlsaWFyeURhdGFUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydEdldEF1eGlsaWFyeURhdGFUeXBlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1eFR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgYXV4VHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV4VHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBhdXhUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFZhbGlkYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyB0aGVGaWxlOwotCUhhbmRsZSB0aGVEYXRhOwotCUJvb2xlYW4gdmFsaWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgSGFuZGxlIHRoZURhdGE7CisgICAgQm9vbGVhbiB2YWxpZDsKICNpZm5kZWYgTW92aWVJbXBvcnRWYWxpZGF0ZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0VmFsaWRhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0VmFsaWRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0VmFsaWRhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHZhbGlkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRWYWxpZGF0ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0R2V0RmlsZVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JT1NUeXBlIGZpbGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBmaWxlVHlwZTsKICNpZm5kZWYgTW92aWVJbXBvcnRHZXRGaWxlVHlwZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0RmlsZVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0RmlsZVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0R2V0RmlsZVR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydEdldEZpbGVUeXBlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydERhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCU1vdmllIHRoZU1vdmllOwotCVRyYWNrIHRhcmdldFRyYWNrOwotCVRyYWNrIHVzZWRUcmFjazsKLQlUaW1lVmFsdWUgYXRUaW1lOwotCVRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uOwotCWxvbmcgaW5GbGFnczsKLQlsb25nIG91dEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBUcmFjayB0YXJnZXRUcmFjazsKKyAgICBUcmFjayB1c2VkVHJhY2s7CisgICAgVGltZVZhbHVlIGF0VGltZTsKKyAgICBUaW1lVmFsdWUgYWRkZWREdXJhdGlvbjsKKyAgICBsb25nIGluRmxhZ3M7CisgICAgbG9uZyBvdXRGbGFnczsKICNpZm5kZWYgTW92aWVJbXBvcnREYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnREYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0RGF0YVJlZihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZWRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYWRkZWREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIHVzZWRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICBhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGFyZ2V0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnREYXRhUmVmKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgdXNlZFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0R2V0U2FtcGxlRGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlPU1R5cGUgbWVkaWFUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgT1NUeXBlIG1lZGlhVHlwZTsKICNpZm5kZWYgTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0U2FtcGxlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0U2FtcGxlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0R2V0U2FtcGxlRGVzY3JpcHRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIG1lZGlhVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0U2FtcGxlRGVzY3JpcHRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIG1lZGlhVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbGltaXQ7CiAjaWZuZGVmIE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCXdpZGUgb2Zmc2V0OwotCXdpZGUgbGltaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgd2lkZSBvZmZzZXQ7CisgICAgd2lkZSBsaW1pdDsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0Ci0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZsaW1pdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQ2NChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmxpbWl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0SWRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGluRmxhZ3M7Ci0JbG9uZyBvdXRGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIGluRmxhZ3M7CisgICAgbG9uZyBvdXRGbGFnczsKICNpZm5kZWYgTW92aWVJbXBvcnRJZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRJZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydElkbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRJZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydElkbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlVSW50OCB2YWxpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgVUludDggdmFsaWQ7CiAjaWZuZGVmIE1vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHZhbGlkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBpbXBvcnRlckxvYWRTdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIGltcG9ydGVyTG9hZFN0YXRlOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldExvYWRTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0TG9hZFN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEdldExvYWRTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltcG9ydGVyTG9hZFN0YXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbXBvcnRlckxvYWRTdGF0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0TG9hZFN0YXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbXBvcnRlckxvYWRTdGF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZXJMb2FkU3RhdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlUaW1lVmFsdWUgdGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBUaW1lVmFsdWUgdGltZTsKICNpZm5kZWYgTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JVGltZVJlY29yZCB0aW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFRpbWVSZWNvcmQgdGltZTsKICNpZm5kZWYgTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXREb250QmxvY2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBkb250QmxvY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBkb250QmxvY2s7CiAjaWZuZGVmIE1vdmllSW1wb3J0U2V0RG9udEJsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXREb250QmxvY2spOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0RG9udEJsb2NrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZG9udEJsb2NrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXREb250QmxvY2soY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9udEJsb2NrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvbnRCbG9jaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0RG9udEJsb2NrKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRCbG9jayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXREb250QmxvY2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiB3aWxsQmxvY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiB3aWxsQmxvY2s7CiAjaWZuZGVmIE1vdmllSW1wb3J0R2V0RG9udEJsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXREb250QmxvY2spOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0RG9udEJsb2NrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydEdldERvbnRCbG9jayhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lsbEJsb2NrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3aWxsQmxvY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydEdldERvbnRCbG9jayhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lsbEJsb2NrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsQmxvY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JSWRsZU1hbmFnZXIgaW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSWRsZU1hbmFnZXIgaW07CiAjaWZuZGVmIE1vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldElkbGVNYW5hZ2VyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldElkbGVNYW5hZ2VyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfQ29udmVydCwgJmltKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQsICZpbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgbmV3TW92aWVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIG5ld01vdmllRmxhZ3M7CiAjaWZuZGVmIE1vdmllSW1wb3J0U2V0TmV3TW92aWVGbGFncwotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0TmV3TW92aWVGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0U2V0TmV3TW92aWVGbGFncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCU9TVHlwZSBtZWRpYVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIG1lZGlhVHlwZTsKICNpZm5kZWYgTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0RGVzdGluYXRpb25NZWRpYVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0RGVzdGluYXRpb25NZWRpYVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0R2V0RGVzdGluYXRpb25NZWRpYVR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIG1lZGlhVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0RGVzdGluYXRpb25NZWRpYVR5cGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIG1lZGlhVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnRUb0hhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YUg7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgb25seVRoaXNUcmFjazsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YUg7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgVHJhY2sgb25seVRoaXNUcmFjazsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgTW92aWVFeHBvcnRUb0hhbmRsZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VG9IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VG9IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFILAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZvbmx5VGhpc1RyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydFRvSGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUaGlzVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFILAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZvbmx5VGhpc1RyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydFRvSGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnRUb0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgb25seVRoaXNUcmFjazsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBUcmFjayBvbmx5VGhpc1RyYWNrOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBNb3ZpZUV4cG9ydFRvRmlsZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VG9GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFRvRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0VG9GaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUaGlzVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0VG9GaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFIOwotCU9TVHlwZSBoYW5kbGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhSDsKKyAgICBPU1R5cGUgaGFuZGxlVHlwZTsKICNpZm5kZWYgTW92aWVFeHBvcnRHZXRBdXhpbGlhcnlEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRHZXRBdXhpbGlhcnlEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFIKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRHZXRBdXhpbGlhcnlEYXRhKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgaGFuZGxlVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFIKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRHZXRBdXhpbGlhcnlEYXRhKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgaGFuZGxlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCU9TVHlwZSBtZWRpYVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVFeHBvcnRDb21wb25lbnQgY2k7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOwogI2lmbmRlZiBNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmbWVkaWFUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0RG9Vc2VyRGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCU1vdmllIHRoZU1vdmllOwotCVRyYWNrIG9ubHlUaGlzVHJhY2s7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247Ci0JQm9vbGVhbiBjYW5jZWxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBUcmFjayBvbmx5VGhpc1RyYWNrOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIEJvb2xlYW4gY2FuY2VsZWQ7CiAjaWZuZGVmIE1vdmllRXhwb3J0RG9Vc2VyRGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnREb1VzZXJEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0RG9Vc2VyRGlhbG9nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0RG9Vc2VyRGlhbG9nKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUaGlzVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5jZWxlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0RG9Vc2VyRGlhbG9nKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5jZWxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JT1NUeXBlIGNyZWF0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGNyZWF0b3I7CiAjaWZuZGVmIE1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldENyZWF0b3JUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldENyZWF0b3JUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldENyZWF0b3JUeXBlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0b3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgY3JlYXRvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydFRvRGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgb25seVRoaXNUcmFjazsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgVHJhY2sgb25seVRoaXNUcmFjazsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgTW92aWVFeHBvcnRUb0RhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFRvRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRUb0RhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0VG9EYXRhUmVmKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZvbmx5VGhpc1RyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydFRvRGF0YVJlZihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIE1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRGcm9tUHJvY2VkdXJlc1RvRGF0YVJlZihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydFZhbGlkYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCU1vdmllIHRoZU1vdmllOwotCVRyYWNrIG9ubHlUaGlzVHJhY2s7Ci0JQm9vbGVhbiB2YWxpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBUcmFjayBvbmx5VGhpc1RyYWNrOworICAgIEJvb2xlYW4gdmFsaWQ7CiAjaWZuZGVmIE1vdmllRXhwb3J0VmFsaWRhdGUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFZhbGlkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFZhbGlkYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZvbmx5VGhpc1RyYWNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRWYWxpZGF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZvbmx5VGhpc1RyYWNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRWYWxpZGF0ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0R2V0RmlsZU5hbWVFeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JT1NUeXBlIGV4dGVuc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgZXh0ZW5zaW9uOwogI2lmbmRlZiBNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZXh0ZW5zaW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZXh0ZW5zaW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydEdldFNob3J0RmlsZVR5cGVTdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JU3RyMjU1IHR5cGVTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVFeHBvcnRDb21wb25lbnQgY2k7CisgICAgU3RyMjU1IHR5cGVTdHJpbmc7CiAjaWZuZGVmIE1vdmllRXhwb3J0R2V0U2hvcnRGaWxlVHlwZVN0cmluZwotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0U2hvcnRGaWxlVHlwZVN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0eXBlU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdHlwZVN0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0R2V0U2hvcnRGaWxlVHlwZVN0cmluZyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnRHZXRTb3VyY2VNZWRpYVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOwogI2lmbmRlZiBNb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRHZXRTb3VyY2VNZWRpYVR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBtZWRpYVR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIG1lZGlhVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUZXh0RXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgbW92aWVUaW1lRnJhY3Rpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIG1vdmllVGltZUZyYWN0aW9uOwogI2lmbmRlZiBUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWVGcmFjdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbW92aWVUaW1lRnJhY3Rpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllVGltZUZyYWN0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZVRpbWVGcmFjdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dEV4cG9ydFNldFRpbWVGcmFjdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUZXh0RXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgbW92aWVUaW1lRnJhY3Rpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIG1vdmllVGltZUZyYWN0aW9uOwogI2lmbmRlZiBUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVGV4dEV4cG9ydFNldFRpbWVGcmFjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dEV4cG9ydFNldFRpbWVGcmFjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdmllVGltZUZyYWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dEV4cG9ydFNldFRpbWVGcmFjdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZUZyYWN0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllVGltZUZyYWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dEV4cG9ydFNldFRpbWVGcmFjdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZUZyYWN0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0RXhwb3J0R2V0U2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIHNldHRpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIHNldHRpbmc7CiAjaWZuZGVmIFRleHRFeHBvcnRHZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFRleHRFeHBvcnRHZXRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dEV4cG9ydEdldFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0RXhwb3J0R2V0U2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dEV4cG9ydEdldFNldHRpbmdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dEV4cG9ydFNldFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRleHRFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBzZXR0aW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFRleHRFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBzZXR0aW5nOwogI2lmbmRlZiBUZXh0RXhwb3J0U2V0U2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0U2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRFeHBvcnRTZXRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0RXhwb3J0U2V0U2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRFeHBvcnRTZXRTZXR0aW5ncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTUlESUltcG9ydEdldFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRleHRFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBzZXR0aW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFRleHRFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBzZXR0aW5nOwogI2lmbmRlZiBNSURJSW1wb3J0R2V0U2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhNSURJSW1wb3J0R2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKE1JRElJbXBvcnRHZXRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUlESUltcG9ydEdldFNldHRpbmdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1JRElJbXBvcnRHZXRTZXR0aW5ncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01JRElJbXBvcnRTZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUZXh0RXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgc2V0dGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUZXh0RXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgc2V0dGluZzsKICNpZm5kZWYgTUlESUltcG9ydFNldFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soTUlESUltcG9ydFNldFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNSURJSW1wb3J0U2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUlESUltcG9ydFNldFNldHRpbmdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNSURJSW1wb3J0U2V0U2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBlbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBlbmFibGU7CiAjaWZuZGVmIEdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltYWdlSW1wb3J0U2V0U2VxdWVuY2VFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltYWdlSW1wb3J0U2V0U2VxdWVuY2VFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltYWdlSW1wb3J0U2V0U2VxdWVuY2VFbmFibGVkKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNJbWFnZU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gZW5hYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNJbWFnZU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gZW5hYmxlOwogI2lmbmRlZiBHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbWFnZUltcG9ydEdldFNlcXVlbmNlRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbWFnZUltcG9ydEdldFNlcXVlbmNlRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbWFnZUltcG9ydEdldFNlcXVlbmNlRW5hYmxlZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ByZXZpZXdTaG93RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlwbm90Q29tcG9uZW50IHA7Ci0JT1NUeXBlIGRhdGFUeXBlOwotCUhhbmRsZSBkYXRhOwotCVJlY3QgaW5IZXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIHBub3RDb21wb25lbnQgcDsKKyAgICBPU1R5cGUgZGF0YVR5cGU7CisgICAgSGFuZGxlIGRhdGE7CisgICAgUmVjdCBpbkhlcmU7CiAjaWZuZGVmIFByZXZpZXdTaG93RGF0YQotCVB5TWFjX1BSRUNIRUNLKFByZXZpZXdTaG93RGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHJldmlld1Nob3dEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluSGVyZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFByZXZpZXdTaG93RGF0YShwLAotCSAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5IZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHJldmlld1Nob3dEYXRhKHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IZXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9QcmV2aWV3TWFrZVByZXZpZXdSZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JcG5vdENvbXBvbmVudCBwOwotCU9TVHlwZSBwcmV2aWV3VHlwZTsKLQlzaG9ydCByZXNJRDsKLQlGU1NwZWMgc291cmNlRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBwbm90Q29tcG9uZW50IHA7CisgICAgT1NUeXBlIHByZXZpZXdUeXBlOworICAgIHNob3J0IHJlc0lEOworICAgIEZTU3BlYyBzb3VyY2VGaWxlOwogI2lmbmRlZiBQcmV2aWV3TWFrZVByZXZpZXdSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhQcmV2aWV3TWFrZVByZXZpZXdSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmc291cmNlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZShwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHByZXZpZXdUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc0lEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmc291cmNlRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZShwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZUZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHByZXZpZXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9QcmV2aWV3RXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JcG5vdENvbXBvbmVudCBwOwotCUV2ZW50UmVjb3JkIGU7Ci0JQm9vbGVhbiBoYW5kbGVkRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgcG5vdENvbXBvbmVudCBwOworICAgIEV2ZW50UmVjb3JkIGU7CisgICAgQm9vbGVhbiBoYW5kbGVkRXZlbnQ7CiAjaWZuZGVmIFByZXZpZXdFdmVudAotCVB5TWFjX1BSRUNIRUNLKFByZXZpZXdFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHJldmlld0V2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFByZXZpZXdFdmVudChwLAotCSAgICAgICAgICAgICAgICAgICAmZSwKLQkgICAgICAgICAgICAgICAgICAgJmhhbmRsZWRFdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmZSwKLQkgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkRXZlbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFByZXZpZXdFdmVudChwLAorICAgICAgICAgICAgICAgICAgICAgICAmZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZWRFdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkRXZlbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFDb2RlY0RlY29tcHJlc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUNvZGVjQ29tcG9uZW50IGRjOwotCXZvaWQgKiBzcmNEYXRhOwotCVVJbnQzMiBzcmNTaXplOwotCXZvaWQgKiBkc3REYXRhOwotCVVJbnQzMiBkc3RCdWZmZXJTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFDb2RlY0NvbXBvbmVudCBkYzsKKyAgICB2b2lkICogc3JjRGF0YTsKKyAgICBVSW50MzIgc3JjU2l6ZTsKKyAgICB2b2lkICogZHN0RGF0YTsKKyAgICBVSW50MzIgZHN0QnVmZmVyU2l6ZTsKICNpZm5kZWYgRGF0YUNvZGVjRGVjb21wcmVzcwotCVB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0RlY29tcHJlc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0RlY29tcHJlc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbHNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3RCdWZmZXJTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUNvZGVjRGVjb21wcmVzcyhkYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlclNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0QnVmZmVyU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFDb2RlY0RlY29tcHJlc3MoZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXJTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUNvZGVjQ29tcG9uZW50IGRjOwotCVVJbnQzMiBzcmNTaXplOwotCVVJbnQzMiBkc3RTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFDb2RlY0NvbXBvbmVudCBkYzsKKyAgICBVSW50MzIgc3JjU2l6ZTsKKyAgICBVSW50MzIgZHN0U2l6ZTsKICNpZm5kZWYgRGF0YUNvZGVjR2V0Q29tcHJlc3NCdWZmZXJTaXplCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjR2V0Q29tcHJlc3NCdWZmZXJTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUNvZGVjR2V0Q29tcHJlc3NCdWZmZXJTaXplKGRjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZHN0U2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUNvZGVjR2V0Q29tcHJlc3NCdWZmZXJTaXplKGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUNvZGVjQ29tcHJlc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUNvZGVjQ29tcG9uZW50IGRjOwotCXZvaWQgKiBzcmNEYXRhOwotCVVJbnQzMiBzcmNTaXplOwotCXZvaWQgKiBkc3REYXRhOwotCVVJbnQzMiBkc3RCdWZmZXJTaXplOwotCVVJbnQzMiBhY3R1YWxEc3RTaXplOwotCVVJbnQzMiBkZWNvbXByZXNzU2xvcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhQ29kZWNDb21wb25lbnQgZGM7CisgICAgdm9pZCAqIHNyY0RhdGE7CisgICAgVUludDMyIHNyY1NpemU7CisgICAgdm9pZCAqIGRzdERhdGE7CisgICAgVUludDMyIGRzdEJ1ZmZlclNpemU7CisgICAgVUludDMyIGFjdHVhbERzdFNpemU7CisgICAgVUludDMyIGRlY29tcHJlc3NTbG9wOwogI2lmbmRlZiBEYXRhQ29kZWNDb21wcmVzcwotCVB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0NvbXByZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhQ29kZWNDb21wcmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY0RhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0RGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdEJ1ZmZlclNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhQ29kZWNDb21wcmVzcyhkYywKLQkgICAgICAgICAgICAgICAgICAgICAgICBzcmNEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZHN0RGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkc3RCdWZmZXJTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxEc3RTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZkZWNvbXByZXNzU2xvcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGFjdHVhbERzdFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgZGVjb21wcmVzc1Nsb3ApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0QnVmZmVyU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFDb2RlY0NvbXByZXNzKGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbERzdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlY29tcHJlc3NTbG9wKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsRHN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXByZXNzU2xvcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUNvZGVjQmVnaW5JbnRlcnJ1cHRTYWZlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFDb2RlY0NvbXBvbmVudCBkYzsKLQl1bnNpZ25lZCBsb25nIG1heFNyY1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUNvZGVjQ29tcG9uZW50IGRjOworICAgIHVuc2lnbmVkIGxvbmcgbWF4U3JjU2l6ZTsKICNpZm5kZWYgRGF0YUNvZGVjQmVnaW5JbnRlcnJ1cHRTYWZlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjQmVnaW5JbnRlcnJ1cHRTYWZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhTcmNTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUNvZGVjQmVnaW5JbnRlcnJ1cHRTYWZlKGRjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTcmNTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNyY1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUoZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNyY1NpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFDb2RlY0VuZEludGVycnVwdFNhZmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUNvZGVjQ29tcG9uZW50IGRjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFDb2RlY0NvbXBvbmVudCBkYzsKICNpZm5kZWYgRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZQotCVB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0VuZEludGVycnVwdFNhZmUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0VuZEludGVycnVwdFNhZmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFDb2RlY0VuZEludGVycnVwdFNhZmUoZGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhQ29kZWNFbmRJbnRlcnJ1cHRTYWZlKGRjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGg7Ci0JbG9uZyBoT2Zmc2V0OwotCWxvbmcgb2Zmc2V0OwotCWxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgaDsKKyAgICBsb25nIGhPZmZzZXQ7CisgICAgbG9uZyBvZmZzZXQ7CisgICAgbG9uZyBzaXplOwogI2lmbmRlZiBEYXRhSEdldERhdGEKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXREYXRhKGRoLAotCSAgICAgICAgICAgICAgICAgICBoLAotCSAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgIHNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGEoZGgsCisgICAgICAgICAgICAgICAgICAgICAgIGgsCisgICAgICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhQdXREYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBoOwotCWxvbmcgaE9mZnNldDsKLQlsb25nIG9mZnNldDsKLQlsb25nIHNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIGg7CisgICAgbG9uZyBoT2Zmc2V0OworICAgIGxvbmcgb2Zmc2V0OworICAgIGxvbmcgc2l6ZTsKICNpZm5kZWYgRGF0YUhQdXREYXRhCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhQdXREYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFB1dERhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhQdXREYXRhKGRoLAotCSAgICAgICAgICAgICAgICAgICBoLAotCSAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICBzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIUHV0RGF0YShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEZsdXNoRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKICNpZm5kZWYgRGF0YUhGbHVzaERhdGEKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEZsdXNoRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhGbHVzaERhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIRmx1c2hEYXRhKGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhGbHVzaERhdGEoZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIT3BlbkZvcldyaXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSE9wZW5Gb3JXcml0ZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIT3BlbkZvcldyaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSE9wZW5Gb3JXcml0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhPcGVuRm9yV3JpdGUoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSE9wZW5Gb3JXcml0ZShkaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhDbG9zZUZvcldyaXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSENsb3NlRm9yV3JpdGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSENsb3NlRm9yV3JpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQ2xvc2VGb3JXcml0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhDbG9zZUZvcldyaXRlKGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhDbG9zZUZvcldyaXRlKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSE9wZW5Gb3JSZWFkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSE9wZW5Gb3JSZWFkCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhPcGVuRm9yUmVhZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhPcGVuRm9yUmVhZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhPcGVuRm9yUmVhZChkaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIT3BlbkZvclJlYWQoZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIQ2xvc2VGb3JSZWFkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSENsb3NlRm9yUmVhZAotCVB5TWFjX1BSRUNIRUNLKERhdGFIQ2xvc2VGb3JSZWFkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSENsb3NlRm9yUmVhZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhDbG9zZUZvclJlYWQoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENsb3NlRm9yUmVhZChkaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXREYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBkYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBkYXRhUmVmOwogI2lmbmRlZiBEYXRhSFNldERhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldERhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIU2V0RGF0YVJlZihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldERhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgZGF0YVJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKICNpZm5kZWYgRGF0YUhHZXREYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RGF0YVJlZihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXREYXRhUmVmKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIQ29tcGFyZURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JQm9vbGVhbiBlcXVhbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBCb29sZWFuIGVxdWFsOwogI2lmbmRlZiBEYXRhSENvbXBhcmVEYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhDb21wYXJlRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhDb21wYXJlRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIQ29tcGFyZURhdGFSZWYoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmVxdWFsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBlcXVhbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENvbXBhcmVEYXRhUmVmKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcXVhbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIVGFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKICNpZm5kZWYgRGF0YUhUYXNrCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhUYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFRhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIVGFzayhkaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIVGFzayhkaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhGaW5pc2hEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCVB0ciBQbGFjZVRvUHV0RGF0YVB0cjsKLQlCb29sZWFuIENhbmNlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBQdHIgUGxhY2VUb1B1dERhdGFQdHI7CisgICAgQm9vbGVhbiBDYW5jZWw7CiAjaWZuZGVmIERhdGFIRmluaXNoRGF0YQotCVB5TWFjX1BSRUNIRUNLKERhdGFIRmluaXNoRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhGaW5pc2hEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2IiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJlBsYWNlVG9QdXREYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmQ2FuY2VsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhGaW5pc2hEYXRhKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQbGFjZVRvUHV0RGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQbGFjZVRvUHV0RGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhbmNlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIRmluaXNoRGF0YShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2VUb1B1dERhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhGbHVzaENhY2hlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSEZsdXNoQ2FjaGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEZsdXNoQ2FjaGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIRmx1c2hDYWNoZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhGbHVzaENhY2hlKGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhGbHVzaENhY2hlKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFJlc29sdmVEYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSB0aGVEYXRhUmVmOwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQlCb29sZWFuIHVzZXJJbnRlcmZhY2VBbGxvd2VkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSB0aGVEYXRhUmVmOworICAgIEJvb2xlYW4gd2FzQ2hhbmdlZDsKKyAgICBCb29sZWFuIHVzZXJJbnRlcmZhY2VBbGxvd2VkOwogI2lmbmRlZiBEYXRhSFJlc29sdmVEYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhSZXNvbHZlRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhSZXNvbHZlRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VySW50ZXJmYWNlQWxsb3dlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIUmVzb2x2ZURhdGFSZWYoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW50ZXJmYWNlQWxsb3dlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlckludGVyZmFjZUFsbG93ZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFJlc29sdmVEYXRhUmVmKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckludGVyZmFjZUFsbG93ZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RmlsZVNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBmaWxlU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGZpbGVTaXplOwogI2lmbmRlZiBEYXRhSEdldEZpbGVTaXplCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGaWxlU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGaWxlU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRGaWxlU2l6ZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZmaWxlU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZpbGVTaXplKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhDYW5Vc2VEYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBkYXRhUmVmOwotCWxvbmcgdXNlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgbG9uZyB1c2VGbGFnczsKICNpZm5kZWYgRGF0YUhDYW5Vc2VEYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhDYW5Vc2VEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSENhblVzZURhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSENhblVzZURhdGFSZWYoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdXNlRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhDYW5Vc2VEYXRhUmVmKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFByZWV4dGVuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQl1bnNpZ25lZCBsb25nIG1heFRvQWRkOwotCXVuc2lnbmVkIGxvbmcgc3BhY2VBZGRlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB1bnNpZ25lZCBsb25nIG1heFRvQWRkOworICAgIHVuc2lnbmVkIGxvbmcgc3BhY2VBZGRlZDsKICNpZm5kZWYgRGF0YUhQcmVleHRlbmQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFByZWV4dGVuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhQcmVleHRlbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhUb0FkZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIUHJlZXh0ZW5kKGRoLAotCSAgICAgICAgICAgICAgICAgICAgIG1heFRvQWRkLAotCSAgICAgICAgICAgICAgICAgICAgICZzcGFjZUFkZGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzcGFjZUFkZGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRvQWRkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhQcmVleHRlbmQoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VG9BZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYWNlQWRkZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlQWRkZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0RmlsZVNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBmaWxlU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGZpbGVTaXplOwogI2lmbmRlZiBEYXRhSFNldEZpbGVTaXplCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRGaWxlU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRGaWxlU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRGaWxlU2l6ZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRGaWxlU2l6ZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEZyZWVTcGFjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQl1bnNpZ25lZCBsb25nIGZyZWVTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHVuc2lnbmVkIGxvbmcgZnJlZVNpemU7CiAjaWZuZGVmIERhdGFIR2V0RnJlZVNwYWNlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGcmVlU3BhY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RnJlZVNwYWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldEZyZWVTcGFjZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmZnJlZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZyZWVTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRGcmVlU3BhY2UoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyZWVTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhDcmVhdGVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCU9TVHlwZSBjcmVhdG9yOwotCUJvb2xlYW4gZGVsZXRlRXhpc3Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgQm9vbGVhbiBkZWxldGVFeGlzdGluZzsKICNpZm5kZWYgRGF0YUhDcmVhdGVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhDcmVhdGVGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSENyZWF0ZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlbGV0ZUV4aXN0aW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhDcmVhdGVGaWxlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBkZWxldGVFeGlzdGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbGV0ZUV4aXN0aW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhDcmVhdGVGaWxlKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVFeGlzdGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBibG9ja1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBibG9ja1NpemU7CiAjaWZuZGVmIERhdGFIR2V0UHJlZmVycmVkQmxvY2tTaXplCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0UHJlZmVycmVkQmxvY2tTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2tTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBibG9ja1NpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2tTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RGV2aWNlSW5kZXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBkZXZpY2VJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGRldmljZUluZGV4OwogI2lmbmRlZiBEYXRhSEdldERldmljZUluZGV4Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREZXZpY2VJbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREZXZpY2VJbmRleCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXREZXZpY2VJbmRleChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERldmljZUluZGV4KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUJvb2xlYW4geWVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEJvb2xlYW4geWVzOwogI2lmbmRlZiBEYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhEYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeWVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB5ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5ZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHllcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXREYXRhSW5CdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBzdGFydE9mZnNldDsKLQlsb25nIHNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBzdGFydE9mZnNldDsKKyAgICBsb25nIHNpemU7CiAjaWZuZGVmIERhdGFIR2V0RGF0YUluQnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhSW5CdWZmZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YUluQnVmZmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRPZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFJbkJ1ZmZlcihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydE9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RGF0YUluQnVmZmVyKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgbWlsbGlzZWNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgbWlsbGlzZWNzOwogI2lmbmRlZiBEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRTY2hlZHVsZUFoZWFkVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRTY2hlZHVsZUFoZWFkVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRTY2hlZHVsZUFoZWFkVGltZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaXNlY3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlsbGlzZWNzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0Q2FjaGVTaXplTGltaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JU2l6ZSBjYWNoZVNpemVMaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBTaXplIGNhY2hlU2l6ZUxpbWl0OwogI2lmbmRlZiBEYXRhSFNldENhY2hlU2l6ZUxpbWl0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRDYWNoZVNpemVMaW1pdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRDYWNoZVNpemVMaW1pdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhY2hlU2l6ZUxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRDYWNoZVNpemVMaW1pdChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlU2l6ZUxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhY2hlU2l6ZUxpbWl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRDYWNoZVNpemVMaW1pdChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlU2l6ZUxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldENhY2hlU2l6ZUxpbWl0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCVNpemUgY2FjaGVTaXplTGltaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgU2l6ZSBjYWNoZVNpemVMaW1pdDsKICNpZm5kZWYgRGF0YUhHZXRDYWNoZVNpemVMaW1pdAotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0Q2FjaGVTaXplTGltaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0Q2FjaGVTaXplTGltaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0Q2FjaGVTaXplTGltaXQoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FjaGVTaXplTGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGNhY2hlU2l6ZUxpbWl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRDYWNoZVNpemVMaW1pdChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWNoZVNpemVMaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplTGltaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0TW92aWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JTW92aWUgdGhlTW92aWU7Ci0Jc2hvcnQgaWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgc2hvcnQgaWQ7CiAjaWZuZGVmIERhdGFIR2V0TW92aWUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldE1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldE1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldE1vdmllKGRoLAotCSAgICAgICAgICAgICAgICAgICAgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgJmlkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldE1vdmllKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgJmlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIQWRkTW92aWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JTW92aWUgdGhlTW92aWU7Ci0Jc2hvcnQgaWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgc2hvcnQgaWQ7CiAjaWZuZGVmIERhdGFIQWRkTW92aWUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEFkZE1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEFkZE1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhBZGRNb3ZpZShkaCwKLQkgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgJmlkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEFkZE1vdmllKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmaWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFVwZGF0ZU1vdmllKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCU1vdmllIHRoZU1vdmllOwotCXNob3J0IGlkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIE1vdmllIHRoZU1vdmllOworICAgIHNob3J0IGlkOwogI2lmbmRlZiBEYXRhSFVwZGF0ZU1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhVcGRhdGVNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhVcGRhdGVNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIVXBkYXRlTW92aWUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIVXBkYXRlTW92aWUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSERvZXNCdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JQm9vbGVhbiBidWZmZXJzUmVhZHM7Ci0JQm9vbGVhbiBidWZmZXJzV3JpdGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEJvb2xlYW4gYnVmZmVyc1JlYWRzOworICAgIEJvb2xlYW4gYnVmZmVyc1dyaXRlczsKICNpZm5kZWYgRGF0YUhEb2VzQnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhEb2VzQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSERvZXNCdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIRG9lc0J1ZmZlcihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcnNSZWFkcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcnNXcml0ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBidWZmZXJzUmVhZHMsCi0JICAgICAgICAgICAgICAgICAgICAgYnVmZmVyc1dyaXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIRG9lc0J1ZmZlcihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcnNSZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcnNXcml0ZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzUmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyc1dyaXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRGaWxlTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlTdHIyNTUgc3RyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFN0cjI1NSBzdHI7CiAjaWZuZGVmIERhdGFIR2V0RmlsZU5hbWUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVOYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldEZpbGVOYW1lKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRGaWxlTmFtZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRBdmFpbGFibGVGaWxlU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZpbGVTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZmlsZVNpemU7CiAjaWZuZGVmIERhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmaWxlU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldE1hY09TRmlsZVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIGZpbGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIE9TVHlwZSBmaWxlVHlwZTsKICNpZm5kZWYgRGF0YUhHZXRNYWNPU0ZpbGVUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRNYWNPU0ZpbGVUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldE1hY09TRmlsZVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0TWFjT1NGaWxlVHlwZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRNYWNPU0ZpbGVUeXBlKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0TUlNRVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JU3RyMjU1IG1pbWVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFN0cjI1NSBtaW1lVHlwZTsKICNpZm5kZWYgRGF0YUhHZXRNSU1FVHlwZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TUlNRVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TUlNRVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG1pbWVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRNSU1FVHlwZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbWltZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldE1JTUVUeXBlKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0RGF0YVJlZldpdGhBbmNob3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGFuY2hvckRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUhhbmRsZSBkYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBhbmNob3JEYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKICNpZm5kZWYgRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcgotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RGF0YVJlZldpdGhBbmNob3IpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RGF0YVJlZldpdGhBbmNob3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhbmNob3JEYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYW5jaG9yRGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0RGF0YVJlZldpdGhBbmNob3IoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBhbmNob3JEYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlIYW5kbGUgZGF0YVJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgYW5jaG9yRGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgSGFuZGxlIGRhdGFSZWY7CiAjaWZuZGVmIERhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmFuY2hvckRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXREYXRhUmVmV2l0aEFuY2hvcihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYW5jaG9yRGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFNldE1hY09TRmlsZVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIGZpbGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIE9TVHlwZSBmaWxlVHlwZTsKICNpZm5kZWYgRGF0YUhTZXRNYWNPU0ZpbGVUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRNYWNPU0ZpbGVUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldE1hY09TRmlsZVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIU2V0TWFjT1NGaWxlVHlwZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldE1hY09TRmlsZVR5cGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFNldFRpbWVCYXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCVRpbWVCYXNlIHRiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFRpbWVCYXNlIHRiOwogI2lmbmRlZiBEYXRhSFNldFRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0YikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIU2V0VGltZUJhc2UoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICB0Yik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmdGIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldFRpbWVCYXNlKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0SW5mb0ZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCVVJbnQzMiBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBVSW50MzIgZmxhZ3M7CiAjaWZuZGVmIERhdGFIR2V0SW5mb0ZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRJbmZvRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0SW5mb0ZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldEluZm9GbGFncyhkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRJbmZvRmxhZ3MoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRGaWxlU2l6ZTY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXdpZGUgZmlsZVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgd2lkZSBmaWxlU2l6ZTsKICNpZm5kZWYgRGF0YUhHZXRGaWxlU2l6ZTY0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGaWxlU2l6ZTY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVTaXplNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RmlsZVNpemU2NChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBmaWxlU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RmlsZVNpemU2NChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBmaWxlU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhQcmVleHRlbmQ2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQl3aWRlIG1heFRvQWRkOwotCXdpZGUgc3BhY2VBZGRlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIG1heFRvQWRkOworICAgIHdpZGUgc3BhY2VBZGRlZDsKICNpZm5kZWYgRGF0YUhQcmVleHRlbmQ2NAotCVB5TWFjX1BSRUNIRUNLKERhdGFIUHJlZXh0ZW5kNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIUHJlZXh0ZW5kNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWF4VG9BZGQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFByZWV4dGVuZDY0KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgJm1heFRvQWRkLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnNwYWNlQWRkZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNwYWNlQWRkZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1heFRvQWRkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhQcmVleHRlbmQ2NChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhUb0FkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGFjZUFkZGVkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBzcGFjZUFkZGVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFNldEZpbGVTaXplNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jd2lkZSBmaWxlU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIGZpbGVTaXplOwogI2lmbmRlZiBEYXRhSFNldEZpbGVTaXplNjQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldEZpbGVTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RmlsZVNpemU2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZmaWxlU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIU2V0RmlsZVNpemU2NChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZmaWxlU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0RmlsZVNpemU2NChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEZyZWVTcGFjZTY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXdpZGUgZnJlZVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgd2lkZSBmcmVlU2l6ZTsKICNpZm5kZWYgRGF0YUhHZXRGcmVlU3BhY2U2NAotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RnJlZVNwYWNlNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RnJlZVNwYWNlNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RnJlZVNwYWNlNjQoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJlZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZyZWVTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRGcmVlU3BhY2U2NChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmVlU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZnJlZVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIQXBwZW5kNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jdm9pZCAqIGRhdGE7Ci0Jd2lkZSBmaWxlT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB2b2lkICogZGF0YTsKKyAgICB3aWRlIGZpbGVPZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBzaXplOwogI2lmbmRlZiBEYXRhSEFwcGVuZDY0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhBcHBlbmQ2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhBcHBlbmQ2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIQXBwZW5kNjQoZGgsCi0JICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgJmZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBmaWxlT2Zmc2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQXBwZW5kNjQoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBmaWxlT2Zmc2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFBvbGxSZWFkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXZvaWQgKiBkYXRhUHRyOwotCVVJbnQzMiBkYXRhU2l6ZVNvRmFyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHZvaWQgKiBkYXRhUHRyOworICAgIFVJbnQzMiBkYXRhU2l6ZVNvRmFyOwogI2lmbmRlZiBEYXRhSFBvbGxSZWFkCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhQb2xsUmVhZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhQb2xsUmVhZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFBvbGxSZWFkKGRoLAotCSAgICAgICAgICAgICAgICAgICAgZGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZVNvRmFyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZVNvRmFyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFBvbGxSZWFkKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZVNvRmFyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZVNvRmFyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFBdmFpbGFiaWxpdHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBvZmZzZXQ7Ci0JbG9uZyBsZW47Ci0JbG9uZyBtaXNzaW5nX29mZnNldDsKLQlsb25nIG1pc3NpbmdfbGVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgb2Zmc2V0OworICAgIGxvbmcgbGVuOworICAgIGxvbmcgbWlzc2luZ19vZmZzZXQ7CisgICAgbG9uZyBtaXNzaW5nX2xlbjsKICNpZm5kZWYgRGF0YUhHZXREYXRhQXZhaWxhYmlsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhQXZhaWxhYmlsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXREYXRhQXZhaWxhYmlsaXR5KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pc3Npbmdfb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlzc2luZ19sZW4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nX29mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nX2xlbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXREYXRhQXZhaWxhYmlsaXR5KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pc3Npbmdfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlzc2luZ19sZW4pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nX2xlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXREYXRhUmVmQXNUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCU9TVHlwZSByZXF1ZXN0ZWRUeXBlOwotCUhhbmRsZSBkYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIE9TVHlwZSByZXF1ZXN0ZWRUeXBlOworICAgIEhhbmRsZSBkYXRhUmVmOwogI2lmbmRlZiBEYXRhSEdldERhdGFSZWZBc1R5cGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSZWZBc1R5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZkFzVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlcXVlc3RlZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFSZWZBc1R5cGUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZXF1ZXN0ZWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXREYXRhUmVmQXNUeXBlKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgZXh0ZW5zaW9uOwotCU9TVHlwZSBpZFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIGV4dGVuc2lvbjsKKyAgICBPU1R5cGUgaWRUeXBlOwogI2lmbmRlZiBEYXRhSFNldERhdGFSZWZFeHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldERhdGFSZWZFeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBleHRlbnNpb247Ci0JT1NUeXBlIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgZXh0ZW5zaW9uOworICAgIE9TVHlwZSBpZFR5cGU7CiAjaWZuZGVmIERhdGFIR2V0RGF0YVJlZkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZkV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBleHRlbnNpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBleHRlbnNpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0TW92aWVXaXRoRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JTW92aWUgdGhlTW92aWU7Ci0Jc2hvcnQgaWQ7Ci0Jc2hvcnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgc2hvcnQgaWQ7CisgICAgc2hvcnQgZmxhZ3M7CiAjaWZuZGVmIERhdGFIR2V0TW92aWVXaXRoRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldE1vdmllV2l0aEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldE1vdmllV2l0aEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldE1vdmllV2l0aEZsYWdzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICBpZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0TW92aWVXaXRoRmxhZ3MoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEZpbGVUeXBlT3JkZXJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JRGF0YUhGaWxlVHlwZU9yZGVyaW5nSGFuZGxlIG9yZGVyaW5nTGlzdEhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBEYXRhSEZpbGVUeXBlT3JkZXJpbmdIYW5kbGUgb3JkZXJpbmdMaXN0SGFuZGxlOwogI2lmbmRlZiBEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmcKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZVR5cGVPcmRlcmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JkZXJpbmdMaXN0SGFuZGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3JkZXJpbmdMaXN0SGFuZGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JkZXJpbmdMaXN0SGFuZGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3JkZXJpbmdMaXN0SGFuZGxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSENyZWF0ZUZpbGVXaXRoRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JQm9vbGVhbiBkZWxldGVFeGlzdGluZzsKLQlVSW50MzIgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgQm9vbGVhbiBkZWxldGVFeGlzdGluZzsKKyAgICBVSW50MzIgZmxhZ3M7CiAjaWZuZGVmIERhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncwotCVB5TWFjX1BSRUNIRUNLKERhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZibCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVsZXRlRXhpc3RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyhkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRXhpc3RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbGV0ZUV4aXN0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENyZWF0ZUZpbGVXaXRoRmxhZ3MoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUV4aXN0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCU9TVHlwZSB3aGF0OwotCXZvaWQgKiBpbmZvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIE9TVHlwZSB3aGF0OworICAgIHZvaWQgKiBpbmZvOwogI2lmbmRlZiBEYXRhSEdldEluZm8KLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ3aGF0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0SW5mbyhkaCwKLQkgICAgICAgICAgICAgICAgICAgd2hhdCwKLQkgICAgICAgICAgICAgICAgICAgaW5mbyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEluZm8oZGgsCisgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsCisgICAgICAgICAgICAgICAgICAgICAgIGluZm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0SWRsZU1hbmFnZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSWRsZU1hbmFnZXIgaW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSWRsZU1hbmFnZXIgaW07CiAjaWZuZGVmIERhdGFIU2V0SWRsZU1hbmFnZXIKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldElkbGVNYW5hZ2VyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldElkbGVNYW5hZ2VyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfQ29udmVydCwgJmltKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRJZGxlTWFuYWdlcihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGltKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQsICZpbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0SWRsZU1hbmFnZXIoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhEZWxldGVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSERlbGV0ZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSERlbGV0ZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIRGVsZXRlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhEZWxldGVGaWxlKGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhEZWxldGVGaWxlKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFNldE1vdmllVXNhZ2VGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIERhdGFIU2V0TW92aWVVc2FnZUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIU2V0TW92aWVVc2FnZUZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldE1vdmllVXNhZ2VGbGFncyhkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0TW92aWVVc2FnZUZsYWdzKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgaW5GbGFnczsKICNpZm5kZWYgRGF0YUhVc2VUZW1wb3JhcnlEYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhVc2VUZW1wb3JhcnlEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhVc2VUZW1wb3JhcnlEYXRhUmVmKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0VGVtcG9yYXJ5RGF0YVJlZkNhcGFiaWxpdGllcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIG91dFVuZGVyc3Rvb2RGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIG91dFVuZGVyc3Rvb2RGbGFnczsKICNpZm5kZWYgRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0VGVtcG9yYXJ5RGF0YVJlZkNhcGFiaWxpdGllcyhkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFVuZGVyc3Rvb2RGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0VW5kZXJzdG9vZEZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VW5kZXJzdG9vZEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRVbmRlcnN0b29kRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUmVuYW1lRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgbmV3RGF0YVJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgbmV3RGF0YVJlZjsKICNpZm5kZWYgRGF0YUhSZW5hbWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhSZW5hbWVGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFJlbmFtZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm5ld0RhdGFSZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFJlbmFtZUZpbGUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZuZXdEYXRhUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhSZW5hbWVGaWxlKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFBsYXliYWNrSGludHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIG1pbkZpbGVPZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBtYXhGaWxlT2Zmc2V0OwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmbGFnczsKKyAgICB1bnNpZ25lZCBsb25nIG1pbkZpbGVPZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBtYXhGaWxlT2Zmc2V0OworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIERhdGFIUGxheWJhY2tIaW50cwotCVB5TWFjX1BSRUNIRUNLKERhdGFIUGxheWJhY2tIaW50cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhQbGF5YmFja0hpbnRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5GaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4RmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhQbGF5YmFja0hpbnRzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbWluRmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5GaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4RmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhQbGF5YmFja0hpbnRzKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUGxheWJhY2tIaW50czY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgZmxhZ3M7Ci0Jd2lkZSBtaW5GaWxlT2Zmc2V0OwotCXdpZGUgbWF4RmlsZU9mZnNldDsKLQlsb25nIGJ5dGVzUGVyU2Vjb25kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZmxhZ3M7CisgICAgd2lkZSBtaW5GaWxlT2Zmc2V0OworICAgIHdpZGUgbWF4RmlsZU9mZnNldDsKKyAgICBsb25nIGJ5dGVzUGVyU2Vjb25kOwogI2lmbmRlZiBEYXRhSFBsYXliYWNrSGludHM2NAotCVB5TWFjX1BSRUNIRUNLKERhdGFIUGxheWJhY2tIaW50czY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFBsYXliYWNrSGludHM2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtaW5GaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWF4RmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhQbGF5YmFja0hpbnRzNjQoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbkZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heEZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1pbkZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtYXhGaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFBsYXliYWNrSGludHM2NChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluRmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4RmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXREYXRhUmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZsYWdzOwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGJ5dGVzUGVyU2Vjb25kOwogI2lmbmRlZiBEYXRhSEdldERhdGFSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXREYXRhUmF0ZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RGF0YVJhdGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0VGltZUhpbnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBiYW5kd2lkdGhQcmlvcml0eTsKLQlUaW1lU2NhbGUgc2NhbGU7Ci0JVGltZVZhbHVlIG1pblRpbWU7Ci0JVGltZVZhbHVlIG1heFRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGJhbmR3aWR0aFByaW9yaXR5OworICAgIFRpbWVTY2FsZSBzY2FsZTsKKyAgICBUaW1lVmFsdWUgbWluVGltZTsKKyAgICBUaW1lVmFsdWUgbWF4VGltZTsKICNpZm5kZWYgRGF0YUhTZXRUaW1lSGludHMKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldFRpbWVIaW50cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRUaW1lSGludHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZiYW5kd2lkdGhQcmlvcml0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWluVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldFRpbWVIaW50cyhkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICBiYW5kd2lkdGhQcmlvcml0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBtaW5UaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG1heFRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFuZHdpZHRoUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhUaW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRUaW1lSGludHMoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHdpZHRoUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldE1heFNyY1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXRTdGQ7Ci0JUmVjdCBtYXhTcmNSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGlucHV0U3RkOworICAgIFJlY3QgbWF4U3JjUmVjdDsKICNpZm5kZWYgVkRHZXRNYXhTcmNSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRNYXhTcmNSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldE1heFNyY1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFN0ZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0TWF4U3JjUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhTcmNSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmbWF4U3JjUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFN0ZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0TWF4U3JjUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTcmNSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmbWF4U3JjUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRBY3RpdmVTcmNSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGlucHV0U3RkOwotCVJlY3QgYWN0aXZlU3JjUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBpbnB1dFN0ZDsKKyAgICBSZWN0IGFjdGl2ZVNyY1JlY3Q7CiAjaWZuZGVmIFZER2V0QWN0aXZlU3JjUmVjdAotCVB5TWFjX1BSRUNIRUNLKFZER2V0QWN0aXZlU3JjUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRBY3RpdmVTcmNSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRTdGQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEFjdGl2ZVNyY1JlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlU3JjUmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmFjdGl2ZVNyY1JlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRTdGQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEFjdGl2ZVNyY1JlY3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlU3JjUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmFjdGl2ZVNyY1JlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0RGlnaXRpemVyUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlSZWN0IGRpZ2l0aXplclJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgUmVjdCBkaWdpdGl6ZXJSZWN0OwogI2lmbmRlZiBWRFNldERpZ2l0aXplclJlY3QKLQlQeU1hY19QUkVDSEVDSyhWRFNldERpZ2l0aXplclJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0RGlnaXRpemVyUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXREaWdpdGl6ZXJSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZGlnaXRpemVyUmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRpZ2l0aXplclJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldERpZ2l0aXplclJlY3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWdpdGl6ZXJSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGlnaXRpemVyUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXREaWdpdGl6ZXJSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVJlY3QgZGlnaXRpemVyUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRpZ2l0aXplclJlY3Q7CiAjaWZuZGVmIFZER2V0RGlnaXRpemVyUmVjdAotCVB5TWFjX1BSRUNIRUNLKFZER2V0RGlnaXRpemVyUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXREaWdpdGl6ZXJSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldERpZ2l0aXplclJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZkaWdpdGl6ZXJSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGlnaXRpemVyUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0RGlnaXRpemVyUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpZ2l0aXplclJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkaWdpdGl6ZXJSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFZCbGFua1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXRTdGQ7Ci0JUmVjdCB2QmxhbmtSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGlucHV0U3RkOworICAgIFJlY3QgdkJsYW5rUmVjdDsKICNpZm5kZWYgVkRHZXRWQmxhbmtSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRWQmxhbmtSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFZCbGFua1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFN0ZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0VkJsYW5rUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2QmxhbmtSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdkJsYW5rUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFN0ZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0VkJsYW5rUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2QmxhbmtSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdkJsYW5rUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRNYXNrUGl4TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVBpeE1hcEhhbmRsZSBtYXNrUGl4TWFwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFBpeE1hcEhhbmRsZSBtYXNrUGl4TWFwOwogI2lmbmRlZiBWREdldE1hc2tQaXhNYXAKLQlQeU1hY19QUkVDSEVDSyhWREdldE1hc2tQaXhNYXApOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0TWFza1BpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbWFza1BpeE1hcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0TWFza1BpeE1hcChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgbWFza1BpeE1hcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1hc2tQaXhNYXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldE1hc2tQaXhNYXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tQaXhNYXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEVXNlVGhpc0NMVVQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JQ1RhYkhhbmRsZSBjb2xvclRhYmxlSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIENUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZTsKICNpZm5kZWYgVkRVc2VUaGlzQ0xVVAotCVB5TWFjX1BSRUNIRUNLKFZEVXNlVGhpc0NMVVQpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEVXNlVGhpc0NMVVQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbG9yVGFibGVIYW5kbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFVzZVRoaXNDTFVUKGNpLAotCSAgICAgICAgICAgICAgICAgICAgY29sb3JUYWJsZUhhbmRsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbG9yVGFibGVIYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFVzZVRoaXNDTFVUKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JUYWJsZUhhbmRsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRJbnB1dEdhbW1hVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JRml4ZWQgY2hhbm5lbDE7Ci0JRml4ZWQgY2hhbm5lbDI7Ci0JRml4ZWQgY2hhbm5lbDM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgRml4ZWQgY2hhbm5lbDE7CisgICAgRml4ZWQgY2hhbm5lbDI7CisgICAgRml4ZWQgY2hhbm5lbDM7CiAjaWZuZGVmIFZEU2V0SW5wdXRHYW1tYVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRJbnB1dEdhbW1hVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0SW5wdXRHYW1tYVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmY2hhbm5lbDEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmY2hhbm5lbDIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmY2hhbm5lbDMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldElucHV0R2FtbWFWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsMSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsMiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsMyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0SW5wdXRHYW1tYVZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldElucHV0R2FtbWFWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlGaXhlZCBjaGFubmVsMTsKLQlGaXhlZCBjaGFubmVsMjsKLQlGaXhlZCBjaGFubmVsMzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBGaXhlZCBjaGFubmVsMTsKKyAgICBGaXhlZCBjaGFubmVsMjsKKyAgICBGaXhlZCBjaGFubmVsMzsKICNpZm5kZWYgVkRHZXRJbnB1dEdhbW1hVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhWREdldElucHV0R2FtbWFWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRJbnB1dEdhbW1hVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0SW5wdXRHYW1tYVZhbHVlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsMSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbDIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWwzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGNoYW5uZWwxLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGNoYW5uZWwyLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGNoYW5uZWwzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRJbnB1dEdhbW1hVmFsdWUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbDMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0QnJpZ2h0bmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3M7CiAjaWZuZGVmIFZEU2V0QnJpZ2h0bmVzcwotCVB5TWFjX1BSRUNIRUNLKFZEU2V0QnJpZ2h0bmVzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRCcmlnaHRuZXNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEJyaWdodG5lc3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZicmlnaHRuZXNzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRCcmlnaHRuZXNzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJpZ2h0bmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRCcmlnaHRuZXNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzczsKICNpZm5kZWYgVkRHZXRCcmlnaHRuZXNzCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRCcmlnaHRuZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEJyaWdodG5lc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0QnJpZ2h0bmVzcyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJyaWdodG5lc3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEJyaWdodG5lc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZicmlnaHRuZXNzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldENvbnRyYXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IGNvbnRyYXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0OwogI2lmbmRlZiBWRFNldENvbnRyYXN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb250cmFzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb250cmFzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRDb250cmFzdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICZjb250cmFzdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY29udHJhc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldENvbnRyYXN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyYXN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRIdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgaHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGh1ZTsKICNpZm5kZWYgVkRTZXRIdWUKLQlQeU1hY19QUkVDSEVDSyhWRFNldEh1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRIdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0SHVlKGNpLAotCSAgICAgICAgICAgICAgICZodWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGh1ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0SHVlKGNpLAorICAgICAgICAgICAgICAgICAgICZodWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRTaGFycG5lc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzczsKICNpZm5kZWYgVkRTZXRTaGFycG5lc3MKLQlQeU1hY19QUkVDSEVDSyhWRFNldFNoYXJwbmVzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRTaGFycG5lc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0U2hhcnBuZXNzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICZzaGFycG5lc3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNoYXJwbmVzcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0U2hhcnBuZXNzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFycG5lc3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJwbmVzcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRTYXR1cmF0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbjsKICNpZm5kZWYgVkRTZXRTYXR1cmF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRTYXR1cmF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldFNhdHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0U2F0dXJhdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFNhdHVyYXRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYXR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYXR1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldENvbnRyYXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IGNvbnRyYXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0OwogI2lmbmRlZiBWREdldENvbnRyYXN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRDb250cmFzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRDb250cmFzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRDb250cmFzdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICZjb250cmFzdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY29udHJhc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldENvbnRyYXN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyYXN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRIdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgaHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGh1ZTsKICNpZm5kZWYgVkRHZXRIdWUKLQlQeU1hY19QUkVDSEVDSyhWREdldEh1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRIdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0SHVlKGNpLAotCSAgICAgICAgICAgICAgICZodWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGh1ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0SHVlKGNpLAorICAgICAgICAgICAgICAgICAgICZodWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRTaGFycG5lc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzczsKICNpZm5kZWYgVkRHZXRTaGFycG5lc3MKLQlQeU1hY19QUkVDSEVDSyhWREdldFNoYXJwbmVzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRTaGFycG5lc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0U2hhcnBuZXNzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICZzaGFycG5lc3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNoYXJwbmVzcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0U2hhcnBuZXNzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFycG5lc3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJwbmVzcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRTYXR1cmF0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbjsKICNpZm5kZWYgVkRHZXRTYXR1cmF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRTYXR1cmF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFNhdHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0U2F0dXJhdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldFNhdHVyYXRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYXR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYXR1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdyYWJPbmVGcmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKICNpZm5kZWYgVkRHcmFiT25lRnJhbWUKLQlQeU1hY19QUkVDSEVDSyhWREdyYWJPbmVGcmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHcmFiT25lRnJhbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER3JhYk9uZUZyYW1lKGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHcmFiT25lRnJhbWUoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0TWF4QXV4QnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVBpeE1hcEhhbmRsZSBwbTsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgUGl4TWFwSGFuZGxlIHBtOworICAgIFJlY3QgcjsKICNpZm5kZWYgVkRHZXRNYXhBdXhCdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhWREdldE1heEF1eEJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRNYXhBdXhCdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0TWF4QXV4QnVmZmVyKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZwbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcG0sCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0TWF4QXV4QnVmZmVyKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRDdXJyZW50RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JbG9uZyBpbnB1dEN1cnJlbnRGbGFnOwotCWxvbmcgb3V0cHV0Q3VycmVudEZsYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBpbnB1dEN1cnJlbnRGbGFnOworICAgIGxvbmcgb3V0cHV0Q3VycmVudEZsYWc7CiAjaWZuZGVmIFZER2V0Q3VycmVudEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRDdXJyZW50RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0Q3VycmVudEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEN1cnJlbnRGbGFncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRDdXJyZW50RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Q3VycmVudEZsYWcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnB1dEN1cnJlbnRGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgIG91dHB1dEN1cnJlbnRGbGFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRDdXJyZW50RmxhZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0Q3VycmVudEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dEN1cnJlbnRGbGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDdXJyZW50RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRDdXJyZW50RmxhZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRLZXlDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIFZEU2V0S2V5Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhWRFNldEtleUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldEtleUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEtleUNvbG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldEtleUNvbG9yKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0S2V5Q29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBWREdldEtleUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRLZXlDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRLZXlDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRLZXlDb2xvcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICZpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEtleUNvbG9yKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRBZGRLZXlDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIFZEQWRkS2V5Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhWREFkZEtleUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREFkZEtleUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREFkZEtleUNvbG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEQWRkS2V5Q29sb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldE5leHRLZXlDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIFZER2V0TmV4dEtleUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXROZXh0S2V5Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0TmV4dEtleUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldE5leHRLZXlDb2xvcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0TmV4dEtleUNvbG9yKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldEtleUNvbG9yUmFuZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JUkdCQ29sb3IgbWluUkdCOwotCVJHQkNvbG9yIG1heFJHQjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBSR0JDb2xvciBtaW5SR0I7CisgICAgUkdCQ29sb3IgbWF4UkdCOwogI2lmbmRlZiBWRFNldEtleUNvbG9yUmFuZ2UKLQlQeU1hY19QUkVDSEVDSyhWRFNldEtleUNvbG9yUmFuZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0S2V5Q29sb3JSYW5nZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRLZXlDb2xvclJhbmdlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmbWluUkdCLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4UkdCKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtaW5SR0IsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbWF4UkdCKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRLZXlDb2xvclJhbmdlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluUkdCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4UkdCKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtaW5SR0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbWF4UkdCKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEtleUNvbG9yUmFuZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JUkdCQ29sb3IgbWluUkdCOwotCVJHQkNvbG9yIG1heFJHQjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBSR0JDb2xvciBtaW5SR0I7CisgICAgUkdCQ29sb3IgbWF4UkdCOwogI2lmbmRlZiBWREdldEtleUNvbG9yUmFuZ2UKLQlQeU1hY19QUkVDSEVDSyhWREdldEtleUNvbG9yUmFuZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0S2V5Q29sb3JSYW5nZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRLZXlDb2xvclJhbmdlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmbWluUkdCLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4UkdCKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtaW5SR0IsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbWF4UkdCKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRLZXlDb2xvclJhbmdlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluUkdCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4UkdCKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtaW5SR0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbWF4UkdCKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldElucHV0Q29sb3JTcGFjZU1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgY29sb3JTcGFjZU1vZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgY29sb3JTcGFjZU1vZGU7CiAjaWZuZGVmIFZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sb3JTcGFjZU1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldElucHV0Q29sb3JTcGFjZU1vZGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2VNb2RlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yU3BhY2VNb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclNwYWNlTW9kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGNvbG9yU3BhY2VNb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGNvbG9yU3BhY2VNb2RlOwogI2lmbmRlZiBWREdldElucHV0Q29sb3JTcGFjZU1vZGUKLQlQeU1hY19QUkVDSEVDSyhWREdldElucHV0Q29sb3JTcGFjZU1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0SW5wdXRDb2xvclNwYWNlTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JTcGFjZU1vZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2VNb2RlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JTcGFjZU1vZGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2VNb2RlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldENsaXBTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBjbGlwRW5hYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGNsaXBFbmFibGU7CiAjaWZuZGVmIFZEU2V0Q2xpcFN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRDbGlwU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0Q2xpcFN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2xpcEVuYWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0Q2xpcFN0YXRlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIGNsaXBFbmFibGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpcEVuYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0Q2xpcFN0YXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBFbmFibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0Q2xpcFN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGNsaXBFbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgY2xpcEVuYWJsZTsKICNpZm5kZWYgVkRHZXRDbGlwU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhWREdldENsaXBTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRDbGlwU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q2xpcFN0YXRlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICZjbGlwRW5hYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjbGlwRW5hYmxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRDbGlwU3RhdGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaXBFbmFibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBFbmFibGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0Q2xpcFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlSZ25IYW5kbGUgY2xpcFJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBSZ25IYW5kbGUgY2xpcFJlZ2lvbjsKICNpZm5kZWYgVkRTZXRDbGlwUmduCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRDbGlwUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldENsaXBSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldENsaXBSZ24oY2ksCi0JICAgICAgICAgICAgICAgICAgIGNsaXBSZWdpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRDbGlwUmduKGNpLAorICAgICAgICAgICAgICAgICAgICAgICBjbGlwUmVnaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRENsZWFyQ2xpcFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlSZ25IYW5kbGUgY2xpcFJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBSZ25IYW5kbGUgY2xpcFJlZ2lvbjsKICNpZm5kZWYgVkRDbGVhckNsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhWRENsZWFyQ2xpcFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRDbGVhckNsaXBSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRENsZWFyQ2xpcFJnbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICBjbGlwUmVnaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEQ2xlYXJDbGlwUmduKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSZWdpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0Q0xVVEluVXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUNUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBDVGFiSGFuZGxlIGNvbG9yVGFibGVIYW5kbGU7CiAjaWZuZGVmIFZER2V0Q0xVVEluVXNlCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRDTFVUSW5Vc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0Q0xVVEluVXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldENMVVRJblVzZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAmY29sb3JUYWJsZUhhbmRsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGNvbG9yVGFibGVIYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldENMVVRJblVzZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JUYWJsZUhhbmRsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGNvbG9yVGFibGVIYW5kbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0UExMRmlsdGVyVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBwbGxUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IHBsbFR5cGU7CiAjaWZuZGVmIFZEU2V0UExMRmlsdGVyVHlwZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0UExMRmlsdGVyVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRQTExGaWx0ZXJUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGxsVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0UExMRmlsdGVyVHlwZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcGxsVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwbGxUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRQTExGaWx0ZXJUeXBlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGxUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFBMTEZpbHRlclR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgcGxsVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBwbGxUeXBlOwogI2lmbmRlZiBWREdldFBMTEZpbHRlclR5cGUKLQlQeU1hY19QUkVDSEVDSyhWREdldFBMTEZpbHRlclR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0UExMRmlsdGVyVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRQTExGaWx0ZXJUeXBlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmcGxsVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGxsVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0UExMRmlsdGVyVHlwZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsbFR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBsbFR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0TWFza2FuZFZhbHVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IGJsZW5kTGV2ZWw7Ci0JbG9uZyBtYXNrOwotCWxvbmcgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbDsKKyAgICBsb25nIG1hc2s7CisgICAgbG9uZyB2YWx1ZTsKICNpZm5kZWYgVkRHZXRNYXNrYW5kVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhWREdldE1hc2thbmRWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRNYXNrYW5kVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZibGVuZExldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRNYXNrYW5kVmFsdWUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRMZXZlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmbWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtYXNrLAotCSAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsZW5kTGV2ZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldE1hc2thbmRWYWx1ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0TWFzdGVyQmxlbmRMZXZlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBibGVuZExldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGJsZW5kTGV2ZWw7CiAjaWZuZGVmIFZEU2V0TWFzdGVyQmxlbmRMZXZlbAotCVB5TWFjX1BSRUNIRUNLKFZEU2V0TWFzdGVyQmxlbmRMZXZlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRNYXN0ZXJCbGVuZExldmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldE1hc3RlckJsZW5kTGV2ZWwoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGVuZExldmVsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBibGVuZExldmVsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRNYXN0ZXJCbGVuZExldmVsKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxlbmRMZXZlbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRMZXZlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRQbGF5VGhydU9uT2ZmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IHN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IHN0YXRlOwogI2lmbmRlZiBWRFNldFBsYXlUaHJ1T25PZmYKLQlQeU1hY19QUkVDSEVDSyhWRFNldFBsYXlUaHJ1T25PZmYpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0UGxheVRocnVPbk9mZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRQbGF5VGhydU9uT2ZmKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0UGxheVRocnVPbk9mZihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0RmllbGRQcmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGZpZWxkRmxhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBmaWVsZEZsYWc7CiAjaWZuZGVmIFZEU2V0RmllbGRQcmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRGaWVsZFByZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0RmllbGRQcmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmllbGRGbGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRGaWVsZFByZWZlcmVuY2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGbGFnKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkRmxhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0RmllbGRQcmVmZXJlbmNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkRmxhZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRGaWVsZFByZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgZmllbGRGbGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGZpZWxkRmxhZzsKICNpZm5kZWYgVkRHZXRGaWVsZFByZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhWREdldEZpZWxkUHJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRGaWVsZFByZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0RmllbGRQcmVmZXJlbmNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZEZsYWcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZpZWxkRmxhZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0RmllbGRQcmVmZXJlbmNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZEZsYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkRmxhZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRQcmVmbGlnaHRHbG9iYWxSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUdyYWZQdHIgdGhlV2luZG93OwotCVJlY3QgZ2xvYmFsUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBHcmFmUHRyIHRoZVdpbmRvdzsKKyAgICBSZWN0IGdsb2JhbFJlY3Q7CiAjaWZuZGVmIFZEUHJlZmxpZ2h0R2xvYmFsUmVjdAotCVB5TWFjX1BSRUNIRUNLKFZEUHJlZmxpZ2h0R2xvYmFsUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRQcmVmbGlnaHRHbG9iYWxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRQcmVmbGlnaHRHbG9iYWxSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZ2xvYmFsUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFByZWZsaWdodEdsb2JhbFJlY3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZnbG9iYWxSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFBsYXlUaHJ1R2xvYmFsUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlHcmFmUHRyIHRoZVdpbmRvdzsKLQlSZWN0IGdsb2JhbFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgR3JhZlB0ciB0aGVXaW5kb3c7CisgICAgUmVjdCBnbG9iYWxSZWN0OwogI2lmbmRlZiBWRFNldFBsYXlUaHJ1R2xvYmFsUmVjdAotCVB5TWFjX1BSRUNIRUNLKFZEU2V0UGxheVRocnVHbG9iYWxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldFBsYXlUaHJ1R2xvYmFsUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnRoZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0UGxheVRocnVHbG9iYWxSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsUmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmdsb2JhbFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRQbGF5VGhydUdsb2JhbFJlY3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZ2xvYmFsUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRCbGFja0xldmVsVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsOwogI2lmbmRlZiBWRFNldEJsYWNrTGV2ZWxWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0QmxhY2tMZXZlbFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldEJsYWNrTGV2ZWxWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRCbGFja0xldmVsVmFsdWUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrTGV2ZWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJsYWNrTGV2ZWwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldEJsYWNrTGV2ZWxWYWx1ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2tMZXZlbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRCbGFja0xldmVsVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsOwogI2lmbmRlZiBWREdldEJsYWNrTGV2ZWxWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0QmxhY2tMZXZlbFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEJsYWNrTGV2ZWxWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRCbGFja0xldmVsVmFsdWUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrTGV2ZWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJsYWNrTGV2ZWwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEJsYWNrTGV2ZWxWYWx1ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2tMZXZlbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRXaGl0ZUxldmVsVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgd2hpdGVMZXZlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsOwogI2lmbmRlZiBWRFNldFdoaXRlTGV2ZWxWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0V2hpdGVMZXZlbFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldFdoaXRlTGV2ZWxWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRXaGl0ZUxldmVsVmFsdWUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaXRlTGV2ZWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHdoaXRlTGV2ZWwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFdoaXRlTGV2ZWxWYWx1ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpdGVMZXZlbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVMZXZlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRXaGl0ZUxldmVsVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgd2hpdGVMZXZlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsOwogI2lmbmRlZiBWREdldFdoaXRlTGV2ZWxWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0V2hpdGVMZXZlbFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFdoaXRlTGV2ZWxWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRXaGl0ZUxldmVsVmFsdWUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaXRlTGV2ZWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHdoaXRlTGV2ZWwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldFdoaXRlTGV2ZWxWYWx1ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpdGVMZXZlbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVMZXZlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRWaWRlb0RlZmF1bHRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWw7Ci0JdW5zaWduZWQgc2hvcnQgd2hpdGVMZXZlbDsKLQl1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzOwotCXVuc2lnbmVkIHNob3J0IGh1ZTsKLQl1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uOwotCXVuc2lnbmVkIHNob3J0IGNvbnRyYXN0OwotCXVuc2lnbmVkIHNob3J0IHNoYXJwbmVzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsOworICAgIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWw7CisgICAgdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzczsKKyAgICB1bnNpZ25lZCBzaG9ydCBodWU7CisgICAgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbjsKKyAgICB1bnNpZ25lZCBzaG9ydCBjb250cmFzdDsKKyAgICB1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3M7CiAjaWZuZGVmIFZER2V0VmlkZW9EZWZhdWx0cwotCVB5TWFjX1BSRUNIRUNLKFZER2V0VmlkZW9EZWZhdWx0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRWaWRlb0RlZmF1bHRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFZpZGVvRGVmYXVsdHMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZibGFja0xldmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpdGVMZXZlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmJyaWdodG5lc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZodWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZzYXR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJhc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFycG5lc3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSEhISEhISCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJsYWNrTGV2ZWwsCi0JICAgICAgICAgICAgICAgICAgICAgd2hpdGVMZXZlbCwKLQkgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzLAotCSAgICAgICAgICAgICAgICAgICAgIGh1ZSwKLQkgICAgICAgICAgICAgICAgICAgICBzYXR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0LAotCSAgICAgICAgICAgICAgICAgICAgIHNoYXJwbmVzcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0VmlkZW9EZWZhdWx0cyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGl0ZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJpZ2h0bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmh1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cmFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxISEhISEhIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgaHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldE51bWJlck9mSW5wdXRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGlucHV0czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBpbnB1dHM7CiAjaWZuZGVmIFZER2V0TnVtYmVyT2ZJbnB1dHMKLQlQeU1hY19QUkVDSEVDSyhWREdldE51bWJlck9mSW5wdXRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldE51bWJlck9mSW5wdXRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldE51bWJlck9mSW5wdXRzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0cyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5wdXRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXROdW1iZXJPZklucHV0cyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRJbnB1dEZvcm1hdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBpbnB1dDsKLQlzaG9ydCBmb3JtYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXQ7CisgICAgc2hvcnQgZm9ybWF0OwogI2lmbmRlZiBWREdldElucHV0Rm9ybWF0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRJbnB1dEZvcm1hdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRJbnB1dEZvcm1hdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRJbnB1dEZvcm1hdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LAotCSAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRJbnB1dEZvcm1hdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldElucHV0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGlucHV0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGlucHV0OwogI2lmbmRlZiBWRFNldElucHV0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRJbnB1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRJbnB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRJbnB1dChjaSwKLQkgICAgICAgICAgICAgICAgIGlucHV0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRJbnB1dChjaSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldElucHV0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGlucHV0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGlucHV0OwogI2lmbmRlZiBWREdldElucHV0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRJbnB1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRJbnB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRJbnB1dChjaSwKLQkgICAgICAgICAgICAgICAgICZpbnB1dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5wdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldElucHV0KGNpLAorICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRJbnB1dFN0YW5kYXJkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGlucHV0U3RhbmRhcmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXRTdGFuZGFyZDsKICNpZm5kZWYgVkRTZXRJbnB1dFN0YW5kYXJkCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRJbnB1dFN0YW5kYXJkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldElucHV0U3RhbmRhcmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFN0YW5kYXJkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRJbnB1dFN0YW5kYXJkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0YW5kYXJkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RhbmRhcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldElucHV0U3RhbmRhcmQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RhbmRhcmQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0dXBCdWZmZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVZkaWdCdWZmZXJSZWNMaXN0SGFuZGxlIGJ1ZmZlckxpc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgVmRpZ0J1ZmZlclJlY0xpc3RIYW5kbGUgYnVmZmVyTGlzdDsKICNpZm5kZWYgVkRTZXR1cEJ1ZmZlcnMKLQlQeU1hY19QUkVDSEVDSyhWRFNldHVwQnVmZmVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXR1cEJ1ZmZlcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmJ1ZmZlckxpc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldHVwQnVmZmVycyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICBidWZmZXJMaXN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYnVmZmVyTGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0dXBCdWZmZXJzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckxpc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER3JhYk9uZUZyYW1lQXN5bmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgYnVmZmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGJ1ZmZlcjsKICNpZm5kZWYgVkRHcmFiT25lRnJhbWVBc3luYwotCVB5TWFjX1BSRUNIRUNLKFZER3JhYk9uZUZyYW1lQXN5bmMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER3JhYk9uZUZyYW1lQXN5bmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdyYWJPbmVGcmFtZUFzeW5jKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER3JhYk9uZUZyYW1lQXN5bmMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZERG9uZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBidWZmZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgYnVmZmVyOwogI2lmbmRlZiBWRERvbmUKLQlQeU1hY19QUkVDSEVDSyhWRERvbmUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZERG9uZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZERG9uZShjaSwKLQkgICAgICAgICAgICAgYnVmZmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZERG9uZShjaSwKKyAgICAgICAgICAgICAgICAgYnVmZmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldENvbXByZXNzaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCU9TVHlwZSBjb21wcmVzc1R5cGU7Ci0Jc2hvcnQgZGVwdGg7Ci0JUmVjdCBib3VuZHM7Ci0JQ29kZWNRIHNwYXRpYWxRdWFsaXR5OwotCUNvZGVjUSB0ZW1wb3JhbFF1YWxpdHk7Ci0JbG9uZyBrZXlGcmFtZVJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGNvbXByZXNzVHlwZTsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBDb2RlY1Egc3BhdGlhbFF1YWxpdHk7CisgICAgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKKyAgICBsb25nIGtleUZyYW1lUmF0ZTsKICNpZm5kZWYgVkRTZXRDb21wcmVzc2lvbgotCVB5TWFjX1BSRUNIRUNLKFZEU2V0Q29tcHJlc3Npb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0Q29tcHJlc3Npb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3NUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmtleUZyYW1lUmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0Q29tcHJlc3Npb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGtleUZyYW1lUmF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleUZyYW1lUmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0Q29tcHJlc3Npb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUZyYW1lUmF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRDb21wcmVzc09uZUZyYW1lQXN5bmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CiAjaWZuZGVmIFZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jCi0JUHlNYWNfUFJFQ0hFQ0soVkRDb21wcmVzc09uZUZyYW1lQXN5bmMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRENvbXByZXNzT25lRnJhbWVBc3luYyhjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEltYWdlRGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKICNpZm5kZWYgVkRHZXRJbWFnZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRJbWFnZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEltYWdlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEltYWdlRGVzY3JpcHRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRJbWFnZURlc2NyaXB0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKICNpZm5kZWYgVkRSZXNldENvbXByZXNzU2VxdWVuY2UKLQlQeU1hY19QUkVDSEVDSyhWRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRSZXNldENvbXByZXNzU2VxdWVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEUmVzZXRDb21wcmVzc1NlcXVlbmNlKGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRSZXNldENvbXByZXNzU2VxdWVuY2UoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0Q29tcHJlc3Npb25Pbk9mZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlCb29sZWFuIHN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gc3RhdGU7CiAjaWZuZGVmIFZEU2V0Q29tcHJlc3Npb25Pbk9mZgotCVB5TWFjX1BSRUNIRUNLKFZEU2V0Q29tcHJlc3Npb25Pbk9mZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb21wcmVzc2lvbk9uT2ZmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldENvbXByZXNzaW9uT25PZmYoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRDb21wcmVzc2lvbk9uT2ZmKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRDb21wcmVzc2lvblR5cGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVZEQ29tcHJlc3Npb25MaXN0SGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgVkRDb21wcmVzc2lvbkxpc3RIYW5kbGUgaDsKICNpZm5kZWYgVkRHZXRDb21wcmVzc2lvblR5cGVzCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRDb21wcmVzc2lvblR5cGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldENvbXByZXNzaW9uVHlwZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldENvbXByZXNzaW9uVHlwZXMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRDb21wcmVzc2lvblR5cGVzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFRpbWVCYXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVRpbWVCYXNlIHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgVGltZUJhc2UgdDsKICNpZm5kZWYgVkRTZXRUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0VGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0VGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0VGltZUJhc2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICB0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRUaW1lQmFzZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0RnJhbWVSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUZpeGVkIGZyYW1lc1BlclNlY29uZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBGaXhlZCBmcmFtZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIFZEU2V0RnJhbWVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRGcmFtZVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0RnJhbWVSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZmcmFtZXNQZXJTZWNvbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEZyYW1lUmF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICBmcmFtZXNQZXJTZWNvbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZmcmFtZXNQZXJTZWNvbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldEZyYW1lUmF0ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNQZXJTZWNvbmQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0RGF0YVJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JbG9uZyBtaWxsaVNlY1BlckZyYW1lOwotCUZpeGVkIGZyYW1lc1BlclNlY29uZDsKLQlsb25nIGJ5dGVzUGVyU2Vjb25kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgbWlsbGlTZWNQZXJGcmFtZTsKKyAgICBGaXhlZCBmcmFtZXNQZXJTZWNvbmQ7CisgICAgbG9uZyBieXRlc1BlclNlY29uZDsKICNpZm5kZWYgVkRHZXREYXRhUmF0ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0RGF0YVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0RGF0YVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0RGF0YVJhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAmbWlsbGlTZWNQZXJGcmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICZmcmFtZXNQZXJTZWNvbmQsCi0JICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1pbGxpU2VjUGVyRnJhbWUsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgZnJhbWVzUGVyU2Vjb25kLAotCSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyU2Vjb25kKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXREYXRhUmF0ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaVNlY1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lc1BlclNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBmcmFtZXNQZXJTZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0U291bmRJbnB1dERyaXZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlTdHIyNTUgc291bmREcml2ZXJOYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFN0cjI1NSBzb3VuZERyaXZlck5hbWU7CiAjaWZuZGVmIFZER2V0U291bmRJbnB1dERyaXZlcgotCVB5TWFjX1BSRUNIRUNLKFZER2V0U291bmRJbnB1dERyaXZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRTb3VuZElucHV0RHJpdmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzb3VuZERyaXZlck5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFNvdW5kSW5wdXREcml2ZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kRHJpdmVyTmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHNvdW5kRHJpdmVyTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0U291bmRJbnB1dERyaXZlcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmREcml2ZXJOYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldERNQURlcHRocyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIGRlcHRoQXJyYXk7Ci0JbG9uZyBwcmVmZXJyZWREZXB0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBsb25nIGRlcHRoQXJyYXk7CisgICAgbG9uZyBwcmVmZXJyZWREZXB0aDsKICNpZm5kZWYgVkRHZXRETUFEZXB0aHMKLQlQeU1hY19QUkVDSEVDSyhWREdldERNQURlcHRocyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRETUFEZXB0aHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0RE1BRGVwdGhzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICZkZXB0aEFycmF5LAotCSAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWREZXB0aCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRlcHRoQXJyYXksCi0JICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkRGVwdGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldERNQURlcHRocyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGhBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlZmVycmVkRGVwdGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZERlcHRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFByZWZlcnJlZFRpbWVTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlUaW1lU2NhbGUgcHJlZmVycmVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFRpbWVTY2FsZSBwcmVmZXJyZWQ7CiAjaWZuZGVmIFZER2V0UHJlZmVycmVkVGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0UHJlZmVycmVkVGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFByZWZlcnJlZFRpbWVTY2FsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlZmVycmVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldFByZWZlcnJlZFRpbWVTY2FsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlZmVycmVkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEUmVsZWFzZUFzeW5jQnVmZmVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKICNpZm5kZWYgVkRSZWxlYXNlQXN5bmNCdWZmZXJzCi0JUHlNYWNfUFJFQ0hFQ0soVkRSZWxlYXNlQXN5bmNCdWZmZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFJlbGVhc2VBc3luY0J1ZmZlcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEUmVsZWFzZUFzeW5jQnVmZmVycyhjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEUmVsZWFzZUFzeW5jQnVmZmVycyhjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXREYXRhUmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIGJ5dGVzUGVyU2Vjb25kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIFZEU2V0RGF0YVJhdGUKLQlQeU1hY19QUkVDSEVDSyhWRFNldERhdGFSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldERhdGFSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldERhdGFSYXRlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldERhdGFSYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0VGltZUNvZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JVGltZVJlY29yZCBhdFRpbWU7Ci0Jdm9pZCAqIHRpbWVDb2RlRm9ybWF0OwotCXZvaWQgKiB0aW1lQ29kZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgVGltZVJlY29yZCBhdFRpbWU7CisgICAgdm9pZCAqIHRpbWVDb2RlRm9ybWF0OworICAgIHZvaWQgKiB0aW1lQ29kZVRpbWU7CiAjaWZuZGVmIFZER2V0VGltZUNvZGUKLQlQeU1hY19QUkVDSEVDSyhWREdldFRpbWVDb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFRpbWVDb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc3MiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWVDb2RlRm9ybWF0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZUNvZGVUaW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRUaW1lQ29kZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICB0aW1lQ29kZUZvcm1hdCwKLQkgICAgICAgICAgICAgICAgICAgIHRpbWVDb2RlVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZhdFRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVDb2RlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZUNvZGVUaW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRUaW1lQ29kZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lQ29kZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVDb2RlVGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZhdFRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEVXNlU2FmZUJ1ZmZlcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiB1c2VTYWZlQnVmZmVyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIHVzZVNhZmVCdWZmZXJzOwogI2lmbmRlZiBWRFVzZVNhZmVCdWZmZXJzCi0JUHlNYWNfUFJFQ0hFQ0soVkRVc2VTYWZlQnVmZmVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRVc2VTYWZlQnVmZmVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZVNhZmVCdWZmZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRVc2VTYWZlQnVmZmVycyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHVzZVNhZmVCdWZmZXJzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZVNhZmVCdWZmZXJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRVc2VTYWZlQnVmZmVycyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVNhZmVCdWZmZXJzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFNvdW5kSW5wdXRTb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JbG9uZyB2aWRlb0lucHV0OwotCWxvbmcgc291bmRJbnB1dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBsb25nIHZpZGVvSW5wdXQ7CisgICAgbG9uZyBzb3VuZElucHV0OwogI2lmbmRlZiBWREdldFNvdW5kSW5wdXRTb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhWREdldFNvdW5kSW5wdXRTb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0U291bmRJbnB1dFNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpZGVvSW5wdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFNvdW5kSW5wdXRTb3VyY2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VuZElucHV0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzb3VuZElucHV0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpZGVvSW5wdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldFNvdW5kSW5wdXRTb3VyY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VuZElucHV0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZElucHV0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldENvbXByZXNzaW9uVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlPU1R5cGUgY29tcHJlc3Npb25UeXBlOwotCXNob3J0IGRlcHRoOwotCVJlY3Qgc3JjUmVjdDsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7Ci0JQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKLQl1bnNpZ25lZCBsb25nIGNvbXByZXNzVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgY29tcHJlc3Npb25UeXBlOworICAgIHNob3J0IGRlcHRoOworICAgIFJlY3Qgc3JjUmVjdDsKKyAgICBDb2RlY1Egc3BhdGlhbFF1YWxpdHk7CisgICAgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKKyAgICB1bnNpZ25lZCBsb25nIGNvbXByZXNzVGltZTsKICNpZm5kZWYgVkRHZXRDb21wcmVzc2lvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhWREdldENvbXByZXNzaW9uVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRDb21wcmVzc2lvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3Npb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldENvbXByZXNzaW9uVGltZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3Npb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldENvbXByZXNzaW9uVGltZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzVGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRQcmVmZXJyZWRQYWNrZXRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlczsKICNpZm5kZWYgVkRTZXRQcmVmZXJyZWRQYWNrZXRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRQcmVmZXJyZWRQYWNrZXRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldFByZWZlcnJlZFBhY2tldFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFByZWZlcnJlZFBhY2tldFNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIHdpZHRoOwotCWxvbmcgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgd2lkdGg7CisgICAgbG9uZyBoZWlnaHQ7CiAjaWZuZGVmIFZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JbG9uZyB3aWR0aDsKLQlsb25nIGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBsb25nIHdpZHRoOworICAgIGxvbmcgaGVpZ2h0OwogI2lmbmRlZiBWREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucwotCVB5TWFjX1BSRUNIRUNLKFZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRJbnB1dE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JbG9uZyB2aWRlb0lucHV0OwotCVN0cjI1NSBuYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgdmlkZW9JbnB1dDsKKyAgICBTdHIyNTUgbmFtZTsKICNpZm5kZWYgVkRHZXRJbnB1dE5hbWUKLQlQeU1hY19QUkVDSEVDSyhWREdldElucHV0TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRJbnB1dE5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpZGVvSW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0SW5wdXROYW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpZGVvSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0SW5wdXROYW1lKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXREZXN0aW5hdGlvblBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JQ0dyYWZQdHIgZGVzdFBvcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgQ0dyYWZQdHIgZGVzdFBvcnQ7CiAjaWZuZGVmIFZEU2V0RGVzdGluYXRpb25Qb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRTZXREZXN0aW5hdGlvblBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0RGVzdGluYXRpb25Qb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmZGVzdFBvcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldERlc3RpbmF0aW9uUG9ydChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UG9ydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZkZXN0UG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0RGVzdGluYXRpb25Qb3J0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQb3J0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldERldmljZU5hbWVBbmRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlTdHIyNTUgb3V0TmFtZTsKLQlVSW50MzIgb3V0TmFtZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFN0cjI1NSBvdXROYW1lOworICAgIFVJbnQzMiBvdXROYW1lRmxhZ3M7CiAjaWZuZGVmIFZER2V0RGV2aWNlTmFtZUFuZEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0RGV2aWNlTmFtZUFuZEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvdXROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmFtZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXROYW1lRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvdXROYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmFtZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXROYW1lRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEQ2FwdHVyZVN0YXRlQ2hhbmdpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JVUludDMyIGluU3RhdGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBVSW50MzIgaW5TdGF0ZUZsYWdzOwogI2lmbmRlZiBWRENhcHR1cmVTdGF0ZUNoYW5naW5nCi0JUHlNYWNfUFJFQ0hFQ0soVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEQ2FwdHVyZVN0YXRlQ2hhbmdpbmcoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQlsb25nIGVycm9yTGluZTsKLQlTdHJpbmdQdHIgZXJyRGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIGxvbmcgZXJyb3JMaW5lOworICAgIFN0cmluZ1B0ciBlcnJEZXNjOwogI2lmbmRlZiBYTUxQYXJzZUdldERldGFpbGVkUGFyc2VFcnJvcgotCVB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUdldERldGFpbGVkUGFyc2VFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXJyRGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yKGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yTGluZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJEZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBlcnJvckxpbmUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJEZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IoYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyckRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTGluZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfWE1MUGFyc2VBZGRFbGVtZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7Ci0JY2hhciBlbGVtZW50TmFtZTsKLQlVSW50MzIgbmFtZVNwYWNlSUQ7Ci0JVUludDMyIGVsZW1lbnRJRDsKLQlsb25nIGVsZW1lbnRGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIGNoYXIgZWxlbWVudE5hbWU7CisgICAgVUludDMyIG5hbWVTcGFjZUlEOworICAgIFVJbnQzMiBlbGVtZW50SUQ7CisgICAgbG9uZyBlbGVtZW50RmxhZ3M7CiAjaWZuZGVmIFhNTFBhcnNlQWRkRWxlbWVudAotCVB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkRWxlbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRFbGVtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZUFkZEVsZW1lbnQoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVTcGFjZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gWE1MUGFyc2VBZGRFbGVtZW50KGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfWE1MUGFyc2VBZGRBdHRyaWJ1dGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQlVSW50MzIgZWxlbWVudElEOwotCVVJbnQzMiBuYW1lU3BhY2VJRDsKLQljaGFyIGF0dHJpYnV0ZU5hbWU7Ci0JVUludDMyIGF0dHJpYnV0ZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7CisgICAgVUludDMyIGVsZW1lbnRJRDsKKyAgICBVSW50MzIgbmFtZVNwYWNlSUQ7CisgICAgY2hhciBhdHRyaWJ1dGVOYW1lOworICAgIFVJbnQzMiBhdHRyaWJ1dGVJRDsKICNpZm5kZWYgWE1MUGFyc2VBZGRBdHRyaWJ1dGUKLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEF0dHJpYnV0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRBdHRyaWJ1dGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFhNTFBhcnNlQWRkQXR0cmlidXRlKGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUFkZEF0dHJpYnV0ZShhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCVVJbnQzMiBlbGVtZW50SUQ7Ci0JVUludDMyIG5hbWVTcGFjZUlEczsKLQljaGFyIGF0dHJpYnV0ZU5hbWVzOwotCVVJbnQzMiBhdHRyaWJ1dGVJRHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKKyAgICBVSW50MzIgZWxlbWVudElEOworICAgIFVJbnQzMiBuYW1lU3BhY2VJRHM7CisgICAgY2hhciBhdHRyaWJ1dGVOYW1lczsKKyAgICBVSW50MzIgYXR0cmlidXRlSURzOwogI2lmbmRlZiBYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VBZGRNdWx0aXBsZUF0dHJpYnV0ZXMoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVTcGFjZUlEcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlTmFtZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlEcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsY2wiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRHMsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZXMsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSURzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gWE1MUGFyc2VBZGRNdWx0aXBsZUF0dHJpYnV0ZXMoYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVTcGFjZUlEcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlEcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsY2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSURzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7Ci0JVUludDMyIGVsZW1lbnRJRDsKLQlVSW50MzIgbmFtZVNwYWNlSUQ7Ci0JY2hhciBhdHRyaWJ1dGVOYW1lOwotCVVJbnQzMiBhdHRyaWJ1dGVJRDsKLQlVSW50MzIgYXR0cmlidXRlVmFsdWVLaW5kOwotCXZvaWQgKiBhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7CisgICAgVUludDMyIGVsZW1lbnRJRDsKKyAgICBVSW50MzIgbmFtZVNwYWNlSUQ7CisgICAgY2hhciBhdHRyaWJ1dGVOYW1lOworICAgIFVJbnQzMiBhdHRyaWJ1dGVJRDsKKyAgICBVSW50MzIgYXR0cmlidXRlVmFsdWVLaW5kOworICAgIHZvaWQgKiBhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvOwogI2lmbmRlZiBYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRBdHRyaWJ1dGVBbmRWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRBdHRyaWJ1dGVBbmRWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudElELAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVWYWx1ZUtpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VBZGRBdHRyaWJ1dGVBbmRWYWx1ZShhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlS2luZEluZm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2wiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVWYWx1ZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gWE1MUGFyc2VBZGRBdHRyaWJ1dGVBbmRWYWx1ZShhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlS2luZEluZm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCVVJbnQzMiBlbGVtZW50SUQ7Ci0JVUludDMyIGF0dHJpYnV0ZUlEOwotCVVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQ7Ci0Jdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKKyAgICBVSW50MzIgZWxlbWVudElEOworICAgIFVJbnQzMiBhdHRyaWJ1dGVJRDsKKyAgICBVSW50MzIgYXR0cmlidXRlVmFsdWVLaW5kOworICAgIHZvaWQgKiBhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvOwogI2lmbmRlZiBYTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZAotCVB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudElELAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVWYWx1ZUtpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlS2luZEluZm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZEluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZChhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kSW5mbyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfWE1MUGFyc2VBZGROYW1lU3BhY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQljaGFyIG5hbWVTcGFjZVVSTDsKLQlVSW50MzIgbmFtZVNwYWNlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKKyAgICBjaGFyIG5hbWVTcGFjZVVSTDsKKyAgICBVSW50MzIgbmFtZVNwYWNlSUQ7CiAjaWZuZGVmIFhNTFBhcnNlQWRkTmFtZVNwYWNlCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGROYW1lU3BhY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkTmFtZVNwYWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFhNTFBhcnNlQWRkTmFtZVNwYWNlKGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVTcGFjZVVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2wiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VVUkwsCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlQWRkTmFtZVNwYWNlKGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVTcGFjZVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1hNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQlVSW50MzIgb2Zmc2V0OwotCVVJbnQzMiBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIFVJbnQzMiBvZmZzZXQ7CisgICAgVUludDMyIGxpbWl0OwogI2lmbmRlZiBYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0Ci0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VTZXRPZmZzZXRBbmRMaW1pdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VTZXRPZmZzZXRBbmRMaW1pdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VTZXRPZmZzZXRBbmRMaW1pdChhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0KGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7Ci0JbG9uZyByZWZjb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKKyAgICBsb25nIHJlZmNvbjsKICNpZm5kZWYgWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZmNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFhNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbihhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZjb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZjb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24oYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmY29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0luaXRpYWxpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKICNpZm5kZWYgU0dJbml0aWFsaXplCi0JUHlNYWNfUFJFQ0hFQ0soU0dJbml0aWFsaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0luaXRpYWxpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dJbml0aWFsaXplKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHSW5pdGlhbGl6ZShzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldERhdGFPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUZTU3BlYyBtb3ZpZUZpbGU7Ci0JbG9uZyB3aGVyZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBGU1NwZWMgbW92aWVGaWxlOworICAgIGxvbmcgd2hlcmVGbGFnczsKICNpZm5kZWYgU0dTZXREYXRhT3V0cHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dTZXREYXRhT3V0cHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldERhdGFPdXRwdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZtb3ZpZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXREYXRhT3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmbW92aWVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0RGF0YU91dHB1dChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldERhdGFPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUZTU3BlYyBtb3ZpZUZpbGU7Ci0JbG9uZyB3aGVyZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBGU1NwZWMgbW92aWVGaWxlOworICAgIGxvbmcgd2hlcmVGbGFnczsKICNpZm5kZWYgU0dHZXREYXRhT3V0cHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dHZXREYXRhT3V0cHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldERhdGFPdXRwdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJm1vdmllRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0RGF0YU91dHB1dChzLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJm1vdmllRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0RGF0YU91dHB1dChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUNHcmFmUHRyIGdwOwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBDR3JhZlB0ciBncDsKKyAgICBHREhhbmRsZSBnZDsKICNpZm5kZWYgU0dTZXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhTR1NldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmZ3AsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldEdXb3JsZChzLAotCSAgICAgICAgICAgICAgICAgIGdwLAotCSAgICAgICAgICAgICAgICAgIGdkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZncCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0R1dvcmxkKHMsCisgICAgICAgICAgICAgICAgICAgICAgZ3AsCisgICAgICAgICAgICAgICAgICAgICAgZ2QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0R1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlDR3JhZlB0ciBncDsKLQlHREhhbmRsZSBnZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgQ0dyYWZQdHIgZ3A7CisgICAgR0RIYW5kbGUgZ2Q7CiAjaWZuZGVmIFNHR2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0R1dvcmxkKHMsCi0JICAgICAgICAgICAgICAgICAgJmdwLAotCSAgICAgICAgICAgICAgICAgICZnZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIGdwLAotCSAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGdkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldEdXb3JsZChzLAorICAgICAgICAgICAgICAgICAgICAgICZncCwKKyAgICAgICAgICAgICAgICAgICAgICAmZ2QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBncCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBnZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dOZXdDaGFubmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlPU1R5cGUgY2hhbm5lbFR5cGU7Ci0JU0dDaGFubmVsIHJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgT1NUeXBlIGNoYW5uZWxUeXBlOworICAgIFNHQ2hhbm5lbCByZWY7CiAjaWZuZGVmIFNHTmV3Q2hhbm5lbAotCVB5TWFjX1BSRUNIRUNLKFNHTmV3Q2hhbm5lbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dOZXdDaGFubmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjaGFubmVsVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHTmV3Q2hhbm5lbChzLAotCSAgICAgICAgICAgICAgICAgICBjaGFubmVsVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgJnJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCByZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjaGFubmVsVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHTmV3Q2hhbm5lbChzLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCByZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHRGlzcG9zZUNoYW5uZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dEaXNwb3NlQ2hhbm5lbAotCVB5TWFjX1BSRUNIRUNLKFNHRGlzcG9zZUNoYW5uZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHRGlzcG9zZUNoYW5uZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0Rpc3Bvc2VDaGFubmVsKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICBjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHRGlzcG9zZUNoYW5uZWwocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU3RhcnRQcmV2aWV3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CiAjaWZuZGVmIFNHU3RhcnRQcmV2aWV3Ci0JUHlNYWNfUFJFQ0hFQ0soU0dTdGFydFByZXZpZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU3RhcnRQcmV2aWV3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU3RhcnRQcmV2aWV3KHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU3RhcnRQcmV2aWV3KHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU3RhcnRSZWNvcmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKICNpZm5kZWYgU0dTdGFydFJlY29yZAotCVB5TWFjX1BSRUNIRUNLKFNHU3RhcnRSZWNvcmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU3RhcnRSZWNvcmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTdGFydFJlY29yZChzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1N0YXJ0UmVjb3JkKHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHSWRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOwogI2lmbmRlZiBTR0lkbGUKLQlQeU1hY19QUkVDSEVDSyhTR0lkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHSWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0lkbGUocyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dJZGxlKHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU3RvcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOwogI2lmbmRlZiBTR1N0b3AKLQlQeU1hY19QUkVDSEVDSyhTR1N0b3ApOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU3RvcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1N0b3Aocyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTdG9wKHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGF1c2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUJvb2xlYW4gcGF1c2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEJvb2xlYW4gcGF1c2U7CiAjaWZuZGVmIFNHUGF1c2UKLQlQeU1hY19QUkVDSEVDSyhTR1BhdXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXVzZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGF1c2UocywKLQkgICAgICAgICAgICAgIHBhdXNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF1c2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhdXNlKHMsCisgICAgICAgICAgICAgICAgICBwYXVzZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQcmVwYXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlCb29sZWFuIHByZXBhcmVGb3JQcmV2aWV3OwotCUJvb2xlYW4gcHJlcGFyZUZvclJlY29yZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgQm9vbGVhbiBwcmVwYXJlRm9yUHJldmlldzsKKyAgICBCb29sZWFuIHByZXBhcmVGb3JSZWNvcmQ7CiAjaWZuZGVmIFNHUHJlcGFyZQotCVB5TWFjX1BSRUNIRUNLKFNHUHJlcGFyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQcmVwYXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlcGFyZUZvclByZXZpZXcsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVwYXJlRm9yUmVjb3JkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQcmVwYXJlKHMsCi0JICAgICAgICAgICAgICAgIHByZXBhcmVGb3JQcmV2aWV3LAotCSAgICAgICAgICAgICAgICBwcmVwYXJlRm9yUmVjb3JkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXBhcmVGb3JQcmV2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlcGFyZUZvclJlY29yZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUHJlcGFyZShzLAorICAgICAgICAgICAgICAgICAgICBwcmVwYXJlRm9yUHJldmlldywKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZUZvclJlY29yZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dSZWxlYXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CiAjaWZuZGVmIFNHUmVsZWFzZQotCVB5TWFjX1BSRUNIRUNLKFNHUmVsZWFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dSZWxlYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUmVsZWFzZShzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1JlbGVhc2Uocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRNb3ZpZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKICNpZm5kZWYgU0dHZXRNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0TW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0TW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRNb3ZpZShzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldE1vdmllKHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0TWF4aW11bVJlY29yZFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCXVuc2lnbmVkIGxvbmcgdGlja3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIHVuc2lnbmVkIGxvbmcgdGlja3M7CiAjaWZuZGVmIFNHU2V0TWF4aW11bVJlY29yZFRpbWUKLQlQeU1hY19QUkVDSEVDSyhTR1NldE1heGltdW1SZWNvcmRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldE1heGltdW1SZWNvcmRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aWNrcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0TWF4aW11bVJlY29yZFRpbWUocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGlja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldE1heGltdW1SZWNvcmRUaW1lKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRNYXhpbXVtUmVjb3JkVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JdW5zaWduZWQgbG9uZyB0aWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgdW5zaWduZWQgbG9uZyB0aWNrczsKICNpZm5kZWYgU0dHZXRNYXhpbXVtUmVjb3JkVGltZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0TWF4aW11bVJlY29yZFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0TWF4aW11bVJlY29yZFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRNYXhpbXVtUmVjb3JkVGltZShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpY2tzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB0aWNrcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRNYXhpbXVtUmVjb3JkVGltZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpY2tzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCXVuc2lnbmVkIGxvbmcgYnl0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIHVuc2lnbmVkIGxvbmcgYnl0ZXM7CiAjaWZuZGVmIFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBieXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFRpbWVSZW1haW5pbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCWxvbmcgdGlja3NMZWZ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBsb25nIHRpY2tzTGVmdDsKICNpZm5kZWYgU0dHZXRUaW1lUmVtYWluaW5nCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRUaW1lUmVtYWluaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFRpbWVSZW1haW5pbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRUaW1lUmVtYWluaW5nKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ0aWNrc0xlZnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHRpY2tzTGVmdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRUaW1lUmVtYWluaW5nKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aWNrc0xlZnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzTGVmdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHcmFiUGljdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JUGljSGFuZGxlIHA7Ci0JUmVjdCBib3VuZHM7Ci0Jc2hvcnQgb2Zmc2NyZWVuRGVwdGg7Ci0JbG9uZyBncmFiUGljdEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBQaWNIYW5kbGUgcDsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBzaG9ydCBvZmZzY3JlZW5EZXB0aDsKKyAgICBsb25nIGdyYWJQaWN0RmxhZ3M7CiAjaWZuZGVmIFNHR3JhYlBpY3QKLQlQeU1hY19QUkVDSEVDSyhTR0dyYWJQaWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dyYWJQaWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzY3JlZW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyYWJQaWN0RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dyYWJQaWN0KHMsCi0JICAgICAgICAgICAgICAgICAmcCwKLQkgICAgICAgICAgICAgICAgICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICBvZmZzY3JlZW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgIGdyYWJQaWN0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2NyZWVuRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZncmFiUGljdEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHcmFiUGljdChzLAorICAgICAgICAgICAgICAgICAgICAgJnAsCisgICAgICAgICAgICAgICAgICAgICAmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICBncmFiUGljdEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRMYXN0TW92aWVSZXNJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0Jc2hvcnQgcmVzSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIHNob3J0IHJlc0lEOwogI2lmbmRlZiBTR0dldExhc3RNb3ZpZVJlc0lECi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRMYXN0TW92aWVSZXNJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRMYXN0TW92aWVSZXNJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldExhc3RNb3ZpZVJlc0lEKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlc0lEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldExhc3RNb3ZpZVJlc0lEKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlsb25nIHNnRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIGxvbmcgc2dGbGFnczsKICNpZm5kZWYgU0dTZXRGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNnRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldEZsYWdzKHMsCi0JICAgICAgICAgICAgICAgICBzZ0ZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2dGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0RmxhZ3MocywKKyAgICAgICAgICAgICAgICAgICAgIHNnRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCWxvbmcgc2dGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgbG9uZyBzZ0ZsYWdzOwogI2lmbmRlZiBTR0dldEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldEZsYWdzKHMsCi0JICAgICAgICAgICAgICAgICAmc2dGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2dGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRGbGFncyhzLAorICAgICAgICAgICAgICAgICAgICAgJnNnRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNnRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBuZXdDaGFubmVsOwotCUNvbXBvbmVudCBzZ0NoYW5uZWxDb21wb25lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBuZXdDaGFubmVsOworICAgIENvbXBvbmVudCBzZ0NoYW5uZWxDb21wb25lbnQ7CiAjaWZuZGVmIFNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhTR05ld0NoYW5uZWxGcm9tQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR05ld0NoYW5uZWxGcm9tQ29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJnNnQ2hhbm5lbENvbXBvbmVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdDaGFubmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dDaGFubmVsQ29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIG5ld0NoYW5uZWwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJnNnQ2hhbm5lbENvbXBvbmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dDaGFubmVsQ29tcG9uZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIG5ld0NoYW5uZWwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0U2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVVzZXJEYXRhIHVkOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFVzZXJEYXRhIHVkOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIFNHU2V0U2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR1NldFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJnVkLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFNldHRpbmdzKHMsCi0JICAgICAgICAgICAgICAgICAgICB1ZCwKLQkgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZ1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRTZXR0aW5ncyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgdWQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dHZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTZXR0aW5ncyhzLAotCSAgICAgICAgICAgICAgICAgICAgJnVkLAotCSAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFNldHRpbmdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAmdWQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX05ldywgdWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0SW5kQ2hhbm5lbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0Jc2hvcnQgaW5kZXg7Ci0JU0dDaGFubmVsIHJlZjsKLQlPU1R5cGUgY2hhblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIHNob3J0IGluZGV4OworICAgIFNHQ2hhbm5lbCByZWY7CisgICAgT1NUeXBlIGNoYW5UeXBlOwogI2lmbmRlZiBTR0dldEluZENoYW5uZWwKLQlQeU1hY19QUkVDSEVDSyhTR0dldEluZENoYW5uZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0SW5kQ2hhbm5lbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldEluZENoYW5uZWwocywKLQkgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaGFuVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIHJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgY2hhblR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0SW5kQ2hhbm5lbChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5UeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjaGFuVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dVcGRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVJnbkhhbmRsZSB1cGRhdGVSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFJnbkhhbmRsZSB1cGRhdGVSZ247CiAjaWZuZGVmIFNHVXBkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU0dVcGRhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHVXBkYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHVXBkYXRlKHMsCi0JICAgICAgICAgICAgICAgdXBkYXRlUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ1cGRhdGVSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1VwZGF0ZShzLAorICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRQYXVzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JQm9vbGVhbiBwYXVzZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEJvb2xlYW4gcGF1c2VkOwogI2lmbmRlZiBTR0dldFBhdXNlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRQYXVzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRQYXVzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFBhdXNlKHMsCi0JICAgICAgICAgICAgICAgICAmcGF1c2VkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBwYXVzZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0UGF1c2UocywKKyAgICAgICAgICAgICAgICAgICAgICZwYXVzZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdXNlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsU2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCVVzZXJEYXRhIHVkOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIFVzZXJEYXRhIHVkOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmdWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbFNldHRpbmdzKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZ1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsU2V0dGluZ3MocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dHZXRDaGFubmVsU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxTZXR0aW5ncyhzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB1ZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxTZXR0aW5ncyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB1ZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRNb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlCb29sZWFuIHByZXZpZXdNb2RlOwotCUJvb2xlYW4gcmVjb3JkTW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgQm9vbGVhbiBwcmV2aWV3TW9kZTsKKyAgICBCb29sZWFuIHJlY29yZE1vZGU7CiAjaWZuZGVmIFNHR2V0TW9kZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0TW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0TW9kZShzLAotCSAgICAgICAgICAgICAgICAmcHJldmlld01vZGUsCi0JICAgICAgICAgICAgICAgICZyZWNvcmRNb2RlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcHJldmlld01vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTW9kZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRNb2RlKHMsCisgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgJnJlY29yZE1vZGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRNb2RlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldERhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlsb25nIHdoZXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBsb25nIHdoZXJlRmxhZ3M7CiAjaWZuZGVmIFNHU2V0RGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0RGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXREYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0RGF0YVJlZihzLAotCSAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXREYXRhUmVmKHMsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldERhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlsb25nIHdoZXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBsb25nIHdoZXJlRmxhZ3M7CiAjaWZuZGVmIFNHR2V0RGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKFNHR2V0RGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXREYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0RGF0YVJlZihzLAotCSAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0RGF0YVJlZihzLAorICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHTmV3T3V0cHV0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JbG9uZyB3aGVyZUZsYWdzOwotCVNHT3V0cHV0IHNnT3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgbG9uZyB3aGVyZUZsYWdzOworICAgIFNHT3V0cHV0IHNnT3V0OwogI2lmbmRlZiBTR05ld091dHB1dAotCVB5TWFjX1BSRUNIRUNLKFNHTmV3T3V0cHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR05ld091dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoZXJlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR05ld091dHB1dChzLAotCSAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncywKLQkgICAgICAgICAgICAgICAgICAmc2dPdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9OZXcsIHNnT3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR05ld091dHB1dChzLAorICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAmc2dPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9OZXcsIHNnT3V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0Rpc3Bvc2VPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHT3V0cHV0IHNnT3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKICNpZm5kZWYgU0dEaXNwb3NlT3V0cHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dEaXNwb3NlT3V0cHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0Rpc3Bvc2VPdXRwdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHRGlzcG9zZU91dHB1dChzLAotCSAgICAgICAgICAgICAgICAgICAgICBzZ091dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHRGlzcG9zZU91dHB1dChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRPdXRwdXRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dPdXRwdXQgc2dPdXQ7Ci0JbG9uZyB3aGVyZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICBsb25nIHdoZXJlRmxhZ3M7CiAjaWZuZGVmIFNHU2V0T3V0cHV0RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTR1NldE91dHB1dEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldE91dHB1dEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0T3V0cHV0RmxhZ3MocywKLQkgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRPdXRwdXRGbGFncyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCVNHT3V0cHV0IHNnT3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBTR091dHB1dCBzZ091dDsKICNpZm5kZWYgU0dTZXRDaGFubmVsT3V0cHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsT3V0cHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxPdXRwdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsT3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxPdXRwdXQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dPdXRwdXQgc2dPdXQ7Ci0JdW5zaWduZWQgbG9uZyBzcGFjZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dPdXRwdXQgc2dPdXQ7CisgICAgdW5zaWduZWQgbG9uZyBzcGFjZTsKICNpZm5kZWYgU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZyhzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYWNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzcGFjZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dIYW5kbGVVcGRhdGVFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JRXZlbnRSZWNvcmQgZXZlbnQ7Ci0JQm9vbGVhbiBoYW5kbGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBFdmVudFJlY29yZCBldmVudDsKKyAgICBCb29sZWFuIGhhbmRsZWQ7CiAjaWZuZGVmIFNHSGFuZGxlVXBkYXRlRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhTR0hhbmRsZVVwZGF0ZUV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0hhbmRsZVVwZGF0ZUV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dIYW5kbGVVcGRhdGVFdmVudChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dIYW5kbGVVcGRhdGVFdmVudChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0T3V0cHV0TmV4dE91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dPdXRwdXQgc2dPdXQ7Ci0JU0dPdXRwdXQgbmV4dE91dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dPdXRwdXQgc2dPdXQ7CisgICAgU0dPdXRwdXQgbmV4dE91dDsKICNpZm5kZWYgU0dTZXRPdXRwdXROZXh0T3V0cHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRPdXRwdXROZXh0T3V0cHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldE91dHB1dE5leHRPdXRwdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmbmV4dE91dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0T3V0cHV0TmV4dE91dHB1dChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE91dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmbmV4dE91dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0T3V0cHV0TmV4dE91dHB1dChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE91dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRPdXRwdXROZXh0T3V0cHV0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQlTR091dHB1dCBuZXh0T3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICBTR091dHB1dCBuZXh0T3V0OwogI2lmbmRlZiBTR0dldE91dHB1dE5leHRPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR0dldE91dHB1dE5leHRPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0T3V0cHV0TmV4dE91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRPdXRwdXROZXh0T3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dE91dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgbmV4dE91dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0T3V0cHV0TmV4dE91dHB1dChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5leHRPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9OZXcsIG5leHRPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0T3V0cHV0TWF4aW11bU9mZnNldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dPdXRwdXQgc2dPdXQ7Ci0Jd2lkZSBtYXhPZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OworICAgIHdpZGUgbWF4T2Zmc2V0OwogI2lmbmRlZiBTR1NldE91dHB1dE1heGltdW1PZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhTR1NldE91dHB1dE1heGltdW1PZmZzZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0TWF4aW11bU9mZnNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtYXhPZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldE91dHB1dE1heGltdW1PZmZzZXQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhPZmZzZXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1heE9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0T3V0cHV0TWF4aW11bU9mZnNldChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE9mZnNldCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQl3aWRlIG1heE9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dPdXRwdXQgc2dPdXQ7CisgICAgd2lkZSBtYXhPZmZzZXQ7CiAjaWZuZGVmIFNHR2V0T3V0cHV0TWF4aW11bU9mZnNldAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0T3V0cHV0TWF4aW11bU9mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE91dHB1dE1heGltdW1PZmZzZXQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhPZmZzZXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG1heE9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0T3V0cHV0TWF4aW11bU9mZnNldChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE9mZnNldCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgbWF4T2Zmc2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE91dHB1dERhdGFSZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHT3V0cHV0IHNnT3V0OwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dPdXRwdXQgc2dPdXQ7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBTR0dldE91dHB1dERhdGFSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhTR0dldE91dHB1dERhdGFSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHV3JpdGVFeHRlbmRlZE1vdmllRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JUHRyIHA7Ci0JbG9uZyBsZW47Ci0Jd2lkZSBvZmZzZXQ7Ci0JU0dPdXRwdXQgc2dPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIFB0ciBwOworICAgIGxvbmcgbGVuOworICAgIHdpZGUgb2Zmc2V0OworICAgIFNHT3V0cHV0IHNnT3V0OwogI2lmbmRlZiBTR1dyaXRlRXh0ZW5kZWRNb3ZpZURhdGEKLQlQeU1hY19QUkVDSEVDSyhTR1dyaXRlRXh0ZW5kZWRNb3ZpZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZ091dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfTmV3LCBzZ091dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1dyaXRlRXh0ZW5kZWRNb3ZpZURhdGEocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2dPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgc2dPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCXdpZGUgYnl0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIHdpZGUgYnl0ZXM7CiAjaWZuZGVmIFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQKLQlQeU1hY19QUkVDSEVDSyhTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgYnl0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgYnl0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQl3aWRlIHNwYWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICB3aWRlIHNwYWNlOwogI2lmbmRlZiBTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNwYWNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNwYWNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1dyaXRlTW92aWVEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlQdHIgcDsKLQlsb25nIGxlbjsKLQlsb25nIG9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgUHRyIHA7CisgICAgbG9uZyBsZW47CisgICAgbG9uZyBvZmZzZXQ7CiAjaWZuZGVmIFNHV3JpdGVNb3ZpZURhdGEKLQlQeU1hY19QUkVDSEVDSyhTR1dyaXRlTW92aWVEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1dyaXRlTW92aWVEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dXcml0ZU1vdmllRGF0YShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICAgIHAsCi0JICAgICAgICAgICAgICAgICAgICAgICBsZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dXcml0ZU1vdmllRGF0YShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVRpbWVCYXNlIHRiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBUaW1lQmFzZSB0YjsKICNpZm5kZWYgU0dHZXRUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRUaW1lQmFzZShzLAotCSAgICAgICAgICAgICAgICAgICAgJnRiKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCB0Yik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRUaW1lQmFzZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRiKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCB0Yik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dBZGRNb3ZpZURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCVB0ciBwOwotCWxvbmcgbGVuOwotCWxvbmcgb2Zmc2V0OwotCWxvbmcgY2hSZWZDb247Ci0JVGltZVZhbHVlIHRpbWU7Ci0Jc2hvcnQgd3JpdGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBQdHIgcDsKKyAgICBsb25nIGxlbjsKKyAgICBsb25nIG9mZnNldDsKKyAgICBsb25nIGNoUmVmQ29uOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIHNob3J0IHdyaXRlVHlwZTsKICNpZm5kZWYgU0dBZGRNb3ZpZURhdGEKLQlQeU1hY19QUkVDSEVDSyhTR0FkZE1vdmllRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dBZGRNb3ZpZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsbGxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnAsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZjaFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3cml0ZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0FkZE1vdmllRGF0YShzLAotCSAgICAgICAgICAgICAgICAgICAgIGMsCi0JICAgICAgICAgICAgICAgICAgICAgcCwKLQkgICAgICAgICAgICAgICAgICAgICBsZW4sCi0JICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICBjaFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2xsbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoUmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndyaXRlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQWRkTW92aWVEYXRhKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoUmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQ2hhbmdlZFNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR0NoYW5nZWRTb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5nZWRTb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbmdlZFNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ2hhbmdlZFNvdXJjZShzLAotCSAgICAgICAgICAgICAgICAgICAgICBjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQ2hhbmdlZFNvdXJjZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0FkZEV4dGVuZGVkTW92aWVEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlQdHIgcDsKLQlsb25nIGxlbjsKLQl3aWRlIG9mZnNldDsKLQlsb25nIGNoUmVmQ29uOwotCVRpbWVWYWx1ZSB0aW1lOwotCXNob3J0IHdyaXRlVHlwZTsKLQlTR091dHB1dCB3aGljaE91dHB1dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgUHRyIHA7CisgICAgbG9uZyBsZW47CisgICAgd2lkZSBvZmZzZXQ7CisgICAgbG9uZyBjaFJlZkNvbjsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBzaG9ydCB3cml0ZVR5cGU7CisgICAgU0dPdXRwdXQgd2hpY2hPdXRwdXQ7CiAjaWZuZGVmIFNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEKLQlQeU1hY19QUkVDSEVDSyhTR0FkZEV4dGVuZGVkTW92aWVEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0FkZEV4dGVuZGVkTW92aWVEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbGxsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVuLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2hSZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dBZGRFeHRlbmRlZE1vdmllRGF0YShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hSZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoT3V0cHV0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9OZXcsIHdoaWNoT3V0cHV0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2xsbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoUmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndyaXRlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoUmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaE91dHB1dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfTmV3LCB3aGljaE91dHB1dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dPdXRwdXQgc2dPdXQ7Ci0JTWVkaWEgdGhlTWVkaWE7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dPdXRwdXQgc2dPdXQ7CisgICAgTWVkaWEgdGhlTWVkaWE7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKICNpZm5kZWYgU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYQotCVB5TWFjX1BSRUNIRUNLKFNHQWRkT3V0cHV0RGF0YVJlZlRvTWVkaWEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQWRkT3V0cHV0RGF0YVJlZlRvTWVkaWEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX0NvbnZlcnQsICZ0aGVNZWRpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNZWRpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU9ial9Db252ZXJ0LCAmdGhlTWVkaWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQWRkT3V0cHV0RGF0YVJlZlRvTWVkaWEocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTWVkaWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFNldHRpbmdzU3VtbWFyeShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JSGFuZGxlIHN1bW1hcnlUZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBIYW5kbGUgc3VtbWFyeVRleHQ7CiAjaWZuZGVmIFNHU2V0U2V0dGluZ3NTdW1tYXJ5Ci0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRTZXR0aW5nc1N1bW1hcnkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0U2V0dGluZ3NTdW1tYXJ5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnN1bW1hcnlUZXh0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRTZXR0aW5nc1N1bW1hcnkocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5VGV4dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3VtbWFyeVRleHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFNldHRpbmdzU3VtbWFyeShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlUZXh0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxVc2FnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIHVzYWdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgdXNhZ2U7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbFVzYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsVXNhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFVzYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2FnZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbFVzYWdlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2FnZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbFVzYWdlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbFVzYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgdXNhZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyB1c2FnZTsKICNpZm5kZWYgU0dHZXRDaGFubmVsVXNhZ2UKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxVc2FnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsVXNhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsVXNhZ2UoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmdXNhZ2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHVzYWdlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxVc2FnZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2FnZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbEJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgU0dTZXRDaGFubmVsQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxCb3VuZHMoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxCb3VuZHMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBTR0dldENoYW5uZWxCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxCb3VuZHMoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsQm91bmRzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCB2b2x1bWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgdm9sdW1lOwogI2lmbmRlZiBTR1NldENoYW5uZWxWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsVm9sdW1lKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbFZvbHVtZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCB2b2x1bWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgdm9sdW1lOwogI2lmbmRlZiBTR0dldENoYW5uZWxWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxWb2x1bWUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxWb2x1bWUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgY2hhbm5lbEluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyBjaGFubmVsSW5mbzsKICNpZm5kZWYgU0dHZXRDaGFubmVsSW5mbwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsSW5mbyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxJbmZvKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsSW5mbyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxJbmZvKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5mbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsUGxheUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgcGxheUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgcGxheUZsYWdzOwogI2lmbmRlZiBTR1NldENoYW5uZWxQbGF5RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxQbGF5RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFBsYXlGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGxheUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsUGxheUZsYWdzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsYXlGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbFBsYXlGbGFncyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5RmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbFBsYXlGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIHBsYXlGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHBsYXlGbGFnczsKICNpZm5kZWYgU0dHZXRDaGFubmVsUGxheUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsUGxheUZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxQbGF5RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsUGxheUZsYWdzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwbGF5RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHBsYXlGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsUGxheUZsYWdzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwbGF5RmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsTWF4RnJhbWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgZnJhbWVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIGZyYW1lQ291bnQ7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbE1heEZyYW1lcwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbE1heEZyYW1lcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsTWF4RnJhbWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZmcmFtZUNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsTWF4RnJhbWVzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZUNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsTWF4RnJhbWVzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbE1heEZyYW1lcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIGZyYW1lQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyBmcmFtZUNvdW50OwogI2lmbmRlZiBTR0dldENoYW5uZWxNYXhGcmFtZXMKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxNYXhGcmFtZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbE1heEZyYW1lcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxNYXhGcmFtZXMoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbE1heEZyYW1lcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVDb3VudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsUmVmQ29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgcmVmQ29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgcmVmQ29uOwogI2lmbmRlZiBTR1NldENoYW5uZWxSZWZDb24KLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsUmVmQ29uKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbFJlZkNvbihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbENsaXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmduSGFuZGxlIHRoZUNsaXA7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbENsaXAKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxDbGlwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxDbGlwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxDbGlwKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICB0aGVDbGlwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDbGlwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsQ2xpcChjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ2xpcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsQ2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZ25IYW5kbGUgdGhlQ2xpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKICNpZm5kZWYgU0dHZXRDaGFubmVsQ2xpcAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsQ2xpcChjLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnRoZUNsaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVDbGlwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxDbGlwKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ2xpcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUNsaXApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUhhbmRsZSBzYW1wbGVEZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEhhbmRsZSBzYW1wbGVEZXNjOwogI2lmbmRlZiBTR0dldENoYW5uZWxTYW1wbGVEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxTYW1wbGVEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24oYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24oYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JU3RyaW5nUHRyIG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU3RyaW5nUHRyIG5hbWU7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbERldmljZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbERldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsRGV2aWNlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsRGV2aWNlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbFRpbWVTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlUaW1lU2NhbGUgc2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgVGltZVNjYWxlIHNjYWxlOwogI2lmbmRlZiBTR0dldENoYW5uZWxUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxUaW1lU2NhbGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsVGltZVNjYWxlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQ2hhbm5lbFB1dFBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHQ2hhbm5lbFB1dFBpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxQdXRQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxQdXRQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ2hhbm5lbFB1dFBpY3R1cmUoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFubmVsUHV0UGljdHVyZShjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0NoYW5uZWxTZXRSZXF1ZXN0ZWREYXRhUmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIGJ5dGVzUGVyU2Vjb25kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIFNHQ2hhbm5lbFNldFJlcXVlc3RlZERhdGFSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbFNldFJlcXVlc3RlZERhdGFSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ2hhbm5lbFNldFJlcXVlc3RlZERhdGFSYXRlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQ2hhbm5lbFNldFJlcXVlc3RlZERhdGFSYXRlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyBieXRlc1BlclNlY29uZDsKICNpZm5kZWYgU0dDaGFubmVsR2V0UmVxdWVzdGVkRGF0YVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsR2V0UmVxdWVzdGVkRGF0YVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsR2V0UmVxdWVzdGVkRGF0YVJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyU2Vjb25kKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVN0cjI1NSBuYW1lOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFN0cjI1NSBuYW1lOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOwogI2lmbmRlZiBTR0NoYW5uZWxTZXREYXRhU291cmNlTmFtZQotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxTZXREYXRhU291cmNlTmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFubmVsR2V0RGF0YVNvdXJjZU5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JU3RyMjU1IG5hbWU7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU3RyMjU1IG5hbWU7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CiAjaWZuZGVmIFNHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsR2V0RGF0YVNvdXJjZU5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFubmVsR2V0RGF0YVNvdXJjZU5hbWUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlIYW5kbGUgc2V0dGluZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgSGFuZGxlIHNldHRpbmdzOwogI2lmbmRlZiBTR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzZXR0aW5ncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ2hhbm5lbFNldENvZGVjU2V0dGluZ3MoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzZXR0aW5ncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQ2hhbm5lbFNldENvZGVjU2V0dGluZ3MoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0NoYW5uZWxHZXRDb2RlY1NldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUhhbmRsZSBzZXR0aW5nczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBIYW5kbGUgc2V0dGluZ3M7CiAjaWZuZGVmIFNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxHZXRDb2RlY1NldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxHZXRDb2RlY1NldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5ncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NoYW5uZWxHZXRDb2RlY1NldHRpbmdzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5ncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsVGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JVGltZUJhc2UgdGI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgVGltZUJhc2UgdGI7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbFRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsVGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbFRpbWVCYXNlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRiKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCB0Yik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsVGltZUJhc2UoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyByZWZDb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyByZWZDb247CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbFJlZkNvbgotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsUmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbFJlZkNvbihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZDb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbFJlZkNvbihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JU3RyMjU1IG91dERldmljZU5hbWU7Ci0JU3RyMjU1IG91dElucHV0TmFtZTsKLQlzaG9ydCBvdXRJbnB1dE51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBTdHIyNTUgb3V0RGV2aWNlTmFtZTsKKyAgICBTdHIyNTUgb3V0SW5wdXROYW1lOworICAgIHNob3J0IG91dElucHV0TnVtYmVyOwogI2lmbmRlZiBTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsRGV2aWNlQW5kSW5wdXROYW1lcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsRGV2aWNlQW5kSW5wdXROYW1lcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG91dERldmljZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgb3V0SW5wdXROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsRGV2aWNlQW5kSW5wdXROYW1lcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RGV2aWNlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dElucHV0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJbnB1dE51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SW5wdXROdW1iZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgb3V0RGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvdXRJbnB1dE5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXREZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5wdXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dElucHV0TnVtYmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRJbnB1dE51bWJlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsRGV2aWNlSW5wdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgaW5JbnB1dE51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBpbklucHV0TnVtYmVyOwogI2lmbmRlZiBTR1NldENoYW5uZWxEZXZpY2VJbnB1dAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbERldmljZUlucHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxEZXZpY2VJbnB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JbnB1dE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbERldmljZUlucHV0KGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbnB1dE51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSW5wdXROdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxEZXZpY2VJbnB1dChjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5wdXROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlVSW50MzIgaW5GbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBVSW50MzIgaW5GbGFnczsKICNpZm5kZWYgU0dTZXRDaGFubmVsU2V0dGluZ3NTdGF0ZUNoYW5naW5nCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsU2V0dGluZ3NTdGF0ZUNoYW5naW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dJbml0Q2hhbm5lbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTZXFHcmFiQ29tcG9uZW50IG93bmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFNlcUdyYWJDb21wb25lbnQgb3duZXI7CiAjaWZuZGVmIFNHSW5pdENoYW5uZWwKLQlQeU1hY19QUkVDSEVDSyhTR0luaXRDaGFubmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0luaXRDaGFubmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZvd25lcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHSW5pdENoYW5uZWwoYywKLQkgICAgICAgICAgICAgICAgICAgIG93bmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmb3duZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0luaXRDaGFubmVsKGMsCisgICAgICAgICAgICAgICAgICAgICAgICBvd25lcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dXcml0ZVNhbXBsZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JTW92aWUgbTsKLQlBbGlhc0hhbmRsZSB0aGVGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIE1vdmllIG07CisgICAgQWxpYXNIYW5kbGUgdGhlRmlsZTsKICNpZm5kZWYgU0dXcml0ZVNhbXBsZXMKLQlQeU1hY19QUkVDSEVDSyhTR1dyaXRlU2FtcGxlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dXcml0ZVNhbXBsZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJm0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHV3JpdGVTYW1wbGVzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgbSwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVGaWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dXcml0ZVNhbXBsZXMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0RGF0YVJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBieXRlc1BlclNlY29uZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIGJ5dGVzUGVyU2Vjb25kOwogI2lmbmRlZiBTR0dldERhdGFSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXREYXRhUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXREYXRhUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldERhdGFSYXRlKGMsCi0JICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyU2Vjb25kKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldERhdGFSYXRlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyU2Vjb25kKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0FsaWduQ2hhbm5lbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFJlY3QgcjsKICNpZm5kZWYgU0dBbGlnbkNoYW5uZWxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dBbGlnbkNoYW5uZWxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0FsaWduQ2hhbm5lbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dBbGlnbkNoYW5uZWxSZWN0KGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dBbGlnbkNoYW5uZWxSZWN0KGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbEdldERpdGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUhhbmRsZSBkaXRsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBIYW5kbGUgZGl0bDsKICNpZm5kZWYgU0dQYW5lbEdldERpdGwKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsR2V0RGl0bCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEdldERpdGwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbEdldERpdGwocywKLQkgICAgICAgICAgICAgICAgICAgICAmZGl0bCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRpdGwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxHZXREaXRsKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmRpdGwpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkaXRsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsR2V0VGl0bGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVN0cjI1NSB0aXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU3RyMjU1IHRpdGxlOwogI2lmbmRlZiBTR1BhbmVsR2V0VGl0bGUKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsR2V0VGl0bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXRUaXRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxHZXRUaXRsZShzLAotCSAgICAgICAgICAgICAgICAgICAgICB0aXRsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsR2V0VGl0bGUocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxDYW5SdW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dQYW5lbENhblJ1bgotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxDYW5SdW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxDYW5SdW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsQ2FuUnVuKHMsCi0JICAgICAgICAgICAgICAgICAgICBjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxDYW5SdW4ocywKKyAgICAgICAgICAgICAgICAgICAgICAgIGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxJbnN0YWxsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlEaWFsb2dQdHIgZDsKLQlzaG9ydCBpdGVtT2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBEaWFsb2dQdHIgZDsKKyAgICBzaG9ydCBpdGVtT2Zmc2V0OwogI2lmbmRlZiBTR1BhbmVsSW5zdGFsbAotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxJbnN0YWxsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsSW5zdGFsbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX0NvbnZlcnQsICZkLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxJbnN0YWxsKHMsCi0JICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICBkLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbEluc3RhbGwocywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU9mZnNldCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbEV2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlEaWFsb2dQdHIgZDsKLQlzaG9ydCBpdGVtT2Zmc2V0OwotCUV2ZW50UmVjb3JkIHRoZUV2ZW50OwotCXNob3J0IGl0ZW1IaXQ7Ci0JQm9vbGVhbiBoYW5kbGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBEaWFsb2dQdHIgZDsKKyAgICBzaG9ydCBpdGVtT2Zmc2V0OworICAgIEV2ZW50UmVjb3JkIHRoZUV2ZW50OworICAgIHNob3J0IGl0ZW1IaXQ7CisgICAgQm9vbGVhbiBoYW5kbGVkOwogI2lmbmRlZiBTR1BhbmVsRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsRXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbEV2ZW50KHMsCi0JICAgICAgICAgICAgICAgICAgIGMsCi0JICAgICAgICAgICAgICAgICAgIGQsCi0JICAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICZ0aGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQsCi0JICAgICAgICAgICAgICAgICAgICZoYW5kbGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCwKLQkgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbEV2ZW50KHMsCisgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgIGQsCisgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICZ0aGVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQsCisgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsSXRlbShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JRGlhbG9nUHRyIGQ7Ci0Jc2hvcnQgaXRlbU9mZnNldDsKLQlzaG9ydCBpdGVtTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBEaWFsb2dQdHIgZDsKKyAgICBzaG9ydCBpdGVtT2Zmc2V0OworICAgIHNob3J0IGl0ZW1OdW07CiAjaWZuZGVmIFNHUGFuZWxJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX0NvbnZlcnQsICZkLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1OdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsSXRlbShzLAotCSAgICAgICAgICAgICAgICAgIGMsCi0JICAgICAgICAgICAgICAgICAgZCwKLQkgICAgICAgICAgICAgICAgICBpdGVtT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgIGl0ZW1OdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX0NvbnZlcnQsICZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1OdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsSXRlbShzLAorICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgZCwKKyAgICAgICAgICAgICAgICAgICAgICBpdGVtT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGl0ZW1OdW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxSZW1vdmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCURpYWxvZ1B0ciBkOwotCXNob3J0IGl0ZW1PZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIERpYWxvZ1B0ciBkOworICAgIHNob3J0IGl0ZW1PZmZzZXQ7CiAjaWZuZGVmIFNHUGFuZWxSZW1vdmUKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsUmVtb3ZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsUmVtb3ZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbFJlbW92ZShzLAotCSAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgIGQsCi0JICAgICAgICAgICAgICAgICAgICBpdGVtT2Zmc2V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX0NvbnZlcnQsICZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxSZW1vdmUocywKKyAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICBkLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU9mZnNldCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbFNldEdyYWJiZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNlcUdyYWJDb21wb25lbnQgc2c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNlcUdyYWJDb21wb25lbnQgc2c7CiAjaWZuZGVmIFNHUGFuZWxTZXRHcmFiYmVyCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFNldEdyYWJiZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxTZXRHcmFiYmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxTZXRHcmFiYmVyKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2cpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxTZXRHcmFiYmVyKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2cpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxTZXRSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlzaG9ydCByZXNSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIHNob3J0IHJlc1JlZjsKICNpZm5kZWYgU0dQYW5lbFNldFJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsU2V0UmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFNldFJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxTZXRSZXNGaWxlKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFNldFJlc0ZpbGUocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxHZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dQYW5lbEdldFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEdldFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsR2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsR2V0U2V0dGluZ3MocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX05ldywgdWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbEdldFNldHRpbmdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsU2V0U2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCVVzZXJEYXRhIHVkOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIFVzZXJEYXRhIHVkOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIFNHUGFuZWxTZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxTZXRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFNldFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmdWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxTZXRTZXR0aW5ncyhzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB1ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmdWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxTZXRTZXR0aW5ncyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxWYWxpZGF0ZUlucHV0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlCb29sZWFuIG9rOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBCb29sZWFuIG9rOwogI2lmbmRlZiBTR1BhbmVsVmFsaWRhdGVJbnB1dAotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxWYWxpZGF0ZUlucHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsVmFsaWRhdGVJbnB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsVmFsaWRhdGVJbnB1dChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxWYWxpZGF0ZUlucHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9rKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbEdldERJVExGb3JTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlIYW5kbGUgZGl0bDsKLQlQb2ludCByZXF1ZXN0ZWRTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBIYW5kbGUgZGl0bDsKKyAgICBQb2ludCByZXF1ZXN0ZWRTaXplOwogI2lmbmRlZiBTR1BhbmVsR2V0RElUTEZvclNpemUKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsR2V0RElUTEZvclNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXRESVRMRm9yU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsR2V0RElUTEZvclNpemUocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpdGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWRTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkaXRsLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHJlcXVlc3RlZFNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxHZXRESVRMRm9yU2l6ZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGl0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RlZFNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRpdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcmVxdWVzdGVkU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRTcmNWaWRlb0JvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCByOwogI2lmbmRlZiBTR0dldFNyY1ZpZGVvQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRTcmNWaWRlb0JvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRTcmNWaWRlb0JvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFNyY1ZpZGVvQm91bmRzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0U3JjVmlkZW9Cb3VuZHMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRWaWRlb1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFJlY3QgcjsKICNpZm5kZWYgU0dTZXRWaWRlb1JlY3QKLQlQeU1hY19QUkVDSEVDSyhTR1NldFZpZGVvUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRWaWRlb1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRWaWRlb1JlY3QoYywKLQkgICAgICAgICAgICAgICAgICAgICAmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRWaWRlb1JlY3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRWaWRlb1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFJlY3QgcjsKICNpZm5kZWYgU0dHZXRWaWRlb1JlY3QKLQlQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRWaWRlb1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRWaWRlb1JlY3QoYywKLQkgICAgICAgICAgICAgICAgICAgICAmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VmlkZW9SZWN0KGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFZpZGVvQ29tcHJlc3NvclR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JT1NUeXBlIGNvbXByZXNzb3JUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIE9TVHlwZSBjb21wcmVzc29yVHlwZTsKICNpZm5kZWYgU0dHZXRWaWRlb0NvbXByZXNzb3JUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRWaWRlb0NvbXByZXNzb3JUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRWaWRlb0NvbXByZXNzb3JUeXBlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjb21wcmVzc29yVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRWaWRlb0NvbXByZXNzb3JUeXBlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjb21wcmVzc29yVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCU9TVHlwZSBjb21wcmVzc29yVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBPU1R5cGUgY29tcHJlc3NvclR5cGU7CiAjaWZuZGVmIFNHU2V0VmlkZW9Db21wcmVzc29yVHlwZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9Db21wcmVzc29yVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc29yVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VmlkZW9Db21wcmVzc29yVHlwZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXByZXNzb3JUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3JUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFZpZGVvQ29tcHJlc3NvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBkZXB0aDsKLQlDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3I7Ci0JQ29kZWNRIHNwYXRpYWxRdWFsaXR5OwotCUNvZGVjUSB0ZW1wb3JhbFF1YWxpdHk7Ci0JbG9uZyBrZXlGcmFtZVJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgZGVwdGg7CisgICAgQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yOworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKKyAgICBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OworICAgIGxvbmcga2V5RnJhbWVSYXRlOwogI2lmbmRlZiBTR1NldFZpZGVvQ29tcHJlc3NvcgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9Db21wcmVzc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFZpZGVvQ29tcHJlc3Nvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjb21wcmVzc29yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICZrZXlGcmFtZVJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFZpZGVvQ29tcHJlc3NvcihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUZyYW1lUmF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29tcHJlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5RnJhbWVSYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRWaWRlb0NvbXByZXNzb3IoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlGcmFtZVJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VmlkZW9Db21wcmVzc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGRlcHRoOwotCUNvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvcjsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7Ci0JQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKLQlsb25nIGtleUZyYW1lUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3I7CisgICAgQ29kZWNRIHNwYXRpYWxRdWFsaXR5OworICAgIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHk7CisgICAgbG9uZyBrZXlGcmFtZVJhdGU7CiAjaWZuZGVmIFNHR2V0VmlkZW9Db21wcmVzc29yCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRWaWRlb0NvbXByZXNzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9Db21wcmVzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0VmlkZW9Db21wcmVzc29yKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlGcmFtZVJhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaE8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgY29tcHJlc3NvciwKLQkgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFZpZGVvQ29tcHJlc3NvcihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5RnJhbWVSYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIGNvbXByZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGtleUZyYW1lUmF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50SW5zdGFuY2UgX3J2OwotCVNHQ2hhbm5lbCBjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBfcnY7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlDb21wb25lbnRJbnN0YW5jZSB2ZGlnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIENvbXBvbmVudEluc3RhbmNlIHZkaWc7CiAjaWZuZGVmIFNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhTR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2ZGlnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudChjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRpZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZkaWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGlnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dWaWRlb0RpZ2l0aXplckNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dWaWRlb0RpZ2l0aXplckNoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dWaWRlb0RpZ2l0aXplckNoYW5nZWQoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dWaWRlb0RpZ2l0aXplckNoYW5nZWQoYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHcmFiRnJhbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgYnVmZmVyTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGJ1ZmZlck51bTsKICNpZm5kZWYgU0dHcmFiRnJhbWUKLQlQeU1hY19QUkVDSEVDSyhTR0dyYWJGcmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHcmFiRnJhbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlck51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR3JhYkZyYW1lKGMsCi0JICAgICAgICAgICAgICAgICAgYnVmZmVyTnVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHcmFiRnJhbWUoYywKKyAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOdW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR3JhYkZyYW1lQ29tcGxldGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgYnVmZmVyTnVtOwotCUJvb2xlYW4gZG9uZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBidWZmZXJOdW07CisgICAgQm9vbGVhbiBkb25lOwogI2lmbmRlZiBTR0dyYWJGcmFtZUNvbXBsZXRlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHcmFiRnJhbWVDb21wbGV0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHcmFiRnJhbWVDb21wbGV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHcmFiRnJhbWVDb21wbGV0ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvbmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRvbmUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dyYWJGcmFtZUNvbXBsZXRlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9uZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDb21wcmVzc0ZyYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGJ1ZmZlck51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBidWZmZXJOdW07CiAjaWZuZGVmIFNHQ29tcHJlc3NGcmFtZQotCVB5TWFjX1BSRUNIRUNLKFNHQ29tcHJlc3NGcmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDb21wcmVzc0ZyYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0NvbXByZXNzRnJhbWUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTnVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDb21wcmVzc0ZyYW1lKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDb21wcmVzc0J1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBkZXB0aDsKLQlSZWN0IGNvbXByZXNzU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBSZWN0IGNvbXByZXNzU2l6ZTsKICNpZm5kZWYgU0dTZXRDb21wcmVzc0J1ZmZlcgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q29tcHJlc3NCdWZmZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q29tcHJlc3NCdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZjb21wcmVzc1NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENvbXByZXNzQnVmZmVyKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc1NpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmY29tcHJlc3NTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDb21wcmVzc0J1ZmZlcihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENvbXByZXNzQnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGRlcHRoOwotCVJlY3QgY29tcHJlc3NTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGRlcHRoOworICAgIFJlY3QgY29tcHJlc3NTaXplOwogI2lmbmRlZiBTR0dldENvbXByZXNzQnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDb21wcmVzc0J1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDb21wcmVzc0J1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENvbXByZXNzQnVmZmVyKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNvbXByZXNzU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDb21wcmVzc0J1ZmZlcihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZjb21wcmVzc1NpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0QnVmZmVySW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBidWZmZXJOdW07Ci0JUGl4TWFwSGFuZGxlIGJ1ZmZlclBNOwotCVJlY3QgYnVmZmVyUmVjdDsKLQlHV29ybGRQdHIgY29tcHJlc3NCdWZmZXI7Ci0JUmVjdCBjb21wcmVzc0J1ZmZlclJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgYnVmZmVyTnVtOworICAgIFBpeE1hcEhhbmRsZSBidWZmZXJQTTsKKyAgICBSZWN0IGJ1ZmZlclJlY3Q7CisgICAgR1dvcmxkUHRyIGNvbXByZXNzQnVmZmVyOworICAgIFJlY3QgY29tcHJlc3NCdWZmZXJSZWN0OwogI2lmbmRlZiBTR0dldEJ1ZmZlckluZm8KLQlQeU1hY19QUkVDSEVDSyhTR0dldEJ1ZmZlckluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0QnVmZmVySW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRCdWZmZXJJbmZvKGMsCi0JICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclBNLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzQnVmZmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NCdWZmZXJSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYnVmZmVyUE0sCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYnVmZmVyUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfTmV3LCBjb21wcmVzc0J1ZmZlciwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZjb21wcmVzc0J1ZmZlclJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldEJ1ZmZlckluZm8oYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc0J1ZmZlclJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBidWZmZXJQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZidWZmZXJSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGNvbXByZXNzQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNvbXByZXNzQnVmZmVyUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRVc2VTY3JlZW5CdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JQm9vbGVhbiB1c2VTY3JlZW5CdWZmZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgQm9vbGVhbiB1c2VTY3JlZW5CdWZmZXI7CiAjaWZuZGVmIFNHU2V0VXNlU2NyZWVuQnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRVc2VTY3JlZW5CdWZmZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0VXNlU2NyZWVuQnVmZmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VTY3JlZW5CdWZmZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFVzZVNjcmVlbkJ1ZmZlcihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVNjcmVlbkJ1ZmZlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZVNjcmVlbkJ1ZmZlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0VXNlU2NyZWVuQnVmZmVyKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlU2NyZWVuQnVmZmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFVzZVNjcmVlbkJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcjsKICNpZm5kZWYgU0dHZXRVc2VTY3JlZW5CdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhTR0dldFVzZVNjcmVlbkJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRVc2VTY3JlZW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRVc2VTY3JlZW5CdWZmZXIoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlU2NyZWVuQnVmZmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB1c2VTY3JlZW5CdWZmZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VXNlU2NyZWVuQnVmZmVyKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZVNjcmVlbkJ1ZmZlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlU2NyZWVuQnVmZmVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldEZyYW1lUmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlGaXhlZCBmcmFtZVJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgRml4ZWQgZnJhbWVSYXRlOwogI2lmbmRlZiBTR1NldEZyYW1lUmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0RnJhbWVSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldEZyYW1lUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZmcmFtZVJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldEZyYW1lUmF0ZShjLAotCSAgICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZnJhbWVSYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRGcmFtZVJhdGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0RnJhbWVSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUZpeGVkIGZyYW1lUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBGaXhlZCBmcmFtZVJhdGU7CiAjaWZuZGVmIFNHR2V0RnJhbWVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRGcmFtZVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0RnJhbWVSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0RnJhbWVSYXRlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgJmZyYW1lUmF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGZyYW1lUmF0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRGcmFtZVJhdGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVSYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgZnJhbWVSYXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFByZWZlcnJlZFBhY2tldFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzOwogI2lmbmRlZiBTR1NldFByZWZlcnJlZFBhY2tldFNpemUKLQlQeU1hY19QUkVDSEVDSyhTR1NldFByZWZlcnJlZFBhY2tldFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFByZWZlcnJlZFBhY2tldFNpemUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRQcmVmZXJyZWRQYWNrZXRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlczsKICNpZm5kZWYgU0dHZXRQcmVmZXJyZWRQYWNrZXRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRQcmVmZXJyZWRQYWNrZXRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFByZWZlcnJlZFBhY2tldFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRQcmVmZXJyZWRQYWNrZXRTaXplKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0UHJlZmVycmVkUGFja2V0U2l6ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUhhbmRsZSBjb21wcmVzc29yVHlwZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgSGFuZGxlIGNvbXByZXNzb3JUeXBlczsKICNpZm5kZWYgU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcHJlc3NvclR5cGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdChjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NvclR5cGVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wcmVzc29yVHlwZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yVHlwZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIGNvbXByZXNzb3JUeXBlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBIYW5kbGUgY29tcHJlc3NvclR5cGVzOwogI2lmbmRlZiBTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NvclR5cGVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29tcHJlc3NvclR5cGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NvclR5cGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29tcHJlc3NvclR5cGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFNvdW5kSW5wdXREcml2ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JU3RyMjU1IGRyaXZlck5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU3RyMjU1IGRyaXZlck5hbWU7CiAjaWZuZGVmIFNHU2V0U291bmRJbnB1dERyaXZlcgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0U291bmRJbnB1dERyaXZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZElucHV0RHJpdmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRyaXZlck5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFNvdW5kSW5wdXREcml2ZXIoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyTmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZHJpdmVyTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0U291bmRJbnB1dERyaXZlcihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJOYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNvdW5kSW5wdXREcml2ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVNHQ2hhbm5lbCBjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dHZXRTb3VuZElucHV0RHJpdmVyCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRTb3VuZElucHV0RHJpdmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kSW5wdXREcml2ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTb3VuZElucHV0RHJpdmVyKGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0U291bmRJbnB1dERyaXZlcihjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soU0dTb3VuZElucHV0RHJpdmVyQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTb3VuZElucHV0RHJpdmVyQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkKGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU291bmRJbnB1dERyaXZlckNoYW5nZWQoYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIHNlY29uZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyBzZWNvbmRzOwogI2lmbmRlZiBTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0U291bmRSZWNvcmRDaHVua1NpemUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRTb3VuZFJlY29yZENodW5rU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRTb3VuZFJlY29yZENodW5rU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRTb3VuZFJlY29yZENodW5rU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplKGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0U291bmRSZWNvcmRDaHVua1NpemUoYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRTb3VuZElucHV0UmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlGaXhlZCByYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEZpeGVkIHJhdGU7CiAjaWZuZGVmIFNHU2V0U291bmRJbnB1dFJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR1NldFNvdW5kSW5wdXRSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFNvdW5kSW5wdXRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFNvdW5kSW5wdXRSYXRlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRTb3VuZElucHV0UmF0ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRTb3VuZElucHV0UmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OwotCVNHQ2hhbm5lbCBjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHR2V0U291bmRJbnB1dFJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kSW5wdXRSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kSW5wdXRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0U291bmRJbnB1dFJhdGUoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0U291bmRJbnB1dFJhdGUoYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgc2FtcGxlU2l6ZTsKLQlzaG9ydCBudW1DaGFubmVsczsKLQlPU1R5cGUgY29tcHJlc3Npb25UeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IHNhbXBsZVNpemU7CisgICAgc2hvcnQgbnVtQ2hhbm5lbHM7CisgICAgT1NUeXBlIGNvbXByZXNzaW9uVHlwZTsKICNpZm5kZWYgU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3Npb25UeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25UeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0U291bmRJbnB1dFBhcmFtZXRlcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgc2FtcGxlU2l6ZTsKLQlzaG9ydCBudW1DaGFubmVsczsKLQlPU1R5cGUgY29tcHJlc3Npb25UeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IHNhbXBsZVNpemU7CisgICAgc2hvcnQgbnVtQ2hhbm5lbHM7CisgICAgT1NUeXBlIGNvbXByZXNzaW9uVHlwZTsKICNpZm5kZWYgU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0U291bmRJbnB1dFBhcmFtZXRlcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U291bmRJbnB1dFBhcmFtZXRlcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25UeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAotCSAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjb21wcmVzc2lvblR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0U291bmRJbnB1dFBhcmFtZXRlcnMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzaW9uVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgY29tcHJlc3Npb25UeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUhhbmRsZSByYXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBIYW5kbGUgcmF0ZXM7CiAjaWZuZGVmIFNHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMKLQlQeU1hY19QUkVDSEVDSyhTR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJhdGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJhdGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIHJhdGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEhhbmRsZSByYXRlczsKICNpZm5kZWYgU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhdGVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcmF0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHJhdGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldEZvbnROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVN0cmluZ1B0ciBwc3RyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFN0cmluZ1B0ciBwc3RyOwogI2lmbmRlZiBTR1NldEZvbnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRGb250TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRGb250TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHN0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Rm9udE5hbWUoYywKLQkgICAgICAgICAgICAgICAgICAgIHBzdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRGb250TmFtZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgcHN0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRGb250U2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBmb250U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBmb250U2l6ZTsKICNpZm5kZWYgU0dTZXRGb250U2l6ZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Rm9udFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Rm9udFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvbnRTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRGb250U2l6ZShjLAotCSAgICAgICAgICAgICAgICAgICAgZm9udFNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250U2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Rm9udFNpemUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFRleHRGb3JlQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JUkdCQ29sb3IgdGhlQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUkdCQ29sb3IgdGhlQ29sb3I7CiAjaWZuZGVmIFNHU2V0VGV4dEZvcmVDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0VGV4dEZvcmVDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRUZXh0Rm9yZUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VGV4dEZvcmVDb2xvcihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZ0aGVDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRUZXh0Rm9yZUNvbG9yKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnRoZUNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFRleHRCYWNrQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JUkdCQ29sb3IgdGhlQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUkdCQ29sb3IgdGhlQ29sb3I7CiAjaWZuZGVmIFNHU2V0VGV4dEJhY2tDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0VGV4dEJhY2tDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRUZXh0QmFja0NvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VGV4dEJhY2tDb2xvcihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZ0aGVDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRUZXh0QmFja0NvbG9yKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnRoZUNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldEp1c3RpZmljYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQganVzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBqdXN0OwogI2lmbmRlZiBTR1NldEp1c3RpZmljYXRpb24KLQlQeU1hY19QUkVDSEVDSyhTR1NldEp1c3RpZmljYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0SnVzdGlmaWNhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmanVzdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0SnVzdGlmaWNhdGlvbihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmanVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0SnVzdGlmaWNhdGlvbihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgcmV0dG9zcGFjZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCByZXR0b3NwYWNlOwogI2lmbmRlZiBTR0dldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTR0dldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldHRvc3BhY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJldHRvc3BhY2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dG9zcGFjZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dG9zcGFjZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IHJldHRvc3BhY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgcmV0dG9zcGFjZTsKICNpZm5kZWYgU0dTZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJldHRvc3BhY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dG9zcGFjZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldHRvc3BhY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dG9zcGFjZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JU3RyMjU1IHN0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIFN0cjI1NSBzdHI7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRHZXRDdXJyZW50Q2xpZW50TmFtZQotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRDdXJyZW50Q2xpZW50TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHN0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUVmlkZW9PdXRwdXRHZXRDdXJyZW50Q2xpZW50TmFtZSh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCVN0cjI1NSBzdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBTdHIyNTUgc3RyOwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZQotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dFNldENsaWVudE5hbWUodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dFNldENsaWVudE5hbWUodm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCVN0cjI1NSBzdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBTdHIyNTUgc3RyOwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZQotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUodm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0QmVnaW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0QmVnaW4KLQlQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0QmVnaW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRCZWdpbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEJlZ2luKHZvKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEJlZ2luKHZvKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0RW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKICNpZm5kZWYgUVRWaWRlb091dHB1dEVuZAotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRFbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRFbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRFbmQodm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0RW5kKHZvKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlsb25nIGRpc3BsYXlNb2RlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBsb25nIGRpc3BsYXlNb2RlSUQ7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRTZXREaXNwbGF5TW9kZQotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRTZXREaXNwbGF5TW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheU1vZGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRTZXREaXNwbGF5TW9kZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU1vZGVJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwbGF5TW9kZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlKHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlsb25nIGRpc3BsYXlNb2RlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBsb25nIGRpc3BsYXlNb2RlSUQ7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZQotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwbGF5TW9kZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlKHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheU1vZGVJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU1vZGVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRWaWRlb091dHB1dEdldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCUdXb3JsZFB0ciBndzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIEdXb3JsZFB0ciBndzsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldEdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXRHV29ybGQodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3cpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfTmV3LCBndyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUVmlkZW9PdXRwdXRHZXRHV29ybGQodm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3cpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfTmV3LCBndyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JbG9uZyBpbmRleDsKLQlDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgbG9uZyBpbmRleDsKKyAgICBDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50OwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0KHZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dENvbXBvbmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIG91dHB1dENvbXBvbmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dCh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRDb21wb25lbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBvdXRwdXRDb21wb25lbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRHZXRDbG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCUNvbXBvbmVudEluc3RhbmNlIGNsb2NrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2xvY2s7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRHZXRDbG9jawotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRDbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldENsb2NrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0R2V0Q2xvY2sodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbG9jayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBjbG9jayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUVmlkZW9PdXRwdXRHZXRDbG9jayh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGNsb2NrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0U2V0RWNob1BvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlDR3JhZlB0ciBlY2hvUG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIENHcmFmUHRyIGVjaG9Qb3J0OwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0U2V0RWNob1BvcnQKLQlQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0U2V0RWNob1BvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmVjaG9Qb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0KHZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvUG9ydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZlY2hvUG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydCh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNob1BvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3NvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCWxvbmcgaW5kZXg7Ci0JQ29tcG9uZW50IGNvZGVjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgbG9uZyBpbmRleDsKKyAgICBDb21wb25lbnQgY29kZWM7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3NvcgotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3Nvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0R2V0SW5kSW1hZ2VEZWNvbXByZXNzb3Iodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBjb2RlYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3Nvcih2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIGNvZGVjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0QmFzZVNldEVjaG9Qb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JQ0dyYWZQdHIgZWNob1BvcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBDR3JhZlB0ciBlY2hvUG9ydDsKICNpZm5kZWYgUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydAotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRCYXNlU2V0RWNob1BvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRCYXNlU2V0RWNob1BvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZlY2hvUG9ydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRCYXNlU2V0RWNob1BvcnQodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvUG9ydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZlY2hvUG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUVmlkZW9PdXRwdXRCYXNlU2V0RWNob1BvcnQodm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvUG9ydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRDaHVua01hbmFnZW1lbnRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVUludDMyIGZsYWdzOwotCVVJbnQzMiBmbGFnc01hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFVJbnQzMiBmbGFnczsKKyAgICBVSW50MzIgZmxhZ3NNYXNrOwogI2lmbmRlZiBNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRDaHVua01hbmFnZW1lbnRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRDaHVua01hbmFnZW1lbnRGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVVJbnQzMiBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVUludDMyIGZsYWdzOwogI2lmbmRlZiBNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRDaHVua01hbmFnZW1lbnRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRDaHVua01hbmFnZW1lbnRGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRDaHVua01hbmFnZW1lbnRGbGFncyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JU2l6ZSBhbGxvd2FuY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFNpemUgYWxsb3dhbmNlOwogI2lmbmRlZiBNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsbG93YW5jZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2FuY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxsb3dhbmNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JU2l6ZSBhbGxvd2FuY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFNpemUgYWxsb3dhbmNlOwogI2lmbmRlZiBNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGxvd2FuY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxsb3dhbmNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2FuY2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKICNpZm5kZWYgTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MobWgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUVtcHR5QWxsUHVyZ2VhYmxlQ2h1bmtzKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBmbGFnc01hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhZ3M7CisgICAgbG9uZyBmbGFnc01hc2s7CiAjaWZuZGVmIE1lZGlhU2V0SGFuZGxlckNhcGFiaWxpdGllcwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0SGFuZGxlckNhcGFiaWxpdGllcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0SGFuZGxlckNhcGFiaWxpdGllcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFJZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlUaW1lVmFsdWUgYXRNZWRpYVRpbWU7Ci0JbG9uZyBmbGFnc0luOwotCWxvbmcgZmxhZ3NPdXQ7Ci0JVGltZVJlY29yZCBtb3ZpZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKKyAgICBsb25nIGZsYWdzSW47CisgICAgbG9uZyBmbGFnc091dDsKKyAgICBUaW1lUmVjb3JkIG1vdmllVGltZTsKICNpZm5kZWYgTWVkaWFJZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFJZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUlkbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdE1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzSW4sCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmbW92aWVUaW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFJZGxlKG1oLAotCSAgICAgICAgICAgICAgICBhdE1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgZmxhZ3NJbiwKLQkgICAgICAgICAgICAgICAgJmZsYWdzT3V0LAotCSAgICAgICAgICAgICAgICAmbW92aWVUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFnc091dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdE1lZGlhVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmbW92aWVUaW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFJZGxlKG1oLAorICAgICAgICAgICAgICAgICAgICBhdE1lZGlhVGltZSwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3NJbiwKKyAgICAgICAgICAgICAgICAgICAgJmZsYWdzT3V0LAorICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc091dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRNZWRpYUluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgTWVkaWFHZXRNZWRpYUluZm8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldE1lZGlhSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRNZWRpYUluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldE1lZGlhSW5mbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0TWVkaWFJbmZvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhUHV0TWVkaWFJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIE1lZGlhUHV0TWVkaWFJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFQdXRNZWRpYUluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhUHV0TWVkaWFJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFQdXRNZWRpYUluZm8obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVB1dE1lZGlhSW5mbyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldEFjdGl2ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQm9vbGVhbiBlbmFibGVNZWRpYTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiBlbmFibGVNZWRpYTsKICNpZm5kZWYgTWVkaWFTZXRBY3RpdmUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldEFjdGl2ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRBY3RpdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVNZWRpYSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0QWN0aXZlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgIGVuYWJsZU1lZGlhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZU1lZGlhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRBY3RpdmUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlTWVkaWEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0UmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JRml4ZWQgcmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgRml4ZWQgcmF0ZTsKICNpZm5kZWYgTWVkaWFTZXRSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldFJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldFJhdGUobWgsCi0JICAgICAgICAgICAgICAgICAgIHJhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRSYXRlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdHZXRTdGF0dXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudFJlc3VsdCBzdGF0dXNFcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudFJlc3VsdCBzdGF0dXNFcnI7CiAjaWZuZGVmIE1lZGlhR0dldFN0YXR1cwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR0dldFN0YXR1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHR2V0U3RhdHVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdHZXRTdGF0dXMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXNFcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0Vycik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR0dldFN0YXR1cyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1c0Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzRXJyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVRyYWNrRWRpdGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIE1lZGlhVHJhY2tFZGl0ZWQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVRyYWNrRWRpdGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVRyYWNrRWRpdGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVRyYWNrRWRpdGVkKG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFUcmFja0VkaXRlZChtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRNZWRpYVRpbWVTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZVNjYWxlIG5ld1RpbWVTY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZVNjYWxlIG5ld1RpbWVTY2FsZTsKICNpZm5kZWYgTWVkaWFTZXRNZWRpYVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0TWVkaWFUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0TWVkaWFUaW1lU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdUaW1lU2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldE1lZGlhVGltZVNjYWxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGltZVNjYWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTY2FsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0TWVkaWFUaW1lU2NhbGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUaW1lU2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0TW92aWVUaW1lU2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVTY2FsZSBuZXdUaW1lU2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFRpbWVTY2FsZSBuZXdUaW1lU2NhbGU7CiAjaWZuZGVmIE1lZGlhU2V0TW92aWVUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldE1vdmllVGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldE1vdmllVGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3VGltZVNjYWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRNb3ZpZVRpbWVTY2FsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RpbWVTY2FsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdUaW1lU2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldE1vdmllVGltZVNjYWxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGltZVNjYWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ0dyYWZQdHIgYVBvcnQ7Ci0JR0RIYW5kbGUgYUdEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBDR3JhZlB0ciBhUG9ydDsKKyAgICBHREhhbmRsZSBhR0Q7CiAjaWZuZGVmIE1lZGlhU2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZhUG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZhR0QpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldEdXb3JsZChtaCwKLQkgICAgICAgICAgICAgICAgICAgICBhUG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICBhR0QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZhUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZhR0QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldEdXb3JsZChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhR0QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0RGltZW5zaW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JRml4ZWQgd2lkdGg7Ci0JRml4ZWQgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBGaXhlZCB3aWR0aDsKKyAgICBGaXhlZCBoZWlnaHQ7CiAjaWZuZGVmIE1lZGlhU2V0RGltZW5zaW9ucwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0RGltZW5zaW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXREaW1lbnNpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0RGltZW5zaW9ucyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXREaW1lbnNpb25zKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldENsaXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVJnbkhhbmRsZSB0aGVDbGlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKICNpZm5kZWYgTWVkaWFTZXRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRDbGlwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldENsaXAobWgsCi0JICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDbGlwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRDbGlwKG1oLAorICAgICAgICAgICAgICAgICAgICAgICB0aGVDbGlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFRyYWNrT3BhcXVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlCb29sZWFuIHRyYWNrSXNPcGFxdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEJvb2xlYW4gdHJhY2tJc09wYXF1ZTsKICNpZm5kZWYgTWVkaWFHZXRUcmFja09wYXF1ZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0VHJhY2tPcGFxdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0VHJhY2tPcGFxdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0VHJhY2tPcGFxdWUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tJc09wYXF1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdHJhY2tJc09wYXF1ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0VHJhY2tPcGFxdWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tJc09wYXF1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJc09wYXF1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRHcmFwaGljc01vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgbW9kZTsKLQlSR0JDb2xvciBvcENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIG1vZGU7CisgICAgUkdCQ29sb3Igb3BDb2xvcjsKICNpZm5kZWYgTWVkaWFTZXRHcmFwaGljc01vZGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldEdyYXBoaWNzTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRHcmFwaGljc01vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZvcENvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRHcmFwaGljc01vZGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZvcENvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRHcmFwaGljc01vZGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRHcmFwaGljc01vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgbW9kZTsKLQlSR0JDb2xvciBvcENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIG1vZGU7CisgICAgUkdCQ29sb3Igb3BDb2xvcjsKICNpZm5kZWYgTWVkaWFHZXRHcmFwaGljc01vZGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldEdyYXBoaWNzTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRHcmFwaGljc01vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0R3JhcGhpY3NNb2RlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3BDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0R3JhcGhpY3NNb2RlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3BDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHU2V0Vm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCB2b2x1bWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IHZvbHVtZTsKICNpZm5kZWYgTWVkaWFHU2V0Vm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHU2V0Vm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdTZXRWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdTZXRWb2x1bWUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdTZXRWb2x1bWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRTb3VuZEJhbGFuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGJhbGFuY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGJhbGFuY2U7CiAjaWZuZGVmIE1lZGlhU2V0U291bmRCYWxhbmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZEJhbGFuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U291bmRCYWxhbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0U291bmRCYWxhbmNlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0U291bmRCYWxhbmNlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0U291bmRCYWxhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBiYWxhbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBiYWxhbmNlOwogI2lmbmRlZiBNZWRpYUdldFNvdW5kQmFsYW5jZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRCYWxhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFNvdW5kQmFsYW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRTb3VuZEJhbGFuY2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldFNvdW5kQmFsYW5jZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlUaW1lVmFsdWUgd2hlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZVZhbHVlIHdoZW47CiAjaWZuZGVmIE1lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVuKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3aGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRTcmNSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVJnbkhhbmRsZSByZ247Ci0JVGltZVZhbHVlIGF0TWVkaWFUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBSZ25IYW5kbGUgcmduOworICAgIFRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKICNpZm5kZWYgTWVkaWFHZXRTcmNSZ24KLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldFNyY1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTcmNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZhdE1lZGlhVGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0U3JjUmduKG1oLAotCSAgICAgICAgICAgICAgICAgICAgIHJnbiwKLQkgICAgICAgICAgICAgICAgICAgICBhdE1lZGlhVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdE1lZGlhVGltZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0U3JjUmduKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdE1lZGlhVGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFQcmVyb2xsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlUaW1lVmFsdWUgdGltZTsKLQlGaXhlZCByYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBGaXhlZCByYXRlOwogI2lmbmRlZiBNZWRpYVByZXJvbGwKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVByZXJvbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhUHJlcm9sbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFQcmVyb2xsKG1oLAotCSAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICByYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFQcmVyb2xsKG1oLAorICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2FtcGxlRGVzY3JpcHRpb25DaGFuZ2VkKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhSGFzQ2hhcmFjdGVyaXN0aWMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCU9TVHlwZSBjaGFyYWN0ZXJpc3RpYzsKLQlCb29sZWFuIGhhc0l0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBPU1R5cGUgY2hhcmFjdGVyaXN0aWM7CisgICAgQm9vbGVhbiBoYXNJdDsKICNpZm5kZWYgTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhSGFzQ2hhcmFjdGVyaXN0aWMpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhSGFzQ2hhcmFjdGVyaXN0aWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjaGFyYWN0ZXJpc3RpYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhSGFzQ2hhcmFjdGVyaXN0aWMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXNJdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaGFzSXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY2hhcmFjdGVyaXN0aWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUhhc0NoYXJhY3RlcmlzdGljKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFzSXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0l0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE9mZnNjcmVlbkJ1ZmZlclNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVJlY3QgYm91bmRzOwotCXNob3J0IGRlcHRoOwotCUNUYWJIYW5kbGUgY3RhYjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUmVjdCBib3VuZHM7CisgICAgc2hvcnQgZGVwdGg7CisgICAgQ1RhYkhhbmRsZSBjdGFiOwogI2lmbmRlZiBNZWRpYUdldE9mZnNjcmVlbkJ1ZmZlclNpemUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldE9mZnNjcmVlbkJ1ZmZlclNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY3RhYikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0YWIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdGFiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRIaW50cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBoaW50czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBoaW50czsKICNpZm5kZWYgTWVkaWFTZXRIaW50cwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0SGludHMpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0SGludHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaW50cykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0SGludHMobWgsCi0JICAgICAgICAgICAgICAgICAgICBoaW50cyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaW50cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0SGludHMobWgsCisgICAgICAgICAgICAgICAgICAgICAgICBoaW50cyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTdHIyNTUgbmFtZTsKLQlsb25nIHJlcXVlc3RlZExhbmd1YWdlOwotCWxvbmcgYWN0dWFsTGFuZ3VhZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFN0cjI1NSBuYW1lOworICAgIGxvbmcgcmVxdWVzdGVkTGFuZ3VhZ2U7CisgICAgbG9uZyBhY3R1YWxMYW5ndWFnZTsKICNpZm5kZWYgTWVkaWFHZXROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldE5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdGVkTGFuZ3VhZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldE5hbWUobWgsCi0JICAgICAgICAgICAgICAgICAgIG5hbWUsCi0JICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZExhbmd1YWdlLAotCSAgICAgICAgICAgICAgICAgICAmYWN0dWFsTGFuZ3VhZ2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGFjdHVhbExhbmd1YWdlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWRMYW5ndWFnZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0TmFtZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkTGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxMYW5ndWFnZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsTGFuZ3VhZ2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhRm9yY2VVcGRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgZm9yY2VVcGRhdGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmb3JjZVVwZGF0ZUZsYWdzOwogI2lmbmRlZiBNZWRpYUZvcmNlVXBkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFGb3JjZVVwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFGb3JjZVVwZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmNlVXBkYXRlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUZvcmNlVXBkYXRlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JjZVVwZGF0ZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFGb3JjZVVwZGF0ZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0RHJhd2luZ1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUmduSGFuZGxlIHBhcnRpYWxSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSBwYXJ0aWFsUmduOwogI2lmbmRlZiBNZWRpYUdldERyYXdpbmdSZ24KLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldERyYXdpbmdSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0RHJhd2luZ1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXREcmF3aW5nUmduKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydGlhbFJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHBhcnRpYWxSZ24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldERyYXdpbmdSZ24obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0aWFsUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGFydGlhbFJnbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHU2V0QWN0aXZlU2VnbWVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZVZhbHVlIGFjdGl2ZVN0YXJ0OwotCVRpbWVWYWx1ZSBhY3RpdmVEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZVZhbHVlIGFjdGl2ZVN0YXJ0OworICAgIFRpbWVWYWx1ZSBhY3RpdmVEdXJhdGlvbjsKICNpZm5kZWYgTWVkaWFHU2V0QWN0aXZlU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR1NldEFjdGl2ZVNlZ21lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR1NldEFjdGl2ZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmVEdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR1NldEFjdGl2ZVNlZ21lbnQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZUR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHU2V0QWN0aXZlU2VnbWVudChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhSW52YWxpZGF0ZVJlZ2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUmduSGFuZGxlIGludmFsUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBSZ25IYW5kbGUgaW52YWxSZ247CiAjaWZuZGVmIE1lZGlhSW52YWxpZGF0ZVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhSW52YWxpZGF0ZVJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFJbnZhbGlkYXRlUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbnZhbFJnbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhSW52YWxpZGF0ZVJlZ2lvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbnZhbFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhSW52YWxpZGF0ZVJlZ2lvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0TmV4dFN0ZXBUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBmbGFnczsKLQlUaW1lVmFsdWUgbWVkaWFUaW1lSW47Ci0JVGltZVZhbHVlIG1lZGlhVGltZU91dDsKLQlGaXhlZCByYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBmbGFnczsKKyAgICBUaW1lVmFsdWUgbWVkaWFUaW1lSW47CisgICAgVGltZVZhbHVlIG1lZGlhVGltZU91dDsKKyAgICBGaXhlZCByYXRlOwogI2lmbmRlZiBNZWRpYUdldE5leHRTdGVwVGltZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TmV4dFN0ZXBUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldE5leHRTdGVwVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUaW1lSW4sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0TmV4dFN0ZXBUaW1lKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZUluLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVRpbWVPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lT3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUaW1lSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0TmV4dFN0ZXBUaW1lKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVRpbWVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lT3V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUNoYW5nZWROb25QcmltYXJ5U291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGlucHV0SW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgaW5wdXRJbmRleDsKICNpZm5kZWYgTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhQ2hhbmdlZE5vblByaW1hcnlTb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhQ2hhbmdlZE5vblByaW1hcnlTb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnB1dEluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRJbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhQ2hhbmdlZE5vblByaW1hcnlTb3VyY2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKICNpZm5kZWYgTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZChtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZChtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgc2FtcGxlTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIHNhbXBsZU51bTsKICNpZm5kZWYgTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlTnVtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVRyYWNrUHJvcGVydHlBdG9tQ2hhbmdlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOwogI2lmbmRlZiBNZWRpYVRyYWNrUHJvcGVydHlBdG9tQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVRyYWNrUHJvcGVydHlBdG9tQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFUcmFja1Byb3BlcnR5QXRvbUNoYW5nZWQobWgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVRyYWNrUHJvcGVydHlBdG9tQ2hhbmdlZChtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRWaWRlb1BhcmFtKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHdoaWNoUGFyYW07Ci0JdW5zaWduZWQgc2hvcnQgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgd2hpY2hQYXJhbTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKICNpZm5kZWYgTWVkaWFTZXRWaWRlb1BhcmFtCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRWaWRlb1BhcmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldFZpZGVvUGFyYW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaFBhcmFtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRWaWRlb1BhcmFtKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaFBhcmFtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoUGFyYW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldFZpZGVvUGFyYW0obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0VmlkZW9QYXJhbShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyB3aGljaFBhcmFtOwotCXVuc2lnbmVkIHNob3J0IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIHdoaWNoUGFyYW07CisgICAgdW5zaWduZWQgc2hvcnQgdmFsdWU7CiAjaWZuZGVmIE1lZGlhR2V0VmlkZW9QYXJhbQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0VmlkZW9QYXJhbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRWaWRlb1BhcmFtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hQYXJhbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0VmlkZW9QYXJhbShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hQYXJhbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaFBhcmFtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRWaWRlb1BhcmFtKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUNvbXBhcmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUJvb2xlYW4gaXNPSzsKLQlNZWRpYSBzcmNNZWRpYTsKLQlDb21wb25lbnRJbnN0YW5jZSBzcmNNZWRpYUNvbXBvbmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiBpc09LOworICAgIE1lZGlhIHNyY01lZGlhOworICAgIENvbXBvbmVudEluc3RhbmNlIHNyY01lZGlhQ29tcG9uZW50OwogI2lmbmRlZiBNZWRpYUNvbXBhcmUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUNvbXBhcmUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhQ29tcGFyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfQ29udmVydCwgJnNyY01lZGlhLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzcmNNZWRpYUNvbXBvbmVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhQ29tcGFyZShtaCwKLQkgICAgICAgICAgICAgICAgICAgJmlzT0ssCi0JICAgICAgICAgICAgICAgICAgIHNyY01lZGlhLAotCSAgICAgICAgICAgICAgICAgICBzcmNNZWRpYUNvbXBvbmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaXNPSyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX0NvbnZlcnQsICZzcmNNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmc3JjTWVkaWFDb21wb25lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUNvbXBhcmUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICZpc09LLAorICAgICAgICAgICAgICAgICAgICAgICBzcmNNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjTWVkaWFDb21wb25lbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzT0spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0Q2xvY2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudEluc3RhbmNlIGNsb2NrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjbG9jazsKICNpZm5kZWYgTWVkaWFHZXRDbG9jawotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0Q2xvY2spOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0Q2xvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0Q2xvY2sobWgsCi0JICAgICAgICAgICAgICAgICAgICAmY2xvY2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgY2xvY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldENsb2NrKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGNsb2NrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50OwogI2lmbmRlZiBNZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmb3V0cHV0Q29tcG9uZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbXBvbmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJm91dHB1dENvbXBvbmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRDb21wb25lbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldFNvdW5kT3V0cHV0Q29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFNvdW5kT3V0cHV0Q29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kT3V0cHV0Q29tcG9uZW50KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dENvbXBvbmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIG91dHB1dENvbXBvbmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Q29tcG9uZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgb3V0cHV0Q29tcG9uZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JSGFuZGxlIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEhhbmRsZSBkYXRhOwogI2lmbmRlZiBNZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRJbnZhbGlkUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBNZWRpYUdldEludmFsaWRSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldEludmFsaWRSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0SW52YWxpZFJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRJbnZhbGlkUmVnaW9uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldEludmFsaWRSZWdpb24obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkIyTihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CiAjaWZuZGVmIE1lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4KLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25IKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25IKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkIyTihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTYW1wbGVEZXNjcmlwdGlvbk4yQihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CiAjaWZuZGVmIE1lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25IKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25IKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTYW1wbGVEZXNjcmlwdGlvbk4yQihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFGbHVzaE5vblByaW1hcnlTb3VyY2VEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGlucHV0SW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgaW5wdXRJbmRleDsKICNpZm5kZWYgTWVkaWFGbHVzaE5vblByaW1hcnlTb3VyY2VEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFGbHVzaE5vblByaW1hcnlTb3VyY2VEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnB1dEluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFGbHVzaE5vblByaW1hcnlTb3VyY2VEYXRhKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0SW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0VVJMTGluayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUG9pbnQgZGlzcGxheVdoZXJlOwotCUhhbmRsZSB1cmxMaW5rOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBQb2ludCBkaXNwbGF5V2hlcmU7CisgICAgSGFuZGxlIHVybExpbms7CiAjaWZuZGVmIE1lZGlhR2V0VVJMTGluawotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0VVJMTGluayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRVUkxMaW5rKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkaXNwbGF5V2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFVSTExpbmsobWgsCi0JICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVybExpbmspOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB1cmxMaW5rKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmZGlzcGxheVdoZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRVUkxMaW5rKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cmxMaW5rKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdXJsTGluayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYWdzOwotCVBvaW50IGxvYzsKLQlsb25nIHRhcmdldFJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmbGFnczsKKyAgICBQb2ludCBsb2M7CisgICAgbG9uZyB0YXJnZXRSZWZDb247CiAjaWZuZGVmIE1lZGlhSGl0VGVzdEZvclRhcmdldFJlZkNvbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhSGl0VGVzdEZvclRhcmdldFJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUhpdFRlc3RGb3JUYXJnZXRSZWZDb24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRSZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHRhcmdldFJlZkNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmxvYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhSGl0VGVzdEZvclRhcmdldFJlZkNvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldFJlZkNvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVmQ29uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgdGFyZ2V0UmVmQ29uOwotCWxvbmcgZmxhZ3M7Ci0JUG9pbnQgbG9jOwotCUJvb2xlYW4gd2FzSGl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIHRhcmdldFJlZkNvbjsKKyAgICBsb25nIGZsYWdzOworICAgIFBvaW50IGxvYzsKKyAgICBCb29sZWFuIHdhc0hpdDsKICNpZm5kZWYgTWVkaWFIaXRUZXN0VGFyZ2V0UmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFIaXRUZXN0VGFyZ2V0UmVmQ29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRSZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0hpdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzSGl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldFJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmxvYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhSGl0VGVzdFRhcmdldFJlZkNvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzSGl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNIaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhRGlzcG9zZVRhcmdldFJlZkNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyB0YXJnZXRSZWZDb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgdGFyZ2V0UmVmQ29uOwogI2lmbmRlZiBNZWRpYURpc3Bvc2VUYXJnZXRSZWZDb24KLQlQeU1hY19QUkVDSEVDSyhNZWRpYURpc3Bvc2VUYXJnZXRSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldFJlZkNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldFJlZkNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVmQ29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVRhcmdldFJlZkNvbnNFcXVhbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmaXJzdFJlZkNvbjsKLQlsb25nIHNlY29uZFJlZkNvbjsKLQlCb29sZWFuIGVxdWFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZpcnN0UmVmQ29uOworICAgIGxvbmcgc2Vjb25kUmVmQ29uOworICAgIEJvb2xlYW4gZXF1YWw7CiAjaWZuZGVmIE1lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFUYXJnZXRSZWZDb25zRXF1YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0UmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kUmVmQ29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFUYXJnZXRSZWZDb25zRXF1YWwobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RSZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kUmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcXVhbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZXF1YWwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0UmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kUmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFUYXJnZXRSZWZDb25zRXF1YWwobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kUmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcXVhbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhUHJlUHJlcm9sbENhbmNlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jdm9pZCAqIHJlZmNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgdm9pZCAqIHJlZmNvbjsKICNpZm5kZWYgTWVkaWFQcmVQcmVyb2xsQ2FuY2VsCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFQcmVQcmVyb2xsQ2FuY2VsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVByZVByZXJvbGxDYW5jZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZjb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVByZVByZXJvbGxDYW5jZWwobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZjb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVByZVByZXJvbGxDYW5jZWwobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFFbnRlckVtcHR5RWRpdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOwogI2lmbmRlZiBNZWRpYUVudGVyRW1wdHlFZGl0Ci0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbnRlckVtcHR5RWRpdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbnRlckVtcHR5RWRpdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFFbnRlckVtcHR5RWRpdChtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRW50ZXJFbXB0eUVkaXQobWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBtaWxsaVNlY3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgbWlsbGlTZWNzOwogI2lmbmRlZiBNZWRpYUN1cnJlbnRNZWRpYVF1ZXVlZERhdGEKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUN1cnJlbnRNZWRpYVF1ZXVlZERhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlsbGlTZWNzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtaWxsaVNlY3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUN1cnJlbnRNZWRpYVF1ZXVlZERhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaVNlY3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpU2Vjcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgdm9sdW1lOwogI2lmbmRlZiBNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0RWZmZWN0aXZlVm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUJvb2xlYW4gZW5hYmxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiBlbmFibGVkOwogI2lmbmRlZiBNZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQm9vbGVhbiBlbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEJvb2xlYW4gZW5hYmxlOwogI2lmbmRlZiBNZWRpYVNldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgYmFsYW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgYmFsYW5jZTsKICNpZm5kZWYgTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0RWZmZWN0aXZlU291bmRCYWxhbmNlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0U2NyZWVuTG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQm9vbGVhbiBsb2NrSXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEJvb2xlYW4gbG9ja0l0OwogI2lmbmRlZiBNZWRpYVNldFNjcmVlbkxvY2sKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNjcmVlbkxvY2spOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U2NyZWVuTG9jayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxvY2tJdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0U2NyZWVuTG9jayhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja0l0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2tJdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0U2NyZWVuTG9jayhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja0l0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldEVycm9yU3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlDb21wb25lbnRSZXN1bHQgdGhlRXJyb3I7Ci0JU3RyMjU1IGVycm9yU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBDb21wb25lbnRSZXN1bHQgdGhlRXJyb3I7CisgICAgU3RyMjU1IGVycm9yU3RyaW5nOwogI2lmbmRlZiBNZWRpYUdldEVycm9yU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRFcnJvclN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRFcnJvclN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlRXJyb3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZXJyb3JTdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldEVycm9yU3RyaW5nKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRXJyb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0cmluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGVycm9yU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRFcnJvclN0cmluZyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdHJpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlVSW50OCBiYW5kTGV2ZWxzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBVSW50OCBiYW5kTGV2ZWxzOwogI2lmbmRlZiBNZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRTb3VuZEVxdWFsaXplckJhbmRMZXZlbHMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbmRMZXZlbHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJhbmRMZXZlbHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFuZExldmVscyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZExldmVscyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFEb0lkbGVBY3Rpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIE1lZGlhRG9JZGxlQWN0aW9ucwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhRG9JZGxlQWN0aW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFEb0lkbGVBY3Rpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYURvSWRsZUFjdGlvbnMobWgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYURvSWRsZUFjdGlvbnMobWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBiYXNzOwotCXNob3J0IHRyZWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgYmFzczsKKyAgICBzaG9ydCB0cmVibGU7CiAjaWZuZGVmIE1lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmVibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldFNvdW5kQmFzc0FuZFRyZWJsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyZWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlYmxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgYmFzczsKLQlzaG9ydCB0cmVibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGJhc3M7CisgICAgc2hvcnQgdHJlYmxlOwogI2lmbmRlZiBNZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyZWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgdHJlYmxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyZWJsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJlYmxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVRpbWVCYXNlQ2hhbmdlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOwogI2lmbmRlZiBNZWRpYVRpbWVCYXNlQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhVGltZUJhc2VDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVRpbWVCYXNlQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFUaW1lQmFzZUNoYW5nZWQobWgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVRpbWVCYXNlQ2hhbmdlZChtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFNQ0lzUGxheWVyRXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUV2ZW50UmVjb3JkIGU7Ci0JQm9vbGVhbiBoYW5kbGVkSXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEV2ZW50UmVjb3JkIGU7CisgICAgQm9vbGVhbiBoYW5kbGVkSXQ7CiAjaWZuZGVmIE1lZGlhTUNJc1BsYXllckV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFNQ0lzUGxheWVyRXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhTUNJc1BsYXllckV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFNQ0lzUGxheWVyRXZlbnQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZWRJdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZEl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhTUNJc1BsYXllckV2ZW50KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVkSXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWRJdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBtZWRpYUxvYWRTdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBtZWRpYUxvYWRTdGF0ZTsKICNpZm5kZWYgTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TWVkaWFMb2FkU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TWVkaWFMb2FkU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0TWVkaWFMb2FkU3RhdGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFMb2FkU3RhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1lZGlhTG9hZFN0YXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYUxvYWRTdGF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFMb2FkU3RhdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlDb21wb25lbnRJbnN0YW5jZSB2b3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBDb21wb25lbnRJbnN0YW5jZSB2b3V0OwogI2lmbmRlZiBNZWRpYVZpZGVvT3V0cHV0Q2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVZpZGVvT3V0cHV0Q2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVZpZGVvT3V0cHV0Q2hhbmdlZChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVZpZGVvT3V0cHV0Q2hhbmdlZChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUVtcHR5U2FtcGxlQ2FjaGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgc2FtcGxlTnVtOwotCWxvbmcgc2FtcGxlQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgc2FtcGxlTnVtOworICAgIGxvbmcgc2FtcGxlQ291bnQ7CiAjaWZuZGVmIE1lZGlhRW1wdHlTYW1wbGVDYWNoZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhRW1wdHlTYW1wbGVDYWNoZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbXB0eVNhbXBsZUNhY2hlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFFbXB0eVNhbXBsZUNhY2hlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUNvdW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVDb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRW1wdHlTYW1wbGVDYWNoZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVDb3VudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRQdWJsaWNJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlPU1R5cGUgaW5mb1NlbGVjdG9yOwotCXZvaWQgKiBpbmZvRGF0YVB0cjsKLQlTaXplIGlvRGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIE9TVHlwZSBpbmZvU2VsZWN0b3I7CisgICAgdm9pZCAqIGluZm9EYXRhUHRyOworICAgIFNpemUgaW9EYXRhU2l6ZTsKICNpZm5kZWYgTWVkaWFHZXRQdWJsaWNJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRQdWJsaWNJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFB1YmxpY0luZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5mb0RhdGFQdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFB1YmxpY0luZm8obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9TZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZpb0RhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpb0RhdGFTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0UHVibGljSW5mbyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvRGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlvRGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0UHVibGljSW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JT1NUeXBlIGluZm9TZWxlY3RvcjsKLQl2b2lkICogaW5mb0RhdGFQdHI7Ci0JU2l6ZSBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgT1NUeXBlIGluZm9TZWxlY3RvcjsKKyAgICB2b2lkICogaW5mb0RhdGFQdHI7CisgICAgU2l6ZSBkYXRhU2l6ZTsKICNpZm5kZWYgTWVkaWFTZXRQdWJsaWNJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRQdWJsaWNJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldFB1YmxpY0luZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9TZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldFB1YmxpY0luZm8obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9TZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1NlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb0RhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0UHVibGljSW5mbyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhUmVmQ29uU2V0UHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgcmVmQ29uOwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBwcm9wZXJ0eVZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIHJlZkNvbjsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogcHJvcGVydHlWYWx1ZTsKICNpZm5kZWYgTWVkaWFSZWZDb25TZXRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhUmVmQ29uU2V0UHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhUmVmQ29uU2V0UHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVJlZkNvblNldFByb3BlcnR5KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVJlZkNvblNldFByb3BlcnR5KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFSZWZDb25HZXRQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyByZWZDb247Ci0JbG9uZyBwcm9wZXJ0eVR5cGU7Ci0Jdm9pZCAqIHByb3BlcnR5VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgcmVmQ29uOworICAgIGxvbmcgcHJvcGVydHlUeXBlOworICAgIHZvaWQgKiBwcm9wZXJ0eVZhbHVlOwogI2lmbmRlZiBNZWRpYVJlZkNvbkdldFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFSZWZDb25HZXRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFSZWZDb25HZXRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhUmVmQ29uR2V0UHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhUmVmQ29uR2V0UHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYU5hdmlnYXRlVGFyZ2V0UmVmQ29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIG5hdmlnYXRpb247Ci0JbG9uZyByZWZDb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgbmF2aWdhdGlvbjsKKyAgICBsb25nIHJlZkNvbjsKICNpZm5kZWYgTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhTmF2aWdhdGVUYXJnZXRSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhTmF2aWdhdGVUYXJnZXRSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYXZpZ2F0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZDb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmF2aWdhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhTmF2aWdhdGVUYXJnZXRSZWZDb24obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdHZXRJZGxlTWFuYWdlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JSWRsZU1hbmFnZXIgcGltOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBJZGxlTWFuYWdlciBwaW07CiAjaWZuZGVmIE1lZGlhR0dldElkbGVNYW5hZ2VyCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHR2V0SWRsZU1hbmFnZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR0dldElkbGVNYW5hZ2VyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdHZXRJZGxlTWFuYWdlcihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGltKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfTmV3LCBwaW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdHZXRJZGxlTWFuYWdlcihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGltKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfTmV3LCBwaW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR1NldElkbGVNYW5hZ2VyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlJZGxlTWFuYWdlciBpbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgSWRsZU1hbmFnZXIgaW07CiAjaWZuZGVmIE1lZGlhR1NldElkbGVNYW5hZ2VyCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHU2V0SWRsZU1hbmFnZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR1NldElkbGVNYW5hZ2VyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfQ29udmVydCwgJmltKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHU2V0SWRsZU1hbmFnZXIobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfQ29udmVydCwgJmltKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHU2V0SWRsZU1hbmFnZXIobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUTUlESUdldE1JRElQb3J0cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVE1JRElDb21wb25lbnQgY2k7Ci0JUVRNSURJUG9ydExpc3RIYW5kbGUgaW5wdXRQb3J0czsKLQlRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVE1JRElDb21wb25lbnQgY2k7CisgICAgUVRNSURJUG9ydExpc3RIYW5kbGUgaW5wdXRQb3J0czsKKyAgICBRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0czsKICNpZm5kZWYgUVRNSURJR2V0TUlESVBvcnRzCi0JUHlNYWNfUFJFQ0hFQ0soUVRNSURJR2V0TUlESVBvcnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVE1JRElHZXRNSURJUG9ydHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUTUlESUdldE1JRElQb3J0cyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0UG9ydHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRQb3J0cyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5wdXRQb3J0cywKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvdXRwdXRQb3J0cyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUTUlESUdldE1JRElQb3J0cyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0UG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRQb3J0cyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5wdXRQb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvdXRwdXRQb3J0cyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRNSURJVXNlU2VuZFBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRNSURJQ29tcG9uZW50IGNpOwotCWxvbmcgcG9ydEluZGV4OwotCWxvbmcgaW5Vc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRNSURJQ29tcG9uZW50IGNpOworICAgIGxvbmcgcG9ydEluZGV4OworICAgIGxvbmcgaW5Vc2U7CiAjaWZuZGVmIFFUTUlESVVzZVNlbmRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soUVRNSURJVXNlU2VuZFBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUTUlESVVzZVNlbmRQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRNSURJVXNlU2VuZFBvcnQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluVXNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblVzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUTUlESVVzZVNlbmRQb3J0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblVzZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRNSURJU2VuZE1JREkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRNSURJQ29tcG9uZW50IGNpOwotCWxvbmcgcG9ydEluZGV4OwotCU11c2ljTUlESVBhY2tldCBtcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVE1JRElDb21wb25lbnQgY2k7CisgICAgbG9uZyBwb3J0SW5kZXg7CisgICAgTXVzaWNNSURJUGFja2V0IG1wOwogI2lmbmRlZiBRVE1JRElTZW5kTUlESQotCVB5TWFjX1BSRUNIRUNLKFFUTUlESVNlbmRNSURJKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVE1JRElTZW5kTUlESSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9ydEluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0LCAmbXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVE1JRElTZW5kTUlESShjaSwKLQkgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgJm1wKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0LCAmbXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVE1JRElTZW5kTUlESShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm1wKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldFBhcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgbWlkaUNoYW5uZWw7Ci0JbG9uZyBwb2x5cGhvbnk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIGxvbmcgbWlkaUNoYW5uZWw7CisgICAgbG9uZyBwb2x5cGhvbnk7CiAjaWZuZGVmIE11c2ljR2V0UGFydAotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0UGFydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0UGFydChtYywKLQkgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgJm1pZGlDaGFubmVsLAotCSAgICAgICAgICAgICAgICAgICAmcG9seXBob255KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWlkaUNoYW5uZWwsCi0JICAgICAgICAgICAgICAgICAgICAgcG9seXBob255KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldFBhcnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICZtaWRpQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBvbHlwaG9ueSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pZGlDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlwaG9ueSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlsb25nIG1pZGlDaGFubmVsOwotCWxvbmcgcG9seXBob255OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcGFydDsKKyAgICBsb25nIG1pZGlDaGFubmVsOworICAgIGxvbmcgcG9seXBob255OwogI2lmbmRlZiBNdXNpY1NldFBhcnQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pZGlDaGFubmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9seXBob255KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNTZXRQYXJ0KG1jLAotCSAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICBtaWRpQ2hhbm5lbCwKLQkgICAgICAgICAgICAgICAgICAgcG9seXBob255KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pZGlDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9seXBob255KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZXRQYXJ0KG1jLAorICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBtaWRpQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgcG9seXBob255KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlsb25nIGluc3RydW1lbnROdW1iZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIGxvbmcgaW5zdHJ1bWVudE51bWJlcjsKICNpZm5kZWYgTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlcgotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50TnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlcihtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50TnVtYmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldFBhcnRJbnN0cnVtZW50TnVtYmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CiAjaWZuZGVmIE11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnRJbnN0cnVtZW50TnVtYmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnRJbnN0cnVtZW50TnVtYmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldFBhcnRJbnN0cnVtZW50TnVtYmVyKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTdG9yZVBhcnRJbnN0cnVtZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlsb25nIGluc3RydW1lbnROdW1iZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIGxvbmcgaW5zdHJ1bWVudE51bWJlcjsKICNpZm5kZWYgTXVzaWNTdG9yZVBhcnRJbnN0cnVtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTdG9yZVBhcnRJbnN0cnVtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1N0b3JlUGFydEluc3RydW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1N0b3JlUGFydEluc3RydW1lbnQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50TnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTdG9yZVBhcnRJbnN0cnVtZW50KG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50TnVtYmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlBdG9taWNJbnN0cnVtZW50IGFpOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIEF0b21pY0luc3RydW1lbnQgYWk7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudAotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudChtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGFpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50KG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCUF0b21pY0luc3RydW1lbnRQdHIgYWlQOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIEF0b21pY0luc3RydW1lbnRQdHIgYWlQOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIE11c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbHNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWlQLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50KG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpUCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFpUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudChtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRQYXJ0S25vYihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JbG9uZyBrbm9iSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIGxvbmcga25vYklEOwogI2lmbmRlZiBNdXNpY0dldFBhcnRLbm9iCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0S25vYik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0S25vYik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAma25vYklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRQYXJ0S25vYihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBrbm9iSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldFBhcnRLbm9iKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub2JJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0S25vYihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JbG9uZyBrbm9iSUQ7Ci0JbG9uZyBrbm9iVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIGxvbmcga25vYklEOworICAgIGxvbmcga25vYlZhbHVlOwogI2lmbmRlZiBNdXNpY1NldFBhcnRLbm9iCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0S25vYik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0S25vYik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmtub2JJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmtub2JWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydEtub2IobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAga25vYklELAotCSAgICAgICAgICAgICAgICAgICAgICAga25vYlZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtub2JJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtub2JWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljU2V0UGFydEtub2IobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYlZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldEtub2IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBrbm9iSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBrbm9iSUQ7CiAjaWZuZGVmIE11c2ljR2V0S25vYgotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0S25vYik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRLbm9iKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAma25vYklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRLbm9iKG1jLAotCSAgICAgICAgICAgICAgICAgICBrbm9iSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRLbm9iKG1jLAorICAgICAgICAgICAgICAgICAgICAgICBrbm9iSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0S25vYihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGtub2JJRDsKLQlsb25nIGtub2JWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGtub2JJRDsKKyAgICBsb25nIGtub2JWYWx1ZTsKICNpZm5kZWYgTXVzaWNTZXRLbm9iCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRLbm9iKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NldEtub2IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAma25vYklELAotCSAgICAgICAgICAgICAgICAgICAgICAma25vYlZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNTZXRLbm9iKG1jLAotCSAgICAgICAgICAgICAgICAgICBrbm9iSUQsCi0JICAgICAgICAgICAgICAgICAgIGtub2JWYWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYlZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZXRLbm9iKG1jLAorICAgICAgICAgICAgICAgICAgICAgICBrbm9iSUQsCisgICAgICAgICAgICAgICAgICAgICAgIGtub2JWYWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRQYXJ0TmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JU3RyaW5nUHRyIG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIFN0cmluZ1B0ciBuYW1lOwogI2lmbmRlZiBNdXNpY0dldFBhcnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0UGFydE5hbWUobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldFBhcnROYW1lKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0UGFydE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCVN0cmluZ1B0ciBuYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcGFydDsKKyAgICBTdHJpbmdQdHIgbmFtZTsKICNpZm5kZWYgTXVzaWNTZXRQYXJ0TmFtZQotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydE5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnROYW1lKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZXRQYXJ0TmFtZShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1BsYXlOb3RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlsb25nIHBpdGNoOwotCWxvbmcgdmVsb2NpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIGxvbmcgcGl0Y2g7CisgICAgbG9uZyB2ZWxvY2l0eTsKICNpZm5kZWYgTXVzaWNQbGF5Tm90ZQotCVB5TWFjX1BSRUNIRUNLKE11c2ljUGxheU5vdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljUGxheU5vdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZwaXRjaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZlbG9jaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNQbGF5Tm90ZShtYywKLQkgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICBwaXRjaCwKLQkgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVsb2NpdHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1BsYXlOb3RlKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljUmVzZXRQYXJ0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CiAjaWZuZGVmIE11c2ljUmVzZXRQYXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNSZXNldFBhcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljUmVzZXRQYXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljUmVzZXRQYXJ0KG1jLAotCSAgICAgICAgICAgICAgICAgICAgIHBhcnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljUmVzZXRQYXJ0KG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0UGFydENvbnRyb2xsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCU11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyOwotCWxvbmcgY29udHJvbGxlclZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcGFydDsKKyAgICBNdXNpY0NvbnRyb2xsZXIgY29udHJvbGxlck51bWJlcjsKKyAgICBsb25nIGNvbnRyb2xsZXJWYWx1ZTsKICNpZm5kZWYgTXVzaWNTZXRQYXJ0Q29udHJvbGxlcgotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydENvbnRyb2xsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydENvbnRyb2xsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250cm9sbGVyTnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udHJvbGxlclZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNTZXRQYXJ0Q29udHJvbGxlcihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyTnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlclZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cm9sbGVyVmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRDb250cm9sbGVyKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyVmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0UGFydENvbnRyb2xsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCU11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcGFydDsKKyAgICBNdXNpY0NvbnRyb2xsZXIgY29udHJvbGxlck51bWJlcjsKICNpZm5kZWYgTXVzaWNHZXRQYXJ0Q29udHJvbGxlcgotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0UGFydENvbnRyb2xsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0UGFydENvbnRyb2xsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJOdW1iZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldFBhcnRDb250cm9sbGVyKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJOdW1iZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cm9sbGVyTnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRQYXJ0Q29udHJvbGxlcihtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyTnVtYmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldEluc3RydW1lbnROYW1lcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIG1vZGlmaWFibGVJbnN0cnVtZW50czsKLQlIYW5kbGUgaW5zdHJ1bWVudE5hbWVzOwotCUhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlMYXN0czsKLQlIYW5kbGUgaW5zdHJ1bWVudENhdGVnb3J5TmFtZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBtb2RpZmlhYmxlSW5zdHJ1bWVudHM7CisgICAgSGFuZGxlIGluc3RydW1lbnROYW1lczsKKyAgICBIYW5kbGUgaW5zdHJ1bWVudENhdGVnb3J5TGFzdHM7CisgICAgSGFuZGxlIGluc3RydW1lbnRDYXRlZ29yeU5hbWVzOwogI2lmbmRlZiBNdXNpY0dldEluc3RydW1lbnROYW1lcwotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5zdHJ1bWVudE5hbWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldEluc3RydW1lbnROYW1lcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWFibGVJbnN0cnVtZW50cykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0SW5zdHJ1bWVudE5hbWVzKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWFibGVJbnN0cnVtZW50cywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE5hbWVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50Q2F0ZWdvcnlMYXN0cywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudENhdGVnb3J5TmFtZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE5hbWVzLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGluc3RydW1lbnRDYXRlZ29yeUxhc3RzLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGluc3RydW1lbnRDYXRlZ29yeU5hbWVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWFibGVJbnN0cnVtZW50cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0SW5zdHJ1bWVudE5hbWVzKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWFibGVJbnN0cnVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50Q2F0ZWdvcnlMYXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudENhdGVnb3J5TmFtZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGluc3RydW1lbnRDYXRlZ29yeUxhc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGluc3RydW1lbnRDYXRlZ29yeU5hbWVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldERydW1OYW1lcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIG1vZGlmaWFibGVJbnN0cnVtZW50czsKLQlIYW5kbGUgaW5zdHJ1bWVudE51bWJlcnM7Ci0JSGFuZGxlIGluc3RydW1lbnROYW1lczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIG1vZGlmaWFibGVJbnN0cnVtZW50czsKKyAgICBIYW5kbGUgaW5zdHJ1bWVudE51bWJlcnM7CisgICAgSGFuZGxlIGluc3RydW1lbnROYW1lczsKICNpZm5kZWYgTXVzaWNHZXREcnVtTmFtZXMKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldERydW1OYW1lcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXREcnVtTmFtZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmlhYmxlSW5zdHJ1bWVudHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldERydW1OYW1lcyhtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmlhYmxlSW5zdHJ1bWVudHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50TmFtZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGluc3RydW1lbnROdW1iZXJzLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGluc3RydW1lbnROYW1lcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmlhYmxlSW5zdHJ1bWVudHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldERydW1OYW1lcyhtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmlhYmxlSW5zdHJ1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50TmFtZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGluc3RydW1lbnROdW1iZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGluc3RydW1lbnROYW1lcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRNYXN0ZXJUdW5lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOwogI2lmbmRlZiBNdXNpY0dldE1hc3RlclR1bmUKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldE1hc3RlclR1bmUpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0TWFzdGVyVHVuZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRNYXN0ZXJUdW5lKG1jKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRNYXN0ZXJUdW5lKG1jKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1NldE1hc3RlclR1bmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBtYXN0ZXJUdW5lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgbWFzdGVyVHVuZTsKICNpZm5kZWYgTXVzaWNTZXRNYXN0ZXJUdW5lCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRNYXN0ZXJUdW5lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NldE1hc3RlclR1bmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXN0ZXJUdW5lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNTZXRNYXN0ZXJUdW5lKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXJUdW5lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hc3RlclR1bmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldE1hc3RlclR1bmUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlclR1bmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0RGV2aWNlQ29ubmVjdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGluZGV4OwotCWxvbmcgaWQxOwotCWxvbmcgaWQyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgaW5kZXg7CisgICAgbG9uZyBpZDE7CisgICAgbG9uZyBpZDI7CiAjaWZuZGVmIE11c2ljR2V0RGV2aWNlQ29ubmVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0RGV2aWNlQ29ubmVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldERldmljZUNvbm5lY3Rpb24obWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQxLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaWQxLAotCSAgICAgICAgICAgICAgICAgICAgIGlkMik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0RGV2aWNlQ29ubmVjdGlvbihtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZDIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWQyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1VzZURldmljZUNvbm5lY3Rpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBpZDE7Ci0JbG9uZyBpZDI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBpZDE7CisgICAgbG9uZyBpZDI7CiAjaWZuZGVmIE11c2ljVXNlRGV2aWNlQ29ubmVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKE11c2ljVXNlRGV2aWNlQ29ubmVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkMSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkMikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljVXNlRGV2aWNlQ29ubmVjdGlvbihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQxLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljVXNlRGV2aWNlQ29ubmVjdGlvbihtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcga25vYkluZGV4OwotCWxvbmcgaXNHbG9iYWw7Ci0JSGFuZGxlIHNldHRpbmdzTmFtZXM7Ci0JSGFuZGxlIHNldHRpbmdzQ2F0ZWdvcnlMYXN0czsKLQlIYW5kbGUgc2V0dGluZ3NDYXRlZ29yeU5hbWVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcga25vYkluZGV4OworICAgIGxvbmcgaXNHbG9iYWw7CisgICAgSGFuZGxlIHNldHRpbmdzTmFtZXM7CisgICAgSGFuZGxlIHNldHRpbmdzQ2F0ZWdvcnlMYXN0czsKKyAgICBIYW5kbGUgc2V0dGluZ3NDYXRlZ29yeU5hbWVzOwogI2lmbmRlZiBNdXNpY0dldEtub2JTZXR0aW5nU3RyaW5ncwotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldEtub2JTZXR0aW5nU3RyaW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0dsb2JhbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub2JJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0dsb2JhbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZ3NOYW1lcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZ3NDYXRlZ29yeUxhc3RzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc0NhdGVnb3J5TmFtZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgc2V0dGluZ3NOYW1lcywKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc0NhdGVnb3J5TGFzdHMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgc2V0dGluZ3NDYXRlZ29yeU5hbWVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm9iSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0dsb2JhbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub2JJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZ3NOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZ3NDYXRlZ29yeUxhc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc0NhdGVnb3J5TmFtZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgc2V0dGluZ3NOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc0NhdGVnb3J5TGFzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgc2V0dGluZ3NDYXRlZ29yeU5hbWVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldE1JRElQb3J0cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGlucHV0UG9ydENvdW50OwotCWxvbmcgb3V0cHV0UG9ydENvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgaW5wdXRQb3J0Q291bnQ7CisgICAgbG9uZyBvdXRwdXRQb3J0Q291bnQ7CiAjaWZuZGVmIE11c2ljR2V0TUlESVBvcnRzCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRNSURJUG9ydHMpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0TUlESVBvcnRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldE1JRElQb3J0cyhtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0Q291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dFBvcnRDb3VudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGlucHV0UG9ydENvdW50LAotCSAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBvcnRDb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0TUlESVBvcnRzKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFBvcnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0UG9ydENvdW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQb3J0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9ydENvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1NlbmRNSURJKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcG9ydEluZGV4OwotCU11c2ljTUlESVBhY2tldCBtcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBvcnRJbmRleDsKKyAgICBNdXNpY01JRElQYWNrZXQgbXA7CiAjaWZuZGVmIE11c2ljU2VuZE1JREkKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NlbmRNSURJKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NlbmRNSURJKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3J0SW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0TXVzaWNNSURJUGFja2V0X0NvbnZlcnQsICZtcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2VuZE1JREkobWMsCi0JICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAmbXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0TXVzaWNNSURJUGFja2V0X0NvbnZlcnQsICZtcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljU2VuZE1JREkobWMsCisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAmbXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0T2ZmbGluZVRpbWVUbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIG5ld1RpbWVTdGFtcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIG5ld1RpbWVTdGFtcDsKICNpZm5kZWYgTXVzaWNTZXRPZmZsaW5lVGltZVRvCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRPZmZsaW5lVGltZVRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NldE9mZmxpbmVUaW1lVG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdUaW1lU3RhbXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldE9mZmxpbmVUaW1lVG8obWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RpbWVTdGFtcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdUaW1lU3RhbXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldE9mZmxpbmVUaW1lVG8obWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RpbWVTdGFtcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRJbmZvVGV4dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHNlbGVjdG9yOwotCUhhbmRsZSB0ZXh0SDsKLQlIYW5kbGUgc3R5bGVIOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgc2VsZWN0b3I7CisgICAgSGFuZGxlIHRleHRIOworICAgIEhhbmRsZSBzdHlsZUg7CiAjaWZuZGVmIE11c2ljR2V0SW5mb1RleHQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldEluZm9UZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldEluZm9UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldEluZm9UZXh0KG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAmdGV4dEgsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGVIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0ZXh0SCwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzdHlsZUgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldEluZm9UZXh0KG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGVIKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0ZXh0SCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzdHlsZUgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0SW5zdHJ1bWVudEluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBnZXRJbnN0cnVtZW50SW5mb0ZsYWdzOwotCUluc3RydW1lbnRJbmZvTGlzdEhhbmRsZSBpbmZvTGlzdEg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBnZXRJbnN0cnVtZW50SW5mb0ZsYWdzOworICAgIEluc3RydW1lbnRJbmZvTGlzdEhhbmRsZSBpbmZvTGlzdEg7CiAjaWZuZGVmIE11c2ljR2V0SW5zdHJ1bWVudEluZm8KLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldEluc3RydW1lbnRJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldEluc3RydW1lbnRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ2V0SW5zdHJ1bWVudEluZm9GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0SW5zdHJ1bWVudEluZm8obWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnN0cnVtZW50SW5mb0ZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9MaXN0SCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGluZm9MaXN0SCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnZXRJbnN0cnVtZW50SW5mb0ZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRJbnN0cnVtZW50SW5mbyhtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRJbmZvRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb0xpc3RIKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5mb0xpc3RIKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1Rhc2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CiAjaWZuZGVmIE11c2ljVGFzawotCVB5TWFjX1BSRUNIRUNLKE11c2ljVGFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNUYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1Rhc2sobWMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1Rhc2sobWMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlsb25nIGluc3RydW1lbnROdW1iZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIGxvbmcgaW5zdHJ1bWVudE51bWJlcjsKICNpZm5kZWYgTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZShtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50TnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVtZW50TnVtYmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1NldFBhcnRTb3VuZExvY2FsaXphdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JSGFuZGxlIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIEhhbmRsZSBkYXRhOwogI2lmbmRlZiBNdXNpY1NldFBhcnRTb3VuZExvY2FsaXphdGlvbgotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRTb3VuZExvY2FsaXphdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb24obWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb24obWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dlbmVyaWNDb25maWd1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBtb2RlOwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBiYXNlUmVzSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBtb2RlOworICAgIGxvbmcgZmxhZ3M7CisgICAgbG9uZyBiYXNlUmVzSUQ7CiAjaWZuZGVmIE11c2ljR2VuZXJpY0NvbmZpZ3VyZQotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2VuZXJpY0NvbmZpZ3VyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZW5lcmljQ29uZmlndXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZiYXNlUmVzSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dlbmVyaWNDb25maWd1cmUobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlUmVzSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXNlUmVzSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dlbmVyaWNDb25maWd1cmUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlUmVzSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2VuZXJpY0dldEtub2JMaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcga25vYlR5cGU7Ci0JR2VuZXJpY0tub2JEZXNjcmlwdGlvbkxpc3RIYW5kbGUgZ2tkbEg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBrbm9iVHlwZTsKKyAgICBHZW5lcmljS25vYkRlc2NyaXB0aW9uTGlzdEhhbmRsZSBna2RsSDsKICNpZm5kZWYgTXVzaWNHZW5lcmljR2V0S25vYkxpc3QKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dlbmVyaWNHZXRLbm9iTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZW5lcmljR2V0S25vYkxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2VuZXJpY0dldEtub2JMaXN0KG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub2JUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZna2RsSCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGdrZGxIKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtub2JUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZW5lcmljR2V0S25vYkxpc3QobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdrZGxIKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZ2tkbEgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlIYW5kbGUgcmVzb3VyY2VJREg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgSGFuZGxlIHJlc291cmNlSURIOwogI2lmbmRlZiBNdXNpY0dlbmVyaWNTZXRSZXNvdXJjZU51bWJlcnMKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dlbmVyaWNTZXRSZXNvdXJjZU51bWJlcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVzb3VyY2VJREgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dlbmVyaWNTZXRSZXNvdXJjZU51bWJlcnMobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSURIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVzb3VyY2VJREgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dlbmVyaWNTZXRSZXNvdXJjZU51bWJlcnMobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSURIKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0Rlcml2ZWRNSURJU2VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlNdXNpY01JRElQYWNrZXQgcGFja2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIE11c2ljTUlESVBhY2tldCBwYWNrZXQ7CiAjaWZuZGVmIE11c2ljRGVyaXZlZE1JRElTZW5kCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNEZXJpdmVkTUlESVNlbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljRGVyaXZlZE1JRElTZW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgUXRNdXNpY01JRElQYWNrZXRfQ29udmVydCwgJnBhY2tldCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljRGVyaXZlZE1JRElTZW5kKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYWNrZXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRNdXNpY01JRElQYWNrZXRfQ29udmVydCwgJnBhY2tldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljRGVyaXZlZE1JRElTZW5kKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYWNrZXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljRGVyaXZlZE9wZW5SZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOwogI2lmbmRlZiBNdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKE11c2ljRGVyaXZlZE9wZW5SZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUobWMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZShtYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCXNob3J0IHJlc1JlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBzaG9ydCByZXNSZWZOdW07CiAjaWZuZGVmIE11c2ljRGVyaXZlZENsb3NlUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKE11c2ljRGVyaXZlZENsb3NlUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05BVW5yZWdpc3Rlck11c2ljRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU5vdGVBbGxvY2F0b3IgbmE7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBOb3RlQWxsb2NhdG9yIG5hOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIE5BVW5yZWdpc3Rlck11c2ljRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE5BVW5yZWdpc3Rlck11c2ljRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm5hLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOQVVucmVnaXN0ZXJNdXNpY0RldmljZShuYSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5BVW5yZWdpc3Rlck11c2ljRGV2aWNlKG5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTm90ZUFsbG9jYXRvciBuYTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBOb3RlQWxsb2NhdG9yIG5hOwogI2lmbmRlZiBOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE5BU2F2ZU11c2ljQ29uZmlndXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm5hKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uKG5hKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm5hKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uKG5hKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OQUdldE1JRElQb3J0cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlOb3RlQWxsb2NhdG9yIG5hOwotCVFUTUlESVBvcnRMaXN0SGFuZGxlIGlucHV0UG9ydHM7Ci0JUVRNSURJUG9ydExpc3RIYW5kbGUgb3V0cHV0UG9ydHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTm90ZUFsbG9jYXRvciBuYTsKKyAgICBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzOworICAgIFFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzOwogI2lmbmRlZiBOQUdldE1JRElQb3J0cwotCVB5TWFjX1BSRUNIRUNLKE5BR2V0TUlESVBvcnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOQUdldE1JRElQb3J0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm5hKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTkFHZXRNSURJUG9ydHMobmEsCi0JICAgICAgICAgICAgICAgICAgICAgJmlucHV0UG9ydHMsCi0JICAgICAgICAgICAgICAgICAgICAgJm91dHB1dFBvcnRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnB1dFBvcnRzLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dHB1dFBvcnRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm5hKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTkFHZXRNSURJUG9ydHMobmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0UG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dFBvcnRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnB1dFBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dHB1dFBvcnRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OQVRhc2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTm90ZUFsbG9jYXRvciBuYTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBOb3RlQWxsb2NhdG9yIG5hOwogI2lmbmRlZiBOQVRhc2sKLQlQeU1hY19QUkVDSEVDSyhOQVRhc2spOworICAgIFB5TWFjX1BSRUNIRUNLKE5BVGFzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm5hKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTkFUYXNrKG5hKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm5hKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTkFUYXNrKG5hKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0SGVhZGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7Ci0JdW5zaWduZWQgbG9uZyAqIGhlYWRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIHVuc2lnbmVkIGxvbmcgKiBoZWFkZXI7CiAjaWZuZGVmIFR1bmVTZXRIZWFkZXIKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0SGVhZGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0SGVhZGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVNldEhlYWRlcih0cCwKLQkgICAgICAgICAgICAgICAgICAgIGhlYWRlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0SGVhZGVyKHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lR2V0VGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlUaW1lQmFzZSB0YjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIFRpbWVCYXNlIHRiOwogI2lmbmRlZiBUdW5lR2V0VGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhUdW5lR2V0VGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVHZXRUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZUdldFRpbWVCYXNlKHRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZUdldFRpbWVCYXNlKHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0VGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7Ci0JVGltZVNjYWxlIHNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgVGltZVNjYWxlIHNjYWxlOwogI2lmbmRlZiBUdW5lU2V0VGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soVHVuZVNldFRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVNldFRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVNldFRpbWVTY2FsZSh0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVNldFRpbWVTY2FsZSh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lR2V0VGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7Ci0JVGltZVNjYWxlIHNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgVGltZVNjYWxlIHNjYWxlOwogI2lmbmRlZiBUdW5lR2V0VGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soVHVuZUdldFRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZUdldFRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZUdldFRpbWVTY2FsZSh0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lR2V0VGltZVNjYWxlKHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZUluc3RhbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQl1bnNpZ25lZCBsb25nIHR1bmU7Ci0JdW5zaWduZWQgbG9uZyB0dW5lUG9zaXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICB1bnNpZ25lZCBsb25nIHR1bmU7CisgICAgdW5zaWduZWQgbG9uZyB0dW5lUG9zaXRpb247CiAjaWZuZGVmIFR1bmVJbnN0YW50Ci0JUHlNYWNfUFJFQ0hFQ0soVHVuZUluc3RhbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVJbnN0YW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHVuZVBvc2l0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZUluc3RhbnQodHAsCi0JICAgICAgICAgICAgICAgICAgJnR1bmUsCi0JICAgICAgICAgICAgICAgICAgdHVuZVBvc2l0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB0dW5lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnR1bmVQb3NpdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVJbnN0YW50KHRwLAorICAgICAgICAgICAgICAgICAgICAgICZ0dW5lLAorICAgICAgICAgICAgICAgICAgICAgIHR1bmVQb3NpdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHVuZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZVN0b3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlsb25nIHN0b3BGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIGxvbmcgc3RvcEZsYWdzOwogI2lmbmRlZiBUdW5lU3RvcAotCVB5TWFjX1BSRUNIRUNLKFR1bmVTdG9wKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU3RvcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0b3BGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVTdG9wKHRwLAotCSAgICAgICAgICAgICAgIHN0b3BGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdG9wRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU3RvcCh0cCwKKyAgICAgICAgICAgICAgICAgICBzdG9wRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlGaXhlZCB2b2x1bWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICBGaXhlZCB2b2x1bWU7CiAjaWZuZGVmIFR1bmVTZXRWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0Vm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0Vm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ2b2x1bWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0Vm9sdW1lKHRwLAotCSAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmdm9sdW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVNldFZvbHVtZSh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZUdldFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CiAjaWZuZGVmIFR1bmVHZXRWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhUdW5lR2V0Vm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lR2V0Vm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lR2V0Vm9sdW1lKHRwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZUdldFZvbHVtZSh0cCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZVByZXJvbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOwogI2lmbmRlZiBUdW5lUHJlcm9sbAotCVB5TWFjX1BSRUNIRUNLKFR1bmVQcmVyb2xsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lUHJlcm9sbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVByZXJvbGwodHApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lUHJlcm9sbCh0cCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZVVucm9sbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CiAjaWZuZGVmIFR1bmVVbnJvbGwKLQlQeU1hY19QUkVDSEVDSyhUdW5lVW5yb2xsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lVW5yb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lVW5yb2xsKHRwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVVucm9sbCh0cCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZVNldFBhcnRUcmFuc3Bvc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQl1bnNpZ25lZCBsb25nIHBhcnQ7Ci0JbG9uZyB0cmFuc3Bvc2U7Ci0JbG9uZyB2ZWxvY2l0eVNoaWZ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgdW5zaWduZWQgbG9uZyBwYXJ0OworICAgIGxvbmcgdHJhbnNwb3NlOworICAgIGxvbmcgdmVsb2NpdHlTaGlmdDsKICNpZm5kZWYgVHVuZVNldFBhcnRUcmFuc3Bvc2UKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0UGFydFRyYW5zcG9zZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVNldFBhcnRUcmFuc3Bvc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc3Bvc2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2ZWxvY2l0eVNoaWZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVNldFBhcnRUcmFuc3Bvc2UodHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2UsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlTaGlmdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc3Bvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZWxvY2l0eVNoaWZ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVNldFBhcnRUcmFuc3Bvc2UodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlTaGlmdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZUdldE5vdGVBbGxvY2F0b3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU5vdGVBbGxvY2F0b3IgX3J2OwotCVR1bmVQbGF5ZXIgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE5vdGVBbGxvY2F0b3IgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CiAjaWZuZGVmIFR1bmVHZXROb3RlQWxsb2NhdG9yCi0JUHlNYWNfUFJFQ0hFQ0soVHVuZUdldE5vdGVBbGxvY2F0b3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVHZXROb3RlQWxsb2NhdG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lR2V0Tm90ZUFsbG9jYXRvcih0cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZUdldE5vdGVBbGxvY2F0b3IodHApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZVNldFNvZnRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCWxvbmcgc29mdGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgbG9uZyBzb2Z0ZXI7CiAjaWZuZGVmIFR1bmVTZXRTb2Z0ZXIKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0U29mdGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0U29mdGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmc29mdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVNldFNvZnRlcih0cCwKLQkgICAgICAgICAgICAgICAgICAgIHNvZnRlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2Z0ZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0U29mdGVyKHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgc29mdGVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lVGFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CiAjaWZuZGVmIFR1bmVUYXNrCi0JUHlNYWNfUFJFQ0hFQ0soVHVuZVRhc2spOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVUYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lVGFzayh0cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVUYXNrKHRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0QmFsYW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCWxvbmcgYmFsYW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIGxvbmcgYmFsYW5jZTsKICNpZm5kZWYgVHVuZVNldEJhbGFuY2UKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0QmFsYW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVNldEJhbGFuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVNldEJhbGFuY2UodHAsCi0JICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVNldEJhbGFuY2UodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZVNldFNvdW5kTG9jYWxpemF0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7Ci0JSGFuZGxlIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICBIYW5kbGUgZGF0YTsKICNpZm5kZWYgVHVuZVNldFNvdW5kTG9jYWxpemF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVHVuZVNldFNvdW5kTG9jYWxpemF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0U291bmRMb2NhbGl6YXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0U291bmRMb2NhbGl6YXRpb24odHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVNldFNvdW5kTG9jYWxpemF0aW9uKHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0SGVhZGVyV2l0aFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQl1bnNpZ25lZCBsb25nICogaGVhZGVyOwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIHVuc2lnbmVkIGxvbmcgKiBoZWFkZXI7CisgICAgdW5zaWduZWQgbG9uZyBzaXplOwogI2lmbmRlZiBUdW5lU2V0SGVhZGVyV2l0aFNpemUKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0SGVhZGVyV2l0aFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRIZWFkZXJXaXRoU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVNldEhlYWRlcldpdGhTaXplKHRwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0SGVhZGVyV2l0aFNpemUodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZVNldFBhcnRNaXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQl1bnNpZ25lZCBsb25nIHBhcnROdW1iZXI7Ci0JbG9uZyB2b2x1bWU7Ci0JbG9uZyBiYWxhbmNlOwotCWxvbmcgbWl4RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXI7CisgICAgbG9uZyB2b2x1bWU7CisgICAgbG9uZyBiYWxhbmNlOworICAgIGxvbmcgbWl4RmxhZ3M7CiAjaWZuZGVmIFR1bmVTZXRQYXJ0TWl4Ci0JUHlNYWNfUFJFQ0hFQ0soVHVuZVNldFBhcnRNaXgpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRQYXJ0TWl4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaXhGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVTZXRQYXJ0TWl4KHRwLAotCSAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UsCi0JICAgICAgICAgICAgICAgICAgICAgbWl4RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaXhGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTZXRQYXJ0TWl4KHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWl4RmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVHZXRQYXJ0TWl4KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7Ci0JdW5zaWduZWQgbG9uZyBwYXJ0TnVtYmVyOwotCWxvbmcgdm9sdW1lT3V0OwotCWxvbmcgYmFsYW5jZU91dDsKLQlsb25nIG1peEZsYWdzT3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgdW5zaWduZWQgbG9uZyBwYXJ0TnVtYmVyOworICAgIGxvbmcgdm9sdW1lT3V0OworICAgIGxvbmcgYmFsYW5jZU91dDsKKyAgICBsb25nIG1peEZsYWdzT3V0OwogI2lmbmRlZiBUdW5lR2V0UGFydE1peAotCVB5TWFjX1BSRUNIRUNLKFR1bmVHZXRQYXJ0TWl4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lR2V0UGFydE1peCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnROdW1iZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lR2V0UGFydE1peCh0cCwKLQkgICAgICAgICAgICAgICAgICAgICBwYXJ0TnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWVPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2VPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgJm1peEZsYWdzT3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHZvbHVtZU91dCwKLQkgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlT3V0LAotCSAgICAgICAgICAgICAgICAgICAgIG1peEZsYWdzT3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnROdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lR2V0UGFydE1peCh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2VPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm1peEZsYWdzT3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1peEZsYWdzT3V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9BbGlnbldpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIHdwOwotCUJvb2xlYW4gZnJvbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciB3cDsKKyAgICBCb29sZWFuIGZyb250OwogI2lmbmRlZiBBbGlnbldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKEFsaWduV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBbGlnbldpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndwLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlBbGlnbldpbmRvdyh3cCwKLQkgICAgICAgICAgICBmcm9udCwKLQkgICAgICAgICAgICAoUmVjdCAqKTAsCi0JICAgICAgICAgICAgKElDTUFsaWdubWVudFByb2NSZWNvcmRQdHIpMCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmcm9udCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFsaWduV2luZG93KHdwLAorICAgICAgICAgICAgICAgIGZyb250LAorICAgICAgICAgICAgICAgIChSZWN0ICopMCwKKyAgICAgICAgICAgICAgICAoSUNNQWxpZ25tZW50UHJvY1JlY29yZFB0cikwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRHJhZ0FsaWduZWRXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciB3cDsKLQlQb2ludCBzdGFydFB0OwotCVJlY3QgYm91bmRzUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIHdwOworICAgIFBvaW50IHN0YXJ0UHQ7CisgICAgUmVjdCBib3VuZHNSZWN0OwogI2lmbmRlZiBEcmFnQWxpZ25lZFdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKERyYWdBbGlnbmVkV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmFnQWxpZ25lZFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndwLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JRHJhZ0FsaWduZWRXaW5kb3cod3AsCi0JICAgICAgICAgICAgICAgICAgc3RhcnRQdCwKLQkgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAoUmVjdCAqKTAsCi0JICAgICAgICAgICAgICAgICAgKElDTUFsaWdubWVudFByb2NSZWNvcmRQdHIpMCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmFnQWxpZ25lZFdpbmRvdyh3cCwKKyAgICAgICAgICAgICAgICAgICAgICBzdGFydFB0LAorICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgIChSZWN0ICopMCwKKyAgICAgICAgICAgICAgICAgICAgICAoSUNNQWxpZ25tZW50UHJvY1JlY29yZFB0cikwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVzVGFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBtYXhNaWxsaVNlY1RvVXNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIG1heE1pbGxpU2VjVG9Vc2U7CiAjaWZuZGVmIE1vdmllc1Rhc2sKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZXNUYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZXNUYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4TWlsbGlTZWNUb1VzZSkpCi0JCXJldHVybiBOVUxMOwotCU1vdmllc1Rhc2soKE1vdmllKTAsCi0JICAgICAgICAgICBtYXhNaWxsaVNlY1RvVXNlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhNaWxsaVNlY1RvVXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTW92aWVzVGFzaygoTW92aWUpMCwKKyAgICAgICAgICAgICAgIG1heE1pbGxpU2VjVG9Vc2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgUXRfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiRW50ZXJNb3ZpZXMiLCAoUHlDRnVuY3Rpb24pUXRfRW50ZXJNb3ZpZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkV4aXRNb3ZpZXMiLCAoUHlDRnVuY3Rpb24pUXRfRXhpdE1vdmllcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVzRXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TW92aWVzRXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNsZWFyTW92aWVzU3RpY2t5RXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfQ2xlYXJNb3ZpZXNTdGlja3lFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVzU3RpY2t5RXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TW92aWVzU3RpY2t5RXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlFUR2V0V2FsbENsb2NrVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2Ugd2FsbENsb2NrVGltZUJhc2UpIil9LAotCXsiUVRJZGxlTWFuYWdlck9wZW4iLCAoUHlDRnVuY3Rpb24pUXRfUVRJZGxlTWFuYWdlck9wZW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKElkbGVNYW5hZ2VyIF9ydikiKX0sCi0JeyJDcmVhdGVNb3ZpZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgdGhlV2luZG93LCBNb3ZpZSB0aGVNb3ZpZSwgVUludDMyIG9wdGlvbnMpIC0+IChSZWN0IGxvY2FsUmVjdCwgQ29udHJvbEhhbmRsZSByZXR1cm5lZENvbnRyb2wpIil9LAotCXsiRGlzcG9zZU1hdHRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0Rpc3Bvc2VNYXR0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHRoZU1hdHRlKSAtPiBOb25lIil9LAotCXsiTmV3TW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZmxhZ3MpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiUVRHZXRUaW1lVW50aWxOZXh0VGFzayIsIChQeUNGdW5jdGlvbilRdF9RVEdldFRpbWVVbnRpbE5leHRUYXNrLCAxLAotCSBQeURvY19TVFIoIihsb25nIHNjYWxlKSAtPiAobG9uZyBkdXJhdGlvbikiKX0sCi0JeyJHZXREYXRhSGFuZGxlciIsIChQeUNGdW5jdGlvbilRdF9HZXREYXRhSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhSGFuZGxlclN1YlR5cGUsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKLQl7IlBhc3RlSGFuZGxlSW50b01vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X1Bhc3RlSGFuZGxlSW50b01vdmllLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCwgT1NUeXBlIGhhbmRsZVR5cGUsIE1vdmllIHRoZU1vdmllLCBsb25nIGZsYWdzLCBDb21wb25lbnRJbnN0YW5jZSB1c2VyQ29tcCkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZGF0YVJlZlR5cGUsIEhhbmRsZSBkYXRhUmVmLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50IGltcG9ydGVyKSIpfSwKLQl7IlFUR2V0TUlNRVR5cGVJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0TUlNRVR5cGVJbmZvLCAxLAotCSBQeURvY19TVFIoIihjaGFyKiBtaW1lU3RyaW5nU3RhcnQsIHNob3J0IG1pbWVTdHJpbmdMZW5ndGgsIE9TVHlwZSBpbmZvU2VsZWN0b3IsIHZvaWQgKiBpbmZvRGF0YVB0cikgLT4gKGxvbmcgaW5mb0RhdGFTaXplKSIpfSwKLQl7IlRyYWNrVGltZVRvTWVkaWFUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1RyYWNrVGltZVRvTWVkaWFUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdmFsdWUsIFRyYWNrIHRoZVRyYWNrKSAtPiAoVGltZVZhbHVlIF9ydikiKX0sCi0JeyJOZXdVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilRdF9OZXdVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgdGhlVXNlckRhdGEpIil9LAotCXsiTmV3VXNlckRhdGFGcm9tSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld1VzZXJEYXRhRnJvbUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IChVc2VyRGF0YSB0aGVVc2VyRGF0YSkiKX0sCi0JeyJDcmVhdGVNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKHNob3J0IHJlc1JlZk51bSwgTW92aWUgbmV3bW92aWUpIil9LAotCXsiT3Blbk1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9PcGVuTW92aWVGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZXNSZWZOdW0pIil9LAotCXsiQ2xvc2VNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvc2VNb3ZpZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSkgLT4gTm9uZSIpfSwKLQl7IkRlbGV0ZU1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EZWxldGVNb3ZpZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYykgLT4gTm9uZSIpfSwKLQl7Ik5ld01vdmllRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBzaG9ydCByZXNJZCwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCi0JeyJOZXdNb3ZpZUZyb21IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKLQl7Ik5ld01vdmllRnJvbURhdGFGb3JrIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbURhdGFGb3JrLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBmUmVmTnVtLCBsb25nIGZpbGVPZmZzZXQsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCi0JeyJOZXdNb3ZpZUZyb21EYXRhRm9yazY0IiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbURhdGFGb3JrNjQsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZlJlZk51bSwgd2lkZSBmaWxlT2Zmc2V0LCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQpIil9LAotCXsiTmV3TW92aWVGcm9tRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21EYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBmbGFncywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkdGFSZWZUeXBlKSAtPiAoTW92aWUgbSwgc2hvcnQgaWQpIil9LAotCXsiTmV3TW92aWVGcm9tU3RvcmFnZU9mZnNldCIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21TdG9yYWdlT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBmaWxlT2Zmc2V0LCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NhdGFSZWZUeXBlKSIpfSwKLQl7Ik5ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGgsIHNob3J0IG5ld01vdmllRmxhZ3MsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCi0JeyJSZW1vdmVNb3ZpZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1JlbW92ZU1vdmllUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgc2hvcnQgcmVzSWQpIC0+IE5vbmUiKX0sCi0JeyJDcmVhdGVNb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVTdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3MpIC0+IChEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlciwgTW92aWUgbmV3bW92aWUpIil9LAotCXsiT3Blbk1vdmllU3RvcmFnZSIsIChQeUNGdW5jdGlvbilRdF9PcGVuTW92aWVTdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGZsYWdzKSAtPiAoRGF0YUhhbmRsZXIgb3V0RGF0YUhhbmRsZXIpIil9LAotCXsiQ2xvc2VNb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvc2VNb3ZpZVN0b3JhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiBOb25lIil9LAotCXsiRGVsZXRlTW92aWVTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RlbGV0ZU1vdmllU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkNyZWF0ZVNob3J0Y3V0TW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NyZWF0ZVNob3J0Y3V0TW92aWVGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncywgSGFuZGxlIHRhcmdldERhdGFSZWYsIE9TVHlwZSB0YXJnZXREYXRhUmVmVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkNhblF1aWNrVGltZU9wZW5GaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NhblF1aWNrVGltZU9wZW5GaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uLCBVSW50MzIgaW5GbGFncykgLT4gKEJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLCBCb29sZWFuIG91dENhbk9wZW5Bc01vdmllLCBCb29sZWFuIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIpIil9LAotCXsiQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIFVJbnQzMiBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsIEJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWUsIEJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcikiKX0sCi0JeyJOZXdNb3ZpZUZyb21TY3JhcCIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21TY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7IlFUTmV3QWxpYXMiLCAoUHlDRnVuY3Rpb24pUXRfUVROZXdBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGZzcywgQm9vbGVhbiBtaW5pbWFsKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAotCXsiRW5kRnVsbFNjcmVlbiIsIChQeUNGdW5jdGlvbilRdF9FbmRGdWxsU2NyZWVuLCAxLAotCSBQeURvY19TVFIoIihQdHIgZnVsbFN0YXRlLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAotCXsiQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9BZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIihTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIEhhbmRsZSBleHRlbnNpb24sIE9TVHlwZSBpZFR5cGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIGlkVHlwZSkgLT4gKEhhbmRsZSBleHRlbnNpb24pIil9LAotCXsiUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9SZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIihTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBpZFR5cGUpIC0+IE5vbmUiKX0sCi0JeyJRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCIsIChQeUNGdW5jdGlvbilRdF9RVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZykgLT4gKEV2ZW50UmVjb3JkIHBFdmVudCkiKX0sCi0JeyJRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZyIsIChQeUNGdW5jdGlvbilRdF9RVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZykgLT4gTm9uZSIpfSwKLQl7IlFUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9RVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKFFUUGFyYW1ldGVyRGlhbG9nIGNyZWF0ZWREaWFsb2csIGxvbmcgYWN0aW9uLCB2b2lkICogcGFyYW1zKSAtPiBOb25lIil9LAotCXsiUVRSZWdpc3RlckFjY2Vzc0tleSIsIChQeUNGdW5jdGlvbilRdF9RVFJlZ2lzdGVyQWNjZXNzS2V5LCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgYWNjZXNzS2V5VHlwZSwgbG9uZyBmbGFncywgSGFuZGxlIGFjY2Vzc0tleSkgLT4gTm9uZSIpfSwKLQl7IlFUVW5yZWdpc3RlckFjY2Vzc0tleSIsIChQeUNGdW5jdGlvbilRdF9RVFVucmVnaXN0ZXJBY2Nlc3NLZXksIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBhY2Nlc3NLZXlUeXBlLCBsb25nIGZsYWdzLCBIYW5kbGUgYWNjZXNzS2V5KSAtPiBOb25lIil9LAotCXsiUVRHZXRTdXBwb3J0ZWRSZXN0cmljdGlvbnMiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRTdXBwb3J0ZWRSZXN0cmljdGlvbnMsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBpblJlc3RyaWN0aW9uQ2xhc3MpIC0+IChVSW50MzIgb3V0UmVzdHJpY3Rpb25JRHMpIil9LAotCXsiUVRUZXh0VG9OYXRpdmVUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVGV4dFRvTmF0aXZlVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZVRleHQsIGxvbmcgZW5jb2RpbmcsIGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFSZXNldFN0YXRpc3RpY3MsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVmlkZW9NZWRpYUdldFN0YWxsQ291bnQiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYUdldFN0YWxsQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc3RhbGxzKSIpfSwKLQl7IlZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlciIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29kZWNUeXBlIGNUeXBlLCBPU1R5cGUgcGFyYW1ldGVySUQsIGxvbmcgcGFyYW1ldGVyQ2hhbmdlU2VlZCwgdm9pZCAqIGRhdGFQdHIsIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlciIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhR2V0Q29kZWNQYXJhbWV0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29kZWNUeXBlIGNUeXBlLCBPU1R5cGUgcGFyYW1ldGVySUQsIEhhbmRsZSBvdXRQYXJhbWV0ZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUZXh0TWVkaWFBZGRUZXh0U2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZFRleHRTYW1wbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUHRyIHRleHQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc2hvcnQgZm9udE51bWJlciwgc2hvcnQgZm9udFNpemUsIFN0eWxlIHRleHRGYWNlLCBzaG9ydCB0ZXh0SnVzdGlmaWNhdGlvbiwgbG9uZyBkaXNwbGF5RmxhZ3MsIFRpbWVWYWx1ZSBzY3JvbGxEZWxheSwgc2hvcnQgaGlsaXRlU3RhcnQsIHNob3J0IGhpbGl0ZUVuZCwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgdGV4dENvbG9yLCBSR0JDb2xvciBiYWNrQ29sb3IsIFJlY3QgdGV4dEJveCwgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3IsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKLQl7IlRleHRNZWRpYUFkZFRFU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZFRFU2FtcGxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRFSGFuZGxlIGhURSwgc2hvcnQgdGV4dEp1c3RpZmljYXRpb24sIGxvbmcgZGlzcGxheUZsYWdzLCBUaW1lVmFsdWUgc2Nyb2xsRGVsYXksIHNob3J0IGhpbGl0ZVN0YXJ0LCBzaG9ydCBoaWxpdGVFbmQsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIGJhY2tDb2xvciwgUmVjdCB0ZXh0Qm94LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvciwgVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAotCXsiVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvciwgVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAotCXsiVGV4dE1lZGlhRHJhd1JhdyIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFEcmF3UmF3LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEdXb3JsZFB0ciBndywgR0RIYW5kbGUgZ2QsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplLCBUZXh0RGVzY3JpcHRpb25IYW5kbGUgdGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhU2V0VGV4dFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUZXh0TWVkaWFSYXdTZXR1cCIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFSYXdTZXR1cCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBHV29ybGRQdHIgZ3csIEdESGFuZGxlIGdkLCB2b2lkICogZGF0YSwgbG9uZyBkYXRhU2l6ZSwgVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaCwgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUZXh0TWVkaWFSYXdJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYVJhd0lkbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgR1dvcmxkUHRyIGd3LCBHREhhbmRsZSBnZCwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIGxvbmcgZmxhZ3NJbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3NPdXQpIil9LAotCXsiVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUdldFRleHRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgYXRNZWRpYVRpbWUsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogZGF0YSwgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVGV4dE1lZGlhRmluZE5leHRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUZpbmROZXh0VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQdHIgdGV4dCwgbG9uZyBzaXplLCBzaG9ydCBmaW5kRmxhZ3MsIFRpbWVWYWx1ZSBzdGFydFRpbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgZm91bmRUaW1lLCBUaW1lVmFsdWUgZm91bmREdXJhdGlvbiwgbG9uZyBvZmZzZXQpIil9LAotCXsiVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3IpIil9LAotCXsiVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGRhdGEsIE9TVHlwZSBkYXRhVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHNwcml0ZUluZGV4LCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhR2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBzcHJpdGVJbmRleCwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgc3ByaXRlSGl0SW5kZXgpIil9LAotCXsiU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IG51bVNwcml0ZXMpIil9LAotCXsiU3ByaXRlTWVkaWFDb3VudEltYWdlcyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUNvdW50SW1hZ2VzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBudW1JbWFnZXMpIil9LAotCXsiU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGltYWdlRGVzY3JpcHRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNhbXBsZU51bSkiKX0sCi0JeyJTcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBTdHIyNTUgc3ByaXRlTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgaW1hZ2VJbmRleCwgU3RyMjU1IGltYWdlTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldFNwcml0ZVByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRTcHJpdGVQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdEFsbFNwcml0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRBdG9tSUQgc3ByaXRlSGl0SUQpIil9LAotCXsiU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB3YXNIaXQpIil9LAotCXsiU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgc3ByaXRlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVEF0b21JRCBzcHJpdGVJRCkiKX0sCi0JeyJTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHNwcml0ZUluZGV4KSIpfSwKLQl7IlNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCB2YXJpYWJsZUlELCBmbG9hdCB2YWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBmbG9hdCB2YWx1ZSkiKX0sCi0JeyJTcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQsIFB0ciB0aGVDU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdGhlQ1N0cmluZykiKX0sCi0JeyJTcHJpdGVNZWRpYU5ld0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhTmV3SW1hZ2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgUVRBdG9tSUQgZGVzaXJlZElEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYUltYWdlSW5kZXhUb0lEIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgaW1hZ2VJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUQXRvbUlEIGltYWdlSUQpIil9LAotCXsiU3ByaXRlTWVkaWFJbWFnZUlEVG9JbmRleCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUltYWdlSURUb0luZGV4LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIGltYWdlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpbWFnZUluZGV4KSIpfSwKLQl7IkZsYXNoTWVkaWFTZXRQYW4iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYVNldFBhbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCB4UGVyY2VudCwgc2hvcnQgeVBlcmNlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkZsYXNoTWVkaWFTZXRab29tIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRab29tLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGZhY3RvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRmxhc2hNZWRpYVNldFpvb21SZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRab29tUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGxlZnQsIGxvbmcgdG9wLCBsb25nIHJpZ2h0LCBsb25nIGJvdHRvbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBsZWZ0LCBsb25nIHRvcCwgbG9uZyByaWdodCwgbG9uZyBib3R0b20pIil9LAotCXsiRmxhc2hNZWRpYUdldFJlZkNvbklEIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRSZWZDb25JRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uSUQpIil9LAotCXsiRmxhc2hNZWRpYUlEVG9SZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUlEVG9SZWZDb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb25JRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uKSIpfSwKLQl7IkZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlciIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhc2hGcmFtZU51bWJlcikiKX0sCi0JeyJGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYXNoRnJhbWVOdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbW92aWVUaW1lKSIpfSwKLQl7IkZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUZyYW1lTGFiZWxUb01vdmllVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQdHIgdGhlTGFiZWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbW92aWVUaW1lKSIpfSwKLQl7IkZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIHBhdGgsIGNoYXIgbmFtZSwgSGFuZGxlIHRoZVZhcmlhYmxlQ1N0cmluZ091dCkiKX0sCi0JeyJGbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIHVwZGF0ZUZvY3VzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBwYXRoLCBjaGFyIG5hbWUsIGNoYXIgdmFsdWUpIil9LAotCXsiRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgYnV0dG9uSUQsIGxvbmcgdHJhbnNpdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgcGF0aCkiKX0sCi0JeyJGbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbiIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDggc3dmVmVyc2lvbikiKX0sCi0JeyJNZWRpYTNER2V0Q3VycmVudEdyb3VwIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDdXJyZW50R3JvdXAsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGdyb3VwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB4LCBGaXhlZCB5LCBGaXhlZCB6KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBvYmplY3ROYW1lKSIpfSwKLQl7Ik1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNjYWxlTmFtZWRPYmplY3RUbywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB4U2NhbGUsIEZpeGVkIHlTY2FsZSwgRml4ZWQgelNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBvYmplY3ROYW1lKSIpfSwKLQl7Ik1lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHhEZWdyZWVzLCBGaXhlZCB5RGVncmVlcywgRml4ZWQgekRlZ3JlZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG9iamVjdE5hbWUpIil9LAotCXsiTWVkaWEzRFNldENhbWVyYURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNldENhbWVyYURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGNhbWVyYURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhM0RHZXRDYW1lcmFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDYW1lcmFEYXRhLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiBjYW1lcmFEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYTNEU2V0Q2FtZXJhQW5nbGVBc3BlY3QiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFURmxvYXRTaW5nbGUgZm92LCBRVEZsb2F0U2luZ2xlIGFzcGVjdFJhdGlvWFRvWSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRGbG9hdFNpbmdsZSBmb3YsIFFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZKSIpfSwKLQl7Ik1lZGlhM0RTZXRDYW1lcmFSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2V0Q2FtZXJhUmFuZ2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIHRRM0NhbWVyYVJhbmdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYTNER2V0Q2FtZXJhUmFuZ2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldENhbWVyYVJhbmdlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiB0UTNDYW1lcmFSYW5nZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTmV3VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfTmV3VGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVCYXNlIF9ydikiKX0sCi0JeyJDb252ZXJ0VGltZSIsIChQeUNGdW5jdGlvbilRdF9Db252ZXJ0VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0aGVUaW1lLCBUaW1lQmFzZSBuZXdCYXNlKSAtPiAoVGltZVJlY29yZCB0aGVUaW1lKSIpfSwKLQl7IkNvbnZlcnRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ29udmVydFRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0aGVUaW1lLCBUaW1lU2NhbGUgbmV3U2NhbGUpIC0+IChUaW1lUmVjb3JkIHRoZVRpbWUpIil9LAotCXsiQWRkVGltZSIsIChQeUNGdW5jdGlvbilRdF9BZGRUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIGRzdCwgVGltZVJlY29yZCBzcmMpIC0+IChUaW1lUmVjb3JkIGRzdCkiKX0sCi0JeyJTdWJ0cmFjdFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3VidHJhY3RUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIGRzdCwgVGltZVJlY29yZCBzcmMpIC0+IChUaW1lUmVjb3JkIGRzdCkiKX0sCi0JeyJNdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSB0aSwgbG9uZyBzYW1wbGVEZXNjSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnRJbnN0YW5jZSB0cCkiKX0sCi0JeyJDb2RlY01hbmFnZXJWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvZGVjTWFuYWdlclZlcnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgdmVyc2lvbikiKX0sCi0JeyJHZXRNYXhDb21wcmVzc2lvblNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TWF4Q29tcHJlc3Npb25TaXplLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIHNob3J0IGNvbG9yRGVwdGgsIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUsIENvbXByZXNzb3JDb21wb25lbnQgY29kZWMpIC0+IChsb25nIHNpemUpIil9LAotCXsiR2V0Q29tcHJlc3Npb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldENvbXByZXNzaW9uVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0LCBzaG9ydCBjb2xvckRlcHRoLCBDb2RlY1R5cGUgY1R5cGUsIENvbXByZXNzb3JDb21wb25lbnQgY29kZWMpIC0+IChDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lKSIpfSwKLQl7IkNvbXByZXNzSW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcHJlc3NJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0LCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIFB0ciBkYXRhKSAtPiBOb25lIil9LAotCXsiRGVjb21wcmVzc0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RlY29tcHJlc3NJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoUHRyIGRhdGEsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgUGl4TWFwSGFuZGxlIGRzdCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QsIHNob3J0IG1vZGUsIFJnbkhhbmRsZSBtYXNrKSAtPiBOb25lIil9LAotCXsiR2V0U2ltaWxhcml0eSIsIChQeUNGdW5jdGlvbilRdF9HZXRTaW1pbGFyaXR5LCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgUHRyIGRhdGEpIC0+IChGaXhlZCBzaW1pbGFyaXR5KSIpfSwKLQl7IkdldEltYWdlRGVzY3JpcHRpb25DVGFibGUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ1RhYkhhbmRsZSBjdGFibGUpIil9LAotCXsiU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSIsIChQeUNGdW5jdGlvbilRdF9TZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlLCAxLAotCSBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIENUYWJIYW5kbGUgY3RhYmxlKSAtPiBOb25lIil9LAotCXsiR2V0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9HZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIGxvbmcgaWRUeXBlLCBsb25nIGluZGV4KSAtPiAoSGFuZGxlIGV4dGVuc2lvbikiKX0sCi0JeyJBZGRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0FkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgSGFuZGxlIGV4dGVuc2lvbiwgbG9uZyBpZFR5cGUpIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1JlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgbG9uZyBpZFR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCi0JeyJDb3VudEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgbG9uZyBpZFR5cGUpIC0+IChsb25nIGNvdW50KSIpfSwKLQl7IkdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSIsIChQeUNGdW5jdGlvbilRdF9HZXROZXh0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKGxvbmcgaWRUeXBlKSIpfSwKLQl7IkZpbmRDb2RlYyIsIChQeUNGdW5jdGlvbilRdF9GaW5kQ29kZWMsIDEsCi0JIFB5RG9jX1NUUigiKENvZGVjVHlwZSBjVHlwZSwgQ29kZWNDb21wb25lbnQgc3BlY0NvZGVjKSAtPiAoQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yLCBEZWNvbXByZXNzb3JDb21wb25lbnQgZGVjb21wcmVzc29yKSIpfSwKLQl7IkNvbXByZXNzUGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9Db21wcmVzc1BpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBzcmNQaWN0dXJlLCBQaWNIYW5kbGUgZHN0UGljdHVyZSwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkNvbXByZXNzUGljdHVyZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcHJlc3NQaWN0dXJlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgc3JjUmVmTnVtLCBzaG9ydCBkc3RSZWZOdW0sIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUpIC0+IE5vbmUiKX0sCi0JeyJDb252ZXJ0SW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ29udmVydEltYWdlLCAxLAotCSBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIHNyY0RELCBQdHIgc3JjRGF0YSwgc2hvcnQgY29sb3JEZXB0aCwgQ1RhYkhhbmRsZSBjdGFibGUsIENvZGVjUSBhY2N1cmFjeSwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSwgQ29kZWNDb21wb25lbnQgY29kZWMsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0REQsIFB0ciBkc3REYXRhKSAtPiBOb25lIil9LAotCXsiQWRkRmlsZVByZXZpZXciLCAoUHlDRnVuY3Rpb24pUXRfQWRkRmlsZVByZXZpZXcsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgT1NUeXBlIHByZXZpZXdUeXBlLCBIYW5kbGUgcHJldmlld0RhdGEpIC0+IE5vbmUiKX0sCi0JeyJHZXRCZXN0RGV2aWNlUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HZXRCZXN0RGV2aWNlUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgZ2RoLCBSZWN0IHJwKSIpfSwKLQl7IkdESGFzU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RIYXNTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBzaG9ydCBkZXB0aCkgLT4gKEZpeGVkIHNjYWxlKSIpfSwKLQl7IkdER2V0U2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RHZXRTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoKSAtPiAoRml4ZWQgc2NhbGUsIHNob3J0IGZsYWdzKSIpfSwKLQl7IkdEU2V0U2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RTZXRTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBGaXhlZCBzY2FsZSwgc2hvcnQgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRJbnN0YW5jZSBnaSkiKX0sCi0JeyJHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9HZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKLQl7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgdGhlRmlsZSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKLQl7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgZ2kpIil9LAotCXsiTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUXRfTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwaXhtYXApIC0+IChJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaCkiKX0sCi0JeyJNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCIsIChQeUNGdW5jdGlvbilRdF9NYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGVmZmVjdFR5cGUpIC0+IChJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaCkiKX0sCi0JeyJRVEdldFBpeGVsU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeGVsU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIFBpeGVsRm9ybWF0KSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIFBpeGVsRm9ybWF0KSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAobG9uZyBfcnYpIil9LAotCXsiUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyIsIChQeUNGdW5jdGlvbilRdF9RVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIGxvbmcgcm93Qnl0ZXMpIC0+IE5vbmUiKX0sCi0JeyJRVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChGaXhlZCBfcnYpIil9LAotCXsiUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtLCBGaXhlZCBnYW1tYUxldmVsKSAtPiBOb25lIil9LAotCXsiUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IlFUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9RVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSwgRml4ZWQgcmVxdWVzdGVkR2FtbWFMZXZlbCkgLT4gTm9uZSIpfSwKLQl7IkNvbXBBZGQiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcEFkZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBzcmMsIHdpZGUgZHN0KSIpfSwKLQl7IkNvbXBTdWIiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcFN1YiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBzcmMsIHdpZGUgZHN0KSIpfSwKLQl7IkNvbXBOZWciLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE5lZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBkc3QpIil9LAotCXsiQ29tcFNoaWZ0IiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBTaGlmdCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgc2hpZnQpIC0+ICh3aWRlIHNyYykiKX0sCi0JeyJDb21wTXVsIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBNdWwsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgc3JjMSwgbG9uZyBzcmMyKSAtPiAod2lkZSBkc3QpIil9LAotCXsiQ29tcERpdiIsIChQeUNGdW5jdGlvbilRdF9Db21wRGl2LCAxLAotCSBQeURvY19TVFIoIihsb25nIGRlbm9taW5hdG9yKSAtPiAobG9uZyBfcnYsIHdpZGUgbnVtZXJhdG9yLCBsb25nIHJlbWFpbmRlcikiKX0sCi0JeyJDb21wRml4TXVsIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBGaXhNdWwsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIGZpeFNyYykgLT4gKHdpZGUgY29tcFNyYywgd2lkZSBjb21wRHN0KSIpfSwKLQl7IkNvbXBNdWxEaXYiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE11bERpdiwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtdWwsIGxvbmcgZGl2aXNvcikgLT4gKHdpZGUgY28pIil9LAotCXsiQ29tcE11bERpdlRydW5jIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBNdWxEaXZUcnVuYywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtdWwsIGxvbmcgZGl2aXNvcikgLT4gKHdpZGUgY28sIGxvbmcgcmVtYWluZGVyKSIpfSwKLQl7IkNvbXBDb21wYXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBDb21wYXJlLCAxLAotCSBQeURvY19TVFIoIih3aWRlIGEsIHdpZGUgbWludXNiKSAtPiAobG9uZyBfcnYpIil9LAotCXsiQ29tcFNxdWFyZVJvb3QiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcFNxdWFyZVJvb3QsIDEsCi0JIFB5RG9jX1NUUigiKHdpZGUgc3JjKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAotCXsiRml4TXVsRGl2IiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpeE11bERpdiwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgc3JjLCBGaXhlZCBtdWwsIEZpeGVkIGRpdmlzb3IpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiVW5zaWduZWRGaXhNdWxEaXYiLCAoUHlDRnVuY3Rpb24pUXRfVW5zaWduZWRGaXhNdWxEaXYsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHNyYywgRml4ZWQgbXVsLCBGaXhlZCBkaXZpc29yKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IkZpeEV4cDIiLCAoUHlDRnVuY3Rpb24pUXRfRml4RXhwMiwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgc3JjKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IkZpeExvZzIiLCAoUHlDRnVuY3Rpb24pUXRfRml4TG9nMiwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgc3JjKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IkZpeFBvdyIsIChQeUNGdW5jdGlvbilRdF9GaXhQb3csIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIGJhc2UsIEZpeGVkIGV4cCkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlVHlwZSkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldERhdGFGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREYXRhRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFGaWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaCkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFJlYWREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0UmVhZERhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogZGF0YVB0ciwgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRDbGlwLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIGNsaXBSZ24pIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0U291cmNlUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIFJlY3Qgc291cmNlUmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHNvdXJjZVJlY3QpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IG5hdHVyYWxCb3VuZHMpIil9LAotCXsiR3JhcGhpY3NJbXBvcnREcmF3IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0RHJhdywgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBSZWN0IGJvdW5kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0Qm91bmRzUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIGZzcywgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBncmFwaGljc01vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZ3JhcGhpY3NNb2RlLCBSR0JDb2xvciBvcENvbG9yKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldFF1YWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBDb2RlY1EgcXVhbGl0eSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb2RlY1EgcXVhbGl0eSkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyBmc3MsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEFsaWFzZWREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0VmFsaWRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB2YWxpZCkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldE1ldGFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogdXNlckRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydERvZXNEcmF3QWxsUGl4ZWxzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGRyYXdzQWxsUGl4ZWxzKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpY0hhbmRsZSBwaWN0dXJlKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZUNyZWF0b3IsIEZTU3BlYyBmc3MsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEV4cG9ydEltYWdlVHlwZUxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RXhwb3J0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBpbWFnZUNvdW50KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXgsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIGltYWdlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBpbWFnZUluZGV4KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIHdpZGUgc2l6ZSkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHdpZGUgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgd2lkZSBvZmZzZXQsIHdpZGUgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgd2lkZSBsaW1pdCkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIGRlZmF1bHRSZ24pIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRlZmF1bHRHcmFwaGljc01vZGUsIFJHQkNvbG9yIGRlZmF1bHRPcENvbG9yKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdFNvdXJjZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGRlZmF1bHRTb3VyY2VSZWN0KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldENvbG9yU3luY1Byb2ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHByb2ZpbGUpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERlc3RSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmVjdCBkZXN0UmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERlc3RSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGVzdFJlY3QpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3MpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRCYXNlRGF0YU9mZnNldEFuZFNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCB3aWRlIHNpemUpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydERvRXhwb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9FeHBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBhY3R1YWxTaXplV3JpdHRlbikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhblRyYW5zY29kZSkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRDYW5Vc2VDb21wcmVzc29yLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBjYW5Vc2VDb21wcmVzc29yKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBvdXREZXNjKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVUeXBlQW5kQ3JlYXRvciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvcikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZU5hbWVFeHRlbnNpb24pIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0aGVUZXh0KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZG9udFJlY29tcHJlc3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGRvbnRSZWNvbXByZXNzKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGludGVybGFjZVN0eWxlKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRNZXRhRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiB1c2VyRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE1ldGFEYXRhLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHVzZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyB0YXJnZXREYXRhU2l6ZSkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIGNvbXByZXNzaW9uTWV0aG9kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBjb21wcmVzc2lvbk1ldGhvZCkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIENvZGVjUSBzcGF0aWFsUXVhbGl0eSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0UmVzb2x1dGlvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGaXhlZCBob3Jpem9udGFsUmVzb2x1dGlvbiwgRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRSZXNvbHV0aW9uLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uLCBGaXhlZCB2ZXJ0aWNhbFJlc29sdXRpb24pIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXREZXB0aCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldERlcHRoLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgbG9uZyBkZXB0aCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXREZXB0aCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERlcHRoLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGVwdGgpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0Q29sb3JTeW5jUHJvZmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBjb2xvclN5bmNQcm9maWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRDb2xvclN5bmNQcm9maWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBjb2xvclN5bmNQcm9maWxlKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGgsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBoKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0ciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIFB0ciBwLCB1bnNpZ25lZCBsb25nIHNpemUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgUGljSGFuZGxlIHBpY3R1cmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpY0hhbmRsZSBwaWN0dXJlKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEdXb3JsZFB0ciBnd29ybGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBHV29ybGRQdHIgZ3dvcmxkKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIFBpeE1hcEhhbmRsZSBwaXhtYXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaXhNYXBIYW5kbGUgcGl4bWFwKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0T2Zmc2V0QW5kTGltaXQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIG1heVJlYWRJbnB1dERhdGEpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHNpemUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBkYXRhUHRyLCB1bnNpZ25lZCBsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURpbWVuc2lvbnMsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkaW1lbnNpb25zKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5wdXREZXB0aCkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBDR3JhZlB0ciBndywgR0RIYW5kbGUgZ2QsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RGF0YVJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaCkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSwgQm9vbGVhbiB0cnVuY2F0ZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSwgQm9vbGVhbiB0cnVuY2F0ZUZpbGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZUNyZWF0b3IpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0TWFyaywgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgbWFyaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyaywgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG1hcmspIil9LAotCXsiR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRUaHVtYm5haWxFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlVGh1bWJuYWlsLCBsb25nIG1heFRodW1ibmFpbFdpZHRoLCBsb25nIG1heFRodW1ibmFpbEhlaWdodCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0VGh1bWJuYWlsRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHRodW1ibmFpbEVuYWJsZWQsIGxvbmcgbWF4VGh1bWJuYWlsV2lkdGgsIGxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0RXhpZkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRFeGlmRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlRXhpZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZXhpZkVuYWJsZWQpIil9LAotCXsiSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZSIsIChQeUNGdW5jdGlvbilRdF9JbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlLCAxLAotCSBQeURvY19TVFIoIihJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIHNyY0Rlc2MsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkc3REZXNjKSIpfSwKLQl7IkltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0ltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhLCAxLAotCSBQeURvY19TVFIoIihJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjLCB2b2lkICogZHN0RGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkNsb2NrR2V0VGltZSIsIChQeUNGdW5jdGlvbilRdF9DbG9ja0dldFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFDbG9jaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVSZWNvcmQgb3V0KSIpfSwKLQl7IkNsb2NrU2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvY2tTZXRUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrLCBUaW1lQmFzZSB0YikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiQ2xvY2tHZXRSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0Nsb2NrR2V0UmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgcmF0ZSkiKX0sCi0JeyJTQ1Bvc2l0aW9uUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TQ1Bvc2l0aW9uUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHJwLCBQb2ludCB3aGVyZSkiKX0sCi0JeyJTQ1Bvc2l0aW9uRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDUG9zaXRpb25EaWFsb2csIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCBpZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBvaW50IHdoZXJlKSIpfSwKLQl7IlNDU2V0VGVzdEltYWdlUGljdEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9TQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaWNIYW5kbGUgdGVzdFBpY3QsIHNob3J0IHRlc3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdGVzdFJlY3QpIil9LAotCXsiU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9TQ1NldFRlc3RJbWFnZVBpY3RGaWxlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgdGVzdEZpbGVSZWYsIHNob3J0IHRlc3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdGVzdFJlY3QpIil9LAotCXsiU0NTZXRUZXN0SW1hZ2VQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUXRfU0NTZXRUZXN0SW1hZ2VQaXhNYXAsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgdGVzdFBpeE1hcCwgc2hvcnQgdGVzdEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCB0ZXN0UmVjdCkiKX0sCi0JeyJTQ0dldEJlc3REZXZpY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NDR2V0QmVzdERldmljZVJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKLQl7IlNDUmVxdWVzdEltYWdlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDQ29tcHJlc3NJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzSW1hZ2UsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIEhhbmRsZSBkYXRhKSIpfSwKLQl7IlNDQ29tcHJlc3NQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NQaWN0dXJlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGljSGFuZGxlIHNyY1BpY3R1cmUsIFBpY0hhbmRsZSBkc3RQaWN0dXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTQ0NvbXByZXNzUGljdHVyZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1BpY3R1cmVGaWxlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgc3JjUmVmTnVtLCBzaG9ydCBkc3RSZWZOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSIpfSwKLQl7IlNDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGEsIGxvbmcgZGF0YVNpemUsIHNob3J0IG5vdFN5bmNGbGFnKSIpfSwKLQl7IlNDQ29tcHJlc3NTZXF1ZW5jZUVuZCIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzU2VxdWVuY2VFbmQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGljSGFuZGxlIHNyY1BpY3R1cmUsIHNob3J0IG1vdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NEZWZhdWx0UGljdEZpbGVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgc3JjUmVmLCBzaG9ydCBtb3Rpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDRGVmYXVsdFBpeE1hcFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDRGVmYXVsdFBpeE1hcFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgc2hvcnQgbW90aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTQ0dldEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRJbmZvLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NTZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIE9TVHlwZSBpbmZvVHlwZSwgdm9pZCAqIGluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDU2V0Q29tcHJlc3NGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TQ1NldENvbXByZXNzRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTQ0dldENvbXByZXNzRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRDb21wcmVzc0ZsYWdzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3MpIil9LAotCXsiU0NHZXRTZXR0aW5nc0FzVGV4dCIsIChQeUNGdW5jdGlvbilRdF9TQ0dldFNldHRpbmdzQXNUZXh0LCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0ZXh0KSIpfSwKLQl7IlNDQXN5bmNJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQXN5bmNJZGxlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHdlZW5lclJlc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X1R3ZWVuZXJSZXNldCwgMSwKLQkgUHlEb2NfU1RSKCIoVHdlZW5lckNvbXBvbmVudCB0YykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVENHZXRTb3VyY2VSZWYiLCAoUHlDRnVuY3Rpb24pUXRfVENHZXRTb3VyY2VSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RIKSAtPiAoSGFuZGxlckVycm9yIF9ydiwgVXNlckRhdGEgc3JlZkgpIil9LAotCXsiVENTZXRTb3VyY2VSZWYiLCAoUHlDRnVuY3Rpb24pUXRfVENTZXRTb3VyY2VSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RILCBVc2VyRGF0YSBzcmVmSCkgLT4gKEhhbmRsZXJFcnJvciBfcnYpIil9LAotCXsiVENTZXRUaW1lQ29kZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RDU2V0VGltZUNvZGVGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gKEhhbmRsZXJFcnJvciBfcnYpIil9LAotCXsiVENHZXRUaW1lQ29kZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RDR2V0VGltZUNvZGVGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoSGFuZGxlckVycm9yIF9ydiwgbG9uZyBmbGFncykiKX0sCi0JeyJNb3ZpZUltcG9ydEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhSCwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKLQl7Ik1vdmllSW1wb3J0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0U2FtcGxlRHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIFRpbWVWYWx1ZSBkdXJhdGlvbiwgVGltZVNjYWxlIHNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgbWVkaWFUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldE1lZGlhRmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldE1lZGlhRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEFsaWFzSGFuZGxlIGFsaWFzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXREaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgRml4ZWQgd2lkdGgsIEZpeGVkIGhlaWdodCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTW92aWVJbXBvcnRTZXRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRDaHVua1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGNodW5rU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhLCBPU1R5cGUgaGFuZGxlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBCb29sZWFuIGZyb21TY3JhcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTW92aWVJbXBvcnREb1VzZXJEaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnREb1VzZXJEaWFsb2csIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgSGFuZGxlIHRoZURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhbmNlbGVkKSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0RHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXREdXJhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldEF1eGlsaWFyeURhdGFUeXBlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBhdXhUeXBlKSIpfSwKLQl7Ik1vdmllSW1wb3J0VmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRWYWxpZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBIYW5kbGUgdGhlRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdmFsaWQpIil9LAotCXsiTW92aWVJbXBvcnRHZXRGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldEZpbGVUeXBlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSkiKX0sCi0JeyJNb3ZpZUltcG9ydERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKLQl7Ik1vdmllSW1wb3J0R2V0U2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgbWVkaWFUeXBlKSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0LCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgd2lkZSBvZmZzZXQsIHdpZGUgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0SWRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydElkbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG91dEZsYWdzKSIpfSwKLQl7Ik1vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQ4IHZhbGlkKSIpfSwKLQl7Ik1vdmllSW1wb3J0R2V0TG9hZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0TG9hZFN0YXRlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW1wb3J0ZXJMb2FkU3RhdGUpIil9LAotCXsiTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgdGltZSkiKX0sCi0JeyJNb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVSZWNvcmQgdGltZSkiKX0sCi0JeyJNb3ZpZUltcG9ydFNldERvbnRCbG9jayIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldERvbnRCbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZG9udEJsb2NrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydEdldERvbnRCbG9jayIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldERvbnRCbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdpbGxCbG9jaykiKX0sCi0JeyJNb3ZpZUltcG9ydFNldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0TmV3TW92aWVGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgbmV3TW92aWVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBtZWRpYVR5cGUpIil9LAotCXsiTW92aWVFeHBvcnRUb0hhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFRvSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFILCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUV4cG9ydFRvRmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFRvRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRBdXhpbGlhcnlEYXRhLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFIKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGhhbmRsZVR5cGUpIil9LAotCXsiTW92aWVFeHBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIG1lZGlhVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTW92aWVFeHBvcnREb1VzZXJEaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnREb1VzZXJEaWFsb2csIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBjYW5jZWxlZCkiKX0sCi0JeyJNb3ZpZUV4cG9ydEdldENyZWF0b3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGNyZWF0b3IpIil9LAotCXsiTW92aWVFeHBvcnRUb0RhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRUb0RhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUV4cG9ydFZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0VmFsaWRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdmFsaWQpIil9LAotCXsiTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBleHRlbnNpb24pIil9LAotCXsiTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0U2hvcnRGaWxlVHlwZVN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIFN0cjI1NSB0eXBlU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgbWVkaWFUeXBlKSIpfSwKLQl7IlRleHRFeHBvcnRHZXRUaW1lRnJhY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbW92aWVUaW1lRnJhY3Rpb24pIil9LAotCXsiVGV4dEV4cG9ydFNldFRpbWVGcmFjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIG1vdmllVGltZUZyYWN0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUZXh0RXhwb3J0R2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dEV4cG9ydEdldFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzZXR0aW5nKSIpfSwKLQl7IlRleHRFeHBvcnRTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0U2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgc2V0dGluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUlESUltcG9ydEdldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01JRElJbXBvcnRHZXRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2V0dGluZykiKX0sCi0JeyJNSURJSW1wb3J0U2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTUlESUltcG9ydFNldFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIHNldHRpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNJbWFnZU1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlbmFibGUpIil9LAotCXsiUHJldmlld1Nob3dEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdTaG93RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwLCBPU1R5cGUgZGF0YVR5cGUsIEhhbmRsZSBkYXRhLCBSZWN0IGluSGVyZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwLCBGU1NwZWMgc291cmNlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBwcmV2aWV3VHlwZSwgc2hvcnQgcmVzSUQpIil9LAotCXsiUHJldmlld0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRXZlbnRSZWNvcmQgZSwgQm9vbGVhbiBoYW5kbGVkRXZlbnQpIil9LAotCXsiRGF0YUNvZGVjRGVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNEZWNvbXByZXNzLCAxLAotCSBQeURvY19TVFIoIihEYXRhQ29kZWNDb21wb25lbnQgZGMsIHZvaWQgKiBzcmNEYXRhLCBVSW50MzIgc3JjU2l6ZSwgdm9pZCAqIGRzdERhdGEsIFVJbnQzMiBkc3RCdWZmZXJTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjR2V0Q29tcHJlc3NCdWZmZXJTaXplLCAxLAotCSBQeURvY19TVFIoIihEYXRhQ29kZWNDb21wb25lbnQgZGMsIFVJbnQzMiBzcmNTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGRzdFNpemUpIil9LAotCXsiRGF0YUNvZGVjQ29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjQ29tcHJlc3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgdm9pZCAqIHNyY0RhdGEsIFVJbnQzMiBzcmNTaXplLCB2b2lkICogZHN0RGF0YSwgVUludDMyIGRzdEJ1ZmZlclNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgYWN0dWFsRHN0U2l6ZSwgVUludDMyIGRlY29tcHJlc3NTbG9wKSIpfSwKLQl7IkRhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgdW5zaWduZWQgbG9uZyBtYXhTcmNTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhQ29kZWNFbmRJbnRlcnJ1cHRTYWZlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0VuZEludGVycnVwdFNhZmUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhHZXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBoLCBsb25nIGhPZmZzZXQsIGxvbmcgb2Zmc2V0LCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIUHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFB1dERhdGEsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgaCwgbG9uZyBoT2Zmc2V0LCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG9mZnNldCkiKX0sCi0JeyJEYXRhSEZsdXNoRGF0YSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEZsdXNoRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIT3BlbkZvcldyaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIT3BlbkZvcldyaXRlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhDbG9zZUZvcldyaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ2xvc2VGb3JXcml0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIT3BlbkZvclJlYWQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhPcGVuRm9yUmVhZCwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIQ2xvc2VGb3JSZWFkIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ2xvc2VGb3JSZWFkLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhTZXREYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmKSIpfSwKLQl7IkRhdGFIQ29tcGFyZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDb21wYXJlRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlcXVhbCkiKX0sCi0JeyJEYXRhSFRhc2siLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhUYXNrLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhGaW5pc2hEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRmluaXNoRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFB0ciBQbGFjZVRvUHV0RGF0YVB0ciwgQm9vbGVhbiBDYW5jZWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIRmx1c2hDYWNoZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEZsdXNoQ2FjaGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFJlc29sdmVEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUmVzb2x2ZURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgdGhlRGF0YVJlZiwgQm9vbGVhbiB1c2VySW50ZXJmYWNlQWxsb3dlZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCi0JeyJEYXRhSEdldEZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmaWxlU2l6ZSkiKX0sCi0JeyJEYXRhSENhblVzZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDYW5Vc2VEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHVzZUZsYWdzKSIpfSwKLQl7IkRhdGFIUHJlZXh0ZW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUHJlZXh0ZW5kLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgdW5zaWduZWQgbG9uZyBtYXhUb0FkZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc3BhY2VBZGRlZCkiKX0sCi0JeyJEYXRhSFNldEZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RmlsZVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZpbGVTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldEZyZWVTcGFjZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZyZWVTcGFjZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGZyZWVTaXplKSIpfSwKLQl7IkRhdGFIQ3JlYXRlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENyZWF0ZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgY3JlYXRvciwgQm9vbGVhbiBkZWxldGVFeGlzdGluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBibG9ja1NpemUpIil9LAotCXsiRGF0YUhHZXREZXZpY2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERldmljZUluZGV4LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGV2aWNlSW5kZXgpIil9LAotCXsiRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHllcykiKX0sCi0JeyJEYXRhSEdldERhdGFJbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFJbkJ1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgc3RhcnRPZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNpemUpIil9LAotCXsiRGF0YUhHZXRTY2hlZHVsZUFoZWFkVGltZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlsbGlzZWNzKSIpfSwKLQl7IkRhdGFIU2V0Q2FjaGVTaXplTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRDYWNoZVNpemVMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFNpemUgY2FjaGVTaXplTGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0Q2FjaGVTaXplTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRDYWNoZVNpemVMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTaXplIGNhY2hlU2l6ZUxpbWl0KSIpfSwKLQl7IkRhdGFIR2V0TW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIil9LAotCXsiRGF0YUhBZGRNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEFkZE1vdmllLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgTW92aWUgdGhlTW92aWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpZCkiKX0sCi0JeyJEYXRhSFVwZGF0ZU1vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIVXBkYXRlTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIRG9lc0J1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSERvZXNCdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBidWZmZXJzUmVhZHMsIEJvb2xlYW4gYnVmZmVyc1dyaXRlcykiKX0sCi0JeyJEYXRhSEdldEZpbGVOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZU5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmaWxlU2l6ZSkiKX0sCi0JeyJEYXRhSEdldE1hY09TRmlsZVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNYWNPU0ZpbGVUeXBlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSkiKX0sCi0JeyJEYXRhSEdldE1JTUVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0TUlNRVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBTdHIyNTUgbWltZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIU2V0RGF0YVJlZldpdGhBbmNob3IiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBhbmNob3JEYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgYW5jaG9yRGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYpIil9LAotCXsiRGF0YUhTZXRNYWNPU0ZpbGVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0TWFjT1NGaWxlVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSBmaWxlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhTZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldFRpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgVGltZUJhc2UgdGIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0SW5mb0ZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0SW5mb0ZsYWdzLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBmbGFncykiKX0sCi0JeyJEYXRhSEdldEZpbGVTaXplNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlU2l6ZTY0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZmlsZVNpemUpIil9LAotCXsiRGF0YUhQcmVleHRlbmQ2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFByZWV4dGVuZDY0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBtYXhUb0FkZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgc3BhY2VBZGRlZCkiKX0sCi0JeyJEYXRhSFNldEZpbGVTaXplNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRGaWxlU2l6ZTY0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBmaWxlU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhHZXRGcmVlU3BhY2U2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZyZWVTcGFjZTY0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZnJlZVNpemUpIil9LAotCXsiRGF0YUhBcHBlbmQ2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEFwcGVuZDY0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgdm9pZCAqIGRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZmlsZU9mZnNldCkiKX0sCi0JeyJEYXRhSFBvbGxSZWFkIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUG9sbFJlYWQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB2b2lkICogZGF0YVB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBkYXRhU2l6ZVNvRmFyKSIpfSwKLQl7IkRhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFBdmFpbGFiaWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIG9mZnNldCwgbG9uZyBsZW4pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1pc3Npbmdfb2Zmc2V0LCBsb25nIG1pc3NpbmdfbGVuKSIpfSwKLQl7IkRhdGFIR2V0RGF0YVJlZkFzVHlwZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSZWZBc1R5cGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgcmVxdWVzdGVkVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmKSIpfSwKLQl7IkRhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldERhdGFSZWZFeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgZXh0ZW5zaW9uLCBPU1R5cGUgaWRUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldERhdGFSZWZFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIGlkVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBleHRlbnNpb24pIil9LAotCXsiRGF0YUhHZXRNb3ZpZVdpdGhGbGFncyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldE1vdmllV2l0aEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgc2hvcnQgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIil9LAotCXsiRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZVR5cGVPcmRlcmluZywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBEYXRhSEZpbGVUeXBlT3JkZXJpbmdIYW5kbGUgb3JkZXJpbmdMaXN0SGFuZGxlKSIpfSwKLQl7IkRhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENyZWF0ZUZpbGVXaXRoRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgY3JlYXRvciwgQm9vbGVhbiBkZWxldGVFeGlzdGluZywgVUludDMyIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRJbmZvLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIHdoYXQsIHZvaWQgKiBpbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFNldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0SWRsZU1hbmFnZXIsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhEZWxldGVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRGVsZXRlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIU2V0TW92aWVVc2FnZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0TW92aWVVc2FnZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhVc2VUZW1wb3JhcnlEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0VGVtcG9yYXJ5RGF0YVJlZkNhcGFiaWxpdGllcywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG91dFVuZGVyc3Rvb2RGbGFncykiKX0sCi0JeyJEYXRhSFJlbmFtZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhSZW5hbWVGaWxlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIG5ld0RhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIUGxheWJhY2tIaW50cyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFBsYXliYWNrSGludHMsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIG1pbkZpbGVPZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4RmlsZU9mZnNldCwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhQbGF5YmFja0hpbnRzNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQbGF5YmFja0hpbnRzNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCB3aWRlIG1pbkZpbGVPZmZzZXQsIHdpZGUgbWF4RmlsZU9mZnNldCwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhHZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSYXRlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIil9LAotCXsiRGF0YUhTZXRUaW1lSGludHMiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRUaW1lSGludHMsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCBsb25nIGJhbmR3aWR0aFByaW9yaXR5LCBUaW1lU2NhbGUgc2NhbGUsIFRpbWVWYWx1ZSBtaW5UaW1lLCBUaW1lVmFsdWUgbWF4VGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRNYXhTcmNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWF4U3JjUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0U3RkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBtYXhTcmNSZWN0KSIpfSwKLQl7IlZER2V0QWN0aXZlU3JjUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WREdldEFjdGl2ZVNyY1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0ZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYWN0aXZlU3JjUmVjdCkiKX0sCi0JeyJWRFNldERpZ2l0aXplclJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXREaWdpdGl6ZXJSZWN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGlnaXRpemVyUmVjdCkiKX0sCi0JeyJWREdldERpZ2l0aXplclJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXREaWdpdGl6ZXJSZWN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGlnaXRpemVyUmVjdCkiKX0sCi0JeyJWREdldFZCbGFua1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRWQmxhbmtSZWN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgaW5wdXRTdGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHZCbGFua1JlY3QpIil9LAotCXsiVkRHZXRNYXNrUGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWFza1BpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFBpeE1hcEhhbmRsZSBtYXNrUGl4TWFwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFVzZVRoaXNDTFVUIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEVXNlVGhpc0NMVVQsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBDVGFiSGFuZGxlIGNvbG9yVGFibGVIYW5kbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0SW5wdXRHYW1tYVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXRHYW1tYVZhbHVlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgRml4ZWQgY2hhbm5lbDEsIEZpeGVkIGNoYW5uZWwyLCBGaXhlZCBjaGFubmVsMykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRJbnB1dEdhbW1hVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dEdhbW1hVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgY2hhbm5lbDEsIEZpeGVkIGNoYW5uZWwyLCBGaXhlZCBjaGFubmVsMykiKX0sCi0JeyJWRFNldEJyaWdodG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRCcmlnaHRuZXNzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3MpIil9LAotCXsiVkRHZXRCcmlnaHRuZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0QnJpZ2h0bmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzKSIpfSwKLQl7IlZEU2V0Q29udHJhc3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDb250cmFzdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBjb250cmFzdCkiKX0sCi0JeyJWRFNldEh1ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEh1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBodWUpIil9LAotCXsiVkRTZXRTaGFycG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRTaGFycG5lc3MsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzKSIpfSwKLQl7IlZEU2V0U2F0dXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9WRFNldFNhdHVyYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbikiKX0sCi0JeyJWREdldENvbnRyYXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q29udHJhc3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgY29udHJhc3QpIil9LAotCXsiVkRHZXRIdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRIdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgaHVlKSIpfSwKLQl7IlZER2V0U2hhcnBuZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U2hhcnBuZXNzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzcykiKX0sCi0JeyJWREdldFNhdHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRTYXR1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb24pIil9LAotCXsiVkRHcmFiT25lRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHcmFiT25lRnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldE1heEF1eEJ1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9WREdldE1heEF1eEJ1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaXhNYXBIYW5kbGUgcG0sIFJlY3QgcikiKX0sCi0JeyJWREdldEN1cnJlbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9WREdldEN1cnJlbnRGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGlucHV0Q3VycmVudEZsYWcsIGxvbmcgb3V0cHV0Q3VycmVudEZsYWcpIil9LAotCXsiVkRTZXRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WRFNldEtleUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WREdldEtleUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5kZXgpIil9LAotCXsiVkRBZGRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WREFkZEtleUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5kZXgpIil9LAotCXsiVkRHZXROZXh0S2V5Q29sb3IiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXROZXh0S2V5Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldEtleUNvbG9yUmFuZ2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRLZXlDb2xvclJhbmdlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIG1pblJHQiwgUkdCQ29sb3IgbWF4UkdCKSIpfSwKLQl7IlZER2V0S2V5Q29sb3JSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEtleUNvbG9yUmFuZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgbWluUkdCLCBSR0JDb2xvciBtYXhSR0IpIil9LAotCXsiVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGNvbG9yU3BhY2VNb2RlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldElucHV0Q29sb3JTcGFjZU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGNvbG9yU3BhY2VNb2RlKSIpfSwKLQl7IlZEU2V0Q2xpcFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q2xpcFN0YXRlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgY2xpcEVuYWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRDbGlwU3RhdGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDbGlwU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgY2xpcEVuYWJsZSkiKX0sCi0JeyJWRFNldENsaXBSZ24iLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDbGlwUmduLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZWdpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEQ2xlYXJDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEQ2xlYXJDbGlwUmduLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZWdpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0Q0xVVEluVXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q0xVVEluVXNlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZSkiKX0sCi0JeyJWRFNldFBMTEZpbHRlclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRQTExGaWx0ZXJUeXBlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgcGxsVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRQTExGaWx0ZXJUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0UExMRmlsdGVyVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBwbGxUeXBlKSIpfSwKLQl7IlZER2V0TWFza2FuZFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWFza2FuZFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWFzaywgbG9uZyB2YWx1ZSkiKX0sCi0JeyJWRFNldE1hc3RlckJsZW5kTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRNYXN0ZXJCbGVuZExldmVsLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsZW5kTGV2ZWwpIil9LAotCXsiVkRTZXRQbGF5VGhydU9uT2ZmIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UGxheVRocnVPbk9mZiwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IHN0YXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldEZpZWxkUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEZpZWxkUHJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGZpZWxkRmxhZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRGaWVsZFByZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRGaWVsZFByZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZmllbGRGbGFnKSIpfSwKLQl7IlZEUHJlZmxpZ2h0R2xvYmFsUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WRFByZWZsaWdodEdsb2JhbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBHcmFmUHRyIHRoZVdpbmRvdykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZ2xvYmFsUmVjdCkiKX0sCi0JeyJWRFNldFBsYXlUaHJ1R2xvYmFsUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WRFNldFBsYXlUaHJ1R2xvYmFsUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEdyYWZQdHIgdGhlV2luZG93KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBnbG9iYWxSZWN0KSIpfSwKLQl7IlZEU2V0QmxhY2tMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0QmxhY2tMZXZlbFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWwpIil9LAotCXsiVkRHZXRCbGFja0xldmVsVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRCbGFja0xldmVsVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbCkiKX0sCi0JeyJWRFNldFdoaXRlTGV2ZWxWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFdoaXRlTGV2ZWxWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsKSIpfSwKLQl7IlZER2V0V2hpdGVMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0V2hpdGVMZXZlbFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWwpIil9LAotCXsiVkRHZXRWaWRlb0RlZmF1bHRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0VmlkZW9EZWZhdWx0cywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsLCB1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsLCB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzLCB1bnNpZ25lZCBzaG9ydCBodWUsIHVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb24sIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0LCB1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3MpIil9LAotCXsiVkRHZXROdW1iZXJPZklucHV0cyIsIChQeUNGdW5jdGlvbilRdF9WREdldE51bWJlck9mSW5wdXRzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGlucHV0cykiKX0sCi0JeyJWREdldElucHV0Rm9ybWF0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXRGb3JtYXQsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGZvcm1hdCkiKX0sCi0JeyJWRFNldElucHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXQsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGlucHV0KSIpfSwKLQl7IlZEU2V0SW5wdXRTdGFuZGFyZCIsIChQeUNGdW5jdGlvbilRdF9WRFNldElucHV0U3RhbmRhcmQsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0YW5kYXJkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldHVwQnVmZmVycyIsIChQeUNGdW5jdGlvbilRdF9WRFNldHVwQnVmZmVycywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFZkaWdCdWZmZXJSZWNMaXN0SGFuZGxlIGJ1ZmZlckxpc3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER3JhYk9uZUZyYW1lQXN5bmMiLCAoUHlDRnVuY3Rpb24pUXRfVkRHcmFiT25lRnJhbWVBc3luYywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGJ1ZmZlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkREb25lIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZERG9uZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGJ1ZmZlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRTZXRDb21wcmVzc2lvbiIsIChQeUNGdW5jdGlvbilRdF9WRFNldENvbXByZXNzaW9uLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgT1NUeXBlIGNvbXByZXNzVHlwZSwgc2hvcnQgZGVwdGgsIENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgbG9uZyBrZXlGcmFtZVJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCi0JeyJWRENvbXByZXNzT25lRnJhbWVBc3luYyIsIChQeUNGdW5jdGlvbilRdF9WRENvbXByZXNzT25lRnJhbWVBc3luYywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0SW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9WREdldEltYWdlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEUmVzZXRDb21wcmVzc1NlcXVlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEUmVzZXRDb21wcmVzc1NlcXVlbmNlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRTZXRDb21wcmVzc2lvbk9uT2ZmIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q29tcHJlc3Npb25Pbk9mZiwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEJvb2xlYW4gc3RhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0Q29tcHJlc3Npb25UeXBlcyIsIChQeUNGdW5jdGlvbilRdF9WREdldENvbXByZXNzaW9uVHlwZXMsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBWRENvbXByZXNzaW9uTGlzdEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0VGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBUaW1lQmFzZSB0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldEZyYW1lUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEZyYW1lUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEZpeGVkIGZyYW1lc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldERhdGFSYXRlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlsbGlTZWNQZXJGcmFtZSwgRml4ZWQgZnJhbWVzUGVyU2Vjb25kLCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKLQl7IlZER2V0U291bmRJbnB1dERyaXZlciIsIChQeUNGdW5jdGlvbilRdF9WREdldFNvdW5kSW5wdXREcml2ZXIsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBTdHIyNTUgc291bmREcml2ZXJOYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldERNQURlcHRocyIsIChQeUNGdW5jdGlvbilRdF9WREdldERNQURlcHRocywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRlcHRoQXJyYXksIGxvbmcgcHJlZmVycmVkRGVwdGgpIil9LAotCXsiVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVNjYWxlIHByZWZlcnJlZCkiKX0sCi0JeyJWRFJlbGVhc2VBc3luY0J1ZmZlcnMiLCAoUHlDRnVuY3Rpb24pUXRfVkRSZWxlYXNlQXN5bmNCdWZmZXJzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRTZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldERhdGFSYXRlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRUaW1lQ29kZSIsIChQeUNGdW5jdGlvbilRdF9WREdldFRpbWVDb2RlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgdm9pZCAqIHRpbWVDb2RlRm9ybWF0LCB2b2lkICogdGltZUNvZGVUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVJlY29yZCBhdFRpbWUpIil9LAotCXsiVkRVc2VTYWZlQnVmZmVycyIsIChQeUNGdW5jdGlvbilRdF9WRFVzZVNhZmVCdWZmZXJzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQm9vbGVhbiB1c2VTYWZlQnVmZmVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRTb3VuZElucHV0U291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U291bmRJbnB1dFNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgdmlkZW9JbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc291bmRJbnB1dCkiKX0sCi0JeyJWREdldENvbXByZXNzaW9uVGltZSIsIChQeUNGdW5jdGlvbilRdF9WREdldENvbXByZXNzaW9uVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIE9TVHlwZSBjb21wcmVzc2lvblR5cGUsIHNob3J0IGRlcHRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBzcmNSZWN0LCBDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lKSIpfSwKLQl7IlZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFByZWZlcnJlZFBhY2tldFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9WRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9WREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHdpZHRoLCBsb25nIGhlaWdodCkiKX0sCi0JeyJWREdldElucHV0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgdmlkZW9JbnB1dCwgU3RyMjU1IG5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0RGVzdGluYXRpb25Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RGVzdGluYXRpb25Qb3J0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQ0dyYWZQdHIgZGVzdFBvcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0RGV2aWNlTmFtZUFuZEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RGV2aWNlTmFtZUFuZEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgU3RyMjU1IG91dE5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgb3V0TmFtZUZsYWdzKSIpfSwKLQl7IlZEQ2FwdHVyZVN0YXRlQ2hhbmdpbmciLCAoUHlDRnVuY3Rpb24pUXRfVkRDYXB0dXJlU3RhdGVDaGFuZ2luZywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFVJbnQzMiBpblN0YXRlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBTdHJpbmdQdHIgZXJyRGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZXJyb3JMaW5lKSIpfSwKLQl7IlhNTFBhcnNlQWRkRWxlbWVudCIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEVsZW1lbnQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBuYW1lU3BhY2VJRCwgbG9uZyBlbGVtZW50RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIGVsZW1lbnROYW1lLCBVSW50MzIgZWxlbWVudElEKSIpfSwKLQl7IlhNTFBhcnNlQWRkQXR0cmlidXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkQXR0cmlidXRlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElELCBVSW50MzIgbmFtZVNwYWNlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIGF0dHJpYnV0ZU5hbWUsIFVJbnQzMiBhdHRyaWJ1dGVJRCkiKX0sCi0JeyJYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIGVsZW1lbnRJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBuYW1lU3BhY2VJRHMsIGNoYXIgYXR0cmlidXRlTmFtZXMsIFVJbnQzMiBhdHRyaWJ1dGVJRHMpIil9LAotCXsiWE1MUGFyc2VBZGRBdHRyaWJ1dGVBbmRWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElELCBVSW50MzIgbmFtZVNwYWNlSUQsIFVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQsIHZvaWQgKiBhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBhdHRyaWJ1dGVOYW1lLCBVSW50MzIgYXR0cmlidXRlSUQpIil9LAotCXsiWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBlbGVtZW50SUQsIFVJbnQzMiBhdHRyaWJ1dGVJRCwgVUludDMyIGF0dHJpYnV0ZVZhbHVlS2luZCwgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlhNTFBhcnNlQWRkTmFtZVNwYWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkTmFtZVNwYWNlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBuYW1lU3BhY2VVUkwsIFVJbnQzMiBuYW1lU3BhY2VJRCkiKX0sCi0JeyJYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBvZmZzZXQsIFVJbnQzMiBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgbG9uZyByZWZjb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHSW5pdGlhbGl6ZSIsIChQeUNGdW5jdGlvbilRdF9TR0luaXRpYWxpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXREYXRhT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RGF0YU91dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBGU1NwZWMgbW92aWVGaWxlLCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RGF0YU91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFPdXRwdXQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgRlNTcGVjIG1vdmllRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgd2hlcmVGbGFncykiKX0sCi0JeyJTR1NldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9TR1NldEdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBDR3JhZlB0ciBncCwgR0RIYW5kbGUgZ2QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDR3JhZlB0ciBncCwgR0RIYW5kbGUgZ2QpIil9LAotCXsiU0dOZXdDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHTmV3Q2hhbm5lbCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBPU1R5cGUgY2hhbm5lbFR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR0NoYW5uZWwgcmVmKSIpfSwKLQl7IlNHRGlzcG9zZUNoYW5uZWwiLCAoUHlDRnVuY3Rpb24pUXRfU0dEaXNwb3NlQ2hhbm5lbCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTdGFydFByZXZpZXciLCAoUHlDRnVuY3Rpb24pUXRfU0dTdGFydFByZXZpZXcsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTdGFydFJlY29yZCIsIChQeUNGdW5jdGlvbilRdF9TR1N0YXJ0UmVjb3JkLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHSWRsZSIsIChQeUNGdW5jdGlvbilRdF9TR0lkbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTdG9wIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU3RvcCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1BhdXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGF1c2UsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgQm9vbGVhbiBwYXVzZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dQcmVwYXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUHJlcGFyZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBCb29sZWFuIHByZXBhcmVGb3JQcmV2aWV3LCBCb29sZWFuIHByZXBhcmVGb3JSZWNvcmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUmVsZWFzZSIsIChQeUNGdW5jdGlvbilRdF9TR1JlbGVhc2UsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldE1vdmllLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiU0dTZXRNYXhpbXVtUmVjb3JkVGltZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldE1heGltdW1SZWNvcmRUaW1lLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIHVuc2lnbmVkIGxvbmcgdGlja3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0TWF4aW11bVJlY29yZFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRNYXhpbXVtUmVjb3JkVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyB0aWNrcykiKX0sCi0JeyJTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBieXRlcykiKX0sCi0JeyJTR0dldFRpbWVSZW1haW5pbmciLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRUaW1lUmVtYWluaW5nLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHRpY2tzTGVmdCkiKX0sCi0JeyJTR0dyYWJQaWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR3JhYlBpY3QsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgUmVjdCBib3VuZHMsIHNob3J0IG9mZnNjcmVlbkRlcHRoLCBsb25nIGdyYWJQaWN0RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaWNIYW5kbGUgcCkiKX0sCi0JeyJTR0dldExhc3RNb3ZpZVJlc0lEIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TGFzdE1vdmllUmVzSUQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHJlc0lEKSIpfSwKLQl7IlNHU2V0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBsb25nIHNnRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzZ0ZsYWdzKSIpfSwKLQl7IlNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBDb21wb25lbnQgc2dDaGFubmVsQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dDaGFubmVsIG5ld0NoYW5uZWwpIil9LAotCXsiU0dTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFVzZXJEYXRhIHVkLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVzZXJEYXRhIHVkKSIpfSwKLQl7IlNHR2V0SW5kQ2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR0dldEluZENoYW5uZWwsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgc2hvcnQgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR0NoYW5uZWwgcmVmLCBPU1R5cGUgY2hhblR5cGUpIil9LAotCXsiU0dVcGRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dVcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRQYXVzZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFBhdXNlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHBhdXNlZCkiKX0sCi0JeyJTR1NldENoYW5uZWxTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgVXNlckRhdGEgdWQsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0Q2hhbm5lbFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVXNlckRhdGEgdWQpIil9LAotCXsiU0dHZXRNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBwcmV2aWV3TW9kZSwgQm9vbGVhbiByZWNvcmRNb2RlKSIpfSwKLQl7IlNHU2V0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9TR1NldERhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyB3aGVyZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIHdoZXJlRmxhZ3MpIil9LAotCXsiU0dOZXdPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dOZXdPdXRwdXQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyB3aGVyZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dPdXRwdXQgc2dPdXQpIil9LAotCXsiU0dEaXNwb3NlT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHRGlzcG9zZU91dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRPdXRwdXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldE91dHB1dEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0Q2hhbm5lbE91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxPdXRwdXQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmciLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBzcGFjZSkiKX0sCi0JeyJTR0hhbmRsZVVwZGF0ZUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSGFuZGxlVXBkYXRlRXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgRXZlbnRSZWNvcmQgZXZlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGhhbmRsZWQpIil9LAotCXsiU0dTZXRPdXRwdXROZXh0T3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0T3V0cHV0TmV4dE91dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgU0dPdXRwdXQgbmV4dE91dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRPdXRwdXROZXh0T3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0T3V0cHV0TmV4dE91dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHT3V0cHV0IG5leHRPdXQpIil9LAotCXsiU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0T3V0cHV0TWF4aW11bU9mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgd2lkZSBtYXhPZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0T3V0cHV0TWF4aW11bU9mZnNldCIsIChQeUNGdW5jdGlvbilRdF9TR0dldE91dHB1dE1heGltdW1PZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG1heE9mZnNldCkiKX0sCi0JeyJTR0dldE91dHB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCi0JeyJTR1dyaXRlRXh0ZW5kZWRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBQdHIgcCwgbG9uZyBsZW4pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgU0dPdXRwdXQgc2dPdXQpIil9LAotCXsiU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NCIsIChQeUNGdW5jdGlvbilRdF9TR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIGJ5dGVzKSIpfSwKLQl7IlNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBzcGFjZSkiKX0sCi0JeyJTR1dyaXRlTW92aWVEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHV3JpdGVNb3ZpZURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb2Zmc2V0KSIpfSwKLQl7IlNHR2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZUJhc2UgdGIpIil9LAotCXsiU0dBZGRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRNb3ZpZURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbiwgbG9uZyBjaFJlZkNvbiwgVGltZVZhbHVlIHRpbWUsIHNob3J0IHdyaXRlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb2Zmc2V0KSIpfSwKLQl7IlNHQ2hhbmdlZFNvdXJjZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5nZWRTb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRFeHRlbmRlZE1vdmllRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgUHRyIHAsIGxvbmcgbGVuLCBsb25nIGNoUmVmQ29uLCBUaW1lVmFsdWUgdGltZSwgc2hvcnQgd3JpdGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIFNHT3V0cHV0IHdoaWNoT3V0cHV0KSIpfSwKLQl7IlNHQWRkT3V0cHV0RGF0YVJlZlRvTWVkaWEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgTWVkaWEgdGhlTWVkaWEsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0U2V0dGluZ3NTdW1tYXJ5IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U2V0dGluZ3NTdW1tYXJ5LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEhhbmRsZSBzdW1tYXJ5VGV4dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRDaGFubmVsVXNhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsVXNhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHVzYWdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxVc2FnZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxVc2FnZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHVzYWdlKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbEJvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBSZWN0IGJvdW5kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDaGFubmVsQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCi0JeyJTR1NldENoYW5uZWxWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgdm9sdW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHZvbHVtZSkiKX0sCi0JeyJTR0dldENoYW5uZWxJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBjaGFubmVsSW5mbykiKX0sCi0JeyJTR1NldENoYW5uZWxQbGF5RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsUGxheUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBwbGF5RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0Q2hhbm5lbFBsYXlGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxQbGF5RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBwbGF5RmxhZ3MpIil9LAotCXsiU0dTZXRDaGFubmVsTWF4RnJhbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbE1heEZyYW1lcywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgZnJhbWVDb3VudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDaGFubmVsTWF4RnJhbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbE1heEZyYW1lcywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZyYW1lQ291bnQpIil9LAotCXsiU0dTZXRDaGFubmVsUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgcmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldENoYW5uZWxDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBSZ25IYW5kbGUgdGhlQ2xpcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDaGFubmVsQ2xpcCIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxDbGlwLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSB0aGVDbGlwKSIpfSwKLQl7IlNHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIHNhbXBsZURlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0Q2hhbm5lbERldmljZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDaGFubmVsVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lU2NhbGUgc2NhbGUpIil9LAotCXsiU0dDaGFubmVsUHV0UGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxQdXRQaWN0dXJlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKLQl7IlNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IG5hbWUsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cjI1NSBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIil9LAotCXsiU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIHNldHRpbmdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0NoYW5uZWxHZXRDb2RlY1NldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHNldHRpbmdzKSIpfSwKLQl7IlNHR2V0Q2hhbm5lbFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFRpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVCYXNlIHRiKSIpfSwKLQl7IlNHR2V0Q2hhbm5lbFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxSZWZDb24sIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyByZWZDb24pIil9LAotCXsiU0dHZXRDaGFubmVsRGV2aWNlQW5kSW5wdXROYW1lcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IG91dERldmljZU5hbWUsIFN0cjI1NSBvdXRJbnB1dE5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBvdXRJbnB1dE51bWJlcikiKX0sCi0JeyJTR1NldENoYW5uZWxEZXZpY2VJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxEZXZpY2VJbnB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGluSW5wdXROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBVSW50MzIgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dJbml0Q2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR0luaXRDaGFubmVsLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU2VxR3JhYkNvbXBvbmVudCBvd25lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dXcml0ZVNhbXBsZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dXcml0ZVNhbXBsZXMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBNb3ZpZSBtLCBBbGlhc0hhbmRsZSB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBieXRlc1BlclNlY29uZCkiKX0sCi0JeyJTR0FsaWduQ2hhbm5lbFJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dBbGlnbkNoYW5uZWxSZWN0LCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcikiKX0sCi0JeyJTR1BhbmVsR2V0RGl0bCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsR2V0RGl0bCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRpdGwpIil9LAotCXsiU0dQYW5lbEdldFRpdGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXRUaXRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTdHIyNTUgdGl0bGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxDYW5SdW4iLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbENhblJ1biwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dQYW5lbEluc3RhbGwiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEluc3RhbGwsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1BhbmVsRXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEV2ZW50LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBEaWFsb2dQdHIgZCwgc2hvcnQgaXRlbU9mZnNldCwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpdGVtSGl0LCBCb29sZWFuIGhhbmRsZWQpIil9LAotCXsiU0dQYW5lbEl0ZW0iLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0LCBzaG9ydCBpdGVtTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1BhbmVsUmVtb3ZlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxSZW1vdmUsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1BhbmVsU2V0R3JhYmJlciIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsU2V0R3JhYmJlciwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTZXFHcmFiQ29tcG9uZW50IHNnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1BhbmVsU2V0UmVzRmlsZSIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsU2V0UmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBzaG9ydCByZXNSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxHZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsR2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVc2VyRGF0YSB1ZCkiKX0sCi0JeyJTR1BhbmVsU2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFNldFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBVc2VyRGF0YSB1ZCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dQYW5lbFZhbGlkYXRlSW5wdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFZhbGlkYXRlSW5wdXQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gb2spIil9LAotCXsiU0dQYW5lbEdldERJVExGb3JTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXRESVRMRm9yU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRpdGwsIFBvaW50IHJlcXVlc3RlZFNpemUpIil9LAotCXsiU0dHZXRTcmNWaWRlb0JvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNyY1ZpZGVvQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcikiKX0sCi0JeyJTR1NldFZpZGVvUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFJlY3QgcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRWaWRlb1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKLQl7IlNHR2V0VmlkZW9Db21wcmVzc29yVHlwZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFZpZGVvQ29tcHJlc3NvclR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGNvbXByZXNzb3JUeXBlKSIpfSwKLQl7IlNHU2V0VmlkZW9Db21wcmVzc29yVHlwZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvQ29tcHJlc3NvclR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBPU1R5cGUgY29tcHJlc3NvclR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0VmlkZW9Db21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VmlkZW9Db21wcmVzc29yLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgZGVwdGgsIENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvciwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCBsb25nIGtleUZyYW1lUmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRWaWRlb0NvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb0NvbXByZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZGVwdGgsIENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvciwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCBsb25nIGtleUZyYW1lUmF0ZSkiKX0sCi0JeyJTR0dldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgX3J2KSIpfSwKLQl7IlNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIENvbXBvbmVudEluc3RhbmNlIHZkaWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHcmFiRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHcmFiRnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBidWZmZXJOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR3JhYkZyYW1lQ29tcGxldGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHcmFiRnJhbWVDb21wbGV0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZG9uZSkiKX0sCi0JeyJTR0NvbXByZXNzRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDb21wcmVzc0ZyYW1lLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgYnVmZmVyTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldENvbXByZXNzQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q29tcHJlc3NCdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBkZXB0aCwgUmVjdCBjb21wcmVzc1NpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0Q29tcHJlc3NCdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDb21wcmVzc0J1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBkZXB0aCwgUmVjdCBjb21wcmVzc1NpemUpIil9LAotCXsiU0dHZXRCdWZmZXJJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0QnVmZmVySW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpeE1hcEhhbmRsZSBidWZmZXJQTSwgUmVjdCBidWZmZXJSZWN0LCBHV29ybGRQdHIgY29tcHJlc3NCdWZmZXIsIFJlY3QgY29tcHJlc3NCdWZmZXJSZWN0KSIpfSwKLQl7IlNHU2V0VXNlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VXNlU2NyZWVuQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgQm9vbGVhbiB1c2VTY3JlZW5CdWZmZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0VXNlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VXNlU2NyZWVuQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdXNlU2NyZWVuQnVmZmVyKSIpfSwKLQl7IlNHU2V0RnJhbWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RnJhbWVSYXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgRml4ZWQgZnJhbWVSYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldEZyYW1lUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldEZyYW1lUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBGaXhlZCBmcmFtZVJhdGUpIil9LAotCXsiU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0UHJlZmVycmVkUGFja2V0U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0UHJlZmVycmVkUGFja2V0U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFByZWZlcnJlZFBhY2tldFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykiKX0sCi0JeyJTR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBIYW5kbGUgY29tcHJlc3NvclR5cGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGNvbXByZXNzb3JUeXBlcykiKX0sCi0JeyJTR1NldFNvdW5kSW5wdXREcml2ZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTb3VuZElucHV0RHJpdmVyLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IGRyaXZlck5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0U291bmRJbnB1dERyaXZlciIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXREcml2ZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU0dTb3VuZElucHV0RHJpdmVyQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9TR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBzZWNvbmRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRSZWNvcmRDaHVua1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU0dTZXRTb3VuZElucHV0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kSW5wdXRSYXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRTb3VuZElucHV0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXRSYXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBzYW1wbGVTaXplLCBzaG9ydCBudW1DaGFubmVscywgT1NUeXBlIGNvbXByZXNzaW9uVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHNhbXBsZVNpemUsIHNob3J0IG51bUNoYW5uZWxzLCBPU1R5cGUgY29tcHJlc3Npb25UeXBlKSIpfSwKLQl7IlNHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEhhbmRsZSByYXRlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSByYXRlcykiKX0sCi0JeyJTR1NldEZvbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Rm9udE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHJpbmdQdHIgcHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRGb250U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldEZvbnRTaXplLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgZm9udFNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0VGV4dEZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRdF9TR1NldFRleHRGb3JlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgdGhlQ29sb3IpIil9LAotCXsiU0dTZXRUZXh0QmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VGV4dEJhY2tDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciB0aGVDb2xvcikiKX0sCi0JeyJTR1NldEp1c3RpZmljYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRKdXN0aWZpY2F0aW9uLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQganVzdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCByZXR0b3NwYWNlKSIpfSwKLQl7IlNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCByZXR0b3NwYWNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgU3RyMjU1IHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIFN0cjI1NSBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRCZWdpbiIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0QmVnaW4sIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRFbmQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEVuZCwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRTZXREaXNwbGF5TW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgbG9uZyBkaXNwbGF5TW9kZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkaXNwbGF5TW9kZUlEKSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdXb3JsZFB0ciBndykiKX0sCi0JeyJRVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50IG91dHB1dENvbXBvbmVudCkiKX0sCi0JeyJRVFZpZGVvT3V0cHV0R2V0Q2xvY2siLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldENsb2NrLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50SW5zdGFuY2UgY2xvY2spIil9LAotCXsiUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgQ0dyYWZQdHIgZWNob1BvcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0SW5kSW1hZ2VEZWNvbXByZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnQgY29kZWMpIil9LAotCXsiUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0QmFzZVNldEVjaG9Qb3J0LCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBDR3JhZlB0ciBlY2hvUG9ydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRDaHVua01hbmFnZW1lbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFVJbnQzMiBmbGFncywgVUludDMyIGZsYWdzTWFzaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRDaHVua01hbmFnZW1lbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgZmxhZ3MpIil9LAotCXsiTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNpemUgYWxsb3dhbmNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNpemUgYWxsb3dhbmNlKSIpfSwKLQl7Ik1lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUlkbGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFJZGxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSwgbG9uZyBmbGFnc0luLCBUaW1lUmVjb3JkIG1vdmllVGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3NPdXQpIil9LAotCXsiTWVkaWFHZXRNZWRpYUluZm8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRNZWRpYUluZm8sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhUHV0TWVkaWFJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHV0TWVkaWFJbmZvLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldEFjdGl2ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEFjdGl2ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGVuYWJsZU1lZGlhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldFJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRSYXRlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR0dldFN0YXR1cyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdHZXRTdGF0dXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudFJlc3VsdCBzdGF0dXNFcnIpIil9LAotCXsiTWVkaWFUcmFja0VkaXRlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRyYWNrRWRpdGVkLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0TWVkaWFUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lU2NhbGUgbmV3VGltZVNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0TW92aWVUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVNjYWxlIG5ld1RpbWVTY2FsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ0dyYWZQdHIgYVBvcnQsIEdESGFuZGxlIGFHRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXREaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0RGltZW5zaW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRDbGlwLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSB0aGVDbGlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldFRyYWNrT3BhcXVlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0VHJhY2tPcGFxdWUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdHJhY2tJc09wYXF1ZSkiKX0sCi0JeyJNZWRpYVNldEdyYXBoaWNzTW9kZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEdyYXBoaWNzTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIG1vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0R3JhcGhpY3NNb2RlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIil9LAotCXsiTWVkaWFHU2V0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR1NldFZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCB2b2x1bWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0U291bmRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRCYWxhbmNlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGJhbGFuY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0U291bmRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRCYWxhbmNlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBiYWxhbmNlKSIpfSwKLQl7Ik1lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSB3aGVuKSIpfSwKLQl7Ik1lZGlhR2V0U3JjUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U3JjUmduLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSByZ24sIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFQcmVyb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHJlcm9sbCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUhhc0NoYXJhY3RlcmlzdGljLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIE9TVHlwZSBjaGFyYWN0ZXJpc3RpYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaGFzSXQpIil9LAotCXsiTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBkZXB0aCwgQ1RhYkhhbmRsZSBjdGFiKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBib3VuZHMpIil9LAotCXsiTWVkaWFTZXRIaW50cyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEhpbnRzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgaGludHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU3RyMjU1IG5hbWUsIGxvbmcgcmVxdWVzdGVkTGFuZ3VhZ2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGFjdHVhbExhbmd1YWdlKSIpfSwKLQl7Ik1lZGlhRm9yY2VVcGRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFGb3JjZVVwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZvcmNlVXBkYXRlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0RHJhd2luZ1JnbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldERyYXdpbmdSZ24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSBwYXJ0aWFsUmduKSIpfSwKLQl7Ik1lZGlhR1NldEFjdGl2ZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHU2V0QWN0aXZlU2VnbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgYWN0aXZlU3RhcnQsIFRpbWVWYWx1ZSBhY3RpdmVEdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFJbnZhbGlkYXRlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSW52YWxpZGF0ZVJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBSZ25IYW5kbGUgaW52YWxSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0TmV4dFN0ZXBUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TmV4dFN0ZXBUaW1lLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGZsYWdzLCBUaW1lVmFsdWUgbWVkaWFUaW1lSW4sIEZpeGVkIHJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbWVkaWFUaW1lT3V0KSIpfSwKLQl7Ik1lZGlhQ2hhbmdlZE5vblByaW1hcnlTb3VyY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGlucHV0SW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBzYW1wbGVOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0VmlkZW9QYXJhbSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFZpZGVvUGFyYW0sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyB3aGljaFBhcmFtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgdmFsdWUpIil9LAotCXsiTWVkaWFHZXRWaWRlb1BhcmFtIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0VmlkZW9QYXJhbSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHdoaWNoUGFyYW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkiKX0sCi0JeyJNZWRpYUNvbXBhcmUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFDb21wYXJlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIE1lZGlhIHNyY01lZGlhLCBDb21wb25lbnRJbnN0YW5jZSBzcmNNZWRpYUNvbXBvbmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaXNPSykiKX0sCi0JeyJNZWRpYUdldENsb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0Q2xvY2ssIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudEluc3RhbmNlIGNsb2NrKSIpfSwKLQl7Ik1lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldFNvdW5kT3V0cHV0Q29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQpIil9LAotCXsiTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0SW52YWxpZFJlZ2lvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEludmFsaWRSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUmduSGFuZGxlIHJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkIyTiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbk4yQiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFGbHVzaE5vblByaW1hcnlTb3VyY2VEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGlucHV0SW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0VVJMTGluayIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFVSTExpbmssIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUG9pbnQgZGlzcGxheVdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHVybExpbmspIil9LAotCXsiTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSGl0VGVzdEZvclRhcmdldFJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHRhcmdldFJlZkNvbikiKX0sCi0JeyJNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFIaXRUZXN0VGFyZ2V0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgdGFyZ2V0UmVmQ29uLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdhc0hpdCkiKX0sCi0JeyJNZWRpYURpc3Bvc2VUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgdGFyZ2V0UmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVRhcmdldFJlZkNvbnNFcXVhbCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRhcmdldFJlZkNvbnNFcXVhbCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZpcnN0UmVmQ29uLCBsb25nIHNlY29uZFJlZkNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZXF1YWwpIil9LAotCXsiTWVkaWFQcmVQcmVyb2xsQ2FuY2VsIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHJlUHJlcm9sbENhbmNlbCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogcmVmY29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUVudGVyRW1wdHlFZGl0IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRW50ZXJFbXB0eUVkaXQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWxsaVNlY3MpIil9LAotCXsiTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHZvbHVtZSkiKX0sCi0JeyJNZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGVuYWJsZWQpIil9LAotCXsiTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGVuYWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGJhbGFuY2UpIil9LAotCXsiTWVkaWFTZXRTY3JlZW5Mb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U2NyZWVuTG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGxvY2tJdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRFcnJvclN0cmluZyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEVycm9yU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvbXBvbmVudFJlc3VsdCB0aGVFcnJvciwgU3RyMjU1IGVycm9yU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDggYmFuZExldmVscykiKX0sCi0JeyJNZWRpYURvSWRsZUFjdGlvbnMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFEb0lkbGVBY3Rpb25zLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGJhc3MsIHNob3J0IHRyZWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGJhc3MsIHNob3J0IHRyZWJsZSkiKX0sCi0JeyJNZWRpYVRpbWVCYXNlQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRpbWVCYXNlQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYU1DSXNQbGF5ZXJFdmVudCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYU1DSXNQbGF5ZXJFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBFdmVudFJlY29yZCBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBoYW5kbGVkSXQpIil9LAotCXsiTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE1lZGlhTG9hZFN0YXRlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1lZGlhTG9hZFN0YXRlKSIpfSwKLQl7Ik1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvbXBvbmVudEluc3RhbmNlIHZvdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhRW1wdHlTYW1wbGVDYWNoZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUVtcHR5U2FtcGxlQ2FjaGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBzYW1wbGVOdW0sIGxvbmcgc2FtcGxlQ291bnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0UHVibGljSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFB1YmxpY0luZm8sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgT1NUeXBlIGluZm9TZWxlY3Rvciwgdm9pZCAqIGluZm9EYXRhUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2l6ZSBpb0RhdGFTaXplKSIpfSwKLQl7Ik1lZGlhU2V0UHVibGljSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFB1YmxpY0luZm8sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgT1NUeXBlIGluZm9TZWxlY3Rvciwgdm9pZCAqIGluZm9EYXRhUHRyLCBTaXplIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVJlZkNvblNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUmVmQ29uU2V0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb24sIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFSZWZDb25HZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVJlZkNvbkdldFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uLCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhTmF2aWdhdGVUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIG5hdmlnYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHJlZkNvbikiKX0sCi0JeyJNZWRpYUdHZXRJZGxlTWFuYWdlciIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdHZXRJZGxlTWFuYWdlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSWRsZU1hbmFnZXIgcGltKSIpfSwKLQl7Ik1lZGlhR1NldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR1NldElkbGVNYW5hZ2VyLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVE1JRElHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfUVRNSURJR2V0TUlESVBvcnRzLCAxLAotCSBQeURvY19TVFIoIihRVE1JRElDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzLCBRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0cykiKX0sCi0JeyJRVE1JRElVc2VTZW5kUG9ydCIsIChQeUNGdW5jdGlvbilRdF9RVE1JRElVc2VTZW5kUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoUVRNSURJQ29tcG9uZW50IGNpLCBsb25nIHBvcnRJbmRleCwgbG9uZyBpblVzZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRNSURJU2VuZE1JREkiLCAoUHlDRnVuY3Rpb24pUXRfUVRNSURJU2VuZE1JREksIDEsCi0JIFB5RG9jX1NUUigiKFFUTUlESUNvbXBvbmVudCBjaSwgbG9uZyBwb3J0SW5kZXgsIE11c2ljTUlESVBhY2tldCBtcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRQYXJ0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydCwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlkaUNoYW5uZWwsIGxvbmcgcG9seXBob255KSIpfSwKLQl7Ik11c2ljU2V0UGFydCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnQsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgbWlkaUNoYW5uZWwsIGxvbmcgcG9seXBob255KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgaW5zdHJ1bWVudE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRQYXJ0SW5zdHJ1bWVudE51bWJlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRJbnN0cnVtZW50TnVtYmVyLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1N0b3JlUGFydEluc3RydW1lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTdG9yZVBhcnRJbnN0cnVtZW50LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGluc3RydW1lbnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEF0b21pY0luc3RydW1lbnQgYWkpIil9LAotCXsiTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBBdG9taWNJbnN0cnVtZW50UHRyIGFpUCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRQYXJ0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRLbm9iLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGtub2JJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNTZXRQYXJ0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRLbm9iLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGtub2JJRCwgbG9uZyBrbm9iVmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEtub2IsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGtub2JJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNTZXRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0S25vYiwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYklELCBsb25nIGtub2JWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRQYXJ0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnROYW1lLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNTZXRQYXJ0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnROYW1lLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNQbGF5Tm90ZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1BsYXlOb3RlLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIHBpdGNoLCBsb25nIHZlbG9jaXR5KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1Jlc2V0UGFydCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1Jlc2V0UGFydCwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNTZXRQYXJ0Q29udHJvbGxlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRDb250cm9sbGVyLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBNdXNpY0NvbnRyb2xsZXIgY29udHJvbGxlck51bWJlciwgbG9uZyBjb250cm9sbGVyVmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0UGFydENvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0Q29udHJvbGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgTXVzaWNDb250cm9sbGVyIGNvbnRyb2xsZXJOdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0SW5zdHJ1bWVudE5hbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0SW5zdHJ1bWVudE5hbWVzLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtb2RpZmlhYmxlSW5zdHJ1bWVudHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzLCBIYW5kbGUgaW5zdHJ1bWVudENhdGVnb3J5TGFzdHMsIEhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lcykiKX0sCi0JeyJNdXNpY0dldERydW1OYW1lcyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldERydW1OYW1lcywgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGluc3RydW1lbnROdW1iZXJzLCBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzKSIpfSwKLQl7Ik11c2ljR2V0TWFzdGVyVHVuZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldE1hc3RlclR1bmUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldE1hc3RlclR1bmUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRNYXN0ZXJUdW5lLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtYXN0ZXJUdW5lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldERldmljZUNvbm5lY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaWQxLCBsb25nIGlkMikiKX0sCi0JeyJNdXNpY1VzZURldmljZUNvbm5lY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBpZDEsIGxvbmcgaWQyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldEtub2JTZXR0aW5nU3RyaW5ncyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEtub2JTZXR0aW5nU3RyaW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYkluZGV4LCBsb25nIGlzR2xvYmFsKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHNldHRpbmdzTmFtZXMsIEhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TGFzdHMsIEhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TmFtZXMpIil9LAotCXsiTXVzaWNHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRNSURJUG9ydHMsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbnB1dFBvcnRDb3VudCwgbG9uZyBvdXRwdXRQb3J0Q291bnQpIil9LAotCXsiTXVzaWNTZW5kTUlESSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NlbmRNSURJLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwb3J0SW5kZXgsIE11c2ljTUlESVBhY2tldCBtcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNTZXRPZmZsaW5lVGltZVRvIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0T2ZmbGluZVRpbWVUbywgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbmV3VGltZVN0YW1wKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldEluZm9UZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0SW5mb1RleHQsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHNlbGVjdG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHRleHRILCBIYW5kbGUgc3R5bGVIKSIpfSwKLQl7Ik11c2ljR2V0SW5zdHJ1bWVudEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRJbnN0cnVtZW50SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgZ2V0SW5zdHJ1bWVudEluZm9GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEluc3RydW1lbnRJbmZvTGlzdEhhbmRsZSBpbmZvTGlzdEgpIil9LAotCXsiTXVzaWNUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljVGFzaywgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGluc3RydW1lbnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBIYW5kbGUgZGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZW5lcmljQ29uZmlndXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2VuZXJpY0NvbmZpZ3VyZSwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbW9kZSwgbG9uZyBmbGFncywgbG9uZyBiYXNlUmVzSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2VuZXJpY0dldEtub2JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2VuZXJpY0dldEtub2JMaXN0LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBrbm9iVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdlbmVyaWNLbm9iRGVzY3JpcHRpb25MaXN0SGFuZGxlIGdrZGxIKSIpfSwKLQl7Ik11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dlbmVyaWNTZXRSZXNvdXJjZU51bWJlcnMsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBIYW5kbGUgcmVzb3VyY2VJREgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljRGVyaXZlZE1JRElTZW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljRGVyaXZlZE1JRElTZW5kLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgTXVzaWNNSURJUGFja2V0IHBhY2tldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgc2hvcnQgcmVzUmVmTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJOQVVucmVnaXN0ZXJNdXNpY0RldmljZSIsIChQeUNGdW5jdGlvbilRdF9OQVVucmVnaXN0ZXJNdXNpY0RldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X05BU2F2ZU11c2ljQ29uZmlndXJhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTkFHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfTkFHZXRNSURJUG9ydHMsIDEsCi0JIFB5RG9jX1NUUigiKE5vdGVBbGxvY2F0b3IgbmEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzLCBRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0cykiKX0sCi0JeyJOQVRhc2siLCAoUHlDRnVuY3Rpb24pUXRfTkFUYXNrLCAxLAotCSBQeURvY19TVFIoIihOb3RlQWxsb2NhdG9yIG5hKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUdW5lU2V0SGVhZGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRIZWFkZXIsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgKiBoZWFkZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVHZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lR2V0VGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lQmFzZSB0YikiKX0sCi0JeyJUdW5lU2V0VGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIFRpbWVTY2FsZSBzY2FsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZUdldFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lR2V0VGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVNjYWxlIHNjYWxlKSIpfSwKLQl7IlR1bmVJbnN0YW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVJbnN0YW50LCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHR1bmVQb3NpdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgdHVuZSkiKX0sCi0JeyJUdW5lU3RvcCIsIChQeUNGdW5jdGlvbilRdF9UdW5lU3RvcCwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgbG9uZyBzdG9wRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVTZXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgRml4ZWQgdm9sdW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUdW5lR2V0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVQcmVyb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVQcmVyb2xsLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUdW5lVW5yb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVVbnJvbGwsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVTZXRQYXJ0VHJhbnNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRQYXJ0VHJhbnNwb3NlLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnQsIGxvbmcgdHJhbnNwb3NlLCBsb25nIHZlbG9jaXR5U2hpZnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVHZXROb3RlQWxsb2NhdG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXROb3RlQWxsb2NhdG9yLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoTm90ZUFsbG9jYXRvciBfcnYpIil9LAotCXsiVHVuZVNldFNvZnRlciIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0U29mdGVyLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBsb25nIHNvZnRlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVRhc2siLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVRhc2ssIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVTZXRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRCYWxhbmNlLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBsb25nIGJhbGFuY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVTZXRTb3VuZExvY2FsaXphdGlvbiIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0U291bmRMb2NhbGl6YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIEhhbmRsZSBkYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUdW5lU2V0SGVhZGVyV2l0aFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldEhlYWRlcldpdGhTaXplLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nICogaGVhZGVyLCB1bnNpZ25lZCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVTZXRQYXJ0TWl4IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRQYXJ0TWl4LCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXIsIGxvbmcgdm9sdW1lLCBsb25nIGJhbGFuY2UsIGxvbmcgbWl4RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVHZXRQYXJ0TWl4IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRQYXJ0TWl4LCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHZvbHVtZU91dCwgbG9uZyBiYWxhbmNlT3V0LCBsb25nIG1peEZsYWdzT3V0KSIpfSwKLQl7IkFsaWduV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVF0X0FsaWduV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd3AsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCi0JeyJEcmFnQWxpZ25lZFdpbmRvdyIsIChQeUNGdW5jdGlvbilRdF9EcmFnQWxpZ25lZFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdwLCBQb2ludCBzdGFydFB0LCBSZWN0IGJvdW5kc1JlY3QpIC0+IE5vbmUiKX0sCi0JeyJNb3ZpZXNUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllc1Rhc2ssIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbWF4TWlsbGlTZWNUb1VzZSkgLT4gTm9uZSIpfSwKKyAgICB7IkVudGVyTW92aWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X0VudGVyTW92aWVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJFeGl0TW92aWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X0V4aXRNb3ZpZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllc0Vycm9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldE1vdmllc0Vycm9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDbGVhck1vdmllc1N0aWNreUVycm9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0NsZWFyTW92aWVzU3RpY2t5RXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllc1N0aWNreUVycm9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldE1vdmllc1N0aWNreUVycm9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJRVEdldFdhbGxDbG9ja1RpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0V2FsbENsb2NrVGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVCYXNlIHdhbGxDbG9ja1RpbWVCYXNlKSIpfSwKKyAgICB7IlFUSWRsZU1hbmFnZXJPcGVuIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUSWRsZU1hbmFnZXJPcGVuLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChJZGxlTWFuYWdlciBfcnYpIil9LAorICAgIHsiQ3JlYXRlTW92aWVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKVF0X0NyZWF0ZU1vdmllQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHRoZVdpbmRvdywgTW92aWUgdGhlTW92aWUsIFVJbnQzMiBvcHRpb25zKSAtPiAoUmVjdCBsb2NhbFJlY3QsIENvbnRyb2xIYW5kbGUgcmV0dXJuZWRDb250cm9sKSIpfSwKKyAgICB7IkRpc3Bvc2VNYXR0ZSIsIChQeUNGdW5jdGlvbilRdF9EaXNwb3NlTWF0dGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSB0aGVNYXR0ZSkgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld01vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZsYWdzKSAtPiAoTW92aWUgX3J2KSIpfSwKKyAgICB7IlFUR2V0VGltZVVudGlsTmV4dFRhc2siLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRUaW1lVW50aWxOZXh0VGFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBzY2FsZSkgLT4gKGxvbmcgZHVyYXRpb24pIil9LAorICAgIHsiR2V0RGF0YUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pUXRfR2V0RGF0YUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YUhhbmRsZXJTdWJUeXBlLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJQYXN0ZUhhbmRsZUludG9Nb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9QYXN0ZUhhbmRsZUludG9Nb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgsIE9TVHlwZSBoYW5kbGVUeXBlLCBNb3ZpZSB0aGVNb3ZpZSwgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZUltcG9ydGVyRm9yRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9HZXRNb3ZpZUltcG9ydGVyRm9yRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGRhdGFSZWZUeXBlLCBIYW5kbGUgZGF0YVJlZiwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudCBpbXBvcnRlcikiKX0sCisgICAgeyJRVEdldE1JTUVUeXBlSW5mbyIsIChQeUNGdW5jdGlvbilRdF9RVEdldE1JTUVUeXBlSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoY2hhciogbWltZVN0cmluZ1N0YXJ0LCBzaG9ydCBtaW1lU3RyaW5nTGVuZ3RoLCBPU1R5cGUgaW5mb1NlbGVjdG9yLCB2b2lkICogaW5mb0RhdGFQdHIpIC0+IChsb25nIGluZm9EYXRhU2l6ZSkiKX0sCisgICAgeyJUcmFja1RpbWVUb01lZGlhVGltZSIsIChQeUNGdW5jdGlvbilRdF9UcmFja1RpbWVUb01lZGlhVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHZhbHVlLCBUcmFjayB0aGVUcmFjaykgLT4gKFRpbWVWYWx1ZSBfcnYpIil9LAorICAgIHsiTmV3VXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTmV3VXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIHRoZVVzZXJEYXRhKSIpfSwKKyAgICB7Ik5ld1VzZXJEYXRhRnJvbUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9OZXdVc2VyRGF0YUZyb21IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiAoVXNlckRhdGEgdGhlVXNlckRhdGEpIil9LAorICAgIHsiQ3JlYXRlTW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NyZWF0ZU1vdmllRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGZpbGVTcGVjLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3MpIC0+IChzaG9ydCByZXNSZWZOdW0sIE1vdmllIG5ld21vdmllKSIpfSwKKyAgICB7Ik9wZW5Nb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfT3Blbk1vdmllRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGZpbGVTcGVjLCBTSW50OCBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgcmVzUmVmTnVtKSIpfSwKKyAgICB7IkNsb3NlTW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0Nsb3NlTW92aWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZXNSZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJEZWxldGVNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfRGVsZXRlTW92aWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMpIC0+IE5vbmUiKX0sCisgICAgeyJOZXdNb3ZpZUZyb21GaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgc2hvcnQgcmVzSWQsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgcmVzSWQsIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQpIil9LAorICAgIHsiTmV3TW92aWVGcm9tSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCisgICAgeyJOZXdNb3ZpZUZyb21EYXRhRm9yayIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21EYXRhRm9yaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZlJlZk51bSwgbG9uZyBmaWxlT2Zmc2V0LCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQpIil9LAorICAgIHsiTmV3TW92aWVGcm9tRGF0YUZvcms2NCIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21EYXRhRm9yazY0LCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZSZWZOdW0sIHdpZGUgZmlsZU9mZnNldCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKKyAgICB7Ik5ld01vdmllRnJvbURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZmxhZ3MsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZHRhUmVmVHlwZSkgLT4gKE1vdmllIG0sIHNob3J0IGlkKSIpfSwKKyAgICB7Ik5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tU3RvcmFnZU9mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIHdpZGUgZmlsZU9mZnNldCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDYXRhUmVmVHlwZSkiKX0sCisgICAgeyJOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBoLCBzaG9ydCBuZXdNb3ZpZUZsYWdzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQpIil9LAorICAgIHsiUmVtb3ZlTW92aWVSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilRdF9SZW1vdmVNb3ZpZVJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZXNSZWZOdW0sIHNob3J0IHJlc0lkKSAtPiBOb25lIil9LAorICAgIHsiQ3JlYXRlTW92aWVTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NyZWF0ZU1vdmllU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzKSAtPiAoRGF0YUhhbmRsZXIgb3V0RGF0YUhhbmRsZXIsIE1vdmllIG5ld21vdmllKSIpfSwKKyAgICB7Ik9wZW5Nb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfT3Blbk1vdmllU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyBmbGFncykgLT4gKERhdGFIYW5kbGVyIG91dERhdGFIYW5kbGVyKSIpfSwKKyAgICB7IkNsb3NlTW92aWVTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0Nsb3NlTW92aWVTdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gTm9uZSIpfSwKKyAgICB7IkRlbGV0ZU1vdmllU3RvcmFnZSIsIChQeUNGdW5jdGlvbilRdF9EZWxldGVNb3ZpZVN0b3JhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJDcmVhdGVTaG9ydGN1dE1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9DcmVhdGVTaG9ydGN1dE1vdmllRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGZpbGVTcGVjLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3MsIEhhbmRsZSB0YXJnZXREYXRhUmVmLCBPU1R5cGUgdGFyZ2V0RGF0YVJlZlR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJDYW5RdWlja1RpbWVPcGVuRmlsZSIsIChQeUNGdW5jdGlvbilRdF9DYW5RdWlja1RpbWVPcGVuRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGZpbGVTcGVjLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlTmFtZUV4dGVuc2lvbiwgVUludDMyIGluRmxhZ3MpIC0+IChCb29sZWFuIG91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwgQm9vbGVhbiBvdXRDYW5PcGVuQXNNb3ZpZSwgQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyKSIpfSwKKyAgICB7IkNhblF1aWNrVGltZU9wZW5EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0NhblF1aWNrVGltZU9wZW5EYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBVSW50MzIgaW5GbGFncykgLT4gKEJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLCBCb29sZWFuIG91dENhbk9wZW5Bc01vdmllLCBCb29sZWFuIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIpIil9LAorICAgIHsiTmV3TW92aWVGcm9tU2NyYXAiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJRVE5ld0FsaWFzIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUTmV3QWxpYXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBmc3MsIEJvb2xlYW4gbWluaW1hbCkgLT4gKEFsaWFzSGFuZGxlIGFsaWFzKSIpfSwKKyAgICB7IkVuZEZ1bGxTY3JlZW4iLCAoUHlDRnVuY3Rpb24pUXRfRW5kRnVsbFNjcmVlbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUHRyIGZ1bGxTdGF0ZSwgbG9uZyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBIYW5kbGUgZXh0ZW5zaW9uLCBPU1R5cGUgaWRUeXBlKSAtPiBOb25lIil9LAorICAgIHsiR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9HZXRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBpZFR5cGUpIC0+IChIYW5kbGUgZXh0ZW5zaW9uKSIpfSwKKyAgICB7IlJlbW92ZVNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgaWRUeXBlKSAtPiBOb25lIil9LAorICAgIHsiUVRJc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfUVRJc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUUGFyYW1ldGVyRGlhbG9nIGNyZWF0ZWREaWFsb2cpIC0+IChFdmVudFJlY29yZCBwRXZlbnQpIil9LAorICAgIHsiUVREaXNtaXNzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfUVREaXNtaXNzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKFFUUGFyYW1ldGVyRGlhbG9nIGNyZWF0ZWREaWFsb2cpIC0+IE5vbmUiKX0sCisgICAgeyJRVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfUVRTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0RvQWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nLCBsb25nIGFjdGlvbiwgdm9pZCAqIHBhcmFtcykgLT4gTm9uZSIpfSwKKyAgICB7IlFUUmVnaXN0ZXJBY2Nlc3NLZXkiLCAoUHlDRnVuY3Rpb24pUXRfUVRSZWdpc3RlckFjY2Vzc0tleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGFjY2Vzc0tleVR5cGUsIGxvbmcgZmxhZ3MsIEhhbmRsZSBhY2Nlc3NLZXkpIC0+IE5vbmUiKX0sCisgICAgeyJRVFVucmVnaXN0ZXJBY2Nlc3NLZXkiLCAoUHlDRnVuY3Rpb24pUXRfUVRVbnJlZ2lzdGVyQWNjZXNzS2V5LCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgYWNjZXNzS2V5VHlwZSwgbG9uZyBmbGFncywgSGFuZGxlIGFjY2Vzc0tleSkgLT4gTm9uZSIpfSwKKyAgICB7IlFUR2V0U3VwcG9ydGVkUmVzdHJpY3Rpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0U3VwcG9ydGVkUmVzdHJpY3Rpb25zLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgaW5SZXN0cmljdGlvbkNsYXNzKSAtPiAoVUludDMyIG91dFJlc3RyaWN0aW9uSURzKSIpfSwKKyAgICB7IlFUVGV4dFRvTmF0aXZlVGV4dCIsIChQeUNGdW5jdGlvbilRdF9RVFRleHRUb05hdGl2ZVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB0aGVUZXh0LCBsb25nIGVuY29kaW5nLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljcyIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZpZGVvTWVkaWFHZXRTdGF0aXN0aWNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFHZXRTdGF0aXN0aWNzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZpZGVvTWVkaWFHZXRTdGFsbENvdW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFHZXRTdGFsbENvdW50LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHN0YWxscykiKX0sCisgICAgeyJWaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvZGVjVHlwZSBjVHlwZSwgT1NUeXBlIHBhcmFtZXRlcklELCBsb25nIHBhcmFtZXRlckNoYW5nZVNlZWQsIHZvaWQgKiBkYXRhUHRyLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWaWRlb01lZGlhR2V0Q29kZWNQYXJhbWV0ZXIiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvZGVjVHlwZSBjVHlwZSwgT1NUeXBlIHBhcmFtZXRlcklELCBIYW5kbGUgb3V0UGFyYW1ldGVyRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVGV4dE1lZGlhQWRkVGV4dFNhbXBsZSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFBZGRUZXh0U2FtcGxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFB0ciB0ZXh0LCB1bnNpZ25lZCBsb25nIHNpemUsIHNob3J0IGZvbnROdW1iZXIsIHNob3J0IGZvbnRTaXplLCBTdHlsZSB0ZXh0RmFjZSwgc2hvcnQgdGV4dEp1c3RpZmljYXRpb24sIGxvbmcgZGlzcGxheUZsYWdzLCBUaW1lVmFsdWUgc2Nyb2xsRGVsYXksIHNob3J0IGhpbGl0ZVN0YXJ0LCBzaG9ydCBoaWxpdGVFbmQsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIHRleHRDb2xvciwgUkdCQ29sb3IgYmFja0NvbG9yLCBSZWN0IHRleHRCb3gsIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yLCBUaW1lVmFsdWUgc2FtcGxlVGltZSkiKX0sCisgICAgeyJUZXh0TWVkaWFBZGRURVNhbXBsZSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFBZGRURVNhbXBsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBURUhhbmRsZSBoVEUsIHNob3J0IHRleHRKdXN0aWZpY2F0aW9uLCBsb25nIGRpc3BsYXlGbGFncywgVGltZVZhbHVlIHNjcm9sbERlbGF5LCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciBiYWNrQ29sb3IsIFJlY3QgdGV4dEJveCwgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3IsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKKyAgICB7IlRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFBZGRIaWxpdGVTYW1wbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgaGlsaXRlU3RhcnQsIHNob3J0IGhpbGl0ZUVuZCwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3IsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKKyAgICB7IlRleHRNZWRpYURyYXdSYXciLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhRHJhd1JhdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBHV29ybGRQdHIgZ3csIEdESGFuZGxlIGdkLCB2b2lkICogZGF0YSwgbG9uZyBkYXRhU2l6ZSwgVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVGV4dE1lZGlhU2V0VGV4dFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYVNldFRleHRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgYXRNZWRpYVRpbWUsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogZGF0YSwgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVGV4dE1lZGlhUmF3U2V0dXAiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhUmF3U2V0dXAsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgR1dvcmxkUHRyIGd3LCBHREhhbmRsZSBnZCwgdm9pZCAqIGRhdGEsIGxvbmcgZGF0YVNpemUsIFRleHREZXNjcmlwdGlvbkhhbmRsZSB0ZGgsIFRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVGV4dE1lZGlhUmF3SWRsZSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFSYXdJZGxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEdXb3JsZFB0ciBndywgR0RIYW5kbGUgZ2QsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBsb25nIGZsYWdzSW4pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZsYWdzT3V0KSIpfSwKKyAgICB7IlRleHRNZWRpYUdldFRleHRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFHZXRUZXh0UHJvcGVydHksIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIGF0TWVkaWFUaW1lLCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIGRhdGEsIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlRleHRNZWRpYUZpbmROZXh0VGV4dCIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFGaW5kTmV4dFRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUHRyIHRleHQsIGxvbmcgc2l6ZSwgc2hvcnQgZmluZEZsYWdzLCBUaW1lVmFsdWUgc3RhcnRUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVZhbHVlIGZvdW5kVGltZSwgVGltZVZhbHVlIGZvdW5kRHVyYXRpb24sIGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7IlRleHRNZWRpYUhpbGl0ZVRleHRTYW1wbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgc2FtcGxlVGltZSwgc2hvcnQgaGlsaXRlU3RhcnQsIHNob3J0IGhpbGl0ZUVuZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yKSIpfSwKKyAgICB7IlRleHRNZWRpYVNldFRleHRTYW1wbGVEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYVNldFRleHRTYW1wbGVEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiBkYXRhLCBPU1R5cGUgZGF0YVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhU2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBzcHJpdGVJbmRleCwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUdldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0UHJvcGVydHksIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgc3ByaXRlSW5kZXgsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFIaXRUZXN0U3ByaXRlcyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIFBvaW50IGxvYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHNwcml0ZUhpdEluZGV4KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhQ291bnRTcHJpdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhQ291bnRTcHJpdGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBudW1TcHJpdGVzKSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhQ291bnRJbWFnZXMiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFDb3VudEltYWdlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgbnVtSW1hZ2VzKSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgaW1hZ2VJbmRleCwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBpbWFnZURlc2NyaXB0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUdldERpc3BsYXllZFNhbXBsZU51bWJlciIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldERpc3BsYXllZFNhbXBsZU51bWJlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzYW1wbGVOdW0pIil9LAorICAgIHsiU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCwgU3RyMjU1IHNwcml0ZU5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGltYWdlSW5kZXgsIFN0cjI1NSBpbWFnZU5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhU2V0U3ByaXRlUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUdldFNwcml0ZVByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHksIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFIaXRUZXN0QWxsU3ByaXRlcyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIFBvaW50IGxvYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUQXRvbUlEIHNwcml0ZUhpdElEKSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQsIGxvbmcgZmxhZ3MsIFBvaW50IGxvYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gd2FzSGl0KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lEIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lELCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHNwcml0ZUluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRBdG9tSUQgc3ByaXRlSUQpIil9LAorICAgIHsiU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBzcHJpdGVJbmRleCkiKX0sCisgICAgeyJTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgdmFyaWFibGVJRCwgZmxvYXQgdmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCB2YXJpYWJsZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgZmxvYXQgdmFsdWUpIil9LAorICAgIHsiU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhRGlzcG9zZVNwcml0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCB2YXJpYWJsZUlELCBQdHIgdGhlQ1N0cmluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGVBc1N0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCB2YXJpYWJsZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHRoZUNTdHJpbmcpIil9LAorICAgIHsiU3ByaXRlTWVkaWFOZXdJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYU5ld0ltYWdlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIFFUQXRvbUlEIGRlc2lyZWRJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFEaXNwb3NlSW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFEaXNwb3NlSW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgaW1hZ2VJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUltYWdlSW5kZXhUb0lELCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGltYWdlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVEF0b21JRCBpbWFnZUlEKSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFJbWFnZUlEVG9JbmRleCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBpbWFnZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgaW1hZ2VJbmRleCkiKX0sCisgICAgeyJGbGFzaE1lZGlhU2V0UGFuIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRQYW4sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgeFBlcmNlbnQsIHNob3J0IHlQZXJjZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJGbGFzaE1lZGlhU2V0Wm9vbSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhU2V0Wm9vbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBmYWN0b3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkZsYXNoTWVkaWFTZXRab29tUmVjdCIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhU2V0Wm9vbVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBsZWZ0LCBsb25nIHRvcCwgbG9uZyByaWdodCwgbG9uZyBib3R0b20pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkZsYXNoTWVkaWFHZXRSZWZDb25Cb3VuZHMiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbGVmdCwgbG9uZyB0b3AsIGxvbmcgcmlnaHQsIGxvbmcgYm90dG9tKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFHZXRSZWZDb25JRCIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0UmVmQ29uSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHJlZkNvbklEKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFJRFRvUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFJRFRvUmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHJlZkNvbikiKX0sCisgICAgeyJGbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZsYXNoRnJhbWVOdW1iZXIpIil9LAorICAgIHsiRmxhc2hNZWRpYUZyYW1lTnVtYmVyVG9Nb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUZyYW1lTnVtYmVyVG9Nb3ZpZVRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFzaEZyYW1lTnVtYmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVZhbHVlIG1vdmllVGltZSkiKX0sCisgICAgeyJGbGFzaE1lZGlhRnJhbWVMYWJlbFRvTW92aWVUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUHRyIHRoZUxhYmVsKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVZhbHVlIG1vdmllVGltZSkiKX0sCisgICAgeyJGbGFzaE1lZGlhR2V0Rmxhc2hWYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0Rmxhc2hWYXJpYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBwYXRoLCBjaGFyIG5hbWUsIEhhbmRsZSB0aGVWYXJpYWJsZUNTdHJpbmdPdXQpIil9LAorICAgIHsiRmxhc2hNZWRpYVNldEZsYXNoVmFyaWFibGUiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYVNldEZsYXNoVmFyaWFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQm9vbGVhbiB1cGRhdGVGb2N1cykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgcGF0aCwgY2hhciBuYW1lLCBjaGFyIHZhbHVlKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGJ1dHRvbklELCBsb25nIHRyYW5zaXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIHBhdGgpIil9LAorICAgIHsiRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQ4IHN3ZlZlcnNpb24pIil9LAorICAgIHsiTWVkaWEzREdldEN1cnJlbnRHcm91cCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNER2V0Q3VycmVudEdyb3VwLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiBncm91cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWEzRFRyYW5zbGF0ZU5hbWVkT2JqZWN0VG8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFRyYW5zbGF0ZU5hbWVkT2JqZWN0VG8sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgRml4ZWQgeCwgRml4ZWQgeSwgRml4ZWQgeikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgb2JqZWN0TmFtZSkiKX0sCisgICAgeyJNZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgRml4ZWQgeFNjYWxlLCBGaXhlZCB5U2NhbGUsIEZpeGVkIHpTY2FsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgb2JqZWN0TmFtZSkiKX0sCisgICAgeyJNZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB4RGVncmVlcywgRml4ZWQgeURlZ3JlZXMsIEZpeGVkIHpEZWdyZWVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBvYmplY3ROYW1lKSIpfSwKKyAgICB7Ik1lZGlhM0RTZXRDYW1lcmFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RTZXRDYW1lcmFEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiBjYW1lcmFEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYTNER2V0Q2FtZXJhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNER2V0Q2FtZXJhRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogY2FtZXJhRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEZsb2F0U2luZ2xlIGZvdiwgUVRGbG9hdFNpbmdsZSBhc3BlY3RSYXRpb1hUb1kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFURmxvYXRTaW5nbGUgZm92LCBRVEZsb2F0U2luZ2xlIGFzcGVjdFJhdGlvWFRvWSkiKX0sCisgICAgeyJNZWRpYTNEU2V0Q2FtZXJhUmFuZ2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNldENhbWVyYVJhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiB0UTNDYW1lcmFSYW5nZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWEzREdldENhbWVyYVJhbmdlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDYW1lcmFSYW5nZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogdFEzQ2FtZXJhUmFuZ2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik5ld1RpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld1RpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lQmFzZSBfcnYpIil9LAorICAgIHsiQ29udmVydFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfQ29udmVydFRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgdGhlVGltZSwgVGltZUJhc2UgbmV3QmFzZSkgLT4gKFRpbWVSZWNvcmQgdGhlVGltZSkiKX0sCisgICAgeyJDb252ZXJ0VGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbnZlcnRUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgdGhlVGltZSwgVGltZVNjYWxlIG5ld1NjYWxlKSAtPiAoVGltZVJlY29yZCB0aGVUaW1lKSIpfSwKKyAgICB7IkFkZFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfQWRkVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCBkc3QsIFRpbWVSZWNvcmQgc3JjKSAtPiAoVGltZVJlY29yZCBkc3QpIil9LAorICAgIHsiU3VidHJhY3RUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1N1YnRyYWN0VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCBkc3QsIFRpbWVSZWNvcmQgc3JjKSAtPiAoVGltZVJlY29yZCBkc3QpIil9LAorICAgIHsiTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgdGksIGxvbmcgc2FtcGxlRGVzY0luZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50SW5zdGFuY2UgdHApIil9LAorICAgIHsiQ29kZWNNYW5hZ2VyVmVyc2lvbiIsIChQeUNGdW5jdGlvbilRdF9Db2RlY01hbmFnZXJWZXJzaW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIHZlcnNpb24pIil9LAorICAgIHsiR2V0TWF4Q29tcHJlc3Npb25TaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldE1heENvbXByZXNzaW9uU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0LCBzaG9ydCBjb2xvckRlcHRoLCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlLCBDb21wcmVzc29yQ29tcG9uZW50IGNvZGVjKSAtPiAobG9uZyBzaXplKSIpfSwKKyAgICB7IkdldENvbXByZXNzaW9uVGltZSIsIChQeUNGdW5jdGlvbilRdF9HZXRDb21wcmVzc2lvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCwgc2hvcnQgY29sb3JEZXB0aCwgQ29kZWNUeXBlIGNUeXBlLCBDb21wcmVzc29yQ29tcG9uZW50IGNvZGVjKSAtPiAoQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCB1bnNpZ25lZCBsb25nIGNvbXByZXNzVGltZSkiKX0sCisgICAgeyJDb21wcmVzc0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXByZXNzSW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBQdHIgZGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IkRlY29tcHJlc3NJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9EZWNvbXByZXNzSW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFB0ciBkYXRhLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIFBpeE1hcEhhbmRsZSBkc3QsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0LCBzaG9ydCBtb2RlLCBSZ25IYW5kbGUgbWFzaykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFNpbWlsYXJpdHkiLCAoUHlDRnVuY3Rpb24pUXRfR2V0U2ltaWxhcml0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIFB0ciBkYXRhKSAtPiAoRml4ZWQgc2ltaWxhcml0eSkiKX0sCisgICAgeyJHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEltYWdlRGVzY3JpcHRpb25DVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENUYWJIYW5kbGUgY3RhYmxlKSIpfSwKKyAgICB7IlNldEltYWdlRGVzY3JpcHRpb25DVGFibGUiLCAoUHlDRnVuY3Rpb24pUXRfU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBDVGFiSGFuZGxlIGN0YWJsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfR2V0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBsb25nIGlkVHlwZSwgbG9uZyBpbmRleCkgLT4gKEhhbmRsZSBleHRlbnNpb24pIil9LAorICAgIHsiQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9BZGRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIEhhbmRsZSBleHRlbnNpb24sIGxvbmcgaWRUeXBlKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9SZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIGxvbmcgaWRUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiQ291bnRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Db3VudEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIGxvbmcgaWRUeXBlKSAtPiAobG9uZyBjb3VudCkiKX0sCisgICAgeyJHZXROZXh0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TmV4dEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChsb25nIGlkVHlwZSkiKX0sCisgICAgeyJGaW5kQ29kZWMiLCAoUHlDRnVuY3Rpb24pUXRfRmluZENvZGVjLCAxLAorICAgICBQeURvY19TVFIoIihDb2RlY1R5cGUgY1R5cGUsIENvZGVjQ29tcG9uZW50IHNwZWNDb2RlYykgLT4gKENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvciwgRGVjb21wcmVzc29yQ29tcG9uZW50IGRlY29tcHJlc3NvcikiKX0sCisgICAgeyJDb21wcmVzc1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcHJlc3NQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihQaWNIYW5kbGUgc3JjUGljdHVyZSwgUGljSGFuZGxlIGRzdFBpY3R1cmUsIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJDb21wcmVzc1BpY3R1cmVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXByZXNzUGljdHVyZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHNyY1JlZk51bSwgc2hvcnQgZHN0UmVmTnVtLCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlKSAtPiBOb25lIil9LAorICAgIHsiQ29udmVydEltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbnZlcnRJbWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNERCwgUHRyIHNyY0RhdGEsIHNob3J0IGNvbG9yRGVwdGgsIENUYWJIYW5kbGUgY3RhYmxlLCBDb2RlY1EgYWNjdXJhY3ksIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUsIENvZGVjQ29tcG9uZW50IGNvZGVjLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRzdERELCBQdHIgZHN0RGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IkFkZEZpbGVQcmV2aWV3IiwgKFB5Q0Z1bmN0aW9uKVF0X0FkZEZpbGVQcmV2aWV3LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZXNSZWZOdW0sIE9TVHlwZSBwcmV2aWV3VHlwZSwgSGFuZGxlIHByZXZpZXdEYXRhKSAtPiBOb25lIil9LAorICAgIHsiR2V0QmVzdERldmljZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR2V0QmVzdERldmljZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIGdkaCwgUmVjdCBycCkiKX0sCisgICAgeyJHREhhc1NjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dESGFzU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkaCwgc2hvcnQgZGVwdGgpIC0+IChGaXhlZCBzY2FsZSkiKX0sCisgICAgeyJHREdldFNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dER2V0U2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkaCkgLT4gKEZpeGVkIHNjYWxlLCBzaG9ydCBmbGFncykiKX0sCisgICAgeyJHRFNldFNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dEU2V0U2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkaCwgRml4ZWQgc2NhbGUsIHNob3J0IGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgZ2kpIil9LAorICAgIHsiR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChDb21wb25lbnRJbnN0YW5jZSBnaSkiKX0sCisgICAgeyJHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncyIsIChQeUNGdW5jdGlvbilRdF9HZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZUZpbGUsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRJbnN0YW5jZSBnaSkiKX0sCisgICAgeyJHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZldpdGhGbGFncyIsIChQeUNGdW5jdGlvbilRdF9HZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZldpdGhGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKKyAgICB7Ik1ha2VJbWFnZURlc2NyaXB0aW9uRm9yUGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKVF0X01ha2VJbWFnZURlc2NyaXB0aW9uRm9yUGl4TWFwLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcGl4bWFwKSAtPiAoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBpZGgpIil9LAorICAgIHsiTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JFZmZlY3QiLCAoUHlDRnVuY3Rpb24pUXRfTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JFZmZlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBlZmZlY3RUeXBlKSAtPiAoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBpZGgpIil9LAorICAgIHsiUVRHZXRQaXhlbFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhlbFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBQaXhlbEZvcm1hdCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJRVEdldFBpeGVsRm9ybWF0RGVwdGhGb3JJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBQaXhlbEZvcm1hdCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJRVEdldFBpeE1hcEhhbmRsZVJvd0J5dGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlFUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtLCBsb25nIHJvd0J5dGVzKSAtPiBOb25lIil9LAorICAgIHsiUVRHZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IlFUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9RVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSwgRml4ZWQgZ2FtbWFMZXZlbCkgLT4gTm9uZSIpfSwKKyAgICB7IlFUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJRVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIEZpeGVkIHJlcXVlc3RlZEdhbW1hTGV2ZWwpIC0+IE5vbmUiKX0sCisgICAgeyJDb21wQWRkIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBBZGQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHdpZGUgc3JjLCB3aWRlIGRzdCkiKX0sCisgICAgeyJDb21wU3ViIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBTdWIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHdpZGUgc3JjLCB3aWRlIGRzdCkiKX0sCisgICAgeyJDb21wTmVnIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBOZWcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHdpZGUgZHN0KSIpfSwKKyAgICB7IkNvbXBTaGlmdCIsIChQeUNGdW5jdGlvbilRdF9Db21wU2hpZnQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHNoaWZ0KSAtPiAod2lkZSBzcmMpIil9LAorICAgIHsiQ29tcE11bCIsIChQeUNGdW5jdGlvbilRdF9Db21wTXVsLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHNyYzEsIGxvbmcgc3JjMikgLT4gKHdpZGUgZHN0KSIpfSwKKyAgICB7IkNvbXBEaXYiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcERpdiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBkZW5vbWluYXRvcikgLT4gKGxvbmcgX3J2LCB3aWRlIG51bWVyYXRvciwgbG9uZyByZW1haW5kZXIpIil9LAorICAgIHsiQ29tcEZpeE11bCIsIChQeUNGdW5jdGlvbilRdF9Db21wRml4TXVsLCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCBmaXhTcmMpIC0+ICh3aWRlIGNvbXBTcmMsIHdpZGUgY29tcERzdCkiKX0sCisgICAgeyJDb21wTXVsRGl2IiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBNdWxEaXYsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbXVsLCBsb25nIGRpdmlzb3IpIC0+ICh3aWRlIGNvKSIpfSwKKyAgICB7IkNvbXBNdWxEaXZUcnVuYyIsIChQeUNGdW5jdGlvbilRdF9Db21wTXVsRGl2VHJ1bmMsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbXVsLCBsb25nIGRpdmlzb3IpIC0+ICh3aWRlIGNvLCBsb25nIHJlbWFpbmRlcikiKX0sCisgICAgeyJDb21wQ29tcGFyZSIsIChQeUNGdW5jdGlvbilRdF9Db21wQ29tcGFyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIod2lkZSBhLCB3aWRlIG1pbnVzYikgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkNvbXBTcXVhcmVSb290IiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBTcXVhcmVSb290LCAxLAorICAgICBQeURvY19TVFIoIih3aWRlIHNyYykgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkZpeE11bERpdiIsIChQeUNGdW5jdGlvbilRdF9GaXhNdWxEaXYsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHNyYywgRml4ZWQgbXVsLCBGaXhlZCBkaXZpc29yKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IlVuc2lnbmVkRml4TXVsRGl2IiwgKFB5Q0Z1bmN0aW9uKVF0X1Vuc2lnbmVkRml4TXVsRGl2LCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCBzcmMsIEZpeGVkIG11bCwgRml4ZWQgZGl2aXNvcikgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJGaXhFeHAyIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpeEV4cDIsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHNyYykgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJGaXhMb2cyIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpeExvZzIsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHNyYykgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJGaXhQb3ciLCAoUHlDRnVuY3Rpb24pUXRfRml4UG93LCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCBiYXNlLCBGaXhlZCBleHApIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZVR5cGUpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGgpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRSZWFkRGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFJlYWREYXRhLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0Q2xpcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIFJnbkhhbmRsZSBjbGlwUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSBjbGlwUmduKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0U291cmNlUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBSZWN0IHNvdXJjZVJlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldFNvdXJjZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBzb3VyY2VSZWN0KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBuYXR1cmFsQm91bmRzKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0RHJhdyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydERyYXcsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRCb3VuZHNSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmVjdCBib3VuZHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0Qm91bmRzUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEJvdW5kc1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBib3VuZHMpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2F2ZUFzUGljdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyBmc3MsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldEdyYXBoaWNzTW9kZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEdyYXBoaWNzTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgZ3JhcGhpY3NNb2RlLCBSR0JDb2xvciBvcENvbG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEdyYXBoaWNzTW9kZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEdyYXBoaWNzTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGdyYXBoaWNzTW9kZSwgUkdCQ29sb3Igb3BDb2xvcikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRRdWFsaXR5LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgQ29kZWNRIHF1YWxpdHkpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldFF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29kZWNRIHF1YWxpdHkpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgZnNzLCBTY3JpcHRDb2RlIHNjcmlwdFRhZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGltaXQpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEFsaWFzZWREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFZhbGlkYXRlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdmFsaWQpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldE1ldGFEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHVzZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldE1JTUVUeXBlTGlzdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldE1JTUVUeXBlTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBkcmF3c0FsbFBpeGVscykiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEFzUGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEFzUGljdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaWNIYW5kbGUgcGljdHVyZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVDcmVhdG9yLCBGU1NwZWMgZnNzLCBTY3JpcHRDb2RlIHNjcmlwdFRhZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0RXhwb3J0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEltYWdlQ291bnQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgaW1hZ2VDb3VudCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXgiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBpbWFnZUluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgaW1hZ2VJbmRleCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCB3aWRlIHNpemUpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0UmVhZERhdGE2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBkYXRhUHRyLCB3aWRlIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHdpZGUgb2Zmc2V0LCB3aWRlIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIHdpZGUgbGltaXQpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSBkZWZhdWx0UmduKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkZWZhdWx0R3JhcGhpY3NNb2RlLCBSR0JDb2xvciBkZWZhdWx0T3BDb2xvcikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdFNvdXJjZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkZWZhdWx0U291cmNlUmVjdCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldENvbG9yU3luY1Byb2ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBwcm9maWxlKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIFJlY3QgZGVzdFJlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGVzdFJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGRlc3RSZWN0KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZsYWdzKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRCYXNlRGF0YU9mZnNldEFuZFNpemU2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgd2lkZSBzaXplKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnREb0V4cG9ydCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydERvRXhwb3J0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgYWN0dWFsU2l6ZVdyaXR0ZW4pIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRDYW5UcmFuc2NvZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRDYW5UcmFuc2NvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBjYW5UcmFuc2NvZGUpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRDYW5Vc2VDb21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gY2FuVXNlQ29tcHJlc3NvcikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgb3V0RGVzYykiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVUeXBlQW5kQ3JlYXRvciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlVHlwZUFuZENyZWF0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZUNyZWF0b3IpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc0F0b21Db250YWluZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc1RleHQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdGhlVGV4dCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldERvbnRSZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBCb29sZWFuIGRvbnRSZWNvbXByZXNzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldERvbnRSZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBkb250UmVjb21wcmVzcykiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldEludGVybGFjZVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIGludGVybGFjZVN0eWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldEludGVybGFjZVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBpbnRlcmxhY2VTdHlsZSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldE1ldGFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogdXNlckRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0TWV0YURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiB1c2VyRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRUYXJnZXREYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyB0YXJnZXREYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRUYXJnZXREYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgdGFyZ2V0RGF0YVNpemUpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvbk1ldGhvZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgbG9uZyBjb21wcmVzc2lvbk1ldGhvZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvbk1ldGhvZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgY29tcHJlc3Npb25NZXRob2QpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvblF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvblF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBDb2RlY1Egc3BhdGlhbFF1YWxpdHkpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25RdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25RdWFsaXR5LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvZGVjUSBzcGF0aWFsUXVhbGl0eSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgRml4ZWQgaG9yaXpvbnRhbFJlc29sdXRpb24sIEZpeGVkIHZlcnRpY2FsUmVzb2x1dGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRSZXNvbHV0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBGaXhlZCBob3Jpem9udGFsUmVzb2x1dGlvbiwgRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0RGVwdGgiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXREZXB0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgZGVwdGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0RGVwdGgiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXREZXB0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRlcHRoKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0Q29sb3JTeW5jUHJvZmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldENvbG9yU3luY1Byb2ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgY29sb3JTeW5jUHJvZmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRDb2xvclN5bmNQcm9maWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgY29sb3JTeW5jUHJvZmlsZSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldElucHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0RGF0YVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldElucHV0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0RmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBoLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldElucHV0UHRyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBQdHIgcCwgdW5zaWduZWQgbG9uZyBzaXplLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgZ3JpcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgZ3JpcCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldElucHV0UGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UGljdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIFBpY0hhbmRsZSBwaWN0dXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0UGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0UGljdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaWNIYW5kbGUgcGljdHVyZSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBHV29ybGRQdHIgZ3dvcmxkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgR1dvcmxkUHRyIGd3b3JsZCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBQaXhNYXBIYW5kbGUgcGl4bWFwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0UGl4bWFwIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGl4TWFwSGFuZGxlIHBpeG1hcCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldElucHV0T2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dE9mZnNldEFuZExpbWl0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0T2Zmc2V0QW5kTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGltaXQpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRNYXlFeHBvcnRlclJlYWRJbnB1dERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRNYXlFeHBvcnRlclJlYWRJbnB1dERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBtYXlSZWFkSW5wdXREYXRhKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBzaXplKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogZGF0YVB0ciwgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGltZW5zaW9ucykiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXB0aCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXB0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGlucHV0RGVwdGgpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQ0dyYWZQdHIgZ3csIEdESGFuZGxlIGdkLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGgpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG1heFNpemUsIEJvb2xlYW4gdHJ1bmNhdGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG1heFNpemUsIEJvb2xlYW4gdHJ1bmNhdGVGaWxlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZUNyZWF0b3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVDcmVhdG9yKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0TWFyayIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIG1hcmspIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyayIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBtYXJrKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBkYXRhUHRyLCB1bnNpZ25lZCBsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBCb29sZWFuIGVuYWJsZVRodW1ibmFpbCwgbG9uZyBtYXhUaHVtYm5haWxXaWR0aCwgbG9uZyBtYXhUaHVtYm5haWxIZWlnaHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0VGh1bWJuYWlsRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB0aHVtYm5haWxFbmFibGVkLCBsb25nIG1heFRodW1ibmFpbFdpZHRoLCBsb25nIG1heFRodW1ibmFpbEhlaWdodCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0RXhpZkVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBCb29sZWFuIGVuYWJsZUV4aWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0RXhpZkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGV4aWZFbmFibGVkKSIpfSwKKyAgICB7IkltYWdlVHJhbnNjb2RlckJlZ2luU2VxdWVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSW1hZ2VUcmFuc2NvZGVyQ29tcG9uZW50IGl0YywgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNEZXNjLCB2b2lkICogZGF0YSwgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0RGVzYykiKX0sCisgICAgeyJJbWFnZVRyYW5zY29kZXJEaXNwb3NlRGF0YSIsIChQeUNGdW5jdGlvbilRdF9JbWFnZVRyYW5zY29kZXJEaXNwb3NlRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSW1hZ2VUcmFuc2NvZGVyQ29tcG9uZW50IGl0Yywgdm9pZCAqIGRzdERhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkltYWdlVHJhbnNjb2RlckVuZFNlcXVlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0ltYWdlVHJhbnNjb2RlckVuZFNlcXVlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJDbG9ja0dldFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvY2tHZXRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhQ2xvY2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lUmVjb3JkIG91dCkiKX0sCisgICAgeyJDbG9ja1NldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0Nsb2NrU2V0VGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFDbG9jaywgVGltZUJhc2UgdGIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkNsb2NrR2V0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9DbG9ja0dldFJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFDbG9jaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEZpeGVkIHJhdGUpIil9LAorICAgIHsiU0NQb3NpdGlvblJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0NQb3NpdGlvblJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBycCwgUG9pbnQgd2hlcmUpIil9LAorICAgIHsiU0NQb3NpdGlvbkRpYWxvZyIsIChQeUNGdW5jdGlvbilRdF9TQ1Bvc2l0aW9uRGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgaWQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQb2ludCB3aGVyZSkiKX0sCisgICAgeyJTQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0NTZXRUZXN0SW1hZ2VQaWN0SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGljSGFuZGxlIHRlc3RQaWN0LCBzaG9ydCB0ZXN0RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHRlc3RSZWN0KSIpfSwKKyAgICB7IlNDU2V0VGVzdEltYWdlUGljdEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIHNob3J0IHRlc3RGaWxlUmVmLCBzaG9ydCB0ZXN0RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHRlc3RSZWN0KSIpfSwKKyAgICB7IlNDU2V0VGVzdEltYWdlUGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0VGVzdEltYWdlUGl4TWFwLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHRlc3RQaXhNYXAsIHNob3J0IHRlc3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdGVzdFJlY3QpIil9LAorICAgIHsiU0NHZXRCZXN0RGV2aWNlUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TQ0dldEJlc3REZXZpY2VSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcikiKX0sCisgICAgeyJTQ1JlcXVlc3RJbWFnZVNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDUmVxdWVzdEltYWdlU2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0NvbXByZXNzSW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc0ltYWdlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBIYW5kbGUgZGF0YSkiKX0sCisgICAgeyJTQ0NvbXByZXNzUGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzUGljdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpY0hhbmRsZSBzcmNQaWN0dXJlLCBQaWNIYW5kbGUgZHN0UGljdHVyZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0NDb21wcmVzc1BpY3R1cmVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NQaWN0dXJlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIHNob3J0IHNyY1JlZk51bSwgc2hvcnQgZHN0UmVmTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ1JlcXVlc3RTZXF1ZW5jZVNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0NvbXByZXNzU2VxdWVuY2VCZWdpbiIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzU2VxdWVuY2VCZWdpbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykiKX0sCisgICAgeyJTQ0NvbXByZXNzU2VxdWVuY2VGcmFtZSIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzU2VxdWVuY2VGcmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhLCBsb25nIGRhdGFTaXplLCBzaG9ydCBub3RTeW5jRmxhZykiKX0sCisgICAgeyJTQ0NvbXByZXNzU2VxdWVuY2VFbmQiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1NlcXVlbmNlRW5kLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpY0hhbmRsZSBzcmNQaWN0dXJlLCBzaG9ydCBtb3Rpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NEZWZhdWx0UGljdEZpbGVTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIHNob3J0IHNyY1JlZiwgc2hvcnQgbW90aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0RlZmF1bHRQaXhNYXBTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ0RlZmF1bHRQaXhNYXBTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpeE1hcEhhbmRsZSBzcmMsIHNob3J0IG1vdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0NHZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDR2V0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIE9TVHlwZSBpbmZvVHlwZSwgdm9pZCAqIGluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDU2V0SW5mbyIsIChQeUNGdW5jdGlvbilRdF9TQ1NldEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBPU1R5cGUgaW5mb1R5cGUsIHZvaWQgKiBpbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ1NldENvbXByZXNzRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NTZXRDb21wcmVzc0ZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0NHZXRDb21wcmVzc0ZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDR2V0Q29tcHJlc3NGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZsYWdzKSIpfSwKKyAgICB7IlNDR2V0U2V0dGluZ3NBc1RleHQiLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRTZXR0aW5nc0FzVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdGV4dCkiKX0sCisgICAgeyJTQ0FzeW5jSWRsZSIsIChQeUNGdW5jdGlvbilRdF9TQ0FzeW5jSWRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR3ZWVuZXJSZXNldCIsIChQeUNGdW5jdGlvbilRdF9Ud2VlbmVyUmVzZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFR3ZWVuZXJDb21wb25lbnQgdGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlRDR2V0U291cmNlUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X1RDR2V0U291cmNlUmVmLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVDb2RlRGVzY3JpcHRpb25IYW5kbGUgdGNkSCkgLT4gKEhhbmRsZXJFcnJvciBfcnYsIFVzZXJEYXRhIHNyZWZIKSIpfSwKKyAgICB7IlRDU2V0U291cmNlUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X1RDU2V0U291cmNlUmVmLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVDb2RlRGVzY3JpcHRpb25IYW5kbGUgdGNkSCwgVXNlckRhdGEgc3JlZkgpIC0+IChIYW5kbGVyRXJyb3IgX3J2KSIpfSwKKyAgICB7IlRDU2V0VGltZUNvZGVGbGFncyIsIChQeUNGdW5jdGlvbilRdF9UQ1NldFRpbWVDb2RlRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IChIYW5kbGVyRXJyb3IgX3J2KSIpfSwKKyAgICB7IlRDR2V0VGltZUNvZGVGbGFncyIsIChQeUNGdW5jdGlvbilRdF9UQ0dldFRpbWVDb2RlRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKEhhbmRsZXJFcnJvciBfcnYsIGxvbmcgZmxhZ3MpIil9LAorICAgIHsiTW92aWVJbXBvcnRIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YUgsIE1vdmllIHRoZU1vdmllLCBUcmFjayB0YXJnZXRUcmFjaywgVGltZVZhbHVlIGF0VGltZSwgbG9uZyBpbkZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVHJhY2sgdXNlZFRyYWNrLCBUaW1lVmFsdWUgYWRkZWREdXJhdGlvbiwgbG9uZyBvdXRGbGFncykiKX0sCisgICAgeyJNb3ZpZUltcG9ydEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIE1vdmllIHRoZU1vdmllLCBUcmFjayB0YXJnZXRUcmFjaywgVGltZVZhbHVlIGF0VGltZSwgbG9uZyBpbkZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVHJhY2sgdXNlZFRyYWNrLCBUaW1lVmFsdWUgYWRkZWREdXJhdGlvbiwgbG9uZyBvdXRGbGFncykiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0U2FtcGxlRHVyYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBUaW1lVmFsdWUgZHVyYXRpb24sIFRpbWVTY2FsZSBzY2FsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldFNhbXBsZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIG1lZGlhVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRNZWRpYUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRNZWRpYUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBBbGlhc0hhbmRsZSBhbGlhcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXREaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0RGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0Q2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0Q2h1bmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBjaHVua1NpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldEF1eGlsaWFyeURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YSwgT1NUeXBlIGhhbmRsZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0RnJvbVNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0RnJvbVNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBmcm9tU2NyYXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0RG9Vc2VyRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0RG9Vc2VyRGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIEhhbmRsZSB0aGVEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBjYW5jZWxlZCkiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldER1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0RHVyYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgYXV4VHlwZSkiKX0sCisgICAgeyJNb3ZpZUltcG9ydFZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0VmFsaWRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgSGFuZGxlIHRoZURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHZhbGlkKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0R2V0RmlsZVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRGaWxlVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZVR5cGUpIil9LAorICAgIHsiTW92aWVJbXBvcnREYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0RGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE1vdmllIHRoZU1vdmllLCBUcmFjayB0YXJnZXRUcmFjaywgVGltZVZhbHVlIGF0VGltZSwgbG9uZyBpbkZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVHJhY2sgdXNlZFRyYWNrLCBUaW1lVmFsdWUgYWRkZWREdXJhdGlvbiwgbG9uZyBvdXRGbGFncykiKX0sCisgICAgeyJNb3ZpZUltcG9ydEdldFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0U2FtcGxlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIG1lZGlhVHlwZSkiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0IiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQ2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIHdpZGUgb2Zmc2V0LCB3aWRlIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydElkbGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRJZGxlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBpbkZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBvdXRGbGFncykiKX0sCisgICAgeyJNb3ZpZUltcG9ydFZhbGlkYXRlRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFZhbGlkYXRlRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50OCB2YWxpZCkiKX0sCisgICAgeyJNb3ZpZUltcG9ydEdldExvYWRTdGF0ZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldExvYWRTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGltcG9ydGVyTG9hZFN0YXRlKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVZhbHVlIHRpbWUpIil9LAorICAgIHsiTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lUmVjb3JkIHRpbWUpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXREb250QmxvY2siLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXREb250QmxvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBCb29sZWFuIGRvbnRCbG9jaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXREb250QmxvY2siLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXREb250QmxvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB3aWxsQmxvY2spIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlciIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldElkbGVNYW5hZ2VyLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSWRsZU1hbmFnZXIgaW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0TmV3TW92aWVGbGFncyIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIG5ld01vdmllRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0R2V0RGVzdGluYXRpb25NZWRpYVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgbWVkaWFUeXBlKSIpfSwKKyAgICB7Ik1vdmllRXhwb3J0VG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRUb0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhSCwgTW92aWUgdGhlTW92aWUsIFRyYWNrIG9ubHlUaGlzVHJhY2ssIFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVFeHBvcnRUb0ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRUb0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIG9ubHlUaGlzVHJhY2ssIFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVFeHBvcnRHZXRBdXhpbGlhcnlEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0QXV4aWxpYXJ5RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhSCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBoYW5kbGVUeXBlKSIpfSwKKyAgICB7Ik1vdmllRXhwb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBtZWRpYVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1vdmllRXhwb3J0RG9Vc2VyRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0RG9Vc2VyRGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIG9ubHlUaGlzVHJhY2ssIFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gY2FuY2VsZWQpIil9LAorICAgIHsiTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldENyZWF0b3JUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBjcmVhdG9yKSIpfSwKKyAgICB7Ik1vdmllRXhwb3J0VG9EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0VG9EYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIG9ubHlUaGlzVHJhY2ssIFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVFeHBvcnRGcm9tUHJvY2VkdXJlc1RvRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVFeHBvcnRWYWxpZGF0ZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFZhbGlkYXRlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIG9ubHlUaGlzVHJhY2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHZhbGlkKSIpfSwKKyAgICB7Ik1vdmllRXhwb3J0R2V0RmlsZU5hbWVFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZXh0ZW5zaW9uKSIpfSwKKyAgICB7Ik1vdmllRXhwb3J0R2V0U2hvcnRGaWxlVHlwZVN0cmluZyIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldFNob3J0RmlsZVR5cGVTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBTdHIyNTUgdHlwZVN0cmluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVFeHBvcnRHZXRTb3VyY2VNZWRpYVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRTb3VyY2VNZWRpYVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIG1lZGlhVHlwZSkiKX0sCisgICAgeyJUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRFeHBvcnRHZXRUaW1lRnJhY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1vdmllVGltZUZyYWN0aW9uKSIpfSwKKyAgICB7IlRleHRFeHBvcnRTZXRUaW1lRnJhY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfVGV4dEV4cG9ydFNldFRpbWVGcmFjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSwgbG9uZyBtb3ZpZVRpbWVGcmFjdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVGV4dEV4cG9ydEdldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRFeHBvcnRHZXRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2V0dGluZykiKX0sCisgICAgeyJUZXh0RXhwb3J0U2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dEV4cG9ydFNldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIHNldHRpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1JRElJbXBvcnRHZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9NSURJSW1wb3J0R2V0U2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNldHRpbmcpIil9LAorICAgIHsiTUlESUltcG9ydFNldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01JRElJbXBvcnRTZXRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSwgbG9uZyBzZXR0aW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltYWdlSW1wb3J0U2V0U2VxdWVuY2VFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNJbWFnZU1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBCb29sZWFuIGVuYWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbWFnZUltcG9ydEdldFNlcXVlbmNlRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljSW1hZ2VNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZW5hYmxlKSIpfSwKKyAgICB7IlByZXZpZXdTaG93RGF0YSIsIChQeUNGdW5jdGlvbilRdF9QcmV2aWV3U2hvd0RhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKHBub3RDb21wb25lbnQgcCwgT1NUeXBlIGRhdGFUeXBlLCBIYW5kbGUgZGF0YSwgUmVjdCBpbkhlcmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9QcmV2aWV3TWFrZVByZXZpZXdSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHBub3RDb21wb25lbnQgcCwgRlNTcGVjIHNvdXJjZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgcHJldmlld1R5cGUsIHNob3J0IHJlc0lEKSIpfSwKKyAgICB7IlByZXZpZXdFdmVudCIsIChQeUNGdW5jdGlvbilRdF9QcmV2aWV3RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKHBub3RDb21wb25lbnQgcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEV2ZW50UmVjb3JkIGUsIEJvb2xlYW4gaGFuZGxlZEV2ZW50KSIpfSwKKyAgICB7IkRhdGFDb2RlY0RlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjRGVjb21wcmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUNvZGVjQ29tcG9uZW50IGRjLCB2b2lkICogc3JjRGF0YSwgVUludDMyIHNyY1NpemUsIHZvaWQgKiBkc3REYXRhLCBVSW50MzIgZHN0QnVmZmVyU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUNvZGVjR2V0Q29tcHJlc3NCdWZmZXJTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0dldENvbXByZXNzQnVmZmVyU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUNvZGVjQ29tcG9uZW50IGRjLCBVSW50MzIgc3JjU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBkc3RTaXplKSIpfSwKKyAgICB7IkRhdGFDb2RlY0NvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0NvbXByZXNzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQ29kZWNDb21wb25lbnQgZGMsIHZvaWQgKiBzcmNEYXRhLCBVSW50MzIgc3JjU2l6ZSwgdm9pZCAqIGRzdERhdGEsIFVJbnQzMiBkc3RCdWZmZXJTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGFjdHVhbERzdFNpemUsIFVJbnQzMiBkZWNvbXByZXNzU2xvcCkiKX0sCisgICAgeyJEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjQmVnaW5JbnRlcnJ1cHRTYWZlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQ29kZWNDb21wb25lbnQgZGMsIHVuc2lnbmVkIGxvbmcgbWF4U3JjU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNFbmRJbnRlcnJ1cHRTYWZlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQ29kZWNDb21wb25lbnQgZGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIR2V0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgaCwgbG9uZyBoT2Zmc2V0LCBsb25nIG9mZnNldCwgbG9uZyBzaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSFB1dERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQdXREYXRhLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGgsIGxvbmcgaE9mZnNldCwgbG9uZyBzaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBvZmZzZXQpIil9LAorICAgIHsiRGF0YUhGbHVzaERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhGbHVzaERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSE9wZW5Gb3JXcml0ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSE9wZW5Gb3JXcml0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIQ2xvc2VGb3JXcml0ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENsb3NlRm9yV3JpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSE9wZW5Gb3JSZWFkIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIT3BlbkZvclJlYWQsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSENsb3NlRm9yUmVhZCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENsb3NlRm9yUmVhZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIU2V0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldERhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgZGF0YVJlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXREYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZikiKX0sCisgICAgeyJEYXRhSENvbXBhcmVEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ29tcGFyZURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgZGF0YVJlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZXF1YWwpIil9LAorICAgIHsiRGF0YUhUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIVGFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIRmluaXNoRGF0YSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEZpbmlzaERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBQdHIgUGxhY2VUb1B1dERhdGFQdHIsIEJvb2xlYW4gQ2FuY2VsKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEZsdXNoQ2FjaGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhGbHVzaENhY2hlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhSZXNvbHZlRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFJlc29sdmVEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIHRoZURhdGFSZWYsIEJvb2xlYW4gdXNlckludGVyZmFjZUFsbG93ZWQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAorICAgIHsiRGF0YUhHZXRGaWxlU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZpbGVTaXplLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmlsZVNpemUpIil9LAorICAgIHsiRGF0YUhDYW5Vc2VEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ2FuVXNlRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyB1c2VGbGFncykiKX0sCisgICAgeyJEYXRhSFByZWV4dGVuZCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFByZWV4dGVuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIHVuc2lnbmVkIGxvbmcgbWF4VG9BZGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHNwYWNlQWRkZWQpIil9LAorICAgIHsiRGF0YUhTZXRGaWxlU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldEZpbGVTaXplLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmaWxlU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRGcmVlU3BhY2UiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGcmVlU3BhY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBmcmVlU2l6ZSkiKX0sCisgICAgeyJEYXRhSENyZWF0ZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDcmVhdGVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIGNyZWF0b3IsIEJvb2xlYW4gZGVsZXRlRXhpc3RpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIR2V0UHJlZmVycmVkQmxvY2tTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0UHJlZmVycmVkQmxvY2tTaXplLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYmxvY2tTaXplKSIpfSwKKyAgICB7IkRhdGFIR2V0RGV2aWNlSW5kZXgiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREZXZpY2VJbmRleCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRldmljZUluZGV4KSIpfSwKKyAgICB7IkRhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB5ZXMpIil9LAorICAgIHsiRGF0YUhHZXREYXRhSW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhSW5CdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIHN0YXJ0T2Zmc2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzaXplKSIpfSwKKyAgICB7IkRhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRTY2hlZHVsZUFoZWFkVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1pbGxpc2VjcykiKX0sCisgICAgeyJEYXRhSFNldENhY2hlU2l6ZUxpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0Q2FjaGVTaXplTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBTaXplIGNhY2hlU2l6ZUxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldENhY2hlU2l6ZUxpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0Q2FjaGVTaXplTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2l6ZSBjYWNoZVNpemVMaW1pdCkiKX0sCisgICAgeyJEYXRhSEdldE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0TW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgTW92aWUgdGhlTW92aWUsIHNob3J0IGlkKSIpfSwKKyAgICB7IkRhdGFIQWRkTW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhBZGRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE1vdmllIHRoZU1vdmllKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgaWQpIil9LAorICAgIHsiRGF0YUhVcGRhdGVNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFVwZGF0ZU1vdmllLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgTW92aWUgdGhlTW92aWUsIHNob3J0IGlkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSERvZXNCdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhEb2VzQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gYnVmZmVyc1JlYWRzLCBCb29sZWFuIGJ1ZmZlcnNXcml0ZXMpIil9LAorICAgIHsiRGF0YUhHZXRGaWxlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZpbGVOYW1lLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgU3RyMjU1IHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRBdmFpbGFibGVGaWxlU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmlsZVNpemUpIil9LAorICAgIHsiRGF0YUhHZXRNYWNPU0ZpbGVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0TWFjT1NGaWxlVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZVR5cGUpIil9LAorICAgIHsiRGF0YUhHZXRNSU1FVHlwZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldE1JTUVUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgU3RyMjU1IG1pbWVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSFNldERhdGFSZWZXaXRoQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RGF0YVJlZldpdGhBbmNob3IsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgYW5jaG9yRGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBIYW5kbGUgZGF0YVJlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXREYXRhUmVmV2l0aEFuY2hvciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGFuY2hvckRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmKSIpfSwKKyAgICB7IkRhdGFIU2V0TWFjT1NGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldE1hY09TRmlsZVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgZmlsZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIU2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFRpbWVCYXNlIHRiKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldEluZm9GbGFncyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEluZm9GbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgZmxhZ3MpIil9LAorICAgIHsiRGF0YUhHZXRGaWxlU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZVNpemU2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIGZpbGVTaXplKSIpfSwKKyAgICB7IkRhdGFIUHJlZXh0ZW5kNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQcmVleHRlbmQ2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIHdpZGUgbWF4VG9BZGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIHNwYWNlQWRkZWQpIil9LAorICAgIHsiRGF0YUhTZXRGaWxlU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RmlsZVNpemU2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIHdpZGUgZmlsZVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIR2V0RnJlZVNwYWNlNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGcmVlU3BhY2U2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIGZyZWVTaXplKSIpfSwKKyAgICB7IkRhdGFIQXBwZW5kNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhBcHBlbmQ2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIHZvaWQgKiBkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIGZpbGVPZmZzZXQpIil9LAorICAgIHsiRGF0YUhQb2xsUmVhZCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFBvbGxSZWFkLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgdm9pZCAqIGRhdGFQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgZGF0YVNpemVTb0ZhcikiKX0sCisgICAgeyJEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhQXZhaWxhYmlsaXR5LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBvZmZzZXQsIGxvbmcgbGVuKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaXNzaW5nX29mZnNldCwgbG9uZyBtaXNzaW5nX2xlbikiKX0sCisgICAgeyJEYXRhSEdldERhdGFSZWZBc1R5cGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmQXNUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIHJlcXVlc3RlZFR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZikiKX0sCisgICAgeyJEYXRhSFNldERhdGFSZWZFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGV4dGVuc2lvbiwgT1NUeXBlIGlkVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJlZkV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSBpZFR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZXh0ZW5zaW9uKSIpfSwKKyAgICB7IkRhdGFIR2V0TW92aWVXaXRoRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNb3ZpZVdpdGhGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIHNob3J0IGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgTW92aWUgdGhlTW92aWUsIHNob3J0IGlkKSIpfSwKKyAgICB7IkRhdGFIR2V0RmlsZVR5cGVPcmRlcmluZyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZpbGVUeXBlT3JkZXJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRGF0YUhGaWxlVHlwZU9yZGVyaW5nSGFuZGxlIG9yZGVyaW5nTGlzdEhhbmRsZSkiKX0sCisgICAgeyJEYXRhSENyZWF0ZUZpbGVXaXRoRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIGNyZWF0b3IsIEJvb2xlYW4gZGVsZXRlRXhpc3RpbmcsIFVJbnQzMiBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSB3aGF0LCB2b2lkICogaW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhTZXRJZGxlTWFuYWdlciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldElkbGVNYW5hZ2VyLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSWRsZU1hbmFnZXIgaW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIRGVsZXRlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSERlbGV0ZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSFNldE1vdmllVXNhZ2VGbGFncyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldE1vdmllVXNhZ2VGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIR2V0VGVtcG9yYXJ5RGF0YVJlZkNhcGFiaWxpdGllcyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBvdXRVbmRlcnN0b29kRmxhZ3MpIil9LAorICAgIHsiRGF0YUhSZW5hbWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUmVuYW1lRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBuZXdEYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSFBsYXliYWNrSGludHMiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQbGF5YmFja0hpbnRzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBtaW5GaWxlT2Zmc2V0LCB1bnNpZ25lZCBsb25nIG1heEZpbGVPZmZzZXQsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIUGxheWJhY2tIaW50czY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUGxheWJhY2tIaW50czY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmbGFncywgd2lkZSBtaW5GaWxlT2Zmc2V0LCB3aWRlIG1heEZpbGVPZmZzZXQsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIR2V0RGF0YVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKKyAgICB7IkRhdGFIU2V0VGltZUhpbnRzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0VGltZUhpbnRzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmbGFncywgbG9uZyBiYW5kd2lkdGhQcmlvcml0eSwgVGltZVNjYWxlIHNjYWxlLCBUaW1lVmFsdWUgbWluVGltZSwgVGltZVZhbHVlIG1heFRpbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0TWF4U3JjUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WREdldE1heFNyY1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0ZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgbWF4U3JjUmVjdCkiKX0sCisgICAgeyJWREdldEFjdGl2ZVNyY1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRBY3RpdmVTcmNSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgaW5wdXRTdGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGFjdGl2ZVNyY1JlY3QpIil9LAorICAgIHsiVkRTZXREaWdpdGl6ZXJSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RGlnaXRpemVyUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGRpZ2l0aXplclJlY3QpIil9LAorICAgIHsiVkRHZXREaWdpdGl6ZXJSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RGlnaXRpemVyUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGRpZ2l0aXplclJlY3QpIil9LAorICAgIHsiVkRHZXRWQmxhbmtSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0VkJsYW5rUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0U3RkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCB2QmxhbmtSZWN0KSIpfSwKKyAgICB7IlZER2V0TWFza1BpeE1hcCIsIChQeUNGdW5jdGlvbilRdF9WREdldE1hc2tQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBQaXhNYXBIYW5kbGUgbWFza1BpeE1hcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRVc2VUaGlzQ0xVVCIsIChQeUNGdW5jdGlvbilRdF9WRFVzZVRoaXNDTFVULCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQ1RhYkhhbmRsZSBjb2xvclRhYmxlSGFuZGxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldElucHV0R2FtbWFWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldElucHV0R2FtbWFWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEZpeGVkIGNoYW5uZWwxLCBGaXhlZCBjaGFubmVsMiwgRml4ZWQgY2hhbm5lbDMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0SW5wdXRHYW1tYVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXRHYW1tYVZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEZpeGVkIGNoYW5uZWwxLCBGaXhlZCBjaGFubmVsMiwgRml4ZWQgY2hhbm5lbDMpIil9LAorICAgIHsiVkRTZXRCcmlnaHRuZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0QnJpZ2h0bmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzKSIpfSwKKyAgICB7IlZER2V0QnJpZ2h0bmVzcyIsIChQeUNGdW5jdGlvbilRdF9WREdldEJyaWdodG5lc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzcykiKX0sCisgICAgeyJWRFNldENvbnRyYXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q29udHJhc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgY29udHJhc3QpIil9LAorICAgIHsiVkRTZXRIdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRIdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgaHVlKSIpfSwKKyAgICB7IlZEU2V0U2hhcnBuZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0U2hhcnBuZXNzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzcykiKX0sCisgICAgeyJWRFNldFNhdHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRTYXR1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb24pIil9LAorICAgIHsiVkRHZXRDb250cmFzdCIsIChQeUNGdW5jdGlvbilRdF9WREdldENvbnRyYXN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0KSIpfSwKKyAgICB7IlZER2V0SHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGh1ZSkiKX0sCisgICAgeyJWREdldFNoYXJwbmVzcyIsIChQeUNGdW5jdGlvbilRdF9WREdldFNoYXJwbmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3MpIil9LAorICAgIHsiVkRHZXRTYXR1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U2F0dXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uKSIpfSwKKyAgICB7IlZER3JhYk9uZUZyYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER3JhYk9uZUZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRNYXhBdXhCdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRNYXhBdXhCdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGl4TWFwSGFuZGxlIHBtLCBSZWN0IHIpIil9LAorICAgIHsiVkRHZXRDdXJyZW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDdXJyZW50RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbnB1dEN1cnJlbnRGbGFnLCBsb25nIG91dHB1dEN1cnJlbnRGbGFnKSIpfSwKKyAgICB7IlZEU2V0S2V5Q29sb3IiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRLZXlDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0S2V5Q29sb3IiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRLZXlDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGluZGV4KSIpfSwKKyAgICB7IlZEQWRkS2V5Q29sb3IiLCAoUHlDRnVuY3Rpb24pUXRfVkRBZGRLZXlDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGluZGV4KSIpfSwKKyAgICB7IlZER2V0TmV4dEtleUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TmV4dEtleUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXRLZXlDb2xvclJhbmdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0S2V5Q29sb3JSYW5nZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciBtaW5SR0IsIFJHQkNvbG9yIG1heFJHQikiKX0sCisgICAgeyJWREdldEtleUNvbG9yUmFuZ2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRLZXlDb2xvclJhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIG1pblJHQiwgUkdCQ29sb3IgbWF4UkdCKSIpfSwKKyAgICB7IlZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldElucHV0Q29sb3JTcGFjZU1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBjb2xvclNwYWNlTW9kZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXRDb2xvclNwYWNlTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBjb2xvclNwYWNlTW9kZSkiKX0sCisgICAgeyJWRFNldENsaXBTdGF0ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldENsaXBTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGNsaXBFbmFibGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0Q2xpcFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q2xpcFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGNsaXBFbmFibGUpIil9LAorICAgIHsiVkRTZXRDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q2xpcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFJnbkhhbmRsZSBjbGlwUmVnaW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRENsZWFyQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilRdF9WRENsZWFyQ2xpcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFJnbkhhbmRsZSBjbGlwUmVnaW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldENMVVRJblVzZSIsIChQeUNGdW5jdGlvbilRdF9WREdldENMVVRJblVzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDVGFiSGFuZGxlIGNvbG9yVGFibGVIYW5kbGUpIil9LAorICAgIHsiVkRTZXRQTExGaWx0ZXJUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UExMRmlsdGVyVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IHBsbFR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0UExMRmlsdGVyVHlwZSIsIChQeUNGdW5jdGlvbilRdF9WREdldFBMTEZpbHRlclR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgcGxsVHlwZSkiKX0sCisgICAgeyJWREdldE1hc2thbmRWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldE1hc2thbmRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHVuc2lnbmVkIHNob3J0IGJsZW5kTGV2ZWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1hc2ssIGxvbmcgdmFsdWUpIil9LAorICAgIHsiVkRTZXRNYXN0ZXJCbGVuZExldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0TWFzdGVyQmxlbmRMZXZlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBibGVuZExldmVsKSIpfSwKKyAgICB7IlZEU2V0UGxheVRocnVPbk9mZiIsIChQeUNGdW5jdGlvbilRdF9WRFNldFBsYXlUaHJ1T25PZmYsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBzdGF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXRGaWVsZFByZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRGaWVsZFByZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBmaWVsZEZsYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0RmllbGRQcmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RmllbGRQcmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGZpZWxkRmxhZykiKX0sCisgICAgeyJWRFByZWZsaWdodEdsb2JhbFJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRQcmVmbGlnaHRHbG9iYWxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgR3JhZlB0ciB0aGVXaW5kb3cpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGdsb2JhbFJlY3QpIil9LAorICAgIHsiVkRTZXRQbGF5VGhydUdsb2JhbFJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRQbGF5VGhydUdsb2JhbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBHcmFmUHRyIHRoZVdpbmRvdykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZ2xvYmFsUmVjdCkiKX0sCisgICAgeyJWRFNldEJsYWNrTGV2ZWxWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEJsYWNrTGV2ZWxWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsKSIpfSwKKyAgICB7IlZER2V0QmxhY2tMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0QmxhY2tMZXZlbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWwpIil9LAorICAgIHsiVkRTZXRXaGl0ZUxldmVsVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRXaGl0ZUxldmVsVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgd2hpdGVMZXZlbCkiKX0sCisgICAgeyJWREdldFdoaXRlTGV2ZWxWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldFdoaXRlTGV2ZWxWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsKSIpfSwKKyAgICB7IlZER2V0VmlkZW9EZWZhdWx0cyIsIChQeUNGdW5jdGlvbilRdF9WREdldFZpZGVvRGVmYXVsdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbCwgdW5zaWduZWQgc2hvcnQgd2hpdGVMZXZlbCwgdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzcywgdW5zaWduZWQgc2hvcnQgaHVlLCB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uLCB1bnNpZ25lZCBzaG9ydCBjb250cmFzdCwgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzKSIpfSwKKyAgICB7IlZER2V0TnVtYmVyT2ZJbnB1dHMiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXROdW1iZXJPZklucHV0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpbnB1dHMpIil9LAorICAgIHsiVkRHZXRJbnB1dEZvcm1hdCIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0Rm9ybWF0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgaW5wdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBmb3JtYXQpIil9LAorICAgIHsiVkRTZXRJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9WRFNldElucHV0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgaW5wdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0SW5wdXQiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpbnB1dCkiKX0sCisgICAgeyJWRFNldElucHV0U3RhbmRhcmQiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRJbnB1dFN0YW5kYXJkLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgaW5wdXRTdGFuZGFyZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXR1cEJ1ZmZlcnMiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXR1cEJ1ZmZlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBWZGlnQnVmZmVyUmVjTGlzdEhhbmRsZSBidWZmZXJMaXN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdyYWJPbmVGcmFtZUFzeW5jIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER3JhYk9uZUZyYW1lQXN5bmMsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBidWZmZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZERG9uZSIsIChQeUNGdW5jdGlvbilRdF9WRERvbmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBidWZmZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEU2V0Q29tcHJlc3Npb24iLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDb21wcmVzc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIE9TVHlwZSBjb21wcmVzc1R5cGUsIHNob3J0IGRlcHRoLCBDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIGxvbmcga2V5RnJhbWVSYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBib3VuZHMpIil9LAorICAgIHsiVkRDb21wcmVzc09uZUZyYW1lQXN5bmMiLCAoUHlDRnVuY3Rpb24pUXRfVkRDb21wcmVzc09uZUZyYW1lQXN5bmMsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldEltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbWFnZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZSIsIChQeUNGdW5jdGlvbilRdF9WRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEU2V0Q29tcHJlc3Npb25Pbk9mZiIsIChQeUNGdW5jdGlvbilRdF9WRFNldENvbXByZXNzaW9uT25PZmYsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBCb29sZWFuIHN0YXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldENvbXByZXNzaW9uVHlwZXMiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDb21wcmVzc2lvblR5cGVzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgVkRDb21wcmVzc2lvbkxpc3RIYW5kbGUgaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFRpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgVGltZUJhc2UgdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXRGcmFtZVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRGcmFtZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBGaXhlZCBmcmFtZXNQZXJTZWNvbmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0RGF0YVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXREYXRhUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1pbGxpU2VjUGVyRnJhbWUsIEZpeGVkIGZyYW1lc1BlclNlY29uZCwgbG9uZyBieXRlc1BlclNlY29uZCkiKX0sCisgICAgeyJWREdldFNvdW5kSW5wdXREcml2ZXIiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRTb3VuZElucHV0RHJpdmVyLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgU3RyMjU1IHNvdW5kRHJpdmVyTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRETUFEZXB0aHMiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRETUFEZXB0aHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkZXB0aEFycmF5LCBsb25nIHByZWZlcnJlZERlcHRoKSIpfSwKKyAgICB7IlZER2V0UHJlZmVycmVkVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0UHJlZmVycmVkVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVTY2FsZSBwcmVmZXJyZWQpIil9LAorICAgIHsiVkRSZWxlYXNlQXN5bmNCdWZmZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEUmVsZWFzZUFzeW5jQnVmZmVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEU2V0RGF0YVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXREYXRhUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0VGltZUNvZGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRUaW1lQ29kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHZvaWQgKiB0aW1lQ29kZUZvcm1hdCwgdm9pZCAqIHRpbWVDb2RlVGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVSZWNvcmQgYXRUaW1lKSIpfSwKKyAgICB7IlZEVXNlU2FmZUJ1ZmZlcnMiLCAoUHlDRnVuY3Rpb24pUXRfVkRVc2VTYWZlQnVmZmVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEJvb2xlYW4gdXNlU2FmZUJ1ZmZlcnMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0U291bmRJbnB1dFNvdXJjZSIsIChQeUNGdW5jdGlvbilRdF9WREdldFNvdW5kSW5wdXRTb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIHZpZGVvSW5wdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNvdW5kSW5wdXQpIil9LAorICAgIHsiVkRHZXRDb21wcmVzc2lvblRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDb21wcmVzc2lvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBPU1R5cGUgY29tcHJlc3Npb25UeXBlLCBzaG9ydCBkZXB0aCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3Qgc3JjUmVjdCwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCB1bnNpZ25lZCBsb25nIGNvbXByZXNzVGltZSkiKX0sCisgICAgeyJWRFNldFByZWZlcnJlZFBhY2tldFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRQcmVmZXJyZWRQYWNrZXRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIHdpZHRoLCBsb25nIGhlaWdodCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyB3aWR0aCwgbG9uZyBoZWlnaHQpIil9LAorICAgIHsiVkRHZXRJbnB1dE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIHZpZGVvSW5wdXQsIFN0cjI1NSBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldERlc3RpbmF0aW9uUG9ydCIsIChQeUNGdW5jdGlvbilRdF9WRFNldERlc3RpbmF0aW9uUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIENHcmFmUHRyIGRlc3RQb3J0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldERldmljZU5hbWVBbmRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9WREdldERldmljZU5hbWVBbmRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFN0cjI1NSBvdXROYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIG91dE5hbWVGbGFncykiKX0sCisgICAgeyJWRENhcHR1cmVTdGF0ZUNoYW5naW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEQ2FwdHVyZVN0YXRlQ2hhbmdpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBVSW50MzIgaW5TdGF0ZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJYTUxQYXJzZUdldERldGFpbGVkUGFyc2VFcnJvciIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUdldERldGFpbGVkUGFyc2VFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgU3RyaW5nUHRyIGVyckRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGVycm9yTGluZSkiKX0sCisgICAgeyJYTUxQYXJzZUFkZEVsZW1lbnQiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGRFbGVtZW50LCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgbmFtZVNwYWNlSUQsIGxvbmcgZWxlbWVudEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBlbGVtZW50TmFtZSwgVUludDMyIGVsZW1lbnRJRCkiKX0sCisgICAgeyJYTUxQYXJzZUFkZEF0dHJpYnV0ZSIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIGVsZW1lbnRJRCwgVUludDMyIG5hbWVTcGFjZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBhdHRyaWJ1dGVOYW1lLCBVSW50MzIgYXR0cmlidXRlSUQpIil9LAorICAgIHsiWE1MUGFyc2VBZGRNdWx0aXBsZUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGRNdWx0aXBsZUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBlbGVtZW50SUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgbmFtZVNwYWNlSURzLCBjaGFyIGF0dHJpYnV0ZU5hbWVzLCBVSW50MzIgYXR0cmlidXRlSURzKSIpfSwKKyAgICB7IlhNTFBhcnNlQWRkQXR0cmlidXRlQW5kVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGRBdHRyaWJ1dGVBbmRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIGVsZW1lbnRJRCwgVUludDMyIG5hbWVTcGFjZUlELCBVSW50MzIgYXR0cmlidXRlVmFsdWVLaW5kLCB2b2lkICogYXR0cmlidXRlVmFsdWVLaW5kSW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgYXR0cmlidXRlTmFtZSwgVUludDMyIGF0dHJpYnV0ZUlEKSIpfSwKKyAgICB7IlhNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElELCBVSW50MzIgYXR0cmlidXRlSUQsIFVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQsIHZvaWQgKiBhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJYTUxQYXJzZUFkZE5hbWVTcGFjZSIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZE5hbWVTcGFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgbmFtZVNwYWNlVVJMLCBVSW50MzIgbmFtZVNwYWNlSUQpIil9LAorICAgIHsiWE1MUGFyc2VTZXRPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZVNldE9mZnNldEFuZExpbWl0LCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgb2Zmc2V0LCBVSW50MzIgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlhNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIGxvbmcgcmVmY29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0luaXRpYWxpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dJbml0aWFsaXplLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0RGF0YU91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1NldERhdGFPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgRlNTcGVjIG1vdmllRmlsZSwgbG9uZyB3aGVyZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldERhdGFPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhT3V0cHV0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEZTU3BlYyBtb3ZpZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHdoZXJlRmxhZ3MpIil9LAorICAgIHsiU0dTZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgQ0dyYWZQdHIgZ3AsIEdESGFuZGxlIGdkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9TR0dldEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ0dyYWZQdHIgZ3AsIEdESGFuZGxlIGdkKSIpfSwKKyAgICB7IlNHTmV3Q2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR05ld0NoYW5uZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgT1NUeXBlIGNoYW5uZWxUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dDaGFubmVsIHJlZikiKX0sCisgICAgeyJTR0Rpc3Bvc2VDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHRGlzcG9zZUNoYW5uZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU3RhcnRQcmV2aWV3IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU3RhcnRQcmV2aWV3LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU3RhcnRSZWNvcmQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTdGFydFJlY29yZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0lkbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dJZGxlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU3RvcCIsIChQeUNGdW5jdGlvbilRdF9TR1N0b3AsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQYXVzZSIsIChQeUNGdW5jdGlvbilRdF9TR1BhdXNlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEJvb2xlYW4gcGF1c2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUHJlcGFyZSIsIChQeUNGdW5jdGlvbilRdF9TR1ByZXBhcmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgQm9vbGVhbiBwcmVwYXJlRm9yUHJldmlldywgQm9vbGVhbiBwcmVwYXJlRm9yUmVjb3JkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1JlbGVhc2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dSZWxlYXNlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0TW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoTW92aWUgX3J2KSIpfSwKKyAgICB7IlNHU2V0TWF4aW11bVJlY29yZFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRNYXhpbXVtUmVjb3JkVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCB1bnNpZ25lZCBsb25nIHRpY2tzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldE1heGltdW1SZWNvcmRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TWF4aW11bVJlY29yZFRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgdGlja3MpIil9LAorICAgIHsiU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmciLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgYnl0ZXMpIil9LAorICAgIHsiU0dHZXRUaW1lUmVtYWluaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VGltZVJlbWFpbmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyB0aWNrc0xlZnQpIil9LAorICAgIHsiU0dHcmFiUGljdCIsIChQeUNGdW5jdGlvbilRdF9TR0dyYWJQaWN0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFJlY3QgYm91bmRzLCBzaG9ydCBvZmZzY3JlZW5EZXB0aCwgbG9uZyBncmFiUGljdEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGljSGFuZGxlIHApIil9LAorICAgIHsiU0dHZXRMYXN0TW92aWVSZXNJRCIsIChQeUNGdW5jdGlvbilRdF9TR0dldExhc3RNb3ZpZVJlc0lELCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCByZXNJRCkiKX0sCisgICAgeyJTR1NldEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgbG9uZyBzZ0ZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2dGbGFncykiKX0sCisgICAgeyJTR05ld0NoYW5uZWxGcm9tQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgQ29tcG9uZW50IHNnQ2hhbm5lbENvbXBvbmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHQ2hhbm5lbCBuZXdDaGFubmVsKSIpfSwKKyAgICB7IlNHU2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBVc2VyRGF0YSB1ZCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVc2VyRGF0YSB1ZCkiKX0sCisgICAgeyJTR0dldEluZENoYW5uZWwiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRJbmRDaGFubmVsLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIHNob3J0IGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dDaGFubmVsIHJlZiwgT1NUeXBlIGNoYW5UeXBlKSIpfSwKKyAgICB7IlNHVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHVXBkYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFJnbkhhbmRsZSB1cGRhdGVSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0UGF1c2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRQYXVzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBwYXVzZWQpIil9LAorICAgIHsiU0dTZXRDaGFubmVsU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsU2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFVzZXJEYXRhIHVkLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldENoYW5uZWxTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVzZXJEYXRhIHVkKSIpfSwKKyAgICB7IlNHR2V0TW9kZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldE1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gcHJldmlld01vZGUsIEJvb2xlYW4gcmVjb3JkTW9kZSkiKX0sCisgICAgeyJTR1NldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgd2hlcmVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXREYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyB3aGVyZUZsYWdzKSIpfSwKKyAgICB7IlNHTmV3T3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHTmV3T3V0cHV0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgd2hlcmVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHT3V0cHV0IHNnT3V0KSIpfSwKKyAgICB7IlNHRGlzcG9zZU91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR0Rpc3Bvc2VPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0T3V0cHV0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRPdXRwdXRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgbG9uZyB3aGVyZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldENoYW5uZWxPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsT3V0cHV0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc3BhY2UpIil9LAorICAgIHsiU0dIYW5kbGVVcGRhdGVFdmVudCIsIChQeUNGdW5jdGlvbilRdF9TR0hhbmRsZVVwZGF0ZUV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEV2ZW50UmVjb3JkIGV2ZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBoYW5kbGVkKSIpfSwKKyAgICB7IlNHU2V0T3V0cHV0TmV4dE91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1NldE91dHB1dE5leHRPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQsIFNHT3V0cHV0IG5leHRPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0T3V0cHV0TmV4dE91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR0dldE91dHB1dE5leHRPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR091dHB1dCBuZXh0T3V0KSIpfSwKKyAgICB7IlNHU2V0T3V0cHV0TWF4aW11bU9mZnNldCIsIChQeUNGdW5jdGlvbilRdF9TR1NldE91dHB1dE1heGltdW1PZmZzZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQsIHdpZGUgbWF4T2Zmc2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldE91dHB1dE1heGltdW1PZmZzZXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBtYXhPZmZzZXQpIil9LAorICAgIHsiU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIil9LAorICAgIHsiU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHV3JpdGVFeHRlbmRlZE1vdmllRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgUHRyIHAsIGxvbmcgbGVuKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIFNHT3V0cHV0IHNnT3V0KSIpfSwKKyAgICB7IlNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBieXRlcykiKX0sCisgICAgeyJTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NCIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgc3BhY2UpIil9LAorICAgIHsiU0dXcml0ZU1vdmllRGF0YSIsIChQeUNGdW5jdGlvbilRdF9TR1dyaXRlTW92aWVEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBQdHIgcCwgbG9uZyBsZW4pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG9mZnNldCkiKX0sCisgICAgeyJTR0dldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVCYXNlIHRiKSIpfSwKKyAgICB7IlNHQWRkTW92aWVEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQWRkTW92aWVEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBQdHIgcCwgbG9uZyBsZW4sIGxvbmcgY2hSZWZDb24sIFRpbWVWYWx1ZSB0aW1lLCBzaG9ydCB3cml0ZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG9mZnNldCkiKX0sCisgICAgeyJTR0NoYW5nZWRTb3VyY2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFuZ2VkU291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0FkZEV4dGVuZGVkTW92aWVEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQWRkRXh0ZW5kZWRNb3ZpZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbiwgbG9uZyBjaFJlZkNvbiwgVGltZVZhbHVlIHRpbWUsIHNob3J0IHdyaXRlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCBTR091dHB1dCB3aGljaE91dHB1dCkiKX0sCisgICAgeyJTR0FkZE91dHB1dERhdGFSZWZUb01lZGlhIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQWRkT3V0cHV0RGF0YVJlZlRvTWVkaWEsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQsIE1lZGlhIHRoZU1lZGlhLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldFNldHRpbmdzU3VtbWFyeSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNldHRpbmdzU3VtbWFyeSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBIYW5kbGUgc3VtbWFyeVRleHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbFVzYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFVzYWdlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyB1c2FnZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsVXNhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsVXNhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyB1c2FnZSkiKX0sCisgICAgeyJTR1NldENoYW5uZWxCb3VuZHMiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgUmVjdCBib3VuZHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbEJvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBib3VuZHMpIil9LAorICAgIHsiU0dTZXRDaGFubmVsVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IHZvbHVtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCB2b2x1bWUpIil9LAorICAgIHsiU0dHZXRDaGFubmVsSW5mbyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgY2hhbm5lbEluZm8pIil9LAorICAgIHsiU0dTZXRDaGFubmVsUGxheUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFBsYXlGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgcGxheUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldENoYW5uZWxQbGF5RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsUGxheUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcGxheUZsYWdzKSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbE1heEZyYW1lcyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxNYXhGcmFtZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIGZyYW1lQ291bnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbE1heEZyYW1lcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxNYXhGcmFtZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmcmFtZUNvdW50KSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxSZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHJlZkNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRDaGFubmVsQ2xpcCIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgUmduSGFuZGxlIHRoZUNsaXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsQ2xpcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgdGhlQ2xpcCkiKX0sCisgICAgeyJTR0dldENoYW5uZWxTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxTYW1wbGVEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEhhbmRsZSBzYW1wbGVEZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldENoYW5uZWxEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyaW5nUHRyIG5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVNjYWxlIHNjYWxlKSIpfSwKKyAgICB7IlNHQ2hhbm5lbFB1dFBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsUHV0UGljdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHQ2hhbm5lbFNldFJlcXVlc3RlZERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbFNldFJlcXVlc3RlZERhdGFSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dDaGFubmVsR2V0UmVxdWVzdGVkRGF0YVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsR2V0UmVxdWVzdGVkRGF0YVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBieXRlc1BlclNlY29uZCkiKX0sCisgICAgeyJTR0NoYW5uZWxTZXREYXRhU291cmNlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxTZXREYXRhU291cmNlTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cjI1NSBuYW1lLCBTY3JpcHRDb2RlIHNjcmlwdFRhZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dDaGFubmVsR2V0RGF0YVNvdXJjZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsR2V0RGF0YVNvdXJjZU5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHIyNTUgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSIpfSwKKyAgICB7IlNHQ2hhbm5lbFNldENvZGVjU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEhhbmRsZSBzZXR0aW5ncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dDaGFubmVsR2V0Q29kZWNTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxHZXRDb2RlY1NldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBzZXR0aW5ncykiKX0sCisgICAgeyJTR0dldENoYW5uZWxUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lQmFzZSB0YikiKX0sCisgICAgeyJTR0dldENoYW5uZWxSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsUmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uKSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsRGV2aWNlQW5kSW5wdXROYW1lcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cjI1NSBvdXREZXZpY2VOYW1lLCBTdHIyNTUgb3V0SW5wdXROYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgb3V0SW5wdXROdW1iZXIpIil9LAorICAgIHsiU0dTZXRDaGFubmVsRGV2aWNlSW5wdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsRGV2aWNlSW5wdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBpbklucHV0TnVtYmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmciLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsU2V0dGluZ3NTdGF0ZUNoYW5naW5nLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgVUludDMyIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHSW5pdENoYW5uZWwiLCAoUHlDRnVuY3Rpb24pUXRfU0dJbml0Q2hhbm5lbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFNlcUdyYWJDb21wb25lbnQgb3duZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHV3JpdGVTYW1wbGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHV3JpdGVTYW1wbGVzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgTW92aWUgbSwgQWxpYXNIYW5kbGUgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIil9LAorICAgIHsiU0dBbGlnbkNoYW5uZWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQWxpZ25DaGFubmVsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHIpIil9LAorICAgIHsiU0dQYW5lbEdldERpdGwiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEdldERpdGwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkaXRsKSIpfSwKKyAgICB7IlNHUGFuZWxHZXRUaXRsZSIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsR2V0VGl0bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU3RyMjU1IHRpdGxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsQ2FuUnVuIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxDYW5SdW4sIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUGFuZWxJbnN0YWxsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxJbnN0YWxsLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBEaWFsb2dQdHIgZCwgc2hvcnQgaXRlbU9mZnNldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQYW5lbEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgRGlhbG9nUHRyIGQsIHNob3J0IGl0ZW1PZmZzZXQsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgaXRlbUhpdCwgQm9vbGVhbiBoYW5kbGVkKSIpfSwKKyAgICB7IlNHUGFuZWxJdGVtIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBEaWFsb2dQdHIgZCwgc2hvcnQgaXRlbU9mZnNldCwgc2hvcnQgaXRlbU51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQYW5lbFJlbW92ZSIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsUmVtb3ZlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBEaWFsb2dQdHIgZCwgc2hvcnQgaXRlbU9mZnNldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQYW5lbFNldEdyYWJiZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFNldEdyYWJiZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU2VxR3JhYkNvbXBvbmVudCBzZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQYW5lbFNldFJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFNldFJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgc2hvcnQgcmVzUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsR2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEdldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVXNlckRhdGEgdWQpIil9LAorICAgIHsiU0dQYW5lbFNldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxTZXRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgVXNlckRhdGEgdWQsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUGFuZWxWYWxpZGF0ZUlucHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxWYWxpZGF0ZUlucHV0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIG9rKSIpfSwKKyAgICB7IlNHUGFuZWxHZXRESVRMRm9yU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsR2V0RElUTEZvclNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkaXRsLCBQb2ludCByZXF1ZXN0ZWRTaXplKSIpfSwKKyAgICB7IlNHR2V0U3JjVmlkZW9Cb3VuZHMiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTcmNWaWRlb0JvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHIpIil9LAorICAgIHsiU0dTZXRWaWRlb1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRWaWRlb1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBSZWN0IHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0VmlkZW9SZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VmlkZW9SZWN0LCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcikiKX0sCisgICAgeyJTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb0NvbXByZXNzb3JUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBjb21wcmVzc29yVHlwZSkiKX0sCisgICAgeyJTR1NldFZpZGVvQ29tcHJlc3NvclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgT1NUeXBlIGNvbXByZXNzb3JUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldFZpZGVvQ29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvQ29tcHJlc3NvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGRlcHRoLCBDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3IsIENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgbG9uZyBrZXlGcmFtZVJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0VmlkZW9Db21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VmlkZW9Db21wcmVzc29yLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGRlcHRoLCBDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3IsIENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgbG9uZyBrZXlGcmFtZVJhdGUpIil9LAorICAgIHsiU0dHZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilRdF9TR0dldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCisgICAgeyJTR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBDb21wb25lbnRJbnN0YW5jZSB2ZGlnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9TR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR3JhYkZyYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR3JhYkZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgYnVmZmVyTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dyYWJGcmFtZUNvbXBsZXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR3JhYkZyYW1lQ29tcGxldGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBidWZmZXJOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGRvbmUpIil9LAorICAgIHsiU0dDb21wcmVzc0ZyYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ29tcHJlc3NGcmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRDb21wcmVzc0J1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9TR1NldENvbXByZXNzQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgZGVwdGgsIFJlY3QgY29tcHJlc3NTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldENvbXByZXNzQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q29tcHJlc3NCdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZGVwdGgsIFJlY3QgY29tcHJlc3NTaXplKSIpfSwKKyAgICB7IlNHR2V0QnVmZmVySW5mbyIsIChQeUNGdW5jdGlvbilRdF9TR0dldEJ1ZmZlckluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBidWZmZXJOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaXhNYXBIYW5kbGUgYnVmZmVyUE0sIFJlY3QgYnVmZmVyUmVjdCwgR1dvcmxkUHRyIGNvbXByZXNzQnVmZmVyLCBSZWN0IGNvbXByZXNzQnVmZmVyUmVjdCkiKX0sCisgICAgeyJTR1NldFVzZVNjcmVlbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9TR1NldFVzZVNjcmVlbkJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEJvb2xlYW4gdXNlU2NyZWVuQnVmZmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFVzZVNjcmVlbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9TR0dldFVzZVNjcmVlbkJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcikiKX0sCisgICAgeyJTR1NldEZyYW1lUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldEZyYW1lUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEZpeGVkIGZyYW1lUmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRGcmFtZVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRGcmFtZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgZnJhbWVSYXRlKSIpfSwKKyAgICB7IlNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFByZWZlcnJlZFBhY2tldFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFByZWZlcnJlZFBhY2tldFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRQcmVmZXJyZWRQYWNrZXRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpIil9LAorICAgIHsiU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCIsIChQeUNGdW5jdGlvbilRdF9TR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIGNvbXByZXNzb3JUeXBlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCIsIChQeUNGdW5jdGlvbilRdF9TR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBjb21wcmVzc29yVHlwZXMpIil9LAorICAgIHsiU0dTZXRTb3VuZElucHV0RHJpdmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U291bmRJbnB1dERyaXZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cjI1NSBkcml2ZXJOYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFNvdW5kSW5wdXREcml2ZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTb3VuZElucHV0RHJpdmVyLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlNHU291bmRJbnB1dERyaXZlckNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTb3VuZElucHV0RHJpdmVyQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0U291bmRSZWNvcmRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgc2Vjb25kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRTb3VuZFJlY29yZENodW5rU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlNHU2V0U291bmRJbnB1dFJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTb3VuZElucHV0UmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEZpeGVkIHJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0U291bmRJbnB1dFJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTb3VuZElucHV0UmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycyIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgc2FtcGxlU2l6ZSwgc2hvcnQgbnVtQ2hhbm5lbHMsIE9TVHlwZSBjb21wcmVzc2lvblR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0U291bmRJbnB1dFBhcmFtZXRlcnMiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBzYW1wbGVTaXplLCBzaG9ydCBudW1DaGFubmVscywgT1NUeXBlIGNvbXByZXNzaW9uVHlwZSkiKX0sCisgICAgeyJTR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBIYW5kbGUgcmF0ZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgcmF0ZXMpIil9LAorICAgIHsiU0dTZXRGb250TmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldEZvbnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyaW5nUHRyIHBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0Rm9udFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRGb250U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGZvbnRTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldFRleHRGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRUZXh0Rm9yZUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIHRoZUNvbG9yKSIpfSwKKyAgICB7IlNHU2V0VGV4dEJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilRdF9TR1NldFRleHRCYWNrQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgdGhlQ29sb3IpIil9LAorICAgIHsiU0dTZXRKdXN0aWZpY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0SnVzdGlmaWNhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGp1c3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgcmV0dG9zcGFjZSkiKX0sCisgICAgeyJTR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgcmV0dG9zcGFjZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRHZXRDdXJyZW50Q2xpZW50TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgU3RyMjU1IHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRWaWRlb091dHB1dFNldENsaWVudE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dFNldENsaWVudE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIFN0cjI1NSBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0QmVnaW4iLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEJlZ2luLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0RW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRFbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRTZXREaXNwbGF5TW9kZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIGxvbmcgZGlzcGxheU1vZGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGlzcGxheU1vZGVJRCkiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRHZXRHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBHV29ybGRQdHIgZ3cpIil9LAorICAgIHsiUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQpIil9LAorICAgIHsiUVRWaWRlb091dHB1dEdldENsb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRHZXRDbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudEluc3RhbmNlIGNsb2NrKSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0U2V0RWNob1BvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIENHcmFmUHRyIGVjaG9Qb3J0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0SW5kSW1hZ2VEZWNvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50IGNvZGVjKSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRCYXNlU2V0RWNob1BvcnQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgQ0dyYWZQdHIgZWNob1BvcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRDaHVua01hbmFnZW1lbnRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBVSW50MzIgZmxhZ3MsIFVJbnQzMiBmbGFnc01hc2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRDaHVua01hbmFnZW1lbnRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGZsYWdzKSIpfSwKKyAgICB7Ik1lZGlhU2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBTaXplIGFsbG93YW5jZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTaXplIGFsbG93YW5jZSkiKX0sCisgICAgeyJNZWRpYUVtcHR5QWxsUHVyZ2VhYmxlQ2h1bmtzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0SGFuZGxlckNhcGFiaWxpdGllcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSWRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgYXRNZWRpYVRpbWUsIGxvbmcgZmxhZ3NJbiwgVGltZVJlY29yZCBtb3ZpZVRpbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZsYWdzT3V0KSIpfSwKKyAgICB7Ik1lZGlhR2V0TWVkaWFJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TWVkaWFJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVB1dE1lZGlhSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVB1dE1lZGlhSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBIYW5kbGUgaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXRBY3RpdmUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRBY3RpdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQm9vbGVhbiBlbmFibGVNZWRpYSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXRSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0UmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCByYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdHZXRTdGF0dXMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHR2V0U3RhdHVzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnRSZXN1bHQgc3RhdHVzRXJyKSIpfSwKKyAgICB7Ik1lZGlhVHJhY2tFZGl0ZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFUcmFja0VkaXRlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldE1lZGlhVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0TWVkaWFUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVNjYWxlIG5ld1RpbWVTY2FsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXRNb3ZpZVRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldE1vdmllVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVTY2FsZSBuZXdUaW1lU2NhbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENHcmFmUHRyIGFQb3J0LCBHREhhbmRsZSBhR0QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0RGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldERpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgRml4ZWQgd2lkdGgsIEZpeGVkIGhlaWdodCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0Q2xpcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBSZ25IYW5kbGUgdGhlQ2xpcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRUcmFja09wYXF1ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFRyYWNrT3BhcXVlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHRyYWNrSXNPcGFxdWUpIil9LAorICAgIHsiTWVkaWFTZXRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRHcmFwaGljc01vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBtb2RlLCBSR0JDb2xvciBvcENvbG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldEdyYXBoaWNzTW9kZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEdyYXBoaWNzTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtb2RlLCBSR0JDb2xvciBvcENvbG9yKSIpfSwKKyAgICB7Ik1lZGlhR1NldFZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdTZXRWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgdm9sdW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldFNvdW5kQmFsYW5jZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFNvdW5kQmFsYW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBiYWxhbmNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFNvdW5kQmFsYW5jZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kQmFsYW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgYmFsYW5jZSkiKX0sCisgICAgeyJNZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgd2hlbikiKX0sCisgICAgeyJNZWRpYUdldFNyY1JnbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNyY1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBSZ25IYW5kbGUgcmduLCBUaW1lVmFsdWUgYXRNZWRpYVRpbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhUHJlcm9sbCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVByZXJvbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIHRpbWUsIEZpeGVkIHJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2FtcGxlRGVzY3JpcHRpb25DaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2FtcGxlRGVzY3JpcHRpb25DaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhSGFzQ2hhcmFjdGVyaXN0aWMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBPU1R5cGUgY2hhcmFjdGVyaXN0aWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGhhc0l0KSIpfSwKKyAgICB7Ik1lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE9mZnNjcmVlbkJ1ZmZlclNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgZGVwdGgsIENUYWJIYW5kbGUgY3RhYikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKKyAgICB7Ik1lZGlhU2V0SGludHMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRIaW50cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGhpbnRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFN0cjI1NSBuYW1lLCBsb25nIHJlcXVlc3RlZExhbmd1YWdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBhY3R1YWxMYW5ndWFnZSkiKX0sCisgICAgeyJNZWRpYUZvcmNlVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRm9yY2VVcGRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmb3JjZVVwZGF0ZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldERyYXdpbmdSZ24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXREcmF3aW5nUmduLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgcGFydGlhbFJnbikiKX0sCisgICAgeyJNZWRpYUdTZXRBY3RpdmVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR1NldEFjdGl2ZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIGFjdGl2ZVN0YXJ0LCBUaW1lVmFsdWUgYWN0aXZlRHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhSW52YWxpZGF0ZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUludmFsaWRhdGVSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUmduSGFuZGxlIGludmFsUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldE5leHRTdGVwVGltZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE5leHRTdGVwVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBmbGFncywgVGltZVZhbHVlIG1lZGlhVGltZUluLCBGaXhlZCByYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVZhbHVlIG1lZGlhVGltZU91dCkiKX0sCisgICAgeyJNZWRpYUNoYW5nZWROb25QcmltYXJ5U291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhQ2hhbmdlZE5vblByaW1hcnlTb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBpbnB1dEluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhUmVsZWFzZVNhbXBsZURhdGFQb2ludGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUmVsZWFzZVNhbXBsZURhdGFQb2ludGVyLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgc2FtcGxlTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVRyYWNrUHJvcGVydHlBdG9tQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRyYWNrUHJvcGVydHlBdG9tQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldFZpZGVvUGFyYW0iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRWaWRlb1BhcmFtLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgd2hpY2hQYXJhbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHZhbHVlKSIpfSwKKyAgICB7Ik1lZGlhR2V0VmlkZW9QYXJhbSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFZpZGVvUGFyYW0sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyB3aGljaFBhcmFtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgdmFsdWUpIil9LAorICAgIHsiTWVkaWFDb21wYXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhQ29tcGFyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBNZWRpYSBzcmNNZWRpYSwgQ29tcG9uZW50SW5zdGFuY2Ugc3JjTWVkaWFDb21wb25lbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGlzT0spIil9LAorICAgIHsiTWVkaWFHZXRDbG9jayIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldENsb2NrLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnRJbnN0YW5jZSBjbG9jaykiKX0sCisgICAgeyJNZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29tcG9uZW50IG91dHB1dENvbXBvbmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kT3V0cHV0Q29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50KSIpfSwKKyAgICB7Ik1lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEhhbmRsZSBkYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldEludmFsaWRSZWdpb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRJbnZhbGlkUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSByZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkIyTiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTYW1wbGVEZXNjcmlwdGlvbk4yQiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBpbnB1dEluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFVSTExpbmsiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRVUkxMaW5rLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFBvaW50IGRpc3BsYXlXaGVyZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB1cmxMaW5rKSIpfSwKKyAgICB7Ik1lZGlhSGl0VGVzdEZvclRhcmdldFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUhpdFRlc3RGb3JUYXJnZXRSZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyB0YXJnZXRSZWZDb24pIil9LAorICAgIHsiTWVkaWFIaXRUZXN0VGFyZ2V0UmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSGl0VGVzdFRhcmdldFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHRhcmdldFJlZkNvbiwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB3YXNIaXQpIil9LAorICAgIHsiTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRGlzcG9zZVRhcmdldFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHRhcmdldFJlZkNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFUYXJnZXRSZWZDb25zRXF1YWwiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFUYXJnZXRSZWZDb25zRXF1YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmaXJzdFJlZkNvbiwgbG9uZyBzZWNvbmRSZWZDb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGVxdWFsKSIpfSwKKyAgICB7Ik1lZGlhUHJlUHJlcm9sbENhbmNlbCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVByZVByZXJvbGxDYW5jZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIHJlZmNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFFbnRlckVtcHR5RWRpdCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUVudGVyRW1wdHlFZGl0LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUN1cnJlbnRNZWRpYVF1ZXVlZERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlsbGlTZWNzKSIpfSwKKyAgICB7Ik1lZGlhR2V0RWZmZWN0aXZlVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0RWZmZWN0aXZlVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCB2b2x1bWUpIil9LAorICAgIHsiTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlbmFibGVkKSIpfSwKKyAgICB7Ik1lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQm9vbGVhbiBlbmFibGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0RWZmZWN0aXZlU291bmRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0RWZmZWN0aXZlU291bmRCYWxhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBiYWxhbmNlKSIpfSwKKyAgICB7Ik1lZGlhU2V0U2NyZWVuTG9jayIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFNjcmVlbkxvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQm9vbGVhbiBsb2NrSXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0RXJyb3JTdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRFcnJvclN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb21wb25lbnRSZXN1bHQgdGhlRXJyb3IsIFN0cjI1NSBlcnJvclN0cmluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRTb3VuZEVxdWFsaXplckJhbmRMZXZlbHMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZEVxdWFsaXplckJhbmRMZXZlbHMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQ4IGJhbmRMZXZlbHMpIil9LAorICAgIHsiTWVkaWFEb0lkbGVBY3Rpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRG9JZGxlQWN0aW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldFNvdW5kQmFzc0FuZFRyZWJsZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFNvdW5kQmFzc0FuZFRyZWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBiYXNzLCBzaG9ydCB0cmVibGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBiYXNzLCBzaG9ydCB0cmVibGUpIil9LAorICAgIHsiTWVkaWFUaW1lQmFzZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFUaW1lQmFzZUNoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFNQ0lzUGxheWVyRXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFNQ0lzUGxheWVyRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgRXZlbnRSZWNvcmQgZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaGFuZGxlZEl0KSIpfSwKKyAgICB7Ik1lZGlhR2V0TWVkaWFMb2FkU3RhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtZWRpYUxvYWRTdGF0ZSkiKX0sCisgICAgeyJNZWRpYVZpZGVvT3V0cHV0Q2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVZpZGVvT3V0cHV0Q2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb21wb25lbnRJbnN0YW5jZSB2b3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUVtcHR5U2FtcGxlQ2FjaGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFFbXB0eVNhbXBsZUNhY2hlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgc2FtcGxlTnVtLCBsb25nIHNhbXBsZUNvdW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFB1YmxpY0luZm8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRQdWJsaWNJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIE9TVHlwZSBpbmZvU2VsZWN0b3IsIHZvaWQgKiBpbmZvRGF0YVB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNpemUgaW9EYXRhU2l6ZSkiKX0sCisgICAgeyJNZWRpYVNldFB1YmxpY0luZm8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRQdWJsaWNJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIE9TVHlwZSBpbmZvU2VsZWN0b3IsIHZvaWQgKiBpbmZvRGF0YVB0ciwgU2l6ZSBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFSZWZDb25TZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVJlZkNvblNldFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uLCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhUmVmQ29uR2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFSZWZDb25HZXRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbiwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYU5hdmlnYXRlVGFyZ2V0UmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhTmF2aWdhdGVUYXJnZXRSZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBuYXZpZ2F0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyByZWZDb24pIil9LAorICAgIHsiTWVkaWFHR2V0SWRsZU1hbmFnZXIiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHR2V0SWRsZU1hbmFnZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIElkbGVNYW5hZ2VyIHBpbSkiKX0sCisgICAgeyJNZWRpYUdTZXRJZGxlTWFuYWdlciIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdTZXRJZGxlTWFuYWdlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRNSURJR2V0TUlESVBvcnRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUTUlESUdldE1JRElQb3J0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRNSURJQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRNSURJUG9ydExpc3RIYW5kbGUgaW5wdXRQb3J0cywgUVRNSURJUG9ydExpc3RIYW5kbGUgb3V0cHV0UG9ydHMpIil9LAorICAgIHsiUVRNSURJVXNlU2VuZFBvcnQiLCAoUHlDRnVuY3Rpb24pUXRfUVRNSURJVXNlU2VuZFBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUTUlESUNvbXBvbmVudCBjaSwgbG9uZyBwb3J0SW5kZXgsIGxvbmcgaW5Vc2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUTUlESVNlbmRNSURJIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUTUlESVNlbmRNSURJLCAxLAorICAgICBQeURvY19TVFIoIihRVE1JRElDb21wb25lbnQgY2ksIGxvbmcgcG9ydEluZGV4LCBNdXNpY01JRElQYWNrZXQgbXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0UGFydCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1pZGlDaGFubmVsLCBsb25nIHBvbHlwaG9ueSkiKX0sCisgICAgeyJNdXNpY1NldFBhcnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0LCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIG1pZGlDaGFubmVsLCBsb25nIHBvbHlwaG9ueSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGluc3RydW1lbnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0SW5zdHJ1bWVudE51bWJlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTdG9yZVBhcnRJbnN0cnVtZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU3RvcmVQYXJ0SW5zdHJ1bWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBpbnN0cnVtZW50TnVtYmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBBdG9taWNJbnN0cnVtZW50IGFpKSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgQXRvbWljSW5zdHJ1bWVudFB0ciBhaVAsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0UGFydEtub2IiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0S25vYiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBrbm9iSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydEtub2IiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0S25vYiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBrbm9iSUQsIGxvbmcga25vYlZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldEtub2IiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRLbm9iLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBrbm9iSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljU2V0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldEtub2IsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGtub2JJRCwgbG9uZyBrbm9iVmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0UGFydE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgU3RyaW5nUHRyIG5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgU3RyaW5nUHRyIG5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljUGxheU5vdGUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNQbGF5Tm90ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBwaXRjaCwgbG9uZyB2ZWxvY2l0eSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNSZXNldFBhcnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNSZXNldFBhcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydENvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0Q29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgTXVzaWNDb250cm9sbGVyIGNvbnRyb2xsZXJOdW1iZXIsIGxvbmcgY29udHJvbGxlclZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldFBhcnRDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydENvbnRyb2xsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIE11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldEluc3RydW1lbnROYW1lcyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEluc3RydW1lbnROYW1lcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGluc3RydW1lbnROYW1lcywgSGFuZGxlIGluc3RydW1lbnRDYXRlZ29yeUxhc3RzLCBIYW5kbGUgaW5zdHJ1bWVudENhdGVnb3J5TmFtZXMpIil9LAorICAgIHsiTXVzaWNHZXREcnVtTmFtZXMiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXREcnVtTmFtZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIG1vZGlmaWFibGVJbnN0cnVtZW50cykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBpbnN0cnVtZW50TnVtYmVycywgSGFuZGxlIGluc3RydW1lbnROYW1lcykiKX0sCisgICAgeyJNdXNpY0dldE1hc3RlclR1bmUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRNYXN0ZXJUdW5lLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRNYXN0ZXJUdW5lIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0TWFzdGVyVHVuZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbWFzdGVyVHVuZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0RGV2aWNlQ29ubmVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGlkMSwgbG9uZyBpZDIpIil9LAorICAgIHsiTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljVXNlRGV2aWNlQ29ubmVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgaWQxLCBsb25nIGlkMikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGtub2JJbmRleCwgbG9uZyBpc0dsb2JhbCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBzZXR0aW5nc05hbWVzLCBIYW5kbGUgc2V0dGluZ3NDYXRlZ29yeUxhc3RzLCBIYW5kbGUgc2V0dGluZ3NDYXRlZ29yeU5hbWVzKSIpfSwKKyAgICB7Ik11c2ljR2V0TUlESVBvcnRzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0TUlESVBvcnRzLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5wdXRQb3J0Q291bnQsIGxvbmcgb3V0cHV0UG9ydENvdW50KSIpfSwKKyAgICB7Ik11c2ljU2VuZE1JREkiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZW5kTUlESSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcG9ydEluZGV4LCBNdXNpY01JRElQYWNrZXQgbXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljU2V0T2ZmbGluZVRpbWVUbyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldE9mZmxpbmVUaW1lVG8sIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIG5ld1RpbWVTdGFtcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRJbmZvVGV4dCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEluZm9UZXh0LCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBzZWxlY3RvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0ZXh0SCwgSGFuZGxlIHN0eWxlSCkiKX0sCisgICAgeyJNdXNpY0dldEluc3RydW1lbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0SW5zdHJ1bWVudEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGdldEluc3RydW1lbnRJbmZvRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbnN0cnVtZW50SW5mb0xpc3RIYW5kbGUgaW5mb0xpc3RIKSIpfSwKKyAgICB7Ik11c2ljVGFzayIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1Rhc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBpbnN0cnVtZW50TnVtYmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1NldFBhcnRTb3VuZExvY2FsaXphdGlvbiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRTb3VuZExvY2FsaXphdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgSGFuZGxlIGRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2VuZXJpY0NvbmZpZ3VyZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dlbmVyaWNDb25maWd1cmUsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIG1vZGUsIGxvbmcgZmxhZ3MsIGxvbmcgYmFzZVJlc0lEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dlbmVyaWNHZXRLbm9iTGlzdCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dlbmVyaWNHZXRLbm9iTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYlR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBHZW5lcmljS25vYkRlc2NyaXB0aW9uTGlzdEhhbmRsZSBna2RsSCkiKX0sCisgICAgeyJNdXNpY0dlbmVyaWNTZXRSZXNvdXJjZU51bWJlcnMiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZW5lcmljU2V0UmVzb3VyY2VOdW1iZXJzLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgSGFuZGxlIHJlc291cmNlSURIKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0Rlcml2ZWRNSURJU2VuZCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0Rlcml2ZWRNSURJU2VuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIE11c2ljTUlESVBhY2tldCBwYWNrZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljRGVyaXZlZE9wZW5SZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljRGVyaXZlZE9wZW5SZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljRGVyaXZlZENsb3NlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIHNob3J0IHJlc1JlZk51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUXRfTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE5vdGVBbGxvY2F0b3IgbmEsIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik5BU2F2ZU11c2ljQ29uZmlndXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9OQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE5vdGVBbGxvY2F0b3IgbmEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik5BR2V0TUlESVBvcnRzIiwgKFB5Q0Z1bmN0aW9uKVF0X05BR2V0TUlESVBvcnRzLCAxLAorICAgICBQeURvY19TVFIoIihOb3RlQWxsb2NhdG9yIG5hKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRNSURJUG9ydExpc3RIYW5kbGUgaW5wdXRQb3J0cywgUVRNSURJUG9ydExpc3RIYW5kbGUgb3V0cHV0UG9ydHMpIil9LAorICAgIHsiTkFUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X05BVGFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHVuZVNldEhlYWRlciIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0SGVhZGVyLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nICogaGVhZGVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lR2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUdldFRpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZUJhc2UgdGIpIil9LAorICAgIHsiVHVuZVNldFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0VGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBUaW1lU2NhbGUgc2NhbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVHZXRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUdldFRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVTY2FsZSBzY2FsZSkiKX0sCisgICAgeyJUdW5lSW5zdGFudCIsIChQeUNGdW5jdGlvbilRdF9UdW5lSW5zdGFudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgdW5zaWduZWQgbG9uZyB0dW5lUG9zaXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHR1bmUpIil9LAorICAgIHsiVHVuZVN0b3AiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVN0b3AsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIGxvbmcgc3RvcEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lU2V0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIEZpeGVkIHZvbHVtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHVuZUdldFZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lR2V0Vm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lUHJlcm9sbCIsIChQeUNGdW5jdGlvbilRdF9UdW5lUHJlcm9sbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHVuZVVucm9sbCIsIChQeUNGdW5jdGlvbilRdF9UdW5lVW5yb2xsLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lU2V0UGFydFRyYW5zcG9zZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0UGFydFRyYW5zcG9zZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgdW5zaWduZWQgbG9uZyBwYXJ0LCBsb25nIHRyYW5zcG9zZSwgbG9uZyB2ZWxvY2l0eVNoaWZ0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lR2V0Tm90ZUFsbG9jYXRvciIsIChQeUNGdW5jdGlvbilRdF9UdW5lR2V0Tm90ZUFsbG9jYXRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKE5vdGVBbGxvY2F0b3IgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRTb2Z0ZXIiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFNvZnRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgbG9uZyBzb2Z0ZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVUYXNrLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lU2V0QmFsYW5jZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0QmFsYW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgbG9uZyBiYWxhbmNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lU2V0U291bmRMb2NhbGl6YXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFNvdW5kTG9jYWxpemF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBIYW5kbGUgZGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHVuZVNldEhlYWRlcldpdGhTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRIZWFkZXJXaXRoU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgdW5zaWduZWQgbG9uZyAqIGhlYWRlciwgdW5zaWduZWQgbG9uZyBzaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lU2V0UGFydE1peCIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0UGFydE1peCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgdW5zaWduZWQgbG9uZyBwYXJ0TnVtYmVyLCBsb25nIHZvbHVtZSwgbG9uZyBiYWxhbmNlLCBsb25nIG1peEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lR2V0UGFydE1peCIsIChQeUNGdW5jdGlvbilRdF9UdW5lR2V0UGFydE1peCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgdW5zaWduZWQgbG9uZyBwYXJ0TnVtYmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyB2b2x1bWVPdXQsIGxvbmcgYmFsYW5jZU91dCwgbG9uZyBtaXhGbGFnc091dCkiKX0sCisgICAgeyJBbGlnbldpbmRvdyIsIChQeUNGdW5jdGlvbilRdF9BbGlnbldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdwLCBCb29sZWFuIGZyb250KSAtPiBOb25lIil9LAorICAgIHsiRHJhZ0FsaWduZWRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pUXRfRHJhZ0FsaWduZWRXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3cCwgUG9pbnQgc3RhcnRQdCwgUmVjdCBib3VuZHNSZWN0KSAtPiBOb25lIil9LAorICAgIHsiTW92aWVzVGFzayIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZXNUYXNrLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1heE1pbGxpU2VjVG9Vc2UpIC0+IE5vbmUiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMjgwMDAsOTAgKzI4MDAwLDkwIEBACiAKIHZvaWQgaW5pdF9RdCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVHJhY2ssIFRyYWNrT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoVHJhY2ssIFRyYWNrT2JqX0NvbnZlcnQpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoTW92aWUsIE1vdmllT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTW92aWUsIE1vdmllT2JqX0NvbnZlcnQpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoTW92aWVDb250cm9sbGVyLCBNb3ZpZUN0bE9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1vdmllQ29udHJvbGxlciwgTW92aWVDdGxPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhUaW1lQmFzZSwgVGltZUJhc2VPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChUaW1lQmFzZSwgVGltZUJhc2VPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhVc2VyRGF0YSwgVXNlckRhdGFPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChVc2VyRGF0YSwgVXNlckRhdGFPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNZWRpYSwgTWVkaWFPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNZWRpYSwgTWVkaWFPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRyYWNrLCBUcmFja09ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoVHJhY2ssIFRyYWNrT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZSwgTW92aWVPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1vdmllLCBNb3ZpZU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoTW92aWVDb250cm9sbGVyLCBNb3ZpZUN0bE9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTW92aWVDb250cm9sbGVyLCBNb3ZpZUN0bE9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVGltZUJhc2UsIFRpbWVCYXNlT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChUaW1lQmFzZSwgVGltZUJhc2VPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFVzZXJEYXRhLCBVc2VyRGF0YU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoVXNlckRhdGEsIFVzZXJEYXRhT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNZWRpYSwgTWVkaWFPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1lZGlhLCBNZWRpYU9ial9Db252ZXJ0KTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1F0IiwgUXRfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9RdCIsIFF0X21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVF0X0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoUXRfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBRdF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUlkbGVNYW5hZ2VyX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZJZGxlTWFuYWdlcl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJklkbGVNYW5hZ2VyX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSWRsZU1hbmFnZXIiLCAoUHlPYmplY3QgKikmSWRsZU1hbmFnZXJfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZJZGxlTWFuYWdlcl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIklkbGVNYW5hZ2VyVHlwZSIsIChQeU9iamVjdCAqKSZJZGxlTWFuYWdlcl9UeXBlKTsKLQlNb3ZpZUNvbnRyb2xsZXJfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJk1vdmllQ29udHJvbGxlcl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1vdmllQ29udHJvbGxlciIsIChQeU9iamVjdCAqKSZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZUNvbnRyb2xsZXJUeXBlIiwgKFB5T2JqZWN0ICopJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKLQlUaW1lQmFzZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVGltZUJhc2VfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZUaW1lQmFzZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRpbWVCYXNlIiwgKFB5T2JqZWN0ICopJlRpbWVCYXNlX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVGltZUJhc2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaW1lQmFzZVR5cGUiLCAoUHlPYmplY3QgKikmVGltZUJhc2VfVHlwZSk7Ci0JVXNlckRhdGFfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlVzZXJEYXRhX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmVXNlckRhdGFfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVc2VyRGF0YSIsIChQeU9iamVjdCAqKSZVc2VyRGF0YV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlVzZXJEYXRhX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVXNlckRhdGFUeXBlIiwgKFB5T2JqZWN0ICopJlVzZXJEYXRhX1R5cGUpOwotCU1lZGlhX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZNZWRpYV9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJk1lZGlhX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVkaWEiLCAoUHlPYmplY3QgKikmTWVkaWFfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZNZWRpYV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lZGlhVHlwZSIsIChQeU9iamVjdCAqKSZNZWRpYV9UeXBlKTsKLQlUcmFja19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVHJhY2tfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZUcmFja19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRyYWNrIiwgKFB5T2JqZWN0ICopJlRyYWNrX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVHJhY2tfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUcmFja1R5cGUiLCAoUHlPYmplY3QgKikmVHJhY2tfVHlwZSk7Ci0JTW92aWVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJk1vdmllX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmTW92aWVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZSIsIChQeU9iamVjdCAqKSZNb3ZpZV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJk1vdmllX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTW92aWVUeXBlIiwgKFB5T2JqZWN0ICopJk1vdmllX1R5cGUpOwotCVNHT3V0cHV0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZTR091dHB1dF9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJlNHT3V0cHV0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0dPdXRwdXQiLCAoUHlPYmplY3QgKikmU0dPdXRwdXRfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZTR091dHB1dF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNHT3V0cHV0VHlwZSIsIChQeU9iamVjdCAqKSZTR091dHB1dF9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBRdF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFF0X0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgUXRfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBJZGxlTWFuYWdlcl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmSWRsZU1hbmFnZXJfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZJZGxlTWFuYWdlcl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIklkbGVNYW5hZ2VyIiwgKFB5T2JqZWN0ICopJklkbGVNYW5hZ2VyX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmSWRsZU1hbmFnZXJfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJZGxlTWFuYWdlclR5cGUiLCAoUHlPYmplY3QgKikmSWRsZU1hbmFnZXJfVHlwZSk7CisgICAgTW92aWVDb250cm9sbGVyX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZNb3ZpZUNvbnRyb2xsZXJfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZUNvbnRyb2xsZXIiLCAoUHlPYmplY3QgKikmTW92aWVDb250cm9sbGVyX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmTW92aWVDb250cm9sbGVyX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTW92aWVDb250cm9sbGVyVHlwZSIsIChQeU9iamVjdCAqKSZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7CisgICAgVGltZUJhc2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlRpbWVCYXNlX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVGltZUJhc2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaW1lQmFzZSIsIChQeU9iamVjdCAqKSZUaW1lQmFzZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlRpbWVCYXNlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVGltZUJhc2VUeXBlIiwgKFB5T2JqZWN0ICopJlRpbWVCYXNlX1R5cGUpOworICAgIFVzZXJEYXRhX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZVc2VyRGF0YV9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJlVzZXJEYXRhX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVXNlckRhdGEiLCAoUHlPYmplY3QgKikmVXNlckRhdGFfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZVc2VyRGF0YV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVzZXJEYXRhVHlwZSIsIChQeU9iamVjdCAqKSZVc2VyRGF0YV9UeXBlKTsKKyAgICBNZWRpYV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmTWVkaWFfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZNZWRpYV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lZGlhIiwgKFB5T2JqZWN0ICopJk1lZGlhX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmTWVkaWFfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZWRpYVR5cGUiLCAoUHlPYmplY3QgKikmTWVkaWFfVHlwZSk7CisgICAgVHJhY2tfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlRyYWNrX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVHJhY2tfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUcmFjayIsIChQeU9iamVjdCAqKSZUcmFja19UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlRyYWNrX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVHJhY2tUeXBlIiwgKFB5T2JqZWN0ICopJlRyYWNrX1R5cGUpOworICAgIE1vdmllX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZNb3ZpZV9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJk1vdmllX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTW92aWUiLCAoUHlPYmplY3QgKikmTW92aWVfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZNb3ZpZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1vdmllVHlwZSIsIChQeU9iamVjdCAqKSZNb3ZpZV9UeXBlKTsKKyAgICBTR091dHB1dF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmU0dPdXRwdXRfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZTR091dHB1dF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNHT3V0cHV0IiwgKFB5T2JqZWN0ICopJlNHT3V0cHV0X1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmU0dPdXRwdXRfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTR091dHB1dFR5cGUiLCAoUHlPYmplY3QgKikmU0dPdXRwdXRfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvcmVzL19SZXNtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL3Jlcy9fUmVzbW9kdWxlLmMKaW5kZXggODlmZDAyYy4uZjU4MjRiMSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcmVzL19SZXNtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9yZXMvX1Jlc21vZHVsZS5jCkBAIC04LDkgKzgsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzEsNyArMzEsNyBAQAogc3RhdGljIHZvaWQKIFB5TWFjX0F1dG9EaXNwb3NlSGFuZGxlKEhhbmRsZSBoKQogewotICAgICAgICBEaXNwb3NlSGFuZGxlKGgpOworICAgIERpc3Bvc2VIYW5kbGUoaCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0Vycm9yOwpAQCAtNDMsNTMxICs0Myw1MzEgQEAKICNkZWZpbmUgUmVzT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlJlc291cmNlX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlJlc291cmNlX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBSZXNvdXJjZU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUhhbmRsZSBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoSGFuZGxlIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEhhbmRsZSBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoSGFuZGxlIHB0cik7CiB9IFJlc291cmNlT2JqZWN0OwogCiBQeU9iamVjdCAqUmVzT2JqX05ldyhIYW5kbGUgaXRzZWxmKQogewotCVJlc291cmNlT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JaXQgPSBQeU9iamVjdF9ORVcoUmVzb3VyY2VPYmplY3QsICZSZXNvdXJjZV9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gTlVMTDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgUmVzb3VyY2VPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhSZXNvdXJjZU9iamVjdCwgJlJlc291cmNlX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IFJlc09ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBIYW5kbGUgKnBfaXRzZWxmKQogewotCWlmICghUmVzT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlPYmplY3QgKnRtcDsKLQkJaWYgKCAodG1wPVB5T2JqZWN0X0NhbGxNZXRob2QodiwgImFzX1Jlc291cmNlIiwgIiIpKSApCi0JCXsKLQkJCSpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil0bXApLT5vYl9pdHNlbGY7Ci0JCQlQeV9ERUNSRUYodG1wKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWlmICghUmVzT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlJlc291cmNlIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIVJlc09ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5T2JqZWN0ICp0bXA7CisgICAgICAgIGlmICggKHRtcD1QeU9iamVjdF9DYWxsTWV0aG9kKHYsICJhc19SZXNvdXJjZSIsICIiKSkgKQorICAgICAgICB7CisgICAgICAgICAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdG1wKS0+b2JfaXRzZWxmOworICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoIVJlc09ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJSZXNvdXJjZSByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChSZXNvdXJjZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFJlc09ial9kZWFsbG9jKFJlc291cmNlT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KHNlbGYtPm9iX2l0c2VsZik7Ci0JfQotCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOworICAgIH0KKyAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0hvbWVSZXNGaWxlKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgSG9tZVJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhIb21lUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSG9tZVJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEhvbWVSZXNGaWxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBIb21lUmVzRmlsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfTWFjTG9hZFJlc291cmNlKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIE1hY0xvYWRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKE1hY0xvYWRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjTG9hZFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNMb2FkUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNMb2FkUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9SZWxlYXNlUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgUmVsZWFzZVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soUmVsZWFzZVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWxlYXNlUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVJlbGVhc2VSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJlbGVhc2VSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0RldGFjaFJlc291cmNlKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERldGFjaFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soRGV0YWNoUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKERldGFjaFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEZXRhY2hSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERldGFjaFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfR2V0UmVzQXR0cnMoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRSZXNBdHRycwotCVB5TWFjX1BSRUNIRUNLKEdldFJlc0F0dHJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRSZXNBdHRycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UmVzQXR0cnMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFJlc0F0dHJzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9HZXRSZXNJbmZvKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB0aGVJRDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHRoZUlEOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBTdHIyNTUgbmFtZTsKICNpZm5kZWYgR2V0UmVzSW5mbwotCVB5TWFjX1BSRUNIRUNLKEdldFJlc0luZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlc0luZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFJlc0luZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICZ0aGVJRCwKLQkgICAgICAgICAgICZ0aGVUeXBlLAotCSAgICAgICAgICAgbmFtZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgbmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFJlc0luZm8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICZ0aGVJRCwKKyAgICAgICAgICAgICAgICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgbmFtZSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgbmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX1NldFJlc0luZm8oUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHRoZUlEOwotCVN0cjI1NSBuYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB0aGVJRDsKKyAgICBTdHIyNTUgbmFtZTsKICNpZm5kZWYgU2V0UmVzSW5mbwotCVB5TWFjX1BSRUNIRUNLKFNldFJlc0luZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFJlc0luZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUlELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRSZXNJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICB0aGVJRCwKLQkgICAgICAgICAgIG5hbWUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFJlc0luZm8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIHRoZUlELAorICAgICAgICAgICAgICAgbmFtZSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9BZGRSZXNvdXJjZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVzVHlwZSB0aGVUeXBlOwotCXNob3J0IHRoZUlEOwotCVN0cjI1NSBuYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CisgICAgc2hvcnQgdGhlSUQ7CisgICAgU3RyMjU1IG5hbWU7CiAjaWZuZGVmIEFkZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soQWRkUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUlELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlBZGRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIHRoZVR5cGUsCi0JICAgICAgICAgICAgdGhlSUQsCi0JICAgICAgICAgICAgbmFtZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBZGRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgdGhlSUQsCisgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9HZXRSZXNvdXJjZVNpemVPbkRpc2soUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0UmVzb3VyY2VTaXplT25EaXNrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UmVzb3VyY2VTaXplT25EaXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRSZXNvdXJjZVNpemVPbkRpc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFJlc291cmNlU2l6ZU9uRGlzayhfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UmVzb3VyY2VTaXplT25EaXNrKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9HZXRNYXhSZXNvdXJjZVNpemUoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0TWF4UmVzb3VyY2VTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWF4UmVzb3VyY2VTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNYXhSZXNvdXJjZVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1heFJlc291cmNlU2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWF4UmVzb3VyY2VTaXplKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9TZXRSZXNBdHRycyhSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgYXR0cnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGF0dHJzOwogI2lmbmRlZiBTZXRSZXNBdHRycwotCVB5TWFjX1BSRUNIRUNLKFNldFJlc0F0dHJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZXNBdHRycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVzQXR0cnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBhdHRycyk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRSZXNBdHRycyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIGF0dHJzKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0NoYW5nZWRSZXNvdXJjZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDaGFuZ2VkUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VkUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENoYW5nZWRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2hhbmdlZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2hhbmdlZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfUmVtb3ZlUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgUmVtb3ZlUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVJlbW92ZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUmVtb3ZlUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9Xcml0ZVJlc291cmNlKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFdyaXRlUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhXcml0ZVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhXcml0ZVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlXcml0ZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgV3JpdGVSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX1NldFJlc291cmNlU2l6ZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBuZXdTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIG5ld1NpemU7CiAjaWZuZGVmIFNldFJlc291cmNlU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFNldFJlc291cmNlU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UmVzb3VyY2VTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3U2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFJlc291cmNlU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBuZXdTaXplKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzb3VyY2VTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIG5ld1NpemUpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfR2V0TmV4dEZPTkQoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE5leHRGT05ECi0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dEZPTkQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHRGT05EKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0Rk9ORChfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHRGT05EKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfYXNfQ29udHJvbChSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JX3JlcyA9IEN0bE9ial9OZXcoKENvbnRyb2xIYW5kbGUpX3NlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IEN0bE9ial9OZXcoKENvbnRyb2xIYW5kbGUpX3NlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfYXNfTWVudShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JX3JlcyA9IE1lbnVPYmpfTmV3KChNZW51SGFuZGxlKV9zZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBfcmVzOworICAgIF9yZXMgPSBNZW51T2JqX05ldygoTWVudUhhbmRsZSlfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9Mb2FkUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgTG9hZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soTG9hZFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2FkUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUxvYWRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExvYWRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0F1dG9EaXNwb3NlKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpbnQgb25vZmYsIG9sZCA9IDA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZvbm9mZikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlpZiAoIF9zZWxmLT5vYl9mcmVlaXQgKQotCSAgICAgICAgb2xkID0gMTsKLQlpZiAoIG9ub2ZmICkKLQkgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZTsKLQllbHNlCi0JICAgICAgICBfc2VsZi0+b2JfZnJlZWl0ID0gTlVMTDsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsIG9sZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaW50IG9ub2ZmLCBvbGQgPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmb25vZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIF9zZWxmLT5vYl9mcmVlaXQgKQorICAgICAgICBvbGQgPSAxOworICAgIGlmICggb25vZmYgKQorICAgICAgICBfc2VsZi0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VIYW5kbGU7CisgICAgZWxzZQorICAgICAgICBfc2VsZi0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsIG9sZCk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFJlc09ial9tZXRob2RzW10gPSB7Ci0JeyJIb21lUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfSG9tZVJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJNYWNMb2FkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX01hY0xvYWRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUmVsZWFzZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9SZWxlYXNlUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRldGFjaFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9EZXRhY2hSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0UmVzQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0dldFJlc0F0dHJzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UmVzSW5mbyIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0UmVzSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgdGhlSUQsIFJlc1R5cGUgdGhlVHlwZSwgU3RyMjU1IG5hbWUpIil9LAotCXsiU2V0UmVzSW5mbyIsIChQeUNGdW5jdGlvbilSZXNPYmpfU2V0UmVzSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdGhlSUQsIFN0cjI1NSBuYW1lKSAtPiBOb25lIil9LAotCXsiQWRkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0FkZFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IHRoZUlELCBTdHIyNTUgbmFtZSkgLT4gTm9uZSIpfSwKLQl7IkdldFJlc291cmNlU2l6ZU9uRGlzayIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0UmVzb3VyY2VTaXplT25EaXNrLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJHZXRNYXhSZXNvdXJjZVNpemUiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0dldE1heFJlc291cmNlU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU2V0UmVzQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1NldFJlc0F0dHJzLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBhdHRycykgLT4gTm9uZSIpfSwKLQl7IkNoYW5nZWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfQ2hhbmdlZFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfUmVtb3ZlUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IldyaXRlUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1dyaXRlUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldFJlc291cmNlU2l6ZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfU2V0UmVzb3VyY2VTaXplLCAxLAotCSBQeURvY19TVFIoIihsb25nIG5ld1NpemUpIC0+IE5vbmUiKX0sCi0JeyJHZXROZXh0Rk9ORCIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0TmV4dEZPTkQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiSG9tZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0hvbWVSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiTWFjTG9hZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9NYWNMb2FkUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlJlbGVhc2VSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfUmVsZWFzZVJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEZXRhY2hSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfRGV0YWNoUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFJlc0F0dHJzIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9HZXRSZXNBdHRycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFJlc0luZm8iLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0dldFJlc0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IHRoZUlELCBSZXNUeXBlIHRoZVR5cGUsIFN0cjI1NSBuYW1lKSIpfSwKKyAgICB7IlNldFJlc0luZm8iLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1NldFJlc0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHRoZUlELCBTdHIyNTUgbmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkFkZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9BZGRSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCB0aGVJRCwgU3RyMjU1IG5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRSZXNvdXJjZVNpemVPbkRpc2siLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0dldFJlc291cmNlU2l6ZU9uRGlzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiR2V0TWF4UmVzb3VyY2VTaXplIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9HZXRNYXhSZXNvdXJjZVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlNldFJlc0F0dHJzIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9TZXRSZXNBdHRycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgYXR0cnMpIC0+IE5vbmUiKX0sCisgICAgeyJDaGFuZ2VkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0NoYW5nZWRSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1JlbW92ZVJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJXcml0ZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9Xcml0ZVJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRSZXNvdXJjZVNpemUiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1NldFJlc291cmNlU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBuZXdTaXplKSAtPiBOb25lIil9LAorICAgIHsiR2V0TmV4dEZPTkQiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0dldE5leHRGT05ELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKICNpZm5kZWYgX19MUDY0X18KLQl7ImFzX0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX2FzX0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiUmV0dXJuIHRoaXMgcmVzb3VyY2UvaGFuZGxlIGFzIGEgQ29udHJvbCIpfSwKLQl7ImFzX01lbnUiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX2FzX01lbnUsIDEsCi0JIFB5RG9jX1NUUigiUmV0dXJuIHRoaXMgcmVzb3VyY2UvaGFuZGxlIGFzIGEgTWVudSIpfSwKKyAgICB7ImFzX0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX2FzX0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRoaXMgcmVzb3VyY2UvaGFuZGxlIGFzIGEgQ29udHJvbCIpfSwKKyAgICB7ImFzX01lbnUiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX2FzX01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRoaXMgcmVzb3VyY2UvaGFuZGxlIGFzIGEgTWVudSIpfSwKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQl7IkxvYWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfTG9hZFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBdXRvRGlzcG9zZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfQXV0b0Rpc3Bvc2UsIDEsCi0JIFB5RG9jX1NUUigiKGludCktPmludC4gQXV0b21hdGljYWxseSBEaXNwb3NlSGFuZGxlIHRoZSBvYmplY3Qgb24gUHl0aG9uIG9iamVjdCBjbGVhbnVwIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTG9hZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9Mb2FkUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkF1dG9EaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9BdXRvRGlzcG9zZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IERpc3Bvc2VIYW5kbGUgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9nZXRfZGF0YShSZXNvdXJjZU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKIAotCSAgICAgICAgICAgIFB5T2JqZWN0ICpyZXM7Ci0JICAgICAgICAgICAgY2hhciBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBzdGF0ZTsKIAotCSAgICAgICAgICAgIHN0YXRlID0gSEdldFN0YXRlKHNlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgSExvY2soc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkgICAgICAgICAgICAgICAgICAgICpzZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBHZXRIYW5kbGVTaXplKHNlbGYtPm9iX2l0c2VsZikpOwotCSAgICAgICAgICAgIEhVbmxvY2soc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICBIU2V0U3RhdGUoc2VsZi0+b2JfaXRzZWxmLCBzdGF0ZSk7Ci0JICAgICAgICAgICAgcmV0dXJuIHJlczsKLQkgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBIR2V0U3RhdGUoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgSExvY2soc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRIYW5kbGVTaXplKHNlbGYtPm9iX2l0c2VsZikpOworICAgICAgICAgICAgICAgICAgICBIVW5sb2NrKHNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICAgICAgICAgIEhTZXRTdGF0ZShzZWxmLT5vYl9pdHNlbGYsIHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKwogfQogCiBzdGF0aWMgaW50IFJlc09ial9zZXRfZGF0YShSZXNvdXJjZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7CiAKLQkgICAgICAgICAgICBjaGFyICpkYXRhOwotCSAgICAgICAgICAgIGxvbmcgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBzaXplOwogCi0JICAgICAgICAgICAgaWYgKCB2ID09IE5VTEwgKQotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCSAgICAgICAgICAgIGlmICggIVB5U3RyaW5nX0NoZWNrKHYpICkKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQkgICAgICAgICAgICBzaXplID0gUHlTdHJpbmdfU2l6ZSh2KTsKLQkgICAgICAgICAgICBkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JICAgICAgICAgICAgLyogWFhYWCBEbyBJIG5lZWQgdGhlIEdldFN0YXRlL1NldFN0YXRlIGNhbGxzPyAqLwotCSAgICAgICAgICAgIFNldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmLCBzaXplKTsKLQkgICAgICAgICAgICBpZiAoIE1lbUVycm9yKCkpCi0JICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0JICAgICAgICAgICAgSExvY2soc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikqc2VsZi0+b2JfaXRzZWxmLCBkYXRhLCBzaXplKTsKLQkgICAgICAgICAgICBIVW5sb2NrKHNlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgLyogWFhYWCBTaG91bGQgSSBkbyB0aGUgQ2hhbmdlZCBjYWxsIGltbWVkZWF0ZWx5PyAqLwotCSAgICAgICAgICAgIHJldHVybiAwOwotCSAgICAgICAgICAgIAotCXJldHVybiAwOworICAgICAgICAgICAgICAgICAgICBpZiAoIHYgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBpZiAoICFQeVN0cmluZ19DaGVjayh2KSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBzaXplID0gUHlTdHJpbmdfU2l6ZSh2KTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgICAgICAgICAgICAgICAgICAvKiBYWFhYIERvIEkgbmVlZCB0aGUgR2V0U3RhdGUvU2V0U3RhdGUgY2FsbHM/ICovCisgICAgICAgICAgICBTZXRIYW5kbGVTaXplKHNlbGYtPm9iX2l0c2VsZiwgc2l6ZSk7CisgICAgICAgICAgICBpZiAoIE1lbUVycm9yKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgSExvY2soc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSpzZWxmLT5vYl9pdHNlbGYsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgSFVubG9jayhzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgLyogWFhYWCBTaG91bGQgSSBkbyB0aGUgQ2hhbmdlZCBjYWxsIGltbWVkZWF0ZWx5PyAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfZ2V0X3NpemUoUmVzb3VyY2VPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKEdldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKEdldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmKSk7CiB9CiAKICNkZWZpbmUgUmVzT2JqX3NldF9zaXplIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIFJlc09ial9nZXRzZXRsaXN0W10gPSB7Ci0JeyJkYXRhIiwgKGdldHRlcilSZXNPYmpfZ2V0X2RhdGEsIChzZXR0ZXIpUmVzT2JqX3NldF9kYXRhLCAiVGhlIHJlc291cmNlIGRhdGEifSwKLQl7InNpemUiLCAoZ2V0dGVyKVJlc09ial9nZXRfc2l6ZSwgKHNldHRlcilSZXNPYmpfc2V0X3NpemUsICJUaGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBkYXRhIn0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiZGF0YSIsIChnZXR0ZXIpUmVzT2JqX2dldF9kYXRhLCAoc2V0dGVyKVJlc09ial9zZXRfZGF0YSwgIlRoZSByZXNvdXJjZSBkYXRhIn0sCisgICAgeyJzaXplIiwgKGdldHRlcilSZXNPYmpfZ2V0X3NpemUsIChzZXR0ZXIpUmVzT2JqX3NldF9zaXplLCAiVGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgZGF0YSJ9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtNTc4LDg5ICs1NzgsODkgQEAKICNkZWZpbmUgUmVzT2JqX2hhc2ggTlVMTAogc3RhdGljIGludCBSZXNPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCWNoYXIgKnNyY2RhdGEgPSBOVUxMOwotCWludCBzcmNsZW4gPSAwOwotCUhhbmRsZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgY2hhciAqc3JjZGF0YSA9IE5VTEw7CisgICAgaW50IHNyY2xlbiA9IDA7CisgICAgSGFuZGxlIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgUmVzT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChSZXNvdXJjZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlFcnJfQ2xlYXIoKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8cyMiLCBrdywgJnNyY2RhdGEsICZzcmNsZW4pKSByZXR1cm4gLTE7Ci0JaWYgKChpdHNlbGYgPSBOZXdIYW5kbGUoc3JjbGVuKSkgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAwOwotCX0KLQkoKFJlc291cmNlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaWYgKHNyY2xlbiAmJiBzcmNkYXRhKQotCXsKLQkJSExvY2soaXRzZWxmKTsKLQkJbWVtY3B5KCppdHNlbGYsIHNyY2RhdGEsIHNyY2xlbik7Ci0JCUhVbmxvY2soaXRzZWxmKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBSZXNPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKFJlc291cmNlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxzIyIsIGt3LCAmc3JjZGF0YSwgJnNyY2xlbikpIHJldHVybiAtMTsKKyAgICBpZiAoKGl0c2VsZiA9IE5ld0hhbmRsZShzcmNsZW4pKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICgoUmVzb3VyY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpZiAoc3JjbGVuICYmIHNyY2RhdGEpCisgICAgeworICAgICAgICBITG9jayhpdHNlbGYpOworICAgICAgICBtZW1jcHkoKml0c2VsZiwgc3JjZGF0YSwgc3JjbGVuKTsKKyAgICAgICAgSFVubG9jayhpdHNlbGYpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogI2RlZmluZSBSZXNPYmpfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChSZXNvdXJjZU9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoUmVzb3VyY2VPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gTlVMTDsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChSZXNvdXJjZU9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoUmVzb3VyY2VPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBSZXNPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgUmVzb3VyY2VfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUmVzLlJlc291cmNlIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoUmVzb3VyY2VPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBSZXNPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgUmVzT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBSZXNPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFJlc09ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlSZXNPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JUmVzT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVJlc09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JUmVzT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCVJlc09ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVJlc09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1Jlcy5SZXNvdXJjZSIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFJlc291cmNlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgUmVzT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFJlc09ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgUmVzT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBSZXNPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgUmVzT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIFJlc09ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBSZXNPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFJlc09ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBSZXNPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBSZXNPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFJlc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC02NjgsMTAyNyArNjY4LDEwMjcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfQ2xvc2VSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHJlZk51bTsKICNpZm5kZWYgQ2xvc2VSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZVJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlDbG9zZVJlc0ZpbGUocmVmTnVtKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbG9zZVJlc0ZpbGUocmVmTnVtKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX1Jlc0Vycm9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBSZXNFcnJvcgotCVB5TWFjX1BSRUNIRUNLKFJlc0Vycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXNFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlc0Vycm9yKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXNFcnJvcigpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19DdXJSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgQ3VyUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEN1clJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEN1clJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEN1clJlc0ZpbGUoKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ3VyUmVzRmlsZSgpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19Vc2VSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHJlZk51bTsKICNpZm5kZWYgVXNlUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKFVzZVJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFVzZVJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlVc2VSZXNGaWxlKHJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVXNlUmVzRmlsZShyZWZOdW0pOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfQ291bnRUeXBlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIENvdW50VHlwZXMKLQlQeU1hY19QUkVDSEVDSyhDb3VudFR5cGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudFR5cGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudFR5cGVzKCk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50VHlwZXMoKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfQ291bnQxVHlwZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBDb3VudDFUeXBlcwotCVB5TWFjX1BSRUNIRUNLKENvdW50MVR5cGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudDFUeXBlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnQxVHlwZXMoKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnQxVHlwZXMoKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfR2V0SW5kVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVzVHlwZSB0aGVUeXBlOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CisgICAgc2hvcnQgaW5kZXg7CiAjaWZuZGVmIEdldEluZFR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXRJbmRUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJbmRUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRJbmRUeXBlKCZ0aGVUeXBlLAotCSAgICAgICAgICAgaW5kZXgpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZVR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRJbmRUeXBlKCZ0aGVUeXBlLAorICAgICAgICAgICAgICAgaW5kZXgpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZVR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXQxSW5kVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVzVHlwZSB0aGVUeXBlOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CisgICAgc2hvcnQgaW5kZXg7CiAjaWZuZGVmIEdldDFJbmRUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0MUluZFR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldDFJbmRUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXQxSW5kVHlwZSgmdGhlVHlwZSwKLQkgICAgICAgICAgICBpbmRleCk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldDFJbmRUeXBlKCZ0aGVUeXBlLAorICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfU2V0UmVzTG9hZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBsb2FkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGxvYWQ7CiAjaWZuZGVmIFNldFJlc0xvYWQKLQlQeU1hY19QUkVDSEVDSyhTZXRSZXNMb2FkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZXNMb2FkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbG9hZCkpCi0JCXJldHVybiBOVUxMOwotCVNldFJlc0xvYWQobG9hZCk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9hZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFJlc0xvYWQobG9hZCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19Db3VudFJlc291cmNlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCVJlc1R5cGUgdGhlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIFJlc1R5cGUgdGhlVHlwZTsKICNpZm5kZWYgQ291bnRSZXNvdXJjZXMKLQlQeU1hY19QUkVDSEVDSyhDb3VudFJlc291cmNlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ291bnRSZXNvdXJjZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRSZXNvdXJjZXModGhlVHlwZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRSZXNvdXJjZXModGhlVHlwZSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0NvdW50MVJlc291cmNlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCVJlc1R5cGUgdGhlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIFJlc1R5cGUgdGhlVHlwZTsKICNpZm5kZWYgQ291bnQxUmVzb3VyY2VzCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnQxUmVzb3VyY2VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudDFSZXNvdXJjZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnQxUmVzb3VyY2VzKHRoZVR5cGUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50MVJlc291cmNlcyh0aGVUeXBlKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfR2V0SW5kUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0SW5kUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRJbmRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SW5kUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0SW5kUmVzb3VyY2UodGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEluZFJlc291cmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfR2V0MUluZFJlc291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCVJlc1R5cGUgdGhlVHlwZTsKLQlzaG9ydCBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CisgICAgc2hvcnQgaW5kZXg7CiAjaWZuZGVmIEdldDFJbmRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKEdldDFJbmRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0MUluZFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldDFJbmRSZXNvdXJjZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldDFJbmRSZXNvdXJjZSh0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgdGhlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIHNob3J0IHRoZUlEOwogI2lmbmRlZiBHZXRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKEdldFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRSZXNvdXJjZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgIHRoZUlEKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UmVzb3VyY2UodGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB0aGVJRCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXQxUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOwotCXNob3J0IHRoZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCB0aGVJRDsKICNpZm5kZWYgR2V0MVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0MVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXQxUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0MVJlc291cmNlKHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgIHRoZUlEKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0MVJlc291cmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHRoZUlEKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldE5hbWVkUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOwotCVN0cjI1NSBuYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBTdHIyNTUgbmFtZTsKICNpZm5kZWYgR2V0TmFtZWRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKEdldE5hbWVkUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5hbWVkUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5hbWVkUmVzb3VyY2UodGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmFtZWRSZXNvdXJjZSh0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXQxTmFtZWRSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBHZXQxTmFtZWRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKEdldDFOYW1lZFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXQxTmFtZWRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0MU5hbWVkUmVzb3VyY2UodGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldDFOYW1lZFJlc291cmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19VbmlxdWVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCVJlc1R5cGUgdGhlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIFJlc1R5cGUgdGhlVHlwZTsKICNpZm5kZWYgVW5pcXVlSUQKLQlQeU1hY19QUkVDSEVDSyhVbmlxdWVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVW5pcXVlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVW5pcXVlSUQodGhlVHlwZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVW5pcXVlSUQodGhlVHlwZSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX1VuaXF1ZTFJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCVJlc1R5cGUgdGhlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIFJlc1R5cGUgdGhlVHlwZTsKICNpZm5kZWYgVW5pcXVlMUlECi0JUHlNYWNfUFJFQ0hFQ0soVW5pcXVlMUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbmlxdWUxSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVW5pcXVlMUlEKHRoZVR5cGUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFVuaXF1ZTFJRCh0aGVUeXBlKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfVXBkYXRlUmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgcmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCByZWZOdW07CiAjaWZuZGVmIFVwZGF0ZVJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVXBkYXRlUmVzRmlsZShyZWZOdW0pOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFVwZGF0ZVJlc0ZpbGUocmVmTnVtKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX1NldFJlc1B1cmdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGluc3RhbGw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gaW5zdGFsbDsKICNpZm5kZWYgU2V0UmVzUHVyZ2UKLQlQeU1hY19QUkVDSEVDSyhTZXRSZXNQdXJnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UmVzUHVyZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnN0YWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVzUHVyZ2UoaW5zdGFsbCk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdGFsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFJlc1B1cmdlKGluc3RhbGwpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfR2V0UmVzRmlsZUF0dHJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0Jc2hvcnQgcmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgc2hvcnQgcmVmTnVtOwogI2lmbmRlZiBHZXRSZXNGaWxlQXR0cnMKLQlQeU1hY19QUkVDSEVDSyhHZXRSZXNGaWxlQXR0cnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlc0ZpbGVBdHRycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFJlc0ZpbGVBdHRycyhyZWZOdW0pOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UmVzRmlsZUF0dHJzKHJlZk51bSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX1NldFJlc0ZpbGVBdHRycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgcmVmTnVtOwotCXNob3J0IGF0dHJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCByZWZOdW07CisgICAgc2hvcnQgYXR0cnM7CiAjaWZuZGVmIFNldFJlc0ZpbGVBdHRycwotCVB5TWFjX1BSRUNIRUNLKFNldFJlc0ZpbGVBdHRycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UmVzRmlsZUF0dHJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVzRmlsZUF0dHJzKHJlZk51bSwKLQkgICAgICAgICAgICAgICAgYXR0cnMpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFJlc0ZpbGVBdHRycyhyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgIGF0dHJzKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqUmVzX09wZW5SRlBlcm0oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0Jc2hvcnQgdlJlZk51bTsKLQlTaWduZWRCeXRlIHBlcm1pc3Npb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBTdHIyNTUgZmlsZU5hbWU7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBTaWduZWRCeXRlIHBlcm1pc3Npb247CiAjaWZuZGVmIE9wZW5SRlBlcm0KLQlQeU1hY19QUkVDSEVDSyhPcGVuUkZQZXJtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPcGVuUkZQZXJtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBPcGVuUkZQZXJtKGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24pOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBPcGVuUkZQZXJtKGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24pOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19IT3BlblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOwotCVNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgZmlsZU5hbWU7CisgICAgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOwogI2lmbmRlZiBIT3BlblJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhIT3BlblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEhPcGVuUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSE9wZW5SZXNGaWxlKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgIGRpcklELAotCSAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhPcGVuUmVzRmlsZSh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24pOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19IQ3JlYXRlUmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBmaWxlTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKICNpZm5kZWYgSENyZWF0ZVJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhIQ3JlYXRlUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSENyZWF0ZVJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlIQ3JlYXRlUmVzRmlsZSh2UmVmTnVtLAotCSAgICAgICAgICAgICAgIGRpcklELAotCSAgICAgICAgICAgICAgIGZpbGVOYW1lKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIQ3JlYXRlUmVzRmlsZSh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTcE9wZW5SZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JRlNTcGVjIHNwZWM7Ci0JU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgRlNTcGVjIHNwZWM7CisgICAgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOwogI2lmbmRlZiBGU3BPcGVuUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEZTcE9wZW5SZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU3BPcGVuUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZTcE9wZW5SZXNGaWxlKCZzcGVjLAotCSAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24pOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRlNwT3BlblJlc0ZpbGUoJnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTcENyZWF0ZVJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZTU3BlYyBzcGVjOwotCU9TVHlwZSBjcmVhdG9yOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRlNTcGVjIHNwZWM7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOwogI2lmbmRlZiBGU3BDcmVhdGVSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRlNwQ3JlYXRlUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRlNwQ3JlYXRlUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmc3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlGU3BDcmVhdGVSZXNGaWxlKCZzcGVjLAotCSAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRlNwQ3JlYXRlUmVzRmlsZSgmc3BlYywKKyAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19JbnNlcnRSZXNvdXJjZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IHJlZk51bTsKLQlSc3JjQ2hhaW5Mb2NhdGlvbiB3aGVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgcmVmTnVtOworICAgIFJzcmNDaGFpbkxvY2F0aW9uIHdoZXJlOwogI2lmbmRlZiBJbnNlcnRSZXNvdXJjZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRSZXNvdXJjZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydFJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnNlcnRSZXNvdXJjZUZpbGUocmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluc2VydFJlc291cmNlRmlsZShyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0RldGFjaFJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgcmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiByZWZOdW07CiAjaWZuZGVmIERldGFjaFJlc291cmNlRmlsZQotCVB5TWFjX1BSRUNIRUNLKERldGFjaFJlc291cmNlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGV0YWNoUmVzb3VyY2VGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERldGFjaFJlc291cmNlRmlsZShyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERldGFjaFJlc291cmNlRmlsZShyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKlJlc19GU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRlNTcGVjIHJlc291cmNlRmlsZTsKLQlCb29sZWFuIGluQ2hhaW47Ci0JU0ludDE2IHJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRlNTcGVjIHJlc291cmNlRmlsZTsKKyAgICBCb29sZWFuIGluQ2hhaW47CisgICAgU0ludDE2IHJlZk51bTsKICNpZm5kZWYgRlNwUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4KLQlQeU1hY19QUkVDSEVDSyhGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3Blbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRlNwUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbigmcmVzb3VyY2VGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNoYWluLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbkNoYWluLAotCSAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbigmcmVzb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbkNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTcE9wZW5PcnBoYW5SZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBzcGVjOwotCVNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKLQlTSW50MTYgcmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBzcGVjOworICAgIFNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKKyAgICBTSW50MTYgcmVmTnVtOwogI2lmbmRlZiBGU3BPcGVuT3JwaGFuUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEZTcE9wZW5PcnBoYW5SZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU3BPcGVuT3JwaGFuUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BPcGVuT3JwaGFuUmVzRmlsZSgmc3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BPcGVuT3JwaGFuUmVzRmlsZSgmc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfR2V0VG9wUmVzb3VyY2VGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IHJlZk51bTsKICNpZm5kZWYgR2V0VG9wUmVzb3VyY2VGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VG9wUmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUb3BSZXNvdXJjZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUb3BSZXNvdXJjZUZpbGUoJnJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRvcFJlc291cmNlRmlsZSgmcmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldE5leHRSZXNvdXJjZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGN1clJlZk51bTsKLQlTSW50MTYgbmV4dFJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgY3VyUmVmTnVtOworICAgIFNJbnQxNiBuZXh0UmVmTnVtOwogI2lmbmRlZiBHZXROZXh0UmVzb3VyY2VGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFJlc291cmNlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmN1clJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXROZXh0UmVzb3VyY2VGaWxlKGN1clJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dFJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgbmV4dFJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TmV4dFJlc291cmNlRmlsZShjdXJSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5leHRSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19GU09wZW5SZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JRlNSZWYgcmVmOwotCVNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIEZTUmVmIHJlZjsKKyAgICBTaWduZWRCeXRlIHBlcm1pc3Npb247CiAjaWZuZGVmIEZTT3BlblJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhGU09wZW5SZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU09wZW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZTT3BlblJlc0ZpbGUoJnJlZiwKLQkgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24pOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZTT3BlblJlc0ZpbGUoJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24pOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTQ3JlYXRlUmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRlNSZWYgcGFyZW50UmVmOwotCVVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOwotCWludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlGU1JlZiBuZXdSZWY7Ci0JRlNTcGVjIG5ld1NwZWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZTUmVmIHBhcmVudFJlZjsKKyAgICBVbmlDaGFyICpuYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBuYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgRlNSZWYgbmV3UmVmOworICAgIEZTU3BlYyBuZXdTcGVjOwogI2lmbmRlZiBGU0NyZWF0ZVJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhGU0NyZWF0ZVJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTQ3JlYXRlUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnUjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZwYXJlbnRSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCUZTQ3JlYXRlUmVzRmlsZSgmcGFyZW50UmVmLAotCSAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgMCwKLQkgICAgICAgICAgICAgICAgKEZTQ2F0YWxvZ0luZm8gKikwLAotCSAgICAgICAgICAgICAgICAmbmV3UmVmLAotCSAgICAgICAgICAgICAgICAmbmV3U3BlYyk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1NwZWMsICZuZXdTcGVjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnUjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZwYXJlbnRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIEZTQ3JlYXRlUmVzRmlsZSgmcGFyZW50UmVmLAorICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgKEZTQ2F0YWxvZ0luZm8gKikwLAorICAgICAgICAgICAgICAgICAgICAmbmV3UmVmLAorICAgICAgICAgICAgICAgICAgICAmbmV3U3BlYyk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZuZXdSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1NwZWMsICZuZXdTcGVjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRlNSZWYgcmVzb3VyY2VGaWxlUmVmOwotCUJvb2xlYW4gaW5DaGFpbjsKLQlTSW50MTYgcmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBGU1JlZiByZXNvdXJjZUZpbGVSZWY7CisgICAgQm9vbGVhbiBpbkNoYWluOworICAgIFNJbnQxNiByZWZOdW07CiAjaWZuZGVmIEZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4KLQlQeU1hY19QUkVDSEVDSyhGU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZXNvdXJjZUZpbGVSZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuKCZyZXNvdXJjZUZpbGVSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5DaGFpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbkNoYWluLAotCSAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnJlc291cmNlRmlsZVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4oJnJlc291cmNlRmlsZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNDcmVhdGVSZXNvdXJjZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgcGFyZW50UmVmOwotCVVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOwotCWludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOwotCWludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187Ci0JRlNSZWYgbmV3UmVmOwotCUZTU3BlYyBuZXdTcGVjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIHBhcmVudFJlZjsKKyAgICBVbmlDaGFyICpuYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBuYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIEZTUmVmIG5ld1JlZjsKKyAgICBGU1NwZWMgbmV3U3BlYzsKICNpZm5kZWYgRlNDcmVhdGVSZXNvdXJjZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhGU0NyZWF0ZVJlc291cmNlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRlNDcmVhdGVSZXNvdXJjZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZ1I3UjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZwYXJlbnRSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCW5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU0NyZWF0ZVJlc291cmNlRmlsZSgmcGFyZW50UmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZTQ2F0YWxvZ0luZm8gKikwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3U3BlYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm5ld1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTU3BlYywgJm5ld1NwZWMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdSN1IyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcGFyZW50UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZUxlbmd0aF9faW5fXywgJm5hbWVMZW5ndGhfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBfZXJyID0gRlNDcmVhdGVSZXNvdXJjZUZpbGUoJnBhcmVudFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUxlbmd0aF9fbGVuX18sIG5hbWVMZW5ndGhfX2luX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGU0NhdGFsb2dJbmZvICopMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fLCBmb3JrTmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1NwZWMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZuZXdSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1NwZWMsICZuZXdTcGVjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19GU09wZW5SZXNvdXJjZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgcmVmOwotCVVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOwotCVVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlTaWduZWRCeXRlIHBlcm1pc3Npb25zOwotCVJlc0ZpbGVSZWZOdW0gcmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIHJlZjsKKyAgICBVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uczsKKyAgICBSZXNGaWxlUmVmTnVtIHJlZk51bTsKICNpZm5kZWYgRlNPcGVuUmVzb3VyY2VGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRlNPcGVuUmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU09wZW5SZXNvdXJjZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZ1I2IiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlmb3JrTmFtZUxlbmd0aF9fbGVuX18gPSBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187Ci0JX2VyciA9IEZTT3BlblJlc291cmNlRmlsZSgmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fLCBmb3JrTmFtZUxlbmd0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnUjYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBfZXJyID0gRlNPcGVuUmVzb3VyY2VGaWxlKCZyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19IYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCWNoYXIgKmJ1ZjsKLQlpbnQgbGVuOwotCUhhbmRsZSBoOwotCVJlc291cmNlT2JqZWN0ICpydjsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGxlbjsKKyAgICBIYW5kbGUgaDsKKyAgICBSZXNvdXJjZU9iamVjdCAqcnY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsICZidWYsICZsZW4pKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaCA9IE5ld0hhbmRsZShsZW4pOwotCWlmICggaCA9PSBOVUxMICkgewotCSAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLQkgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQlITG9jayhoKTsKLQltZW1jcHkoKmgsIGJ1ZiwgbGVuKTsKLQlIVW5sb2NrKGgpOwotCXJ2ID0gKFJlc291cmNlT2JqZWN0ICopUmVzT2JqX05ldyhoKTsKLQlydi0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VIYW5kbGU7Ci0JX3JlcyA9IChQeU9iamVjdCAqKXJ2OwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwgJmJ1ZiwgJmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGggPSBOZXdIYW5kbGUobGVuKTsKKyAgICBpZiAoIGggPT0gTlVMTCApIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIEhMb2NrKGgpOworICAgIG1lbWNweSgqaCwgYnVmLCBsZW4pOworICAgIEhVbmxvY2soaCk7CisgICAgcnYgPSAoUmVzb3VyY2VPYmplY3QgKilSZXNPYmpfTmV3KGgpOworICAgIHJ2LT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZTsKKyAgICBfcmVzID0gKFB5T2JqZWN0ICopcnY7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFJlc19tZXRob2RzW10gPSB7Ci0JeyJDbG9zZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0Nsb3NlUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAotCXsiUmVzRXJyb3IiLCAoUHlDRnVuY3Rpb24pUmVzX1Jlc0Vycm9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDdXJSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19DdXJSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiVXNlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfVXNlUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAotCXsiQ291bnRUeXBlcyIsIChQeUNGdW5jdGlvbilSZXNfQ291bnRUeXBlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkNvdW50MVR5cGVzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudDFUeXBlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldEluZFR5cGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldEluZFR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoUmVzVHlwZSB0aGVUeXBlKSIpfSwKLQl7IkdldDFJbmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxSW5kVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChSZXNUeXBlIHRoZVR5cGUpIil9LAotCXsiU2V0UmVzTG9hZCIsIChQeUNGdW5jdGlvbilSZXNfU2V0UmVzTG9hZCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBsb2FkKSAtPiBOb25lIil9LAotCXsiQ291bnRSZXNvdXJjZXMiLCAoUHlDRnVuY3Rpb24pUmVzX0NvdW50UmVzb3VyY2VzLCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiQ291bnQxUmVzb3VyY2VzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudDFSZXNvdXJjZXMsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRJbmRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0SW5kUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgaW5kZXgpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldDFJbmRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MUluZFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IGluZGV4KSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0UmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgdGhlSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldDFSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MVJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IHRoZUlEKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJHZXROYW1lZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXROYW1lZFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIFN0cjI1NSBuYW1lKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJHZXQxTmFtZWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MU5hbWVkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgU3RyMjU1IG5hbWUpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlVuaXF1ZUlEIiwgKFB5Q0Z1bmN0aW9uKVJlc19VbmlxdWVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlVuaXF1ZTFJRCIsIChQeUNGdW5jdGlvbilSZXNfVW5pcXVlMUlELCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiVXBkYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfVXBkYXRlUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAotCXsiU2V0UmVzUHVyZ2UiLCAoUHlDRnVuY3Rpb24pUmVzX1NldFJlc1B1cmdlLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluc3RhbGwpIC0+IE5vbmUiKX0sCi0JeyJHZXRSZXNGaWxlQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzX0dldFJlc0ZpbGVBdHRycywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldFJlc0ZpbGVBdHRycyIsIChQeUNGdW5jdGlvbilSZXNfU2V0UmVzRmlsZUF0dHJzLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIHNob3J0IGF0dHJzKSAtPiBOb25lIil9LAorICAgIHsiQ2xvc2VSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19DbG9zZVJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IlJlc0Vycm9yIiwgKFB5Q0Z1bmN0aW9uKVJlc19SZXNFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ3VyUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfQ3VyUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlVzZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX1VzZVJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkNvdW50VHlwZXMiLCAoUHlDRnVuY3Rpb24pUmVzX0NvdW50VHlwZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJDb3VudDFUeXBlcyIsIChQeUNGdW5jdGlvbilSZXNfQ291bnQxVHlwZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRJbmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXRJbmRUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKFJlc1R5cGUgdGhlVHlwZSkiKX0sCisgICAgeyJHZXQxSW5kVHlwZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MUluZFR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoUmVzVHlwZSB0aGVUeXBlKSIpfSwKKyAgICB7IlNldFJlc0xvYWQiLCAoUHlDRnVuY3Rpb24pUmVzX1NldFJlc0xvYWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gbG9hZCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvdW50UmVzb3VyY2VzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudFJlc291cmNlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkNvdW50MVJlc291cmNlcyIsIChQeUNGdW5jdGlvbilSZXNfQ291bnQxUmVzb3VyY2VzLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0SW5kUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzX0dldEluZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IGluZGV4KSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXQxSW5kUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzX0dldDFJbmRSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCBpbmRleCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzX0dldFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IHRoZUlEKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXQxUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzX0dldDFSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCB0aGVJRCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TmFtZWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0TmFtZWRSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBTdHIyNTUgbmFtZSkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0MU5hbWVkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzX0dldDFOYW1lZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIFN0cjI1NSBuYW1lKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJVbmlxdWVJRCIsIChQeUNGdW5jdGlvbilSZXNfVW5pcXVlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJVbmlxdWUxSUQiLCAoUHlDRnVuY3Rpb24pUmVzX1VuaXF1ZTFJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlVwZGF0ZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX1VwZGF0ZVJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFJlc1B1cmdlIiwgKFB5Q0Z1bmN0aW9uKVJlc19TZXRSZXNQdXJnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbnN0YWxsKSAtPiBOb25lIil9LAorICAgIHsiR2V0UmVzRmlsZUF0dHJzIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXRSZXNGaWxlQXR0cnMsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJTZXRSZXNGaWxlQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzX1NldFJlc0ZpbGVBdHRycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtLCBzaG9ydCBhdHRycykgLT4gTm9uZSIpfSwKICNpZm5kZWYgX19MUDY0X18KLQl7Ik9wZW5SRlBlcm0iLCAoUHlDRnVuY3Rpb24pUmVzX09wZW5SRlBlcm0sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBmaWxlTmFtZSwgc2hvcnQgdlJlZk51bSwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkhPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfSE9wZW5SZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJIQ3JlYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfSENyZWF0ZVJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKLQl7IkZTcE9wZW5SZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BPcGVuUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIHNwZWMsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJGU3BDcmVhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BDcmVhdGVSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgc3BlYywgT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IE5vbmUiKX0sCisgICAgeyJPcGVuUkZQZXJtIiwgKFB5Q0Z1bmN0aW9uKVJlc19PcGVuUkZQZXJtLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgZmlsZU5hbWUsIHNob3J0IHZSZWZOdW0sIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJIT3BlblJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0hPcGVuUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiSENyZWF0ZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0hDcmVhdGVSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNwT3BlblJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBzcGVjLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiRlNwQ3JlYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNwQ3JlYXRlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHNwZWMsIE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiBOb25lIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXsiSW5zZXJ0UmVzb3VyY2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19JbnNlcnRSZXNvdXJjZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiByZWZOdW0sIFJzcmNDaGFpbkxvY2F0aW9uIHdoZXJlKSAtPiBOb25lIil9LAotCXsiRGV0YWNoUmVzb3VyY2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19EZXRhY2hSZXNvdXJjZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiByZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnRSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0luc2VydFJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHJlZk51bSwgUnNyY0NoYWluTG9jYXRpb24gd2hlcmUpIC0+IE5vbmUiKX0sCisgICAgeyJEZXRhY2hSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0RldGFjaFJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHJlZk51bSkgLT4gTm9uZSIpfSwKICNpZm5kZWYgX19MUDY0X18KLQl7IkZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIHJlc291cmNlRmlsZSkgLT4gKEJvb2xlYW4gX3J2LCBCb29sZWFuIGluQ2hhaW4sIFNJbnQxNiByZWZOdW0pIil9LAotCXsiRlNwT3Blbk9ycGhhblJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTcE9wZW5PcnBoYW5SZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgc3BlYywgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoU0ludDE2IHJlZk51bSkiKX0sCi0JeyJHZXRUb3BSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldFRvcFJlc291cmNlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IHJlZk51bSkiKX0sCi0JeyJHZXROZXh0UmVzb3VyY2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXROZXh0UmVzb3VyY2VGaWxlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgY3VyUmVmTnVtKSAtPiAoU0ludDE2IG5leHRSZWZOdW0pIil9LAorICAgIHsiRlNwUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4iLCAoUHlDRnVuY3Rpb24pUmVzX0ZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgcmVzb3VyY2VGaWxlKSAtPiAoQm9vbGVhbiBfcnYsIEJvb2xlYW4gaW5DaGFpbiwgU0ludDE2IHJlZk51bSkiKX0sCisgICAgeyJGU3BPcGVuT3JwaGFuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNwT3Blbk9ycGhhblJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBzcGVjLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChTSW50MTYgcmVmTnVtKSIpfSwKKyAgICB7IkdldFRvcFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0VG9wUmVzb3VyY2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgcmVmTnVtKSIpfSwKKyAgICB7IkdldE5leHRSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldE5leHRSZXNvdXJjZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBjdXJSZWZOdW0pIC0+IChTSW50MTYgbmV4dFJlZk51bSkiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7IkZTT3BlblJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTT3BlblJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIHJlZiwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkZTT3BlblJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTT3BlblJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIHJlZiwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKICNpZm5kZWYgX19MUDY0X18KLQl7IkZTQ3JlYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNDcmVhdGVSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBwYXJlbnRSZWYsIEJ1ZmZlciBuYW1lTGVuZ3RoKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYykiKX0sCi0JeyJGU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiByZXNvdXJjZUZpbGVSZWYpIC0+IChCb29sZWFuIF9ydiwgQm9vbGVhbiBpbkNoYWluLCBTSW50MTYgcmVmTnVtKSIpfSwKLQl7IkZTQ3JlYXRlUmVzb3VyY2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU0NyZWF0ZVJlc291cmNlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgcGFyZW50UmVmLCBCdWZmZXIgbmFtZUxlbmd0aCwgQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYykiKX0sCisgICAgeyJGU0NyZWF0ZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTQ3JlYXRlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcGFyZW50UmVmLCBCdWZmZXIgbmFtZUxlbmd0aCkgLT4gKEZTUmVmIG5ld1JlZiwgRlNTcGVjIG5ld1NwZWMpIil9LAorICAgIHsiRlNSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbiIsIChQeUNGdW5jdGlvbilSZXNfRlNSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcmVzb3VyY2VGaWxlUmVmKSAtPiAoQm9vbGVhbiBfcnYsIEJvb2xlYW4gaW5DaGFpbiwgU0ludDE2IHJlZk51bSkiKX0sCisgICAgeyJGU0NyZWF0ZVJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNDcmVhdGVSZXNvdXJjZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIHBhcmVudFJlZiwgQnVmZmVyIG5hbWVMZW5ndGgsIEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCkgLT4gKEZTUmVmIG5ld1JlZiwgRlNTcGVjIG5ld1NwZWMpIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0JeyJGU09wZW5SZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTT3BlblJlc291cmNlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgcmVmLCBCdWZmZXIgZm9ya05hbWVMZW5ndGgsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbnMpIC0+IChTSW50MTYgcmVmTnVtKSIpfSwKLQl7IkhhbmRsZSIsIChQeUNGdW5jdGlvbilSZXNfSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIkNvbnZlcnQgYSBzdHJpbmcgdG8gYSBIYW5kbGUgb2JqZWN0LlxuXG5SZXNvdXJjZSgpIGFuZCBIYW5kbGUoKSBhcmUgdmVyeSBzaW1pbGFyLCBidXQgb2JqZWN0cyBjcmVhdGVkIHdpdGggSGFuZGxlKCkgYXJlXG5ieSBkZWZhdWx0IGF1dG9tYXRpY2FsbHkgRGlzcG9zZUhhbmRsZSgpZCB1cG9uIG9iamVjdCBjbGVhbnVwLiBVc2UgQXV0b0Rpc3Bvc2UoKVxudG8gY2hhbmdlIHRoaXMuXG4iKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJGU09wZW5SZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTT3BlblJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcmVmLCBCdWZmZXIgZm9ya05hbWVMZW5ndGgsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbnMpIC0+IChTSW50MTYgcmVmTnVtKSIpfSwKKyAgICB7IkhhbmRsZSIsIChQeUNGdW5jdGlvbilSZXNfSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIkNvbnZlcnQgYSBzdHJpbmcgdG8gYSBIYW5kbGUgb2JqZWN0LlxuXG5SZXNvdXJjZSgpIGFuZCBIYW5kbGUoKSBhcmUgdmVyeSBzaW1pbGFyLCBidXQgb2JqZWN0cyBjcmVhdGVkIHdpdGggSGFuZGxlKCkgYXJlXG5ieSBkZWZhdWx0IGF1dG9tYXRpY2FsbHkgRGlzcG9zZUhhbmRsZSgpZCB1cG9uIG9iamVjdCBjbGVhbnVwLiBVc2UgQXV0b0Rpc3Bvc2UoKVxudG8gY2hhbmdlIHRoaXMuXG4iKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTE2OTYsNjQgKzE2OTYsNjQgQEAKIC8qIEFsdGVybmF0aXZlIHZlcnNpb24gb2YgUmVzT2JqX05ldywgd2hpY2ggcmV0dXJucyBOb25lIGZvciBudWxsIGFyZ3VtZW50ICovCiBQeU9iamVjdCAqT3B0UmVzT2JqX05ldyhIYW5kbGUgaXRzZWxmKQogewotICAgICAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFJlc09ial9OZXcoaXRzZWxmKTsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFJlc09ial9OZXcoaXRzZWxmKTsKIH0KIAogaW50IE9wdFJlc09ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBIYW5kbGUgKnBfaXRzZWxmKQogewotICAgICAgICBQeU9iamVjdCAqdG1wOworICAgIFB5T2JqZWN0ICp0bXA7CiAKLSAgICAgICAgaWYgKCB2ID09IFB5X05vbmUgKSB7Ci0gICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoUmVzT2JqX0NoZWNrKHYpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gKChSZXNvdXJjZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogSWYgaXQgaXNuJ3QgYSByZXNvdXJjZSB5ZXQgc2VlIHdoZXRoZXIgaXQgaXMgY29udmVydGlibGUgKi8KLSAgICAgICAgaWYgKCAodG1wPVB5T2JqZWN0X0NhbGxNZXRob2QodiwgImFzX1Jlc291cmNlIiwgIiIpKSApIHsKLSAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdG1wKS0+b2JfaXRzZWxmOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJSZXNvdXJjZSByZXF1aXJlZCIpOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHYgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChSZXNPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIC8qIElmIGl0IGlzbid0IGEgcmVzb3VyY2UgeWV0IHNlZSB3aGV0aGVyIGl0IGlzIGNvbnZlcnRpYmxlICovCisgICAgaWYgKCAodG1wPVB5T2JqZWN0X0NhbGxNZXRob2QodiwgImFzX1Jlc291cmNlIiwgIiIpKSApIHsKKyAgICAgICAgKnBfaXRzZWxmID0gKChSZXNvdXJjZU9iamVjdCAqKXRtcCktPm9iX2l0c2VsZjsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJSZXNvdXJjZSByZXF1aXJlZCIpOworICAgIHJldHVybiAwOwogfQogCiAKIHZvaWQgaW5pdF9SZXModm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEhhbmRsZSwgUmVzT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoSGFuZGxlLCBSZXNPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhIYW5kbGUsIE9wdFJlc09ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEhhbmRsZSwgT3B0UmVzT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhIYW5kbGUsIFJlc09ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoSGFuZGxlLCBSZXNPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEhhbmRsZSwgT3B0UmVzT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChIYW5kbGUsIE9wdFJlc09ial9Db252ZXJ0KTsKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9SZXMiLCBSZXNfbWV0aG9kcyk7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JUmVzX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoUmVzX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgUmVzX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JUmVzb3VyY2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlJlc291cmNlX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmUmVzb3VyY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSZXNvdXJjZSIsIChQeU9iamVjdCAqKSZSZXNvdXJjZV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlJlc291cmNlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUmVzb3VyY2VUeXBlIiwgKFB5T2JqZWN0ICopJlJlc291cmNlX1R5cGUpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfUmVzIiwgUmVzX21ldGhvZHMpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFJlc19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFJlc19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFJlc19FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFJlc291cmNlX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZSZXNvdXJjZV9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJlJlc291cmNlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUmVzb3VyY2UiLCAoUHlPYmplY3QgKikmUmVzb3VyY2VfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZSZXNvdXJjZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJlc291cmNlVHlwZSIsIChQeU9iamVjdCAqKSZSZXNvdXJjZV9UeXBlKTsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09IEVuZCBtb2R1bGUgX1JlcyA9PT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9zY3JhcC9fU2NyYXBtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL3NjcmFwL19TY3JhcG1vZHVsZS5jCmluZGV4IDE0ZTNmZDIuLmYyNGVkOGIgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3NjcmFwL19TY3JhcG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3NjcmFwL19TY3JhcG1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yNywxOTkgKzI3LDE5OSBAQAogI2RlZmluZSBTY3JhcE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZTY3JhcF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZTY3JhcF9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgU2NyYXBPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlTY3JhcFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFNjcmFwUmVmIG9iX2l0c2VsZjsKIH0gU2NyYXBPYmplY3Q7CiAKIFB5T2JqZWN0ICpTY3JhcE9ial9OZXcoU2NyYXBSZWYgaXRzZWxmKQogewotCVNjcmFwT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhTY3JhcE9iamVjdCwgJlNjcmFwX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBTY3JhcE9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoU2NyYXBPYmplY3QsICZTY3JhcF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiBpbnQgU2NyYXBPYmpfQ29udmVydChQeU9iamVjdCAqdiwgU2NyYXBSZWYgKnBfaXRzZWxmKQogewotCWlmICghU2NyYXBPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiU2NyYXAgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoU2NyYXBPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghU2NyYXBPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiU2NyYXAgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoU2NyYXBPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBTY3JhcE9ial9kZWFsbG9jKFNjcmFwT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTY3JhcE9ial9HZXRTY3JhcEZsYXZvckZsYWdzKFNjcmFwT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOwotCVNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmbGF2b3JUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFNjcmFwRmxhdm9yRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGF2b3JGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhdm9yRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOworICAgIFNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmbGF2b3JUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNjcmFwRmxhdm9yRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGF2b3JGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX0dldFNjcmFwRmxhdm9yU2l6ZShTY3JhcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZTsKLQlTaXplIGJ5dGVDb3VudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZTsKKyAgICBTaXplIGJ5dGVDb3VudDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTY3JhcE9ial9HZXRTY3JhcEZsYXZvckRhdGEoU2NyYXBPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGU7Ci0JU2l6ZSBieXRlQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGU7CisgICAgU2l6ZSBieXRlQ291bnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGludClieXRlQ291bnQpOwotCWlmICggX3JlcyA9PSBOVUxMICkgcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFNjcmFwRmxhdm9yRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoX3JlcykpOwotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JCVB5X1hERUNSRUYoX3Jlcyk7Ci0JCXJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmbGF2b3JUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNjcmFwRmxhdm9yU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChpbnQpYnl0ZUNvdW50KTsKKyAgICBpZiAoIF9yZXMgPT0gTlVMTCApIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTY3JhcEZsYXZvckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKF9yZXMpKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgeworICAgICAgICBQeV9YREVDUkVGKF9yZXMpOworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX1B1dFNjcmFwRmxhdm9yKFNjcmFwT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOwotCVNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3M7Ci0JY2hhciAqZmxhdm9yRGF0YV9faW5fXzsKLQlpbnQgZmxhdm9yRGF0YV9faW5fbGVuX187Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZLcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmbGF2b3JUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhdm9yRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGF2b3JEYXRhX19pbl9fLCAmZmxhdm9yRGF0YV9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0U2NyYXBGbGF2b3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIChTaXplKWZsYXZvckRhdGFfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JEYXRhX19pbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZTsKKyAgICBTY3JhcEZsYXZvckZsYWdzIGZsYXZvckZsYWdzOworICAgIGNoYXIgKmZsYXZvckRhdGFfX2luX187CisgICAgaW50IGZsYXZvckRhdGFfX2luX2xlbl9fOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mS3MjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmxhdm9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvckZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhdm9yRGF0YV9faW5fXywgJmZsYXZvckRhdGFfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dFNjcmFwRmxhdm9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvckZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoU2l6ZSlmbGF2b3JEYXRhX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yRGF0YV9faW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JDb3VudChTY3JhcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaW5mb0NvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JDb3VudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvQ291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGluZm9Db3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGluZm9Db3VudDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNjcmFwRmxhdm9yQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb0NvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX0dldFNjcmFwRmxhdm9ySW5mb0xpc3QoU2NyYXBPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVB5T2JqZWN0ICppdGVtOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluZm9Db3VudDsKLQlTY3JhcEZsYXZvckluZm8gKmluZm9saXN0ID0gTlVMTDsKLQlpbnQgaTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFNjcmFwRmxhdm9yQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb0NvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCWlmIChpbmZvQ291bnQgPT0gMCkgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIltdIik7Ci0JCi0JaWYgKChpbmZvbGlzdCA9IChTY3JhcEZsYXZvckluZm8gKiltYWxsb2MoaW5mb0NvdW50KnNpemVvZihTY3JhcEZsYXZvckluZm8pKSkgPT0gTlVMTCApCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQotCV9lcnIgPSBHZXRTY3JhcEZsYXZvckluZm9MaXN0KF9zZWxmLT5vYl9pdHNlbGYsICZpbmZvQ291bnQsIGluZm9saXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgewotCQlmcmVlKGluZm9saXN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgoX3JlcyA9IFB5TGlzdF9OZXcoaW5mb0NvdW50KSkgPT0gTlVMTCApIHsKLQkJZnJlZShpbmZvbGlzdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmb3IoaT0wOyBpPGluZm9Db3VudDsgaSsrKSB7Ci0JCWl0ZW0gPSBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgaW5mb2xpc3RbaV0uZmxhdm9yVHlwZSwKLQkJCWluZm9saXN0W2ldLmZsYXZvckZsYWdzKTsKLQkJaWYgKCAhaXRlbSB8fCBQeUxpc3RfU2V0SXRlbShfcmVzLCBpLCBpdGVtKSA8IDAgKSB7Ci0JCQlQeV9ERUNSRUYoX3Jlcyk7Ci0JCQlmcmVlKGluZm9saXN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWZyZWUoaW5mb2xpc3QpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbmZvQ291bnQ7CisgICAgU2NyYXBGbGF2b3JJbmZvICppbmZvbGlzdCA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNjcmFwRmxhdm9yQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb0NvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIGlmIChpbmZvQ291bnQgPT0gMCkgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIltdIik7CisKKyAgICBpZiAoKGluZm9saXN0ID0gKFNjcmFwRmxhdm9ySW5mbyAqKW1hbGxvYyhpbmZvQ291bnQqc2l6ZW9mKFNjcmFwRmxhdm9ySW5mbykpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JJbmZvTGlzdChfc2VsZi0+b2JfaXRzZWxmLCAmaW5mb0NvdW50LCBpbmZvbGlzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgZnJlZShpbmZvbGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoKF9yZXMgPSBQeUxpc3RfTmV3KGluZm9Db3VudCkpID09IE5VTEwgKSB7CisgICAgICAgIGZyZWUoaW5mb2xpc3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yKGk9MDsgaTxpbmZvQ291bnQ7IGkrKykgeworICAgICAgICBpdGVtID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGluZm9saXN0W2ldLmZsYXZvclR5cGUsCisgICAgICAgICAgICBpbmZvbGlzdFtpXS5mbGF2b3JGbGFncyk7CisgICAgICAgIGlmICggIWl0ZW0gfHwgUHlMaXN0X1NldEl0ZW0oX3JlcywgaSwgaXRlbSkgPCAwICkgeworICAgICAgICAgICAgUHlfREVDUkVGKF9yZXMpOworICAgICAgICAgICAgZnJlZShpbmZvbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmcmVlKGluZm9saXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNjcmFwT2JqX21ldGhvZHNbXSA9IHsKLQl7IkdldFNjcmFwRmxhdm9yRmxhZ3MiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGUpIC0+IChTY3JhcEZsYXZvckZsYWdzIGZsYXZvckZsYWdzKSIpfSwKLQl7IkdldFNjcmFwRmxhdm9yU2l6ZSIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvclNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlKSAtPiAoU2l6ZSBieXRlQ291bnQpIil9LAotCXsiR2V0U2NyYXBGbGF2b3JEYXRhIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX0dldFNjcmFwRmxhdm9yRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGUsIEJ1ZmZlciBkZXN0aW5hdGlvbikgLT4gKFNpemUgYnl0ZUNvdW50KSIpfSwKLQl7IlB1dFNjcmFwRmxhdm9yIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX1B1dFNjcmFwRmxhdm9yLCAxLAotCSBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSwgU2NyYXBGbGF2b3JGbGFncyBmbGF2b3JGbGFncywgU2l6ZSBmbGF2b3JTaXplLCBCdWZmZXIgZmxhdm9yRGF0YSkgLT4gTm9uZSIpfSwKLQl7IkdldFNjcmFwRmxhdm9yQ291bnQiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGluZm9Db3VudCkiKX0sCi0JeyJHZXRTY3JhcEZsYXZvckluZm9MaXN0IiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX0dldFNjcmFwRmxhdm9ySW5mb0xpc3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFsoU2NyYXBGbGF2b3JUeXBlLCBTY3JhcEZsYXZvckluZm8pLCAuLi5dKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldFNjcmFwRmxhdm9yRmxhZ3MiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGUpIC0+IChTY3JhcEZsYXZvckZsYWdzIGZsYXZvckZsYWdzKSIpfSwKKyAgICB7IkdldFNjcmFwRmxhdm9yU2l6ZSIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvclNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlKSAtPiAoU2l6ZSBieXRlQ291bnQpIil9LAorICAgIHsiR2V0U2NyYXBGbGF2b3JEYXRhIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX0dldFNjcmFwRmxhdm9yRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGUsIEJ1ZmZlciBkZXN0aW5hdGlvbikgLT4gKFNpemUgYnl0ZUNvdW50KSIpfSwKKyAgICB7IlB1dFNjcmFwRmxhdm9yIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX1B1dFNjcmFwRmxhdm9yLCAxLAorICAgICBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSwgU2NyYXBGbGF2b3JGbGFncyBmbGF2b3JGbGFncywgU2l6ZSBmbGF2b3JTaXplLCBCdWZmZXIgZmxhdm9yRGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFNjcmFwRmxhdm9yQ291bnQiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGluZm9Db3VudCkiKX0sCisgICAgeyJHZXRTY3JhcEZsYXZvckluZm9MaXN0IiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX0dldFNjcmFwRmxhdm9ySW5mb0xpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFsoU2NyYXBGbGF2b3JUeXBlLCBTY3JhcEZsYXZvckluZm8pLCAuLi5dKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIFB5TWV0aG9kQ2hhaW4gU2NyYXBPYmpfY2hhaW4gPSB7IFNjcmFwT2JqX21ldGhvZHMsIE5VTEwgfTsKIAogc3RhdGljIFB5T2JqZWN0ICpTY3JhcE9ial9nZXRhdHRyKFNjcmFwT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kSW5DaGFpbigmU2NyYXBPYmpfY2hhaW4sIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kSW5DaGFpbigmU2NyYXBPYmpfY2hhaW4sIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogfQogCiAjZGVmaW5lIFNjcmFwT2JqX3NldGF0dHIgTlVMTApAQCAtMjMxLDEwNyArMjMxLDEwNyBAQAogI2RlZmluZSBTY3JhcE9ial9oYXNoIE5VTEwKIAogUHlUeXBlT2JqZWN0IFNjcmFwX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1NjcmFwLlNjcmFwIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoU2NyYXBPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBTY3JhcE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykgU2NyYXBPYmpfZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpIFNjcmFwT2JqX3NldGF0dHIsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIFNjcmFwT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBTY3JhcE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgU2NyYXBPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfU2NyYXAuU2NyYXAiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihTY3JhcE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFNjcmFwT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKSBTY3JhcE9ial9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykgU2NyYXBPYmpfc2V0YXR0ciwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgU2NyYXBPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFNjcmFwT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBTY3JhcE9ial9oYXNoLCAvKnRwX2hhc2gqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBTY3JhcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBfTG9hZFNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTG9hZFNjcmFwKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMb2FkU2NyYXAoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTY3JhcF9VbmxvYWRTY3JhcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVubG9hZFNjcmFwKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVbmxvYWRTY3JhcCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwX0dldEN1cnJlbnRTY3JhcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTY3JhcFJlZiBzY3JhcDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEN1cnJlbnRTY3JhcCgmc2NyYXApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBTY3JhcE9ial9OZXcsIHNjcmFwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTY3JhcFJlZiBzY3JhcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEN1cnJlbnRTY3JhcCgmc2NyYXApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTY3JhcE9ial9OZXcsIHNjcmFwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTY3JhcF9DbGVhckN1cnJlbnRTY3JhcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENsZWFyQ3VycmVudFNjcmFwKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbGVhckN1cnJlbnRTY3JhcCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwX0NhbGxJblNjcmFwUHJvbWlzZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDYWxsSW5TY3JhcFByb21pc2VzKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDYWxsSW5TY3JhcFByb21pc2VzKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNjcmFwX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkxvYWRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9Mb2FkU2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlVubG9hZFNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX1VubG9hZFNjcmFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRDdXJyZW50U2NyYXAiLCAoUHlDRnVuY3Rpb24pU2NyYXBfR2V0Q3VycmVudFNjcmFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTY3JhcFJlZiBzY3JhcCkiKX0sCi0JeyJDbGVhckN1cnJlbnRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9DbGVhckN1cnJlbnRTY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ2FsbEluU2NyYXBQcm9taXNlcyIsIChQeUNGdW5jdGlvbilTY3JhcF9DYWxsSW5TY3JhcFByb21pc2VzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJMb2FkU2NyYXAiLCAoUHlDRnVuY3Rpb24pU2NyYXBfTG9hZFNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJVbmxvYWRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9VbmxvYWRTY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q3VycmVudFNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX0dldEN1cnJlbnRTY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU2NyYXBSZWYgc2NyYXApIil9LAorICAgIHsiQ2xlYXJDdXJyZW50U2NyYXAiLCAoUHlDRnVuY3Rpb24pU2NyYXBfQ2xlYXJDdXJyZW50U2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNhbGxJblNjcmFwUHJvbWlzZXMiLCAoUHlDRnVuY3Rpb24pU2NyYXBfQ2FsbEluU2NyYXBQcm9taXNlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTMzOSwyNSArMzM5LDI1IEBACiAKIHZvaWQgaW5pdF9TY3JhcCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1NjcmFwIiwgU2NyYXBfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9TY3JhcCIsIFNjcmFwX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVNjcmFwX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoU2NyYXBfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBTY3JhcF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCVNjcmFwX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlQeV9JTkNSRUYoJlNjcmFwX1R5cGUpOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU2NyYXBUeXBlIiwgKFB5T2JqZWN0ICopJlNjcmFwX1R5cGUpICE9IDApCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgU2NyYXBUeXBlIik7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgU2NyYXBfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChTY3JhcF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFNjcmFwX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgU2NyYXBfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIFB5X0lOQ1JFRigmU2NyYXBfVHlwZSk7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTY3JhcFR5cGUiLCAoUHlPYmplY3QgKikmU2NyYXBfVHlwZSkgIT0gMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBTY3JhcFR5cGUiKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9zbmQvX1NuZGlob29rcy5jIGIvTWFjL01vZHVsZXMvc25kL19TbmRpaG9va3MuYwppbmRleCA3NGNhZDliLi4yNTRmYzBjIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9zbmQvX1NuZGlob29rcy5jCisrKyBiL01hYy9Nb2R1bGVzL3NuZC9fU25kaWhvb2tzLmMKQEAgLTM1LDEzICszNSwxMyBAQAogCiAjcHJhZ21hIG9wdGlvbnMgYWxpZ249bWFjNjhrCiBzdHJ1Y3QgU2FtcGxlUmF0ZUF2YWlsYWJsZV9hcmcgewotCXNob3J0CW51bXJhdGVzOwotCUhhbmRsZQlyYXRlczsKKyAgICBzaG9ydCAgICAgICBudW1yYXRlczsKKyAgICBIYW5kbGUgICAgICByYXRlczsKIH07CiAKIHN0cnVjdCBTYW1wbGVTaXplQXZhaWxhYmxlX2FyZyB7Ci0Jc2hvcnQJbnVtc2l6ZXM7Ci0JSGFuZGxlCXNpemVzOworICAgIHNob3J0ICAgICAgIG51bXNpemVzOworICAgIEhhbmRsZSAgICAgIHNpemVzOwogfTsKIAogI3ByYWdtYSBvcHRpb25zIGFsaWduPXJlc2V0CkBAIC01MywyOCArNTMsMjggQEAKIHN0YXRpYyBpbnQKIFB5TWFjX0dldFVGaXhlZChQeU9iamVjdCAqdiwgRml4ZWQgKmYpCiB7Ci0JZG91YmxlIGQ7Ci0JdW5zaWduZWQgbG9uZyB1bnM7Ci0JCi0JaWYoICFQeUFyZ19QYXJzZSh2LCAiZCIsICZkKSkKLQkJcmV0dXJuIDA7Ci0JdW5zID0gKHVuc2lnbmVkIGxvbmcpKGQgKiAweDEwMDAwKTsKLQkqZiA9IChGaXhlZCl1bnM7Ci0JcmV0dXJuIDE7CisgICAgZG91YmxlIGQ7CisgICAgdW5zaWduZWQgbG9uZyB1bnM7CisKKyAgICBpZiggIVB5QXJnX1BhcnNlKHYsICJkIiwgJmQpKQorICAgICAgICByZXR1cm4gMDsKKyAgICB1bnMgPSAodW5zaWduZWQgbG9uZykoZCAqIDB4MTAwMDApOworICAgICpmID0gKEZpeGVkKXVuczsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogQ29udmVydCBhIFBvaW50IHRvIGEgUHl0aG9uIG9iamVjdCAqLwogc3RhdGljIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkVUZpeGVkKEZpeGVkIGYpCiB7Ci0JZG91YmxlIGQ7Ci0JdW5zaWduZWQgbG9uZyBmdW5zOwotCQotCWZ1bnMgPSAodW5zaWduZWQgbG9uZylmOwotCQotCWQgPSBmdW5zOwotCWQgPSBkIC8gMHgxMDAwMDsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZCIsIGQpOworICAgIGRvdWJsZSBkOworICAgIHVuc2lnbmVkIGxvbmcgZnVuczsKKworICAgIGZ1bnMgPSAodW5zaWduZWQgbG9uZylmOworCisgICAgZCA9IGZ1bnM7CisgICAgZCA9IGQgLyAweDEwMDAwOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJkIiwgZCk7CiB9CiAKIApAQCAtODYsMTkgKzg2LDE5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9nZXRDaGFubmVsQXZhaWxhYmxlKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgbmNoYW5uZWw7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgbmNoYW5uZWw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lDaGFubmVsQXZhaWxhYmxlLCAoUHRyKSZuY2hhbm5lbCkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBuY2hhbm5lbCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUNoYW5uZWxBdmFpbGFibGUsIChQdHIpJm5jaGFubmVsKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIG5jaGFubmVsKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0TnVtYmVyQ2hhbm5lbHNfX2RvY19fW10gPQpAQCAtMTA3LDE5ICsxMDcsMTkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX2dldE51bWJlckNoYW5uZWxzKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgbmNoYW5uZWw7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgbmNoYW5uZWw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lOdW1iZXJDaGFubmVscywgKFB0cikmbmNoYW5uZWwpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgbmNoYW5uZWwpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lOdW1iZXJDaGFubmVscywgKFB0cikmbmNoYW5uZWwpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgbmNoYW5uZWwpOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9zZXROdW1iZXJDaGFubmVsc19fZG9jX19bXSA9CkBAIC0xMjgsMjAgKzEyOCwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0TnVtYmVyQ2hhbm5lbHMoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBuY2hhbm5lbDsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBuY2hhbm5lbDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmbmNoYW5uZWwpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaU51bWJlckNoYW5uZWxzLCAoUHRyKSZuY2hhbm5lbCkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZuY2hhbm5lbCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCU2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lOdW1iZXJDaGFubmVscywgKFB0cikmbmNoYW5uZWwpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0Q29udGludW91c19fZG9jX19bXSA9CkBAIC0xNTAsMTkgKzE1MCwxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0Q29udGludW91cyhzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IG9ub2ZmOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IG9ub2ZmOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpQ29udGludW91cywgKFB0cikmb25vZmYpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgb25vZmYpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lDb250aW51b3VzLCAoUHRyKSZvbm9mZikpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBvbm9mZik7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX3NldENvbnRpbnVvdXNfX2RvY19fW10gPQpAQCAtMTcxLDIwICsxNzEsMjAgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX3NldENvbnRpbnVvdXMoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBvbm9mZjsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBvbm9mZjsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmb25vZmYpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUNvbnRpbnVvdXMsIChQdHIpJm9ub2ZmKSkgIT0gbm9FcnIgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaCIsICZpblJlZk51bSwgJm9ub2ZmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUNvbnRpbnVvdXMsIChQdHIpJm9ub2ZmKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX2dldElucHV0U291cmNlTmFtZXNfX2RvY19fW10gPQpAQCAtMTkzLDE5ICsxOTMsMTkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX2dldElucHV0U291cmNlTmFtZXMoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlIYW5kbGUgbmFtZXM7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgSGFuZGxlIG5hbWVzOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2VOYW1lcywgKFB0cikmbmFtZXMpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFJlc09ial9OZXcsIG5hbWVzKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2VOYW1lcywgKFB0cikmbmFtZXMpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFJlc09ial9OZXcsIG5hbWVzKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0SW5wdXRTb3VyY2VfX2RvY19fW10gPQpAQCAtMjE0LDE5ICsyMTQsMTkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX2dldElucHV0U291cmNlKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgc291cmNlOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IHNvdXJjZTsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUlucHV0U291cmNlLCAoUHRyKSZzb3VyY2UpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc291cmNlKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2UsIChQdHIpJnNvdXJjZSkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzb3VyY2UpOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9zZXRJbnB1dFNvdXJjZV9fZG9jX19bXSA9CkBAIC0yMzUsMjAgKzIzNSwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0SW5wdXRTb3VyY2Uoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBzb3VyY2U7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgc291cmNlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZzb3VyY2UpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUlucHV0U291cmNlLCAoUHRyKSZzb3VyY2UpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmc291cmNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUlucHV0U291cmNlLCAoUHRyKSZzb3VyY2UpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0UGxheVRocnVPbk9mZl9fZG9jX19bXSA9CkBAIC0yNTcsMTkgKzI1NywxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0UGxheVRocnVPbk9mZihzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IG9ub2ZmOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IG9ub2ZmOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpUGxheVRocnVPbk9mZiwgKFB0cikmb25vZmYpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgb25vZmYpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lQbGF5VGhydU9uT2ZmLCAoUHRyKSZvbm9mZikpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBvbm9mZik7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX3NldFBsYXlUaHJ1T25PZmZfX2RvY19fW10gPQpAQCAtMjc4LDIwICsyNzgsMjAgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX3NldFBsYXlUaHJ1T25PZmYoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBvbm9mZjsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBvbm9mZjsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmb25vZmYpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVBsYXlUaHJ1T25PZmYsIChQdHIpJm9ub2ZmKSkgIT0gbm9FcnIgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaCIsICZpblJlZk51bSwgJm9ub2ZmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVBsYXlUaHJ1T25PZmYsIChQdHIpJm9ub2ZmKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX2dldFNhbXBsZVJhdGVfX2RvY19fW10gPQpAQCAtMzAwLDE5ICszMDAsMTkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX2dldFNhbXBsZVJhdGUoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlGaXhlZCBzYW1wbGVfcmF0ZTsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBGaXhlZCBzYW1wbGVfcmF0ZTsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVJhdGUsIChQdHIpJnNhbXBsZV9yYXRlKSkgIT0gbm9FcnIgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFVGaXhlZCwgc2FtcGxlX3JhdGUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lTYW1wbGVSYXRlLCAoUHRyKSZzYW1wbGVfcmF0ZSkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRVRml4ZWQsIHNhbXBsZV9yYXRlKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfc2V0U2FtcGxlUmF0ZV9fZG9jX19bXSA9CkBAIC0zMjEsMjAgKzMyMSwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0U2FtcGxlUmF0ZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCUZpeGVkIHNhbXBsZV9yYXRlOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIEZpeGVkIHNhbXBsZV9yYXRlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibE8mIiwgJmluUmVmTnVtLCBQeU1hY19HZXRVRml4ZWQsICZzYW1wbGVfcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlUmF0ZSwgKFB0cikmc2FtcGxlX3JhdGUpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxPJiIsICZpblJlZk51bSwgUHlNYWNfR2V0VUZpeGVkLCAmc2FtcGxlX3JhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlUmF0ZSwgKFB0cikmc2FtcGxlX3JhdGUpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0U2FtcGxlU2l6ZV9fZG9jX19bXSA9CkBAIC0zNDMsMTkgKzM0MywxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0U2FtcGxlU2l6ZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IGJpdHM7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgYml0czsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemUsIChQdHIpJmJpdHMpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgYml0cyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemUsIChQdHIpJmJpdHMpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgYml0cyk7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX3NldFNhbXBsZVNpemVfX2RvY19fW10gPQpAQCAtMzY0LDIwICszNjQsMjAgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX3NldFNhbXBsZVNpemUoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBzaXplOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IHNpemU7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaCIsICZpblJlZk51bSwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemUsIChQdHIpJnNpemUpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCU2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lTYW1wbGVTaXplLCAoUHRyKSZzaXplKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX2dldFNhbXBsZVNpemVBdmFpbGFibGVfX2RvY19fW10gPQpAQCAtMzg2LDMxICszODYsMzEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX2dldFNhbXBsZVNpemVBdmFpbGFibGUoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzdHJ1Y3QgU2FtcGxlU2l6ZUF2YWlsYWJsZV9hcmcgYXJnOwotCU9TRXJyIGVycjsKLQlQeU9iamVjdCAqcnNpemVzOwotCXNob3J0ICpmc2l6ZXM7Ci0JaW50IGk7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzdHJ1Y3QgU2FtcGxlU2l6ZUF2YWlsYWJsZV9hcmcgYXJnOworICAgIE9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqcnNpemVzOworICAgIHNob3J0ICpmc2l6ZXM7CisgICAgaW50IGk7CiAKLQlhcmcuc2l6ZXMgPSBOVUxMOwotCXJzaXplcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lTYW1wbGVTaXplQXZhaWxhYmxlLCAoUHRyKSZhcmcpKSAhPSBub0VyciApIHsKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JfQotCWZzaXplcyA9IChzaG9ydCAqKSooYXJnLnNpemVzKTsKLQkvKiBIYW5kbGUgY29udGFpbnMgYSBsaXN0IG9mIHJhdGVzICovCi0JaWYoIChyc2l6ZXMgPSBQeVR1cGxlX05ldyhhcmcubnVtc2l6ZXMpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IoIGk9MDsgaTxhcmcubnVtc2l6ZXM7IGkrKyApCi0JCVB5VHVwbGVfU2V0SXRlbShyc2l6ZXMsIGksIFB5SW50X0Zyb21Mb25nKChsb25nKWZzaXplc1tpXSkpOwotCXJldHVybiByc2l6ZXM7CisgICAgYXJnLnNpemVzID0gTlVMTDsKKyAgICByc2l6ZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lTYW1wbGVTaXplQXZhaWxhYmxlLCAoUHRyKSZhcmcpKSAhPSBub0VyciApIHsKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgfQorICAgIGZzaXplcyA9IChzaG9ydCAqKSooYXJnLnNpemVzKTsKKyAgICAvKiBIYW5kbGUgY29udGFpbnMgYSBsaXN0IG9mIHJhdGVzICovCisgICAgaWYoIChyc2l6ZXMgPSBQeVR1cGxlX05ldyhhcmcubnVtc2l6ZXMpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IoIGk9MDsgaTxhcmcubnVtc2l6ZXM7IGkrKyApCisgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyc2l6ZXMsIGksIFB5SW50X0Zyb21Mb25nKChsb25nKWZzaXplc1tpXSkpOworICAgIHJldHVybiByc2l6ZXM7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX2dldFNhbXBsZVJhdGVBdmFpbGFibGVfX2RvY19fW10gPQpAQCAtNDE5LDk0ICs0MTksOTQgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX2dldFNhbXBsZVJhdGVBdmFpbGFibGUoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzdHJ1Y3QgU2FtcGxlUmF0ZUF2YWlsYWJsZV9hcmcgYXJnOwotCU9TRXJyIGVycjsKLQlQeU9iamVjdCAqcnJhdGVzLCAqb2JqOwotCUZpeGVkICpmcmF0ZXM7Ci0JaW50IGk7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzdHJ1Y3QgU2FtcGxlUmF0ZUF2YWlsYWJsZV9hcmcgYXJnOworICAgIE9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqcnJhdGVzLCAqb2JqOworICAgIEZpeGVkICpmcmF0ZXM7CisgICAgaW50IGk7CiAKLQlhcmcucmF0ZXMgPSBOVUxMOwotCXJyYXRlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lTYW1wbGVSYXRlQXZhaWxhYmxlLCAoUHRyKSZhcmcpKSAhPSBub0VyciApIHsKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JfQotCWZyYXRlcyA9IChGaXhlZCAqKSooYXJnLnJhdGVzKTsKLQlpZiggYXJnLm51bXJhdGVzID09IDAgKSB7Ci0JCS8qIFRoZSBoYW5kbGUgY29udGFpbnMgdXBwZXIgYW5kIGxvd2VyYm91bmQgKi8KLQkJcnJhdGVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsIGZyYXRlc1swXSwgZnJhdGVzWzFdKTsKLQkJaWYgKHJyYXRlcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQl9IGVsc2UgewotCQkvKiBIYW5kbGUgY29udGFpbnMgYSBsaXN0IG9mIHJhdGVzICovCi0JCWlmKCAocnJhdGVzID0gUHlUdXBsZV9OZXcoYXJnLm51bXJhdGVzKSkgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlmb3IoIGk9MDsgaTxhcmcubnVtcmF0ZXM7IGkrKyApIHsKLQkJCWlmKCAob2JqID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFVGaXhlZCwgZnJhdGVzW2ldKSk9PU5VTEwpCi0JCQkJZ290byBvdXQ7Ci0JCQlQeVR1cGxlX1NldEl0ZW0ocnJhdGVzLCBpLCBvYmopOwotCQl9Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoTyIsIGFyZy5udW1yYXRlcywgcnJhdGVzKTsKKyAgICBhcmcucmF0ZXMgPSBOVUxMOworICAgIHJyYXRlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVJhdGVBdmFpbGFibGUsIChQdHIpJmFyZykpICE9IG5vRXJyICkgeworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICB9CisgICAgZnJhdGVzID0gKEZpeGVkICopKihhcmcucmF0ZXMpOworICAgIGlmKCBhcmcubnVtcmF0ZXMgPT0gMCApIHsKKyAgICAgICAgLyogVGhlIGhhbmRsZSBjb250YWlucyB1cHBlciBhbmQgbG93ZXJib3VuZCAqLworICAgICAgICBycmF0ZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgZnJhdGVzWzBdLCBmcmF0ZXNbMV0pOworICAgICAgICBpZiAocnJhdGVzID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEhhbmRsZSBjb250YWlucyBhIGxpc3Qgb2YgcmF0ZXMgKi8KKyAgICAgICAgaWYoIChycmF0ZXMgPSBQeVR1cGxlX05ldyhhcmcubnVtcmF0ZXMpKSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZvciggaT0wOyBpPGFyZy5udW1yYXRlczsgaSsrICkgeworICAgICAgICAgICAgaWYoIChvYmogPSBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkVUZpeGVkLCBmcmF0ZXNbaV0pKT09TlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShycmF0ZXMsIGksIG9iaik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPIiwgYXJnLm51bXJhdGVzLCBycmF0ZXMpOwogb3V0OgotCVB5X1hERUNSRUYocnJhdGVzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKHJyYXRlcyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBzbmRpaF9tZXRob2RzW10gPSB7Ci0geyJnZXRDaGFubmVsQXZhaWxhYmxlIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX2dldENoYW5uZWxBdmFpbGFibGUsCU1FVEhfVkFSQVJHUywJc25kaWhfZ2V0Q2hhbm5lbEF2YWlsYWJsZV9fZG9jX199LAotIHsiZ2V0TnVtYmVyQ2hhbm5lbHMiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0TnVtYmVyQ2hhbm5lbHMsCU1FVEhfVkFSQVJHUywJc25kaWhfZ2V0TnVtYmVyQ2hhbm5lbHNfX2RvY19ffSwKLSB7InNldE51bWJlckNoYW5uZWxzIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX3NldE51bWJlckNoYW5uZWxzLAlNRVRIX1ZBUkFSR1MsCXNuZGloX3NldE51bWJlckNoYW5uZWxzX19kb2NfX30sCi0geyJnZXRDb250aW51b3VzIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX2dldENvbnRpbnVvdXMsCU1FVEhfVkFSQVJHUywJc25kaWhfZ2V0Q29udGludW91c19fZG9jX199LAotIHsic2V0Q29udGludW91cyIsCShQeUNGdW5jdGlvbilzbmRpaF9zZXRDb250aW51b3VzLAlNRVRIX1ZBUkFSR1MsCXNuZGloX3NldENvbnRpbnVvdXNfX2RvY19ffSwKLSB7ImdldElucHV0U291cmNlTmFtZXMiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0SW5wdXRTb3VyY2VOYW1lcywJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRJbnB1dFNvdXJjZU5hbWVzX19kb2NfX30sCi0geyJnZXRJbnB1dFNvdXJjZSIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXRJbnB1dFNvdXJjZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRJbnB1dFNvdXJjZV9fZG9jX199LAotIHsic2V0SW5wdXRTb3VyY2UiLAkoUHlDRnVuY3Rpb24pc25kaWhfc2V0SW5wdXRTb3VyY2UsCU1FVEhfVkFSQVJHUywJc25kaWhfc2V0SW5wdXRTb3VyY2VfX2RvY19ffSwKLSB7ImdldFBsYXlUaHJ1T25PZmYiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0UGxheVRocnVPbk9mZiwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRQbGF5VGhydU9uT2ZmX19kb2NfX30sCi0geyJzZXRQbGF5VGhydU9uT2ZmIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX3NldFBsYXlUaHJ1T25PZmYsCU1FVEhfVkFSQVJHUywJc25kaWhfc2V0UGxheVRocnVPbk9mZl9fZG9jX199LAotIHsiZ2V0U2FtcGxlUmF0ZSIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVSYXRlLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldFNhbXBsZVJhdGVfX2RvY19ffSwKLSB7InNldFNhbXBsZVJhdGUiLAkoUHlDRnVuY3Rpb24pc25kaWhfc2V0U2FtcGxlUmF0ZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9zZXRTYW1wbGVSYXRlX19kb2NfX30sCi0geyJnZXRTYW1wbGVTaXplIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX2dldFNhbXBsZVNpemUsCU1FVEhfVkFSQVJHUywJc25kaWhfZ2V0U2FtcGxlU2l6ZV9fZG9jX199LAotIHsic2V0U2FtcGxlU2l6ZSIsCShQeUNGdW5jdGlvbilzbmRpaF9zZXRTYW1wbGVTaXplLAlNRVRIX1ZBUkFSR1MsCXNuZGloX3NldFNhbXBsZVNpemVfX2RvY19ffSwKLSB7ImdldFNhbXBsZVNpemVBdmFpbGFibGUiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRTYW1wbGVTaXplQXZhaWxhYmxlX19kb2NfX30sCi0geyJnZXRTYW1wbGVSYXRlQXZhaWxhYmxlIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX2dldFNhbXBsZVJhdGVBdmFpbGFibGUsCU1FVEhfVkFSQVJHUywJc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZV9fZG9jX199LAotIAotCXtOVUxMLAkgKFB5Q0Z1bmN0aW9uKU5VTEwsIDAsIE5VTEx9CQkvKiBzZW50aW5lbCAqLworIHsiZ2V0Q2hhbm5lbEF2YWlsYWJsZSIsICAgICAgICAoUHlDRnVuY3Rpb24pc25kaWhfZ2V0Q2hhbm5lbEF2YWlsYWJsZSwgTUVUSF9WQVJBUkdTLCAgIHNuZGloX2dldENoYW5uZWxBdmFpbGFibGVfX2RvY19ffSwKKyB7ImdldE51bWJlckNoYW5uZWxzIiwgIChQeUNGdW5jdGlvbilzbmRpaF9nZXROdW1iZXJDaGFubmVscywgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0TnVtYmVyQ2hhbm5lbHNfX2RvY19ffSwKKyB7InNldE51bWJlckNoYW5uZWxzIiwgIChQeUNGdW5jdGlvbilzbmRpaF9zZXROdW1iZXJDaGFubmVscywgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfc2V0TnVtYmVyQ2hhbm5lbHNfX2RvY19ffSwKKyB7ImdldENvbnRpbnVvdXMiLCAgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRDb250aW51b3VzLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0Q29udGludW91c19fZG9jX199LAorIHsic2V0Q29udGludW91cyIsICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX3NldENvbnRpbnVvdXMsICAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9zZXRDb250aW51b3VzX19kb2NfX30sCisgeyJnZXRJbnB1dFNvdXJjZU5hbWVzIiwgICAgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRJbnB1dFNvdXJjZU5hbWVzLCBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0SW5wdXRTb3VyY2VOYW1lc19fZG9jX199LAorIHsiZ2V0SW5wdXRTb3VyY2UiLCAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldElucHV0U291cmNlLCAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRJbnB1dFNvdXJjZV9fZG9jX199LAorIHsic2V0SW5wdXRTb3VyY2UiLCAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX3NldElucHV0U291cmNlLCAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9zZXRJbnB1dFNvdXJjZV9fZG9jX199LAorIHsiZ2V0UGxheVRocnVPbk9mZiIsICAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldFBsYXlUaHJ1T25PZmYsICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRQbGF5VGhydU9uT2ZmX19kb2NfX30sCisgeyJzZXRQbGF5VGhydU9uT2ZmIiwgICAoUHlDRnVuY3Rpb24pc25kaWhfc2V0UGxheVRocnVPbk9mZiwgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX3NldFBsYXlUaHJ1T25PZmZfX2RvY19ffSwKKyB7ImdldFNhbXBsZVJhdGUiLCAgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVSYXRlLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0U2FtcGxlUmF0ZV9fZG9jX199LAorIHsic2V0U2FtcGxlUmF0ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX3NldFNhbXBsZVJhdGUsICAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9zZXRTYW1wbGVSYXRlX19kb2NfX30sCisgeyJnZXRTYW1wbGVTaXplIiwgICAgICAoUHlDRnVuY3Rpb24pc25kaWhfZ2V0U2FtcGxlU2l6ZSwgICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX2dldFNhbXBsZVNpemVfX2RvY19ffSwKKyB7InNldFNhbXBsZVNpemUiLCAgICAgIChQeUNGdW5jdGlvbilzbmRpaF9zZXRTYW1wbGVTaXplLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfc2V0U2FtcGxlU2l6ZV9fZG9jX199LAorIHsiZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZSIsICAgICAoUHlDRnVuY3Rpb24pc25kaWhfZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZSwgICAgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZV9fZG9jX199LAorIHsiZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZSIsICAgICAoUHlDRnVuY3Rpb24pc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZSwgICAgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZV9fZG9jX199LAorCisgICAge05VTEwsICAgICAgIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfSAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKIC8qIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlICgqbXVzdCogYmUgY2FsbGVkIGluaXRTbmRpaG9va3MpICovCiAKLXN0YXRpYyBjaGFyIFNuZGlob29rc19tb2R1bGVfZG9jdW1lbnRhdGlvbltdID0gCitzdGF0aWMgY2hhciBTbmRpaG9va3NfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9CiAiIgogOwogCiB2b2lkCiBpbml0X1NuZGlob29rcygpCiB7Ci0JUHlPYmplY3QgKm0sICpkOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlNCgiX1NuZGlob29rcyIsIHNuZGloX21ldGhvZHMsCi0JCVNuZGlob29rc19tb2R1bGVfZG9jdW1lbnRhdGlvbiwKLQkJKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJfU25kaWhvb2tzIiwgc25kaWhfbWV0aG9kcywKKyAgICAgICAgU25kaWhvb2tzX21vZHVsZV9kb2N1bWVudGF0aW9uLAorICAgICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKIAotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JRXJyb3JPYmplY3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJTbmRpaG9va3MuZXJyb3IiKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBFcnJvck9iamVjdCk7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBFcnJvck9iamVjdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIlNuZGlob29rcy5lcnJvciIpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKIAotCS8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCi0JCi0JLyogQ2hlY2sgZm9yIGVycm9ycyAqLwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIG1vZHVsZSBTbmRpaG9va3MiKTsKKyAgICAvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLworCisgICAgLyogQ2hlY2sgZm9yIGVycm9ycyAqLworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIG1vZHVsZSBTbmRpaG9va3MiKTsKIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvc25kL19TbmRtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL3NuZC9fU25kbW9kdWxlLmMKaW5kZXggMWY2NDYyOS4uZDcxM2VmZSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvc25kL19TbmRtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9zbmQvX1NuZG1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yMiwxNiArMjIsMTYgQEAKIHN0YXRpYyBpbnQKIFNuZENtZF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBTbmRDb21tYW5kICpwYykKIHsKLSAgICAgICAgaW50IGxlbjsKLSAgICAgICAgcGMtPnBhcmFtMSA9IDA7Ci0gICAgICAgIHBjLT5wYXJhbTIgPSAwOwotICAgICAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgewotICAgICAgICAgICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJofGhsIiwgJnBjLT5jbWQsICZwYy0+cGFyYW0xLCAmcGMtPnBhcmFtMikpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZVR1cGxlKHYsICJIaHMjIiwgJnBjLT5jbWQsICZwYy0+cGFyYW0xLCAmcGMtPnBhcmFtMiwgJmxlbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJIIiwgJnBjLT5jbWQpOworICAgIGludCBsZW47CisgICAgcGMtPnBhcmFtMSA9IDA7CisgICAgcGMtPnBhcmFtMiA9IDA7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKKyAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImh8aGwiLCAmcGMtPmNtZCwgJnBjLT5wYXJhbTEsICZwYy0+cGFyYW0yKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiSGhzIyIsICZwYy0+Y21kLCAmcGMtPnBhcmFtMSwgJnBjLT5wYXJhbTIsICZsZW4pOworICAgIH0KKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmcGMtPmNtZCk7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZCBTbmRDaF9Vc2VyUm91dGluZShTbmRDaGFubmVsUHRyIGNoYW4sIFNuZENvbW1hbmQgKmNtZCk7IC8qIEZvcndhcmQgKi8KQEAgLTQ2LDE1NiArNDYsMTU2IEBACiAjZGVmaW5lIFNuZENoX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlNuZENoYW5uZWxfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmU25kQ2hhbm5lbF9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgU25kQ2hhbm5lbE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVNuZENoYW5uZWxQdHIgb2JfaXRzZWxmOwotCS8qIE1lbWJlcnMgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzOiAqLwotCVB5T2JqZWN0ICpvYl9jYWxsYmFjazsKLQlsb25nIG9iX0E1OwotCVNuZENvbW1hbmQgb2JfY21kOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBTbmRDaGFubmVsUHRyIG9iX2l0c2VsZjsKKyAgICAvKiBNZW1iZXJzIHVzZWQgdG8gaW1wbGVtZW50IGNhbGxiYWNrczogKi8KKyAgICBQeU9iamVjdCAqb2JfY2FsbGJhY2s7CisgICAgbG9uZyBvYl9BNTsKKyAgICBTbmRDb21tYW5kIG9iX2NtZDsKIH0gU25kQ2hhbm5lbE9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpTbmRDaF9OZXcoU25kQ2hhbm5lbFB0ciBpdHNlbGYpCiB7Ci0JU25kQ2hhbm5lbE9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoU25kQ2hhbm5lbE9iamVjdCwgJlNuZENoYW5uZWxfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2NhbGxiYWNrID0gTlVMTDsKLQlpdC0+b2JfQTUgPSBTZXRDdXJyZW50QTUoKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgU25kQ2hhbm5lbE9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoU25kQ2hhbm5lbE9iamVjdCwgJlNuZENoYW5uZWxfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2NhbGxiYWNrID0gTlVMTDsKKyAgICBpdC0+b2JfQTUgPSBTZXRDdXJyZW50QTUoKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyB2b2lkIFNuZENoX2RlYWxsb2MoU25kQ2hhbm5lbE9iamVjdCAqc2VsZikKIHsKLQlTbmREaXNwb3NlQ2hhbm5lbChzZWxmLT5vYl9pdHNlbGYsIDEpOwotCVB5X1hERUNSRUYoc2VsZi0+b2JfY2FsbGJhY2spOwotCVB5T2JqZWN0X0ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgU25kRGlzcG9zZUNoYW5uZWwoc2VsZi0+b2JfaXRzZWxmLCAxKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9iX2NhbGxiYWNrKTsKKyAgICBQeU9iamVjdF9GcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX1NuZERvQ29tbWFuZChTbmRDaGFubmVsT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNuZENvbW1hbmQgY21kOwotCUJvb2xlYW4gbm9XYWl0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFNuZENtZF9Db252ZXJ0LCAmY21kLAotCSAgICAgICAgICAgICAgICAgICAgICAmbm9XYWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNuZERvQ29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJmNtZCwKLQkgICAgICAgICAgICAgICAgICAgIG5vV2FpdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU25kQ29tbWFuZCBjbWQ7CisgICAgQm9vbGVhbiBub1dhaXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU25kQ21kX0NvbnZlcnQsICZjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZub1dhaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kRG9Db21tYW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgbm9XYWl0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRDaF9TbmREb0ltbWVkaWF0ZShTbmRDaGFubmVsT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNuZENvbW1hbmQgY21kOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgU25kQ21kX0NvbnZlcnQsICZjbWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kRG9JbW1lZGlhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNtZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU25kQ29tbWFuZCBjbWQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbmRDbWRfQ29udmVydCwgJmNtZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmREb0ltbWVkaWF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRDaF9TbmRQbGF5KFNuZENoYW5uZWxPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU25kTGlzdEhhbmRsZSBzbmRIYW5kbGU7Ci0JQm9vbGVhbiBhc3luYzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNuZEhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFzeW5jKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNuZFBsYXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBzbmRIYW5kbGUsCi0JICAgICAgICAgICAgICAgYXN5bmMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNuZExpc3RIYW5kbGUgc25kSGFuZGxlOworICAgIEJvb2xlYW4gYXN5bmM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzbmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhc3luYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmRQbGF5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgc25kSGFuZGxlLAorICAgICAgICAgICAgICAgICAgIGFzeW5jKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRDaF9TbmRDaGFubmVsU3RhdHVzKFNuZENoYW5uZWxPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdGhlTGVuZ3RoOwotCVNDU3RhdHVzIHRoZVN0YXR1c19fb3V0X187Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVMZW5ndGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kQ2hhbm5lbFN0YXR1cyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZUxlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmdGhlU3RhdHVzX19vdXRfXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnRoZVN0YXR1c19fb3V0X18sIChpbnQpc2l6ZW9mKFNDU3RhdHVzKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdGhlTGVuZ3RoOworICAgIFNDU3RhdHVzIHRoZVN0YXR1c19fb3V0X187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVMZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kQ2hhbm5lbFN0YXR1cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlU3RhdHVzX19vdXRfXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnRoZVN0YXR1c19fb3V0X18sIChpbnQpc2l6ZW9mKFNDU3RhdHVzKSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kQ2hfU25kR2V0SW5mbyhTbmRDaGFubmVsT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBzZWxlY3RvcjsKLQl2b2lkICogaW5mb1B0cjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnciLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9QdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kR2V0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgIGluZm9QdHIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBzZWxlY3RvcjsKKyAgICB2b2lkICogaW5mb1B0cjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9QdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kR2V0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGluZm9QdHIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX1NuZFNldEluZm8oU25kQ2hhbm5lbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgc2VsZWN0b3I7Ci0Jdm9pZCAqIGluZm9QdHI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZ3IiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmZvUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNuZFNldEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICBpbmZvUHRyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgc2VsZWN0b3I7CisgICAgdm9pZCAqIGluZm9QdHI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvUHRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNuZFNldEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICBpbmZvUHRyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNuZENoX21ldGhvZHNbXSA9IHsKLQl7IlNuZERvQ29tbWFuZCIsIChQeUNGdW5jdGlvbilTbmRDaF9TbmREb0NvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKFNuZENvbW1hbmQgY21kLCBCb29sZWFuIG5vV2FpdCkgLT4gTm9uZSIpfSwKLQl7IlNuZERvSW1tZWRpYXRlIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZERvSW1tZWRpYXRlLCAxLAotCSBQeURvY19TVFIoIihTbmRDb21tYW5kIGNtZCkgLT4gTm9uZSIpfSwKLQl7IlNuZFBsYXkiLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kUGxheSwgMSwKLQkgUHlEb2NfU1RSKCIoU25kTGlzdEhhbmRsZSBzbmRIYW5kbGUsIEJvb2xlYW4gYXN5bmMpIC0+IE5vbmUiKX0sCi0JeyJTbmRDaGFubmVsU3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZENoYW5uZWxTdGF0dXMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHRoZUxlbmd0aCkgLT4gKFNDU3RhdHVzIHRoZVN0YXR1cykiKX0sCi0JeyJTbmRHZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZEdldEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBzZWxlY3Rvciwgdm9pZCAqIGluZm9QdHIpIC0+IE5vbmUiKX0sCi0JeyJTbmRTZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZFNldEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBzZWxlY3Rvciwgdm9pZCAqIGluZm9QdHIpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJTbmREb0NvbW1hbmQiLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kRG9Db21tYW5kLCAxLAorICAgICBQeURvY19TVFIoIihTbmRDb21tYW5kIGNtZCwgQm9vbGVhbiBub1dhaXQpIC0+IE5vbmUiKX0sCisgICAgeyJTbmREb0ltbWVkaWF0ZSIsIChQeUNGdW5jdGlvbilTbmRDaF9TbmREb0ltbWVkaWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU25kQ29tbWFuZCBjbWQpIC0+IE5vbmUiKX0sCisgICAgeyJTbmRQbGF5IiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZFBsYXksIDEsCisgICAgIFB5RG9jX1NUUigiKFNuZExpc3RIYW5kbGUgc25kSGFuZGxlLCBCb29sZWFuIGFzeW5jKSAtPiBOb25lIil9LAorICAgIHsiU25kQ2hhbm5lbFN0YXR1cyIsIChQeUNGdW5jdGlvbilTbmRDaF9TbmRDaGFubmVsU3RhdHVzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB0aGVMZW5ndGgpIC0+IChTQ1N0YXR1cyB0aGVTdGF0dXMpIil9LAorICAgIHsiU25kR2V0SW5mbyIsIChQeUNGdW5jdGlvbilTbmRDaF9TbmRHZXRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgc2VsZWN0b3IsIHZvaWQgKiBpbmZvUHRyKSAtPiBOb25lIil9LAorICAgIHsiU25kU2V0SW5mbyIsIChQeUNGdW5jdGlvbilTbmRDaF9TbmRTZXRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgc2VsZWN0b3IsIHZvaWQgKiBpbmZvUHRyKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBTbmRDaF9nZXRzZXRsaXN0IE5VTEwKQEAgLTIwOCw0NyArMjA4LDQ3IEBACiAjZGVmaW5lIFNuZENoX2hhc2ggTlVMTAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNuZENoYW5uZWxfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfU25kLlNuZENoYW5uZWwiLCAvKnRwX25hbWUqLwotCXNpemVvZihTbmRDaGFubmVsT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgU25kQ2hfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgU25kQ2hfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFNuZENoX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBTbmRDaF9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JU25kQ2hfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JU25kQ2hfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JMCwgLyp0cF9pbml0Ki8KLQkwLCAvKnRwX2FsbG9jKi8KLQkwLCAvKnRwX25ldyovCi0JMCwgLyp0cF9mcmVlKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfU25kLlNuZENoYW5uZWwiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihTbmRDaGFubmVsT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgU25kQ2hfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgU25kQ2hfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFNuZENoX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBTbmRDaF9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgU25kQ2hfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgU25kQ2hfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgMCwgLyp0cF9pbml0Ki8KKyAgICAwLCAvKnRwX2FsbG9jKi8KKyAgICAwLCAvKnRwX25ldyovCisgICAgMCwgLyp0cF9mcmVlKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFNuZENoYW5uZWwgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjYxLDg5ICsyNjEsODkgQEAKICNkZWZpbmUgU1BCT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlNQQl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZTUEJfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFNQQk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCS8qIE1lbWJlcnMgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzOiAqLwotCVB5T2JqZWN0ICpvYl9jb21wbGV0aW9uOwotCVB5T2JqZWN0ICpvYl9pbnRlcnJ1cHQ7Ci0JUHlPYmplY3QgKm9iX3RoaXNjYWxsYmFjazsKLQlsb25nIG9iX0E1OwotCVNQQiBvYl9zcGI7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIE1lbWJlcnMgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzOiAqLworICAgIFB5T2JqZWN0ICpvYl9jb21wbGV0aW9uOworICAgIFB5T2JqZWN0ICpvYl9pbnRlcnJ1cHQ7CisgICAgUHlPYmplY3QgKm9iX3RoaXNjYWxsYmFjazsKKyAgICBsb25nIG9iX0E1OworICAgIFNQQiBvYl9zcGI7CiB9IFNQQk9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpTUEJPYmpfTmV3KHZvaWQpCiB7Ci0JU1BCT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhTUEJPYmplY3QsICZTUEJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9jb21wbGV0aW9uID0gTlVMTDsKLQlpdC0+b2JfaW50ZXJydXB0ID0gTlVMTDsKLQlpdC0+b2JfdGhpc2NhbGxiYWNrID0gTlVMTDsKLQlpdC0+b2JfQTUgPSBTZXRDdXJyZW50QTUoKTsKLQltZW1zZXQoKGNoYXIgKikmaXQtPm9iX3NwYiwgMCwgc2l6ZW9mKGl0LT5vYl9zcGIpKTsKLQlpdC0+b2Jfc3BiLnVzZXJMb25nID0gKGxvbmcpaXQ7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFNQQk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoU1BCT2JqZWN0LCAmU1BCX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfY29tcGxldGlvbiA9IE5VTEw7CisgICAgaXQtPm9iX2ludGVycnVwdCA9IE5VTEw7CisgICAgaXQtPm9iX3RoaXNjYWxsYmFjayA9IE5VTEw7CisgICAgaXQtPm9iX0E1ID0gU2V0Q3VycmVudEE1KCk7CisgICAgbWVtc2V0KChjaGFyICopJml0LT5vYl9zcGIsIDAsIHNpemVvZihpdC0+b2Jfc3BiKSk7CisgICAgaXQtPm9iX3NwYi51c2VyTG9uZyA9IChsb25nKWl0OworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIHN0YXRpYyBpbnQgU1BCT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIFNQQlB0ciAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFTUEJPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiU1BCIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAmKChTUEJPYmplY3QgKil2KS0+b2Jfc3BiOwotCXJldHVybiAxOworICAgIGlmICghU1BCT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlNQQiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gJigoU1BCT2JqZWN0ICopdiktPm9iX3NwYjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgU1BCT2JqX2RlYWxsb2MoU1BCT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3NwYi51c2VyTG9uZyA9IDA7Ci0Jc2VsZi0+b2JfdGhpc2NhbGxiYWNrID0gMDsKLQlQeV9YREVDUkVGKHNlbGYtPm9iX2NvbXBsZXRpb24pOwotCVB5X1hERUNSRUYoc2VsZi0+b2JfaW50ZXJydXB0KTsKLQlQeU9iamVjdF9GcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3NwYi51c2VyTG9uZyA9IDA7CisgICAgc2VsZi0+b2JfdGhpc2NhbGxiYWNrID0gMDsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9iX2NvbXBsZXRpb24pOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfaW50ZXJydXB0KTsKKyAgICBQeU9iamVjdF9GcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU1BCT2JqX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqU1BCT2JqX2dldF9pblJlZk51bShTUEJPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9zcGIuaW5SZWZOdW0pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLmluUmVmTnVtKTsKIH0KIAogc3RhdGljIGludCBTUEJPYmpfc2V0X2luUmVmTnVtKFNQQk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIC0xICsgUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2Jfc3BiLmluUmVmTnVtKTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIuaW5SZWZOdW0pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNQQk9ial9nZXRfY291bnQoU1BCT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLmNvdW50KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5jb3VudCk7CiB9CiAKIHN0YXRpYyBpbnQgU1BCT2JqX3NldF9jb3VudChTUEJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiAtMSArIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX3NwYi5jb3VudCk7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIC0xICsgUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2Jfc3BiLmNvdW50KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTUEJPYmpfZ2V0X21pbGxpc2Vjb25kcyhTUEJPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9zcGIubWlsbGlzZWNvbmRzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5taWxsaXNlY29uZHMpOwogfQogCiBzdGF0aWMgaW50IFNQQk9ial9zZXRfbWlsbGlzZWNvbmRzKFNQQk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIC0xICsgUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2Jfc3BiLm1pbGxpc2Vjb25kcyk7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIC0xICsgUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2Jfc3BiLm1pbGxpc2Vjb25kcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU1BCT2JqX2dldF9lcnJvcihTUEJPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzZWxmLT5vYl9zcGIuZXJyb3IpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+b2Jfc3BiLmVycm9yKTsKIH0KIAogI2RlZmluZSBTUEJPYmpfc2V0X2Vycm9yIE5VTEwKQEAgLTM1MiwyMCArMzUyLDIwIEBACiAKIHN0YXRpYyBpbnQgU1BCT2JqX3NldF9jb21wbGV0aW9uUm91dGluZShTUEJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXNlbGYtPm9iX3NwYi5jb21wbGV0aW9uUm91dGluZSA9IE5ld1NJQ29tcGxldGlvblVQUChTUEJfY29tcGxldGlvbik7Ci0JICAgICAgICAgICAgc2VsZi0+b2JfY29tcGxldGlvbiA9IHY7Ci0JICAgICAgICAgICAgUHlfSU5DUkVGKHYpOwotCSAgICAgICAgICAgIHJldHVybiAwOwotCXJldHVybiAwOworICAgIHNlbGYtPm9iX3NwYi5jb21wbGV0aW9uUm91dGluZSA9IE5ld1NJQ29tcGxldGlvblVQUChTUEJfY29tcGxldGlvbik7CisgICAgICAgICAgICAgICAgc2VsZi0+b2JfY29tcGxldGlvbiA9IHY7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgU1BCT2JqX2dldHNldGxpc3RbXSA9IHsKLQl7ImluUmVmTnVtIiwgKGdldHRlcilTUEJPYmpfZ2V0X2luUmVmTnVtLCAoc2V0dGVyKVNQQk9ial9zZXRfaW5SZWZOdW0sIE5VTEx9LAotCXsiY291bnQiLCAoZ2V0dGVyKVNQQk9ial9nZXRfY291bnQsIChzZXR0ZXIpU1BCT2JqX3NldF9jb3VudCwgTlVMTH0sCi0JeyJtaWxsaXNlY29uZHMiLCAoZ2V0dGVyKVNQQk9ial9nZXRfbWlsbGlzZWNvbmRzLCAoc2V0dGVyKVNQQk9ial9zZXRfbWlsbGlzZWNvbmRzLCBOVUxMfSwKLQl7ImVycm9yIiwgKGdldHRlcilTUEJPYmpfZ2V0X2Vycm9yLCAoc2V0dGVyKVNQQk9ial9zZXRfZXJyb3IsIE5VTEx9LAotCXsiY29tcGxldGlvblJvdXRpbmUiLCAoZ2V0dGVyKVNQQk9ial9nZXRfY29tcGxldGlvblJvdXRpbmUsIChzZXR0ZXIpU1BCT2JqX3NldF9jb21wbGV0aW9uUm91dGluZSwgTlVMTH0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiaW5SZWZOdW0iLCAoZ2V0dGVyKVNQQk9ial9nZXRfaW5SZWZOdW0sIChzZXR0ZXIpU1BCT2JqX3NldF9pblJlZk51bSwgTlVMTH0sCisgICAgeyJjb3VudCIsIChnZXR0ZXIpU1BCT2JqX2dldF9jb3VudCwgKHNldHRlcilTUEJPYmpfc2V0X2NvdW50LCBOVUxMfSwKKyAgICB7Im1pbGxpc2Vjb25kcyIsIChnZXR0ZXIpU1BCT2JqX2dldF9taWxsaXNlY29uZHMsIChzZXR0ZXIpU1BCT2JqX3NldF9taWxsaXNlY29uZHMsIE5VTEx9LAorICAgIHsiZXJyb3IiLCAoZ2V0dGVyKVNQQk9ial9nZXRfZXJyb3IsIChzZXR0ZXIpU1BCT2JqX3NldF9lcnJvciwgTlVMTH0sCisgICAgeyJjb21wbGV0aW9uUm91dGluZSIsIChnZXR0ZXIpU1BCT2JqX2dldF9jb21wbGV0aW9uUm91dGluZSwgKHNldHRlcilTUEJPYmpfc2V0X2NvbXBsZXRpb25Sb3V0aW5lLCBOVUxMfSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTM3Niw0NyArMzc2LDQ3IEBACiAjZGVmaW5lIFNQQk9ial9oYXNoIE5VTEwKIAogc3RhdGljIFB5VHlwZU9iamVjdCBTUEJfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfU25kLlNQQiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFNQQk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFNQQk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBTUEJPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFNQQk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgU1BCT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlTUEJPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JU1BCT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCTAsIC8qdHBfaW5pdCovCi0JMCwgLyp0cF9hbGxvYyovCi0JMCwgLyp0cF9uZXcqLwotCTAsIC8qdHBfZnJlZSovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1NuZC5TUEIiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihTUEJPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBTUEJPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgU1BCT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBTUEJPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFNQQk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgU1BCT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIFNQQk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2luaXQqLworICAgIDAsIC8qdHBfYWxsb2MqLworICAgIDAsIC8qdHBfbmV3Ki8KKyAgICAwLCAvKnRwX2ZyZWUqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgU1BCIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00MjQsNjM0ICs0MjQsNjM0IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JX3JlcyA9IFNQQk9ial9OZXcoKTsgcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIF9yZXMgPSBTUEJPYmpfTmV3KCk7IHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TeXNCZWVwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBkdXJhdGlvbjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3lzQmVlcChkdXJhdGlvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBkdXJhdGlvbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU3lzQmVlcChkdXJhdGlvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TbmROZXdDaGFubmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNuZENoYW5uZWxQdHIgY2hhbiA9IDA7Ci0Jc2hvcnQgc3ludGg7Ci0JbG9uZyBpbml0OwotCVB5T2JqZWN0KiB1c2VyUm91dGluZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8iLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ludGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbml0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdXNlclJvdXRpbmUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodXNlclJvdXRpbmUgIT0gUHlfTm9uZSAmJiAhUHlDYWxsYWJsZV9DaGVjayh1c2VyUm91dGluZSkpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY2FsbGJhY2sgbXVzdCBiZSBjYWxsYWJsZSIpOwotCQlnb3RvIHVzZXJSb3V0aW5lX19lcnJvcl9fOwotCX0KLQlfZXJyID0gU25kTmV3Q2hhbm5lbCgmY2hhbiwKLQkgICAgICAgICAgICAgICAgICAgICBzeW50aCwKLQkgICAgICAgICAgICAgICAgICAgICBpbml0LAotCSAgICAgICAgICAgICAgICAgICAgIE5ld1NuZENhbGxCYWNrVVBQKFNuZENoX1VzZXJSb3V0aW5lKSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFNuZENoX05ldywgY2hhbik7Ci0JaWYgKF9yZXMgIT0gTlVMTCAmJiB1c2VyUm91dGluZSAhPSBQeV9Ob25lKQotCXsKLQkJU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopX3JlczsKLQkJcC0+b2JfaXRzZWxmLT51c2VySW5mbyA9IChsb25nKXA7Ci0JCVB5X0lOQ1JFRih1c2VyUm91dGluZSk7Ci0JCXAtPm9iX2NhbGxiYWNrID0gdXNlclJvdXRpbmU7Ci0JfQorICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNuZENoYW5uZWxQdHIgY2hhbiA9IDA7CisgICAgc2hvcnQgc3ludGg7CisgICAgbG9uZyBpbml0OworICAgIFB5T2JqZWN0KiB1c2VyUm91dGluZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ludGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlclJvdXRpbmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodXNlclJvdXRpbmUgIT0gUHlfTm9uZSAmJiAhUHlDYWxsYWJsZV9DaGVjayh1c2VyUm91dGluZSkpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY2FsbGJhY2sgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICBnb3RvIHVzZXJSb3V0aW5lX19lcnJvcl9fOworICAgIH0KKyAgICBfZXJyID0gU25kTmV3Q2hhbm5lbCgmY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1NuZENhbGxCYWNrVVBQKFNuZENoX1VzZXJSb3V0aW5lKSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNuZENoX05ldywgY2hhbik7CisgICAgaWYgKF9yZXMgIT0gTlVMTCAmJiB1c2VyUm91dGluZSAhPSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopX3JlczsKKyAgICAgICAgcC0+b2JfaXRzZWxmLT51c2VySW5mbyA9IChsb25nKXA7CisgICAgICAgIFB5X0lOQ1JFRih1c2VyUm91dGluZSk7CisgICAgICAgIHAtPm9iX2NhbGxiYWNrID0gdXNlclJvdXRpbmU7CisgICAgfQogIHVzZXJSb3V0aW5lX19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NuZFNvdW5kTWFuYWdlclZlcnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU51bVZlcnNpb24gX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTbmRTb3VuZE1hbmFnZXJWZXJzaW9uKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE51bVZlcnNpb24sIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE51bVZlcnNpb24gX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTbmRTb3VuZE1hbmFnZXJWZXJzaW9uKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE51bVZlcnNpb24sIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NuZE1hbmFnZXJTdGF0dXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdGhlTGVuZ3RoOwotCVNNU3RhdHVzIHRoZVN0YXR1c19fb3V0X187Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVMZW5ndGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kTWFuYWdlclN0YXR1cyh0aGVMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVN0YXR1c19fb3V0X18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVTdGF0dXNfX291dF9fLCAoaW50KXNpemVvZihTTVN0YXR1cykpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHRoZUxlbmd0aDsKKyAgICBTTVN0YXR1cyB0aGVTdGF0dXNfX291dF9fOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNuZE1hbmFnZXJTdGF0dXModGhlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVTdGF0dXNfX291dF9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlU3RhdHVzX19vdXRfXywgKGludClzaXplb2YoU01TdGF0dXMpKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU25kR2V0U3lzQmVlcFN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBzeXNCZWVwU3RhdGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNuZEdldFN5c0JlZXBTdGF0ZSgmc3lzQmVlcFN0YXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgc3lzQmVlcFN0YXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgc3lzQmVlcFN0YXRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTbmRHZXRTeXNCZWVwU3RhdGUoJnN5c0JlZXBTdGF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN5c0JlZXBTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NuZFNldFN5c0JlZXBTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBzeXNCZWVwU3RhdGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzeXNCZWVwU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kU2V0U3lzQmVlcFN0YXRlKHN5c0JlZXBTdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgc3lzQmVlcFN0YXRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3lzQmVlcFN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNuZFNldFN5c0JlZXBTdGF0ZShzeXNCZWVwU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9HZXRTeXNCZWVwVm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgbGV2ZWw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRTeXNCZWVwVm9sdW1lKCZsZXZlbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgbGV2ZWw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTeXNCZWVwVm9sdW1lKCZsZXZlbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TZXRTeXNCZWVwVm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgbGV2ZWw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRTeXNCZWVwVm9sdW1lKGxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGxldmVsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0U3lzQmVlcFZvbHVtZShsZXZlbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX0dldERlZmF1bHRPdXRwdXRWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBsZXZlbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERlZmF1bHRPdXRwdXRWb2x1bWUoJmxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBsZXZlbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERlZmF1bHRPdXRwdXRWb2x1bWUoJmxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NldERlZmF1bHRPdXRwdXRWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBsZXZlbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERlZmF1bHRPdXRwdXRWb2x1bWUobGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgbGV2ZWw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREZWZhdWx0T3V0cHV0Vm9sdW1lKGxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfR2V0U291bmRIZWFkZXJPZmZzZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU25kTGlzdEhhbmRsZSBzbmRIYW5kbGU7Ci0JbG9uZyBvZmZzZXQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNuZEhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRTb3VuZEhlYWRlck9mZnNldChzbmRIYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU25kTGlzdEhhbmRsZSBzbmRIYW5kbGU7CisgICAgbG9uZyBvZmZzZXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNuZEhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTb3VuZEhlYWRlck9mZnNldChzbmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX0dldENvbXByZXNzaW9uSW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBjb21wcmVzc2lvbklEOwotCU9TVHlwZSBmb3JtYXQ7Ci0Jc2hvcnQgbnVtQ2hhbm5lbHM7Ci0Jc2hvcnQgc2FtcGxlU2l6ZTsKLQlDb21wcmVzc2lvbkluZm8gY3BfX291dF9fOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzaW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvcm1hdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bUNoYW5uZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb21wcmVzc2lvbkluZm8oY29tcHJlc3Npb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZjcF9fb3V0X18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZjcF9fb3V0X18sIChpbnQpc2l6ZW9mKENvbXByZXNzaW9uSW5mbykpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGNvbXByZXNzaW9uSUQ7CisgICAgT1NUeXBlIGZvcm1hdDsKKyAgICBzaG9ydCBudW1DaGFubmVsczsKKyAgICBzaG9ydCBzYW1wbGVTaXplOworICAgIENvbXByZXNzaW9uSW5mbyBjcF9fb3V0X187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbXByZXNzaW9uSW5mbyhjb21wcmVzc2lvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwX19vdXRfXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmNwX19vdXRfXywgKGludClzaXplb2YoQ29tcHJlc3Npb25JbmZvKSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NldFNvdW5kUHJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgdGhlVHlwZTsKLQlTdHIyNTUgbmFtZTsKLQlIYW5kbGUgc2V0dGluZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2V0dGluZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0U291bmRQcmVmZXJlbmNlKHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgbmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHRoZVR5cGU7CisgICAgU3RyMjU1IG5hbWU7CisgICAgSGFuZGxlIHNldHRpbmdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFNvdW5kUHJlZmVyZW5jZSh0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIG5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9HZXRTb3VuZFByZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHRoZVR5cGU7Ci0JU3RyMjU1IG5hbWU7Ci0JSGFuZGxlIHNldHRpbmdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFNvdW5kUHJlZmVyZW5jZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIG5hbWUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSB0aGVUeXBlOworICAgIFN0cjI1NSBuYW1lOworICAgIEhhbmRsZSBzZXR0aW5nczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzZXR0aW5ncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTb3VuZFByZWZlcmVuY2UodGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfR2V0Q29tcHJlc3Npb25OYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBjb21wcmVzc2lvblR5cGU7Ci0JU3RyMjU1IGNvbXByZXNzaW9uTmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXByZXNzaW9uVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb21wcmVzc2lvbk5hbWUoY29tcHJlc3Npb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25OYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGNvbXByZXNzaW9uTmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIGNvbXByZXNzaW9uVHlwZTsKKyAgICBTdHIyNTUgY29tcHJlc3Npb25OYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3Npb25UeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbXByZXNzaW9uTmFtZShjb21wcmVzc2lvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk5hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgY29tcHJlc3Npb25OYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCVmVyc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTnVtVmVyc2lvbiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNQQlZlcnNpb24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkTnVtVmVyc2lvbiwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTnVtVmVyc2lvbiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNQQlZlcnNpb24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkTnVtVmVyc2lvbiwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU25kUmVjb3JkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBvaW50IGNvcm5lcjsKLQlPU1R5cGUgcXVhbGl0eTsKLQlTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZjb3JuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnF1YWxpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kUmVjb3JkKChNb2RhbEZpbHRlclVQUCkwLAotCSAgICAgICAgICAgICAgICAgY29ybmVyLAotCSAgICAgICAgICAgICAgICAgcXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICZzbmRIYW5kbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzbmRIYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBvaW50IGNvcm5lcjsKKyAgICBPU1R5cGUgcXVhbGl0eTsKKyAgICBTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZjb3JuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnF1YWxpdHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kUmVjb3JkKChNb2RhbEZpbHRlclVQUCkwLAorICAgICAgICAgICAgICAgICAgICAgY29ybmVyLAorICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICZzbmRIYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzbmRIYW5kbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJTaWduSW5EZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgZGV2aWNlUmVmTnVtOwotCVN0cjI1NSBkZXZpY2VOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZGV2aWNlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJTaWduSW5EZXZpY2UoZGV2aWNlUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgZGV2aWNlUmVmTnVtOworICAgIFN0cjI1NSBkZXZpY2VOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZGV2aWNlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJTaWduSW5EZXZpY2UoZGV2aWNlUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQlNpZ25PdXREZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgZGV2aWNlUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQlNpZ25PdXREZXZpY2UoZGV2aWNlUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBkZXZpY2VSZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCU2lnbk91dERldmljZShkZXZpY2VSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJHZXRJbmRleGVkRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGNvdW50OwotCVN0cjI1NSBkZXZpY2VOYW1lOwotCUhhbmRsZSBkZXZpY2VJY29uSGFuZGxlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCR2V0SW5kZXhlZERldmljZShjb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJY29uSGFuZGxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZGV2aWNlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXZpY2VJY29uSGFuZGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBjb3VudDsKKyAgICBTdHIyNTUgZGV2aWNlTmFtZTsKKyAgICBIYW5kbGUgZGV2aWNlSWNvbkhhbmRsZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQkdldEluZGV4ZWREZXZpY2UoY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSWNvbkhhbmRsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGRldmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGV2aWNlSWNvbkhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQk9wZW5EZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU3RyMjU1IGRldmljZU5hbWU7Ci0Jc2hvcnQgcGVybWlzc2lvbjsKLQlsb25nIGluUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZGV2aWNlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCT3BlbkRldmljZShkZXZpY2VOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24sCi0JICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBpblJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU3RyMjU1IGRldmljZU5hbWU7CisgICAgc2hvcnQgcGVybWlzc2lvbjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCT3BlbkRldmljZShkZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQkNsb3NlRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5SZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJDbG9zZURldmljZShpblJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQkNsb3NlRGV2aWNlKGluUmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCUmVjb3JkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNQQlB0ciBpblBhcmFtUHRyOwotCUJvb2xlYW4gYXN5bmNoRmxhZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBTUEJPYmpfQ29udmVydCwgJmluUGFyYW1QdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhc3luY2hGbGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQlJlY29yZChpblBhcmFtUHRyLAotCSAgICAgICAgICAgICAgICAgYXN5bmNoRmxhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU1BCUHRyIGluUGFyYW1QdHI7CisgICAgQm9vbGVhbiBhc3luY2hGbGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQk9ial9Db252ZXJ0LCAmaW5QYXJhbVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzeW5jaEZsYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCUmVjb3JkKGluUGFyYW1QdHIsCisgICAgICAgICAgICAgICAgICAgICBhc3luY2hGbGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCUGF1c2VSZWNvcmRpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpblJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQlBhdXNlUmVjb3JkaW5nKGluUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCUGF1c2VSZWNvcmRpbmcoaW5SZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJSZXN1bWVSZWNvcmRpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpblJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQlJlc3VtZVJlY29yZGluZyhpblJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQlJlc3VtZVJlY29yZGluZyhpblJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQlN0b3BSZWNvcmRpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpblJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQlN0b3BSZWNvcmRpbmcoaW5SZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJTdG9wUmVjb3JkaW5nKGluUmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCR2V0UmVjb3JkaW5nU3RhdHVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgcmVjb3JkaW5nU3RhdHVzOwotCXNob3J0IG1ldGVyTGV2ZWw7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbFNhbXBsZXNUb1JlY29yZDsKLQl1bnNpZ25lZCBsb25nIG51bWJlck9mU2FtcGxlc1JlY29yZGVkOwotCXVuc2lnbmVkIGxvbmcgdG90YWxNc2Vjc1RvUmVjb3JkOwotCXVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZNc2Vjc1JlY29yZGVkOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCR2V0UmVjb3JkaW5nU3RhdHVzKGluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY29yZGluZ1N0YXR1cywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXRlckxldmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvdGFsU2FtcGxlc1RvUmVjb3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlc1JlY29yZGVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvdGFsTXNlY3NUb1JlY29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZk1zZWNzUmVjb3JkZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhobGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVjb3JkaW5nU3RhdHVzLAotCSAgICAgICAgICAgICAgICAgICAgIG1ldGVyTGV2ZWwsCi0JICAgICAgICAgICAgICAgICAgICAgdG90YWxTYW1wbGVzVG9SZWNvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzUmVjb3JkZWQsCi0JICAgICAgICAgICAgICAgICAgICAgdG90YWxNc2Vjc1RvUmVjb3JkLAotCSAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mTXNlY3NSZWNvcmRlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCByZWNvcmRpbmdTdGF0dXM7CisgICAgc2hvcnQgbWV0ZXJMZXZlbDsKKyAgICB1bnNpZ25lZCBsb25nIHRvdGFsU2FtcGxlc1RvUmVjb3JkOworICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZTYW1wbGVzUmVjb3JkZWQ7CisgICAgdW5zaWduZWQgbG9uZyB0b3RhbE1zZWNzVG9SZWNvcmQ7CisgICAgdW5zaWduZWQgbG9uZyBudW1iZXJPZk1zZWNzUmVjb3JkZWQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJHZXRSZWNvcmRpbmdTdGF0dXMoaW5SZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjb3JkaW5nU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldGVyTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxTYW1wbGVzVG9SZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzUmVjb3JkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxNc2Vjc1RvUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mTXNlY3NSZWNvcmRlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGhsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRpbmdTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWV0ZXJMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNhbXBsZXNUb1JlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXNSZWNvcmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbE1zZWNzVG9SZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZNc2Vjc1JlY29yZGVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCR2V0RGV2aWNlSW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCU9TVHlwZSBpbmZvVHlwZTsKLQl2b2lkICogaW5mb0RhdGE7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mdyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIE9TVHlwZSBpbmZvVHlwZTsKKyAgICB2b2lkICogaW5mb0RhdGE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCU2V0RGV2aWNlSW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCU9TVHlwZSBpbmZvVHlwZTsKLQl2b2lkICogaW5mb0RhdGE7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mdyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIE9TVHlwZSBpbmZvVHlwZTsKKyAgICB2b2lkICogaW5mb0RhdGE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCTWlsbGlzZWNvbmRzVG9CeXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWxvbmcgbWlsbGlzZWNvbmRzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCTWlsbGlzZWNvbmRzVG9CeXRlcyhpblJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlsbGlzZWNvbmRzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgbG9uZyBtaWxsaXNlY29uZHM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJNaWxsaXNlY29uZHNUb0J5dGVzKGluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaXNlY29uZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQkJ5dGVzVG9NaWxsaXNlY29uZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpblJlZk51bTsKLQlsb25nIGJ5dGVDb3VudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQkJ5dGVzVG9NaWxsaXNlY29uZHMoaW5SZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIGxvbmcgYnl0ZUNvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCQnl0ZXNUb01pbGxpc2Vjb25kcyhpblJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBTbmRfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiU1BCIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0JeyJTeXNCZWVwIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TeXNCZWVwLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IlNuZE5ld0NoYW5uZWwiLCAoUHlDRnVuY3Rpb24pU25kX1NuZE5ld0NoYW5uZWwsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHN5bnRoLCBsb25nIGluaXQsIFB5T2JqZWN0KiB1c2VyUm91dGluZSkgLT4gKFNuZENoYW5uZWxQdHIgY2hhbikiKX0sCi0JeyJTbmRTb3VuZE1hbmFnZXJWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRTb3VuZE1hbmFnZXJWZXJzaW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChOdW1WZXJzaW9uIF9ydikiKX0sCi0JeyJTbmRNYW5hZ2VyU3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRNYW5hZ2VyU3RhdHVzLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB0aGVMZW5ndGgpIC0+IChTTVN0YXR1cyB0aGVTdGF0dXMpIil9LAotCXsiU25kR2V0U3lzQmVlcFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRHZXRTeXNCZWVwU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IHN5c0JlZXBTdGF0ZSkiKX0sCi0JeyJTbmRTZXRTeXNCZWVwU3RhdGUiLCAoUHlDRnVuY3Rpb24pU25kX1NuZFNldFN5c0JlZXBTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgc3lzQmVlcFN0YXRlKSAtPiBOb25lIil9LAotCXsiR2V0U3lzQmVlcFZvbHVtZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0U3lzQmVlcFZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBsZXZlbCkiKX0sCi0JeyJTZXRTeXNCZWVwVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TZXRTeXNCZWVwVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihsb25nIGxldmVsKSAtPiBOb25lIil9LAotCXsiR2V0RGVmYXVsdE91dHB1dFZvbHVtZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0RGVmYXVsdE91dHB1dFZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBsZXZlbCkiKX0sCi0JeyJTZXREZWZhdWx0T3V0cHV0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TZXREZWZhdWx0T3V0cHV0Vm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihsb25nIGxldmVsKSAtPiBOb25lIil9LAotCXsiR2V0U291bmRIZWFkZXJPZmZzZXQiLCAoUHlDRnVuY3Rpb24pU25kX0dldFNvdW5kSGVhZGVyT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIihTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZSkgLT4gKGxvbmcgb2Zmc2V0KSIpfSwKLQl7IkdldENvbXByZXNzaW9uSW5mbyIsIChQeUNGdW5jdGlvbilTbmRfR2V0Q29tcHJlc3Npb25JbmZvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjb21wcmVzc2lvbklELCBPU1R5cGUgZm9ybWF0LCBzaG9ydCBudW1DaGFubmVscywgc2hvcnQgc2FtcGxlU2l6ZSkgLT4gKENvbXByZXNzaW9uSW5mbyBjcCkiKX0sCi0JeyJTZXRTb3VuZFByZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NldFNvdW5kUHJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHRoZVR5cGUsIEhhbmRsZSBzZXR0aW5ncykgLT4gKFN0cjI1NSBuYW1lKSIpfSwKLQl7IkdldFNvdW5kUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0U291bmRQcmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgdGhlVHlwZSwgSGFuZGxlIHNldHRpbmdzKSAtPiAoU3RyMjU1IG5hbWUpIil9LAotCXsiR2V0Q29tcHJlc3Npb25OYW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRDb21wcmVzc2lvbk5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjb21wcmVzc2lvblR5cGUpIC0+IChTdHIyNTUgY29tcHJlc3Npb25OYW1lKSIpfSwKLQl7IlNQQlZlcnNpb24iLCAoUHlDRnVuY3Rpb24pU25kX1NQQlZlcnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE51bVZlcnNpb24gX3J2KSIpfSwKLQl7IlNuZFJlY29yZCIsIChQeUNGdW5jdGlvbilTbmRfU25kUmVjb3JkLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBjb3JuZXIsIE9TVHlwZSBxdWFsaXR5KSAtPiAoU25kTGlzdEhhbmRsZSBzbmRIYW5kbGUpIil9LAotCXsiU1BCU2lnbkluRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTaWduSW5EZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRldmljZVJlZk51bSwgU3RyMjU1IGRldmljZU5hbWUpIC0+IE5vbmUiKX0sCi0JeyJTUEJTaWduT3V0RGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTaWduT3V0RGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkZXZpY2VSZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTUEJHZXRJbmRleGVkRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJHZXRJbmRleGVkRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjb3VudCkgLT4gKFN0cjI1NSBkZXZpY2VOYW1lLCBIYW5kbGUgZGV2aWNlSWNvbkhhbmRsZSkiKX0sCi0JeyJTUEJPcGVuRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJPcGVuRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgZGV2aWNlTmFtZSwgc2hvcnQgcGVybWlzc2lvbikgLT4gKGxvbmcgaW5SZWZOdW0pIil9LAotCXsiU1BCQ2xvc2VEZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkNsb3NlRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiBOb25lIil9LAotCXsiU1BCUmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJSZWNvcmQsIDEsCi0JIFB5RG9jX1NUUigiKFNQQlB0ciBpblBhcmFtUHRyLCBCb29sZWFuIGFzeW5jaEZsYWcpIC0+IE5vbmUiKX0sCi0JeyJTUEJQYXVzZVJlY29yZGluZyIsIChQeUNGdW5jdGlvbilTbmRfU1BCUGF1c2VSZWNvcmRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTUEJSZXN1bWVSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pU25kX1NQQlJlc3VtZVJlY29yZGluZywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IlNQQlN0b3BSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pU25kX1NQQlN0b3BSZWNvcmRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTUEJHZXRSZWNvcmRpbmdTdGF0dXMiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkdldFJlY29yZGluZ1N0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gKHNob3J0IHJlY29yZGluZ1N0YXR1cywgc2hvcnQgbWV0ZXJMZXZlbCwgdW5zaWduZWQgbG9uZyB0b3RhbFNhbXBsZXNUb1JlY29yZCwgdW5zaWduZWQgbG9uZyBudW1iZXJPZlNhbXBsZXNSZWNvcmRlZCwgdW5zaWduZWQgbG9uZyB0b3RhbE1zZWNzVG9SZWNvcmQsIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZNc2Vjc1JlY29yZGVkKSIpfSwKLQl7IlNQQkdldERldmljZUluZm8iLCAoUHlDRnVuY3Rpb24pU25kX1NQQkdldERldmljZUluZm8sIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0sIE9TVHlwZSBpbmZvVHlwZSwgdm9pZCAqIGluZm9EYXRhKSAtPiBOb25lIil9LAotCXsiU1BCU2V0RGV2aWNlSW5mbyIsIChQeUNGdW5jdGlvbilTbmRfU1BCU2V0RGV2aWNlSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mb0RhdGEpIC0+IE5vbmUiKX0sCi0JeyJTUEJNaWxsaXNlY29uZHNUb0J5dGVzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJNaWxsaXNlY29uZHNUb0J5dGVzLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiAobG9uZyBtaWxsaXNlY29uZHMpIil9LAotCXsiU1BCQnl0ZXNUb01pbGxpc2Vjb25kcyIsIChQeUNGdW5jdGlvbilTbmRfU1BCQnl0ZXNUb01pbGxpc2Vjb25kcywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gKGxvbmcgYnl0ZUNvdW50KSIpfSwKKyAgICB7IlNQQiIsIChQeUNGdW5jdGlvbilTbmRfU1BCLCAxLAorICAgICBQeURvY19TVFIoTlVMTCl9LAorICAgIHsiU3lzQmVlcCIsIChQeUNGdW5jdGlvbilTbmRfU3lzQmVlcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZHVyYXRpb24pIC0+IE5vbmUiKX0sCisgICAgeyJTbmROZXdDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmROZXdDaGFubmVsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBzeW50aCwgbG9uZyBpbml0LCBQeU9iamVjdCogdXNlclJvdXRpbmUpIC0+IChTbmRDaGFubmVsUHRyIGNoYW4pIil9LAorICAgIHsiU25kU291bmRNYW5hZ2VyVmVyc2lvbiIsIChQeUNGdW5jdGlvbilTbmRfU25kU291bmRNYW5hZ2VyVmVyc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTnVtVmVyc2lvbiBfcnYpIil9LAorICAgIHsiU25kTWFuYWdlclN0YXR1cyIsIChQeUNGdW5jdGlvbilTbmRfU25kTWFuYWdlclN0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdGhlTGVuZ3RoKSAtPiAoU01TdGF0dXMgdGhlU3RhdHVzKSIpfSwKKyAgICB7IlNuZEdldFN5c0JlZXBTdGF0ZSIsIChQeUNGdW5jdGlvbilTbmRfU25kR2V0U3lzQmVlcFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBzeXNCZWVwU3RhdGUpIil9LAorICAgIHsiU25kU2V0U3lzQmVlcFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRTZXRTeXNCZWVwU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHN5c0JlZXBTdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFN5c0JlZXBWb2x1bWUiLCAoUHlDRnVuY3Rpb24pU25kX0dldFN5c0JlZXBWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgbGV2ZWwpIil9LAorICAgIHsiU2V0U3lzQmVlcFZvbHVtZSIsIChQeUNGdW5jdGlvbilTbmRfU2V0U3lzQmVlcFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBsZXZlbCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERlZmF1bHRPdXRwdXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pU25kX0dldERlZmF1bHRPdXRwdXRWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgbGV2ZWwpIil9LAorICAgIHsiU2V0RGVmYXVsdE91dHB1dFZvbHVtZSIsIChQeUNGdW5jdGlvbilTbmRfU2V0RGVmYXVsdE91dHB1dFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBsZXZlbCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFNvdW5kSGVhZGVyT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRTb3VuZEhlYWRlck9mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU25kTGlzdEhhbmRsZSBzbmRIYW5kbGUpIC0+IChsb25nIG9mZnNldCkiKX0sCisgICAgeyJHZXRDb21wcmVzc2lvbkluZm8iLCAoUHlDRnVuY3Rpb24pU25kX0dldENvbXByZXNzaW9uSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY29tcHJlc3Npb25JRCwgT1NUeXBlIGZvcm1hdCwgc2hvcnQgbnVtQ2hhbm5lbHMsIHNob3J0IHNhbXBsZVNpemUpIC0+IChDb21wcmVzc2lvbkluZm8gY3ApIil9LAorICAgIHsiU2V0U291bmRQcmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TZXRTb3VuZFByZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSB0aGVUeXBlLCBIYW5kbGUgc2V0dGluZ3MpIC0+IChTdHIyNTUgbmFtZSkiKX0sCisgICAgeyJHZXRTb3VuZFByZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pU25kX0dldFNvdW5kUHJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHRoZVR5cGUsIEhhbmRsZSBzZXR0aW5ncykgLT4gKFN0cjI1NSBuYW1lKSIpfSwKKyAgICB7IkdldENvbXByZXNzaW9uTmFtZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0Q29tcHJlc3Npb25OYW1lLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgY29tcHJlc3Npb25UeXBlKSAtPiAoU3RyMjU1IGNvbXByZXNzaW9uTmFtZSkiKX0sCisgICAgeyJTUEJWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJWZXJzaW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChOdW1WZXJzaW9uIF9ydikiKX0sCisgICAgeyJTbmRSZWNvcmQiLCAoUHlDRnVuY3Rpb24pU25kX1NuZFJlY29yZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgY29ybmVyLCBPU1R5cGUgcXVhbGl0eSkgLT4gKFNuZExpc3RIYW5kbGUgc25kSGFuZGxlKSIpfSwKKyAgICB7IlNQQlNpZ25JbkRldmljZSIsIChQeUNGdW5jdGlvbilTbmRfU1BCU2lnbkluRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkZXZpY2VSZWZOdW0sIFN0cjI1NSBkZXZpY2VOYW1lKSAtPiBOb25lIil9LAorICAgIHsiU1BCU2lnbk91dERldmljZSIsIChQeUNGdW5jdGlvbilTbmRfU1BCU2lnbk91dERldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZGV2aWNlUmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiU1BCR2V0SW5kZXhlZERldmljZSIsIChQeUNGdW5jdGlvbilTbmRfU1BCR2V0SW5kZXhlZERldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQpIC0+IChTdHIyNTUgZGV2aWNlTmFtZSwgSGFuZGxlIGRldmljZUljb25IYW5kbGUpIil9LAorICAgIHsiU1BCT3BlbkRldmljZSIsIChQeUNGdW5jdGlvbilTbmRfU1BCT3BlbkRldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGRldmljZU5hbWUsIHNob3J0IHBlcm1pc3Npb24pIC0+IChsb25nIGluUmVmTnVtKSIpfSwKKyAgICB7IlNQQkNsb3NlRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJDbG9zZURldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IlNQQlJlY29yZCIsIChQeUNGdW5jdGlvbilTbmRfU1BCUmVjb3JkLCAxLAorICAgICBQeURvY19TVFIoIihTUEJQdHIgaW5QYXJhbVB0ciwgQm9vbGVhbiBhc3luY2hGbGFnKSAtPiBOb25lIil9LAorICAgIHsiU1BCUGF1c2VSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pU25kX1NQQlBhdXNlUmVjb3JkaW5nLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiU1BCUmVzdW1lUmVjb3JkaW5nIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJSZXN1bWVSZWNvcmRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTUEJTdG9wUmVjb3JkaW5nIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTdG9wUmVjb3JkaW5nLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiU1BCR2V0UmVjb3JkaW5nU3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJHZXRSZWNvcmRpbmdTdGF0dXMsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IChzaG9ydCByZWNvcmRpbmdTdGF0dXMsIHNob3J0IG1ldGVyTGV2ZWwsIHVuc2lnbmVkIGxvbmcgdG90YWxTYW1wbGVzVG9SZWNvcmQsIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZTYW1wbGVzUmVjb3JkZWQsIHVuc2lnbmVkIGxvbmcgdG90YWxNc2Vjc1RvUmVjb3JkLCB1bnNpZ25lZCBsb25nIG51bWJlck9mTXNlY3NSZWNvcmRlZCkiKX0sCisgICAgeyJTUEJHZXREZXZpY2VJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJHZXREZXZpY2VJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluUmVmTnVtLCBPU1R5cGUgaW5mb1R5cGUsIHZvaWQgKiBpbmZvRGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IlNQQlNldERldmljZUluZm8iLCAoUHlDRnVuY3Rpb24pU25kX1NQQlNldERldmljZUluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0sIE9TVHlwZSBpbmZvVHlwZSwgdm9pZCAqIGluZm9EYXRhKSAtPiBOb25lIil9LAorICAgIHsiU1BCTWlsbGlzZWNvbmRzVG9CeXRlcyIsIChQeUNGdW5jdGlvbilTbmRfU1BCTWlsbGlzZWNvbmRzVG9CeXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gKGxvbmcgbWlsbGlzZWNvbmRzKSIpfSwKKyAgICB7IlNQQkJ5dGVzVG9NaWxsaXNlY29uZHMiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkJ5dGVzVG9NaWxsaXNlY29uZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IChsb25nIGJ5dGVDb3VudCkiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTA2MSw2MiArMTA2MSw2MiBAQAogc3RhdGljIGludAogU25kQ2hfQ2FsbENhbGxCYWNrKHZvaWQgKmFyZykKIHsKLSAgICAgICAgU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopYXJnOwotICAgICAgICBQeU9iamVjdCAqYXJnczsKLSAgICAgICAgUHlPYmplY3QgKnJlczsKLSAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIihPKGhobCkpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgcC0+b2JfY21kLmNtZCwgcC0+b2JfY21kLnBhcmFtMSwgcC0+b2JfY21kLnBhcmFtMik7Ci0gICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KHAtPm9iX2NhbGxiYWNrLCBhcmdzKTsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBQeV9ERUNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopYXJnOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIihPKGhobCkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLCBwLT5vYl9jbWQuY21kLCBwLT5vYl9jbWQucGFyYW0xLCBwLT5vYl9jbWQucGFyYW0yKTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChwLT5vYl9jYWxsYmFjaywgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiAvKiBSb3V0aW5lIHBhc3NlZCB0byBOZXdTbmRDaGFubmVsIC0tIHNjaGVkdWxlIGEgY2FsbCB0byBTbmRDaF9DYWxsQ2FsbEJhY2sgKi8KIHN0YXRpYyBwYXNjYWwgdm9pZAogU25kQ2hfVXNlclJvdXRpbmUoU25kQ2hhbm5lbFB0ciBjaGFuLCBTbmRDb21tYW5kICpjbWQpCiB7Ci0gICAgICAgIFNuZENoYW5uZWxPYmplY3QgKnAgPSAoU25kQ2hhbm5lbE9iamVjdCAqKShjaGFuLT51c2VySW5mbyk7Ci0gICAgICAgIGlmIChwLT5vYl9jYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBBNSA9IFNldEE1KHAtPm9iX0E1KTsKLSAgICAgICAgICAgICAgICBwLT5vYl9jbWQgPSAqY21kOwotICAgICAgICAgICAgICAgIFB5X0FkZFBlbmRpbmdDYWxsKFNuZENoX0NhbGxDYWxsQmFjaywgKHZvaWQgKilwKTsKLSAgICAgICAgICAgICAgICBTZXRBNShBNSk7Ci0gICAgICAgIH0KKyAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKikoY2hhbi0+dXNlckluZm8pOworICAgIGlmIChwLT5vYl9jYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgIGxvbmcgQTUgPSBTZXRBNShwLT5vYl9BNSk7CisgICAgICAgIHAtPm9iX2NtZCA9ICpjbWQ7CisgICAgICAgIFB5X0FkZFBlbmRpbmdDYWxsKFNuZENoX0NhbGxDYWxsQmFjaywgKHZvaWQgKilwKTsKKyAgICAgICAgU2V0QTUoQTUpOworICAgIH0KIH0KIAogLyogU1BCIGNhbGxiYWNrcyAtIFNjaGVkdWxlIGNhbGxiYWNrcyB0byBQeXRob24gKi8KIHN0YXRpYyBpbnQKIFNQQl9DYWxsQ2FsbEJhY2sodm9pZCAqYXJnKQogewotICAgICAgICBTUEJPYmplY3QgKnAgPSAoU1BCT2JqZWN0ICopYXJnOwotICAgICAgICBQeU9iamVjdCAqYXJnczsKLSAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICBTUEJPYmplY3QgKnAgPSAoU1BCT2JqZWN0ICopYXJnOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLSAgICAgICAgaWYgKCBwLT5vYl90aGlzY2FsbGJhY2sgPT0gMCApIHJldHVybiAwOwotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8pIiwgcCk7Ci0gICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KHAtPm9iX3RoaXNjYWxsYmFjaywgYXJncyk7Ci0gICAgICAgIHAtPm9iX3RoaXNjYWxsYmFjayA9IDA7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgUHlfREVDUkVGKHJlcyk7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmICggcC0+b2JfdGhpc2NhbGxiYWNrID09IDAgKSByZXR1cm4gMDsKKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8pIiwgcCk7CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QocC0+b2JfdGhpc2NhbGxiYWNrLCBhcmdzKTsKKyAgICBwLT5vYl90aGlzY2FsbGJhY2sgPSAwOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkCiBTUEJfY29tcGxldGlvbihTUEJQdHIgbXlfc3BiKQogewotICAgICAgICBTUEJPYmplY3QgKnAgPSAoU1BCT2JqZWN0ICopKG15X3NwYi0+dXNlckxvbmcpOworICAgIFNQQk9iamVjdCAqcCA9IChTUEJPYmplY3QgKikobXlfc3BiLT51c2VyTG9uZyk7CiAKLSAgICAgICAgaWYgKHAgJiYgcC0+b2JfY29tcGxldGlvbikgewotICAgICAgICAgICAgICAgIGxvbmcgQTUgPSBTZXRBNShwLT5vYl9BNSk7Ci0gICAgICAgICAgICAgICAgcC0+b2JfdGhpc2NhbGxiYWNrID0gcC0+b2JfY29tcGxldGlvbjsgIC8qIEhvcGUgd2UgY2Fubm90IGdldCB0d28gYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgICAgIFB5X0FkZFBlbmRpbmdDYWxsKFNQQl9DYWxsQ2FsbEJhY2ssICh2b2lkICopcCk7Ci0gICAgICAgICAgICAgICAgU2V0QTUoQTUpOwotICAgICAgICB9CisgICAgaWYgKHAgJiYgcC0+b2JfY29tcGxldGlvbikgeworICAgICAgICBsb25nIEE1ID0gU2V0QTUocC0+b2JfQTUpOworICAgICAgICBwLT5vYl90aGlzY2FsbGJhY2sgPSBwLT5vYl9jb21wbGV0aW9uOyAgLyogSG9wZSB3ZSBjYW5ub3QgZ2V0IHR3byBhdCB0aGUgc2FtZSB0aW1lICovCisgICAgICAgIFB5X0FkZFBlbmRpbmdDYWxsKFNQQl9DYWxsQ2FsbEJhY2ssICh2b2lkICopcCk7CisgICAgICAgIFNldEE1KEE1KTsKKyAgICB9CiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIApAQCAtMTEyNCwzOCArMTEyNCwzOCBAQAogCiB2b2lkIGluaXRfU25kKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiAKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9TbmQiLCBTbmRfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9TbmQiLCBTbmRfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JU25kX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoU25kX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgU25kX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JU25kQ2hhbm5lbF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmU25kQ2hhbm5lbF9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJlNuZENoYW5uZWxfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTbmRDaGFubmVsIiwgKFB5T2JqZWN0ICopJlNuZENoYW5uZWxfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZTbmRDaGFubmVsX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU25kQ2hhbm5lbFR5cGUiLCAoUHlPYmplY3QgKikmU25kQ2hhbm5lbF9UeXBlKTsKLQlTUEJfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlNQQl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJlNQQl9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBTbmRfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChTbmRfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBTbmRfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBTbmRDaGFubmVsX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTbmRDaGFubmVsX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmU25kQ2hhbm5lbF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNuZENoYW5uZWwiLCAoUHlPYmplY3QgKikmU25kQ2hhbm5lbF9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlNuZENoYW5uZWxfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTbmRDaGFubmVsVHlwZSIsIChQeU9iamVjdCAqKSZTbmRDaGFubmVsX1R5cGUpOworICAgIFNQQl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmU1BCX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmU1BCX1R5cGUpOwogI2lmIDAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNQQiIsIChQeU9iamVjdCAqKSZTUEJfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTUEIiLCAoUHlPYmplY3QgKikmU1BCX1R5cGUpOwogI2VuZGlmCi0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZTUEJfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTUEJUeXBlIiwgKFB5T2JqZWN0ICopJlNQQl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlNQQl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNQQlR5cGUiLCAoUHlPYmplY3QgKikmU1BCX1R5cGUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3RlL19URW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvdGUvX1RFbW9kdWxlLmMKaW5kZXggZjE4MjY4OC4uYTk5OGZjOCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvdGUvX1RFbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvdGUvX1RFbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM2LDIxICszNiwyMSBAQAogVGV4dFN0eWxlX05ldyhUZXh0U3R5bGVQdHIgaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbGxPJiIsIChsb25nKWl0c2VsZi0+dHNGb250LCAobG9uZylpdHNlbGYtPnRzRmFjZSwgKGxvbmcpaXRzZWxmLT50c1NpemUsIFFkUkdCX05ldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+dHNDb2xvcik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbE8mIiwgKGxvbmcpaXRzZWxmLT50c0ZvbnQsIChsb25nKWl0c2VsZi0+dHNGYWNlLCAobG9uZylpdHNlbGYtPnRzU2l6ZSwgUWRSR0JfTmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnRzQ29sb3IpOwogfQogCiBzdGF0aWMgaW50CiBUZXh0U3R5bGVfQ29udmVydChQeU9iamVjdCAqdiwgVGV4dFN0eWxlUHRyIHBfaXRzZWxmKQogewotICAgICAgICBsb25nIGZvbnQsIGZhY2UsIHNpemU7CisgICAgbG9uZyBmb250LCBmYWNlLCBzaXplOwogCi0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGxsTyYiLCAmZm9udCwgJmZhY2UsICZzaXplLCBRZFJHQl9Db252ZXJ0LCAmcF9pdHNlbGYtPnRzQ29sb3IpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcF9pdHNlbGYtPnRzRm9udCA9IChzaG9ydClmb250OwotICAgICAgICBwX2l0c2VsZi0+dHNGYWNlID0gKFN0eWxlKWZhY2U7Ci0gICAgICAgIHBfaXRzZWxmLT50c1NpemUgPSAoc2hvcnQpc2l6ZTsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJsbGxPJiIsICZmb250LCAmZmFjZSwgJnNpemUsIFFkUkdCX0NvbnZlcnQsICZwX2l0c2VsZi0+dHNDb2xvcikgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBwX2l0c2VsZi0+dHNGb250ID0gKHNob3J0KWZvbnQ7CisgICAgcF9pdHNlbGYtPnRzRmFjZSA9IChTdHlsZSlmYWNlOworICAgIHBfaXRzZWxmLT50c1NpemUgPSAoc2hvcnQpc2l6ZTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9FcnJvcjsKQEAgLTYyLDkxNyArNjIsOTE3IEBACiAjZGVmaW5lIFRFT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlRFX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlRFX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBURU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVRFSGFuZGxlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgVEVIYW5kbGUgb2JfaXRzZWxmOwogfSBURU9iamVjdDsKIAogUHlPYmplY3QgKlRFT2JqX05ldyhURUhhbmRsZSBpdHNlbGYpCiB7Ci0JVEVPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRFX0Vycm9yLCJDYW5ub3QgY3JlYXRlIG51bGwgVEUiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhURU9iamVjdCwgJlRFX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBURU9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoVEVfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBURSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKFRFT2JqZWN0LCAmVEVfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVEVPYmpfQ29udmVydChQeU9iamVjdCAqdiwgVEVIYW5kbGUgKnBfaXRzZWxmKQogewotCWlmICghVEVPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVEUgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoVEVPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghVEVPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVEUgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoVEVPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBURU9ial9kZWFsbG9jKFRFT2JqZWN0ICpzZWxmKQogewotCVRFRGlzcG9zZShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgVEVEaXNwb3NlKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVNldFRleHQoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKnRleHRfX2luX187Ci0JbG9uZyB0ZXh0X19sZW5fXzsKLQlpbnQgdGV4dF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKnRleHRfX2luX187CisgICAgbG9uZyB0ZXh0X19sZW5fXzsKKyAgICBpbnQgdGV4dF9faW5fbGVuX187CiAjaWZuZGVmIFRFU2V0VGV4dAotCVB5TWFjX1BSRUNIRUNLKFRFU2V0VGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTZXRUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRfX2luX18sICZ0ZXh0X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCXRleHRfX2xlbl9fID0gdGV4dF9faW5fbGVuX187Ci0JVEVTZXRUZXh0KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAotCSAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdGV4dF9fbGVuX18gPSB0ZXh0X19pbl9sZW5fXzsKKyAgICBURVNldFRleHQodGV4dF9faW5fXywgdGV4dF9fbGVuX18sCisgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUdldFRleHQoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNoYXJzSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ2hhcnNIYW5kbGUgX3J2OwogI2lmbmRlZiBURUdldFRleHQKLQlQeU1hY19QUkVDSEVDSyhURUdldFRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFR2V0VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVHZXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVHZXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUlkbGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVJZGxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVJZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUlkbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFSWRsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFSWRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTZXRTZWxlY3QoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgc2VsU3RhcnQ7Ci0JbG9uZyBzZWxFbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgc2VsU3RhcnQ7CisgICAgbG9uZyBzZWxFbmQ7CiAjaWZuZGVmIFRFU2V0U2VsZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVEVTZXRTZWxlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU2V0U2VsZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbFN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VsRW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVTZXRTZWxlY3Qoc2VsU3RhcnQsCi0JICAgICAgICAgICAgc2VsRW5kLAotCSAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbEVuZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFU2V0U2VsZWN0KHNlbFN0YXJ0LAorICAgICAgICAgICAgICAgIHNlbEVuZCwKKyAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVBY3RpdmF0ZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURUFjdGl2YXRlCi0JUHlNYWNfUFJFQ0hFQ0soVEVBY3RpdmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVBY3RpdmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVBY3RpdmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFQWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFRGVhY3RpdmF0ZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURURlYWN0aXZhdGUKLQlQeU1hY19QUkVDSEVDSyhURURlYWN0aXZhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFRGVhY3RpdmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVEZWFjdGl2YXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVEZWFjdGl2YXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUtleShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ2hhclBhcmFtZXRlciBrZXk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENoYXJQYXJhbWV0ZXIga2V5OwogI2lmbmRlZiBURUtleQotCVB5TWFjX1BSRUNIRUNLKFRFS2V5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUtleSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmtleSkpCi0JCXJldHVybiBOVUxMOwotCVRFS2V5KGtleSwKLQkgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURUtleShrZXksCisgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQ3V0KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFQ3V0Ci0JUHlNYWNfUFJFQ0hFQ0soVEVDdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFQ3V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURUN1dChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFQ3V0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUNvcHkoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soVEVDb3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUNvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFQ29weShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFQ29weShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVQYXN0ZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURVBhc3RlCi0JUHlNYWNfUFJFQ0hFQ0soVEVQYXN0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVQYXN0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFUGFzdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFRGVsZXRlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFRGVsZXRlCi0JUHlNYWNfUFJFQ0hFQ0soVEVEZWxldGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFRGVsZXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURURlbGV0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFRGVsZXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUluc2VydChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqdGV4dF9faW5fXzsKLQlsb25nIHRleHRfX2xlbl9fOwotCWludCB0ZXh0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqdGV4dF9faW5fXzsKKyAgICBsb25nIHRleHRfX2xlbl9fOworICAgIGludCB0ZXh0X19pbl9sZW5fXzsKICNpZm5kZWYgVEVJbnNlcnQKLQlQeU1hY19QUkVDSEVDSyhURUluc2VydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVJbnNlcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdGV4dF9fbGVuX18gPSB0ZXh0X19pbl9sZW5fXzsKLQlURUluc2VydCh0ZXh0X19pbl9fLCB0ZXh0X19sZW5fXywKLQkgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdGV4dF9fbGVuX18gPSB0ZXh0X19pbl9sZW5fXzsKKyAgICBURUluc2VydCh0ZXh0X19pbl9fLCB0ZXh0X19sZW5fXywKKyAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTZXRBbGlnbm1lbnQoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGp1c3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGp1c3Q7CiAjaWZuZGVmIFRFU2V0QWxpZ25tZW50Ci0JUHlNYWNfUFJFQ0hFQ0soVEVTZXRBbGlnbm1lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU2V0QWxpZ25tZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmanVzdCkpCi0JCXJldHVybiBOVUxMOwotCVRFU2V0QWxpZ25tZW50KGp1c3QsCi0JICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmanVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFU2V0QWxpZ25tZW50KGp1c3QsCisgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFVXBkYXRlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJVcGRhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgclVwZGF0ZTsKICNpZm5kZWYgVEVVcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhURVVwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVVcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmclVwZGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCVRFVXBkYXRlKCZyVXBkYXRlLAotCSAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyVXBkYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVVcGRhdGUoJnJVcGRhdGUsCisgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU2Nyb2xsKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIFRFU2Nyb2xsCi0JUHlNYWNfUFJFQ0hFQ0soVEVTY3JvbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU2Nyb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlURVNjcm9sbChkaCwKLQkgICAgICAgICBkdiwKLQkgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFU2Nyb2xsKGRoLAorICAgICAgICAgICAgIGR2LAorICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVNlbFZpZXcoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVTZWxWaWV3Ci0JUHlNYWNfUFJFQ0hFQ0soVEVTZWxWaWV3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNlbFZpZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFU2VsVmlldyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFU2VsVmlldyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVQaW5TY3JvbGwoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgVEVQaW5TY3JvbGwKLQlQeU1hY19QUkVDSEVDSyhURVBpblNjcm9sbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVQaW5TY3JvbGwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCVRFUGluU2Nyb2xsKGRoLAotCSAgICAgICAgICAgIGR2LAotCSAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVQaW5TY3JvbGwoZGgsCisgICAgICAgICAgICAgICAgZHYsCisgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQXV0b1ZpZXcoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZkF1dG87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gZkF1dG87CiAjaWZuZGVmIFRFQXV0b1ZpZXcKLQlQeU1hY19QUkVDSEVDSyhURUF1dG9WaWV3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUF1dG9WaWV3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZkF1dG8pKQotCQlyZXR1cm4gTlVMTDsKLQlURUF1dG9WaWV3KGZBdXRvLAotCSAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZkF1dG8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURUF1dG9WaWV3KGZBdXRvLAorICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQ2FsVGV4dChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURUNhbFRleHQKLQlQeU1hY19QUkVDSEVDSyhURUNhbFRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFQ2FsVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVDYWxUZXh0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVDYWxUZXh0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUdldE9mZnNldChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCVBvaW50IHB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUG9pbnQgcHQ7CiAjaWZuZGVmIFRFR2V0T2Zmc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soVEVHZXRPZmZzZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFR2V0T2Zmc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFR2V0T2Zmc2V0KHB0LAotCSAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0T2Zmc2V0KHB0LAorICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0UG9pbnQoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IF9ydjsKLQlzaG9ydCBvZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IF9ydjsKKyAgICBzaG9ydCBvZmZzZXQ7CiAjaWZuZGVmIFRFR2V0UG9pbnQKLQlQeU1hY19QUkVDSEVDSyhURUdldFBvaW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldFBvaW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVHZXRQb2ludChvZmZzZXQsCi0JICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURUdldFBvaW50KG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUNsaWNrKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKLQlCb29sZWFuIGZFeHRlbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHB0OworICAgIEJvb2xlYW4gZkV4dGVuZDsKICNpZm5kZWYgVEVDbGljawotCVB5TWFjX1BSRUNIRUNLKFRFQ2xpY2spOworICAgIFB5TWFjX1BSRUNIRUNLKFRFQ2xpY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZFeHRlbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlURUNsaWNrKHB0LAotCSAgICAgICAgZkV4dGVuZCwKLQkgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZkV4dGVuZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFQ2xpY2socHQsCisgICAgICAgIGZFeHRlbmQsCisgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVNldFN0eWxlSGFuZGxlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlURVN0eWxlSGFuZGxlIHRoZUhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVTdHlsZUhhbmRsZSB0aGVIYW5kbGU7CiAjaWZuZGVmIFRFU2V0U3R5bGVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhURVNldFN0eWxlSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFN0eWxlSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVIYW5kbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlURVNldFN0eWxlSGFuZGxlKHRoZUhhbmRsZSwKLQkgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZXRTdHlsZUhhbmRsZSh0aGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVHZXRTdHlsZUhhbmRsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVEVTdHlsZUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRFU3R5bGVIYW5kbGUgX3J2OwogI2lmbmRlZiBURUdldFN0eWxlSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVHZXRTdHlsZUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0U3R5bGVIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0U3R5bGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IG9mZnNldDsKLQlUZXh0U3R5bGUgdGhlU3R5bGU7Ci0Jc2hvcnQgbGluZUhlaWdodDsKLQlzaG9ydCBmb250QXNjZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBvZmZzZXQ7CisgICAgVGV4dFN0eWxlIHRoZVN0eWxlOworICAgIHNob3J0IGxpbmVIZWlnaHQ7CisgICAgc2hvcnQgZm9udEFzY2VudDsKICNpZm5kZWYgVEVHZXRTdHlsZQotCVB5TWFjX1BSRUNIRUNLKFRFR2V0U3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFR2V0U3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlURUdldFN0eWxlKG9mZnNldCwKLQkgICAgICAgICAgICZ0aGVTdHlsZSwKLQkgICAgICAgICAgICZsaW5lSGVpZ2h0LAotCSAgICAgICAgICAgJmZvbnRBc2NlbnQsCi0JICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX05ldywgJnRoZVN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgZm9udEFzY2VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURUdldFN0eWxlKG9mZnNldCwKKyAgICAgICAgICAgICAgICZ0aGVTdHlsZSwKKyAgICAgICAgICAgICAgICZsaW5lSGVpZ2h0LAorICAgICAgICAgICAgICAgJmZvbnRBc2NlbnQsCisgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX05ldywgJnRoZVN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9udEFzY2VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTdHlsZVBhc3RlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFU3R5bGVQYXN0ZQotCVB5TWFjX1BSRUNIRUNLKFRFU3R5bGVQYXN0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTdHlsZVBhc3RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURVN0eWxlUGFzdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVN0eWxlUGFzdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU2V0U3R5bGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IG1vZGU7Ci0JVGV4dFN0eWxlIG5ld1N0eWxlOwotCUJvb2xlYW4gZlJlZHJhdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbW9kZTsKKyAgICBUZXh0U3R5bGUgbmV3U3R5bGU7CisgICAgQm9vbGVhbiBmUmVkcmF3OwogI2lmbmRlZiBURVNldFN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVTZXRTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTZXRTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmbmV3U3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmUmVkcmF3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVTZXRTdHlsZShtb2RlLAotCSAgICAgICAgICAgJm5ld1N0eWxlLAotCSAgICAgICAgICAgZlJlZHJhdywKLQkgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmbmV3U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmUmVkcmF3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZXRTdHlsZShtb2RlLAorICAgICAgICAgICAgICAgJm5ld1N0eWxlLAorICAgICAgICAgICAgICAgZlJlZHJhdywKKyAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVJlcGxhY2VTdHlsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbW9kZTsKLQlUZXh0U3R5bGUgb2xkU3R5bGU7Ci0JVGV4dFN0eWxlIG5ld1N0eWxlOwotCUJvb2xlYW4gZlJlZHJhdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbW9kZTsKKyAgICBUZXh0U3R5bGUgb2xkU3R5bGU7CisgICAgVGV4dFN0eWxlIG5ld1N0eWxlOworICAgIEJvb2xlYW4gZlJlZHJhdzsKICNpZm5kZWYgVEVSZXBsYWNlU3R5bGUKLQlQeU1hY19QUkVDSEVDSyhURVJlcGxhY2VTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVSZXBsYWNlU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmb2xkU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmbmV3U3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmUmVkcmF3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVSZXBsYWNlU3R5bGUobW9kZSwKLQkgICAgICAgICAgICAgICAmb2xkU3R5bGUsCi0JICAgICAgICAgICAgICAgJm5ld1N0eWxlLAotCSAgICAgICAgICAgICAgIGZSZWRyYXcsCi0JICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0U3R5bGVfQ29udmVydCwgJm9sZFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0U3R5bGVfQ29udmVydCwgJm5ld1N0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlJlZHJhdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFUmVwbGFjZVN0eWxlKG1vZGUsCisgICAgICAgICAgICAgICAgICAgJm9sZFN0eWxlLAorICAgICAgICAgICAgICAgICAgICZuZXdTdHlsZSwKKyAgICAgICAgICAgICAgICAgICBmUmVkcmF3LAorICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUdldFN0eWxlU2NyYXBIYW5kbGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0U2NycEhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0U2NycEhhbmRsZSBfcnY7CiAjaWZuZGVmIFRFR2V0U3R5bGVTY3JhcEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFRFR2V0U3R5bGVTY3JhcEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZVNjcmFwSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFN0eWxlU2NyYXBIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURUdldFN0eWxlU2NyYXBIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU3R5bGVJbnNlcnQoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKnRleHRfX2luX187Ci0JbG9uZyB0ZXh0X19sZW5fXzsKLQlpbnQgdGV4dF9faW5fbGVuX187Ci0JU3RTY3JwSGFuZGxlIGhTVDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqdGV4dF9faW5fXzsKKyAgICBsb25nIHRleHRfX2xlbl9fOworICAgIGludCB0ZXh0X19pbl9sZW5fXzsKKyAgICBTdFNjcnBIYW5kbGUgaFNUOwogI2lmbmRlZiBURVN0eWxlSW5zZXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soVEVTdHlsZUluc2VydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTdHlsZUluc2VydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI08mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRfX2luX18sICZ0ZXh0X19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoU1QpKQotCQlyZXR1cm4gTlVMTDsKLQl0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOwotCVRFU3R5bGVJbnNlcnQodGV4dF9faW5fXywgdGV4dF9fbGVuX18sCi0JICAgICAgICAgICAgICBoU1QsCi0JICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X19pbl9fLCAmdGV4dF9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaFNUKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdGV4dF9fbGVuX18gPSB0ZXh0X19pbl9sZW5fXzsKKyAgICBURVN0eWxlSW5zZXJ0KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgaFNULAorICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0SGVpZ2h0KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlsb25nIGVuZExpbmU7Ci0JbG9uZyBzdGFydExpbmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIGxvbmcgZW5kTGluZTsKKyAgICBsb25nIHN0YXJ0TGluZTsKICNpZm5kZWYgVEVHZXRIZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhURUdldEhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5kTGluZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0TGluZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFR2V0SGVpZ2h0KGVuZExpbmUsCi0JICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lLAotCSAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuZExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydExpbmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURUdldEhlaWdodChlbmRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUNvbnRpbnVvdXNTdHlsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0Jc2hvcnQgbW9kZTsKLQlUZXh0U3R5bGUgYVN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBzaG9ydCBtb2RlOworICAgIFRleHRTdHlsZSBhU3R5bGU7CiAjaWZuZGVmIFRFQ29udGludW91c1N0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVDb250aW51b3VzU3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFQ29udGludW91c1N0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBUZXh0U3R5bGVfQ29udmVydCwgJmFTdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFQ29udGludW91c1N0eWxlKCZtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZhU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9OZXcsICZhU3R5bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0U3R5bGVfQ29udmVydCwgJmFTdHlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFQ29udGludW91c1N0eWxlKCZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9OZXcsICZhU3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFVXNlU3R5bGVTY3JhcChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyByYW5nZVN0YXJ0OwotCWxvbmcgcmFuZ2VFbmQ7Ci0JU3RTY3JwSGFuZGxlIG5ld1N0eWxlczsKLQlCb29sZWFuIGZSZWRyYXc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgcmFuZ2VTdGFydDsKKyAgICBsb25nIHJhbmdlRW5kOworICAgIFN0U2NycEhhbmRsZSBuZXdTdHlsZXM7CisgICAgQm9vbGVhbiBmUmVkcmF3OwogI2lmbmRlZiBURVVzZVN0eWxlU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhURVVzZVN0eWxlU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRFVXNlU3R5bGVTY3JhcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyYW5nZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VFbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbmV3U3R5bGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZlJlZHJhdykpCi0JCXJldHVybiBOVUxMOwotCVRFVXNlU3R5bGVTY3JhcChyYW5nZVN0YXJ0LAotCSAgICAgICAgICAgICAgICByYW5nZUVuZCwKLQkgICAgICAgICAgICAgICAgbmV3U3R5bGVzLAotCSAgICAgICAgICAgICAgICBmUmVkcmF3LAotCSAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm5ld1N0eWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZSZWRyYXcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVVzZVN0eWxlU2NyYXAocmFuZ2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2VFbmQsCisgICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlcywKKyAgICAgICAgICAgICAgICAgICAgZlJlZHJhdywKKyAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFTnVtU3R5bGVzKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlsb25nIHJhbmdlU3RhcnQ7Ci0JbG9uZyByYW5nZUVuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgbG9uZyByYW5nZVN0YXJ0OworICAgIGxvbmcgcmFuZ2VFbmQ7CiAjaWZuZGVmIFRFTnVtU3R5bGVzCi0JUHlNYWNfUFJFQ0hFQ0soVEVOdW1TdHlsZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFTnVtU3R5bGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZyYW5nZUVuZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFTnVtU3R5bGVzKHJhbmdlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgcmFuZ2VFbmQsCi0JICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlRW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVOdW1TdHlsZXMocmFuZ2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICByYW5nZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUZlYXR1cmVGbGFnKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0Jc2hvcnQgZmVhdHVyZTsKLQlzaG9ydCBhY3Rpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBzaG9ydCBmZWF0dXJlOworICAgIHNob3J0IGFjdGlvbjsKICNpZm5kZWYgVEVGZWF0dXJlRmxhZwotCVB5TWFjX1BSRUNIRUNLKFRFRmVhdHVyZUZsYWcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFRmVhdHVyZUZsYWcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFRmVhdHVyZUZsYWcoZmVhdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZlYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURUZlYXR1cmVGbGFnKGZlYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUdldEhpbGl0ZVJnbihURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgcmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJnbkhhbmRsZSByZWdpb247CiAjaWZuZGVmIFRFR2V0SGlsaXRlUmduCi0JUHlNYWNfUFJFQ0hFQ0soVEVHZXRIaWxpdGVSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFRFR2V0SGlsaXRlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVEVHZXRIaWxpdGVSZ24ocmVnaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRFR2V0SGlsaXRlUmduKHJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfYXNfUmVzb3VyY2UoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIGFzX1Jlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soYXNfUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKGFzX1Jlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBhc19SZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFRFT2JqX21ldGhvZHNbXSA9IHsKLQl7IlRFU2V0VGV4dCIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFRleHQsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0KSAtPiBOb25lIil9LAotCXsiVEVHZXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ2hhcnNIYW5kbGUgX3J2KSIpfSwKLQl7IlRFSWRsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUlkbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRFU2V0U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2V0U2VsZWN0LCAxLAotCSBQeURvY19TVFIoIihsb25nIHNlbFN0YXJ0LCBsb25nIHNlbEVuZCkgLT4gTm9uZSIpfSwKLQl7IlRFQWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVBY3RpdmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVEZWFjdGl2YXRlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFRGVhY3RpdmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVLZXkiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVLZXksIDEsCi0JIFB5RG9jX1NUUigiKENoYXJQYXJhbWV0ZXIga2V5KSAtPiBOb25lIil9LAotCXsiVEVDdXQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDdXQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRFQ29weSIsIChQeUNGdW5jdGlvbilURU9ial9URUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRFUGFzdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVQYXN0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVEZWxldGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVEZWxldGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRFSW5zZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFSW5zZXJ0LCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgdGV4dCkgLT4gTm9uZSIpfSwKLQl7IlRFU2V0QWxpZ25tZW50IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2V0QWxpZ25tZW50LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBqdXN0KSAtPiBOb25lIil9LAotCXsiVEVVcGRhdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVVcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgclVwZGF0ZSkgLT4gTm9uZSIpfSwKLQl7IlRFU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJURVNlbFZpZXciLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZWxWaWV3LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURVBpblNjcm9sbCIsIChQeUNGdW5jdGlvbilURU9ial9URVBpblNjcm9sbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAotCXsiVEVBdXRvVmlldyIsIChQeUNGdW5jdGlvbilURU9ial9URUF1dG9WaWV3LCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGZBdXRvKSAtPiBOb25lIil9LAotCXsiVEVDYWxUZXh0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQ2FsVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVHZXRPZmZzZXQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRPZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0KSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlRFR2V0UG9pbnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRQb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgb2Zmc2V0KSAtPiAoUG9pbnQgX3J2KSIpfSwKLQl7IlRFQ2xpY2siLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDbGljaywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIEJvb2xlYW4gZkV4dGVuZCkgLT4gTm9uZSIpfSwKLQl7IlRFU2V0U3R5bGVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRTdHlsZUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVEVTdHlsZUhhbmRsZSB0aGVIYW5kbGUpIC0+IE5vbmUiKX0sCi0JeyJURUdldFN0eWxlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0U3R5bGVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRFU3R5bGVIYW5kbGUgX3J2KSIpfSwKLQl7IlRFR2V0U3R5bGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgb2Zmc2V0KSAtPiAoVGV4dFN0eWxlIHRoZVN0eWxlLCBzaG9ydCBsaW5lSGVpZ2h0LCBzaG9ydCBmb250QXNjZW50KSIpfSwKLQl7IlRFU3R5bGVQYXN0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVN0eWxlUGFzdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRFU2V0U3R5bGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSwgVGV4dFN0eWxlIG5ld1N0eWxlLCBCb29sZWFuIGZSZWRyYXcpIC0+IE5vbmUiKX0sCi0JeyJURVJlcGxhY2VTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVJlcGxhY2VTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSwgVGV4dFN0eWxlIG9sZFN0eWxlLCBUZXh0U3R5bGUgbmV3U3R5bGUsIEJvb2xlYW4gZlJlZHJhdykgLT4gTm9uZSIpfSwKLQl7IlRFR2V0U3R5bGVTY3JhcEhhbmRsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFN0eWxlU2NyYXBIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFN0U2NycEhhbmRsZSBfcnYpIil9LAotCXsiVEVTdHlsZUluc2VydCIsIChQeUNGdW5jdGlvbilURU9ial9URVN0eWxlSW5zZXJ0LCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgdGV4dCwgU3RTY3JwSGFuZGxlIGhTVCkgLT4gTm9uZSIpfSwKLQl7IlRFR2V0SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0SGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIihsb25nIGVuZExpbmUsIGxvbmcgc3RhcnRMaW5lKSAtPiAobG9uZyBfcnYpIil9LAotCXsiVEVDb250aW51b3VzU3R5bGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDb250aW51b3VzU3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1vZGUsIFRleHRTdHlsZSBhU3R5bGUpIC0+IChCb29sZWFuIF9ydiwgc2hvcnQgbW9kZSwgVGV4dFN0eWxlIGFTdHlsZSkiKX0sCi0JeyJURVVzZVN0eWxlU2NyYXAiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVVc2VTdHlsZVNjcmFwLCAxLAotCSBQeURvY19TVFIoIihsb25nIHJhbmdlU3RhcnQsIGxvbmcgcmFuZ2VFbmQsIFN0U2NycEhhbmRsZSBuZXdTdHlsZXMsIEJvb2xlYW4gZlJlZHJhdykgLT4gTm9uZSIpfSwKLQl7IlRFTnVtU3R5bGVzIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFTnVtU3R5bGVzLCAxLAotCSBQeURvY19TVFIoIihsb25nIHJhbmdlU3RhcnQsIGxvbmcgcmFuZ2VFbmQpIC0+IChsb25nIF9ydikiKX0sCi0JeyJURUZlYXR1cmVGbGFnIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFRmVhdHVyZUZsYWcsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZlYXR1cmUsIHNob3J0IGFjdGlvbikgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJURUdldEhpbGl0ZVJnbiIsIChQeUNGdW5jdGlvbilURU9ial9URUdldEhpbGl0ZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKLQl7ImFzX1Jlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX2FzX1Jlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlRFU2V0VGV4dCIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0KSAtPiBOb25lIil9LAorICAgIHsiVEVHZXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ2hhcnNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlRFSWRsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUlkbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFU2V0U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2V0U2VsZWN0LCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHNlbFN0YXJ0LCBsb25nIHNlbEVuZCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFQWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVBY3RpdmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVEZWFjdGl2YXRlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFRGVhY3RpdmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVLZXkiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKENoYXJQYXJhbWV0ZXIga2V5KSAtPiBOb25lIil9LAorICAgIHsiVEVDdXQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFQ29weSIsIChQeUNGdW5jdGlvbilURU9ial9URUNvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFUGFzdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVQYXN0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVEZWxldGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVEZWxldGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFSW5zZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFSW5zZXJ0LCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgdGV4dCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFU2V0QWxpZ25tZW50IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2V0QWxpZ25tZW50LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBqdXN0KSAtPiBOb25lIil9LAorICAgIHsiVEVVcGRhdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVVcGRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgclVwZGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlRFU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJURVNlbFZpZXciLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZWxWaWV3LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURVBpblNjcm9sbCIsIChQeUNGdW5jdGlvbilURU9ial9URVBpblNjcm9sbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAorICAgIHsiVEVBdXRvVmlldyIsIChQeUNGdW5jdGlvbilURU9ial9URUF1dG9WaWV3LCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGZBdXRvKSAtPiBOb25lIil9LAorICAgIHsiVEVDYWxUZXh0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQ2FsVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVHZXRPZmZzZXQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRPZmZzZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHB0KSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlRFR2V0UG9pbnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgb2Zmc2V0KSAtPiAoUG9pbnQgX3J2KSIpfSwKKyAgICB7IlRFQ2xpY2siLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDbGljaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIEJvb2xlYW4gZkV4dGVuZCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFU2V0U3R5bGVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRTdHlsZUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVEVTdHlsZUhhbmRsZSB0aGVIYW5kbGUpIC0+IE5vbmUiKX0sCisgICAgeyJURUdldFN0eWxlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0U3R5bGVIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRFU3R5bGVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlRFR2V0U3R5bGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgb2Zmc2V0KSAtPiAoVGV4dFN0eWxlIHRoZVN0eWxlLCBzaG9ydCBsaW5lSGVpZ2h0LCBzaG9ydCBmb250QXNjZW50KSIpfSwKKyAgICB7IlRFU3R5bGVQYXN0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVN0eWxlUGFzdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFU2V0U3R5bGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSwgVGV4dFN0eWxlIG5ld1N0eWxlLCBCb29sZWFuIGZSZWRyYXcpIC0+IE5vbmUiKX0sCisgICAgeyJURVJlcGxhY2VTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVJlcGxhY2VTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSwgVGV4dFN0eWxlIG9sZFN0eWxlLCBUZXh0U3R5bGUgbmV3U3R5bGUsIEJvb2xlYW4gZlJlZHJhdykgLT4gTm9uZSIpfSwKKyAgICB7IlRFR2V0U3R5bGVTY3JhcEhhbmRsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFN0eWxlU2NyYXBIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFN0U2NycEhhbmRsZSBfcnYpIil9LAorICAgIHsiVEVTdHlsZUluc2VydCIsIChQeUNGdW5jdGlvbilURU9ial9URVN0eWxlSW5zZXJ0LCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgdGV4dCwgU3RTY3JwSGFuZGxlIGhTVCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFR2V0SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0SGVpZ2h0LCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGVuZExpbmUsIGxvbmcgc3RhcnRMaW5lKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiVEVDb250aW51b3VzU3R5bGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDb250aW51b3VzU3R5bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IG1vZGUsIFRleHRTdHlsZSBhU3R5bGUpIC0+IChCb29sZWFuIF9ydiwgc2hvcnQgbW9kZSwgVGV4dFN0eWxlIGFTdHlsZSkiKX0sCisgICAgeyJURVVzZVN0eWxlU2NyYXAiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVVc2VTdHlsZVNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHJhbmdlU3RhcnQsIGxvbmcgcmFuZ2VFbmQsIFN0U2NycEhhbmRsZSBuZXdTdHlsZXMsIEJvb2xlYW4gZlJlZHJhdykgLT4gTm9uZSIpfSwKKyAgICB7IlRFTnVtU3R5bGVzIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFTnVtU3R5bGVzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHJhbmdlU3RhcnQsIGxvbmcgcmFuZ2VFbmQpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJURUZlYXR1cmVGbGFnIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFRmVhdHVyZUZsYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGZlYXR1cmUsIHNob3J0IGFjdGlvbikgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJURUdldEhpbGl0ZVJnbiIsIChQeUNGdW5jdGlvbilURU9ial9URUdldEhpbGl0ZVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7ImFzX1Jlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX2FzX1Jlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X2Rlc3RSZWN0KFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJigqc2VsZi0+b2JfaXRzZWxmKS0+ZGVzdFJlY3QpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJigqc2VsZi0+b2JfaXRzZWxmKS0+ZGVzdFJlY3QpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF9kZXN0UmVjdCBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X3ZpZXdSZWN0KFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJigqc2VsZi0+b2JfaXRzZWxmKS0+dmlld1JlY3QpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJigqc2VsZi0+b2JfaXRzZWxmKS0+dmlld1JlY3QpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF92aWV3UmVjdCBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X3NlbFJlY3QoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxSZWN0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICYoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFJlY3QpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF9zZWxSZWN0IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfbGluZUhlaWdodChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bGluZUhlaWdodCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmxpbmVIZWlnaHQpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF9saW5lSGVpZ2h0IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfZm9udEFzY2VudChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+Zm9udEFzY2VudCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmZvbnRBc2NlbnQpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF9mb250QXNjZW50IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfc2VsUG9pbnQoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRQb2ludCwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxQb2ludCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRQb2ludCwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxQb2ludCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3NlbFBvaW50IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfc2VsU3RhcnQoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFN0YXJ0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+c2VsU3RhcnQpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF9zZWxTdGFydCBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X3NlbEVuZChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+c2VsRW5kKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+c2VsRW5kKTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfc2VsRW5kIE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfYWN0aXZlKFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5hY3RpdmUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5hY3RpdmUpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF9hY3RpdmUgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9qdXN0KFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5qdXN0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+anVzdCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2p1c3QgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF90ZUxlbmd0aChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dGVMZW5ndGgpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50ZUxlbmd0aCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3RlTGVuZ3RoIE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfdHhGb250KFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eEZvbnQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eEZvbnQpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF90eEZvbnQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF90eEZhY2UoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4RmFjZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4RmFjZSk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3R4RmFjZSBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X3R4TW9kZShURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhNb2RlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhNb2RlKTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfdHhNb2RlIE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfdHhTaXplKFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eFNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eFNpemUpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF90eFNpemUgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9uTGluZXMoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPm5MaW5lcyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPm5MaW5lcyk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X25MaW5lcyBOVUxMCiAKIHN0YXRpYyBQeUdldFNldERlZiBURU9ial9nZXRzZXRsaXN0W10gPSB7Ci0JeyJkZXN0UmVjdCIsIChnZXR0ZXIpVEVPYmpfZ2V0X2Rlc3RSZWN0LCAoc2V0dGVyKVRFT2JqX3NldF9kZXN0UmVjdCwgIkRlc3RpbmF0aW9uIHJlY3RhbmdsZSJ9LAotCXsidmlld1JlY3QiLCAoZ2V0dGVyKVRFT2JqX2dldF92aWV3UmVjdCwgKHNldHRlcilURU9ial9zZXRfdmlld1JlY3QsICJWaWV3aW5nIHJlY3RhbmdsZSJ9LAotCXsic2VsUmVjdCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbFJlY3QsIChzZXR0ZXIpVEVPYmpfc2V0X3NlbFJlY3QsICJTZWxlY3Rpb24gcmVjdGFuZ2xlIn0sCi0JeyJsaW5lSGVpZ2h0IiwgKGdldHRlcilURU9ial9nZXRfbGluZUhlaWdodCwgKHNldHRlcilURU9ial9zZXRfbGluZUhlaWdodCwgIkhlaWdodCBvZiBhIGxpbmUifSwKLQl7ImZvbnRBc2NlbnQiLCAoZ2V0dGVyKVRFT2JqX2dldF9mb250QXNjZW50LCAoc2V0dGVyKVRFT2JqX3NldF9mb250QXNjZW50LCAiQXNjZW50IG9mIGEgbGluZSJ9LAotCXsic2VsUG9pbnQiLCAoZ2V0dGVyKVRFT2JqX2dldF9zZWxQb2ludCwgKHNldHRlcilURU9ial9zZXRfc2VsUG9pbnQsICJTZWxlY3Rpb24gUG9pbnQifSwKLQl7InNlbFN0YXJ0IiwgKGdldHRlcilURU9ial9nZXRfc2VsU3RhcnQsIChzZXR0ZXIpVEVPYmpfc2V0X3NlbFN0YXJ0LCAiU3RhcnQgb2Ygc2VsZWN0aW9uIn0sCi0JeyJzZWxFbmQiLCAoZ2V0dGVyKVRFT2JqX2dldF9zZWxFbmQsIChzZXR0ZXIpVEVPYmpfc2V0X3NlbEVuZCwgIkVuZCBvZiBzZWxlY3Rpb24ifSwKLQl7ImFjdGl2ZSIsIChnZXR0ZXIpVEVPYmpfZ2V0X2FjdGl2ZSwgKHNldHRlcilURU9ial9zZXRfYWN0aXZlLCAiVEJEIn0sCi0JeyJqdXN0IiwgKGdldHRlcilURU9ial9nZXRfanVzdCwgKHNldHRlcilURU9ial9zZXRfanVzdCwgIkp1c3RpZmljYXRpb24ifSwKLQl7InRlTGVuZ3RoIiwgKGdldHRlcilURU9ial9nZXRfdGVMZW5ndGgsIChzZXR0ZXIpVEVPYmpfc2V0X3RlTGVuZ3RoLCAiVEJEIn0sCi0JeyJ0eEZvbnQiLCAoZ2V0dGVyKVRFT2JqX2dldF90eEZvbnQsIChzZXR0ZXIpVEVPYmpfc2V0X3R4Rm9udCwgIkN1cnJlbnQgZm9udCJ9LAotCXsidHhGYWNlIiwgKGdldHRlcilURU9ial9nZXRfdHhGYWNlLCAoc2V0dGVyKVRFT2JqX3NldF90eEZhY2UsICJDdXJyZW50IGZvbnQgdmFyaWFudCJ9LAotCXsidHhNb2RlIiwgKGdldHRlcilURU9ial9nZXRfdHhNb2RlLCAoc2V0dGVyKVRFT2JqX3NldF90eE1vZGUsICJDdXJyZW50IHRleHQtZHJhd2luZyBtb2RlIn0sCi0JeyJ0eFNpemUiLCAoZ2V0dGVyKVRFT2JqX2dldF90eFNpemUsIChzZXR0ZXIpVEVPYmpfc2V0X3R4U2l6ZSwgIkN1cnJlbnQgZm9udCBzaXplIn0sCi0JeyJuTGluZXMiLCAoZ2V0dGVyKVRFT2JqX2dldF9uTGluZXMsIChzZXR0ZXIpVEVPYmpfc2V0X25MaW5lcywgIlRCRCJ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7ImRlc3RSZWN0IiwgKGdldHRlcilURU9ial9nZXRfZGVzdFJlY3QsIChzZXR0ZXIpVEVPYmpfc2V0X2Rlc3RSZWN0LCAiRGVzdGluYXRpb24gcmVjdGFuZ2xlIn0sCisgICAgeyJ2aWV3UmVjdCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3ZpZXdSZWN0LCAoc2V0dGVyKVRFT2JqX3NldF92aWV3UmVjdCwgIlZpZXdpbmcgcmVjdGFuZ2xlIn0sCisgICAgeyJzZWxSZWN0IiwgKGdldHRlcilURU9ial9nZXRfc2VsUmVjdCwgKHNldHRlcilURU9ial9zZXRfc2VsUmVjdCwgIlNlbGVjdGlvbiByZWN0YW5nbGUifSwKKyAgICB7ImxpbmVIZWlnaHQiLCAoZ2V0dGVyKVRFT2JqX2dldF9saW5lSGVpZ2h0LCAoc2V0dGVyKVRFT2JqX3NldF9saW5lSGVpZ2h0LCAiSGVpZ2h0IG9mIGEgbGluZSJ9LAorICAgIHsiZm9udEFzY2VudCIsIChnZXR0ZXIpVEVPYmpfZ2V0X2ZvbnRBc2NlbnQsIChzZXR0ZXIpVEVPYmpfc2V0X2ZvbnRBc2NlbnQsICJBc2NlbnQgb2YgYSBsaW5lIn0sCisgICAgeyJzZWxQb2ludCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbFBvaW50LCAoc2V0dGVyKVRFT2JqX3NldF9zZWxQb2ludCwgIlNlbGVjdGlvbiBQb2ludCJ9LAorICAgIHsic2VsU3RhcnQiLCAoZ2V0dGVyKVRFT2JqX2dldF9zZWxTdGFydCwgKHNldHRlcilURU9ial9zZXRfc2VsU3RhcnQsICJTdGFydCBvZiBzZWxlY3Rpb24ifSwKKyAgICB7InNlbEVuZCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbEVuZCwgKHNldHRlcilURU9ial9zZXRfc2VsRW5kLCAiRW5kIG9mIHNlbGVjdGlvbiJ9LAorICAgIHsiYWN0aXZlIiwgKGdldHRlcilURU9ial9nZXRfYWN0aXZlLCAoc2V0dGVyKVRFT2JqX3NldF9hY3RpdmUsICJUQkQifSwKKyAgICB7Imp1c3QiLCAoZ2V0dGVyKVRFT2JqX2dldF9qdXN0LCAoc2V0dGVyKVRFT2JqX3NldF9qdXN0LCAiSnVzdGlmaWNhdGlvbiJ9LAorICAgIHsidGVMZW5ndGgiLCAoZ2V0dGVyKVRFT2JqX2dldF90ZUxlbmd0aCwgKHNldHRlcilURU9ial9zZXRfdGVMZW5ndGgsICJUQkQifSwKKyAgICB7InR4Rm9udCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4Rm9udCwgKHNldHRlcilURU9ial9zZXRfdHhGb250LCAiQ3VycmVudCBmb250In0sCisgICAgeyJ0eEZhY2UiLCAoZ2V0dGVyKVRFT2JqX2dldF90eEZhY2UsIChzZXR0ZXIpVEVPYmpfc2V0X3R4RmFjZSwgIkN1cnJlbnQgZm9udCB2YXJpYW50In0sCisgICAgeyJ0eE1vZGUiLCAoZ2V0dGVyKVRFT2JqX2dldF90eE1vZGUsIChzZXR0ZXIpVEVPYmpfc2V0X3R4TW9kZSwgIkN1cnJlbnQgdGV4dC1kcmF3aW5nIG1vZGUifSwKKyAgICB7InR4U2l6ZSIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4U2l6ZSwgKHNldHRlcilURU9ial9zZXRfdHhTaXplLCAiQ3VycmVudCBmb250IHNpemUifSwKKyAgICB7Im5MaW5lcyIsIChnZXR0ZXIpVEVPYmpfZ2V0X25MaW5lcywgKHNldHRlcilURU9ial9zZXRfbkxpbmVzLCAiVEJEIn0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC05ODcsNjEgKzk4Nyw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlURUhhbmRsZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFRFSGFuZGxlIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRFT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoVEVPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVEVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChURU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBURU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBURV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9URS5URSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFRFT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgVEVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgVEVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFRFT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBURU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlURU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlURU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlURU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JVEVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVEVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlURU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1RFLlRFIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoVEVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBURU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBURU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgVEVPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFRFT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIFRFT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIFRFT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFRFT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBURU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBURU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFRFT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBURSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTA0OSwyNTcgKzEwNDksMjU3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVTY3JhcEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgVEVTY3JhcEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFRFU2NyYXBIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU2NyYXBIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFU2NyYXBIYW5kbGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFU2NyYXBIYW5kbGUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVHZXRTY3JhcExlbmd0aChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBURUdldFNjcmFwTGVuZ3RoCi0JUHlNYWNfUFJFQ0hFQ0soVEVHZXRTY3JhcExlbmd0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRTY3JhcExlbmd0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVHZXRTY3JhcExlbmd0aCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURUdldFNjcmFwTGVuZ3RoKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVOZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRFSGFuZGxlIF9ydjsKLQlSZWN0IGRlc3RSZWN0OwotCVJlY3Qgdmlld1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRFSGFuZGxlIF9ydjsKKyAgICBSZWN0IGRlc3RSZWN0OworICAgIFJlY3Qgdmlld1JlY3Q7CiAjaWZuZGVmIFRFTmV3Ci0JUHlNYWNfUFJFQ0hFQ0soVEVOZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFTmV3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZGVzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ2aWV3UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFTmV3KCZkZXN0UmVjdCwKLQkgICAgICAgICAgICAmdmlld1JlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVEVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZGVzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ2aWV3UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFTmV3KCZkZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAmdmlld1JlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVEVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFX1RFVGV4dEJveChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqdGV4dF9faW5fXzsKLQlsb25nIHRleHRfX2xlbl9fOwotCWludCB0ZXh0X19pbl9sZW5fXzsKLQlSZWN0IGJveDsKLQlzaG9ydCBqdXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICp0ZXh0X19pbl9fOworICAgIGxvbmcgdGV4dF9fbGVuX187CisgICAgaW50IHRleHRfX2luX2xlbl9fOworICAgIFJlY3QgYm94OworICAgIHNob3J0IGp1c3Q7CiAjaWZuZGVmIFRFVGV4dEJveAotCVB5TWFjX1BSRUNIRUNLKFRFVGV4dEJveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVUZXh0Qm94KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRfX2luX18sICZ0ZXh0X19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmp1c3QpKQotCQlyZXR1cm4gTlVMTDsKLQl0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOwotCVRFVGV4dEJveCh0ZXh0X19pbl9fLCB0ZXh0X19sZW5fXywKLQkgICAgICAgICAgJmJveCwKLQkgICAgICAgICAganVzdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRfX2luX18sICZ0ZXh0X19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmp1c3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOworICAgIFRFVGV4dEJveCh0ZXh0X19pbl9fLCB0ZXh0X19sZW5fXywKKyAgICAgICAgICAgICAgJmJveCwKKyAgICAgICAgICAgICAganVzdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFX1RFU3R5bGVOZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRFSGFuZGxlIF9ydjsKLQlSZWN0IGRlc3RSZWN0OwotCVJlY3Qgdmlld1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRFSGFuZGxlIF9ydjsKKyAgICBSZWN0IGRlc3RSZWN0OworICAgIFJlY3Qgdmlld1JlY3Q7CiAjaWZuZGVmIFRFU3R5bGVOZXcKLQlQeU1hY19QUkVDSEVDSyhURVN0eWxlTmV3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVN0eWxlTmV3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZGVzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ2aWV3UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFU3R5bGVOZXcoJmRlc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgJnZpZXdSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRFT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdmlld1JlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURVN0eWxlTmV3KCZkZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICZ2aWV3UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBURU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVTZXRTY3JhcExlbmd0aChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBsZW5ndGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbGVuZ3RoOwogI2lmbmRlZiBURVNldFNjcmFwTGVuZ3RoCi0JUHlNYWNfUFJFQ0hFQ0soVEVTZXRTY3JhcExlbmd0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTZXRTY3JhcExlbmd0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCVRFU2V0U2NyYXBMZW5ndGgobGVuZ3RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVNldFNjcmFwTGVuZ3RoKGxlbmd0aCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFX1RFRnJvbVNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBURUZyb21TY3JhcAotCVB5TWFjX1BSRUNIRUNLKFRFRnJvbVNjcmFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUZyb21TY3JhcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRFRnJvbVNjcmFwKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBURUZyb21TY3JhcCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFX1RFVG9TY3JhcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgVEVUb1NjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soVEVUb1NjcmFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVRvU2NyYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBURVRvU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRFVG9TY3JhcCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFX1RFR2V0U2NyYXBIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIFRFR2V0U2NyYXBIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhURUdldFNjcmFwSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldFNjcmFwSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFNjcmFwSGFuZGxlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURUdldFNjcmFwSGFuZGxlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFX1RFU2V0U2NyYXBIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIHZhbHVlOwogI2lmbmRlZiBURVNldFNjcmFwSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVTZXRTY3JhcEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTZXRTY3JhcEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlURVNldFNjcmFwSGFuZGxlKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZXRTY3JhcEhhbmRsZSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFX0xNR2V0V29yZFJlZHJhdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50OCBfcnY7CiAjaWZuZGVmIExNR2V0V29yZFJlZHJhdwotCVB5TWFjX1BSRUNIRUNLKExNR2V0V29yZFJlZHJhdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRXb3JkUmVkcmF3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldFdvcmRSZWRyYXcoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRXb3JkUmVkcmF3KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfTE1TZXRXb3JkUmVkcmF3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggdmFsdWU7CiAjaWZuZGVmIExNU2V0V29yZFJlZHJhdwotCVB5TWFjX1BSRUNIRUNLKExNU2V0V29yZFJlZHJhdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRXb3JkUmVkcmF3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldFdvcmRSZWRyYXcodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRXb3JkUmVkcmF3KHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfYXNfVEUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRFSGFuZGxlIF9ydjsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVIYW5kbGUgX3J2OworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBhc19URQotCVB5TWFjX1BSRUNIRUNLKGFzX1RFKTsKKyAgICBQeU1hY19QUkVDSEVDSyhhc19URSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX1RFKGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVEVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfVEUoaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBURU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIFRFX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IlRFU2NyYXBIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVfVEVTY3JhcEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJURUdldFNjcmFwTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFR2V0U2NyYXBMZW5ndGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IlRFTmV3IiwgKFB5Q0Z1bmN0aW9uKVRFX1RFTmV3LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGRlc3RSZWN0LCBSZWN0IHZpZXdSZWN0KSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKLQl7IlRFVGV4dEJveCIsIChQeUNGdW5jdGlvbilURV9URVRleHRCb3gsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0LCBSZWN0IGJveCwgc2hvcnQganVzdCkgLT4gTm9uZSIpfSwKLQl7IlRFU3R5bGVOZXciLCAoUHlDRnVuY3Rpb24pVEVfVEVTdHlsZU5ldywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBkZXN0UmVjdCwgUmVjdCB2aWV3UmVjdCkgLT4gKFRFSGFuZGxlIF9ydikiKX0sCi0JeyJURVNldFNjcmFwTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFU2V0U2NyYXBMZW5ndGgsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbGVuZ3RoKSAtPiBOb25lIil9LAotCXsiVEVGcm9tU2NyYXAiLCAoUHlDRnVuY3Rpb24pVEVfVEVGcm9tU2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRFVG9TY3JhcCIsIChQeUNGdW5jdGlvbilURV9URVRvU2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRFR2V0U2NyYXBIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVfVEVHZXRTY3JhcEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJURVNldFNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFU2V0U2NyYXBIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0V29yZFJlZHJhdyIsIChQeUNGdW5jdGlvbilURV9MTUdldFdvcmRSZWRyYXcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCi0JeyJMTVNldFdvcmRSZWRyYXciLCAoUHlDRnVuY3Rpb24pVEVfTE1TZXRXb3JkUmVkcmF3LCAxLAotCSBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7ImFzX1RFIiwgKFB5Q0Z1bmN0aW9uKVRFX2FzX1RFLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKFRFSGFuZGxlIF9ydikiKX0sCisgICAgeyJURVNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFU2NyYXBIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiVEVHZXRTY3JhcExlbmd0aCIsIChQeUNGdW5jdGlvbilURV9URUdldFNjcmFwTGVuZ3RoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJURU5ldyIsIChQeUNGdW5jdGlvbilURV9URU5ldywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBkZXN0UmVjdCwgUmVjdCB2aWV3UmVjdCkgLT4gKFRFSGFuZGxlIF9ydikiKX0sCisgICAgeyJURVRleHRCb3giLCAoUHlDRnVuY3Rpb24pVEVfVEVUZXh0Qm94LCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgdGV4dCwgUmVjdCBib3gsIHNob3J0IGp1c3QpIC0+IE5vbmUiKX0sCisgICAgeyJURVN0eWxlTmV3IiwgKFB5Q0Z1bmN0aW9uKVRFX1RFU3R5bGVOZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgZGVzdFJlY3QsIFJlY3Qgdmlld1JlY3QpIC0+IChURUhhbmRsZSBfcnYpIil9LAorICAgIHsiVEVTZXRTY3JhcExlbmd0aCIsIChQeUNGdW5jdGlvbilURV9URVNldFNjcmFwTGVuZ3RoLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGxlbmd0aCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFRnJvbVNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFRnJvbVNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURVRvU2NyYXAiLCAoUHlDRnVuY3Rpb24pVEVfVEVUb1NjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURUdldFNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFR2V0U2NyYXBIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiVEVTZXRTY3JhcEhhbmRsZSIsIChQeUNGdW5jdGlvbilURV9URVNldFNjcmFwSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldFdvcmRSZWRyYXciLCAoUHlDRnVuY3Rpb24pVEVfTE1HZXRXb3JkUmVkcmF3LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAorICAgIHsiTE1TZXRXb3JkUmVkcmF3IiwgKFB5Q0Z1bmN0aW9uKVRFX0xNU2V0V29yZFJlZHJhdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDggdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJhc19URSIsIChQeUNGdW5jdGlvbilURV9hc19URSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IChURUhhbmRsZSBfcnYpIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTEzMDcsMzEgKzEzMDcsMzEgQEAKIAogdm9pZCBpbml0X1RFKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhURUhhbmRsZSwgVEVPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChURUhhbmRsZSwgVEVPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRFSGFuZGxlLCBURU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoVEVIYW5kbGUsIFRFT2JqX0NvbnZlcnQpOwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfVEUiLCBURV9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1RFIiwgVEVfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JVEVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChURV9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFRFX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JVEVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlRFX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmVEVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJURSIsIChQeU9iamVjdCAqKSZURV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlRFX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVEVUeXBlIiwgKFB5T2JqZWN0ICopJlRFX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFRFX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoVEVfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBURV9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFRFX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZURV9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJlRFX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVEUiLCAoUHlPYmplY3QgKikmVEVfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZURV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRFVHlwZSIsIChQeU9iamVjdCAqKSZURV9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy93aW4vX1dpbm1vZHVsZS5jIGIvTWFjL01vZHVsZXMvd2luL19XaW5tb2R1bGUuYwppbmRleCA4N2Y3NTkxLi44OTIzM2VkIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy93aW4vX1dpbm1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3dpbi9fV2lubW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zNiw3ICszNiw3IEBACiBzdGF0aWMgdm9pZAogUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3coV2luZG93UHRyIHcpCiB7Ci0gICAgICAgIERpc3Bvc2VXaW5kb3codyk7CisgICAgRGlzcG9zZVdpbmRvdyh3KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRXJyb3I7CkBAIC00OCwyNTIyICs0OCwyNTIyIEBACiAjZGVmaW5lIFdpbk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZXaW5kb3dfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmV2luZG93X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBXaW5kb3dPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlXaW5kb3dQdHIgb2JfaXRzZWxmOwotCXZvaWQgKCpvYl9mcmVlaXQpKFdpbmRvd1B0ciBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBXaW5kb3dQdHIgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKFdpbmRvd1B0ciBwdHIpOwogfSBXaW5kb3dPYmplY3Q7CiAKIFB5T2JqZWN0ICpXaW5PYmpfTmV3KFdpbmRvd1B0ciBpdHNlbGYpCiB7Ci0JV2luZG93T2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIFdoaWNoV2luZG93IGNvZGUgaGVyZT8gKi8KLQlpdCA9IFB5T2JqZWN0X05FVyhXaW5kb3dPYmplY3QsICZXaW5kb3dfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IE5VTEw7Ci0JaWYgKEdldFdSZWZDb24oaXRzZWxmKSA9PSAwKQotCXsKLQkJU2V0V1JlZkNvbihpdHNlbGYsIChsb25nKWl0KTsKLQkJaXQtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlV2luZG93OwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgV2luZG93T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIFdoaWNoV2luZG93IGNvZGUgaGVyZT8gKi8KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhXaW5kb3dPYmplY3QsICZXaW5kb3dfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgaWYgKEdldFdSZWZDb24oaXRzZWxmKSA9PSAwKQorICAgIHsKKyAgICAgICAgU2V0V1JlZkNvbihpdHNlbGYsIChsb25nKWl0KTsKKyAgICAgICAgaXQtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlV2luZG93OworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBXaW5PYmpfQ29udmVydChQeU9iamVjdCAqdiwgV2luZG93UHRyICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQlpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKFdpbmRvd1B0cilQeUludF9Bc0xvbmcodik7IHJldHVybiAxOyB9CisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIGlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoV2luZG93UHRyKVB5SW50X0FzTG9uZyh2KTsgcmV0dXJuIDE7IH0KIAotCXsKLQkJRGlhbG9nUmVmIGRsZzsKLQkJaWYgKERsZ09ial9Db252ZXJ0KHYsICZkbGcpICYmIGRsZykgewotCQkJKnBfaXRzZWxmID0gR2V0RGlhbG9nV2luZG93KGRsZyk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlQeUVycl9DbGVhcigpOwotCX0KLQlpZiAoIVdpbk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJXaW5kb3cgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICB7CisgICAgICAgIERpYWxvZ1JlZiBkbGc7CisgICAgICAgIGlmIChEbGdPYmpfQ29udmVydCh2LCAmZGxnKSAmJiBkbGcpIHsKKyAgICAgICAgICAgICpwX2l0c2VsZiA9IEdldERpYWxvZ1dpbmRvdyhkbGcpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgaWYgKCFXaW5PYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiV2luZG93IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFdpbmRvd09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFdpbk9ial9kZWFsbG9jKFdpbmRvd09iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKLQl7Ci0JCVNldFdSZWZDb24oc2VsZi0+b2JfaXRzZWxmLCAwKTsKLQkJc2VsZi0+b2JfZnJlZWl0KHNlbGYtPm9iX2l0c2VsZik7Ci0JfQotCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0Jc2VsZi0+b2JfZnJlZWl0ID0gTlVMTDsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgU2V0V1JlZkNvbihzZWxmLT5vYl9pdHNlbGYsIDApOworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICB9CisgICAgc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICBzZWxmLT5vYl9mcmVlaXQgPSBOVUxMOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd093bmVyQ291bnQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBvdXRDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgb3V0Q291bnQ7CiAjaWZuZGVmIEdldFdpbmRvd093bmVyQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dPd25lckNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dPd25lckNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93T3duZXJDb3VudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Q291bnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93T3duZXJDb3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9DbG9uZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIENsb25lV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soQ2xvbmVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb25lV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xvbmVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbG9uZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93UmV0YWluQ291bnQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJdGVtQ291bnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJdGVtQ291bnQgX3J2OwogI2lmbmRlZiBHZXRXaW5kb3dSZXRhaW5Db3VudAotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1JldGFpbkNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dSZXRhaW5Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0V2luZG93UmV0YWluQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd1JldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9SZXRhaW5XaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBSZXRhaW5XaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhSZXRhaW5XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFJldGFpbldpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJldGFpbldpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJldGFpbldpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfUmVsZWFzZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJlbGVhc2VXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhSZWxlYXNlV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWxlYXNlV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVsZWFzZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbGVhc2VXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1Jlc2hhcGVDdXN0b21XaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBSZXNoYXBlQ3VzdG9tV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soUmVzaGFwZUN1c3RvbVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVzaGFwZUN1c3RvbVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlc2hhcGVDdXN0b21XaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXNoYXBlQ3VzdG9tV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dXaWRnZXRIaWxpdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd0RlZlBhcnRDb2RlIG91dEhpbGl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dEZWZQYXJ0Q29kZSBvdXRIaWxpdGU7CiAjaWZuZGVmIEdldFdpbmRvd1dpZGdldEhpbGl0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1dpZGdldEhpbGl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93V2lkZ2V0SGlsaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93V2lkZ2V0SGlsaXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGlsaXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRIaWxpdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93V2lkZ2V0SGlsaXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGlsaXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIaWxpdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dDbGFzcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93Q2xhc3Mgb3V0Q2xhc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93Q2xhc3Mgb3V0Q2xhc3M7CiAjaWZuZGVmIEdldFdpbmRvd0NsYXNzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q2xhc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0NsYXNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93Q2xhc3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm91dENsYXNzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRDbGFzcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dDbGFzcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q2xhc3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dENsYXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93QXR0cmlidXRlcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93QXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd0F0dHJpYnV0ZXMgb3V0QXR0cmlidXRlczsKICNpZm5kZWYgR2V0V2luZG93QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0F0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0F0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEF0dHJpYnV0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRBdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ2hhbmdlV2luZG93QXR0cmlidXRlcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93QXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXM7Ci0JV2luZG93QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlczsKKyAgICBXaW5kb3dBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzOwogI2lmbmRlZiBDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlV2luZG93QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlV2luZG93QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZXRUaGVzZUF0dHJpYnV0ZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZjbGVhclRoZXNlQXR0cmlidXRlcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGhlc2VBdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRUaGVzZUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGVhclRoZXNlQXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGhlc2VBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93Q2xhc3MoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKICNpZm5kZWYgU2V0V2luZG93Q2xhc3MKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dDbGFzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93Q2xhc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0NsYXNzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93Q2xhc3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XaW5kb3dDbGFzcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dDbGFzcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvd0NsYXNzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93TW9kYWxpdHkoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd01vZGFsaXR5IGluTW9kYWxLaW5kOwotCVdpbmRvd1B0ciBpblVuYXZhaWxhYmxlV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd01vZGFsaXR5IGluTW9kYWxLaW5kOworICAgIFdpbmRvd1B0ciBpblVuYXZhaWxhYmxlV2luZG93OwogI2lmbmRlZiBTZXRXaW5kb3dNb2RhbGl0eQotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd01vZGFsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dNb2RhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Nb2RhbEtpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5VbmF2YWlsYWJsZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dNb2RhbGl0eShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGFsS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5VbmF2YWlsYWJsZVdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTW9kYWxLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluVW5hdmFpbGFibGVXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93TW9kYWxpdHkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Nb2RhbEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVW5hdmFpbGFibGVXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dNb2RhbGl0eShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93TW9kYWxpdHkgb3V0TW9kYWxLaW5kOwotCVdpbmRvd1B0ciBvdXRVbmF2YWlsYWJsZVdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dNb2RhbGl0eSBvdXRNb2RhbEtpbmQ7CisgICAgV2luZG93UHRyIG91dFVuYXZhaWxhYmxlV2luZG93OwogI2lmbmRlZiBHZXRXaW5kb3dNb2RhbGl0eQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd01vZGFsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dNb2RhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd01vZGFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNb2RhbEtpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRVbmF2YWlsYWJsZVdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRNb2RhbEtpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBvdXRVbmF2YWlsYWJsZVdpbmRvdyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dNb2RhbGl0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TW9kYWxLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VW5hdmFpbGFibGVXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TW9kYWxLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgb3V0VW5hdmFpbGFibGVXaW5kb3cpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dDb250ZW50Q29sb3IoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJHQkNvbG9yIGNvbG9yOwogI2lmbmRlZiBTZXRXaW5kb3dDb250ZW50Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dDb250ZW50Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0NvbnRlbnRDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dDb250ZW50Q29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93Q29udGVudENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dDb250ZW50Q29sb3IoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJHQkNvbG9yIGNvbG9yOwogI2lmbmRlZiBHZXRXaW5kb3dDb250ZW50Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDb250ZW50Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0NvbnRlbnRDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0NvbnRlbnRDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93Q29udGVudENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0NvbnRlbnRQYXR0ZXJuKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQaXhQYXRIYW5kbGUgb3V0UGl4UGF0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFBpeFBhdEhhbmRsZSBvdXRQaXhQYXQ7CiAjaWZuZGVmIEdldFdpbmRvd0NvbnRlbnRQYXR0ZXJuCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q29udGVudFBhdHRlcm4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0NvbnRlbnRQYXR0ZXJuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRQaXhQYXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93Q29udGVudFBhdHRlcm4oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UGl4UGF0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0UGl4UGF0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd0NvbnRlbnRQYXR0ZXJuKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBpeFBhdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd0NvbnRlbnRQYXR0ZXJuKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQaXhQYXRIYW5kbGUgcGl4UGF0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFBpeFBhdEhhbmRsZSBwaXhQYXQ7CiAjaWZuZGVmIFNldFdpbmRvd0NvbnRlbnRQYXR0ZXJuCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93Q29udGVudFBhdHRlcm4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0NvbnRlbnRQYXR0ZXJuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhQYXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93Q29udGVudFBhdHRlcm4oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4UGF0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGl4UGF0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd0NvbnRlbnRQYXR0ZXJuKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeFBhdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1Njcm9sbFdpbmRvd1JlY3QoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5TY3JvbGxSZWN0OwotCVNJbnQxNiBpbkhQaXhlbHM7Ci0JU0ludDE2IGluVlBpeGVsczsKLQlTY3JvbGxXaW5kb3dPcHRpb25zIGluT3B0aW9uczsKLQlSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluU2Nyb2xsUmVjdDsKKyAgICBTSW50MTYgaW5IUGl4ZWxzOworICAgIFNJbnQxNiBpblZQaXhlbHM7CisgICAgU2Nyb2xsV2luZG93T3B0aW9ucyBpbk9wdGlvbnM7CisgICAgUmduSGFuZGxlIG91dEV4cG9zZWRSZ247CiAjaWZuZGVmIFNjcm9sbFdpbmRvd1JlY3QKLQlQeU1hY19QUkVDSEVDSyhTY3JvbGxXaW5kb3dSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTY3JvbGxXaW5kb3dSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5TY3JvbGxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5WUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5PcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm91dEV4cG9zZWRSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2Nyb2xsV2luZG93UmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpblNjcm9sbFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5IUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluVlBpeGVscywKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgb3V0RXhwb3NlZFJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblNjcm9sbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblZQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RXhwb3NlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTY3JvbGxXaW5kb3dSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2Nyb2xsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WUGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFeHBvc2VkUmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2Nyb2xsV2luZG93UmVnaW9uKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZ25IYW5kbGUgaW5TY3JvbGxSZ247Ci0JU0ludDE2IGluSFBpeGVsczsKLQlTSW50MTYgaW5WUGl4ZWxzOwotCVNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zOwotCVJnbkhhbmRsZSBvdXRFeHBvc2VkUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJnbkhhbmRsZSBpblNjcm9sbFJnbjsKKyAgICBTSW50MTYgaW5IUGl4ZWxzOworICAgIFNJbnQxNiBpblZQaXhlbHM7CisgICAgU2Nyb2xsV2luZG93T3B0aW9ucyBpbk9wdGlvbnM7CisgICAgUmduSGFuZGxlIG91dEV4cG9zZWRSZ247CiAjaWZuZGVmIFNjcm9sbFdpbmRvd1JlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFNjcm9sbFdpbmRvd1JlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2Nyb2xsV2luZG93UmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluU2Nyb2xsUmduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5WUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5PcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm91dEV4cG9zZWRSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2Nyb2xsV2luZG93UmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblNjcm9sbFJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluSFBpeGVscywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluVlBpeGVscywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEV4cG9zZWRSZ24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluU2Nyb2xsUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IUGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5WUGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm91dEV4cG9zZWRSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2Nyb2xsV2luZG93UmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNjcm9sbFJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSFBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVlBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEV4cG9zZWRSZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9DbGlwQWJvdmUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsaXBBYm92ZQotCVB5TWFjX1BSRUNIRUNLKENsaXBBYm92ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xpcEFib3ZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGlwQWJvdmUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbGlwQWJvdmUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9QYWludE9uZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBjbG9iYmVyZWRSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBjbG9iYmVyZWRSZ247CiAjaWZuZGVmIFBhaW50T25lCi0JUHlNYWNfUFJFQ0hFQ0soUGFpbnRPbmUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBhaW50T25lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbG9iYmVyZWRSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlQYWludE9uZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgIGNsb2JiZXJlZFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbG9iYmVyZWRSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQYWludE9uZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgIGNsb2JiZXJlZFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9QYWludEJlaGluZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBjbG9iYmVyZWRSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBjbG9iYmVyZWRSZ247CiAjaWZuZGVmIFBhaW50QmVoaW5kCi0JUHlNYWNfUFJFQ0hFQ0soUGFpbnRCZWhpbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBhaW50QmVoaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbG9iYmVyZWRSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlQYWludEJlaGluZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIGNsb2JiZXJlZFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbG9iYmVyZWRSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQYWludEJlaGluZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIGNsb2JiZXJlZFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9DYWxjVmlzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDYWxjVmlzCi0JUHlNYWNfUFJFQ0hFQ0soQ2FsY1Zpcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FsY1Zpcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2FsY1Zpcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENhbGNWaXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9DYWxjVmlzQmVoaW5kKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKICNpZm5kZWYgQ2FsY1Zpc0JlaGluZAotCVB5TWFjX1BSRUNIRUNLKENhbGNWaXNCZWhpbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKENhbGNWaXNCZWhpbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCUNhbGNWaXNCZWhpbmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGNsb2JiZXJlZFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbG9iYmVyZWRSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDYWxjVmlzQmVoaW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBjbG9iYmVyZWRSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQnJpbmdUb0Zyb250KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBCcmluZ1RvRnJvbnQKLQlQeU1hY19QUkVDSEVDSyhCcmluZ1RvRnJvbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEJyaW5nVG9Gcm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQnJpbmdUb0Zyb250KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQnJpbmdUb0Zyb250KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2VuZEJlaGluZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBiZWhpbmRXaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBiZWhpbmRXaW5kb3c7CiAjaWZuZGVmIFNlbmRCZWhpbmQKLQlQeU1hY19QUkVDSEVDSyhTZW5kQmVoaW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZW5kQmVoaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmRXaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlTZW5kQmVoaW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICBiZWhpbmRXaW5kb3cpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2VuZEJlaGluZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgYmVoaW5kV2luZG93KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NlbGVjdFdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2VsZWN0V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2VsZWN0V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZWxlY3RXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNlbGVjdFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNlbGVjdFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldE5leHRXaW5kb3dPZkNsYXNzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzOwotCUJvb2xlYW4gbXVzdEJlVmlzaWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKKyAgICBXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzOworICAgIEJvb2xlYW4gbXVzdEJlVmlzaWJsZTsKICNpZm5kZWYgR2V0TmV4dFdpbmRvd09mQ2xhc3MKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0V2luZG93T2ZDbGFzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFdpbmRvd09mQ2xhc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgJm11c3RCZVZpc2libGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0V2luZG93T2ZDbGFzcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdEJlVmlzaWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV2luZG93Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtdXN0QmVWaXNpYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dFdpbmRvd09mQ2xhc3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3RCZVZpc2libGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93QWx0ZXJuYXRlVGl0bGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGluVGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5UaXRsZTsKICNpZm5kZWYgU2V0V2luZG93QWx0ZXJuYXRlVGl0bGUKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dBbHRlcm5hdGVUaXRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93QWx0ZXJuYXRlVGl0bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5UaXRsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dBbHRlcm5hdGVUaXRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRpdGxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblRpdGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd0FsdGVybmF0ZVRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGl0bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Db3B5V2luZG93QWx0ZXJuYXRlVGl0bGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIG91dFRpdGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIG91dFRpdGxlOwogI2lmbmRlZiBDb3B5V2luZG93QWx0ZXJuYXRlVGl0bGUKLQlQeU1hY19QUkVDSEVDSyhDb3B5V2luZG93QWx0ZXJuYXRlVGl0bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRpdGxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRUaXRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5V2luZG93QWx0ZXJuYXRlVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUaXRsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0VGl0bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9IaWxpdGVXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGZIaWxpdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gZkhpbGl0ZTsKICNpZm5kZWYgSGlsaXRlV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soSGlsaXRlV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWxpdGVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmSGlsaXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlsaXRlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIGZIaWxpdGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZIaWxpdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWxpdGVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgZkhpbGl0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXUmVmQ29uKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGRhdGE7CiAjaWZuZGVmIFNldFdSZWZDb24KLQlQeU1hY19QUkVDSEVDSyhTZXRXUmVmQ29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXUmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpCi0JCXJldHVybiBOVUxMOwotCVNldFdSZWZDb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIGRhdGEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRXUmVmQ29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdSZWZDb24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldFdSZWZDb24KLQlQeU1hY19QUkVDSEVDSyhHZXRXUmVmQ29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXUmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXUmVmQ29uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRXUmVmQ29uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dQaWMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaWNIYW5kbGUgcGljOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaWNIYW5kbGUgcGljOwogI2lmbmRlZiBTZXRXaW5kb3dQaWMKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dQaWMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1BpYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGljKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0V2luZG93UGljKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIHBpYyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRXaW5kb3dQaWMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgcGljKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1BpYyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBfcnY7CiAjaWZuZGVmIEdldFdpbmRvd1BpYwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1BpYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UGljKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXaW5kb3dQaWMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRXaW5kb3dQaWMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXVmFyaWFudChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRXVmFyaWFudAotCVB5TWFjX1BSRUNIRUNLKEdldFdWYXJpYW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXVmFyaWFudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0V1ZhcmlhbnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdWYXJpYW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dGZWF0dXJlcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIG91dEZlYXR1cmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBvdXRGZWF0dXJlczsKICNpZm5kZWYgR2V0V2luZG93RmVhdHVyZXMKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dGZWF0dXJlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93RmVhdHVyZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dGZWF0dXJlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmVhdHVyZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZlYXR1cmVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd0ZlYXR1cmVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGZWF0dXJlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RmVhdHVyZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dSZWdpb24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlOwotCVJnbkhhbmRsZSBpb1dpblJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uQ29kZTsKKyAgICBSZ25IYW5kbGUgaW9XaW5SZ247CiAjaWZuZGVmIEdldFdpbmRvd1JlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1JlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZ2lvbkNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW9XaW5SZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93UmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvbkNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBpb1dpblJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVnaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpb1dpblJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvV2luUmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlV2lkdGhzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IG91dFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBvdXRSZWN0OwogI2lmbmRlZiBHZXRXaW5kb3dTdHJ1Y3R1cmVXaWR0aHMKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dTdHJ1Y3R1cmVXaWR0aHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0cnVjdHVyZVdpZHRocyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd1N0cnVjdHVyZVdpZHRocyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd1N0cnVjdHVyZVdpZHRocyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQmVnaW5VcGRhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEJlZ2luVXBkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soQmVnaW5VcGRhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEJlZ2luVXBkYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlCZWdpblVwZGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEJlZ2luVXBkYXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfRW5kVXBkYXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBFbmRVcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhFbmRVcGRhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuZFVwZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRW5kVXBkYXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRW5kVXBkYXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSW52YWxXaW5kb3dSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgSW52YWxXaW5kb3dSZ24KLQlQeU1hY19QUkVDSEVDSyhJbnZhbFdpbmRvd1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52YWxXaW5kb3dSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnZhbFdpbmRvd1Jnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW52YWxXaW5kb3dSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSW52YWxXaW5kb3dSZWN0KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgSW52YWxXaW5kb3dSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soSW52YWxXaW5kb3dSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZhbFdpbmRvd1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsV2luZG93UmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEludmFsV2luZG93UmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1ZhbGlkV2luZG93UmduKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZ25IYW5kbGUgcmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJnbkhhbmRsZSByZWdpb247CiAjaWZuZGVmIFZhbGlkV2luZG93UmduCi0JUHlNYWNfUFJFQ0hFQ0soVmFsaWRXaW5kb3dSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZhbGlkV2luZG93UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVmFsaWRXaW5kb3dSZ24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFZhbGlkV2luZG93UmduKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1ZhbGlkV2luZG93UmVjdChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIFZhbGlkV2luZG93UmVjdAotCVB5TWFjX1BSRUNIRUNLKFZhbGlkV2luZG93UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmFsaWRXaW5kb3dSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBWYWxpZFdpbmRvd1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBWYWxpZFdpbmRvd1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9EcmF3R3Jvd0ljb24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERyYXdHcm93SWNvbgotCVB5TWFjX1BSRUNIRUNLKERyYXdHcm93SWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd0dyb3dJY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmF3R3Jvd0ljb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmF3R3Jvd0ljb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXVGl0bGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgdGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSB0aXRsZTsKICNpZm5kZWYgU2V0V1RpdGxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V1RpdGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXVGl0bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0V1RpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgIHRpdGxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0V1RpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgIHRpdGxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdUaXRsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSB0aXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IHRpdGxlOwogI2lmbmRlZiBHZXRXVGl0bGUKLQlQeU1hY19QUkVDSEVDSyhHZXRXVGl0bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdUaXRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V1RpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgIHRpdGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0aXRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFdUaXRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICB0aXRsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgdGl0bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CiAjaWZuZGVmIFNldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIG91dFN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBvdXRTdHJpbmc7CiAjaWZuZGVmIENvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhDb3B5V2luZG93VGl0bGVBc0NGU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5V2luZG93VGl0bGVBc0NGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weVdpbmRvd1RpdGxlQXNDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFN0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5V2luZG93VGl0bGVBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93UHJveHlGU1NwZWMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTU3BlYyBpbkZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNTcGVjIGluRmlsZTsKICNpZm5kZWYgU2V0V2luZG93UHJveHlGU1NwZWMKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dQcm94eUZTU3BlYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlGU1NwZWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZpbkZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93UHJveHlGU1NwZWMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZpbkZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93UHJveHlGU1NwZWMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1Byb3h5RlNTcGVjKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1NwZWMgb3V0RmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1NwZWMgb3V0RmlsZTsKICNpZm5kZWYgR2V0V2luZG93UHJveHlGU1NwZWMKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQcm94eUZTU3BlYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UHJveHlGU1NwZWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dQcm94eUZTU3BlYyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNTcGVjLCAmb3V0RmlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dQcm94eUZTU3BlYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNTcGVjLCAmb3V0RmlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1Byb3h5QWxpYXMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUFsaWFzSGFuZGxlIGluQWxpYXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQWxpYXNIYW5kbGUgaW5BbGlhczsKICNpZm5kZWYgU2V0V2luZG93UHJveHlBbGlhcwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1Byb3h5QWxpYXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1Byb3h5QWxpYXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluQWxpYXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93UHJveHlBbGlhcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWxpYXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkFsaWFzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd1Byb3h5QWxpYXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkFsaWFzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93UHJveHlBbGlhcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQWxpYXNIYW5kbGUgYWxpYXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQWxpYXNIYW5kbGUgYWxpYXM7CiAjaWZuZGVmIEdldFdpbmRvd1Byb3h5QWxpYXMKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQcm94eUFsaWFzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQcm94eUFsaWFzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93UHJveHlBbGlhcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGFsaWFzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd1Byb3h5QWxpYXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpYXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBhbGlhcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1Byb3h5Q3JlYXRvckFuZFR5cGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBmaWxlQ3JlYXRvcjsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JU0ludDE2IHZSZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIGZpbGVDcmVhdG9yOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBTSW50MTYgdlJlZk51bTsKICNpZm5kZWYgU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZQotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1Byb3h5Q3JlYXRvckFuZFR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1Byb3h5Q3JlYXRvckFuZFR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd1Byb3h5Q3JlYXRvckFuZFR5cGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2UmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dQcm94eUljb24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUljb25SZWYgb3V0SWNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBJY29uUmVmIG91dEljb247CiAjaWZuZGVmIEdldFdpbmRvd1Byb3h5SWNvbgotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3h5SWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UHJveHlJY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93UHJveHlJY29uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SWNvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dEljb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93UHJveHlJY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SWNvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dEljb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dQcm94eUljb24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUljb25SZWYgaWNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBJY29uUmVmIGljb247CiAjaWZuZGVmIFNldFdpbmRvd1Byb3h5SWNvbgotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1Byb3h5SWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlJY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd1Byb3h5SWNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93UHJveHlJY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfUmVtb3ZlV2luZG93UHJveHkoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBSZW1vdmVXaW5kb3dQcm94eQotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZVdpbmRvd1Byb3h5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVXaW5kb3dQcm94eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZVdpbmRvd1Byb3h5KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlV2luZG93UHJveHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0JlZ2luV2luZG93UHJveHlEcmFnKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEcmFnUmVmZXJlbmNlIG91dE5ld0RyYWc7Ci0JUmduSGFuZGxlIG91dERyYWdPdXRsaW5lUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIERyYWdSZWZlcmVuY2Ugb3V0TmV3RHJhZzsKKyAgICBSZ25IYW5kbGUgb3V0RHJhZ091dGxpbmVSZ247CiAjaWZuZGVmIEJlZ2luV2luZG93UHJveHlEcmFnCi0JUHlNYWNfUFJFQ0hFQ0soQmVnaW5XaW5kb3dQcm94eURyYWcpOworICAgIFB5TWFjX1BSRUNIRUNLKEJlZ2luV2luZG93UHJveHlEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXREcmFnT3V0bGluZVJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBCZWdpbldpbmRvd1Byb3h5RHJhZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmV3RHJhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RHJhZ091dGxpbmVSZ24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX05ldywgb3V0TmV3RHJhZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm91dERyYWdPdXRsaW5lUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEJlZ2luV2luZG93UHJveHlEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROZXdEcmFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXREcmFnT3V0bGluZVJnbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfTmV3LCBvdXROZXdEcmFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfRW5kV2luZG93UHJveHlEcmFnKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEcmFnUmVmZXJlbmNlIHRoZURyYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRHJhZ1JlZmVyZW5jZSB0aGVEcmFnOwogI2lmbmRlZiBFbmRXaW5kb3dQcm94eURyYWcKLQlQeU1hY19QUkVDSEVDSyhFbmRXaW5kb3dQcm94eURyYWcpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuZFdpbmRvd1Byb3h5RHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJnRoZURyYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW5kV2luZG93UHJveHlEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEcmFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJnRoZURyYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRW5kV2luZG93UHJveHlEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEcmFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVHJhY2tXaW5kb3dQcm94eUZyb21FeGlzdGluZ0RyYWcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBvaW50IHN0YXJ0UHQ7Ci0JRHJhZ1JlZmVyZW5jZSBkcmFnOwotCVJnbkhhbmRsZSBpbkRyYWdPdXRsaW5lUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFBvaW50IHN0YXJ0UHQ7CisgICAgRHJhZ1JlZmVyZW5jZSBkcmFnOworICAgIFJnbkhhbmRsZSBpbkRyYWdPdXRsaW5lUmduOwogI2lmbmRlZiBUcmFja1dpbmRvd1Byb3h5RnJvbUV4aXN0aW5nRHJhZwotCVB5TWFjX1BSRUNIRUNLKFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcmFja1dpbmRvd1Byb3h5RnJvbUV4aXN0aW5nRHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmRyYWcsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5EcmFnT3V0bGluZVJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcmFja1dpbmRvd1Byb3h5RnJvbUV4aXN0aW5nRHJhZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFB0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRyYWdPdXRsaW5lUmduKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmRyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5EcmFnT3V0bGluZVJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja1dpbmRvd1Byb3h5RnJvbUV4aXN0aW5nRHJhZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRyYWdPdXRsaW5lUmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVHJhY2tXaW5kb3dQcm94eURyYWcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBvaW50IHN0YXJ0UHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgc3RhcnRQdDsKICNpZm5kZWYgVHJhY2tXaW5kb3dQcm94eURyYWcKLQlQeU1hY19QUkVDSEVDSyhUcmFja1dpbmRvd1Byb3h5RHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHJhY2tXaW5kb3dQcm94eURyYWcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJhY2tXaW5kb3dQcm94eURyYWcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVHJhY2tXaW5kb3dQcm94eURyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93TW9kaWZpZWQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzV2luZG93TW9kaWZpZWQKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd01vZGlmaWVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd01vZGlmaWVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd01vZGlmaWVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd01vZGlmaWVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dNb2RpZmllZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBtb2RpZmllZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIG1vZGlmaWVkOwogI2lmbmRlZiBTZXRXaW5kb3dNb2RpZmllZAotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd01vZGlmaWVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dNb2RpZmllZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd01vZGlmaWVkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd01vZGlmaWVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2soV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCBldmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRSZWNvcmQgZXZlbnQ7CiAjaWZuZGVmIElzV2luZG93UGF0aFNlbGVjdENsaWNrCi0JUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2spOworICAgIFB5TWFjX1BSRUNIRUNLKElzV2luZG93UGF0aFNlbGVjdENsaWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZldmVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93UGF0aFNlbGVjdENsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd1BhdGhTZWxlY3RDbGljayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1dpbmRvd1BhdGhTZWxlY3QoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgbWVudTsKLQlTSW50MzIgb3V0TWVudVJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIG1lbnU7CisgICAgU0ludDMyIG91dE1lbnVSZXN1bHQ7CiAjaWZuZGVmIFdpbmRvd1BhdGhTZWxlY3QKLQlQeU1hY19QUkVDSEVDSyhXaW5kb3dQYXRoU2VsZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhXaW5kb3dQYXRoU2VsZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmbWVudSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBXaW5kb3dQYXRoU2VsZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgbWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWVudVJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0TWVudVJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZtZW51KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFdpbmRvd1BhdGhTZWxlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51UmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNZW51UmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGhpbGl0ZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBoaWxpdGVkOwogI2lmbmRlZiBIaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVHJhbnNpdGlvbldpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93VHJhbnNpdGlvbkVmZmVjdCBpbkVmZmVjdDsKLQlXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uOwotCVJlY3QgaW5SZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1RyYW5zaXRpb25FZmZlY3QgaW5FZmZlY3Q7CisgICAgV2luZG93VHJhbnNpdGlvbkFjdGlvbiBpbkFjdGlvbjsKKyAgICBSZWN0IGluUmVjdDsKICNpZm5kZWYgVHJhbnNpdGlvbldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFRyYW5zaXRpb25XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYW5zaXRpb25XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkVmZmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRyYW5zaXRpb25XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkVmZmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkFjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5BY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVHJhbnNpdGlvbldpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9UcmFuc2l0aW9uV2luZG93QW5kUGFyZW50KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5QYXJlbnRXaW5kb3c7Ci0JV2luZG93VHJhbnNpdGlvbkVmZmVjdCBpbkVmZmVjdDsKLQlXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uOwotCVJlY3QgaW5SZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpblBhcmVudFdpbmRvdzsKKyAgICBXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0OworICAgIFdpbmRvd1RyYW5zaXRpb25BY3Rpb24gaW5BY3Rpb247CisgICAgUmVjdCBpblJlY3Q7CiAjaWZuZGVmIFRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQKLQlQeU1hY19QUkVDSEVDSyhUcmFuc2l0aW9uV2luZG93QW5kUGFyZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcmFuc2l0aW9uV2luZG93QW5kUGFyZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5QYXJlbnRXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkVmZmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcmVudFdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkVmZmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkFjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluUGFyZW50V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5FZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFuc2l0aW9uV2luZG93QW5kUGFyZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJlbnRXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5FZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX01hY01vdmVXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBoR2xvYmFsOwotCXNob3J0IHZHbG9iYWw7Ci0JQm9vbGVhbiBmcm9udDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaEdsb2JhbDsKKyAgICBzaG9ydCB2R2xvYmFsOworICAgIEJvb2xlYW4gZnJvbnQ7CiAjaWZuZGVmIE1hY01vdmVXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhNYWNNb3ZlV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNNb3ZlV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoR2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAmdkdsb2JhbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyb250KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjTW92ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgaEdsb2JhbCwKLQkgICAgICAgICAgICAgIHZHbG9iYWwsCi0JICAgICAgICAgICAgICBmcm9udCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdkdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjTW92ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgaEdsb2JhbCwKKyAgICAgICAgICAgICAgICAgIHZHbG9iYWwsCisgICAgICAgICAgICAgICAgICBmcm9udCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TaXplV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgdzsKLQlzaG9ydCBoOwotCUJvb2xlYW4gZlVwZGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdzsKKyAgICBzaG9ydCBoOworICAgIEJvb2xlYW4gZlVwZGF0ZTsKICNpZm5kZWYgU2l6ZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFNpemVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNpemVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJncsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZlVwZGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCVNpemVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIHcsCi0JICAgICAgICAgICBoLAotCSAgICAgICAgICAgZlVwZGF0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZVcGRhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaXplV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICAgaCwKKyAgICAgICAgICAgICAgIGZVcGRhdGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR3Jvd1dpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVBvaW50IHN0YXJ0UHQ7Ci0JUmVjdCBiQm94OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBQb2ludCBzdGFydFB0OworICAgIFJlY3QgYkJveDsKICNpZm5kZWYgR3Jvd1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKEdyb3dXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyb3dXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJCb3gpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcm93V2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBzdGFydFB0LAotCSAgICAgICAgICAgICAgICAgJmJCb3gpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZiQm94KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3Jvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgc3RhcnRQdCwKKyAgICAgICAgICAgICAgICAgICAgICZiQm94KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfRHJhZ1dpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHN0YXJ0UHQ7Ci0JUmVjdCBib3VuZHNSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBzdGFydFB0OworICAgIFJlY3QgYm91bmRzUmVjdDsKICNpZm5kZWYgRHJhZ1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKERyYWdXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYWdXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmFnV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICBzdGFydFB0LAotCSAgICAgICAgICAgJmJvdW5kc1JlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYWdXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIHN0YXJ0UHQsCisgICAgICAgICAgICAgICAmYm91bmRzUmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9ab29tV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UGFydENvZGUgcGFydENvZGU7Ci0JQm9vbGVhbiBmcm9udDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UGFydENvZGUgcGFydENvZGU7CisgICAgQm9vbGVhbiBmcm9udDsKICNpZm5kZWYgWm9vbVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFpvb21XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFpvb21XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydENvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmcm9udCkpCi0JCXJldHVybiBOVUxMOwotCVpvb21XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIHBhcnRDb2RlLAotCSAgICAgICAgICAgZnJvbnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgWm9vbVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgcGFydENvZGUsCisgICAgICAgICAgICAgICBmcm9udCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd0NvbGxhcHNhYmxlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc1dpbmRvd0NvbGxhcHNhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dDb2xsYXBzYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dDb2xsYXBzYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNXaW5kb3dDb2xsYXBzYWJsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNXaW5kb3dDb2xsYXBzYWJsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSXNXaW5kb3dDb2xsYXBzZWQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzV2luZG93Q29sbGFwc2VkCi0JUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dDb2xsYXBzZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzV2luZG93Q29sbGFwc2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd0NvbGxhcHNlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNXaW5kb3dDb2xsYXBzZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NvbGxhcHNlV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGNvbGxhcHNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gY29sbGFwc2U7CiAjaWZuZGVmIENvbGxhcHNlV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soQ29sbGFwc2VXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbGxhcHNlV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sbGFwc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29sbGFwc2VXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sbGFwc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29sbGFwc2VXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dCb3VuZHMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZTsKLQlSZWN0IGdsb2JhbEJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dSZWdpb25Db2RlIHJlZ2lvbkNvZGU7CisgICAgUmVjdCBnbG9iYWxCb3VuZHM7CiAjaWZuZGVmIEdldFdpbmRvd0JvdW5kcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0JvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Qm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uQ29kZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsQm91bmRzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZ2xvYmFsQm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbkNvZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbEJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmdsb2JhbEJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1Jlc2l6ZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IGluU3RhcnRQb2ludDsKLQlSZWN0IGluU2l6ZUNvbnN0cmFpbnRzOwotCVJlY3Qgb3V0TmV3Q29udGVudFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IGluU3RhcnRQb2ludDsKKyAgICBSZWN0IGluU2l6ZUNvbnN0cmFpbnRzOworICAgIFJlY3Qgb3V0TmV3Q29udGVudFJlY3Q7CiAjaWZuZGVmIFJlc2l6ZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFJlc2l6ZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVzaXplV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluU3RhcnRQb2ludCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluU2l6ZUNvbnN0cmFpbnRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVzaXplV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGluU3RhcnRQb2ludCwKLQkgICAgICAgICAgICAgICAgICAgJmluU2l6ZUNvbnN0cmFpbnRzLAotCSAgICAgICAgICAgICAgICAgICAmb3V0TmV3Q29udGVudFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXROZXdDb250ZW50UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5TdGFydFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5TaXplQ29uc3RyYWludHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZXNpemVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5TdGFydFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAmaW5TaXplQ29uc3RyYWludHMsCisgICAgICAgICAgICAgICAgICAgICAgICZvdXROZXdDb250ZW50UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dE5ld0NvbnRlbnRSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93Qm91bmRzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dSZWdpb25Db2RlIHJlZ2lvbkNvZGU7Ci0JUmVjdCBnbG9iYWxCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UmVnaW9uQ29kZSByZWdpb25Db2RlOworICAgIFJlY3QgZ2xvYmFsQm91bmRzOwogI2lmbmRlZiBTZXRXaW5kb3dCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0JvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJITyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmdsb2JhbEJvdW5kcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsQm91bmRzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJITyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmdsb2JhbEJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsQm91bmRzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfUmVwb3NpdGlvbldpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHBhcmVudFdpbmRvdzsKLQlXaW5kb3dQb3NpdGlvbk1ldGhvZCBtZXRob2Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHBhcmVudFdpbmRvdzsKKyAgICBXaW5kb3dQb3NpdGlvbk1ldGhvZCBtZXRob2Q7CiAjaWZuZGVmIFJlcG9zaXRpb25XaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhSZXBvc2l0aW9uV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXBvc2l0aW9uV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmcGFyZW50V2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlcG9zaXRpb25XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnBhcmVudFdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldGhvZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXBvc2l0aW9uV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX01vdmVXaW5kb3dTdHJ1Y3R1cmUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCXNob3J0IGhHbG9iYWw7Ci0Jc2hvcnQgdkdsb2JhbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBzaG9ydCBoR2xvYmFsOworICAgIHNob3J0IHZHbG9iYWw7CiAjaWZuZGVmIE1vdmVXaW5kb3dTdHJ1Y3R1cmUKLQlQeU1hY19QUkVDSEVDSyhNb3ZlV2luZG93U3RydWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlV2luZG93U3RydWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE1vdmVXaW5kb3dTdHJ1Y3R1cmUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBoR2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZHbG9iYWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE1vdmVXaW5kb3dTdHJ1Y3R1cmUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZHbG9iYWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd0luU3RhbmRhcmRTdGF0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IGluSWRlYWxTaXplOwotCVJlY3Qgb3V0SWRlYWxTdGFuZGFyZFN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCBpbklkZWFsU2l6ZTsKKyAgICBSZWN0IG91dElkZWFsU3RhbmRhcmRTdGF0ZTsKICNpZm5kZWYgSXNXaW5kb3dJblN0YW5kYXJkU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dJblN0YW5kYXJkU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluSWRlYWxTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNXaW5kb3dJblN0YW5kYXJkU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JZGVhbFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dElkZWFsU3RhbmRhcmRTdGF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dElkZWFsU3RhbmRhcmRTdGF0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluSWRlYWxTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNXaW5kb3dJblN0YW5kYXJkU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JZGVhbFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dElkZWFsU3RhbmRhcmRTdGF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dElkZWFsU3RhbmRhcmRTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1pvb21XaW5kb3dJZGVhbChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UGFydENvZGUgaW5QYXJ0Q29kZTsKLQlQb2ludCBpb0lkZWFsU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQYXJ0Q29kZSBpblBhcnRDb2RlOworICAgIFBvaW50IGlvSWRlYWxTaXplOwogI2lmbmRlZiBab29tV2luZG93SWRlYWwKLQlQeU1hY19QUkVDSEVDSyhab29tV2luZG93SWRlYWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFpvb21XaW5kb3dJZGVhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydENvZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gWm9vbVdpbmRvd0lkZWFsKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpblBhcnRDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmlvSWRlYWxTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgaW9JZGVhbFNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0Q29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBab29tV2luZG93SWRlYWwoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9JZGVhbFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBpb0lkZWFsU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0lkZWFsVXNlclN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IG91dFVzZXJTdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IG91dFVzZXJTdGF0ZTsKICNpZm5kZWYgR2V0V2luZG93SWRlYWxVc2VyU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93SWRlYWxVc2VyU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VXNlclN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0VXNlclN0YXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd0lkZWFsVXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRVc2VyU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRVc2VyU3RhdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblVzZXJTdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluVXNlclN0YXRlOwogI2lmbmRlZiBTZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0lkZWFsVXNlclN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblVzZXJTdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Vc2VyU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluVXNlclN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd0lkZWFsVXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblVzZXJTdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbjsKLQlHREhhbmRsZSBvdXRHcmVhdGVzdERldmljZTsKLQlSZWN0IG91dEdyZWF0ZXN0RGV2aWNlUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uOworICAgIEdESGFuZGxlIG91dEdyZWF0ZXN0RGV2aWNlOworICAgIFJlY3Qgb3V0R3JlYXRlc3REZXZpY2VSZWN0OwogI2lmbmRlZiBHZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0R3JlYXRlc3REZXZpY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0R3JlYXRlc3REZXZpY2VSZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvdXRHcmVhdGVzdERldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRHcmVhdGVzdERldmljZVJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHcmVhdGVzdERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHcmVhdGVzdERldmljZVJlY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dEdyZWF0ZXN0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEdyZWF0ZXN0RGV2aWNlUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NvbnN0cmFpbldpbmRvd1RvU2NyZWVuKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uQ29kZTsKLQlXaW5kb3dDb25zdHJhaW5PcHRpb25zIGluT3B0aW9uczsKLQlSZWN0IGluU2NyZWVuUmVjdDsKLQlSZWN0IG91dFN0cnVjdHVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uQ29kZTsKKyAgICBXaW5kb3dDb25zdHJhaW5PcHRpb25zIGluT3B0aW9uczsKKyAgICBSZWN0IGluU2NyZWVuUmVjdDsKKyAgICBSZWN0IG91dFN0cnVjdHVyZTsKICNpZm5kZWYgQ29uc3RyYWluV2luZG93VG9TY3JlZW4KLQlQeU1hY19QUkVDSEVDSyhDb25zdHJhaW5XaW5kb3dUb1NjcmVlbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29uc3RyYWluV2luZG93VG9TY3JlZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZ2lvbkNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblNjcmVlblJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29uc3RyYWluV2luZG93VG9TY3JlZW4oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb25Db2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblNjcmVlblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJ1Y3R1cmUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRTdHJ1Y3R1cmUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5TY3JlZW5SZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbnN0cmFpbldpbmRvd1RvU2NyZWVuKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TY3JlZW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RydWN0dXJlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0U3RydWN0dXJlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSGlkZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgSGlkZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKEhpZGVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUhpZGVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWRlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTWFjU2hvd1dpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgTWFjU2hvd1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKE1hY1Nob3dXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1Nob3dXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU1hY1Nob3dXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNTaG93V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2hvd0hpZGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIHNob3dGbGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIHNob3dGbGFnOwogI2lmbmRlZiBTaG93SGlkZQotCVB5TWFjX1BSRUNIRUNLKFNob3dIaWRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93SGlkZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNob3dGbGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2hvd0hpZGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICBzaG93RmxhZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hvd0ZsYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaG93SGlkZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgIHNob3dGbGFnKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX01hY0lzV2luZG93VmlzaWJsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgTWFjSXNXaW5kb3dWaXNpYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTWFjSXNXaW5kb3dWaXNpYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNJc1dpbmRvd1Zpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1hY0lzV2luZG93VmlzaWJsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjSXNXaW5kb3dWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TaG93U2hlZXRXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpblBhcmVudFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5QYXJlbnRXaW5kb3c7CiAjaWZuZGVmIFNob3dTaGVldFdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFNob3dTaGVldFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd1NoZWV0V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpblBhcmVudFdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTaG93U2hlZXRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluUGFyZW50V2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5QYXJlbnRXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2hvd1NoZWV0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcmVudFdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0hpZGVTaGVldFdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIEhpZGVTaGVldFdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKEhpZGVTaGVldFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlkZVNoZWV0V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGlkZVNoZWV0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSGlkZVNoZWV0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRTaGVldFdpbmRvd1BhcmVudChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIG91dFBhcmVudFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgb3V0UGFyZW50V2luZG93OwogI2lmbmRlZiBHZXRTaGVldFdpbmRvd1BhcmVudAotCVB5TWFjX1BSRUNIRUNLKEdldFNoZWV0V2luZG93UGFyZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRTaGVldFdpbmRvd1BhcmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFNoZWV0V2luZG93UGFyZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQYXJlbnRXaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIG91dFBhcmVudFdpbmRvdyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTaGVldFdpbmRvd1BhcmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UGFyZW50V2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBvdXRQYXJlbnRXaW5kb3cpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7Ci0JT1NUeXBlIHByb3BlcnR5VGFnOwotCVVJbnQzMiBhdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIHByb3BlcnR5VGFnOworICAgIFVJbnQzMiBhdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgcHJvcGVydHlUYWc7Ci0JVUludDMyIGF0dHJpYnV0ZXNUb1NldDsKLQlVSW50MzIgYXR0cmlidXRlc1RvQ2xlYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKKyAgICBPU1R5cGUgcHJvcGVydHlUYWc7CisgICAgVUludDMyIGF0dHJpYnV0ZXNUb1NldDsKKyAgICBVSW50MzIgYXR0cmlidXRlc1RvQ2xlYXI7CiAjaWZuZGVmIENoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKENoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9DbGVhcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDaGFuZ2VXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvQ2xlYXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9DbGVhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDaGFuZ2VXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvQ2xlYXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9UcmFja0JveChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHRoZVB0OwotCVdpbmRvd1BhcnRDb2RlIHBhcnRDb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCB0aGVQdDsKKyAgICBXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZTsKICNpZm5kZWYgVHJhY2tCb3gKLQlQeU1hY19QUkVDSEVDSyhUcmFja0JveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHJhY2tCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnRDb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHJhY2tCb3goX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICB0aGVQdCwKLQkgICAgICAgICAgICAgICBwYXJ0Q29kZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnRDb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHJhY2tCb3goX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICB0aGVQdCwKKyAgICAgICAgICAgICAgICAgICBwYXJ0Q29kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1RyYWNrR29Bd2F5KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgdGhlUHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHRoZVB0OwogI2lmbmRlZiBUcmFja0dvQXdheQotCVB5TWFjX1BSRUNIRUNLKFRyYWNrR29Bd2F5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcmFja0dvQXdheSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUcmFja0dvQXdheShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHRoZVB0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUcmFja0dvQXdheShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHRoZVB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93UG9ydChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBHZXRXaW5kb3dQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0V2luZG93UG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRXaW5kb3dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1N0cnVjdHVyZVBvcnQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIF9ydjsKICNpZm5kZWYgR2V0V2luZG93U3RydWN0dXJlUG9ydAotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0cnVjdHVyZVBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0cnVjdHVyZVBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdpbmRvd1N0cnVjdHVyZVBvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0V2luZG93U3RydWN0dXJlUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dLaW5kKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFdpbmRvd0tpbmQKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dLaW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dLaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXaW5kb3dLaW5kKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRXaW5kb3dLaW5kKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd0hpbGl0ZWQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzV2luZG93SGlsaXRlZAotCVB5TWFjX1BSRUNIRUNLKElzV2luZG93SGlsaXRlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dIaWxpdGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd0hpbGl0ZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzV2luZG93SGlsaXRlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSXNXaW5kb3dVcGRhdGVQZW5kaW5nKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc1dpbmRvd1VwZGF0ZVBlbmRpbmcKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd1VwZGF0ZVBlbmRpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKElzV2luZG93VXBkYXRlUGVuZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNXaW5kb3dVcGRhdGVQZW5kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd1VwZGF0ZVBlbmRpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX01hY0dldE5leHRXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBNYWNHZXROZXh0V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjR2V0TmV4dFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjR2V0TmV4dFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWFjR2V0TmV4dFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1hY0dldE5leHRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dTdGFuZGFyZFN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIEdldFdpbmRvd1N0YW5kYXJkU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dTdGFuZGFyZFN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dTdGFuZGFyZFN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRXaW5kb3dTdGFuZGFyZFN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0V2luZG93U3RhbmRhcmRTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1VzZXJTdGF0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByZWN0OwogI2lmbmRlZiBHZXRXaW5kb3dVc2VyU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dVc2VyU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1VzZXJTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93VXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZyZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRXaW5kb3dVc2VyU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd0tpbmQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBraW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBraW5kOwogI2lmbmRlZiBTZXRXaW5kb3dLaW5kCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93S2luZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93S2luZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmtpbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRXaW5kb3dLaW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBraW5kKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZraW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0V2luZG93S2luZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAga2luZCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dTdGFuZGFyZFN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIFNldFdpbmRvd1N0YW5kYXJkU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dTdGFuZGFyZFN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dTdGFuZGFyZFN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRXaW5kb3dTdGFuZGFyZFN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRXaW5kb3dTdGFuZGFyZFN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dVc2VyU3RhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcmVjdDsKICNpZm5kZWYgU2V0V2luZG93VXNlclN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93VXNlclN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dVc2VyU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCVNldFdpbmRvd1VzZXJTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmcmVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRXaW5kb3dVc2VyU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0UG9ydFdpbmRvd1BvcnQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNldFBvcnRXaW5kb3dQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFdpbmRvd1BvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRXaW5kb3dQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0V2luZG93UG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRXaW5kb3dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93UG9ydEJvdW5kcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgR2V0V2luZG93UG9ydEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1BvcnRCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1BvcnRCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFdpbmRvd1BvcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0V2luZG93UG9ydEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd1Zpc2libGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzV2luZG93VmlzaWJsZQotCVB5TWFjX1BSRUNIRUNLKElzV2luZG93VmlzaWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dWaXNpYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd1Zpc2libGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzV2luZG93VmlzaWJsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlUmduKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByOwogI2lmbmRlZiBHZXRXaW5kb3dTdHJ1Y3R1cmVSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dTdHJ1Y3R1cmVSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0cnVjdHVyZVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUdldFdpbmRvd1N0cnVjdHVyZVJnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICByKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRXaW5kb3dTdHJ1Y3R1cmVSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dDb250ZW50UmduKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByOwogI2lmbmRlZiBHZXRXaW5kb3dDb250ZW50UmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q29udGVudFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q29udGVudFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUdldFdpbmRvd0NvbnRlbnRSZ24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFdpbmRvd0NvbnRlbnRSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93VXBkYXRlUmduKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByOwogI2lmbmRlZiBHZXRXaW5kb3dVcGRhdGVSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dVcGRhdGVSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1VwZGF0ZVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUdldFdpbmRvd1VwZGF0ZVJnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICByKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRXaW5kb3dVcGRhdGVSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXROZXh0V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKICNpZm5kZWYgR2V0TmV4dFdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKEdldE5leHRXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHRXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5leHRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX01vdmVXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBoR2xvYmFsOwotCXNob3J0IHZHbG9iYWw7Ci0JQm9vbGVhbiBmcm9udDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaEdsb2JhbDsKKyAgICBzaG9ydCB2R2xvYmFsOworICAgIEJvb2xlYW4gZnJvbnQ7CiAjaWZuZGVmIE1vdmVXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhNb3ZlV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoR2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAmdkdsb2JhbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyb250KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTW92ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgaEdsb2JhbCwKLQkgICAgICAgICAgIHZHbG9iYWwsCi0JICAgICAgICAgICBmcm9udCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdkdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTW92ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgaEdsb2JhbCwKKyAgICAgICAgICAgICAgIHZHbG9iYWwsCisgICAgICAgICAgICAgICBmcm9udCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TaG93V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTaG93V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2hvd1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2hvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9BdXRvRGlzcG9zZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCWludCBvbm9mZiwgb2xkID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJm9ub2ZmKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWlmICggX3NlbGYtPm9iX2ZyZWVpdCApCi0JICAgICAgICBvbGQgPSAxOwotCWlmICggb25vZmYgKQotCSAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlV2luZG93OwotCWVsc2UKLQkgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBOVUxMOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgb2xkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpbnQgb25vZmYsIG9sZCA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZvbm9mZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggX3NlbGYtPm9iX2ZyZWVpdCApCisgICAgICAgIG9sZCA9IDE7CisgICAgaWYgKCBvbm9mZiApCisgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZVdpbmRvdzsKKyAgICBlbHNlCisgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBOVUxMOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgb2xkKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgV2luT2JqX21ldGhvZHNbXSA9IHsKLQl7IkdldFdpbmRvd093bmVyQ291bnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd093bmVyQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRDb3VudCkiKX0sCi0JeyJDbG9uZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2xvbmVXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd1JldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dSZXRhaW5Db3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJSZXRhaW5XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JldGFpbldpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUmVsZWFzZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVsZWFzZVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUmVzaGFwZUN1c3RvbVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVzaGFwZUN1c3RvbVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93V2lkZ2V0SGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dXaWRnZXRIaWxpdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0RlZlBhcnRDb2RlIG91dEhpbGl0ZSkiKX0sCi0JeyJHZXRXaW5kb3dDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Q2xhc3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0NsYXNzIG91dENsYXNzKSIpfSwKLQl7IkdldFdpbmRvd0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0F0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0F0dHJpYnV0ZXMgb3V0QXR0cmlidXRlcykiKX0sCi0JeyJDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlcywgV2luZG93QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IlNldFdpbmRvd0NsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dDbGFzcywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzcykgLT4gTm9uZSIpfSwKLQl7IlNldFdpbmRvd01vZGFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dNb2RhbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93TW9kYWxpdHkgaW5Nb2RhbEtpbmQsIFdpbmRvd1B0ciBpblVuYXZhaWxhYmxlV2luZG93KSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93TW9kYWxpdHkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd01vZGFsaXR5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChXaW5kb3dNb2RhbGl0eSBvdXRNb2RhbEtpbmQsIFdpbmRvd1B0ciBvdXRVbmF2YWlsYWJsZVdpbmRvdykiKX0sCi0JeyJTZXRXaW5kb3dDb250ZW50Q29sb3IiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0NvbnRlbnRDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dDb250ZW50Q29sb3IiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NvbnRlbnRDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgY29sb3IpIil9LAotCXsiR2V0V2luZG93Q29udGVudFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NvbnRlbnRQYXR0ZXJuLCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgb3V0UGl4UGF0KSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93Q29udGVudFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0NvbnRlbnRQYXR0ZXJuLCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcGl4UGF0KSAtPiBOb25lIil9LAotCXsiU2Nyb2xsV2luZG93UmVjdCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2Nyb2xsV2luZG93UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblNjcm9sbFJlY3QsIFNJbnQxNiBpbkhQaXhlbHMsIFNJbnQxNiBpblZQaXhlbHMsIFNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zLCBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbikgLT4gTm9uZSIpfSwKLQl7IlNjcm9sbFdpbmRvd1JlZ2lvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2Nyb2xsV2luZG93UmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgaW5TY3JvbGxSZ24sIFNJbnQxNiBpbkhQaXhlbHMsIFNJbnQxNiBpblZQaXhlbHMsIFNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zLCBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbikgLT4gTm9uZSIpfSwKLQl7IkNsaXBBYm92ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2xpcEFib3ZlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJQYWludE9uZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfUGFpbnRPbmUsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbG9iYmVyZWRSZ24pIC0+IE5vbmUiKX0sCi0JeyJQYWludEJlaGluZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfUGFpbnRCZWhpbmQsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbG9iYmVyZWRSZ24pIC0+IE5vbmUiKX0sCi0JeyJDYWxjVmlzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DYWxjVmlzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDYWxjVmlzQmVoaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DYWxjVmlzQmVoaW5kLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgY2xvYmJlcmVkUmduKSAtPiBOb25lIil9LAotCXsiQnJpbmdUb0Zyb250IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9CcmluZ1RvRnJvbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNlbmRCZWhpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NlbmRCZWhpbmQsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBiZWhpbmRXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJTZWxlY3RXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NlbGVjdFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0TmV4dFdpbmRvd09mQ2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldE5leHRXaW5kb3dPZkNsYXNzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzLCBCb29sZWFuIG11c3RCZVZpc2libGUpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IlNldFdpbmRvd0FsdGVybmF0ZVRpdGxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dBbHRlcm5hdGVUaXRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5UaXRsZSkgLT4gTm9uZSIpfSwKLQl7IkNvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRUaXRsZSkiKX0sCi0JeyJIaWxpdGVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0hpbGl0ZVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBmSGlsaXRlKSAtPiBOb25lIil9LAotCXsiU2V0V1JlZkNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V1JlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBkYXRhKSAtPiBOb25lIil9LAotCXsiR2V0V1JlZkNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V1JlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU2V0V2luZG93UGljIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQaWMsIDEsCi0JIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBwaWMpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dQaWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1BpYywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGljSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRXVmFyaWFudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V1ZhcmlhbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRXaW5kb3dGZWF0dXJlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93RmVhdHVyZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRGZWF0dXJlcykiKX0sCi0JeyJHZXRXaW5kb3dSZWdpb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1JlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbkNvZGUsIFJnbkhhbmRsZSBpb1dpblJnbikgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd1N0cnVjdHVyZVdpZHRocyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlV2lkdGhzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dFJlY3QpIil9LAotCXsiQmVnaW5VcGRhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0JlZ2luVXBkYXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJFbmRVcGRhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0VuZFVwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSW52YWxXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0ludmFsV2luZG93UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAotCXsiSW52YWxXaW5kb3dSZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9JbnZhbFdpbmRvd1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzKSAtPiBOb25lIil9LAotCXsiVmFsaWRXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1ZhbGlkV2luZG93UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAotCXsiVmFsaWRXaW5kb3dSZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9WYWxpZFdpbmRvd1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzKSAtPiBOb25lIil9LAotCXsiRHJhd0dyb3dJY29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9EcmF3R3Jvd0ljb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldFdUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V1RpdGxlLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgdGl0bGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRXVGl0bGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdUaXRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU3RyMjU1IHRpdGxlKSIpfSwKLQl7IlNldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDb3B5V2luZG93VGl0bGVBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db3B5V2luZG93VGl0bGVBc0NGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAotCXsiU2V0V2luZG93UHJveHlGU1NwZWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5RlNTcGVjLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgaW5GaWxlKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93UHJveHlGU1NwZWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1Byb3h5RlNTcGVjLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGU1NwZWMgb3V0RmlsZSkiKX0sCi0JeyJTZXRXaW5kb3dQcm94eUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQcm94eUFsaWFzLCAxLAotCSBQeURvY19TVFIoIihBbGlhc0hhbmRsZSBpbkFsaWFzKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93UHJveHlBbGlhcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJveHlBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAotCXsiU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVDcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUsIFNJbnQxNiB2UmVmTnVtKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93UHJveHlJY29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQcm94eUljb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEljb25SZWYgb3V0SWNvbikiKX0sCi0JeyJTZXRXaW5kb3dQcm94eUljb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5SWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiBpY29uKSAtPiBOb25lIil9LAotCXsiUmVtb3ZlV2luZG93UHJveHkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JlbW92ZVdpbmRvd1Byb3h5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJCZWdpbldpbmRvd1Byb3h5RHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQmVnaW5XaW5kb3dQcm94eURyYWcsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBvdXREcmFnT3V0bGluZVJnbikgLT4gKERyYWdSZWZlcmVuY2Ugb3V0TmV3RHJhZykiKX0sCi0JeyJFbmRXaW5kb3dQcm94eURyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0VuZFdpbmRvd1Byb3h5RHJhZywgMSwKLQkgUHlEb2NfU1RSKCIoRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKSAtPiBOb25lIil9LAotCXsiVHJhY2tXaW5kb3dQcm94eUZyb21FeGlzdGluZ0RyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFB0LCBEcmFnUmVmZXJlbmNlIGRyYWcsIFJnbkhhbmRsZSBpbkRyYWdPdXRsaW5lUmduKSAtPiBOb25lIil9LAotCXsiVHJhY2tXaW5kb3dQcm94eURyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrV2luZG93UHJveHlEcmFnLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFB0KSAtPiBOb25lIil9LAotCXsiSXNXaW5kb3dNb2RpZmllZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dNb2RpZmllZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0V2luZG93TW9kaWZpZWQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd01vZGlmaWVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIG1vZGlmaWVkKSAtPiBOb25lIil9LAotCXsiSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2siLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93UGF0aFNlbGVjdENsaWNrLCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlY29yZCBldmVudCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IldpbmRvd1BhdGhTZWxlY3QiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1dpbmRvd1BhdGhTZWxlY3QsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgbWVudSkgLT4gKFNJbnQzMiBvdXRNZW51UmVzdWx0KSIpfSwKLQl7IkhpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGhpbGl0ZWQpIC0+IE5vbmUiKX0sCi0JeyJUcmFuc2l0aW9uV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFuc2l0aW9uV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0LCBXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uLCBSZWN0IGluUmVjdCkgLT4gTm9uZSIpfSwKLQl7IlRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpblBhcmVudFdpbmRvdywgV2luZG93VHJhbnNpdGlvbkVmZmVjdCBpbkVmZmVjdCwgV2luZG93VHJhbnNpdGlvbkFjdGlvbiBpbkFjdGlvbiwgUmVjdCBpblJlY3QpIC0+IE5vbmUiKX0sCi0JeyJNYWNNb3ZlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNNb3ZlV2luZG93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBoR2xvYmFsLCBzaG9ydCB2R2xvYmFsLCBCb29sZWFuIGZyb250KSAtPiBOb25lIil9LAotCXsiU2l6ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2l6ZVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdywgc2hvcnQgaCwgQm9vbGVhbiBmVXBkYXRlKSAtPiBOb25lIil9LAotCXsiR3Jvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR3Jvd1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQdCwgUmVjdCBiQm94KSAtPiAobG9uZyBfcnYpIil9LAotCXsiRHJhZ1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfRHJhZ1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQdCwgUmVjdCBib3VuZHNSZWN0KSAtPiBOb25lIil9LAotCXsiWm9vbVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfWm9vbVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UGFydENvZGUgcGFydENvZGUsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCi0JeyJJc1dpbmRvd0NvbGxhcHNhYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd0NvbGxhcHNhYmxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1dpbmRvd0NvbGxhcHNlZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dDb2xsYXBzZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNvbGxhcHNlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db2xsYXBzZVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBjb2xsYXBzZSkgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd0JvdW5kcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Qm91bmRzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIHJlZ2lvbkNvZGUpIC0+IChSZWN0IGdsb2JhbEJvdW5kcykiKX0sCi0JeyJSZXNpemVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Jlc2l6ZVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgaW5TdGFydFBvaW50LCBSZWN0IGluU2l6ZUNvbnN0cmFpbnRzKSAtPiAoQm9vbGVhbiBfcnYsIFJlY3Qgb3V0TmV3Q29udGVudFJlY3QpIil9LAotCXsiU2V0V2luZG93Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZSwgUmVjdCBnbG9iYWxCb3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJSZXBvc2l0aW9uV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZXBvc2l0aW9uV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgcGFyZW50V2luZG93LCBXaW5kb3dQb3NpdGlvbk1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCi0JeyJNb3ZlV2luZG93U3RydWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Nb3ZlV2luZG93U3RydWN0dXJlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBoR2xvYmFsLCBzaG9ydCB2R2xvYmFsKSAtPiBOb25lIil9LAotCXsiSXNXaW5kb3dJblN0YW5kYXJkU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93SW5TdGFuZGFyZFN0YXRlLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpbklkZWFsU2l6ZSkgLT4gKEJvb2xlYW4gX3J2LCBSZWN0IG91dElkZWFsU3RhbmRhcmRTdGF0ZSkiKX0sCi0JeyJab29tV2luZG93SWRlYWwiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1pvb21XaW5kb3dJZGVhbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UGFydENvZGUgaW5QYXJ0Q29kZSkgLT4gKFBvaW50IGlvSWRlYWxTaXplKSIpfSwKLQl7IkdldFdpbmRvd0lkZWFsVXNlclN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvdXRVc2VyU3RhdGUpIil9LAotCXsiU2V0V2luZG93SWRlYWxVc2VyU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0lkZWFsVXNlclN0YXRlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluVXNlclN0YXRlKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb24pIC0+IChHREhhbmRsZSBvdXRHcmVhdGVzdERldmljZSwgUmVjdCBvdXRHcmVhdGVzdERldmljZVJlY3QpIil9LAotCXsiQ29uc3RyYWluV2luZG93VG9TY3JlZW4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NvbnN0cmFpbldpbmRvd1RvU2NyZWVuLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uQ29kZSwgV2luZG93Q29uc3RyYWluT3B0aW9ucyBpbk9wdGlvbnMsIFJlY3QgaW5TY3JlZW5SZWN0KSAtPiAoUmVjdCBvdXRTdHJ1Y3R1cmUpIil9LAotCXsiSGlkZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlkZVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiTWFjU2hvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTWFjU2hvd1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2hvd0hpZGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Nob3dIaWRlLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIHNob3dGbGFnKSAtPiBOb25lIil9LAotCXsiTWFjSXNXaW5kb3dWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNJc1dpbmRvd1Zpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNob3dTaGVldFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2hvd1NoZWV0V2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5QYXJlbnRXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJIaWRlU2hlZXRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0hpZGVTaGVldFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0U2hlZXRXaW5kb3dQYXJlbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFNoZWV0V2luZG93UGFyZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgb3V0UGFyZW50V2luZG93KSIpfSwKLQl7IkdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IChVSW50MzIgYXR0cmlidXRlcykiKX0sCi0JeyJDaGFuZ2VXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnLCBVSW50MzIgYXR0cmlidXRlc1RvU2V0LCBVSW50MzIgYXR0cmlidXRlc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCi0JeyJUcmFja0JveCIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhY2tCb3gsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZVB0LCBXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlRyYWNrR29Bd2F5IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFja0dvQXdheSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRXaW5kb3dQb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAotCXsiR2V0V2luZG93U3RydWN0dXJlUG9ydCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKLQl7IkdldFdpbmRvd0tpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0tpbmQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJJc1dpbmRvd0hpbGl0ZWQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93SGlsaXRlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSXNXaW5kb3dVcGRhdGVQZW5kaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd1VwZGF0ZVBlbmRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik1hY0dldE5leHRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX01hY0dldE5leHRXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiR2V0V2luZG93U3RhbmRhcmRTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RhbmRhcmRTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCByZWN0KSIpfSwKLQl7IkdldFdpbmRvd1VzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93VXNlclN0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAotCXsiU2V0V2luZG93S2luZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93S2luZCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQga2luZCkgLT4gTm9uZSIpfSwKLQl7IlNldFdpbmRvd1N0YW5kYXJkU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1N0YW5kYXJkU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcmVjdCkgLT4gTm9uZSIpfSwKLQl7IlNldFdpbmRvd1VzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93VXNlclN0YXRlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0V2luZG93UG9ydCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0UG9ydFdpbmRvd1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd1BvcnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1BvcnRCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7IklzV2luZG93VmlzaWJsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dWaXNpYmxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRXaW5kb3dTdHJ1Y3R1cmVSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1N0cnVjdHVyZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHIpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dDb250ZW50UmduIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dDb250ZW50UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcikgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd1VwZGF0ZVJnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93VXBkYXRlUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcikgLT4gTm9uZSIpfSwKLQl7IkdldE5leHRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldE5leHRXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiTW92ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTW92ZVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaEdsb2JhbCwgc2hvcnQgdkdsb2JhbCwgQm9vbGVhbiBmcm9udCkgLT4gTm9uZSIpfSwKLQl7IlNob3dXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Nob3dXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkF1dG9EaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9BdXRvRGlzcG9zZSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IERpc3Bvc2VIYW5kbGUgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJHZXRXaW5kb3dPd25lckNvdW50IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dPd25lckNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgb3V0Q291bnQpIil9LAorICAgIHsiQ2xvbmVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0Nsb25lV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dSZXRhaW5Db3VudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UmV0YWluQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEl0ZW1Db3VudCBfcnYpIil9LAorICAgIHsiUmV0YWluV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZXRhaW5XaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlJlbGVhc2VXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JlbGVhc2VXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlJlc2hhcGVDdXN0b21XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Jlc2hhcGVDdXN0b21XaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1dpZGdldEhpbGl0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93V2lkZ2V0SGlsaXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dEZWZQYXJ0Q29kZSBvdXRIaWxpdGUpIil9LAorICAgIHsiR2V0V2luZG93Q2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NsYXNzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dDbGFzcyBvdXRDbGFzcykiKX0sCisgICAgeyJHZXRXaW5kb3dBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dBdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXMpIil9LAorICAgIHsiQ2hhbmdlV2luZG93QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2hhbmdlV2luZG93QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93QXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXMsIFdpbmRvd0F0dHJpYnV0ZXMgY2xlYXJUaGVzZUF0dHJpYnV0ZXMpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRXaW5kb3dDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93Q2xhc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3MpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRXaW5kb3dNb2RhbGl0eSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93TW9kYWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd01vZGFsaXR5IGluTW9kYWxLaW5kLCBXaW5kb3dQdHIgaW5VbmF2YWlsYWJsZVdpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd01vZGFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dNb2RhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93TW9kYWxpdHkgb3V0TW9kYWxLaW5kLCBXaW5kb3dQdHIgb3V0VW5hdmFpbGFibGVXaW5kb3cpIil9LAorICAgIHsiU2V0V2luZG93Q29udGVudENvbG9yIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dDb250ZW50Q29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJHQkNvbG9yIGNvbG9yKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93Q29udGVudENvbG9yIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dDb250ZW50Q29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGNvbG9yKSIpfSwKKyAgICB7IkdldFdpbmRvd0NvbnRlbnRQYXR0ZXJuIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dDb250ZW50UGF0dGVybiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIG91dFBpeFBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd0NvbnRlbnRQYXR0ZXJuIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dDb250ZW50UGF0dGVybiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBpeFBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNjcm9sbFdpbmRvd1JlY3QiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Njcm9sbFdpbmRvd1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5TY3JvbGxSZWN0LCBTSW50MTYgaW5IUGl4ZWxzLCBTSW50MTYgaW5WUGl4ZWxzLCBTY3JvbGxXaW5kb3dPcHRpb25zIGluT3B0aW9ucywgUmduSGFuZGxlIG91dEV4cG9zZWRSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJTY3JvbGxXaW5kb3dSZWdpb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Njcm9sbFdpbmRvd1JlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGluU2Nyb2xsUmduLCBTSW50MTYgaW5IUGl4ZWxzLCBTSW50MTYgaW5WUGl4ZWxzLCBTY3JvbGxXaW5kb3dPcHRpb25zIGluT3B0aW9ucywgUmduSGFuZGxlIG91dEV4cG9zZWRSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJDbGlwQWJvdmUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NsaXBBYm92ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRPbmUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1BhaW50T25lLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgY2xvYmJlcmVkUmduKSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRCZWhpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1BhaW50QmVoaW5kLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgY2xvYmJlcmVkUmduKSAtPiBOb25lIil9LAorICAgIHsiQ2FsY1ZpcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2FsY1ZpcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ2FsY1Zpc0JlaGluZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2FsY1Zpc0JlaGluZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGNsb2JiZXJlZFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkJyaW5nVG9Gcm9udCIsIChQeUNGdW5jdGlvbilXaW5PYmpfQnJpbmdUb0Zyb250LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZW5kQmVoaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZW5kQmVoaW5kLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgYmVoaW5kV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiU2VsZWN0V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZWxlY3RXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE5leHRXaW5kb3dPZkNsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXROZXh0V2luZG93T2ZDbGFzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzcywgQm9vbGVhbiBtdXN0QmVWaXNpYmxlKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCisgICAgeyJTZXRXaW5kb3dBbHRlcm5hdGVUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93QWx0ZXJuYXRlVGl0bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluVGl0bGUpIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5V2luZG93QWx0ZXJuYXRlVGl0bGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0VGl0bGUpIil9LAorICAgIHsiSGlsaXRlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9IaWxpdGVXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gZkhpbGl0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdSZWZDb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdSZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdSZWZDb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdSZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlNldFdpbmRvd1BpYyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UGljLCAxLAorICAgICBQeURvY19TVFIoIihQaWNIYW5kbGUgcGljKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93UGljIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQaWMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0V1ZhcmlhbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdWYXJpYW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0V2luZG93RmVhdHVyZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0ZlYXR1cmVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgb3V0RmVhdHVyZXMpIil9LAorICAgIHsiR2V0V2luZG93UmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlLCBSZ25IYW5kbGUgaW9XaW5SZ24pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dTdHJ1Y3R1cmVXaWR0aHMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1N0cnVjdHVyZVdpZHRocywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvdXRSZWN0KSIpfSwKKyAgICB7IkJlZ2luVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9CZWdpblVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRW5kVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9FbmRVcGRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkludmFsV2luZG93UmduIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9JbnZhbFdpbmRvd1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IkludmFsV2luZG93UmVjdCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSW52YWxXaW5kb3dSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcykgLT4gTm9uZSIpfSwKKyAgICB7IlZhbGlkV2luZG93UmduIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9WYWxpZFdpbmRvd1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IlZhbGlkV2luZG93UmVjdCIsIChQeUNGdW5jdGlvbilXaW5PYmpfVmFsaWRXaW5kb3dSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcykgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdHcm93SWNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfRHJhd0dyb3dJY29uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRXVGl0bGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHRpdGxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0V1RpdGxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXVGl0bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFN0cjI1NSB0aXRsZSkiKX0sCisgICAgeyJTZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ29weVdpbmRvd1RpdGxlQXNDRlN0cmluZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ29weVdpbmRvd1RpdGxlQXNDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nKSIpfSwKKyAgICB7IlNldFdpbmRvd1Byb3h5RlNTcGVjIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQcm94eUZTU3BlYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGluRmlsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1Byb3h5RlNTcGVjIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQcm94eUZTU3BlYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRlNTcGVjIG91dEZpbGUpIil9LAorICAgIHsiU2V0V2luZG93UHJveHlBbGlhcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UHJveHlBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQWxpYXNIYW5kbGUgaW5BbGlhcykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1Byb3h5QWxpYXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1Byb3h5QWxpYXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFsaWFzSGFuZGxlIGFsaWFzKSIpfSwKKyAgICB7IlNldFdpbmRvd1Byb3h5Q3JlYXRvckFuZFR5cGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5Q3JlYXRvckFuZFR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlQ3JlYXRvciwgT1NUeXBlIGZpbGVUeXBlLCBTSW50MTYgdlJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1Byb3h5SWNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJveHlJY29uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChJY29uUmVmIG91dEljb24pIil9LAorICAgIHsiU2V0V2luZG93UHJveHlJY29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQcm94eUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgaWNvbikgLT4gTm9uZSIpfSwKKyAgICB7IlJlbW92ZVdpbmRvd1Byb3h5IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZW1vdmVXaW5kb3dQcm94eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQmVnaW5XaW5kb3dQcm94eURyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0JlZ2luV2luZG93UHJveHlEcmFnLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgb3V0RHJhZ091dGxpbmVSZ24pIC0+IChEcmFnUmVmZXJlbmNlIG91dE5ld0RyYWcpIil9LAorICAgIHsiRW5kV2luZG93UHJveHlEcmFnIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9FbmRXaW5kb3dQcm94eURyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKERyYWdSZWZlcmVuY2UgdGhlRHJhZykgLT4gTm9uZSIpfSwKKyAgICB7IlRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFja1dpbmRvd1Byb3h5RnJvbUV4aXN0aW5nRHJhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQdCwgRHJhZ1JlZmVyZW5jZSBkcmFnLCBSZ25IYW5kbGUgaW5EcmFnT3V0bGluZVJnbikgLT4gTm9uZSIpfSwKKyAgICB7IlRyYWNrV2luZG93UHJveHlEcmFnIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFja1dpbmRvd1Byb3h5RHJhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQdCkgLT4gTm9uZSIpfSwKKyAgICB7IklzV2luZG93TW9kaWZpZWQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93TW9kaWZpZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldFdpbmRvd01vZGlmaWVkIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dNb2RpZmllZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBtb2RpZmllZCkgLT4gTm9uZSIpfSwKKyAgICB7IklzV2luZG93UGF0aFNlbGVjdENsaWNrIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd1BhdGhTZWxlY3RDbGljaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJXaW5kb3dQYXRoU2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9XaW5kb3dQYXRoU2VsZWN0LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIG1lbnUpIC0+IChTSW50MzIgb3V0TWVudVJlc3VsdCkiKX0sCisgICAgeyJIaWxpdGVXaW5kb3dGcmFtZUZvckRyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0hpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBoaWxpdGVkKSAtPiBOb25lIil9LAorICAgIHsiVHJhbnNpdGlvbldpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhbnNpdGlvbldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93VHJhbnNpdGlvbkVmZmVjdCBpbkVmZmVjdCwgV2luZG93VHJhbnNpdGlvbkFjdGlvbiBpbkFjdGlvbiwgUmVjdCBpblJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFuc2l0aW9uV2luZG93QW5kUGFyZW50IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFuc2l0aW9uV2luZG93QW5kUGFyZW50LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5QYXJlbnRXaW5kb3csIFdpbmRvd1RyYW5zaXRpb25FZmZlY3QgaW5FZmZlY3QsIFdpbmRvd1RyYW5zaXRpb25BY3Rpb24gaW5BY3Rpb24sIFJlY3QgaW5SZWN0KSAtPiBOb25lIil9LAorICAgIHsiTWFjTW92ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTWFjTW92ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaEdsb2JhbCwgc2hvcnQgdkdsb2JhbCwgQm9vbGVhbiBmcm9udCkgLT4gTm9uZSIpfSwKKyAgICB7IlNpemVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NpemVXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHcsIHNob3J0IGgsIEJvb2xlYW4gZlVwZGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7Ikdyb3dXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dyb3dXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UHQsIFJlY3QgYkJveCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkRyYWdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0RyYWdXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UHQsIFJlY3QgYm91bmRzUmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7Ilpvb21XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1pvb21XaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1BhcnRDb2RlIHBhcnRDb2RlLCBCb29sZWFuIGZyb250KSAtPiBOb25lIil9LAorICAgIHsiSXNXaW5kb3dDb2xsYXBzYWJsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dDb2xsYXBzYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNXaW5kb3dDb2xsYXBzZWQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93Q29sbGFwc2VkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDb2xsYXBzZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ29sbGFwc2VXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gY29sbGFwc2UpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dCb3VuZHMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0JvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSByZWdpb25Db2RlKSAtPiAoUmVjdCBnbG9iYWxCb3VuZHMpIil9LAorICAgIHsiUmVzaXplV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZXNpemVXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IGluU3RhcnRQb2ludCwgUmVjdCBpblNpemVDb25zdHJhaW50cykgLT4gKEJvb2xlYW4gX3J2LCBSZWN0IG91dE5ld0NvbnRlbnRSZWN0KSIpfSwKKyAgICB7IlNldFdpbmRvd0JvdW5kcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIHJlZ2lvbkNvZGUsIFJlY3QgZ2xvYmFsQm91bmRzKSAtPiBOb25lIil9LAorICAgIHsiUmVwb3NpdGlvbldpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVwb3NpdGlvbldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHBhcmVudFdpbmRvdywgV2luZG93UG9zaXRpb25NZXRob2QgbWV0aG9kKSAtPiBOb25lIil9LAorICAgIHsiTW92ZVdpbmRvd1N0cnVjdHVyZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfTW92ZVdpbmRvd1N0cnVjdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaEdsb2JhbCwgc2hvcnQgdkdsb2JhbCkgLT4gTm9uZSIpfSwKKyAgICB7IklzV2luZG93SW5TdGFuZGFyZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd0luU3RhbmRhcmRTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgaW5JZGVhbFNpemUpIC0+IChCb29sZWFuIF9ydiwgUmVjdCBvdXRJZGVhbFN0YW5kYXJkU3RhdGUpIil9LAorICAgIHsiWm9vbVdpbmRvd0lkZWFsIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9ab29tV2luZG93SWRlYWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1BhcnRDb2RlIGluUGFydENvZGUpIC0+IChQb2ludCBpb0lkZWFsU2l6ZSkiKX0sCisgICAgeyJHZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93SWRlYWxVc2VyU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3Qgb3V0VXNlclN0YXRlKSIpfSwKKyAgICB7IlNldFdpbmRvd0lkZWFsVXNlclN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblVzZXJTdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uKSAtPiAoR0RIYW5kbGUgb3V0R3JlYXRlc3REZXZpY2UsIFJlY3Qgb3V0R3JlYXRlc3REZXZpY2VSZWN0KSIpfSwKKyAgICB7IkNvbnN0cmFpbldpbmRvd1RvU2NyZWVuIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db25zdHJhaW5XaW5kb3dUb1NjcmVlbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbkNvZGUsIFdpbmRvd0NvbnN0cmFpbk9wdGlvbnMgaW5PcHRpb25zLCBSZWN0IGluU2NyZWVuUmVjdCkgLT4gKFJlY3Qgb3V0U3RydWN0dXJlKSIpfSwKKyAgICB7IkhpZGVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0hpZGVXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1Nob3dXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX01hY1Nob3dXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dIaWRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TaG93SGlkZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBzaG93RmxhZykgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY0lzV2luZG93VmlzaWJsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfTWFjSXNXaW5kb3dWaXNpYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTaG93U2hlZXRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Nob3dTaGVldFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluUGFyZW50V2luZG93KSAtPiBOb25lIil9LAorICAgIHsiSGlkZVNoZWV0V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9IaWRlU2hlZXRXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFNoZWV0V2luZG93UGFyZW50IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRTaGVldFdpbmRvd1BhcmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIG91dFBhcmVudFdpbmRvdykiKX0sCisgICAgeyJHZXRXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnKSAtPiAoVUludDMyIGF0dHJpYnV0ZXMpIil9LAorICAgIHsiQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DaGFuZ2VXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZywgVUludDMyIGF0dHJpYnV0ZXNUb1NldCwgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyKSAtPiBOb25lIil9LAorICAgIHsiVHJhY2tCb3giLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrQm94LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0aGVQdCwgV2luZG93UGFydENvZGUgcGFydENvZGUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJUcmFja0dvQXdheSIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhY2tHb0F3YXksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRoZVB0KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0V2luZG93UG9ydCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7IkdldFdpbmRvd1N0cnVjdHVyZVBvcnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1N0cnVjdHVyZVBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCisgICAgeyJHZXRXaW5kb3dLaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dLaW5kLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiSXNXaW5kb3dIaWxpdGVkIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd0hpbGl0ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IklzV2luZG93VXBkYXRlUGVuZGluZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dVcGRhdGVQZW5kaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNHZXROZXh0V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNHZXROZXh0V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkdldFdpbmRvd1N0YW5kYXJkU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1N0YW5kYXJkU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgcmVjdCkiKX0sCisgICAgeyJHZXRXaW5kb3dVc2VyU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1VzZXJTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCByZWN0KSIpfSwKKyAgICB7IlNldFdpbmRvd0tpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0tpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGtpbmQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRXaW5kb3dTdGFuZGFyZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dTdGFuZGFyZFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRXaW5kb3dVc2VyU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1VzZXJTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByZWN0KSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFdpbmRvd1BvcnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFBvcnRXaW5kb3dQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dQb3J0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQb3J0Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJJc1dpbmRvd1Zpc2libGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93VmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0V2luZG93U3RydWN0dXJlUmduIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93Q29udGVudFJnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Q29udGVudFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dVcGRhdGVSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1VwZGF0ZVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXROZXh0V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXROZXh0V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7Ik1vdmVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX01vdmVXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGhHbG9iYWwsIHNob3J0IHZHbG9iYWwsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCisgICAgeyJTaG93V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TaG93V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJBdXRvRGlzcG9zZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQXV0b0Rpc3Bvc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKGludCktPmludC4gQXV0b21hdGljYWxseSBEaXNwb3NlSGFuZGxlIHRoZSBvYmplY3Qgb24gUHl0aG9uIG9iamVjdCBjbGVhbnVwIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBXaW5PYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0yNTcxLDIxICsyNTcxLDIxIEBACiAKIHN0YXRpYyBpbnQgV2luT2JqX2NvbXBhcmUoV2luZG93T2JqZWN0ICpzZWxmLCBXaW5kb3dPYmplY3QgKm90aGVyKQogewotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIFdpbk9ial9yZXByKFdpbmRvd09iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPFdpbmRvdyBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNwcmludGYoYnVmLCAiPFdpbmRvdyBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBXaW5PYmpfaGFzaChXaW5kb3dPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOworICAgIHJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKIH0KICNkZWZpbmUgV2luT2JqX3RwX2luaXQgMAogCkBAIC0yNTkzLDYxICsyNTkzLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlXaW5kb3dQdHIgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBXaW5kb3dQdHIgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgV2luT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoV2luZG93T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFdpbk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFdpbmRvd09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBXaW5PYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgV2luZG93X1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1dpbi5XaW5kb3ciLCAvKnRwX25hbWUqLwotCXNpemVvZihXaW5kb3dPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBXaW5PYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgV2luT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBXaW5PYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFdpbk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlXaW5PYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JV2luT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVdpbk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JV2luT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCVdpbk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVdpbk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1dpbi5XaW5kb3ciLCAvKnRwX25hbWUqLworICAgIHNpemVvZihXaW5kb3dPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBXaW5PYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgV2luT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBXaW5PYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFdpbk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBXaW5PYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgV2luT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFdpbk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgV2luT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFdpbk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFdpbk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFdpbmRvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI2NTUsNTUzICsyNjU1LDU1MyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9HZXROZXdDV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCXNob3J0IHdpbmRvd0lEOwotCVdpbmRvd1B0ciBiZWhpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CisgICAgc2hvcnQgd2luZG93SUQ7CisgICAgV2luZG93UHRyIGJlaGluZDsKICNpZm5kZWYgR2V0TmV3Q1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKEdldE5ld0NXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5ld0NXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd0lELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5ld0NXaW5kb3cod2luZG93SUQsCi0JICAgICAgICAgICAgICAgICAgICAodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICAgICBiZWhpbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luZG93SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV3Q1dpbmRvdyh3aW5kb3dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlaGluZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9OZXdXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVN0cjI1NSB0aXRsZTsKLQlCb29sZWFuIHZpc2libGU7Ci0Jc2hvcnQgdGhlUHJvYzsKLQlXaW5kb3dQdHIgYmVoaW5kOwotCUJvb2xlYW4gZ29Bd2F5RmxhZzsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU3RyMjU1IHRpdGxlOworICAgIEJvb2xlYW4gdmlzaWJsZTsKKyAgICBzaG9ydCB0aGVQcm9jOworICAgIFdpbmRvd1B0ciBiZWhpbmQ7CisgICAgQm9vbGVhbiBnb0F3YXlGbGFnOworICAgIGxvbmcgcmVmQ29uOwogI2lmbmRlZiBOZXdXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhOZXdXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlUHJvYywKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZnb0F3YXlGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3V2luZG93KCh2b2lkICopMCwKLQkgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICB2aXNpYmxlLAotCSAgICAgICAgICAgICAgICB0aGVQcm9jLAotCSAgICAgICAgICAgICAgICBiZWhpbmQsCi0JICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdXaW5kb3coKHZvaWQgKikwLAorICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgIHZpc2libGUsCisgICAgICAgICAgICAgICAgICAgIHRoZVByb2MsCisgICAgICAgICAgICAgICAgICAgIGJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgZ29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgcmVmQ29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldE5ld1dpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlzaG9ydCB3aW5kb3dJRDsKLQlXaW5kb3dQdHIgYmVoaW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OworICAgIHNob3J0IHdpbmRvd0lEOworICAgIFdpbmRvd1B0ciBiZWhpbmQ7CiAjaWZuZGVmIEdldE5ld1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKEdldE5ld1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV3V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3dJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXdXaW5kb3cod2luZG93SUQsCi0JICAgICAgICAgICAgICAgICAgICh2b2lkICopMCwKLQkgICAgICAgICAgICAgICAgICAgYmVoaW5kKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5ld1dpbmRvdyh3aW5kb3dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikwLAorICAgICAgICAgICAgICAgICAgICAgICBiZWhpbmQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fTmV3Q1dpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU3RyMjU1IHRpdGxlOwotCUJvb2xlYW4gdmlzaWJsZTsKLQlzaG9ydCBwcm9jSUQ7Ci0JV2luZG93UHRyIGJlaGluZDsKLQlCb29sZWFuIGdvQXdheUZsYWc7Ci0JbG9uZyByZWZDb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFN0cjI1NSB0aXRsZTsKKyAgICBCb29sZWFuIHZpc2libGU7CisgICAgc2hvcnQgcHJvY0lEOworICAgIFdpbmRvd1B0ciBiZWhpbmQ7CisgICAgQm9vbGVhbiBnb0F3YXlGbGFnOworICAgIGxvbmcgcmVmQ29uOwogI2lmbmRlZiBOZXdDV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soTmV3Q1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3Q1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvY0lELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdDV2luZG93KCh2b2lkICopMCwKLQkgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICB2aXNpYmxlLAotCSAgICAgICAgICAgICAgICAgcHJvY0lELAotCSAgICAgICAgICAgICAgICAgYmVoaW5kLAotCSAgICAgICAgICAgICAgICAgZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld0NXaW5kb3coKHZvaWQgKikwLAorICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgIHZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICBwcm9jSUQsCisgICAgICAgICAgICAgICAgICAgICBiZWhpbmQsCisgICAgICAgICAgICAgICAgICAgICBnb0F3YXlGbGFnLAorICAgICAgICAgICAgICAgICAgICAgcmVmQ29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0NyZWF0ZU5ld1dpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dDbGFzcyB3aW5kb3dDbGFzczsKLQlXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7Ci0JUmVjdCBjb250ZW50Qm91bmRzOwotCVdpbmRvd1B0ciBvdXRXaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93Q2xhc3Mgd2luZG93Q2xhc3M7CisgICAgV2luZG93QXR0cmlidXRlcyBhdHRyaWJ1dGVzOworICAgIFJlY3QgY29udGVudEJvdW5kczsKKyAgICBXaW5kb3dQdHIgb3V0V2luZG93OwogI2lmbmRlZiBDcmVhdGVOZXdXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVOZXdXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZU5ld1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd0NsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmNvbnRlbnRCb3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlTmV3V2luZG93KHdpbmRvd0NsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50Qm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIG91dFdpbmRvdyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3dDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZjb250ZW50Qm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZU5ld1dpbmRvdyh3aW5kb3dDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudEJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBvdXRXaW5kb3cpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9DcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IHJlc0lEOwotCVdpbmRvd1B0ciBvdXRXaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IHJlc0lEOworICAgIFdpbmRvd1B0ciBvdXRXaW5kb3c7CiAjaWZuZGVmIENyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlV2luZG93RnJvbVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlV2luZG93RnJvbVJlc291cmNlKHJlc0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIG91dFdpbmRvdyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UocmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fU2hvd0Zsb2F0aW5nV2luZG93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgU2hvd0Zsb2F0aW5nV2luZG93cwotCVB5TWFjX1BSRUNIRUNLKFNob3dGbG9hdGluZ1dpbmRvd3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dGbG9hdGluZ1dpbmRvd3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTaG93RmxvYXRpbmdXaW5kb3dzKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTaG93RmxvYXRpbmdXaW5kb3dzKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0hpZGVGbG9hdGluZ1dpbmRvd3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIEhpZGVGbG9hdGluZ1dpbmRvd3MKLQlQeU1hY19QUkVDSEVDSyhIaWRlRmxvYXRpbmdXaW5kb3dzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlRmxvYXRpbmdXaW5kb3dzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGlkZUZsb2F0aW5nV2luZG93cygpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSGlkZUZsb2F0aW5nV2luZG93cygpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9BcmVGbG9hdGluZ1dpbmRvd3NWaXNpYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUKLQlQeU1hY19QUkVDSEVDSyhBcmVGbG9hdGluZ1dpbmRvd3NWaXNpYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBcmVGbG9hdGluZ1dpbmRvd3NWaXNpYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBBcmVGbG9hdGluZ1dpbmRvd3NWaXNpYmxlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fQ2hlY2tVcGRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIHRoZUV2ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKICNpZm5kZWYgQ2hlY2tVcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhDaGVja1VwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hlY2tVcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENoZWNrVXBkYXRlKCZ0aGVFdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZ0aGVFdmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENoZWNrVXBkYXRlKCZ0aGVFdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZ0aGVFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX01hY0ZpbmRXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1BhcnRDb2RlIF9ydjsKLQlQb2ludCB0aGVQb2ludDsKLQlXaW5kb3dQdHIgd2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQYXJ0Q29kZSBfcnY7CisgICAgUG9pbnQgdGhlUG9pbnQ7CisgICAgV2luZG93UHRyIHdpbmRvdzsKICNpZm5kZWYgTWFjRmluZFdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKE1hY0ZpbmRXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0ZpbmRXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVBvaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWFjRmluZFdpbmRvdyh0aGVQb2ludCwKLQkgICAgICAgICAgICAgICAgICAgICZ3aW5kb3cpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIHdpbmRvdyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVBvaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjRmluZFdpbmRvdyh0aGVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3cpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIHdpbmRvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0Zyb250V2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBGcm9udFdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKEZyb250V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGcm9udFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRnJvbnRXaW5kb3coKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRnJvbnRXaW5kb3coKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRnJvbnROb25GbG9hdGluZ1dpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKICNpZm5kZWYgRnJvbnROb25GbG9hdGluZ1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKEZyb250Tm9uRmxvYXRpbmdXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyb250Tm9uRmxvYXRpbmdXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZyb250Tm9uRmxvYXRpbmdXaW5kb3coKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRnJvbnROb25GbG9hdGluZ1dpbmRvdygpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9HZXRGcm9udFdpbmRvd09mQ2xhc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7Ci0JV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKLQlCb29sZWFuIG11c3RCZVZpc2libGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CisgICAgV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKKyAgICBCb29sZWFuIG11c3RCZVZpc2libGU7CiAjaWZuZGVmIEdldEZyb250V2luZG93T2ZDbGFzcwotCVB5TWFjX1BSRUNIRUNLKEdldEZyb250V2luZG93T2ZDbGFzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RnJvbnRXaW5kb3dPZkNsYXNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV2luZG93Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZtdXN0QmVWaXNpYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RnJvbnRXaW5kb3dPZkNsYXNzKGluV2luZG93Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3RCZVZpc2libGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbXVzdEJlVmlzaWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEZyb250V2luZG93T2ZDbGFzcyhpbldpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0QmVWaXNpYmxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0ZpbmRXaW5kb3dPZkNsYXNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBvaW50IHdoZXJlOwotCVdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3M7Ci0JV2luZG93UHRyIG91dFdpbmRvdzsKLQlXaW5kb3dQYXJ0Q29kZSBvdXRXaW5kb3dQYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFBvaW50IHdoZXJlOworICAgIFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3M7CisgICAgV2luZG93UHRyIG91dFdpbmRvdzsKKyAgICBXaW5kb3dQYXJ0Q29kZSBvdXRXaW5kb3dQYXJ0OwogI2lmbmRlZiBGaW5kV2luZG93T2ZDbGFzcwotCVB5TWFjX1BSRUNIRUNLKEZpbmRXaW5kb3dPZkNsYXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaW5kV2luZG93T2ZDbGFzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJndoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5XaW5kb3dDbGFzcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGaW5kV2luZG93T2ZDbGFzcygmd2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRXaW5kb3dQYXJ0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgb3V0V2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgIG91dFdpbmRvd1BhcnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZpbmRXaW5kb3dPZkNsYXNzKCZ3aGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3dDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvd1BhcnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBvdXRXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0V2luZG93UGFydCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0NyZWF0ZVN0YW5kYXJkV2luZG93TWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPcHRpb25CaXRzIGluT3B0aW9uczsKLQlNZW51SGFuZGxlIG91dE1lbnU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT3B0aW9uQml0cyBpbk9wdGlvbnM7CisgICAgTWVudUhhbmRsZSBvdXRNZW51OwogI2lmbmRlZiBDcmVhdGVTdGFuZGFyZFdpbmRvd01lbnUKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVTdGFuZGFyZFdpbmRvd01lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVN0YW5kYXJkV2luZG93TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTdGFuZGFyZFdpbmRvd01lbnUoaW5PcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51KGluT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9Db2xsYXBzZUFsbFdpbmRvd3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBjb2xsYXBzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIGNvbGxhcHNlOwogI2lmbmRlZiBDb2xsYXBzZUFsbFdpbmRvd3MKLQlQeU1hY19QUkVDSEVDSyhDb2xsYXBzZUFsbFdpbmRvd3MpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbGxhcHNlQWxsV2luZG93cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbGxhcHNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvbGxhcHNlQWxsV2luZG93cyhjb2xsYXBzZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xsYXBzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb2xsYXBzZUFsbFdpbmRvd3MoY29sbGFwc2UpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9HZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlHREhhbmRsZSBpbkRldmljZTsKLQlSZWN0IG91dEF2YWlsYWJsZVJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgR0RIYW5kbGUgaW5EZXZpY2U7CisgICAgUmVjdCBvdXRBdmFpbGFibGVSZWN0OwogI2lmbmRlZiBHZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcwotCVB5TWFjX1BSRUNIRUNLKEdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5EZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0QXZhaWxhYmxlV2luZG93UG9zaXRpb25pbmdCb3VuZHMoaW5EZXZpY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdmFpbGFibGVSZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0QXZhaWxhYmxlUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzKGluRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXZhaWxhYmxlUmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEF2YWlsYWJsZVJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9EaXNhYmxlU2NyZWVuVXBkYXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgRGlzYWJsZVNjcmVlblVwZGF0ZXMKLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlU2NyZWVuVXBkYXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZVNjcmVlblVwZGF0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEaXNhYmxlU2NyZWVuVXBkYXRlcygpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGlzYWJsZVNjcmVlblVwZGF0ZXMoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRW5hYmxlU2NyZWVuVXBkYXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgRW5hYmxlU2NyZWVuVXBkYXRlcwotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZVNjcmVlblVwZGF0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZVNjcmVlblVwZGF0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmFibGVTY3JlZW5VcGRhdGVzKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFbmFibGVTY3JlZW5VcGRhdGVzKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX1BpblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVJlY3QgdGhlUmVjdDsKLQlQb2ludCB0aGVQdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgUmVjdCB0aGVSZWN0OworICAgIFBvaW50IHRoZVB0OwogI2lmbmRlZiBQaW5SZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soUGluUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGluUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQaW5SZWN0KCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgdGhlUHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFBpblJlY3QoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICB0aGVQdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldEdyYXlSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldEdyYXlSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRHcmF5UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRHcmF5UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRHcmF5UmduKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRHcmF5UmduKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9HZXRXaW5kb3dGcm9tUG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlDR3JhZlB0ciBwb3J0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OworICAgIENHcmFmUHRyIHBvcnQ7CiAjaWZuZGVmIEdldFdpbmRvd0Zyb21Qb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93RnJvbVBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0Zyb21Qb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdpbmRvd0Zyb21Qb3J0KHBvcnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRXaW5kb3dGcm9tUG9ydChwb3J0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX1doaWNoV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlsb25nIHB0cjsKKyAgICBsb25nIHB0cjsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJnB0cikgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JX3JlcyA9IFdpbk9ial9XaGljaFdpbmRvdygoV2luZG93UHRyKXB0cik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmcHRyKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9yZXMgPSBXaW5PYmpfV2hpY2hXaW5kb3coKFdpbmRvd1B0cilwdHIpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0ZpbmRXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlQb2ludCB0aGVQb2ludDsKLQlXaW5kb3dQdHIgdGhlV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUG9pbnQgdGhlUG9pbnQ7CisgICAgV2luZG93UHRyIHRoZVdpbmRvdzsKICNpZm5kZWYgRmluZFdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKEZpbmRXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbmRXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVBvaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRmluZFdpbmRvdyh0aGVQb2ludCwKLQkgICAgICAgICAgICAgICAgICZ0aGVXaW5kb3cpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIHRoZVdpbmRvdyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVBvaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmluZFdpbmRvdyh0aGVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVXaW5kb3cpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIHRoZVdpbmRvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIFdpbl9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJHZXROZXdDV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXROZXdDV2luZG93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB3aW5kb3dJRCwgV2luZG93UHRyIGJlaGluZCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiTmV3V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9OZXdXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzUmVjdCwgU3RyMjU1IHRpdGxlLCBCb29sZWFuIHZpc2libGUsIHNob3J0IHRoZVByb2MsIFdpbmRvd1B0ciBiZWhpbmQsIEJvb2xlYW4gZ29Bd2F5RmxhZywgbG9uZyByZWZDb24pIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkdldE5ld1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fR2V0TmV3V2luZG93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB3aW5kb3dJRCwgV2luZG93UHRyIGJlaGluZCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiTmV3Q1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fTmV3Q1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgc2hvcnQgcHJvY0lELCBXaW5kb3dQdHIgYmVoaW5kLCBCb29sZWFuIGdvQXdheUZsYWcsIGxvbmcgcmVmQ29uKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJDcmVhdGVOZXdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0NyZWF0ZU5ld1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93Q2xhc3Mgd2luZG93Q2xhc3MsIFdpbmRvd0F0dHJpYnV0ZXMgYXR0cmlidXRlcywgUmVjdCBjb250ZW50Qm91bmRzKSAtPiAoV2luZG93UHRyIG91dFdpbmRvdykiKX0sCi0JeyJDcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pV2luX0NyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHJlc0lEKSAtPiAoV2luZG93UHRyIG91dFdpbmRvdykiKX0sCi0JeyJTaG93RmxvYXRpbmdXaW5kb3dzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9TaG93RmxvYXRpbmdXaW5kb3dzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJIaWRlRmxvYXRpbmdXaW5kb3dzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9IaWRlRmxvYXRpbmdXaW5kb3dzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBcmVGbG9hdGluZ1dpbmRvd3NWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbl9BcmVGbG9hdGluZ1dpbmRvd3NWaXNpYmxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDaGVja1VwZGF0ZSIsIChQeUNGdW5jdGlvbilXaW5fQ2hlY2tVcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCB0aGVFdmVudCkiKX0sCi0JeyJNYWNGaW5kV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9NYWNGaW5kV2luZG93LCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0aGVQb2ludCkgLT4gKFdpbmRvd1BhcnRDb2RlIF9ydiwgV2luZG93UHRyIHdpbmRvdykiKX0sCi0JeyJGcm9udFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fRnJvbnRXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiRnJvbnROb25GbG9hdGluZ1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fRnJvbnROb25GbG9hdGluZ1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJHZXRGcm9udFdpbmRvd09mQ2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luX0dldEZyb250V2luZG93T2ZDbGFzcywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzcywgQm9vbGVhbiBtdXN0QmVWaXNpYmxlKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJGaW5kV2luZG93T2ZDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5fRmluZFdpbmRvd09mQ2xhc3MsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHdoZXJlLCBXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzKSAtPiAoV2luZG93UHRyIG91dFdpbmRvdywgV2luZG93UGFydENvZGUgb3V0V2luZG93UGFydCkiKX0sCi0JeyJDcmVhdGVTdGFuZGFyZFdpbmRvd01lbnUiLCAoUHlDRnVuY3Rpb24pV2luX0NyZWF0ZVN0YW5kYXJkV2luZG93TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoT3B0aW9uQml0cyBpbk9wdGlvbnMpIC0+IChNZW51SGFuZGxlIG91dE1lbnUpIil9LAotCXsiQ29sbGFwc2VBbGxXaW5kb3dzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9Db2xsYXBzZUFsbFdpbmRvd3MsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gY29sbGFwc2UpIC0+IE5vbmUiKX0sCi0JeyJHZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcyIsIChQeUNGdW5jdGlvbilXaW5fR2V0QXZhaWxhYmxlV2luZG93UG9zaXRpb25pbmdCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIGluRGV2aWNlKSAtPiAoUmVjdCBvdXRBdmFpbGFibGVSZWN0KSIpfSwKLQl7IkRpc2FibGVTY3JlZW5VcGRhdGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9EaXNhYmxlU2NyZWVuVXBkYXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRW5hYmxlU2NyZWVuVXBkYXRlcyIsIChQeUNGdW5jdGlvbilXaW5fRW5hYmxlU2NyZWVuVXBkYXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUGluUmVjdCIsIChQeUNGdW5jdGlvbilXaW5fUGluUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBQb2ludCB0aGVQdCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldEdyYXlSZ24iLCAoUHlDRnVuY3Rpb24pV2luX0dldEdyYXlSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiR2V0V2luZG93RnJvbVBvcnQiLCAoUHlDRnVuY3Rpb24pV2luX0dldFdpbmRvd0Zyb21Qb3J0LCAxLAotCSBQeURvY19TVFIoIihDR3JhZlB0ciBwb3J0KSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJXaGljaFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fV2hpY2hXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiUmVzb2x2ZSBhbiBpbnRlZ2VyIFdpbmRvd1B0ciBhZGRyZXNzIHRvIGEgV2luZG93IG9iamVjdCIpfSwKLQl7IkZpbmRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0ZpbmRXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZVBvaW50KSAtPiAoc2hvcnQgX3J2LCBXaW5kb3dQdHIgdGhlV2luZG93KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldE5ld0NXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0dldE5ld0NXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHdpbmRvd0lELCBXaW5kb3dQdHIgYmVoaW5kKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCisgICAgeyJOZXdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX05ld1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgc2hvcnQgdGhlUHJvYywgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBsb25nIHJlZkNvbikgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiR2V0TmV3V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXROZXdXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHdpbmRvd0lELCBXaW5kb3dQdHIgYmVoaW5kKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCisgICAgeyJOZXdDV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9OZXdDV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSB0aXRsZSwgQm9vbGVhbiB2aXNpYmxlLCBzaG9ydCBwcm9jSUQsIFdpbmRvd1B0ciBiZWhpbmQsIEJvb2xlYW4gZ29Bd2F5RmxhZywgbG9uZyByZWZDb24pIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkNyZWF0ZU5ld1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlTmV3V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dDbGFzcyB3aW5kb3dDbGFzcywgV2luZG93QXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBSZWN0IGNvbnRlbnRCb3VuZHMpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKKyAgICB7IkNyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlV2luZG93RnJvbVJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgcmVzSUQpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKKyAgICB7IlNob3dGbG9hdGluZ1dpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX1Nob3dGbG9hdGluZ1dpbmRvd3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkhpZGVGbG9hdGluZ1dpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX0hpZGVGbG9hdGluZ1dpbmRvd3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUiLCAoUHlDRnVuY3Rpb24pV2luX0FyZUZsb2F0aW5nV2luZG93c1Zpc2libGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNoZWNrVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbl9DaGVja1VwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKKyAgICB7Ik1hY0ZpbmRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX01hY0ZpbmRXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRoZVBvaW50KSAtPiAoV2luZG93UGFydENvZGUgX3J2LCBXaW5kb3dQdHIgd2luZG93KSIpfSwKKyAgICB7IkZyb250V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9Gcm9udFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCisgICAgeyJGcm9udE5vbkZsb2F0aW5nV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9Gcm9udE5vbkZsb2F0aW5nV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkdldEZyb250V2luZG93T2ZDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5fR2V0RnJvbnRXaW5kb3dPZkNsYXNzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzLCBCb29sZWFuIG11c3RCZVZpc2libGUpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkZpbmRXaW5kb3dPZkNsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9GaW5kV2luZG93T2ZDbGFzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgd2hlcmUsIFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3MpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93LCBXaW5kb3dQYXJ0Q29kZSBvdXRXaW5kb3dQYXJ0KSIpfSwKKyAgICB7IkNyZWF0ZVN0YW5kYXJkV2luZG93TWVudSIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51LCAxLAorICAgICBQeURvY19TVFIoIihPcHRpb25CaXRzIGluT3B0aW9ucykgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSkiKX0sCisgICAgeyJDb2xsYXBzZUFsbFdpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX0NvbGxhcHNlQWxsV2luZG93cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBjb2xsYXBzZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgaW5EZXZpY2UpIC0+IChSZWN0IG91dEF2YWlsYWJsZVJlY3QpIil9LAorICAgIHsiRGlzYWJsZVNjcmVlblVwZGF0ZXMiLCAoUHlDRnVuY3Rpb24pV2luX0Rpc2FibGVTY3JlZW5VcGRhdGVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJFbmFibGVTY3JlZW5VcGRhdGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9FbmFibGVTY3JlZW5VcGRhdGVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJQaW5SZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbl9QaW5SZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIFBvaW50IHRoZVB0KSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiR2V0R3JheVJnbiIsIChQeUNGdW5jdGlvbilXaW5fR2V0R3JheVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRXaW5kb3dGcm9tUG9ydCIsIChQeUNGdW5jdGlvbilXaW5fR2V0V2luZG93RnJvbVBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IldoaWNoV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9XaGljaFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCJSZXNvbHZlIGFuIGludGVnZXIgV2luZG93UHRyIGFkZHJlc3MgdG8gYSBXaW5kb3cgb2JqZWN0Iil9LAorICAgIHsiRmluZFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fRmluZFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUG9pbnQpIC0+IChzaG9ydCBfcnYsIFdpbmRvd1B0ciB0aGVXaW5kb3cpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9OwogCkBAIC0zMjEzLDUxICszMjEzLDUxIEBACiBQeU9iamVjdCAqCiBXaW5PYmpfV2hpY2hXaW5kb3coV2luZG93UHRyIHcpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqaXQ7CiAKLSAgICAgICAgaWYgKHcgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGl0ID0gUHlfTm9uZTsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgaXQgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGl0ID0gKFB5T2JqZWN0ICopIEdldFdSZWZDb24odyk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMIHx8ICFJc1BvaW50ZXJWYWxpZCgoUHRyKWl0KSB8fCAoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IHcgfHwgIVdpbk9ial9DaGVjayhpdCkpIHsKKyAgICAgICAgICAgIGl0ID0gV2luT2JqX05ldyh3KTsKKyAgICAgICAgICAgICgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9mcmVlaXQgPSBOVUxMOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGl0ID0gKFB5T2JqZWN0ICopIEdldFdSZWZDb24odyk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgIUlzUG9pbnRlclZhbGlkKChQdHIpaXQpIHx8ICgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gdyB8fCAhV2luT2JqX0NoZWNrKGl0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXQgPSBXaW5PYmpfTmV3KHcpOwotICAgICAgICAgICAgICAgICAgICAgICAgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2ZyZWVpdCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gaXQ7CisgICAgfQorICAgIHJldHVybiBpdDsKIH0KIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHZvaWQgaW5pdF9XaW4odm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFdpbmRvd1B0ciwgV2luT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoV2luZG93UHRyLCBXaW5PYmpfV2hpY2hXaW5kb3cpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChXaW5kb3dQdHIsIFdpbk9ial9Db252ZXJ0KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhXaW5kb3dQdHIsIFdpbk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFdpbmRvd1B0ciwgV2luT2JqX1doaWNoV2luZG93KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoV2luZG93UHRyLCBXaW5PYmpfQ29udmVydCk7CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9XaW4iLCBXaW5fbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9XaW4iLCBXaW5fbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JV2luX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoV2luX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgV2luX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JV2luZG93X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZXaW5kb3dfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZXaW5kb3dfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJXaW5kb3ciLCAoUHlPYmplY3QgKikmV2luZG93X1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmV2luZG93X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiV2luZG93VHlwZSIsIChQeU9iamVjdCAqKSZXaW5kb3dfVHlwZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgV2luX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoV2luX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgV2luX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgV2luZG93X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZXaW5kb3dfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZXaW5kb3dfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJXaW5kb3ciLCAoUHlPYmplY3QgKikmV2luZG93X1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmV2luZG93X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiV2luZG93VHlwZSIsIChQeU9iamVjdCAqKSZXaW5kb3dfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL3B5dGhvbncuYyBiL01hYy9Ub29scy9weXRob253LmMKaW5kZXggMTNkZjc5MC4uN2Y0NWNhOSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL3B5dGhvbncuYworKysgYi9NYWMvVG9vbHMvcHl0aG9udy5jCkBAIC0zNyw4ICszNyw4IEBACiAgKiBJbiBhIHJlZ3VsYXIgZnJhbWV3b3JrIHRoZSBzdHJ1Y3R1cmUgaXM6CiAgKgogICogICAgUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy8yLjcKLSAqICAgIAkJL1B5dGhvbgotICoJCS9SZXNvdXJjZXMvUHl0aG9uLmFwcC9Db250ZW50cy9NYWNPUy9QeXRob24KKyAqICAgICAgICAgICAgICAvUHl0aG9uCisgKiAgICAgICAgICAgICAgL1Jlc291cmNlcy9QeXRob24uYXBwL0NvbnRlbnRzL01hY09TL1B5dGhvbgogICoKICAqIEluIGEgdmlydHVhbGVudiBzdHlsZSBzdHJ1Y3R1cmUgdGhlIGV4cGVjdGVkCiAgKiBzdHJ1Y3R1cmUgaXM6CkBAIC00OCwxMjMgKzQ4LDEyMyBAQAogICogICAgICAgLy5QeXRob24gICA8LSB0aGUgZHlsaWIKICAqICAgICAgIC8uUmVzb3VyY2VzL1B5dGhvbi5hcHAvQ29udGVudHMvTWFjT1MvUHl0aG9uCiAgKgotICogTk9URTogdmlydHVhbGVudidzIGFyZSBub3QgYW4gb2ZmaWNpYWxseSBzdXBwb3J0ZWQgCisgKiBOT1RFOiB2aXJ0dWFsZW52J3MgYXJlIG5vdCBhbiBvZmZpY2lhbGx5IHN1cHBvcnRlZAogICogZmVhdHVyZSwgc3VwcG9ydCBmb3IgdGhhdCBzdHJ1Y3R1cmUgaXMgcHJvdmlkZWQgYXMKICAqIGEgY29udmVuaWVuY2UuCiAgKi8KIHN0YXRpYyBjaGFyKiBnZXRfcHl0aG9uX3BhdGgodm9pZCkKIHsKLQlzaXplX3QgbGVuOwotCURsX2luZm8gaW5mbzsKLQljaGFyKiBlbmQ7Ci0JY2hhciogZ19wYXRoOworICAgIHNpemVfdCBsZW47CisgICAgRGxfaW5mbyBpbmZvOworICAgIGNoYXIqIGVuZDsKKyAgICBjaGFyKiBnX3BhdGg7CiAKLQlpZiAoZGxhZGRyKFB5X0luaXRpYWxpemUsICZpbmZvKSA9PSAwKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZGxhZGRyKFB5X0luaXRpYWxpemUsICZpbmZvKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWxlbiA9IHN0cmxlbihpbmZvLmRsaV9mbmFtZSk7CisgICAgbGVuID0gc3RybGVuKGluZm8uZGxpX2ZuYW1lKTsKIAotCWdfcGF0aCA9IG1hbGxvYyhsZW4rNjApOwotCWlmIChnX3BhdGggPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZ19wYXRoID0gbWFsbG9jKGxlbis2MCk7CisgICAgaWYgKGdfcGF0aCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN0cmNweShnX3BhdGgsIGluZm8uZGxpX2ZuYW1lKTsKLQllbmQgPSBnX3BhdGggKyBsZW4gLSAxOwotCXdoaWxlIChlbmQgIT0gZ19wYXRoICYmICplbmQgIT0gJy8nKSB7Ci0JCWVuZCAtLTsKLQl9Ci0JZW5kKys7Ci0JaWYgKCplbmQgPT0gJy4nKSB7Ci0JCWVuZCsrOwotCX0KLQlzdHJjcHkoZW5kLCAiUmVzb3VyY2VzL1B5dGhvbi5hcHAvQ29udGVudHMvTWFjT1MvIiBQWVRIT05GUkFNRVdPUkspOworICAgIHN0cmNweShnX3BhdGgsIGluZm8uZGxpX2ZuYW1lKTsKKyAgICBlbmQgPSBnX3BhdGggKyBsZW4gLSAxOworICAgIHdoaWxlIChlbmQgIT0gZ19wYXRoICYmICplbmQgIT0gJy8nKSB7CisgICAgICAgIGVuZCAtLTsKKyAgICB9CisgICAgZW5kKys7CisgICAgaWYgKCplbmQgPT0gJy4nKSB7CisgICAgICAgIGVuZCsrOworICAgIH0KKyAgICBzdHJjcHkoZW5kLCAiUmVzb3VyY2VzL1B5dGhvbi5hcHAvQ29udGVudHMvTWFjT1MvIiBQWVRIT05GUkFNRVdPUkspOwogCi0JcmV0dXJuIGdfcGF0aDsKKyAgICByZXR1cm4gZ19wYXRoOwogfQogCiAjaWZkZWYgSEFWRV9TUEFXTl9ICiBzdGF0aWMgdm9pZAogc2V0dXBfc3Bhd25hdHRyKHBvc2l4X3NwYXduYXR0cl90KiBzcGF3bmF0dHIpCiB7Ci0Jc2l6ZV90IG9jb3VudDsKLQlzaXplX3QgY291bnQ7Ci0JY3B1X3R5cGVfdCBjcHVfdHlwZXNbMV07Ci0Jc2hvcnQgZmxhZ3MgPSAwOworICAgIHNpemVfdCBvY291bnQ7CisgICAgc2l6ZV90IGNvdW50OworICAgIGNwdV90eXBlX3QgY3B1X3R5cGVzWzFdOworICAgIHNob3J0IGZsYWdzID0gMDsKICNpZmRlZiBfX0xQNjRfXwotCWludCAgIGNoOworICAgIGludCAgIGNoOwogI2VuZGlmCiAKLQlpZiAoKGVycm5vID0gcG9zaXhfc3Bhd25hdHRyX2luaXQoc3Bhd25hdHRyKSkgIT0gMCkgewotCQllcnIoMiwgInBvc2l4X3NwYXduYXR0cl9pbnQiKTsKLQkJLyogTk9UUkVBQ0hURUQgKi8KLQl9CisgICAgaWYgKChlcnJubyA9IHBvc2l4X3NwYXduYXR0cl9pbml0KHNwYXduYXR0cikpICE9IDApIHsKKyAgICAgICAgZXJyKDIsICJwb3NpeF9zcGF3bmF0dHJfaW50Iik7CisgICAgICAgIC8qIE5PVFJFQUNIVEVEICovCisgICAgfQogCi0JY291bnQgPSAxOworICAgIGNvdW50ID0gMTsKIAotCS8qIFJ1biB0aGUgcmVhbCBweXRob24gZXhlY3V0YWJsZSB1c2luZyB0aGUgc2FtZSBhcmNoaXR1cmUgYXMgdGhpcyAKLQkgKiBleGVjdXRhYmxlLCB0aGlzIGFsbG93cyB1c2VycyB0byBjb250cm9sZSB0aGUgYXJjaGl0ZWN0dXJlIHVzaW5nIAotCSAqICJhcmNoIC1wcGMgcHl0aG9uIgotCSAqLworICAgIC8qIFJ1biB0aGUgcmVhbCBweXRob24gZXhlY3V0YWJsZSB1c2luZyB0aGUgc2FtZSBhcmNoaXR1cmUgYXMgdGhpcworICAgICAqIGV4ZWN1dGFibGUsIHRoaXMgYWxsb3dzIHVzZXJzIHRvIGNvbnRyb2xlIHRoZSBhcmNoaXRlY3R1cmUgdXNpbmcKKyAgICAgKiAiYXJjaCAtcHBjIHB5dGhvbiIKKyAgICAgKi8KIAogI2lmIGRlZmluZWQoX19wcGM2NF9fKQotCWNwdV90eXBlc1swXSA9IENQVV9UWVBFX1BPV0VSUEM2NDsKKyAgICBjcHVfdHlwZXNbMF0gPSBDUFVfVFlQRV9QT1dFUlBDNjQ7CiAKICNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKLQljcHVfdHlwZXNbMF0gPSBDUFVfVFlQRV9YODZfNjQ7CisgICAgY3B1X3R5cGVzWzBdID0gQ1BVX1RZUEVfWDg2XzY0OwogCiAjZWxpZiBkZWZpbmVkKF9fcHBjX18pCi0JY3B1X3R5cGVzWzBdID0gQ1BVX1RZUEVfUE9XRVJQQzsKKyAgICBjcHVfdHlwZXNbMF0gPSBDUFVfVFlQRV9QT1dFUlBDOwogI2VsaWYgZGVmaW5lZChfX2kzODZfXykKLQljcHVfdHlwZXNbMF0gPSBDUFVfVFlQRV9YODY7CisgICAgY3B1X3R5cGVzWzBdID0gQ1BVX1RZUEVfWDg2OwogI2Vsc2UKLSMJZXJyb3IgIlVua25vd24gQ1BVIgorIyAgICAgICBlcnJvciAiVW5rbm93biBDUFUiCiAjZW5kaWYKIAotCWlmIChwb3NpeF9zcGF3bmF0dHJfc2V0YmlucHJlZl9ucChzcGF3bmF0dHIsIGNvdW50LCAKLQkJCQljcHVfdHlwZXMsICZvY291bnQpID09IC0xKSB7Ci0JCWVycigxLCAicG9zaXhfc3Bhd25hdHRyX3NldGJpbnByZWYiKTsKLQkJLyogTk9UUkVBQ0hURUQgKi8KLQl9Ci0JaWYgKGNvdW50ICE9IG9jb3VudCkgewotCQlmcHJpbnRmKHN0ZGVyciwgInBvc2l4X3NwYXduYXR0cl9zZXRiaW5wcmVmIGZhaWxlZCB0byBjb3B5XG4iKTsKLQkJZXhpdCgxKTsKLQkJLyogTk9UUkVBQ0hURUQgKi8KLQl9CisgICAgaWYgKHBvc2l4X3NwYXduYXR0cl9zZXRiaW5wcmVmX25wKHNwYXduYXR0ciwgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X3R5cGVzLCAmb2NvdW50KSA9PSAtMSkgeworICAgICAgICBlcnIoMSwgInBvc2l4X3NwYXduYXR0cl9zZXRiaW5wcmVmIik7CisgICAgICAgIC8qIE5PVFJFQUNIVEVEICovCisgICAgfQorICAgIGlmIChjb3VudCAhPSBvY291bnQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJwb3NpeF9zcGF3bmF0dHJfc2V0YmlucHJlZiBmYWlsZWQgdG8gY29weVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgICAgIC8qIE5PVFJFQUNIVEVEICovCisgICAgfQogCiAKLQkvKiAKLQkgKiBTZXQgZmxhZyB0aGF0IGNhdXNlcyBwb3NpeF9zcGF3biB0byBiZWhhdmUgbGlrZSBleGVjdgotCSAqLwotCWZsYWdzIHw9IFBPU0lYX1NQQVdOX1NFVEVYRUM7Ci0JaWYgKChlcnJubyA9IHBvc2l4X3NwYXduYXR0cl9zZXRmbGFncyhzcGF3bmF0dHIsIGZsYWdzKSkgIT0gMCkgewotCQllcnIoMSwgInBvc2l4X3NwYXduYXR0cl9zZXRmbGFncyIpOwotCQkvKiBOT1RSRUFDSFRFRCAqLwotCX0KKyAgICAvKgorICAgICAqIFNldCBmbGFnIHRoYXQgY2F1c2VzIHBvc2l4X3NwYXduIHRvIGJlaGF2ZSBsaWtlIGV4ZWN2CisgICAgICovCisgICAgZmxhZ3MgfD0gUE9TSVhfU1BBV05fU0VURVhFQzsKKyAgICBpZiAoKGVycm5vID0gcG9zaXhfc3Bhd25hdHRyX3NldGZsYWdzKHNwYXduYXR0ciwgZmxhZ3MpKSAhPSAwKSB7CisgICAgICAgIGVycigxLCAicG9zaXhfc3Bhd25hdHRyX3NldGZsYWdzIik7CisgICAgICAgIC8qIE5PVFJFQUNIVEVEICovCisgICAgfQogfQogI2VuZGlmCiAKLWludCAKK2ludAogbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLQljaGFyKiBleGVjX3BhdGggPSBnZXRfcHl0aG9uX3BhdGgoKTsKKyAgICBjaGFyKiBleGVjX3BhdGggPSBnZXRfcHl0aG9uX3BhdGgoKTsKIAogI2lmZGVmIEhBVkVfU1BBV05fSAogCi0JLyogV2UncmUgd2Vhay1saW5raW5nIHRvIHBvc2l4LXNwYXdudiB0byBlbnN1cmUgdGhhdAotCSAqIGFuIGV4ZWN1dGFibGUgYnVpbGQgb24gMTAuNSBjYW4gd29yayBvbiAxMC40LgotCSAqLwotCWlmIChwb3NpeF9zcGF3biAhPSBOVUxMKSB7Ci0JCXBvc2l4X3NwYXduYXR0cl90IHNwYXduYXR0ciA9IE5VTEw7CisgICAgLyogV2UncmUgd2Vhay1saW5raW5nIHRvIHBvc2l4LXNwYXdudiB0byBlbnN1cmUgdGhhdAorICAgICAqIGFuIGV4ZWN1dGFibGUgYnVpbGQgb24gMTAuNSBjYW4gd29yayBvbiAxMC40LgorICAgICAqLworICAgIGlmIChwb3NpeF9zcGF3biAhPSBOVUxMKSB7CisgICAgICAgIHBvc2l4X3NwYXduYXR0cl90IHNwYXduYXR0ciA9IE5VTEw7CiAKIAotCQlzZXR1cF9zcGF3bmF0dHIoJnNwYXduYXR0cik7CQkKLQkJcG9zaXhfc3Bhd24oTlVMTCwgZXhlY19wYXRoLCBOVUxMLAotCQkJJnNwYXduYXR0ciwgYXJndiwgZW52aXJvbik7Ci0JCWVycigxLCAicG9zaXhfc3Bhd246ICVzIiwgZXhlY19wYXRoKTsKLQl9CisgICAgICAgIHNldHVwX3NwYXduYXR0cigmc3Bhd25hdHRyKTsKKyAgICAgICAgcG9zaXhfc3Bhd24oTlVMTCwgZXhlY19wYXRoLCBOVUxMLAorICAgICAgICAgICAgJnNwYXduYXR0ciwgYXJndiwgZW52aXJvbik7CisgICAgICAgIGVycigxLCAicG9zaXhfc3Bhd246ICVzIiwgZXhlY19wYXRoKTsKKyAgICB9CiAjZW5kaWYKLQlleGVjdmUoZXhlY19wYXRoLCBhcmd2LCBlbnZpcm9uKTsKLQllcnIoMSwgImV4ZWN2ZTogJXMiLCBhcmd2WzBdKTsKLQkvKiBOT1RSRUFDSEVEICovCisgICAgZXhlY3ZlKGV4ZWNfcGF0aCwgYXJndiwgZW52aXJvbik7CisgICAgZXJyKDEsICJleGVjdmU6ICVzIiwgYXJndlswXSk7CisgICAgLyogTk9UUkVBQ0hFRCAqLwogfQpkaWZmIC0tZ2l0IGEvTWlzYy9zZXR1aWQtcHJvZy5jIGIvTWlzYy9zZXR1aWQtcHJvZy5jCmluZGV4IGQ4NTBiNDcuLjcyNTc0OWQgMTAwNjQ0Ci0tLSBhL01pc2Mvc2V0dWlkLXByb2cuYworKysgYi9NaXNjL3NldHVpZC1wcm9nLmMKQEAgLTIxLDI4ICsyMSwyOCBAQAogCiAgICBBc3N1bWluZyB0aGUgc2NyaXB0IGlzIGEgQm91cm5lIHNoZWxsIHNjcmlwdCwgdGhlIGZpcnN0IGxpbmUgb2YgdGhlCiAgICBzY3JpcHQgc2hvdWxkIGJlCi0JIyEvYmluL3NoIC0KKyAgICAjIS9iaW4vc2ggLQogICAgVGhlIC0gaXMgaW1wb3J0YW50LCBkb24ndCBvbWl0IGl0LiAgSWYgeW91J3JlIHVzaW5nIGVzaCwgdGhlIGZpcnN0CiAgICBsaW5lIHNob3VsZCBiZQotCSMhL3Vzci9sb2NhbC9iaW4vZXNoIC1mCisgICAgIyEvdXNyL2xvY2FsL2Jpbi9lc2ggLWYKICAgIGFuZCBmb3Iga3NoLCB0aGUgZmlyc3QgbGluZSBzaG91bGQgYmUKLQkjIS91c3IvbG9jYWwvYmluL2tzaCAtcAorICAgICMhL3Vzci9sb2NhbC9iaW4va3NoIC1wCiAgICBUaGUgc2NyaXB0IHNob3VsZCB0aGVuIHNldCB0aGUgdmFyaWFibGUgSUZTIHRvIHRoZSBzdHJpbmcKICAgIGNvbnNpc3Rpbmcgb2YgPHNwYWNlPiwgPHRhYj4sIGFuZCA8bmV3bGluZT4uICBBZnRlciB0aGlzICgqbm90KgogICAgYmVmb3JlISksIHRoZSBQQVRIIHZhcmlhYmxlIHNob3VsZCBiZSBzZXQgdG8gYSByZWFzb25hYmxlIHZhbHVlIGFuZAogICAgZXhwb3J0ZWQuICBEbyBub3QgZXhwZWN0IHRoZSBQQVRIIHRvIGhhdmUgYSByZWFzb25hYmxlIHZhbHVlLCBzbyBkbwogICAgbm90IHRydXN0IHRoZSBvbGQgdmFsdWUgb2YgUEFUSC4gIFlvdSBzaG91bGQgdGhlbiBzZXQgdGhlIHVtYXNrIG9mCiAgICB0aGUgcHJvZ3JhbSBieSBjYWxsaW5nCi0JdW1hc2sgMDc3ICMgb3IgMDIyIGlmIHlvdSB3YW50IHRoZSBmaWxlcyB0byBiZSByZWFkYWJsZQorICAgIHVtYXNrIDA3NyAjIG9yIDAyMiBpZiB5b3Ugd2FudCB0aGUgZmlsZXMgdG8gYmUgcmVhZGFibGUKICAgIElmIHlvdSBwbGFuIHRvIGNoYW5nZSBkaXJlY3RvcmllcywgeW91IHNob3VsZCBlaXRoZXIgdW5zZXQgQ0RQQVRICiAgICBvciBzZXQgaXQgdG8gYSBnb29kIHZhbHVlLiAgU2V0dGluZyBDRFBBVEggdG8ganVzdCBgYC4nJyAoZG90KSBpcyBhCiAgICBnb29kIGlkZWEuCiAgICBJZiwgZm9yIHNvbWUgcmVhc29uLCB5b3Ugd2FudCB0byB1c2UgY3NoLCB0aGUgZmlyc3QgbGluZSBzaG91bGQgYmUKLQkjIS9iaW4vY3NoIC1mYgorICAgICMhL2Jpbi9jc2ggLWZiCiAgICBZb3Ugc2hvdWxkIHRoZW4gc2V0IHRoZSBwYXRoIHZhcmlhYmxlIHRvIHNvbWV0aGluZyByZWFzb25hYmxlLAogICAgd2l0aG91dCB0cnVzdGluZyB0aGUgaW5oZXJpdGVkIHBhdGguICBIZXJlIHRvbywgeW91IHNob3VsZCBzZXQgdGhlCiAgICB1bWFzayB1c2luZyB0aGUgY29tbWFuZAotCXVtYXNrIDA3NyAjIG9yIDAyMiBpZiB5b3Ugd2FudCB0aGUgZmlsZXMgdG8gYmUgcmVhZGFibGUKKyAgICB1bWFzayAwNzcgIyBvciAwMjIgaWYgeW91IHdhbnQgdGhlIGZpbGVzIHRvIGJlIHJlYWRhYmxlCiAqLwogCiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC01NCwxNCArNTQsMTQgQEAKIAogLyogQ09ORklHVVJBVElPTiBTRUNUSU9OICovCiAKLSNpZm5kZWYgRlVMTF9QQVRICS8qIHNvIHRoYXQgdGhpcyBjYW4gYmUgc3BlY2lmaWVkIGZyb20gdGhlIE1ha2VmaWxlICovCisjaWZuZGVmIEZVTExfUEFUSCAgICAgICAvKiBzbyB0aGF0IHRoaXMgY2FuIGJlIHNwZWNpZmllZCBmcm9tIHRoZSBNYWtlZmlsZSAqLwogLyogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZToKLSNkZWZpbmUgRlVMTF9QQVRICSIvZnVsbC9wYXRoL29mL3NjcmlwdCIgCisjZGVmaW5lIEZVTExfUEFUSCAgICAgICAiL2Z1bGwvcGF0aC9vZi9zY3JpcHQiCiAqIFRoZW4gY29tbWVudCBvdXQgdGhlICNlcnJvciBsaW5lLiAqLwogI2Vycm9yICJZb3UgbXVzdCBkZWZpbmUgRlVMTF9QQVRIIHNvbWV3aGVyZSIKICNlbmRpZgogI2lmbmRlZiBVTUFTSwotI2RlZmluZSBVTUFTSwkJMDc3CisjZGVmaW5lIFVNQVNLICAgICAgICAgICAwNzcKICNlbmRpZgogCiAvKiBFTkQgT0YgQ09ORklHVVJBVElPTiBTRUNUSU9OICovCkBAIC0xMDEsNzYgKzEwMSw3NiBAQAogdm9pZAogY2xlYW5fZW52aXJvbih2b2lkKQogewotCWNoYXIgKipwOwotCWV4dGVybiBjaGFyICoqZW52aXJvbjsKKyAgICBjaGFyICoqcDsKKyAgICBleHRlcm4gY2hhciAqKmVudmlyb247CiAKLQlmb3IgKHAgPSBlbnZpcm9uOyAqcDsgcCsrKSB7Ci0JCWlmIChzdHJuY21wKCpwLCAiTERfIiwgMykgPT0gMCkKLQkJCSoqcCA9ICdYJzsKLQkJZWxzZSBpZiAoc3RybmNtcCgqcCwgIl9STEQiLCA0KSA9PSAwKQotCQkJKipwID0gJ1gnOwotCQllbHNlIGlmIChzdHJuY21wKCpwLCAiUFlUSE9OIiwgNikgPT0gMCkKLQkJCSoqcCA9ICdYJzsKLQkJZWxzZSBpZiAoc3RybmNtcCgqcCwgIklGUz0iLCA0KSA9PSAwKQotCQkJKnAgPSBkZWZfSUZTOwotCQllbHNlIGlmIChzdHJuY21wKCpwLCAiQ0RQQVRIPSIsIDcpID09IDApCi0JCQkqcCA9IGRlZl9DRFBBVEg7Ci0JCWVsc2UgaWYgKHN0cm5jbXAoKnAsICJFTlY9IiwgNCkgPT0gMCkKLQkJCSpwID0gZGVmX0VOVjsKLQl9Ci0JcHV0ZW52KGRlZl9QQVRIKTsKKyAgICBmb3IgKHAgPSBlbnZpcm9uOyAqcDsgcCsrKSB7CisgICAgICAgIGlmIChzdHJuY21wKCpwLCAiTERfIiwgMykgPT0gMCkKKyAgICAgICAgICAgICoqcCA9ICdYJzsKKyAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgqcCwgIl9STEQiLCA0KSA9PSAwKQorICAgICAgICAgICAgKipwID0gJ1gnOworICAgICAgICBlbHNlIGlmIChzdHJuY21wKCpwLCAiUFlUSE9OIiwgNikgPT0gMCkKKyAgICAgICAgICAgICoqcCA9ICdYJzsKKyAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgqcCwgIklGUz0iLCA0KSA9PSAwKQorICAgICAgICAgICAgKnAgPSBkZWZfSUZTOworICAgICAgICBlbHNlIGlmIChzdHJuY21wKCpwLCAiQ0RQQVRIPSIsIDcpID09IDApCisgICAgICAgICAgICAqcCA9IGRlZl9DRFBBVEg7CisgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKnAsICJFTlY9IiwgNCkgPT0gMCkKKyAgICAgICAgICAgICpwID0gZGVmX0VOVjsKKyAgICB9CisgICAgcHV0ZW52KGRlZl9QQVRIKTsKIH0KIAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQlzdHJ1Y3Qgc3RhdCBzdGF0YjsKLQlnaWRfdCBlZ2lkID0gZ2V0ZWdpZCgpOwotCXVpZF90IGV1aWQgPSBnZXRldWlkKCk7CisgICAgc3RydWN0IHN0YXQgc3RhdGI7CisgICAgZ2lkX3QgZWdpZCA9IGdldGVnaWQoKTsKKyAgICB1aWRfdCBldWlkID0gZ2V0ZXVpZCgpOwogCi0JLyoKLQkgICBTYW5pdHkgY2hlY2sgIzEuCi0JICAgVGhpcyBjaGVjayBzaG91bGQgYmUgbWFkZSBjb21waWxlLXRpbWUsIGJ1dCB0aGF0J3Mgbm90IHBvc3NpYmxlLgotCSAgIElmIHlvdSdyZSBzdXJlIHRoYXQgeW91IHNwZWNpZmllZCBhIGZ1bGwgcGF0aCBuYW1lIGZvciBGVUxMX1BBVEgsCi0JICAgeW91IGNhbiBvbWl0IHRoaXMgY2hlY2suCi0JKi8KLQlpZiAoRlVMTF9QQVRIWzBdICE9ICcvJykgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyBpcyBub3QgYSBmdWxsIHBhdGggbmFtZVxuIiwgYXJndlswXSwKLQkJCUZVTExfUEFUSCk7Ci0JCWZwcmludGYoc3RkZXJyLCAiWW91IGNhbiBvbmx5IHVzZSB0aGlzIHdyYXBwZXIgaWYgeW91XG4iKTsKLQkJZnByaW50ZihzdGRlcnIsICJjb21waWxlIGl0IHdpdGggYW4gYWJzb2x1dGUgcGF0aC5cbiIpOwotCQlleGl0KDEpOwotCX0KKyAgICAvKgorICAgICAgIFNhbml0eSBjaGVjayAjMS4KKyAgICAgICBUaGlzIGNoZWNrIHNob3VsZCBiZSBtYWRlIGNvbXBpbGUtdGltZSwgYnV0IHRoYXQncyBub3QgcG9zc2libGUuCisgICAgICAgSWYgeW91J3JlIHN1cmUgdGhhdCB5b3Ugc3BlY2lmaWVkIGEgZnVsbCBwYXRoIG5hbWUgZm9yIEZVTExfUEFUSCwKKyAgICAgICB5b3UgY2FuIG9taXQgdGhpcyBjaGVjay4KKyAgICAqLworICAgIGlmIChGVUxMX1BBVEhbMF0gIT0gJy8nKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzIGlzIG5vdCBhIGZ1bGwgcGF0aCBuYW1lXG4iLCBhcmd2WzBdLAorICAgICAgICAgICAgRlVMTF9QQVRIKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJZb3UgY2FuIG9ubHkgdXNlIHRoaXMgd3JhcHBlciBpZiB5b3VcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvbXBpbGUgaXQgd2l0aCBhbiBhYnNvbHV0ZSBwYXRoLlxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQogCi0JLyoKLQkgICBTYW5pdHkgY2hlY2sgIzIuCi0JICAgQ2hlY2sgdGhhdCB0aGUgb3duZXIgb2YgdGhlIHNjcmlwdCBpcyBlcXVhbCB0byBlaXRoZXIgdGhlCi0JICAgZWZmZWN0aXZlIHVpZCBvciB0aGUgc3VwZXIgdXNlci4KLQkqLwotCWlmIChzdGF0KEZVTExfUEFUSCwgJnN0YXRiKSA8IDApIHsKLQkJcGVycm9yKCJzdGF0Iik7Ci0JCWV4aXQoMSk7Ci0JfQotCWlmIChzdGF0Yi5zdF91aWQgIT0gMCAmJiBzdGF0Yi5zdF91aWQgIT0gZXVpZCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyBoYXMgdGhlIHdyb25nIG93bmVyXG4iLCBhcmd2WzBdLAotCQkJRlVMTF9QQVRIKTsKLQkJZnByaW50ZihzdGRlcnIsICJUaGUgc2NyaXB0IHNob3VsZCBiZSBvd25lZCBieSByb290LFxuIik7Ci0JCWZwcmludGYoc3RkZXJyLCAiYW5kIHNob3VsZG4ndCBiZSB3cml0ZWFibGUgYnkgYW55b25lLlxuIik7Ci0JCWV4aXQoMSk7Ci0JfQorICAgIC8qCisgICAgICAgU2FuaXR5IGNoZWNrICMyLgorICAgICAgIENoZWNrIHRoYXQgdGhlIG93bmVyIG9mIHRoZSBzY3JpcHQgaXMgZXF1YWwgdG8gZWl0aGVyIHRoZQorICAgICAgIGVmZmVjdGl2ZSB1aWQgb3IgdGhlIHN1cGVyIHVzZXIuCisgICAgKi8KKyAgICBpZiAoc3RhdChGVUxMX1BBVEgsICZzdGF0YikgPCAwKSB7CisgICAgICAgIHBlcnJvcigic3RhdCIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBpZiAoc3RhdGIuc3RfdWlkICE9IDAgJiYgc3RhdGIuc3RfdWlkICE9IGV1aWQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXMgaGFzIHRoZSB3cm9uZyBvd25lclxuIiwgYXJndlswXSwKKyAgICAgICAgICAgIEZVTExfUEFUSCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIHNjcmlwdCBzaG91bGQgYmUgb3duZWQgYnkgcm9vdCxcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFuZCBzaG91bGRuJ3QgYmUgd3JpdGVhYmxlIGJ5IGFueW9uZS5cbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KIAotCWlmIChzZXRyZWdpZChlZ2lkLCBlZ2lkKSA8IDApCi0JCXBlcnJvcigic2V0cmVnaWQiKTsKLQlpZiAoc2V0cmV1aWQoZXVpZCwgZXVpZCkgPCAwKQotCQlwZXJyb3IoInNldHJldWlkIik7CisgICAgaWYgKHNldHJlZ2lkKGVnaWQsIGVnaWQpIDwgMCkKKyAgICAgICAgcGVycm9yKCJzZXRyZWdpZCIpOworICAgIGlmIChzZXRyZXVpZChldWlkLCBldWlkKSA8IDApCisgICAgICAgIHBlcnJvcigic2V0cmV1aWQiKTsKIAotCWNsZWFuX2Vudmlyb24oKTsKKyAgICBjbGVhbl9lbnZpcm9uKCk7CiAKLQl1bWFzayhVTUFTSyk7CisgICAgdW1hc2soVU1BU0spOwogCi0Jd2hpbGUgKCoqYXJndiA9PSAnLScpCS8qIGRvbid0IGxldCBhcmd2WzBdIHN0YXJ0IHdpdGggJy0nICovCi0JCSgqYXJndikrKzsKLQlleGVjdihGVUxMX1BBVEgsIGFyZ3YpOwotCWZwcmludGYoc3RkZXJyLCAiJXM6IGNvdWxkIG5vdCBleGVjdXRlIHRoZSBzY3JpcHRcbiIsIGFyZ3ZbMF0pOwotCWV4aXQoMSk7CisgICAgd2hpbGUgKCoqYXJndiA9PSAnLScpICAgICAgIC8qIGRvbid0IGxldCBhcmd2WzBdIHN0YXJ0IHdpdGggJy0nICovCisgICAgICAgICgqYXJndikrKzsKKyAgICBleGVjdihGVUxMX1BBVEgsIGFyZ3YpOworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvdWxkIG5vdCBleGVjdXRlIHRoZSBzY3JpcHRcbiIsIGFyZ3ZbMF0pOworICAgIGV4aXQoMSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYyBiL01vZHVsZXMvX2Jpc2VjdG1vZHVsZS5jCmluZGV4IGI3ODQ3NmQuLmU4OTc2YjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2Jpc2VjdG1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2Jpc2VjdG1vZHVsZS5jCkBAIC04LDUxICs4LDUxIEBACiBzdGF0aWMgUHlfc3NpemVfdAogaW50ZXJuYWxfYmlzZWN0X3JpZ2h0KFB5T2JqZWN0ICpsaXN0LCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBsbywgUHlfc3NpemVfdCBoaSkKIHsKLQlQeU9iamVjdCAqbGl0ZW07Ci0JUHlfc3NpemVfdCBtaWQsIHJlczsKKyAgICBQeU9iamVjdCAqbGl0ZW07CisgICAgUHlfc3NpemVfdCBtaWQsIHJlczsKIAotCWlmIChsbyA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChoaSA9PSAtMSkgewotCQloaSA9IFB5U2VxdWVuY2VfU2l6ZShsaXN0KTsKLQkJaWYgKGhpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0Jd2hpbGUgKGxvIDwgaGkpIHsKLQkJbWlkID0gKGxvICsgaGkpIC8gMjsKLQkJbGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0obGlzdCwgbWlkKTsKLQkJaWYgKGxpdGVtID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJlcyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCBsaXRlbSwgUHlfTFQpOwotCQlQeV9ERUNSRUYobGl0ZW0pOwotCQlpZiAocmVzIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHJlcykKLQkJCWhpID0gbWlkOwotCQllbHNlCi0JCQlsbyA9IG1pZCArIDE7Ci0JfQotCXJldHVybiBsbzsKKyAgICBpZiAobG8gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibG8gbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaGkgPT0gLTEpIHsKKyAgICAgICAgaGkgPSBQeVNlcXVlbmNlX1NpemUobGlzdCk7CisgICAgICAgIGlmIChoaSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHdoaWxlIChsbyA8IGhpKSB7CisgICAgICAgIG1pZCA9IChsbyArIGhpKSAvIDI7CisgICAgICAgIGxpdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGxpc3QsIG1pZCk7CisgICAgICAgIGlmIChsaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgbGl0ZW0sIFB5X0xUKTsKKyAgICAgICAgUHlfREVDUkVGKGxpdGVtKTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICBoaSA9IG1pZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG8gPSBtaWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gbG87CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaXNlY3RfcmlnaHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmxpc3QsICppdGVtOwotCVB5X3NzaXplX3QgbG8gPSAwOwotCVB5X3NzaXplX3QgaGkgPSAtMTsKLQlQeV9zc2l6ZV90IGluZGV4OwotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJhIiwgIngiLCAibG8iLCAiaGkiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqbGlzdCwgKml0ZW07CisgICAgUHlfc3NpemVfdCBsbyA9IDA7CisgICAgUHlfc3NpemVfdCBoaSA9IC0xOworICAgIFB5X3NzaXplX3QgaW5kZXg7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImEiLCAieCIsICJsbyIsICJoaSIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPT3xubjpiaXNlY3RfcmlnaHQiLAotCQlrZXl3b3JkcywgJmxpc3QsICZpdGVtLCAmbG8sICZoaSkpCi0JCXJldHVybiBOVUxMOwotCWluZGV4ID0gaW50ZXJuYWxfYmlzZWN0X3JpZ2h0KGxpc3QsIGl0ZW0sIGxvLCBoaSk7Ci0JaWYgKGluZGV4IDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGluZGV4KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG5uOmJpc2VjdF9yaWdodCIsCisgICAgICAgIGtleXdvcmRzLCAmbGlzdCwgJml0ZW0sICZsbywgJmhpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaW5kZXggPSBpbnRlcm5hbF9iaXNlY3RfcmlnaHQobGlzdCwgaXRlbSwgbG8sIGhpKTsKKyAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoaW5kZXgpOwogfQogCiBQeURvY19TVFJWQVIoYmlzZWN0X3JpZ2h0X2RvYywKQEAgLTcwLDMwICs3MCwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGluc29ydF9yaWdodChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqbGlzdCwgKml0ZW0sICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCBsbyA9IDA7Ci0JUHlfc3NpemVfdCBoaSA9IC0xOwotCVB5X3NzaXplX3QgaW5kZXg7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImEiLCAieCIsICJsbyIsICJoaSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpsaXN0LCAqaXRlbSwgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGxvID0gMDsKKyAgICBQeV9zc2l6ZV90IGhpID0gLTE7CisgICAgUHlfc3NpemVfdCBpbmRleDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYSIsICJ4IiwgImxvIiwgImhpIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG5uOmluc29ydF9yaWdodCIsCi0JCWtleXdvcmRzLCAmbGlzdCwgJml0ZW0sICZsbywgJmhpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5kZXggPSBpbnRlcm5hbF9iaXNlY3RfcmlnaHQobGlzdCwgaXRlbSwgbG8sIGhpKTsKLQlpZiAoaW5kZXggPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlMaXN0X0NoZWNrRXhhY3QobGlzdCkpIHsKLQkJaWYgKFB5TGlzdF9JbnNlcnQobGlzdCwgaW5kZXgsIGl0ZW0pIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QobGlzdCwgImluc2VydCIsICJuTyIsCi0JCQkJCSAgICAgaW5kZXgsIGl0ZW0pOwotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098bm46aW5zb3J0X3JpZ2h0IiwKKyAgICAgICAga2V5d29yZHMsICZsaXN0LCAmaXRlbSwgJmxvLCAmaGkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbmRleCA9IGludGVybmFsX2Jpc2VjdF9yaWdodChsaXN0LCBpdGVtLCBsbywgaGkpOworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeUxpc3RfQ2hlY2tFeGFjdChsaXN0KSkgeworICAgICAgICBpZiAoUHlMaXN0X0luc2VydChsaXN0LCBpbmRleCwgaXRlbSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChsaXN0LCAiaW5zZXJ0IiwgIm5PIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgaXRlbSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICB9CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGluc29ydF9yaWdodF9kb2MsCkBAIC0xMDksNTEgKzEwOSw1MSBAQAogc3RhdGljIFB5X3NzaXplX3QKIGludGVybmFsX2Jpc2VjdF9sZWZ0KFB5T2JqZWN0ICpsaXN0LCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBsbywgUHlfc3NpemVfdCBoaSkKIHsKLQlQeU9iamVjdCAqbGl0ZW07Ci0JUHlfc3NpemVfdCBtaWQsIHJlczsKKyAgICBQeU9iamVjdCAqbGl0ZW07CisgICAgUHlfc3NpemVfdCBtaWQsIHJlczsKIAotCWlmIChsbyA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChoaSA9PSAtMSkgewotCQloaSA9IFB5U2VxdWVuY2VfU2l6ZShsaXN0KTsKLQkJaWYgKGhpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0Jd2hpbGUgKGxvIDwgaGkpIHsKLQkJbWlkID0gKGxvICsgaGkpIC8gMjsKLQkJbGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0obGlzdCwgbWlkKTsKLQkJaWYgKGxpdGVtID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJlcyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChsaXRlbSwgaXRlbSwgUHlfTFQpOwotCQlQeV9ERUNSRUYobGl0ZW0pOwotCQlpZiAocmVzIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHJlcykKLQkJCWxvID0gbWlkICsgMTsKLQkJZWxzZQotCQkJaGkgPSBtaWQ7Ci0JfQotCXJldHVybiBsbzsKKyAgICBpZiAobG8gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibG8gbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaGkgPT0gLTEpIHsKKyAgICAgICAgaGkgPSBQeVNlcXVlbmNlX1NpemUobGlzdCk7CisgICAgICAgIGlmIChoaSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHdoaWxlIChsbyA8IGhpKSB7CisgICAgICAgIG1pZCA9IChsbyArIGhpKSAvIDI7CisgICAgICAgIGxpdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGxpc3QsIG1pZCk7CisgICAgICAgIGlmIChsaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wobGl0ZW0sIGl0ZW0sIFB5X0xUKTsKKyAgICAgICAgUHlfREVDUkVGKGxpdGVtKTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICBsbyA9IG1pZCArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhpID0gbWlkOworICAgIH0KKyAgICByZXR1cm4gbG87CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaXNlY3RfbGVmdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqbGlzdCwgKml0ZW07Ci0JUHlfc3NpemVfdCBsbyA9IDA7Ci0JUHlfc3NpemVfdCBoaSA9IC0xOwotCVB5X3NzaXplX3QgaW5kZXg7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImEiLCAieCIsICJsbyIsICJoaSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpsaXN0LCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IGxvID0gMDsKKyAgICBQeV9zc2l6ZV90IGhpID0gLTE7CisgICAgUHlfc3NpemVfdCBpbmRleDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYSIsICJ4IiwgImxvIiwgImhpIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG5uOmJpc2VjdF9sZWZ0IiwKLQkJa2V5d29yZHMsICZsaXN0LCAmaXRlbSwgJmxvLCAmaGkpKQotCQlyZXR1cm4gTlVMTDsKLQlpbmRleCA9IGludGVybmFsX2Jpc2VjdF9sZWZ0KGxpc3QsIGl0ZW0sIGxvLCBoaSk7Ci0JaWYgKGluZGV4IDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGluZGV4KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG5uOmJpc2VjdF9sZWZ0IiwKKyAgICAgICAga2V5d29yZHMsICZsaXN0LCAmaXRlbSwgJmxvLCAmaGkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbmRleCA9IGludGVybmFsX2Jpc2VjdF9sZWZ0KGxpc3QsIGl0ZW0sIGxvLCBoaSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGluZGV4KTsKIH0KIAogUHlEb2NfU1RSVkFSKGJpc2VjdF9sZWZ0X2RvYywKQEAgLTE3MSwzMCArMTcxLDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW5zb3J0X2xlZnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmxpc3QsICppdGVtLCAqcmVzdWx0OwotCVB5X3NzaXplX3QgbG8gPSAwOwotCVB5X3NzaXplX3QgaGkgPSAtMTsKLQlQeV9zc2l6ZV90IGluZGV4OwotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJhIiwgIngiLCAibG8iLCAiaGkiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqbGlzdCwgKml0ZW0sICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBsbyA9IDA7CisgICAgUHlfc3NpemVfdCBoaSA9IC0xOworICAgIFB5X3NzaXplX3QgaW5kZXg7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImEiLCAieCIsICJsbyIsICJoaSIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPT3xubjppbnNvcnRfbGVmdCIsCi0JCWtleXdvcmRzLCAmbGlzdCwgJml0ZW0sICZsbywgJmhpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5kZXggPSBpbnRlcm5hbF9iaXNlY3RfbGVmdChsaXN0LCBpdGVtLCBsbywgaGkpOwotCWlmIChpbmRleCA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChQeUxpc3RfQ2hlY2tFeGFjdChsaXN0KSkgewotCQlpZiAoUHlMaXN0X0luc2VydChsaXN0LCBpbmRleCwgaXRlbSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChsaXN0LCAiaW5zZXJ0IiwgImlPIiwKLQkJCQkJICAgICBpbmRleCwgaXRlbSk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPT3xubjppbnNvcnRfbGVmdCIsCisgICAgICAgIGtleXdvcmRzLCAmbGlzdCwgJml0ZW0sICZsbywgJmhpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaW5kZXggPSBpbnRlcm5hbF9iaXNlY3RfbGVmdChsaXN0LCBpdGVtLCBsbywgaGkpOworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeUxpc3RfQ2hlY2tFeGFjdChsaXN0KSkgeworICAgICAgICBpZiAoUHlMaXN0X0luc2VydChsaXN0LCBpbmRleCwgaXRlbSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChsaXN0LCAiaW5zZXJ0IiwgImlPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgaXRlbSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICB9CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGluc29ydF9sZWZ0X2RvYywKQEAgLTIxMSwxOSArMjExLDE5IEBACiBQeURvY19TVFJWQVIoaW5zb3J0X2RvYywgIkFsaWFzIGZvciBpbnNvcnRfcmlnaHQoKS5cbiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgYmlzZWN0X21ldGhvZHNbXSA9IHsKLQl7ImJpc2VjdF9yaWdodCIsIChQeUNGdW5jdGlvbiliaXNlY3RfcmlnaHQsCi0JCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBiaXNlY3RfcmlnaHRfZG9jfSwKLQl7ImJpc2VjdCIsIChQeUNGdW5jdGlvbiliaXNlY3RfcmlnaHQsCi0JCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBiaXNlY3RfZG9jfSwKLQl7Imluc29ydF9yaWdodCIsIChQeUNGdW5jdGlvbilpbnNvcnRfcmlnaHQsCi0JCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBpbnNvcnRfcmlnaHRfZG9jfSwKLQl7Imluc29ydCIsIChQeUNGdW5jdGlvbilpbnNvcnRfcmlnaHQsCi0JCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBpbnNvcnRfZG9jfSwKLQl7ImJpc2VjdF9sZWZ0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9sZWZ0LAotCQlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYmlzZWN0X2xlZnRfZG9jfSwKLQl7Imluc29ydF9sZWZ0IiwgKFB5Q0Z1bmN0aW9uKWluc29ydF9sZWZ0LAotCQlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgaW5zb3J0X2xlZnRfZG9jfSwKLQl7TlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KKyAgICB7ImJpc2VjdF9yaWdodCIsIChQeUNGdW5jdGlvbiliaXNlY3RfcmlnaHQsCisgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBiaXNlY3RfcmlnaHRfZG9jfSwKKyAgICB7ImJpc2VjdCIsIChQeUNGdW5jdGlvbiliaXNlY3RfcmlnaHQsCisgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBiaXNlY3RfZG9jfSwKKyAgICB7Imluc29ydF9yaWdodCIsIChQeUNGdW5jdGlvbilpbnNvcnRfcmlnaHQsCisgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBpbnNvcnRfcmlnaHRfZG9jfSwKKyAgICB7Imluc29ydCIsIChQeUNGdW5jdGlvbilpbnNvcnRfcmlnaHQsCisgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBpbnNvcnRfZG9jfSwKKyAgICB7ImJpc2VjdF9sZWZ0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9sZWZ0LAorICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYmlzZWN0X2xlZnRfZG9jfSwKKyAgICB7Imluc29ydF9sZWZ0IiwgKFB5Q0Z1bmN0aW9uKWluc29ydF9sZWZ0LAorICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgaW5zb3J0X2xlZnRfZG9jfSwKKyAgICB7TlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihtb2R1bGVfZG9jLApAQCAtMjM3LDUgKzIzNyw1IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdF9iaXNlY3Qodm9pZCkKIHsKLQlQeV9Jbml0TW9kdWxlMygiX2Jpc2VjdCIsIGJpc2VjdF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBQeV9Jbml0TW9kdWxlMygiX2Jpc2VjdCIsIGJpc2VjdF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JzZGRiLmMgYi9Nb2R1bGVzL19ic2RkYi5jCmluZGV4IDJkZDMwMDAuLjUyNjZhMmMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2JzZGRiLmMKKysrIGIvTW9kdWxlcy9fYnNkZGIuYwpAQCAtMTQzLDkgKzE0Myw5IEBACiAvKiBhbmQgdGhlc2UgYXJlIGZvciBjYWxsaW5nIEMgLS0+IFB5dGhvbiAqLwogI2lmIGRlZmluZWQoTVlEQl9VU0VfR0lMU1RBVEUpCiAjZGVmaW5lIE1ZREJfQkVHSU5fQkxPQ0tfVEhSRUFEUyBcCi0JCVB5R0lMU3RhdGVfU1RBVEUgX19zYXZlc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworICAgICAgICAgICAgICAgIFB5R0lMU3RhdGVfU1RBVEUgX19zYXZlc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwogI2RlZmluZSBNWURCX0VORF9CTE9DS19USFJFQURTIFwKLQkJUHlHSUxTdGF0ZV9SZWxlYXNlKF9fc2F2ZXN0YXRlKTsKKyAgICAgICAgICAgICAgICBQeUdJTFN0YXRlX1JlbGVhc2UoX19zYXZlc3RhdGUpOwogI2Vsc2UgLyogTVlEQl9VU0VfR0lMU1RBVEUgKi8KIC8qIFByZSBHSUxTdGF0ZSBBUEkgLSBkbyBpdCB0aGUgbG9uZyBvbGQgd2F5ICovCiBzdGF0aWMgUHlJbnRlcnByZXRlclN0YXRlKiBfZGJfaW50ZXJwcmV0ZXJTdGF0ZSA9IE5VTEw7CkBAIC0yMjEsNyArMjIxLDcgQEAKIHN0YXRpYyBQeU9iamVjdCogREJSZXBVbmF2YWlsRXJyb3I7ICAgICAvKiBEQl9SRVBfVU5BVkFJTCAqLwogCiAjaWYgKERCVkVSIDwgNDMpCi0jZGVmaW5lCURCX0JVRkZFUl9TTUFMTAkJRU5PTUVNCisjZGVmaW5lIERCX0JVRkZFUl9TTUFMTCAgICAgICAgIEVOT01FTQogI2VuZGlmCiAKICNpZiAoREJWRVIgPCA0OCkKQEAgLTU1NCw3ICs1NTQsNyBAQAogCiAgICAgc3JjbGVuID0gc3RybGVuKHNyYyk7CiAgICAgaWYgKG4gPD0gMCkKLQlyZXR1cm4gc3JjbGVuOworICAgICAgICByZXR1cm4gc3JjbGVuOwogICAgIGNvcHlsZW4gPSAoc3JjbGVuID4gbi0xKSA/IG4tMSA6IHNyY2xlbjsKICAgICAvKiBwb3B1bGF0ZSBkZXN0WzBdIHRocnUgZGVzdFtjb3B5bGVuLTFdICovCiAgICAgbWVtY3B5KGRlc3QsIHNyYywgY29weWxlbik7CkBAIC01NzEsNyArNTcxLDcgQEAKIHN0YXRpYyB2b2lkIF9kYl9lcnJvckNhbGxiYWNrKGNvbnN0IGNoYXIqIHByZWZpeCwgY2hhciogbXNnKQogI2Vsc2UKIHN0YXRpYyB2b2lkIF9kYl9lcnJvckNhbGxiYWNrKGNvbnN0IERCX0VOViAqZGJfZW52LAotCWNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhciogbXNnKQorICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqIG1zZykKICNlbmRpZgogewogICAgIG91cl9zdHJsY3B5KF9kYl9lcnJtc2csIG1zZywgc2l6ZW9mKF9kYl9lcnJtc2cpKTsKQEAgLTcwMyw4ICs3MDMsOCBAQAogICAgICAgICBjYXNlIERCX0JVRkZFUl9TTUFMTDogICAgICAgZXJyT2JqID0gREJOb01lbW9yeUVycm9yOyAgICAgICBicmVhazsKIAogI2lmIChEQlZFUiA+PSA0MykKLQkvKiBFTk9NRU0gYW5kIERCX0JVRkZFUl9TTUFMTCB3ZXJlIG9uZSBhbmQgdGhlIHNhbWUgdW50aWwgNC4zICovCi0JY2FzZSBFTk9NRU06ICBlcnJPYmogPSBQeUV4Y19NZW1vcnlFcnJvcjsgICBicmVhazsKKyAgICAgICAgLyogRU5PTUVNIGFuZCBEQl9CVUZGRVJfU01BTEwgd2VyZSBvbmUgYW5kIHRoZSBzYW1lIHVudGlsIDQuMyAqLworICAgICAgICBjYXNlIEVOT01FTTogIGVyck9iaiA9IFB5RXhjX01lbW9yeUVycm9yOyAgIGJyZWFrOwogI2VuZGlmCiAgICAgICAgIGNhc2UgRUlOVkFMOiAgZXJyT2JqID0gREJJbnZhbGlkQXJnRXJyb3I7ICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRUFDQ0VTOiAgZXJyT2JqID0gREJBY2Nlc3NFcnJvcjsgICAgICAgYnJlYWs7CkBAIC04MTgsNyArODE4LDcgQEAKIAogLyogR2V0IGEga2V5L2RhdGEgcGFpciBmcm9tIGEgY3Vyc29yICovCiBzdGF0aWMgUHlPYmplY3QqIF9EQkN1cnNvcl9nZXQoREJDdXJzb3JPYmplY3QqIHNlbGYsIGludCBleHRyYV9mbGFncywKLQkJCSAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncywgY2hhciAqZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzLCBjaGFyICpmb3JtYXQpCiB7CiAgICAgaW50IGVycjsKICAgICBQeU9iamVjdCogcmV0dmFsID0gTlVMTDsKQEAgLTgyOSw3ICs4MjksNyBAQAogICAgIHN0YXRpYyBjaGFyKiBrd25hbWVzW10gPSB7ICJmbGFncyIsICJkbGVuIiwgImRvZmYiLCBOVUxMIH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsIGZvcm1hdCwga3duYW1lcywKLQkJCQkgICAgICZmbGFncywgJmRsZW4sICZkb2ZmKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIENIRUNLX0NVUlNPUl9OT1RfQ0xPU0VEKHNlbGYpOwpAQCAtODQ1LDcgKzg0NSw3IEBACiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKIAogICAgIGlmICgoZXJyID09IERCX05PVEZPVU5EIHx8IGVyciA9PSBEQl9LRVlFTVBUWSkKLQkgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKKyAgICAgICAgICAgICYmIHNlbGYtPm15ZGItPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKICAgICB9CkBAIC04ODksMTMgKzg4OSwxMyBAQAogc3RhdGljIHZvaWQgX2FkZFRpbWVUVG9EaWN0KFB5T2JqZWN0KiBkaWN0LCBjaGFyICpuYW1lLCB0aW1lX3QgdmFsdWUpCiB7CiAgICAgUHlPYmplY3QqIHY7Ci0JLyogaWYgdGhlIHZhbHVlIGZpdHMgaW4gcmVndWxhciBpbnQsIHVzZSB0aGF0LiAqLworICAgICAgICAvKiBpZiB0aGUgdmFsdWUgZml0cyBpbiByZWd1bGFyIGludCwgdXNlIHRoYXQuICovCiAjaWZkZWYgUFlfTE9OR19MT05HCi0JaWYgKHNpemVvZih0aW1lX3QpID4gc2l6ZW9mKGxvbmcpKQotCQl2ID0gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKSB2YWx1ZSk7Ci0JZWxzZQorICAgICAgICBpZiAoc2l6ZW9mKHRpbWVfdCkgPiBzaXplb2YobG9uZykpCisgICAgICAgICAgICAgICAgdiA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORykgdmFsdWUpOworICAgICAgICBlbHNlCiAjZW5kaWYKLQkJdiA9IE5VTUJFUl9Gcm9tTG9uZygobG9uZykgdmFsdWUpOworICAgICAgICAgICAgICAgIHYgPSBOVU1CRVJfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsKICAgICBpZiAoIXYgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbmFtZSwgdikpCiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAKQEAgLTEwNDQsMTAgKzEwNDQsMTAgQEAKIAogICAgIElOU0VSVF9JTl9ET1VCTEVfTElOS0VEX0xJU1Qoc2VsZi0+bXlkYi0+Y2hpbGRyZW5fY3Vyc29ycyxzZWxmKTsKICAgICBpZiAodHhuICYmICgoUHlPYmplY3QgKil0eG4hPVB5X05vbmUpKSB7Ci0JICAgIElOU0VSVF9JTl9ET1VCTEVfTElOS0VEX0xJU1RfVFhOKHR4bi0+Y2hpbGRyZW5fY3Vyc29ycyxzZWxmKTsKLQkgICAgc2VsZi0+dHhuPXR4bjsKKyAgICAgICAgICAgIElOU0VSVF9JTl9ET1VCTEVfTElOS0VEX0xJU1RfVFhOKHR4bi0+Y2hpbGRyZW5fY3Vyc29ycyxzZWxmKTsKKyAgICAgICAgICAgIHNlbGYtPnR4bj10eG47CiAgICAgfSBlbHNlIHsKLQkgICAgc2VsZi0+dHhuPU5VTEw7CisgICAgICAgICAgICBzZWxmLT50eG49TlVMTDsKICAgICB9CiAKICAgICBzZWxmLT5pbl93ZWFrcmVmbGlzdCA9IE5VTEw7CkBAIC0xNDc0LDE2ICsxNDc0LDE2IEBACiAgICAgICAgICAgICBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShyZXN1bHQsICZkYXRhLCAmc2l6ZSk7CiAgICAgICAgICAgICBzZWNLZXktPmZsYWdzID0gREJfREJUX0FQUE1BTExPQzsgICAvKiBEQiB3aWxsIGZyZWUgKi8KICAgICAgICAgICAgIHNlY0tleS0+ZGF0YSA9IG1hbGxvYyhzaXplKTsgICAgICAgIC8qIFRPRE8sIGNoZWNrIHRoaXMgKi8KLQkgICAgaWYgKHNlY0tleS0+ZGF0YSkgewotCQltZW1jcHkoc2VjS2V5LT5kYXRhLCBkYXRhLCBzaXplKTsKLQkJc2VjS2V5LT5zaXplID0gc2l6ZTsKLQkJcmV0dmFsID0gMDsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgaWYgKHNlY0tleS0+ZGF0YSkgeworICAgICAgICAgICAgICAgIG1lbWNweShzZWNLZXktPmRhdGEsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgICAgIHNlY0tleS0+c2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hbGxvYyBmYWlsZWQgaW4gX2RiX2Fzc29jaWF0ZUNhbGxiYWNrIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JICAgIH0KKyAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAjaWYgKERCVkVSID49IDQ2KQogICAgICAgICBlbHNlIGlmIChQeUxpc3RfQ2hlY2socmVzdWx0KSkKQEAgLTE2MTUsNyArMTYxNSw3IEBACiAjZW5kaWYKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CiAgICAgZXJyID0gc2VsZi0+ZGItPmFzc29jaWF0ZShzZWxmLT5kYiwKLQkgICAgICAgICAgICAgICAgICAgICAgdHhuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5REItPmRiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RiX2Fzc29jaWF0ZUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwpAQCAtMTcyNyw3ICsxNzI3LDcgQEAKICAgICBNWURCX0VORF9BTExPV19USFJFQURTOwogCiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgZXJyID0gMDsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwpAQCAtMTk4MSw3ICsxOTgxLDcgQEAKICAgICAgICAgcmV0dmFsID0gZGZsdG9iajsKICAgICB9CiAgICAgZWxzZSBpZiAoKGVyciA9PSBEQl9OT1RGT1VORCB8fCBlcnIgPT0gREJfS0VZRU1QVFkpCi0JICAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgICYmIHNlbGYtPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CiAgICAgICAgIGVyciA9IDA7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKQEAgLTIwNTAsNyArMjA1MCw3IEBACiAgICAgICAgIHJldHZhbCA9IGRmbHRvYmo7CiAgICAgfQogICAgIGVsc2UgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAgJiYgc2VsZi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKKyAgICAgICAgICAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgewogICAgICAgICBlcnIgPSAwOwogICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgIHJldHZhbCA9IFB5X05vbmU7CkBAIC0yMTg1LDcgKzIxODUsNyBAQAogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAKICAgICBpZiAoKGVyciA9PSBEQl9OT1RGT1VORCB8fCBlcnIgPT0gREJfS0VZRU1QVFkpCi0JICAgICYmIHNlbGYtPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CisgICAgICAgICAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgewogICAgICAgICBlcnIgPSAwOwogICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgIHJldHZhbCA9IFB5X05vbmU7CkBAIC0yMzQxLDE3ICsyMzQxLDE3IEBACiAgICAgICAgICJmaWxlbmFtZSIsICJkYnR5cGUiLCAiZmxhZ3MiLCAibW9kZSIsICJ0eG4iLCBOVUxMfTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInp8emlpaU86b3BlbiIsIGt3bmFtZXMsCi0JCQkJICAgICAmZmlsZW5hbWUsICZkYm5hbWUsICZ0eXBlLCAmZmxhZ3MsICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlbmFtZSwgJmRibmFtZSwgJnR5cGUsICZmbGFncywgJm1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR4bm9iaikpCiAgICAgewotCVB5RXJyX0NsZWFyKCk7Ci0JdHlwZSA9IERCX1VOS05PV047IGZsYWdzID0gMDsgbW9kZSA9IDA2NjA7Ci0JZmlsZW5hbWUgPSBOVUxMOyBkYm5hbWUgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywienxpaWlPOm9wZW4iLAorICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB0eXBlID0gREJfVU5LTk9XTjsgZmxhZ3MgPSAwOyBtb2RlID0gMDY2MDsKKyAgICAgICAgZmlsZW5hbWUgPSBOVUxMOyBkYm5hbWUgPSBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsInp8aWlpTzpvcGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3duYW1lc19iYXNpYywKLQkJCQkJICZmaWxlbmFtZSwgJnR5cGUsICZmbGFncywgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlbmFtZSwgJnR5cGUsICZmbGFncywgJm1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eG5vYmopKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGlmICghY2hlY2tUeG5PYmoodHhub2JqLCAmdHhuKSkgcmV0dXJuIE5VTEw7CkBAIC0yNjA3LDIwICsyNjA3LDIwIEBACiAKIHN0YXRpYyBpbnQKIF9kZWZhdWx0X2NtcChjb25zdCBEQlQgKmxlZnRLZXksCi0JICAgICBjb25zdCBEQlQgKnJpZ2h0S2V5KQorICAgICAgICAgICAgIGNvbnN0IERCVCAqcmlnaHRLZXkpCiB7CiAgIGludCByZXM7CiAgIGludCBsc2l6ZSA9IGxlZnRLZXktPnNpemUsIHJzaXplID0gcmlnaHRLZXktPnNpemU7CiAKICAgcmVzID0gbWVtY21wKGxlZnRLZXktPmRhdGEsIHJpZ2h0S2V5LT5kYXRhLAotCSAgICAgICBsc2l6ZSA8IHJzaXplID8gbHNpemUgOiByc2l6ZSk7CisgICAgICAgICAgICAgICBsc2l6ZSA8IHJzaXplID8gbHNpemUgOiByc2l6ZSk7CiAKICAgaWYgKHJlcyA9PSAwKSB7CiAgICAgICBpZiAobHNpemUgPCByc2l6ZSkgewotCSAgcmVzID0gLTE7CisgICAgICAgICAgcmVzID0gLTE7CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChsc2l6ZSA+IHJzaXplKSB7Ci0JICByZXMgPSAxOworICAgICAgICAgIHJlcyA9IDE7CiAgICAgICB9CiAgIH0KICAgcmV0dXJuIHJlczsKQEAgLTI2MjgsOCArMjYyOCw4IEBACiAKIHN0YXRpYyBpbnQKIF9kYl9jb21wYXJlQ2FsbGJhY2soREIqIGRiLAotCQkgICAgY29uc3QgREJUICpsZWZ0S2V5LAotCQkgICAgY29uc3QgREJUICpyaWdodEtleSkKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgREJUICpsZWZ0S2V5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEQlQgKnJpZ2h0S2V5KQogewogICAgIGludCByZXMgPSAwOwogICAgIFB5T2JqZWN0ICphcmdzOwpAQCAtMjYzNyw0MCArMjYzNyw0MCBAQAogICAgIERCT2JqZWN0ICpzZWxmID0gKERCT2JqZWN0ICopZGItPmFwcF9wcml2YXRlOwogCiAgICAgaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5idENvbXBhcmVDYWxsYmFjayA9PSBOVUxMKSB7Ci0JTVlEQl9CRUdJTl9CTE9DS19USFJFQURTOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkoc2VsZiA9PSAwCi0JCQkgPyAiREJfYnRfY29tcGFyZSBkYiBpcyBOVUxMLiIKLQkJCSA6ICJEQl9idF9jb21wYXJlIGNhbGxiYWNrIGlzIE5VTEwuIikpOwotCS8qIHdlJ3JlIGluIGEgY2FsbGJhY2sgd2l0aGluIHRoZSBEQiBjb2RlLCB3ZSBjYW4ndCByYWlzZSAqLwotCVB5RXJyX1ByaW50KCk7Ci0JcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKLQlNWURCX0VORF9CTE9DS19USFJFQURTOworICAgICAgICBNWURCX0JFR0lOX0JMT0NLX1RIUkVBRFM7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZiA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgPyAiREJfYnRfY29tcGFyZSBkYiBpcyBOVUxMLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJEQl9idF9jb21wYXJlIGNhbGxiYWNrIGlzIE5VTEwuIikpOworICAgICAgICAvKiB3ZSdyZSBpbiBhIGNhbGxiYWNrIHdpdGhpbiB0aGUgREIgY29kZSwgd2UgY2FuJ3QgcmFpc2UgKi8KKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKKyAgICAgICAgTVlEQl9FTkRfQkxPQ0tfVEhSRUFEUzsKICAgICB9IGVsc2UgewotCU1ZREJfQkVHSU5fQkxPQ0tfVEhSRUFEUzsKKyAgICAgICAgTVlEQl9CRUdJTl9CTE9DS19USFJFQURTOwogCi0JYXJncyA9IEJ1aWxkVmFsdWVfU1MobGVmdEtleS0+ZGF0YSwgbGVmdEtleS0+c2l6ZSwgcmlnaHRLZXktPmRhdGEsIHJpZ2h0S2V5LT5zaXplKTsKLQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHNlbGYtPmJ0Q29tcGFyZUNhbGxiYWNrLCBhcmdzKTsKLQl9Ci0JaWYgKGFyZ3MgPT0gTlVMTCB8fCByZXN1bHQgPT0gTlVMTCkgewotCSAgICAvKiB3ZSdyZSBpbiBhIGNhbGxiYWNrIHdpdGhpbiB0aGUgREIgY29kZSwgd2UgY2FuJ3QgcmFpc2UgKi8KLQkgICAgUHlFcnJfUHJpbnQoKTsKLQkgICAgcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKLQl9IGVsc2UgaWYgKE5VTUJFUl9DaGVjayhyZXN1bHQpKSB7Ci0JICAgIHJlcyA9IE5VTUJFUl9Bc0xvbmcocmVzdWx0KTsKLQl9IGVsc2UgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICJEQl9idF9jb21wYXJlIGNhbGxiYWNrIE1VU1QgcmV0dXJuIGFuIGludC4iKTsKLQkgICAgLyogd2UncmUgaW4gYSBjYWxsYmFjayB3aXRoaW4gdGhlIERCIGNvZGUsIHdlIGNhbid0IHJhaXNlICovCi0JICAgIFB5RXJyX1ByaW50KCk7Ci0JICAgIHJlcyA9IF9kZWZhdWx0X2NtcChsZWZ0S2V5LCByaWdodEtleSk7Ci0JfQorICAgICAgICBhcmdzID0gQnVpbGRWYWx1ZV9TUyhsZWZ0S2V5LT5kYXRhLCBsZWZ0S2V5LT5zaXplLCByaWdodEtleS0+ZGF0YSwgcmlnaHRLZXktPnNpemUpOworICAgICAgICBpZiAoYXJncyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3Qoc2VsZi0+YnRDb21wYXJlQ2FsbGJhY2ssIGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGlmIChhcmdzID09IE5VTEwgfHwgcmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIHdlJ3JlIGluIGEgY2FsbGJhY2sgd2l0aGluIHRoZSBEQiBjb2RlLCB3ZSBjYW4ndCByYWlzZSAqLworICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgIHJlcyA9IF9kZWZhdWx0X2NtcChsZWZ0S2V5LCByaWdodEtleSk7CisgICAgICAgIH0gZWxzZSBpZiAoTlVNQkVSX0NoZWNrKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHJlcyA9IE5VTUJFUl9Bc0xvbmcocmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCX2J0X2NvbXBhcmUgY2FsbGJhY2sgTVVTVCByZXR1cm4gYW4gaW50LiIpOworICAgICAgICAgICAgLyogd2UncmUgaW4gYSBjYWxsYmFjayB3aXRoaW4gdGhlIERCIGNvZGUsIHdlIGNhbid0IHJhaXNlICovCisgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKKyAgICAgICAgfQogCi0JUHlfWERFQ1JFRihhcmdzKTsKLQlQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKIAotCU1ZREJfRU5EX0JMT0NLX1RIUkVBRFM7CisgICAgICAgIE1ZREJfRU5EX0JMT0NLX1RIUkVBRFM7CiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CkBAIC0yNjg0LDggKzI2ODQsOCBAQAogICAgIENIRUNLX0RCX05PVF9DTE9TRUQoc2VsZik7CiAKICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY29tcGFyYXRvcikpIHsKLQltYWtlVHlwZUVycm9yKCJDYWxsYWJsZSIsIGNvbXBhcmF0b3IpOwotCXJldHVybiBOVUxMOworICAgICAgICBtYWtlVHlwZUVycm9yKCJDYWxsYWJsZSIsIGNvbXBhcmF0b3IpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKgpAQCAtMjY5OSwxNSArMjY5OSwxNSBAQAogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKCFOVU1CRVJfQ2hlY2socmVzdWx0KSkgewotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgICAgImNhbGxiYWNrIE1VU1QgcmV0dXJuIGFuIGludCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayBNVVNUIHJldHVybiBhbiBpbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfSBlbHNlIGlmIChOVU1CRVJfQXNMb25nKHJlc3VsdCkgIT0gMCkgewotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgICAgImNhbGxiYWNrIGZhaWxlZCB0byByZXR1cm4gMCBvbiB0d28gZW1wdHkgc3RyaW5ncyIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayBmYWlsZWQgdG8gcmV0dXJuIDAgb24gdHdvIGVtcHR5IHN0cmluZ3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogCkBAIC0yNzE1LDggKzI3MTUsOCBAQAogICAgICAqIHNpbXBsaWZ5IHRoZSBjb2RlLiBUaGlzIHdvdWxkIGhhdmUgbm8gcmVhbCB1c2UsIGFzIG9uZSBjYW5ub3QKICAgICAgKiBjaGFuZ2UgdGhlIGZ1bmN0aW9uIG9uY2UgdGhlIGRiIGlzIG9wZW5lZCBhbnl3YXkgKi8KICAgICBpZiAoc2VsZi0+YnRDb21wYXJlQ2FsbGJhY2sgIT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJzZXRfYnRfY29tcGFyZSgpIGNhbm5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInNldF9idF9jb21wYXJlKCkgY2Fubm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBQeV9JTkNSRUYoY29tcGFyYXRvcik7CkBAIC0yNzMxLDkgKzI3MzEsOSBAQAogICAgIGVyciA9IHNlbGYtPmRiLT5zZXRfYnRfY29tcGFyZShzZWxmLT5kYiwgX2RiX2NvbXBhcmVDYWxsYmFjayk7CiAKICAgICBpZiAoZXJyKSB7Ci0JLyogcmVzdG9yZSB0aGUgb2xkIHN0YXRlIGluIGNhc2Ugb2YgZXJyb3IgKi8KLQlQeV9ERUNSRUYoY29tcGFyYXRvcik7Ci0Jc2VsZi0+YnRDb21wYXJlQ2FsbGJhY2sgPSBOVUxMOworICAgICAgICAvKiByZXN0b3JlIHRoZSBvbGQgc3RhdGUgaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBQeV9ERUNSRUYoY29tcGFyYXRvcik7CisgICAgICAgIHNlbGYtPmJ0Q29tcGFyZUNhbGxiYWNrID0gTlVMTDsKICAgICB9CiAKICAgICBSRVRVUk5fSUZfRVJSKCk7CkBAIC0zMzE1LDggKzMzMTUsOCBAQAogICAgIENIRUNLX0RCX05PVF9DTE9TRUQoc2VsZik7CiAgICAgaWYgKG91dEZpbGVOYW1lKQogICAgICAgICBvdXRGaWxlID0gZm9wZW4ob3V0RmlsZU5hbWUsICJ3Iik7Ci0JLyogWFhYKG5ub3J3aXR6KTogaXQgc2hvdWxkIHByb2JhYmx5IGJlIGFuIGV4Y2VwdGlvbiBpZiBvdXRGaWxlCi0JICAgY2FuJ3QgYmUgb3BlbmVkLiAqLworICAgICAgICAvKiBYWFgobm5vcndpdHopOiBpdCBzaG91bGQgcHJvYmFibHkgYmUgYW4gZXhjZXB0aW9uIGlmIG91dEZpbGUKKyAgICAgICAgICAgY2FuJ3QgYmUgb3BlbmVkLiAqLwogCiAgICAgeyAgLyogREIudmVyaWZ5IGFjdHMgYXMgYSBEQiBoYW5kbGUgZGVzdHJ1Y3RvciAobGlrZSBjbG9zZSkgKi8KICAgICAgICAgUHlPYmplY3QgKmVycm9yOwpAQCAtMzM2OSw4ICszMzY5LDggQEAKICAgICBzdGF0aWMgY2hhcioga3duYW1lc1tdID0geyAicGFzc3dkIiwgImZsYWdzIiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xpOnNldF9lbmNyeXB0Iiwga3duYW1lcywKLQkJJnBhc3N3ZCwgJmZsYWdzKSkgewotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICZwYXNzd2QsICZmbGFncykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOwpAQCAtMzk5MCwxMiArMzk5MCwxMiBAQAogICAgIENMRUFSX0RCVChrZXkpOwogICAgIENMRUFSX0RCVChkYXRhKTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpfGlpOmdldCIsICZrd25hbWVzWzJdLAotCQkJCSAgICAgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICB7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9pfGlpOmdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrd25hbWVzWzFdLAotCQkJCQkgJmtleW9iaiwgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5b2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICAgIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPT2l8aWk6Z2V0IiwKQEAgLTQwMDMsOCArNDAwMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQl9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBDSEVDS19DVVJTT1JfTk9UX0NMT1NFRChzZWxmKTsKQEAgLTQwMjMsNyArNDAyMyw3IEBACiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKIAogICAgIGlmICgoZXJyID09IERCX05PVEZPVU5EIHx8IGVyciA9PSBEQl9LRVlFTVBUWSkKLQkgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKKyAgICAgICAgICAgICYmIHNlbGYtPm15ZGItPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKICAgICB9CkBAIC00MDY2LDEyICs0MDY2LDEyIEBACiAgICAgQ0xFQVJfREJUKGtleSk7CiAgICAgQ0xFQVJfREJUKGRhdGEpOwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIml8aWk6cGdldCIsICZrd25hbWVzWzJdLAotCQkJCSAgICAgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICB7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9pfGlpOnBnZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd25hbWVzX2tleU9ubHksCi0JCQkJCSAma2V5b2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlvYmosICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICAgICAgewogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9PaXxpaTpwZ2V0IiwKQEAgLTQwNzksOCArNDA3OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQl9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBDSEVDS19DVVJTT1JfTk9UX0NMT1NFRChzZWxmKTsKQEAgLTQxMDEsNyArNDEwMSw3IEBACiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKIAogICAgIGlmICgoZXJyID09IERCX05PVEZPVU5EIHx8IGVyciA9PSBEQl9LRVlFTVBUWSkKLQkgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKKyAgICAgICAgICAgICYmIHNlbGYtPm15ZGItPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKICAgICB9CkBAIC00MjEyLDcgKzQyMTIsNyBAQAogICAgIGludCBkb2ZmID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPT3xpaWk6cHV0Iiwga3duYW1lcywKLQkJCQkgICAgICZrZXlvYmosICZkYXRhb2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleW9iaiwgJmRhdGFvYmosICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBDSEVDS19DVVJTT1JfTk9UX0NMT1NFRChzZWxmKTsKQEAgLTQyNDYsNyArNDI0Niw3IEBACiAgICAgaW50IGRvZmYgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aWlpOnNldCIsIGt3bmFtZXMsCi0JCQkJICAgICAma2V5b2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleW9iaiwgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIENIRUNLX0NVUlNPUl9OT1RfQ0xPU0VEKHNlbGYpOwpAQCAtNDI2NCw3ICs0MjY0LDcgQEAKICAgICBlcnIgPSBfREJDX2dldChzZWxmLT5kYmMsICZrZXksICZkYXRhLCBmbGFnc3xEQl9TRVQpOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5jdXJzb3JTZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuY3Vyc29yU2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTQzMDksNyArNDMwOSw3IEBACiAgICAgaW50IGRvZmYgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aWlpOnNldF9yYW5nZSIsIGt3bmFtZXMsCi0JCQkJICAgICAma2V5b2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleW9iaiwgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIENIRUNLX0NVUlNPUl9OT1RfQ0xPU0VEKHNlbGYpOwpAQCAtNDMyNiw3ICs0MzI2LDcgQEAKICAgICBlcnIgPSBfREJDX2dldChzZWxmLT5kYmMsICZrZXksICZkYXRhLCBmbGFnc3xEQl9TRVRfUkFOR0UpOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5jdXJzb3JTZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuY3Vyc29yU2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTQ0ODAsNyArNDQ4MCw3IEBACiAgICAgc3RhdGljIGNoYXIqIGt3bmFtZXNbXSA9IHsgInJlY25vIiwiZmxhZ3MiLCAiZGxlbiIsICJkb2ZmIiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaXxpaWk6c2V0X3JlY25vIiwga3duYW1lcywKLQkJCQkgICAgICZpcmVjbm8sICZmbGFncywgJmRsZW4sICZkb2ZmKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXJlY25vLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIENIRUNLX0NVUlNPUl9OT1RfQ0xPU0VEKHNlbGYpOwpAQCAtNDUwOSw3ICs0NTA5LDcgQEAKICAgICBlcnIgPSBfREJDX2dldChzZWxmLT5kYmMsICZrZXksICZkYXRhLCBmbGFnc3xEQl9TRVRfUkVDTk8pOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5jdXJzb3JTZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuY3Vyc29yU2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTQ1NzksNyArNDU3OSw3IEBACiAgICAgZXJyID0gX0RCQ19nZXQoc2VsZi0+ZGJjLCAma2V5LCAmZGF0YSwgZmxhZ3MgfCBEQl9KT0lOX0lURU0pOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTQ2MDIsNyArNDYwMiw3IEBACiAgICAgc3RhdGljIGNoYXIqIGt3bmFtZXNbXSA9IHsgInByaW9yaXR5IiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaTpzZXRfcHJpb3JpdHkiLCBrd25hbWVzLAotCQkJCSAgICAgJnByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpb3JpdHkpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIENIRUNLX0NVUlNPUl9OT1RfQ0xPU0VEKHNlbGYpOwpAQCAtNDkyMSw4ICs0OTIxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzfHpPaTpkYnJlbW92ZSIsIGt3bmFtZXMsCi0JCSZmaWxlLCAmZGF0YWJhc2UsICZ0eG5vYmosICZmbGFncykpIHsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAmZmlsZSwgJmRhdGFiYXNlLCAmdHhub2JqLCAmZmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoIWNoZWNrVHhuT2JqKHR4bm9iaiwgJnR4bikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00OTQ5LDggKzQ5NDksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFncyIsIE5VTEwgfTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInN6c3xPaTpkYnJlbmFtZSIsIGt3bmFtZXMsCi0JCSZmaWxlLCAmZGF0YWJhc2UsICZuZXduYW1lLCAmdHhub2JqLCAmZmxhZ3MpKSB7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgJmZpbGUsICZkYXRhYmFzZSwgJm5ld25hbWUsICZ0eG5vYmosICZmbGFncykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmICghY2hlY2tUeG5PYmoodHhub2JqLCAmdHhuKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQ5NzUsOCArNDk3NSw4IEBACiAgICAgc3RhdGljIGNoYXIqIGt3bmFtZXNbXSA9IHsgInBhc3N3ZCIsICJmbGFncyIsIE5VTEwgfTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInN8aTpzZXRfZW5jcnlwdCIsIGt3bmFtZXMsCi0JCSZwYXNzd2QsICZmbGFncykpIHsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAmcGFzc3dkLCAmZmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKQEAgLTUwMzcsOCArNTAzNyw4IEBACiAgICAgc3RhdGljIGNoYXIqIGt3bmFtZXNbXSA9IHsgInRpbWVvdXQiLCAiZmxhZ3MiLCBOVUxMIH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpaTpzZXRfdGltZW91dCIsIGt3bmFtZXMsCi0JCSZ0aW1lb3V0LCAmZmxhZ3MpKSB7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgJnRpbWVvdXQsICZmbGFncykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOwpAQCAtNjkzNSw4ICs2OTM1LDggQEAKICAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKIAogICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhub3RpZnlGdW5jKSkgewotCSAgICBtYWtlVHlwZUVycm9yKCJDYWxsYWJsZSIsIG5vdGlmeUZ1bmMpOwotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIG1ha2VUeXBlRXJyb3IoIkNhbGxhYmxlIiwgbm90aWZ5RnVuYyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBQeV9YREVDUkVGKHNlbGYtPmV2ZW50X25vdGlmeUNhbGxiYWNrKTsKQEAgLTY5NTQsOCArNjk1NCw4IEBACiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKIAogICAgIGlmIChlcnIpIHsKLQkgICAgUHlfREVDUkVGKG5vdGlmeUZ1bmMpOwotCSAgICBzZWxmLT5ldmVudF9ub3RpZnlDYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgICBQeV9ERUNSRUYobm90aWZ5RnVuYyk7CisgICAgICAgICAgICBzZWxmLT5ldmVudF9ub3RpZnlDYWxsYmFjayA9IE5VTEw7CiAgICAgfQogCiAgICAgUkVUVVJOX0lGX0VSUigpOwpAQCAtNzI3Niw3ICs3Mjc2LDcgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsCiAgICAgICAgICAgICAgICAgIml8TzpyZXBfc3RhcnQiLCBrd25hbWVzLCAmZmxhZ3MsICZjZGF0YV9weSkpCiAgICAgewotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKIApAQCAtNzU5OCw3ICs3NTk4LDcgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsCiAgICAgICAgICAgICAgICAgImlpOnJlcG1ncl9zdGFydCIsIGt3bmFtZXMsICZudGhyZWFkcywgJmZsYWdzKSkKICAgICB7Ci0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIENIRUNLX0VOVl9OT1RfQ0xPU0VEKHNlbGYpOwogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKQEAgLTc2MjEsNyArNzYyMSw3IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLAogICAgICAgICAgICAgICAgICJzaXxpOnJlcG1ncl9zZXRfbG9jYWxfc2l0ZSIsIGt3bmFtZXMsICZob3N0LCAmcG9ydCwgJmZsYWdzKSkKICAgICB7Ci0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIENIRUNLX0VOVl9OT1RfQ0xPU0VEKHNlbGYpOwogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKQEAgLTc2NDUsNyArNzY0NSw3IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLAogICAgICAgICAgICAgICAgICJzaXxpOnJlcG1ncl9hZGRfcmVtb3RlX3NpdGUiLCBrd25hbWVzLCAmaG9zdCwgJnBvcnQsICZmbGFncykpCiAgICAgewotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CkBAIC03NjYzLDcgKzc2NjMsNyBAQAogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlcG1ncl9zZXRfYWNrX3BvbGljeSIsICZhY2tfcG9saWN5KSkKICAgICB7Ci0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIENIRUNLX0VOVl9OT1RfQ0xPU0VEKHNlbGYpOwogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKQEAgLTc4MzgsNyArNzgzOCw3IEBACiAgICAgICAgICAgICAvKiBUaGUgZGIgaXMgYWxyZWFkeSBsaW5rZWQgdG8gaXRzIGVudmlyb25tZW50LAogICAgICAgICAgICAgKiogc28gbm90aGluZyB0byBkby4KICAgICAgICAgICAgICovCi0gICAgICAgICAgICBkYi0+dHhuPU5VTEw7IAorICAgICAgICAgICAgZGItPnR4bj1OVUxMOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MDM0LDggKzgwMzQsOCBAQAogICAgIHN0YXRpYyBjaGFyKiBrd25hbWVzW10gPSB7ICJ0aW1lb3V0IiwgImZsYWdzIiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaWk6c2V0X3RpbWVvdXQiLCBrd25hbWVzLAotCQkmdGltZW91dCwgJmZsYWdzKSkgewotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICZ0aW1lb3V0LCAmZmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKQEAgLTg5NjMsMjAgKzg5NjMsMjAgQEAKICAgICAmREJfc2VxdWVuY2UsLyp0cF9hc19zZXF1ZW5jZSovCiAgICAgJkRCX21hcHBpbmcsLyp0cF9hc19tYXBwaW5nKi8KICAgICAwLCAgICAgICAgICAvKnRwX2hhc2gqLwotICAgIDAsCQkJLyogdHBfY2FsbCAqLwotICAgIDAsCQkJLyogdHBfc3RyICovCi0gICAgMCwgIAkJLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsCQkJLyogdHBfYXNfYnVmZmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwKQogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgICAgICAvKiB0cF9mbGFncyAqLwogI2Vsc2UKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbmRpZgogICAgIDAsICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgIDAsCQkgICAgLyogdHBfdHJhdmVyc2UgKi8KLSAgICAwLAkJCS8qIHRwX2NsZWFyICovCi0gICAgMCwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgb2Zmc2V0b2YoREJPYmplY3QsIGluX3dlYWtyZWZsaXN0KSwgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIDAsICAgICAgICAgIC8qdHBfaXRlciovCiAgICAgMCwgICAgICAgICAgLyp0cF9pdGVybmV4dCovCkBAIC05MDkyLDIwICs5MDkyLDIwIEBACiAgICAgMCwgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCiAgICAgMCwgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KICAgICAwLCAgICAgICAgICAvKnRwX2hhc2gqLwotICAgIDAsCQkJLyogdHBfY2FsbCAqLwotICAgIDAsCQkJLyogdHBfc3RyICovCi0gICAgMCwgIAkJLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsCQkJLyogdHBfYXNfYnVmZmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwKQogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgICAgICAvKiB0cF9mbGFncyAqLwogI2Vsc2UKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbmRpZgogICAgIDAsICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgIDAsCQkgICAgLyogdHBfdHJhdmVyc2UgKi8KLSAgICAwLAkJCS8qIHRwX2NsZWFyICovCi0gICAgMCwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgb2Zmc2V0b2YoREJFbnZPYmplY3QsIGluX3dlYWtyZWZsaXN0KSwgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIDAsICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAwLCAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwpAQCAtOTEzNSwyMCArOTEzNSwyMCBAQAogICAgIDAsICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwogICAgIDAsICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiAgICAgMCwgICAgICAgICAgLyp0cF9oYXNoKi8KLSAgICAwLAkJCS8qIHRwX2NhbGwgKi8KLSAgICAwLAkJCS8qIHRwX3N0ciAqLwotICAgIDAsICAJCS8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCS8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMCkKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbHNlCiAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgIC8qIHRwX2ZsYWdzICovCiAjZW5kaWYKICAgICAwLCAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAwLAkgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwJCQkvKiB0cF9jbGVhciAqLwotICAgIDAsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgb2Zmc2V0b2YoREJUeG5PYmplY3QsIGluX3dlYWtyZWZsaXN0KSwgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIDAsICAgICAgICAgIC8qdHBfaXRlciovCiAgICAgMCwgICAgICAgICAgLyp0cF9pdGVybmV4dCovCkBAIC05MTc4LDIwICs5MTc4LDIwIEBACiAgICAgMCwgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCiAgICAgMCwgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KICAgICAwLCAgICAgICAgICAvKnRwX2hhc2gqLwotICAgIDAsCQkJLyogdHBfY2FsbCAqLwotICAgIDAsCQkJLyogdHBfc3RyICovCi0gICAgMCwgIAkJLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsCQkJLyogdHBfYXNfYnVmZmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwKQogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgICAgICAvKiB0cF9mbGFncyAqLwogI2Vsc2UKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbmRpZgogICAgIDAsICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgIDAsCQkgICAgLyogdHBfdHJhdmVyc2UgKi8KLSAgICAwLAkJCS8qIHRwX2NsZWFyICovCi0gICAgMCwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgb2Zmc2V0b2YoREJMb2NrT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KIH07CiAKQEAgLTkyMTcsMjAgKzkyMTcsMjAgQEAKICAgICAwLCAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KICAgICAwLCAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLwogICAgIDAsICAgICAgICAgIC8qdHBfaGFzaCovCi0gICAgMCwJCQkvKiB0cF9jYWxsICovCi0gICAgMCwJCQkvKiB0cF9zdHIgKi8KLSAgICAwLCAgCQkvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0gICAgMCwJCQkvKiB0cF9hc19idWZmZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMDAwMDApCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgICAgIC8qIHRwX2ZsYWdzICovCiAjZWxzZQogICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAvKiB0cF9mbGFncyAqLwogI2VuZGlmCiAgICAgMCwgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgMCwJCSAgICAvKiB0cF90cmF2ZXJzZSAqLwotICAgIDAsCQkJLyogdHBfY2xlYXIgKi8KLSAgICAwLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICBvZmZzZXRvZihEQlNlcXVlbmNlT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAwLCAgICAgICAgICAvKnRwX2l0ZXIqLwogICAgIDAsICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwpAQCAtOTQwNCw3ICs5NDA0LDcgQEAKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwKQogICAgICAgICByZXR1cm47CiAjZWxzZQotICAgIAlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKICAgICB9CiAKQEAgLTk4NzgsNyArOTg3OCw3IEBACiAgICAgICogdXNpbmcgb25lIGJhc2UgY2xhc3MuICovCiAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIktleUVycm9yIiwgUHlFeGNfS2V5RXJyb3IpOwogICAgIFB5UnVuX1N0cmluZygiY2xhc3MgREJOb3RGb3VuZEVycm9yKERCRXJyb3IsIEtleUVycm9yKTogcGFzc1xuIgotCSAgICAgICAgICJjbGFzcyBEQktleUVtcHR5RXJyb3IoREJFcnJvciwgS2V5RXJyb3IpOiBwYXNzIiwKKyAgICAgICAgICAgICAgICAgImNsYXNzIERCS2V5RW1wdHlFcnJvcihEQkVycm9yLCBLZXlFcnJvcik6IHBhc3MiLAogICAgICAgICAgICAgICAgICBQeV9maWxlX2lucHV0LCBkLCBkKTsKICAgICBEQk5vdEZvdW5kRXJyb3IgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiREJOb3RGb3VuZEVycm9yIik7CiAgICAgREJLZXlFbXB0eUVycm9yID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIkRCS2V5RW1wdHlFcnJvciIpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMgYi9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYwppbmRleCBjMGM4ODU3Li4wNzAxZmQwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYworKysgYi9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYwpAQCAtMTUsNyArMTUsNyBAQAogICAgVGhlIGJ1aWx0aW4gVW5pY29kZSBjb2RlY3MgdXNlIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOgogCiAgICAgIDxlbmNvZGluZz5fZW5jb2RlKFVuaWNvZGVfb2JqZWN0WyxlcnJvcnM9J3N0cmljdCddKSAtPgotICAgICAJKHN0cmluZyBvYmplY3QsIGJ5dGVzIGNvbnN1bWVkKQorICAgICAgICAoc3RyaW5nIG9iamVjdCwgYnl0ZXMgY29uc3VtZWQpCiAKICAgICAgPGVuY29kaW5nPl9kZWNvZGUoY2hhcl9idWZmZXJfb2JqWyxlcnJvcnM9J3N0cmljdCddKSAtPgogICAgICAgICAoVW5pY29kZSBvYmplY3QsIGJ5dGVzIGNvbnN1bWVkKQpAQCAtOTYsMTEgKzk2LDExIEBACiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAgICAgaWYgKGVuY29kaW5nID09IE5VTEwpCi0JZW5jb2RpbmcgPSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCk7CisgICAgICAgIGVuY29kaW5nID0gUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZygpOwogI2Vsc2UKICAgICBpZiAoZW5jb2RpbmcgPT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm8gZW5jb2Rpbmcgc3BlY2lmaWVkIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm8gZW5jb2Rpbmcgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICNlbmRpZgogCkBAIC0xMzAsMTEgKzEzMCwxMSBAQAogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKQotCWVuY29kaW5nID0gUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZygpOworICAgICAgICBlbmNvZGluZyA9IFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKTsKICNlbHNlCiAgICAgaWYgKGVuY29kaW5nID09IE5VTEwpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIGVuY29kaW5nIHNwZWNpZmllZCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIGVuY29kaW5nIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAjZW5kaWYKIApAQCAtMTQ2LDcgKzE0Niw3IEBACiAKIHN0YXRpYwogUHlPYmplY3QgKmNvZGVjX3R1cGxlKFB5T2JqZWN0ICp1bmljb2RlLAotCQkgICAgICBQeV9zc2l6ZV90IGxlbikKKyAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbikKIHsKICAgICBQeU9iamVjdCAqdjsKICAgICBpZiAodW5pY29kZSA9PSBOVUxMKQpAQCAtMTU5LDQ1ICsxNTksNDUgQEAKIC8qIC0tLSBTdHJpbmcgY29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGVzY2FwZV9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqZGF0YTsKICAgICBQeV9zc2l6ZV90IHNpemU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfHo6ZXNjYXBlX2RlY29kZSIsCi0JCQkgICZkYXRhLCAmc2l6ZSwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLCAmc2l6ZSwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBjb2RlY190dXBsZShQeVN0cmluZ19EZWNvZGVFc2NhcGUoZGF0YSwgc2l6ZSwgZXJyb3JzLCAwLCBOVUxMKSwKLQkJICAgICAgIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGVzY2FwZV9lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpzdHI7Ci0JY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKLQljaGFyICpidWY7Ci0JUHlfc3NpemVfdCBjb25zdW1lZCwgbGVuOworICAgICAgICBQeU9iamVjdCAqc3RyOworICAgICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOworICAgICAgICBjaGFyICpidWY7CisgICAgICAgIFB5X3NzaXplX3QgY29uc3VtZWQsIGxlbjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiU3x6OmVzY2FwZV9lbmNvZGUiLAotCQkJICAgICAgJnN0ciwgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlN8ejplc2NhcGVfZW5jb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JY29uc3VtZWQgPSBQeVN0cmluZ19HRVRfU0laRShzdHIpOwotCXN0ciA9IFB5U3RyaW5nX1JlcHIoc3RyLCAwKTsKLQlpZiAoIXN0cikKLQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGNvbnN1bWVkID0gUHlTdHJpbmdfR0VUX1NJWkUoc3RyKTsKKyAgICAgICAgc3RyID0gUHlTdHJpbmdfUmVwcihzdHIsIDApOworICAgICAgICBpZiAoIXN0cikKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFRoZSBzdHJpbmcgd2lsbCBiZSBxdW90ZWQuIFVucXVvdGUsIHNpbWlsYXIgdG8gdW5pY29kZS1lc2NhcGUuICovCi0JYnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HIChzdHIpOwotCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFIChzdHIpOwotCW1lbW1vdmUoYnVmLCBidWYrMSwgbGVuLTIpOwotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZzdHIsIGxlbi0yKSA8IDApCi0JCXJldHVybiBOVUxMOwotCQotCXJldHVybiBjb2RlY190dXBsZShzdHIsIGNvbnN1bWVkKTsKKyAgICAgICAgLyogVGhlIHN0cmluZyB3aWxsIGJlIHF1b3RlZC4gVW5xdW90ZSwgc2ltaWxhciB0byB1bmljb2RlLWVzY2FwZS4gKi8KKyAgICAgICAgYnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HIChzdHIpOworICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRSAoc3RyKTsKKyAgICAgICAgbWVtbW92ZShidWYsIGJ1ZisxLCBsZW4tMik7CisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZzdHIsIGxlbi0yKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKHN0ciwgY29uc3VtZWQpOwogfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQpAQCAtMjA1LDcgKzIwNSw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2ludGVybmFsX2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkJCVB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKm9iajsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwpAQCAtMjEzLDE5ICsyMTMsMTkgQEAKICAgICBQeV9zc2l6ZV90IHNpemU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1bmljb2RlX2ludGVybmFsX2RlY29kZSIsCi0JCQkgICZvYmosICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKLQlQeV9JTkNSRUYob2JqKTsKLQlyZXR1cm4gY29kZWNfdHVwbGUob2JqLCBQeVVuaWNvZGVfR0VUX1NJWkUob2JqKSk7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUob2JqLCBQeVVuaWNvZGVfR0VUX1NJWkUob2JqKSk7CiAgICAgfQogICAgIGVsc2UgewotCWlmIChQeU9iamVjdF9Bc1JlYWRCdWZmZXIob2JqLCAoY29uc3Qgdm9pZCAqKikmZGF0YSwgJnNpemUpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmosIChjb25zdCB2b2lkICoqKSZkYXRhLCAmc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0RlY29kZVVuaWNvZGVJbnRlcm5hbChkYXRhLCBzaXplLCBlcnJvcnMpLAotCQkJICAgc2l6ZSk7CisgICAgICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0RlY29kZVVuaWNvZGVJbnRlcm5hbChkYXRhLCBzaXplLCBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CiAgICAgfQogfQogCkBAIC0yMzMsMjAgKzIzMywyMCBAQAogdXRmXzdfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAogICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBmaW5hbCA9IDA7CiAgICAgUHlfc3NpemVfdCBjb25zdW1lZDsKICAgICBQeU9iamVjdCAqZGVjb2RlZCA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHppOnV0Zl83X2RlY29kZSIsCi0JCQkgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgY29uc3VtZWQgPSBwYnVmLmxlbjsKIAogICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGN1N0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCQkJCQkgICBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBjb2RlY190dXBsZShkZWNvZGVkLCBjb25zdW1lZCk7CkBAIC0yNTQsMzIgKzI1NCwzMiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogdXRmXzhfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBmaW5hbCA9IDA7CiAgICAgUHlfc3NpemVfdCBjb25zdW1lZDsKICAgICBQeU9iamVjdCAqZGVjb2RlZCA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHppOnV0Zl84X2RlY29kZSIsCi0JCQkgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgY29uc3VtZWQgPSBwYnVmLmxlbjsKIAogICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCQkJCQkgICBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBjb2RlY190dXBsZShkZWNvZGVkLCBjb25zdW1lZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBieXRlb3JkZXIgPSAwOwogICAgIGludCBmaW5hbCA9IDA7CkBAIC0yODcsMjIgKzI4NywyMiBAQAogICAgIFB5T2JqZWN0ICpkZWNvZGVkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aTp1dGZfMTZfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOyAvKiBUaGlzIGlzIG92ZXJ3cml0dGVuIHVubGVzcyBmaW5hbCBpcyB0cnVlLiAqLwogICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bChwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycywKLQkJCQkJJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKICAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gY29kZWNfdHVwbGUoZGVjb2RlZCwgY29uc3VtZWQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdXRmXzE2X2xlX2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkJIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICAgICAgUHlfYnVmZmVyIHBidWY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gLTE7CiAgICAgaW50IGZpbmFsID0gMDsKQEAgLTMxMCwyMyArMzEwLDIzIEBACiAgICAgUHlPYmplY3QgKmRlY29kZWQgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aTp1dGZfMTZfbGVfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGNvbnN1bWVkID0gcGJ1Zi5sZW47IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCSZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBjb2RlY190dXBsZShkZWNvZGVkLCBjb25zdW1lZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfYmVfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBieXRlb3JkZXIgPSAxOwogICAgIGludCBmaW5hbCA9IDA7CkBAIC0zMzQsMTUgKzMzNCwxNSBAQAogICAgIFB5T2JqZWN0ICpkZWNvZGVkID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8emk6dXRmXzE2X2JlX2RlY29kZSIsCi0JCQkgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBjb25zdW1lZCA9IHBidWYubGVuOyAvKiBUaGlzIGlzIG92ZXJ3cml0dGVuIHVubGVzcyBmaW5hbCBpcyB0cnVlLiAqLwogICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bChwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycywKLQkmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKICAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gY29kZWNfdHVwbGUoZGVjb2RlZCwgY29uc3VtZWQpOwogfQogCkBAIC0zNTYsOSArMzU2LDkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHV0Zl8xNl9leF9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAgICAgUHlPYmplY3QgKnVuaWNvZGUsICp0dXBsZTsKQEAgLTM2NiwxNCArMzY2LDE0IEBACiAgICAgUHlfc3NpemVfdCBjb25zdW1lZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8emlpOnV0Zl8xNl9leF9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMsICZieXRlb3JkZXIsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGNvbnN1bWVkID0gcGJ1Zi5sZW47IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCQkJCQkmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmICh1bmljb2RlID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiT25pIiwgdW5pY29kZSwgY29uc3VtZWQsIGJ5dGVvcmRlcik7CiAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwogICAgIHJldHVybiB0dXBsZTsKQEAgLTM4MSw5ICszODEsOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogdXRmXzMyX2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICAgICAgUHlfYnVmZmVyIHBidWY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gMDsKICAgICBpbnQgZmluYWwgPSAwOwpAQCAtMzkxLDIyICszOTEsMjIgQEAKICAgICBQeU9iamVjdCAqZGVjb2RlZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8emk6dXRmXzMyX2RlY29kZSIsCi0JCQkgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgY29uc3VtZWQgPSBwYnVmLmxlbjsgLyogVGhpcyBpcyBvdmVyd3JpdHRlbiB1bmxlc3MgZmluYWwgaXMgdHJ1ZS4gKi8KICAgICBkZWNvZGVkID0gUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JCQkJCSZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHV0Zl8zMl9sZV9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IC0xOwogICAgIGludCBmaW5hbCA9IDA7CkBAIC00MTQsMjIgKzQxNCwyMiBAQAogICAgIFB5T2JqZWN0ICpkZWNvZGVkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aTp1dGZfMzJfbGVfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOyAvKiBUaGlzIGlzIG92ZXJ3cml0dGVuIHVubGVzcyBmaW5hbCBpcyB0cnVlLiAqLwogICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bChwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycywKLQkJCQkJJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKICAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gY29kZWNfdHVwbGUoZGVjb2RlZCwgY29uc3VtZWQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdXRmXzMyX2JlX2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkJIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICAgICAgUHlfYnVmZmVyIHBidWY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gMTsKICAgICBpbnQgZmluYWwgPSAwOwpAQCAtNDM3LDE0ICs0MzcsMTQgQEAKICAgICBQeU9iamVjdCAqZGVjb2RlZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8emk6dXRmXzMyX2JlX2RlY29kZSIsCi0JCQkgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgY29uc3VtZWQgPSBwYnVmLmxlbjsgLyogVGhpcyBpcyBvdmVyd3JpdHRlbiB1bmxlc3MgZmluYWwgaXMgdHJ1ZS4gKi8KICAgICBkZWNvZGVkID0gUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JCQkJCSZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKIH0KIApAQCAtNDU4LDkgKzQ1OCw5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfZXhfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBieXRlb3JkZXIgPSAwOwogICAgIFB5T2JqZWN0ICp1bmljb2RlLCAqdHVwbGU7CkBAIC00NjgsMTQgKzQ2OCwxNCBAQAogICAgIFB5X3NzaXplX3QgY29uc3VtZWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHppaTp1dGZfMzJfZXhfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZieXRlb3JkZXIsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmYnl0ZW9yZGVyLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOyAvKiBUaGlzIGlzIG92ZXJ3cml0dGVuIHVubGVzcyBmaW5hbCBpcyB0cnVlLiAqLwogICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bChwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycywKLQkJCQkJJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKICAgICBpZiAodW5pY29kZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIk9uaSIsIHVuaWNvZGUsIGNvbnN1bWVkLCBieXRlb3JkZXIpOwogICAgIFB5X0RFQ1JFRih1bmljb2RlKTsKICAgICByZXR1cm4gdHVwbGU7CkBAIC00ODMsMTE0ICs0ODMsMTE0IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2VzY2FwZV9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSAgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICAgICAgUHlfYnVmZmVyIHBidWY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKLQlQeU9iamVjdCAqdW5pY29kZTsKKyAgICAgICAgUHlPYmplY3QgKnVuaWNvZGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHo6dW5pY29kZV9lc2NhcGVfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQlyZXR1cm4gY29kZWNfdHVwbGUodW5pY29kZSwgcGJ1Zi5sZW4pOworICAgICAgICB1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKHVuaWNvZGUsIHBidWYubGVuKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCQlQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwotCVB5T2JqZWN0ICp1bmljb2RlOworICAgICAgICBQeU9iamVjdCAqdW5pY29kZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ejpyYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQlyZXR1cm4gY29kZWNfdHVwbGUodW5pY29kZSwgcGJ1Zi5sZW4pOworICAgICAgICB1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKHVuaWNvZGUsIHBidWYubGVuKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxhdGluXzFfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOwotCVB5T2JqZWN0ICp1bmljb2RlOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKKyAgICAgICAgUHlPYmplY3QgKnVuaWNvZGU7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ejpsYXRpbl8xX2RlY29kZSIsCi0JCQkgICZwYnVmLCAmZXJyb3JzKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlTGF0aW4xKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQlyZXR1cm4gY29kZWNfdHVwbGUodW5pY29kZSwgcGJ1Zi5sZW4pOworICAgICAgICB1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZUxhdGluMShwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycyk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUodW5pY29kZSwgcGJ1Zi5sZW4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXNjaWlfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7Ci0JUHlPYmplY3QgKnVuaWNvZGU7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeU9iamVjdCAqdW5pY29kZTsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6OmFzY2lpX2RlY29kZSIsCi0JCQkgICZwYnVmLCAmZXJyb3JzKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlQVNDSUkocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CisgICAgICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlQVNDSUkocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKHVuaWNvZGUsIHBidWYubGVuKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNoYXJtYXBfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOwotCVB5T2JqZWN0ICp1bmljb2RlOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKKyAgICAgICAgUHlPYmplY3QgKnVuaWNvZGU7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBQeU9iamVjdCAqbWFwcGluZyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHpPOmNoYXJtYXBfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZtYXBwaW5nKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMsICZtYXBwaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKG1hcHBpbmcgPT0gUHlfTm9uZSkKLQltYXBwaW5nID0gTlVMTDsKKyAgICAgICAgbWFwcGluZyA9IE5VTEw7CiAKLQl1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZUNoYXJtYXAocGJ1Zi5idWYsIHBidWYubGVuLCBtYXBwaW5nLCBlcnJvcnMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CisgICAgICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcChwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIG1hcHBpbmcsIGVycm9ycyk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUodW5pY29kZSwgcGJ1Zi5sZW4pOwogfQogCiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKSAmJiBkZWZpbmVkKEhBVkVfVVNBQkxFX1dDSEFSX1QpCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYmNzX2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICAgICAgUHlfYnVmZmVyIHBidWY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgZmluYWwgPSAwOwogICAgIFB5X3NzaXplX3QgY29uc3VtZWQ7CiAgICAgUHlPYmplY3QgKmRlY29kZWQgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aTptYmNzX2RlY29kZSIsCi0JCQkgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgY29uc3VtZWQgPSBwYnVmLmxlbjsKIAogICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlTUJDU1N0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCQkJCQkgICBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBjb2RlY190dXBsZShkZWNvZGVkLCBjb25zdW1lZCk7CiB9CiAKQEAgLTYwMCwzOSArNjAwLDM5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZWFkYnVmZmVyX2VuY29kZShQeU9iamVjdCAqc2VsZiwKLQkJICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIGNvbnN0IGNoYXIgKmRhdGE7CiAgICAgUHlfc3NpemVfdCBzaXplOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfHo6cmVhZGJ1ZmZlcl9lbmNvZGUiLAotCQkJICAmZGF0YSwgJnNpemUsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwgJnNpemUsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHJldHVybiBjb2RlY190dXBsZShQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBzaXplKSwKLQkJICAgICAgIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNoYXJidWZmZXJfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgY29uc3QgY2hhciAqZGF0YTsKICAgICBQeV9zc2l6ZV90IHNpemU7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN8ejpjaGFyYnVmZmVyX2VuY29kZSIsCi0JCQkgICZkYXRhLCAmc2l6ZSwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLCAmc2l6ZSwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIHNpemUpLAotCQkgICAgICAgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdW5pY29kZV9pbnRlcm5hbF9lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCQlQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpvYmo7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKQEAgLTY0MCw2NSArNjQwLDY1IEBACiAgICAgUHlfc3NpemVfdCBzaXplOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dW5pY29kZV9pbnRlcm5hbF9lbmNvZGUiLAotCQkJICAmb2JqLCAmZXJyb3JzKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iaiwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKSB7Ci0JZGF0YSA9IFB5VW5pY29kZV9BU19EQVRBKG9iaik7Ci0Jc2l6ZSA9IFB5VW5pY29kZV9HRVRfREFUQV9TSVpFKG9iaik7Ci0JcmV0dXJuIGNvZGVjX3R1cGxlKFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIHNpemUpLAotCQkJICAgUHlVbmljb2RlX0dFVF9TSVpFKG9iaikpOworICAgICAgICBkYXRhID0gUHlVbmljb2RlX0FTX0RBVEEob2JqKTsKKyAgICAgICAgc2l6ZSA9IFB5VW5pY29kZV9HRVRfREFUQV9TSVpFKG9iaik7CisgICAgICAgIHJldHVybiBjb2RlY190dXBsZShQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShvYmopKTsKICAgICB9CiAgICAgZWxzZSB7Ci0JaWYgKFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmosIChjb25zdCB2b2lkICoqKSZkYXRhLCAmc2l6ZSkpCi0JICAgIHJldHVybiBOVUxMOwotCXJldHVybiBjb2RlY190dXBsZShQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBzaXplKSwKLQkJCSAgIHNpemUpOworICAgICAgICBpZiAoUHlPYmplY3RfQXNSZWFkQnVmZmVyKG9iaiwgKGNvbnN0IHZvaWQgKiopJmRhdGEsICZzaXplKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKICAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfN19lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnN0ciwgKnY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl83X2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVVVEY3KFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSwKLQkJCQkJIDAsCi0JCQkJCSAwLAotCQkJCQkgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHV0Zl84X2VuY29kZShQeU9iamVjdCAqc2VsZiwKLQkgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqc3RyLCAqdjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dXRmXzhfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjgoUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCQkJIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJCQkgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KQEAgLTcxMiw3MCArNzEyLDcwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98emk6dXRmXzE2X2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMsICZieXRlb3JkZXIpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVVVEYxNihQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJCQkgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJCQkgIGVycm9ycywKLQkJCQkJICBieXRlb3JkZXIpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlb3JkZXIpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfbGVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMTZfbGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjE2KFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgICAgZXJyb3JzLAotCQkJCQkgICAgIC0xKSwKLQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfYmVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMTZfYmVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjE2KFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgZXJyb3JzLAotCQkJCQkgICsxKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzEpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CkBAIC03ODksMTg2ICs3ODksMTg2IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98emk6dXRmXzMyX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMsICZieXRlb3JkZXIpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVVVEYzMihQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJCQkgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJCQkgIGVycm9ycywKLQkJCQkJICBieXRlb3JkZXIpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlb3JkZXIpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfbGVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfbGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjMyKFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgICAgZXJyb3JzLAotCQkJCQkgICAgIC0xKSwKLQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfYmVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfYmVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjMyKFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgZXJyb3JzLAotCQkJCQkgICsxKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzEpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2VzY2FwZV9lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSAgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqc3RyLCAqdjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dW5pY29kZV9lc2NhcGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVuaWNvZGVFc2NhcGUoUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCQkJCSAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCQlQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpyYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVJhd1VuaWNvZGVFc2NhcGUoCi0JCQkgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCSAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSksCi0JCSAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxhdGluXzFfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpsYXRpbl8xX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVMYXRpbjEoCi0JCQkgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCSAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSwKLQkJCSAgICAgICBlcnJvcnMpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOwogICAgIFB5X0RFQ1JFRihzdHIpOwogICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXNjaWlfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnN0ciwgKnY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OmFzY2lpX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVBU0NJSSgKLQkJCSAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJICAgICAgIGVycm9ycyksCi0JCSAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjaGFybWFwX2VuY29kZShQeU9iamVjdCAqc2VsZiwKLQkgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm1hcHBpbmcgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHpPOmNoYXJtYXBfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycywgJm1hcHBpbmcpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzLCAmbWFwcGluZykpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChtYXBwaW5nID09IFB5X05vbmUpCi0JbWFwcGluZyA9IE5VTEw7CisgICAgICAgIG1hcHBpbmcgPSBOVUxMOwogCiAgICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKICAgICBpZiAoc3RyID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcCgKLQkJCSAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJICAgICAgIG1hcHBpbmcsCi0JCQkgICAgICAgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOwogICAgIFB5X0RFQ1JFRihzdHIpOwogICAgIHJldHVybiB2OwogfQpAQCAtOTg2LDIzICs5ODYsMjMgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1iY3NfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejptYmNzX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVNQkNTKAotCQkJICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkgICAgICAgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KQEAgLTEwMjcsOCArMTAyNyw4IEBACiAgICAgUHlPYmplY3QgKmhhbmRsZXI7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOnJlZ2lzdGVyX2Vycm9yIiwKLQkJCSAgJm5hbWUsICZoYW5kbGVyKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsICZoYW5kbGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5Q29kZWNfUmVnaXN0ZXJFcnJvcihuYW1lLCBoYW5kbGVyKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfUkVUVVJOX05PTkU7CkBAIC0xMDQ1LDY4ICsxMDQ1LDY4IEBACiAgICAgY29uc3QgY2hhciAqbmFtZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpsb29rdXBfZXJyb3IiLAotCQkJICAmbmFtZSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIFB5Q29kZWNfTG9va3VwRXJyb3IobmFtZSk7CiB9CiAKIC8qIC0tLSBNb2R1bGUgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgX2NvZGVjc19mdW5jdGlvbnNbXSA9IHsKLSAgICB7InJlZ2lzdGVyIiwJCWNvZGVjX3JlZ2lzdGVyLAkJCU1FVEhfTywKKyAgICB7InJlZ2lzdGVyIiwgICAgICAgICAgICAgICAgY29kZWNfcmVnaXN0ZXIsICAgICAgICAgICAgICAgICBNRVRIX08sCiAgICAgICAgIHJlZ2lzdGVyX19kb2NfX30sCi0gICAgeyJsb29rdXAiLAkJCWNvZGVjX2xvb2t1cCwgCQkJTUVUSF9WQVJBUkdTLAorICAgIHsibG9va3VwIiwgICAgICAgICAgICAgICAgICBjb2RlY19sb29rdXAsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKICAgICAgICAgbG9va3VwX19kb2NfX30sCi0gICAgeyJlbmNvZGUiLAkJCWNvZGVjX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1MsCi0JZW5jb2RlX19kb2NfX30sCi0gICAgeyJkZWNvZGUiLAkJCWNvZGVjX2RlY29kZSwJCQlNRVRIX1ZBUkFSR1MsCi0JZGVjb2RlX19kb2NfX30sCi0gICAgeyJlc2NhcGVfZW5jb2RlIiwJCWVzY2FwZV9lbmNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImVzY2FwZV9kZWNvZGUiLAkJZXNjYXBlX2RlY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAorICAgIHsiZW5jb2RlIiwgICAgICAgICAgICAgICAgICBjb2RlY19lbmNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgZW5jb2RlX19kb2NfX30sCisgICAgeyJkZWNvZGUiLCAgICAgICAgICAgICAgICAgIGNvZGVjX2RlY29kZSwgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICBkZWNvZGVfX2RvY19ffSwKKyAgICB7ImVzY2FwZV9lbmNvZGUiLCAgICAgICAgICAgZXNjYXBlX2VuY29kZSwgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZXNjYXBlX2RlY29kZSIsICAgICAgICAgICBlc2NhcGVfZGVjb2RlLCAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotICAgIHsidXRmXzhfZW5jb2RlIiwJCXV0Zl84X2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzhfZGVjb2RlIiwJCXV0Zl84X2RlY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzdfZW5jb2RlIiwJCXV0Zl83X2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzdfZGVjb2RlIiwJCXV0Zl83X2RlY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzE2X2VuY29kZSIsCQl1dGZfMTZfZW5jb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMTZfbGVfZW5jb2RlIiwJdXRmXzE2X2xlX2VuY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMTZfYmVfZW5jb2RlIiwJdXRmXzE2X2JlX2VuY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMTZfZGVjb2RlIiwJCXV0Zl8xNl9kZWNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8xNl9sZV9kZWNvZGUiLAl1dGZfMTZfbGVfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8xNl9iZV9kZWNvZGUiLAl1dGZfMTZfYmVfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8xNl9leF9kZWNvZGUiLAl1dGZfMTZfZXhfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8zMl9lbmNvZGUiLAkJdXRmXzMyX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzMyX2xlX2VuY29kZSIsCXV0Zl8zMl9sZV9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzMyX2JlX2VuY29kZSIsCXV0Zl8zMl9iZV9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzMyX2RlY29kZSIsCQl1dGZfMzJfZGVjb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMzJfbGVfZGVjb2RlIiwJdXRmXzMyX2xlX2RlY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMzJfYmVfZGVjb2RlIiwJdXRmXzMyX2JlX2RlY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMzJfZXhfZGVjb2RlIiwJdXRmXzMyX2V4X2RlY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1bmljb2RlX2VzY2FwZV9lbmNvZGUiLAl1bmljb2RlX2VzY2FwZV9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidW5pY29kZV9lc2NhcGVfZGVjb2RlIiwJdW5pY29kZV9lc2NhcGVfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlIiwJdW5pY29kZV9pbnRlcm5hbF9lbmNvZGUsCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1bmljb2RlX2ludGVybmFsX2RlY29kZSIsCXVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlLAlNRVRIX1ZBUkFSR1N9LAotICAgIHsicmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZSIsIHJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUsCU1FVEhfVkFSQVJHU30sCi0gICAgeyJyYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlIiwgcmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZSwJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImxhdGluXzFfZW5jb2RlIiwgCQlsYXRpbl8xX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsibGF0aW5fMV9kZWNvZGUiLCAJCWxhdGluXzFfZGVjb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJhc2NpaV9lbmNvZGUiLCAJCWFzY2lpX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsiYXNjaWlfZGVjb2RlIiwgCQlhc2NpaV9kZWNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImNoYXJtYXBfZW5jb2RlIiwgCQljaGFybWFwX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsiY2hhcm1hcF9kZWNvZGUiLCAJCWNoYXJtYXBfZGVjb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJjaGFybWFwX2J1aWxkIiwgCQljaGFybWFwX2J1aWxkLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJyZWFkYnVmZmVyX2VuY29kZSIsCXJlYWRidWZmZXJfZW5jb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImNoYXJidWZmZXJfZW5jb2RlIiwJY2hhcmJ1ZmZlcl9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzhfZW5jb2RlIiwgICAgICAgICAgICB1dGZfOF9lbmNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfOF9kZWNvZGUiLCAgICAgICAgICAgIHV0Zl84X2RlY29kZSwgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl83X2VuY29kZSIsICAgICAgICAgICAgdXRmXzdfZW5jb2RlLCAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzdfZGVjb2RlIiwgICAgICAgICAgICB1dGZfN19kZWNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMTZfZW5jb2RlIiwgICAgICAgICAgIHV0Zl8xNl9lbmNvZGUsICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8xNl9sZV9lbmNvZGUiLCAgICAgICAgdXRmXzE2X2xlX2VuY29kZSwgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzE2X2JlX2VuY29kZSIsICAgICAgICB1dGZfMTZfYmVfZW5jb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMTZfZGVjb2RlIiwgICAgICAgICAgIHV0Zl8xNl9kZWNvZGUsICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8xNl9sZV9kZWNvZGUiLCAgICAgICAgdXRmXzE2X2xlX2RlY29kZSwgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzE2X2JlX2RlY29kZSIsICAgICAgICB1dGZfMTZfYmVfZGVjb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMTZfZXhfZGVjb2RlIiwgICAgICAgIHV0Zl8xNl9leF9kZWNvZGUsICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8zMl9lbmNvZGUiLCAgICAgICAgICAgdXRmXzMyX2VuY29kZSwgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzMyX2xlX2VuY29kZSIsICAgICAgICB1dGZfMzJfbGVfZW5jb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMzJfYmVfZW5jb2RlIiwgICAgICAgIHV0Zl8zMl9iZV9lbmNvZGUsICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8zMl9kZWNvZGUiLCAgICAgICAgICAgdXRmXzMyX2RlY29kZSwgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzMyX2xlX2RlY29kZSIsICAgICAgICB1dGZfMzJfbGVfZGVjb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMzJfYmVfZGVjb2RlIiwgICAgICAgIHV0Zl8zMl9iZV9kZWNvZGUsICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8zMl9leF9kZWNvZGUiLCAgICAgICAgdXRmXzMyX2V4X2RlY29kZSwgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidW5pY29kZV9lc2NhcGVfZW5jb2RlIiwgICB1bmljb2RlX2VzY2FwZV9lbmNvZGUsICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1bmljb2RlX2VzY2FwZV9kZWNvZGUiLCAgIHVuaWNvZGVfZXNjYXBlX2RlY29kZSwgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlIiwgdW5pY29kZV9pbnRlcm5hbF9lbmNvZGUsICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidW5pY29kZV9pbnRlcm5hbF9kZWNvZGUiLCB1bmljb2RlX2ludGVybmFsX2RlY29kZSwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJyYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlIiwgcmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZSwgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUiLCByYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlLCAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsibGF0aW5fMV9lbmNvZGUiLCAgICAgICAgICBsYXRpbl8xX2VuY29kZSwgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJsYXRpbl8xX2RlY29kZSIsICAgICAgICAgIGxhdGluXzFfZGVjb2RlLCAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImFzY2lpX2VuY29kZSIsICAgICAgICAgICAgYXNjaWlfZW5jb2RlLCAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiYXNjaWlfZGVjb2RlIiwgICAgICAgICAgICBhc2NpaV9kZWNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJjaGFybWFwX2VuY29kZSIsICAgICAgICAgIGNoYXJtYXBfZW5jb2RlLCAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNoYXJtYXBfZGVjb2RlIiwgICAgICAgICAgY2hhcm1hcF9kZWNvZGUsICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY2hhcm1hcF9idWlsZCIsICAgICAgICAgICBjaGFybWFwX2J1aWxkLCAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJyZWFkYnVmZmVyX2VuY29kZSIsICAgICAgIHJlYWRidWZmZXJfZW5jb2RlLCAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNoYXJidWZmZXJfZW5jb2RlIiwgICAgICAgY2hhcmJ1ZmZlcl9lbmNvZGUsICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgJiYgZGVmaW5lZChIQVZFX1VTQUJMRV9XQ0hBUl9UKQotICAgIHsibWJjc19lbmNvZGUiLCAJCW1iY3NfZW5jb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJtYmNzX2RlY29kZSIsIAkJbWJjc19kZWNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1iY3NfZW5jb2RlIiwgICAgICAgICAgICAgbWJjc19lbmNvZGUsICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsibWJjc19kZWNvZGUiLCAgICAgICAgICAgICBtYmNzX2RlY29kZSwgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKICNlbmRpZiAvKiBQeV9VU0lOR19VTklDT0RFICovCi0gICAgeyJyZWdpc3Rlcl9lcnJvciIsIAkJcmVnaXN0ZXJfZXJyb3IsCQkJTUVUSF9WQVJBUkdTLAorICAgIHsicmVnaXN0ZXJfZXJyb3IiLCAgICAgICAgICByZWdpc3Rlcl9lcnJvciwgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKICAgICAgICAgcmVnaXN0ZXJfZXJyb3JfX2RvY19ffSwKLSAgICB7Imxvb2t1cF9lcnJvciIsIAkJbG9va3VwX2Vycm9yLAkJCU1FVEhfVkFSQVJHUywKKyAgICB7Imxvb2t1cF9lcnJvciIsICAgICAgICAgICAgbG9va3VwX2Vycm9yLCAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsCiAgICAgICAgIGxvb2t1cF9lcnJvcl9fZG9jX199LAotICAgIHtOVUxMLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgTlVMTH0gICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5TU9ESU5JVF9GVU5DCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jIGIvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYwppbmRleCA1ZDNmYzZiLi5jMTQwZTk3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMKQEAgLTQ2LDkgKzQ2LDkgQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCBCTE9DSyB7Ci0Jc3RydWN0IEJMT0NLICpsZWZ0bGluazsKLQlzdHJ1Y3QgQkxPQ0sgKnJpZ2h0bGluazsKLQlQeU9iamVjdCAqZGF0YVtCTE9DS0xFTl07CisgICAgc3RydWN0IEJMT0NLICpsZWZ0bGluazsKKyAgICBzdHJ1Y3QgQkxPQ0sgKnJpZ2h0bGluazsKKyAgICBQeU9iamVjdCAqZGF0YVtCTE9DS0xFTl07CiB9IGJsb2NrOwogCiAjZGVmaW5lIE1BWEZSRUVCTE9DS1MgMTAKQEAgLTU3LDcxICs1Nyw3MSBAQAogCiBzdGF0aWMgYmxvY2sgKgogbmV3YmxvY2soYmxvY2sgKmxlZnRsaW5rLCBibG9jayAqcmlnaHRsaW5rLCBQeV9zc2l6ZV90IGxlbikgewotCWJsb2NrICpiOwotCS8qIFRvIHByZXZlbnQgbGVuIGZyb20gb3ZlcmZsb3dpbmcgUFlfU1NJWkVfVF9NQVggb24gNjQtYml0IG1hY2hpbmVzLCB3ZQotCSAqIHJlZnVzZSB0byBhbGxvY2F0ZSBuZXcgYmxvY2tzIGlmIHRoZSBjdXJyZW50IGxlbiBpcyBkYW5nZXJvdXNseQotCSAqIGNsb3NlLiAgVGhlcmUgaXMgc29tZSBleHRyYSBtYXJnaW4gdG8gcHJldmVudCBzcHVyaW91cyBhcml0aG1ldGljCi0JICogb3ZlcmZsb3dzIGF0IHZhcmlvdXMgcGxhY2VzLiAgVGhlIGZvbGxvd2luZyBjaGVjayBlbnN1cmVzIHRoYXQKLQkgKiB0aGUgYmxvY2tzIGFsbG9jYXRlZCB0byB0aGUgZGVxdWUsIGluIHRoZSB3b3JzdCBjYXNlLCBjYW4gb25seQotCSAqIGhhdmUgUFlfU1NJWkVfVF9NQVgtMiBlbnRyaWVzIGluIHRvdGFsLgotCSAqLwotCWlmIChsZW4gPj0gUFlfU1NJWkVfVF9NQVggLSAyKkJMT0NLTEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJjYW5ub3QgYWRkIG1vcmUgYmxvY2tzIHRvIHRoZSBkZXF1ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG51bWZyZWVibG9ja3MpIHsKLQkJbnVtZnJlZWJsb2NrcyAtPSAxOwotCQliID0gZnJlZWJsb2Nrc1tudW1mcmVlYmxvY2tzXTsKLQl9IGVsc2UgewotCQliID0gUHlNZW1fTWFsbG9jKHNpemVvZihibG9jaykpOwotCQlpZiAoYiA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JYi0+bGVmdGxpbmsgPSBsZWZ0bGluazsKLQliLT5yaWdodGxpbmsgPSByaWdodGxpbms7Ci0JcmV0dXJuIGI7CisgICAgYmxvY2sgKmI7CisgICAgLyogVG8gcHJldmVudCBsZW4gZnJvbSBvdmVyZmxvd2luZyBQWV9TU0laRV9UX01BWCBvbiA2NC1iaXQgbWFjaGluZXMsIHdlCisgICAgICogcmVmdXNlIHRvIGFsbG9jYXRlIG5ldyBibG9ja3MgaWYgdGhlIGN1cnJlbnQgbGVuIGlzIGRhbmdlcm91c2x5CisgICAgICogY2xvc2UuICBUaGVyZSBpcyBzb21lIGV4dHJhIG1hcmdpbiB0byBwcmV2ZW50IHNwdXJpb3VzIGFyaXRobWV0aWMKKyAgICAgKiBvdmVyZmxvd3MgYXQgdmFyaW91cyBwbGFjZXMuICBUaGUgZm9sbG93aW5nIGNoZWNrIGVuc3VyZXMgdGhhdAorICAgICAqIHRoZSBibG9ja3MgYWxsb2NhdGVkIHRvIHRoZSBkZXF1ZSwgaW4gdGhlIHdvcnN0IGNhc2UsIGNhbiBvbmx5CisgICAgICogaGF2ZSBQWV9TU0laRV9UX01BWC0yIGVudHJpZXMgaW4gdG90YWwuCisgICAgICovCisgICAgaWYgKGxlbiA+PSBQWV9TU0laRV9UX01BWCAtIDIqQkxPQ0tMRU4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFkZCBtb3JlIGJsb2NrcyB0byB0aGUgZGVxdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChudW1mcmVlYmxvY2tzKSB7CisgICAgICAgIG51bWZyZWVibG9ja3MgLT0gMTsKKyAgICAgICAgYiA9IGZyZWVibG9ja3NbbnVtZnJlZWJsb2Nrc107CisgICAgfSBlbHNlIHsKKyAgICAgICAgYiA9IFB5TWVtX01hbGxvYyhzaXplb2YoYmxvY2spKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGItPmxlZnRsaW5rID0gbGVmdGxpbms7CisgICAgYi0+cmlnaHRsaW5rID0gcmlnaHRsaW5rOworICAgIHJldHVybiBiOwogfQogCiBzdGF0aWMgdm9pZAogZnJlZWJsb2NrKGJsb2NrICpiKQogewotCWlmIChudW1mcmVlYmxvY2tzIDwgTUFYRlJFRUJMT0NLUykgewotCQlmcmVlYmxvY2tzW251bWZyZWVibG9ja3NdID0gYjsKLQkJbnVtZnJlZWJsb2NrcysrOwotCX0gZWxzZSB7Ci0JCVB5TWVtX0ZyZWUoYik7Ci0JfQorICAgIGlmIChudW1mcmVlYmxvY2tzIDwgTUFYRlJFRUJMT0NLUykgeworICAgICAgICBmcmVlYmxvY2tzW251bWZyZWVibG9ja3NdID0gYjsKKyAgICAgICAgbnVtZnJlZWJsb2NrcysrOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5TWVtX0ZyZWUoYik7CisgICAgfQogfQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWJsb2NrICpsZWZ0YmxvY2s7Ci0JYmxvY2sgKnJpZ2h0YmxvY2s7Ci0JUHlfc3NpemVfdCBsZWZ0aW5kZXg7CS8qIGluIHJhbmdlKEJMT0NLTEVOKSAqLwotCVB5X3NzaXplX3QgcmlnaHRpbmRleDsJLyogaW4gcmFuZ2UoQkxPQ0tMRU4pICovCi0JUHlfc3NpemVfdCBsZW47Ci0JUHlfc3NpemVfdCBtYXhsZW47Ci0JbG9uZyBzdGF0ZTsJLyogaW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhlIGluZGljZXMgbW92ZSAqLwotCVB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgYmxvY2sgKmxlZnRibG9jazsKKyAgICBibG9jayAqcmlnaHRibG9jazsKKyAgICBQeV9zc2l6ZV90IGxlZnRpbmRleDsgICAgICAgLyogaW4gcmFuZ2UoQkxPQ0tMRU4pICovCisgICAgUHlfc3NpemVfdCByaWdodGluZGV4OyAgICAgIC8qIGluIHJhbmdlKEJMT0NLTEVOKSAqLworICAgIFB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3QgbWF4bGVuOworICAgIGxvbmcgc3RhdGU7ICAgICAgICAgLyogaW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhlIGluZGljZXMgbW92ZSAqLworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KIH0gZGVxdWVvYmplY3Q7CiAKIC8qIFRoZSBkZXF1ZSdzIHNpemUgbGltaXQgaXMgZC5tYXhsZW4uICBUaGUgbGltaXQgY2FuIGJlIHplcm8gb3IgcG9zaXRpdmUuCiAgKiBJZiB0aGVyZSBpcyBubyBsaW1pdCwgdGhlbiBkLm1heGxlbiA9PSAtMS4KLSAqIAorICoKICAqIEFmdGVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gYSBkZXF1ZSwgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBzaXplIGhhcyBncm93biBwYXN0CiAgKiB0aGUgbGltaXQuIElmIGl0IGhhcywgd2UgZ2V0IHRoZSBzaXplIGJhY2sgZG93biB0byB0aGUgbGltaXQgYnkgcG9wcGluZyBhbgogICogaXRlbSBvZmYgb2YgdGhlIG9wcG9zaXRlIGVuZC4gIFRoZSBtZXRob2RzIHRoYXQgY2FuIHRyaWdnZXIgdGhpcyBhcmUgYXBwZW5kKCksCiAgKiBhcHBlbmRsZWZ0KCksIGV4dGVuZCgpLCBhbmQgZXh0ZW5kbGVmdCgpLgogICovCiAKLSNkZWZpbmUgVFJJTShkLCBwb3BmdW5jdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLSAgICBpZiAoZC0+bWF4bGVuICE9IC0xICYmIGQtPmxlbiA+IGQtPm1heGxlbikgeyAgICAgICAgICAgICAgCVwKLSAgICAgICAgICAgIFB5T2JqZWN0ICpydiA9IHBvcGZ1bmN0aW9uKGQsIE5VTEwpOyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBhc3NlcnQocnYgIT0gTlVMTCAgJiYgIGQtPmxlbiA8PSBkLT5tYXhsZW4pOyAgICAgICAgXAotICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgVFJJTShkLCBwb3BmdW5jdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGQtPm1heGxlbiAhPSAtMSAmJiBkLT5sZW4gPiBkLT5tYXhsZW4pIHsgICAgICAgICAgICAgICAgXAorICAgICAgICBQeU9iamVjdCAqcnYgPSBwb3BmdW5jdGlvbihkLCBOVUxMKTsgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NlcnQocnYgIT0gTlVMTCAgJiYgIGQtPmxlbiA8PSBkLT5tYXhsZW4pOyAgICAgICAgXAorICAgICAgICBQeV9ERUNSRUYocnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBkZXF1ZV90eXBlOwpAQCAtMTI5LDY1ICsxMjksNjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JZGVxdWVvYmplY3QgKmRlcXVlOwotCWJsb2NrICpiOworICAgIGRlcXVlb2JqZWN0ICpkZXF1ZTsKKyAgICBibG9jayAqYjsKIAotCS8qIGNyZWF0ZSBkZXF1ZW9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlkZXF1ZSA9IChkZXF1ZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChkZXF1ZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBjcmVhdGUgZGVxdWVvYmplY3Qgc3RydWN0dXJlICovCisgICAgZGVxdWUgPSAoZGVxdWVvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoZGVxdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQliID0gbmV3YmxvY2soTlVMTCwgTlVMTCwgMCk7Ci0JaWYgKGIgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZGVxdWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYiA9IG5ld2Jsb2NrKE5VTEwsIE5VTEwsIDApOworICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGRlcXVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYXNzZXJ0KEJMT0NLTEVOID49IDIpOwotCWRlcXVlLT5sZWZ0YmxvY2sgPSBiOwotCWRlcXVlLT5yaWdodGJsb2NrID0gYjsKLQlkZXF1ZS0+bGVmdGluZGV4ID0gQ0VOVEVSICsgMTsKLQlkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKLQlkZXF1ZS0+bGVuID0gMDsKLQlkZXF1ZS0+c3RhdGUgPSAwOwotCWRlcXVlLT53ZWFrcmVmbGlzdCA9IE5VTEw7Ci0JZGVxdWUtPm1heGxlbiA9IC0xOworICAgIGFzc2VydChCTE9DS0xFTiA+PSAyKTsKKyAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKKyAgICBkZXF1ZS0+cmlnaHRibG9jayA9IGI7CisgICAgZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7CisgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7CisgICAgZGVxdWUtPmxlbiA9IDA7CisgICAgZGVxdWUtPnN0YXRlID0gMDsKKyAgICBkZXF1ZS0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIGRlcXVlLT5tYXhsZW4gPSAtMTsKIAotCXJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9wb3AoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqdW51c2VkKQogewotCVB5T2JqZWN0ICppdGVtOwotCWJsb2NrICpwcmV2YmxvY2s7CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgYmxvY2sgKnByZXZibG9jazsKIAotCWlmIChkZXF1ZS0+bGVuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgZnJvbSBhbiBlbXB0eSBkZXF1ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXRlbSA9IGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XTsKLQlkZXF1ZS0+cmlnaHRpbmRleC0tOwotCWRlcXVlLT5sZW4tLTsKLQlkZXF1ZS0+c3RhdGUrKzsKKyAgICBpZiAoZGVxdWUtPmxlbiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGZyb20gYW4gZW1wdHkgZGVxdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ZW0gPSBkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF07CisgICAgZGVxdWUtPnJpZ2h0aW5kZXgtLTsKKyAgICBkZXF1ZS0+bGVuLS07CisgICAgZGVxdWUtPnN0YXRlKys7CiAKLQlpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gLTEpIHsKLQkJaWYgKGRlcXVlLT5sZW4gPT0gMCkgewotCQkJYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2spOwotCQkJYXNzZXJ0KGRlcXVlLT5sZWZ0aW5kZXggPT0gZGVxdWUtPnJpZ2h0aW5kZXgrMSk7Ci0JCQkvKiByZS1jZW50ZXIgaW5zdGVhZCBvZiBmcmVlaW5nIGEgYmxvY2sgKi8KLQkJCWRlcXVlLT5sZWZ0aW5kZXggPSBDRU5URVIgKyAxOwotCQkJZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2YmxvY2sgPSBkZXF1ZS0+cmlnaHRibG9jay0+bGVmdGxpbms7Ci0JCQlhc3NlcnQoZGVxdWUtPmxlZnRibG9jayAhPSBkZXF1ZS0+cmlnaHRibG9jayk7Ci0JCQlmcmVlYmxvY2soZGVxdWUtPnJpZ2h0YmxvY2spOwotCQkJcHJldmJsb2NrLT5yaWdodGxpbmsgPSBOVUxMOwotCQkJZGVxdWUtPnJpZ2h0YmxvY2sgPSBwcmV2YmxvY2s7Ci0JCQlkZXF1ZS0+cmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMTsKLQkJfQotCX0KLQlyZXR1cm4gaXRlbTsKKyAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gLTEpIHsKKyAgICAgICAgaWYgKGRlcXVlLT5sZW4gPT0gMCkgeworICAgICAgICAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2spOworICAgICAgICAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0aW5kZXggPT0gZGVxdWUtPnJpZ2h0aW5kZXgrMSk7CisgICAgICAgICAgICAvKiByZS1jZW50ZXIgaW5zdGVhZCBvZiBmcmVlaW5nIGEgYmxvY2sgKi8KKyAgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBDRU5URVIgKyAxOworICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2YmxvY2sgPSBkZXF1ZS0+cmlnaHRibG9jay0+bGVmdGxpbms7CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayAhPSBkZXF1ZS0+cmlnaHRibG9jayk7CisgICAgICAgICAgICBmcmVlYmxvY2soZGVxdWUtPnJpZ2h0YmxvY2spOworICAgICAgICAgICAgcHJldmJsb2NrLT5yaWdodGxpbmsgPSBOVUxMOworICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBwcmV2YmxvY2s7CisgICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKHBvcF9kb2MsICJSZW1vdmUgYW5kIHJldHVybiB0aGUgcmlnaHRtb3N0IGVsZW1lbnQuIik7CkBAIC0xOTUsMzcgKzE5NSwzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX3BvcGxlZnQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqdW51c2VkKQogewotCVB5T2JqZWN0ICppdGVtOwotCWJsb2NrICpwcmV2YmxvY2s7CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgYmxvY2sgKnByZXZibG9jazsKIAotCWlmIChkZXF1ZS0+bGVuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgZnJvbSBhbiBlbXB0eSBkZXF1ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgIT0gTlVMTCk7Ci0JaXRlbSA9IGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF07Ci0JZGVxdWUtPmxlZnRpbmRleCsrOwotCWRlcXVlLT5sZW4tLTsKLQlkZXF1ZS0+c3RhdGUrKzsKKyAgICBpZiAoZGVxdWUtPmxlbiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGZyb20gYW4gZW1wdHkgZGVxdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IE5VTEwpOworICAgIGl0ZW0gPSBkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdOworICAgIGRlcXVlLT5sZWZ0aW5kZXgrKzsKKyAgICBkZXF1ZS0+bGVuLS07CisgICAgZGVxdWUtPnN0YXRlKys7CiAKLQlpZiAoZGVxdWUtPmxlZnRpbmRleCA9PSBCTE9DS0xFTikgewotCQlpZiAoZGVxdWUtPmxlbiA9PSAwKSB7Ci0JCQlhc3NlcnQoZGVxdWUtPmxlZnRibG9jayA9PSBkZXF1ZS0+cmlnaHRibG9jayk7Ci0JCQlhc3NlcnQoZGVxdWUtPmxlZnRpbmRleCA9PSBkZXF1ZS0+cmlnaHRpbmRleCsxKTsKLQkJCS8qIHJlLWNlbnRlciBpbnN0ZWFkIG9mIGZyZWVpbmcgYSBibG9jayAqLwotCQkJZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7Ci0JCQlkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IGRlcXVlLT5yaWdodGJsb2NrKTsKLQkJCXByZXZibG9jayA9IGRlcXVlLT5sZWZ0YmxvY2stPnJpZ2h0bGluazsKLQkJCWZyZWVibG9jayhkZXF1ZS0+bGVmdGJsb2NrKTsKLQkJCWFzc2VydChwcmV2YmxvY2sgIT0gTlVMTCk7Ci0JCQlwcmV2YmxvY2stPmxlZnRsaW5rID0gTlVMTDsKLQkJCWRlcXVlLT5sZWZ0YmxvY2sgPSBwcmV2YmxvY2s7Ci0JCQlkZXF1ZS0+bGVmdGluZGV4ID0gMDsKLQkJfQotCX0KLQlyZXR1cm4gaXRlbTsKKyAgICBpZiAoZGVxdWUtPmxlZnRpbmRleCA9PSBCTE9DS0xFTikgeworICAgICAgICBpZiAoZGVxdWUtPmxlbiA9PSAwKSB7CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayA9PSBkZXF1ZS0+cmlnaHRibG9jayk7CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRpbmRleCA9PSBkZXF1ZS0+cmlnaHRpbmRleCsxKTsKKyAgICAgICAgICAgIC8qIHJlLWNlbnRlciBpbnN0ZWFkIG9mIGZyZWVpbmcgYSBibG9jayAqLworICAgICAgICAgICAgZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7CisgICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IGRlcXVlLT5yaWdodGJsb2NrKTsKKyAgICAgICAgICAgIHByZXZibG9jayA9IGRlcXVlLT5sZWZ0YmxvY2stPnJpZ2h0bGluazsKKyAgICAgICAgICAgIGZyZWVibG9jayhkZXF1ZS0+bGVmdGJsb2NrKTsKKyAgICAgICAgICAgIGFzc2VydChwcmV2YmxvY2sgIT0gTlVMTCk7CisgICAgICAgICAgICBwcmV2YmxvY2stPmxlZnRsaW5rID0gTlVMTDsKKyAgICAgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBwcmV2YmxvY2s7CisgICAgICAgICAgICBkZXF1ZS0+bGVmdGluZGV4ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKHBvcGxlZnRfZG9jLCAiUmVtb3ZlIGFuZCByZXR1cm4gdGhlIGxlZnRtb3N0IGVsZW1lbnQuIik7CkBAIC0yMzMsMjIgKzIzMywyMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2FwcGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQogewotCWRlcXVlLT5zdGF0ZSsrOwotCWlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSBCTE9DS0xFTi0xKSB7Ci0JCWJsb2NrICpiID0gbmV3YmxvY2soZGVxdWUtPnJpZ2h0YmxvY2ssIE5VTEwsIGRlcXVlLT5sZW4pOwotCQlpZiAoYiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWFzc2VydChkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID09IE5VTEwpOwotCQlkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKLQkJZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOwotCQlkZXF1ZS0+cmlnaHRpbmRleCA9IC0xOwotCX0KLQlQeV9JTkNSRUYoaXRlbSk7Ci0JZGVxdWUtPmxlbisrOwotCWRlcXVlLT5yaWdodGluZGV4Kys7Ci0JZGVxdWUtPnJpZ2h0YmxvY2stPmRhdGFbZGVxdWUtPnJpZ2h0aW5kZXhdID0gaXRlbTsKLQlUUklNKGRlcXVlLCBkZXF1ZV9wb3BsZWZ0KTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBkZXF1ZS0+c3RhdGUrKzsKKyAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4tMSkgeworICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKGRlcXVlLT5yaWdodGJsb2NrLCBOVUxMLCBkZXF1ZS0+bGVuKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhc3NlcnQoZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9PSBOVUxMKTsKKyAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9IGI7CisgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKKyAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAtMTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIGRlcXVlLT5sZW4rKzsKKyAgICBkZXF1ZS0+cmlnaHRpbmRleCsrOworICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07CisgICAgVFJJTShkZXF1ZSwgZGVxdWVfcG9wbGVmdCk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihhcHBlbmRfZG9jLCAiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlcXVlLiIpOwpAQCAtMjU2LDkwICsyNTYsOTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JZGVxdWUtPnN0YXRlKys7Ci0JaWYgKGRlcXVlLT5sZWZ0aW5kZXggPT0gMCkgewotCQlibG9jayAqYiA9IG5ld2Jsb2NrKE5VTEwsIGRlcXVlLT5sZWZ0YmxvY2ssIGRlcXVlLT5sZW4pOwotCQlpZiAoYiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWFzc2VydChkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayA9PSBOVUxMKTsKLQkJZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPSBiOwotCQlkZXF1ZS0+bGVmdGJsb2NrID0gYjsKLQkJZGVxdWUtPmxlZnRpbmRleCA9IEJMT0NLTEVOOwotCX0KLQlQeV9JTkNSRUYoaXRlbSk7Ci0JZGVxdWUtPmxlbisrOwotCWRlcXVlLT5sZWZ0aW5kZXgtLTsKLQlkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdID0gaXRlbTsKLQlUUklNKGRlcXVlLCBkZXF1ZV9wb3ApOwotCVB5X1JFVFVSTl9OT05FOworICAgIGRlcXVlLT5zdGF0ZSsrOworICAgIGlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKKyAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhOVUxMLCBkZXF1ZS0+bGVmdGJsb2NrLCBkZXF1ZS0+bGVuKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPT0gTlVMTCk7CisgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rID0gYjsKKyAgICAgICAgZGVxdWUtPmxlZnRibG9jayA9IGI7CisgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBCTE9DS0xFTjsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIGRlcXVlLT5sZW4rKzsKKyAgICBkZXF1ZS0+bGVmdGluZGV4LS07CisgICAgZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XSA9IGl0ZW07CisgICAgVFJJTShkZXF1ZSwgZGVxdWVfcG9wKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGFwcGVuZGxlZnRfZG9jLCAiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZGVxdWUuIik7CiAKIAotLyogUnVuIGFuIGl0ZXJhdG9yIHRvIGV4aGF1c3Rpb24uICBTaG9ydGN1dCBmb3IgCisvKiBSdW4gYW4gaXRlcmF0b3IgdG8gZXhoYXVzdGlvbi4gIFNob3J0Y3V0IGZvcgogICAgdGhlIGV4dGVuZC9leHRlbmRsZWZ0IG1ldGhvZHMgd2hlbiBtYXhsZW4gPT0gMC4gKi8KIHN0YXRpYyBQeU9iamVjdCoKIGNvbnN1bWVfaXRlcmF0b3IoUHlPYmplY3QgKml0KQogewotCVB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICppdGVtOwogCi0Jd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9Ci0JUHlfREVDUkVGKGl0KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9leHRlbmQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlcmFibGUpCiB7Ci0JUHlPYmplY3QgKml0LCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXQsICppdGVtOwogCi0JLyogSGFuZGxlIGNhc2Ugd2hlcmUgaWQoZGVxdWUpID09IGlkKGl0ZXJhYmxlKSAqLwotCWlmICgoUHlPYmplY3QgKilkZXF1ZSA9PSBpdGVyYWJsZSkgewotCQlQeU9iamVjdCAqcmVzdWx0OwotCQlQeU9iamVjdCAqcyA9IFB5U2VxdWVuY2VfTGlzdChpdGVyYWJsZSk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmVzdWx0ID0gZGVxdWVfZXh0ZW5kKGRlcXVlLCBzKTsKLQkJUHlfREVDUkVGKHMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICAvKiBIYW5kbGUgY2FzZSB3aGVyZSBpZChkZXF1ZSkgPT0gaWQoaXRlcmFibGUpICovCisgICAgaWYgKChQeU9iamVjdCAqKWRlcXVlID09IGl0ZXJhYmxlKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgIFB5T2JqZWN0ICpzID0gUHlTZXF1ZW5jZV9MaXN0KGl0ZXJhYmxlKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXN1bHQgPSBkZXF1ZV9leHRlbmQoZGVxdWUsIHMpOworICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZGVxdWUtPm1heGxlbiA9PSAwKQotCQlyZXR1cm4gY29uc3VtZV9pdGVyYXRvcihpdCk7CisgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIGNvbnN1bWVfaXRlcmF0b3IoaXQpOwogCi0Jd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCWRlcXVlLT5zdGF0ZSsrOwotCQlpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4tMSkgewotCQkJYmxvY2sgKmIgPSBuZXdibG9jayhkZXF1ZS0+cmlnaHRibG9jaywgTlVMTCwKLQkJCQkJICAgIGRlcXVlLT5sZW4pOwotCQkJaWYgKGIgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlQeV9ERUNSRUYoaXQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJYXNzZXJ0KGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmsgPT0gTlVMTCk7Ci0JCQlkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKLQkJCWRlcXVlLT5yaWdodGJsb2NrID0gYjsKLQkJCWRlcXVlLT5yaWdodGluZGV4ID0gLTE7Ci0JCX0KLQkJZGVxdWUtPmxlbisrOwotCQlkZXF1ZS0+cmlnaHRpbmRleCsrOwotCQlkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF0gPSBpdGVtOwotCQlUUklNKGRlcXVlLCBkZXF1ZV9wb3BsZWZ0KTsgICAgICAgICAgICAgICAKLQl9Ci0JUHlfREVDUkVGKGl0KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgIGRlcXVlLT5zdGF0ZSsrOworICAgICAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4tMSkgeworICAgICAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhkZXF1ZS0+cmlnaHRibG9jaywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVxdWUtPmxlbik7CisgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9PSBOVUxMKTsKKyAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmsgPSBiOworICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOworICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAtMTsKKyAgICAgICAgfQorICAgICAgICBkZXF1ZS0+bGVuKys7CisgICAgICAgIGRlcXVlLT5yaWdodGluZGV4Kys7CisgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07CisgICAgICAgIFRSSU0oZGVxdWUsIGRlcXVlX3BvcGxlZnQpOworICAgIH0KKyAgICBQeV9ERUNSRUYoaXQpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGV4dGVuZF9kb2MsCkBAIC0zNDgsNTAgKzM0OCw1MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2V4dGVuZGxlZnQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlcmFibGUpCiB7Ci0JUHlPYmplY3QgKml0LCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXQsICppdGVtOwogCi0JLyogSGFuZGxlIGNhc2Ugd2hlcmUgaWQoZGVxdWUpID09IGlkKGl0ZXJhYmxlKSAqLwotCWlmICgoUHlPYmplY3QgKilkZXF1ZSA9PSBpdGVyYWJsZSkgewotCQlQeU9iamVjdCAqcmVzdWx0OwotCQlQeU9iamVjdCAqcyA9IFB5U2VxdWVuY2VfTGlzdChpdGVyYWJsZSk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmVzdWx0ID0gZGVxdWVfZXh0ZW5kbGVmdChkZXF1ZSwgcyk7Ci0JCVB5X0RFQ1JFRihzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgLyogSGFuZGxlIGNhc2Ugd2hlcmUgaWQoZGVxdWUpID09IGlkKGl0ZXJhYmxlKSAqLworICAgIGlmICgoUHlPYmplY3QgKilkZXF1ZSA9PSBpdGVyYWJsZSkgeworICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgICAgICBQeU9iamVjdCAqcyA9IFB5U2VxdWVuY2VfTGlzdChpdGVyYWJsZSk7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzdWx0ID0gZGVxdWVfZXh0ZW5kbGVmdChkZXF1ZSwgcyk7CisgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChkZXF1ZS0+bWF4bGVuID09IDApCi0JCXJldHVybiBjb25zdW1lX2l0ZXJhdG9yKGl0KTsKKyAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gY29uc3VtZV9pdGVyYXRvcihpdCk7CiAKLQl3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLQkJZGVxdWUtPnN0YXRlKys7Ci0JCWlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKLQkJCWJsb2NrICpiID0gbmV3YmxvY2soTlVMTCwgZGVxdWUtPmxlZnRibG9jaywKLQkJCQkJICAgIGRlcXVlLT5sZW4pOwotCQkJaWYgKGIgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlQeV9ERUNSRUYoaXQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rID09IE5VTEwpOwotCQkJZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPSBiOwotCQkJZGVxdWUtPmxlZnRibG9jayA9IGI7Ci0JCQlkZXF1ZS0+bGVmdGluZGV4ID0gQkxPQ0tMRU47Ci0JCX0KLQkJZGVxdWUtPmxlbisrOwotCQlkZXF1ZS0+bGVmdGluZGV4LS07Ci0JCWRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF0gPSBpdGVtOwotCQlUUklNKGRlcXVlLCBkZXF1ZV9wb3ApOyAgICAgICAgICAgICAgIAotCX0KLQlQeV9ERUNSRUYoaXQpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgICAgIGlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKKyAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soTlVMTCwgZGVxdWUtPmxlZnRibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVxdWUtPmxlbik7CisgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPT0gTlVMTCk7CisgICAgICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayA9IGI7CisgICAgICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKKyAgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBCTE9DS0xFTjsKKyAgICAgICAgfQorICAgICAgICBkZXF1ZS0+bGVuKys7CisgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXgtLTsKKyAgICAgICAgZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XSA9IGl0ZW07CisgICAgICAgIFRSSU0oZGVxdWUsIGRlcXVlX3BvcCk7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZXh0ZW5kbGVmdF9kb2MsCkBAIC00MDAsNjMgKzQwMCw2MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2lucGxhY2VfY29uY2F0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCXJlc3VsdCA9IGRlcXVlX2V4dGVuZChkZXF1ZSwgb3RoZXIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9JTkNSRUYoZGVxdWUpOwotCXJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKKyAgICByZXN1bHQgPSBkZXF1ZV9leHRlbmQoZGVxdWUsIG90aGVyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfSU5DUkVGKGRlcXVlKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiB9CiAKIHN0YXRpYyBpbnQKIF9kZXF1ZV9yb3RhdGUoZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IG4pCiB7Ci0JUHlfc3NpemVfdCBpLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xOwotCVB5T2JqZWN0ICppdGVtLCAqcnY7CisgICAgUHlfc3NpemVfdCBpLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xOworICAgIFB5T2JqZWN0ICppdGVtLCAqcnY7CiAKLQlpZiAobGVuID09IDApCi0JCXJldHVybiAwOwotCWlmIChuID4gaGFsZmxlbiB8fCBuIDwgLWhhbGZsZW4pIHsKLQkJbiAlPSBsZW47Ci0JCWlmIChuID4gaGFsZmxlbikKLQkJCW4gLT0gbGVuOwotCQllbHNlIGlmIChuIDwgLWhhbGZsZW4pCi0JCQluICs9IGxlbjsKLQl9CisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAobiA+IGhhbGZsZW4gfHwgbiA8IC1oYWxmbGVuKSB7CisgICAgICAgIG4gJT0gbGVuOworICAgICAgICBpZiAobiA+IGhhbGZsZW4pCisgICAgICAgICAgICBuIC09IGxlbjsKKyAgICAgICAgZWxzZSBpZiAobiA8IC1oYWxmbGVuKQorICAgICAgICAgICAgbiArPSBsZW47CisgICAgfQogCi0JZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKLQkJaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7Ci0JCWFzc2VydCAoaXRlbSAhPSBOVUxMKTsKLQkJcnYgPSBkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAocnYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKHJ2KTsKLQl9Ci0JZm9yIChpPTAgOyBpPm4gOyBpLS0pIHsKLQkJaXRlbSA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOwotCQlhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7Ci0JCXJ2ID0gZGVxdWVfYXBwZW5kKGRlcXVlLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAocnYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKHJ2KTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKKyAgICAgICAgaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7CisgICAgICAgIGFzc2VydCAoaXRlbSAhPSBOVUxMKTsKKyAgICAgICAgcnYgPSBkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAocnYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9CisgICAgZm9yIChpPTAgOyBpPm4gOyBpLS0pIHsKKyAgICAgICAgaXRlbSA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOworICAgICAgICBhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7CisgICAgICAgIHJ2ID0gZGVxdWVfYXBwZW5kKGRlcXVlLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAocnYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9yb3RhdGUoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IG49MTsKKyAgICBQeV9zc2l6ZV90IG49MTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cm90YXRlIiwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoX2RlcXVlX3JvdGF0ZShkZXF1ZSwgbikgPT0gMCkKLQkJUHlfUkVUVVJOX05PTkU7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpyb3RhdGUiLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChfZGVxdWVfcm90YXRlKGRlcXVlLCBuKSA9PSAwKQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHJvdGF0ZV9kb2MsCkBAIC00NjUsNDAgKzQ2NSw0MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX3JldmVyc2UoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqdW51c2VkKQogewotCWJsb2NrICpsZWZ0YmxvY2sgPSBkZXF1ZS0+bGVmdGJsb2NrOwotCWJsb2NrICpyaWdodGJsb2NrID0gZGVxdWUtPnJpZ2h0YmxvY2s7Ci0JUHlfc3NpemVfdCBsZWZ0aW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwotCVB5X3NzaXplX3QgcmlnaHRpbmRleCA9IGRlcXVlLT5yaWdodGluZGV4OwotCVB5X3NzaXplX3QgbiA9IChkZXF1ZS0+bGVuKS8yOwotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqdG1wOworICAgIGJsb2NrICpsZWZ0YmxvY2sgPSBkZXF1ZS0+bGVmdGJsb2NrOworICAgIGJsb2NrICpyaWdodGJsb2NrID0gZGVxdWUtPnJpZ2h0YmxvY2s7CisgICAgUHlfc3NpemVfdCBsZWZ0aW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OworICAgIFB5X3NzaXplX3QgcmlnaHRpbmRleCA9IGRlcXVlLT5yaWdodGluZGV4OworICAgIFB5X3NzaXplX3QgbiA9IChkZXF1ZS0+bGVuKS8yOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqdG1wOwogCi0JZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKLQkJLyogVmFsaWRhdGUgdGhhdCBwb2ludGVycyBoYXZlbid0IG1ldCBpbiB0aGUgbWlkZGxlICovCi0JCWFzc2VydChsZWZ0YmxvY2sgIT0gcmlnaHRibG9jayB8fCBsZWZ0aW5kZXggPCByaWdodGluZGV4KTsKKyAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgICAgICAvKiBWYWxpZGF0ZSB0aGF0IHBvaW50ZXJzIGhhdmVuJ3QgbWV0IGluIHRoZSBtaWRkbGUgKi8KKyAgICAgICAgYXNzZXJ0KGxlZnRibG9jayAhPSByaWdodGJsb2NrIHx8IGxlZnRpbmRleCA8IHJpZ2h0aW5kZXgpOwogCi0JCS8qIFN3YXAgKi8KLQkJdG1wID0gbGVmdGJsb2NrLT5kYXRhW2xlZnRpbmRleF07Ci0JCWxlZnRibG9jay0+ZGF0YVtsZWZ0aW5kZXhdID0gcmlnaHRibG9jay0+ZGF0YVtyaWdodGluZGV4XTsKLQkJcmlnaHRibG9jay0+ZGF0YVtyaWdodGluZGV4XSA9IHRtcDsKKyAgICAgICAgLyogU3dhcCAqLworICAgICAgICB0bXAgPSBsZWZ0YmxvY2stPmRhdGFbbGVmdGluZGV4XTsKKyAgICAgICAgbGVmdGJsb2NrLT5kYXRhW2xlZnRpbmRleF0gPSByaWdodGJsb2NrLT5kYXRhW3JpZ2h0aW5kZXhdOworICAgICAgICByaWdodGJsb2NrLT5kYXRhW3JpZ2h0aW5kZXhdID0gdG1wOwogCi0JCS8qIEFkdmFuY2UgbGVmdCBibG9jay9pbmRleCBwYWlyICovCi0JCWxlZnRpbmRleCsrOwotCQlpZiAobGVmdGluZGV4ID09IEJMT0NLTEVOKSB7Ci0JCQlhc3NlcnQgKGxlZnRibG9jay0+cmlnaHRsaW5rICE9IE5VTEwpOwotCQkJbGVmdGJsb2NrID0gbGVmdGJsb2NrLT5yaWdodGxpbms7Ci0JCQlsZWZ0aW5kZXggPSAwOwotCQl9CisgICAgICAgIC8qIEFkdmFuY2UgbGVmdCBibG9jay9pbmRleCBwYWlyICovCisgICAgICAgIGxlZnRpbmRleCsrOworICAgICAgICBpZiAobGVmdGluZGV4ID09IEJMT0NLTEVOKSB7CisgICAgICAgICAgICBhc3NlcnQgKGxlZnRibG9jay0+cmlnaHRsaW5rICE9IE5VTEwpOworICAgICAgICAgICAgbGVmdGJsb2NrID0gbGVmdGJsb2NrLT5yaWdodGxpbms7CisgICAgICAgICAgICBsZWZ0aW5kZXggPSAwOworICAgICAgICB9CiAKLQkJLyogU3RlcCBiYWNrd2FyZHMgd2l0aCB0aGUgcmlnaHQgYmxvY2svaW5kZXggcGFpciAqLwotCQlyaWdodGluZGV4LS07Ci0JCWlmIChyaWdodGluZGV4ID09IC0xKSB7Ci0JCQlhc3NlcnQgKHJpZ2h0YmxvY2stPmxlZnRsaW5rICE9IE5VTEwpOwotCQkJcmlnaHRibG9jayA9IHJpZ2h0YmxvY2stPmxlZnRsaW5rOwotCQkJcmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMTsKLQkJfQotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICAgICAgLyogU3RlcCBiYWNrd2FyZHMgd2l0aCB0aGUgcmlnaHQgYmxvY2svaW5kZXggcGFpciAqLworICAgICAgICByaWdodGluZGV4LS07CisgICAgICAgIGlmIChyaWdodGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICBhc3NlcnQgKHJpZ2h0YmxvY2stPmxlZnRsaW5rICE9IE5VTEwpOworICAgICAgICAgICAgcmlnaHRibG9jayA9IHJpZ2h0YmxvY2stPmxlZnRsaW5rOworICAgICAgICAgICAgcmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHJldmVyc2VfZG9jLApAQCAtNTA3LDM4ICs1MDcsMzggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9jb3VudChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICp2KQogewotCWJsb2NrICpsZWZ0YmxvY2sgPSBkZXF1ZS0+bGVmdGJsb2NrOwotCVB5X3NzaXplX3QgbGVmdGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKLQlQeV9zc2l6ZV90IG4gPSAoZGVxdWUtPmxlbik7Ci0JUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3QgY291bnQgPSAwOwotCVB5T2JqZWN0ICppdGVtOwotCWxvbmcgc3RhcnRfc3RhdGUgPSBkZXF1ZS0+c3RhdGU7Ci0JaW50IGNtcDsKKyAgICBibG9jayAqbGVmdGJsb2NrID0gZGVxdWUtPmxlZnRibG9jazsKKyAgICBQeV9zc2l6ZV90IGxlZnRpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CisgICAgUHlfc3NpemVfdCBuID0gKGRlcXVlLT5sZW4pOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBsb25nIHN0YXJ0X3N0YXRlID0gZGVxdWUtPnN0YXRlOworICAgIGludCBjbXA7CiAKLQlmb3IgKGk9MCA7IGk8biA7IGkrKykgewotCQlpdGVtID0gbGVmdGJsb2NrLT5kYXRhW2xlZnRpbmRleF07Ci0JCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCB2LCBQeV9FUSk7Ci0JCWlmIChjbXAgPiAwKQotCQkJY291bnQrKzsKLQkJZWxzZSBpZiAoY21wIDwgMCkKLQkJCXJldHVybiBOVUxMOworICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBsZWZ0YmxvY2stPmRhdGFbbGVmdGluZGV4XTsKKyAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0ZW0sIHYsIFB5X0VRKTsKKyAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKHN0YXJ0X3N0YXRlICE9IGRlcXVlLT5zdGF0ZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKHN0YXJ0X3N0YXRlICE9IGRlcXVlLT5zdGF0ZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVxdWUgbXV0YXRlZCBkdXJpbmcgaXRlcmF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCS8qIEFkdmFuY2UgbGVmdCBibG9jay9pbmRleCBwYWlyICovCi0JCWxlZnRpbmRleCsrOwotCQlpZiAobGVmdGluZGV4ID09IEJMT0NLTEVOKSB7Ci0JCQlhc3NlcnQgKGxlZnRibG9jay0+cmlnaHRsaW5rICE9IE5VTEwpOwotCQkJbGVmdGJsb2NrID0gbGVmdGJsb2NrLT5yaWdodGxpbms7Ci0JCQlsZWZ0aW5kZXggPSAwOwotCQl9Ci0JfQotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CisgICAgICAgIC8qIEFkdmFuY2UgbGVmdCBibG9jay9pbmRleCBwYWlyICovCisgICAgICAgIGxlZnRpbmRleCsrOworICAgICAgICBpZiAobGVmdGluZGV4ID09IEJMT0NLTEVOKSB7CisgICAgICAgICAgICBhc3NlcnQgKGxlZnRibG9jay0+cmlnaHRsaW5rICE9IE5VTEwpOworICAgICAgICAgICAgbGVmdGJsb2NrID0gbGVmdGJsb2NrLT5yaWdodGxpbms7CisgICAgICAgICAgICBsZWZ0aW5kZXggPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb3VudF9kb2MsCkBAIC01NDcsMzkgKzU0NywzOSBAQAogc3RhdGljIFB5X3NzaXplX3QKIGRlcXVlX2xlbihkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JcmV0dXJuIGRlcXVlLT5sZW47CisgICAgcmV0dXJuIGRlcXVlLT5sZW47CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9yZW1vdmUoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlfc3NpemVfdCBpLCBuPWRlcXVlLT5sZW47CisgICAgUHlfc3NpemVfdCBpLCBuPWRlcXVlLT5sZW47CiAKLQlmb3IgKGk9MCA7IGk8biA7IGkrKykgewotCQlQeU9iamVjdCAqaXRlbSA9IGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF07Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdmFsdWUsIFB5X0VRKTsKKyAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF07CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdmFsdWUsIFB5X0VRKTsKIAotCQlpZiAoZGVxdWUtPmxlbiAhPSBuKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkiZGVxdWUgbXV0YXRlZCBkdXJpbmcgcmVtb3ZlKCkuIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoY21wID4gMCkgewotCQkJUHlPYmplY3QgKnRndCA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOwotCQkJYXNzZXJ0ICh0Z3QgIT0gTlVMTCk7Ci0JCQlQeV9ERUNSRUYodGd0KTsKLQkJCWlmIChfZGVxdWVfcm90YXRlKGRlcXVlLCBpKSA9PSAtMSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCVB5X1JFVFVSTl9OT05FOwotCQl9Ci0JCWVsc2UgaWYgKGNtcCA8IDApIHsKLQkJCV9kZXF1ZV9yb3RhdGUoZGVxdWUsIGkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJX2RlcXVlX3JvdGF0ZShkZXF1ZSwgLTEpOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRlcXVlLnJlbW92ZSh4KTogeCBub3QgaW4gZGVxdWUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGRlcXVlLT5sZW4gIT0gbikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIHJlbW92ZSgpLiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA+IDApIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp0Z3QgPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKKyAgICAgICAgICAgIGFzc2VydCAodGd0ICE9IE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKHRndCk7CisgICAgICAgICAgICBpZiAoX2RlcXVlX3JvdGF0ZShkZXF1ZSwgaSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjbXAgPCAwKSB7CisgICAgICAgICAgICBfZGVxdWVfcm90YXRlKGRlcXVlLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIF9kZXF1ZV9yb3RhdGUoZGVxdWUsIC0xKTsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkZXF1ZS5yZW1vdmUoeCk6IHggbm90IGluIGRlcXVlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihyZW1vdmVfZG9jLApAQCAtNTg4LDU2ICs1ODgsNTYgQEAKIHN0YXRpYyBpbnQKIGRlcXVlX2NsZWFyKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXRlbTsKIAotCXdoaWxlIChkZXF1ZS0+bGVuKSB7Ci0JCWl0ZW0gPSBkZXF1ZV9wb3AoZGVxdWUsIE5VTEwpOwotCQlhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9Ci0JYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2sgJiYKLQkgICAgICAgZGVxdWUtPmxlZnRpbmRleCAtIDEgPT0gZGVxdWUtPnJpZ2h0aW5kZXggJiYKLQkgICAgICAgZGVxdWUtPmxlbiA9PSAwKTsKLQlyZXR1cm4gMDsKKyAgICB3aGlsZSAoZGVxdWUtPmxlbikgeworICAgICAgICBpdGVtID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKKyAgICAgICAgYXNzZXJ0IChpdGVtICE9IE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQorICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrID09IGRlcXVlLT5yaWdodGJsb2NrICYmCisgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggLSAxID09IGRlcXVlLT5yaWdodGluZGV4ICYmCisgICAgICAgICAgIGRlcXVlLT5sZW4gPT0gMCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9pdGVtKGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlfc3NpemVfdCBpKQogewotCWJsb2NrICpiOwotCVB5T2JqZWN0ICppdGVtOwotCVB5X3NzaXplX3QgbiwgaW5kZXg9aTsKKyAgICBibG9jayAqYjsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IG4sIGluZGV4PWk7CiAKLQlpZiAoaSA8IDAgfHwgaSA+PSBkZXF1ZS0+bGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChpIDwgMCB8fCBpID49IGRlcXVlLT5sZW4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVxdWUgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChpID09IDApIHsKLQkJaSA9IGRlcXVlLT5sZWZ0aW5kZXg7Ci0JCWIgPSBkZXF1ZS0+bGVmdGJsb2NrOwotCX0gZWxzZSBpZiAoaSA9PSBkZXF1ZS0+bGVuIC0gMSkgewotCQlpID0gZGVxdWUtPnJpZ2h0aW5kZXg7Ci0JCWIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLQl9IGVsc2UgewotCQlpICs9IGRlcXVlLT5sZWZ0aW5kZXg7Ci0JCW4gPSBpIC8gQkxPQ0tMRU47Ci0JCWkgJT0gQkxPQ0tMRU47Ci0JCWlmIChpbmRleCA8IChkZXF1ZS0+bGVuID4+IDEpKSB7Ci0JCQliID0gZGVxdWUtPmxlZnRibG9jazsKLQkJCXdoaWxlIChuLS0pCi0JCQkJYiA9IGItPnJpZ2h0bGluazsKLQkJfSBlbHNlIHsKLQkJCW4gPSAoZGVxdWUtPmxlZnRpbmRleCArIGRlcXVlLT5sZW4gLSAxKSAvIEJMT0NLTEVOIC0gbjsKLQkJCWIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLQkJCXdoaWxlIChuLS0pCi0JCQkJYiA9IGItPmxlZnRsaW5rOwotCQl9Ci0JfQotCWl0ZW0gPSBiLT5kYXRhW2ldOwotCVB5X0lOQ1JFRihpdGVtKTsKLQlyZXR1cm4gaXRlbTsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIGkgPSBkZXF1ZS0+bGVmdGluZGV4OworICAgICAgICBiID0gZGVxdWUtPmxlZnRibG9jazsKKyAgICB9IGVsc2UgaWYgKGkgPT0gZGVxdWUtPmxlbiAtIDEpIHsKKyAgICAgICAgaSA9IGRlcXVlLT5yaWdodGluZGV4OworICAgICAgICBiID0gZGVxdWUtPnJpZ2h0YmxvY2s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaSArPSBkZXF1ZS0+bGVmdGluZGV4OworICAgICAgICBuID0gaSAvIEJMT0NLTEVOOworICAgICAgICBpICU9IEJMT0NLTEVOOworICAgICAgICBpZiAoaW5kZXggPCAoZGVxdWUtPmxlbiA+PiAxKSkgeworICAgICAgICAgICAgYiA9IGRlcXVlLT5sZWZ0YmxvY2s7CisgICAgICAgICAgICB3aGlsZSAobi0tKQorICAgICAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuID0gKGRlcXVlLT5sZWZ0aW5kZXggKyBkZXF1ZS0+bGVuIC0gMSkgLyBCTE9DS0xFTiAtIG47CisgICAgICAgICAgICBiID0gZGVxdWUtPnJpZ2h0YmxvY2s7CisgICAgICAgICAgICB3aGlsZSAobi0tKQorICAgICAgICAgICAgICAgIGIgPSBiLT5sZWZ0bGluazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpdGVtID0gYi0+ZGF0YVtpXTsKKyAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgcmV0dXJuIGl0ZW07CiB9CiAKIC8qIGRlbGl0ZW0oKSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiByb3RhdGUgZm9yIHNpbXBsaWNpdHkgYW5kIHJlYXNvbmFibGUKQEAgLTY1MCw2MiArNjUwLDYyIEBACiBzdGF0aWMgaW50CiBkZXF1ZV9kZWxfaXRlbShkZXF1ZW9iamVjdCAqZGVxdWUsIFB5X3NzaXplX3QgaSkKIHsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXRlbTsKIAotCWFzc2VydCAoaSA+PSAwICYmIGkgPCBkZXF1ZS0+bGVuKTsKLQlpZiAoX2RlcXVlX3JvdGF0ZShkZXF1ZSwgLWkpID09IC0xKQotCQlyZXR1cm4gLTE7CisgICAgYXNzZXJ0IChpID49IDAgJiYgaSA8IGRlcXVlLT5sZW4pOworICAgIGlmIChfZGVxdWVfcm90YXRlKGRlcXVlLCAtaSkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKIAotCWl0ZW0gPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKLQlhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7Ci0JUHlfREVDUkVGKGl0ZW0pOworICAgIGl0ZW0gPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKKyAgICBhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7CisgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JcmV0dXJuIF9kZXF1ZV9yb3RhdGUoZGVxdWUsIGkpOworICAgIHJldHVybiBfZGVxdWVfcm90YXRlKGRlcXVlLCBpKTsKIH0KIAogc3RhdGljIGludAogZGVxdWVfYXNzX2l0ZW0oZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICpvbGRfdmFsdWU7Ci0JYmxvY2sgKmI7Ci0JUHlfc3NpemVfdCBuLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xLCBpbmRleD1pOworICAgIFB5T2JqZWN0ICpvbGRfdmFsdWU7CisgICAgYmxvY2sgKmI7CisgICAgUHlfc3NpemVfdCBuLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xLCBpbmRleD1pOwogCi0JaWYgKGkgPCAwIHx8IGkgPj0gbGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gZGVxdWVfZGVsX2l0ZW0oZGVxdWUsIGkpOworICAgIGlmIChpIDwgMCB8fCBpID49IGxlbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZGVxdWVfZGVsX2l0ZW0oZGVxdWUsIGkpOwogCi0JaSArPSBkZXF1ZS0+bGVmdGluZGV4OwotCW4gPSBpIC8gQkxPQ0tMRU47Ci0JaSAlPSBCTE9DS0xFTjsKLQlpZiAoaW5kZXggPD0gaGFsZmxlbikgewotCQliID0gZGVxdWUtPmxlZnRibG9jazsKLQkJd2hpbGUgKG4tLSkKLQkJCWIgPSBiLT5yaWdodGxpbms7Ci0JfSBlbHNlIHsKLQkJbiA9IChkZXF1ZS0+bGVmdGluZGV4ICsgbGVuIC0gMSkgLyBCTE9DS0xFTiAtIG47Ci0JCWIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLQkJd2hpbGUgKG4tLSkKLQkJCWIgPSBiLT5sZWZ0bGluazsKLQl9Ci0JUHlfSU5DUkVGKHYpOwotCW9sZF92YWx1ZSA9IGItPmRhdGFbaV07Ci0JYi0+ZGF0YVtpXSA9IHY7Ci0JUHlfREVDUkVGKG9sZF92YWx1ZSk7Ci0JcmV0dXJuIDA7CisgICAgaSArPSBkZXF1ZS0+bGVmdGluZGV4OworICAgIG4gPSBpIC8gQkxPQ0tMRU47CisgICAgaSAlPSBCTE9DS0xFTjsKKyAgICBpZiAoaW5kZXggPD0gaGFsZmxlbikgeworICAgICAgICBiID0gZGVxdWUtPmxlZnRibG9jazsKKyAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbiA9IChkZXF1ZS0+bGVmdGluZGV4ICsgbGVuIC0gMSkgLyBCTE9DS0xFTiAtIG47CisgICAgICAgIGIgPSBkZXF1ZS0+cmlnaHRibG9jazsKKyAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgICAgIGIgPSBiLT5sZWZ0bGluazsKKyAgICB9CisgICAgUHlfSU5DUkVGKHYpOworICAgIG9sZF92YWx1ZSA9IGItPmRhdGFbaV07CisgICAgYi0+ZGF0YVtpXSA9IHY7CisgICAgUHlfREVDUkVGKG9sZF92YWx1ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9jbGVhcm1ldGhvZChkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JaW50IHJ2OworICAgIGludCBydjsKIAotCXJ2ID0gZGVxdWVfY2xlYXIoZGVxdWUpOwotCWFzc2VydCAocnYgIT0gLTEpOwotCVB5X1JFVFVSTl9OT05FOworICAgIHJ2ID0gZGVxdWVfY2xlYXIoZGVxdWUpOworICAgIGFzc2VydCAocnYgIT0gLTEpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoY2xlYXJfZG9jLCAiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBkZXF1ZS4iKTsKQEAgLTcxMyw0OSArNzEzLDQ5IEBACiBzdGF0aWMgdm9pZAogZGVxdWVfZGVhbGxvYyhkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhkZXF1ZSk7Ci0JaWYgKGRlcXVlLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBkZXF1ZSk7Ci0JaWYgKGRlcXVlLT5sZWZ0YmxvY2sgIT0gTlVMTCkgewotCQlkZXF1ZV9jbGVhcihkZXF1ZSk7Ci0JCWFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IE5VTEwpOwotCQlmcmVlYmxvY2soZGVxdWUtPmxlZnRibG9jayk7Ci0JfQotCWRlcXVlLT5sZWZ0YmxvY2sgPSBOVUxMOwotCWRlcXVlLT5yaWdodGJsb2NrID0gTlVMTDsKLQlQeV9UWVBFKGRlcXVlKS0+dHBfZnJlZShkZXF1ZSk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhkZXF1ZSk7CisgICAgaWYgKGRlcXVlLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBkZXF1ZSk7CisgICAgaWYgKGRlcXVlLT5sZWZ0YmxvY2sgIT0gTlVMTCkgeworICAgICAgICBkZXF1ZV9jbGVhcihkZXF1ZSk7CisgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IE5VTEwpOworICAgICAgICBmcmVlYmxvY2soZGVxdWUtPmxlZnRibG9jayk7CisgICAgfQorICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBOVUxMOworICAgIGRlcXVlLT5yaWdodGJsb2NrID0gTlVMTDsKKyAgICBQeV9UWVBFKGRlcXVlKS0+dHBfZnJlZShkZXF1ZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGRlcXVlX3RyYXZlcnNlKGRlcXVlb2JqZWN0ICpkZXF1ZSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JYmxvY2sgKmI7Ci0JUHlPYmplY3QgKml0ZW07Ci0JUHlfc3NpemVfdCBpbmRleDsKLQlQeV9zc2l6ZV90IGluZGV4bG8gPSBkZXF1ZS0+bGVmdGluZGV4OworICAgIGJsb2NrICpiOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5X3NzaXplX3QgaW5kZXg7CisgICAgUHlfc3NpemVfdCBpbmRleGxvID0gZGVxdWUtPmxlZnRpbmRleDsKIAotCWZvciAoYiA9IGRlcXVlLT5sZWZ0YmxvY2s7IGIgIT0gTlVMTDsgYiA9IGItPnJpZ2h0bGluaykgewotCQljb25zdCBQeV9zc2l6ZV90IGluZGV4aGkgPSBiID09IGRlcXVlLT5yaWdodGJsb2NrID8KLQkJCQkJIGRlcXVlLT5yaWdodGluZGV4IDoKLQkJCQkgICAgCSBCTE9DS0xFTiAtIDE7CisgICAgZm9yIChiID0gZGVxdWUtPmxlZnRibG9jazsgYiAhPSBOVUxMOyBiID0gYi0+cmlnaHRsaW5rKSB7CisgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgaW5kZXhoaSA9IGIgPT0gZGVxdWUtPnJpZ2h0YmxvY2sgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggOgorICAgICAgICAgICAgICAgICAgICAgQkxPQ0tMRU4gLSAxOwogCi0JCWZvciAoaW5kZXggPSBpbmRleGxvOyBpbmRleCA8PSBpbmRleGhpOyArK2luZGV4KSB7Ci0JCQlpdGVtID0gYi0+ZGF0YVtpbmRleF07Ci0JCQlQeV9WSVNJVChpdGVtKTsKLQkJfQotCQlpbmRleGxvID0gMDsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGZvciAoaW5kZXggPSBpbmRleGxvOyBpbmRleCA8PSBpbmRleGhpOyArK2luZGV4KSB7CisgICAgICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CisgICAgICAgICAgICBQeV9WSVNJVChpdGVtKTsKKyAgICAgICAgfQorICAgICAgICBpbmRleGxvID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9jb3B5KFB5T2JqZWN0ICpkZXF1ZSkKIHsKLQlpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID09IC0xKQotCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPIiwgZGVxdWUsIE5VTEwpOwotCWVsc2UKLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiT2kiLAotCQkJZGVxdWUsICgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiwgTlVMTCk7CisgICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiTyIsIGRlcXVlLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopKFB5X1RZUEUoZGVxdWUpKSwgIk9pIiwKKyAgICAgICAgICAgIGRlcXVlLCAoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4sIE5VTEwpOwogfQogCiBQeURvY19TVFJWQVIoY29weV9kb2MsICJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS4iKTsKQEAgLTc2MywzMCArNzYzLDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfcmVkdWNlKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLQlQeU9iamVjdCAqZGljdCwgKnJlc3VsdCwgKmFzbGlzdDsKKyAgICBQeU9iamVjdCAqZGljdCwgKnJlc3VsdCwgKmFzbGlzdDsKIAotCWRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKWRlcXVlLCAiX19kaWN0X18iKTsKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlQeUVycl9DbGVhcigpOwotCWFzbGlzdCA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilkZXF1ZSk7Ci0JaWYgKGFzbGlzdCA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYoZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCWlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQotCQkJcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPKSIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE9uKSIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIGRlcXVlLT5tYXhsZW4pOwotCX0gZWxzZSB7Ci0JCWlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQotCQkJcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPTylPIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgUHlfTm9uZSwgZGljdCk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT24pTyIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIGRlcXVlLT5tYXhsZW4sIGRpY3QpOwotCX0KLQlQeV9YREVDUkVGKGRpY3QpOwotCVB5X0RFQ1JFRihhc2xpc3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopZGVxdWUsICJfX2RpY3RfXyIpOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgYXNsaXN0ID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKWRlcXVlKTsKKyAgICBpZiAoYXNsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCisgICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE8pIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT24pIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgZGVxdWUtPm1heGxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCisgICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE9PKU8iLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0LCBQeV9Ob25lLCBkaWN0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPbilPIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgZGVxdWUtPm1heGxlbiwgZGljdCk7CisgICAgfQorICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgUHlfREVDUkVGKGFzbGlzdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHJlZHVjZV9kb2MsICJSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nLiIpOwpAQCAtNzk0LDIyNCArNzk0LDIyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX3JlcHIoUHlPYmplY3QgKmRlcXVlKQogewotCVB5T2JqZWN0ICphc2xpc3QsICpyZXN1bHQsICpmbXQ7Ci0JaW50IGk7CisgICAgUHlPYmplY3QgKmFzbGlzdCwgKnJlc3VsdCwgKmZtdDsKKyAgICBpbnQgaTsKIAotCWkgPSBQeV9SZXByRW50ZXIoZGVxdWUpOwotCWlmIChpICE9IDApIHsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJbLi4uXSIpOwotCX0KKyAgICBpID0gUHlfUmVwckVudGVyKGRlcXVlKTsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiWy4uLl0iKTsKKyAgICB9CiAKLQlhc2xpc3QgPSBQeVNlcXVlbmNlX0xpc3QoZGVxdWUpOwotCWlmIChhc2xpc3QgPT0gTlVMTCkgewotCQlQeV9SZXByTGVhdmUoZGVxdWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiAhPSAtMSkKLQkJZm10ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiZGVxdWUoJSVyLCBtYXhsZW49JXpkKSIsIAotCQkJCQkoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4pOwotCWVsc2UKLQkJZm10ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiZGVxdWUoJXIpIik7ICAKLQlpZiAoZm10ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGFzbGlzdCk7Ci0JCVB5X1JlcHJMZWF2ZShkZXF1ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHQgPSBQeVN0cmluZ19Gb3JtYXQoZm10LCBhc2xpc3QpOwotCVB5X0RFQ1JFRihmbXQpOwotCVB5X0RFQ1JFRihhc2xpc3QpOwotCVB5X1JlcHJMZWF2ZShkZXF1ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBhc2xpc3QgPSBQeVNlcXVlbmNlX0xpc3QoZGVxdWUpOworICAgIGlmIChhc2xpc3QgPT0gTlVMTCkgeworICAgICAgICBQeV9SZXByTGVhdmUoZGVxdWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiAhPSAtMSkKKyAgICAgICAgZm10ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiZGVxdWUoJSVyLCBtYXhsZW49JXpkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbik7CisgICAgZWxzZQorICAgICAgICBmbXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJkZXF1ZSglcikiKTsKKyAgICBpZiAoZm10ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGFzbGlzdCk7CisgICAgICAgIFB5X1JlcHJMZWF2ZShkZXF1ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gb3JtYXQoZm10LCBhc2xpc3QpOworICAgIFB5X0RFQ1JFRihmbXQpOworICAgIFB5X0RFQ1JFRihhc2xpc3QpOworICAgIFB5X1JlcHJMZWF2ZShkZXF1ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludAogZGVxdWVfdHBfcHJpbnQoUHlPYmplY3QgKmRlcXVlLCBGSUxFICpmcCwgaW50IGZsYWdzKQogewotCVB5T2JqZWN0ICppdCwgKml0ZW07Ci0JY2hhciAqZW1pdCA9ICIiOwkvKiBObyBzZXBhcmF0b3IgZW1pdHRlZCBvbiBmaXJzdCBwYXNzICovCi0JY2hhciAqc2VwYXJhdG9yID0gIiwgIjsKLQlpbnQgaTsKKyAgICBQeU9iamVjdCAqaXQsICppdGVtOworICAgIGNoYXIgKmVtaXQgPSAiIjsgICAgICAgICAgICAvKiBObyBzZXBhcmF0b3IgZW1pdHRlZCBvbiBmaXJzdCBwYXNzICovCisgICAgY2hhciAqc2VwYXJhdG9yID0gIiwgIjsKKyAgICBpbnQgaTsKIAotCWkgPSBQeV9SZXByRW50ZXIoZGVxdWUpOwotCWlmIChpICE9IDApIHsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuIGk7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnB1dHMoIlsuLi5dIiwgZnApOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlyZXR1cm4gMDsKLQl9CisgICAgaSA9IFB5X1JlcHJFbnRlcihkZXF1ZSk7CisgICAgaWYgKGkgIT0gMCkgeworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHV0cygiWy4uLl0iLCBmcCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihkZXF1ZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoZGVxdWUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnB1dHMoImRlcXVlKFsiLCBmcCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlmcHV0cyhlbWl0LCBmcCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWVtaXQgPSBzZXBhcmF0b3I7Ci0JCWlmIChQeU9iamVjdF9QcmludChpdGVtLCBmcCwgMCkgIT0gMCkgewotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X1JlcHJMZWF2ZShkZXF1ZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KLQlQeV9SZXByTGVhdmUoZGVxdWUpOwotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnB1dHMoImRlcXVlKFsiLCBmcCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHV0cyhlbWl0LCBmcCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGVtaXQgPSBzZXBhcmF0b3I7CisgICAgICAgIGlmIChQeU9iamVjdF9QcmludChpdGVtLCBmcCwgMCkgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X1JlcHJMZWF2ZShkZXF1ZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KKyAgICBQeV9SZXByTGVhdmUoZGVxdWUpOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID09IC0xKQotCQlmcHV0cygiXSkiLCBmcCk7Ci0JZWxzZQotCQlmcHJpbnRmKGZwLCAiXSwgbWF4bGVuPSUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpIiwgKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiAwOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID09IC0xKQorICAgICAgICBmcHV0cygiXSkiLCBmcCk7CisgICAgZWxzZQorICAgICAgICBmcHJpbnRmKGZwLCAiXSwgbWF4bGVuPSUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpIiwgKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfcmljaGNvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JUHlPYmplY3QgKml0MT1OVUxMLCAqaXQyPU5VTEwsICp4LCAqeTsKLQlQeV9zc2l6ZV90IHZzLCB3czsKLQlpbnQgYiwgY21wPS0xOworICAgIFB5T2JqZWN0ICppdDE9TlVMTCwgKml0Mj1OVUxMLCAqeCwgKnk7CisgICAgUHlfc3NpemVfdCB2cywgd3M7CisgICAgaW50IGIsIGNtcD0tMTsKIAotCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKHYsICZkZXF1ZV90eXBlKSB8fAotCSAgICAhUHlPYmplY3RfVHlwZUNoZWNrKHcsICZkZXF1ZV90eXBlKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHYsICZkZXF1ZV90eXBlKSB8fAorICAgICAgICAhUHlPYmplY3RfVHlwZUNoZWNrKHcsICZkZXF1ZV90eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JLyogU2hvcnRjdXRzICovCi0JdnMgPSAoKGRlcXVlb2JqZWN0ICopdiktPmxlbjsKLQl3cyA9ICgoZGVxdWVvYmplY3QgKil3KS0+bGVuOwotCWlmIChvcCA9PSBQeV9FUSkgewotCQlpZiAodiA9PSB3KQotCQkJUHlfUkVUVVJOX1RSVUU7Ci0JCWlmICh2cyAhPSB3cykKLQkJCVB5X1JFVFVSTl9GQUxTRTsKLQl9Ci0JaWYgKG9wID09IFB5X05FKSB7Ci0JCWlmICh2ID09IHcpCi0JCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCWlmICh2cyAhPSB3cykKLQkJCVB5X1JFVFVSTl9UUlVFOwotCX0KKyAgICAvKiBTaG9ydGN1dHMgKi8KKyAgICB2cyA9ICgoZGVxdWVvYmplY3QgKil2KS0+bGVuOworICAgIHdzID0gKChkZXF1ZW9iamVjdCAqKXcpLT5sZW47CisgICAgaWYgKG9wID09IFB5X0VRKSB7CisgICAgICAgIGlmICh2ID09IHcpCisgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgaWYgKHZzICE9IHdzKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgICBpZiAob3AgPT0gUHlfTkUpIHsKKyAgICAgICAgaWYgKHYgPT0gdykKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgaWYgKHZzICE9IHdzKQorICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgfQogCi0JLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgaW5kZXggd2hlcmUgaXRlbXMgYXJlIGRpZmZlcmVudCAqLwotCWl0MSA9IFB5T2JqZWN0X0dldEl0ZXIodik7Ci0JaWYgKGl0MSA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0JaXQyID0gUHlPYmplY3RfR2V0SXRlcih3KTsKLQlpZiAoaXQyID09IE5VTEwpCi0JCWdvdG8gZG9uZTsKLQlmb3IgKDs7KSB7Ci0JCXggPSBQeUl0ZXJfTmV4dChpdDEpOwotCQlpZiAoeCA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlnb3RvIGRvbmU7Ci0JCXkgPSBQeUl0ZXJfTmV4dChpdDIpOwotCQlpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQliID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHgsIHksIFB5X0VRKTsKLQkJaWYgKGIgPT0gMCkgewotCQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHgsIHksIG9wKTsKLQkJCVB5X0RFQ1JFRih4KTsKLQkJCVB5X0RFQ1JFRih5KTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlQeV9ERUNSRUYoeCk7Ci0JCVB5X0RFQ1JFRih5KTsKLQkJaWYgKGIgPT0gLTEpCi0JCQlnb3RvIGRvbmU7Ci0JfQotCS8qIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiBvbmUgZGVxdWUgb3IgYm90aCAqLwotCVB5X1hERUNSRUYoeCk7Ci0JUHlfWERFQ1JFRih5KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBkb25lOwotCXN3aXRjaCAob3ApIHsKLQljYXNlIFB5X0xUOiBjbXAgPSB5ICE9IE5VTEw7IGJyZWFrOyAgLyogaWYgdyB3YXMgbG9uZ2VyICovCi0JY2FzZSBQeV9MRTogY21wID0geCA9PSBOVUxMOyBicmVhazsgIC8qIGlmIHYgd2FzIG5vdCBsb25nZXIgKi8KLQljYXNlIFB5X0VROiBjbXAgPSB4ID09IHk7ICAgIGJyZWFrOyAgLyogaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIGJvdGggKi8KLQljYXNlIFB5X05FOiBjbXAgPSB4ICE9IHk7ICAgIGJyZWFrOyAgLyogaWYgb25lIGRlcXVlIGNvbnRpbnVlcyAqLwotCWNhc2UgUHlfR1Q6IGNtcCA9IHggIT0gTlVMTDsgYnJlYWs7ICAvKiBpZiB2IHdhcyBsb25nZXIgKi8KLQljYXNlIFB5X0dFOiBjbXAgPSB5ID09IE5VTEw7IGJyZWFrOyAgLyogaWYgdyB3YXMgbm90IGxvbmdlciAqLwotCX0KKyAgICAvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBpbmRleCB3aGVyZSBpdGVtcyBhcmUgZGlmZmVyZW50ICovCisgICAgaXQxID0gUHlPYmplY3RfR2V0SXRlcih2KTsKKyAgICBpZiAoaXQxID09IE5VTEwpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBpdDIgPSBQeU9iamVjdF9HZXRJdGVyKHcpOworICAgIGlmIChpdDIgPT0gTlVMTCkKKyAgICAgICAgZ290byBkb25lOworICAgIGZvciAoOzspIHsKKyAgICAgICAgeCA9IFB5SXRlcl9OZXh0KGl0MSk7CisgICAgICAgIGlmICh4ID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgeSA9IFB5SXRlcl9OZXh0KGl0Mik7CisgICAgICAgIGlmICh4ID09IE5VTEwgfHwgeSA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGIgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgUHlfRVEpOworICAgICAgICBpZiAoYiA9PSAwKSB7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgb3ApOworICAgICAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICAgICAgUHlfREVDUkVGKHkpOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgUHlfREVDUkVGKHkpOworICAgICAgICBpZiAoYiA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgLyogV2UgcmVhY2hlZCB0aGUgZW5kIG9mIG9uZSBkZXF1ZSBvciBib3RoICovCisgICAgUHlfWERFQ1JFRih4KTsKKyAgICBQeV9YREVDUkVGKHkpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUHlfTFQ6IGNtcCA9IHkgIT0gTlVMTDsgYnJlYWs7ICAvKiBpZiB3IHdhcyBsb25nZXIgKi8KKyAgICBjYXNlIFB5X0xFOiBjbXAgPSB4ID09IE5VTEw7IGJyZWFrOyAgLyogaWYgdiB3YXMgbm90IGxvbmdlciAqLworICAgIGNhc2UgUHlfRVE6IGNtcCA9IHggPT0geTsgICAgYnJlYWs7ICAvKiBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgYm90aCAqLworICAgIGNhc2UgUHlfTkU6IGNtcCA9IHggIT0geTsgICAgYnJlYWs7ICAvKiBpZiBvbmUgZGVxdWUgY29udGludWVzICovCisgICAgY2FzZSBQeV9HVDogY21wID0geCAhPSBOVUxMOyBicmVhazsgIC8qIGlmIHYgd2FzIGxvbmdlciAqLworICAgIGNhc2UgUHlfR0U6IGNtcCA9IHkgPT0gTlVMTDsgYnJlYWs7ICAvKiBpZiB3IHdhcyBub3QgbG9uZ2VyICovCisgICAgfQogCiBkb25lOgotCVB5X1hERUNSRUYoaXQxKTsKLQlQeV9YREVDUkVGKGl0Mik7Ci0JaWYgKGNtcCA9PSAxKQotCQlQeV9SRVRVUk5fVFJVRTsKLQlpZiAoY21wID09IDApCi0JCVB5X1JFVFVSTl9GQUxTRTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGl0MSk7CisgICAgUHlfWERFQ1JFRihpdDIpOworICAgIGlmIChjbXAgPT0gMSkKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgaWYgKGNtcCA9PSAwKQorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIGRlcXVlX2luaXQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZGFyZ3MpCiB7Ci0JUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTDsKLQlQeU9iamVjdCAqbWF4bGVub2JqID0gTlVMTDsKLQlQeV9zc2l6ZV90IG1heGxlbiA9IC0xOwotCWNoYXIgKmt3bGlzdFtdID0geyJpdGVyYWJsZSIsICJtYXhsZW4iLCAwfTsKKyAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICptYXhsZW5vYmogPSBOVUxMOworICAgIFB5X3NzaXplX3QgbWF4bGVuID0gLTE7CisgICAgY2hhciAqa3dsaXN0W10gPSB7Iml0ZXJhYmxlIiwgIm1heGxlbiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkYXJncywgInxPTzpkZXF1ZSIsIGt3bGlzdCwgJml0ZXJhYmxlLCAmbWF4bGVub2JqKSkKLQkJcmV0dXJuIC0xOwotCWlmIChtYXhsZW5vYmogIT0gTlVMTCAmJiBtYXhsZW5vYmogIT0gUHlfTm9uZSkgewotCQltYXhsZW4gPSBQeUludF9Bc1NzaXplX3QobWF4bGVub2JqKTsKLQkJaWYgKG1heGxlbiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAobWF4bGVuIDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtYXhsZW4gbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlkZXF1ZS0+bWF4bGVuID0gbWF4bGVuOwotCWRlcXVlX2NsZWFyKGRlcXVlKTsKLQlpZiAoaXRlcmFibGUgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcnYgPSBkZXF1ZV9leHRlbmQoZGVxdWUsIGl0ZXJhYmxlKTsKLQkJaWYgKHJ2ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0RFQ1JFRihydik7Ci0JfQotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGFyZ3MsICJ8T086ZGVxdWUiLCBrd2xpc3QsICZpdGVyYWJsZSwgJm1heGxlbm9iaikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobWF4bGVub2JqICE9IE5VTEwgJiYgbWF4bGVub2JqICE9IFB5X05vbmUpIHsKKyAgICAgICAgbWF4bGVuID0gUHlJbnRfQXNTc2l6ZV90KG1heGxlbm9iaik7CisgICAgICAgIGlmIChtYXhsZW4gPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKG1heGxlbiA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF4bGVuIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVxdWUtPm1heGxlbiA9IG1heGxlbjsKKyAgICBkZXF1ZV9jbGVhcihkZXF1ZSk7CisgICAgaWYgKGl0ZXJhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnJ2ID0gZGVxdWVfZXh0ZW5kKGRlcXVlLCBpdGVyYWJsZSk7CisgICAgICAgIGlmIChydiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2dldF9tYXhsZW4oZGVxdWVvYmplY3QgKmRlcXVlKQogewotCWlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQotCQlQeV9SRVRVUk5fTk9ORTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoZGVxdWUtPm1heGxlbik7CisgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCisgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChkZXF1ZS0+bWF4bGVuKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGRlcXVlX2dldHNldFtdID0gewotCXsibWF4bGVuIiwgKGdldHRlcilkZXF1ZV9nZXRfbWF4bGVuLCAoc2V0dGVyKU5VTEwsCi0JICJtYXhpbXVtIHNpemUgb2YgYSBkZXF1ZSBvciBOb25lIGlmIHVuYm91bmRlZCJ9LAotCXswfQorICAgIHsibWF4bGVuIiwgKGdldHRlcilkZXF1ZV9nZXRfbWF4bGVuLCAoc2V0dGVyKU5VTEwsCisgICAgICJtYXhpbXVtIHNpemUgb2YgYSBkZXF1ZSBvciBOb25lIGlmIHVuYm91bmRlZCJ9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGRlcXVlX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKWRlcXVlX2xlbiwJCS8qIHNxX2xlbmd0aCAqLwotCTAsCQkJCS8qIHNxX2NvbmNhdCAqLwotCTAsCQkJCS8qIHNxX3JlcGVhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpZGVxdWVfaXRlbSwJLyogc3FfaXRlbSAqLwotCTAsCQkJCS8qIHNxX3NsaWNlICovCi0JKHNzaXplb2JqYXJncHJvYylkZXF1ZV9hc3NfaXRlbSwJLyogc3FfYXNzX2l0ZW0gKi8KLQkwLAkJCQkvKiBzcV9hc3Nfc2xpY2UgKi8KLQkwLAkJCQkvKiBzcV9jb250YWlucyAqLwotCShiaW5hcnlmdW5jKWRlcXVlX2lucGxhY2VfY29uY2F0LAkvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLwotCTAsCQkJCS8qIHNxX2lucGxhY2VfcmVwZWF0ICovCisgICAgKGxlbmZ1bmMpZGVxdWVfbGVuLCAgICAgICAgICAgICAgICAgLyogc3FfbGVuZ3RoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0ICovCisgICAgKHNzaXplYXJnZnVuYylkZXF1ZV9pdGVtLCAgICAgICAgICAgLyogc3FfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgKHNzaXplb2JqYXJncHJvYylkZXF1ZV9hc3NfaXRlbSwgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbnRhaW5zICovCisgICAgKGJpbmFyeWZ1bmMpZGVxdWVfaW5wbGFjZV9jb25jYXQsICAgICAgICAgICAvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfcmVwZWF0ICovCiAKIH07CiAKQEAgLTEwMjAsMzggKzEwMjAsMzggQEAKIHN0YXRpYyBQeU9iamVjdCAqZGVxdWVfaXRlcihkZXF1ZW9iamVjdCAqZGVxdWUpOwogc3RhdGljIFB5T2JqZWN0ICpkZXF1ZV9yZXZpdGVyKGRlcXVlb2JqZWN0ICpkZXF1ZSk7CiBQeURvY19TVFJWQVIocmV2ZXJzZWRfZG9jLAotCSJELl9fcmV2ZXJzZWRfXygpIC0tIHJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWUiKTsKKyAgICAiRC5fX3JldmVyc2VkX18oKSAtLSByZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGRlcXVlIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkZXF1ZV9tZXRob2RzW10gPSB7Ci0JeyJhcHBlbmQiLAkJKFB5Q0Z1bmN0aW9uKWRlcXVlX2FwcGVuZCwKLQkJTUVUSF9PLAkJIGFwcGVuZF9kb2N9LAotCXsiYXBwZW5kbGVmdCIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfYXBwZW5kbGVmdCwKLQkJTUVUSF9PLAkJIGFwcGVuZGxlZnRfZG9jfSwKLQl7ImNsZWFyIiwJCShQeUNGdW5jdGlvbilkZXF1ZV9jbGVhcm1ldGhvZCwKLQkJTUVUSF9OT0FSR1MsCSBjbGVhcl9kb2N9LAotCXsiX19jb3B5X18iLAkJKFB5Q0Z1bmN0aW9uKWRlcXVlX2NvcHksCi0JCU1FVEhfTk9BUkdTLAkgY29weV9kb2N9LAotCXsiY291bnQiLAkJKFB5Q0Z1bmN0aW9uKWRlcXVlX2NvdW50LAotCSAgICBNRVRIX08sCQkJY291bnRfZG9jfSwKLQl7ImV4dGVuZCIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfZXh0ZW5kLAotCQlNRVRIX08sCQkgZXh0ZW5kX2RvY30sCi0JeyJleHRlbmRsZWZ0IiwJCShQeUNGdW5jdGlvbilkZXF1ZV9leHRlbmRsZWZ0LAotCQlNRVRIX08sCQkgZXh0ZW5kbGVmdF9kb2N9LAotCXsicG9wIiwJCQkoUHlDRnVuY3Rpb24pZGVxdWVfcG9wLAotCQlNRVRIX05PQVJHUywJIHBvcF9kb2N9LAotCXsicG9wbGVmdCIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfcG9wbGVmdCwKLQkJTUVUSF9OT0FSR1MsCSBwb3BsZWZ0X2RvY30sCi0JeyJfX3JlZHVjZV9fIiwJKFB5Q0Z1bmN0aW9uKWRlcXVlX3JlZHVjZSwKLQkJTUVUSF9OT0FSR1MsCSByZWR1Y2VfZG9jfSwKLQl7InJlbW92ZSIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfcmVtb3ZlLAotCQlNRVRIX08sCQkgcmVtb3ZlX2RvY30sCi0JeyJfX3JldmVyc2VkX18iLAkoUHlDRnVuY3Rpb24pZGVxdWVfcmV2aXRlciwKLQkJTUVUSF9OT0FSR1MsCSByZXZlcnNlZF9kb2N9LAotCXsicmV2ZXJzZSIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfcmV2ZXJzZSwKLQkJTUVUSF9OT0FSR1MsCSByZXZlcnNlX2RvY30sCi0JeyJyb3RhdGUiLAkJKFB5Q0Z1bmN0aW9uKWRlcXVlX3JvdGF0ZSwKLQkJTUVUSF9WQVJBUkdTLAlyb3RhdGVfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CS8qIHNlbnRpbmVsICovCisgICAgeyJhcHBlbmQiLCAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9hcHBlbmQsCisgICAgICAgIE1FVEhfTywgICAgICAgICAgICAgICAgICBhcHBlbmRfZG9jfSwKKyAgICB7ImFwcGVuZGxlZnQiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlcXVlX2FwcGVuZGxlZnQsCisgICAgICAgIE1FVEhfTywgICAgICAgICAgICAgICAgICBhcHBlbmRsZWZ0X2RvY30sCisgICAgeyJjbGVhciIsICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9jbGVhcm1ldGhvZCwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIGNsZWFyX2RvY30sCisgICAgeyJfX2NvcHlfXyIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9jb3B5LAorICAgICAgICBNRVRIX05PQVJHUywgICAgICAgICAgICAgY29weV9kb2N9LAorICAgIHsiY291bnQiLCAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfY291bnQsCisgICAgICAgIE1FVEhfTywgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfZG9jfSwKKyAgICB7ImV4dGVuZCIsICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlcXVlX2V4dGVuZCwKKyAgICAgICAgTUVUSF9PLCAgICAgICAgICAgICAgICAgIGV4dGVuZF9kb2N9LAorICAgIHsiZXh0ZW5kbGVmdCIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfZXh0ZW5kbGVmdCwKKyAgICAgICAgTUVUSF9PLCAgICAgICAgICAgICAgICAgIGV4dGVuZGxlZnRfZG9jfSwKKyAgICB7InBvcCIsICAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlcXVlX3BvcCwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIHBvcF9kb2N9LAorICAgIHsicG9wbGVmdCIsICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfcG9wbGVmdCwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIHBvcGxlZnRfZG9jfSwKKyAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9yZWR1Y2UsCisgICAgICAgIE1FVEhfTk9BUkdTLCAgICAgICAgICAgICByZWR1Y2VfZG9jfSwKKyAgICB7InJlbW92ZSIsICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlcXVlX3JlbW92ZSwKKyAgICAgICAgTUVUSF9PLCAgICAgICAgICAgICAgICAgIHJlbW92ZV9kb2N9LAorICAgIHsiX19yZXZlcnNlZF9fIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfcmV2aXRlciwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIHJldmVyc2VkX2RvY30sCisgICAgeyJyZXZlcnNlIiwgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9yZXZlcnNlLAorICAgICAgICBNRVRIX05PQVJHUywgICAgICAgICAgICAgcmV2ZXJzZV9kb2N9LAorICAgIHsicm90YXRlIiwgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfcm90YXRlLAorICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICByb3RhdGVfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihkZXF1ZV9kb2MsCkBAIC0xMDYwLDU4ICsxMDYwLDU4IEBACiBCdWlsZCBhbiBvcmRlcmVkIGNvbGxlY3Rpb24gYWNjZXNzaWJsZSBmcm9tIGVuZHBvaW50cyBvbmx5LiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRlcXVlX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImNvbGxlY3Rpb25zLmRlcXVlIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZGVxdWVvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGVxdWVfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCWRlcXVlX3RwX3ByaW50LAkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JZGVxdWVfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJmRlcXVlX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKVB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsCS8qIHRwX2ZsYWdzICovCi0JZGVxdWVfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpZGVxdWVfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpZGVxdWVfY2xlYXIsCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylkZXF1ZV9yaWNoY29tcGFyZSwJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihkZXF1ZW9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCovCi0JKGdldGl0ZXJmdW5jKWRlcXVlX2l0ZXIsCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWRlcXVlX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlkZXF1ZV9nZXRzZXQsCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylkZXF1ZV9pbml0LAkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkvKiB0cF9hbGxvYyAqLwotCWRlcXVlX25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImNvbGxlY3Rpb25zLmRlcXVlIiwgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihkZXF1ZW9iamVjdCksICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWRlcXVlX2RlYWxsb2MsICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICBkZXF1ZV90cF9wcmludCwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIGRlcXVlX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmZGVxdWVfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkLCAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBkZXF1ZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWRlcXVlX3RyYXZlcnNlLCAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KWRlcXVlX2NsZWFyLCAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKWRlcXVlX3JpY2hjb21wYXJlLCAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihkZXF1ZW9iamVjdCwgd2Vha3JlZmxpc3QpLCAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAoZ2V0aXRlcmZ1bmMpZGVxdWVfaXRlciwgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkZXF1ZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGRlcXVlX2dldHNldCwgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKWRlcXVlX2luaXQsICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgZGVxdWVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqIERlcXVlIEl0ZXJhdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3QgaW5kZXg7Ci0JYmxvY2sgKmI7Ci0JZGVxdWVvYmplY3QgKmRlcXVlOwotCWxvbmcgc3RhdGU7CS8qIHN0YXRlIHdoZW4gdGhlIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgKi8KLQlQeV9zc2l6ZV90IGNvdW50ZXI7ICAgIC8qIG51bWJlciBvZiBpdGVtcyByZW1haW5pbmcgZm9yIGl0ZXJhdGlvbiAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IGluZGV4OworICAgIGJsb2NrICpiOworICAgIGRlcXVlb2JqZWN0ICpkZXF1ZTsKKyAgICBsb25nIHN0YXRlOyAgICAgICAgIC8qIHN0YXRlIHdoZW4gdGhlIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgKi8KKyAgICBQeV9zc2l6ZV90IGNvdW50ZXI7ICAgIC8qIG51bWJlciBvZiBpdGVtcyByZW1haW5pbmcgZm9yIGl0ZXJhdGlvbiAqLwogfSBkZXF1ZWl0ZXJvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZGVxdWVpdGVyX3R5cGU7CkBAIC0xMTE5LDEwNyArMTExOSwxMDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9pdGVyKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLQlkZXF1ZWl0ZXJvYmplY3QgKml0OworICAgIGRlcXVlaXRlcm9iamVjdCAqaXQ7CiAKLQlpdCA9IFB5T2JqZWN0X0dDX05ldyhkZXF1ZWl0ZXJvYmplY3QsICZkZXF1ZWl0ZXJfdHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0LT5iID0gZGVxdWUtPmxlZnRibG9jazsKLQlpdC0+aW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwotCVB5X0lOQ1JFRihkZXF1ZSk7Ci0JaXQtPmRlcXVlID0gZGVxdWU7Ci0JaXQtPnN0YXRlID0gZGVxdWUtPnN0YXRlOwotCWl0LT5jb3VudGVyID0gZGVxdWUtPmxlbjsKLQlQeU9iamVjdF9HQ19UcmFjayhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGRlcXVlaXRlcm9iamVjdCwgJmRlcXVlaXRlcl90eXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPmIgPSBkZXF1ZS0+bGVmdGJsb2NrOworICAgIGl0LT5pbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CisgICAgUHlfSU5DUkVGKGRlcXVlKTsKKyAgICBpdC0+ZGVxdWUgPSBkZXF1ZTsKKyAgICBpdC0+c3RhdGUgPSBkZXF1ZS0+c3RhdGU7CisgICAgaXQtPmNvdW50ZXIgPSBkZXF1ZS0+bGVuOworICAgIFB5T2JqZWN0X0dDX1RyYWNrKGl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBpbnQKIGRlcXVlaXRlcl90cmF2ZXJzZShkZXF1ZWl0ZXJvYmplY3QgKmRpbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoZGlvLT5kZXF1ZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoZGlvLT5kZXF1ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBkZXF1ZWl0ZXJfZGVhbGxvYyhkZXF1ZWl0ZXJvYmplY3QgKmRpbykKIHsKLQlQeV9YREVDUkVGKGRpby0+ZGVxdWUpOwotCVB5T2JqZWN0X0dDX0RlbChkaW8pOworICAgIFB5X1hERUNSRUYoZGlvLT5kZXF1ZSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGRpbyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZWl0ZXJfbmV4dChkZXF1ZWl0ZXJvYmplY3QgKml0KQogewotCVB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICppdGVtOwogCi0JaWYgKGl0LT5kZXF1ZS0+c3RhdGUgIT0gaXQtPnN0YXRlKSB7Ci0JCWl0LT5jb3VudGVyID0gMDsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiZGVxdWUgbXV0YXRlZCBkdXJpbmcgaXRlcmF0aW9uIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoaXQtPmNvdW50ZXIgPT0gMCkKLQkJcmV0dXJuIE5VTEw7ICAgICAgICAKLQlhc3NlcnQgKCEoaXQtPmIgPT0gaXQtPmRlcXVlLT5yaWdodGJsb2NrICYmCi0JCSAgaXQtPmluZGV4ID4gaXQtPmRlcXVlLT5yaWdodGluZGV4KSk7CisgICAgaWYgKGl0LT5kZXF1ZS0+c3RhdGUgIT0gaXQtPnN0YXRlKSB7CisgICAgICAgIGl0LT5jb3VudGVyID0gMDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXF1ZSBtdXRhdGVkIGR1cmluZyBpdGVyYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpdC0+Y291bnRlciA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQgKCEoaXQtPmIgPT0gaXQtPmRlcXVlLT5yaWdodGJsb2NrICYmCisgICAgICAgICAgICAgIGl0LT5pbmRleCA+IGl0LT5kZXF1ZS0+cmlnaHRpbmRleCkpOwogCi0JaXRlbSA9IGl0LT5iLT5kYXRhW2l0LT5pbmRleF07Ci0JaXQtPmluZGV4Kys7Ci0JaXQtPmNvdW50ZXItLTsKLQlpZiAoaXQtPmluZGV4ID09IEJMT0NLTEVOICYmIGl0LT5jb3VudGVyID4gMCkgewotCQlhc3NlcnQgKGl0LT5iLT5yaWdodGxpbmsgIT0gTlVMTCk7Ci0JCWl0LT5iID0gaXQtPmItPnJpZ2h0bGluazsKLQkJaXQtPmluZGV4ID0gMDsKLQl9Ci0JUHlfSU5DUkVGKGl0ZW0pOwotCXJldHVybiBpdGVtOworICAgIGl0ZW0gPSBpdC0+Yi0+ZGF0YVtpdC0+aW5kZXhdOworICAgIGl0LT5pbmRleCsrOworICAgIGl0LT5jb3VudGVyLS07CisgICAgaWYgKGl0LT5pbmRleCA9PSBCTE9DS0xFTiAmJiBpdC0+Y291bnRlciA+IDApIHsKKyAgICAgICAgYXNzZXJ0IChpdC0+Yi0+cmlnaHRsaW5rICE9IE5VTEwpOworICAgICAgICBpdC0+YiA9IGl0LT5iLT5yaWdodGxpbms7CisgICAgICAgIGl0LT5pbmRleCA9IDA7CisgICAgfQorICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICByZXR1cm4gaXRlbTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlaXRlcl9sZW4oZGVxdWVpdGVyb2JqZWN0ICppdCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoaXQtPmNvdW50ZXIpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpdC0+Y291bnRlcik7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGRlcXVlaXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pZGVxdWVpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pZGVxdWVpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZGVxdWVpdGVyX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImRlcXVlX2l0ZXJhdG9yIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGRlcXVlaXRlcm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGVxdWVpdGVyX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpZGVxdWVpdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWRlcXVlaXRlcl9uZXh0LAkJLyogdHBfaXRlcm5leHQgKi8KLQlkZXF1ZWl0ZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiZGVxdWVfaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZGVxdWVpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZGVxdWVpdGVyX2RlYWxsb2MsICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylkZXF1ZWl0ZXJfdHJhdmVyc2UsICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZGVxdWVpdGVyX25leHQsICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkZXF1ZWl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqIERlcXVlIFJldmVyc2UgSXRlcmF0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjI5LDg3ICsxMjI5LDg3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfcmV2aXRlcihkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JZGVxdWVpdGVyb2JqZWN0ICppdDsKKyAgICBkZXF1ZWl0ZXJvYmplY3QgKml0OwogCi0JaXQgPSBQeU9iamVjdF9HQ19OZXcoZGVxdWVpdGVyb2JqZWN0LCAmZGVxdWVyZXZpdGVyX3R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpdC0+YiA9IGRlcXVlLT5yaWdodGJsb2NrOwotCWl0LT5pbmRleCA9IGRlcXVlLT5yaWdodGluZGV4OwotCVB5X0lOQ1JFRihkZXF1ZSk7Ci0JaXQtPmRlcXVlID0gZGVxdWU7Ci0JaXQtPnN0YXRlID0gZGVxdWUtPnN0YXRlOwotCWl0LT5jb3VudGVyID0gZGVxdWUtPmxlbjsKLQlQeU9iamVjdF9HQ19UcmFjayhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGRlcXVlaXRlcm9iamVjdCwgJmRlcXVlcmV2aXRlcl90eXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPmIgPSBkZXF1ZS0+cmlnaHRibG9jazsKKyAgICBpdC0+aW5kZXggPSBkZXF1ZS0+cmlnaHRpbmRleDsKKyAgICBQeV9JTkNSRUYoZGVxdWUpOworICAgIGl0LT5kZXF1ZSA9IGRlcXVlOworICAgIGl0LT5zdGF0ZSA9IGRlcXVlLT5zdGF0ZTsKKyAgICBpdC0+Y291bnRlciA9IGRlcXVlLT5sZW47CisgICAgUHlPYmplY3RfR0NfVHJhY2soaXQpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlcmV2aXRlcl9uZXh0KGRlcXVlaXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlPYmplY3QgKml0ZW07Ci0JaWYgKGl0LT5jb3VudGVyID09IDApCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIGlmIChpdC0+Y291bnRlciA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChpdC0+ZGVxdWUtPnN0YXRlICE9IGl0LT5zdGF0ZSkgewotCQlpdC0+Y291bnRlciA9IDA7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXNzZXJ0ICghKGl0LT5iID09IGl0LT5kZXF1ZS0+bGVmdGJsb2NrICYmCi0JCSAgaXQtPmluZGV4IDwgaXQtPmRlcXVlLT5sZWZ0aW5kZXgpKTsKKyAgICBpZiAoaXQtPmRlcXVlLT5zdGF0ZSAhPSBpdC0+c3RhdGUpIHsKKyAgICAgICAgaXQtPmNvdW50ZXIgPSAwOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXNzZXJ0ICghKGl0LT5iID09IGl0LT5kZXF1ZS0+bGVmdGJsb2NrICYmCisgICAgICAgICAgICAgIGl0LT5pbmRleCA8IGl0LT5kZXF1ZS0+bGVmdGluZGV4KSk7CiAKLQlpdGVtID0gaXQtPmItPmRhdGFbaXQtPmluZGV4XTsKLQlpdC0+aW5kZXgtLTsKLQlpdC0+Y291bnRlci0tOwotCWlmIChpdC0+aW5kZXggPT0gLTEgJiYgaXQtPmNvdW50ZXIgPiAwKSB7Ci0JCWFzc2VydCAoaXQtPmItPmxlZnRsaW5rICE9IE5VTEwpOwotCQlpdC0+YiA9IGl0LT5iLT5sZWZ0bGluazsKLQkJaXQtPmluZGV4ID0gQkxPQ0tMRU4gLSAxOwotCX0KLQlQeV9JTkNSRUYoaXRlbSk7Ci0JcmV0dXJuIGl0ZW07CisgICAgaXRlbSA9IGl0LT5iLT5kYXRhW2l0LT5pbmRleF07CisgICAgaXQtPmluZGV4LS07CisgICAgaXQtPmNvdW50ZXItLTsKKyAgICBpZiAoaXQtPmluZGV4ID09IC0xICYmIGl0LT5jb3VudGVyID4gMCkgeworICAgICAgICBhc3NlcnQgKGl0LT5iLT5sZWZ0bGluayAhPSBOVUxMKTsKKyAgICAgICAgaXQtPmIgPSBpdC0+Yi0+bGVmdGxpbms7CisgICAgICAgIGl0LT5pbmRleCA9IEJMT0NLTEVOIC0gMTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIHJldHVybiBpdGVtOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRlcXVlcmV2aXRlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJkZXF1ZV9yZXZlcnNlX2l0ZXJhdG9yIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZGVxdWVpdGVyb2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilkZXF1ZWl0ZXJfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylkZXF1ZWl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZGVxdWVyZXZpdGVyX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGVxdWVpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImRlcXVlX3JldmVyc2VfaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGRlcXVlaXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWRlcXVlaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZGVxdWVpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWRlcXVlcmV2aXRlcl9uZXh0LCAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZGVxdWVpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIC8qIGRlZmF1bHRkaWN0IHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEaWN0T2JqZWN0IGRpY3Q7Ci0JUHlPYmplY3QgKmRlZmF1bHRfZmFjdG9yeTsKKyAgICBQeURpY3RPYmplY3QgZGljdDsKKyAgICBQeU9iamVjdCAqZGVmYXVsdF9mYWN0b3J5OwogfSBkZWZkaWN0b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRlZmRpY3RfdHlwZTsgLyogRm9yd2FyZCAqLwpAQCAtMTMyNCwyNSArMTMyNCwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlZmRpY3RfbWlzc2luZyhkZWZkaWN0b2JqZWN0ICpkZCwgUHlPYmplY3QgKmtleSkKIHsKLQlQeU9iamVjdCAqZmFjdG9yeSA9IGRkLT5kZWZhdWx0X2ZhY3Rvcnk7Ci0JUHlPYmplY3QgKnZhbHVlOwotCWlmIChmYWN0b3J5ID09IE5VTEwgfHwgZmFjdG9yeSA9PSBQeV9Ob25lKSB7Ci0JCS8qIFhYWCBDYWxsIGRpY3QuX19taXNzaW5nX18oa2V5KSAqLwotCQlQeU9iamVjdCAqdHVwOwotCQl0dXAgPSBQeVR1cGxlX1BhY2soMSwga2V5KTsKLQkJaWYgKCF0dXApIHJldHVybiBOVUxMOwotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIHR1cCk7Ci0JCVB5X0RFQ1JFRih0dXApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdmFsdWUgPSBQeUV2YWxfQ2FsbE9iamVjdChmYWN0b3J5LCBOVUxMKTsKLQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJcmV0dXJuIHZhbHVlOwotCWlmIChQeU9iamVjdF9TZXRJdGVtKChQeU9iamVjdCAqKWRkLCBrZXksIHZhbHVlKSA8IDApIHsKLQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqZmFjdG9yeSA9IGRkLT5kZWZhdWx0X2ZhY3Rvcnk7CisgICAgUHlPYmplY3QgKnZhbHVlOworICAgIGlmIChmYWN0b3J5ID09IE5VTEwgfHwgZmFjdG9yeSA9PSBQeV9Ob25lKSB7CisgICAgICAgIC8qIFhYWCBDYWxsIGRpY3QuX19taXNzaW5nX18oa2V5KSAqLworICAgICAgICBQeU9iamVjdCAqdHVwOworICAgICAgICB0dXAgPSBQeVR1cGxlX1BhY2soMSwga2V5KTsKKyAgICAgICAgaWYgKCF0dXApIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIHR1cCk7CisgICAgICAgIFB5X0RFQ1JFRih0dXApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdmFsdWUgPSBQeUV2YWxfQ2FsbE9iamVjdChmYWN0b3J5LCBOVUxMKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIGlmIChQeU9iamVjdF9TZXRJdGVtKChQeU9iamVjdCAqKWRkLCBrZXksIHZhbHVlKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKIH0KIAogUHlEb2NfU1RSVkFSKGRlZmRpY3RfY29weV9kb2MsICJELmNvcHkoKSAtPiBhIHNoYWxsb3cgY29weSBvZiBELiIpOwpAQCAtMTM1MCwxOTIgKzEzNTAsMTkyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVmZGljdF9jb3B5KGRlZmRpY3RvYmplY3QgKmRkKQogewotCS8qIFRoaXMgY2FsbHMgdGhlIG9iamVjdCdzIGNsYXNzLiAgVGhhdCBvbmx5IHdvcmtzIGZvciBzdWJjbGFzc2VzCi0JICAgd2hvc2UgY2xhc3MgY29uc3RydWN0b3IgaGFzIHRoZSBzYW1lIHNpZ25hdHVyZS4gIFN1YmNsYXNzZXMgdGhhdAotCSAgIGRlZmluZSBhIGRpZmZlcmVudCBjb25zdHJ1Y3RvciBzaWduYXR1cmUgbXVzdCBvdmVycmlkZSBjb3B5KCkuCi0JKi8KKyAgICAvKiBUaGlzIGNhbGxzIHRoZSBvYmplY3QncyBjbGFzcy4gIFRoYXQgb25seSB3b3JrcyBmb3Igc3ViY2xhc3NlcworICAgICAgIHdob3NlIGNsYXNzIGNvbnN0cnVjdG9yIGhhcyB0aGUgc2FtZSBzaWduYXR1cmUuICBTdWJjbGFzc2VzIHRoYXQKKyAgICAgICBkZWZpbmUgYSBkaWZmZXJlbnQgY29uc3RydWN0b3Igc2lnbmF0dXJlIG11c3Qgb3ZlcnJpZGUgY29weSgpLgorICAgICovCiAKLQlpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKQotCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygoUHlPYmplY3QqKVB5X1RZUEUoZGQpLCBQeV9Ob25lLCBkZCwgTlVMTCk7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0KilQeV9UWVBFKGRkKSwKLQkJCQkJICAgIGRkLT5kZWZhdWx0X2ZhY3RvcnksIGRkLCBOVUxMKTsKKyAgICBpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygoUHlPYmplY3QqKVB5X1RZUEUoZGQpLCBQeV9Ob25lLCBkZCwgTlVMTCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0KilQeV9UWVBFKGRkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZC0+ZGVmYXVsdF9mYWN0b3J5LCBkZCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWZkaWN0X3JlZHVjZShkZWZkaWN0b2JqZWN0ICpkZCkKIHsKLQkvKiBfX3JlZHVjZV9fIG11c3QgcmV0dXJuIGEgNS10dXBsZSBhcyBmb2xsb3dzOgorICAgIC8qIF9fcmVkdWNlX18gbXVzdCByZXR1cm4gYSA1LXR1cGxlIGFzIGZvbGxvd3M6CiAKLQkgICAtIGZhY3RvcnkgZnVuY3Rpb24KLQkgICAtIHR1cGxlIG9mIGFyZ3MgZm9yIHRoZSBmYWN0b3J5IGZ1bmN0aW9uCi0JICAgLSBhZGRpdGlvbmFsIHN0YXRlIChoZXJlIE5vbmUpCi0JICAgLSBzZXF1ZW5jZSBpdGVyYXRvciAoaGVyZSBOb25lKQotCSAgIC0gZGljdGlvbmFyeSBpdGVyYXRvciAoeWllbGRpbmcgc3VjY2Vzc2l2ZSAoa2V5LCB2YWx1ZSkgcGFpcnMKKyAgICAgICAtIGZhY3RvcnkgZnVuY3Rpb24KKyAgICAgICAtIHR1cGxlIG9mIGFyZ3MgZm9yIHRoZSBmYWN0b3J5IGZ1bmN0aW9uCisgICAgICAgLSBhZGRpdGlvbmFsIHN0YXRlIChoZXJlIE5vbmUpCisgICAgICAgLSBzZXF1ZW5jZSBpdGVyYXRvciAoaGVyZSBOb25lKQorICAgICAgIC0gZGljdGlvbmFyeSBpdGVyYXRvciAoeWllbGRpbmcgc3VjY2Vzc2l2ZSAoa2V5LCB2YWx1ZSkgcGFpcnMKIAotCSAgIFRoaXMgQVBJIGlzIHVzZWQgYnkgcGlja2xlLnB5IGFuZCBjb3B5LnB5LgorICAgICAgIFRoaXMgQVBJIGlzIHVzZWQgYnkgcGlja2xlLnB5IGFuZCBjb3B5LnB5LgogCi0JICAgRm9yIHRoaXMgdG8gYmUgdXNlZnVsIHdpdGggcGlja2xlLnB5LCB0aGUgZGVmYXVsdF9mYWN0b3J5Ci0JICAgbXVzdCBiZSBwaWNrbGFibGU7IGUuZy4sIE5vbmUsIGEgYnVpbHQtaW4sIG9yIGEgZ2xvYmFsCi0JICAgZnVuY3Rpb24gaW4gYSBtb2R1bGUgb3IgcGFja2FnZS4KKyAgICAgICBGb3IgdGhpcyB0byBiZSB1c2VmdWwgd2l0aCBwaWNrbGUucHksIHRoZSBkZWZhdWx0X2ZhY3RvcnkKKyAgICAgICBtdXN0IGJlIHBpY2tsYWJsZTsgZS5nLiwgTm9uZSwgYSBidWlsdC1pbiwgb3IgYSBnbG9iYWwKKyAgICAgICBmdW5jdGlvbiBpbiBhIG1vZHVsZSBvciBwYWNrYWdlLgogCi0JICAgQm90aCBzaGFsbG93IGFuZCBkZWVwIGNvcHlpbmcgYXJlIHN1cHBvcnRlZCwgYnV0IGZvciBkZWVwCi0JICAgY29weWluZywgdGhlIGRlZmF1bHRfZmFjdG9yeSBtdXN0IGJlIGRlZXAtY29weWFibGU7IGUuZy4gTm9uZSwKLQkgICBvciBhIGJ1aWx0LWluIChmdW5jdGlvbnMgYXJlIG5vdCBjb3B5YWJsZSBhdCB0aGlzIHRpbWUpLgorICAgICAgIEJvdGggc2hhbGxvdyBhbmQgZGVlcCBjb3B5aW5nIGFyZSBzdXBwb3J0ZWQsIGJ1dCBmb3IgZGVlcAorICAgICAgIGNvcHlpbmcsIHRoZSBkZWZhdWx0X2ZhY3RvcnkgbXVzdCBiZSBkZWVwLWNvcHlhYmxlOyBlLmcuIE5vbmUsCisgICAgICAgb3IgYSBidWlsdC1pbiAoZnVuY3Rpb25zIGFyZSBub3QgY29weWFibGUgYXQgdGhpcyB0aW1lKS4KIAotCSAgIFRoaXMgb25seSB3b3JrcyBmb3Igc3ViY2xhc3NlcyBhcyBsb25nIGFzIHRoZWlyIGNvbnN0cnVjdG9yCi0JICAgc2lnbmF0dXJlIGlzIGNvbXBhdGlibGU7IHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIHRoZQotCSAgIG9wdGlvbmFsIGRlZmF1bHRfZmFjdG9yeSwgZGVmYXVsdGluZyB0byBOb25lLgotCSovCi0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKml0ZW1zOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JaWYgKGRkLT5kZWZhdWx0X2ZhY3RvcnkgPT0gTlVMTCB8fCBkZC0+ZGVmYXVsdF9mYWN0b3J5ID09IFB5X05vbmUpCi0JCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQllbHNlCi0JCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgZGQtPmRlZmF1bHRfZmFjdG9yeSk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXRlbXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKWRkLCAiaXRlcml0ZW1zIiwgIigpIik7Ci0JaWYgKGl0ZW1zID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDUsIFB5X1RZUEUoZGQpLCBhcmdzLAotCQkJICAgICAgUHlfTm9uZSwgUHlfTm9uZSwgaXRlbXMpOwotCVB5X0RFQ1JFRihpdGVtcyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgVGhpcyBvbmx5IHdvcmtzIGZvciBzdWJjbGFzc2VzIGFzIGxvbmcgYXMgdGhlaXIgY29uc3RydWN0b3IKKyAgICAgICBzaWduYXR1cmUgaXMgY29tcGF0aWJsZTsgdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgdGhlCisgICAgICAgb3B0aW9uYWwgZGVmYXVsdF9mYWN0b3J5LCBkZWZhdWx0aW5nIHRvIE5vbmUuCisgICAgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqaXRlbXM7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMIHx8IGRkLT5kZWZhdWx0X2ZhY3RvcnkgPT0gUHlfTm9uZSkKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdGVtcyA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopZGQsICJpdGVyaXRlbXMiLCAiKCkiKTsKKyAgICBpZiAoaXRlbXMgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeVR1cGxlX1BhY2soNSwgUHlfVFlQRShkZCksIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsIFB5X05vbmUsIGl0ZW1zKTsKKyAgICBQeV9ERUNSRUYoaXRlbXMpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGVmZGljdF9tZXRob2RzW10gPSB7Ci0JeyJfX21pc3NpbmdfXyIsIChQeUNGdW5jdGlvbilkZWZkaWN0X21pc3NpbmcsIE1FVEhfTywKLQkgZGVmZGljdF9taXNzaW5nX2RvY30sCi0JeyJjb3B5IiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfY29weSwgTUVUSF9OT0FSR1MsCi0JIGRlZmRpY3RfY29weV9kb2N9LAotCXsiX19jb3B5X18iLCAoUHlDRnVuY3Rpb24pZGVmZGljdF9jb3B5LCBNRVRIX05PQVJHUywKLQkgZGVmZGljdF9jb3B5X2RvY30sCi0JeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfcmVkdWNlLCBNRVRIX05PQVJHUywKLQkgcmVkdWNlX2RvY30sCi0Je05VTEx9CisgICAgeyJfX21pc3NpbmdfXyIsIChQeUNGdW5jdGlvbilkZWZkaWN0X21pc3NpbmcsIE1FVEhfTywKKyAgICAgZGVmZGljdF9taXNzaW5nX2RvY30sCisgICAgeyJjb3B5IiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfY29weSwgTUVUSF9OT0FSR1MsCisgICAgIGRlZmRpY3RfY29weV9kb2N9LAorICAgIHsiX19jb3B5X18iLCAoUHlDRnVuY3Rpb24pZGVmZGljdF9jb3B5LCBNRVRIX05PQVJHUywKKyAgICAgZGVmZGljdF9jb3B5X2RvY30sCisgICAgeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfcmVkdWNlLCBNRVRIX05PQVJHUywKKyAgICAgcmVkdWNlX2RvY30sCisgICAge05VTEx9CiB9OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZGVmZGljdF9tZW1iZXJzW10gPSB7Ci0JeyJkZWZhdWx0X2ZhY3RvcnkiLCBUX09CSkVDVCwKLQkgb2Zmc2V0b2YoZGVmZGljdG9iamVjdCwgZGVmYXVsdF9mYWN0b3J5KSwgMCwKLQkgUHlEb2NfU1RSKCJGYWN0b3J5IGZvciBkZWZhdWx0IHZhbHVlIGNhbGxlZCBieSBfX21pc3NpbmdfXygpLiIpfSwKLQl7TlVMTH0KKyAgICB7ImRlZmF1bHRfZmFjdG9yeSIsIFRfT0JKRUNULAorICAgICBvZmZzZXRvZihkZWZkaWN0b2JqZWN0LCBkZWZhdWx0X2ZhY3RvcnkpLCAwLAorICAgICBQeURvY19TVFIoIkZhY3RvcnkgZm9yIGRlZmF1bHQgdmFsdWUgY2FsbGVkIGJ5IF9fbWlzc2luZ19fKCkuIil9LAorICAgIHtOVUxMfQogfTsKIAogc3RhdGljIHZvaWQKIGRlZmRpY3RfZGVhbGxvYyhkZWZkaWN0b2JqZWN0ICpkZCkKIHsKLQlQeV9DTEVBUihkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKLQlQeURpY3RfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKWRkKTsKKyAgICBQeV9DTEVBUihkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKKyAgICBQeURpY3RfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKWRkKTsKIH0KIAogc3RhdGljIGludAogZGVmZGljdF9wcmludChkZWZkaWN0b2JqZWN0ICpkZCwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQlpbnQgc3RzOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAiZGVmYXVsdGRpY3QoIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnByaW50ZihmcCwgIk5vbmUiKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9IGVsc2UgewotCQlQeU9iamVjdF9QcmludChkZC0+ZGVmYXVsdF9mYWN0b3J5LCBmcCwgMCk7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAiLCAiKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXN0cyA9IFB5RGljdF9UeXBlLnRwX3ByaW50KChQeU9iamVjdCAqKWRkLCBmcCwgMCk7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICIpIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXR1cm4gc3RzOworICAgIGludCBzdHM7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICJkZWZhdWx0ZGljdCgiKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChkZC0+ZGVmYXVsdF9mYWN0b3J5ID09IE5VTEwpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHJpbnRmKGZwLCAiTm9uZSIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0gZWxzZSB7CisgICAgICAgIFB5T2JqZWN0X1ByaW50KGRkLT5kZWZhdWx0X2ZhY3RvcnksIGZwLCAwKTsKKyAgICB9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICIsICIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgc3RzID0gUHlEaWN0X1R5cGUudHBfcHJpbnQoKFB5T2JqZWN0ICopZGQsIGZwLCAwKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnByaW50ZihmcCwgIikiKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldHVybiBzdHM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWZkaWN0X3JlcHIoZGVmZGljdG9iamVjdCAqZGQpCiB7Ci0JUHlPYmplY3QgKmRlZnJlcHI7Ci0JUHlPYmplY3QgKmJhc2VyZXByOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JYmFzZXJlcHIgPSBQeURpY3RfVHlwZS50cF9yZXByKChQeU9iamVjdCAqKWRkKTsKLQlpZiAoYmFzZXJlcHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRkLT5kZWZhdWx0X2ZhY3RvcnkgPT0gTlVMTCkKLQkJZGVmcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIk5vbmUiKTsKLQllbHNlCi0JewotCQlpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKGRkLT5kZWZhdWx0X2ZhY3RvcnkpOwotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJZGVmcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIi4uLiIpOwotCQl9Ci0JCWVsc2UKLQkJCWRlZnJlcHIgPSBQeU9iamVjdF9SZXByKGRkLT5kZWZhdWx0X2ZhY3RvcnkpOwotCQlQeV9SZXByTGVhdmUoZGQtPmRlZmF1bHRfZmFjdG9yeSk7Ci0JfQotCWlmIChkZWZyZXByID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGJhc2VyZXByKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoImRlZmF1bHRkaWN0KCVzLCAlcykiLAotCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGRlZnJlcHIpLAotCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGJhc2VyZXByKSk7Ci0JUHlfREVDUkVGKGRlZnJlcHIpOwotCVB5X0RFQ1JFRihiYXNlcmVwcik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqZGVmcmVwcjsKKyAgICBQeU9iamVjdCAqYmFzZXJlcHI7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBiYXNlcmVwciA9IFB5RGljdF9UeXBlLnRwX3JlcHIoKFB5T2JqZWN0ICopZGQpOworICAgIGlmIChiYXNlcmVwciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKQorICAgICAgICBkZWZyZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZygiTm9uZSIpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBzdGF0dXMgPSBQeV9SZXByRW50ZXIoZGQtPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBkZWZyZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLi4uIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGVmcmVwciA9IFB5T2JqZWN0X1JlcHIoZGQtPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgICAgIFB5X1JlcHJMZWF2ZShkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKKyAgICB9CisgICAgaWYgKGRlZnJlcHIgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoYmFzZXJlcHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiZGVmYXVsdGRpY3QoJXMsICVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoZGVmcmVwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoYmFzZXJlcHIpKTsKKyAgICBQeV9ERUNSRUYoZGVmcmVwcik7CisgICAgUHlfREVDUkVGKGJhc2VyZXByKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBkZWZkaWN0X3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVCgoKGRlZmRpY3RvYmplY3QgKilzZWxmKS0+ZGVmYXVsdF9mYWN0b3J5KTsKLQlyZXR1cm4gUHlEaWN0X1R5cGUudHBfdHJhdmVyc2Uoc2VsZiwgdmlzaXQsIGFyZyk7CisgICAgUHlfVklTSVQoKChkZWZkaWN0b2JqZWN0ICopc2VsZiktPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgcmV0dXJuIFB5RGljdF9UeXBlLnRwX3RyYXZlcnNlKHNlbGYsIHZpc2l0LCBhcmcpOwogfQogCiBzdGF0aWMgaW50CiBkZWZkaWN0X3RwX2NsZWFyKGRlZmRpY3RvYmplY3QgKmRkKQogewotCVB5X0NMRUFSKGRkLT5kZWZhdWx0X2ZhY3RvcnkpOwotCXJldHVybiBQeURpY3RfVHlwZS50cF9jbGVhcigoUHlPYmplY3QgKilkZCk7CisgICAgUHlfQ0xFQVIoZGQtPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgcmV0dXJuIFB5RGljdF9UeXBlLnRwX2NsZWFyKChQeU9iamVjdCAqKWRkKTsKIH0KIAogc3RhdGljIGludAogZGVmZGljdF9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JZGVmZGljdG9iamVjdCAqZGQgPSAoZGVmZGljdG9iamVjdCAqKXNlbGY7Ci0JUHlPYmplY3QgKm9sZGRlZmF1bHQgPSBkZC0+ZGVmYXVsdF9mYWN0b3J5OwotCVB5T2JqZWN0ICpuZXdkZWZhdWx0ID0gTlVMTDsKLQlQeU9iamVjdCAqbmV3YXJnczsKLQlpbnQgcmVzdWx0OwotCWlmIChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpCi0JCW5ld2FyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQllbHNlIHsKLQkJUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQluZXdkZWZhdWx0ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQkJCWlmICghUHlDYWxsYWJsZV9DaGVjayhuZXdkZWZhdWx0KSAmJiBuZXdkZWZhdWx0ICE9IFB5X05vbmUpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQluZXdhcmdzID0gUHlTZXF1ZW5jZV9HZXRTbGljZShhcmdzLCAxLCBuKTsKLQl9Ci0JaWYgKG5ld2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X1hJTkNSRUYobmV3ZGVmYXVsdCk7Ci0JZGQtPmRlZmF1bHRfZmFjdG9yeSA9IG5ld2RlZmF1bHQ7Ci0JcmVzdWx0ID0gUHlEaWN0X1R5cGUudHBfaW5pdChzZWxmLCBuZXdhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JUHlfWERFQ1JFRihvbGRkZWZhdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGRlZmRpY3RvYmplY3QgKmRkID0gKGRlZmRpY3RvYmplY3QgKilzZWxmOworICAgIFB5T2JqZWN0ICpvbGRkZWZhdWx0ID0gZGQtPmRlZmF1bHRfZmFjdG9yeTsKKyAgICBQeU9iamVjdCAqbmV3ZGVmYXVsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5ld2FyZ3M7CisgICAgaW50IHJlc3VsdDsKKyAgICBpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKQorICAgICAgICBuZXdhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgbmV3ZGVmYXVsdCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgICAgICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2sobmV3ZGVmYXVsdCkgJiYgbmV3ZGVmYXVsdCAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbmV3YXJncyA9IFB5U2VxdWVuY2VfR2V0U2xpY2UoYXJncywgMSwgbik7CisgICAgfQorICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9YSU5DUkVGKG5ld2RlZmF1bHQpOworICAgIGRkLT5kZWZhdWx0X2ZhY3RvcnkgPSBuZXdkZWZhdWx0OworICAgIHJlc3VsdCA9IFB5RGljdF9UeXBlLnRwX2luaXQoc2VsZiwgbmV3YXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgIFB5X1hERUNSRUYob2xkZGVmYXVsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGRlZmRpY3RfZG9jLApAQCAtMTU1MCw0NyArMTU1MCw0NyBAQAogI2RlZmluZSBERUZFUlJFRF9BRERSRVNTKEFERFIpIDAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBkZWZkaWN0X3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKERFRkVSUkVEX0FERFJFU1MoJlB5VHlwZV9UeXBlKSwgMCkKLQkiY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QiLAkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGRlZmRpY3RvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGVmZGljdF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYylkZWZkaWN0X3ByaW50LAkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylkZWZkaWN0X3JlcHIsCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJICAgICAgIAkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLAkvKiB0cF9mbGFncyAqLwotCWRlZmRpY3RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCWRlZmRpY3RfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KWRlZmRpY3RfdHBfY2xlYXIsCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGVmZGljdF9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLwotCWRlZmRpY3RfbWVtYmVycywJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQlERUZFUlJFRF9BRERSRVNTKCZQeURpY3RfVHlwZSksCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCWRlZmRpY3RfaW5pdCwJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCS8qIHRwX2FsbG9jICovCi0JMCwJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCisgICAgImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0IiwgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihkZWZkaWN0b2JqZWN0KSwgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWRlZmRpY3RfZGVhbGxvYywgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAocHJpbnRmdW5jKWRlZmRpY3RfcHJpbnQsICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylkZWZkaWN0X3JlcHIsICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZGVmZGljdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgZGVmZGljdF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlkZWZkaWN0X3RwX2NsZWFyLCAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGRlZmRpY3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBkZWZkaWN0X21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgREVGRVJSRURfQUREUkVTUygmUHlEaWN0X1R5cGUpLCAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgZGVmZGljdF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogbW9kdWxlIGxldmVsIGNvZGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNjA0LDI4ICsxNjA0LDI4IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdF9jb2xsZWN0aW9ucyh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJfY29sbGVjdGlvbnMiLCBOVUxMLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfY29sbGVjdGlvbnMiLCBOVUxMLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZkZXF1ZV90eXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJmRlcXVlX3R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGVxdWUiLCAoUHlPYmplY3QgKikmZGVxdWVfdHlwZSk7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmZGVxdWVfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZkZXF1ZV90eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImRlcXVlIiwgKFB5T2JqZWN0ICopJmRlcXVlX3R5cGUpOwogCi0JZGVmZGljdF90eXBlLnRwX2Jhc2UgPSAmUHlEaWN0X1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmZGVmZGljdF90eXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJmRlZmRpY3RfdHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkZWZhdWx0ZGljdCIsIChQeU9iamVjdCAqKSZkZWZkaWN0X3R5cGUpOworICAgIGRlZmRpY3RfdHlwZS50cF9iYXNlID0gJlB5RGljdF9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJmRlZmRpY3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZkZWZkaWN0X3R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGVmYXVsdGRpY3QiLCAoUHlPYmplY3QgKikmZGVmZGljdF90eXBlKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJmRlcXVlaXRlcl90eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZkZXF1ZWl0ZXJfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZkZXF1ZXJldml0ZXJfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmZGVxdWVyZXZpdGVyX3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JcmV0dXJuOworICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Nzdi5jIGIvTW9kdWxlcy9fY3N2LmMKaW5kZXggYTU3ODdkMy4uOTgzZjZhNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3N2LmMKKysrIGIvTW9kdWxlcy9fY3N2LmMKQEAgLTMxLDk2ICszMSw5NiBAQAogI2VuZGlmIC8qIGlmbmRlZiBQeURvY19TVFJWQVIgKi8KIAogI2lmbmRlZiBQeU1PRElOSVRfRlVOQwotIwlpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotIwkJZGVmaW5lIFB5TU9ESU5JVF9GVU5DIGV4dGVybiAiQyIgdm9pZAotIwllbHNlIC8qIF9fY3BsdXNwbHVzICovCi0jCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAotIwllbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICBpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyBleHRlcm4gIkMiIHZvaWQKKyMgICAgICAgZWxzZSAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyB2b2lkCisjICAgICAgIGVuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAjZW5kaWYKIAogI2lmbmRlZiBQeV9DTEVBUgotI2RlZmluZSBQeV9DTEVBUihvcCkJCQkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCWlmIChvcCkgewkJCQkJXAotCQkJUHlPYmplY3QgKnRtcCA9IChQeU9iamVjdCAqKShvcCk7CVwKLQkJCShvcCkgPSBOVUxMOwkJCQlcCi0JCQlQeV9ERUNSRUYodG1wKTsJCQkJXAotCQl9CQkJCQkJXAotCX0gd2hpbGUgKDApCisjZGVmaW5lIFB5X0NMRUFSKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeU9iamVjdCAqdG1wID0gKFB5T2JqZWN0ICopKG9wKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKG9wKSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAjZW5kaWYKICNpZm5kZWYgUHlfVklTSVQKLSNkZWZpbmUgUHlfVklTSVQob3ApCQkJCQkJCVwKLSAgICAgICAgZG8geyAJCQkJCQkJCVwKLSAgICAgICAgICAgICAgICBpZiAob3ApIHsJCQkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnJldCA9IHZpc2l0KChQeU9iamVjdCAqKShvcCksIGFyZyk7CVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cmV0KQkJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnJldDsJCQkJXAotICAgICAgICAgICAgICAgIH0JCQkJCQkJXAotICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBQeV9WSVNJVChvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IHZyZXQgPSB2aXNpdCgoUHlPYmplY3QgKikob3ApLCBhcmcpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHZyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiB2cmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAjZW5kaWYKIAogLyogZW5kIDIuMiBjb21wYXRpYmlsaXR5IG1hY3JvcyAqLwogCiAjZGVmaW5lIElTX0JBU0VTVFJJTkcobykgXAotCVB5T2JqZWN0X1R5cGVDaGVjayhvLCAmUHlCYXNlU3RyaW5nX1R5cGUpCisgICAgUHlPYmplY3RfVHlwZUNoZWNrKG8sICZQeUJhc2VTdHJpbmdfVHlwZSkKIAotc3RhdGljIFB5T2JqZWN0ICplcnJvcl9vYmo7CS8qIENTViBleGNlcHRpb24gKi8KK3N0YXRpYyBQeU9iamVjdCAqZXJyb3Jfb2JqOyAgICAgLyogQ1NWIGV4Y2VwdGlvbiAqLwogc3RhdGljIFB5T2JqZWN0ICpkaWFsZWN0czsgICAgICAvKiBEaWFsZWN0IHJlZ2lzdHJ5ICovCi1zdGF0aWMgbG9uZyBmaWVsZF9saW1pdCA9IDEyOCAqIDEwMjQ7CS8qIG1heCBwYXJzZWQgZmllbGQgc2l6ZSAqLworc3RhdGljIGxvbmcgZmllbGRfbGltaXQgPSAxMjggKiAxMDI0OyAgIC8qIG1heCBwYXJzZWQgZmllbGQgc2l6ZSAqLwogCiB0eXBlZGVmIGVudW0gewotCVNUQVJUX1JFQ09SRCwgU1RBUlRfRklFTEQsIEVTQ0FQRURfQ0hBUiwgSU5fRklFTEQsIAotCUlOX1FVT1RFRF9GSUVMRCwgRVNDQVBFX0lOX1FVT1RFRF9GSUVMRCwgUVVPVEVfSU5fUVVPVEVEX0ZJRUxELAotCUVBVF9DUk5MCisgICAgU1RBUlRfUkVDT1JELCBTVEFSVF9GSUVMRCwgRVNDQVBFRF9DSEFSLCBJTl9GSUVMRCwKKyAgICBJTl9RVU9URURfRklFTEQsIEVTQ0FQRV9JTl9RVU9URURfRklFTEQsIFFVT1RFX0lOX1FVT1RFRF9GSUVMRCwKKyAgICBFQVRfQ1JOTAogfSBQYXJzZXJTdGF0ZTsKIAogdHlwZWRlZiBlbnVtIHsKLQlRVU9URV9NSU5JTUFMLCBRVU9URV9BTEwsIFFVT1RFX05PTk5VTUVSSUMsIFFVT1RFX05PTkUKKyAgICBRVU9URV9NSU5JTUFMLCBRVU9URV9BTEwsIFFVT1RFX05PTk5VTUVSSUMsIFFVT1RFX05PTkUKIH0gUXVvdGVTdHlsZTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVF1b3RlU3R5bGUgc3R5bGU7Ci0JY2hhciAqbmFtZTsKKyAgICBRdW90ZVN0eWxlIHN0eWxlOworICAgIGNoYXIgKm5hbWU7CiB9IFN0eWxlRGVzYzsKIAogc3RhdGljIFN0eWxlRGVzYyBxdW90ZV9zdHlsZXNbXSA9IHsKLQl7IFFVT1RFX01JTklNQUwsICAgICJRVU9URV9NSU5JTUFMIiB9LAotCXsgUVVPVEVfQUxMLCAgICAgICAgIlFVT1RFX0FMTCIgfSwKLQl7IFFVT1RFX05PTk5VTUVSSUMsICJRVU9URV9OT05OVU1FUklDIiB9LAotCXsgUVVPVEVfTk9ORSwgICAgICAgIlFVT1RFX05PTkUiIH0sCi0JeyAwIH0KKyAgICB7IFFVT1RFX01JTklNQUwsICAgICJRVU9URV9NSU5JTUFMIiB9LAorICAgIHsgUVVPVEVfQUxMLCAgICAgICAgIlFVT1RFX0FMTCIgfSwKKyAgICB7IFFVT1RFX05PTk5VTUVSSUMsICJRVU9URV9OT05OVU1FUklDIiB9LAorICAgIHsgUVVPVEVfTk9ORSwgICAgICAgIlFVT1RFX05PTkUiIH0sCisgICAgeyAwIH0KIH07CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgUHlPYmplY3RfSEVBRAotICAgICAgICAKLQlpbnQgZG91YmxlcXVvdGU7CS8qIGlzICIgcmVwcmVzZW50ZWQgYnkgIiI/ICovCi0JY2hhciBkZWxpbWl0ZXI7CQkvKiBmaWVsZCBzZXBhcmF0b3IgKi8KLQljaGFyIHF1b3RlY2hhcjsJCS8qIHF1b3RlIGNoYXJhY3RlciAqLwotCWNoYXIgZXNjYXBlY2hhcjsJLyogZXNjYXBlIGNoYXJhY3RlciAqLwotCWludCBza2lwaW5pdGlhbHNwYWNlOwkvKiBpZ25vcmUgc3BhY2VzIGZvbGxvd2luZyBkZWxpbWl0ZXI/ICovCi0JUHlPYmplY3QgKmxpbmV0ZXJtaW5hdG9yOyAvKiBzdHJpbmcgdG8gd3JpdGUgYmV0d2VlbiByZWNvcmRzICovCi0JaW50IHF1b3Rpbmc7CQkvKiBzdHlsZSBvZiBxdW90aW5nIHRvIHdyaXRlICovCisgICAgUHlPYmplY3RfSEVBRAogCi0JaW50IHN0cmljdDsJCS8qIHJhaXNlIGV4Y2VwdGlvbiBvbiBiYWQgQ1NWICovCisgICAgaW50IGRvdWJsZXF1b3RlOyAgICAgICAgICAgIC8qIGlzICIgcmVwcmVzZW50ZWQgYnkgIiI/ICovCisgICAgY2hhciBkZWxpbWl0ZXI7ICAgICAgICAgICAgIC8qIGZpZWxkIHNlcGFyYXRvciAqLworICAgIGNoYXIgcXVvdGVjaGFyOyAgICAgICAgICAgICAvKiBxdW90ZSBjaGFyYWN0ZXIgKi8KKyAgICBjaGFyIGVzY2FwZWNoYXI7ICAgICAgICAgICAgLyogZXNjYXBlIGNoYXJhY3RlciAqLworICAgIGludCBza2lwaW5pdGlhbHNwYWNlOyAgICAgICAvKiBpZ25vcmUgc3BhY2VzIGZvbGxvd2luZyBkZWxpbWl0ZXI/ICovCisgICAgUHlPYmplY3QgKmxpbmV0ZXJtaW5hdG9yOyAvKiBzdHJpbmcgdG8gd3JpdGUgYmV0d2VlbiByZWNvcmRzICovCisgICAgaW50IHF1b3Rpbmc7ICAgICAgICAgICAgICAgIC8qIHN0eWxlIG9mIHF1b3RpbmcgdG8gd3JpdGUgKi8KKworICAgIGludCBzdHJpY3Q7ICAgICAgICAgICAgICAgICAvKiByYWlzZSBleGNlcHRpb24gb24gYmFkIENTViAqLwogfSBEaWFsZWN0T2JqOwogCiBzdGF0aWNmb3J3YXJkIFB5VHlwZU9iamVjdCBEaWFsZWN0X1R5cGU7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0X0hFQUQKIAotICAgICAgICBQeU9iamVjdCAqaW5wdXRfaXRlcjsgICAvKiBpdGVyYXRlIG92ZXIgdGhpcyBmb3IgaW5wdXQgbGluZXMgKi8KKyAgICBQeU9iamVjdCAqaW5wdXRfaXRlcjsgICAvKiBpdGVyYXRlIG92ZXIgdGhpcyBmb3IgaW5wdXQgbGluZXMgKi8KIAotICAgICAgICBEaWFsZWN0T2JqICpkaWFsZWN0OyAgICAvKiBwYXJzaW5nIGRpYWxlY3QgKi8KKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0OyAgICAvKiBwYXJzaW5nIGRpYWxlY3QgKi8KIAotCVB5T2JqZWN0ICpmaWVsZHM7CS8qIGZpZWxkIGxpc3QgZm9yIGN1cnJlbnQgcmVjb3JkICovCi0JUGFyc2VyU3RhdGUgc3RhdGU7CS8qIGN1cnJlbnQgQ1NWIHBhcnNlIHN0YXRlICovCi0JY2hhciAqZmllbGQ7CQkvKiBidWlsZCBjdXJyZW50IGZpZWxkIGluIGhlcmUgKi8KLQlpbnQgZmllbGRfc2l6ZTsJCS8qIHNpemUgb2YgYWxsb2NhdGVkIGJ1ZmZlciAqLwotCWludCBmaWVsZF9sZW47CQkvKiBsZW5ndGggb2YgY3VycmVudCBmaWVsZCAqLwotCWludCBudW1lcmljX2ZpZWxkOwkvKiB0cmVhdCBmaWVsZCBhcyBudW1lcmljICovCi0JdW5zaWduZWQgbG9uZyBsaW5lX251bTsJLyogU291cmNlLWZpbGUgbGluZSBudW1iZXIgKi8KKyAgICBQeU9iamVjdCAqZmllbGRzOyAgICAgICAgICAgLyogZmllbGQgbGlzdCBmb3IgY3VycmVudCByZWNvcmQgKi8KKyAgICBQYXJzZXJTdGF0ZSBzdGF0ZTsgICAgICAgICAgLyogY3VycmVudCBDU1YgcGFyc2Ugc3RhdGUgKi8KKyAgICBjaGFyICpmaWVsZDsgICAgICAgICAgICAgICAgLyogYnVpbGQgY3VycmVudCBmaWVsZCBpbiBoZXJlICovCisgICAgaW50IGZpZWxkX3NpemU7ICAgICAgICAgICAgIC8qIHNpemUgb2YgYWxsb2NhdGVkIGJ1ZmZlciAqLworICAgIGludCBmaWVsZF9sZW47ICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBmaWVsZCAqLworICAgIGludCBudW1lcmljX2ZpZWxkOyAgICAgICAgICAvKiB0cmVhdCBmaWVsZCBhcyBudW1lcmljICovCisgICAgdW5zaWduZWQgbG9uZyBsaW5lX251bTsgICAgIC8qIFNvdXJjZS1maWxlIGxpbmUgbnVtYmVyICovCiB9IFJlYWRlck9iajsKIAogc3RhdGljZm9yd2FyZCBQeVR5cGVPYmplY3QgUmVhZGVyX1R5cGU7CkBAIC0xMjgsMTcgKzEyOCwxNyBAQAogI2RlZmluZSBSZWFkZXJPYmplY3RfQ2hlY2sodikgICAoUHlfVFlQRSh2KSA9PSAmUmVhZGVyX1R5cGUpCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0X0hFQUQKIAotICAgICAgICBQeU9iamVjdCAqd3JpdGVsaW5lOyAgICAvKiB3cml0ZSBvdXRwdXQgbGluZXMgdG8gdGhpcyBmaWxlICovCisgICAgUHlPYmplY3QgKndyaXRlbGluZTsgICAgLyogd3JpdGUgb3V0cHV0IGxpbmVzIHRvIHRoaXMgZmlsZSAqLwogCi0gICAgICAgIERpYWxlY3RPYmogKmRpYWxlY3Q7ICAgIC8qIHBhcnNpbmcgZGlhbGVjdCAqLworICAgIERpYWxlY3RPYmogKmRpYWxlY3Q7ICAgIC8qIHBhcnNpbmcgZGlhbGVjdCAqLwogCi0JY2hhciAqcmVjOwkJLyogYnVmZmVyIGZvciBwYXJzZXIuam9pbiAqLwotCWludCByZWNfc2l6ZTsJCS8qIHNpemUgb2YgYWxsb2NhdGVkIHJlY29yZCAqLwotCWludCByZWNfbGVuOwkJLyogbGVuZ3RoIG9mIHJlY29yZCAqLwotCWludCBudW1fZmllbGRzOwkJLyogbnVtYmVyIG9mIGZpZWxkcyBpbiByZWNvcmQgKi8KLX0gV3JpdGVyT2JqOyAgICAgICAgCisgICAgY2hhciAqcmVjOyAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcGFyc2VyLmpvaW4gKi8KKyAgICBpbnQgcmVjX3NpemU7ICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBhbGxvY2F0ZWQgcmVjb3JkICovCisgICAgaW50IHJlY19sZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiByZWNvcmQgKi8KKyAgICBpbnQgbnVtX2ZpZWxkczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGZpZWxkcyBpbiByZWNvcmQgKi8KK30gV3JpdGVyT2JqOwogCiBzdGF0aWNmb3J3YXJkIFB5VHlwZU9iamVjdCBXcml0ZXJfVHlwZTsKIApAQCAtMTQ5LDM1NyArMTQ5LDM1NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9kaWFsZWN0X2Zyb21fcmVnaXN0cnkoUHlPYmplY3QgKiBuYW1lX29iaikKIHsKLSAgICAgICAgUHlPYmplY3QgKmRpYWxlY3Rfb2JqOworICAgIFB5T2JqZWN0ICpkaWFsZWN0X29iajsKIAotICAgICAgICBkaWFsZWN0X29iaiA9IFB5RGljdF9HZXRJdGVtKGRpYWxlY3RzLCBuYW1lX29iaik7Ci0JaWYgKGRpYWxlY3Rfb2JqID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfRm9ybWF0KGVycm9yX29iaiwgInVua25vd24gZGlhbGVjdCIpOwotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRihkaWFsZWN0X29iaik7Ci0gICAgICAgIHJldHVybiBkaWFsZWN0X29iajsKKyAgICBkaWFsZWN0X29iaiA9IFB5RGljdF9HZXRJdGVtKGRpYWxlY3RzLCBuYW1lX29iaik7CisgICAgaWYgKGRpYWxlY3Rfb2JqID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KGVycm9yX29iaiwgInVua25vd24gZGlhbGVjdCIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRihkaWFsZWN0X29iaik7CisgICAgcmV0dXJuIGRpYWxlY3Rfb2JqOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3N0cmluZyhQeU9iamVjdCAqc3RyKQogewotICAgICAgICBQeV9YSU5DUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBzdHI7CisgICAgUHlfWElOQ1JFRihzdHIpOworICAgIHJldHVybiBzdHI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfbnVsbGNoYXJfYXNfTm9uZShjaGFyIGMpCiB7Ci0gICAgICAgIGlmIChjID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopJmMsIDEpOworICAgIGlmIChjID09ICdcMCcpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKSZjLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIERpYWxlY3RfZ2V0X2xpbmV0ZXJtaW5hdG9yKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBnZXRfc3RyaW5nKHNlbGYtPmxpbmV0ZXJtaW5hdG9yKTsKKyAgICByZXR1cm4gZ2V0X3N0cmluZyhzZWxmLT5saW5ldGVybWluYXRvcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBEaWFsZWN0X2dldF9lc2NhcGVjaGFyKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBnZXRfbnVsbGNoYXJfYXNfTm9uZShzZWxmLT5lc2NhcGVjaGFyKTsKKyAgICByZXR1cm4gZ2V0X251bGxjaGFyX2FzX05vbmUoc2VsZi0+ZXNjYXBlY2hhcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBEaWFsZWN0X2dldF9xdW90ZWNoYXIoRGlhbGVjdE9iaiAqc2VsZikKIHsKLSAgICAgICAgcmV0dXJuIGdldF9udWxsY2hhcl9hc19Ob25lKHNlbGYtPnF1b3RlY2hhcik7CisgICAgcmV0dXJuIGdldF9udWxsY2hhcl9hc19Ob25lKHNlbGYtPnF1b3RlY2hhcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBEaWFsZWN0X2dldF9xdW90aW5nKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5xdW90aW5nKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+cXVvdGluZyk7CiB9CiAKIHN0YXRpYyBpbnQKIF9zZXRfYm9vbChjb25zdCBjaGFyICpuYW1lLCBpbnQgKnRhcmdldCwgUHlPYmplY3QgKnNyYywgaW50IGRmbHQpCiB7Ci0JaWYgKHNyYyA9PSBOVUxMKQotCQkqdGFyZ2V0ID0gZGZsdDsKLQllbHNlCi0JCSp0YXJnZXQgPSBQeU9iamVjdF9Jc1RydWUoc3JjKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgICAgICp0YXJnZXQgPSBkZmx0OworICAgIGVsc2UKKyAgICAgICAgKnRhcmdldCA9IFB5T2JqZWN0X0lzVHJ1ZShzcmMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBfc2V0X2ludChjb25zdCBjaGFyICpuYW1lLCBpbnQgKnRhcmdldCwgUHlPYmplY3QgKnNyYywgaW50IGRmbHQpCiB7Ci0JaWYgKHNyYyA9PSBOVUxMKQotCQkqdGFyZ2V0ID0gZGZsdDsKLQllbHNlIHsKLQkJaWYgKCFQeUludF9DaGVjayhzcmMpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkgICAgICJcIiVzXCIgbXVzdCBiZSBhbiBpbnRlZ2VyIiwgbmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJKnRhcmdldCA9IFB5SW50X0FzTG9uZyhzcmMpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgICAgICp0YXJnZXQgPSBkZmx0OworICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHNyYykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiBtdXN0IGJlIGFuIGludGVnZXIiLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAqdGFyZ2V0ID0gUHlJbnRfQXNMb25nKHNyYyk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBfc2V0X2NoYXIoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdGFyZ2V0LCBQeU9iamVjdCAqc3JjLCBjaGFyIGRmbHQpCiB7Ci0JaWYgKHNyYyA9PSBOVUxMKQotCQkqdGFyZ2V0ID0gZGZsdDsKLQllbHNlIHsKLQkJaWYgKHNyYyA9PSBQeV9Ob25lIHx8IFB5U3RyaW5nX1NpemUoc3JjKSA9PSAwKQotCQkJKnRhcmdldCA9ICdcMCc7Ci0JCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhzcmMpIHx8IFB5U3RyaW5nX1NpemUoc3JjKSAhPSAxKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkgICAgICJcIiVzXCIgbXVzdCBiZSBhbiAxLWNoYXJhY3RlciBzdHJpbmciLCAKLQkJCQkgICAgIG5hbWUpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhciAqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHNyYyk7Ci0JCQlpZiAocyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCSp0YXJnZXQgPSBzWzBdOwotCQl9Ci0JfQotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgICAgICp0YXJnZXQgPSBkZmx0OworICAgIGVsc2UgeworICAgICAgICBpZiAoc3JjID09IFB5X05vbmUgfHwgUHlTdHJpbmdfU2l6ZShzcmMpID09IDApCisgICAgICAgICAgICAqdGFyZ2V0ID0gJ1wwJzsKKyAgICAgICAgZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKHNyYykgfHwgUHlTdHJpbmdfU2l6ZShzcmMpICE9IDEpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiBtdXN0IGJlIGFuIDEtY2hhcmFjdGVyIHN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICpzID0gUHlTdHJpbmdfQXNTdHJpbmcoc3JjKTsKKyAgICAgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgKnRhcmdldCA9IHNbMF07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIF9zZXRfc3RyKGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICoqdGFyZ2V0LCBQeU9iamVjdCAqc3JjLCBjb25zdCBjaGFyICpkZmx0KQogewotCWlmIChzcmMgPT0gTlVMTCkKLQkJKnRhcmdldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZGZsdCk7Ci0JZWxzZSB7Ci0JCWlmIChzcmMgPT0gUHlfTm9uZSkKLQkJCSp0YXJnZXQgPSBOVUxMOwotCQllbHNlIGlmICghSVNfQkFTRVNUUklORyhzcmMpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkgICAgICJcIiVzXCIgbXVzdCBiZSBhbiBzdHJpbmciLCBuYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIHsKLQkJCVB5X1hERUNSRUYoKnRhcmdldCk7Ci0JCQlQeV9JTkNSRUYoc3JjKTsKLQkJCSp0YXJnZXQgPSBzcmM7Ci0JCX0KLQl9Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChzcmMgPT0gTlVMTCkKKyAgICAgICAgKnRhcmdldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZGZsdCk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzcmMgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICp0YXJnZXQgPSBOVUxMOworICAgICAgICBlbHNlIGlmICghSVNfQkFTRVNUUklORyhzcmMpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJcIiVzXCIgbXVzdCBiZSBhbiBzdHJpbmciLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoKnRhcmdldCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoc3JjKTsKKyAgICAgICAgICAgICp0YXJnZXQgPSBzcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGRpYWxlY3RfY2hlY2tfcXVvdGluZyhpbnQgcXVvdGluZykKIHsKLSAgICAgICAgU3R5bGVEZXNjICpxcyA9IHF1b3RlX3N0eWxlczsKKyAgICBTdHlsZURlc2MgKnFzID0gcXVvdGVfc3R5bGVzOwogCi0JZm9yIChxcyA9IHF1b3RlX3N0eWxlczsgcXMtPm5hbWU7IHFzKyspIHsKLQkJaWYgKHFzLT5zdHlsZSA9PSBxdW90aW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiYmFkIFwicXVvdGluZ1wiIHZhbHVlIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBmb3IgKHFzID0gcXVvdGVfc3R5bGVzOyBxcy0+bmFtZTsgcXMrKykgeworICAgICAgICBpZiAocXMtPnN0eWxlID09IHF1b3RpbmcpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImJhZCBcInF1b3RpbmdcIiB2YWx1ZSIpOworICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBEX09GRih4KSBvZmZzZXRvZihEaWFsZWN0T2JqLCB4KQogCiBzdGF0aWMgc3RydWN0IFB5TWVtYmVyRGVmIERpYWxlY3RfbWVtYmVybGlzdFtdID0gewotCXsgImRlbGltaXRlciIsICAgICAgICAgIFRfQ0hBUiwgRF9PRkYoZGVsaW1pdGVyKSwgUkVBRE9OTFkgfSwKLQl7ICJza2lwaW5pdGlhbHNwYWNlIiwgICBUX0lOVCwgRF9PRkYoc2tpcGluaXRpYWxzcGFjZSksIFJFQURPTkxZIH0sCi0JeyAiZG91YmxlcXVvdGUiLCAgICAgICAgVF9JTlQsIERfT0ZGKGRvdWJsZXF1b3RlKSwgUkVBRE9OTFkgfSwKLQl7ICJzdHJpY3QiLCAgICAgICAgICAgICBUX0lOVCwgRF9PRkYoc3RyaWN0KSwgUkVBRE9OTFkgfSwKLQl7IE5VTEwgfQorICAgIHsgImRlbGltaXRlciIsICAgICAgICAgIFRfQ0hBUiwgRF9PRkYoZGVsaW1pdGVyKSwgUkVBRE9OTFkgfSwKKyAgICB7ICJza2lwaW5pdGlhbHNwYWNlIiwgICBUX0lOVCwgRF9PRkYoc2tpcGluaXRpYWxzcGFjZSksIFJFQURPTkxZIH0sCisgICAgeyAiZG91YmxlcXVvdGUiLCAgICAgICAgVF9JTlQsIERfT0ZGKGRvdWJsZXF1b3RlKSwgUkVBRE9OTFkgfSwKKyAgICB7ICJzdHJpY3QiLCAgICAgICAgICAgICBUX0lOVCwgRF9PRkYoc3RyaWN0KSwgUkVBRE9OTFkgfSwKKyAgICB7IE5VTEwgfQogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIERpYWxlY3RfZ2V0c2V0bGlzdFtdID0gewotCXsgImVzY2FwZWNoYXIiLAkJKGdldHRlcilEaWFsZWN0X2dldF9lc2NhcGVjaGFyfSwKLQl7ICJsaW5ldGVybWluYXRvciIsCShnZXR0ZXIpRGlhbGVjdF9nZXRfbGluZXRlcm1pbmF0b3J9LAotCXsgInF1b3RlY2hhciIsCQkoZ2V0dGVyKURpYWxlY3RfZ2V0X3F1b3RlY2hhcn0sCi0JeyAicXVvdGluZyIsCQkoZ2V0dGVyKURpYWxlY3RfZ2V0X3F1b3Rpbmd9LAotCXtOVUxMfSwKKyAgICB7ICJlc2NhcGVjaGFyIiwgICAgICAgICAgICAgKGdldHRlcilEaWFsZWN0X2dldF9lc2NhcGVjaGFyfSwKKyAgICB7ICJsaW5ldGVybWluYXRvciIsICAgICAgICAgKGdldHRlcilEaWFsZWN0X2dldF9saW5ldGVybWluYXRvcn0sCisgICAgeyAicXVvdGVjaGFyIiwgICAgICAgICAgICAgIChnZXR0ZXIpRGlhbGVjdF9nZXRfcXVvdGVjaGFyfSwKKyAgICB7ICJxdW90aW5nIiwgICAgICAgICAgICAgICAgKGdldHRlcilEaWFsZWN0X2dldF9xdW90aW5nfSwKKyAgICB7TlVMTH0sCiB9OwogCiBzdGF0aWMgdm9pZAogRGlhbGVjdF9kZWFsbG9jKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+bGluZXRlcm1pbmF0b3IpOwotICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+bGluZXRlcm1pbmF0b3IpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBjaGFyICpkaWFsZWN0X2t3c1tdID0gewotCSJkaWFsZWN0IiwKLQkiZGVsaW1pdGVyIiwKLQkiZG91YmxlcXVvdGUiLAotCSJlc2NhcGVjaGFyIiwKLQkibGluZXRlcm1pbmF0b3IiLAotCSJxdW90ZWNoYXIiLAotCSJxdW90aW5nIiwKLQkic2tpcGluaXRpYWxzcGFjZSIsCi0JInN0cmljdCIsCi0JTlVMTAorICAgICJkaWFsZWN0IiwKKyAgICAiZGVsaW1pdGVyIiwKKyAgICAiZG91YmxlcXVvdGUiLAorICAgICJlc2NhcGVjaGFyIiwKKyAgICAibGluZXRlcm1pbmF0b3IiLAorICAgICJxdW90ZWNoYXIiLAorICAgICJxdW90aW5nIiwKKyAgICAic2tpcGluaXRpYWxzcGFjZSIsCisgICAgInN0cmljdCIsCisgICAgTlVMTAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpYWxlY3RfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JRGlhbGVjdE9iaiAqc2VsZjsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlQeU9iamVjdCAqZGlhbGVjdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmRlbGltaXRlciA9IE5VTEw7Ci0JUHlPYmplY3QgKmRvdWJsZXF1b3RlID0gTlVMTDsKLQlQeU9iamVjdCAqZXNjYXBlY2hhciA9IE5VTEw7Ci0JUHlPYmplY3QgKmxpbmV0ZXJtaW5hdG9yID0gTlVMTDsKLQlQeU9iamVjdCAqcXVvdGVjaGFyID0gTlVMTDsKLQlQeU9iamVjdCAqcXVvdGluZyA9IE5VTEw7Ci0JUHlPYmplY3QgKnNraXBpbml0aWFsc3BhY2UgPSBOVUxMOwotCVB5T2JqZWN0ICpzdHJpY3QgPSBOVUxMOworICAgIERpYWxlY3RPYmogKnNlbGY7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRpYWxlY3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkZWxpbWl0ZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkb3VibGVxdW90ZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVzY2FwZWNoYXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsaW5ldGVybWluYXRvciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnF1b3RlY2hhciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnF1b3RpbmcgPSBOVUxMOworICAgIFB5T2JqZWN0ICpza2lwaW5pdGlhbHNwYWNlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RyaWN0ID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywKLQkJCQkJICJ8T09PT09PT09PIiwgZGlhbGVjdF9rd3MsCi0JCQkJCSAmZGlhbGVjdCwKLQkJCQkJICZkZWxpbWl0ZXIsCi0JCQkJCSAmZG91YmxlcXVvdGUsCi0JCQkJCSAmZXNjYXBlY2hhciwKLQkJCQkJICZsaW5ldGVybWluYXRvciwKLQkJCQkJICZxdW90ZWNoYXIsCi0JCQkJCSAmcXVvdGluZywKLQkJCQkJICZza2lwaW5pdGlhbHNwYWNlLAotCQkJCQkgJnN0cmljdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifE9PT09PT09PTyIsIGRpYWxlY3Rfa3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWFsZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvdWJsZXF1b3RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlc2NhcGVjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW5ldGVybWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdGVjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdW90aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZza2lwaW5pdGlhbHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChkaWFsZWN0ICE9IE5VTEwpIHsKLQkJaWYgKElTX0JBU0VTVFJJTkcoZGlhbGVjdCkpIHsKLQkJCWRpYWxlY3QgPSBnZXRfZGlhbGVjdF9mcm9tX3JlZ2lzdHJ5KGRpYWxlY3QpOwotCQkJaWYgKGRpYWxlY3QgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbHNlCi0JCQlQeV9JTkNSRUYoZGlhbGVjdCk7Ci0JCS8qIENhbiB3ZSByZXVzZSB0aGlzIGluc3RhbmNlPyAqLwotCQlpZiAoUHlPYmplY3RfVHlwZUNoZWNrKGRpYWxlY3QsICZEaWFsZWN0X1R5cGUpICYmCi0JCSAgICBkZWxpbWl0ZXIgPT0gMCAmJgotCQkgICAgZG91YmxlcXVvdGUgPT0gMCAmJgotCQkgICAgZXNjYXBlY2hhciA9PSAwICYmCi0JCSAgICBsaW5ldGVybWluYXRvciA9PSAwICYmCi0JCSAgICBxdW90ZWNoYXIgPT0gMCAmJgotCQkgICAgcXVvdGluZyA9PSAwICYmCi0JCSAgICBza2lwaW5pdGlhbHNwYWNlID09IDAgJiYKLQkJICAgIHN0cmljdCA9PSAwKQotCQkJcmV0dXJuIGRpYWxlY3Q7Ci0JfQorICAgIGlmIChkaWFsZWN0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKElTX0JBU0VTVFJJTkcoZGlhbGVjdCkpIHsKKyAgICAgICAgICAgIGRpYWxlY3QgPSBnZXRfZGlhbGVjdF9mcm9tX3JlZ2lzdHJ5KGRpYWxlY3QpOworICAgICAgICAgICAgaWYgKGRpYWxlY3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9JTkNSRUYoZGlhbGVjdCk7CisgICAgICAgIC8qIENhbiB3ZSByZXVzZSB0aGlzIGluc3RhbmNlPyAqLworICAgICAgICBpZiAoUHlPYmplY3RfVHlwZUNoZWNrKGRpYWxlY3QsICZEaWFsZWN0X1R5cGUpICYmCisgICAgICAgICAgICBkZWxpbWl0ZXIgPT0gMCAmJgorICAgICAgICAgICAgZG91YmxlcXVvdGUgPT0gMCAmJgorICAgICAgICAgICAgZXNjYXBlY2hhciA9PSAwICYmCisgICAgICAgICAgICBsaW5ldGVybWluYXRvciA9PSAwICYmCisgICAgICAgICAgICBxdW90ZWNoYXIgPT0gMCAmJgorICAgICAgICAgICAgcXVvdGluZyA9PSAwICYmCisgICAgICAgICAgICBza2lwaW5pdGlhbHNwYWNlID09IDAgJiYKKyAgICAgICAgICAgIHN0cmljdCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGRpYWxlY3Q7CisgICAgfQogCi0Jc2VsZiA9IChEaWFsZWN0T2JqICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKGRpYWxlY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZi0+bGluZXRlcm1pbmF0b3IgPSBOVUxMOworICAgIHNlbGYgPSAoRGlhbGVjdE9iaiAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRihkaWFsZWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNlbGYtPmxpbmV0ZXJtaW5hdG9yID0gTlVMTDsKIAotCVB5X1hJTkNSRUYoZGVsaW1pdGVyKTsKLQlQeV9YSU5DUkVGKGRvdWJsZXF1b3RlKTsKLQlQeV9YSU5DUkVGKGVzY2FwZWNoYXIpOwotCVB5X1hJTkNSRUYobGluZXRlcm1pbmF0b3IpOwotCVB5X1hJTkNSRUYocXVvdGVjaGFyKTsKLQlQeV9YSU5DUkVGKHF1b3RpbmcpOwotCVB5X1hJTkNSRUYoc2tpcGluaXRpYWxzcGFjZSk7Ci0JUHlfWElOQ1JFRihzdHJpY3QpOwotCWlmIChkaWFsZWN0ICE9IE5VTEwpIHsKKyAgICBQeV9YSU5DUkVGKGRlbGltaXRlcik7CisgICAgUHlfWElOQ1JFRihkb3VibGVxdW90ZSk7CisgICAgUHlfWElOQ1JFRihlc2NhcGVjaGFyKTsKKyAgICBQeV9YSU5DUkVGKGxpbmV0ZXJtaW5hdG9yKTsKKyAgICBQeV9YSU5DUkVGKHF1b3RlY2hhcik7CisgICAgUHlfWElOQ1JFRihxdW90aW5nKTsKKyAgICBQeV9YSU5DUkVGKHNraXBpbml0aWFsc3BhY2UpOworICAgIFB5X1hJTkNSRUYoc3RyaWN0KTsKKyAgICBpZiAoZGlhbGVjdCAhPSBOVUxMKSB7CiAjZGVmaW5lIERJQUxFQ1RfR0VUQVRUUih2LCBuKSBcCi0JCWlmICh2ID09IE5VTEwpIFwKLQkJCXYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRpYWxlY3QsIG4pCi0JCURJQUxFQ1RfR0VUQVRUUihkZWxpbWl0ZXIsICJkZWxpbWl0ZXIiKTsKLQkJRElBTEVDVF9HRVRBVFRSKGRvdWJsZXF1b3RlLCAiZG91YmxlcXVvdGUiKTsKLQkJRElBTEVDVF9HRVRBVFRSKGVzY2FwZWNoYXIsICJlc2NhcGVjaGFyIik7Ci0JCURJQUxFQ1RfR0VUQVRUUihsaW5ldGVybWluYXRvciwgImxpbmV0ZXJtaW5hdG9yIik7Ci0JCURJQUxFQ1RfR0VUQVRUUihxdW90ZWNoYXIsICJxdW90ZWNoYXIiKTsKLQkJRElBTEVDVF9HRVRBVFRSKHF1b3RpbmcsICJxdW90aW5nIik7Ci0JCURJQUxFQ1RfR0VUQVRUUihza2lwaW5pdGlhbHNwYWNlLCAic2tpcGluaXRpYWxzcGFjZSIpOwotCQlESUFMRUNUX0dFVEFUVFIoc3RyaWN0LCAic3RyaWN0Iik7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQorICAgICAgICBpZiAodiA9PSBOVUxMKSBcCisgICAgICAgICAgICB2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkaWFsZWN0LCBuKQorICAgICAgICBESUFMRUNUX0dFVEFUVFIoZGVsaW1pdGVyLCAiZGVsaW1pdGVyIik7CisgICAgICAgIERJQUxFQ1RfR0VUQVRUUihkb3VibGVxdW90ZSwgImRvdWJsZXF1b3RlIik7CisgICAgICAgIERJQUxFQ1RfR0VUQVRUUihlc2NhcGVjaGFyLCAiZXNjYXBlY2hhciIpOworICAgICAgICBESUFMRUNUX0dFVEFUVFIobGluZXRlcm1pbmF0b3IsICJsaW5ldGVybWluYXRvciIpOworICAgICAgICBESUFMRUNUX0dFVEFUVFIocXVvdGVjaGFyLCAicXVvdGVjaGFyIik7CisgICAgICAgIERJQUxFQ1RfR0VUQVRUUihxdW90aW5nLCAicXVvdGluZyIpOworICAgICAgICBESUFMRUNUX0dFVEFUVFIoc2tpcGluaXRpYWxzcGFjZSwgInNraXBpbml0aWFsc3BhY2UiKTsKKyAgICAgICAgRElBTEVDVF9HRVRBVFRSKHN0cmljdCwgInN0cmljdCIpOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KIAotCS8qIGNoZWNrIHR5cGVzIGFuZCBjb252ZXJ0IHRvIEMgdmFsdWVzICovCisgICAgLyogY2hlY2sgdHlwZXMgYW5kIGNvbnZlcnQgdG8gQyB2YWx1ZXMgKi8KICNkZWZpbmUgRElBU0VUKG1ldGgsIG5hbWUsIHRhcmdldCwgc3JjLCBkZmx0KSBcCi0JaWYgKG1ldGgobmFtZSwgdGFyZ2V0LCBzcmMsIGRmbHQpKSBcCi0JCWdvdG8gZXJyCi0JRElBU0VUKF9zZXRfY2hhciwgImRlbGltaXRlciIsICZzZWxmLT5kZWxpbWl0ZXIsIGRlbGltaXRlciwgJywnKTsKLQlESUFTRVQoX3NldF9ib29sLCAiZG91YmxlcXVvdGUiLCAmc2VsZi0+ZG91YmxlcXVvdGUsIGRvdWJsZXF1b3RlLCAxKTsKLQlESUFTRVQoX3NldF9jaGFyLCAiZXNjYXBlY2hhciIsICZzZWxmLT5lc2NhcGVjaGFyLCBlc2NhcGVjaGFyLCAwKTsKLQlESUFTRVQoX3NldF9zdHIsICJsaW5ldGVybWluYXRvciIsICZzZWxmLT5saW5ldGVybWluYXRvciwgbGluZXRlcm1pbmF0b3IsICJcclxuIik7Ci0JRElBU0VUKF9zZXRfY2hhciwgInF1b3RlY2hhciIsICZzZWxmLT5xdW90ZWNoYXIsIHF1b3RlY2hhciwgJyInKTsKLQlESUFTRVQoX3NldF9pbnQsICJxdW90aW5nIiwgJnNlbGYtPnF1b3RpbmcsIHF1b3RpbmcsIFFVT1RFX01JTklNQUwpOwotCURJQVNFVChfc2V0X2Jvb2wsICJza2lwaW5pdGlhbHNwYWNlIiwgJnNlbGYtPnNraXBpbml0aWFsc3BhY2UsIHNraXBpbml0aWFsc3BhY2UsIDApOwotCURJQVNFVChfc2V0X2Jvb2wsICJzdHJpY3QiLCAmc2VsZi0+c3RyaWN0LCBzdHJpY3QsIDApOworICAgIGlmIChtZXRoKG5hbWUsIHRhcmdldCwgc3JjLCBkZmx0KSkgXAorICAgICAgICBnb3RvIGVycgorICAgIERJQVNFVChfc2V0X2NoYXIsICJkZWxpbWl0ZXIiLCAmc2VsZi0+ZGVsaW1pdGVyLCBkZWxpbWl0ZXIsICcsJyk7CisgICAgRElBU0VUKF9zZXRfYm9vbCwgImRvdWJsZXF1b3RlIiwgJnNlbGYtPmRvdWJsZXF1b3RlLCBkb3VibGVxdW90ZSwgMSk7CisgICAgRElBU0VUKF9zZXRfY2hhciwgImVzY2FwZWNoYXIiLCAmc2VsZi0+ZXNjYXBlY2hhciwgZXNjYXBlY2hhciwgMCk7CisgICAgRElBU0VUKF9zZXRfc3RyLCAibGluZXRlcm1pbmF0b3IiLCAmc2VsZi0+bGluZXRlcm1pbmF0b3IsIGxpbmV0ZXJtaW5hdG9yLCAiXHJcbiIpOworICAgIERJQVNFVChfc2V0X2NoYXIsICJxdW90ZWNoYXIiLCAmc2VsZi0+cXVvdGVjaGFyLCBxdW90ZWNoYXIsICciJyk7CisgICAgRElBU0VUKF9zZXRfaW50LCAicXVvdGluZyIsICZzZWxmLT5xdW90aW5nLCBxdW90aW5nLCBRVU9URV9NSU5JTUFMKTsKKyAgICBESUFTRVQoX3NldF9ib29sLCAic2tpcGluaXRpYWxzcGFjZSIsICZzZWxmLT5za2lwaW5pdGlhbHNwYWNlLCBza2lwaW5pdGlhbHNwYWNlLCAwKTsKKyAgICBESUFTRVQoX3NldF9ib29sLCAic3RyaWN0IiwgJnNlbGYtPnN0cmljdCwgc3RyaWN0LCAwKTsKIAotCS8qIHZhbGlkYXRlIG9wdGlvbnMgKi8KLQlpZiAoZGlhbGVjdF9jaGVja19xdW90aW5nKHNlbGYtPnF1b3RpbmcpKQotCQlnb3RvIGVycjsKLQlpZiAoc2VsZi0+ZGVsaW1pdGVyID09IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGVsaW1pdGVyIG11c3QgYmUgc2V0Iik7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAocXVvdGVjaGFyID09IFB5X05vbmUgJiYgcXVvdGluZyA9PSBOVUxMKQotCQlzZWxmLT5xdW90aW5nID0gUVVPVEVfTk9ORTsKLQlpZiAoc2VsZi0+cXVvdGluZyAhPSBRVU9URV9OT05FICYmIHNlbGYtPnF1b3RlY2hhciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJInF1b3RlY2hhciBtdXN0IGJlIHNldCBpZiBxdW90aW5nIGVuYWJsZWQiKTsKLQkJZ290byBlcnI7Ci0JfQotCWlmIChzZWxmLT5saW5ldGVybWluYXRvciA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsaW5ldGVybWluYXRvciBtdXN0IGJlIHNldCIpOwotCQlnb3RvIGVycjsKLQl9CisgICAgLyogdmFsaWRhdGUgb3B0aW9ucyAqLworICAgIGlmIChkaWFsZWN0X2NoZWNrX3F1b3Rpbmcoc2VsZi0+cXVvdGluZykpCisgICAgICAgIGdvdG8gZXJyOworICAgIGlmIChzZWxmLT5kZWxpbWl0ZXIgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGVsaW1pdGVyIG11c3QgYmUgc2V0Iik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAocXVvdGVjaGFyID09IFB5X05vbmUgJiYgcXVvdGluZyA9PSBOVUxMKQorICAgICAgICBzZWxmLT5xdW90aW5nID0gUVVPVEVfTk9ORTsKKyAgICBpZiAoc2VsZi0+cXVvdGluZyAhPSBRVU9URV9OT05FICYmIHNlbGYtPnF1b3RlY2hhciA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicXVvdGVjaGFyIG11c3QgYmUgc2V0IGlmIHF1b3RpbmcgZW5hYmxlZCIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKHNlbGYtPmxpbmV0ZXJtaW5hdG9yID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxpbmV0ZXJtaW5hdG9yIG11c3QgYmUgc2V0Iik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KIAotCXJldCA9IChQeU9iamVjdCAqKXNlbGY7Ci0JUHlfSU5DUkVGKHNlbGYpOworICAgIHJldCA9IChQeU9iamVjdCAqKXNlbGY7CisgICAgUHlfSU5DUkVGKHNlbGYpOwogZXJyOgotCVB5X1hERUNSRUYoc2VsZik7Ci0JUHlfWERFQ1JFRihkaWFsZWN0KTsKLQlQeV9YREVDUkVGKGRlbGltaXRlcik7Ci0JUHlfWERFQ1JFRihkb3VibGVxdW90ZSk7Ci0JUHlfWERFQ1JFRihlc2NhcGVjaGFyKTsKLQlQeV9YREVDUkVGKGxpbmV0ZXJtaW5hdG9yKTsKLQlQeV9YREVDUkVGKHF1b3RlY2hhcik7Ci0JUHlfWERFQ1JFRihxdW90aW5nKTsKLQlQeV9YREVDUkVGKHNraXBpbml0aWFsc3BhY2UpOwotCVB5X1hERUNSRUYoc3RyaWN0KTsKLQlyZXR1cm4gcmV0OworICAgIFB5X1hERUNSRUYoc2VsZik7CisgICAgUHlfWERFQ1JFRihkaWFsZWN0KTsKKyAgICBQeV9YREVDUkVGKGRlbGltaXRlcik7CisgICAgUHlfWERFQ1JFRihkb3VibGVxdW90ZSk7CisgICAgUHlfWERFQ1JFRihlc2NhcGVjaGFyKTsKKyAgICBQeV9YREVDUkVGKGxpbmV0ZXJtaW5hdG9yKTsKKyAgICBQeV9YREVDUkVGKHF1b3RlY2hhcik7CisgICAgUHlfWERFQ1JFRihxdW90aW5nKTsKKyAgICBQeV9YREVDUkVGKHNraXBpbml0aWFsc3BhY2UpOworICAgIFB5X1hERUNSRUYoc3RyaWN0KTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKLVB5RG9jX1NUUlZBUihEaWFsZWN0X1R5cGVfZG9jLCAKK1B5RG9jX1NUUlZBUihEaWFsZWN0X1R5cGVfZG9jLAogIkNTViBkaWFsZWN0XG4iCiAiXG4iCiAiVGhlIERpYWxlY3QgdHlwZSByZWNvcmRzIENTViBwYXJzaW5nIGFuZCBnZW5lcmF0aW9uIG9wdGlvbnMuXG4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBEaWFsZWN0X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jc3YuRGlhbGVjdCIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KLQlzaXplb2YoRGlhbGVjdE9iaiksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCi0JLyogIG1ldGhvZHMgICovCi0JKGRlc3RydWN0b3IpRGlhbGVjdF9kZWFsbG9jLCAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkoZ2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotCShzZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9zdHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLSAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQlEaWFsZWN0X1R5cGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotICAgICAgICBEaWFsZWN0X21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotICAgICAgICBEaWFsZWN0X2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWRpYWxlY3RfbmV3LAkJCSAgICAgICAgLyogdHBfbmV3ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2Nzdi5EaWFsZWN0IiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihEaWFsZWN0T2JqKSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiAgbWV0aG9kcyAgKi8KKyAgICAoZGVzdHJ1Y3RvcilEaWFsZWN0X2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgKHNldGF0dHJmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgRGlhbGVjdF9UeXBlX2RvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgRGlhbGVjdF9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBEaWFsZWN0X2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBkaWFsZWN0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyoKQEAgLTUwOSwxNSArNTA5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NhbGxfZGlhbGVjdChQeU9iamVjdCAqZGlhbGVjdF9pbnN0LCBQeU9iamVjdCAqa3dhcmdzKQogewotCVB5T2JqZWN0ICpjdG9yX2FyZ3M7Ci0JUHlPYmplY3QgKmRpYWxlY3Q7CisgICAgUHlPYmplY3QgKmN0b3JfYXJnczsKKyAgICBQeU9iamVjdCAqZGlhbGVjdDsKIAotCWN0b3JfYXJncyA9IFB5X0J1aWxkVmFsdWUoZGlhbGVjdF9pbnN0ID8gIihPKSIgOiAiKCkiLCBkaWFsZWN0X2luc3QpOwotCWlmIChjdG9yX2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZGlhbGVjdCA9IFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0ICopJkRpYWxlY3RfVHlwZSwgY3Rvcl9hcmdzLCBrd2FyZ3MpOwotCVB5X0RFQ1JFRihjdG9yX2FyZ3MpOwotCXJldHVybiBkaWFsZWN0OworICAgIGN0b3JfYXJncyA9IFB5X0J1aWxkVmFsdWUoZGlhbGVjdF9pbnN0ID8gIihPKSIgOiAiKCkiLCBkaWFsZWN0X2luc3QpOworICAgIGlmIChjdG9yX2FyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGlhbGVjdCA9IFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0ICopJkRpYWxlY3RfVHlwZSwgY3Rvcl9hcmdzLCBrd2FyZ3MpOworICAgIFB5X0RFQ1JFRihjdG9yX2FyZ3MpOworICAgIHJldHVybiBkaWFsZWN0OwogfQogCiAvKgpAQCAtNTI2LDMzMCArNTI2LDMzMCBAQAogc3RhdGljIGludAogcGFyc2Vfc2F2ZV9maWVsZChSZWFkZXJPYmogKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZpZWxkOworICAgIFB5T2JqZWN0ICpmaWVsZDsKIAotCWZpZWxkID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+ZmllbGQsIHNlbGYtPmZpZWxkX2xlbik7Ci0JaWYgKGZpZWxkID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlzZWxmLT5maWVsZF9sZW4gPSAwOwotCWlmIChzZWxmLT5udW1lcmljX2ZpZWxkKSB7Ci0JCVB5T2JqZWN0ICp0bXA7CisgICAgZmllbGQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5maWVsZCwgc2VsZi0+ZmllbGRfbGVuKTsKKyAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNlbGYtPmZpZWxkX2xlbiA9IDA7CisgICAgaWYgKHNlbGYtPm51bWVyaWNfZmllbGQpIHsKKyAgICAgICAgUHlPYmplY3QgKnRtcDsKIAotCQlzZWxmLT5udW1lcmljX2ZpZWxkID0gMDsKLQkJdG1wID0gUHlOdW1iZXJfRmxvYXQoZmllbGQpOwotCQlpZiAodG1wID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmaWVsZCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKGZpZWxkKTsKLQkJZmllbGQgPSB0bXA7Ci0JfQotCVB5TGlzdF9BcHBlbmQoc2VsZi0+ZmllbGRzLCBmaWVsZCk7Ci0JUHlfREVDUkVGKGZpZWxkKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgc2VsZi0+bnVtZXJpY19maWVsZCA9IDA7CisgICAgICAgIHRtcCA9IFB5TnVtYmVyX0Zsb2F0KGZpZWxkKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihmaWVsZCk7CisgICAgICAgIGZpZWxkID0gdG1wOworICAgIH0KKyAgICBQeUxpc3RfQXBwZW5kKHNlbGYtPmZpZWxkcywgZmllbGQpOworICAgIFB5X0RFQ1JFRihmaWVsZCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHBhcnNlX2dyb3dfYnVmZihSZWFkZXJPYmogKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmZpZWxkX3NpemUgPT0gMCkgewotCQlzZWxmLT5maWVsZF9zaXplID0gNDA5NjsKLQkJaWYgKHNlbGYtPmZpZWxkICE9IE5VTEwpCi0JCQlQeU1lbV9GcmVlKHNlbGYtPmZpZWxkKTsKLQkJc2VsZi0+ZmllbGQgPSBQeU1lbV9NYWxsb2Moc2VsZi0+ZmllbGRfc2l6ZSk7Ci0JfQotCWVsc2UgewotCQlpZiAoc2VsZi0+ZmllbGRfc2l6ZSA+IElOVF9NQVggLyAyKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIDA7Ci0JCX0gCi0JCXNlbGYtPmZpZWxkX3NpemUgKj0gMjsKLQkJc2VsZi0+ZmllbGQgPSBQeU1lbV9SZWFsbG9jKHNlbGYtPmZpZWxkLCBzZWxmLT5maWVsZF9zaXplKTsKLQl9Ci0JaWYgKHNlbGYtPmZpZWxkID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChzZWxmLT5maWVsZF9zaXplID09IDApIHsKKyAgICAgICAgc2VsZi0+ZmllbGRfc2l6ZSA9IDQwOTY7CisgICAgICAgIGlmIChzZWxmLT5maWVsZCAhPSBOVUxMKQorICAgICAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5maWVsZCk7CisgICAgICAgIHNlbGYtPmZpZWxkID0gUHlNZW1fTWFsbG9jKHNlbGYtPmZpZWxkX3NpemUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHNlbGYtPmZpZWxkX3NpemUgPiBJTlRfTUFYIC8gMikgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmZpZWxkX3NpemUgKj0gMjsKKyAgICAgICAgc2VsZi0+ZmllbGQgPSBQeU1lbV9SZWFsbG9jKHNlbGYtPmZpZWxkLCBzZWxmLT5maWVsZF9zaXplKTsKKyAgICB9CisgICAgaWYgKHNlbGYtPmZpZWxkID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBwYXJzZV9hZGRfY2hhcihSZWFkZXJPYmogKnNlbGYsIGNoYXIgYykKIHsKLQlpZiAoc2VsZi0+ZmllbGRfbGVuID49IGZpZWxkX2xpbWl0KSB7Ci0JCVB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJmaWVsZCBsYXJnZXIgdGhhbiBmaWVsZCBsaW1pdCAoJWxkKSIsCi0JCQkgICAgIGZpZWxkX2xpbWl0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoc2VsZi0+ZmllbGRfbGVuID09IHNlbGYtPmZpZWxkX3NpemUgJiYgIXBhcnNlX2dyb3dfYnVmZihzZWxmKSkKLQkJcmV0dXJuIC0xOwotCXNlbGYtPmZpZWxkW3NlbGYtPmZpZWxkX2xlbisrXSA9IGM7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNlbGYtPmZpZWxkX2xlbiA+PSBmaWVsZF9saW1pdCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAiZmllbGQgbGFyZ2VyIHRoYW4gZmllbGQgbGltaXQgKCVsZCkiLAorICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGltaXQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzZWxmLT5maWVsZF9sZW4gPT0gc2VsZi0+ZmllbGRfc2l6ZSAmJiAhcGFyc2VfZ3Jvd19idWZmKHNlbGYpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc2VsZi0+ZmllbGRbc2VsZi0+ZmllbGRfbGVuKytdID0gYzsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogcGFyc2VfcHJvY2Vzc19jaGFyKFJlYWRlck9iaiAqc2VsZiwgY2hhciBjKQogewotICAgICAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKIAotCXN3aXRjaCAoc2VsZi0+c3RhdGUpIHsKLQljYXNlIFNUQVJUX1JFQ09SRDoKLQkJLyogc3RhcnQgb2YgcmVjb3JkICovCi0JCWlmIChjID09ICdcMCcpCi0JCQkvKiBlbXB0eSBsaW5lIC0gcmV0dXJuIFtdICovCi0JCQlicmVhazsKLQkJZWxzZSBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykgewotCQkJc2VsZi0+c3RhdGUgPSBFQVRfQ1JOTDsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBoYW5kbGUgYXMgU1RBUlRfRklFTEQgKi8KLQkJc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKLQkJLyogZmFsbHRocnUgKi8KLQljYXNlIFNUQVJUX0ZJRUxEOgotCQkvKiBleHBlY3RpbmcgZmllbGQgKi8KLQkJaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7Ci0JCQkvKiBzYXZlIGVtcHR5IGZpZWxkIC0gcmV0dXJuIFtmaWVsZHNdICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyICYmIAotCQkJIGRpYWxlY3QtPnF1b3RpbmcgIT0gUVVPVEVfTk9ORSkgewotCQkJLyogc3RhcnQgcXVvdGVkIGZpZWxkICovCi0JCQlzZWxmLT5zdGF0ZSA9IElOX1FVT1RFRF9GSUVMRDsKLQkJfQotCQllbHNlIGlmIChjID09IGRpYWxlY3QtPmVzY2FwZWNoYXIpIHsKLQkJCS8qIHBvc3NpYmxlIGVzY2FwZWQgY2hhcmFjdGVyICovCi0JCQlzZWxmLT5zdGF0ZSA9IEVTQ0FQRURfQ0hBUjsKLQkJfQotCQllbHNlIGlmIChjID09ICcgJyAmJiBkaWFsZWN0LT5za2lwaW5pdGlhbHNwYWNlKQotCQkJLyogaWdub3JlIHNwYWNlIGF0IHN0YXJ0IG9mIGZpZWxkICovCi0JCQk7Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7Ci0JCQkvKiBzYXZlIGVtcHR5IGZpZWxkICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgewotCQkJLyogYmVnaW4gbmV3IHVucXVvdGVkIGZpZWxkICovCi0JCQlpZiAoZGlhbGVjdC0+cXVvdGluZyA9PSBRVU9URV9OT05OVU1FUklDKQotCQkJCXNlbGYtPm51bWVyaWNfZmllbGQgPSAxOwotCQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlzZWxmLT5zdGF0ZSA9IElOX0ZJRUxEOwotCQl9Ci0JCWJyZWFrOworICAgIHN3aXRjaCAoc2VsZi0+c3RhdGUpIHsKKyAgICBjYXNlIFNUQVJUX1JFQ09SRDoKKyAgICAgICAgLyogc3RhcnQgb2YgcmVjb3JkICovCisgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICAvKiBlbXB0eSBsaW5lIC0gcmV0dXJuIFtdICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykgeworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBFQVRfQ1JOTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBoYW5kbGUgYXMgU1RBUlRfRklFTEQgKi8KKyAgICAgICAgc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKKyAgICAgICAgLyogZmFsbHRocnUgKi8KKyAgICBjYXNlIFNUQVJUX0ZJRUxEOgorICAgICAgICAvKiBleHBlY3RpbmcgZmllbGQgKi8KKyAgICAgICAgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7CisgICAgICAgICAgICAvKiBzYXZlIGVtcHR5IGZpZWxkIC0gcmV0dXJuIFtmaWVsZHNdICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyICYmCisgICAgICAgICAgICAgICAgIGRpYWxlY3QtPnF1b3RpbmcgIT0gUVVPVEVfTk9ORSkgeworICAgICAgICAgICAgLyogc3RhcnQgcXVvdGVkIGZpZWxkICovCisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IElOX1FVT1RFRF9GSUVMRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09IGRpYWxlY3QtPmVzY2FwZWNoYXIpIHsKKyAgICAgICAgICAgIC8qIHBvc3NpYmxlIGVzY2FwZWQgY2hhcmFjdGVyICovCisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IEVTQ0FQRURfQ0hBUjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09ICcgJyAmJiBkaWFsZWN0LT5za2lwaW5pdGlhbHNwYWNlKQorICAgICAgICAgICAgLyogaWdub3JlIHNwYWNlIGF0IHN0YXJ0IG9mIGZpZWxkICovCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7CisgICAgICAgICAgICAvKiBzYXZlIGVtcHR5IGZpZWxkICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogYmVnaW4gbmV3IHVucXVvdGVkIGZpZWxkICovCisgICAgICAgICAgICBpZiAoZGlhbGVjdC0+cXVvdGluZyA9PSBRVU9URV9OT05OVU1FUklDKQorICAgICAgICAgICAgICAgIHNlbGYtPm51bWVyaWNfZmllbGQgPSAxOworICAgICAgICAgICAgaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IElOX0ZJRUxEOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBFU0NBUEVEX0NIQVI6Ci0JCWlmIChjID09ICdcMCcpCi0JCQljID0gJ1xuJzsKLQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJc2VsZi0+c3RhdGUgPSBJTl9GSUVMRDsKLQkJYnJlYWs7CisgICAgY2FzZSBFU0NBUEVEX0NIQVI6CisgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICBjID0gJ1xuJzsKKyAgICAgICAgaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2VsZi0+c3RhdGUgPSBJTl9GSUVMRDsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIElOX0ZJRUxEOgotCQkvKiBpbiB1bnF1b3RlZCBmaWVsZCAqLwotCQlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcMCcpIHsKLQkJCS8qIGVuZCBvZiBsaW5lIC0gcmV0dXJuIFtmaWVsZHNdICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZXNjYXBlY2hhcikgewotCQkJLyogcG9zc2libGUgZXNjYXBlZCBjaGFyYWN0ZXIgKi8KLQkJCXNlbGYtPnN0YXRlID0gRVNDQVBFRF9DSEFSOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7Ci0JCQkvKiBzYXZlIGZpZWxkIC0gd2FpdCBmb3IgbmV3IGZpZWxkICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKLQkJfQotCQllbHNlIHsKLQkJCS8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBzYXZlIGluIGZpZWxkICovCi0JCQlpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlIElOX0ZJRUxEOgorICAgICAgICAvKiBpbiB1bnF1b3RlZCBmaWVsZCAqLworICAgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcMCcpIHsKKyAgICAgICAgICAgIC8qIGVuZCBvZiBsaW5lIC0gcmV0dXJuIFtmaWVsZHNdICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZXNjYXBlY2hhcikgeworICAgICAgICAgICAgLyogcG9zc2libGUgZXNjYXBlZCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gRVNDQVBFRF9DSEFSOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7CisgICAgICAgICAgICAvKiBzYXZlIGZpZWxkIC0gd2FpdCBmb3IgbmV3IGZpZWxkICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBzYXZlIGluIGZpZWxkICovCisgICAgICAgICAgICBpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotCWNhc2UgSU5fUVVPVEVEX0ZJRUxEOgotCQkvKiBpbiBxdW90ZWQgZmllbGQgKi8KLQkJaWYgKGMgPT0gJ1wwJykKLQkJCTsKLQkJZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5lc2NhcGVjaGFyKSB7Ci0JCQkvKiBQb3NzaWJsZSBlc2NhcGUgY2hhcmFjdGVyICovCi0JCQlzZWxmLT5zdGF0ZSA9IEVTQ0FQRV9JTl9RVU9URURfRklFTEQ7Ci0JCX0KLQkJZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5xdW90ZWNoYXIgJiYKLQkJCSBkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUpIHsKLQkJCWlmIChkaWFsZWN0LT5kb3VibGVxdW90ZSkgewotCQkJCS8qIGRvdWJsZXF1b3RlOyAiIHJlcHJlc2VudGVkIGJ5ICIiICovCi0JCQkJc2VsZi0+c3RhdGUgPSBRVU9URV9JTl9RVU9URURfRklFTEQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBlbmQgb2YgcXVvdGUgcGFydCBvZiBmaWVsZCAqLwotCQkJCXNlbGYtPnN0YXRlID0gSU5fRklFTEQ7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBub3JtYWwgY2hhcmFjdGVyIC0gc2F2ZSBpbiBmaWVsZCAqLwotCQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSBJTl9RVU9URURfRklFTEQ6CisgICAgICAgIC8qIGluIHF1b3RlZCBmaWVsZCAqLworICAgICAgICBpZiAoYyA9PSAnXDAnKQorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChjID09IGRpYWxlY3QtPmVzY2FwZWNoYXIpIHsKKyAgICAgICAgICAgIC8qIFBvc3NpYmxlIGVzY2FwZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gRVNDQVBFX0lOX1FVT1RFRF9GSUVMRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09IGRpYWxlY3QtPnF1b3RlY2hhciAmJgorICAgICAgICAgICAgICAgICBkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUpIHsKKyAgICAgICAgICAgIGlmIChkaWFsZWN0LT5kb3VibGVxdW90ZSkgeworICAgICAgICAgICAgICAgIC8qIGRvdWJsZXF1b3RlOyAiIHJlcHJlc2VudGVkIGJ5ICIiICovCisgICAgICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBRVU9URV9JTl9RVU9URURfRklFTEQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBlbmQgb2YgcXVvdGUgcGFydCBvZiBmaWVsZCAqLworICAgICAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gSU5fRklFTEQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBub3JtYWwgY2hhcmFjdGVyIC0gc2F2ZSBpbiBmaWVsZCAqLworICAgICAgICAgICAgaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEVTQ0FQRV9JTl9RVU9URURfRklFTEQ6Ci0JCWlmIChjID09ICdcMCcpCi0JCQljID0gJ1xuJzsKLQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJc2VsZi0+c3RhdGUgPSBJTl9RVU9URURfRklFTEQ7Ci0JCWJyZWFrOworICAgIGNhc2UgRVNDQVBFX0lOX1FVT1RFRF9GSUVMRDoKKyAgICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIGMgPSAnXG4nOworICAgICAgICBpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzZWxmLT5zdGF0ZSA9IElOX1FVT1RFRF9GSUVMRDsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFFVT1RFX0lOX1FVT1RFRF9GSUVMRDoKLQkJLyogZG91YmxlcXVvdGUgLSBzZWVuIGEgcXVvdGUgaW4gYW4gcXVvdGVkIGZpZWxkICovCi0JCWlmIChkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUgJiYgCi0gICAgICAgICAgICAgICAgICAgIGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyKSB7Ci0JCQkvKiBzYXZlICIiIGFzICIgKi8KLQkJCWlmIChwYXJzZV9hZGRfY2hhcihzZWxmLCBjKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSBJTl9RVU9URURfRklFTEQ7Ci0JCX0KLQkJZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5kZWxpbWl0ZXIpIHsKLQkJCS8qIHNhdmUgZmllbGQgLSB3YWl0IGZvciBuZXcgZmllbGQgKi8KLQkJCWlmIChwYXJzZV9zYXZlX2ZpZWxkKHNlbGYpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlzZWxmLT5zdGF0ZSA9IFNUQVJUX0ZJRUxEOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7Ci0JCQkvKiBlbmQgb2YgbGluZSAtIHJldHVybiBbZmllbGRzXSAqLwotCQkJaWYgKHBhcnNlX3NhdmVfZmllbGQoc2VsZikgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCXNlbGYtPnN0YXRlID0gKGMgPT0gJ1wwJyA/IFNUQVJUX1JFQ09SRCA6IEVBVF9DUk5MKTsKLQkJfQotCQllbHNlIGlmICghZGlhbGVjdC0+c3RyaWN0KSB7Ci0JCQlpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCXNlbGYtPnN0YXRlID0gSU5fRklFTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBpbGxlZ2FsICovCi0JCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAiJyVjJyBleHBlY3RlZCBhZnRlciAnJWMnIiwgCi0JCQkJCWRpYWxlY3QtPmRlbGltaXRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdC0+cXVvdGVjaGFyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlIFFVT1RFX0lOX1FVT1RFRF9GSUVMRDoKKyAgICAgICAgLyogZG91YmxlcXVvdGUgLSBzZWVuIGEgcXVvdGUgaW4gYW4gcXVvdGVkIGZpZWxkICovCisgICAgICAgIGlmIChkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUgJiYKKyAgICAgICAgICAgIGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyKSB7CisgICAgICAgICAgICAvKiBzYXZlICIiIGFzICIgKi8KKyAgICAgICAgICAgIGlmIChwYXJzZV9hZGRfY2hhcihzZWxmLCBjKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBJTl9RVU9URURfRklFTEQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5kZWxpbWl0ZXIpIHsKKyAgICAgICAgICAgIC8qIHNhdmUgZmllbGQgLSB3YWl0IGZvciBuZXcgZmllbGQgKi8KKyAgICAgICAgICAgIGlmIChwYXJzZV9zYXZlX2ZpZWxkKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IFNUQVJUX0ZJRUxEOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7CisgICAgICAgICAgICAvKiBlbmQgb2YgbGluZSAtIHJldHVybiBbZmllbGRzXSAqLworICAgICAgICAgICAgaWYgKHBhcnNlX3NhdmVfZmllbGQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gKGMgPT0gJ1wwJyA/IFNUQVJUX1JFQ09SRCA6IEVBVF9DUk5MKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghZGlhbGVjdC0+c3RyaWN0KSB7CisgICAgICAgICAgICBpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gSU5fRklFTEQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBpbGxlZ2FsICovCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAiJyVjJyBleHBlY3RlZCBhZnRlciAnJWMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0LT5kZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdC0+cXVvdGVjaGFyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotCWNhc2UgRUFUX0NSTkw6Ci0JCWlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKQotCQkJOwotCQllbHNlIGlmIChjID09ICdcMCcpCi0JCQlzZWxmLT5zdGF0ZSA9IFNUQVJUX1JFQ09SRDsKLQkJZWxzZSB7Ci0JCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAibmV3LWxpbmUgY2hhcmFjdGVyIHNlZW4gaW4gdW5xdW90ZWQgZmllbGQgLSBkbyB5b3UgbmVlZCB0byBvcGVuIHRoZSBmaWxlIGluIHVuaXZlcnNhbC1uZXdsaW5lIG1vZGU/Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSBFQVRfQ1JOTDoKKyAgICAgICAgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicpCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gU1RBUlRfUkVDT1JEOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJuZXctbGluZSBjaGFyYWN0ZXIgc2VlbiBpbiB1bnF1b3RlZCBmaWVsZCAtIGRvIHlvdSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgaW4gdW5pdmVyc2FsLW5ld2xpbmUgbW9kZT8iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotCX0KLQlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHBhcnNlX3Jlc2V0KFJlYWRlck9iaiAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPmZpZWxkcyk7Ci0Jc2VsZi0+ZmllbGRzID0gUHlMaXN0X05ldygwKTsKLQlpZiAoc2VsZi0+ZmllbGRzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlzZWxmLT5maWVsZF9sZW4gPSAwOwotCXNlbGYtPnN0YXRlID0gU1RBUlRfUkVDT1JEOwotCXNlbGYtPm51bWVyaWNfZmllbGQgPSAwOwotCXJldHVybiAwOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZmllbGRzKTsKKyAgICBzZWxmLT5maWVsZHMgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChzZWxmLT5maWVsZHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNlbGYtPmZpZWxkX2xlbiA9IDA7CisgICAgc2VsZi0+c3RhdGUgPSBTVEFSVF9SRUNPUkQ7CisgICAgc2VsZi0+bnVtZXJpY19maWVsZCA9IDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBSZWFkZXJfaXRlcm5leHQoUmVhZGVyT2JqICpzZWxmKQogewotICAgICAgICBQeU9iamVjdCAqbGluZW9iajsKLSAgICAgICAgUHlPYmplY3QgKmZpZWxkcyA9IE5VTEw7Ci0gICAgICAgIGNoYXIgKmxpbmUsIGM7Ci0JaW50IGxpbmVsZW47CisgICAgUHlPYmplY3QgKmxpbmVvYmo7CisgICAgUHlPYmplY3QgKmZpZWxkcyA9IE5VTEw7CisgICAgY2hhciAqbGluZSwgYzsKKyAgICBpbnQgbGluZWxlbjsKIAotCWlmIChwYXJzZV9yZXNldChzZWxmKSA8IDApCi0JCXJldHVybiBOVUxMOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgbGluZW9iaiA9IFB5SXRlcl9OZXh0KHNlbGYtPmlucHV0X2l0ZXIpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lb2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpbnB1dCBPUiBleGNlcHRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSAmJiBzZWxmLT5maWVsZF9sZW4gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KGVycm9yX29iaiwKLQkJCQkJICAgICAibmV3bGluZSBpbnNpZGUgc3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0JCSsrc2VsZi0+bGluZV9udW07CisgICAgaWYgKHBhcnNlX3Jlc2V0KHNlbGYpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZG8geworICAgICAgICBsaW5lb2JqID0gUHlJdGVyX05leHQoc2VsZi0+aW5wdXRfaXRlcik7CisgICAgICAgIGlmIChsaW5lb2JqID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIEVuZCBvZiBpbnB1dCBPUiBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSAmJiBzZWxmLT5maWVsZF9sZW4gIT0gMCkKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3bGluZSBpbnNpZGUgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICArK3NlbGYtPmxpbmVfbnVtOwogCi0gICAgICAgICAgICAgICAgbGluZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGxpbmVvYmopOwotCQlsaW5lbGVuID0gUHlTdHJpbmdfU2l6ZShsaW5lb2JqKTsKKyAgICAgICAgbGluZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGxpbmVvYmopOworICAgICAgICBsaW5lbGVuID0gUHlTdHJpbmdfU2l6ZShsaW5lb2JqKTsKIAotICAgICAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwgfHwgbGluZWxlbiA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAobGluZWxlbi0tKSB7Ci0JCQljID0gKmxpbmUrKzsKLQkJCWlmIChjID09ICdcMCcpIHsKLQkJCQlQeV9ERUNSRUYobGluZW9iaik7Ci0JCQkJUHlFcnJfRm9ybWF0KGVycm9yX29iaiwKLQkJCQkJICAgICAibGluZSBjb250YWlucyBOVUxMIGJ5dGUiKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJCWlmIChwYXJzZV9wcm9jZXNzX2NoYXIoc2VsZiwgYykgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGxpbmVvYmopOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9CisgICAgICAgIGlmIChsaW5lID09IE5VTEwgfHwgbGluZWxlbiA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsaW5lbGVuLS0pIHsKKyAgICAgICAgICAgIGMgPSAqbGluZSsrOworICAgICAgICAgICAgaWYgKGMgPT0gJ1wwJykgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKLQkJaWYgKHBhcnNlX3Byb2Nlc3NfY2hhcihzZWxmLCAwKSA8IDApCi0JCQlnb3RvIGVycjsKLSAgICAgICAgfSB3aGlsZSAoc2VsZi0+c3RhdGUgIT0gU1RBUlRfUkVDT1JEKTsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZSBjb250YWlucyBOVUxMIGJ5dGUiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJzZV9wcm9jZXNzX2NoYXIoc2VsZiwgYykgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxpbmVvYmopOworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKKyAgICAgICAgaWYgKHBhcnNlX3Byb2Nlc3NfY2hhcihzZWxmLCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9IHdoaWxlIChzZWxmLT5zdGF0ZSAhPSBTVEFSVF9SRUNPUkQpOwogCi0gICAgICAgIGZpZWxkcyA9IHNlbGYtPmZpZWxkczsKLSAgICAgICAgc2VsZi0+ZmllbGRzID0gTlVMTDsKKyAgICBmaWVsZHMgPSBzZWxmLT5maWVsZHM7CisgICAgc2VsZi0+ZmllbGRzID0gTlVMTDsKIGVycjoKLSAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICByZXR1cm4gZmllbGRzOwogfQogCiBzdGF0aWMgdm9pZAogUmVhZGVyX2RlYWxsb2MoUmVhZGVyT2JqICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZGlhbGVjdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+aW5wdXRfaXRlcik7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZmllbGRzKTsKLSAgICAgICAgaWYgKHNlbGYtPmZpZWxkICE9IE5VTEwpCi0gICAgICAgIAlQeU1lbV9GcmVlKHNlbGYtPmZpZWxkKTsKLQlQeU9iamVjdF9HQ19EZWwoc2VsZik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmRpYWxlY3QpOworICAgIFB5X1hERUNSRUYoc2VsZi0+aW5wdXRfaXRlcik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5maWVsZHMpOworICAgIGlmIChzZWxmLT5maWVsZCAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmZpZWxkKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBpbnQKIFJlYWRlcl90cmF2ZXJzZShSZWFkZXJPYmogKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNlbGYtPmRpYWxlY3QpOwotCVB5X1ZJU0lUKHNlbGYtPmlucHV0X2l0ZXIpOwotCVB5X1ZJU0lUKHNlbGYtPmZpZWxkcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoc2VsZi0+ZGlhbGVjdCk7CisgICAgUHlfVklTSVQoc2VsZi0+aW5wdXRfaXRlcik7CisgICAgUHlfVklTSVQoc2VsZi0+ZmllbGRzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogUmVhZGVyX2NsZWFyKFJlYWRlck9iaiAqc2VsZikKIHsKLQlQeV9DTEVBUihzZWxmLT5kaWFsZWN0KTsKLQlQeV9DTEVBUihzZWxmLT5pbnB1dF9pdGVyKTsKLQlQeV9DTEVBUihzZWxmLT5maWVsZHMpOwotCXJldHVybiAwOworICAgIFB5X0NMRUFSKHNlbGYtPmRpYWxlY3QpOworICAgIFB5X0NMRUFSKHNlbGYtPmlucHV0X2l0ZXIpOworICAgIFB5X0NMRUFSKHNlbGYtPmZpZWxkcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5RG9jX1NUUlZBUihSZWFkZXJfVHlwZV9kb2MsCkBAIC04NjAsOTMgKzg2MCw5MyBAQAogKTsKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBSZWFkZXJfbWV0aG9kc1tdID0gewotCXsgTlVMTCwgTlVMTCB9CisgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAjZGVmaW5lIFJfT0ZGKHgpIG9mZnNldG9mKFJlYWRlck9iaiwgeCkKIAogc3RhdGljIHN0cnVjdCBQeU1lbWJlckRlZiBSZWFkZXJfbWVtYmVybGlzdFtdID0gewotCXsgImRpYWxlY3QiLCBUX09CSkVDVCwgUl9PRkYoZGlhbGVjdCksIFJPIH0sCi0JeyAibGluZV9udW0iLCBUX1VMT05HLCBSX09GRihsaW5lX251bSksIFJPIH0sCi0JeyBOVUxMIH0KKyAgICB7ICJkaWFsZWN0IiwgVF9PQkpFQ1QsIFJfT0ZGKGRpYWxlY3QpLCBSTyB9LAorICAgIHsgImxpbmVfbnVtIiwgVF9VTE9ORywgUl9PRkYobGluZV9udW0pLCBSTyB9LAorICAgIHsgTlVMTCB9CiB9OwogCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUmVhZGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jc3YucmVhZGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFJlYWRlck9iaiksICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKVJlYWRlcl9kZWFsbG9jLCAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgIAkvKnRwX3N0ciovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0gICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfAotCQlQeV9UUEZMQUdTX0hBVkVfR0MsCQkvKnRwX2ZsYWdzKi8KLQlSZWFkZXJfVHlwZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwotICAgICAgICAodHJhdmVyc2Vwcm9jKVJlYWRlcl90cmF2ZXJzZSwgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIChpbnF1aXJ5KVJlYWRlcl9jbGVhciwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIFB5T2JqZWN0X1NlbGZJdGVyLAkJICAgICAgICAvKnRwX2l0ZXIqLwotICAgICAgICAoZ2V0aXRlcmZ1bmMpUmVhZGVyX2l0ZXJuZXh0LCAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCi0gICAgICAgIFJlYWRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICBSZWFkZXJfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2Nzdi5yZWFkZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUmVhZGVyT2JqKSwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpUmVhZGVyX2RlYWxsb2MsICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwKKyAgICAgICAgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgIFJlYWRlcl9UeXBlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgKHRyYXZlcnNlcHJvYylSZWFkZXJfdHJhdmVyc2UsICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIChpbnF1aXJ5KVJlYWRlcl9jbGVhciwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAoZ2V0aXRlcmZ1bmMpUmVhZGVyX2l0ZXJuZXh0LCAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgUmVhZGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgUmVhZGVyX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KIAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl9yZWFkZXIoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprZXl3b3JkX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKiBpdGVyYXRvciwgKiBkaWFsZWN0ID0gTlVMTDsKLSAgICAgICAgUmVhZGVyT2JqICogc2VsZiA9IFB5T2JqZWN0X0dDX05ldyhSZWFkZXJPYmosICZSZWFkZXJfVHlwZSk7CisgICAgUHlPYmplY3QgKiBpdGVyYXRvciwgKiBkaWFsZWN0ID0gTlVMTDsKKyAgICBSZWFkZXJPYmogKiBzZWxmID0gUHlPYmplY3RfR0NfTmV3KFJlYWRlck9iaiwgJlJlYWRlcl9UeXBlKTsKIAotICAgICAgICBpZiAoIXNlbGYpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBzZWxmLT5kaWFsZWN0ID0gTlVMTDsKLSAgICAgICAgc2VsZi0+ZmllbGRzID0gTlVMTDsKLSAgICAgICAgc2VsZi0+aW5wdXRfaXRlciA9IE5VTEw7Ci0Jc2VsZi0+ZmllbGQgPSBOVUxMOwotCXNlbGYtPmZpZWxkX3NpemUgPSAwOwotCXNlbGYtPmxpbmVfbnVtID0gMDsKKyAgICBzZWxmLT5kaWFsZWN0ID0gTlVMTDsKKyAgICBzZWxmLT5maWVsZHMgPSBOVUxMOworICAgIHNlbGYtPmlucHV0X2l0ZXIgPSBOVUxMOworICAgIHNlbGYtPmZpZWxkID0gTlVMTDsKKyAgICBzZWxmLT5maWVsZF9zaXplID0gMDsKKyAgICBzZWxmLT5saW5lX251bSA9IDA7CiAKLQlpZiAocGFyc2VfcmVzZXQoc2VsZikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocGFyc2VfcmVzZXQoc2VsZikgPCAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJml0ZXJhdG9yLCAmZGlhbGVjdCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi0+aW5wdXRfaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmF0b3IpOwotICAgICAgICBpZiAoc2VsZi0+aW5wdXRfaXRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCAxIG11c3QgYmUgYW4gaXRlcmF0b3IiKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQlzZWxmLT5kaWFsZWN0ID0gKERpYWxlY3RPYmogKilfY2FsbF9kaWFsZWN0KGRpYWxlY3QsIGtleXdvcmRfYXJncyk7Ci0gICAgICAgIGlmIChzZWxmLT5kaWFsZWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmaXRlcmF0b3IsICZkaWFsZWN0KSkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5pbnB1dF9pdGVyID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYXRvcik7CisgICAgaWYgKHNlbGYtPmlucHV0X2l0ZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IDEgbXVzdCBiZSBhbiBpdGVyYXRvciIpOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5kaWFsZWN0ID0gKERpYWxlY3RPYmogKilfY2FsbF9kaWFsZWN0KGRpYWxlY3QsIGtleXdvcmRfYXJncyk7CisgICAgaWYgKHNlbGYtPmRpYWxlY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5T2JqZWN0X0dDX1RyYWNrKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogLyoKQEAgLTk1Niw4ICs5NTYsOCBAQAogc3RhdGljIHZvaWQKIGpvaW5fcmVzZXQoV3JpdGVyT2JqICpzZWxmKQogewotCXNlbGYtPnJlY19sZW4gPSAwOwotCXNlbGYtPm51bV9maWVsZHMgPSAwOworICAgIHNlbGYtPnJlY19sZW4gPSAwOworICAgIHNlbGYtPm51bV9maWVsZHMgPSAwOwogfQogCiAjZGVmaW5lIE1FTV9JTkNSIDMyNzY4CkBAIC05NjcsOTAgKzk2Nyw5MCBAQAogICovCiBzdGF0aWMgaW50CiBqb2luX2FwcGVuZF9kYXRhKFdyaXRlck9iaiAqc2VsZiwgY2hhciAqZmllbGQsIGludCBxdW90ZV9lbXB0eSwKLQkJIGludCAqcXVvdGVkLCBpbnQgY29weV9waGFzZSkKKyAgICAgICAgICAgICAgICAgaW50ICpxdW90ZWQsIGludCBjb3B5X3BoYXNlKQogewotICAgICAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKLQlpbnQgaSwgcmVjX2xlbjsKLQljaGFyICpsaW5ldGVybTsKKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKKyAgICBpbnQgaSwgcmVjX2xlbjsKKyAgICBjaGFyICpsaW5ldGVybTsKIAogI2RlZmluZSBBRERDSChjKSBcCi0JZG8ge1wKLQkJaWYgKGNvcHlfcGhhc2UpIFwKLQkJCXNlbGYtPnJlY1tyZWNfbGVuXSA9IGM7XAotCQlyZWNfbGVuKys7XAotCX0gd2hpbGUoMCkKKyAgICBkbyB7XAorICAgICAgICBpZiAoY29weV9waGFzZSkgXAorICAgICAgICAgICAgc2VsZi0+cmVjW3JlY19sZW5dID0gYztcCisgICAgICAgIHJlY19sZW4rKztcCisgICAgfSB3aGlsZSgwKQogCi0JbGluZXRlcm0gPSBQeVN0cmluZ19Bc1N0cmluZyhkaWFsZWN0LT5saW5ldGVybWluYXRvcik7Ci0JaWYgKGxpbmV0ZXJtID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBsaW5ldGVybSA9IFB5U3RyaW5nX0FzU3RyaW5nKGRpYWxlY3QtPmxpbmV0ZXJtaW5hdG9yKTsKKyAgICBpZiAobGluZXRlcm0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmVjX2xlbiA9IHNlbGYtPnJlY19sZW47CisgICAgcmVjX2xlbiA9IHNlbGYtPnJlY19sZW47CiAKLQkvKiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZmllbGQgd2UgbmVlZCBhIGZpZWxkIHNlcGFyYXRvciAqLwotCWlmIChzZWxmLT5udW1fZmllbGRzID4gMCkKLQkJQUREQ0goZGlhbGVjdC0+ZGVsaW1pdGVyKTsKKyAgICAvKiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZmllbGQgd2UgbmVlZCBhIGZpZWxkIHNlcGFyYXRvciAqLworICAgIGlmIChzZWxmLT5udW1fZmllbGRzID4gMCkKKyAgICAgICAgQUREQ0goZGlhbGVjdC0+ZGVsaW1pdGVyKTsKIAotCS8qIEhhbmRsZSBwcmVjZWRpbmcgcXVvdGUgKi8KLQlpZiAoY29weV9waGFzZSAmJiAqcXVvdGVkKQotCQlBRERDSChkaWFsZWN0LT5xdW90ZWNoYXIpOworICAgIC8qIEhhbmRsZSBwcmVjZWRpbmcgcXVvdGUgKi8KKyAgICBpZiAoY29weV9waGFzZSAmJiAqcXVvdGVkKQorICAgICAgICBBRERDSChkaWFsZWN0LT5xdW90ZWNoYXIpOwogCi0JLyogQ29weS9jb3VudCBmaWVsZCBkYXRhICovCi0JZm9yIChpID0gMDs7IGkrKykgewotCQljaGFyIGMgPSBmaWVsZFtpXTsKLQkJaW50IHdhbnRfZXNjYXBlID0gMDsKKyAgICAvKiBDb3B5L2NvdW50IGZpZWxkIGRhdGEgKi8KKyAgICBmb3IgKGkgPSAwOzsgaSsrKSB7CisgICAgICAgIGNoYXIgYyA9IGZpZWxkW2ldOworICAgICAgICBpbnQgd2FudF9lc2NhcGUgPSAwOwogCi0JCWlmIChjID09ICdcMCcpCi0JCQlicmVhazsKKyAgICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWlmIChjID09IGRpYWxlY3QtPmRlbGltaXRlciB8fAotCQkgICAgYyA9PSBkaWFsZWN0LT5lc2NhcGVjaGFyIHx8Ci0JCSAgICBjID09IGRpYWxlY3QtPnF1b3RlY2hhciB8fAotCQkgICAgc3RyY2hyKGxpbmV0ZXJtLCBjKSkgewotCQkJaWYgKGRpYWxlY3QtPnF1b3RpbmcgPT0gUVVPVEVfTk9ORSkKLQkJCQl3YW50X2VzY2FwZSA9IDE7Ci0JCQllbHNlIHsKLQkJCQlpZiAoYyA9PSBkaWFsZWN0LT5xdW90ZWNoYXIpIHsKLQkJCQkJaWYgKGRpYWxlY3QtPmRvdWJsZXF1b3RlKQotCQkJCQkJQUREQ0goZGlhbGVjdC0+cXVvdGVjaGFyKTsKLQkJCQkJZWxzZQotCQkJCQkJd2FudF9lc2NhcGUgPSAxOwotCQkJCX0KLQkJCQlpZiAoIXdhbnRfZXNjYXBlKQotCQkJCQkqcXVvdGVkID0gMTsKLQkJCX0KLQkJCWlmICh3YW50X2VzY2FwZSkgewotCQkJCWlmICghZGlhbGVjdC0+ZXNjYXBlY2hhcikgewotCQkJCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAKLQkJCQkJCSAgICAgIm5lZWQgdG8gZXNjYXBlLCBidXQgbm8gZXNjYXBlY2hhciBzZXQiKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlBRERDSChkaWFsZWN0LT5lc2NhcGVjaGFyKTsKLQkJCX0KLQkJfQotCQkvKiBDb3B5IGZpZWxkIGNoYXJhY3RlciBpbnRvIHJlY29yZCBidWZmZXIuCi0JCSAqLwotCQlBRERDSChjKTsKLQl9CisgICAgICAgIGlmIChjID09IGRpYWxlY3QtPmRlbGltaXRlciB8fAorICAgICAgICAgICAgYyA9PSBkaWFsZWN0LT5lc2NhcGVjaGFyIHx8CisgICAgICAgICAgICBjID09IGRpYWxlY3QtPnF1b3RlY2hhciB8fAorICAgICAgICAgICAgc3RyY2hyKGxpbmV0ZXJtLCBjKSkgeworICAgICAgICAgICAgaWYgKGRpYWxlY3QtPnF1b3RpbmcgPT0gUVVPVEVfTk9ORSkKKyAgICAgICAgICAgICAgICB3YW50X2VzY2FwZSA9IDE7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBkaWFsZWN0LT5xdW90ZWNoYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxlY3QtPmRvdWJsZXF1b3RlKQorICAgICAgICAgICAgICAgICAgICAgICAgQUREQ0goZGlhbGVjdC0+cXVvdGVjaGFyKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgd2FudF9lc2NhcGUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXdhbnRfZXNjYXBlKQorICAgICAgICAgICAgICAgICAgICAqcXVvdGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3YW50X2VzY2FwZSkgeworICAgICAgICAgICAgICAgIGlmICghZGlhbGVjdC0+ZXNjYXBlY2hhcikgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWQgdG8gZXNjYXBlLCBidXQgbm8gZXNjYXBlY2hhciBzZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBRERDSChkaWFsZWN0LT5lc2NhcGVjaGFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBDb3B5IGZpZWxkIGNoYXJhY3RlciBpbnRvIHJlY29yZCBidWZmZXIuCisgICAgICAgICAqLworICAgICAgICBBRERDSChjKTsKKyAgICB9CiAKLQkvKiBJZiBmaWVsZCBpcyBlbXB0eSBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSBxdW90ZWQuCi0JICovCi0JaWYgKGkgPT0gMCAmJiBxdW90ZV9lbXB0eSkgewotCQlpZiAoZGlhbGVjdC0+cXVvdGluZyA9PSBRVU9URV9OT05FKSB7Ci0JCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaW5nbGUgZW1wdHkgZmllbGQgcmVjb3JkIG11c3QgYmUgcXVvdGVkIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQotCQkJKnF1b3RlZCA9IDE7Ci0JfQorICAgIC8qIElmIGZpZWxkIGlzIGVtcHR5IGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIHF1b3RlZC4KKyAgICAgKi8KKyAgICBpZiAoaSA9PSAwICYmIHF1b3RlX2VtcHR5KSB7CisgICAgICAgIGlmIChkaWFsZWN0LT5xdW90aW5nID09IFFVT1RFX05PTkUpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZSBlbXB0eSBmaWVsZCByZWNvcmQgbXVzdCBiZSBxdW90ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqcXVvdGVkID0gMTsKKyAgICB9CiAKLQlpZiAoKnF1b3RlZCkgewotCQlpZiAoY29weV9waGFzZSkKLQkJCUFERENIKGRpYWxlY3QtPnF1b3RlY2hhcik7Ci0JCWVsc2UKLQkJCXJlY19sZW4gKz0gMjsKLQl9Ci0JcmV0dXJuIHJlY19sZW47CisgICAgaWYgKCpxdW90ZWQpIHsKKyAgICAgICAgaWYgKGNvcHlfcGhhc2UpCisgICAgICAgICAgICBBRERDSChkaWFsZWN0LT5xdW90ZWNoYXIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZWNfbGVuICs9IDI7CisgICAgfQorICAgIHJldHVybiByZWNfbGVuOwogI3VuZGVmIEFERENICiB9CiAKQEAgLTEwNTgsNzQgKzEwNTgsNzQgQEAKIGpvaW5fY2hlY2tfcmVjX3NpemUoV3JpdGVyT2JqICpzZWxmLCBpbnQgcmVjX2xlbikKIHsKIAotCWlmIChyZWNfbGVuIDwgMCB8fCByZWNfbGVuID4gSU5UX01BWCAtIE1FTV9JTkNSKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAocmVjX2xlbiA8IDAgfHwgcmVjX2xlbiA+IElOVF9NQVggLSBNRU1fSU5DUikgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAocmVjX2xlbiA+IHNlbGYtPnJlY19zaXplKSB7Ci0JCWlmIChzZWxmLT5yZWNfc2l6ZSA9PSAwKSB7Ci0JCQlzZWxmLT5yZWNfc2l6ZSA9IChyZWNfbGVuIC8gTUVNX0lOQ1IgKyAxKSAqIE1FTV9JTkNSOwotCQkJaWYgKHNlbGYtPnJlYyAhPSBOVUxMKQotCQkJCVB5TWVtX0ZyZWUoc2VsZi0+cmVjKTsKLQkJCXNlbGYtPnJlYyA9IFB5TWVtX01hbGxvYyhzZWxmLT5yZWNfc2l6ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFyICpvbGRfcmVjID0gc2VsZi0+cmVjOworICAgIGlmIChyZWNfbGVuID4gc2VsZi0+cmVjX3NpemUpIHsKKyAgICAgICAgaWYgKHNlbGYtPnJlY19zaXplID09IDApIHsKKyAgICAgICAgICAgIHNlbGYtPnJlY19zaXplID0gKHJlY19sZW4gLyBNRU1fSU5DUiArIDEpICogTUVNX0lOQ1I7CisgICAgICAgICAgICBpZiAoc2VsZi0+cmVjICE9IE5VTEwpCisgICAgICAgICAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5yZWMpOworICAgICAgICAgICAgc2VsZi0+cmVjID0gUHlNZW1fTWFsbG9jKHNlbGYtPnJlY19zaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKm9sZF9yZWMgPSBzZWxmLT5yZWM7CiAKLQkJCXNlbGYtPnJlY19zaXplID0gKHJlY19sZW4gLyBNRU1fSU5DUiArIDEpICogTUVNX0lOQ1I7Ci0JCQlzZWxmLT5yZWMgPSBQeU1lbV9SZWFsbG9jKHNlbGYtPnJlYywgc2VsZi0+cmVjX3NpemUpOwotCQkJaWYgKHNlbGYtPnJlYyA9PSBOVUxMKQotCQkJCVB5TWVtX0ZyZWUob2xkX3JlYyk7Ci0JCX0KLQkJaWYgKHNlbGYtPnJlYyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgICAgICAgICBzZWxmLT5yZWNfc2l6ZSA9IChyZWNfbGVuIC8gTUVNX0lOQ1IgKyAxKSAqIE1FTV9JTkNSOworICAgICAgICAgICAgc2VsZi0+cmVjID0gUHlNZW1fUmVhbGxvYyhzZWxmLT5yZWMsIHNlbGYtPnJlY19zaXplKTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5yZWMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKG9sZF9yZWMpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWxmLT5yZWMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBqb2luX2FwcGVuZChXcml0ZXJPYmogKnNlbGYsIGNoYXIgKmZpZWxkLCBpbnQgKnF1b3RlZCwgaW50IHF1b3RlX2VtcHR5KQogewotCWludCByZWNfbGVuOworICAgIGludCByZWNfbGVuOwogCi0JcmVjX2xlbiA9IGpvaW5fYXBwZW5kX2RhdGEoc2VsZiwgZmllbGQsIHF1b3RlX2VtcHR5LCBxdW90ZWQsIDApOwotCWlmIChyZWNfbGVuIDwgMCkKLQkJcmV0dXJuIDA7CisgICAgcmVjX2xlbiA9IGpvaW5fYXBwZW5kX2RhdGEoc2VsZiwgZmllbGQsIHF1b3RlX2VtcHR5LCBxdW90ZWQsIDApOworICAgIGlmIChyZWNfbGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBncm93IHJlY29yZCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCFqb2luX2NoZWNrX3JlY19zaXplKHNlbGYsIHJlY19sZW4pKQotCQlyZXR1cm4gMDsKKyAgICAvKiBncm93IHJlY29yZCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKCFqb2luX2NoZWNrX3JlY19zaXplKHNlbGYsIHJlY19sZW4pKQorICAgICAgICByZXR1cm4gMDsKIAotCXNlbGYtPnJlY19sZW4gPSBqb2luX2FwcGVuZF9kYXRhKHNlbGYsIGZpZWxkLCBxdW90ZV9lbXB0eSwgcXVvdGVkLCAxKTsKLQlzZWxmLT5udW1fZmllbGRzKys7CisgICAgc2VsZi0+cmVjX2xlbiA9IGpvaW5fYXBwZW5kX2RhdGEoc2VsZiwgZmllbGQsIHF1b3RlX2VtcHR5LCBxdW90ZWQsIDEpOworICAgIHNlbGYtPm51bV9maWVsZHMrKzsKIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBqb2luX2FwcGVuZF9saW5ldGVybWluYXRvcihXcml0ZXJPYmogKnNlbGYpCiB7Ci0JaW50IHRlcm1pbmF0b3JfbGVuOwotCWNoYXIgKnRlcm1pbmF0b3I7CisgICAgaW50IHRlcm1pbmF0b3JfbGVuOworICAgIGNoYXIgKnRlcm1pbmF0b3I7CiAKLQl0ZXJtaW5hdG9yX2xlbiA9IFB5U3RyaW5nX1NpemUoc2VsZi0+ZGlhbGVjdC0+bGluZXRlcm1pbmF0b3IpOwotCWlmICh0ZXJtaW5hdG9yX2xlbiA9PSAtMSkKLQkJcmV0dXJuIDA7CisgICAgdGVybWluYXRvcl9sZW4gPSBQeVN0cmluZ19TaXplKHNlbGYtPmRpYWxlY3QtPmxpbmV0ZXJtaW5hdG9yKTsKKyAgICBpZiAodGVybWluYXRvcl9sZW4gPT0gLTEpCisgICAgICAgIHJldHVybiAwOwogCi0JLyogZ3JvdyByZWNvcmQgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwotCWlmICgham9pbl9jaGVja19yZWNfc2l6ZShzZWxmLCBzZWxmLT5yZWNfbGVuICsgdGVybWluYXRvcl9sZW4pKQotCQlyZXR1cm4gMDsKKyAgICAvKiBncm93IHJlY29yZCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKCFqb2luX2NoZWNrX3JlY19zaXplKHNlbGYsIHNlbGYtPnJlY19sZW4gKyB0ZXJtaW5hdG9yX2xlbikpCisgICAgICAgIHJldHVybiAwOwogCi0JdGVybWluYXRvciA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmRpYWxlY3QtPmxpbmV0ZXJtaW5hdG9yKTsgCi0JaWYgKHRlcm1pbmF0b3IgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JbWVtbW92ZShzZWxmLT5yZWMgKyBzZWxmLT5yZWNfbGVuLCB0ZXJtaW5hdG9yLCB0ZXJtaW5hdG9yX2xlbik7Ci0Jc2VsZi0+cmVjX2xlbiArPSB0ZXJtaW5hdG9yX2xlbjsKKyAgICB0ZXJtaW5hdG9yID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+ZGlhbGVjdC0+bGluZXRlcm1pbmF0b3IpOworICAgIGlmICh0ZXJtaW5hdG9yID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIG1lbW1vdmUoc2VsZi0+cmVjICsgc2VsZi0+cmVjX2xlbiwgdGVybWluYXRvciwgdGVybWluYXRvcl9sZW4pOworICAgIHNlbGYtPnJlY19sZW4gKz0gdGVybWluYXRvcl9sZW47CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogUHlEb2NfU1RSVkFSKGNzdl93cml0ZXJvd19kb2MsCkBAIC0xMTM3LDczICsxMTM3LDczIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY3N2X3dyaXRlcm93KFdyaXRlck9iaiAqc2VsZiwgUHlPYmplY3QgKnNlcSkKIHsKLSAgICAgICAgRGlhbGVjdE9iaiAqZGlhbGVjdCA9IHNlbGYtPmRpYWxlY3Q7Ci0JaW50IGxlbiwgaTsKKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKKyAgICBpbnQgbGVuLCBpOwogCi0JaWYgKCFQeVNlcXVlbmNlX0NoZWNrKHNlcSkpCi0JCXJldHVybiBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAic2VxdWVuY2UgZXhwZWN0ZWQiKTsKKyAgICBpZiAoIVB5U2VxdWVuY2VfQ2hlY2soc2VxKSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJzZXF1ZW5jZSBleHBlY3RlZCIpOwogCi0JbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgoc2VxKTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgoc2VxKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBKb2luIGFsbCBmaWVsZHMgaW4gaW50ZXJuYWwgYnVmZmVyLgotCSAqLwotCWpvaW5fcmVzZXQoc2VsZik7Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpmaWVsZDsKLQkJaW50IGFwcGVuZF9vazsKLQkJaW50IHF1b3RlZDsKKyAgICAvKiBKb2luIGFsbCBmaWVsZHMgaW4gaW50ZXJuYWwgYnVmZmVyLgorICAgICAqLworICAgIGpvaW5fcmVzZXQoc2VsZik7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpmaWVsZDsKKyAgICAgICAgaW50IGFwcGVuZF9vazsKKyAgICAgICAgaW50IHF1b3RlZDsKIAotCQlmaWVsZCA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZXEsIGkpOwotCQlpZiAoZmllbGQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBmaWVsZCA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZXEsIGkpOworICAgICAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXN3aXRjaCAoZGlhbGVjdC0+cXVvdGluZykgewotCQljYXNlIFFVT1RFX05PTk5VTUVSSUM6Ci0JCQlxdW90ZWQgPSAhUHlOdW1iZXJfQ2hlY2soZmllbGQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUVVPVEVfQUxMOgotCQkJcXVvdGVkID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcXVvdGVkID0gMDsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIHN3aXRjaCAoZGlhbGVjdC0+cXVvdGluZykgeworICAgICAgICBjYXNlIFFVT1RFX05PTk5VTUVSSUM6CisgICAgICAgICAgICBxdW90ZWQgPSAhUHlOdW1iZXJfQ2hlY2soZmllbGQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUVVPVEVfQUxMOgorICAgICAgICAgICAgcXVvdGVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcXVvdGVkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGZpZWxkKSkgewotCQkJYXBwZW5kX29rID0gam9pbl9hcHBlbmQoc2VsZiwKLQkJCQkJCVB5U3RyaW5nX0FTX1NUUklORyhmaWVsZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdGVkLCBsZW4gPT0gMSk7Ci0JCQlQeV9ERUNSRUYoZmllbGQpOwotCQl9Ci0JCWVsc2UgaWYgKGZpZWxkID09IFB5X05vbmUpIHsKLQkJCWFwcGVuZF9vayA9IGpvaW5fYXBwZW5kKHNlbGYsICIiLCAmcXVvdGVkLCBsZW4gPT0gMSk7Ci0JCQlQeV9ERUNSRUYoZmllbGQpOwotCQl9Ci0JCWVsc2UgewotCQkJUHlPYmplY3QgKnN0cjsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGZpZWxkKSkgeworICAgICAgICAgICAgYXBwZW5kX29rID0gam9pbl9hcHBlbmQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdGVkLCBsZW4gPT0gMSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGZpZWxkID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGFwcGVuZF9vayA9IGpvaW5fYXBwZW5kKHNlbGYsICIiLCAmcXVvdGVkLCBsZW4gPT0gMSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKnN0cjsKIAotCQkJc3RyID0gUHlPYmplY3RfU3RyKGZpZWxkKTsKLQkJCVB5X0RFQ1JFRihmaWVsZCk7Ci0JCQlpZiAoc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBzdHIgPSBQeU9iamVjdF9TdHIoZmllbGQpOworICAgICAgICAgICAgUHlfREVDUkVGKGZpZWxkKTsKKyAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQkJYXBwZW5kX29rID0gam9pbl9hcHBlbmQoc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ciksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1b3RlZCwgbGVuID09IDEpOwotCQkJUHlfREVDUkVGKHN0cik7Ci0JCX0KLQkJaWYgKCFhcHBlbmRfb2spCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICBhcHBlbmRfb2sgPSBqb2luX2FwcGVuZChzZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdW90ZWQsIGxlbiA9PSAxKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICB9CisgICAgICAgIGlmICghYXBwZW5kX29rKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQWRkIGxpbmUgdGVybWluYXRvci4KLQkgKi8KLQlpZiAoIWpvaW5fYXBwZW5kX2xpbmV0ZXJtaW5hdG9yKHNlbGYpKQotCQlyZXR1cm4gMDsKKyAgICAvKiBBZGQgbGluZSB0ZXJtaW5hdG9yLgorICAgICAqLworICAgIGlmICgham9pbl9hcHBlbmRfbGluZXRlcm1pbmF0b3Ioc2VsZikpCisgICAgICAgIHJldHVybiAwOwogCi0JcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT53cml0ZWxpbmUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIocyMpIiwgc2VsZi0+cmVjLCBzZWxmLT5yZWNfbGVuKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPndyaXRlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIocyMpIiwgc2VsZi0+cmVjLCBzZWxmLT5yZWNfbGVuKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNzdl93cml0ZXJvd3NfZG9jLApAQCAtMTIxNSw3MiArMTIxNSw3MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl93cml0ZXJvd3MoV3JpdGVyT2JqICpzZWxmLCBQeU9iamVjdCAqc2Vxc2VxKQogewotICAgICAgICBQeU9iamVjdCAqcm93X2l0ZXIsICpyb3dfb2JqLCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyb3dfaXRlciwgKnJvd19vYmosICpyZXN1bHQ7CiAKLSAgICAgICAgcm93X2l0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcXNlcSk7Ci0gICAgICAgIGlmIChyb3dfaXRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlcm93cygpIGFyZ3VtZW50IG11c3QgYmUgaXRlcmFibGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByb3dfaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2Vxc2VxKTsKKyAgICBpZiAocm93X2l0ZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlcm93cygpIGFyZ3VtZW50IG11c3QgYmUgaXRlcmFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdoaWxlICgocm93X29iaiA9IFB5SXRlcl9OZXh0KHJvd19pdGVyKSkpIHsKKyAgICAgICAgcmVzdWx0ID0gY3N2X3dyaXRlcm93KHNlbGYsIHJvd19vYmopOworICAgICAgICBQeV9ERUNSRUYocm93X29iaik7CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocm93X2l0ZXIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChyb3dfb2JqID0gUHlJdGVyX05leHQocm93X2l0ZXIpKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNzdl93cml0ZXJvdyhzZWxmLCByb3dfb2JqKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocm93X29iaik7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyb3dfaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7ICAgCi0gICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHJvd19pdGVyKTsKLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJvd19pdGVyKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIFdyaXRlcl9tZXRob2RzW10gPSB7Ci0gICAgICAgIHsgIndyaXRlcm93IiwgKFB5Q0Z1bmN0aW9uKWNzdl93cml0ZXJvdywgTUVUSF9PLCBjc3Zfd3JpdGVyb3dfZG9jfSwKLSAgICAgICAgeyAid3JpdGVyb3dzIiwgKFB5Q0Z1bmN0aW9uKWNzdl93cml0ZXJvd3MsIE1FVEhfTywgY3N2X3dyaXRlcm93c19kb2N9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAid3JpdGVyb3ciLCAoUHlDRnVuY3Rpb24pY3N2X3dyaXRlcm93LCBNRVRIX08sIGNzdl93cml0ZXJvd19kb2N9LAorICAgIHsgIndyaXRlcm93cyIsIChQeUNGdW5jdGlvbiljc3Zfd3JpdGVyb3dzLCBNRVRIX08sIGNzdl93cml0ZXJvd3NfZG9jfSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogI2RlZmluZSBXX09GRih4KSBvZmZzZXRvZihXcml0ZXJPYmosIHgpCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZW1iZXJEZWYgV3JpdGVyX21lbWJlcmxpc3RbXSA9IHsKLQl7ICJkaWFsZWN0IiwgVF9PQkpFQ1QsIFdfT0ZGKGRpYWxlY3QpLCBSTyB9LAotCXsgTlVMTCB9CisgICAgeyAiZGlhbGVjdCIsIFRfT0JKRUNULCBXX09GRihkaWFsZWN0KSwgUk8gfSwKKyAgICB7IE5VTEwgfQogfTsKIAogc3RhdGljIHZvaWQKIFdyaXRlcl9kZWFsbG9jKFdyaXRlck9iaiAqc2VsZikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOwotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmRpYWxlY3QpOwotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPndyaXRlbGluZSk7Ci0JaWYgKHNlbGYtPnJlYyAhPSBOVUxMKQotCQlQeU1lbV9GcmVlKHNlbGYtPnJlYyk7Ci0JUHlPYmplY3RfR0NfRGVsKHNlbGYpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kaWFsZWN0KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPndyaXRlbGluZSk7CisgICAgaWYgKHNlbGYtPnJlYyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPnJlYyk7CisgICAgUHlPYmplY3RfR0NfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBXcml0ZXJfdHJhdmVyc2UoV3JpdGVyT2JqICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChzZWxmLT5kaWFsZWN0KTsKLQlQeV9WSVNJVChzZWxmLT53cml0ZWxpbmUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNlbGYtPmRpYWxlY3QpOworICAgIFB5X1ZJU0lUKHNlbGYtPndyaXRlbGluZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFdyaXRlcl9jbGVhcihXcml0ZXJPYmogKnNlbGYpCiB7Ci0JUHlfQ0xFQVIoc2VsZi0+ZGlhbGVjdCk7Ci0JUHlfQ0xFQVIoc2VsZi0+d3JpdGVsaW5lKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihzZWxmLT5kaWFsZWN0KTsKKyAgICBQeV9DTEVBUihzZWxmLT53cml0ZWxpbmUpOworICAgIHJldHVybiAwOwogfQogCi1QeURvY19TVFJWQVIoV3JpdGVyX1R5cGVfZG9jLCAKK1B5RG9jX1NUUlZBUihXcml0ZXJfVHlwZV9kb2MsCiAiQ1NWIHdyaXRlclxuIgogIlxuIgogIldyaXRlciBvYmplY3RzIGFyZSByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0YWJ1bGFyIGRhdGFcbiIKQEAgLTEyODgsNzUgKzEyODgsNzUgQEAKICk7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgV3JpdGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jc3Yud3JpdGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFdyaXRlck9iaiksICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKVdyaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwKLQkJUHlfVFBGTEFHU19IQVZFX0dDLAkJLyp0cF9mbGFncyovCi0JV3JpdGVyX1R5cGVfZG9jLAotICAgICAgICAodHJhdmVyc2Vwcm9jKVdyaXRlcl90cmF2ZXJzZSwgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIChpbnF1aXJ5KVdyaXRlcl9jbGVhciwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIChnZXRpdGVyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwotICAgICAgICAoZ2V0aXRlcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCi0gICAgICAgIFdyaXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICBXcml0ZXJfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2Nzdi53cml0ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoV3JpdGVyT2JqKSwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpV3JpdGVyX2RlYWxsb2MsICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfAorICAgICAgICBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgV3JpdGVyX1R5cGVfZG9jLAorICAgICh0cmF2ZXJzZXByb2MpV3JpdGVyX3RyYXZlcnNlLCAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAoaW5xdWlyeSlXcml0ZXJfY2xlYXIsICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAoZ2V0aXRlcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAoZ2V0aXRlcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgV3JpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgV3JpdGVyX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjc3Zfd3JpdGVyKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa2V5d29yZF9hcmdzKQogewotCVB5T2JqZWN0ICogb3V0cHV0X2ZpbGUsICogZGlhbGVjdCA9IE5VTEw7Ci0gICAgICAgIFdyaXRlck9iaiAqIHNlbGYgPSBQeU9iamVjdF9HQ19OZXcoV3JpdGVyT2JqLCAmV3JpdGVyX1R5cGUpOworICAgIFB5T2JqZWN0ICogb3V0cHV0X2ZpbGUsICogZGlhbGVjdCA9IE5VTEw7CisgICAgV3JpdGVyT2JqICogc2VsZiA9IFB5T2JqZWN0X0dDX05ldyhXcml0ZXJPYmosICZXcml0ZXJfVHlwZSk7CiAKLSAgICAgICAgaWYgKCFzZWxmKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghc2VsZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgc2VsZi0+ZGlhbGVjdCA9IE5VTEw7Ci0gICAgICAgIHNlbGYtPndyaXRlbGluZSA9IE5VTEw7CisgICAgc2VsZi0+ZGlhbGVjdCA9IE5VTEw7CisgICAgc2VsZi0+d3JpdGVsaW5lID0gTlVMTDsKIAotCXNlbGYtPnJlYyA9IE5VTEw7Ci0Jc2VsZi0+cmVjX3NpemUgPSAwOwotCXNlbGYtPnJlY19sZW4gPSAwOwotCXNlbGYtPm51bV9maWVsZHMgPSAwOworICAgIHNlbGYtPnJlYyA9IE5VTEw7CisgICAgc2VsZi0+cmVjX3NpemUgPSAwOworICAgIHNlbGYtPnJlY19sZW4gPSAwOworICAgIHNlbGYtPm51bV9maWVsZHMgPSAwOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJm91dHB1dF9maWxlLCAmZGlhbGVjdCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi0+d3JpdGVsaW5lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvdXRwdXRfZmlsZSwgIndyaXRlIik7Ci0gICAgICAgIGlmIChzZWxmLT53cml0ZWxpbmUgPT0gTlVMTCB8fCAhUHlDYWxsYWJsZV9DaGVjayhzZWxmLT53cml0ZWxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IDEgbXVzdCBoYXZlIGEgXCJ3cml0ZVwiIG1ldGhvZCIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCXNlbGYtPmRpYWxlY3QgPSAoRGlhbGVjdE9iaiAqKV9jYWxsX2RpYWxlY3QoZGlhbGVjdCwga2V5d29yZF9hcmdzKTsKLSAgICAgICAgaWYgKHNlbGYtPmRpYWxlY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCVB5T2JqZWN0X0dDX1RyYWNrKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmb3V0cHV0X2ZpbGUsICZkaWFsZWN0KSkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT53cml0ZWxpbmUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG91dHB1dF9maWxlLCAid3JpdGUiKTsKKyAgICBpZiAoc2VsZi0+d3JpdGVsaW5lID09IE5VTEwgfHwgIVB5Q2FsbGFibGVfQ2hlY2soc2VsZi0+d3JpdGVsaW5lKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IDEgbXVzdCBoYXZlIGEgXCJ3cml0ZVwiIG1ldGhvZCIpOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5kaWFsZWN0ID0gKERpYWxlY3RPYmogKilfY2FsbF9kaWFsZWN0KGRpYWxlY3QsIGtleXdvcmRfYXJncyk7CisgICAgaWYgKHNlbGYtPmRpYWxlY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogLyoKQEAgLTEzNjUsNjYgKzEzNjUsNjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjc3ZfbGlzdF9kaWFsZWN0cyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgcmV0dXJuIFB5RGljdF9LZXlzKGRpYWxlY3RzKTsKKyAgICByZXR1cm4gUHlEaWN0X0tleXMoZGlhbGVjdHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY3N2X3JlZ2lzdGVyX2RpYWxlY3QoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JUHlPYmplY3QgKm5hbWVfb2JqLCAqZGlhbGVjdF9vYmogPSBOVUxMOwotCVB5T2JqZWN0ICpkaWFsZWN0OworICAgIFB5T2JqZWN0ICpuYW1lX29iaiwgKmRpYWxlY3Rfb2JqID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGlhbGVjdDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDIsICZuYW1lX29iaiwgJmRpYWxlY3Rfb2JqKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKCFJU19CQVNFU1RSSU5HKG5hbWVfb2JqKSkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlhbGVjdCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgdW5pY29kZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0JZGlhbGVjdCA9IF9jYWxsX2RpYWxlY3QoZGlhbGVjdF9vYmosIGt3YXJncyk7Ci0JaWYgKGRpYWxlY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5RGljdF9TZXRJdGVtKGRpYWxlY3RzLCBuYW1lX29iaiwgZGlhbGVjdCkgPCAwKSB7Ci0JCVB5X0RFQ1JFRihkaWFsZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCVB5X0RFQ1JFRihkaWFsZWN0KTsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmbmFtZV9vYmosICZkaWFsZWN0X29iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghSVNfQkFTRVNUUklORyhuYW1lX29iaikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaWFsZWN0IG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciB1bmljb2RlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaWFsZWN0ID0gX2NhbGxfZGlhbGVjdChkaWFsZWN0X29iaiwga3dhcmdzKTsKKyAgICBpZiAoZGlhbGVjdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZGlhbGVjdHMsIG5hbWVfb2JqLCBkaWFsZWN0KSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGRpYWxlY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKGRpYWxlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl91bnJlZ2lzdGVyX2RpYWxlY3QoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKm5hbWVfb2JqKQogewotICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oZGlhbGVjdHMsIG5hbWVfb2JqKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJ1bmtub3duIGRpYWxlY3QiKTsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oZGlhbGVjdHMsIG5hbWVfb2JqKSA8IDApCisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAidW5rbm93biBkaWFsZWN0Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY3N2X2dldF9kaWFsZWN0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpuYW1lX29iaikKIHsKLSAgICAgICAgcmV0dXJuIGdldF9kaWFsZWN0X2Zyb21fcmVnaXN0cnkobmFtZV9vYmopOworICAgIHJldHVybiBnZXRfZGlhbGVjdF9mcm9tX3JlZ2lzdHJ5KG5hbWVfb2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl9maWVsZF9zaXplX2xpbWl0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpuZXdfbGltaXQgPSBOVUxMOwotCWxvbmcgb2xkX2xpbWl0ID0gZmllbGRfbGltaXQ7CisgICAgUHlPYmplY3QgKm5ld19saW1pdCA9IE5VTEw7CisgICAgbG9uZyBvbGRfbGltaXQgPSBmaWVsZF9saW1pdDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZpZWxkX3NpemVfbGltaXQiLCAwLCAxLCAmbmV3X2xpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG5ld19saW1pdCAhPSBOVUxMKSB7Ci0JCWlmICghUHlJbnRfQ2hlY2sobmV3X2xpbWl0KSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJICAgICAibGltaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmaWVsZF9saW1pdCA9IFB5SW50X0FzTG9uZyhuZXdfbGltaXQpOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcob2xkX2xpbWl0KTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJmaWVsZF9zaXplX2xpbWl0IiwgMCwgMSwgJm5ld19saW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuZXdfbGltaXQgIT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKG5ld19saW1pdCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImxpbWl0IG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZmllbGRfbGltaXQgPSBQeUludF9Bc0xvbmcobmV3X2xpbWl0KTsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9sZF9saW1pdCk7CiB9CiAKIC8qCkBAIC0xNTQyLDcwICsxNTQyLDcwIEBACiAidGhlIG9sZCBsaW1pdCBpcyByZXR1cm5lZCIpOwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGNzdl9tZXRob2RzW10gPSB7Ci0JeyAicmVhZGVyIiwgKFB5Q0Z1bmN0aW9uKWNzdl9yZWFkZXIsIAotCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjc3ZfcmVhZGVyX2RvY30sCi0JeyAid3JpdGVyIiwgKFB5Q0Z1bmN0aW9uKWNzdl93cml0ZXIsIAotCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjc3Zfd3JpdGVyX2RvY30sCi0JeyAibGlzdF9kaWFsZWN0cyIsIChQeUNGdW5jdGlvbiljc3ZfbGlzdF9kaWFsZWN0cywgCi0JCU1FVEhfTk9BUkdTLCBjc3ZfbGlzdF9kaWFsZWN0c19kb2N9LAotCXsgInJlZ2lzdGVyX2RpYWxlY3QiLCAoUHlDRnVuY3Rpb24pY3N2X3JlZ2lzdGVyX2RpYWxlY3QsIAotCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjc3ZfcmVnaXN0ZXJfZGlhbGVjdF9kb2N9LAotCXsgInVucmVnaXN0ZXJfZGlhbGVjdCIsIChQeUNGdW5jdGlvbiljc3ZfdW5yZWdpc3Rlcl9kaWFsZWN0LCAKLQkJTUVUSF9PLCBjc3ZfdW5yZWdpc3Rlcl9kaWFsZWN0X2RvY30sCi0JeyAiZ2V0X2RpYWxlY3QiLCAoUHlDRnVuY3Rpb24pY3N2X2dldF9kaWFsZWN0LCAKLQkJTUVUSF9PLCBjc3ZfZ2V0X2RpYWxlY3RfZG9jfSwKLQl7ICJmaWVsZF9zaXplX2xpbWl0IiwgKFB5Q0Z1bmN0aW9uKWNzdl9maWVsZF9zaXplX2xpbWl0LCAKLQkJTUVUSF9WQVJBUkdTLCBjc3ZfZmllbGRfc2l6ZV9saW1pdF9kb2N9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAicmVhZGVyIiwgKFB5Q0Z1bmN0aW9uKWNzdl9yZWFkZXIsCisgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGNzdl9yZWFkZXJfZG9jfSwKKyAgICB7ICJ3cml0ZXIiLCAoUHlDRnVuY3Rpb24pY3N2X3dyaXRlciwKKyAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgY3N2X3dyaXRlcl9kb2N9LAorICAgIHsgImxpc3RfZGlhbGVjdHMiLCAoUHlDRnVuY3Rpb24pY3N2X2xpc3RfZGlhbGVjdHMsCisgICAgICAgIE1FVEhfTk9BUkdTLCBjc3ZfbGlzdF9kaWFsZWN0c19kb2N9LAorICAgIHsgInJlZ2lzdGVyX2RpYWxlY3QiLCAoUHlDRnVuY3Rpb24pY3N2X3JlZ2lzdGVyX2RpYWxlY3QsCisgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGNzdl9yZWdpc3Rlcl9kaWFsZWN0X2RvY30sCisgICAgeyAidW5yZWdpc3Rlcl9kaWFsZWN0IiwgKFB5Q0Z1bmN0aW9uKWNzdl91bnJlZ2lzdGVyX2RpYWxlY3QsCisgICAgICAgIE1FVEhfTywgY3N2X3VucmVnaXN0ZXJfZGlhbGVjdF9kb2N9LAorICAgIHsgImdldF9kaWFsZWN0IiwgKFB5Q0Z1bmN0aW9uKWNzdl9nZXRfZGlhbGVjdCwKKyAgICAgICAgTUVUSF9PLCBjc3ZfZ2V0X2RpYWxlY3RfZG9jfSwKKyAgICB7ICJmaWVsZF9zaXplX2xpbWl0IiwgKFB5Q0Z1bmN0aW9uKWNzdl9maWVsZF9zaXplX2xpbWl0LAorICAgICAgICBNRVRIX1ZBUkFSR1MsIGNzdl9maWVsZF9zaXplX2xpbWl0X2RvY30sCisgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X2Nzdih2b2lkKQogewotCVB5T2JqZWN0ICptb2R1bGU7Ci0JU3R5bGVEZXNjICpzdHlsZTsKKyAgICBQeU9iamVjdCAqbW9kdWxlOworICAgIFN0eWxlRGVzYyAqc3R5bGU7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZEaWFsZWN0X1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkRpYWxlY3RfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZSZWFkZXJfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUmVhZGVyX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmV3JpdGVyX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJldyaXRlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW1vZHVsZSA9IFB5X0luaXRNb2R1bGUzKCJfY3N2IiwgY3N2X21ldGhvZHMsIGNzdl9tb2R1bGVfZG9jKTsKLQlpZiAobW9kdWxlID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtb2R1bGUgPSBQeV9Jbml0TW9kdWxlMygiX2NzdiIsIGNzdl9tZXRob2RzLCBjc3ZfbW9kdWxlX2RvYyk7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgdmVyc2lvbiB0byB0aGUgbW9kdWxlLiAqLwotCWlmIChQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtb2R1bGUsICJfX3ZlcnNpb25fXyIsCi0JCQkJICAgICAgIE1PRFVMRV9WRVJTSU9OKSA9PSAtMSkKLQkJcmV0dXJuOworICAgIC8qIEFkZCB2ZXJzaW9uIHRvIHRoZSBtb2R1bGUuICovCisgICAgaWYgKFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG1vZHVsZSwgIl9fdmVyc2lvbl9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX1ZFUlNJT04pID09IC0xKQorICAgICAgICByZXR1cm47CiAKLSAgICAgICAgLyogQWRkIF9kaWFsZWN0cyBkaWN0aW9uYXJ5ICovCi0gICAgICAgIGRpYWxlY3RzID0gUHlEaWN0X05ldygpOwotICAgICAgICBpZiAoZGlhbGVjdHMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiX2RpYWxlY3RzIiwgZGlhbGVjdHMpKQotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAvKiBBZGQgX2RpYWxlY3RzIGRpY3Rpb25hcnkgKi8KKyAgICBkaWFsZWN0cyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoZGlhbGVjdHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiX2RpYWxlY3RzIiwgZGlhbGVjdHMpKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgcXVvdGUgc3R5bGVzIGludG8gZGljdGlvbmFyeSAqLwotCWZvciAoc3R5bGUgPSBxdW90ZV9zdHlsZXM7IHN0eWxlLT5uYW1lOyBzdHlsZSsrKSB7Ci0JCWlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsIHN0eWxlLT5uYW1lLAotCQkJCQkgICAgc3R5bGUtPnN0eWxlKSA9PSAtMSkKLQkJCXJldHVybjsKLQl9CisgICAgLyogQWRkIHF1b3RlIHN0eWxlcyBpbnRvIGRpY3Rpb25hcnkgKi8KKyAgICBmb3IgKHN0eWxlID0gcXVvdGVfc3R5bGVzOyBzdHlsZS0+bmFtZTsgc3R5bGUrKykgeworICAgICAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCBzdHlsZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLT5zdHlsZSkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgICAgIC8qIEFkZCB0aGUgRGlhbGVjdCB0eXBlICovCi0JUHlfSU5DUkVGKCZEaWFsZWN0X1R5cGUpOwotICAgICAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkRpYWxlY3QiLCAoUHlPYmplY3QgKikmRGlhbGVjdF9UeXBlKSkKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgLyogQWRkIHRoZSBEaWFsZWN0IHR5cGUgKi8KKyAgICBQeV9JTkNSRUYoJkRpYWxlY3RfVHlwZSk7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJEaWFsZWN0IiwgKFB5T2JqZWN0ICopJkRpYWxlY3RfVHlwZSkpCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCB0aGUgQ1NWIGV4Y2VwdGlvbiBvYmplY3QgdG8gdGhlIG1vZHVsZS4gKi8KLQllcnJvcl9vYmogPSBQeUVycl9OZXdFeGNlcHRpb24oIl9jc3YuRXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlpZiAoZXJyb3Jfb2JqID09IE5VTEwpCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiRXJyb3IiLCBlcnJvcl9vYmopOworICAgIC8qIEFkZCB0aGUgQ1NWIGV4Y2VwdGlvbiBvYmplY3QgdG8gdGhlIG1vZHVsZS4gKi8KKyAgICBlcnJvcl9vYmogPSBQeUVycl9OZXdFeGNlcHRpb24oIl9jc3YuRXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyb3Jfb2JqID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiRXJyb3IiLCBlcnJvcl9vYmopOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKaW5kZXggNDY1ZWNkYi4uYWYzYmI1YiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCkBAIC0yNSwyMCArMjUsMjAgQEAKIAogLyoKIAotTmFtZQkJCW1ldGhvZHMsIG1lbWJlcnMsIGdldHNldHMKK05hbWUgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMsIG1lbWJlcnMsIGdldHNldHMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1QeUNTdHJ1Y3RUeXBlX1R5cGUJCV9fbmV3X18oKSwgZnJvbV9hZGRyZXNzKCksIF9fbXVsX18oKSwgZnJvbV9wYXJhbSgpCi1VbmlvblR5cGVfVHlwZQkJX19uZXdfXygpLCBmcm9tX2FkZHJlc3MoKSwgX19tdWxfXygpLCBmcm9tX3BhcmFtKCkKLVB5Q1BvaW50ZXJUeXBlX1R5cGUJX19uZXdfXygpLCBmcm9tX2FkZHJlc3MoKSwgX19tdWxfXygpLCBmcm9tX3BhcmFtKCksIHNldF90eXBlKCkKLVB5Q0FycmF5VHlwZV9UeXBlCQlfX25ld19fKCksIGZyb21fYWRkcmVzcygpLCBfX211bF9fKCksIGZyb21fcGFyYW0oKQotUHlDU2ltcGxlVHlwZV9UeXBlCQlfX25ld19fKCksIGZyb21fYWRkcmVzcygpLCBfX211bF9fKCksIGZyb21fcGFyYW0oKQorUHlDU3RydWN0VHlwZV9UeXBlICAgICAgICAgICAgICBfX25ld19fKCksIGZyb21fYWRkcmVzcygpLCBfX211bF9fKCksIGZyb21fcGFyYW0oKQorVW5pb25UeXBlX1R5cGUgICAgICAgICAgX19uZXdfXygpLCBmcm9tX2FkZHJlc3MoKSwgX19tdWxfXygpLCBmcm9tX3BhcmFtKCkKK1B5Q1BvaW50ZXJUeXBlX1R5cGUgICAgIF9fbmV3X18oKSwgZnJvbV9hZGRyZXNzKCksIF9fbXVsX18oKSwgZnJvbV9wYXJhbSgpLCBzZXRfdHlwZSgpCitQeUNBcnJheVR5cGVfVHlwZSAgICAgICAgICAgICAgIF9fbmV3X18oKSwgZnJvbV9hZGRyZXNzKCksIF9fbXVsX18oKSwgZnJvbV9wYXJhbSgpCitQeUNTaW1wbGVUeXBlX1R5cGUgICAgICAgICAgICAgIF9fbmV3X18oKSwgZnJvbV9hZGRyZXNzKCksIF9fbXVsX18oKSwgZnJvbV9wYXJhbSgpCiAKIFB5Q0RhdGFfVHlwZQotICBTdHJ1Y3RfVHlwZQkJX19uZXdfXygpLCBfX2luaXRfXygpCi0gIFB5Q1BvaW50ZXJfVHlwZQkJX19uZXdfXygpLCBfX2luaXRfXygpLCBfYXNfcGFyYW1ldGVyXywgY29udGVudHMKLSAgUHlDQXJyYXlfVHlwZQkJX19uZXdfXygpLCBfX2luaXRfXygpLCBfYXNfcGFyYW1ldGVyXywgX19nZXQvc2V0aXRlbV9fKCksIF9fbGVuX18oKQotICBTaW1wbGVfVHlwZQkJX19uZXdfXygpLCBfX2luaXRfXygpLCBfYXNfcGFyYW1ldGVyXworICBTdHJ1Y3RfVHlwZSAgICAgICAgICAgX19uZXdfXygpLCBfX2luaXRfXygpCisgIFB5Q1BvaW50ZXJfVHlwZSAgICAgICAgICAgICAgIF9fbmV3X18oKSwgX19pbml0X18oKSwgX2FzX3BhcmFtZXRlcl8sIGNvbnRlbnRzCisgIFB5Q0FycmF5X1R5cGUgICAgICAgICBfX25ld19fKCksIF9faW5pdF9fKCksIF9hc19wYXJhbWV0ZXJfLCBfX2dldC9zZXRpdGVtX18oKSwgX19sZW5fXygpCisgIFNpbXBsZV9UeXBlICAgICAgICAgICBfX25ld19fKCksIF9faW5pdF9fKCksIF9hc19wYXJhbWV0ZXJfCiAKIFB5Q0ZpZWxkX1R5cGUKIFB5Q1N0Z0RpY3RfVHlwZQpAQCAtNTAsMjggKzUwLDI4IEBACiAKIEl0IGhhcyBzb21lIHNpbWlsYXJpdHkgdG8gdGhlIGJ5cmVmKCkgY29uc3RydWN0IGNvbXBhcmVkIHRvIHBvaW50ZXIoKQogZnJvbV9hZGRyZXNzKGFkZHIpCi0JLSBjb25zdHJ1Y3QgYW4gaW5zdGFuY2UgZnJvbSBhIGdpdmVuIG1lbW9yeSBibG9jayAoc2hhcmluZyB0aGlzIG1lbW9yeSBibG9jaykKKyAgICAtIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBmcm9tIGEgZ2l2ZW4gbWVtb3J5IGJsb2NrIChzaGFyaW5nIHRoaXMgbWVtb3J5IGJsb2NrKQogCiBmcm9tX3BhcmFtKG9iaikKLQktIHR5cGVjaGVjayBhbmQgY29udmVydCBhIFB5dGhvbiBvYmplY3QgaW50byBhIEMgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIKLQkgIHRoZSByZXN1bHQgbWF5IGJlIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlLCBvciBhbiBpbnRlZ2VyIG9yIHR1cGxlCi0JICAodHlwZWNvZGUsIHZhbHVlWywgb2JqXSkKKyAgICAtIHR5cGVjaGVjayBhbmQgY29udmVydCBhIFB5dGhvbiBvYmplY3QgaW50byBhIEMgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIKKyAgICAgIHRoZSByZXN1bHQgbWF5IGJlIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlLCBvciBhbiBpbnRlZ2VyIG9yIHR1cGxlCisgICAgICAodHlwZWNvZGUsIHZhbHVlWywgb2JqXSkKIAogaW5zdGFuY2UgbWV0aG9kcy9wcm9wZXJ0aWVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogX2FzX3BhcmFtZXRlcl8KLQktIGNvbnZlcnQgc2VsZiBpbnRvIGEgQyBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlcgotCSAgVGhpcyBpcyBlaXRoZXIgYW4gaW50ZWdlciwgb3IgYSAzLXR1cGxlICh0eXBlY29kZSwgdmFsdWUsIG9iaikKKyAgICAtIGNvbnZlcnQgc2VsZiBpbnRvIGEgQyBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlcgorICAgICAgVGhpcyBpcyBlaXRoZXIgYW4gaW50ZWdlciwgb3IgYSAzLXR1cGxlICh0eXBlY29kZSwgdmFsdWUsIG9iaikKIAogZnVuY3Rpb25zCiAtLS0tLS0tLS0KIAogc2l6ZW9mKGNkYXRhKQotCS0gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIGJ1ZmZlciBjb250YWlucworICAgIC0gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIGJ1ZmZlciBjb250YWlucwogCiBzaXplb2YoY3R5cGUpCi0JLSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGUgYnVmZmVyIG9mIGFuIGluc3RhbmNlIHdvdWxkIGNvbnRhaW4KKyAgICAtIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBidWZmZXIgb2YgYW4gaW5zdGFuY2Ugd291bGQgY29udGFpbgogCiBieXJlZihjZGF0YSkKIApAQCAtODIsNyArODIsNyBAQAogUE9JTlRFUihjdHlwZSkKIAogYnl0ZXMoY2RhdGEpCi0JLSByZXR1cm4gdGhlIGJ1ZmZlciBjb250ZW50cyBhcyBhIHNlcXVlbmNlIG9mIGJ5dGVzICh3aGljaCBpcyBjdXJyZW50bHkgYSBzdHJpbmcpCisgICAgLSByZXR1cm4gdGhlIGJ1ZmZlciBjb250ZW50cyBhcyBhIHNlcXVlbmNlIG9mIGJ5dGVzICh3aGljaCBpcyBjdXJyZW50bHkgYSBzdHJpbmcpCiAKICovCiAKQEAgLTEwMyw3ICsxMDMsNyBAQAogICogUHlDRmllbGRfVHlwZQogICoKICAqLwotDAorCiAjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KIAogI2luY2x1ZGUgIlB5dGhvbi5oIgpAQCAtMTQwLDcgKzE0MCw3IEBACiBjaGFyICpfY3R5cGVzX2NvbnZlcnNpb25fZW5jb2RpbmcgPSBOVUxMOwogY2hhciAqX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycyA9IE5VTEw7CiAKLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDQwMDAwKQpAQCAtMTQ4LDE0OCArMTQ4LDE0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5VHVwbGVfUGFjayhpbnQgbiwgLi4uKQogewotCWludCBpOwotCVB5T2JqZWN0ICpvOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKippdGVtczsKLQl2YV9saXN0IHZhcmdzOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICpvOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKippdGVtczsKKyAgICB2YV9saXN0IHZhcmdzOwogCi0JdmFfc3RhcnQodmFyZ3MsIG4pOwotCXJlc3VsdCA9IFB5VHVwbGVfTmV3KG4pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXRlbXMgPSAoKFB5VHVwbGVPYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJbyA9IHZhX2FyZyh2YXJncywgUHlPYmplY3QgKik7Ci0JCVB5X0lOQ1JFRihvKTsKLQkJaXRlbXNbaV0gPSBvOwotCX0KLQl2YV9lbmQodmFyZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgdmFfc3RhcnQodmFyZ3MsIG4pOworICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KG4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXRlbXMgPSAoKFB5VHVwbGVPYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgbyA9IHZhX2FyZyh2YXJncywgUHlPYmplY3QgKik7CisgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgaXRlbXNbaV0gPSBvOworICAgIH0KKyAgICB2YV9lbmQodmFyZ3MpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmtleTsKLQlQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmtleTsKKyAgICBQeU9iamVjdCAqZGljdDsKIH0gRGljdFJlbW92ZXJPYmplY3Q7CiAKIHN0YXRpYyB2b2lkCiBfRGljdFJlbW92ZXJfZGVhbGxvYyhQeU9iamVjdCAqX3NlbGYpCiB7Ci0JRGljdFJlbW92ZXJPYmplY3QgKnNlbGYgPSAoRGljdFJlbW92ZXJPYmplY3QgKilfc2VsZjsKLQlQeV9YREVDUkVGKHNlbGYtPmtleSk7Ci0JUHlfWERFQ1JFRihzZWxmLT5kaWN0KTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKF9zZWxmKTsKKyAgICBEaWN0UmVtb3Zlck9iamVjdCAqc2VsZiA9IChEaWN0UmVtb3Zlck9iamVjdCAqKV9zZWxmOworICAgIFB5X1hERUNSRUYoc2VsZi0+a2V5KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmRpY3QpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoX3NlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogX0RpY3RSZW1vdmVyX2NhbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCURpY3RSZW1vdmVyT2JqZWN0ICpzZWxmID0gKERpY3RSZW1vdmVyT2JqZWN0ICopX3NlbGY7Ci0JaWYgKHNlbGYtPmtleSAmJiBzZWxmLT5kaWN0KSB7Ci0JCWlmICgtMSA9PSBQeURpY3RfRGVsSXRlbShzZWxmLT5kaWN0LCBzZWxmLT5rZXkpKQotCQkJLyogWFhYIEVycm9yIGNvbnRleHQgKi8KLQkJCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShQeV9Ob25lKTsKLQkJUHlfREVDUkVGKHNlbGYtPmtleSk7Ci0JCXNlbGYtPmtleSA9IE5VTEw7Ci0JCVB5X0RFQ1JFRihzZWxmLT5kaWN0KTsKLQkJc2VsZi0+ZGljdCA9IE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBEaWN0UmVtb3Zlck9iamVjdCAqc2VsZiA9IChEaWN0UmVtb3Zlck9iamVjdCAqKV9zZWxmOworICAgIGlmIChzZWxmLT5rZXkgJiYgc2VsZi0+ZGljdCkgeworICAgICAgICBpZiAoLTEgPT0gUHlEaWN0X0RlbEl0ZW0oc2VsZi0+ZGljdCwgc2VsZi0+a2V5KSkKKyAgICAgICAgICAgIC8qIFhYWCBFcnJvciBjb250ZXh0ICovCisgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoUHlfTm9uZSk7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5rZXkpOworICAgICAgICBzZWxmLT5rZXkgPSBOVUxMOworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+ZGljdCk7CisgICAgICAgIHNlbGYtPmRpY3QgPSBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgRGljdFJlbW92ZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5EaWN0UmVtb3ZlciIsCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihEaWN0UmVtb3Zlck9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQlfRGljdFJlbW92ZXJfZGVhbGxvYywJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkgICAgICAgCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQlfRGljdFJlbW92ZXJfY2FsbCwJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5EaWN0UmVtb3ZlciIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoRGljdFJlbW92ZXJPYmplY3QpLCAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICBfRGljdFJlbW92ZXJfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgX0RpY3RSZW1vdmVyX2NhbGwsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAvKiBYWFggc2hvdWxkIHBhcnRpY2lwYXRlIGluIEdDPyAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotCSJkZWxldGVzIGEga2V5IGZyb20gYSBkaWN0aW9uYXJ5IiwJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgImRlbGV0ZXMgYSBrZXkgZnJvbSBhIGRpY3Rpb25hcnkiLCAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogaW50CiBQeURpY3RfU2V0SXRlbVByb3h5KFB5T2JqZWN0ICpkaWN0LCBQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqaXRlbSkKIHsKLQlQeU9iamVjdCAqb2JqOwotCURpY3RSZW1vdmVyT2JqZWN0ICpyZW1vdmVyOwotCVB5T2JqZWN0ICpwcm94eTsKLQlpbnQgcmVzdWx0OworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgRGljdFJlbW92ZXJPYmplY3QgKnJlbW92ZXI7CisgICAgUHlPYmplY3QgKnByb3h5OworICAgIGludCByZXN1bHQ7CiAKLQlvYmogPSBQeU9iamVjdF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKSZEaWN0UmVtb3Zlcl9UeXBlLCBOVUxMKTsKLQlpZiAob2JqID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBvYmogPSBQeU9iamVjdF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKSZEaWN0UmVtb3Zlcl9UeXBlLCBOVUxMKTsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXJlbW92ZXIgPSAoRGljdFJlbW92ZXJPYmplY3QgKilvYmo7Ci0JYXNzZXJ0KHJlbW92ZXItPmtleSA9PSBOVUxMKTsKLQlhc3NlcnQocmVtb3Zlci0+ZGljdCA9PSBOVUxMKTsKLQlQeV9JTkNSRUYoa2V5KTsKLQlyZW1vdmVyLT5rZXkgPSBrZXk7Ci0JUHlfSU5DUkVGKGRpY3QpOwotCXJlbW92ZXItPmRpY3QgPSBkaWN0OworICAgIHJlbW92ZXIgPSAoRGljdFJlbW92ZXJPYmplY3QgKilvYmo7CisgICAgYXNzZXJ0KHJlbW92ZXItPmtleSA9PSBOVUxMKTsKKyAgICBhc3NlcnQocmVtb3Zlci0+ZGljdCA9PSBOVUxMKTsKKyAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICByZW1vdmVyLT5rZXkgPSBrZXk7CisgICAgUHlfSU5DUkVGKGRpY3QpOworICAgIHJlbW92ZXItPmRpY3QgPSBkaWN0OwogCi0JcHJveHkgPSBQeVdlYWtyZWZfTmV3UHJveHkoaXRlbSwgb2JqKTsKLQlQeV9ERUNSRUYob2JqKTsKLQlpZiAocHJveHkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIHByb3h5ID0gUHlXZWFrcmVmX05ld1Byb3h5KGl0ZW0sIG9iaik7CisgICAgUHlfREVDUkVGKG9iaik7CisgICAgaWYgKHByb3h5ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXJlc3VsdCA9IFB5RGljdF9TZXRJdGVtKGRpY3QsIGtleSwgcHJveHkpOwotCVB5X0RFQ1JFRihwcm94eSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBQeURpY3RfU2V0SXRlbShkaWN0LCBrZXksIHByb3h5KTsKKyAgICBQeV9ERUNSRUYocHJveHkpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RGljdF9HZXRJdGVtUHJveHkoUHlPYmplY3QgKmRpY3QsIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqaXRlbSA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIGtleSk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqaXRlbSA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIGtleSk7CiAKLQlpZiAoaXRlbSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5V2Vha3JlZl9DaGVja1Byb3h5KGl0ZW0pKQotCQlyZXR1cm4gaXRlbTsKLQlyZXN1bHQgPSBQeVdlYWtyZWZfR0VUX09CSkVDVChpdGVtKTsKLQlpZiAocmVzdWx0ID09IFB5X05vbmUpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVdlYWtyZWZfQ2hlY2tQcm94eShpdGVtKSkKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgcmVzdWx0ID0gUHlXZWFrcmVmX0dFVF9PQkpFQ1QoaXRlbSk7CisgICAgaWYgKHJlc3VsdCA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzAyLDI1ICszMDIsMjUgQEAKIGNoYXIgKgogX2N0eXBlc19hbGxvY19mb3JtYXRfc3RyaW5nKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqc3VmZml4KQogewotCXNpemVfdCBsZW47Ci0JY2hhciAqcmVzdWx0OworICAgIHNpemVfdCBsZW47CisgICAgY2hhciAqcmVzdWx0OwogCi0JaWYgKHN1ZmZpeCA9PSBOVUxMKSB7Ci0JCWFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWxlbiA9IHN0cmxlbihzdWZmaXgpOwotCWlmIChwcmVmaXgpCi0JCWxlbiArPSBzdHJsZW4ocHJlZml4KTsKLQlyZXN1bHQgPSBQeU1lbV9NYWxsb2MobGVuICsgMSk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocHJlZml4KQotCQlzdHJjcHkocmVzdWx0LCBwcmVmaXgpOwotCWVsc2UKLQkJcmVzdWx0WzBdID0gJ1wwJzsKLQlzdHJjYXQocmVzdWx0LCBzdWZmaXgpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHN1ZmZpeCA9PSBOVUxMKSB7CisgICAgICAgIGFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGxlbiA9IHN0cmxlbihzdWZmaXgpOworICAgIGlmIChwcmVmaXgpCisgICAgICAgIGxlbiArPSBzdHJsZW4ocHJlZml4KTsKKyAgICByZXN1bHQgPSBQeU1lbV9NYWxsb2MobGVuICsgMSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocHJlZml4KQorICAgICAgICBzdHJjcHkocmVzdWx0LCBwcmVmaXgpOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0WzBdID0gJ1wwJzsKKyAgICBzdHJjYXQocmVzdWx0LCBzdWZmaXgpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qCkBAIC0zMzMsMTAwICszMzMsMTAwIEBACiBzdGF0aWMgUHlDQXJnT2JqZWN0ICoKIFN0cnVjdFVuaW9uVHlwZV9wYXJhbWZ1bmMoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JUHlDQXJnT2JqZWN0ICpwYXJnOwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7Ci0JCi0JcGFyZyA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKLQlpZiAocGFyZyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAotCXBhcmctPnRhZyA9ICdWJzsKLQlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBzdHJ1Y3R1cmUvdW5pb24gaW5zdGFuY2VzICovCi0JcGFyZy0+cGZmaV90eXBlID0gJnN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXI7Ci0JLyogRm9yIHN0cnVjdHVyZSBwYXJhbWV0ZXJzIChieSB2YWx1ZSksIHBhcmctPnZhbHVlIGRvZXNuJ3QgY29udGFpbiB0aGUgc3RydWN0dXJlCi0JICAgZGF0YSBpdHNlbGYsIGluc3RlYWQgcGFyZy0+dmFsdWUucCAqcG9pbnRzKiB0byB0aGUgc3RydWN0dXJlJ3MgZGF0YQotCSAgIFNlZSBhbHNvIF9jdHlwZXMuYywgZnVuY3Rpb24gX2NhbGxfZnVuY3Rpb25fcG9pbnRlcigpLgotCSovCi0JcGFyZy0+dmFsdWUucCA9IHNlbGYtPmJfcHRyOwotCXBhcmctPnNpemUgPSBzZWxmLT5iX3NpemU7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXBhcmctPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7Ci0JcmV0dXJuIHBhcmc7CQorICAgIHBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7CisgICAgaWYgKHBhcmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBwYXJnLT50YWcgPSAnVic7CisgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3Igc3RydWN0dXJlL3VuaW9uIGluc3RhbmNlcyAqLworICAgIHBhcmctPnBmZmlfdHlwZSA9ICZzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyOworICAgIC8qIEZvciBzdHJ1Y3R1cmUgcGFyYW1ldGVycyAoYnkgdmFsdWUpLCBwYXJnLT52YWx1ZSBkb2Vzbid0IGNvbnRhaW4gdGhlIHN0cnVjdHVyZQorICAgICAgIGRhdGEgaXRzZWxmLCBpbnN0ZWFkIHBhcmctPnZhbHVlLnAgKnBvaW50cyogdG8gdGhlIHN0cnVjdHVyZSdzIGRhdGEKKyAgICAgICBTZWUgYWxzbyBfY3R5cGVzLmMsIGZ1bmN0aW9uIF9jYWxsX2Z1bmN0aW9uX3BvaW50ZXIoKS4KKyAgICAqLworICAgIHBhcmctPnZhbHVlLnAgPSBzZWxmLT5iX3B0cjsKKyAgICBwYXJnLT5zaXplID0gc2VsZi0+Yl9zaXplOworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICBwYXJnLT5vYmogPSAoUHlPYmplY3QgKilzZWxmOworICAgIHJldHVybiBwYXJnOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogU3RydWN0VW5pb25UeXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcywgaW50IGlzU3RydWN0KQogewotCVB5VHlwZU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICpmaWVsZHM7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBQeVR5cGVPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqZmllbGRzOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CiAKLQkvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKLQkgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCi0JcmVzdWx0ID0gKFB5VHlwZU9iamVjdCAqKVB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAoIXJlc3VsdCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCisgICAgICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLworICAgIHJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyoga2VlcCB0aGlzIGZvciBidyBjb21wYXRpYmlsaXR5ICovCi0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHJlc3VsdC0+dHBfZGljdCwgIl9hYnN0cmFjdF8iKSkKLQkJcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICAvKiBrZWVwIHRoaXMgZm9yIGJ3IGNvbXBhdGliaWxpdHkgKi8KKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcocmVzdWx0LT50cF9kaWN0LCAiX2Fic3RyYWN0XyIpKQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogCi0JZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmUHlDU3RnRGljdF9UeXBlLCBOVUxMKTsKLQlpZiAoIWRpY3QpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiByZXBsYWNlIHRoZSBjbGFzcyBkaWN0IGJ5IG91ciB1cGRhdGVkIHN0Z2RpY3QsIHdoaWNoIGhvbGRzIGluZm8KLQkgICBhYm91dCBzdG9yYWdlIHJlcXVpcmVtZW50cyBvZiB0aGUgaW5zdGFuY2VzICovCi0JaWYgKC0xID09IFB5RGljdF9VcGRhdGUoKFB5T2JqZWN0ICopZGljdCwgcmVzdWx0LT50cF9kaWN0KSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKWRpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfREVDUkVGKHJlc3VsdC0+dHBfZGljdCk7Ci0JcmVzdWx0LT50cF9kaWN0ID0gKFB5T2JqZWN0ICopZGljdDsKLQlkaWN0LT5mb3JtYXQgPSBfY3R5cGVzX2FsbG9jX2Zvcm1hdF9zdHJpbmcoTlVMTCwgIkIiKTsKLQlpZiAoZGljdC0+Zm9ybWF0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBkaWN0ID0gKFN0Z0RpY3RPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKSZQeUNTdGdEaWN0X1R5cGUsIE5VTEwpOworICAgIGlmICghZGljdCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIHJlcGxhY2UgdGhlIGNsYXNzIGRpY3QgYnkgb3VyIHVwZGF0ZWQgc3RnZGljdCwgd2hpY2ggaG9sZHMgaW5mbworICAgICAgIGFib3V0IHN0b3JhZ2UgcmVxdWlyZW1lbnRzIG9mIHRoZSBpbnN0YW5jZXMgKi8KKyAgICBpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKKyAgICByZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilkaWN0OworICAgIGRpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiQiIpOworICAgIGlmIChkaWN0LT5mb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZGljdC0+cGFyYW1mdW5jID0gU3RydWN0VW5pb25UeXBlX3BhcmFtZnVuYzsKKyAgICBkaWN0LT5wYXJhbWZ1bmMgPSBTdHJ1Y3RVbmlvblR5cGVfcGFyYW1mdW5jOwogCi0JZmllbGRzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopZGljdCwgIl9maWVsZHNfIik7Ci0JaWYgKCFmaWVsZHMpIHsKLQkJU3RnRGljdE9iamVjdCAqYmFzZWRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKilyZXN1bHQtPnRwX2Jhc2UpOworICAgIGZpZWxkcyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKWRpY3QsICJfZmllbGRzXyIpOworICAgIGlmICghZmllbGRzKSB7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmJhc2VkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopcmVzdWx0LT50cF9iYXNlKTsKIAotCQlpZiAoYmFzZWRpY3QgPT0gTlVMTCkKLQkJCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7Ci0JCS8qIGNvcHkgYmFzZSBkaWN0ICovCi0JCWlmICgtMSA9PSBQeUNTdGdEaWN0X2Nsb25lKGRpY3QsIGJhc2VkaWN0KSkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlkaWN0LT5mbGFncyAmPSB+RElDVEZMQUdfRklOQUw7IC8qIGNsZWFyIHRoZSAnZmluYWwnIGZsYWcgaW4gdGhlIHN1YmNsYXNzIGRpY3QgKi8KLQkJYmFzZWRpY3QtPmZsYWdzIHw9IERJQ1RGTEFHX0ZJTkFMOyAvKiBzZXQgdGhlICdmaW5hbCcgZmxhZyBpbiB0aGUgYmFzZWNsYXNzIGRpY3QgKi8KLQkJcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKLQl9CisgICAgICAgIGlmIChiYXNlZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICAgICAgLyogY29weSBiYXNlIGRpY3QgKi8KKyAgICAgICAgaWYgKC0xID09IFB5Q1N0Z0RpY3RfY2xvbmUoZGljdCwgYmFzZWRpY3QpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGRpY3QtPmZsYWdzICY9IH5ESUNURkxBR19GSU5BTDsgLyogY2xlYXIgdGhlICdmaW5hbCcgZmxhZyBpbiB0aGUgc3ViY2xhc3MgZGljdCAqLworICAgICAgICBiYXNlZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7IC8qIHNldCB0aGUgJ2ZpbmFsJyBmbGFnIGluIHRoZSBiYXNlY2xhc3MgZGljdCAqLworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIH0KIAotCWlmICgtMSA9PSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXJlc3VsdCwgIl9maWVsZHNfIiwgZmllbGRzKSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgaWYgKC0xID09IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX2ZpZWxkc18iLCBmaWVsZHMpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q1N0cnVjdFR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiBTdHJ1Y3RVbmlvblR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMsIDEpOworICAgIHJldHVybiBTdHJ1Y3RVbmlvblR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVW5pb25UeXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gU3RydWN0VW5pb25UeXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzLCAwKTsKKyAgICByZXR1cm4gU3RydWN0VW5pb25UeXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzLCAwKTsKIH0KIAogc3RhdGljIGNoYXIgZnJvbV9hZGRyZXNzX2RvY1tdID0KQEAgLTQzNSwxNiArNDM1LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFUeXBlX2Zyb21fYWRkcmVzcyhQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlKQogewotCXZvaWQgKmJ1ZjsKLQlpZiAoIVB5SW50X0NoZWNrKHZhbHVlKSAmJiAhUHlMb25nX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpbnRlZ2VyIGV4cGVjdGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlidWYgPSAodm9pZCAqKVB5TG9uZ19Bc1ZvaWRQdHIodmFsdWUpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlDRGF0YV9BdEFkZHJlc3ModHlwZSwgYnVmKTsKKyAgICB2b2lkICpidWY7CisgICAgaWYgKCFQeUludF9DaGVjayh2YWx1ZSkgJiYgIVB5TG9uZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIGV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBidWYgPSAodm9pZCAqKVB5TG9uZ19Bc1ZvaWRQdHIodmFsdWUpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlDRGF0YV9BdEFkZHJlc3ModHlwZSwgYnVmKTsKIH0KIAogc3RhdGljIGNoYXIgZnJvbV9idWZmZXJfZG9jW10gPQpAQCAtNDU2LDUxICs0NTYsNTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRGF0YVR5cGVfZnJvbV9idWZmZXIoUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmJ1ZmZlcjsKLQlQeV9zc2l6ZV90IGJ1ZmZlcl9sZW47Ci0JUHlfc3NpemVfdCBvZmZzZXQgPSAwOwotCVB5T2JqZWN0ICpvYmosICpyZXN1bHQ7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwotCWFzc2VydCAoZGljdCk7CisgICAgdm9pZCAqYnVmZmVyOworICAgIFB5X3NzaXplX3QgYnVmZmVyX2xlbjsKKyAgICBQeV9zc2l6ZV90IG9mZnNldCA9IDA7CisgICAgUHlPYmplY3QgKm9iaiwgKnJlc3VsdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7CisgICAgYXNzZXJ0IChkaWN0KTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkgICAgICAiT3xpOmZyb21fYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk98aTpmcm9tX2J1ZmZlciIsCiAjZWxzZQotCQkJICAgICAgIk98bjpmcm9tX2J1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJPfG46ZnJvbV9idWZmZXIiLAogI2VuZGlmCi0JCQkgICAgICAmb2JqLCAmb2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmosICZvZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgtMSA9PSBQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKG9iaiwgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoLTEgPT0gUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihvYmosICZidWZmZXIsICZidWZmZXJfbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAob2Zmc2V0IDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGRpY3QtPnNpemUgPiBidWZmZXJfbGVuIC0gb2Zmc2V0KSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkaWN0LT5zaXplID4gYnVmZmVyX2xlbiAtIG9mZnNldCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCQkJICAgICAiQnVmZmVyIHNpemUgdG9vIHNtYWxsICglZCBpbnN0ZWFkIG9mIGF0IGxlYXN0ICVkIGJ5dGVzKSIsCisgICAgICAgICAgICAgICAgICAgICAiQnVmZmVyIHNpemUgdG9vIHNtYWxsICglZCBpbnN0ZWFkIG9mIGF0IGxlYXN0ICVkIGJ5dGVzKSIsCiAjZWxzZQotCQkJICAgICAiQnVmZmVyIHNpemUgdG9vIHNtYWxsICglemQgaW5zdGVhZCBvZiBhdCBsZWFzdCAlemQgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCV6ZCBpbnN0ZWFkIG9mIGF0IGxlYXN0ICV6ZCBieXRlcykiLAogI2VuZGlmCi0JCQkgICAgIGJ1ZmZlcl9sZW4sIGRpY3QtPnNpemUgKyBvZmZzZXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuLCBkaWN0LT5zaXplICsgb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmVzdWx0ID0gUHlDRGF0YV9BdEFkZHJlc3ModHlwZSwgKGNoYXIgKilidWZmZXIgKyBvZmZzZXQpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlDRGF0YV9BdEFkZHJlc3ModHlwZSwgKGNoYXIgKilidWZmZXIgKyBvZmZzZXQpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYob2JqKTsKLQlpZiAoLTEgPT0gS2VlcFJlZigoQ0RhdGFPYmplY3QgKilyZXN1bHQsIC0xLCBvYmopKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9JTkNSRUYob2JqKTsKKyAgICBpZiAoLTEgPT0gS2VlcFJlZigoQ0RhdGFPYmplY3QgKilyZXN1bHQsIC0xLCBvYmopKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGNoYXIgZnJvbV9idWZmZXJfY29weV9kb2NbXSA9CkBAIC01MTIsNDggKzUxMiw0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIENEYXRhVHlwZV9mcm9tX2J1ZmZlcl9jb3B5KFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncykKIHsKLQljb25zdCB2b2lkICpidWZmZXI7Ci0JUHlfc3NpemVfdCBidWZmZXJfbGVuOwotCVB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKLQlQeU9iamVjdCAqb2JqLCAqcmVzdWx0OwotCVN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKLQlhc3NlcnQgKGRpY3QpOworICAgIGNvbnN0IHZvaWQgKmJ1ZmZlcjsKKyAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9sZW47CisgICAgUHlfc3NpemVfdCBvZmZzZXQgPSAwOworICAgIFB5T2JqZWN0ICpvYmosICpyZXN1bHQ7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgIGFzc2VydCAoZGljdCk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCQkJICAgICAgIk98aTpmcm9tX2J1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJPfGk6ZnJvbV9idWZmZXIiLAogI2Vsc2UKLQkJCSAgICAgICJPfG46ZnJvbV9idWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT3xuOmZyb21fYnVmZmVyIiwKICNlbmRpZgotCQkJICAgICAgJm9iaiwgJm9mZnNldCkpCi0JCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqLCAmb2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoLTEgPT0gUHlPYmplY3RfQXNSZWFkQnVmZmVyKG9iaiwgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoLTEgPT0gUHlPYmplY3RfQXNSZWFkQnVmZmVyKG9iaiwgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChvZmZzZXQgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChkaWN0LT5zaXplID4gYnVmZmVyX2xlbiAtIG9mZnNldCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICBpZiAoZGljdC0+c2l6ZSA+IGJ1ZmZlcl9sZW4gLSBvZmZzZXQpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSAgICAgIkJ1ZmZlciBzaXplIHRvbyBzbWFsbCAoJWQgaW5zdGVhZCBvZiBhdCBsZWFzdCAlZCBieXRlcykiLAorICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBzaXplIHRvbyBzbWFsbCAoJWQgaW5zdGVhZCBvZiBhdCBsZWFzdCAlZCBieXRlcykiLAogI2Vsc2UKLQkJCSAgICAgIkJ1ZmZlciBzaXplIHRvbyBzbWFsbCAoJXpkIGluc3RlYWQgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzKSIsCisgICAgICAgICAgICAgICAgICAgICAiQnVmZmVyIHNpemUgdG9vIHNtYWxsICglemQgaW5zdGVhZCBvZiBhdCBsZWFzdCAlemQgYnl0ZXMpIiwKICNlbmRpZgotCQkJICAgICBidWZmZXJfbGVuLCBkaWN0LT5zaXplICsgb2Zmc2V0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2xlbiwgZGljdC0+c2l6ZSArIG9mZnNldCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJlc3VsdCA9IEdlbmVyaWNQeUNEYXRhX25ldygoUHlUeXBlT2JqZWN0ICopdHlwZSwgTlVMTCwgTlVMTCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltZW1jcHkoKChDRGF0YU9iamVjdCAqKXJlc3VsdCktPmJfcHRyLAotCSAgICAgICAoY2hhciAqKWJ1ZmZlcitvZmZzZXQsIGRpY3QtPnNpemUpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gR2VuZXJpY1B5Q0RhdGFfbmV3KChQeVR5cGVPYmplY3QgKil0eXBlLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgoKENEYXRhT2JqZWN0ICopcmVzdWx0KS0+Yl9wdHIsCisgICAgICAgICAgIChjaGFyICopYnVmZmVyK29mZnNldCwgZGljdC0+c2l6ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGNoYXIgaW5fZGxsX2RvY1tdID0KQEAgLTU2Miw1NSArNTYyLDU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFUeXBlX2luX2RsbChQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmRsbDsKLQljaGFyICpuYW1lOwotCVB5T2JqZWN0ICpvYmo7Ci0Jdm9pZCAqaGFuZGxlOwotCXZvaWQgKmFkZHJlc3M7CisgICAgUHlPYmplY3QgKmRsbDsKKyAgICBjaGFyICpuYW1lOworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgdm9pZCAqaGFuZGxlOworICAgIHZvaWQgKmFkZHJlc3M7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zOmluX2RsbCIsICZkbGwsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPczppbl9kbGwiLCAmZGxsLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jb2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkbGwsICJfaGFuZGxlIik7Ci0JaWYgKCFvYmopCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlJbnRfQ2hlY2sob2JqKSAmJiAhUHlMb25nX0NoZWNrKG9iaikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidGhlIF9oYW5kbGUgYXR0cmlidXRlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaGFuZGxlID0gKHZvaWQgKilQeUxvbmdfQXNWb2lkUHRyKG9iaik7Ci0JUHlfREVDUkVGKG9iaik7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNvdWxkIG5vdCBjb252ZXJ0IHRoZSBfaGFuZGxlIGF0dHJpYnV0ZSB0byBhIHBvaW50ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGxsLCAiX2hhbmRsZSIpOworICAgIGlmICghb2JqKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SW50X0NoZWNrKG9iaikgJiYgIVB5TG9uZ19DaGVjayhvYmopKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIF9oYW5kbGUgYXR0cmlidXRlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaGFuZGxlID0gKHZvaWQgKilQeUxvbmdfQXNWb2lkUHRyKG9iaik7CisgICAgUHlfREVDUkVGKG9iaik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNvbnZlcnQgdGhlIF9oYW5kbGUgYXR0cmlidXRlIHRvIGEgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZmRlZiBNU19XSU4zMgotCWFkZHJlc3MgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSk7Ci0JaWYgKCFhZGRyZXNzKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAic3ltYm9sICclcycgbm90IGZvdW5kIiwKLQkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBhZGRyZXNzID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhoYW5kbGUsIG5hbWUpOworICAgIGlmICghYWRkcmVzcykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJzeW1ib2wgJyVzJyBub3QgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbHNlCi0JYWRkcmVzcyA9ICh2b2lkICopY3R5cGVzX2Rsc3ltKGhhbmRsZSwgbmFtZSk7Ci0JaWYgKCFhZGRyZXNzKSB7CisgICAgYWRkcmVzcyA9ICh2b2lkICopY3R5cGVzX2Rsc3ltKGhhbmRsZSwgbmFtZSk7CisgICAgaWYgKCFhZGRyZXNzKSB7CiAjaWZkZWYgX19DWUdXSU5fXwogLyogZGxlcnJvcigpIGlzbid0IHZlcnkgaGVscGZ1bCBvbiBjeWd3aW4gKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJzeW1ib2wgJyVzJyBub3QgZm91bmQgKCVzKSAiLAotCQkJICAgICBuYW1lKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAic3ltYm9sICclcycgbm90IGZvdW5kICglcykgIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwogI2Vsc2UKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGN0eXBlc19kbGVycm9yKCkpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgY3R5cGVzX2RsZXJyb3IoKSk7CiAjZW5kaWYKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gUHlDRGF0YV9BdEFkZHJlc3ModHlwZSwgYWRkcmVzcyk7CisgICAgcmV0dXJuIFB5Q0RhdGFfQXRBZGRyZXNzKHR5cGUsIGFkZHJlc3MpOwogfQogCiBzdGF0aWMgY2hhciBmcm9tX3BhcmFtX2RvY1tdID0KQEAgLTYxOSwyMTMgKzYxOSwyMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRGF0YVR5cGVfZnJvbV9wYXJhbShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICphc19wYXJhbWV0ZXI7Ci0JaWYgKDEgPT0gUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQlpZiAoUHlDQXJnX0NoZWNrRXhhY3QodmFsdWUpKSB7Ci0JCVB5Q0FyZ09iamVjdCAqcCA9IChQeUNBcmdPYmplY3QgKil2YWx1ZTsKLQkJUHlPYmplY3QgKm9iID0gcC0+b2JqOwotCQljb25zdCBjaGFyICpvYl9uYW1lOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7CisgICAgUHlPYmplY3QgKmFzX3BhcmFtZXRlcjsKKyAgICBpZiAoMSA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIGlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKKyAgICAgICAgUHlDQXJnT2JqZWN0ICpwID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOworICAgICAgICBQeU9iamVjdCAqb2IgPSBwLT5vYmo7CisgICAgICAgIGNvbnN0IGNoYXIgKm9iX25hbWU7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKIAotCQkvKiBJZiB3ZSBnb3QgYSBQeUNBcmdPYmplY3QsIHdlIG11c3QgY2hlY2sgaWYgdGhlIG9iamVjdCBwYWNrZWQgaW4gaXQKLQkJICAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHR5cGUncyBkaWN0LT5wcm90byAqLwotCQlpZihkaWN0ICYmIG9iCi0JCSAgICYmIFB5T2JqZWN0X0lzSW5zdGFuY2Uob2IsIGRpY3QtPnByb3RvKSkgewotCQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCQlvYl9uYW1lID0gKG9iKSA/IFB5X1RZUEUob2IpLT50cF9uYW1lIDogIj8/PyI7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJleHBlY3RlZCAlcyBpbnN0YW5jZSBpbnN0ZWFkIG9mIHBvaW50ZXIgdG8gJXMiLAotCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLCBvYl9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICAvKiBJZiB3ZSBnb3QgYSBQeUNBcmdPYmplY3QsIHdlIG11c3QgY2hlY2sgaWYgdGhlIG9iamVjdCBwYWNrZWQgaW4gaXQKKyAgICAgICAgICAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHR5cGUncyBkaWN0LT5wcm90byAqLworICAgICAgICBpZihkaWN0ICYmIG9iCisgICAgICAgICAgICYmIFB5T2JqZWN0X0lzSW5zdGFuY2Uob2IsIGRpY3QtPnByb3RvKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBvYl9uYW1lID0gKG9iKSA/IFB5X1RZUEUob2IpLT50cF9uYW1lIDogIj8/PyI7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXMgaW5zdGFuY2UgaW5zdGVhZCBvZiBwb2ludGVyIHRvICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUsIG9iX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlhc19wYXJhbWV0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiX2FzX3BhcmFtZXRlcl8iKTsKLQlpZiAoYXNfcGFyYW1ldGVyKSB7Ci0JCXZhbHVlID0gQ0RhdGFUeXBlX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKLQkJUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiZXhwZWN0ZWQgJXMgaW5zdGFuY2UgaW5zdGVhZCBvZiAlcyIsCi0JCSAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSwKLQkJICAgICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNfcGFyYW1ldGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgIl9hc19wYXJhbWV0ZXJfIik7CisgICAgaWYgKGFzX3BhcmFtZXRlcikgeworICAgICAgICB2YWx1ZSA9IENEYXRhVHlwZV9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7CisgICAgICAgIFB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyBpbnN0YW5jZSBpbnN0ZWFkIG9mICVzIiwKKyAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0RhdGFUeXBlX21ldGhvZHNbXSA9IHsKLQl7ICJmcm9tX3BhcmFtIiwgQ0RhdGFUeXBlX2Zyb21fcGFyYW0sIE1FVEhfTywgZnJvbV9wYXJhbV9kb2MgfSwKLQl7ICJmcm9tX2FkZHJlc3MiLCBDRGF0YVR5cGVfZnJvbV9hZGRyZXNzLCBNRVRIX08sIGZyb21fYWRkcmVzc19kb2MgfSwKLQl7ICJmcm9tX2J1ZmZlciIsIENEYXRhVHlwZV9mcm9tX2J1ZmZlciwgTUVUSF9WQVJBUkdTLCBmcm9tX2J1ZmZlcl9kb2MsIH0sCi0JeyAiZnJvbV9idWZmZXJfY29weSIsIENEYXRhVHlwZV9mcm9tX2J1ZmZlcl9jb3B5LCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2NvcHlfZG9jLCB9LAotCXsgImluX2RsbCIsIENEYXRhVHlwZV9pbl9kbGwsIE1FVEhfVkFSQVJHUywgaW5fZGxsX2RvYyB9LAotCXsgTlVMTCwgTlVMTCB9LAorICAgIHsgImZyb21fcGFyYW0iLCBDRGF0YVR5cGVfZnJvbV9wYXJhbSwgTUVUSF9PLCBmcm9tX3BhcmFtX2RvYyB9LAorICAgIHsgImZyb21fYWRkcmVzcyIsIENEYXRhVHlwZV9mcm9tX2FkZHJlc3MsIE1FVEhfTywgZnJvbV9hZGRyZXNzX2RvYyB9LAorICAgIHsgImZyb21fYnVmZmVyIiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyLCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2RvYywgfSwKKyAgICB7ICJmcm9tX2J1ZmZlcl9jb3B5IiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyX2NvcHksIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfY29weV9kb2MsIH0sCisgICAgeyAiaW5fZGxsIiwgQ0RhdGFUeXBlX2luX2RsbCwgTUVUSF9WQVJBUkdTLCBpbl9kbGxfZG9jIH0sCisgICAgeyBOVUxMLCBOVUxMIH0sCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFUeXBlX3JlcGVhdChQeU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBsZW5ndGgpCiB7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICBpZiAobGVuZ3RoIDwgMCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkJICAgICJBcnJheSBsZW5ndGggbXVzdCBiZSA+PSAwLCBub3QgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcnJheSBsZW5ndGggbXVzdCBiZSA+PSAwLCBub3QgJWQiLAogI2Vsc2UKLQkJCQkgICAgIkFycmF5IGxlbmd0aCBtdXN0IGJlID49IDAsIG5vdCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcnJheSBsZW5ndGggbXVzdCBiZSA+PSAwLCBub3QgJXpkIiwKICNlbmRpZgotCQkJCSAgICBsZW5ndGgpOwotCXJldHVybiBQeUNBcnJheVR5cGVfZnJvbV9jdHlwZShzZWxmLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CisgICAgcmV0dXJuIFB5Q0FycmF5VHlwZV9mcm9tX2N0eXBlKHNlbGYsIGxlbmd0aCk7CiB9CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBDRGF0YVR5cGVfYXNfc2VxdWVuY2UgPSB7Ci0JMCwJCQkvKiBpbnF1aXJ5IHNxX2xlbmd0aDsgKi8KLQkwLAkJCS8qIGJpbmFyeWZ1bmMgc3FfY29uY2F0OyAqLwotCUNEYXRhVHlwZV9yZXBlYXQsCS8qIGludGFyZ2Z1bmMgc3FfcmVwZWF0OyAqLwotCTAsCQkJLyogaW50YXJnZnVuYyBzcV9pdGVtOyAqLwotCTAsCQkJLyogaW50aW50YXJnZnVuYyBzcV9zbGljZTsgKi8KLQkwLAkJCS8qIGludG9iamFyZ3Byb2Mgc3FfYXNzX2l0ZW07ICovCi0JMCwJCQkvKiBpbnRpbnRvYmphcmdwcm9jIHNxX2Fzc19zbGljZTsgKi8KLQkwLAkJCS8qIG9iam9ianByb2Mgc3FfY29udGFpbnM7ICovCi0JCi0JMCwJCQkvKiBiaW5hcnlmdW5jIHNxX2lucGxhY2VfY29uY2F0OyAqLwotCTAsCQkJLyogaW50YXJnZnVuYyBzcV9pbnBsYWNlX3JlcGVhdDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5xdWlyeSBzcV9sZW5ndGg7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpbmFyeWZ1bmMgc3FfY29uY2F0OyAqLworICAgIENEYXRhVHlwZV9yZXBlYXQsICAgICAgICAgICAvKiBpbnRhcmdmdW5jIHNxX3JlcGVhdDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50YXJnZnVuYyBzcV9pdGVtOyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRpbnRhcmdmdW5jIHNxX3NsaWNlOyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRvYmphcmdwcm9jIHNxX2Fzc19pdGVtOyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRpbnRvYmphcmdwcm9jIHNxX2Fzc19zbGljZTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jqb2JqcHJvYyBzcV9jb250YWluczsgKi8KKworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaW5hcnlmdW5jIHNxX2lucGxhY2VfY29uY2F0OyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRhcmdmdW5jIHNxX2lucGxhY2VfcmVwZWF0OyAqLwogfTsKIAogc3RhdGljIGludAogQ0RhdGFUeXBlX2NsZWFyKFB5VHlwZU9iamVjdCAqc2VsZikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JaWYgKGRpY3QpCi0JCVB5X0NMRUFSKGRpY3QtPnByb3RvKTsKLQlyZXR1cm4gUHlUeXBlX1R5cGUudHBfY2xlYXIoKFB5T2JqZWN0ICopc2VsZik7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChkaWN0KQorICAgICAgICBQeV9DTEVBUihkaWN0LT5wcm90byk7CisgICAgcmV0dXJuIFB5VHlwZV9UeXBlLnRwX2NsZWFyKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBDRGF0YVR5cGVfdHJhdmVyc2UoUHlUeXBlT2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JaWYgKGRpY3QpCi0JCVB5X1ZJU0lUKGRpY3QtPnByb3RvKTsKLQlyZXR1cm4gUHlUeXBlX1R5cGUudHBfdHJhdmVyc2UoKFB5T2JqZWN0ICopc2VsZiwgdmlzaXQsIGFyZyk7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChkaWN0KQorICAgICAgICBQeV9WSVNJVChkaWN0LT5wcm90byk7CisgICAgcmV0dXJuIFB5VHlwZV9UeXBlLnRwX3RyYXZlcnNlKChQeU9iamVjdCAqKXNlbGYsIHZpc2l0LCBhcmcpOwogfQogCiBzdGF0aWMgaW50CiBQeUNTdHJ1Y3RUeXBlX3NldGF0dHJvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JLyogWFhYIFNob3VsZCB3ZSBkaXNhbGxvdyBkZWxldGluZyBfZmllbGRzXz8gKi8KLQlpZiAoLTEgPT0gUHlUeXBlX1R5cGUudHBfc2V0YXR0cm8oc2VsZiwga2V5LCB2YWx1ZSkpCi0JCXJldHVybiAtMTsKLQkKLQlpZiAodmFsdWUgJiYgUHlTdHJpbmdfQ2hlY2soa2V5KSAmJgotCSAgICAwID09IHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcoa2V5KSwgIl9maWVsZHNfIikpCi0JCXJldHVybiBQeUNTdHJ1Y3RVbmlvblR5cGVfdXBkYXRlX3N0Z2RpY3Qoc2VsZiwgdmFsdWUsIDEpOwotCXJldHVybiAwOworICAgIC8qIFhYWCBTaG91bGQgd2UgZGlzYWxsb3cgZGVsZXRpbmcgX2ZpZWxkc18/ICovCisgICAgaWYgKC0xID09IFB5VHlwZV9UeXBlLnRwX3NldGF0dHJvKHNlbGYsIGtleSwgdmFsdWUpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAodmFsdWUgJiYgUHlTdHJpbmdfQ2hlY2soa2V5KSAmJgorICAgICAgICAwID09IHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcoa2V5KSwgIl9maWVsZHNfIikpCisgICAgICAgIHJldHVybiBQeUNTdHJ1Y3RVbmlvblR5cGVfdXBkYXRlX3N0Z2RpY3Qoc2VsZiwgdmFsdWUsIDEpOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIFVuaW9uVHlwZV9zZXRhdHRybyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZhbHVlKQogewotCS8qIFhYWCBTaG91bGQgd2UgZGlzYWxsb3cgZGVsZXRpbmcgX2ZpZWxkc18/ICovCi0JaWYgKC0xID09IFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyKHNlbGYsIGtleSwgdmFsdWUpKQotCQlyZXR1cm4gLTE7Ci0JCi0JaWYgKFB5U3RyaW5nX0NoZWNrKGtleSkgJiYKLQkgICAgMCA9PSBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKGtleSksICJfZmllbGRzXyIpKQotCQlyZXR1cm4gUHlDU3RydWN0VW5pb25UeXBlX3VwZGF0ZV9zdGdkaWN0KHNlbGYsIHZhbHVlLCAwKTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFggU2hvdWxkIHdlIGRpc2FsbG93IGRlbGV0aW5nIF9maWVsZHNfPyAqLworICAgIGlmICgtMSA9PSBQeU9iamVjdF9HZW5lcmljU2V0QXR0cihzZWxmLCBrZXksIHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGtleSkgJiYKKyAgICAgICAgMCA9PSBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKGtleSksICJfZmllbGRzXyIpKQorICAgICAgICByZXR1cm4gUHlDU3RydWN0VW5pb25UeXBlX3VwZGF0ZV9zdGdkaWN0KHNlbGYsIHZhbHVlLCAwKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBQeVR5cGVPYmplY3QgUHlDU3RydWN0VHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLlB5Q1N0cnVjdFR5cGUiLAkJCS8qIHRwX25hbWUgKi8KLQkwLAkJCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCSAgICAgICAJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQlQeUNTdHJ1Y3RUeXBlX3NldGF0dHJvLAkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0JIm1ldGF0eXBlIGZvciB0aGUgQ0RhdGEgT2JqZWN0cyIsCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhVHlwZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlDRGF0YVR5cGVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCVB5Q1N0cnVjdFR5cGVfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLlB5Q1N0cnVjdFR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5Q1N0cnVjdFR5cGVfc2V0YXR0cm8sICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCisgICAgIm1ldGF0eXBlIGZvciB0aGUgQ0RhdGEgT2JqZWN0cyIsICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKUNEYXRhVHlwZV90cmF2ZXJzZSwgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpQ0RhdGFUeXBlX2NsZWFyLCAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIENEYXRhVHlwZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeUNTdHJ1Y3RUeXBlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFVuaW9uVHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLlVuaW9uVHlwZSIsCQkJLyogdHBfbmFtZSAqLwotCTAsCQkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJICAgICAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JVW5pb25UeXBlX3NldGF0dHJvLAkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0JIm1ldGF0eXBlIGZvciB0aGUgQ0RhdGEgT2JqZWN0cyIsCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhVHlwZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlDRGF0YVR5cGVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCVVuaW9uVHlwZV9uZXcsCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuVW5pb25UeXBlIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBVbmlvblR5cGVfc2V0YXR0cm8sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgICJtZXRhdHlwZSBmb3IgdGhlIENEYXRhIE9iamVjdHMiLCAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylDRGF0YVR5cGVfdHJhdmVyc2UsICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KUNEYXRhVHlwZV9jbGVhciwgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBDRGF0YVR5cGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgVW5pb25UeXBlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKQEAgLTg0NSwxMjQgKzg0NSwxMjQgQEAKIHN0YXRpYyBpbnQKIFB5Q1BvaW50ZXJUeXBlX1NldFByb3RvKFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsIFB5T2JqZWN0ICpwcm90bykKIHsKLQlpZiAoIXByb3RvIHx8ICFQeVR5cGVfQ2hlY2socHJvdG8pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl90eXBlXyBtdXN0IGJlIGEgdHlwZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghUHlUeXBlX3N0Z2RpY3QocHJvdG8pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl90eXBlXyBtdXN0IGhhdmUgc3RvcmFnZSBpbmZvIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfSU5DUkVGKHByb3RvKTsKLQlQeV9YREVDUkVGKHN0Z2RpY3QtPnByb3RvKTsKLQlzdGdkaWN0LT5wcm90byA9IHByb3RvOwotCXJldHVybiAwOworICAgIGlmICghcHJvdG8gfHwgIVB5VHlwZV9DaGVjayhwcm90bykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfdHlwZV8gbXVzdCBiZSBhIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5VHlwZV9zdGdkaWN0KHByb3RvKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl90eXBlXyBtdXN0IGhhdmUgc3RvcmFnZSBpbmZvIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfSU5DUkVGKHByb3RvKTsKKyAgICBQeV9YREVDUkVGKHN0Z2RpY3QtPnByb3RvKTsKKyAgICBzdGdkaWN0LT5wcm90byA9IHByb3RvOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlDQXJnT2JqZWN0ICoKIFB5Q1BvaW50ZXJUeXBlX3BhcmFtZnVuYyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgUHlDQXJnT2JqZWN0ICpwYXJnOwogCi0JcGFyZyA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKLQlpZiAocGFyZyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBwYXJnID0gUHlDQXJnT2JqZWN0X25ldygpOworICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcGFyZy0+dGFnID0gJ1AnOwotCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlwYXJnLT5vYmogPSAoUHlPYmplY3QgKilzZWxmOwotCXBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopc2VsZi0+Yl9wdHI7Ci0JcmV0dXJuIHBhcmc7CisgICAgcGFyZy0+dGFnID0gJ1AnOworICAgIHBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICBwYXJnLT5vYmogPSAoUHlPYmplY3QgKilzZWxmOworICAgIHBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopc2VsZi0+Yl9wdHI7CisgICAgcmV0dXJuIHBhcmc7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNQb2ludGVyVHlwZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlUeXBlT2JqZWN0ICpyZXN1bHQ7Ci0JU3RnRGljdE9iamVjdCAqc3RnZGljdDsKLQlQeU9iamVjdCAqcHJvdG87Ci0JUHlPYmplY3QgKnR5cGVkaWN0OworICAgIFB5VHlwZU9iamVjdCAqcmVzdWx0OworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CisgICAgUHlPYmplY3QgKnByb3RvOworICAgIFB5T2JqZWN0ICp0eXBlZGljdDsKIAotCXR5cGVkaWN0ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDIpOwotCWlmICghdHlwZWRpY3QpCi0JCXJldHVybiBOVUxMOworICAgIHR5cGVkaWN0ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDIpOworICAgIGlmICghdHlwZWRpY3QpCisgICAgICAgIHJldHVybiBOVUxMOwogLyoKICAgc3RnZGljdCBpdGVtcyBzaXplLCBhbGlnbiwgbGVuZ3RoIGNvbnRhaW4gaW5mbyBhYm91dCBwb2ludGVycyBpdHNlbGYsCiAgIHN0Z2RpY3QtPnByb3RvIGhhcyBpbmZvIGFib3V0IHRoZSBwb2ludGVkIHRvIHR5cGUhCiAqLwotCXN0Z2RpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoCi0JCShQeU9iamVjdCAqKSZQeUNTdGdEaWN0X1R5cGUsIE5VTEwpOwotCWlmICghc3RnZGljdCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3RnZGljdC0+c2l6ZSA9IHNpemVvZih2b2lkICopOwotCXN0Z2RpY3QtPmFsaWduID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJQIiktPnBmZmlfdHlwZS0+YWxpZ25tZW50OwotCXN0Z2RpY3QtPmxlbmd0aCA9IDE7Ci0Jc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9IGZmaV90eXBlX3BvaW50ZXI7Ci0Jc3RnZGljdC0+cGFyYW1mdW5jID0gUHlDUG9pbnRlclR5cGVfcGFyYW1mdW5jOwotCXN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKKyAgICBzdGdkaWN0ID0gKFN0Z0RpY3RPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KAorICAgICAgICAoUHlPYmplY3QgKikmUHlDU3RnRGljdF9UeXBlLCBOVUxMKTsKKyAgICBpZiAoIXN0Z2RpY3QpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0Z2RpY3QtPnNpemUgPSBzaXplb2Yodm9pZCAqKTsKKyAgICBzdGdkaWN0LT5hbGlnbiA9IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygiUCIpLT5wZmZpX3R5cGUtPmFsaWdubWVudDsKKyAgICBzdGdkaWN0LT5sZW5ndGggPSAxOworICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOworICAgIHN0Z2RpY3QtPnBhcmFtZnVuYyA9IFB5Q1BvaW50ZXJUeXBlX3BhcmFtZnVuYzsKKyAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CiAKLQlwcm90byA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGVkaWN0LCAiX3R5cGVfIik7IC8qIEJvcnJvd2VkIHJlZiAqLwotCWlmIChwcm90byAmJiAtMSA9PSBQeUNQb2ludGVyVHlwZV9TZXRQcm90byhzdGdkaWN0LCBwcm90bykpIHsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcHJvdG8gPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlZGljdCwgIl90eXBlXyIpOyAvKiBCb3Jyb3dlZCByZWYgKi8KKyAgICBpZiAocHJvdG8gJiYgLTEgPT0gUHlDUG9pbnRlclR5cGVfU2V0UHJvdG8oc3RnZGljdCwgcHJvdG8pKSB7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHByb3RvKSB7Ci0JCVN0Z0RpY3RPYmplY3QgKml0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCQlhc3NlcnQoaXRlbWRpY3QpOwotCQkvKiBJZiBpdGVtZGljdC0+Zm9ybWF0IGlzIE5VTEwsIHRoZW4gdGhpcyBpcyBhIHBvaW50ZXIgdG8gYW4KLQkJICAgaW5jb21wbGV0ZSB0eXBlLiAgV2UgY3JlYXRlIGEgZ2VuZXJpYyBmb3JtYXQgc3RyaW5nCi0JCSAgICdwb2ludGVyIHRvIGJ5dGVzJyBpbiB0aGlzIGNhc2UuICBYWFggQmV0dGVyIHdvdWxkIGJlIHRvCi0JCSAgIGZpeCB0aGUgZm9ybWF0IHN0cmluZyBsYXRlci4uLgotCQkqLwotCQlzdGdkaWN0LT5mb3JtYXQgPSBfY3R5cGVzX2FsbG9jX2Zvcm1hdF9zdHJpbmcoIiYiLAotCQkJICAgICAgaXRlbWRpY3QtPmZvcm1hdCA/IGl0ZW1kaWN0LT5mb3JtYXQgOiAiQiIpOwotCQlpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmIChwcm90bykgeworICAgICAgICBTdGdEaWN0T2JqZWN0ICppdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICAgICAgYXNzZXJ0KGl0ZW1kaWN0KTsKKyAgICAgICAgLyogSWYgaXRlbWRpY3QtPmZvcm1hdCBpcyBOVUxMLCB0aGVuIHRoaXMgaXMgYSBwb2ludGVyIHRvIGFuCisgICAgICAgICAgIGluY29tcGxldGUgdHlwZS4gIFdlIGNyZWF0ZSBhIGdlbmVyaWMgZm9ybWF0IHN0cmluZworICAgICAgICAgICAncG9pbnRlciB0byBieXRlcycgaW4gdGhpcyBjYXNlLiAgWFhYIEJldHRlciB3b3VsZCBiZSB0bworICAgICAgICAgICBmaXggdGhlIGZvcm1hdCBzdHJpbmcgbGF0ZXIuLi4KKyAgICAgICAgKi8KKyAgICAgICAgc3RnZGljdC0+Zm9ybWF0ID0gX2N0eXBlc19hbGxvY19mb3JtYXRfc3RyaW5nKCImIiwKKyAgICAgICAgICAgICAgICAgICAgICBpdGVtZGljdC0+Zm9ybWF0ID8gaXRlbWRpY3QtPmZvcm1hdCA6ICJCIik7CisgICAgICAgIGlmIChzdGdkaWN0LT5mb3JtYXQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKLQkgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCi0JcmVzdWx0ID0gKFB5VHlwZU9iamVjdCAqKVB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCisgICAgICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLworICAgIHJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzcGFtIGRpY3QgKi8KLQlpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKLQlyZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OworICAgIC8qIHJlcGxhY2UgdGhlIGNsYXNzIGRpY3QgYnkgb3VyIHVwZGF0ZWQgc3BhbSBkaWN0ICovCisgICAgaWYgKC0xID09IFB5RGljdF9VcGRhdGUoKFB5T2JqZWN0ICopc3RnZGljdCwgcmVzdWx0LT50cF9kaWN0KSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlc3VsdC0+dHBfZGljdCk7CisgICAgcmVzdWx0LT50cF9kaWN0ID0gKFB5T2JqZWN0ICopc3RnZGljdDsKIAotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlDUG9pbnRlclR5cGVfc2V0X3R5cGUoUHlUeXBlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdHlwZSkKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KGRpY3QpOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoZGljdCk7CiAKLQlpZiAoLTEgPT0gUHlDUG9pbnRlclR5cGVfU2V0UHJvdG8oZGljdCwgdHlwZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgtMSA9PSBQeUNQb2ludGVyVHlwZV9TZXRQcm90byhkaWN0LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoLTEgPT0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopZGljdCwgIl90eXBlXyIsIHR5cGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoLTEgPT0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopZGljdCwgIl90eXBlXyIsIHR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpY2ZvcndhcmQgUHlPYmplY3QgKl9ieXJlZihQeU9iamVjdCAqKTsKQEAgLTk3MCw5OCArOTcwLDk4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUHlDUG9pbnRlclR5cGVfZnJvbV9wYXJhbShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlKQogewotCVN0Z0RpY3RPYmplY3QgKnR5cGVkaWN0OworICAgIFN0Z0RpY3RPYmplY3QgKnR5cGVkaWN0OwogCi0JaWYgKHZhbHVlID09IFB5X05vbmUpIHsKLQkJLyogQ29udlBhcmFtIHdpbGwgY29udmVydCB0byBhIE5VTEwgcG9pbnRlciBsYXRlciAqLwotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQorICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgIC8qIENvbnZQYXJhbSB3aWxsIGNvbnZlcnQgdG8gYSBOVUxMIHBvaW50ZXIgbGF0ZXIgKi8KKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KIAotCXR5cGVkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JYXNzZXJ0KHR5cGVkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgdHlwZXMgKi8KKyAgICB0eXBlZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgIGFzc2VydCh0eXBlZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBwb2ludGVyIHR5cGVzICovCiAKLQkvKiBJZiB3ZSBleHBlY3QgUE9JTlRFUig8dHlwZT4pLCBidXQgcmVjZWl2ZSBhIDx0eXBlPiBpbnN0YW5jZSwgYWNjZXB0Ci0JICAgaXQgYnkgY2FsbGluZyBieXJlZig8dHlwZT4pLgotCSovCi0Jc3dpdGNoIChQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlZGljdC0+cHJvdG8pKSB7Ci0JY2FzZSAxOgotCQlQeV9JTkNSRUYodmFsdWUpOyAvKiBfYnlyZWYgc3RlYWxzIGEgcmVmY291bnQgKi8KLQkJcmV0dXJuIF9ieXJlZih2YWx1ZSk7Ci0JY2FzZSAtMToKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLSAJCWJyZWFrOwotCX0KKyAgICAvKiBJZiB3ZSBleHBlY3QgUE9JTlRFUig8dHlwZT4pLCBidXQgcmVjZWl2ZSBhIDx0eXBlPiBpbnN0YW5jZSwgYWNjZXB0CisgICAgICAgaXQgYnkgY2FsbGluZyBieXJlZig8dHlwZT4pLgorICAgICovCisgICAgc3dpdGNoIChQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlZGljdC0+cHJvdG8pKSB7CisgICAgY2FzZSAxOgorICAgICAgICBQeV9JTkNSRUYodmFsdWUpOyAvKiBfYnlyZWYgc3RlYWxzIGEgcmVmY291bnQgKi8KKyAgICAgICAgcmV0dXJuIF9ieXJlZih2YWx1ZSk7CisgICAgY2FzZSAtMToKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0gCWlmIChQb2ludGVyT2JqZWN0X0NoZWNrKHZhbHVlKSB8fCBBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkpIHsKLSAJCS8qIEFycmF5IGluc3RhbmNlcyBhcmUgYWxzbyBwb2ludGVycyB3aGVuCi0gCQkgICB0aGUgaXRlbSB0eXBlcyBhcmUgdGhlIHNhbWUuCi0gCQkqLwotIAkJU3RnRGljdE9iamVjdCAqdiA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOwotCQlhc3NlcnQodik7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBwb2ludGVyIG9yIGFycmF5IG9iamVjdHMgKi8KLSAJCWlmIChQeU9iamVjdF9Jc1N1YmNsYXNzKHYtPnByb3RvLCB0eXBlZGljdC0+cHJvdG8pKSB7Ci0gIAkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0gIAkJCXJldHVybiB2YWx1ZTsKLSAgCQl9Ci0gIAl9Ci0gICAgIAlyZXR1cm4gQ0RhdGFUeXBlX2Zyb21fcGFyYW0odHlwZSwgdmFsdWUpOworICAgIGlmIChQb2ludGVyT2JqZWN0X0NoZWNrKHZhbHVlKSB8fCBBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgLyogQXJyYXkgaW5zdGFuY2VzIGFyZSBhbHNvIHBvaW50ZXJzIHdoZW4KKyAgICAgICAgICAgdGhlIGl0ZW0gdHlwZXMgYXJlIHRoZSBzYW1lLgorICAgICAgICAqLworICAgICAgICBTdGdEaWN0T2JqZWN0ICp2ID0gUHlPYmplY3Rfc3RnZGljdCh2YWx1ZSk7CisgICAgICAgIGFzc2VydCh2KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgb3IgYXJyYXkgb2JqZWN0cyAqLworICAgICAgICBpZiAoUHlPYmplY3RfSXNTdWJjbGFzcyh2LT5wcm90bywgdHlwZWRpY3QtPnByb3RvKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ0RhdGFUeXBlX2Zyb21fcGFyYW0odHlwZSwgdmFsdWUpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgUHlDUG9pbnRlclR5cGVfbWV0aG9kc1tdID0gewotCXsgImZyb21fYWRkcmVzcyIsIENEYXRhVHlwZV9mcm9tX2FkZHJlc3MsIE1FVEhfTywgZnJvbV9hZGRyZXNzX2RvYyB9LAotCXsgImZyb21fYnVmZmVyIiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyLCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2RvYywgfSwKLQl7ICJmcm9tX2J1ZmZlcl9jb3B5IiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyX2NvcHksIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfY29weV9kb2MsIH0sCi0JeyAiaW5fZGxsIiwgQ0RhdGFUeXBlX2luX2RsbCwgTUVUSF9WQVJBUkdTLCBpbl9kbGxfZG9jfSwKLQl7ICJmcm9tX3BhcmFtIiwgKFB5Q0Z1bmN0aW9uKVB5Q1BvaW50ZXJUeXBlX2Zyb21fcGFyYW0sIE1FVEhfTywgZnJvbV9wYXJhbV9kb2N9LAotCXsgInNldF90eXBlIiwgKFB5Q0Z1bmN0aW9uKVB5Q1BvaW50ZXJUeXBlX3NldF90eXBlLCBNRVRIX08gfSwKLQl7IE5VTEwsIE5VTEwgfSwKKyAgICB7ICJmcm9tX2FkZHJlc3MiLCBDRGF0YVR5cGVfZnJvbV9hZGRyZXNzLCBNRVRIX08sIGZyb21fYWRkcmVzc19kb2MgfSwKKyAgICB7ICJmcm9tX2J1ZmZlciIsIENEYXRhVHlwZV9mcm9tX2J1ZmZlciwgTUVUSF9WQVJBUkdTLCBmcm9tX2J1ZmZlcl9kb2MsIH0sCisgICAgeyAiZnJvbV9idWZmZXJfY29weSIsIENEYXRhVHlwZV9mcm9tX2J1ZmZlcl9jb3B5LCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2NvcHlfZG9jLCB9LAorICAgIHsgImluX2RsbCIsIENEYXRhVHlwZV9pbl9kbGwsIE1FVEhfVkFSQVJHUywgaW5fZGxsX2RvY30sCisgICAgeyAiZnJvbV9wYXJhbSIsIChQeUNGdW5jdGlvbilQeUNQb2ludGVyVHlwZV9mcm9tX3BhcmFtLCBNRVRIX08sIGZyb21fcGFyYW1fZG9jfSwKKyAgICB7ICJzZXRfdHlwZSIsIChQeUNGdW5jdGlvbilQeUNQb2ludGVyVHlwZV9zZXRfdHlwZSwgTUVUSF9PIH0sCisgICAgeyBOVUxMLCBOVUxMIH0sCiB9OwogCiBQeVR5cGVPYmplY3QgUHlDUG9pbnRlclR5cGVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5QeUNQb2ludGVyVHlwZSIsCQkJCS8qIHRwX25hbWUgKi8KLQkwLAkJCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCSAgICAgICAJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCSJtZXRhdHlwZSBmb3IgdGhlIFBvaW50ZXIgT2JqZWN0cyIsCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhVHlwZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlQeUNQb2ludGVyVHlwZV9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JUHlDUG9pbnRlclR5cGVfbmV3LAkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuUHlDUG9pbnRlclR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZDRGF0YVR5cGVfYXNfc2VxdWVuY2UsICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAibWV0YXR5cGUgZm9yIHRoZSBQb2ludGVyIE9iamVjdHMiLCAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlDRGF0YVR5cGVfY2xlYXIsICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgUHlDUG9pbnRlclR5cGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5Q1BvaW50ZXJUeXBlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0MCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICBQeUNBcnJheVR5cGVfVHlwZQpAQCAtMTA3NCwxNjkgKzEwNzQsMTY5IEBACiBzdGF0aWMgaW50CiBDaGFyQXJyYXlfc2V0X3JhdyhDRGF0YU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotCWNoYXIgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgY2hhciAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKICNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA2MDAwMCkKLQlQeV9idWZmZXIgdmlldyA9IHsgMCB9OworICAgIFB5X2J1ZmZlciB2aWV3ID0geyAwIH07CiAjZW5kaWYKLQlpZiAoUHlCdWZmZXJfQ2hlY2sodmFsdWUpKSB7Ci0JCXNpemUgPSBQeV9UWVBFKHZhbHVlKS0+dHBfYXNfYnVmZmVyLT5iZl9nZXRyZWFkYnVmZmVyKHZhbHVlLCAwLCAodm9pZCAqKSZwdHIpOwotCQlpZiAoc2l6ZSA8IDApCi0JCQlnb3RvIGZhaWw7Ci0JfSBlbHNlIHsKKyAgICBpZiAoUHlCdWZmZXJfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIHNpemUgPSBQeV9UWVBFKHZhbHVlKS0+dHBfYXNfYnVmZmVyLT5iZl9nZXRyZWFkYnVmZmVyKHZhbHVlLCAwLCAodm9pZCAqKSZwdHIpOworICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfSBlbHNlIHsKICNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA2MDAwMCkKLQkJaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcih2YWx1ZSwgJnZpZXcsIFB5QlVGX1NJTVBMRSkgPCAwKQotCQkJZ290byBmYWlsOwotCQlzaXplID0gdmlldy5sZW47Ci0JCXB0ciA9IHZpZXcuYnVmOworICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHZhbHVlLCAmdmlldywgUHlCVUZfU0lNUExFKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHNpemUgPSB2aWV3LmxlbjsKKyAgICAgICAgcHRyID0gdmlldy5idWY7CiAjZWxzZQotCQlpZiAoLTEgPT0gUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHZhbHVlLCAmcHRyLCAmc2l6ZSkpCi0JCQlnb3RvIGZhaWw7CisgICAgICAgIGlmICgtMSA9PSBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodmFsdWUsICZwdHIsICZzaXplKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKICNlbmRpZgotCX0KLQlpZiAoc2l6ZSA+IHNlbGYtPmJfc2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic3RyaW5nIHRvbyBsb25nIik7Ci0JCWdvdG8gZmFpbDsKLQl9CisgICAgfQorICAgIGlmIChzaXplID4gc2VsZi0+Yl9zaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyB0b28gbG9uZyIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQogCi0JbWVtY3B5KHNlbGYtPmJfcHRyLCBwdHIsIHNpemUpOworICAgIG1lbWNweShzZWxmLT5iX3B0ciwgcHRyLCBzaXplKTsKIAogI2lmIChQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDYwMDAwKQotCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwogI2VuZGlmCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAgICAgZmFpbDoKIAogI2lmIChQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDYwMDAwKQotCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwogI2VuZGlmCi0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENoYXJBcnJheV9nZXRfcmF3KENEYXRhT2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+Yl9wdHIsIHNlbGYtPmJfc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDaGFyQXJyYXlfZ2V0X3ZhbHVlKENEYXRhT2JqZWN0ICpzZWxmKQogewotCWludCBpOwotCWNoYXIgKnB0ciA9IHNlbGYtPmJfcHRyOwotCWZvciAoaSA9IDA7IGkgPCBzZWxmLT5iX3NpemU7ICsraSkKLQkJaWYgKCpwdHIrKyA9PSAnXDAnKQotCQkJYnJlYWs7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmJfcHRyLCBpKTsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpwdHIgPSBzZWxmLT5iX3B0cjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+Yl9zaXplOyArK2kpCisgICAgICAgIGlmICgqcHRyKysgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5iX3B0ciwgaSk7CiB9CiAKIHN0YXRpYyBpbnQKIENoYXJBcnJheV9zZXRfdmFsdWUoQ0RhdGFPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQljaGFyICpwdHI7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIGNoYXIgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewotCQl2YWx1ZSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodmFsdWUsCi0JCQkJCQkgIF9jdHlwZXNfY29udmVyc2lvbl9lbmNvZGluZywKLQkJCQkJCSAgX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycyk7Ci0JCWlmICghdmFsdWUpCi0JCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJzdHJpbmcgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0gZWxzZQotCQlQeV9JTkNSRUYodmFsdWUpOwotCXNpemUgPSBQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSk7Ci0JaWYgKHNpemUgPiBzZWxmLT5iX3NpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInN0cmluZyB0b28gbG9uZyIpOwotCQlQeV9ERUNSRUYodmFsdWUpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIHZhbHVlID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdHlwZXNfY29udmVyc2lvbl9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdHlwZXNfY29udmVyc2lvbl9lcnJvcnMpOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInN0cmluZyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZQorICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIHNpemUgPSBQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSk7CisgICAgaWYgKHNpemUgPiBzZWxmLT5iX3NpemUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIHRvbyBsb25nIik7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlwdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpOwotCW1lbWNweShzZWxmLT5iX3B0ciwgcHRyLCBzaXplKTsKLQlpZiAoc2l6ZSA8IHNlbGYtPmJfc2l6ZSkKLQkJc2VsZi0+Yl9wdHJbc2l6ZV0gPSAnXDAnOwotCVB5X0RFQ1JFRih2YWx1ZSk7CisgICAgcHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKTsKKyAgICBtZW1jcHkoc2VsZi0+Yl9wdHIsIHB0ciwgc2l6ZSk7CisgICAgaWYgKHNpemUgPCBzZWxmLT5iX3NpemUpCisgICAgICAgIHNlbGYtPmJfcHRyW3NpemVdID0gJ1wwJzsKKyAgICBQeV9ERUNSRUYodmFsdWUpOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBDaGFyQXJyYXlfZ2V0c2V0c1tdID0gewotCXsgInJhdyIsIChnZXR0ZXIpQ2hhckFycmF5X2dldF9yYXcsIChzZXR0ZXIpQ2hhckFycmF5X3NldF9yYXcsCi0JICAidmFsdWUiLCBOVUxMIH0sCi0JeyAidmFsdWUiLCAoZ2V0dGVyKUNoYXJBcnJheV9nZXRfdmFsdWUsIChzZXR0ZXIpQ2hhckFycmF5X3NldF92YWx1ZSwKLQkgICJzdHJpbmcgdmFsdWUifSwKLQl7IE5VTEwsIE5VTEwgfQorICAgIHsgInJhdyIsIChnZXR0ZXIpQ2hhckFycmF5X2dldF9yYXcsIChzZXR0ZXIpQ2hhckFycmF5X3NldF9yYXcsCisgICAgICAidmFsdWUiLCBOVUxMIH0sCisgICAgeyAidmFsdWUiLCAoZ2V0dGVyKUNoYXJBcnJheV9nZXRfdmFsdWUsIChzZXR0ZXIpQ2hhckFycmF5X3NldF92YWx1ZSwKKyAgICAgICJzdHJpbmcgdmFsdWUifSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogI2lmZGVmIENUWVBFU19VTklDT0RFCiBzdGF0aWMgUHlPYmplY3QgKgogV0NoYXJBcnJheV9nZXRfdmFsdWUoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JdW5zaWduZWQgaW50IGk7Ci0Jd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKilzZWxmLT5iX3B0cjsKLQlmb3IgKGkgPSAwOyBpIDwgc2VsZi0+Yl9zaXplL3NpemVvZih3Y2hhcl90KTsgKytpKQotCQlpZiAoKnB0cisrID09ICh3Y2hhcl90KTApCi0JCQlicmVhazsKLQlyZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcigod2NoYXJfdCAqKXNlbGYtPmJfcHRyLCBpKTsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB3Y2hhcl90ICpwdHIgPSAod2NoYXJfdCAqKXNlbGYtPmJfcHRyOworICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpOyArK2kpCisgICAgICAgIGlmICgqcHRyKysgPT0gKHdjaGFyX3QpMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKCh3Y2hhcl90ICopc2VsZi0+Yl9wdHIsIGkpOwogfQogCiBzdGF0aWMgaW50CiBXQ2hhckFycmF5X3NldF92YWx1ZShDRGF0YU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5X3NzaXplX3QgcmVzdWx0ID0gMDsKKyAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IDA7CiAKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQl2YWx1ZSA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCh2YWx1ZSwKLQkJCQkJCSAgICBfY3R5cGVzX2NvbnZlcnNpb25fZW5jb2RpbmcsCi0JCQkJCQkgICAgX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycyk7Ci0JCWlmICghdmFsdWUpCi0JCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ1bmljb2RlIHN0cmluZyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJCQlQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQlpZiAoKHVuc2lnbmVkKVB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSkgPiBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzdHJpbmcgdG9vIGxvbmciKTsKLQkJcmVzdWx0ID0gLTE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmVzdWx0ID0gUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLAotCQkJCSAgICAgICh3Y2hhcl90ICopc2VsZi0+Yl9wdHIsCi0JCQkJICAgICAgc2VsZi0+Yl9zaXplL3NpemVvZih3Y2hhcl90KSk7Ci0JaWYgKHJlc3VsdCA+PSAwICYmIChzaXplX3QpcmVzdWx0IDwgc2VsZi0+Yl9zaXplL3NpemVvZih3Y2hhcl90KSkKLQkJKCh3Y2hhcl90ICopc2VsZi0+Yl9wdHIpW3Jlc3VsdF0gPSAod2NoYXJfdCkwOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QodmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdHlwZXNfY29udmVyc2lvbl9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycyk7CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgaWYgKCh1bnNpZ25lZClQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpID4gc2VsZi0+Yl9zaXplL3NpemVvZih3Y2hhcl90KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgdG9vIGxvbmciKTsKKyAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3Y2hhcl90ICopc2VsZi0+Yl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Yl9zaXplL3NpemVvZih3Y2hhcl90KSk7CisgICAgaWYgKHJlc3VsdCA+PSAwICYmIChzaXplX3QpcmVzdWx0IDwgc2VsZi0+Yl9zaXplL3NpemVvZih3Y2hhcl90KSkKKyAgICAgICAgKCh3Y2hhcl90ICopc2VsZi0+Yl9wdHIpW3Jlc3VsdF0gPSAod2NoYXJfdCkwOwogICBkb25lOgotCVB5X0RFQ1JFRih2YWx1ZSk7CisgICAgUHlfREVDUkVGKHZhbHVlKTsKIAotCXJldHVybiByZXN1bHQgPj0gMCA/IDAgOiAtMTsKKyAgICByZXR1cm4gcmVzdWx0ID49IDAgPyAwIDogLTE7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBXQ2hhckFycmF5X2dldHNldHNbXSA9IHsKLQl7ICJ2YWx1ZSIsIChnZXR0ZXIpV0NoYXJBcnJheV9nZXRfdmFsdWUsIChzZXR0ZXIpV0NoYXJBcnJheV9zZXRfdmFsdWUsCi0JICAic3RyaW5nIHZhbHVlIn0sCi0JeyBOVUxMLCBOVUxMIH0KKyAgICB7ICJ2YWx1ZSIsIChnZXR0ZXIpV0NoYXJBcnJheV9nZXRfdmFsdWUsIChzZXR0ZXIpV0NoYXJBcnJheV9zZXRfdmFsdWUsCisgICAgICAic3RyaW5nIHZhbHVlIn0sCisgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAjZW5kaWYKIApAQCAtMTI1MSwyMzEgKzEyNTEsMjMxIEBACiBzdGF0aWMgaW50CiBhZGRfbWV0aG9kcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5TWV0aG9kRGVmICptZXRoKQogewotCVB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKLQlmb3IgKDsgbWV0aC0+bWxfbmFtZSAhPSBOVUxMOyBtZXRoKyspIHsKLQkJUHlPYmplY3QgKmRlc2NyOwotCQlkZXNjciA9IFB5RGVzY3JfTmV3TWV0aG9kKHR5cGUsIG1ldGgpOwotCQlpZiAoZGVzY3IgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsbWV0aC0+bWxfbmFtZSwgZGVzY3IpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGRlc2NyKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OworICAgIGZvciAoOyBtZXRoLT5tbF9uYW1lICE9IE5VTEw7IG1ldGgrKykgeworICAgICAgICBQeU9iamVjdCAqZGVzY3I7CisgICAgICAgIGRlc2NyID0gUHlEZXNjcl9OZXdNZXRob2QodHlwZSwgbWV0aCk7CisgICAgICAgIGlmIChkZXNjciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCxtZXRoLT5tbF9uYW1lLCBkZXNjcikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogYWRkX21lbWJlcnMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU1lbWJlckRlZiAqbWVtYikKIHsKLQlQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7Ci0JZm9yICg7IG1lbWItPm5hbWUgIT0gTlVMTDsgbWVtYisrKSB7Ci0JCVB5T2JqZWN0ICpkZXNjcjsKLQkJZGVzY3IgPSBQeURlc2NyX05ld01lbWJlcih0eXBlLCBtZW1iKTsKLQkJaWYgKGRlc2NyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBtZW1iLT5uYW1lLCBkZXNjcikgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYoZGVzY3IpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CisgICAgZm9yICg7IG1lbWItPm5hbWUgIT0gTlVMTDsgbWVtYisrKSB7CisgICAgICAgIFB5T2JqZWN0ICpkZXNjcjsKKyAgICAgICAgZGVzY3IgPSBQeURlc2NyX05ld01lbWJlcih0eXBlLCBtZW1iKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBtZW1iLT5uYW1lLCBkZXNjcikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KICovCiAKIHN0YXRpYyBpbnQKIGFkZF9nZXRzZXQoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeUdldFNldERlZiAqZ3NwKQogewotCVB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKLQlmb3IgKDsgZ3NwLT5uYW1lICE9IE5VTEw7IGdzcCsrKSB7Ci0JCVB5T2JqZWN0ICpkZXNjcjsKLQkJZGVzY3IgPSBQeURlc2NyX05ld0dldFNldCh0eXBlLCBnc3ApOwotCQlpZiAoZGVzY3IgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIGdzcC0+bmFtZSwgZGVzY3IpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGRlc2NyKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OworICAgIGZvciAoOyBnc3AtPm5hbWUgIT0gTlVMTDsgZ3NwKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmRlc2NyOworICAgICAgICBkZXNjciA9IFB5RGVzY3JfTmV3R2V0U2V0KHR5cGUsIGdzcCk7CisgICAgICAgIGlmIChkZXNjciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgZ3NwLT5uYW1lLCBkZXNjcikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5Q0FyZ09iamVjdCAqCiBQeUNBcnJheVR5cGVfcGFyYW1mdW5jKENEYXRhT2JqZWN0ICpzZWxmKQogewotCVB5Q0FyZ09iamVjdCAqcCA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwLT50YWcgPSAnUCc7Ci0JcC0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JcC0+dmFsdWUucCA9IChjaGFyICopc2VsZi0+Yl9wdHI7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXAtPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7Ci0JcmV0dXJuIHA7CisgICAgUHlDQXJnT2JqZWN0ICpwID0gUHlDQXJnT2JqZWN0X25ldygpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPnRhZyA9ICdQJzsKKyAgICBwLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKKyAgICBwLT52YWx1ZS5wID0gKGNoYXIgKilzZWxmLT5iX3B0cjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcC0+b2JqID0gKFB5T2JqZWN0ICopc2VsZjsKKyAgICByZXR1cm4gcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q0FycmF5VHlwZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlUeXBlT2JqZWN0ICpyZXN1bHQ7Ci0JU3RnRGljdE9iamVjdCAqc3RnZGljdDsKLQlTdGdEaWN0T2JqZWN0ICppdGVtZGljdDsKLQlQeU9iamVjdCAqcHJvdG87Ci0JUHlPYmplY3QgKnR5cGVkaWN0OwotCWxvbmcgbGVuZ3RoOworICAgIFB5VHlwZU9iamVjdCAqcmVzdWx0OworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CisgICAgU3RnRGljdE9iamVjdCAqaXRlbWRpY3Q7CisgICAgUHlPYmplY3QgKnByb3RvOworICAgIFB5T2JqZWN0ICp0eXBlZGljdDsKKyAgICBsb25nIGxlbmd0aDsKIAotCVB5X3NzaXplX3QgaXRlbXNpemUsIGl0ZW1hbGlnbjsKLQljaGFyIGJ1ZlszMl07CisgICAgUHlfc3NpemVfdCBpdGVtc2l6ZSwgaXRlbWFsaWduOworICAgIGNoYXIgYnVmWzMyXTsKIAotCXR5cGVkaWN0ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDIpOwotCWlmICghdHlwZWRpY3QpCi0JCXJldHVybiBOVUxMOworICAgIHR5cGVkaWN0ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDIpOworICAgIGlmICghdHlwZWRpY3QpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcHJvdG8gPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlZGljdCwgIl9sZW5ndGhfIik7IC8qIEJvcnJvd2VkIHJlZiAqLwotCWlmICghcHJvdG8gfHwgIVB5SW50X0NoZWNrKHByb3RvKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJImNsYXNzIG11c3QgZGVmaW5lIGEgJ19sZW5ndGhfJyBhdHRyaWJ1dGUsICIKLQkJCQkid2hpY2ggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWxlbmd0aCA9IFB5SW50X0FTX0xPTkcocHJvdG8pOworICAgIHByb3RvID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZWRpY3QsICJfbGVuZ3RoXyIpOyAvKiBCb3Jyb3dlZCByZWYgKi8KKyAgICBpZiAoIXByb3RvIHx8ICFQeUludF9DaGVjayhwcm90bykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzIG11c3QgZGVmaW5lIGEgJ19sZW5ndGhfJyBhdHRyaWJ1dGUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbGVuZ3RoID0gUHlJbnRfQVNfTE9ORyhwcm90byk7CiAKLQlwcm90byA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGVkaWN0LCAiX3R5cGVfIik7IC8qIEJvcnJvd2VkIHJlZiAqLwotCWlmICghcHJvdG8pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSJjbGFzcyBtdXN0IGRlZmluZSBhICdfdHlwZV8nIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcHJvdG8gPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlZGljdCwgIl90eXBlXyIpOyAvKiBCb3Jyb3dlZCByZWYgKi8KKyAgICBpZiAoIXByb3RvKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzcyBtdXN0IGRlZmluZSBhICdfdHlwZV8nIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzdGdkaWN0ID0gKFN0Z0RpY3RPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KAotCQkoUHlPYmplY3QgKikmUHlDU3RnRGljdF9UeXBlLCBOVUxMKTsKLQlpZiAoIXN0Z2RpY3QpCi0JCXJldHVybiBOVUxMOworICAgIHN0Z2RpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoCisgICAgICAgIChQeU9iamVjdCAqKSZQeUNTdGdEaWN0X1R5cGUsIE5VTEwpOworICAgIGlmICghc3RnZGljdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKLQlpZiAoIWl0ZW1kaWN0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl90eXBlXyBtdXN0IGhhdmUgc3RvcmFnZSBpbmZvIik7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOworICAgIGlmICghaXRlbWRpY3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfdHlwZV8gbXVzdCBoYXZlIHN0b3JhZ2UgaW5mbyIpOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWFzc2VydChpdGVtZGljdC0+Zm9ybWF0KTsKLQlpZiAoaXRlbWRpY3QtPmZvcm1hdFswXSA9PSAnKCcpIHsKLQkJc3ByaW50ZihidWYsICIoJWxkLCIsIGxlbmd0aCk7Ci0JCXN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhidWYsIGl0ZW1kaWN0LT5mb3JtYXQrMSk7Ci0JfSBlbHNlIHsKLQkJc3ByaW50ZihidWYsICIoJWxkKSIsIGxlbmd0aCk7Ci0JCXN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhidWYsIGl0ZW1kaWN0LT5mb3JtYXQpOwotCX0KLQlpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RnZGljdC0+bmRpbSA9IGl0ZW1kaWN0LT5uZGltICsgMTsKLQlzdGdkaWN0LT5zaGFwZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCAqKSAqIHN0Z2RpY3QtPm5kaW0pOwotCWlmIChzdGdkaWN0LT5zaGFwZSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN0Z2RpY3QtPnNoYXBlWzBdID0gbGVuZ3RoOwotCW1lbW1vdmUoJnN0Z2RpY3QtPnNoYXBlWzFdLCBpdGVtZGljdC0+c2hhcGUsCi0JCXNpemVvZihQeV9zc2l6ZV90KSAqIChzdGdkaWN0LT5uZGltIC0gMSkpOworICAgIGFzc2VydChpdGVtZGljdC0+Zm9ybWF0KTsKKyAgICBpZiAoaXRlbWRpY3QtPmZvcm1hdFswXSA9PSAnKCcpIHsKKyAgICAgICAgc3ByaW50ZihidWYsICIoJWxkLCIsIGxlbmd0aCk7CisgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhidWYsIGl0ZW1kaWN0LT5mb3JtYXQrMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3ByaW50ZihidWYsICIoJWxkKSIsIGxlbmd0aCk7CisgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhidWYsIGl0ZW1kaWN0LT5mb3JtYXQpOworICAgIH0KKyAgICBpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RnZGljdC0+bmRpbSA9IGl0ZW1kaWN0LT5uZGltICsgMTsKKyAgICBzdGdkaWN0LT5zaGFwZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCAqKSAqIHN0Z2RpY3QtPm5kaW0pOworICAgIGlmIChzdGdkaWN0LT5zaGFwZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0Z2RpY3QtPnNoYXBlWzBdID0gbGVuZ3RoOworICAgIG1lbW1vdmUoJnN0Z2RpY3QtPnNoYXBlWzFdLCBpdGVtZGljdC0+c2hhcGUsCisgICAgICAgIHNpemVvZihQeV9zc2l6ZV90KSAqIChzdGdkaWN0LT5uZGltIC0gMSkpOwogCi0JaXRlbXNpemUgPSBpdGVtZGljdC0+c2l6ZTsKLQlpZiAobGVuZ3RoICogaXRlbXNpemUgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJhcnJheSB0b28gbGFyZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGl0ZW1zaXplID0gaXRlbWRpY3QtPnNpemU7CisgICAgaWYgKGxlbmd0aCAqIGl0ZW1zaXplIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSB0b28gbGFyZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaXRlbWFsaWduID0gaXRlbWRpY3QtPmFsaWduOworICAgIGl0ZW1hbGlnbiA9IGl0ZW1kaWN0LT5hbGlnbjsKIAotCWlmIChpdGVtZGljdC0+ZmxhZ3MgJiAoVFlQRUZMQUdfSVNQT0lOVEVSIHwgVFlQRUZMQUdfSEFTUE9JTlRFUikpCi0JCXN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0hBU1BPSU5URVI7CisgICAgaWYgKGl0ZW1kaWN0LT5mbGFncyAmIChUWVBFRkxBR19JU1BPSU5URVIgfCBUWVBFRkxBR19IQVNQT0lOVEVSKSkKKyAgICAgICAgc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSEFTUE9JTlRFUjsKIAotCXN0Z2RpY3QtPnNpemUgPSBpdGVtc2l6ZSAqIGxlbmd0aDsKLQlzdGdkaWN0LT5hbGlnbiA9IGl0ZW1hbGlnbjsKLQlzdGdkaWN0LT5sZW5ndGggPSBsZW5ndGg7Ci0JUHlfSU5DUkVGKHByb3RvKTsKLQlzdGdkaWN0LT5wcm90byA9IHByb3RvOworICAgIHN0Z2RpY3QtPnNpemUgPSBpdGVtc2l6ZSAqIGxlbmd0aDsKKyAgICBzdGdkaWN0LT5hbGlnbiA9IGl0ZW1hbGlnbjsKKyAgICBzdGdkaWN0LT5sZW5ndGggPSBsZW5ndGg7CisgICAgUHlfSU5DUkVGKHByb3RvKTsKKyAgICBzdGdkaWN0LT5wcm90byA9IHByb3RvOwogCi0Jc3RnZGljdC0+cGFyYW1mdW5jID0gJlB5Q0FycmF5VHlwZV9wYXJhbWZ1bmM7CisgICAgc3RnZGljdC0+cGFyYW1mdW5jID0gJlB5Q0FycmF5VHlwZV9wYXJhbWZ1bmM7CiAKLQkvKiBBcnJheXMgYXJlIHBhc3NlZCBhcyBwb2ludGVycyB0byBmdW5jdGlvbiBjYWxscy4gKi8KLQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyID0gZmZpX3R5cGVfcG9pbnRlcjsKKyAgICAvKiBBcnJheXMgYXJlIHBhc3NlZCBhcyBwb2ludGVycyB0byBmdW5jdGlvbiBjYWxscy4gKi8KKyAgICBzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyID0gZmZpX3R5cGVfcG9pbnRlcjsKIAotCS8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAotCSAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KLQlyZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCisgICAgICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLworICAgIHJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIHJlcGxhY2UgdGhlIGNsYXNzIGRpY3QgYnkgb3VyIHVwZGF0ZWQgc3BhbSBkaWN0ICovCi0JaWYgKC0xID09IFB5RGljdF9VcGRhdGUoKFB5T2JqZWN0ICopc3RnZGljdCwgcmVzdWx0LT50cF9kaWN0KSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfREVDUkVGKHJlc3VsdC0+dHBfZGljdCk7Ci0JcmVzdWx0LT50cF9kaWN0ID0gKFB5T2JqZWN0ICopc3RnZGljdDsKKyAgICAvKiByZXBsYWNlIHRoZSBjbGFzcyBkaWN0IGJ5IG91ciB1cGRhdGVkIHNwYW0gZGljdCAqLworICAgIGlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKXN0Z2RpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOworICAgIHJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKXN0Z2RpY3Q7CiAKLQkvKiBTcGVjaWFsIGNhc2UgZm9yIGNoYXJhY3RlciBhcnJheXMuCi0JICAgQSBwZXJtYW5lbnQgYW5ub3lhbmNlOiBjaGFyIGFycmF5cyBhcmUgYWxzbyBzdHJpbmdzIQotCSovCi0JaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygiYyIpLT5nZXRmdW5jKSB7Ci0JCWlmICgtMSA9PSBhZGRfZ2V0c2V0KHJlc3VsdCwgQ2hhckFycmF5X2dldHNldHMpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgLyogU3BlY2lhbCBjYXNlIGZvciBjaGFyYWN0ZXIgYXJyYXlzLgorICAgICAgIEEgcGVybWFuZW50IGFubm95YW5jZTogY2hhciBhcnJheXMgYXJlIGFsc28gc3RyaW5ncyEKKyAgICAqLworICAgIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBfY3R5cGVzX2dldF9maWVsZGRlc2MoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICBpZiAoLTEgPT0gYWRkX2dldHNldChyZXN1bHQsIENoYXJBcnJheV9nZXRzZXRzKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JfSBlbHNlIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBfY3R5cGVzX2dldF9maWVsZGRlc2MoInUiKS0+Z2V0ZnVuYykgewotCQlpZiAoLTEgPT0gYWRkX2dldHNldChyZXN1bHQsIFdDaGFyQXJyYXlfZ2V0c2V0cykpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygidSIpLT5nZXRmdW5jKSB7CisgICAgICAgIGlmICgtMSA9PSBhZGRfZ2V0c2V0KHJlc3VsdCwgV0NoYXJBcnJheV9nZXRzZXRzKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCi0JfQorICAgIH0KIAotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogUHlUeXBlT2JqZWN0IFB5Q0FycmF5VHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLlB5Q0FycmF5VHlwZSIsCQkJLyogdHBfbmFtZSAqLwotCTAsCQkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJICAgICAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCSJtZXRhdHlwZSBmb3IgdGhlIEFycmF5IE9iamVjdHMiLAkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCUNEYXRhVHlwZV9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JUHlDQXJyYXlUeXBlX25ldywJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5QeUNBcnJheVR5cGUiLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAibWV0YXR5cGUgZm9yIHRoZSBBcnJheSBPYmplY3RzIiwgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgQ0RhdGFUeXBlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5Q0FycmF5VHlwZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgIFB5Q1NpbXBsZVR5cGVfVHlwZQpAQCAtMTQ5MiwyNjQgKzE0OTIsMjY0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY193Y2hhcl9wX2Zyb21fcGFyYW0oUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqYXNfcGFyYW1ldGVyOworICAgIFB5T2JqZWN0ICphc19wYXJhbWV0ZXI7CiAjaWYgKFBZVEhPTl9BUElfVkVSU0lPTiA8IDEwMTIpCiAjIGVycm9yIG5vdCBzdXBwb3J0ZWQKICNlbmRpZgotCWlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCWlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpIHx8IFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JCXN0cnVjdCBmaWVsZGRlc2MgKmZkID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJaIik7CisgICAgaWYgKHZhbHVlID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkgfHwgUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBfY3R5cGVzX2dldF9maWVsZGRlc2MoIloiKTsKIAotCQlwYXJnID0gUHlDQXJnT2JqZWN0X25ldygpOwotCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYXJnLT50YWcgPSAnWic7Ci0JCXBhcmctPm9iaiA9IGZkLT5zZXRmdW5jKCZwYXJnLT52YWx1ZSwgdmFsdWUsIDApOwotCQlpZiAocGFyZy0+b2JqID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KLQlpZiAoUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQlpZiAoQXJyYXlPYmplY3RfQ2hlY2sodmFsdWUpIHx8IFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCS8qIGNfd2NoYXIgYXJyYXkgaW5zdGFuY2Ugb3IgcG9pbnRlcihjX3djaGFyKC4uLikpICovCi0JCVN0Z0RpY3RPYmplY3QgKmR0ID0gUHlPYmplY3Rfc3RnZGljdCh2YWx1ZSk7Ci0JCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JCWFzc2VydChkdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBwb2ludGVyIG9yIGFycmF5IG9iamVjdHMgKi8KLQkJZGljdCA9IGR0ICYmIGR0LT5wcm90byA/IFB5VHlwZV9zdGdkaWN0KGR0LT5wcm90bykgOiBOVUxMOwotCQlpZiAoZGljdCAmJiAoZGljdC0+c2V0ZnVuYyA9PSBfY3R5cGVzX2dldF9maWVsZGRlc2MoInUiKS0+c2V0ZnVuYykpIHsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0JaWYgKFB5Q0FyZ19DaGVja0V4YWN0KHZhbHVlKSkgewotCQkvKiBieXJlZihjX2NoYXIoLi4uKSkgKi8KLQkJUHlDQXJnT2JqZWN0ICphID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlPYmplY3Rfc3RnZGljdChhLT5vYmopOwotCQlpZiAoZGljdCAmJiAoZGljdC0+c2V0ZnVuYyA9PSBfY3R5cGVzX2dldF9maWVsZGRlc2MoInUiKS0+c2V0ZnVuYykpIHsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9CisgICAgICAgIHBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICdaJzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIGlmIChBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkgfHwgUG9pbnRlck9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgLyogY193Y2hhciBhcnJheSBpbnN0YW5jZSBvciBwb2ludGVyKGNfd2NoYXIoLi4uKSkgKi8KKyAgICAgICAgU3RnRGljdE9iamVjdCAqZHQgPSBQeU9iamVjdF9zdGdkaWN0KHZhbHVlKTsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICAgICAgYXNzZXJ0KGR0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgb3IgYXJyYXkgb2JqZWN0cyAqLworICAgICAgICBkaWN0ID0gZHQgJiYgZHQtPnByb3RvID8gUHlUeXBlX3N0Z2RpY3QoZHQtPnByb3RvKSA6IE5VTEw7CisgICAgICAgIGlmIChkaWN0ICYmIChkaWN0LT5zZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygidSIpLT5zZXRmdW5jKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoUHlDQXJnX0NoZWNrRXhhY3QodmFsdWUpKSB7CisgICAgICAgIC8qIGJ5cmVmKGNfY2hhciguLi4pKSAqLworICAgICAgICBQeUNBcmdPYmplY3QgKmEgPSAoUHlDQXJnT2JqZWN0ICopdmFsdWU7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KGEtPm9iaik7CisgICAgICAgIGlmIChkaWN0ICYmIChkaWN0LT5zZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygidSIpLT5zZXRmdW5jKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KIAotCWFzX3BhcmFtZXRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodmFsdWUsICJfYXNfcGFyYW1ldGVyXyIpOwotCWlmIChhc19wYXJhbWV0ZXIpIHsKLQkJdmFsdWUgPSBjX3djaGFyX3BfZnJvbV9wYXJhbSh0eXBlLCBhc19wYXJhbWV0ZXIpOwotCQlQeV9ERUNSRUYoYXNfcGFyYW1ldGVyKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkvKiBYWFggYmV0dGVyIG1lc3NhZ2UgKi8KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJIndyb25nIHR5cGUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBhc19wYXJhbWV0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiX2FzX3BhcmFtZXRlcl8iKTsKKyAgICBpZiAoYXNfcGFyYW1ldGVyKSB7CisgICAgICAgIHZhbHVlID0gY193Y2hhcl9wX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKKyAgICAgICAgUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgLyogWFhYIGJldHRlciBtZXNzYWdlICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIHR5cGUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNfY2hhcl9wX2Zyb21fcGFyYW0oUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqYXNfcGFyYW1ldGVyOworICAgIFB5T2JqZWN0ICphc19wYXJhbWV0ZXI7CiAjaWYgKFBZVEhPTl9BUElfVkVSU0lPTiA8IDEwMTIpCiAjIGVycm9yIG5vdCBzdXBwb3J0ZWQKICNlbmRpZgotCWlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCWlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkgfHwgUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewotCQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JCXN0cnVjdCBmaWVsZGRlc2MgKmZkID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJ6Iik7CisgICAgaWYgKHZhbHVlID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSB8fCBQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBfY3R5cGVzX2dldF9maWVsZGRlc2MoInoiKTsKIAotCQlwYXJnID0gUHlDQXJnT2JqZWN0X25ldygpOwotCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYXJnLT50YWcgPSAneic7Ci0JCXBhcmctPm9iaiA9IGZkLT5zZXRmdW5jKCZwYXJnLT52YWx1ZSwgdmFsdWUsIDApOwotCQlpZiAocGFyZy0+b2JqID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KLQlpZiAoUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQlpZiAoQXJyYXlPYmplY3RfQ2hlY2sodmFsdWUpIHx8IFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCS8qIGNfY2hhciBhcnJheSBpbnN0YW5jZSBvciBwb2ludGVyKGNfY2hhciguLi4pKSAqLwotCQlTdGdEaWN0T2JqZWN0ICpkdCA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCQlhc3NlcnQoZHQpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciBvciBhcnJheSBvYmplY3RzICovCi0JCWRpY3QgPSBkdCAmJiBkdC0+cHJvdG8gPyBQeVR5cGVfc3RnZGljdChkdC0+cHJvdG8pIDogTlVMTDsKLQkJaWYgKGRpY3QgJiYgKGRpY3QtPnNldGZ1bmMgPT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJjIiktPnNldGZ1bmMpKSB7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQotCWlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKLQkJLyogYnlyZWYoY19jaGFyKC4uLikpICovCi0JCVB5Q0FyZ09iamVjdCAqYSA9IChQeUNBcmdPYmplY3QgKil2YWx1ZTsKLQkJU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoYS0+b2JqKTsKLQkJaWYgKGRpY3QgJiYgKGRpY3QtPnNldGZ1bmMgPT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJjIiktPnNldGZ1bmMpKSB7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQorICAgICAgICBwYXJnID0gUHlDQXJnT2JqZWN0X25ldygpOworICAgICAgICBpZiAocGFyZyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICBwYXJnLT50YWcgPSAneic7CisgICAgICAgIHBhcmctPm9iaiA9IGZkLT5zZXRmdW5jKCZwYXJnLT52YWx1ZSwgdmFsdWUsIDApOworICAgICAgICBpZiAocGFyZy0+b2JqID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwYXJnKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilwYXJnOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBpZiAoQXJyYXlPYmplY3RfQ2hlY2sodmFsdWUpIHx8IFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIC8qIGNfY2hhciBhcnJheSBpbnN0YW5jZSBvciBwb2ludGVyKGNfY2hhciguLi4pKSAqLworICAgICAgICBTdGdEaWN0T2JqZWN0ICpkdCA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOworICAgICAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgICAgICBhc3NlcnQoZHQpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciBvciBhcnJheSBvYmplY3RzICovCisgICAgICAgIGRpY3QgPSBkdCAmJiBkdC0+cHJvdG8gPyBQeVR5cGVfc3RnZGljdChkdC0+cHJvdG8pIDogTlVMTDsKKyAgICAgICAgaWYgKGRpY3QgJiYgKGRpY3QtPnNldGZ1bmMgPT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJjIiktPnNldGZ1bmMpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKKyAgICAgICAgLyogYnlyZWYoY19jaGFyKC4uLikpICovCisgICAgICAgIFB5Q0FyZ09iamVjdCAqYSA9IChQeUNBcmdPYmplY3QgKil2YWx1ZTsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoYS0+b2JqKTsKKyAgICAgICAgaWYgKGRpY3QgJiYgKGRpY3QtPnNldGZ1bmMgPT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJjIiktPnNldGZ1bmMpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQogCi0JYXNfcGFyYW1ldGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgIl9hc19wYXJhbWV0ZXJfIik7Ci0JaWYgKGFzX3BhcmFtZXRlcikgewotCQl2YWx1ZSA9IGNfY2hhcl9wX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKLQkJUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JLyogWFhYIGJldHRlciBtZXNzYWdlICovCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ3cm9uZyB0eXBlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNfcGFyYW1ldGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgIl9hc19wYXJhbWV0ZXJfIik7CisgICAgaWYgKGFzX3BhcmFtZXRlcikgeworICAgICAgICB2YWx1ZSA9IGNfY2hhcl9wX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKKyAgICAgICAgUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgLyogWFhYIGJldHRlciBtZXNzYWdlICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIHR5cGUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNfdm9pZF9wX2Zyb21fcGFyYW0oUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkOwotCVB5T2JqZWN0ICphc19wYXJhbWV0ZXI7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZDsKKyAgICBQeU9iamVjdCAqYXNfcGFyYW1ldGVyOwogI2lmIChQWVRIT05fQVBJX1ZFUlNJT04gPCAxMDEyKQogIyBlcnJvciBub3Qgc3VwcG9ydGVkCiAjZW5kaWYKIAogLyogTm9uZSAqLwotCWlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCS8qIFNob3VsZCBwcm9iYWJseSBhbGxvdyBidWZmZXIgaW50ZXJmYWNlIGFzIHdlbGwgKi8KKyAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICAvKiBTaG91bGQgcHJvYmFibHkgYWxsb3cgYnVmZmVyIGludGVyZmFjZSBhcyB3ZWxsICovCiAvKiBpbnQsIGxvbmcgKi8KLQlpZiAoUHlJbnRfQ2hlY2sodmFsdWUpIHx8IFB5TG9uZ19DaGVjayh2YWx1ZSkpIHsKLQkJUHlDQXJnT2JqZWN0ICpwYXJnOwotCQlzdHJ1Y3QgZmllbGRkZXNjICpmZCA9IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygiUCIpOworICAgIGlmIChQeUludF9DaGVjayh2YWx1ZSkgfHwgUHlMb25nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZkID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJQIik7CiAKLQkJcGFyZyA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKLQkJaWYgKHBhcmcgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlwYXJnLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKLQkJcGFyZy0+dGFnID0gJ1AnOwotCQlwYXJnLT5vYmogPSBmZC0+c2V0ZnVuYygmcGFyZy0+dmFsdWUsIHZhbHVlLCAwKTsKLQkJaWYgKHBhcmctPm9iaiA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocGFyZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKLQl9CisgICAgICAgIHBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICdQJzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQogLyogc3RyaW5nICovCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JCXN0cnVjdCBmaWVsZGRlc2MgKmZkID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJ6Iik7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZkID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJ6Iik7CiAKLQkJcGFyZyA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKLQkJaWYgKHBhcmcgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlwYXJnLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKLQkJcGFyZy0+dGFnID0gJ3onOwotCQlwYXJnLT5vYmogPSBmZC0+c2V0ZnVuYygmcGFyZy0+dmFsdWUsIHZhbHVlLCAwKTsKLQkJaWYgKHBhcmctPm9iaiA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocGFyZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKLQl9CisgICAgICAgIHBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICd6JzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQogLyogdW5pY29kZSAqLwotCWlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5Q0FyZ09iamVjdCAqcGFyZzsKLQkJc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBfY3R5cGVzX2dldF9maWVsZGRlc2MoIloiKTsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZkID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJaIik7CiAKLQkJcGFyZyA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKLQkJaWYgKHBhcmcgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlwYXJnLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKLQkJcGFyZy0+dGFnID0gJ1onOwotCQlwYXJnLT5vYmogPSBmZC0+c2V0ZnVuYygmcGFyZy0+dmFsdWUsIHZhbHVlLCAwKTsKLQkJaWYgKHBhcmctPm9iaiA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocGFyZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKLQl9CisgICAgICAgIHBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICdaJzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQogLyogY192b2lkX3AgaW5zdGFuY2UgKG9yIHN1YmNsYXNzKSAqLwotCWlmIChQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgewotCQkvKiBjX3ZvaWRfcCBpbnN0YW5jZXMgKi8KLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KKyAgICBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKKyAgICAgICAgLyogY192b2lkX3AgaW5zdGFuY2VzICovCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CiAvKiBjdHlwZXMgYXJyYXkgb3IgcG9pbnRlciBpbnN0YW5jZSAqLwotCWlmIChBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkgfHwgUG9pbnRlck9iamVjdF9DaGVjayh2YWx1ZSkpIHsKLQkJLyogQW55IGFycmF5IG9yIHBvaW50ZXIgaXMgYWNjZXB0ZWQgKi8KLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KKyAgICBpZiAoQXJyYXlPYmplY3RfQ2hlY2sodmFsdWUpIHx8IFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIC8qIEFueSBhcnJheSBvciBwb2ludGVyIGlzIGFjY2VwdGVkICovCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CiAvKiBieXJlZiguLi4pICovCi0JaWYgKFB5Q0FyZ19DaGVja0V4YWN0KHZhbHVlKSkgewotCQkvKiBieXJlZihjX3h4eCgpKSAqLwotCQlQeUNBcmdPYmplY3QgKmEgPSAoUHlDQXJnT2JqZWN0ICopdmFsdWU7Ci0JCWlmIChhLT50YWcgPT0gJ1AnKSB7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQorICAgIGlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKKyAgICAgICAgLyogYnlyZWYoY194eHgoKSkgKi8KKyAgICAgICAgUHlDQXJnT2JqZWN0ICphID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOworICAgICAgICBpZiAoYS0+dGFnID09ICdQJykgeworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KIC8qIGZ1bmN0aW9uIHBvaW50ZXIgKi8KLQlpZiAoUHlDRnVuY1B0ck9iamVjdF9DaGVjayh2YWx1ZSkpIHsKLQkJUHlDQXJnT2JqZWN0ICpwYXJnOwotCQlQeUNGdW5jUHRyT2JqZWN0ICpmdW5jOwotCQlmdW5jID0gKFB5Q0Z1bmNQdHJPYmplY3QgKil2YWx1ZTsKLQkJcGFyZyA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKLQkJaWYgKHBhcmcgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlwYXJnLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKLQkJcGFyZy0+dGFnID0gJ1AnOwotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlwYXJnLT52YWx1ZS5wID0gKih2b2lkICoqKWZ1bmMtPmJfcHRyOwotCQlwYXJnLT5vYmogPSB2YWx1ZTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7Ci0JfQorICAgIGlmIChQeUNGdW5jUHRyT2JqZWN0X0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgICAgIFB5Q0Z1bmNQdHJPYmplY3QgKmZ1bmM7CisgICAgICAgIGZ1bmMgPSAoUHlDRnVuY1B0ck9iamVjdCAqKXZhbHVlOworICAgICAgICBwYXJnID0gUHlDQXJnT2JqZWN0X25ldygpOworICAgICAgICBpZiAocGFyZyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICBwYXJnLT50YWcgPSAnUCc7CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopZnVuYy0+Yl9wdHI7CisgICAgICAgIHBhcmctPm9iaiA9IHZhbHVlOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKKyAgICB9CiAvKiBjX2NoYXJfcCwgY193Y2hhcl9wICovCi0Jc3RnZCA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOwotCWlmIChzdGdkICYmIENEYXRhT2JqZWN0X0NoZWNrKHZhbHVlKSAmJiBzdGdkLT5wcm90byAmJiBQeVN0cmluZ19DaGVjayhzdGdkLT5wcm90bykpIHsKLQkJUHlDQXJnT2JqZWN0ICpwYXJnOworICAgIHN0Z2QgPSBQeU9iamVjdF9zdGdkaWN0KHZhbHVlKTsKKyAgICBpZiAoc3RnZCAmJiBDRGF0YU9iamVjdF9DaGVjayh2YWx1ZSkgJiYgc3RnZC0+cHJvdG8gJiYgUHlTdHJpbmdfQ2hlY2soc3RnZC0+cHJvdG8pKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKIAotCQlzd2l0Y2ggKFB5U3RyaW5nX0FTX1NUUklORyhzdGdkLT5wcm90bylbMF0pIHsKLQkJY2FzZSAneic6IC8qIGNfY2hhcl9wICovCi0JCWNhc2UgJ1onOiAvKiBjX3djaGFyX3AgKi8KLQkJCXBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7Ci0JCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JCQlwYXJnLT50YWcgPSAnWic7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJcGFyZy0+b2JqID0gdmFsdWU7Ci0JCQkvKiBSZW1lbWJlcjogYl9wdHIgcG9pbnRzIHRvIHdoZXJlIHRoZSBwb2ludGVyIGlzIHN0b3JlZCEgKi8KLQkJCXBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopKCgoQ0RhdGFPYmplY3QgKil2YWx1ZSktPmJfcHRyKTsKLQkJCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCQl9Ci0JfQorICAgICAgICBzd2l0Y2ggKFB5U3RyaW5nX0FTX1NUUklORyhzdGdkLT5wcm90bylbMF0pIHsKKyAgICAgICAgY2FzZSAneic6IC8qIGNfY2hhcl9wICovCisgICAgICAgIGNhc2UgJ1onOiAvKiBjX3djaGFyX3AgKi8KKyAgICAgICAgICAgIHBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7CisgICAgICAgICAgICBpZiAocGFyZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgICAgICBwYXJnLT50YWcgPSAnWic7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgcGFyZy0+b2JqID0gdmFsdWU7CisgICAgICAgICAgICAvKiBSZW1lbWJlcjogYl9wdHIgcG9pbnRzIHRvIHdoZXJlIHRoZSBwb2ludGVyIGlzIHN0b3JlZCEgKi8KKyAgICAgICAgICAgIHBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopKCgoQ0RhdGFPYmplY3QgKil2YWx1ZSktPmJfcHRyKTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilwYXJnOworICAgICAgICB9CisgICAgfQogCi0JYXNfcGFyYW1ldGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgIl9hc19wYXJhbWV0ZXJfIik7Ci0JaWYgKGFzX3BhcmFtZXRlcikgewotCQl2YWx1ZSA9IGNfdm9pZF9wX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKLQkJUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JLyogWFhYIGJldHRlciBtZXNzYWdlICovCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ3cm9uZyB0eXBlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNfcGFyYW1ldGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgIl9hc19wYXJhbWV0ZXJfIik7CisgICAgaWYgKGFzX3BhcmFtZXRlcikgeworICAgICAgICB2YWx1ZSA9IGNfdm9pZF9wX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKKyAgICAgICAgUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgLyogWFhYIGJldHRlciBtZXNzYWdlICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIHR5cGUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KICNpZiAoUFlUSE9OX0FQSV9WRVJTSU9OID49IDEwMTIpCiAKQEAgLTE3NjYsMjkxICsxNzY2LDI5MSBAQAogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqQ3JlYXRlU3dhcHBlZFR5cGUoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMsCi0JCQkJICAgUHlPYmplY3QgKnByb3RvLCBzdHJ1Y3QgZmllbGRkZXNjICpmbXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpwcm90bywgc3RydWN0IGZpZWxkZGVzYyAqZm10KQogewotCVB5VHlwZU9iamVjdCAqcmVzdWx0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7Ci0JUHlPYmplY3QgKm5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCVB5T2JqZWN0ICpzd2FwcGVkX2FyZ3M7Ci0Jc3RhdGljIFB5T2JqZWN0ICpzdWZmaXg7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5VHlwZU9iamVjdCAqcmVzdWx0OworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CisgICAgUHlPYmplY3QgKm5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIFB5T2JqZWN0ICpzd2FwcGVkX2FyZ3M7CisgICAgc3RhdGljIFB5T2JqZWN0ICpzdWZmaXg7CisgICAgUHlfc3NpemVfdCBpOwogCi0Jc3dhcHBlZF9hcmdzID0gUHlUdXBsZV9OZXcoUHlUdXBsZV9HRVRfU0laRShhcmdzKSk7Ci0JaWYgKCFzd2FwcGVkX2FyZ3MpCi0JCXJldHVybiBOVUxMOworICAgIHN3YXBwZWRfYXJncyA9IFB5VHVwbGVfTmV3KFB5VHVwbGVfR0VUX1NJWkUoYXJncykpOworICAgIGlmICghc3dhcHBlZF9hcmdzKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdWZmaXggPT0gTlVMTCkKKyAgICBpZiAoc3VmZml4ID09IE5VTEwpCiAjaWZkZWYgV09SRFNfQklHRU5ESUFOCi0JCXN1ZmZpeCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9sZSIpOworICAgICAgICBzdWZmaXggPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfbGUiKTsKICNlbHNlCi0JCXN1ZmZpeCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9iZSIpOworICAgICAgICBzdWZmaXggPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfYmUiKTsKICNlbmRpZgogCi0JUHlfSU5DUkVGKG5hbWUpOwotCVB5U3RyaW5nX0NvbmNhdCgmbmFtZSwgc3VmZml4KTsKLQlpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgUHlTdHJpbmdfQ29uY2F0KCZuYW1lLCBzdWZmaXgpOworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlUdXBsZV9TRVRfSVRFTShzd2FwcGVkX2FyZ3MsIDAsIG5hbWUpOwotCWZvciAoaT0xOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7ICsraSkgewotCQlQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJUHlUdXBsZV9TRVRfSVRFTShzd2FwcGVkX2FyZ3MsIGksIHYpOwotCX0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKHN3YXBwZWRfYXJncywgMCwgbmFtZSk7CisgICAgZm9yIChpPTE7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKTsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHN3YXBwZWRfYXJncywgaSwgdik7CisgICAgfQogCi0JLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCi0JICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLwotCXJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgc3dhcHBlZF9hcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYoc3dhcHBlZF9hcmdzKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAorICAgICAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KKyAgICByZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIHN3YXBwZWRfYXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKHN3YXBwZWRfYXJncyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0Z2RpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoCi0JCShQeU9iamVjdCAqKSZQeUNTdGdEaWN0X1R5cGUsIE5VTEwpOwotCWlmICghc3RnZGljdCkgLyogWFhYIGxlYWtzIHJlc3VsdCEgKi8KLQkJcmV0dXJuIE5VTEw7CisgICAgc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKKyAgICAgICAgKFB5T2JqZWN0ICopJlB5Q1N0Z0RpY3RfVHlwZSwgTlVMTCk7CisgICAgaWYgKCFzdGdkaWN0KSAvKiBYWFggbGVha3MgcmVzdWx0ISAqLworICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSAqZm10LT5wZmZpX3R5cGU7Ci0Jc3RnZGljdC0+YWxpZ24gPSBmbXQtPnBmZmlfdHlwZS0+YWxpZ25tZW50OwotCXN0Z2RpY3QtPmxlbmd0aCA9IDA7Ci0Jc3RnZGljdC0+c2l6ZSA9IGZtdC0+cGZmaV90eXBlLT5zaXplOwotCXN0Z2RpY3QtPnNldGZ1bmMgPSBmbXQtPnNldGZ1bmNfc3dhcHBlZDsKLQlzdGdkaWN0LT5nZXRmdW5jID0gZm10LT5nZXRmdW5jX3N3YXBwZWQ7CisgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9ICpmbXQtPnBmZmlfdHlwZTsKKyAgICBzdGdkaWN0LT5hbGlnbiA9IGZtdC0+cGZmaV90eXBlLT5hbGlnbm1lbnQ7CisgICAgc3RnZGljdC0+bGVuZ3RoID0gMDsKKyAgICBzdGdkaWN0LT5zaXplID0gZm10LT5wZmZpX3R5cGUtPnNpemU7CisgICAgc3RnZGljdC0+c2V0ZnVuYyA9IGZtdC0+c2V0ZnVuY19zd2FwcGVkOworICAgIHN0Z2RpY3QtPmdldGZ1bmMgPSBmbXQtPmdldGZ1bmNfc3dhcHBlZDsKIAotCVB5X0lOQ1JFRihwcm90byk7Ci0Jc3RnZGljdC0+cHJvdG8gPSBwcm90bzsKKyAgICBQeV9JTkNSRUYocHJvdG8pOworICAgIHN0Z2RpY3QtPnByb3RvID0gcHJvdG87CiAKLQkvKiByZXBsYWNlIHRoZSBjbGFzcyBkaWN0IGJ5IG91ciB1cGRhdGVkIHNwYW0gZGljdCAqLwotCWlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKXN0Z2RpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOwotCXJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKXN0Z2RpY3Q7CisgICAgLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzcGFtIGRpY3QgKi8KKyAgICBpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKKyAgICByZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCiBzdGF0aWMgUHlDQXJnT2JqZWN0ICoKIFB5Q1NpbXBsZVR5cGVfcGFyYW1mdW5jKENEYXRhT2JqZWN0ICpzZWxmKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JY2hhciAqZm10OwotCVB5Q0FyZ09iamVjdCAqcGFyZzsKLQlzdHJ1Y3QgZmllbGRkZXNjICpmZDsKLQkKLQlkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBDRGF0YU9iamVjdCBpbnN0YW5jZXMgKi8KLQlmbXQgPSBQeVN0cmluZ19Bc1N0cmluZyhkaWN0LT5wcm90byk7Ci0JYXNzZXJ0KGZtdCk7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBjaGFyICpmbXQ7CisgICAgUHlDQXJnT2JqZWN0ICpwYXJnOworICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZkOwogCi0JZmQgPSBfY3R5cGVzX2dldF9maWVsZGRlc2MoZm10KTsKLQlhc3NlcnQoZmQpOwotCQotCXBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7Ci0JaWYgKHBhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JcGFyZy0+dGFnID0gZm10WzBdOwotCXBhcmctPnBmZmlfdHlwZSA9IGZkLT5wZmZpX3R5cGU7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXBhcmctPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7Ci0JbWVtY3B5KCZwYXJnLT52YWx1ZSwgc2VsZi0+Yl9wdHIsIHNlbGYtPmJfc2l6ZSk7Ci0JcmV0dXJuIHBhcmc7CQorICAgIGRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENEYXRhT2JqZWN0IGluc3RhbmNlcyAqLworICAgIGZtdCA9IFB5U3RyaW5nX0FzU3RyaW5nKGRpY3QtPnByb3RvKTsKKyAgICBhc3NlcnQoZm10KTsKKworICAgIGZkID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKGZtdCk7CisgICAgYXNzZXJ0KGZkKTsKKworICAgIHBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7CisgICAgaWYgKHBhcmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBwYXJnLT50YWcgPSBmbXRbMF07CisgICAgcGFyZy0+cGZmaV90eXBlID0gZmQtPnBmZmlfdHlwZTsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcGFyZy0+b2JqID0gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBtZW1jcHkoJnBhcmctPnZhbHVlLCBzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKTsKKyAgICByZXR1cm4gcGFyZzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q1NpbXBsZVR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5VHlwZU9iamVjdCAqcmVzdWx0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7Ci0JUHlPYmplY3QgKnByb3RvOwotCWNvbnN0IGNoYXIgKnByb3RvX3N0cjsKLQlQeV9zc2l6ZV90IHByb3RvX2xlbjsKLQlQeU1ldGhvZERlZiAqbWw7Ci0Jc3RydWN0IGZpZWxkZGVzYyAqZm10OworICAgIFB5VHlwZU9iamVjdCAqcmVzdWx0OworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CisgICAgUHlPYmplY3QgKnByb3RvOworICAgIGNvbnN0IGNoYXIgKnByb3RvX3N0cjsKKyAgICBQeV9zc2l6ZV90IHByb3RvX2xlbjsKKyAgICBQeU1ldGhvZERlZiAqbWw7CisgICAgc3RydWN0IGZpZWxkZGVzYyAqZm10OwogCi0JLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCi0JICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLwotCXJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKKyAgICAgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCisgICAgcmVzdWx0ID0gKFB5VHlwZU9iamVjdCAqKVB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcHJvdG8gPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXJlc3VsdCwgIl90eXBlXyIpOyAvKiBuZXcgcmVmICovCi0JaWYgKCFwcm90bykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJImNsYXNzIG11c3QgZGVmaW5lIGEgJ190eXBlXycgYXR0cmlidXRlIik7CisgICAgcHJvdG8gPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXJlc3VsdCwgIl90eXBlXyIpOyAvKiBuZXcgcmVmICovCisgICAgaWYgKCFwcm90bykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3MgbXVzdCBkZWZpbmUgYSAnX3R5cGVfJyBhdHRyaWJ1dGUiKTsKICAgZXJyb3I6Ci0JCVB5X1hERUNSRUYocHJvdG8pOwotCQlQeV9YREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlTdHJpbmdfQ2hlY2socHJvdG8pKSB7Ci0JCXByb3RvX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhwcm90byk7Ci0JCXByb3RvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHByb3RvKTsKLQl9IGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImNsYXNzIG11c3QgZGVmaW5lIGEgJ190eXBlXycgc3RyaW5nIGF0dHJpYnV0ZSIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlpZiAocHJvdG9fbGVuICE9IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNsYXNzIG11c3QgZGVmaW5lIGEgJ190eXBlXycgYXR0cmlidXRlICIKLQkJCQkid2hpY2ggbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMSIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlpZiAoIXN0cmNocihTSU1QTEVfVFlQRV9DSEFSUywgKnByb3RvX3N0cikpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJICAgICAiY2xhc3MgbXVzdCBkZWZpbmUgYSAnX3R5cGVfJyBhdHRyaWJ1dGUgd2hpY2ggbXVzdCBiZVxuIgotCQkJICAgICAiYSBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZyBjb250YWluaW5nIG9uZSBvZiAnJXMnLiIsCi0JCQkgICAgIFNJTVBMRV9UWVBFX0NIQVJTKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JZm10ID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKFB5U3RyaW5nX0FTX1NUUklORyhwcm90bykpOwotCWlmIChmbXQgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIl90eXBlXyAnJXMnIG5vdCBzdXBwb3J0ZWQiLAotCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgICAgIFB5X1hERUNSRUYocHJvdG8pOworICAgICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2socHJvdG8pKSB7CisgICAgICAgIHByb3RvX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhwcm90byk7CisgICAgICAgIHByb3RvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHByb3RvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImNsYXNzIG11c3QgZGVmaW5lIGEgJ190eXBlXycgc3RyaW5nIGF0dHJpYnV0ZSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAocHJvdG9fbGVuICE9IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3MgbXVzdCBkZWZpbmUgYSAnX3R5cGVfJyBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIG11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDEiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKCFzdHJjaHIoU0lNUExFX1RZUEVfQ0hBUlMsICpwcm90b19zdHIpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjbGFzcyBtdXN0IGRlZmluZSBhICdfdHlwZV8nIGF0dHJpYnV0ZSB3aGljaCBtdXN0IGJlXG4iCisgICAgICAgICAgICAgICAgICAgICAiYSBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZyBjb250YWluaW5nIG9uZSBvZiAnJXMnLiIsCisgICAgICAgICAgICAgICAgICAgICBTSU1QTEVfVFlQRV9DSEFSUyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGZtdCA9IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYyhQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pKTsKKyAgICBpZiAoZm10ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX3R5cGVfICclcycgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlzdGdkaWN0ID0gKFN0Z0RpY3RPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KAotCQkoUHlPYmplY3QgKikmUHlDU3RnRGljdF9UeXBlLCBOVUxMKTsKLQlpZiAoIXN0Z2RpY3QpCi0JCWdvdG8gZXJyb3I7CisgICAgc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKKyAgICAgICAgKFB5T2JqZWN0ICopJlB5Q1N0Z0RpY3RfVHlwZSwgTlVMTCk7CisgICAgaWYgKCFzdGdkaWN0KQorICAgICAgICBnb3RvIGVycm9yOwogCi0Jc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9ICpmbXQtPnBmZmlfdHlwZTsKLQlzdGdkaWN0LT5hbGlnbiA9IGZtdC0+cGZmaV90eXBlLT5hbGlnbm1lbnQ7Ci0Jc3RnZGljdC0+bGVuZ3RoID0gMDsKLQlzdGdkaWN0LT5zaXplID0gZm10LT5wZmZpX3R5cGUtPnNpemU7Ci0Jc3RnZGljdC0+c2V0ZnVuYyA9IGZtdC0+c2V0ZnVuYzsKLQlzdGdkaWN0LT5nZXRmdW5jID0gZm10LT5nZXRmdW5jOworICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSAqZm10LT5wZmZpX3R5cGU7CisgICAgc3RnZGljdC0+YWxpZ24gPSBmbXQtPnBmZmlfdHlwZS0+YWxpZ25tZW50OworICAgIHN0Z2RpY3QtPmxlbmd0aCA9IDA7CisgICAgc3RnZGljdC0+c2l6ZSA9IGZtdC0+cGZmaV90eXBlLT5zaXplOworICAgIHN0Z2RpY3QtPnNldGZ1bmMgPSBmbXQtPnNldGZ1bmM7CisgICAgc3RnZGljdC0+Z2V0ZnVuYyA9IGZtdC0+Z2V0ZnVuYzsKICNpZmRlZiBXT1JEU19CSUdFTkRJQU4KLQlzdGdkaWN0LT5mb3JtYXQgPSBfY3R5cGVzX2FsbG9jX2Zvcm1hdF9zdHJpbmcoIj4iLCBwcm90b19zdHIpOworICAgIHN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZygiPiIsIHByb3RvX3N0cik7CiAjZWxzZQotCXN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZygiPCIsIHByb3RvX3N0cik7CisgICAgc3RnZGljdC0+Zm9ybWF0ID0gX2N0eXBlc19hbGxvY19mb3JtYXRfc3RyaW5nKCI8IiwgcHJvdG9fc3RyKTsKICNlbmRpZgotCWlmIChzdGdkaWN0LT5mb3JtYXQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfREVDUkVGKHByb3RvKTsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYocHJvdG8pOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN0Z2RpY3QtPnBhcmFtZnVuYyA9IFB5Q1NpbXBsZVR5cGVfcGFyYW1mdW5jOworICAgIHN0Z2RpY3QtPnBhcmFtZnVuYyA9IFB5Q1NpbXBsZVR5cGVfcGFyYW1mdW5jOwogLyoKLQlpZiAocmVzdWx0LT50cF9iYXNlICE9ICZTaW1wbGVfVHlwZSkgewotCQlzdGdkaWN0LT5zZXRmdW5jID0gTlVMTDsKLQkJc3RnZGljdC0+Z2V0ZnVuYyA9IE5VTEw7Ci0JfQorICAgIGlmIChyZXN1bHQtPnRwX2Jhc2UgIT0gJlNpbXBsZV9UeXBlKSB7CisgICAgICAgIHN0Z2RpY3QtPnNldGZ1bmMgPSBOVUxMOworICAgICAgICBzdGdkaWN0LT5nZXRmdW5jID0gTlVMTDsKKyAgICB9CiAqLwogCi0JLyogVGhpcyBjb25zdW1lcyB0aGUgcmVmY291bnQgb24gcHJvdG8gd2hpY2ggd2UgaGF2ZSAqLwotCXN0Z2RpY3QtPnByb3RvID0gcHJvdG87CisgICAgLyogVGhpcyBjb25zdW1lcyB0aGUgcmVmY291bnQgb24gcHJvdG8gd2hpY2ggd2UgaGF2ZSAqLworICAgIHN0Z2RpY3QtPnByb3RvID0gcHJvdG87CiAKLQkvKiByZXBsYWNlIHRoZSBjbGFzcyBkaWN0IGJ5IG91ciB1cGRhdGVkIHNwYW0gZGljdCAqLwotCWlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKXN0Z2RpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOwotCXJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKXN0Z2RpY3Q7CisgICAgLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzcGFtIGRpY3QgKi8KKyAgICBpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKKyAgICByZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OwogCi0JLyogSW5zdGFsbCBmcm9tX3BhcmFtIGNsYXNzIG1ldGhvZHMgaW4gY3R5cGVzIGJhc2UgY2xhc3Nlcy4KLQkgICBPdmVycmlkZXMgdGhlIFB5Q1NpbXBsZVR5cGVfZnJvbV9wYXJhbSBnZW5lcmljIG1ldGhvZC4KLQkgKi8KLQlpZiAocmVzdWx0LT50cF9iYXNlID09ICZTaW1wbGVfVHlwZSkgewotCQlzd2l0Y2ggKFB5U3RyaW5nX0FTX1NUUklORyhwcm90bylbMF0pIHsKLQkJY2FzZSAneic6IC8qIGNfY2hhcl9wICovCi0JCQltbCA9ICZjX2NoYXJfcF9tZXRob2Q7Ci0JCQlzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7Ci0JCQlicmVhazsKLQkJY2FzZSAnWic6IC8qIGNfd2NoYXJfcCAqLwotCQkJbWwgPSAmY193Y2hhcl9wX21ldGhvZDsKLQkJCXN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKLQkJCWJyZWFrOwotCQljYXNlICdQJzogLyogY192b2lkX3AgKi8KLQkJCW1sID0gJmNfdm9pZF9wX21ldGhvZDsKLQkJCXN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKLQkJCWJyZWFrOwotCQljYXNlICdzJzoKLQkJY2FzZSAnWCc6Ci0JCWNhc2UgJ08nOgotCQkJbWwgPSBOVUxMOwotCQkJc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSVNQT0lOVEVSOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQltbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQkJCi0JCWlmIChtbCkgeworICAgIC8qIEluc3RhbGwgZnJvbV9wYXJhbSBjbGFzcyBtZXRob2RzIGluIGN0eXBlcyBiYXNlIGNsYXNzZXMuCisgICAgICAgT3ZlcnJpZGVzIHRoZSBQeUNTaW1wbGVUeXBlX2Zyb21fcGFyYW0gZ2VuZXJpYyBtZXRob2QuCisgICAgICovCisgICAgaWYgKHJlc3VsdC0+dHBfYmFzZSA9PSAmU2ltcGxlX1R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pWzBdKSB7CisgICAgICAgIGNhc2UgJ3onOiAvKiBjX2NoYXJfcCAqLworICAgICAgICAgICAgbWwgPSAmY19jaGFyX3BfbWV0aG9kOworICAgICAgICAgICAgc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSVNQT0lOVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1onOiAvKiBjX3djaGFyX3AgKi8KKyAgICAgICAgICAgIG1sID0gJmNfd2NoYXJfcF9tZXRob2Q7CisgICAgICAgICAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUCc6IC8qIGNfdm9pZF9wICovCisgICAgICAgICAgICBtbCA9ICZjX3ZvaWRfcF9tZXRob2Q7CisgICAgICAgICAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICBjYXNlICdPJzoKKyAgICAgICAgICAgIG1sID0gTlVMTDsKKyAgICAgICAgICAgIHN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWwpIHsKICNpZiAoUFlUSE9OX0FQSV9WRVJTSU9OID49IDEwMTIpCi0JCQlQeU9iamVjdCAqbWV0aDsKLQkJCWludCB4OwotCQkJbWV0aCA9IFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QocmVzdWx0LCBtbCk7Ci0JCQlpZiAoIW1ldGgpCi0JCQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqbWV0aDsKKyAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgbWV0aCA9IFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QocmVzdWx0LCBtbCk7CisgICAgICAgICAgICBpZiAoIW1ldGgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjZWxzZQogI2Vycm9yCi0JCQlQeU9iamVjdCAqbWV0aCwgKmZ1bmM7Ci0JCQlpbnQgeDsKLQkJCWZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcobWwsIE5VTEwpOwotCQkJaWYgKCFmdW5jKQotCQkJCXJldHVybiBOVUxMOwotCQkJbWV0aCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCi0JCQkJKFB5T2JqZWN0ICopJlB5Q2xhc3NNZXRob2RfVHlwZSwKLQkJCQlmdW5jLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihmdW5jKTsKLQkJCWlmICghbWV0aCkgewotCQkJCXJldHVybiBOVUxMOwotCQkJfQorICAgICAgICAgICAgUHlPYmplY3QgKm1ldGgsICpmdW5jOworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICBmdW5jID0gUHlDRnVuY3Rpb25fTmV3KG1sLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghZnVuYykKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIG1ldGggPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSZQeUNsYXNzTWV0aG9kX1R5cGUsCisgICAgICAgICAgICAgICAgZnVuYywgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICBpZiAoIW1ldGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJeCA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdC0+dHBfZGljdCwKLQkJCQkJCSBtbC0+bWxfbmFtZSwKLQkJCQkJCSBtZXRoKTsKLQkJCVB5X0RFQ1JFRihtZXRoKTsKLQkJCWlmICh4ID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICB4ID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcocmVzdWx0LT50cF9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sLT5tbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGgpOworICAgICAgICAgICAgUHlfREVDUkVGKG1ldGgpOworICAgICAgICAgICAgaWYgKHggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWlmICh0eXBlID09ICZQeUNTaW1wbGVUeXBlX1R5cGUgJiYgZm10LT5zZXRmdW5jX3N3YXBwZWQgJiYgZm10LT5nZXRmdW5jX3N3YXBwZWQpIHsKLQkJUHlPYmplY3QgKnN3YXBwZWQgPSBDcmVhdGVTd2FwcGVkVHlwZSh0eXBlLCBhcmdzLCBrd2RzLAotCQkJCQkJICAgICAgcHJvdG8sIGZtdCk7Ci0JCVN0Z0RpY3RPYmplY3QgKnN3X2RpY3Q7Ci0JCWlmIChzd2FwcGVkID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3dfZGljdCA9IFB5VHlwZV9zdGdkaWN0KHN3YXBwZWQpOworICAgIGlmICh0eXBlID09ICZQeUNTaW1wbGVUeXBlX1R5cGUgJiYgZm10LT5zZXRmdW5jX3N3YXBwZWQgJiYgZm10LT5nZXRmdW5jX3N3YXBwZWQpIHsKKyAgICAgICAgUHlPYmplY3QgKnN3YXBwZWQgPSBDcmVhdGVTd2FwcGVkVHlwZSh0eXBlLCBhcmdzLCBrd2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLCBmbXQpOworICAgICAgICBTdGdEaWN0T2JqZWN0ICpzd19kaWN0OworICAgICAgICBpZiAoc3dhcHBlZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN3X2RpY3QgPSBQeVR5cGVfc3RnZGljdChzd2FwcGVkKTsKICNpZmRlZiBXT1JEU19CSUdFTkRJQU4KLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2xlX18iLCBzd2FwcGVkKTsKLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2JlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwotCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2JlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwotCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2xlX18iLCBzd2FwcGVkKTsKLQkJLyogV2UgYXJlIGNyZWF0aW5nIHRoZSB0eXBlIGZvciB0aGUgT1RIRVIgZW5kaWFuICovCi0JCXN3X2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZygiPCIsIHN0Z2RpY3QtPmZvcm1hdCsxKTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2xlX18iLCBzd2FwcGVkKTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2JlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOworICAgICAgICBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2JlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOworICAgICAgICBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2xlX18iLCBzd2FwcGVkKTsKKyAgICAgICAgLyogV2UgYXJlIGNyZWF0aW5nIHRoZSB0eXBlIGZvciB0aGUgT1RIRVIgZW5kaWFuICovCisgICAgICAgIHN3X2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZygiPCIsIHN0Z2RpY3QtPmZvcm1hdCsxKTsKICNlbHNlCi0JCVB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9iZV9fIiwgc3dhcHBlZCk7Ci0JCVB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9sZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9sZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9iZV9fIiwgc3dhcHBlZCk7Ci0JCS8qIFdlIGFyZSBjcmVhdGluZyB0aGUgdHlwZSBmb3IgdGhlIE9USEVSIGVuZGlhbiAqLwotCQlzd19kaWN0LT5mb3JtYXQgPSBfY3R5cGVzX2FsbG9jX2Zvcm1hdF9zdHJpbmcoIj4iLCBzdGdkaWN0LT5mb3JtYXQrMSk7CisgICAgICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9iZV9fIiwgc3dhcHBlZCk7CisgICAgICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9sZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9sZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9iZV9fIiwgc3dhcHBlZCk7CisgICAgICAgIC8qIFdlIGFyZSBjcmVhdGluZyB0aGUgdHlwZSBmb3IgdGhlIE9USEVSIGVuZGlhbiAqLworICAgICAgICBzd19kaWN0LT5mb3JtYXQgPSBfY3R5cGVzX2FsbG9jX2Zvcm1hdF9zdHJpbmcoIj4iLCBzdGdkaWN0LT5mb3JtYXQrMSk7CiAjZW5kaWYKLQkJUHlfREVDUkVGKHN3YXBwZWQpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX07CisgICAgICAgIFB5X0RFQ1JFRihzd2FwcGVkKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCiAvKgpAQCAtMjA2MCwxMDEgKzIwNjAsMTAxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogUHlDU2ltcGxlVHlwZV9mcm9tX3BhcmFtKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQljaGFyICpmbXQ7Ci0JUHlDQXJnT2JqZWN0ICpwYXJnOwotCXN0cnVjdCBmaWVsZGRlc2MgKmZkOwotCVB5T2JqZWN0ICphc19wYXJhbWV0ZXI7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBjaGFyICpmbXQ7CisgICAgUHlDQXJnT2JqZWN0ICpwYXJnOworICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZkOworICAgIFB5T2JqZWN0ICphc19wYXJhbWV0ZXI7CiAKLQkvKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIHR5cGUsCi0JICAgd2UgY2FuIHVzZSBpdCBhcyBpcyAqLwotCWlmICgxID09IFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGUpKSB7Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9CisgICAgLyogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlcXVlc3RlZCB0eXBlLAorICAgICAgIHdlIGNhbiB1c2UgaXQgYXMgaXMgKi8KKyAgICBpZiAoMSA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQogCi0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwotCWFzc2VydChkaWN0KTsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7CisgICAgYXNzZXJ0KGRpY3QpOwogCi0JLyogSSB0aGluayB3ZSBjYW4gcmVseSBvbiB0aGlzIGJlaW5nIGEgb25lLWNoYXJhY3RlciBzdHJpbmcgKi8KLQlmbXQgPSBQeVN0cmluZ19Bc1N0cmluZyhkaWN0LT5wcm90byk7Ci0JYXNzZXJ0KGZtdCk7Ci0JCi0JZmQgPSBfY3R5cGVzX2dldF9maWVsZGRlc2MoZm10KTsKLQlhc3NlcnQoZmQpOwotCQotCXBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7Ci0JaWYgKHBhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogSSB0aGluayB3ZSBjYW4gcmVseSBvbiB0aGlzIGJlaW5nIGEgb25lLWNoYXJhY3RlciBzdHJpbmcgKi8KKyAgICBmbXQgPSBQeVN0cmluZ19Bc1N0cmluZyhkaWN0LT5wcm90byk7CisgICAgYXNzZXJ0KGZtdCk7CiAKLQlwYXJnLT50YWcgPSBmbXRbMF07Ci0JcGFyZy0+cGZmaV90eXBlID0gZmQtPnBmZmlfdHlwZTsKLQlwYXJnLT5vYmogPSBmZC0+c2V0ZnVuYygmcGFyZy0+dmFsdWUsIHZhbHVlLCAwKTsKLQlpZiAocGFyZy0+b2JqKQotCQlyZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKLQlQeUVycl9DbGVhcigpOwotCVB5X0RFQ1JFRihwYXJnKTsKKyAgICBmZCA9IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYyhmbXQpOworICAgIGFzc2VydChmZCk7CiAKLQlhc19wYXJhbWV0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiX2FzX3BhcmFtZXRlcl8iKTsKLQlpZiAoYXNfcGFyYW1ldGVyKSB7Ci0JCXZhbHVlID0gUHlDU2ltcGxlVHlwZV9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7Ci0JCVB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkid3JvbmcgdHlwZSIpOwotCXJldHVybiBOVUxMOworICAgIHBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7CisgICAgaWYgKHBhcmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBwYXJnLT50YWcgPSBmbXRbMF07CisgICAgcGFyZy0+cGZmaV90eXBlID0gZmQtPnBmZmlfdHlwZTsKKyAgICBwYXJnLT5vYmogPSBmZC0+c2V0ZnVuYygmcGFyZy0+dmFsdWUsIHZhbHVlLCAwKTsKKyAgICBpZiAocGFyZy0+b2JqKQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKKyAgICBQeUVycl9DbGVhcigpOworICAgIFB5X0RFQ1JFRihwYXJnKTsKKworICAgIGFzX3BhcmFtZXRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodmFsdWUsICJfYXNfcGFyYW1ldGVyXyIpOworICAgIGlmIChhc19wYXJhbWV0ZXIpIHsKKyAgICAgICAgdmFsdWUgPSBQeUNTaW1wbGVUeXBlX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKKyAgICAgICAgUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIHR5cGUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFB5Q1NpbXBsZVR5cGVfbWV0aG9kc1tdID0gewotCXsgImZyb21fcGFyYW0iLCBQeUNTaW1wbGVUeXBlX2Zyb21fcGFyYW0sIE1FVEhfTywgZnJvbV9wYXJhbV9kb2MgfSwKLQl7ICJmcm9tX2FkZHJlc3MiLCBDRGF0YVR5cGVfZnJvbV9hZGRyZXNzLCBNRVRIX08sIGZyb21fYWRkcmVzc19kb2MgfSwKLQl7ICJmcm9tX2J1ZmZlciIsIENEYXRhVHlwZV9mcm9tX2J1ZmZlciwgTUVUSF9WQVJBUkdTLCBmcm9tX2J1ZmZlcl9kb2MsIH0sCi0JeyAiZnJvbV9idWZmZXJfY29weSIsIENEYXRhVHlwZV9mcm9tX2J1ZmZlcl9jb3B5LCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2NvcHlfZG9jLCB9LAotCXsgImluX2RsbCIsIENEYXRhVHlwZV9pbl9kbGwsIE1FVEhfVkFSQVJHUywgaW5fZGxsX2RvY30sCi0JeyBOVUxMLCBOVUxMIH0sCisgICAgeyAiZnJvbV9wYXJhbSIsIFB5Q1NpbXBsZVR5cGVfZnJvbV9wYXJhbSwgTUVUSF9PLCBmcm9tX3BhcmFtX2RvYyB9LAorICAgIHsgImZyb21fYWRkcmVzcyIsIENEYXRhVHlwZV9mcm9tX2FkZHJlc3MsIE1FVEhfTywgZnJvbV9hZGRyZXNzX2RvYyB9LAorICAgIHsgImZyb21fYnVmZmVyIiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyLCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2RvYywgfSwKKyAgICB7ICJmcm9tX2J1ZmZlcl9jb3B5IiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyX2NvcHksIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfY29weV9kb2MsIH0sCisgICAgeyAiaW5fZGxsIiwgQ0RhdGFUeXBlX2luX2RsbCwgTUVUSF9WQVJBUkdTLCBpbl9kbGxfZG9jfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIFB5VHlwZU9iamVjdCBQeUNTaW1wbGVUeXBlX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jdHlwZXMuUHlDU2ltcGxlVHlwZSIsCQkJCS8qIHRwX25hbWUgKi8KLQkwLAkJCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCSAgICAgICAJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCSJtZXRhdHlwZSBmb3IgdGhlIFB5Q1NpbXBsZVR5cGUgT2JqZWN0cyIsCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JUHlDU2ltcGxlVHlwZV9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JUHlDU2ltcGxlVHlwZV9uZXcsCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuUHlDU2ltcGxlVHlwZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZDRGF0YVR5cGVfYXNfc2VxdWVuY2UsICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAibWV0YXR5cGUgZm9yIHRoZSBQeUNTaW1wbGVUeXBlIE9iamVjdHMiLCAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBQeUNTaW1wbGVUeXBlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlDU2ltcGxlVHlwZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIxNjUsMjIxICsyMTY1LDIyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbnZlcnRlcnNfZnJvbV9hcmd0eXBlcyhQeU9iamVjdCAqb2IpCiB7Ci0JUHlPYmplY3QgKmNvbnZlcnRlcnM7Ci0JUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3QgbkFyZ3M7CisgICAgUHlPYmplY3QgKmNvbnZlcnRlcnM7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgbkFyZ3M7CiAKLQlvYiA9IFB5U2VxdWVuY2VfVHVwbGUob2IpOyAvKiBuZXcgcmVmZXJlbmNlICovCi0JaWYgKCFvYikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfYXJndHlwZXNfIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiB0eXBlcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgb2IgPSBQeVNlcXVlbmNlX1R1cGxlKG9iKTsgLyogbmV3IHJlZmVyZW5jZSAqLworICAgIGlmICghb2IpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfYXJndHlwZXNfIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiB0eXBlcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQluQXJncyA9IFB5VHVwbGVfR0VUX1NJWkUob2IpOwotCWNvbnZlcnRlcnMgPSBQeVR1cGxlX05ldyhuQXJncyk7Ci0JaWYgKCFjb252ZXJ0ZXJzKQotCQlyZXR1cm4gTlVMTDsKLQkJCi0JLyogSSBoYXZlIHRvIGNoZWNrIGlmIHRoaXMgaXMgY29ycmVjdC4gVXNpbmcgY19jaGFyLCB3aGljaCBoYXMgYSBzaXplCi0JICAgb2YgMSwgd2lsbCBiZSBhc3N1bWVkIHRvIGJlIHB1c2hlZCBhcyBvbmx5IG9uZSBieXRlIQotCSAgIEFyZW4ndCB0aGVzZSBwcm9tb3RlZCB0byBpbnRlZ2VycyBieSB0aGUgQyBjb21waWxlciBhbmQgcHVzaGVkIGFzIDQgYnl0ZXM/Ci0JKi8KKyAgICBuQXJncyA9IFB5VHVwbGVfR0VUX1NJWkUob2IpOworICAgIGNvbnZlcnRlcnMgPSBQeVR1cGxlX05ldyhuQXJncyk7CisgICAgaWYgKCFjb252ZXJ0ZXJzKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBuQXJnczsgKytpKSB7Ci0JCVB5T2JqZWN0ICp0cCA9IFB5VHVwbGVfR0VUX0lURU0ob2IsIGkpOwotCQlQeU9iamVjdCAqY252ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0cCwgImZyb21fcGFyYW0iKTsKLQkJaWYgKCFjbnYpCi0JCQlnb3RvIGFyZ3R5cGVzX2Vycm9yXzE7Ci0JCVB5VHVwbGVfU0VUX0lURU0oY29udmVydGVycywgaSwgY252KTsKLQl9Ci0JUHlfREVDUkVGKG9iKTsKLQlyZXR1cm4gY29udmVydGVyczsKKyAgICAvKiBJIGhhdmUgdG8gY2hlY2sgaWYgdGhpcyBpcyBjb3JyZWN0LiBVc2luZyBjX2NoYXIsIHdoaWNoIGhhcyBhIHNpemUKKyAgICAgICBvZiAxLCB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgcHVzaGVkIGFzIG9ubHkgb25lIGJ5dGUhCisgICAgICAgQXJlbid0IHRoZXNlIHByb21vdGVkIHRvIGludGVnZXJzIGJ5IHRoZSBDIGNvbXBpbGVyIGFuZCBwdXNoZWQgYXMgNCBieXRlcz8KKyAgICAqLworCisgICAgZm9yIChpID0gMDsgaSA8IG5BcmdzOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKnRwID0gUHlUdXBsZV9HRVRfSVRFTShvYiwgaSk7CisgICAgICAgIFB5T2JqZWN0ICpjbnYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRwLCAiZnJvbV9wYXJhbSIpOworICAgICAgICBpZiAoIWNudikKKyAgICAgICAgICAgIGdvdG8gYXJndHlwZXNfZXJyb3JfMTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShjb252ZXJ0ZXJzLCBpLCBjbnYpOworICAgIH0KKyAgICBQeV9ERUNSRUYob2IpOworICAgIHJldHVybiBjb252ZXJ0ZXJzOwogCiAgIGFyZ3R5cGVzX2Vycm9yXzE6Ci0JUHlfWERFQ1JFRihjb252ZXJ0ZXJzKTsKLQlQeV9ERUNSRUYob2IpOwotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgUHlfWERFQ1JFRihjb252ZXJ0ZXJzKTsKKyAgICBQeV9ERUNSRUYob2IpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJICAgICAiaXRlbSAlZCBpbiBfYXJndHlwZXNfIGhhcyBubyBmcm9tX3BhcmFtIG1ldGhvZCIsCisgICAgICAgICAgICAgICAgICJpdGVtICVkIGluIF9hcmd0eXBlc18gaGFzIG5vIGZyb21fcGFyYW0gbWV0aG9kIiwKICNlbHNlCi0JCSAgICAgIml0ZW0gJXpkIGluIF9hcmd0eXBlc18gaGFzIG5vIGZyb21fcGFyYW0gbWV0aG9kIiwKKyAgICAgICAgICAgICAgICAgIml0ZW0gJXpkIGluIF9hcmd0eXBlc18gaGFzIG5vIGZyb21fcGFyYW0gbWV0aG9kIiwKICNlbmRpZgotCQkgICAgIGkrMSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgIGkrMSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIG1ha2VfZnVuY3B0cnR5cGVfZGljdChTdGdEaWN0T2JqZWN0ICpzdGdkaWN0KQogewotCVB5T2JqZWN0ICpvYjsKLQlQeU9iamVjdCAqY29udmVydGVycyA9IE5VTEw7CisgICAgUHlPYmplY3QgKm9iOworICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzID0gTlVMTDsKIAotCXN0Z2RpY3QtPmFsaWduID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJQIiktPnBmZmlfdHlwZS0+YWxpZ25tZW50OwotCXN0Z2RpY3QtPmxlbmd0aCA9IDE7Ci0Jc3RnZGljdC0+c2l6ZSA9IHNpemVvZih2b2lkICopOwotCXN0Z2RpY3QtPnNldGZ1bmMgPSBOVUxMOwotCXN0Z2RpY3QtPmdldGZ1bmMgPSBOVUxMOwotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOworICAgIHN0Z2RpY3QtPmFsaWduID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJQIiktPnBmZmlfdHlwZS0+YWxpZ25tZW50OworICAgIHN0Z2RpY3QtPmxlbmd0aCA9IDE7CisgICAgc3RnZGljdC0+c2l6ZSA9IHNpemVvZih2b2lkICopOworICAgIHN0Z2RpY3QtPnNldGZ1bmMgPSBOVUxMOworICAgIHN0Z2RpY3QtPmdldGZ1bmMgPSBOVUxMOworICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOwogCi0Jb2IgPSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilzdGdkaWN0LCAiX2ZsYWdzXyIpOwotCWlmICghb2IgfHwgIVB5SW50X0NoZWNrKG9iKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgImNsYXNzIG11c3QgZGVmaW5lIF9mbGFnc18gd2hpY2ggbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc3RnZGljdC0+ZmxhZ3MgPSBQeUludF9BU19MT05HKG9iKSB8IFRZUEVGTEFHX0lTUE9JTlRFUjsKKyAgICBvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfZmxhZ3NfIik7CisgICAgaWYgKCFvYiB8fCAhUHlJbnRfQ2hlY2sob2IpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiY2xhc3MgbXVzdCBkZWZpbmUgX2ZsYWdzXyB3aGljaCBtdXN0IGJlIGFuIGludGVnZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzdGdkaWN0LT5mbGFncyA9IFB5SW50X0FTX0xPTkcob2IpIHwgVFlQRUZMQUdfSVNQT0lOVEVSOwogCi0JLyogX2FyZ3R5cGVzXyBpcyBvcHRpb25hbC4uLiAqLwotCW9iID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopc3RnZGljdCwgIl9hcmd0eXBlc18iKTsKLQlpZiAob2IpIHsKLQkJY29udmVydGVycyA9IGNvbnZlcnRlcnNfZnJvbV9hcmd0eXBlcyhvYik7Ci0JCWlmICghY29udmVydGVycykKLQkJCWdvdG8gZXJyb3I7Ci0JCVB5X0lOQ1JFRihvYik7Ci0JCXN0Z2RpY3QtPmFyZ3R5cGVzID0gb2I7Ci0JCXN0Z2RpY3QtPmNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzOwotCX0KKyAgICAvKiBfYXJndHlwZXNfIGlzIG9wdGlvbmFsLi4uICovCisgICAgb2IgPSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilzdGdkaWN0LCAiX2FyZ3R5cGVzXyIpOworICAgIGlmIChvYikgeworICAgICAgICBjb252ZXJ0ZXJzID0gY29udmVydGVyc19mcm9tX2FyZ3R5cGVzKG9iKTsKKyAgICAgICAgaWYgKCFjb252ZXJ0ZXJzKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgUHlfSU5DUkVGKG9iKTsKKyAgICAgICAgc3RnZGljdC0+YXJndHlwZXMgPSBvYjsKKyAgICAgICAgc3RnZGljdC0+Y29udmVydGVycyA9IGNvbnZlcnRlcnM7CisgICAgfQogCi0Jb2IgPSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilzdGdkaWN0LCAiX3Jlc3R5cGVfIik7Ci0JaWYgKG9iKSB7Ci0JCWlmIChvYiAhPSBQeV9Ob25lICYmICFQeVR5cGVfc3RnZGljdChvYikgJiYgIVB5Q2FsbGFibGVfQ2hlY2sob2IpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfcmVzdHlwZV8gbXVzdCBiZSBhIHR5cGUsIGEgY2FsbGFibGUsIG9yIE5vbmUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9JTkNSRUYob2IpOwotCQlzdGdkaWN0LT5yZXN0eXBlID0gb2I7Ci0JCXN0Z2RpY3QtPmNoZWNrZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iLCAiX2NoZWNrX3JldHZhbF8iKTsKLQkJaWYgKHN0Z2RpY3QtPmNoZWNrZXIgPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JfQorICAgIG9iID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopc3RnZGljdCwgIl9yZXN0eXBlXyIpOworICAgIGlmIChvYikgeworICAgICAgICBpZiAob2IgIT0gUHlfTm9uZSAmJiAhUHlUeXBlX3N0Z2RpY3Qob2IpICYmICFQeUNhbGxhYmxlX0NoZWNrKG9iKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiX3Jlc3R5cGVfIG11c3QgYmUgYSB0eXBlLCBhIGNhbGxhYmxlLCBvciBOb25lIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKG9iKTsKKyAgICAgICAgc3RnZGljdC0+cmVzdHlwZSA9IG9iOworICAgICAgICBzdGdkaWN0LT5jaGVja2VyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYiwgIl9jaGVja19yZXR2YWxfIik7CisgICAgICAgIGlmIChzdGdkaWN0LT5jaGVja2VyID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KIC8qIFhYWCBsYXRlciwgbWF5YmUuCi0Jb2IgPSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilzdGdkaWN0LCAiX2VycmNoZWNrXyIpOwotCWlmIChvYikgewotCQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2sob2IpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfZXJyY2hlY2tfIG11c3QgYmUgY2FsbGFibGUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9JTkNSRUYob2IpOwotCQlzdGdkaWN0LT5lcnJjaGVjayA9IG9iOwotCX0KKyAgICBvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfZXJyY2hlY2tfIik7CisgICAgaWYgKG9iKSB7CisgICAgICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhvYikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIl9lcnJjaGVja18gbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihvYik7CisgICAgICAgIHN0Z2RpY3QtPmVycmNoZWNrID0gb2I7CisgICAgfQogKi8KLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIAogICBlcnJvcjoKLQlQeV9YREVDUkVGKGNvbnZlcnRlcnMpOwotCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKGNvbnZlcnRlcnMpOworICAgIHJldHVybiAtMTsKIAogfQogCiBzdGF0aWMgUHlDQXJnT2JqZWN0ICoKIFB5Q0Z1bmNQdHJUeXBlX3BhcmFtZnVuYyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JCi0JcGFyZyA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKLQlpZiAocGFyZyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlwYXJnLT50YWcgPSAnUCc7Ci0JcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXBhcmctPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7Ci0JcGFyZy0+dmFsdWUucCA9ICoodm9pZCAqKilzZWxmLT5iX3B0cjsKLQlyZXR1cm4gcGFyZzsJCisgICAgUHlDQXJnT2JqZWN0ICpwYXJnOworCisgICAgcGFyZyA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKKyAgICBpZiAocGFyZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHBhcmctPnRhZyA9ICdQJzsKKyAgICBwYXJnLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcGFyZy0+b2JqID0gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBwYXJnLT52YWx1ZS5wID0gKih2b2lkICoqKXNlbGYtPmJfcHRyOworICAgIHJldHVybiBwYXJnOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlDRnVuY1B0clR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5VHlwZU9iamVjdCAqcmVzdWx0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CisgICAgUHlUeXBlT2JqZWN0ICpyZXN1bHQ7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAotCXN0Z2RpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoCi0JCShQeU9iamVjdCAqKSZQeUNTdGdEaWN0X1R5cGUsIE5VTEwpOwotCWlmICghc3RnZGljdCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKKyAgICAgICAgKFB5T2JqZWN0ICopJlB5Q1N0Z0RpY3RfVHlwZSwgTlVMTCk7CisgICAgaWYgKCFzdGdkaWN0KQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0Z2RpY3QtPnBhcmFtZnVuYyA9IFB5Q0Z1bmNQdHJUeXBlX3BhcmFtZnVuYzsKLQkvKiBXZSBkbyBOT1QgZXhwb3NlIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaW4gdGhlIGZvcm1hdCBzdHJpbmcuICBJdAotCSAgIGlzIGltcG9zc2libGUsIGdlbmVyYWxseSwgYmVjYXVzZSB0aGUgb25seSByZXF1aXJlbWVudCBmb3IgdGhlCi0JICAgYXJndHlwZXMgaXRlbXMgaXMgdGhhdCB0aGV5IGhhdmUgYSAuZnJvbV9wYXJhbSBtZXRob2QgLSB3ZSBkbyBub3QKLQkgICBrbm93IHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIChhbHRob3VnaCwgaW4gcHJhY3RpY2UsIG1vc3QKLQkgICBhcmd0eXBlcyB3b3VsZCBiZSBhIGN0eXBlcyB0eXBlKS4KLQkqLwotCXN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiWHt9Iik7Ci0Jc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSVNQT0lOVEVSOworICAgIHN0Z2RpY3QtPnBhcmFtZnVuYyA9IFB5Q0Z1bmNQdHJUeXBlX3BhcmFtZnVuYzsKKyAgICAvKiBXZSBkbyBOT1QgZXhwb3NlIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaW4gdGhlIGZvcm1hdCBzdHJpbmcuICBJdAorICAgICAgIGlzIGltcG9zc2libGUsIGdlbmVyYWxseSwgYmVjYXVzZSB0aGUgb25seSByZXF1aXJlbWVudCBmb3IgdGhlCisgICAgICAgYXJndHlwZXMgaXRlbXMgaXMgdGhhdCB0aGV5IGhhdmUgYSAuZnJvbV9wYXJhbSBtZXRob2QgLSB3ZSBkbyBub3QKKyAgICAgICBrbm93IHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIChhbHRob3VnaCwgaW4gcHJhY3RpY2UsIG1vc3QKKyAgICAgICBhcmd0eXBlcyB3b3VsZCBiZSBhIGN0eXBlcyB0eXBlKS4KKyAgICAqLworICAgIHN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiWHt9Iik7CisgICAgc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSVNQT0lOVEVSOwogCi0JLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCi0JICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLwotCXJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAorICAgICAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KKyAgICByZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIHJlcGxhY2UgdGhlIGNsYXNzIGRpY3QgYnkgb3VyIHVwZGF0ZWQgc3RvcmFnZSBkaWN0ICovCi0JaWYgKC0xID09IFB5RGljdF9VcGRhdGUoKFB5T2JqZWN0ICopc3RnZGljdCwgcmVzdWx0LT50cF9kaWN0KSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfREVDUkVGKHJlc3VsdC0+dHBfZGljdCk7Ci0JcmVzdWx0LT50cF9kaWN0ID0gKFB5T2JqZWN0ICopc3RnZGljdDsKKyAgICAvKiByZXBsYWNlIHRoZSBjbGFzcyBkaWN0IGJ5IG91ciB1cGRhdGVkIHN0b3JhZ2UgZGljdCAqLworICAgIGlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKXN0Z2RpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOworICAgIHJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKXN0Z2RpY3Q7CiAKLQlpZiAoLTEgPT0gbWFrZV9mdW5jcHRydHlwZV9kaWN0KHN0Z2RpY3QpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKC0xID09IG1ha2VfZnVuY3B0cnR5cGVfZGljdChzdGdkaWN0KSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCiBQeVR5cGVPYmplY3QgUHlDRnVuY1B0clR5cGVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5QeUNGdW5jUHRyVHlwZSIsCQkJLyogdHBfbmFtZSAqLwotCTAsCQkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJICAgICAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCSJtZXRhdHlwZSBmb3IgQyBmdW5jdGlvbiBwb2ludGVycyIsCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhVHlwZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlDRGF0YVR5cGVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCVB5Q0Z1bmNQdHJUeXBlX25ldywJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLlB5Q0Z1bmNQdHJUeXBlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCisgICAgIm1ldGF0eXBlIGZvciBDIGZ1bmN0aW9uIHBvaW50ZXJzIiwgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKUNEYXRhVHlwZV90cmF2ZXJzZSwgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpQ0RhdGFUeXBlX2NsZWFyLCAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIENEYXRhVHlwZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeUNGdW5jUHRyVHlwZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIENvZGUgdG8ga2VlcCBuZWVkZWQgb2JqZWN0cyBhbGl2ZQogICovCkBAIC0yMzg3LDU0ICsyMzg3LDU0IEBACiBzdGF0aWMgQ0RhdGFPYmplY3QgKgogUHlDRGF0YV9HZXRDb250YWluZXIoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0Jd2hpbGUgKHNlbGYtPmJfYmFzZSkKLQkJc2VsZiA9IHNlbGYtPmJfYmFzZTsKLQlpZiAoc2VsZi0+Yl9vYmplY3RzID09IE5VTEwpIHsKLQkJaWYgKHNlbGYtPmJfbGVuZ3RoKSB7Ci0JCQlzZWxmLT5iX29iamVjdHMgPSBQeURpY3RfTmV3KCk7Ci0JCX0gZWxzZSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlzZWxmLT5iX29iamVjdHMgPSBQeV9Ob25lOwotCQl9Ci0JfQotCXJldHVybiBzZWxmOworICAgIHdoaWxlIChzZWxmLT5iX2Jhc2UpCisgICAgICAgIHNlbGYgPSBzZWxmLT5iX2Jhc2U7CisgICAgaWYgKHNlbGYtPmJfb2JqZWN0cyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChzZWxmLT5iX2xlbmd0aCkgeworICAgICAgICAgICAgc2VsZi0+Yl9vYmplY3RzID0gUHlEaWN0X05ldygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgc2VsZi0+Yl9vYmplY3RzID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEdldEtlZXBlZE9iamVjdHMoQ0RhdGFPYmplY3QgKnRhcmdldCkKIHsKLQlyZXR1cm4gUHlDRGF0YV9HZXRDb250YWluZXIodGFyZ2V0KS0+Yl9vYmplY3RzOworICAgIHJldHVybiBQeUNEYXRhX0dldENvbnRhaW5lcih0YXJnZXQpLT5iX29iamVjdHM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmlxdWVfa2V5KENEYXRhT2JqZWN0ICp0YXJnZXQsIFB5X3NzaXplX3QgaW5kZXgpCiB7Ci0JY2hhciBzdHJpbmdbMjU2XTsKLQljaGFyICpjcCA9IHN0cmluZzsKLQlzaXplX3QgYnl0ZXNfbGVmdDsKKyAgICBjaGFyIHN0cmluZ1syNTZdOworICAgIGNoYXIgKmNwID0gc3RyaW5nOworICAgIHNpemVfdCBieXRlc19sZWZ0OwogCi0JYXNzZXJ0KHNpemVvZihzdHJpbmcpIC0gMSA+IHNpemVvZihQeV9zc2l6ZV90KSAqIDIpOworICAgIGFzc2VydChzaXplb2Yoc3RyaW5nKSAtIDEgPiBzaXplb2YoUHlfc3NpemVfdCkgKiAyKTsKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCWNwICs9IHNwcmludGYoY3AsICIleCIsIGluZGV4KTsKKyAgICBjcCArPSBzcHJpbnRmKGNwLCAiJXgiLCBpbmRleCk7CiAjZWxzZQotCWNwICs9IHNwcmludGYoY3AsICIleCIsIFB5X1NBRkVfRE9XTkNBU1QoaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOworICAgIGNwICs9IHNwcmludGYoY3AsICIleCIsIFB5X1NBRkVfRE9XTkNBU1QoaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOwogI2VuZGlmCi0Jd2hpbGUgKHRhcmdldC0+Yl9iYXNlKSB7Ci0JCWJ5dGVzX2xlZnQgPSBzaXplb2Yoc3RyaW5nKSAtIChjcCAtIHN0cmluZykgLSAxOwotCQkvKiBIZXggZm9ybWF0IG5lZWRzIDIgY2hhcmFjdGVycyBwZXIgYnl0ZSAqLwotCQlpZiAoYnl0ZXNfbGVmdCA8IHNpemVvZihQeV9zc2l6ZV90KSAqIDIpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiY3R5cGVzIG9iamVjdCBzdHJ1Y3R1cmUgdG9vIGRlZXAiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgd2hpbGUgKHRhcmdldC0+Yl9iYXNlKSB7CisgICAgICAgIGJ5dGVzX2xlZnQgPSBzaXplb2Yoc3RyaW5nKSAtIChjcCAtIHN0cmluZykgLSAxOworICAgICAgICAvKiBIZXggZm9ybWF0IG5lZWRzIDIgY2hhcmFjdGVycyBwZXIgYnl0ZSAqLworICAgICAgICBpZiAoYnl0ZXNfbGVmdCA8IHNpemVvZihQeV9zc2l6ZV90KSAqIDIpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdHlwZXMgb2JqZWN0IHN0cnVjdHVyZSB0b28gZGVlcCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCQljcCArPSBzcHJpbnRmKGNwLCAiOiV4IiwgKGludCl0YXJnZXQtPmJfaW5kZXgpOworICAgICAgICBjcCArPSBzcHJpbnRmKGNwLCAiOiV4IiwgKGludCl0YXJnZXQtPmJfaW5kZXgpOwogI2Vsc2UKLQkJY3AgKz0gc3ByaW50ZihjcCwgIjoleCIsIFB5X1NBRkVfRE9XTkNBU1QodGFyZ2V0LT5iX2luZGV4LCBQeV9zc2l6ZV90LCBpbnQpKTsKKyAgICAgICAgY3AgKz0gc3ByaW50ZihjcCwgIjoleCIsIFB5X1NBRkVfRE9XTkNBU1QodGFyZ2V0LT5iX2luZGV4LCBQeV9zc2l6ZV90LCBpbnQpKTsKICNlbmRpZgotCQl0YXJnZXQgPSB0YXJnZXQtPmJfYmFzZTsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0cmluZywgY3Atc3RyaW5nKTsKKyAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LT5iX2Jhc2U7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdHJpbmcsIGNwLXN0cmluZyk7CiB9CiAKIC8qCkBAIC0yNDU4LDMwICsyNDU4LDMwIEBACiBzdGF0aWMgaW50CiBLZWVwUmVmKENEYXRhT2JqZWN0ICp0YXJnZXQsIFB5X3NzaXplX3QgaW5kZXgsIFB5T2JqZWN0ICprZWVwKQogewotCWludCByZXN1bHQ7Ci0JQ0RhdGFPYmplY3QgKm9iOwotCVB5T2JqZWN0ICprZXk7CisgICAgaW50IHJlc3VsdDsKKyAgICBDRGF0YU9iamVjdCAqb2I7CisgICAgUHlPYmplY3QgKmtleTsKIAogLyogT3B0aW1pemF0aW9uOiBubyBuZWVkIHRvIHN0b3JlIE5vbmUgKi8KLQlpZiAoa2VlcCA9PSBQeV9Ob25lKSB7Ci0JCVB5X0RFQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW9iID0gUHlDRGF0YV9HZXRDb250YWluZXIodGFyZ2V0KTsKLQlpZiAob2ItPmJfb2JqZWN0cyA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2tFeGFjdChvYi0+Yl9vYmplY3RzKSkgewotCQlQeV9YREVDUkVGKG9iLT5iX29iamVjdHMpOwotCQlvYi0+Yl9vYmplY3RzID0ga2VlcDsgLyogcmVmY291bnQgY29uc3VtZWQgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCWtleSA9IHVuaXF1ZV9rZXkodGFyZ2V0LCBpbmRleCk7Ci0JaWYgKGtleSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihrZWVwKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXN1bHQgPSBQeURpY3RfU2V0SXRlbShvYi0+Yl9vYmplY3RzLCBrZXksIGtlZXApOwotCVB5X0RFQ1JFRihrZXkpOwotCVB5X0RFQ1JFRihrZWVwKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChrZWVwID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2IgPSBQeUNEYXRhX0dldENvbnRhaW5lcih0YXJnZXQpOworICAgIGlmIChvYi0+Yl9vYmplY3RzID09IE5VTEwgfHwgIVB5RGljdF9DaGVja0V4YWN0KG9iLT5iX29iamVjdHMpKSB7CisgICAgICAgIFB5X1hERUNSRUYob2ItPmJfb2JqZWN0cyk7CisgICAgICAgIG9iLT5iX29iamVjdHMgPSBrZWVwOyAvKiByZWZjb3VudCBjb25zdW1lZCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAga2V5ID0gdW5pcXVlX2tleSh0YXJnZXQsIGluZGV4KTsKKyAgICBpZiAoa2V5ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGtlZXApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlc3VsdCA9IFB5RGljdF9TZXRJdGVtKG9iLT5iX29iamVjdHMsIGtleSwga2VlcCk7CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgUHlfREVDUkVGKGtlZXApOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNDkxLDEwMCArMjQ5MSwxMDAgQEAKIHN0YXRpYyBpbnQKIFB5Q0RhdGFfdHJhdmVyc2UoQ0RhdGFPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNlbGYtPmJfb2JqZWN0cyk7Ci0JUHlfVklTSVQoKFB5T2JqZWN0ICopc2VsZi0+Yl9iYXNlKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChzZWxmLT5iX29iamVjdHMpOworICAgIFB5X1ZJU0lUKChQeU9iamVjdCAqKXNlbGYtPmJfYmFzZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFB5Q0RhdGFfY2xlYXIoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCi0JUHlfQ0xFQVIoc2VsZi0+Yl9vYmplY3RzKTsKLQlpZiAoKHNlbGYtPmJfbmVlZHNmcmVlKQotCSAgICAmJiAoKHNpemVfdClkaWN0LT5zaXplID4gc2l6ZW9mKHNlbGYtPmJfdmFsdWUpKSkKLQkJUHlNZW1fRnJlZShzZWxmLT5iX3B0cik7Ci0Jc2VsZi0+Yl9wdHIgPSBOVUxMOwotCVB5X0NMRUFSKHNlbGYtPmJfYmFzZSk7Ci0JcmV0dXJuIDA7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCisgICAgUHlfQ0xFQVIoc2VsZi0+Yl9vYmplY3RzKTsKKyAgICBpZiAoKHNlbGYtPmJfbmVlZHNmcmVlKQorICAgICAgICAmJiAoKHNpemVfdClkaWN0LT5zaXplID4gc2l6ZW9mKHNlbGYtPmJfdmFsdWUpKSkKKyAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5iX3B0cik7CisgICAgc2VsZi0+Yl9wdHIgPSBOVUxMOworICAgIFB5X0NMRUFSKHNlbGYtPmJfYmFzZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBQeUNEYXRhX2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlDRGF0YV9jbGVhcigoQ0RhdGFPYmplY3QgKilzZWxmKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOworICAgIFB5Q0RhdGFfY2xlYXIoKENEYXRhT2JqZWN0ICopc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5TWVtYmVyRGVmIFB5Q0RhdGFfbWVtYmVyc1tdID0gewotCXsgIl9iX2Jhc2VfIiwgVF9PQkpFQ1QsCi0JICBvZmZzZXRvZihDRGF0YU9iamVjdCwgYl9iYXNlKSwgUkVBRE9OTFksCi0JICAidGhlIGJhc2Ugb2JqZWN0IiB9LAotCXsgIl9iX25lZWRzZnJlZV8iLCBUX0lOVCwKLQkgIG9mZnNldG9mKENEYXRhT2JqZWN0LCBiX25lZWRzZnJlZSksIFJFQURPTkxZLAotCSAgIndoZXRoZXIgdGhlIG9iamVjdCBvd25zIHRoZSBtZW1vcnkgb3Igbm90IiB9LAotCXsgIl9vYmplY3RzIiwgVF9PQkpFQ1QsCi0JICBvZmZzZXRvZihDRGF0YU9iamVjdCwgYl9vYmplY3RzKSwgUkVBRE9OTFksCi0JICAiaW50ZXJuYWwgb2JqZWN0cyB0cmVlIChORVZFUiBDSEFOR0UgVEhJUyBPQkpFQ1QhKSJ9LAotCXsgTlVMTCB9LAorICAgIHsgIl9iX2Jhc2VfIiwgVF9PQkpFQ1QsCisgICAgICBvZmZzZXRvZihDRGF0YU9iamVjdCwgYl9iYXNlKSwgUkVBRE9OTFksCisgICAgICAidGhlIGJhc2Ugb2JqZWN0IiB9LAorICAgIHsgIl9iX25lZWRzZnJlZV8iLCBUX0lOVCwKKyAgICAgIG9mZnNldG9mKENEYXRhT2JqZWN0LCBiX25lZWRzZnJlZSksIFJFQURPTkxZLAorICAgICAgIndoZXRoZXIgdGhlIG9iamVjdCBvd25zIHRoZSBtZW1vcnkgb3Igbm90IiB9LAorICAgIHsgIl9vYmplY3RzIiwgVF9PQkpFQ1QsCisgICAgICBvZmZzZXRvZihDRGF0YU9iamVjdCwgYl9vYmplY3RzKSwgUkVBRE9OTFksCisgICAgICAiaW50ZXJuYWwgb2JqZWN0cyB0cmVlIChORVZFUiBDSEFOR0UgVEhJUyBPQkpFQ1QhKSJ9LAorICAgIHsgTlVMTCB9LAogfTsKIAogI2lmIChQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDYwMDAwKQogc3RhdGljIGludCBQeUNEYXRhX05ld0dldEJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5X2J1ZmZlciAqdmlldywgaW50IGZsYWdzKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoX3NlbGYpOwotCVB5X3NzaXplX3QgaTsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KF9zZWxmKTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAodmlldyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICBpZiAodmlldyA9PSBOVUxMKSByZXR1cm4gMDsKIAotCXZpZXctPmJ1ZiA9IHNlbGYtPmJfcHRyOwotCXZpZXctPm9iaiA9IF9zZWxmOwotCVB5X0lOQ1JFRihfc2VsZik7Ci0Jdmlldy0+bGVuID0gc2VsZi0+Yl9zaXplOwotCXZpZXctPnJlYWRvbmx5ID0gMDsKLQkvKiB1c2UgZGVmYXVsdCBmb3JtYXQgY2hhcmFjdGVyIGlmIG5vdCBzZXQgKi8KLQl2aWV3LT5mb3JtYXQgPSBkaWN0LT5mb3JtYXQgPyBkaWN0LT5mb3JtYXQgOiAiQiI7Ci0Jdmlldy0+bmRpbSA9IGRpY3QtPm5kaW07Ci0Jdmlldy0+c2hhcGUgPSBkaWN0LT5zaGFwZTsKLQl2aWV3LT5pdGVtc2l6ZSA9IHNlbGYtPmJfc2l6ZTsKLQlmb3IgKGkgPSAwOyBpIDwgdmlldy0+bmRpbTsgKytpKSB7Ci0JCXZpZXctPml0ZW1zaXplIC89IGRpY3QtPnNoYXBlW2ldOwotCX0KLQl2aWV3LT5zdHJpZGVzID0gTlVMTDsKLQl2aWV3LT5zdWJvZmZzZXRzID0gTlVMTDsKLQl2aWV3LT5pbnRlcm5hbCA9IE5VTEw7Ci0JcmV0dXJuIDA7CisgICAgdmlldy0+YnVmID0gc2VsZi0+Yl9wdHI7CisgICAgdmlldy0+b2JqID0gX3NlbGY7CisgICAgUHlfSU5DUkVGKF9zZWxmKTsKKyAgICB2aWV3LT5sZW4gPSBzZWxmLT5iX3NpemU7CisgICAgdmlldy0+cmVhZG9ubHkgPSAwOworICAgIC8qIHVzZSBkZWZhdWx0IGZvcm1hdCBjaGFyYWN0ZXIgaWYgbm90IHNldCAqLworICAgIHZpZXctPmZvcm1hdCA9IGRpY3QtPmZvcm1hdCA/IGRpY3QtPmZvcm1hdCA6ICJCIjsKKyAgICB2aWV3LT5uZGltID0gZGljdC0+bmRpbTsKKyAgICB2aWV3LT5zaGFwZSA9IGRpY3QtPnNoYXBlOworICAgIHZpZXctPml0ZW1zaXplID0gc2VsZi0+Yl9zaXplOworICAgIGZvciAoaSA9IDA7IGkgPCB2aWV3LT5uZGltOyArK2kpIHsKKyAgICAgICAgdmlldy0+aXRlbXNpemUgLz0gZGljdC0+c2hhcGVbaV07CisgICAgfQorICAgIHZpZXctPnN0cmlkZXMgPSBOVUxMOworICAgIHZpZXctPnN1Ym9mZnNldHMgPSBOVUxMOworICAgIHZpZXctPmludGVybmFsID0gTlVMTDsKKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlfc3NpemVfdCBQeUNEYXRhX0dldFNlZ2NvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCAqbGVucCkKIHsKLQlpZiAobGVucCkKLQkJKmxlbnAgPSAxOwotCXJldHVybiAxOworICAgIGlmIChsZW5wKQorICAgICAgICAqbGVucCA9IDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90IFB5Q0RhdGFfR2V0QnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBzZWcsIHZvaWQgKipwcHRyKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JaWYgKHNlZyAhPSAwKSB7Ci0JCS8qIEhtLiBNdXN0IHRoaXMgc2V0IGFuIGV4Y2VwdGlvbj8gKi8KLQkJcmV0dXJuIC0xOwotCX0KLQkqcHB0ciA9IHNlbGYtPmJfcHRyOwotCXJldHVybiBzZWxmLT5iX3NpemU7CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBpZiAoc2VnICE9IDApIHsKKyAgICAgICAgLyogSG0uIE11c3QgdGhpcyBzZXQgYW4gZXhjZXB0aW9uPyAqLworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpwcHRyID0gc2VsZi0+Yl9wdHI7CisgICAgcmV0dXJuIHNlbGYtPmJfc2l6ZTsKIH0KIAogc3RhdGljIFB5QnVmZmVyUHJvY3MgUHlDRGF0YV9hc19idWZmZXIgPSB7Ci0JKHJlYWRidWZmZXJwcm9jKVB5Q0RhdGFfR2V0QnVmZmVyLAotCSh3cml0ZWJ1ZmZlcnByb2MpUHlDRGF0YV9HZXRCdWZmZXIsCi0JKHNlZ2NvdW50cHJvYylQeUNEYXRhX0dldFNlZ2NvdW50LAotCShjaGFyYnVmZmVycHJvYylOVUxMLAorICAgIChyZWFkYnVmZmVycHJvYylQeUNEYXRhX0dldEJ1ZmZlciwKKyAgICAod3JpdGVidWZmZXJwcm9jKVB5Q0RhdGFfR2V0QnVmZmVyLAorICAgIChzZWdjb3VudHByb2MpUHlDRGF0YV9HZXRTZWdjb3VudCwKKyAgICAoY2hhcmJ1ZmZlcnByb2MpTlVMTCwKICNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA2MDAwMCkKLQkoZ2V0YnVmZmVycHJvYylQeUNEYXRhX05ld0dldEJ1ZmZlciwKLQkocmVsZWFzZWJ1ZmZlcnByb2MpTlVMTCwKKyAgICAoZ2V0YnVmZmVycHJvYylQeUNEYXRhX05ld0dldEJ1ZmZlciwKKyAgICAocmVsZWFzZWJ1ZmZlcnByb2MpTlVMTCwKICNlbmRpZgogfTsKIApAQCAtMjU5NCw0NyArMjU5NCw0NyBAQAogc3RhdGljIGxvbmcKIFB5Q0RhdGFfbm9oYXNoKFB5T2JqZWN0ICpzZWxmKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bmhhc2hhYmxlIHR5cGUiKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInVuaGFzaGFibGUgdHlwZSIpOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q0RhdGFfcmVkdWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCi0JaWYgKFB5T2JqZWN0X3N0Z2RpY3QoX3NlbGYpLT5mbGFncyAmIChUWVBFRkxBR19JU1BPSU5URVJ8VFlQRUZMQUdfSEFTUE9JTlRFUikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImN0eXBlcyBvYmplY3RzIGNvbnRhaW5pbmcgcG9pbnRlcnMgY2Fubm90IGJlIHBpY2tsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE8oTk4pKSIsCi0JCQkgICAgIF91bnBpY2tsZSwKLQkJCSAgICAgUHlfVFlQRShfc2VsZiksCi0JCQkgICAgIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoX3NlbGYsICJfX2RpY3RfXyIpLAotCQkJICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKSk7CisgICAgaWYgKFB5T2JqZWN0X3N0Z2RpY3QoX3NlbGYpLT5mbGFncyAmIChUWVBFRkxBR19JU1BPSU5URVJ8VFlQRUZMQUdfSEFTUE9JTlRFUikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3R5cGVzIG9iamVjdHMgY29udGFpbmluZyBwb2ludGVycyBjYW5ub3QgYmUgcGlja2xlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oTyhOTikpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfdW5waWNrbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShfc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfR2V0QXR0clN0cmluZyhfc2VsZiwgIl9fZGljdF9fIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+Yl9wdHIsIHNlbGYtPmJfc2l6ZSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlDRGF0YV9zZXRzdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmRhdGE7Ci0JUHlfc3NpemVfdCBsZW47Ci0JaW50IHJlczsKLQlQeU9iamVjdCAqZGljdCwgKm15ZGljdDsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3MjIiwgJmRpY3QsICZkYXRhLCAmbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGxlbiA+IHNlbGYtPmJfc2l6ZSkKLQkJbGVuID0gc2VsZi0+Yl9zaXplOwotCW1lbW1vdmUoc2VsZi0+Yl9wdHIsIGRhdGEsIGxlbik7Ci0JbXlkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhfc2VsZiwgIl9fZGljdF9fIik7Ci0JcmVzID0gUHlEaWN0X1VwZGF0ZShteWRpY3QsIGRpY3QpOwotCVB5X0RFQ1JFRihteWRpY3QpOwotCWlmIChyZXMgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICB2b2lkICpkYXRhOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKmRpY3QsICpteWRpY3Q7CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zIyIsICZkaWN0LCAmZGF0YSwgJmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChsZW4gPiBzZWxmLT5iX3NpemUpCisgICAgICAgIGxlbiA9IHNlbGYtPmJfc2l6ZTsKKyAgICBtZW1tb3ZlKHNlbGYtPmJfcHRyLCBkYXRhLCBsZW4pOworICAgIG15ZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoX3NlbGYsICJfX2RpY3RfXyIpOworICAgIHJlcyA9IFB5RGljdF9VcGRhdGUobXlkaWN0LCBkaWN0KTsKKyAgICBQeV9ERUNSRUYobXlkaWN0KTsKKyAgICBpZiAocmVzID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qCkBAIC0yNjQzLDEyNCArMjY0MywxMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNEYXRhX2Zyb21fb3V0cGFyYW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X0lOQ1JFRihzZWxmKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBQeUNEYXRhX21ldGhvZHNbXSA9IHsKLQl7ICJfX2N0eXBlc19mcm9tX291dHBhcmFtX18iLCBQeUNEYXRhX2Zyb21fb3V0cGFyYW0sIE1FVEhfTk9BUkdTLCB9LAotCXsgIl9fcmVkdWNlX18iLCBQeUNEYXRhX3JlZHVjZSwgTUVUSF9OT0FSR1MsIH0sCi0JeyAiX19zZXRzdGF0ZV9fIiwgUHlDRGF0YV9zZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLCB9LAotCXsgTlVMTCwgTlVMTCB9LAorICAgIHsgIl9fY3R5cGVzX2Zyb21fb3V0cGFyYW1fXyIsIFB5Q0RhdGFfZnJvbV9vdXRwYXJhbSwgTUVUSF9OT0FSR1MsIH0sCisgICAgeyAiX19yZWR1Y2VfXyIsIFB5Q0RhdGFfcmVkdWNlLCBNRVRIX05PQVJHUywgfSwKKyAgICB7ICJfX3NldHN0YXRlX18iLCBQeUNEYXRhX3NldHN0YXRlLCBNRVRIX1ZBUkFSR1MsIH0sCisgICAgeyBOVUxMLCBOVUxMIH0sCiB9OwogCiBQeVR5cGVPYmplY3QgUHlDRGF0YV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLl9DRGF0YSIsCi0Jc2l6ZW9mKENEYXRhT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQlQeUNEYXRhX2RlYWxsb2MsCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCVB5Q0RhdGFfbm9oYXNoLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJlB5Q0RhdGFfYXNfYnVmZmVyLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCSJYWFggdG8gYmUgcHJvdmlkZWQiLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpUHlDRGF0YV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpUHlDRGF0YV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JUHlDRGF0YV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JUHlDRGF0YV9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5fQ0RhdGEiLAorICAgIHNpemVvZihDRGF0YU9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIFB5Q0RhdGFfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIFB5Q0RhdGFfbm9oYXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAmUHlDRGF0YV9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgICJYWFggdG8gYmUgcHJvdmlkZWQiLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylQeUNEYXRhX3RyYXZlcnNlLCAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KVB5Q0RhdGFfY2xlYXIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBQeUNEYXRhX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5Q0RhdGFfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBzdGF0aWMgaW50IFB5Q0RhdGFfTWFsbG9jQnVmZmVyKENEYXRhT2JqZWN0ICpvYmosIFN0Z0RpY3RPYmplY3QgKmRpY3QpCiB7Ci0JaWYgKChzaXplX3QpZGljdC0+c2l6ZSA8PSBzaXplb2Yob2JqLT5iX3ZhbHVlKSkgewotCQkvKiBObyBuZWVkIHRvIGNhbGwgbWFsbG9jLCBjYW4gdXNlIHRoZSBkZWZhdWx0IGJ1ZmZlciAqLwotCQlvYmotPmJfcHRyID0gKGNoYXIgKikmb2JqLT5iX3ZhbHVlOwotCQkvKiBUaGUgYl9uZWVkc2ZyZWUgZmxhZyBkb2VzIG5vdCBtZWFuIHRoYXQgd2UgYWN0dWFsbHkgZGlkCi0JCSAgIGNhbGwgUHlNZW1fTWFsbG9jIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgYmxvY2s7IGluc3RlYWQgaXQKLQkJICAgbWVhbnMgd2UgYXJlIHRoZSAqb3duZXIqIG9mIHRoZSBtZW1vcnkgYW5kIGFyZSByZXNwb25zaWJsZQotCQkgICBmb3IgZnJlZWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW1vcnkuICBUaGlzIGlzCi0JCSAgIGFsc28gdGhlIHJlYXNvbiB0aGF0IGJfbmVlZHNmcmVlIGlzIGV4cG9zZWQgdG8gUHl0aG9uLgotCQkgKi8KLQkJb2JqLT5iX25lZWRzZnJlZSA9IDE7Ci0JfSBlbHNlIHsKLQkJLyogSW4gcHl0aG9uIDIuNCwgYW5kIGN0eXBlcyAwLjkuNiwgdGhlIG1hbGxvYyBjYWxsIHRvb2sgYWJvdXQKLQkJICAgMzMlIG9mIHRoZSBjcmVhdGlvbiB0aW1lIGZvciBjX2ludCgpLgotCQkqLwotCQlvYmotPmJfcHRyID0gKGNoYXIgKilQeU1lbV9NYWxsb2MoZGljdC0+c2l6ZSk7Ci0JCWlmIChvYmotPmJfcHRyID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJb2JqLT5iX25lZWRzZnJlZSA9IDE7Ci0JCW1lbXNldChvYmotPmJfcHRyLCAwLCBkaWN0LT5zaXplKTsKLQl9Ci0Jb2JqLT5iX3NpemUgPSBkaWN0LT5zaXplOwotCXJldHVybiAwOworICAgIGlmICgoc2l6ZV90KWRpY3QtPnNpemUgPD0gc2l6ZW9mKG9iai0+Yl92YWx1ZSkpIHsKKyAgICAgICAgLyogTm8gbmVlZCB0byBjYWxsIG1hbGxvYywgY2FuIHVzZSB0aGUgZGVmYXVsdCBidWZmZXIgKi8KKyAgICAgICAgb2JqLT5iX3B0ciA9IChjaGFyICopJm9iai0+Yl92YWx1ZTsKKyAgICAgICAgLyogVGhlIGJfbmVlZHNmcmVlIGZsYWcgZG9lcyBub3QgbWVhbiB0aGF0IHdlIGFjdHVhbGx5IGRpZAorICAgICAgICAgICBjYWxsIFB5TWVtX01hbGxvYyB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IGJsb2NrOyBpbnN0ZWFkIGl0CisgICAgICAgICAgIG1lYW5zIHdlIGFyZSB0aGUgKm93bmVyKiBvZiB0aGUgbWVtb3J5IGFuZCBhcmUgcmVzcG9uc2libGUKKyAgICAgICAgICAgZm9yIGZyZWVpbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVtb3J5LiAgVGhpcyBpcworICAgICAgICAgICBhbHNvIHRoZSByZWFzb24gdGhhdCBiX25lZWRzZnJlZSBpcyBleHBvc2VkIHRvIFB5dGhvbi4KKyAgICAgICAgICovCisgICAgICAgIG9iai0+Yl9uZWVkc2ZyZWUgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEluIHB5dGhvbiAyLjQsIGFuZCBjdHlwZXMgMC45LjYsIHRoZSBtYWxsb2MgY2FsbCB0b29rIGFib3V0CisgICAgICAgICAgIDMzJSBvZiB0aGUgY3JlYXRpb24gdGltZSBmb3IgY19pbnQoKS4KKyAgICAgICAgKi8KKyAgICAgICAgb2JqLT5iX3B0ciA9IChjaGFyICopUHlNZW1fTWFsbG9jKGRpY3QtPnNpemUpOworICAgICAgICBpZiAob2JqLT5iX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG9iai0+Yl9uZWVkc2ZyZWUgPSAxOworICAgICAgICBtZW1zZXQob2JqLT5iX3B0ciwgMCwgZGljdC0+c2l6ZSk7CisgICAgfQorICAgIG9iai0+Yl9zaXplID0gZGljdC0+c2l6ZTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlPYmplY3QgKgogUHlDRGF0YV9Gcm9tQmFzZU9iaihQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmJhc2UsIFB5X3NzaXplX3QgaW5kZXgsIGNoYXIgKmFkcikKIHsKLQlDRGF0YU9iamVjdCAqY21lbTsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIENEYXRhT2JqZWN0ICpjbWVtOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CiAKLQlhc3NlcnQoUHlUeXBlX0NoZWNrKHR5cGUpKTsKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JaWYgKCFkaWN0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFic3RyYWN0IGNsYXNzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsKLQljbWVtID0gKENEYXRhT2JqZWN0ICopKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfYWxsb2MoKFB5VHlwZU9iamVjdCAqKXR5cGUsIDApOwotCWlmIChjbWVtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChDRGF0YU9iamVjdF9DaGVjayhjbWVtKSk7CisgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayh0eXBlKSk7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgIGlmICghZGljdCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFic3RyYWN0IGNsYXNzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsKKyAgICBjbWVtID0gKENEYXRhT2JqZWN0ICopKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfYWxsb2MoKFB5VHlwZU9iamVjdCAqKXR5cGUsIDApOworICAgIGlmIChjbWVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChDRGF0YU9iamVjdF9DaGVjayhjbWVtKSk7CiAKLQljbWVtLT5iX2xlbmd0aCA9IGRpY3QtPmxlbmd0aDsKLQljbWVtLT5iX3NpemUgPSBkaWN0LT5zaXplOwotCWlmIChiYXNlKSB7IC8qIHVzZSBiYXNlJ3MgYnVmZmVyICovCi0JCWFzc2VydChDRGF0YU9iamVjdF9DaGVjayhiYXNlKSk7Ci0JCWNtZW0tPmJfcHRyID0gYWRyOwotCQljbWVtLT5iX25lZWRzZnJlZSA9IDA7Ci0JCVB5X0lOQ1JFRihiYXNlKTsKLQkJY21lbS0+Yl9iYXNlID0gKENEYXRhT2JqZWN0ICopYmFzZTsKLQkJY21lbS0+Yl9pbmRleCA9IGluZGV4OwotCX0gZWxzZSB7IC8qIGNvcHkgY29udGVudHMgb2YgYWRyICovCi0JCWlmICgtMSA9PSBQeUNEYXRhX01hbGxvY0J1ZmZlcihjbWVtLCBkaWN0KSkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCQlQeV9ERUNSRUYoY21lbSk7Ci0JCX0KLQkJbWVtY3B5KGNtZW0tPmJfcHRyLCBhZHIsIGRpY3QtPnNpemUpOwotCQljbWVtLT5iX2luZGV4ID0gaW5kZXg7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKiljbWVtOworICAgIGNtZW0tPmJfbGVuZ3RoID0gZGljdC0+bGVuZ3RoOworICAgIGNtZW0tPmJfc2l6ZSA9IGRpY3QtPnNpemU7CisgICAgaWYgKGJhc2UpIHsgLyogdXNlIGJhc2UncyBidWZmZXIgKi8KKyAgICAgICAgYXNzZXJ0KENEYXRhT2JqZWN0X0NoZWNrKGJhc2UpKTsKKyAgICAgICAgY21lbS0+Yl9wdHIgPSBhZHI7CisgICAgICAgIGNtZW0tPmJfbmVlZHNmcmVlID0gMDsKKyAgICAgICAgUHlfSU5DUkVGKGJhc2UpOworICAgICAgICBjbWVtLT5iX2Jhc2UgPSAoQ0RhdGFPYmplY3QgKiliYXNlOworICAgICAgICBjbWVtLT5iX2luZGV4ID0gaW5kZXg7CisgICAgfSBlbHNlIHsgLyogY29weSBjb250ZW50cyBvZiBhZHIgKi8KKyAgICAgICAgaWYgKC0xID09IFB5Q0RhdGFfTWFsbG9jQnVmZmVyKGNtZW0sIGRpY3QpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjbWVtKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY21lbS0+Yl9wdHIsIGFkciwgZGljdC0+c2l6ZSk7CisgICAgICAgIGNtZW0tPmJfaW5kZXggPSBpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNtZW07CiB9CiAKIC8qCkBAIC0yNzY5LDI2ICsyNzY5LDI2IEBACiBQeU9iamVjdCAqCiBQeUNEYXRhX0F0QWRkcmVzcyhQeU9iamVjdCAqdHlwZSwgdm9pZCAqYnVmKQogewotCUNEYXRhT2JqZWN0ICpwZDsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIENEYXRhT2JqZWN0ICpwZDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JYXNzZXJ0KFB5VHlwZV9DaGVjayh0eXBlKSk7Ci0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwotCWlmICghZGljdCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhYnN0cmFjdCBjbGFzcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7CisgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayh0eXBlKSk7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgIGlmICghZGljdCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFic3RyYWN0IGNsYXNzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsKIAotCXBkID0gKENEYXRhT2JqZWN0ICopKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfYWxsb2MoKFB5VHlwZU9iamVjdCAqKXR5cGUsIDApOwotCWlmICghcGQpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChDRGF0YU9iamVjdF9DaGVjayhwZCkpOwotCXBkLT5iX3B0ciA9IChjaGFyICopYnVmOwotCXBkLT5iX2xlbmd0aCA9IGRpY3QtPmxlbmd0aDsKLQlwZC0+Yl9zaXplID0gZGljdC0+c2l6ZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopcGQ7CisgICAgcGQgPSAoQ0RhdGFPYmplY3QgKikoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9hbGxvYygoUHlUeXBlT2JqZWN0ICopdHlwZSwgMCk7CisgICAgaWYgKCFwZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KENEYXRhT2JqZWN0X0NoZWNrKHBkKSk7CisgICAgcGQtPmJfcHRyID0gKGNoYXIgKilidWY7CisgICAgcGQtPmJfbGVuZ3RoID0gZGljdC0+bGVuZ3RoOworICAgIHBkLT5iX3NpemUgPSBkaWN0LT5zaXplOworICAgIHJldHVybiAoUHlPYmplY3QgKilwZDsKIH0KIAogLyoKQEAgLTI3OTgsMjUgKzI3OTgsMjUgQEAKICovCiBpbnQgX2N0eXBlc19zaW1wbGVfaW5zdGFuY2UoUHlPYmplY3QgKm9iaikKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGUgPSAoUHlUeXBlT2JqZWN0ICopb2JqOworICAgIFB5VHlwZU9iamVjdCAqdHlwZSA9IChQeVR5cGVPYmplY3QgKilvYmo7CiAKLQlpZiAoUHlDU2ltcGxlVHlwZU9iamVjdF9DaGVjayh0eXBlKSkKLQkJcmV0dXJuIHR5cGUtPnRwX2Jhc2UgIT0gJlNpbXBsZV9UeXBlOwotCXJldHVybiAwOworICAgIGlmIChQeUNTaW1wbGVUeXBlT2JqZWN0X0NoZWNrKHR5cGUpKQorICAgICAgICByZXR1cm4gdHlwZS0+dHBfYmFzZSAhPSAmU2ltcGxlX1R5cGU7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5T2JqZWN0ICoKIFB5Q0RhdGFfZ2V0KFB5T2JqZWN0ICp0eXBlLCBHRVRGVU5DIGdldGZ1bmMsIFB5T2JqZWN0ICpzcmMsCi0JICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKmFkcikKKyAgICAgICAgICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKmFkcikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWlmIChnZXRmdW5jKQotCQlyZXR1cm4gZ2V0ZnVuYyhhZHIsIHNpemUpOwotCWFzc2VydCh0eXBlKTsKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JaWYgKGRpY3QgJiYgZGljdC0+Z2V0ZnVuYyAmJiAhX2N0eXBlc19zaW1wbGVfaW5zdGFuY2UodHlwZSkpCi0JCXJldHVybiBkaWN0LT5nZXRmdW5jKGFkciwgc2l6ZSk7Ci0JcmV0dXJuIFB5Q0RhdGFfRnJvbUJhc2VPYmoodHlwZSwgc3JjLCBpbmRleCwgYWRyKTsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIGlmIChnZXRmdW5jKQorICAgICAgICByZXR1cm4gZ2V0ZnVuYyhhZHIsIHNpemUpOworICAgIGFzc2VydCh0eXBlKTsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7CisgICAgaWYgKGRpY3QgJiYgZGljdC0+Z2V0ZnVuYyAmJiAhX2N0eXBlc19zaW1wbGVfaW5zdGFuY2UodHlwZSkpCisgICAgICAgIHJldHVybiBkaWN0LT5nZXRmdW5jKGFkciwgc2l6ZSk7CisgICAgcmV0dXJuIFB5Q0RhdGFfRnJvbUJhc2VPYmoodHlwZSwgc3JjLCBpbmRleCwgYWRyKTsKIH0KIAogLyoKQEAgLTI4MjQsOTYgKzI4MjQsOTYgQEAKICovCiBzdGF0aWMgUHlPYmplY3QgKgogX1B5Q0RhdGFfc2V0KENEYXRhT2JqZWN0ICpkc3QsIFB5T2JqZWN0ICp0eXBlLCBTRVRGVU5DIHNldGZ1bmMsIFB5T2JqZWN0ICp2YWx1ZSwKLQkgICBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKnB0cikKKyAgICAgICAgICAgUHlfc3NpemVfdCBzaXplLCBjaGFyICpwdHIpCiB7Ci0JQ0RhdGFPYmplY3QgKnNyYzsKKyAgICBDRGF0YU9iamVjdCAqc3JjOwogCi0JaWYgKHNldGZ1bmMpCi0JCXJldHVybiBzZXRmdW5jKHB0ciwgdmFsdWUsIHNpemUpOwotCQotCWlmICghQ0RhdGFPYmplY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCVN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKLQkJaWYgKGRpY3QgJiYgZGljdC0+c2V0ZnVuYykKLQkJCXJldHVybiBkaWN0LT5zZXRmdW5jKHB0ciwgdmFsdWUsIHNpemUpOwotCQkvKgotCQkgICBJZiB2YWx1ZSBpcyBhIHR1cGxlLCB3ZSB0cnkgdG8gY2FsbCB0aGUgdHlwZSB3aXRoIHRoZSB0dXBsZQotCQkgICBhbmQgdXNlIHRoZSByZXN1bHQhCi0JCSovCi0JCWFzc2VydChQeVR5cGVfQ2hlY2sodHlwZSkpOwotCQlpZiAoUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKLQkJCVB5T2JqZWN0ICpvYjsKLQkJCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCQlvYiA9IFB5T2JqZWN0X0NhbGxPYmplY3QodHlwZSwgdmFsdWUpOwotCQkJaWYgKG9iID09IE5VTEwpIHsKLQkJCQlfY3R5cGVzX2V4dGVuZF9lcnJvcihQeUV4Y19SdW50aW1lRXJyb3IsICIoJXMpICIsCi0JCQkJCQkgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJcmVzdWx0ID0gX1B5Q0RhdGFfc2V0KGRzdCwgdHlwZSwgc2V0ZnVuYywgb2IsCi0JCQkJCSAgICBzaXplLCBwdHIpOwotCQkJUHlfREVDUkVGKG9iKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZWxzZSBpZiAodmFsdWUgPT0gUHlfTm9uZSAmJiBQeUNQb2ludGVyVHlwZU9iamVjdF9DaGVjayh0eXBlKSkgewotCQkJKih2b2lkICoqKXB0ciA9IE5VTEw7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfSBlbHNlIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiZXhwZWN0ZWQgJXMgaW5zdGFuY2UsIGdvdCAlcyIsCi0JCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLAotCQkJCSAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0Jc3JjID0gKENEYXRhT2JqZWN0ICopdmFsdWU7CisgICAgaWYgKHNldGZ1bmMpCisgICAgICAgIHJldHVybiBzZXRmdW5jKHB0ciwgdmFsdWUsIHNpemUpOwogCi0JaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGUpKSB7Ci0JCW1lbWNweShwdHIsCi0JCSAgICAgICBzcmMtPmJfcHRyLAotCQkgICAgICAgc2l6ZSk7CisgICAgaWYgKCFDRGF0YU9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgICAgICBpZiAoZGljdCAmJiBkaWN0LT5zZXRmdW5jKQorICAgICAgICAgICAgcmV0dXJuIGRpY3QtPnNldGZ1bmMocHRyLCB2YWx1ZSwgc2l6ZSk7CisgICAgICAgIC8qCisgICAgICAgICAgIElmIHZhbHVlIGlzIGEgdHVwbGUsIHdlIHRyeSB0byBjYWxsIHRoZSB0eXBlIHdpdGggdGhlIHR1cGxlCisgICAgICAgICAgIGFuZCB1c2UgdGhlIHJlc3VsdCEKKyAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayh0eXBlKSk7CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgUHlPYmplY3QgKm9iOworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgICAgIG9iID0gUHlPYmplY3RfQ2FsbE9iamVjdCh0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAob2IgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIF9jdHlwZXNfZXh0ZW5kX2Vycm9yKFB5RXhjX1J1bnRpbWVFcnJvciwgIiglcykgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IF9QeUNEYXRhX3NldChkc3QsIHR5cGUsIHNldGZ1bmMsIG9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBwdHIpOworICAgICAgICAgICAgUHlfREVDUkVGKG9iKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gUHlfTm9uZSAmJiBQeUNQb2ludGVyVHlwZU9iamVjdF9DaGVjayh0eXBlKSkgeworICAgICAgICAgICAgKih2b2lkICoqKXB0ciA9IE5VTEw7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVzIGluc3RhbmNlLCBnb3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgc3JjID0gKENEYXRhT2JqZWN0ICopdmFsdWU7CiAKLQkJaWYgKFB5Q1BvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKHR5cGUpKQotCQkJLyogWFhYICovOworICAgIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgeworICAgICAgICBtZW1jcHkocHRyLAorICAgICAgICAgICAgICAgc3JjLT5iX3B0ciwKKyAgICAgICAgICAgICAgIHNpemUpOwogCi0JCXZhbHVlID0gR2V0S2VlcGVkT2JqZWN0cyhzcmMpOwotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQorICAgICAgICBpZiAoUHlDUG9pbnRlclR5cGVPYmplY3RfQ2hlY2sodHlwZSkpCisgICAgICAgICAgICAvKiBYWFggKi87CiAKLQlpZiAoUHlDUG9pbnRlclR5cGVPYmplY3RfQ2hlY2sodHlwZSkKLQkgICAgJiYgQXJyYXlPYmplY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCVN0Z0RpY3RPYmplY3QgKnAxLCAqcDI7Ci0JCVB5T2JqZWN0ICprZWVwOwotCQlwMSA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOwotCQlhc3NlcnQocDEpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgYXJyYXkgaW5zdGFuY2VzICovCi0JCXAyID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JCWFzc2VydChwMik7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBwb2ludGVyIHR5cGVzICovCisgICAgICAgIHZhbHVlID0gR2V0S2VlcGVkT2JqZWN0cyhzcmMpOworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQogCi0JCWlmIChwMS0+cHJvdG8gIT0gcDItPnByb3RvKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgImluY29tcGF0aWJsZSB0eXBlcywgJXMgaW5zdGFuY2UgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkJICAgICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSwKLQkJCQkgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJKih2b2lkICoqKXB0ciA9IHNyYy0+Yl9wdHI7CisgICAgaWYgKFB5Q1BvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKHR5cGUpCisgICAgICAgICYmIEFycmF5T2JqZWN0X0NoZWNrKHZhbHVlKSkgeworICAgICAgICBTdGdEaWN0T2JqZWN0ICpwMSwgKnAyOworICAgICAgICBQeU9iamVjdCAqa2VlcDsKKyAgICAgICAgcDEgPSBQeU9iamVjdF9zdGdkaWN0KHZhbHVlKTsKKyAgICAgICAgYXNzZXJ0KHAxKTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIGFycmF5IGluc3RhbmNlcyAqLworICAgICAgICBwMiA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgICAgICBhc3NlcnQocDIpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciB0eXBlcyAqLwogCi0JCWtlZXAgPSBHZXRLZWVwZWRPYmplY3RzKHNyYyk7Ci0JCS8qCi0JCSAgV2UgYXJlIGFzc2lnbmluZyBhbiBhcnJheSBvYmplY3QgdG8gYSBmaWVsZCB3aGljaCByZXByZXNlbnRzCi0JCSAgYSBwb2ludGVyLiBUaGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgY29udmVydGluZyBhbiBhcnJheQotCQkgIGludG8gYSBwb2ludGVyLiBTbywgYWdhaW4sIHdlIGhhdmUgdG8ga2VlcCB0aGUgd2hvbGUgb2JqZWN0Ci0JCSAgcG9pbnRlZCB0byAod2hpY2ggaXMgdGhlIGFycmF5IGluIHRoaXMgY2FzZSkgYWxpdmUsIGFuZCBub3QKLQkJICBvbmx5IGl0J3Mgb2JqZWN0IGxpc3QuICBTbyB3ZSBjcmVhdGUgYSB0dXBsZSwgY29udGFpbmluZwotCQkgIGJfb2JqZWN0cyBsaXN0IFBMVVMgdGhlIGFycmF5IGl0c2VsZiwgYW5kIHJldHVybiB0aGF0IQotCQkqLwotCQlyZXR1cm4gUHlUdXBsZV9QYWNrKDIsIGtlZXAsIHZhbHVlKTsKLQl9Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiaW5jb21wYXRpYmxlIHR5cGVzLCAlcyBpbnN0YW5jZSBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJICAgICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSwKLQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHAxLT5wcm90byAhPSBwMi0+cHJvdG8pIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImluY29tcGF0aWJsZSB0eXBlcywgJXMgaW5zdGFuY2UgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAqKHZvaWQgKiopcHRyID0gc3JjLT5iX3B0cjsKKworICAgICAgICBrZWVwID0gR2V0S2VlcGVkT2JqZWN0cyhzcmMpOworICAgICAgICAvKgorICAgICAgICAgIFdlIGFyZSBhc3NpZ25pbmcgYW4gYXJyYXkgb2JqZWN0IHRvIGEgZmllbGQgd2hpY2ggcmVwcmVzZW50cworICAgICAgICAgIGEgcG9pbnRlci4gVGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNvbnZlcnRpbmcgYW4gYXJyYXkKKyAgICAgICAgICBpbnRvIGEgcG9pbnRlci4gU28sIGFnYWluLCB3ZSBoYXZlIHRvIGtlZXAgdGhlIHdob2xlIG9iamVjdAorICAgICAgICAgIHBvaW50ZWQgdG8gKHdoaWNoIGlzIHRoZSBhcnJheSBpbiB0aGlzIGNhc2UpIGFsaXZlLCBhbmQgbm90CisgICAgICAgICAgb25seSBpdCdzIG9iamVjdCBsaXN0LiAgU28gd2UgY3JlYXRlIGEgdHVwbGUsIGNvbnRhaW5pbmcKKyAgICAgICAgICBiX29iamVjdHMgbGlzdCBQTFVTIHRoZSBhcnJheSBpdHNlbGYsIGFuZCByZXR1cm4gdGhhdCEKKyAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIFB5VHVwbGVfUGFjaygyLCBrZWVwLCB2YWx1ZSk7CisgICAgfQorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJpbmNvbXBhdGlibGUgdHlwZXMsICVzIGluc3RhbmNlIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qCkBAIC0yOTIyLDU4ICsyOTIyLDU4IEBACiAgKi8KIGludAogUHlDRGF0YV9zZXQoUHlPYmplY3QgKmRzdCwgUHlPYmplY3QgKnR5cGUsIFNFVEZVTkMgc2V0ZnVuYywgUHlPYmplY3QgKnZhbHVlLAotCSAgUHlfc3NpemVfdCBpbmRleCwgUHlfc3NpemVfdCBzaXplLCBjaGFyICpwdHIpCisgICAgICAgICAgUHlfc3NpemVfdCBpbmRleCwgUHlfc3NpemVfdCBzaXplLCBjaGFyICpwdHIpCiB7Ci0JQ0RhdGFPYmplY3QgKm1lbSA9IChDRGF0YU9iamVjdCAqKWRzdDsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIENEYXRhT2JqZWN0ICptZW0gPSAoQ0RhdGFPYmplY3QgKilkc3Q7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghQ0RhdGFPYmplY3RfQ2hlY2soZHN0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJub3QgYSBjdHlwZSBpbnN0YW5jZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICghQ0RhdGFPYmplY3RfQ2hlY2soZHN0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhIGN0eXBlIGluc3RhbmNlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXN1bHQgPSBfUHlDRGF0YV9zZXQobWVtLCB0eXBlLCBzZXRmdW5jLCB2YWx1ZSwKLQkJCSAgICBzaXplLCBwdHIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIHJlc3VsdCA9IF9QeUNEYXRhX3NldChtZW0sIHR5cGUsIHNldGZ1bmMsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgcHRyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCS8qIEtlZXBSZWYgc3RlYWxzIGEgcmVmY291bnQgZnJvbSBpdCdzIGxhc3QgYXJndW1lbnQgKi8KLQkvKiBJZiBLZWVwUmVmIGZhaWxzLCB3ZSBhcmUgc3R1bXBlZC4gIFRoZSBkc3QgbWVtb3J5IGJsb2NrIGhhcyBhbHJlYWR5Ci0JICAgYmVlbiBjaGFuZ2VkICovCi0JcmV0dXJuIEtlZXBSZWYobWVtLCBpbmRleCwgcmVzdWx0KTsKKyAgICAvKiBLZWVwUmVmIHN0ZWFscyBhIHJlZmNvdW50IGZyb20gaXQncyBsYXN0IGFyZ3VtZW50ICovCisgICAgLyogSWYgS2VlcFJlZiBmYWlscywgd2UgYXJlIHN0dW1wZWQuICBUaGUgZHN0IG1lbW9yeSBibG9jayBoYXMgYWxyZWFkeQorICAgICAgIGJlZW4gY2hhbmdlZCAqLworICAgIHJldHVybiBLZWVwUmVmKG1lbSwgaW5kZXgsIHJlc3VsdCk7CiB9CiAKLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBHZW5lcmljUHlDRGF0YV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JQ0RhdGFPYmplY3QgKm9iajsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIENEYXRhT2JqZWN0ICpvYmo7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKIAotCWRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKLQlpZiAoIWRpY3QpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYWJzdHJhY3QgY2xhc3MiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRpY3QtPmZsYWdzIHw9IERJQ1RGTEFHX0ZJTkFMOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKKyAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYnN0cmFjdCBjbGFzcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7CiAKLQlvYmogPSAoQ0RhdGFPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoIW9iaikKLQkJcmV0dXJuIE5VTEw7CisgICAgb2JqID0gKENEYXRhT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jb2JqLT5iX2Jhc2UgPSBOVUxMOwotCW9iai0+Yl9pbmRleCA9IDA7Ci0Jb2JqLT5iX29iamVjdHMgPSBOVUxMOwotCW9iai0+Yl9sZW5ndGggPSBkaWN0LT5sZW5ndGg7Ci0JCQkKLQlpZiAoLTEgPT0gUHlDRGF0YV9NYWxsb2NCdWZmZXIob2JqLCBkaWN0KSkgewotCQlQeV9ERUNSRUYob2JqKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilvYmo7CisgICAgb2JqLT5iX2Jhc2UgPSBOVUxMOworICAgIG9iai0+Yl9pbmRleCA9IDA7CisgICAgb2JqLT5iX29iamVjdHMgPSBOVUxMOworICAgIG9iai0+Yl9sZW5ndGggPSBkaWN0LT5sZW5ndGg7CisKKyAgICBpZiAoLTEgPT0gUHlDRGF0YV9NYWxsb2NCdWZmZXIob2JqLCBkaWN0KSkgeworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilvYmo7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgpAQCAtMjk4MywxNjUgKzI5ODMsMTY1IEBACiBzdGF0aWMgaW50CiBQeUNGdW5jUHRyX3NldF9lcnJjaGVjayhQeUNGdW5jUHRyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2IpCiB7Ci0JaWYgKG9iICYmICFQeUNhbGxhYmxlX0NoZWNrKG9iKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0aGUgZXJyY2hlY2sgYXR0cmlidXRlIG11c3QgYmUgY2FsbGFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9YREVDUkVGKHNlbGYtPmVycmNoZWNrKTsKLQlQeV9YSU5DUkVGKG9iKTsKLQlzZWxmLT5lcnJjaGVjayA9IG9iOwotCXJldHVybiAwOworICAgIGlmIChvYiAmJiAhUHlDYWxsYWJsZV9DaGVjayhvYikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZXJyY2hlY2sgYXR0cmlidXRlIG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9YREVDUkVGKHNlbGYtPmVycmNoZWNrKTsKKyAgICBQeV9YSU5DUkVGKG9iKTsKKyAgICBzZWxmLT5lcnJjaGVjayA9IG9iOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlDRnVuY1B0cl9nZXRfZXJyY2hlY2soUHlDRnVuY1B0ck9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+ZXJyY2hlY2spIHsKLQkJUHlfSU5DUkVGKHNlbGYtPmVycmNoZWNrKTsKLQkJcmV0dXJuIHNlbGYtPmVycmNoZWNrOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHNlbGYtPmVycmNoZWNrKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5lcnJjaGVjayk7CisgICAgICAgIHJldHVybiBzZWxmLT5lcnJjaGVjazsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgaW50CiBQeUNGdW5jUHRyX3NldF9yZXN0eXBlKFB5Q0Z1bmNQdHJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYikKIHsKLQlpZiAob2IgPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKHNlbGYtPnJlc3R5cGUpOwotCQlzZWxmLT5yZXN0eXBlID0gTlVMTDsKLQkJUHlfWERFQ1JFRihzZWxmLT5jaGVja2VyKTsKLQkJc2VsZi0+Y2hlY2tlciA9IE5VTEw7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAob2IgIT0gUHlfTm9uZSAmJiAhUHlUeXBlX3N0Z2RpY3Qob2IpICYmICFQeUNhbGxhYmxlX0NoZWNrKG9iKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJyZXN0eXBlIG11c3QgYmUgYSB0eXBlLCBhIGNhbGxhYmxlLCBvciBOb25lIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfWERFQ1JFRihzZWxmLT5jaGVja2VyKTsKLQlQeV9YREVDUkVGKHNlbGYtPnJlc3R5cGUpOwotCVB5X0lOQ1JFRihvYik7Ci0Jc2VsZi0+cmVzdHlwZSA9IG9iOwotCXNlbGYtPmNoZWNrZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iLCAiX2NoZWNrX3JldHZhbF8iKTsKLQlpZiAoc2VsZi0+Y2hlY2tlciA9PSBOVUxMKQotCQlQeUVycl9DbGVhcigpOwotCXJldHVybiAwOworICAgIGlmIChvYiA9PSBOVUxMKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+cmVzdHlwZSk7CisgICAgICAgIHNlbGYtPnJlc3R5cGUgPSBOVUxMOworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmNoZWNrZXIpOworICAgICAgICBzZWxmLT5jaGVja2VyID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChvYiAhPSBQeV9Ob25lICYmICFQeVR5cGVfc3RnZGljdChvYikgJiYgIVB5Q2FsbGFibGVfQ2hlY2sob2IpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVzdHlwZSBtdXN0IGJlIGEgdHlwZSwgYSBjYWxsYWJsZSwgb3IgTm9uZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X1hERUNSRUYoc2VsZi0+Y2hlY2tlcik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5yZXN0eXBlKTsKKyAgICBQeV9JTkNSRUYob2IpOworICAgIHNlbGYtPnJlc3R5cGUgPSBvYjsKKyAgICBzZWxmLT5jaGVja2VyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYiwgIl9jaGVja19yZXR2YWxfIik7CisgICAgaWYgKHNlbGYtPmNoZWNrZXIgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q0Z1bmNQdHJfZ2V0X3Jlc3R5cGUoUHlDRnVuY1B0ck9iamVjdCAqc2VsZikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWlmIChzZWxmLT5yZXN0eXBlKSB7Ci0JCVB5X0lOQ1JFRihzZWxmLT5yZXN0eXBlKTsKLQkJcmV0dXJuIHNlbGYtPnJlc3R5cGU7Ci0JfQotCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIFB5Q0Z1bmNQdHJPYmplY3QgaW5zdGFuY2VzICovCi0JaWYgKGRpY3QtPnJlc3R5cGUpIHsKLQkJUHlfSU5DUkVGKGRpY3QtPnJlc3R5cGUpOwotCQlyZXR1cm4gZGljdC0+cmVzdHlwZTsKLQl9IGVsc2UgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIGlmIChzZWxmLT5yZXN0eXBlKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5yZXN0eXBlKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPnJlc3R5cGU7CisgICAgfQorICAgIGRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIFB5Q0Z1bmNQdHJPYmplY3QgaW5zdGFuY2VzICovCisgICAgaWYgKGRpY3QtPnJlc3R5cGUpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRpY3QtPnJlc3R5cGUpOworICAgICAgICByZXR1cm4gZGljdC0+cmVzdHlwZTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIH0KIAogc3RhdGljIGludAogUHlDRnVuY1B0cl9zZXRfYXJndHlwZXMoUHlDRnVuY1B0ck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iKQogewotCVB5T2JqZWN0ICpjb252ZXJ0ZXJzOworICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzOwogCi0JaWYgKG9iID09IE5VTEwgfHwgb2IgPT0gUHlfTm9uZSkgewotCQlQeV9YREVDUkVGKHNlbGYtPmNvbnZlcnRlcnMpOwotCQlzZWxmLT5jb252ZXJ0ZXJzID0gTlVMTDsKLQkJUHlfWERFQ1JFRihzZWxmLT5hcmd0eXBlcyk7Ci0JCXNlbGYtPmFyZ3R5cGVzID0gTlVMTDsKLQl9IGVsc2UgewotCQljb252ZXJ0ZXJzID0gY29udmVydGVyc19mcm9tX2FyZ3R5cGVzKG9iKTsKLQkJaWYgKCFjb252ZXJ0ZXJzKQotCQkJcmV0dXJuIC0xOwotCQlQeV9YREVDUkVGKHNlbGYtPmNvbnZlcnRlcnMpOwotCQlzZWxmLT5jb252ZXJ0ZXJzID0gY29udmVydGVyczsKLQkJUHlfWERFQ1JFRihzZWxmLT5hcmd0eXBlcyk7Ci0JCVB5X0lOQ1JFRihvYik7Ci0JCXNlbGYtPmFyZ3R5cGVzID0gb2I7Ci0JfQotCXJldHVybiAwOworICAgIGlmIChvYiA9PSBOVUxMIHx8IG9iID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICAgICAgc2VsZi0+Y29udmVydGVycyA9IE5VTEw7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+YXJndHlwZXMpOworICAgICAgICBzZWxmLT5hcmd0eXBlcyA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29udmVydGVycyA9IGNvbnZlcnRlcnNfZnJvbV9hcmd0eXBlcyhvYik7CisgICAgICAgIGlmICghY29udmVydGVycykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICAgICAgc2VsZi0+Y29udmVydGVycyA9IGNvbnZlcnRlcnM7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+YXJndHlwZXMpOworICAgICAgICBQeV9JTkNSRUYob2IpOworICAgICAgICBzZWxmLT5hcmd0eXBlcyA9IG9iOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q0Z1bmNQdHJfZ2V0X2FyZ3R5cGVzKFB5Q0Z1bmNQdHJPYmplY3QgKnNlbGYpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlpZiAoc2VsZi0+YXJndHlwZXMpIHsKLQkJUHlfSU5DUkVGKHNlbGYtPmFyZ3R5cGVzKTsKLQkJcmV0dXJuIHNlbGYtPmFyZ3R5cGVzOwotCX0KLQlkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBQeUNGdW5jUHRyT2JqZWN0IGluc3RhbmNlcyAqLwotCWlmIChkaWN0LT5hcmd0eXBlcykgewotCQlQeV9JTkNSRUYoZGljdC0+YXJndHlwZXMpOwotCQlyZXR1cm4gZGljdC0+YXJndHlwZXM7Ci0JfSBlbHNlIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBpZiAoc2VsZi0+YXJndHlwZXMpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPmFyZ3R5cGVzKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPmFyZ3R5cGVzOworICAgIH0KKyAgICBkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBQeUNGdW5jUHRyT2JqZWN0IGluc3RhbmNlcyAqLworICAgIGlmIChkaWN0LT5hcmd0eXBlcykgeworICAgICAgICBQeV9JTkNSRUYoZGljdC0+YXJndHlwZXMpOworICAgICAgICByZXR1cm4gZGljdC0+YXJndHlwZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBQeUNGdW5jUHRyX2dldHNldHNbXSA9IHsKLQl7ICJlcnJjaGVjayIsIChnZXR0ZXIpUHlDRnVuY1B0cl9nZXRfZXJyY2hlY2ssIChzZXR0ZXIpUHlDRnVuY1B0cl9zZXRfZXJyY2hlY2ssCi0JICAiYSBmdW5jdGlvbiB0byBjaGVjayBmb3IgZXJyb3JzIiwgTlVMTCB9LAotCXsgInJlc3R5cGUiLCAoZ2V0dGVyKVB5Q0Z1bmNQdHJfZ2V0X3Jlc3R5cGUsIChzZXR0ZXIpUHlDRnVuY1B0cl9zZXRfcmVzdHlwZSwKLQkgICJzcGVjaWZ5IHRoZSByZXN1bHQgdHlwZSIsIE5VTEwgfSwKLQl7ICJhcmd0eXBlcyIsIChnZXR0ZXIpUHlDRnVuY1B0cl9nZXRfYXJndHlwZXMsCi0JICAoc2V0dGVyKVB5Q0Z1bmNQdHJfc2V0X2FyZ3R5cGVzLAotCSAgInNwZWNpZnkgdGhlIGFyZ3VtZW50IHR5cGVzIiwgTlVMTCB9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAiZXJyY2hlY2siLCAoZ2V0dGVyKVB5Q0Z1bmNQdHJfZ2V0X2VycmNoZWNrLCAoc2V0dGVyKVB5Q0Z1bmNQdHJfc2V0X2VycmNoZWNrLAorICAgICAgImEgZnVuY3Rpb24gdG8gY2hlY2sgZm9yIGVycm9ycyIsIE5VTEwgfSwKKyAgICB7ICJyZXN0eXBlIiwgKGdldHRlcilQeUNGdW5jUHRyX2dldF9yZXN0eXBlLCAoc2V0dGVyKVB5Q0Z1bmNQdHJfc2V0X3Jlc3R5cGUsCisgICAgICAic3BlY2lmeSB0aGUgcmVzdWx0IHR5cGUiLCBOVUxMIH0sCisgICAgeyAiYXJndHlwZXMiLCAoZ2V0dGVyKVB5Q0Z1bmNQdHJfZ2V0X2FyZ3R5cGVzLAorICAgICAgKHNldHRlcilQeUNGdW5jUHRyX3NldF9hcmd0eXBlcywKKyAgICAgICJzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcyIsIE5VTEwgfSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogI2lmZGVmIE1TX1dJTjMyCiBzdGF0aWMgUFBST0MgRmluZEFkZHJlc3Modm9pZCAqaGFuZGxlLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdHlwZSkKIHsKICNpZmRlZiBNU19XSU42NAotCS8qIHdpbjY0IGhhcyBubyBzdGRjYWxsIGNhbGxpbmcgY29udiwgc28gaXQgc2hvdWxkCi0JICAgYWxzbyBub3QgaGF2ZSB0aGUgbmFtZSBtYW5nbGluZyBvZiBpdC4KLQkqLwotCXJldHVybiAoUFBST0MpR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCBuYW1lKTsKKyAgICAvKiB3aW42NCBoYXMgbm8gc3RkY2FsbCBjYWxsaW5nIGNvbnYsIHNvIGl0IHNob3VsZAorICAgICAgIGFsc28gbm90IGhhdmUgdGhlIG5hbWUgbWFuZ2xpbmcgb2YgaXQuCisgICAgKi8KKyAgICByZXR1cm4gKFBQUk9DKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSk7CiAjZWxzZQotCVBQUk9DIGFkZHJlc3M7Ci0JY2hhciAqbWFuZ2xlZF9uYW1lOwotCWludCBpOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUFBST0MgYWRkcmVzczsKKyAgICBjaGFyICptYW5nbGVkX25hbWU7CisgICAgaW50IGk7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKIAotCWFkZHJlc3MgPSAoUFBST0MpR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCBuYW1lKTsKLQlpZiAoYWRkcmVzcykKLQkJcmV0dXJuIGFkZHJlc3M7Ci0JaWYgKCgoc2l6ZV90KW5hbWUgJiB+MHhGRkZGKSA9PSAwKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBhZGRyZXNzID0gKFBQUk9DKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSk7CisgICAgaWYgKGFkZHJlc3MpCisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgIGlmICgoKHNpemVfdCluYW1lICYgfjB4RkZGRikgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZSk7Ci0JLyogSXQgc2hvdWxkIG5vdCBoYXBwZW4gdGhhdCBkaWN0IGlzIE5VTEwsIGJ1dCBiZXR0ZXIgYmUgc2FmZSAqLwotCWlmIChkaWN0PT1OVUxMIHx8IGRpY3QtPmZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpCi0JCXJldHVybiBhZGRyZXNzOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKKyAgICAvKiBJdCBzaG91bGQgbm90IGhhcHBlbiB0aGF0IGRpY3QgaXMgTlVMTCwgYnV0IGJldHRlciBiZSBzYWZlICovCisgICAgaWYgKGRpY3Q9PU5VTEwgfHwgZGljdC0+ZmxhZ3MgJiBGVU5DRkxBR19DREVDTCkKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAKLQkvKiBmb3Igc3RkY2FsbCwgdHJ5IG1hbmdsZWQgbmFtZXM6Ci0JICAgZnVuY25hbWUgLT4gX2Z1bmNuYW1lQDxuPgotCSAgIHdoZXJlIG4gaXMgMCwgNCwgOCwgMTIsIC4uLiwgMTI4Ci0JICovCi0JbWFuZ2xlZF9uYW1lID0gYWxsb2NhKHN0cmxlbihuYW1lKSArIDEgKyAxICsgMSArIDMpOyAvKiBcMCBfIEAgJWQgKi8KLQlpZiAoIW1hbmdsZWRfbmFtZSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHsKLQkJc3ByaW50ZihtYW5nbGVkX25hbWUsICJfJXNAJWQiLCBuYW1lLCBpKjQpOwotCQlhZGRyZXNzID0gKFBQUk9DKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbWFuZ2xlZF9uYW1lKTsKLQkJaWYgKGFkZHJlc3MpCi0JCQlyZXR1cm4gYWRkcmVzczsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogZm9yIHN0ZGNhbGwsIHRyeSBtYW5nbGVkIG5hbWVzOgorICAgICAgIGZ1bmNuYW1lIC0+IF9mdW5jbmFtZUA8bj4KKyAgICAgICB3aGVyZSBuIGlzIDAsIDQsIDgsIDEyLCAuLi4sIDEyOAorICAgICAqLworICAgIG1hbmdsZWRfbmFtZSA9IGFsbG9jYShzdHJsZW4obmFtZSkgKyAxICsgMSArIDEgKyAzKTsgLyogXDAgXyBAICVkICovCisgICAgaWYgKCFtYW5nbGVkX25hbWUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKSB7CisgICAgICAgIHNwcmludGYobWFuZ2xlZF9uYW1lLCAiXyVzQCVkIiwgbmFtZSwgaSo0KTsKKyAgICAgICAgYWRkcmVzcyA9IChQUFJPQylHZXRQcm9jQWRkcmVzcyhoYW5kbGUsIG1hbmdsZWRfbmFtZSk7CisgICAgICAgIGlmIChhZGRyZXNzKQorICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiB9CiAjZW5kaWYKQEAgLTMxNTAsMjIzICszMTUwLDIyMyBAQAogc3RhdGljIGludAogX2NoZWNrX291dGFyZ190eXBlKFB5T2JqZWN0ICphcmcsIFB5X3NzaXplX3QgaW5kZXgpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JaWYgKFB5Q1BvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKGFyZykpCi0JCXJldHVybiAxOworICAgIGlmIChQeUNQb2ludGVyVHlwZU9iamVjdF9DaGVjayhhcmcpKQorICAgICAgICByZXR1cm4gMTsKIAotCWlmIChQeUNBcnJheVR5cGVPYmplY3RfQ2hlY2soYXJnKSkKLQkJcmV0dXJuIDE7CisgICAgaWYgKFB5Q0FycmF5VHlwZU9iamVjdF9DaGVjayhhcmcpKQorICAgICAgICByZXR1cm4gMTsKIAotCWRpY3QgPSBQeVR5cGVfc3RnZGljdChhcmcpOwotCWlmIChkaWN0Ci0JICAgIC8qIHNpbXBsZSBwb2ludGVyIHR5cGVzLCBjX3ZvaWRfcCwgY193Y2hhcl9wLCBCU1RSLCAuLi4gKi8KLQkgICAgJiYgUHlTdHJpbmdfQ2hlY2soZGljdC0+cHJvdG8pCisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFyZyk7CisgICAgaWYgKGRpY3QKKyAgICAgICAgLyogc2ltcGxlIHBvaW50ZXIgdHlwZXMsIGNfdm9pZF9wLCBjX3djaGFyX3AsIEJTVFIsIC4uLiAqLworICAgICAgICAmJiBQeVN0cmluZ19DaGVjayhkaWN0LT5wcm90bykKIC8qIFdlIG9ubHkgYWxsb3cgY192b2lkX3AsIGNfY2hhcl9wIGFuZCBjX3djaGFyX3AgYXMgYSBzaW1wbGUgb3V0cHV0IHBhcmFtZXRlciB0eXBlICovCi0JICAgICYmIChzdHJjaHIoIlB6WiIsIFB5U3RyaW5nX0FTX1NUUklORyhkaWN0LT5wcm90bylbMF0pKSkgewotCQlyZXR1cm4gMTsKLQl9CisgICAgICAgICYmIChzdHJjaHIoIlB6WiIsIFB5U3RyaW5nX0FTX1NUUklORyhkaWN0LT5wcm90bylbMF0pKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICInb3V0JyBwYXJhbWV0ZXIgJWQgbXVzdCBiZSBhIHBvaW50ZXIgdHlwZSwgbm90ICVzIiwKLQkJICAgICBQeV9TQUZFX0RPV05DQVNUKGluZGV4LCBQeV9zc2l6ZV90LCBpbnQpLAotCQkgICAgIFB5VHlwZV9DaGVjayhhcmcpID8KLQkJICAgICAoKFB5VHlwZU9iamVjdCAqKWFyZyktPnRwX25hbWUgOgotCQkgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIidvdXQnIHBhcmFtZXRlciAlZCBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBub3QgJXMiLAorICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKGluZGV4LCBQeV9zc2l6ZV90LCBpbnQpLAorICAgICAgICAgICAgICAgICBQeVR5cGVfQ2hlY2soYXJnKSA/CisgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopYXJnKS0+dHBfbmFtZSA6CisgICAgICAgICAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IgKi8KIHN0YXRpYyBpbnQKIF92YWxpZGF0ZV9wYXJhbWZsYWdzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnBhcmFtZmxhZ3MpCiB7Ci0JUHlfc3NpemVfdCBpLCBsZW47Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlQeU9iamVjdCAqYXJndHlwZXM7CisgICAgUHlfc3NpemVfdCBpLCBsZW47CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqYXJndHlwZXM7CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZSk7Ci0JYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTC4gJ3R5cGUnIGlzIGEgUHlDRnVuY1B0ciB0eXBlLiAqLwotCWFyZ3R5cGVzID0gZGljdC0+YXJndHlwZXM7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOworICAgIGFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwuICd0eXBlJyBpcyBhIFB5Q0Z1bmNQdHIgdHlwZS4gKi8KKyAgICBhcmd0eXBlcyA9IGRpY3QtPmFyZ3R5cGVzOwogCi0JaWYgKHBhcmFtZmxhZ3MgPT0gTlVMTCB8fCBkaWN0LT5hcmd0eXBlcyA9PSBOVUxMKQotCQlyZXR1cm4gMTsKKyAgICBpZiAocGFyYW1mbGFncyA9PSBOVUxMIHx8IGRpY3QtPmFyZ3R5cGVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAxOwogCi0JaWYgKCFQeVR1cGxlX0NoZWNrKHBhcmFtZmxhZ3MpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInBhcmFtZmxhZ3MgbXVzdCBiZSBhIHR1cGxlIG9yIE5vbmUiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICghUHlUdXBsZV9DaGVjayhwYXJhbWZsYWdzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtZmxhZ3MgbXVzdCBiZSBhIHR1cGxlIG9yIE5vbmUiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JbGVuID0gUHlUdXBsZV9HRVRfU0laRShwYXJhbWZsYWdzKTsKLQlpZiAobGVuICE9IFB5VHVwbGVfR0VUX1NJWkUoZGljdC0+YXJndHlwZXMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJwYXJhbWZsYWdzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgYXJndHlwZXMiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCQotCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgewotCQlQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0ocGFyYW1mbGFncywgaSk7Ci0JCWludCBmbGFnOwotCQljaGFyICpuYW1lOwotCQlQeU9iamVjdCAqZGVmdmFsOwotCQlQeU9iamVjdCAqdHlwOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoaXRlbSwgIml8ek8iLCAmZmxhZywgJm5hbWUsICZkZWZ2YWwpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAgICJwYXJhbWZsYWdzIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiAoaW50IFssc3RyaW5nIFssdmFsdWVdXSkgdHVwbGVzIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQl0eXAgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R5cGVzLCBpKTsKLQkJc3dpdGNoIChmbGFnICYgKFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRk9VVCB8IFBBUkFNRkxBR19GTENJRCkpIHsKLQkJY2FzZSAwOgotCQljYXNlIFBBUkFNRkxBR19GSU46Ci0JCWNhc2UgUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GTENJRDoKLQkJY2FzZSBQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZPVVQ6Ci0JCQlicmVhazsKLQkJY2FzZSBQQVJBTUZMQUdfRk9VVDoKLQkJCWlmICghX2NoZWNrX291dGFyZ190eXBlKHR5cCwgaSsxKSkKLQkJCQlyZXR1cm4gMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJwYXJhbWZsYWcgdmFsdWUgJWQgbm90IHN1cHBvcnRlZCIsCi0JCQkJICAgICBmbGFnKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXJldHVybiAxOworICAgIGxlbiA9IFB5VHVwbGVfR0VUX1NJWkUocGFyYW1mbGFncyk7CisgICAgaWYgKGxlbiAhPSBQeVR1cGxlX0dFVF9TSVpFKGRpY3QtPmFyZ3R5cGVzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbWZsYWdzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgYXJndHlwZXMiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShwYXJhbWZsYWdzLCBpKTsKKyAgICAgICAgaW50IGZsYWc7CisgICAgICAgIGNoYXIgKm5hbWU7CisgICAgICAgIFB5T2JqZWN0ICpkZWZ2YWw7CisgICAgICAgIFB5T2JqZWN0ICp0eXA7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShpdGVtLCAiaXx6TyIsICZmbGFnLCAmbmFtZSwgJmRlZnZhbCkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgInBhcmFtZmxhZ3MgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIChpbnQgWyxzdHJpbmcgWyx2YWx1ZV1dKSB0dXBsZXMiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHR5cCA9IFB5VHVwbGVfR0VUX0lURU0oYXJndHlwZXMsIGkpOworICAgICAgICBzd2l0Y2ggKGZsYWcgJiAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUIHwgUEFSQU1GTEFHX0ZMQ0lEKSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgUEFSQU1GTEFHX0ZJTjoKKyAgICAgICAgY2FzZSBQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZMQ0lEOgorICAgICAgICBjYXNlIFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRk9VVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBBUkFNRkxBR19GT1VUOgorICAgICAgICAgICAgaWYgKCFfY2hlY2tfb3V0YXJnX3R5cGUodHlwLCBpKzEpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbWZsYWcgdmFsdWUgJWQgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogX2dldF9uYW1lKFB5T2JqZWN0ICpvYmosIGNoYXIgKipwbmFtZSkKIHsKICNpZmRlZiBNU19XSU4zMgotCWlmIChQeUludF9DaGVjayhvYmopIHx8IFB5TG9uZ19DaGVjayhvYmopKSB7Ci0JCS8qIFdlIGhhdmUgdG8gdXNlIE1BS0VJTlRSRVNPVVJDRUEgZm9yIFdpbmRvd3MgQ0UuCi0JCSAgIFdvcmtzIG9uIFdpbmRvd3MgYXMgd2VsbCwgb2YgY291cnNlLgotCQkqLwotCQkqcG5hbWUgPSBNQUtFSU5UUkVTT1VSQ0VBKFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhvYmopICYgMHhGRkZGKTsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGlmIChQeUludF9DaGVjayhvYmopIHx8IFB5TG9uZ19DaGVjayhvYmopKSB7CisgICAgICAgIC8qIFdlIGhhdmUgdG8gdXNlIE1BS0VJTlRSRVNPVVJDRUEgZm9yIFdpbmRvd3MgQ0UuCisgICAgICAgICAgIFdvcmtzIG9uIFdpbmRvd3MgYXMgd2VsbCwgb2YgY291cnNlLgorICAgICAgICAqLworICAgICAgICAqcG5hbWUgPSBNQUtFSU5UUkVTT1VSQ0VBKFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhvYmopICYgMHhGRkZGKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmCi0JaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikgfHwgUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKLQkJKnBuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcob2JqKTsKLQkJcmV0dXJuICpwbmFtZSA/IDEgOiAwOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBzdHJpbmcgb3IgaW50ZWdlciIpOwotCXJldHVybiAwOworICAgIGlmIChQeVN0cmluZ19DaGVjayhvYmopIHx8IFB5VW5pY29kZV9DaGVjayhvYmopKSB7CisgICAgICAgICpwbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iaik7CisgICAgICAgIHJldHVybiAqcG5hbWUgPyAxIDogMDsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBzdHJpbmcgb3IgaW50ZWdlciIpOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNGdW5jUHRyX0Zyb21EbGwoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgKCogYWRkcmVzcykodm9pZCk7Ci0JUHlPYmplY3QgKmRsbDsKLQlQeU9iamVjdCAqb2JqOwotCVB5Q0Z1bmNQdHJPYmplY3QgKnNlbGY7Ci0Jdm9pZCAqaGFuZGxlOwotCVB5T2JqZWN0ICpwYXJhbWZsYWdzID0gTlVMTDsKKyAgICBjaGFyICpuYW1lOworICAgIGludCAoKiBhZGRyZXNzKSh2b2lkKTsKKyAgICBQeU9iamVjdCAqZGxsOworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgUHlDRnVuY1B0ck9iamVjdCAqc2VsZjsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgUHlPYmplY3QgKnBhcmFtZmxhZ3MgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIoTyZPKXxPIiwgX2dldF9uYW1lLCAmbmFtZSwgJmRsbCwgJnBhcmFtZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGFyYW1mbGFncyA9PSBQeV9Ob25lKQotCQlwYXJhbWZsYWdzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIihPJk8pfE8iLCBfZ2V0X25hbWUsICZuYW1lLCAmZGxsLCAmcGFyYW1mbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXJhbWZsYWdzID09IFB5X05vbmUpCisgICAgICAgIHBhcmFtZmxhZ3MgPSBOVUxMOwogCi0Jb2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkbGwsICJfaGFuZGxlIik7Ci0JaWYgKCFvYmopCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlJbnRfQ2hlY2sob2JqKSAmJiAhUHlMb25nX0NoZWNrKG9iaikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidGhlIF9oYW5kbGUgYXR0cmlidXRlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaGFuZGxlID0gKHZvaWQgKilQeUxvbmdfQXNWb2lkUHRyKG9iaik7Ci0JUHlfREVDUkVGKG9iaik7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNvdWxkIG5vdCBjb252ZXJ0IHRoZSBfaGFuZGxlIGF0dHJpYnV0ZSB0byBhIHBvaW50ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGxsLCAiX2hhbmRsZSIpOworICAgIGlmICghb2JqKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SW50X0NoZWNrKG9iaikgJiYgIVB5TG9uZ19DaGVjayhvYmopKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIF9oYW5kbGUgYXR0cmlidXRlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaGFuZGxlID0gKHZvaWQgKilQeUxvbmdfQXNWb2lkUHRyKG9iaik7CisgICAgUHlfREVDUkVGKG9iaik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNvbnZlcnQgdGhlIF9oYW5kbGUgYXR0cmlidXRlIHRvIGEgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZmRlZiBNU19XSU4zMgotCWFkZHJlc3MgPSBGaW5kQWRkcmVzcyhoYW5kbGUsIG5hbWUsIChQeU9iamVjdCAqKXR5cGUpOwotCWlmICghYWRkcmVzcykgewotCQlpZiAoIUlTX0lOVFJFU09VUkNFKG5hbWUpKQotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSAgICAgImZ1bmN0aW9uICclcycgbm90IGZvdW5kIiwKLQkJCQkgICAgIG5hbWUpOwotCQllbHNlCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJICAgICAiZnVuY3Rpb24gb3JkaW5hbCAlZCBub3QgZm91bmQiLAotCQkJCSAgICAgKFdPUkQpKHNpemVfdCluYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGFkZHJlc3MgPSBGaW5kQWRkcmVzcyhoYW5kbGUsIG5hbWUsIChQeU9iamVjdCAqKXR5cGUpOworICAgIGlmICghYWRkcmVzcykgeworICAgICAgICBpZiAoIUlTX0lOVFJFU09VUkNFKG5hbWUpKQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiAnJXMnIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gb3JkaW5hbCAlZCBub3QgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKShzaXplX3QpbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbHNlCi0JYWRkcmVzcyA9IChQUFJPQyljdHlwZXNfZGxzeW0oaGFuZGxlLCBuYW1lKTsKLQlpZiAoIWFkZHJlc3MpIHsKKyAgICBhZGRyZXNzID0gKFBQUk9DKWN0eXBlc19kbHN5bShoYW5kbGUsIG5hbWUpOworICAgIGlmICghYWRkcmVzcykgewogI2lmZGVmIF9fQ1lHV0lOX18KIC8qIGRsZXJyb3IoKSBpc24ndCB2ZXJ5IGhlbHBmdWwgb24gY3lnd2luICovCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgImZ1bmN0aW9uICclcycgbm90IGZvdW5kICglcykgIiwKLQkJCSAgICAgbmFtZSk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiAnJXMnIG5vdCBmb3VuZCAoJXMpICIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKICNlbHNlCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgY3R5cGVzX2RsZXJyb3IoKSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgY3R5cGVzX2RsZXJyb3IoKSk7CiAjZW5kaWYKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlpZiAoIV92YWxpZGF0ZV9wYXJhbWZsYWdzKHR5cGUsIHBhcmFtZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIV92YWxpZGF0ZV9wYXJhbWZsYWdzKHR5cGUsIHBhcmFtZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYgPSAoUHlDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNQeUNEYXRhX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAoIXNlbGYpCi0JCXJldHVybiBOVUxMOworICAgIHNlbGYgPSAoUHlDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNQeUNEYXRhX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAoIXNlbGYpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfWElOQ1JFRihwYXJhbWZsYWdzKTsKLQlzZWxmLT5wYXJhbWZsYWdzID0gcGFyYW1mbGFnczsKKyAgICBQeV9YSU5DUkVGKHBhcmFtZmxhZ3MpOworICAgIHNlbGYtPnBhcmFtZmxhZ3MgPSBwYXJhbWZsYWdzOwogCi0JKih2b2lkICoqKXNlbGYtPmJfcHRyID0gYWRkcmVzczsKKyAgICAqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPSBhZGRyZXNzOwogCi0JUHlfSU5DUkVGKChQeU9iamVjdCAqKWRsbCk7IC8qIGZvciBLZWVwUmVmICovCi0JaWYgKC0xID09IEtlZXBSZWYoKENEYXRhT2JqZWN0ICopc2VsZiwgMCwgZGxsKSkgewotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc2VsZik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopZGxsKTsgLyogZm9yIEtlZXBSZWYgKi8KKyAgICBpZiAoLTEgPT0gS2VlcFJlZigoQ0RhdGFPYmplY3QgKilzZWxmLCAwLCBkbGwpKSB7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKHNlbGYpOwotCXNlbGYtPmNhbGxhYmxlID0gKFB5T2JqZWN0ICopc2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgc2VsZi0+Y2FsbGFibGUgPSAoUHlPYmplY3QgKilzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNGdW5jUHRyX0Zyb21WdGJsSW5kZXgoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlDRnVuY1B0ck9iamVjdCAqc2VsZjsKLQlpbnQgaW5kZXg7Ci0JY2hhciAqbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKnBhcmFtZmxhZ3MgPSBOVUxMOwotCUdVSUQgKmlpZCA9IE5VTEw7Ci0JUHlfc3NpemVfdCBpaWRfbGVuID0gMDsKKyAgICBQeUNGdW5jUHRyT2JqZWN0ICpzZWxmOworICAgIGludCBpbmRleDsKKyAgICBjaGFyICpuYW1lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcGFyYW1mbGFncyA9IE5VTEw7CisgICAgR1VJRCAqaWlkID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGlpZF9sZW4gPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpc3xPeiMiLCAmaW5kZXgsICZuYW1lLCAmcGFyYW1mbGFncywgJmlpZCwgJmlpZF9sZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGFyYW1mbGFncyA9PSBQeV9Ob25lKQotCQlwYXJhbWZsYWdzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzfE96IyIsICZpbmRleCwgJm5hbWUsICZwYXJhbWZsYWdzLCAmaWlkLCAmaWlkX2xlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXJhbWZsYWdzID09IFB5X05vbmUpCisgICAgICAgIHBhcmFtZmxhZ3MgPSBOVUxMOwogCi0JaWYgKCFfdmFsaWRhdGVfcGFyYW1mbGFncyh0eXBlLCBwYXJhbWZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfdmFsaWRhdGVfcGFyYW1mbGFncyh0eXBlLCBwYXJhbWZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzZWxmID0gKFB5Q0Z1bmNQdHJPYmplY3QgKilHZW5lcmljUHlDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0Jc2VsZi0+aW5kZXggPSBpbmRleCArIDB4MTAwMDsKLQlQeV9YSU5DUkVGKHBhcmFtZmxhZ3MpOwotCXNlbGYtPnBhcmFtZmxhZ3MgPSBwYXJhbWZsYWdzOwotCWlmIChpaWRfbGVuID09IHNpemVvZihHVUlEKSkKLQkJc2VsZi0+aWlkID0gaWlkOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIHNlbGYgPSAoUHlDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNQeUNEYXRhX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBzZWxmLT5pbmRleCA9IGluZGV4ICsgMHgxMDAwOworICAgIFB5X1hJTkNSRUYocGFyYW1mbGFncyk7CisgICAgc2VsZi0+cGFyYW1mbGFncyA9IHBhcmFtZmxhZ3M7CisgICAgaWYgKGlpZF9sZW4gPT0gc2l6ZW9mKEdVSUQpKQorICAgICAgICBzZWxmLT5paWQgPSBpaWQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAjZW5kaWYKIApAQCAtMzM4Niw5MSArMzM4Niw5MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q0Z1bmNQdHJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5Q0Z1bmNQdHJPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKmNhbGxhYmxlOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JQ1RodW5rT2JqZWN0ICp0aHVuazsKKyAgICBQeUNGdW5jUHRyT2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICpjYWxsYWJsZTsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIENUaHVua09iamVjdCAqdGh1bms7CiAKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKQotCQlyZXR1cm4gR2VuZXJpY1B5Q0RhdGFfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApCisgICAgICAgIHJldHVybiBHZW5lcmljUHlDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CiAKLQlpZiAoMSA8PSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICYmIFB5VHVwbGVfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpCi0JCXJldHVybiBQeUNGdW5jUHRyX0Zyb21EbGwodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKDEgPD0gUHlUdXBsZV9HRVRfU0laRShhcmdzKSAmJiBQeVR1cGxlX0NoZWNrKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpKQorICAgICAgICByZXR1cm4gUHlDRnVuY1B0cl9Gcm9tRGxsKHR5cGUsIGFyZ3MsIGt3ZHMpOwogCiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoMiA8PSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICYmIFB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpKQotCQlyZXR1cm4gUHlDRnVuY1B0cl9Gcm9tVnRibEluZGV4KHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICgyIDw9IFB5VHVwbGVfR0VUX1NJWkUoYXJncykgJiYgUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpCisgICAgICAgIHJldHVybiBQeUNGdW5jUHRyX0Zyb21WdGJsSW5kZXgodHlwZSwgYXJncywga3dkcyk7CiAjZW5kaWYKIAotCWlmICgxID09IFB5VHVwbGVfR0VUX1NJWkUoYXJncykKLQkgICAgJiYgKFB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpCi0JCXx8IFB5TG9uZ19DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSkpIHsKLQkJQ0RhdGFPYmplY3QgKm9iOwotCQl2b2lkICpwdHIgPSBQeUxvbmdfQXNWb2lkUHRyKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpOwotCQlpZiAocHRyID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlvYiA9IChDRGF0YU9iamVjdCAqKUdlbmVyaWNQeUNEYXRhX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKLQkJaWYgKG9iID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJKih2b2lkICoqKW9iLT5iX3B0ciA9IHB0cjsKLQkJcmV0dXJuIChQeU9iamVjdCAqKW9iOwotCX0KKyAgICBpZiAoMSA9PSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpCisgICAgICAgICYmIChQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKQorICAgICAgICB8fCBQeUxvbmdfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpKSB7CisgICAgICAgIENEYXRhT2JqZWN0ICpvYjsKKyAgICAgICAgdm9pZCAqcHRyID0gUHlMb25nX0FzVm9pZFB0cihQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKTsKKyAgICAgICAgaWYgKHB0ciA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgb2IgPSAoQ0RhdGFPYmplY3QgKilHZW5lcmljUHlDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgICAgIGlmIChvYiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICoodm9pZCAqKilvYi0+Yl9wdHIgPSBwdHI7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilvYjsKKyAgICB9CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmY2FsbGFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY2FsbGFibGUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUgb3IgaW50ZWdlciBmdW5jdGlvbiBhZGRyZXNzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmY2FsbGFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY2FsbGFibGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSBvciBpbnRlZ2VyIGZ1bmN0aW9uIGFkZHJlc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogWFhYIFhYWCBUaGlzIHdvdWxkIGFsbG93IHRvIHBhc3MgYWRkaXRpb25hbCBvcHRpb25zLiAgRm9yIENPTQotCSAgIG1ldGhvZCAqaW1wbGVtZW50YXRpb25zKiwgd2Ugd291bGQgcHJvYmFibHkgd2FudCBkaWZmZXJlbnQKLQkgICBiZWhhdmlvdXIgdGhhbiBpbiAnbm9ybWFsJyBjYWxsYmFjayBmdW5jdGlvbnM6IHJldHVybiBhIEhSRVNVTFQgaWYKLQkgICBhbiBleGNlcHRpb24gb2NjdXJycyBpbiB0aGUgY2FsbGJhY2ssIGFuZCBwcmludCB0aGUgdHJhY2ViYWNrIG5vdAotCSAgIG9ubHkgb24gdGhlIGNvbnNvbGUsIGJ1dCBhbHNvIHRvIE91dHB1dERlYnVnU3RyaW5nKCkgb3Igc29tZXRoaW5nCi0JICAgbGlrZSB0aGF0LgotCSovCisgICAgLyogWFhYIFhYWCBUaGlzIHdvdWxkIGFsbG93IHRvIHBhc3MgYWRkaXRpb25hbCBvcHRpb25zLiAgRm9yIENPTQorICAgICAgIG1ldGhvZCAqaW1wbGVtZW50YXRpb25zKiwgd2Ugd291bGQgcHJvYmFibHkgd2FudCBkaWZmZXJlbnQKKyAgICAgICBiZWhhdmlvdXIgdGhhbiBpbiAnbm9ybWFsJyBjYWxsYmFjayBmdW5jdGlvbnM6IHJldHVybiBhIEhSRVNVTFQgaWYKKyAgICAgICBhbiBleGNlcHRpb24gb2NjdXJycyBpbiB0aGUgY2FsbGJhY2ssIGFuZCBwcmludCB0aGUgdHJhY2ViYWNrIG5vdAorICAgICAgIG9ubHkgb24gdGhlIGNvbnNvbGUsIGJ1dCBhbHNvIHRvIE91dHB1dERlYnVnU3RyaW5nKCkgb3Igc29tZXRoaW5nCisgICAgICAgbGlrZSB0aGF0LgorICAgICovCiAvKgotCWlmIChrd2RzICYmIFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsICJvcHRpb25zIikpIHsKLQkJLi4uCi0JfQorICAgIGlmIChrd2RzICYmIFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsICJvcHRpb25zIikpIHsKKyAgICAgICAgLi4uCisgICAgfQogKi8KIAotCWRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKLQkvKiBYWFhYIEZhaWxzIGlmIHdlIGRvOiAnUHlDRnVuY1B0cihsYW1iZGEgeDogeCknICovCi0JaWYgKCFkaWN0IHx8ICFkaWN0LT5hcmd0eXBlcykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICAgImNhbm5vdCBjb25zdHJ1Y3QgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzczoiCi0JCQkiIG5vIGFyZ3R5cGVzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZSk7CisgICAgLyogWFhYWCBGYWlscyBpZiB3ZSBkbzogJ1B5Q0Z1bmNQdHIobGFtYmRhIHg6IHgpJyAqLworICAgIGlmICghZGljdCB8fCAhZGljdC0+YXJndHlwZXMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICJjYW5ub3QgY29uc3RydWN0IGluc3RhbmNlIG9mIHRoaXMgY2xhc3M6IgorICAgICAgICAgICAgIiBubyBhcmd0eXBlcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl0aHVuayA9IF9jdHlwZXNfYWxsb2NfY2FsbGJhY2soY2FsbGFibGUsCi0JCQkJICAgICAgZGljdC0+YXJndHlwZXMsCi0JCQkJICAgICAgZGljdC0+cmVzdHlwZSwKLQkJCQkgICAgICBkaWN0LT5mbGFncyk7Ci0JaWYgKCF0aHVuaykKLQkJcmV0dXJuIE5VTEw7CisgICAgdGh1bmsgPSBfY3R5cGVzX2FsbG9jX2NhbGxiYWNrKGNhbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmFyZ3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPnJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+ZmxhZ3MpOworICAgIGlmICghdGh1bmspCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChQeUNGdW5jUHRyT2JqZWN0ICopR2VuZXJpY1B5Q0RhdGFfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmIChzZWxmID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHRodW5rKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHNlbGYgPSAoUHlDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNQeUNEYXRhX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih0aHVuayk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihjYWxsYWJsZSk7Ci0Jc2VsZi0+Y2FsbGFibGUgPSBjYWxsYWJsZTsKKyAgICBQeV9JTkNSRUYoY2FsbGFibGUpOworICAgIHNlbGYtPmNhbGxhYmxlID0gY2FsbGFibGU7CiAKLQlzZWxmLT50aHVuayA9IHRodW5rOwotCSoodm9pZCAqKilzZWxmLT5iX3B0ciA9ICh2b2lkICopdGh1bmstPnBjbDsKLQkKLQlQeV9JTkNSRUYoKFB5T2JqZWN0ICopdGh1bmspOyAvKiBmb3IgS2VlcFJlZiAqLwotCWlmICgtMSA9PSBLZWVwUmVmKChDRGF0YU9iamVjdCAqKXNlbGYsIDAsIChQeU9iamVjdCAqKXRodW5rKSkgewotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc2VsZik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBzZWxmLT50aHVuayA9IHRodW5rOworICAgICoodm9pZCAqKilzZWxmLT5iX3B0ciA9ICh2b2lkICopdGh1bmstPnBjbDsKKworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKil0aHVuayk7IC8qIGZvciBLZWVwUmVmICovCisgICAgaWYgKC0xID09IEtlZXBSZWYoKENEYXRhT2JqZWN0ICopc2VsZiwgMCwgKFB5T2JqZWN0ICopdGh1bmspKSB7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiAKQEAgLTM0ODAsNTQgKzM0ODAsNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfYnlyZWYoUHlPYmplY3QgKm9iaikKIHsKLQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JaWYgKCFDRGF0YU9iamVjdF9DaGVjayhvYmopKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImV4cGVjdGVkIENEYXRhIGluc3RhbmNlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgaWYgKCFDRGF0YU9iamVjdF9DaGVjayhvYmopKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgQ0RhdGEgaW5zdGFuY2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcGFyZyA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKLQlpZiAocGFyZyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcGFyZyA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKKyAgICBpZiAocGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwYXJnLT50YWcgPSAnUCc7Ci0JcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JcGFyZy0+b2JqID0gb2JqOwotCXBhcmctPnZhbHVlLnAgPSAoKENEYXRhT2JqZWN0ICopb2JqKS0+Yl9wdHI7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgcGFyZy0+dGFnID0gJ1AnOworICAgIHBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgIHBhcmctPm9iaiA9IG9iajsKKyAgICBwYXJnLT52YWx1ZS5wID0gKChDRGF0YU9iamVjdCAqKW9iaiktPmJfcHRyOworICAgIHJldHVybiAoUHlPYmplY3QgKilwYXJnOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogX2dldF9hcmcoaW50ICpwaW5kZXgsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpkZWZ2YWwsIFB5T2JqZWN0ICppbmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKCpwaW5kZXggPCBQeVR1cGxlX0dFVF9TSVpFKGluYXJncykpIHsKLQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oaW5hcmdzLCAqcGluZGV4KTsKLQkJKysqcGluZGV4OwotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiB2OwotCX0KLQlpZiAoa3dkcyAmJiAodiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsIG5hbWUpKSkgewotCQkrKypwaW5kZXg7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dXJuIHY7Ci0JfQotCWlmIChkZWZ2YWwpIHsKLQkJUHlfSU5DUkVGKGRlZnZhbCk7Ci0JCXJldHVybiBkZWZ2YWw7Ci0JfQotCS8qIHdlIGNhbid0IGN1cnJlbnRseSBlbWl0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgKi8KLQlpZiAobmFtZSkKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgInJlcXVpcmVkIGFyZ3VtZW50ICclcycgbWlzc2luZyIsIG5hbWUpOwotCWVsc2UKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIm5vdCBlbm91Z2ggYXJndW1lbnRzIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKCpwaW5kZXggPCBQeVR1cGxlX0dFVF9TSVpFKGluYXJncykpIHsKKyAgICAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oaW5hcmdzLCAqcGluZGV4KTsKKyAgICAgICAgKysqcGluZGV4OworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICBpZiAoa3dkcyAmJiAodiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsIG5hbWUpKSkgeworICAgICAgICArKypwaW5kZXg7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIGlmIChkZWZ2YWwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlZnZhbCk7CisgICAgICAgIHJldHVybiBkZWZ2YWw7CisgICAgfQorICAgIC8qIHdlIGNhbid0IGN1cnJlbnRseSBlbWl0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgKi8KKyAgICBpZiAobmFtZSkKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBhcmd1bWVudCAnJXMnIG1pc3NpbmciLCBuYW1lKTsKKyAgICBlbHNlCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBhcmd1bWVudHMiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyoKQEAgLTM1NTAsMTcwICszNTUwLDE3MCBAQAogKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBfYnVpbGRfY2FsbGFyZ3MoUHlDRnVuY1B0ck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3R5cGVzLAotCQlQeU9iamVjdCAqaW5hcmdzLCBQeU9iamVjdCAqa3dkcywKLQkJaW50ICpwb3V0bWFzaywgaW50ICpwaW5vdXRtYXNrLCB1bnNpZ25lZCBpbnQgKnBudW1yZXR2YWxzKQorICAgICAgICAgICAgICAgIFB5T2JqZWN0ICppbmFyZ3MsIFB5T2JqZWN0ICprd2RzLAorICAgICAgICAgICAgICAgIGludCAqcG91dG1hc2ssIGludCAqcGlub3V0bWFzaywgdW5zaWduZWQgaW50ICpwbnVtcmV0dmFscykKIHsKLQlQeU9iamVjdCAqcGFyYW1mbGFncyA9IHNlbGYtPnBhcmFtZmxhZ3M7Ci0JUHlPYmplY3QgKmNhbGxhcmdzOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JUHlfc3NpemVfdCBpLCBsZW47Ci0JaW50IGluYXJnc19pbmRleCA9IDA7Ci0JLyogSXQncyBhIGxpdHRsZSBiaXQgZGlmZmljdWx0IHRvIGRldGVybWluZSBob3cgbWFueSBhcmd1bWVudHMgdGhlCi0JZnVuY3Rpb24gY2FsbCByZXF1aXJlcy9hY2NlcHRzLiAgRm9yIHNpbXBsaWNpdHksIHdlIGNvdW50IHRoZSBjb25zdW1lZAotCWFyZ3MgYW5kIGNvbXBhcmUgdGhpcyB0byB0aGUgbnVtYmVyIG9mIHN1cHBsaWVkIGFyZ3MuICovCi0JUHlfc3NpemVfdCBhY3R1YWxfYXJnczsKKyAgICBQeU9iamVjdCAqcGFyYW1mbGFncyA9IHNlbGYtPnBhcmFtZmxhZ3M7CisgICAgUHlPYmplY3QgKmNhbGxhcmdzOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUHlfc3NpemVfdCBpLCBsZW47CisgICAgaW50IGluYXJnc19pbmRleCA9IDA7CisgICAgLyogSXQncyBhIGxpdHRsZSBiaXQgZGlmZmljdWx0IHRvIGRldGVybWluZSBob3cgbWFueSBhcmd1bWVudHMgdGhlCisgICAgZnVuY3Rpb24gY2FsbCByZXF1aXJlcy9hY2NlcHRzLiAgRm9yIHNpbXBsaWNpdHksIHdlIGNvdW50IHRoZSBjb25zdW1lZAorICAgIGFyZ3MgYW5kIGNvbXBhcmUgdGhpcyB0byB0aGUgbnVtYmVyIG9mIHN1cHBsaWVkIGFyZ3MuICovCisgICAgUHlfc3NpemVfdCBhY3R1YWxfYXJnczsKIAotCSpwb3V0bWFzayA9IDA7Ci0JKnBpbm91dG1hc2sgPSAwOwotCSpwbnVtcmV0dmFscyA9IDA7CisgICAgKnBvdXRtYXNrID0gMDsKKyAgICAqcGlub3V0bWFzayA9IDA7CisgICAgKnBudW1yZXR2YWxzID0gMDsKIAotCS8qIFRyaXZpYWwgY2FzZXMsIHdoZXJlIHdlIGVpdGhlciByZXR1cm4gaW5hcmdzIGl0c2VsZiwgb3IgYSBzbGljZSBvZiBpdC4gKi8KLQlpZiAoYXJndHlwZXMgPT0gTlVMTCB8fCBwYXJhbWZsYWdzID09IE5VTEwgfHwgUHlUdXBsZV9HRVRfU0laRShhcmd0eXBlcykgPT0gMCkgeworICAgIC8qIFRyaXZpYWwgY2FzZXMsIHdoZXJlIHdlIGVpdGhlciByZXR1cm4gaW5hcmdzIGl0c2VsZiwgb3IgYSBzbGljZSBvZiBpdC4gKi8KKyAgICBpZiAoYXJndHlwZXMgPT0gTlVMTCB8fCBwYXJhbWZsYWdzID09IE5VTEwgfHwgUHlUdXBsZV9HRVRfU0laRShhcmd0eXBlcykgPT0gMCkgewogI2lmZGVmIE1TX1dJTjMyCi0JCWlmIChzZWxmLT5pbmRleCkKLQkJCXJldHVybiBQeVR1cGxlX0dldFNsaWNlKGluYXJncywgMSwgUHlUdXBsZV9HRVRfU0laRShpbmFyZ3MpKTsKKyAgICAgICAgaWYgKHNlbGYtPmluZGV4KQorICAgICAgICAgICAgcmV0dXJuIFB5VHVwbGVfR2V0U2xpY2UoaW5hcmdzLCAxLCBQeVR1cGxlX0dFVF9TSVpFKGluYXJncykpOwogI2VuZGlmCi0JCVB5X0lOQ1JFRihpbmFyZ3MpOwotCQlyZXR1cm4gaW5hcmdzOwotCX0KKyAgICAgICAgUHlfSU5DUkVGKGluYXJncyk7CisgICAgICAgIHJldHVybiBpbmFyZ3M7CisgICAgfQogCi0JbGVuID0gUHlUdXBsZV9HRVRfU0laRShhcmd0eXBlcyk7Ci0JY2FsbGFyZ3MgPSBQeVR1cGxlX05ldyhsZW4pOyAvKiB0aGUgYXJndW1lbnQgdHVwbGUgd2UgYnVpbGQgKi8KLQlpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbGVuID0gUHlUdXBsZV9HRVRfU0laRShhcmd0eXBlcyk7CisgICAgY2FsbGFyZ3MgPSBQeVR1cGxlX05ldyhsZW4pOyAvKiB0aGUgYXJndW1lbnQgdHVwbGUgd2UgYnVpbGQgKi8KKyAgICBpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNpZmRlZiBNU19XSU4zMgotCS8qIEZvciBhIENPTSBtZXRob2QsIHNraXAgdGhlIGZpcnN0IGFyZyAqLwotCWlmIChzZWxmLT5pbmRleCkgewotCQlpbmFyZ3NfaW5kZXggPSAxOwotCX0KKyAgICAvKiBGb3IgYSBDT00gbWV0aG9kLCBza2lwIHRoZSBmaXJzdCBhcmcgKi8KKyAgICBpZiAoc2VsZi0+aW5kZXgpIHsKKyAgICAgICAgaW5hcmdzX2luZGV4ID0gMTsKKyAgICB9CiAjZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLQkJUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBhcmFtZmxhZ3MsIGkpOwotCQlQeU9iamVjdCAqb2I7Ci0JCWludCBmbGFnOwotCQljaGFyICpuYW1lID0gTlVMTDsKLQkJUHlPYmplY3QgKmRlZnZhbCA9IE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShwYXJhbWZsYWdzLCBpKTsKKyAgICAgICAgUHlPYmplY3QgKm9iOworICAgICAgICBpbnQgZmxhZzsKKyAgICAgICAgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICpkZWZ2YWwgPSBOVUxMOwogCi0JCS8qIFRoaXMgd2F5IHNlZW1zIHRvIGJlIH4yIHVzIGZhc3RlciB0aGFuIHRoZSBQeUFyZ19QYXJzZVR1cGxlCi0JCSAgIGNhbGxzIGJlbG93LiAqLwotCQkvKiBXZSBIQVZFIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSB0dXBsZSBjYW4gYmUgcGFyc2VkIHdpdGggIml8ek8iLCBzby4uLiAqLwotCQlQeV9zc2l6ZV90IHRzaXplID0gUHlUdXBsZV9HRVRfU0laRShpdGVtKTsKLQkJZmxhZyA9IFB5SW50X0FTX0xPTkcoUHlUdXBsZV9HRVRfSVRFTShpdGVtLCAwKSk7Ci0JCW5hbWUgPSB0c2l6ZSA+IDEgPyBQeVN0cmluZ19BU19TVFJJTkcoUHlUdXBsZV9HRVRfSVRFTShpdGVtLCAxKSkgOiBOVUxMOwotCQlkZWZ2YWwgPSB0c2l6ZSA+IDIgPyBQeVR1cGxlX0dFVF9JVEVNKGl0ZW0sIDIpIDogTlVMTDsKKyAgICAgICAgLyogVGhpcyB3YXkgc2VlbXMgdG8gYmUgfjIgdXMgZmFzdGVyIHRoYW4gdGhlIFB5QXJnX1BhcnNlVHVwbGUKKyAgICAgICAgICAgY2FsbHMgYmVsb3cuICovCisgICAgICAgIC8qIFdlIEhBVkUgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlIHR1cGxlIGNhbiBiZSBwYXJzZWQgd2l0aCAiaXx6TyIsIHNvLi4uICovCisgICAgICAgIFB5X3NzaXplX3QgdHNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGl0ZW0pOworICAgICAgICBmbGFnID0gUHlJbnRfQVNfTE9ORyhQeVR1cGxlX0dFVF9JVEVNKGl0ZW0sIDApKTsKKyAgICAgICAgbmFtZSA9IHRzaXplID4gMSA/IFB5U3RyaW5nX0FTX1NUUklORyhQeVR1cGxlX0dFVF9JVEVNKGl0ZW0sIDEpKSA6IE5VTEw7CisgICAgICAgIGRlZnZhbCA9IHRzaXplID4gMiA/IFB5VHVwbGVfR0VUX0lURU0oaXRlbSwgMikgOiBOVUxMOwogCi0JCXN3aXRjaCAoZmxhZyAmIChQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZPVVQgfCBQQVJBTUZMQUdfRkxDSUQpKSB7Ci0JCWNhc2UgUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GTENJRDoKLQkJCS8qIFsnaW4nLCAnbGNpZCddIHBhcmFtZXRlci4gIEFsd2F5cyB0YWtlbiBmcm9tIGRlZnZhbCwKLQkJCSBpZiBnaXZlbiwgZWxzZSB0aGUgaW50ZWdlciAwLiAqLwotCQkJaWYgKGRlZnZhbCA9PSBOVUxMKSB7Ci0JCQkJZGVmdmFsID0gUHlJbnRfRnJvbUxvbmcoMCk7Ci0JCQkJaWYgKGRlZnZhbCA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJfSBlbHNlCi0JCQkJUHlfSU5DUkVGKGRlZnZhbCk7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBpLCBkZWZ2YWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgKFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRk9VVCk6Ci0JCQkqcGlub3V0bWFzayB8PSAoMSA8PCBpKTsgLyogbWFyayBhcyBpbm91dCBhcmcgKi8KLQkJCSgqcG51bXJldHZhbHMpKys7Ci0JCQkvKiBmYWxsIHRocm91Z2ggdG8gUEFSQU1GTEFHX0ZJTi4uLiAqLwotCQljYXNlIDA6Ci0JCWNhc2UgUEFSQU1GTEFHX0ZJTjoKLQkJCS8qICdpbicgcGFyYW1ldGVyLiAgQ29weSBpdCBmcm9tIGluYXJncy4gKi8KLQkJCW9iID1fZ2V0X2FyZygmaW5hcmdzX2luZGV4LCBuYW1lLCBkZWZ2YWwsIGluYXJncywga3dkcyk7Ci0JCQlpZiAob2IgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgaSwgb2IpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEFSQU1GTEFHX0ZPVVQ6Ci0JCQkvKiBYWFggUmVmYWN0b3IgdGhpcyBjb2RlIGludG8gYSBzZXBhcmF0ZSBmdW5jdGlvbi4gKi8KLQkJCS8qICdvdXQnIHBhcmFtZXRlci4KLQkJCSAgIGFyZ3R5cGVzW2ldIG11c3QgYmUgYSBQT0lOVEVSIHRvIGEgYyB0eXBlLgorICAgICAgICBzd2l0Y2ggKGZsYWcgJiAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUIHwgUEFSQU1GTEFHX0ZMQ0lEKSkgeworICAgICAgICBjYXNlIFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRkxDSUQ6CisgICAgICAgICAgICAvKiBbJ2luJywgJ2xjaWQnXSBwYXJhbWV0ZXIuICBBbHdheXMgdGFrZW4gZnJvbSBkZWZ2YWwsCisgICAgICAgICAgICAgaWYgZ2l2ZW4sIGVsc2UgdGhlIGludGVnZXIgMC4gKi8KKyAgICAgICAgICAgIGlmIChkZWZ2YWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGRlZnZhbCA9IFB5SW50X0Zyb21Mb25nKDApOworICAgICAgICAgICAgICAgIGlmIChkZWZ2YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihkZWZ2YWwpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgaSwgZGVmdmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIChQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZPVVQpOgorICAgICAgICAgICAgKnBpbm91dG1hc2sgfD0gKDEgPDwgaSk7IC8qIG1hcmsgYXMgaW5vdXQgYXJnICovCisgICAgICAgICAgICAoKnBudW1yZXR2YWxzKSsrOworICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIHRvIFBBUkFNRkxBR19GSU4uLi4gKi8KKyAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIFBBUkFNRkxBR19GSU46CisgICAgICAgICAgICAvKiAnaW4nIHBhcmFtZXRlci4gIENvcHkgaXQgZnJvbSBpbmFyZ3MuICovCisgICAgICAgICAgICBvYiA9X2dldF9hcmcoJmluYXJnc19pbmRleCwgbmFtZSwgZGVmdmFsLCBpbmFyZ3MsIGt3ZHMpOworICAgICAgICAgICAgaWYgKG9iID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIGksIG9iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBBUkFNRkxBR19GT1VUOgorICAgICAgICAgICAgLyogWFhYIFJlZmFjdG9yIHRoaXMgY29kZSBpbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24uICovCisgICAgICAgICAgICAvKiAnb3V0JyBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgICBhcmd0eXBlc1tpXSBtdXN0IGJlIGEgUE9JTlRFUiB0byBhIGMgdHlwZS4KIAotCQkJICAgQ2Fubm90IGJ5IHN1cHBsaWVkIGluIGluYXJncywgYnV0IGEgZGVmdmFsIHdpbGwgYmUgdXNlZAotCQkJICAgaWYgYXZhaWxhYmxlLiAgWFhYIFNob3VsZCB3ZSBzdXBwb3J0IGdldHRpbmcgaXQgZnJvbSBrd2RzPwotCQkJKi8KLQkJCWlmIChkZWZ2YWwpIHsKLQkJCQkvKiBYWFggVXNpbmcgbXV0YWJsZSBvYmplY3RzIGFzIGRlZnZhbCB3aWxsCi0JCQkJICAgbWFrZSB0aGUgZnVuY3Rpb24gbm9uLXRocmVhZHNhZmUsIHVubGVzcyB3ZQotCQkJCSAgIGNvcHkgdGhlIG9iamVjdCBpbiBlYWNoIGludm9jYXRpb24gKi8KLQkJCQlQeV9JTkNSRUYoZGVmdmFsKTsKLQkJCQlQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBpLCBkZWZ2YWwpOwotCQkJCSpwb3V0bWFzayB8PSAoMSA8PCBpKTsgLyogbWFyayBhcyBvdXQgYXJnICovCi0JCQkJKCpwbnVtcmV0dmFscykrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW9iID0gUHlUdXBsZV9HRVRfSVRFTShhcmd0eXBlcywgaSk7Ci0JCQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2IpOwotCQkJaWYgKGRpY3QgPT0gTlVMTCkgewotCQkJCS8qIENhbm5vdCBoYXBwZW46IF92YWxpZGF0ZV9wYXJhbWZsYWdzKCkKLQkJCQkgIHdvdWxkIG5vdCBhY2NlcHQgc3VjaCBhbiBvYmplY3QgKi8KLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkgICAgICJOVUxMIHN0Z2RpY3QgdW5leHBlY3RlZCIpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAoUHlTdHJpbmdfQ2hlY2soZGljdC0+cHJvdG8pKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KAotCQkJCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSIlcyAnb3V0JyBwYXJhbWV0ZXIgbXVzdCBiZSBwYXNzZWQgYXMgZGVmYXVsdCB2YWx1ZSIsCi0JCQkJCSgoUHlUeXBlT2JqZWN0ICopb2IpLT50cF9uYW1lKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKFB5Q0FycmF5VHlwZU9iamVjdF9DaGVjayhvYikpCi0JCQkJb2IgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG9iLCBOVUxMKTsKLQkJCWVsc2UKLQkJCQkvKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHBvaW50ZWQtdG8gdHlwZSAqLwotCQkJCW9iID0gUHlPYmplY3RfQ2FsbE9iamVjdChkaWN0LT5wcm90bywgTlVMTCk7Ci0JCQkvKgkJCSAgIAotCQkJICAgWFhYIElzIHRoZSBmb2xsb3dpbmcgY29ycmVjdCBhbnkgbG9uZ2VyPwotCQkJICAgV2UgbXVzdCBub3QgcGFzcyBhIGJ5cmVmKCkgdG8gdGhlIGFycmF5IHRoZW4gYnV0Ci0JCQkgICB0aGUgYXJyYXkgaW5zdGFuY2UgaXRzZWxmLiBUaGVuLCB3ZSBjYW5ub3QgcmV0cml2ZQotCQkJICAgdGhlIHJlc3VsdCBmcm9tIHRoZSBQeUNBcmdPYmplY3QuCi0JCQkqLwotCQkJaWYgKG9iID09IE5VTEwpCi0JCQkJZ290byBlcnJvcjsKLQkJCS8qIFRoZSAuZnJvbV9wYXJhbSBjYWxsIHRoYXQgd2lsbCBvY3VyciBsYXRlciB3aWxsIHBhc3MgdGhpcwotCQkJICAgYXMgYSBieXJlZiBwYXJhbWV0ZXIuICovCi0JCQlQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBpLCBvYik7Ci0JCQkqcG91dG1hc2sgfD0gKDEgPDwgaSk7IC8qIG1hcmsgYXMgb3V0IGFyZyAqLwotCQkJKCpwbnVtcmV0dmFscykrKzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgICAicGFyYW1mbGFnICVkIG5vdCB5ZXQgaW1wbGVtZW50ZWQiLCBmbGFnKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCQlicmVhazsKLQkJfQotCX0KKyAgICAgICAgICAgICAgIENhbm5vdCBieSBzdXBwbGllZCBpbiBpbmFyZ3MsIGJ1dCBhIGRlZnZhbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgICAgICAgIGlmIGF2YWlsYWJsZS4gIFhYWCBTaG91bGQgd2Ugc3VwcG9ydCBnZXR0aW5nIGl0IGZyb20ga3dkcz8KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoZGVmdmFsKSB7CisgICAgICAgICAgICAgICAgLyogWFhYIFVzaW5nIG11dGFibGUgb2JqZWN0cyBhcyBkZWZ2YWwgd2lsbAorICAgICAgICAgICAgICAgICAgIG1ha2UgdGhlIGZ1bmN0aW9uIG5vbi10aHJlYWRzYWZlLCB1bmxlc3Mgd2UKKyAgICAgICAgICAgICAgICAgICBjb3B5IHRoZSBvYmplY3QgaW4gZWFjaCBpbnZvY2F0aW9uICovCisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGRlZnZhbCk7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgaSwgZGVmdmFsKTsKKyAgICAgICAgICAgICAgICAqcG91dG1hc2sgfD0gKDEgPDwgaSk7IC8qIG1hcmsgYXMgb3V0IGFyZyAqLworICAgICAgICAgICAgICAgICgqcG51bXJldHZhbHMpKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvYiA9IFB5VHVwbGVfR0VUX0lURU0oYXJndHlwZXMsIGkpOworICAgICAgICAgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KG9iKTsKKyAgICAgICAgICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBDYW5ub3QgaGFwcGVuOiBfdmFsaWRhdGVfcGFyYW1mbGFncygpCisgICAgICAgICAgICAgICAgICB3b3VsZCBub3QgYWNjZXB0IHN1Y2ggYW4gb2JqZWN0ICovCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgc3RnZGljdCB1bmV4cGVjdGVkIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhkaWN0LT5wcm90bykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIiVzICdvdXQnIHBhcmFtZXRlciBtdXN0IGJlIHBhc3NlZCBhcyBkZWZhdWx0IHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKilvYiktPnRwX25hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlDQXJyYXlUeXBlT2JqZWN0X0NoZWNrKG9iKSkKKyAgICAgICAgICAgICAgICBvYiA9IFB5T2JqZWN0X0NhbGxPYmplY3Qob2IsIE5VTEwpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8qIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcG9pbnRlZC10byB0eXBlICovCisgICAgICAgICAgICAgICAgb2IgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGRpY3QtPnByb3RvLCBOVUxMKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICBYWFggSXMgdGhlIGZvbGxvd2luZyBjb3JyZWN0IGFueSBsb25nZXI/CisgICAgICAgICAgICAgICBXZSBtdXN0IG5vdCBwYXNzIGEgYnlyZWYoKSB0byB0aGUgYXJyYXkgdGhlbiBidXQKKyAgICAgICAgICAgICAgIHRoZSBhcnJheSBpbnN0YW5jZSBpdHNlbGYuIFRoZW4sIHdlIGNhbm5vdCByZXRyaXZlCisgICAgICAgICAgICAgICB0aGUgcmVzdWx0IGZyb20gdGhlIFB5Q0FyZ09iamVjdC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAob2IgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgLyogVGhlIC5mcm9tX3BhcmFtIGNhbGwgdGhhdCB3aWxsIG9jdXJyIGxhdGVyIHdpbGwgcGFzcyB0aGlzCisgICAgICAgICAgICAgICBhcyBhIGJ5cmVmIHBhcmFtZXRlci4gKi8KKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIGksIG9iKTsKKyAgICAgICAgICAgICpwb3V0bWFzayB8PSAoMSA8PCBpKTsgLyogbWFyayBhcyBvdXQgYXJnICovCisgICAgICAgICAgICAoKnBudW1yZXR2YWxzKSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1mbGFnICVkIG5vdCB5ZXQgaW1wbGVtZW50ZWQiLCBmbGFnKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIFdlIGhhdmUgY291bnRlZCB0aGUgYXJndW1lbnRzIHdlIGhhdmUgY29uc3VtZWQgaW4gJ2luYXJnc19pbmRleCcuICBUaGlzCi0JICAgbXVzdCBiZSB0aGUgc2FtZSBhcyBsZW4oaW5hcmdzKSArIGxlbihrd2RzKSwgb3RoZXJ3aXNlIHdlIGhhdmUKLQkgICBlaXRoZXIgdG9vIG11Y2ggb3Igbm90IGVub3VnaCBhcmd1bWVudHMuICovCisgICAgLyogV2UgaGF2ZSBjb3VudGVkIHRoZSBhcmd1bWVudHMgd2UgaGF2ZSBjb25zdW1lZCBpbiAnaW5hcmdzX2luZGV4Jy4gIFRoaXMKKyAgICAgICBtdXN0IGJlIHRoZSBzYW1lIGFzIGxlbihpbmFyZ3MpICsgbGVuKGt3ZHMpLCBvdGhlcndpc2Ugd2UgaGF2ZQorICAgICAgIGVpdGhlciB0b28gbXVjaCBvciBub3QgZW5vdWdoIGFyZ3VtZW50cy4gKi8KIAotCWFjdHVhbF9hcmdzID0gUHlUdXBsZV9HRVRfU0laRShpbmFyZ3MpICsgKGt3ZHMgPyBQeURpY3RfU2l6ZShrd2RzKSA6IDApOwotCWlmIChhY3R1YWxfYXJncyAhPSBpbmFyZ3NfaW5kZXgpIHsKLQkJLyogV2hlbiB3ZSBoYXZlIGRlZmF1bHQgdmFsdWVzIG9yIG5hbWVkIHBhcmFtZXRlcnMsIHRoaXMgZXJyb3IKLQkJICAgbWVzc2FnZSBpcyBtaXNsZWFkaW5nLiAgU2VlIHVuaXR0ZXN0cy90ZXN0X3BhcmFtZmxhZ3MucHkKLQkJICovCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgYWN0dWFsX2FyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKGluYXJncykgKyAoa3dkcyA/IFB5RGljdF9TaXplKGt3ZHMpIDogMCk7CisgICAgaWYgKGFjdHVhbF9hcmdzICE9IGluYXJnc19pbmRleCkgeworICAgICAgICAvKiBXaGVuIHdlIGhhdmUgZGVmYXVsdCB2YWx1ZXMgb3IgbmFtZWQgcGFyYW1ldGVycywgdGhpcyBlcnJvcgorICAgICAgICAgICBtZXNzYWdlIGlzIG1pc2xlYWRpbmcuICBTZWUgdW5pdHRlc3RzL3Rlc3RfcGFyYW1mbGFncy5weQorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCQkJICAgICAiY2FsbCB0YWtlcyBleGFjdGx5ICVkIGFyZ3VtZW50cyAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICJjYWxsIHRha2VzIGV4YWN0bHkgJWQgYXJndW1lbnRzICglZCBnaXZlbikiLAogI2Vsc2UKLQkJCSAgICAgImNhbGwgdGFrZXMgZXhhY3RseSAlZCBhcmd1bWVudHMgKCV6ZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgImNhbGwgdGFrZXMgZXhhY3RseSAlZCBhcmd1bWVudHMgKCV6ZCBnaXZlbikiLAogI2VuZGlmCi0JCQkgICAgIGluYXJnc19pbmRleCwgYWN0dWFsX2FyZ3MpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICAgICAgICAgICAgICAgICAgIGluYXJnc19pbmRleCwgYWN0dWFsX2FyZ3MpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIG91dG1hc2sgaXMgYSBiaXRtYXNrIGNvbnRhaW5pbmcgaW5kZXhlcyBpbnRvIGNhbGxhcmdzLiAgSXRlbXMgYXQKLQkgICB0aGVzZSBpbmRleGVzIGNvbnRhaW4gdmFsdWVzIHRvIHJldHVybi4KLQkgKi8KLQlyZXR1cm4gY2FsbGFyZ3M7CisgICAgLyogb3V0bWFzayBpcyBhIGJpdG1hc2sgY29udGFpbmluZyBpbmRleGVzIGludG8gY2FsbGFyZ3MuICBJdGVtcyBhdAorICAgICAgIHRoZXNlIGluZGV4ZXMgY29udGFpbiB2YWx1ZXMgdG8gcmV0dXJuLgorICAgICAqLworICAgIHJldHVybiBjYWxsYXJnczsKICAgZXJyb3I6Ci0JUHlfREVDUkVGKGNhbGxhcmdzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYoY2FsbGFyZ3MpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBTZWUgYWxzbzoKQEAgLTM3MjYsMzA4ICszNzI2LDMwOCBAQAogKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBfYnVpbGRfcmVzdWx0KFB5T2JqZWN0ICpyZXN1bHQsIFB5T2JqZWN0ICpjYWxsYXJncywKLQkgICAgICBpbnQgb3V0bWFzaywgaW50IGlub3V0bWFzaywgdW5zaWduZWQgaW50IG51bXJldHZhbHMpCisgICAgICAgICAgICAgIGludCBvdXRtYXNrLCBpbnQgaW5vdXRtYXNrLCB1bnNpZ25lZCBpbnQgbnVtcmV0dmFscykKIHsKLQl1bnNpZ25lZCBpbnQgaSwgaW5kZXg7Ci0JaW50IGJpdDsKLQlQeU9iamVjdCAqdHVwID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpbnQgaSwgaW5kZXg7CisgICAgaW50IGJpdDsKKyAgICBQeU9iamVjdCAqdHVwID0gTlVMTDsKIAotCWlmIChjYWxsYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gcmVzdWx0OwotCWlmIChyZXN1bHQgPT0gTlVMTCB8fCBudW1yZXR2YWxzID09IDApIHsKLQkJUHlfREVDUkVGKGNhbGxhcmdzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JUHlfREVDUkVGKHJlc3VsdCk7CisgICAgaWYgKGNhbGxhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8IG51bXJldHZhbHMgPT0gMCkgeworICAgICAgICBQeV9ERUNSRUYoY2FsbGFyZ3MpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKIAotCS8qIHR1cCB3aWxsIG5vdCBiZSBhbGxvY2F0ZWQgaWYgbnVtcmV0dmFscyA9PSAxICovCi0JLyogYWxsb2NhdGUgdHVwbGUgdG8gaG9sZCB0aGUgcmVzdWx0ICovCi0JaWYgKG51bXJldHZhbHMgPiAxKSB7Ci0JCXR1cCA9IFB5VHVwbGVfTmV3KG51bXJldHZhbHMpOwotCQlpZiAodHVwID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihjYWxsYXJncyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICAvKiB0dXAgd2lsbCBub3QgYmUgYWxsb2NhdGVkIGlmIG51bXJldHZhbHMgPT0gMSAqLworICAgIC8qIGFsbG9jYXRlIHR1cGxlIHRvIGhvbGQgdGhlIHJlc3VsdCAqLworICAgIGlmIChudW1yZXR2YWxzID4gMSkgeworICAgICAgICB0dXAgPSBQeVR1cGxlX05ldyhudW1yZXR2YWxzKTsKKyAgICAgICAgaWYgKHR1cCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlpbmRleCA9IDA7Ci0JZm9yIChiaXQgPSAxLCBpID0gMDsgaSA8IDMyOyArK2ksIGJpdCA8PD0gMSkgewotCQlQeU9iamVjdCAqdjsKLQkJaWYgKGJpdCAmIGlub3V0bWFzaykgewotCQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oY2FsbGFyZ3MsIGkpOwotCQkJUHlfSU5DUkVGKHYpOwotCQkJaWYgKG51bXJldHZhbHMgPT0gMSkgewotCQkJCVB5X0RFQ1JFRihjYWxsYXJncyk7Ci0JCQkJcmV0dXJuIHY7Ci0JCQl9Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHR1cCwgaW5kZXgsIHYpOwotCQkJaW5kZXgrKzsKLQkJfSBlbHNlIGlmIChiaXQgJiBvdXRtYXNrKSB7Ci0JCQl2ID0gUHlUdXBsZV9HRVRfSVRFTShjYWxsYXJncywgaSk7Ci0JCQl2ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiX19jdHlwZXNfZnJvbV9vdXRwYXJhbV9fIiwgTlVMTCk7Ci0JCQlpZiAodiA9PSBOVUxMIHx8IG51bXJldHZhbHMgPT0gMSkgewotCQkJCVB5X0RFQ1JFRihjYWxsYXJncyk7Ci0JCQkJcmV0dXJuIHY7Ci0JCQl9Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHR1cCwgaW5kZXgsIHYpOwotCQkJaW5kZXgrKzsKLQkJfQotCQlpZiAoaW5kZXggPT0gbnVtcmV0dmFscykKLQkJCWJyZWFrOwotCX0KKyAgICBpbmRleCA9IDA7CisgICAgZm9yIChiaXQgPSAxLCBpID0gMDsgaSA8IDMyOyArK2ksIGJpdCA8PD0gMSkgeworICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgaWYgKGJpdCAmIGlub3V0bWFzaykgeworICAgICAgICAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oY2FsbGFyZ3MsIGkpOworICAgICAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICAgICAgaWYgKG51bXJldHZhbHMgPT0gMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjYWxsYXJncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cCwgaW5kZXgsIHYpOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfSBlbHNlIGlmIChiaXQgJiBvdXRtYXNrKSB7CisgICAgICAgICAgICB2ID0gUHlUdXBsZV9HRVRfSVRFTShjYWxsYXJncywgaSk7CisgICAgICAgICAgICB2ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiX19jdHlwZXNfZnJvbV9vdXRwYXJhbV9fIiwgTlVMTCk7CisgICAgICAgICAgICBpZiAodiA9PSBOVUxMIHx8IG51bXJldHZhbHMgPT0gMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjYWxsYXJncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cCwgaW5kZXgsIHYpOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPT0gbnVtcmV0dmFscykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIAotCVB5X0RFQ1JFRihjYWxsYXJncyk7Ci0JcmV0dXJuIHR1cDsKKyAgICBQeV9ERUNSRUYoY2FsbGFyZ3MpOworICAgIHJldHVybiB0dXA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNGdW5jUHRyX2NhbGwoUHlDRnVuY1B0ck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmluYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnJlc3R5cGU7Ci0JUHlPYmplY3QgKmNvbnZlcnRlcnM7Ci0JUHlPYmplY3QgKmNoZWNrZXI7Ci0JUHlPYmplY3QgKmFyZ3R5cGVzOwotCVN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKmNhbGxhcmdzOwotCVB5T2JqZWN0ICplcnJjaGVjazsKKyAgICBQeU9iamVjdCAqcmVzdHlwZTsKKyAgICBQeU9iamVjdCAqY29udmVydGVyczsKKyAgICBQeU9iamVjdCAqY2hlY2tlcjsKKyAgICBQeU9iamVjdCAqYXJndHlwZXM7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqY2FsbGFyZ3M7CisgICAgUHlPYmplY3QgKmVycmNoZWNrOwogI2lmZGVmIE1TX1dJTjMyCi0JSVVua25vd24gKnBpdW5rID0gTlVMTDsKKyAgICBJVW5rbm93biAqcGl1bmsgPSBOVUxMOwogI2VuZGlmCi0Jdm9pZCAqcFByb2MgPSBOVUxMOworICAgIHZvaWQgKnBQcm9jID0gTlVMTDsKIAotCWludCBpbm91dG1hc2s7Ci0JaW50IG91dG1hc2s7Ci0JdW5zaWduZWQgaW50IG51bXJldHZhbHM7CisgICAgaW50IGlub3V0bWFzazsKKyAgICBpbnQgb3V0bWFzazsKKyAgICB1bnNpZ25lZCBpbnQgbnVtcmV0dmFsczsKIAotCWFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIFB5Q0Z1bmNQdHJPYmplY3QgaW5zdGFuY2VzICovCi0JcmVzdHlwZSA9IHNlbGYtPnJlc3R5cGUgPyBzZWxmLT5yZXN0eXBlIDogZGljdC0+cmVzdHlwZTsKLQljb252ZXJ0ZXJzID0gc2VsZi0+Y29udmVydGVycyA/IHNlbGYtPmNvbnZlcnRlcnMgOiBkaWN0LT5jb252ZXJ0ZXJzOwotCWNoZWNrZXIgPSBzZWxmLT5jaGVja2VyID8gc2VsZi0+Y2hlY2tlciA6IGRpY3QtPmNoZWNrZXI7Ci0JYXJndHlwZXMgPSBzZWxmLT5hcmd0eXBlcyA/IHNlbGYtPmFyZ3R5cGVzIDogZGljdC0+YXJndHlwZXM7CisgICAgYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgUHlDRnVuY1B0ck9iamVjdCBpbnN0YW5jZXMgKi8KKyAgICByZXN0eXBlID0gc2VsZi0+cmVzdHlwZSA/IHNlbGYtPnJlc3R5cGUgOiBkaWN0LT5yZXN0eXBlOworICAgIGNvbnZlcnRlcnMgPSBzZWxmLT5jb252ZXJ0ZXJzID8gc2VsZi0+Y29udmVydGVycyA6IGRpY3QtPmNvbnZlcnRlcnM7CisgICAgY2hlY2tlciA9IHNlbGYtPmNoZWNrZXIgPyBzZWxmLT5jaGVja2VyIDogZGljdC0+Y2hlY2tlcjsKKyAgICBhcmd0eXBlcyA9IHNlbGYtPmFyZ3R5cGVzID8gc2VsZi0+YXJndHlwZXMgOiBkaWN0LT5hcmd0eXBlczsKIC8qIGxhdGVyLCB3ZSBwcm9iYWJseSB3YW50IHRvIGhhdmUgYW4gZXJyY2hlY2sgZmllbGQgaW4gc3RnZGljdCAqLwotCWVycmNoZWNrID0gc2VsZi0+ZXJyY2hlY2sgLyogPyBzZWxmLT5lcnJjaGVjayA6IGRpY3QtPmVycmNoZWNrICovOworICAgIGVycmNoZWNrID0gc2VsZi0+ZXJyY2hlY2sgLyogPyBzZWxmLT5lcnJjaGVjayA6IGRpY3QtPmVycmNoZWNrICovOwogCiAKLQlwUHJvYyA9ICoodm9pZCAqKilzZWxmLT5iX3B0cjsKKyAgICBwUHJvYyA9ICoodm9pZCAqKilzZWxmLT5iX3B0cjsKICNpZmRlZiBNU19XSU4zMgotCWlmIChzZWxmLT5pbmRleCkgewotCQkvKiBJdCdzIGEgQ09NIG1ldGhvZCAqLwotCQlDRGF0YU9iamVjdCAqdGhpczsKLQkJdGhpcyA9IChDRGF0YU9iamVjdCAqKVB5VHVwbGVfR2V0SXRlbShpbmFyZ3MsIDApOyAvKiBib3Jyb3dlZCByZWYhICovCi0JCWlmICghdGhpcykgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJuYXRpdmUgY29tIG1ldGhvZCBjYWxsIHdpdGhvdXQgJ3RoaXMnIHBhcmFtZXRlciIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKCFDRGF0YU9iamVjdF9DaGVjayh0aGlzKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIkV4cGVjdGVkIGEgQ09NIHRoaXMgcG9pbnRlciBhcyBmaXJzdCBhcmd1bWVudCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJLyogdGhlcmUgc2hvdWxkIGJlIG1vcmUgY2hlY2tzPyBObywgaW4gUHl0aG9uICovCi0JCS8qIEZpcnN0IGFyZyBpcyBhbiBwb2ludGVyIHRvIGFuIGludGVyZmFjZSBpbnN0YW5jZSAqLwotCQlpZiAoIXRoaXMtPmJfcHRyIHx8ICoodm9pZCAqKil0aGlzLT5iX3B0ciA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIk5VTEwgQ09NIHBvaW50ZXIgYWNjZXNzIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlwaXVuayA9ICooSVVua25vd24gKiopdGhpcy0+Yl9wdHI7Ci0JCWlmIChOVUxMID09IHBpdW5rLT5scFZ0YmwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiQ09NIG1ldGhvZCBjYWxsIHdpdGhvdXQgVlRhYmxlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlwUHJvYyA9ICgodm9pZCAqKilwaXVuay0+bHBWdGJsKVtzZWxmLT5pbmRleCAtIDB4MTAwMF07Ci0JfQorICAgIGlmIChzZWxmLT5pbmRleCkgeworICAgICAgICAvKiBJdCdzIGEgQ09NIG1ldGhvZCAqLworICAgICAgICBDRGF0YU9iamVjdCAqdGhpczsKKyAgICAgICAgdGhpcyA9IChDRGF0YU9iamVjdCAqKVB5VHVwbGVfR2V0SXRlbShpbmFyZ3MsIDApOyAvKiBib3Jyb3dlZCByZWYhICovCisgICAgICAgIGlmICghdGhpcykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hdGl2ZSBjb20gbWV0aG9kIGNhbGwgd2l0aG91dCAndGhpcycgcGFyYW1ldGVyIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKHRoaXMpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBhIENPTSB0aGlzIHBvaW50ZXIgYXMgZmlyc3QgYXJndW1lbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIHRoZXJlIHNob3VsZCBiZSBtb3JlIGNoZWNrcz8gTm8sIGluIFB5dGhvbiAqLworICAgICAgICAvKiBGaXJzdCBhcmcgaXMgYW4gcG9pbnRlciB0byBhbiBpbnRlcmZhY2UgaW5zdGFuY2UgKi8KKyAgICAgICAgaWYgKCF0aGlzLT5iX3B0ciB8fCAqKHZvaWQgKiopdGhpcy0+Yl9wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgQ09NIHBvaW50ZXIgYWNjZXNzIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBwaXVuayA9ICooSVVua25vd24gKiopdGhpcy0+Yl9wdHI7CisgICAgICAgIGlmIChOVUxMID09IHBpdW5rLT5scFZ0YmwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT00gbWV0aG9kIGNhbGwgd2l0aG91dCBWVGFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHBQcm9jID0gKCh2b2lkICoqKXBpdW5rLT5scFZ0YmwpW3NlbGYtPmluZGV4IC0gMHgxMDAwXTsKKyAgICB9CiAjZW5kaWYKLQljYWxsYXJncyA9IF9idWlsZF9jYWxsYXJncyhzZWxmLCBhcmd0eXBlcywKLQkJCQkgICBpbmFyZ3MsIGt3ZHMsCi0JCQkJICAgJm91dG1hc2ssICZpbm91dG1hc2ssICZudW1yZXR2YWxzKTsKLQlpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY2FsbGFyZ3MgPSBfYnVpbGRfY2FsbGFyZ3Moc2VsZiwgYXJndHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5hcmdzLCBrd2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRtYXNrLCAmaW5vdXRtYXNrLCAmbnVtcmV0dmFscyk7CisgICAgaWYgKGNhbGxhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGNvbnZlcnRlcnMpIHsKLQkJaW50IHJlcXVpcmVkID0gUHlfU0FGRV9ET1dOQ0FTVChQeVR1cGxlX0dFVF9TSVpFKGNvbnZlcnRlcnMpLAotCQkJCQkgICAgICAgIFB5X3NzaXplX3QsIGludCk7Ci0JCWludCBhY3R1YWwgPSBQeV9TQUZFX0RPV05DQVNUKFB5VHVwbGVfR0VUX1NJWkUoY2FsbGFyZ3MpLAotCQkJCQkgICAgICBQeV9zc2l6ZV90LCBpbnQpOworICAgIGlmIChjb252ZXJ0ZXJzKSB7CisgICAgICAgIGludCByZXF1aXJlZCA9IFB5X1NBRkVfRE9XTkNBU1QoUHlUdXBsZV9HRVRfU0laRShjb252ZXJ0ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90LCBpbnQpOworICAgICAgICBpbnQgYWN0dWFsID0gUHlfU0FGRV9ET1dOQ0FTVChQeVR1cGxlX0dFVF9TSVpFKGNhbGxhcmdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCwgaW50KTsKIAotCQlpZiAoKGRpY3QtPmZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpID09IEZVTkNGTEFHX0NERUNMKSB7Ci0JCQkvKiBGb3IgY2RlY2wgZnVuY3Rpb25zLCB3ZSBhbGxvdyBtb3JlIGFjdHVhbCBhcmd1bWVudHMKLQkJCSAgIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgYXJndHlwZXMgdHVwbGUuCi0JCQkqLwotCQkJaWYgKHJlcXVpcmVkID4gYWN0dWFsKSB7Ci0JCQkJUHlfREVDUkVGKGNhbGxhcmdzKTsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAidGhpcyBmdW5jdGlvbiB0YWtlcyBhdCBsZWFzdCAlZCBhcmd1bWVudCVzICglZCBnaXZlbikiLAotCQkJCQkgICAgIHJlcXVpcmVkLAotCQkJCQkgICAgIHJlcXVpcmVkID09IDEgPyAiIiA6ICJzIiwKLQkJCQkJICAgICBhY3R1YWwpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9IGVsc2UgaWYgKHJlcXVpcmVkICE9IGFjdHVhbCkgewotCQkJUHlfREVDUkVGKGNhbGxhcmdzKTsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJ0aGlzIGZ1bmN0aW9uIHRha2VzICVkIGFyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCi0JCQkJICAgICByZXF1aXJlZCwKLQkJCQkgICAgIHJlcXVpcmVkID09IDEgPyAiIiA6ICJzIiwKLQkJCQkgICAgIGFjdHVhbCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICAgICAgaWYgKChkaWN0LT5mbGFncyAmIEZVTkNGTEFHX0NERUNMKSA9PSBGVU5DRkxBR19DREVDTCkgeworICAgICAgICAgICAgLyogRm9yIGNkZWNsIGZ1bmN0aW9ucywgd2UgYWxsb3cgbW9yZSBhY3R1YWwgYXJndW1lbnRzCisgICAgICAgICAgICAgICB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGFyZ3R5cGVzIHR1cGxlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChyZXF1aXJlZCA+IGFjdHVhbCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjYWxsYXJncyk7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgInRoaXMgZnVuY3Rpb24gdGFrZXMgYXQgbGVhc3QgJWQgYXJndW1lbnQlcyAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPT0gMSA/ICIiIDogInMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZCAhPSBhY3R1YWwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjYWxsYXJncyk7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAidGhpcyBmdW5jdGlvbiB0YWtlcyAlZCBhcmd1bWVudCVzICglZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCA9PSAxID8gIiIgOiAicyIsCisgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXN1bHQgPSBfY3R5cGVzX2NhbGxwcm9jKHBQcm9jLAotCQkJICAgY2FsbGFyZ3MsCisgICAgcmVzdWx0ID0gX2N0eXBlc19jYWxscHJvYyhwUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFyZ3MsCiAjaWZkZWYgTVNfV0lOMzIKLQkJCSAgIHBpdW5rLAotCQkJICAgc2VsZi0+aWlkLAorICAgICAgICAgICAgICAgICAgICAgICBwaXVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aWlkLAogI2VuZGlmCi0JCQkgICBkaWN0LT5mbGFncywKLQkJCSAgIGNvbnZlcnRlcnMsCi0JCQkgICByZXN0eXBlLAotCQkJICAgY2hlY2tlcik7CisgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICByZXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyKTsKIC8qIFRoZSAnZXJyY2hlY2snIHByb3RvY29sICovCi0JaWYgKHJlc3VsdCAhPSBOVUxMICYmIGVycmNoZWNrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhlcnJjaGVjaywKLQkJCQkJCQkgICByZXN1bHQsCi0JCQkJCQkJICAgc2VsZiwKLQkJCQkJCQkgICBjYWxsYXJncywKLQkJCQkJCQkgICBOVUxMKTsKLQkJLyogSWYgdGhlIGVycmNoZWNrIGZ1bnRpb24gZmFpbGVkLCByZXR1cm4gTlVMTC4KLQkJICAgSWYgdGhlIGVycmNoZWNrIGZ1bmN0aW9uIHJldHVybmVkIGNhbGxhcmdzIHVuY2hhbmdlZCwKLQkJICAgY29udGludWUgbm9ybWFsIHByb2Nlc3NpbmcuCi0JCSAgIElmIHRoZSBlcnJjaGVjayBmdW5jdGlvbiByZXR1cm5lZCBzb21ldGhpbmcgZWxzZSwKLQkJICAgdXNlIHRoYXQgYXMgcmVzdWx0LgotCQkqLwotCQlpZiAodiA9PSBOVUxMIHx8IHYgIT0gY2FsbGFyZ3MpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJUHlfREVDUkVGKGNhbGxhcmdzKTsKLQkJCXJldHVybiB2OwotCQl9Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIGVycmNoZWNrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhlcnJjaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAvKiBJZiB0aGUgZXJyY2hlY2sgZnVudGlvbiBmYWlsZWQsIHJldHVybiBOVUxMLgorICAgICAgICAgICBJZiB0aGUgZXJyY2hlY2sgZnVuY3Rpb24gcmV0dXJuZWQgY2FsbGFyZ3MgdW5jaGFuZ2VkLAorICAgICAgICAgICBjb250aW51ZSBub3JtYWwgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgSWYgdGhlIGVycmNoZWNrIGZ1bmN0aW9uIHJldHVybmVkIHNvbWV0aGluZyBlbHNlLAorICAgICAgICAgICB1c2UgdGhhdCBhcyByZXN1bHQuCisgICAgICAgICovCisgICAgICAgIGlmICh2ID09IE5VTEwgfHwgdiAhPSBjYWxsYXJncykgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIAotCXJldHVybiBfYnVpbGRfcmVzdWx0KHJlc3VsdCwgY2FsbGFyZ3MsCi0JCQkgICAgIG91dG1hc2ssIGlub3V0bWFzaywgbnVtcmV0dmFscyk7CisgICAgcmV0dXJuIF9idWlsZF9yZXN1bHQocmVzdWx0LCBjYWxsYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRtYXNrLCBpbm91dG1hc2ssIG51bXJldHZhbHMpOwogfQogCiBzdGF0aWMgaW50CiBQeUNGdW5jUHRyX3RyYXZlcnNlKFB5Q0Z1bmNQdHJPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNlbGYtPmNhbGxhYmxlKTsKLQlQeV9WSVNJVChzZWxmLT5yZXN0eXBlKTsKLQlQeV9WSVNJVChzZWxmLT5jaGVja2VyKTsKLQlQeV9WSVNJVChzZWxmLT5lcnJjaGVjayk7Ci0JUHlfVklTSVQoc2VsZi0+YXJndHlwZXMpOwotCVB5X1ZJU0lUKHNlbGYtPmNvbnZlcnRlcnMpOwotCVB5X1ZJU0lUKHNlbGYtPnBhcmFtZmxhZ3MpOwotCVB5X1ZJU0lUKHNlbGYtPnRodW5rKTsKLQlyZXR1cm4gUHlDRGF0YV90cmF2ZXJzZSgoQ0RhdGFPYmplY3QgKilzZWxmLCB2aXNpdCwgYXJnKTsKKyAgICBQeV9WSVNJVChzZWxmLT5jYWxsYWJsZSk7CisgICAgUHlfVklTSVQoc2VsZi0+cmVzdHlwZSk7CisgICAgUHlfVklTSVQoc2VsZi0+Y2hlY2tlcik7CisgICAgUHlfVklTSVQoc2VsZi0+ZXJyY2hlY2spOworICAgIFB5X1ZJU0lUKHNlbGYtPmFyZ3R5cGVzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5wYXJhbWZsYWdzKTsKKyAgICBQeV9WSVNJVChzZWxmLT50aHVuayk7CisgICAgcmV0dXJuIFB5Q0RhdGFfdHJhdmVyc2UoKENEYXRhT2JqZWN0ICopc2VsZiwgdmlzaXQsIGFyZyk7CiB9CiAKIHN0YXRpYyBpbnQKIFB5Q0Z1bmNQdHJfY2xlYXIoUHlDRnVuY1B0ck9iamVjdCAqc2VsZikKIHsKLQlQeV9DTEVBUihzZWxmLT5jYWxsYWJsZSk7Ci0JUHlfQ0xFQVIoc2VsZi0+cmVzdHlwZSk7Ci0JUHlfQ0xFQVIoc2VsZi0+Y2hlY2tlcik7Ci0JUHlfQ0xFQVIoc2VsZi0+ZXJyY2hlY2spOwotCVB5X0NMRUFSKHNlbGYtPmFyZ3R5cGVzKTsKLQlQeV9DTEVBUihzZWxmLT5jb252ZXJ0ZXJzKTsKLQlQeV9DTEVBUihzZWxmLT5wYXJhbWZsYWdzKTsKLQlQeV9DTEVBUihzZWxmLT50aHVuayk7Ci0JcmV0dXJuIFB5Q0RhdGFfY2xlYXIoKENEYXRhT2JqZWN0ICopc2VsZik7CisgICAgUHlfQ0xFQVIoc2VsZi0+Y2FsbGFibGUpOworICAgIFB5X0NMRUFSKHNlbGYtPnJlc3R5cGUpOworICAgIFB5X0NMRUFSKHNlbGYtPmNoZWNrZXIpOworICAgIFB5X0NMRUFSKHNlbGYtPmVycmNoZWNrKTsKKyAgICBQeV9DTEVBUihzZWxmLT5hcmd0eXBlcyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+Y29udmVydGVycyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+cGFyYW1mbGFncyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+dGh1bmspOworICAgIHJldHVybiBQeUNEYXRhX2NsZWFyKChDRGF0YU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgdm9pZAogUHlDRnVuY1B0cl9kZWFsbG9jKFB5Q0Z1bmNQdHJPYmplY3QgKnNlbGYpCiB7Ci0JUHlDRnVuY1B0cl9jbGVhcihzZWxmKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5Q0Z1bmNQdHJfY2xlYXIoc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q0Z1bmNQdHJfcmVwcihQeUNGdW5jUHRyT2JqZWN0ICpzZWxmKQogewogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKHNlbGYtPmluZGV4KQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPENPTSBtZXRob2Qgb2Zmc2V0ICVkOiAlcyBhdCAlcD4iLAotCQkJCQkgICBzZWxmLT5pbmRleCAtIDB4MTAwMCwKLQkJCQkJICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKLQkJCQkJICAgc2VsZik7CisgICAgaWYgKHNlbGYtPmluZGV4KQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPENPTSBtZXRob2Qgb2Zmc2V0ICVkOiAlcyBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5pbmRleCAtIDB4MTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZik7CiAjZW5kaWYKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAotCQkJCSAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsCi0JCQkJICAgc2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBvYmplY3QgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBQeUNGdW5jUHRyX25vbnplcm8oUHlDRnVuY1B0ck9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKCgqKHZvaWQgKiopc2VsZi0+Yl9wdHIgIT0gTlVMTCkKKyAgICByZXR1cm4gKCgqKHZvaWQgKiopc2VsZi0+Yl9wdHIgIT0gTlVMTCkKICNpZmRlZiBNU19XSU4zMgotCQl8fCAoc2VsZi0+aW5kZXggIT0gMCkKKyAgICAgICAgfHwgKHNlbGYtPmluZGV4ICE9IDApCiAjZW5kaWYKLQkJKTsKKyAgICAgICAgKTsKIH0KIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBQeUNGdW5jUHRyX2FzX251bWJlciA9IHsKLQkwLCAvKiBuYl9hZGQgKi8KLQkwLCAvKiBuYl9zdWJ0cmFjdCAqLwotCTAsIC8qIG5iX211bHRpcGx5ICovCi0JMCwgLyogbmJfZGl2aWRlICovCi0JMCwgLyogbmJfcmVtYWluZGVyICovCi0JMCwgLyogbmJfZGl2bW9kICovCi0JMCwgLyogbmJfcG93ZXIgKi8KLQkwLCAvKiBuYl9uZWdhdGl2ZSAqLwotCTAsIC8qIG5iX3Bvc2l0aXZlICovCi0JMCwgLyogbmJfYWJzb2x1dGUgKi8KLQkoaW5xdWlyeSlQeUNGdW5jUHRyX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAvKiBuYl9hZGQgKi8KKyAgICAwLCAvKiBuYl9zdWJ0cmFjdCAqLworICAgIDAsIC8qIG5iX211bHRpcGx5ICovCisgICAgMCwgLyogbmJfZGl2aWRlICovCisgICAgMCwgLyogbmJfcmVtYWluZGVyICovCisgICAgMCwgLyogbmJfZGl2bW9kICovCisgICAgMCwgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAvKiBuYl9uZWdhdGl2ZSAqLworICAgIDAsIC8qIG5iX3Bvc2l0aXZlICovCisgICAgMCwgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSlQeUNGdW5jUHRyX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUNGdW5jUHRyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jdHlwZXMuUHlDRnVuY1B0ciIsCi0Jc2l6ZW9mKFB5Q0Z1bmNQdHJPYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKVB5Q0Z1bmNQdHJfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpUHlDRnVuY1B0cl9yZXByLAkJLyogdHBfcmVwciAqLwotCSZQeUNGdW5jUHRyX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKVB5Q0Z1bmNQdHJfY2FsbCwJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJlB5Q0RhdGFfYXNfYnVmZmVyLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCSJGdW5jdGlvbiBQb2ludGVyIiwJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKVB5Q0Z1bmNQdHJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpUHlDRnVuY1B0cl9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JUHlDRnVuY1B0cl9nZXRzZXRzLAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLSAgICAgICAgUHlDRnVuY1B0cl9uZXcsCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuUHlDRnVuY1B0ciIsCisgICAgc2l6ZW9mKFB5Q0Z1bmNQdHJPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAoZGVzdHJ1Y3RvcilQeUNGdW5jUHRyX2RlYWxsb2MsICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKVB5Q0Z1bmNQdHJfcmVwciwgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJlB5Q0Z1bmNQdHJfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKVB5Q0Z1bmNQdHJfY2FsbCwgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZQeUNEYXRhX2FzX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgIkZ1bmN0aW9uIFBvaW50ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKVB5Q0Z1bmNQdHJfdHJhdmVyc2UsICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpUHlDRnVuY1B0cl9jbGVhciwgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIFB5Q0Z1bmNQdHJfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeUNGdW5jUHRyX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgU3RydWN0X1R5cGUKQEAgLTQwNDIsNjEgKzQwNDIsNjEgQEAKICAqLwogc3RhdGljIGludAogX2luaXRfcG9zX2FyZ3MoUHlPYmplY3QgKnNlbGYsIFB5VHlwZU9iamVjdCAqdHlwZSwKLQkgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLAotCSAgICAgICBpbnQgaW5kZXgpCisgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMsCisgICAgICAgICAgICAgICBpbnQgaW5kZXgpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlQeU9iamVjdCAqZmllbGRzOwotCWludCBpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKmZpZWxkczsKKyAgICBpbnQgaTsKIAotCWlmIChQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlLT50cF9iYXNlKSkgewotCQlpbmRleCA9IF9pbml0X3Bvc19hcmdzKHNlbGYsIHR5cGUtPnRwX2Jhc2UsCi0JCQkJICAgICAgIGFyZ3MsIGt3ZHMsCi0JCQkJICAgICAgIGluZGV4KTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZS0+dHBfYmFzZSkpIHsKKyAgICAgICAgaW5kZXggPSBfaW5pdF9wb3NfYXJncyhzZWxmLCB0eXBlLT50cF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsIGt3ZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOwotCWZpZWxkcyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKWRpY3QsICJfZmllbGRzXyIpOwotCWlmIChmaWVsZHMgPT0gTlVMTCkKLQkJcmV0dXJuIGluZGV4OworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKKyAgICBmaWVsZHMgPSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilkaWN0LCAiX2ZpZWxkc18iKTsKKyAgICBpZiAoZmllbGRzID09IE5VTEwpCisgICAgICAgIHJldHVybiBpbmRleDsKIAotCWZvciAoaSA9IDA7Ci0JICAgICBpIDwgZGljdC0+bGVuZ3RoICYmIChpK2luZGV4KSA8IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JICAgICArK2kpIHsKLQkJUHlPYmplY3QgKnBhaXIgPSBQeVNlcXVlbmNlX0dldEl0ZW0oZmllbGRzLCBpKTsKLQkJUHlPYmplY3QgKm5hbWUsICp2YWw7Ci0JCWludCByZXM7Ci0JCWlmICghcGFpcikKLQkJCXJldHVybiAtMTsKLQkJbmFtZSA9IFB5U2VxdWVuY2VfR2V0SXRlbShwYWlyLCAwKTsKLQkJaWYgKCFuYW1lKSB7Ci0JCQlQeV9ERUNSRUYocGFpcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdmFsID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpICsgaW5kZXgpOwotCQlpZiAoa3dkcyAmJiBQeURpY3RfR2V0SXRlbShrd2RzLCBuYW1lKSkgewotCQkJY2hhciAqZmllbGQgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKLQkJCWlmIChmaWVsZCA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlmaWVsZCA9ICI/Pz8iOwotCQkJfQotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJkdXBsaWNhdGUgdmFsdWVzIGZvciBmaWVsZCAnJXMnIiwKLQkJCQkgICAgIGZpZWxkKTsKLQkJCVB5X0RFQ1JFRihwYWlyKTsKLQkJCVB5X0RFQ1JFRihuYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkKLQkJcmVzID0gUHlPYmplY3RfU2V0QXR0cihzZWxmLCBuYW1lLCB2YWwpOwotCQlQeV9ERUNSRUYocGFpcik7Ci0JCVB5X0RFQ1JFRihuYW1lKTsKLQkJaWYgKHJlcyA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIGluZGV4ICsgZGljdC0+bGVuZ3RoOworICAgIGZvciAoaSA9IDA7CisgICAgICAgICBpIDwgZGljdC0+bGVuZ3RoICYmIChpK2luZGV4KSA8IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgICAgICArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKnBhaXIgPSBQeVNlcXVlbmNlX0dldEl0ZW0oZmllbGRzLCBpKTsKKyAgICAgICAgUHlPYmplY3QgKm5hbWUsICp2YWw7CisgICAgICAgIGludCByZXM7CisgICAgICAgIGlmICghcGFpcikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbmFtZSA9IFB5U2VxdWVuY2VfR2V0SXRlbShwYWlyLCAwKTsKKyAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdmFsID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpICsgaW5kZXgpOworICAgICAgICBpZiAoa3dkcyAmJiBQeURpY3RfR2V0SXRlbShrd2RzLCBuYW1lKSkgeworICAgICAgICAgICAgY2hhciAqZmllbGQgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKKyAgICAgICAgICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBmaWVsZCA9ICI/Pz8iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIHZhbHVlcyBmb3IgZmllbGQgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQpOworICAgICAgICAgICAgUHlfREVDUkVGKHBhaXIpOworICAgICAgICAgICAgUHlfREVDUkVGKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gUHlPYmplY3RfU2V0QXR0cihzZWxmLCBuYW1lLCB2YWwpOworICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGluZGV4ICsgZGljdC0+bGVuZ3RoOwogfQogCiBzdGF0aWMgaW50CkBAIC00MTA1LDExOSArNDEwNSwxMTkgQEAKIC8qIE9wdGltaXphdGlvbiBwb3NzaWJsZTogU3RvcmUgdGhlIGF0dHJpYnV0ZSBuYW1lcyBfZmllbGRzX1t4XVswXQogICogaW4gQyBhY2Nlc3NpYmxlIGZpZWxkcyBzb21ld2hlcmUgPwogICovCi0JaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZ3Mgbm90IGEgdHVwbGU/Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykpIHsKLQkJaW50IHJlcyA9IF9pbml0X3Bvc19hcmdzKHNlbGYsIFB5X1RZUEUoc2VsZiksCi0JCQkJCSBhcmdzLCBrd2RzLCAwKTsKLQkJaWYgKHJlcyA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHJlcyA8IFB5VHVwbGVfR0VUX1NJWkUoYXJncykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJ0b28gbWFueSBpbml0aWFsaXplcnMiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmdzIG5vdCBhIHR1cGxlPyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKSB7CisgICAgICAgIGludCByZXMgPSBfaW5pdF9wb3NfYXJncyhzZWxmLCBQeV9UWVBFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywga3dkcywgMCk7CisgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChyZXMgPCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBpbml0aWFsaXplcnMiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChrd2RzKSB7Ci0JCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKLQkJUHlfc3NpemVfdCBwb3MgPSAwOwotCQl3aGlsZShQeURpY3RfTmV4dChrd2RzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCQlpZiAoLTEgPT0gUHlPYmplY3RfU2V0QXR0cihzZWxmLCBrZXksIHZhbHVlKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKGt3ZHMpIHsKKyAgICAgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgICAgIHdoaWxlKFB5RGljdF9OZXh0KGt3ZHMsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGlmICgtMSA9PSBQeU9iamVjdF9TZXRBdHRyKHNlbGYsIGtleSwgdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJ1Y3RfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5TdHJ1Y3R1cmUiLAotCXNpemVvZihDRGF0YU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJlB5Q0RhdGFfYXNfYnVmZmVyLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCSJTdHJ1Y3R1cmUgYmFzZSBjbGFzcyIsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylQeUNEYXRhX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlQeUNEYXRhX2NsZWFyLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JU3RydWN0X2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlHZW5lcmljUHlDRGF0YV9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5TdHJ1Y3R1cmUiLAorICAgIHNpemVvZihDRGF0YU9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgJlB5Q0RhdGFfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAiU3RydWN0dXJlIGJhc2UgY2xhc3MiLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpUHlDRGF0YV90cmF2ZXJzZSwgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlQeUNEYXRhX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgU3RydWN0X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIEdlbmVyaWNQeUNEYXRhX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFVuaW9uX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jdHlwZXMuVW5pb24iLAotCXNpemVvZihDRGF0YU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJlB5Q0RhdGFfYXNfYnVmZmVyLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCSJVbmlvbiBiYXNlIGNsYXNzIiwJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKVB5Q0RhdGFfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KVB5Q0RhdGFfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQlTdHJ1Y3RfaW5pdCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCUdlbmVyaWNQeUNEYXRhX25ldywJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLlVuaW9uIiwKKyAgICBzaXplb2YoQ0RhdGFPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZQeUNEYXRhX2FzX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgIlVuaW9uIGJhc2UgY2xhc3MiLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKVB5Q0RhdGFfdHJhdmVyc2UsICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpUHlDRGF0YV9jbGVhciwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIFN0cnVjdF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBHZW5lcmljUHlDRGF0YV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgUHlDQXJyYXlfVHlwZQpAQCAtNDIyNSw0NjMgKzQyMjUsNDYzIEBACiBzdGF0aWMgaW50CiBBcnJheV9pbml0KENEYXRhT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IG47CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgbjsKIAotCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhcmdzIG5vdCBhIHR1cGxlPyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJUHlPYmplY3QgKnY7Ci0JCXYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlpZiAoLTEgPT0gUHlTZXF1ZW5jZV9TZXRJdGVtKChQeU9iamVjdCAqKXNlbGYsIGksIHYpKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmdzIG5vdCBhIHR1cGxlPyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgIHYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBpZiAoLTEgPT0gUHlTZXF1ZW5jZV9TZXRJdGVtKChQeU9iamVjdCAqKXNlbGYsIGksIHYpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEFycmF5X2l0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGluZGV4KQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JUHlfc3NpemVfdCBvZmZzZXQsIHNpemU7Ci0JU3RnRGljdE9iamVjdCAqc3RnZGljdDsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIFB5X3NzaXplX3Qgb2Zmc2V0LCBzaXplOworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CiAKIAotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2VsZi0+Yl9sZW5ndGgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJImludmFsaWQgaW5kZXgiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2VsZi0+Yl9sZW5ndGgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBpbmRleCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBpbnN0YW5jZXMgKi8KLQkvKiBXb3VsZCBpdCBiZSBjbGVhcmVyIGlmIHdlIGdvdCB0aGUgaXRlbSBzaXplIGZyb20KLQkgICBzdGdkaWN0LT5wcm90bydzIHN0Z2RpY3Q/Ci0JKi8KLQlzaXplID0gc3RnZGljdC0+c2l6ZSAvIHN0Z2RpY3QtPmxlbmd0aDsKLQlvZmZzZXQgPSBpbmRleCAqIHNpemU7CisgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgYXJyYXkgaW5zdGFuY2VzICovCisgICAgLyogV291bGQgaXQgYmUgY2xlYXJlciBpZiB3ZSBnb3QgdGhlIGl0ZW0gc2l6ZSBmcm9tCisgICAgICAgc3RnZGljdC0+cHJvdG8ncyBzdGdkaWN0PworICAgICovCisgICAgc2l6ZSA9IHN0Z2RpY3QtPnNpemUgLyBzdGdkaWN0LT5sZW5ndGg7CisgICAgb2Zmc2V0ID0gaW5kZXggKiBzaXplOwogCi0JcmV0dXJuIFB5Q0RhdGFfZ2V0KHN0Z2RpY3QtPnByb3RvLCBzdGdkaWN0LT5nZXRmdW5jLCAoUHlPYmplY3QgKilzZWxmLAotCQkJIGluZGV4LCBzaXplLCBzZWxmLT5iX3B0ciArIG9mZnNldCk7CisgICAgcmV0dXJuIFB5Q0RhdGFfZ2V0KHN0Z2RpY3QtPnByb3RvLCBzdGdkaWN0LT5nZXRmdW5jLCAoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHNpemUsIHNlbGYtPmJfcHRyICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEFycmF5X3NsaWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OwotCVB5T2JqZWN0ICpwcm90bzsKLQlQeUxpc3RPYmplY3QgKm5wOwotCVB5X3NzaXplX3QgaSwgbGVuOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OworICAgIFB5T2JqZWN0ICpwcm90bzsKKyAgICBQeUxpc3RPYmplY3QgKm5wOworICAgIFB5X3NzaXplX3QgaSwgbGVuOwogCi0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQllbHNlIGlmIChpbG93ID4gc2VsZi0+Yl9sZW5ndGgpCi0JCWlsb3cgPSBzZWxmLT5iX2xlbmd0aDsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JZWxzZSBpZiAoaWhpZ2ggPiBzZWxmLT5iX2xlbmd0aCkKLQkJaWhpZ2ggPSBzZWxmLT5iX2xlbmd0aDsKLQlsZW4gPSBpaGlnaCAtIGlsb3c7CisgICAgaWYgKGlsb3cgPCAwKQorICAgICAgICBpbG93ID0gMDsKKyAgICBlbHNlIGlmIChpbG93ID4gc2VsZi0+Yl9sZW5ndGgpCisgICAgICAgIGlsb3cgPSBzZWxmLT5iX2xlbmd0aDsKKyAgICBpZiAoaWhpZ2ggPCBpbG93KQorICAgICAgICBpaGlnaCA9IGlsb3c7CisgICAgZWxzZSBpZiAoaWhpZ2ggPiBzZWxmLT5iX2xlbmd0aCkKKyAgICAgICAgaWhpZ2ggPSBzZWxmLT5iX2xlbmd0aDsKKyAgICBsZW4gPSBpaGlnaCAtIGlsb3c7CiAKLQlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCi0JcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKLQlpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKLQlhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBhcnJheSwgYSBjdHlwZXMKLQkJCSAgICAgdHlwZSwgc28gdGhpcyBjYW5ub3QgYmUgTlVMTCAqLwotCWlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBfY3R5cGVzX2dldF9maWVsZGRlc2MoImMiKS0+Z2V0ZnVuYykgewotCQljaGFyICpwdHIgPSAoY2hhciAqKXNlbGYtPmJfcHRyOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyICsgaWxvdywgbGVuKTsKKyAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCisgICAgcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKKyAgICBpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICBhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBhcnJheSwgYSBjdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBzbyB0aGlzIGNhbm5vdCBiZSBOVUxMICovCisgICAgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygiYyIpLT5nZXRmdW5jKSB7CisgICAgICAgIGNoYXIgKnB0ciA9IChjaGFyICopc2VsZi0+Yl9wdHI7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIgKyBpbG93LCBsZW4pOwogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JfSBlbHNlIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBfY3R5cGVzX2dldF9maWVsZGRlc2MoInUiKS0+Z2V0ZnVuYykgewotCQl3Y2hhcl90ICpwdHIgPSAod2NoYXJfdCAqKXNlbGYtPmJfcHRyOwotCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwdHIgKyBpbG93LCBsZW4pOworICAgIH0gZWxzZSBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJ1IiktPmdldGZ1bmMpIHsKKyAgICAgICAgd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKilzZWxmLT5iX3B0cjsKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyICsgaWxvdywgbGVuKTsKICNlbmRpZgotCX0KKyAgICB9CiAKLQlucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhsZW4pOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhsZW4pOworICAgIGlmIChucCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqdiA9IEFycmF5X2l0ZW0oX3NlbGYsIGkraWxvdyk7Ci0JCVB5TGlzdF9TRVRfSVRFTShucCwgaSwgdik7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilucDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBBcnJheV9pdGVtKF9zZWxmLCBpK2lsb3cpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbnA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBBcnJheV9zdWJzY3JpcHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqaXRlbSkKIHsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAKLQlpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCQotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gc2VsZi0+Yl9sZW5ndGg7Ci0JCXJldHVybiBBcnJheV9pdGVtKF9zZWxmLCBpKTsKLQl9Ci0JZWxzZSBpZiBQeVNsaWNlX0NoZWNrKGl0ZW0pIHsKLQkJU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OwotCQlQeU9iamVjdCAqcHJvdG87Ci0JCVB5T2JqZWN0ICpucDsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW4sIGN1ciwgaTsKLQkJCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCi0JCQkJCSBzZWxmLT5iX2xlbmd0aCwgJnN0YXJ0LCAmc3RvcCwKLQkJCQkJICZzdGVwLCAmc2xpY2VsZW4pIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJCi0JCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCi0JCXByb3RvID0gc3RnZGljdC0+cHJvdG87Ci0JCWl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCQlhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBhcnJheSwgYQotCQkJCSAgICAgY3R5cGVzIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CiAKLQkJaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygiYyIpLT5nZXRmdW5jKSB7Ci0JCQljaGFyICpwdHIgPSAoY2hhciAqKXNlbGYtPmJfcHRyOwotCQkJY2hhciAqZGVzdDsKKyAgICAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IHNlbGYtPmJfbGVuZ3RoOworICAgICAgICByZXR1cm4gQXJyYXlfaXRlbShfc2VsZiwgaSk7CisgICAgfQorICAgIGVsc2UgaWYgUHlTbGljZV9DaGVjayhpdGVtKSB7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKKyAgICAgICAgUHlPYmplY3QgKnByb3RvOworICAgICAgICBQeU9iamVjdCAqbnA7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuLCBjdXIsIGk7CiAKLQkJCWlmIChzbGljZWxlbiA8PSAwKQotCQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQkJCWlmIChzdGVwID09IDEpIHsKLQkJCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyICsgc3RhcnQsCi0JCQkJCQkJCSAgc2xpY2VsZW4pOwotCQkJfQotCQkJZGVzdCA9IChjaGFyICopUHlNZW1fTWFsbG9jKHNsaWNlbGVuKTsKKyAgICAgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmJfbGVuZ3RoLCAmc3RhcnQsICZzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCQlpZiAoZGVzdCA9PSBOVUxMKQotCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAgICAgYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgYXJyYXkgb2JqZWN0IGluc3RhbmNlcyAqLworICAgICAgICBwcm90byA9IHN0Z2RpY3QtPnByb3RvOworICAgICAgICBpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICAgICAgYXNzZXJ0KGl0ZW1kaWN0KTsgLyogcHJvdG8gaXMgdGhlIGl0ZW0gdHlwZSBvZiB0aGUgYXJyYXksIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVzIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KIAotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCWRlc3RbaV0gPSBwdHJbY3VyXTsKLQkJCX0KKyAgICAgICAgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygiYyIpLT5nZXRmdW5jKSB7CisgICAgICAgICAgICBjaGFyICpwdHIgPSAoY2hhciAqKXNlbGYtPmJfcHRyOworICAgICAgICAgICAgY2hhciAqZGVzdDsKIAotCQkJbnAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkZXN0LCBzbGljZWxlbik7Ci0JCQlQeU1lbV9GcmVlKGRlc3QpOwotCQkJcmV0dXJuIG5wOwotCQl9CisgICAgICAgICAgICBpZiAoc2xpY2VsZW4gPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgICAgICBpZiAoc3RlcCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHB0ciArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ID0gKGNoYXIgKilQeU1lbV9NYWxsb2Moc2xpY2VsZW4pOworCisgICAgICAgICAgICBpZiAoZGVzdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworCisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOworICAgICAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IHB0cltjdXJdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBucCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRlc3QsIHNsaWNlbGVuKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gbnA7CisgICAgICAgIH0KICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCQlpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJ1IiktPmdldGZ1bmMpIHsKLQkJCXdjaGFyX3QgKnB0ciA9ICh3Y2hhcl90ICopc2VsZi0+Yl9wdHI7Ci0JCQl3Y2hhcl90ICpkZXN0OwotCQkJCi0JCQlpZiAoc2xpY2VsZW4gPD0gMCkKLQkJCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApOwotCQkJaWYgKHN0ZXAgPT0gMSkgewotCQkJCXJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHB0ciArIHN0YXJ0LAotCQkJCQkJCSAgICAgIHNsaWNlbGVuKTsKLQkJCX0KKyAgICAgICAgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygidSIpLT5nZXRmdW5jKSB7CisgICAgICAgICAgICB3Y2hhcl90ICpwdHIgPSAod2NoYXJfdCAqKXNlbGYtPmJfcHRyOworICAgICAgICAgICAgd2NoYXJfdCAqZGVzdDsKIAotCQkJZGVzdCA9ICh3Y2hhcl90ICopUHlNZW1fTWFsbG9jKAotCQkJCQkJc2xpY2VsZW4gKiBzaXplb2Yod2NoYXJfdCkpOwotCQkJCi0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOwotCQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQkJZGVzdFtpXSA9IHB0cltjdXJdOwotCQkJfQotCQkJCi0JCQlucCA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoZGVzdCwgc2xpY2VsZW4pOwotCQkJUHlNZW1fRnJlZShkZXN0KTsKLQkJCXJldHVybiBucDsKLQkJfQorICAgICAgICAgICAgaWYgKHNsaWNlbGVuIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwdHIgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlc3QgPSAod2NoYXJfdCAqKVB5TWVtX01hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlbGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKKworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKKyAgICAgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBwdHJbY3VyXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnAgPSBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKGRlc3QsIHNsaWNlbGVuKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gbnA7CisgICAgICAgIH0KICNlbmRpZgogCi0JCW5wID0gUHlMaXN0X05ldyhzbGljZWxlbik7Ci0JCWlmIChucCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIG5wID0gUHlMaXN0X05ldyhzbGljZWxlbik7CisgICAgICAgIGlmIChucCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKLQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQlQeU9iamVjdCAqdiA9IEFycmF5X2l0ZW0oX3NlbGYsIGN1cik7Ci0JCQlQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOwotCQl9Ci0JCXJldHVybiBucDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotCQkJCSJpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOworICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gQXJyYXlfaXRlbShfc2VsZiwgY3VyKTsKKyAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShucCwgaSwgdik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5wOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiB9CiAKIHN0YXRpYyBpbnQKIEFycmF5X2Fzc19pdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QgKnZhbHVlKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JUHlfc3NpemVfdCBzaXplLCBvZmZzZXQ7Ci0JU3RnRGljdE9iamVjdCAqc3RnZGljdDsKLQljaGFyICpwdHI7CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBQeV9zc2l6ZV90IHNpemUsIG9mZnNldDsKKyAgICBTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworICAgIGNoYXIgKnB0cjsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIkFycmF5IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIGFycmF5IG9iamVjdCBpbnN0YW5jZXMgKi8KLQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHN0Z2RpY3QtPmxlbmd0aCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkiaW52YWxpZCBpbmRleCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNpemUgPSBzdGdkaWN0LT5zaXplIC8gc3RnZGljdC0+bGVuZ3RoOwotCW9mZnNldCA9IGluZGV4ICogc2l6ZTsKLQlwdHIgPSBzZWxmLT5iX3B0ciArIG9mZnNldDsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmV0dXJuIFB5Q0RhdGFfc2V0KChQeU9iamVjdCAqKXNlbGYsIHN0Z2RpY3QtPnByb3RvLCBzdGdkaWN0LT5zZXRmdW5jLCB2YWx1ZSwKLQkJCSBpbmRleCwgc2l6ZSwgcHRyKTsKKyAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzdGdkaWN0LT5sZW5ndGgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBpbmRleCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNpemUgPSBzdGdkaWN0LT5zaXplIC8gc3RnZGljdC0+bGVuZ3RoOworICAgIG9mZnNldCA9IGluZGV4ICogc2l6ZTsKKyAgICBwdHIgPSBzZWxmLT5iX3B0ciArIG9mZnNldDsKKworICAgIHJldHVybiBQeUNEYXRhX3NldCgoUHlPYmplY3QgKilzZWxmLCBzdGdkaWN0LT5wcm90bywgc3RnZGljdC0+c2V0ZnVuYywgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBpbmRleCwgc2l6ZSwgcHRyKTsKIH0KIAogc3RhdGljIGludAogQXJyYXlfYXNzX3NsaWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQlQeV9zc2l6ZV90IGksIGxlbjsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIFB5X3NzaXplX3QgaSwgbGVuOwogCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiQXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBcnJheSBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChpbG93IDwgMCkKLQkJaWxvdyA9IDA7Ci0JZWxzZSBpZiAoaWxvdyA+IHNlbGYtPmJfbGVuZ3RoKQotCQlpbG93ID0gc2VsZi0+Yl9sZW5ndGg7Ci0JaWYgKGloaWdoIDwgMCkKLQkJaWhpZ2ggPSAwOwotCWlmIChpaGlnaCA8IGlsb3cpCi0JCWloaWdoID0gaWxvdzsKLQllbHNlIGlmIChpaGlnaCA+IHNlbGYtPmJfbGVuZ3RoKQotCQlpaGlnaCA9IHNlbGYtPmJfbGVuZ3RoOworICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgZWxzZSBpZiAoaWxvdyA+IHNlbGYtPmJfbGVuZ3RoKQorICAgICAgICBpbG93ID0gc2VsZi0+Yl9sZW5ndGg7CisgICAgaWYgKGloaWdoIDwgMCkKKyAgICAgICAgaWhpZ2ggPSAwOworICAgIGlmIChpaGlnaCA8IGlsb3cpCisgICAgICAgIGloaWdoID0gaWxvdzsKKyAgICBlbHNlIGlmIChpaGlnaCA+IHNlbGYtPmJfbGVuZ3RoKQorICAgICAgICBpaGlnaCA9IHNlbGYtPmJfbGVuZ3RoOwogCi0JbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgodmFsdWUpOwotCWlmIChsZW4gIT0gaWhpZ2ggLSBpbG93KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJDYW4gb25seSBhc3NpZ24gc2VxdWVuY2Ugb2Ygc2FtZSBzaXplIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHZhbHVlLCBpKTsKLQkJaW50IHJlc3VsdDsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcmVzdWx0ID0gQXJyYXlfYXNzX2l0ZW0oX3NlbGYsIGkraWxvdywgaXRlbSk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQkJaWYgKHJlc3VsdCA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgodmFsdWUpOworICAgIGlmIChsZW4gIT0gaWhpZ2ggLSBpbG93KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbiBvbmx5IGFzc2lnbiBzZXF1ZW5jZSBvZiBzYW1lIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0odmFsdWUsIGkpOworICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXN1bHQgPSBBcnJheV9hc3NfaXRlbShfc2VsZiwgaStpbG93LCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAocmVzdWx0ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogQXJyYXlfYXNzX3N1YnNjcmlwdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICppdGVtLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQkKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJBcnJheSBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCi0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQkKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBzZWxmLT5iX2xlbmd0aDsKLQkJcmV0dXJuIEFycmF5X2Fzc19pdGVtKF9zZWxmLCBpLCB2YWx1ZSk7Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW4sIG90aGVybGVuLCBpLCBjdXI7Ci0JCQotCQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QgKilpdGVtLAotCQkJCQkgc2VsZi0+Yl9sZW5ndGgsICZzdGFydCwgJnN0b3AsCi0JCQkJCSAmc3RlcCwgJnNsaWNlbGVuKSA8IDApIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoKHN0ZXAgPCAwICYmIHN0YXJ0IDwgc3RvcCkgfHwKLQkJICAgIChzdGVwID4gMCAmJiBzdGFydCA+IHN0b3ApKQotCQkJc3RvcCA9IHN0YXJ0OworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkJb3RoZXJsZW4gPSBQeVNlcXVlbmNlX0xlbmd0aCh2YWx1ZSk7Ci0JCWlmIChvdGhlcmxlbiAhPSBzbGljZWxlbikgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIkNhbiBvbmx5IGFzc2lnbiBzZXF1ZW5jZSBvZiBzYW1lIHNpemUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IG90aGVybGVuOyBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQlQeU9iamVjdCAqaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbSh2YWx1ZSwgaSk7Ci0JCQlpbnQgcmVzdWx0OwotCQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXN1bHQgPSBBcnJheV9hc3NfaXRlbShfc2VsZiwgY3VyLCBpdGVtKTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCWlmIChyZXN1bHQgPT0gLTEpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiaW5kaWNlcyBtdXN0IGJlIGludGVnZXIiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisKKyAgICAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgaSArPSBzZWxmLT5iX2xlbmd0aDsKKyAgICAgICAgcmV0dXJuIEFycmF5X2Fzc19pdGVtKF9zZWxmLCBpLCB2YWx1ZSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW4sIG90aGVybGVuLCBpLCBjdXI7CisKKyAgICAgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmJfbGVuZ3RoLCAmc3RhcnQsICZzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdGVwIDwgMCAmJiBzdGFydCA8IHN0b3ApIHx8CisgICAgICAgICAgICAoc3RlcCA+IDAgJiYgc3RhcnQgPiBzdG9wKSkKKyAgICAgICAgICAgIHN0b3AgPSBzdGFydDsKKworICAgICAgICBvdGhlcmxlbiA9IFB5U2VxdWVuY2VfTGVuZ3RoKHZhbHVlKTsKKyAgICAgICAgaWYgKG90aGVybGVuICE9IHNsaWNlbGVuKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiQ2FuIG9ubHkgYXNzaWduIHNlcXVlbmNlIG9mIHNhbWUgc2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgb3RoZXJsZW47IGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHZhbHVlLCBpKTsKKyAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFycmF5X2Fzc19pdGVtKF9zZWxmLCBjdXIsIGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImluZGljZXMgbXVzdCBiZSBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBBcnJheV9sZW5ndGgoUHlPYmplY3QgKl9zZWxmKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JcmV0dXJuIHNlbGYtPmJfbGVuZ3RoOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgcmV0dXJuIHNlbGYtPmJfbGVuZ3RoOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgQXJyYXlfYXNfc2VxdWVuY2UgPSB7Ci0JQXJyYXlfbGVuZ3RoLAkJCQkvKiBzcV9sZW5ndGg7ICovCi0JMCwJCQkJCS8qIHNxX2NvbmNhdDsgKi8KLQkwLAkJCQkJLyogc3FfcmVwZWF0OyAqLwotCUFycmF5X2l0ZW0sCQkJCS8qIHNxX2l0ZW07ICovCi0JQXJyYXlfc2xpY2UsCQkJCS8qIHNxX3NsaWNlOyAqLwotCUFycmF5X2Fzc19pdGVtLAkJCQkvKiBzcV9hc3NfaXRlbTsgKi8KLQlBcnJheV9hc3Nfc2xpY2UsCQkJLyogc3FfYXNzX3NsaWNlOyAqLwotCTAsCQkJCQkvKiBzcV9jb250YWluczsgKi8KLQkKLQkwLAkJCQkJLyogc3FfaW5wbGFjZV9jb25jYXQ7ICovCi0JMCwJCQkJCS8qIHNxX2lucGxhY2VfcmVwZWF0OyAqLworICAgIEFycmF5X2xlbmd0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfbGVuZ3RoOyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0OyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0OyAqLworICAgIEFycmF5X2l0ZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaXRlbTsgKi8KKyAgICBBcnJheV9zbGljZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3NsaWNlOyAqLworICAgIEFycmF5X2Fzc19pdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX2l0ZW07ICovCisgICAgQXJyYXlfYXNzX3NsaWNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3Nfc2xpY2U7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb250YWluczsgKi8KKworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9jb25jYXQ7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pbnBsYWNlX3JlcGVhdDsgKi8KIH07CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIEFycmF5X2FzX21hcHBpbmcgPSB7Ci0JQXJyYXlfbGVuZ3RoLAotCUFycmF5X3N1YnNjcmlwdCwKLQlBcnJheV9hc3Nfc3Vic2NyaXB0LAorICAgIEFycmF5X2xlbmd0aCwKKyAgICBBcnJheV9zdWJzY3JpcHQsCisgICAgQXJyYXlfYXNzX3N1YnNjcmlwdCwKIH07CiAKIFB5VHlwZU9iamVjdCBQeUNBcnJheV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLkFycmF5IiwKLQlzaXplb2YoQ0RhdGFPYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJkFycmF5X2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JJkFycmF5X2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJlB5Q0RhdGFfYXNfYnVmZmVyLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCSJYWFggdG8gYmUgcHJvdmlkZWQiLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpUHlDRGF0YV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpUHlDRGF0YV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylBcnJheV9pbml0LAkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLSAgICAgICAgR2VuZXJpY1B5Q0RhdGFfbmV3LAkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuQXJyYXkiLAorICAgIHNpemVvZihDRGF0YU9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZBcnJheV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmQXJyYXlfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgJlB5Q0RhdGFfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAiWFhYIHRvIGJlIHByb3ZpZGVkIiwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpUHlDRGF0YV90cmF2ZXJzZSwgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlQeUNEYXRhX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKUFycmF5X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIEdlbmVyaWNQeUNEYXRhX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBQeU9iamVjdCAqCiBQeUNBcnJheVR5cGVfZnJvbV9jdHlwZShQeU9iamVjdCAqaXRlbXR5cGUsIFB5X3NzaXplX3QgbGVuZ3RoKQogewotCXN0YXRpYyBQeU9iamVjdCAqY2FjaGU7Ci0JUHlPYmplY3QgKmtleTsKLQlQeU9iamVjdCAqcmVzdWx0OwotCWNoYXIgbmFtZVsyNTZdOwotCVB5T2JqZWN0ICpsZW47CisgICAgc3RhdGljIFB5T2JqZWN0ICpjYWNoZTsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciBuYW1lWzI1Nl07CisgICAgUHlPYmplY3QgKmxlbjsKIAotCWlmIChjYWNoZSA9PSBOVUxMKSB7Ci0JCWNhY2hlID0gUHlEaWN0X05ldygpOwotCQlpZiAoY2FjaGUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlsZW4gPSBQeUludF9Gcm9tU3NpemVfdChsZW5ndGgpOwotCWlmIChsZW4gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Ja2V5ID0gUHlUdXBsZV9QYWNrKDIsIGl0ZW10eXBlLCBsZW4pOwotCVB5X0RFQ1JFRihsZW4pOwotCWlmICgha2V5KQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeURpY3RfR2V0SXRlbVByb3h5KGNhY2hlLCBrZXkpOwotCWlmIChyZXN1bHQpIHsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICBpZiAoY2FjaGUgPT0gTlVMTCkgeworICAgICAgICBjYWNoZSA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGNhY2hlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbGVuID0gUHlJbnRfRnJvbVNzaXplX3QobGVuZ3RoKTsKKyAgICBpZiAobGVuID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGtleSA9IFB5VHVwbGVfUGFjaygyLCBpdGVtdHlwZSwgbGVuKTsKKyAgICBQeV9ERUNSRUYobGVuKTsKKyAgICBpZiAoIWtleSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW1Qcm94eShjYWNoZSwga2V5KTsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLQlpZiAoIVB5VHlwZV9DaGVjayhpdGVtdHlwZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiRXhwZWN0ZWQgYSB0eXBlIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeVR5cGVfQ2hlY2soaXRlbXR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSB0eXBlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjaWZkZWYgTVNfV0lONjQKLQlzcHJpbnRmKG5hbWUsICIlLjIwMHNfQXJyYXlfJUlkIiwKLQkJKChQeVR5cGVPYmplY3QgKilpdGVtdHlwZSktPnRwX25hbWUsIGxlbmd0aCk7CisgICAgc3ByaW50ZihuYW1lLCAiJS4yMDBzX0FycmF5XyVJZCIsCisgICAgICAgICgoUHlUeXBlT2JqZWN0ICopaXRlbXR5cGUpLT50cF9uYW1lLCBsZW5ndGgpOwogI2Vsc2UKLQlzcHJpbnRmKG5hbWUsICIlLjIwMHNfQXJyYXlfJWxkIiwKLQkJKChQeVR5cGVPYmplY3QgKilpdGVtdHlwZSktPnRwX25hbWUsIChsb25nKWxlbmd0aCk7CisgICAgc3ByaW50ZihuYW1lLCAiJS4yMDBzX0FycmF5XyVsZCIsCisgICAgICAgICgoUHlUeXBlT2JqZWN0ICopaXRlbXR5cGUpLT50cF9uYW1lLCAobG9uZylsZW5ndGgpOwogI2VuZGlmCiAKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopJlB5Q0FycmF5VHlwZV9UeXBlLAorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikmUHlDQXJyYXlUeXBlX1R5cGUsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCQkgICAgICAgInMoTyl7czppLHM6T30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicyhPKXtzOmksczpPfSIsCiAjZWxzZQotCQkJCSAgICAgICAicyhPKXtzOm4sczpPfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzKE8pe3M6bixzOk99IiwKICNlbmRpZgotCQkJCSAgICAgICBuYW1lLAotCQkJCSAgICAgICAmUHlDQXJyYXlfVHlwZSwKLQkJCQkgICAgICAgIl9sZW5ndGhfIiwKLQkJCQkgICAgICAgbGVuZ3RoLAotCQkJCSAgICAgICAiX3R5cGVfIiwKLQkJCQkgICAgICAgaXRlbXR5cGUKLQkJKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoLTEgPT0gUHlEaWN0X1NldEl0ZW1Qcm94eShjYWNoZSwga2V5LCByZXN1bHQpKSB7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihrZXkpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUNBcnJheV9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2xlbmd0aF8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfdHlwZV8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtdHlwZQorICAgICAgICApOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgtMSA9PSBQeURpY3RfU2V0SXRlbVByb3h5KGNhY2hlLCBrZXksIHJlc3VsdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgU2ltcGxlX1R5cGUKQEAgLTQ2OTAsMTY3ICs0NjkwLDE2NyBAQAogc3RhdGljIGludAogU2ltcGxlX3NldF92YWx1ZShDRGF0YU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBDRGF0YU9iamVjdCBpbnN0YW5jZXMgKi8KLQlhc3NlcnQoZGljdC0+c2V0ZnVuYyk7Ci0JcmVzdWx0ID0gZGljdC0+c2V0ZnVuYyhzZWxmLT5iX3B0ciwgdmFsdWUsIGRpY3QtPnNpemUpOwotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCisgICAgYXNzZXJ0KGRpY3QtPnNldGZ1bmMpOworICAgIHJlc3VsdCA9IGRpY3QtPnNldGZ1bmMoc2VsZi0+Yl9wdHIsIHZhbHVlLCBkaWN0LT5zaXplKTsKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JLyogY29uc3VtZXMgdGhlIHJlZmNvdW50IHRoZSBzZXRmdW5jIHJldHVybnMgKi8KLQlyZXR1cm4gS2VlcFJlZihzZWxmLCAwLCByZXN1bHQpOworICAgIC8qIGNvbnN1bWVzIHRoZSByZWZjb3VudCB0aGUgc2V0ZnVuYyByZXR1cm5zICovCisgICAgcmV0dXJuIEtlZXBSZWYoc2VsZiwgMCwgcmVzdWx0KTsKIH0KIAogc3RhdGljIGludAogU2ltcGxlX2luaXQoQ0RhdGFPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnZhbHVlID0gTlVMTDsKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJfX2luaXRfXyIsIDAsIDEsICZ2YWx1ZSkpCi0JCXJldHVybiAtMTsKLQlpZiAodmFsdWUpCi0JCXJldHVybiBTaW1wbGVfc2V0X3ZhbHVlKHNlbGYsIHZhbHVlKTsKLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIl9faW5pdF9fIiwgMCwgMSwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIFNpbXBsZV9zZXRfdmFsdWUoc2VsZiwgdmFsdWUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogU2ltcGxlX2dldF92YWx1ZShDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENEYXRhT2JqZWN0IGluc3RhbmNlcyAqLwotCWFzc2VydChkaWN0LT5nZXRmdW5jKTsKLQlyZXR1cm4gZGljdC0+Z2V0ZnVuYyhzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKTsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIGRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENEYXRhT2JqZWN0IGluc3RhbmNlcyAqLworICAgIGFzc2VydChkaWN0LT5nZXRmdW5jKTsKKyAgICByZXR1cm4gZGljdC0+Z2V0ZnVuYyhzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIFNpbXBsZV9nZXRzZXRzW10gPSB7Ci0JeyAidmFsdWUiLCAoZ2V0dGVyKVNpbXBsZV9nZXRfdmFsdWUsIChzZXR0ZXIpU2ltcGxlX3NldF92YWx1ZSwKLQkgICJjdXJyZW50IHZhbHVlIiwgTlVMTCB9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAidmFsdWUiLCAoZ2V0dGVyKVNpbXBsZV9nZXRfdmFsdWUsIChzZXR0ZXIpU2ltcGxlX3NldF92YWx1ZSwKKyAgICAgICJjdXJyZW50IHZhbHVlIiwgTlVMTCB9LAorICAgIHsgTlVMTCwgTlVMTCB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogU2ltcGxlX2Zyb21fb3V0cGFybShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKF9jdHlwZXNfc2ltcGxlX2luc3RhbmNlKChQeU9iamVjdCAqKVB5X1RZUEUoc2VsZikpKSB7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJcmV0dXJuIHNlbGY7Ci0JfQotCS8qIGNhbGwgc3RnZGljdC0+Z2V0ZnVuYyAqLwotCXJldHVybiBTaW1wbGVfZ2V0X3ZhbHVlKChDRGF0YU9iamVjdCAqKXNlbGYpOworICAgIGlmIChfY3R5cGVzX3NpbXBsZV9pbnN0YW5jZSgoUHlPYmplY3QgKilQeV9UWVBFKHNlbGYpKSkgeworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKyAgICAvKiBjYWxsIHN0Z2RpY3QtPmdldGZ1bmMgKi8KKyAgICByZXR1cm4gU2ltcGxlX2dldF92YWx1ZSgoQ0RhdGFPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNpbXBsZV9tZXRob2RzW10gPSB7Ci0JeyAiX19jdHlwZXNfZnJvbV9vdXRwYXJhbV9fIiwgU2ltcGxlX2Zyb21fb3V0cGFybSwgTUVUSF9OT0FSR1MsIH0sCi0JeyBOVUxMLCBOVUxMIH0sCisgICAgeyAiX19jdHlwZXNfZnJvbV9vdXRwYXJhbV9fIiwgU2ltcGxlX2Zyb21fb3V0cGFybSwgTUVUSF9OT0FSR1MsIH0sCisgICAgeyBOVUxMLCBOVUxMIH0sCiB9OwogCiBzdGF0aWMgaW50IFNpbXBsZV9ub256ZXJvKENEYXRhT2JqZWN0ICpzZWxmKQogewotCXJldHVybiBtZW1jbXAoc2VsZi0+Yl9wdHIsICJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIsIHNlbGYtPmJfc2l6ZSk7CisgICAgcmV0dXJuIG1lbWNtcChzZWxmLT5iX3B0ciwgIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIiwgc2VsZi0+Yl9zaXplKTsKIH0KIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBTaW1wbGVfYXNfbnVtYmVyID0gewotCTAsIC8qIG5iX2FkZCAqLwotCTAsIC8qIG5iX3N1YnRyYWN0ICovCi0JMCwgLyogbmJfbXVsdGlwbHkgKi8KLQkwLCAvKiBuYl9kaXZpZGUgKi8KLQkwLCAvKiBuYl9yZW1haW5kZXIgKi8KLQkwLCAvKiBuYl9kaXZtb2QgKi8KLQkwLCAvKiBuYl9wb3dlciAqLwotCTAsIC8qIG5iX25lZ2F0aXZlICovCi0JMCwgLyogbmJfcG9zaXRpdmUgKi8KLQkwLCAvKiBuYl9hYnNvbHV0ZSAqLwotCShpbnF1aXJ5KVNpbXBsZV9ub256ZXJvLCAvKiBuYl9ub256ZXJvICovCisgICAgMCwgLyogbmJfYWRkICovCisgICAgMCwgLyogbmJfc3VidHJhY3QgKi8KKyAgICAwLCAvKiBuYl9tdWx0aXBseSAqLworICAgIDAsIC8qIG5iX2RpdmlkZSAqLworICAgIDAsIC8qIG5iX3JlbWFpbmRlciAqLworICAgIDAsIC8qIG5iX2Rpdm1vZCAqLworICAgIDAsIC8qIG5iX3Bvd2VyICovCisgICAgMCwgLyogbmJfbmVnYXRpdmUgKi8KKyAgICAwLCAvKiBuYl9wb3NpdGl2ZSAqLworICAgIDAsIC8qIG5iX2Fic29sdXRlICovCisgICAgKGlucXVpcnkpU2ltcGxlX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KIH07CiAKIC8qICIlcyglcykiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnZhbHVlKSAqLwogc3RhdGljIFB5T2JqZWN0ICoKIFNpbXBsZV9yZXByKENEYXRhT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp2YWwsICpuYW1lLCAqYXJncywgKnJlc3VsdDsKLQlzdGF0aWMgUHlPYmplY3QgKmZvcm1hdDsKKyAgICBQeU9iamVjdCAqdmFsLCAqbmFtZSwgKmFyZ3MsICpyZXN1bHQ7CisgICAgc3RhdGljIFB5T2JqZWN0ICpmb3JtYXQ7CiAKLQlpZiAoUHlfVFlQRShzZWxmKS0+dHBfYmFzZSAhPSAmU2ltcGxlX1R5cGUpIHsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBvYmplY3QgYXQgJXA+IiwKLQkJCQkJICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwgc2VsZik7Ci0JfQorICAgIGlmIChQeV9UWVBFKHNlbGYpLT50cF9iYXNlICE9ICZTaW1wbGVfVHlwZSkgeworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLCBzZWxmKTsKKyAgICB9CiAKLQlpZiAoZm9ybWF0ID09IE5VTEwpIHsKLQkJZm9ybWF0ID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiJXMoJXIpIik7Ci0JCWlmIChmb3JtYXQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgZm9ybWF0ID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiJXMoJXIpIik7CisgICAgICAgIGlmIChmb3JtYXQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXZhbCA9IFNpbXBsZV9nZXRfdmFsdWUoc2VsZik7Ci0JaWYgKHZhbCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB2YWwgPSBTaW1wbGVfZ2V0X3ZhbHVlKHNlbGYpOworICAgIGlmICh2YWwgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9UWVBFKHNlbGYpLT50cF9uYW1lKTsKLQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih2YWwpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfVFlQRShzZWxmKS0+dHBfbmFtZSk7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodmFsKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYXJncyA9IFB5VHVwbGVfUGFjaygyLCBuYW1lLCB2YWwpOwotCVB5X0RFQ1JFRihuYW1lKTsKLQlQeV9ERUNSRUYodmFsKTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDIsIG5hbWUsIHZhbCk7CisgICAgUHlfREVDUkVGKG5hbWUpOworICAgIFB5X0RFQ1JFRih2YWwpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gUHlTdHJpbmdfRm9ybWF0KGZvcm1hdCwgYXJncyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRm9ybWF0KGZvcm1hdCwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU2ltcGxlX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jdHlwZXMuX1NpbXBsZUNEYXRhIiwKLQlzaXplb2YoQ0RhdGFPYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKSZTaW1wbGVfcmVwciwJCQkvKiB0cF9yZXByICovCi0JJlNpbXBsZV9hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCSZQeUNEYXRhX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkiWFhYIHRvIGJlIHByb3ZpZGVkIiwJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKVB5Q0RhdGFfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KVB5Q0RhdGFfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCVNpbXBsZV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlTaW1wbGVfZ2V0c2V0cywJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpU2ltcGxlX2luaXQsCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotICAgICAgICBHZW5lcmljUHlDRGF0YV9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5fU2ltcGxlQ0RhdGEiLAorICAgIHNpemVvZihDRGF0YU9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpJlNpbXBsZV9yZXByLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmU2ltcGxlX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgJlB5Q0RhdGFfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAiWFhYIHRvIGJlIHByb3ZpZGVkIiwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpUHlDRGF0YV90cmF2ZXJzZSwgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlQeUNEYXRhX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgU2ltcGxlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgU2ltcGxlX2dldHNldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKVNpbXBsZV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIEdlbmVyaWNQeUNEYXRhX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgUHlDUG9pbnRlcl9UeXBlCkBAIC00ODU4LDQyMCArNDg1OCw0MjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyX2l0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGluZGV4KQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JUHlfc3NpemVfdCBzaXplOwotCVB5X3NzaXplX3Qgb2Zmc2V0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKLQlQeU9iamVjdCAqcHJvdG87CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OworICAgIFB5T2JqZWN0ICpwcm90bzsKIAotCWlmICgqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiTlVMTCBwb2ludGVyIGFjY2VzcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCoodm9pZCAqKilzZWxmLT5iX3B0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgcG9pbnRlciBhY2Nlc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciBvYmplY3QgaW5zdGFuY2VzICovCi0JCi0JcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKLQlhc3NlcnQocHJvdG8pOwotCWl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCWFzc2VydChpdGVtZGljdCk7IC8qIHByb3RvIGlzIHRoZSBpdGVtIHR5cGUgb2YgdGhlIHBvaW50ZXIsIGEgY3R5cGVzCi0JCQkgICAgIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KKyAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBwb2ludGVyIG9iamVjdCBpbnN0YW5jZXMgKi8KIAotCXNpemUgPSBpdGVtZGljdC0+c2l6ZTsKLQlvZmZzZXQgPSBpbmRleCAqIGl0ZW1kaWN0LT5zaXplOworICAgIHByb3RvID0gc3RnZGljdC0+cHJvdG87CisgICAgYXNzZXJ0KHByb3RvKTsKKyAgICBpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICBhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBwb2ludGVyLCBhIGN0eXBlcworICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KIAotCXJldHVybiBQeUNEYXRhX2dldChwcm90bywgc3RnZGljdC0+Z2V0ZnVuYywgKFB5T2JqZWN0ICopc2VsZiwKLQkJCSBpbmRleCwgc2l6ZSwgKCooY2hhciAqKilzZWxmLT5iX3B0cikgKyBvZmZzZXQpOworICAgIHNpemUgPSBpdGVtZGljdC0+c2l6ZTsKKyAgICBvZmZzZXQgPSBpbmRleCAqIGl0ZW1kaWN0LT5zaXplOworCisgICAgcmV0dXJuIFB5Q0RhdGFfZ2V0KHByb3RvLCBzdGdkaWN0LT5nZXRmdW5jLCAoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHNpemUsICgqKGNoYXIgKiopc2VsZi0+Yl9wdHIpICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIGludAogUG9pbnRlcl9hc3NfaXRlbShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaW5kZXgsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeV9zc2l6ZV90IG9mZnNldDsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0LCAqaXRlbWRpY3Q7Ci0JUHlPYmplY3QgKnByb3RvOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIFB5X3NzaXplX3Qgb2Zmc2V0OworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKKyAgICBQeU9iamVjdCAqcHJvdG87CiAKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJQb2ludGVyIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiUG9pbnRlciBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICgqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiTlVMTCBwb2ludGVyIGFjY2VzcyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZnIgcG9pbnRlciBpbnN0YW5jZXMgKi8KKyAgICBpZiAoKih2b2lkICoqKXNlbGYtPmJfcHRyID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBwb2ludGVyIGFjY2VzcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKLQlhc3NlcnQocHJvdG8pOworICAgIHN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZnIgcG9pbnRlciBpbnN0YW5jZXMgKi8KIAotCWl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCWFzc2VydChpdGVtZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGJlY2F1c2UgdGhlIGl0ZW10eXBlIG9mIGEgcG9pbnRlcgotCQkJICAgICBpcyBhbHdheXMgYSBjdHlwZXMgdHlwZSAqLworICAgIHByb3RvID0gc3RnZGljdC0+cHJvdG87CisgICAgYXNzZXJ0KHByb3RvKTsKIAotCXNpemUgPSBpdGVtZGljdC0+c2l6ZTsKLQlvZmZzZXQgPSBpbmRleCAqIGl0ZW1kaWN0LT5zaXplOworICAgIGl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOworICAgIGFzc2VydChpdGVtZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGJlY2F1c2UgdGhlIGl0ZW10eXBlIG9mIGEgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFsd2F5cyBhIGN0eXBlcyB0eXBlICovCiAKLQlyZXR1cm4gUHlDRGF0YV9zZXQoKFB5T2JqZWN0ICopc2VsZiwgcHJvdG8sIHN0Z2RpY3QtPnNldGZ1bmMsIHZhbHVlLAotCQkJIGluZGV4LCBzaXplLCAoKihjaGFyICoqKXNlbGYtPmJfcHRyKSArIG9mZnNldCk7CisgICAgc2l6ZSA9IGl0ZW1kaWN0LT5zaXplOworICAgIG9mZnNldCA9IGluZGV4ICogaXRlbWRpY3QtPnNpemU7CisKKyAgICByZXR1cm4gUHlDRGF0YV9zZXQoKFB5T2JqZWN0ICopc2VsZiwgcHJvdG8sIHN0Z2RpY3QtPnNldGZ1bmMsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHNpemUsICgqKGNoYXIgKiopc2VsZi0+Yl9wdHIpICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBvaW50ZXJfZ2V0X2NvbnRlbnRzKENEYXRhT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAotCWlmICgqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiTlVMTCBwb2ludGVyIGFjY2VzcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCoodm9pZCAqKilzZWxmLT5iX3B0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgcG9pbnRlciBhY2Nlc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmciBwb2ludGVyIGluc3RhbmNlcyAqLwotCXJldHVybiBQeUNEYXRhX0Zyb21CYXNlT2JqKHN0Z2RpY3QtPnByb3RvLAotCQkJCSAoUHlPYmplY3QgKilzZWxmLCAwLAotCQkJCSAqKHZvaWQgKiopc2VsZi0+Yl9wdHIpOworICAgIHN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZnIgcG9pbnRlciBpbnN0YW5jZXMgKi8KKyAgICByZXR1cm4gUHlDRGF0YV9Gcm9tQmFzZU9iaihzdGdkaWN0LT5wcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopc2VsZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih2b2lkICoqKXNlbGYtPmJfcHRyKTsKIH0KIAogc3RhdGljIGludAogUG9pbnRlcl9zZXRfY29udGVudHMoQ0RhdGFPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKIHsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwotCUNEYXRhT2JqZWN0ICpkc3Q7Ci0JUHlPYmplY3QgKmtlZXA7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKKyAgICBDRGF0YU9iamVjdCAqZHN0OworICAgIFB5T2JqZWN0ICprZWVwOwogCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiUG9pbnRlciBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZyIHBvaW50ZXIgaW5zdGFuY2VzICovCi0JYXNzZXJ0KHN0Z2RpY3QtPnByb3RvKTsKLQlpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKHZhbHVlKSAKLQkgICAgfHwgMCA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCBzdGdkaWN0LT5wcm90bykpIHsKLQkJLyogWFhYIFB5T2JqZWN0X0lzSW5zdGFuY2UgY291bGQgcmV0dXJuIC0xISAqLwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZXhwZWN0ZWQgJXMgaW5zdGVhZCBvZiAlcyIsCi0JCQkgICAgICgoUHlUeXBlT2JqZWN0ICopKHN0Z2RpY3QtPnByb3RvKSktPnRwX25hbWUsCi0JCQkgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBvaW50ZXIgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmciBwb2ludGVyIGluc3RhbmNlcyAqLworICAgIGFzc2VydChzdGdkaWN0LT5wcm90byk7CisgICAgaWYgKCFDRGF0YU9iamVjdF9DaGVjayh2YWx1ZSkKKyAgICAgICAgfHwgMCA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCBzdGdkaWN0LT5wcm90bykpIHsKKyAgICAgICAgLyogWFhYIFB5T2JqZWN0X0lzSW5zdGFuY2UgY291bGQgcmV0dXJuIC0xISAqLworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVzIGluc3RlYWQgb2YgJXMiLAorICAgICAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKikoc3RnZGljdC0+cHJvdG8pKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWRzdCA9IChDRGF0YU9iamVjdCAqKXZhbHVlOwotCSoodm9pZCAqKilzZWxmLT5iX3B0ciA9IGRzdC0+Yl9wdHI7CisgICAgZHN0ID0gKENEYXRhT2JqZWN0ICopdmFsdWU7CisgICAgKih2b2lkICoqKXNlbGYtPmJfcHRyID0gZHN0LT5iX3B0cjsKIAotCS8qIAotCSAgIEEgUG9pbnRlciBpbnN0YW5jZSBtdXN0IGtlZXAgYSB0aGUgdmFsdWUgaXQgcG9pbnRzIHRvIGFsaXZlLiAgU28sIGEKLQkgICBwb2ludGVyIGluc3RhbmNlIGhhcyBiX2xlbmd0aCBzZXQgdG8gMiBpbnN0ZWFkIG9mIDEsIGFuZCB3ZSBzZXQKLQkgICAndmFsdWUnIGl0c2VsZiBhcyB0aGUgc2Vjb25kIGl0ZW0gb2YgdGhlIGJfb2JqZWN0cyBsaXN0LCBhZGRpdGlvbmFsbHkuCi0JKi8KLQlQeV9JTkNSRUYodmFsdWUpOwotCWlmICgtMSA9PSBLZWVwUmVmKHNlbGYsIDEsIHZhbHVlKSkKLQkJcmV0dXJuIC0xOworICAgIC8qCisgICAgICAgQSBQb2ludGVyIGluc3RhbmNlIG11c3Qga2VlcCBhIHRoZSB2YWx1ZSBpdCBwb2ludHMgdG8gYWxpdmUuICBTbywgYQorICAgICAgIHBvaW50ZXIgaW5zdGFuY2UgaGFzIGJfbGVuZ3RoIHNldCB0byAyIGluc3RlYWQgb2YgMSwgYW5kIHdlIHNldAorICAgICAgICd2YWx1ZScgaXRzZWxmIGFzIHRoZSBzZWNvbmQgaXRlbSBvZiB0aGUgYl9vYmplY3RzIGxpc3QsIGFkZGl0aW9uYWxseS4KKyAgICAqLworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgaWYgKC0xID09IEtlZXBSZWYoc2VsZiwgMSwgdmFsdWUpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlrZWVwID0gR2V0S2VlcGVkT2JqZWN0cyhkc3QpOwotCVB5X0lOQ1JFRihrZWVwKTsKLQlyZXR1cm4gS2VlcFJlZihzZWxmLCAwLCBrZWVwKTsKKyAgICBrZWVwID0gR2V0S2VlcGVkT2JqZWN0cyhkc3QpOworICAgIFB5X0lOQ1JFRihrZWVwKTsKKyAgICByZXR1cm4gS2VlcFJlZihzZWxmLCAwLCBrZWVwKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIFBvaW50ZXJfZ2V0c2V0c1tdID0gewotCXsgImNvbnRlbnRzIiwgKGdldHRlcilQb2ludGVyX2dldF9jb250ZW50cywKLQkgIChzZXR0ZXIpUG9pbnRlcl9zZXRfY29udGVudHMsCi0JICAidGhlIG9iamVjdCB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIChyZWFkLXdyaXRlKSIsIE5VTEwgfSwKLQl7IE5VTEwsIE5VTEwgfQorICAgIHsgImNvbnRlbnRzIiwgKGdldHRlcilQb2ludGVyX2dldF9jb250ZW50cywKKyAgICAgIChzZXR0ZXIpUG9pbnRlcl9zZXRfY29udGVudHMsCisgICAgICAidGhlIG9iamVjdCB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIChyZWFkLXdyaXRlKSIsIE5VTEwgfSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogc3RhdGljIGludAogUG9pbnRlcl9pbml0KENEYXRhT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICp2YWx1ZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnZhbHVlID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIlBPSU5URVIiLCAwLCAxLCAmdmFsdWUpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHZhbHVlID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiBQb2ludGVyX3NldF9jb250ZW50cyhzZWxmLCB2YWx1ZSwgTlVMTCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiUE9JTlRFUiIsIDAsIDEsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIFBvaW50ZXJfc2V0X2NvbnRlbnRzKHNlbGYsIHZhbHVlLCBOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBvaW50ZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZSk7Ci0JaWYgKCFkaWN0IHx8ICFkaWN0LT5wcm90bykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJDYW5ub3QgY3JlYXRlIGluc3RhbmNlOiBoYXMgbm8gX3R5cGVfIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gR2VuZXJpY1B5Q0RhdGFfbmV3KHR5cGUsIGFyZ3MsIGt3KTsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZSk7CisgICAgaWYgKCFkaWN0IHx8ICFkaWN0LT5wcm90bykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgaW5zdGFuY2U6IGhhcyBubyBfdHlwZV8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBHZW5lcmljUHlDRGF0YV9uZXcodHlwZSwgYXJncywga3cpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUG9pbnRlcl9zbGljZShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKIHsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwotCVB5TGlzdE9iamVjdCAqbnA7Ci0JU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OwotCVB5T2JqZWN0ICpwcm90bzsKLQlQeV9zc2l6ZV90IGksIGxlbjsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIFB5TGlzdE9iamVjdCAqbnA7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OworICAgIFB5T2JqZWN0ICpwcm90bzsKKyAgICBQeV9zc2l6ZV90IGksIGxlbjsKIAotCWlmIChpbG93IDwgMCkKLQkJaWxvdyA9IDA7Ci0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWxlbiA9IGloaWdoIC0gaWxvdzsKKyAgICBpZiAoaWxvdyA8IDApCisgICAgICAgIGlsb3cgPSAwOworICAgIGlmIChpaGlnaCA8IGlsb3cpCisgICAgICAgIGloaWdoID0gaWxvdzsKKyAgICBsZW4gPSBpaGlnaCAtIGlsb3c7CiAKLQlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZyIHBvaW50ZXIgaW5zdGFuY2VzICovCi0JcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKLQlhc3NlcnQocHJvdG8pOwotCWl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCWFzc2VydChpdGVtZGljdCk7Ci0JaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygiYyIpLT5nZXRmdW5jKSB7Ci0JCWNoYXIgKnB0ciA9ICooY2hhciAqKilzZWxmLT5iX3B0cjsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHB0ciArIGlsb3csIGxlbik7CisgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmciBwb2ludGVyIGluc3RhbmNlcyAqLworICAgIHByb3RvID0gc3RnZGljdC0+cHJvdG87CisgICAgYXNzZXJ0KHByb3RvKTsKKyAgICBpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICBhc3NlcnQoaXRlbWRpY3QpOworICAgIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBfY3R5cGVzX2dldF9maWVsZGRlc2MoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICBjaGFyICpwdHIgPSAqKGNoYXIgKiopc2VsZi0+Yl9wdHI7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIgKyBpbG93LCBsZW4pOwogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JfSBlbHNlIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBfY3R5cGVzX2dldF9maWVsZGRlc2MoInUiKS0+Z2V0ZnVuYykgewotCQl3Y2hhcl90ICpwdHIgPSAqKHdjaGFyX3QgKiopc2VsZi0+Yl9wdHI7Ci0JCXJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHB0ciArIGlsb3csIGxlbik7CisgICAgfSBlbHNlIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBfY3R5cGVzX2dldF9maWVsZGRlc2MoInUiKS0+Z2V0ZnVuYykgeworICAgICAgICB3Y2hhcl90ICpwdHIgPSAqKHdjaGFyX3QgKiopc2VsZi0+Yl9wdHI7CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHB0ciArIGlsb3csIGxlbik7CiAjZW5kaWYKLQl9CisgICAgfQogCi0JbnAgPSAoUHlMaXN0T2JqZWN0ICopIFB5TGlzdF9OZXcobGVuKTsKLQlpZiAobnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbnAgPSAoUHlMaXN0T2JqZWN0ICopIFB5TGlzdF9OZXcobGVuKTsKKyAgICBpZiAobnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBQb2ludGVyX2l0ZW0oX3NlbGYsIGkraWxvdyk7Ci0JCVB5TGlzdF9TRVRfSVRFTShucCwgaSwgdik7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilucDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQb2ludGVyX2l0ZW0oX3NlbGYsIGkraWxvdyk7CisgICAgICAgIFB5TGlzdF9TRVRfSVRFTShucCwgaSwgdik7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilucDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBvaW50ZXJfc3Vic2NyaXB0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQlpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmV0dXJuIFBvaW50ZXJfaXRlbShfc2VsZiwgaSk7Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJUHlTbGljZU9iamVjdCAqc2xpY2UgPSAoUHlTbGljZU9iamVjdCAqKWl0ZW07Ci0JCVB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXA7Ci0JCVB5T2JqZWN0ICpucDsKLQkJU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OwotCQlQeU9iamVjdCAqcHJvdG87Ci0JCVB5X3NzaXplX3QgaSwgbGVuLCBjdXI7CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIFBvaW50ZXJfaXRlbShfc2VsZiwgaSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlTbGljZU9iamVjdCAqc2xpY2UgPSAoUHlTbGljZU9iamVjdCAqKWl0ZW07CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXA7CisgICAgICAgIFB5T2JqZWN0ICpucDsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OworICAgICAgICBQeU9iamVjdCAqcHJvdG87CisgICAgICAgIFB5X3NzaXplX3QgaSwgbGVuLCBjdXI7CiAKLQkJLyogU2luY2UgcG9pbnRlcnMgaGF2ZSBubyBsZW5ndGgsIGFuZCB3ZSB3YW50IHRvIGFwcGx5Ci0JCSAgIGRpZmZlcmVudCBzZW1hbnRpY3MgdG8gbmVnYXRpdmUgaW5kaWNlcyB0aGFuIG5vcm1hbAotCQkgICBzbGljaW5nLCB3ZSBoYXZlIHRvIGRpc3NlY3QgdGhlIHNsaWNlIG9iamVjdCBvdXJzZWx2ZXMuKi8KLQkJaWYgKHNsaWNlLT5zdGVwID09IFB5X05vbmUpIHsKLQkJCXN0ZXAgPSAxOwotCQl9Ci0JCWVsc2UgewotCQkJc3RlcCA9IFB5TnVtYmVyX0FzU3NpemVfdChzbGljZS0+c3RlcCwKLQkJCQkJCSAgUHlFeGNfVmFsdWVFcnJvcik7Ci0JCQlpZiAoc3RlcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiBOVUxMOwotCQkJaWYgKHN0ZXAgPT0gMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJInNsaWNlIHN0ZXAgY2Fubm90IGJlIHplcm8iKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlpZiAoc2xpY2UtPnN0YXJ0ID09IFB5X05vbmUpIHsKLQkJCWlmIChzdGVwIDwgMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJInNsaWNlIHN0YXJ0IGlzIHJlcXVpcmVkICIKLQkJCQkJCSJmb3Igc3RlcCA8IDAiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXN0YXJ0ID0gMDsKLQkJfQotCQllbHNlIHsKLQkJCXN0YXJ0ID0gUHlOdW1iZXJfQXNTc2l6ZV90KHNsaWNlLT5zdGFydCwKLQkJCQkJCSAgIFB5RXhjX1ZhbHVlRXJyb3IpOwotCQkJaWYgKHN0YXJ0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKHNsaWNlLT5zdG9wID09IFB5X05vbmUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkic2xpY2Ugc3RvcCBpcyByZXF1aXJlZCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3RvcCA9IFB5TnVtYmVyX0FzU3NpemVfdChzbGljZS0+c3RvcCwKLQkJCQkJICBQeUV4Y19WYWx1ZUVycm9yKTsKLQkJaWYgKHN0b3AgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoKHN0ZXAgPiAwICYmIHN0YXJ0ID4gc3RvcCkgfHwKLQkJICAgIChzdGVwIDwgMCAmJiBzdGFydCA8IHN0b3ApKQotCQkJbGVuID0gMDsKLQkJZWxzZSBpZiAoc3RlcCA+IDApCi0JCQlsZW4gPSAoc3RvcCAtIHN0YXJ0IC0gMSkgLyBzdGVwICsgMTsKLQkJZWxzZQotCQkJbGVuID0gKHN0b3AgLSBzdGFydCArIDEpIC8gc3RlcCArIDE7CisgICAgICAgIC8qIFNpbmNlIHBvaW50ZXJzIGhhdmUgbm8gbGVuZ3RoLCBhbmQgd2Ugd2FudCB0byBhcHBseQorICAgICAgICAgICBkaWZmZXJlbnQgc2VtYW50aWNzIHRvIG5lZ2F0aXZlIGluZGljZXMgdGhhbiBub3JtYWwKKyAgICAgICAgICAgc2xpY2luZywgd2UgaGF2ZSB0byBkaXNzZWN0IHRoZSBzbGljZSBvYmplY3Qgb3Vyc2VsdmVzLiovCisgICAgICAgIGlmIChzbGljZS0+c3RlcCA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBzdGVwID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN0ZXAgPSBQeU51bWJlcl9Bc1NzaXplX3Qoc2xpY2UtPnN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IpOworICAgICAgICAgICAgaWYgKHN0ZXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmIChzdGVwID09IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWNlIHN0ZXAgY2Fubm90IGJlIHplcm8iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2xpY2UtPnN0YXJ0ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGlmIChzdGVwIDwgMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2xpY2Ugc3RhcnQgaXMgcmVxdWlyZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0ZXAgPCAwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGFydCA9IFB5TnVtYmVyX0FzU3NpemVfdChzbGljZS0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yKTsKKyAgICAgICAgICAgIGlmIChzdGFydCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChzbGljZS0+c3RvcCA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2xpY2Ugc3RvcCBpcyByZXF1aXJlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3RvcCA9IFB5TnVtYmVyX0FzU3NpemVfdChzbGljZS0+c3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yKTsKKyAgICAgICAgaWYgKHN0b3AgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoKHN0ZXAgPiAwICYmIHN0YXJ0ID4gc3RvcCkgfHwKKyAgICAgICAgICAgIChzdGVwIDwgMCAmJiBzdGFydCA8IHN0b3ApKQorICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgZWxzZSBpZiAoc3RlcCA+IDApCisgICAgICAgICAgICBsZW4gPSAoc3RvcCAtIHN0YXJ0IC0gMSkgLyBzdGVwICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVuID0gKHN0b3AgLSBzdGFydCArIDEpIC8gc3RlcCArIDE7CiAKLQkJc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JCWFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgaW5zdGFuY2VzICovCi0JCXByb3RvID0gc3RnZGljdC0+cHJvdG87Ci0JCWFzc2VydChwcm90byk7Ci0JCWl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCQlhc3NlcnQoaXRlbWRpY3QpOwotCQlpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJjIiktPmdldGZ1bmMpIHsKLQkJCWNoYXIgKnB0ciA9ICooY2hhciAqKilzZWxmLT5iX3B0cjsKLQkJCWNoYXIgKmRlc3Q7Ci0JCQkKLQkJCWlmIChsZW4gPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIAlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JCQlpZiAoc3RlcCA9PSAxKSB7Ci0JCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHB0ciArIHN0YXJ0LAotCQkJCQkJCQkgIGxlbik7Ci0JCQl9Ci0JCQlkZXN0ID0gKGNoYXIgKilQeU1lbV9NYWxsb2MobGVuKTsKLQkJCWlmIChkZXN0ID09IE5VTEwpCi0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCWRlc3RbaV0gPSBwdHJbY3VyXTsKLQkJCX0KLQkJCW5wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGVzdCwgbGVuKTsKLQkJCVB5TWVtX0ZyZWUoZGVzdCk7Ci0JCQlyZXR1cm4gbnA7Ci0JCX0KKyAgICAgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgICAgIGFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgaW5zdGFuY2VzICovCisgICAgICAgIHByb3RvID0gc3RnZGljdC0+cHJvdG87CisgICAgICAgIGFzc2VydChwcm90byk7CisgICAgICAgIGl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOworICAgICAgICBhc3NlcnQoaXRlbWRpY3QpOworICAgICAgICBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJjIiktPmdldGZ1bmMpIHsKKyAgICAgICAgICAgIGNoYXIgKnB0ciA9ICooY2hhciAqKilzZWxmLT5iX3B0cjsKKyAgICAgICAgICAgIGNoYXIgKmRlc3Q7CisKKyAgICAgICAgICAgIGlmIChsZW4gPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgICAgICBpZiAoc3RlcCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHB0ciArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdCA9IChjaGFyICopUHlNZW1fTWFsbG9jKGxlbik7CisgICAgICAgICAgICBpZiAoZGVzdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBsZW47IGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gcHRyW2N1cl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBucCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRlc3QsIGxlbik7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIG5wOworICAgICAgICB9CiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKLQkJaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygidSIpLT5nZXRmdW5jKSB7Ci0JCQl3Y2hhcl90ICpwdHIgPSAqKHdjaGFyX3QgKiopc2VsZi0+Yl9wdHI7Ci0JCQl3Y2hhcl90ICpkZXN0OwotCQkJCi0JCQlpZiAobGVuIDw9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAJcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCAwKTsKLQkJCWlmIChzdGVwID09IDEpIHsKLQkJCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwdHIgKyBzdGFydCwKLQkJCQkJCQkgICAgICBsZW4pOwotCQkJfQotCQkJZGVzdCA9ICh3Y2hhcl90ICopUHlNZW1fTWFsbG9jKGxlbiAqIHNpemVvZih3Y2hhcl90KSk7Ci0JCQlpZiAoZGVzdCA9PSBOVUxMKQotCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBsZW47IGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlkZXN0W2ldID0gcHRyW2N1cl07Ci0JCQl9Ci0JCQlucCA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoZGVzdCwgbGVuKTsKLQkJCVB5TWVtX0ZyZWUoZGVzdCk7Ci0JCQlyZXR1cm4gbnA7Ci0JCX0KKyAgICAgICAgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygidSIpLT5nZXRmdW5jKSB7CisgICAgICAgICAgICB3Y2hhcl90ICpwdHIgPSAqKHdjaGFyX3QgKiopc2VsZi0+Yl9wdHI7CisgICAgICAgICAgICB3Y2hhcl90ICpkZXN0OworCisgICAgICAgICAgICBpZiAobGVuIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwdHIgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdCA9ICh3Y2hhcl90ICopUHlNZW1fTWFsbG9jKGxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgICAgICAgICBpZiAoZGVzdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBsZW47IGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gcHRyW2N1cl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBucCA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoZGVzdCwgbGVuKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gbnA7CisgICAgICAgIH0KICNlbmRpZgogCi0JCW5wID0gUHlMaXN0X05ldyhsZW4pOwotCQlpZiAobnAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBucCA9IFB5TGlzdF9OZXcobGVuKTsKKyAgICAgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBQb2ludGVyX2l0ZW0oX3NlbGYsIGN1cik7Ci0JCQlQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOwotCQl9Ci0JCXJldHVybiBucDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIlBvaW50ZXIgaW5kaWNlcyBtdXN0IGJlIGludGVnZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQb2ludGVyX2l0ZW0oX3NlbGYsIGN1cik7CisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBucDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiUG9pbnRlciBpbmRpY2VzIG11c3QgYmUgaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBQb2ludGVyX2FzX3NlcXVlbmNlID0gewotCTAsCQkJCQkvKiBpbnF1aXJ5IHNxX2xlbmd0aDsgKi8KLQkwLAkJCQkJLyogYmluYXJ5ZnVuYyBzcV9jb25jYXQ7ICovCi0JMCwJCQkJCS8qIGludGFyZ2Z1bmMgc3FfcmVwZWF0OyAqLwotCVBvaW50ZXJfaXRlbSwJCQkJLyogaW50YXJnZnVuYyBzcV9pdGVtOyAqLwotCVBvaW50ZXJfc2xpY2UsCQkJCS8qIGludGludGFyZ2Z1bmMgc3Ffc2xpY2U7ICovCi0JUG9pbnRlcl9hc3NfaXRlbSwJCQkvKiBpbnRvYmphcmdwcm9jIHNxX2Fzc19pdGVtOyAqLwotCTAsCQkJCQkvKiBpbnRpbnRvYmphcmdwcm9jIHNxX2Fzc19zbGljZTsgKi8KLQkwLAkJCQkJLyogb2Jqb2JqcHJvYyBzcV9jb250YWluczsgKi8KLQkvKiBBZGRlZCBpbiByZWxlYXNlIDIuMCAqLwotCTAsCQkJCQkvKiBiaW5hcnlmdW5jIHNxX2lucGxhY2VfY29uY2F0OyAqLwotCTAsCQkJCQkvKiBpbnRhcmdmdW5jIHNxX2lucGxhY2VfcmVwZWF0OyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5xdWlyeSBzcV9sZW5ndGg7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaW5hcnlmdW5jIHNxX2NvbmNhdDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGFyZ2Z1bmMgc3FfcmVwZWF0OyAqLworICAgIFBvaW50ZXJfaXRlbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50YXJnZnVuYyBzcV9pdGVtOyAqLworICAgIFBvaW50ZXJfc2xpY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50aW50YXJnZnVuYyBzcV9zbGljZTsgKi8KKyAgICBQb2ludGVyX2Fzc19pdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludG9iamFyZ3Byb2Mgc3FfYXNzX2l0ZW07ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRpbnRvYmphcmdwcm9jIHNxX2Fzc19zbGljZTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iam9ianByb2Mgc3FfY29udGFpbnM7ICovCisgICAgLyogQWRkZWQgaW4gcmVsZWFzZSAyLjAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpbmFyeWZ1bmMgc3FfaW5wbGFjZV9jb25jYXQ7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRhcmdmdW5jIHNxX2lucGxhY2VfcmVwZWF0OyAqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgUG9pbnRlcl9hc19tYXBwaW5nID0gewotCTAsCi0JUG9pbnRlcl9zdWJzY3JpcHQsCisgICAgMCwKKyAgICBQb2ludGVyX3N1YnNjcmlwdCwKIH07CiAKIHN0YXRpYyBpbnQKIFBvaW50ZXJfbm9uemVybyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKCoodm9pZCAqKilzZWxmLT5iX3B0ciAhPSBOVUxMKTsKKyAgICByZXR1cm4gKCoodm9pZCAqKilzZWxmLT5iX3B0ciAhPSBOVUxMKTsKIH0KIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBQb2ludGVyX2FzX251bWJlciA9IHsKLQkwLCAvKiBuYl9hZGQgKi8KLQkwLCAvKiBuYl9zdWJ0cmFjdCAqLwotCTAsIC8qIG5iX211bHRpcGx5ICovCi0JMCwgLyogbmJfZGl2aWRlICovCi0JMCwgLyogbmJfcmVtYWluZGVyICovCi0JMCwgLyogbmJfZGl2bW9kICovCi0JMCwgLyogbmJfcG93ZXIgKi8KLQkwLCAvKiBuYl9uZWdhdGl2ZSAqLwotCTAsIC8qIG5iX3Bvc2l0aXZlICovCi0JMCwgLyogbmJfYWJzb2x1dGUgKi8KLQkoaW5xdWlyeSlQb2ludGVyX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAvKiBuYl9hZGQgKi8KKyAgICAwLCAvKiBuYl9zdWJ0cmFjdCAqLworICAgIDAsIC8qIG5iX211bHRpcGx5ICovCisgICAgMCwgLyogbmJfZGl2aWRlICovCisgICAgMCwgLyogbmJfcmVtYWluZGVyICovCisgICAgMCwgLyogbmJfZGl2bW9kICovCisgICAgMCwgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAvKiBuYl9uZWdhdGl2ZSAqLworICAgIDAsIC8qIG5iX3Bvc2l0aXZlICovCisgICAgMCwgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSlQb2ludGVyX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUNQb2ludGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jdHlwZXMuX1BvaW50ZXIiLAotCXNpemVvZihDRGF0YU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCSZQb2ludGVyX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmUG9pbnRlcl9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZQb2ludGVyX2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJlB5Q0RhdGFfYXNfYnVmZmVyLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCSJYWFggdG8gYmUgcHJvdmlkZWQiLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpUHlDRGF0YV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpUHlDRGF0YV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCVBvaW50ZXJfZ2V0c2V0cywJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylQb2ludGVyX2luaXQsCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCVBvaW50ZXJfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLl9Qb2ludGVyIiwKKyAgICBzaXplb2YoQ0RhdGFPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJlBvaW50ZXJfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmUG9pbnRlcl9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJlBvaW50ZXJfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZQeUNEYXRhX2FzX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgIlhYWCB0byBiZSBwcm92aWRlZCIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKVB5Q0RhdGFfdHJhdmVyc2UsICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpUHlDRGF0YV9jbGVhciwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIFBvaW50ZXJfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylQb2ludGVyX2luaXQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQb2ludGVyX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqICBNb2R1bGUgaW5pdGlhbGl6YXRpb24uCkBAIC01MjkyLDc4ICs1MjkyLDc4IEBACiAgICAgaW50IHN0YXR1czsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09PTzpDT01FcnJvciIsICZzZWxmLCAmaHJlc3VsdCwgJnRleHQsICZkZXRhaWxzKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgYSA9IFB5U2VxdWVuY2VfR2V0U2xpY2UoYXJncywgMSwgUHlTZXF1ZW5jZV9TaXplKGFyZ3MpKTsKICAgICBpZiAoIWEpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIHN0YXR1cyA9IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImFyZ3MiLCBhKTsKICAgICBQeV9ERUNSRUYoYSk7CiAgICAgaWYgKHN0YXR1cyA8IDApCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImhyZXN1bHQiLCBocmVzdWx0KSA8IDApCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJ0ZXh0IiwgdGV4dCkgPCAwKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiZGV0YWlscyIsIGRldGFpbHMpIDwgMCkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY29tZXJyb3JfbWV0aG9kc1tdID0gewotCXsgIl9faW5pdF9fIiwgY29tZXJyb3JfaW5pdCwgTUVUSF9WQVJBUkdTIH0sCi0JeyBOVUxMLCBOVUxMIH0sCisgICAgeyAiX19pbml0X18iLCBjb21lcnJvcl9pbml0LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIHN0YXRpYyBpbnQKIGNyZWF0ZV9jb21lcnJvcih2b2lkKQogewotCVB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOwotCVB5TWV0aG9kRGVmICptZXRob2RzID0gY29tZXJyb3JfbWV0aG9kczsKLQlQeU9iamVjdCAqczsKLQlpbnQgc3RhdHVzOworICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOworICAgIFB5TWV0aG9kRGVmICptZXRob2RzID0gY29tZXJyb3JfbWV0aG9kczsKKyAgICBQeU9iamVjdCAqczsKKyAgICBpbnQgc3RhdHVzOwogCi0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXdoaWxlIChtZXRob2RzLT5tbF9uYW1lKSB7Ci0JCS8qIGdldCBhIHdyYXBwZXIgZm9yIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAqLwotCQlQeU9iamVjdCAqZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyhtZXRob2RzLCBOVUxMKTsKLQkJUHlPYmplY3QgKm1ldGg7Ci0JCWlmIChmdW5jID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQltZXRoID0gUHlNZXRob2RfTmV3KGZ1bmMsIE5VTEwsIENvbUVycm9yKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlpZiAobWV0aCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbWV0aG9kcy0+bWxfbmFtZSwgbWV0aCk7Ci0JCVB5X0RFQ1JFRihtZXRoKTsKLQkJKyttZXRob2RzOwotCX0KKyAgICB3aGlsZSAobWV0aG9kcy0+bWxfbmFtZSkgeworICAgICAgICAvKiBnZXQgYSB3cmFwcGVyIGZvciB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gKi8KKyAgICAgICAgUHlPYmplY3QgKmZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcobWV0aG9kcywgTlVMTCk7CisgICAgICAgIFB5T2JqZWN0ICptZXRoOworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgbWV0aCA9IFB5TWV0aG9kX05ldyhmdW5jLCBOVUxMLCBDb21FcnJvcik7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgaWYgKG1ldGggPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG1ldGhvZHMtPm1sX25hbWUsIG1ldGgpOworICAgICAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgICAgICsrbWV0aG9kczsKKyAgICB9CiAKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjb21lcnJvcl9kb2MpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0Jc3RhdHVzID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iLCBzKTsKLQlQeV9ERUNSRUYocyk7Ci0JaWYgKHN0YXR1cyA9PSAtMSkKLQkJZ290byBlcnJvcjsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjb21lcnJvcl9kb2MpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iLCBzKTsKKyAgICBQeV9ERUNSRUYocyk7CisgICAgaWYgKHN0YXR1cyA9PSAtMSkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCUNvbUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJfY3R5cGVzLkNPTUVycm9yIiwKLQkJCQkgICAgICBOVUxMLAotCQkJCSAgICAgIGRpY3QpOwotCWlmIChDb21FcnJvciA9PSBOVUxMKQotCQlnb3RvIGVycm9yOworICAgIENvbUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJfY3R5cGVzLkNPTUVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QpOworICAgIGlmIChDb21FcnJvciA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAgIGVycm9yOgotCVB5X0RFQ1JFRihkaWN0KTsKLQlyZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKGRpY3QpOworICAgIHJldHVybiAtMTsKIH0KIAogI2VuZGlmCkBAIC01MzcxLDI0NiArNTM3MSwyNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfYXQoY29uc3QgY2hhciAqcHRyLCBpbnQgc2l6ZSkKIHsKLQlpZiAoc2l6ZSA9PSAtMSkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocHRyKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyLCBzaXplKTsKKyAgICBpZiAoc2l6ZSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocHRyKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyLCBzaXplKTsKIH0KIAogc3RhdGljIGludAogY2FzdF9jaGVja19wb2ludGVydHlwZShQeU9iamVjdCAqYXJnKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKIAotCWlmIChQeUNQb2ludGVyVHlwZU9iamVjdF9DaGVjayhhcmcpKQotCQlyZXR1cm4gMTsKLQlpZiAoUHlDRnVuY1B0clR5cGVPYmplY3RfQ2hlY2soYXJnKSkKLQkJcmV0dXJuIDE7Ci0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFyZyk7Ci0JaWYgKGRpY3QpIHsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGRpY3QtPnByb3RvKQotCQkgICAgJiYgKHN0cmNocigic1B6VVpYTyIsIFB5U3RyaW5nX0FTX1NUUklORyhkaWN0LT5wcm90bylbMF0pKSkgewotCQkJLyogc2ltcGxlIHBvaW50ZXIgdHlwZXMsIGNfdm9pZF9wLCBjX3djaGFyX3AsIEJTVFIsIC4uLiAqLwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiY2FzdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBhIHBvaW50ZXIgdHlwZSwgbm90ICVzIiwKLQkJICAgICBQeVR5cGVfQ2hlY2soYXJnKQotCQkgICAgID8gKChQeVR5cGVPYmplY3QgKilhcmcpLT50cF9uYW1lCi0JCSAgICAgOiBQeV9UWVBFKGFyZyktPnRwX25hbWUpOwotCXJldHVybiAwOworICAgIGlmIChQeUNQb2ludGVyVHlwZU9iamVjdF9DaGVjayhhcmcpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoUHlDRnVuY1B0clR5cGVPYmplY3RfQ2hlY2soYXJnKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFyZyk7CisgICAgaWYgKGRpY3QpIHsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGRpY3QtPnByb3RvKQorICAgICAgICAgICAgJiYgKHN0cmNocigic1B6VVpYTyIsIFB5U3RyaW5nX0FTX1NUUklORyhkaWN0LT5wcm90bylbMF0pKSkgeworICAgICAgICAgICAgLyogc2ltcGxlIHBvaW50ZXIgdHlwZXMsIGNfdm9pZF9wLCBjX3djaGFyX3AsIEJTVFIsIC4uLiAqLworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImNhc3QoKSBhcmd1bWVudCAyIG11c3QgYmUgYSBwb2ludGVyIHR5cGUsIG5vdCAlcyIsCisgICAgICAgICAgICAgICAgIFB5VHlwZV9DaGVjayhhcmcpCisgICAgICAgICAgICAgICAgID8gKChQeVR5cGVPYmplY3QgKilhcmcpLT50cF9uYW1lCisgICAgICAgICAgICAgICAgIDogUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNhc3Qodm9pZCAqcHRyLCBQeU9iamVjdCAqc3JjLCBQeU9iamVjdCAqY3R5cGUpCiB7Ci0JQ0RhdGFPYmplY3QgKnJlc3VsdDsKLQlpZiAoMCA9PSBjYXN0X2NoZWNrX3BvaW50ZXJ0eXBlKGN0eXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gKENEYXRhT2JqZWN0ICopUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjdHlwZSwgTlVMTCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBDRGF0YU9iamVjdCAqcmVzdWx0OworICAgIGlmICgwID09IGNhc3RfY2hlY2tfcG9pbnRlcnR5cGUoY3R5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSAoQ0RhdGFPYmplY3QgKilQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGN0eXBlLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyoKLQkgIFRoZSBjYXN0ZWQgb2JqZWN0cyAnX29iamVjdHMnIG1lbWJlcjoKKyAgICAvKgorICAgICAgVGhlIGNhc3RlZCBvYmplY3RzICdfb2JqZWN0cycgbWVtYmVyOgogCi0JICBJdCBtdXN0IGNlcnRhaW5seSBjb250YWluIHRoZSBzb3VyY2Ugb2JqZWN0cyBvbmUuCi0JICBJdCBtdXN0IGNvbnRhaW4gdGhlIHNvdXJjZSBvYmplY3QgaXRzZWxmLgotCSAqLwotCWlmIChDRGF0YU9iamVjdF9DaGVjayhzcmMpKSB7Ci0JCUNEYXRhT2JqZWN0ICpvYmogPSAoQ0RhdGFPYmplY3QgKilzcmM7Ci0JCS8qIFB5Q0RhdGFfR2V0Q29udGFpbmVyIHdpbGwgaW5pdGlhbGl6ZSBzcmMuYl9vYmplY3RzLCB3ZSBuZWVkCi0JCSAgIHRoaXMgc28gaXQgY2FuIGJlIHNoYXJlZCAqLwotCQlQeUNEYXRhX0dldENvbnRhaW5lcihvYmopOwotCQkvKiBCdXQgd2UgbmVlZCBhIGRpY3Rpb25hcnkhICovCi0JCWlmIChvYmotPmJfb2JqZWN0cyA9PSBQeV9Ob25lKSB7Ci0JCQlQeV9ERUNSRUYoUHlfTm9uZSk7Ci0JCQlvYmotPmJfb2JqZWN0cyA9IFB5RGljdF9OZXcoKTsKLQkJCWlmIChvYmotPmJfb2JqZWN0cyA9PSBOVUxMKQotCQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JCVB5X1hJTkNSRUYob2JqLT5iX29iamVjdHMpOwotCQlyZXN1bHQtPmJfb2JqZWN0cyA9IG9iai0+Yl9vYmplY3RzOwotCQlpZiAocmVzdWx0LT5iX29iamVjdHMgJiYgUHlEaWN0X0NoZWNrRXhhY3QocmVzdWx0LT5iX29iamVjdHMpKSB7Ci0JCQlQeU9iamVjdCAqaW5kZXg7Ci0JCQlpbnQgcmM7Ci0JCQlpbmRleCA9IFB5TG9uZ19Gcm9tVm9pZFB0cigodm9pZCAqKXNyYyk7Ci0JCQlpZiAoaW5kZXggPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWxlZDsKLQkJCXJjID0gUHlEaWN0X1NldEl0ZW0ocmVzdWx0LT5iX29iamVjdHMsIGluZGV4LCBzcmMpOwotCQkJUHlfREVDUkVGKGluZGV4KTsKLQkJCWlmIChyYyA9PSAtMSkKLQkJCQlnb3RvIGZhaWxlZDsKLQkJfQotCX0KLQkvKiBTaG91bGQgd2UgYXNzZXJ0IHRoYXQgcmVzdWx0IGlzIGEgcG9pbnRlciB0eXBlPyAqLwotCW1lbWNweShyZXN1bHQtPmJfcHRyLCAmcHRyLCBzaXplb2Yodm9pZCAqKSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICAgIEl0IG11c3QgY2VydGFpbmx5IGNvbnRhaW4gdGhlIHNvdXJjZSBvYmplY3RzIG9uZS4KKyAgICAgIEl0IG11c3QgY29udGFpbiB0aGUgc291cmNlIG9iamVjdCBpdHNlbGYuCisgICAgICovCisgICAgaWYgKENEYXRhT2JqZWN0X0NoZWNrKHNyYykpIHsKKyAgICAgICAgQ0RhdGFPYmplY3QgKm9iaiA9IChDRGF0YU9iamVjdCAqKXNyYzsKKyAgICAgICAgLyogUHlDRGF0YV9HZXRDb250YWluZXIgd2lsbCBpbml0aWFsaXplIHNyYy5iX29iamVjdHMsIHdlIG5lZWQKKyAgICAgICAgICAgdGhpcyBzbyBpdCBjYW4gYmUgc2hhcmVkICovCisgICAgICAgIFB5Q0RhdGFfR2V0Q29udGFpbmVyKG9iaik7CisgICAgICAgIC8qIEJ1dCB3ZSBuZWVkIGEgZGljdGlvbmFyeSEgKi8KKyAgICAgICAgaWYgKG9iai0+Yl9vYmplY3RzID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIG9iai0+Yl9vYmplY3RzID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKG9iai0+Yl9vYmplY3RzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgUHlfWElOQ1JFRihvYmotPmJfb2JqZWN0cyk7CisgICAgICAgIHJlc3VsdC0+Yl9vYmplY3RzID0gb2JqLT5iX29iamVjdHM7CisgICAgICAgIGlmIChyZXN1bHQtPmJfb2JqZWN0cyAmJiBQeURpY3RfQ2hlY2tFeGFjdChyZXN1bHQtPmJfb2JqZWN0cykpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppbmRleDsKKyAgICAgICAgICAgIGludCByYzsKKyAgICAgICAgICAgIGluZGV4ID0gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkICopc3JjKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmMgPSBQeURpY3RfU2V0SXRlbShyZXN1bHQtPmJfb2JqZWN0cywgaW5kZXgsIHNyYyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW5kZXgpOworICAgICAgICAgICAgaWYgKHJjID09IC0xKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorICAgIC8qIFNob3VsZCB3ZSBhc3NlcnQgdGhhdCByZXN1bHQgaXMgYSBwb2ludGVyIHR5cGU/ICovCisgICAgbWVtY3B5KHJlc3VsdC0+Yl9wdHIsICZwdHIsIHNpemVvZih2b2lkICopKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogCiAgIGZhaWxlZDoKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIENUWVBFU19VTklDT0RFCiBzdGF0aWMgUHlPYmplY3QgKgogd3N0cmluZ19hdChjb25zdCB3Y2hhcl90ICpwdHIsIGludCBzaXplKQogewotCVB5X3NzaXplX3Qgc3NpemUgPSBzaXplOwotCWlmIChzc2l6ZSA9PSAtMSkKLQkJc3NpemUgPSB3Y3NsZW4ocHRyKTsKLQlyZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwdHIsIHNzaXplKTsKKyAgICBQeV9zc2l6ZV90IHNzaXplID0gc2l6ZTsKKyAgICBpZiAoc3NpemUgPT0gLTEpCisgICAgICAgIHNzaXplID0gd2NzbGVuKHB0cik7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyLCBzc2l6ZSk7CiB9CiAjZW5kaWYKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRfY3R5cGVzKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKIC8qIE5vdGU6CiAgICBvYl90eXBlIGlzIHRoZSBtZXRhdHlwZSAodGhlICd0eXBlJyksIGRlZmF1bHRzIHRvIFB5VHlwZV9UeXBlLAogICAgdHBfYmFzZSBpcyB0aGUgYmFzZSB0eXBlLCBkZWZhdWx0cyB0byAnb2JqZWN0JyBha2EgUHlCYXNlT2JqZWN0X1R5cGUuCiAqLwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlFdmFsX0luaXRUaHJlYWRzKCk7CisgICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7CiAjZW5kaWYKLQltID0gUHlfSW5pdE1vZHVsZTMoIl9jdHlwZXMiLCBfY3R5cGVzX21vZHVsZV9tZXRob2RzLCBtb2R1bGVfZG9jcyk7Ci0JaWYgKCFtKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfY3R5cGVzIiwgX2N0eXBlc19tb2R1bGVfbWV0aG9kcywgbW9kdWxlX2RvY3MpOworICAgIGlmICghbSkKKyAgICAgICAgcmV0dXJuOwogCi0JX2N0eXBlc19wdHJ0eXBlX2NhY2hlID0gUHlEaWN0X05ldygpOwotCWlmIChfY3R5cGVzX3B0cnR5cGVfY2FjaGUgPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIF9jdHlwZXNfcHRydHlwZV9jYWNoZSA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoX2N0eXBlc19wdHJ0eXBlX2NhY2hlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX3BvaW50ZXJfdHlwZV9jYWNoZSIsIChQeU9iamVjdCAqKV9jdHlwZXNfcHRydHlwZV9jYWNoZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfcG9pbnRlcl90eXBlX2NhY2hlIiwgKFB5T2JqZWN0ICopX2N0eXBlc19wdHJ0eXBlX2NhY2hlKTsKIAotCV91bnBpY2tsZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobSwgIl91bnBpY2tsZSIpOwotCWlmIChfdW5waWNrbGUgPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIF91bnBpY2tsZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobSwgIl91bnBpY2tsZSIpOworICAgIGlmIChfdW5waWNrbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlDQXJnX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q0FyZ19UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5Q1RodW5rX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q1RodW5rX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogU3RnRGljdCBpcyBkZXJpdmVkIGZyb20gUHlEaWN0X1R5cGUgKi8KLQlQeUNTdGdEaWN0X1R5cGUudHBfYmFzZSA9ICZQeURpY3RfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUNTdGdEaWN0X1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIC8qIFN0Z0RpY3QgaXMgZGVyaXZlZCBmcm9tIFB5RGljdF9UeXBlICovCisgICAgUHlDU3RnRGljdF9UeXBlLnRwX2Jhc2UgPSAmUHlEaWN0X1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlDU3RnRGljdF9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICoKLQkgKiBNZXRhY2xhc3NlcwotCSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICoKKyAgICAgKiBNZXRhY2xhc3NlcworICAgICAqLwogCi0JUHlDU3RydWN0VHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlDU3RydWN0VHlwZV9UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBQeUNTdHJ1Y3RUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUNTdHJ1Y3RUeXBlX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JVW5pb25UeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZVbmlvblR5cGVfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgVW5pb25UeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZVbmlvblR5cGVfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlQeUNQb2ludGVyVHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlDUG9pbnRlclR5cGVfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgUHlDUG9pbnRlclR5cGVfVHlwZS50cF9iYXNlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q1BvaW50ZXJUeXBlX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlDQXJyYXlUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUNBcnJheVR5cGVfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgUHlDQXJyYXlUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUNBcnJheVR5cGVfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlQeUNTaW1wbGVUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUNTaW1wbGVUeXBlX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5Q1NpbXBsZVR5cGVfVHlwZS50cF9iYXNlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q1NpbXBsZVR5cGVfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlQeUNGdW5jUHRyVHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlDRnVuY1B0clR5cGVfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgUHlDRnVuY1B0clR5cGVfVHlwZS50cF9iYXNlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q0Z1bmNQdHJUeXBlX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKgotCSAqIENsYXNzZXMgdXNpbmcgYSBjdXN0b20gbWV0YWNsYXNzCi0JICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKgorICAgICAqIENsYXNzZXMgdXNpbmcgYSBjdXN0b20gbWV0YWNsYXNzCisgICAgICovCiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUNEYXRhX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q0RhdGFfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlQeV9UWVBFKCZTdHJ1Y3RfVHlwZSkgPSAmUHlDU3RydWN0VHlwZV9UeXBlOwotCVN0cnVjdF9UeXBlLnRwX2Jhc2UgPSAmUHlDRGF0YV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlN0cnVjdF9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlN0cnVjdHVyZSIsIChQeU9iamVjdCAqKSZTdHJ1Y3RfVHlwZSk7CisgICAgUHlfVFlQRSgmU3RydWN0X1R5cGUpID0gJlB5Q1N0cnVjdFR5cGVfVHlwZTsKKyAgICBTdHJ1Y3RfVHlwZS50cF9iYXNlID0gJlB5Q0RhdGFfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTdHJ1Y3RfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTdHJ1Y3R1cmUiLCAoUHlPYmplY3QgKikmU3RydWN0X1R5cGUpOwogCi0JUHlfVFlQRSgmVW5pb25fVHlwZSkgPSAmVW5pb25UeXBlX1R5cGU7Ci0JVW5pb25fVHlwZS50cF9iYXNlID0gJlB5Q0RhdGFfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZVbmlvbl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVuaW9uIiwgKFB5T2JqZWN0ICopJlVuaW9uX1R5cGUpOworICAgIFB5X1RZUEUoJlVuaW9uX1R5cGUpID0gJlVuaW9uVHlwZV9UeXBlOworICAgIFVuaW9uX1R5cGUudHBfYmFzZSA9ICZQeUNEYXRhX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVW5pb25fVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVbmlvbiIsIChQeU9iamVjdCAqKSZVbmlvbl9UeXBlKTsKIAotCVB5X1RZUEUoJlB5Q1BvaW50ZXJfVHlwZSkgPSAmUHlDUG9pbnRlclR5cGVfVHlwZTsKLQlQeUNQb2ludGVyX1R5cGUudHBfYmFzZSA9ICZQeUNEYXRhX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlDUG9pbnRlcl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9Qb2ludGVyIiwgKFB5T2JqZWN0ICopJlB5Q1BvaW50ZXJfVHlwZSk7CisgICAgUHlfVFlQRSgmUHlDUG9pbnRlcl9UeXBlKSA9ICZQeUNQb2ludGVyVHlwZV9UeXBlOworICAgIFB5Q1BvaW50ZXJfVHlwZS50cF9iYXNlID0gJlB5Q0RhdGFfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUNQb2ludGVyX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiX1BvaW50ZXIiLCAoUHlPYmplY3QgKikmUHlDUG9pbnRlcl9UeXBlKTsKIAotCVB5X1RZUEUoJlB5Q0FycmF5X1R5cGUpID0gJlB5Q0FycmF5VHlwZV9UeXBlOwotCVB5Q0FycmF5X1R5cGUudHBfYmFzZSA9ICZQeUNEYXRhX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlDQXJyYXlfVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBcnJheSIsIChQeU9iamVjdCAqKSZQeUNBcnJheV9UeXBlKTsKKyAgICBQeV9UWVBFKCZQeUNBcnJheV9UeXBlKSA9ICZQeUNBcnJheVR5cGVfVHlwZTsKKyAgICBQeUNBcnJheV9UeXBlLnRwX2Jhc2UgPSAmUHlDRGF0YV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q0FycmF5X1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQXJyYXkiLCAoUHlPYmplY3QgKikmUHlDQXJyYXlfVHlwZSk7CiAKLQlQeV9UWVBFKCZTaW1wbGVfVHlwZSkgPSAmUHlDU2ltcGxlVHlwZV9UeXBlOwotCVNpbXBsZV9UeXBlLnRwX2Jhc2UgPSAmUHlDRGF0YV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlNpbXBsZV9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9TaW1wbGVDRGF0YSIsIChQeU9iamVjdCAqKSZTaW1wbGVfVHlwZSk7CisgICAgUHlfVFlQRSgmU2ltcGxlX1R5cGUpID0gJlB5Q1NpbXBsZVR5cGVfVHlwZTsKKyAgICBTaW1wbGVfVHlwZS50cF9iYXNlID0gJlB5Q0RhdGFfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTaW1wbGVfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfU2ltcGxlQ0RhdGEiLCAoUHlPYmplY3QgKikmU2ltcGxlX1R5cGUpOwogCi0JUHlfVFlQRSgmUHlDRnVuY1B0cl9UeXBlKSA9ICZQeUNGdW5jUHRyVHlwZV9UeXBlOwotCVB5Q0Z1bmNQdHJfVHlwZS50cF9iYXNlID0gJlB5Q0RhdGFfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUNGdW5jUHRyX1R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0Z1bmNQdHIiLCAoUHlPYmplY3QgKikmUHlDRnVuY1B0cl9UeXBlKTsKKyAgICBQeV9UWVBFKCZQeUNGdW5jUHRyX1R5cGUpID0gJlB5Q0Z1bmNQdHJUeXBlX1R5cGU7CisgICAgUHlDRnVuY1B0cl9UeXBlLnRwX2Jhc2UgPSAmUHlDRGF0YV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q0Z1bmNQdHJfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRnVuY1B0ciIsIChQeU9iamVjdCAqKSZQeUNGdW5jUHRyX1R5cGUpOwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKgotCSAqIFNpbXBsZSBjbGFzc2VzCi0JICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKgorICAgICAqIFNpbXBsZSBjbGFzc2VzCisgICAgICovCiAKLQkvKiBQeUNGaWVsZF9UeXBlIGlzIGRlcml2ZWQgZnJvbSBQeUJhc2VPYmplY3RfVHlwZSAqLwotCWlmIChQeVR5cGVfUmVhZHkoJlB5Q0ZpZWxkX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIC8qIFB5Q0ZpZWxkX1R5cGUgaXMgZGVyaXZlZCBmcm9tIFB5QmFzZU9iamVjdF9UeXBlICovCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlDRmllbGRfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCi0JICogT3RoZXIgc3R1ZmYKLQkgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogT3RoZXIgc3R1ZmYKKyAgICAgKi8KIAotCURpY3RSZW1vdmVyX1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRGljdFJlbW92ZXJfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgRGljdFJlbW92ZXJfVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZEaWN0UmVtb3Zlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKGNyZWF0ZV9jb21lcnJvcigpIDwgMCkKLQkJcmV0dXJuOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ09NRXJyb3IiLCBDb21FcnJvcik7CisgICAgaWYgKGNyZWF0ZV9jb21lcnJvcigpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ09NRXJyb3IiLCBDb21FcnJvcik7CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX0hSRVNVTFQiLCBQeUludF9Gcm9tTG9uZyhGVU5DRkxBR19IUkVTVUxUKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGVU5DRkxBR19TVERDQUxMIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfU1REQ0FMTCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfSFJFU1VMVCIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX0hSRVNVTFQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX1NURENBTEwiLCBQeUludF9Gcm9tTG9uZyhGVU5DRkxBR19TVERDQUxMKSk7CiAjZW5kaWYKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX0NERUNMIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfQ0RFQ0wpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX1VTRV9FUlJOTyIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX1VTRV9FUlJOTykpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUiIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX1VTRV9MQVNURVJST1IpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX1BZVEhPTkFQSSIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX1BZVEhPTkFQSSkpOwotCVB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJfX3ZlcnNpb25fXyIsICIxLjEuMCIpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfQ0RFQ0wiLCBQeUludF9Gcm9tTG9uZyhGVU5DRkxBR19DREVDTCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfVVNFX0VSUk5PIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfVVNFX0VSUk5PKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGVU5DRkxBR19VU0VfTEFTVEVSUk9SIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfUFlUSE9OQVBJIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfUFlUSE9OQVBJKSk7CisgICAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fdmVyc2lvbl9fIiwgIjEuMS4wIik7CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9tZW1tb3ZlX2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIobWVtbW92ZSkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX21lbXNldF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKG1lbXNldCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX3N0cmluZ19hdF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKHN0cmluZ19hdCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX2Nhc3RfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihjYXN0KSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfbWVtbW92ZV9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKG1lbW1vdmUpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9tZW1zZXRfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihtZW1zZXQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9zdHJpbmdfYXRfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihzdHJpbmdfYXQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9jYXN0X2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIoY2FzdCkpOwogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfd3N0cmluZ19hdF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKHdzdHJpbmdfYXQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl93c3RyaW5nX2F0X2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIod3N0cmluZ19hdCkpOwogI2VuZGlmCiAKIC8qIElmIFJUTERfTE9DQUwgaXMgbm90IGRlZmluZWQgKFdpbmRvd3MhKSwgc2V0IGl0IHRvIHplcm8uICovCkBAIC01NjI1LDE0ICs1NjI1LDE0IEBACiAjZGVmaW5lIFJUTERfR0xPQkFMIFJUTERfTE9DQUwKICNlbmRpZgogCi0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSVExEX0xPQ0FMIiwgUHlJbnRfRnJvbUxvbmcoUlRMRF9MT0NBTCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUlRMRF9HTE9CQUwiLCBQeUludF9Gcm9tTG9uZyhSVExEX0dMT0JBTCkpOwotCQotCVB5RXhjX0FyZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjdHlwZXMuQXJndW1lbnRFcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChQeUV4Y19BcmdFcnJvcikgewotCQlQeV9JTkNSRUYoUHlFeGNfQXJnRXJyb3IpOwotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFyZ3VtZW50RXJyb3IiLCBQeUV4Y19BcmdFcnJvcik7Ci0JfQorICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUlRMRF9MT0NBTCIsIFB5SW50X0Zyb21Mb25nKFJUTERfTE9DQUwpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJUTERfR0xPQkFMIiwgUHlJbnRfRnJvbUxvbmcoUlRMRF9HTE9CQUwpKTsKKworICAgIFB5RXhjX0FyZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjdHlwZXMuQXJndW1lbnRFcnJvciIsIE5VTEwsIE5VTEwpOworICAgIGlmIChQeUV4Y19BcmdFcnJvcikgeworICAgICAgICBQeV9JTkNSRUYoUHlFeGNfQXJnRXJyb3IpOworICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFyZ3VtZW50RXJyb3IiLCBQeUV4Y19BcmdFcnJvcik7CisgICAgfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU2NDQsMzAgKzU2NDQsMzAgQEAKICNpZmRlZiBIQVZFX1dDSEFSX0gKIAogUHlPYmplY3QgKk15X1B5VW5pY29kZV9Gcm9tV2lkZUNoYXIocmVnaXN0ZXIgY29uc3Qgd2NoYXJfdCAqdywKLQkJCQkgICAgUHlfc3NpemVfdCBzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplKQogewogICAgIFB5VW5pY29kZU9iamVjdCAqdW5pY29kZTsKIAogICAgIGlmICh3ID09IE5VTEwpIHsKLQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICB1bmljb2RlID0gKFB5VW5pY29kZU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzaXplKTsKICAgICBpZiAoIXVuaWNvZGUpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogQ29weSB0aGUgd2NoYXJfdCBkYXRhIGludG8gdGhlIG5ldyBvYmplY3QgKi8KICNpZmRlZiBIQVZFX1VTQUJMRV9XQ0hBUl9UCiAgICAgbWVtY3B5KHVuaWNvZGUtPnN0ciwgdywgc2l6ZSAqIHNpemVvZih3Y2hhcl90KSk7CiAjZWxzZQogICAgIHsKLQlyZWdpc3RlciBQeV9VTklDT0RFICp1OwotCXJlZ2lzdGVyIGludCBpOwotCXUgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh1bmljb2RlKTsKLQkvKiBJbiBQeXRob24sIHRoZSBmb2xsb3dpbmcgbGluZSBoYXMgYSBvbmUtb2ZmIGVycm9yICovCi0JZm9yIChpID0gc2l6ZTsgaSA+IDA7IGktLSkKLQkgICAgKnUrKyA9ICp3Kys7CisgICAgcmVnaXN0ZXIgUHlfVU5JQ09ERSAqdTsKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICB1ID0gUHlVbmljb2RlX0FTX1VOSUNPREUodW5pY29kZSk7CisgICAgLyogSW4gUHl0aG9uLCB0aGUgZm9sbG93aW5nIGxpbmUgaGFzIGEgb25lLW9mZiBlcnJvciAqLworICAgIGZvciAoaSA9IHNpemU7IGkgPiAwOyBpLS0pCisgICAgICAgICp1KysgPSAqdysrOwogICAgIH0KICNlbmRpZgogCkBAIC01Njc1LDI1ICs1Njc1LDI1IEBACiB9CiAKIFB5X3NzaXplX3QgTXlfUHlVbmljb2RlX0FzV2lkZUNoYXIoUHlVbmljb2RlT2JqZWN0ICp1bmljb2RlLAotCQkJICAgIHJlZ2lzdGVyIHdjaGFyX3QgKncsCi0JCQkgICAgUHlfc3NpemVfdCBzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHdjaGFyX3QgKncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplKQogewogICAgIGlmICh1bmljb2RlID09IE5VTEwpIHsKLQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBpZiAoc2l6ZSA+IFB5VW5pY29kZV9HRVRfU0laRSh1bmljb2RlKSkKLQlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHVuaWNvZGUpOworICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodW5pY29kZSk7CiAjaWZkZWYgSEFWRV9VU0FCTEVfV0NIQVJfVAogICAgIG1lbWNweSh3LCB1bmljb2RlLT5zdHIsIHNpemUgKiBzaXplb2Yod2NoYXJfdCkpOwogI2Vsc2UKICAgICB7Ci0JcmVnaXN0ZXIgUHlfVU5JQ09ERSAqdTsKLQlyZWdpc3RlciBpbnQgaTsKLQl1ID0gUHlVbmljb2RlX0FTX1VOSUNPREUodW5pY29kZSk7Ci0JLyogSW4gUHl0aG9uLCB0aGUgZm9sbG93aW5nIGxpbmUgaGFzIGEgb25lLW9mZiBlcnJvciAqLwotCWZvciAoaSA9IHNpemU7IGkgPiAwOyBpLS0pCi0JICAgICp3KysgPSAqdSsrOworICAgIHJlZ2lzdGVyIFB5X1VOSUNPREUgKnU7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgdSA9IFB5VW5pY29kZV9BU19VTklDT0RFKHVuaWNvZGUpOworICAgIC8qIEluIFB5dGhvbiwgdGhlIGZvbGxvd2luZyBsaW5lIGhhcyBhIG9uZS1vZmYgZXJyb3IgKi8KKyAgICBmb3IgKGkgPSBzaXplOyBpID4gMDsgaS0tKQorICAgICAgICAqdysrID0gKnUrKzsKICAgICB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCmluZGV4IDNmMTMxODAuLjQ2NDA2YTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKQEAgLTI3LDE1MiArMjcsMTUyIEBACiAKIEVYUE9SVCh2b2lkKXRlc3RmdW5jX2FycmF5KGludCB2YWx1ZXNbNF0pCiB7Ci0JcHJpbnRmKCJ0ZXN0ZnVuY19hcnJheSAlZCAlZCAlZCAlZFxuIiwKLQkgICAgICAgdmFsdWVzWzBdLAotCSAgICAgICB2YWx1ZXNbMV0sCi0JICAgICAgIHZhbHVlc1syXSwKLQkgICAgICAgdmFsdWVzWzNdKTsKKyAgICBwcmludGYoInRlc3RmdW5jX2FycmF5ICVkICVkICVkICVkXG4iLAorICAgICAgICAgICB2YWx1ZXNbMF0sCisgICAgICAgICAgIHZhbHVlc1sxXSwKKyAgICAgICAgICAgdmFsdWVzWzJdLAorICAgICAgICAgICB2YWx1ZXNbM10pOwogfQogCiBFWFBPUlQobG9uZyBkb3VibGUpdGVzdGZ1bmNfRGRkKGRvdWJsZSBhLCBkb3VibGUgYikKIHsKLQlsb25nIGRvdWJsZSByZXN1bHQgPSAobG9uZyBkb3VibGUpKGEgKiBiKTsKLQlwcmludGYoInRlc3RmdW5jX0RkZCglcCwgJXApXG4iLCAmYSwgJmIpOwotCXByaW50ZigidGVzdGZ1bmNfRGRkKCVnLCAlZylcbiIsIGEsIGIpOwotCXJldHVybiByZXN1bHQ7CisgICAgbG9uZyBkb3VibGUgcmVzdWx0ID0gKGxvbmcgZG91YmxlKShhICogYik7CisgICAgcHJpbnRmKCJ0ZXN0ZnVuY19EZGQoJXAsICVwKVxuIiwgJmEsICZiKTsKKyAgICBwcmludGYoInRlc3RmdW5jX0RkZCglZywgJWcpXG4iLCBhLCBiKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBFWFBPUlQobG9uZyBkb3VibGUpdGVzdGZ1bmNfREREKGxvbmcgZG91YmxlIGEsIGxvbmcgZG91YmxlIGIpCiB7Ci0JbG9uZyBkb3VibGUgcmVzdWx0ID0gYSAqIGI7Ci0JcHJpbnRmKCJ0ZXN0ZnVuY19EREQoJXAsICVwKVxuIiwgJmEsICZiKTsKLQlwcmludGYoInRlc3RmdW5jX0RERCglTGcsICVMZylcbiIsIGEsIGIpOwotCXJldHVybiByZXN1bHQ7CisgICAgbG9uZyBkb3VibGUgcmVzdWx0ID0gYSAqIGI7CisgICAgcHJpbnRmKCJ0ZXN0ZnVuY19EREQoJXAsICVwKVxuIiwgJmEsICZiKTsKKyAgICBwcmludGYoInRlc3RmdW5jX0RERCglTGcsICVMZylcbiIsIGEsIGIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEVYUE9SVChpbnQpdGVzdGZ1bmNfaWlpKGludCBhLCBpbnQgYikKIHsKLQlpbnQgcmVzdWx0ID0gYSAqIGI7Ci0JcHJpbnRmKCJ0ZXN0ZnVuY19paWkoJXAsICVwKVxuIiwgJmEsICZiKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGludCByZXN1bHQgPSBhICogYjsKKyAgICBwcmludGYoInRlc3RmdW5jX2lpaSglcCwgJXApXG4iLCAmYSwgJmIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEVYUE9SVChpbnQpbXlwcmludGYoY2hhciAqZm10LCAuLi4pCiB7Ci0JaW50IHJlc3VsdDsKLQl2YV9saXN0IGFyZ3B0cjsKLQl2YV9zdGFydChhcmdwdHIsIGZtdCk7Ci0JcmVzdWx0ID0gdnByaW50ZihmbXQsIGFyZ3B0cik7Ci0JdmFfZW5kKGFyZ3B0cik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpbnQgcmVzdWx0OworICAgIHZhX2xpc3QgYXJncHRyOworICAgIHZhX3N0YXJ0KGFyZ3B0ciwgZm10KTsKKyAgICByZXN1bHQgPSB2cHJpbnRmKGZtdCwgYXJncHRyKTsKKyAgICB2YV9lbmQoYXJncHRyKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBFWFBPUlQoY2hhciAqKW15X3N0cnRvayhjaGFyICp0b2tlbiwgY29uc3QgY2hhciAqZGVsaW0pCiB7Ci0JcmV0dXJuIHN0cnRvayh0b2tlbiwgZGVsaW0pOworICAgIHJldHVybiBzdHJ0b2sodG9rZW4sIGRlbGltKTsKIH0KIAogRVhQT1JUKGNoYXIgKilteV9zdHJjaHIoY29uc3QgY2hhciAqcywgaW50IGMpCiB7Ci0JcmV0dXJuIHN0cmNocihzLCBjKTsKKyAgICByZXR1cm4gc3RyY2hyKHMsIGMpOwogfQogCiAKIEVYUE9SVChkb3VibGUpIG15X3NxcnQoZG91YmxlIGEpCiB7Ci0JcmV0dXJuIHNxcnQoYSk7CisgICAgcmV0dXJuIHNxcnQoYSk7CiB9CiAKIEVYUE9SVCh2b2lkKSBteV9xc29ydCh2b2lkICpiYXNlLCBzaXplX3QgbnVtLCBzaXplX3Qgd2lkdGgsIGludCgqY29tcGFyZSkoY29uc3Qgdm9pZCosIGNvbnN0IHZvaWQqKSkKIHsKLQlxc29ydChiYXNlLCBudW0sIHdpZHRoLCBjb21wYXJlKTsKKyAgICBxc29ydChiYXNlLCBudW0sIHdpZHRoLCBjb21wYXJlKTsKIH0KIAogRVhQT1JUKGludCAqKSBfdGVzdGZ1bmNfYWk4KGludCBhWzhdKQogewotCXJldHVybiBhOworICAgIHJldHVybiBhOwogfQogCiBFWFBPUlQodm9pZCkgX3Rlc3RmdW5jX3YoaW50IGEsIGludCBiLCBpbnQgKnByZXN1bHQpCiB7Ci0JKnByZXN1bHQgPSBhICsgYjsKKyAgICAqcHJlc3VsdCA9IGEgKyBiOwogfQogCiBFWFBPUlQoaW50KSBfdGVzdGZ1bmNfaV9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7Ci0vKglwcmludGYoIl90ZXN0ZnVuY19pX2JoaWxmZCBnb3QgJWQgJWQgJWQgJWxkICVmICVmXG4iLAotCSAgICAgICBiLCBoLCBpLCBsLCBmLCBkKTsKKy8qICAgICAgcHJpbnRmKCJfdGVzdGZ1bmNfaV9iaGlsZmQgZ290ICVkICVkICVkICVsZCAlZiAlZlxuIiwKKyAgICAgICAgICAgICAgIGIsIGgsIGksIGwsIGYsIGQpOwogKi8KLQlyZXR1cm4gKGludCkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKKyAgICByZXR1cm4gKGludCkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKIH0KIAogRVhQT1JUKGZsb2F0KSBfdGVzdGZ1bmNfZl9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7Ci0vKglwcmludGYoIl90ZXN0ZnVuY19mX2JoaWxmZCBnb3QgJWQgJWQgJWQgJWxkICVmICVmXG4iLAotCSAgICAgICBiLCBoLCBpLCBsLCBmLCBkKTsKKy8qICAgICAgcHJpbnRmKCJfdGVzdGZ1bmNfZl9iaGlsZmQgZ290ICVkICVkICVkICVsZCAlZiAlZlxuIiwKKyAgICAgICAgICAgICAgIGIsIGgsIGksIGwsIGYsIGQpOwogKi8KLQlyZXR1cm4gKGZsb2F0KShiICsgaCArIGkgKyBsICsgZiArIGQpOworICAgIHJldHVybiAoZmxvYXQpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CiB9CiAKIEVYUE9SVChkb3VibGUpIF90ZXN0ZnVuY19kX2JoaWxmZChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKIHsKLS8qCXByaW50ZigiX3Rlc3RmdW5jX2RfYmhpbGZkIGdvdCAlZCAlZCAlZCAlbGQgJWYgJWZcbiIsCi0JICAgICAgIGIsIGgsIGksIGwsIGYsIGQpOworLyogICAgICBwcmludGYoIl90ZXN0ZnVuY19kX2JoaWxmZCBnb3QgJWQgJWQgJWQgJWxkICVmICVmXG4iLAorICAgICAgICAgICAgICAgYiwgaCwgaSwgbCwgZiwgZCk7CiAqLwotCXJldHVybiAoZG91YmxlKShiICsgaCArIGkgKyBsICsgZiArIGQpOworICAgIHJldHVybiAoZG91YmxlKShiICsgaCArIGkgKyBsICsgZiArIGQpOwogfQogCiBFWFBPUlQobG9uZyBkb3VibGUpIF90ZXN0ZnVuY19EX2JoaWxmRChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBsb25nIGRvdWJsZSBkKQogewotLyoJcHJpbnRmKCJfdGVzdGZ1bmNfZF9iaGlsZmQgZ290ICVkICVkICVkICVsZCAlZiAlZlxuIiwKLQkgICAgICAgYiwgaCwgaSwgbCwgZiwgZCk7CisvKiAgICAgIHByaW50ZigiX3Rlc3RmdW5jX2RfYmhpbGZkIGdvdCAlZCAlZCAlZCAlbGQgJWYgJWZcbiIsCisgICAgICAgICAgICAgICBiLCBoLCBpLCBsLCBmLCBkKTsKICovCi0JcmV0dXJuIChsb25nIGRvdWJsZSkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKKyAgICByZXR1cm4gKGxvbmcgZG91YmxlKShiICsgaCArIGkgKyBsICsgZiArIGQpOwogfQogCiBFWFBPUlQoY2hhciAqKSBfdGVzdGZ1bmNfcF9wKHZvaWQgKnMpCiB7Ci0JcmV0dXJuIChjaGFyICopczsKKyAgICByZXR1cm4gKGNoYXIgKilzOwogfQogCiBFWFBPUlQodm9pZCAqKSBfdGVzdGZ1bmNfY19wX3AoaW50ICphcmdjcCwgY2hhciAqKmFyZ3YpCiB7Ci0JcmV0dXJuIGFyZ3ZbKCphcmdjcCktMV07CisgICAgcmV0dXJuIGFyZ3ZbKCphcmdjcCktMV07CiB9CiAKIEVYUE9SVCh2b2lkICopIGdldF9zdHJjaHIodm9pZCkKIHsKLQlyZXR1cm4gKHZvaWQgKilzdHJjaHI7CisgICAgcmV0dXJuICh2b2lkICopc3RyY2hyOwogfQogCiBFWFBPUlQoY2hhciAqKSBteV9zdHJkdXAoY2hhciAqc3JjKQogewotCWNoYXIgKmRzdCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihzcmMpKzEpOwotCWlmICghZHN0KQotCQlyZXR1cm4gTlVMTDsKLQlzdHJjcHkoZHN0LCBzcmMpOwotCXJldHVybiBkc3Q7CisgICAgY2hhciAqZHN0ID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHNyYykrMSk7CisgICAgaWYgKCFkc3QpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0cmNweShkc3QsIHNyYyk7CisgICAgcmV0dXJuIGRzdDsKIH0KIAogRVhQT1JUKHZvaWQpbXlfZnJlZSh2b2lkICpwdHIpCiB7Ci0JZnJlZShwdHIpOworICAgIGZyZWUocHRyKTsKIH0KIAogI2lmZGVmIEhBVkVfV0NIQVJfSAogRVhQT1JUKHdjaGFyX3QgKikgbXlfd2NzZHVwKHdjaGFyX3QgKnNyYykKIHsKLQlzaXplX3QgbGVuID0gd2NzbGVuKHNyYyk7Ci0Jd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKiltYWxsb2MoKGxlbiArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKLQlpZiAocHRyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1lbWNweShwdHIsIHNyYywgKGxlbisxKSAqIHNpemVvZih3Y2hhcl90KSk7Ci0JcmV0dXJuIHB0cjsKKyAgICBzaXplX3QgbGVuID0gd2NzbGVuKHNyYyk7CisgICAgd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKiltYWxsb2MoKGxlbiArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICBpZiAocHRyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweShwdHIsIHNyYywgKGxlbisxKSAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgcmV0dXJuIHB0cjsKIH0KIAogRVhQT1JUKHNpemVfdCkgbXlfd2NzbGVuKHdjaGFyX3QgKnNyYykKIHsKLQlyZXR1cm4gd2NzbGVuKHNyYyk7CisgICAgcmV0dXJuIHdjc2xlbihzcmMpOwogfQogI2VuZGlmCiAKQEAgLTE4MywxNTggKzE4MywxNTggQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JaW50ICgqYykoaW50LCBpbnQpOwotCWludCAoX19zdGRjYWxsICpzKShpbnQsIGludCk7CisgICAgaW50ICgqYykoaW50LCBpbnQpOworICAgIGludCAoX19zdGRjYWxsICpzKShpbnQsIGludCk7CiB9IEZVTkNTOwogCiBFWFBPUlQoaW50KSBfdGVzdGZ1bmNfY2FsbGZ1bmNwKEZVTkNTICpmcCkKIHsKLQlmcC0+YygxLCAyKTsKLQlmcC0+cygzLCA0KTsKLQlyZXR1cm4gMDsKKyAgICBmcC0+YygxLCAyKTsKKyAgICBmcC0+cygzLCA0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogRVhQT1JUKGludCkgX3Rlc3RmdW5jX2RlcmVmX3BvaW50ZXIoaW50ICpwaSkKIHsKLQlyZXR1cm4gKnBpOworICAgIHJldHVybiAqcGk7CiB9CiAKICNpZmRlZiBNU19XSU4zMgogRVhQT1JUKGludCkgX3Rlc3RmdW5jX3BpdW5rKElVbmtub3duIEZBUiAqcGl1bmspCiB7Ci0JcGl1bmstPmxwVnRibC0+QWRkUmVmKHBpdW5rKTsKLQlyZXR1cm4gcGl1bmstPmxwVnRibC0+UmVsZWFzZShwaXVuayk7CisgICAgcGl1bmstPmxwVnRibC0+QWRkUmVmKHBpdW5rKTsKKyAgICByZXR1cm4gcGl1bmstPmxwVnRibC0+UmVsZWFzZShwaXVuayk7CiB9CiAjZW5kaWYKIAogRVhQT1JUKGludCkgX3Rlc3RmdW5jX2NhbGxiYWNrX3dpdGhfcG9pbnRlcihpbnQgKCpmdW5jKShpbnQgKikpCiB7Ci0JaW50IHRhYmxlW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9OworICAgIGludCB0YWJsZVtdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKIAotCXJldHVybiAoKmZ1bmMpKHRhYmxlKTsKKyAgICByZXR1cm4gKCpmdW5jKSh0YWJsZSk7CiB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogRVhQT1JUKFBZX0xPTkdfTE9ORykgX3Rlc3RmdW5jX3FfYmhpbGZkcShzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLAotCQkJCSAgICAgZG91YmxlIGQsIFBZX0xPTkdfTE9ORyBxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLCBQWV9MT05HX0xPTkcgcSkKIHsKLQlyZXR1cm4gKFBZX0xPTkdfTE9ORykoYiArIGggKyBpICsgbCArIGYgKyBkICsgcSk7CisgICAgcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCArIHEpOwogfQogCiBFWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfcV9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7Ci0JcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CisgICAgcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CiB9CiAKIEVYUE9SVChpbnQpIF90ZXN0ZnVuY19jYWxsYmFja19pX2lmKGludCB2YWx1ZSwgaW50ICgqZnVuYykoaW50KSkKIHsKLQlpbnQgc3VtID0gMDsKLQl3aGlsZSAodmFsdWUgIT0gMCkgewotCQlzdW0gKz0gZnVuYyh2YWx1ZSk7Ci0JCXZhbHVlIC89IDI7Ci0JfQotCXJldHVybiBzdW07CisgICAgaW50IHN1bSA9IDA7CisgICAgd2hpbGUgKHZhbHVlICE9IDApIHsKKyAgICAgICAgc3VtICs9IGZ1bmModmFsdWUpOworICAgICAgICB2YWx1ZSAvPSAyOworICAgIH0KKyAgICByZXR1cm4gc3VtOwogfQogCiBFWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfY2FsbGJhY2tfcV9xZihQWV9MT05HX0xPTkcgdmFsdWUsCi0JCQkJCSAgICAgUFlfTE9OR19MT05HICgqZnVuYykoUFlfTE9OR19MT05HKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZX0xPTkdfTE9ORyAoKmZ1bmMpKFBZX0xPTkdfTE9ORykpCiB7Ci0JUFlfTE9OR19MT05HIHN1bSA9IDA7CisgICAgUFlfTE9OR19MT05HIHN1bSA9IDA7CiAKLQl3aGlsZSAodmFsdWUgIT0gMCkgewotCQlzdW0gKz0gZnVuYyh2YWx1ZSk7Ci0JCXZhbHVlIC89IDI7Ci0JfQotCXJldHVybiBzdW07CisgICAgd2hpbGUgKHZhbHVlICE9IDApIHsKKyAgICAgICAgc3VtICs9IGZ1bmModmFsdWUpOworICAgICAgICB2YWx1ZSAvPSAyOworICAgIH0KKyAgICByZXR1cm4gc3VtOwogfQogCiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqdmFsdWU7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICp2YWx1ZTsKIH0gU1BBTTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JaW50IG51bV9zcGFtczsKLQlTUEFNICpzcGFtczsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBudW1fc3BhbXM7CisgICAgU1BBTSAqc3BhbXM7CiB9IEVHRzsKIAogU1BBTSBteV9zcGFtc1syXSA9IHsKLQl7ICJuYW1lMSIsICJ2YWx1ZTEiIH0sCi0JeyAibmFtZTIiLCAidmFsdWUyIiB9LAorICAgIHsgIm5hbWUxIiwgInZhbHVlMSIgfSwKKyAgICB7ICJuYW1lMiIsICJ2YWx1ZTIiIH0sCiB9OwogCiBFR0cgbXlfZWdnc1sxXSA9IHsKLQl7ICJmaXJzdCBlZ2ciLCAxLCBteV9zcGFtcyB9CisgICAgeyAiZmlyc3QgZWdnIiwgMSwgbXlfc3BhbXMgfQogfTsKIAogRVhQT1JUKGludCkgZ2V0U1BBTUFOREVHR1MoRUdHICoqZWdncykKIHsKLQkqZWdncyA9IG15X2VnZ3M7Ci0JcmV0dXJuIDE7CisgICAgKmVnZ3MgPSBteV9lZ2dzOworICAgIHJldHVybiAxOwogfQogCiB0eXBlZGVmIHN0cnVjdCB0YWdwb2ludCB7Ci0JaW50IHg7Ci0JaW50IHk7CisgICAgaW50IHg7CisgICAgaW50IHk7CiB9IHBvaW50OwogCiBFWFBPUlQoaW50KSBfdGVzdGZ1bmNfYnl2YWwocG9pbnQgaW4sIHBvaW50ICpwb3V0KQogewotCWlmIChwb3V0KSB7Ci0JCXBvdXQtPnggPSBpbi54OwotCQlwb3V0LT55ID0gaW4ueTsKLQl9Ci0JcmV0dXJuIGluLnggKyBpbi55OworICAgIGlmIChwb3V0KSB7CisgICAgICAgIHBvdXQtPnggPSBpbi54OworICAgICAgICBwb3V0LT55ID0gaW4ueTsKKyAgICB9CisgICAgcmV0dXJuIGluLnggKyBpbi55OwogfQogCiBFWFBPUlQgKGludCkgYW5faW50ZWdlciA9IDQyOwogCiBFWFBPUlQoaW50KSBnZXRfYW5faW50ZWdlcih2b2lkKQogewotCXJldHVybiBhbl9pbnRlZ2VyOworICAgIHJldHVybiBhbl9pbnRlZ2VyOwogfQogCiBFWFBPUlQoZG91YmxlKQogaW50ZWdyYXRlKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICgqZikoZG91YmxlKSwgbG9uZyBuc3RlcCkKIHsKLQlkb3VibGUgeCwgc3VtPTAuMCwgZHg9KGItYSkvKGRvdWJsZSluc3RlcDsKLQlmb3IoeD1hKzAuNSpkeDsgKGIteCkqKHgtYSk+MC4wOyB4Kz1keCkKLQkJc3VtICs9IGYoeCk7Ci0JcmV0dXJuIHN1bS8oZG91YmxlKW5zdGVwOworICAgIGRvdWJsZSB4LCBzdW09MC4wLCBkeD0oYi1hKS8oZG91YmxlKW5zdGVwOworICAgIGZvcih4PWErMC41KmR4OyAoYi14KSooeC1hKT4wLjA7IHgrPWR4KQorICAgICAgICBzdW0gKz0gZih4KTsKKyAgICByZXR1cm4gc3VtLyhkb3VibGUpbnN0ZXA7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQl2b2lkICgqaW5pdGlhbGl6ZSkodm9pZCAqKCopKGludCksIHZvaWQoKikodm9pZCAqKSk7CisgICAgdm9pZCAoKmluaXRpYWxpemUpKHZvaWQgKigqKShpbnQpLCB2b2lkKCopKHZvaWQgKikpOwogfSB4eHhfbGlicmFyeTsKIAogc3RhdGljIHZvaWQgX3h4eF9pbml0KHZvaWQgKigqWGFsbG9jKShpbnQpLCB2b2lkICgqWGZyZWUpKHZvaWQgKikpCiB7Ci0Jdm9pZCAqcHRyOwotCQotCXByaW50ZigiX3h4eF9pbml0IGdvdCAlcCAlcFxuIiwgWGFsbG9jLCBYZnJlZSk7Ci0JcHJpbnRmKCJjYWxsaW5nXG4iKTsKLQlwdHIgPSBYYWxsb2MoMzIpOwotCVhmcmVlKHB0cik7Ci0JcHJpbnRmKCJjYWxscyBkb25lLCBwdHIgd2FzICVwXG4iLCBwdHIpOworICAgIHZvaWQgKnB0cjsKKworICAgIHByaW50ZigiX3h4eF9pbml0IGdvdCAlcCAlcFxuIiwgWGFsbG9jLCBYZnJlZSk7CisgICAgcHJpbnRmKCJjYWxsaW5nXG4iKTsKKyAgICBwdHIgPSBYYWxsb2MoMzIpOworICAgIFhmcmVlKHB0cik7CisgICAgcHJpbnRmKCJjYWxscyBkb25lLCBwdHIgd2FzICVwXG4iLCBwdHIpOwogfQogCiB4eHhfbGlicmFyeSBfeHh4X2xpYiA9IHsKLQlfeHh4X2luaXQKKyAgICBfeHh4X2luaXQKIH07CiAKIEVYUE9SVCh4eHhfbGlicmFyeSkgKmxpYnJhcnlfZ2V0KHZvaWQpCiB7Ci0JcmV0dXJuICZfeHh4X2xpYjsKKyAgICByZXR1cm4gJl94eHhfbGliOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKIC8qIFNlZSBEb24gQm94IChnZXJtYW4pLCBwcCA3OWZmLiAqLwogRVhQT1JUKHZvaWQpIEdldFN0cmluZyhCU1RSICpwYnN0cikKIHsKLQkqcGJzdHIgPSBTeXNBbGxvY1N0cmluZyhMIkdvb2RieWUhIik7CisgICAgKnBic3RyID0gU3lzQWxsb2NTdHJpbmcoTCJHb29kYnllISIpOwogfQogI2VuZGlmCiAKQEAgLTM0MywxMiArMzQzLDEyIEBACiAgKi8KIFB5T2JqZWN0ICpweV9mdW5jX3NpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWludCBpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2kiLCAmbmFtZSwgJmkpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgaTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpIiwgJm5hbWUsICZpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBFWFBPUlQodm9pZCkgX3B5X2Z1bmNfc2koY2hhciAqcywgaW50IGkpCkBAIC0zNTcsOCArMzU3LDggQEAKIAogUHlPYmplY3QgKnB5X2Z1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIEVYUE9SVCh2b2lkKSBfcHlfZnVuYyh2b2lkKQpAQCAtMzY5LDY0ICszNjksNjQgQEAKIEVYUE9SVCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIGxhc3RfdGZfYXJnX3U7CiAKIHN0cnVjdCBCSVRTIHsKLQlpbnQgQTogMSwgQjoyLCBDOjMsIEQ6NCwgRTogNSwgRjogNiwgRzogNywgSDogOCwgSTogOTsKLQlzaG9ydCBNOiAxLCBOOiAyLCBPOiAzLCBQOiA0LCBROiA1LCBSOiA2LCBTOiA3OworICAgIGludCBBOiAxLCBCOjIsIEM6MywgRDo0LCBFOiA1LCBGOiA2LCBHOiA3LCBIOiA4LCBJOiA5OworICAgIHNob3J0IE06IDEsIE46IDIsIE86IDMsIFA6IDQsIFE6IDUsIFI6IDYsIFM6IDc7CiB9OwogCiBETF9FWFBPUlQodm9pZCkgc2V0X2JpdGZpZWxkcyhzdHJ1Y3QgQklUUyAqYml0cywgY2hhciBuYW1lLCBpbnQgdmFsdWUpCiB7Ci0Jc3dpdGNoIChuYW1lKSB7Ci0JY2FzZSAnQSc6IGJpdHMtPkEgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnQic6IGJpdHMtPkIgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnQyc6IGJpdHMtPkMgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRCc6IGJpdHMtPkQgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRSc6IGJpdHMtPkUgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRic6IGJpdHMtPkYgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRyc6IGJpdHMtPkcgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnSCc6IGJpdHMtPkggPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnSSc6IGJpdHMtPkkgPSB2YWx1ZTsgYnJlYWs7CisgICAgc3dpdGNoIChuYW1lKSB7CisgICAgY2FzZSAnQSc6IGJpdHMtPkEgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnQic6IGJpdHMtPkIgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnQyc6IGJpdHMtPkMgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRCc6IGJpdHMtPkQgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRSc6IGJpdHMtPkUgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRic6IGJpdHMtPkYgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRyc6IGJpdHMtPkcgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnSCc6IGJpdHMtPkggPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnSSc6IGJpdHMtPkkgPSB2YWx1ZTsgYnJlYWs7CiAKLQljYXNlICdNJzogYml0cy0+TSA9IHZhbHVlOyBicmVhazsKLQljYXNlICdOJzogYml0cy0+TiA9IHZhbHVlOyBicmVhazsKLQljYXNlICdPJzogYml0cy0+TyA9IHZhbHVlOyBicmVhazsKLQljYXNlICdQJzogYml0cy0+UCA9IHZhbHVlOyBicmVhazsKLQljYXNlICdRJzogYml0cy0+USA9IHZhbHVlOyBicmVhazsKLQljYXNlICdSJzogYml0cy0+UiA9IHZhbHVlOyBicmVhazsKLQljYXNlICdTJzogYml0cy0+UyA9IHZhbHVlOyBicmVhazsKLQl9CisgICAgY2FzZSAnTSc6IGJpdHMtPk0gPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnTic6IGJpdHMtPk4gPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnTyc6IGJpdHMtPk8gPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUCc6IGJpdHMtPlAgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUSc6IGJpdHMtPlEgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUic6IGJpdHMtPlIgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUyc6IGJpdHMtPlMgPSB2YWx1ZTsgYnJlYWs7CisgICAgfQogfQogCiBETF9FWFBPUlQoaW50KSB1bnBhY2tfYml0ZmllbGRzKHN0cnVjdCBCSVRTICpiaXRzLCBjaGFyIG5hbWUpCiB7Ci0Jc3dpdGNoIChuYW1lKSB7Ci0JY2FzZSAnQSc6IHJldHVybiBiaXRzLT5BOwotCWNhc2UgJ0InOiByZXR1cm4gYml0cy0+QjsKLQljYXNlICdDJzogcmV0dXJuIGJpdHMtPkM7Ci0JY2FzZSAnRCc6IHJldHVybiBiaXRzLT5EOwotCWNhc2UgJ0UnOiByZXR1cm4gYml0cy0+RTsKLQljYXNlICdGJzogcmV0dXJuIGJpdHMtPkY7Ci0JY2FzZSAnRyc6IHJldHVybiBiaXRzLT5HOwotCWNhc2UgJ0gnOiByZXR1cm4gYml0cy0+SDsKLQljYXNlICdJJzogcmV0dXJuIGJpdHMtPkk7CisgICAgc3dpdGNoIChuYW1lKSB7CisgICAgY2FzZSAnQSc6IHJldHVybiBiaXRzLT5BOworICAgIGNhc2UgJ0InOiByZXR1cm4gYml0cy0+QjsKKyAgICBjYXNlICdDJzogcmV0dXJuIGJpdHMtPkM7CisgICAgY2FzZSAnRCc6IHJldHVybiBiaXRzLT5EOworICAgIGNhc2UgJ0UnOiByZXR1cm4gYml0cy0+RTsKKyAgICBjYXNlICdGJzogcmV0dXJuIGJpdHMtPkY7CisgICAgY2FzZSAnRyc6IHJldHVybiBiaXRzLT5HOworICAgIGNhc2UgJ0gnOiByZXR1cm4gYml0cy0+SDsKKyAgICBjYXNlICdJJzogcmV0dXJuIGJpdHMtPkk7CiAKLQljYXNlICdNJzogcmV0dXJuIGJpdHMtPk07Ci0JY2FzZSAnTic6IHJldHVybiBiaXRzLT5OOwotCWNhc2UgJ08nOiByZXR1cm4gYml0cy0+TzsKLQljYXNlICdQJzogcmV0dXJuIGJpdHMtPlA7Ci0JY2FzZSAnUSc6IHJldHVybiBiaXRzLT5ROwotCWNhc2UgJ1InOiByZXR1cm4gYml0cy0+UjsKLQljYXNlICdTJzogcmV0dXJuIGJpdHMtPlM7Ci0JfQotCXJldHVybiAwOworICAgIGNhc2UgJ00nOiByZXR1cm4gYml0cy0+TTsKKyAgICBjYXNlICdOJzogcmV0dXJuIGJpdHMtPk47CisgICAgY2FzZSAnTyc6IHJldHVybiBiaXRzLT5POworICAgIGNhc2UgJ1AnOiByZXR1cm4gYml0cy0+UDsKKyAgICBjYXNlICdRJzogcmV0dXJuIGJpdHMtPlE7CisgICAgY2FzZSAnUic6IHJldHVybiBiaXRzLT5SOworICAgIGNhc2UgJ1MnOiByZXR1cm4gYml0cy0+UzsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewotLyoJeyJnZXRfbGFzdF90Zl9hcmdfcyIsIGdldF9sYXN0X3RmX2FyZ19zLCBNRVRIX05PQVJHU30sCi0JeyJnZXRfbGFzdF90Zl9hcmdfdSIsIGdldF9sYXN0X3RmX2FyZ191LCBNRVRIX05PQVJHU30sCisvKiAgICAgIHsiZ2V0X2xhc3RfdGZfYXJnX3MiLCBnZXRfbGFzdF90Zl9hcmdfcywgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0X2xhc3RfdGZfYXJnX3UiLCBnZXRfbGFzdF90Zl9hcmdfdSwgTUVUSF9OT0FSR1N9LAogKi8KLQl7ImZ1bmNfc2kiLCBweV9mdW5jX3NpLCBNRVRIX1ZBUkFSR1N9LAotCXsiZnVuYyIsIHB5X2Z1bmMsIE1FVEhfTk9BUkdTfSwKLQl7IE5VTEwsIE5VTEwsIDAsIE5VTEx9LAorICAgIHsiZnVuY19zaSIsIHB5X2Z1bmNfc2ksIE1FVEhfVkFSQVJHU30sCisgICAgeyJmdW5jIiwgcHlfZnVuYywgTUVUSF9OT0FSR1N9LAorICAgIHsgTlVMTCwgTlVMTCwgMCwgTlVMTH0sCiB9OwogCiAjZGVmaW5lIFMgbGFzdF90Zl9hcmdfcyA9IChQWV9MT05HX0xPTkcpYwpAQCAtNDk2LDgwICs0OTYsODAgQEAKICNlbmRpZgogCiAvKioqKioqKiovCi0gCisKICNpZm5kZWYgTVNfV0lOMzIKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWxvbmcgeDsKLQlsb25nIHk7CisgICAgbG9uZyB4OworICAgIGxvbmcgeTsKIH0gUE9JTlQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlsb25nIGxlZnQ7Ci0JbG9uZyB0b3A7Ci0JbG9uZyByaWdodDsKLQlsb25nIGJvdHRvbTsKKyAgICBsb25nIGxlZnQ7CisgICAgbG9uZyB0b3A7CisgICAgbG9uZyByaWdodDsKKyAgICBsb25nIGJvdHRvbTsKIH0gUkVDVDsKIAogI2VuZGlmCiAKIEVYUE9SVChpbnQpIFBvaW50SW5SZWN0KFJFQ1QgKnByYywgUE9JTlQgcHQpCiB7Ci0JaWYgKHB0LnggPCBwcmMtPmxlZnQpCi0JCXJldHVybiAwOwotCWlmIChwdC54ID4gcHJjLT5yaWdodCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHB0LnkgPCBwcmMtPnRvcCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHB0LnkgPiBwcmMtPmJvdHRvbSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHB0LnggPCBwcmMtPmxlZnQpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwdC54ID4gcHJjLT5yaWdodCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHB0LnkgPCBwcmMtPnRvcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHB0LnkgPiBwcmMtPmJvdHRvbSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlzaG9ydCB4OwotCXNob3J0IHk7CisgICAgc2hvcnQgeDsKKyAgICBzaG9ydCB5OwogfSBTMkg7CiAKIEVYUE9SVChTMkgpIHJldF8yaF9mdW5jKFMySCBpbnApCiB7Ci0JaW5wLnggKj0gMjsKLQlpbnAueSAqPSAzOwotCXJldHVybiBpbnA7CisgICAgaW5wLnggKj0gMjsKKyAgICBpbnAueSAqPSAzOworICAgIHJldHVybiBpbnA7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlpbnQgYSwgYiwgYywgZCwgZSwgZiwgZywgaDsKKyAgICBpbnQgYSwgYiwgYywgZCwgZSwgZiwgZywgaDsKIH0gUzhJOwogCiBFWFBPUlQoUzhJKSByZXRfOGlfZnVuYyhTOEkgaW5wKQogewotCWlucC5hICo9IDI7Ci0JaW5wLmIgKj0gMzsKLQlpbnAuYyAqPSA0OwotCWlucC5kICo9IDU7Ci0JaW5wLmUgKj0gNjsKLQlpbnAuZiAqPSA3OwotCWlucC5nICo9IDg7Ci0JaW5wLmggKj0gOTsKLQlyZXR1cm4gaW5wOworICAgIGlucC5hICo9IDI7CisgICAgaW5wLmIgKj0gMzsKKyAgICBpbnAuYyAqPSA0OworICAgIGlucC5kICo9IDU7CisgICAgaW5wLmUgKj0gNjsKKyAgICBpbnAuZiAqPSA3OworICAgIGlucC5nICo9IDg7CisgICAgaW5wLmggKj0gOTsKKyAgICByZXR1cm4gaW5wOwogfQogCiBFWFBPUlQoaW50KSBHZXRSZWN0YW5nbGUoaW50IGZsYWcsIFJFQ1QgKnByZWN0KQogewotCWlmIChmbGFnID09IDApCi0JCXJldHVybiAwOwotCXByZWN0LT5sZWZ0ID0gKGludClmbGFnOwotCXByZWN0LT50b3AgPSAoaW50KWZsYWcgKyAxOwotCXByZWN0LT5yaWdodCA9IChpbnQpZmxhZyArIDI7Ci0JcHJlY3QtPmJvdHRvbSA9IChpbnQpZmxhZyArIDM7Ci0JcmV0dXJuIDE7CisgICAgaWYgKGZsYWcgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcHJlY3QtPmxlZnQgPSAoaW50KWZsYWc7CisgICAgcHJlY3QtPnRvcCA9IChpbnQpZmxhZyArIDE7CisgICAgcHJlY3QtPnJpZ2h0ID0gKGludClmbGFnICsgMjsKKyAgICBwcmVjdC0+Ym90dG9tID0gKGludClmbGFnICsgMzsKKyAgICByZXR1cm4gMTsKIH0KIAogRVhQT1JUKHZvaWQpIFR3b091dEFyZ3MoaW50IGEsIGludCAqcGksIGludCBiLCBpbnQgKnBqKQogewotCSpwaSArPSBhOwotCSpwaiArPSBiOworICAgICpwaSArPSBhOworICAgICpwaiArPSBiOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKQEAgLTU4NCwxMyArNTg0LDEzIEBACiAKIEVYUE9SVCAoSFJFU1VMVCkgS2VlcE9iamVjdChJVW5rbm93biAqcHVuaykKIHsKLQlzdGF0aWMgSVVua25vd24gKnBvYmo7Ci0JaWYgKHB1bmspCi0JCXB1bmstPmxwVnRibC0+QWRkUmVmKHB1bmspOwotCWlmIChwb2JqKQotCQlwb2JqLT5scFZ0YmwtPlJlbGVhc2UocG9iaik7Ci0JcG9iaiA9IHB1bms7Ci0JcmV0dXJuIFNfT0s7CisgICAgc3RhdGljIElVbmtub3duICpwb2JqOworICAgIGlmIChwdW5rKQorICAgICAgICBwdW5rLT5scFZ0YmwtPkFkZFJlZihwdW5rKTsKKyAgICBpZiAocG9iaikKKyAgICAgICAgcG9iai0+bHBWdGJsLT5SZWxlYXNlKHBvYmopOworICAgIHBvYmogPSBwdW5rOworICAgIHJldHVybiBTX09LOwogfQogCiAjZW5kaWYKQEAgLTU5OCw1ICs1OTgsNSBAQAogRExfRVhQT1JUKHZvaWQpCiBpbml0X2N0eXBlc190ZXN0KHZvaWQpCiB7Ci0JUHlfSW5pdE1vZHVsZSgiX2N0eXBlc190ZXN0IiwgbW9kdWxlX21ldGhvZHMpOworICAgIFB5X0luaXRNb2R1bGUoIl9jdHlwZXNfdGVzdCIsIG1vZHVsZV9tZXRob2RzKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwppbmRleCBhZmRkOTQ3Li44ZmJlNmRlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCkBAIC0xNyw2NSArMTcsNjUgQEAKIHN0YXRpYyB2b2lkCiBDVGh1bmtPYmplY3RfZGVhbGxvYyhQeU9iamVjdCAqX3NlbGYpCiB7Ci0JQ1RodW5rT2JqZWN0ICpzZWxmID0gKENUaHVua09iamVjdCAqKV9zZWxmOwotCVB5X1hERUNSRUYoc2VsZi0+Y29udmVydGVycyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5jYWxsYWJsZSk7Ci0JUHlfWERFQ1JFRihzZWxmLT5yZXN0eXBlKTsKLQlpZiAoc2VsZi0+cGNsKQotCQlfY3R5cGVzX2ZyZWVfY2xvc3VyZShzZWxmLT5wY2wpOwotCVB5T2JqZWN0X0dDX0RlbChzZWxmKTsKKyAgICBDVGh1bmtPYmplY3QgKnNlbGYgPSAoQ1RodW5rT2JqZWN0ICopX3NlbGY7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmNhbGxhYmxlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJlc3R5cGUpOworICAgIGlmIChzZWxmLT5wY2wpCisgICAgICAgIF9jdHlwZXNfZnJlZV9jbG9zdXJlKHNlbGYtPnBjbCk7CisgICAgUHlPYmplY3RfR0NfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBDVGh1bmtPYmplY3RfdHJhdmVyc2UoUHlPYmplY3QgKl9zZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlDVGh1bmtPYmplY3QgKnNlbGYgPSAoQ1RodW5rT2JqZWN0ICopX3NlbGY7Ci0JUHlfVklTSVQoc2VsZi0+Y29udmVydGVycyk7Ci0JUHlfVklTSVQoc2VsZi0+Y2FsbGFibGUpOwotCVB5X1ZJU0lUKHNlbGYtPnJlc3R5cGUpOwotCXJldHVybiAwOworICAgIENUaHVua09iamVjdCAqc2VsZiA9IChDVGh1bmtPYmplY3QgKilfc2VsZjsKKyAgICBQeV9WSVNJVChzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5jYWxsYWJsZSk7CisgICAgUHlfVklTSVQoc2VsZi0+cmVzdHlwZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIENUaHVua09iamVjdF9jbGVhcihQeU9iamVjdCAqX3NlbGYpCiB7Ci0JQ1RodW5rT2JqZWN0ICpzZWxmID0gKENUaHVua09iamVjdCAqKV9zZWxmOwotCVB5X0NMRUFSKHNlbGYtPmNvbnZlcnRlcnMpOwotCVB5X0NMRUFSKHNlbGYtPmNhbGxhYmxlKTsKLQlQeV9DTEVBUihzZWxmLT5yZXN0eXBlKTsKLQlyZXR1cm4gMDsKKyAgICBDVGh1bmtPYmplY3QgKnNlbGYgPSAoQ1RodW5rT2JqZWN0ICopX3NlbGY7CisgICAgUHlfQ0xFQVIoc2VsZi0+Y29udmVydGVycyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+Y2FsbGFibGUpOworICAgIFB5X0NMRUFSKHNlbGYtPnJlc3R5cGUpOworICAgIHJldHVybiAwOwogfQogCiBQeVR5cGVPYmplY3QgUHlDVGh1bmtfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5DVGh1bmtPYmplY3QiLAotCXNpemVvZihDVGh1bmtPYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCXNpemVvZihmZmlfdHlwZSksCQkJLyogdHBfaXRlbXNpemUgKi8KLQlDVGh1bmtPYmplY3RfZGVhbGxvYywJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCQkJLyogdHBfZmxhZ3MgKi8KLQkiQ1RodW5rT2JqZWN0IiwJCQkJLyogdHBfZG9jICovCi0JQ1RodW5rT2JqZWN0X3RyYXZlcnNlLAkJCS8qIHRwX3RyYXZlcnNlICovCi0JQ1RodW5rT2JqZWN0X2NsZWFyLAkgICAgICAgCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLkNUaHVua09iamVjdCIsCisgICAgc2l6ZW9mKENUaHVua09iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICBzaXplb2YoZmZpX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgQ1RodW5rT2JqZWN0X2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAiQ1RodW5rT2JqZWN0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIENUaHVua09iamVjdF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICBDVGh1bmtPYmplY3RfY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04Myw2NCArODMsNjQgQEAKIHN0YXRpYyB2b2lkCiBQcmludEVycm9yKGNoYXIgKm1zZywgLi4uKQogewotCWNoYXIgYnVmWzUxMl07Ci0JUHlPYmplY3QgKmYgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOwotCXZhX2xpc3QgbWFya2VyOworICAgIGNoYXIgYnVmWzUxMl07CisgICAgUHlPYmplY3QgKmYgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOworICAgIHZhX2xpc3QgbWFya2VyOwogCi0JdmFfc3RhcnQobWFya2VyLCBtc2cpOwotCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBtc2csIG1hcmtlcik7Ci0JdmFfZW5kKG1hcmtlcik7Ci0JaWYgKGYpCi0JCVB5RmlsZV9Xcml0ZVN0cmluZyhidWYsIGYpOwotCVB5RXJyX1ByaW50KCk7CisgICAgdmFfc3RhcnQobWFya2VyLCBtc2cpOworICAgIHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBtc2csIG1hcmtlcik7CisgICAgdmFfZW5kKG1hcmtlcik7CisgICAgaWYgKGYpCisgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZyhidWYsIGYpOworICAgIFB5RXJyX1ByaW50KCk7CiB9CiAKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDcwMDAwKQogUHlDb2RlT2JqZWN0ICoKIFB5Q29kZV9OZXdFbXB0eShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZnVuY25hbWUsIGludCBmaXJzdGxpbmVubykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmVtcHR5c3RyaW5nID0gTlVMTDsKLQlzdGF0aWMgUHlPYmplY3QgKm51bGx0dXBsZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmZpbGVuYW1lX29iID0gTlVMTDsKLQlQeU9iamVjdCAqZnVuY25hbWVfb2IgPSBOVUxMOwotCVB5Q29kZU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlpZiAoZW1wdHlzdHJpbmcgPT0gTlVMTCkgewotCQllbXB0eXN0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCQlpZiAoZW1wdHlzdHJpbmcgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbGVkOwotCX0KLQlpZiAobnVsbHR1cGxlID09IE5VTEwpIHsKLQkJbnVsbHR1cGxlID0gUHlUdXBsZV9OZXcoMCk7Ci0JCWlmIChudWxsdHVwbGUgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbGVkOwotCX0KLQlmdW5jbmFtZV9vYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZnVuY25hbWUpOwotCWlmIChmdW5jbmFtZV9vYiA9PSBOVUxMKQotCQlnb3RvIGZhaWxlZDsKLQlmaWxlbmFtZV9vYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOwotCWlmIChmaWxlbmFtZV9vYiA9PSBOVUxMKQotCQlnb3RvIGZhaWxlZDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmVtcHR5c3RyaW5nID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm51bGx0dXBsZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZpbGVuYW1lX29iID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZnVuY25hbWVfb2IgPSBOVUxMOworICAgIFB5Q29kZU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBpZiAoZW1wdHlzdHJpbmcgPT0gTlVMTCkgeworICAgICAgICBlbXB0eXN0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoZW1wdHlzdHJpbmcgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgICBpZiAobnVsbHR1cGxlID09IE5VTEwpIHsKKyAgICAgICAgbnVsbHR1cGxlID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGlmIChudWxsdHVwbGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgICBmdW5jbmFtZV9vYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZnVuY25hbWUpOworICAgIGlmIChmdW5jbmFtZV9vYiA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICBmaWxlbmFtZV9vYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOworICAgIGlmIChmaWxlbmFtZV9vYiA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWxlZDsKIAotCXJlc3VsdCA9IFB5Q29kZV9OZXcoMCwJCQkvKiBhcmdjb3VudCAqLwotCQkJICAgIDAsCQkJLyogbmxvY2FscyAqLwotCQkJICAgIDAsCQkJLyogc3RhY2tzaXplICovCi0JCQkgICAgMCwJCQkvKiBmbGFncyAqLwotCQkJICAgIGVtcHR5c3RyaW5nLAkvKiBjb2RlICovCi0JCQkgICAgbnVsbHR1cGxlLAkJLyogY29uc3RzICovCi0JCQkgICAgbnVsbHR1cGxlLAkJLyogbmFtZXMgKi8KLQkJCSAgICBudWxsdHVwbGUsCQkvKiB2YXJuYW1lcyAqLwotCQkJICAgIG51bGx0dXBsZSwJCS8qIGZyZWV2YXJzICovCi0JCQkgICAgbnVsbHR1cGxlLAkJLyogY2VsbHZhcnMgKi8KLQkJCSAgICBmaWxlbmFtZV9vYiwJLyogZmlsZW5hbWUgKi8KLQkJCSAgICBmdW5jbmFtZV9vYiwJLyogbmFtZSAqLwotCQkJICAgIGZpcnN0bGluZW5vLAkvKiBmaXJzdGxpbmVubyAqLwotCQkJICAgIGVtcHR5c3RyaW5nCQkvKiBsbm90YWIgKi8KLQkJCSAgICApOworICAgIHJlc3VsdCA9IFB5Q29kZV9OZXcoMCwgICAgICAgICAgICAgICAgICAgICAgLyogYXJnY291bnQgKi8KKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5sb2NhbHMgKi8KKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YWNrc2l6ZSAqLworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBlbXB0eXN0cmluZywgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgKi8KKyAgICAgICAgICAgICAgICBudWxsdHVwbGUsICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0cyAqLworICAgICAgICAgICAgICAgIG51bGx0dXBsZSwgICAgICAgICAgICAgICAgICAgICAgLyogbmFtZXMgKi8KKyAgICAgICAgICAgICAgICBudWxsdHVwbGUsICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcm5hbWVzICovCisgICAgICAgICAgICAgICAgbnVsbHR1cGxlLCAgICAgICAgICAgICAgICAgICAgICAvKiBmcmVldmFycyAqLworICAgICAgICAgICAgICAgIG51bGx0dXBsZSwgICAgICAgICAgICAgICAgICAgICAgLyogY2VsbHZhcnMgKi8KKyAgICAgICAgICAgICAgICBmaWxlbmFtZV9vYiwgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lICovCisgICAgICAgICAgICAgICAgZnVuY25hbWVfb2IsICAgICAgICAgICAgICAgICAgICAvKiBuYW1lICovCisgICAgICAgICAgICAgICAgZmlyc3RsaW5lbm8sICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdGxpbmVubyAqLworICAgICAgICAgICAgICAgIGVtcHR5c3RyaW5nICAgICAgICAgICAgICAgICAgICAgLyogbG5vdGFiICovCisgICAgICAgICAgICAgICAgKTsKIAogZmFpbGVkOgotCVB5X1hERUNSRUYoZnVuY25hbWVfb2IpOwotCVB5X1hERUNSRUYoZmlsZW5hbWVfb2IpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihmdW5jbmFtZV9vYik7CisgICAgUHlfWERFQ1JFRihmaWxlbmFtZV9vYik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KICNlbmRpZgogCkBAIC0xNDgsMjcgKzE0OCwyNyBAQAogLyogYWZ0ZXIgY29kZSB0aGF0IHB5cmV4IGdlbmVyYXRlcyAqLwogdm9pZCBfY3R5cGVzX2FkZF90cmFjZWJhY2soY2hhciAqZnVuY25hbWUsIGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKQogewotCVB5T2JqZWN0ICpweV9nbG9iYWxzID0gMDsKLQlQeUNvZGVPYmplY3QgKnB5X2NvZGUgPSAwOwotCVB5RnJhbWVPYmplY3QgKnB5X2ZyYW1lID0gMDsKKyAgICBQeU9iamVjdCAqcHlfZ2xvYmFscyA9IDA7CisgICAgUHlDb2RlT2JqZWN0ICpweV9jb2RlID0gMDsKKyAgICBQeUZyYW1lT2JqZWN0ICpweV9mcmFtZSA9IDA7CiAKLQlweV9nbG9iYWxzID0gUHlEaWN0X05ldygpOwotCWlmICghcHlfZ2xvYmFscykgZ290byBiYWQ7Ci0JcHlfY29kZSA9IFB5Q29kZV9OZXdFbXB0eShmaWxlbmFtZSwgZnVuY25hbWUsIGxpbmVubyk7Ci0JaWYgKCFweV9jb2RlKSBnb3RvIGJhZDsKLQlweV9mcmFtZSA9IFB5RnJhbWVfTmV3KAotCQlQeVRocmVhZFN0YXRlX0dldCgpLCAvKlB5VGhyZWFkU3RhdGUgKnRzdGF0ZSwqLwotCQlweV9jb2RlLCAgICAgICAgICAgICAvKlB5Q29kZU9iamVjdCAqY29kZSwqLwotCQlweV9nbG9iYWxzLCAgICAgICAgICAvKlB5T2JqZWN0ICpnbG9iYWxzLCovCi0JCTAgICAgICAgICAgICAgICAgICAgIC8qUHlPYmplY3QgKmxvY2FscyovCi0JCSk7Ci0JaWYgKCFweV9mcmFtZSkgZ290byBiYWQ7Ci0JcHlfZnJhbWUtPmZfbGluZW5vID0gbGluZW5vOwotCVB5VHJhY2VCYWNrX0hlcmUocHlfZnJhbWUpOworICAgIHB5X2dsb2JhbHMgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFweV9nbG9iYWxzKSBnb3RvIGJhZDsKKyAgICBweV9jb2RlID0gUHlDb2RlX05ld0VtcHR5KGZpbGVuYW1lLCBmdW5jbmFtZSwgbGluZW5vKTsKKyAgICBpZiAoIXB5X2NvZGUpIGdvdG8gYmFkOworICAgIHB5X2ZyYW1lID0gUHlGcmFtZV9OZXcoCisgICAgICAgIFB5VGhyZWFkU3RhdGVfR2V0KCksIC8qUHlUaHJlYWRTdGF0ZSAqdHN0YXRlLCovCisgICAgICAgIHB5X2NvZGUsICAgICAgICAgICAgIC8qUHlDb2RlT2JqZWN0ICpjb2RlLCovCisgICAgICAgIHB5X2dsb2JhbHMsICAgICAgICAgIC8qUHlPYmplY3QgKmdsb2JhbHMsKi8KKyAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgLypQeU9iamVjdCAqbG9jYWxzKi8KKyAgICAgICAgKTsKKyAgICBpZiAoIXB5X2ZyYW1lKSBnb3RvIGJhZDsKKyAgICBweV9mcmFtZS0+Zl9saW5lbm8gPSBsaW5lbm87CisgICAgUHlUcmFjZUJhY2tfSGVyZShweV9mcmFtZSk7CiAgIGJhZDoKLQlQeV9YREVDUkVGKHB5X2dsb2JhbHMpOwotCVB5X1hERUNSRUYocHlfY29kZSk7Ci0JUHlfWERFQ1JFRihweV9mcmFtZSk7CisgICAgUHlfWERFQ1JFRihweV9nbG9iYWxzKTsKKyAgICBQeV9YREVDUkVGKHB5X2NvZGUpOworICAgIFB5X1hERUNSRUYocHlfZnJhbWUpOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKQEAgLTE4NSwxNSArMTg1LDE1IEBACiBzdGF0aWMgdm9pZAogVHJ5QWRkUmVmKFN0Z0RpY3RPYmplY3QgKmRpY3QsIENEYXRhT2JqZWN0ICpvYmopCiB7Ci0JSVVua25vd24gKnB1bms7CisgICAgSVVua25vd24gKnB1bms7CiAKLQlpZiAoTlVMTCA9PSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilkaWN0LCAiX25lZWRzX2NvbV9hZGRyZWZfIikpCi0JCXJldHVybjsKKyAgICBpZiAoTlVMTCA9PSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilkaWN0LCAiX25lZWRzX2NvbV9hZGRyZWZfIikpCisgICAgICAgIHJldHVybjsKIAotCXB1bmsgPSAqKElVbmtub3duICoqKW9iai0+Yl9wdHI7Ci0JaWYgKHB1bmspCi0JCXB1bmstPmxwVnRibC0+QWRkUmVmKHB1bmspOwotCXJldHVybjsKKyAgICBwdW5rID0gKihJVW5rbm93biAqKilvYmotPmJfcHRyOworICAgIGlmIChwdW5rKQorICAgICAgICBwdW5rLT5scFZ0YmwtPkFkZFJlZihwdW5rKTsKKyAgICByZXR1cm47CiB9CiAjZW5kaWYKIApAQCAtMjAzLDQyMCArMjAzLDQyMCBAQAogICoKICAqLwogc3RhdGljIHZvaWQgX0NhbGxQeXRob25PYmplY3Qodm9pZCAqbWVtLAotCQkJICAgICAgZmZpX3R5cGUgKnJlc3R5cGUsCi0JCQkgICAgICBTRVRGVU5DIHNldGZ1bmMsCi0JCQkgICAgICBQeU9iamVjdCAqY2FsbGFibGUsCi0JCQkgICAgICBQeU9iamVjdCAqY29udmVydGVycywKLQkJCSAgICAgIGludCBmbGFncywKLQkJCSAgICAgIHZvaWQgKipwQXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmaV90eXBlICpyZXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VURlVOQyBzZXRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNvbnZlcnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqcEFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKmFyZ2xpc3QgPSBOVUxMOwotCVB5X3NzaXplX3QgbkFyZ3M7Ci0JUHlPYmplY3QgKmVycm9yX29iamVjdCA9IE5VTEw7Ci0JaW50ICpzcGFjZTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBuQXJnczsKKyAgICBQeU9iamVjdCAqZXJyb3Jfb2JqZWN0ID0gTlVMTDsKKyAgICBpbnQgKnNwYWNlOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlHSUxTdGF0ZV9TVEFURSBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgUHlHSUxTdGF0ZV9TVEFURSBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiAjZW5kaWYKIAotCW5BcmdzID0gUHlTZXF1ZW5jZV9MZW5ndGgoY29udmVydGVycyk7Ci0JLyogSG0uIFdoYXQgdG8gcmV0dXJuIGluIGNhc2Ugb2YgZXJyb3I/Ci0JICAgRm9yIENPTSwgMHhGRkZGRkZGRiBzZWVtcyBiZXR0ZXIgdGhhbiAwLgotCSovCi0JaWYgKG5BcmdzIDwgMCkgewotCQlQcmludEVycm9yKCJCVUc6IFB5U2VxdWVuY2VfTGVuZ3RoIik7Ci0JCWdvdG8gRG9uZTsKLQl9CisgICAgbkFyZ3MgPSBQeVNlcXVlbmNlX0xlbmd0aChjb252ZXJ0ZXJzKTsKKyAgICAvKiBIbS4gV2hhdCB0byByZXR1cm4gaW4gY2FzZSBvZiBlcnJvcj8KKyAgICAgICBGb3IgQ09NLCAweEZGRkZGRkZGIHNlZW1zIGJldHRlciB0aGFuIDAuCisgICAgKi8KKyAgICBpZiAobkFyZ3MgPCAwKSB7CisgICAgICAgIFByaW50RXJyb3IoIkJVRzogUHlTZXF1ZW5jZV9MZW5ndGgiKTsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KIAotCWFyZ2xpc3QgPSBQeVR1cGxlX05ldyhuQXJncyk7Ci0JaWYgKCFhcmdsaXN0KSB7Ci0JCVByaW50RXJyb3IoIlB5VHVwbGVfTmV3KCkiKTsKLQkJZ290byBEb25lOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbkFyZ3M7ICsraSkgewotCQkvKiBOb3RlOiBuZXcgcmVmZXJlbmNlISAqLwotCQlQeU9iamVjdCAqY252ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGNvbnZlcnRlcnMsIGkpOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCQlpZiAoY252KQotCQkJZGljdCA9IFB5VHlwZV9zdGdkaWN0KGNudik7Ci0JCWVsc2UgewotCQkJUHJpbnRFcnJvcigiR2V0dGluZyBhcmd1bWVudCBjb252ZXJ0ZXIgJWRcbiIsIGkpOwotCQkJZ290byBEb25lOwotCQl9CisgICAgYXJnbGlzdCA9IFB5VHVwbGVfTmV3KG5BcmdzKTsKKyAgICBpZiAoIWFyZ2xpc3QpIHsKKyAgICAgICAgUHJpbnRFcnJvcigiUHlUdXBsZV9OZXcoKSIpOworICAgICAgICBnb3RvIERvbmU7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBuQXJnczsgKytpKSB7CisgICAgICAgIC8qIE5vdGU6IG5ldyByZWZlcmVuY2UhICovCisgICAgICAgIFB5T2JqZWN0ICpjbnYgPSBQeVNlcXVlbmNlX0dldEl0ZW0oY29udmVydGVycywgaSk7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgICAgIGlmIChjbnYpCisgICAgICAgICAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoY252KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQcmludEVycm9yKCJHZXR0aW5nIGFyZ3VtZW50IGNvbnZlcnRlciAlZFxuIiwgaSk7CisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIH0KIAotCQlpZiAoZGljdCAmJiBkaWN0LT5nZXRmdW5jICYmICFfY3R5cGVzX3NpbXBsZV9pbnN0YW5jZShjbnYpKSB7Ci0JCQlQeU9iamVjdCAqdiA9IGRpY3QtPmdldGZ1bmMoKnBBcmdzLCBkaWN0LT5zaXplKTsKLQkJCWlmICghdikgewotCQkJCVByaW50RXJyb3IoImNyZWF0ZSBhcmd1bWVudCAlZDpcbiIsIGkpOwotCQkJCVB5X0RFQ1JFRihjbnYpOwotCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJCVB5VHVwbGVfU0VUX0lURU0oYXJnbGlzdCwgaSwgdik7Ci0JCQkvKiBYWFggWFhYIFhYCi0JCQkgICBXZSBoYXZlIHRoZSBwcm9ibGVtIHRoYXQgY19ieXRlIG9yIGNfc2hvcnQgaGF2ZSBkaWN0LT5zaXplIG9mCi0JCQkgICAxIHJlc3AuIDQsIGJ1dCB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBwdXNoZWQgYXMgc2l6ZW9mKGludCkgYnl0ZXMuCi0JCQkgICBCVFcsIHRoZSBzYW1lIHByb2JsZW0gb2NjdXJycyB3aGVuIHRoZXkgYXJlIHB1c2hlZCBhcyBwYXJhbWV0ZXJzCi0JCQkqLwotCQl9IGVsc2UgaWYgKGRpY3QpIHsKLQkJCS8qIEhtLCBzaG91bGRuJ3Qgd2UgdXNlIFB5Q0RhdGFfQXRBZGRyZXNzKCkgb3Igc29tZXRoaW5nIGxpa2UgdGhhdCBpbnN0ZWFkPyAqLwotCQkJQ0RhdGFPYmplY3QgKm9iaiA9IChDRGF0YU9iamVjdCAqKVB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY252LCBOVUxMKTsKLQkJCWlmICghb2JqKSB7Ci0JCQkJUHJpbnRFcnJvcigiY3JlYXRlIGFyZ3VtZW50ICVkOlxuIiwgaSk7Ci0JCQkJUHlfREVDUkVGKGNudik7Ci0JCQkJZ290byBEb25lOwotCQkJfQotCQkJaWYgKCFDRGF0YU9iamVjdF9DaGVjayhvYmopKSB7Ci0JCQkJUHlfREVDUkVGKG9iaik7Ci0JCQkJUHlfREVDUkVGKGNudik7Ci0JCQkJUHJpbnRFcnJvcigidW5leHBlY3RlZCByZXN1bHQgb2YgY3JlYXRlIGFyZ3VtZW50ICVkOlxuIiwgaSk7Ci0JCQkJZ290byBEb25lOwotCQkJfQotCQkJbWVtY3B5KG9iai0+Yl9wdHIsICpwQXJncywgZGljdC0+c2l6ZSk7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKGFyZ2xpc3QsIGksIChQeU9iamVjdCAqKW9iaik7CisgICAgICAgIGlmIChkaWN0ICYmIGRpY3QtPmdldGZ1bmMgJiYgIV9jdHlwZXNfc2ltcGxlX2luc3RhbmNlKGNudikpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gZGljdC0+Z2V0ZnVuYygqcEFyZ3MsIGRpY3QtPnNpemUpOworICAgICAgICAgICAgaWYgKCF2KSB7CisgICAgICAgICAgICAgICAgUHJpbnRFcnJvcigiY3JlYXRlIGFyZ3VtZW50ICVkOlxuIiwgaSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNudik7CisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdsaXN0LCBpLCB2KTsKKyAgICAgICAgICAgIC8qIFhYWCBYWFggWFgKKyAgICAgICAgICAgICAgIFdlIGhhdmUgdGhlIHByb2JsZW0gdGhhdCBjX2J5dGUgb3IgY19zaG9ydCBoYXZlIGRpY3QtPnNpemUgb2YKKyAgICAgICAgICAgICAgIDEgcmVzcC4gNCwgYnV0IHRoZXNlIHBhcmFtZXRlcnMgYXJlIHB1c2hlZCBhcyBzaXplb2YoaW50KSBieXRlcy4KKyAgICAgICAgICAgICAgIEJUVywgdGhlIHNhbWUgcHJvYmxlbSBvY2N1cnJzIHdoZW4gdGhleSBhcmUgcHVzaGVkIGFzIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICovCisgICAgICAgIH0gZWxzZSBpZiAoZGljdCkgeworICAgICAgICAgICAgLyogSG0sIHNob3VsZG4ndCB3ZSB1c2UgUHlDRGF0YV9BdEFkZHJlc3MoKSBvciBzb21ldGhpbmcgbGlrZSB0aGF0IGluc3RlYWQ/ICovCisgICAgICAgICAgICBDRGF0YU9iamVjdCAqb2JqID0gKENEYXRhT2JqZWN0ICopUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjbnYsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFvYmopIHsKKyAgICAgICAgICAgICAgICBQcmludEVycm9yKCJjcmVhdGUgYXJndW1lbnQgJWQ6XG4iLCBpKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY252KTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKG9iaikpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY252KTsKKyAgICAgICAgICAgICAgICBQcmludEVycm9yKCJ1bmV4cGVjdGVkIHJlc3VsdCBvZiBjcmVhdGUgYXJndW1lbnQgJWQ6XG4iLCBpKTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkob2JqLT5iX3B0ciwgKnBBcmdzLCBkaWN0LT5zaXplKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJnbGlzdCwgaSwgKFB5T2JqZWN0ICopb2JqKTsKICNpZmRlZiBNU19XSU4zMgotCQkJVHJ5QWRkUmVmKGRpY3QsIG9iaik7CisgICAgICAgICAgICBUcnlBZGRSZWYoZGljdCwgb2JqKTsKICNlbmRpZgotCQl9IGVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImNhbm5vdCBidWlsZCBwYXJhbWV0ZXIiKTsKLQkJCVByaW50RXJyb3IoIlBhcnNpbmcgYXJndW1lbnQgJWRcbiIsIGkpOwotCQkJUHlfREVDUkVGKGNudik7Ci0JCQlnb3RvIERvbmU7Ci0JCX0KLQkJUHlfREVDUkVGKGNudik7Ci0JCS8qIFhYWCBlcnJvciBoYW5kbGluZyEgKi8KLQkJcEFyZ3MrKzsKLQl9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYnVpbGQgcGFyYW1ldGVyIik7CisgICAgICAgICAgICBQcmludEVycm9yKCJQYXJzaW5nIGFyZ3VtZW50ICVkXG4iLCBpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjbnYpOworICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihjbnYpOworICAgICAgICAvKiBYWFggZXJyb3IgaGFuZGxpbmchICovCisgICAgICAgIHBBcmdzKys7CisgICAgfQogCiAjZGVmaW5lIENIRUNLKHdoYXQsIHgpIFwKIGlmICh4ID09IE5VTEwpIF9jdHlwZXNfYWRkX3RyYWNlYmFjayh3aGF0LCAiX2N0eXBlcy9jYWxsYmFja3MuYyIsIF9fTElORV9fIC0gMSksIFB5RXJyX1ByaW50KCkKIAotCWlmIChmbGFncyAmIChGVU5DRkxBR19VU0VfRVJSTk8gfCBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSkgewotCQllcnJvcl9vYmplY3QgPSBfY3R5cGVzX2dldF9lcnJvYmooJnNwYWNlKTsKLQkJaWYgKGVycm9yX29iamVjdCA9PSBOVUxMKQotCQkJZ290byBEb25lOwotCQlpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfRVJSTk8pIHsKLQkJCWludCB0ZW1wID0gc3BhY2VbMF07Ci0JCQlzcGFjZVswXSA9IGVycm5vOwotCQkJZXJybm8gPSB0ZW1wOwotCQl9CisgICAgaWYgKGZsYWdzICYgKEZVTkNGTEFHX1VTRV9FUlJOTyB8IEZVTkNGTEFHX1VTRV9MQVNURVJST1IpKSB7CisgICAgICAgIGVycm9yX29iamVjdCA9IF9jdHlwZXNfZ2V0X2Vycm9iaigmc3BhY2UpOworICAgICAgICBpZiAoZXJyb3Jfb2JqZWN0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICAgICAgaW50IHRlbXAgPSBzcGFjZVswXTsKKyAgICAgICAgICAgIHNwYWNlWzBdID0gZXJybm87CisgICAgICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgICAgIH0KICNpZmRlZiBNU19XSU4zMgotCQlpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7Ci0JCQlpbnQgdGVtcCA9IHNwYWNlWzFdOwotCQkJc3BhY2VbMV0gPSBHZXRMYXN0RXJyb3IoKTsKLQkJCVNldExhc3RFcnJvcih0ZW1wKTsKLQkJfQorICAgICAgICBpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7CisgICAgICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzFdOworICAgICAgICAgICAgc3BhY2VbMV0gPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIFNldExhc3RFcnJvcih0ZW1wKTsKKyAgICAgICAgfQogI2VuZGlmCi0JfQorICAgIH0KIAotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2FsbGFibGUsIGFyZ2xpc3QpOwotCUNIRUNLKCInY2FsbGluZyBjYWxsYmFjayBmdW5jdGlvbiciLCByZXN1bHQpOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2FsbGFibGUsIGFyZ2xpc3QpOworICAgIENIRUNLKCInY2FsbGluZyBjYWxsYmFjayBmdW5jdGlvbiciLCByZXN1bHQpOwogCiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMV07Ci0JCXNwYWNlWzFdID0gR2V0TGFzdEVycm9yKCk7Ci0JCVNldExhc3RFcnJvcih0ZW1wKTsKLQl9CisgICAgaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzFdOworICAgICAgICBzcGFjZVsxXSA9IEdldExhc3RFcnJvcigpOworICAgICAgICBTZXRMYXN0RXJyb3IodGVtcCk7CisgICAgfQogI2VuZGlmCi0JaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0VSUk5PKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMF07Ci0JCXNwYWNlWzBdID0gZXJybm87Ci0JCWVycm5vID0gdGVtcDsKLQl9Ci0JUHlfWERFQ1JFRihlcnJvcl9vYmplY3QpOworICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzBdOworICAgICAgICBzcGFjZVswXSA9IGVycm5vOworICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgfQorICAgIFB5X1hERUNSRUYoZXJyb3Jfb2JqZWN0KTsKIAotCWlmICgocmVzdHlwZSAhPSAmZmZpX3R5cGVfdm9pZCkgJiYgcmVzdWx0KSB7Ci0JCVB5T2JqZWN0ICprZWVwOwotCQlhc3NlcnQoc2V0ZnVuYyk7CisgICAgaWYgKChyZXN0eXBlICE9ICZmZmlfdHlwZV92b2lkKSAmJiByZXN1bHQpIHsKKyAgICAgICAgUHlPYmplY3QgKmtlZXA7CisgICAgICAgIGFzc2VydChzZXRmdW5jKTsKICNpZmRlZiBXT1JEU19CSUdFTkRJQU4KLQkJLyogU2VlIHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gY2FsbHByb2MuYywgYXJvdW5kIGxpbmUgOTYxICovCi0JCWlmIChyZXN0eXBlLT50eXBlICE9IEZGSV9UWVBFX0ZMT0FUICYmIHJlc3R5cGUtPnNpemUgPCBzaXplb2YoZmZpX2FyZykpCi0JCQltZW0gPSAoY2hhciAqKW1lbSArIHNpemVvZihmZmlfYXJnKSAtIHJlc3R5cGUtPnNpemU7CisgICAgICAgIC8qIFNlZSB0aGUgY29ycmVzcG9uZGluZyBjb2RlIGluIGNhbGxwcm9jLmMsIGFyb3VuZCBsaW5lIDk2MSAqLworICAgICAgICBpZiAocmVzdHlwZS0+dHlwZSAhPSBGRklfVFlQRV9GTE9BVCAmJiByZXN0eXBlLT5zaXplIDwgc2l6ZW9mKGZmaV9hcmcpKQorICAgICAgICAgICAgbWVtID0gKGNoYXIgKiltZW0gKyBzaXplb2YoZmZpX2FyZykgLSByZXN0eXBlLT5zaXplOwogI2VuZGlmCi0JCWtlZXAgPSBzZXRmdW5jKG1lbSwgcmVzdWx0LCAwKTsKLQkJQ0hFQ0soIidjb252ZXJ0aW5nIGNhbGxiYWNrIHJlc3VsdCciLCBrZWVwKTsKLQkJLyoga2VlcCBpcyBhbiBvYmplY3Qgd2UgaGF2ZSB0byBrZWVwIGFsaXZlIHNvIHRoYXQgdGhlIHJlc3VsdAotCQkgICBzdGF5cyB2YWxpZC4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggb2JqZWN0LCB0aGUgc2V0ZnVuYyB3aWxsCi0JCSAgIGhhdmUgcmV0dXJuZWQgUHlfTm9uZS4KKyAgICAgICAga2VlcCA9IHNldGZ1bmMobWVtLCByZXN1bHQsIDApOworICAgICAgICBDSEVDSygiJ2NvbnZlcnRpbmcgY2FsbGJhY2sgcmVzdWx0JyIsIGtlZXApOworICAgICAgICAvKiBrZWVwIGlzIGFuIG9iamVjdCB3ZSBoYXZlIHRvIGtlZXAgYWxpdmUgc28gdGhhdCB0aGUgcmVzdWx0CisgICAgICAgICAgIHN0YXlzIHZhbGlkLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBvYmplY3QsIHRoZSBzZXRmdW5jIHdpbGwKKyAgICAgICAgICAgaGF2ZSByZXR1cm5lZCBQeV9Ob25lLgogCi0JCSAgIElmIHRoZXJlIGlzIHN1Y2ggYW4gb2JqZWN0LCB3ZSBoYXZlIG5vIGNob2ljZSB0aGFuIHRvIGtlZXAKLQkJICAgaXQgYWxpdmUgZm9yZXZlciAtIGJ1dCBhIHJlZmNvdW50IGFuZC9vciBtZW1vcnkgbGVhayB3aWxsCi0JCSAgIGJlIHRoZSByZXN1bHQuICBFWENFUFQgd2hlbiByZXN0eXBlIGlzIHB5X29iamVjdCAtIFB5dGhvbgotCQkgICBpdHNlbGYga25vd3MgaG93IHRvIG1hbmFnZSB0aGUgcmVmY291bnQgb2YgdGhlc2Ugb2JqZWN0cy4KLQkJKi8KLQkJaWYgKGtlZXAgPT0gTlVMTCkgLyogQ291bGQgbm90IGNvbnZlcnQgY2FsbGJhY2sgcmVzdWx0LiAqLwotCQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNhbGxhYmxlKTsKLQkJZWxzZSBpZiAoa2VlcCA9PSBQeV9Ob25lKSAvKiBOb3RoaW5nIHRvIGtlZXAgKi8KLQkJCVB5X0RFQ1JFRihrZWVwKTsKLQkJZWxzZSBpZiAoc2V0ZnVuYyAhPSBfY3R5cGVzX2dldF9maWVsZGRlc2MoIk8iKS0+c2V0ZnVuYykgewotCQkJaWYgKC0xID09IFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsCi0JCQkJCSAgICAgIm1lbW9yeSBsZWFrIGluIGNhbGxiYWNrIGZ1bmN0aW9uLiIpKQotCQkJCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjYWxsYWJsZSk7Ci0JCX0KLQl9Ci0JUHlfWERFQ1JFRihyZXN1bHQpOworICAgICAgICAgICBJZiB0aGVyZSBpcyBzdWNoIGFuIG9iamVjdCwgd2UgaGF2ZSBubyBjaG9pY2UgdGhhbiB0byBrZWVwCisgICAgICAgICAgIGl0IGFsaXZlIGZvcmV2ZXIgLSBidXQgYSByZWZjb3VudCBhbmQvb3IgbWVtb3J5IGxlYWsgd2lsbAorICAgICAgICAgICBiZSB0aGUgcmVzdWx0LiAgRVhDRVBUIHdoZW4gcmVzdHlwZSBpcyBweV9vYmplY3QgLSBQeXRob24KKyAgICAgICAgICAgaXRzZWxmIGtub3dzIGhvdyB0byBtYW5hZ2UgdGhlIHJlZmNvdW50IG9mIHRoZXNlIG9iamVjdHMuCisgICAgICAgICovCisgICAgICAgIGlmIChrZWVwID09IE5VTEwpIC8qIENvdWxkIG5vdCBjb252ZXJ0IGNhbGxiYWNrIHJlc3VsdC4gKi8KKyAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjYWxsYWJsZSk7CisgICAgICAgIGVsc2UgaWYgKGtlZXAgPT0gUHlfTm9uZSkgLyogTm90aGluZyB0byBrZWVwICovCisgICAgICAgICAgICBQeV9ERUNSRUYoa2VlcCk7CisgICAgICAgIGVsc2UgaWYgKHNldGZ1bmMgIT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJPIiktPnNldGZ1bmMpIHsKKyAgICAgICAgICAgIGlmICgtMSA9PSBQeUVycl9XYXJuKFB5RXhjX1J1bnRpbWVXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSBsZWFrIGluIGNhbGxiYWNrIGZ1bmN0aW9uLiIpKQorICAgICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjYWxsYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOwogICBEb25lOgotCVB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CisgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHN0YXRlKTsKICNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBjbG9zdXJlX2ZjbihmZmlfY2lmICpjaWYsCi0JCQl2b2lkICpyZXNwLAotCQkJdm9pZCAqKmFyZ3MsCi0JCQl2b2lkICp1c2VyZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlc3AsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKQogewotCUNUaHVua09iamVjdCAqcCA9IChDVGh1bmtPYmplY3QgKil1c2VyZGF0YTsKKyAgICBDVGh1bmtPYmplY3QgKnAgPSAoQ1RodW5rT2JqZWN0ICopdXNlcmRhdGE7CiAKLQlfQ2FsbFB5dGhvbk9iamVjdChyZXNwLAotCQkJICBwLT5mZmlfcmVzdHlwZSwKLQkJCSAgcC0+c2V0ZnVuYywKLQkJCSAgcC0+Y2FsbGFibGUsCi0JCQkgIHAtPmNvbnZlcnRlcnMsCi0JCQkgIHAtPmZsYWdzLAotCQkJICBhcmdzKTsKKyAgICBfQ2FsbFB5dGhvbk9iamVjdChyZXNwLAorICAgICAgICAgICAgICAgICAgICAgIHAtPmZmaV9yZXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIHAtPnNldGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgcC0+Y2FsbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgcC0+Y29udmVydGVycywKKyAgICAgICAgICAgICAgICAgICAgICBwLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBhcmdzKTsKIH0KIAogc3RhdGljIENUaHVua09iamVjdCogQ1RodW5rT2JqZWN0X25ldyhQeV9zc2l6ZV90IG5BcmdzKQogewotCUNUaHVua09iamVjdCAqcDsKLQlpbnQgaTsKKyAgICBDVGh1bmtPYmplY3QgKnA7CisgICAgaW50IGk7CiAKLQlwID0gUHlPYmplY3RfR0NfTmV3VmFyKENUaHVua09iamVjdCwgJlB5Q1RodW5rX1R5cGUsIG5BcmdzKTsKLQlpZiAocCA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBwID0gUHlPYmplY3RfR0NfTmV3VmFyKENUaHVua09iamVjdCwgJlB5Q1RodW5rX1R5cGUsIG5BcmdzKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXAtPnBjbCA9IE5VTEw7Ci0JbWVtc2V0KCZwLT5jaWYsIDAsIHNpemVvZihwLT5jaWYpKTsKLQlwLT5jb252ZXJ0ZXJzID0gTlVMTDsKLQlwLT5jYWxsYWJsZSA9IE5VTEw7Ci0JcC0+c2V0ZnVuYyA9IE5VTEw7Ci0JcC0+ZmZpX3Jlc3R5cGUgPSBOVUxMOwotCQotCWZvciAoaSA9IDA7IGkgPCBuQXJncyArIDE7ICsraSkKLQkJcC0+YXR5cGVzW2ldID0gTlVMTDsKLQlQeU9iamVjdF9HQ19UcmFjaygoUHlPYmplY3QgKilwKTsKLQlyZXR1cm4gcDsKKyAgICBwLT5wY2wgPSBOVUxMOworICAgIG1lbXNldCgmcC0+Y2lmLCAwLCBzaXplb2YocC0+Y2lmKSk7CisgICAgcC0+Y29udmVydGVycyA9IE5VTEw7CisgICAgcC0+Y2FsbGFibGUgPSBOVUxMOworICAgIHAtPnNldGZ1bmMgPSBOVUxMOworICAgIHAtPmZmaV9yZXN0eXBlID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuQXJncyArIDE7ICsraSkKKyAgICAgICAgcC0+YXR5cGVzW2ldID0gTlVMTDsKKyAgICBQeU9iamVjdF9HQ19UcmFjaygoUHlPYmplY3QgKilwKTsKKyAgICByZXR1cm4gcDsKIH0KIAogQ1RodW5rT2JqZWN0ICpfY3R5cGVzX2FsbG9jX2NhbGxiYWNrKFB5T2JqZWN0ICpjYWxsYWJsZSwKLQkJCQkgICAgUHlPYmplY3QgKmNvbnZlcnRlcnMsCi0JCQkJICAgIFB5T2JqZWN0ICpyZXN0eXBlLAotCQkJCSAgICBpbnQgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29udmVydGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQogewotCWludCByZXN1bHQ7Ci0JQ1RodW5rT2JqZWN0ICpwOwotCVB5X3NzaXplX3QgbkFyZ3MsIGk7Ci0JZmZpX2FiaSBjYzsKKyAgICBpbnQgcmVzdWx0OworICAgIENUaHVua09iamVjdCAqcDsKKyAgICBQeV9zc2l6ZV90IG5BcmdzLCBpOworICAgIGZmaV9hYmkgY2M7CiAKLQluQXJncyA9IFB5U2VxdWVuY2VfU2l6ZShjb252ZXJ0ZXJzKTsKLQlwID0gQ1RodW5rT2JqZWN0X25ldyhuQXJncyk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbkFyZ3MgPSBQeVNlcXVlbmNlX1NpemUoY29udmVydGVycyk7CisgICAgcCA9IENUaHVua09iamVjdF9uZXcobkFyZ3MpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JYXNzZXJ0KENUaHVua19DaGVja0V4YWN0KHApKTsKKyAgICBhc3NlcnQoQ1RodW5rX0NoZWNrRXhhY3QocCkpOwogCi0JcC0+cGNsID0gX2N0eXBlc19hbGxvY19jbG9zdXJlKCk7Ci0JaWYgKHAtPnBjbCA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIHAtPnBjbCA9IF9jdHlwZXNfYWxsb2NfY2xvc3VyZSgpOworICAgIGlmIChwLT5wY2wgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCXAtPmZsYWdzID0gZmxhZ3M7Ci0JZm9yIChpID0gMDsgaSA8IG5BcmdzOyArK2kpIHsKLQkJUHlPYmplY3QgKmNudiA9IFB5U2VxdWVuY2VfR2V0SXRlbShjb252ZXJ0ZXJzLCBpKTsKLQkJaWYgKGNudiA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJcC0+YXR5cGVzW2ldID0gX2N0eXBlc19nZXRfZmZpX3R5cGUoY252KTsKLQkJUHlfREVDUkVGKGNudik7Ci0JfQotCXAtPmF0eXBlc1tpXSA9IE5VTEw7CisgICAgcC0+ZmxhZ3MgPSBmbGFnczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkFyZ3M7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqY252ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGNvbnZlcnRlcnMsIGkpOworICAgICAgICBpZiAoY252ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBwLT5hdHlwZXNbaV0gPSBfY3R5cGVzX2dldF9mZmlfdHlwZShjbnYpOworICAgICAgICBQeV9ERUNSRUYoY252KTsKKyAgICB9CisgICAgcC0+YXR5cGVzW2ldID0gTlVMTDsKIAotCVB5X0lOQ1JFRihyZXN0eXBlKTsKLQlwLT5yZXN0eXBlID0gcmVzdHlwZTsKLQlpZiAocmVzdHlwZSA9PSBQeV9Ob25lKSB7Ci0JCXAtPnNldGZ1bmMgPSBOVUxMOwotCQlwLT5mZmlfcmVzdHlwZSA9ICZmZmlfdHlwZV92b2lkOwotCX0gZWxzZSB7Ci0JCVN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdChyZXN0eXBlKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCB8fCBkaWN0LT5zZXRmdW5jID09IE5VTEwpIHsKLQkJICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgImludmFsaWQgcmVzdWx0IHR5cGUgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uIik7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCQlwLT5zZXRmdW5jID0gZGljdC0+c2V0ZnVuYzsKLQkJcC0+ZmZpX3Jlc3R5cGUgPSAmZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKLQl9CisgICAgUHlfSU5DUkVGKHJlc3R5cGUpOworICAgIHAtPnJlc3R5cGUgPSByZXN0eXBlOworICAgIGlmIChyZXN0eXBlID09IFB5X05vbmUpIHsKKyAgICAgICAgcC0+c2V0ZnVuYyA9IE5VTEw7CisgICAgICAgIHAtPmZmaV9yZXN0eXBlID0gJmZmaV90eXBlX3ZvaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KHJlc3R5cGUpOworICAgICAgICBpZiAoZGljdCA9PSBOVUxMIHx8IGRpY3QtPnNldGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHJlc3VsdCB0eXBlIGZvciBjYWxsYmFjayBmdW5jdGlvbiIpOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcC0+c2V0ZnVuYyA9IGRpY3QtPnNldGZ1bmM7CisgICAgICAgIHAtPmZmaV9yZXN0eXBlID0gJmRpY3QtPmZmaV90eXBlX3BvaW50ZXI7CisgICAgfQogCi0JY2MgPSBGRklfREVGQVVMVF9BQkk7CisgICAgY2MgPSBGRklfREVGQVVMVF9BQkk7CiAjaWYgZGVmaW5lZChNU19XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkgJiYgIWRlZmluZWQoTVNfV0lONjQpCi0JaWYgKChmbGFncyAmIEZVTkNGTEFHX0NERUNMKSA9PSAwKQotCQljYyA9IEZGSV9TVERDQUxMOworICAgIGlmICgoZmxhZ3MgJiBGVU5DRkxBR19DREVDTCkgPT0gMCkKKyAgICAgICAgY2MgPSBGRklfU1REQ0FMTDsKICNlbmRpZgotCXJlc3VsdCA9IGZmaV9wcmVwX2NpZigmcC0+Y2lmLCBjYywKLQkJCSAgICAgIFB5X1NBRkVfRE9XTkNBU1QobkFyZ3MsIFB5X3NzaXplX3QsIGludCksCi0JCQkgICAgICBfY3R5cGVzX2dldF9mZmlfdHlwZShyZXN0eXBlKSwKLQkJCSAgICAgICZwLT5hdHlwZXNbMF0pOwotCWlmIChyZXN1bHQgIT0gRkZJX09LKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAgICJmZmlfcHJlcF9jaWYgZmFpbGVkIHdpdGggJWQiLCByZXN1bHQpOwotCQlnb3RvIGVycm9yOwotCX0KLQlyZXN1bHQgPSBmZmlfcHJlcF9jbG9zdXJlKHAtPnBjbCwgJnAtPmNpZiwgY2xvc3VyZV9mY24sIHApOwotCWlmIChyZXN1bHQgIT0gRkZJX09LKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAgICJmZmlfcHJlcF9jbG9zdXJlIGZhaWxlZCB3aXRoICVkIiwgcmVzdWx0KTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgcmVzdWx0ID0gZmZpX3ByZXBfY2lmKCZwLT5jaWYsIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKG5BcmdzLCBQeV9zc2l6ZV90LCBpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfY3R5cGVzX2dldF9mZmlfdHlwZShyZXN0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPmF0eXBlc1swXSk7CisgICAgaWYgKHJlc3VsdCAhPSBGRklfT0spIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJmZmlfcHJlcF9jaWYgZmFpbGVkIHdpdGggJWQiLCByZXN1bHQpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICByZXN1bHQgPSBmZmlfcHJlcF9jbG9zdXJlKHAtPnBjbCwgJnAtPmNpZiwgY2xvc3VyZV9mY24sIHApOworICAgIGlmIChyZXN1bHQgIT0gRkZJX09LKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZmZpX3ByZXBfY2xvc3VyZSBmYWlsZWQgd2l0aCAlZCIsIHJlc3VsdCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JUHlfSU5DUkVGKGNvbnZlcnRlcnMpOwotCXAtPmNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzOwotCVB5X0lOQ1JFRihjYWxsYWJsZSk7Ci0JcC0+Y2FsbGFibGUgPSBjYWxsYWJsZTsKLQlyZXR1cm4gcDsKKyAgICBQeV9JTkNSRUYoY29udmVydGVycyk7CisgICAgcC0+Y29udmVydGVycyA9IGNvbnZlcnRlcnM7CisgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICBwLT5jYWxsYWJsZSA9IGNhbGxhYmxlOworICAgIHJldHVybiBwOwogCiAgIGVycm9yOgotCVB5X1hERUNSRUYocCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihwKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIE1TX1dJTjMyCiAKIHN0YXRpYyB2b2lkIExvYWRQeXRob24odm9pZCkKIHsKLQlpZiAoIVB5X0lzSW5pdGlhbGl6ZWQoKSkgeworICAgIGlmICghUHlfSXNJbml0aWFsaXplZCgpKSB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlFdmFsX0luaXRUaHJlYWRzKCk7CisgICAgICAgIFB5RXZhbF9Jbml0VGhyZWFkcygpOwogI2VuZGlmCi0JCVB5X0luaXRpYWxpemUoKTsKLQl9CisgICAgICAgIFB5X0luaXRpYWxpemUoKTsKKyAgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGxvbmcgQ2FsbF9HZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsIFJFRklJRCByaWlkLCBMUFZPSUQgKnBwdikKIHsKLQlQeU9iamVjdCAqbW9kLCAqZnVuYywgKnJlc3VsdDsKLQlsb25nIHJldHZhbDsKLQlzdGF0aWMgUHlPYmplY3QgKmNvbnRleHQ7CisgICAgUHlPYmplY3QgKm1vZCwgKmZ1bmMsICpyZXN1bHQ7CisgICAgbG9uZyByZXR2YWw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjb250ZXh0OwogCi0JaWYgKGNvbnRleHQgPT0gTlVMTCkKLQkJY29udGV4dCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9jdHlwZXMuRGxsR2V0Q2xhc3NPYmplY3QiKTsKKyAgICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgICAgICBjb250ZXh0ID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX2N0eXBlcy5EbGxHZXRDbGFzc09iamVjdCIpOwogCi0JbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygiY3R5cGVzIik7Ci0JaWYgKCFtb2QpIHsKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7Ci0JCS8qIFRoZXJlIGhhcyBiZWVuIGEgd2FybmluZyBiZWZvcmUgYWJvdXQgdGhpcyBhbHJlYWR5ICovCi0JCXJldHVybiBFX0ZBSUw7Ci0JfQorICAgIG1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soImN0eXBlcyIpOworICAgIGlmICghbW9kKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOworICAgICAgICAvKiBUaGVyZSBoYXMgYmVlbiBhIHdhcm5pbmcgYmVmb3JlIGFib3V0IHRoaXMgYWxyZWFkeSAqLworICAgICAgICByZXR1cm4gRV9GQUlMOworICAgIH0KIAotCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIkRsbEdldENsYXNzT2JqZWN0Iik7Ci0JUHlfREVDUkVGKG1vZCk7Ci0JaWYgKCFmdW5jKSB7Ci0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOwotCQlyZXR1cm4gRV9GQUlMOwotCX0KKyAgICBmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsICJEbGxHZXRDbGFzc09iamVjdCIpOworICAgIFB5X0RFQ1JFRihtb2QpOworICAgIGlmICghZnVuYykgeworICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICB9CiAKLQl7Ci0JCVB5T2JqZWN0ICpweV9yY2xzaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilyY2xzaWQpOwotCQlQeU9iamVjdCAqcHlfcmlpZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cigodm9pZCAqKXJpaWQpOwotCQlQeU9iamVjdCAqcHlfcHB2ID0gUHlMb25nX0Zyb21Wb2lkUHRyKHBwdik7Ci0JCWlmICghcHlfcmNsc2lkIHx8ICFweV9yaWlkIHx8ICFweV9wcHYpIHsKLQkJCVB5X1hERUNSRUYocHlfcmNsc2lkKTsKLQkJCVB5X1hERUNSRUYocHlfcmlpZCk7Ci0JCQlQeV9YREVDUkVGKHB5X3Bwdik7Ci0JCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKLQkJCXJldHVybiBFX0ZBSUw7Ci0JCX0KLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jLAotCQkJCQkJICAgICAgcHlfcmNsc2lkLAotCQkJCQkJICAgICAgcHlfcmlpZCwKLQkJCQkJCSAgICAgIHB5X3BwdiwKLQkJCQkJCSAgICAgIE5VTEwpOwotCQlQeV9ERUNSRUYocHlfcmNsc2lkKTsKLQkJUHlfREVDUkVGKHB5X3JpaWQpOwotCQlQeV9ERUNSRUYocHlfcHB2KTsKLQl9Ci0JUHlfREVDUkVGKGZ1bmMpOwotCWlmICghcmVzdWx0KSB7Ci0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOwotCQlyZXR1cm4gRV9GQUlMOwotCX0KKyAgICB7CisgICAgICAgIFB5T2JqZWN0ICpweV9yY2xzaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilyY2xzaWQpOworICAgICAgICBQeU9iamVjdCAqcHlfcmlpZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cigodm9pZCAqKXJpaWQpOworICAgICAgICBQeU9iamVjdCAqcHlfcHB2ID0gUHlMb25nX0Zyb21Wb2lkUHRyKHBwdik7CisgICAgICAgIGlmICghcHlfcmNsc2lkIHx8ICFweV9yaWlkIHx8ICFweV9wcHYpIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocHlfcmNsc2lkKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocHlfcmlpZCk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHB5X3Bwdik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X3JjbHNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweV9yaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X3BwdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKHB5X3JjbHNpZCk7CisgICAgICAgIFB5X0RFQ1JFRihweV9yaWlkKTsKKyAgICAgICAgUHlfREVDUkVGKHB5X3Bwdik7CisgICAgfQorICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICB9CiAKLQlyZXR2YWwgPSBQeUludF9Bc0xvbmcocmVzdWx0KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKLQkJcmV0dmFsID0gRV9GQUlMOwotCX0KLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHZhbCA9IFB5SW50X0FzTG9uZyhyZXN1bHQpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOworICAgICAgICByZXR2YWwgPSBFX0ZBSUw7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIFNUREFQSSBEbGxHZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsCi0JCQkgUkVGSUlEIHJpaWQsCi0JCQkgTFBWT0lEICpwcHYpCisgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEICpwcHYpCiB7Ci0JbG9uZyByZXN1bHQ7CisgICAgbG9uZyByZXN1bHQ7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1NUQVRFIHN0YXRlOworICAgIFB5R0lMU3RhdGVfU1RBVEUgc3RhdGU7CiAjZW5kaWYKIAotCUxvYWRQeXRob24oKTsKKyAgICBMb2FkUHl0aG9uKCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwogI2VuZGlmCi0JcmVzdWx0ID0gQ2FsbF9HZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik7CisgICAgcmVzdWx0ID0gQ2FsbF9HZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworICAgIFB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CiAjZW5kaWYKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGxvbmcgQ2FsbF9DYW5VbmxvYWROb3codm9pZCkKIHsKLQlQeU9iamVjdCAqbW9kLCAqZnVuYywgKnJlc3VsdDsKLQlsb25nIHJldHZhbDsKLQlzdGF0aWMgUHlPYmplY3QgKmNvbnRleHQ7CisgICAgUHlPYmplY3QgKm1vZCwgKmZ1bmMsICpyZXN1bHQ7CisgICAgbG9uZyByZXR2YWw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjb250ZXh0OwogCi0JaWYgKGNvbnRleHQgPT0gTlVMTCkKLQkJY29udGV4dCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9jdHlwZXMuRGxsQ2FuVW5sb2FkTm93Iik7CisgICAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICAgICAgY29udGV4dCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9jdHlwZXMuRGxsQ2FuVW5sb2FkTm93Iik7CiAKLQltb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJjdHlwZXMiKTsKLQlpZiAoIW1vZCkgewotLyoJCU91dHB1dERlYnVnU3RyaW5nKCJDb3VsZCBub3QgaW1wb3J0IGN0eXBlcyIpOyAqLwotCQkvKiBXZSBhc3N1bWUgdGhhdCB0aGlzIGVycm9yIGNhbiBvbmx5IG9jY3VyIHdoZW4gc2h1dHRpbmcKLQkJICAgZG93biwgc28gd2Ugc2lsZW50bHkgaWdub3JlIGl0ICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiBFX0ZBSUw7Ci0JfQotCS8qIE90aGVyIGVycm9ycyBjYW5ub3QgYmUgcmFpc2VkLCBidXQgYXJlIHByaW50ZWQgdG8gc3RkZXJyICovCi0JZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiRGxsQ2FuVW5sb2FkTm93Iik7Ci0JUHlfREVDUkVGKG1vZCk7Ci0JaWYgKCFmdW5jKSB7Ci0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOwotCQlyZXR1cm4gRV9GQUlMOwotCX0KKyAgICBtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJjdHlwZXMiKTsKKyAgICBpZiAoIW1vZCkgeworLyogICAgICAgICAgICAgIE91dHB1dERlYnVnU3RyaW5nKCJDb3VsZCBub3QgaW1wb3J0IGN0eXBlcyIpOyAqLworICAgICAgICAvKiBXZSBhc3N1bWUgdGhhdCB0aGlzIGVycm9yIGNhbiBvbmx5IG9jY3VyIHdoZW4gc2h1dHRpbmcKKyAgICAgICAgICAgZG93biwgc28gd2Ugc2lsZW50bHkgaWdub3JlIGl0ICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgfQorICAgIC8qIE90aGVyIGVycm9ycyBjYW5ub3QgYmUgcmFpc2VkLCBidXQgYXJlIHByaW50ZWQgdG8gc3RkZXJyICovCisgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiRGxsQ2FuVW5sb2FkTm93Iik7CisgICAgUHlfREVDUkVGKG1vZCk7CisgICAgaWYgKCFmdW5jKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOworICAgICAgICByZXR1cm4gRV9GQUlMOworICAgIH0KIAotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCBOVUxMKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JaWYgKCFyZXN1bHQpIHsKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7Ci0JCXJldHVybiBFX0ZBSUw7Ci0JfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgfQogCi0JcmV0dmFsID0gUHlJbnRfQXNMb25nKHJlc3VsdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7Ci0JCXJldHZhbCA9IEVfRkFJTDsKLQl9Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR2YWwgPSBQeUludF9Bc0xvbmcocmVzdWx0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgcmV0dmFsID0gRV9GQUlMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAvKgpAQCAtNjI1LDI2ICs2MjUsMjYgQEAKIAogU1REQVBJIERsbENhblVubG9hZE5vdyh2b2lkKQogewotCWxvbmcgcmVzdWx0OworICAgIGxvbmcgcmVzdWx0OwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlHSUxTdGF0ZV9TVEFURSBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgUHlHSUxTdGF0ZV9TVEFURSBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiAjZW5kaWYKLQlyZXN1bHQgPSBDYWxsX0NhblVubG9hZE5vdygpOworICAgIHJlc3VsdCA9IENhbGxfQ2FuVW5sb2FkTm93KCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworICAgIFB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CiAjZW5kaWYKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKICNpZm5kZWYgUHlfTk9fRU5BQkxFX1NIQVJFRAogQk9PTCBXSU5BUEkgRGxsTWFpbihISU5TVEFOQ0UgaGluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwdlJlcykKIHsKLQlzd2l0Y2goZmR3UmVhc29uKSB7Ci0JY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6Ci0JCURpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMoaGluc3RETEwpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgc3dpdGNoKGZkd1JlYXNvbikgeworICAgIGNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgorICAgICAgICBEaXNhYmxlVGhyZWFkTGlicmFyeUNhbGxzKGhpbnN0RExMKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKaW5kZXggYTU0M2U0OC4uMjY3MWQ3NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKQEAgLTksOSArOSw5IEBACiAgKi8KIC8qCiAgKiBSZWxhdGVkIFdvcms6Ci0gKgktIGNhbGxkbGwJaHR0cDovL3d3dy5uaWdodG1hcmUuY29tL3NvZnR3YXJlLmh0bWwKLSAqCS0gbGliZmZpCWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbGliZmZpLwotICoJLSBmZmNhbGwgCWh0dHA6Ly9jbGlzcC5jb25zLm9yZy9+aGFpYmxlL3BhY2thZ2VzLWZmY2FsbC5odG1sCisgKiAgICAgIC0gY2FsbGRsbCAgICAgICBodHRwOi8vd3d3Lm5pZ2h0bWFyZS5jb20vc29mdHdhcmUuaHRtbAorICogICAgICAtIGxpYmZmaSAgICAgICAgaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9saWJmZmkvCisgKiAgICAgIC0gZmZjYWxsICAgICAgICBodHRwOi8vY2xpc3AuY29ucy5vcmcvfmhhaWJsZS9wYWNrYWdlcy1mZmNhbGwuaHRtbAogICogICBhbmQsIG9mIGNvdXJzZSwgRG9uIEJlYXVkcnkncyBNRVNTIHBhY2thZ2UsIGJ1dCB0aGlzIGlzIG1vcmUgY3R5cGVzCiAgKiAgIHJlbGF0ZWQuCiAgKi8KQEAgLTk0LDcgKzk0LDcgQEAKICAgY3R5cGVzIG1haW50YWlucyB0aHJlYWQtbG9jYWwgc3RvcmFnZSB0aGF0IGhhcyBzcGFjZSBmb3IgdHdvIGVycm9yIG51bWJlcnM6CiAgIHByaXZhdGUgY29waWVzIG9mIHRoZSBzeXN0ZW0gJ2Vycm5vJyB2YWx1ZSBhbmQsIG9uIFdpbmRvd3MsIHRoZSBzeXN0ZW0gZXJyb3IgY29kZQogICBhY2Nlc3NlZCBieSB0aGUgR2V0TGFzdEVycm9yKCkgYW5kIFNldExhc3RFcnJvcigpIGFwaSBmdW5jdGlvbnMuCi0gIAorCiAgIEZvcmVpZ24gZnVuY3Rpb25zIGNyZWF0ZWQgd2l0aCBDRExMKC4uLiwgdXNlX2Vycm5vPVRydWUpLCB3aGVuIGNhbGxlZCwgc3dhcAogICB0aGUgc3lzdGVtICdlcnJubycgdmFsdWUgd2l0aCB0aGUgcHJpdmF0ZSBjb3B5IGp1c3QgYmVmb3JlIHRoZSBhY3R1YWwKICAgZnVuY3Rpb24gY2FsbCwgYW5kIHN3YXBwZWQgYWdhaW4gaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcy4gIFRoZSAndXNlX2Vycm5vJwpAQCAtMTI3LDkwICsxMjcsOTAgQEAKIFB5T2JqZWN0ICoKIF9jdHlwZXNfZ2V0X2Vycm9iaihpbnQgKipwc3BhY2UpCiB7Ci0JUHlPYmplY3QgKmRpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKLQlQeU9iamVjdCAqZXJyb2JqOwotCXN0YXRpYyBQeU9iamVjdCAqZXJyb3Jfb2JqZWN0X25hbWU7Ci0JaWYgKGRpY3QgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJjYW5ub3QgZ2V0IHRocmVhZCBzdGF0ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGVycm9yX29iamVjdF9uYW1lID09IE5VTEwpIHsKLQkJZXJyb3Jfb2JqZWN0X25hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJjdHlwZXMuZXJyb3Jfb2JqZWN0Iik7Ci0JCWlmIChlcnJvcl9vYmplY3RfbmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVycm9iaiA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIGVycm9yX29iamVjdF9uYW1lKTsKLQlpZiAoZXJyb2JqKSB7CisgICAgUHlPYmplY3QgKmRpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKKyAgICBQeU9iamVjdCAqZXJyb2JqOworICAgIHN0YXRpYyBQeU9iamVjdCAqZXJyb3Jfb2JqZWN0X25hbWU7CisgICAgaWYgKGRpY3QgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBnZXQgdGhyZWFkIHN0YXRlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZXJyb3Jfb2JqZWN0X25hbWUgPT0gTlVMTCkgeworICAgICAgICBlcnJvcl9vYmplY3RfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoImN0eXBlcy5lcnJvcl9vYmplY3QiKTsKKyAgICAgICAgaWYgKGVycm9yX29iamVjdF9uYW1lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXJyb2JqID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgZXJyb3Jfb2JqZWN0X25hbWUpOworICAgIGlmIChlcnJvYmopIHsKICNpZmRlZiBDVFlQRVNfVVNJTkdfQ0FQU1VMRQotCQlpZiAoIVB5Q2Fwc3VsZV9Jc1ZhbGlkKGVycm9iaiwgQ1RZUEVTX0NBUFNVTEVfRVJST1JPQkopKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJjdHlwZXMuZXJyb3Jfb2JqZWN0IGlzIGFuIGludmFsaWQgY2Fwc3VsZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKCFQeUNhcHN1bGVfSXNWYWxpZChlcnJvYmosIENUWVBFU19DQVBTVUxFX0VSUk9ST0JKKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAiY3R5cGVzLmVycm9yX29iamVjdCBpcyBhbiBpbnZhbGlkIGNhcHN1bGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAjZW5kaWYgLyogQ1RZUEVTX1VTSU5HX0NBUFNVTEUgKi8KLQkJUHlfSU5DUkVGKGVycm9iaik7Ci0JfQotCWVsc2UgewotCQl2b2lkICpzcGFjZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoaW50KSAqIDIpOwotCQlpZiAoc3BhY2UgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQltZW1zZXQoc3BhY2UsIDAsIHNpemVvZihpbnQpICogMik7Ci0JCWVycm9iaiA9IENBUFNVTEVfTkVXKHNwYWNlLCBDVFlQRVNfQ0FQU1VMRV9FUlJPUk9CSik7Ci0JCWlmIChlcnJvYmogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoLTEgPT0gUHlEaWN0X1NldEl0ZW0oZGljdCwgZXJyb3Jfb2JqZWN0X25hbWUsCi0JCQkJCSBlcnJvYmopKSB7Ci0JCQlQeV9ERUNSRUYoZXJyb2JqKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCSpwc3BhY2UgPSAoaW50ICopQ0FQU1VMRV9ERVJFRkVSRU5DRShlcnJvYmosIENUWVBFU19DQVBTVUxFX0VSUk9ST0JKKTsKLQlyZXR1cm4gZXJyb2JqOworICAgICAgICBQeV9JTkNSRUYoZXJyb2JqKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHZvaWQgKnNwYWNlID0gUHlNZW1fTWFsbG9jKHNpemVvZihpbnQpICogMik7CisgICAgICAgIGlmIChzcGFjZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG1lbXNldChzcGFjZSwgMCwgc2l6ZW9mKGludCkgKiAyKTsKKyAgICAgICAgZXJyb2JqID0gQ0FQU1VMRV9ORVcoc3BhY2UsIENUWVBFU19DQVBTVUxFX0VSUk9ST0JKKTsKKyAgICAgICAgaWYgKGVycm9iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICgtMSA9PSBQeURpY3RfU2V0SXRlbShkaWN0LCBlcnJvcl9vYmplY3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9iaikpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlcnJvYmopOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBzcGFjZSA9IChpbnQgKilDQVBTVUxFX0RFUkVGRVJFTkNFKGVycm9iaiwgQ1RZUEVTX0NBUFNVTEVfRVJST1JPQkopOworICAgIHJldHVybiBlcnJvYmo7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfZXJyb3JfaW50ZXJuYWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgaW5kZXgpCiB7Ci0JaW50ICpzcGFjZTsKLQlQeU9iamVjdCAqZXJyb2JqID0gX2N0eXBlc19nZXRfZXJyb2JqKCZzcGFjZSk7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgKnNwYWNlOworICAgIFB5T2JqZWN0ICplcnJvYmogPSBfY3R5cGVzX2dldF9lcnJvYmooJnNwYWNlKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKGVycm9iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhzcGFjZVtpbmRleF0pOwotCVB5X0RFQ1JFRihlcnJvYmopOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKGVycm9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhzcGFjZVtpbmRleF0pOworICAgIFB5X0RFQ1JFRihlcnJvYmopOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfZXJyb3JfaW50ZXJuYWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgaW5kZXgpCiB7Ci0JaW50IG5ld19lcnJubywgb2xkX2Vycm5vOwotCVB5T2JqZWN0ICplcnJvYmo7Ci0JaW50ICpzcGFjZTsKKyAgICBpbnQgbmV3X2Vycm5vLCBvbGRfZXJybm87CisgICAgUHlPYmplY3QgKmVycm9iajsKKyAgICBpbnQgKnNwYWNlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJm5ld19lcnJubykpCi0JCXJldHVybiBOVUxMOwotCWVycm9iaiA9IF9jdHlwZXNfZ2V0X2Vycm9iaigmc3BhY2UpOwotCWlmIChlcnJvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb2xkX2Vycm5vID0gc3BhY2VbaW5kZXhdOwotCXNwYWNlW2luZGV4XSA9IG5ld19lcnJubzsKLQlQeV9ERUNSRUYoZXJyb2JqKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcob2xkX2Vycm5vKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmbmV3X2Vycm5vKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyb2JqID0gX2N0eXBlc19nZXRfZXJyb2JqKCZzcGFjZSk7CisgICAgaWYgKGVycm9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvbGRfZXJybm8gPSBzcGFjZVtpbmRleF07CisgICAgc3BhY2VbaW5kZXhdID0gbmV3X2Vycm5vOworICAgIFB5X0RFQ1JFRihlcnJvYmopOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhvbGRfZXJybm8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2Vycm5vKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2V0X2Vycm9yX2ludGVybmFsKHNlbGYsIGFyZ3MsIDApOworICAgIHJldHVybiBnZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfZXJybm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMCk7CisgICAgcmV0dXJuIHNldF9lcnJvcl9pbnRlcm5hbChzZWxmLCBhcmdzLCAwKTsKIH0KIAogI2lmZGVmIE1TX1dJTjMyCkBAIC0yMTgsMjAyICsyMTgsMjAyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2xhc3RfZXJyb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMSk7CisgICAgcmV0dXJuIGdldF9lcnJvcl9pbnRlcm5hbChzZWxmLCBhcmdzLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9sYXN0X2Vycm9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc2V0X2Vycm9yX2ludGVybmFsKHNlbGYsIGFyZ3MsIDEpOworICAgIHJldHVybiBzZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMSk7CiB9CiAKIFB5T2JqZWN0ICpDb21FcnJvcjsKIAogc3RhdGljIFRDSEFSICpGb3JtYXRFcnJvcihEV09SRCBjb2RlKQogewotCVRDSEFSICpscE1zZ0J1ZjsKLQlEV09SRCBuOwotCW4gPSBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAotCQkJICBOVUxMLAotCQkJICBjb2RlLAotCQkJICBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwgLyogRGVmYXVsdCBsYW5ndWFnZSAqLwotCQkJICAoTFBUU1RSKSAmbHBNc2dCdWYsCi0JCQkgIDAsCi0JCQkgIE5VTEwpOwotCWlmIChuKSB7Ci0JCXdoaWxlIChfaXN0c3BhY2UobHBNc2dCdWZbbi0xXSkpCi0JCQktLW47Ci0JCWxwTXNnQnVmW25dID0gX1QoJ1wwJyk7IC8qIHJzdHJpcCgpICovCi0JfQotCXJldHVybiBscE1zZ0J1ZjsKKyAgICBUQ0hBUiAqbHBNc2dCdWY7CisgICAgRFdPUkQgbjsKKyAgICBuID0gRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksIC8qIERlZmF1bHQgbGFuZ3VhZ2UgKi8KKyAgICAgICAgICAgICAgKExQVFNUUikgJmxwTXNnQnVmLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICBOVUxMKTsKKyAgICBpZiAobikgeworICAgICAgICB3aGlsZSAoX2lzdHNwYWNlKGxwTXNnQnVmW24tMV0pKQorICAgICAgICAgICAgLS1uOworICAgICAgICBscE1zZ0J1ZltuXSA9IF9UKCdcMCcpOyAvKiByc3RyaXAoKSAqLworICAgIH0KKyAgICByZXR1cm4gbHBNc2dCdWY7CiB9CiAKICNpZm5kZWYgRE9OVF9VU0VfU0VICiBzdGF0aWMgdm9pZCBTZXRFeGNlcHRpb24oRFdPUkQgY29kZSwgRVhDRVBUSU9OX1JFQ09SRCAqcHIpCiB7Ci0JLyogVGhlICdjb2RlJyBpcyBhIG5vcm1hbCB3aW4zMiBlcnJvciBjb2RlIHNvIGl0IGNvdWxkIGJlIGhhbmRsZWQgYnkKLQlQeUVycl9TZXRGcm9tV2luZG93c0VycigpLiBIb3dldmVyLCBmb3Igc29tZSBlcnJvcnMsIHdlIGhhdmUgYWRkaXRpb25hbAotCWluZm9ybWF0aW9uIG5vdCBpbmNsdWRlZCBpbiB0aGUgZXJyb3IgY29kZS4gV2UgaGFuZGxlIHRob3NlIGhlcmUgYW5kCi0JZGVsZWdhdGUgYWxsIG90aGVycyB0byB0aGUgZ2VuZXJpYyBmdW5jdGlvbi4gKi8KLQlzd2l0Y2ggKGNvZGUpIHsKLQljYXNlIEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OOgotCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byByZWFkIGZyb20gb3Igd3JpdGUKLQkJICAgdG8gYSB2aXJ0dWFsIGFkZHJlc3MgZm9yIHdoaWNoIGl0IGRvZXMgbm90Ci0JCSAgIGhhdmUgdGhlIGFwcHJvcHJpYXRlIGFjY2Vzcy4gKi8KLQkJaWYgKHByLT5FeGNlcHRpb25JbmZvcm1hdGlvblswXSA9PSAwKQotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkgICAgICJleGNlcHRpb246IGFjY2VzcyB2aW9sYXRpb24gcmVhZGluZyAlcCIsCi0JCQkJICAgICBwci0+RXhjZXB0aW9uSW5mb3JtYXRpb25bMV0pOwotCQllbHNlCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCSAgICAgImV4Y2VwdGlvbjogYWNjZXNzIHZpb2xhdGlvbiB3cml0aW5nICVwIiwKLQkJCQkgICAgIHByLT5FeGNlcHRpb25JbmZvcm1hdGlvblsxXSk7Ci0JCWJyZWFrOworICAgIC8qIFRoZSAnY29kZScgaXMgYSBub3JtYWwgd2luMzIgZXJyb3IgY29kZSBzbyBpdCBjb3VsZCBiZSBoYW5kbGVkIGJ5CisgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoKS4gSG93ZXZlciwgZm9yIHNvbWUgZXJyb3JzLCB3ZSBoYXZlIGFkZGl0aW9uYWwKKyAgICBpbmZvcm1hdGlvbiBub3QgaW5jbHVkZWQgaW4gdGhlIGVycm9yIGNvZGUuIFdlIGhhbmRsZSB0aG9zZSBoZXJlIGFuZAorICAgIGRlbGVnYXRlIGFsbCBvdGhlcnMgdG8gdGhlIGdlbmVyaWMgZnVuY3Rpb24uICovCisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgY2FzZSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTjoKKyAgICAgICAgLyogVGhlIHRocmVhZCBhdHRlbXB0ZWQgdG8gcmVhZCBmcm9tIG9yIHdyaXRlCisgICAgICAgICAgIHRvIGEgdmlydHVhbCBhZGRyZXNzIGZvciB3aGljaCBpdCBkb2VzIG5vdAorICAgICAgICAgICBoYXZlIHRoZSBhcHByb3ByaWF0ZSBhY2Nlc3MuICovCisgICAgICAgIGlmIChwci0+RXhjZXB0aW9uSW5mb3JtYXRpb25bMF0gPT0gMCkKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogYWNjZXNzIHZpb2xhdGlvbiByZWFkaW5nICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwci0+RXhjZXB0aW9uSW5mb3JtYXRpb25bMV0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGFjY2VzcyB2aW9sYXRpb24gd3JpdGluZyAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHItPkV4Y2VwdGlvbkluZm9ybWF0aW9uWzFdKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEVYQ0VQVElPTl9CUkVBS1BPSU5UOgotCQkvKiBBIGJyZWFrcG9pbnQgd2FzIGVuY291bnRlcmVkLiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCSJleGNlcHRpb246IGJyZWFrcG9pbnQgZW5jb3VudGVyZWQiKTsKLQkJYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fQlJFQUtQT0lOVDoKKyAgICAgICAgLyogQSBicmVha3BvaW50IHdhcyBlbmNvdW50ZXJlZC4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGJyZWFrcG9pbnQgZW5jb3VudGVyZWQiKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEVYQ0VQVElPTl9EQVRBVFlQRV9NSVNBTElHTk1FTlQ6Ci0JCS8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIHJlYWQgb3Igd3JpdGUgZGF0YSB0aGF0IGlzCi0JCSAgIG1pc2FsaWduZWQgb24gaGFyZHdhcmUgdGhhdCBkb2VzIG5vdCBwcm92aWRlCi0JCSAgIGFsaWdubWVudC4gRm9yIGV4YW1wbGUsIDE2LWJpdCB2YWx1ZXMgbXVzdCBiZQotCQkgICBhbGlnbmVkIG9uIDItYnl0ZSBib3VuZGFyaWVzLCAzMi1iaXQgdmFsdWVzIG9uCi0JCSAgIDQtYnl0ZSBib3VuZGFyaWVzLCBhbmQgc28gb24uICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJImV4Y2VwdGlvbjogZGF0YXR5cGUgbWlzYWxpZ25tZW50Iik7Ci0JCWJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX0RBVEFUWVBFX01JU0FMSUdOTUVOVDoKKyAgICAgICAgLyogVGhlIHRocmVhZCBhdHRlbXB0ZWQgdG8gcmVhZCBvciB3cml0ZSBkYXRhIHRoYXQgaXMKKyAgICAgICAgICAgbWlzYWxpZ25lZCBvbiBoYXJkd2FyZSB0aGF0IGRvZXMgbm90IHByb3ZpZGUKKyAgICAgICAgICAgYWxpZ25tZW50LiBGb3IgZXhhbXBsZSwgMTYtYml0IHZhbHVlcyBtdXN0IGJlCisgICAgICAgICAgIGFsaWduZWQgb24gMi1ieXRlIGJvdW5kYXJpZXMsIDMyLWJpdCB2YWx1ZXMgb24KKyAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJpZXMsIGFuZCBzbyBvbi4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGRhdGF0eXBlIG1pc2FsaWdubWVudCIpOworICAgICAgICBicmVhazsKIAotCWNhc2UgRVhDRVBUSU9OX1NJTkdMRV9TVEVQOgotCQkvKiBBIHRyYWNlIHRyYXAgb3Igb3RoZXIgc2luZ2xlLWluc3RydWN0aW9uIG1lY2hhbmlzbQotCQkgICBzaWduYWxlZCB0aGF0IG9uZSBpbnN0cnVjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkiZXhjZXB0aW9uOiBzaW5nbGUgc3RlcCIpOwotCQlicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9TSU5HTEVfU1RFUDoKKyAgICAgICAgLyogQSB0cmFjZSB0cmFwIG9yIG90aGVyIHNpbmdsZS1pbnN0cnVjdGlvbiBtZWNoYW5pc20KKyAgICAgICAgICAgc2lnbmFsZWQgdGhhdCBvbmUgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBzaW5nbGUgc3RlcCIpOworICAgICAgICBicmVhazsKIAotCWNhc2UgRVhDRVBUSU9OX0FSUkFZX0JPVU5EU19FWENFRURFRDogCi0JCS8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIGFjY2VzcyBhbiBhcnJheSBlbGVtZW50Ci0JCSAgIHRoYXQgaXMgb3V0IG9mIGJvdW5kcywgYW5kIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlCi0JCSAgIHN1cHBvcnRzIGJvdW5kcyBjaGVja2luZy4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkiZXhjZXB0aW9uOiBhcnJheSBib3VuZHMgZXhjZWVkZWQiKTsKLQkJYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fQVJSQVlfQk9VTkRTX0VYQ0VFREVEOgorICAgICAgICAvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBhY2Nlc3MgYW4gYXJyYXkgZWxlbWVudAorICAgICAgICAgICB0aGF0IGlzIG91dCBvZiBib3VuZHMsIGFuZCB0aGUgdW5kZXJseWluZyBoYXJkd2FyZQorICAgICAgICAgICBzdXBwb3J0cyBib3VuZHMgY2hlY2tpbmcuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBhcnJheSBib3VuZHMgZXhjZWVkZWQiKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEVYQ0VQVElPTl9GTFRfREVOT1JNQUxfT1BFUkFORDoKLQkJLyogT25lIG9mIHRoZSBvcGVyYW5kcyBpbiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbgotCQkgICBpcyBkZW5vcm1hbC4gQSBkZW5vcm1hbCB2YWx1ZSBpcyBvbmUgdGhhdCBpcyB0b28KLQkJICAgc21hbGwgdG8gcmVwcmVzZW50IGFzIGEgc3RhbmRhcmQgZmxvYXRpbmctcG9pbnQKLQkJICAgdmFsdWUuICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJImV4Y2VwdGlvbjogZmxvYXRpbmctcG9pbnQgb3BlcmFuZCBkZW5vcm1hbCIpOwotCQlicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9GTFRfREVOT1JNQUxfT1BFUkFORDoKKyAgICAgICAgLyogT25lIG9mIHRoZSBvcGVyYW5kcyBpbiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbgorICAgICAgICAgICBpcyBkZW5vcm1hbC4gQSBkZW5vcm1hbCB2YWx1ZSBpcyBvbmUgdGhhdCBpcyB0b28KKyAgICAgICAgICAgc21hbGwgdG8gcmVwcmVzZW50IGFzIGEgc3RhbmRhcmQgZmxvYXRpbmctcG9pbnQKKyAgICAgICAgICAgdmFsdWUuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBmbG9hdGluZy1wb2ludCBvcGVyYW5kIGRlbm9ybWFsIik7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBFWENFUFRJT05fRkxUX0RJVklERV9CWV9aRVJPOgotCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBkaXZpZGUgYSBmbG9hdGluZy1wb2ludAotCQkgICB2YWx1ZSBieSBhIGZsb2F0aW5nLXBvaW50IGRpdmlzb3Igb2YgemVyby4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkiZXhjZXB0aW9uOiBmbG9hdCBkaXZpZGUgYnkgemVybyIpOwotCQlicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9GTFRfRElWSURFX0JZX1pFUk86CisgICAgICAgIC8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIGRpdmlkZSBhIGZsb2F0aW5nLXBvaW50CisgICAgICAgICAgIHZhbHVlIGJ5IGEgZmxvYXRpbmctcG9pbnQgZGl2aXNvciBvZiB6ZXJvLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogZmxvYXQgZGl2aWRlIGJ5IHplcm8iKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEVYQ0VQVElPTl9GTFRfSU5FWEFDVF9SRVNVTFQ6Ci0JCS8qIFRoZSByZXN1bHQgb2YgYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gY2Fubm90IGJlCi0JCSAgIHJlcHJlc2VudGVkIGV4YWN0bHkgYXMgYSBkZWNpbWFsIGZyYWN0aW9uLiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCSJleGNlcHRpb246IGZsb2F0IGluZXhhY3QiKTsKLQkJYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fRkxUX0lORVhBQ1RfUkVTVUxUOgorICAgICAgICAvKiBUaGUgcmVzdWx0IG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIGNhbm5vdCBiZQorICAgICAgICAgICByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgZGVjaW1hbCBmcmFjdGlvbi4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGZsb2F0IGluZXhhY3QiKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEVYQ0VQVElPTl9GTFRfSU5WQUxJRF9PUEVSQVRJT046Ci0JCS8qIFRoaXMgZXhjZXB0aW9uIHJlcHJlc2VudHMgYW55IGZsb2F0aW5nLXBvaW50Ci0JCSAgIGV4Y2VwdGlvbiBub3QgaW5jbHVkZWQgaW4gdGhpcyBsaXN0LiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCSJleGNlcHRpb246IGZsb2F0IGludmFsaWQgb3BlcmF0aW9uIik7Ci0JCWJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX0ZMVF9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgLyogVGhpcyBleGNlcHRpb24gcmVwcmVzZW50cyBhbnkgZmxvYXRpbmctcG9pbnQKKyAgICAgICAgICAgZXhjZXB0aW9uIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBmbG9hdCBpbnZhbGlkIG9wZXJhdGlvbiIpOworICAgICAgICBicmVhazsKIAotCWNhc2UgRVhDRVBUSU9OX0ZMVF9PVkVSRkxPVzoKLQkJLyogVGhlIGV4cG9uZW50IG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIGlzCi0JCSAgIGdyZWF0ZXIgdGhhbiB0aGUgbWFnbml0dWRlIGFsbG93ZWQgYnkgdGhlCi0JCSAgIGNvcnJlc3BvbmRpbmcgdHlwZS4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkiZXhjZXB0aW9uOiBmbG9hdCBvdmVyZmxvdyIpOwotCQlicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9GTFRfT1ZFUkZMT1c6CisgICAgICAgIC8qIFRoZSBleHBvbmVudCBvZiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbiBpcworICAgICAgICAgICBncmVhdGVyIHRoYW4gdGhlIG1hZ25pdHVkZSBhbGxvd2VkIGJ5IHRoZQorICAgICAgICAgICBjb3JyZXNwb25kaW5nIHR5cGUuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBmbG9hdCBvdmVyZmxvdyIpOworICAgICAgICBicmVhazsKIAotCWNhc2UgRVhDRVBUSU9OX0ZMVF9TVEFDS19DSEVDSzoKLQkJLyogVGhlIHN0YWNrIG92ZXJmbG93ZWQgb3IgdW5kZXJmbG93ZWQgYXMgdGhlIHJlc3VsdAotCQkgICBvZiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbi4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkiZXhjZXB0aW9uOiBzdGFjayBvdmVyL3VuZGVyZmxvdyIpOwotCQlicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9GTFRfU1RBQ0tfQ0hFQ0s6CisgICAgICAgIC8qIFRoZSBzdGFjayBvdmVyZmxvd2VkIG9yIHVuZGVyZmxvd2VkIGFzIHRoZSByZXN1bHQKKyAgICAgICAgICAgb2YgYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24uICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBzdGFjayBvdmVyL3VuZGVyZmxvdyIpOworICAgICAgICBicmVhazsKIAotCWNhc2UgRVhDRVBUSU9OX1NUQUNLX09WRVJGTE9XOgotCQkvKiBUaGUgc3RhY2sgb3ZlcmZsb3dlZCBvciB1bmRlcmZsb3dlZCBhcyB0aGUgcmVzdWx0Ci0JCSAgIG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uLiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCSJleGNlcHRpb246IHN0YWNrIG92ZXJmbG93Iik7Ci0JCWJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX1NUQUNLX09WRVJGTE9XOgorICAgICAgICAvKiBUaGUgc3RhY2sgb3ZlcmZsb3dlZCBvciB1bmRlcmZsb3dlZCBhcyB0aGUgcmVzdWx0CisgICAgICAgICAgIG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogc3RhY2sgb3ZlcmZsb3ciKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEVYQ0VQVElPTl9GTFRfVU5ERVJGTE9XOgotCQkvKiBUaGUgZXhwb25lbnQgb2YgYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gaXMgbGVzcwotCQkgICB0aGFuIHRoZSBtYWduaXR1ZGUgYWxsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZwotCQkgICB0eXBlLiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCSJleGNlcHRpb246IGZsb2F0IHVuZGVyZmxvdyIpOwotCQlicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9GTFRfVU5ERVJGTE9XOgorICAgICAgICAvKiBUaGUgZXhwb25lbnQgb2YgYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gaXMgbGVzcworICAgICAgICAgICB0aGFuIHRoZSBtYWduaXR1ZGUgYWxsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICB0eXBlLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogZmxvYXQgdW5kZXJmbG93Iik7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBFWENFUFRJT05fSU5UX0RJVklERV9CWV9aRVJPOgotCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBkaXZpZGUgYW4gaW50ZWdlciB2YWx1ZSBieQotCQkgICBhbiBpbnRlZ2VyIGRpdmlzb3Igb2YgemVyby4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkiZXhjZXB0aW9uOiBpbnRlZ2VyIGRpdmlkZSBieSB6ZXJvIik7Ci0JCWJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTzoKKyAgICAgICAgLyogVGhlIHRocmVhZCBhdHRlbXB0ZWQgdG8gZGl2aWRlIGFuIGludGVnZXIgdmFsdWUgYnkKKyAgICAgICAgICAgYW4gaW50ZWdlciBkaXZpc29yIG9mIHplcm8uICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBpbnRlZ2VyIGRpdmlkZSBieSB6ZXJvIik7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBFWENFUFRJT05fSU5UX09WRVJGTE9XOgotCQkvKiBUaGUgcmVzdWx0IG9mIGFuIGludGVnZXIgb3BlcmF0aW9uIGNhdXNlZCBhIGNhcnJ5Ci0JCSAgIG91dCBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIHJlc3VsdC4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkiZXhjZXB0aW9uOiBpbnRlZ2VyIG92ZXJmbG93Iik7Ci0JCWJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX0lOVF9PVkVSRkxPVzoKKyAgICAgICAgLyogVGhlIHJlc3VsdCBvZiBhbiBpbnRlZ2VyIG9wZXJhdGlvbiBjYXVzZWQgYSBjYXJyeQorICAgICAgICAgICBvdXQgb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSByZXN1bHQuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBpbnRlZ2VyIG92ZXJmbG93Iik7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBFWENFUFRJT05fUFJJVl9JTlNUUlVDVElPTjoKLQkJLyogVGhlIHRocmVhZCBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSBhbiBpbnN0cnVjdGlvbgotCQkgICB3aG9zZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQKLQkJICAgbWFjaGluZSBtb2RlLiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCSJleGNlcHRpb246IHByaXZpbGVkZ2VkIGluc3RydWN0aW9uIik7Ci0JCWJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX1BSSVZfSU5TVFJVQ1RJT046CisgICAgICAgIC8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIGV4ZWN1dGUgYW4gaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgd2hvc2Ugb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50CisgICAgICAgICAgIG1hY2hpbmUgbW9kZS4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IHByaXZpbGVkZ2VkIGluc3RydWN0aW9uIik7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBFWENFUFRJT05fTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OOgotCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBjb250aW51ZSBleGVjdXRpb24gYWZ0ZXIgYQotCQkgICBub25jb250aW51YWJsZSBleGNlcHRpb24gb2NjdXJyZWQuICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJImV4Y2VwdGlvbjogbm9jb250aW51YWJsZSIpOwotCQlicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9OT05DT05USU5VQUJMRV9FWENFUFRJT046CisgICAgICAgIC8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIGNvbnRpbnVlIGV4ZWN1dGlvbiBhZnRlciBhCisgICAgICAgICAgIG5vbmNvbnRpbnVhYmxlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IG5vY29udGludWFibGUiKTsKKyAgICAgICAgYnJlYWs7CiAKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRGcm9tV2luZG93c0Vycihjb2RlKTsKLQkJYnJlYWs7Ci0JfQorICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGNvZGUpOworICAgICAgICBicmVhazsKKyAgICB9CiB9CiAKIHN0YXRpYyBEV09SRCBIYW5kbGVFeGNlcHRpb24oRVhDRVBUSU9OX1BPSU5URVJTICpwdHJzLAotCQkJICAgICBEV09SRCAqcGR3LCBFWENFUFRJT05fUkVDT1JEICpyZWNvcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpwZHcsIEVYQ0VQVElPTl9SRUNPUkQgKnJlY29yZCkKIHsKLQkqcGR3ID0gcHRycy0+RXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25Db2RlOwotCSpyZWNvcmQgPSAqcHRycy0+RXhjZXB0aW9uUmVjb3JkOwotCXJldHVybiBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSOworICAgICpwZHcgPSBwdHJzLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkNvZGU7CisgICAgKnJlY29yZCA9ICpwdHJzLT5FeGNlcHRpb25SZWNvcmQ7CisgICAgcmV0dXJuIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVI7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNoZWNrX2hyZXN1bHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhSRVNVTFQgaHI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJmhyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKEZBSUxFRChocikpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0Vycihocik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGhyKTsKKyAgICBIUkVTVUxUIGhyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZocikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChGQUlMRUQoaHIpKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoaHIpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhocik7CiB9CiAKICNlbmRpZgpAQCAtNDIzLDEzMiArNDIzLDEzMiBAQAogUHlDQXJnT2JqZWN0ICoKIFB5Q0FyZ09iamVjdF9uZXcodm9pZCkKIHsKLQlQeUNBcmdPYmplY3QgKnA7Ci0JcCA9IFB5T2JqZWN0X05ldyhQeUNBcmdPYmplY3QsICZQeUNBcmdfVHlwZSk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcC0+cGZmaV90eXBlID0gTlVMTDsKLQlwLT50YWcgPSAnXDAnOwotCXAtPm9iaiA9IE5VTEw7Ci0JbWVtc2V0KCZwLT52YWx1ZSwgMCwgc2l6ZW9mKHAtPnZhbHVlKSk7Ci0JcmV0dXJuIHA7CisgICAgUHlDQXJnT2JqZWN0ICpwOworICAgIHAgPSBQeU9iamVjdF9OZXcoUHlDQXJnT2JqZWN0LCAmUHlDQXJnX1R5cGUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPnBmZmlfdHlwZSA9IE5VTEw7CisgICAgcC0+dGFnID0gJ1wwJzsKKyAgICBwLT5vYmogPSBOVUxMOworICAgIG1lbXNldCgmcC0+dmFsdWUsIDAsIHNpemVvZihwLT52YWx1ZSkpOworICAgIHJldHVybiBwOwogfQogCiBzdGF0aWMgdm9pZAogUHlDQXJnX2RlYWxsb2MoUHlDQXJnT2JqZWN0ICpzZWxmKQogewotCVB5X1hERUNSRUYoc2VsZi0+b2JqKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYmopOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q0FyZ19yZXByKFB5Q0FyZ09iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZmZlclsyNTZdOwotCXN3aXRjaChzZWxmLT50YWcpIHsKLQljYXNlICdiJzoKLQljYXNlICdCJzoKLQkJc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVkKT4iLAotCQkJc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5iKTsKLQkJYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JY2FzZSAnSCc6Ci0JCXNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglZCk+IiwKLQkJCXNlbGYtPnRhZywgc2VsZi0+dmFsdWUuaCk7Ci0JCWJyZWFrOwotCWNhc2UgJ2knOgotCWNhc2UgJ0knOgotCQlzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWQpPiIsCi0JCQlzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmkpOwotCQlicmVhazsKLQljYXNlICdsJzoKLQljYXNlICdMJzoKLQkJc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVsZCk+IiwKLQkJCXNlbGYtPnRhZywgc2VsZi0+dmFsdWUubCk7Ci0JCWJyZWFrOwotCQkKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCWNhc2UgJ3EnOgotCWNhc2UgJ1EnOgotCQlzcHJpbnRmKGJ1ZmZlciwKLSNpZmRlZiBNU19XSU4zMgotCQkJIjxjcGFyYW0gJyVjJyAoJUk2NGQpPiIsCi0jZWxzZQotCQkJIjxjcGFyYW0gJyVjJyAoJXFkKT4iLAotI2VuZGlmCi0JCQlzZWxmLT50YWcsIHNlbGYtPnZhbHVlLnEpOwotCQlicmVhazsKLSNlbmRpZgotCWNhc2UgJ2QnOgotCQlzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWYpPiIsCi0JCQlzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmQpOwotCQlicmVhazsKLQljYXNlICdmJzoKLQkJc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVmKT4iLAotCQkJc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5mKTsKLQkJYnJlYWs7CisgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICBzd2l0Y2goc2VsZi0+dGFnKSB7CisgICAgY2FzZSAnYic6CisgICAgY2FzZSAnQic6CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglZCk+IiwKKyAgICAgICAgICAgIHNlbGYtPnRhZywgc2VsZi0+dmFsdWUuYik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOgorICAgIGNhc2UgJ0gnOgorICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWQpPiIsCisgICAgICAgICAgICBzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdpJzoKKyAgICBjYXNlICdJJzoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVkKT4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5pKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgY2FzZSAnTCc6CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglbGQpPiIsCisgICAgICAgICAgICBzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmwpOworICAgICAgICBicmVhazsKIAotCWNhc2UgJ2MnOgotCQlzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWMpPiIsCi0JCQlzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmMpOwotCQlicmVhazsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICAgIGNhc2UgJ3EnOgorICAgIGNhc2UgJ1EnOgorICAgICAgICBzcHJpbnRmKGJ1ZmZlciwKKyNpZmRlZiBNU19XSU4zMgorICAgICAgICAgICAgIjxjcGFyYW0gJyVjJyAoJUk2NGQpPiIsCisjZWxzZQorICAgICAgICAgICAgIjxjcGFyYW0gJyVjJyAoJXFkKT4iLAorI2VuZGlmCisgICAgICAgICAgICBzZWxmLT50YWcsIHNlbGYtPnZhbHVlLnEpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgJ2QnOgorICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWYpPiIsCisgICAgICAgICAgICBzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdmJzoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVmKT4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5mKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdjJzoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVjKT4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5jKTsKKyAgICAgICAgYnJlYWs7CiAKIC8qIEhtLCBhcmUgdGhlc2UgJ3onIGFuZCAnWicgY29kZXMgdXNlZnVsIGF0IGFsbD8KICAgIFNob3VsZG4ndCB0aGV5IGJlIHJlcGxhY2VkIGJ5IHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNfc3RyaW5nCiAgICBhbmQgY193c3RyaW5nID8KICovCi0JY2FzZSAneic6Ci0JY2FzZSAnWic6Ci0JY2FzZSAnUCc6Ci0JCXNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglcCk+IiwKLQkJCXNlbGYtPnRhZywgc2VsZi0+dmFsdWUucCk7Ci0JCWJyZWFrOworICAgIGNhc2UgJ3onOgorICAgIGNhc2UgJ1onOgorICAgIGNhc2UgJ1AnOgorICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJXApPiIsCisgICAgICAgICAgICBzZWxmLT50YWcsIHNlbGYtPnZhbHVlLnApOworICAgICAgICBicmVhazsKIAotCWRlZmF1bHQ6Ci0JCXNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnIGF0ICVwPiIsCi0JCQlzZWxmLT50YWcsIHNlbGYpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyBhdCAlcD4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CiB9CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBQeUNBcmdUeXBlX21lbWJlcnNbXSA9IHsKLQl7ICJfb2JqIiwgVF9PQkpFQ1QsCi0JICBvZmZzZXRvZihQeUNBcmdPYmplY3QsIG9iaiksIFJFQURPTkxZLAotCSAgInRoZSB3cmFwcGVkIG9iamVjdCIgfSwKLQl7IE5VTEwgfSwKKyAgICB7ICJfb2JqIiwgVF9PQkpFQ1QsCisgICAgICBvZmZzZXRvZihQeUNBcmdPYmplY3QsIG9iaiksIFJFQURPTkxZLAorICAgICAgInRoZSB3cmFwcGVkIG9iamVjdCIgfSwKKyAgICB7IE5VTEwgfSwKIH07CiAKIFB5VHlwZU9iamVjdCBQeUNBcmdfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiQ0FyZ09iamVjdCIsCi0Jc2l6ZW9mKFB5Q0FyZ09iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilQeUNBcmdfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpUHlDQXJnX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JUHlDQXJnVHlwZV9tZW1iZXJzLAkJCS8qIHRwX21lbWJlcnMgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiQ0FyZ09iamVjdCIsCisgICAgc2l6ZW9mKFB5Q0FyZ09iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilQeUNBcmdfZGVhbGxvYywgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKVB5Q0FyZ19yZXByLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBQeUNBcmdUeXBlX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTgxLDI0ICs1ODEsMjQgQEAKICAqLwogCiB1bmlvbiByZXN1bHQgewotCWNoYXIgYzsKLQljaGFyIGI7Ci0Jc2hvcnQgaDsKLQlpbnQgaTsKLQlsb25nIGw7CisgICAgY2hhciBjOworICAgIGNoYXIgYjsKKyAgICBzaG9ydCBoOworICAgIGludCBpOworICAgIGxvbmcgbDsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCVBZX0xPTkdfTE9ORyBxOworICAgIFBZX0xPTkdfTE9ORyBxOwogI2VuZGlmCi0JbG9uZyBkb3VibGUgRDsKLQlkb3VibGUgZDsKLQlmbG9hdCBmOwotCXZvaWQgKnA7CisgICAgbG9uZyBkb3VibGUgRDsKKyAgICBkb3VibGUgZDsKKyAgICBmbG9hdCBmOworICAgIHZvaWQgKnA7CiB9OwogCiBzdHJ1Y3QgYXJndW1lbnQgewotCWZmaV90eXBlICpmZmlfdHlwZTsKLQlQeU9iamVjdCAqa2VlcDsKLQl1bmlvbiByZXN1bHQgdmFsdWU7CisgICAgZmZpX3R5cGUgKmZmaV90eXBlOworICAgIFB5T2JqZWN0ICprZWVwOworICAgIHVuaW9uIHJlc3VsdCB2YWx1ZTsKIH07CiAKIC8qCkBAIC02MDYsMTQwICs2MDYsMTQwIEBACiAgKi8KIHN0YXRpYyBpbnQgQ29udlBhcmFtKFB5T2JqZWN0ICpvYmosIFB5X3NzaXplX3QgaW5kZXgsIHN0cnVjdCBhcmd1bWVudCAqcGEpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlwYS0+a2VlcCA9IE5VTEw7IC8qIHNvIHdlIGNhbm5vdCBmb3JnZXQgaXQgbGF0ZXIgKi8KKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIHBhLT5rZWVwID0gTlVMTDsgLyogc28gd2UgY2Fubm90IGZvcmdldCBpdCBsYXRlciAqLwogCi0JZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3Qob2JqKTsKLQlpZiAoZGljdCkgewotCQlQeUNBcmdPYmplY3QgKmNhcmc7Ci0JCWFzc2VydChkaWN0LT5wYXJhbWZ1bmMpOwotCQkvKiBJZiBpdCBoYXMgYW4gc3RnZGljdCwgaXQgaXMgYSBDRGF0YU9iamVjdCAqLwotCQljYXJnID0gZGljdC0+cGFyYW1mdW5jKChDRGF0YU9iamVjdCAqKW9iaik7Ci0JCXBhLT5mZmlfdHlwZSA9IGNhcmctPnBmZmlfdHlwZTsKLQkJbWVtY3B5KCZwYS0+dmFsdWUsICZjYXJnLT52YWx1ZSwgc2l6ZW9mKHBhLT52YWx1ZSkpOwotCQlwYS0+a2VlcCA9IChQeU9iamVjdCAqKWNhcmc7Ci0JCXJldHVybiAwOwotCX0KKyAgICBkaWN0ID0gUHlPYmplY3Rfc3RnZGljdChvYmopOworICAgIGlmIChkaWN0KSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqY2FyZzsKKyAgICAgICAgYXNzZXJ0KGRpY3QtPnBhcmFtZnVuYyk7CisgICAgICAgIC8qIElmIGl0IGhhcyBhbiBzdGdkaWN0LCBpdCBpcyBhIENEYXRhT2JqZWN0ICovCisgICAgICAgIGNhcmcgPSBkaWN0LT5wYXJhbWZ1bmMoKENEYXRhT2JqZWN0ICopb2JqKTsKKyAgICAgICAgcGEtPmZmaV90eXBlID0gY2FyZy0+cGZmaV90eXBlOworICAgICAgICBtZW1jcHkoJnBhLT52YWx1ZSwgJmNhcmctPnZhbHVlLCBzaXplb2YocGEtPnZhbHVlKSk7CisgICAgICAgIHBhLT5rZWVwID0gKFB5T2JqZWN0ICopY2FyZzsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKFB5Q0FyZ19DaGVja0V4YWN0KG9iaikpIHsKLQkJUHlDQXJnT2JqZWN0ICpjYXJnID0gKFB5Q0FyZ09iamVjdCAqKW9iajsKLQkJcGEtPmZmaV90eXBlID0gY2FyZy0+cGZmaV90eXBlOwotCQlQeV9JTkNSRUYob2JqKTsKLQkJcGEtPmtlZXAgPSBvYmo7Ci0JCW1lbWNweSgmcGEtPnZhbHVlLCAmY2FyZy0+dmFsdWUsIHNpemVvZihwYS0+dmFsdWUpKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUNBcmdfQ2hlY2tFeGFjdChvYmopKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqY2FyZyA9IChQeUNBcmdPYmplY3QgKilvYmo7CisgICAgICAgIHBhLT5mZmlfdHlwZSA9IGNhcmctPnBmZmlfdHlwZTsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgIHBhLT5rZWVwID0gb2JqOworICAgICAgICBtZW1jcHkoJnBhLT52YWx1ZSwgJmNhcmctPnZhbHVlLCBzaXplb2YocGEtPnZhbHVlKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIGNoZWNrIGZvciBOb25lLCBpbnRlZ2VyLCBzdHJpbmcgb3IgdW5pY29kZSBhbmQgdXNlIGRpcmVjdGx5IGlmIHN1Y2Nlc3NmdWwgKi8KLQlpZiAob2JqID09IFB5X05vbmUpIHsKLQkJcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JCXBhLT52YWx1ZS5wID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIGNoZWNrIGZvciBOb25lLCBpbnRlZ2VyLCBzdHJpbmcgb3IgdW5pY29kZSBhbmQgdXNlIGRpcmVjdGx5IGlmIHN1Y2Nlc3NmdWwgKi8KKyAgICBpZiAob2JqID09IFB5X05vbmUpIHsKKyAgICAgICAgcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhLT52YWx1ZS5wID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKLQkJcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3NpbnQ7Ci0JCXBhLT52YWx1ZS5pID0gUHlJbnRfQVNfTE9ORyhvYmopOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKKyAgICAgICAgcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3NpbnQ7CisgICAgICAgIHBhLT52YWx1ZS5pID0gUHlJbnRfQVNfTE9ORyhvYmopOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKLQkJcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3NpbnQ7Ci0JCXBhLT52YWx1ZS5pID0gKGxvbmcpUHlMb25nX0FzVW5zaWduZWRMb25nKG9iaik7Ci0JCWlmIChwYS0+dmFsdWUuaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJcGEtPnZhbHVlLmkgPSBQeUxvbmdfQXNMb25nKG9iaik7Ci0JCQlpZiAocGEtPnZhbHVlLmkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkJImxvbmcgaW50IHRvbyBsb25nIHRvIGNvbnZlcnQiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUxvbmdfQ2hlY2sob2JqKSkgeworICAgICAgICBwYS0+ZmZpX3R5cGUgPSAmZmZpX3R5cGVfc2ludDsKKyAgICAgICAgcGEtPnZhbHVlLmkgPSAobG9uZylQeUxvbmdfQXNVbnNpZ25lZExvbmcob2JqKTsKKyAgICAgICAgaWYgKHBhLT52YWx1ZS5pID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBwYS0+dmFsdWUuaSA9IFB5TG9uZ19Bc0xvbmcob2JqKTsKKyAgICAgICAgICAgIGlmIChwYS0+dmFsdWUuaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nIGludCB0b28gbG9uZyB0byBjb252ZXJ0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmIChQeVN0cmluZ19DaGVjayhvYmopKSB7Ci0JCXBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYS0+dmFsdWUucCA9IFB5U3RyaW5nX0FTX1NUUklORyhvYmopOwotCQlQeV9JTkNSRUYob2JqKTsKLQkJcGEtPmtlZXAgPSBvYmo7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSkgeworICAgICAgICBwYS0+ZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKKyAgICAgICAgcGEtPnZhbHVlLnAgPSBQeVN0cmluZ19BU19TVFJJTkcob2JqKTsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgIHBhLT5rZWVwID0gb2JqOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkgeworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkgewogI2lmZGVmIEhBVkVfVVNBQkxFX1dDSEFSX1QKLQkJcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JCXBhLT52YWx1ZS5wID0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKTsKLQkJUHlfSU5DUkVGKG9iaik7Ci0JCXBhLT5rZWVwID0gb2JqOwotCQlyZXR1cm4gMDsKKyAgICAgICAgcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhLT52YWx1ZS5wID0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKTsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgIHBhLT5rZWVwID0gb2JqOworICAgICAgICByZXR1cm4gMDsKICNlbHNlCi0JCWludCBzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKG9iaik7Ci0JCXBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlzaXplICs9IDE7IC8qIHRlcm1pbmF0aW5nIE5VTCAqLwotCQlzaXplICo9IHNpemVvZih3Y2hhcl90KTsKLQkJcGEtPnZhbHVlLnAgPSBQeU1lbV9NYWxsb2Moc2l6ZSk7Ci0JCWlmICghcGEtPnZhbHVlLnApIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbWVtc2V0KHBhLT52YWx1ZS5wLCAwLCBzaXplKTsKLQkJcGEtPmtlZXAgPSBDQVBTVUxFX05FVyhwYS0+dmFsdWUucCwgQ1RZUEVTX0NBUFNVTEVfV0NIQVJfVCk7Ci0JCWlmICghcGEtPmtlZXApIHsKLQkJCVB5TWVtX0ZyZWUocGEtPnZhbHVlLnApOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICgtMSA9PSBQeVVuaWNvZGVfQXNXaWRlQ2hhcigoUHlVbmljb2RlT2JqZWN0ICopb2JqLAotCQkJCQkgICAgICAgcGEtPnZhbHVlLnAsIFB5VW5pY29kZV9HRVRfU0laRShvYmopKSkKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuIDA7CisgICAgICAgIGludCBzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKG9iaik7CisgICAgICAgIHBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICBzaXplICs9IDE7IC8qIHRlcm1pbmF0aW5nIE5VTCAqLworICAgICAgICBzaXplICo9IHNpemVvZih3Y2hhcl90KTsKKyAgICAgICAgcGEtPnZhbHVlLnAgPSBQeU1lbV9NYWxsb2Moc2l6ZSk7CisgICAgICAgIGlmICghcGEtPnZhbHVlLnApIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KHBhLT52YWx1ZS5wLCAwLCBzaXplKTsKKyAgICAgICAgcGEtPmtlZXAgPSBDQVBTVUxFX05FVyhwYS0+dmFsdWUucCwgQ1RZUEVTX0NBUFNVTEVfV0NIQVJfVCk7CisgICAgICAgIGlmICghcGEtPmtlZXApIHsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUocGEtPnZhbHVlLnApOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICgtMSA9PSBQeVVuaWNvZGVfQXNXaWRlQ2hhcigoUHlVbmljb2RlT2JqZWN0ICopb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGEtPnZhbHVlLnAsIFB5VW5pY29kZV9HRVRfU0laRShvYmopKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIDA7CiAjZW5kaWYKLQl9CisgICAgfQogI2VuZGlmCiAKLQl7Ci0JCVB5T2JqZWN0ICphcmc7Ci0JCWFyZyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX2FzX3BhcmFtZXRlcl8iKTsKLQkJLyogV2hpY2ggdHlwZXMgc2hvdWxkIHdlIGV4YWN0bHkgYWxsb3cgaGVyZT8KLQkJICAgaW50ZWdlcnMgYXJlIHJlcXVpcmVkIGZvciB1c2luZyBQeXRob24gY2xhc3NlcwotCQkgICBhcyBwYXJhbWV0ZXJzICh0aGV5IGhhdmUgdG8gZXhwb3NlIHRoZSAnX2FzX3BhcmFtZXRlcl8nCi0JCSAgIGF0dHJpYnV0ZSkKLQkJKi8KLQkJaWYgKGFyZykgewotCQkJaW50IHJlc3VsdDsKLQkJCXJlc3VsdCA9IENvbnZQYXJhbShhcmcsIGluZGV4LCBwYSk7Ci0JCQlQeV9ERUNSRUYoYXJnKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIkRvbid0IGtub3cgaG93IHRvIGNvbnZlcnQgcGFyYW1ldGVyICVkIiwgCi0JCQkgICAgIFB5X1NBRkVfRE9XTkNBU1QoaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZzsKKyAgICAgICAgYXJnID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfYXNfcGFyYW1ldGVyXyIpOworICAgICAgICAvKiBXaGljaCB0eXBlcyBzaG91bGQgd2UgZXhhY3RseSBhbGxvdyBoZXJlPworICAgICAgICAgICBpbnRlZ2VycyBhcmUgcmVxdWlyZWQgZm9yIHVzaW5nIFB5dGhvbiBjbGFzc2VzCisgICAgICAgICAgIGFzIHBhcmFtZXRlcnMgKHRoZXkgaGF2ZSB0byBleHBvc2UgdGhlICdfYXNfcGFyYW1ldGVyXycKKyAgICAgICAgICAgYXR0cmlidXRlKQorICAgICAgICAqLworICAgICAgICBpZiAoYXJnKSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gQ29udlBhcmFtKGFyZywgaW5kZXgsIHBhKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkRvbid0IGtub3cgaG93IHRvIGNvbnZlcnQgcGFyYW1ldGVyICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1NBRkVfRE9XTkNBU1QoaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiAKIGZmaV90eXBlICpfY3R5cGVzX2dldF9mZmlfdHlwZShQeU9iamVjdCAqb2JqKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JaWYgKG9iaiA9PSBOVUxMKQotCQlyZXR1cm4gJmZmaV90eXBlX3NpbnQ7Ci0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KG9iaik7Ci0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuICZmZmlfdHlwZV9zaW50OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gJmZmaV90eXBlX3NpbnQ7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KG9iaik7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICZmZmlfdHlwZV9zaW50OwogI2lmIGRlZmluZWQoTVNfV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCi0JLyogVGhpcyBsaXR0bGUgdHJpY2sgd29ya3MgY29ycmVjdGx5IHdpdGggTVNWQy4KLQkgICBJdCByZXR1cm5zIHNtYWxsIHN0cnVjdHVyZXMgaW4gcmVnaXN0ZXJzCi0JKi8KLQlpZiAoZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkgewotCQlpZiAoZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5zaXplIDw9IDQpCi0JCQlyZXR1cm4gJmZmaV90eXBlX3NpbnQzMjsKLQkJZWxzZSBpZiAoZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5zaXplIDw9IDgpCi0JCQlyZXR1cm4gJmZmaV90eXBlX3NpbnQ2NDsKLQl9CisgICAgLyogVGhpcyBsaXR0bGUgdHJpY2sgd29ya3MgY29ycmVjdGx5IHdpdGggTVNWQy4KKyAgICAgICBJdCByZXR1cm5zIHNtYWxsIHN0cnVjdHVyZXMgaW4gcmVnaXN0ZXJzCisgICAgKi8KKyAgICBpZiAoZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkgeworICAgICAgICBpZiAoZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5zaXplIDw9IDQpCisgICAgICAgICAgICByZXR1cm4gJmZmaV90eXBlX3NpbnQzMjsKKyAgICAgICAgZWxzZSBpZiAoZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5zaXplIDw9IDgpCisgICAgICAgICAgICByZXR1cm4gJmZmaV90eXBlX3NpbnQ2NDsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gJmRpY3QtPmZmaV90eXBlX3BvaW50ZXI7CisgICAgcmV0dXJuICZkaWN0LT5mZmlfdHlwZV9wb2ludGVyOwogfQogCiAKQEAgLTc0Nyw3ICs3NDcsNyBAQAogICogbGliZmZpIHVzZXM6CiAgKgogICogZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWYoZmZpX2NpZiAqY2lmLCBmZmlfYWJpIGFiaSwKLSAqCSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmFyZ3MsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmFyZ3MsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICBmZmlfdHlwZSAqcnR5cGUsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICBmZmlfdHlwZSAqKmF0eXBlcyk7CiAgKgpAQCAtNzU2LDEwOCArNzU2LDEwOCBAQAogICogdm9pZCBmZmlfY2FsbChmZmlfY2lmICpjaWYsIHZvaWQgKmZuLCB2b2lkICpydmFsdWUsIHZvaWQgKiphdmFsdWVzKTsKICAqLwogc3RhdGljIGludCBfY2FsbF9mdW5jdGlvbl9wb2ludGVyKGludCBmbGFncywKLQkJCQkgIFBQUk9DIHBQcm9jLAotCQkJCSAgdm9pZCAqKmF2YWx1ZXMsCi0JCQkJICBmZmlfdHlwZSAqKmF0eXBlcywKLQkJCQkgIGZmaV90eXBlICpyZXN0eXBlLAotCQkJCSAgdm9pZCAqcmVzbWVtLAotCQkJCSAgaW50IGFyZ2NvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQUk9DIHBQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiphdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmaV90eXBlICoqYXR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmaV90eXBlICpyZXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlc21lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnY291bnQpCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeVRocmVhZFN0YXRlICpfc2F2ZSA9IE5VTEw7IC8qIEZvciBQeV9CTE9DS19USFJFQURTIGFuZCBQeV9VTkJMT0NLX1RIUkVBRFMgKi8KKyAgICBQeVRocmVhZFN0YXRlICpfc2F2ZSA9IE5VTEw7IC8qIEZvciBQeV9CTE9DS19USFJFQURTIGFuZCBQeV9VTkJMT0NLX1RIUkVBRFMgKi8KICNlbmRpZgotCVB5T2JqZWN0ICplcnJvcl9vYmplY3QgPSBOVUxMOwotCWludCAqc3BhY2U7Ci0JZmZpX2NpZiBjaWY7Ci0JaW50IGNjOworICAgIFB5T2JqZWN0ICplcnJvcl9vYmplY3QgPSBOVUxMOworICAgIGludCAqc3BhY2U7CisgICAgZmZpX2NpZiBjaWY7CisgICAgaW50IGNjOwogI2lmZGVmIE1TX1dJTjMyCiAjaWZuZGVmIERPTlRfVVNFX1NFSAotCURXT1JEIGR3RXhjZXB0aW9uQ29kZSA9IDA7Ci0JRVhDRVBUSU9OX1JFQ09SRCByZWNvcmQ7CisgICAgRFdPUkQgZHdFeGNlcHRpb25Db2RlID0gMDsKKyAgICBFWENFUFRJT05fUkVDT1JEIHJlY29yZDsKICNlbmRpZgogI2VuZGlmCi0JLyogWFhYIGNoZWNrIGJlZm9yZSBoZXJlICovCi0JaWYgKHJlc3R5cGUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJObyBmZmlfdHlwZSBmb3IgcmVzdWx0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JY2MgPSBGRklfREVGQVVMVF9BQkk7Ci0jaWYgZGVmaW5lZChNU19XSU4zMikgJiYgIWRlZmluZWQoTVNfV0lONjQpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCi0JaWYgKChmbGFncyAmIEZVTkNGTEFHX0NERUNMKSA9PSAwKQotCQljYyA9IEZGSV9TVERDQUxMOwotI2VuZGlmCi0JaWYgKEZGSV9PSyAhPSBmZmlfcHJlcF9jaWYoJmNpZiwKLQkJCQkgICBjYywKLQkJCQkgICBhcmdjb3VudCwKLQkJCQkgICByZXN0eXBlLAotCQkJCSAgIGF0eXBlcykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiZmZpX3ByZXBfY2lmIGZhaWxlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIFhYWCBjaGVjayBiZWZvcmUgaGVyZSAqLworICAgIGlmIChyZXN0eXBlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJObyBmZmlfdHlwZSBmb3IgcmVzdWx0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoZmxhZ3MgJiAoRlVOQ0ZMQUdfVVNFX0VSUk5PIHwgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikpIHsKLQkJZXJyb3Jfb2JqZWN0ID0gX2N0eXBlc19nZXRfZXJyb2JqKCZzcGFjZSk7Ci0JCWlmIChlcnJvcl9vYmplY3QgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9CisgICAgY2MgPSBGRklfREVGQVVMVF9BQkk7CisjaWYgZGVmaW5lZChNU19XSU4zMikgJiYgIWRlZmluZWQoTVNfV0lONjQpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgaWYgKChmbGFncyAmIEZVTkNGTEFHX0NERUNMKSA9PSAwKQorICAgICAgICBjYyA9IEZGSV9TVERDQUxMOworI2VuZGlmCisgICAgaWYgKEZGSV9PSyAhPSBmZmlfcHJlcF9jaWYoJmNpZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlcykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmZmlfcHJlcF9jaWYgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiAoRlVOQ0ZMQUdfVVNFX0VSUk5PIHwgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikpIHsKKyAgICAgICAgZXJyb3Jfb2JqZWN0ID0gX2N0eXBlc19nZXRfZXJyb2JqKCZzcGFjZSk7CisgICAgICAgIGlmIChlcnJvcl9vYmplY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQotCQlQeV9VTkJMT0NLX1RIUkVBRFMKKyAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQorICAgICAgICBQeV9VTkJMT0NLX1RIUkVBRFMKICNlbmRpZgotCWlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgewotCQlpbnQgdGVtcCA9IHNwYWNlWzBdOwotCQlzcGFjZVswXSA9IGVycm5vOwotCQllcnJubyA9IHRlbXA7Ci0JfQorICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzBdOworICAgICAgICBzcGFjZVswXSA9IGVycm5vOworICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgfQogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikgewotCQlpbnQgdGVtcCA9IHNwYWNlWzFdOwotCQlzcGFjZVsxXSA9IEdldExhc3RFcnJvcigpOwotCQlTZXRMYXN0RXJyb3IodGVtcCk7Ci0JfQorICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9MQVNURVJST1IpIHsKKyAgICAgICAgaW50IHRlbXAgPSBzcGFjZVsxXTsKKyAgICAgICAgc3BhY2VbMV0gPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgU2V0TGFzdEVycm9yKHRlbXApOworICAgIH0KICNpZm5kZWYgRE9OVF9VU0VfU0VICi0JX190cnkgeworICAgIF9fdHJ5IHsKICNlbmRpZgogI2VuZGlmCi0JCWZmaV9jYWxsKCZjaWYsICh2b2lkICopcFByb2MsIHJlc21lbSwgYXZhbHVlcyk7CisgICAgICAgIGZmaV9jYWxsKCZjaWYsICh2b2lkICopcFByb2MsIHJlc21lbSwgYXZhbHVlcyk7CiAjaWZkZWYgTVNfV0lOMzIKICNpZm5kZWYgRE9OVF9VU0VfU0VICi0JfQotCV9fZXhjZXB0IChIYW5kbGVFeGNlcHRpb24oR2V0RXhjZXB0aW9uSW5mb3JtYXRpb24oKSwKLQkJCQkgICZkd0V4Y2VwdGlvbkNvZGUsICZyZWNvcmQpKSB7Ci0JCTsKLQl9CisgICAgfQorICAgIF9fZXhjZXB0IChIYW5kbGVFeGNlcHRpb24oR2V0RXhjZXB0aW9uSW5mb3JtYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkd0V4Y2VwdGlvbkNvZGUsICZyZWNvcmQpKSB7CisgICAgICAgIDsKKyAgICB9CiAjZW5kaWYKLQlpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMV07Ci0JCXNwYWNlWzFdID0gR2V0TGFzdEVycm9yKCk7Ci0JCVNldExhc3RFcnJvcih0ZW1wKTsKLQl9CisgICAgaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzFdOworICAgICAgICBzcGFjZVsxXSA9IEdldExhc3RFcnJvcigpOworICAgICAgICBTZXRMYXN0RXJyb3IodGVtcCk7CisgICAgfQogI2VuZGlmCi0JaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0VSUk5PKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMF07Ci0JCXNwYWNlWzBdID0gZXJybm87Ci0JCWVycm5vID0gdGVtcDsKLQl9Ci0JUHlfWERFQ1JFRihlcnJvcl9vYmplY3QpOworICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzBdOworICAgICAgICBzcGFjZVswXSA9IGVycm5vOworICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgfQorICAgIFB5X1hERUNSRUYoZXJyb3Jfb2JqZWN0KTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmICgoZmxhZ3MgJiBGVU5DRkxBR19QWVRIT05BUEkpID09IDApCi0JCVB5X0JMT0NLX1RIUkVBRFMKKyAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQorICAgICAgICBQeV9CTE9DS19USFJFQURTCiAjZW5kaWYKICNpZmRlZiBNU19XSU4zMgogI2lmbmRlZiBET05UX1VTRV9TRUgKLQlpZiAoZHdFeGNlcHRpb25Db2RlKSB7Ci0JCVNldEV4Y2VwdGlvbihkd0V4Y2VwdGlvbkNvZGUsICZyZWNvcmQpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChkd0V4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgU2V0RXhjZXB0aW9uKGR3RXhjZXB0aW9uQ29kZSwgJnJlY29yZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjZW5kaWYKICNlbmRpZgotCWlmICgoZmxhZ3MgJiBGVU5DRkxBR19QWVRIT05BUEkpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC04NzIsNDEgKzg3Miw0MSBAQAogICovCiBzdGF0aWMgUHlPYmplY3QgKkdldFJlc3VsdChQeU9iamVjdCAqcmVzdHlwZSwgdm9pZCAqcmVzdWx0LCBQeU9iamVjdCAqY2hlY2tlcikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCVB5T2JqZWN0ICpyZXR2YWwsICp2OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKnJldHZhbCwgKnY7CiAKLQlpZiAocmVzdHlwZSA9PSBOVUxMKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKihpbnQgKilyZXN1bHQpOworICAgIGlmIChyZXN0eXBlID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygqKGludCAqKXJlc3VsdCk7CiAKLQlpZiAocmVzdHlwZSA9PSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIGlmIChyZXN0eXBlID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QocmVzdHlwZSk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihyZXN0eXBlLCAiaSIsICooaW50ICopcmVzdWx0KTsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3QocmVzdHlwZSk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihyZXN0eXBlLCAiaSIsICooaW50ICopcmVzdWx0KTsKIAotCWlmIChkaWN0LT5nZXRmdW5jICYmICFfY3R5cGVzX3NpbXBsZV9pbnN0YW5jZShyZXN0eXBlKSkgewotCQlyZXR2YWwgPSBkaWN0LT5nZXRmdW5jKHJlc3VsdCwgZGljdC0+c2l6ZSk7Ci0JCS8qIElmIHJlc3R5cGUgaXMgcHlfb2JqZWN0IChkZXRlY3RlZCBieSBjb21wYXJpbmcgZ2V0ZnVuYyB3aXRoCi0JCSAgIE9fZ2V0KSwgd2UgaGF2ZSB0byBjYWxsIFB5X0RFQ1JFRiBiZWNhdXNlIE9fZ2V0IGhhcyBhbHJlYWR5Ci0JCSAgIGNhbGxlZCBQeV9JTkNSRUYuCi0JCSovCi0JCWlmIChkaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygiTyIpLT5nZXRmdW5jKSB7Ci0JCQlQeV9ERUNSRUYocmV0dmFsKTsKLQkJfQotCX0gZWxzZQotCQlyZXR2YWwgPSBQeUNEYXRhX0Zyb21CYXNlT2JqKHJlc3R5cGUsIE5VTEwsIDAsIHJlc3VsdCk7CisgICAgaWYgKGRpY3QtPmdldGZ1bmMgJiYgIV9jdHlwZXNfc2ltcGxlX2luc3RhbmNlKHJlc3R5cGUpKSB7CisgICAgICAgIHJldHZhbCA9IGRpY3QtPmdldGZ1bmMocmVzdWx0LCBkaWN0LT5zaXplKTsKKyAgICAgICAgLyogSWYgcmVzdHlwZSBpcyBweV9vYmplY3QgKGRldGVjdGVkIGJ5IGNvbXBhcmluZyBnZXRmdW5jIHdpdGgKKyAgICAgICAgICAgT19nZXQpLCB3ZSBoYXZlIHRvIGNhbGwgUHlfREVDUkVGIGJlY2F1c2UgT19nZXQgaGFzIGFscmVhZHkKKyAgICAgICAgICAgY2FsbGVkIFB5X0lOQ1JFRi4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGRpY3QtPmdldGZ1bmMgPT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJPIiktPmdldGZ1bmMpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIHJldHZhbCA9IFB5Q0RhdGFfRnJvbUJhc2VPYmoocmVzdHlwZSwgTlVMTCwgMCwgcmVzdWx0KTsKIAotCWlmICghY2hlY2tlciB8fCAhcmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOworICAgIGlmICghY2hlY2tlciB8fCAhcmV0dmFsKQorICAgICAgICByZXR1cm4gcmV0dmFsOwogCi0JdiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2hlY2tlciwgcmV0dmFsLCBOVUxMKTsKLQlpZiAodiA9PSBOVUxMKQotCQlfY3R5cGVzX2FkZF90cmFjZWJhY2soIkdldFJlc3VsdCIsICJfY3R5cGVzL2NhbGxwcm9jLmMiLCBfX0xJTkVfXy0yKTsKLQlQeV9ERUNSRUYocmV0dmFsKTsKLQlyZXR1cm4gdjsKKyAgICB2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjaGVja2VyLCByZXR2YWwsIE5VTEwpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIF9jdHlwZXNfYWRkX3RyYWNlYmFjaygiR2V0UmVzdWx0IiwgIl9jdHlwZXMvY2FsbHByb2MuYyIsIF9fTElORV9fLTIpOworICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgIHJldHVybiB2OwogfQogCiAvKgpAQCAtOTE1LDQwICs5MTUsNDAgQEAKICAqLwogdm9pZCBfY3R5cGVzX2V4dGVuZF9lcnJvcihQeU9iamVjdCAqZXhjX2NsYXNzLCBjaGFyICpmbXQsIC4uLikKIHsKLQl2YV9saXN0IHZhcmdzOwotCVB5T2JqZWN0ICp0cCwgKnYsICp0YiwgKnMsICpjbHNfc3RyLCAqbXNnX3N0cjsKKyAgICB2YV9saXN0IHZhcmdzOworICAgIFB5T2JqZWN0ICp0cCwgKnYsICp0YiwgKnMsICpjbHNfc3RyLCAqbXNnX3N0cjsKIAotCXZhX3N0YXJ0KHZhcmdzLCBmbXQpOwotCXMgPSBQeVN0cmluZ19Gcm9tRm9ybWF0VihmbXQsIHZhcmdzKTsKLQl2YV9lbmQodmFyZ3MpOwotCWlmICghcykKLQkJcmV0dXJuOworICAgIHZhX3N0YXJ0KHZhcmdzLCBmbXQpOworICAgIHMgPSBQeVN0cmluZ19Gcm9tRm9ybWF0VihmbXQsIHZhcmdzKTsKKyAgICB2YV9lbmQodmFyZ3MpOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuOwogCi0JUHlFcnJfRmV0Y2goJnRwLCAmdiwgJnRiKTsKLQlQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJnRwLCAmdiwgJnRiKTsKLQljbHNfc3RyID0gUHlPYmplY3RfU3RyKHRwKTsKLQlpZiAoY2xzX3N0cikgewotCQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIGNsc19zdHIpOwotCQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIjogIikpOwotCQlpZiAocyA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQl9IGVsc2UKLQkJUHlFcnJfQ2xlYXIoKTsKLQltc2dfc3RyID0gUHlPYmplY3RfU3RyKHYpOwotCWlmIChtc2dfc3RyKQotCQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIG1zZ19zdHIpOwotCWVsc2UgewotCQlQeUVycl9DbGVhcigpOwotCQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIj8/PyIpKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCVB5RXJyX1NldE9iamVjdChleGNfY2xhc3MsIHMpOworICAgIFB5RXJyX0ZldGNoKCZ0cCwgJnYsICZ0Yik7CisgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZ0cCwgJnYsICZ0Yik7CisgICAgY2xzX3N0ciA9IFB5T2JqZWN0X1N0cih0cCk7CisgICAgaWYgKGNsc19zdHIpIHsKKyAgICAgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBjbHNfc3RyKTsKKyAgICAgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCI6ICIpKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfSBlbHNlCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgbXNnX3N0ciA9IFB5T2JqZWN0X1N0cih2KTsKKyAgICBpZiAobXNnX3N0cikKKyAgICAgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBtc2dfc3RyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCI/Pz8iKSk7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeUVycl9TZXRPYmplY3QoZXhjX2NsYXNzLCBzKTsKIGVycm9yOgotCVB5X1hERUNSRUYodHApOwotCVB5X1hERUNSRUYodik7Ci0JUHlfWERFQ1JFRih0Yik7Ci0JUHlfWERFQ1JFRihzKTsKKyAgICBQeV9YREVDUkVGKHRwKTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIFB5X1hERUNSRUYodGIpOworICAgIFB5X1hERUNSRUYocyk7CiB9CiAKIApAQCAtOTU3LDc3ICs5NTcsNzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBHZXRDb21FcnJvcihIUkVTVUxUIGVycmNvZGUsIEdVSUQgKnJpaWQsIElVbmtub3duICpwSXVuaykKIHsKLQlIUkVTVUxUIGhyOwotCUlTdXBwb3J0RXJyb3JJbmZvICpwc2VpID0gTlVMTDsKLQlJRXJyb3JJbmZvICpwZWkgPSBOVUxMOwotCUJTVFIgZGVzY3I9TlVMTCwgaGVscGZpbGU9TlVMTCwgc291cmNlPU5VTEw7Ci0JR1VJRCBndWlkOwotCURXT1JEIGhlbHBjb250ZXh0PTA7Ci0JTFBPTEVTVFIgcHJvZ2lkOwotCVB5T2JqZWN0ICpvYmo7Ci0JVENIQVIgKnRleHQ7CisgICAgSFJFU1VMVCBocjsKKyAgICBJU3VwcG9ydEVycm9ySW5mbyAqcHNlaSA9IE5VTEw7CisgICAgSUVycm9ySW5mbyAqcGVpID0gTlVMTDsKKyAgICBCU1RSIGRlc2NyPU5VTEwsIGhlbHBmaWxlPU5VTEwsIHNvdXJjZT1OVUxMOworICAgIEdVSUQgZ3VpZDsKKyAgICBEV09SRCBoZWxwY29udGV4dD0wOworICAgIExQT0xFU1RSIHByb2dpZDsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIFRDSEFSICp0ZXh0OwogCi0JLyogV2UgYWJzb2x1dGVseSBoYXZlIHRvIHJlbGVhc2UgdGhlIEdJTCBkdXJpbmcgQ09NIG1ldGhvZCBjYWxscywKLQkgICBvdGhlcndpc2Ugd2UgbWF5IGdldCBhIGRlYWRsb2NrIQotCSovCisgICAgLyogV2UgYWJzb2x1dGVseSBoYXZlIHRvIHJlbGVhc2UgdGhlIEdJTCBkdXJpbmcgQ09NIG1ldGhvZCBjYWxscywKKyAgICAgICBvdGhlcndpc2Ugd2UgbWF5IGdldCBhIGRlYWRsb2NrIQorICAgICovCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogI2VuZGlmCiAKLQlociA9IHBJdW5rLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHBJdW5rLCAmSUlEX0lTdXBwb3J0RXJyb3JJbmZvLCAodm9pZCAqKikmcHNlaSk7Ci0JaWYgKEZBSUxFRChocikpCi0JCWdvdG8gZmFpbGVkOworICAgIGhyID0gcEl1bmstPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocEl1bmssICZJSURfSVN1cHBvcnRFcnJvckluZm8sICh2b2lkICoqKSZwc2VpKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CiAKLQlociA9IHBzZWktPmxwVnRibC0+SW50ZXJmYWNlU3VwcG9ydHNFcnJvckluZm8ocHNlaSwgcmlpZCk7Ci0JcHNlaS0+bHBWdGJsLT5SZWxlYXNlKHBzZWkpOwotCWlmIChGQUlMRUQoaHIpKQotCQlnb3RvIGZhaWxlZDsKKyAgICBociA9IHBzZWktPmxwVnRibC0+SW50ZXJmYWNlU3VwcG9ydHNFcnJvckluZm8ocHNlaSwgcmlpZCk7CisgICAgcHNlaS0+bHBWdGJsLT5SZWxlYXNlKHBzZWkpOworICAgIGlmIChGQUlMRUQoaHIpKQorICAgICAgICBnb3RvIGZhaWxlZDsKIAotCWhyID0gR2V0RXJyb3JJbmZvKDAsICZwZWkpOwotCWlmIChociAhPSBTX09LKQotCQlnb3RvIGZhaWxlZDsKKyAgICBociA9IEdldEVycm9ySW5mbygwLCAmcGVpKTsKKyAgICBpZiAoaHIgIT0gU19PSykKKyAgICAgICAgZ290byBmYWlsZWQ7CiAKLQlwZWktPmxwVnRibC0+R2V0RGVzY3JpcHRpb24ocGVpLCAmZGVzY3IpOwotCXBlaS0+bHBWdGJsLT5HZXRHVUlEKHBlaSwgJmd1aWQpOwotCXBlaS0+bHBWdGJsLT5HZXRIZWxwQ29udGV4dChwZWksICZoZWxwY29udGV4dCk7Ci0JcGVpLT5scFZ0YmwtPkdldEhlbHBGaWxlKHBlaSwgJmhlbHBmaWxlKTsKLQlwZWktPmxwVnRibC0+R2V0U291cmNlKHBlaSwgJnNvdXJjZSk7CisgICAgcGVpLT5scFZ0YmwtPkdldERlc2NyaXB0aW9uKHBlaSwgJmRlc2NyKTsKKyAgICBwZWktPmxwVnRibC0+R2V0R1VJRChwZWksICZndWlkKTsKKyAgICBwZWktPmxwVnRibC0+R2V0SGVscENvbnRleHQocGVpLCAmaGVscGNvbnRleHQpOworICAgIHBlaS0+bHBWdGJsLT5HZXRIZWxwRmlsZShwZWksICZoZWxwZmlsZSk7CisgICAgcGVpLT5scFZ0YmwtPkdldFNvdXJjZShwZWksICZzb3VyY2UpOwogCi0JcGVpLT5scFZ0YmwtPlJlbGVhc2UocGVpKTsKKyAgICBwZWktPmxwVnRibC0+UmVsZWFzZShwZWkpOwogCiAgIGZhaWxlZDoKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICNlbmRpZgogCi0JcHJvZ2lkID0gTlVMTDsKLQlQcm9nSURGcm9tQ0xTSUQoJmd1aWQsICZwcm9naWQpOworICAgIHByb2dpZCA9IE5VTEw7CisgICAgUHJvZ0lERnJvbUNMU0lEKCZndWlkLCAmcHJvZ2lkKTsKIAotCXRleHQgPSBGb3JtYXRFcnJvcihlcnJjb2RlKTsKLQlvYmogPSBQeV9CdWlsZFZhbHVlKAorICAgIHRleHQgPSBGb3JtYXRFcnJvcihlcnJjb2RlKTsKKyAgICBvYmogPSBQeV9CdWlsZFZhbHVlKAogI2lmZGVmIF9VTklDT0RFCi0JCSJpdSh1dXVpdSkiLAorICAgICAgICAiaXUodXV1aXUpIiwKICNlbHNlCi0JCSJpcyh1dXVpdSkiLAorICAgICAgICAiaXModXV1aXUpIiwKICNlbmRpZgotCQllcnJjb2RlLAotCQl0ZXh0LAotCQlkZXNjciwgc291cmNlLCBoZWxwZmlsZSwgaGVscGNvbnRleHQsCi0JCXByb2dpZCk7Ci0JaWYgKG9iaikgewotCQlQeUVycl9TZXRPYmplY3QoQ29tRXJyb3IsIG9iaik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCX0KLQlMb2NhbEZyZWUodGV4dCk7CisgICAgICAgIGVycmNvZGUsCisgICAgICAgIHRleHQsCisgICAgICAgIGRlc2NyLCBzb3VyY2UsIGhlbHBmaWxlLCBoZWxwY29udGV4dCwKKyAgICAgICAgcHJvZ2lkKTsKKyAgICBpZiAob2JqKSB7CisgICAgICAgIFB5RXJyX1NldE9iamVjdChDb21FcnJvciwgb2JqKTsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgfQorICAgIExvY2FsRnJlZSh0ZXh0KTsKIAotCWlmIChkZXNjcikKLQkJU3lzRnJlZVN0cmluZyhkZXNjcik7Ci0JaWYgKGhlbHBmaWxlKQotCQlTeXNGcmVlU3RyaW5nKGhlbHBmaWxlKTsKLQlpZiAoc291cmNlKQotCQlTeXNGcmVlU3RyaW5nKHNvdXJjZSk7CisgICAgaWYgKGRlc2NyKQorICAgICAgICBTeXNGcmVlU3RyaW5nKGRlc2NyKTsKKyAgICBpZiAoaGVscGZpbGUpCisgICAgICAgIFN5c0ZyZWVTdHJpbmcoaGVscGZpbGUpOworICAgIGlmIChzb3VyY2UpCisgICAgICAgIFN5c0ZyZWVTdHJpbmcoc291cmNlKTsKIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogI2VuZGlmCiAKQEAgLTEwMzksMTU0ICsxMDM5LDE1NCBAQAogICogLSBYWFggdmFyaW91cyByZXF1aXJlbWVudHMgZm9yIHJlc3R5cGUsIG5vdCB5ZXQgY29sbGVjdGVkCiAgKi8KIFB5T2JqZWN0ICpfY3R5cGVzX2NhbGxwcm9jKFBQUk9DIHBQcm9jLAotCQkgICAgUHlPYmplY3QgKmFyZ3R1cGxlLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJndHVwbGUsCiAjaWZkZWYgTVNfV0lOMzIKLQkJICAgIElVbmtub3duICpwSXVuaywKLQkJICAgIEdVSUQgKmlpZCwKKyAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKnBJdW5rLAorICAgICAgICAgICAgICAgICAgICBHVUlEICppaWQsCiAjZW5kaWYKLQkJICAgIGludCBmbGFncywKLQkJICAgIFB5T2JqZWN0ICphcmd0eXBlcywgLyogbWlzbGVhZGluZyBuYW1lOiBUaGlzIGlzIGEgdHVwbGUgb2YKLQkJCQkJICAgbWV0aG9kcywgbm90IHR5cGVzOiB0aGUgLmZyb21fcGFyYW0KLQkJCQkJICAgY2xhc3MgbWV0aG9kcyBvZiB0aGUgdHlwZXMgKi8KLQkJICAgIFB5T2JqZWN0ICpyZXN0eXBlLAotCQkgICAgUHlPYmplY3QgKmNoZWNrZXIpCisgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3R5cGVzLCAvKiBtaXNsZWFkaW5nIG5hbWU6IFRoaXMgaXMgYSB0dXBsZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMsIG5vdCB0eXBlczogdGhlIC5mcm9tX3BhcmFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgbWV0aG9kcyBvZiB0aGUgdHlwZXMgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN0eXBlLAorICAgICAgICAgICAgUHlPYmplY3QgKmNoZWNrZXIpCiB7Ci0JUHlfc3NpemVfdCBpLCBuLCBhcmdjb3VudCwgYXJndHlwZV9jb3VudDsKLQl2b2lkICpyZXNidWY7Ci0Jc3RydWN0IGFyZ3VtZW50ICphcmdzLCAqcGE7Ci0JZmZpX3R5cGUgKiphdHlwZXM7Ci0JZmZpX3R5cGUgKnJ0eXBlOwotCXZvaWQgKiphdmFsdWVzOwotCVB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgbiwgYXJnY291bnQsIGFyZ3R5cGVfY291bnQ7CisgICAgdm9pZCAqcmVzYnVmOworICAgIHN0cnVjdCBhcmd1bWVudCAqYXJncywgKnBhOworICAgIGZmaV90eXBlICoqYXR5cGVzOworICAgIGZmaV90eXBlICpydHlwZTsKKyAgICB2b2lkICoqYXZhbHVlczsKKyAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKIAotCW4gPSBhcmdjb3VudCA9IFB5VHVwbGVfR0VUX1NJWkUoYXJndHVwbGUpOworICAgIG4gPSBhcmdjb3VudCA9IFB5VHVwbGVfR0VUX1NJWkUoYXJndHVwbGUpOwogI2lmZGVmIE1TX1dJTjMyCi0JLyogYW4gb3B0aW9uYWwgQ09NIG9iamVjdCB0aGlzIHBvaW50ZXIgKi8KLQlpZiAocEl1bmspCi0JCSsrYXJnY291bnQ7CisgICAgLyogYW4gb3B0aW9uYWwgQ09NIG9iamVjdCB0aGlzIHBvaW50ZXIgKi8KKyAgICBpZiAocEl1bmspCisgICAgICAgICsrYXJnY291bnQ7CiAjZW5kaWYKIAotCWFyZ3MgPSAoc3RydWN0IGFyZ3VtZW50ICopYWxsb2NhKHNpemVvZihzdHJ1Y3QgYXJndW1lbnQpICogYXJnY291bnQpOwotCWlmICghYXJncykgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtc2V0KGFyZ3MsIDAsIHNpemVvZihzdHJ1Y3QgYXJndW1lbnQpICogYXJnY291bnQpOwotCWFyZ3R5cGVfY291bnQgPSBhcmd0eXBlcyA/IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpIDogMDsKKyAgICBhcmdzID0gKHN0cnVjdCBhcmd1bWVudCAqKWFsbG9jYShzaXplb2Yoc3RydWN0IGFyZ3VtZW50KSAqIGFyZ2NvdW50KTsKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChhcmdzLCAwLCBzaXplb2Yoc3RydWN0IGFyZ3VtZW50KSAqIGFyZ2NvdW50KTsKKyAgICBhcmd0eXBlX2NvdW50ID0gYXJndHlwZXMgPyBQeVR1cGxlX0dFVF9TSVpFKGFyZ3R5cGVzKSA6IDA7CiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAocEl1bmspIHsKLQkJYXJnc1swXS5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlhcmdzWzBdLnZhbHVlLnAgPSBwSXVuazsKLQkJcGEgPSAmYXJnc1sxXTsKLQl9IGVsc2UKKyAgICBpZiAocEl1bmspIHsKKyAgICAgICAgYXJnc1swXS5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICBhcmdzWzBdLnZhbHVlLnAgPSBwSXVuazsKKyAgICAgICAgcGEgPSAmYXJnc1sxXTsKKyAgICB9IGVsc2UKICNlbmRpZgotCQlwYSA9ICZhcmdzWzBdOworICAgICAgICBwYSA9ICZhcmdzWzBdOwogCi0JLyogQ29udmVydCB0aGUgYXJndW1lbnRzICovCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSwgKytwYSkgewotCQlQeU9iamVjdCAqY29udmVydGVyOwotCQlQeU9iamVjdCAqYXJnOwotCQlpbnQgZXJyOworICAgIC8qIENvbnZlcnQgdGhlIGFyZ3VtZW50cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2ksICsrcGEpIHsKKyAgICAgICAgUHlPYmplY3QgKmNvbnZlcnRlcjsKKyAgICAgICAgUHlPYmplY3QgKmFyZzsKKyAgICAgICAgaW50IGVycjsKIAotCQlhcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R1cGxlLCBpKTsJLyogYm9ycm93ZWQgcmVmICovCi0JCS8qIEZvciBjZGVjbCBmdW5jdGlvbnMsIHdlIGFsbG93IG1vcmUgYWN0dWFsIGFyZ3VtZW50cwotCQkgICB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGFyZ3R5cGVzIHR1cGxlLgotCQkgICBUaGlzIGlzIGNoZWNrZWQgaW4gX2N0eXBlczo6UHlDRnVuY1B0cl9DYWxsCi0JCSovCi0JCWlmIChhcmd0eXBlcyAmJiBhcmd0eXBlX2NvdW50ID4gaSkgewotCQkJUHlPYmplY3QgKnY7Ci0JCQljb252ZXJ0ZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R5cGVzLCBpKTsKLQkJCXYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNvbnZlcnRlciwKLQkJCQkJCQkgICBhcmcsCi0JCQkJCQkJICAgTlVMTCk7Ci0JCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQkJX2N0eXBlc19leHRlbmRfZXJyb3IoUHlFeGNfQXJnRXJyb3IsICJhcmd1bWVudCAlZDogIiwgaSsxKTsKLQkJCQlnb3RvIGNsZWFudXA7Ci0JCQl9CisgICAgICAgIGFyZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJndHVwbGUsIGkpOyAgICAgICAgICAgIC8qIGJvcnJvd2VkIHJlZiAqLworICAgICAgICAvKiBGb3IgY2RlY2wgZnVuY3Rpb25zLCB3ZSBhbGxvdyBtb3JlIGFjdHVhbCBhcmd1bWVudHMKKyAgICAgICAgICAgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBhcmd0eXBlcyB0dXBsZS4KKyAgICAgICAgICAgVGhpcyBpcyBjaGVja2VkIGluIF9jdHlwZXM6OlB5Q0Z1bmNQdHJfQ2FsbAorICAgICAgICAqLworICAgICAgICBpZiAoYXJndHlwZXMgJiYgYXJndHlwZV9jb3VudCA+IGkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICAgICAgY29udmVydGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmd0eXBlcywgaSk7CisgICAgICAgICAgICB2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlFeGNfQXJnRXJyb3IsICJhcmd1bWVudCAlZDogIiwgaSsxKTsKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICB9CiAKLQkJCWVyciA9IENvbnZQYXJhbSh2LCBpKzEsIHBhKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWlmICgtMSA9PSBlcnIpIHsKLQkJCQlfY3R5cGVzX2V4dGVuZF9lcnJvcihQeUV4Y19BcmdFcnJvciwgImFyZ3VtZW50ICVkOiAiLCBpKzEpOwotCQkJCWdvdG8gY2xlYW51cDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWVyciA9IENvbnZQYXJhbShhcmcsIGkrMSwgcGEpOwotCQkJaWYgKC0xID09IGVycikgewotCQkJCV9jdHlwZXNfZXh0ZW5kX2Vycm9yKFB5RXhjX0FyZ0Vycm9yLCAiYXJndW1lbnQgJWQ6ICIsIGkrMSk7Ci0JCQkJZ290byBjbGVhbnVwOyAvKiBsZWFraW5nID8gKi8KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIGVyciA9IENvbnZQYXJhbSh2LCBpKzEsIHBhKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIGlmICgtMSA9PSBlcnIpIHsKKyAgICAgICAgICAgICAgICBfY3R5cGVzX2V4dGVuZF9lcnJvcihQeUV4Y19BcmdFcnJvciwgImFyZ3VtZW50ICVkOiAiLCBpKzEpOworICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IENvbnZQYXJhbShhcmcsIGkrMSwgcGEpOworICAgICAgICAgICAgaWYgKC0xID09IGVycikgeworICAgICAgICAgICAgICAgIF9jdHlwZXNfZXh0ZW5kX2Vycm9yKFB5RXhjX0FyZ0Vycm9yLCAiYXJndW1lbnQgJWQ6ICIsIGkrMSk7CisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOyAvKiBsZWFraW5nID8gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXJ0eXBlID0gX2N0eXBlc19nZXRfZmZpX3R5cGUocmVzdHlwZSk7Ci0JcmVzYnVmID0gYWxsb2NhKG1heChydHlwZS0+c2l6ZSwgc2l6ZW9mKGZmaV9hcmcpKSk7CisgICAgcnR5cGUgPSBfY3R5cGVzX2dldF9mZmlfdHlwZShyZXN0eXBlKTsKKyAgICByZXNidWYgPSBhbGxvY2EobWF4KHJ0eXBlLT5zaXplLCBzaXplb2YoZmZpX2FyZykpKTsKIAotCWF2YWx1ZXMgPSAodm9pZCAqKilhbGxvY2Eoc2l6ZW9mKHZvaWQgKikgKiBhcmdjb3VudCk7Ci0JYXR5cGVzID0gKGZmaV90eXBlICoqKWFsbG9jYShzaXplb2YoZmZpX3R5cGUgKikgKiBhcmdjb3VudCk7Ci0JaWYgKCFyZXNidWYgfHwgIWF2YWx1ZXMgfHwgIWF0eXBlcykgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgKytpKSB7Ci0JCWF0eXBlc1tpXSA9IGFyZ3NbaV0uZmZpX3R5cGU7Ci0JCWlmIChhdHlwZXNbaV0tPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQotCQkJYXZhbHVlc1tpXSA9ICh2b2lkICopYXJnc1tpXS52YWx1ZS5wOwotCQllbHNlCi0JCQlhdmFsdWVzW2ldID0gKHZvaWQgKikmYXJnc1tpXS52YWx1ZTsKLQl9CisgICAgYXZhbHVlcyA9ICh2b2lkICoqKWFsbG9jYShzaXplb2Yodm9pZCAqKSAqIGFyZ2NvdW50KTsKKyAgICBhdHlwZXMgPSAoZmZpX3R5cGUgKiopYWxsb2NhKHNpemVvZihmZmlfdHlwZSAqKSAqIGFyZ2NvdW50KTsKKyAgICBpZiAoIXJlc2J1ZiB8fCAhYXZhbHVlcyB8fCAhYXR5cGVzKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyArK2kpIHsKKyAgICAgICAgYXR5cGVzW2ldID0gYXJnc1tpXS5mZmlfdHlwZTsKKyAgICAgICAgaWYgKGF0eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgICAgICAgICBhdmFsdWVzW2ldID0gKHZvaWQgKilhcmdzW2ldLnZhbHVlLnA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2YWx1ZXNbaV0gPSAodm9pZCAqKSZhcmdzW2ldLnZhbHVlOworICAgIH0KIAotCWlmICgtMSA9PSBfY2FsbF9mdW5jdGlvbl9wb2ludGVyKGZsYWdzLCBwUHJvYywgYXZhbHVlcywgYXR5cGVzLAotCQkJCQkgcnR5cGUsIHJlc2J1ZiwKLQkJCQkJIFB5X1NBRkVfRE9XTkNBU1QoYXJnY291bnQsCi0JCQkJCQkJICBQeV9zc2l6ZV90LAotCQkJCQkJCSAgaW50KSkpCi0JCWdvdG8gY2xlYW51cDsKKyAgICBpZiAoLTEgPT0gX2NhbGxfZnVuY3Rpb25fcG9pbnRlcihmbGFncywgcFByb2MsIGF2YWx1ZXMsIGF0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHlwZSwgcmVzYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1NBRkVfRE9XTkNBU1QoYXJnY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KSkpCisgICAgICAgIGdvdG8gY2xlYW51cDsKIAogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCS8qIGxpYmZmaSByZXR1cm5zIHRoZSByZXN1bHQgaW4gYSBidWZmZXIgd2l0aCBzaXplb2YoZmZpX2FyZykuIFRoaXMKLQkgICBjYXVzZXMgcHJvYmxlbXMgb24gYmlnIGVuZGlhbiBtYWNoaW5lcywgc2luY2UgdGhlIHJlc3VsdCBidWZmZXIKLQkgICBhZGRyZXNzIGNhbm5vdCBzaW1wbHkgYmUgdXNlZCBhcyByZXN1bHQgcG9pbnRlciwgaW5zdGVhZCB3ZSBtdXN0Ci0JICAgYWRqdXN0IHRoZSBwb2ludGVyIHZhbHVlOgotCSAqLwotCS8qCi0JICBYWFggSSBzaG91bGQgZmluZCBvdXQgYW5kIGNsYXJpZnkgd2h5IHRoaXMgaXMgbmVlZGVkIGF0IGFsbCwKLQkgIGVzcGVjaWFsbHkgd2h5IGFkanVzdGluZyBmb3IgZmZpX3R5cGVfZmxvYXQgbXVzdCBiZSBhdm9pZGVkIG9uCi0JICA2NC1iaXQgcGxhdGZvcm1zLgotCSAqLwotCWlmIChydHlwZS0+dHlwZSAhPSBGRklfVFlQRV9GTE9BVAotCSAgICAmJiBydHlwZS0+dHlwZSAhPSBGRklfVFlQRV9TVFJVQ1QKLQkgICAgJiYgcnR5cGUtPnNpemUgPCBzaXplb2YoZmZpX2FyZykpCi0JCXJlc2J1ZiA9IChjaGFyICopcmVzYnVmICsgc2l6ZW9mKGZmaV9hcmcpIC0gcnR5cGUtPnNpemU7CisgICAgLyogbGliZmZpIHJldHVybnMgdGhlIHJlc3VsdCBpbiBhIGJ1ZmZlciB3aXRoIHNpemVvZihmZmlfYXJnKS4gVGhpcworICAgICAgIGNhdXNlcyBwcm9ibGVtcyBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLCBzaW5jZSB0aGUgcmVzdWx0IGJ1ZmZlcgorICAgICAgIGFkZHJlc3MgY2Fubm90IHNpbXBseSBiZSB1c2VkIGFzIHJlc3VsdCBwb2ludGVyLCBpbnN0ZWFkIHdlIG11c3QKKyAgICAgICBhZGp1c3QgdGhlIHBvaW50ZXIgdmFsdWU6CisgICAgICovCisgICAgLyoKKyAgICAgIFhYWCBJIHNob3VsZCBmaW5kIG91dCBhbmQgY2xhcmlmeSB3aHkgdGhpcyBpcyBuZWVkZWQgYXQgYWxsLAorICAgICAgZXNwZWNpYWxseSB3aHkgYWRqdXN0aW5nIGZvciBmZmlfdHlwZV9mbG9hdCBtdXN0IGJlIGF2b2lkZWQgb24KKyAgICAgIDY0LWJpdCBwbGF0Zm9ybXMuCisgICAgICovCisgICAgaWYgKHJ0eXBlLT50eXBlICE9IEZGSV9UWVBFX0ZMT0FUCisgICAgICAgICYmIHJ0eXBlLT50eXBlICE9IEZGSV9UWVBFX1NUUlVDVAorICAgICAgICAmJiBydHlwZS0+c2l6ZSA8IHNpemVvZihmZmlfYXJnKSkKKyAgICAgICAgcmVzYnVmID0gKGNoYXIgKilyZXNidWYgKyBzaXplb2YoZmZpX2FyZykgLSBydHlwZS0+c2l6ZTsKICNlbmRpZgogCiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoaWlkICYmIHBJdW5rKSB7Ci0JCWlmICgqKGludCAqKXJlc2J1ZiAmIDB4ODAwMDAwMDApCi0JCQlyZXR2YWwgPSBHZXRDb21FcnJvcigqKEhSRVNVTFQgKilyZXNidWYsIGlpZCwgcEl1bmspOwotCQllbHNlCi0JCQlyZXR2YWwgPSBQeUludF9Gcm9tTG9uZygqKGludCAqKXJlc2J1Zik7Ci0JfSBlbHNlIGlmIChmbGFncyAmIEZVTkNGTEFHX0hSRVNVTFQpIHsKLQkJaWYgKCooaW50ICopcmVzYnVmICYgMHg4MDAwMDAwMCkKLQkJCXJldHZhbCA9IFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKCooaW50ICopcmVzYnVmKTsKLQkJZWxzZQotCQkJcmV0dmFsID0gUHlJbnRfRnJvbUxvbmcoKihpbnQgKilyZXNidWYpOwotCX0gZWxzZQorICAgIGlmIChpaWQgJiYgcEl1bmspIHsKKyAgICAgICAgaWYgKCooaW50ICopcmVzYnVmICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgIHJldHZhbCA9IEdldENvbUVycm9yKCooSFJFU1VMVCAqKXJlc2J1ZiwgaWlkLCBwSXVuayk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHZhbCA9IFB5SW50X0Zyb21Mb25nKCooaW50ICopcmVzYnVmKTsKKyAgICB9IGVsc2UgaWYgKGZsYWdzICYgRlVOQ0ZMQUdfSFJFU1VMVCkgeworICAgICAgICBpZiAoKihpbnQgKilyZXNidWYgJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgcmV0dmFsID0gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoKihpbnQgKilyZXNidWYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR2YWwgPSBQeUludF9Gcm9tTG9uZygqKGludCAqKXJlc2J1Zik7CisgICAgfSBlbHNlCiAjZW5kaWYKLQkJcmV0dmFsID0gR2V0UmVzdWx0KHJlc3R5cGUsIHJlc2J1ZiwgY2hlY2tlcik7CisgICAgICAgIHJldHZhbCA9IEdldFJlc3VsdChyZXN0eXBlLCByZXNidWYsIGNoZWNrZXIpOwogICBjbGVhbnVwOgotCWZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgKytpKQotCQlQeV9YREVDUkVGKGFyZ3NbaV0ua2VlcCk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7ICsraSkKKyAgICAgICAgUHlfWERFQ1JFRihhcmdzW2ldLmtlZXApOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyBpbnQKIF9wYXJzZV92b2lkcChQeU9iamVjdCAqb2JqLCB2b2lkICoqYWRkcmVzcykKIHsKLQkqYWRkcmVzcyA9IFB5TG9uZ19Bc1ZvaWRQdHIob2JqKTsKLQlpZiAoKmFkZHJlc3MgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgKmFkZHJlc3MgPSBQeUxvbmdfQXNWb2lkUHRyKG9iaik7CisgICAgaWYgKCphZGRyZXNzID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKQEAgLTEyMDcsMjEgKzEyMDcsMjEgQEAKIGdpdmVuLCB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgY2FsbCB0byBHZXRMYXN0RXJyb3IoKSBpcyB1c2VkLlxuIjsKIHN0YXRpYyBQeU9iamVjdCAqZm9ybWF0X2Vycm9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVRDSEFSICpscE1zZ0J1ZjsKLQlEV09SRCBjb2RlID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOkZvcm1hdEVycm9yIiwgJmNvZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoY29kZSA9PSAwKQotCQljb2RlID0gR2V0TGFzdEVycm9yKCk7Ci0JbHBNc2dCdWYgPSBGb3JtYXRFcnJvcihjb2RlKTsKLQlpZiAobHBNc2dCdWYpIHsKLQkJcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZShQWUJVSUxEX1RTVFIsIGxwTXNnQnVmKTsKLQkJTG9jYWxGcmVlKGxwTXNnQnVmKTsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJzIiwgIjxubyBkZXNjcmlwdGlvbj4iKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFRDSEFSICpscE1zZ0J1ZjsKKyAgICBEV09SRCBjb2RlID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOkZvcm1hdEVycm9yIiwgJmNvZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoY29kZSA9PSAwKQorICAgICAgICBjb2RlID0gR2V0TGFzdEVycm9yKCk7CisgICAgbHBNc2dCdWYgPSBGb3JtYXRFcnJvcihjb2RlKTsKKyAgICBpZiAobHBNc2dCdWYpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZShQWUJVSUxEX1RTVFIsIGxwTXNnQnVmKTsKKyAgICAgICAgTG9jYWxGcmVlKGxwTXNnQnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJzIiwgIjxubyBkZXNjcmlwdGlvbj4iKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGNoYXIgbG9hZF9saWJyYXJ5X2RvY1tdID0KQEAgLTEyMzIsNDAgKzEyMzIsNDAgQEAKIG1vZHVsZS5cbiI7CiBzdGF0aWMgUHlPYmplY3QgKmxvYWRfbGlicmFyeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JVENIQVIgKm5hbWU7Ci0JUHlPYmplY3QgKm5hbWVvYmo7Ci0JUHlPYmplY3QgKmlnbm9yZWQ7Ci0JSE1PRFVMRSBoTW9kOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPOkxvYWRMaWJyYXJ5IiwgJm5hbWVvYmosICZpZ25vcmVkKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgVENIQVIgKm5hbWU7CisgICAgUHlPYmplY3QgKm5hbWVvYmo7CisgICAgUHlPYmplY3QgKmlnbm9yZWQ7CisgICAgSE1PRFVMRSBoTW9kOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPOkxvYWRMaWJyYXJ5IiwgJm5hbWVvYmosICZpZ25vcmVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgX1VOSUNPREUKLQluYW1lID0gYWxsb2NhKChQeVN0cmluZ19TaXplKG5hbWVvYmopICsgMSkgKiBzaXplb2YoV0NIQVIpKTsKLQlpZiAoIW5hbWUpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG5hbWUgPSBhbGxvY2EoKFB5U3RyaW5nX1NpemUobmFtZW9iaikgKyAxKSAqIHNpemVvZihXQ0hBUikpOworICAgIGlmICghbmFtZSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl7Ci0JCWludCByOwotCQljaGFyICphbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWVvYmopOwotCQlpZighYW5hbWUpCi0JCQlyZXR1cm4gTlVMTDsKLQkJciA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBhbmFtZSwgLTEsIG5hbWUsIFB5U3RyaW5nX1NpemUobmFtZW9iaikgKyAxKTsKLQkJbmFtZVtyXSA9IDA7Ci0JfQorICAgIHsKKyAgICAgICAgaW50IHI7CisgICAgICAgIGNoYXIgKmFuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZW9iaik7CisgICAgICAgIGlmKCFhbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuYW1lLCAtMSwgbmFtZSwgUHlTdHJpbmdfU2l6ZShuYW1lb2JqKSArIDEpOworICAgICAgICBuYW1lW3JdID0gMDsKKyAgICB9CiAjZWxzZQotCW5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lb2JqKTsKLQlpZighbmFtZSkKLQkJcmV0dXJuIE5VTEw7CisgICAgbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWVvYmopOworICAgIGlmKCFuYW1lKQorICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgogCi0JaE1vZCA9IExvYWRMaWJyYXJ5KG5hbWUpOwotCWlmICghaE1vZCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKKyAgICBoTW9kID0gTG9hZExpYnJhcnkobmFtZSk7CisgICAgaWYgKCFoTW9kKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOwogI2lmZGVmIF9XSU42NAotCXJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoaE1vZCk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihoTW9kKTsKICNlbHNlCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBoTW9kKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGhNb2QpOwogI2VuZGlmCiB9CiAKQEAgLTEyNzUsMTMgKzEyNzUsMTMgQEAKIEZyZWUgdGhlIGhhbmRsZSBvZiBhbiBleGVjdXRhYmxlIHByZXZpb3VzbHkgbG9hZGVkIGJ5IExvYWRMaWJyYXJ5LlxuIjsKIHN0YXRpYyBQeU9iamVjdCAqZnJlZV9saWJyYXJ5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl2b2lkICpoTW9kOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyY6RnJlZUxpYnJhcnkiLCAmX3BhcnNlX3ZvaWRwLCAmaE1vZCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghRnJlZUxpYnJhcnkoKEhNT0RVTEUpaE1vZCkpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHZvaWQgKmhNb2Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpGcmVlTGlicmFyeSIsICZfcGFyc2Vfdm9pZHAsICZoTW9kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFGcmVlTGlicmFyeSgoSE1PRFVMRSloTW9kKSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIG9ic29sZXRlLCBzaG91bGQgYmUgcmVtb3ZlZCAqLwpAQCAtMTI4OSw1NSArMTI4OSw1NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfY29tbWV0aG9kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlJVW5rbm93biAqcEl1bms7Ci0JaW50IGluZGV4OwotCVB5T2JqZWN0ICphcmd1bWVudHM7Ci0JUFBST0MgKmxwVnRibDsKLQlQeU9iamVjdCAqcmVzdWx0OwotCUNEYXRhT2JqZWN0ICpwY29tOwotCVB5T2JqZWN0ICphcmd0eXBlcyA9IE5VTEw7CisgICAgSVVua25vd24gKnBJdW5rOworICAgIGludCBpbmRleDsKKyAgICBQeU9iamVjdCAqYXJndW1lbnRzOworICAgIFBQUk9DICpscFZ0Ymw7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBDRGF0YU9iamVjdCAqcGNvbTsKKyAgICBQeU9iamVjdCAqYXJndHlwZXMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkgICAgICAiT2lPIXxPISIsCi0JCQkgICAgICAmcGNvbSwgJmluZGV4LAotCQkJICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3VtZW50cywKLQkJCSAgICAgICZQeVR1cGxlX1R5cGUsICZhcmd0eXBlcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT2lPIXxPISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwY29tLCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVR1cGxlX1R5cGUsICZhcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVR1cGxlX1R5cGUsICZhcmd0eXBlcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGFyZ3R5cGVzICYmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3VtZW50cykgIT0gUHlUdXBsZV9HRVRfU0laRShhcmd0eXBlcykpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJNZXRob2QgdGFrZXMgJWQgYXJndW1lbnRzICglZCBnaXZlbikiLAotCQkJICAgICBQeVR1cGxlX0dFVF9TSVpFKGFyZ3R5cGVzKSwgUHlUdXBsZV9HRVRfU0laRShhcmd1bWVudHMpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChhcmd0eXBlcyAmJiAoUHlUdXBsZV9HRVRfU0laRShhcmd1bWVudHMpICE9IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCB0YWtlcyAlZCBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKGFyZ3R5cGVzKSwgUHlUdXBsZV9HRVRfU0laRShhcmd1bWVudHMpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCFDRGF0YU9iamVjdF9DaGVjayhwY29tKSB8fCAocGNvbS0+Yl9zaXplICE9IHNpemVvZih2b2lkICopKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiQ09NIFBvaW50ZXIgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkgICAgIFB5X1RZUEUocGNvbSktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFDRGF0YU9iamVjdF9DaGVjayhwY29tKSB8fCAocGNvbS0+Yl9zaXplICE9IHNpemVvZih2b2lkICopKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkNPTSBQb2ludGVyIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShwY29tKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICgoKih2b2lkICoqKShwY29tLT5iX3B0cikpID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIlRoZSBDT00gJ3RoaXMnIHBvaW50ZXIgaXMgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCgqKHZvaWQgKiopKHBjb20tPmJfcHRyKSkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgQ09NICd0aGlzJyBwb2ludGVyIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcEl1bmsgPSAoSVVua25vd24gKikoKih2b2lkICoqKShwY29tLT5iX3B0cikpOwotCWxwVnRibCA9IChQUFJPQyAqKShwSXVuay0+bHBWdGJsKTsKKyAgICBwSXVuayA9IChJVW5rbm93biAqKSgqKHZvaWQgKiopKHBjb20tPmJfcHRyKSk7CisgICAgbHBWdGJsID0gKFBQUk9DICopKHBJdW5rLT5scFZ0YmwpOwogCi0JcmVzdWx0ID0gIF9jdHlwZXNfY2FsbHByb2MobHBWdGJsW2luZGV4XSwKLQkJCSAgICBhcmd1bWVudHMsCisgICAgcmVzdWx0ID0gIF9jdHlwZXNfY2FsbHByb2MobHBWdGJsW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cywKICNpZmRlZiBNU19XSU4zMgotCQkJICAgIHBJdW5rLAotCQkJICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBwSXVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAjZW5kaWYKLQkJCSAgICBGVU5DRkxBR19IUkVTVUxULCAvKiBmbGFncyAqLwotCQkJICAgIGFyZ3R5cGVzLCAvKiBzZWxmLT5hcmd0eXBlcyAqLwotCQkJICAgIE5VTEwsIC8qIHNlbGYtPnJlc3R5cGUgKi8KLQkJCSAgICBOVUxMKTsgLyogY2hlY2tlciAqLwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBGVU5DRkxBR19IUkVTVUxULCAvKiBmbGFncyAqLworICAgICAgICAgICAgICAgIGFyZ3R5cGVzLCAvKiBzZWxmLT5hcmd0eXBlcyAqLworICAgICAgICAgICAgICAgIE5VTEwsIC8qIHNlbGYtPnJlc3R5cGUgKi8KKyAgICAgICAgICAgICAgICBOVUxMKTsgLyogY2hlY2tlciAqLworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBjaGFyIGNvcHlfY29tX3BvaW50ZXJfZG9jW10gPQpAQCAtMTM0Niw4OSArMTM0Niw4OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvcHlfY29tX3BvaW50ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpwMSwgKnAyLCAqciA9IE5VTEw7Ci0Jc3RydWN0IGFyZ3VtZW50IGEsIGI7Ci0JSVVua25vd24gKnNyYywgKipwZHN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT086Q29weUNvbVBvaW50ZXIiLCAmcDEsICZwMikpCi0JCXJldHVybiBOVUxMOwotCWEua2VlcCA9IGIua2VlcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnAxLCAqcDIsICpyID0gTlVMTDsKKyAgICBzdHJ1Y3QgYXJndW1lbnQgYSwgYjsKKyAgICBJVW5rbm93biAqc3JjLCAqKnBkc3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTzpDb3B5Q29tUG9pbnRlciIsICZwMSwgJnAyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYS5rZWVwID0gYi5rZWVwID0gTlVMTDsKIAotCWlmICgtMSA9PSBDb252UGFyYW0ocDEsIDAsICZhKSB8fCAtMSA9PSBDb252UGFyYW0ocDIsIDEsICZiKSkKLQkJZ290byBkb25lOwotCXNyYyA9IChJVW5rbm93biAqKWEudmFsdWUucDsKLQlwZHN0ID0gKElVbmtub3duICoqKWIudmFsdWUucDsKKyAgICBpZiAoLTEgPT0gQ29udlBhcmFtKHAxLCAwLCAmYSkgfHwgLTEgPT0gQ29udlBhcmFtKHAyLCAxLCAmYikpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBzcmMgPSAoSVVua25vd24gKilhLnZhbHVlLnA7CisgICAgcGRzdCA9IChJVW5rbm93biAqKiliLnZhbHVlLnA7CiAKLQlpZiAocGRzdCA9PSBOVUxMKQotCQlyID0gUHlJbnRfRnJvbUxvbmcoRV9QT0lOVEVSKTsKLQllbHNlIHsKLQkJaWYgKHNyYykKLQkJCXNyYy0+bHBWdGJsLT5BZGRSZWYoc3JjKTsKLQkJKnBkc3QgPSBzcmM7Ci0JCXIgPSBQeUludF9Gcm9tTG9uZyhTX09LKTsKLQl9CisgICAgaWYgKHBkc3QgPT0gTlVMTCkKKyAgICAgICAgciA9IFB5SW50X0Zyb21Mb25nKEVfUE9JTlRFUik7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzcmMpCisgICAgICAgICAgICBzcmMtPmxwVnRibC0+QWRkUmVmKHNyYyk7CisgICAgICAgICpwZHN0ID0gc3JjOworICAgICAgICByID0gUHlJbnRfRnJvbUxvbmcoU19PSyk7CisgICAgfQogICBkb25lOgotCVB5X1hERUNSRUYoYS5rZWVwKTsKLQlQeV9YREVDUkVGKGIua2VlcCk7Ci0JcmV0dXJuIHI7CisgICAgUHlfWERFQ1JFRihhLmtlZXApOworICAgIFB5X1hERUNSRUYoYi5rZWVwKTsKKyAgICByZXR1cm4gcjsKIH0KICNlbHNlCiAKIHN0YXRpYyBQeU9iamVjdCAqcHlfZGxfb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQl2b2lkICogaGFuZGxlOwotI2lmZGVmIFJUTERfTE9DQUwJCi0JaW50IG1vZGUgPSBSVExEX05PVyB8IFJUTERfTE9DQUw7CisgICAgY2hhciAqbmFtZTsKKyAgICB2b2lkICogaGFuZGxlOworI2lmZGVmIFJUTERfTE9DQUwKKyAgICBpbnQgbW9kZSA9IFJUTERfTk9XIHwgUlRMRF9MT0NBTDsKICNlbHNlCi0JLyogY3lnd2luIGRvZXNuJ3QgZGVmaW5lIFJUTERfTE9DQUwgKi8KLQlpbnQgbW9kZSA9IFJUTERfTk9XOworICAgIC8qIGN5Z3dpbiBkb2Vzbid0IGRlZmluZSBSVExEX0xPQ0FMICovCisgICAgaW50IG1vZGUgPSBSVExEX05PVzsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxpOmRsb3BlbiIsICZuYW1lLCAmbW9kZSkpCi0JCXJldHVybiBOVUxMOwotCW1vZGUgfD0gUlRMRF9OT1c7Ci0JaGFuZGxlID0gY3R5cGVzX2Rsb3BlbihuYW1lLCBtb2RlKTsKLQlpZiAoIWhhbmRsZSkgewotCQljaGFyICplcnJtc2cgPSBjdHlwZXNfZGxlcnJvcigpOwotCQlpZiAoIWVycm1zZykKLQkJCWVycm1zZyA9ICJkbG9wZW4oKSBlcnJvciI7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PU0Vycm9yLAotCQkJCSAgICAgICBlcnJtc2cpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihoYW5kbGUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxpOmRsb3BlbiIsICZuYW1lLCAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1vZGUgfD0gUlRMRF9OT1c7CisgICAgaGFuZGxlID0gY3R5cGVzX2Rsb3BlbihuYW1lLCBtb2RlKTsKKyAgICBpZiAoIWhhbmRsZSkgeworICAgICAgICBjaGFyICplcnJtc2cgPSBjdHlwZXNfZGxlcnJvcigpOworICAgICAgICBpZiAoIWVycm1zZykKKyAgICAgICAgICAgIGVycm1zZyA9ICJkbG9wZW4oKSBlcnJvciI7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKGhhbmRsZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqcHlfZGxfY2xvc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmhhbmRsZTsKKyAgICB2b2lkICpoYW5kbGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOmRsY2xvc2UiLCAmX3BhcnNlX3ZvaWRwLCAmaGFuZGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRsY2xvc2UoaGFuZGxlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT1NFcnJvciwKLQkJCQkgICAgICAgY3R5cGVzX2RsZXJyb3IoKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpkbGNsb3NlIiwgJl9wYXJzZV92b2lkcCwgJmhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChkbGNsb3NlKGhhbmRsZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVzX2RsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqcHlfZGxfc3ltKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCXZvaWQgKmhhbmRsZTsKLQl2b2lkICpwdHI7CisgICAgY2hhciAqbmFtZTsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgdm9pZCAqcHRyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnM6ZGxzeW0iLAotCQkJICAgICAgJl9wYXJzZV92b2lkcCwgJmhhbmRsZSwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlwdHIgPSBjdHlwZXNfZGxzeW0oKHZvaWQqKWhhbmRsZSwgbmFtZSk7Ci0JaWYgKCFwdHIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsCi0JCQkJICAgICAgIGN0eXBlc19kbGVycm9yKCkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihwdHIpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZzOmRsc3ltIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJl9wYXJzZV92b2lkcCwgJmhhbmRsZSwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSBjdHlwZXNfZGxzeW0oKHZvaWQqKWhhbmRsZSwgbmFtZSk7CisgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVzX2RsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHB0cik7CiB9CiAjZW5kaWYKIApAQCAtMTQ0MCwyNyArMTQ0MCwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZnVuY3Rpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmZ1bmM7Ci0JUHlPYmplY3QgKmFyZ3VtZW50czsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIHZvaWQgKmZ1bmM7CisgICAgUHlPYmplY3QgKmFyZ3VtZW50czsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkgICAgICAiTyZPISIsCi0JCQkgICAgICAmX3BhcnNlX3ZvaWRwLCAmZnVuYywKLQkJCSAgICAgICZQeVR1cGxlX1R5cGUsICZhcmd1bWVudHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk8mTyEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmX3BhcnNlX3ZvaWRwLCAmZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3VtZW50cykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gIF9jdHlwZXNfY2FsbHByb2MoKFBQUk9DKWZ1bmMsCi0JCQkgICAgYXJndW1lbnRzLAorICAgIHJlc3VsdCA9ICBfY3R5cGVzX2NhbGxwcm9jKChQUFJPQylmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLAogI2lmZGVmIE1TX1dJTjMyCi0JCQkgICAgTlVMTCwKLQkJCSAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAjZW5kaWYKLQkJCSAgICAwLCAvKiBmbGFncyAqLwotCQkJICAgIE5VTEwsIC8qIHNlbGYtPmFyZ3R5cGVzICovCi0JCQkgICAgTlVMTCwgLyogc2VsZi0+cmVzdHlwZSAqLwotCQkJICAgIE5VTEwpOyAvKiBjaGVja2VyICovCi0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGZsYWdzICovCisgICAgICAgICAgICAgICAgTlVMTCwgLyogc2VsZi0+YXJndHlwZXMgKi8KKyAgICAgICAgICAgICAgICBOVUxMLCAvKiBzZWxmLT5yZXN0eXBlICovCisgICAgICAgICAgICAgICAgTlVMTCk7IC8qIGNoZWNrZXIgKi8KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKgpAQCAtMTQ3MSwyNyArMTQ3MSwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfY2RlY2xmdW5jdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jdm9pZCAqZnVuYzsKLQlQeU9iamVjdCAqYXJndW1lbnRzOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgdm9pZCAqZnVuYzsKKyAgICBQeU9iamVjdCAqYXJndW1lbnRzOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKLQkJCSAgICAgICJPJk8hIiwKLQkJCSAgICAgICZfcGFyc2Vfdm9pZHAsICZmdW5jLAotCQkJICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3VtZW50cykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTyZPISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZfcGFyc2Vfdm9pZHAsICZmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlUdXBsZV9UeXBlLCAmYXJndW1lbnRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXN1bHQgPSAgX2N0eXBlc19jYWxscHJvYygoUFBST0MpZnVuYywKLQkJCSAgICBhcmd1bWVudHMsCisgICAgcmVzdWx0ID0gIF9jdHlwZXNfY2FsbHByb2MoKFBQUk9DKWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMsCiAjaWZkZWYgTVNfV0lOMzIKLQkJCSAgICBOVUxMLAotCQkJICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICNlbmRpZgotCQkJICAgIEZVTkNGTEFHX0NERUNMLCAvKiBmbGFncyAqLwotCQkJICAgIE5VTEwsIC8qIHNlbGYtPmFyZ3R5cGVzICovCi0JCQkgICAgTlVMTCwgLyogc2VsZi0+cmVzdHlwZSAqLwotCQkJICAgIE5VTEwpOyAvKiBjaGVja2VyICovCi0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZVTkNGTEFHX0NERUNMLCAvKiBmbGFncyAqLworICAgICAgICAgICAgICAgIE5VTEwsIC8qIHNlbGYtPmFyZ3R5cGVzICovCisgICAgICAgICAgICAgICAgTlVMTCwgLyogc2VsZi0+cmVzdHlwZSAqLworICAgICAgICAgICAgICAgIE5VTEwpOyAvKiBjaGVja2VyICovCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTA1LDE3ICsxNTA1LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2l6ZW9mX2Z1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KG9iaik7Ci0JaWYgKGRpY3QpCi0JCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChkaWN0LT5zaXplKTsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2JqKTsKKyAgICBpZiAoZGljdCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGRpY3QtPnNpemUpOwogCi0JaWYgKENEYXRhT2JqZWN0X0NoZWNrKG9iaikpCi0JCXJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoKENEYXRhT2JqZWN0ICopb2JqKS0+Yl9zaXplKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJInRoaXMgdHlwZSBoYXMgbm8gc2l6ZSIpOwotCXJldHVybiBOVUxMOworICAgIGlmIChDRGF0YU9iamVjdF9DaGVjayhvYmopKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoKChDRGF0YU9iamVjdCAqKW9iaiktPmJfc2l6ZSk7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgInRoaXMgdHlwZSBoYXMgbm8gc2l6ZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgY2hhciBhbGlnbm1lbnRfZG9jW10gPQpAQCAtMTUyNiwxOSArMTUyNiwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsaWduX2Z1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KG9iaik7Ci0JaWYgKGRpY3QpCi0JCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChkaWN0LT5hbGlnbik7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KG9iaik7CisgICAgaWYgKGRpY3QpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChkaWN0LT5hbGlnbik7CiAKLQlkaWN0ID0gUHlPYmplY3Rfc3RnZGljdChvYmopOwotCWlmIChkaWN0KQotCQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoZGljdC0+YWxpZ24pOworICAgIGRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KG9iaik7CisgICAgaWYgKGRpY3QpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChkaWN0LT5hbGlnbik7CiAKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJIm5vIGFsaWdubWVudCBpbmZvIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIm5vIGFsaWdubWVudCBpbmZvIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBjaGFyIGJ5cmVmX2RvY1tdID0KQEAgLTE1NTMsMzYgKzE1NTMsMzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXJlZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlDQXJnT2JqZWN0ICpwYXJnOwotCVB5T2JqZWN0ICpvYmo7Ci0JUHlPYmplY3QgKnB5b2Zmc2V0ID0gTlVMTDsKLQlQeV9zc2l6ZV90IG9mZnNldCA9IDA7CisgICAgUHlDQXJnT2JqZWN0ICpwYXJnOworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgUHlPYmplY3QgKnB5b2Zmc2V0ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IG9mZnNldCA9IDA7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJieXJlZiIsIDEsIDIsCi0JCQkgICAgICAgJm9iaiwgJnB5b2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHB5b2Zmc2V0KSB7Ci0JCW9mZnNldCA9IFB5TnVtYmVyX0FzU3NpemVfdChweW9mZnNldCwgTlVMTCk7Ci0JCWlmIChvZmZzZXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKG9iaikpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImJ5cmVmKCkgYXJndW1lbnQgbXVzdCBiZSBhIGN0eXBlcyBpbnN0YW5jZSwgbm90ICclcyciLAotCQkJICAgICBQeV9UWVBFKG9iaiktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiYnlyZWYiLCAxLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iaiwgJnB5b2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHB5b2Zmc2V0KSB7CisgICAgICAgIG9mZnNldCA9IFB5TnVtYmVyX0FzU3NpemVfdChweW9mZnNldCwgTlVMTCk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKG9iaikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJieXJlZigpIGFyZ3VtZW50IG11c3QgYmUgYSBjdHlwZXMgaW5zdGFuY2UsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXBhcmcgPSBQeUNBcmdPYmplY3RfbmV3KCk7Ci0JaWYgKHBhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcGFyZyA9IFB5Q0FyZ09iamVjdF9uZXcoKTsKKyAgICBpZiAocGFyZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXBhcmctPnRhZyA9ICdQJzsKLQlwYXJnLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKLQlQeV9JTkNSRUYob2JqKTsKLQlwYXJnLT5vYmogPSBvYmo7Ci0JcGFyZy0+dmFsdWUucCA9IChjaGFyICopKChDRGF0YU9iamVjdCAqKW9iaiktPmJfcHRyICsgb2Zmc2V0OwotCXJldHVybiAoUHlPYmplY3QgKilwYXJnOworICAgIHBhcmctPnRhZyA9ICdQJzsKKyAgICBwYXJnLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKKyAgICBQeV9JTkNSRUYob2JqKTsKKyAgICBwYXJnLT5vYmogPSBvYmo7CisgICAgcGFyZy0+dmFsdWUucCA9IChjaGFyICopKChDRGF0YU9iamVjdCAqKW9iaiktPmJfcHRyICsgb2Zmc2V0OworICAgIHJldHVybiAoUHlPYmplY3QgKilwYXJnOwogfQogCiBzdGF0aWMgY2hhciBhZGRyZXNzb2ZfZG9jW10gPQpAQCAtMTU5Miw0NCArMTU5Miw0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFkZHJlc3NvZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQlpZiAoQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cigoKENEYXRhT2JqZWN0ICopb2JqKS0+Yl9wdHIpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiaW52YWxpZCB0eXBlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKENEYXRhT2JqZWN0X0NoZWNrKG9iaikpCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoKChDRGF0YU9iamVjdCAqKW9iaiktPmJfcHRyKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB0eXBlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbnZlcnRlcihQeU9iamVjdCAqb2JqLCB2b2lkICoqYWRkcmVzcykKIHsKLQkqYWRkcmVzcyA9IFB5TG9uZ19Bc1ZvaWRQdHIob2JqKTsKLQlyZXR1cm4gKmFkZHJlc3MgIT0gTlVMTDsKKyAgICAqYWRkcmVzcyA9IFB5TG9uZ19Bc1ZvaWRQdHIob2JqKTsKKyAgICByZXR1cm4gKmFkZHJlc3MgIT0gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIE15X1B5T2JqX0Zyb21QdHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpvYjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOlB5T2JqX0Zyb21QdHIiLCBjb252ZXJ0ZXIsICZvYikpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihvYik7Ci0JcmV0dXJuIG9iOworICAgIFB5T2JqZWN0ICpvYjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOlB5T2JqX0Zyb21QdHIiLCBjb252ZXJ0ZXIsICZvYikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihvYik7CisgICAgcmV0dXJuIG9iOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogTXlfUHlfSU5DUkVGKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCVB5X0lOQ1JFRihhcmcpOyAvKiB0aGF0J3Mgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGZvciAqLwotCVB5X0lOQ1JFRihhcmcpOyAvKiB0aGF0IGZvciByZXR1cm5pbmcgaXQgKi8KLQlyZXR1cm4gYXJnOworICAgIFB5X0lOQ1JFRihhcmcpOyAvKiB0aGF0J3Mgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGZvciAqLworICAgIFB5X0lOQ1JFRihhcmcpOyAvKiB0aGF0IGZvciByZXR1cm5pbmcgaXQgKi8KKyAgICByZXR1cm4gYXJnOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogTXlfUHlfREVDUkVGKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCVB5X0RFQ1JFRihhcmcpOyAvKiB0aGF0J3Mgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGZvciAqLwotCVB5X0lOQ1JFRihhcmcpOyAvKiB0aGF0J3MgZm9yIHJldHVybmluZyBpdCAqLwotCXJldHVybiBhcmc7CisgICAgUHlfREVDUkVGKGFyZyk7IC8qIHRoYXQncyB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgZm9yICovCisgICAgUHlfSU5DUkVGKGFyZyk7IC8qIHRoYXQncyBmb3IgcmV0dXJuaW5nIGl0ICovCisgICAgcmV0dXJuIGFyZzsKIH0KIAogI2lmZGVmIENUWVBFU19VTklDT0RFCkBAIC0xNjQzLDI0MiArMTY0MywyNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY29udmVyc2lvbl9tb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpjb2RpbmcsICptb2RlOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqY29kaW5nLCAqbW9kZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6czpzZXRfY29udmVyc2lvbl9tb2RlIiwgJmNvZGluZywgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCIoenopIiwgX2N0eXBlc19jb252ZXJzaW9uX2VuY29kaW5nLCBfY3R5cGVzX2NvbnZlcnNpb25fZXJyb3JzKTsKLQlpZiAoY29kaW5nKSB7Ci0JCVB5TWVtX0ZyZWUoX2N0eXBlc19jb252ZXJzaW9uX2VuY29kaW5nKTsKLQkJX2N0eXBlc19jb252ZXJzaW9uX2VuY29kaW5nID0gUHlNZW1fTWFsbG9jKHN0cmxlbihjb2RpbmcpICsgMSk7Ci0JCXN0cmNweShfY3R5cGVzX2NvbnZlcnNpb25fZW5jb2RpbmcsIGNvZGluZyk7Ci0JfSBlbHNlIHsKLQkJX2N0eXBlc19jb252ZXJzaW9uX2VuY29kaW5nID0gTlVMTDsKLQl9Ci0JUHlNZW1fRnJlZShfY3R5cGVzX2NvbnZlcnNpb25fZXJyb3JzKTsKLQlfY3R5cGVzX2NvbnZlcnNpb25fZXJyb3JzID0gUHlNZW1fTWFsbG9jKHN0cmxlbihtb2RlKSArIDEpOwotCXN0cmNweShfY3R5cGVzX2NvbnZlcnNpb25fZXJyb3JzLCBtb2RlKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienM6c2V0X2NvbnZlcnNpb25fbW9kZSIsICZjb2RpbmcsICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiKHp6KSIsIF9jdHlwZXNfY29udmVyc2lvbl9lbmNvZGluZywgX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycyk7CisgICAgaWYgKGNvZGluZykgeworICAgICAgICBQeU1lbV9GcmVlKF9jdHlwZXNfY29udmVyc2lvbl9lbmNvZGluZyk7CisgICAgICAgIF9jdHlwZXNfY29udmVyc2lvbl9lbmNvZGluZyA9IFB5TWVtX01hbGxvYyhzdHJsZW4oY29kaW5nKSArIDEpOworICAgICAgICBzdHJjcHkoX2N0eXBlc19jb252ZXJzaW9uX2VuY29kaW5nLCBjb2RpbmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9jdHlwZXNfY29udmVyc2lvbl9lbmNvZGluZyA9IE5VTEw7CisgICAgfQorICAgIFB5TWVtX0ZyZWUoX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycyk7CisgICAgX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycyA9IFB5TWVtX01hbGxvYyhzdHJsZW4obW9kZSkgKyAxKTsKKyAgICBzdHJjcHkoX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycywgbW9kZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlDRGF0YU9iamVjdCAqb2JqOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIENEYXRhT2JqZWN0ICpvYmo7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCQkJICAgICAgIk9pOnJlc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJPaTpyZXNpemUiLAogI2Vsc2UKLQkJCSAgICAgICJPbjpyZXNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT246cmVzaXplIiwKICNlbmRpZgotCQkJICAgICAgJm9iaiwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iaiwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKW9iaik7Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJleGNlcHRlZCBjdHlwZXMgaW5zdGFuY2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzaXplIDwgZGljdC0+c2l6ZSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICBkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilvYmopOworICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRlZCBjdHlwZXMgaW5zdGFuY2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzaXplIDwgZGljdC0+c2l6ZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDAKLQkJCSAgICAgIm1pbmltdW0gc2l6ZSBpcyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAibWluaW11bSBzaXplIGlzICVkIiwKICNlbHNlCi0JCQkgICAgICJtaW5pbXVtIHNpemUgaXMgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIHNpemUgaXMgJXpkIiwKICNlbmRpZgotCQkJICAgICBkaWN0LT5zaXplKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChvYmotPmJfbmVlZHNmcmVlID09IDApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJNZW1vcnkgY2Fubm90IGJlIHJlc2l6ZWQgYmVjYXVzZSB0aGlzIG9iamVjdCBkb2Vzbid0IG93biBpdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHNpemUgPD0gc2l6ZW9mKG9iai0+Yl92YWx1ZSkpIHsKLQkJLyogaW50ZXJuYWwgZGVmYXVsdCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoICovCi0JCW9iai0+Yl9zaXplID0gc2l6ZTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAob2JqLT5iX3NpemUgPD0gc2l6ZW9mKG9iai0+Yl92YWx1ZSkpIHsKLQkJLyogV2UgYXJlIGN1cnJlbnRseSB1c2luZyB0aGUgb2JqZWN0cyBkZWZhdWx0IGJ1ZmZlciwgYnV0IGl0Ci0JCSAgIGlzbid0IGxhcmdlIGVub3VnaCBhbnkgbW9yZS4gKi8KLQkJdm9pZCAqcHRyID0gUHlNZW1fTWFsbG9jKHNpemUpOwotCQlpZiAocHRyID09IE5VTEwpCi0JCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJbWVtc2V0KHB0ciwgMCwgc2l6ZSk7Ci0JCW1lbW1vdmUocHRyLCBvYmotPmJfcHRyLCBvYmotPmJfc2l6ZSk7Ci0JCW9iai0+Yl9wdHIgPSBwdHI7Ci0JCW9iai0+Yl9zaXplID0gc2l6ZTsKLQl9IGVsc2UgewotCQl2b2lkICogcHRyID0gUHlNZW1fUmVhbGxvYyhvYmotPmJfcHRyLCBzaXplKTsKLQkJaWYgKHB0ciA9PSBOVUxMKQotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCW9iai0+Yl9wdHIgPSBwdHI7Ci0JCW9iai0+Yl9zaXplID0gc2l6ZTsKLQl9CisgICAgICAgICAgICAgICAgICAgICBkaWN0LT5zaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChvYmotPmJfbmVlZHNmcmVlID09IDApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTWVtb3J5IGNhbm5vdCBiZSByZXNpemVkIGJlY2F1c2UgdGhpcyBvYmplY3QgZG9lc24ndCBvd24gaXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzaXplIDw9IHNpemVvZihvYmotPmJfdmFsdWUpKSB7CisgICAgICAgIC8qIGludGVybmFsIGRlZmF1bHQgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCAqLworICAgICAgICBvYmotPmJfc2l6ZSA9IHNpemU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgaWYgKG9iai0+Yl9zaXplIDw9IHNpemVvZihvYmotPmJfdmFsdWUpKSB7CisgICAgICAgIC8qIFdlIGFyZSBjdXJyZW50bHkgdXNpbmcgdGhlIG9iamVjdHMgZGVmYXVsdCBidWZmZXIsIGJ1dCBpdAorICAgICAgICAgICBpc24ndCBsYXJnZSBlbm91Z2ggYW55IG1vcmUuICovCisgICAgICAgIHZvaWQgKnB0ciA9IFB5TWVtX01hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKHB0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIG1lbXNldChwdHIsIDAsIHNpemUpOworICAgICAgICBtZW1tb3ZlKHB0ciwgb2JqLT5iX3B0ciwgb2JqLT5iX3NpemUpOworICAgICAgICBvYmotPmJfcHRyID0gcHRyOworICAgICAgICBvYmotPmJfc2l6ZSA9IHNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdm9pZCAqIHB0ciA9IFB5TWVtX1JlYWxsb2Mob2JqLT5iX3B0ciwgc2l6ZSk7CisgICAgICAgIGlmIChwdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBvYmotPmJfcHRyID0gcHRyOworICAgICAgICBvYmotPmJfc2l6ZSA9IHNpemU7CisgICAgfQogICBkb25lOgotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bnBpY2tsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnR5cDsKLQlQeU9iamVjdCAqc3RhdGU7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqdG1wOworICAgIFB5T2JqZWN0ICp0eXA7CisgICAgUHlPYmplY3QgKnN0YXRlOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmdHlwLCAmc3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR5cCwgIl9fbmV3X18iLCAiTyIsIHR5cCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl0bXAgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHJlc3VsdCwgIl9fc2V0c3RhdGVfXyIsICJPIiwgc3RhdGUpOwotCWlmICh0bXAgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZ0eXAsICZzdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodHlwLCAiX19uZXdfXyIsICJPIiwgdHlwKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHRtcCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocmVzdWx0LCAiX19zZXRzdGF0ZV9fIiwgIk8iLCBzdGF0ZSk7CisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBPSU5URVIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpjbHMpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeVR5cGVPYmplY3QgKnR5cDsKLQlQeU9iamVjdCAqa2V5OwotCWNoYXIgKmJ1ZjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5VHlwZU9iamVjdCAqdHlwOworICAgIFB5T2JqZWN0ICprZXk7CisgICAgY2hhciAqYnVmOwogCi0JcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW0oX2N0eXBlc19wdHJ0eXBlX2NhY2hlLCBjbHMpOwotCWlmIChyZXN1bHQpIHsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KGNscykpIHsKLQkJYnVmID0gYWxsb2NhKHN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcoY2xzKSkgKyAzICsgMSk7Ci0JCXNwcmludGYoYnVmLCAiTFBfJXMiLCBQeVN0cmluZ19BU19TVFJJTkcoY2xzKSk7Ci0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKilQeV9UWVBFKCZQeUNQb2ludGVyX1R5cGUpLAotCQkJCQkgICAgICAgInMoTyl7fSIsCi0JCQkJCSAgICAgICBidWYsCi0JCQkJCSAgICAgICAmUHlDUG9pbnRlcl9UeXBlKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJa2V5ID0gUHlMb25nX0Zyb21Wb2lkUHRyKHJlc3VsdCk7Ci0JfSBlbHNlIGlmIChQeVR5cGVfQ2hlY2soY2xzKSkgewotCQl0eXAgPSAoUHlUeXBlT2JqZWN0ICopY2xzOwotCQlidWYgPSBhbGxvY2Eoc3RybGVuKHR5cC0+dHBfbmFtZSkgKyAzICsgMSk7Ci0JCXNwcmludGYoYnVmLCAiTFBfJXMiLCB0eXAtPnRwX25hbWUpOwotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopUHlfVFlQRSgmUHlDUG9pbnRlcl9UeXBlKSwKLQkJCQkJICAgICAgICJzKE8pe3NPfSIsCi0JCQkJCSAgICAgICBidWYsCi0JCQkJCSAgICAgICAmUHlDUG9pbnRlcl9UeXBlLAotCQkJCQkgICAgICAgIl90eXBlXyIsIGNscyk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCVB5X0lOQ1JFRihjbHMpOwotCQlrZXkgPSBjbHM7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm11c3QgYmUgYSBjdHlwZXMgdHlwZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKC0xID09IFB5RGljdF9TZXRJdGVtKF9jdHlwZXNfcHRydHlwZV9jYWNoZSwga2V5LCByZXN1bHQpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoa2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihrZXkpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW0oX2N0eXBlc19wdHJ0eXBlX2NhY2hlLCBjbHMpOworICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KGNscykpIHsKKyAgICAgICAgYnVmID0gYWxsb2NhKHN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcoY2xzKSkgKyAzICsgMSk7CisgICAgICAgIHNwcmludGYoYnVmLCAiTFBfJXMiLCBQeVN0cmluZ19BU19TVFJJTkcoY2xzKSk7CisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKilQeV9UWVBFKCZQeUNQb2ludGVyX1R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInMoTyl7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlDUG9pbnRlcl9UeXBlKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAga2V5ID0gUHlMb25nX0Zyb21Wb2lkUHRyKHJlc3VsdCk7CisgICAgfSBlbHNlIGlmIChQeVR5cGVfQ2hlY2soY2xzKSkgeworICAgICAgICB0eXAgPSAoUHlUeXBlT2JqZWN0ICopY2xzOworICAgICAgICBidWYgPSBhbGxvY2Eoc3RybGVuKHR5cC0+dHBfbmFtZSkgKyAzICsgMSk7CisgICAgICAgIHNwcmludGYoYnVmLCAiTFBfJXMiLCB0eXAtPnRwX25hbWUpOworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopUHlfVFlQRSgmUHlDUG9pbnRlcl9UeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzKE8pe3NPfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlDUG9pbnRlcl9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl90eXBlXyIsIGNscyk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0lOQ1JFRihjbHMpOworICAgICAgICBrZXkgPSBjbHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm11c3QgYmUgYSBjdHlwZXMgdHlwZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKC0xID09IFB5RGljdF9TZXRJdGVtKF9jdHlwZXNfcHRydHlwZV9jYWNoZSwga2V5LCByZXN1bHQpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRihrZXkpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb2ludGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKnR5cDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICp0eXA7CiAKLQl0eXAgPSBQeURpY3RfR2V0SXRlbShfY3R5cGVzX3B0cnR5cGVfY2FjaGUsIChQeU9iamVjdCAqKVB5X1RZUEUoYXJnKSk7Ci0JaWYgKHR5cCkKLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3ModHlwLCBhcmcsIE5VTEwpOwotCXR5cCA9IFBPSU5URVIoTlVMTCwgKFB5T2JqZWN0ICopUHlfVFlQRShhcmcpKTsKLQlpZiAodHlwID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHR5cCwgYXJnLCBOVUxMKTsKLQlQeV9ERUNSRUYodHlwKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHR5cCA9IFB5RGljdF9HZXRJdGVtKF9jdHlwZXNfcHRydHlwZV9jYWNoZSwgKFB5T2JqZWN0ICopUHlfVFlQRShhcmcpKTsKKyAgICBpZiAodHlwKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyh0eXAsIGFyZywgTlVMTCk7CisgICAgdHlwID0gUE9JTlRFUihOVUxMLCAoUHlPYmplY3QgKilQeV9UWVBFKGFyZykpOworICAgIGlmICh0eXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyh0eXAsIGFyZywgTlVMTCk7CisgICAgUHlfREVDUkVGKHR5cCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcl9pbmZvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdChhcmcpOwotCVB5T2JqZWN0ICpzaGFwZTsKLQlQeV9zc2l6ZV90IGk7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFyZyk7CisgICAgUHlPYmplY3QgKnNoYXBlOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmIChkaWN0ID09IE5VTEwpCi0JCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KGFyZyk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJub3QgYSBjdHlwZXMgdHlwZSBvciBvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNoYXBlID0gUHlUdXBsZV9OZXcoZGljdC0+bmRpbSk7Ci0JaWYgKHNoYXBlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCAoaW50KWRpY3QtPm5kaW07ICsraSkKLQkJUHlUdXBsZV9TRVRfSVRFTShzaGFwZSwgaSwgUHlMb25nX0Zyb21Tc2l6ZV90KGRpY3QtPnNoYXBlW2ldKSk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoYXJnKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IGEgY3R5cGVzIHR5cGUgb3Igb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzaGFwZSA9IFB5VHVwbGVfTmV3KGRpY3QtPm5kaW0pOworICAgIGlmIChzaGFwZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGludClkaWN0LT5uZGltOyArK2kpCisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oc2hhcGUsIGksIFB5TG9uZ19Gcm9tU3NpemVfdChkaWN0LT5zaGFwZVtpXSkpOwogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfREVDUkVGKHNoYXBlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJzaU4iLCBkaWN0LT5mb3JtYXQsIGRpY3QtPm5kaW0sIHNoYXBlKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYoc2hhcGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoInNpTiIsIGRpY3QtPmZvcm1hdCwgZGljdC0+bmRpbSwgc2hhcGUpOwogfQogCiBQeU1ldGhvZERlZiBfY3R5cGVzX21vZHVsZV9tZXRob2RzW10gPSB7Ci0JeyJnZXRfZXJybm8iLCBnZXRfZXJybm8sIE1FVEhfTk9BUkdTfSwKLQl7InNldF9lcnJubyIsIHNldF9lcnJubywgTUVUSF9WQVJBUkdTfSwKLQl7IlBPSU5URVIiLCBQT0lOVEVSLCBNRVRIX08gfSwKLQl7InBvaW50ZXIiLCBwb2ludGVyLCBNRVRIX08gfSwKLQl7Il91bnBpY2tsZSIsIHVucGlja2xlLCBNRVRIX1ZBUkFSR1MgfSwKLQl7Il9idWZmZXJfaW5mbyIsIGJ1ZmZlcl9pbmZvLCBNRVRIX08sCi0JICJSZXR1cm4gYnVmZmVyIGludGVyZmFjZSBpbmZvcm1hdGlvbiAoZm9yIHRlc3Rpbmcgb25seSkifSwKLQl7InJlc2l6ZSIsIHJlc2l6ZSwgTUVUSF9WQVJBUkdTLCAiUmVzaXplIHRoZSBtZW1vcnkgYnVmZmVyIG9mIGEgY3R5cGVzIGluc3RhbmNlIn0sCisgICAgeyJnZXRfZXJybm8iLCBnZXRfZXJybm8sIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9lcnJubyIsIHNldF9lcnJubywgTUVUSF9WQVJBUkdTfSwKKyAgICB7IlBPSU5URVIiLCBQT0lOVEVSLCBNRVRIX08gfSwKKyAgICB7InBvaW50ZXIiLCBwb2ludGVyLCBNRVRIX08gfSwKKyAgICB7Il91bnBpY2tsZSIsIHVucGlja2xlLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7Il9idWZmZXJfaW5mbyIsIGJ1ZmZlcl9pbmZvLCBNRVRIX08sCisgICAgICJSZXR1cm4gYnVmZmVyIGludGVyZmFjZSBpbmZvcm1hdGlvbiAoZm9yIHRlc3Rpbmcgb25seSkifSwKKyAgICB7InJlc2l6ZSIsIHJlc2l6ZSwgTUVUSF9WQVJBUkdTLCAiUmVzaXplIHRoZSBtZW1vcnkgYnVmZmVyIG9mIGEgY3R5cGVzIGluc3RhbmNlIn0sCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKLQl7InNldF9jb252ZXJzaW9uX21vZGUiLCBzZXRfY29udmVyc2lvbl9tb2RlLCBNRVRIX1ZBUkFSR1MsIHNldF9jb252ZXJzaW9uX21vZGVfZG9jfSwKKyAgICB7InNldF9jb252ZXJzaW9uX21vZGUiLCBzZXRfY29udmVyc2lvbl9tb2RlLCBNRVRIX1ZBUkFSR1MsIHNldF9jb252ZXJzaW9uX21vZGVfZG9jfSwKICNlbmRpZgogI2lmZGVmIE1TX1dJTjMyCi0JeyJnZXRfbGFzdF9lcnJvciIsIGdldF9sYXN0X2Vycm9yLCBNRVRIX05PQVJHU30sCi0JeyJzZXRfbGFzdF9lcnJvciIsIHNldF9sYXN0X2Vycm9yLCBNRVRIX1ZBUkFSR1N9LAotCXsiQ29weUNvbVBvaW50ZXIiLCBjb3B5X2NvbV9wb2ludGVyLCBNRVRIX1ZBUkFSR1MsIGNvcHlfY29tX3BvaW50ZXJfZG9jfSwKLQl7IkZvcm1hdEVycm9yIiwgZm9ybWF0X2Vycm9yLCBNRVRIX1ZBUkFSR1MsIGZvcm1hdF9lcnJvcl9kb2N9LAotCXsiTG9hZExpYnJhcnkiLCBsb2FkX2xpYnJhcnksIE1FVEhfVkFSQVJHUywgbG9hZF9saWJyYXJ5X2RvY30sCi0JeyJGcmVlTGlicmFyeSIsIGZyZWVfbGlicmFyeSwgTUVUSF9WQVJBUkdTLCBmcmVlX2xpYnJhcnlfZG9jfSwKLQl7ImNhbGxfY29tbWV0aG9kIiwgY2FsbF9jb21tZXRob2QsIE1FVEhfVkFSQVJHUyB9LAotCXsiX2NoZWNrX0hSRVNVTFQiLCBjaGVja19ocmVzdWx0LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0X2xhc3RfZXJyb3IiLCBnZXRfbGFzdF9lcnJvciwgTUVUSF9OT0FSR1N9LAorICAgIHsic2V0X2xhc3RfZXJyb3IiLCBzZXRfbGFzdF9lcnJvciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkNvcHlDb21Qb2ludGVyIiwgY29weV9jb21fcG9pbnRlciwgTUVUSF9WQVJBUkdTLCBjb3B5X2NvbV9wb2ludGVyX2RvY30sCisgICAgeyJGb3JtYXRFcnJvciIsIGZvcm1hdF9lcnJvciwgTUVUSF9WQVJBUkdTLCBmb3JtYXRfZXJyb3JfZG9jfSwKKyAgICB7IkxvYWRMaWJyYXJ5IiwgbG9hZF9saWJyYXJ5LCBNRVRIX1ZBUkFSR1MsIGxvYWRfbGlicmFyeV9kb2N9LAorICAgIHsiRnJlZUxpYnJhcnkiLCBmcmVlX2xpYnJhcnksIE1FVEhfVkFSQVJHUywgZnJlZV9saWJyYXJ5X2RvY30sCisgICAgeyJjYWxsX2NvbW1ldGhvZCIsIGNhbGxfY29tbWV0aG9kLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7Il9jaGVja19IUkVTVUxUIiwgY2hlY2tfaHJlc3VsdCwgTUVUSF9WQVJBUkdTfSwKICNlbHNlCi0JeyJkbG9wZW4iLCBweV9kbF9vcGVuLCBNRVRIX1ZBUkFSR1MsCi0JICJkbG9wZW4obmFtZSwgZmxhZz17UlRMRF9HTE9CQUx8UlRMRF9MT0NBTH0pIG9wZW4gYSBzaGFyZWQgbGlicmFyeSJ9LAotCXsiZGxjbG9zZSIsIHB5X2RsX2Nsb3NlLCBNRVRIX1ZBUkFSR1MsICJkbGNsb3NlIGEgbGlicmFyeSJ9LAotCXsiZGxzeW0iLCBweV9kbF9zeW0sIE1FVEhfVkFSQVJHUywgImZpbmQgc3ltYm9sIGluIHNoYXJlZCBsaWJyYXJ5In0sCisgICAgeyJkbG9wZW4iLCBweV9kbF9vcGVuLCBNRVRIX1ZBUkFSR1MsCisgICAgICJkbG9wZW4obmFtZSwgZmxhZz17UlRMRF9HTE9CQUx8UlRMRF9MT0NBTH0pIG9wZW4gYSBzaGFyZWQgbGlicmFyeSJ9LAorICAgIHsiZGxjbG9zZSIsIHB5X2RsX2Nsb3NlLCBNRVRIX1ZBUkFSR1MsICJkbGNsb3NlIGEgbGlicmFyeSJ9LAorICAgIHsiZGxzeW0iLCBweV9kbF9zeW0sIE1FVEhfVkFSQVJHUywgImZpbmQgc3ltYm9sIGluIHNoYXJlZCBsaWJyYXJ5In0sCiAjZW5kaWYKLQl7ImFsaWdubWVudCIsIGFsaWduX2Z1bmMsIE1FVEhfTywgYWxpZ25tZW50X2RvY30sCi0JeyJzaXplb2YiLCBzaXplb2ZfZnVuYywgTUVUSF9PLCBzaXplb2ZfZG9jfSwKLQl7ImJ5cmVmIiwgYnlyZWYsIE1FVEhfVkFSQVJHUywgYnlyZWZfZG9jfSwKLQl7ImFkZHJlc3NvZiIsIGFkZHJlc3NvZiwgTUVUSF9PLCBhZGRyZXNzb2ZfZG9jfSwKLQl7ImNhbGxfZnVuY3Rpb24iLCBjYWxsX2Z1bmN0aW9uLCBNRVRIX1ZBUkFSR1MgfSwKLQl7ImNhbGxfY2RlY2xmdW5jdGlvbiIsIGNhbGxfY2RlY2xmdW5jdGlvbiwgTUVUSF9WQVJBUkdTIH0sCi0JeyJQeU9ial9Gcm9tUHRyIiwgTXlfUHlPYmpfRnJvbVB0ciwgTUVUSF9WQVJBUkdTIH0sCi0JeyJQeV9JTkNSRUYiLCBNeV9QeV9JTkNSRUYsIE1FVEhfTyB9LAotCXsiUHlfREVDUkVGIiwgTXlfUHlfREVDUkVGLCBNRVRIX08gfSwKLQl7TlVMTCwgICAgICBOVUxMfSAgICAgICAgLyogU2VudGluZWwgKi8KKyAgICB7ImFsaWdubWVudCIsIGFsaWduX2Z1bmMsIE1FVEhfTywgYWxpZ25tZW50X2RvY30sCisgICAgeyJzaXplb2YiLCBzaXplb2ZfZnVuYywgTUVUSF9PLCBzaXplb2ZfZG9jfSwKKyAgICB7ImJ5cmVmIiwgYnlyZWYsIE1FVEhfVkFSQVJHUywgYnlyZWZfZG9jfSwKKyAgICB7ImFkZHJlc3NvZiIsIGFkZHJlc3NvZiwgTUVUSF9PLCBhZGRyZXNzb2ZfZG9jfSwKKyAgICB7ImNhbGxfZnVuY3Rpb24iLCBjYWxsX2Z1bmN0aW9uLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ImNhbGxfY2RlY2xmdW5jdGlvbiIsIGNhbGxfY2RlY2xmdW5jdGlvbiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyJQeU9ial9Gcm9tUHRyIiwgTXlfUHlPYmpfRnJvbVB0ciwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyJQeV9JTkNSRUYiLCBNeV9QeV9JTkNSRUYsIE1FVEhfTyB9LAorICAgIHsiUHlfREVDUkVGIiwgTXlfUHlfREVDUkVGLCBNRVRIX08gfSwKKyAgICB7TlVMTCwgICAgICBOVUxMfSAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIC8qCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMKaW5kZXggZDdmYzVkMi4uYzcwNTNlZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYwpAQCAtMjIsOSArMjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q0ZpZWxkX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlDRmllbGRPYmplY3QgKm9iajsKLQlvYmogPSAoQ0ZpZWxkT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW9iajsKKyAgICBDRmllbGRPYmplY3QgKm9iajsKKyAgICBvYmogPSAoQ0ZpZWxkT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9iajsKIH0KIAogLyoKQEAgLTQxLDMwNSArNDEsMzA1IEBACiAgKi8KIFB5T2JqZWN0ICoKIFB5Q0ZpZWxkX0Zyb21EZXNjKFB5T2JqZWN0ICpkZXNjLCBQeV9zc2l6ZV90IGluZGV4LAotCQlQeV9zc2l6ZV90ICpwZmllbGRfc2l6ZSwgaW50IGJpdHNpemUsIGludCAqcGJpdG9mcywKLQkJUHlfc3NpemVfdCAqcHNpemUsIFB5X3NzaXplX3QgKnBvZmZzZXQsIFB5X3NzaXplX3QgKnBhbGlnbiwKLQkJaW50IHBhY2ssIGludCBiaWdfZW5kaWFuKQorICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnBmaWVsZF9zaXplLCBpbnQgYml0c2l6ZSwgaW50ICpwYml0b2ZzLAorICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnBzaXplLCBQeV9zc2l6ZV90ICpwb2Zmc2V0LCBQeV9zc2l6ZV90ICpwYWxpZ24sCisgICAgICAgICAgICAgICAgaW50IHBhY2ssIGludCBiaWdfZW5kaWFuKQogewotCUNGaWVsZE9iamVjdCAqc2VsZjsKLQlQeU9iamVjdCAqcHJvdG87Ci0JUHlfc3NpemVfdCBzaXplLCBhbGlnbiwgbGVuZ3RoOwotCVNFVEZVTkMgc2V0ZnVuYyA9IE5VTEw7Ci0JR0VURlVOQyBnZXRmdW5jID0gTlVMTDsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWludCBmaWVsZHR5cGU7CisgICAgQ0ZpZWxkT2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICpwcm90bzsKKyAgICBQeV9zc2l6ZV90IHNpemUsIGFsaWduLCBsZW5ndGg7CisgICAgU0VURlVOQyBzZXRmdW5jID0gTlVMTDsKKyAgICBHRVRGVU5DIGdldGZ1bmMgPSBOVUxMOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgaW50IGZpZWxkdHlwZTsKICNkZWZpbmUgTk9fQklURklFTEQgMAogI2RlZmluZSBORVdfQklURklFTEQgMQogI2RlZmluZSBDT05UX0JJVEZJRUxEIDIKICNkZWZpbmUgRVhQQU5EX0JJVEZJRUxEIDMKIAotCXNlbGYgPSAoQ0ZpZWxkT2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmUHlDRmllbGRfVHlwZSwKLQkJCQkJCSAgIE5VTEwpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWRpY3QgPSBQeVR5cGVfc3RnZGljdChkZXNjKTsKLQlpZiAoIWRpY3QpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiaGFzIG5vIF9zdGdpbmZvXyIpOwotCQlQeV9ERUNSRUYoc2VsZik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoYml0c2l6ZSAvKiB0aGlzIGlzIGEgYml0ZmllbGQgcmVxdWVzdCAqLwotCSAgICAmJiAqcGZpZWxkX3NpemUgLyogd2UgaGF2ZSBhIGJpdGZpZWxkIG9wZW4gKi8KKyAgICBzZWxmID0gKENGaWVsZE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoKFB5T2JqZWN0ICopJlB5Q0ZpZWxkX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdChkZXNjKTsKKyAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJoYXMgbm8gX3N0Z2luZm9fIik7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChiaXRzaXplIC8qIHRoaXMgaXMgYSBiaXRmaWVsZCByZXF1ZXN0ICovCisgICAgICAgICYmICpwZmllbGRfc2l6ZSAvKiB3ZSBoYXZlIGEgYml0ZmllbGQgb3BlbiAqLwogI2lmZGVmIE1TX1dJTjMyCi0JICAgIC8qIE1TVkMsIEdDQyB3aXRoIC1tbXMtYml0ZmllbGRzICovCi0JICAgICYmIGRpY3QtPnNpemUgKiA4ID09ICpwZmllbGRfc2l6ZQorICAgICAgICAvKiBNU1ZDLCBHQ0Mgd2l0aCAtbW1zLWJpdGZpZWxkcyAqLworICAgICAgICAmJiBkaWN0LT5zaXplICogOCA9PSAqcGZpZWxkX3NpemUKICNlbHNlCi0JICAgIC8qIEdDQyAqLwotCSAgICAmJiBkaWN0LT5zaXplICogOCA8PSAqcGZpZWxkX3NpemUgCisgICAgICAgIC8qIEdDQyAqLworICAgICAgICAmJiBkaWN0LT5zaXplICogOCA8PSAqcGZpZWxkX3NpemUKICNlbmRpZgotCSAgICAmJiAoKnBiaXRvZnMgKyBiaXRzaXplKSA8PSAqcGZpZWxkX3NpemUpIHsKLQkJLyogY29udGludWUgYml0IGZpZWxkICovCi0JCWZpZWxkdHlwZSA9IENPTlRfQklURklFTEQ7CisgICAgICAgICYmICgqcGJpdG9mcyArIGJpdHNpemUpIDw9ICpwZmllbGRfc2l6ZSkgeworICAgICAgICAvKiBjb250aW51ZSBiaXQgZmllbGQgKi8KKyAgICAgICAgZmllbGR0eXBlID0gQ09OVF9CSVRGSUVMRDsKICNpZm5kZWYgTVNfV0lOMzIKLQl9IGVsc2UgaWYgKGJpdHNpemUgLyogdGhpcyBpcyBhIGJpdGZpZWxkIHJlcXVlc3QgKi8KLQkgICAgJiYgKnBmaWVsZF9zaXplIC8qIHdlIGhhdmUgYSBiaXRmaWVsZCBvcGVuICovCi0JICAgICYmIGRpY3QtPnNpemUgKiA4ID49ICpwZmllbGRfc2l6ZQotCSAgICAmJiAoKnBiaXRvZnMgKyBiaXRzaXplKSA8PSBkaWN0LT5zaXplICogOCkgewotCQkvKiBleHBhbmQgYml0IGZpZWxkICovCi0JCWZpZWxkdHlwZSA9IEVYUEFORF9CSVRGSUVMRDsKKyAgICB9IGVsc2UgaWYgKGJpdHNpemUgLyogdGhpcyBpcyBhIGJpdGZpZWxkIHJlcXVlc3QgKi8KKyAgICAgICAgJiYgKnBmaWVsZF9zaXplIC8qIHdlIGhhdmUgYSBiaXRmaWVsZCBvcGVuICovCisgICAgICAgICYmIGRpY3QtPnNpemUgKiA4ID49ICpwZmllbGRfc2l6ZQorICAgICAgICAmJiAoKnBiaXRvZnMgKyBiaXRzaXplKSA8PSBkaWN0LT5zaXplICogOCkgeworICAgICAgICAvKiBleHBhbmQgYml0IGZpZWxkICovCisgICAgICAgIGZpZWxkdHlwZSA9IEVYUEFORF9CSVRGSUVMRDsKICNlbmRpZgotCX0gZWxzZSBpZiAoYml0c2l6ZSkgewotCQkvKiBzdGFydCBuZXcgYml0ZmllbGQgKi8KLQkJZmllbGR0eXBlID0gTkVXX0JJVEZJRUxEOwotCQkqcGJpdG9mcyA9IDA7Ci0JCSpwZmllbGRfc2l6ZSA9IGRpY3QtPnNpemUgKiA4OwotCX0gZWxzZSB7Ci0JCS8qIG5vdCBhIGJpdCBmaWVsZCAqLwotCQlmaWVsZHR5cGUgPSBOT19CSVRGSUVMRDsKLQkJKnBiaXRvZnMgPSAwOwotCQkqcGZpZWxkX3NpemUgPSAwOwotCX0KKyAgICB9IGVsc2UgaWYgKGJpdHNpemUpIHsKKyAgICAgICAgLyogc3RhcnQgbmV3IGJpdGZpZWxkICovCisgICAgICAgIGZpZWxkdHlwZSA9IE5FV19CSVRGSUVMRDsKKyAgICAgICAgKnBiaXRvZnMgPSAwOworICAgICAgICAqcGZpZWxkX3NpemUgPSBkaWN0LT5zaXplICogODsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBub3QgYSBiaXQgZmllbGQgKi8KKyAgICAgICAgZmllbGR0eXBlID0gTk9fQklURklFTEQ7CisgICAgICAgICpwYml0b2ZzID0gMDsKKyAgICAgICAgKnBmaWVsZF9zaXplID0gMDsKKyAgICB9CiAKLQlzaXplID0gZGljdC0+c2l6ZTsKLQlsZW5ndGggPSBkaWN0LT5sZW5ndGg7Ci0JcHJvdG8gPSBkZXNjOworICAgIHNpemUgPSBkaWN0LT5zaXplOworICAgIGxlbmd0aCA9IGRpY3QtPmxlbmd0aDsKKyAgICBwcm90byA9IGRlc2M7CiAKLQkvKiAgRmllbGQgZGVzY3JpcHRvcnMgZm9yICdjX2NoYXIgKiBuJyBhcmUgYmUgc2NwZWNpYWwgY2FzZWQgdG8KLQkgICAgcmV0dXJuIGEgUHl0aG9uIHN0cmluZyBpbnN0ZWFkIG9mIGFuIEFycmF5IG9iamVjdCBpbnN0YW5jZS4uLgotCSovCi0JaWYgKFB5Q0FycmF5VHlwZU9iamVjdF9DaGVjayhwcm90bykpIHsKLQkJU3RnRGljdE9iamVjdCAqYWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7Ci0JCVN0Z0RpY3RPYmplY3QgKmlkaWN0OwotCQlpZiAoYWRpY3QgJiYgYWRpY3QtPnByb3RvKSB7Ci0JCQlpZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFkaWN0LT5wcm90byk7Ci0JCQlpZiAoIWlkaWN0KSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJoYXMgbm8gX3N0Z2luZm9fIik7Ci0JCQkJUHlfREVDUkVGKHNlbGYpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKGlkaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygiYyIpLT5nZXRmdW5jKSB7Ci0JCQkJc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBfY3R5cGVzX2dldF9maWVsZGRlc2MoInMiKTsKLQkJCQlnZXRmdW5jID0gZmQtPmdldGZ1bmM7Ci0JCQkJc2V0ZnVuYyA9IGZkLT5zZXRmdW5jOwotCQkJfQorICAgIC8qICBGaWVsZCBkZXNjcmlwdG9ycyBmb3IgJ2NfY2hhciAqIG4nIGFyZSBiZSBzY3BlY2lhbCBjYXNlZCB0bworICAgICAgICByZXR1cm4gYSBQeXRob24gc3RyaW5nIGluc3RlYWQgb2YgYW4gQXJyYXkgb2JqZWN0IGluc3RhbmNlLi4uCisgICAgKi8KKyAgICBpZiAoUHlDQXJyYXlUeXBlT2JqZWN0X0NoZWNrKHByb3RvKSkgeworICAgICAgICBTdGdEaWN0T2JqZWN0ICphZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqaWRpY3Q7CisgICAgICAgIGlmIChhZGljdCAmJiBhZGljdC0+cHJvdG8pIHsKKyAgICAgICAgICAgIGlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoYWRpY3QtPnByb3RvKTsKKyAgICAgICAgICAgIGlmICghaWRpY3QpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIG5vIF9zdGdpbmZvXyIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpZGljdC0+Z2V0ZnVuYyA9PSBfY3R5cGVzX2dldF9maWVsZGRlc2MoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICAgICAgICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZkID0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJzIik7CisgICAgICAgICAgICAgICAgZ2V0ZnVuYyA9IGZkLT5nZXRmdW5jOworICAgICAgICAgICAgICAgIHNldGZ1bmMgPSBmZC0+c2V0ZnVuYzsKKyAgICAgICAgICAgIH0KICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCQkJaWYgKGlkaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygidSIpLT5nZXRmdW5jKSB7Ci0JCQkJc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBfY3R5cGVzX2dldF9maWVsZGRlc2MoIlUiKTsKLQkJCQlnZXRmdW5jID0gZmQtPmdldGZ1bmM7Ci0JCQkJc2V0ZnVuYyA9IGZkLT5zZXRmdW5jOwotCQkJfQorICAgICAgICAgICAgaWYgKGlkaWN0LT5nZXRmdW5jID09IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygidSIpLT5nZXRmdW5jKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBfY3R5cGVzX2dldF9maWVsZGRlc2MoIlUiKTsKKyAgICAgICAgICAgICAgICBnZXRmdW5jID0gZmQtPmdldGZ1bmM7CisgICAgICAgICAgICAgICAgc2V0ZnVuYyA9IGZkLT5zZXRmdW5jOworICAgICAgICAgICAgfQogI2VuZGlmCi0JCX0KLQl9CisgICAgICAgIH0KKyAgICB9CiAKLQlzZWxmLT5zZXRmdW5jID0gc2V0ZnVuYzsKLQlzZWxmLT5nZXRmdW5jID0gZ2V0ZnVuYzsKLQlzZWxmLT5pbmRleCA9IGluZGV4OworICAgIHNlbGYtPnNldGZ1bmMgPSBzZXRmdW5jOworICAgIHNlbGYtPmdldGZ1bmMgPSBnZXRmdW5jOworICAgIHNlbGYtPmluZGV4ID0gaW5kZXg7CiAKLQlQeV9JTkNSRUYocHJvdG8pOwotCXNlbGYtPnByb3RvID0gcHJvdG87CisgICAgUHlfSU5DUkVGKHByb3RvKTsKKyAgICBzZWxmLT5wcm90byA9IHByb3RvOwogCi0Jc3dpdGNoIChmaWVsZHR5cGUpIHsKLQljYXNlIE5FV19CSVRGSUVMRDoKLQkJaWYgKGJpZ19lbmRpYW4pCi0JCQlzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBmaWVsZF9zaXplIC0gKnBiaXRvZnMgLSBiaXRzaXplOwotCQllbHNlCi0JCQlzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBiaXRvZnM7Ci0JCSpwYml0b2ZzID0gYml0c2l6ZTsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBOT19CSVRGSUVMRDoKLQkJaWYgKHBhY2spCi0JCQlhbGlnbiA9IG1pbihwYWNrLCBkaWN0LT5hbGlnbik7Ci0JCWVsc2UKLQkJCWFsaWduID0gZGljdC0+YWxpZ247Ci0JCWlmIChhbGlnbiAmJiAqcG9mZnNldCAlIGFsaWduKSB7Ci0JCQlQeV9zc2l6ZV90IGRlbHRhID0gYWxpZ24gLSAoKnBvZmZzZXQgJSBhbGlnbik7Ci0JCQkqcHNpemUgKz0gZGVsdGE7Ci0JCQkqcG9mZnNldCArPSBkZWx0YTsKLQkJfQorICAgIHN3aXRjaCAoZmllbGR0eXBlKSB7CisgICAgY2FzZSBORVdfQklURklFTEQ6CisgICAgICAgIGlmIChiaWdfZW5kaWFuKQorICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwZmllbGRfc2l6ZSAtICpwYml0b2ZzIC0gYml0c2l6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwYml0b2ZzOworICAgICAgICAqcGJpdG9mcyA9IGJpdHNpemU7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgTk9fQklURklFTEQ6CisgICAgICAgIGlmIChwYWNrKQorICAgICAgICAgICAgYWxpZ24gPSBtaW4ocGFjaywgZGljdC0+YWxpZ24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhbGlnbiA9IGRpY3QtPmFsaWduOworICAgICAgICBpZiAoYWxpZ24gJiYgKnBvZmZzZXQgJSBhbGlnbikgeworICAgICAgICAgICAgUHlfc3NpemVfdCBkZWx0YSA9IGFsaWduIC0gKCpwb2Zmc2V0ICUgYWxpZ24pOworICAgICAgICAgICAgKnBzaXplICs9IGRlbHRhOworICAgICAgICAgICAgKnBvZmZzZXQgKz0gZGVsdGE7CisgICAgICAgIH0KIAotCQlpZiAoYml0c2l6ZSA9PSAwKQotCQkJc2VsZi0+c2l6ZSA9IHNpemU7Ci0JCSpwc2l6ZSArPSBzaXplOworICAgICAgICBpZiAoYml0c2l6ZSA9PSAwKQorICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IHNpemU7CisgICAgICAgICpwc2l6ZSArPSBzaXplOwogCi0JCXNlbGYtPm9mZnNldCA9ICpwb2Zmc2V0OwotCQkqcG9mZnNldCArPSBzaXplOworICAgICAgICBzZWxmLT5vZmZzZXQgPSAqcG9mZnNldDsKKyAgICAgICAgKnBvZmZzZXQgKz0gc2l6ZTsKIAotCQkqcGFsaWduID0gYWxpZ247Ci0JCWJyZWFrOworICAgICAgICAqcGFsaWduID0gYWxpZ247CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBFWFBBTkRfQklURklFTEQ6Ci0JCSpwb2Zmc2V0ICs9IGRpY3QtPnNpemUgLSAqcGZpZWxkX3NpemUvODsKLQkJKnBzaXplICs9IGRpY3QtPnNpemUgLSAqcGZpZWxkX3NpemUvODsKKyAgICBjYXNlIEVYUEFORF9CSVRGSUVMRDoKKyAgICAgICAgKnBvZmZzZXQgKz0gZGljdC0+c2l6ZSAtICpwZmllbGRfc2l6ZS84OworICAgICAgICAqcHNpemUgKz0gZGljdC0+c2l6ZSAtICpwZmllbGRfc2l6ZS84OwogCi0JCSpwZmllbGRfc2l6ZSA9IGRpY3QtPnNpemUgKiA4OworICAgICAgICAqcGZpZWxkX3NpemUgPSBkaWN0LT5zaXplICogODsKIAotCQlpZiAoYmlnX2VuZGlhbikKLQkJCXNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGZpZWxkX3NpemUgLSAqcGJpdG9mcyAtIGJpdHNpemU7Ci0JCWVsc2UKLQkJCXNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGJpdG9mczsKKyAgICAgICAgaWYgKGJpZ19lbmRpYW4pCisgICAgICAgICAgICBzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBmaWVsZF9zaXplIC0gKnBiaXRvZnMgLSBiaXRzaXplOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBiaXRvZnM7CiAKLQkJc2VsZi0+b2Zmc2V0ID0gKnBvZmZzZXQgLSBzaXplOyAvKiBwb2Zmc2V0IGlzIGFscmVhZHkgdXBkYXRlZCBmb3IgdGhlIE5FWFQgZmllbGQgKi8KLQkJKnBiaXRvZnMgKz0gYml0c2l6ZTsKLQkJYnJlYWs7CisgICAgICAgIHNlbGYtPm9mZnNldCA9ICpwb2Zmc2V0IC0gc2l6ZTsgLyogcG9mZnNldCBpcyBhbHJlYWR5IHVwZGF0ZWQgZm9yIHRoZSBORVhUIGZpZWxkICovCisgICAgICAgICpwYml0b2ZzICs9IGJpdHNpemU7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBDT05UX0JJVEZJRUxEOgotCQlpZiAoYmlnX2VuZGlhbikKLQkJCXNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGZpZWxkX3NpemUgLSAqcGJpdG9mcyAtIGJpdHNpemU7Ci0JCWVsc2UKLQkJCXNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGJpdG9mczsKKyAgICBjYXNlIENPTlRfQklURklFTEQ6CisgICAgICAgIGlmIChiaWdfZW5kaWFuKQorICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwZmllbGRfc2l6ZSAtICpwYml0b2ZzIC0gYml0c2l6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwYml0b2ZzOwogCi0JCXNlbGYtPm9mZnNldCA9ICpwb2Zmc2V0IC0gc2l6ZTsgLyogcG9mZnNldCBpcyBhbHJlYWR5IHVwZGF0ZWQgZm9yIHRoZSBORVhUIGZpZWxkICovCi0JCSpwYml0b2ZzICs9IGJpdHNpemU7Ci0JCWJyZWFrOwotCX0KKyAgICAgICAgc2VsZi0+b2Zmc2V0ID0gKnBvZmZzZXQgLSBzaXplOyAvKiBwb2Zmc2V0IGlzIGFscmVhZHkgdXBkYXRlZCBmb3IgdGhlIE5FWFQgZmllbGQgKi8KKyAgICAgICAgKnBiaXRvZnMgKz0gYml0c2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKIHN0YXRpYyBpbnQKIFB5Q0ZpZWxkX3NldChDRmllbGRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppbnN0LCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JQ0RhdGFPYmplY3QgKmRzdDsKLQljaGFyICpwdHI7Ci0JYXNzZXJ0KENEYXRhT2JqZWN0X0NoZWNrKGluc3QpKTsKLQlkc3QgPSAoQ0RhdGFPYmplY3QgKilpbnN0OwotCXB0ciA9IGRzdC0+Yl9wdHIgKyBzZWxmLT5vZmZzZXQ7Ci0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBQeUNEYXRhX3NldChpbnN0LCBzZWxmLT5wcm90bywgc2VsZi0+c2V0ZnVuYywgdmFsdWUsCi0JCQkgc2VsZi0+aW5kZXgsIHNlbGYtPnNpemUsIHB0cik7CisgICAgQ0RhdGFPYmplY3QgKmRzdDsKKyAgICBjaGFyICpwdHI7CisgICAgYXNzZXJ0KENEYXRhT2JqZWN0X0NoZWNrKGluc3QpKTsKKyAgICBkc3QgPSAoQ0RhdGFPYmplY3QgKilpbnN0OworICAgIHB0ciA9IGRzdC0+Yl9wdHIgKyBzZWxmLT5vZmZzZXQ7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIFB5Q0RhdGFfc2V0KGluc3QsIHNlbGYtPnByb3RvLCBzZWxmLT5zZXRmdW5jLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmluZGV4LCBzZWxmLT5zaXplLCBwdHIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlDRmllbGRfZ2V0KENGaWVsZE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmluc3QsIFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlDRGF0YU9iamVjdCAqc3JjOwotCWlmIChpbnN0ID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKLQl9Ci0JYXNzZXJ0KENEYXRhT2JqZWN0X0NoZWNrKGluc3QpKTsKLQlzcmMgPSAoQ0RhdGFPYmplY3QgKilpbnN0OwotCXJldHVybiBQeUNEYXRhX2dldChzZWxmLT5wcm90bywgc2VsZi0+Z2V0ZnVuYywgaW5zdCwKLQkJCSBzZWxmLT5pbmRleCwgc2VsZi0+c2l6ZSwgc3JjLT5iX3B0ciArIHNlbGYtPm9mZnNldCk7CisgICAgQ0RhdGFPYmplY3QgKnNyYzsKKyAgICBpZiAoaW5zdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgfQorICAgIGFzc2VydChDRGF0YU9iamVjdF9DaGVjayhpbnN0KSk7CisgICAgc3JjID0gKENEYXRhT2JqZWN0ICopaW5zdDsKKyAgICByZXR1cm4gUHlDRGF0YV9nZXQoc2VsZi0+cHJvdG8sIHNlbGYtPmdldGZ1bmMsIGluc3QsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLT5pbmRleCwgc2VsZi0+c2l6ZSwgc3JjLT5iX3B0ciArIHNlbGYtPm9mZnNldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNGaWVsZF9nZXRfb2Zmc2V0KFB5T2JqZWN0ICpzZWxmLCB2b2lkICpkYXRhKQogewotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoKENGaWVsZE9iamVjdCAqKXNlbGYpLT5vZmZzZXQpOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoKENGaWVsZE9iamVjdCAqKXNlbGYpLT5vZmZzZXQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlDRmllbGRfZ2V0X3NpemUoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KCgoQ0ZpZWxkT2JqZWN0ICopc2VsZiktPnNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoKENGaWVsZE9iamVjdCAqKXNlbGYpLT5zaXplKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIFB5Q0ZpZWxkX2dldHNldFtdID0gewotCXsgIm9mZnNldCIsIFB5Q0ZpZWxkX2dldF9vZmZzZXQsIE5VTEwsICJvZmZzZXQgaW4gYnl0ZXMgb2YgdGhpcyBmaWVsZCIgfSwKLQl7ICJzaXplIiwgUHlDRmllbGRfZ2V0X3NpemUsIE5VTEwsICJzaXplIGluIGJ5dGVzIG9mIHRoaXMgZmllbGQiIH0sCi0JeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0sCisgICAgeyAib2Zmc2V0IiwgUHlDRmllbGRfZ2V0X29mZnNldCwgTlVMTCwgIm9mZnNldCBpbiBieXRlcyBvZiB0aGlzIGZpZWxkIiB9LAorICAgIHsgInNpemUiLCBQeUNGaWVsZF9nZXRfc2l6ZSwgTlVMTCwgInNpemUgaW4gYnl0ZXMgb2YgdGhpcyBmaWVsZCIgfSwKKyAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSwKIH07CiAKIHN0YXRpYyBpbnQKIFB5Q0ZpZWxkX3RyYXZlcnNlKENGaWVsZE9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoc2VsZi0+cHJvdG8pOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNlbGYtPnByb3RvKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogUHlDRmllbGRfY2xlYXIoQ0ZpZWxkT2JqZWN0ICpzZWxmKQogewotCVB5X0NMRUFSKHNlbGYtPnByb3RvKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihzZWxmLT5wcm90byk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBQeUNGaWVsZF9kZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCVB5Q0ZpZWxkX2NsZWFyKChDRmllbGRPYmplY3QgKilzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5Q0ZpZWxkX2NsZWFyKChDRmllbGRPYmplY3QgKilzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlDRmllbGRfcmVwcihDRmllbGRPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IGJpdHMgPSBzZWxmLT5zaXplID4+IDE2OwotCVB5X3NzaXplX3Qgc2l6ZSA9IHNlbGYtPnNpemUgJiAweEZGRkY7Ci0JY29uc3QgY2hhciAqbmFtZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgYml0cyA9IHNlbGYtPnNpemUgPj4gMTY7CisgICAgUHlfc3NpemVfdCBzaXplID0gc2VsZi0+c2l6ZSAmIDB4RkZGRjsKKyAgICBjb25zdCBjaGFyICpuYW1lOwogCi0JbmFtZSA9ICgoUHlUeXBlT2JqZWN0ICopc2VsZi0+cHJvdG8pLT50cF9uYW1lOworICAgIG5hbWUgPSAoKFB5VHlwZU9iamVjdCAqKXNlbGYtPnByb3RvKS0+dHBfbmFtZTsKIAotCWlmIChiaXRzKQotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAorICAgIGlmIChiaXRzKQorICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkiPEZpZWxkIHR5cGU9JXMsIG9mcz0lZDolZCwgYml0cz0lZD4iLAorICAgICAgICAgICAgIjxGaWVsZCB0eXBlPSVzLCBvZnM9JWQ6JWQsIGJpdHM9JWQ+IiwKICNlbHNlCi0JCQkiPEZpZWxkIHR5cGU9JXMsIG9mcz0lemQ6JXpkLCBiaXRzPSV6ZD4iLAorICAgICAgICAgICAgIjxGaWVsZCB0eXBlPSVzLCBvZnM9JXpkOiV6ZCwgYml0cz0lemQ+IiwKICNlbmRpZgotCQkJbmFtZSwgc2VsZi0+b2Zmc2V0LCBzaXplLCBiaXRzKTsKLQllbHNlCi0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoCisgICAgICAgICAgICBuYW1lLCBzZWxmLT5vZmZzZXQsIHNpemUsIGJpdHMpOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCQkJIjxGaWVsZCB0eXBlPSVzLCBvZnM9JWQsIHNpemU9JWQ+IiwKKyAgICAgICAgICAgICI8RmllbGQgdHlwZT0lcywgb2ZzPSVkLCBzaXplPSVkPiIsCiAjZWxzZQotCQkJIjxGaWVsZCB0eXBlPSVzLCBvZnM9JXpkLCBzaXplPSV6ZD4iLAorICAgICAgICAgICAgIjxGaWVsZCB0eXBlPSVzLCBvZnM9JXpkLCBzaXplPSV6ZD4iLAogI2VuZGlmCi0JCQluYW1lLCBzZWxmLT5vZmZzZXQsIHNpemUpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICBuYW1lLCBzZWxmLT5vZmZzZXQsIHNpemUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5VHlwZU9iamVjdCBQeUNGaWVsZF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLkNGaWVsZCIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoQ0ZpZWxkT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQlQeUNGaWVsZF9kZWFsbG9jLAkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKVB5Q0ZpZWxkX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KLQkiU3RydWN0dXJlL1VuaW9uIG1lbWJlciIsCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKVB5Q0ZpZWxkX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlQeUNGaWVsZF9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCVB5Q0ZpZWxkX2dldHNldCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCShkZXNjcmdldGZ1bmMpUHlDRmllbGRfZ2V0LAkJLyogdHBfZGVzY3JfZ2V0ICovCi0JKGRlc2Nyc2V0ZnVuYylQeUNGaWVsZF9zZXQsCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JUHlDRmllbGRfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLkNGaWVsZCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKENGaWVsZE9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgUHlDRmllbGRfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKVB5Q0ZpZWxkX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCisgICAgIlN0cnVjdHVyZS9VbmlvbiBtZW1iZXIiLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKVB5Q0ZpZWxkX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlQeUNGaWVsZF9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBQeUNGaWVsZF9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgKGRlc2NyZ2V0ZnVuYylQeUNGaWVsZF9nZXQsICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAoZGVzY3JzZXRmdW5jKVB5Q0ZpZWxkX3NldCwgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeUNGaWVsZF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgQWNjZXNzb3IgZnVuY3Rpb25zCkBAIC0zNTIsMTcgKzM1MiwxNyBAQAogc3RhdGljIGludAogZ2V0X2xvbmcoUHlPYmplY3QgKnYsIGxvbmcgKnApCiB7Ci0JbG9uZyB4OwotCWlmIChQeUZsb2F0X0NoZWNrKHYpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImludCBleHBlY3RlZCBpbnN0ZWFkIG9mIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JeCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOworICAgIGxvbmcgeDsKKyAgICBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImludCBleHBlY3RlZCBpbnN0ZWFkIG9mIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2KTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAvKiBTYW1lLCBidXQgaGFuZGxpbmcgdW5zaWduZWQgbG9uZyAqLwpAQCAtMzcwLDE3ICszNzAsMTcgQEAKIHN0YXRpYyBpbnQKIGdldF91bG9uZyhQeU9iamVjdCAqdiwgdW5zaWduZWQgbG9uZyAqcCkKIHsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiaW50IGV4cGVjdGVkIGluc3RlYWQgb2YgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl4ID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKHYpOwotCWlmICh4ID09ICh1bnNpZ25lZCBsb25nKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQkqcCA9IHg7Ci0JcmV0dXJuIDA7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50IGV4cGVjdGVkIGluc3RlYWQgb2YgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKHYpOworICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAqcCA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwpAQCAtMzkwLDE3ICszOTAsMTcgQEAKIHN0YXRpYyBpbnQKIGdldF9sb25nbG9uZyhQeU9iamVjdCAqdiwgUFlfTE9OR19MT05HICpwKQogewotCVBZX0xPTkdfTE9ORyB4OwotCWlmIChQeUZsb2F0X0NoZWNrKHYpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImludCBleHBlY3RlZCBpbnN0ZWFkIG9mIGZsb2F0Iik7Ci0gCQlyZXR1cm4gLTE7Ci0JfQotCXggPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQkqcCA9IHg7Ci0JcmV0dXJuIDA7CisgICAgUFlfTE9OR19MT05HIHg7CisgICAgaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBmbG9hdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHggPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHYpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAqcCA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFNhbWUsIGJ1dCBoYW5kbGluZyBuYXRpdmUgdW5zaWduZWQgbG9uZyBsb25nLiAqLwpAQCAtNDA4LDE3ICs0MDgsMTcgQEAKIHN0YXRpYyBpbnQKIGdldF91bG9uZ2xvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqcCkKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKLQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBmbG9hdCIpOwotIAkJcmV0dXJuIC0xOwotIAl9Ci0JeCA9IFB5SW50X0FzVW5zaWduZWRMb25nTG9uZ01hc2sodik7Ci0JaWYgKHggPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OworICAgIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50IGV4cGVjdGVkIGluc3RlYWQgb2YgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ID0gUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2KTsKKyAgICBpZiAoeCA9PSAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAqcCA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKICNlbmRpZgpAQCAtNDQxLDQ5ICs0NDEsNDkgQEAKIC8qIFRoaXMgbWFjcm8gQ0hBTkdFUyB0aGUgZmlyc3QgcGFyYW1ldGVyIElOIFBMQUNFLiBGb3IgcHJvcGVyIHNpZ24gaGFuZGxpbmcsCiAgICB3ZSBtdXN0IGZpcnN0IHNoaWZ0IGxlZnQsIHRoZW4gcmlnaHQuCiAqLwotI2RlZmluZSBHRVRfQklURklFTEQodiwgc2l6ZSkJCQkJCQlcCi0JaWYgKE5VTV9CSVRTKHNpemUpKSB7CQkJCQkJXAotCQl2IDw8PSAoc2l6ZW9mKHYpKjggLSBMT1dfQklUKHNpemUpIC0gTlVNX0JJVFMoc2l6ZSkpOwlcCi0JCXYgPj49IChzaXplb2YodikqOCAtIE5VTV9CSVRTKHNpemUpKTsJCQlcCi0JfQorI2RlZmluZSBHRVRfQklURklFTEQodiwgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChOVU1fQklUUyhzaXplKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2IDw8PSAoc2l6ZW9mKHYpKjggLSBMT1dfQklUKHNpemUpIC0gTlVNX0JJVFMoc2l6ZSkpOyAgICAgICAgICAgXAorICAgICAgICB2ID4+PSAoc2l6ZW9mKHYpKjggLSBOVU1fQklUUyhzaXplKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAogLyogVGhpcyBtYWNybyBSRVRVUk5TIHRoZSBmaXJzdCBwYXJhbWV0ZXIgd2l0aCB0aGUgYml0IGZpZWxkIENIQU5HRUQuICovCi0jZGVmaW5lIFNFVCh4LCB2LCBzaXplKQkJCQkJCQlcCi0JKE5VTV9CSVRTKHNpemUpID8JCQkJCQlcCi0JICggKCB4ICYgfihCSVRfTUFTSyhzaXplKSA8PCBMT1dfQklUKHNpemUpKSApIHwgKCAodiAmIEJJVF9NQVNLKHNpemUpKSA8PCBMT1dfQklUKHNpemUpICkgKSBcCi0JIDogdikKKyNkZWZpbmUgU0VUKHgsIHYsIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoTlVNX0JJVFMoc2l6ZSkgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCAoIHggJiB+KEJJVF9NQVNLKHNpemUpIDw8IExPV19CSVQoc2l6ZSkpICkgfCAoICh2ICYgQklUX01BU0soc2l6ZSkpIDw8IExPV19CSVQoc2l6ZSkgKSApIFwKKyAgICAgOiB2KQogCiAvKiBieXRlIHN3YXBwaW5nIG1hY3JvcyAqLwotI2RlZmluZSBTV0FQXzIodikJCQkJXAotCSggKCAodiA+PiA4KSAmIDB4MDBGRikgfAkJXAotCSAgKCAodiA8PCA4KSAmIDB4RkYwMCkgKQorI2RlZmluZSBTV0FQXzIodikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggKCAodiA+PiA4KSAmIDB4MDBGRikgfCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAodiA8PCA4KSAmIDB4RkYwMCkgKQogCi0jZGVmaW5lIFNXQVBfNCh2KQkJCVwKLQkoICggKHYgJiAweDAwMDAwMEZGKSA8PCAyNCApIHwgIFwKLQkgICggKHYgJiAweDAwMDBGRjAwKSA8PCAgOCApIHwgIFwKLQkgICggKHYgJiAweDAwRkYwMDAwKSA+PiAgOCApIHwgIFwKLQkgICggKCh2ID4+IDI0KSAmIDB4RkYpKSApCisjZGVmaW5lIFNXQVBfNCh2KSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggKCAodiAmIDB4MDAwMDAwRkYpIDw8IDI0ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMEZGMDApIDw8ICA4ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDBGRjAwMDApID4+ICA4ICkgfCAgXAorICAgICAgKCAoKHYgPj4gMjQpICYgMHhGRikpICkKIAogI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIFNXQVBfOCh2KQkJCQlcCi0JKCAoICh2ICYgMHgwMDAwMDAwMDAwMDAwMEZGTCkgPDwgNTYgKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwMDAwMDAwMDBGRjAwTCkgPDwgNDAgKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwMDAwMDAwRkYwMDAwTCkgPDwgMjQgKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwMDAwMEZGMDAwMDAwTCkgPDwgIDggKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwMDBGRjAwMDAwMDAwTCkgPj4gIDggKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwRkYwMDAwMDAwMDAwTCkgPj4gMjQgKSB8ICBcCi0JICAoICh2ICYgMHgwMEZGMDAwMDAwMDAwMDAwTCkgPj4gNDAgKSB8ICBcCi0JICAoICgodiA+PiA1NikgJiAweEZGKSkgKQorI2RlZmluZSBTV0FQXzgodikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggKCAodiAmIDB4MDAwMDAwMDAwMDAwMDBGRkwpIDw8IDU2ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMDAwMDAwMDAwRkYwMEwpIDw8IDQwICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMDAwMDAwMEZGMDAwMEwpIDw8IDI0ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMDAwMDBGRjAwMDAwMEwpIDw8ICA4ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMDAwRkYwMDAwMDAwMEwpID4+ICA4ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMEZGMDAwMDAwMDAwMEwpID4+IDI0ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDBGRjAwMDAwMDAwMDAwMEwpID4+IDQwICkgfCAgXAorICAgICAgKCAoKHYgPj4gNTYpICYgMHhGRikpICkKICNlbHNlCi0jZGVmaW5lIFNXQVBfOCh2KQkJCQlcCi0JKCAoICh2ICYgMHgwMDAwMDAwMDAwMDAwMEZGTEwpIDw8IDU2ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwMDAwMDAwRkYwMExMKSA8PCA0MCApIHwgIFwKLQkgICggKHYgJiAweDAwMDAwMDAwMDBGRjAwMDBMTCkgPDwgMjQgKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwMDAwMEZGMDAwMDAwTEwpIDw8ICA4ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwRkYwMDAwMDAwMExMKSA+PiAgOCApIHwgIFwKLQkgICggKHYgJiAweDAwMDBGRjAwMDAwMDAwMDBMTCkgPj4gMjQgKSB8ICBcCi0JICAoICh2ICYgMHgwMEZGMDAwMDAwMDAwMDAwTEwpID4+IDQwICkgfCAgXAotCSAgKCAoKHYgPj4gNTYpICYgMHhGRikpICkKKyNkZWZpbmUgU1dBUF84KHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICggKHYgJiAweDAwMDAwMDAwMDAwMDAwRkZMTCkgPDwgNTYgKSB8ICBcCisgICAgICAoICh2ICYgMHgwMDAwMDAwMDAwMDBGRjAwTEwpIDw8IDQwICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMDAwMDAwMEZGMDAwMExMKSA8PCAyNCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDAwMDAwRkYwMDAwMDBMTCkgPDwgIDggKSB8ICBcCisgICAgICAoICh2ICYgMHgwMDAwMDBGRjAwMDAwMDAwTEwpID4+ICA4ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMEZGMDAwMDAwMDAwMExMKSA+PiAyNCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwRkYwMDAwMDAwMDAwMDBMTCkgPj4gNDAgKSB8ICBcCisgICAgICAoICgodiA+PiA1NikgJiAweEZGKSkgKQogI2VuZGlmCiAKICNkZWZpbmUgU1dBUF9JTlQgU1dBUF80CkBAIC01MjAsMTg0ICs1MjAsMTg0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYl9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JKihzaWduZWQgY2hhciAqKXB0ciA9IChzaWduZWQgY2hhcilTRVQoKihzaWduZWQgY2hhciAqKXB0ciwgKHNpZ25lZCBjaGFyKXZhbCwgc2l6ZSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgbG9uZyB2YWw7CisgICAgaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgICooc2lnbmVkIGNoYXIgKilwdHIgPSAoc2lnbmVkIGNoYXIpU0VUKCooc2lnbmVkIGNoYXIgKilwdHIsIChzaWduZWQgY2hhcil2YWwsIHNpemUpOworICAgIF9SRVQodmFsdWUpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlzaWduZWQgY2hhciB2YWwgPSAqKHNpZ25lZCBjaGFyICopcHRyOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIHNpZ25lZCBjaGFyIHZhbCA9ICooc2lnbmVkIGNoYXIgKilwdHI7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBCX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JKih1bnNpZ25lZCBjaGFyICopcHRyID0gKHVuc2lnbmVkIGNoYXIpU0VUKCoodW5zaWduZWQgY2hhciopcHRyLAotCQkJCQkJICAgKHVuc2lnbmVkIHNob3J0KXZhbCwgc2l6ZSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAqKHVuc2lnbmVkIGNoYXIgKilwdHIgPSAodW5zaWduZWQgY2hhcilTRVQoKih1bnNpZ25lZCBjaGFyKilwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOworICAgIF9SRVQodmFsdWUpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBCX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBjaGFyIHZhbCA9ICoodW5zaWduZWQgY2hhciAqKXB0cjsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICB1bnNpZ25lZCBjaGFyIHZhbCA9ICoodW5zaWduZWQgY2hhciAqKXB0cjsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGhfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JbG9uZyB2YWw7Ci0Jc2hvcnQgeDsKLQlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7Ci0JeCA9IFNFVCh4LCAoc2hvcnQpdmFsLCBzaXplKTsKLQltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICBsb25nIHZhbDsKKyAgICBzaG9ydCB4OworICAgIGlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKyAgICB4ID0gU0VUKHgsIChzaG9ydCl2YWwsIHNpemUpOworICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoX3NldF9zdyh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWxvbmcgdmFsOwotCXNob3J0IGZpZWxkOwotCWlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOwotCWZpZWxkID0gU1dBUF8yKGZpZWxkKTsKLQlmaWVsZCA9IFNFVChmaWVsZCwgKHNob3J0KXZhbCwgc2l6ZSk7Ci0JZmllbGQgPSBTV0FQXzIoZmllbGQpOwotCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgbG9uZyB2YWw7CisgICAgc2hvcnQgZmllbGQ7CisgICAgaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisgICAgZmllbGQgPSBTV0FQXzIoZmllbGQpOworICAgIGZpZWxkID0gU0VUKGZpZWxkLCAoc2hvcnQpdmFsLCBzaXplKTsKKyAgICBmaWVsZCA9IFNXQVBfMihmaWVsZCk7CisgICAgbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGhfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXNob3J0IHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXZhbCk7CisgICAgc2hvcnQgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGhfZ2V0X3N3KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXNob3J0IHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JdmFsID0gU1dBUF8yKHZhbCk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgc2hvcnQgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICB2YWwgPSBTV0FQXzIodmFsKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEhfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JdW5zaWduZWQgc2hvcnQgeDsKLQlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotCXggPSBTRVQoeCwgKHVuc2lnbmVkIHNob3J0KXZhbCwgc2l6ZSk7Ci0JbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgdW5zaWduZWQgc2hvcnQgeDsKKyAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworICAgIHggPSBTRVQoeCwgKHVuc2lnbmVkIHNob3J0KXZhbCwgc2l6ZSk7CisgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBIX3NldF9zdyh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCXVuc2lnbmVkIHNob3J0IGZpZWxkOwotCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9IFNXQVBfMihmaWVsZCk7Ci0JZmllbGQgPSBTRVQoZmllbGQsICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOwotCWZpZWxkID0gU1dBUF8yKGZpZWxkKTsKLQltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwotCV9SRVQodmFsdWUpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIHVuc2lnbmVkIHNob3J0IGZpZWxkOworICAgIGlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKyAgICBmaWVsZCA9IFNXQVBfMihmaWVsZCk7CisgICAgZmllbGQgPSBTRVQoZmllbGQsICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOworICAgIGZpZWxkID0gU1dBUF8yKGZpZWxkKTsKKyAgICBtZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBIX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBzaG9ydCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIHVuc2lnbmVkIHNob3J0IHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBIX2dldF9zdyh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBzaG9ydCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCXZhbCA9IFNXQVBfMih2YWwpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIHVuc2lnbmVkIHNob3J0IHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgdmFsID0gU1dBUF8yKHZhbCk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWxvbmcgdmFsOwotCWludCB4OwotCWlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKLQl4ID0gU0VUKHgsIChpbnQpdmFsLCBzaXplKTsKLQltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICBsb25nIHZhbDsKKyAgICBpbnQgeDsKKyAgICBpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisgICAgeCA9IFNFVCh4LCAoaW50KXZhbCwgc2l6ZSk7CisgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpX3NldF9zdyh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWxvbmcgdmFsOwotCWludCBmaWVsZDsKLQlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9IFNXQVBfSU5UKGZpZWxkKTsKLQlmaWVsZCA9IFNFVChmaWVsZCwgKGludCl2YWwsIHNpemUpOwotCWZpZWxkID0gU1dBUF9JTlQoZmllbGQpOwotCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgbG9uZyB2YWw7CisgICAgaW50IGZpZWxkOworICAgIGlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworICAgIGZpZWxkID0gU1dBUF9JTlQoZmllbGQpOworICAgIGZpZWxkID0gU0VUKGZpZWxkLCAoaW50KXZhbCwgc2l6ZSk7CisgICAgZmllbGQgPSBTV0FQX0lOVChmaWVsZCk7CisgICAgbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogaV9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JaW50IHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgaW50IHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpX2dldF9zdyh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlpbnQgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQl2YWwgPSBTV0FQX0lOVCh2YWwpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIGludCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHZhbCA9IFNXQVBfSU5UKHZhbCk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKICNpZmRlZiBNU19XSU4zMgpAQCAtNzA1LDIyICs3MDUsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB2Qk9PTF9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlzd2l0Y2ggKFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSkpIHsKLQljYXNlIC0xOgotCQlyZXR1cm4gTlVMTDsKLQljYXNlIDA6Ci0JCSooc2hvcnQgaW50ICopcHRyID0gVkFSSUFOVF9GQUxTRTsKLQkJX1JFVCh2YWx1ZSk7Ci0JZGVmYXVsdDoKLQkJKihzaG9ydCBpbnQgKilwdHIgPSBWQVJJQU5UX1RSVUU7Ci0JCV9SRVQodmFsdWUpOwotCX0KKyAgICBzd2l0Y2ggKFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSkpIHsKKyAgICBjYXNlIC0xOgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYXNlIDA6CisgICAgICAgICooc2hvcnQgaW50ICopcHRyID0gVkFSSUFOVF9GQUxTRTsKKyAgICAgICAgX1JFVCh2YWx1ZSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgKihzaG9ydCBpbnQgKilwdHIgPSBWQVJJQU5UX1RSVUU7CisgICAgICAgIF9SRVQodmFsdWUpOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHZCT09MX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKSooc2hvcnQgaW50ICopcHRyKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKSooc2hvcnQgaW50ICopcHRyKTsKIH0KICNlbmRpZgogCkBAIC03MzUsMjYwICs3MzUsMjYwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYm9vbF9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlzd2l0Y2ggKFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSkpIHsKLQljYXNlIC0xOgotCQlyZXR1cm4gTlVMTDsKLQljYXNlIDA6Ci0JCSooQk9PTF9UWVBFICopcHRyID0gMDsKLQkJX1JFVCh2YWx1ZSk7Ci0JZGVmYXVsdDoKLQkJKihCT09MX1RZUEUgKilwdHIgPSAxOwotCQlfUkVUKHZhbHVlKTsKLQl9CisgICAgc3dpdGNoIChQeU9iamVjdF9Jc1RydWUodmFsdWUpKSB7CisgICAgY2FzZSAtMToKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSAwOgorICAgICAgICAqKEJPT0xfVFlQRSAqKXB0ciA9IDA7CisgICAgICAgIF9SRVQodmFsdWUpOworICAgIGRlZmF1bHQ6CisgICAgICAgICooQk9PTF9UWVBFICopcHRyID0gMTsKKyAgICAgICAgX1JFVCh2YWx1ZSk7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYm9vbF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykqKEJPT0xfVFlQRSAqKXB0cik7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykqKEJPT0xfVFlQRSAqKXB0cik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCXVuc2lnbmVkIGludCB4OwotCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuICBOVUxMOwotCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotCXggPSBTRVQoeCwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOwotCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwotCV9SRVQodmFsdWUpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIHVuc2lnbmVkIGludCB4OworICAgIGlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuICBOVUxMOworICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworICAgIHggPSBTRVQoeCwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOworICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSV9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQl1bnNpZ25lZCBpbnQgZmllbGQ7Ci0JaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQotCQlyZXR1cm4gIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9ICh1bnNpZ25lZCBpbnQpU0VUKGZpZWxkLCAodW5zaWduZWQgaW50KXZhbCwgc2l6ZSk7Ci0JZmllbGQgPSBTV0FQX0lOVChmaWVsZCk7Ci0JbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbDsKKyAgICB1bnNpZ25lZCBpbnQgZmllbGQ7CisgICAgaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gIE5VTEw7CisgICAgbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKyAgICBmaWVsZCA9ICh1bnNpZ25lZCBpbnQpU0VUKGZpZWxkLCAodW5zaWduZWQgaW50KXZhbCwgc2l6ZSk7CisgICAgZmllbGQgPSBTV0FQX0lOVChmaWVsZCk7CisgICAgbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogSV9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CisgICAgdW5zaWduZWQgaW50IHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJX2dldF9zdyh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQl2YWwgPSBTV0FQX0lOVCh2YWwpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOworICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHZhbCA9IFNXQVBfSU5UKHZhbCk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWxvbmcgdmFsOwotCWxvbmcgeDsKLQlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7Ci0JeCA9IFNFVCh4LCB2YWwsIHNpemUpOwotCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwotCV9SRVQodmFsdWUpOworICAgIGxvbmcgdmFsOworICAgIGxvbmcgeDsKKyAgICBpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisgICAgeCA9IFNFVCh4LCB2YWwsIHNpemUpOworICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbF9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQlsb25nIGZpZWxkOwotCWlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOwotCWZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKLQlmaWVsZCA9IChsb25nKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQlmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7Ci0JbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICBsb25nIHZhbDsKKyAgICBsb25nIGZpZWxkOworICAgIGlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworICAgIGZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKKyAgICBmaWVsZCA9IChsb25nKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKKyAgICBmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7CisgICAgbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogbF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JbG9uZyB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIGxvbmcgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxfZ2V0X3N3KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCWxvbmcgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQl2YWwgPSBTV0FQX0xPTkcodmFsKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBsb25nIHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgdmFsID0gU1dBUF9MT05HKHZhbCk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBMX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCXVuc2lnbmVkIGxvbmcgeDsKLQlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiAgTlVMTDsKLQltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKLQl4ID0gU0VUKHgsIHZhbCwgc2l6ZSk7Ci0JbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIGlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuICBOVUxMOworICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworICAgIHggPSBTRVQoeCwgdmFsLCBzaXplKTsKKyAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIExfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmaWVsZDsKLQlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiAgTlVMTDsKLQltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOwotCWZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKLQlmaWVsZCA9ICh1bnNpZ25lZCBsb25nKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQlmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7Ci0JbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbDsKKyAgICB1bnNpZ25lZCBsb25nIGZpZWxkOworICAgIGlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuICBOVUxMOworICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisgICAgZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOworICAgIGZpZWxkID0gKHVuc2lnbmVkIGxvbmcpU0VUKGZpZWxkLCB2YWwsIHNpemUpOworICAgIGZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKKyAgICBtZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBMX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogTF9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCXZhbCA9IFNXQVBfTE9ORyh2YWwpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICB2YWwgPSBTV0FQX0xPTkcodmFsKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsKTsKIH0KIAogI2lmZGVmIEhBVkVfTE9OR19MT05HCiBzdGF0aWMgUHlPYmplY3QgKgogcV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQWV9MT05HX0xPTkcgdmFsOwotCVBZX0xPTkdfTE9ORyB4OwotCWlmIChnZXRfbG9uZ2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7Ci0JeCA9IFNFVCh4LCB2YWwsIHNpemUpOwotCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwotCV9SRVQodmFsdWUpOworICAgIFBZX0xPTkdfTE9ORyB2YWw7CisgICAgUFlfTE9OR19MT05HIHg7CisgICAgaWYgKGdldF9sb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKyAgICB4ID0gU0VUKHgsIHZhbCwgc2l6ZSk7CisgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBxX3NldF9zdyh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCVBZX0xPTkdfTE9ORyB2YWw7Ci0JUFlfTE9OR19MT05HIGZpZWxkOwotCWlmIChnZXRfbG9uZ2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9IFNXQVBfOChmaWVsZCk7Ci0JZmllbGQgPSAoUFlfTE9OR19MT05HKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQlmaWVsZCA9IFNXQVBfOChmaWVsZCk7Ci0JbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICBQWV9MT05HX0xPTkcgdmFsOworICAgIFBZX0xPTkdfTE9ORyBmaWVsZDsKKyAgICBpZiAoZ2V0X2xvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisgICAgZmllbGQgPSBTV0FQXzgoZmllbGQpOworICAgIGZpZWxkID0gKFBZX0xPTkdfTE9ORylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7CisgICAgZmllbGQgPSBTV0FQXzgoZmllbGQpOworICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBxX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQWV9MT05HX0xPTkcgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWwpOworICAgIFBZX0xPTkdfTE9ORyB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBxX2dldF9zdyh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQWV9MT05HX0xPTkcgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQl2YWwgPSBTV0FQXzgodmFsKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWwpOworICAgIFBZX0xPTkdfTE9ORyB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHZhbCA9IFNXQVBfOCh2YWwpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBRX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHg7Ci0JaWYgKGdldF91bG9uZ2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7Ci0JeCA9IFNFVCh4LCB2YWwsIHNpemUpOwotCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwotCV9SRVQodmFsdWUpOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CisgICAgaWYgKGdldF91bG9uZ2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisgICAgeCA9IFNFVCh4LCB2YWwsIHNpemUpOworICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUV9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyBmaWVsZDsKLQlpZiAoZ2V0X3Vsb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOwotCWZpZWxkID0gU1dBUF84KGZpZWxkKTsKLQlmaWVsZCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpU0VUKGZpZWxkLCB2YWwsIHNpemUpOwotCWZpZWxkID0gU1dBUF84KGZpZWxkKTsKLQltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwotCV9SRVQodmFsdWUpOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIGZpZWxkOworICAgIGlmIChnZXRfdWxvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisgICAgZmllbGQgPSBTV0FQXzgoZmllbGQpOworICAgIGZpZWxkID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7CisgICAgZmllbGQgPSBTV0FQXzgoZmllbGQpOworICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBRX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbCk7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUV9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JdmFsID0gU1dBUF84KHZhbCk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWwpOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHZhbCA9IFNXQVBfOCh2YWwpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsKTsKIH0KICNlbmRpZgogCkBAIC0xMDAwLDEzNiArMTAwMCwxMzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWxvbmcgZG91YmxlIHg7CisgICAgbG9uZyBkb3VibGUgeDsKIAotCXggPSBQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIgZmxvYXQgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbWNweShwdHIsICZ4LCBzaXplb2YobG9uZyBkb3VibGUpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YobG9uZyBkb3VibGUpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCWxvbmcgZG91YmxlIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YobG9uZyBkb3VibGUpKTsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbCk7CisgICAgbG9uZyBkb3VibGUgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZihsb25nIGRvdWJsZSkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JZG91YmxlIHg7CisgICAgZG91YmxlIHg7CiAKLQl4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiIGZsb2F0IGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKGRvdWJsZSkpOwotCV9SRVQodmFsdWUpOworICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiIGZsb2F0IGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZihkb3VibGUpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCWRvdWJsZSB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKKyAgICBkb3VibGUgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkX3NldF9zdyh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWRvdWJsZSB4OworICAgIGRvdWJsZSB4OwogCi0JeCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJCSAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIgZmxvYXQgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNpZmRlZiBXT1JEU19CSUdFTkRJQU4KLQlpZiAoX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDEpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNlbHNlCi0JaWYgKF9QeUZsb2F0X1BhY2s4KHgsICh1bnNpZ25lZCBjaGFyICopcHRyLCAwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKF9QeUZsb2F0X1BhY2s4KHgsICh1bnNpZ25lZCBjaGFyICopcHRyLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKLQlfUkVUKHZhbHVlKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRfZ2V0X3N3KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrOChwdHIsIDEpKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKF9QeUZsb2F0X1VucGFjazgocHRyLCAxKSk7CiAjZWxzZQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrOChwdHIsIDApKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKF9QeUZsb2F0X1VucGFjazgocHRyLCAwKSk7CiAjZW5kaWYKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JZmxvYXQgeDsKKyAgICBmbG9hdCB4OwogCi0JeCA9IChmbG9hdClQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIgZmxvYXQgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwotCV9SRVQodmFsdWUpOworICAgIHggPSAoZmxvYXQpUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZl9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JZmxvYXQgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbCk7CisgICAgZmxvYXQgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmX3NldF9zdyh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWZsb2F0IHg7CisgICAgZmxvYXQgeDsKIAotCXggPSAoZmxvYXQpUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiIGZsb2F0IGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB4ID0gKGZsb2F0KVB5RmxvYXRfQXNEb3VibGUodmFsdWUpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIgZmxvYXQgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNpZmRlZiBXT1JEU19CSUdFTkRJQU4KLQlpZiAoX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDEpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNlbHNlCi0JaWYgKF9QeUZsb2F0X1BhY2s0KHgsICh1bnNpZ25lZCBjaGFyICopcHRyLCAwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKF9QeUZsb2F0X1BhY2s0KHgsICh1bnNpZ25lZCBjaGFyICopcHRyLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKLQlfUkVUKHZhbHVlKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZfZ2V0X3N3KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrNChwdHIsIDEpKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKF9QeUZsb2F0X1VucGFjazQocHRyLCAxKSk7CiAjZWxzZQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrNChwdHIsIDApKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKF9QeUZsb2F0X1VucGFjazQocHRyLCAwKSk7CiAjZW5kaWYKIH0KIApAQCAtMTE0Niw0NSArMTE0Niw0NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIE9fZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCVB5T2JqZWN0ICpvYiA9ICooUHlPYmplY3QgKiopcHRyOwotCWlmIChvYiA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCS8qIFNldCBhbiBlcnJvciBpZiBub3QgeWV0IHNldCAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJQeU9iamVjdCBpcyBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYob2IpOwotCXJldHVybiBvYjsKKyAgICBQeU9iamVjdCAqb2IgPSAqKFB5T2JqZWN0ICoqKXB0cjsKKyAgICBpZiAob2IgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAvKiBTZXQgYW4gZXJyb3IgaWYgbm90IHlldCBzZXQgKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeU9iamVjdCBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYob2IpOworICAgIHJldHVybiBvYjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIE9fc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JLyogSG0sIGRvZXMgdGhlIG1lbW9yeSBibG9jayBuZWVkIGl0J3Mgb3duIHJlZmNvdW50IG9yIG5vdD8gKi8KLQkqKFB5T2JqZWN0ICoqKXB0ciA9IHZhbHVlOwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JcmV0dXJuIHZhbHVlOworICAgIC8qIEhtLCBkb2VzIHRoZSBtZW1vcnkgYmxvY2sgbmVlZCBpdCdzIG93biByZWZjb3VudCBvciBub3Q/ICovCisgICAgKihQeU9iamVjdCAqKilwdHIgPSB2YWx1ZTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogY19zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSB8fCAoMSAhPSBQeVN0cmluZ19TaXplKHZhbHVlKSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIm9uZSBjaGFyYWN0ZXIgc3RyaW5nIGV4cGVjdGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkqKGNoYXIgKilwdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpWzBdOwotCV9SRVQodmFsdWUpOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpIHx8ICgxICE9IFB5U3RyaW5nX1NpemUodmFsdWUpKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIm9uZSBjaGFyYWN0ZXIgc3RyaW5nIGV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAqKGNoYXIgKilwdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpWzBdOworICAgIF9SRVQodmFsdWUpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilwdHIsIDEpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXB0ciwgMSk7CiB9CiAKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQpAQCAtMTE5MiwxMTIgKzExOTIsMTEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJdmFsdWUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QodmFsdWUsCi0JCQkJCQkgICAgX2N0eXBlc19jb252ZXJzaW9uX2VuY29kaW5nLAotCQkJCQkJICAgIF9jdHlwZXNfY29udmVyc2lvbl9lcnJvcnMpOwotCQlpZiAoIXZhbHVlKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ1bmljb2RlIHN0cmluZyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJCQl2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0gZWxzZQotCQlQeV9JTkNSRUYodmFsdWUpOworICAgIGlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QodmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdHlwZXNfY29udmVyc2lvbl9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycyk7CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5pY29kZSBzdHJpbmcgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZQorICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwogCi0JbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKTsKLQlpZiAobGVuICE9IDEpIHsKLQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkib25lIGNoYXJhY3RlciB1bmljb2RlIHN0cmluZyBleHBlY3RlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKTsKKyAgICBpZiAobGVuICE9IDEpIHsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvbmUgY2hhcmFjdGVyIHVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCSood2NoYXJfdCAqKXB0ciA9IFB5VW5pY29kZV9BU19VTklDT0RFKHZhbHVlKVswXTsKLQlQeV9ERUNSRUYodmFsdWUpOworICAgICood2NoYXJfdCAqKXB0ciA9IFB5VW5pY29kZV9BU19VTklDT0RFKHZhbHVlKVswXTsKKyAgICBQeV9ERUNSRUYodmFsdWUpOwogCi0JX1JFVCh2YWx1ZSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHVfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKCh3Y2hhcl90ICopcHRyLCAxKTsKKyAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcigod2NoYXJfdCAqKXB0ciwgMSk7CiB9CiAKIC8qIFUgLSBhIHVuaWNvZGUgc3RyaW5nICovCiBzdGF0aWMgUHlPYmplY3QgKgogVV9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IGxlbjsKLQlQeV9VTklDT0RFICpwOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgUHlfVU5JQ09ERSAqcDsKIAotCXNpemUgLz0gc2l6ZW9mKHdjaGFyX3QpOyAvKiB3ZSBjb3VudCBjaGFyYWN0ZXIgdW5pdHMgaGVyZSwgbm90IGJ5dGVzICovCisgICAgc2l6ZSAvPSBzaXplb2Yod2NoYXJfdCk7IC8qIHdlIGNvdW50IGNoYXJhY3RlciB1bml0cyBoZXJlLCBub3QgYnl0ZXMgKi8KIAotCXJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKHdjaGFyX3QgKilwdHIsIHNpemUpOwotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gTlVMTDsKLQkvKiBXZSBuZWVkICdyZXN1bHQnIHRvIGJlIGFibGUgdG8gY291bnQgdGhlIGNoYXJhY3RlcnMgd2l0aCB3Y3NsZW4sCi0JICAgc2luY2UgcHRyIG1heSBub3QgYmUgTlVMIHRlcm1pbmF0ZWQuICBJZiB0aGUgbGVuZ3RoIGlzIHNtYWxsZXIgKGlmCi0JICAgaXQgd2FzIGFjdHVhbGx5IE5VTCB0ZXJtaW5hdGVkLCB3ZSBjb25zdHJ1Y3QgYSBuZXcgb25lIGFuZCB0aHJvdwotCSAgIGF3YXkgdGhlIHJlc3VsdC4KLQkqLwotCS8qIGNob3Agb2ZmIGF0IHRoZSBmaXJzdCBOVUwgY2hhcmFjdGVyLCBpZiBhbnkuICovCi0JcCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7Ci0JZm9yIChsZW4gPSAwOyBsZW4gPCBzaXplOyArK2xlbikKLQkJaWYgKCFwW2xlbl0pCi0JCQlicmVhazsKKyAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKCh3Y2hhcl90ICopcHRyLCBzaXplKTsKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogV2UgbmVlZCAncmVzdWx0JyB0byBiZSBhYmxlIHRvIGNvdW50IHRoZSBjaGFyYWN0ZXJzIHdpdGggd2NzbGVuLAorICAgICAgIHNpbmNlIHB0ciBtYXkgbm90IGJlIE5VTCB0ZXJtaW5hdGVkLiAgSWYgdGhlIGxlbmd0aCBpcyBzbWFsbGVyIChpZgorICAgICAgIGl0IHdhcyBhY3R1YWxseSBOVUwgdGVybWluYXRlZCwgd2UgY29uc3RydWN0IGEgbmV3IG9uZSBhbmQgdGhyb3cKKyAgICAgICBhd2F5IHRoZSByZXN1bHQuCisgICAgKi8KKyAgICAvKiBjaG9wIG9mZiBhdCB0aGUgZmlyc3QgTlVMIGNoYXJhY3RlciwgaWYgYW55LiAqLworICAgIHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOworICAgIGZvciAobGVuID0gMDsgbGVuIDwgc2l6ZTsgKytsZW4pCisgICAgICAgIGlmICghcFtsZW5dKQorICAgICAgICAgICAgYnJlYWs7CiAKLQlpZiAobGVuIDwgc2l6ZSkgewotCQlQeU9iamVjdCAqb2IgPSBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKCh3Y2hhcl90ICopcHRyLCBsZW4pOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIG9iOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChsZW4gPCBzaXplKSB7CisgICAgICAgIFB5T2JqZWN0ICpvYiA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKHdjaGFyX3QgKilwdHIsIGxlbik7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gb2I7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBVX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBsZW5ndGgpCiB7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAotCS8qIEl0J3MgZWFzaWVyIHRvIGNhbGN1bGF0ZSBpbiBjaGFyYWN0ZXJzIHRoYW4gaW4gYnl0ZXMgKi8KLQlsZW5ndGggLz0gc2l6ZW9mKHdjaGFyX3QpOworICAgIC8qIEl0J3MgZWFzaWVyIHRvIGNhbGN1bGF0ZSBpbiBjaGFyYWN0ZXJzIHRoYW4gaW4gYnl0ZXMgKi8KKyAgICBsZW5ndGggLz0gc2l6ZW9mKHdjaGFyX3QpOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQl2YWx1ZSA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCh2YWx1ZSwKLQkJCQkJCSAgICBfY3R5cGVzX2NvbnZlcnNpb25fZW5jb2RpbmcsCi0JCQkJCQkgICAgX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycyk7Ci0JCWlmICghdmFsdWUpCi0JCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJCXZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlCi0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0Jc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSk7Ci0JaWYgKHNpemUgPiBsZW5ndGgpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICB2YWx1ZSA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N0eXBlc19jb252ZXJzaW9uX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3R5cGVzX2NvbnZlcnNpb25fZXJyb3JzKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1bmljb2RlIHN0cmluZyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSk7CisgICAgaWYgKHNpemUgPiBsZW5ndGgpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSAgICAgInN0cmluZyB0b28gbG9uZyAoJWQsIG1heGltdW0gbGVuZ3RoICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIHRvbyBsb25nICglZCwgbWF4aW11bSBsZW5ndGggJWQpIiwKICNlbHNlCi0JCQkgICAgICJzdHJpbmcgdG9vIGxvbmcgKCV6ZCwgbWF4aW11bSBsZW5ndGggJXpkKSIsCisgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIHRvbyBsb25nICglemQsIG1heGltdW0gbGVuZ3RoICV6ZCkiLAogI2VuZGlmCi0JCQkgICAgIHNpemUsIGxlbmd0aCk7Ci0JCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0gZWxzZSBpZiAoc2l6ZSA8IGxlbmd0aC0xKQotCQkvKiBjb3B5IHRlcm1pbmF0aW5nIE5VTCBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgc3BhY2UgKi8KLQkJc2l6ZSArPSAxOwotCVB5VW5pY29kZV9Bc1dpZGVDaGFyKChQeVVuaWNvZGVPYmplY3QgKil2YWx1ZSwgKHdjaGFyX3QgKilwdHIsIHNpemUpOwotCXJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgIHNpemUsIGxlbmd0aCk7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoc2l6ZSA8IGxlbmd0aC0xKQorICAgICAgICAvKiBjb3B5IHRlcm1pbmF0aW5nIE5VTCBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgc3BhY2UgKi8KKyAgICAgICAgc2l6ZSArPSAxOworICAgIFB5VW5pY29kZV9Bc1dpZGVDaGFyKChQeVVuaWNvZGVPYmplY3QgKil2YWx1ZSwgKHdjaGFyX3QgKilwdHIsIHNpemUpOworICAgIHJldHVybiB2YWx1ZTsKIH0KIAogI2VuZGlmCkBAIC0xMzA1LDIwMSArMTMwNSwyMDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCXNpemVfdCBzbGVuOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgc2l6ZV90IHNsZW47CiAKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyICopcHRyKTsKLQlpZiAoIXJlc3VsdCkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogY2hvcCBvZmYgYXQgdGhlIGZpcnN0IE5VTCBjaGFyYWN0ZXIsIGlmIGFueS4KLQkgKiBPbiBlcnJvciwgcmVzdWx0IHdpbGwgYmUgZGVhbGxvY2F0ZWQgYW5kIHNldCB0byBOVUxMLgotCSAqLwotCXNsZW4gPSBzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkpOwotCXNpemUgPSBtaW4oc2l6ZSwgKFB5X3NzaXplX3Qpc2xlbik7Ci0JaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpIHsKLQkJLyogc2hvcnRlbiB0aGUgcmVzdWx0ICovCi0JCV9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgc2l6ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfSBlbHNlCi0JCS8qIGNhbm5vdCBzaG9ydGVuIHRoZSByZXN1bHQgKi8KLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHB0ciwgc2l6ZSk7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygoY2hhciAqKXB0cik7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIGNob3Agb2ZmIGF0IHRoZSBmaXJzdCBOVUwgY2hhcmFjdGVyLCBpZiBhbnkuCisgICAgICogT24gZXJyb3IsIHJlc3VsdCB3aWxsIGJlIGRlYWxsb2NhdGVkIGFuZCBzZXQgdG8gTlVMTC4KKyAgICAgKi8KKyAgICBzbGVuID0gc3RybGVuKFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpKTsKKyAgICBzaXplID0gbWluKHNpemUsIChQeV9zc2l6ZV90KXNsZW4pOworICAgIGlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKSB7CisgICAgICAgIC8qIHNob3J0ZW4gdGhlIHJlc3VsdCAqLworICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIHNpemUpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZWxzZQorICAgICAgICAvKiBjYW5ub3Qgc2hvcnRlbiB0aGUgcmVzdWx0ICovCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIsIHNpemUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc19zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3QgbGVuZ3RoKQogewotCWNoYXIgKmRhdGE7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIGNoYXIgKmRhdGE7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JZGF0YSA9IFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiBOVUxMOwotCXNpemUgPSBzdHJsZW4oZGF0YSk7Ci0JaWYgKHNpemUgPCBsZW5ndGgpIHsKLQkJLyogVGhpcyB3aWxsIGNvcHkgdGhlIGxlYWRpbmcgTlVMIGNoYXJhY3RlcgotCQkgKiBpZiB0aGVyZSBpcyBzcGFjZSBmb3IgaXQuCi0JCSAqLwotCQkrK3NpemU7Ci0JfSBlbHNlIGlmIChzaXplID4gbGVuZ3RoKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgIGRhdGEgPSBQeVN0cmluZ19Bc1N0cmluZyh2YWx1ZSk7CisgICAgaWYgKCFkYXRhKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzaXplID0gc3RybGVuKGRhdGEpOworICAgIGlmIChzaXplIDwgbGVuZ3RoKSB7CisgICAgICAgIC8qIFRoaXMgd2lsbCBjb3B5IHRoZSBsZWFkaW5nIE5VTCBjaGFyYWN0ZXIKKyAgICAgICAgICogaWYgdGhlcmUgaXMgc3BhY2UgZm9yIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgKytzaXplOworICAgIH0gZWxzZSBpZiAoc2l6ZSA+IGxlbmd0aCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCQkJICAgICAic3RyaW5nIHRvbyBsb25nICglZCwgbWF4aW11bSBsZW5ndGggJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgdG9vIGxvbmcgKCVkLCBtYXhpbXVtIGxlbmd0aCAlZCkiLAogI2Vsc2UKLQkJCSAgICAgInN0cmluZyB0b28gbG9uZyAoJXpkLCBtYXhpbXVtIGxlbmd0aCAlemQpIiwKKyAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgdG9vIGxvbmcgKCV6ZCwgbWF4aW11bSBsZW5ndGggJXpkKSIsCiAjZW5kaWYKLQkJCSAgICAgc2l6ZSwgbGVuZ3RoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIEFsc28gY29weSB0aGUgdGVybWluYXRpbmcgTlVMIGNoYXJhY3RlciBpZiB0aGVyZSBpcyBzcGFjZSAqLwotCW1lbWNweSgoY2hhciAqKXB0ciwgZGF0YSwgc2l6ZSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICBzaXplLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogQWxzbyBjb3B5IHRoZSB0ZXJtaW5hdGluZyBOVUwgY2hhcmFjdGVyIGlmIHRoZXJlIGlzIHNwYWNlICovCisgICAgbWVtY3B5KChjaGFyICopcHRyLCBkYXRhLCBzaXplKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHpfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JaWYgKHZhbHVlID09IFB5X05vbmUpIHsKLQkJKihjaGFyICoqKXB0ciA9IE5VTEw7Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQkqKGNoYXIgKiopcHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKTsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewotCQlQeU9iamVjdCAqc3RyID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh2YWx1ZSwKLQkJCQkJCQkgIF9jdHlwZXNfY29udmVyc2lvbl9lbmNvZGluZywKLQkJCQkJCQkgIF9jdHlwZXNfY29udmVyc2lvbl9lcnJvcnMpOwotCQlpZiAoc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJKihjaGFyICoqKXB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpOwotCQlyZXR1cm4gc3RyOwotCX0gZWxzZSBpZiAoUHlJbnRfQ2hlY2sodmFsdWUpIHx8IFB5TG9uZ19DaGVjayh2YWx1ZSkpIHsKKyAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkgeworICAgICAgICAqKGNoYXIgKiopcHRyID0gTlVMTDsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgICooY2hhciAqKilwdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpOworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5T2JqZWN0ICpzdHIgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3R5cGVzX2NvbnZlcnNpb25fZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdHlwZXNfY29udmVyc2lvbl9lcnJvcnMpOworICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgKihjaGFyICoqKXB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpOworICAgICAgICByZXR1cm4gc3RyOworICAgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2sodmFsdWUpIHx8IFB5TG9uZ19DaGVjayh2YWx1ZSkpIHsKICNpZiBTSVpFT0ZfVk9JRF9QID09IFNJWkVPRl9MT05HX0xPTkcKLQkJKihjaGFyICoqKXB0ciA9IChjaGFyICopUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2YWx1ZSk7CisgICAgICAgICooY2hhciAqKilwdHIgPSAoY2hhciAqKVB5SW50X0FzVW5zaWduZWRMb25nTG9uZ01hc2sodmFsdWUpOwogI2Vsc2UKLQkJKihjaGFyICoqKXB0ciA9IChjaGFyICopUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKHZhbHVlKTsKKyAgICAgICAgKihjaGFyICoqKXB0ciA9IChjaGFyICopUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKHZhbHVlKTsKICNlbmRpZgotCQlfUkVUKHZhbHVlKTsKLQl9Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAic3RyaW5nIG9yIGludGVnZXIgYWRkcmVzcyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIF9SRVQodmFsdWUpOworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAic3RyaW5nIG9yIGludGVnZXIgYWRkcmVzcyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogel9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JLyogWFhYIFdoYXQgYWJvdXQgaW52YWxpZCBwb2ludGVycyA/Pz8gKi8KLQlpZiAoKih2b2lkICoqKXB0cikgeworICAgIC8qIFhYWCBXaGF0IGFib3V0IGludmFsaWQgcG9pbnRlcnMgPz8/ICovCisgICAgaWYgKCoodm9pZCAqKilwdHIpIHsKICNpZiBkZWZpbmVkKE1TX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotCQlpZiAoSXNCYWRTdHJpbmdQdHJBKCooY2hhciAqKilwdHIsIC0xKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgICAiaW52YWxpZCBzdHJpbmcgcG9pbnRlciAlcCIsCi0JCQkJICAgICAqKGNoYXIgKiopcHRyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGlmIChJc0JhZFN0cmluZ1B0ckEoKihjaGFyICoqKXB0ciwgLTEpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBzdHJpbmcgcG9pbnRlciAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKihjaGFyICoqKXB0cik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCooY2hhciAqKilwdHIpOwotCX0gZWxzZSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygqKGNoYXIgKiopcHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIH0KIAogI2lmZGVmIENUWVBFU19VTklDT0RFCiBzdGF0aWMgUHlPYmplY3QgKgogWl9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlpZiAodmFsdWUgPT0gUHlfTm9uZSkgewotCQkqKHdjaGFyX3QgKiopcHRyID0gTlVMTDsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQlpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCXZhbHVlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHZhbHVlLAotCQkJCQkJICAgIF9jdHlwZXNfY29udmVyc2lvbl9lbmNvZGluZywKLQkJCQkJCSAgICBfY3R5cGVzX2NvbnZlcnNpb25fZXJyb3JzKTsKLQkJaWYgKCF2YWx1ZSkKLQkJCXJldHVybiBOVUxMOwotCX0gZWxzZSBpZiAoUHlJbnRfQ2hlY2sodmFsdWUpIHx8IFB5TG9uZ19DaGVjayh2YWx1ZSkpIHsKKyAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkgeworICAgICAgICAqKHdjaGFyX3QgKiopcHRyID0gTlVMTDsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIHZhbHVlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3R5cGVzX2NvbnZlcnNpb25fZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdHlwZXNfY29udmVyc2lvbl9lcnJvcnMpOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmIChQeUludF9DaGVjayh2YWx1ZSkgfHwgUHlMb25nX0NoZWNrKHZhbHVlKSkgewogI2lmIFNJWkVPRl9WT0lEX1AgPT0gU0laRU9GX0xPTkdfTE9ORwotCQkqKHdjaGFyX3QgKiopcHRyID0gKHdjaGFyX3QgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHZhbHVlKTsKKyAgICAgICAgKih3Y2hhcl90ICoqKXB0ciA9ICh3Y2hhcl90ICopUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2YWx1ZSk7CiAjZWxzZQotCQkqKHdjaGFyX3QgKiopcHRyID0gKHdjaGFyX3QgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodmFsdWUpOworICAgICAgICAqKHdjaGFyX3QgKiopcHRyID0gKHdjaGFyX3QgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodmFsdWUpOwogI2VuZGlmCi0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfSBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAidW5pY29kZSBzdHJpbmcgb3IgaW50ZWdlciBhZGRyZXNzIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0gZWxzZQotCQlQeV9JTkNSRUYodmFsdWUpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0gZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ1bmljb2RlIHN0cmluZyBvciBpbnRlZ2VyIGFkZHJlc3MgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZQorICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwogI2lmZGVmIEhBVkVfVVNBQkxFX1dDSEFSX1QKLQkvKiBIQVZFX1VTQUJMRV9XQ0hBUl9UIG1lYW5zIHRoYXQgUHlfVU5JQ09ERSBhbmQgd2NoYXJfdCBpcyB0aGUgc2FtZQotCSAgIHR5cGUuICBTbyB3ZSBjYW4gY29weSBkaXJlY3RseS4gIEhtLCBhcmUgdW5pY29kZSBvYmplY3RzIGFsd2F5cyBOVUwKLQkgICB0ZXJtaW5hdGVkIGluIFB5dGhvbiwgaW50ZXJuYWxseT8KLQkgKi8KLQkqKHdjaGFyX3QgKiopcHRyID0gUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpOwotCXJldHVybiB2YWx1ZTsKKyAgICAvKiBIQVZFX1VTQUJMRV9XQ0hBUl9UIG1lYW5zIHRoYXQgUHlfVU5JQ09ERSBhbmQgd2NoYXJfdCBpcyB0aGUgc2FtZQorICAgICAgIHR5cGUuICBTbyB3ZSBjYW4gY29weSBkaXJlY3RseS4gIEhtLCBhcmUgdW5pY29kZSBvYmplY3RzIGFsd2F5cyBOVUwKKyAgICAgICB0ZXJtaW5hdGVkIGluIFB5dGhvbiwgaW50ZXJuYWxseT8KKyAgICAgKi8KKyAgICAqKHdjaGFyX3QgKiopcHRyID0gUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKICNlbHNlCi0JewotCQkvKiBXZSBtdXN0IGNyZWF0ZSBhIHdjaGFyX3QqIGJ1ZmZlciBmcm9tIHRoZSB1bmljb2RlIG9iamVjdCwKLQkJICAgYW5kIGtlZXAgaXQgYWxpdmUgKi8KLQkJUHlPYmplY3QgKmtlZXA7Ci0JCXdjaGFyX3QgKmJ1ZmZlcjsKKyAgICB7CisgICAgICAgIC8qIFdlIG11c3QgY3JlYXRlIGEgd2NoYXJfdCogYnVmZmVyIGZyb20gdGhlIHVuaWNvZGUgb2JqZWN0LAorICAgICAgICAgICBhbmQga2VlcCBpdCBhbGl2ZSAqLworICAgICAgICBQeU9iamVjdCAqa2VlcDsKKyAgICAgICAgd2NoYXJfdCAqYnVmZmVyOwogCi0JCWludCBzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKTsKLQkJc2l6ZSArPSAxOyAvKiB0ZXJtaW5hdGluZyBOVUwgKi8KLQkJc2l6ZSAqPSBzaXplb2Yod2NoYXJfdCk7Ci0JCWJ1ZmZlciA9ICh3Y2hhcl90ICopUHlNZW1fTWFsbG9jKHNpemUpOwotCQlpZiAoIWJ1ZmZlcikgewotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQl9Ci0JCW1lbXNldChidWZmZXIsIDAsIHNpemUpOwotCQlrZWVwID0gQ0FQU1VMRV9ORVcoYnVmZmVyLCBDVFlQRVNfQ0FQU1VMRV9XQ0hBUl9UKTsKLQkJaWYgKCFrZWVwKSB7Ci0JCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJUHlNZW1fRnJlZShidWZmZXIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJKih3Y2hhcl90ICoqKXB0ciA9ICh3Y2hhcl90ICopYnVmZmVyOwotCQlpZiAoLTEgPT0gUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLAotCQkJCQkgICAgICAgYnVmZmVyLCBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpKSkgewotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCVB5X0RFQ1JFRihrZWVwKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiBrZWVwOwotCX0KKyAgICAgICAgaW50IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOworICAgICAgICBzaXplICs9IDE7IC8qIHRlcm1pbmF0aW5nIE5VTCAqLworICAgICAgICBzaXplICo9IHNpemVvZih3Y2hhcl90KTsKKyAgICAgICAgYnVmZmVyID0gKHdjaGFyX3QgKilQeU1lbV9NYWxsb2Moc2l6ZSk7CisgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZSk7CisgICAgICAgIGtlZXAgPSBDQVBTVUxFX05FVyhidWZmZXIsIENUWVBFU19DQVBTVUxFX1dDSEFSX1QpOworICAgICAgICBpZiAoIWtlZXApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAqKHdjaGFyX3QgKiopcHRyID0gKHdjaGFyX3QgKilidWZmZXI7CisgICAgICAgIGlmICgtMSA9PSBQeVVuaWNvZGVfQXNXaWRlQ2hhcigoUHlVbmljb2RlT2JqZWN0ICopdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIFB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSkpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgUHlfREVDUkVGKGtlZXApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIGtlZXA7CisgICAgfQogI2VuZGlmCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBaX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl3Y2hhcl90ICpwOwotCXAgPSAqKHdjaGFyX3QgKiopcHRyOwotCWlmIChwKSB7CisgICAgd2NoYXJfdCAqcDsKKyAgICBwID0gKih3Y2hhcl90ICoqKXB0cjsKKyAgICBpZiAocCkgewogI2lmIGRlZmluZWQoTVNfV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCi0JCWlmIChJc0JhZFN0cmluZ1B0clcoKih3Y2hhcl90ICoqKXB0ciwgLTEpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICJpbnZhbGlkIHN0cmluZyBwb2ludGVyICVwIiwKLQkJCQkgICAgICood2NoYXJfdCAqKilwdHIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKElzQmFkU3RyaW5nUHRyVygqKHdjaGFyX3QgKiopcHRyLCAtMSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmluZyBwb2ludGVyICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqKHdjaGFyX3QgKiopcHRyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAjZW5kaWYKLQkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocCwgd2NzbGVuKHApKTsKLQl9IGVsc2UgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocCwgd2NzbGVuKHApKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIH0KICNlbmRpZgogCkBAIC0xNTA3LDE2NiArMTUwNywxNjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCU1RSX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCUJTVFIgYnN0cjsKKyAgICBCU1RSIGJzdHI7CiAKLQkvKiBjb252ZXJ0IHZhbHVlIGludG8gYSBQeVVuaWNvZGVPYmplY3Qgb3IgTlVMTCAqLwotCWlmIChQeV9Ob25lID09IHZhbHVlKSB7Ci0JCXZhbHVlID0gTlVMTDsKLQl9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQl2YWx1ZSA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCh2YWx1ZSwKLQkJCQkJCSAgICBfY3R5cGVzX2NvbnZlcnNpb25fZW5jb2RpbmcsCi0JCQkJCQkgICAgX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycyk7Ci0JCWlmICghdmFsdWUpCi0JCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKLQkJUHlfSU5DUkVGKHZhbHVlKTsgLyogZm9yIHRoZSBkZXNjcmVmIGJlbG93ICovCi0JfSBlbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidW5pY29kZSBzdHJpbmcgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkJdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogY29udmVydCB2YWx1ZSBpbnRvIGEgUHlVbmljb2RlT2JqZWN0IG9yIE5VTEwgKi8KKyAgICBpZiAoUHlfTm9uZSA9PSB2YWx1ZSkgeworICAgICAgICB2YWx1ZSA9IE5VTEw7CisgICAgfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QodmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jdHlwZXNfY29udmVyc2lvbl9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N0eXBlc19jb252ZXJzaW9uX2Vycm9ycyk7CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsgLyogZm9yIHRoZSBkZXNjcmVmIGJlbG93ICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1bmljb2RlIHN0cmluZyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogY3JlYXRlIGEgQlNUUiBmcm9tIHZhbHVlICovCi0JaWYgKHZhbHVlKSB7Ci0JCVB5X3NzaXplX3Qgc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSk7Ci0JCWlmICgodW5zaWduZWQpIHNpemUgIT0gc2l6ZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJTdHJpbmcgdG9vIGxvbmcgZm9yIEJTVFIiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWJzdHIgPSBTeXNBbGxvY1N0cmluZ0xlbihQeVVuaWNvZGVfQVNfVU5JQ09ERSh2YWx1ZSksCi0JCQkJCSAodW5zaWduZWQpc2l6ZSk7Ci0JCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JfSBlbHNlCi0JCWJzdHIgPSBOVUxMOworICAgIC8qIGNyZWF0ZSBhIEJTVFIgZnJvbSB2YWx1ZSAqLworICAgIGlmICh2YWx1ZSkgeworICAgICAgICBQeV9zc2l6ZV90IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOworICAgICAgICBpZiAoKHVuc2lnbmVkKSBzaXplICE9IHNpemUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiU3RyaW5nIHRvbyBsb25nIGZvciBCU1RSIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBic3RyID0gU3lzQWxsb2NTdHJpbmdMZW4oUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXNpemUpOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgIH0gZWxzZQorICAgICAgICBic3RyID0gTlVMTDsKIAotCS8qIGZyZWUgdGhlIHByZXZpb3VzIGNvbnRlbnRzLCBpZiBhbnkgKi8KLQlpZiAoKihCU1RSICopcHRyKQotCQlTeXNGcmVlU3RyaW5nKCooQlNUUiAqKXB0cik7Ci0JCi0JLyogYW5kIHN0b3JlIGl0ICovCi0JKihCU1RSICopcHRyID0gYnN0cjsKKyAgICAvKiBmcmVlIHRoZSBwcmV2aW91cyBjb250ZW50cywgaWYgYW55ICovCisgICAgaWYgKCooQlNUUiAqKXB0cikKKyAgICAgICAgU3lzRnJlZVN0cmluZygqKEJTVFIgKilwdHIpOwogCi0JLyogV2UgZG9uJ3QgbmVlZCB0byBrZWVwIGFueSBvdGhlciBvYmplY3QgKi8KLQlfUkVUKHZhbHVlKTsKKyAgICAvKiBhbmQgc3RvcmUgaXQgKi8KKyAgICAqKEJTVFIgKilwdHIgPSBic3RyOworCisgICAgLyogV2UgZG9uJ3QgbmVlZCB0byBrZWVwIGFueSBvdGhlciBvYmplY3QgKi8KKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogQlNUUl9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JQlNUUiBwOwotCXAgPSAqKEJTVFIgKilwdHI7Ci0JaWYgKHApCi0JCXJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHAsIFN5c1N0cmluZ0xlbihwKSk7Ci0JZWxzZSB7Ci0JCS8qIEhtLCBpdCBzZWVtcyBOVUxMIHBvaW50ZXIgYW5kIHplcm8gbGVuZ3RoIHN0cmluZyBhcmUgdGhlCi0JCSAgIHNhbWUgaW4gQlNUUiwgc2VlIERvbiBCb3gsIHAgODEKLQkJKi8KLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgQlNUUiBwOworICAgIHAgPSAqKEJTVFIgKilwdHI7CisgICAgaWYgKHApCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHAsIFN5c1N0cmluZ0xlbihwKSk7CisgICAgZWxzZSB7CisgICAgICAgIC8qIEhtLCBpdCBzZWVtcyBOVUxMIHBvaW50ZXIgYW5kIHplcm8gbGVuZ3RoIHN0cmluZyBhcmUgdGhlCisgICAgICAgICAgIHNhbWUgaW4gQlNUUiwgc2VlIERvbiBCb3gsIHAgODEKKyAgICAgICAgKi8KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIFBfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0Jdm9pZCAqdjsKLQlpZiAodmFsdWUgPT0gUHlfTm9uZSkgewotCQkqKHZvaWQgKiopcHRyID0gTlVMTDsKLQkJX1JFVCh2YWx1ZSk7Ci0JfQorICAgIHZvaWQgKnY7CisgICAgaWYgKHZhbHVlID09IFB5X05vbmUpIHsKKyAgICAgICAgKih2b2lkICoqKXB0ciA9IE5VTEw7CisgICAgICAgIF9SRVQodmFsdWUpOworICAgIH0KIAotCWlmICghUHlJbnRfQ2hlY2sodmFsdWUpICYmICFQeUxvbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gcG9pbnRlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUludF9DaGVjayh2YWx1ZSkgJiYgIVB5TG9uZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgY29udmVydGVkIHRvIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjaWYgU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORwotCXYgPSAodm9pZCAqKVB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2YWx1ZSk7CisgICAgdiA9ICh2b2lkICopUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKHZhbHVlKTsKICNlbHNlCiAjaWZuZGVmIEhBVkVfTE9OR19MT05HCiAjICAgZXJyb3IgIlB5TG9uZ19Bc1ZvaWRQdHI6IHNpemVvZih2b2lkKikgPiBzaXplb2YobG9uZyksIGJ1dCBubyBsb25nIGxvbmciCiAjZWxpZiBTSVpFT0ZfTE9OR19MT05HIDwgU0laRU9GX1ZPSURfUAogIyAgIGVycm9yICJQeUxvbmdfQXNWb2lkUHRyOiBzaXplb2YoUFlfTE9OR19MT05HKSA8IHNpemVvZih2b2lkKikiCiAjZW5kaWYKLQl2ID0gKHZvaWQgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHZhbHVlKTsKKyAgICB2ID0gKHZvaWQgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHZhbHVlKTsKICNlbmRpZgogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCSoodm9pZCAqKilwdHIgPSB2OwotCV9SRVQodmFsdWUpOworICAgICoodm9pZCAqKilwdHIgPSB2OworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JaWYgKCoodm9pZCAqKilwdHIgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKCoodm9pZCAqKilwdHIpOworICAgIGlmICgqKHZvaWQgKiopcHRyID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cigqKHZvaWQgKiopcHRyKTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWVsZGRlc2MgZm9ybWF0dGFibGVbXSA9IHsKLQl7ICdzJywgc19zZXQsIHNfZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCi0JeyAnYicsIGJfc2V0LCBiX2dldCwgJmZmaV90eXBlX3NjaGFyfSwKLQl7ICdCJywgQl9zZXQsIEJfZ2V0LCAmZmZpX3R5cGVfdWNoYXJ9LAotCXsgJ2MnLCBjX3NldCwgY19nZXQsICZmZmlfdHlwZV9zY2hhcn0sCi0JeyAnZCcsIGRfc2V0LCBkX2dldCwgJmZmaV90eXBlX2RvdWJsZSwgZF9zZXRfc3csIGRfZ2V0X3N3fSwKLQl7ICdnJywgZ19zZXQsIGdfZ2V0LCAmZmZpX3R5cGVfbG9uZ2RvdWJsZX0sCi0JeyAnZicsIGZfc2V0LCBmX2dldCwgJmZmaV90eXBlX2Zsb2F0LCBmX3NldF9zdywgZl9nZXRfc3d9LAotCXsgJ2gnLCBoX3NldCwgaF9nZXQsICZmZmlfdHlwZV9zc2hvcnQsIGhfc2V0X3N3LCBoX2dldF9zd30sCi0JeyAnSCcsIEhfc2V0LCBIX2dldCwgJmZmaV90eXBlX3VzaG9ydCwgSF9zZXRfc3csIEhfZ2V0X3N3fSwKLQl7ICdpJywgaV9zZXQsIGlfZ2V0LCAmZmZpX3R5cGVfc2ludCwgaV9zZXRfc3csIGlfZ2V0X3N3fSwKLQl7ICdJJywgSV9zZXQsIElfZ2V0LCAmZmZpX3R5cGVfdWludCwgSV9zZXRfc3csIElfZ2V0X3N3fSwKKyAgICB7ICdzJywgc19zZXQsIHNfZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCisgICAgeyAnYicsIGJfc2V0LCBiX2dldCwgJmZmaV90eXBlX3NjaGFyfSwKKyAgICB7ICdCJywgQl9zZXQsIEJfZ2V0LCAmZmZpX3R5cGVfdWNoYXJ9LAorICAgIHsgJ2MnLCBjX3NldCwgY19nZXQsICZmZmlfdHlwZV9zY2hhcn0sCisgICAgeyAnZCcsIGRfc2V0LCBkX2dldCwgJmZmaV90eXBlX2RvdWJsZSwgZF9zZXRfc3csIGRfZ2V0X3N3fSwKKyAgICB7ICdnJywgZ19zZXQsIGdfZ2V0LCAmZmZpX3R5cGVfbG9uZ2RvdWJsZX0sCisgICAgeyAnZicsIGZfc2V0LCBmX2dldCwgJmZmaV90eXBlX2Zsb2F0LCBmX3NldF9zdywgZl9nZXRfc3d9LAorICAgIHsgJ2gnLCBoX3NldCwgaF9nZXQsICZmZmlfdHlwZV9zc2hvcnQsIGhfc2V0X3N3LCBoX2dldF9zd30sCisgICAgeyAnSCcsIEhfc2V0LCBIX2dldCwgJmZmaV90eXBlX3VzaG9ydCwgSF9zZXRfc3csIEhfZ2V0X3N3fSwKKyAgICB7ICdpJywgaV9zZXQsIGlfZ2V0LCAmZmZpX3R5cGVfc2ludCwgaV9zZXRfc3csIGlfZ2V0X3N3fSwKKyAgICB7ICdJJywgSV9zZXQsIElfZ2V0LCAmZmZpX3R5cGVfdWludCwgSV9zZXRfc3csIElfZ2V0X3N3fSwKIC8qIFhYWCBIbSwgc2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpIGRvZXNuJ3QgaG9sZCBvbiBldmVyeSBwbGF0Zm9ybSAqLwogLyogQXMgc29vbiBhcyB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGUgdHlwZSBjb2RlcywgdGhpcyBpcyBubyBsb25nZXIgYSBwcm9ibGVtICovCiAjaWYgU0laRU9GX0xPTkcgPT0gNAotCXsgJ2wnLCBsX3NldCwgbF9nZXQsICZmZmlfdHlwZV9zaW50MzIsIGxfc2V0X3N3LCBsX2dldF9zd30sCi0JeyAnTCcsIExfc2V0LCBMX2dldCwgJmZmaV90eXBlX3VpbnQzMiwgTF9zZXRfc3csIExfZ2V0X3N3fSwKKyAgICB7ICdsJywgbF9zZXQsIGxfZ2V0LCAmZmZpX3R5cGVfc2ludDMyLCBsX3NldF9zdywgbF9nZXRfc3d9LAorICAgIHsgJ0wnLCBMX3NldCwgTF9nZXQsICZmZmlfdHlwZV91aW50MzIsIExfc2V0X3N3LCBMX2dldF9zd30sCiAjZWxpZiBTSVpFT0ZfTE9ORyA9PSA4Ci0JeyAnbCcsIGxfc2V0LCBsX2dldCwgJmZmaV90eXBlX3NpbnQ2NCwgbF9zZXRfc3csIGxfZ2V0X3N3fSwKLQl7ICdMJywgTF9zZXQsIExfZ2V0LCAmZmZpX3R5cGVfdWludDY0LCBMX3NldF9zdywgTF9nZXRfc3d9LAorICAgIHsgJ2wnLCBsX3NldCwgbF9nZXQsICZmZmlfdHlwZV9zaW50NjQsIGxfc2V0X3N3LCBsX2dldF9zd30sCisgICAgeyAnTCcsIExfc2V0LCBMX2dldCwgJmZmaV90eXBlX3VpbnQ2NCwgTF9zZXRfc3csIExfZ2V0X3N3fSwKICNlbHNlCiAjIGVycm9yCiAjZW5kaWYKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogI2lmIFNJWkVPRl9MT05HX0xPTkcgPT0gOAotCXsgJ3EnLCBxX3NldCwgcV9nZXQsICZmZmlfdHlwZV9zaW50NjQsIHFfc2V0X3N3LCBxX2dldF9zd30sCi0JeyAnUScsIFFfc2V0LCBRX2dldCwgJmZmaV90eXBlX3VpbnQ2NCwgUV9zZXRfc3csIFFfZ2V0X3N3fSwKKyAgICB7ICdxJywgcV9zZXQsIHFfZ2V0LCAmZmZpX3R5cGVfc2ludDY0LCBxX3NldF9zdywgcV9nZXRfc3d9LAorICAgIHsgJ1EnLCBRX3NldCwgUV9nZXQsICZmZmlfdHlwZV91aW50NjQsIFFfc2V0X3N3LCBRX2dldF9zd30sCiAjZWxzZQogIyBlcnJvcgogI2VuZGlmCiAjZW5kaWYKLQl7ICdQJywgUF9zZXQsIFBfZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCi0JeyAneicsIHpfc2V0LCB6X2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAorICAgIHsgJ1AnLCBQX3NldCwgUF9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKKyAgICB7ICd6Jywgel9zZXQsIHpfZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKLQl7ICd1JywgdV9zZXQsIHVfZ2V0LCBOVUxMfSwgLyogZmZpX3R5cGUgc2V0IGxhdGVyICovCi0JeyAnVScsIFVfc2V0LCBVX2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAotCXsgJ1onLCBaX3NldCwgWl9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKKyAgICB7ICd1JywgdV9zZXQsIHVfZ2V0LCBOVUxMfSwgLyogZmZpX3R5cGUgc2V0IGxhdGVyICovCisgICAgeyAnVScsIFVfc2V0LCBVX2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAorICAgIHsgJ1onLCBaX3NldCwgWl9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKICNlbmRpZgogI2lmZGVmIE1TX1dJTjMyCi0JeyAnWCcsIEJTVFJfc2V0LCBCU1RSX2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAotCXsgJ3YnLCB2Qk9PTF9zZXQsIHZCT09MX2dldCwgJmZmaV90eXBlX3NzaG9ydH0sCisgICAgeyAnWCcsIEJTVFJfc2V0LCBCU1RSX2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAorICAgIHsgJ3YnLCB2Qk9PTF9zZXQsIHZCT09MX2dldCwgJmZmaV90eXBlX3NzaG9ydH0sCiAjZW5kaWYKICNpZiBTSVpFT0ZfX0JPT0wgPT0gMQotCXsgJz8nLCBib29sX3NldCwgYm9vbF9nZXQsICZmZmlfdHlwZV91Y2hhcn0sIC8qIEFsc28gZmFsbGJhY2sgZm9yIG5vIG5hdGl2ZSBfQm9vbCBzdXBwb3J0ICovCisgICAgeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3VjaGFyfSwgLyogQWxzbyBmYWxsYmFjayBmb3Igbm8gbmF0aXZlIF9Cb29sIHN1cHBvcnQgKi8KICNlbGlmIFNJWkVPRl9fQk9PTCA9PSBTSVpFT0ZfU0hPUlQKLQl7ICc/JywgYm9vbF9zZXQsIGJvb2xfZ2V0LCAmZmZpX3R5cGVfdXNob3J0fSwKKyAgICB7ICc/JywgYm9vbF9zZXQsIGJvb2xfZ2V0LCAmZmZpX3R5cGVfdXNob3J0fSwKICNlbGlmIFNJWkVPRl9fQk9PTCA9PSBTSVpFT0ZfSU5UCi0JeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3VpbnQsIElfc2V0X3N3LCBJX2dldF9zd30sCisgICAgeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3VpbnQsIElfc2V0X3N3LCBJX2dldF9zd30sCiAjZWxpZiBTSVpFT0ZfX0JPT0wgPT0gU0laRU9GX0xPTkcKLQl7ICc/JywgYm9vbF9zZXQsIGJvb2xfZ2V0LCAmZmZpX3R5cGVfdWxvbmcsIExfc2V0X3N3LCBMX2dldF9zd30sCisgICAgeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3Vsb25nLCBMX3NldF9zdywgTF9nZXRfc3d9LAogI2VsaWYgU0laRU9GX19CT09MID09IFNJWkVPRl9MT05HX0xPTkcKLQl7ICc/JywgYm9vbF9zZXQsIGJvb2xfZ2V0LCAmZmZpX3R5cGVfdWxvbmcsIFFfc2V0X3N3LCBRX2dldF9zd30sCisgICAgeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3Vsb25nLCBRX3NldF9zdywgUV9nZXRfc3d9LAogI2VuZGlmIC8qIFNJWkVPRl9fQk9PTCAqLwotCXsgJ08nLCBPX3NldCwgT19nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKLQl7IDAsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsgJ08nLCBPX3NldCwgT19nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKKyAgICB7IDAsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogLyoKQEAgLTE2NzcsMjYgKzE2NzcsMjYgQEAKIHN0cnVjdCBmaWVsZGRlc2MgKgogX2N0eXBlc19nZXRfZmllbGRkZXNjKGNoYXIgKmZtdCkKIHsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLQlzdHJ1Y3QgZmllbGRkZXNjICp0YWJsZSA9IGZvcm1hdHRhYmxlOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworICAgIHN0cnVjdCBmaWVsZGRlc2MgKnRhYmxlID0gZm9ybWF0dGFibGU7CiAKLQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCWluaXRpYWxpemVkID0gMTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIGluaXRpYWxpemVkID0gMTsKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCQlpZiAoc2l6ZW9mKHdjaGFyX3QpID09IHNpemVvZihzaG9ydCkpCi0JCQlfY3R5cGVzX2dldF9maWVsZGRlc2MoInUiKS0+cGZmaV90eXBlID0gJmZmaV90eXBlX3NzaG9ydDsKLQkJZWxzZSBpZiAoc2l6ZW9mKHdjaGFyX3QpID09IHNpemVvZihpbnQpKQotCQkJX2N0eXBlc19nZXRfZmllbGRkZXNjKCJ1IiktPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9zaW50OwotCQllbHNlIGlmIChzaXplb2Yod2NoYXJfdCkgPT0gc2l6ZW9mKGxvbmcpKQotCQkJX2N0eXBlc19nZXRfZmllbGRkZXNjKCJ1IiktPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9zbG9uZzsKKyAgICAgICAgaWYgKHNpemVvZih3Y2hhcl90KSA9PSBzaXplb2Yoc2hvcnQpKQorICAgICAgICAgICAgX2N0eXBlc19nZXRfZmllbGRkZXNjKCJ1IiktPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9zc2hvcnQ7CisgICAgICAgIGVsc2UgaWYgKHNpemVvZih3Y2hhcl90KSA9PSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgIF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygidSIpLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfc2ludDsKKyAgICAgICAgZWxzZSBpZiAoc2l6ZW9mKHdjaGFyX3QpID09IHNpemVvZihsb25nKSkKKyAgICAgICAgICAgIF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygidSIpLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfc2xvbmc7CiAjZW5kaWYKLQl9CisgICAgfQogCi0JZm9yICg7IHRhYmxlLT5jb2RlOyArK3RhYmxlKSB7Ci0JCWlmICh0YWJsZS0+Y29kZSA9PSBmbXRbMF0pCi0JCQlyZXR1cm4gdGFibGU7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGZvciAoOyB0YWJsZS0+Y29kZTsgKyt0YWJsZSkgeworICAgICAgICBpZiAodGFibGUtPmNvZGUgPT0gZm10WzBdKQorICAgICAgICAgICAgcmV0dXJuIHRhYmxlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IGNoYXIgeDsgfSBzX2NoYXI7CkBAIC0xNzQwLDEwICsxNzQwLDEwIEBACiAvKiBmcm9tIGZmaS5oOgogdHlwZWRlZiBzdHJ1Y3QgX2ZmaV90eXBlCiB7Ci0Jc2l6ZV90IHNpemU7Ci0JdW5zaWduZWQgc2hvcnQgYWxpZ25tZW50OwotCXVuc2lnbmVkIHNob3J0IHR5cGU7Ci0Jc3RydWN0IF9mZmlfdHlwZSAqKmVsZW1lbnRzOworICAgIHNpemVfdCBzaXplOworICAgIHVuc2lnbmVkIHNob3J0IGFsaWdubWVudDsKKyAgICB1bnNpZ25lZCBzaG9ydCB0eXBlOworICAgIHN0cnVjdCBfZmZpX3R5cGUgKiplbGVtZW50czsKIH0gZmZpX3R5cGU7CiAqLwogCkBAIC0xNzcwLDcgKzE3NzAsNyBAQAogI2VuZGlmCiAgIC8qIFRoaXMgaXMgYWxyZWFkeSBkZWZpbmVkIG9uIE9TWCAqLwogZmZpX3R5cGUgZmZpX3R5cGVfbG9uZ2RvdWJsZSA9IHsgc2l6ZW9mKGxvbmcgZG91YmxlKSwgTE9OR0RPVUJMRV9BTElHTiwKLQkJCQkgRkZJX1RZUEVfTE9OR0RPVUJMRSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZJX1RZUEVfTE9OR0RPVUJMRSB9OwogCiBmZmlfdHlwZSBmZmlfdHlwZV9wb2ludGVyID0geyBzaXplb2Yodm9pZCAqKSwgVk9JRF9QX0FMSUdOLCBGRklfVFlQRV9QT0lOVEVSIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaCBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaAppbmRleCA3MThlZTUyLi43ZDdiYTFmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCkBAIC0yNCw3ICsyNCw3IEBACiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA2MDAwMCkKICNkZWZpbmUgUHlfVFlQRShvYikgKCgoUHlPYmplY3QqKShvYikpLT5vYl90eXBlKQogI2RlZmluZSBQeVZhck9iamVjdF9IRUFEX0lOSVQodHlwZSwgc2l6ZSkgXAotCVB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSBzaXplLAorICAgIFB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSBzaXplLAogI2RlZmluZSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrIFB5SW1wb3J0X0ltcG9ydE1vZHVsZQogI2RlZmluZSBQeUxvbmdfRnJvbVNzaXplX3QgUHlJbnRfRnJvbUxvbmcKICNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiAwCkBAIC02MiwxNiArNjIsMTYgQEAKIGRpZmZpY3VsdCBpbiB0aGUgcHJlc2VuY2Ugb2YgUHlDRnVuY1B0ck9iamVjdC4gIE1heWJlIGxhdGVyLgogKi8KIHVuaW9uIHZhbHVlIHsKLQkJY2hhciBjWzE2XTsKLQkJc2hvcnQgczsKLQkJaW50IGk7Ci0JCWxvbmcgbDsKLQkJZmxvYXQgZjsKLQkJZG91YmxlIGQ7CisgICAgICAgICAgICAgICAgY2hhciBjWzE2XTsKKyAgICAgICAgICAgICAgICBzaG9ydCBzOworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGxvbmcgbDsKKyAgICAgICAgICAgICAgICBmbG9hdCBmOworICAgICAgICAgICAgICAgIGRvdWJsZSBkOwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCVBZX0xPTkdfTE9ORyBsbDsKKyAgICAgICAgICAgICAgICBQWV9MT05HX0xPTkcgbGw7CiAjZW5kaWYKLQkJbG9uZyBkb3VibGUgRDsKKyAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBEOwogfTsKIAogLyoKQEAgLTgxLDY3ICs4MSw2NyBAQAogKi8KIAogc3RydWN0IHRhZ0NEYXRhT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JY2hhciAqYl9wdHI7CQkvKiBwb2ludGVyIHRvIG1lbW9yeSBibG9jayAqLwotCWludCAgYl9uZWVkc2ZyZWU7CS8qIG5lZWQgX3dlXyBmcmVlIHRoZSBtZW1vcnk/ICovCi0JQ0RhdGFPYmplY3QgKmJfYmFzZTsJLyogcG9pbnRlciB0byBiYXNlIG9iamVjdCBvciBOVUxMICovCi0JUHlfc3NpemVfdCBiX3NpemU7CS8qIHNpemUgb2YgbWVtb3J5IGJsb2NrIGluIGJ5dGVzICovCi0JUHlfc3NpemVfdCBiX2xlbmd0aDsJLyogbnVtYmVyIG9mIHJlZmVyZW5jZXMgd2UgbmVlZCAqLwotCVB5X3NzaXplX3QgYl9pbmRleDsJLyogaW5kZXggb2YgdGhpcyBvYmplY3QgaW50byBiYXNlJ3MKLQkJCQkgICBiX29iamVjdCBsaXN0ICovCi0JUHlPYmplY3QgKmJfb2JqZWN0czsJLyogZGljdGlvbmFyeSBvZiByZWZlcmVuY2VzIHdlIG5lZWQgdG8ga2VlcCwgb3IgUHlfTm9uZSAqLwotCXVuaW9uIHZhbHVlIGJfdmFsdWU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIGNoYXIgKmJfcHRyOyAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIG1lbW9yeSBibG9jayAqLworICAgIGludCAgYl9uZWVkc2ZyZWU7ICAgICAgICAgICAvKiBuZWVkIF93ZV8gZnJlZSB0aGUgbWVtb3J5PyAqLworICAgIENEYXRhT2JqZWN0ICpiX2Jhc2U7ICAgICAgICAvKiBwb2ludGVyIHRvIGJhc2Ugb2JqZWN0IG9yIE5VTEwgKi8KKyAgICBQeV9zc2l6ZV90IGJfc2l6ZTsgICAgICAgICAgLyogc2l6ZSBvZiBtZW1vcnkgYmxvY2sgaW4gYnl0ZXMgKi8KKyAgICBQeV9zc2l6ZV90IGJfbGVuZ3RoOyAgICAgICAgLyogbnVtYmVyIG9mIHJlZmVyZW5jZXMgd2UgbmVlZCAqLworICAgIFB5X3NzaXplX3QgYl9pbmRleDsgICAgICAgICAvKiBpbmRleCBvZiB0aGlzIG9iamVjdCBpbnRvIGJhc2UncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfb2JqZWN0IGxpc3QgKi8KKyAgICBQeU9iamVjdCAqYl9vYmplY3RzOyAgICAgICAgLyogZGljdGlvbmFyeSBvZiByZWZlcmVuY2VzIHdlIG5lZWQgdG8ga2VlcCwgb3IgUHlfTm9uZSAqLworICAgIHVuaW9uIHZhbHVlIGJfdmFsdWU7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfVkFSX0hFQUQKLQlmZmlfY2xvc3VyZSAqcGNsOyAvKiB0aGUgQyBjYWxsYWJsZSAqLwotCWZmaV9jaWYgY2lmOwotCWludCBmbGFnczsKLQlQeU9iamVjdCAqY29udmVydGVyczsKLQlQeU9iamVjdCAqY2FsbGFibGU7Ci0JUHlPYmplY3QgKnJlc3R5cGU7Ci0JU0VURlVOQyBzZXRmdW5jOwotCWZmaV90eXBlICpmZmlfcmVzdHlwZTsKLQlmZmlfdHlwZSAqYXR5cGVzWzFdOworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgZmZpX2Nsb3N1cmUgKnBjbDsgLyogdGhlIEMgY2FsbGFibGUgKi8KKyAgICBmZmlfY2lmIGNpZjsKKyAgICBpbnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKmNvbnZlcnRlcnM7CisgICAgUHlPYmplY3QgKmNhbGxhYmxlOworICAgIFB5T2JqZWN0ICpyZXN0eXBlOworICAgIFNFVEZVTkMgc2V0ZnVuYzsKKyAgICBmZmlfdHlwZSAqZmZpX3Jlc3R5cGU7CisgICAgZmZpX3R5cGUgKmF0eXBlc1sxXTsKIH0gQ1RodW5rT2JqZWN0OwogZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUNUaHVua19UeXBlOwotI2RlZmluZSBDVGh1bmtfQ2hlY2tFeGFjdCh2KQkgICAgKCh2KS0+b2JfdHlwZSA9PSAmUHlDVGh1bmtfVHlwZSkKKyNkZWZpbmUgQ1RodW5rX0NoZWNrRXhhY3QodikgICAgICAgICgodiktPm9iX3R5cGUgPT0gJlB5Q1RodW5rX1R5cGUpCiAKIHR5cGVkZWYgc3RydWN0IHsKLQkvKiBGaXJzdCBwYXJ0IGlkZW50aWNhbCB0byB0YWdDRGF0YU9iamVjdCAqLwotCVB5T2JqZWN0X0hFQUQKLQljaGFyICpiX3B0cjsJCS8qIHBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrICovCi0JaW50ICBiX25lZWRzZnJlZTsJLyogbmVlZCBfd2VfIGZyZWUgdGhlIG1lbW9yeT8gKi8KLQlDRGF0YU9iamVjdCAqYl9iYXNlOwkvKiBwb2ludGVyIHRvIGJhc2Ugb2JqZWN0IG9yIE5VTEwgKi8KLQlQeV9zc2l6ZV90IGJfc2l6ZTsJLyogc2l6ZSBvZiBtZW1vcnkgYmxvY2sgaW4gYnl0ZXMgKi8KLQlQeV9zc2l6ZV90IGJfbGVuZ3RoOwkvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyB3ZSBuZWVkICovCi0JUHlfc3NpemVfdCBiX2luZGV4OwkvKiBpbmRleCBvZiB0aGlzIG9iamVjdCBpbnRvIGJhc2UncwotCQkJCSAgIGJfb2JqZWN0IGxpc3QgKi8KLQlQeU9iamVjdCAqYl9vYmplY3RzOwkvKiBsaXN0IG9mIHJlZmVyZW5jZXMgd2UgbmVlZCB0byBrZWVwICovCi0JdW5pb24gdmFsdWUgYl92YWx1ZTsKLQkvKiBlbmQgb2YgdGFnQ0RhdGFPYmplY3QsIGFkZGl0aW9uYWwgZmllbGRzIGZvbGxvdyAqLworICAgIC8qIEZpcnN0IHBhcnQgaWRlbnRpY2FsIHRvIHRhZ0NEYXRhT2JqZWN0ICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIGNoYXIgKmJfcHRyOyAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIG1lbW9yeSBibG9jayAqLworICAgIGludCAgYl9uZWVkc2ZyZWU7ICAgICAgICAgICAvKiBuZWVkIF93ZV8gZnJlZSB0aGUgbWVtb3J5PyAqLworICAgIENEYXRhT2JqZWN0ICpiX2Jhc2U7ICAgICAgICAvKiBwb2ludGVyIHRvIGJhc2Ugb2JqZWN0IG9yIE5VTEwgKi8KKyAgICBQeV9zc2l6ZV90IGJfc2l6ZTsgICAgICAgICAgLyogc2l6ZSBvZiBtZW1vcnkgYmxvY2sgaW4gYnl0ZXMgKi8KKyAgICBQeV9zc2l6ZV90IGJfbGVuZ3RoOyAgICAgICAgLyogbnVtYmVyIG9mIHJlZmVyZW5jZXMgd2UgbmVlZCAqLworICAgIFB5X3NzaXplX3QgYl9pbmRleDsgICAgICAgICAvKiBpbmRleCBvZiB0aGlzIG9iamVjdCBpbnRvIGJhc2UncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfb2JqZWN0IGxpc3QgKi8KKyAgICBQeU9iamVjdCAqYl9vYmplY3RzOyAgICAgICAgLyogbGlzdCBvZiByZWZlcmVuY2VzIHdlIG5lZWQgdG8ga2VlcCAqLworICAgIHVuaW9uIHZhbHVlIGJfdmFsdWU7CisgICAgLyogZW5kIG9mIHRhZ0NEYXRhT2JqZWN0LCBhZGRpdGlvbmFsIGZpZWxkcyBmb2xsb3cgKi8KIAotCUNUaHVua09iamVjdCAqdGh1bms7Ci0JUHlPYmplY3QgKmNhbGxhYmxlOworICAgIENUaHVua09iamVjdCAqdGh1bms7CisgICAgUHlPYmplY3QgKmNhbGxhYmxlOwogCi0JLyogVGhlc2UgdHdvIGZpZWxkcyB3aWxsIG92ZXJyaWRlIHRoZSBvbmVzIGluIHRoZSB0eXBlJ3Mgc3RnZGljdCBpZgotCSAgIHRoZXkgYXJlIHNldCAqLwotCVB5T2JqZWN0ICpjb252ZXJ0ZXJzOwotCVB5T2JqZWN0ICphcmd0eXBlczsKLQlQeU9iamVjdCAqcmVzdHlwZTsKLQlQeU9iamVjdCAqY2hlY2tlcjsKLQlQeU9iamVjdCAqZXJyY2hlY2s7CisgICAgLyogVGhlc2UgdHdvIGZpZWxkcyB3aWxsIG92ZXJyaWRlIHRoZSBvbmVzIGluIHRoZSB0eXBlJ3Mgc3RnZGljdCBpZgorICAgICAgIHRoZXkgYXJlIHNldCAqLworICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzOworICAgIFB5T2JqZWN0ICphcmd0eXBlczsKKyAgICBQeU9iamVjdCAqcmVzdHlwZTsKKyAgICBQeU9iamVjdCAqY2hlY2tlcjsKKyAgICBQeU9iamVjdCAqZXJyY2hlY2s7CiAjaWZkZWYgTVNfV0lOMzIKLQlpbnQgaW5kZXg7Ci0JR1VJRCAqaWlkOworICAgIGludCBpbmRleDsKKyAgICBHVUlEICppaWQ7CiAjZW5kaWYKLQlQeU9iamVjdCAqcGFyYW1mbGFnczsKKyAgICBQeU9iamVjdCAqcGFyYW1mbGFnczsKIH0gUHlDRnVuY1B0ck9iamVjdDsKIAogZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUNTdGdEaWN0X1R5cGU7Ci0jZGVmaW5lIFB5Q1N0Z0RpY3RfQ2hlY2tFeGFjdCh2KQkgICAgKCh2KS0+b2JfdHlwZSA9PSAmUHlDU3RnRGljdF9UeXBlKQotI2RlZmluZSBQeUNTdGdEaWN0X0NoZWNrKHYpCSAgICBQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlB5Q1N0Z0RpY3RfVHlwZSkKKyNkZWZpbmUgUHlDU3RnRGljdF9DaGVja0V4YWN0KHYpICAgICAgICAgICAgKCh2KS0+b2JfdHlwZSA9PSAmUHlDU3RnRGljdF9UeXBlKQorI2RlZmluZSBQeUNTdGdEaWN0X0NoZWNrKHYpICAgICAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQeUNTdGdEaWN0X1R5cGUpCiAKIGV4dGVybiBpbnQgUHlDU3RydWN0VW5pb25UeXBlX3VwZGF0ZV9zdGdkaWN0KFB5T2JqZWN0ICpmaWVsZHMsIFB5T2JqZWN0ICp0eXBlLCBpbnQgaXNTdHJ1Y3QpOwogZXh0ZXJuIGludCBQeVR5cGVfc3RnaW5mbyhQeVR5cGVPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgKnBzaXplLCBQeV9zc2l6ZV90ICpwYWxpZ24sIFB5X3NzaXplX3QgKnBsZW5ndGgpOwpAQCAtMTUwLDEyICsxNTAsMTIgQEAKIAogCiBleHRlcm4gUHlUeXBlT2JqZWN0IFB5Q0RhdGFfVHlwZTsKLSNkZWZpbmUgQ0RhdGFPYmplY3RfQ2hlY2tFeGFjdCh2KQkoKHYpLT5vYl90eXBlID09ICZQeUNEYXRhX1R5cGUpCi0jZGVmaW5lIENEYXRhT2JqZWN0X0NoZWNrKHYpCQlQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlB5Q0RhdGFfVHlwZSkKKyNkZWZpbmUgQ0RhdGFPYmplY3RfQ2hlY2tFeGFjdCh2KSAgICAgICAoKHYpLT5vYl90eXBlID09ICZQeUNEYXRhX1R5cGUpCisjZGVmaW5lIENEYXRhT2JqZWN0X0NoZWNrKHYpICAgICAgICAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQeUNEYXRhX1R5cGUpCiAKIGV4dGVybiBQeVR5cGVPYmplY3QgUHlDU2ltcGxlVHlwZV9UeXBlOwotI2RlZmluZSBQeUNTaW1wbGVUeXBlT2JqZWN0X0NoZWNrRXhhY3QodikJKCh2KS0+b2JfdHlwZSA9PSAmUHlDU2ltcGxlVHlwZV9UeXBlKQotI2RlZmluZSBQeUNTaW1wbGVUeXBlT2JqZWN0X0NoZWNrKHYpCVB5T2JqZWN0X1R5cGVDaGVjayh2LCAmUHlDU2ltcGxlVHlwZV9UeXBlKQorI2RlZmluZSBQeUNTaW1wbGVUeXBlT2JqZWN0X0NoZWNrRXhhY3QodikgICAgICAgKCh2KS0+b2JfdHlwZSA9PSAmUHlDU2ltcGxlVHlwZV9UeXBlKQorI2RlZmluZSBQeUNTaW1wbGVUeXBlT2JqZWN0X0NoZWNrKHYpICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmUHlDU2ltcGxlVHlwZV9UeXBlKQogCiBleHRlcm4gUHlUeXBlT2JqZWN0IFB5Q0ZpZWxkX1R5cGU7CiBleHRlcm4gc3RydWN0IGZpZWxkZGVzYyAqX2N0eXBlc19nZXRfZmllbGRkZXNjKGNoYXIgKmZtdCk7CkBAIC0xNjMsOSArMTYzLDkgQEAKIAogZXh0ZXJuIFB5T2JqZWN0ICoKIFB5Q0ZpZWxkX0Zyb21EZXNjKFB5T2JqZWN0ICpkZXNjLCBQeV9zc2l6ZV90IGluZGV4LAotCQlQeV9zc2l6ZV90ICpwZmllbGRfc2l6ZSwgaW50IGJpdHNpemUsIGludCAqcGJpdG9mcywKLQkJUHlfc3NpemVfdCAqcHNpemUsIFB5X3NzaXplX3QgKnBvZmZzZXQsIFB5X3NzaXplX3QgKnBhbGlnbiwKLQkJaW50IHBhY2ssIGludCBpc19iaWdfZW5kaWFuKTsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpwZmllbGRfc2l6ZSwgaW50IGJpdHNpemUsIGludCAqcGJpdG9mcywKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpwc2l6ZSwgUHlfc3NpemVfdCAqcG9mZnNldCwgUHlfc3NpemVfdCAqcGFsaWduLAorICAgICAgICAgICAgICAgIGludCBwYWNrLCBpbnQgaXNfYmlnX2VuZGlhbik7CiAKIGV4dGVybiBQeU9iamVjdCAqUHlDRGF0YV9BdEFkZHJlc3MoUHlPYmplY3QgKnR5cGUsIHZvaWQgKmJ1Zik7CiBleHRlcm4gUHlPYmplY3QgKlB5Q0RhdGFfRnJvbUJ5dGVzKFB5T2JqZWN0ICp0eXBlLCBjaGFyICpkYXRhLCBQeV9zc2l6ZV90IGxlbmd0aCk7CkBAIC0xNzgsMTMgKzE3OCwxMyBAQAogZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUNGdW5jUHRyVHlwZV9UeXBlOwogZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUNTdHJ1Y3RUeXBlX1R5cGU7CiAKLSNkZWZpbmUgUHlDQXJyYXlUeXBlT2JqZWN0X0NoZWNrKHYpCVB5T2JqZWN0X1R5cGVDaGVjayh2LCAmUHlDQXJyYXlUeXBlX1R5cGUpCi0jZGVmaW5lIEFycmF5T2JqZWN0X0NoZWNrKHYpCQlQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlB5Q0FycmF5X1R5cGUpCi0jZGVmaW5lIFBvaW50ZXJPYmplY3RfQ2hlY2sodikJCVB5T2JqZWN0X1R5cGVDaGVjayh2LCAmUHlDUG9pbnRlcl9UeXBlKQotI2RlZmluZSBQeUNQb2ludGVyVHlwZU9iamVjdF9DaGVjayh2KQlQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlB5Q1BvaW50ZXJUeXBlX1R5cGUpCi0jZGVmaW5lIFB5Q0Z1bmNQdHJPYmplY3RfQ2hlY2sodikJCVB5T2JqZWN0X1R5cGVDaGVjayh2LCAmUHlDRnVuY1B0cl9UeXBlKQotI2RlZmluZSBQeUNGdW5jUHRyVHlwZU9iamVjdF9DaGVjayh2KQlQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlB5Q0Z1bmNQdHJUeXBlX1R5cGUpCi0jZGVmaW5lIFB5Q1N0cnVjdFR5cGVPYmplY3RfQ2hlY2sodikJUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQeUNTdHJ1Y3RUeXBlX1R5cGUpCisjZGVmaW5lIFB5Q0FycmF5VHlwZU9iamVjdF9DaGVjayh2KSAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQeUNBcnJheVR5cGVfVHlwZSkKKyNkZWZpbmUgQXJyYXlPYmplY3RfQ2hlY2sodikgICAgICAgICAgICBQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlB5Q0FycmF5X1R5cGUpCisjZGVmaW5lIFBvaW50ZXJPYmplY3RfQ2hlY2sodikgICAgICAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQeUNQb2ludGVyX1R5cGUpCisjZGVmaW5lIFB5Q1BvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKHYpICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQeUNQb2ludGVyVHlwZV9UeXBlKQorI2RlZmluZSBQeUNGdW5jUHRyT2JqZWN0X0NoZWNrKHYpICAgICAgICAgICAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQeUNGdW5jUHRyX1R5cGUpCisjZGVmaW5lIFB5Q0Z1bmNQdHJUeXBlT2JqZWN0X0NoZWNrKHYpICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQeUNGdW5jUHRyVHlwZV9UeXBlKQorI2RlZmluZSBQeUNTdHJ1Y3RUeXBlT2JqZWN0X0NoZWNrKHYpICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmUHlDU3RydWN0VHlwZV9UeXBlKQogCiBleHRlcm4gUHlPYmplY3QgKgogUHlDQXJyYXlUeXBlX2Zyb21fY3R5cGUoUHlPYmplY3QgKml0ZW10eXBlLCBQeV9zc2l6ZV90IGxlbmd0aCk7CkBAIC0xOTIsMzUgKzE5MiwzNSBAQAogZXh0ZXJuIFB5TWV0aG9kRGVmIF9jdHlwZXNfbW9kdWxlX21ldGhvZHNbXTsKIAogZXh0ZXJuIENUaHVua09iamVjdCAqX2N0eXBlc19hbGxvY19jYWxsYmFjayhQeU9iamVjdCAqY2FsbGFibGUsCi0JCQkJCSAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzLAotCQkJCQkgICBQeU9iamVjdCAqcmVzdHlwZSwKLQkJCQkJICAgaW50IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29udmVydGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVzdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOwogLyogYSB0YWJsZSBlbnRyeSBkZXNjcmliaW5nIGEgcHJlZGVmaW5lZCBjdHlwZXMgdHlwZSAqLwogc3RydWN0IGZpZWxkZGVzYyB7Ci0JY2hhciBjb2RlOwotCVNFVEZVTkMgc2V0ZnVuYzsKLQlHRVRGVU5DIGdldGZ1bmM7Ci0JZmZpX3R5cGUgKnBmZmlfdHlwZTsgLyogYWx3YXlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCi0JU0VURlVOQyBzZXRmdW5jX3N3YXBwZWQ7Ci0JR0VURlVOQyBnZXRmdW5jX3N3YXBwZWQ7CisgICAgY2hhciBjb2RlOworICAgIFNFVEZVTkMgc2V0ZnVuYzsKKyAgICBHRVRGVU5DIGdldGZ1bmM7CisgICAgZmZpX3R5cGUgKnBmZmlfdHlwZTsgLyogYWx3YXlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCisgICAgU0VURlVOQyBzZXRmdW5jX3N3YXBwZWQ7CisgICAgR0VURlVOQyBnZXRmdW5jX3N3YXBwZWQ7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3Qgb2Zmc2V0OwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeV9zc2l6ZV90IGluZGV4OwkJLyogSW5kZXggaW50byBDRGF0YU9iamVjdCdzCi0JCQkJCSAgIG9iamVjdCBhcnJheSAqLwotCVB5T2JqZWN0ICpwcm90bzsJCS8qIGEgdHlwZSBvciBOVUxMICovCi0JR0VURlVOQyBnZXRmdW5jOwkJLyogZ2V0dGVyIGZ1bmN0aW9uIGlmIHByb3RvIGlzIE5VTEwgKi8KLQlTRVRGVU5DIHNldGZ1bmM7CQkvKiBzZXR0ZXIgZnVuY3Rpb24gaWYgcHJvdG8gaXMgTlVMTCAqLwotCWludCBhbm9ueW1vdXM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3Qgb2Zmc2V0OworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGluZGV4OyAgICAgICAgICAgICAgICAgICAvKiBJbmRleCBpbnRvIENEYXRhT2JqZWN0J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBhcnJheSAqLworICAgIFB5T2JqZWN0ICpwcm90bzsgICAgICAgICAgICAgICAgICAgIC8qIGEgdHlwZSBvciBOVUxMICovCisgICAgR0VURlVOQyBnZXRmdW5jOyAgICAgICAgICAgICAgICAgICAgLyogZ2V0dGVyIGZ1bmN0aW9uIGlmIHByb3RvIGlzIE5VTEwgKi8KKyAgICBTRVRGVU5DIHNldGZ1bmM7ICAgICAgICAgICAgICAgICAgICAvKiBzZXR0ZXIgZnVuY3Rpb24gaWYgcHJvdG8gaXMgTlVMTCAqLworICAgIGludCBhbm9ueW1vdXM7CiB9IENGaWVsZE9iamVjdDsKIAogLyogQSBzdWJjbGFzcyBvZiBQeURpY3RPYmplY3QsIHVzZWQgYXMgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnkgb2YgY3R5cGVzCiAgICBtZXRhdHlwZXMgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQlQeURpY3RPYmplY3QgZGljdDsJLyogZmlyc3QgcGFydCBpZGVudGljYWwgdG8gUHlEaWN0T2JqZWN0ICovCisgICAgUHlEaWN0T2JqZWN0IGRpY3Q7ICAgICAgICAgIC8qIGZpcnN0IHBhcnQgaWRlbnRpY2FsIHRvIFB5RGljdE9iamVjdCAqLwogLyogVGhlIHNpemUgYW5kIGFsaWduIGZpZWxkcyBhcmUgdW5uZWVkZWQsIHRoZXkgYXJlIGluIGZmaV90eXBlIGFzIHdlbGwuICBBcwogICAgYW4gZXhwZXJpbWVudCBzaG93cywgaXQncyB0cml2aWFsIHRvIGdldCByaWQgb2YgdGhlbSwgdGhlIG9ubHkgdGhpbmcgdG8KICAgIHJlbWVtYmVyIGlzIHRoYXQgaW4gUHlDQXJyYXlUeXBlX25ldyB0aGUgZmZpX3R5cGUgZmllbGRzIG11c3QgYmUgZmlsbGVkIGluIC0KQEAgLTIyOSwyOCArMjI5LDI4IEBACiAgICB0b28gbXVjaCByaXNrIHRvIGNoYW5nZSB0aGF0IG5vdywgYW5kIHRoZXJlIGFyZSBvdGhlciBmaWVsZHMgd2hpY2ggZG9lbid0CiAgICBiZWxvbmcgaW50byB0aGlzIHN0cnVjdHVyZSBhbnl3YXkuICBNYXliZSBpbiBjdHlwZXMgMi4wLi4uIChjdHlwZXMgMjAwMD8pCiAqLwotCVB5X3NzaXplX3Qgc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzICovCi0JUHlfc3NpemVfdCBhbGlnbjsJLyogYWxpZ25tZW50IHJlcXVpcmVtZW50cyAqLwotCVB5X3NzaXplX3QgbGVuZ3RoOwkvKiBudW1iZXIgb2YgZmllbGRzICovCi0JZmZpX3R5cGUgZmZpX3R5cGVfcG9pbnRlcjsKLQlQeU9iamVjdCAqcHJvdG87CS8qIE9ubHkgZm9yIFBvaW50ZXIvQXJyYXlPYmplY3QgKi8KLQlTRVRGVU5DIHNldGZ1bmM7CS8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCi0JR0VURlVOQyBnZXRmdW5jOwkvKiBPbmx5IGZvciBzaW1wbGUgb2JqZWN0cyAqLwotCVBBUkFNRlVOQyBwYXJhbWZ1bmM7CisgICAgUHlfc3NpemVfdCBzaXplOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyAqLworICAgIFB5X3NzaXplX3QgYWxpZ247ICAgICAgICAgICAvKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICovCisgICAgUHlfc3NpemVfdCBsZW5ndGg7ICAgICAgICAgIC8qIG51bWJlciBvZiBmaWVsZHMgKi8KKyAgICBmZmlfdHlwZSBmZmlfdHlwZV9wb2ludGVyOworICAgIFB5T2JqZWN0ICpwcm90bzsgICAgICAgICAgICAvKiBPbmx5IGZvciBQb2ludGVyL0FycmF5T2JqZWN0ICovCisgICAgU0VURlVOQyBzZXRmdW5jOyAgICAgICAgICAgIC8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCisgICAgR0VURlVOQyBnZXRmdW5jOyAgICAgICAgICAgIC8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCisgICAgUEFSQU1GVU5DIHBhcmFtZnVuYzsKIAotCS8qIEZvbGxvd2luZyBmaWVsZHMgb25seSB1c2VkIGJ5IFB5Q0Z1bmNQdHJUeXBlX1R5cGUgaW5zdGFuY2VzICovCi0JUHlPYmplY3QgKmFyZ3R5cGVzOwkvKiB0dXBsZSBvZiBDRGF0YU9iamVjdHMgKi8KLQlQeU9iamVjdCAqY29udmVydGVyczsJLyogdHVwbGUoW3QuZnJvbV9wYXJhbSBmb3IgdCBpbiBhcmd0eXBlc10pICovCi0JUHlPYmplY3QgKnJlc3R5cGU7CS8qIENEYXRhT2JqZWN0IG9yIE5VTEwgKi8KLQlQeU9iamVjdCAqY2hlY2tlcjsKLQlpbnQgZmxhZ3M7CQkvKiBjYWxsaW5nIGNvbnZlbnRpb24gYW5kIHN1Y2ggKi8KKyAgICAvKiBGb2xsb3dpbmcgZmllbGRzIG9ubHkgdXNlZCBieSBQeUNGdW5jUHRyVHlwZV9UeXBlIGluc3RhbmNlcyAqLworICAgIFB5T2JqZWN0ICphcmd0eXBlczsgICAgICAgICAvKiB0dXBsZSBvZiBDRGF0YU9iamVjdHMgKi8KKyAgICBQeU9iamVjdCAqY29udmVydGVyczsgICAgICAgLyogdHVwbGUoW3QuZnJvbV9wYXJhbSBmb3IgdCBpbiBhcmd0eXBlc10pICovCisgICAgUHlPYmplY3QgKnJlc3R5cGU7ICAgICAgICAgIC8qIENEYXRhT2JqZWN0IG9yIE5VTEwgKi8KKyAgICBQeU9iamVjdCAqY2hlY2tlcjsKKyAgICBpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyogY2FsbGluZyBjb252ZW50aW9uIGFuZCBzdWNoICovCiAKLQkvKiBwZXAzMTE4IGZpZWxkcywgcG9pbnRlcnMgbmVlZWQgUHlNZW1fRnJlZSAqLwotCWNoYXIgKmZvcm1hdDsKLQlpbnQgbmRpbTsKLQlQeV9zc2l6ZV90ICpzaGFwZTsKLS8qCVB5X3NzaXplX3QgKnN0cmlkZXM7CSovIC8qIHVudXNlZCBpbiBjdHlwZXMgKi8KLS8qCVB5X3NzaXplX3QgKnN1Ym9mZnNldHM7CSovIC8qIHVudXNlZCBpbiBjdHlwZXMgKi8KKyAgICAvKiBwZXAzMTE4IGZpZWxkcywgcG9pbnRlcnMgbmVlZWQgUHlNZW1fRnJlZSAqLworICAgIGNoYXIgKmZvcm1hdDsKKyAgICBpbnQgbmRpbTsKKyAgICBQeV9zc2l6ZV90ICpzaGFwZTsKKy8qICAgICAgUHlfc3NpemVfdCAqc3RyaWRlczsgICAgKi8gLyogdW51c2VkIGluIGN0eXBlcyAqLworLyogICAgICBQeV9zc2l6ZV90ICpzdWJvZmZzZXRzOyAqLyAvKiB1bnVzZWQgaW4gY3R5cGVzICovCiAKIH0gU3RnRGljdE9iamVjdDsKIApAQCAtMzA1LDE2ICszMDUsMTYgQEAKIHR5cGVkZWYgaW50KCogUFBST0MpKHZvaWQpOwogCiBQeU9iamVjdCAqX2N0eXBlc19jYWxscHJvYyhQUFJPQyBwUHJvYywKLQkJICAgIFB5T2JqZWN0ICphcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmd1bWVudHMsCiAjaWZkZWYgTVNfV0lOMzIKLQkJICAgIElVbmtub3duICpwSVVuaywKLQkJICAgIEdVSUQgKmlpZCwKKyAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKnBJVW5rLAorICAgICAgICAgICAgICAgICAgICBHVUlEICppaWQsCiAjZW5kaWYKLQkJICAgIGludCBmbGFncywKLQkJICAgIFB5T2JqZWN0ICphcmd0eXBlcywKLQkJICAgIFB5T2JqZWN0ICpyZXN0eXBlLAotCQkgICAgUHlPYmplY3QgKmNoZWNrZXIpOwotIAorICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmd0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjaGVja2VyKTsKKwogCiAjZGVmaW5lIEZVTkNGTEFHX1NURENBTEwgMHgwCiAjZGVmaW5lIEZVTkNGTEFHX0NERUNMICAgMHgxCkBAIC0zMjksNDUgKzMyOSw0NSBAQAogI2RlZmluZSBESUNURkxBR19GSU5BTCAweDEwMDAKIAogc3RydWN0IHRhZ1B5Q0FyZ09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWZmaV90eXBlICpwZmZpX3R5cGU7Ci0JY2hhciB0YWc7Ci0JdW5pb24gewotCQljaGFyIGM7Ci0JCWNoYXIgYjsKLQkJc2hvcnQgaDsKLQkJaW50IGk7Ci0JCWxvbmcgbDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgZmZpX3R5cGUgKnBmZmlfdHlwZTsKKyAgICBjaGFyIHRhZzsKKyAgICB1bmlvbiB7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgY2hhciBiOworICAgICAgICBzaG9ydCBoOworICAgICAgICBpbnQgaTsKKyAgICAgICAgbG9uZyBsOwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCVBZX0xPTkdfTE9ORyBxOworICAgICAgICBQWV9MT05HX0xPTkcgcTsKICNlbmRpZgotCQlsb25nIGRvdWJsZSBEOwotCQlkb3VibGUgZDsKLQkJZmxvYXQgZjsKLQkJdm9pZCAqcDsKLQl9IHZhbHVlOwotCVB5T2JqZWN0ICpvYmo7Ci0JUHlfc3NpemVfdCBzaXplOyAvKiBmb3IgdGhlICdWJyB0YWcgKi8KKyAgICAgICAgbG9uZyBkb3VibGUgRDsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICAgIGZsb2F0IGY7CisgICAgICAgIHZvaWQgKnA7CisgICAgfSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIFB5X3NzaXplX3Qgc2l6ZTsgLyogZm9yIHRoZSAnVicgdGFnICovCiB9OwogCiBleHRlcm4gUHlUeXBlT2JqZWN0IFB5Q0FyZ19UeXBlOwotI2RlZmluZSBQeUNBcmdfQ2hlY2tFeGFjdCh2KQkgICAgKCh2KS0+b2JfdHlwZSA9PSAmUHlDQXJnX1R5cGUpCisjZGVmaW5lIFB5Q0FyZ19DaGVja0V4YWN0KHYpICAgICAgICAoKHYpLT5vYl90eXBlID09ICZQeUNBcmdfVHlwZSkKIGV4dGVybiBQeUNBcmdPYmplY3QgKlB5Q0FyZ09iamVjdF9uZXcodm9pZCk7CiAKIGV4dGVybiBQeU9iamVjdCAqCiBQeUNEYXRhX2dldChQeU9iamVjdCAqdHlwZSwgR0VURlVOQyBnZXRmdW5jLCBQeU9iamVjdCAqc3JjLAotCSAgUHlfc3NpemVfdCBpbmRleCwgUHlfc3NpemVfdCBzaXplLCBjaGFyICpwdHIpOworICAgICAgICAgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgc2l6ZSwgY2hhciAqcHRyKTsKIAogZXh0ZXJuIGludAogUHlDRGF0YV9zZXQoUHlPYmplY3QgKmRzdCwgUHlPYmplY3QgKnR5cGUsIFNFVEZVTkMgc2V0ZnVuYywgUHlPYmplY3QgKnZhbHVlLAotCSAgUHlfc3NpemVfdCBpbmRleCwgUHlfc3NpemVfdCBzaXplLCBjaGFyICpwdHIpOworICAgICAgICAgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgc2l6ZSwgY2hhciAqcHRyKTsKIAogZXh0ZXJuIHZvaWQgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlPYmplY3QgKmV4Y19jbGFzcywgY2hhciAqZm10LCAuLi4pOwogCiBzdHJ1Y3QgYmFzZXNwZWMgewotCUNEYXRhT2JqZWN0ICpiYXNlOwotCVB5X3NzaXplX3QgaW5kZXg7Ci0JY2hhciAqYWRyOworICAgIENEYXRhT2JqZWN0ICpiYXNlOworICAgIFB5X3NzaXplX3QgaW5kZXg7CisgICAgY2hhciAqYWRyOwogfTsKIAogZXh0ZXJuIGNoYXIgYmFzZXNwZWNfc3RyaW5nW107CkBAIC0zODMsMTQgKzM4MywxNCBAQAogLyogUHl0aG9uIDIuNCBtYWNyb3MsIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIGluIFB5dGhvbiAyLjMgKi8KIAogI2lmbmRlZiBQeV9DTEVBUgotI2RlZmluZSBQeV9DTEVBUihvcCkJCQkJXAotICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0gICAgICAgICAgICAgICAgaWYgKG9wKSB7CQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnRtcCA9IChQeU9iamVjdCAqKShvcCk7CVwKLSAgICAgICAgICAgICAgICAgICAgICAgIChvcCkgPSBOVUxMOwkJXAotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CQlcCi0gICAgICAgICAgICAgICAgfQkJCQlcCi0gICAgICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIFB5X0NMRUFSKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChvcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeU9iamVjdCAqdG1wID0gKFB5T2JqZWN0ICopKG9wKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKG9wKSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAjZW5kaWYKIAogI2lmbmRlZiBQeV9WSVNJVApAQCAtMzk5LDE0ICszOTksMTQgQEAKICAqICJ2aXNpdCIgYW5kICJhcmciLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBrZWVwIHRwX3RyYXZlcnNlIGZ1bmN0aW9ucwogICogbG9va2luZyBhcyBtdWNoIGFsaWtlIGFzIHBvc3NpYmxlLgogICovCi0jZGVmaW5lIFB5X1ZJU0lUKG9wKQkJCQkJXAotICAgICAgICBkbyB7IAkJCQkJCVwKLSAgICAgICAgICAgICAgICBpZiAob3ApIHsJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZyZXQgPSB2aXNpdCgob3ApLCBhcmcpOwlcCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodnJldCkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2cmV0OwkJXAotICAgICAgICAgICAgICAgIH0JCQkJCVwKLSAgICAgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUHlfVklTSVQob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChvcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCB2cmV0ID0gdmlzaXQoKG9wKSwgYXJnKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHZyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmV0dXJuIHZyZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAjZW5kaWYKIAogLyogUHl0aG9uJ3MgUHlVbmljb2RlXypXaWRlQ2hhciBmdW5jdGlvbnMgYXJlIGJyb2tlbiAuLi4gKi8KQEAgLTQ1MywxNCArNDUzLDE0IEBACiAjZGVmaW5lIENUWVBFU19DQVBTVUxFX0lOU1RBTlRJQVRFX0RFU1RSVUNUT1IobmFtZSkgXAogc3RhdGljIHZvaWQgY2Fwc3VsZV9kZXN0cnVjdG9yXyAjIyBuYW1lKFB5T2JqZWN0ICpwdHIpIFwKIHsgXAotCXZvaWQgKnAgPSBQeUNhcHN1bGVfR2V0UG9pbnRlcihwdHIsIG5hbWUpOyBcCi0JaWYgKHApIHsgXAotCQlQeU1lbV9GcmVlKHApOyBcCi0JfSBcCisgICAgdm9pZCAqcCA9IFB5Q2Fwc3VsZV9HZXRQb2ludGVyKHB0ciwgbmFtZSk7IFwKKyAgICBpZiAocCkgeyBcCisgICAgICAgIFB5TWVtX0ZyZWUocCk7IFwKKyAgICB9IFwKIH0gXAogCiAjZGVmaW5lIENBUFNVTEVfTkVXKHBvaW50ZXIsIG5hbWUpIFwKLQkoUHlDYXBzdWxlX05ldyhwb2ludGVyLCBuYW1lLCBjYXBzdWxlX2Rlc3RydWN0b3JfICMjIG5hbWUpKQorICAgIChQeUNhcHN1bGVfTmV3KHBvaW50ZXIsIG5hbWUsIGNhcHN1bGVfZGVzdHJ1Y3Rvcl8gIyMgbmFtZSkpCiAKICNkZWZpbmUgQ0FQU1VMRV9ERVJFRkVSRU5DRShjYXBzdWxlLCBuYW1lKSBcCiAgIChQeUNhcHN1bGVfR2V0UG9pbnRlcihjYXBzdWxlLCBuYW1lKSkKQEAgLTQ3MSw3ICs0NzEsNyBAQAogI2RlZmluZSBDVFlQRVNfQ0FQU1VMRV9JTlNUQU5USUFURV9ERVNUUlVDVE9SKG5hbWUpCiAKICNkZWZpbmUgQ0FQU1VMRV9ORVcocG9pbnRlciwgbmFtZSkgXAotCShQeUNPYmplY3RfRnJvbVZvaWRQdHIocG9pbnRlciwgUHlNZW1fRnJlZSkpCisgICAgKFB5Q09iamVjdF9Gcm9tVm9pZFB0cihwb2ludGVyLCBQeU1lbV9GcmVlKSkKIAogI2RlZmluZSBDQVBTVUxFX0RFUkVGRVJFTkNFKGNhcHN1bGUsIG5hbWUpIFwKICAgKFB5Q09iamVjdF9Bc1ZvaWRQdHIoY2Fwc3VsZSkpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvZGFyd2luL2RsZmNuX3NpbXBsZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2Rhcndpbi9kbGZjbl9zaW1wbGUuYwppbmRleCA0YjU1MzIzLi4yYjI5M2JiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvZGFyd2luL2RsZmNuX3NpbXBsZS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9kYXJ3aW4vZGxmY25fc2ltcGxlLmMKQEAgLTgxLDE2NyArODEsMTY3IEBACiAvKiBTZXQgYW5kIGdldCB0aGUgZXJyb3Igc3RyaW5nIGZvciB1c2UgYnkgZGxlcnJvciAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmVycm9yKGludCBzZXRnZXQsIGNvbnN0IGNoYXIgKnN0ciwgLi4uKQogewotCXN0YXRpYyBjaGFyIGVycnN0cltFUlJfU1RSX0xFTl07Ci0Jc3RhdGljIGludCBlcnJfZmlsbGVkID0gMDsKLQljb25zdCBjaGFyICpyZXR2YWw7Ci0JdmFfbGlzdCBhcmc7Ci0JaWYgKHNldGdldCA9PSAwKQotCXsKLQkJdmFfc3RhcnQoYXJnLCBzdHIpOwotCQlzdHJuY3B5KGVycnN0ciwgImRsY29tcGF0OiAiLCBFUlJfU1RSX0xFTik7Ci0JCXZzbnByaW50ZihlcnJzdHIgKyAxMCwgRVJSX1NUUl9MRU4gLSAxMCwgc3RyLCBhcmcpOwotCQl2YV9lbmQoYXJnKTsKLQkJZXJyX2ZpbGxlZCA9IDE7Ci0JCXJldHZhbCA9IE5VTEw7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICghZXJyX2ZpbGxlZCkKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCWVsc2UKLQkJCXJldHZhbCA9IGVycnN0cjsKLQkJZXJyX2ZpbGxlZCA9IDA7Ci0JfQotCXJldHVybiByZXR2YWw7CisgICAgc3RhdGljIGNoYXIgZXJyc3RyW0VSUl9TVFJfTEVOXTsKKyAgICBzdGF0aWMgaW50IGVycl9maWxsZWQgPSAwOworICAgIGNvbnN0IGNoYXIgKnJldHZhbDsKKyAgICB2YV9saXN0IGFyZzsKKyAgICBpZiAoc2V0Z2V0ID09IDApCisgICAgeworICAgICAgICB2YV9zdGFydChhcmcsIHN0cik7CisgICAgICAgIHN0cm5jcHkoZXJyc3RyLCAiZGxjb21wYXQ6ICIsIEVSUl9TVFJfTEVOKTsKKyAgICAgICAgdnNucHJpbnRmKGVycnN0ciArIDEwLCBFUlJfU1RSX0xFTiAtIDEwLCBzdHIsIGFyZyk7CisgICAgICAgIHZhX2VuZChhcmcpOworICAgICAgICBlcnJfZmlsbGVkID0gMTsKKyAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCFlcnJfZmlsbGVkKQorICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dmFsID0gZXJyc3RyOworICAgICAgICBlcnJfZmlsbGVkID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogLyogZGFyd2luX2Rsb3BlbiAqLwogc3RhdGljIHZvaWQgKmRhcndpbl9kbG9wZW4oY29uc3QgY2hhciAqcGF0aCwgaW50IG1vZGUpCiB7Ci0Jdm9pZCAqbW9kdWxlID0gMDsKLQlOU09iamVjdEZpbGVJbWFnZSBvZmkgPSAwOwotCU5TT2JqZWN0RmlsZUltYWdlUmV0dXJuQ29kZSBvZmlyYzsKKyAgICB2b2lkICptb2R1bGUgPSAwOworICAgIE5TT2JqZWN0RmlsZUltYWdlIG9maSA9IDA7CisgICAgTlNPYmplY3RGaWxlSW1hZ2VSZXR1cm5Db2RlIG9maXJjOwogCi0JLyogSWYgd2UgZ290IG5vIHBhdGgsIHRoZSBhcHAgd2FudHMgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIHVzZSAtMSBhcyB0aGUgbWFya2VyCi0JICAgaW4gdGhpcyBjYXNlICovCi0JaWYgKCFwYXRoKQotCQlyZXR1cm4gKHZvaWQgKiktMTsKKyAgICAvKiBJZiB3ZSBnb3Qgbm8gcGF0aCwgdGhlIGFwcCB3YW50cyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgdXNlIC0xIGFzIHRoZSBtYXJrZXIKKyAgICAgICBpbiB0aGlzIGNhc2UgKi8KKyAgICBpZiAoIXBhdGgpCisgICAgICAgIHJldHVybiAodm9pZCAqKS0xOwogCi0JLyogQ3JlYXRlIHRoZSBvYmplY3QgZmlsZSBpbWFnZSwgd29ya3MgZm9yIHRoaW5ncyBsaW5rZWQgd2l0aCB0aGUgLWJ1bmRsZSBhcmcgdG8gbGQgKi8KLQlvZmlyYyA9IE5TQ3JlYXRlT2JqZWN0RmlsZUltYWdlRnJvbUZpbGUocGF0aCwgJm9maSk7Ci0Jc3dpdGNoIChvZmlyYykKLQl7Ci0JCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VTdWNjZXNzOgotCQkJLyogSXQgd2FzIG9rYXksIHNvIHVzZSBOU0xpbmtNb2R1bGUgdG8gbGluayBpbiB0aGUgaW1hZ2UgKi8KLQkJCW1vZHVsZSA9IE5TTGlua01vZHVsZShvZmksIHBhdGgsCi0JCQkJCQkJCSAgTlNMSU5LTU9EVUxFX09QVElPTl9SRVRVUk5fT05fRVJST1IKLQkJCQkJCQkJICB8IChtb2RlICYgUlRMRF9HTE9CQUwpID8gMCA6IE5TTElOS01PRFVMRV9PUFRJT05fUFJJVkFURQotCQkJCQkJCQkgIHwgKG1vZGUgJiBSVExEX0xBWlkpID8gMCA6IE5TTElOS01PRFVMRV9PUFRJT05fQklORE5PVyk7Ci0JCQlOU0Rlc3Ryb3lPYmplY3RGaWxlSW1hZ2Uob2ZpKTsKLQkJCWJyZWFrOwotCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlSW5hcHByb3ByaWF0ZUZpbGU6Ci0JCQkvKiBJdCBtYXkgaGF2ZSBiZWVuIGEgZHluYW1pYyBsaWJyYXJ5IHJhdGhlciB0aGFuIGEgYnVuZGxlLCB0cnkgdG8gbG9hZCBpdCAqLwotCQkJbW9kdWxlID0gKHZvaWQgKilOU0FkZEltYWdlKHBhdGgsIE5TQURESU1BR0VfT1BUSU9OX1JFVFVSTl9PTl9FUlJPUik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIEdvZCBrbm93cyB3aGF0IHdlIGdvdCAqLwotCQkJZXJyb3IoMCwgIkNhbiBub3Qgb3BlbiBcIiVzXCIiLCBwYXRoKTsKLQkJCXJldHVybiAwOwotCX0KLQlpZiAoIW1vZHVsZSkKLQkJZXJyb3IoMCwgIkNhbiBub3Qgb3BlbiBcIiVzXCIiLCBwYXRoKTsKLQlyZXR1cm4gbW9kdWxlOworICAgIC8qIENyZWF0ZSB0aGUgb2JqZWN0IGZpbGUgaW1hZ2UsIHdvcmtzIGZvciB0aGluZ3MgbGlua2VkIHdpdGggdGhlIC1idW5kbGUgYXJnIHRvIGxkICovCisgICAgb2ZpcmMgPSBOU0NyZWF0ZU9iamVjdEZpbGVJbWFnZUZyb21GaWxlKHBhdGgsICZvZmkpOworICAgIHN3aXRjaCAob2ZpcmMpCisgICAgeworICAgICAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlU3VjY2VzczoKKyAgICAgICAgICAgIC8qIEl0IHdhcyBva2F5LCBzbyB1c2UgTlNMaW5rTW9kdWxlIHRvIGxpbmsgaW4gdGhlIGltYWdlICovCisgICAgICAgICAgICBtb2R1bGUgPSBOU0xpbmtNb2R1bGUob2ZpLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNMSU5LTU9EVUxFX09QVElPTl9SRVRVUk5fT05fRVJST1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG1vZGUgJiBSVExEX0dMT0JBTCkgPyAwIDogTlNMSU5LTU9EVUxFX09QVElPTl9QUklWQVRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChtb2RlICYgUlRMRF9MQVpZKSA/IDAgOiBOU0xJTktNT0RVTEVfT1BUSU9OX0JJTkROT1cpOworICAgICAgICAgICAgTlNEZXN0cm95T2JqZWN0RmlsZUltYWdlKG9maSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOU09iamVjdEZpbGVJbWFnZUluYXBwcm9wcmlhdGVGaWxlOgorICAgICAgICAgICAgLyogSXQgbWF5IGhhdmUgYmVlbiBhIGR5bmFtaWMgbGlicmFyeSByYXRoZXIgdGhhbiBhIGJ1bmRsZSwgdHJ5IHRvIGxvYWQgaXQgKi8KKyAgICAgICAgICAgIG1vZHVsZSA9ICh2b2lkICopTlNBZGRJbWFnZShwYXRoLCBOU0FERElNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBHb2Qga25vd3Mgd2hhdCB3ZSBnb3QgKi8KKyAgICAgICAgICAgIGVycm9yKDAsICJDYW4gbm90IG9wZW4gXCIlc1wiIiwgcGF0aCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFtb2R1bGUpCisgICAgICAgIGVycm9yKDAsICJDYW4gbm90IG9wZW4gXCIlc1wiIiwgcGF0aCk7CisgICAgcmV0dXJuIG1vZHVsZTsKIAogfQogCiAvKiBkbHN5bUludGVybiBpcyB1c2VkIGJ5IGRsc3ltIHRvIGZpbmQgdGhlIHN5bWJvbCAqLwogc3RhdGljIHZvaWQgKmRsc3ltSW50ZXJuKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKQogewotCU5TU3ltYm9sIG5zc3ltID0gMDsKLQkvKiBJZiB0aGUgaGFuZGxlIGlzIC0xLCBpZiBpcyB0aGUgYXBwIGdsb2JhbCBjb250ZXh0ICovCi0JaWYgKGhhbmRsZSA9PSAodm9pZCAqKS0xKQotCXsKLQkJLyogR2xvYmFsIGNvbnRleHQsIHVzZSBOU0xvb2t1cEFuZEJpbmRTeW1ib2wgKi8KLQkJaWYgKE5TSXNTeW1ib2xOYW1lRGVmaW5lZChzeW1ib2wpKQotCQl7Ci0JCQluc3N5bSA9IE5TTG9va3VwQW5kQmluZFN5bWJvbChzeW1ib2wpOwotCQl9CisgICAgTlNTeW1ib2wgbnNzeW0gPSAwOworICAgIC8qIElmIHRoZSBoYW5kbGUgaXMgLTEsIGlmIGlzIHRoZSBhcHAgZ2xvYmFsIGNvbnRleHQgKi8KKyAgICBpZiAoaGFuZGxlID09ICh2b2lkICopLTEpCisgICAgeworICAgICAgICAvKiBHbG9iYWwgY29udGV4dCwgdXNlIE5TTG9va3VwQW5kQmluZFN5bWJvbCAqLworICAgICAgICBpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkKHN5bWJvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5zc3ltID0gTlNMb29rdXBBbmRCaW5kU3ltYm9sKHN5bWJvbCk7CisgICAgICAgIH0KIAotCX0KLQkvKiBOb3cgc2VlIGlmIHRoZSBoYW5kbGUgaXMgYSBzdHJ1Y2ggbWFjaF9oZWFkZXIqIG9yIG5vdCwgdXNlIE5TTG9va3VwU3ltYm9sIGluIGltYWdlCi0JICAgZm9yIGxpYnJhcmllcywgYW5kIE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUgZm9yIGJ1bmRsZXMgKi8KLQllbHNlCi0JewotCQkvKiBDaGVjayBmb3IgYm90aCBwb3NzaWJsZSBtYWdpYyBudW1iZXJzIGRlcGVuZGluZyBvbiB4ODYvcHBjIGJ5dGUgb3JkZXIgKi8KLQkJaWYgKCgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX01BR0lDKSB8fAotCQkJKCgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlKS0+bWFnaWMgPT0gTUhfQ0lHQU0pKQotCQl7Ci0JCQlpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZSgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlLCBzeW1ib2wpKQotCQkJewotCQkJCW5zc3ltID0gTlNMb29rdXBTeW1ib2xJbkltYWdlKChzdHJ1Y3QgbWFjaF9oZWFkZXIgKiloYW5kbGUsCi0JCQkJCQkJCQkJCSAgc3ltYm9sLAotCQkJCQkJCQkJCQkgIE5TTE9PS1VQU1lNQk9MSU5JTUFHRV9PUFRJT05fQklORAotCQkJCQkJCQkJCQkgIHwgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IpOwotCQkJfQorICAgIH0KKyAgICAvKiBOb3cgc2VlIGlmIHRoZSBoYW5kbGUgaXMgYSBzdHJ1Y2ggbWFjaF9oZWFkZXIqIG9yIG5vdCwgdXNlIE5TTG9va3VwU3ltYm9sIGluIGltYWdlCisgICAgICAgZm9yIGxpYnJhcmllcywgYW5kIE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUgZm9yIGJ1bmRsZXMgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBDaGVjayBmb3IgYm90aCBwb3NzaWJsZSBtYWdpYyBudW1iZXJzIGRlcGVuZGluZyBvbiB4ODYvcHBjIGJ5dGUgb3JkZXIgKi8KKyAgICAgICAgaWYgKCgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX01BR0lDKSB8fAorICAgICAgICAgICAgKCgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlKS0+bWFnaWMgPT0gTUhfQ0lHQU0pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZSgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlLCBzeW1ib2wpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5zc3ltID0gTlNMb29rdXBTeW1ib2xJbkltYWdlKChzdHJ1Y3QgbWFjaF9oZWFkZXIgKiloYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9CSU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IpOworICAgICAgICAgICAgfQogCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQluc3N5bSA9IE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUoaGFuZGxlLCBzeW1ib2wpOwotCQl9Ci0JfQotCWlmICghbnNzeW0pCi0JewotCQllcnJvcigwLCAiU3ltYm9sIFwiJXNcIiBOb3QgZm91bmQiLCBzeW1ib2wpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIE5TQWRkcmVzc09mU3ltYm9sKG5zc3ltKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5zc3ltID0gTlNMb29rdXBTeW1ib2xJbk1vZHVsZShoYW5kbGUsIHN5bWJvbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFuc3N5bSkKKyAgICB7CisgICAgICAgIGVycm9yKDAsICJTeW1ib2wgXCIlc1wiIE5vdCBmb3VuZCIsIHN5bWJvbCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gTlNBZGRyZXNzT2ZTeW1ib2wobnNzeW0pOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqZGFyd2luX2RsZXJyb3Iodm9pZCkKIHsKLQlyZXR1cm4gZXJyb3IoMSwgKGNoYXIgKilOVUxMKTsKKyAgICByZXR1cm4gZXJyb3IoMSwgKGNoYXIgKilOVUxMKTsKIH0KIAogc3RhdGljIGludCBkYXJ3aW5fZGxjbG9zZSh2b2lkICpoYW5kbGUpCiB7Ci0JaWYgKCgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX01BR0lDKSB8fAotCQkoKChzdHJ1Y3QgbWFjaF9oZWFkZXIgKiloYW5kbGUpLT5tYWdpYyA9PSBNSF9DSUdBTSkpCi0JewotCQllcnJvcigwLCAiQ2FuJ3QgcmVtb3ZlIGR5bmFtaWMgbGlicmFyaWVzIG9uIGRhcndpbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFOU1VuTGlua01vZHVsZShoYW5kbGUsIDApKQotCXsKLQkJZXJyb3IoMCwgInVuYWJsZSB0byB1bmxpbmsgbW9kdWxlICVzIiwgTlNOYW1lT2ZNb2R1bGUoaGFuZGxlKSk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoKCgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlKS0+bWFnaWMgPT0gTUhfTUFHSUMpIHx8CisgICAgICAgICgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX0NJR0FNKSkKKyAgICB7CisgICAgICAgIGVycm9yKDAsICJDYW4ndCByZW1vdmUgZHluYW1pYyBsaWJyYXJpZXMgb24gZGFyd2luIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIU5TVW5MaW5rTW9kdWxlKGhhbmRsZSwgMCkpCisgICAgeworICAgICAgICBlcnJvcigwLCAidW5hYmxlIHRvIHVubGluayBtb2R1bGUgJXMiLCBOU05hbWVPZk1vZHVsZShoYW5kbGUpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAKIC8qIGRsc3ltLCBwcmVwZW5kIHRoZSB1bmRlcnNjb3JlIGFuZCBjYWxsIGRsc3ltSW50ZXJuICovCiBzdGF0aWMgdm9pZCAqZGFyd2luX2Rsc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKQogewotCXN0YXRpYyBjaGFyIHVuZGVyc3ltWzI1N107CS8qIFNhdmVzIGNhbGxzIHRvIG1hbGxvYygzKSAqLwotCWludCBzeW1fbGVuID0gc3RybGVuKHN5bWJvbCk7Ci0Jdm9pZCAqdmFsdWUgPSBOVUxMOwotCWNoYXIgKm1hbGxvY19zeW0gPSBOVUxMOworICAgIHN0YXRpYyBjaGFyIHVuZGVyc3ltWzI1N107ICAgICAgICAgIC8qIFNhdmVzIGNhbGxzIHRvIG1hbGxvYygzKSAqLworICAgIGludCBzeW1fbGVuID0gc3RybGVuKHN5bWJvbCk7CisgICAgdm9pZCAqdmFsdWUgPSBOVUxMOworICAgIGNoYXIgKm1hbGxvY19zeW0gPSBOVUxMOwogCi0JaWYgKHN5bV9sZW4gPCAyNTYpCi0JewotCQlzbnByaW50Zih1bmRlcnN5bSwgMjU2LCAiXyVzIiwgc3ltYm9sKTsKLQkJdmFsdWUgPSBkbHN5bUludGVybihoYW5kbGUsIHVuZGVyc3ltKTsKLQl9Ci0JZWxzZQotCXsKLQkJbWFsbG9jX3N5bSA9IG1hbGxvYyhzeW1fbGVuICsgMik7Ci0JCWlmIChtYWxsb2Nfc3ltKQotCQl7Ci0JCQlzcHJpbnRmKG1hbGxvY19zeW0sICJfJXMiLCBzeW1ib2wpOwotCQkJdmFsdWUgPSBkbHN5bUludGVybihoYW5kbGUsIG1hbGxvY19zeW0pOwotCQkJZnJlZShtYWxsb2Nfc3ltKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWVycm9yKDAsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5Iik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHZhbHVlOworICAgIGlmIChzeW1fbGVuIDwgMjU2KQorICAgIHsKKyAgICAgICAgc25wcmludGYodW5kZXJzeW0sIDI1NiwgIl8lcyIsIHN5bWJvbCk7CisgICAgICAgIHZhbHVlID0gZGxzeW1JbnRlcm4oaGFuZGxlLCB1bmRlcnN5bSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1hbGxvY19zeW0gPSBtYWxsb2Moc3ltX2xlbiArIDIpOworICAgICAgICBpZiAobWFsbG9jX3N5bSkKKyAgICAgICAgeworICAgICAgICAgICAgc3ByaW50ZihtYWxsb2Nfc3ltLCAiXyVzIiwgc3ltYm9sKTsKKyAgICAgICAgICAgIHZhbHVlID0gZGxzeW1JbnRlcm4oaGFuZGxlLCBtYWxsb2Nfc3ltKTsKKyAgICAgICAgICAgIGZyZWUobWFsbG9jX3N5bSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcigwLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKIH0KIAogc3RhdGljIGludCBkYXJ3aW5fZGxhZGRyKGNvbnN0IHZvaWQgKmhhbmRsZSwgRGxfaW5mbyAqaW5mbykgewotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogI2VuZGlmIC8qIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDwgTUFDX09TX1hfVkVSU0lPTl8xMF8zICovCiAKQEAgLTI1MiwyMSArMjUyLDIxIEBACiBzdGF0aWMKICNlbmRpZgogdm9pZCBjdHlwZXNfZGxmY25faW5pdCh2b2lkKSB7Ci0JaWYgKGRsb3BlbiAhPSBOVUxMKSB7Ci0JCWN0eXBlc19kbHN5bSA9IGRsc3ltOwotCQljdHlwZXNfZGxvcGVuID0gZGxvcGVuOwotCQljdHlwZXNfZGxlcnJvciA9IGRsZXJyb3I7Ci0JCWN0eXBlc19kbGNsb3NlID0gZGxjbG9zZTsKLQkJY3R5cGVzX2RsYWRkciA9IGRsYWRkcjsKLQl9IGVsc2UgeworICAgIGlmIChkbG9wZW4gIT0gTlVMTCkgeworICAgICAgICBjdHlwZXNfZGxzeW0gPSBkbHN5bTsKKyAgICAgICAgY3R5cGVzX2Rsb3BlbiA9IGRsb3BlbjsKKyAgICAgICAgY3R5cGVzX2RsZXJyb3IgPSBkbGVycm9yOworICAgICAgICBjdHlwZXNfZGxjbG9zZSA9IGRsY2xvc2U7CisgICAgICAgIGN0eXBlc19kbGFkZHIgPSBkbGFkZHI7CisgICAgfSBlbHNlIHsKICNpZiBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IE1BQ19PU19YX1ZFUlNJT05fMTBfMwotCQljdHlwZXNfZGxzeW0gPSBkYXJ3aW5fZGxzeW07Ci0JCWN0eXBlc19kbG9wZW4gPSBkYXJ3aW5fZGxvcGVuOwotCQljdHlwZXNfZGxlcnJvciA9IGRhcndpbl9kbGVycm9yOwotCQljdHlwZXNfZGxjbG9zZSA9IGRhcndpbl9kbGNsb3NlOwotCQljdHlwZXNfZGxhZGRyID0gZGFyd2luX2RsYWRkcjsKKyAgICAgICAgY3R5cGVzX2Rsc3ltID0gZGFyd2luX2Rsc3ltOworICAgICAgICBjdHlwZXNfZGxvcGVuID0gZGFyd2luX2Rsb3BlbjsKKyAgICAgICAgY3R5cGVzX2RsZXJyb3IgPSBkYXJ3aW5fZGxlcnJvcjsKKyAgICAgICAgY3R5cGVzX2RsY2xvc2UgPSBkYXJ3aW5fZGxjbG9zZTsKKyAgICAgICAgY3R5cGVzX2RsYWRkciA9IGRhcndpbl9kbGFkZHI7CiAjZW5kaWYgLyogTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPCBNQUNfT1NfWF9WRVJTSU9OXzEwXzMgKi8KLQl9CisgICAgfQogfQogCiAjZW5kaWYgLyogQ1RZUEVTX0RBUldJTl9ETEZDTiAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL21hbGxvY19jbG9zdXJlLmMgYi9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYwppbmRleCAwNDJlYmE5Li5hNjkxYWI0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYwpAQCAtMjcsOCArMjcsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBfdGFnSVRFTSB7Ci0JZmZpX2Nsb3N1cmUgY2xvc3VyZTsKLQl1bmlvbiBfdGFnSVRFTSAqbmV4dDsKKyAgICBmZmlfY2xvc3VyZSBjbG9zdXJlOworICAgIHVuaW9uIF90YWdJVEVNICpuZXh0OwogfSBJVEVNOwogCiBzdGF0aWMgSVRFTSAqZnJlZV9saXN0OwpAQCAtMzYsNTggKzM2LDU4IEBACiAKIHN0YXRpYyB2b2lkIG1vcmVfY29yZSh2b2lkKQogewotCUlURU0gKml0ZW07Ci0JaW50IGNvdW50LCBpOworICAgIElURU0gKml0ZW07CisgICAgaW50IGNvdW50LCBpOwogCiAvKiBkZXRlcm1pbmUgdGhlIHBhZ2VzaXplICovCiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoIV9wYWdlc2l6ZSkgewotCQlTWVNURU1fSU5GTyBzeXN0ZW1pbmZvOwotCQlHZXRTeXN0ZW1JbmZvKCZzeXN0ZW1pbmZvKTsKLQkJX3BhZ2VzaXplID0gc3lzdGVtaW5mby5kd1BhZ2VTaXplOwotCX0KKyAgICBpZiAoIV9wYWdlc2l6ZSkgeworICAgICAgICBTWVNURU1fSU5GTyBzeXN0ZW1pbmZvOworICAgICAgICBHZXRTeXN0ZW1JbmZvKCZzeXN0ZW1pbmZvKTsKKyAgICAgICAgX3BhZ2VzaXplID0gc3lzdGVtaW5mby5kd1BhZ2VTaXplOworICAgIH0KICNlbHNlCi0JaWYgKCFfcGFnZXNpemUpIHsKKyAgICBpZiAoIV9wYWdlc2l6ZSkgewogI2lmZGVmIF9TQ19QQUdFU0laRQotCQlfcGFnZXNpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CisgICAgICAgIF9wYWdlc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKICNlbHNlCi0JCV9wYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgICAgIF9wYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CiAjZW5kaWYKLQl9CisgICAgfQogI2VuZGlmCiAKLQkvKiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBub2RlcyB0byBhbGxvY2F0ZSAqLwotCWNvdW50ID0gQkxPQ0tTSVpFIC8gc2l6ZW9mKElURU0pOworICAgIC8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG5vZGVzIHRvIGFsbG9jYXRlICovCisgICAgY291bnQgPSBCTE9DS1NJWkUgLyBzaXplb2YoSVRFTSk7CiAKLQkvKiBhbGxvY2F0ZSBhIG1lbW9yeSBibG9jayAqLworICAgIC8qIGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrICovCiAjaWZkZWYgTVNfV0lOMzIKLQlpdGVtID0gKElURU0gKilWaXJ0dWFsQWxsb2MoTlVMTCwKLQkJCQkJICAgICAgIGNvdW50ICogc2l6ZW9mKElURU0pLAotCQkJCQkgICAgICAgTUVNX0NPTU1JVCwKLQkJCQkJICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOwotCWlmIChpdGVtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBpdGVtID0gKElURU0gKilWaXJ0dWFsQWxsb2MoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAqIHNpemVvZihJVEVNKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1fQ09NTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOworICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKICNlbHNlCi0JaXRlbSA9IChJVEVNICopbW1hcChOVUxMLAotCQkJICAgIGNvdW50ICogc2l6ZW9mKElURU0pLAotCQkJICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCi0JCQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLAotCQkJICAgIC0xLAotCQkJICAgIDApOwotCWlmIChpdGVtID09ICh2b2lkICopTUFQX0ZBSUxFRCkKLQkJcmV0dXJuOworICAgIGl0ZW0gPSAoSVRFTSAqKW1tYXAoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICogc2l6ZW9mKElURU0pLAorICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywKKyAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKGl0ZW0gPT0gKHZvaWQgKilNQVBfRkFJTEVEKQorICAgICAgICByZXR1cm47CiAjZW5kaWYKIAogI2lmZGVmIE1BTExPQ19DTE9TVVJFX0RFQlVHCi0JcHJpbnRmKCJibG9jayBhdCAlcCBhbGxvY2F0ZWQgKCVkIGJ5dGVzKSwgJWQgSVRFTXNcbiIsCi0JICAgICAgIGl0ZW0sIGNvdW50ICogc2l6ZW9mKElURU0pLCBjb3VudCk7CisgICAgcHJpbnRmKCJibG9jayBhdCAlcCBhbGxvY2F0ZWQgKCVkIGJ5dGVzKSwgJWQgSVRFTXNcbiIsCisgICAgICAgICAgIGl0ZW0sIGNvdW50ICogc2l6ZW9mKElURU0pLCBjb3VudCk7CiAjZW5kaWYKLQkvKiBwdXQgdGhlbSBpbnRvIHRoZSBmcmVlIGxpc3QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQlpdGVtLT5uZXh0ID0gZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSBpdGVtOwotCQkrK2l0ZW07Ci0JfQorICAgIC8qIHB1dCB0aGVtIGludG8gdGhlIGZyZWUgbGlzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGl0ZW0tPm5leHQgPSBmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IGl0ZW07CisgICAgICAgICsraXRlbTsKKyAgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NSwyMCArOTUsMjAgQEAKIC8qIHB1dCB0aGUgaXRlbSBiYWNrIGludG8gdGhlIGZyZWUgbGlzdCAqLwogdm9pZCBfY3R5cGVzX2ZyZWVfY2xvc3VyZSh2b2lkICpwKQogewotCUlURU0gKml0ZW0gPSAoSVRFTSAqKXA7Ci0JaXRlbS0+bmV4dCA9IGZyZWVfbGlzdDsKLQlmcmVlX2xpc3QgPSBpdGVtOworICAgIElURU0gKml0ZW0gPSAoSVRFTSAqKXA7CisgICAgaXRlbS0+bmV4dCA9IGZyZWVfbGlzdDsKKyAgICBmcmVlX2xpc3QgPSBpdGVtOwogfQogCiAvKiByZXR1cm4gb25lIGl0ZW0gZnJvbSB0aGUgZnJlZSBsaXN0LCBhbGxvY2F0aW5nIG1vcmUgaWYgbmVlZGVkICovCiB2b2lkICpfY3R5cGVzX2FsbG9jX2Nsb3N1cmUodm9pZCkKIHsKLQlJVEVNICppdGVtOwotCWlmICghZnJlZV9saXN0KQotCQltb3JlX2NvcmUoKTsKLQlpZiAoIWZyZWVfbGlzdCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXRlbSA9IGZyZWVfbGlzdDsKLQlmcmVlX2xpc3QgPSBpdGVtLT5uZXh0OwotCXJldHVybiBpdGVtOworICAgIElURU0gKml0ZW07CisgICAgaWYgKCFmcmVlX2xpc3QpCisgICAgICAgIG1vcmVfY29yZSgpOworICAgIGlmICghZnJlZV9saXN0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdGVtID0gZnJlZV9saXN0OworICAgIGZyZWVfbGlzdCA9IGl0ZW0tPm5leHQ7CisgICAgcmV0dXJuIGl0ZW07CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jIGIvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYwppbmRleCBlNDhlYWRjLi40ZTdlYTEyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9zdGdkaWN0LmMKQEAgLTIzLDE0NSArMjMsMTQ1IEBACiBzdGF0aWMgaW50CiBQeUNTdGdEaWN0X2luaXQoU3RnRGljdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWlmIChQeURpY3RfVHlwZS50cF9pbml0KChQeU9iamVjdCAqKXNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkKLQkJcmV0dXJuIC0xOwotCXNlbGYtPmZvcm1hdCA9IE5VTEw7Ci0Jc2VsZi0+bmRpbSA9IDA7Ci0Jc2VsZi0+c2hhcGUgPSBOVUxMOwotCXJldHVybiAwOworICAgIGlmIChQeURpY3RfVHlwZS50cF9pbml0KChQeU9iamVjdCAqKXNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNlbGYtPmZvcm1hdCA9IE5VTEw7CisgICAgc2VsZi0+bmRpbSA9IDA7CisgICAgc2VsZi0+c2hhcGUgPSBOVUxMOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBQeUNTdGdEaWN0X2NsZWFyKFN0Z0RpY3RPYmplY3QgKnNlbGYpCiB7Ci0JUHlfQ0xFQVIoc2VsZi0+cHJvdG8pOwotCVB5X0NMRUFSKHNlbGYtPmFyZ3R5cGVzKTsKLQlQeV9DTEVBUihzZWxmLT5jb252ZXJ0ZXJzKTsKLQlQeV9DTEVBUihzZWxmLT5yZXN0eXBlKTsKLQlQeV9DTEVBUihzZWxmLT5jaGVja2VyKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihzZWxmLT5wcm90byk7CisgICAgUHlfQ0xFQVIoc2VsZi0+YXJndHlwZXMpOworICAgIFB5X0NMRUFSKHNlbGYtPmNvbnZlcnRlcnMpOworICAgIFB5X0NMRUFSKHNlbGYtPnJlc3R5cGUpOworICAgIFB5X0NMRUFSKHNlbGYtPmNoZWNrZXIpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogUHlDU3RnRGljdF9kZWFsbG9jKFN0Z0RpY3RPYmplY3QgKnNlbGYpCiB7Ci0JUHlDU3RnRGljdF9jbGVhcihzZWxmKTsKLQlQeU1lbV9GcmVlKHNlbGYtPmZvcm1hdCk7Ci0JUHlNZW1fRnJlZShzZWxmLT5zaGFwZSk7Ci0JUHlNZW1fRnJlZShzZWxmLT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzKTsKLQlQeURpY3RfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5Q1N0Z0RpY3RfY2xlYXIoc2VsZik7CisgICAgUHlNZW1fRnJlZShzZWxmLT5mb3JtYXQpOworICAgIFB5TWVtX0ZyZWUoc2VsZi0+c2hhcGUpOworICAgIFB5TWVtX0ZyZWUoc2VsZi0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7CisgICAgUHlEaWN0X1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogaW50CiBQeUNTdGdEaWN0X2Nsb25lKFN0Z0RpY3RPYmplY3QgKmRzdCwgU3RnRGljdE9iamVjdCAqc3JjKQogewotCWNoYXIgKmQsICpzOwotCVB5X3NzaXplX3Qgc2l6ZTsKKyAgICBjaGFyICpkLCAqczsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlQeUNTdGdEaWN0X2NsZWFyKGRzdCk7Ci0JUHlNZW1fRnJlZShkc3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMpOwotCVB5TWVtX0ZyZWUoZHN0LT5mb3JtYXQpOwotCWRzdC0+Zm9ybWF0ID0gTlVMTDsKLQlQeU1lbV9GcmVlKGRzdC0+c2hhcGUpOwotCWRzdC0+c2hhcGUgPSBOVUxMOwotCWRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IE5VTEw7CisgICAgUHlDU3RnRGljdF9jbGVhcihkc3QpOworICAgIFB5TWVtX0ZyZWUoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzKTsKKyAgICBQeU1lbV9GcmVlKGRzdC0+Zm9ybWF0KTsKKyAgICBkc3QtPmZvcm1hdCA9IE5VTEw7CisgICAgUHlNZW1fRnJlZShkc3QtPnNoYXBlKTsKKyAgICBkc3QtPnNoYXBlID0gTlVMTDsKKyAgICBkc3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPSBOVUxMOwogCi0JZCA9IChjaGFyICopZHN0OwotCXMgPSAoY2hhciAqKXNyYzsKLQltZW1jcHkoZCArIHNpemVvZihQeURpY3RPYmplY3QpLAotCSAgICAgICBzICsgc2l6ZW9mKFB5RGljdE9iamVjdCksCi0JICAgICAgIHNpemVvZihTdGdEaWN0T2JqZWN0KSAtIHNpemVvZihQeURpY3RPYmplY3QpKTsKKyAgICBkID0gKGNoYXIgKilkc3Q7CisgICAgcyA9IChjaGFyICopc3JjOworICAgIG1lbWNweShkICsgc2l6ZW9mKFB5RGljdE9iamVjdCksCisgICAgICAgICAgIHMgKyBzaXplb2YoUHlEaWN0T2JqZWN0KSwKKyAgICAgICAgICAgc2l6ZW9mKFN0Z0RpY3RPYmplY3QpIC0gc2l6ZW9mKFB5RGljdE9iamVjdCkpOwogCi0JUHlfWElOQ1JFRihkc3QtPnByb3RvKTsKLQlQeV9YSU5DUkVGKGRzdC0+YXJndHlwZXMpOwotCVB5X1hJTkNSRUYoZHN0LT5jb252ZXJ0ZXJzKTsKLQlQeV9YSU5DUkVGKGRzdC0+cmVzdHlwZSk7Ci0JUHlfWElOQ1JFRihkc3QtPmNoZWNrZXIpOworICAgIFB5X1hJTkNSRUYoZHN0LT5wcm90byk7CisgICAgUHlfWElOQ1JFRihkc3QtPmFyZ3R5cGVzKTsKKyAgICBQeV9YSU5DUkVGKGRzdC0+Y29udmVydGVycyk7CisgICAgUHlfWElOQ1JFRihkc3QtPnJlc3R5cGUpOworICAgIFB5X1hJTkNSRUYoZHN0LT5jaGVja2VyKTsKIAotCWlmIChzcmMtPmZvcm1hdCkgewotCQlkc3QtPmZvcm1hdCA9IFB5TWVtX01hbGxvYyhzdHJsZW4oc3JjLT5mb3JtYXQpICsgMSk7Ci0JCWlmIChkc3QtPmZvcm1hdCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlzdHJjcHkoZHN0LT5mb3JtYXQsIHNyYy0+Zm9ybWF0KTsKLQl9Ci0JaWYgKHNyYy0+c2hhcGUpIHsKLQkJZHN0LT5zaGFwZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkgKiBzcmMtPm5kaW0pOwotCQlpZiAoZHN0LT5zaGFwZSA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQltZW1jcHkoZHN0LT5zaGFwZSwgc3JjLT5zaGFwZSwKLQkJICAgICAgIHNpemVvZihQeV9zc2l6ZV90KSAqIHNyYy0+bmRpbSk7Ci0JfQorICAgIGlmIChzcmMtPmZvcm1hdCkgeworICAgICAgICBkc3QtPmZvcm1hdCA9IFB5TWVtX01hbGxvYyhzdHJsZW4oc3JjLT5mb3JtYXQpICsgMSk7CisgICAgICAgIGlmIChkc3QtPmZvcm1hdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzdHJjcHkoZHN0LT5mb3JtYXQsIHNyYy0+Zm9ybWF0KTsKKyAgICB9CisgICAgaWYgKHNyYy0+c2hhcGUpIHsKKyAgICAgICAgZHN0LT5zaGFwZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkgKiBzcmMtPm5kaW0pOworICAgICAgICBpZiAoZHN0LT5zaGFwZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBtZW1jcHkoZHN0LT5zaGFwZSwgc3JjLT5zaGFwZSwKKyAgICAgICAgICAgICAgIHNpemVvZihQeV9zc2l6ZV90KSAqIHNyYy0+bmRpbSk7CisgICAgfQogCi0JaWYgKHNyYy0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlzaXplID0gc2l6ZW9mKGZmaV90eXBlICopICogKHNyYy0+bGVuZ3RoICsgMSk7Ci0JZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemUpOwotCWlmIChkc3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1lbWNweShkc3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCi0JICAgICAgIHNyYy0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywKLQkgICAgICAgc2l6ZSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNyYy0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzaXplID0gc2l6ZW9mKGZmaV90eXBlICopICogKHNyYy0+bGVuZ3RoICsgMSk7CisgICAgZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemUpOworICAgIGlmIChkc3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbWNweShkc3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCisgICAgICAgICAgIHNyYy0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywKKyAgICAgICAgICAgc2l6ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5VHlwZU9iamVjdCBQeUNTdGdEaWN0X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIlN0Z0RpY3QiLAotCXNpemVvZihTdGdEaWN0T2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKVB5Q1N0Z0RpY3RfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylQeUNTdGdEaWN0X2luaXQsCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJTdGdEaWN0IiwKKyAgICBzaXplb2YoU3RnRGljdE9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilQeUNTdGdEaWN0X2RlYWxsb2MsICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKVB5Q1N0Z0RpY3RfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIE1heSByZXR1cm4gTlVMTCwgYnV0IGRvZXMgbm90IHNldCBhbiBleGNlcHRpb24hICovCiBTdGdEaWN0T2JqZWN0ICoKIFB5VHlwZV9zdGdkaWN0KFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlOworICAgIFB5VHlwZU9iamVjdCAqdHlwZTsKIAotCWlmICghUHlUeXBlX0NoZWNrKG9iaikpCi0JCXJldHVybiBOVUxMOwotCXR5cGUgPSAoUHlUeXBlT2JqZWN0ICopb2JqOwotCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCF0eXBlLT50cF9kaWN0IHx8ICFQeUNTdGdEaWN0X0NoZWNrRXhhY3QodHlwZS0+dHBfZGljdCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoU3RnRGljdE9iamVjdCAqKXR5cGUtPnRwX2RpY3Q7CisgICAgaWYgKCFQeVR5cGVfQ2hlY2sob2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdHlwZSA9IChQeVR5cGVPYmplY3QgKilvYmo7CisgICAgaWYgKCFQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXR5cGUtPnRwX2RpY3QgfHwgIVB5Q1N0Z0RpY3RfQ2hlY2tFeGFjdCh0eXBlLT50cF9kaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChTdGdEaWN0T2JqZWN0ICopdHlwZS0+dHBfZGljdDsKIH0KIAogLyogTWF5IHJldHVybiBOVUxMLCBidXQgZG9lcyBub3Qgc2V0IGFuIGV4Y2VwdGlvbiEgKi8KQEAgLTE3MiwxMiArMTcyLDEyIEBACiBTdGdEaWN0T2JqZWN0ICoKIFB5T2JqZWN0X3N0Z2RpY3QoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlID0gc2VsZi0+b2JfdHlwZTsKLQlpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpCi0JCXJldHVybiBOVUxMOwotCWlmICghdHlwZS0+dHBfZGljdCB8fCAhUHlDU3RnRGljdF9DaGVja0V4YWN0KHR5cGUtPnRwX2RpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKFN0Z0RpY3RPYmplY3QgKil0eXBlLT50cF9kaWN0OworICAgIFB5VHlwZU9iamVjdCAqdHlwZSA9IHNlbGYtPm9iX3R5cGU7CisgICAgaWYgKCFQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXR5cGUtPnRwX2RpY3QgfHwgIVB5Q1N0Z0RpY3RfQ2hlY2tFeGFjdCh0eXBlLT50cF9kaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChTdGdEaWN0T2JqZWN0ICopdHlwZS0+dHBfZGljdDsKIH0KIAogLyogZGVzY3IgaXMgdGhlIGRlc2NyaXB0b3IgZm9yIGEgZmllbGQgbWFya2VkIGFzIGFub255bW91cy4gIEdldCBhbGwgdGhlCkBAIC0xODYsNzggKzE4Niw3OCBAQAogICovCiBzdGF0aWMgaW50CiBNYWtlRmllbGRzKFB5T2JqZWN0ICp0eXBlLCBDRmllbGRPYmplY3QgKmRlc2NyLAotCSAgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgb2Zmc2V0KQorICAgICAgICAgICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IG9mZnNldCkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKmZpZWxkczsKLQlQeU9iamVjdCAqZmllbGRsaXN0OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqZmllbGRzOworICAgIFB5T2JqZWN0ICpmaWVsZGxpc3Q7CiAKLQlmaWVsZHMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRlc2NyLT5wcm90bywgIl9maWVsZHNfIik7Ci0JaWYgKGZpZWxkcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZmllbGRsaXN0ID0gUHlTZXF1ZW5jZV9GYXN0KGZpZWxkcywgIl9maWVsZHNfIG11c3QgYmUgYSBzZXF1ZW5jZSIpOwotCVB5X0RFQ1JFRihmaWVsZHMpOwotCWlmIChmaWVsZGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGZpZWxkcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGVzY3ItPnByb3RvLCAiX2ZpZWxkc18iKTsKKyAgICBpZiAoZmllbGRzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBmaWVsZGxpc3QgPSBQeVNlcXVlbmNlX0Zhc3QoZmllbGRzLCAiX2ZpZWxkc18gbXVzdCBiZSBhIHNlcXVlbmNlIik7CisgICAgUHlfREVDUkVGKGZpZWxkcyk7CisgICAgaWYgKGZpZWxkbGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKGZpZWxkbGlzdCk7ICsraSkgewotCQlQeU9iamVjdCAqcGFpciA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShmaWVsZGxpc3QsIGkpOyAvKiBib3Jyb3dlZCAqLwotCQlQeU9iamVjdCAqZm5hbWUsICpmdHlwZSwgKmJpdHM7Ci0JCUNGaWVsZE9iamVjdCAqZmRlc2NyOwotCQlDRmllbGRPYmplY3QgKm5ld19kZXNjcjsKLQkJLyogQ29udmVydCB0byBQeUFyZ19VbnBhY2tUdXBsZS4uLiAqLwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUocGFpciwgIk9PfE8iLCAmZm5hbWUsICZmdHlwZSwgJmJpdHMpKSB7Ci0JCQlQeV9ERUNSRUYoZmllbGRsaXN0KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlmZGVzY3IgPSAoQ0ZpZWxkT2JqZWN0ICopUHlPYmplY3RfR2V0QXR0cihkZXNjci0+cHJvdG8sIGZuYW1lKTsKLQkJaWYgKGZkZXNjciA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZmllbGRsaXN0KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoUHlfVFlQRShmZGVzY3IpICE9ICZQeUNGaWVsZF9UeXBlKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5leHBlY3RlZCB0eXBlIik7Ci0JCQlQeV9ERUNSRUYoZmRlc2NyKTsKLQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChmZGVzY3ItPmFub255bW91cykgewotCQkJaW50IHJjID0gTWFrZUZpZWxkcyh0eXBlLCBmZGVzY3IsCi0JCQkJCSAgICBpbmRleCArIGZkZXNjci0+aW5kZXgsCi0JCQkJCSAgICBvZmZzZXQgKyBmZGVzY3ItPm9mZnNldCk7Ci0JCQlQeV9ERUNSRUYoZmRlc2NyKTsKLQkJCWlmIChyYyA9PSAtMSkgewotCQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0gCQluZXdfZGVzY3IgPSAoQ0ZpZWxkT2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmUHlDRmllbGRfVHlwZSwgTlVMTCk7Ci0JCWlmIChuZXdfZGVzY3IgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGZkZXNjcik7Ci0JCQlQeV9ERUNSRUYoZmllbGRsaXN0KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlhc3NlcnQoUHlfVFlQRShuZXdfZGVzY3IpID09ICZQeUNGaWVsZF9UeXBlKTsKLSAJCW5ld19kZXNjci0+c2l6ZSA9IGZkZXNjci0+c2l6ZTsKLSAJCW5ld19kZXNjci0+b2Zmc2V0ID0gZmRlc2NyLT5vZmZzZXQgKyBvZmZzZXQ7Ci0gCQluZXdfZGVzY3ItPmluZGV4ID0gZmRlc2NyLT5pbmRleCArIGluZGV4OwotIAkJbmV3X2Rlc2NyLT5wcm90byA9IGZkZXNjci0+cHJvdG87Ci0gCQlQeV9YSU5DUkVGKG5ld19kZXNjci0+cHJvdG8pOwotIAkJbmV3X2Rlc2NyLT5nZXRmdW5jID0gZmRlc2NyLT5nZXRmdW5jOwotIAkJbmV3X2Rlc2NyLT5zZXRmdW5jID0gZmRlc2NyLT5zZXRmdW5jOworICAgIGZvciAoaSA9IDA7IGkgPCBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmllbGRsaXN0KTsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICpwYWlyID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZpZWxkbGlzdCwgaSk7IC8qIGJvcnJvd2VkICovCisgICAgICAgIFB5T2JqZWN0ICpmbmFtZSwgKmZ0eXBlLCAqYml0czsKKyAgICAgICAgQ0ZpZWxkT2JqZWN0ICpmZGVzY3I7CisgICAgICAgIENGaWVsZE9iamVjdCAqbmV3X2Rlc2NyOworICAgICAgICAvKiBDb252ZXJ0IHRvIFB5QXJnX1VucGFja1R1cGxlLi4uICovCisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwYWlyLCAiT098TyIsICZmbmFtZSwgJmZ0eXBlLCAmYml0cykpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmaWVsZGxpc3QpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZkZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9HZXRBdHRyKGRlc2NyLT5wcm90bywgZm5hbWUpOworICAgICAgICBpZiAoZmRlc2NyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmaWVsZGxpc3QpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChQeV9UWVBFKGZkZXNjcikgIT0gJlB5Q0ZpZWxkX1R5cGUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bmV4cGVjdGVkIHR5cGUiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmZGVzY3IpOworICAgICAgICAgICAgUHlfREVDUkVGKGZpZWxkbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZkZXNjci0+YW5vbnltb3VzKSB7CisgICAgICAgICAgICBpbnQgcmMgPSBNYWtlRmllbGRzKHR5cGUsIGZkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKyBmZGVzY3ItPmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyBmZGVzY3ItPm9mZnNldCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmRlc2NyKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmaWVsZGxpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5ld19kZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKSZQeUNGaWVsZF9UeXBlLCBOVUxMKTsKKyAgICAgICAgaWYgKG5ld19kZXNjciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmRlc2NyKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmaWVsZGxpc3QpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGFzc2VydChQeV9UWVBFKG5ld19kZXNjcikgPT0gJlB5Q0ZpZWxkX1R5cGUpOworICAgICAgICBuZXdfZGVzY3ItPnNpemUgPSBmZGVzY3ItPnNpemU7CisgICAgICAgIG5ld19kZXNjci0+b2Zmc2V0ID0gZmRlc2NyLT5vZmZzZXQgKyBvZmZzZXQ7CisgICAgICAgIG5ld19kZXNjci0+aW5kZXggPSBmZGVzY3ItPmluZGV4ICsgaW5kZXg7CisgICAgICAgIG5ld19kZXNjci0+cHJvdG8gPSBmZGVzY3ItPnByb3RvOworICAgICAgICBQeV9YSU5DUkVGKG5ld19kZXNjci0+cHJvdG8pOworICAgICAgICBuZXdfZGVzY3ItPmdldGZ1bmMgPSBmZGVzY3ItPmdldGZ1bmM7CisgICAgICAgIG5ld19kZXNjci0+c2V0ZnVuYyA9IGZkZXNjci0+c2V0ZnVuYzsKIAotICAJCVB5X0RFQ1JFRihmZGVzY3IpOwotCQkKLQkJaWYgKC0xID09IFB5T2JqZWN0X1NldEF0dHIodHlwZSwgZm5hbWUsIChQeU9iamVjdCAqKW5ld19kZXNjcikpIHsKLQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCQkJUHlfREVDUkVGKG5ld19kZXNjcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKG5ld19kZXNjcik7Ci0JfQotCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCXJldHVybiAwOworICAgICAgICBQeV9ERUNSRUYoZmRlc2NyKTsKKworICAgICAgICBpZiAoLTEgPT0gUHlPYmplY3RfU2V0QXR0cih0eXBlLCBmbmFtZSwgKFB5T2JqZWN0ICopbmV3X2Rlc2NyKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZpZWxkbGlzdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3X2Rlc2NyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYobmV3X2Rlc2NyKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGZpZWxkbGlzdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIEl0ZXJhdGUgb3ZlciB0aGUgbmFtZXMgaW4gdGhlIHR5cGUncyBfYW5vbnltb3VzXyBhdHRyaWJ1dGUsIGlmIHByZXNlbnQsCkBAIC0yNjUsNDMgKzI2NSw0MyBAQAogc3RhdGljIGludAogTWFrZUFub25GaWVsZHMoUHlPYmplY3QgKnR5cGUpCiB7Ci0JUHlPYmplY3QgKmFub247Ci0JUHlPYmplY3QgKmFub25fbmFtZXM7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICphbm9uOworICAgIFB5T2JqZWN0ICphbm9uX25hbWVzOworICAgIFB5X3NzaXplX3QgaTsKIAotCWFub24gPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHR5cGUsICJfYW5vbnltb3VzXyIpOwotCWlmIChhbm9uID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWFub25fbmFtZXMgPSBQeVNlcXVlbmNlX0Zhc3QoYW5vbiwgIl9hbm9ueW1vdXNfIG11c3QgYmUgYSBzZXF1ZW5jZSIpOwotCVB5X0RFQ1JFRihhbm9uKTsKLQlpZiAoYW5vbl9uYW1lcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgYW5vbiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodHlwZSwgIl9hbm9ueW1vdXNfIik7CisgICAgaWYgKGFub24gPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYW5vbl9uYW1lcyA9IFB5U2VxdWVuY2VfRmFzdChhbm9uLCAiX2Fub255bW91c18gbXVzdCBiZSBhIHNlcXVlbmNlIik7CisgICAgUHlfREVDUkVGKGFub24pOworICAgIGlmIChhbm9uX25hbWVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCWZvciAoaSA9IDA7IGkgPCBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoYW5vbl9uYW1lcyk7ICsraSkgewotCQlQeU9iamVjdCAqZm5hbWUgPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oYW5vbl9uYW1lcywgaSk7IC8qIGJvcnJvd2VkICovCi0JCUNGaWVsZE9iamVjdCAqZGVzY3IgPSAoQ0ZpZWxkT2JqZWN0ICopUHlPYmplY3RfR2V0QXR0cih0eXBlLCBmbmFtZSk7Ci0JCWlmIChkZXNjciA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYW5vbl9uYW1lcyk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYXNzZXJ0KFB5X1RZUEUoZGVzY3IpID09ICZQeUNGaWVsZF9UeXBlKTsKLQkJZGVzY3ItPmFub255bW91cyA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShhbm9uX25hbWVzKTsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICpmbmFtZSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShhbm9uX25hbWVzLCBpKTsgLyogYm9ycm93ZWQgKi8KKyAgICAgICAgQ0ZpZWxkT2JqZWN0ICpkZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9HZXRBdHRyKHR5cGUsIGZuYW1lKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhbm9uX25hbWVzKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoUHlfVFlQRShkZXNjcikgPT0gJlB5Q0ZpZWxkX1R5cGUpOworICAgICAgICBkZXNjci0+YW5vbnltb3VzID0gMTsKIAotCQkvKiBkZXNjciBpcyBpbiB0aGUgZmllbGQgZGVzY3JpcHRvci4gKi8KLQkJaWYgKC0xID09IE1ha2VGaWVsZHModHlwZSwgKENGaWVsZE9iamVjdCAqKWRlc2NyLAotCQkJCSAgICAgKChDRmllbGRPYmplY3QgKilkZXNjciktPmluZGV4LAotCQkJCSAgICAgKChDRmllbGRPYmplY3QgKilkZXNjciktPm9mZnNldCkpIHsKLQkJCVB5X0RFQ1JFRihkZXNjcik7Ci0JCQlQeV9ERUNSRUYoYW5vbl9uYW1lcyk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKGRlc2NyKTsKLQl9CisgICAgICAgIC8qIGRlc2NyIGlzIGluIHRoZSBmaWVsZCBkZXNjcmlwdG9yLiAqLworICAgICAgICBpZiAoLTEgPT0gTWFrZUZpZWxkcyh0eXBlLCAoQ0ZpZWxkT2JqZWN0ICopZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0ZpZWxkT2JqZWN0ICopZGVzY3IpLT5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDRmllbGRPYmplY3QgKilkZXNjciktPm9mZnNldCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgICAgICAgICBQeV9ERUNSRUYoYW5vbl9uYW1lcyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGRlc2NyKTsKKyAgICB9CiAKLQlQeV9ERUNSRUYoYW5vbl9uYW1lcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKGFub25fbmFtZXMpOworICAgIHJldHVybiAwOwogfQogCiAvKgpAQCAtMzExLDI2NSArMzExLDI2NSBAQAogaW50CiBQeUNTdHJ1Y3RVbmlvblR5cGVfdXBkYXRlX3N0Z2RpY3QoUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpmaWVsZHMsIGludCBpc1N0cnVjdCkKIHsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0LCAqYmFzZWRpY3Q7Ci0JUHlfc3NpemVfdCBsZW4sIG9mZnNldCwgc2l6ZSwgYWxpZ24sIGk7Ci0JUHlfc3NpemVfdCB1bmlvbl9zaXplLCB0b3RhbF9hbGlnbjsKLQlQeV9zc2l6ZV90IGZpZWxkX3NpemUgPSAwOwotCWludCBiaXRvZnM7Ci0JUHlPYmplY3QgKmlzUGFja2VkOwotCWludCBwYWNrID0gMDsKLQlQeV9zc2l6ZV90IGZmaV9vZnM7Ci0JaW50IGJpZ19lbmRpYW47CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKmJhc2VkaWN0OworICAgIFB5X3NzaXplX3QgbGVuLCBvZmZzZXQsIHNpemUsIGFsaWduLCBpOworICAgIFB5X3NzaXplX3QgdW5pb25fc2l6ZSwgdG90YWxfYWxpZ247CisgICAgUHlfc3NpemVfdCBmaWVsZF9zaXplID0gMDsKKyAgICBpbnQgYml0b2ZzOworICAgIFB5T2JqZWN0ICppc1BhY2tlZDsKKyAgICBpbnQgcGFjayA9IDA7CisgICAgUHlfc3NpemVfdCBmZmlfb2ZzOworICAgIGludCBiaWdfZW5kaWFuOwogCi0JLyogSEFDSyBBbGVydDogSSBjYW5ub3QgYmUgYm90aGVyZWQgdG8gZml4IGN0eXBlcy5jb20sIHNvIHRoZXJlIGhhcyB0bwotCSAgIGJlIGEgd2F5IHRvIHVzZSB0aGUgb2xkLCBicm9rZW4gc2VtYXRpY3M6IF9maWVsZHNfIGFyZSBub3QgZXh0ZW5kZWQKLQkgICBidXQgcmVwbGFjZWQgaW4gc3ViY2xhc3Nlcy4KLQkgICAKLQkgICBYWFggUmVtb3ZlIHRoaXMgaW4gY3R5cGVzIDEuMCEKLQkqLwotCWludCB1c2VfYnJva2VuX29sZF9jdHlwZXNfc2VtYW50aWNzOworICAgIC8qIEhBQ0sgQWxlcnQ6IEkgY2Fubm90IGJlIGJvdGhlcmVkIHRvIGZpeCBjdHlwZXMuY29tLCBzbyB0aGVyZSBoYXMgdG8KKyAgICAgICBiZSBhIHdheSB0byB1c2UgdGhlIG9sZCwgYnJva2VuIHNlbWF0aWNzOiBfZmllbGRzXyBhcmUgbm90IGV4dGVuZGVkCisgICAgICAgYnV0IHJlcGxhY2VkIGluIHN1YmNsYXNzZXMuCiAKLQlpZiAoZmllbGRzID09IE5VTEwpCi0JCXJldHVybiAwOworICAgICAgIFhYWCBSZW1vdmUgdGhpcyBpbiBjdHlwZXMgMS4wIQorICAgICovCisgICAgaW50IHVzZV9icm9rZW5fb2xkX2N0eXBlc19zZW1hbnRpY3M7CisKKyAgICBpZiAoZmllbGRzID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCiAjaWZkZWYgV09SRFNfQklHRU5ESUFOCi0JYmlnX2VuZGlhbiA9IFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodHlwZSwgIl9zd2FwcGVkYnl0ZXNfIikgPyAwIDogMTsKKyAgICBiaWdfZW5kaWFuID0gUHlPYmplY3RfSGFzQXR0clN0cmluZyh0eXBlLCAiX3N3YXBwZWRieXRlc18iKSA/IDAgOiAxOwogI2Vsc2UKLQliaWdfZW5kaWFuID0gUHlPYmplY3RfSGFzQXR0clN0cmluZyh0eXBlLCAiX3N3YXBwZWRieXRlc18iKSA/IDEgOiAwOworICAgIGJpZ19lbmRpYW4gPSBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHR5cGUsICJfc3dhcHBlZGJ5dGVzXyIpID8gMSA6IDA7CiAjZW5kaWYKIAotCXVzZV9icm9rZW5fb2xkX2N0eXBlc19zZW1hbnRpY3MgPSBcCi0JCVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodHlwZSwgIl91c2VfYnJva2VuX29sZF9jdHlwZXNfc3RydWN0dXJlX3NlbWFudGljc18iKTsKKyAgICB1c2VfYnJva2VuX29sZF9jdHlwZXNfc2VtYW50aWNzID0gXAorICAgICAgICBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHR5cGUsICJfdXNlX2Jyb2tlbl9vbGRfY3R5cGVzX3N0cnVjdHVyZV9zZW1hbnRpY3NfIik7CiAKLQlpc1BhY2tlZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodHlwZSwgIl9wYWNrXyIpOwotCWlmIChpc1BhY2tlZCkgewotCQlwYWNrID0gUHlJbnRfQXNMb25nKGlzUGFja2VkKTsKLQkJaWYgKHBhY2sgPCAwIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCVB5X1hERUNSRUYoaXNQYWNrZWQpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJfcGFja18gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKGlzUGFja2VkKTsKLQl9IGVsc2UKLQkJUHlFcnJfQ2xlYXIoKTsKKyAgICBpc1BhY2tlZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodHlwZSwgIl9wYWNrXyIpOworICAgIGlmIChpc1BhY2tlZCkgeworICAgICAgICBwYWNrID0gUHlJbnRfQXNMb25nKGlzUGFja2VkKTsKKyAgICAgICAgaWYgKHBhY2sgPCAwIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoaXNQYWNrZWQpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9wYWNrXyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoaXNQYWNrZWQpOworICAgIH0gZWxzZQorICAgICAgICBQeUVycl9DbGVhcigpOwogCi0JbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgoZmllbGRzKTsKLQlpZiAobGVuID09IC0xKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIidfZmllbGRzXycgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIHBhaXJzIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgoZmllbGRzKTsKKyAgICBpZiAobGVuID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiJ19maWVsZHNfJyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgcGFpcnMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXN0Z2RpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKLQlpZiAoIXN0Z2RpY3QpCi0JCXJldHVybiAtMTsKLQkvKiBJZiB0aGlzIHN0cnVjdHVyZS91bmlvbiBpcyBhbHJlYWR5IG1hcmtlZCBmaW5hbCB3ZSBjYW5ub3QgYXNzaWduCi0JICAgX2ZpZWxkc18gYW55bW9yZS4gKi8KKyAgICBzdGdkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7CisgICAgaWYgKCFzdGdkaWN0KQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogSWYgdGhpcyBzdHJ1Y3R1cmUvdW5pb24gaXMgYWxyZWFkeSBtYXJrZWQgZmluYWwgd2UgY2Fubm90IGFzc2lnbgorICAgICAgIF9maWVsZHNfIGFueW1vcmUuICovCiAKLQlpZiAoc3RnZGljdC0+ZmxhZ3MgJiBESUNURkxBR19GSU5BTCkgey8qIGlzIGZpbmFsID8gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSJfZmllbGRzXyBpcyBmaW5hbCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChzdGdkaWN0LT5mbGFncyAmIERJQ1RGTEFHX0ZJTkFMKSB7LyogaXMgZmluYWwgPyAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX2ZpZWxkc18gaXMgZmluYWwiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChzdGdkaWN0LT5mb3JtYXQpIHsKLQkJUHlNZW1fRnJlZShzdGdkaWN0LT5mb3JtYXQpOwotCQlzdGdkaWN0LT5mb3JtYXQgPSBOVUxMOwotCX0KKyAgICBpZiAoc3RnZGljdC0+Zm9ybWF0KSB7CisgICAgICAgIFB5TWVtX0ZyZWUoc3RnZGljdC0+Zm9ybWF0KTsKKyAgICAgICAgc3RnZGljdC0+Zm9ybWF0ID0gTlVMTDsKKyAgICB9CiAKLQlpZiAoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cykKLQkJUHlNZW1fRnJlZShzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzKTsKKyAgICBpZiAoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cykKKyAgICAgICAgUHlNZW1fRnJlZShzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzKTsKIAotCWJhc2VkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfYmFzZSk7Ci0JaWYgKGJhc2VkaWN0ICYmICF1c2VfYnJva2VuX29sZF9jdHlwZXNfc2VtYW50aWNzKSB7Ci0JCXNpemUgPSBvZmZzZXQgPSBiYXNlZGljdC0+c2l6ZTsKLQkJYWxpZ24gPSBiYXNlZGljdC0+YWxpZ247Ci0JCXVuaW9uX3NpemUgPSAwOwotCQl0b3RhbF9hbGlnbiA9IGFsaWduID8gYWxpZ24gOiAxOwotCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7Ci0JCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGggKyBsZW4gKyAxKSk7Ci0JCWlmIChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbWVtc2V0KHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsIDAsCi0JCSAgICAgICBzaXplb2YoZmZpX3R5cGUgKikgKiAoYmFzZWRpY3QtPmxlbmd0aCArIGxlbiArIDEpKTsKLQkJbWVtY3B5KHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCi0JCSAgICAgICBiYXNlZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywKLQkJICAgICAgIHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoKSk7Ci0JCWZmaV9vZnMgPSBiYXNlZGljdC0+bGVuZ3RoOwotCX0gZWxzZSB7Ci0JCW9mZnNldCA9IDA7Ci0JCXNpemUgPSAwOwotCQlhbGlnbiA9IDA7Ci0JCXVuaW9uX3NpemUgPSAwOwotCQl0b3RhbF9hbGlnbiA9IDE7Ci0JCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKLQkJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplb2YoZmZpX3R5cGUgKikgKiAobGVuICsgMSkpOwotCQlpZiAoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCW1lbXNldChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLCAwLAotCQkgICAgICAgc2l6ZW9mKGZmaV90eXBlICopICogKGxlbiArIDEpKTsKLQkJZmZpX29mcyA9IDA7Ci0JfQorICAgIGJhc2VkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfYmFzZSk7CisgICAgaWYgKGJhc2VkaWN0ICYmICF1c2VfYnJva2VuX29sZF9jdHlwZXNfc2VtYW50aWNzKSB7CisgICAgICAgIHNpemUgPSBvZmZzZXQgPSBiYXNlZGljdC0+c2l6ZTsKKyAgICAgICAgYWxpZ24gPSBiYXNlZGljdC0+YWxpZ247CisgICAgICAgIHVuaW9uX3NpemUgPSAwOworICAgICAgICB0b3RhbF9hbGlnbiA9IGFsaWduID8gYWxpZ24gOiAxOworICAgICAgICBzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgICAgICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGggKyBsZW4gKyAxKSk7CisgICAgICAgIGlmIChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsIDAsCisgICAgICAgICAgICAgICBzaXplb2YoZmZpX3R5cGUgKikgKiAoYmFzZWRpY3QtPmxlbmd0aCArIGxlbiArIDEpKTsKKyAgICAgICAgbWVtY3B5KHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCisgICAgICAgICAgICAgICBiYXNlZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywKKyAgICAgICAgICAgICAgIHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoKSk7CisgICAgICAgIGZmaV9vZnMgPSBiYXNlZGljdC0+bGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIHNpemUgPSAwOworICAgICAgICBhbGlnbiA9IDA7CisgICAgICAgIHVuaW9uX3NpemUgPSAwOworICAgICAgICB0b3RhbF9hbGlnbiA9IDE7CisgICAgICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgICAgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplb2YoZmZpX3R5cGUgKikgKiAobGVuICsgMSkpOworICAgICAgICBpZiAoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1lbXNldChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKGZmaV90eXBlICopICogKGxlbiArIDEpKTsKKyAgICAgICAgZmZpX29mcyA9IDA7CisgICAgfQogCi0JYXNzZXJ0KHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKTsKLQlpZiAoaXNTdHJ1Y3QgJiYgIWlzUGFja2VkKSB7Ci0JCXN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiVHsiKTsKLQl9IGVsc2UgewotCQkvKiBQRVAzMTE4IGRvZXNuJ3Qgc3VwcG9ydCB1bmlvbiwgb3IgcGFja2VkIHN0cnVjdHVyZXMgKHdlbGwsCi0JCSAgIG9ubHkgc3RhbmRhcmQgcGFja2luZywgYnV0IHdlIGRvbnQgc3VwcG9ydCB0aGUgcGVwIGZvcgotCQkgICB0aGF0KS4gVXNlICdCJyBmb3IgYnl0ZXMuICovCi0JCXN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiQiIpOwotCX0KKyAgICBhc3NlcnQoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpOworICAgIGlmIChpc1N0cnVjdCAmJiAhaXNQYWNrZWQpIHsKKyAgICAgICAgc3RnZGljdC0+Zm9ybWF0ID0gX2N0eXBlc19hbGxvY19mb3JtYXRfc3RyaW5nKE5VTEwsICJUeyIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFBFUDMxMTggZG9lc24ndCBzdXBwb3J0IHVuaW9uLCBvciBwYWNrZWQgc3RydWN0dXJlcyAod2VsbCwKKyAgICAgICAgICAgb25seSBzdGFuZGFyZCBwYWNraW5nLCBidXQgd2UgZG9udCBzdXBwb3J0IHRoZSBwZXAgZm9yCisgICAgICAgICAgIHRoYXQpLiBVc2UgJ0InIGZvciBieXRlcy4gKi8KKyAgICAgICAgc3RnZGljdC0+Zm9ybWF0ID0gX2N0eXBlc19hbGxvY19mb3JtYXRfc3RyaW5nKE5VTEwsICJCIik7CisgICAgfQogCiAjZGVmaW5lIHJlYWxkaWN0ICgoUHlPYmplY3QgKikmc3RnZGljdC0+ZGljdCkKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLQkJUHlPYmplY3QgKm5hbWUgPSBOVUxMLCAqZGVzYyA9IE5VTEw7Ci0JCVB5T2JqZWN0ICpwYWlyID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGZpZWxkcywgaSk7Ci0JCVB5T2JqZWN0ICpwcm9wOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCQlpbnQgYml0c2l6ZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gTlVMTCwgKmRlc2MgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqcGFpciA9IFB5U2VxdWVuY2VfR2V0SXRlbShmaWVsZHMsIGkpOworICAgICAgICBQeU9iamVjdCAqcHJvcDsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICAgICAgaW50IGJpdHNpemUgPSAwOwogCi0JCWlmICghcGFpciB8fCAhUHlBcmdfUGFyc2VUdXBsZShwYWlyLCAiT098aSIsICZuYW1lLCAmZGVzYywgJmJpdHNpemUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJCSInX2ZpZWxkc18nIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBwYWlycyIpOwotCQkJUHlfWERFQ1JFRihwYWlyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoZGVzYyk7Ci0JCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwYWlyKTsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgIGlmICghcGFpciB8fCAhUHlBcmdfUGFyc2VUdXBsZShwYWlyLCAiT098aSIsICZuYW1lLCAmZGVzYywgJmJpdHNpemUpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidfZmllbGRzXycgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIHBhaXJzIik7CisgICAgICAgICAgICBQeV9YREVDUkVGKHBhaXIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdChkZXNjKTsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhaXIpOworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCQkJCSAgICAgInNlY29uZCBpdGVtIGluIF9maWVsZHNfIHR1cGxlIChpbmRleCAlZCkgbXVzdCBiZSBhIEMgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlY29uZCBpdGVtIGluIF9maWVsZHNfIHR1cGxlIChpbmRleCAlZCkgbXVzdCBiZSBhIEMgdHlwZSIsCiAjZWxzZQotCQkJCSAgICAgInNlY29uZCBpdGVtIGluIF9maWVsZHNfIHR1cGxlIChpbmRleCAlemQpIG11c3QgYmUgYSBDIHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzZWNvbmQgaXRlbSBpbiBfZmllbGRzXyB0dXBsZSAoaW5kZXggJXpkKSBtdXN0IGJlIGEgQyB0eXBlIiwKICNlbmRpZgotCQkJCSAgICAgaSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50c1tmZmlfb2ZzICsgaV0gPSAmZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKLQkJaWYgKGRpY3QtPmZsYWdzICYgKFRZUEVGTEFHX0lTUE9JTlRFUiB8IFRZUEVGTEFHX0hBU1BPSU5URVIpKQotCQkJc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSEFTUE9JTlRFUjsKLQkJZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7IC8qIG1hcmsgZmllbGQgdHlwZSBmaW5hbCAqLwotCQlpZiAoUHlUdXBsZV9TaXplKHBhaXIpID09IDMpIHsgLyogYml0cyBzcGVjaWZpZWQgKi8KLQkJCXN3aXRjaChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUpIHsKLQkJCWNhc2UgRkZJX1RZUEVfVUlOVDg6Ci0JCQljYXNlIEZGSV9UWVBFX1VJTlQxNjoKLQkJCWNhc2UgRkZJX1RZUEVfVUlOVDMyOgotCQkJY2FzZSBGRklfVFlQRV9TSU5UNjQ6Ci0JCQljYXNlIEZGSV9UWVBFX1VJTlQ2NDoKLQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzW2ZmaV9vZnMgKyBpXSA9ICZkaWN0LT5mZmlfdHlwZV9wb2ludGVyOworICAgICAgICBpZiAoZGljdC0+ZmxhZ3MgJiAoVFlQRUZMQUdfSVNQT0lOVEVSIHwgVFlQRUZMQUdfSEFTUE9JTlRFUikpCisgICAgICAgICAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19IQVNQT0lOVEVSOworICAgICAgICBkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsgLyogbWFyayBmaWVsZCB0eXBlIGZpbmFsICovCisgICAgICAgIGlmIChQeVR1cGxlX1NpemUocGFpcikgPT0gMykgeyAvKiBiaXRzIHNwZWNpZmllZCAqLworICAgICAgICAgICAgc3dpdGNoKGRpY3QtPmZmaV90eXBlX3BvaW50ZXIudHlwZSkgeworICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQljYXNlIEZGSV9UWVBFX1NJTlQ4OgotCQkJY2FzZSBGRklfVFlQRV9TSU5UMTY6Ci0JCQljYXNlIEZGSV9UWVBFX1NJTlQzMjoKLQkJCQlpZiAoZGljdC0+Z2V0ZnVuYyAhPSBfY3R5cGVzX2dldF9maWVsZGRlc2MoImMiKS0+Z2V0ZnVuYworICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisgICAgICAgICAgICAgICAgaWYgKGRpY3QtPmdldGZ1bmMgIT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJjIiktPmdldGZ1bmMKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCQkJCSAgICAmJiBkaWN0LT5nZXRmdW5jICE9IF9jdHlwZXNfZ2V0X2ZpZWxkZGVzYygidSIpLT5nZXRmdW5jCisgICAgICAgICAgICAgICAgICAgICYmIGRpY3QtPmdldGZ1bmMgIT0gX2N0eXBlc19nZXRfZmllbGRkZXNjKCJ1IiktPmdldGZ1bmMKICNlbmRpZgotCQkJCQkpCi0JCQkJCWJyZWFrOwotCQkJCS8qIGVsc2UgZmFsbCB0aHJvdWdoICovCi0JCQlkZWZhdWx0OgotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSAgICAgImJpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgJXMiLAotCQkJCQkgICAgICgoUHlUeXBlT2JqZWN0ICopZGVzYyktPnRwX25hbWUpOwotCQkJCVB5X0RFQ1JFRihwYWlyKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlpZiAoYml0c2l6ZSA8PSAwIHx8IGJpdHNpemUgPiBkaWN0LT5zaXplICogOCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJIm51bWJlciBvZiBiaXRzIGludmFsaWQgZm9yIGJpdCBmaWVsZCIpOwotCQkJCVB5X0RFQ1JFRihwYWlyKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJYml0c2l6ZSA9IDA7Ci0JCWlmIChpc1N0cnVjdCAmJiAhaXNQYWNrZWQpIHsKLQkJCWNoYXIgKmZpZWxkZm10ID0gZGljdC0+Zm9ybWF0ID8gZGljdC0+Zm9ybWF0IDogIkIiOwotCQkJY2hhciAqZmllbGRuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7Ci0JCQljaGFyICpwdHI7Ci0JCQlQeV9zc2l6ZV90IGxlbiA9IHN0cmxlbihmaWVsZG5hbWUpICsgc3RybGVuKGZpZWxkZm10KTsKLQkJCWNoYXIgKmJ1ZiA9IGFsbG9jYShsZW4gKyAyICsgMSk7CisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogZWxzZSBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFB5VHlwZU9iamVjdCAqKWRlc2MpLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJpdHNpemUgPD0gMCB8fCBiaXRzaXplID4gZGljdC0+c2l6ZSAqIDgpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWJlciBvZiBiaXRzIGludmFsaWQgZm9yIGJpdCBmaWVsZCIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwYWlyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYml0c2l6ZSA9IDA7CisgICAgICAgIGlmIChpc1N0cnVjdCAmJiAhaXNQYWNrZWQpIHsKKyAgICAgICAgICAgIGNoYXIgKmZpZWxkZm10ID0gZGljdC0+Zm9ybWF0ID8gZGljdC0+Zm9ybWF0IDogIkIiOworICAgICAgICAgICAgY2hhciAqZmllbGRuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7CisgICAgICAgICAgICBjaGFyICpwdHI7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IHN0cmxlbihmaWVsZG5hbWUpICsgc3RybGVuKGZpZWxkZm10KTsKKyAgICAgICAgICAgIGNoYXIgKmJ1ZiA9IGFsbG9jYShsZW4gKyAyICsgMSk7CiAKLQkJCXNwcmludGYoYnVmLCAiJXM6JXM6IiwgZmllbGRmbXQsIGZpZWxkbmFtZSk7CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVzOiVzOiIsIGZpZWxkZm10LCBmaWVsZG5hbWUpOwogCi0JCQlwdHIgPSBzdGdkaWN0LT5mb3JtYXQ7Ci0JCQlzdGdkaWN0LT5mb3JtYXQgPSBfY3R5cGVzX2FsbG9jX2Zvcm1hdF9zdHJpbmcoc3RnZGljdC0+Zm9ybWF0LCBidWYpOwotCQkJUHlNZW1fRnJlZShwdHIpOworICAgICAgICAgICAgcHRyID0gc3RnZGljdC0+Zm9ybWF0OworICAgICAgICAgICAgc3RnZGljdC0+Zm9ybWF0ID0gX2N0eXBlc19hbGxvY19mb3JtYXRfc3RyaW5nKHN0Z2RpY3QtPmZvcm1hdCwgYnVmKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUocHRyKTsKIAotCQkJaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHBhaXIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoaXNTdHJ1Y3QpIHsKLQkJCXByb3AgPSBQeUNGaWVsZF9Gcm9tRGVzYyhkZXNjLCBpLAotCQkJCQkgICAgICAgJmZpZWxkX3NpemUsIGJpdHNpemUsICZiaXRvZnMsCi0JCQkJCSAgICAgICAmc2l6ZSwgJm9mZnNldCwgJmFsaWduLAotCQkJCQkgICAgICAgcGFjaywgYmlnX2VuZGlhbik7Ci0JCX0gZWxzZSAvKiB1bmlvbiAqLyB7Ci0JCQlzaXplID0gMDsKLQkJCW9mZnNldCA9IDA7Ci0JCQlhbGlnbiA9IDA7Ci0JCQlwcm9wID0gUHlDRmllbGRfRnJvbURlc2MoZGVzYywgaSwKLQkJCQkJICAgICAgICZmaWVsZF9zaXplLCBiaXRzaXplLCAmYml0b2ZzLAotCQkJCQkgICAgICAgJnNpemUsICZvZmZzZXQsICZhbGlnbiwKLQkJCQkJICAgICAgIHBhY2ssIGJpZ19lbmRpYW4pOwotCQkJdW5pb25fc2l6ZSA9IG1heChzaXplLCB1bmlvbl9zaXplKTsKLQkJfQotCQl0b3RhbF9hbGlnbiA9IG1heChhbGlnbiwgdG90YWxfYWxpZ24pOworICAgICAgICAgICAgaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHBhaXIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNTdHJ1Y3QpIHsKKyAgICAgICAgICAgIHByb3AgPSBQeUNGaWVsZF9Gcm9tRGVzYyhkZXNjLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfc2l6ZSwgYml0c2l6ZSwgJmJpdG9mcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsICZvZmZzZXQsICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjaywgYmlnX2VuZGlhbik7CisgICAgICAgIH0gZWxzZSAvKiB1bmlvbiAqLyB7CisgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICBhbGlnbiA9IDA7CisgICAgICAgICAgICBwcm9wID0gUHlDRmllbGRfRnJvbURlc2MoZGVzYywgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3NpemUsIGJpdHNpemUsICZiaXRvZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCAmb2Zmc2V0LCAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2ssIGJpZ19lbmRpYW4pOworICAgICAgICAgICAgdW5pb25fc2l6ZSA9IG1heChzaXplLCB1bmlvbl9zaXplKTsKKyAgICAgICAgfQorICAgICAgICB0b3RhbF9hbGlnbiA9IG1heChhbGlnbiwgdG90YWxfYWxpZ24pOwogCi0JCWlmICghcHJvcCkgewotCQkJUHlfREVDUkVGKHBhaXIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICgtMSA9PSBQeU9iamVjdF9TZXRBdHRyKHR5cGUsIG5hbWUsIHByb3ApKSB7Ci0JCQlQeV9ERUNSRUYocHJvcCk7Ci0JCQlQeV9ERUNSRUYocGFpcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKHBhaXIpOwotCQlQeV9ERUNSRUYocHJvcCk7Ci0JfQorICAgICAgICBpZiAoIXByb3ApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwYWlyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoLTEgPT0gUHlPYmplY3RfU2V0QXR0cih0eXBlLCBuYW1lLCBwcm9wKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHByb3ApOworICAgICAgICAgICAgUHlfREVDUkVGKHBhaXIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihwYWlyKTsKKyAgICAgICAgUHlfREVDUkVGKHByb3ApOworICAgIH0KICN1bmRlZiByZWFsZGljdAogCi0JaWYgKGlzU3RydWN0ICYmICFpc1BhY2tlZCkgewotCQljaGFyICpwdHIgPSBzdGdkaWN0LT5mb3JtYXQ7Ci0JCXN0Z2RpY3QtPmZvcm1hdCA9IF9jdHlwZXNfYWxsb2NfZm9ybWF0X3N0cmluZyhzdGdkaWN0LT5mb3JtYXQsICJ9Iik7Ci0JCVB5TWVtX0ZyZWUocHRyKTsKLQkJaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoaXNTdHJ1Y3QgJiYgIWlzUGFja2VkKSB7CisgICAgICAgIGNoYXIgKnB0ciA9IHN0Z2RpY3QtPmZvcm1hdDsKKyAgICAgICAgc3RnZGljdC0+Zm9ybWF0ID0gX2N0eXBlc19hbGxvY19mb3JtYXRfc3RyaW5nKHN0Z2RpY3QtPmZvcm1hdCwgIn0iKTsKKyAgICAgICAgUHlNZW1fRnJlZShwdHIpOworICAgICAgICBpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCFpc1N0cnVjdCkKLQkJc2l6ZSA9IHVuaW9uX3NpemU7CisgICAgaWYgKCFpc1N0cnVjdCkKKyAgICAgICAgc2l6ZSA9IHVuaW9uX3NpemU7CiAKLQkvKiBBZGp1c3QgdGhlIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICovCi0Jc2l6ZSA9ICgoc2l6ZSArIHRvdGFsX2FsaWduIC0gMSkgLyB0b3RhbF9hbGlnbikgKiB0b3RhbF9hbGlnbjsKKyAgICAvKiBBZGp1c3QgdGhlIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICovCisgICAgc2l6ZSA9ICgoc2l6ZSArIHRvdGFsX2FsaWduIC0gMSkgLyB0b3RhbF9hbGlnbikgKiB0b3RhbF9hbGlnbjsKIAotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuYWxpZ25tZW50ID0gUHlfU0FGRV9ET1dOQ0FTVCh0b3RhbF9hbGlnbiwKLQkJCQkJCQkgICAgICAgUHlfc3NpemVfdCwKLQkJCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQpOwotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuc2l6ZSA9IHNpemU7CisgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5hbGlnbm1lbnQgPSBQeV9TQUZFX0RPV05DQVNUKHRvdGFsX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCk7CisgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5zaXplID0gc2l6ZTsKIAotCXN0Z2RpY3QtPnNpemUgPSBzaXplOwotCXN0Z2RpY3QtPmFsaWduID0gdG90YWxfYWxpZ247Ci0Jc3RnZGljdC0+bGVuZ3RoID0gbGVuOwkvKiBBREQgZmZpX29mcz8gKi8KKyAgICBzdGdkaWN0LT5zaXplID0gc2l6ZTsKKyAgICBzdGdkaWN0LT5hbGlnbiA9IHRvdGFsX2FsaWduOworICAgIHN0Z2RpY3QtPmxlbmd0aCA9IGxlbjsgICAgICAvKiBBREQgZmZpX29mcz8gKi8KIAotCS8qIFdlIGRpZCBjaGVjayB0aGF0IHRoaXMgZmxhZyB3YXMgTk9UIHNldCBhYm92ZSwgaXQgbXVzdCBub3QKLQkgICBoYXZlIGJlZW4gc2V0IHVudGlsIG5vdy4gKi8KLQlpZiAoc3RnZGljdC0+ZmxhZ3MgJiBESUNURkxBR19GSU5BTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJIlN0cnVjdHVyZSBvciB1bmlvbiBjYW5ub3QgY29udGFpbiBpdHNlbGYiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzdGdkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsKKyAgICAvKiBXZSBkaWQgY2hlY2sgdGhhdCB0aGlzIGZsYWcgd2FzIE5PVCBzZXQgYWJvdmUsIGl0IG11c3Qgbm90CisgICAgICAgaGF2ZSBiZWVuIHNldCB1bnRpbCBub3cuICovCisgICAgaWYgKHN0Z2RpY3QtPmZsYWdzICYgRElDVEZMQUdfRklOQUwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlN0cnVjdHVyZSBvciB1bmlvbiBjYW5ub3QgY29udGFpbiBpdHNlbGYiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzdGdkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsKIAotCXJldHVybiBNYWtlQW5vbkZpZWxkcyh0eXBlKTsKKyAgICByZXR1cm4gTWFrZUFub25GaWVsZHModHlwZSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYyBiL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCmluZGV4IDc0ZTZiZmEuLjA0YTBhMjggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCisrKyBiL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCkBAIC0yMiw3ICsyMiw3IEBACiAvKiBVdGlsaXR5IEZ1bmN0aW9ucyAqLwogCiAvKgotICogQ2hlY2sgdGhlIHJldHVybiBjb2RlIGZyb20gYSBjdXJzZXMgZnVuY3Rpb24gYW5kIHJldHVybiBOb25lIAorICogQ2hlY2sgdGhlIHJldHVybiBjb2RlIGZyb20gYSBjdXJzZXMgZnVuY3Rpb24gYW5kIHJldHVybiBOb25lCiAgKiBvciByYWlzZSBhbiBleGNlcHRpb24gYXMgYXBwcm9wcmlhdGUuCiAgKi8KIApAQCAtMzAsMTUgKzMwLDE1IEBACiBQeUN1cnNlc0NoZWNrRVJSKGludCBjb2RlLCBjaGFyICpmbmFtZSkKIHsKICAgICBpZiAoY29kZSAhPSBFUlIpIHsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfSBlbHNlIHsKLQlpZiAoZm5hbWUgPT0gTlVMTCkgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlDdXJzZXNFcnJvciwgY2F0Y2hhbGxfRVJSKTsKLQl9IGVsc2UgewotCSAgICBQeUVycl9Gb3JtYXQoUHlDdXJzZXNFcnJvciwgIiVzKCkgcmV0dXJuZWQgRVJSIiwgZm5hbWUpOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGZuYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUN1cnNlc0Vycm9yLCBjYXRjaGFsbF9FUlIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5Q3Vyc2VzRXJyb3IsICIlcygpIHJldHVybmVkIEVSUiIsIGZuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAKQEAgLTUxLDEyICs1MSwxMiBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKICAgICBQQU5FTCAqcGFuOwotICAgIFB5Q3Vyc2VzV2luZG93T2JqZWN0ICp3bzsJLyogZm9yIHJlZmVyZW5jZSBjb3VudHMgKi8KKyAgICBQeUN1cnNlc1dpbmRvd09iamVjdCAqd287ICAgLyogZm9yIHJlZmVyZW5jZSBjb3VudHMgKi8KIH0gUHlDdXJzZXNQYW5lbE9iamVjdDsKIAogUHlUeXBlT2JqZWN0IFB5Q3Vyc2VzUGFuZWxfVHlwZTsKIAotI2RlZmluZSBQeUN1cnNlc1BhbmVsX0NoZWNrKHYpCSAoUHlfVFlQRSh2KSA9PSAmUHlDdXJzZXNQYW5lbF9UeXBlKQorI2RlZmluZSBQeUN1cnNlc1BhbmVsX0NoZWNrKHYpICAgKFB5X1RZUEUodikgPT0gJlB5Q3Vyc2VzUGFuZWxfVHlwZSkKIAogLyogU29tZSBoZWxwZXIgZnVuY3Rpb25zLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZXJlJ3MgYWx3YXlzIGEgd2luZG93CiAgICBhc3NvY2lhdGVkIHdpdGggYSBwYW5lbC4gVG8gZW5zdXJlIHRoYXQgUHl0aG9uJ3MgR0MgZG9lc24ndCBwdWxsCkBAIC04OCwxMCArODgsMTAgQEAKIGluc2VydF9sb3AoUHlDdXJzZXNQYW5lbE9iamVjdCAqcG8pCiB7CiAgICAgbGlzdF9vZl9wYW5lbHMgKm5ldzsKLSAgICAKKwogICAgIGlmICgobmV3ID0gKGxpc3Rfb2ZfcGFuZWxzICopbWFsbG9jKHNpemVvZihsaXN0X29mX3BhbmVscykpKSA9PSBOVUxMKSB7Ci0JUHlFcnJfTm9NZW1vcnkoKTsKLQlyZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgbmV3LT5wbyA9IHBvOwogICAgIG5ldy0+bmV4dCA9IGxvcDsKQEAgLTEwNywxNyArMTA3LDE3IEBACiAKICAgICB0ZW1wID0gbG9wOwogICAgIGlmICh0ZW1wLT5wbyA9PSBwbykgewotCWxvcCA9IHRlbXAtPm5leHQ7Ci0JZnJlZSh0ZW1wKTsKLQlyZXR1cm47CisgICAgICAgIGxvcCA9IHRlbXAtPm5leHQ7CisgICAgICAgIGZyZWUodGVtcCk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgd2hpbGUgKHRlbXAtPm5leHQgPT0gTlVMTCB8fCB0ZW1wLT5uZXh0LT5wbyAhPSBwbykgewotCWlmICh0ZW1wLT5uZXh0ID09IE5VTEwpIHsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICAicmVtb3ZlX2xvcDogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQkgICAgcmV0dXJuOwotCX0KLQl0ZW1wID0gdGVtcC0+bmV4dDsKKyAgICAgICAgaWYgKHRlbXAtPm5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlX2xvcDogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKICAgICB9CiAgICAgbiA9IHRlbXAtPm5leHQtPm5leHQ7CiAgICAgZnJlZSh0ZW1wLT5uZXh0KTsKQEAgLTEzMSw3ICsxMzEsNyBAQAogewogICAgIGxpc3Rfb2ZfcGFuZWxzICp0ZW1wOwogICAgIGZvciAodGVtcCA9IGxvcDsgdGVtcC0+cG8tPnBhbiAhPSBwYW47IHRlbXAgPSB0ZW1wLT5uZXh0KQotCWlmICh0ZW1wLT5uZXh0ID09IE5VTEwpIHJldHVybiBOVUxMOwkvKiBub3QgZm91bmQhPyAqLworICAgICAgICBpZiAodGVtcC0+bmV4dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsgICAgLyogbm90IGZvdW5kIT8gKi8KICAgICByZXR1cm4gdGVtcC0+cG87CiB9CiAKQEAgLTE3OSw5ICsxNzksOSBAQAogICAgIGlmIChwbyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKICAgICBwby0+cGFuID0gcGFuOwogICAgIGlmIChpbnNlcnRfbG9wKHBvKSA8IDApIHsKLQlwby0+d28gPSBOVUxMOwotCVB5X0RFQ1JFRihwbyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIHBvLT53byA9IE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihwbyk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBwby0+d28gPSB3bzsKICAgICBQeV9JTkNSRUYod28pOwpAQCAtMTkzLDggKzE5Myw4IEBACiB7CiAgICAgKHZvaWQpZGVsX3BhbmVsKHBvLT5wYW4pOwogICAgIGlmIChwby0+d28gIT0gTlVMTCkgewotCVB5X0RFQ1JFRihwby0+d28pOwotCXJlbW92ZV9sb3AocG8pOworICAgICAgICBQeV9ERUNSRUYocG8tPndvKTsKKyAgICAgICAgcmVtb3ZlX2xvcChwbyk7CiAgICAgfQogICAgIFB5T2JqZWN0X0RFTChwbyk7CiB9CkBAIC0yMDYsMTkgKzIwNiwxOSBAQAogewogICAgIFBBTkVMICpwYW47CiAgICAgUHlDdXJzZXNQYW5lbE9iamVjdCAqcG87Ci0gICAgCisKICAgICBwYW4gPSBwYW5lbF9hYm92ZShzZWxmLT5wYW4pOwogCi0gICAgaWYgKHBhbiA9PSBOVUxMKSB7CQkvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zIHRoZSBjYWxsaW5nIHBhbmVsCi0JCQkJICAgaXMgb24gdG9wIG9mIHRoZSBzdGFjayAqLwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAocGFuID09IE5VTEwpIHsgICAgICAgICAgLyogdmFsaWQgb3V0cHV0LCBpdCBtZWFucyB0aGUgY2FsbGluZyBwYW5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBvbiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfQogICAgIHBvID0gZmluZF9wbyhwYW4pOwogICAgIGlmIChwbyA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJwYW5lbF9hYm92ZTogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYW5lbF9hYm92ZTogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0lOQ1JFRihwbyk7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBvOwpAQCAtMjMxLDE5ICsyMzEsMTkgQEAKIHsKICAgICBQQU5FTCAqcGFuOwogICAgIFB5Q3Vyc2VzUGFuZWxPYmplY3QgKnBvOwotICAgIAorCiAgICAgcGFuID0gcGFuZWxfYmVsb3coc2VsZi0+cGFuKTsKLSAgICAKLSAgICBpZiAocGFuID09IE5VTEwpIHsJCS8qIHZhbGlkIG91dHB1dCwgaXQgbWVhbnMgdGhlIGNhbGxpbmcgcGFuZWwKLQkJCQkgICBpcyBvbiB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAqLwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKworICAgIGlmIChwYW4gPT0gTlVMTCkgeyAgICAgICAgICAvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zIHRoZSBjYWxsaW5nIHBhbmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9uIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfQogICAgIHBvID0gZmluZF9wbyhwYW4pOwogICAgIGlmIChwbyA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0lOQ1JFRihwbyk7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBvOwpAQCAtMjYyLDI2ICsyNjIsMjYgQEAKICAgICBQeUN1cnNlc1BhbmVsT2JqZWN0ICpwbzsKICAgICBQeUN1cnNlc1dpbmRvd09iamVjdCAqdGVtcDsKICAgICBpbnQgcnRuOwotICAgIAorCiAgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSAhPSAxKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlcGxhY2UgcmVxdWlyZXMgb25lIGFyZ3VtZW50Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZXBsYWNlIHJlcXVpcmVzIG9uZSBhcmd1bWVudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITt3aW5kb3cgb2JqZWN0IiwKLQkJCSAgJlB5Q3Vyc2VzV2luZG93X1R5cGUsICZ0ZW1wKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5Q3Vyc2VzV2luZG93X1R5cGUsICZ0ZW1wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBwbyA9IGZpbmRfcG8oc2VsZi0+cGFuKTsKICAgICBpZiAocG8gPT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkicmVwbGFjZV9wYW5lbDogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlX3BhbmVsOiBjYW4ndCBmaW5kIFBhbmVsIE9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBydG4gPSByZXBsYWNlX3BhbmVsKHNlbGYtPnBhbiwgdGVtcC0+d2luKTsKICAgICBpZiAocnRuID09IEVSUikgewotCVB5RXJyX1NldFN0cmluZyhQeUN1cnNlc0Vycm9yLCAicmVwbGFjZV9wYW5lbCgpIHJldHVybmVkIEVSUiIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlDdXJzZXNFcnJvciwgInJlcGxhY2VfcGFuZWwoKSByZXR1cm5lZCBFUlIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0RFQ1JFRihwby0+d28pOwogICAgIHBvLT53byA9IHRlbXA7CkBAIC0zMDIsMTEgKzMwMiwxMSBAQAogUHlDdXJzZXNQYW5lbF91c2VycHRyKFB5Q3Vyc2VzUGFuZWxPYmplY3QgKnNlbGYpCiB7CiAgICAgUHlPYmplY3QgKm9iajsKLSAgICBQeUN1cnNlc0luaXRpYWxpc2VkOyAKKyAgICBQeUN1cnNlc0luaXRpYWxpc2VkOwogICAgIG9iaiA9IChQeU9iamVjdCAqKSBwYW5lbF91c2VycHRyKHNlbGYtPnBhbik7CiAgICAgaWYgKG9iaiA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5Q3Vyc2VzRXJyb3IsICJubyB1c2VycHRyIHNldCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlDdXJzZXNFcnJvciwgIm5vIHVzZXJwdHIgc2V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIFB5X0lOQ1JFRihvYmopOwpAQCAtMzI5LDcgKzMyOSw3IEBACiAgICAgeyJ0b3AiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pUHlDdXJzZXNQYW5lbF90b3BfcGFuZWwsIE1FVEhfTk9BUkdTfSwKICAgICB7InVzZXJwdHIiLCAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc1BhbmVsX3VzZXJwdHIsIE1FVEhfTk9BUkdTfSwKICAgICB7IndpbmRvdyIsICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc1BhbmVsX3dpbmRvdywgTUVUSF9OT0FSR1N9LAotICAgIHtOVUxMLAkJTlVMTH0gICAvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTM0MiwyMCArMzQyLDIwIEBACiAKIFB5VHlwZU9iamVjdCBQeUN1cnNlc1BhbmVsX1R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9jdXJzZXNfcGFuZWwuY3Vyc2VzIHBhbmVsIiwJLyp0cF9uYW1lKi8KLSAgICBzaXplb2YoUHlDdXJzZXNQYW5lbE9iamVjdCksCS8qdHBfYmFzaWNzaXplKi8KLSAgICAwLAkJCS8qdHBfaXRlbXNpemUqLworICAgICJfY3Vyc2VzX3BhbmVsLmN1cnNlcyBwYW5lbCIsICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5Q3Vyc2VzUGFuZWxPYmplY3QpLCAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwogICAgIChkZXN0cnVjdG9yKVB5Q3Vyc2VzUGFuZWxfRGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLSAgICAwLAkJCS8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCiAgICAgKGdldGF0dHJmdW5jKVB5Q3Vyc2VzUGFuZWxfR2V0QXR0ciwgLyp0cF9nZXRhdHRyKi8KICAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLSAgICAwLAkJCS8qdHBfY29tcGFyZSovCi0gICAgMCwJCQkvKnRwX3JlcHIqLwotICAgIDAsCQkJLyp0cF9hc19udW1iZXIqLwotICAgIDAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0gICAgMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotICAgIDAsCQkJLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KIH07CiAKIC8qIFdyYXBwZXIgZm9yIHBhbmVsX2Fib3ZlKE5VTEwpLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJvdHRvbQpAQCAtMzcyLDE2ICszNzIsMTYgQEAKIAogICAgIHBhbiA9IHBhbmVsX2Fib3ZlKE5VTEwpOwogCi0gICAgaWYgKHBhbiA9PSBOVUxMKSB7CQkvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zCi0JCQkJICAgdGhlcmUncyBubyBwYW5lbCBhdCBhbGwgKi8gIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAocGFuID09IE5VTEwpIHsgICAgICAgICAgLyogdmFsaWQgb3V0cHV0LCBpdCBtZWFucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSdzIG5vIHBhbmVsIGF0IGFsbCAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgIH0KICAgICBwbyA9IGZpbmRfcG8ocGFuKTsKICAgICBpZiAocG8gPT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkicGFuZWxfYWJvdmU6IGNhbid0IGZpbmQgUGFuZWwgT2JqZWN0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicGFuZWxfYWJvdmU6IGNhbid0IGZpbmQgUGFuZWwgT2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBQeV9JTkNSRUYocG8pOwogICAgIHJldHVybiAoUHlPYmplY3QgKilwbzsKQEAgLTM5Nyw4ICszOTcsOCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBwYW4gPSBuZXdfcGFuZWwod2luLT53aW4pOwogICAgIGlmIChwYW4gPT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUN1cnNlc0Vycm9yLCBjYXRjaGFsbF9OVUxMKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5Q3Vyc2VzRXJyb3IsIGNhdGNoYWxsX05VTEwpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKVB5Q3Vyc2VzUGFuZWxfTmV3KHBhbiwgd2luKTsKIH0KQEAgLTQxMywyOCArNDEzLDI4IEBACiB7CiAgICAgUEFORUwgKnBhbjsKICAgICBQeUN1cnNlc1BhbmVsT2JqZWN0ICpwbzsKLSAgICAKKwogICAgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQ7CiAKICAgICBwYW4gPSBwYW5lbF9iZWxvdyhOVUxMKTsKIAotICAgIGlmIChwYW4gPT0gTlVMTCkgewkJLyogdmFsaWQgb3V0cHV0LCBpdCBtZWFucwotCQkJCSAgIHRoZXJlJ3Mgbm8gcGFuZWwgYXQgYWxsICovCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChwYW4gPT0gTlVMTCkgeyAgICAgICAgICAvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlJ3Mgbm8gcGFuZWwgYXQgYWxsICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfQogICAgIHBvID0gZmluZF9wbyhwYW4pOwogICAgIGlmIChwbyA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0lOQ1JFRihwbyk7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlB5Q3Vyc2VzX3VwZGF0ZV9wYW5lbHMoUHlPYmplY3QgKnNlbGYpCi17IAorewogICAgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQ7CiAgICAgdXBkYXRlX3BhbmVscygpOwogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKQEAgLTQ0OSw3ICs0NDksNyBAQAogICAgIHsibmV3X3BhbmVsIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19uZXdfcGFuZWwsICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsidG9wX3BhbmVsIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc190b3BfcGFuZWwsICAgICBNRVRIX05PQVJHU30sCiAgICAgeyJ1cGRhdGVfcGFuZWxzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKVB5Q3Vyc2VzX3VwZGF0ZV9wYW5lbHMsIE1FVEhfTk9BUkdTfSwKLSAgICB7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1vZHVsZSAqLwpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCiAgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9jdXJzZXNfcGFuZWwiLCBQeUN1cnNlc19tZXRob2RzKTsKICAgICBpZiAobSA9PSBOVUxMKQotICAgIAlyZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKIAogICAgIC8qIEZvciBleGNlcHRpb24gX2N1cnNlc19wYW5lbC5lcnJvciAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMgYi9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYwppbmRleCA5MmZhNGNiLi41NzJlN2ZmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYworKysgYi9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAotLyogX2Z1bmN0b29scyBtb2R1bGUgd3JpdHRlbiBhbmQgbWFpbnRhaW5lZCAKKy8qIF9mdW5jdG9vbHMgbW9kdWxlIHdyaXR0ZW4gYW5kIG1haW50YWluZWQKICAgIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KICAgIHdpdGggYWRhcHRhdGlvbnMgYnkgUmF5bW9uZCBIZXR0aW5nZXIgPHB5dGhvbkByY24uY29tPgogICAgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1LCAyMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgpAQCAtMTQsNjQgKzE0LDY0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZnVuY3Rvb2xzX3JlZHVjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNlcSwgKmZ1bmMsICpyZXN1bHQgPSBOVUxMLCAqaXQ7CisgICAgUHlPYmplY3QgKnNlcSwgKmZ1bmMsICpyZXN1bHQgPSBOVUxMLCAqaXQ7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWR1Y2UiLCAyLCAzLCAmZnVuYywgJnNlcSwgJnJlc3VsdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChyZXN1bHQgIT0gTlVMTCkKLQkJUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVkdWNlIiwgMiwgMywgJmZ1bmMsICZzZXEsICZyZXN1bHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpCisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOwogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICJyZWR1Y2UoKSBhcmcgMiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIik7Ci0JCVB5X1hERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAicmVkdWNlKCkgYXJnIDIgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIpOworICAgICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICgoYXJncyA9IFB5VHVwbGVfTmV3KDIpKSA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgaWYgKChhcmdzID0gUHlUdXBsZV9OZXcoMikpID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCWZvciAoOzspIHsKLQkJUHlPYmplY3QgKm9wMjsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5T2JqZWN0ICpvcDI7CiAKLQkJaWYgKGFyZ3MtPm9iX3JlZmNudCA+IDEpIHsKLQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJCWlmICgoYXJncyA9IFB5VHVwbGVfTmV3KDIpKSA9PSBOVUxMKQotCQkJCWdvdG8gRmFpbDsKLQkJfQorICAgICAgICBpZiAoYXJncy0+b2JfcmVmY250ID4gMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgaWYgKChhcmdzID0gUHlUdXBsZV9OZXcoMikpID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CiAKLQkJb3AyID0gUHlJdGVyX05leHQoaXQpOwotCQlpZiAob3AyID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gRmFpbDsKLSAJCQlicmVhazsKLQkJfQorICAgICAgICBvcDIgPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgIGlmIChvcDIgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQlyZXN1bHQgPSBvcDI7Ci0JCWVsc2UgewotCQkJUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDAsIHJlc3VsdCk7Ci0JCQlQeVR1cGxlX1NldEl0ZW0oYXJncywgMSwgb3AyKTsKLQkJCWlmICgocmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncykpID09IE5VTEwpCi0JCQkJZ290byBGYWlsOwotCQl9Ci0JfQorICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXN1bHQgPSBvcDI7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDAsIHJlc3VsdCk7CisgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgMSwgb3AyKTsKKyAgICAgICAgICAgIGlmICgocmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncykpID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgfQogCi0JUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKIAotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICJyZWR1Y2UoKSBvZiBlbXB0eSBzZXF1ZW5jZSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgInJlZHVjZSgpIG9mIGVtcHR5IHNlcXVlbmNlIHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpOwogCi0JUHlfREVDUkVGKGl0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogRmFpbDoKLQlQeV9YREVDUkVGKGFyZ3MpOwotCVB5X1hERUNSRUYocmVzdWx0KTsKLQlQeV9ERUNSRUYoaXQpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihyZWR1Y2VfZG9jLApAQCAtOTAsMTIgKzkwLDEyIEBACiAvKiBwYXJ0aWFsIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpmbjsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqa3c7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZm47CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmt3OworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KIH0gcGFydGlhbG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwYXJ0aWFsX3R5cGU7CkBAIC0xMDMsMTc1ICsxMDMsMTc1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcGFydGlhbF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpmdW5jOwotCXBhcnRpYWxvYmplY3QgKnB0bzsKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBwYXJ0aWFsb2JqZWN0ICpwdG87CiAKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidHlwZSAncGFydGlhbCcgdGFrZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlICdwYXJ0aWFsJyB0YWtlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZnVuYyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBmdW5jID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBjcmVhdGUgcGFydGlhbG9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlwdG8gPSAocGFydGlhbG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChwdG8gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogY3JlYXRlIHBhcnRpYWxvYmplY3Qgc3RydWN0dXJlICovCisgICAgcHRvID0gKHBhcnRpYWxvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAocHRvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcHRvLT5mbiA9IGZ1bmM7Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCXB0by0+YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgUFlfU1NJWkVfVF9NQVgpOwotCWlmIChwdG8tPmFyZ3MgPT0gTlVMTCkgewotCQlwdG8tPmt3ID0gTlVMTDsKLQkJUHlfREVDUkVGKHB0byk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoa3cgIT0gTlVMTCkgewotCQlwdG8tPmt3ID0gUHlEaWN0X0NvcHkoa3cpOwotCQlpZiAocHRvLT5rdyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocHRvKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHRvLT5rdyA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQl9CisgICAgcHRvLT5mbiA9IGZ1bmM7CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIHB0by0+YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgUFlfU1NJWkVfVF9NQVgpOworICAgIGlmIChwdG8tPmFyZ3MgPT0gTlVMTCkgeworICAgICAgICBwdG8tPmt3ID0gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKHB0byk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoa3cgIT0gTlVMTCkgeworICAgICAgICBwdG8tPmt3ID0gUHlEaWN0X0NvcHkoa3cpOworICAgICAgICBpZiAocHRvLT5rdyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocHRvKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRvLT5rdyA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICB9CiAKLQlwdG8tPndlYWtyZWZsaXN0ID0gTlVMTDsKLQlwdG8tPmRpY3QgPSBOVUxMOworICAgIHB0by0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIHB0by0+ZGljdCA9IE5VTEw7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopcHRvOworICAgIHJldHVybiAoUHlPYmplY3QgKilwdG87CiB9CiAKIHN0YXRpYyB2b2lkCiBwYXJ0aWFsX2RlYWxsb2MocGFydGlhbG9iamVjdCAqcHRvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2socHRvKTsKLQlpZiAocHRvLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBwdG8pOwotCVB5X1hERUNSRUYocHRvLT5mbik7Ci0JUHlfWERFQ1JFRihwdG8tPmFyZ3MpOwotCVB5X1hERUNSRUYocHRvLT5rdyk7Ci0JUHlfWERFQ1JFRihwdG8tPmRpY3QpOwotCVB5X1RZUEUocHRvKS0+dHBfZnJlZShwdG8pOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2socHRvKTsKKyAgICBpZiAocHRvLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBwdG8pOworICAgIFB5X1hERUNSRUYocHRvLT5mbik7CisgICAgUHlfWERFQ1JFRihwdG8tPmFyZ3MpOworICAgIFB5X1hERUNSRUYocHRvLT5rdyk7CisgICAgUHlfWERFQ1JFRihwdG8tPmRpY3QpOworICAgIFB5X1RZUEUocHRvKS0+dHBfZnJlZShwdG8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcGFydGlhbF9jYWxsKHBhcnRpYWxvYmplY3QgKnB0bywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmV0OwotCVB5T2JqZWN0ICphcmdhcHBsID0gTlVMTCwgKmt3YXBwbCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJldDsKKyAgICBQeU9iamVjdCAqYXJnYXBwbCA9IE5VTEwsICprd2FwcGwgPSBOVUxMOwogCi0JYXNzZXJ0IChQeUNhbGxhYmxlX0NoZWNrKHB0by0+Zm4pKTsKLQlhc3NlcnQgKFB5VHVwbGVfQ2hlY2socHRvLT5hcmdzKSk7Ci0JYXNzZXJ0IChwdG8tPmt3ID09IFB5X05vbmUgIHx8ICBQeURpY3RfQ2hlY2socHRvLT5rdykpOworICAgIGFzc2VydCAoUHlDYWxsYWJsZV9DaGVjayhwdG8tPmZuKSk7CisgICAgYXNzZXJ0IChQeVR1cGxlX0NoZWNrKHB0by0+YXJncykpOworICAgIGFzc2VydCAocHRvLT5rdyA9PSBQeV9Ob25lICB8fCAgUHlEaWN0X0NoZWNrKHB0by0+a3cpKTsKIAotCWlmIChQeVR1cGxlX0dFVF9TSVpFKHB0by0+YXJncykgPT0gMCkgewotCQlhcmdhcHBsID0gYXJnczsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCX0gZWxzZSBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKSB7Ci0JCWFyZ2FwcGwgPSBwdG8tPmFyZ3M7Ci0JCVB5X0lOQ1JFRihwdG8tPmFyZ3MpOwotCX0gZWxzZSB7Ci0JCWFyZ2FwcGwgPSBQeVNlcXVlbmNlX0NvbmNhdChwdG8tPmFyZ3MsIGFyZ3MpOwotCQlpZiAoYXJnYXBwbCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKHB0by0+YXJncykgPT0gMCkgeworICAgICAgICBhcmdhcHBsID0gYXJnczsKKyAgICAgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgIH0gZWxzZSBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKSB7CisgICAgICAgIGFyZ2FwcGwgPSBwdG8tPmFyZ3M7CisgICAgICAgIFB5X0lOQ1JFRihwdG8tPmFyZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFyZ2FwcGwgPSBQeVNlcXVlbmNlX0NvbmNhdChwdG8tPmFyZ3MsIGFyZ3MpOworICAgICAgICBpZiAoYXJnYXBwbCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHB0by0+a3cgPT0gUHlfTm9uZSkgewotCQlrd2FwcGwgPSBrdzsKLQkJUHlfWElOQ1JFRihrdyk7Ci0JfSBlbHNlIHsKLQkJa3dhcHBsID0gUHlEaWN0X0NvcHkocHRvLT5rdyk7Ci0JCWlmIChrd2FwcGwgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGFyZ2FwcGwpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGt3ICE9IE5VTEwpIHsKLQkJCWlmIChQeURpY3RfTWVyZ2Uoa3dhcHBsLCBrdywgMSkgIT0gMCkgewotCQkJCVB5X0RFQ1JFRihhcmdhcHBsKTsKLQkJCQlQeV9ERUNSRUYoa3dhcHBsKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KKyAgICBpZiAocHRvLT5rdyA9PSBQeV9Ob25lKSB7CisgICAgICAgIGt3YXBwbCA9IGt3OworICAgICAgICBQeV9YSU5DUkVGKGt3KTsKKyAgICB9IGVsc2UgeworICAgICAgICBrd2FwcGwgPSBQeURpY3RfQ29weShwdG8tPmt3KTsKKyAgICAgICAgaWYgKGt3YXBwbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJnYXBwbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoa3cgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RGljdF9NZXJnZShrd2FwcGwsIGt3LCAxKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ2FwcGwpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrd2FwcGwpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcmV0ID0gUHlPYmplY3RfQ2FsbChwdG8tPmZuLCBhcmdhcHBsLCBrd2FwcGwpOwotCVB5X0RFQ1JFRihhcmdhcHBsKTsKLQlQeV9YREVDUkVGKGt3YXBwbCk7Ci0JcmV0dXJuIHJldDsKKyAgICByZXQgPSBQeU9iamVjdF9DYWxsKHB0by0+Zm4sIGFyZ2FwcGwsIGt3YXBwbCk7CisgICAgUHlfREVDUkVGKGFyZ2FwcGwpOworICAgIFB5X1hERUNSRUYoa3dhcHBsKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50CiBwYXJ0aWFsX3RyYXZlcnNlKHBhcnRpYWxvYmplY3QgKnB0bywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQocHRvLT5mbik7Ci0JUHlfVklTSVQocHRvLT5hcmdzKTsKLQlQeV9WSVNJVChwdG8tPmt3KTsKLQlQeV9WSVNJVChwdG8tPmRpY3QpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHB0by0+Zm4pOworICAgIFB5X1ZJU0lUKHB0by0+YXJncyk7CisgICAgUHlfVklTSVQocHRvLT5rdyk7CisgICAgUHlfVklTSVQocHRvLT5kaWN0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKHBhcnRpYWxfZG9jLAogInBhcnRpYWwoZnVuYywgKmFyZ3MsICoqa2V5d29yZHMpIC0gbmV3IGZ1bmN0aW9uIHdpdGggcGFydGlhbCBhcHBsaWNhdGlvblxuXAotCW9mIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIGtleXdvcmRzLlxuIik7CisgICAgb2YgdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQga2V5d29yZHMuXG4iKTsKIAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YocGFydGlhbG9iamVjdCwgeCkKIHN0YXRpYyBQeU1lbWJlckRlZiBwYXJ0aWFsX21lbWJlcmxpc3RbXSA9IHsKLQl7ImZ1bmMiLAlUX09CSkVDVCwJT0ZGKGZuKSwJUkVBRE9OTFksCi0JICJmdW5jdGlvbiBvYmplY3QgdG8gdXNlIGluIGZ1dHVyZSBwYXJ0aWFsIGNhbGxzIn0sCi0JeyJhcmdzIiwJVF9PQkpFQ1QsCU9GRihhcmdzKSwJUkVBRE9OTFksCi0JICJ0dXBsZSBvZiBhcmd1bWVudHMgdG8gZnV0dXJlIHBhcnRpYWwgY2FsbHMifSwKLQl7ImtleXdvcmRzIiwJVF9PQkpFQ1QsCU9GRihrdyksCVJFQURPTkxZLAotCSAiZGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cyB0byBmdXR1cmUgcGFydGlhbCBjYWxscyJ9LAotCXtOVUxMfSAgLyogU2VudGluZWwgKi8KKyAgICB7ImZ1bmMiLCAgICAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoZm4pLCAgICAgICAgUkVBRE9OTFksCisgICAgICJmdW5jdGlvbiBvYmplY3QgdG8gdXNlIGluIGZ1dHVyZSBwYXJ0aWFsIGNhbGxzIn0sCisgICAgeyJhcmdzIiwgICAgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGFyZ3MpLCAgICAgIFJFQURPTkxZLAorICAgICAidHVwbGUgb2YgYXJndW1lbnRzIHRvIGZ1dHVyZSBwYXJ0aWFsIGNhbGxzIn0sCisgICAgeyJrZXl3b3JkcyIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGt3KSwgICAgICAgIFJFQURPTkxZLAorICAgICAiZGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cyB0byBmdXR1cmUgcGFydGlhbCBjYWxscyJ9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwYXJ0aWFsX2dldF9kaWN0KHBhcnRpYWxvYmplY3QgKnB0bykKIHsKLQlpZiAocHRvLT5kaWN0ID09IE5VTEwpIHsKLQkJcHRvLT5kaWN0ID0gUHlEaWN0X05ldygpOwotCQlpZiAocHRvLT5kaWN0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKHB0by0+ZGljdCk7Ci0JcmV0dXJuIHB0by0+ZGljdDsKKyAgICBpZiAocHRvLT5kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgcHRvLT5kaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAocHRvLT5kaWN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKHB0by0+ZGljdCk7CisgICAgcmV0dXJuIHB0by0+ZGljdDsKIH0KIAogc3RhdGljIGludAogcGFydGlhbF9zZXRfZGljdChwYXJ0aWFsb2JqZWN0ICpwdG8sIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqdG1wOworICAgIFB5T2JqZWN0ICp0bXA7CiAKLQkvKiBJdCBpcyBpbGxlZ2FsIHRvIGRlbCBwLl9fZGljdF9fICovCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYSBwYXJ0aWFsIG9iamVjdCdzIGRpY3Rpb25hcnkgbWF5IG5vdCBiZSBkZWxldGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogQ2FuIG9ubHkgc2V0IF9fZGljdF9fIHRvIGEgZGljdGlvbmFyeSAqLwotCWlmICghUHlEaWN0X0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzZXR0aW5nIHBhcnRpYWwgb2JqZWN0J3MgZGljdGlvbmFyeSB0byBhIG5vbi1kaWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdG1wID0gcHRvLT5kaWN0OwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JcHRvLT5kaWN0ID0gdmFsdWU7Ci0JUHlfWERFQ1JFRih0bXApOwotCXJldHVybiAwOworICAgIC8qIEl0IGlzIGlsbGVnYWwgdG8gZGVsIHAuX19kaWN0X18gKi8KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImEgcGFydGlhbCBvYmplY3QncyBkaWN0aW9uYXJ5IG1heSBub3QgYmUgZGVsZXRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIENhbiBvbmx5IHNldCBfX2RpY3RfXyB0byBhIGRpY3Rpb25hcnkgKi8KKyAgICBpZiAoIVB5RGljdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXR0aW5nIHBhcnRpYWwgb2JqZWN0J3MgZGljdGlvbmFyeSB0byBhIG5vbi1kaWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdG1wID0gcHRvLT5kaWN0OworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgcHRvLT5kaWN0ID0gdmFsdWU7CisgICAgUHlfWERFQ1JFRih0bXApOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgcGFydGlhbF9nZXRzZXRsaXN0W10gPSB7Ci0JeyJfX2RpY3RfXyIsIChnZXR0ZXIpcGFydGlhbF9nZXRfZGljdCwgKHNldHRlcilwYXJ0aWFsX3NldF9kaWN0fSwKLQl7TlVMTH0gLyogU2VudGluZWwgKi8KKyAgICB7Il9fZGljdF9fIiwgKGdldHRlcilwYXJ0aWFsX2dldF9kaWN0LCAoc2V0dGVyKXBhcnRpYWxfc2V0X2RpY3R9LAorICAgIHtOVUxMfSAvKiBTZW50aW5lbCAqLwogfTsKIAogLyogUGlja2xlIHN0cmF0ZWd5OgpAQCAtMjg0LDg1ICsyODQsODUgQEAKIFB5T2JqZWN0ICoKIHBhcnRpYWxfcmVkdWNlKHBhcnRpYWxvYmplY3QgKnB0bywgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPKShPT09PKSIsIFB5X1RZUEUocHRvKSwgcHRvLT5mbiwgcHRvLT5mbiwgCi0JCQkgICAgIHB0by0+YXJncywgcHRvLT5rdywKLQkJCSAgICAgcHRvLT5kaWN0ID8gcHRvLT5kaWN0IDogUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oTykoT09PTykiLCBQeV9UWVBFKHB0byksIHB0by0+Zm4sIHB0by0+Zm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRvLT5hcmdzLCBwdG8tPmt3LAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0by0+ZGljdCA/IHB0by0+ZGljdCA6IFB5X05vbmUpOwogfQogCiBQeU9iamVjdCAqCiBwYXJ0aWFsX3NldHN0YXRlKHBhcnRpYWxvYmplY3QgKnB0bywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZuLCAqZm5hcmdzLCAqa3csICpkaWN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiKE9PT08pOl9fc2V0c3RhdGVfXyIsIAotCQkJICAgICAgJmZuLCAmZm5hcmdzLCAma3csICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfWERFQ1JFRihwdG8tPmZuKTsKLQlQeV9YREVDUkVGKHB0by0+YXJncyk7Ci0JUHlfWERFQ1JFRihwdG8tPmt3KTsKLQlQeV9YREVDUkVGKHB0by0+ZGljdCk7Ci0JcHRvLT5mbiA9IGZuOwotCXB0by0+YXJncyA9IGZuYXJnczsKLQlwdG8tPmt3ID0ga3c7Ci0JaWYgKGRpY3QgIT0gUHlfTm9uZSkgewotCSAgcHRvLT5kaWN0ID0gZGljdDsKLQkgIFB5X0lOQ1JFRihkaWN0KTsKLQl9IGVsc2UgewotCSAgcHRvLT5kaWN0ID0gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGZuKTsKLQlQeV9JTkNSRUYoZm5hcmdzKTsKLQlQeV9JTkNSRUYoa3cpOwotCVB5X1JFVFVSTl9OT05FOworICAgIFB5T2JqZWN0ICpmbiwgKmZuYXJncywgKmt3LCAqZGljdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIihPT09PKTpfX3NldHN0YXRlX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm4sICZmbmFyZ3MsICZrdywgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKHB0by0+Zm4pOworICAgIFB5X1hERUNSRUYocHRvLT5hcmdzKTsKKyAgICBQeV9YREVDUkVGKHB0by0+a3cpOworICAgIFB5X1hERUNSRUYocHRvLT5kaWN0KTsKKyAgICBwdG8tPmZuID0gZm47CisgICAgcHRvLT5hcmdzID0gZm5hcmdzOworICAgIHB0by0+a3cgPSBrdzsKKyAgICBpZiAoZGljdCAhPSBQeV9Ob25lKSB7CisgICAgICBwdG8tPmRpY3QgPSBkaWN0OworICAgICAgUHlfSU5DUkVGKGRpY3QpOworICAgIH0gZWxzZSB7CisgICAgICBwdG8tPmRpY3QgPSBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZm4pOworICAgIFB5X0lOQ1JFRihmbmFyZ3MpOworICAgIFB5X0lOQ1JFRihrdyk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBwYXJ0aWFsX21ldGhvZHNbXSA9IHsKLQl7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pcGFydGlhbF9yZWR1Y2UsIE1FVEhfTk9BUkdTfSwKLQl7Il9fc2V0c3RhdGVfXyIsIChQeUNGdW5jdGlvbilwYXJ0aWFsX3NldHN0YXRlLCBNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKXBhcnRpYWxfcmVkdWNlLCBNRVRIX05PQVJHU30sCisgICAgeyJfX3NldHN0YXRlX18iLCAoUHlDRnVuY3Rpb24pcGFydGlhbF9zZXRzdGF0ZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwYXJ0aWFsX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImZ1bmN0b29scy5wYXJ0aWFsIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YocGFydGlhbG9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilwYXJ0aWFsX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKXBhcnRpYWxfY2FsbCwJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLAkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsCS8qIHRwX2ZsYWdzICovCi0JcGFydGlhbF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylwYXJ0aWFsX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihwYXJ0aWFsb2JqZWN0LCB3ZWFrcmVmbGlzdCksCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JcGFydGlhbF9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLwotCXBhcnRpYWxfbWVtYmVybGlzdCwJCS8qIHRwX21lbWJlcnMgKi8KLQlwYXJ0aWFsX2dldHNldGxpc3QsCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCW9mZnNldG9mKHBhcnRpYWxvYmplY3QsIGRpY3QpLAkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JcGFydGlhbF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJmdW5jdG9vbHMucGFydGlhbCIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YocGFydGlhbG9iamVjdCksICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilwYXJ0aWFsX2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYylwYXJ0aWFsX2NhbGwsICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHBhcnRpYWxfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpcGFydGlhbF90cmF2ZXJzZSwgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKHBhcnRpYWxvYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBwYXJ0aWFsX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgcGFydGlhbF9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIHBhcnRpYWxfZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgb2Zmc2V0b2YocGFydGlhbG9iamVjdCwgZGljdCksICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHBhcnRpYWxfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMzcyLDMxICszNzIsMzEgQEAKICJUb29scyB0aGF0IG9wZXJhdGUgb24gZnVuY3Rpb25zLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKLSAJeyJyZWR1Y2UiLAlmdW5jdG9vbHNfcmVkdWNlLCAgICAgTUVUSF9WQVJBUkdTLCByZWR1Y2VfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InJlZHVjZSIsICAgICAgICAgIGZ1bmN0b29sc19yZWR1Y2UsICAgICBNRVRIX1ZBUkFSR1MsIHJlZHVjZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdF9mdW5jdG9vbHModm9pZCkKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqbTsKLQljaGFyICpuYW1lOwotCVB5VHlwZU9iamVjdCAqdHlwZWxpc3RbXSA9IHsKLQkJJnBhcnRpYWxfdHlwZSwKLQkJTlVMTAotCX07CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKm07CisgICAgY2hhciAqbmFtZTsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGVsaXN0W10gPSB7CisgICAgICAgICZwYXJ0aWFsX3R5cGUsCisgICAgICAgIE5VTEwKKyAgICB9OwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJfZnVuY3Rvb2xzIiwgbW9kdWxlX21ldGhvZHMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl9mdW5jdG9vbHMiLCBtb2R1bGVfbWV0aG9kcywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JZm9yIChpPTAgOyB0eXBlbGlzdFtpXSAhPSBOVUxMIDsgaSsrKSB7Ci0JCWlmIChQeVR5cGVfUmVhZHkodHlwZWxpc3RbaV0pIDwgMCkKLQkJCXJldHVybjsKLQkJbmFtZSA9IHN0cmNocih0eXBlbGlzdFtpXS0+dHBfbmFtZSwgJy4nKTsKLQkJYXNzZXJ0IChuYW1lICE9IE5VTEwpOwotCQlQeV9JTkNSRUYodHlwZWxpc3RbaV0pOwotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgbmFtZSsxLCAoUHlPYmplY3QgKil0eXBlbGlzdFtpXSk7Ci0JfQorICAgIGZvciAoaT0wIDsgdHlwZWxpc3RbaV0gIT0gTlVMTCA7IGkrKykgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHR5cGVsaXN0W2ldKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG5hbWUgPSBzdHJjaHIodHlwZWxpc3RbaV0tPnRwX25hbWUsICcuJyk7CisgICAgICAgIGFzc2VydCAobmFtZSAhPSBOVUxMKTsKKyAgICAgICAgUHlfSU5DUkVGKHR5cGVsaXN0W2ldKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sIG5hbWUrMSwgKFB5T2JqZWN0ICopdHlwZWxpc3RbaV0pOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2hhc2hvcGVuc3NsLmMgYi9Nb2R1bGVzL19oYXNob3BlbnNzbC5jCmluZGV4IDNlOTcyZDEuLmFhOWRkNGUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2hhc2hvcGVuc3NsLmMKKysrIGIvTW9kdWxlcy9faGFzaG9wZW5zc2wuYwpAQCAtMTk3LDIxICsxOTcsMjEgQEAKICAgICAvKiAobm90IGEgcHJvYmxlbSBiZWNhdXNlIHdlIGhvbGQgdGhlIEdJTCBieSBkZWZhdWx0KSAqLwogICAgIHJldHZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGRpZ2VzdF9zaXplICogMik7CiAgICAgaWYgKCFyZXR2YWwpCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaGV4X2RpZ2VzdCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJldHZhbCk7CiAgICAgaWYgKCFoZXhfZGlnZXN0KSB7Ci0JICAgIFB5X0RFQ1JFRihyZXR2YWwpOwotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgLyogTWFrZSBoZXggdmVyc2lvbiBvZiB0aGUgZGlnZXN0ICovCiAgICAgZm9yKGk9aj0wOyBpPGRpZ2VzdF9zaXplOyBpKyspIHsKICAgICAgICAgY2hhciBjOwogICAgICAgICBjID0gKGRpZ2VzdFtpXSA+PiA0KSAmIDB4ZjsKLQljID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CisgICAgICAgIGMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKICAgICAgICAgaGV4X2RpZ2VzdFtqKytdID0gYzsKICAgICAgICAgYyA9IChkaWdlc3RbaV0gJiAweGYpOwotCWMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwogICAgICAgICBoZXhfZGlnZXN0W2orK10gPSBjOwogICAgIH0KICAgICByZXR1cm4gcmV0dmFsOwpAQCAtMjUzLDExICsyNTMsMTEgQEAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEVWUF9tZXRob2RzW10gPSB7Ci0gICAgeyJ1cGRhdGUiLAkgIChQeUNGdW5jdGlvbilFVlBfdXBkYXRlLCAgICBNRVRIX1ZBUkFSR1MsIEVWUF91cGRhdGVfX2RvY19ffSwKLSAgICB7ImRpZ2VzdCIsCSAgKFB5Q0Z1bmN0aW9uKUVWUF9kaWdlc3QsICAgIE1FVEhfTk9BUkdTLCAgRVZQX2RpZ2VzdF9fZG9jX199LAorICAgIHsidXBkYXRlIiwgICAgKFB5Q0Z1bmN0aW9uKUVWUF91cGRhdGUsICAgIE1FVEhfVkFSQVJHUywgRVZQX3VwZGF0ZV9fZG9jX199LAorICAgIHsiZGlnZXN0IiwgICAgKFB5Q0Z1bmN0aW9uKUVWUF9kaWdlc3QsICAgIE1FVEhfTk9BUkdTLCAgRVZQX2RpZ2VzdF9fZG9jX199LAogICAgIHsiaGV4ZGlnZXN0IiwgKFB5Q0Z1bmN0aW9uKUVWUF9oZXhkaWdlc3QsIE1FVEhfTk9BUkdTLCAgRVZQX2hleGRpZ2VzdF9fZG9jX199LAotICAgIHsiY29weSIsCSAgKFB5Q0Z1bmN0aW9uKUVWUF9jb3B5LCAgICAgIE1FVEhfTk9BUkdTLCAgRVZQX2NvcHlfX2RvY19ffSwKLSAgICB7TlVMTCwJICBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImNvcHkiLCAgICAgIChQeUNGdW5jdGlvbilFVlBfY29weSwgICAgICBNRVRIX05PQVJHUywgIEVWUF9jb3B5X19kb2NfX30sCisgICAge05VTEwsICAgICAgICBOVUxMfSAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMzI2LDE0ICszMjYsMTQgQEAKIAogICAgIGlmICghUHlBcmdfUGFyc2UobmFtZV9vYmosICJzIiwgJm5hbWVTdHIpKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICBkaWdlc3QgPSBFVlBfZ2V0X2RpZ2VzdGJ5bmFtZShuYW1lU3RyKTsKICAgICBpZiAoIWRpZ2VzdCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInVua25vd24gaGFzaCBmdW5jdGlvbiIpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBFVlBfRGlnZXN0SW5pdCgmc2VsZi0+Y3R4LCBkaWdlc3QpOwpAQCAtMzc2LDExICszNzYsMTEgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgRVZQdHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAiX2hhc2hsaWIuSEFTSCIsICAgIC8qdHBfbmFtZSovCi0gICAgc2l6ZW9mKEVWUG9iamVjdCksCS8qdHBfYmFzaWNzaXplKi8KLSAgICAwLAkJCS8qdHBfaXRlbXNpemUqLworICAgIHNpemVvZihFVlBvYmplY3QpLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKUVWUF9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotICAgIDAsCQkJLyp0cF9wcmludCovCisgICAgKGRlc3RydWN0b3IpRVZQX2RlYWxsb2MsICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KQEAgLTM5NywxMyArMzk3LDEzIEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCiAgICAgaGFzaHR5cGVfZG9jLCAgICAgICAvKnRwX2RvYyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAwLAkJCS8qdHBfY2xlYXIqLwotICAgIDAsCQkJLyp0cF9yaWNoY29tcGFyZSovCi0gICAgMCwJCQkvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAwLAkJCS8qdHBfaXRlciovCi0gICAgMCwJCQkvKnRwX2l0ZXJuZXh0Ki8KLSAgICBFVlBfbWV0aG9kcywJLyogdHBfbWV0aG9kcyAqLwotICAgIEVWUF9tZW1iZXJzLAkvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgRVZQX21ldGhvZHMsICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgRVZQX21lbWJlcnMsICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgRVZQX2dldHNldGVycywgICAgICAvKiB0cF9nZXRzZXQgKi8KICNpZiAxCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCkBAIC00ODQsNyArNDg0LDcgQEAKICAgICBkaWdlc3QgPSBFVlBfZ2V0X2RpZ2VzdGJ5bmFtZShuYW1lKTsKIAogICAgIHJldF9vYmogPSBFVlBuZXcobmFtZV9vYmosIGRpZ2VzdCwgTlVMTCwgKHVuc2lnbmVkIGNoYXIqKXZpZXcuYnVmLAotCQkgICAgIHZpZXcubGVuKTsKKyAgICAgICAgICAgICAgICAgICAgIHZpZXcubGVuKTsKICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKIAogICAgIHJldHVybiByZXRfb2JqOwpAQCAtNTA4LDEyICs1MDgsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOyBcCiAgICAgICAgIH0gXAogICAgICBcCi0JcmV0X29iaiA9IEVWUG5ldyggXAotCQkgICAgQ09OU1RfICMjIE5BTUUgIyMgX25hbWVfb2JqLCBcCi0JCSAgICBOVUxMLCBcCi0JCSAgICBDT05TVF9uZXdfICMjIE5BTUUgIyMgX2N0eF9wLCBcCi0JCSAgICAodW5zaWduZWQgY2hhciopdmlldy5idWYsIHZpZXcubGVuKTsgXAotCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOyBcCisgICAgICAgIHJldF9vYmogPSBFVlBuZXcoIFwKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RfICMjIE5BTUUgIyMgX25hbWVfb2JqLCBcCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIFwKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RfbmV3XyAjIyBOQU1FICMjIF9jdHhfcCwgXAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciopdmlldy5idWYsIHZpZXcubGVuKTsgXAorICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsgXAogICAgICAgICByZXR1cm4gcmV0X29iajsgXAogICAgIH0KIApAQCAtNTU0LDcgKzU1NCw3IEBACiAgICAgQ09OU1RSVUNUT1JfTUVUSF9ERUYoc2hhMzg0KSwKICAgICBDT05TVFJVQ1RPUl9NRVRIX0RFRihzaGE1MTIpLAogI2VuZGlmCi0gICAge05VTEwsCU5VTEx9CQkgLyogU2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICBOVUxMfSAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMgYi9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jCmluZGV4IDRmZDBkZDUuLmY3MDVlYzEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9faGVhcHFtb2R1bGUuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIERyb3AgaW4gcmVwbGFjZW1lbnQgZm9yIGhlYXBxLnB5IAorLyogRHJvcCBpbiByZXBsYWNlbWVudCBmb3IgaGVhcHEucHkKIAogQyBpbXBsZW1lbnRhdGlvbiBkZXJpdmVkIGRpcmVjdGx5IGZyb20gaGVhcHEucHkgaW4gUHkyLjMKIHdoaWNoIHdhcyB3cml0dGVuIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycywKQEAgLTE2LDEyOCArMTYsMTI4IEBACiBzdGF0aWMgaW50CiBjbXBfbHQoUHlPYmplY3QgKngsIFB5T2JqZWN0ICp5KQogewotCWludCBjbXA7Ci0Jc3RhdGljIFB5T2JqZWN0ICpsdCA9IE5VTEw7CisgICAgaW50IGNtcDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmx0ID0gTlVMTDsKIAotCWlmIChsdCA9PSBOVUxMKSB7Ci0JCWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX19sdF9fIik7Ci0JCWlmIChsdCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlPYmplY3RfSGFzQXR0cih4LCBsdCkpCi0JCXJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgUHlfTFQpOwotCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh5LCB4LCBQeV9MRSk7Ci0JaWYgKGNtcCAhPSAtMSkKLQkJY21wID0gMSAtIGNtcDsKLQlyZXR1cm4gY21wOworICAgIGlmIChsdCA9PSBOVUxMKSB7CisgICAgICAgIGx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX19sdF9fIik7CisgICAgICAgIGlmIChsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfSGFzQXR0cih4LCBsdCkpCisgICAgICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgUHlfTFQpOworICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh5LCB4LCBQeV9MRSk7CisgICAgaWYgKGNtcCAhPSAtMSkKKyAgICAgICAgY21wID0gMSAtIGNtcDsKKyAgICByZXR1cm4gY21wOwogfQogCiBzdGF0aWMgaW50CiBfc2lmdGRvd24oUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IHBvcykKIHsKLQlQeU9iamVjdCAqbmV3aXRlbSwgKnBhcmVudDsKLQlpbnQgY21wOwotCVB5X3NzaXplX3QgcGFyZW50cG9zOworICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqcGFyZW50OworICAgIGludCBjbXA7CisgICAgUHlfc3NpemVfdCBwYXJlbnRwb3M7CiAKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKLQlpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOworICAgIGlmIChwb3MgPj0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQluZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7Ci0JUHlfSU5DUkVGKG5ld2l0ZW0pOwotCS8qIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nCi0JICAgYSBwbGFjZSBuZXdpdGVtIGZpdHMuICovCi0Jd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKXsKLQkJcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7Ci0JCXBhcmVudCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwYXJlbnRwb3MpOwotCQljbXAgPSBjbXBfbHQobmV3aXRlbSwgcGFyZW50KTsKLQkJaWYgKGNtcCA9PSAtMSkgewotCQkJUHlfREVDUkVGKG5ld2l0ZW0pOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChjbXAgPT0gMCkKLQkJCWJyZWFrOwotCQlQeV9JTkNSRUYocGFyZW50KTsKLQkJUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKLQkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsKLQkJcG9zID0gcGFyZW50cG9zOwotCX0KLQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwotCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwotCXJldHVybiAwOworICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKKyAgICBQeV9JTkNSRUYobmV3aXRlbSk7CisgICAgLyogRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcKKyAgICAgICBhIHBsYWNlIG5ld2l0ZW0gZml0cy4gKi8KKyAgICB3aGlsZSAocG9zID4gc3RhcnRwb3MpeworICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTsKKyAgICAgICAgcGFyZW50ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBhcmVudHBvcyk7CisgICAgICAgIGNtcCA9IGNtcF9sdChuZXdpdGVtLCBwYXJlbnQpOworICAgICAgICBpZiAoY21wID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIFB5X0lOQ1JFRihwYXJlbnQpOworICAgICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBwYXJlbnQpOworICAgICAgICBwb3MgPSBwYXJlbnRwb3M7CisgICAgfQorICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIF9zaWZ0dXAoUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHBvcykKIHsKLQlQeV9zc2l6ZV90IHN0YXJ0cG9zLCBlbmRwb3MsIGNoaWxkcG9zLCByaWdodHBvczsKLQlpbnQgY21wOwotCVB5T2JqZWN0ICpuZXdpdGVtLCAqdG1wOworICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIGVuZHBvcywgY2hpbGRwb3MsIHJpZ2h0cG9zOworICAgIGludCBjbXA7CisgICAgUHlPYmplY3QgKm5ld2l0ZW0sICp0bXA7CiAKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKLQllbmRwb3MgPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7Ci0Jc3RhcnRwb3MgPSBwb3M7Ci0JaWYgKHBvcyA+PSBlbmRwb3MpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQluZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7Ci0JUHlfSU5DUkVGKG5ld2l0ZW0pOworICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOworICAgIGVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKKyAgICBzdGFydHBvcyA9IHBvczsKKyAgICBpZiAocG9zID49IGVuZHBvcykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKKyAgICBQeV9JTkNSRUYobmV3aXRlbSk7CiAKLQkvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovCi0JY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwotCXdoaWxlIChjaGlsZHBvcyA8IGVuZHBvcykgewotCQkvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwotCQlyaWdodHBvcyA9IGNoaWxkcG9zICsgMTsKLQkJaWYgKHJpZ2h0cG9zIDwgZW5kcG9zKSB7Ci0JCQljbXAgPSBjbXBfbHQoCi0JCQkJUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSwKLQkJCQlQeUxpc3RfR0VUX0lURU0oaGVhcCwgcmlnaHRwb3MpKTsKLQkJCWlmIChjbXAgPT0gLTEpIHsKLQkJCQlQeV9ERUNSRUYobmV3aXRlbSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKGNtcCA9PSAwKQotCQkJCWNoaWxkcG9zID0gcmlnaHRwb3M7Ci0JCX0KLQkJLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KLQkJdG1wID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKTsKLQkJUHlfSU5DUkVGKHRtcCk7Ci0JCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7Ci0JCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHRtcCk7Ci0JCXBvcyA9IGNoaWxkcG9zOwotCQljaGlsZHBvcyA9IDIqcG9zICsgMTsKLQl9CisgICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLworICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KKyAgICB3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsKKyAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KKyAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7CisgICAgICAgIGlmIChyaWdodHBvcyA8IGVuZHBvcykgeworICAgICAgICAgICAgY21wID0gY21wX2x0KAorICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyksCisgICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHJpZ2h0cG9zKSk7CisgICAgICAgICAgICBpZiAoY21wID09IC0xKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld2l0ZW0pOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbXAgPT0gMCkKKyAgICAgICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zOworICAgICAgICB9CisgICAgICAgIC8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCisgICAgICAgIHRtcCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyk7CisgICAgICAgIFB5X0lOQ1JFRih0bXApOworICAgICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXApOworICAgICAgICBwb3MgPSBjaGlsZHBvczsKKyAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7CisgICAgfQogCi0JLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQotCSAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLwotCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7Ci0JUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7Ci0JcmV0dXJuIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKTsKKyAgICAvKiBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBhbmQgYnViYmxlCisgICAgICAgaXQgdXAgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuICovCisgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKKyAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKKyAgICByZXR1cm4gX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaGVhcHB1c2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpoZWFwLCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaGVhcCwgKml0ZW07CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcHVzaCIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhlYXBwdXNoIiwgMiwgMiwgJmhlYXAsICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgaXRlbSkgPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGl0ZW0pID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChfc2lmdGRvd24oKFB5TGlzdE9iamVjdCAqKWhlYXAsIDAsIFB5TGlzdF9HRVRfU0laRShoZWFwKS0xKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChfc2lmdGRvd24oKFB5TGlzdE9iamVjdCAqKWhlYXAsIDAsIFB5TGlzdF9HRVRfU0laRShoZWFwKS0xKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoaGVhcHB1c2hfZG9jLApAQCAtMTQ2LDM1ICsxNDYsMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBoZWFwcG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaGVhcCkKIHsKLQlQeU9iamVjdCAqbGFzdGVsdCwgKnJldHVybml0ZW07Ci0JUHlfc3NpemVfdCBuOworICAgIFB5T2JqZWN0ICpsYXN0ZWx0LCAqcmV0dXJuaXRlbTsKKyAgICBQeV9zc2l6ZV90IG47CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5ICovCi0JbiA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKLQlpZiAobiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkgKi8KKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbGFzdGVsdCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBuLTEpIDsKLQlQeV9JTkNSRUYobGFzdGVsdCk7Ci0JUHlMaXN0X1NldFNsaWNlKGhlYXAsIG4tMSwgbiwgTlVMTCk7Ci0Jbi0tOworICAgIGxhc3RlbHQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgbi0xKSA7CisgICAgUHlfSU5DUkVGKGxhc3RlbHQpOworICAgIFB5TGlzdF9TZXRTbGljZShoZWFwLCBuLTEsIG4sIE5VTEwpOworICAgIG4tLTsKIAotCWlmICghbikgCi0JCXJldHVybiBsYXN0ZWx0OwotCXJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Ci0JUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGxhc3RlbHQpOwotCWlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgewotCQlQeV9ERUNSRUYocmV0dXJuaXRlbSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcmV0dXJuaXRlbTsKKyAgICBpZiAoIW4pCisgICAgICAgIHJldHVybiBsYXN0ZWx0OworICAgIHJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGxhc3RlbHQpOworICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYocmV0dXJuaXRlbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmV0dXJuaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBwb3BfZG9jLApAQCAtMTgzLDI5ICsxODMsMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBoZWFwcmVwbGFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmhlYXAsICppdGVtLCAqcmV0dXJuaXRlbTsKKyAgICBQeU9iamVjdCAqaGVhcCwgKml0ZW0sICpyZXR1cm5pdGVtOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGVhcHJlcGxhY2UiLCAyLCAyLCAmaGVhcCwgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcmVwbGFjZSIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlMaXN0X0dFVF9TSVpFKGhlYXApIDwgMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm5pdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCVB5X0lOQ1JFRihpdGVtKTsKLQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgaXRlbSk7Ci0JaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7Ci0JCVB5X0RFQ1JFRihyZXR1cm5pdGVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXR1cm5pdGVtOworICAgIHJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsKKyAgICBpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpIHsKKyAgICAgICAgUHlfREVDUkVGKHJldHVybml0ZW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJldHVybml0ZW07CiB9CiAKIFB5RG9jX1NUUlZBUihoZWFwcmVwbGFjZV9kb2MsCkBAIC0yMTUsNDQgKzIxNSw0NCBAQAogbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQtc2l6ZSBoZWFwLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZVxuXAogcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hICBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2VzIG9mXG5cCiB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OlxuXG5cCi0gICAgICAgIGlmIGl0ZW0gPiBoZWFwWzBdOlxuXAotICAgICAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXG4iKTsKKyAgICBpZiBpdGVtID4gaGVhcFswXTpcblwKKyAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXG4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGhlYXBwdXNocG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqaGVhcCwgKml0ZW0sICpyZXR1cm5pdGVtOwotCWludCBjbXA7CisgICAgUHlPYmplY3QgKmhlYXAsICppdGVtLCAqcmV0dXJuaXRlbTsKKyAgICBpbnQgY21wOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGVhcHB1c2hwb3AiLCAyLCAyLCAmaGVhcCwgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcHVzaHBvcCIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQorICAgIGlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7CisgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQogCi0JY21wID0gY21wX2x0KFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKSwgaXRlbSk7Ci0JaWYgKGNtcCA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGNtcCA9PSAwKSB7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQorICAgIGNtcCA9IGNtcF9sdChQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCksIGl0ZW0pOworICAgIGlmIChjbXAgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjbXAgPT0gMCkgeworICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KIAotCXJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Ci0JUHlfSU5DUkVGKGl0ZW0pOwotCVB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsKLQlpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpIHsKLQkJUHlfREVDUkVGKHJldHVybml0ZW0pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHJldHVybml0ZW07CisgICAgcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKKyAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGl0ZW0pOworICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYocmV0dXJuaXRlbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmV0dXJuaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBwdXNocG9wX2RvYywKQEAgLTI2MywyNiArMjYzLDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaGVhcGlmeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmhlYXApCiB7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQluID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwotCS8qIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0bwotCSAgIGxvb2tpbmcgYXQgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0Ci0JICAgaGF2ZSAyKmkgKyAxIDwgbiwgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMKLQkgICAoMipqLTEpLzIgPSBqLTEvMiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYKLQkgICBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsCi0JICAgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuCi0JKi8KLQlmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQotCQlpZihfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworICAgIC8qIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0bworICAgICAgIGxvb2tpbmcgYXQgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0CisgICAgICAgaGF2ZSAyKmkgKyAxIDwgbiwgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMKKyAgICAgICAoMipqLTEpLzIgPSBqLTEvMiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYKKyAgICAgICBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsCisgICAgICAgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuCisgICAgKi8KKyAgICBmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQorICAgICAgICBpZihfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBpZnlfZG9jLApAQCAtMjkxLDc5ICsyOTEsNzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBubGFyZ2VzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKnNvbCwgKml0LCAqb2xkZWxlbTsKLQlQeV9zc2l6ZV90IGksIG47Ci0JaW50IGNtcDsKKyAgICBQeU9iamVjdCAqaGVhcD1OVUxMLCAqZWxlbSwgKml0ZXJhYmxlLCAqc29sLCAqaXQsICpvbGRlbGVtOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBpbnQgY21wOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpubGFyZ2VzdCIsICZuLCAmaXRlcmFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5POm5sYXJnZXN0IiwgJm4sICZpdGVyYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQloZWFwID0gUHlMaXN0X05ldygwKTsKLQlpZiAoaGVhcCA9PSBOVUxMKQotCQlnb3RvIGZhaWw7CisgICAgaGVhcCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGhlYXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOwogCi0JZm9yIChpPTAgOyBpPG4gOyBpKysgKXsKLQkJZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKLQkJaWYgKGVsZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBmYWlsOwotCQkJZWxzZQotCQkJCWdvdG8gc29ydGl0OwotCQl9Ci0JCWlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGVsZW0pID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoZWxlbSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJUHlfREVDUkVGKGVsZW0pOwotCX0KLQlpZiAoUHlMaXN0X0dFVF9TSVpFKGhlYXApID09IDApCi0JCWdvdG8gc29ydGl0OworICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrICl7CisgICAgICAgIGVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgIGlmIChlbGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb3RvIHNvcnRpdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChoZWFwLCBlbGVtKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICB9CisgICAgaWYgKFB5TGlzdF9HRVRfU0laRShoZWFwKSA9PSAwKQorICAgICAgICBnb3RvIHNvcnRpdDsKIAotCWZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCi0JCWlmKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpID09IC0xKQotCQkJZ290byBmYWlsOworICAgIGZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCisgICAgICAgIGlmKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsOwogCi0Jc29sID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCXdoaWxlICgxKSB7Ci0JCWVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCWlmIChlbGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gZmFpbDsKLQkJCWVsc2UKLQkJCQlnb3RvIHNvcnRpdDsKLQkJfQotCQljbXAgPSBjbXBfbHQoc29sLCBlbGVtKTsKLQkJaWYgKGNtcCA9PSAtMSkgewotCQkJUHlfREVDUkVGKGVsZW0pOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWlmIChjbXAgPT0gMCkgewotCQkJUHlfREVDUkVGKGVsZW0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKLQkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOwotCQlQeV9ERUNSRUYob2xkZWxlbSk7Ci0JCWlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKLQkJCWdvdG8gZmFpbDsKLQkJc29sID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCX0KKyAgICBzb2wgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgaWYgKGVsZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvdG8gc29ydGl0OworICAgICAgICB9CisgICAgICAgIGNtcCA9IGNtcF9sdChzb2wsIGVsZW0pOworICAgICAgICBpZiAoY21wID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA9PSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBvbGRlbGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOworICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgZWxlbSk7CisgICAgICAgIFB5X0RFQ1JFRihvbGRlbGVtKTsKKyAgICAgICAgaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBzb2wgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgfQogc29ydGl0OgotCWlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkKLQkJZ290byBmYWlsOwotCWlmIChQeUxpc3RfUmV2ZXJzZShoZWFwKSA9PSAtMSkKLQkJZ290byBmYWlsOwotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIGhlYXA7CisgICAgaWYgKFB5TGlzdF9Tb3J0KGhlYXApID09IC0xKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKFB5TGlzdF9SZXZlcnNlKGhlYXApID09IC0xKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gaGVhcDsKIAogZmFpbDoKLQlQeV9ERUNSRUYoaXQpOwotCVB5X1hERUNSRUYoaGVhcCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9YREVDUkVGKGhlYXApOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIobmxhcmdlc3RfZG9jLApAQCAtMzc0LDE2NiArMzc0LDE2NiBAQAogc3RhdGljIGludAogX3NpZnRkb3dubWF4KFB5TGlzdE9iamVjdCAqaGVhcCwgUHlfc3NpemVfdCBzdGFydHBvcywgUHlfc3NpemVfdCBwb3MpCiB7Ci0JUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQ7Ci0JaW50IGNtcDsKLQlQeV9zc2l6ZV90IHBhcmVudHBvczsKKyAgICBQeU9iamVjdCAqbmV3aXRlbSwgKnBhcmVudDsKKyAgICBpbnQgY21wOworICAgIFB5X3NzaXplX3QgcGFyZW50cG9zOwogCi0JYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7Ci0JaWYgKHBvcyA+PSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKKyAgICBpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwotCVB5X0lOQ1JFRihuZXdpdGVtKTsKLQkvKiBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZwotCSAgIGEgcGxhY2UgbmV3aXRlbSBmaXRzLiAqLwotCXdoaWxlIChwb3MgPiBzdGFydHBvcyl7Ci0JCXBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxOwotCQlwYXJlbnQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcGFyZW50cG9zKTsKLQkJY21wID0gY21wX2x0KHBhcmVudCwgbmV3aXRlbSk7Ci0JCWlmIChjbXAgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihuZXdpdGVtKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoY21wID09IDApCi0JCQlicmVhazsKLQkJUHlfSU5DUkVGKHBhcmVudCk7Ci0JCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7Ci0JCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHBhcmVudCk7Ci0JCXBvcyA9IHBhcmVudHBvczsKLQl9Ci0JUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKLQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKLQlyZXR1cm4gMDsKKyAgICBuZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7CisgICAgUHlfSU5DUkVGKG5ld2l0ZW0pOworICAgIC8qIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nCisgICAgICAgYSBwbGFjZSBuZXdpdGVtIGZpdHMuICovCisgICAgd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKXsKKyAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7CisgICAgICAgIHBhcmVudCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwYXJlbnRwb3MpOworICAgICAgICBjbXAgPSBjbXBfbHQocGFyZW50LCBuZXdpdGVtKTsKKyAgICAgICAgaWYgKGNtcCA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKG5ld2l0ZW0pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChjbXAgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBQeV9JTkNSRUYocGFyZW50KTsKKyAgICAgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsKKyAgICAgICAgcG9zID0gcGFyZW50cG9zOworICAgIH0KKyAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOworICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBfc2lmdHVwbWF4KFB5TGlzdE9iamVjdCAqaGVhcCwgUHlfc3NpemVfdCBwb3MpCiB7Ci0JUHlfc3NpemVfdCBzdGFydHBvcywgZW5kcG9zLCBjaGlsZHBvcywgcmlnaHRwb3M7Ci0JaW50IGNtcDsKLQlQeU9iamVjdCAqbmV3aXRlbSwgKnRtcDsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBlbmRwb3MsIGNoaWxkcG9zLCByaWdodHBvczsKKyAgICBpbnQgY21wOworICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqdG1wOwogCi0JYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7Ci0JZW5kcG9zID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwotCXN0YXJ0cG9zID0gcG9zOwotCWlmIChwb3MgPj0gZW5kcG9zKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwotCVB5X0lOQ1JFRihuZXdpdGVtKTsKKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKKyAgICBlbmRwb3MgPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7CisgICAgc3RhcnRwb3MgPSBwb3M7CisgICAgaWYgKHBvcyA+PSBlbmRwb3MpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBuZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7CisgICAgUHlfSU5DUkVGKG5ld2l0ZW0pOwogCi0JLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLwotCWNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KLQl3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsKLQkJLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KLQkJcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7Ci0JCWlmIChyaWdodHBvcyA8IGVuZHBvcykgewotCQkJY21wID0gY21wX2x0KAotCQkJCVB5TGlzdF9HRVRfSVRFTShoZWFwLCByaWdodHBvcyksCi0JCQkJUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSk7Ci0JCQlpZiAoY21wID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKG5ld2l0ZW0pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWlmIChjbXAgPT0gMCkKLQkJCQljaGlsZHBvcyA9IHJpZ2h0cG9zOwotCQl9Ci0JCS8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCi0JCXRtcCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyk7Ci0JCVB5X0lOQ1JFRih0bXApOwotCQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwotCQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXApOwotCQlwb3MgPSBjaGlsZHBvczsKLQkJY2hpbGRwb3MgPSAyKnBvcyArIDE7Ci0JfQorICAgIC8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KKyAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCisgICAgd2hpbGUgKGNoaWxkcG9zIDwgZW5kcG9zKSB7CisgICAgICAgIC8qIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLiAgICovCisgICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxOworICAgICAgICBpZiAocmlnaHRwb3MgPCBlbmRwb3MpIHsKKyAgICAgICAgICAgIGNtcCA9IGNtcF9sdCgKKyAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcmlnaHRwb3MpLAorICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcykpOworICAgICAgICAgICAgaWYgKGNtcCA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdpdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY21wID09IDApCisgICAgICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvczsKKyAgICAgICAgfQorICAgICAgICAvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLworICAgICAgICB0bXAgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpOworICAgICAgICBQeV9JTkNSRUYodG1wKTsKKyAgICAgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgdG1wKTsKKyAgICAgICAgcG9zID0gY2hpbGRwb3M7CisgICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOworICAgIH0KIAotCS8qIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGFuZCBidWJibGUKLQkgICBpdCB1cCB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4gKi8KLQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwotCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwotCXJldHVybiBfc2lmdGRvd25tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcyk7CisgICAgLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQorICAgICAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLworICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CisgICAgcmV0dXJuIF9zaWZ0ZG93bm1heChoZWFwLCBzdGFydHBvcywgcG9zKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5zbWFsbGVzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKmxvcywgKml0LCAqb2xkZWxlbTsKLQlQeV9zc2l6ZV90IGksIG47Ci0JaW50IGNtcDsKKyAgICBQeU9iamVjdCAqaGVhcD1OVUxMLCAqZWxlbSwgKml0ZXJhYmxlLCAqbG9zLCAqaXQsICpvbGRlbGVtOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBpbnQgY21wOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpuc21hbGxlc3QiLCAmbiwgJml0ZXJhYmxlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpuc21hbGxlc3QiLCAmbiwgJml0ZXJhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWhlYXAgPSBQeUxpc3RfTmV3KDApOwotCWlmIChoZWFwID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKKyAgICBoZWFwID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoaGVhcCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CiAKLQlmb3IgKGk9MCA7IGk8biA7IGkrKyApewotCQllbGVtID0gUHlJdGVyX05leHQoaXQpOwotCQlpZiAoZWxlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIGZhaWw7Ci0JCQllbHNlCi0JCQkJZ290byBzb3J0aXQ7Ci0JCX0KLQkJaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihlbGVtKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlQeV9ERUNSRUYoZWxlbSk7Ci0JfQotCW4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7Ci0JaWYgKG4gPT0gMCkKLQkJZ290byBzb3J0aXQ7CisgICAgZm9yIChpPTAgOyBpPG4gOyBpKysgKXsKKyAgICAgICAgZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgaWYgKGVsZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvdG8gc29ydGl0OworICAgICAgICB9CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGVsZW0pID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgIH0KKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworICAgIGlmIChuID09IDApCisgICAgICAgIGdvdG8gc29ydGl0OwogCi0JZm9yIChpPW4vMi0xIDsgaT49MCA7IGktLSkKLQkJaWYoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCi0JCQlnb3RvIGZhaWw7CisgICAgZm9yIChpPW4vMi0xIDsgaT49MCA7IGktLSkKKyAgICAgICAgaWYoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWw7CiAKLQlsb3MgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Ci0Jd2hpbGUgKDEpIHsKLQkJZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKLQkJaWYgKGVsZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBmYWlsOwotCQkJZWxzZQotCQkJCWdvdG8gc29ydGl0OwotCQl9Ci0JCWNtcCA9IGNtcF9sdChlbGVtLCBsb3MpOwotCQlpZiAoY21wID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoZWxlbSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJaWYgKGNtcCA9PSAwKSB7Ci0JCQlQeV9ERUNSRUYoZWxlbSk7Ci0JCQljb250aW51ZTsKLQkJfQorICAgIGxvcyA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBlbGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICBpZiAoZWxlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7CisgICAgICAgIH0KKyAgICAgICAgY21wID0gY21wX2x0KGVsZW0sIGxvcyk7CisgICAgICAgIGlmIChjbXAgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY21wID09IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKLQkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOwotCQlQeV9ERUNSRUYob2xkZWxlbSk7Ci0JCWlmIChfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKLQkJCWdvdG8gZmFpbDsKLQkJbG9zID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCX0KKyAgICAgICAgb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOworICAgICAgICBQeV9ERUNSRUYob2xkZWxlbSk7CisgICAgICAgIGlmIChfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgbG9zID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOworICAgIH0KIAogc29ydGl0OgotCWlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkKLQkJZ290byBmYWlsOwotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIGhlYXA7CisgICAgaWYgKFB5TGlzdF9Tb3J0KGhlYXApID09IC0xKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gaGVhcDsKIAogZmFpbDoKLQlQeV9ERUNSRUYoaXQpOwotCVB5X1hERUNSRUYoaGVhcCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9YREVDUkVGKGhlYXApOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIobnNtYWxsZXN0X2RvYywKQEAgLTU0MiwyMSArNTQyLDIxIEBACiBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlKVs6bl1cbiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgaGVhcHFfbWV0aG9kc1tdID0gewotCXsiaGVhcHB1c2giLAkoUHlDRnVuY3Rpb24paGVhcHB1c2gsCQkKLQkJTUVUSF9WQVJBUkdTLAloZWFwcHVzaF9kb2N9LAotCXsiaGVhcHB1c2hwb3AiLAkoUHlDRnVuY3Rpb24paGVhcHB1c2hwb3AsCQkKLQkJTUVUSF9WQVJBUkdTLAloZWFwcHVzaHBvcF9kb2N9LAotCXsiaGVhcHBvcCIsCShQeUNGdW5jdGlvbiloZWFwcG9wLAotCQlNRVRIX08sCQloZWFwcG9wX2RvY30sCi0JeyJoZWFwcmVwbGFjZSIsCShQeUNGdW5jdGlvbiloZWFwcmVwbGFjZSwKLQkJTUVUSF9WQVJBUkdTLAloZWFwcmVwbGFjZV9kb2N9LAotCXsiaGVhcGlmeSIsCShQeUNGdW5jdGlvbiloZWFwaWZ5LAotCQlNRVRIX08sCQloZWFwaWZ5X2RvY30sCi0JeyJubGFyZ2VzdCIsCShQeUNGdW5jdGlvbilubGFyZ2VzdCwKLQkJTUVUSF9WQVJBUkdTLAlubGFyZ2VzdF9kb2N9LAotCXsibnNtYWxsZXN0IiwJKFB5Q0Z1bmN0aW9uKW5zbWFsbGVzdCwKLQkJTUVUSF9WQVJBUkdTLAluc21hbGxlc3RfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiaGVhcHB1c2giLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWhlYXBwdXNoLAorICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBoZWFwcHVzaF9kb2N9LAorICAgIHsiaGVhcHB1c2hwb3AiLCAgICAgKFB5Q0Z1bmN0aW9uKWhlYXBwdXNocG9wLAorICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBoZWFwcHVzaHBvcF9kb2N9LAorICAgIHsiaGVhcHBvcCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWhlYXBwb3AsCisgICAgICAgIE1FVEhfTywgICAgICAgICAgICAgICAgIGhlYXBwb3BfZG9jfSwKKyAgICB7ImhlYXByZXBsYWNlIiwgICAgIChQeUNGdW5jdGlvbiloZWFwcmVwbGFjZSwKKyAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgaGVhcHJlcGxhY2VfZG9jfSwKKyAgICB7ImhlYXBpZnkiLCAgICAgICAgIChQeUNGdW5jdGlvbiloZWFwaWZ5LAorICAgICAgICBNRVRIX08sICAgICAgICAgICAgICAgICBoZWFwaWZ5X2RvY30sCisgICAgeyJubGFyZ2VzdCIsICAgICAgICAoUHlDRnVuY3Rpb24pbmxhcmdlc3QsCisgICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIG5sYXJnZXN0X2RvY30sCisgICAgeyJuc21hbGxlc3QiLCAgICAgICAoUHlDRnVuY3Rpb24pbnNtYWxsZXN0LAorICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBuc21hbGxlc3RfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCkBAIC02ODcsMTEgKzY4NywxMSBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRfaGVhcHEodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCW0gPSBQeV9Jbml0TW9kdWxlMygiX2hlYXBxIiwgaGVhcHFfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLSAgICAJCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9fYWJvdXRfXyIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoX19hYm91dF9fKSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfaGVhcHEiLCBoZWFwcV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfX2Fib3V0X18iLCBQeVN0cmluZ19Gcm9tU3RyaW5nKF9fYWJvdXRfXykpOwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ob3RzaG90LmMgYi9Nb2R1bGVzL19ob3RzaG90LmMKaW5kZXggYTM2Y2Q1MC4uZGY4YTdmOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faG90c2hvdC5jCisrKyBiL01vZHVsZXMvX2hvdHNob3QuYwpAQCAtMjEsMTAgKzIxLDEwIEBACiAKIHR5cGVkZWYgX19pbnQ2NCBoc190aW1lOwogI2RlZmluZSBHRVRUSU1FT0ZEQVkoUF9IU19USU1FKSBcCi0JeyBMQVJHRV9JTlRFR0VSIF90ZW1wOyBcCi0JICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmX3RlbXApOyBcCi0JICAqKFBfSFNfVElNRSkgPSBfdGVtcC5RdWFkUGFydDsgfQotCSAgCisgICAgICAgIHsgTEFSR0VfSU5URUdFUiBfdGVtcDsgXAorICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZfdGVtcCk7IFwKKyAgICAgICAgICAqKFBfSFNfVElNRSkgPSBfdGVtcC5RdWFkUGFydDsgfQorCiAKICNlbHNlCiAjaWZuZGVmIEhBVkVfR0VUVElNRU9GREFZCkBAIC0yODQsNyArMjg0LDcgQEAKIAogICAgIGRvIHsKICAgICAgICAgLyogcmVhZCBieXRlICovCi0JaWYgKChjID0gZmdldGMoc2VsZi0+bG9nZnApKSA9PSBFT0YpCisgICAgICAgIGlmICgoYyA9IGZnZXRjKHNlbGYtPmxvZ2ZwKSkgPT0gRU9GKQogICAgICAgICAgICAgcmV0dXJuIEVSUl9FT0Y7CiAgICAgICAgIGFjY3VtIHw9ICgoYyAmIDB4N0YpID4+IGRpc2NhcmQpIDw8IGJpdHM7CiAgICAgICAgIGJpdHMgKz0gKDcgLSBkaXNjYXJkKTsKQEAgLTMwOCwxOSArMzA4LDE5IEBACiAgICAgaW50IGVycjsKICAgICBpbnQgY2g7CiAgICAgY2hhciAqYnVmOwotICAgIAorCiAgICAgaWYgKChlcnIgPSB1bnBhY2tfcGFja2VkX2ludChzZWxmLCAmbGVuLCAwKSkpCiAgICAgICAgIHJldHVybiBlcnI7CiAKICAgICBidWYgPSAoY2hhciAqKW1hbGxvYyhsZW4pOwogICAgIGlmICghYnVmKSB7Ci0JUHlFcnJfTm9NZW1vcnkoKTsKLQlyZXR1cm4gRVJSX0VYQ0VQVElPTjsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIEVSUl9FWENFUFRJT047CiAgICAgfQogCiAgICAgZm9yIChpPTA7IGkgPCBsZW47IGkrKykgewogICAgICAgICBjaCA9IGZnZXRjKHNlbGYtPmxvZ2ZwKTsKLQlidWZbaV0gPSBjaDsKKyAgICAgICAgYnVmW2ldID0gY2g7CiAgICAgICAgIGlmIChjaCA9PSBFT0YpIHsKICAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgIHJldHVybiBFUlJfRU9GOwpAQCAtNDU5LDE2ICs0NTksMTYgQEAKICAgICAgICAgICAgIGVyciA9IEVSUl9FT0Y7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgc2VsZi0+bGluZXRpbWluZ3MgPSBjID8gMSA6IDA7Ci0JICAgIGdvdG8gcmVzdGFydDsKLQl9CisgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBXSEFUX0ZSQU1FX1RJTUVTOgogICAgICAgICBpZiAoKGMgPSBmZ2V0YyhzZWxmLT5sb2dmcCkpID09IEVPRikKICAgICAgICAgICAgIGVyciA9IEVSUl9FT0Y7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgc2VsZi0+ZnJhbWV0aW1pbmdzID0gYyA/IDEgOiAwOwotCSAgICBnb3RvIHJlc3RhcnQ7Ci0JfQorICAgICAgICAgICAgZ290byByZXN0YXJ0OworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGVyciA9IEVSUl9CQURfUkVDVFlQRTsKQEAgLTg3Niw3ICs4NzYsNyBAQAogICAgIGNhc2UgUHlUcmFjZV9MSU5FOiAgLyogd2Ugb25seSBnZXQgdGhlc2UgZXZlbnRzIGlmIHdlIGFza2VkIGZvciB0aGVtICovCiAgICAgICAgIGlmIChzZWxmLT5saW5ldGltaW5ncykKICAgICAgICAgICAgIHJldHVybiBwYWNrX2xpbmVub190ZGVsdGEoc2VsZiwgZnJhbWUtPmZfbGluZW5vLAotCQkJCSAgICAgIGdldF90ZGVsdGEoc2VsZikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdGRlbHRhKHNlbGYpKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmV0dXJuIHBhY2tfbGluZW5vKHNlbGYsIGZyYW1lLT5mX2xpbmVubyk7CiAKQEAgLTEyMjEsMzkgKzEyMjEsMzkgQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQcm9maWxlclR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9ob3RzaG90LlByb2ZpbGVyVHlwZSIsCQkvKiB0cF9uYW1lCQkqLwotICAgIChpbnQpIHNpemVvZihQcm9maWxlck9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfaXRlbXNpemUJCSovCi0gICAgKGRlc3RydWN0b3IpcHJvZmlsZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYwkJKi8KLSAgICAwLAkJCQkJLyogdHBfcHJpbnQJCSovCi0gICAgMCwJCQkJCS8qIHRwX2dldGF0dHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX3NldGF0dHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NvbXBhcmUJCSovCi0gICAgMCwJCQkJCS8qIHRwX3JlcHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX2FzX251bWJlcgkJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbWFwcGluZwkqLwotICAgIDAsCQkJCQkvKiB0cF9oYXNoCQkqLwotICAgIDAsCQkJCQkvKiB0cF9jYWxsCQkqLwotICAgIDAsCQkJCQkvKiB0cF9zdHIJCSovCi0gICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybwkJKi8KLSAgICAwLAkJCQkJLyogdHBfc2V0YXR0cm8JCSovCi0gICAgMCwJCQkJCS8qIHRwX2FzX2J1ZmZlcgkJKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MJCSovCi0gICAgcHJvZmlsZXJfb2JqZWN0X19kb2NfXywJCS8qIHRwX2RvYwkJKi8KLSAgICAwLAkJCQkJLyogdHBfdHJhdmVyc2UJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NsZWFyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZQkqLwotICAgIDAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldAkqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVybmV4dAkJKi8KLSAgICBwcm9maWxlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMJCSovCi0gICAgcHJvZmlsZXJfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzCQkqLwotICAgIHByb2ZpbGVyX2dldHNldHMsCQkJLyogdHBfZ2V0c2V0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9iYXNlCQkqLwotICAgIDAsCQkJCQkvKiB0cF9kaWN0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9kZXNjcl9nZXQJCSovCi0gICAgMCwJCQkJCS8qIHRwX2Rlc2NyX3NldAkJKi8KKyAgICAiX2hvdHNob3QuUHJvZmlsZXJUeXBlIiwgICAgICAgICAgICAvKiB0cF9uYW1lICAgICAgICAgICAgICAqLworICAgIChpbnQpIHNpemVvZihQcm9maWxlck9iamVjdCksICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgICAgICAgICAgKi8KKyAgICAoZGVzdHJ1Y3Rvcilwcm9maWxlcl9kZWFsbG9jLCAgICAgICAvKiB0cF9kZWFsbG9jICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICAgICAgICAgICAgICAgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICAgICAgICAgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAgICAgICAgICAgICAqLworICAgIHByb2ZpbGVyX29iamVjdF9fZG9jX18sICAgICAgICAgICAgIC8qIHRwX2RvYyAgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICAgICAgICAgICovCisgICAgcHJvZmlsZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAgICAgICAgICAgKi8KKyAgICBwcm9maWxlcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICAgICAgICAgICAqLworICAgIHByb2ZpbGVyX2dldHNldHMsICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICAgICAgICAgKi8KIH07CiAKIApAQCAtMTI3NywxNiArMTI3NywxNiBAQAogQ3JlYXRlIGEgbG9nLXJlYWRlciBmb3IgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBmaWxlLiIpOwogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgbG9ncmVhZGVyX2FzX3NlcXVlbmNlID0gewotICAgIDAsCQkJCQkvKiBzcV9sZW5ndGggKi8KLSAgICAwLAkJCQkJLyogc3FfY29uY2F0ICovCi0gICAgMCwJCQkJCS8qIHNxX3JlcGVhdCAqLwotICAgIChzc2l6ZWFyZ2Z1bmMpbG9ncmVhZGVyX3NxX2l0ZW0sCS8qIHNxX2l0ZW0gKi8KLSAgICAwLAkJCQkJLyogc3Ffc2xpY2UgKi8KLSAgICAwLAkJCQkJLyogc3FfYXNzX2l0ZW0gKi8KLSAgICAwLAkJCQkJLyogc3FfYXNzX3NsaWNlICovCi0gICAgMCwJCQkJCS8qIHNxX2NvbnRhaW5zICovCi0gICAgMCwJCQkJCS8qIHNxX2lucGxhY2VfY29uY2F0ICovCi0gICAgMCwJCQkJCS8qIHNxX2lucGxhY2VfcmVwZWF0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfbGVuZ3RoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0ICovCisgICAgKHNzaXplYXJnZnVuYylsb2dyZWFkZXJfc3FfaXRlbSwgICAgLyogc3FfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3Nfc2xpY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9yZXBlYXQgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMzA1LDM5ICsxMzA1LDM5IEBACiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTG9nUmVhZGVyVHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLSAgICAiX2hvdHNob3QuTG9nUmVhZGVyVHlwZSIsCQkvKiB0cF9uYW1lCQkqLwotICAgIChpbnQpIHNpemVvZihMb2dSZWFkZXJPYmplY3QpLAkvKiB0cF9iYXNpY3NpemUJCSovCi0gICAgMCwJCQkJCS8qIHRwX2l0ZW1zaXplCQkqLwotICAgIChkZXN0cnVjdG9yKWxvZ3JlYWRlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jCQkqLwotICAgIDAsCQkJCQkvKiB0cF9wcmludAkJKi8KLSAgICAwLAkJCQkJLyogdHBfZ2V0YXR0cgkJKi8KLSAgICAwLAkJCQkJLyogdHBfc2V0YXR0cgkJKi8KLSAgICAwLAkJCQkJLyogdHBfY29tcGFyZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfcmVwcgkJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbnVtYmVyCQkqLwotICAgICZsb2dyZWFkZXJfYXNfc2VxdWVuY2UsCQkvKiB0cF9hc19zZXF1ZW5jZQkqLwotICAgIDAsCQkJCQkvKiB0cF9hc19tYXBwaW5nCSovCi0gICAgMCwJCQkJCS8qIHRwX2hhc2gJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NhbGwJCSovCi0gICAgMCwJCQkJCS8qIHRwX3N0cgkJKi8KLSAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvCQkqLwotICAgIDAsCQkJCQkvKiB0cF9zZXRhdHRybwkJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfYnVmZmVyCQkqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncwkJKi8KLSAgICBsb2dyZWFkZXJfX2RvY19fLAkJCS8qIHRwX2RvYwkJKi8KLSAgICAwLAkJCQkJLyogdHBfdHJhdmVyc2UJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NsZWFyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZQkqLwotICAgIDAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldAkqLwotICAgIFB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIJCSovCi0gICAgKGl0ZXJuZXh0ZnVuYylsb2dyZWFkZXJfdHBfaXRlcm5leHQsLyogdHBfaXRlcm5leHQJCSovCi0gICAgbG9ncmVhZGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcwkJKi8KLSAgICBsb2dyZWFkZXJfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzCQkqLwotICAgIGxvZ3JlYWRlcl9nZXRzZXRzLAkJCS8qIHRwX2dldHNldAkJKi8KLSAgICAwLAkJCQkJLyogdHBfYmFzZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfZGljdAkJKi8KLSAgICAwLAkJCQkJLyogdHBfZGVzY3JfZ2V0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9kZXNjcl9zZXQJCSovCisgICAgIl9ob3RzaG90LkxvZ1JlYWRlclR5cGUiLCAgICAgICAgICAgLyogdHBfbmFtZSAgICAgICAgICAgICAgKi8KKyAgICAoaW50KSBzaXplb2YoTG9nUmVhZGVyT2JqZWN0KSwgICAgICAvKiB0cF9iYXNpY3NpemUgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICAgICAgICAgICovCisgICAgKGRlc3RydWN0b3IpbG9ncmVhZGVyX2RlYWxsb2MsICAgICAgLyogdHBfZGVhbGxvYyAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICAgICAgICAgKi8KKyAgICAmbG9ncmVhZGVyX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAgICAgICAgICAgICAgICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAgICAgICAgICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgICAgICAgICAgICAgKi8KKyAgICBsb2dyZWFkZXJfX2RvY19fLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICAgICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAgICAgICAgICAgICAgKi8KKyAgICAoaXRlcm5leHRmdW5jKWxvZ3JlYWRlcl90cF9pdGVybmV4dCwvKiB0cF9pdGVybmV4dCAgICAgICAgICAqLworICAgIGxvZ3JlYWRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgICAgICAgICAgICovCisgICAgbG9ncmVhZGVyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAgICAgICAgICAgKi8KKyAgICBsb2dyZWFkZXJfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAgICAgICAgICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTQ2Myw4ICsxNDYzLDggQEAKIAogICAgIHRlbXAgPSBQeVN5c19HZXRPYmplY3QoInBhdGgiKTsKICAgICBpZiAodGVtcCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sodGVtcCkpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAic3lzLnBhdGggbXVzdCBiZSBhIGxpc3QiKTsKLSAgICAJcmV0dXJuIC0xOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAic3lzLnBhdGggbXVzdCBiZSBhIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBsZW4gPSBQeUxpc3RfR0VUX1NJWkUodGVtcCk7CiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CkBAIC0xNTYyLDcgKzE1NjIsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLVB5RG9jX1ZBUihyZXNvbHV0aW9uX19kb2NfXykgPSAKK1B5RG9jX1ZBUihyZXNvbHV0aW9uX19kb2NfXykgPQogI2lmZGVmIE1TX1dJTkRPV1MKIFB5RG9jX1NUUigKICJyZXNvbHV0aW9uKCkgLT4gKHBlcmZvcm1hbmNlLWNvdW50ZXItdGlja3MsIHVwZGF0ZS1mcmVxdWVuY3kpXG4iCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCmluZGV4IGYxZjRhYmYuLjI1M2E0ZGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCkBAIC01OCw4ICs1OCw4IEBACiAgICAgUHlPYmplY3QgKnJlc3VsdCwgKnZhbCA9IE5VTEw7CiAKICAgICBpZiAoc1swXSA9PSAnXDAnKQotICAgICAgICAvKiBlbXB0eSBzdHJpbmc6IG5vIGdyb3VwaW5nIGF0IGFsbCAqLwotICAgICAgICByZXR1cm4gUHlMaXN0X05ldygwKTsKKyAgICAvKiBlbXB0eSBzdHJpbmc6IG5vIGdyb3VwaW5nIGF0IGFsbCAqLworICAgIHJldHVybiBQeUxpc3RfTmV3KDApOwogCiAgICAgZm9yIChpID0gMDsgc1tpXSAhPSAnXDAnICYmIHNbaV0gIT0gQ0hBUl9NQVg7IGkrKykKICAgICAgICAgOyAvKiBub3RoaW5nICovCkBAIC0xNzIsMjMgKzE3MiwyMyBAQAogI2VuZGlmCiAKICAgICBpZiAobG9jYWxlKSB7Ci0gICAgICAgIC8qIHNldCBsb2NhbGUgKi8KLSAgICAgICAgcmVzdWx0ID0gc2V0bG9jYWxlKGNhdGVnb3J5LCBsb2NhbGUpOwotICAgICAgICBpZiAoIXJlc3VsdCkgewotICAgICAgICAgICAgLyogb3BlcmF0aW9uIGZhaWxlZCwgbm8gc2V0dGluZyB3YXMgY2hhbmdlZCAqLwotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAidW5zdXBwb3J0ZWQgbG9jYWxlIHNldHRpbmciKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdF9vYmplY3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHJlc3VsdCk7Ci0gICAgICAgIGlmICghcmVzdWx0X29iamVjdCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAvKiByZWNvcmQgY2hhbmdlcyB0byBMQ19DVFlQRSAqLwotICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gTENfQ1RZUEUgfHwgY2F0ZWdvcnkgPT0gTENfQUxMKQotICAgICAgICAgICAgZml4dXBfdWxjYXNlKCk7CisgICAgLyogc2V0IGxvY2FsZSAqLworICAgIHJlc3VsdCA9IHNldGxvY2FsZShjYXRlZ29yeSwgbG9jYWxlKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAvKiBvcGVyYXRpb24gZmFpbGVkLCBubyBzZXR0aW5nIHdhcyBjaGFuZ2VkICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgInVuc3VwcG9ydGVkIGxvY2FsZSBzZXR0aW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfb2JqZWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXN1bHQpOworICAgIGlmICghcmVzdWx0X29iamVjdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogcmVjb3JkIGNoYW5nZXMgdG8gTENfQ1RZUEUgKi8KKyAgICBpZiAoY2F0ZWdvcnkgPT0gTENfQ1RZUEUgfHwgY2F0ZWdvcnkgPT0gTENfQUxMKQorICAgICAgICBmaXh1cF91bGNhc2UoKTsKICAgICAgICAgLyogdGhpbmdzIHRoYXQgZ290IHdyb25nIHVwIHRvIGhlcmUgYXJlIGlnbm9yZWQgKi8KICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICB9IGVsc2UgewotICAgICAgICAvKiBnZXQgbG9jYWxlICovCisgICAgLyogZ2V0IGxvY2FsZSAqLwogICAgICAgICByZXN1bHQgPSBzZXRsb2NhbGUoY2F0ZWdvcnksIE5VTEwpOwogICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAibG9jYWxlIHF1ZXJ5IGZhaWxlZCIpOwpAQCAtMjc2LDcgKzI3Niw3IEBACiB7CiAjaWYgIWRlZmluZWQoSEFWRV9XQ1NDT0xMKSB8fCAhZGVmaW5lZChQeV9VU0lOR19VTklDT0RFKQogICAgIGNoYXIgKnMxLCpzMjsKLSAgICAKKwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6c3RyY29sbCIsICZzMSwgJnMyKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHN0cmNvbGwoczEsIHMyKSk7CkBAIC0yODQsNyArMjg0LDcgQEAKICAgICBQeU9iamVjdCAqb3MxLCAqb3MyLCAqcmVzdWx0ID0gTlVMTDsKICAgICB3Y2hhcl90ICp3czEgPSBOVUxMLCAqd3MyID0gTlVMTDsKICAgICBpbnQgcmVsMSA9IDAsIHJlbDIgPSAwLCBsZW4xLCBsZW4yOwotICAgIAorCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3RyY29sbCIsIDIsIDIsICZvczEsICZvczIpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICAvKiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgYnl0ZSBzdHJpbmdzLCB1c2Ugc3RyY29sbC4gICovCkBAIC0yOTcsOSArMjk3LDkgQEAKICAgICB9CiAgICAgLyogQ29udmVydCB0aGUgbm9uLXVuaWNvZGUgYXJndW1lbnQgdG8gdW5pY29kZS4gKi8KICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhvczEpKSB7Ci0gICAgICAgIG9zMSA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KG9zMSk7Ci0gICAgICAgIGlmICghb3MxKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3MxID0gUHlVbmljb2RlX0Zyb21PYmplY3Qob3MxKTsKKyAgICBpZiAoIW9zMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHJlbDEgPSAxOwogICAgIH0KICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhvczIpKSB7CkBAIC0zMDksNyArMzA5LDcgQEAKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYob3MxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9IAorICAgICAgICB9CiAgICAgICAgIHJlbDIgPSAxOwogICAgIH0KICAgICAvKiBDb252ZXJ0IHRoZSB1bmljb2RlIHN0cmluZ3MgdG8gd2NoYXJbXS4gKi8KQEAgLTQxOSw5ICs0MTksOSBAQAogI2lmZGVmIEhBVkVfTEFOR0lORk9fSAogI2RlZmluZSBMQU5HSU5GTyhYKSB7I1gsIFh9CiBzdGF0aWMgc3RydWN0IGxhbmdpbmZvX2NvbnN0YW50ewotCWNoYXIqIG5hbWU7Ci0JaW50IHZhbHVlOwotfSBsYW5naW5mb19jb25zdGFudHNbXSA9IAorICAgIGNoYXIqIG5hbWU7CisgICAgaW50IHZhbHVlOworfSBsYW5naW5mb19jb25zdGFudHNbXSA9CiB7CiAgICAgLyogVGhlc2UgY29uc3RhbnRzIHNob3VsZCBleGlzdCBvbiBhbnkgbGFuZ2luZm8gaW1wbGVtZW50YXRpb24gKi8KICAgICBMQU5HSU5GTyhEQVlfMSksCkBAIC01MzQsNyArNTM0LDcgQEAKIHsKICAgICBpbnQgaXRlbSwgaTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6bmxfbGFuZ2luZm8iLCAmaXRlbSkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIHN1cHBvcnRlZCBjb25zdGFudC4gR05VIGxpYmMgc29tZXRpbWVzCiAgICAgICAgcmV0dXJucyBudW1lcmljIHZhbHVlcyBpbiB0aGUgY2hhciogcmV0dXJuIHZhbHVlLCB3aGljaCB3b3VsZAogICAgICAgIGNyYXNoIFB5U3RyaW5nX0Zyb21TdHJpbmcuICAqLwpAQCAtNTU5LDEwICs1NTksMTAgQEAKIHN0YXRpYyBQeU9iamVjdCoKIFB5SW50bF9nZXR0ZXh0KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICppbjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmaW4pKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhnZXR0ZXh0KGluKSk7CisgICAgY2hhciAqaW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJmluKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZ2V0dGV4dChpbikpOwogfQogCiBQeURvY19TVFJWQVIoZGdldHRleHRfX2RvY19fLApAQCAtNTcyLDEwICs1NzIsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCoKIFB5SW50bF9kZ2V0dGV4dChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZG9tYWluLCAqaW47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6cyIsICZkb21haW4sICZpbikpCi0JCXJldHVybiAwOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRnZXR0ZXh0KGRvbWFpbiwgaW4pKTsKKyAgICBjaGFyICpkb21haW4sICppbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInpzIiwgJmRvbWFpbiwgJmluKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGdldHRleHQoZG9tYWluLCBpbikpOwogfQogCiBQeURvY19TVFJWQVIoZGNnZXR0ZXh0X19kb2NfXywKQEAgLTU4NSwxMSArNTg1LDExIEBACiBzdGF0aWMgUHlPYmplY3QqCiBQeUludGxfZGNnZXR0ZXh0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpkb21haW4sICptc2dpZDsKLQlpbnQgY2F0ZWdvcnk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6c2kiLCAmZG9tYWluLCAmbXNnaWQsICZjYXRlZ29yeSkpCi0JCXJldHVybiAwOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRjZ2V0dGV4dChkb21haW4sbXNnaWQsY2F0ZWdvcnkpKTsKKyAgICBjaGFyICpkb21haW4sICptc2dpZDsKKyAgICBpbnQgY2F0ZWdvcnk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6c2kiLCAmZG9tYWluLCAmbXNnaWQsICZjYXRlZ29yeSkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRjZ2V0dGV4dChkb21haW4sbXNnaWQsY2F0ZWdvcnkpKTsKIH0KIAogUHlEb2NfU1RSVkFSKHRleHRkb21haW5fX2RvY19fLApAQCAtNTk5LDE1ICs1OTksMTUgQEAKIHN0YXRpYyBQeU9iamVjdCoKIFB5SW50bF90ZXh0ZG9tYWluKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQljaGFyICpkb21haW47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6IiwgJmRvbWFpbikpCi0JCXJldHVybiAwOwotCWRvbWFpbiA9IHRleHRkb21haW4oZG9tYWluKTsKLQlpZiAoIWRvbWFpbikgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkb21haW4pOworICAgIGNoYXIgKmRvbWFpbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInoiLCAmZG9tYWluKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZG9tYWluID0gdGV4dGRvbWFpbihkb21haW4pOworICAgIGlmICghZG9tYWluKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRvbWFpbik7CiB9CiAKIFB5RG9jX1NUUlZBUihiaW5kdGV4dGRvbWFpbl9fZG9jX18sCkBAIC02MTcsMTkgKzYxNywxOSBAQAogc3RhdGljIFB5T2JqZWN0KgogUHlJbnRsX2JpbmR0ZXh0ZG9tYWluKFB5T2JqZWN0KiBzZWxmLFB5T2JqZWN0KmFyZ3MpCiB7Ci0JY2hhciAqZG9tYWluLCAqZGlybmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN6IiwgJmRvbWFpbiwgJmRpcm5hbWUpKQotCQlyZXR1cm4gMDsKLQlpZiAoIXN0cmxlbihkb21haW4pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvciwgImRvbWFpbiBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZGlybmFtZSA9IGJpbmR0ZXh0ZG9tYWluKGRvbWFpbiwgZGlybmFtZSk7Ci0JaWYgKCFkaXJuYW1lKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRpcm5hbWUpOworICAgIGNoYXIgKmRvbWFpbiwgKmRpcm5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzeiIsICZkb21haW4sICZkaXJuYW1lKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFzdHJsZW4oZG9tYWluKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJkb21haW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGRpcm5hbWUgPSBiaW5kdGV4dGRvbWFpbihkb21haW4sIGRpcm5hbWUpOworICAgIGlmICghZGlybmFtZSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkaXJuYW1lKTsKIH0KIAogI2lmZGVmIEhBVkVfQklORF9URVhURE9NQUlOX0NPREVTRVQKQEAgLTY0MCwyOCArNjQwLDI4IEBACiBzdGF0aWMgUHlPYmplY3QqCiBQeUludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoUHlPYmplY3QqIHNlbGYsUHlPYmplY3QqYXJncykKIHsKLQljaGFyICpkb21haW4sKmNvZGVzZXQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzeiIsICZkb21haW4sICZjb2Rlc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JY29kZXNldCA9IGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KGRvbWFpbiwgY29kZXNldCk7Ci0JaWYgKGNvZGVzZXQpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGNvZGVzZXQpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGNoYXIgKmRvbWFpbiwqY29kZXNldDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN6IiwgJmRvbWFpbiwgJmNvZGVzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjb2Rlc2V0ID0gYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoZG9tYWluLCBjb2Rlc2V0KTsKKyAgICBpZiAoY29kZXNldCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoY29kZXNldCk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAjZW5kaWYKIAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgUHlMb2NhbGVfTWV0aG9kc1tdID0gewotICB7InNldGxvY2FsZSIsIChQeUNGdW5jdGlvbikgUHlMb2NhbGVfc2V0bG9jYWxlLCAKKyAgeyJzZXRsb2NhbGUiLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX3NldGxvY2FsZSwKICAgIE1FVEhfVkFSQVJHUywgc2V0bG9jYWxlX19kb2NfX30sCi0gIHsibG9jYWxlY29udiIsIChQeUNGdW5jdGlvbikgUHlMb2NhbGVfbG9jYWxlY29udiwgCisgIHsibG9jYWxlY29udiIsIChQeUNGdW5jdGlvbikgUHlMb2NhbGVfbG9jYWxlY29udiwKICAgIE1FVEhfTk9BUkdTLCBsb2NhbGVjb252X19kb2NfX30sCi0gIHsic3RyY29sbCIsIChQeUNGdW5jdGlvbikgUHlMb2NhbGVfc3RyY29sbCwgCisgIHsic3RyY29sbCIsIChQeUNGdW5jdGlvbikgUHlMb2NhbGVfc3RyY29sbCwKICAgIE1FVEhfVkFSQVJHUywgc3RyY29sbF9fZG9jX199LAotICB7InN0cnhmcm0iLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX3N0cnhmcm0sIAorICB7InN0cnhmcm0iLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX3N0cnhmcm0sCiAgICBNRVRIX1ZBUkFSR1MsIHN0cnhmcm1fX2RvY19ffSwKLSNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpIAorI2lmIGRlZmluZWQoTVNfV0lORE9XUykKICAgeyJfZ2V0ZGVmYXVsdGxvY2FsZSIsIChQeUNGdW5jdGlvbikgUHlMb2NhbGVfZ2V0ZGVmYXVsdGxvY2FsZSwgTUVUSF9OT0FSR1N9LAogI2VuZGlmCiAjaWZkZWYgSEFWRV9MQU5HSU5GT19ICkBAIC02ODMsNyArNjgzLDcgQEAKICAgeyJiaW5kX3RleHRkb21haW5fY29kZXNldCIsKFB5Q0Z1bmN0aW9uKVB5SW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCwKICAgIE1FVEhfVkFSQVJHUywgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXRfX2RvY19ffSwKICNlbmRpZgotI2VuZGlmICAKKyNlbmRpZgogICB7TlVMTCwgTlVMTH0KIH07CiAKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCiAgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9sb2NhbGUiLCBQeUxvY2FsZV9NZXRob2RzKTsKICAgICBpZiAobSA9PSBOVUxMKQotICAgIAlyZXR1cm47CisgICAgcmV0dXJuOwogCiAgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CiAKQEAgLTc0NCwxMyArNzQ0LDEzIEBACiAKICNpZmRlZiBIQVZFX0xBTkdJTkZPX0gKICAgICBmb3IgKGkgPSAwOyBsYW5naW5mb19jb25zdGFudHNbaV0ubmFtZTsgaSsrKSB7Ci0JICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sIGxhbmdpbmZvX2NvbnN0YW50c1tpXS5uYW1lLAotCQkJCSAgICBsYW5naW5mb19jb25zdGFudHNbaV0udmFsdWUpOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCBsYW5naW5mb19jb25zdGFudHNbaV0ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ2luZm9fY29uc3RhbnRzW2ldLnZhbHVlKTsKICAgICB9CiAjZW5kaWYKIH0KIAotLyogCisvKgogTG9jYWwgdmFyaWFibGVzOgogYy1iYXNpYy1vZmZzZXQ6IDQKIGluZGVudC10YWJzLW1vZGU6IG5pbApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbHNwcm9mLmMgYi9Nb2R1bGVzL19sc3Byb2YuYwppbmRleCA4ODIwZmNmLi4wNDljOTRkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19sc3Byb2YuYworKysgYi9Nb2R1bGVzL19sc3Byb2YuYwpAQCAtMTcsMTkgKzE3LDE5IEBACiBzdGF0aWMgUFlfTE9OR19MT05HCiBocFRpbWVyKHZvaWQpCiB7Ci0JTEFSR0VfSU5URUdFUiBsaTsKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbGkpOwotCXJldHVybiBsaS5RdWFkUGFydDsKKyAgICBMQVJHRV9JTlRFR0VSIGxpOworICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZsaSk7CisgICAgcmV0dXJuIGxpLlF1YWRQYXJ0OwogfQogCiBzdGF0aWMgZG91YmxlCiBocFRpbWVyVW5pdCh2b2lkKQogewotCUxBUkdFX0lOVEVHRVIgbGk7Ci0JaWYgKFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmxpKSkKLQkJcmV0dXJuIDEuMCAvIGxpLlF1YWRQYXJ0OwotCWVsc2UKLQkJcmV0dXJuIDAuMDAwMDAxOyAgLyogdW5saWtlbHkgKi8KKyAgICBMQVJHRV9JTlRFR0VSIGxpOworICAgIGlmIChRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZsaSkpCisgICAgICAgIHJldHVybiAxLjAgLyBsaS5RdWFkUGFydDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwLjAwMDAwMTsgIC8qIHVubGlrZWx5ICovCiB9CiAKICNlbHNlICAvKiAhTVNfV0lORE9XUyAqLwpAQCAtNDgsMjIgKzQ4LDIyIEBACiBzdGF0aWMgUFlfTE9OR19MT05HCiBocFRpbWVyKHZvaWQpCiB7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7Ci0JUFlfTE9OR19MT05HIHJldDsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBQWV9MT05HX0xPTkcgcmV0OwogI2lmZGVmIEdFVFRJTUVPRkRBWV9OT19UWgotCWdldHRpbWVvZmRheSgmdHYpOworICAgIGdldHRpbWVvZmRheSgmdHYpOwogI2Vsc2UKLQlnZXR0aW1lb2ZkYXkoJnR2LCAoc3RydWN0IHRpbWV6b25lICopTlVMTCk7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgKHN0cnVjdCB0aW1lem9uZSAqKU5VTEwpOwogI2VuZGlmCi0JcmV0ID0gdHYudHZfc2VjOwotCXJldCA9IHJldCAqIDEwMDAwMDAgKyB0di50dl91c2VjOwotCXJldHVybiByZXQ7CisgICAgcmV0ID0gdHYudHZfc2VjOworICAgIHJldCA9IHJldCAqIDEwMDAwMDAgKyB0di50dl91c2VjOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBkb3VibGUKIGhwVGltZXJVbml0KHZvaWQpCiB7Ci0JcmV0dXJuIDAuMDAwMDAxOworICAgIHJldHVybiAwLjAwMDAwMTsKIH0KIAogI2VuZGlmICAvKiBNU19XSU5ET1dTICovCkBAIC03NSw0MSArNzUsNDEgQEAKIAogLyogcmVwcmVzZW50cyBhIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGFub3RoZXIgZnVuY3Rpb24gKi8KIHR5cGVkZWYgc3RydWN0IF9Qcm9maWxlclN1YkVudHJ5IHsKLQlyb3RhdGluZ19ub2RlX3QgaGVhZGVyOwotCVBZX0xPTkdfTE9ORyB0dDsKLQlQWV9MT05HX0xPTkcgaXQ7Ci0JbG9uZyBjYWxsY291bnQ7Ci0JbG9uZyByZWN1cnNpdmVjYWxsY291bnQ7Ci0JbG9uZyByZWN1cnNpb25MZXZlbDsKKyAgICByb3RhdGluZ19ub2RlX3QgaGVhZGVyOworICAgIFBZX0xPTkdfTE9ORyB0dDsKKyAgICBQWV9MT05HX0xPTkcgaXQ7CisgICAgbG9uZyBjYWxsY291bnQ7CisgICAgbG9uZyByZWN1cnNpdmVjYWxsY291bnQ7CisgICAgbG9uZyByZWN1cnNpb25MZXZlbDsKIH0gUHJvZmlsZXJTdWJFbnRyeTsKIAogLyogcmVwcmVzZW50cyBhIGZ1bmN0aW9uIG9yIHVzZXIgZGVmaW5lZCBibG9jayAqLwogdHlwZWRlZiBzdHJ1Y3QgX1Byb2ZpbGVyRW50cnkgewotCXJvdGF0aW5nX25vZGVfdCBoZWFkZXI7Ci0JUHlPYmplY3QgKnVzZXJPYmo7IC8qIFB5Q29kZU9iamVjdCwgb3IgYSBkZXNjcmlwdGl2ZSBzdHIgZm9yIGJ1aWx0aW5zICovCi0JUFlfTE9OR19MT05HIHR0OyAvKiB0b3RhbCB0aW1lIGluIHRoaXMgZW50cnkgKi8KLQlQWV9MT05HX0xPTkcgaXQ7IC8qIGlubGluZSB0aW1lIGluIHRoaXMgZW50cnkgKG5vdCBpbiBzdWJjYWxscykgKi8KLQlsb25nIGNhbGxjb3VudDsgLyogaG93IG1hbnkgdGltZXMgdGhpcyB3YXMgY2FsbGVkICovCi0JbG9uZyByZWN1cnNpdmVjYWxsY291bnQ7IC8qIGhvdyBtYW55IHRpbWVzIGNhbGxlZCByZWN1cnNpdmVseSAqLwotCWxvbmcgcmVjdXJzaW9uTGV2ZWw7Ci0Jcm90YXRpbmdfbm9kZV90ICpjYWxsczsKKyAgICByb3RhdGluZ19ub2RlX3QgaGVhZGVyOworICAgIFB5T2JqZWN0ICp1c2VyT2JqOyAvKiBQeUNvZGVPYmplY3QsIG9yIGEgZGVzY3JpcHRpdmUgc3RyIGZvciBidWlsdGlucyAqLworICAgIFBZX0xPTkdfTE9ORyB0dDsgLyogdG90YWwgdGltZSBpbiB0aGlzIGVudHJ5ICovCisgICAgUFlfTE9OR19MT05HIGl0OyAvKiBpbmxpbmUgdGltZSBpbiB0aGlzIGVudHJ5IChub3QgaW4gc3ViY2FsbHMpICovCisgICAgbG9uZyBjYWxsY291bnQ7IC8qIGhvdyBtYW55IHRpbWVzIHRoaXMgd2FzIGNhbGxlZCAqLworICAgIGxvbmcgcmVjdXJzaXZlY2FsbGNvdW50OyAvKiBob3cgbWFueSB0aW1lcyBjYWxsZWQgcmVjdXJzaXZlbHkgKi8KKyAgICBsb25nIHJlY3Vyc2lvbkxldmVsOworICAgIHJvdGF0aW5nX25vZGVfdCAqY2FsbHM7CiB9IFByb2ZpbGVyRW50cnk7CiAKIHR5cGVkZWYgc3RydWN0IF9Qcm9maWxlckNvbnRleHQgewotCVBZX0xPTkdfTE9ORyB0MDsKLQlQWV9MT05HX0xPTkcgc3VidDsKLQlzdHJ1Y3QgX1Byb2ZpbGVyQ29udGV4dCAqcHJldmlvdXM7Ci0JUHJvZmlsZXJFbnRyeSAqY3R4RW50cnk7CisgICAgUFlfTE9OR19MT05HIHQwOworICAgIFBZX0xPTkdfTE9ORyBzdWJ0OworICAgIHN0cnVjdCBfUHJvZmlsZXJDb250ZXh0ICpwcmV2aW91czsKKyAgICBQcm9maWxlckVudHJ5ICpjdHhFbnRyeTsKIH0gUHJvZmlsZXJDb250ZXh0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCXJvdGF0aW5nX25vZGVfdCAqcHJvZmlsZXJFbnRyaWVzOwotCVByb2ZpbGVyQ29udGV4dCAqY3VycmVudFByb2ZpbGVyQ29udGV4dDsKLQlQcm9maWxlckNvbnRleHQgKmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0OwotCWludCBmbGFnczsKLQlQeU9iamVjdCAqZXh0ZXJuYWxUaW1lcjsKLQlkb3VibGUgZXh0ZXJuYWxUaW1lclVuaXQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIHJvdGF0aW5nX25vZGVfdCAqcHJvZmlsZXJFbnRyaWVzOworICAgIFByb2ZpbGVyQ29udGV4dCAqY3VycmVudFByb2ZpbGVyQ29udGV4dDsKKyAgICBQcm9maWxlckNvbnRleHQgKmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0OworICAgIGludCBmbGFnczsKKyAgICBQeU9iamVjdCAqZXh0ZXJuYWxUaW1lcjsKKyAgICBkb3VibGUgZXh0ZXJuYWxUaW1lclVuaXQ7CiB9IFByb2ZpbGVyT2JqZWN0OwogCiAjZGVmaW5lIFBPRl9FTkFCTEVEICAgICAweDAwMQpAQCAtMTI5LDQwNyArMTI5LDQwNyBAQAogCiBzdGF0aWMgUFlfTE9OR19MT05HIENhbGxFeHRlcm5hbFRpbWVyKFByb2ZpbGVyT2JqZWN0ICpwT2JqKQogewotCVBZX0xPTkdfTE9ORyByZXN1bHQ7Ci0JUHlPYmplY3QgKm8gPSBQeU9iamVjdF9DYWxsKHBPYmotPmV4dGVybmFsVGltZXIsIGVtcHR5X3R1cGxlLCBOVUxMKTsKLQlpZiAobyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShwT2JqLT5leHRlcm5hbFRpbWVyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChwT2JqLT5leHRlcm5hbFRpbWVyVW5pdCA+IDAuMCkgewotCQkvKiBpbnRlcnByZXQgdGhlIHJlc3VsdCBhcyBhbiBpbnRlZ2VyIHRoYXQgd2lsbCBiZSBzY2FsZWQKLQkJICAgaW4gcHJvZmlsZXJfZ2V0c3RhdHMoKSAqLwotCQlyZXN1bHQgPSBQeUxvbmdfQXNMb25nTG9uZyhvKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIGludGVycHJldCB0aGUgcmVzdWx0IGFzIGEgZG91YmxlIG1lYXN1cmVkIGluIHNlY29uZHMuCi0JCSAgIEFzIHRoZSBwcm9maWxlciB3b3JrcyB3aXRoIFBZX0xPTkdfTE9ORyBpbnRlcm5hbGx5Ci0JCSAgIHdlIGNvbnZlcnQgaXQgdG8gYSBsYXJnZSBpbnRlZ2VyICovCi0JCWRvdWJsZSB2YWwgPSBQeUZsb2F0X0FzRG91YmxlKG8pOwotCQkvKiBlcnJvciBoYW5kbGluZyBkZWxheWVkIHRvIHRoZSBjb2RlIGJlbG93ICovCi0JCXJlc3VsdCA9IChQWV9MT05HX0xPTkcpICh2YWwgKiBET1VCTEVfVElNRVJfUFJFQ0lTSU9OKTsKLQl9Ci0JUHlfREVDUkVGKG8pOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShwT2JqLT5leHRlcm5hbFRpbWVyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUFlfTE9OR19MT05HIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqbyA9IFB5T2JqZWN0X0NhbGwocE9iai0+ZXh0ZXJuYWxUaW1lciwgZW1wdHlfdHVwbGUsIE5VTEwpOworICAgIGlmIChvID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHBPYmotPmV4dGVybmFsVGltZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHBPYmotPmV4dGVybmFsVGltZXJVbml0ID4gMC4wKSB7CisgICAgICAgIC8qIGludGVycHJldCB0aGUgcmVzdWx0IGFzIGFuIGludGVnZXIgdGhhdCB3aWxsIGJlIHNjYWxlZAorICAgICAgICAgICBpbiBwcm9maWxlcl9nZXRzdGF0cygpICovCisgICAgICAgIHJlc3VsdCA9IFB5TG9uZ19Bc0xvbmdMb25nKG8pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogaW50ZXJwcmV0IHRoZSByZXN1bHQgYXMgYSBkb3VibGUgbWVhc3VyZWQgaW4gc2Vjb25kcy4KKyAgICAgICAgICAgQXMgdGhlIHByb2ZpbGVyIHdvcmtzIHdpdGggUFlfTE9OR19MT05HIGludGVybmFsbHkKKyAgICAgICAgICAgd2UgY29udmVydCBpdCB0byBhIGxhcmdlIGludGVnZXIgKi8KKyAgICAgICAgZG91YmxlIHZhbCA9IFB5RmxvYXRfQXNEb3VibGUobyk7CisgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nIGRlbGF5ZWQgdG8gdGhlIGNvZGUgYmVsb3cgKi8KKyAgICAgICAgcmVzdWx0ID0gKFBZX0xPTkdfTE9ORykgKHZhbCAqIERPVUJMRV9USU1FUl9QUkVDSVNJT04pOworICAgIH0KKyAgICBQeV9ERUNSRUYobyk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHBPYmotPmV4dGVybmFsVGltZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotI2RlZmluZSBDQUxMX1RJTUVSKHBPYmopCSgocE9iaiktPmV4dGVybmFsVGltZXIgPwkJXAotCQkJCQlDYWxsRXh0ZXJuYWxUaW1lcihwT2JqKSA6CVwKLQkJCQkJaHBUaW1lcigpKQorI2RlZmluZSBDQUxMX1RJTUVSKHBPYmopICAgICAgICAoKHBPYmopLT5leHRlcm5hbFRpbWVyID8gICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxFeHRlcm5hbFRpbWVyKHBPYmopIDogICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwVGltZXIoKSkKIAogLyoqKiBQcm9maWxlck9iamVjdCAqKiovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBub3JtYWxpemVVc2VyT2JqKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlDRnVuY3Rpb25PYmplY3QgKmZuOwotCWlmICghUHlDRnVuY3Rpb25fQ2hlY2sob2JqKSkgewotCQlQeV9JTkNSRUYob2JqKTsKLQkJcmV0dXJuIG9iajsKLQl9Ci0JLyogUmVwbGFjZSBidWlsdC1pbiBmdW5jdGlvbiBvYmplY3RzIHdpdGggYSBkZXNjcmlwdGl2ZSBzdHJpbmcKLQkgICBiZWNhdXNlIG9mIGJ1aWx0LWluIG1ldGhvZHMgLS0ga2VlcGluZyBhIHJlZmVyZW5jZSB0bwotCSAgIF9fc2VsZl9fIGlzIHByb2JhYmx5IG5vdCBhIGdvb2QgaWRlYS4gKi8KLQlmbiA9IChQeUNGdW5jdGlvbk9iamVjdCAqKW9iajsKKyAgICBQeUNGdW5jdGlvbk9iamVjdCAqZm47CisgICAgaWYgKCFQeUNGdW5jdGlvbl9DaGVjayhvYmopKSB7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgICAgICByZXR1cm4gb2JqOworICAgIH0KKyAgICAvKiBSZXBsYWNlIGJ1aWx0LWluIGZ1bmN0aW9uIG9iamVjdHMgd2l0aCBhIGRlc2NyaXB0aXZlIHN0cmluZworICAgICAgIGJlY2F1c2Ugb2YgYnVpbHQtaW4gbWV0aG9kcyAtLSBrZWVwaW5nIGEgcmVmZXJlbmNlIHRvCisgICAgICAgX19zZWxmX18gaXMgcHJvYmFibHkgbm90IGEgZ29vZCBpZGVhLiAqLworICAgIGZuID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb2JqOwogCi0JaWYgKGZuLT5tX3NlbGYgPT0gTlVMTCkgewotCQkvKiBidWlsdC1pbiBmdW5jdGlvbjogbG9vayB1cCB0aGUgbW9kdWxlIG5hbWUgKi8KLQkJUHlPYmplY3QgKm1vZCA9IGZuLT5tX21vZHVsZTsKLQkJY2hhciAqbW9kbmFtZTsKLQkJaWYgKG1vZCAmJiBQeVN0cmluZ19DaGVjayhtb2QpKSB7Ci0JCQltb2RuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKG1vZCk7Ci0JCX0KLQkJZWxzZSBpZiAobW9kICYmIFB5TW9kdWxlX0NoZWNrKG1vZCkpIHsKLQkJCW1vZG5hbWUgPSBQeU1vZHVsZV9HZXROYW1lKG1vZCk7Ci0JCQlpZiAobW9kbmFtZSA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQltb2RuYW1lID0gIl9fYnVpbHRpbl9fIjsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW1vZG5hbWUgPSAiX19idWlsdGluX18iOwotCQl9Ci0JCWlmIChzdHJjbXAobW9kbmFtZSwgIl9fYnVpbHRpbl9fIikgIT0gMCkKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMuJXM+IiwKLQkJCQkJCSAgIG1vZG5hbWUsCi0JCQkJCQkgICBmbi0+bV9tbC0+bWxfbmFtZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXM+IiwKLQkJCQkJCSAgIGZuLT5tX21sLT5tbF9uYW1lKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIGJ1aWx0LWluIG1ldGhvZDogdHJ5IHRvIHJldHVybgotCQkJcmVwcihnZXRhdHRyKHR5cGUoX19zZWxmX18pLCBfX25hbWVfXykpCi0JCSovCi0JCVB5T2JqZWN0ICpzZWxmID0gZm4tPm1fc2VsZjsKLQkJUHlPYmplY3QgKm5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZuLT5tX21sLT5tbF9uYW1lKTsKLQkJaWYgKG5hbWUgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKm1vID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShzZWxmKSwgbmFtZSk7Ci0JCQlQeV9YSU5DUkVGKG1vKTsKLQkJCVB5X0RFQ1JFRihuYW1lKTsKLQkJCWlmIChtbyAhPSBOVUxMKSB7Ci0JCQkJUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X1JlcHIobW8pOwotCQkJCVB5X0RFQ1JFRihtbyk7Ci0JCQkJaWYgKHJlcyAhPSBOVUxMKQotCQkJCQlyZXR1cm4gcmVzOwotCQkJfQotCQl9Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8YnVpbHQtaW4gbWV0aG9kICVzPiIsCi0JCQkJCSAgIGZuLT5tX21sLT5tbF9uYW1lKTsKLQl9CisgICAgaWYgKGZuLT5tX3NlbGYgPT0gTlVMTCkgeworICAgICAgICAvKiBidWlsdC1pbiBmdW5jdGlvbjogbG9vayB1cCB0aGUgbW9kdWxlIG5hbWUgKi8KKyAgICAgICAgUHlPYmplY3QgKm1vZCA9IGZuLT5tX21vZHVsZTsKKyAgICAgICAgY2hhciAqbW9kbmFtZTsKKyAgICAgICAgaWYgKG1vZCAmJiBQeVN0cmluZ19DaGVjayhtb2QpKSB7CisgICAgICAgICAgICBtb2RuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKG1vZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobW9kICYmIFB5TW9kdWxlX0NoZWNrKG1vZCkpIHsKKyAgICAgICAgICAgIG1vZG5hbWUgPSBQeU1vZHVsZV9HZXROYW1lKG1vZCk7CisgICAgICAgICAgICBpZiAobW9kbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gIl9fYnVpbHRpbl9fIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1vZG5hbWUgPSAiX19idWlsdGluX18iOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAobW9kbmFtZSwgIl9fYnVpbHRpbl9fIikgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMuJXM+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbi0+bV9tbC0+bWxfbmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXM+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuLT5tX21sLT5tbF9uYW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGJ1aWx0LWluIG1ldGhvZDogdHJ5IHRvIHJldHVybgorICAgICAgICAgICAgcmVwcihnZXRhdHRyKHR5cGUoX19zZWxmX18pLCBfX25hbWVfXykpCisgICAgICAgICovCisgICAgICAgIFB5T2JqZWN0ICpzZWxmID0gZm4tPm1fc2VsZjsKKyAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZuLT5tX21sLT5tbF9uYW1lKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKm1vID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShzZWxmKSwgbmFtZSk7CisgICAgICAgICAgICBQeV9YSU5DUkVGKG1vKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICAgICAgICAgIGlmIChtbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X1JlcHIobW8pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtbyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8YnVpbHQtaW4gbWV0aG9kICVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuLT5tX21sLT5tbF9uYW1lKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQcm9maWxlckVudHJ5KgogbmV3UHJvZmlsZXJFbnRyeShQcm9maWxlck9iamVjdCAqcE9iaiwgdm9pZCAqa2V5LCBQeU9iamVjdCAqdXNlck9iaikKIHsKLQlQcm9maWxlckVudHJ5ICpzZWxmOwotCXNlbGYgPSAoUHJvZmlsZXJFbnRyeSopIG1hbGxvYyhzaXplb2YoUHJvZmlsZXJFbnRyeSkpOwotCWlmIChzZWxmID09IE5VTEwpIHsKLQkJcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdXNlck9iaiA9IG5vcm1hbGl6ZVVzZXJPYmoodXNlck9iaik7Ci0JaWYgKHVzZXJPYmogPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOwotCQlmcmVlKHNlbGYpOwotCQlwT2JqLT5mbGFncyB8PSBQT0ZfTk9NRU1PUlk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzZWxmLT5oZWFkZXIua2V5ID0ga2V5OwotCXNlbGYtPnVzZXJPYmogPSB1c2VyT2JqOwotCXNlbGYtPnR0ID0gMDsKLQlzZWxmLT5pdCA9IDA7Ci0Jc2VsZi0+Y2FsbGNvdW50ID0gMDsKLQlzZWxmLT5yZWN1cnNpdmVjYWxsY291bnQgPSAwOwotCXNlbGYtPnJlY3Vyc2lvbkxldmVsID0gMDsKLQlzZWxmLT5jYWxscyA9IEVNUFRZX1JPVEFUSU5HX1RSRUU7Ci0JUm90YXRpbmdUcmVlX0FkZCgmcE9iai0+cHJvZmlsZXJFbnRyaWVzLCAmc2VsZi0+aGVhZGVyKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQcm9maWxlckVudHJ5ICpzZWxmOworICAgIHNlbGYgPSAoUHJvZmlsZXJFbnRyeSopIG1hbGxvYyhzaXplb2YoUHJvZmlsZXJFbnRyeSkpOworICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdXNlck9iaiA9IG5vcm1hbGl6ZVVzZXJPYmoodXNlck9iaik7CisgICAgaWYgKHVzZXJPYmogPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBmcmVlKHNlbGYpOworICAgICAgICBwT2JqLT5mbGFncyB8PSBQT0ZfTk9NRU1PUlk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5oZWFkZXIua2V5ID0ga2V5OworICAgIHNlbGYtPnVzZXJPYmogPSB1c2VyT2JqOworICAgIHNlbGYtPnR0ID0gMDsKKyAgICBzZWxmLT5pdCA9IDA7CisgICAgc2VsZi0+Y2FsbGNvdW50ID0gMDsKKyAgICBzZWxmLT5yZWN1cnNpdmVjYWxsY291bnQgPSAwOworICAgIHNlbGYtPnJlY3Vyc2lvbkxldmVsID0gMDsKKyAgICBzZWxmLT5jYWxscyA9IEVNUFRZX1JPVEFUSU5HX1RSRUU7CisgICAgUm90YXRpbmdUcmVlX0FkZCgmcE9iai0+cHJvZmlsZXJFbnRyaWVzLCAmc2VsZi0+aGVhZGVyKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIFByb2ZpbGVyRW50cnkqCiBnZXRFbnRyeShQcm9maWxlck9iamVjdCAqcE9iaiwgdm9pZCAqa2V5KQogewotCXJldHVybiAoUHJvZmlsZXJFbnRyeSopIFJvdGF0aW5nVHJlZV9HZXQoJnBPYmotPnByb2ZpbGVyRW50cmllcywga2V5KTsKKyAgICByZXR1cm4gKFByb2ZpbGVyRW50cnkqKSBSb3RhdGluZ1RyZWVfR2V0KCZwT2JqLT5wcm9maWxlckVudHJpZXMsIGtleSk7CiB9CiAKLXN0YXRpYyBQcm9maWxlclN1YkVudHJ5ICogCitzdGF0aWMgUHJvZmlsZXJTdWJFbnRyeSAqCiBnZXRTdWJFbnRyeShQcm9maWxlck9iamVjdCAqcE9iaiwgUHJvZmlsZXJFbnRyeSAqY2FsbGVyLCBQcm9maWxlckVudHJ5KiBlbnRyeSkKIHsKLQlyZXR1cm4gKFByb2ZpbGVyU3ViRW50cnkqKSBSb3RhdGluZ1RyZWVfR2V0KCZjYWxsZXItPmNhbGxzLAotCQkJCQkJICAgICh2b2lkICopZW50cnkpOworICAgIHJldHVybiAoUHJvZmlsZXJTdWJFbnRyeSopIFJvdGF0aW5nVHJlZV9HZXQoJmNhbGxlci0+Y2FsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWVudHJ5KTsKIH0KIAogc3RhdGljIFByb2ZpbGVyU3ViRW50cnkgKgogbmV3U3ViRW50cnkoUHJvZmlsZXJPYmplY3QgKnBPYmosICBQcm9maWxlckVudHJ5ICpjYWxsZXIsIFByb2ZpbGVyRW50cnkqIGVudHJ5KQogewotCVByb2ZpbGVyU3ViRW50cnkgKnNlbGY7Ci0Jc2VsZiA9IChQcm9maWxlclN1YkVudHJ5KikgbWFsbG9jKHNpemVvZihQcm9maWxlclN1YkVudHJ5KSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkgewotCQlwT2JqLT5mbGFncyB8PSBQT0ZfTk9NRU1PUlk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzZWxmLT5oZWFkZXIua2V5ID0gKHZvaWQgKillbnRyeTsKLQlzZWxmLT50dCA9IDA7Ci0Jc2VsZi0+aXQgPSAwOwotCXNlbGYtPmNhbGxjb3VudCA9IDA7Ci0Jc2VsZi0+cmVjdXJzaXZlY2FsbGNvdW50ID0gMDsKLQlzZWxmLT5yZWN1cnNpb25MZXZlbCA9IDA7Ci0JUm90YXRpbmdUcmVlX0FkZCgmY2FsbGVyLT5jYWxscywgJnNlbGYtPmhlYWRlcik7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHJvZmlsZXJTdWJFbnRyeSAqc2VsZjsKKyAgICBzZWxmID0gKFByb2ZpbGVyU3ViRW50cnkqKSBtYWxsb2Moc2l6ZW9mKFByb2ZpbGVyU3ViRW50cnkpKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgIHBPYmotPmZsYWdzIHw9IFBPRl9OT01FTU9SWTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNlbGYtPmhlYWRlci5rZXkgPSAodm9pZCAqKWVudHJ5OworICAgIHNlbGYtPnR0ID0gMDsKKyAgICBzZWxmLT5pdCA9IDA7CisgICAgc2VsZi0+Y2FsbGNvdW50ID0gMDsKKyAgICBzZWxmLT5yZWN1cnNpdmVjYWxsY291bnQgPSAwOworICAgIHNlbGYtPnJlY3Vyc2lvbkxldmVsID0gMDsKKyAgICBSb3RhdGluZ1RyZWVfQWRkKCZjYWxsZXItPmNhbGxzLCAmc2VsZi0+aGVhZGVyKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIGludCBmcmVlU3ViRW50cnkocm90YXRpbmdfbm9kZV90ICpoZWFkZXIsIHZvaWQgKmFyZykKIHsKLQlQcm9maWxlclN1YkVudHJ5ICpzdWJlbnRyeSA9IChQcm9maWxlclN1YkVudHJ5KikgaGVhZGVyOwotCWZyZWUoc3ViZW50cnkpOwotCXJldHVybiAwOworICAgIFByb2ZpbGVyU3ViRW50cnkgKnN1YmVudHJ5ID0gKFByb2ZpbGVyU3ViRW50cnkqKSBoZWFkZXI7CisgICAgZnJlZShzdWJlbnRyeSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZnJlZUVudHJ5KHJvdGF0aW5nX25vZGVfdCAqaGVhZGVyLCB2b2lkICphcmcpCiB7Ci0JUHJvZmlsZXJFbnRyeSAqZW50cnkgPSAoUHJvZmlsZXJFbnRyeSopIGhlYWRlcjsKLQlSb3RhdGluZ1RyZWVfRW51bShlbnRyeS0+Y2FsbHMsIGZyZWVTdWJFbnRyeSwgTlVMTCk7Ci0JUHlfREVDUkVGKGVudHJ5LT51c2VyT2JqKTsKLQlmcmVlKGVudHJ5KTsKLQlyZXR1cm4gMDsKKyAgICBQcm9maWxlckVudHJ5ICplbnRyeSA9IChQcm9maWxlckVudHJ5KikgaGVhZGVyOworICAgIFJvdGF0aW5nVHJlZV9FbnVtKGVudHJ5LT5jYWxscywgZnJlZVN1YkVudHJ5LCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoZW50cnktPnVzZXJPYmopOworICAgIGZyZWUoZW50cnkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBjbGVhckVudHJpZXMoUHJvZmlsZXJPYmplY3QgKnBPYmopCiB7Ci0JUm90YXRpbmdUcmVlX0VudW0ocE9iai0+cHJvZmlsZXJFbnRyaWVzLCBmcmVlRW50cnksIE5VTEwpOwotCXBPYmotPnByb2ZpbGVyRW50cmllcyA9IEVNUFRZX1JPVEFUSU5HX1RSRUU7Ci0JLyogcmVsZWFzZSB0aGUgbWVtb3J5IGhvbGQgYnkgdGhlIFByb2ZpbGVyQ29udGV4dHMgKi8KLQlpZiAocE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCkgewotCQlmcmVlKHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQpOwotCQlwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0ID0gTlVMTDsKLQl9Ci0Jd2hpbGUgKHBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0KSB7Ci0JCVByb2ZpbGVyQ29udGV4dCAqYyA9IHBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0OwotCQlwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dCA9IGMtPnByZXZpb3VzOwotCQlmcmVlKGMpOwotCX0KLQlwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dCA9IE5VTEw7CisgICAgUm90YXRpbmdUcmVlX0VudW0ocE9iai0+cHJvZmlsZXJFbnRyaWVzLCBmcmVlRW50cnksIE5VTEwpOworICAgIHBPYmotPnByb2ZpbGVyRW50cmllcyA9IEVNUFRZX1JPVEFUSU5HX1RSRUU7CisgICAgLyogcmVsZWFzZSB0aGUgbWVtb3J5IGhvbGQgYnkgdGhlIFByb2ZpbGVyQ29udGV4dHMgKi8KKyAgICBpZiAocE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCkgeworICAgICAgICBmcmVlKHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQpOworICAgICAgICBwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0ID0gTlVMTDsKKyAgICB9CisgICAgd2hpbGUgKHBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0KSB7CisgICAgICAgIFByb2ZpbGVyQ29udGV4dCAqYyA9IHBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0OworICAgICAgICBwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dCA9IGMtPnByZXZpb3VzOworICAgICAgICBmcmVlKGMpOworICAgIH0KKyAgICBwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dCA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkCiBpbml0Q29udGV4dChQcm9maWxlck9iamVjdCAqcE9iaiwgUHJvZmlsZXJDb250ZXh0ICpzZWxmLCBQcm9maWxlckVudHJ5ICplbnRyeSkKIHsKLQlzZWxmLT5jdHhFbnRyeSA9IGVudHJ5OwotCXNlbGYtPnN1YnQgPSAwOwotCXNlbGYtPnByZXZpb3VzID0gcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dDsKLQlwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0ID0gc2VsZjsKLQkrK2VudHJ5LT5yZWN1cnNpb25MZXZlbDsKLQlpZiAoKHBPYmotPmZsYWdzICYgUE9GX1NVQkNBTExTKSAmJiBzZWxmLT5wcmV2aW91cykgewotCQkvKiBmaW5kIG9yIGNyZWF0ZSBhbiBlbnRyeSBmb3IgbWUgaW4gbXkgY2FsbGVyJ3MgZW50cnkgKi8KLQkJUHJvZmlsZXJFbnRyeSAqY2FsbGVyID0gc2VsZi0+cHJldmlvdXMtPmN0eEVudHJ5OwotCQlQcm9maWxlclN1YkVudHJ5ICpzdWJlbnRyeSA9IGdldFN1YkVudHJ5KHBPYmosIGNhbGxlciwgZW50cnkpOwotCQlpZiAoc3ViZW50cnkgPT0gTlVMTCkKLQkJCXN1YmVudHJ5ID0gbmV3U3ViRW50cnkocE9iaiwgY2FsbGVyLCBlbnRyeSk7Ci0JCWlmIChzdWJlbnRyeSkKLQkJCSsrc3ViZW50cnktPnJlY3Vyc2lvbkxldmVsOwotCX0KLQlzZWxmLT50MCA9IENBTExfVElNRVIocE9iaik7CisgICAgc2VsZi0+Y3R4RW50cnkgPSBlbnRyeTsKKyAgICBzZWxmLT5zdWJ0ID0gMDsKKyAgICBzZWxmLT5wcmV2aW91cyA9IHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQ7CisgICAgcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IHNlbGY7CisgICAgKytlbnRyeS0+cmVjdXJzaW9uTGV2ZWw7CisgICAgaWYgKChwT2JqLT5mbGFncyAmIFBPRl9TVUJDQUxMUykgJiYgc2VsZi0+cHJldmlvdXMpIHsKKyAgICAgICAgLyogZmluZCBvciBjcmVhdGUgYW4gZW50cnkgZm9yIG1lIGluIG15IGNhbGxlcidzIGVudHJ5ICovCisgICAgICAgIFByb2ZpbGVyRW50cnkgKmNhbGxlciA9IHNlbGYtPnByZXZpb3VzLT5jdHhFbnRyeTsKKyAgICAgICAgUHJvZmlsZXJTdWJFbnRyeSAqc3ViZW50cnkgPSBnZXRTdWJFbnRyeShwT2JqLCBjYWxsZXIsIGVudHJ5KTsKKyAgICAgICAgaWYgKHN1YmVudHJ5ID09IE5VTEwpCisgICAgICAgICAgICBzdWJlbnRyeSA9IG5ld1N1YkVudHJ5KHBPYmosIGNhbGxlciwgZW50cnkpOworICAgICAgICBpZiAoc3ViZW50cnkpCisgICAgICAgICAgICArK3N1YmVudHJ5LT5yZWN1cnNpb25MZXZlbDsKKyAgICB9CisgICAgc2VsZi0+dDAgPSBDQUxMX1RJTUVSKHBPYmopOwogfQogCiBzdGF0aWMgdm9pZAogU3RvcChQcm9maWxlck9iamVjdCAqcE9iaiwgUHJvZmlsZXJDb250ZXh0ICpzZWxmLCBQcm9maWxlckVudHJ5ICplbnRyeSkKIHsKLQlQWV9MT05HX0xPTkcgdHQgPSBDQUxMX1RJTUVSKHBPYmopIC0gc2VsZi0+dDA7Ci0JUFlfTE9OR19MT05HIGl0ID0gdHQgLSBzZWxmLT5zdWJ0OwotCWlmIChzZWxmLT5wcmV2aW91cykKLQkJc2VsZi0+cHJldmlvdXMtPnN1YnQgKz0gdHQ7Ci0JcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IHNlbGYtPnByZXZpb3VzOwotCWlmICgtLWVudHJ5LT5yZWN1cnNpb25MZXZlbCA9PSAwKQotCQllbnRyeS0+dHQgKz0gdHQ7Ci0JZWxzZQotCQkrK2VudHJ5LT5yZWN1cnNpdmVjYWxsY291bnQ7Ci0JZW50cnktPml0ICs9IGl0OwotCWVudHJ5LT5jYWxsY291bnQrKzsKLQlpZiAoKHBPYmotPmZsYWdzICYgUE9GX1NVQkNBTExTKSAmJiBzZWxmLT5wcmV2aW91cykgewotCQkvKiBmaW5kIG9yIGNyZWF0ZSBhbiBlbnRyeSBmb3IgbWUgaW4gbXkgY2FsbGVyJ3MgZW50cnkgKi8KLQkJUHJvZmlsZXJFbnRyeSAqY2FsbGVyID0gc2VsZi0+cHJldmlvdXMtPmN0eEVudHJ5OwotCQlQcm9maWxlclN1YkVudHJ5ICpzdWJlbnRyeSA9IGdldFN1YkVudHJ5KHBPYmosIGNhbGxlciwgZW50cnkpOwotCQlpZiAoc3ViZW50cnkpIHsKLQkJCWlmICgtLXN1YmVudHJ5LT5yZWN1cnNpb25MZXZlbCA9PSAwKQotCQkJCXN1YmVudHJ5LT50dCArPSB0dDsKLQkJCWVsc2UKLQkJCQkrK3N1YmVudHJ5LT5yZWN1cnNpdmVjYWxsY291bnQ7Ci0JCQlzdWJlbnRyeS0+aXQgKz0gaXQ7Ci0JCQkrK3N1YmVudHJ5LT5jYWxsY291bnQ7Ci0JCX0KLQl9CisgICAgUFlfTE9OR19MT05HIHR0ID0gQ0FMTF9USU1FUihwT2JqKSAtIHNlbGYtPnQwOworICAgIFBZX0xPTkdfTE9ORyBpdCA9IHR0IC0gc2VsZi0+c3VidDsKKyAgICBpZiAoc2VsZi0+cHJldmlvdXMpCisgICAgICAgIHNlbGYtPnByZXZpb3VzLT5zdWJ0ICs9IHR0OworICAgIHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQgPSBzZWxmLT5wcmV2aW91czsKKyAgICBpZiAoLS1lbnRyeS0+cmVjdXJzaW9uTGV2ZWwgPT0gMCkKKyAgICAgICAgZW50cnktPnR0ICs9IHR0OworICAgIGVsc2UKKyAgICAgICAgKytlbnRyeS0+cmVjdXJzaXZlY2FsbGNvdW50OworICAgIGVudHJ5LT5pdCArPSBpdDsKKyAgICBlbnRyeS0+Y2FsbGNvdW50Kys7CisgICAgaWYgKChwT2JqLT5mbGFncyAmIFBPRl9TVUJDQUxMUykgJiYgc2VsZi0+cHJldmlvdXMpIHsKKyAgICAgICAgLyogZmluZCBvciBjcmVhdGUgYW4gZW50cnkgZm9yIG1lIGluIG15IGNhbGxlcidzIGVudHJ5ICovCisgICAgICAgIFByb2ZpbGVyRW50cnkgKmNhbGxlciA9IHNlbGYtPnByZXZpb3VzLT5jdHhFbnRyeTsKKyAgICAgICAgUHJvZmlsZXJTdWJFbnRyeSAqc3ViZW50cnkgPSBnZXRTdWJFbnRyeShwT2JqLCBjYWxsZXIsIGVudHJ5KTsKKyAgICAgICAgaWYgKHN1YmVudHJ5KSB7CisgICAgICAgICAgICBpZiAoLS1zdWJlbnRyeS0+cmVjdXJzaW9uTGV2ZWwgPT0gMCkKKyAgICAgICAgICAgICAgICBzdWJlbnRyeS0+dHQgKz0gdHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKytzdWJlbnRyeS0+cmVjdXJzaXZlY2FsbGNvdW50OworICAgICAgICAgICAgc3ViZW50cnktPml0ICs9IGl0OworICAgICAgICAgICAgKytzdWJlbnRyeS0+Y2FsbGNvdW50OworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogcHRyYWNlX2VudGVyX2NhbGwoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmtleSwgUHlPYmplY3QgKnVzZXJPYmopCiB7Ci0JLyogZW50ZXJpbmcgYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiBpZGVudGlmaWVkIGJ5ICdrZXknCi0JICAgKHdoaWNoIGNhbiBiZSBhIFB5Q29kZU9iamVjdCBvciBhIFB5TWV0aG9kRGVmIHBvaW50ZXIpICovCi0JUHJvZmlsZXJPYmplY3QgKnBPYmogPSAoUHJvZmlsZXJPYmplY3QqKXNlbGY7Ci0JUHJvZmlsZXJFbnRyeSAqcHJvZkVudHJ5OwotCVByb2ZpbGVyQ29udGV4dCAqcENvbnRleHQ7CisgICAgLyogZW50ZXJpbmcgYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiBpZGVudGlmaWVkIGJ5ICdrZXknCisgICAgICAgKHdoaWNoIGNhbiBiZSBhIFB5Q29kZU9iamVjdCBvciBhIFB5TWV0aG9kRGVmIHBvaW50ZXIpICovCisgICAgUHJvZmlsZXJPYmplY3QgKnBPYmogPSAoUHJvZmlsZXJPYmplY3QqKXNlbGY7CisgICAgUHJvZmlsZXJFbnRyeSAqcHJvZkVudHJ5OworICAgIFByb2ZpbGVyQ29udGV4dCAqcENvbnRleHQ7CiAKLQkvKiBJbiB0aGUgY2FzZSBvZiBlbnRlcmluZyBhIGdlbmVyYXRvciBleHByZXNzaW9uIGZyYW1lIHZpYSBhCi0JICogdGhyb3cgKGdlbl9zZW5kX2V4KC4uLCAxKSksIHdlIG1heSBhbHJlYWR5IGhhdmUgYW4KLQkgKiBFeGNlcHRpb24gc2V0IGhlcmUuIFdlIG11c3Qgbm90IG1lc3MgYXJvdW5kIHdpdGggdGhpcwotCSAqIGV4Y2VwdGlvbiwgYW5kIHNvbWUgb2YgdGhlIGNvZGUgdW5kZXIgaGVyZSBhc3N1bWVzIHRoYXQKLQkgKiBQeUVycl8qIGlzIGl0cyBvd24gdG8gbWVzcyBhcm91bmQgd2l0aCwgc28gd2UgaGF2ZSB0bwotCSAqIHNhdmUgYW5kIHJlc3RvcmUgYW55IGN1cnJlbnQgZXhjZXB0aW9uLiAqLwotCVB5T2JqZWN0ICpsYXN0X3R5cGUsICpsYXN0X3ZhbHVlLCAqbGFzdF90YjsKLQlQeUVycl9GZXRjaCgmbGFzdF90eXBlLCAmbGFzdF92YWx1ZSwgJmxhc3RfdGIpOworICAgIC8qIEluIHRoZSBjYXNlIG9mIGVudGVyaW5nIGEgZ2VuZXJhdG9yIGV4cHJlc3Npb24gZnJhbWUgdmlhIGEKKyAgICAgKiB0aHJvdyAoZ2VuX3NlbmRfZXgoLi4sIDEpKSwgd2UgbWF5IGFscmVhZHkgaGF2ZSBhbgorICAgICAqIEV4Y2VwdGlvbiBzZXQgaGVyZS4gV2UgbXVzdCBub3QgbWVzcyBhcm91bmQgd2l0aCB0aGlzCisgICAgICogZXhjZXB0aW9uLCBhbmQgc29tZSBvZiB0aGUgY29kZSB1bmRlciBoZXJlIGFzc3VtZXMgdGhhdAorICAgICAqIFB5RXJyXyogaXMgaXRzIG93biB0byBtZXNzIGFyb3VuZCB3aXRoLCBzbyB3ZSBoYXZlIHRvCisgICAgICogc2F2ZSBhbmQgcmVzdG9yZSBhbnkgY3VycmVudCBleGNlcHRpb24uICovCisgICAgUHlPYmplY3QgKmxhc3RfdHlwZSwgKmxhc3RfdmFsdWUsICpsYXN0X3RiOworICAgIFB5RXJyX0ZldGNoKCZsYXN0X3R5cGUsICZsYXN0X3ZhbHVlLCAmbGFzdF90Yik7CiAKLQlwcm9mRW50cnkgPSBnZXRFbnRyeShwT2JqLCBrZXkpOwotCWlmIChwcm9mRW50cnkgPT0gTlVMTCkgewotCQlwcm9mRW50cnkgPSBuZXdQcm9maWxlckVudHJ5KHBPYmosIGtleSwgdXNlck9iaik7Ci0JCWlmIChwcm9mRW50cnkgPT0gTlVMTCkKLQkJCWdvdG8gcmVzdG9yZVB5ZXJyOwotCX0KLQkvKiBncmFiIGEgUHJvZmlsZXJDb250ZXh0IG91dCBvZiB0aGUgZnJlZSBsaXN0ICovCi0JcENvbnRleHQgPSBwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKLQlpZiAocENvbnRleHQpIHsKLQkJcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQgPSBwQ29udGV4dC0+cHJldmlvdXM7Ci0JfQotCWVsc2UgewotCQkvKiBmcmVlIGxpc3QgZXhoYXVzdGVkLCBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KLQkJcENvbnRleHQgPSAoUHJvZmlsZXJDb250ZXh0KikKLQkJCW1hbGxvYyhzaXplb2YoUHJvZmlsZXJDb250ZXh0KSk7Ci0JCWlmIChwQ29udGV4dCA9PSBOVUxMKSB7Ci0JCQlwT2JqLT5mbGFncyB8PSBQT0ZfTk9NRU1PUlk7Ci0JCQlnb3RvIHJlc3RvcmVQeWVycjsKLQkJfQotCX0KLQlpbml0Q29udGV4dChwT2JqLCBwQ29udGV4dCwgcHJvZkVudHJ5KTsKKyAgICBwcm9mRW50cnkgPSBnZXRFbnRyeShwT2JqLCBrZXkpOworICAgIGlmIChwcm9mRW50cnkgPT0gTlVMTCkgeworICAgICAgICBwcm9mRW50cnkgPSBuZXdQcm9maWxlckVudHJ5KHBPYmosIGtleSwgdXNlck9iaik7CisgICAgICAgIGlmIChwcm9mRW50cnkgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gcmVzdG9yZVB5ZXJyOworICAgIH0KKyAgICAvKiBncmFiIGEgUHJvZmlsZXJDb250ZXh0IG91dCBvZiB0aGUgZnJlZSBsaXN0ICovCisgICAgcENvbnRleHQgPSBwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKKyAgICBpZiAocENvbnRleHQpIHsKKyAgICAgICAgcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQgPSBwQ29udGV4dC0+cHJldmlvdXM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBmcmVlIGxpc3QgZXhoYXVzdGVkLCBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KKyAgICAgICAgcENvbnRleHQgPSAoUHJvZmlsZXJDb250ZXh0KikKKyAgICAgICAgICAgIG1hbGxvYyhzaXplb2YoUHJvZmlsZXJDb250ZXh0KSk7CisgICAgICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgICAgICBwT2JqLT5mbGFncyB8PSBQT0ZfTk9NRU1PUlk7CisgICAgICAgICAgICBnb3RvIHJlc3RvcmVQeWVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbml0Q29udGV4dChwT2JqLCBwQ29udGV4dCwgcHJvZkVudHJ5KTsKIAogcmVzdG9yZVB5ZXJyOgotCVB5RXJyX1Jlc3RvcmUobGFzdF90eXBlLCBsYXN0X3ZhbHVlLCBsYXN0X3RiKTsKKyAgICBQeUVycl9SZXN0b3JlKGxhc3RfdHlwZSwgbGFzdF92YWx1ZSwgbGFzdF90Yik7CiB9CiAKIHN0YXRpYyB2b2lkCiBwdHJhY2VfbGVhdmVfY2FsbChQeU9iamVjdCAqc2VsZiwgdm9pZCAqa2V5KQogewotCS8qIGxlYXZpbmcgYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiBpZGVudGlmaWVkIGJ5ICdrZXknICovCi0JUHJvZmlsZXJPYmplY3QgKnBPYmogPSAoUHJvZmlsZXJPYmplY3QqKXNlbGY7Ci0JUHJvZmlsZXJFbnRyeSAqcHJvZkVudHJ5OwotCVByb2ZpbGVyQ29udGV4dCAqcENvbnRleHQ7CisgICAgLyogbGVhdmluZyBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIGlkZW50aWZpZWQgYnkgJ2tleScgKi8KKyAgICBQcm9maWxlck9iamVjdCAqcE9iaiA9IChQcm9maWxlck9iamVjdCopc2VsZjsKKyAgICBQcm9maWxlckVudHJ5ICpwcm9mRW50cnk7CisgICAgUHJvZmlsZXJDb250ZXh0ICpwQ29udGV4dDsKIAotCXBDb250ZXh0ID0gcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dDsKLQlpZiAocENvbnRleHQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCXByb2ZFbnRyeSA9IGdldEVudHJ5KHBPYmosIGtleSk7Ci0JaWYgKHByb2ZFbnRyeSkgewotCQlTdG9wKHBPYmosIHBDb250ZXh0LCBwcm9mRW50cnkpOwotCX0KLQllbHNlIHsKLQkJcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IHBDb250ZXh0LT5wcmV2aW91czsKLQl9Ci0JLyogcHV0IHBDb250ZXh0IGludG8gdGhlIGZyZWUgbGlzdCAqLwotCXBDb250ZXh0LT5wcmV2aW91cyA9IHBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0OwotCXBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0ID0gcENvbnRleHQ7CisgICAgcENvbnRleHQgPSBwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0OworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgcHJvZkVudHJ5ID0gZ2V0RW50cnkocE9iaiwga2V5KTsKKyAgICBpZiAocHJvZkVudHJ5KSB7CisgICAgICAgIFN0b3AocE9iaiwgcENvbnRleHQsIHByb2ZFbnRyeSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0ID0gcENvbnRleHQtPnByZXZpb3VzOworICAgIH0KKyAgICAvKiBwdXQgcENvbnRleHQgaW50byB0aGUgZnJlZSBsaXN0ICovCisgICAgcENvbnRleHQtPnByZXZpb3VzID0gcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQ7CisgICAgcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQgPSBwQ29udGV4dDsKIH0KIAogc3RhdGljIGludAogcHJvZmlsZXJfY2FsbGJhY2soUHlPYmplY3QgKnNlbGYsIFB5RnJhbWVPYmplY3QgKmZyYW1lLCBpbnQgd2hhdCwKLQkJICBQeU9iamVjdCAqYXJnKQorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZykKIHsKLQlzd2l0Y2ggKHdoYXQpIHsKKyAgICBzd2l0Y2ggKHdoYXQpIHsKIAotCS8qIHRoZSAnZnJhbWUnIG9mIGEgY2FsbGVkIGZ1bmN0aW9uIGlzIGFib3V0IHRvIHN0YXJ0IGl0cyBleGVjdXRpb24gKi8KLQljYXNlIFB5VHJhY2VfQ0FMTDoKLQkJcHRyYWNlX2VudGVyX2NhbGwoc2VsZiwgKHZvaWQgKilmcmFtZS0+Zl9jb2RlLAotCQkJCSAgICAgICAgKFB5T2JqZWN0ICopZnJhbWUtPmZfY29kZSk7Ci0JCWJyZWFrOworICAgIC8qIHRoZSAnZnJhbWUnIG9mIGEgY2FsbGVkIGZ1bmN0aW9uIGlzIGFib3V0IHRvIHN0YXJ0IGl0cyBleGVjdXRpb24gKi8KKyAgICBjYXNlIFB5VHJhY2VfQ0FMTDoKKyAgICAgICAgcHRyYWNlX2VudGVyX2NhbGwoc2VsZiwgKHZvaWQgKilmcmFtZS0+Zl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilmcmFtZS0+Zl9jb2RlKTsKKyAgICAgICAgYnJlYWs7CiAKLQkvKiB0aGUgJ2ZyYW1lJyBvZiBhIGNhbGxlZCBmdW5jdGlvbiBpcyBhYm91dCB0byBmaW5pc2gKLQkgICAoZWl0aGVyIG5vcm1hbGx5IG9yIHdpdGggYW4gZXhjZXB0aW9uKSAqLwotCWNhc2UgUHlUcmFjZV9SRVRVUk46Ci0JCXB0cmFjZV9sZWF2ZV9jYWxsKHNlbGYsICh2b2lkICopZnJhbWUtPmZfY29kZSk7Ci0JCWJyZWFrOworICAgIC8qIHRoZSAnZnJhbWUnIG9mIGEgY2FsbGVkIGZ1bmN0aW9uIGlzIGFib3V0IHRvIGZpbmlzaAorICAgICAgIChlaXRoZXIgbm9ybWFsbHkgb3Igd2l0aCBhbiBleGNlcHRpb24pICovCisgICAgY2FzZSBQeVRyYWNlX1JFVFVSTjoKKyAgICAgICAgcHRyYWNlX2xlYXZlX2NhbGwoc2VsZiwgKHZvaWQgKilmcmFtZS0+Zl9jb2RlKTsKKyAgICAgICAgYnJlYWs7CiAKLQkvKiBjYXNlIFB5VHJhY2VfRVhDRVBUSU9OOgotCQlJZiB0aGUgZXhjZXB0aW9uIHJlc3VsdHMgaW4gdGhlIGZ1bmN0aW9uIGV4aXRpbmcsIGEKLQkJUHlUcmFjZV9SRVRVUk4gZXZlbnQgd2lsbCBiZSBnZW5lcmF0ZWQsIHNvIHdlIGRvbid0IG5lZWQgdG8KLQkJaGFuZGxlIGl0LiAqLworICAgIC8qIGNhc2UgUHlUcmFjZV9FWENFUFRJT046CisgICAgICAgIElmIHRoZSBleGNlcHRpb24gcmVzdWx0cyBpbiB0aGUgZnVuY3Rpb24gZXhpdGluZywgYQorICAgICAgICBQeVRyYWNlX1JFVFVSTiBldmVudCB3aWxsIGJlIGdlbmVyYXRlZCwgc28gd2UgZG9uJ3QgbmVlZCB0bworICAgICAgICBoYW5kbGUgaXQuICovCiAKLSNpZmRlZiBQeVRyYWNlX0NfQ0FMTAkvKiBub3QgZGVmaW5lZCBpbiBQeXRob24gPD0gMi4zICovCi0JLyogdGhlIFB5dGhvbiBmdW5jdGlvbiAnZnJhbWUnIGlzIGlzc3VpbmcgYSBjYWxsIHRvIHRoZSBidWlsdC1pbgotCSAgIGZ1bmN0aW9uICdhcmcnICovCi0JY2FzZSBQeVRyYWNlX0NfQ0FMTDoKLQkJaWYgKCgoKFByb2ZpbGVyT2JqZWN0ICopc2VsZiktPmZsYWdzICYgUE9GX0JVSUxUSU5TKQotCQkgICAgJiYgUHlDRnVuY3Rpb25fQ2hlY2soYXJnKSkgewotCQkJcHRyYWNlX2VudGVyX2NhbGwoc2VsZiwKLQkJCQkJICAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopYXJnKS0+bV9tbCwKLQkJCQkJICBhcmcpOwotCQl9Ci0JCWJyZWFrOworI2lmZGVmIFB5VHJhY2VfQ19DQUxMICAgLyogbm90IGRlZmluZWQgaW4gUHl0aG9uIDw9IDIuMyAqLworICAgIC8qIHRoZSBQeXRob24gZnVuY3Rpb24gJ2ZyYW1lJyBpcyBpc3N1aW5nIGEgY2FsbCB0byB0aGUgYnVpbHQtaW4KKyAgICAgICBmdW5jdGlvbiAnYXJnJyAqLworICAgIGNhc2UgUHlUcmFjZV9DX0NBTEw6CisgICAgICAgIGlmICgoKChQcm9maWxlck9iamVjdCAqKXNlbGYpLT5mbGFncyAmIFBPRl9CVUlMVElOUykKKyAgICAgICAgICAgICYmIFB5Q0Z1bmN0aW9uX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgIHB0cmFjZV9lbnRlcl9jYWxsKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopYXJnKS0+bV9tbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLQkvKiB0aGUgY2FsbCB0byB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gJ2FyZycgaXMgcmV0dXJuaW5nIGludG8gaXRzCi0JICAgY2FsbGVyICdmcmFtZScgKi8KLQljYXNlIFB5VHJhY2VfQ19SRVRVUk46CQkvKiAuLi5ub3JtYWxseSAqLwotCWNhc2UgUHlUcmFjZV9DX0VYQ0VQVElPTjoJLyogLi4ud2l0aCBhbiBleGNlcHRpb24gc2V0ICovCi0JCWlmICgoKChQcm9maWxlck9iamVjdCAqKXNlbGYpLT5mbGFncyAmIFBPRl9CVUlMVElOUykKLQkJICAgICYmIFB5Q0Z1bmN0aW9uX0NoZWNrKGFyZykpIHsKLQkJCXB0cmFjZV9sZWF2ZV9jYWxsKHNlbGYsCi0JCQkJCSAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWFyZyktPm1fbWwpOwotCQl9Ci0JCWJyZWFrOworICAgIC8qIHRoZSBjYWxsIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAnYXJnJyBpcyByZXR1cm5pbmcgaW50byBpdHMKKyAgICAgICBjYWxsZXIgJ2ZyYW1lJyAqLworICAgIGNhc2UgUHlUcmFjZV9DX1JFVFVSTjogICAgICAgICAgICAgIC8qIC4uLm5vcm1hbGx5ICovCisgICAgY2FzZSBQeVRyYWNlX0NfRVhDRVBUSU9OOiAgICAgICAgICAgLyogLi4ud2l0aCBhbiBleGNlcHRpb24gc2V0ICovCisgICAgICAgIGlmICgoKChQcm9maWxlck9iamVjdCAqKXNlbGYpLT5mbGFncyAmIFBPRl9CVUlMVElOUykKKyAgICAgICAgICAgICYmIFB5Q0Z1bmN0aW9uX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgIHB0cmFjZV9sZWF2ZV9jYWxsKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopYXJnKS0+bV9tbCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAjZW5kaWYKIAotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHBlbmRpbmdfZXhjZXB0aW9uKFByb2ZpbGVyT2JqZWN0ICpwT2JqKQogewotCWlmIChwT2JqLT5mbGFncyAmIFBPRl9OT01FTU9SWSkgewotCQlwT2JqLT5mbGFncyAtPSBQT0ZfTk9NRU1PUlk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLQkJCQkibWVtb3J5IHdhcyBleGhhdXN0ZWQgd2hpbGUgcHJvZmlsaW5nIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKHBPYmotPmZsYWdzICYgUE9GX05PTUVNT1JZKSB7CisgICAgICAgIHBPYmotPmZsYWdzIC09IFBPRl9OT01FTU9SWTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSB3YXMgZXhoYXVzdGVkIHdoaWxlIHByb2ZpbGluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCBwcm9maWxlcl9lbnRyeV9maWVsZHNbXSA9IHsKLQl7ImNvZGUiLCAgICAgICAgICJjb2RlIG9iamVjdCBvciBidWlsdC1pbiBmdW5jdGlvbiBuYW1lIn0sCi0JeyJjYWxsY291bnQiLCAgICAiaG93IG1hbnkgdGltZXMgdGhpcyB3YXMgY2FsbGVkIn0sCi0JeyJyZWNjYWxsY291bnQiLCAiaG93IG1hbnkgdGltZXMgY2FsbGVkIHJlY3Vyc2l2ZWx5In0sCi0JeyJ0b3RhbHRpbWUiLCAgICAidG90YWwgdGltZSBpbiB0aGlzIGVudHJ5In0sCi0JeyJpbmxpbmV0aW1lIiwgICAiaW5saW5lIHRpbWUgaW4gdGhpcyBlbnRyeSAobm90IGluIHN1YmNhbGxzKSJ9LAotCXsiY2FsbHMiLCAgICAgICAgImRldGFpbHMgb2YgdGhlIGNhbGxzIn0sCi0JezB9CisgICAgeyJjb2RlIiwgICAgICAgICAiY29kZSBvYmplY3Qgb3IgYnVpbHQtaW4gZnVuY3Rpb24gbmFtZSJ9LAorICAgIHsiY2FsbGNvdW50IiwgICAgImhvdyBtYW55IHRpbWVzIHRoaXMgd2FzIGNhbGxlZCJ9LAorICAgIHsicmVjY2FsbGNvdW50IiwgImhvdyBtYW55IHRpbWVzIGNhbGxlZCByZWN1cnNpdmVseSJ9LAorICAgIHsidG90YWx0aW1lIiwgICAgInRvdGFsIHRpbWUgaW4gdGhpcyBlbnRyeSJ9LAorICAgIHsiaW5saW5ldGltZSIsICAgImlubGluZSB0aW1lIGluIHRoaXMgZW50cnkgKG5vdCBpbiBzdWJjYWxscykifSwKKyAgICB7ImNhbGxzIiwgICAgICAgICJkZXRhaWxzIG9mIHRoZSBjYWxscyJ9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgcHJvZmlsZXJfc3ViZW50cnlfZmllbGRzW10gPSB7Ci0JeyJjb2RlIiwgICAgICAgICAiY2FsbGVkIGNvZGUgb2JqZWN0IG9yIGJ1aWx0LWluIGZ1bmN0aW9uIG5hbWUifSwKLQl7ImNhbGxjb3VudCIsICAgICJob3cgbWFueSB0aW1lcyB0aGlzIGlzIGNhbGxlZCJ9LAotCXsicmVjY2FsbGNvdW50IiwgImhvdyBtYW55IHRpbWVzIHRoaXMgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5In0sCi0JeyJ0b3RhbHRpbWUiLCAgICAidG90YWwgdGltZSBzcGVudCBpbiB0aGlzIGNhbGwifSwKLQl7ImlubGluZXRpbWUiLCAgICJpbmxpbmUgdGltZSAobm90IGluIGZ1cnRoZXIgc3ViY2FsbHMpIn0sCi0JezB9CisgICAgeyJjb2RlIiwgICAgICAgICAiY2FsbGVkIGNvZGUgb2JqZWN0IG9yIGJ1aWx0LWluIGZ1bmN0aW9uIG5hbWUifSwKKyAgICB7ImNhbGxjb3VudCIsICAgICJob3cgbWFueSB0aW1lcyB0aGlzIGlzIGNhbGxlZCJ9LAorICAgIHsicmVjY2FsbGNvdW50IiwgImhvdyBtYW55IHRpbWVzIHRoaXMgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5In0sCisgICAgeyJ0b3RhbHRpbWUiLCAgICAidG90YWwgdGltZSBzcGVudCBpbiB0aGlzIGNhbGwifSwKKyAgICB7ImlubGluZXRpbWUiLCAgICJpbmxpbmUgdGltZSAobm90IGluIGZ1cnRoZXIgc3ViY2FsbHMpIn0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9EZXNjIHByb2ZpbGVyX2VudHJ5X2Rlc2MgPSB7Ci0JIl9sc3Byb2YucHJvZmlsZXJfZW50cnkiLCAvKiBuYW1lICovCi0JTlVMTCwgLyogZG9jICovCi0JcHJvZmlsZXJfZW50cnlfZmllbGRzLAotCTYKKyAgICAiX2xzcHJvZi5wcm9maWxlcl9lbnRyeSIsIC8qIG5hbWUgKi8KKyAgICBOVUxMLCAvKiBkb2MgKi8KKyAgICBwcm9maWxlcl9lbnRyeV9maWVsZHMsCisgICAgNgogfTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyBwcm9maWxlcl9zdWJlbnRyeV9kZXNjID0gewotCSJfbHNwcm9mLnByb2ZpbGVyX3N1YmVudHJ5IiwgLyogbmFtZSAqLwotCU5VTEwsIC8qIGRvYyAqLwotCXByb2ZpbGVyX3N1YmVudHJ5X2ZpZWxkcywKLQk1CisgICAgIl9sc3Byb2YucHJvZmlsZXJfc3ViZW50cnkiLCAvKiBuYW1lICovCisgICAgTlVMTCwgLyogZG9jICovCisgICAgcHJvZmlsZXJfc3ViZW50cnlfZmllbGRzLAorICAgIDUKIH07CiAKIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CkBAIC01MzgsNzAgKzUzOCw3MCBAQAogCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdCAqbGlzdDsKLQlQeU9iamVjdCAqc3VibGlzdDsKLQlkb3VibGUgZmFjdG9yOworICAgIFB5T2JqZWN0ICpsaXN0OworICAgIFB5T2JqZWN0ICpzdWJsaXN0OworICAgIGRvdWJsZSBmYWN0b3I7CiB9IHN0YXRzY29sbGVjdG9yX3Q7CiAKIHN0YXRpYyBpbnQgc3RhdHNGb3JTdWJFbnRyeShyb3RhdGluZ19ub2RlX3QgKm5vZGUsIHZvaWQgKmFyZykKIHsKLQlQcm9maWxlclN1YkVudHJ5ICpzZW50cnkgPSAoUHJvZmlsZXJTdWJFbnRyeSopIG5vZGU7Ci0Jc3RhdHNjb2xsZWN0b3JfdCAqY29sbGVjdCA9IChzdGF0c2NvbGxlY3Rvcl90KikgYXJnOwotCVByb2ZpbGVyRW50cnkgKmVudHJ5ID0gKFByb2ZpbGVyRW50cnkqKSBzZW50cnktPmhlYWRlci5rZXk7Ci0JaW50IGVycjsKLQlQeU9iamVjdCAqc2luZm87Ci0Jc2luZm8gPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikgJlN0YXRzU3ViRW50cnlUeXBlLAotCQkJCSAgICAgICIoKE9sbGRkKSkiLAotCQkJCSAgICAgIGVudHJ5LT51c2VyT2JqLAotCQkJCSAgICAgIHNlbnRyeS0+Y2FsbGNvdW50LAotCQkJCSAgICAgIHNlbnRyeS0+cmVjdXJzaXZlY2FsbGNvdW50LAotCQkJCSAgICAgIGNvbGxlY3QtPmZhY3RvciAqIHNlbnRyeS0+dHQsCi0JCQkJICAgICAgY29sbGVjdC0+ZmFjdG9yICogc2VudHJ5LT5pdCk7Ci0JaWYgKHNpbmZvID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQllcnIgPSBQeUxpc3RfQXBwZW5kKGNvbGxlY3QtPnN1Ymxpc3QsIHNpbmZvKTsKLQlQeV9ERUNSRUYoc2luZm8pOwotCXJldHVybiBlcnI7CisgICAgUHJvZmlsZXJTdWJFbnRyeSAqc2VudHJ5ID0gKFByb2ZpbGVyU3ViRW50cnkqKSBub2RlOworICAgIHN0YXRzY29sbGVjdG9yX3QgKmNvbGxlY3QgPSAoc3RhdHNjb2xsZWN0b3JfdCopIGFyZzsKKyAgICBQcm9maWxlckVudHJ5ICplbnRyeSA9IChQcm9maWxlckVudHJ5Kikgc2VudHJ5LT5oZWFkZXIua2V5OworICAgIGludCBlcnI7CisgICAgUHlPYmplY3QgKnNpbmZvOworICAgIHNpbmZvID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopICZTdGF0c1N1YkVudHJ5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKChPbGxkZCkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+dXNlck9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50cnktPmNhbGxjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50cnktPnJlY3Vyc2l2ZWNhbGxjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0LT5mYWN0b3IgKiBzZW50cnktPnR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QtPmZhY3RvciAqIHNlbnRyeS0+aXQpOworICAgIGlmIChzaW5mbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZXJyID0gUHlMaXN0X0FwcGVuZChjb2xsZWN0LT5zdWJsaXN0LCBzaW5mbyk7CisgICAgUHlfREVDUkVGKHNpbmZvKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHN0YXRzRm9yRW50cnkocm90YXRpbmdfbm9kZV90ICpub2RlLCB2b2lkICphcmcpCiB7Ci0JUHJvZmlsZXJFbnRyeSAqZW50cnkgPSAoUHJvZmlsZXJFbnRyeSopIG5vZGU7Ci0Jc3RhdHNjb2xsZWN0b3JfdCAqY29sbGVjdCA9IChzdGF0c2NvbGxlY3Rvcl90KikgYXJnOwotCVB5T2JqZWN0ICppbmZvOwotCWludCBlcnI7Ci0JaWYgKGVudHJ5LT5jYWxsY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7ICAgLyogc2tpcCAqLworICAgIFByb2ZpbGVyRW50cnkgKmVudHJ5ID0gKFByb2ZpbGVyRW50cnkqKSBub2RlOworICAgIHN0YXRzY29sbGVjdG9yX3QgKmNvbGxlY3QgPSAoc3RhdHNjb2xsZWN0b3JfdCopIGFyZzsKKyAgICBQeU9iamVjdCAqaW5mbzsKKyAgICBpbnQgZXJyOworICAgIGlmIChlbnRyeS0+Y2FsbGNvdW50ID09IDApCisgICAgICAgIHJldHVybiAwOyAgIC8qIHNraXAgKi8KIAotCWlmIChlbnRyeS0+Y2FsbHMgIT0gRU1QVFlfUk9UQVRJTkdfVFJFRSkgewotCQljb2xsZWN0LT5zdWJsaXN0ID0gUHlMaXN0X05ldygwKTsKLQkJaWYgKGNvbGxlY3QtPnN1Ymxpc3QgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFJvdGF0aW5nVHJlZV9FbnVtKGVudHJ5LT5jYWxscywKLQkJCQkgICAgICBzdGF0c0ZvclN1YkVudHJ5LCBjb2xsZWN0KSAhPSAwKSB7Ci0JCQlQeV9ERUNSRUYoY29sbGVjdC0+c3VibGlzdCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJY29sbGVjdC0+c3VibGlzdCA9IFB5X05vbmU7Ci0JfQorICAgIGlmIChlbnRyeS0+Y2FsbHMgIT0gRU1QVFlfUk9UQVRJTkdfVFJFRSkgeworICAgICAgICBjb2xsZWN0LT5zdWJsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgaWYgKGNvbGxlY3QtPnN1Ymxpc3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFJvdGF0aW5nVHJlZV9FbnVtKGVudHJ5LT5jYWxscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzRm9yU3ViRW50cnksIGNvbGxlY3QpICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjb2xsZWN0LT5zdWJsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBjb2xsZWN0LT5zdWJsaXN0ID0gUHlfTm9uZTsKKyAgICB9CiAKLQlpbmZvID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopICZTdGF0c0VudHJ5VHlwZSwKLQkJCQkgICAgICIoKE9sbGRkTykpIiwKLQkJCQkgICAgIGVudHJ5LT51c2VyT2JqLAotCQkJCSAgICAgZW50cnktPmNhbGxjb3VudCwKLQkJCQkgICAgIGVudHJ5LT5yZWN1cnNpdmVjYWxsY291bnQsCi0JCQkJICAgICBjb2xsZWN0LT5mYWN0b3IgKiBlbnRyeS0+dHQsCi0JCQkJICAgICBjb2xsZWN0LT5mYWN0b3IgKiBlbnRyeS0+aXQsCi0JCQkJICAgICBjb2xsZWN0LT5zdWJsaXN0KTsKLQlQeV9ERUNSRUYoY29sbGVjdC0+c3VibGlzdCk7Ci0JaWYgKGluZm8gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWVyciA9IFB5TGlzdF9BcHBlbmQoY29sbGVjdC0+bGlzdCwgaW5mbyk7Ci0JUHlfREVDUkVGKGluZm8pOwotCXJldHVybiBlcnI7CisgICAgaW5mbyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSAmU3RhdHNFbnRyeVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKChPbGxkZE8pKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+dXNlck9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5jYWxsY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+cmVjdXJzaXZlY2FsbGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdC0+ZmFjdG9yICogZW50cnktPnR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdC0+ZmFjdG9yICogZW50cnktPml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdC0+c3VibGlzdCk7CisgICAgUHlfREVDUkVGKGNvbGxlY3QtPnN1Ymxpc3QpOworICAgIGlmIChpbmZvID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKGNvbGxlY3QtPmxpc3QsIGluZm8pOworICAgIFB5X0RFQ1JFRihpbmZvKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiBQeURvY19TVFJWQVIoZ2V0c3RhdHNfZG9jLCAiXApAQCAtNjMxLDUxICs2MzEsNTEgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHByb2ZpbGVyX2dldHN0YXRzKFByb2ZpbGVyT2JqZWN0ICpwT2JqLCBQeU9iamVjdCogbm9hcmcpCiB7Ci0Jc3RhdHNjb2xsZWN0b3JfdCBjb2xsZWN0OwotCWlmIChwZW5kaW5nX2V4Y2VwdGlvbihwT2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFwT2JqLT5leHRlcm5hbFRpbWVyKQotCQljb2xsZWN0LmZhY3RvciA9IGhwVGltZXJVbml0KCk7Ci0JZWxzZSBpZiAocE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQgPiAwLjApCi0JCWNvbGxlY3QuZmFjdG9yID0gcE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQ7Ci0JZWxzZQotCQljb2xsZWN0LmZhY3RvciA9IDEuMCAvIERPVUJMRV9USU1FUl9QUkVDSVNJT047Ci0JY29sbGVjdC5saXN0ID0gUHlMaXN0X05ldygwKTsKLQlpZiAoY29sbGVjdC5saXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChSb3RhdGluZ1RyZWVfRW51bShwT2JqLT5wcm9maWxlckVudHJpZXMsIHN0YXRzRm9yRW50cnksICZjb2xsZWN0KQotCSAgICAhPSAwKSB7Ci0JCVB5X0RFQ1JFRihjb2xsZWN0Lmxpc3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGNvbGxlY3QubGlzdDsKKyAgICBzdGF0c2NvbGxlY3Rvcl90IGNvbGxlY3Q7CisgICAgaWYgKHBlbmRpbmdfZXhjZXB0aW9uKHBPYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXBPYmotPmV4dGVybmFsVGltZXIpCisgICAgICAgIGNvbGxlY3QuZmFjdG9yID0gaHBUaW1lclVuaXQoKTsKKyAgICBlbHNlIGlmIChwT2JqLT5leHRlcm5hbFRpbWVyVW5pdCA+IDAuMCkKKyAgICAgICAgY29sbGVjdC5mYWN0b3IgPSBwT2JqLT5leHRlcm5hbFRpbWVyVW5pdDsKKyAgICBlbHNlCisgICAgICAgIGNvbGxlY3QuZmFjdG9yID0gMS4wIC8gRE9VQkxFX1RJTUVSX1BSRUNJU0lPTjsKKyAgICBjb2xsZWN0Lmxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChjb2xsZWN0Lmxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFJvdGF0aW5nVHJlZV9FbnVtKHBPYmotPnByb2ZpbGVyRW50cmllcywgc3RhdHNGb3JFbnRyeSwgJmNvbGxlY3QpCisgICAgICAgICE9IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGNvbGxlY3QubGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gY29sbGVjdC5saXN0OwogfQogCiBzdGF0aWMgaW50CiBzZXRTdWJjYWxscyhQcm9maWxlck9iamVjdCAqcE9iaiwgaW50IG52YWx1ZSkKIHsKLQlpZiAobnZhbHVlID09IDApCi0JCXBPYmotPmZsYWdzICY9IH5QT0ZfU1VCQ0FMTFM7Ci0JZWxzZSBpZiAobnZhbHVlID4gMCkKLQkJcE9iai0+ZmxhZ3MgfD0gIFBPRl9TVUJDQUxMUzsKLQlyZXR1cm4gMDsKKyAgICBpZiAobnZhbHVlID09IDApCisgICAgICAgIHBPYmotPmZsYWdzICY9IH5QT0ZfU1VCQ0FMTFM7CisgICAgZWxzZSBpZiAobnZhbHVlID4gMCkKKyAgICAgICAgcE9iai0+ZmxhZ3MgfD0gIFBPRl9TVUJDQUxMUzsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogc2V0QnVpbHRpbnMoUHJvZmlsZXJPYmplY3QgKnBPYmosIGludCBudmFsdWUpCiB7Ci0JaWYgKG52YWx1ZSA9PSAwKQotCQlwT2JqLT5mbGFncyAmPSB+UE9GX0JVSUxUSU5TOwotCWVsc2UgaWYgKG52YWx1ZSA+IDApIHsKKyAgICBpZiAobnZhbHVlID09IDApCisgICAgICAgIHBPYmotPmZsYWdzICY9IH5QT0ZfQlVJTFRJTlM7CisgICAgZWxzZSBpZiAobnZhbHVlID4gMCkgewogI2lmbmRlZiBQeVRyYWNlX0NfQ0FMTAotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiYnVpbHRpbnM9VHJ1ZSByZXF1aXJlcyBQeXRob24gPj0gMi40Iik7Ci0JCXJldHVybiAtMTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVpbHRpbnM9VHJ1ZSByZXF1aXJlcyBQeXRob24gPj0gMi40Iik7CisgICAgICAgIHJldHVybiAtMTsKICNlbHNlCi0JCXBPYmotPmZsYWdzIHw9ICBQT0ZfQlVJTFRJTlM7CisgICAgICAgIHBPYmotPmZsYWdzIHw9ICBQT0ZfQlVJTFRJTlM7CiAjZW5kaWYKLQl9Ci0JcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBQeURvY19TVFJWQVIoZW5hYmxlX2RvYywgIlwKQEAgLTY5MSwzMyArNjkxLDMzIEBACiBzdGF0aWMgUHlPYmplY3QqCiBwcm9maWxlcl9lbmFibGUoUHJvZmlsZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpbnQgc3ViY2FsbHMgPSAtMTsKLSAgICAgICAgaW50IGJ1aWx0aW5zID0gLTE7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzdWJjYWxscyIsICJidWlsdGlucyIsIDB9OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aWk6ZW5hYmxlIiwKLQkJCQkJIGt3bGlzdCwgJnN1YmNhbGxzLCAmYnVpbHRpbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc2V0U3ViY2FsbHMoc2VsZiwgc3ViY2FsbHMpIDwgMCB8fCBzZXRCdWlsdGlucyhzZWxmLCBidWlsdGlucykgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeUV2YWxfU2V0UHJvZmlsZShwcm9maWxlcl9jYWxsYmFjaywgKFB5T2JqZWN0KilzZWxmKTsKLQlzZWxmLT5mbGFncyB8PSBQT0ZfRU5BQkxFRDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IHN1YmNhbGxzID0gLTE7CisgICAgaW50IGJ1aWx0aW5zID0gLTE7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzdWJjYWxscyIsICJidWlsdGlucyIsIDB9OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aWk6ZW5hYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZzdWJjYWxscywgJmJ1aWx0aW5zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNldFN1YmNhbGxzKHNlbGYsIHN1YmNhbGxzKSA8IDAgfHwgc2V0QnVpbHRpbnMoc2VsZiwgYnVpbHRpbnMpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlFdmFsX1NldFByb2ZpbGUocHJvZmlsZXJfY2FsbGJhY2ssIChQeU9iamVjdCopc2VsZik7CisgICAgc2VsZi0+ZmxhZ3MgfD0gUE9GX0VOQUJMRUQ7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgdm9pZAogZmx1c2hfdW5tYXRjaGVkKFByb2ZpbGVyT2JqZWN0ICpwT2JqKQogewotCXdoaWxlIChwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0KSB7Ci0JCVByb2ZpbGVyQ29udGV4dCAqcENvbnRleHQgPSBwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0OwotCQlQcm9maWxlckVudHJ5ICpwcm9mRW50cnk9IHBDb250ZXh0LT5jdHhFbnRyeTsKLQkJaWYgKHByb2ZFbnRyeSkKLQkJCVN0b3AocE9iaiwgcENvbnRleHQsIHByb2ZFbnRyeSk7Ci0JCWVsc2UKLQkJCXBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQgPSBwQ29udGV4dC0+cHJldmlvdXM7Ci0JCWlmIChwQ29udGV4dCkKLQkJCWZyZWUocENvbnRleHQpOwotCX0KKyAgICB3aGlsZSAocE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCkgeworICAgICAgICBQcm9maWxlckNvbnRleHQgKnBDb250ZXh0ID0gcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dDsKKyAgICAgICAgUHJvZmlsZXJFbnRyeSAqcHJvZkVudHJ5PSBwQ29udGV4dC0+Y3R4RW50cnk7CisgICAgICAgIGlmIChwcm9mRW50cnkpCisgICAgICAgICAgICBTdG9wKHBPYmosIHBDb250ZXh0LCBwcm9mRW50cnkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0ID0gcENvbnRleHQtPnByZXZpb3VzOworICAgICAgICBpZiAocENvbnRleHQpCisgICAgICAgICAgICBmcmVlKHBDb250ZXh0KTsKKyAgICB9CiAKIH0KIApAQCAtNzMwLDEzICs3MzAsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHByb2ZpbGVyX2Rpc2FibGUoUHJvZmlsZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0KiBub2FyZykKIHsKLQlzZWxmLT5mbGFncyAmPSB+UE9GX0VOQUJMRUQ7Ci0JUHlFdmFsX1NldFByb2ZpbGUoTlVMTCwgTlVMTCk7Ci0JZmx1c2hfdW5tYXRjaGVkKHNlbGYpOwotCWlmIChwZW5kaW5nX2V4Y2VwdGlvbihzZWxmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNlbGYtPmZsYWdzICY9IH5QT0ZfRU5BQkxFRDsKKyAgICBQeUV2YWxfU2V0UHJvZmlsZShOVUxMLCBOVUxMKTsKKyAgICBmbHVzaF91bm1hdGNoZWQoc2VsZik7CisgICAgaWYgKHBlbmRpbmdfZXhjZXB0aW9uKHNlbGYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihjbGVhcl9kb2MsICJcCkBAIC03NDgsNjIgKzc0OCw2MiBAQAogc3RhdGljIFB5T2JqZWN0KgogcHJvZmlsZXJfY2xlYXIoUHJvZmlsZXJPYmplY3QgKnBPYmosIFB5T2JqZWN0KiBub2FyZykKIHsKLQljbGVhckVudHJpZXMocE9iaik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNsZWFyRW50cmllcyhwT2JqKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyB2b2lkCiBwcm9maWxlcl9kZWFsbG9jKFByb2ZpbGVyT2JqZWN0ICpvcCkKIHsKLQlpZiAob3AtPmZsYWdzICYgUE9GX0VOQUJMRUQpCi0JCVB5RXZhbF9TZXRQcm9maWxlKE5VTEwsIE5VTEwpOwotCWZsdXNoX3VubWF0Y2hlZChvcCk7Ci0JY2xlYXJFbnRyaWVzKG9wKTsKLQlQeV9YREVDUkVGKG9wLT5leHRlcm5hbFRpbWVyKTsKLQlQeV9UWVBFKG9wKS0+dHBfZnJlZShvcCk7CisgICAgaWYgKG9wLT5mbGFncyAmIFBPRl9FTkFCTEVEKQorICAgICAgICBQeUV2YWxfU2V0UHJvZmlsZShOVUxMLCBOVUxMKTsKKyAgICBmbHVzaF91bm1hdGNoZWQob3ApOworICAgIGNsZWFyRW50cmllcyhvcCk7CisgICAgUHlfWERFQ1JFRihvcC0+ZXh0ZXJuYWxUaW1lcik7CisgICAgUHlfVFlQRShvcCktPnRwX2ZyZWUob3ApOwogfQogCiBzdGF0aWMgaW50CiBwcm9maWxlcl9pbml0KFByb2ZpbGVyT2JqZWN0ICpwT2JqLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpvOwotCVB5T2JqZWN0ICp0aW1lciA9IE5VTEw7Ci0JZG91YmxlIHRpbWV1bml0ID0gMC4wOwotCWludCBzdWJjYWxscyA9IDE7CisgICAgUHlPYmplY3QgKm87CisgICAgUHlPYmplY3QgKnRpbWVyID0gTlVMTDsKKyAgICBkb3VibGUgdGltZXVuaXQgPSAwLjA7CisgICAgaW50IHN1YmNhbGxzID0gMTsKICNpZmRlZiBQeVRyYWNlX0NfQ0FMTAotCWludCBidWlsdGlucyA9IDE7CisgICAgaW50IGJ1aWx0aW5zID0gMTsKICNlbHNlCi0JaW50IGJ1aWx0aW5zID0gMDsKKyAgICBpbnQgYnVpbHRpbnMgPSAwOwogI2VuZGlmCi0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJ0aW1lciIsICJ0aW1ldW5pdCIsCi0JCQkJICAgICAgICJzdWJjYWxscyIsICJidWlsdGlucyIsIDB9OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsidGltZXIiLCAidGltZXVuaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ViY2FsbHMiLCAiYnVpbHRpbnMiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifE9kaWk6UHJvZmlsZXIiLCBrd2xpc3QsCi0JCQkJCSAmdGltZXIsICZ0aW1ldW5pdCwKLQkJCQkJICZzdWJjYWxscywgJmJ1aWx0aW5zKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifE9kaWk6UHJvZmlsZXIiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVyLCAmdGltZXVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YmNhbGxzLCAmYnVpbHRpbnMpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoc2V0U3ViY2FsbHMocE9iaiwgc3ViY2FsbHMpIDwgMCB8fCBzZXRCdWlsdGlucyhwT2JqLCBidWlsdGlucykgPCAwKQotCQlyZXR1cm4gLTE7Ci0JbyA9IHBPYmotPmV4dGVybmFsVGltZXI7Ci0JcE9iai0+ZXh0ZXJuYWxUaW1lciA9IHRpbWVyOwotCVB5X1hJTkNSRUYodGltZXIpOwotCVB5X1hERUNSRUYobyk7Ci0JcE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQgPSB0aW1ldW5pdDsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc2V0U3ViY2FsbHMocE9iaiwgc3ViY2FsbHMpIDwgMCB8fCBzZXRCdWlsdGlucyhwT2JqLCBidWlsdGlucykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbyA9IHBPYmotPmV4dGVybmFsVGltZXI7CisgICAgcE9iai0+ZXh0ZXJuYWxUaW1lciA9IHRpbWVyOworICAgIFB5X1hJTkNSRUYodGltZXIpOworICAgIFB5X1hERUNSRUYobyk7CisgICAgcE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQgPSB0aW1ldW5pdDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHByb2ZpbGVyX21ldGhvZHNbXSA9IHsKLQl7ImdldHN0YXRzIiwgICAgKFB5Q0Z1bmN0aW9uKXByb2ZpbGVyX2dldHN0YXRzLAotCQkJTUVUSF9OT0FSR1MsCQkJZ2V0c3RhdHNfZG9jfSwKLQl7ImVuYWJsZSIsCShQeUNGdW5jdGlvbilwcm9maWxlcl9lbmFibGUsCi0JCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAllbmFibGVfZG9jfSwKLQl7ImRpc2FibGUiLAkoUHlDRnVuY3Rpb24pcHJvZmlsZXJfZGlzYWJsZSwKLQkJCU1FVEhfTk9BUkdTLAkJCWRpc2FibGVfZG9jfSwKLQl7ImNsZWFyIiwJKFB5Q0Z1bmN0aW9uKXByb2ZpbGVyX2NsZWFyLAotCQkJTUVUSF9OT0FSR1MsCQkJY2xlYXJfZG9jfSwKLQl7TlVMTCwgTlVMTH0KKyAgICB7ImdldHN0YXRzIiwgICAgKFB5Q0Z1bmN0aW9uKXByb2ZpbGVyX2dldHN0YXRzLAorICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgICAgICAgICAgICAgICAgICAgICAgICBnZXRzdGF0c19kb2N9LAorICAgIHsiZW5hYmxlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXByb2ZpbGVyX2VuYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgICAgICAgZW5hYmxlX2RvY30sCisgICAgeyJkaXNhYmxlIiwgICAgICAgICAoUHlDRnVuY3Rpb24pcHJvZmlsZXJfZGlzYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZV9kb2N9LAorICAgIHsiY2xlYXIiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXByb2ZpbGVyX2NsZWFyLAorICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9kb2N9LAorICAgIHtOVUxMLCBOVUxMfQogfTsKIAogUHlEb2NfU1RSVkFSKHByb2ZpbGVyX2RvYywgIlwKQEAgLTgxNyw3NiArODE3LDc2IEBACiAiKTsKIAogc3RhdGljaGVyZSBQeVR5cGVPYmplY3QgUHlQcm9maWxlcl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCi0JIl9sc3Byb2YuUHJvZmlsZXIiLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KLQlzaXplb2YoUHJvZmlsZXJPYmplY3QpLCAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3IpcHJvZmlsZXJfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JcHJvZmlsZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0JcHJvZmlsZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylwcm9maWxlcl9pbml0LCAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAiX2xzcHJvZi5Qcm9maWxlciIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQcm9maWxlck9iamVjdCksICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAoZGVzdHJ1Y3Rvcilwcm9maWxlcl9kZWFsbG9jLCAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICBwcm9maWxlcl9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBwcm9maWxlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKXByb2ZpbGVyX2luaXQsICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVNZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEx9CisgICAge05VTEwsIE5VTEx9CiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdF9sc3Byb2Yodm9pZCkKIHsKLQlQeU9iamVjdCAqbW9kdWxlLCAqZDsKLQltb2R1bGUgPSBQeV9Jbml0TW9kdWxlMygiX2xzcHJvZiIsIG1vZHVsZU1ldGhvZHMsICJGYXN0IHByb2ZpbGVyIik7Ci0JaWYgKG1vZHVsZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVByb2ZpbGVyX1R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQcm9maWxlciIsIChQeU9iamVjdCAqKSZQeVByb2ZpbGVyX1R5cGUpOworICAgIFB5T2JqZWN0ICptb2R1bGUsICpkOworICAgIG1vZHVsZSA9IFB5X0luaXRNb2R1bGUzKCJfbHNwcm9mIiwgbW9kdWxlTWV0aG9kcywgIkZhc3QgcHJvZmlsZXIiKTsKKyAgICBpZiAobW9kdWxlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtb2R1bGUpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5UHJvZmlsZXJfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlByb2ZpbGVyIiwgKFB5T2JqZWN0ICopJlB5UHJvZmlsZXJfVHlwZSk7CiAKLQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRzRW50cnlUeXBlLCAKLQkJCQkJICAmcHJvZmlsZXJfZW50cnlfZGVzYyk7Ci0JCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRzU3ViRW50cnlUeXBlLCAKLQkJCQkJICAmcHJvZmlsZXJfc3ViZW50cnlfZGVzYyk7Ci0JfQotCVB5X0lOQ1JFRigoUHlPYmplY3QqKSAmU3RhdHNFbnRyeVR5cGUpOwotCVB5X0lOQ1JFRigoUHlPYmplY3QqKSAmU3RhdHNTdWJFbnRyeVR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJwcm9maWxlcl9lbnRyeSIsCi0JCQkgICAoUHlPYmplY3QqKSAmU3RhdHNFbnRyeVR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJwcm9maWxlcl9zdWJlbnRyeSIsCi0JCQkgICAoUHlPYmplY3QqKSAmU3RhdHNTdWJFbnRyeVR5cGUpOwotCWVtcHR5X3R1cGxlID0gUHlUdXBsZV9OZXcoMCk7Ci0JaW5pdGlhbGl6ZWQgPSAxOworICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RhdHNFbnRyeVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2ZpbGVyX2VudHJ5X2Rlc2MpOworICAgICAgICBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0c1N1YkVudHJ5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvZmlsZXJfc3ViZW50cnlfZGVzYyk7CisgICAgfQorICAgIFB5X0lOQ1JFRigoUHlPYmplY3QqKSAmU3RhdHNFbnRyeVR5cGUpOworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QqKSAmU3RhdHNTdWJFbnRyeVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJwcm9maWxlcl9lbnRyeSIsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopICZTdGF0c0VudHJ5VHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgInByb2ZpbGVyX3N1YmVudHJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0KikgJlN0YXRzU3ViRW50cnlUeXBlKTsKKyAgICBlbXB0eV90dXBsZSA9IFB5VHVwbGVfTmV3KDApOworICAgIGluaXRpYWxpemVkID0gMTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX21hdGguYyBiL01vZHVsZXMvX21hdGguYwppbmRleCA5OTVkMWMwLi5iNWQ4YjQ1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tYXRoLmMKKysrIGIvTW9kdWxlcy9fbWF0aC5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKgogICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgogICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcwotICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQogICogaXMgcHJlc2VydmVkLgogICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCkBAIC0yNywxMSArMjcsMTEgQEAKIC8qIGFjb3NoKHgpCiAgKiBNZXRob2QgOgogICogICAgICBCYXNlZCBvbgotICoJICAgICAgYWNvc2goeCkgPSBsb2cgWyB4ICsgc3FydCh4KngtMSkgXQorICogICAgICAgICAgICBhY29zaCh4KSA9IGxvZyBbIHggKyBzcXJ0KHgqeC0xKSBdCiAgKiAgICAgIHdlIGhhdmUKLSAqCSAgICAgIGFjb3NoKHgpIDo9IGxvZyh4KStsbjIsIGlmIHggaXMgbGFyZ2U7IGVsc2UKLSAqCSAgICAgIGFjb3NoKHgpIDo9IGxvZygyeC0xLyhzcXJ0KHgqeC0xKSt4KSkgaWYgeD4yOyBlbHNlCi0gKgkgICAgICBhY29zaCh4KSA6PSBsb2cxcCh0K3NxcnQoMi4wKnQrdCp0KSk7IHdoZXJlIHQ9eC0xLgorICogICAgICAgICAgICBhY29zaCh4KSA6PSBsb2coeCkrbG4yLCBpZiB4IGlzIGxhcmdlOyBlbHNlCisgKiAgICAgICAgICAgIGFjb3NoKHgpIDo9IGxvZygyeC0xLyhzcXJ0KHgqeC0xKSt4KSkgaWYgeD4yOyBlbHNlCisgKiAgICAgICAgICAgIGFjb3NoKHgpIDo9IGxvZzFwKHQrc3FydCgyLjAqdCt0KnQpKTsgd2hlcmUgdD14LTEuCiAgKgogICogU3BlY2lhbCBjYXNlczoKICAqICAgICAgYWNvc2goeCkgaXMgTmFOIHdpdGggc2lnbmFsIGlmIHg8MS4KQEAgLTQxLDgyICs0MSw4MiBAQAogZG91YmxlCiBfUHlfYWNvc2goZG91YmxlIHgpCiB7Ci0JaWYgKFB5X0lTX05BTih4KSkgewotCQlyZXR1cm4geCt4OwotCX0KLQlpZiAoeCA8IDEuKSB7CQkJLyogeCA8IDE7ICByZXR1cm4gYSBzaWduYWxpbmcgTmFOICovCi0JCWVycm5vID0gRURPTTsKKyAgICBpZiAoUHlfSVNfTkFOKHgpKSB7CisgICAgICAgIHJldHVybiB4K3g7CisgICAgfQorICAgIGlmICh4IDwgMS4pIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHggPCAxOyAgcmV0dXJuIGEgc2lnbmFsaW5nIE5hTiAqLworICAgICAgICBlcnJubyA9IEVET007CiAjaWZkZWYgUHlfTkFOCi0JCXJldHVybiBQeV9OQU47CisgICAgICAgIHJldHVybiBQeV9OQU47CiAjZWxzZQotCQlyZXR1cm4gKHgteCkvKHgteCk7CisgICAgICAgIHJldHVybiAoeC14KS8oeC14KTsKICNlbmRpZgotCX0KLQllbHNlIGlmICh4ID49IHR3b19wb3dfcDI4KSB7CS8qIHggPiAyKioyOCAqLwotCQlpZiAoUHlfSVNfSU5GSU5JVFkoeCkpIHsKLQkJCXJldHVybiB4K3g7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbG9nKHgpK2xuMjsJLyogYWNvc2goaHVnZSk9bG9nKDJ4KSAqLwotCQl9Ci0JfQotCWVsc2UgaWYgKHggPT0gMS4pIHsKLQkJcmV0dXJuIDAuMDsJCQkvKiBhY29zaCgxKSA9IDAgKi8KLQl9Ci0JZWxzZSBpZiAoeCA+IDIuKSB7CQkJLyogMiA8IHggPCAyKioyOCAqLwotCQlkb3VibGUgdCA9IHgqeDsKLQkJcmV0dXJuIGxvZygyLjAqeCAtIDEuMCAvICh4ICsgc3FydCh0IC0gMS4wKSkpOwotCX0KLQllbHNlIHsJCQkJLyogMSA8IHggPD0gMiAqLwotCQlkb3VibGUgdCA9IHggLSAxLjA7Ci0JCXJldHVybiBtX2xvZzFwKHQgKyBzcXJ0KDIuMCp0ICsgdCp0KSk7Ci0JfQorICAgIH0KKyAgICBlbHNlIGlmICh4ID49IHR3b19wb3dfcDI4KSB7ICAgICAgICAvKiB4ID4gMioqMjggKi8KKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHgpKSB7CisgICAgICAgICAgICByZXR1cm4geCt4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxvZyh4KStsbjI7ICAgICAgICAgICAgICAgICAgLyogYWNvc2goaHVnZSk9bG9nKDJ4KSAqLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHggPT0gMS4pIHsKKyAgICAgICAgcmV0dXJuIDAuMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjb3NoKDEpID0gMCAqLworICAgIH0KKyAgICBlbHNlIGlmICh4ID4gMi4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgPCB4IDwgMioqMjggKi8KKyAgICAgICAgZG91YmxlIHQgPSB4Kng7CisgICAgICAgIHJldHVybiBsb2coMi4wKnggLSAxLjAgLyAoeCArIHNxcnQodCAtIDEuMCkpKTsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSA8IHggPD0gMiAqLworICAgICAgICBkb3VibGUgdCA9IHggLSAxLjA7CisgICAgICAgIHJldHVybiBtX2xvZzFwKHQgKyBzcXJ0KDIuMCp0ICsgdCp0KSk7CisgICAgfQogfQogCiAKIC8qIGFzaW5oKHgpCiAgKiBNZXRob2QgOgotICoJQmFzZWQgb24gCi0gKgkJYXNpbmgoeCkgPSBzaWduKHgpICogbG9nIFsgfHh8ICsgc3FydCh4KngrMSkgXQotICoJd2UgaGF2ZQotICoJYXNpbmgoeCkgOj0geCAgaWYgIDEreCp4PTEsCi0gKgkJIDo9IHNpZ24oeCkqKGxvZyh4KStsbjIpKSBmb3IgbGFyZ2UgfHh8LCBlbHNlCi0gKgkJIDo9IHNpZ24oeCkqbG9nKDJ8eHwrMS8ofHh8K3NxcnQoeCp4KzEpKSkgaWZ8eHw+MiwgZWxzZQotICoJCSA6PSBzaWduKHgpKmxvZzFwKHx4fCArIHheMi8oMSArIHNxcnQoMSt4XjIpKSkgIAorICogICAgICBCYXNlZCBvbgorICogICAgICAgICAgICAgIGFzaW5oKHgpID0gc2lnbih4KSAqIGxvZyBbIHx4fCArIHNxcnQoeCp4KzEpIF0KKyAqICAgICAgd2UgaGF2ZQorICogICAgICBhc2luaCh4KSA6PSB4ICBpZiAgMSt4Kng9MSwKKyAqICAgICAgICAgICAgICAgOj0gc2lnbih4KSoobG9nKHgpK2xuMikpIGZvciBsYXJnZSB8eHwsIGVsc2UKKyAqICAgICAgICAgICAgICAgOj0gc2lnbih4KSpsb2coMnx4fCsxLyh8eHwrc3FydCh4KngrMSkpKSBpZnx4fD4yLCBlbHNlCisgKiAgICAgICAgICAgICAgIDo9IHNpZ24oeCkqbG9nMXAofHh8ICsgeF4yLygxICsgc3FydCgxK3heMikpKQogICovCiAKIGRvdWJsZQogX1B5X2FzaW5oKGRvdWJsZSB4KQotewkKLQlkb3VibGUgdzsKLQlkb3VibGUgYWJzeCA9IGZhYnMoeCk7Cit7CisgICAgZG91YmxlIHc7CisgICAgZG91YmxlIGFic3ggPSBmYWJzKHgpOwogCi0JaWYgKFB5X0lTX05BTih4KSB8fCBQeV9JU19JTkZJTklUWSh4KSkgewotCQlyZXR1cm4geCt4OwotCX0KLQlpZiAoYWJzeCA8IHR3b19wb3dfbTI4KSB7CS8qIHx4fCA8IDIqKi0yOCAqLwotCQlyZXR1cm4geDsJLyogcmV0dXJuIHggaW5leGFjdCBleGNlcHQgMCAqLwotCX0gCi0JaWYgKGFic3ggPiB0d29fcG93X3AyOCkgewkvKiB8eHwgPiAyKioyOCAqLwotCQl3ID0gbG9nKGFic3gpK2xuMjsKLQl9Ci0JZWxzZSBpZiAoYWJzeCA+IDIuMCkgewkJLyogMiA8IHx4fCA8IDIqKjI4ICovCi0JCXcgPSBsb2coMi4wKmFic3ggKyAxLjAgLyAoc3FydCh4KnggKyAxLjApICsgYWJzeCkpOwotCX0KLQllbHNlIHsJCQkJLyogMioqLTI4IDw9IHx4fCA8IDI9ICovCi0JCWRvdWJsZSB0ID0geCp4OwotCQl3ID0gbV9sb2cxcChhYnN4ICsgdCAvICgxLjAgKyBzcXJ0KDEuMCArIHQpKSk7Ci0JfQotCXJldHVybiBjb3B5c2lnbih3LCB4KTsKLQkKKyAgICBpZiAoUHlfSVNfTkFOKHgpIHx8IFB5X0lTX0lORklOSVRZKHgpKSB7CisgICAgICAgIHJldHVybiB4K3g7CisgICAgfQorICAgIGlmIChhYnN4IDwgdHdvX3Bvd19tMjgpIHsgICAgICAgICAgIC8qIHx4fCA8IDIqKi0yOCAqLworICAgICAgICByZXR1cm4geDsgICAgICAgICAgICAgICAvKiByZXR1cm4geCBpbmV4YWN0IGV4Y2VwdCAwICovCisgICAgfQorICAgIGlmIChhYnN4ID4gdHdvX3Bvd19wMjgpIHsgICAgICAgICAgIC8qIHx4fCA+IDIqKjI4ICovCisgICAgICAgIHcgPSBsb2coYWJzeCkrbG4yOworICAgIH0KKyAgICBlbHNlIGlmIChhYnN4ID4gMi4wKSB7ICAgICAgICAgICAgICAvKiAyIDwgfHh8IDwgMioqMjggKi8KKyAgICAgICAgdyA9IGxvZygyLjAqYWJzeCArIDEuMCAvIChzcXJ0KHgqeCArIDEuMCkgKyBhYnN4KSk7CisgICAgfQorICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIqKi0yOCA8PSB8eHwgPCAyPSAqLworICAgICAgICBkb3VibGUgdCA9IHgqeDsKKyAgICAgICAgdyA9IG1fbG9nMXAoYWJzeCArIHQgLyAoMS4wICsgc3FydCgxLjAgKyB0KSkpOworICAgIH0KKyAgICByZXR1cm4gY29weXNpZ24odywgeCk7CisKIH0KIAogLyogYXRhbmgoeCkKICAqIE1ldGhvZCA6CiAgKiAgICAxLlJlZHVjZWQgeCB0byBwb3NpdGl2ZSBieSBhdGFuaCgteCkgPSAtYXRhbmgoeCkKICAqICAgIDIuRm9yIHg+PTAuNQotICoJCSAgMQkgICAgICAyeAkJCSAgeAorICogICAgICAgICAgICAgICAgMSAgICAgICAgICAgMnggICAgICAgICAgICAgICAgICAgICAgICAgIHgKICAqICAgICAgYXRhbmgoeCkgPSAtLS0gKiBsb2coMSArIC0tLS0tLS0pID0gMC41ICogbG9nMXAoMiAqIC0tLS0tLS0tKQotICoJCSAgMgkgICAgIDEgLSB4CQkgICAgICAxIC0geAorICogICAgICAgICAgICAgICAgMiAgICAgICAgICAxIC0geCAgICAgICAgICAgICAgICAgICAgMSAtIHgKICAqCiAgKiAgICAgIEZvciB4PDAuNQogICogICAgICBhdGFuaCh4KSA9IDAuNSpsb2cxcCgyeCsyeCp4LygxLXgpKQpAQCAtMTMwLDMyICsxMzAsMzIgQEAKIGRvdWJsZQogX1B5X2F0YW5oKGRvdWJsZSB4KQogewotCWRvdWJsZSBhYnN4OwotCWRvdWJsZSB0OworICAgIGRvdWJsZSBhYnN4OworICAgIGRvdWJsZSB0OwogCi0JaWYgKFB5X0lTX05BTih4KSkgewotCQlyZXR1cm4geCt4OwotCX0KLQlhYnN4ID0gZmFicyh4KTsKLQlpZiAoYWJzeCA+PSAxLikgewkJLyogfHh8ID49IDEgKi8KLQkJZXJybm8gPSBFRE9NOworICAgIGlmIChQeV9JU19OQU4oeCkpIHsKKyAgICAgICAgcmV0dXJuIHgreDsKKyAgICB9CisgICAgYWJzeCA9IGZhYnMoeCk7CisgICAgaWYgKGFic3ggPj0gMS4pIHsgICAgICAgICAgICAgICAgICAgLyogfHh8ID49IDEgKi8KKyAgICAgICAgZXJybm8gPSBFRE9NOwogI2lmZGVmIFB5X05BTgotCQlyZXR1cm4gUHlfTkFOOworICAgICAgICByZXR1cm4gUHlfTkFOOwogI2Vsc2UKLQkJcmV0dXJuIHgvemVybzsKKyAgICAgICAgcmV0dXJuIHgvemVybzsKICNlbmRpZgotCX0KLQlpZiAoYWJzeCA8IHR3b19wb3dfbTI4KSB7CS8qIHx4fCA8IDIqKi0yOCAqLwotCQlyZXR1cm4geDsKLQl9Ci0JaWYgKGFic3ggPCAwLjUpIHsJCS8qIHx4fCA8IDAuNSAqLwotCQl0ID0gYWJzeCthYnN4OwotCQl0ID0gMC41ICogbV9sb2cxcCh0ICsgdCphYnN4IC8gKDEuMCAtIGFic3gpKTsKLQl9IAotCWVsc2UgewkJCQkvKiAwLjUgPD0gfHh8IDw9IDEuMCAqLwotCQl0ID0gMC41ICogbV9sb2cxcCgoYWJzeCArIGFic3gpIC8gKDEuMCAtIGFic3gpKTsKLQl9Ci0JcmV0dXJuIGNvcHlzaWduKHQsIHgpOworICAgIH0KKyAgICBpZiAoYWJzeCA8IHR3b19wb3dfbTI4KSB7ICAgICAgICAgICAvKiB8eHwgPCAyKiotMjggKi8KKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIGlmIChhYnN4IDwgMC41KSB7ICAgICAgICAgICAgICAgICAgIC8qIHx4fCA8IDAuNSAqLworICAgICAgICB0ID0gYWJzeCthYnN4OworICAgICAgICB0ID0gMC41ICogbV9sb2cxcCh0ICsgdCphYnN4IC8gKDEuMCAtIGFic3gpKTsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMC41IDw9IHx4fCA8PSAxLjAgKi8KKyAgICAgICAgdCA9IDAuNSAqIG1fbG9nMXAoKGFic3ggKyBhYnN4KSAvICgxLjAgLSBhYnN4KSk7CisgICAgfQorICAgIHJldHVybiBjb3B5c2lnbih0LCB4KTsKIH0KIAogLyogTWF0aGVtYXRpY2FsbHksIGV4cG0xKHgpID0gZXhwKHgpIC0gMS4gIFRoZSBleHBtMSBmdW5jdGlvbiBpcyBkZXNpZ25lZApAQCAtMTczLDE1ICsxNzMsMTUgQEAKICAgICAqLwogCiAgICAgaWYgKGZhYnMoeCkgPCAwLjcpIHsKLSAgICAgICAgZG91YmxlIHU7Ci0gICAgICAgIHUgPSBleHAoeCk7Ci0gICAgICAgIGlmICh1ID09IDEuMCkKLSAgICAgICAgICAgIHJldHVybiB4OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gKHUgLSAxLjApICogeCAvIGxvZyh1KTsKKyAgICBkb3VibGUgdTsKKyAgICB1ID0gZXhwKHgpOworICAgIGlmICh1ID09IDEuMCkKKyAgICAgICAgcmV0dXJuIHg7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gKHUgLSAxLjApICogeCAvIGxvZyh1KTsKICAgICB9CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gZXhwKHgpIC0gMS4wOworICAgIHJldHVybiBleHAoeCkgLSAxLjA7CiB9CiAKIC8qIGxvZzFwKHgpID0gbG9nKDEreCkuICBUaGUgbG9nMXAgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYXZvaWQgdGhlCkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICAvKiBGb3IgeCBzbWFsbCwgd2UgdXNlIHRoZSBmb2xsb3dpbmcgYXBwcm9hY2guICBMZXQgeSBiZSB0aGUgbmVhcmVzdCBmbG9hdAogICAgICAgIHRvIDEreCwgdGhlbgogCi0gICAgICAgICAgMSt4ID0geSAqICgxIC0gKHktMS14KS95KQorICAgICAgMSt4ID0geSAqICgxIC0gKHktMS14KS95KQogCiAgICAgICAgc28gbG9nKDEreCkgPSBsb2coeSkgKyBsb2coMS0oeS0xLXgpL3kpLiAgU2luY2UgKHktMS14KS95IGlzIHRpbnksIHRoZQogICAgICAgIHNlY29uZCB0ZXJtIGlzIHdlbGwgYXBwcm94aW1hdGVkIGJ5ICh5LTEteCkveS4gIElmIGFicyh4KSA+PQpAQCAtMjEzLDE3ICsyMTMsMTcgQEAKIAogICAgIGRvdWJsZSB5OwogICAgIGlmIChmYWJzKHgpIDwgREJMX0VQU0lMT04vMi4pIHsKLSAgICAgICAgcmV0dXJuIHg7CisgICAgcmV0dXJuIHg7CiAgICAgfSBlbHNlIGlmICgtMC41IDw9IHggJiYgeCA8PSAxLikgewotICAgICAgICAvKiBXQVJOSU5HOiBpdCdzIHBvc3NpYmxlIHRoYW4gYW4gb3ZlcmVhZ2VyIGNvbXBpbGVyCi0gICAgICAgICAgIHdpbGwgaW5jb3JyZWN0bHkgb3B0aW1pemUgdGhlIGZvbGxvd2luZyB0d28gbGluZXMKLSAgICAgICAgICAgdG8gdGhlIGVxdWl2YWxlbnQgb2YgInJldHVybiBsb2coMS4reCkiLiBJZiB0aGlzCi0gICAgICAgICAgIGhhcHBlbnMsIHRoZW4gcmVzdWx0cyBmcm9tIGxvZzFwIHdpbGwgYmUgaW5hY2N1cmF0ZQotICAgICAgICAgICBmb3Igc21hbGwgeC4gKi8KLSAgICAgICAgeSA9IDEuK3g7Ci0gICAgICAgIHJldHVybiBsb2coeSktKCh5LTEuKS14KS95OworICAgIC8qIFdBUk5JTkc6IGl0J3MgcG9zc2libGUgdGhhbiBhbiBvdmVyZWFnZXIgY29tcGlsZXIKKyAgICAgICB3aWxsIGluY29ycmVjdGx5IG9wdGltaXplIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzCisgICAgICAgdG8gdGhlIGVxdWl2YWxlbnQgb2YgInJldHVybiBsb2coMS4reCkiLiBJZiB0aGlzCisgICAgICAgaGFwcGVucywgdGhlbiByZXN1bHRzIGZyb20gbG9nMXAgd2lsbCBiZSBpbmFjY3VyYXRlCisgICAgICAgZm9yIHNtYWxsIHguICovCisgICAgeSA9IDEuK3g7CisgICAgcmV0dXJuIGxvZyh5KS0oKHktMS4pLXgpL3k7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogTmFOcyBhbmQgaW5maW5pdGllcyBzaG91bGQgZW5kIHVwIGhlcmUgKi8KLSAgICAgICAgcmV0dXJuIGxvZygxLit4KTsKKyAgICAvKiBOYU5zIGFuZCBpbmZpbml0aWVzIHNob3VsZCBlbmQgdXAgaGVyZSAqLworICAgIHJldHVybiBsb2coMS4reCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24uaCBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLmgKaW5kZXggNDQ0M2JkYy4uMWQ5N2JkNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24uaAorKysgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5oCkBAIC0xOSwxNCArMTksMTQgQEAKIAogI2RlZmluZSBDSEVDS19SRUFEQUJMRShzZWxmKSBcCiAgICAgaWYgKCEoc2VsZi0+ZmxhZ3MgJiBSRUFEQUJMRSkpIHsgXAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImNvbm5lY3Rpb24gaXMgd3JpdGUtb25seSIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJjb25uZWN0aW9uIGlzIHdyaXRlLW9ubHkiKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfQogCiAjZGVmaW5lIENIRUNLX1dSSVRBQkxFKHNlbGYpIFwKICAgICBpZiAoIShzZWxmLT5mbGFncyAmIFdSSVRBQkxFKSkgeyBcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiY29ubmVjdGlvbiBpcyByZWFkLW9ubHkiKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiY29ubmVjdGlvbiBpcyByZWFkLW9ubHkiKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfQogCiAvKgpAQCAtMzYsNTcgKzM2LDU3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JQ29ubmVjdGlvbk9iamVjdCAqc2VsZjsKLQlIQU5ETEUgaGFuZGxlOwotCUJPT0wgcmVhZGFibGUgPSBUUlVFLCB3cml0YWJsZSA9IFRSVUU7CisgICAgQ29ubmVjdGlvbk9iamVjdCAqc2VsZjsKKyAgICBIQU5ETEUgaGFuZGxlOworICAgIEJPT0wgcmVhZGFibGUgPSBUUlVFLCB3cml0YWJsZSA9IFRSVUU7CiAKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImhhbmRsZSIsICJyZWFkYWJsZSIsICJ3cml0YWJsZSIsIE5VTEx9OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiaGFuZGxlIiwgInJlYWRhYmxlIiwgIndyaXRhYmxlIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBGX0hBTkRMRSAifGlpIiwga3dsaXN0LAotCQkJCQkgJmhhbmRsZSwgJnJlYWRhYmxlLCAmd3JpdGFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBGX0hBTkRMRSAifGlpIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGUsICZyZWFkYWJsZSwgJndyaXRhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFIHx8IChQeV9zc2l6ZV90KWhhbmRsZSA8IDApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0lPRXJyb3IsICJpbnZhbGlkIGhhbmRsZSAlemQiLAotCQkJICAgICAoUHlfc3NpemVfdCloYW5kbGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSB8fCAoUHlfc3NpemVfdCloYW5kbGUgPCAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JT0Vycm9yLCAiaW52YWxpZCBoYW5kbGUgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KWhhbmRsZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICghcmVhZGFibGUgJiYgIXdyaXRhYmxlKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJlaXRoZXIgcmVhZGFibGUgb3Igd3JpdGFibGUgbXVzdCBiZSB0cnVlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIXJlYWRhYmxlICYmICF3cml0YWJsZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJlaXRoZXIgcmVhZGFibGUgb3Igd3JpdGFibGUgbXVzdCBiZSB0cnVlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNlbGYgPSBQeU9iamVjdF9OZXcoQ29ubmVjdGlvbk9iamVjdCwgdHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhDb25uZWN0aW9uT2JqZWN0LCB0eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYtPndlYWtyZWZsaXN0ID0gTlVMTDsKLQlzZWxmLT5oYW5kbGUgPSBoYW5kbGU7Ci0Jc2VsZi0+ZmxhZ3MgPSAwOworICAgIHNlbGYtPndlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICBzZWxmLT5oYW5kbGUgPSBoYW5kbGU7CisgICAgc2VsZi0+ZmxhZ3MgPSAwOwogCi0JaWYgKHJlYWRhYmxlKQotCQlzZWxmLT5mbGFncyB8PSBSRUFEQUJMRTsKLQlpZiAod3JpdGFibGUpCi0JCXNlbGYtPmZsYWdzIHw9IFdSSVRBQkxFOwotCWFzc2VydChzZWxmLT5mbGFncyA+PSAxICYmIHNlbGYtPmZsYWdzIDw9IDMpOworICAgIGlmIChyZWFkYWJsZSkKKyAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gUkVBREFCTEU7CisgICAgaWYgKHdyaXRhYmxlKQorICAgICAgICBzZWxmLT5mbGFncyB8PSBXUklUQUJMRTsKKyAgICBhc3NlcnQoc2VsZi0+ZmxhZ3MgPj0gMSAmJiBzZWxmLT5mbGFncyA8PSAzKTsKIAotCXJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKIH0KIAogc3RhdGljIHZvaWQKIGNvbm5lY3Rpb25fZGVhbGxvYyhDb25uZWN0aW9uT2JqZWN0KiBzZWxmKQogewotCWlmIChzZWxmLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCopc2VsZik7CisgICAgaWYgKHNlbGYtPndlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0KilzZWxmKTsKIAotCWlmIChzZWxmLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlDTE9TRShzZWxmLT5oYW5kbGUpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgaWYgKHNlbGYtPmhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIENMT1NFKHNlbGYtPmhhbmRsZSk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogLyoKQEAgLTk2LDE2MCArOTYsMTYwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9zZW5kYnl0ZXMoQ29ubmVjdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqYnVmZmVyOwotCVB5X3NzaXplX3QgbGVuZ3RoLCBvZmZzZXQ9MCwgc2l6ZT1QWV9TU0laRV9UX01JTjsKLQlpbnQgcmVzOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgb2Zmc2V0PTAsIHNpemU9UFlfU1NJWkVfVF9NSU47CisgICAgaW50IHJlczsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBGX1JCVUZGRVIgIiN8IiBGX1BZX1NTSVpFX1QgRl9QWV9TU0laRV9ULAotCQkJICAgICAgJmJ1ZmZlciwgJmxlbmd0aCwgJm9mZnNldCwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9SQlVGRkVSICIjfCIgRl9QWV9TU0laRV9UIEZfUFlfU1NJWkVfVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlciwgJmxlbmd0aCwgJm9mZnNldCwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNIRUNLX1dSSVRBQkxFKHNlbGYpOworICAgIENIRUNLX1dSSVRBQkxFKHNlbGYpOwogCi0JaWYgKG9mZnNldCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvZmZzZXQgaXMgbmVnYXRpdmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChsZW5ndGggPCBvZmZzZXQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJidWZmZXIgbGVuZ3RoIDwgb2Zmc2V0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm9mZnNldCBpcyBuZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGxlbmd0aCA8IG9mZnNldCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJ1ZmZlciBsZW5ndGggPCBvZmZzZXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHNpemUgPT0gUFlfU1NJWkVfVF9NSU4pIHsKLQkJc2l6ZSA9IGxlbmd0aCAtIG9mZnNldDsKLQl9IGVsc2UgewotCQlpZiAoc2l6ZSA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2l6ZSBpcyBuZWdhdGl2ZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKG9mZnNldCArIHNpemUgPiBsZW5ndGgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiYnVmZmVyIGxlbmd0aCA8IG9mZnNldCArIHNpemUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmIChzaXplID09IFBZX1NTSVpFX1RfTUlOKSB7CisgICAgICAgIHNpemUgPSBsZW5ndGggLSBvZmZzZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNpemUgaXMgbmVnYXRpdmUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXQgKyBzaXplID4gbGVuZ3RoKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIGxlbmd0aCA8IG9mZnNldCArIHNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JcmVzID0gY29ubl9zZW5kX3N0cmluZyhzZWxmLCBidWZmZXIgKyBvZmZzZXQsIHNpemUpOworICAgIHJlcyA9IGNvbm5fc2VuZF9zdHJpbmcoc2VsZiwgYnVmZmVyICsgb2Zmc2V0LCBzaXplKTsKIAotCWlmIChyZXMgPCAwKSB7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UKLQkJCXJldHVybiBtcF9TZXRFcnJvcihQeUV4Y19JT0Vycm9yLCByZXMpOwotCX0KKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKKyAgICB9CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fcmVjdmJ5dGVzKENvbm5lY3Rpb25PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmZyZWVtZSA9IE5VTEw7Ci0JUHlfc3NpemVfdCByZXMsIG1heGxlbmd0aCA9IFBZX1NTSVpFX1RfTUFYOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIGNoYXIgKmZyZWVtZSA9IE5VTEw7CisgICAgUHlfc3NpemVfdCByZXMsIG1heGxlbmd0aCA9IFBZX1NTSVpFX1RfTUFYOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8IiBGX1BZX1NTSVpFX1QsICZtYXhsZW5ndGgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInwiIEZfUFlfU1NJWkVfVCwgJm1heGxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQ0hFQ0tfUkVBREFCTEUoc2VsZik7CisgICAgQ0hFQ0tfUkVBREFCTEUoc2VsZik7CiAKLQlpZiAobWF4bGVuZ3RoIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1heGxlbmd0aCA8IDAiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChtYXhsZW5ndGggPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF4bGVuZ3RoIDwgMCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXMgPSBjb25uX3JlY3Zfc3RyaW5nKHNlbGYsIHNlbGYtPmJ1ZmZlciwgQ09OTkVDVElPTl9CVUZGRVJfU0laRSwKLQkJCSAgICAgICAmZnJlZW1lLCBtYXhsZW5ndGgpOworICAgIHJlcyA9IGNvbm5fcmVjdl9zdHJpbmcoc2VsZiwgc2VsZi0+YnVmZmVyLCBDT05ORUNUSU9OX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyZWVtZSwgbWF4bGVuZ3RoKTsKIAotCWlmIChyZXMgPCAwKSB7Ci0JCWlmIChyZXMgPT0gTVBfQkFEX01FU1NBR0VfTEVOR1RIKSB7Ci0JCQlpZiAoKHNlbGYtPmZsYWdzICYgV1JJVEFCTEUpID09IDApIHsKLQkJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQkJQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKLQkJCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkJCXNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxmLT5mbGFncyA9IFdSSVRBQkxFOwotCQkJfQotCQl9Ci0JCW1wX1NldEVycm9yKFB5RXhjX0lPRXJyb3IsIHJlcyk7Ci0JfSBlbHNlIHsKLQkJaWYgKGZyZWVtZSA9PSBOVUxMKSB7Ci0JCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5idWZmZXIsIHJlcyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShmcmVlbWUsIHJlcyk7Ci0JCQlQeU1lbV9GcmVlKGZyZWVtZSk7Ci0JCX0KLQl9CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgaWYgKHJlcyA9PSBNUF9CQURfTUVTU0FHRV9MRU5HVEgpIHsKKyAgICAgICAgICAgIGlmICgoc2VsZi0+ZmxhZ3MgJiBXUklUQUJMRSkgPT0gMCkgeworICAgICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBDTE9TRShzZWxmLT5oYW5kbGUpOworICAgICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICAgICAgc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzID0gV1JJVEFCTEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZnJlZW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmJ1ZmZlciwgcmVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZyZWVtZSwgcmVzKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZnJlZW1lKTsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fcmVjdmJ5dGVzX2ludG8oQ29ubmVjdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZnJlZW1lID0gTlVMTCwgKmJ1ZmZlciA9IE5VTEw7Ci0JUHlfc3NpemVfdCByZXMsIGxlbmd0aCwgb2Zmc2V0ID0gMDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICBjaGFyICpmcmVlbWUgPSBOVUxMLCAqYnVmZmVyID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IHJlcywgbGVuZ3RoLCBvZmZzZXQgPSAwOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5X2J1ZmZlciBwYnVmOwogCi0JQ0hFQ0tfUkVBREFCTEUoc2VsZik7CisgICAgQ0hFQ0tfUkVBREFCTEUoc2VsZik7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIncqfCIgRl9QWV9TU0laRV9ULAotCQkJICAgICAgJnBidWYsICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIncqfCIgRl9QWV9TU0laRV9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JYnVmZmVyID0gcGJ1Zi5idWY7Ci0JbGVuZ3RoID0gcGJ1Zi5sZW47CisgICAgYnVmZmVyID0gcGJ1Zi5idWY7CisgICAgbGVuZ3RoID0gcGJ1Zi5sZW47CiAKLQlpZiAob2Zmc2V0IDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIG9mZnNldCIpOwotCQlnb3RvIF9lcnJvcjsKLQl9CisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBvZmZzZXQiKTsKKyAgICAgICAgZ290byBfZXJyb3I7CisgICAgfQogCi0JaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm9mZnNldCB0b28gbGFyZ2UiKTsKLQkJZ290byBfZXJyb3I7Ci0JfQorICAgIGlmIChvZmZzZXQgPiBsZW5ndGgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvZmZzZXQgdG9vIGxhcmdlIik7CisgICAgICAgIGdvdG8gX2Vycm9yOworICAgIH0KIAotCXJlcyA9IGNvbm5fcmVjdl9zdHJpbmcoc2VsZiwgYnVmZmVyK29mZnNldCwgbGVuZ3RoLW9mZnNldCwKLQkJCSAgICAgICAmZnJlZW1lLCBQWV9TU0laRV9UX01BWCk7CisgICAgcmVzID0gY29ubl9yZWN2X3N0cmluZyhzZWxmLCBidWZmZXIrb2Zmc2V0LCBsZW5ndGgtb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyZWVtZSwgUFlfU1NJWkVfVF9NQVgpOwogCi0JaWYgKHJlcyA8IDApIHsKLQkJaWYgKHJlcyA9PSBNUF9CQURfTUVTU0FHRV9MRU5HVEgpIHsKLQkJCWlmICgoc2VsZi0+ZmxhZ3MgJiBXUklUQUJMRSkgPT0gMCkgewotCQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCQlDTE9TRShzZWxmLT5oYW5kbGUpOwotCQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCQkJc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGYtPmZsYWdzID0gV1JJVEFCTEU7Ci0JCQl9Ci0JCX0KLQkJbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKLQl9IGVsc2UgewotCQlpZiAoZnJlZW1lID09IE5VTEwpIHsKLQkJCXJlc3VsdCA9IFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oQnVmZmVyVG9vU2hvcnQsCi0JCQkJCQkgICAgICAgRl9SQlVGRkVSICIjIiwKLQkJCQkJCSAgICAgICBmcmVlbWUsIHJlcyk7Ci0JCQlQeU1lbV9GcmVlKGZyZWVtZSk7Ci0JCQlpZiAocmVzdWx0KSB7Ci0JCQkJUHlFcnJfU2V0T2JqZWN0KEJ1ZmZlclRvb1Nob3J0LCByZXN1bHQpOwotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJfQotCQkJZ290byBfZXJyb3I7Ci0JCX0KLQl9CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgaWYgKHJlcyA9PSBNUF9CQURfTUVTU0FHRV9MRU5HVEgpIHsKKyAgICAgICAgICAgIGlmICgoc2VsZi0+ZmxhZ3MgJiBXUklUQUJMRSkgPT0gMCkgeworICAgICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBDTE9TRShzZWxmLT5oYW5kbGUpOworICAgICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICAgICAgc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzID0gV1JJVEFCTEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZnJlZW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oQnVmZmVyVG9vU2hvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRl9SQlVGRkVSICIjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlbWUsIHJlcyk7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGZyZWVtZSk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KEJ1ZmZlclRvb1Nob3J0LCByZXN1bHQpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBfZXJyb3I7CisgICAgICAgIH0KKyAgICB9CiAKIF9jbGVhbnVwOgotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogX2Vycm9yOgotCXJlc3VsdCA9IE5VTEw7Ci0JZ290byBfY2xlYW51cDsKKyAgICByZXN1bHQgPSBOVUxMOworICAgIGdvdG8gX2NsZWFudXA7CiB9CiAKIC8qCkBAIC0yNTksNzQgKzI1OSw3NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fc2VuZF9vYmooQ29ubmVjdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQljaGFyICpidWZmZXI7Ci0JaW50IHJlczsKLQlQeV9zc2l6ZV90IGxlbmd0aDsKLQlQeU9iamVjdCAqcGlja2xlZF9zdHJpbmcgPSBOVUxMOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBpbnQgcmVzOworICAgIFB5X3NzaXplX3QgbGVuZ3RoOworICAgIFB5T2JqZWN0ICpwaWNrbGVkX3N0cmluZyA9IE5VTEw7CiAKLQlDSEVDS19XUklUQUJMRShzZWxmKTsKKyAgICBDSEVDS19XUklUQUJMRShzZWxmKTsKIAotCXBpY2tsZWRfc3RyaW5nID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhwaWNrbGVfZHVtcHMsIG9iaiwKLQkJCQkJCSAgICAgIHBpY2tsZV9wcm90b2NvbCwgTlVMTCk7Ci0JaWYgKCFwaWNrbGVkX3N0cmluZykKLQkJZ290byBmYWlsdXJlOworICAgIHBpY2tsZWRfc3RyaW5nID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhwaWNrbGVfZHVtcHMsIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlX3Byb3RvY29sLCBOVUxMKTsKKyAgICBpZiAoIXBpY2tsZWRfc3RyaW5nKQorICAgICAgICBnb3RvIGZhaWx1cmU7CiAKLQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHBpY2tsZWRfc3RyaW5nLCAmYnVmZmVyLCAmbGVuZ3RoKSA8IDApCi0JCWdvdG8gZmFpbHVyZTsKKyAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHBpY2tsZWRfc3RyaW5nLCAmYnVmZmVyLCAmbGVuZ3RoKSA8IDApCisgICAgICAgIGdvdG8gZmFpbHVyZTsKIAotCXJlcyA9IGNvbm5fc2VuZF9zdHJpbmcoc2VsZiwgYnVmZmVyLCAoaW50KWxlbmd0aCk7CisgICAgcmVzID0gY29ubl9zZW5kX3N0cmluZyhzZWxmLCBidWZmZXIsIChpbnQpbGVuZ3RoKTsKIAotCWlmIChyZXMgPCAwKSB7Ci0JCW1wX1NldEVycm9yKFB5RXhjX0lPRXJyb3IsIHJlcyk7Ci0JCWdvdG8gZmFpbHVyZTsKLQl9CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKKyAgICAgICAgZ290byBmYWlsdXJlOworICAgIH0KIAotCVB5X1hERUNSRUYocGlja2xlZF9zdHJpbmcpOwotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1hERUNSRUYocGlja2xlZF9zdHJpbmcpOworICAgIFB5X1JFVFVSTl9OT05FOwogCiAgIGZhaWx1cmU6Ci0JUHlfWERFQ1JFRihwaWNrbGVkX3N0cmluZyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihwaWNrbGVkX3N0cmluZyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb25uZWN0aW9uX3JlY3Zfb2JqKENvbm5lY3Rpb25PYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqZnJlZW1lID0gTlVMTDsKLQlQeV9zc2l6ZV90IHJlczsKLQlQeU9iamVjdCAqdGVtcCA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOworICAgIGNoYXIgKmZyZWVtZSA9IE5VTEw7CisgICAgUHlfc3NpemVfdCByZXM7CisgICAgUHlPYmplY3QgKnRlbXAgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKIAotCUNIRUNLX1JFQURBQkxFKHNlbGYpOworICAgIENIRUNLX1JFQURBQkxFKHNlbGYpOwogCi0JcmVzID0gY29ubl9yZWN2X3N0cmluZyhzZWxmLCBzZWxmLT5idWZmZXIsIENPTk5FQ1RJT05fQlVGRkVSX1NJWkUsCi0JCQkgICAgICAgJmZyZWVtZSwgUFlfU1NJWkVfVF9NQVgpOworICAgIHJlcyA9IGNvbm5fcmVjdl9zdHJpbmcoc2VsZiwgc2VsZi0+YnVmZmVyLCBDT05ORUNUSU9OX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyZWVtZSwgUFlfU1NJWkVfVF9NQVgpOwogCi0JaWYgKHJlcyA8IDApIHsKLQkJaWYgKHJlcyA9PSBNUF9CQURfTUVTU0FHRV9MRU5HVEgpIHsKLQkJCWlmICgoc2VsZi0+ZmxhZ3MgJiBXUklUQUJMRSkgPT0gMCkgewotCQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCQlDTE9TRShzZWxmLT5oYW5kbGUpOwotCQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCQkJc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGYtPmZsYWdzID0gV1JJVEFCTEU7Ci0JCQl9Ci0JCX0KLQkJbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKLQl9IGVsc2UgewotCQlpZiAoZnJlZW1lID09IE5VTEwpIHsKLQkJCXRlbXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5idWZmZXIsIHJlcyk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZnJlZW1lLCByZXMpOwotCQkJUHlNZW1fRnJlZShmcmVlbWUpOwotCQl9Ci0JfQorICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIGlmIChyZXMgPT0gTVBfQkFEX01FU1NBR0VfTEVOR1RIKSB7CisgICAgICAgICAgICBpZiAoKHNlbGYtPmZsYWdzICYgV1JJVEFCTEUpID09IDApIHsKKyAgICAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICAgICAgQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKKyAgICAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgICAgIHNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5mbGFncyA9IFdSSVRBQkxFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1wX1NldEVycm9yKFB5RXhjX0lPRXJyb3IsIHJlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZyZWVtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICB0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+YnVmZmVyLCByZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGVtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZyZWVtZSwgcmVzKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZnJlZW1lKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmICh0ZW1wKQotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHBpY2tsZV9sb2FkcywKLQkJCQkJCSAgICAgIHRlbXAsIE5VTEwpOwotCVB5X1hERUNSRUYodGVtcCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAodGVtcCkKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhwaWNrbGVfbG9hZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCwgTlVMTCk7CisgICAgUHlfWERFQ1JFRih0ZW1wKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKgpAQCAtMzM2LDczICszMzYsNzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb25uZWN0aW9uX3BvbGwoQ29ubmVjdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnRpbWVvdXRfb2JqID0gTlVMTDsKLQlkb3VibGUgdGltZW91dCA9IDAuMDsKLQlpbnQgcmVzOworICAgIFB5T2JqZWN0ICp0aW1lb3V0X29iaiA9IE5VTEw7CisgICAgZG91YmxlIHRpbWVvdXQgPSAwLjA7CisgICAgaW50IHJlczsKIAotCUNIRUNLX1JFQURBQkxFKHNlbGYpOworICAgIENIRUNLX1JFQURBQkxFKHNlbGYpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8TyIsICZ0aW1lb3V0X29iaikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8iLCAmdGltZW91dF9vYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICh0aW1lb3V0X29iaiA9PSBOVUxMKSB7Ci0JCXRpbWVvdXQgPSAwLjA7Ci0JfSBlbHNlIGlmICh0aW1lb3V0X29iaiA9PSBQeV9Ob25lKSB7Ci0JCXRpbWVvdXQgPSAtMS4wOwkJCQkvKiBibG9jayBmb3JldmVyICovCi0JfSBlbHNlIHsKLQkJdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUodGltZW91dF9vYmopOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAodGltZW91dCA8IDAuMCkKLQkJCXRpbWVvdXQgPSAwLjA7Ci0JfQorICAgIGlmICh0aW1lb3V0X29iaiA9PSBOVUxMKSB7CisgICAgICAgIHRpbWVvdXQgPSAwLjA7CisgICAgfSBlbHNlIGlmICh0aW1lb3V0X29iaiA9PSBQeV9Ob25lKSB7CisgICAgICAgIHRpbWVvdXQgPSAtMS4wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJsb2NrIGZvcmV2ZXIgKi8KKyAgICB9IGVsc2UgeworICAgICAgICB0aW1lb3V0ID0gUHlGbG9hdF9Bc0RvdWJsZSh0aW1lb3V0X29iaik7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICh0aW1lb3V0IDwgMC4wKQorICAgICAgICAgICAgdGltZW91dCA9IDAuMDsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gY29ubl9wb2xsKHNlbGYsIHRpbWVvdXQsIF9zYXZlKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXMgPSBjb25uX3BvbGwoc2VsZiwgdGltZW91dCwgX3NhdmUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlzd2l0Y2ggKHJlcykgewotCWNhc2UgVFJVRToKLQkJUHlfUkVUVVJOX1RSVUU7Ci0JY2FzZSBGQUxTRToKLQkJUHlfUkVUVVJOX0ZBTFNFOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBtcF9TZXRFcnJvcihQeUV4Y19JT0Vycm9yLCByZXMpOwotCX0KKyAgICBzd2l0Y2ggKHJlcykgeworICAgIGNhc2UgVFJVRToKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgY2FzZSBGQUxTRToKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBtcF9TZXRFcnJvcihQeUV4Y19JT0Vycm9yLCByZXMpOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fZmlsZW5vKENvbm5lY3Rpb25PYmplY3QqIHNlbGYpCiB7Ci0JaWYgKHNlbGYtPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImhhbmRsZSBpcyBpbnZhbGlkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc2VsZi0+aGFuZGxlKTsKKyAgICBpZiAoc2VsZi0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiaGFuZGxlIGlzIGludmFsaWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5oYW5kbGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9jbG9zZShDb25uZWN0aW9uT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlDTE9TRShzZWxmLT5oYW5kbGUpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQl9CisgICAgaWYgKHNlbGYtPmhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIENMT1NFKHNlbGYtPmhhbmRsZSk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIHNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIH0KIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9yZXByKENvbm5lY3Rpb25PYmplY3QgKnNlbGYpCiB7Ci0Jc3RhdGljIGNoYXIgKmNvbm5fdHlwZVtdID0geyJyZWFkLW9ubHkiLCAid3JpdGUtb25seSIsICJyZWFkLXdyaXRlIn07CisgICAgc3RhdGljIGNoYXIgKmNvbm5fdHlwZVtdID0geyJyZWFkLW9ubHkiLCAid3JpdGUtb25seSIsICJyZWFkLXdyaXRlIn07CiAKLQlhc3NlcnQoc2VsZi0+ZmxhZ3MgPj0gMSAmJiBzZWxmLT5mbGFncyA8PSAzKTsKLQlyZXR1cm4gRlJPTV9GT1JNQVQoIjwlcyAlcywgaGFuZGxlICV6ZD4iLAotCQkJICAgY29ubl90eXBlW3NlbGYtPmZsYWdzIC0gMV0sCi0JCQkgICBDT05ORUNUSU9OX05BTUUsIChQeV9zc2l6ZV90KXNlbGYtPmhhbmRsZSk7CisgICAgYXNzZXJ0KHNlbGYtPmZsYWdzID49IDEgJiYgc2VsZi0+ZmxhZ3MgPD0gMyk7CisgICAgcmV0dXJuIEZST01fRk9STUFUKCI8JXMgJXMsIGhhbmRsZSAlemQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29ubl90eXBlW3NlbGYtPmZsYWdzIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgIENPTk5FQ1RJT05fTkFNRSwgKFB5X3NzaXplX3Qpc2VsZi0+aGFuZGxlKTsKIH0KIAogLyoKQEAgLTQxMiwxOSArNDEyLDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9jbG9zZWQoQ29ubmVjdGlvbk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShzZWxmLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShzZWxmLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fcmVhZGFibGUoQ29ubmVjdGlvbk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShzZWxmLT5mbGFncyAmIFJFQURBQkxFKSk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykoc2VsZi0+ZmxhZ3MgJiBSRUFEQUJMRSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl93cml0YWJsZShDb25uZWN0aW9uT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmZsYWdzICYgV1JJVEFCTEUpKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShzZWxmLT5mbGFncyAmIFdSSVRBQkxFKSk7CiB9CiAKIC8qCkBAIC00MzIsMzcgKzQzMiwzNyBAQAogICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjb25uZWN0aW9uX21ldGhvZHNbXSA9IHsKLQl7InNlbmRfYnl0ZXMiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9zZW5kYnl0ZXMsIE1FVEhfVkFSQVJHUywKLQkgInNlbmQgdGhlIGJ5dGUgZGF0YSBmcm9tIGEgcmVhZGFibGUgYnVmZmVyLWxpa2Ugb2JqZWN0In0sCi0JeyJyZWN2X2J5dGVzIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdmJ5dGVzLCBNRVRIX1ZBUkFSR1MsCi0JICJyZWNlaXZlIGJ5dGUgZGF0YSBhcyBhIHN0cmluZyJ9LAotCXsicmVjdl9ieXRlc19pbnRvIiwoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9yZWN2Ynl0ZXNfaW50byxNRVRIX1ZBUkFSR1MsCi0JICJyZWNlaXZlIGJ5dGUgZGF0YSBpbnRvIGEgd3JpdGVhYmxlIGJ1ZmZlci1saWtlIG9iamVjdFxuIgotCSAicmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQifSwKKyAgICB7InNlbmRfYnl0ZXMiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9zZW5kYnl0ZXMsIE1FVEhfVkFSQVJHUywKKyAgICAgInNlbmQgdGhlIGJ5dGUgZGF0YSBmcm9tIGEgcmVhZGFibGUgYnVmZmVyLWxpa2Ugb2JqZWN0In0sCisgICAgeyJyZWN2X2J5dGVzIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdmJ5dGVzLCBNRVRIX1ZBUkFSR1MsCisgICAgICJyZWNlaXZlIGJ5dGUgZGF0YSBhcyBhIHN0cmluZyJ9LAorICAgIHsicmVjdl9ieXRlc19pbnRvIiwoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9yZWN2Ynl0ZXNfaW50byxNRVRIX1ZBUkFSR1MsCisgICAgICJyZWNlaXZlIGJ5dGUgZGF0YSBpbnRvIGEgd3JpdGVhYmxlIGJ1ZmZlci1saWtlIG9iamVjdFxuIgorICAgICAicmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQifSwKIAotCXsic2VuZCIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX3NlbmRfb2JqLCBNRVRIX08sCi0JICJzZW5kIGEgKHBpY2tsYWJsZSkgb2JqZWN0In0sCi0JeyJyZWN2IiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdl9vYmosIE1FVEhfTk9BUkdTLAotCSAicmVjZWl2ZSBhIChwaWNrbGFibGUpIG9iamVjdCJ9LAorICAgIHsic2VuZCIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX3NlbmRfb2JqLCBNRVRIX08sCisgICAgICJzZW5kIGEgKHBpY2tsYWJsZSkgb2JqZWN0In0sCisgICAgeyJyZWN2IiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdl9vYmosIE1FVEhfTk9BUkdTLAorICAgICAicmVjZWl2ZSBhIChwaWNrbGFibGUpIG9iamVjdCJ9LAogCi0JeyJwb2xsIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcG9sbCwgTUVUSF9WQVJBUkdTLAotCSAid2hldGhlciB0aGVyZSBpcyBhbnkgaW5wdXQgYXZhaWxhYmxlIHRvIGJlIHJlYWQifSwKLQl7ImZpbGVubyIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2ZpbGVubywgTUVUSF9OT0FSR1MsCi0JICJmaWxlIGRlc2NyaXB0b3Igb3IgaGFuZGxlIG9mIHRoZSBjb25uZWN0aW9uIn0sCi0JeyJjbG9zZSIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2Nsb3NlLCBNRVRIX05PQVJHUywKLQkgImNsb3NlIHRoZSBjb25uZWN0aW9uIn0sCisgICAgeyJwb2xsIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcG9sbCwgTUVUSF9WQVJBUkdTLAorICAgICAid2hldGhlciB0aGVyZSBpcyBhbnkgaW5wdXQgYXZhaWxhYmxlIHRvIGJlIHJlYWQifSwKKyAgICB7ImZpbGVubyIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2ZpbGVubywgTUVUSF9OT0FSR1MsCisgICAgICJmaWxlIGRlc2NyaXB0b3Igb3IgaGFuZGxlIG9mIHRoZSBjb25uZWN0aW9uIn0sCisgICAgeyJjbG9zZSIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2Nsb3NlLCBNRVRIX05PQVJHUywKKyAgICAgImNsb3NlIHRoZSBjb25uZWN0aW9uIn0sCiAKLQl7TlVMTH0gIC8qIFNlbnRpbmVsICovCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIGNvbm5lY3Rpb25fZ2V0c2V0W10gPSB7Ci0JeyJjbG9zZWQiLCAoZ2V0dGVyKWNvbm5lY3Rpb25fY2xvc2VkLCBOVUxMLAotCSAiVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQiLCBOVUxMfSwKLQl7InJlYWRhYmxlIiwgKGdldHRlciljb25uZWN0aW9uX3JlYWRhYmxlLCBOVUxMLAotCSAiVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyByZWFkYWJsZSIsIE5VTEx9LAotCXsid3JpdGFibGUiLCAoZ2V0dGVyKWNvbm5lY3Rpb25fd3JpdGFibGUsIE5VTEwsCi0JICJUcnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIHdyaXRhYmxlIiwgTlVMTH0sCi0Je05VTEx9CisgICAgeyJjbG9zZWQiLCAoZ2V0dGVyKWNvbm5lY3Rpb25fY2xvc2VkLCBOVUxMLAorICAgICAiVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQiLCBOVUxMfSwKKyAgICB7InJlYWRhYmxlIiwgKGdldHRlciljb25uZWN0aW9uX3JlYWRhYmxlLCBOVUxMLAorICAgICAiVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyByZWFkYWJsZSIsIE5VTEx9LAorICAgIHsid3JpdGFibGUiLCAoZ2V0dGVyKWNvbm5lY3Rpb25fd3JpdGFibGUsIE5VTEwsCisgICAgICJUcnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIHdyaXRhYmxlIiwgTlVMTH0sCisgICAge05VTEx9CiB9OwogCiAvKgpAQCAtNDcwLDUwICs0NzAsNTAgQEAKICAqLwogCiBQeURvY19TVFJWQVIoY29ubmVjdGlvbl9kb2MsCi0JICAgICAiQ29ubmVjdGlvbiB0eXBlIHdob3NlIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBpc1xuXG4iCi0JICAgICAiICAgIENvbm5lY3Rpb24oaGFuZGxlLCByZWFkYWJsZT1UcnVlLCB3cml0YWJsZT1UcnVlKS5cblxuIgotCSAgICAgIlRoZSBjb25zdHJ1Y3RvciBkb2VzICpub3QqIGR1cGxpY2F0ZSB0aGUgaGFuZGxlLiIpOworICAgICAgICAgICAgICJDb25uZWN0aW9uIHR5cGUgd2hvc2UgY29uc3RydWN0b3Igc2lnbmF0dXJlIGlzXG5cbiIKKyAgICAgICAgICAgICAiICAgIENvbm5lY3Rpb24oaGFuZGxlLCByZWFkYWJsZT1UcnVlLCB3cml0YWJsZT1UcnVlKS5cblxuIgorICAgICAgICAgICAgICJUaGUgY29uc3RydWN0b3IgZG9lcyAqbm90KiBkdXBsaWNhdGUgdGhlIGhhbmRsZS4iKTsKIAogUHlUeXBlT2JqZWN0IENPTk5FQ1RJT05fVFlQRSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkvKiB0cF9uYW1lICAgICAgICAgICAqLyAiX211bHRpcHJvY2Vzc2luZy4iIENPTk5FQ1RJT05fTkFNRSwKLQkvKiB0cF9iYXNpY3NpemUgICAgICAqLyBzaXplb2YoQ29ubmVjdGlvbk9iamVjdCksCi0JLyogdHBfaXRlbXNpemUgICAgICAgKi8gMCwKLQkvKiB0cF9kZWFsbG9jICAgICAgICAqLyAoZGVzdHJ1Y3Rvciljb25uZWN0aW9uX2RlYWxsb2MsCi0JLyogdHBfcHJpbnQgICAgICAgICAgKi8gMCwKLQkvKiB0cF9nZXRhdHRyICAgICAgICAqLyAwLAotCS8qIHRwX3NldGF0dHIgICAgICAgICovIDAsCi0JLyogdHBfY29tcGFyZSAgICAgICAgKi8gMCwKLQkvKiB0cF9yZXByICAgICAgICAgICAqLyAocmVwcmZ1bmMpY29ubmVjdGlvbl9yZXByLAotCS8qIHRwX2FzX251bWJlciAgICAgICovIDAsCi0JLyogdHBfYXNfc2VxdWVuY2UgICAgKi8gMCwKLQkvKiB0cF9hc19tYXBwaW5nICAgICAqLyAwLAotCS8qIHRwX2hhc2ggICAgICAgICAgICovIDAsCi0JLyogdHBfY2FsbCAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9zdHIgICAgICAgICAgICAqLyAwLAotCS8qIHRwX2dldGF0dHJvICAgICAgICovIDAsCi0JLyogdHBfc2V0YXR0cm8gICAgICAgKi8gMCwKLQkvKiB0cF9hc19idWZmZXIgICAgICAqLyAwLAotCS8qIHRwX2ZsYWdzICAgICAgICAgICovIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfAotCQkJCVB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywKLQkvKiB0cF9kb2MgICAgICAgICAgICAqLyBjb25uZWN0aW9uX2RvYywKLQkvKiB0cF90cmF2ZXJzZSAgICAgICAqLyAwLAotCS8qIHRwX2NsZWFyICAgICAgICAgICovIDAsCi0JLyogdHBfcmljaGNvbXBhcmUgICAgKi8gMCwKLQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLyBvZmZzZXRvZihDb25uZWN0aW9uT2JqZWN0LCB3ZWFrcmVmbGlzdCksCi0JLyogdHBfaXRlciAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9pdGVybmV4dCAgICAgICAqLyAwLAotCS8qIHRwX21ldGhvZHMgICAgICAgICovIGNvbm5lY3Rpb25fbWV0aG9kcywKLQkvKiB0cF9tZW1iZXJzICAgICAgICAqLyAwLAotCS8qIHRwX2dldHNldCAgICAgICAgICovIGNvbm5lY3Rpb25fZ2V0c2V0LAotCS8qIHRwX2Jhc2UgICAgICAgICAgICovIDAsCi0JLyogdHBfZGljdCAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9kZXNjcl9nZXQgICAgICAqLyAwLAotCS8qIHRwX2Rlc2NyX3NldCAgICAgICovIDAsCi0JLyogdHBfZGljdG9mZnNldCAgICAgKi8gMCwKLQkvKiB0cF9pbml0ICAgICAgICAgICAqLyAwLAotCS8qIHRwX2FsbG9jICAgICAgICAgICovIDAsCi0JLyogdHBfbmV3ICAgICAgICAgICAgKi8gY29ubmVjdGlvbl9uZXcsCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgLyogdHBfbmFtZSAgICAgICAgICAgKi8gIl9tdWx0aXByb2Nlc3NpbmcuIiBDT05ORUNUSU9OX05BTUUsCisgICAgLyogdHBfYmFzaWNzaXplICAgICAgKi8gc2l6ZW9mKENvbm5lY3Rpb25PYmplY3QpLAorICAgIC8qIHRwX2l0ZW1zaXplICAgICAgICovIDAsCisgICAgLyogdHBfZGVhbGxvYyAgICAgICAgKi8gKGRlc3RydWN0b3IpY29ubmVjdGlvbl9kZWFsbG9jLAorICAgIC8qIHRwX3ByaW50ICAgICAgICAgICovIDAsCisgICAgLyogdHBfZ2V0YXR0ciAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9zZXRhdHRyICAgICAgICAqLyAwLAorICAgIC8qIHRwX2NvbXBhcmUgICAgICAgICovIDAsCisgICAgLyogdHBfcmVwciAgICAgICAgICAgKi8gKHJlcHJmdW5jKWNvbm5lY3Rpb25fcmVwciwKKyAgICAvKiB0cF9hc19udW1iZXIgICAgICAqLyAwLAorICAgIC8qIHRwX2FzX3NlcXVlbmNlICAgICovIDAsCisgICAgLyogdHBfYXNfbWFwcGluZyAgICAgKi8gMCwKKyAgICAvKiB0cF9oYXNoICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2NhbGwgICAgICAgICAgICovIDAsCisgICAgLyogdHBfc3RyICAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9nZXRhdHRybyAgICAgICAqLyAwLAorICAgIC8qIHRwX3NldGF0dHJvICAgICAgICovIDAsCisgICAgLyogdHBfYXNfYnVmZmVyICAgICAgKi8gMCwKKyAgICAvKiB0cF9mbGFncyAgICAgICAgICAqLyBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsCisgICAgLyogdHBfZG9jICAgICAgICAgICAgKi8gY29ubmVjdGlvbl9kb2MsCisgICAgLyogdHBfdHJhdmVyc2UgICAgICAgKi8gMCwKKyAgICAvKiB0cF9jbGVhciAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX3JpY2hjb21wYXJlICAgICovIDAsCisgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8gb2Zmc2V0b2YoQ29ubmVjdGlvbk9iamVjdCwgd2Vha3JlZmxpc3QpLAorICAgIC8qIHRwX2l0ZXIgICAgICAgICAgICovIDAsCisgICAgLyogdHBfaXRlcm5leHQgICAgICAgKi8gMCwKKyAgICAvKiB0cF9tZXRob2RzICAgICAgICAqLyBjb25uZWN0aW9uX21ldGhvZHMsCisgICAgLyogdHBfbWVtYmVycyAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9nZXRzZXQgICAgICAgICAqLyBjb25uZWN0aW9uX2dldHNldCwKKyAgICAvKiB0cF9iYXNlICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2RpY3QgICAgICAgICAgICovIDAsCisgICAgLyogdHBfZGVzY3JfZ2V0ICAgICAgKi8gMCwKKyAgICAvKiB0cF9kZXNjcl9zZXQgICAgICAqLyAwLAorICAgIC8qIHRwX2RpY3RvZmZzZXQgICAgICovIDAsCisgICAgLyogdHBfaW5pdCAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9hbGxvYyAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX25ldyAgICAgICAgICAgICovIGNvbm5lY3Rpb25fbmV3LAogfTsKIAogI2VuZGlmIC8qIENPTk5FQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5jIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5jCmluZGV4IGU4NjcwMzAuLmZkZTdjNTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuYworKysgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMKQEAgLTksOSArOSw5IEBACiAjaW5jbHVkZSAibXVsdGlwcm9jZXNzaW5nLmgiCiAKICNpZmRlZiBTQ01fUklHSFRTCi0JI2RlZmluZSBIQVZFX0ZEX1RSQU5TRkVSIDEKKyAgICAjZGVmaW5lIEhBVkVfRkRfVFJBTlNGRVIgMQogI2Vsc2UKLQkjZGVmaW5lIEhBVkVfRkRfVFJBTlNGRVIgMAorICAgICNkZWZpbmUgSEFWRV9GRF9UUkFOU0ZFUiAwCiAjZW5kaWYKIAogUHlPYmplY3QgKmNyZWF0ZV93aW4zMl9uYW1lc3BhY2Uodm9pZCk7CkBAIC0yNiw0NiArMjYsNDYgQEAKIFB5T2JqZWN0ICoKIG1wX1NldEVycm9yKFB5T2JqZWN0ICpUeXBlLCBpbnQgbnVtKQogewotCXN3aXRjaCAobnVtKSB7CisgICAgc3dpdGNoIChudW0pIHsKICNpZmRlZiBNU19XSU5ET1dTCi0JY2FzZSBNUF9TVEFOREFSRF9FUlJPUjogCi0JCWlmIChUeXBlID09IE5VTEwpCi0JCQlUeXBlID0gUHlFeGNfV2luZG93c0Vycm9yOwotCQlQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycihUeXBlLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBNUF9TT0NLRVRfRVJST1I6Ci0JCWlmIChUeXBlID09IE5VTEwpCi0JCQlUeXBlID0gUHlFeGNfV2luZG93c0Vycm9yOwotCQlQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycihUeXBlLCBXU0FHZXRMYXN0RXJyb3IoKSk7Ci0JCWJyZWFrOworICAgIGNhc2UgTVBfU1RBTkRBUkRfRVJST1I6CisgICAgICAgIGlmIChUeXBlID09IE5VTEwpCisgICAgICAgICAgICBUeXBlID0gUHlFeGNfV2luZG93c0Vycm9yOworICAgICAgICBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycihUeXBlLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNUF9TT0NLRVRfRVJST1I6CisgICAgICAgIGlmIChUeXBlID09IE5VTEwpCisgICAgICAgICAgICBUeXBlID0gUHlFeGNfV2luZG93c0Vycm9yOworICAgICAgICBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycihUeXBlLCBXU0FHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIGJyZWFrOwogI2Vsc2UgLyogIU1TX1dJTkRPV1MgKi8KLQljYXNlIE1QX1NUQU5EQVJEX0VSUk9SOgotCWNhc2UgTVBfU09DS0VUX0VSUk9SOgotCQlpZiAoVHlwZSA9PSBOVUxMKQotCQkJVHlwZSA9IFB5RXhjX09TRXJyb3I7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhUeXBlKTsKLQkJYnJlYWs7CisgICAgY2FzZSBNUF9TVEFOREFSRF9FUlJPUjoKKyAgICBjYXNlIE1QX1NPQ0tFVF9FUlJPUjoKKyAgICAgICAgaWYgKFR5cGUgPT0gTlVMTCkKKyAgICAgICAgICAgIFR5cGUgPSBQeUV4Y19PU0Vycm9yOworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oVHlwZSk7CisgICAgICAgIGJyZWFrOwogI2VuZGlmIC8qICFNU19XSU5ET1dTICovCi0JY2FzZSBNUF9NRU1PUllfRVJST1I6Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWJyZWFrOwotCWNhc2UgTVBfRU5EX09GX0ZJTEU6Ci0JCVB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotCQlicmVhazsKLQljYXNlIE1QX0VBUkxZX0VORF9PRl9GSUxFOgotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKLQkJCQkiZ290IGVuZCBvZiBmaWxlIGR1cmluZyBtZXNzYWdlIik7Ci0JCWJyZWFrOwotCWNhc2UgTVBfQkFEX01FU1NBR0VfTEVOR1RIOgotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImJhZCBtZXNzYWdlIGxlbmd0aCIpOwotCQlicmVhazsKLQljYXNlIE1QX0VYQ0VQVElPTl9IQVNfQkVFTl9TRVQ6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAgICJ1bmtvd24gZXJyb3IgbnVtYmVyICVkIiwgbnVtKTsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgY2FzZSBNUF9NRU1PUllfRVJST1I6CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVBfRU5EX09GX0ZJTEU6CisgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1QX0VBUkxZX0VORF9PRl9GSUxFOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJnb3QgZW5kIG9mIGZpbGUgZHVyaW5nIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNUF9CQURfTUVTU0FHRV9MRU5HVEg6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiYmFkIG1lc3NhZ2UgbGVuZ3RoIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVDoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ1bmtvd24gZXJyb3IgbnVtYmVyICVkIiwgbnVtKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtODIsOCArODIsOCBAQAogc3RhdGljIEJPT0wgV0lOQVBJCiBQcm9jZXNzaW5nQ3RybEhhbmRsZXIoRFdPUkQgZHdDdHJsVHlwZSkKIHsKLQlTZXRFdmVudChzaWdpbnRfZXZlbnQpOwotCXJldHVybiBGQUxTRTsKKyAgICBTZXRFdmVudChzaWdpbnRfZXZlbnQpOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogLyoKQEAgLTEwMSw3MiArMTAxLDcyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbXVsdGlwcm9jZXNzaW5nX3NlbmRmZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGNvbm4sIGZkLCByZXM7Ci0JY2hhciBkdW1teV9jaGFyOwotCWNoYXIgYnVmW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkpXTsKLQlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHswfTsKLQlzdHJ1Y3QgaW92ZWMgZHVtbXlfaW92OwotCXN0cnVjdCBjbXNnaGRyICpjbXNnOworICAgIGludCBjb25uLCBmZCwgcmVzOworICAgIGNoYXIgZHVtbXlfY2hhcjsKKyAgICBjaGFyIGJ1ZltDTVNHX1NQQUNFKHNpemVvZihpbnQpKV07CisgICAgc3RydWN0IG1zZ2hkciBtc2cgPSB7MH07CisgICAgc3RydWN0IGlvdmVjIGR1bW15X2lvdjsKKyAgICBzdHJ1Y3QgY21zZ2hkciAqY21zZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWkiLCAmY29ubiwgJmZkKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaSIsICZjb25uLCAmZmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWR1bW15X2lvdi5pb3ZfYmFzZSA9ICZkdW1teV9jaGFyOwotCWR1bW15X2lvdi5pb3ZfbGVuID0gMTsKLQltc2cubXNnX2NvbnRyb2wgPSBidWY7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGJ1Zik7Ci0JbXNnLm1zZ19pb3YgPSAmZHVtbXlfaW92OwotCW1zZy5tc2dfaW92bGVuID0gMTsKLQljbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKLQljbXNnLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKLQljbXNnLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOwotCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKGludCkpOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOwotCSooaW50KilDTVNHX0RBVEEoY21zZykgPSBmZDsKKyAgICBkdW1teV9pb3YuaW92X2Jhc2UgPSAmZHVtbXlfY2hhcjsKKyAgICBkdW1teV9pb3YuaW92X2xlbiA9IDE7CisgICAgbXNnLm1zZ19jb250cm9sID0gYnVmOworICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihidWYpOworICAgIG1zZy5tc2dfaW92ID0gJmR1bW15X2lvdjsKKyAgICBtc2cubXNnX2lvdmxlbiA9IDE7CisgICAgY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZyk7CisgICAgY21zZy0+Y21zZ19sZXZlbCA9IFNPTF9TT0NLRVQ7CisgICAgY21zZy0+Y21zZ190eXBlID0gU0NNX1JJR0hUUzsKKyAgICBjbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihpbnQpKTsKKyAgICBtc2cubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKyAgICAqKGludCopQ01TR19EQVRBKGNtc2cpID0gZmQ7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gc2VuZG1zZyhjb25uLCAmbXNnLCAwKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXMgPSBzZW5kbXNnKGNvbm4sICZtc2csIDApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG11bHRpcHJvY2Vzc2luZ19yZWN2ZmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBjb25uLCBmZCwgcmVzOwotCWNoYXIgZHVtbXlfY2hhcjsKLQljaGFyIGJ1ZltDTVNHX1NQQUNFKHNpemVvZihpbnQpKV07Ci0Jc3RydWN0IG1zZ2hkciBtc2cgPSB7MH07Ci0Jc3RydWN0IGlvdmVjIGR1bW15X2lvdjsKLQlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKyAgICBpbnQgY29ubiwgZmQsIHJlczsKKyAgICBjaGFyIGR1bW15X2NoYXI7CisgICAgY2hhciBidWZbQ01TR19TUEFDRShzaXplb2YoaW50KSldOworICAgIHN0cnVjdCBtc2doZHIgbXNnID0gezB9OworICAgIHN0cnVjdCBpb3ZlYyBkdW1teV9pb3Y7CisgICAgc3RydWN0IGNtc2doZHIgKmNtc2c7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmY29ubikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZjb25uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlkdW1teV9pb3YuaW92X2Jhc2UgPSAmZHVtbXlfY2hhcjsKLQlkdW1teV9pb3YuaW92X2xlbiA9IDE7Ci0JbXNnLm1zZ19jb250cm9sID0gYnVmOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihidWYpOwotCW1zZy5tc2dfaW92ID0gJmR1bW15X2lvdjsKLQltc2cubXNnX2lvdmxlbiA9IDE7Ci0JY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZyk7Ci0JY21zZy0+Y21zZ19sZXZlbCA9IFNPTF9TT0NLRVQ7Ci0JY21zZy0+Y21zZ190eXBlID0gU0NNX1JJR0hUUzsKLQljbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihpbnQpKTsKLQltc2cubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKyAgICBkdW1teV9pb3YuaW92X2Jhc2UgPSAmZHVtbXlfY2hhcjsKKyAgICBkdW1teV9pb3YuaW92X2xlbiA9IDE7CisgICAgbXNnLm1zZ19jb250cm9sID0gYnVmOworICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihidWYpOworICAgIG1zZy5tc2dfaW92ID0gJmR1bW15X2lvdjsKKyAgICBtc2cubXNnX2lvdmxlbiA9IDE7CisgICAgY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZyk7CisgICAgY21zZy0+Y21zZ19sZXZlbCA9IFNPTF9TT0NLRVQ7CisgICAgY21zZy0+Y21zZ190eXBlID0gU0NNX1JJR0hUUzsKKyAgICBjbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihpbnQpKTsKKyAgICBtc2cubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSByZWN2bXNnKGNvbm4sICZtc2csIDApOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlcyA9IHJlY3Ztc2coY29ubiwgJm1zZywgMCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwogCi0JZmQgPSAqKGludCopQ01TR19EQVRBKGNtc2cpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgZmQpOworICAgIGZkID0gKihpbnQqKUNNU0dfREFUQShjbXNnKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGZkKTsKIH0KIAogI2VuZGlmIC8qIEhBVkVfRkRfVFJBTlNGRVIgKi8KQEAgLTE4MSwxNCArMTgxLDE0IEBACiBzdGF0aWMgUHlPYmplY3QqCiBtdWx0aXByb2Nlc3NpbmdfYWRkcmVzc19vZl9idWZmZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCiB7Ci0Jdm9pZCAqYnVmZmVyOwotCVB5X3NzaXplX3QgYnVmZmVyX2xlbjsKKyAgICB2b2lkICpidWZmZXI7CisgICAgUHlfc3NpemVfdCBidWZmZXJfbGVuOwogCi0JaWYgKFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIob2JqLCAmYnVmZmVyLCAmYnVmZmVyX2xlbikgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihvYmosICZidWZmZXIsICZidWZmZXJfbGVuKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk4iIEZfUFlfU1NJWkVfVCwgCi0JCQkgICAgIFB5TG9uZ19Gcm9tVm9pZFB0cihidWZmZXIpLCBidWZmZXJfbGVuKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTiIgRl9QWV9TU0laRV9ULAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tVm9pZFB0cihidWZmZXIpLCBidWZmZXJfbGVuKTsKIH0KIAogCkBAIC0xOTcsMjAgKzE5NywyMCBAQAogICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewotCXsiYWRkcmVzc19vZl9idWZmZXIiLCBtdWx0aXByb2Nlc3NpbmdfYWRkcmVzc19vZl9idWZmZXIsIE1FVEhfTywgCi0JICJhZGRyZXNzX29mX2J1ZmZlcihvYmopIC0+IGludFxuIiAKLQkgIlJldHVybiBhZGRyZXNzIG9mIG9iaiBhc3N1bWluZyBvYmogc3VwcG9ydHMgYnVmZmVyIGludGVmYWNlIn0sCisgICAgeyJhZGRyZXNzX29mX2J1ZmZlciIsIG11bHRpcHJvY2Vzc2luZ19hZGRyZXNzX29mX2J1ZmZlciwgTUVUSF9PLAorICAgICAiYWRkcmVzc19vZl9idWZmZXIob2JqKSAtPiBpbnRcbiIKKyAgICAgIlJldHVybiBhZGRyZXNzIG9mIG9iaiBhc3N1bWluZyBvYmogc3VwcG9ydHMgYnVmZmVyIGludGVmYWNlIn0sCiAjaWYgSEFWRV9GRF9UUkFOU0ZFUgotCXsic2VuZGZkIiwgbXVsdGlwcm9jZXNzaW5nX3NlbmRmZCwgTUVUSF9WQVJBUkdTLCAKLQkgInNlbmRmZChzb2NrZmQsIGZkKSAtPiBOb25lXG4iCi0JICJTZW5kIGZpbGUgZGVzY3JpcHRvciBnaXZlbiBieSBmZCBvdmVyIHRoZSB1bml4IGRvbWFpbiBzb2NrZXRcbiIKLQkgIndob3NlIGZpbGUgZGVjcmlwdG9yIGlzIHNvY2tmZCJ9LAotCXsicmVjdmZkIiwgbXVsdGlwcm9jZXNzaW5nX3JlY3ZmZCwgTUVUSF9WQVJBUkdTLAotCSAicmVjdmZkKHNvY2tmZCkgLT4gZmRcbiIKLQkgIlJlY2VpdmUgYSBmaWxlIGRlc2NyaXB0b3Igb3ZlciBhIHVuaXggZG9tYWluIHNvY2tldFxuIgotCSAid2hvc2UgZmlsZSBkZWNyaXB0b3IgaXMgc29ja2ZkIn0sCisgICAgeyJzZW5kZmQiLCBtdWx0aXByb2Nlc3Npbmdfc2VuZGZkLCBNRVRIX1ZBUkFSR1MsCisgICAgICJzZW5kZmQoc29ja2ZkLCBmZCkgLT4gTm9uZVxuIgorICAgICAiU2VuZCBmaWxlIGRlc2NyaXB0b3IgZ2l2ZW4gYnkgZmQgb3ZlciB0aGUgdW5peCBkb21haW4gc29ja2V0XG4iCisgICAgICJ3aG9zZSBmaWxlIGRlY3JpcHRvciBpcyBzb2NrZmQifSwKKyAgICB7InJlY3ZmZCIsIG11bHRpcHJvY2Vzc2luZ19yZWN2ZmQsIE1FVEhfVkFSQVJHUywKKyAgICAgInJlY3ZmZChzb2NrZmQpIC0+IGZkXG4iCisgICAgICJSZWNlaXZlIGEgZmlsZSBkZXNjcmlwdG9yIG92ZXIgYSB1bml4IGRvbWFpbiBzb2NrZXRcbiIKKyAgICAgIndob3NlIGZpbGUgZGVjcmlwdG9yIGlzIHNvY2tmZCJ9LAogI2VuZGlmCi0Je05VTEx9CisgICAge05VTEx9CiB9OwogCiAKQEAgLTIyMSw5OCArMjIxLDk4IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdF9tdWx0aXByb2Nlc3Npbmcodm9pZCkKIHsKLQlQeU9iamVjdCAqbW9kdWxlLCAqdGVtcCwgKnZhbHVlOworICAgIFB5T2JqZWN0ICptb2R1bGUsICp0ZW1wLCAqdmFsdWU7CiAKLQkvKiBJbml0aWFsaXplIG1vZHVsZSAqLwotCW1vZHVsZSA9IFB5X0luaXRNb2R1bGUoIl9tdWx0aXByb2Nlc3NpbmciLCBtb2R1bGVfbWV0aG9kcyk7Ci0JaWYgKCFtb2R1bGUpCi0JCXJldHVybjsKKyAgICAvKiBJbml0aWFsaXplIG1vZHVsZSAqLworICAgIG1vZHVsZSA9IFB5X0luaXRNb2R1bGUoIl9tdWx0aXByb2Nlc3NpbmciLCBtb2R1bGVfbWV0aG9kcyk7CisgICAgaWYgKCFtb2R1bGUpCisgICAgICAgIHJldHVybjsKIAotCS8qIEdldCBjb3B5IG9mIG9iamVjdHMgZnJvbSBwaWNrbGUgKi8KLQl0ZW1wID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKFBJQ0tMRV9NT0RVTEUpOwotCWlmICghdGVtcCkKLQkJcmV0dXJuOwotCXBpY2tsZV9kdW1wcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodGVtcCwgImR1bXBzIik7Ci0JcGlja2xlX2xvYWRzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0ZW1wLCAibG9hZHMiKTsKLQlwaWNrbGVfcHJvdG9jb2wgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRlbXAsICJISUdIRVNUX1BST1RPQ09MIik7Ci0JUHlfWERFQ1JFRih0ZW1wKTsKKyAgICAvKiBHZXQgY29weSBvZiBvYmplY3RzIGZyb20gcGlja2xlICovCisgICAgdGVtcCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZShQSUNLTEVfTU9EVUxFKTsKKyAgICBpZiAoIXRlbXApCisgICAgICAgIHJldHVybjsKKyAgICBwaWNrbGVfZHVtcHMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRlbXAsICJkdW1wcyIpOworICAgIHBpY2tsZV9sb2FkcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodGVtcCwgImxvYWRzIik7CisgICAgcGlja2xlX3Byb3RvY29sID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0ZW1wLCAiSElHSEVTVF9QUk9UT0NPTCIpOworICAgIFB5X1hERUNSRUYodGVtcCk7CiAKLQkvKiBHZXQgY29weSBvZiBCdWZmZXJUb29TaG9ydCAqLwotCXRlbXAgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoIm11bHRpcHJvY2Vzc2luZyIpOwotCWlmICghdGVtcCkKLQkJcmV0dXJuOwotCUJ1ZmZlclRvb1Nob3J0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0ZW1wLCAiQnVmZmVyVG9vU2hvcnQiKTsKLQlQeV9YREVDUkVGKHRlbXApOworICAgIC8qIEdldCBjb3B5IG9mIEJ1ZmZlclRvb1Nob3J0ICovCisgICAgdGVtcCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgibXVsdGlwcm9jZXNzaW5nIik7CisgICAgaWYgKCF0ZW1wKQorICAgICAgICByZXR1cm47CisgICAgQnVmZmVyVG9vU2hvcnQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRlbXAsICJCdWZmZXJUb29TaG9ydCIpOworICAgIFB5X1hERUNSRUYodGVtcCk7CiAKLQkvKiBBZGQgY29ubmVjdGlvbiB0eXBlIHRvIG1vZHVsZSAqLwotCWlmIChQeVR5cGVfUmVhZHkoJkNvbm5lY3Rpb25UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJkNvbm5lY3Rpb25UeXBlKTsJCi0JUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkNvbm5lY3Rpb24iLCAoUHlPYmplY3QqKSZDb25uZWN0aW9uVHlwZSk7CisgICAgLyogQWRkIGNvbm5lY3Rpb24gdHlwZSB0byBtb2R1bGUgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDb25uZWN0aW9uVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDb25uZWN0aW9uVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkNvbm5lY3Rpb24iLCAoUHlPYmplY3QqKSZDb25uZWN0aW9uVHlwZSk7CiAKLSNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpIHx8CQkJCQkJXAorI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAoZGVmaW5lZChIQVZFX1NFTV9PUEVOKSAmJiAhZGVmaW5lZChQT1NJWF9TRU1BUEhPUkVTX05PVF9FTkFCTEVEKSkKLQkvKiBBZGQgU2VtTG9jayB0eXBlIHRvIG1vZHVsZSAqLwotCWlmIChQeVR5cGVfUmVhZHkoJlNlbUxvY2tUeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJlNlbUxvY2tUeXBlKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhTZW1Mb2NrVHlwZS50cF9kaWN0LCAiU0VNX1ZBTFVFX01BWCIsIAotCQkJICAgICBQeV9CdWlsZFZhbHVlKCJpIiwgU0VNX1ZBTFVFX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJTZW1Mb2NrIiwgKFB5T2JqZWN0KikmU2VtTG9ja1R5cGUpOyAgIAorICAgIC8qIEFkZCBTZW1Mb2NrIHR5cGUgdG8gbW9kdWxlICovCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmU2VtTG9ja1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmU2VtTG9ja1R5cGUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKFNlbUxvY2tUeXBlLnRwX2RpY3QsICJTRU1fVkFMVUVfTUFYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJpIiwgU0VNX1ZBTFVFX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJTZW1Mb2NrIiwgKFB5T2JqZWN0KikmU2VtTG9ja1R5cGUpOwogI2VuZGlmCiAKICNpZmRlZiBNU19XSU5ET1dTCi0JLyogQWRkIFBpcGVDb25uZWN0aW9uIHRvIG1vZHVsZSAqLwotCWlmIChQeVR5cGVfUmVhZHkoJlBpcGVDb25uZWN0aW9uVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKCZQaXBlQ29ubmVjdGlvblR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJQaXBlQ29ubmVjdGlvbiIsCi0JCQkgICAoUHlPYmplY3QqKSZQaXBlQ29ubmVjdGlvblR5cGUpOworICAgIC8qIEFkZCBQaXBlQ29ubmVjdGlvbiB0byBtb2R1bGUgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQaXBlQ29ubmVjdGlvblR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmUGlwZUNvbm5lY3Rpb25UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiUGlwZUNvbm5lY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QqKSZQaXBlQ29ubmVjdGlvblR5cGUpOwogCi0JLyogSW5pdGlhbGl6ZSB3aW4zMiBjbGFzcyBhbmQgYWRkIHRvIG11bHRpcHJvY2Vzc2luZyAqLwotCXRlbXAgPSBjcmVhdGVfd2luMzJfbmFtZXNwYWNlKCk7Ci0JaWYgKCF0ZW1wKQotCQlyZXR1cm47Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIndpbjMyIiwgdGVtcCk7CisgICAgLyogSW5pdGlhbGl6ZSB3aW4zMiBjbGFzcyBhbmQgYWRkIHRvIG11bHRpcHJvY2Vzc2luZyAqLworICAgIHRlbXAgPSBjcmVhdGVfd2luMzJfbmFtZXNwYWNlKCk7CisgICAgaWYgKCF0ZW1wKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIndpbjMyIiwgdGVtcCk7CiAKLQkvKiBJbml0aWFsaXplIHRoZSBldmVudCBoYW5kbGUgdXNlZCB0byBzaWduYWwgQ3RybC1DICovCi0Jc2lnaW50X2V2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOwotCWlmICghc2lnaW50X2V2ZW50KSB7Ci0JCVB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwotCQlyZXR1cm47Ci0JfQotCWlmICghU2V0Q29uc29sZUN0cmxIYW5kbGVyKFByb2Nlc3NpbmdDdHJsSGFuZGxlciwgVFJVRSkpIHsKLQkJUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7Ci0JCXJldHVybjsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZXZlbnQgaGFuZGxlIHVzZWQgdG8gc2lnbmFsIEN0cmwtQyAqLworICAgIHNpZ2ludF9ldmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKKyAgICBpZiAoIXNpZ2ludF9ldmVudCkgeworICAgICAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIVNldENvbnNvbGVDdHJsSGFuZGxlcihQcm9jZXNzaW5nQ3RybEhhbmRsZXIsIFRSVUUpKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgICAgICByZXR1cm47CisgICAgfQogI2VuZGlmCiAKLQkvKiBBZGQgY29uZmlndXJhdGlvbiBtYWNyb3MgKi8KLQl0ZW1wID0gUHlEaWN0X05ldygpOwotCWlmICghdGVtcCkKLQkJcmV0dXJuOwotI2RlZmluZSBBRERfRkxBRyhuYW1lKQkJCQkJCSAgXAotCXZhbHVlID0gUHlfQnVpbGRWYWx1ZSgiaSIsIG5hbWUpOwkJCSAgXAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7IFB5X0RFQ1JFRih0ZW1wKTsgcmV0dXJuOyB9CQkgIFwKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcodGVtcCwgI25hbWUsIHZhbHVlKSA8IDApIHsJICBcCi0JCVB5X0RFQ1JFRih0ZW1wKTsgUHlfREVDUkVGKHZhbHVlKTsgcmV0dXJuOyB9CSAgXAotCVB5X0RFQ1JFRih2YWx1ZSkKLQkKKyAgICAvKiBBZGQgY29uZmlndXJhdGlvbiBtYWNyb3MgKi8KKyAgICB0ZW1wID0gUHlEaWN0X05ldygpOworICAgIGlmICghdGVtcCkKKyAgICAgICAgcmV0dXJuOworI2RlZmluZSBBRERfRkxBRyhuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlID0gUHlfQnVpbGRWYWx1ZSgiaSIsIG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7IFB5X0RFQ1JFRih0ZW1wKTsgcmV0dXJuOyB9ICAgICAgICAgICAgICAgXAorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0ZW1wLCAjbmFtZSwgdmFsdWUpIDwgMCkgeyAgICAgICAgICAgXAorICAgICAgICBQeV9ERUNSRUYodGVtcCk7IFB5X0RFQ1JFRih2YWx1ZSk7IHJldHVybjsgfSAgICAgICAgICAgICAgXAorICAgIFB5X0RFQ1JFRih2YWx1ZSkKKwogI2lmIGRlZmluZWQoSEFWRV9TRU1fT1BFTikgJiYgIWRlZmluZWQoUE9TSVhfU0VNQVBIT1JFU19OT1RfRU5BQkxFRCkKLQlBRERfRkxBRyhIQVZFX1NFTV9PUEVOKTsKKyAgICBBRERfRkxBRyhIQVZFX1NFTV9PUEVOKTsKICNlbmRpZgogI2lmZGVmIEhBVkVfU0VNX1RJTUVEV0FJVAotCUFERF9GTEFHKEhBVkVfU0VNX1RJTUVEV0FJVCk7CisgICAgQUREX0ZMQUcoSEFWRV9TRU1fVElNRURXQUlUKTsKICNlbmRpZgogI2lmZGVmIEhBVkVfRkRfVFJBTlNGRVIKLQlBRERfRkxBRyhIQVZFX0ZEX1RSQU5TRkVSKTsKKyAgICBBRERfRkxBRyhIQVZFX0ZEX1RSQU5TRkVSKTsKICNlbmRpZgogI2lmZGVmIEhBVkVfQlJPS0VOX1NFTV9HRVRWQUxVRQotCUFERF9GTEFHKEhBVkVfQlJPS0VOX1NFTV9HRVRWQUxVRSk7CisgICAgQUREX0ZMQUcoSEFWRV9CUk9LRU5fU0VNX0dFVFZBTFVFKTsKICNlbmRpZgogI2lmZGVmIEhBVkVfQlJPS0VOX1NFTV9VTkxJTksKLQlBRERfRkxBRyhIQVZFX0JST0tFTl9TRU1fVU5MSU5LKTsKKyAgICBBRERfRkxBRyhIQVZFX0JST0tFTl9TRU1fVU5MSU5LKTsKICNlbmRpZgotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiZmxhZ3MiLCB0ZW1wKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgImZsYWdzIiwgdGVtcCkgPCAwKQorICAgICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmggYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmgKaW5kZXggM2RkMDE5OS4uYzE0OTYzNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5oCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuaApAQCAtMTUsNyArMTUsNyBAQAogIyAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KICMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KICMgIGluY2x1ZGUgPHdpbnNvY2syLmg+Ci0jICBpbmNsdWRlIDxwcm9jZXNzLmg+CQkgICAgIC8qIGdldHBpZCgpICovCisjICBpbmNsdWRlIDxwcm9jZXNzLmg+ICAgICAgICAgICAgICAgLyogZ2V0cGlkKCkgKi8KICMgIGlmZGVmIFB5X0RFQlVHCiAjICAgIGluY2x1ZGUgPGNydGRiZy5oPgogIyAgZW5kaWYKQEAgLTQ1LDE1ICs0NSwxNSBAQAogICogSXNzdWUgMzExMCAtIFNvbGFyaXMgZG9lcyBub3QgZGVmaW5lIFNFTV9WQUxVRV9NQVgKICAqLwogI2lmbmRlZiBTRU1fVkFMVUVfTUFYCi0JI2lmIGRlZmluZWQoSEFWRV9TWVNDT05GKSAmJiBkZWZpbmVkKF9TQ19TRU1fVkFMVUVfTUFYKQotCQkjIGRlZmluZSBTRU1fVkFMVUVfTUFYIHN5c2NvbmYoX1NDX1NFTV9WQUxVRV9NQVgpCi0JI2VsaWYgZGVmaW5lZChfU0VNX1ZBTFVFX01BWCkKLQkJIyBkZWZpbmUgU0VNX1ZBTFVFX01BWCBfU0VNX1ZBTFVFX01BWAotCSNlbGlmIGRlZmluZWQoX1BPU0lYX1NFTV9WQUxVRV9NQVgpCi0JCSMgZGVmaW5lIFNFTV9WQUxVRV9NQVggX1BPU0lYX1NFTV9WQUxVRV9NQVgKLQkjZWxzZQotCQkjIGRlZmluZSBTRU1fVkFMVUVfTUFYIElOVF9NQVgKLQkjZW5kaWYKKyAgICAjaWYgZGVmaW5lZChIQVZFX1NZU0NPTkYpICYmIGRlZmluZWQoX1NDX1NFTV9WQUxVRV9NQVgpCisgICAgICAgICMgZGVmaW5lIFNFTV9WQUxVRV9NQVggc3lzY29uZihfU0NfU0VNX1ZBTFVFX01BWCkKKyAgICAjZWxpZiBkZWZpbmVkKF9TRU1fVkFMVUVfTUFYKQorICAgICAgICAjIGRlZmluZSBTRU1fVkFMVUVfTUFYIF9TRU1fVkFMVUVfTUFYCisgICAgI2VsaWYgZGVmaW5lZChfUE9TSVhfU0VNX1ZBTFVFX01BWCkKKyAgICAgICAgIyBkZWZpbmUgU0VNX1ZBTFVFX01BWCBfUE9TSVhfU0VNX1ZBTFVFX01BWAorICAgICNlbHNlCisgICAgICAgICMgZGVmaW5lIFNFTV9WQUxVRV9NQVggSU5UX01BWAorICAgICNlbmRpZgogI2VuZGlmCiAKIApAQCAtMTYyLDExICsxNjIsMTEgQEAKICNkZWZpbmUgQ09OTkVDVElPTl9CVUZGRVJfU0laRSAxMDI0CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JSEFORExFIGhhbmRsZTsKLQlpbnQgZmxhZ3M7Ci0JUHlPYmplY3QgKndlYWtyZWZsaXN0OwotCWNoYXIgYnVmZmVyW0NPTk5FQ1RJT05fQlVGRkVSX1NJWkVdOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBIQU5ETEUgaGFuZGxlOworICAgIGludCBmbGFnczsKKyAgICBQeU9iamVjdCAqd2Vha3JlZmxpc3Q7CisgICAgY2hhciBidWZmZXJbQ09OTkVDVElPTl9CVUZGRVJfU0laRV07CiB9IENvbm5lY3Rpb25PYmplY3Q7CiAKIC8qCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvcGlwZV9jb25uZWN0aW9uLmMgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvcGlwZV9jb25uZWN0aW9uLmMKaW5kZXggOTgwZjc2MC4uMDVkZGUwYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3BpcGVfY29ubmVjdGlvbi5jCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9waXBlX2Nvbm5lY3Rpb24uYwpAQCAtMTcsMTkgKzE3LDE5IEBACiBzdGF0aWMgUHlfc3NpemVfdAogY29ubl9zZW5kX3N0cmluZyhDb25uZWN0aW9uT2JqZWN0ICpjb25uLCBjaGFyICpzdHJpbmcsIHNpemVfdCBsZW5ndGgpCiB7Ci0JRFdPUkQgYW1vdW50X3dyaXR0ZW47Ci0JQk9PTCByZXQ7CisgICAgRFdPUkQgYW1vdW50X3dyaXR0ZW47CisgICAgQk9PTCByZXQ7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmV0ID0gV3JpdGVGaWxlKGNvbm4tPmhhbmRsZSwgc3RyaW5nLCBsZW5ndGgsICZhbW91bnRfd3JpdHRlbiwgTlVMTCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmV0ID0gV3JpdGVGaWxlKGNvbm4tPmhhbmRsZSwgc3RyaW5nLCBsZW5ndGgsICZhbW91bnRfd3JpdHRlbiwgTlVMTCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChyZXQgPT0gMCAmJiBHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9OT19TWVNURU1fUkVTT1VSQ0VTKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiQ2Fubm5vdCBzZW5kICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgYnl0ZXMgb3ZlciBjb25uZWN0aW9uIiwgbGVuZ3RoKTsKLQkJcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwotCX0KKyAgICBpZiAocmV0ID09IDAgJiYgR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfTk9fU1lTVEVNX1JFU09VUkNFUykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIkNhbm5ub3Qgc2VuZCAlIiBQWV9GT1JNQVRfU0laRV9UICJkIGJ5dGVzIG92ZXIgY29ubmVjdGlvbiIsIGxlbmd0aCk7CisgICAgICAgIHJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKKyAgICB9CiAKLQlyZXR1cm4gcmV0ID8gTVBfU1VDQ0VTUyA6IE1QX1NUQU5EQVJEX0VSUk9SOworICAgIHJldHVybiByZXQgPyBNUF9TVUNDRVNTIDogTVBfU1RBTkRBUkRfRVJST1I7CiB9CiAKIC8qCkBAIC00MCw0OSArNDAsNDkgQEAKIAogc3RhdGljIFB5X3NzaXplX3QKIGNvbm5fcmVjdl9zdHJpbmcoQ29ubmVjdGlvbk9iamVjdCAqY29ubiwgY2hhciAqYnVmZmVyLAotCQkgc2l6ZV90IGJ1Zmxlbmd0aCwgY2hhciAqKm5ld2J1ZmZlciwgc2l6ZV90IG1heGxlbmd0aCkKKyAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1Zmxlbmd0aCwgY2hhciAqKm5ld2J1ZmZlciwgc2l6ZV90IG1heGxlbmd0aCkKIHsKLQlEV09SRCBsZWZ0LCBsZW5ndGgsIGZ1bGxfbGVuZ3RoLCBlcnI7Ci0JQk9PTCByZXQ7Ci0JKm5ld2J1ZmZlciA9IE5VTEw7CisgICAgRFdPUkQgbGVmdCwgbGVuZ3RoLCBmdWxsX2xlbmd0aCwgZXJyOworICAgIEJPT0wgcmV0OworICAgICpuZXdidWZmZXIgPSBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJldCA9IFJlYWRGaWxlKGNvbm4tPmhhbmRsZSwgYnVmZmVyLCBNSU4oYnVmbGVuZ3RoLCBtYXhsZW5ndGgpLCAKLQkJICAgICAgJmxlbmd0aCwgTlVMTCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmV0KQotCQlyZXR1cm4gbGVuZ3RoOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXQgPSBSZWFkRmlsZShjb25uLT5oYW5kbGUsIGJ1ZmZlciwgTUlOKGJ1Zmxlbmd0aCwgbWF4bGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICZsZW5ndGgsIE5VTEwpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIGxlbmd0aDsKIAotCWVyciA9IEdldExhc3RFcnJvcigpOwotCWlmIChlcnIgIT0gRVJST1JfTU9SRV9EQVRBKSB7Ci0JCWlmIChlcnIgPT0gRVJST1JfQlJPS0VOX1BJUEUpCi0JCQlyZXR1cm4gTVBfRU5EX09GX0ZJTEU7Ci0JCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKLQl9CisgICAgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgaWYgKGVyciAhPSBFUlJPUl9NT1JFX0RBVEEpIHsKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9CUk9LRU5fUElQRSkKKyAgICAgICAgICAgIHJldHVybiBNUF9FTkRfT0ZfRklMRTsKKyAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOworICAgIH0KIAotCWlmICghUGVla05hbWVkUGlwZShjb25uLT5oYW5kbGUsIE5VTEwsIDAsIE5VTEwsIE5VTEwsICZsZWZ0KSkKLQkJcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOworICAgIGlmICghUGVla05hbWVkUGlwZShjb25uLT5oYW5kbGUsIE5VTEwsIDAsIE5VTEwsIE5VTEwsICZsZWZ0KSkKKyAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwogCi0JZnVsbF9sZW5ndGggPSBsZW5ndGggKyBsZWZ0OwotCWlmIChmdWxsX2xlbmd0aCA+IG1heGxlbmd0aCkKLQkJcmV0dXJuIE1QX0JBRF9NRVNTQUdFX0xFTkdUSDsKKyAgICBmdWxsX2xlbmd0aCA9IGxlbmd0aCArIGxlZnQ7CisgICAgaWYgKGZ1bGxfbGVuZ3RoID4gbWF4bGVuZ3RoKQorICAgICAgICByZXR1cm4gTVBfQkFEX01FU1NBR0VfTEVOR1RIOwogCi0JKm5ld2J1ZmZlciA9IFB5TWVtX01hbGxvYyhmdWxsX2xlbmd0aCk7Ci0JaWYgKCpuZXdidWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIE1QX01FTU9SWV9FUlJPUjsKKyAgICAqbmV3YnVmZmVyID0gUHlNZW1fTWFsbG9jKGZ1bGxfbGVuZ3RoKTsKKyAgICBpZiAoKm5ld2J1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTVBfTUVNT1JZX0VSUk9SOwogCi0JbWVtY3B5KCpuZXdidWZmZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICBtZW1jcHkoKm5ld2J1ZmZlciwgYnVmZmVyLCBsZW5ndGgpOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJldCA9IFJlYWRGaWxlKGNvbm4tPmhhbmRsZSwgKm5ld2J1ZmZlcitsZW5ndGgsIGxlZnQsICZsZW5ndGgsIE5VTEwpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJldCkgewotCQlhc3NlcnQobGVuZ3RoID09IGxlZnQpOwotCQlyZXR1cm4gZnVsbF9sZW5ndGg7Ci0JfSBlbHNlIHsKLQkJUHlNZW1fRnJlZSgqbmV3YnVmZmVyKTsKLQkJcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwotCX0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmV0ID0gUmVhZEZpbGUoY29ubi0+aGFuZGxlLCAqbmV3YnVmZmVyK2xlbmd0aCwgbGVmdCwgJmxlbmd0aCwgTlVMTCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGFzc2VydChsZW5ndGggPT0gbGVmdCk7CisgICAgICAgIHJldHVybiBmdWxsX2xlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgICBQeU1lbV9GcmVlKCpuZXdidWZmZXIpOworICAgICAgICByZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgfQogfQogCiAvKgpAQCAtOTIsNTEgKzkyLDUxIEBACiBzdGF0aWMgaW50CiBjb25uX3BvbGwoQ29ubmVjdGlvbk9iamVjdCAqY29ubiwgZG91YmxlIHRpbWVvdXQsIFB5VGhyZWFkU3RhdGUgKl9zYXZlKQogewotCURXT1JEIGJ5dGVzLCBkZWFkbGluZSwgZGVsYXk7Ci0JaW50IGRpZmZlcmVuY2UsIHJlczsKLQlCT09MIGJsb2NrID0gRkFMU0U7CisgICAgRFdPUkQgYnl0ZXMsIGRlYWRsaW5lLCBkZWxheTsKKyAgICBpbnQgZGlmZmVyZW5jZSwgcmVzOworICAgIEJPT0wgYmxvY2sgPSBGQUxTRTsKIAotCWlmICghUGVla05hbWVkUGlwZShjb25uLT5oYW5kbGUsIE5VTEwsIDAsIE5VTEwsICZieXRlcywgTlVMTCkpCi0JCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKKyAgICBpZiAoIVBlZWtOYW1lZFBpcGUoY29ubi0+aGFuZGxlLCBOVUxMLCAwLCBOVUxMLCAmYnl0ZXMsIE5VTEwpKQorICAgICAgICByZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CiAKLQlpZiAodGltZW91dCA9PSAwLjApCi0JCXJldHVybiBieXRlcyA+IDA7CisgICAgaWYgKHRpbWVvdXQgPT0gMC4wKQorICAgICAgICByZXR1cm4gYnl0ZXMgPiAwOwogCi0JaWYgKHRpbWVvdXQgPCAwLjApCi0JCWJsb2NrID0gVFJVRTsKLQllbHNlCi0JCS8qIFhYWCBkb2VzIG5vdCBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQkJZGVhZGxpbmUgPSBHZXRUaWNrQ291bnQoKSArIChEV09SRCkoMTAwMCAqIHRpbWVvdXQgKyAwLjUpOworICAgIGlmICh0aW1lb3V0IDwgMC4wKQorICAgICAgICBibG9jayA9IFRSVUU7CisgICAgZWxzZQorICAgICAgICAvKiBYWFggZG9lcyBub3QgY2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgICAgIGRlYWRsaW5lID0gR2V0VGlja0NvdW50KCkgKyAoRFdPUkQpKDEwMDAgKiB0aW1lb3V0ICsgMC41KTsKIAotCVNsZWVwKDApOworICAgIFNsZWVwKDApOwogCi0JZm9yIChkZWxheSA9IDEgOyA7IGRlbGF5ICs9IDEpIHsKLQkJaWYgKCFQZWVrTmFtZWRQaXBlKGNvbm4tPmhhbmRsZSwgTlVMTCwgMCwgTlVMTCwgJmJ5dGVzLCBOVUxMKSkKLQkJCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKLQkJZWxzZSBpZiAoYnl0ZXMgPiAwKQotCQkJcmV0dXJuIFRSVUU7CisgICAgZm9yIChkZWxheSA9IDEgOyA7IGRlbGF5ICs9IDEpIHsKKyAgICAgICAgaWYgKCFQZWVrTmFtZWRQaXBlKGNvbm4tPmhhbmRsZSwgTlVMTCwgMCwgTlVMTCwgJmJ5dGVzLCBOVUxMKSkKKyAgICAgICAgICAgIHJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKKyAgICAgICAgZWxzZSBpZiAoYnl0ZXMgPiAwKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAKLQkJaWYgKCFibG9jaykgewotCQkJZGlmZmVyZW5jZSA9IGRlYWRsaW5lIC0gR2V0VGlja0NvdW50KCk7Ci0JCQlpZiAoZGlmZmVyZW5jZSA8IDApCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJaWYgKChpbnQpZGVsYXkgPiBkaWZmZXJlbmNlKQotCQkJCWRlbGF5ID0gZGlmZmVyZW5jZTsKLQkJfQorICAgICAgICBpZiAoIWJsb2NrKSB7CisgICAgICAgICAgICBkaWZmZXJlbmNlID0gZGVhZGxpbmUgLSBHZXRUaWNrQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAoKGludClkZWxheSA+IGRpZmZlcmVuY2UpCisgICAgICAgICAgICAgICAgZGVsYXkgPSBkaWZmZXJlbmNlOworICAgICAgICB9CiAKLQkJaWYgKGRlbGF5ID4gMjApCi0JCQlkZWxheSA9IDIwOworICAgICAgICBpZiAoZGVsYXkgPiAyMCkKKyAgICAgICAgICAgIGRlbGF5ID0gMjA7CiAKLQkJU2xlZXAoZGVsYXkpOworICAgICAgICBTbGVlcChkZWxheSk7CiAKLQkJLyogY2hlY2sgZm9yIHNpZ25hbHMgKi8KLQkJUHlfQkxPQ0tfVEhSRUFEUwotCQlyZXMgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKLQkJUHlfVU5CTE9DS19USFJFQURTCisgICAgICAgIC8qIGNoZWNrIGZvciBzaWduYWxzICovCisgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgcmVzID0gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CisgICAgICAgIFB5X1VOQkxPQ0tfVEhSRUFEUwogCi0JCWlmIChyZXMpCi0JCQlyZXR1cm4gTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVDsKLQl9CisgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICByZXR1cm4gTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVDsKKyAgICB9CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc2VtYXBob3JlLmMgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc2VtYXBob3JlLmMKaW5kZXggZDI4MmI3Ny4uMWRmZDA4ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3NlbWFwaG9yZS5jCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zZW1hcGhvcmUuYwpAQCAtMTEsMTIgKzExLDEyIEBACiBlbnVtIHsgUkVDVVJTSVZFX01VVEVYLCBTRU1BUEhPUkUgfTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlTRU1fSEFORExFIGhhbmRsZTsKLQlsb25nIGxhc3RfdGlkOwotCWludCBjb3VudDsKLQlpbnQgbWF4dmFsdWU7Ci0JaW50IGtpbmQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFNFTV9IQU5ETEUgaGFuZGxlOworICAgIGxvbmcgbGFzdF90aWQ7CisgICAgaW50IGNvdW50OworICAgIGludCBtYXh2YWx1ZTsKKyAgICBpbnQga2luZDsKIH0gU2VtTG9ja09iamVjdDsKIAogI2RlZmluZSBJU01JTkUobykgKG8tPmNvdW50ID4gMCAmJiBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgPT0gby0+bGFzdF90aWQpCkBAIC00MCwxNDggKzQwLDE0OCBAQAogc3RhdGljIGludAogX0dldFNlbWFwaG9yZVZhbHVlKEhBTkRMRSBoYW5kbGUsIGxvbmcgKnZhbHVlKQogewotCWxvbmcgcHJldmlvdXM7CisgICAgbG9uZyBwcmV2aW91czsKIAotCXN3aXRjaCAoV2FpdEZvclNpbmdsZU9iamVjdChoYW5kbGUsIDApKSB7Ci0JY2FzZSBXQUlUX09CSkVDVF8wOgotCQlpZiAoIVJlbGVhc2VTZW1hcGhvcmUoaGFuZGxlLCAxLCAmcHJldmlvdXMpKQotCQkJcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwotCQkqdmFsdWUgPSBwcmV2aW91cyArIDE7Ci0JCXJldHVybiAwOwotCWNhc2UgV0FJVF9USU1FT1VUOgotCQkqdmFsdWUgPSAwOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7Ci0JfQorICAgIHN3aXRjaCAoV2FpdEZvclNpbmdsZU9iamVjdChoYW5kbGUsIDApKSB7CisgICAgY2FzZSBXQUlUX09CSkVDVF8wOgorICAgICAgICBpZiAoIVJlbGVhc2VTZW1hcGhvcmUoaGFuZGxlLCAxLCAmcHJldmlvdXMpKQorICAgICAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOworICAgICAgICAqdmFsdWUgPSBwcmV2aW91cyArIDE7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgV0FJVF9USU1FT1VUOgorICAgICAgICAqdmFsdWUgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19hY3F1aXJlKFNlbUxvY2tPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpbnQgYmxvY2tpbmcgPSAxOwotCWRvdWJsZSB0aW1lb3V0OwotCVB5T2JqZWN0ICp0aW1lb3V0X29iaiA9IFB5X05vbmU7Ci0JRFdPUkQgcmVzLCBmdWxsX21zZWNzLCBtc2Vjcywgc3RhcnQsIHRpY2tzOworICAgIGludCBibG9ja2luZyA9IDE7CisgICAgZG91YmxlIHRpbWVvdXQ7CisgICAgUHlPYmplY3QgKnRpbWVvdXRfb2JqID0gUHlfTm9uZTsKKyAgICBEV09SRCByZXMsIGZ1bGxfbXNlY3MsIG1zZWNzLCBzdGFydCwgdGlja3M7CiAKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJsb2NrIiwgInRpbWVvdXQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJsb2NrIiwgInRpbWVvdXQiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aU8iLCBrd2xpc3QsCi0JCQkJCSAmYmxvY2tpbmcsICZ0aW1lb3V0X29iaikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aU8iLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NraW5nLCAmdGltZW91dF9vYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGNhbGN1bGF0ZSB0aW1lb3V0ICovCi0JaWYgKCFibG9ja2luZykgewotCQlmdWxsX21zZWNzID0gMDsKLQl9IGVsc2UgaWYgKHRpbWVvdXRfb2JqID09IFB5X05vbmUpIHsKLQkJZnVsbF9tc2VjcyA9IElORklOSVRFOwotCX0gZWxzZSB7Ci0JCXRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKHRpbWVvdXRfb2JqKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJdGltZW91dCAqPSAxMDAwLjA7ICAgICAgLyogY29udmVydCB0byBtaWxsaXNlY3MgKi8KLQkJaWYgKHRpbWVvdXQgPCAwLjApIHsKLQkJCXRpbWVvdXQgPSAwLjA7Ci0JCX0gZWxzZSBpZiAodGltZW91dCA+PSAwLjUgKiBJTkZJTklURSkgeyAvKiAyNSBkYXlzICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJInRpbWVvdXQgaXMgdG9vIGxhcmdlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmdWxsX21zZWNzID0gKERXT1JEKSh0aW1lb3V0ICsgMC41KTsKLQl9Ci0JCi0JLyogY2hlY2sgd2hldGhlciB3ZSBhbHJlYWR5IG93biB0aGUgbG9jayAqLwotCWlmIChzZWxmLT5raW5kID09IFJFQ1VSU0lWRV9NVVRFWCAmJiBJU01JTkUoc2VsZikpIHsKLQkJKytzZWxmLT5jb3VudDsKLQkJUHlfUkVUVVJOX1RSVUU7Ci0JfQorICAgIC8qIGNhbGN1bGF0ZSB0aW1lb3V0ICovCisgICAgaWYgKCFibG9ja2luZykgeworICAgICAgICBmdWxsX21zZWNzID0gMDsKKyAgICB9IGVsc2UgaWYgKHRpbWVvdXRfb2JqID09IFB5X05vbmUpIHsKKyAgICAgICAgZnVsbF9tc2VjcyA9IElORklOSVRFOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKHRpbWVvdXRfb2JqKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdGltZW91dCAqPSAxMDAwLjA7ICAgICAgLyogY29udmVydCB0byBtaWxsaXNlY3MgKi8KKyAgICAgICAgaWYgKHRpbWVvdXQgPCAwLjApIHsKKyAgICAgICAgICAgIHRpbWVvdXQgPSAwLjA7CisgICAgICAgIH0gZWxzZSBpZiAodGltZW91dCA+PSAwLjUgKiBJTkZJTklURSkgeyAvKiAyNSBkYXlzICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCBpcyB0b28gbGFyZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZ1bGxfbXNlY3MgPSAoRFdPUkQpKHRpbWVvdXQgKyAwLjUpOworICAgIH0KIAotCS8qIGNoZWNrIHdoZXRoZXIgd2UgY2FuIGFjcXVpcmUgd2l0aG91dCBibG9ja2luZyAqLwotCWlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KHNlbGYtPmhhbmRsZSwgMCkgPT0gV0FJVF9PQkpFQ1RfMCkgewotCQlzZWxmLT5sYXN0X3RpZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOwotCQkrK3NlbGYtPmNvdW50OwotCQlQeV9SRVRVUk5fVFJVRTsKLQl9Ci0JCi0JbXNlY3MgPSBmdWxsX21zZWNzOwotCXN0YXJ0ID0gR2V0VGlja0NvdW50KCk7CisgICAgLyogY2hlY2sgd2hldGhlciB3ZSBhbHJlYWR5IG93biB0aGUgbG9jayAqLworICAgIGlmIChzZWxmLT5raW5kID09IFJFQ1VSU0lWRV9NVVRFWCAmJiBJU01JTkUoc2VsZikpIHsKKyAgICAgICAgKytzZWxmLT5jb3VudDsKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgfQogCi0JZm9yICggOyA7ICkgewotCQlIQU5ETEUgaGFuZGxlc1syXSA9IHtzZWxmLT5oYW5kbGUsIHNpZ2ludF9ldmVudH07Ci0JCQotCQkvKiBkbyB0aGUgd2FpdCAqLwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCVJlc2V0RXZlbnQoc2lnaW50X2V2ZW50KTsKLQkJcmVzID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cygyLCBoYW5kbGVzLCBGQUxTRSwgbXNlY3MpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkKLQkJLyogaGFuZGxlIHJlc3VsdCAqLwotCQlpZiAocmVzICE9IFdBSVRfT0JKRUNUXzAgKyAxKQotCQkJYnJlYWs7Ci0JCQotCQkvKiBnb3QgU0lHSU5UIHNvIGdpdmUgc2lnbmFsIGhhbmRsZXIgYSBjaGFuY2UgdG8gcnVuICovCi0JCVNsZWVwKDEpOwotCQkKLQkJLyogaWYgdGhpcyBpcyBtYWluIHRocmVhZCBsZXQgS2V5Ym9hcmRJbnRlcnJ1cHQgYmUgcmFpc2VkICovCi0JCWlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkKLQkJCXJldHVybiBOVUxMOwotCQkKLQkJLyogcmVjYWxjdWxhdGUgdGltZW91dCAqLwotCQlpZiAobXNlY3MgIT0gSU5GSU5JVEUpIHsKLQkJCXRpY2tzID0gR2V0VGlja0NvdW50KCk7Ci0JCQlpZiAoKERXT1JEKSh0aWNrcyAtIHN0YXJ0KSA+PSBmdWxsX21zZWNzKQotCQkJCVB5X1JFVFVSTl9GQUxTRTsKLQkJCW1zZWNzID0gZnVsbF9tc2VjcyAtICh0aWNrcyAtIHN0YXJ0KTsKLQkJfQotCX0KLQkKLQkvKiBoYW5kbGUgcmVzdWx0ICovCi0Jc3dpdGNoIChyZXMpIHsKLQljYXNlIFdBSVRfVElNRU9VVDoKLQkJUHlfUkVUVVJOX0ZBTFNFOwotCWNhc2UgV0FJVF9PQkpFQ1RfMDoKLQkJc2VsZi0+bGFzdF90aWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKLQkJKytzZWxmLT5jb3VudDsKLQkJUHlfUkVUVVJOX1RSVUU7Ci0JY2FzZSBXQUlUX0ZBSUxFRDoKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsICJXYWl0Rm9yU2luZ2xlT2JqZWN0KCkgb3IgIgotCQkJICAgICAiV2FpdEZvck11bHRpcGxlT2JqZWN0cygpIGdhdmUgdW5yZWNvZ25pemVkICIKLQkJCSAgICAgInZhbHVlICVkIiwgcmVzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgY2FuIGFjcXVpcmUgd2l0aG91dCBibG9ja2luZyAqLworICAgIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KHNlbGYtPmhhbmRsZSwgMCkgPT0gV0FJVF9PQkpFQ1RfMCkgeworICAgICAgICBzZWxmLT5sYXN0X3RpZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgICAgICArK3NlbGYtPmNvdW50OworICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICB9CisKKyAgICBtc2VjcyA9IGZ1bGxfbXNlY3M7CisgICAgc3RhcnQgPSBHZXRUaWNrQ291bnQoKTsKKworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgSEFORExFIGhhbmRsZXNbMl0gPSB7c2VsZi0+aGFuZGxlLCBzaWdpbnRfZXZlbnR9OworCisgICAgICAgIC8qIGRvIHRoZSB3YWl0ICovCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUmVzZXRFdmVudChzaWdpbnRfZXZlbnQpOworICAgICAgICByZXMgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsIGhhbmRsZXMsIEZBTFNFLCBtc2Vjcyk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICAgICAgLyogaGFuZGxlIHJlc3VsdCAqLworICAgICAgICBpZiAocmVzICE9IFdBSVRfT0JKRUNUXzAgKyAxKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogZ290IFNJR0lOVCBzbyBnaXZlIHNpZ25hbCBoYW5kbGVyIGEgY2hhbmNlIHRvIHJ1biAqLworICAgICAgICBTbGVlcCgxKTsKKworICAgICAgICAvKiBpZiB0aGlzIGlzIG1haW4gdGhyZWFkIGxldCBLZXlib2FyZEludGVycnVwdCBiZSByYWlzZWQgKi8KKyAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgLyogcmVjYWxjdWxhdGUgdGltZW91dCAqLworICAgICAgICBpZiAobXNlY3MgIT0gSU5GSU5JVEUpIHsKKyAgICAgICAgICAgIHRpY2tzID0gR2V0VGlja0NvdW50KCk7CisgICAgICAgICAgICBpZiAoKERXT1JEKSh0aWNrcyAtIHN0YXJ0KSA+PSBmdWxsX21zZWNzKQorICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgICAgIG1zZWNzID0gZnVsbF9tc2VjcyAtICh0aWNrcyAtIHN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGhhbmRsZSByZXN1bHQgKi8KKyAgICBzd2l0Y2ggKHJlcykgeworICAgIGNhc2UgV0FJVF9USU1FT1VUOgorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgY2FzZSBXQUlUX09CSkVDVF8wOgorICAgICAgICBzZWxmLT5sYXN0X3RpZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgICAgICArK3NlbGYtPmNvdW50OworICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICBjYXNlIFdBSVRfRkFJTEVEOgorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwgIldhaXRGb3JTaW5nbGVPYmplY3QoKSBvciAiCisgICAgICAgICAgICAgICAgICAgICAiV2FpdEZvck11bHRpcGxlT2JqZWN0cygpIGdhdmUgdW5yZWNvZ25pemVkICIKKyAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSAlZCIsIHJlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfcmVsZWFzZShTZW1Mb2NrT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+a2luZCA9PSBSRUNVUlNJVkVfTVVURVgpIHsKLQkJaWYgKCFJU01JTkUoc2VsZikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Bc3NlcnRpb25FcnJvciwgImF0dGVtcHQgdG8gIgotCQkJCQkicmVsZWFzZSByZWN1cnNpdmUgbG9jayBub3Qgb3duZWQgIgotCQkJCQkiYnkgdGhyZWFkIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoc2VsZi0+Y291bnQgPiAxKSB7Ci0JCQktLXNlbGYtPmNvdW50OwotCQkJUHlfUkVUVVJOX05PTkU7Ci0JCX0KLQkJYXNzZXJ0KHNlbGYtPmNvdW50ID09IDEpOwotCX0KKyAgICBpZiAoc2VsZi0+a2luZCA9PSBSRUNVUlNJVkVfTVVURVgpIHsKKyAgICAgICAgaWYgKCFJU01JTkUoc2VsZikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Bc3NlcnRpb25FcnJvciwgImF0dGVtcHQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlIHJlY3Vyc2l2ZSBsb2NrIG5vdCBvd25lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5IHRocmVhZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlbGYtPmNvdW50ID4gMSkgeworICAgICAgICAgICAgLS1zZWxmLT5jb3VudDsKKyAgICAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgICAgICB9CisgICAgICAgIGFzc2VydChzZWxmLT5jb3VudCA9PSAxKTsKKyAgICB9CiAKLQlpZiAoIVJlbGVhc2VTZW1hcGhvcmUoc2VsZi0+aGFuZGxlLCAxLCBOVUxMKSkgewotCQlpZiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfVE9PX01BTllfUE9TVFMpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2VtYXBob3JlIG9yIGxvY2sgIgotCQkJCQkicmVsZWFzZWQgdG9vIG1hbnkgdGltZXMiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwotCQl9Ci0JfQorICAgIGlmICghUmVsZWFzZVNlbWFwaG9yZShzZWxmLT5oYW5kbGUsIDEsIE5VTEwpKSB7CisgICAgICAgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9UT09fTUFOWV9QT1NUUykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzZW1hcGhvcmUgb3IgbG9jayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VkIHRvbyBtYW55IHRpbWVzIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICAgICAgfQorICAgIH0KIAotCS0tc2VsZi0+Y291bnQ7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgLS1zZWxmLT5jb3VudDsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogI2Vsc2UgLyogIU1TX1dJTkRPV1MgKi8KQEAgLTIwNyw1OSArMjA3LDU5IEBACiBpbnQKIHNlbV90aW1lZHdhaXRfc2F2ZShzZW1fdCAqc2VtLCBzdHJ1Y3QgdGltZXNwZWMgKmRlYWRsaW5lLCBQeVRocmVhZFN0YXRlICpfc2F2ZSkKIHsKLQlpbnQgcmVzOwotCXVuc2lnbmVkIGxvbmcgZGVsYXksIGRpZmZlcmVuY2U7Ci0Jc3RydWN0IHRpbWV2YWwgbm93LCB0dmRlYWRsaW5lLCB0dmRlbGF5OworICAgIGludCByZXM7CisgICAgdW5zaWduZWQgbG9uZyBkZWxheSwgZGlmZmVyZW5jZTsKKyAgICBzdHJ1Y3QgdGltZXZhbCBub3csIHR2ZGVhZGxpbmUsIHR2ZGVsYXk7CiAKLQllcnJubyA9IDA7Ci0JdHZkZWFkbGluZS50dl9zZWMgPSBkZWFkbGluZS0+dHZfc2VjOwotCXR2ZGVhZGxpbmUudHZfdXNlYyA9IGRlYWRsaW5lLT50dl9uc2VjIC8gMTAwMDsKKyAgICBlcnJubyA9IDA7CisgICAgdHZkZWFkbGluZS50dl9zZWMgPSBkZWFkbGluZS0+dHZfc2VjOworICAgIHR2ZGVhZGxpbmUudHZfdXNlYyA9IGRlYWRsaW5lLT50dl9uc2VjIC8gMTAwMDsKIAotCWZvciAoZGVsYXkgPSAwIDsgOyBkZWxheSArPSAxMDAwKSB7Ci0JCS8qIHBvbGwgKi8KLQkJaWYgKHNlbV90cnl3YWl0KHNlbSkgPT0gMCkKLQkJCXJldHVybiAwOwotCQllbHNlIGlmIChlcnJubyAhPSBFQUdBSU4pCi0JCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgZm9yIChkZWxheSA9IDAgOyA7IGRlbGF5ICs9IDEwMDApIHsKKyAgICAgICAgLyogcG9sbCAqLworICAgICAgICBpZiAoc2VtX3RyeXdhaXQoc2VtKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UgaWYgKGVycm5vICE9IEVBR0FJTikKKyAgICAgICAgICAgIHJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKIAotCQkvKiBnZXQgY3VycmVudCB0aW1lICovCi0JCWlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPCAwKQotCQkJcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOworICAgICAgICAvKiBnZXQgY3VycmVudCB0aW1lICovCisgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwogCi0JCS8qIGNoZWNrIGZvciB0aW1lb3V0ICovCi0JCWlmICh0dmRlYWRsaW5lLnR2X3NlYyA8IG5vdy50dl9zZWMgfHwgCi0JCSAgICAodHZkZWFkbGluZS50dl9zZWMgPT0gbm93LnR2X3NlYyAmJiAKLQkJICAgICB0dmRlYWRsaW5lLnR2X3VzZWMgPD0gbm93LnR2X3VzZWMpKSB7Ci0JCQllcnJubyA9IEVUSU1FRE9VVDsKLQkJCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKLQkJfQorICAgICAgICAvKiBjaGVjayBmb3IgdGltZW91dCAqLworICAgICAgICBpZiAodHZkZWFkbGluZS50dl9zZWMgPCBub3cudHZfc2VjIHx8CisgICAgICAgICAgICAodHZkZWFkbGluZS50dl9zZWMgPT0gbm93LnR2X3NlYyAmJgorICAgICAgICAgICAgIHR2ZGVhZGxpbmUudHZfdXNlYyA8PSBub3cudHZfdXNlYykpIHsKKyAgICAgICAgICAgIGVycm5vID0gRVRJTUVET1VUOworICAgICAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOworICAgICAgICB9CiAKLQkJLyogY2FsY3VsYXRlIGhvdyBtdWNoIHRpbWUgaXMgbGVmdCAqLwotCQlkaWZmZXJlbmNlID0gKHR2ZGVhZGxpbmUudHZfc2VjIC0gbm93LnR2X3NlYykgKiAxMDAwMDAwICsgCi0JCQkodHZkZWFkbGluZS50dl91c2VjIC0gbm93LnR2X3VzZWMpOworICAgICAgICAvKiBjYWxjdWxhdGUgaG93IG11Y2ggdGltZSBpcyBsZWZ0ICovCisgICAgICAgIGRpZmZlcmVuY2UgPSAodHZkZWFkbGluZS50dl9zZWMgLSBub3cudHZfc2VjKSAqIDEwMDAwMDAgKworICAgICAgICAgICAgKHR2ZGVhZGxpbmUudHZfdXNlYyAtIG5vdy50dl91c2VjKTsKIAotCQkvKiBjaGVjayBkZWxheSBub3QgdG9vIGxvbmcgLS0gbWF4aW11bSBpcyAyMCBtc2VjcyAqLwotCQlpZiAoZGVsYXkgPiAyMDAwMCkKLQkJCWRlbGF5ID0gMjAwMDA7Ci0JCWlmIChkZWxheSA+IGRpZmZlcmVuY2UpCi0JCQlkZWxheSA9IGRpZmZlcmVuY2U7CisgICAgICAgIC8qIGNoZWNrIGRlbGF5IG5vdCB0b28gbG9uZyAtLSBtYXhpbXVtIGlzIDIwIG1zZWNzICovCisgICAgICAgIGlmIChkZWxheSA+IDIwMDAwKQorICAgICAgICAgICAgZGVsYXkgPSAyMDAwMDsKKyAgICAgICAgaWYgKGRlbGF5ID4gZGlmZmVyZW5jZSkKKyAgICAgICAgICAgIGRlbGF5ID0gZGlmZmVyZW5jZTsKIAotCQkvKiBzbGVlcCAqLwotCQl0dmRlbGF5LnR2X3NlYyA9IGRlbGF5IC8gMTAwMDAwMDsKLQkJdHZkZWxheS50dl91c2VjID0gZGVsYXkgJSAxMDAwMDAwOwotCQlpZiAoc2VsZWN0KDAsIE5VTEwsIE5VTEwsIE5VTEwsICZ0dmRlbGF5KSA8IDApCi0JCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgICAgIC8qIHNsZWVwICovCisgICAgICAgIHR2ZGVsYXkudHZfc2VjID0gZGVsYXkgLyAxMDAwMDAwOworICAgICAgICB0dmRlbGF5LnR2X3VzZWMgPSBkZWxheSAlIDEwMDAwMDA7CisgICAgICAgIGlmIChzZWxlY3QoMCwgTlVMTCwgTlVMTCwgTlVMTCwgJnR2ZGVsYXkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKIAotCQkvKiBjaGVjayBmb3Igc2lnbmFscyAqLwotCQlQeV9CTE9DS19USFJFQURTIAotCQlyZXMgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKLQkJUHlfVU5CTE9DS19USFJFQURTCisgICAgICAgIC8qIGNoZWNrIGZvciBzaWduYWxzICovCisgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgcmVzID0gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CisgICAgICAgIFB5X1VOQkxPQ0tfVEhSRUFEUwogCi0JCWlmIChyZXMpIHsKLQkJCWVycm5vID0gRUlOVFI7Ci0JCQlyZXR1cm4gTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVDsKLQkJfQotCX0KKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgZXJybm8gPSBFSU5UUjsKKyAgICAgICAgICAgIHJldHVybiBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOworICAgICAgICB9CisgICAgfQogfQogCiAjZW5kaWYgLyogIUhBVkVfU0VNX1RJTUVEV0FJVCAqLwpAQCAtMjY3LDEyOSArMjY3LDEyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfYWNxdWlyZShTZW1Mb2NrT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaW50IGJsb2NraW5nID0gMSwgcmVzOwotCWRvdWJsZSB0aW1lb3V0OwotCVB5T2JqZWN0ICp0aW1lb3V0X29iaiA9IFB5X05vbmU7Ci0Jc3RydWN0IHRpbWVzcGVjIGRlYWRsaW5lID0gezB9OwotCXN0cnVjdCB0aW1ldmFsIG5vdzsKLQlsb25nIHNlYywgbnNlYzsKKyAgICBpbnQgYmxvY2tpbmcgPSAxLCByZXM7CisgICAgZG91YmxlIHRpbWVvdXQ7CisgICAgUHlPYmplY3QgKnRpbWVvdXRfb2JqID0gUHlfTm9uZTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgZGVhZGxpbmUgPSB7MH07CisgICAgc3RydWN0IHRpbWV2YWwgbm93OworICAgIGxvbmcgc2VjLCBuc2VjOwogCi0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJibG9jayIsICJ0aW1lb3V0IiwgTlVMTH07CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJibG9jayIsICJ0aW1lb3V0IiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGlPIiwga3dsaXN0LAotCQkJCQkgJmJsb2NraW5nLCAmdGltZW91dF9vYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGlPIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja2luZywgJnRpbWVvdXRfb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc2VsZi0+a2luZCA9PSBSRUNVUlNJVkVfTVVURVggJiYgSVNNSU5FKHNlbGYpKSB7Ci0JCSsrc2VsZi0+Y291bnQ7Ci0JCVB5X1JFVFVSTl9UUlVFOwotCX0KKyAgICBpZiAoc2VsZi0+a2luZCA9PSBSRUNVUlNJVkVfTVVURVggJiYgSVNNSU5FKHNlbGYpKSB7CisgICAgICAgICsrc2VsZi0+Y291bnQ7CisgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgIH0KIAotCWlmICh0aW1lb3V0X29iaiAhPSBQeV9Ob25lKSB7Ci0JCXRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKHRpbWVvdXRfb2JqKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKHRpbWVvdXQgPCAwLjApCi0JCQl0aW1lb3V0ID0gMC4wOworICAgIGlmICh0aW1lb3V0X29iaiAhPSBQeV9Ob25lKSB7CisgICAgICAgIHRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKHRpbWVvdXRfb2JqKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHRpbWVvdXQgPCAwLjApCisgICAgICAgICAgICB0aW1lb3V0ID0gMC4wOwogCi0JCWlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPCAwKSB7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzZWMgPSAobG9uZykgdGltZW91dDsKLQkJbnNlYyA9IChsb25nKSAoMWU5ICogKHRpbWVvdXQgLSBzZWMpICsgMC41KTsKLQkJZGVhZGxpbmUudHZfc2VjID0gbm93LnR2X3NlYyArIHNlYzsKLQkJZGVhZGxpbmUudHZfbnNlYyA9IG5vdy50dl91c2VjICogMTAwMCArIG5zZWM7Ci0JCWRlYWRsaW5lLnR2X3NlYyArPSAoZGVhZGxpbmUudHZfbnNlYyAvIDEwMDAwMDAwMDApOwotCQlkZWFkbGluZS50dl9uc2VjICU9IDEwMDAwMDAwMDA7Ci0JfQorICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpIDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2VjID0gKGxvbmcpIHRpbWVvdXQ7CisgICAgICAgIG5zZWMgPSAobG9uZykgKDFlOSAqICh0aW1lb3V0IC0gc2VjKSArIDAuNSk7CisgICAgICAgIGRlYWRsaW5lLnR2X3NlYyA9IG5vdy50dl9zZWMgKyBzZWM7CisgICAgICAgIGRlYWRsaW5lLnR2X25zZWMgPSBub3cudHZfdXNlYyAqIDEwMDAgKyBuc2VjOworICAgICAgICBkZWFkbGluZS50dl9zZWMgKz0gKGRlYWRsaW5lLnR2X25zZWMgLyAxMDAwMDAwMDAwKTsKKyAgICAgICAgZGVhZGxpbmUudHZfbnNlYyAlPSAxMDAwMDAwMDAwOworICAgIH0KIAotCWRvIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlpZiAoYmxvY2tpbmcgJiYgdGltZW91dF9vYmogPT0gUHlfTm9uZSkKLQkJCXJlcyA9IHNlbV93YWl0KHNlbGYtPmhhbmRsZSk7Ci0JCWVsc2UgaWYgKCFibG9ja2luZykKLQkJCXJlcyA9IHNlbV90cnl3YWl0KHNlbGYtPmhhbmRsZSk7Ci0JCWVsc2UKLQkJCXJlcyA9IHNlbV90aW1lZHdhaXQoc2VsZi0+aGFuZGxlLCAmZGVhZGxpbmUpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAocmVzID09IE1QX0VYQ0VQVElPTl9IQVNfQkVFTl9TRVQpCi0JCQlicmVhazsKLQl9IHdoaWxlIChyZXMgPCAwICYmIGVycm5vID09IEVJTlRSICYmICFQeUVycl9DaGVja1NpZ25hbHMoKSk7CisgICAgZG8geworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGlmIChibG9ja2luZyAmJiB0aW1lb3V0X29iaiA9PSBQeV9Ob25lKQorICAgICAgICAgICAgcmVzID0gc2VtX3dhaXQoc2VsZi0+aGFuZGxlKTsKKyAgICAgICAgZWxzZSBpZiAoIWJsb2NraW5nKQorICAgICAgICAgICAgcmVzID0gc2VtX3RyeXdhaXQoc2VsZi0+aGFuZGxlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzID0gc2VtX3RpbWVkd2FpdChzZWxmLT5oYW5kbGUsICZkZWFkbGluZSk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChyZXMgPT0gTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gd2hpbGUgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUlOVFIgJiYgIVB5RXJyX0NoZWNrU2lnbmFscygpKTsKIAotCWlmIChyZXMgPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVRJTUVET1VUKQotCQkJUHlfUkVUVVJOX0ZBTFNFOwotCQllbHNlIGlmIChlcnJubyA9PSBFSU5UUikKLQkJCXJldHVybiBOVUxMOwotCQllbHNlCi0JCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotCX0KKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVUSU1FRE9VVCkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgZWxzZSBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICB9CiAKLQkrK3NlbGYtPmNvdW50OwotCXNlbGYtPmxhc3RfdGlkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgICsrc2VsZi0+Y291bnQ7CisgICAgc2VsZi0+bGFzdF90aWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CiAKLQlQeV9SRVRVUk5fVFJVRTsKKyAgICBQeV9SRVRVUk5fVFJVRTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfcmVsZWFzZShTZW1Mb2NrT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+a2luZCA9PSBSRUNVUlNJVkVfTVVURVgpIHsKLQkJaWYgKCFJU01JTkUoc2VsZikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Bc3NlcnRpb25FcnJvciwgImF0dGVtcHQgdG8gIgotCQkJCQkicmVsZWFzZSByZWN1cnNpdmUgbG9jayBub3Qgb3duZWQgIgotCQkJCQkiYnkgdGhyZWFkIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoc2VsZi0+Y291bnQgPiAxKSB7Ci0JCQktLXNlbGYtPmNvdW50OwotCQkJUHlfUkVUVVJOX05PTkU7Ci0JCX0KLQkJYXNzZXJ0KHNlbGYtPmNvdW50ID09IDEpOwotCX0gZWxzZSB7CisgICAgaWYgKHNlbGYtPmtpbmQgPT0gUkVDVVJTSVZFX01VVEVYKSB7CisgICAgICAgIGlmICghSVNNSU5FKHNlbGYpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXNzZXJ0aW9uRXJyb3IsICJhdHRlbXB0IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVsZWFzZSByZWN1cnNpdmUgbG9jayBub3Qgb3duZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieSB0aHJlYWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChzZWxmLT5jb3VudCA+IDEpIHsKKyAgICAgICAgICAgIC0tc2VsZi0+Y291bnQ7CisgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoc2VsZi0+Y291bnQgPT0gMSk7CisgICAgfSBlbHNlIHsKICNpZmRlZiBIQVZFX0JST0tFTl9TRU1fR0VUVkFMVUUKLQkJLyogV2Ugd2lsbCBvbmx5IGNoZWNrIHByb3Blcmx5IHRoZSBtYXh2YWx1ZSA9PSAxIGNhc2UgKi8KLQkJaWYgKHNlbGYtPm1heHZhbHVlID09IDEpIHsKLQkJCS8qIG1ha2Ugc3VyZSB0aGF0IGFscmVhZHkgbG9ja2VkICovCi0JCQlpZiAoc2VtX3RyeXdhaXQoc2VsZi0+aGFuZGxlKSA8IDApIHsKLQkJCQlpZiAoZXJybm8gIT0gRUFHQUlOKSB7Ci0JCQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJCS8qIGl0IGlzIGFscmVhZHkgbG9ja2VkIGFzIGV4cGVjdGVkICovCi0JCQl9IGVsc2UgewotCQkJCS8qIGl0IHdhcyBub3QgbG9ja2VkIHNvIHVuZG8gd2FpdCBhbmQgcmFpc2UgICovCi0JCQkJaWYgKHNlbV9wb3N0KHNlbGYtPmhhbmRsZSkgPCAwKSB7Ci0JCQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2VtYXBob3JlICIKLQkJCQkJCSJvciBsb2NrIHJlbGVhc2VkIHRvbyBtYW55ICIKLQkJCQkJCSJ0aW1lcyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9CisgICAgICAgIC8qIFdlIHdpbGwgb25seSBjaGVjayBwcm9wZXJseSB0aGUgbWF4dmFsdWUgPT0gMSBjYXNlICovCisgICAgICAgIGlmIChzZWxmLT5tYXh2YWx1ZSA9PSAxKSB7CisgICAgICAgICAgICAvKiBtYWtlIHN1cmUgdGhhdCBhbHJlYWR5IGxvY2tlZCAqLworICAgICAgICAgICAgaWYgKHNlbV90cnl3YWl0KHNlbGYtPmhhbmRsZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vICE9IEVBR0FJTikgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBpdCBpcyBhbHJlYWR5IGxvY2tlZCBhcyBleHBlY3RlZCAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBpdCB3YXMgbm90IGxvY2tlZCBzbyB1bmRvIHdhaXQgYW5kIHJhaXNlICAqLworICAgICAgICAgICAgICAgIGlmIChzZW1fcG9zdChzZWxmLT5oYW5kbGUpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNlbWFwaG9yZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBsb2NrIHJlbGVhc2VkIHRvbyBtYW55ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbHNlCi0JCWludCBzdmFsOworICAgICAgICBpbnQgc3ZhbDsKIAotCQkvKiBUaGlzIGNoZWNrIGlzIG5vdCBhbiBhYnNvbHV0ZSBndWFyYW50ZWUgdGhhdCB0aGUgc2VtYXBob3JlCi0JCSAgIGRvZXMgbm90IHJpc2UgYWJvdmUgbWF4dmFsdWUuICovCi0JCWlmIChzZW1fZ2V0dmFsdWUoc2VsZi0+aGFuZGxlLCAmc3ZhbCkgPCAwKSB7Ci0JCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotCQl9IGVsc2UgaWYgKHN2YWwgPj0gc2VsZi0+bWF4dmFsdWUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2VtYXBob3JlIG9yIGxvY2sgIgotCQkJCQkicmVsZWFzZWQgdG9vIG1hbnkgdGltZXMiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIC8qIFRoaXMgY2hlY2sgaXMgbm90IGFuIGFic29sdXRlIGd1YXJhbnRlZSB0aGF0IHRoZSBzZW1hcGhvcmUKKyAgICAgICAgICAgZG9lcyBub3QgcmlzZSBhYm92ZSBtYXh2YWx1ZS4gKi8KKyAgICAgICAgaWYgKHNlbV9nZXR2YWx1ZShzZWxmLT5oYW5kbGUsICZzdmFsKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgIH0gZWxzZSBpZiAoc3ZhbCA+PSBzZWxmLT5tYXh2YWx1ZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzZW1hcGhvcmUgb3IgbG9jayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VkIHRvbyBtYW55IHRpbWVzIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JfQorICAgIH0KIAotCWlmIChzZW1fcG9zdChzZWxmLT5oYW5kbGUpIDwgMCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICBpZiAoc2VtX3Bvc3Qoc2VsZi0+aGFuZGxlKSA8IDApCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CiAKLQktLXNlbGYtPmNvdW50OwotCVB5X1JFVFVSTl9OT05FOworICAgIC0tc2VsZi0+Y291bnQ7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKICNlbmRpZiAvKiAhTVNfV0lORE9XUyAqLwpAQCAtNDAxLDExMSArNDAxLDExMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld3NlbWxvY2tvYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBTRU1fSEFORExFIGhhbmRsZSwgaW50IGtpbmQsIGludCBtYXh2YWx1ZSkKIHsKLQlTZW1Mb2NrT2JqZWN0ICpzZWxmOworICAgIFNlbUxvY2tPYmplY3QgKnNlbGY7CiAKLQlzZWxmID0gUHlPYmplY3RfTmV3KFNlbUxvY2tPYmplY3QsIHR5cGUpOwotCWlmICghc2VsZikKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+aGFuZGxlID0gaGFuZGxlOwotCXNlbGYtPmtpbmQgPSBraW5kOwotCXNlbGYtPmNvdW50ID0gMDsKLQlzZWxmLT5sYXN0X3RpZCA9IDA7Ci0Jc2VsZi0+bWF4dmFsdWUgPSBtYXh2YWx1ZTsKLQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoU2VtTG9ja09iamVjdCwgdHlwZSk7CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5oYW5kbGUgPSBoYW5kbGU7CisgICAgc2VsZi0+a2luZCA9IGtpbmQ7CisgICAgc2VsZi0+Y291bnQgPSAwOworICAgIHNlbGYtPmxhc3RfdGlkID0gMDsKKyAgICBzZWxmLT5tYXh2YWx1ZSA9IG1heHZhbHVlOworICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZW1sb2NrX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQljaGFyIGJ1ZmZlclsyNTZdOwotCVNFTV9IQU5ETEUgaGFuZGxlID0gU0VNX0ZBSUxFRDsKLQlpbnQga2luZCwgbWF4dmFsdWUsIHZhbHVlOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJraW5kIiwgInZhbHVlIiwgIm1heHZhbHVlIiwgTlVMTH07Ci0Jc3RhdGljIGludCBjb3VudGVyID0gMDsKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOworICAgIFNFTV9IQU5ETEUgaGFuZGxlID0gU0VNX0ZBSUxFRDsKKyAgICBpbnQga2luZCwgbWF4dmFsdWUsIHZhbHVlOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJraW5kIiwgInZhbHVlIiwgIm1heHZhbHVlIiwgTlVMTH07CisgICAgc3RhdGljIGludCBjb3VudGVyID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJpaWkiLCBrd2xpc3QsIAotCQkJCQkgJmtpbmQsICZ2YWx1ZSwgJm1heHZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgImlpaSIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2luZCwgJnZhbHVlLCAmbWF4dmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChraW5kICE9IFJFQ1VSU0lWRV9NVVRFWCAmJiBraW5kICE9IFNFTUFQSE9SRSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInVucmVjb2duaXplZCBraW5kIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoa2luZCAhPSBSRUNVUlNJVkVfTVVURVggJiYga2luZCAhPSBTRU1BUEhPUkUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ1bnJlY29nbml6ZWQga2luZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIvbXAlZC0lZCIsIGdldHBpZCgpLCBjb3VudGVyKyspOworICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIi9tcCVkLSVkIiwgZ2V0cGlkKCksIGNvdW50ZXIrKyk7CiAKLQlTRU1fQ0xFQVJfRVJST1IoKTsKLQloYW5kbGUgPSBTRU1fQ1JFQVRFKGJ1ZmZlciwgdmFsdWUsIG1heHZhbHVlKTsKLQkvKiBPbiBXaW5kb3dzIHdlIHNob3VsZCBmYWlsIGlmIEdldExhc3RFcnJvcigpPT1FUlJPUl9BTFJFQURZX0VYSVNUUyAqLwotCWlmIChoYW5kbGUgPT0gU0VNX0ZBSUxFRCB8fCBTRU1fR0VUX0xBU1RfRVJST1IoKSAhPSAwKQotCQlnb3RvIGZhaWx1cmU7CisgICAgU0VNX0NMRUFSX0VSUk9SKCk7CisgICAgaGFuZGxlID0gU0VNX0NSRUFURShidWZmZXIsIHZhbHVlLCBtYXh2YWx1ZSk7CisgICAgLyogT24gV2luZG93cyB3ZSBzaG91bGQgZmFpbCBpZiBHZXRMYXN0RXJyb3IoKT09RVJST1JfQUxSRUFEWV9FWElTVFMgKi8KKyAgICBpZiAoaGFuZGxlID09IFNFTV9GQUlMRUQgfHwgU0VNX0dFVF9MQVNUX0VSUk9SKCkgIT0gMCkKKyAgICAgICAgZ290byBmYWlsdXJlOwogCi0JaWYgKFNFTV9VTkxJTksoYnVmZmVyKSA8IDApCi0JCWdvdG8gZmFpbHVyZTsKKyAgICBpZiAoU0VNX1VOTElOSyhidWZmZXIpIDwgMCkKKyAgICAgICAgZ290byBmYWlsdXJlOwogCi0JcmVzdWx0ID0gbmV3c2VtbG9ja29iamVjdCh0eXBlLCBoYW5kbGUsIGtpbmQsIG1heHZhbHVlKTsKLQlpZiAoIXJlc3VsdCkKLQkJZ290byBmYWlsdXJlOworICAgIHJlc3VsdCA9IG5ld3NlbWxvY2tvYmplY3QodHlwZSwgaGFuZGxlLCBraW5kLCBtYXh2YWx1ZSk7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIGdvdG8gZmFpbHVyZTsKIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogICBmYWlsdXJlOgotCWlmIChoYW5kbGUgIT0gU0VNX0ZBSUxFRCkKLQkJU0VNX0NMT1NFKGhhbmRsZSk7Ci0JbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOwotCXJldHVybiBOVUxMOworICAgIGlmIChoYW5kbGUgIT0gU0VNX0ZBSUxFRCkKKyAgICAgICAgU0VNX0NMT1NFKGhhbmRsZSk7CisgICAgbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19yZWJ1aWxkKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JU0VNX0hBTkRMRSBoYW5kbGU7Ci0JaW50IGtpbmQsIG1heHZhbHVlOworICAgIFNFTV9IQU5ETEUgaGFuZGxlOworICAgIGludCBraW5kLCBtYXh2YWx1ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBGX1NFTV9IQU5ETEUgImlpIiwgCi0JCQkgICAgICAmaGFuZGxlLCAma2luZCwgJm1heHZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfU0VNX0hBTkRMRSAiaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlLCAma2luZCwgJm1heHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gbmV3c2VtbG9ja29iamVjdCh0eXBlLCBoYW5kbGUsIGtpbmQsIG1heHZhbHVlKTsKKyAgICByZXR1cm4gbmV3c2VtbG9ja29iamVjdCh0eXBlLCBoYW5kbGUsIGtpbmQsIG1heHZhbHVlKTsKIH0KIAogc3RhdGljIHZvaWQKIHNlbWxvY2tfZGVhbGxvYyhTZW1Mb2NrT2JqZWN0KiBzZWxmKQogewotCWlmIChzZWxmLT5oYW5kbGUgIT0gU0VNX0ZBSUxFRCkKLQkJU0VNX0NMT1NFKHNlbGYtPmhhbmRsZSk7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGlmIChzZWxmLT5oYW5kbGUgIT0gU0VNX0ZBSUxFRCkKKyAgICAgICAgU0VNX0NMT1NFKHNlbGYtPmhhbmRsZSk7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19jb3VudChTZW1Mb2NrT2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5jb3VudCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPmNvdW50KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfaXNtaW5lKFNlbUxvY2tPYmplY3QgKnNlbGYpCiB7Ci0JLyogb25seSBtYWtlcyBzZW5zZSBmb3IgYSBsb2NrICovCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhJU01JTkUoc2VsZikpOworICAgIC8qIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIGEgbG9jayAqLworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoSVNNSU5FKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfZ2V0dmFsdWUoU2VtTG9ja09iamVjdCAqc2VsZikKIHsKICNpZmRlZiBIQVZFX0JST0tFTl9TRU1fR0VUVkFMVUUKLQlQeUVycl9TZXROb25lKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcik7CisgICAgcmV0dXJuIE5VTEw7CiAjZWxzZQotCWludCBzdmFsOwotCWlmIChTRU1fR0VUVkFMVUUoc2VsZi0+aGFuZGxlLCAmc3ZhbCkgPCAwKQotCQlyZXR1cm4gbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOwotCS8qIHNvbWUgcG9zaXggaW1wbGVtZW50YXRpb25zIHVzZSBuZWdhdGl2ZSBudW1iZXJzIHRvIGluZGljYXRlIAotCSAgIHRoZSBudW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzICovCi0JaWYgKHN2YWwgPCAwKQotCQlzdmFsID0gMDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc3ZhbCk7CisgICAgaW50IHN2YWw7CisgICAgaWYgKFNFTV9HRVRWQUxVRShzZWxmLT5oYW5kbGUsICZzdmFsKSA8IDApCisgICAgICAgIHJldHVybiBtcF9TZXRFcnJvcihOVUxMLCBNUF9TVEFOREFSRF9FUlJPUik7CisgICAgLyogc29tZSBwb3NpeCBpbXBsZW1lbnRhdGlvbnMgdXNlIG5lZ2F0aXZlIG51bWJlcnMgdG8gaW5kaWNhdGUKKyAgICAgICB0aGUgbnVtYmVyIG9mIHdhaXRpbmcgdGhyZWFkcyAqLworICAgIGlmIChzdmFsIDwgMCkKKyAgICAgICAgc3ZhbCA9IDA7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXN2YWwpOwogI2VuZGlmCiB9CiAKQEAgLTUxMywyOCArNTEzLDI4IEBACiBzZW1sb2NrX2lzemVybyhTZW1Mb2NrT2JqZWN0ICpzZWxmKQogewogI2lmZGVmIEhBVkVfQlJPS0VOX1NFTV9HRVRWQUxVRQotCWlmIChzZW1fdHJ5d2FpdChzZWxmLT5oYW5kbGUpIDwgMCkgewotCQlpZiAoZXJybm8gPT0gRUFHQUlOKQotCQkJUHlfUkVUVVJOX1RSVUU7Ci0JCXJldHVybiBtcF9TZXRFcnJvcihOVUxMLCBNUF9TVEFOREFSRF9FUlJPUik7Ci0JfSBlbHNlIHsKLQkJaWYgKHNlbV9wb3N0KHNlbGYtPmhhbmRsZSkgPCAwKQotCQkJcmV0dXJuIG1wX1NldEVycm9yKE5VTEwsIE1QX1NUQU5EQVJEX0VSUk9SKTsKLQkJUHlfUkVUVVJOX0ZBTFNFOwotCX0KKyAgICBpZiAoc2VtX3RyeXdhaXQoc2VsZi0+aGFuZGxlKSA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTikKKyAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgICAgICByZXR1cm4gbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzZW1fcG9zdChzZWxmLT5oYW5kbGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBtcF9TZXRFcnJvcihOVUxMLCBNUF9TVEFOREFSRF9FUlJPUik7CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CiAjZWxzZQotCWludCBzdmFsOwotCWlmIChTRU1fR0VUVkFMVUUoc2VsZi0+aGFuZGxlLCAmc3ZhbCkgPCAwKQotCQlyZXR1cm4gbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpc3ZhbCA9PSAwKTsKKyAgICBpbnQgc3ZhbDsKKyAgICBpZiAoU0VNX0dFVFZBTFVFKHNlbGYtPmhhbmRsZSwgJnN2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIG1wX1NldEVycm9yKE5VTEwsIE1QX1NUQU5EQVJEX0VSUk9SKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKXN2YWwgPT0gMCk7CiAjZW5kaWYKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfYWZ0ZXJmb3JrKFNlbUxvY2tPYmplY3QgKnNlbGYpCiB7Ci0Jc2VsZi0+Y291bnQgPSAwOwotCVB5X1JFVFVSTl9OT05FOworICAgIHNlbGYtPmNvdW50ID0gMDsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogLyoKQEAgLTU0MiwyNyArNTQyLDI3IEBACiAgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIHNlbWxvY2tfbWV0aG9kc1tdID0gewotCXsiYWNxdWlyZSIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2FjcXVpcmUsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JICJhY3F1aXJlIHRoZSBzZW1hcGhvcmUvbG9jayJ9LAotCXsicmVsZWFzZSIsIChQeUNGdW5jdGlvbilzZW1sb2NrX3JlbGVhc2UsIE1FVEhfTk9BUkdTLCAKLQkgInJlbGVhc2UgdGhlIHNlbWFwaG9yZS9sb2NrIn0sCisgICAgeyJhY3F1aXJlIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfYWNxdWlyZSwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgImFjcXVpcmUgdGhlIHNlbWFwaG9yZS9sb2NrIn0sCisgICAgeyJyZWxlYXNlIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfcmVsZWFzZSwgTUVUSF9OT0FSR1MsCisgICAgICJyZWxlYXNlIHRoZSBzZW1hcGhvcmUvbG9jayJ9LAogICAgIHsiX19lbnRlcl9fIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfYWNxdWlyZSwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkgImVudGVyIHRoZSBzZW1hcGhvcmUvbG9jayJ9LAotCXsiX19leGl0X18iLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19yZWxlYXNlLCBNRVRIX1ZBUkFSR1MsIAotCSAiZXhpdCB0aGUgc2VtYXBob3JlL2xvY2sifSwKLQl7Il9jb3VudCIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2NvdW50LCBNRVRIX05PQVJHUywgCi0JICJudW0gb2YgYGFjcXVpcmUoKWBzIG1pbnVzIG51bSBvZiBgcmVsZWFzZSgpYHMgZm9yIHRoaXMgcHJvY2VzcyJ9LAotCXsiX2lzX21pbmUiLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19pc21pbmUsIE1FVEhfTk9BUkdTLCAKLQkgIndoZXRoZXIgdGhlIGxvY2sgaXMgb3duZWQgYnkgdGhpcyB0aHJlYWQifSwKLQl7Il9nZXRfdmFsdWUiLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19nZXR2YWx1ZSwgTUVUSF9OT0FSR1MsIAotCSAiZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgc2VtYXBob3JlIn0sIAotCXsiX2lzX3plcm8iLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19pc3plcm8sIE1FVEhfTk9BUkdTLCAKLQkgInJldHVybnMgd2hldGhlciBzZW1hcGhvcmUgaGFzIHZhbHVlIHplcm8ifSwgCi0JeyJfcmVidWlsZCIsIChQeUNGdW5jdGlvbilzZW1sb2NrX3JlYnVpbGQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsIAotCSAiIn0sIAotCXsiX2FmdGVyX2ZvcmsiLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19hZnRlcmZvcmssIE1FVEhfTk9BUkdTLAotCSAicmV6ZXJvIHRoZSBuZXQgYWNxdWlzaXRpb24gY291bnQgYWZ0ZXIgZm9yaygpIn0sCi0Je05VTEx9CisgICAgICJlbnRlciB0aGUgc2VtYXBob3JlL2xvY2sifSwKKyAgICB7Il9fZXhpdF9fIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfcmVsZWFzZSwgTUVUSF9WQVJBUkdTLAorICAgICAiZXhpdCB0aGUgc2VtYXBob3JlL2xvY2sifSwKKyAgICB7Il9jb3VudCIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2NvdW50LCBNRVRIX05PQVJHUywKKyAgICAgIm51bSBvZiBgYWNxdWlyZSgpYHMgbWludXMgbnVtIG9mIGByZWxlYXNlKClgcyBmb3IgdGhpcyBwcm9jZXNzIn0sCisgICAgeyJfaXNfbWluZSIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2lzbWluZSwgTUVUSF9OT0FSR1MsCisgICAgICJ3aGV0aGVyIHRoZSBsb2NrIGlzIG93bmVkIGJ5IHRoaXMgdGhyZWFkIn0sCisgICAgeyJfZ2V0X3ZhbHVlIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfZ2V0dmFsdWUsIE1FVEhfTk9BUkdTLAorICAgICAiZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgc2VtYXBob3JlIn0sCisgICAgeyJfaXNfemVybyIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2lzemVybywgTUVUSF9OT0FSR1MsCisgICAgICJyZXR1cm5zIHdoZXRoZXIgc2VtYXBob3JlIGhhcyB2YWx1ZSB6ZXJvIn0sCisgICAgeyJfcmVidWlsZCIsIChQeUNGdW5jdGlvbilzZW1sb2NrX3JlYnVpbGQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsCisgICAgICIifSwKKyAgICB7Il9hZnRlcl9mb3JrIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfYWZ0ZXJmb3JrLCBNRVRIX05PQVJHUywKKyAgICAgInJlemVybyB0aGUgbmV0IGFjcXVpc2l0aW9uIGNvdW50IGFmdGVyIGZvcmsoKSJ9LAorICAgIHtOVUxMfQogfTsKIAogLyoKQEAgLTU3MCwxMyArNTcwLDEzIEBACiAgKi8KIAogc3RhdGljIFB5TWVtYmVyRGVmIHNlbWxvY2tfbWVtYmVyc1tdID0gewotCXsiaGFuZGxlIiwgVF9TRU1fSEFORExFLCBvZmZzZXRvZihTZW1Mb2NrT2JqZWN0LCBoYW5kbGUpLCBSRUFET05MWSwgCi0JICIifSwKLQl7ImtpbmQiLCBUX0lOVCwgb2Zmc2V0b2YoU2VtTG9ja09iamVjdCwga2luZCksIFJFQURPTkxZLCAKLQkgIiJ9LAotCXsibWF4dmFsdWUiLCBUX0lOVCwgb2Zmc2V0b2YoU2VtTG9ja09iamVjdCwgbWF4dmFsdWUpLCBSRUFET05MWSwgCi0JICIifSwKLQl7TlVMTH0KKyAgICB7ImhhbmRsZSIsIFRfU0VNX0hBTkRMRSwgb2Zmc2V0b2YoU2VtTG9ja09iamVjdCwgaGFuZGxlKSwgUkVBRE9OTFksCisgICAgICIifSwKKyAgICB7ImtpbmQiLCBUX0lOVCwgb2Zmc2V0b2YoU2VtTG9ja09iamVjdCwga2luZCksIFJFQURPTkxZLAorICAgICAiIn0sCisgICAgeyJtYXh2YWx1ZSIsIFRfSU5ULCBvZmZzZXRvZihTZW1Mb2NrT2JqZWN0LCBtYXh2YWx1ZSksIFJFQURPTkxZLAorICAgICAiIn0sCisgICAge05VTEx9CiB9OwogCiAvKgpAQCAtNTg0LDQyICs1ODQsNDIgQEAKICAqLwogCiBQeVR5cGVPYmplY3QgU2VtTG9ja1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JLyogdHBfbmFtZSAgICAgICAgICAgKi8gIl9tdWx0aXByb2Nlc3NpbmcuU2VtTG9jayIsCi0JLyogdHBfYmFzaWNzaXplICAgICAgKi8gc2l6ZW9mKFNlbUxvY2tPYmplY3QpLAotCS8qIHRwX2l0ZW1zaXplICAgICAgICovIDAsCi0JLyogdHBfZGVhbGxvYyAgICAgICAgKi8gKGRlc3RydWN0b3Ipc2VtbG9ja19kZWFsbG9jLAotCS8qIHRwX3ByaW50ICAgICAgICAgICovIDAsCi0JLyogdHBfZ2V0YXR0ciAgICAgICAgKi8gMCwKLQkvKiB0cF9zZXRhdHRyICAgICAgICAqLyAwLAotCS8qIHRwX2NvbXBhcmUgICAgICAgICovIDAsCi0JLyogdHBfcmVwciAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9hc19udW1iZXIgICAgICAqLyAwLAotCS8qIHRwX2FzX3NlcXVlbmNlICAgICovIDAsCi0JLyogdHBfYXNfbWFwcGluZyAgICAgKi8gMCwKLQkvKiB0cF9oYXNoICAgICAgICAgICAqLyAwLAotCS8qIHRwX2NhbGwgICAgICAgICAgICovIDAsCi0JLyogdHBfc3RyICAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9nZXRhdHRybyAgICAgICAqLyAwLAotCS8qIHRwX3NldGF0dHJvICAgICAgICovIDAsCi0JLyogdHBfYXNfYnVmZmVyICAgICAgKi8gMCwKLQkvKiB0cF9mbGFncyAgICAgICAgICAqLyBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAotCS8qIHRwX2RvYyAgICAgICAgICAgICovICJTZW1hcGhvcmUvTXV0ZXggdHlwZSIsCi0JLyogdHBfdHJhdmVyc2UgICAgICAgKi8gMCwKLQkvKiB0cF9jbGVhciAgICAgICAgICAqLyAwLAotCS8qIHRwX3JpY2hjb21wYXJlICAgICovIDAsCi0JLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8gMCwKLQkvKiB0cF9pdGVyICAgICAgICAgICAqLyAwLAotCS8qIHRwX2l0ZXJuZXh0ICAgICAgICovIDAsCi0JLyogdHBfbWV0aG9kcyAgICAgICAgKi8gc2VtbG9ja19tZXRob2RzLAotCS8qIHRwX21lbWJlcnMgICAgICAgICovIHNlbWxvY2tfbWVtYmVycywKLQkvKiB0cF9nZXRzZXQgICAgICAgICAqLyAwLAotCS8qIHRwX2Jhc2UgICAgICAgICAgICovIDAsCi0JLyogdHBfZGljdCAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9kZXNjcl9nZXQgICAgICAqLyAwLAotCS8qIHRwX2Rlc2NyX3NldCAgICAgICovIDAsCi0JLyogdHBfZGljdG9mZnNldCAgICAgKi8gMCwKLQkvKiB0cF9pbml0ICAgICAgICAgICAqLyAwLAotCS8qIHRwX2FsbG9jICAgICAgICAgICovIDAsCi0JLyogdHBfbmV3ICAgICAgICAgICAgKi8gc2VtbG9ja19uZXcsCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgLyogdHBfbmFtZSAgICAgICAgICAgKi8gIl9tdWx0aXByb2Nlc3NpbmcuU2VtTG9jayIsCisgICAgLyogdHBfYmFzaWNzaXplICAgICAgKi8gc2l6ZW9mKFNlbUxvY2tPYmplY3QpLAorICAgIC8qIHRwX2l0ZW1zaXplICAgICAgICovIDAsCisgICAgLyogdHBfZGVhbGxvYyAgICAgICAgKi8gKGRlc3RydWN0b3Ipc2VtbG9ja19kZWFsbG9jLAorICAgIC8qIHRwX3ByaW50ICAgICAgICAgICovIDAsCisgICAgLyogdHBfZ2V0YXR0ciAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9zZXRhdHRyICAgICAgICAqLyAwLAorICAgIC8qIHRwX2NvbXBhcmUgICAgICAgICovIDAsCisgICAgLyogdHBfcmVwciAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9hc19udW1iZXIgICAgICAqLyAwLAorICAgIC8qIHRwX2FzX3NlcXVlbmNlICAgICovIDAsCisgICAgLyogdHBfYXNfbWFwcGluZyAgICAgKi8gMCwKKyAgICAvKiB0cF9oYXNoICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2NhbGwgICAgICAgICAgICovIDAsCisgICAgLyogdHBfc3RyICAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9nZXRhdHRybyAgICAgICAqLyAwLAorICAgIC8qIHRwX3NldGF0dHJvICAgICAgICovIDAsCisgICAgLyogdHBfYXNfYnVmZmVyICAgICAgKi8gMCwKKyAgICAvKiB0cF9mbGFncyAgICAgICAgICAqLyBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAorICAgIC8qIHRwX2RvYyAgICAgICAgICAgICovICJTZW1hcGhvcmUvTXV0ZXggdHlwZSIsCisgICAgLyogdHBfdHJhdmVyc2UgICAgICAgKi8gMCwKKyAgICAvKiB0cF9jbGVhciAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX3JpY2hjb21wYXJlICAgICovIDAsCisgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8gMCwKKyAgICAvKiB0cF9pdGVyICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2l0ZXJuZXh0ICAgICAgICovIDAsCisgICAgLyogdHBfbWV0aG9kcyAgICAgICAgKi8gc2VtbG9ja19tZXRob2RzLAorICAgIC8qIHRwX21lbWJlcnMgICAgICAgICovIHNlbWxvY2tfbWVtYmVycywKKyAgICAvKiB0cF9nZXRzZXQgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2Jhc2UgICAgICAgICAgICovIDAsCisgICAgLyogdHBfZGljdCAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kZXNjcl9nZXQgICAgICAqLyAwLAorICAgIC8qIHRwX2Rlc2NyX3NldCAgICAgICovIDAsCisgICAgLyogdHBfZGljdG9mZnNldCAgICAgKi8gMCwKKyAgICAvKiB0cF9pbml0ICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2FsbG9jICAgICAgICAgICovIDAsCisgICAgLyogdHBfbmV3ICAgICAgICAgICAgKi8gc2VtbG9ja19uZXcsCiB9OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3NvY2tldF9jb25uZWN0aW9uLmMgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc29ja2V0X2Nvbm5lY3Rpb24uYwppbmRleCBhZDQwMDViLi43ZWJmMzM4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc29ja2V0X2Nvbm5lY3Rpb24uYworKysgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc29ja2V0X2Nvbm5lY3Rpb24uYwpAQCAtMjUsNDUgKzI1LDQ1IEBACiBzdGF0aWMgUHlfc3NpemVfdAogX2Nvbm5fc2VuZGFsbChIQU5ETEUgaCwgY2hhciAqc3RyaW5nLCBzaXplX3QgbGVuZ3RoKQogewotCWNoYXIgKnAgPSBzdHJpbmc7Ci0JUHlfc3NpemVfdCByZXM7CisgICAgY2hhciAqcCA9IHN0cmluZzsKKyAgICBQeV9zc2l6ZV90IHJlczsKIAotCXdoaWxlIChsZW5ndGggPiAwKSB7Ci0JCXJlcyA9IFdSSVRFKGgsIHAsIGxlbmd0aCk7Ci0JCWlmIChyZXMgPCAwKQotCQkJcmV0dXJuIE1QX1NPQ0tFVF9FUlJPUjsKLQkJbGVuZ3RoIC09IHJlczsKLQkJcCArPSByZXM7Ci0JfQorICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgICAgIHJlcyA9IFdSSVRFKGgsIHAsIGxlbmd0aCk7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE1QX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgbGVuZ3RoIC09IHJlczsKKyAgICAgICAgcCArPSByZXM7CisgICAgfQogCi0JcmV0dXJuIE1QX1NVQ0NFU1M7CisgICAgcmV0dXJuIE1QX1NVQ0NFU1M7CiB9CiAKIC8qCi0gKiBSZWNlaXZlIHN0cmluZyBvZiBleGFjdCBsZW5ndGggZnJvbSBmaWxlIGRlc2NyaXB0b3IgCisgKiBSZWNlaXZlIHN0cmluZyBvZiBleGFjdCBsZW5ndGggZnJvbSBmaWxlIGRlc2NyaXB0b3IKICAqLwogCiBzdGF0aWMgUHlfc3NpemVfdAogX2Nvbm5fcmVjdmFsbChIQU5ETEUgaCwgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQogewotCXNpemVfdCByZW1haW5pbmcgPSBsZW5ndGg7Ci0JUHlfc3NpemVfdCB0ZW1wOwotCWNoYXIgKnAgPSBidWZmZXI7CisgICAgc2l6ZV90IHJlbWFpbmluZyA9IGxlbmd0aDsKKyAgICBQeV9zc2l6ZV90IHRlbXA7CisgICAgY2hhciAqcCA9IGJ1ZmZlcjsKIAotCXdoaWxlIChyZW1haW5pbmcgPiAwKSB7Ci0JCXRlbXAgPSBSRUFEKGgsIHAsIHJlbWFpbmluZyk7Ci0JCWlmICh0ZW1wIDw9IDApIHsKLQkJCWlmICh0ZW1wID09IDApCi0JCQkJcmV0dXJuIHJlbWFpbmluZyA9PSBsZW5ndGggPyAKLQkJCQkJTVBfRU5EX09GX0ZJTEUgOiBNUF9FQVJMWV9FTkRfT0ZfRklMRTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdGVtcDsKLQkJfQotCQlyZW1haW5pbmcgLT0gdGVtcDsKLQkJcCArPSB0ZW1wOwotCX0KKyAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICB0ZW1wID0gUkVBRChoLCBwLCByZW1haW5pbmcpOworICAgICAgICBpZiAodGVtcCA8PSAwKSB7CisgICAgICAgICAgICBpZiAodGVtcCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZW1haW5pbmcgPT0gbGVuZ3RoID8KKyAgICAgICAgICAgICAgICAgICAgTVBfRU5EX09GX0ZJTEUgOiBNUF9FQVJMWV9FTkRfT0ZfRklMRTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVtcDsKKyAgICAgICAgfQorICAgICAgICByZW1haW5pbmcgLT0gdGVtcDsKKyAgICAgICAgcCArPSB0ZW1wOworICAgIH0KIAotCXJldHVybiBNUF9TVUNDRVNTOworICAgIHJldHVybiBNUF9TVUNDRVNTOwogfQogCiAvKgpAQCAtNzMsMzggKzczLDM4IEBACiBzdGF0aWMgUHlfc3NpemVfdAogY29ubl9zZW5kX3N0cmluZyhDb25uZWN0aW9uT2JqZWN0ICpjb25uLCBjaGFyICpzdHJpbmcsIHNpemVfdCBsZW5ndGgpCiB7Ci0JUHlfc3NpemVfdCByZXM7Ci0JLyogVGhlICJoZWFkZXIiIG9mIHRoZSBtZXNzYWdlIGlzIGEgMzIgYml0IHVuc2lnbmVkIG51bWJlciAoaW4KLQkgICBuZXR3b3JrIG9yZGVyKSB3aGljaCBzcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgImJvZHkiLiAgSWYKLQkgICB0aGUgbWVzc2FnZSBpcyBzaG9ydGVyIHRoYW4gYWJvdXQgMTZrYiB0aGVuIGl0IGlzIHF1aWNrZXIgdG8KLQkgICBjb21iaW5lIHRoZSAiaGVhZGVyIiBhbmQgdGhlICJib2R5IiBvZiB0aGUgbWVzc2FnZSBhbmQgc2VuZAotCSAgIHRoZW0gYXQgb25jZS4gKi8KLQlpZiAobGVuZ3RoIDwgKDE2KjEwMjQpKSB7Ci0JCWNoYXIgKm1lc3NhZ2U7CisgICAgUHlfc3NpemVfdCByZXM7CisgICAgLyogVGhlICJoZWFkZXIiIG9mIHRoZSBtZXNzYWdlIGlzIGEgMzIgYml0IHVuc2lnbmVkIG51bWJlciAoaW4KKyAgICAgICBuZXR3b3JrIG9yZGVyKSB3aGljaCBzcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aGUgImJvZHkiLiAgSWYKKyAgICAgICB0aGUgbWVzc2FnZSBpcyBzaG9ydGVyIHRoYW4gYWJvdXQgMTZrYiB0aGVuIGl0IGlzIHF1aWNrZXIgdG8KKyAgICAgICBjb21iaW5lIHRoZSAiaGVhZGVyIiBhbmQgdGhlICJib2R5IiBvZiB0aGUgbWVzc2FnZSBhbmQgc2VuZAorICAgICAgIHRoZW0gYXQgb25jZS4gKi8KKyAgICBpZiAobGVuZ3RoIDwgKDE2KjEwMjQpKSB7CisgICAgICAgIGNoYXIgKm1lc3NhZ2U7CiAKLQkJbWVzc2FnZSA9IFB5TWVtX01hbGxvYyhsZW5ndGgrNCk7Ci0JCWlmIChtZXNzYWdlID09IE5VTEwpCi0JCQlyZXR1cm4gTVBfTUVNT1JZX0VSUk9SOworICAgICAgICBtZXNzYWdlID0gUHlNZW1fTWFsbG9jKGxlbmd0aCs0KTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBNUF9NRU1PUllfRVJST1I7CiAKLQkJKihVSU5UMzIqKW1lc3NhZ2UgPSBodG9ubCgoVUlOVDMyKWxlbmd0aCk7ICAgICAKLQkJbWVtY3B5KG1lc3NhZ2UrNCwgc3RyaW5nLCBsZW5ndGgpOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJlcyA9IF9jb25uX3NlbmRhbGwoY29ubi0+aGFuZGxlLCBtZXNzYWdlLCBsZW5ndGgrNCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCVB5TWVtX0ZyZWUobWVzc2FnZSk7Ci0JfSBlbHNlIHsKLQkJVUlOVDMyIGxlbmJ1ZmY7CisgICAgICAgICooVUlOVDMyKiltZXNzYWdlID0gaHRvbmwoKFVJTlQzMilsZW5ndGgpOworICAgICAgICBtZW1jcHkobWVzc2FnZSs0LCBzdHJpbmcsIGxlbmd0aCk7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmVzID0gX2Nvbm5fc2VuZGFsbChjb25uLT5oYW5kbGUsIG1lc3NhZ2UsIGxlbmd0aCs0KTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlNZW1fRnJlZShtZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBVSU5UMzIgbGVuYnVmZjsKIAotCQlpZiAobGVuZ3RoID4gTUFYX01FU1NBR0VfTEVOR1RIKQotCQkJcmV0dXJuIE1QX0JBRF9NRVNTQUdFX0xFTkdUSDsKKyAgICAgICAgaWYgKGxlbmd0aCA+IE1BWF9NRVNTQUdFX0xFTkdUSCkKKyAgICAgICAgICAgIHJldHVybiBNUF9CQURfTUVTU0FHRV9MRU5HVEg7CiAKLQkJbGVuYnVmZiA9IGh0b25sKChVSU5UMzIpbGVuZ3RoKTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXMgPSBfY29ubl9zZW5kYWxsKGNvbm4tPmhhbmRsZSwgKGNoYXIqKSZsZW5idWZmLCA0KSB8fCAKLQkJCV9jb25uX3NlbmRhbGwoY29ubi0+aGFuZGxlLCBzdHJpbmcsIGxlbmd0aCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCXJldHVybiByZXM7CisgICAgICAgIGxlbmJ1ZmYgPSBodG9ubCgoVUlOVDMyKWxlbmd0aCk7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmVzID0gX2Nvbm5fc2VuZGFsbChjb25uLT5oYW5kbGUsIChjaGFyKikmbGVuYnVmZiwgNCkgfHwKKyAgICAgICAgICAgIF9jb25uX3NlbmRhbGwoY29ubi0+aGFuZGxlLCBzdHJpbmcsIGxlbmd0aCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIC8qCkBAIC0xMTQsMzggKzExNCwzOCBAQAogICovCiAKIHN0YXRpYyBQeV9zc2l6ZV90Ci1jb25uX3JlY3Zfc3RyaW5nKENvbm5lY3Rpb25PYmplY3QgKmNvbm4sIGNoYXIgKmJ1ZmZlciwgCi0JCSBzaXplX3QgYnVmbGVuZ3RoLCBjaGFyICoqbmV3YnVmZmVyLCBzaXplX3QgbWF4bGVuZ3RoKQorY29ubl9yZWN2X3N0cmluZyhDb25uZWN0aW9uT2JqZWN0ICpjb25uLCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgIHNpemVfdCBidWZsZW5ndGgsIGNoYXIgKipuZXdidWZmZXIsIHNpemVfdCBtYXhsZW5ndGgpCiB7Ci0JaW50IHJlczsKLQlVSU5UMzIgdWxlbmd0aDsKKyAgICBpbnQgcmVzOworICAgIFVJTlQzMiB1bGVuZ3RoOwogCi0JKm5ld2J1ZmZlciA9IE5VTEw7CisgICAgKm5ld2J1ZmZlciA9IE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gX2Nvbm5fcmVjdmFsbChjb25uLT5oYW5kbGUsIChjaGFyKikmdWxlbmd0aCwgNCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHJlczsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gX2Nvbm5fcmVjdmFsbChjb25uLT5oYW5kbGUsIChjaGFyKikmdWxlbmd0aCwgNCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKIAotCXVsZW5ndGggPSBudG9obCh1bGVuZ3RoKTsKLQlpZiAodWxlbmd0aCA+IG1heGxlbmd0aCkKLQkJcmV0dXJuIE1QX0JBRF9NRVNTQUdFX0xFTkdUSDsKKyAgICB1bGVuZ3RoID0gbnRvaGwodWxlbmd0aCk7CisgICAgaWYgKHVsZW5ndGggPiBtYXhsZW5ndGgpCisgICAgICAgIHJldHVybiBNUF9CQURfTUVTU0FHRV9MRU5HVEg7CiAKLQlpZiAodWxlbmd0aCA8PSBidWZsZW5ndGgpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgYnVmZmVyLCAoc2l6ZV90KXVsZW5ndGgpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlyZXR1cm4gcmVzIDwgMCA/IHJlcyA6IHVsZW5ndGg7Ci0JfSBlbHNlIHsKLQkJKm5ld2J1ZmZlciA9IFB5TWVtX01hbGxvYygoc2l6ZV90KXVsZW5ndGgpOwotCQlpZiAoKm5ld2J1ZmZlciA9PSBOVUxMKQotCQkJcmV0dXJuIE1QX01FTU9SWV9FUlJPUjsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgKm5ld2J1ZmZlciwgKHNpemVfdCl1bGVuZ3RoKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJcmV0dXJuIHJlcyA8IDAgPyAoUHlfc3NpemVfdClyZXMgOiAoUHlfc3NpemVfdCl1bGVuZ3RoOwotCX0KKyAgICBpZiAodWxlbmd0aCA8PSBidWZsZW5ndGgpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgYnVmZmVyLCAoc2l6ZV90KXVsZW5ndGgpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICByZXR1cm4gcmVzIDwgMCA/IHJlcyA6IHVsZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm5ld2J1ZmZlciA9IFB5TWVtX01hbGxvYygoc2l6ZV90KXVsZW5ndGgpOworICAgICAgICBpZiAoKm5ld2J1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE1QX01FTU9SWV9FUlJPUjsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgKm5ld2J1ZmZlciwgKHNpemVfdCl1bGVuZ3RoKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmV0dXJuIHJlcyA8IDAgPyAoUHlfc3NpemVfdClyZXMgOiAoUHlfc3NpemVfdCl1bGVuZ3RoOworICAgIH0KIH0KIAogLyoKQEAgLTE1NSw0MSArMTU1LDQxIEBACiBzdGF0aWMgaW50CiBjb25uX3BvbGwoQ29ubmVjdGlvbk9iamVjdCAqY29ubiwgZG91YmxlIHRpbWVvdXQsIFB5VGhyZWFkU3RhdGUgKl9zYXZlKQogewotCWludCByZXM7Ci0JZmRfc2V0IHJmZHM7CisgICAgaW50IHJlczsKKyAgICBmZF9zZXQgcmZkczsKIAotCS8qCi0JICogVmVyaWZ5IHRoZSBoYW5kbGUsIGlzc3VlIDMzMjEuIE5vdCByZXF1aXJlZCBmb3Igd2luZG93cy4KLQkgKi8gCi0JI2lmbmRlZiBNU19XSU5ET1dTCi0JCWlmICgoKGludCljb25uLT5oYW5kbGUpIDwgMCB8fCAoKGludCljb25uLT5oYW5kbGUpID49IEZEX1NFVFNJWkUpIHsKLQkJCVB5X0JMT0NLX1RIUkVBRFMKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiaGFuZGxlIG91dCBvZiByYW5nZSBpbiBzZWxlY3QoKSIpOwotCQkJUHlfVU5CTE9DS19USFJFQURTCi0JCQlyZXR1cm4gTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVDsKLQkJfQotCSNlbmRpZgorICAgIC8qCisgICAgICogVmVyaWZ5IHRoZSBoYW5kbGUsIGlzc3VlIDMzMjEuIE5vdCByZXF1aXJlZCBmb3Igd2luZG93cy4KKyAgICAgKi8KKyAgICAjaWZuZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgaWYgKCgoaW50KWNvbm4tPmhhbmRsZSkgPCAwIHx8ICgoaW50KWNvbm4tPmhhbmRsZSkgPj0gRkRfU0VUU0laRSkgeworICAgICAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJoYW5kbGUgb3V0IG9mIHJhbmdlIGluIHNlbGVjdCgpIik7CisgICAgICAgICAgICBQeV9VTkJMT0NLX1RIUkVBRFMKKyAgICAgICAgICAgIHJldHVybiBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOworICAgICAgICB9CisgICAgI2VuZGlmCiAKLQlGRF9aRVJPKCZyZmRzKTsKLQlGRF9TRVQoKFNPQ0tFVCljb25uLT5oYW5kbGUsICZyZmRzKTsKKyAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICBGRF9TRVQoKFNPQ0tFVCljb25uLT5oYW5kbGUsICZyZmRzKTsKIAotCWlmICh0aW1lb3V0IDwgMC4wKSB7Ci0JCXJlcyA9IHNlbGVjdCgoaW50KWNvbm4tPmhhbmRsZSsxLCAmcmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHRpbWV2YWwgdHY7Ci0JCXR2LnR2X3NlYyA9IChsb25nKXRpbWVvdXQ7Ci0JCXR2LnR2X3VzZWMgPSAobG9uZykoKHRpbWVvdXQgLSB0di50dl9zZWMpICogMWU2ICsgMC41KTsKLQkJcmVzID0gc2VsZWN0KChpbnQpY29ubi0+aGFuZGxlKzEsICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpOwotCX0KKyAgICBpZiAodGltZW91dCA8IDAuMCkgeworICAgICAgICByZXMgPSBzZWxlY3QoKGludCljb25uLT5oYW5kbGUrMSwgJnJmZHMsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICB0di50dl9zZWMgPSAobG9uZyl0aW1lb3V0OworICAgICAgICB0di50dl91c2VjID0gKGxvbmcpKCh0aW1lb3V0IC0gdHYudHZfc2VjKSAqIDFlNiArIDAuNSk7CisgICAgICAgIHJlcyA9IHNlbGVjdCgoaW50KWNvbm4tPmhhbmRsZSsxLCAmcmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKyAgICB9CiAKLQlpZiAocmVzIDwgMCkgewotCQlyZXR1cm4gTVBfU09DS0VUX0VSUk9SOwotCX0gZWxzZSBpZiAoRkRfSVNTRVQoY29ubi0+aGFuZGxlLCAmcmZkcykpIHsKLQkJcmV0dXJuIFRSVUU7Ci0JfSBlbHNlIHsKLQkJYXNzZXJ0KHJlcyA9PSAwKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICByZXR1cm4gTVBfU09DS0VUX0VSUk9SOworICAgIH0gZWxzZSBpZiAoRkRfSVNTRVQoY29ubi0+aGFuZGxlLCAmcmZkcykpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KHJlcyA9PSAwKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy93aW4zMl9mdW5jdGlvbnMuYyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy93aW4zMl9mdW5jdGlvbnMuYwppbmRleCA1YzZjODE3Li4xNjY2YWE5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvd2luMzJfZnVuY3Rpb25zLmMKKysrIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3dpbjMyX2Z1bmN0aW9ucy5jCkBAIC0xOSwyNDggKzE5LDI0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbjMyX0Nsb3NlSGFuZGxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIQU5ETEUgaE9iamVjdDsKLQlCT09MIHN1Y2Nlc3M7CisgICAgSEFORExFIGhPYmplY3Q7CisgICAgQk9PTCBzdWNjZXNzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfSEFORExFLCAmaE9iamVjdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBGX0hBTkRMRSwgJmhPYmplY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzdWNjZXNzID0gQ2xvc2VIYW5kbGUoaE9iamVjdCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgc3VjY2VzcyA9IENsb3NlSGFuZGxlKGhPYmplY3QpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoIXN1Y2Nlc3MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luMzJfQ29ubmVjdE5hbWVkUGlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEFORExFIGhOYW1lZFBpcGU7Ci0JTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZDsKLQlCT09MIHN1Y2Nlc3M7CisgICAgSEFORExFIGhOYW1lZFBpcGU7CisgICAgTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZDsKKyAgICBCT09MIHN1Y2Nlc3M7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9IQU5ETEUgRl9QT0lOVEVSLAotCQkJICAgICAgJmhOYW1lZFBpcGUsICZscE92ZXJsYXBwZWQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9IQU5ETEUgRl9QT0lOVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaE5hbWVkUGlwZSwgJmxwT3ZlcmxhcHBlZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXN1Y2Nlc3MgPSBDb25uZWN0TmFtZWRQaXBlKGhOYW1lZFBpcGUsIGxwT3ZlcmxhcHBlZCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgc3VjY2VzcyA9IENvbm5lY3ROYW1lZFBpcGUoaE5hbWVkUGlwZSwgbHBPdmVybGFwcGVkKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKCFzdWNjZXNzKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbjMyX0NyZWF0ZUZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUxQQ1RTVFIgbHBGaWxlTmFtZTsKLQlEV09SRCBkd0Rlc2lyZWRBY2Nlc3M7Ci0JRFdPUkQgZHdTaGFyZU1vZGU7Ci0JTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwU2VjdXJpdHlBdHRyaWJ1dGVzOwotCURXT1JEIGR3Q3JlYXRpb25EaXNwb3NpdGlvbjsKLQlEV09SRCBkd0ZsYWdzQW5kQXR0cmlidXRlczsKLQlIQU5ETEUgaFRlbXBsYXRlRmlsZTsKLQlIQU5ETEUgaGFuZGxlOworICAgIExQQ1RTVFIgbHBGaWxlTmFtZTsKKyAgICBEV09SRCBkd0Rlc2lyZWRBY2Nlc3M7CisgICAgRFdPUkQgZHdTaGFyZU1vZGU7CisgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwU2VjdXJpdHlBdHRyaWJ1dGVzOworICAgIERXT1JEIGR3Q3JlYXRpb25EaXNwb3NpdGlvbjsKKyAgICBEV09SRCBkd0ZsYWdzQW5kQXR0cmlidXRlczsKKyAgICBIQU5ETEUgaFRlbXBsYXRlRmlsZTsKKyAgICBIQU5ETEUgaGFuZGxlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiBGX0RXT1JEIEZfRFdPUkQgRl9QT0lOVEVSCi0JCQkgICAgICBGX0RXT1JEIEZfRFdPUkQgRl9IQU5ETEUsCi0JCQkgICAgICAmbHBGaWxlTmFtZSwgJmR3RGVzaXJlZEFjY2VzcywgJmR3U2hhcmVNb2RlLAotCQkJICAgICAgJmxwU2VjdXJpdHlBdHRyaWJ1dGVzLCAmZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLAotCQkJICAgICAgJmR3RmxhZ3NBbmRBdHRyaWJ1dGVzLCAmaFRlbXBsYXRlRmlsZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIgRl9EV09SRCBGX0RXT1JEIEZfUE9JTlRFUgorICAgICAgICAgICAgICAgICAgICAgICAgICBGX0RXT1JEIEZfRFdPUkQgRl9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZscEZpbGVOYW1lLCAmZHdEZXNpcmVkQWNjZXNzLCAmZHdTaGFyZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZscFNlY3VyaXR5QXR0cmlidXRlcywgJmR3Q3JlYXRpb25EaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR3RmxhZ3NBbmRBdHRyaWJ1dGVzLCAmaFRlbXBsYXRlRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWhhbmRsZSA9IENyZWF0ZUZpbGUobHBGaWxlTmFtZSwgZHdEZXNpcmVkQWNjZXNzLAotCQkJICAgIGR3U2hhcmVNb2RlLCBscFNlY3VyaXR5QXR0cmlidXRlcywKLQkJCSAgICBkd0NyZWF0aW9uRGlzcG9zaXRpb24sCi0JCQkgICAgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIGhUZW1wbGF0ZUZpbGUpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGhhbmRsZSA9IENyZWF0ZUZpbGUobHBGaWxlTmFtZSwgZHdEZXNpcmVkQWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgZHdTaGFyZU1vZGUsIGxwU2VjdXJpdHlBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIGhUZW1wbGF0ZUZpbGUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoRl9IQU5ETEUsIGhhbmRsZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoRl9IQU5ETEUsIGhhbmRsZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW4zMl9DcmVhdGVOYW1lZFBpcGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUxQQ1RTVFIgbHBOYW1lOwotCURXT1JEIGR3T3Blbk1vZGU7Ci0JRFdPUkQgZHdQaXBlTW9kZTsKLQlEV09SRCBuTWF4SW5zdGFuY2VzOwotCURXT1JEIG5PdXRCdWZmZXJTaXplOwotCURXT1JEIG5JbkJ1ZmZlclNpemU7Ci0JRFdPUkQgbkRlZmF1bHRUaW1lT3V0OwotCUxQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY3VyaXR5QXR0cmlidXRlczsKLQlIQU5ETEUgaGFuZGxlOworICAgIExQQ1RTVFIgbHBOYW1lOworICAgIERXT1JEIGR3T3Blbk1vZGU7CisgICAgRFdPUkQgZHdQaXBlTW9kZTsKKyAgICBEV09SRCBuTWF4SW5zdGFuY2VzOworICAgIERXT1JEIG5PdXRCdWZmZXJTaXplOworICAgIERXT1JEIG5JbkJ1ZmZlclNpemU7CisgICAgRFdPUkQgbkRlZmF1bHRUaW1lT3V0OworICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY3VyaXR5QXR0cmlidXRlczsKKyAgICBIQU5ETEUgaGFuZGxlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiBGX0RXT1JEIEZfRFdPUkQgRl9EV09SRAotCQkJICAgICAgRl9EV09SRCBGX0RXT1JEIEZfRFdPUkQgRl9QT0lOVEVSLAotCQkJICAgICAgJmxwTmFtZSwgJmR3T3Blbk1vZGUsICZkd1BpcGVNb2RlLAotCQkJICAgICAgJm5NYXhJbnN0YW5jZXMsICZuT3V0QnVmZmVyU2l6ZSwKLQkJCSAgICAgICZuSW5CdWZmZXJTaXplLCAmbkRlZmF1bHRUaW1lT3V0LAotCQkJICAgICAgJmxwU2VjdXJpdHlBdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiBGX0RXT1JEIEZfRFdPUkQgRl9EV09SRAorICAgICAgICAgICAgICAgICAgICAgICAgICBGX0RXT1JEIEZfRFdPUkQgRl9EV09SRCBGX1BPSU5URVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZscE5hbWUsICZkd09wZW5Nb2RlLCAmZHdQaXBlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5NYXhJbnN0YW5jZXMsICZuT3V0QnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5JbkJ1ZmZlclNpemUsICZuRGVmYXVsdFRpbWVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZscFNlY3VyaXR5QXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWhhbmRsZSA9IENyZWF0ZU5hbWVkUGlwZShscE5hbWUsIGR3T3Blbk1vZGUsIGR3UGlwZU1vZGUsCi0JCQkJIG5NYXhJbnN0YW5jZXMsIG5PdXRCdWZmZXJTaXplLAotCQkJCSBuSW5CdWZmZXJTaXplLCBuRGVmYXVsdFRpbWVPdXQsCi0JCQkJIGxwU2VjdXJpdHlBdHRyaWJ1dGVzKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBoYW5kbGUgPSBDcmVhdGVOYW1lZFBpcGUobHBOYW1lLCBkd09wZW5Nb2RlLCBkd1BpcGVNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTWF4SW5zdGFuY2VzLCBuT3V0QnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkluQnVmZmVyU2l6ZSwgbkRlZmF1bHRUaW1lT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscFNlY3VyaXR5QXR0cmlidXRlcyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICBpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZShGX0hBTkRMRSwgaGFuZGxlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZShGX0hBTkRMRSwgaGFuZGxlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbjMyX0V4aXRQcm9jZXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlVSU5UIHVFeGl0Q29kZTsKKyAgICBVSU5UIHVFeGl0Q29kZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSSIsICZ1RXhpdENvZGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkkiLCAmdUV4aXRDb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkjaWYgZGVmaW5lZChQeV9ERUJVRykKLQkJU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlN8U0VNX05PQUxJR05NRU5URkFVTFRFWENFUFR8U0VNX05PR1BGQVVMVEVSUk9SQk9YfFNFTV9OT09QRU5GSUxFRVJST1JCT1gpOwotCQlfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX0FTU0VSVCwgX0NSVERCR19NT0RFX0RFQlVHKTsKLQkjZW5kaWYKKyAgICAjaWYgZGVmaW5lZChQeV9ERUJVRykKKyAgICAgICAgU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlN8U0VNX05PQUxJR05NRU5URkFVTFRFWENFUFR8U0VNX05PR1BGQVVMVEVSUk9SQk9YfFNFTV9OT09QRU5GSUxFRVJST1JCT1gpOworICAgICAgICBfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX0FTU0VSVCwgX0NSVERCR19NT0RFX0RFQlVHKTsKKyAgICAjZW5kaWYKIAogCi0JRXhpdFByb2Nlc3ModUV4aXRDb2RlKTsKKyAgICBFeGl0UHJvY2Vzcyh1RXhpdENvZGUpOwogCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW4zMl9HZXRMYXN0RXJyb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKEZfRFdPUkQsIEdldExhc3RFcnJvcigpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZShGX0RXT1JELCBHZXRMYXN0RXJyb3IoKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW4zMl9PcGVuUHJvY2VzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JRFdPUkQgZHdEZXNpcmVkQWNjZXNzOwotCUJPT0wgYkluaGVyaXRIYW5kbGU7Ci0JRFdPUkQgZHdQcm9jZXNzSWQ7Ci0JSEFORExFIGhhbmRsZTsKKyAgICBEV09SRCBkd0Rlc2lyZWRBY2Nlc3M7CisgICAgQk9PTCBiSW5oZXJpdEhhbmRsZTsKKyAgICBEV09SRCBkd1Byb2Nlc3NJZDsKKyAgICBIQU5ETEUgaGFuZGxlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfRFdPUkQgImkiIEZfRFdPUkQsCi0JCQkgICAgICAmZHdEZXNpcmVkQWNjZXNzLCAmYkluaGVyaXRIYW5kbGUsICZkd1Byb2Nlc3NJZCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBGX0RXT1JEICJpIiBGX0RXT1JELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHdEZXNpcmVkQWNjZXNzLCAmYkluaGVyaXRIYW5kbGUsICZkd1Byb2Nlc3NJZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaGFuZGxlID0gT3BlblByb2Nlc3MoZHdEZXNpcmVkQWNjZXNzLCBiSW5oZXJpdEhhbmRsZSwgZHdQcm9jZXNzSWQpOwotCWlmIChoYW5kbGUgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgIGhhbmRsZSA9IE9wZW5Qcm9jZXNzKGR3RGVzaXJlZEFjY2VzcywgYkluaGVyaXRIYW5kbGUsIGR3UHJvY2Vzc0lkKTsKKyAgICBpZiAoaGFuZGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKEZfSEFORExFLCBoYW5kbGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKEZfSEFORExFLCBoYW5kbGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luMzJfU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhBTkRMRSBoTmFtZWRQaXBlOwotCVB5T2JqZWN0ICpvQXJnc1szXTsKLQlEV09SRCBkd0FyZ3NbM10sICpwQXJnc1szXSA9IHtOVUxMLCBOVUxMLCBOVUxMfTsKLQlpbnQgaTsKKyAgICBIQU5ETEUgaE5hbWVkUGlwZTsKKyAgICBQeU9iamVjdCAqb0FyZ3NbM107CisgICAgRFdPUkQgZHdBcmdzWzNdLCAqcEFyZ3NbM10gPSB7TlVMTCwgTlVMTCwgTlVMTH07CisgICAgaW50IGk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9IQU5ETEUgIk9PTyIsCi0JCQkgICAgICAmaE5hbWVkUGlwZSwgJm9BcmdzWzBdLCAmb0FyZ3NbMV0sICZvQXJnc1syXSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBGX0hBTkRMRSAiT09PIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhOYW1lZFBpcGUsICZvQXJnc1swXSwgJm9BcmdzWzFdLCAmb0FyZ3NbMl0pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5RXJyX0NsZWFyKCk7CisgICAgUHlFcnJfQ2xlYXIoKTsKIAotCWZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgewotCQlpZiAob0FyZ3NbaV0gIT0gUHlfTm9uZSkgewotCQkJZHdBcmdzW2ldID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG9BcmdzW2ldKTsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiBOVUxMOwotCQkJcEFyZ3NbaV0gPSAmZHdBcmdzW2ldOwotCQl9Ci0JfQorICAgIGZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgeworICAgICAgICBpZiAob0FyZ3NbaV0gIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgZHdBcmdzW2ldID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG9BcmdzW2ldKTsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcEFyZ3NbaV0gPSAmZHdBcmdzW2ldOworICAgICAgICB9CisgICAgfQogCi0JaWYgKCFTZXROYW1lZFBpcGVIYW5kbGVTdGF0ZShoTmFtZWRQaXBlLCBwQXJnc1swXSwgcEFyZ3NbMV0sIHBBcmdzWzJdKSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgIGlmICghU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUoaE5hbWVkUGlwZSwgcEFyZ3NbMF0sIHBBcmdzWzFdLCBwQXJnc1syXSkpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luMzJfV2FpdE5hbWVkUGlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JTFBDVFNUUiBscE5hbWVkUGlwZU5hbWU7Ci0JRFdPUkQgblRpbWVPdXQ7Ci0JQk9PTCBzdWNjZXNzOworICAgIExQQ1RTVFIgbHBOYW1lZFBpcGVOYW1lOworICAgIERXT1JEIG5UaW1lT3V0OworICAgIEJPT0wgc3VjY2VzczsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIgRl9EV09SRCwgJmxwTmFtZWRQaXBlTmFtZSwgJm5UaW1lT3V0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiBGX0RXT1JELCAmbHBOYW1lZFBpcGVOYW1lLCAmblRpbWVPdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzdWNjZXNzID0gV2FpdE5hbWVkUGlwZShscE5hbWVkUGlwZU5hbWUsIG5UaW1lT3V0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzdWNjZXNzID0gV2FpdE5hbWVkUGlwZShscE5hbWVkUGlwZU5hbWUsIG5UaW1lT3V0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKCFzdWNjZXNzKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHdpbjMyX21ldGhvZHNbXSA9IHsKLQlXSU4zMl9GVU5DVElPTihDbG9zZUhhbmRsZSksCi0JV0lOMzJfRlVOQ1RJT04oR2V0TGFzdEVycm9yKSwKLQlXSU4zMl9GVU5DVElPTihPcGVuUHJvY2VzcyksCi0JV0lOMzJfRlVOQ1RJT04oRXhpdFByb2Nlc3MpLAotCVdJTjMyX0ZVTkNUSU9OKENvbm5lY3ROYW1lZFBpcGUpLAotCVdJTjMyX0ZVTkNUSU9OKENyZWF0ZUZpbGUpLAotCVdJTjMyX0ZVTkNUSU9OKENyZWF0ZU5hbWVkUGlwZSksCi0JV0lOMzJfRlVOQ1RJT04oU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUpLAotCVdJTjMyX0ZVTkNUSU9OKFdhaXROYW1lZFBpcGUpLAotCXtOVUxMfQorICAgIFdJTjMyX0ZVTkNUSU9OKENsb3NlSGFuZGxlKSwKKyAgICBXSU4zMl9GVU5DVElPTihHZXRMYXN0RXJyb3IpLAorICAgIFdJTjMyX0ZVTkNUSU9OKE9wZW5Qcm9jZXNzKSwKKyAgICBXSU4zMl9GVU5DVElPTihFeGl0UHJvY2VzcyksCisgICAgV0lOMzJfRlVOQ1RJT04oQ29ubmVjdE5hbWVkUGlwZSksCisgICAgV0lOMzJfRlVOQ1RJT04oQ3JlYXRlRmlsZSksCisgICAgV0lOMzJfRlVOQ1RJT04oQ3JlYXRlTmFtZWRQaXBlKSwKKyAgICBXSU4zMl9GVU5DVElPTihTZXROYW1lZFBpcGVIYW5kbGVTdGF0ZSksCisgICAgV0lOMzJfRlVOQ1RJT04oV2FpdE5hbWVkUGlwZSksCisgICAge05VTEx9CiB9OwogCiAKIFB5VHlwZU9iamVjdCBXaW4zMlR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCiB9OwogCiAKIFB5T2JqZWN0ICoKIGNyZWF0ZV93aW4zMl9uYW1lc3BhY2Uodm9pZCkKIHsKLQlXaW4zMlR5cGUudHBfbmFtZSA9ICJfbXVsdGlwcm9jZXNzaW5nLndpbjMyIjsKLQlXaW4zMlR5cGUudHBfbWV0aG9kcyA9IHdpbjMyX21ldGhvZHM7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmV2luMzJUeXBlKSA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRigmV2luMzJUeXBlKTsKKyAgICBXaW4zMlR5cGUudHBfbmFtZSA9ICJfbXVsdGlwcm9jZXNzaW5nLndpbjMyIjsKKyAgICBXaW4zMlR5cGUudHBfbWV0aG9kcyA9IHdpbjMyX21ldGhvZHM7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmV2luMzJUeXBlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRigmV2luMzJUeXBlKTsKIAotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX0FMUkVBRFlfRVhJU1RTKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBFUlJPUl9QSVBFX0JVU1kpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX1BJUEVfQ09OTkVDVEVEKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBFUlJPUl9TRU1fVElNRU9VVCk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgR0VORVJJQ19SRUFEKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBHRU5FUklDX1dSSVRFKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBJTkZJTklURSk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgTk1QV0FJVF9XQUlUX0ZPUkVWRVIpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIE9QRU5fRVhJU1RJTkcpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBJUEVfQUNDRVNTX0RVUExFWCk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9BQ0NFU1NfSU5CT1VORCk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9SRUFETU9ERV9NRVNTQUdFKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX1RZUEVfTUVTU0FHRSk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX1dBSVQpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBST0NFU1NfQUxMX0FDQ0VTUyk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgRVJST1JfQUxSRUFEWV9FWElTVFMpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX1BJUEVfQlVTWSk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgRVJST1JfUElQRV9DT05ORUNURUQpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX1NFTV9USU1FT1VUKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBHRU5FUklDX1JFQUQpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEdFTkVSSUNfV1JJVEUpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIElORklOSVRFKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBOTVBXQUlUX1dBSVRfRk9SRVZFUik7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgT1BFTl9FWElTVElORyk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9BQ0NFU1NfRFVQTEVYKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX0FDQ0VTU19JTkJPVU5EKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX1JFQURNT0RFX01FU1NBR0UpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBJUEVfVFlQRV9NRVNTQUdFKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBJUEVfV0FJVCk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUFJPQ0VTU19BTExfQUNDRVNTKTsKIAotCVdJTjMyX0NPTlNUQU5UKCJpIiwgTlVMTCk7CisgICAgV0lOMzJfQ09OU1RBTlQoImkiLCBOVUxMKTsKIAotCXJldHVybiAoUHlPYmplY3QqKSZXaW4zMlR5cGU7CisgICAgcmV0dXJuIChQeU9iamVjdCopJldpbjMyVHlwZTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKaW5kZXggYjQ1ZjI0My4uMmQ4MWRhZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKQEAgLTIsMjMgKzIsMjMgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUaGUgY29kZSBpbiB0aGlzIG1vZHVsZSB3YXMgYmFzZWQgb24gYSBkb3dubG9hZCBmcm9tOgotCSAgaHR0cDovL3d3dy5tYXRoLmtlaW8uYWMuanAvfm1hdHVtb3RvL01UMjAwMi9lbXQxOTkzN2FyLmh0bWwKKyAgICAgIGh0dHA6Ly93d3cubWF0aC5rZWlvLmFjLmpwL35tYXR1bW90by9NVDIwMDIvZW10MTk5Mzdhci5odG1sCiAKICAgIEl0IHdhcyBtb2RpZmllZCBpbiAyMDAyIGJ5IFJheW1vbmQgSGV0dGluZ2VyIGFzIGZvbGxvd3M6CiAKLQkqIHRoZSBwcmluY2lwYWwgY29tcHV0YXRpb25hbCBsaW5lcyB1bnRvdWNoZWQgZXhjZXB0IGZvciB0YWJiaW5nLgorICAgICogdGhlIHByaW5jaXBhbCBjb21wdXRhdGlvbmFsIGxpbmVzIHVudG91Y2hlZCBleGNlcHQgZm9yIHRhYmJpbmcuCiAKLQkqIHJlbmFtZWQgZ2VucmFuZF9yZXM1MygpIHRvIHJhbmRvbV9yYW5kb20oKSBhbmQgd3JhcHBlZAotCSAgaW4gcHl0aG9uIGNhbGxpbmcvcmV0dXJuIGNvZGUuCisgICAgKiByZW5hbWVkIGdlbnJhbmRfcmVzNTMoKSB0byByYW5kb21fcmFuZG9tKCkgYW5kIHdyYXBwZWQKKyAgICAgIGluIHB5dGhvbiBjYWxsaW5nL3JldHVybiBjb2RlLgogCi0JKiBnZW5yYW5kX2ludDMyKCkgYW5kIHRoZSBoZWxwZXIgZnVuY3Rpb25zLCBpbml0X2dlbnJhbmQoKQotCSAgYW5kIGluaXRfYnlfYXJyYXkoKSwgd2VyZSBkZWNsYXJlZCBzdGF0aWMsIHdyYXBwZWQgaW4KLQkgIFB5dGhvbiBjYWxsaW5nL3JldHVybiBjb2RlLiAgYWxzbywgdGhlaXIgZ2xvYmFsIGRhdGEKLQkgIHJlZmVyZW5jZXMgd2VyZSByZXBsYWNlZCB3aXRoIHN0cnVjdHVyZSByZWZlcmVuY2VzLgorICAgICogZ2VucmFuZF9pbnQzMigpIGFuZCB0aGUgaGVscGVyIGZ1bmN0aW9ucywgaW5pdF9nZW5yYW5kKCkKKyAgICAgIGFuZCBpbml0X2J5X2FycmF5KCksIHdlcmUgZGVjbGFyZWQgc3RhdGljLCB3cmFwcGVkIGluCisgICAgICBQeXRob24gY2FsbGluZy9yZXR1cm4gY29kZS4gIGFsc28sIHRoZWlyIGdsb2JhbCBkYXRhCisgICAgICByZWZlcmVuY2VzIHdlcmUgcmVwbGFjZWQgd2l0aCBzdHJ1Y3R1cmUgcmVmZXJlbmNlcy4KIAotCSogdW51c2VkIGZ1bmN0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCB3ZXJlIGRlbGV0ZWQuCi0JICBuZXcsIG9yaWdpbmFsIEMgcHl0aG9uIGNvZGUgd2FzIGFkZGVkIHRvIGltcGxlbWVudCB0aGUKLQkgIFJhbmRvbSgpIGludGVyZmFjZS4KKyAgICAqIHVudXNlZCBmdW5jdGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgd2VyZSBkZWxldGVkLgorICAgICAgbmV3LCBvcmlnaW5hbCBDIHB5dGhvbiBjb2RlIHdhcyBhZGRlZCB0byBpbXBsZW1lbnQgdGhlCisgICAgICBSYW5kb20oKSBpbnRlcmZhY2UuCiAKICAgIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2ZXJiYXRpbSBjb21tZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2RlOgogCkBAIC0zNiwxNSArMzYsMTUgQEAKICAgIGFyZSBtZXQ6CiAKICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLQlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCiAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0Jbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAKICAgICAgMy4gVGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotCXByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotCXBlcm1pc3Npb24uCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbi4KIAogICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwogICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKQEAgLTY3LDI0ICs2NywyNCBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2luY2x1ZGUgIlB5dGhvbi5oIgotI2luY2x1ZGUgPHRpbWUuaD4JCS8qIGZvciBzZWVkaW5nIHRvIGN1cnJlbnQgdGltZSAqLworI2luY2x1ZGUgPHRpbWUuaD4gICAgICAgICAgICAgICAvKiBmb3Igc2VlZGluZyB0byBjdXJyZW50IHRpbWUgKi8KIAogLyogUGVyaW9kIHBhcmFtZXRlcnMgLS0gVGhlc2UgYXJlIGFsbCBtYWdpYy4gIERvbid0IGNoYW5nZS4gKi8KICNkZWZpbmUgTiA2MjQKICNkZWZpbmUgTSAzOTcKLSNkZWZpbmUgTUFUUklYX0EgMHg5OTA4YjBkZlVMCS8qIGNvbnN0YW50IHZlY3RvciBhICovCisjZGVmaW5lIE1BVFJJWF9BIDB4OTkwOGIwZGZVTCAgIC8qIGNvbnN0YW50IHZlY3RvciBhICovCiAjZGVmaW5lIFVQUEVSX01BU0sgMHg4MDAwMDAwMFVMIC8qIG1vc3Qgc2lnbmlmaWNhbnQgdy1yIGJpdHMgKi8KICNkZWZpbmUgTE9XRVJfTUFTSyAweDdmZmZmZmZmVUwgLyogbGVhc3Qgc2lnbmlmaWNhbnQgciBiaXRzICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JdW5zaWduZWQgbG9uZyBzdGF0ZVtOXTsKLQlpbnQgaW5kZXg7CisgICAgUHlPYmplY3RfSEVBRAorICAgIHVuc2lnbmVkIGxvbmcgc3RhdGVbTl07CisgICAgaW50IGluZGV4OwogfSBSYW5kb21PYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUmFuZG9tX1R5cGU7CiAKLSNkZWZpbmUgUmFuZG9tT2JqZWN0X0NoZWNrKHYpCSAgIChQeV9UWVBFKHYpID09ICZSYW5kb21fVHlwZSkKKyNkZWZpbmUgUmFuZG9tT2JqZWN0X0NoZWNrKHYpICAgICAgKFB5X1RZUEUodikgPT0gJlJhbmRvbV9UeXBlKQogCiAKIC8qIFJhbmRvbSBtZXRob2RzICovCkBAIC05NCwyOCArOTQsMjggQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBnZW5yYW5kX2ludDMyKFJhbmRvbU9iamVjdCAqc2VsZikKIHsKLQl1bnNpZ25lZCBsb25nIHk7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFnMDFbMl09ezB4MFVMLCBNQVRSSVhfQX07Ci0JLyogbWFnMDFbeF0gPSB4ICogTUFUUklYX0EgIGZvciB4PTAsMSAqLwotCXVuc2lnbmVkIGxvbmcgKm10OworICAgIHVuc2lnbmVkIGxvbmcgeTsKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBtYWcwMVsyXT17MHgwVUwsIE1BVFJJWF9BfTsKKyAgICAvKiBtYWcwMVt4XSA9IHggKiBNQVRSSVhfQSAgZm9yIHg9MCwxICovCisgICAgdW5zaWduZWQgbG9uZyAqbXQ7CiAKLQltdCA9IHNlbGYtPnN0YXRlOwotCWlmIChzZWxmLT5pbmRleCA+PSBOKSB7IC8qIGdlbmVyYXRlIE4gd29yZHMgYXQgb25lIHRpbWUgKi8KLQkJaW50IGtrOworICAgIG10ID0gc2VsZi0+c3RhdGU7CisgICAgaWYgKHNlbGYtPmluZGV4ID49IE4pIHsgLyogZ2VuZXJhdGUgTiB3b3JkcyBhdCBvbmUgdGltZSAqLworICAgICAgICBpbnQga2s7CiAKLQkJZm9yIChraz0wO2trPE4tTTtraysrKSB7Ci0JCQl5ID0gKG10W2trXSZVUFBFUl9NQVNLKXwobXRba2srMV0mTE9XRVJfTUFTSyk7Ci0JCQltdFtra10gPSBtdFtraytNXSBeICh5ID4+IDEpIF4gbWFnMDFbeSAmIDB4MVVMXTsKLQkJfQotCQlmb3IgKDtrazxOLTE7a2srKykgewotCQkJeSA9IChtdFtra10mVVBQRVJfTUFTSyl8KG10W2trKzFdJkxPV0VSX01BU0spOwotCQkJbXRba2tdID0gbXRba2srKE0tTildIF4gKHkgPj4gMSkgXiBtYWcwMVt5ICYgMHgxVUxdOwotCQl9Ci0JCXkgPSAobXRbTi0xXSZVUFBFUl9NQVNLKXwobXRbMF0mTE9XRVJfTUFTSyk7Ci0JCW10W04tMV0gPSBtdFtNLTFdIF4gKHkgPj4gMSkgXiBtYWcwMVt5ICYgMHgxVUxdOworICAgICAgICBmb3IgKGtrPTA7a2s8Ti1NO2trKyspIHsKKyAgICAgICAgICAgIHkgPSAobXRba2tdJlVQUEVSX01BU0spfChtdFtraysxXSZMT1dFUl9NQVNLKTsKKyAgICAgICAgICAgIG10W2trXSA9IG10W2trK01dIF4gKHkgPj4gMSkgXiBtYWcwMVt5ICYgMHgxVUxdOworICAgICAgICB9CisgICAgICAgIGZvciAoO2trPE4tMTtraysrKSB7CisgICAgICAgICAgICB5ID0gKG10W2trXSZVUFBFUl9NQVNLKXwobXRba2srMV0mTE9XRVJfTUFTSyk7CisgICAgICAgICAgICBtdFtra10gPSBtdFtraysoTS1OKV0gXiAoeSA+PiAxKSBeIG1hZzAxW3kgJiAweDFVTF07CisgICAgICAgIH0KKyAgICAgICAgeSA9IChtdFtOLTFdJlVQUEVSX01BU0spfChtdFswXSZMT1dFUl9NQVNLKTsKKyAgICAgICAgbXRbTi0xXSA9IG10W00tMV0gXiAoeSA+PiAxKSBeIG1hZzAxW3kgJiAweDFVTF07CiAKLQkJc2VsZi0+aW5kZXggPSAwOwotCX0KKyAgICAgICAgc2VsZi0+aW5kZXggPSAwOworICAgIH0KIAogICAgIHkgPSBtdFtzZWxmLT5pbmRleCsrXTsKICAgICB5IF49ICh5ID4+IDExKTsKQEAgLTEzNywzMSArMTM3LDMxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZG9tX3JhbmRvbShSYW5kb21PYmplY3QgKnNlbGYpCiB7Ci0JdW5zaWduZWQgbG9uZyBhPWdlbnJhbmRfaW50MzIoc2VsZik+PjUsIGI9Z2VucmFuZF9pbnQzMihzZWxmKT4+NjsKLSAgICAJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoYSo2NzEwODg2NC4wK2IpKigxLjAvOTAwNzE5OTI1NDc0MDk5Mi4wKSk7CisgICAgdW5zaWduZWQgbG9uZyBhPWdlbnJhbmRfaW50MzIoc2VsZik+PjUsIGI9Z2VucmFuZF9pbnQzMihzZWxmKT4+NjsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChhKjY3MTA4ODY0LjArYikqKDEuMC85MDA3MTk5MjU0NzQwOTkyLjApKTsKIH0KIAogLyogaW5pdGlhbGl6ZXMgbXRbTl0gd2l0aCBhIHNlZWQgKi8KIHN0YXRpYyB2b2lkCiBpbml0X2dlbnJhbmQoUmFuZG9tT2JqZWN0ICpzZWxmLCB1bnNpZ25lZCBsb25nIHMpCiB7Ci0JaW50IG10aTsKLQl1bnNpZ25lZCBsb25nICptdDsKKyAgICBpbnQgbXRpOworICAgIHVuc2lnbmVkIGxvbmcgKm10OwogCi0JbXQgPSBzZWxmLT5zdGF0ZTsKLQltdFswXT0gcyAmIDB4ZmZmZmZmZmZVTDsKLQlmb3IgKG10aT0xOyBtdGk8TjsgbXRpKyspIHsKLQkJbXRbbXRpXSA9Ci0JCSgxODEyNDMzMjUzVUwgKiAobXRbbXRpLTFdIF4gKG10W210aS0xXSA+PiAzMCkpICsgbXRpKTsKLQkJLyogU2VlIEtudXRoIFRBT0NQIFZvbDIuIDNyZCBFZC4gUC4xMDYgZm9yIG11bHRpcGxpZXIuICovCi0JCS8qIEluIHRoZSBwcmV2aW91cyB2ZXJzaW9ucywgTVNCcyBvZiB0aGUgc2VlZCBhZmZlY3QgICAqLwotCQkvKiBvbmx5IE1TQnMgb2YgdGhlIGFycmF5IG10W10uIAkJICAgICAgICovCi0JCS8qIDIwMDIvMDEvMDkgbW9kaWZpZWQgYnkgTWFrb3RvIE1hdHN1bW90bwkgICAgICAgKi8KLQkJbXRbbXRpXSAmPSAweGZmZmZmZmZmVUw7Ci0JCS8qIGZvciA+MzIgYml0IG1hY2hpbmVzICovCi0JfQotCXNlbGYtPmluZGV4ID0gbXRpOwotCXJldHVybjsKKyAgICBtdCA9IHNlbGYtPnN0YXRlOworICAgIG10WzBdPSBzICYgMHhmZmZmZmZmZlVMOworICAgIGZvciAobXRpPTE7IG10aTxOOyBtdGkrKykgeworICAgICAgICBtdFttdGldID0KKyAgICAgICAgKDE4MTI0MzMyNTNVTCAqIChtdFttdGktMV0gXiAobXRbbXRpLTFdID4+IDMwKSkgKyBtdGkpOworICAgICAgICAvKiBTZWUgS251dGggVEFPQ1AgVm9sMi4gM3JkIEVkLiBQLjEwNiBmb3IgbXVsdGlwbGllci4gKi8KKyAgICAgICAgLyogSW4gdGhlIHByZXZpb3VzIHZlcnNpb25zLCBNU0JzIG9mIHRoZSBzZWVkIGFmZmVjdCAgICovCisgICAgICAgIC8qIG9ubHkgTVNCcyBvZiB0aGUgYXJyYXkgbXRbXS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIDIwMDIvMDEvMDkgbW9kaWZpZWQgYnkgTWFrb3RvIE1hdHN1bW90byAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIG10W210aV0gJj0gMHhmZmZmZmZmZlVMOworICAgICAgICAvKiBmb3IgPjMyIGJpdCBtYWNoaW5lcyAqLworICAgIH0KKyAgICBzZWxmLT5pbmRleCA9IG10aTsKKyAgICByZXR1cm47CiB9CiAKIC8qIGluaXRpYWxpemUgYnkgYW4gYXJyYXkgd2l0aCBhcnJheS1sZW5ndGggKi8KQEAgLTE3MCwyOCArMTcwLDI4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW5pdF9ieV9hcnJheShSYW5kb21PYmplY3QgKnNlbGYsIHVuc2lnbmVkIGxvbmcgaW5pdF9rZXlbXSwgdW5zaWduZWQgbG9uZyBrZXlfbGVuZ3RoKQogewotCXVuc2lnbmVkIGludCBpLCBqLCBrOwkvKiB3YXMgc2lnbmVkIGluIHRoZSBvcmlnaW5hbCBjb2RlLiBSREggMTIvMTYvMjAwMiAqLwotCXVuc2lnbmVkIGxvbmcgKm10OworICAgIHVuc2lnbmVkIGludCBpLCBqLCBrOyAgICAgICAvKiB3YXMgc2lnbmVkIGluIHRoZSBvcmlnaW5hbCBjb2RlLiBSREggMTIvMTYvMjAwMiAqLworICAgIHVuc2lnbmVkIGxvbmcgKm10OwogCi0JbXQgPSBzZWxmLT5zdGF0ZTsKLQlpbml0X2dlbnJhbmQoc2VsZiwgMTk2NTAyMThVTCk7Ci0JaT0xOyBqPTA7Ci0JayA9IChOPmtleV9sZW5ndGggPyBOIDoga2V5X2xlbmd0aCk7Ci0JZm9yICg7IGs7IGstLSkgewotCQltdFtpXSA9IChtdFtpXSBeICgobXRbaS0xXSBeIChtdFtpLTFdID4+IDMwKSkgKiAxNjY0NTI1VUwpKQotCQkJICsgaW5pdF9rZXlbal0gKyBqOyAvKiBub24gbGluZWFyICovCi0JCW10W2ldICY9IDB4ZmZmZmZmZmZVTDsgLyogZm9yIFdPUkRTSVpFID4gMzIgbWFjaGluZXMgKi8KLQkJaSsrOyBqKys7Ci0JCWlmIChpPj1OKSB7IG10WzBdID0gbXRbTi0xXTsgaT0xOyB9Ci0JCWlmIChqPj1rZXlfbGVuZ3RoKSBqPTA7Ci0JfQotCWZvciAoaz1OLTE7IGs7IGstLSkgewotCQltdFtpXSA9IChtdFtpXSBeICgobXRbaS0xXSBeIChtdFtpLTFdID4+IDMwKSkgKiAxNTY2MDgzOTQxVUwpKQotCQkJIC0gaTsgLyogbm9uIGxpbmVhciAqLwotCQltdFtpXSAmPSAweGZmZmZmZmZmVUw7IC8qIGZvciBXT1JEU0laRSA+IDMyIG1hY2hpbmVzICovCi0JCWkrKzsKLQkJaWYgKGk+PU4pIHsgbXRbMF0gPSBtdFtOLTFdOyBpPTE7IH0KLQl9CisgICAgbXQgPSBzZWxmLT5zdGF0ZTsKKyAgICBpbml0X2dlbnJhbmQoc2VsZiwgMTk2NTAyMThVTCk7CisgICAgaT0xOyBqPTA7CisgICAgayA9IChOPmtleV9sZW5ndGggPyBOIDoga2V5X2xlbmd0aCk7CisgICAgZm9yICg7IGs7IGstLSkgeworICAgICAgICBtdFtpXSA9IChtdFtpXSBeICgobXRbaS0xXSBeIChtdFtpLTFdID4+IDMwKSkgKiAxNjY0NTI1VUwpKQorICAgICAgICAgICAgICAgICArIGluaXRfa2V5W2pdICsgajsgLyogbm9uIGxpbmVhciAqLworICAgICAgICBtdFtpXSAmPSAweGZmZmZmZmZmVUw7IC8qIGZvciBXT1JEU0laRSA+IDMyIG1hY2hpbmVzICovCisgICAgICAgIGkrKzsgaisrOworICAgICAgICBpZiAoaT49TikgeyBtdFswXSA9IG10W04tMV07IGk9MTsgfQorICAgICAgICBpZiAoaj49a2V5X2xlbmd0aCkgaj0wOworICAgIH0KKyAgICBmb3IgKGs9Ti0xOyBrOyBrLS0pIHsKKyAgICAgICAgbXRbaV0gPSAobXRbaV0gXiAoKG10W2ktMV0gXiAobXRbaS0xXSA+PiAzMCkpICogMTU2NjA4Mzk0MVVMKSkKKyAgICAgICAgICAgICAgICAgLSBpOyAvKiBub24gbGluZWFyICovCisgICAgICAgIG10W2ldICY9IDB4ZmZmZmZmZmZVTDsgLyogZm9yIFdPUkRTSVpFID4gMzIgbWFjaGluZXMgKi8KKyAgICAgICAgaSsrOworICAgICAgICBpZiAoaT49TikgeyBtdFswXSA9IG10W04tMV07IGk9MTsgfQorICAgIH0KIAogICAgIG10WzBdID0gMHg4MDAwMDAwMFVMOyAvKiBNU0IgaXMgMTsgYXNzdXJpbmcgbm9uLXplcm8gaW5pdGlhbCBhcnJheSAqLwogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKQEAgLTIwNiwxNjcgKzIwNiwxNjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5kb21fc2VlZChSYW5kb21PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwkvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCi0JUHlPYmplY3QgKm1hc2tsb3dlciA9IE5VTEw7Ci0JUHlPYmplY3QgKnRoaXJ0eXR3byA9IE5VTEw7Ci0JUHlPYmplY3QgKm4gPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgKmtleSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBrZXltYXg7CQkvKiAjIG9mIGFsbG9jYXRlZCBzbG90cyBpbiBrZXkgKi8KLQl1bnNpZ25lZCBsb25nIGtleXVzZWQ7CQkvKiAjIG9mIHVzZWQgc2xvdHMgaW4ga2V5ICovCi0JaW50IGVycjsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsgICAgICAgICAgICAvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCisgICAgUHlPYmplY3QgKm1hc2tsb3dlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRoaXJ0eXR3byA9IE5VTEw7CisgICAgUHlPYmplY3QgKm4gPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgKmtleSA9IE5VTEw7CisgICAgdW5zaWduZWQgbG9uZyBrZXltYXg7ICAgICAgICAgICAgICAgLyogIyBvZiBhbGxvY2F0ZWQgc2xvdHMgaW4ga2V5ICovCisgICAgdW5zaWduZWQgbG9uZyBrZXl1c2VkOyAgICAgICAgICAgICAgLyogIyBvZiB1c2VkIHNsb3RzIGluIGtleSAqLworICAgIGludCBlcnI7CiAKLQlQeU9iamVjdCAqYXJnID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNlZWQiLCAwLCAxLCAmYXJnKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2VlZCIsIDAsIDEsICZhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChhcmcgPT0gTlVMTCB8fCBhcmcgPT0gUHlfTm9uZSkgewotCQl0aW1lX3Qgbm93OworICAgIGlmIChhcmcgPT0gTlVMTCB8fCBhcmcgPT0gUHlfTm9uZSkgeworICAgICAgICB0aW1lX3Qgbm93OwogCi0JCXRpbWUoJm5vdyk7Ci0JCWluaXRfZ2VucmFuZChzZWxmLCAodW5zaWduZWQgbG9uZylub3cpOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQkvKiBJZiB0aGUgYXJnIGlzIGFuIGludCBvciBsb25nLCB1c2UgaXRzIGFic29sdXRlIHZhbHVlOyBlbHNlIHVzZQotCSAqIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBpdHMgaGFzaCBjb2RlLgotCSAqLwotCWlmIChQeUludF9DaGVjayhhcmcpIHx8IFB5TG9uZ19DaGVjayhhcmcpKQotCQluID0gUHlOdW1iZXJfQWJzb2x1dGUoYXJnKTsKLQllbHNlIHsKLQkJbG9uZyBoYXNoID0gUHlPYmplY3RfSGFzaChhcmcpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCWdvdG8gRG9uZTsKLQkJbiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKWhhc2gpOwotCX0KLQlpZiAobiA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgICAgIHRpbWUoJm5vdyk7CisgICAgICAgIGluaXRfZ2VucmFuZChzZWxmLCAodW5zaWduZWQgbG9uZylub3cpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICAvKiBJZiB0aGUgYXJnIGlzIGFuIGludCBvciBsb25nLCB1c2UgaXRzIGFic29sdXRlIHZhbHVlOyBlbHNlIHVzZQorICAgICAqIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBpdHMgaGFzaCBjb2RlLgorICAgICAqLworICAgIGlmIChQeUludF9DaGVjayhhcmcpIHx8IFB5TG9uZ19DaGVjayhhcmcpKQorICAgICAgICBuID0gUHlOdW1iZXJfQWJzb2x1dGUoYXJnKTsKKyAgICBlbHNlIHsKKyAgICAgICAgbG9uZyBoYXNoID0gUHlPYmplY3RfSGFzaChhcmcpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgbiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKWhhc2gpOworICAgIH0KKyAgICBpZiAobiA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQkvKiBOb3cgc3BsaXQgbiBpbnRvIDMyLWJpdCBjaHVua3MsIGZyb20gdGhlIHJpZ2h0LiAgRWFjaCBwaWVjZSBpcwotCSAqIHN0b3JlZCBpbnRvIGtleSwgd2hpY2ggaGFzIGEgY2FwYWNpdHkgb2Yga2V5bWF4IGNodW5rcywgb2Ygd2hpY2gKLQkgKiBrZXl1c2VkIGFyZSBmaWxsZWQuICBBbGFzLCB0aGUgcmVwZWF0ZWQgc2hpZnRpbmcgbWFrZXMgdGhpcyBhCi0JICogcXVhZHJhdGljLXRpbWUgYWxnb3JpdGhtOyB3ZSdkIHJlYWxseSBsaWtlIHRvIHVzZQotCSAqIF9QeUxvbmdfQXNCeXRlQXJyYXkgaGVyZSwgYnV0IHRoZW4gd2UnZCBoYXZlIHRvIGJyZWFrIGludG8gdGhlCi0JICogbG9uZyByZXByZXNlbnRhdGlvbiB0byBmaWd1cmUgb3V0IGhvdyBiaWcgYW4gYXJyYXkgd2FzIG5lZWRlZAotCSAqIGluIGFkdmFuY2UuCi0JICovCi0Ja2V5bWF4ID0gODsgCS8qIGFyYml0cmFyeTsgZ3Jvd3MgbGF0ZXIgaWYgbmVlZGVkICovCi0Ja2V5dXNlZCA9IDA7Ci0Ja2V5ID0gKHVuc2lnbmVkIGxvbmcgKilQeU1lbV9NYWxsb2Moa2V5bWF4ICogc2l6ZW9mKCprZXkpKTsKLQlpZiAoa2V5ID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICAvKiBOb3cgc3BsaXQgbiBpbnRvIDMyLWJpdCBjaHVua3MsIGZyb20gdGhlIHJpZ2h0LiAgRWFjaCBwaWVjZSBpcworICAgICAqIHN0b3JlZCBpbnRvIGtleSwgd2hpY2ggaGFzIGEgY2FwYWNpdHkgb2Yga2V5bWF4IGNodW5rcywgb2Ygd2hpY2gKKyAgICAgKiBrZXl1c2VkIGFyZSBmaWxsZWQuICBBbGFzLCB0aGUgcmVwZWF0ZWQgc2hpZnRpbmcgbWFrZXMgdGhpcyBhCisgICAgICogcXVhZHJhdGljLXRpbWUgYWxnb3JpdGhtOyB3ZSdkIHJlYWxseSBsaWtlIHRvIHVzZQorICAgICAqIF9QeUxvbmdfQXNCeXRlQXJyYXkgaGVyZSwgYnV0IHRoZW4gd2UnZCBoYXZlIHRvIGJyZWFrIGludG8gdGhlCisgICAgICogbG9uZyByZXByZXNlbnRhdGlvbiB0byBmaWd1cmUgb3V0IGhvdyBiaWcgYW4gYXJyYXkgd2FzIG5lZWRlZAorICAgICAqIGluIGFkdmFuY2UuCisgICAgICovCisgICAga2V5bWF4ID0gODsgICAgICAgICAvKiBhcmJpdHJhcnk7IGdyb3dzIGxhdGVyIGlmIG5lZWRlZCAqLworICAgIGtleXVzZWQgPSAwOworICAgIGtleSA9ICh1bnNpZ25lZCBsb25nICopUHlNZW1fTWFsbG9jKGtleW1heCAqIHNpemVvZigqa2V5KSk7CisgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQltYXNrbG93ZXIgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygweGZmZmZmZmZmVSk7Ci0JaWYgKG1hc2tsb3dlciA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JdGhpcnR5dHdvID0gUHlJbnRfRnJvbUxvbmcoMzJMKTsKLQlpZiAodGhpcnR5dHdvID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl3aGlsZSAoKGVycj1QeU9iamVjdF9Jc1RydWUobikpKSB7Ci0JCVB5T2JqZWN0ICpuZXduOwotCQlQeU9iamVjdCAqcHljaHVuazsKLQkJdW5zaWduZWQgbG9uZyBjaHVuazsKKyAgICBtYXNrbG93ZXIgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygweGZmZmZmZmZmVSk7CisgICAgaWYgKG1hc2tsb3dlciA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgdGhpcnR5dHdvID0gUHlJbnRfRnJvbUxvbmcoMzJMKTsKKyAgICBpZiAodGhpcnR5dHdvID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB3aGlsZSAoKGVycj1QeU9iamVjdF9Jc1RydWUobikpKSB7CisgICAgICAgIFB5T2JqZWN0ICpuZXduOworICAgICAgICBQeU9iamVjdCAqcHljaHVuazsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBjaHVuazsKIAotCQlpZiAoZXJyID09IC0xKQotCQkJZ290byBEb25lOwotCQlweWNodW5rID0gUHlOdW1iZXJfQW5kKG4sIG1hc2tsb3dlcik7Ci0JCWlmIChweWNodW5rID09IE5VTEwpCi0JCQlnb3RvIERvbmU7Ci0JCWNodW5rID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHB5Y2h1bmspOwotCQlQeV9ERUNSRUYocHljaHVuayk7Ci0JCWlmIChjaHVuayA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJZ290byBEb25lOwotCQluZXduID0gUHlOdW1iZXJfUnNoaWZ0KG4sIHRoaXJ0eXR3byk7Ci0JCWlmIChuZXduID09IE5VTEwpCi0JCQlnb3RvIERvbmU7Ci0JCVB5X0RFQ1JFRihuKTsKLQkJbiA9IG5ld247Ci0JCWlmIChrZXl1c2VkID49IGtleW1heCkgewotCQkJdW5zaWduZWQgbG9uZyBiaWdnZXIgPSBrZXltYXggPDwgMTsKLQkJCWlmICgoYmlnZ2VyID4+IDEpICE9IGtleW1heCkgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJZ290byBEb25lOwotCQkJfQotCQkJa2V5ID0gKHVuc2lnbmVkIGxvbmcgKilQeU1lbV9SZWFsbG9jKGtleSwKLQkJCQkJCWJpZ2dlciAqIHNpemVvZigqa2V5KSk7Ci0JCQlpZiAoa2V5ID09IE5VTEwpCi0JCQkJZ290byBEb25lOwotCQkJa2V5bWF4ID0gYmlnZ2VyOwotCQl9Ci0JCWFzc2VydChrZXl1c2VkIDwga2V5bWF4KTsKLQkJa2V5W2tleXVzZWQrK10gPSBjaHVuazsKLQl9CisgICAgICAgIGlmIChlcnIgPT0gLTEpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIHB5Y2h1bmsgPSBQeU51bWJlcl9BbmQobiwgbWFza2xvd2VyKTsKKyAgICAgICAgaWYgKHB5Y2h1bmsgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgY2h1bmsgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcocHljaHVuayk7CisgICAgICAgIFB5X0RFQ1JFRihweWNodW5rKTsKKyAgICAgICAgaWYgKGNodW5rID09ICh1bnNpZ25lZCBsb25nKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIG5ld24gPSBQeU51bWJlcl9Sc2hpZnQobiwgdGhpcnR5dHdvKTsKKyAgICAgICAgaWYgKG5ld24gPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgUHlfREVDUkVGKG4pOworICAgICAgICBuID0gbmV3bjsKKyAgICAgICAgaWYgKGtleXVzZWQgPj0ga2V5bWF4KSB7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJpZ2dlciA9IGtleW1heCA8PCAxOworICAgICAgICAgICAgaWYgKChiaWdnZXIgPj4gMSkgIT0ga2V5bWF4KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZXkgPSAodW5zaWduZWQgbG9uZyAqKVB5TWVtX1JlYWxsb2Moa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnZ2VyICogc2l6ZW9mKCprZXkpKTsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICBrZXltYXggPSBiaWdnZXI7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGtleXVzZWQgPCBrZXltYXgpOworICAgICAgICBrZXlba2V5dXNlZCsrXSA9IGNodW5rOworICAgIH0KIAotCWlmIChrZXl1c2VkID09IDApCi0JCWtleVtrZXl1c2VkKytdID0gMFVMOwotCXJlc3VsdCA9IGluaXRfYnlfYXJyYXkoc2VsZiwga2V5LCBrZXl1c2VkKTsKKyAgICBpZiAoa2V5dXNlZCA9PSAwKQorICAgICAgICBrZXlba2V5dXNlZCsrXSA9IDBVTDsKKyAgICByZXN1bHQgPSBpbml0X2J5X2FycmF5KHNlbGYsIGtleSwga2V5dXNlZCk7CiBEb25lOgotCVB5X1hERUNSRUYobWFza2xvd2VyKTsKLQlQeV9YREVDUkVGKHRoaXJ0eXR3byk7Ci0JUHlfWERFQ1JFRihuKTsKLQlQeU1lbV9GcmVlKGtleSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKG1hc2tsb3dlcik7CisgICAgUHlfWERFQ1JFRih0aGlydHl0d28pOworICAgIFB5X1hERUNSRUYobik7CisgICAgUHlNZW1fRnJlZShrZXkpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5kb21fZ2V0c3RhdGUoUmFuZG9tT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpzdGF0ZTsKLQlQeU9iamVjdCAqZWxlbWVudDsKLQlpbnQgaTsKKyAgICBQeU9iamVjdCAqc3RhdGU7CisgICAgUHlPYmplY3QgKmVsZW1lbnQ7CisgICAgaW50IGk7CiAKLQlzdGF0ZSA9IFB5VHVwbGVfTmV3KE4rMSk7Ci0JaWYgKHN0YXRlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaT0wOyBpPE4gOyBpKyspIHsKLQkJZWxlbWVudCA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHNlbGYtPnN0YXRlW2ldKTsKLQkJaWYgKGVsZW1lbnQgPT0gTlVMTCkKLQkJCWdvdG8gRmFpbDsKLQkJUHlUdXBsZV9TRVRfSVRFTShzdGF0ZSwgaSwgZWxlbWVudCk7Ci0JfQotCWVsZW1lbnQgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmluZGV4KSk7Ci0JaWYgKGVsZW1lbnQgPT0gTlVMTCkKLQkJZ290byBGYWlsOwotCVB5VHVwbGVfU0VUX0lURU0oc3RhdGUsIGksIGVsZW1lbnQpOwotCXJldHVybiBzdGF0ZTsKKyAgICBzdGF0ZSA9IFB5VHVwbGVfTmV3KE4rMSk7CisgICAgaWYgKHN0YXRlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaT0wOyBpPE4gOyBpKyspIHsKKyAgICAgICAgZWxlbWVudCA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHNlbGYtPnN0YXRlW2ldKTsKKyAgICAgICAgaWYgKGVsZW1lbnQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShzdGF0ZSwgaSwgZWxlbWVudCk7CisgICAgfQorICAgIGVsZW1lbnQgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmluZGV4KSk7CisgICAgaWYgKGVsZW1lbnQgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOworICAgIFB5VHVwbGVfU0VUX0lURU0oc3RhdGUsIGksIGVsZW1lbnQpOworICAgIHJldHVybiBzdGF0ZTsKIAogRmFpbDoKLQlQeV9ERUNSRUYoc3RhdGUpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihzdGF0ZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5kb21fc2V0c3RhdGUoUmFuZG9tT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc3RhdGUpCiB7Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBlbGVtZW50OwotCWxvbmcgaW5kZXg7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgbG9uZyBlbGVtZW50OworICAgIGxvbmcgaW5kZXg7CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2soc3RhdGUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkic3RhdGUgdmVjdG9yIG11c3QgYmUgYSB0dXBsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5VHVwbGVfU2l6ZShzdGF0ZSkgIT0gTisxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJInN0YXRlIHZlY3RvciBpcyB0aGUgd3Jvbmcgc2l6ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHN0YXRlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgInN0YXRlIHZlY3RvciBtdXN0IGJlIGEgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeVR1cGxlX1NpemUoc3RhdGUpICE9IE4rMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJzdGF0ZSB2ZWN0b3IgaXMgdGhlIHdyb25nIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZm9yIChpPTA7IGk8TiA7IGkrKykgewotCQllbGVtZW50ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKFB5VHVwbGVfR0VUX0lURU0oc3RhdGUsIGkpKTsKLQkJaWYgKGVsZW1lbnQgPT0gKHVuc2lnbmVkIGxvbmcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlzZWxmLT5zdGF0ZVtpXSA9IGVsZW1lbnQgJiAweGZmZmZmZmZmVUw7IC8qIE1ha2Ugc3VyZSB3ZSBnZXQgc2FuZSBzdGF0ZSAqLwotCX0KKyAgICBmb3IgKGk9MDsgaTxOIDsgaSsrKSB7CisgICAgICAgIGVsZW1lbnQgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcoUHlUdXBsZV9HRVRfSVRFTShzdGF0ZSwgaSkpOworICAgICAgICBpZiAoZWxlbWVudCA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHNlbGYtPnN0YXRlW2ldID0gZWxlbWVudCAmIDB4ZmZmZmZmZmZVTDsgLyogTWFrZSBzdXJlIHdlIGdldCBzYW5lIHN0YXRlICovCisgICAgfQogCi0JaW5kZXggPSBQeUxvbmdfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3RhdGUsIGkpKTsKLQlpZiAoaW5kZXggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+aW5kZXggPSAoaW50KWluZGV4OworICAgIGluZGV4ID0gUHlMb25nX0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHN0YXRlLCBpKSk7CisgICAgaWYgKGluZGV4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPmluZGV4ID0gKGludClpbmRleDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qCkBAIC0zODksNyArMzg5LDcgQEAKIGhhdmUgY2hhbmdpbmcgKGdyb3dpbmcpIHZhbHVlcyBhcyB3ZWxsIGFzIHNodWZmbGVkIHBvc2l0aW9ucy4KIAogRmluYWxseSwgdGhlIHNlbGYtPmluZGV4IHZhbHVlIGlzIHNldCB0byBOIHNvIHRoYXQgdGhlIGdlbmVyYXRvciBpdHNlbGYKLWtpY2tzIGluIG9uIHRoZSBuZXh0IGNhbGwgdG8gcmFuZG9tKCkuCVRoaXMgYXNzdXJlcyB0aGF0IGFsbCByZXN1bHRzCitraWNrcyBpbiBvbiB0aGUgbmV4dCBjYWxsIHRvIHJhbmRvbSgpLiAgVGhpcyBhc3N1cmVzIHRoYXQgYWxsIHJlc3VsdHMKIGhhdmUgYmVlbiB0aHJvdWdoIHRoZSBnZW5lcmF0b3IgYW5kIGRvIG5vdCBqdXN0IHJlZmxlY3QgYWx0ZXJhdGlvbnMgdG8KIHRoZSB1bmRlcmx5aW5nIHN0YXRlLgogKi8KQEAgLTM5NywxNjkgKzM5NywxNjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5kb21fanVtcGFoZWFkKFJhbmRvbU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm4pCiB7Ci0JbG9uZyBpLCBqOwotCVB5T2JqZWN0ICppb2JqOwotCVB5T2JqZWN0ICpyZW1vYmo7Ci0JdW5zaWduZWQgbG9uZyAqbXQsIHRtcDsKKyAgICBsb25nIGksIGo7CisgICAgUHlPYmplY3QgKmlvYmo7CisgICAgUHlPYmplY3QgKnJlbW9iajsKKyAgICB1bnNpZ25lZCBsb25nICptdCwgdG1wOwogCi0JaWYgKCFQeUludF9DaGVjayhuKSAmJiAhUHlMb25nX0NoZWNrKG4pKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJqdW1wYWhlYWQgcmVxdWlyZXMgYW4gIgotCQkJICAgICAiaW50ZWdlciwgbm90ICclcyciLAotCQkJICAgICBQeV9UWVBFKG4pLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlJbnRfQ2hlY2sobikgJiYgIVB5TG9uZ19DaGVjayhuKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAianVtcGFoZWFkIHJlcXVpcmVzIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyLCBub3QgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG4pLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbXQgPSBzZWxmLT5zdGF0ZTsKLQlmb3IgKGkgPSBOLTE7IGkgPiAxOyBpLS0pIHsKLQkJaW9iaiA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQlpZiAoaW9iaiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlbW9iaiA9IFB5TnVtYmVyX1JlbWFpbmRlcihuLCBpb2JqKTsKLQkJUHlfREVDUkVGKGlvYmopOwotCQlpZiAocmVtb2JqID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaiA9IFB5SW50X0FzTG9uZyhyZW1vYmopOwotCQlQeV9ERUNSRUYocmVtb2JqKTsKLQkJaWYgKGogPT0gLTFMICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJdG1wID0gbXRbaV07Ci0JCW10W2ldID0gbXRbal07Ci0JCW10W2pdID0gdG1wOwotCX0KKyAgICBtdCA9IHNlbGYtPnN0YXRlOworICAgIGZvciAoaSA9IE4tMTsgaSA+IDE7IGktLSkgeworICAgICAgICBpb2JqID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgIGlmIChpb2JqID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVtb2JqID0gUHlOdW1iZXJfUmVtYWluZGVyKG4sIGlvYmopOworICAgICAgICBQeV9ERUNSRUYoaW9iaik7CisgICAgICAgIGlmIChyZW1vYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBqID0gUHlJbnRfQXNMb25nKHJlbW9iaik7CisgICAgICAgIFB5X0RFQ1JFRihyZW1vYmopOworICAgICAgICBpZiAoaiA9PSAtMUwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB0bXAgPSBtdFtpXTsKKyAgICAgICAgbXRbaV0gPSBtdFtqXTsKKyAgICAgICAgbXRbal0gPSB0bXA7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IE47IGkrKykKLQkJbXRbaV0gKz0gaSsxOworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgICAgIG10W2ldICs9IGkrMTsKIAotCXNlbGYtPmluZGV4ID0gTjsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2VsZi0+aW5kZXggPSBOOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmRvbV9nZXRyYW5kYml0cyhSYW5kb21PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBrLCBpLCBieXRlczsKLQl1bnNpZ25lZCBsb25nIHI7Ci0JdW5zaWduZWQgY2hhciAqYnl0ZWFycmF5OwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IGssIGksIGJ5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgcjsKKyAgICB1bnNpZ25lZCBjaGFyICpieXRlYXJyYXk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRyYW5kYml0cyIsICZrKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmdldHJhbmRiaXRzIiwgJmspKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChrIDw9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm51bWJlciBvZiBiaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChrIDw9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIG9mIGJpdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlieXRlcyA9ICgoayAtIDEpIC8gMzIgKyAxKSAqIDQ7Ci0JYnl0ZWFycmF5ID0gKHVuc2lnbmVkIGNoYXIgKilQeU1lbV9NYWxsb2MoYnl0ZXMpOwotCWlmIChieXRlYXJyYXkgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYnl0ZXMgPSAoKGsgLSAxKSAvIDMyICsgMSkgKiA0OworICAgIGJ5dGVhcnJheSA9ICh1bnNpZ25lZCBjaGFyICopUHlNZW1fTWFsbG9jKGJ5dGVzKTsKKyAgICBpZiAoYnl0ZWFycmF5ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogRmlsbC1vdXQgd2hvbGUgd29yZHMsIGJ5dGUtYnktYnl0ZSB0byBhdm9pZCBlbmRpYW5uZXNzIGlzc3VlcyAqLwotCWZvciAoaT0wIDsgaTxieXRlcyA7IGkrPTQsIGstPTMyKSB7Ci0JCXIgPSBnZW5yYW5kX2ludDMyKHNlbGYpOwotCQlpZiAoayA8IDMyKQotCQkJciA+Pj0gKDMyIC0gayk7Ci0JCWJ5dGVhcnJheVtpKzBdID0gKHVuc2lnbmVkIGNoYXIpcjsKLQkJYnl0ZWFycmF5W2krMV0gPSAodW5zaWduZWQgY2hhcikociA+PiA4KTsKLQkJYnl0ZWFycmF5W2krMl0gPSAodW5zaWduZWQgY2hhcikociA+PiAxNik7Ci0JCWJ5dGVhcnJheVtpKzNdID0gKHVuc2lnbmVkIGNoYXIpKHIgPj4gMjQpOwotCX0KKyAgICAvKiBGaWxsLW91dCB3aG9sZSB3b3JkcywgYnl0ZS1ieS1ieXRlIHRvIGF2b2lkIGVuZGlhbm5lc3MgaXNzdWVzICovCisgICAgZm9yIChpPTAgOyBpPGJ5dGVzIDsgaSs9NCwgay09MzIpIHsKKyAgICAgICAgciA9IGdlbnJhbmRfaW50MzIoc2VsZik7CisgICAgICAgIGlmIChrIDwgMzIpCisgICAgICAgICAgICByID4+PSAoMzIgLSBrKTsKKyAgICAgICAgYnl0ZWFycmF5W2krMF0gPSAodW5zaWduZWQgY2hhcilyOworICAgICAgICBieXRlYXJyYXlbaSsxXSA9ICh1bnNpZ25lZCBjaGFyKShyID4+IDgpOworICAgICAgICBieXRlYXJyYXlbaSsyXSA9ICh1bnNpZ25lZCBjaGFyKShyID4+IDE2KTsKKyAgICAgICAgYnl0ZWFycmF5W2krM10gPSAodW5zaWduZWQgY2hhcikociA+PiAyNCk7CisgICAgfQogCi0JLyogbGl0dGxlIGVuZGlhbiBvcmRlciB0byBtYXRjaCBieXRlYXJyYXkgYXNzaWdubWVudCBvcmRlciAqLwotCXJlc3VsdCA9IF9QeUxvbmdfRnJvbUJ5dGVBcnJheShieXRlYXJyYXksIGJ5dGVzLCAxLCAwKTsKLQlQeU1lbV9GcmVlKGJ5dGVhcnJheSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBsaXR0bGUgZW5kaWFuIG9yZGVyIHRvIG1hdGNoIGJ5dGVhcnJheSBhc3NpZ25tZW50IG9yZGVyICovCisgICAgcmVzdWx0ID0gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KGJ5dGVhcnJheSwgYnl0ZXMsIDEsIDApOworICAgIFB5TWVtX0ZyZWUoYnl0ZWFycmF5KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZG9tX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlSYW5kb21PYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKnRtcDsKKyAgICBSYW5kb21PYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCWlmICh0eXBlID09ICZSYW5kb21fVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoIlJhbmRvbSgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZSYW5kb21fVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoIlJhbmRvbSgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChSYW5kb21PYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl0bXAgPSByYW5kb21fc2VlZChzZWxmLCBhcmdzKTsKLQlpZiAodG1wID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHNlbGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgc2VsZiA9IChSYW5kb21PYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0bXAgPSByYW5kb21fc2VlZChzZWxmLCBhcmdzKTsKKyAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiByYW5kb21fbWV0aG9kc1tdID0gewotCXsicmFuZG9tIiwJKFB5Q0Z1bmN0aW9uKXJhbmRvbV9yYW5kb20sICBNRVRIX05PQVJHUywKLQkJUHlEb2NfU1RSKCJyYW5kb20oKSAtPiB4IGluIHRoZSBpbnRlcnZhbCBbMCwgMSkuIil9LAotCXsic2VlZCIsCShQeUNGdW5jdGlvbilyYW5kb21fc2VlZCwgIE1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJzZWVkKFtuXSkgLT4gTm9uZS4gIERlZmF1bHRzIHRvIGN1cnJlbnQgdGltZS4iKX0sCi0JeyJnZXRzdGF0ZSIsCShQeUNGdW5jdGlvbilyYW5kb21fZ2V0c3RhdGUsICBNRVRIX05PQVJHUywKLQkJUHlEb2NfU1RSKCJnZXRzdGF0ZSgpIC0+IHR1cGxlIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUuIil9LAotCXsic2V0c3RhdGUiLAkgIChQeUNGdW5jdGlvbilyYW5kb21fc2V0c3RhdGUsICBNRVRIX08sCi0JCVB5RG9jX1NUUigic2V0c3RhdGUoc3RhdGUpIC0+IE5vbmUuICBSZXN0b3JlcyBnZW5lcmF0b3Igc3RhdGUuIil9LAotCXsianVtcGFoZWFkIiwJKFB5Q0Z1bmN0aW9uKXJhbmRvbV9qdW1wYWhlYWQsCU1FVEhfTywKLQkJUHlEb2NfU1RSKCJqdW1wYWhlYWQoaW50KSAtPiBOb25lLiAgQ3JlYXRlIG5ldyBzdGF0ZSBmcm9tICIKLQkJCSAgImV4aXN0aW5nIHN0YXRlIGFuZCBpbnRlZ2VyLiIpfSwKLQl7ImdldHJhbmRiaXRzIiwJKFB5Q0Z1bmN0aW9uKXJhbmRvbV9nZXRyYW5kYml0cywgIE1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJnZXRyYW5kYml0cyhrKSAtPiB4LiAgR2VuZXJhdGVzIGEgbG9uZyBpbnQgd2l0aCAiCi0JCQkgICJrIHJhbmRvbSBiaXRzLiIpfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsicmFuZG9tIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXJhbmRvbV9yYW5kb20sICBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJyYW5kb20oKSAtPiB4IGluIHRoZSBpbnRlcnZhbCBbMCwgMSkuIil9LAorICAgIHsic2VlZCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXJhbmRvbV9zZWVkLCAgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoInNlZWQoW25dKSAtPiBOb25lLiAgRGVmYXVsdHMgdG8gY3VycmVudCB0aW1lLiIpfSwKKyAgICB7ImdldHN0YXRlIiwgICAgICAgIChQeUNGdW5jdGlvbilyYW5kb21fZ2V0c3RhdGUsICBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJnZXRzdGF0ZSgpIC0+IHR1cGxlIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUuIil9LAorICAgIHsic2V0c3RhdGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pcmFuZG9tX3NldHN0YXRlLCAgTUVUSF9PLAorICAgICAgICBQeURvY19TVFIoInNldHN0YXRlKHN0YXRlKSAtPiBOb25lLiAgUmVzdG9yZXMgZ2VuZXJhdG9yIHN0YXRlLiIpfSwKKyAgICB7Imp1bXBhaGVhZCIsICAgICAgIChQeUNGdW5jdGlvbilyYW5kb21fanVtcGFoZWFkLCAgTUVUSF9PLAorICAgICAgICBQeURvY19TVFIoImp1bXBhaGVhZChpbnQpIC0+IE5vbmUuICBDcmVhdGUgbmV3IHN0YXRlIGZyb20gIgorICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIHN0YXRlIGFuZCBpbnRlZ2VyLiIpfSwKKyAgICB7ImdldHJhbmRiaXRzIiwgICAgIChQeUNGdW5jdGlvbilyYW5kb21fZ2V0cmFuZGJpdHMsICBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiZ2V0cmFuZGJpdHMoaykgLT4geC4gIEdlbmVyYXRlcyBhIGxvbmcgaW50IHdpdGggIgorICAgICAgICAgICAgICAgICAgImsgcmFuZG9tIGJpdHMuIil9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIocmFuZG9tX2RvYywKICJSYW5kb20oKSAtPiBjcmVhdGUgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB3aXRoIGl0cyBvd24gaW50ZXJuYWwgc3RhdGUuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUmFuZG9tX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9yYW5kb20uUmFuZG9tIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKFJhbmRvbU9iamVjdCksCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCTAsCQkJCS8qdHBfZGVhbGxvYyovCi0JMCwJCQkJLyp0cF9wcmludCovCi0JMCwJCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkJLyp0cF9yZXByKi8KLQkwLAkJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCQkvKnRwX2hhc2gqLwotCTAsCQkJCS8qdHBfY2FsbCovCi0JMCwJCQkJLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKnRwX2dldGF0dHJvKi8KLQkwLAkJCQkvKnRwX3NldGF0dHJvKi8KLQkwLAkJCQkvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyp0cF9mbGFncyovCi0JcmFuZG9tX2RvYywJCQkvKnRwX2RvYyovCi0JMCwJCQkJLyp0cF90cmF2ZXJzZSovCi0JMCwJCQkJLyp0cF9jbGVhciovCi0JMCwJCQkJLyp0cF9yaWNoY29tcGFyZSovCi0JMCwJCQkJLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwJCQkJLyp0cF9pdGVyKi8KLQkwLAkJCQkvKnRwX2l0ZXJuZXh0Ki8KLQlyYW5kb21fbWV0aG9kcywgCQkvKnRwX21ldGhvZHMqLwotCTAsCQkJCS8qdHBfbWVtYmVycyovCi0JMCwJCQkJLyp0cF9nZXRzZXQqLwotCTAsCQkJCS8qdHBfYmFzZSovCi0JMCwJCQkJLyp0cF9kaWN0Ki8KLQkwLAkJCQkvKnRwX2Rlc2NyX2dldCovCi0JMCwJCQkJLyp0cF9kZXNjcl9zZXQqLwotCTAsCQkJCS8qdHBfZGljdG9mZnNldCovCi0JMCwJCQkJLyp0cF9pbml0Ki8KLQkwLAkJCQkvKnRwX2FsbG9jKi8KLQlyYW5kb21fbmV3LAkJCS8qdHBfbmV3Ki8KLQlfUHlPYmplY3RfRGVsLAkJCS8qdHBfZnJlZSovCi0JMCwJCQkJLyp0cF9pc19nYyovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9yYW5kb20uUmFuZG9tIiwgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUmFuZG9tT2JqZWN0KSwgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgcmFuZG9tX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgcmFuZG9tX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCisgICAgcmFuZG9tX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLworICAgIF9QeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCiB9OwogCiBQeURvY19TVFJWQVIobW9kdWxlX2RvYywKQEAgLTU2OCwxMyArNTY4LDEzIEBACiBQeU1PRElOSVRfRlVOQwogaW5pdF9yYW5kb20odm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlJhbmRvbV9UeXBlKSA8IDApCi0JCXJldHVybjsKLQltID0gUHlfSW5pdE1vZHVsZTMoIl9yYW5kb20iLCBOVUxMLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKCZSYW5kb21fVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSYW5kb20iLCAoUHlPYmplY3QgKikmUmFuZG9tX1R5cGUpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlJhbmRvbV9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl9yYW5kb20iLCBOVUxMLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZSYW5kb21fVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSYW5kb20iLCAoUHlPYmplY3QgKikmUmFuZG9tX1R5cGUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3RydWN0LmMgYi9Nb2R1bGVzL19zdHJ1Y3QuYwppbmRleCBiNmJlNWI2Li4xOTA0ZTllIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zdHJ1Y3QuYworKysgYi9Nb2R1bGVzL19zdHJ1Y3QuYwpAQCAtMjAsMzUgKzIwLDM1IEBACiAvKiB3YXJuaW5nIG1lc3NhZ2VzICovCiAjZGVmaW5lIEZMT0FUX0NPRVJDRV9XQVJOICJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQiCiAjZGVmaW5lIE5PTl9JTlRFR0VSX1dBUk4gImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBub24taW50ZWdlciAiIFwKLQkiKGltcGxpY2l0IGNvbnZlcnNpb24gdXNpbmcgX19pbnRfXyBpcyBkZXByZWNhdGVkKSIKKyAgICAiKGltcGxpY2l0IGNvbnZlcnNpb24gdXNpbmcgX19pbnRfXyBpcyBkZXByZWNhdGVkKSIKIAogCiAvKiBUaGUgdHJhbnNsYXRpb24gZnVuY3Rpb24gZm9yIGVhY2ggZm9ybWF0IGNoYXJhY3RlciBpcyB0YWJsZSBkcml2ZW4gKi8KIHR5cGVkZWYgc3RydWN0IF9mb3JtYXRkZWYgewotCWNoYXIgZm9ybWF0OwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeV9zc2l6ZV90IGFsaWdubWVudDsKLQlQeU9iamVjdCogKCp1bnBhY2spKGNvbnN0IGNoYXIgKiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgX2Zvcm1hdGRlZiAqKTsKLQlpbnQgKCpwYWNrKShjaGFyICosIFB5T2JqZWN0ICosCi0JCSAgICBjb25zdCBzdHJ1Y3QgX2Zvcm1hdGRlZiAqKTsKKyAgICBjaGFyIGZvcm1hdDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBhbGlnbm1lbnQ7CisgICAgUHlPYmplY3QqICgqdW5wYWNrKShjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Zvcm1hdGRlZiAqKTsKKyAgICBpbnQgKCpwYWNrKShjaGFyICosIFB5T2JqZWN0ICosCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9mb3JtYXRkZWYgKik7CiB9IGZvcm1hdGRlZjsKIAogdHlwZWRlZiBzdHJ1Y3QgX2Zvcm1hdGNvZGUgewotCWNvbnN0IHN0cnVjdCBfZm9ybWF0ZGVmICpmbXRkZWY7Ci0JUHlfc3NpemVfdCBvZmZzZXQ7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIGNvbnN0IHN0cnVjdCBfZm9ybWF0ZGVmICpmbXRkZWY7CisgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgUHlfc3NpemVfdCBzaXplOwogfSBmb3JtYXRjb2RlOwogCiAvKiBTdHJ1Y3Qgb2JqZWN0IGludGVyZmFjZSAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3Qgc19zaXplOwotCVB5X3NzaXplX3Qgc19sZW47Ci0JZm9ybWF0Y29kZSAqc19jb2RlczsKLQlQeU9iamVjdCAqc19mb3JtYXQ7Ci0JUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IHNfc2l6ZTsKKyAgICBQeV9zc2l6ZV90IHNfbGVuOworICAgIGZvcm1hdGNvZGUgKnNfY29kZXM7CisgICAgUHlPYmplY3QgKnNfZm9ybWF0OworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KIH0gUHlTdHJ1Y3RPYmplY3Q7CiAKIApAQCAtMTA3LDg0ICsxMDcsODQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcHlsb25nKFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICpyLCAqdzsKLQlpbnQgY29udmVydGVkID0gMDsKLQlhc3NlcnQodiAhPSBOVUxMKTsKLQlpZiAoIVB5SW50X0NoZWNrKHYpICYmICFQeUxvbmdfQ2hlY2sodikpIHsKLQkJUHlOdW1iZXJNZXRob2RzICptOwotCQkvKiBOb3QgYW4gaW50ZWdlcjsgZmlyc3QgdHJ5IHRvIHVzZSBfX2luZGV4X18gdG8KLQkJICAgY29udmVydCB0byBhbiBpbnRlZ2VyLiAgSWYgdGhlIF9faW5kZXhfXyBtZXRob2QKLQkJICAgZG9lc24ndCBleGlzdCwgb3IgcmFpc2VzIGEgVHlwZUVycm9yLCB0cnkgX19pbnRfXy4KLQkJICAgVXNlIG9mIHRoZSBsYXR0ZXIgaXMgZGVwcmVjYXRlZCwgYW5kIHdpbGwgZmFpbCBpbgotCQkgICBQeXRob24gMy54LiAqLworICAgIFB5T2JqZWN0ICpyLCAqdzsKKyAgICBpbnQgY29udmVydGVkID0gMDsKKyAgICBhc3NlcnQodiAhPSBOVUxMKTsKKyAgICBpZiAoIVB5SW50X0NoZWNrKHYpICYmICFQeUxvbmdfQ2hlY2sodikpIHsKKyAgICAgICAgUHlOdW1iZXJNZXRob2RzICptOworICAgICAgICAvKiBOb3QgYW4gaW50ZWdlcjsgZmlyc3QgdHJ5IHRvIHVzZSBfX2luZGV4X18gdG8KKyAgICAgICAgICAgY29udmVydCB0byBhbiBpbnRlZ2VyLiAgSWYgdGhlIF9faW5kZXhfXyBtZXRob2QKKyAgICAgICAgICAgZG9lc24ndCBleGlzdCwgb3IgcmFpc2VzIGEgVHlwZUVycm9yLCB0cnkgX19pbnRfXy4KKyAgICAgICAgICAgVXNlIG9mIHRoZSBsYXR0ZXIgaXMgZGVwcmVjYXRlZCwgYW5kIHdpbGwgZmFpbCBpbgorICAgICAgICAgICBQeXRob24gMy54LiAqLwogCi0JCW0gPSBQeV9UWVBFKHYpLT50cF9hc19udW1iZXI7Ci0JCWlmIChQeUluZGV4X0NoZWNrKHYpKSB7Ci0JCQl3ID0gUHlOdW1iZXJfSW5kZXgodik7Ci0JCQlpZiAodyAhPSBOVUxMKSB7Ci0JCQkJdiA9IHc7Ci0JCQkJLyogc3VjY2Vzc2Z1bGx5IGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyICovCi0JCQkJY29udmVydGVkID0gMTsKLQkJCX0KLQkJCWVsc2UgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKCFjb252ZXJ0ZWQgJiYgbSAhPSBOVUxMICYmIG0tPm5iX2ludCAhPSBOVUxMKSB7Ci0JCQkvKiBTcGVjaWFsIGNhc2Ugd2FybmluZyBtZXNzYWdlIGZvciBmbG9hdHMsIGZvcgotCQkJICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICovCi0JCQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgewotCQkJCWlmIChQeUVycl9XYXJuRXgoCi0JCQkJCSAgICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkJCSAgICBGTE9BVF9DT0VSQ0VfV0FSTiwgMSkpCi0JCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKFB5RXJyX1dhcm5FeCgKLQkJCQkJICAgIFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkJICAgIE5PTl9JTlRFR0VSX1dBUk4sIDEpKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXYgPSBtLT5uYl9pbnQodik7Ci0JCQlpZiAodiA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJaWYgKCFQeUludF9DaGVjayh2KSAmJiAhUHlMb25nX0NoZWNrKHYpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJfX2ludF9fIG1ldGhvZCByZXR1cm5lZCAiCi0JCQkJCQkibm9uLWludGVnZXIiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWNvbnZlcnRlZCA9IDE7Ci0JCX0KLQkJaWYgKCFjb252ZXJ0ZWQpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkJImNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50ICIKLQkJCQkJInRvIGludGVnZXIiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UKLQkJLyogRW5zdXJlIHdlIG93biBhIHJlZmVyZW5jZSB0byB2LiAqLwotCQlQeV9JTkNSRUYodik7CisgICAgICAgIG0gPSBQeV9UWVBFKHYpLT50cF9hc19udW1iZXI7CisgICAgICAgIGlmIChQeUluZGV4X0NoZWNrKHYpKSB7CisgICAgICAgICAgICB3ID0gUHlOdW1iZXJfSW5kZXgodik7CisgICAgICAgICAgICBpZiAodyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdiA9IHc7CisgICAgICAgICAgICAgICAgLyogc3VjY2Vzc2Z1bGx5IGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyICovCisgICAgICAgICAgICAgICAgY29udmVydGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb252ZXJ0ZWQgJiYgbSAhPSBOVUxMICYmIG0tPm5iX2ludCAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2Ugd2FybmluZyBtZXNzYWdlIGZvciBmbG9hdHMsIGZvcgorICAgICAgICAgICAgICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICovCisgICAgICAgICAgICBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9XYXJuRXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUX0NPRVJDRV9XQVJOLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkV4KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT05fSU5URUdFUl9XQVJOLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2ID0gbS0+bmJfaW50KHYpOworICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmICghUHlJbnRfQ2hlY2sodikgJiYgIVB5TG9uZ19DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ludF9fIG1ldGhvZCByZXR1cm5lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub24taW50ZWdlciIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udmVydGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNvbnZlcnRlZCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIGludGVnZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgLyogRW5zdXJlIHdlIG93biBhIHJlZmVyZW5jZSB0byB2LiAqLworICAgICAgICBQeV9JTkNSRUYodik7CiAKLQlhc3NlcnQoUHlJbnRfQ2hlY2sodikgfHwgUHlMb25nX0NoZWNrKHYpKTsKLQlpZiAoUHlJbnRfQ2hlY2sodikpIHsKLQkJciA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHYpKTsKLQkJUHlfREVDUkVGKHYpOwotCX0KLQllbHNlIGlmIChQeUxvbmdfQ2hlY2sodikpIHsKLQkJYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7Ci0JCXIgPSB2OwotCX0KLQllbHNlIHsKLQkJciA9IE5VTEw7ICAgLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5nIGFib3V0Ci0JCQkgICAgICAgcG9zc2libHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZSAqLwotCQlhc3NlcnQoMCk7ICAvKiBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZSAqLwotCX0KKyAgICBhc3NlcnQoUHlJbnRfQ2hlY2sodikgfHwgUHlMb25nX0NoZWNrKHYpKTsKKyAgICBpZiAoUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgciA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHYpKTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2sodikpIHsKKyAgICAgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CisgICAgICAgIHIgPSB2OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgciA9IE5VTEw7ICAgLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5nIGFib3V0CisgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgKi8KKyAgICAgICAgYXNzZXJ0KDApOyAgLyogc2hvdWxkbid0IGV2ZXIgZ2V0IGhlcmUgKi8KKyAgICB9CiAKLQlyZXR1cm4gcjsKKyAgICByZXR1cm4gcjsKIH0KIAogLyogSGVscGVyIHRvIGNvbnZlcnQgYSBQeXRob24gb2JqZWN0IHRvIGEgQyBsb25nLiAgU2V0cyBhbiBleGNlcHRpb24KQEAgLTE5NCwxOCArMTk0LDE4IEBACiBzdGF0aWMgaW50CiBnZXRfbG9uZyhQeU9iamVjdCAqdiwgbG9uZyAqcCkKIHsKLQlsb25nIHg7CisgICAgbG9uZyB4OwogCi0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWFzc2VydChQeUxvbmdfQ2hlY2sodikpOwotCXggPSBQeUxvbmdfQXNMb25nKHYpOwotCVB5X0RFQ1JFRih2KTsKLQlpZiAoeCA9PSAobG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOworICAgIHYgPSBnZXRfcHlsb25nKHYpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKKyAgICB4ID0gUHlMb25nX0FzTG9uZyh2KTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgaWYgKHggPT0gKGxvbmcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpwID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogU2FtZSwgYnV0IGhhbmRsaW5nIHVuc2lnbmVkIGxvbmcgKi8KQEAgLTIxMywxOCArMjEzLDE4IEBACiBzdGF0aWMgaW50CiBnZXRfdWxvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIGxvbmcgKnApCiB7Ci0JdW5zaWduZWQgbG9uZyB4OworICAgIHVuc2lnbmVkIGxvbmcgeDsKIAotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKLQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOwotCVB5X0RFQ1JFRih2KTsKLQlpZiAoeCA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOworICAgIHYgPSBnZXRfcHlsb25nKHYpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKKyAgICB4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKQEAgLTIzNCwxOCArMjM0LDE4IEBACiBzdGF0aWMgaW50CiBnZXRfbG9uZ2xvbmcoUHlPYmplY3QgKnYsIFBZX0xPTkdfTE9ORyAqcCkKIHsKLQlQWV9MT05HX0xPTkcgeDsKKyAgICBQWV9MT05HX0xPTkcgeDsKIAotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKLQl4ID0gUHlMb25nX0FzTG9uZ0xvbmcodik7Ci0JUHlfREVDUkVGKHYpOwotCWlmICh4ID09IChQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCSpwID0geDsKLQlyZXR1cm4gMDsKKyAgICB2ID0gZ2V0X3B5bG9uZyh2KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CisgICAgeCA9IFB5TG9uZ19Bc0xvbmdMb25nKHYpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBpZiAoeCA9PSAoUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAqcCA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFNhbWUsIGJ1dCBoYW5kbGluZyBuYXRpdmUgdW5zaWduZWQgbG9uZyBsb25nLiAqLwpAQCAtMjUzLDE4ICsyNTMsMTggQEAKIHN0YXRpYyBpbnQKIGdldF91bG9uZ2xvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqcCkKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKIAotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKLQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2KTsKLQlQeV9ERUNSRUYodik7Ci0JaWYgKHggPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOworICAgIHYgPSBnZXRfcHlsb25nKHYpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKKyAgICB4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2KTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgaWYgKHggPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAjZW5kaWYKQEAgLTI3Myw1NiArMjczLDU2IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bnBhY2tfZmxvYXQoY29uc3QgY2hhciAqcCwgIC8qIHN0YXJ0IG9mIDQtYnl0ZSBzdHJpbmcgKi8KLQkgICAgIGludCBsZSkJICAgICAvKiB0cnVlIGZvciBsaXR0bGUtZW5kaWFuLCBmYWxzZSBmb3IgYmlnLWVuZGlhbiAqLworICAgICAgICAgaW50IGxlKSAgICAgICAgICAgICAvKiB0cnVlIGZvciBsaXR0bGUtZW5kaWFuLCBmYWxzZSBmb3IgYmlnLWVuZGlhbiAqLwogewotCWRvdWJsZSB4OworICAgIGRvdWJsZSB4OwogCi0JeCA9IF9QeUZsb2F0X1VucGFjazQoKHVuc2lnbmVkIGNoYXIgKilwLCBsZSk7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworICAgIHggPSBfUHlGbG9hdF9VbnBhY2s0KCh1bnNpZ25lZCBjaGFyICopcCwgbGUpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHVucGFja19kb3VibGUoY29uc3QgY2hhciAqcCwgIC8qIHN0YXJ0IG9mIDgtYnl0ZSBzdHJpbmcgKi8KLQkgICAgICBpbnQgbGUpICAgICAgICAgLyogdHJ1ZSBmb3IgbGl0dGxlLWVuZGlhbiwgZmFsc2UgZm9yIGJpZy1lbmRpYW4gKi8KKyAgICAgICAgICBpbnQgbGUpICAgICAgICAgLyogdHJ1ZSBmb3IgbGl0dGxlLWVuZGlhbiwgZmFsc2UgZm9yIGJpZy1lbmRpYW4gKi8KIHsKLQlkb3VibGUgeDsKKyAgICBkb3VibGUgeDsKIAotCXggPSBfUHlGbG9hdF9VbnBhY2s4KCh1bnNpZ25lZCBjaGFyICopcCwgbGUpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKKyAgICB4ID0gX1B5RmxvYXRfVW5wYWNrOCgodW5zaWduZWQgY2hhciAqKXAsIGxlKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CiB9CiAKIC8qIEhlbHBlciB0byBmb3JtYXQgdGhlIHJhbmdlIGVycm9yIGV4Y2VwdGlvbnMgKi8KIHN0YXRpYyBpbnQKIF9yYW5nZV9lcnJvcihjb25zdCBmb3JtYXRkZWYgKmYsIGludCBpc191bnNpZ25lZCkKIHsKLQkvKiB1bGFyZ2VzdCBpcyB0aGUgbGFyZ2VzdCB1bnNpZ25lZCB2YWx1ZSB3aXRoIGYtPnNpemUgYnl0ZXMuCi0JICogTm90ZSB0aGF0IHRoZSBzaW1wbGVyOgotCSAqICAgICAoKHNpemVfdCkxIDw8IChmLT5zaXplICogOCkpIC0gMQotCSAqIGRvZXNuJ3Qgd29yayB3aGVuIGYtPnNpemUgPT0gc2l6ZW9mKHNpemVfdCkgYmVjYXVzZSBDIGRvZXNuJ3QKLQkgKiBkZWZpbmUgd2hhdCBoYXBwZW5zIHdoZW4gYSBsZWZ0IHNoaWZ0IGNvdW50IGlzID49IHRoZSBudW1iZXIgb2YKLQkgKiBiaXRzIGluIHRoZSBpbnRlZ2VyIGJlaW5nIHNoaWZ0ZWQ7IGUuZy4sIG9uIHNvbWUgYm94ZXMgaXQgZG9lc24ndAotCSAqIHNoaWZ0IGF0IGFsbCB3aGVuIHRoZXkncmUgZXF1YWwuCi0JICovCi0JY29uc3Qgc2l6ZV90IHVsYXJnZXN0ID0gKHNpemVfdCktMSA+PiAoKFNJWkVPRl9TSVpFX1QgLSBmLT5zaXplKSo4KTsKLQlhc3NlcnQoZi0+c2l6ZSA+PSAxICYmIGYtPnNpemUgPD0gU0laRU9GX1NJWkVfVCk7Ci0JaWYgKGlzX3Vuc2lnbmVkKQotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkiJyVjJyBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gJXp1IiwKLQkJCWYtPmZvcm1hdCwKLQkJCXVsYXJnZXN0KTsKLQllbHNlIHsKLQkJY29uc3QgUHlfc3NpemVfdCBsYXJnZXN0ID0gKFB5X3NzaXplX3QpKHVsYXJnZXN0ID4+IDEpOwotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkiJyVjJyBmb3JtYXQgcmVxdWlyZXMgJXpkIDw9IG51bWJlciA8PSAlemQiLAotCQkJZi0+Zm9ybWF0LAotCQkJfiBsYXJnZXN0LAotCQkJbGFyZ2VzdCk7Ci0JfQotCXJldHVybiAtMTsKKyAgICAvKiB1bGFyZ2VzdCBpcyB0aGUgbGFyZ2VzdCB1bnNpZ25lZCB2YWx1ZSB3aXRoIGYtPnNpemUgYnl0ZXMuCisgICAgICogTm90ZSB0aGF0IHRoZSBzaW1wbGVyOgorICAgICAqICAgICAoKHNpemVfdCkxIDw8IChmLT5zaXplICogOCkpIC0gMQorICAgICAqIGRvZXNuJ3Qgd29yayB3aGVuIGYtPnNpemUgPT0gc2l6ZW9mKHNpemVfdCkgYmVjYXVzZSBDIGRvZXNuJ3QKKyAgICAgKiBkZWZpbmUgd2hhdCBoYXBwZW5zIHdoZW4gYSBsZWZ0IHNoaWZ0IGNvdW50IGlzID49IHRoZSBudW1iZXIgb2YKKyAgICAgKiBiaXRzIGluIHRoZSBpbnRlZ2VyIGJlaW5nIHNoaWZ0ZWQ7IGUuZy4sIG9uIHNvbWUgYm94ZXMgaXQgZG9lc24ndAorICAgICAqIHNoaWZ0IGF0IGFsbCB3aGVuIHRoZXkncmUgZXF1YWwuCisgICAgICovCisgICAgY29uc3Qgc2l6ZV90IHVsYXJnZXN0ID0gKHNpemVfdCktMSA+PiAoKFNJWkVPRl9TSVpFX1QgLSBmLT5zaXplKSo4KTsKKyAgICBhc3NlcnQoZi0+c2l6ZSA+PSAxICYmIGYtPnNpemUgPD0gU0laRU9GX1NJWkVfVCk7CisgICAgaWYgKGlzX3Vuc2lnbmVkKQorICAgICAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAiJyVjJyBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gJXp1IiwKKyAgICAgICAgICAgIGYtPmZvcm1hdCwKKyAgICAgICAgICAgIHVsYXJnZXN0KTsKKyAgICBlbHNlIHsKKyAgICAgICAgY29uc3QgUHlfc3NpemVfdCBsYXJnZXN0ID0gKFB5X3NzaXplX3QpKHVsYXJnZXN0ID4+IDEpOworICAgICAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAiJyVjJyBmb3JtYXQgcmVxdWlyZXMgJXpkIDw9IG51bWJlciA8PSAlemQiLAorICAgICAgICAgICAgZi0+Zm9ybWF0LAorICAgICAgICAgICAgfiBsYXJnZXN0LAorICAgICAgICAgICAgbGFyZ2VzdCk7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogCkBAIC0zNDksNzUgKzM0OSw3NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG51X2NoYXIoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCAxKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocCwgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV9ieXRlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICooc2lnbmVkIGNoYXIgKilwKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICooc2lnbmVkIGNoYXIgKilwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X3VieXRlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICoodW5zaWduZWQgY2hhciAqKXApOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKih1bnNpZ25lZCBjaGFyICopcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV9zaG9ydChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0Jc2hvcnQgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKKyAgICBzaG9ydCB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfdXNob3J0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQl1bnNpZ25lZCBzaG9ydCB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIHVuc2lnbmVkIHNob3J0IHg7CisgICAgbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV9pbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWludCB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIGludCB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfdWludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgaW50IHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICB1bnNpZ25lZCBpbnQgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwogI2lmIChTSVpFT0ZfTE9ORyA+IFNJWkVPRl9JTlQpCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKICNlbHNlCi0JaWYgKHggPD0gKCh1bnNpZ25lZCBpbnQpTE9OR19NQVgpKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXgpOworICAgIGlmICh4IDw9ICgodW5zaWduZWQgaW50KUxPTkdfTUFYKSkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyl4KTsKICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIGxvbmcgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X3Vsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlpZiAoeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh4KTsKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICBpZiAoeCA8PSBMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh4KTsKIH0KIAogLyogTmF0aXZlIG1vZGUgZG9lc24ndCBzdXBwb3J0IHEgb3IgUSB1bmxlc3MgdGhlIHBsYXRmb3JtIEMgc3VwcG9ydHMKQEAgLTQyOCwyMSArNDI4LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbnVfbG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCVBZX0xPTkdfTE9ORyB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JaWYgKHggPj0gTE9OR19NSU4gJiYgeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgUFlfTE9OR19MT05HLCBsb25nKSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoeCk7CisgICAgUFlfTE9OR19MT05HIHg7CisgICAgbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICBpZiAoeCA+PSBMT05HX01JTiAmJiB4IDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X3Vsb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlpZiAoeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh4KTsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIGlmICh4IDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOwogfQogCiAjZW5kaWYKQEAgLTQ1MCwxNjMgKzQ1MCwxNjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV9ib29sKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlCT09MX1RZUEUgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoeCAhPSAwKTsKKyAgICBCT09MX1RZUEUgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoeCAhPSAwKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWZsb2F0IHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpeCk7CisgICAgZmxvYXQgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSl4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X2RvdWJsZShjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JZG91YmxlIHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworICAgIGRvdWJsZSB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X3ZvaWRfcChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0Jdm9pZCAqeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoeCk7CisgICAgdm9pZCAqeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoeCk7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX2J5dGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlsb25nIHg7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoeCA8IC0xMjggfHwgeCA+IDEyNyl7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkiYnl0ZSBmb3JtYXQgcmVxdWlyZXMgLTEyOCA8PSBudW1iZXIgPD0gMTI3Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JKnAgPSAoY2hhcil4OwotCXJldHVybiAwOworICAgIGxvbmcgeDsKKyAgICBpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh4IDwgLTEyOCB8fCB4ID4gMTI3KXsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGUgZm9ybWF0IHJlcXVpcmVzIC0xMjggPD0gbnVtYmVyIDw9IDEyNyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpwID0gKGNoYXIpeDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbnBfdWJ5dGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlsb25nIHg7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoeCA8IDAgfHwgeCA+IDI1NSl7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkidWJ5dGUgZm9ybWF0IHJlcXVpcmVzIDAgPD0gbnVtYmVyIDw9IDI1NSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwID0gKGNoYXIpeDsKLQlyZXR1cm4gMDsKKyAgICBsb25nIHg7CisgICAgaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoeCA8IDAgfHwgeCA+IDI1NSl7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1Ynl0ZSBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gMjU1Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnAgPSAoY2hhcil4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF9jaGFyKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCBQeVN0cmluZ19TaXplKHYpICE9IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJjaGFyIGZvcm1hdCByZXF1aXJlIHN0cmluZyBvZiBsZW5ndGggMSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwID0gKlB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCXJldHVybiAwOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlTdHJpbmdfU2l6ZSh2KSAhPSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjaGFyIGZvcm1hdCByZXF1aXJlIHN0cmluZyBvZiBsZW5ndGggMSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpwID0gKlB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF9zaG9ydChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWxvbmcgeDsKLQlzaG9ydCB5OwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHggPCBTSFJUX01JTiB8fCB4ID4gU0hSVF9NQVgpewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInNob3J0IGZvcm1hdCByZXF1aXJlcyAiIFNUUklOR0lGWShTSFJUX01JTikKLQkJCQkiIDw9IG51bWJlciA8PSAiIFNUUklOR0lGWShTSFJUX01BWCkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXkgPSAoc2hvcnQpeDsKLQltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOwotCXJldHVybiAwOworICAgIGxvbmcgeDsKKyAgICBzaG9ydCB5OworICAgIGlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHggPCBTSFJUX01JTiB8fCB4ID4gU0hSVF9NQVgpeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hvcnQgZm9ybWF0IHJlcXVpcmVzICIgU1RSSU5HSUZZKFNIUlRfTUlOKQorICAgICAgICAgICAgICAgICAgICAgICAgIiA8PSBudW1iZXIgPD0gIiBTVFJJTkdJRlkoU0hSVF9NQVgpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB5ID0gKHNob3J0KXg7CisgICAgbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbnBfdXNob3J0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4OwotCXVuc2lnbmVkIHNob3J0IHk7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoeCA8IDAgfHwgeCA+IFVTSFJUX01BWCl7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkidXNob3J0IGZvcm1hdCByZXF1aXJlcyAwIDw9IG51bWJlciA8PSAiIFNUUklOR0lGWShVU0hSVF9NQVgpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl5ID0gKHVuc2lnbmVkIHNob3J0KXg7Ci0JbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKLQlyZXR1cm4gMDsKKyAgICBsb25nIHg7CisgICAgdW5zaWduZWQgc2hvcnQgeTsKKyAgICBpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh4IDwgMCB8fCB4ID4gVVNIUlRfTUFYKXsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInVzaG9ydCBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gIiBTVFJJTkdJRlkoVVNIUlRfTUFYKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeSA9ICh1bnNpZ25lZCBzaG9ydCl4OworICAgIG1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX2ludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWxvbmcgeDsKLQlpbnQgeTsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGxvbmcgeDsKKyAgICBpbnQgeTsKKyAgICBpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogI2lmIChTSVpFT0ZfTE9ORyA+IFNJWkVPRl9JTlQpCi0JaWYgKCh4IDwgKChsb25nKUlOVF9NSU4pKSB8fCAoeCA+ICgobG9uZylJTlRfTUFYKSkpCi0JCXJldHVybiBfcmFuZ2VfZXJyb3IoZiwgMCk7CisgICAgaWYgKCh4IDwgKChsb25nKUlOVF9NSU4pKSB8fCAoeCA+ICgobG9uZylJTlRfTUFYKSkpCisgICAgICAgIHJldHVybiBfcmFuZ2VfZXJyb3IoZiwgMCk7CiAjZW5kaWYKLQl5ID0gKGludCl4OwotCW1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7Ci0JcmV0dXJuIDA7CisgICAgeSA9IChpbnQpeDsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF91aW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCXVuc2lnbmVkIGludCB5OwotCWlmIChnZXRfdWxvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCXkgPSAodW5zaWduZWQgaW50KXg7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIHVuc2lnbmVkIGludCB5OworICAgIGlmIChnZXRfdWxvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHkgPSAodW5zaWduZWQgaW50KXg7CiAjaWYgKFNJWkVPRl9MT05HID4gU0laRU9GX0lOVCkKLQlpZiAoeCA+ICgodW5zaWduZWQgbG9uZylVSU5UX01BWCkpCi0JCXJldHVybiBfcmFuZ2VfZXJyb3IoZiwgMSk7CisgICAgaWYgKHggPiAoKHVuc2lnbmVkIGxvbmcpVUlOVF9NQVgpKQorICAgICAgICByZXR1cm4gX3JhbmdlX2Vycm9yKGYsIDEpOwogI2VuZGlmCi0JbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKLQlyZXR1cm4gMDsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF9sb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4OwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKLQlyZXR1cm4gMDsKKyAgICBsb25nIHg7CisgICAgaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF91bG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQlpZiAoZ2V0X3Vsb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOwotCXJldHVybiAwOworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBpZiAoZ2V0X3Vsb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOworICAgIHJldHVybiAwOwogfQogCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKQEAgLTYxNCwyMSArNjE0LDIxIEBACiBzdGF0aWMgaW50CiBucF9sb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCVBZX0xPTkdfTE9ORyB4OwotCWlmIChnZXRfbG9uZ2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7CisgICAgUFlfTE9OR19MT05HIHg7CisgICAgaWYgKGdldF9sb25nbG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbnBfdWxvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHg7Ci0JaWYgKGdldF91bG9uZ2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CisgICAgaWYgKGdldF91bG9uZ2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7CisgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApAQCAtNjM2LDc3ICs2MzYsNzcgQEAKIHN0YXRpYyBpbnQKIG5wX2Jvb2woY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlCT09MX1RZUEUgeTsKLQl5ID0gUHlPYmplY3RfSXNUcnVlKHYpOwotCW1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7Ci0JcmV0dXJuIDA7CisgICAgQk9PTF9UWVBFIHk7CisgICAgeSA9IFB5T2JqZWN0X0lzVHJ1ZSh2KTsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF9mbG9hdChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWZsb2F0IHggPSAoZmxvYXQpUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOwotCXJldHVybiAwOworICAgIGZsb2F0IHggPSAoZmxvYXQpUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX2RvdWJsZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mKGRvdWJsZSkpOwotCXJldHVybiAwOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YoZG91YmxlKSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX3ZvaWRfcChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXZvaWQgKng7CisgICAgdm9pZCAqeDsKIAotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKLQl4ID0gUHlMb25nX0FzVm9pZFB0cih2KTsKLQlQeV9ERUNSRUYodik7Ci0JaWYgKHggPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKLQlyZXR1cm4gMDsKKyAgICB2ID0gZ2V0X3B5bG9uZyh2KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CisgICAgeCA9IFB5TG9uZ19Bc1ZvaWRQdHIodik7CisgICAgUHlfREVDUkVGKHYpOworICAgIGlmICh4ID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBmb3JtYXRkZWYgbmF0aXZlX3RhYmxlW10gPSB7Ci0Jeyd4JywJc2l6ZW9mKGNoYXIpLAkwLAkJTlVMTH0sCi0JeydiJywJc2l6ZW9mKGNoYXIpLAkwLAkJbnVfYnl0ZSwJbnBfYnl0ZX0sCi0JeydCJywJc2l6ZW9mKGNoYXIpLAkwLAkJbnVfdWJ5dGUsCW5wX3VieXRlfSwKLQl7J2MnLAlzaXplb2YoY2hhciksCTAsCQludV9jaGFyLAlucF9jaGFyfSwKLQl7J3MnLAlzaXplb2YoY2hhciksCTAsCQlOVUxMfSwKLQl7J3AnLAlzaXplb2YoY2hhciksCTAsCQlOVUxMfSwKLQl7J2gnLAlzaXplb2Yoc2hvcnQpLAlTSE9SVF9BTElHTiwJbnVfc2hvcnQsCW5wX3Nob3J0fSwKLQl7J0gnLAlzaXplb2Yoc2hvcnQpLAlTSE9SVF9BTElHTiwJbnVfdXNob3J0LAlucF91c2hvcnR9LAotCXsnaScsCXNpemVvZihpbnQpLAlJTlRfQUxJR04sCW51X2ludCwJCW5wX2ludH0sCi0JeydJJywJc2l6ZW9mKGludCksCUlOVF9BTElHTiwJbnVfdWludCwJbnBfdWludH0sCi0JeydsJywJc2l6ZW9mKGxvbmcpLAlMT05HX0FMSUdOLAludV9sb25nLAlucF9sb25nfSwKLQl7J0wnLAlzaXplb2YobG9uZyksCUxPTkdfQUxJR04sCW51X3Vsb25nLAlucF91bG9uZ30sCisgICAgeyd4JywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBOVUxMfSwKKyAgICB7J2InLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIG51X2J5dGUsICAgICAgICBucF9ieXRlfSwKKyAgICB7J0InLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIG51X3VieXRlLCAgICAgICBucF91Ynl0ZX0sCisgICAgeydjJywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBudV9jaGFyLCAgICAgICAgbnBfY2hhcn0sCisgICAgeydzJywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBOVUxMfSwKKyAgICB7J3AnLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIE5VTEx9LAorICAgIHsnaCcsICAgICAgIHNpemVvZihzaG9ydCksICBTSE9SVF9BTElHTiwgICAgbnVfc2hvcnQsICAgICAgIG5wX3Nob3J0fSwKKyAgICB7J0gnLCAgICAgICBzaXplb2Yoc2hvcnQpLCAgU0hPUlRfQUxJR04sICAgIG51X3VzaG9ydCwgICAgICBucF91c2hvcnR9LAorICAgIHsnaScsICAgICAgIHNpemVvZihpbnQpLCAgICBJTlRfQUxJR04sICAgICAgbnVfaW50LCAgICAgICAgIG5wX2ludH0sCisgICAgeydJJywgICAgICAgc2l6ZW9mKGludCksICAgIElOVF9BTElHTiwgICAgICBudV91aW50LCAgICAgICAgbnBfdWludH0sCisgICAgeydsJywgICAgICAgc2l6ZW9mKGxvbmcpLCAgIExPTkdfQUxJR04sICAgICBudV9sb25nLCAgICAgICAgbnBfbG9uZ30sCisgICAgeydMJywgICAgICAgc2l6ZW9mKGxvbmcpLCAgIExPTkdfQUxJR04sICAgICBudV91bG9uZywgICAgICAgbnBfdWxvbmd9LAogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JeydxJywJc2l6ZW9mKFBZX0xPTkdfTE9ORyksIExPTkdfTE9OR19BTElHTiwgbnVfbG9uZ2xvbmcsIG5wX2xvbmdsb25nfSwKLQl7J1EnLAlzaXplb2YoUFlfTE9OR19MT05HKSwgTE9OR19MT05HX0FMSUdOLCBudV91bG9uZ2xvbmcsbnBfdWxvbmdsb25nfSwKKyAgICB7J3EnLCAgICAgICBzaXplb2YoUFlfTE9OR19MT05HKSwgTE9OR19MT05HX0FMSUdOLCBudV9sb25nbG9uZywgbnBfbG9uZ2xvbmd9LAorICAgIHsnUScsICAgICAgIHNpemVvZihQWV9MT05HX0xPTkcpLCBMT05HX0xPTkdfQUxJR04sIG51X3Vsb25nbG9uZyxucF91bG9uZ2xvbmd9LAogI2VuZGlmCi0Jeyc/JywJc2l6ZW9mKEJPT0xfVFlQRSksCUJPT0xfQUxJR04sCW51X2Jvb2wsCW5wX2Jvb2x9LAotCXsnZicsCXNpemVvZihmbG9hdCksCUZMT0FUX0FMSUdOLAludV9mbG9hdCwJbnBfZmxvYXR9LAotCXsnZCcsCXNpemVvZihkb3VibGUpLAlET1VCTEVfQUxJR04sCW51X2RvdWJsZSwJbnBfZG91YmxlfSwKLQl7J1AnLAlzaXplb2Yodm9pZCAqKSwJVk9JRF9QX0FMSUdOLAludV92b2lkX3AsCW5wX3ZvaWRfcH0sCi0JezB9CisgICAgeyc/JywgICAgICAgc2l6ZW9mKEJPT0xfVFlQRSksICAgICAgQk9PTF9BTElHTiwgICAgIG51X2Jvb2wsICAgICAgICBucF9ib29sfSwKKyAgICB7J2YnLCAgICAgICBzaXplb2YoZmxvYXQpLCAgRkxPQVRfQUxJR04sICAgIG51X2Zsb2F0LCAgICAgICBucF9mbG9hdH0sCisgICAgeydkJywgICAgICAgc2l6ZW9mKGRvdWJsZSksIERPVUJMRV9BTElHTiwgICBudV9kb3VibGUsICAgICAgbnBfZG91YmxlfSwKKyAgICB7J1AnLCAgICAgICBzaXplb2Yodm9pZCAqKSwgVk9JRF9QX0FMSUdOLCAgIG51X3ZvaWRfcCwgICAgICBucF92b2lkX3B9LAorICAgIHswfQogfTsKIAogLyogQmlnLWVuZGlhbiByb3V0aW5lcy4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03MTQsNTMgKzcxNCw1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1X2ludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4ID0gMDsKLQlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwotCWRvIHsKLQkJeCA9ICh4PDw4KSB8ICpieXRlcysrOwotCX0gd2hpbGUgKC0taSA+IDApOwotCS8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCi0JaWYgKFNJWkVPRl9MT05HID4gZi0+c2l6ZSkKLQkJeCB8PSAtKHggJiAoMUwgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKKyAgICBsb25nIHggPSAwOworICAgIFB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7CisgICAgZG8geworICAgICAgICB4ID0gKHg8PDgpIHwgKmJ5dGVzKys7CisgICAgfSB3aGlsZSAoLS1pID4gMCk7CisgICAgLyogRXh0ZW5kIHRoZSBzaWduIGJpdC4gKi8KKyAgICBpZiAoU0laRU9GX0xPTkcgPiBmLT5zaXplKQorICAgICAgICB4IHw9IC0oeCAmICgxTCA8PCAoKDggKiBmLT5zaXplKSAtIDEpKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVfdWludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgbG9uZyB4ID0gMDsKLQlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwotCWRvIHsKLQkJeCA9ICh4PDw4KSB8ICpieXRlcysrOwotCX0gd2hpbGUgKC0taSA+IDApOwotCWlmICh4IDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHgpOworICAgIHVuc2lnbmVkIGxvbmcgeCA9IDA7CisgICAgUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKKyAgICBkbyB7CisgICAgICAgIHggPSAoeDw8OCkgfCAqYnl0ZXMrKzsKKyAgICB9IHdoaWxlICgtLWkgPiAwKTsKKyAgICBpZiAoeCA8PSBMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1X2xvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCVBZX0xPTkdfTE9ORyB4ID0gMDsKLQlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwotCWRvIHsKLQkJeCA9ICh4PDw4KSB8ICpieXRlcysrOwotCX0gd2hpbGUgKC0taSA+IDApOwotCS8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCi0JaWYgKFNJWkVPRl9MT05HX0xPTkcgPiBmLT5zaXplKQotCQl4IHw9IC0oeCAmICgoUFlfTE9OR19MT05HKTEgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOwotCWlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIFBZX0xPTkdfTE9ORywgbG9uZykpOwotCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOworICAgIFBZX0xPTkdfTE9ORyB4ID0gMDsKKyAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOworICAgIGRvIHsKKyAgICAgICAgeCA9ICh4PDw4KSB8ICpieXRlcysrOworICAgIH0gd2hpbGUgKC0taSA+IDApOworICAgIC8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCisgICAgaWYgKFNJWkVPRl9MT05HX0xPTkcgPiBmLT5zaXplKQorICAgICAgICB4IHw9IC0oeCAmICgoUFlfTE9OR19MT05HKTEgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworICAgIGlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIFBZX0xPTkdfTE9ORywgbG9uZykpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOwogI2Vsc2UKLQlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgICAgICA4LAotCQkJCSAgICAgIDAsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLQkJCQkgICAgICAxICAvKiBzaWduZWQgKi8pOworICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbGl0dGxlLWVuZGlhbiAqLworICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIHNpZ25lZCAqLyk7CiAjZW5kaWYKIH0KIApAQCAtNzY4LDE3MSArNzY4LDE3MSBAQAogYnVfdWxvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4ID0gMDsKLQlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwotCWRvIHsKLQkJeCA9ICh4PDw4KSB8ICpieXRlcysrOwotCX0gd2hpbGUgKC0taSA+IDApOwotCWlmICh4IDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4ID0gMDsKKyAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOworICAgIGRvIHsKKyAgICAgICAgeCA9ICh4PDw4KSB8ICpieXRlcysrOworICAgIH0gd2hpbGUgKC0taSA+IDApOworICAgIGlmICh4IDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOwogI2Vsc2UKLQlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgICAgICA4LAotCQkJCSAgICAgIDAsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLQkJCQkgICAgICAwICAvKiBzaWduZWQgKi8pOworICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbGl0dGxlLWVuZGlhbiAqLworICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIHNpZ25lZCAqLyk7CiAjZW5kaWYKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1X2Zsb2F0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlyZXR1cm4gdW5wYWNrX2Zsb2F0KHAsIDApOworICAgIHJldHVybiB1bnBhY2tfZmxvYXQocCwgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidV9kb3VibGUoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXJldHVybiB1bnBhY2tfZG91YmxlKHAsIDApOworICAgIHJldHVybiB1bnBhY2tfZG91YmxlKHAsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVfYm9vbChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JY2hhciB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyh4ICE9IDApOworICAgIGNoYXIgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoeCAhPSAwKTsKIH0KIAogc3RhdGljIGludAogYnBfaW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4OwotCVB5X3NzaXplX3QgaTsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWkgPSBmLT5zaXplOwotCWlmIChpICE9IFNJWkVPRl9MT05HKSB7Ci0JCWlmICgoaSA9PSAyKSAmJiAoeCA8IC0zMjc2OCB8fCB4ID4gMzI3NjcpKQotCQkJcmV0dXJuIF9yYW5nZV9lcnJvcihmLCAwKTsKKyAgICBsb25nIHg7CisgICAgUHlfc3NpemVfdCBpOworICAgIGlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaSA9IGYtPnNpemU7CisgICAgaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKKyAgICAgICAgaWYgKChpID09IDIpICYmICh4IDwgLTMyNzY4IHx8IHggPiAzMjc2NykpCisgICAgICAgICAgICByZXR1cm4gX3JhbmdlX2Vycm9yKGYsIDApOwogI2lmIChTSVpFT0ZfTE9ORyAhPSA0KQotCQllbHNlIGlmICgoaSA9PSA0KSAmJiAoeCA8IC0yMTQ3NDgzNjQ4TCB8fCB4ID4gMjE0NzQ4MzY0N0wpKQotCQkJcmV0dXJuIF9yYW5nZV9lcnJvcihmLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoKGkgPT0gNCkgJiYgKHggPCAtMjE0NzQ4MzY0OEwgfHwgeCA+IDIxNDc0ODM2NDdMKSkKKyAgICAgICAgICAgIHJldHVybiBfcmFuZ2VfZXJyb3IoZiwgMCk7CiAjZW5kaWYKLQl9Ci0JZG8gewotCQlwWy0taV0gPSAoY2hhcil4OwotCQl4ID4+PSA4OwotCX0gd2hpbGUgKGkgPiAwKTsKLQlyZXR1cm4gMDsKKyAgICB9CisgICAgZG8geworICAgICAgICBwWy0taV0gPSAoY2hhcil4OworICAgICAgICB4ID4+PSA4OworICAgIH0gd2hpbGUgKGkgPiAwKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogYnBfdWludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQlQeV9zc2l6ZV90IGk7Ci0JaWYgKGdldF91bG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaSA9IGYtPnNpemU7Ci0JaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKLQkJdW5zaWduZWQgbG9uZyBtYXhpbnQgPSAxOwotCQltYXhpbnQgPDw9ICh1bnNpZ25lZCBsb25nKShpICogOCk7Ci0JCWlmICh4ID49IG1heGludCkKLQkJCXJldHVybiBfcmFuZ2VfZXJyb3IoZiwgMSk7Ci0JfQotCWRvIHsKLQkJcFstLWldID0gKGNoYXIpeDsKLQkJeCA+Pj0gODsKLQl9IHdoaWxlIChpID4gMCk7Ci0JcmV0dXJuIDA7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpZiAoZ2V0X3Vsb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpID0gZi0+c2l6ZTsKKyAgICBpZiAoaSAhPSBTSVpFT0ZfTE9ORykgeworICAgICAgICB1bnNpZ25lZCBsb25nIG1heGludCA9IDE7CisgICAgICAgIG1heGludCA8PD0gKHVuc2lnbmVkIGxvbmcpKGkgKiA4KTsKKyAgICAgICAgaWYgKHggPj0gbWF4aW50KQorICAgICAgICAgICAgcmV0dXJuIF9yYW5nZV9lcnJvcihmLCAxKTsKKyAgICB9CisgICAgZG8geworICAgICAgICBwWy0taV0gPSAoY2hhcil4OworICAgICAgICB4ID4+PSA4OworICAgIH0gd2hpbGUgKGkgPiAwKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogYnBfbG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlpbnQgcmVzOwotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QgKil2LAotCQkJCSAgKHVuc2lnbmVkIGNoYXIgKilwLAotCQkJCSAgOCwKLQkJCQkgIDAsIC8qIGxpdHRsZV9lbmRpYW4gKi8KLQkJCQkgIDEgIC8qIHNpZ25lZCAqLyk7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiByZXM7CisgICAgaW50IHJlczsKKyAgICB2ID0gZ2V0X3B5bG9uZyh2KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0ICopdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBsaXR0bGVfZW5kaWFuICovCisgICAgICAgICAgICAgICAgICAxICAvKiBzaWduZWQgKi8pOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBicF91bG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlpbnQgcmVzOwotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QgKil2LAotCQkJCSAgKHVuc2lnbmVkIGNoYXIgKilwLAotCQkJCSAgOCwKLQkJCQkgIDAsIC8qIGxpdHRsZV9lbmRpYW4gKi8KLQkJCQkgIDAgIC8qIHNpZ25lZCAqLyk7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiByZXM7CisgICAgaW50IHJlczsKKyAgICB2ID0gZ2V0X3B5bG9uZyh2KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0ICopdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBsaXR0bGVfZW5kaWFuICovCisgICAgICAgICAgICAgICAgICAwICAvKiBzaWduZWQgKi8pOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBicF9mbG9hdChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAwKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAwKTsKIH0KIAogc3RhdGljIGludAogYnBfZG91YmxlKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDApOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDApOwogfQogCiBzdGF0aWMgaW50CiBicF9ib29sKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JY2hhciB5OwotCXkgPSBQeU9iamVjdF9Jc1RydWUodik7Ci0JbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKLQlyZXR1cm4gMDsKKyAgICBjaGFyIHk7CisgICAgeSA9IFB5T2JqZWN0X0lzVHJ1ZSh2KTsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgZm9ybWF0ZGVmIGJpZ2VuZGlhbl90YWJsZVtdID0gewotCXsneCcsCTEsCQkwLAkJTlVMTH0sCi0JeydiJywJMSwJCTAsCQludV9ieXRlLAlucF9ieXRlfSwKLQl7J0InLAkxLAkJMCwJCW51X3VieXRlLAlucF91Ynl0ZX0sCi0JeydjJywJMSwJCTAsCQludV9jaGFyLAlucF9jaGFyfSwKLQl7J3MnLAkxLAkJMCwJCU5VTEx9LAotCXsncCcsCTEsCQkwLAkJTlVMTH0sCi0JeydoJywJMiwJCTAsCQlidV9pbnQsCQlicF9pbnR9LAotCXsnSCcsCTIsCQkwLAkJYnVfdWludCwJYnBfdWludH0sCi0JeydpJywJNCwJCTAsCQlidV9pbnQsCQlicF9pbnR9LAotCXsnSScsCTQsCQkwLAkJYnVfdWludCwJYnBfdWludH0sCi0JeydsJywJNCwJCTAsCQlidV9pbnQsCQlicF9pbnR9LAotCXsnTCcsCTQsCQkwLAkJYnVfdWludCwJYnBfdWludH0sCi0JeydxJywJOCwJCTAsCQlidV9sb25nbG9uZywJYnBfbG9uZ2xvbmd9LAotCXsnUScsCTgsCQkwLAkJYnVfdWxvbmdsb25nLAlicF91bG9uZ2xvbmd9LAotCXsnPycsCTEsCQkwLAkJYnVfYm9vbCwJYnBfYm9vbH0sCi0JeydmJywJNCwJCTAsCQlidV9mbG9hdCwJYnBfZmxvYXR9LAotCXsnZCcsCTgsCQkwLAkJYnVfZG91YmxlLAlicF9kb3VibGV9LAotCXswfQorICAgIHsneCcsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgTlVMTH0sCisgICAgeydiJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBudV9ieXRlLCAgICAgICAgbnBfYnl0ZX0sCisgICAgeydCJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBudV91Ynl0ZSwgICAgICAgbnBfdWJ5dGV9LAorICAgIHsnYycsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbnVfY2hhciwgICAgICAgIG5wX2NoYXJ9LAorICAgIHsncycsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgTlVMTH0sCisgICAgeydwJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBOVUxMfSwKKyAgICB7J2gnLCAgICAgICAyLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X2ludCwgICAgICAgICBicF9pbnR9LAorICAgIHsnSCcsICAgICAgIDIsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfdWludCwgICAgICAgIGJwX3VpbnR9LAorICAgIHsnaScsICAgICAgIDQsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfaW50LCAgICAgICAgIGJwX2ludH0sCisgICAgeydJJywgICAgICAgNCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV91aW50LCAgICAgICAgYnBfdWludH0sCisgICAgeydsJywgICAgICAgNCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9pbnQsICAgICAgICAgYnBfaW50fSwKKyAgICB7J0wnLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X3VpbnQsICAgICAgICBicF91aW50fSwKKyAgICB7J3EnLCAgICAgICA4LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X2xvbmdsb25nLCAgICBicF9sb25nbG9uZ30sCisgICAgeydRJywgICAgICAgOCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV91bG9uZ2xvbmcsICAgYnBfdWxvbmdsb25nfSwKKyAgICB7Jz8nLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X2Jvb2wsICAgICAgICBicF9ib29sfSwKKyAgICB7J2YnLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X2Zsb2F0LCAgICAgICBicF9mbG9hdH0sCisgICAgeydkJywgICAgICAgOCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9kb3VibGUsICAgICAgYnBfZG91YmxlfSwKKyAgICB7MH0KIH07CiAKIC8qIExpdHRsZS1lbmRpYW4gcm91dGluZXMuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTQwLDUzICs5NDAsNTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsdV9pbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWxvbmcgeCA9IDA7Ci0JUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCBieXRlc1stLWldOwotCX0gd2hpbGUgKGkgPiAwKTsKLQkvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLwotCWlmIChTSVpFT0ZfTE9ORyA+IGYtPnNpemUpCi0JCXggfD0gLSh4ICYgKDFMIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgbG9uZyB4ID0gMDsKKyAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOworICAgIGRvIHsKKyAgICAgICAgeCA9ICh4PDw4KSB8IGJ5dGVzWy0taV07CisgICAgfSB3aGlsZSAoaSA+IDApOworICAgIC8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCisgICAgaWYgKFNJWkVPRl9MT05HID4gZi0+c2l6ZSkKKyAgICAgICAgeCB8PSAtKHggJiAoMUwgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGx1X3VpbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXVuc2lnbmVkIGxvbmcgeCA9IDA7Ci0JUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCBieXRlc1stLWldOwotCX0gd2hpbGUgKGkgPiAwKTsKLQlpZiAoeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygobG9uZyl4KTsKKyAgICB1bnNpZ25lZCBsb25nIHggPSAwOworICAgIFB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7CisgICAgZG8geworICAgICAgICB4ID0gKHg8PDgpIHwgYnl0ZXNbLS1pXTsKKyAgICB9IHdoaWxlIChpID4gMCk7CisgICAgaWYgKHggPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKGxvbmcpeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsdV9sb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQlQWV9MT05HX0xPTkcgeCA9IDA7Ci0JUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCBieXRlc1stLWldOwotCX0gd2hpbGUgKGkgPiAwKTsKLQkvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLwotCWlmIChTSVpFT0ZfTE9OR19MT05HID4gZi0+c2l6ZSkKLQkJeCB8PSAtKHggJiAoKFBZX0xPTkdfTE9ORykxIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKLQlpZiAoeCA+PSBMT05HX01JTiAmJiB4IDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh4KTsKKyAgICBQWV9MT05HX0xPTkcgeCA9IDA7CisgICAgUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKKyAgICBkbyB7CisgICAgICAgIHggPSAoeDw8OCkgfCBieXRlc1stLWldOworICAgIH0gd2hpbGUgKGkgPiAwKTsKKyAgICAvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLworICAgIGlmIChTSVpFT0ZfTE9OR19MT05HID4gZi0+c2l6ZSkKKyAgICAgICAgeCB8PSAtKHggJiAoKFBZX0xPTkdfTE9ORykxIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKKyAgICBpZiAoeCA+PSBMT05HX01JTiAmJiB4IDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh4KTsKICNlbHNlCi0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICAgICAgOCwKLQkJCQkgICAgICAxLCAvKiBsaXR0bGUtZW5kaWFuICovCi0JCQkJICAgICAgMSAgLyogc2lnbmVkICovKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qIGxpdHRsZS1lbmRpYW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAxICAvKiBzaWduZWQgKi8pOwogI2VuZGlmCiB9CiAKQEAgLTk5NCwxODIgKzk5NCwxODIgQEAKIGx1X3Vsb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeCA9IDA7Ci0JUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCBieXRlc1stLWldOwotCX0gd2hpbGUgKGkgPiAwKTsKLQlpZiAoeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh4KTsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeCA9IDA7CisgICAgUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKKyAgICBkbyB7CisgICAgICAgIHggPSAoeDw8OCkgfCBieXRlc1stLWldOworICAgIH0gd2hpbGUgKGkgPiAwKTsKKyAgICBpZiAoeCA8PSBMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh4KTsKICNlbHNlCi0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICAgICAgOCwKLQkJCQkgICAgICAxLCAvKiBsaXR0bGUtZW5kaWFuICovCi0JCQkJICAgICAgMCAgLyogc2lnbmVkICovKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qIGxpdHRsZS1lbmRpYW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAwICAvKiBzaWduZWQgKi8pOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsdV9mbG9hdChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JcmV0dXJuIHVucGFja19mbG9hdChwLCAxKTsKKyAgICByZXR1cm4gdW5wYWNrX2Zsb2F0KHAsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbHVfZG91YmxlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlyZXR1cm4gdW5wYWNrX2RvdWJsZShwLCAxKTsKKyAgICByZXR1cm4gdW5wYWNrX2RvdWJsZShwLCAxKTsKIH0KIAogc3RhdGljIGludAogbHBfaW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4OwotCVB5X3NzaXplX3QgaTsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWkgPSBmLT5zaXplOwotCWlmIChpICE9IFNJWkVPRl9MT05HKSB7Ci0JCWlmICgoaSA9PSAyKSAmJiAoeCA8IC0zMjc2OCB8fCB4ID4gMzI3NjcpKQotCQkJcmV0dXJuIF9yYW5nZV9lcnJvcihmLCAwKTsKKyAgICBsb25nIHg7CisgICAgUHlfc3NpemVfdCBpOworICAgIGlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaSA9IGYtPnNpemU7CisgICAgaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKKyAgICAgICAgaWYgKChpID09IDIpICYmICh4IDwgLTMyNzY4IHx8IHggPiAzMjc2NykpCisgICAgICAgICAgICByZXR1cm4gX3JhbmdlX2Vycm9yKGYsIDApOwogI2lmIChTSVpFT0ZfTE9ORyAhPSA0KQotCQllbHNlIGlmICgoaSA9PSA0KSAmJiAoeCA8IC0yMTQ3NDgzNjQ4TCB8fCB4ID4gMjE0NzQ4MzY0N0wpKQotCQkJcmV0dXJuIF9yYW5nZV9lcnJvcihmLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoKGkgPT0gNCkgJiYgKHggPCAtMjE0NzQ4MzY0OEwgfHwgeCA+IDIxNDc0ODM2NDdMKSkKKyAgICAgICAgICAgIHJldHVybiBfcmFuZ2VfZXJyb3IoZiwgMCk7CiAjZW5kaWYKLQl9Ci0JZG8gewotCQkqcCsrID0gKGNoYXIpeDsKLQkJeCA+Pj0gODsKLQl9IHdoaWxlICgtLWkgPiAwKTsKLQlyZXR1cm4gMDsKKyAgICB9CisgICAgZG8geworICAgICAgICAqcCsrID0gKGNoYXIpeDsKKyAgICAgICAgeCA+Pj0gODsKKyAgICB9IHdoaWxlICgtLWkgPiAwKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbHBfdWludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQlQeV9zc2l6ZV90IGk7Ci0JaWYgKGdldF91bG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaSA9IGYtPnNpemU7Ci0JaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKLQkJdW5zaWduZWQgbG9uZyBtYXhpbnQgPSAxOwotCQltYXhpbnQgPDw9ICh1bnNpZ25lZCBsb25nKShpICogOCk7Ci0JCWlmICh4ID49IG1heGludCkKLQkJCXJldHVybiBfcmFuZ2VfZXJyb3IoZiwgMSk7Ci0JfQotCWRvIHsKLQkJKnArKyA9IChjaGFyKXg7Ci0JCXggPj49IDg7Ci0JfSB3aGlsZSAoLS1pID4gMCk7Ci0JcmV0dXJuIDA7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpZiAoZ2V0X3Vsb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpID0gZi0+c2l6ZTsKKyAgICBpZiAoaSAhPSBTSVpFT0ZfTE9ORykgeworICAgICAgICB1bnNpZ25lZCBsb25nIG1heGludCA9IDE7CisgICAgICAgIG1heGludCA8PD0gKHVuc2lnbmVkIGxvbmcpKGkgKiA4KTsKKyAgICAgICAgaWYgKHggPj0gbWF4aW50KQorICAgICAgICAgICAgcmV0dXJuIF9yYW5nZV9lcnJvcihmLCAxKTsKKyAgICB9CisgICAgZG8geworICAgICAgICAqcCsrID0gKGNoYXIpeDsKKyAgICAgICAgeCA+Pj0gODsKKyAgICB9IHdoaWxlICgtLWkgPiAwKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbHBfbG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlpbnQgcmVzOwotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QqKXYsCi0JCQkJICAodW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICA4LAotCQkJCSAgMSwgLyogbGl0dGxlX2VuZGlhbiAqLwotCQkJCSAgMSAgLyogc2lnbmVkICovKTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIHJlczsKKyAgICBpbnQgcmVzOworICAgIHYgPSBnZXRfcHlsb25nKHYpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QqKXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogbGl0dGxlX2VuZGlhbiAqLworICAgICAgICAgICAgICAgICAgMSAgLyogc2lnbmVkICovKTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogbHBfdWxvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JaW50IHJlczsKLQl2ID0gZ2V0X3B5bG9uZyh2KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0Kil2LAotCQkJCSAgKHVuc2lnbmVkIGNoYXIgKilwLAotCQkJCSAgOCwKLQkJCQkgIDEsIC8qIGxpdHRsZV9lbmRpYW4gKi8KLQkJCQkgIDAgIC8qIHNpZ25lZCAqLyk7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiByZXM7CisgICAgaW50IHJlczsKKyAgICB2ID0gZ2V0X3B5bG9uZyh2KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0Kil2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qIGxpdHRsZV9lbmRpYW4gKi8KKyAgICAgICAgICAgICAgICAgIDAgIC8qIHNpZ25lZCAqLyk7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIGxwX2Zsb2F0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBfUHlGbG9hdF9QYWNrNCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDEpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBfUHlGbG9hdF9QYWNrNCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDEpOwogfQogCiBzdGF0aWMgaW50CiBscF9kb3VibGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIF9QeUZsb2F0X1BhY2s4KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMSk7CisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIF9QeUZsb2F0X1BhY2s4KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMSk7CiB9CiAKIHN0YXRpYyBmb3JtYXRkZWYgbGlsZW5kaWFuX3RhYmxlW10gPSB7Ci0Jeyd4JywJMSwJCTAsCQlOVUxMfSwKLQl7J2InLAkxLAkJMCwJCW51X2J5dGUsCW5wX2J5dGV9LAotCXsnQicsCTEsCQkwLAkJbnVfdWJ5dGUsCW5wX3VieXRlfSwKLQl7J2MnLAkxLAkJMCwJCW51X2NoYXIsCW5wX2NoYXJ9LAotCXsncycsCTEsCQkwLAkJTlVMTH0sCi0JeydwJywJMSwJCTAsCQlOVUxMfSwKLQl7J2gnLAkyLAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCi0JeydIJywJMiwJCTAsCQlsdV91aW50LAlscF91aW50fSwKLQl7J2knLAk0LAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCi0JeydJJywJNCwJCTAsCQlsdV91aW50LAlscF91aW50fSwKLQl7J2wnLAk0LAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCi0JeydMJywJNCwJCTAsCQlsdV91aW50LAlscF91aW50fSwKLQl7J3EnLAk4LAkJMCwJCWx1X2xvbmdsb25nLAlscF9sb25nbG9uZ30sCi0JeydRJywJOCwJCTAsCQlsdV91bG9uZ2xvbmcsCWxwX3Vsb25nbG9uZ30sCi0Jeyc/JywJMSwJCTAsCQlidV9ib29sLAlicF9ib29sfSwgLyogU3RkIHJlcCBub3QgZW5kaWFuIGRlcCwKLQkJYnV0IHBvdGVudGlhbGx5IGRpZmZlcmVudCBmcm9tIG5hdGl2ZSByZXAgLS0gcmV1c2UgYnhfYm9vbCBmdW5jcy4gKi8KLQl7J2YnLAk0LAkJMCwJCWx1X2Zsb2F0LAlscF9mbG9hdH0sCi0JeydkJywJOCwJCTAsCQlsdV9kb3VibGUsCWxwX2RvdWJsZX0sCi0JezB9CisgICAgeyd4JywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBOVUxMfSwKKyAgICB7J2InLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIG51X2J5dGUsICAgICAgICBucF9ieXRlfSwKKyAgICB7J0InLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIG51X3VieXRlLCAgICAgICBucF91Ynl0ZX0sCisgICAgeydjJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBudV9jaGFyLCAgICAgICAgbnBfY2hhcn0sCisgICAgeydzJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBOVUxMfSwKKyAgICB7J3AnLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIE5VTEx9LAorICAgIHsnaCcsICAgICAgIDIsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfaW50LCAgICAgICAgIGxwX2ludH0sCisgICAgeydIJywgICAgICAgMiwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBsdV91aW50LCAgICAgICAgbHBfdWludH0sCisgICAgeydpJywgICAgICAgNCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBsdV9pbnQsICAgICAgICAgbHBfaW50fSwKKyAgICB7J0knLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X3VpbnQsICAgICAgICBscF91aW50fSwKKyAgICB7J2wnLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X2ludCwgICAgICAgICBscF9pbnR9LAorICAgIHsnTCcsICAgICAgIDQsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfdWludCwgICAgICAgIGxwX3VpbnR9LAorICAgIHsncScsICAgICAgIDgsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfbG9uZ2xvbmcsICAgIGxwX2xvbmdsb25nfSwKKyAgICB7J1EnLCAgICAgICA4LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X3Vsb25nbG9uZywgICBscF91bG9uZ2xvbmd9LAorICAgIHsnPycsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfYm9vbCwgICAgICAgIGJwX2Jvb2x9LCAvKiBTdGQgcmVwIG5vdCBlbmRpYW4gZGVwLAorICAgICAgICBidXQgcG90ZW50aWFsbHkgZGlmZmVyZW50IGZyb20gbmF0aXZlIHJlcCAtLSByZXVzZSBieF9ib29sIGZ1bmNzLiAqLworICAgIHsnZicsICAgICAgIDQsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfZmxvYXQsICAgICAgIGxwX2Zsb2F0fSwKKyAgICB7J2QnLCAgICAgICA4LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X2RvdWJsZSwgICAgICBscF9kb3VibGV9LAorICAgIHswfQogfTsKIAogCiBzdGF0aWMgY29uc3QgZm9ybWF0ZGVmICoKIHdoaWNodGFibGUoY2hhciAqKnBmbXQpCiB7Ci0JY29uc3QgY2hhciAqZm10ID0gKCpwZm10KSsrOyAvKiBNYXkgYmUgYmFja2VkIG91dCBvZiBsYXRlciAqLwotCXN3aXRjaCAoKmZtdCkgewotCWNhc2UgJzwnOgotCQlyZXR1cm4gbGlsZW5kaWFuX3RhYmxlOwotCWNhc2UgJz4nOgotCWNhc2UgJyEnOiAvKiBOZXR3b3JrIGJ5dGUgb3JkZXIgaXMgYmlnLWVuZGlhbiAqLwotCQlyZXR1cm4gYmlnZW5kaWFuX3RhYmxlOwotCWNhc2UgJz0nOiB7IC8qIEhvc3QgYnl0ZSBvcmRlciAtLSBkaWZmZXJlbnQgZnJvbSBuYXRpdmUgaW4gYWxpZ21lbnQhICovCi0JCWludCBuID0gMTsKLQkJY2hhciAqcCA9IChjaGFyICopICZuOwotCQlpZiAoKnAgPT0gMSkKLQkJCXJldHVybiBsaWxlbmRpYW5fdGFibGU7Ci0JCWVsc2UKLQkJCXJldHVybiBiaWdlbmRpYW5fdGFibGU7Ci0JfQotCWRlZmF1bHQ6Ci0JCS0tKnBmbXQ7IC8qIEJhY2sgb3V0IG9mIHBvaW50ZXIgaW5jcmVtZW50ICovCi0JCS8qIEZhbGwgdGhyb3VnaCAqLwotCWNhc2UgJ0AnOgotCQlyZXR1cm4gbmF0aXZlX3RhYmxlOwotCX0KKyAgICBjb25zdCBjaGFyICpmbXQgPSAoKnBmbXQpKys7IC8qIE1heSBiZSBiYWNrZWQgb3V0IG9mIGxhdGVyICovCisgICAgc3dpdGNoICgqZm10KSB7CisgICAgY2FzZSAnPCc6CisgICAgICAgIHJldHVybiBsaWxlbmRpYW5fdGFibGU7CisgICAgY2FzZSAnPic6CisgICAgY2FzZSAnISc6IC8qIE5ldHdvcmsgYnl0ZSBvcmRlciBpcyBiaWctZW5kaWFuICovCisgICAgICAgIHJldHVybiBiaWdlbmRpYW5fdGFibGU7CisgICAgY2FzZSAnPSc6IHsgLyogSG9zdCBieXRlIG9yZGVyIC0tIGRpZmZlcmVudCBmcm9tIG5hdGl2ZSBpbiBhbGlnbWVudCEgKi8KKyAgICAgICAgaW50IG4gPSAxOworICAgICAgICBjaGFyICpwID0gKGNoYXIgKikgJm47CisgICAgICAgIGlmICgqcCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIGxpbGVuZGlhbl90YWJsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGJpZ2VuZGlhbl90YWJsZTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgLS0qcGZtdDsgLyogQmFjayBvdXQgb2YgcG9pbnRlciBpbmNyZW1lbnQgKi8KKyAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgY2FzZSAnQCc6CisgICAgICAgIHJldHVybiBuYXRpdmVfdGFibGU7CisgICAgfQogfQogCiAKQEAgLTExNzgsMTMgKzExNzgsMTMgQEAKIHN0YXRpYyBjb25zdCBmb3JtYXRkZWYgKgogZ2V0ZW50cnkoaW50IGMsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlmb3IgKDsgZi0+Zm9ybWF0ICE9ICdcMCc7IGYrKykgewotCQlpZiAoZi0+Zm9ybWF0ID09IGMpIHsKLQkJCXJldHVybiBmOwotCQl9Ci0JfQotCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwgImJhZCBjaGFyIGluIHN0cnVjdCBmb3JtYXQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBmb3IgKDsgZi0+Zm9ybWF0ICE9ICdcMCc7IGYrKykgeworICAgICAgICBpZiAoZi0+Zm9ybWF0ID09IGMpIHsKKyAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICB9CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwgImJhZCBjaGFyIGluIHN0cnVjdCBmb3JtYXQiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC0xMTkzLDE0ICsxMTkzLDE0IEBACiBzdGF0aWMgaW50CiBhbGlnbihQeV9zc2l6ZV90IHNpemUsIGNoYXIgYywgY29uc3QgZm9ybWF0ZGVmICplKQogewotCWlmIChlLT5mb3JtYXQgPT0gYykgewotCQlpZiAoZS0+YWxpZ25tZW50KSB7Ci0JCQlzaXplID0gKChzaXplICsgZS0+YWxpZ25tZW50IC0gMSkKLQkJCQkvIGUtPmFsaWdubWVudCkKLQkJCQkqIGUtPmFsaWdubWVudDsKLQkJfQotCX0KLQlyZXR1cm4gc2l6ZTsKKyAgICBpZiAoZS0+Zm9ybWF0ID09IGMpIHsKKyAgICAgICAgaWYgKGUtPmFsaWdubWVudCkgeworICAgICAgICAgICAgc2l6ZSA9ICgoc2l6ZSArIGUtPmFsaWdubWVudCAtIDEpCisgICAgICAgICAgICAgICAgLyBlLT5hbGlnbm1lbnQpCisgICAgICAgICAgICAgICAgKiBlLT5hbGlnbm1lbnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNpemU7CiB9CiAKIApAQCAtMTIwOSwyMDcgKzEyMDksMjA3IEBACiBzdGF0aWMgaW50CiBwcmVwYXJlX3MoUHlTdHJ1Y3RPYmplY3QgKnNlbGYpCiB7Ci0JY29uc3QgZm9ybWF0ZGVmICpmOwotCWNvbnN0IGZvcm1hdGRlZiAqZTsKLQlmb3JtYXRjb2RlICpjb2RlczsKKyAgICBjb25zdCBmb3JtYXRkZWYgKmY7CisgICAgY29uc3QgZm9ybWF0ZGVmICplOworICAgIGZvcm1hdGNvZGUgKmNvZGVzOwogCi0JY29uc3QgY2hhciAqczsKLQljb25zdCBjaGFyICpmbXQ7Ci0JY2hhciBjOwotCVB5X3NzaXplX3Qgc2l6ZSwgbGVuLCBudW0sIGl0ZW1zaXplLCB4OworICAgIGNvbnN0IGNoYXIgKnM7CisgICAgY29uc3QgY2hhciAqZm10OworICAgIGNoYXIgYzsKKyAgICBQeV9zc2l6ZV90IHNpemUsIGxlbiwgbnVtLCBpdGVtc2l6ZSwgeDsKIAotCWZtdCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmLT5zX2Zvcm1hdCk7CisgICAgZm10ID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYtPnNfZm9ybWF0KTsKIAotCWYgPSB3aGljaHRhYmxlKChjaGFyICoqKSZmbXQpOworICAgIGYgPSB3aGljaHRhYmxlKChjaGFyICoqKSZmbXQpOwogCi0JcyA9IGZtdDsKLQlzaXplID0gMDsKLQlsZW4gPSAwOwotCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKLQkJaWYgKGlzc3BhY2UoUHlfQ0hBUk1BU0soYykpKQotCQkJY29udGludWU7Ci0JCWlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgewotCQkJbnVtID0gYyAtICcwJzsKLQkJCXdoaWxlICgnMCcgPD0gKGMgPSAqcysrKSAmJiBjIDw9ICc5JykgewotCQkJCXggPSBudW0qMTAgKyAoYyAtICcwJyk7Ci0JCQkJaWYgKHgvMTAgIT0gbnVtKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQkJCVN0cnVjdEVycm9yLAotCQkJCQkJIm92ZXJmbG93IGluIGl0ZW0gY291bnQiKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQludW0gPSB4OwotCQkJfQotCQkJaWYgKGMgPT0gJ1wwJykKLQkJCQlicmVhazsKLQkJfQotCQllbHNlCi0JCQludW0gPSAxOworICAgIHMgPSBmbXQ7CisgICAgc2l6ZSA9IDA7CisgICAgbGVuID0gMDsKKyAgICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKSB7CisgICAgICAgIGlmIChpc3NwYWNlKFB5X0NIQVJNQVNLKGMpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIG51bSA9IGMgLSAnMCc7CisgICAgICAgICAgICB3aGlsZSAoJzAnIDw9IChjID0gKnMrKykgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICB4ID0gbnVtKjEwICsgKGMgLSAnMCcpOworICAgICAgICAgICAgICAgIGlmICh4LzEwICE9IG51bSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvdmVyZmxvdyBpbiBpdGVtIGNvdW50Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnVtID0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbnVtID0gMTsKIAotCQllID0gZ2V0ZW50cnkoYywgZik7Ci0JCWlmIChlID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGUgPSBnZXRlbnRyeShjLCBmKTsKKyAgICAgICAgaWYgKGUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJ3MnOiAvKiBmYWxsIHRocm91Z2ggKi8KLQkJCWNhc2UgJ3AnOiBsZW4rKzsgYnJlYWs7Ci0JCQljYXNlICd4JzogYnJlYWs7Ci0JCQlkZWZhdWx0OiBsZW4gKz0gbnVtOyBicmVhazsKLQkJfQorICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ3MnOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgJ3AnOiBsZW4rKzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd4JzogYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBsZW4gKz0gbnVtOyBicmVhazsKKyAgICAgICAgfQogCi0JCWl0ZW1zaXplID0gZS0+c2l6ZTsKLQkJc2l6ZSA9IGFsaWduKHNpemUsIGMsIGUpOwotCQl4ID0gbnVtICogaXRlbXNpemU7Ci0JCXNpemUgKz0geDsKLQkJaWYgKHgvaXRlbXNpemUgIT0gbnVtIHx8IHNpemUgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJCSJ0b3RhbCBzdHJ1Y3Qgc2l6ZSB0b28gbG9uZyIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgICAgICBpdGVtc2l6ZSA9IGUtPnNpemU7CisgICAgICAgIHNpemUgPSBhbGlnbihzaXplLCBjLCBlKTsKKyAgICAgICAgeCA9IG51bSAqIGl0ZW1zaXplOworICAgICAgICBzaXplICs9IHg7CisgICAgICAgIGlmICh4L2l0ZW1zaXplICE9IG51bSB8fCBzaXplIDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBzdHJ1Y3Qgc2l6ZSB0b28gbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCi0JaWYgKChsZW4gKyAxKSA+IChQWV9TU0laRV9UX01BWCAvIHNpemVvZihmb3JtYXRjb2RlKSkpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICBpZiAoKGxlbiArIDEpID4gKFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKGZvcm1hdGNvZGUpKSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0Jc2VsZi0+c19zaXplID0gc2l6ZTsKLQlzZWxmLT5zX2xlbiA9IGxlbjsKLQljb2RlcyA9IFB5TWVtX01BTExPQygobGVuICsgMSkgKiBzaXplb2YoZm9ybWF0Y29kZSkpOwotCWlmIChjb2RlcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2VsZi0+c19jb2RlcyA9IGNvZGVzOworICAgIHNlbGYtPnNfc2l6ZSA9IHNpemU7CisgICAgc2VsZi0+c19sZW4gPSBsZW47CisgICAgY29kZXMgPSBQeU1lbV9NQUxMT0MoKGxlbiArIDEpICogc2l6ZW9mKGZvcm1hdGNvZGUpKTsKKyAgICBpZiAoY29kZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNlbGYtPnNfY29kZXMgPSBjb2RlczsKIAotCXMgPSBmbXQ7Ci0Jc2l6ZSA9IDA7Ci0Jd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykgewotCQlpZiAoaXNzcGFjZShQeV9DSEFSTUFTSyhjKSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB7Ci0JCQludW0gPSBjIC0gJzAnOwotCQkJd2hpbGUgKCcwJyA8PSAoYyA9ICpzKyspICYmIGMgPD0gJzknKQotCQkJCW51bSA9IG51bSoxMCArIChjIC0gJzAnKTsKLQkJCWlmIChjID09ICdcMCcpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJbnVtID0gMTsKKyAgICBzID0gZm10OworICAgIHNpemUgPSAwOworICAgIHdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKKyAgICAgICAgaWYgKGlzc3BhY2UoUHlfQ0hBUk1BU0soYykpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgbnVtID0gYyAtICcwJzsKKyAgICAgICAgICAgIHdoaWxlICgnMCcgPD0gKGMgPSAqcysrKSAmJiBjIDw9ICc5JykKKyAgICAgICAgICAgICAgICBudW0gPSBudW0qMTAgKyAoYyAtICcwJyk7CisgICAgICAgICAgICBpZiAoYyA9PSAnXDAnKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG51bSA9IDE7CiAKLQkJZSA9IGdldGVudHJ5KGMsIGYpOworICAgICAgICBlID0gZ2V0ZW50cnkoYywgZik7CiAKLQkJc2l6ZSA9IGFsaWduKHNpemUsIGMsIGUpOwotCQlpZiAoYyA9PSAncycgfHwgYyA9PSAncCcpIHsKLQkJCWNvZGVzLT5vZmZzZXQgPSBzaXplOwotCQkJY29kZXMtPnNpemUgPSBudW07Ci0JCQljb2Rlcy0+Zm10ZGVmID0gZTsKLQkJCWNvZGVzKys7Ci0JCQlzaXplICs9IG51bTsKLQkJfSBlbHNlIGlmIChjID09ICd4JykgewotCQkJc2l6ZSArPSBudW07Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoLS1udW0gPj0gMCkgewotCQkJCWNvZGVzLT5vZmZzZXQgPSBzaXplOwotCQkJCWNvZGVzLT5zaXplID0gZS0+c2l6ZTsKLQkJCQljb2Rlcy0+Zm10ZGVmID0gZTsKLQkJCQljb2RlcysrOwotCQkJCXNpemUgKz0gZS0+c2l6ZTsKLQkJCX0KLQkJfQotCX0KLQljb2Rlcy0+Zm10ZGVmID0gTlVMTDsKLQljb2Rlcy0+b2Zmc2V0ID0gc2l6ZTsKLQljb2Rlcy0+c2l6ZSA9IDA7CisgICAgICAgIHNpemUgPSBhbGlnbihzaXplLCBjLCBlKTsKKyAgICAgICAgaWYgKGMgPT0gJ3MnIHx8IGMgPT0gJ3AnKSB7CisgICAgICAgICAgICBjb2Rlcy0+b2Zmc2V0ID0gc2l6ZTsKKyAgICAgICAgICAgIGNvZGVzLT5zaXplID0gbnVtOworICAgICAgICAgICAgY29kZXMtPmZtdGRlZiA9IGU7CisgICAgICAgICAgICBjb2RlcysrOworICAgICAgICAgICAgc2l6ZSArPSBudW07CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAneCcpIHsKKyAgICAgICAgICAgIHNpemUgKz0gbnVtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2hpbGUgKC0tbnVtID49IDApIHsKKyAgICAgICAgICAgICAgICBjb2Rlcy0+b2Zmc2V0ID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBjb2Rlcy0+c2l6ZSA9IGUtPnNpemU7CisgICAgICAgICAgICAgICAgY29kZXMtPmZtdGRlZiA9IGU7CisgICAgICAgICAgICAgICAgY29kZXMrKzsKKyAgICAgICAgICAgICAgICBzaXplICs9IGUtPnNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY29kZXMtPmZtdGRlZiA9IE5VTEw7CisgICAgY29kZXMtPm9mZnNldCA9IHNpemU7CisgICAgY29kZXMtPnNpemUgPSAwOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCWFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKIAotCXNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiAhPSBOVUxMKSB7Ci0JCVB5U3RydWN0T2JqZWN0ICpzID0gKFB5U3RydWN0T2JqZWN0KilzZWxmOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXMtPnNfZm9ybWF0ID0gUHlfTm9uZTsKLQkJcy0+c19jb2RlcyA9IE5VTEw7Ci0JCXMtPnNfc2l6ZSA9IC0xOwotCQlzLT5zX2xlbiA9IC0xOwotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICBzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBQeVN0cnVjdE9iamVjdCAqcyA9IChQeVN0cnVjdE9iamVjdCopc2VsZjsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBzLT5zX2Zvcm1hdCA9IFB5X05vbmU7CisgICAgICAgIHMtPnNfY29kZXMgPSBOVUxMOworICAgICAgICBzLT5zX3NpemUgPSAtMTsKKyAgICAgICAgcy0+c19sZW4gPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyBpbnQKIHNfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5U3RydWN0T2JqZWN0ICpzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOwotCVB5T2JqZWN0ICpvX2Zvcm1hdCA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmb3JtYXQiLCAwfTsKKyAgICBQeVN0cnVjdE9iamVjdCAqc29zZWxmID0gKFB5U3RydWN0T2JqZWN0ICopc2VsZjsKKyAgICBQeU9iamVjdCAqb19mb3JtYXQgPSBOVUxMOworICAgIGludCByZXQgPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZm9ybWF0IiwgMH07CiAKLQlhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOworICAgIGFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiUzpTdHJ1Y3QiLCBrd2xpc3QsCi0JCQkJCSAmb19mb3JtYXQpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIlM6U3RydWN0Iiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvX2Zvcm1hdCkpCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X0lOQ1JFRihvX2Zvcm1hdCk7Ci0JUHlfQ0xFQVIoc29zZWxmLT5zX2Zvcm1hdCk7Ci0Jc29zZWxmLT5zX2Zvcm1hdCA9IG9fZm9ybWF0OworICAgIFB5X0lOQ1JFRihvX2Zvcm1hdCk7CisgICAgUHlfQ0xFQVIoc29zZWxmLT5zX2Zvcm1hdCk7CisgICAgc29zZWxmLT5zX2Zvcm1hdCA9IG9fZm9ybWF0OwogCi0JcmV0ID0gcHJlcGFyZV9zKHNvc2VsZik7Ci0JcmV0dXJuIHJldDsKKyAgICByZXQgPSBwcmVwYXJlX3Moc29zZWxmKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZAogc19kZWFsbG9jKFB5U3RydWN0T2JqZWN0ICpzKQogewotCWlmIChzLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKXMpOwotCWlmIChzLT5zX2NvZGVzICE9IE5VTEwpIHsKLQkJUHlNZW1fRlJFRShzLT5zX2NvZGVzKTsKLQl9Ci0JUHlfWERFQ1JFRihzLT5zX2Zvcm1hdCk7Ci0JUHlfVFlQRShzKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzKTsKKyAgICBpZiAocy0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKilzKTsKKyAgICBpZiAocy0+c19jb2RlcyAhPSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0ZSRUUocy0+c19jb2Rlcyk7CisgICAgfQorICAgIFB5X1hERUNSRUYocy0+c19mb3JtYXQpOworICAgIFB5X1RZUEUocyktPnRwX2ZyZWUoKFB5T2JqZWN0ICopcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzX3VucGFja19pbnRlcm5hbChQeVN0cnVjdE9iamVjdCAqc29zZWxmLCBjaGFyICpzdGFydGZyb20pIHsKLQlmb3JtYXRjb2RlICpjb2RlOwotCVB5X3NzaXplX3QgaSA9IDA7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5VHVwbGVfTmV3KHNvc2VsZi0+c19sZW4pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZm9ybWF0Y29kZSAqY29kZTsKKyAgICBQeV9zc2l6ZV90IGkgPSAwOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeVR1cGxlX05ldyhzb3NlbGYtPnNfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChjb2RlID0gc29zZWxmLT5zX2NvZGVzOyBjb2RlLT5mbXRkZWYgIT0gTlVMTDsgY29kZSsrKSB7Ci0JCVB5T2JqZWN0ICp2OwotCQljb25zdCBmb3JtYXRkZWYgKmUgPSBjb2RlLT5mbXRkZWY7Ci0JCWNvbnN0IGNoYXIgKnJlcyA9IHN0YXJ0ZnJvbSArIGNvZGUtPm9mZnNldDsKLQkJaWYgKGUtPmZvcm1hdCA9PSAncycpIHsKLQkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXMsIGNvZGUtPnNpemUpOwotCQl9IGVsc2UgaWYgKGUtPmZvcm1hdCA9PSAncCcpIHsKLQkJCVB5X3NzaXplX3QgbiA9ICoodW5zaWduZWQgY2hhciopcmVzOwotCQkJaWYgKG4gPj0gY29kZS0+c2l6ZSkKLQkJCQluID0gY29kZS0+c2l6ZSAtIDE7Ci0JCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzICsgMSwgbik7Ci0JCX0gZWxzZSB7Ci0JCQl2ID0gZS0+dW5wYWNrKHJlcywgZSk7Ci0JCX0KLQkJaWYgKHYgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbDsKLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGkrKywgdik7Ci0JfQorICAgIGZvciAoY29kZSA9IHNvc2VsZi0+c19jb2RlczsgY29kZS0+Zm10ZGVmICE9IE5VTEw7IGNvZGUrKykgeworICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgY29uc3QgZm9ybWF0ZGVmICplID0gY29kZS0+Zm10ZGVmOworICAgICAgICBjb25zdCBjaGFyICpyZXMgPSBzdGFydGZyb20gKyBjb2RlLT5vZmZzZXQ7CisgICAgICAgIGlmIChlLT5mb3JtYXQgPT0gJ3MnKSB7CisgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzLCBjb2RlLT5zaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChlLT5mb3JtYXQgPT0gJ3AnKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG4gPSAqKHVuc2lnbmVkIGNoYXIqKXJlczsKKyAgICAgICAgICAgIGlmIChuID49IGNvZGUtPnNpemUpCisgICAgICAgICAgICAgICAgbiA9IGNvZGUtPnNpemUgLSAxOworICAgICAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlcyArIDEsIG4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdiA9IGUtPnVucGFjayhyZXMsIGUpOworICAgICAgICB9CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpKyssIHYpOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIGZhaWw6Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtMTQyMywzNSArMTQyMywzNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNfdW5wYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaW5wdXRzdHIpCiB7Ci0JY2hhciAqc3RhcnQ7Ci0JUHlfc3NpemVfdCBsZW47Ci0JUHlPYmplY3QgKmFyZ3M9TlVMTCwgKnJlc3VsdDsKLQlQeVN0cnVjdE9iamVjdCAqc29zZWxmID0gKFB5U3RydWN0T2JqZWN0ICopc2VsZjsKLQlhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOwotCWFzc2VydChzb3NlbGYtPnNfY29kZXMgIT0gTlVMTCk7Ci0JaWYgKGlucHV0c3RyID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQlpZiAoUHlTdHJpbmdfQ2hlY2soaW5wdXRzdHIpICYmCi0JCVB5U3RyaW5nX0dFVF9TSVpFKGlucHV0c3RyKSA9PSBzb3NlbGYtPnNfc2l6ZSkgewotCQkJcmV0dXJuIHNfdW5wYWNrX2ludGVybmFsKHNvc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKGlucHV0c3RyKSk7Ci0JfQotCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgaW5wdXRzdHIpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6dW5wYWNrIiwgJnN0YXJ0LCAmbGVuKSkKLQkJZ290byBmYWlsOwotCWlmIChzb3NlbGYtPnNfc2l6ZSAhPSBsZW4pCi0JCWdvdG8gZmFpbDsKLQlyZXN1bHQgPSBzX3VucGFja19pbnRlcm5hbChzb3NlbGYsIHN0YXJ0KTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBjaGFyICpzdGFydDsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBQeU9iamVjdCAqYXJncz1OVUxMLCAqcmVzdWx0OworICAgIFB5U3RydWN0T2JqZWN0ICpzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOworICAgIGFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7CisgICAgYXNzZXJ0KHNvc2VsZi0+c19jb2RlcyAhPSBOVUxMKTsKKyAgICBpZiAoaW5wdXRzdHIgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmIChQeVN0cmluZ19DaGVjayhpbnB1dHN0cikgJiYKKyAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRzdHIpID09IHNvc2VsZi0+c19zaXplKSB7CisgICAgICAgICAgICByZXR1cm4gc191bnBhY2tfaW50ZXJuYWwoc29zZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoaW5wdXRzdHIpKTsKKyAgICB9CisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBpbnB1dHN0cik7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp1bnBhY2siLCAmc3RhcnQsICZsZW4pKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKHNvc2VsZi0+c19zaXplICE9IGxlbikKKyAgICAgICAgZ290byBmYWlsOworICAgIHJlc3VsdCA9IHNfdW5wYWNrX2ludGVybmFsKHNvc2VsZiwgc3RhcnQpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBmYWlsOgotCVB5X1hERUNSRUYoYXJncyk7Ci0JUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAotCQkidW5wYWNrIHJlcXVpcmVzIGEgc3RyaW5nIGFyZ3VtZW50IG9mIGxlbmd0aCAlemQiLAotCQlzb3NlbGYtPnNfc2l6ZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICJ1bnBhY2sgcmVxdWlyZXMgYSBzdHJpbmcgYXJndW1lbnQgb2YgbGVuZ3RoICV6ZCIsCisgICAgICAgIHNvc2VsZi0+c19zaXplKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHNfdW5wYWNrX2Zyb21fX2RvY19fLApAQCAtMTQ2NSwzOCArMTQ2NSwzOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNfdW5wYWNrX2Zyb20oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJ1ZmZlciIsICJvZmZzZXQiLCAwfTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJ1ZmZlciIsICJvZmZzZXQiLCAwfTsKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCXN0YXRpYyBjaGFyICpmbXQgPSAieiN8aTp1bnBhY2tfZnJvbSI7CisgICAgc3RhdGljIGNoYXIgKmZtdCA9ICJ6I3xpOnVucGFja19mcm9tIjsKICNlbHNlCi0Jc3RhdGljIGNoYXIgKmZtdCA9ICJ6I3xuOnVucGFja19mcm9tIjsKKyAgICBzdGF0aWMgY2hhciAqZm10ID0gInojfG46dW5wYWNrX2Zyb20iOwogI2VuZGlmCi0JUHlfc3NpemVfdCBidWZmZXJfbGVuID0gMCwgb2Zmc2V0ID0gMDsKLQljaGFyICpidWZmZXIgPSBOVUxMOwotCVB5U3RydWN0T2JqZWN0ICpzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOwotCWFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7Ci0JYXNzZXJ0KHNvc2VsZi0+c19jb2RlcyAhPSBOVUxMKTsKKyAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9sZW4gPSAwLCBvZmZzZXQgPSAwOworICAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7CisgICAgYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKKyAgICBhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgZm10LCBrd2xpc3QsCi0JCQkJCSAmYnVmZmVyLCAmYnVmZmVyX2xlbiwgJm9mZnNldCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIGZtdCwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsICZidWZmZXJfbGVuLCAmb2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAotCQkJInVucGFja19mcm9tIHJlcXVpcmVzIGEgYnVmZmVyIGFyZ3VtZW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorICAgICAgICAgICAgInVucGFja19mcm9tIHJlcXVpcmVzIGEgYnVmZmVyIGFyZ3VtZW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChvZmZzZXQgPCAwKQotCQlvZmZzZXQgKz0gYnVmZmVyX2xlbjsKKyAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgb2Zmc2V0ICs9IGJ1ZmZlcl9sZW47CiAKLQlpZiAob2Zmc2V0IDwgMCB8fCAoYnVmZmVyX2xlbiAtIG9mZnNldCkgPCBzb3NlbGYtPnNfc2l6ZSkgewotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkidW5wYWNrX2Zyb20gcmVxdWlyZXMgYSBidWZmZXIgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzIiwKLQkJCXNvc2VsZi0+c19zaXplKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzX3VucGFja19pbnRlcm5hbChzb3NlbGYsIGJ1ZmZlciArIG9mZnNldCk7CisgICAgaWYgKG9mZnNldCA8IDAgfHwgKGJ1ZmZlcl9sZW4gLSBvZmZzZXQpIDwgc29zZWxmLT5zX3NpemUpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorICAgICAgICAgICAgInVucGFja19mcm9tIHJlcXVpcmVzIGEgYnVmZmVyIG9mIGF0IGxlYXN0ICV6ZCBieXRlcyIsCisgICAgICAgICAgICBzb3NlbGYtPnNfc2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc191bnBhY2tfaW50ZXJuYWwoc29zZWxmLCBidWZmZXIgKyBvZmZzZXQpOwogfQogCiAKQEAgLTE1MTMsNTggKzE1MTMsNTggQEAKIHN0YXRpYyBpbnQKIHNfcGFja19pbnRlcm5hbChQeVN0cnVjdE9iamVjdCAqc29zZWxmLCBQeU9iamVjdCAqYXJncywgaW50IG9mZnNldCwgY2hhciogYnVmKQogewotCWZvcm1hdGNvZGUgKmNvZGU7Ci0JLyogWFhYKG5ub3J3aXR6KTogd2h5IGRvZXMgaSBuZWVkIHRvIGJlIGEgbG9jYWw/ICBjYW4gd2UgdXNlCi0JICAgdGhlIG9mZnNldCBwYXJhbWV0ZXIgb3IgZG8gd2UgbmVlZCB0aGUgd2lkZXIgd2lkdGg/ICovCi0JUHlfc3NpemVfdCBpOworICAgIGZvcm1hdGNvZGUgKmNvZGU7CisgICAgLyogWFhYKG5ub3J3aXR6KTogd2h5IGRvZXMgaSBuZWVkIHRvIGJlIGEgbG9jYWw/ICBjYW4gd2UgdXNlCisgICAgICAgdGhlIG9mZnNldCBwYXJhbWV0ZXIgb3IgZG8gd2UgbmVlZCB0aGUgd2lkZXIgd2lkdGg/ICovCisgICAgUHlfc3NpemVfdCBpOwogCi0JbWVtc2V0KGJ1ZiwgJ1wwJywgc29zZWxmLT5zX3NpemUpOwotCWkgPSBvZmZzZXQ7Ci0JZm9yIChjb2RlID0gc29zZWxmLT5zX2NvZGVzOyBjb2RlLT5mbXRkZWYgIT0gTlVMTDsgY29kZSsrKSB7Ci0JCVB5X3NzaXplX3QgbjsKLQkJUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkrKyk7Ci0JCWNvbnN0IGZvcm1hdGRlZiAqZSA9IGNvZGUtPmZtdGRlZjsKLQkJY2hhciAqcmVzID0gYnVmICsgY29kZS0+b2Zmc2V0OwotCQlpZiAoZS0+Zm9ybWF0ID09ICdzJykgewotCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkJCSJhcmd1bWVudCBmb3IgJ3MnIG11c3QgIgotCQkJCQkJImJlIGEgc3RyaW5nIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCQkJaWYgKG4gPiBjb2RlLT5zaXplKQotCQkJCW4gPSBjb2RlLT5zaXplOwotCQkJaWYgKG4gPiAwKQotCQkJCW1lbWNweShyZXMsIFB5U3RyaW5nX0FTX1NUUklORyh2KSwgbik7Ci0JCX0gZWxzZSBpZiAoZS0+Zm9ybWF0ID09ICdwJykgewotCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkJCSJhcmd1bWVudCBmb3IgJ3AnIG11c3QgIgotCQkJCQkJImJlIGEgc3RyaW5nIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCQkJaWYgKG4gPiAoY29kZS0+c2l6ZSAtIDEpKQotCQkJCW4gPSBjb2RlLT5zaXplIC0gMTsKLQkJCWlmIChuID4gMCkKLQkJCQltZW1jcHkocmVzICsgMSwgUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBuKTsKLQkJCWlmIChuID4gMjU1KQotCQkJCW4gPSAyNTU7Ci0JCQkqcmVzID0gUHlfU0FGRV9ET1dOQ0FTVChuLCBQeV9zc2l6ZV90LCB1bnNpZ25lZCBjaGFyKTsKLQkJfSBlbHNlIGlmIChlLT5wYWNrKHJlcywgdiwgZSkgPCAwKSB7Ci0JCQlpZiAoc3RyY2hyKGludGVnZXJfY29kZXMsIGUtPmZvcm1hdCkgIT0gTlVMTCAmJgotCQkJICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCi0JCQkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAotCQkJCQkgICAgICJpbnRlZ2VyIG91dCBvZiByYW5nZSBmb3IgIgotCQkJCQkgICAgICInJWMnIGZvcm1hdCBjb2RlIiwKLQkJCQkJICAgICBlLT5mb3JtYXQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgIG1lbXNldChidWYsICdcMCcsIHNvc2VsZi0+c19zaXplKTsKKyAgICBpID0gb2Zmc2V0OworICAgIGZvciAoY29kZSA9IHNvc2VsZi0+c19jb2RlczsgY29kZS0+Zm10ZGVmICE9IE5VTEw7IGNvZGUrKykgeworICAgICAgICBQeV9zc2l6ZV90IG47CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKyspOworICAgICAgICBjb25zdCBmb3JtYXRkZWYgKmUgPSBjb2RlLT5mbXRkZWY7CisgICAgICAgIGNoYXIgKnJlcyA9IGJ1ZiArIGNvZGUtPm9mZnNldDsKKyAgICAgICAgaWYgKGUtPmZvcm1hdCA9PSAncycpIHsKKyAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBmb3IgJ3MnIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgYSBzdHJpbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisgICAgICAgICAgICBpZiAobiA+IGNvZGUtPnNpemUpCisgICAgICAgICAgICAgICAgbiA9IGNvZGUtPnNpemU7CisgICAgICAgICAgICBpZiAobiA+IDApCisgICAgICAgICAgICAgICAgbWVtY3B5KHJlcywgUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBuKTsKKyAgICAgICAgfSBlbHNlIGlmIChlLT5mb3JtYXQgPT0gJ3AnKSB7CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgZm9yICdwJyBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIGEgc3RyaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOworICAgICAgICAgICAgaWYgKG4gPiAoY29kZS0+c2l6ZSAtIDEpKQorICAgICAgICAgICAgICAgIG4gPSBjb2RlLT5zaXplIC0gMTsKKyAgICAgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICAgICAgICBtZW1jcHkocmVzICsgMSwgUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBuKTsKKyAgICAgICAgICAgIGlmIChuID4gMjU1KQorICAgICAgICAgICAgICAgIG4gPSAyNTU7CisgICAgICAgICAgICAqcmVzID0gUHlfU0FGRV9ET1dOQ0FTVChuLCBQeV9zc2l6ZV90LCB1bnNpZ25lZCBjaGFyKTsKKyAgICAgICAgfSBlbHNlIGlmIChlLT5wYWNrKHJlcywgdiwgZSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoc3RyY2hyKGludGVnZXJfY29kZXMsIGUtPmZvcm1hdCkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciBvdXQgb2YgcmFuZ2UgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclYycgZm9ybWF0IGNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT5mb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JLyogU3VjY2VzcyAqLwotCXJldHVybiAwOworICAgIC8qIFN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0xNTc3LDMyICsxNTc3LDMyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc19wYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeVN0cnVjdE9iamVjdCAqc29zZWxmOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JLyogVmFsaWRhdGUgYXJndW1lbnRzLiAqLwotCXNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7Ci0JYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKLQlhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOwotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICE9IHNvc2VsZi0+c19sZW4pCi0JewotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkicGFjayByZXF1aXJlcyBleGFjdGx5ICV6ZCBhcmd1bWVudHMiLCBzb3NlbGYtPnNfbGVuKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFZhbGlkYXRlIGFyZ3VtZW50cy4gKi8KKyAgICBzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOworICAgIGFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7CisgICAgYXNzZXJ0KHNvc2VsZi0+c19jb2RlcyAhPSBOVUxMKTsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSAhPSBzb3NlbGYtPnNfbGVuKQorICAgIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorICAgICAgICAgICAgInBhY2sgcmVxdWlyZXMgZXhhY3RseSAlemQgYXJndW1lbnRzIiwgc29zZWxmLT5zX2xlbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEFsbG9jYXRlIGEgbmV3IHN0cmluZyAqLwotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgc29zZWxmLT5zX3NpemUpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nICovCisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBzb3NlbGYtPnNfc2l6ZSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIENhbGwgdGhlIGd1dHMgKi8KLQlpZiAoIHNfcGFja19pbnRlcm5hbChzb3NlbGYsIGFyZ3MsIDAsIFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpKSAhPSAwICkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIENhbGwgdGhlIGd1dHMgKi8KKyAgICBpZiAoIHNfcGFja19pbnRlcm5hbChzb3NlbGYsIGFyZ3MsIDAsIFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpKSAhPSAwICkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoc19wYWNrX2ludG9fX2RvY19fLApAQCAtMTYxNiw1OSArMTYxNiw1OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNfcGFja19pbnRvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeVN0cnVjdE9iamVjdCAqc29zZWxmOwotCWNoYXIgKmJ1ZmZlcjsKLQlQeV9zc2l6ZV90IGJ1ZmZlcl9sZW4sIG9mZnNldDsKKyAgICBQeVN0cnVjdE9iamVjdCAqc29zZWxmOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9sZW4sIG9mZnNldDsKIAotCS8qIFZhbGlkYXRlIGFyZ3VtZW50cy4gICsxIGlzIGZvciB0aGUgZmlyc3QgYXJnIGFzIGJ1ZmZlci4gKi8KLQlzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOwotCWFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7Ci0JYXNzZXJ0KHNvc2VsZi0+c19jb2RlcyAhPSBOVUxMKTsKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSAhPSAoc29zZWxmLT5zX2xlbiArIDIpKQotCXsKLQkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAotCQkJICAgICAicGFja19pbnRvIHJlcXVpcmVzIGV4YWN0bHkgJXpkIGFyZ3VtZW50cyIsCi0JCQkgICAgIChzb3NlbGYtPnNfbGVuICsgMikpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogVmFsaWRhdGUgYXJndW1lbnRzLiAgKzEgaXMgZm9yIHRoZSBmaXJzdCBhcmcgYXMgYnVmZmVyLiAqLworICAgIHNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7CisgICAgYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKKyAgICBhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICE9IChzb3NlbGYtPnNfbGVuICsgMikpCisgICAgeworICAgICAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAicGFja19pbnRvIHJlcXVpcmVzIGV4YWN0bHkgJXpkIGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAoc29zZWxmLT5zX2xlbiArIDIpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogRXh0cmFjdCBhIHdyaXRhYmxlIG1lbW9yeSBidWZmZXIgZnJvbSB0aGUgZmlyc3QgYXJndW1lbnQgKi8KLQlpZiAoIFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIoUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSwKLQkJCQkJCQkJKHZvaWQqKikmYnVmZmVyLCAmYnVmZmVyX2xlbikgPT0gLTEgKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhc3NlcnQoIGJ1ZmZlcl9sZW4gPj0gMCApOworICAgIC8qIEV4dHJhY3QgYSB3cml0YWJsZSBtZW1vcnkgYnVmZmVyIGZyb20gdGhlIGZpcnN0IGFyZ3VtZW50ICovCisgICAgaWYgKCBQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCoqKSZidWZmZXIsICZidWZmZXJfbGVuKSA9PSAtMSApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzc2VydCggYnVmZmVyX2xlbiA+PSAwICk7CiAKLQkvKiBFeHRyYWN0IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgYXJndW1lbnQgKi8KLQlvZmZzZXQgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAxKSk7Ci0JaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBFeHRyYWN0IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgYXJndW1lbnQgKi8KKyAgICBvZmZzZXQgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAxKSk7CisgICAgaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFN1cHBvcnQgbmVnYXRpdmUgb2Zmc2V0cy4gKi8KLQlpZiAob2Zmc2V0IDwgMCkKLQkJb2Zmc2V0ICs9IGJ1ZmZlcl9sZW47CisgICAgLyogU3VwcG9ydCBuZWdhdGl2ZSBvZmZzZXRzLiAqLworICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICBvZmZzZXQgKz0gYnVmZmVyX2xlbjsKIAotCS8qIENoZWNrIGJvdW5kYXJpZXMgKi8KLQlpZiAob2Zmc2V0IDwgMCB8fCAoYnVmZmVyX2xlbiAtIG9mZnNldCkgPCBzb3NlbGYtPnNfc2l6ZSkgewotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkgICAgICJwYWNrX2ludG8gcmVxdWlyZXMgYSBidWZmZXIgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzIiwKLQkJCSAgICAgc29zZWxmLT5zX3NpemUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2hlY2sgYm91bmRhcmllcyAqLworICAgIGlmIChvZmZzZXQgPCAwIHx8IChidWZmZXJfbGVuIC0gb2Zmc2V0KSA8IHNvc2VsZi0+c19zaXplKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJwYWNrX2ludG8gcmVxdWlyZXMgYSBidWZmZXIgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgIHNvc2VsZi0+c19zaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ2FsbCB0aGUgZ3V0cyAqLwotCWlmICggc19wYWNrX2ludGVybmFsKHNvc2VsZiwgYXJncywgMiwgYnVmZmVyICsgb2Zmc2V0KSAhPSAwICkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2FsbCB0aGUgZ3V0cyAqLworICAgIGlmICggc19wYWNrX2ludGVybmFsKHNvc2VsZiwgYXJncywgMiwgYnVmZmVyICsgb2Zmc2V0KSAhPSAwICkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNfZ2V0X2Zvcm1hdChQeVN0cnVjdE9iamVjdCAqc2VsZiwgdm9pZCAqdW51c2VkKQogewotCVB5X0lOQ1JFRihzZWxmLT5zX2Zvcm1hdCk7Ci0JcmV0dXJuIHNlbGYtPnNfZm9ybWF0OworICAgIFB5X0lOQ1JFRihzZWxmLT5zX2Zvcm1hdCk7CisgICAgcmV0dXJuIHNlbGYtPnNfZm9ybWF0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTY4MCwxMiArMTY4MCwxMiBAQAogLyogTGlzdCBvZiBmdW5jdGlvbnMgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBzX21ldGhvZHNbXSA9IHsKLQl7InBhY2siLAlzX3BhY2ssCQlNRVRIX1ZBUkFSR1MsIHNfcGFja19fZG9jX199LAotCXsicGFja19pbnRvIiwJc19wYWNrX2ludG8sCU1FVEhfVkFSQVJHUywgc19wYWNrX2ludG9fX2RvY19ffSwKLQl7InVucGFjayIsCXNfdW5wYWNrLCAgICAgICBNRVRIX08sIHNfdW5wYWNrX19kb2NfX30sCi0JeyJ1bnBhY2tfZnJvbSIsCShQeUNGdW5jdGlvbilzX3VucGFja19mcm9tLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKLQkJCXNfdW5wYWNrX2Zyb21fX2RvY19ffSwKLQl7TlVMTCwJIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsicGFjayIsICAgICAgICAgICAgc19wYWNrLCAgICAgICAgIE1FVEhfVkFSQVJHUywgc19wYWNrX19kb2NfX30sCisgICAgeyJwYWNrX2ludG8iLCAgICAgICBzX3BhY2tfaW50bywgICAgTUVUSF9WQVJBUkdTLCBzX3BhY2tfaW50b19fZG9jX199LAorICAgIHsidW5wYWNrIiwgICAgICAgICAgc191bnBhY2ssICAgICAgIE1FVEhfTywgc191bnBhY2tfX2RvY19ffSwKKyAgICB7InVucGFja19mcm9tIiwgICAgIChQeUNGdW5jdGlvbilzX3VucGFja19mcm9tLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKKyAgICAgICAgICAgICAgICAgICAgc191bnBhY2tfZnJvbV9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICBOVUxMfSAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKHNfX2RvY19fLCAiQ29tcGlsZWQgc3RydWN0IG9iamVjdCIpOwpAQCAtMTY5Myw1MiArMTY5Myw1MiBAQAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoUHlTdHJ1Y3RPYmplY3QsIHgpCiAKIHN0YXRpYyBQeUdldFNldERlZiBzX2dldHNldGxpc3RbXSA9IHsKLQl7ImZvcm1hdCIsIChnZXR0ZXIpc19nZXRfZm9ybWF0LCAoc2V0dGVyKU5VTEwsICJzdHJ1Y3QgZm9ybWF0IHN0cmluZyIsIE5VTEx9LAotCXsic2l6ZSIsIChnZXR0ZXIpc19nZXRfc2l6ZSwgKHNldHRlcilOVUxMLCAic3RydWN0IHNpemUgaW4gYnl0ZXMiLCBOVUxMfSwKLQl7TlVMTH0gLyogc2VudGluZWwgKi8KKyAgICB7ImZvcm1hdCIsIChnZXR0ZXIpc19nZXRfZm9ybWF0LCAoc2V0dGVyKU5VTEwsICJzdHJ1Y3QgZm9ybWF0IHN0cmluZyIsIE5VTEx9LAorICAgIHsic2l6ZSIsIChnZXR0ZXIpc19nZXRfc2l6ZSwgKHNldHRlcilOVUxMLCAic3RydWN0IHNpemUgaW4gYnl0ZXMiLCBOVUxMfSwKKyAgICB7TlVMTH0gLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYwogUHlUeXBlT2JqZWN0IFB5U3RydWN0VHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiU3RydWN0IiwKLQlzaXplb2YoUHlTdHJ1Y3RPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3Ipc19kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLAkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLC8qIHRwX2ZsYWdzICovCi0Jc19fZG9jX18sCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0Jb2Zmc2V0b2YoUHlTdHJ1Y3RPYmplY3QsIHdlYWtyZWZsaXN0KSwJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXNfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JTlVMTCwJCQkJLyogdHBfbWVtYmVycyAqLwotCXNfZ2V0c2V0bGlzdCwJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0Jc19pbml0LAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywvKiB0cF9hbGxvYyAqLwotCXNfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIlN0cnVjdCIsCisgICAgc2l6ZW9mKFB5U3RydWN0T2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKXNfZGVhbGxvYywgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywvKiB0cF9mbGFncyAqLworICAgIHNfX2RvY19fLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKFB5U3RydWN0T2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBzX2dldHNldGxpc3QsICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIHNfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLC8qIHRwX2FsbG9jICovCisgICAgc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMTc1MCwyOSArMTc1MCwyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhY2hlX3N0cnVjdChQeU9iamVjdCAqZm10KQogewotCVB5T2JqZWN0ICogc19vYmplY3Q7CisgICAgUHlPYmplY3QgKiBzX29iamVjdDsKIAotCWlmIChjYWNoZSA9PSBOVUxMKSB7Ci0JCWNhY2hlID0gUHlEaWN0X05ldygpOwotCQlpZiAoY2FjaGUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoY2FjaGUgPT0gTlVMTCkgeworICAgICAgICBjYWNoZSA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGNhY2hlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzX29iamVjdCA9IFB5RGljdF9HZXRJdGVtKGNhY2hlLCBmbXQpOwotCWlmIChzX29iamVjdCAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihzX29iamVjdCk7Ci0JCXJldHVybiBzX29iamVjdDsKLQl9CisgICAgc19vYmplY3QgPSBQeURpY3RfR2V0SXRlbShjYWNoZSwgZm10KTsKKyAgICBpZiAoc19vYmplY3QgIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoc19vYmplY3QpOworICAgICAgICByZXR1cm4gc19vYmplY3Q7CisgICAgfQogCi0Jc19vYmplY3QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCAqKSgmUHlTdHJ1Y3RUeXBlKSwgZm10LCBOVUxMKTsKLQlpZiAoc19vYmplY3QgIT0gTlVMTCkgewotCQlpZiAoUHlEaWN0X1NpemUoY2FjaGUpID49IE1BWENBQ0hFKQotCQkJUHlEaWN0X0NsZWFyKGNhY2hlKTsKLQkJLyogQXR0ZW1wdCB0byBjYWNoZSB0aGUgcmVzdWx0ICovCi0JCWlmIChQeURpY3RfU2V0SXRlbShjYWNoZSwgZm10LCBzX29iamVjdCkgPT0gLTEpCi0JCQlQeUVycl9DbGVhcigpOwotCX0KLQlyZXR1cm4gc19vYmplY3Q7CisgICAgc19vYmplY3QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCAqKSgmUHlTdHJ1Y3RUeXBlKSwgZm10LCBOVUxMKTsKKyAgICBpZiAoc19vYmplY3QgIT0gTlVMTCkgeworICAgICAgICBpZiAoUHlEaWN0X1NpemUoY2FjaGUpID49IE1BWENBQ0hFKQorICAgICAgICAgICAgUHlEaWN0X0NsZWFyKGNhY2hlKTsKKyAgICAgICAgLyogQXR0ZW1wdCB0byBjYWNoZSB0aGUgcmVzdWx0ICovCisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShjYWNoZSwgZm10LCBzX29iamVjdCkgPT0gLTEpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gc19vYmplY3Q7CiB9CiAKIFB5RG9jX1NUUlZBUihjbGVhcmNhY2hlX2RvYywKQEAgLTE3ODEsOCArMTc4MSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2xlYXJjYWNoZShQeU9iamVjdCAqc2VsZikKIHsKLQlQeV9DTEVBUihjYWNoZSk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfQ0xFQVIoY2FjaGUpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoY2FsY3NpemVfZG9jLApAQCAtMTc5MSwxMyArMTc5MSwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGNzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqZm10KQogewotCVB5X3NzaXplX3QgbjsKLQlQeU9iamVjdCAqc19vYmplY3QgPSBjYWNoZV9zdHJ1Y3QoZm10KTsKLQlpZiAoc19vYmplY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbiA9ICgoUHlTdHJ1Y3RPYmplY3QgKilzX29iamVjdCktPnNfc2l6ZTsKLQlQeV9ERUNSRUYoc19vYmplY3QpOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChuKTsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlPYmplY3QgKnNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7CisgICAgaWYgKHNfb2JqZWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG4gPSAoKFB5U3RydWN0T2JqZWN0ICopc19vYmplY3QpLT5zX3NpemU7CisgICAgUHlfREVDUkVGKHNfb2JqZWN0KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3Qobik7CiB9CiAKIFB5RG9jX1NUUlZBUihwYWNrX2RvYywKQEAgLTE4MDYsMjcgKzE4MDYsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc19vYmplY3QsICpmbXQsICpuZXdhcmdzLCAqcmVzdWx0OwotCVB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgUHlPYmplY3QgKnNfb2JqZWN0LCAqZm10LCAqbmV3YXJncywgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwogCi0JaWYgKG4gPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWlzc2luZyBmb3JtYXQgYXJndW1lbnQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZtdCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgbik7Ci0JaWYgKG5ld2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWlzc2luZyBmb3JtYXQgYXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZtdCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgbik7CisgICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzX29iamVjdCA9IGNhY2hlX3N0cnVjdChmbXQpOwotCWlmIChzX29iamVjdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihuZXdhcmdzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IHNfcGFjayhzX29iamVjdCwgbmV3YXJncyk7Ci0JUHlfREVDUkVGKG5ld2FyZ3MpOwotCVB5X0RFQ1JFRihzX29iamVjdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBzX29iamVjdCA9IGNhY2hlX3N0cnVjdChmbXQpOworICAgIGlmIChzX29iamVjdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdCA9IHNfcGFjayhzX29iamVjdCwgbmV3YXJncyk7CisgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgIFB5X0RFQ1JFRihzX29iamVjdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHBhY2tfaW50b19kb2MsCkBAIC0xODM2LDI3ICsxODM2LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcGFja19pbnRvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc19vYmplY3QsICpmbXQsICpuZXdhcmdzLCAqcmVzdWx0OwotCVB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgUHlPYmplY3QgKnNfb2JqZWN0LCAqZm10LCAqbmV3YXJncywgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwogCi0JaWYgKG4gPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWlzc2luZyBmb3JtYXQgYXJndW1lbnQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZtdCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgbik7Ci0JaWYgKG5ld2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWlzc2luZyBmb3JtYXQgYXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZtdCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgbik7CisgICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzX29iamVjdCA9IGNhY2hlX3N0cnVjdChmbXQpOwotCWlmIChzX29iamVjdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihuZXdhcmdzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IHNfcGFja19pbnRvKHNfb2JqZWN0LCBuZXdhcmdzKTsKLQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JUHlfREVDUkVGKHNfb2JqZWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7CisgICAgaWYgKHNfb2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gc19wYWNrX2ludG8oc19vYmplY3QsIG5ld2FyZ3MpOworICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICBQeV9ERUNSRUYoc19vYmplY3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUih1bnBhY2tfZG9jLApAQCAtMTg2NiwxNyArMTg2NiwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHVucGFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNfb2JqZWN0LCAqZm10LCAqaW5wdXRzdHIsICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnNfb2JqZWN0LCAqZm10LCAqaW5wdXRzdHIsICpyZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ1bnBhY2siLCAyLCAyLCAmZm10LCAmaW5wdXRzdHIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ1bnBhY2siLCAyLCAyLCAmZm10LCAmaW5wdXRzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7Ci0JaWYgKHNfb2JqZWN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IHNfdW5wYWNrKHNfb2JqZWN0LCBpbnB1dHN0cik7Ci0JUHlfREVDUkVGKHNfb2JqZWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7CisgICAgaWYgKHNfb2JqZWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IHNfdW5wYWNrKHNfb2JqZWN0LCBpbnB1dHN0cik7CisgICAgUHlfREVDUkVGKHNfb2JqZWN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIodW5wYWNrX2Zyb21fZG9jLApAQCAtMTg4NiwzOCArMTg4NiwzOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHVucGFja19mcm9tKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnNfb2JqZWN0LCAqZm10LCAqbmV3YXJncywgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIFB5T2JqZWN0ICpzX29iamVjdCwgKmZtdCwgKm5ld2FyZ3MsICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKIAotCWlmIChuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1pc3NpbmcgZm9ybWF0IGFyZ3VtZW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmbXQgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCW5ld2FyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIG4pOwotCWlmIChuZXdhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1pc3NpbmcgZm9ybWF0IGFyZ3VtZW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmbXQgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIG5ld2FyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIG4pOworICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc19vYmplY3QgPSBjYWNoZV9zdHJ1Y3QoZm10KTsKLQlpZiAoc19vYmplY3QgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHQgPSBzX3VucGFja19mcm9tKHNfb2JqZWN0LCBuZXdhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JUHlfREVDUkVGKHNfb2JqZWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7CisgICAgaWYgKHNfb2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gc191bnBhY2tfZnJvbShzX29iamVjdCwgbmV3YXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgIFB5X0RFQ1JFRihzX29iamVjdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtb2R1bGVfZnVuY3Rpb25zW10gPSB7Ci0JeyJfY2xlYXJjYWNoZSIsCShQeUNGdW5jdGlvbiljbGVhcmNhY2hlLAlNRVRIX05PQVJHUywJY2xlYXJjYWNoZV9kb2N9LAotCXsiY2FsY3NpemUiLAljYWxjc2l6ZSwJTUVUSF9PLAljYWxjc2l6ZV9kb2N9LAotCXsicGFjayIsCXBhY2ssCQlNRVRIX1ZBUkFSR1MsCXBhY2tfZG9jfSwKLQl7InBhY2tfaW50byIsCXBhY2tfaW50bywJTUVUSF9WQVJBUkdTLAlwYWNrX2ludG9fZG9jfSwKLQl7InVucGFjayIsCXVucGFjaywJTUVUSF9WQVJBUkdTLAl1bnBhY2tfZG9jfSwKLQl7InVucGFja19mcm9tIiwJKFB5Q0Z1bmN0aW9uKXVucGFja19mcm9tLAotCQkJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCXVucGFja19mcm9tX2RvY30sCi0Je05VTEwsCSBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9jbGVhcmNhY2hlIiwgICAgIChQeUNGdW5jdGlvbiljbGVhcmNhY2hlLCAgICAgICAgTUVUSF9OT0FSR1MsICAgIGNsZWFyY2FjaGVfZG9jfSwKKyAgICB7ImNhbGNzaXplIiwgICAgICAgIGNhbGNzaXplLCAgICAgICBNRVRIX08sIGNhbGNzaXplX2RvY30sCisgICAgeyJwYWNrIiwgICAgICAgICAgICBwYWNrLCAgICAgICAgICAgTUVUSF9WQVJBUkdTLCAgIHBhY2tfZG9jfSwKKyAgICB7InBhY2tfaW50byIsICAgICAgIHBhY2tfaW50bywgICAgICBNRVRIX1ZBUkFSR1MsICAgcGFja19pbnRvX2RvY30sCisgICAgeyJ1bnBhY2siLCAgICAgICAgICB1bnBhY2ssIE1FVEhfVkFSQVJHUywgICB1bnBhY2tfZG9jfSwKKyAgICB7InVucGFja19mcm9tIiwgICAgIChQeUNGdW5jdGlvbil1bnBhY2tfZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsICAgICAgICAgdW5wYWNrX2Zyb21fZG9jfSwKKyAgICB7TlVMTCwgICAgICAgTlVMTH0gICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtMTk1NSw3OCArMTk1NSw3OCBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRfc3RydWN0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKnZlciwgKm07CisgICAgUHlPYmplY3QgKnZlciwgKm07CiAKLQl2ZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIwLjIiKTsKLQlpZiAodmVyID09IE5VTEwpCi0JCXJldHVybjsKKyAgICB2ZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIwLjIiKTsKKyAgICBpZiAodmVyID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCW0gPSBQeV9Jbml0TW9kdWxlMygiX3N0cnVjdCIsIG1vZHVsZV9mdW5jdGlvbnMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl9zdHJ1Y3QiLCBtb2R1bGVfZnVuY3Rpb25zLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlQeV9UWVBFKCZQeVN0cnVjdFR5cGUpID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlB5U3RydWN0VHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgUHlfVFlQRSgmUHlTdHJ1Y3RUeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVN0cnVjdFR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogVGhpcyBzcGVlZCB0cmljayBjYW4ndCBiZSB1c2VkIHVudGlsIG92ZXJmbG93IG1hc2tpbmcgZ29lcwotCSAgIGF3YXksIGJlY2F1c2UgbmF0aXZlIGVuZGlhbiBhbHdheXMgcmFpc2VzIGV4Y2VwdGlvbnMKLQkgICBpbnN0ZWFkIG9mIG92ZXJmbG93IG1hc2tpbmcuICovCisgICAgLyogVGhpcyBzcGVlZCB0cmljayBjYW4ndCBiZSB1c2VkIHVudGlsIG92ZXJmbG93IG1hc2tpbmcgZ29lcworICAgICAgIGF3YXksIGJlY2F1c2UgbmF0aXZlIGVuZGlhbiBhbHdheXMgcmFpc2VzIGV4Y2VwdGlvbnMKKyAgICAgICBpbnN0ZWFkIG9mIG92ZXJmbG93IG1hc2tpbmcuICovCiAKLQkvKiBDaGVjayBlbmRpYW4gYW5kIHN3YXAgaW4gZmFzdGVyIGZ1bmN0aW9ucyAqLwotCXsKLQkJaW50IG9uZSA9IDE7Ci0JCWZvcm1hdGRlZiAqbmF0aXZlID0gbmF0aXZlX3RhYmxlOwotCQlmb3JtYXRkZWYgKm90aGVyLCAqcHRyOwotCQlpZiAoKGludCkqKHVuc2lnbmVkIGNoYXIqKSZvbmUpCi0JCQlvdGhlciA9IGxpbGVuZGlhbl90YWJsZTsKLQkJZWxzZQotCQkJb3RoZXIgPSBiaWdlbmRpYW5fdGFibGU7Ci0JCS8qIFNjYW4gdGhyb3VnaCB0aGUgbmF0aXZlIHRhYmxlLCBmaW5kIGEgbWF0Y2hpbmcKLQkJICAgZW50cnkgaW4gdGhlIGVuZGlhbiB0YWJsZSBhbmQgc3dhcCBpbiB0aGUKLQkJICAgbmF0aXZlIGltcGxlbWVudGF0aW9ucyB3aGVuZXZlciBwb3NzaWJsZQotCQkgICAoNjQtYml0IHBsYXRmb3JtcyBtYXkgbm90IGhhdmUgInN0YW5kYXJkIiBzaXplcykgKi8KLQkJd2hpbGUgKG5hdGl2ZS0+Zm9ybWF0ICE9ICdcMCcgJiYgb3RoZXItPmZvcm1hdCAhPSAnXDAnKSB7Ci0JCQlwdHIgPSBvdGhlcjsKLQkJCXdoaWxlIChwdHItPmZvcm1hdCAhPSAnXDAnKSB7Ci0JCQkJaWYgKHB0ci0+Zm9ybWF0ID09IG5hdGl2ZS0+Zm9ybWF0KSB7Ci0JCQkJCS8qIE1hdGNoIGZhc3RlciB3aGVuIGZvcm1hdHMgYXJlCi0JCQkJCSAgIGxpc3RlZCBpbiB0aGUgc2FtZSBvcmRlciAqLwotCQkJCQlpZiAocHRyID09IG90aGVyKQotCQkJCQkJb3RoZXIrKzsKLQkJCQkJLyogT25seSB1c2UgdGhlIHRyaWNrIGlmIHRoZQotCQkJCQkgICBzaXplIG1hdGNoZXMgKi8KLQkJCQkJaWYgKHB0ci0+c2l6ZSAhPSBuYXRpdmUtPnNpemUpCi0JCQkJCQlicmVhazsKLQkJCQkJLyogU2tpcCBmbG9hdCBhbmQgZG91YmxlLCBjb3VsZCBiZQotCQkJCQkgICAidW5rbm93biIgZmxvYXQgZm9ybWF0ICovCi0JCQkJCWlmIChwdHItPmZvcm1hdCA9PSAnZCcgfHwgcHRyLT5mb3JtYXQgPT0gJ2YnKQotCQkJCQkJYnJlYWs7Ci0JCQkJCXB0ci0+cGFjayA9IG5hdGl2ZS0+cGFjazsKLQkJCQkJcHRyLT51bnBhY2sgPSBuYXRpdmUtPnVucGFjazsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXB0cisrOwotCQkJfQotCQkJbmF0aXZlKys7Ci0JCX0KLQl9CisgICAgLyogQ2hlY2sgZW5kaWFuIGFuZCBzd2FwIGluIGZhc3RlciBmdW5jdGlvbnMgKi8KKyAgICB7CisgICAgICAgIGludCBvbmUgPSAxOworICAgICAgICBmb3JtYXRkZWYgKm5hdGl2ZSA9IG5hdGl2ZV90YWJsZTsKKyAgICAgICAgZm9ybWF0ZGVmICpvdGhlciwgKnB0cjsKKyAgICAgICAgaWYgKChpbnQpKih1bnNpZ25lZCBjaGFyKikmb25lKQorICAgICAgICAgICAgb3RoZXIgPSBsaWxlbmRpYW5fdGFibGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG90aGVyID0gYmlnZW5kaWFuX3RhYmxlOworICAgICAgICAvKiBTY2FuIHRocm91Z2ggdGhlIG5hdGl2ZSB0YWJsZSwgZmluZCBhIG1hdGNoaW5nCisgICAgICAgICAgIGVudHJ5IGluIHRoZSBlbmRpYW4gdGFibGUgYW5kIHN3YXAgaW4gdGhlCisgICAgICAgICAgIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgd2hlbmV2ZXIgcG9zc2libGUKKyAgICAgICAgICAgKDY0LWJpdCBwbGF0Zm9ybXMgbWF5IG5vdCBoYXZlICJzdGFuZGFyZCIgc2l6ZXMpICovCisgICAgICAgIHdoaWxlIChuYXRpdmUtPmZvcm1hdCAhPSAnXDAnICYmIG90aGVyLT5mb3JtYXQgIT0gJ1wwJykgeworICAgICAgICAgICAgcHRyID0gb3RoZXI7CisgICAgICAgICAgICB3aGlsZSAocHRyLT5mb3JtYXQgIT0gJ1wwJykgeworICAgICAgICAgICAgICAgIGlmIChwdHItPmZvcm1hdCA9PSBuYXRpdmUtPmZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAvKiBNYXRjaCBmYXN0ZXIgd2hlbiBmb3JtYXRzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0ciA9PSBvdGhlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyKys7CisgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgdXNlIHRoZSB0cmljayBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBtYXRjaGVzICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwdHItPnNpemUgIT0gbmF0aXZlLT5zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgZmxvYXQgYW5kIGRvdWJsZSwgY291bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iIGZsb2F0IGZvcm1hdCAqLworICAgICAgICAgICAgICAgICAgICBpZiAocHRyLT5mb3JtYXQgPT0gJ2QnIHx8IHB0ci0+Zm9ybWF0ID09ICdmJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBwdHItPnBhY2sgPSBuYXRpdmUtPnBhY2s7CisgICAgICAgICAgICAgICAgICAgIHB0ci0+dW5wYWNrID0gbmF0aXZlLT51bnBhY2s7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hdGl2ZSsrOworICAgICAgICB9CisgICAgfQogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlpZiAoU3RydWN0RXJyb3IgPT0gTlVMTCkgewotCQlTdHJ1Y3RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic3RydWN0LmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JCWlmIChTdHJ1Y3RFcnJvciA9PSBOVUxMKQotCQkJcmV0dXJuOwotCX0KKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGlmIChTdHJ1Y3RFcnJvciA9PSBOVUxMKSB7CisgICAgICAgIFN0cnVjdEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzdHJ1Y3QuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKFN0cnVjdEVycm9yID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQogCi0JUHlfSU5DUkVGKFN0cnVjdEVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgU3RydWN0RXJyb3IpOworICAgIFB5X0lOQ1JFRihTdHJ1Y3RFcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFN0cnVjdEVycm9yKTsKIAotCVB5X0lOQ1JFRigoUHlPYmplY3QqKSZQeVN0cnVjdFR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU3RydWN0IiwgKFB5T2JqZWN0KikmUHlTdHJ1Y3RUeXBlKTsKKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0KikmUHlTdHJ1Y3RUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlN0cnVjdCIsIChQeU9iamVjdCopJlB5U3RydWN0VHlwZSk7CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9fdmVyc2lvbl9fIiwgdmVyKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9fdmVyc2lvbl9fIiwgdmVyKTsKIAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfUFlfU1RSVUNUX1JBTkdFX0NIRUNLSU5HIiwgMSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9QWV9TVFJVQ1RfRkxPQVRfQ09FUkNFIiwgMSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9QWV9TVFJVQ1RfUkFOR0VfQ0hFQ0tJTkciLCAxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX1BZX1NUUlVDVF9GTE9BVF9DT0VSQ0UiLCAxKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCmluZGV4IDMxNDI1ZDEuLjIzYTU2OTEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwpAQCAtMTMsMjIgKzEzLDIyIEBACiAjaWZkZWYgV0lUSF9USFJFQUQKICNpbmNsdWRlICJweXRocmVhZC5oIgogI2VuZGlmIC8qIFdJVEhfVEhSRUFEICovCi1zdGF0aWMgUHlPYmplY3QgKlRlc3RFcnJvcjsJLyogc2V0IHRvIGV4Y2VwdGlvbiBvYmplY3QgaW4gaW5pdCAqLworc3RhdGljIFB5T2JqZWN0ICpUZXN0RXJyb3I7ICAgICAvKiBzZXQgdG8gZXhjZXB0aW9uIG9iamVjdCBpbiBpbml0ICovCiAKIC8qIFJhaXNlIFRlc3RFcnJvciB3aXRoIHRlc3RfbmFtZSArICI6ICIgKyBtc2csIGFuZCByZXR1cm4gTlVMTC4gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhaXNlVGVzdEVycm9yKGNvbnN0IGNoYXIqIHRlc3RfbmFtZSwgY29uc3QgY2hhciogbXNnKQogewotCWNoYXIgYnVmWzIwNDhdOworICAgIGNoYXIgYnVmWzIwNDhdOwogCi0JaWYgKHN0cmxlbih0ZXN0X25hbWUpICsgc3RybGVuKG1zZykgPiBzaXplb2YoYnVmKSAtIDUwKQotCQlQeUVycl9TZXRTdHJpbmcoVGVzdEVycm9yLCAiaW50ZXJuYWwgZXJyb3IgbXNnIHRvbyBsYXJnZSIpOwotCWVsc2UgewotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogJXMiLCB0ZXN0X25hbWUsIG1zZyk7Ci0JCVB5RXJyX1NldFN0cmluZyhUZXN0RXJyb3IsIGJ1Zik7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGlmIChzdHJsZW4odGVzdF9uYW1lKSArIHN0cmxlbihtc2cpID4gc2l6ZW9mKGJ1ZikgLSA1MCkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRlc3RFcnJvciwgImludGVybmFsIGVycm9yIG1zZyB0b28gbGFyZ2UiKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6ICVzIiwgdGVzdF9uYW1lLCBtc2cpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGVzdEVycm9yLCBidWYpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogVGVzdCAjZGVmaW5lcyBmcm9tIHB5Y29uZmlnLmggKHBhcnRpY3VsYXJseSB0aGUgU0laRU9GXyogZGVmaW5lcykuCkBAIC0zOSwxMzggKzM5LDEzOCBAQAogKi8KIHN0YXRpYyBQeU9iamVjdCoKIHNpemVvZl9lcnJvcihjb25zdCBjaGFyKiBmYXRuYW1lLCBjb25zdCBjaGFyKiB0eXBuYW1lLAotICAgICAgICBpbnQgZXhwZWN0ZWQsIGludCBnb3QpCisgICAgaW50IGV4cGVjdGVkLCBpbnQgZ290KQogewotCWNoYXIgYnVmWzEwMjRdOwotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJIiUuMjAwcyAjZGVmaW5lID09ICVkIGJ1dCBzaXplb2YoJS4yMDBzKSA9PSAlZCIsCi0JCWZhdG5hbWUsIGV4cGVjdGVkLCB0eXBuYW1lLCBnb3QpOwotCVB5RXJyX1NldFN0cmluZyhUZXN0RXJyb3IsIGJ1Zik7Ci0JcmV0dXJuIChQeU9iamVjdCopTlVMTDsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICIlLjIwMHMgI2RlZmluZSA9PSAlZCBidXQgc2l6ZW9mKCUuMjAwcykgPT0gJWQiLAorICAgICAgICBmYXRuYW1lLCBleHBlY3RlZCwgdHlwbmFtZSwgZ290KTsKKyAgICBQeUVycl9TZXRTdHJpbmcoVGVzdEVycm9yLCBidWYpOworICAgIHJldHVybiAoUHlPYmplY3QqKU5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHRlc3RfY29uZmlnKFB5T2JqZWN0ICpzZWxmKQogewogI2RlZmluZSBDSEVDS19TSVpFT0YoRkFUTkFNRSwgVFlQRSkgXAotCSAgICBpZiAoRkFUTkFNRSAhPSBzaXplb2YoVFlQRSkpIFwKLSAgICAJICAgIAlyZXR1cm4gc2l6ZW9mX2Vycm9yKCNGQVROQU1FLCAjVFlQRSwgRkFUTkFNRSwgc2l6ZW9mKFRZUEUpKQorICAgICAgICAgICAgaWYgKEZBVE5BTUUgIT0gc2l6ZW9mKFRZUEUpKSBcCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemVvZl9lcnJvcigjRkFUTkFNRSwgI1RZUEUsIEZBVE5BTUUsIHNpemVvZihUWVBFKSkKIAotCUNIRUNLX1NJWkVPRihTSVpFT0ZfU0hPUlQsIHNob3J0KTsKLQlDSEVDS19TSVpFT0YoU0laRU9GX0lOVCwgaW50KTsKLQlDSEVDS19TSVpFT0YoU0laRU9GX0xPTkcsIGxvbmcpOwotCUNIRUNLX1NJWkVPRihTSVpFT0ZfVk9JRF9QLCB2b2lkKik7Ci0JQ0hFQ0tfU0laRU9GKFNJWkVPRl9USU1FX1QsIHRpbWVfdCk7CisgICAgQ0hFQ0tfU0laRU9GKFNJWkVPRl9TSE9SVCwgc2hvcnQpOworICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfSU5ULCBpbnQpOworICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfTE9ORywgbG9uZyk7CisgICAgQ0hFQ0tfU0laRU9GKFNJWkVPRl9WT0lEX1AsIHZvaWQqKTsKKyAgICBDSEVDS19TSVpFT0YoU0laRU9GX1RJTUVfVCwgdGltZV90KTsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCUNIRUNLX1NJWkVPRihTSVpFT0ZfTE9OR19MT05HLCBQWV9MT05HX0xPTkcpOworICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfTE9OR19MT05HLCBQWV9MT05HX0xPTkcpOwogI2VuZGlmCiAKICN1bmRlZiBDSEVDS19TSVpFT0YKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHRlc3RfbGlzdF9hcGkoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QqIGxpc3Q7Ci0JaW50IGk7CisgICAgUHlPYmplY3QqIGxpc3Q7CisgICAgaW50IGk7CiAKLQkvKiBTRiBidWcgMTMyMDA4OiAgUHlMaXN0X1JldmVyc2Ugc2VnZmF1bHRzICovCisgICAgLyogU0YgYnVnIDEzMjAwODogIFB5TGlzdF9SZXZlcnNlIHNlZ2ZhdWx0cyAqLwogI2RlZmluZSBOTElTVCAzMAotCWxpc3QgPSBQeUxpc3RfTmV3KE5MSVNUKTsKLQlpZiAobGlzdCA9PSAoUHlPYmplY3QqKU5VTEwpCi0JCXJldHVybiAoUHlPYmplY3QqKU5VTEw7Ci0JLyogbGlzdCA9IHJhbmdlKE5MSVNUKSAqLwotCWZvciAoaSA9IDA7IGkgPCBOTElTVDsgKytpKSB7Ci0JCVB5T2JqZWN0KiBhbmludCA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQlpZiAoYW5pbnQgPT0gKFB5T2JqZWN0KilOVUxMKSB7Ci0JCQlQeV9ERUNSRUYobGlzdCk7Ci0JCQlyZXR1cm4gKFB5T2JqZWN0KilOVUxMOwotCQl9Ci0JCVB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCBhbmludCk7Ci0JfQotCS8qIGxpc3QucmV2ZXJzZSgpLCB2aWEgUHlMaXN0X1JldmVyc2UoKSAqLwotCWkgPSBQeUxpc3RfUmV2ZXJzZShsaXN0KTsgICAvKiBzaG91bGQgbm90IGJsb3cgdXAhICovCi0JaWYgKGkgIT0gMCkgewotCQlQeV9ERUNSRUYobGlzdCk7Ci0JCXJldHVybiAoUHlPYmplY3QqKU5VTEw7Ci0JfQotCS8qIENoZWNrIHRoYXQgbGlzdCA9PSByYW5nZSgyOSwgLTEsIC0xKSBub3cgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTkxJU1Q7ICsraSkgewotCQlQeU9iamVjdCogYW5pbnQgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCWlmIChQeUludF9BU19MT05HKGFuaW50KSAhPSBOTElTVC0xLWkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhUZXN0RXJyb3IsCi0JCQkgICAgICAgICAgICAgICAgInRlc3RfbGlzdF9hcGk6IHJldmVyc2Ugc2NyZXdlZCB1cCIpOwotCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJcmV0dXJuIChQeU9iamVjdCopTlVMTDsKLQkJfQotCX0KLQlQeV9ERUNSRUYobGlzdCk7CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoTkxJU1QpOworICAgIGlmIChsaXN0ID09IChQeU9iamVjdCopTlVMTCkKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopTlVMTDsKKyAgICAvKiBsaXN0ID0gcmFuZ2UoTkxJU1QpICovCisgICAgZm9yIChpID0gMDsgaSA8IE5MSVNUOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QqIGFuaW50ID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgIGlmIChhbmludCA9PSAoUHlPYmplY3QqKU5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QqKU5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGxpc3QsIGksIGFuaW50KTsKKyAgICB9CisgICAgLyogbGlzdC5yZXZlcnNlKCksIHZpYSBQeUxpc3RfUmV2ZXJzZSgpICovCisgICAgaSA9IFB5TGlzdF9SZXZlcnNlKGxpc3QpOyAgIC8qIHNob3VsZCBub3QgYmxvdyB1cCEgKi8KKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopTlVMTDsKKyAgICB9CisgICAgLyogQ2hlY2sgdGhhdCBsaXN0ID09IHJhbmdlKDI5LCAtMSwgLTEpIG5vdyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOTElTVDsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0KiBhbmludCA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgaWYgKFB5SW50X0FTX0xPTkcoYW5pbnQpICE9IE5MSVNULTEtaSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRlc3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF9saXN0X2FwaTogcmV2ZXJzZSBzY3Jld2VkIHVwIik7CisgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilOVUxMOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihsaXN0KTsKICN1bmRlZiBOTElTVAogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGludAogdGVzdF9kaWN0X2lubmVyKGludCBjb3VudCkKIHsKLQlQeV9zc2l6ZV90IHBvcyA9IDAsIGl0ZXJhdGlvbnMgPSAwOwotCWludCBpOwotCVB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOwotCVB5T2JqZWN0ICp2LCAqazsKKyAgICBQeV9zc2l6ZV90IHBvcyA9IDAsIGl0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOworICAgIFB5T2JqZWN0ICp2LCAqazsKIAotCWlmIChkaWN0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQl2ID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCVB5RGljdF9TZXRJdGVtKGRpY3QsIHYsIHYpOwotCQlQeV9ERUNSRUYodik7Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW0oZGljdCwgdiwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiAKLQl3aGlsZSAoUHlEaWN0X05leHQoZGljdCwgJnBvcywgJmssICZ2KSkgewotCQlQeU9iamVjdCAqbzsKLQkJaXRlcmF0aW9ucysrOworICAgIHdoaWxlIChQeURpY3RfTmV4dChkaWN0LCAmcG9zLCAmaywgJnYpKSB7CisgICAgICAgIFB5T2JqZWN0ICpvOworICAgICAgICBpdGVyYXRpb25zKys7CiAKLQkJaSA9IFB5SW50X0FTX0xPTkcodikgKyAxOwotCQlvID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCWlmIChvID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBrLCBvKSA8IDApIHsKLQkJCVB5X0RFQ1JFRihvKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9ERUNSRUYobyk7Ci0JfQorICAgICAgICBpID0gUHlJbnRfQVNfTE9ORyh2KSArIDE7CisgICAgICAgIG8gPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIGssIG8pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG8pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICB9CiAKLQlQeV9ERUNSRUYoZGljdCk7CisgICAgUHlfREVDUkVGKGRpY3QpOwogCi0JaWYgKGl0ZXJhdGlvbnMgIT0gY291bnQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJVGVzdEVycm9yLAotCQkJInRlc3RfZGljdF9pdGVyYXRpb246IGRpY3QgaXRlcmF0aW9uIHdlbnQgd3JvbmcgIik7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgewotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKGl0ZXJhdGlvbnMgIT0gY291bnQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgVGVzdEVycm9yLAorICAgICAgICAgICAgInRlc3RfZGljdF9pdGVyYXRpb246IGRpY3QgaXRlcmF0aW9uIHdlbnQgd3JvbmcgIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHRlc3RfZGljdF9pdGVyYXRpb24oUHlPYmplY3QqIHNlbGYpCiB7Ci0JaW50IGk7CisgICAgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKLQkJaWYgKHRlc3RfZGljdF9pbm5lcihpKSA8IDApIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworICAgICAgICBpZiAodGVzdF9kaWN0X2lubmVyKGkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTE3OCwxMDggKzE3OCwxMDggQEAKICAqICAgUHlUeXBlX1JlYWR5IGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gY2FsbGVkCiAgKi8KIHN0YXRpYyBQeVR5cGVPYmplY3QgX0hhc2hJbmhlcml0YW5jZVRlc3Rlcl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsCQkJLyogTnVtYmVyIG9mIGl0ZW1zIGZvciB2YXJvYmplY3QgKi8KLQkiaGFzaGluaGVyaXRhbmNldGVzdGVyIiwJLyogTmFtZSBvZiB0aGlzIHR5cGUgKi8KLQlzaXplb2YoUHlPYmplY3QpLAkvKiBCYXNpYyBvYmplY3Qgc2l6ZSAqLwotCTAsCQkJLyogSXRlbSBzaXplIGZvciB2YXJvYmplY3QgKi8KLQkoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsIC8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgIC8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkvKiB0cF9mbGFncyAqLwotCTAsCQkJLyogdHBfZG9jICovCi0JMCwJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJLyogdHBfaXRlciAqLwotCTAsCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJLyogdHBfZGljdCAqLwotCTAsCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGl0ZW1zIGZvciB2YXJvYmplY3QgKi8KKyAgICAiaGFzaGluaGVyaXRhbmNldGVzdGVyIiwgICAgICAgICAgICAvKiBOYW1lIG9mIHRoaXMgdHlwZSAqLworICAgIHNpemVvZihQeU9iamVjdCksICAgICAgICAgICAvKiBCYXNpYyBvYmplY3Qgc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdGVtIHNpemUgZm9yIHZhcm9iamVjdCAqLworICAgIChkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0KgogdGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2UoUHlPYmplY3QqIHNlbGYpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlOwotCVB5T2JqZWN0ICpvYmo7Ci0JbG9uZyBoYXNoOworICAgIFB5VHlwZU9iamVjdCAqdHlwZTsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIGxvbmcgaGFzaDsKIAotCXR5cGUgPSAmX0hhc2hJbmhlcml0YW5jZVRlc3Rlcl9UeXBlOworICAgIHR5cGUgPSAmX0hhc2hJbmhlcml0YW5jZVRlc3Rlcl9UeXBlOwogCi0JaWYgKHR5cGUtPnRwX2RpY3QgIT0gTlVMTCkKLQkJLyogVGhlIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4gVGhpcyBwcm9iYWJseSBtZWFucwotCQkgICAtUiBpcyBiZWluZyB1c2VkLiAqLwotCQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAodHlwZS0+dHBfZGljdCAhPSBOVUxMKQorICAgICAgICAvKiBUaGUgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLiBUaGlzIHByb2JhYmx5IG1lYW5zCisgICAgICAgICAgIC1SIGlzIGJlaW5nIHVzZWQuICovCisgICAgICAgIFB5X1JFVFVSTl9OT05FOwogCiAKLQlvYmogPSBQeU9iamVjdF9OZXcoUHlPYmplY3QsIHR5cGUpOwotCWlmIChvYmogPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOwotCQlQeUVycl9TZXRTdHJpbmcoCi0JCQlUZXN0RXJyb3IsCi0JCQkidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2U6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBvYmogPSBQeU9iamVjdF9OZXcoUHlPYmplY3QsIHR5cGUpOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBUZXN0RXJyb3IsCisgICAgICAgICAgICAidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2U6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICh0eXBlLT50cF9kaWN0ICE9IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJVGVzdEVycm9yLAotCQkJInRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlOiB0eXBlIGluaXRpYWxpc2VkIHRvbyBzb29uIik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2RpY3QgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBUZXN0RXJyb3IsCisgICAgICAgICAgICAidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2U6IHR5cGUgaW5pdGlhbGlzZWQgdG9vIHNvb24iKTsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWhhc2ggPSBQeU9iamVjdF9IYXNoKG9iaik7Ci0JaWYgKChoYXNoID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVRlc3RFcnJvciwKLQkJCSJ0ZXN0X2xhenlfaGFzaF9pbmhlcml0YW5jZTogY291bGQgbm90IGhhc2ggb2JqZWN0Iik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2gob2JqKTsKKyAgICBpZiAoKGhhc2ggPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgVGVzdEVycm9yLAorICAgICAgICAgICAgInRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlOiBjb3VsZCBub3QgaGFzaCBvYmplY3QiKTsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICh0eXBlLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJVGVzdEVycm9yLAotCQkJInRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlOiB0eXBlIG5vdCBpbml0aWFsaXNlZCBieSBoYXNoKCkiKTsKLQkJUHlfREVDUkVGKG9iaik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodHlwZS0+dHBfZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFRlc3RFcnJvciwKKyAgICAgICAgICAgICJ0ZXN0X2xhenlfaGFzaF9pbmhlcml0YW5jZTogdHlwZSBub3QgaW5pdGlhbGlzZWQgYnkgaGFzaCgpIik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAodHlwZS0+dHBfaGFzaCAhPSBQeVR5cGVfVHlwZS50cF9oYXNoKSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVRlc3RFcnJvciwKLQkJCSJ0ZXN0X2xhenlfaGFzaF9pbmhlcml0YW5jZTogdW5leHBlY3RlZCBoYXNoIGZ1bmN0aW9uIik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2hhc2ggIT0gUHlUeXBlX1R5cGUudHBfaGFzaCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBUZXN0RXJyb3IsCisgICAgICAgICAgICAidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2U6IHVuZXhwZWN0ZWQgaGFzaCBmdW5jdGlvbiIpOworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfREVDUkVGKG9iaik7CisgICAgUHlfREVDUkVGKG9iaik7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogCkBAIC0yOTAsOTAgKzI5MCw5MCBAQAogc3RhdGljIGludAogYnJva2VuX2J1ZmZlcl9nZXRidWZmZXIoUHlPYmplY3QgKnNlbGYsIFB5X2J1ZmZlciAqdmlldywgaW50IGZsYWdzKQogewotCVB5RXJyX1NldFN0cmluZygKLQkJVGVzdEVycm9yLAotCQkidGVzdF9icm9rZW5fbWVtb3J5dmlldzogZXhwZWN0ZWQgZXJyb3IgaW4gYmZfZ2V0YnVmZmVyIik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgVGVzdEVycm9yLAorICAgICAgICAidGVzdF9icm9rZW5fbWVtb3J5dmlldzogZXhwZWN0ZWQgZXJyb3IgaW4gYmZfZ2V0YnVmZmVyIik7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlCdWZmZXJQcm9jcyBtZW1vcnl2aWV3dGVzdGVyX2FzX2J1ZmZlciA9IHsKLQkwLAkvKiBiZl9nZXRyZWFkYnVmZmVyICovCi0JMCwJLyogYmZfZ2V0d3JpdGVidWZmZXIgKi8KLQkwLAkvKiBiZl9nZXRzZWdjb3VudCAqLwotCTAsCS8qIGJmX2dldGNoYXJidWZmZXIgKi8KLQkoZ2V0YnVmZmVycHJvYylicm9rZW5fYnVmZmVyX2dldGJ1ZmZlciwJLyogYmZfZ2V0YnVmZmVyICovCi0JMCwJLyogYmZfcmVsZWFzZWJ1ZmZlciAqLworICAgIDAsICAgICAgICAgIC8qIGJmX2dldHJlYWRidWZmZXIgKi8KKyAgICAwLCAgICAgICAgICAvKiBiZl9nZXR3cml0ZWJ1ZmZlciAqLworICAgIDAsICAgICAgICAgIC8qIGJmX2dldHNlZ2NvdW50ICovCisgICAgMCwgICAgICAgICAgLyogYmZfZ2V0Y2hhcmJ1ZmZlciAqLworICAgIChnZXRidWZmZXJwcm9jKWJyb2tlbl9idWZmZXJfZ2V0YnVmZmVyLCAgICAgLyogYmZfZ2V0YnVmZmVyICovCisgICAgMCwgICAgICAgICAgLyogYmZfcmVsZWFzZWJ1ZmZlciAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBfTWVtb3J5Vmlld1Rlc3Rlcl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsCQkJLyogTnVtYmVyIG9mIGl0ZW1zIGZvciB2YXJvYmplY3QgKi8KLQkibWVtb3J5dmlld3Rlc3RlciIsCS8qIE5hbWUgb2YgdGhpcyB0eXBlICovCi0Jc2l6ZW9mKFB5T2JqZWN0KSwJLyogQmFzaWMgb2JqZWN0IHNpemUgKi8KLQkwLAkJCS8qIEl0ZW0gc2l6ZSBmb3IgdmFyb2JqZWN0ICovCi0JKGRlc3RydWN0b3IpUHlPYmplY3RfRGVsLCAvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkmbWVtb3J5dmlld3Rlc3Rlcl9hc19idWZmZXIsCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiwJLyogdHBfZmxhZ3MgKi8KLQkwLAkJCS8qIHRwX2RvYyAqLwotCTAsCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkvKiB0cF9hbGxvYyAqLwotCVB5VHlwZV9HZW5lcmljTmV3LAkJLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpdGVtcyBmb3IgdmFyb2JqZWN0ICovCisgICAgIm1lbW9yeXZpZXd0ZXN0ZXIiLCAgICAgICAgIC8qIE5hbWUgb2YgdGhpcyB0eXBlICovCisgICAgc2l6ZW9mKFB5T2JqZWN0KSwgICAgICAgICAgIC8qIEJhc2ljIG9iamVjdCBzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0ZW0gc2l6ZSBmb3IgdmFyb2JqZWN0ICovCisgICAgKGRlc3RydWN0b3IpUHlPYmplY3RfRGVsLCAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAmbWVtb3J5dmlld3Rlc3Rlcl9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiwgICAgIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QqCiB0ZXN0X2Jyb2tlbl9tZW1vcnl2aWV3KFB5T2JqZWN0KiBzZWxmKQogewotCVB5T2JqZWN0ICpvYmogPSBQeU9iamVjdF9OZXcoUHlPYmplY3QsICZfTWVtb3J5Vmlld1Rlc3Rlcl9UeXBlKTsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpvYmogPSBQeU9iamVjdF9OZXcoUHlPYmplY3QsICZfTWVtb3J5Vmlld1Rlc3Rlcl9UeXBlKTsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKG9iaiA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVRlc3RFcnJvciwKLQkJCSJ0ZXN0X2Jyb2tlbl9tZW1vcnl2aWV3OiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFRlc3RFcnJvciwKKyAgICAgICAgICAgICJ0ZXN0X2Jyb2tlbl9tZW1vcnl2aWV3OiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXMgPSBQeU1lbW9yeVZpZXdfRnJvbU9iamVjdChvYmopOwotCWlmIChyZXMgfHwgIVB5RXJyX09jY3VycmVkKCkpewotCQlQeUVycl9TZXRTdHJpbmcoCi0JCQlUZXN0RXJyb3IsCi0JCQkidGVzdF9icm9rZW5fbWVtb3J5dmlldzogbWVtb3J5dmlldygpIGRpZG4ndCByYWlzZSBhbiBFeGNlcHRpb24iKTsKLQkJUHlfWERFQ1JFRihyZXMpOwotCQlQeV9ERUNSRUYob2JqKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHJlcyA9IFB5TWVtb3J5Vmlld19Gcm9tT2JqZWN0KG9iaik7CisgICAgaWYgKHJlcyB8fCAhUHlFcnJfT2NjdXJyZWQoKSl7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFRlc3RFcnJvciwKKyAgICAgICAgICAgICJ0ZXN0X2Jyb2tlbl9tZW1vcnl2aWV3OiBtZW1vcnl2aWV3KCkgZGlkbid0IHJhaXNlIGFuIEV4Y2VwdGlvbiIpOworICAgICAgICBQeV9YREVDUkVGKHJlcyk7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeUVycl9DbGVhcigpOwotCVB5X0RFQ1JFRihvYmopOwotCVB5X1JFVFVSTl9OT05FOworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgUHlfREVDUkVGKG9iaik7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIApAQCAtMzk3LDIyICszOTcsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByYWlzZV90ZXN0X2xvbmdfZXJyb3IoY29uc3QgY2hhciogbXNnKQogewotCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FwaSIsIG1zZyk7CisgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfYXBpIiwgbXNnKTsKIH0KIAotI2RlZmluZSBURVNUTkFNRQl0ZXN0X2xvbmdfYXBpX2lubmVyCi0jZGVmaW5lIFRZUEVOQU1FCWxvbmcKLSNkZWZpbmUgRl9TX1RPX1BZCVB5TG9uZ19Gcm9tTG9uZwotI2RlZmluZSBGX1BZX1RPX1MJUHlMb25nX0FzTG9uZwotI2RlZmluZSBGX1VfVE9fUFkJUHlMb25nX0Zyb21VbnNpZ25lZExvbmcKLSNkZWZpbmUgRl9QWV9UT19VCVB5TG9uZ19Bc1Vuc2lnbmVkTG9uZworI2RlZmluZSBURVNUTkFNRSAgICAgICAgdGVzdF9sb25nX2FwaV9pbm5lcgorI2RlZmluZSBUWVBFTkFNRSAgICAgICAgbG9uZworI2RlZmluZSBGX1NfVE9fUFkgICAgICAgUHlMb25nX0Zyb21Mb25nCisjZGVmaW5lIEZfUFlfVE9fUyAgICAgICBQeUxvbmdfQXNMb25nCisjZGVmaW5lIEZfVV9UT19QWSAgICAgICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZworI2RlZmluZSBGX1BZX1RPX1UgICAgICAgUHlMb25nX0FzVW5zaWduZWRMb25nCiAKICNpbmNsdWRlICJ0ZXN0Y2FwaV9sb25nLmgiCiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X2xvbmdfYXBpKFB5T2JqZWN0KiBzZWxmKQogewotCXJldHVybiBURVNUTkFNRShyYWlzZV90ZXN0X2xvbmdfZXJyb3IpOworICAgIHJldHVybiBURVNUTkFNRShyYWlzZV90ZXN0X2xvbmdfZXJyb3IpOwogfQogCiAjdW5kZWYgVEVTVE5BTUUKQEAgLTQyNywyMiArNDI3LDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmFpc2VfdGVzdF9sb25nbG9uZ19lcnJvcihjb25zdCBjaGFyKiBtc2cpCiB7Ci0JcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdsb25nX2FwaSIsIG1zZyk7CisgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdsb25nX2FwaSIsIG1zZyk7CiB9CiAKLSNkZWZpbmUgVEVTVE5BTUUJdGVzdF9sb25nbG9uZ19hcGlfaW5uZXIKLSNkZWZpbmUgVFlQRU5BTUUJUFlfTE9OR19MT05HCi0jZGVmaW5lIEZfU19UT19QWQlQeUxvbmdfRnJvbUxvbmdMb25nCi0jZGVmaW5lIEZfUFlfVE9fUwlQeUxvbmdfQXNMb25nTG9uZwotI2RlZmluZSBGX1VfVE9fUFkJUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nCi0jZGVmaW5lIEZfUFlfVE9fVQlQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nCisjZGVmaW5lIFRFU1ROQU1FICAgICAgICB0ZXN0X2xvbmdsb25nX2FwaV9pbm5lcgorI2RlZmluZSBUWVBFTkFNRSAgICAgICAgUFlfTE9OR19MT05HCisjZGVmaW5lIEZfU19UT19QWSAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nCisjZGVmaW5lIEZfUFlfVE9fUyAgICAgICBQeUxvbmdfQXNMb25nTG9uZworI2RlZmluZSBGX1VfVE9fUFkgICAgICAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nCisjZGVmaW5lIEZfUFlfVE9fVSAgICAgICBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nCiAKICNpbmNsdWRlICJ0ZXN0Y2FwaV9sb25nLmgiCiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X2xvbmdsb25nX2FwaShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIFRFU1ROQU1FKHJhaXNlX3Rlc3RfbG9uZ2xvbmdfZXJyb3IpOworICAgIHJldHVybiBURVNUTkFNRShyYWlzZV90ZXN0X2xvbmdsb25nX2Vycm9yKTsKIH0KIAogI3VuZGVmIFRFU1ROQU1FCkBAIC00NjAsMTYxICs0NjAsMTYxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9sb25nX2FuZF9vdmVyZmxvdyhQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqbnVtLCAqb25lLCAqdGVtcDsKLQlsb25nIHZhbHVlOwotCWludCBvdmVyZmxvdzsKKyAgICBQeU9iamVjdCAqbnVtLCAqb25lLCAqdGVtcDsKKyAgICBsb25nIHZhbHVlOworICAgIGludCBvdmVyZmxvdzsKIAotCS8qIFRlc3QgdGhhdCBvdmVyZmxvdyBpcyBzZXQgcHJvcGVybHkgZm9yIGEgbGFyZ2UgdmFsdWUuICovCi0JLyogbnVtIGlzIGEgbnVtYmVyIGxhcmdlciB0aGFuIExPTkdfTUFYIGV2ZW4gb24gNjQtYml0IHBsYXRmb3JtcyAqLwotCW51bSA9IFB5TG9uZ19Gcm9tU3RyaW5nKCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCBOVUxMLCAxNik7Ci0JaWYgKG51bSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlvdmVyZmxvdyA9IDEyMzQ7Ci0JdmFsdWUgPSBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cobnVtLCAmb3ZlcmZsb3cpOwotCVB5X0RFQ1JFRihudW0pOwotCWlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodmFsdWUgIT0gLTEpCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCi0JCQkicmV0dXJuIHZhbHVlIHdhcyBub3Qgc2V0IHRvIC0xIik7Ci0JaWYgKG92ZXJmbG93ICE9IDEpCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCi0JCQkib3ZlcmZsb3cgd2FzIG5vdCBzZXQgdG8gMSIpOworICAgIC8qIFRlc3QgdGhhdCBvdmVyZmxvdyBpcyBzZXQgcHJvcGVybHkgZm9yIGEgbGFyZ2UgdmFsdWUuICovCisgICAgLyogbnVtIGlzIGEgbnVtYmVyIGxhcmdlciB0aGFuIExPTkdfTUFYIGV2ZW4gb24gNjQtYml0IHBsYXRmb3JtcyAqLworICAgIG51bSA9IFB5TG9uZ19Gcm9tU3RyaW5nKCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCBOVUxMLCAxNik7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdmVyZmxvdyA9IDEyMzQ7CisgICAgdmFsdWUgPSBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cobnVtLCAmb3ZlcmZsb3cpOworICAgIFB5X0RFQ1JFRihudW0pOworICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gLTEpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAicmV0dXJuIHZhbHVlIHdhcyBub3Qgc2V0IHRvIC0xIik7CisgICAgaWYgKG92ZXJmbG93ICE9IDEpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAib3ZlcmZsb3cgd2FzIG5vdCBzZXQgdG8gMSIpOwogCi0JLyogU2FtZSBhZ2Fpbiwgd2l0aCBudW0gPSBMT05HX01BWCArIDEgKi8KLQludW0gPSBQeUxvbmdfRnJvbUxvbmcoTE9OR19NQVgpOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb25lID0gUHlMb25nX0Zyb21Mb25nKDFMKTsKLQlpZiAob25lID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG51bSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl0ZW1wID0gUHlOdW1iZXJfQWRkKG51bSwgb25lKTsKLQlQeV9ERUNSRUYob25lKTsKLQlQeV9ERUNSRUYobnVtKTsKLQludW0gPSB0ZW1wOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAwOwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKLQlQeV9ERUNSRUYobnVtKTsKLQlpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHZhbHVlICE9IC0xKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJInJldHVybiB2YWx1ZSB3YXMgbm90IHNldCB0byAtMSIpOwotCWlmIChvdmVyZmxvdyAhPSAxKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJIm92ZXJmbG93IHdhcyBub3Qgc2V0IHRvIDEiKTsKKyAgICAvKiBTYW1lIGFnYWluLCB3aXRoIG51bSA9IExPTkdfTUFYICsgMSAqLworICAgIG51bSA9IFB5TG9uZ19Gcm9tTG9uZyhMT05HX01BWCk7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvbmUgPSBQeUxvbmdfRnJvbUxvbmcoMUwpOworICAgIGlmIChvbmUgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobnVtKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHRlbXAgPSBQeU51bWJlcl9BZGQobnVtLCBvbmUpOworICAgIFB5X0RFQ1JFRihvbmUpOworICAgIFB5X0RFQ1JFRihudW0pOworICAgIG51bSA9IHRlbXA7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdmVyZmxvdyA9IDA7CisgICAgdmFsdWUgPSBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cobnVtLCAmb3ZlcmZsb3cpOworICAgIFB5X0RFQ1JFRihudW0pOworICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gLTEpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAicmV0dXJuIHZhbHVlIHdhcyBub3Qgc2V0IHRvIC0xIik7CisgICAgaWYgKG92ZXJmbG93ICE9IDEpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAib3ZlcmZsb3cgd2FzIG5vdCBzZXQgdG8gMSIpOwogCi0JLyogVGVzdCB0aGF0IG92ZXJmbG93IGlzIHNldCBwcm9wZXJseSBmb3IgYSBsYXJnZSBuZWdhdGl2ZSB2YWx1ZS4gKi8KLQkvKiBudW0gaXMgYSBudW1iZXIgc21hbGxlciB0aGFuIExPTkdfTUlOIGV2ZW4gb24gNjQtYml0IHBsYXRmb3JtcyAqLwotCW51bSA9IFB5TG9uZ19Gcm9tU3RyaW5nKCItRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIiwgTlVMTCwgMTYpOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAxMjM0OwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKLQlQeV9ERUNSRUYobnVtKTsKLQlpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHZhbHVlICE9IC0xKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJInJldHVybiB2YWx1ZSB3YXMgbm90IHNldCB0byAtMSIpOwotCWlmIChvdmVyZmxvdyAhPSAtMSkKLQkJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfYW5kX292ZXJmbG93IiwKLQkJCSJvdmVyZmxvdyB3YXMgbm90IHNldCB0byAtMSIpOworICAgIC8qIFRlc3QgdGhhdCBvdmVyZmxvdyBpcyBzZXQgcHJvcGVybHkgZm9yIGEgbGFyZ2UgbmVnYXRpdmUgdmFsdWUuICovCisgICAgLyogbnVtIGlzIGEgbnVtYmVyIHNtYWxsZXIgdGhhbiBMT05HX01JTiBldmVuIG9uIDY0LWJpdCBwbGF0Zm9ybXMgKi8KKyAgICBudW0gPSBQeUxvbmdfRnJvbVN0cmluZygiLUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsIE5VTEwsIDE2KTsKKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG92ZXJmbG93ID0gMTIzNDsKKyAgICB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdyhudW0sICZvdmVyZmxvdyk7CisgICAgUHlfREVDUkVGKG51bSk7CisgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2YWx1ZSAhPSAtMSkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfYW5kX292ZXJmbG93IiwKKyAgICAgICAgICAgICJyZXR1cm4gdmFsdWUgd2FzIG5vdCBzZXQgdG8gLTEiKTsKKyAgICBpZiAob3ZlcmZsb3cgIT0gLTEpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAib3ZlcmZsb3cgd2FzIG5vdCBzZXQgdG8gLTEiKTsKIAotCS8qIFNhbWUgYWdhaW4sIHdpdGggbnVtID0gTE9OR19NSU4gLSAxICovCi0JbnVtID0gUHlMb25nX0Zyb21Mb25nKExPTkdfTUlOKTsKLQlpZiAobnVtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW9uZSA9IFB5TG9uZ19Gcm9tTG9uZygxTCk7Ci0JaWYgKG9uZSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihudW0pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdGVtcCA9IFB5TnVtYmVyX1N1YnRyYWN0KG51bSwgb25lKTsKLQlQeV9ERUNSRUYob25lKTsKLQlQeV9ERUNSRUYobnVtKTsKLQludW0gPSB0ZW1wOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAwOwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKLQlQeV9ERUNSRUYobnVtKTsKLQlpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHZhbHVlICE9IC0xKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJInJldHVybiB2YWx1ZSB3YXMgbm90IHNldCB0byAtMSIpOwotCWlmIChvdmVyZmxvdyAhPSAtMSkKLQkJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfYW5kX292ZXJmbG93IiwKLQkJCSJvdmVyZmxvdyB3YXMgbm90IHNldCB0byAtMSIpOworICAgIC8qIFNhbWUgYWdhaW4sIHdpdGggbnVtID0gTE9OR19NSU4gLSAxICovCisgICAgbnVtID0gUHlMb25nX0Zyb21Mb25nKExPTkdfTUlOKTsKKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9uZSA9IFB5TG9uZ19Gcm9tTG9uZygxTCk7CisgICAgaWYgKG9uZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihudW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdGVtcCA9IFB5TnVtYmVyX1N1YnRyYWN0KG51bSwgb25lKTsKKyAgICBQeV9ERUNSRUYob25lKTsKKyAgICBQeV9ERUNSRUYobnVtKTsKKyAgICBudW0gPSB0ZW1wOworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3ZlcmZsb3cgPSAwOworICAgIHZhbHVlID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKKyAgICBQeV9ERUNSRUYobnVtKTsKKyAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHZhbHVlICE9IC0xKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgInJldHVybiB2YWx1ZSB3YXMgbm90IHNldCB0byAtMSIpOworICAgIGlmIChvdmVyZmxvdyAhPSAtMSkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfYW5kX292ZXJmbG93IiwKKyAgICAgICAgICAgICJvdmVyZmxvdyB3YXMgbm90IHNldCB0byAtMSIpOwogCi0gCS8qIFRlc3QgdGhhdCBvdmVyZmxvdyBpcyBjbGVhcmVkIHByb3Blcmx5IGZvciBzbWFsbCB2YWx1ZXMuICovCi0JbnVtID0gUHlMb25nX0Zyb21TdHJpbmcoIkZGIiwgTlVMTCwgMTYpOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAxMjM0OwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKLQlQeV9ERUNSRUYobnVtKTsKLQlpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHZhbHVlICE9IDB4RkYpCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCi0JCQkiZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIDB4RkYiKTsKLQlpZiAob3ZlcmZsb3cgIT0gMCkKLQkJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfYW5kX292ZXJmbG93IiwKLQkJCSJvdmVyZmxvdyB3YXMgbm90IGNsZWFyZWQiKTsKKyAgICAvKiBUZXN0IHRoYXQgb3ZlcmZsb3cgaXMgY2xlYXJlZCBwcm9wZXJseSBmb3Igc21hbGwgdmFsdWVzLiAqLworICAgIG51bSA9IFB5TG9uZ19Gcm9tU3RyaW5nKCJGRiIsIE5VTEwsIDE2KTsKKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG92ZXJmbG93ID0gMTIzNDsKKyAgICB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdyhudW0sICZvdmVyZmxvdyk7CisgICAgUHlfREVDUkVGKG51bSk7CisgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2YWx1ZSAhPSAweEZGKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgImV4cGVjdGVkIHJldHVybiB2YWx1ZSAweEZGIik7CisgICAgaWYgKG92ZXJmbG93ICE9IDApCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAib3ZlcmZsb3cgd2FzIG5vdCBjbGVhcmVkIik7CiAKLQludW0gPSBQeUxvbmdfRnJvbVN0cmluZygiLUZGIiwgTlVMTCwgMTYpOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAwOwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKLQlQeV9ERUNSRUYobnVtKTsKLQlpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHZhbHVlICE9IC0weEZGKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJImV4cGVjdGVkIHJldHVybiB2YWx1ZSAweEZGIik7Ci0JaWYgKG92ZXJmbG93ICE9IDApCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCi0JCQkib3ZlcmZsb3cgd2FzIHNldCBpbmNvcnJlY3RseSIpOworICAgIG51bSA9IFB5TG9uZ19Gcm9tU3RyaW5nKCItRkYiLCBOVUxMLCAxNik7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdmVyZmxvdyA9IDA7CisgICAgdmFsdWUgPSBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cobnVtLCAmb3ZlcmZsb3cpOworICAgIFB5X0RFQ1JFRihudW0pOworICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gLTB4RkYpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAiZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIDB4RkYiKTsKKyAgICBpZiAob3ZlcmZsb3cgIT0gMCkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfYW5kX292ZXJmbG93IiwKKyAgICAgICAgICAgICJvdmVyZmxvdyB3YXMgc2V0IGluY29ycmVjdGx5Iik7CiAKLQludW0gPSBQeUxvbmdfRnJvbUxvbmcoTE9OR19NQVgpOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAxMjM0OwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKLQlQeV9ERUNSRUYobnVtKTsKLQlpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHZhbHVlICE9IExPTkdfTUFYKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJImV4cGVjdGVkIHJldHVybiB2YWx1ZSBMT05HX01BWCIpOwotCWlmIChvdmVyZmxvdyAhPSAwKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJIm92ZXJmbG93IHdhcyBub3QgY2xlYXJlZCIpOworICAgIG51bSA9IFB5TG9uZ19Gcm9tTG9uZyhMT05HX01BWCk7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdmVyZmxvdyA9IDEyMzQ7CisgICAgdmFsdWUgPSBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cobnVtLCAmb3ZlcmZsb3cpOworICAgIFB5X0RFQ1JFRihudW0pOworICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAiZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIExPTkdfTUFYIik7CisgICAgaWYgKG92ZXJmbG93ICE9IDApCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAib3ZlcmZsb3cgd2FzIG5vdCBjbGVhcmVkIik7CiAKLQludW0gPSBQeUxvbmdfRnJvbUxvbmcoTE9OR19NSU4pOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAwOwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKLQlQeV9ERUNSRUYobnVtKTsKLQlpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHZhbHVlICE9IExPTkdfTUlOKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJImV4cGVjdGVkIHJldHVybiB2YWx1ZSBMT05HX01JTiIpOwotCWlmIChvdmVyZmxvdyAhPSAwKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJIm92ZXJmbG93IHdhcyBub3QgY2xlYXJlZCIpOworICAgIG51bSA9IFB5TG9uZ19Gcm9tTG9uZyhMT05HX01JTik7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdmVyZmxvdyA9IDA7CisgICAgdmFsdWUgPSBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cobnVtLCAmb3ZlcmZsb3cpOworICAgIFB5X0RFQ1JFRihudW0pOworICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gTE9OR19NSU4pCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAiZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIExPTkdfTUlOIik7CisgICAgaWYgKG92ZXJmbG93ICE9IDApCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAib3ZlcmZsb3cgd2FzIG5vdCBjbGVhcmVkIik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBUZXN0IHRoZSBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93IEFQSS4gR2VuZXJhbCBjb252ZXJzaW9uIHRvCkBAIC02MjUsMTYxICs2MjUsMTYxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93KFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpudW0sICpvbmUsICp0ZW1wOwotCVBZX0xPTkdfTE9ORyB2YWx1ZTsKLQlpbnQgb3ZlcmZsb3c7CisgICAgUHlPYmplY3QgKm51bSwgKm9uZSwgKnRlbXA7CisgICAgUFlfTE9OR19MT05HIHZhbHVlOworICAgIGludCBvdmVyZmxvdzsKIAotCS8qIFRlc3QgdGhhdCBvdmVyZmxvdyBpcyBzZXQgcHJvcGVybHkgZm9yIGEgbGFyZ2UgdmFsdWUuICovCi0JLyogbnVtIGlzIGEgbnVtYmVyIGxhcmdlciB0aGFuIFBZX0xMT05HX01BWCBvbiBhIHR5cGljYWwgbWFjaGluZS4gKi8KLQludW0gPSBQeUxvbmdfRnJvbVN0cmluZygiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIiwgTlVMTCwgMTYpOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAxMjM0OwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhudW0sICZvdmVyZmxvdyk7Ci0JUHlfREVDUkVGKG51bSk7Ci0JaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh2YWx1ZSAhPSAtMSkKLQkJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJInJldHVybiB2YWx1ZSB3YXMgbm90IHNldCB0byAtMSIpOwotCWlmIChvdmVyZmxvdyAhPSAxKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyIsCi0JCQkib3ZlcmZsb3cgd2FzIG5vdCBzZXQgdG8gMSIpOworICAgIC8qIFRlc3QgdGhhdCBvdmVyZmxvdyBpcyBzZXQgcHJvcGVybHkgZm9yIGEgbGFyZ2UgdmFsdWUuICovCisgICAgLyogbnVtIGlzIGEgbnVtYmVyIGxhcmdlciB0aGFuIFBZX0xMT05HX01BWCBvbiBhIHR5cGljYWwgbWFjaGluZS4gKi8KKyAgICBudW0gPSBQeUxvbmdfRnJvbVN0cmluZygiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIiwgTlVMTCwgMTYpOworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3ZlcmZsb3cgPSAxMjM0OworICAgIHZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhudW0sICZvdmVyZmxvdyk7CisgICAgUHlfREVDUkVGKG51bSk7CisgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2YWx1ZSAhPSAtMSkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgInJldHVybiB2YWx1ZSB3YXMgbm90IHNldCB0byAtMSIpOworICAgIGlmIChvdmVyZmxvdyAhPSAxKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAib3ZlcmZsb3cgd2FzIG5vdCBzZXQgdG8gMSIpOwogCi0JLyogU2FtZSBhZ2Fpbiwgd2l0aCBudW0gPSBQWV9MTE9OR19NQVggKyAxICovCi0JbnVtID0gUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MTE9OR19NQVgpOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb25lID0gUHlMb25nX0Zyb21Mb25nKDFMKTsKLQlpZiAob25lID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG51bSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl0ZW1wID0gUHlOdW1iZXJfQWRkKG51bSwgb25lKTsKLQlQeV9ERUNSRUYob25lKTsKLQlQeV9ERUNSRUYobnVtKTsKLQludW0gPSB0ZW1wOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAwOwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhudW0sICZvdmVyZmxvdyk7Ci0JUHlfREVDUkVGKG51bSk7Ci0JaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh2YWx1ZSAhPSAtMSkKLQkJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJInJldHVybiB2YWx1ZSB3YXMgbm90IHNldCB0byAtMSIpOwotCWlmIChvdmVyZmxvdyAhPSAxKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyIsCi0JCQkib3ZlcmZsb3cgd2FzIG5vdCBzZXQgdG8gMSIpOworICAgIC8qIFNhbWUgYWdhaW4sIHdpdGggbnVtID0gUFlfTExPTkdfTUFYICsgMSAqLworICAgIG51bSA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTExPTkdfTUFYKTsKKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9uZSA9IFB5TG9uZ19Gcm9tTG9uZygxTCk7CisgICAgaWYgKG9uZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihudW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdGVtcCA9IFB5TnVtYmVyX0FkZChudW0sIG9uZSk7CisgICAgUHlfREVDUkVGKG9uZSk7CisgICAgUHlfREVDUkVGKG51bSk7CisgICAgbnVtID0gdGVtcDsKKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG92ZXJmbG93ID0gMDsKKyAgICB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3cobnVtLCAmb3ZlcmZsb3cpOworICAgIFB5X0RFQ1JFRihudW0pOworICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gLTEpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93IiwKKyAgICAgICAgICAgICJyZXR1cm4gdmFsdWUgd2FzIG5vdCBzZXQgdG8gLTEiKTsKKyAgICBpZiAob3ZlcmZsb3cgIT0gMSkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgIm92ZXJmbG93IHdhcyBub3Qgc2V0IHRvIDEiKTsKIAotCS8qIFRlc3QgdGhhdCBvdmVyZmxvdyBpcyBzZXQgcHJvcGVybHkgZm9yIGEgbGFyZ2UgbmVnYXRpdmUgdmFsdWUuICovCi0JLyogbnVtIGlzIGEgbnVtYmVyIHNtYWxsZXIgdGhhbiBQWV9MTE9OR19NSU4gb24gYSB0eXBpY2FsIHBsYXRmb3JtICovCi0JbnVtID0gUHlMb25nX0Zyb21TdHJpbmcoIi1GRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCBOVUxMLCAxNik7Ci0JaWYgKG51bSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlvdmVyZmxvdyA9IDEyMzQ7Ci0JdmFsdWUgPSBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKLQlQeV9ERUNSRUYobnVtKTsKLQlpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHZhbHVlICE9IC0xKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyIsCi0JCQkicmV0dXJuIHZhbHVlIHdhcyBub3Qgc2V0IHRvIC0xIik7Ci0JaWYgKG92ZXJmbG93ICE9IC0xKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyIsCi0JCQkib3ZlcmZsb3cgd2FzIG5vdCBzZXQgdG8gLTEiKTsKKyAgICAvKiBUZXN0IHRoYXQgb3ZlcmZsb3cgaXMgc2V0IHByb3Blcmx5IGZvciBhIGxhcmdlIG5lZ2F0aXZlIHZhbHVlLiAqLworICAgIC8qIG51bSBpcyBhIG51bWJlciBzbWFsbGVyIHRoYW4gUFlfTExPTkdfTUlOIG9uIGEgdHlwaWNhbCBwbGF0Zm9ybSAqLworICAgIG51bSA9IFB5TG9uZ19Gcm9tU3RyaW5nKCItRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIiwgTlVMTCwgMTYpOworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3ZlcmZsb3cgPSAxMjM0OworICAgIHZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhudW0sICZvdmVyZmxvdyk7CisgICAgUHlfREVDUkVGKG51bSk7CisgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2YWx1ZSAhPSAtMSkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgInJldHVybiB2YWx1ZSB3YXMgbm90IHNldCB0byAtMSIpOworICAgIGlmIChvdmVyZmxvdyAhPSAtMSkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgIm92ZXJmbG93IHdhcyBub3Qgc2V0IHRvIC0xIik7CiAKLQkvKiBTYW1lIGFnYWluLCB3aXRoIG51bSA9IFBZX0xMT05HX01JTiAtIDEgKi8KLQludW0gPSBQeUxvbmdfRnJvbUxvbmdMb25nKFBZX0xMT05HX01JTik7Ci0JaWYgKG51bSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlvbmUgPSBQeUxvbmdfRnJvbUxvbmcoMUwpOwotCWlmIChvbmUgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobnVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXRlbXAgPSBQeU51bWJlcl9TdWJ0cmFjdChudW0sIG9uZSk7Ci0JUHlfREVDUkVGKG9uZSk7Ci0JUHlfREVDUkVGKG51bSk7Ci0JbnVtID0gdGVtcDsKLQlpZiAobnVtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW92ZXJmbG93ID0gMDsKLQl2YWx1ZSA9IFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3cobnVtLCAmb3ZlcmZsb3cpOwotCVB5X0RFQ1JFRihudW0pOwotCWlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodmFsdWUgIT0gLTEpCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93IiwKLQkJCSJyZXR1cm4gdmFsdWUgd2FzIG5vdCBzZXQgdG8gLTEiKTsKLQlpZiAob3ZlcmZsb3cgIT0gLTEpCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93IiwKLQkJCSJvdmVyZmxvdyB3YXMgbm90IHNldCB0byAtMSIpOworICAgIC8qIFNhbWUgYWdhaW4sIHdpdGggbnVtID0gUFlfTExPTkdfTUlOIC0gMSAqLworICAgIG51bSA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTExPTkdfTUlOKTsKKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9uZSA9IFB5TG9uZ19Gcm9tTG9uZygxTCk7CisgICAgaWYgKG9uZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihudW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdGVtcCA9IFB5TnVtYmVyX1N1YnRyYWN0KG51bSwgb25lKTsKKyAgICBQeV9ERUNSRUYob25lKTsKKyAgICBQeV9ERUNSRUYobnVtKTsKKyAgICBudW0gPSB0ZW1wOworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3ZlcmZsb3cgPSAwOworICAgIHZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhudW0sICZvdmVyZmxvdyk7CisgICAgUHlfREVDUkVGKG51bSk7CisgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2YWx1ZSAhPSAtMSkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgInJldHVybiB2YWx1ZSB3YXMgbm90IHNldCB0byAtMSIpOworICAgIGlmIChvdmVyZmxvdyAhPSAtMSkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgIm92ZXJmbG93IHdhcyBub3Qgc2V0IHRvIC0xIik7CiAKLSAJLyogVGVzdCB0aGF0IG92ZXJmbG93IGlzIGNsZWFyZWQgcHJvcGVybHkgZm9yIHNtYWxsIHZhbHVlcy4gKi8KLQludW0gPSBQeUxvbmdfRnJvbVN0cmluZygiRkYiLCBOVUxMLCAxNik7Ci0JaWYgKG51bSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlvdmVyZmxvdyA9IDEyMzQ7Ci0JdmFsdWUgPSBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKLQlQeV9ERUNSRUYobnVtKTsKLQlpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHZhbHVlICE9IDB4RkYpCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93IiwKLQkJCSJleHBlY3RlZCByZXR1cm4gdmFsdWUgMHhGRiIpOwotCWlmIChvdmVyZmxvdyAhPSAwKQotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyIsCi0JCQkib3ZlcmZsb3cgd2FzIG5vdCBjbGVhcmVkIik7CisgICAgLyogVGVzdCB0aGF0IG92ZXJmbG93IGlzIGNsZWFyZWQgcHJvcGVybHkgZm9yIHNtYWxsIHZhbHVlcy4gKi8KKyAgICBudW0gPSBQeUxvbmdfRnJvbVN0cmluZygiRkYiLCBOVUxMLCAxNik7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdmVyZmxvdyA9IDEyMzQ7CisgICAgdmFsdWUgPSBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKKyAgICBQeV9ERUNSRUYobnVtKTsKKyAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHZhbHVlICE9IDB4RkYpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93IiwKKyAgICAgICAgICAgICJleHBlY3RlZCByZXR1cm4gdmFsdWUgMHhGRiIpOworICAgIGlmIChvdmVyZmxvdyAhPSAwKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAib3ZlcmZsb3cgd2FzIG5vdCBjbGVhcmVkIik7CiAKLQludW0gPSBQeUxvbmdfRnJvbVN0cmluZygiLUZGIiwgTlVMTCwgMTYpOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAwOwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhudW0sICZvdmVyZmxvdyk7Ci0JUHlfREVDUkVGKG51bSk7Ci0JaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh2YWx1ZSAhPSAtMHhGRikKLQkJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAotCQkJImV4cGVjdGVkIHJldHVybiB2YWx1ZSAweEZGIik7Ci0JaWYgKG92ZXJmbG93ICE9IDApCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93IiwKLQkJCSJvdmVyZmxvdyB3YXMgc2V0IGluY29ycmVjdGx5Iik7CisgICAgbnVtID0gUHlMb25nX0Zyb21TdHJpbmcoIi1GRiIsIE5VTEwsIDE2KTsKKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG92ZXJmbG93ID0gMDsKKyAgICB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3cobnVtLCAmb3ZlcmZsb3cpOworICAgIFB5X0RFQ1JFRihudW0pOworICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gLTB4RkYpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93IiwKKyAgICAgICAgICAgICJleHBlY3RlZCByZXR1cm4gdmFsdWUgMHhGRiIpOworICAgIGlmIChvdmVyZmxvdyAhPSAwKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgICAgICAib3ZlcmZsb3cgd2FzIHNldCBpbmNvcnJlY3RseSIpOwogCi0JbnVtID0gUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MTE9OR19NQVgpOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAxMjM0OwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhudW0sICZvdmVyZmxvdyk7Ci0JUHlfREVDUkVGKG51bSk7Ci0JaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh2YWx1ZSAhPSBQWV9MTE9OR19NQVgpCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93IiwKLQkJCSJleHBlY3RlZCByZXR1cm4gdmFsdWUgUFlfTExPTkdfTUFYIik7Ci0JaWYgKG92ZXJmbG93ICE9IDApCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93IiwKLQkJCSJvdmVyZmxvdyB3YXMgbm90IGNsZWFyZWQiKTsKKyAgICBudW0gPSBQeUxvbmdfRnJvbUxvbmdMb25nKFBZX0xMT05HX01BWCk7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdmVyZmxvdyA9IDEyMzQ7CisgICAgdmFsdWUgPSBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKKyAgICBQeV9ERUNSRUYobnVtKTsKKyAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHZhbHVlICE9IFBZX0xMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgImV4cGVjdGVkIHJldHVybiB2YWx1ZSBQWV9MTE9OR19NQVgiKTsKKyAgICBpZiAob3ZlcmZsb3cgIT0gMCkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgIm92ZXJmbG93IHdhcyBub3QgY2xlYXJlZCIpOwogCi0JbnVtID0gUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MTE9OR19NSU4pOwotCWlmIChudW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3ZlcmZsb3cgPSAwOwotCXZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhudW0sICZvdmVyZmxvdyk7Ci0JUHlfREVDUkVGKG51bSk7Ci0JaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh2YWx1ZSAhPSBQWV9MTE9OR19NSU4pCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93IiwKLQkJCSJleHBlY3RlZCByZXR1cm4gdmFsdWUgUFlfTExPTkdfTUlOIik7Ci0JaWYgKG92ZXJmbG93ICE9IDApCi0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93IiwKLQkJCSJvdmVyZmxvdyB3YXMgbm90IGNsZWFyZWQiKTsKKyAgICBudW0gPSBQeUxvbmdfRnJvbUxvbmdMb25nKFBZX0xMT05HX01JTik7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdmVyZmxvdyA9IDA7CisgICAgdmFsdWUgPSBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93KG51bSwgJm92ZXJmbG93KTsKKyAgICBQeV9ERUNSRUYobnVtKTsKKyAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHZhbHVlICE9IFBZX0xMT05HX01JTikKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgImV4cGVjdGVkIHJldHVybiB2YWx1ZSBQWV9MTE9OR19NSU4iKTsKKyAgICBpZiAob3ZlcmZsb3cgIT0gMCkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAorICAgICAgICAgICAgIm92ZXJmbG93IHdhcyBub3QgY2xlYXJlZCIpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogVGVzdCB0aGUgTCBjb2RlIGZvciBQeUFyZ19QYXJzZVR1cGxlLiAgVGhpcyBzaG91bGQgZGVsaXZlciBhIFBZX0xPTkdfTE9ORwpAQCAtNzg5LDcxICs3ODksNzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X0xfY29kZShQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqdHVwbGUsICpudW07Ci0JUFlfTE9OR19MT05HIHZhbHVlOworICAgIFB5T2JqZWN0ICp0dXBsZSwgKm51bTsKKyAgICBQWV9MT05HX0xPTkcgdmFsdWU7CiAKLSAgICAgICAgdHVwbGUgPSBQeVR1cGxlX05ldygxKTsKLSAgICAgICAgaWYgKHR1cGxlID09IE5VTEwpCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKKyAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KDEpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBudW0gPSBQeUxvbmdfRnJvbUxvbmcoNDIpOwotICAgICAgICBpZiAobnVtID09IE5VTEwpCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKKyAgICBudW0gPSBQeUxvbmdfRnJvbUxvbmcoNDIpOworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOwogCi0gICAgICAgIHZhbHVlID0gLTE7Ci0gICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiTDp0ZXN0X0xfY29kZSIsICZ2YWx1ZSkgPCAwKQotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSA0MikKLSAgICAgICAgCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9MX2NvZGUiLAotCQkJIkwgY29kZSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyA0MiIpOworICAgIHZhbHVlID0gLTE7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJMOnRlc3RfTF9jb2RlIiwgJnZhbHVlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2YWx1ZSAhPSA0MikKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X0xfY29kZSIsCisgICAgICAgICAgICAiTCBjb2RlIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDQyIik7CiAKLQlQeV9ERUNSRUYobnVtKTsKLSAgICAgICAgbnVtID0gUHlJbnRfRnJvbUxvbmcoNDIpOwotICAgICAgICBpZiAobnVtID09IE5VTEwpCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYobnVtKTsKKyAgICBudW0gPSBQeUludF9Gcm9tTG9uZyg0Mik7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOworICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CiAKLQl2YWx1ZSA9IC0xOwotICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgIkw6dGVzdF9MX2NvZGUiLCAmdmFsdWUpIDwgMCkKLSAgICAgICAgCXJldHVybiBOVUxMOwotICAgICAgICBpZiAodmFsdWUgIT0gNDIpCi0gICAgICAgIAlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfTF9jb2RlIiwKLQkJCSJMIGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGludCA0MiIpOworICAgIHZhbHVlID0gLTE7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJMOnRlc3RfTF9jb2RlIiwgJnZhbHVlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2YWx1ZSAhPSA0MikKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X0xfY29kZSIsCisgICAgICAgICAgICAiTCBjb2RlIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBpbnQgNDIiKTsKIAotCVB5X0RFQ1JFRih0dXBsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCi0jZW5kaWYJLyogaWZkZWYgSEFWRV9MT05HX0xPTkcgKi8KKyNlbmRpZiAgLyogaWZkZWYgSEFWRV9MT05HX0xPTkcgKi8KIAogLyogVGVzdCB0dXBsZSBhcmd1bWVudCBwcm9jZXNzaW5nICovCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJnc190dXBsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGEsIGIsIGM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpKGlpKSIsICZhLCAmYiwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpIiwgYSwgYiwgYyk7CisgICAgaW50IGEsIGIsIGM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpKGlpKSIsICZhLCAmYiwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpIiwgYSwgYiwgYyk7CiB9CiAKIC8qIHRlc3QgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzICovCiBzdGF0aWMgUHlPYmplY3QgKmdldGFyZ3Nfa2V5d29yZHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJhcmcxIiwiYXJnMiIsImFyZzMiLCJhcmc0IiwiYXJnNSIsIE5VTEx9OwotCXN0YXRpYyBjaGFyICpmbXQ9IihpaSlpfChpKGlpKSkoaWlpKWkiOwotCWludCBpbnRfYXJnc1sxMF09ey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYXJnMSIsImFyZzIiLCJhcmczIiwiYXJnNCIsImFyZzUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY2hhciAqZm10PSIoaWkpaXwoaShpaSkpKGlpaSlpIjsKKyAgICBpbnQgaW50X2FyZ3NbMTBdPXstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsIGZtdCwga2V5d29yZHMsCi0JCSZpbnRfYXJnc1swXSwgJmludF9hcmdzWzFdLCAmaW50X2FyZ3NbMl0sICZpbnRfYXJnc1szXSwgJmludF9hcmdzWzRdLAotCQkmaW50X2FyZ3NbNV0sICZpbnRfYXJnc1s2XSwgJmludF9hcmdzWzddLCAmaW50X2FyZ3NbOF0sICZpbnRfYXJnc1s5XSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaWlpaWlpaWlpIiwKLQkJaW50X2FyZ3NbMF0sIGludF9hcmdzWzFdLCBpbnRfYXJnc1syXSwgaW50X2FyZ3NbM10sIGludF9hcmdzWzRdLAotCQlpbnRfYXJnc1s1XSwgaW50X2FyZ3NbNl0sIGludF9hcmdzWzddLCBpbnRfYXJnc1s4XSwgaW50X2FyZ3NbOV0pOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgZm10LCBrZXl3b3JkcywKKyAgICAgICAgJmludF9hcmdzWzBdLCAmaW50X2FyZ3NbMV0sICZpbnRfYXJnc1syXSwgJmludF9hcmdzWzNdLCAmaW50X2FyZ3NbNF0sCisgICAgICAgICZpbnRfYXJnc1s1XSwgJmludF9hcmdzWzZdLCAmaW50X2FyZ3NbN10sICZpbnRfYXJnc1s4XSwgJmludF9hcmdzWzldKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaWlpaWlpaWkiLAorICAgICAgICBpbnRfYXJnc1swXSwgaW50X2FyZ3NbMV0sIGludF9hcmdzWzJdLCBpbnRfYXJnc1szXSwgaW50X2FyZ3NbNF0sCisgICAgICAgIGludF9hcmdzWzVdLCBpbnRfYXJnc1s2XSwgaW50X2FyZ3NbN10sIGludF9hcmdzWzhdLCBpbnRfYXJnc1s5XSk7CiB9CiAKIC8qIEZ1bmN0aW9ucyB0byBjYWxsIFB5QXJnX1BhcnNlVHVwbGUgd2l0aCBpbnRlZ2VyIGZvcm1hdCBjb2RlcywKQEAgLTg2MiwxMDEgKzg2MiwxMDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX2IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJiIiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXZhbHVlKTsKKyAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiYiIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyl2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX0IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJCIiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXZhbHVlKTsKKyAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQiIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyl2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IHZhbHVlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaCIsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpdmFsdWUpOworICAgIHNob3J0IHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaCIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpdmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJnc19IKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkgiLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpdmFsdWUpOworICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSCIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyl2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX0koUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGludCB2YWx1ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkkiLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpdmFsdWUpOworICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkkiLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpdmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJnc19rKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBsb25nIHZhbHVlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiayIsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWx1ZSk7CisgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImsiLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJnc19pKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygobG9uZyl2YWx1ZSk7CisgICAgaW50IHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpdmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJnc19sKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHZhbHVlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOworICAgIGxvbmcgdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuIiwgJnZhbHVlKSkKLQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QodmFsdWUpOworICAgIFB5X3NzaXplX3QgdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuIiwgJnZhbHVlKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QodmFsdWUpOwogfQogCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX0woUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVBZX0xPTkdfTE9ORyB2YWx1ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkwiLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CisgICAgUFlfTE9OR19MT05HIHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTCIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfSyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbHVlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSyIsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWx1ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIksiLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbHVlKTsKIH0KICNlbmRpZgogCkBAIC05NjUsNTQgKzk2NSw1NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3Rfa19jb2RlKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp0dXBsZSwgKm51bTsKLQl1bnNpZ25lZCBsb25nIHZhbHVlOworICAgIFB5T2JqZWN0ICp0dXBsZSwgKm51bTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwogCi0gICAgICAgIHR1cGxlID0gUHlUdXBsZV9OZXcoMSk7Ci0gICAgICAgIGlmICh0dXBsZSA9PSBOVUxMKQotICAgICAgICAJcmV0dXJuIE5VTEw7CisgICAgdHVwbGUgPSBQeVR1cGxlX05ldygxKTsKKyAgICBpZiAodHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBhIG51bWJlciBsYXJnZXIgdGhhbiBVTE9OR19NQVggZXZlbiBvbiA2NC1iaXQgcGxhdGZvcm1zICovCi0gICAgICAgIG51bSA9IFB5TG9uZ19Gcm9tU3RyaW5nKCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiLCBOVUxMLCAxNik7Ci0gICAgICAgIGlmIChudW0gPT0gTlVMTCkKLSAgICAgICAgCXJldHVybiBOVUxMOworICAgIC8qIGEgbnVtYmVyIGxhcmdlciB0aGFuIFVMT05HX01BWCBldmVuIG9uIDY0LWJpdCBwbGF0Zm9ybXMgKi8KKyAgICBudW0gPSBQeUxvbmdfRnJvbVN0cmluZygiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIiwgTlVMTCwgMTYpOworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl2YWx1ZSA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhudW0pOwotCWlmICh2YWx1ZSAhPSBVTE9OR19NQVgpCi0gICAgICAgIAlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfa19jb2RlIiwKLQkgICAgIlB5SW50X0FzVW5zaWduZWRMb25nTWFzaygpIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CisgICAgdmFsdWUgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sobnVtKTsKKyAgICBpZiAodmFsdWUgIT0gVUxPTkdfTUFYKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfa19jb2RlIiwKKyAgICAgICAgIlB5SW50X0FzVW5zaWduZWRMb25nTWFzaygpIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CiAKLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOwogCi0gICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJrOnRlc3Rfa19jb2RlIiwgJnZhbHVlKSA8IDApCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKHZhbHVlICE9IFVMT05HX01BWCkKLSAgICAgICAgCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9rX2NvZGUiLAotCQkJImsgY29kZSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOworICAgIHZhbHVlID0gMDsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgIms6dGVzdF9rX2NvZGUiLCAmdmFsdWUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHZhbHVlICE9IFVMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCisgICAgICAgICAgICAiayBjb2RlIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CiAKLQlQeV9ERUNSRUYobnVtKTsKLSAgICAgICAgbnVtID0gUHlMb25nX0Zyb21TdHJpbmcoIi1GRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDA0MiIsIE5VTEwsIDE2KTsKLSAgICAgICAgaWYgKG51bSA9PSBOVUxMKQotICAgICAgICAJcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKG51bSk7CisgICAgbnVtID0gUHlMb25nX0Zyb21TdHJpbmcoIi1GRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDA0MiIsIE5VTEwsIDE2KTsKKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdmFsdWUgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sobnVtKTsKLQlpZiAodmFsdWUgIT0gKHVuc2lnbmVkIGxvbmcpLTB4NDIpCi0gICAgICAgIAlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfa19jb2RlIiwKLQkgICAgIlB5SW50X0FzVW5zaWduZWRMb25nTWFzaygpIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CisgICAgdmFsdWUgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sobnVtKTsKKyAgICBpZiAodmFsdWUgIT0gKHVuc2lnbmVkIGxvbmcpLTB4NDIpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9rX2NvZGUiLAorICAgICAgICAiUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKIAotICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOworICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CiAKLQl2YWx1ZSA9IDA7Ci0gICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiazp0ZXN0X2tfY29kZSIsICZ2YWx1ZSkgPCAwKQotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSAodW5zaWduZWQgbG9uZyktMHg0MikKLSAgICAgICAgCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9rX2NvZGUiLAotCQkJImsgY29kZSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAtMHhGRkYuLjAwMDA0MiIpOworICAgIHZhbHVlID0gMDsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgIms6dGVzdF9rX2NvZGUiLCAmdmFsdWUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHZhbHVlICE9ICh1bnNpZ25lZCBsb25nKS0weDQyKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfa19jb2RlIiwKKyAgICAgICAgICAgICJrIGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgLTB4RkZGLi4wMDAwNDIiKTsKIAotCVB5X0RFQ1JFRih0dXBsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQpAQCAtMTAyNSwxMzAgKzEwMjUsMTMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF91X2NvZGUoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnR1cGxlLCAqb2JqOwotCVB5X1VOSUNPREUgKnZhbHVlOwotCWludCBsZW47CisgICAgUHlPYmplY3QgKnR1cGxlLCAqb2JqOworICAgIFB5X1VOSUNPREUgKnZhbHVlOworICAgIGludCBsZW47CiAKLQkvKiBpc3N1ZTQxMjI6IFVuZGVmaW5lZCByZWZlcmVuY2UgdG8gX1B5X2FzY2lpX3doaXRlc3BhY2Ugb24gV2luZG93cyAqLwotCS8qIEp1c3QgdXNlIHRoZSBtYWNybyBhbmQgY2hlY2sgdGhhdCBpdCBjb21waWxlcyAqLwotCXggPSBQeV9VTklDT0RFX0lTU1BBQ0UoMjUpOworICAgIC8qIGlzc3VlNDEyMjogVW5kZWZpbmVkIHJlZmVyZW5jZSB0byBfUHlfYXNjaWlfd2hpdGVzcGFjZSBvbiBXaW5kb3dzICovCisgICAgLyogSnVzdCB1c2UgdGhlIG1hY3JvIGFuZCBjaGVjayB0aGF0IGl0IGNvbXBpbGVzICovCisgICAgeCA9IFB5X1VOSUNPREVfSVNTUEFDRSgyNSk7CiAKLSAgICAgICAgdHVwbGUgPSBQeVR1cGxlX05ldygxKTsKLSAgICAgICAgaWYgKHR1cGxlID09IE5VTEwpCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKKyAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KDEpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBvYmogPSBQeVVuaWNvZGVfRGVjb2RlKCJ0ZXN0Iiwgc3RybGVuKCJ0ZXN0IiksCi0JCQkgICAgICAgImFzY2lpIiwgTlVMTCk7Ci0gICAgICAgIGlmIChvYmogPT0gTlVMTCkKLSAgICAgICAgCXJldHVybiBOVUxMOworICAgIG9iaiA9IFB5VW5pY29kZV9EZWNvZGUoInRlc3QiLCBzdHJsZW4oInRlc3QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc2NpaSIsIE5VTEwpOworICAgIGlmIChvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgb2JqKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBvYmopOwogCi0gICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJ1OnRlc3RfdV9jb2RlIiwgJnZhbHVlKSA8IDApCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKHZhbHVlICE9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iaikpCi0gICAgICAgIAlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfdV9jb2RlIiwKLQkJCSJ1IGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIHUndGVzdCciKTsKLSAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgInUjOnRlc3RfdV9jb2RlIiwgJnZhbHVlLCAmbGVuKSA8IDApCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKHZhbHVlICE9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iaikgfHwKLQkgICAgbGVuICE9IFB5VW5pY29kZV9HRVRfU0laRShvYmopKQotICAgICAgICAJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X3VfY29kZSIsCi0JCQkidSMgY29kZSByZXR1cm5lZCB3cm9uZyB2YWx1ZXMgZm9yIHUndGVzdCciKTsKKyAgICB2YWx1ZSA9IDA7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJ1OnRlc3RfdV9jb2RlIiwgJnZhbHVlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2YWx1ZSAhPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmopKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfdV9jb2RlIiwKKyAgICAgICAgICAgICJ1IGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIHUndGVzdCciKTsKKyAgICB2YWx1ZSA9IDA7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJ1Izp0ZXN0X3VfY29kZSIsICZ2YWx1ZSwgJmxlbikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKSB8fAorICAgICAgICBsZW4gIT0gUHlVbmljb2RlX0dFVF9TSVpFKG9iaikpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF91X2NvZGUiLAorICAgICAgICAgICAgInUjIGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWVzIGZvciB1J3Rlc3QnIik7CiAKLQlQeV9ERUNSRUYodHVwbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3Rfd2lkZWNoYXIoUHlPYmplY3QgKnNlbGYpCiB7CiAjaWYgZGVmaW5lZChTSVpFT0ZfV0NIQVJfVCkgJiYgKFNJWkVPRl9XQ0hBUl9UID09IDQpCi0JY29uc3Qgd2NoYXJfdCB3dGV4dFsyXSA9IHsod2NoYXJfdCkweDEwQUJDRHV9OwotCXNpemVfdCB3dGV4dGxlbiA9IDE7CisgICAgY29uc3Qgd2NoYXJfdCB3dGV4dFsyXSA9IHsod2NoYXJfdCkweDEwQUJDRHV9OworICAgIHNpemVfdCB3dGV4dGxlbiA9IDE7CiAjZWxzZQotCWNvbnN0IHdjaGFyX3Qgd3RleHRbM10gPSB7KHdjaGFyX3QpMHhEQkVBdSwgKHdjaGFyX3QpMHhERkNEdX07Ci0Jc2l6ZV90IHd0ZXh0bGVuID0gMjsKKyAgICBjb25zdCB3Y2hhcl90IHd0ZXh0WzNdID0geyh3Y2hhcl90KTB4REJFQXUsICh3Y2hhcl90KTB4REZDRHV9OworICAgIHNpemVfdCB3dGV4dGxlbiA9IDI7CiAjZW5kaWYKLQlQeU9iamVjdCAqd2lkZSwgKnV0Zjg7CisgICAgUHlPYmplY3QgKndpZGUsICp1dGY4OwogCi0Jd2lkZSA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIod3RleHQsIHd0ZXh0bGVuKTsKLQlpZiAod2lkZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB3aWRlID0gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcih3dGV4dCwgd3RleHRsZW4pOworICAgIGlmICh3aWRlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdXRmOCA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJceGY0XHg4YVx4YWZceDhkIik7Ci0JaWYgKHV0ZjggPT0gTlVMTCkgewotCQlQeV9ERUNSRUYod2lkZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB1dGY4ID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoIlx4ZjRceDhhXHhhZlx4OGQiKTsKKyAgICBpZiAodXRmOCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih3aWRlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKFB5VW5pY29kZV9HRVRfU0laRSh3aWRlKSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUodXRmOCkpIHsKLQkJUHlfREVDUkVGKHdpZGUpOwotCQlQeV9ERUNSRUYodXRmOCk7Ci0JCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF93aWRlY2hhciIsCi0JCQkJIndpZGUgc3RyaW5nIGFuZCB1dGY4IHN0cmluZyBoYXZlIGRpZmZlcmVudCBsZW5ndGgiKTsKLQl9Ci0JaWYgKFB5VW5pY29kZV9Db21wYXJlKHdpZGUsIHV0ZjgpKSB7Ci0JCVB5X0RFQ1JFRih3aWRlKTsKLQkJUHlfREVDUkVGKHV0ZjgpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfd2lkZWNoYXIiLAotCQkJCSJ3aWRlIHN0cmluZyBhbmQgdXRmOCBzdHJpbmcgYXJlIGRpZmZlcmVudHMiKTsKLQl9CisgICAgaWYgKFB5VW5pY29kZV9HRVRfU0laRSh3aWRlKSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUodXRmOCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHdpZGUpOworICAgICAgICBQeV9ERUNSRUYodXRmOCk7CisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF93aWRlY2hhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAid2lkZSBzdHJpbmcgYW5kIHV0Zjggc3RyaW5nIGhhdmUgZGlmZmVyZW50IGxlbmd0aCIpOworICAgIH0KKyAgICBpZiAoUHlVbmljb2RlX0NvbXBhcmUod2lkZSwgdXRmOCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHdpZGUpOworICAgICAgICBQeV9ERUNSRUYodXRmOCk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF93aWRlY2hhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAid2lkZSBzdHJpbmcgYW5kIHV0Zjggc3RyaW5nIGFyZSBkaWZmZXJlbnRzIik7CisgICAgfQogCi0JUHlfREVDUkVGKHdpZGUpOwotCVB5X0RFQ1JFRih1dGY4KTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9ERUNSRUYod2lkZSk7CisgICAgUHlfREVDUkVGKHV0ZjgpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9lbXB0eV9hcmdwYXJzZShQeU9iamVjdCAqc2VsZikKIHsKLQkvKiBUZXN0IHRoYXQgZm9ybWF0cyBjYW4gYmVnaW4gd2l0aCAnfCcuIFNlZSBpc3N1ZSAjNDcyMC4gKi8KLQlQeU9iamVjdCAqdHVwbGUsICpkaWN0ID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7TlVMTH07Ci0JaW50IHJlc3VsdDsKLQl0dXBsZSA9IFB5VHVwbGVfTmV3KDApOwotCWlmICghdHVwbGUpCi0JCXJldHVybiBOVUxMOwotCWlmICgocmVzdWx0ID0gUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgInw6dGVzdF9lbXB0eV9hcmdwYXJzZSIpKSA8IDApCi0JCWdvdG8gZG9uZTsKLQlkaWN0ID0gUHlEaWN0X05ldygpOwotCWlmICghZGljdCkKLQkJZ290byBkb25lOwotCXJlc3VsdCA9IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcyh0dXBsZSwgZGljdCwgInw6dGVzdF9lbXB0eV9hcmdwYXJzZSIsIGt3bGlzdCk7CisgICAgLyogVGVzdCB0aGF0IGZvcm1hdHMgY2FuIGJlZ2luIHdpdGggJ3wnLiBTZWUgaXNzdWUgIzQ3MjAuICovCisgICAgUHlPYmplY3QgKnR1cGxlLCAqZGljdCA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0ge05VTEx9OworICAgIGludCByZXN1bHQ7CisgICAgdHVwbGUgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAoIXR1cGxlKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHJlc3VsdCA9IFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJ8OnRlc3RfZW1wdHlfYXJncGFyc2UiKSkgPCAwKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIWRpY3QpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICByZXN1bHQgPSBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHModHVwbGUsIGRpY3QsICJ8OnRlc3RfZW1wdHlfYXJncGFyc2UiLCBrd2xpc3QpOwogICBkb25lOgotCVB5X0RFQ1JFRih0dXBsZSk7Ci0JUHlfWERFQ1JFRihkaWN0KTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZSB7Ci0JCVB5X1JFVFVSTl9OT05FOwotCX0KKyAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UgeworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb2RlY19pbmNyZW1lbnRhbGVuY29kZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNvbnN0IGNoYXIgKmVuY29kaW5nLCAqZXJyb3JzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp0ZXN0X2luY3JlbWVudGFsZW5jb2RlciIsCi0JCQkgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXIoZW5jb2RpbmcsIGVycm9ycyk7CisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICplcnJvcnMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzOnRlc3RfaW5jcmVtZW50YWxlbmNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyKGVuY29kaW5nLCBlcnJvcnMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29kZWNfaW5jcmVtZW50YWxkZWNvZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljb25zdCBjaGFyICplbmNvZGluZywgKmVycm9ycyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHM6dGVzdF9pbmNyZW1lbnRhbGRlY29kZXIiLAotCQkJICAgICAgJmVuY29kaW5nLCAmZXJyb3JzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyKGVuY29kaW5nLCBlcnJvcnMpOworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAqZXJyb3JzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp0ZXN0X2luY3JlbWVudGFsZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUNvZGVjX0luY3JlbWVudGFsRGVjb2RlcihlbmNvZGluZywgZXJyb3JzKTsKIH0KIAogI2VuZGlmCkBAIC0xMTU3LDQyICsxMTU3LDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9sb25nX251bWJpdHMoUHlPYmplY3QgKnNlbGYpCiB7Ci0Jc3RydWN0IHRyaXBsZSB7Ci0JCWxvbmcgaW5wdXQ7Ci0JCXNpemVfdCBuYml0czsKLQkJaW50IHNpZ247Ci0JfSB0ZXN0Y2FzZXNbXSA9IHt7MCwgMCwgMH0sCi0JCQkgezFMLCAxLCAxfSwKLQkJCSB7LTFMLCAxLCAtMX0sCi0JCQkgezJMLCAyLCAxfSwKLQkJCSB7LTJMLCAyLCAtMX0sCi0JCQkgezNMLCAyLCAxfSwKLQkJCSB7LTNMLCAyLCAtMX0sCi0JCQkgezRMLCAzLCAxfSwKLQkJCSB7LTRMLCAzLCAtMX0sCi0JCQkgezB4N2ZmZkwsIDE1LCAxfSwJLyogb25lIFB5dGhvbiBsb25nIGRpZ2l0ICovCi0JCQkgey0weDdmZmZMLCAxNSwgLTF9LAotCQkJIHsweGZmZmZMLCAxNiwgMX0sCi0JCQkgey0weGZmZmZMLCAxNiwgLTF9LAotCQkJIHsweGZmZmZmZmZMLCAyOCwgMX0sCi0JCQkgey0weGZmZmZmZmZMLCAyOCwgLTF9fTsKLQlpbnQgaTsKKyAgICBzdHJ1Y3QgdHJpcGxlIHsKKyAgICAgICAgbG9uZyBpbnB1dDsKKyAgICAgICAgc2l6ZV90IG5iaXRzOworICAgICAgICBpbnQgc2lnbjsKKyAgICB9IHRlc3RjYXNlc1tdID0ge3swLCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgIHsxTCwgMSwgMX0sCisgICAgICAgICAgICAgICAgICAgICB7LTFMLCAxLCAtMX0sCisgICAgICAgICAgICAgICAgICAgICB7MkwsIDIsIDF9LAorICAgICAgICAgICAgICAgICAgICAgey0yTCwgMiwgLTF9LAorICAgICAgICAgICAgICAgICAgICAgezNMLCAyLCAxfSwKKyAgICAgICAgICAgICAgICAgICAgIHstM0wsIDIsIC0xfSwKKyAgICAgICAgICAgICAgICAgICAgIHs0TCwgMywgMX0sCisgICAgICAgICAgICAgICAgICAgICB7LTRMLCAzLCAtMX0sCisgICAgICAgICAgICAgICAgICAgICB7MHg3ZmZmTCwgMTUsIDF9LCAgICAgICAgICAvKiBvbmUgUHl0aG9uIGxvbmcgZGlnaXQgKi8KKyAgICAgICAgICAgICB7LTB4N2ZmZkwsIDE1LCAtMX0sCisgICAgICAgICAgICAgezB4ZmZmZkwsIDE2LCAxfSwKKyAgICAgICAgICAgICB7LTB4ZmZmZkwsIDE2LCAtMX0sCisgICAgICAgICAgICAgezB4ZmZmZmZmZkwsIDI4LCAxfSwKKyAgICAgICAgICAgICB7LTB4ZmZmZmZmZkwsIDI4LCAtMX19OworICAgIGludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZih0ZXN0Y2FzZXMpIC8gc2l6ZW9mKHN0cnVjdCB0cmlwbGUpOyArK2kpIHsKLQkJUHlPYmplY3QgKnBsb25nID0gUHlMb25nX0Zyb21Mb25nKHRlc3RjYXNlc1tpXS5pbnB1dCk7Ci0JCXNpemVfdCBuYml0cyA9IF9QeUxvbmdfTnVtQml0cyhwbG9uZyk7Ci0JCWludCBzaWduID0gX1B5TG9uZ19TaWduKHBsb25nKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRlc3RjYXNlcykgLyBzaXplb2Yoc3RydWN0IHRyaXBsZSk7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqcGxvbmcgPSBQeUxvbmdfRnJvbUxvbmcodGVzdGNhc2VzW2ldLmlucHV0KTsKKyAgICAgICAgc2l6ZV90IG5iaXRzID0gX1B5TG9uZ19OdW1CaXRzKHBsb25nKTsKKyAgICAgICAgaW50IHNpZ24gPSBfUHlMb25nX1NpZ24ocGxvbmcpOwogCi0JCVB5X0RFQ1JFRihwbG9uZyk7Ci0JCWlmIChuYml0cyAhPSB0ZXN0Y2FzZXNbaV0ubmJpdHMpCi0JCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19udW1iaXRzIiwKLQkJCQkJIndyb25nIHJlc3VsdCBmb3IgX1B5TG9uZ19OdW1CaXRzIik7Ci0JCWlmIChzaWduICE9IHRlc3RjYXNlc1tpXS5zaWduKQotCQkJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfbnVtYml0cyIsCi0JCQkJCSJ3cm9uZyByZXN1bHQgZm9yIF9QeUxvbmdfU2lnbiIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X0RFQ1JFRihwbG9uZyk7CisgICAgICAgIGlmIChuYml0cyAhPSB0ZXN0Y2FzZXNbaV0ubmJpdHMpCisgICAgICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19udW1iaXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgcmVzdWx0IGZvciBfUHlMb25nX051bUJpdHMiKTsKKyAgICAgICAgaWYgKHNpZ24gIT0gdGVzdGNhc2VzW2ldLnNpZ24pCisgICAgICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19udW1iaXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgcmVzdWx0IGZvciBfUHlMb25nX1NpZ24iKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBFeGFtcGxlIHBhc3NpbmcgTlVMTHMgdG8gUHlPYmplY3RfU3RyKE5VTEwpIGFuZCBQeU9iamVjdF9Vbmljb2RlKE5VTEwpLiAqLwpAQCAtMTIwMCw0MiArMTIwMCw0MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfbnVsbF9zdHJpbmdzKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpvMSA9IFB5T2JqZWN0X1N0cihOVUxMKSwgKm8yID0gUHlPYmplY3RfVW5pY29kZShOVUxMKTsKLQlQeU9iamVjdCAqdHVwbGUgPSBQeVR1cGxlX1BhY2soMiwgbzEsIG8yKTsKLQlQeV9YREVDUkVGKG8xKTsKLQlQeV9YREVDUkVGKG8yKTsKLQlyZXR1cm4gdHVwbGU7CisgICAgUHlPYmplY3QgKm8xID0gUHlPYmplY3RfU3RyKE5VTEwpLCAqbzIgPSBQeU9iamVjdF9Vbmljb2RlKE5VTEwpOworICAgIFB5T2JqZWN0ICp0dXBsZSA9IFB5VHVwbGVfUGFjaygyLCBvMSwgbzIpOworICAgIFB5X1hERUNSRUYobzEpOworICAgIFB5X1hERUNSRUYobzIpOworICAgIHJldHVybiB0dXBsZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhaXNlX2V4Y2VwdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmV4YzsKLQlQeU9iamVjdCAqZXhjX2FyZ3MsICp2OwotCWludCBudW1fYXJncywgaTsKKyAgICBQeU9iamVjdCAqZXhjOworICAgIFB5T2JqZWN0ICpleGNfYXJncywgKnY7CisgICAgaW50IG51bV9hcmdzLCBpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpyYWlzZV9leGNlcHRpb24iLAotCQkJICAgICAgJmV4YywgJm51bV9hcmdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGV4YykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImFuIGV4Y2VwdGlvbiBjbGFzcyBpcyByZXF1aXJlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpyYWlzZV9leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhjLCAmbnVtX2FyZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2soZXhjKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiYW4gZXhjZXB0aW9uIGNsYXNzIGlzIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWV4Y19hcmdzID0gUHlUdXBsZV9OZXcobnVtX2FyZ3MpOwotCWlmIChleGNfYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgewotCQl2ID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihleGNfYXJncyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKGV4Y19hcmdzLCBpLCB2KTsKLQl9Ci0JUHlFcnJfU2V0T2JqZWN0KGV4YywgZXhjX2FyZ3MpOwotCVB5X0RFQ1JFRihleGNfYXJncyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgZXhjX2FyZ3MgPSBQeVR1cGxlX05ldyhudW1fYXJncyk7CisgICAgaWYgKGV4Y19hcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGV4Y19hcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oZXhjX2FyZ3MsIGksIHYpOworICAgIH0KKyAgICBQeUVycl9TZXRPYmplY3QoZXhjLCBleGNfYXJncyk7CisgICAgUHlfREVDUkVGKGV4Y19hcmdzKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC0xMjQzLDIzICsxMjQzLDIzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X2RhdGV0aW1lX2NhcGkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0JaWYgKFB5RGF0ZVRpbWVBUEkpIHsKLQkJaWYgKHRlc3RfcnVuX2NvdW50ZXIpIHsKLQkJCS8qIFByb2JhYmx5IHJlZ3J0ZXN0LnB5IC1SICovCi0JCQlQeV9SRVRVUk5fTk9ORTsKLQkJfQotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Bc3NlcnRpb25FcnJvciwKLQkJCQkJIlB5RGF0ZVRpbWVfQ0FQSSBzb21laG93IGluaXRpYWxpemVkIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQl0ZXN0X3J1bl9jb3VudGVyKys7Ci0JUHlEYXRlVGltZV9JTVBPUlQ7Ci0gICAgICAgIGlmIChQeURhdGVUaW1lQVBJKQotCQlQeV9SRVRVUk5fTk9ORTsKLQllbHNlCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeURhdGVUaW1lQVBJKSB7CisgICAgICAgIGlmICh0ZXN0X3J1bl9jb3VudGVyKSB7CisgICAgICAgICAgICAvKiBQcm9iYWJseSByZWdydGVzdC5weSAtUiAqLworICAgICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXNzZXJ0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB5RGF0ZVRpbWVfQ0FQSSBzb21laG93IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICB0ZXN0X3J1bl9jb3VudGVyKys7CisgICAgUHlEYXRlVGltZV9JTVBPUlQ7CisgICAgaWYgKFB5RGF0ZVRpbWVBUEkpCisgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtMTI3NywxNCArMTI3NywxNCBAQAogc3RhdGljIGludAogX21ha2VfY2FsbCh2b2lkICpjYWxsYWJsZSkKIHsKLQlQeU9iamVjdCAqcmM7Ci0JaW50IHN1Y2Nlc3M7Ci0JUHlHSUxTdGF0ZV9TVEFURSBzID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKLQlyYyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKiljYWxsYWJsZSwgIiIpOwotCXN1Y2Nlc3MgPSAocmMgIT0gTlVMTCk7Ci0JUHlfWERFQ1JFRihyYyk7Ci0JUHlHSUxTdGF0ZV9SZWxlYXNlKHMpOwotCXJldHVybiBzdWNjZXNzOworICAgIFB5T2JqZWN0ICpyYzsKKyAgICBpbnQgc3VjY2VzczsKKyAgICBQeUdJTFN0YXRlX1NUQVRFIHMgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworICAgIHJjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKWNhbGxhYmxlLCAiIik7CisgICAgc3VjY2VzcyA9IChyYyAhPSBOVUxMKTsKKyAgICBQeV9YREVDUkVGKHJjKTsKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2Uocyk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIC8qIFNhbWUgdGhpbmcsIGJ1dCByZWxlYXNlcyBgdGhyZWFkX2RvbmVgIHdoZW4gaXQgcmV0dXJucy4gIFRoaXMgdmFyaWFudApAQCAtMTI5Myw3MCArMTI5Myw3MCBAQAogc3RhdGljIHZvaWQKIF9tYWtlX2NhbGxfZnJvbV90aHJlYWQodm9pZCAqY2FsbGFibGUpCiB7Ci0JX21ha2VfY2FsbChjYWxsYWJsZSk7Ci0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRocmVhZF9kb25lKTsKKyAgICBfbWFrZV9jYWxsKGNhbGxhYmxlKTsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2sodGhyZWFkX2RvbmUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF90aHJlYWRfc3RhdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpmbjsKLQlpbnQgc3VjY2VzcyA9IDE7CisgICAgUHlPYmplY3QgKmZuOworICAgIGludCBzdWNjZXNzID0gMTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzp0ZXN0X3RocmVhZF9zdGF0ZSIsICZmbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzp0ZXN0X3RocmVhZF9zdGF0ZSIsICZmbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZuKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJyVzJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlIiwKLQkJCWZuLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmbikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiclcycgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZSIsCisgICAgICAgICAgICBmbi0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEVuc3VyZSBQeXRob24gaXMgc2V0IHVwIGZvciB0aHJlYWRpbmcgKi8KLQlQeUV2YWxfSW5pdFRocmVhZHMoKTsKLQl0aHJlYWRfZG9uZSA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKLQlpZiAodGhyZWFkX2RvbmUgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRocmVhZF9kb25lLCAxKTsKKyAgICAvKiBFbnN1cmUgUHl0aG9uIGlzIHNldCB1cCBmb3IgdGhyZWFkaW5nICovCisgICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7CisgICAgdGhyZWFkX2RvbmUgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgaWYgKHRocmVhZF9kb25lID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayh0aHJlYWRfZG9uZSwgMSk7CiAKLQkvKiBTdGFydCBhIG5ldyB0aHJlYWQgd2l0aCBvdXIgY2FsbGJhY2suICovCi0JUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChfbWFrZV9jYWxsX2Zyb21fdGhyZWFkLCBmbik7Ci0JLyogTWFrZSB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgdGhyZWFkIGxvY2sgaGVsZCBieSB0aGlzIHRocmVhZCAqLwotCXN1Y2Nlc3MgJj0gX21ha2VfY2FsbChmbik7Ci0JLyogRG8gaXQgYWxsIGFnYWluLCBidXQgdGhpcyB0aW1lIHdpdGggdGhlIHRocmVhZC1sb2NrIHJlbGVhc2VkICovCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXN1Y2Nlc3MgJj0gX21ha2VfY2FsbChmbik7Ci0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRocmVhZF9kb25lLCAxKTsgIC8qIHdhaXQgZm9yIHRocmVhZCB0byBmaW5pc2ggKi8KLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIC8qIFN0YXJ0IGEgbmV3IHRocmVhZCB3aXRoIG91ciBjYWxsYmFjay4gKi8KKyAgICBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKF9tYWtlX2NhbGxfZnJvbV90aHJlYWQsIGZuKTsKKyAgICAvKiBNYWtlIHRoZSBjYWxsYmFjayB3aXRoIHRoZSB0aHJlYWQgbG9jayBoZWxkIGJ5IHRoaXMgdGhyZWFkICovCisgICAgc3VjY2VzcyAmPSBfbWFrZV9jYWxsKGZuKTsKKyAgICAvKiBEbyBpdCBhbGwgYWdhaW4sIGJ1dCB0aGlzIHRpbWUgd2l0aCB0aGUgdGhyZWFkLWxvY2sgcmVsZWFzZWQgKi8KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgc3VjY2VzcyAmPSBfbWFrZV9jYWxsKGZuKTsKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2sodGhyZWFkX2RvbmUsIDEpOyAgLyogd2FpdCBmb3IgdGhyZWFkIHRvIGZpbmlzaCAqLworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQkvKiBBbmQgb25jZSBtb3JlIHdpdGggYW5kIHdpdGhvdXQgYSB0aHJlYWQKLQkgICBYWFggLSBzaG91bGQgdXNlIGEgbG9jayBhbmQgd29yayBvdXQgZXhhY3RseSB3aGF0IHdlIGFyZSB0cnlpbmcKLQkgICB0byB0ZXN0IDx3aW5rPgotCSovCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCVB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoX21ha2VfY2FsbF9mcm9tX3RocmVhZCwgZm4pOwotCXN1Y2Nlc3MgJj0gX21ha2VfY2FsbChmbik7Ci0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRocmVhZF9kb25lLCAxKTsgIC8qIHdhaXQgZm9yIHRocmVhZCB0byBmaW5pc2ggKi8KLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIC8qIEFuZCBvbmNlIG1vcmUgd2l0aCBhbmQgd2l0aG91dCBhIHRocmVhZAorICAgICAgIFhYWCAtIHNob3VsZCB1c2UgYSBsb2NrIGFuZCB3b3JrIG91dCBleGFjdGx5IHdoYXQgd2UgYXJlIHRyeWluZworICAgICAgIHRvIHRlc3QgPHdpbms+CisgICAgKi8KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChfbWFrZV9jYWxsX2Zyb21fdGhyZWFkLCBmbik7CisgICAgc3VjY2VzcyAmPSBfbWFrZV9jYWxsKGZuKTsKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2sodGhyZWFkX2RvbmUsIDEpOyAgLyogd2FpdCBmb3IgdGhyZWFkIHRvIGZpbmlzaCAqLworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQkvKiBSZWxlYXNlIGxvY2sgd2UgYWNxdWlyZWQgYWJvdmUuICBUaGlzIGlzIHJlcXVpcmVkIG9uIEhQLVVYLiAqLwotCVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0aHJlYWRfZG9uZSk7CisgICAgLyogUmVsZWFzZSBsb2NrIHdlIGFjcXVpcmVkIGFib3ZlLiAgVGhpcyBpcyByZXF1aXJlZCBvbiBIUC1VWC4gKi8KKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2sodGhyZWFkX2RvbmUpOwogCi0JUHlUaHJlYWRfZnJlZV9sb2NrKHRocmVhZF9kb25lKTsKLQlpZiAoIXN1Y2Nlc3MpCi0JCXJldHVybiBOVUxMOwotCVB5X1JFVFVSTl9OT05FOworICAgIFB5VGhyZWFkX2ZyZWVfbG9jayh0aHJlYWRfZG9uZSk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogLyogdGVzdCBQeV9BZGRQZW5kaW5nQ2FsbHMgdXNpbmcgdGhyZWFkcyAqLwogc3RhdGljIGludCBfcGVuZGluZ19jYWxsYmFjayh2b2lkICphcmcpCiB7Ci0JLyogd2UgYXNzdW1lIHRoZSBhcmd1bWVudCBpcyBjYWxsYWJsZSBvYmplY3QgdG8gd2hpY2ggd2Ugb3duIGEgcmVmZXJlbmNlICovCi0JUHlPYmplY3QgKmNhbGxhYmxlID0gKFB5T2JqZWN0ICopYXJnOwotCVB5T2JqZWN0ICpyID0gUHlPYmplY3RfQ2FsbE9iamVjdChjYWxsYWJsZSwgTlVMTCk7Ci0JUHlfREVDUkVGKGNhbGxhYmxlKTsKLQlQeV9YREVDUkVGKHIpOwotCXJldHVybiByICE9IE5VTEwgPyAwIDogLTE7CisgICAgLyogd2UgYXNzdW1lIHRoZSBhcmd1bWVudCBpcyBjYWxsYWJsZSBvYmplY3QgdG8gd2hpY2ggd2Ugb3duIGEgcmVmZXJlbmNlICovCisgICAgUHlPYmplY3QgKmNhbGxhYmxlID0gKFB5T2JqZWN0ICopYXJnOworICAgIFB5T2JqZWN0ICpyID0gUHlPYmplY3RfQ2FsbE9iamVjdChjYWxsYWJsZSwgTlVMTCk7CisgICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKKyAgICBQeV9YREVDUkVGKHIpOworICAgIHJldHVybiByICE9IE5VTEwgPyAwIDogLTE7CiB9CiAKIC8qIFRoZSBmb2xsb3dpbmcgcmVxdWVzdHMgbiBjYWxsYmFja3MgdG8gX3BlbmRpbmdfY2FsbGJhY2suICBJdCBjYW4gYmUKQEAgLTEzNjQsMjUgKzEzNjQsMjUgQEAKICAqLwogUHlPYmplY3QgKnBlbmRpbmdfdGhyZWFkZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlQeU9iamVjdCAqY2FsbGFibGU7Ci0JaW50IHI7Ci0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJnLCAiTyIsICZjYWxsYWJsZSkgPT0gMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKmNhbGxhYmxlOworICAgIGludCByOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZywgIk8iLCAmY2FsbGFibGUpID09IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogY3JlYXRlIHRoZSByZWZlcmVuY2UgZm9yIHRoZSBjYWxsYmFja3doaWxlIHdlIGhvbGQgdGhlIGxvY2sgKi8KLQlQeV9JTkNSRUYoY2FsbGFibGUpOworICAgIC8qIGNyZWF0ZSB0aGUgcmVmZXJlbmNlIGZvciB0aGUgY2FsbGJhY2t3aGlsZSB3ZSBob2xkIHRoZSBsb2NrICovCisgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyID0gUHlfQWRkUGVuZGluZ0NhbGwoJl9wZW5kaW5nX2NhbGxiYWNrLCBjYWxsYWJsZSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgciA9IFB5X0FkZFBlbmRpbmdDYWxsKCZfcGVuZGluZ19jYWxsYmFjaywgY2FsbGFibGUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAocjwwKSB7Ci0JCVB5X0RFQ1JFRihjYWxsYWJsZSk7IC8qIHVuc3VjY2Vzc2Z1bCBhZGQsIGRlc3Ryb3kgdGhlIGV4dHJhIHJlZmVyZW5jZSAqLwotCQlQeV9JTkNSRUYoUHlfRmFsc2UpOwotCQlyZXR1cm4gUHlfRmFsc2U7Ci0JfQotCVB5X0lOQ1JFRihQeV9UcnVlKTsKLQlyZXR1cm4gUHlfVHJ1ZTsKKyAgICBpZiAocjwwKSB7CisgICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7IC8qIHVuc3VjY2Vzc2Z1bCBhZGQsIGRlc3Ryb3kgdGhlIGV4dHJhIHJlZmVyZW5jZSAqLworICAgICAgICBQeV9JTkNSRUYoUHlfRmFsc2UpOworICAgICAgICByZXR1cm4gUHlfRmFsc2U7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9UcnVlKTsKKyAgICByZXR1cm4gUHlfVHJ1ZTsKIH0KICNlbmRpZgogCkBAIC0xMzkwLDQwICsxMzkwLDQwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JY2hhciAqbXNnOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqbXNnOwogCi0jZGVmaW5lIENIRUNLXzFfRk9STUFUKEZPUk1BVCwgVFlQRSkgCQkJXAotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoRk9STUFULCAoVFlQRSkxKTsJXAotCWlmIChyZXN1bHQgPT0gTlVMTCkJCQkJXAotCQlyZXR1cm4gTlVMTDsJCQkJXAotCWlmIChzdHJjbXAoUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KSwgIjEiKSkgewlcCi0JCW1zZyA9IEZPUk1BVCAiIGZhaWxlZCBhdCAxIjsJCVwKLQkJZ290byBGYWlsOwkJCQlcCi0JfQkJCQkJCVwKLQlQeV9ERUNSRUYocmVzdWx0KQorI2RlZmluZSBDSEVDS18xX0ZPUk1BVChGT1JNQVQsIFRZUEUpICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdChGT1JNQVQsIChUWVBFKTEpOyAgICAgIFwKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHN0cmNtcChQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpLCAiMSIpKSB7ICAgICAgIFwKKyAgICAgICAgbXNnID0gRk9STUFUICIgZmFpbGVkIGF0IDEiOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIEZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQeV9ERUNSRUYocmVzdWx0KQogCi0JQ0hFQ0tfMV9GT1JNQVQoIiVkIiwgaW50KTsKLQlDSEVDS18xX0ZPUk1BVCgiJWxkIiwgbG9uZyk7Ci0JLyogVGhlIHogd2lkdGggbW9kaWZpZXIgd2FzIGFkZGVkIGluIFB5dGhvbiAyLjUuICovCi0JQ0hFQ0tfMV9GT1JNQVQoIiV6ZCIsIFB5X3NzaXplX3QpOworICAgIENIRUNLXzFfRk9STUFUKCIlZCIsIGludCk7CisgICAgQ0hFQ0tfMV9GT1JNQVQoIiVsZCIsIGxvbmcpOworICAgIC8qIFRoZSB6IHdpZHRoIG1vZGlmaWVyIHdhcyBhZGRlZCBpbiBQeXRob24gMi41LiAqLworICAgIENIRUNLXzFfRk9STUFUKCIlemQiLCBQeV9zc2l6ZV90KTsKIAotCS8qIFRoZSB1IHR5cGUgY29kZSB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuNS4gKi8KLQlDSEVDS18xX0ZPUk1BVCgiJXUiLCB1bnNpZ25lZCBpbnQpOwotCUNIRUNLXzFfRk9STUFUKCIlbHUiLCB1bnNpZ25lZCBsb25nKTsKLQlDSEVDS18xX0ZPUk1BVCgiJXp1Iiwgc2l6ZV90KTsKKyAgICAvKiBUaGUgdSB0eXBlIGNvZGUgd2FzIGFkZGVkIGluIFB5dGhvbiAyLjUuICovCisgICAgQ0hFQ0tfMV9GT1JNQVQoIiV1IiwgdW5zaWduZWQgaW50KTsKKyAgICBDSEVDS18xX0ZPUk1BVCgiJWx1IiwgdW5zaWduZWQgbG9uZyk7CisgICAgQ0hFQ0tfMV9GT1JNQVQoIiV6dSIsIHNpemVfdCk7CiAKLQkvKiAiJWxsZCIgYW5kICIlbGx1IiBzdXBwb3J0IGFkZGVkIGluIFB5dGhvbiAyLjcuICovCisgICAgLyogIiVsbGQiIGFuZCAiJWxsdSIgc3VwcG9ydCBhZGRlZCBpbiBQeXRob24gMi43LiAqLwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JQ0hFQ0tfMV9GT1JNQVQoIiVsbHUiLCB1bnNpZ25lZCBQWV9MT05HX0xPTkcpOwotCUNIRUNLXzFfRk9STUFUKCIlbGxkIiwgUFlfTE9OR19MT05HKTsKKyAgICBDSEVDS18xX0ZPUk1BVCgiJWxsdSIsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyk7CisgICAgQ0hFQ0tfMV9GT1JNQVQoIiVsbGQiLCBQWV9MT05HX0xPTkcpOwogI2VuZGlmCiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIAogIEZhaWw6Ci0gCVB5X1hERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfc3RyaW5nX2Zyb21fZm9ybWF0IiwgbXNnKTsKKyAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCIsIG1zZyk7CiAKICN1bmRlZiBDSEVDS18xX0ZPUk1BVAogfQpAQCAtMTQzOSwxNDMgKzE0MzksMTQzIEBACiAKIHN0YXRpYyB2b2lkCiBjYXBzdWxlX2Rlc3RydWN0b3IoUHlPYmplY3QgKm8pIHsKLQljYXBzdWxlX2Rlc3RydWN0b3JfY2FsbF9jb3VudCsrOwotCWlmIChQeUNhcHN1bGVfR2V0Q29udGV4dChvKSAhPSBjYXBzdWxlX2NvbnRleHQpIHsKLQkJY2Fwc3VsZV9lcnJvciA9ICJjb250ZXh0IGRpZCBub3QgbWF0Y2ggaW4gZGVzdHJ1Y3RvciEiOwotCX0gZWxzZSBpZiAoUHlDYXBzdWxlX0dldERlc3RydWN0b3IobykgIT0gY2Fwc3VsZV9kZXN0cnVjdG9yKSB7Ci0JCWNhcHN1bGVfZXJyb3IgPSAiZGVzdHJ1Y3RvciBkaWQgbm90IG1hdGNoIGluIGRlc3RydWN0b3IhICAod29haCEpIjsKLQl9IGVsc2UgaWYgKFB5Q2Fwc3VsZV9HZXROYW1lKG8pICE9IGNhcHN1bGVfbmFtZSkgewotCQljYXBzdWxlX2Vycm9yID0gIm5hbWUgZGlkIG5vdCBtYXRjaCBpbiBkZXN0cnVjdG9yISI7Ci0JfSBlbHNlIGlmIChQeUNhcHN1bGVfR2V0UG9pbnRlcihvLCBjYXBzdWxlX25hbWUpICE9IGNhcHN1bGVfcG9pbnRlcikgewotCQljYXBzdWxlX2Vycm9yID0gInBvaW50ZXIgZGlkIG5vdCBtYXRjaCBpbiBkZXN0cnVjdG9yISI7Ci0JfQorICAgIGNhcHN1bGVfZGVzdHJ1Y3Rvcl9jYWxsX2NvdW50Kys7CisgICAgaWYgKFB5Q2Fwc3VsZV9HZXRDb250ZXh0KG8pICE9IGNhcHN1bGVfY29udGV4dCkgeworICAgICAgICBjYXBzdWxlX2Vycm9yID0gImNvbnRleHQgZGlkIG5vdCBtYXRjaCBpbiBkZXN0cnVjdG9yISI7CisgICAgfSBlbHNlIGlmIChQeUNhcHN1bGVfR2V0RGVzdHJ1Y3RvcihvKSAhPSBjYXBzdWxlX2Rlc3RydWN0b3IpIHsKKyAgICAgICAgY2Fwc3VsZV9lcnJvciA9ICJkZXN0cnVjdG9yIGRpZCBub3QgbWF0Y2ggaW4gZGVzdHJ1Y3RvciEgICh3b2FoISkiOworICAgIH0gZWxzZSBpZiAoUHlDYXBzdWxlX0dldE5hbWUobykgIT0gY2Fwc3VsZV9uYW1lKSB7CisgICAgICAgIGNhcHN1bGVfZXJyb3IgPSAibmFtZSBkaWQgbm90IG1hdGNoIGluIGRlc3RydWN0b3IhIjsKKyAgICB9IGVsc2UgaWYgKFB5Q2Fwc3VsZV9HZXRQb2ludGVyKG8sIGNhcHN1bGVfbmFtZSkgIT0gY2Fwc3VsZV9wb2ludGVyKSB7CisgICAgICAgIGNhcHN1bGVfZXJyb3IgPSAicG9pbnRlciBkaWQgbm90IG1hdGNoIGluIGRlc3RydWN0b3IhIjsKKyAgICB9CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQljaGFyICpuYW1lOwotCWNoYXIgKm1vZHVsZTsKLQljaGFyICphdHRyaWJ1dGU7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICptb2R1bGU7CisgICAgY2hhciAqYXR0cmlidXRlOwogfSBrbm93bl9jYXBzdWxlOwogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9jYXBzdWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb2JqZWN0OwotCWNvbnN0IGNoYXIgKmVycm9yID0gTlVMTDsKLQl2b2lkICpwb2ludGVyOwotCXZvaWQgKnBvaW50ZXIyOwotCWtub3duX2NhcHN1bGUga25vd25fY2Fwc3VsZXNbXSA9IHsKLQkJI2RlZmluZSBLTk9XTl9DQVBTVUxFKG1vZHVsZSwgbmFtZSkJeyBtb2R1bGUgIi4iIG5hbWUsIG1vZHVsZSwgbmFtZSB9Ci0JCUtOT1dOX0NBUFNVTEUoIl9zb2NrZXQiLCAiQ0FQSSIpLAotCQlLTk9XTl9DQVBTVUxFKCJfY3Vyc2VzIiwgIl9DX0FQSSIpLAotCQlLTk9XTl9DQVBTVUxFKCJkYXRldGltZSIsICJkYXRldGltZV9DQVBJIiksCi0JCXsgTlVMTCwgTlVMTCB9LAotCX07Ci0Ja25vd25fY2Fwc3VsZSAqa25vd24gPSAma25vd25fY2Fwc3VsZXNbMF07CisgICAgUHlPYmplY3QgKm9iamVjdDsKKyAgICBjb25zdCBjaGFyICplcnJvciA9IE5VTEw7CisgICAgdm9pZCAqcG9pbnRlcjsKKyAgICB2b2lkICpwb2ludGVyMjsKKyAgICBrbm93bl9jYXBzdWxlIGtub3duX2NhcHN1bGVzW10gPSB7CisgICAgICAgICNkZWZpbmUgS05PV05fQ0FQU1VMRShtb2R1bGUsIG5hbWUpICAgICAgICAgICAgIHsgbW9kdWxlICIuIiBuYW1lLCBtb2R1bGUsIG5hbWUgfQorICAgICAgICBLTk9XTl9DQVBTVUxFKCJfc29ja2V0IiwgIkNBUEkiKSwKKyAgICAgICAgS05PV05fQ0FQU1VMRSgiX2N1cnNlcyIsICJfQ19BUEkiKSwKKyAgICAgICAgS05PV05fQ0FQU1VMRSgiZGF0ZXRpbWUiLCAiZGF0ZXRpbWVfQ0FQSSIpLAorICAgICAgICB7IE5VTEwsIE5VTEwgfSwKKyAgICB9OworICAgIGtub3duX2NhcHN1bGUgKmtub3duID0gJmtub3duX2NhcHN1bGVzWzBdOwogCiAjZGVmaW5lIEZBSUwoeCkgeyBlcnJvciA9ICh4KTsgZ290byBleGl0OyB9CiAKICNkZWZpbmUgQ0hFQ0tfREVTVFJVQ1RPUiBcCi0JaWYgKGNhcHN1bGVfZXJyb3IpIHsgXAotCQlGQUlMKGNhcHN1bGVfZXJyb3IpOyBcCi0JfSBcCi0JZWxzZSBpZiAoIWNhcHN1bGVfZGVzdHJ1Y3Rvcl9jYWxsX2NvdW50KSB7CVwKLQkJRkFJTCgiZGVzdHJ1Y3RvciBub3QgY2FsbGVkISIpOyBcCi0JfSBcCi0JY2Fwc3VsZV9kZXN0cnVjdG9yX2NhbGxfY291bnQgPSAwOyBcCisgICAgaWYgKGNhcHN1bGVfZXJyb3IpIHsgXAorICAgICAgICBGQUlMKGNhcHN1bGVfZXJyb3IpOyBcCisgICAgfSBcCisgICAgZWxzZSBpZiAoIWNhcHN1bGVfZGVzdHJ1Y3Rvcl9jYWxsX2NvdW50KSB7ICAgICAgICAgIFwKKyAgICAgICAgRkFJTCgiZGVzdHJ1Y3RvciBub3QgY2FsbGVkISIpOyBcCisgICAgfSBcCisgICAgY2Fwc3VsZV9kZXN0cnVjdG9yX2NhbGxfY291bnQgPSAwOyBcCiAKLQlvYmplY3QgPSBQeUNhcHN1bGVfTmV3KGNhcHN1bGVfcG9pbnRlciwgY2Fwc3VsZV9uYW1lLCBjYXBzdWxlX2Rlc3RydWN0b3IpOwotCVB5Q2Fwc3VsZV9TZXRDb250ZXh0KG9iamVjdCwgY2Fwc3VsZV9jb250ZXh0KTsKLQljYXBzdWxlX2Rlc3RydWN0b3Iob2JqZWN0KTsKLQlDSEVDS19ERVNUUlVDVE9SOwotCVB5X0RFQ1JFRihvYmplY3QpOwotCUNIRUNLX0RFU1RSVUNUT1I7CisgICAgb2JqZWN0ID0gUHlDYXBzdWxlX05ldyhjYXBzdWxlX3BvaW50ZXIsIGNhcHN1bGVfbmFtZSwgY2Fwc3VsZV9kZXN0cnVjdG9yKTsKKyAgICBQeUNhcHN1bGVfU2V0Q29udGV4dChvYmplY3QsIGNhcHN1bGVfY29udGV4dCk7CisgICAgY2Fwc3VsZV9kZXN0cnVjdG9yKG9iamVjdCk7CisgICAgQ0hFQ0tfREVTVFJVQ1RPUjsKKyAgICBQeV9ERUNSRUYob2JqZWN0KTsKKyAgICBDSEVDS19ERVNUUlVDVE9SOwogCi0Jb2JqZWN0ID0gUHlDYXBzdWxlX05ldyhrbm93biwgImlnbm9yZWQiLCBOVUxMKTsKLQlQeUNhcHN1bGVfU2V0UG9pbnRlcihvYmplY3QsIGNhcHN1bGVfcG9pbnRlcik7Ci0JUHlDYXBzdWxlX1NldE5hbWUob2JqZWN0LCBjYXBzdWxlX25hbWUpOwotCVB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yKG9iamVjdCwgY2Fwc3VsZV9kZXN0cnVjdG9yKTsKLQlQeUNhcHN1bGVfU2V0Q29udGV4dChvYmplY3QsIGNhcHN1bGVfY29udGV4dCk7Ci0JY2Fwc3VsZV9kZXN0cnVjdG9yKG9iamVjdCk7Ci0JQ0hFQ0tfREVTVFJVQ1RPUjsKLQkvKiBpbnRlbnRpb25hbGx5IGFjY2VzcyB1c2luZyB0aGUgd3JvbmcgbmFtZSAqLwotCXBvaW50ZXIyID0gUHlDYXBzdWxlX0dldFBvaW50ZXIob2JqZWN0LCAidGhlIHdyb25nIG5hbWUiKTsKLQlpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKLQkJRkFJTCgiUHlDYXBzdWxlX0dldFBvaW50ZXIgc2hvdWxkIGhhdmUgZmFpbGVkIGJ1dCBkaWQgbm90ISIpOwotCX0KLQlQeUVycl9DbGVhcigpOwotCWlmIChwb2ludGVyMikgewotCQlpZiAocG9pbnRlcjIgPT0gY2Fwc3VsZV9wb2ludGVyKSB7Ci0JCQlGQUlMKCJQeUNhcHN1bGVfR2V0UG9pbnRlciBzaG91bGQgbm90IGhhdmUiCi0JCQkJICIgcmV0dXJuZWQgdGhlIGludGVybmFsIHBvaW50ZXIhIik7Ci0JCX0gZWxzZSB7Ci0JCQlGQUlMKCJQeUNhcHN1bGVfR2V0UG9pbnRlciBzaG91bGQgaGF2ZSAiCi0JCQkJICJyZXR1cm5lZCBOVUxMIHBvaW50ZXIgYnV0IGRpZCBub3QhIik7Ci0JCX0KLQl9Ci0JUHlDYXBzdWxlX1NldERlc3RydWN0b3Iob2JqZWN0LCBOVUxMKTsKLQlQeV9ERUNSRUYob2JqZWN0KTsKLQlpZiAoY2Fwc3VsZV9kZXN0cnVjdG9yX2NhbGxfY291bnQpIHsKLQkJRkFJTCgiZGVzdHJ1Y3RvciBjYWxsZWQgd2hlbiBpdCBzaG91bGQgbm90IGhhdmUgYmVlbiEiKTsKLQl9CisgICAgb2JqZWN0ID0gUHlDYXBzdWxlX05ldyhrbm93biwgImlnbm9yZWQiLCBOVUxMKTsKKyAgICBQeUNhcHN1bGVfU2V0UG9pbnRlcihvYmplY3QsIGNhcHN1bGVfcG9pbnRlcik7CisgICAgUHlDYXBzdWxlX1NldE5hbWUob2JqZWN0LCBjYXBzdWxlX25hbWUpOworICAgIFB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yKG9iamVjdCwgY2Fwc3VsZV9kZXN0cnVjdG9yKTsKKyAgICBQeUNhcHN1bGVfU2V0Q29udGV4dChvYmplY3QsIGNhcHN1bGVfY29udGV4dCk7CisgICAgY2Fwc3VsZV9kZXN0cnVjdG9yKG9iamVjdCk7CisgICAgQ0hFQ0tfREVTVFJVQ1RPUjsKKyAgICAvKiBpbnRlbnRpb25hbGx5IGFjY2VzcyB1c2luZyB0aGUgd3JvbmcgbmFtZSAqLworICAgIHBvaW50ZXIyID0gUHlDYXBzdWxlX0dldFBvaW50ZXIob2JqZWN0LCAidGhlIHdyb25nIG5hbWUiKTsKKyAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgRkFJTCgiUHlDYXBzdWxlX0dldFBvaW50ZXIgc2hvdWxkIGhhdmUgZmFpbGVkIGJ1dCBkaWQgbm90ISIpOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIGlmIChwb2ludGVyMikgeworICAgICAgICBpZiAocG9pbnRlcjIgPT0gY2Fwc3VsZV9wb2ludGVyKSB7CisgICAgICAgICAgICBGQUlMKCJQeUNhcHN1bGVfR2V0UG9pbnRlciBzaG91bGQgbm90IGhhdmUiCisgICAgICAgICAgICAgICAgICAgICAiIHJldHVybmVkIHRoZSBpbnRlcm5hbCBwb2ludGVyISIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRkFJTCgiUHlDYXBzdWxlX0dldFBvaW50ZXIgc2hvdWxkIGhhdmUgIgorICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIE5VTEwgcG9pbnRlciBidXQgZGlkIG5vdCEiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeUNhcHN1bGVfU2V0RGVzdHJ1Y3RvcihvYmplY3QsIE5VTEwpOworICAgIFB5X0RFQ1JFRihvYmplY3QpOworICAgIGlmIChjYXBzdWxlX2Rlc3RydWN0b3JfY2FsbF9jb3VudCkgeworICAgICAgICBGQUlMKCJkZXN0cnVjdG9yIGNhbGxlZCB3aGVuIGl0IHNob3VsZCBub3QgaGF2ZSBiZWVuISIpOworICAgIH0KIAotCWZvciAoa25vd24gPSAma25vd25fY2Fwc3VsZXNbMF07IGtub3duLT5tb2R1bGUgIT0gTlVMTDsga25vd24rKykgewotCQkvKiB5ZWFoLCBvcmRpbmFyaWx5IEkgd291bGRuJ3QgZG8gdGhpcyBlaXRoZXIsCi0JCSAgIGJ1dCBpdCdzIGZpbmUgZm9yIHRoaXMgdGVzdCBoYXJuZXNzLgotCQkqLwotCQlzdGF0aWMgY2hhciBidWZmZXJbMjU2XTsKKyAgICBmb3IgKGtub3duID0gJmtub3duX2NhcHN1bGVzWzBdOyBrbm93bi0+bW9kdWxlICE9IE5VTEw7IGtub3duKyspIHsKKyAgICAgICAgLyogeWVhaCwgb3JkaW5hcmlseSBJIHdvdWxkbid0IGRvIHRoaXMgZWl0aGVyLAorICAgICAgICAgICBidXQgaXQncyBmaW5lIGZvciB0aGlzIHRlc3QgaGFybmVzcy4KKyAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGNoYXIgYnVmZmVyWzI1Nl07CiAjdW5kZWYgRkFJTAogI2RlZmluZSBGQUlMKHgpIFwKLQkJeyBcCi0JCXNwcmludGYoYnVmZmVyLCAiJXMgbW9kdWxlOiBcIiVzXCIgYXR0cmlidXRlOiBcIiVzXCIiLCBcCi0JCQl4LCBrbm93bi0+bW9kdWxlLCBrbm93bi0+YXR0cmlidXRlKTsgXAotCQllcnJvciA9IGJ1ZmZlcjsgXAotCQlnb3RvIGV4aXQ7IFwKLQkJfSBcCisgICAgICAgIHsgXAorICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVzIG1vZHVsZTogXCIlc1wiIGF0dHJpYnV0ZTogXCIlc1wiIiwgXAorICAgICAgICAgICAgeCwga25vd24tPm1vZHVsZSwga25vd24tPmF0dHJpYnV0ZSk7IFwKKyAgICAgICAgZXJyb3IgPSBidWZmZXI7IFwKKyAgICAgICAgZ290byBleGl0OyBcCisgICAgICAgIH0gXAogCi0JCVB5T2JqZWN0ICptb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoa25vd24tPm1vZHVsZSk7Ci0JCWlmIChtb2R1bGUpIHsKLQkJCXBvaW50ZXIgPSBQeUNhcHN1bGVfSW1wb3J0KGtub3duLT5uYW1lLCAwKTsKLQkJCWlmICghcG9pbnRlcikgewotCQkJCVB5X0RFQ1JFRihtb2R1bGUpOwotCQkJCUZBSUwoIlB5Q2Fwc3VsZV9HZXRQb2ludGVyIHJldHVybmVkIE5VTEwgdW5leHBlY3RlZGx5ISIpOwotCQkJfQotCQkJb2JqZWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2R1bGUsIGtub3duLT5hdHRyaWJ1dGUpOwotCQkJaWYgKCFvYmplY3QpIHsKLQkJCQlQeV9ERUNSRUYobW9kdWxlKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXBvaW50ZXIyID0gUHlDYXBzdWxlX0dldFBvaW50ZXIob2JqZWN0LAotCQkJCQkJIndlZWJsZXMgd29iYmxlIGJ1dCB0aGV5IGRvbid0IGZhbGwgZG93biIpOwotCQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJUHlfREVDUkVGKG9iamVjdCk7Ci0JCQkJUHlfREVDUkVGKG1vZHVsZSk7Ci0JCQkJRkFJTCgiUHlDYXBzdWxlX0dldFBvaW50ZXIgc2hvdWxkIGhhdmUgZmFpbGVkIGJ1dCBkaWQgbm90ISIpOwotCQkJfQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWlmIChwb2ludGVyMikgewotCQkJCVB5X0RFQ1JFRihtb2R1bGUpOwotCQkJCVB5X0RFQ1JFRihvYmplY3QpOwotCQkJCWlmIChwb2ludGVyMiA9PSBwb2ludGVyKSB7Ci0JCQkJCUZBSUwoIlB5Q2Fwc3VsZV9HZXRQb2ludGVyIHNob3VsZCBub3QgaGF2ZSIKLQkJCQkJCSAiIHJldHVybmVkIGl0cyBpbnRlcm5hbCBwb2ludGVyISIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUZBSUwoIlB5Q2Fwc3VsZV9HZXRQb2ludGVyIHNob3VsZCBoYXZlIgotCQkJCQkJICIgcmV0dXJuZWQgTlVMTCBwb2ludGVyIGJ1dCBkaWQgbm90ISIpOwotCQkJCX0KLQkJCX0KLQkJCVB5X0RFQ1JFRihvYmplY3QpOwotCQkJUHlfREVDUkVGKG1vZHVsZSk7Ci0JCX0KLQkJZWxzZQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9CisgICAgICAgIFB5T2JqZWN0ICptb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoa25vd24tPm1vZHVsZSk7CisgICAgICAgIGlmIChtb2R1bGUpIHsKKyAgICAgICAgICAgIHBvaW50ZXIgPSBQeUNhcHN1bGVfSW1wb3J0KGtub3duLT5uYW1lLCAwKTsKKyAgICAgICAgICAgIGlmICghcG9pbnRlcikgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtb2R1bGUpOworICAgICAgICAgICAgICAgIEZBSUwoIlB5Q2Fwc3VsZV9HZXRQb2ludGVyIHJldHVybmVkIE5VTEwgdW5leHBlY3RlZGx5ISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2JqZWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2R1bGUsIGtub3duLT5hdHRyaWJ1dGUpOworICAgICAgICAgICAgaWYgKCFvYmplY3QpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobW9kdWxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvaW50ZXIyID0gUHlDYXBzdWxlX0dldFBvaW50ZXIob2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlZWJsZXMgd29iYmxlIGJ1dCB0aGV5IGRvbid0IGZhbGwgZG93biIpOworICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iamVjdCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG1vZHVsZSk7CisgICAgICAgICAgICAgICAgRkFJTCgiUHlDYXBzdWxlX0dldFBvaW50ZXIgc2hvdWxkIGhhdmUgZmFpbGVkIGJ1dCBkaWQgbm90ISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGlmIChwb2ludGVyMikgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtb2R1bGUpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvYmplY3QpOworICAgICAgICAgICAgICAgIGlmIChwb2ludGVyMiA9PSBwb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgIEZBSUwoIlB5Q2Fwc3VsZV9HZXRQb2ludGVyIHNob3VsZCBub3QgaGF2ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5lZCBpdHMgaW50ZXJuYWwgcG9pbnRlciEiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBGQUlMKCJQeUNhcHN1bGVfR2V0UG9pbnRlciBzaG91bGQgaGF2ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5lZCBOVUxMIHBvaW50ZXIgYnV0IGRpZCBub3QhIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKG9iamVjdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYobW9kdWxlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KIAogICBleGl0OgotCWlmIChlcnJvcikgewotCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfY2Fwc3VsZSIsIGVycm9yKTsKLQl9Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9jYXBzdWxlIiwgZXJyb3IpOworICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKICN1bmRlZiBGQUlMCiB9CiAKQEAgLTE1ODMsNDAgKzE1ODMsNDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X3dpdGhfZG9jc3RyaW5nKFB5T2JqZWN0ICpzZWxmKQogewotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiAvKiBUbyB0ZXN0IHRoZSBmb3JtYXQgb2YgdHJhY2ViYWNrcyBhcyBwcmludGVkIG91dC4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiB0cmFjZWJhY2tfcHJpbnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpmaWxlOwotCVB5T2JqZWN0ICp0cmFjZWJhY2s7Ci0JaW50IHJlc3VsdDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9POnRyYWNlYmFja19wcmludCIsCi0JCQkJJnRyYWNlYmFjaywgJmZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQkJCi0JcmVzdWx0ID0gUHlUcmFjZUJhY2tfUHJpbnQodHJhY2ViYWNrLCBmaWxlKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlPYmplY3QgKmZpbGU7CisgICAgUHlPYmplY3QgKnRyYWNlYmFjazsKKyAgICBpbnQgcmVzdWx0OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTzp0cmFjZWJhY2tfcHJpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjZWJhY2ssICZmaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXN1bHQgPSBQeVRyYWNlQmFja19QcmludCh0cmFjZWJhY2ssIGZpbGUpOworICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogLyogVG8gdGVzdCB0aGF0IHRoZSByZXN1bHQgb2YgUHlDb2RlX05ld0VtcHR5IGhhcyB0aGUgcmlnaHQgbWVtYmVycy4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBjb2RlX25ld2VtcHR5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljb25zdCBjaGFyICpmaWxlbmFtZTsKLQljb25zdCBjaGFyICpmdW5jbmFtZTsKLSAgICAgICAgaW50IGZpcnN0bGluZW5vOworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAgIGNvbnN0IGNoYXIgKmZ1bmNuYW1lOworICAgIGludCBmaXJzdGxpbmVubzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3NpOmNvZGVfbmV3ZW1wdHkiLAotCQkJICAgICAgJmZpbGVuYW1lLCAmZnVuY25hbWUsICZmaXJzdGxpbmVubykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3NpOmNvZGVfbmV3ZW1wdHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZW5hbWUsICZmdW5jbmFtZSwgJmZpcnN0bGluZW5vKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopUHlDb2RlX05ld0VtcHR5KGZpbGVuYW1lLCBmdW5jbmFtZSwgZmlyc3RsaW5lbm8pOworICAgIHJldHVybiAoUHlPYmplY3QgKilQeUNvZGVfTmV3RW1wdHkoZmlsZW5hbWUsIGZ1bmNuYW1lLCBmaXJzdGxpbmVubyk7CiB9CiAKIC8qIFRlc3QgUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYyAoYWxzbyBleGVyY2lzZSBQeUVycl9OZXdFeGNlcHRpb24pLgpAQCAtMTYyNCwyNzQgKzE2MjQsMjc0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWFrZV9leGNlcHRpb25fd2l0aF9kb2MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqZG9jID0gTlVMTDsKLQlQeU9iamVjdCAqYmFzZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmRpY3QgPSBOVUxMOworICAgIGNoYXIgKm5hbWU7CisgICAgY2hhciAqZG9jID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYmFzZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRpY3QgPSBOVUxMOwogCi0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJuYW1lIiwgImRvYyIsICJiYXNlIiwgImRpY3QiLCBOVUxMfTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAiZG9jIiwgImJhc2UiLCAiZGljdCIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLAotCQkJInN8c09POm1ha2VfZXhjZXB0aW9uX3dpdGhfZG9jIiwga3dsaXN0LAotCQkJCQkgJm5hbWUsICZkb2MsICZiYXNlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywKKyAgICAgICAgICAgICAgICAgICAgInN8c09POm1ha2VfZXhjZXB0aW9uX3dpdGhfZG9jIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCAmZG9jLCAmYmFzZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUVycl9OZXdFeGNlcHRpb25XaXRoRG9jKG5hbWUsIGRvYywgYmFzZSwgZGljdCk7CisgICAgcmV0dXJuIFB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2MobmFtZSwgZG9jLCBiYXNlLCBkaWN0KTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFRlc3RNZXRob2RzW10gPSB7Ci0JeyJyYWlzZV9leGNlcHRpb24iLAlyYWlzZV9leGNlcHRpb24sCQkgTUVUSF9WQVJBUkdTfSwKLQl7InRlc3RfY29uZmlnIiwJCShQeUNGdW5jdGlvbil0ZXN0X2NvbmZpZywJIE1FVEhfTk9BUkdTfSwKLQl7InRlc3RfZGF0ZXRpbWVfY2FwaSIsICB0ZXN0X2RhdGV0aW1lX2NhcGksICAgICAgICAgICAgICBNRVRIX05PQVJHU30sCi0JeyJ0ZXN0X2xpc3RfYXBpIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbGlzdF9hcGksCSBNRVRIX05PQVJHU30sCi0JeyJ0ZXN0X2RpY3RfaXRlcmF0aW9uIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfZGljdF9pdGVyYXRpb24sTUVUSF9OT0FSR1N9LAotCXsidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2UiLAkoUHlDRnVuY3Rpb24pdGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2UsTUVUSF9OT0FSR1N9LAotCXsidGVzdF9icm9rZW5fbWVtb3J5dmlldyIsCShQeUNGdW5jdGlvbil0ZXN0X2Jyb2tlbl9tZW1vcnl2aWV3LE1FVEhfTk9BUkdTfSwKLQl7InRlc3RfbG9uZ19hcGkiLAkoUHlDRnVuY3Rpb24pdGVzdF9sb25nX2FwaSwJIE1FVEhfTk9BUkdTfSwKLQl7InRlc3RfbG9uZ19hbmRfb3ZlcmZsb3ciLCAoUHlDRnVuY3Rpb24pdGVzdF9sb25nX2FuZF9vdmVyZmxvdywKLQkgTUVUSF9OT0FSR1N9LAotCXsidGVzdF9sb25nX251bWJpdHMiLAkoUHlDRnVuY3Rpb24pdGVzdF9sb25nX251bWJpdHMsCSBNRVRIX05PQVJHU30sCi0JeyJ0ZXN0X2tfY29kZSIsCQkoUHlDRnVuY3Rpb24pdGVzdF9rX2NvZGUsCSBNRVRIX05PQVJHU30sCi0JeyJ0ZXN0X2VtcHR5X2FyZ3BhcnNlIiwgKFB5Q0Z1bmN0aW9uKXRlc3RfZW1wdHlfYXJncGFyc2UsTUVUSF9OT0FSR1N9LAotCXsidGVzdF9udWxsX3N0cmluZ3MiLAkoUHlDRnVuY3Rpb24pdGVzdF9udWxsX3N0cmluZ3MsCSBNRVRIX05PQVJHU30sCi0JeyJ0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCIsIChQeUNGdW5jdGlvbil0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCwgTUVUSF9OT0FSR1N9LAotCXsidGVzdF93aXRoX2RvY3N0cmluZyIsIChQeUNGdW5jdGlvbil0ZXN0X3dpdGhfZG9jc3RyaW5nLCBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJUaGlzIGlzIGEgcHJldHR5IG5vcm1hbCBkb2NzdHJpbmcuIil9LAorICAgIHsicmFpc2VfZXhjZXB0aW9uIiwgICAgICAgICByYWlzZV9leGNlcHRpb24sICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidGVzdF9jb25maWciLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9jb25maWcsICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X2RhdGV0aW1lX2NhcGkiLCAgdGVzdF9kYXRldGltZV9jYXBpLCAgICAgICAgICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9saXN0X2FwaSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9saXN0X2FwaSwgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X2RpY3RfaXRlcmF0aW9uIiwgICAgIChQeUNGdW5jdGlvbil0ZXN0X2RpY3RfaXRlcmF0aW9uLE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlIiwgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2UsTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9icm9rZW5fbWVtb3J5dmlldyIsICAgICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X2Jyb2tlbl9tZW1vcnl2aWV3LE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3RfbG9uZ19hcGkiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlc3RfbG9uZ19hcGksICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9sb25nX2FuZF9vdmVyZmxvdyIsIChQeUNGdW5jdGlvbil0ZXN0X2xvbmdfYW5kX292ZXJmbG93LAorICAgICBNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X2xvbmdfbnVtYml0cyIsICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X2xvbmdfbnVtYml0cywgIE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3Rfa19jb2RlIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlc3Rfa19jb2RlLCAgICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9lbXB0eV9hcmdwYXJzZSIsIChQeUNGdW5jdGlvbil0ZXN0X2VtcHR5X2FyZ3BhcnNlLE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3RfbnVsbF9zdHJpbmdzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXRlc3RfbnVsbF9zdHJpbmdzLCAgTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQiLCAoUHlDRnVuY3Rpb24pdGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQsIE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3Rfd2l0aF9kb2NzdHJpbmciLCAoUHlDRnVuY3Rpb24pdGVzdF93aXRoX2RvY3N0cmluZywgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiVGhpcyBpcyBhIHByZXR0eSBub3JtYWwgZG9jc3RyaW5nLiIpfSwKIAotCXsiZ2V0YXJnc190dXBsZSIsCWdldGFyZ3NfdHVwbGUsCQkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX2tleXdvcmRzIiwgKFB5Q0Z1bmN0aW9uKWdldGFyZ3Nfa2V5d29yZHMsIAotCSAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAotCXsiZ2V0YXJnc19iIiwJCWdldGFyZ3NfYiwJCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfQiIsCQlnZXRhcmdzX0IsCQkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX2giLAkJZ2V0YXJnc19oLAkJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19IIiwJCWdldGFyZ3NfSCwJCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfSSIsCQlnZXRhcmdzX0ksCQkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX2siLAkJZ2V0YXJnc19rLAkJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19pIiwJCWdldGFyZ3NfaSwJCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfbCIsCQlnZXRhcmdzX2wsCQkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX24iLAkJZ2V0YXJnc19uLCAJCQkgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3NfdHVwbGUiLCAgICAgICAgICAgZ2V0YXJnc190dXBsZSwgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3Nfa2V5d29yZHMiLCAoUHlDRnVuY3Rpb24pZ2V0YXJnc19rZXl3b3JkcywKKyAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKKyAgICB7ImdldGFyZ3NfYiIsICAgICAgICAgICAgICAgZ2V0YXJnc19iLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3NfQiIsICAgICAgICAgICAgICAgZ2V0YXJnc19CLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3NfaCIsICAgICAgICAgICAgICAgZ2V0YXJnc19oLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3NfSCIsICAgICAgICAgICAgICAgZ2V0YXJnc19ILCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3NfSSIsICAgICAgICAgICAgICAgZ2V0YXJnc19JLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3NfayIsICAgICAgICAgICAgICAgZ2V0YXJnc19rLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3NfaSIsICAgICAgICAgICAgICAgZ2V0YXJnc19pLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3NfbCIsICAgICAgICAgICAgICAgZ2V0YXJnc19sLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGFyZ3NfbiIsICAgICAgICAgICAgICAgZ2V0YXJnc19uLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCXsiZ2V0YXJnc19MIiwJCWdldGFyZ3NfTCwJCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfSyIsCQlnZXRhcmdzX0ssCQkJIE1FVEhfVkFSQVJHU30sCi0JeyJ0ZXN0X2xvbmdsb25nX2FwaSIsCXRlc3RfbG9uZ2xvbmdfYXBpLAkJIE1FVEhfTk9BUkdTfSwKLQl7InRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyIsCi0JCShQeUNGdW5jdGlvbil0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3csIE1FVEhfTk9BUkdTfSwKLQl7InRlc3RfTF9jb2RlIiwJCShQeUNGdW5jdGlvbil0ZXN0X0xfY29kZSwJIE1FVEhfTk9BUkdTfSwKLQl7ImNvZGVjX2luY3JlbWVudGFsZW5jb2RlciIsCi0JIChQeUNGdW5jdGlvbiljb2RlY19pbmNyZW1lbnRhbGVuY29kZXIsCSBNRVRIX1ZBUkFSR1N9LAotCXsiY29kZWNfaW5jcmVtZW50YWxkZWNvZGVyIiwKLQkgKFB5Q0Z1bmN0aW9uKWNvZGVjX2luY3JlbWVudGFsZGVjb2RlciwJIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRhcmdzX0wiLCAgICAgICAgICAgICAgIGdldGFyZ3NfTCwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRhcmdzX0siLCAgICAgICAgICAgICAgIGdldGFyZ3NfSywgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ0ZXN0X2xvbmdsb25nX2FwaSIsICAgICAgIHRlc3RfbG9uZ2xvbmdfYXBpLCAgICAgICAgICAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyIsCisgICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3csIE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3RfTF9jb2RlIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlc3RfTF9jb2RlLCAgICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyIiwKKyAgICAgKFB5Q0Z1bmN0aW9uKWNvZGVjX2luY3JlbWVudGFsZW5jb2RlciwgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY29kZWNfaW5jcmVtZW50YWxkZWNvZGVyIiwKKyAgICAgKFB5Q0Z1bmN0aW9uKWNvZGVjX2luY3JlbWVudGFsZGVjb2RlciwgICAgICBNRVRIX1ZBUkFSR1N9LAogI2VuZGlmCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCXsidGVzdF91X2NvZGUiLAkJKFB5Q0Z1bmN0aW9uKXRlc3RfdV9jb2RlLAkgTUVUSF9OT0FSR1N9LAotCXsidGVzdF93aWRlY2hhciIsCShQeUNGdW5jdGlvbil0ZXN0X3dpZGVjaGFyLAkgTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF91X2NvZGUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGVzdF91X2NvZGUsICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X3dpZGVjaGFyIiwgICAgICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X3dpZGVjaGFyLCAgICAgIE1FVEhfTk9BUkdTfSwKICNlbmRpZgogI2lmZGVmIFdJVEhfVEhSRUFECi0JeyJfdGVzdF90aHJlYWRfc3RhdGUiLCAgdGVzdF90aHJlYWRfc3RhdGUsIAkJIE1FVEhfVkFSQVJHU30sCi0JeyJfcGVuZGluZ190aHJlYWRmdW5jIiwJcGVuZGluZ190aHJlYWRmdW5jLAkJIE1FVEhfVkFSQVJHU30sCisgICAgeyJfdGVzdF90aHJlYWRfc3RhdGUiLCAgdGVzdF90aHJlYWRfc3RhdGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJfcGVuZGluZ190aHJlYWRmdW5jIiwgICAgIHBlbmRpbmdfdGhyZWFkZnVuYywgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKLQl7InRlc3RfY2Fwc3VsZSIsIChQeUNGdW5jdGlvbil0ZXN0X2NhcHN1bGUsIE1FVEhfTk9BUkdTfSwKLQl7InRyYWNlYmFja19wcmludCIsIHRyYWNlYmFja19wcmludCwgCSAgICAgICAgIE1FVEhfVkFSQVJHU30sCi0JeyJjb2RlX25ld2VtcHR5IiwgY29kZV9uZXdlbXB0eSwgCSAgICAgICAgIE1FVEhfVkFSQVJHU30sCi0JeyJtYWtlX2V4Y2VwdGlvbl93aXRoX2RvYyIsIChQeUNGdW5jdGlvbiltYWtlX2V4Y2VwdGlvbl93aXRoX2RvYywKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEU30sCi0Je05VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCisgICAgeyJ0ZXN0X2NhcHN1bGUiLCAoUHlDRnVuY3Rpb24pdGVzdF9jYXBzdWxlLCBNRVRIX05PQVJHU30sCisgICAgeyJ0cmFjZWJhY2tfcHJpbnQiLCB0cmFjZWJhY2tfcHJpbnQsICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY29kZV9uZXdlbXB0eSIsIGNvZGVfbmV3ZW1wdHksICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1ha2VfZXhjZXB0aW9uX3dpdGhfZG9jIiwgKFB5Q0Z1bmN0aW9uKW1ha2VfZXhjZXB0aW9uX3dpdGhfZG9jLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTfSwKKyAgICB7TlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KIH07CiAKICNkZWZpbmUgQWRkU3ltKGQsIG4sIGYsIHYpIHtQeU9iamVjdCAqbyA9IGYodik7IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG4sIG8pOyBQeV9ERUNSRUYobyk7fQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JY2hhciBib29sX21lbWJlcjsKLQljaGFyIGJ5dGVfbWVtYmVyOwotCXVuc2lnbmVkIGNoYXIgdWJ5dGVfbWVtYmVyOwotCXNob3J0IHNob3J0X21lbWJlcjsKLQl1bnNpZ25lZCBzaG9ydCB1c2hvcnRfbWVtYmVyOwotCWludCBpbnRfbWVtYmVyOwotCXVuc2lnbmVkIGludCB1aW50X21lbWJlcjsKLQlsb25nIGxvbmdfbWVtYmVyOwotCXVuc2lnbmVkIGxvbmcgdWxvbmdfbWVtYmVyOwotCWZsb2F0IGZsb2F0X21lbWJlcjsKLQlkb3VibGUgZG91YmxlX21lbWJlcjsKLQljaGFyIGlucGxhY2VfbWVtYmVyWzZdOworICAgIGNoYXIgYm9vbF9tZW1iZXI7CisgICAgY2hhciBieXRlX21lbWJlcjsKKyAgICB1bnNpZ25lZCBjaGFyIHVieXRlX21lbWJlcjsKKyAgICBzaG9ydCBzaG9ydF9tZW1iZXI7CisgICAgdW5zaWduZWQgc2hvcnQgdXNob3J0X21lbWJlcjsKKyAgICBpbnQgaW50X21lbWJlcjsKKyAgICB1bnNpZ25lZCBpbnQgdWludF9tZW1iZXI7CisgICAgbG9uZyBsb25nX21lbWJlcjsKKyAgICB1bnNpZ25lZCBsb25nIHVsb25nX21lbWJlcjsKKyAgICBmbG9hdCBmbG9hdF9tZW1iZXI7CisgICAgZG91YmxlIGRvdWJsZV9tZW1iZXI7CisgICAgY2hhciBpbnBsYWNlX21lbWJlcls2XTsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCVBZX0xPTkdfTE9ORyBsb25nbG9uZ19tZW1iZXI7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHVsb25nbG9uZ19tZW1iZXI7CisgICAgUFlfTE9OR19MT05HIGxvbmdsb25nX21lbWJlcjsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdWxvbmdsb25nX21lbWJlcjsKICNlbmRpZgogfSBhbGxfc3RydWN0bWVtYmVyczsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLQlhbGxfc3RydWN0bWVtYmVycyBzdHJ1Y3RtZW1iZXJzOworICAgIGFsbF9zdHJ1Y3RtZW1iZXJzIHN0cnVjdG1lbWJlcnM7CiB9IHRlc3Rfc3RydWN0bWVtYmVyczsKIAogc3RhdGljIHN0cnVjdCBQeU1lbWJlckRlZiB0ZXN0X21lbWJlcnNbXSA9IHsKLQl7IlRfQk9PTCIsIFRfQk9PTCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmJvb2xfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX0JZVEUiLCBUX0JZVEUsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5ieXRlX21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9VQllURSIsIFRfVUJZVEUsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy51Ynl0ZV9tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfU0hPUlQiLCBUX1NIT1JULCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuc2hvcnRfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX1VTSE9SVCIsIFRfVVNIT1JULCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMudXNob3J0X21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9JTlQiLCBUX0lOVCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmludF9tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfVUlOVCIsIFRfVUlOVCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnVpbnRfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX0xPTkciLCBUX0xPTkcsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5sb25nX21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9VTE9ORyIsIFRfVUxPTkcsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy51bG9uZ19tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfRkxPQVQiLCBUX0ZMT0FULCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuZmxvYXRfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX0RPVUJMRSIsIFRfRE9VQkxFLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuZG91YmxlX21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9TVFJJTkdfSU5QTEFDRSIsIFRfU1RSSU5HX0lOUExBQ0UsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5pbnBsYWNlX21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9CT09MIiwgVF9CT09MLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuYm9vbF9tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfQllURSIsIFRfQllURSwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmJ5dGVfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX1VCWVRFIiwgVF9VQllURSwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnVieXRlX21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9TSE9SVCIsIFRfU0hPUlQsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5zaG9ydF9tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfVVNIT1JUIiwgVF9VU0hPUlQsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy51c2hvcnRfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX0lOVCIsIFRfSU5ULCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuaW50X21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9VSU5UIiwgVF9VSU5ULCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMudWludF9tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfTE9ORyIsIFRfTE9ORywgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmxvbmdfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX1VMT05HIiwgVF9VTE9ORywgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnVsb25nX21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9GTE9BVCIsIFRfRkxPQVQsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5mbG9hdF9tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfRE9VQkxFIiwgVF9ET1VCTEUsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5kb3VibGVfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX1NUUklOR19JTlBMQUNFIiwgVF9TVFJJTkdfSU5QTEFDRSwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmlucGxhY2VfbWVtYmVyKSwgMCwgTlVMTH0sCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQl7IlRfTE9OR0xPTkciLCBUX0xPTkdMT05HLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMubG9uZ2xvbmdfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX1VMT05HTE9ORyIsIFRfVUxPTkdMT05HLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMudWxvbmdsb25nX21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9MT05HTE9ORyIsIFRfTE9OR0xPTkcsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5sb25nbG9uZ19tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfVUxPTkdMT05HIiwgVF9VTE9OR0xPTkcsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy51bG9uZ2xvbmdfbWVtYmVyKSwgMCwgTlVMTH0sCiAjZW5kaWYKLQl7TlVMTH0KKyAgICB7TlVMTH0KIH07CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3Rfc3RydWN0bWVtYmVyc19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsKLQkJIlRfQk9PTCIsICJUX0JZVEUiLCAiVF9VQllURSIsICJUX1NIT1JUIiwgIlRfVVNIT1JUIiwKLQkJIlRfSU5UIiwgIlRfVUlOVCIsICJUX0xPTkciLCAiVF9VTE9ORyIsCi0JCSJUX0ZMT0FUIiwgIlRfRE9VQkxFIiwgIlRfU1RSSU5HX0lOUExBQ0UiLAotI2lmZGVmIEhBVkVfTE9OR19MT05HCQotCQkiVF9MT05HTE9ORyIsICJUX1VMT05HTE9ORyIsCi0jZW5kaWYKLQkJTlVMTH07Ci0Jc3RhdGljIGNoYXIgKmZtdCA9ICJ8YmJCaEhpSWxrZmRzIyIKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsKKyAgICAgICAgIlRfQk9PTCIsICJUX0JZVEUiLCAiVF9VQllURSIsICJUX1NIT1JUIiwgIlRfVVNIT1JUIiwKKyAgICAgICAgIlRfSU5UIiwgIlRfVUlOVCIsICJUX0xPTkciLCAiVF9VTE9ORyIsCisgICAgICAgICJUX0ZMT0FUIiwgIlRfRE9VQkxFIiwgIlRfU1RSSU5HX0lOUExBQ0UiLAogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCSJMSyIKKyAgICAgICAgIlRfTE9OR0xPTkciLCAiVF9VTE9OR0xPTkciLAogI2VuZGlmCi0JCTsKLQl0ZXN0X3N0cnVjdG1lbWJlcnMgKm9iOwotCWNvbnN0IGNoYXIgKnMgPSBOVUxMOwotCVB5X3NzaXplX3Qgc3RyaW5nX2xlbiA9IDA7Ci0Jb2IgPSBQeU9iamVjdF9OZXcodGVzdF9zdHJ1Y3RtZW1iZXJzLCB0eXBlKTsKLQlpZiAob2IgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCZvYi0+c3RydWN0bWVtYmVycywgMCwgc2l6ZW9mKGFsbF9zdHJ1Y3RtZW1iZXJzKSk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCBmbXQsIGtleXdvcmRzLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLmJvb2xfbWVtYmVyLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLmJ5dGVfbWVtYmVyLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLnVieXRlX21lbWJlciwKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy5zaG9ydF9tZW1iZXIsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMudXNob3J0X21lbWJlciwKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy5pbnRfbWVtYmVyLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLnVpbnRfbWVtYmVyLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLmxvbmdfbWVtYmVyLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLnVsb25nX21lbWJlciwKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy5mbG9hdF9tZW1iZXIsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMuZG91YmxlX21lbWJlciwKLQkJCQkJICZzLCAmc3RyaW5nX2xlbgorICAgICAgICBOVUxMfTsKKyAgICBzdGF0aWMgY2hhciAqZm10ID0gInxiYkJoSGlJbGtmZHMjIgogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCQkJCSAsICZvYi0+c3RydWN0bWVtYmVycy5sb25nbG9uZ19tZW1iZXIsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMudWxvbmdsb25nX21lbWJlcgorICAgICAgICAiTEsiCiAjZW5kaWYKLQkJKSkgewotCQlQeV9ERUNSRUYob2IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHMgIT0gTlVMTCkgewotCQlpZiAoc3RyaW5nX2xlbiA+IDUpIHsKLQkJCVB5X0RFQ1JFRihvYik7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInN0cmluZyB0b28gbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3RyY3B5KG9iLT5zdHJ1Y3RtZW1iZXJzLmlucGxhY2VfbWVtYmVyLCBzKTsKLQl9Ci0JZWxzZSB7Ci0JCXN0cmNweShvYi0+c3RydWN0bWVtYmVycy5pbnBsYWNlX21lbWJlciwgIiIpOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopb2I7CisgICAgICAgIDsKKyAgICB0ZXN0X3N0cnVjdG1lbWJlcnMgKm9iOworICAgIGNvbnN0IGNoYXIgKnMgPSBOVUxMOworICAgIFB5X3NzaXplX3Qgc3RyaW5nX2xlbiA9IDA7CisgICAgb2IgPSBQeU9iamVjdF9OZXcodGVzdF9zdHJ1Y3RtZW1iZXJzLCB0eXBlKTsKKyAgICBpZiAob2IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KCZvYi0+c3RydWN0bWVtYmVycywgMCwgc2l6ZW9mKGFsbF9zdHJ1Y3RtZW1iZXJzKSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCBmbXQsIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy5ib29sX21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMuYnl0ZV9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLnVieXRlX21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMuc2hvcnRfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy51c2hvcnRfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy5pbnRfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy51aW50X21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMubG9uZ19tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLnVsb25nX21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMuZmxvYXRfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy5kb3VibGVfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLCAmc3RyaW5nX2xlbgorI2lmZGVmIEhBVkVfTE9OR19MT05HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAmb2ItPnN0cnVjdG1lbWJlcnMubG9uZ2xvbmdfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy51bG9uZ2xvbmdfbWVtYmVyCisjZW5kaWYKKyAgICAgICAgKSkgeworICAgICAgICBQeV9ERUNSRUYob2IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHMgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RyaW5nX2xlbiA+IDUpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvYik7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInN0cmluZyB0b28gbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KG9iLT5zdHJ1Y3RtZW1iZXJzLmlucGxhY2VfbWVtYmVyLCBzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0cmNweShvYi0+c3RydWN0bWVtYmVycy5pbnBsYWNlX21lbWJlciwgIiIpOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb2I7CiB9CiAKIHN0YXRpYyB2b2lkCiB0ZXN0X3N0cnVjdG1lbWJlcnNfZnJlZShQeU9iamVjdCAqb2IpCiB7Ci0JUHlPYmplY3RfRlJFRShvYik7CisgICAgUHlPYmplY3RfRlJFRShvYik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkidGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSIsCi0Jc2l6ZW9mKHRlc3Rfc3RydWN0bWVtYmVycyksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JdGVzdF9zdHJ1Y3RtZW1iZXJzX2ZyZWUsCS8qIGRlc3RydWN0b3IgdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JMCwJCQkJLyogdHBfZmxhZ3MgKi8KLQkiVHlwZSBjb250YWluaW5nIGFsbCBzdHJ1Y3RtZW1iZXIgdHlwZXMiLAotCTAsCQkJCS8qIHRyYXZlcnNlcHJvYyB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQl0ZXN0X21lbWJlcnMsCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCi0JMCwKLQkwLAotCTAsCi0JMCwKLQkwLAotCTAsCi0JMCwKLQl0ZXN0X3N0cnVjdG1lbWJlcnNfbmV3LAkgICAgICAgCS8qIHRwX25ldyAqLworICAgICJ0ZXN0X3N0cnVjdG1lbWJlcnNUeXBlIiwKKyAgICBzaXplb2YodGVzdF9zdHJ1Y3RtZW1iZXJzKSwgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIHRlc3Rfc3RydWN0bWVtYmVyc19mcmVlLCAgICAgICAgICAgIC8qIGRlc3RydWN0b3IgdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgIlR5cGUgY29udGFpbmluZyBhbGwgc3RydWN0bWVtYmVyIHR5cGVzIiwKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmF2ZXJzZXByb2MgdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgdGVzdF9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICB0ZXN0X3N0cnVjdG1lbWJlcnNfbmV3LCAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRfdGVzdGNhcGkodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfdGVzdGNhcGkiLCBUZXN0TWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfdGVzdGNhcGkiLCBUZXN0TWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfVFlQRSgmX0hhc2hJbmhlcml0YW5jZVRlc3Rlcl9UeXBlKT0mUHlUeXBlX1R5cGU7CisgICAgUHlfVFlQRSgmX0hhc2hJbmhlcml0YW5jZVRlc3Rlcl9UeXBlKT0mUHlUeXBlX1R5cGU7CiAKLQlQeV9UWVBFKCZ0ZXN0X3N0cnVjdG1lbWJlcnNUeXBlKT0mUHlUeXBlX1R5cGU7Ci0JUHlfSU5DUkVGKCZ0ZXN0X3N0cnVjdG1lbWJlcnNUeXBlKTsKLQkvKiBkb24ndCB1c2UgYSBuYW1lIHN0YXJ0aW5nIHdpdGggInRlc3QiLCBzaW5jZSB3ZSBkb24ndCB3YW50Ci0JICAgdGVzdF9jYXBpIHRvIGF1dG9tYXRpY2FsbHkgY2FsbCB0aGlzICovCi0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSIsIChQeU9iamVjdCAqKSZ0ZXN0X3N0cnVjdG1lbWJlcnNUeXBlKTsKKyAgICBQeV9UWVBFKCZ0ZXN0X3N0cnVjdG1lbWJlcnNUeXBlKT0mUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZ0ZXN0X3N0cnVjdG1lbWJlcnNUeXBlKTsKKyAgICAvKiBkb24ndCB1c2UgYSBuYW1lIHN0YXJ0aW5nIHdpdGggInRlc3QiLCBzaW5jZSB3ZSBkb24ndCB3YW50CisgICAgICAgdGVzdF9jYXBpIHRvIGF1dG9tYXRpY2FsbHkgY2FsbCB0aGlzICovCisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSIsIChQeU9iamVjdCAqKSZ0ZXN0X3N0cnVjdG1lbWJlcnNUeXBlKTsKIAotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0hBUl9NQVgiLCBQeUludF9Gcm9tTG9uZyhDSEFSX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0hBUl9NSU4iLCBQeUludF9Gcm9tTG9uZyhDSEFSX01JTikpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVUNIQVJfTUFYIiwgUHlJbnRfRnJvbUxvbmcoVUNIQVJfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSFJUX01BWCIsIFB5SW50X0Zyb21Mb25nKFNIUlRfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSFJUX01JTiIsIFB5SW50X0Zyb21Mb25nKFNIUlRfTUlOKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVU0hSVF9NQVgiLCBQeUludF9Gcm9tTG9uZyhVU0hSVF9NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIklOVF9NQVgiLCAgUHlMb25nX0Zyb21Mb25nKElOVF9NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIklOVF9NSU4iLCAgUHlMb25nX0Zyb21Mb25nKElOVF9NSU4pKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVJTlRfTUFYIiwgIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKFVJTlRfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMT05HX01BWCIsIFB5SW50X0Zyb21Mb25nKExPTkdfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMT05HX01JTiIsIFB5SW50X0Zyb21Mb25nKExPTkdfTUlOKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVTE9OR19NQVgiLCBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhVTE9OR19NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZMVF9NQVgiLCBQeUZsb2F0X0Zyb21Eb3VibGUoRkxUX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRkxUX01JTiIsIFB5RmxvYXRfRnJvbURvdWJsZShGTFRfTUlOKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEQkxfTUFYIiwgUHlGbG9hdF9Gcm9tRG91YmxlKERCTF9NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRCTF9NSU4iLCBQeUZsb2F0X0Zyb21Eb3VibGUoREJMX01JTikpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTExPTkdfTUFYIiwgUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MTE9OR19NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxMT05HX01JTiIsIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTExPTkdfTUlOKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVTExPTkdfTUFYIiwgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKFBZX1VMTE9OR19NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBZX1NTSVpFX1RfTUFYIiwgUHlJbnRfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBZX1NTSVpFX1RfTUlOIiwgUHlJbnRfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NSU4pKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNJWkVPRl9QWUdDX0hFQUQiLCBQeUludF9Gcm9tU3NpemVfdChzaXplb2YoUHlHQ19IZWFkKSkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0hBUl9NQVgiLCBQeUludF9Gcm9tTG9uZyhDSEFSX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0hBUl9NSU4iLCBQeUludF9Gcm9tTG9uZyhDSEFSX01JTikpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVUNIQVJfTUFYIiwgUHlJbnRfRnJvbUxvbmcoVUNIQVJfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSFJUX01BWCIsIFB5SW50X0Zyb21Mb25nKFNIUlRfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSFJUX01JTiIsIFB5SW50X0Zyb21Mb25nKFNIUlRfTUlOKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVU0hSVF9NQVgiLCBQeUludF9Gcm9tTG9uZyhVU0hSVF9NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIklOVF9NQVgiLCAgUHlMb25nX0Zyb21Mb25nKElOVF9NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIklOVF9NSU4iLCAgUHlMb25nX0Zyb21Mb25nKElOVF9NSU4pKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVJTlRfTUFYIiwgIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKFVJTlRfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMT05HX01BWCIsIFB5SW50X0Zyb21Mb25nKExPTkdfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMT05HX01JTiIsIFB5SW50X0Zyb21Mb25nKExPTkdfTUlOKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVTE9OR19NQVgiLCBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhVTE9OR19NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZMVF9NQVgiLCBQeUZsb2F0X0Zyb21Eb3VibGUoRkxUX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRkxUX01JTiIsIFB5RmxvYXRfRnJvbURvdWJsZShGTFRfTUlOKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEQkxfTUFYIiwgUHlGbG9hdF9Gcm9tRG91YmxlKERCTF9NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRCTF9NSU4iLCBQeUZsb2F0X0Zyb21Eb3VibGUoREJMX01JTikpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTExPTkdfTUFYIiwgUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MTE9OR19NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxMT05HX01JTiIsIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTExPTkdfTUlOKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVTExPTkdfTUFYIiwgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKFBZX1VMTE9OR19NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBZX1NTSVpFX1RfTUFYIiwgUHlJbnRfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBZX1NTSVpFX1RfTUlOIiwgUHlJbnRfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NSU4pKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNJWkVPRl9QWUdDX0hFQUQiLCBQeUludF9Gcm9tU3NpemVfdChzaXplb2YoUHlHQ19IZWFkKSkpOwogCi0JVGVzdEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJfdGVzdGNhcGkuZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlQeV9JTkNSRUYoVGVzdEVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgVGVzdEVycm9yKTsKKyAgICBUZXN0RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oIl90ZXN0Y2FwaS5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIFB5X0lOQ1JFRihUZXN0RXJyb3IpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBUZXN0RXJyb3IpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGtpbnRlci5jIGIvTW9kdWxlcy9fdGtpbnRlci5jCmluZGV4IGRiMjVmODYuLjAxZDYyODQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3RraW50ZXIuYworKysgYi9Nb2R1bGVzL190a2ludGVyLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIFRDTC9USyBWRVJTSU9OIElORk86CiAKLQlPbmx5IFRjbC9UayA4LjMuMSBhbmQgbGF0ZXIgYXJlIHN1cHBvcnRlZC4gIE9sZGVyIHZlcnNpb25zIGFyZSBub3QKLQlzdXBwb3J0ZWQuIFVzZSBQeXRob24gMi42IG9yIG9sZGVyIGlmIHlvdSBjYW5ub3QgdXBncmFkZSB5b3VyCi0JVGNsL1RrIGxpYnJhcmllcy4KKyAgICBPbmx5IFRjbC9UayA4LjMuMSBhbmQgbGF0ZXIgYXJlIHN1cHBvcnRlZC4gIE9sZGVyIHZlcnNpb25zIGFyZSBub3QKKyAgICBzdXBwb3J0ZWQuIFVzZSBQeXRob24gMi42IG9yIG9sZGVyIGlmIHlvdSBjYW5ub3QgdXBncmFkZSB5b3VyCisgICAgVGNsL1RrIGxpYnJhcmllcy4KICovCiAKIC8qIFhYWCBGdXJ0aGVyIHNwZWVkLXVwIGlkZWFzLCBpbnZvbHZpbmcgVGNsIDguMCBmZWF0dXJlczoKQEAgLTgzLDggKzgzLDggQEAKIC8qIFVuaWNvZGUgY29udmVyc2lvbiBhc3N1bWVzIHRoYXQgVGNsX1VuaUNoYXIgaXMgdHdvIGJ5dGVzLgogICAgV2UgY2Fubm90IHRlc3QgdGhpcyBkaXJlY3RseSwgc28gd2UgdGVzdCBVVEYtOCBzaXplIGluc3RlYWQsCiAgICBleHBlY3RpbmcgdGhhdCBUQ0xfVVRGX01BWCBpcyBjaGFuZ2VkIGlmIFRjbCBldmVyIHN1cHBvcnRzCi0gICBlaXRoZXIgVVRGLTE2IG9yIFVDUy00LiAgCi0gICBSZWRoYXQgOCBzZXRzIFRDTF9VVEZfTUFYIHRvIDYsIGFuZCB1c2VzIHdjaGFyX3QgZm9yIAorICAgZWl0aGVyIFVURi0xNiBvciBVQ1MtNC4KKyAgIFJlZGhhdCA4IHNldHMgVENMX1VURl9NQVggdG8gNiwgYW5kIHVzZXMgd2NoYXJfdCBmb3IKICAgIFRjbF9VbmljaGFyLiBUaGlzIGlzIGFsc28gb2sgYXMgbG9uZyBhcyBQeXRob24gdXNlcyBVQ1MtNCwKICAgIGFzIHdlbGwuCiAqLwpAQCAtMTk3LDMyICsxOTcsMzIgQEAKICNlbmRpZgogCiAjZGVmaW5lIEVOVEVSX1RDTCBcCi0JeyBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOyBQeV9CRUdJTl9BTExPV19USFJFQURTIFwKLQkgICAgaWYodGNsX2xvY2spUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRjbF9sb2NrLCAxKTsgdGNsX3RzdGF0ZSA9IHRzdGF0ZTsKKyAgICB7IFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7IFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgXAorICAgICAgICBpZih0Y2xfbG9jaylQeVRocmVhZF9hY3F1aXJlX2xvY2sodGNsX2xvY2ssIDEpOyB0Y2xfdHN0YXRlID0gdHN0YXRlOwogCiAjZGVmaW5lIExFQVZFX1RDTCBcCiAgICAgdGNsX3RzdGF0ZSA9IE5VTEw7IGlmKHRjbF9sb2NrKVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0Y2xfbG9jayk7IFB5X0VORF9BTExPV19USFJFQURTfQogCiAjZGVmaW5lIEVOVEVSX09WRVJMQVAgXAotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAogI2RlZmluZSBMRUFWRV9PVkVSTEFQX1RDTCBcCi0JdGNsX3RzdGF0ZSA9IE5VTEw7IGlmKHRjbF9sb2NrKVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0Y2xfbG9jayk7IH0KKyAgICB0Y2xfdHN0YXRlID0gTlVMTDsgaWYodGNsX2xvY2spUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRjbF9sb2NrKTsgfQogCiAjZGVmaW5lIEVOVEVSX1BZVEhPTiBcCi0JeyBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSB0Y2xfdHN0YXRlOyB0Y2xfdHN0YXRlID0gTlVMTDsgXAotCSAgICBpZih0Y2xfbG9jaylQeVRocmVhZF9yZWxlYXNlX2xvY2sodGNsX2xvY2spOyBQeUV2YWxfUmVzdG9yZVRocmVhZCgodHN0YXRlKSk7IH0KKyAgICB7IFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IHRjbF90c3RhdGU7IHRjbF90c3RhdGUgPSBOVUxMOyBcCisgICAgICAgIGlmKHRjbF9sb2NrKVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0Y2xfbG9jayk7IFB5RXZhbF9SZXN0b3JlVGhyZWFkKCh0c3RhdGUpKTsgfQogCiAjZGVmaW5lIExFQVZFX1BZVEhPTiBcCi0JeyBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOyBcCi0JICAgIGlmKHRjbF9sb2NrKVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0Y2xfbG9jaywgMSk7IHRjbF90c3RhdGUgPSB0c3RhdGU7IH0KKyAgICB7IFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7IFwKKyAgICAgICAgaWYodGNsX2xvY2spUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRjbF9sb2NrLCAxKTsgdGNsX3RzdGF0ZSA9IHRzdGF0ZTsgfQogCiAjZGVmaW5lIENIRUNLX1RDTF9BUFBBUlRNRU5UIFwKLQlpZiAoKChUa2FwcE9iamVjdCAqKXNlbGYpLT50aHJlYWRlZCAmJiBcCi0JICAgICgoVGthcHBPYmplY3QgKilzZWxmKS0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkpIHsgXAotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiQ2FsbGluZyBUY2wgZnJvbSBkaWZmZXJlbnQgYXBwYXJ0bWVudCIpOyBcCi0JCXJldHVybiAwOyBcCi0JfQorICAgIGlmICgoKFRrYXBwT2JqZWN0ICopc2VsZiktPnRocmVhZGVkICYmIFwKKyAgICAgICAgKChUa2FwcE9iamVjdCAqKXNlbGYpLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSkgeyBcCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJDYWxsaW5nIFRjbCBmcm9tIGRpZmZlcmVudCBhcHBhcnRtZW50Iik7IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9CiAKICNlbHNlCiAKQEAgLTI0NSwyMSArMjQ1LDIxIEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0IFRrYXBwX1R5cGU7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVGNsX0ludGVycCAqaW50ZXJwOwotCWludCB3YW50b2JqZWN0czsKLQlpbnQgdGhyZWFkZWQ7IC8qIFRydWUgaWYgdGNsX3BsYXRmb3JtW3RocmVhZGVkXSAqLwotCVRjbF9UaHJlYWRJZCB0aHJlYWRfaWQ7Ci0JaW50IGRpc3BhdGNoaW5nOwotCS8qIFdlIGNhbm5vdCBpbmNsdWRlIHRjbEludC5oLCBhcyB0aGlzIGlzIGludGVybmFsLgotCSAgIFNvIHdlIGNhY2hlIGludGVyZXN0aW5nIHR5cGVzIGhlcmUuICovCi0JVGNsX09ialR5cGUgKkJvb2xlYW5UeXBlOwotCVRjbF9PYmpUeXBlICpCeXRlQXJyYXlUeXBlOwotCVRjbF9PYmpUeXBlICpEb3VibGVUeXBlOwotCVRjbF9PYmpUeXBlICpJbnRUeXBlOwotCVRjbF9PYmpUeXBlICpMaXN0VHlwZTsKLQlUY2xfT2JqVHlwZSAqUHJvY0JvZHlUeXBlOwotCVRjbF9PYmpUeXBlICpTdHJpbmdUeXBlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUY2xfSW50ZXJwICppbnRlcnA7CisgICAgaW50IHdhbnRvYmplY3RzOworICAgIGludCB0aHJlYWRlZDsgLyogVHJ1ZSBpZiB0Y2xfcGxhdGZvcm1bdGhyZWFkZWRdICovCisgICAgVGNsX1RocmVhZElkIHRocmVhZF9pZDsKKyAgICBpbnQgZGlzcGF0Y2hpbmc7CisgICAgLyogV2UgY2Fubm90IGluY2x1ZGUgdGNsSW50LmgsIGFzIHRoaXMgaXMgaW50ZXJuYWwuCisgICAgICAgU28gd2UgY2FjaGUgaW50ZXJlc3RpbmcgdHlwZXMgaGVyZS4gKi8KKyAgICBUY2xfT2JqVHlwZSAqQm9vbGVhblR5cGU7CisgICAgVGNsX09ialR5cGUgKkJ5dGVBcnJheVR5cGU7CisgICAgVGNsX09ialR5cGUgKkRvdWJsZVR5cGU7CisgICAgVGNsX09ialR5cGUgKkludFR5cGU7CisgICAgVGNsX09ialR5cGUgKkxpc3RUeXBlOworICAgIFRjbF9PYmpUeXBlICpQcm9jQm9keVR5cGU7CisgICAgVGNsX09ialR5cGUgKlN0cmluZ1R5cGU7CiB9IFRrYXBwT2JqZWN0OwogCiAjZGVmaW5lIFRrYXBwX0NoZWNrKHYpIChQeV9UWVBFKHYpID09ICZUa2FwcF9UeXBlKQpAQCAtMjcwLDcgKzI3MCw3IEBACiAodm9pZCAqKSB2LCBQeV9SRUZDTlQodikpKQogCiAKLQwKKwogLyoqKiogRXJyb3IgSGFuZGxpbmcgKioqKi8KIAogc3RhdGljIFB5T2JqZWN0ICpUa2ludGVyX1RjbEVycm9yOwpAQCAtMjg0LDE2ICsyODQsMTYgQEAKIHN0YXRpYyBpbnQgdGtfbG9hZF9mYWlsZWQ7CiAjZW5kaWYKIAotDAorCiBzdGF0aWMgUHlPYmplY3QgKgogVGtpbnRlcl9FcnJvcihQeU9iamVjdCAqdikKIHsKLQlQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgVGthcHBfUmVzdWx0KHYpKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgVGthcHBfUmVzdWx0KHYpKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCi0MCisKIC8qKioqIFV0aWxzICoqKiovCiAKIHN0YXRpYyBpbnQgVGtpbnRlcl9idXN5d2FpdGludGVydmFsID0gMjA7CkBAIC0zMDYsMTEgKzMwNiwxMSBAQAogc3RhdGljIHZvaWQKIFNsZWVwKGludCBtaWxsaSkKIHsKLQkvKiBYWFggVG9vIGJhZCBpZiB5b3UgZG9uJ3QgaGF2ZSBzZWxlY3QoKS4gKi8KLQlzdHJ1Y3QgdGltZXZhbCB0OwotCXQudHZfc2VjID0gbWlsbGkvMTAwMDsKLQl0LnR2X3VzZWMgPSAobWlsbGklMTAwMCkgKiAxMDAwOwotCXNlbGVjdCgwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdCk7CisgICAgLyogWFhYIFRvbyBiYWQgaWYgeW91IGRvbid0IGhhdmUgc2VsZWN0KCkuICovCisgICAgc3RydWN0IHRpbWV2YWwgdDsKKyAgICB0LnR2X3NlYyA9IG1pbGxpLzEwMDA7CisgICAgdC50dl91c2VjID0gKG1pbGxpJTEwMDApICogMTAwMDsKKyAgICBzZWxlY3QoMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgJnQpOwogfQogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIApAQCAtMzE5LDE3NCArMzE5LDE3NCBAQAogc3RhdGljIGludAogV2FpdEZvck1haW5sb29wKFRrYXBwT2JqZWN0KiBzZWxmKQogewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWlmIChzZWxmLT5kaXNwYXRjaGluZykKLQkJCXJldHVybiAxOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCVNsZWVwKDEwMCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCWlmIChzZWxmLT5kaXNwYXRjaGluZykKLQkJcmV0dXJuIDE7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIm1haW4gdGhyZWFkIGlzIG5vdCBpbiBtYWluIGxvb3AiKTsKLQlyZXR1cm4gMDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICBpZiAoc2VsZi0+ZGlzcGF0Y2hpbmcpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBTbGVlcCgxMDApOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBpZiAoc2VsZi0+ZGlzcGF0Y2hpbmcpCisgICAgICAgIHJldHVybiAxOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJtYWluIHRocmVhZCBpcyBub3QgaW4gbWFpbiBsb29wIik7CisgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogV0lUSF9USFJFQUQgKi8KIAotDAorCiBzdGF0aWMgY2hhciAqCiBBc1N0cmluZyhQeU9iamVjdCAqdmFsdWUsIFB5T2JqZWN0ICp0bXApCiB7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkKLQkJcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyh2YWx1ZSk7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKFB5TGlzdF9BcHBlbmQodG1wLCB2KSAhPSAwKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQl9CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcodmFsdWUpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHRtcCwgdikgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgfQogI2VuZGlmCi0JZWxzZSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoUHlMaXN0X0FwcGVuZCh0bXAsIHYpICE9IDApIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCX0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeU9iamVjdF9TdHIodmFsdWUpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHRtcCwgdikgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgfQogfQogCiAKLQwKKwogI2RlZmluZSBBUkdTWiA2NAogCiBzdGF0aWMgY2hhciAqCiBNZXJnZShQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdG1wID0gTlVMTDsKLQljaGFyICphcmd2U3RvcmVbQVJHU1pdOwotCWNoYXIgKiphcmd2ID0gTlVMTDsKLQlpbnQgZnZTdG9yZVtBUkdTWl07Ci0JaW50ICpmdiA9IE5VTEw7Ci0JaW50IGFyZ2MgPSAwLCBmdmMgPSAwLCBpOwotCWNoYXIgKnJlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRtcCA9IE5VTEw7CisgICAgY2hhciAqYXJndlN0b3JlW0FSR1NaXTsKKyAgICBjaGFyICoqYXJndiA9IE5VTEw7CisgICAgaW50IGZ2U3RvcmVbQVJHU1pdOworICAgIGludCAqZnYgPSBOVUxMOworICAgIGludCBhcmdjID0gMCwgZnZjID0gMCwgaTsKKyAgICBjaGFyICpyZXMgPSBOVUxMOwogCi0JaWYgKCEodG1wID0gUHlMaXN0X05ldygwKSkpCi0JICAgIHJldHVybiBOVUxMOworICAgIGlmICghKHRtcCA9IFB5TGlzdF9OZXcoMCkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFyZ3YgPSBhcmd2U3RvcmU7Ci0JZnYgPSBmdlN0b3JlOworICAgIGFyZ3YgPSBhcmd2U3RvcmU7CisgICAgZnYgPSBmdlN0b3JlOwogCi0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJYXJnYyA9IDA7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgYXJnYyA9IDA7CiAKLQllbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlhcmdjID0gMTsKLQkJZnZbMF0gPSAwOwotCQlpZiAoIShhcmd2WzBdID0gQXNTdHJpbmcoYXJncywgdG1wKSkpCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWVsc2UgewotCQlhcmdjID0gUHlUdXBsZV9TaXplKGFyZ3MpOworICAgIGVsc2UgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIGFyZ2MgPSAxOworICAgICAgICBmdlswXSA9IDA7CisgICAgICAgIGlmICghKGFyZ3ZbMF0gPSBBc1N0cmluZyhhcmdzLCB0bXApKSkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFyZ2MgPSBQeVR1cGxlX1NpemUoYXJncyk7CiAKLQkJaWYgKGFyZ2MgPiBBUkdTWikgewotCQkJYXJndiA9IChjaGFyICoqKWNrYWxsb2MoYXJnYyAqIHNpemVvZihjaGFyICopKTsKLQkJCWZ2ID0gKGludCAqKWNrYWxsb2MoYXJnYyAqIHNpemVvZihpbnQpKTsKLQkJCWlmIChhcmd2ID09IE5VTEwgfHwgZnYgPT0gTlVMTCkgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQotCQl9CisgICAgICAgIGlmIChhcmdjID4gQVJHU1opIHsKKyAgICAgICAgICAgIGFyZ3YgPSAoY2hhciAqKilja2FsbG9jKGFyZ2MgKiBzaXplb2YoY2hhciAqKSk7CisgICAgICAgICAgICBmdiA9IChpbnQgKilja2FsbG9jKGFyZ2MgKiBzaXplb2YoaW50KSk7CisgICAgICAgICAgICBpZiAoYXJndiA9PSBOVUxMIHx8IGZ2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLQkJCVB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOwotCQkJaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKLQkJCQlmdltpXSA9IDE7Ci0JCQkJaWYgKCEoYXJndltpXSA9IE1lcmdlKHYpKSkKLQkJCQkJZ290byBmaW5hbGx5OwotCQkJCWZ2YysrOwotCQkJfQotCQkJZWxzZSBpZiAodiA9PSBQeV9Ob25lKSB7Ci0JCQkJYXJnYyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmdltpXSA9IDA7Ci0JCQkJaWYgKCEoYXJndltpXSA9IEFzU3RyaW5nKHYsIHRtcCkpKQotCQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQkJZnZjKys7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmVzID0gVGNsX01lcmdlKGFyZ2MsIGFyZ3YpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsICJtZXJnZSBmYWlsZWQiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7CisgICAgICAgICAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIGZ2W2ldID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIShhcmd2W2ldID0gTWVyZ2UodikpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICAgICAgZnZjKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBhcmdjID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZ2W2ldID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIShhcmd2W2ldID0gQXNTdHJpbmcodiwgdG1wKSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgICAgICBmdmMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXMgPSBUY2xfTWVyZ2UoYXJnYywgYXJndik7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgIm1lcmdlIGZhaWxlZCIpOwogCiAgIGZpbmFsbHk6Ci0JZm9yIChpID0gMDsgaSA8IGZ2YzsgaSsrKQotCQlpZiAoZnZbaV0pIHsKLQkJCWNrZnJlZShhcmd2W2ldKTsKLQkJfQotCWlmIChhcmd2ICE9IGFyZ3ZTdG9yZSkKLQkJY2tmcmVlKEZSRUVDQVNUIGFyZ3YpOwotCWlmIChmdiAhPSBmdlN0b3JlKQotCQlja2ZyZWUoRlJFRUNBU1QgZnYpOworICAgIGZvciAoaSA9IDA7IGkgPCBmdmM7IGkrKykKKyAgICAgICAgaWYgKGZ2W2ldKSB7CisgICAgICAgICAgICBja2ZyZWUoYXJndltpXSk7CisgICAgICAgIH0KKyAgICBpZiAoYXJndiAhPSBhcmd2U3RvcmUpCisgICAgICAgIGNrZnJlZShGUkVFQ0FTVCBhcmd2KTsKKyAgICBpZiAoZnYgIT0gZnZTdG9yZSkKKyAgICAgICAgY2tmcmVlKEZSRUVDQVNUIGZ2KTsKIAotCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiByZXM7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCi0MCisKIHN0YXRpYyBQeU9iamVjdCAqCiBTcGxpdChjaGFyICpsaXN0KQogewotCWludCBhcmdjOwotCWNoYXIgKiphcmd2OwotCVB5T2JqZWN0ICp2OworICAgIGludCBhcmdjOworICAgIGNoYXIgKiphcmd2OworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKGxpc3QgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogCi0JaWYgKFRjbF9TcGxpdExpc3QoKFRjbF9JbnRlcnAgKilOVUxMLCBsaXN0LCAmYXJnYywgJmFyZ3YpICE9IFRDTF9PSykgewotCQkvKiBOb3QgYSBsaXN0LgotCQkgKiBDb3VsZCBiZSBhIHF1b3RlZCBzdHJpbmcgY29udGFpbmluZyBmdW5uaWVzLCBlLmcuIHsifS4KLQkJICogUmV0dXJuIHRoZSBzdHJpbmcgaXRzZWxmLgotCQkgKi8KLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobGlzdCk7Ci0JfQorICAgIGlmIChUY2xfU3BsaXRMaXN0KChUY2xfSW50ZXJwICopTlVMTCwgbGlzdCwgJmFyZ2MsICZhcmd2KSAhPSBUQ0xfT0spIHsKKyAgICAgICAgLyogTm90IGEgbGlzdC4KKyAgICAgICAgICogQ291bGQgYmUgYSBxdW90ZWQgc3RyaW5nIGNvbnRhaW5pbmcgZnVubmllcywgZS5nLiB7In0uCisgICAgICAgICAqIFJldHVybiB0aGUgc3RyaW5nIGl0c2VsZi4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGxpc3QpOworICAgIH0KIAotCWlmIChhcmdjID09IDApCi0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQllbHNlIGlmIChhcmdjID09IDEpCi0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbMF0pOwotCWVsc2UgaWYgKCh2ID0gUHlUdXBsZV9OZXcoYXJnYykpICE9IE5VTEwpIHsKLQkJaW50IGk7Ci0JCVB5T2JqZWN0ICp3OworICAgIGlmIChhcmdjID09IDApCisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICBlbHNlIGlmIChhcmdjID09IDEpCisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbMF0pOworICAgIGVsc2UgaWYgKCh2ID0gUHlUdXBsZV9OZXcoYXJnYykpICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIFB5T2JqZWN0ICp3OwogCi0JCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLQkJCWlmICgodyA9IFNwbGl0KGFyZ3ZbaV0pKSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCXYgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUHlUdXBsZV9TZXRJdGVtKHYsIGksIHcpOwotCQl9Ci0JfQotCVRjbF9GcmVlKEZSRUVDQVNUIGFyZ3YpOwotCXJldHVybiB2OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKHcgPSBTcGxpdChhcmd2W2ldKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCB3KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBUY2xfRnJlZShGUkVFQ0FTVCBhcmd2KTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyogSW4gc29tZSBjYXNlcywgVGNsIHdpbGwgc3RpbGwgcmV0dXJuIHN0cmluZ3MgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUKQEAgLTQ5NiwxMDMgKzQ5NiwxMDMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBTcGxpdE9iaihQeU9iamVjdCAqYXJnKQogewotCWlmIChQeVR1cGxlX0NoZWNrKGFyZykpIHsKLQkJaW50IGksIHNpemU7Ci0JCVB5T2JqZWN0ICplbGVtLCAqbmV3ZWxlbSwgKnJlc3VsdDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhhcmcpKSB7CisgICAgICAgIGludCBpLCBzaXplOworICAgICAgICBQeU9iamVjdCAqZWxlbSwgKm5ld2VsZW0sICpyZXN1bHQ7CiAKLQkJc2l6ZSA9IFB5VHVwbGVfU2l6ZShhcmcpOwotCQlyZXN1bHQgPSBOVUxMOwotCQkvKiBSZWN1cnNpdmVseSBpbnZva2UgU3BsaXRPYmogZm9yIGFsbCB0dXBsZSBpdGVtcy4KLQkJICAgSWYgdGhpcyBkb2VzIG5vdCByZXR1cm4gYSBuZXcgb2JqZWN0LCBubyBhY3Rpb24gaXMKLQkJICAgbmVlZGVkLiAqLwotCQlmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWVsZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJnLCBpKTsKLQkJCW5ld2VsZW0gPSBTcGxpdE9iaihlbGVtKTsKLQkJCWlmICghbmV3ZWxlbSkgewotCQkJCVB5X1hERUNSRUYocmVzdWx0KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJaW50IGs7Ci0JCQkJaWYgKG5ld2VsZW0gPT0gZWxlbSkgewotCQkJCQlQeV9ERUNSRUYobmV3ZWxlbSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlyZXN1bHQgPSBQeVR1cGxlX05ldyhzaXplKTsKLQkJCQlpZiAoIXJlc3VsdCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJZm9yKGsgPSAwOyBrIDwgaTsgaysrKSB7Ci0JCQkJCWVsZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJnLCBrKTsKLQkJCQkJUHlfSU5DUkVGKGVsZW0pOwotCQkJCQlQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBrLCBlbGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCQlQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBpLCBuZXdlbGVtKTsKLQkJfQotCQlpZiAocmVzdWx0KQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJLyogRmFsbCB0aHJvdWdoLCByZXR1cm5pbmcgYXJnLiAqLwotCX0KLQllbHNlIGlmIChQeVN0cmluZ19DaGVjayhhcmcpKSB7Ci0JCWludCBhcmdjOwotCQljaGFyICoqYXJndjsKLQkJY2hhciAqbGlzdCA9IFB5U3RyaW5nX0FzU3RyaW5nKGFyZyk7CisgICAgICAgIHNpemUgPSBQeVR1cGxlX1NpemUoYXJnKTsKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgLyogUmVjdXJzaXZlbHkgaW52b2tlIFNwbGl0T2JqIGZvciBhbGwgdHVwbGUgaXRlbXMuCisgICAgICAgICAgIElmIHRoaXMgZG9lcyBub3QgcmV0dXJuIGEgbmV3IG9iamVjdCwgbm8gYWN0aW9uIGlzCisgICAgICAgICAgIG5lZWRlZC4gKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HZXRJdGVtKGFyZywgaSk7CisgICAgICAgICAgICBuZXdlbGVtID0gU3BsaXRPYmooZWxlbSk7CisgICAgICAgICAgICBpZiAoIW5ld2VsZW0pIHsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgICAgIGlmIChuZXdlbGVtID09IGVsZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld2VsZW0pOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcoc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IGk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HZXRJdGVtKGFyZywgayk7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaywgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaSwgbmV3ZWxlbSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaCwgcmV0dXJuaW5nIGFyZy4gKi8KKyAgICB9CisgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgICAgICBpbnQgYXJnYzsKKyAgICAgICAgY2hhciAqKmFyZ3Y7CisgICAgICAgIGNoYXIgKmxpc3QgPSBQeVN0cmluZ19Bc1N0cmluZyhhcmcpOwogCi0JCWlmIChUY2xfU3BsaXRMaXN0KChUY2xfSW50ZXJwICopTlVMTCwgbGlzdCwgJmFyZ2MsICZhcmd2KSAhPSBUQ0xfT0spIHsKLQkJCVB5X0lOQ1JFRihhcmcpOwotCQkJcmV0dXJuIGFyZzsKLQkJfQotCQlUY2xfRnJlZShGUkVFQ0FTVCBhcmd2KTsKLQkJaWYgKGFyZ2MgPiAxKQotCQkJcmV0dXJuIFNwbGl0KFB5U3RyaW5nX0FzU3RyaW5nKGFyZykpOwotCQkvKiBGYWxsIHRocm91Z2gsIHJldHVybmluZyBhcmcuICovCi0JfQotCVB5X0lOQ1JFRihhcmcpOwotCXJldHVybiBhcmc7CisgICAgICAgIGlmIChUY2xfU3BsaXRMaXN0KChUY2xfSW50ZXJwICopTlVMTCwgbGlzdCwgJmFyZ2MsICZhcmd2KSAhPSBUQ0xfT0spIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihhcmcpOworICAgICAgICAgICAgcmV0dXJuIGFyZzsKKyAgICAgICAgfQorICAgICAgICBUY2xfRnJlZShGUkVFQ0FTVCBhcmd2KTsKKyAgICAgICAgaWYgKGFyZ2MgPiAxKQorICAgICAgICAgICAgcmV0dXJuIFNwbGl0KFB5U3RyaW5nX0FzU3RyaW5nKGFyZykpOworICAgICAgICAvKiBGYWxsIHRocm91Z2gsIHJldHVybmluZyBhcmcuICovCisgICAgfQorICAgIFB5X0lOQ1JFRihhcmcpOworICAgIHJldHVybiBhcmc7CiB9CiAKLQwKKwogLyoqKiogVGthcHAgT2JqZWN0ICoqKiovCiAKICNpZm5kZWYgV0lUSF9BUFBJTklUCiBpbnQKIFRjbF9BcHBJbml0KFRjbF9JbnRlcnAgKmludGVycCkKIHsKLQljb25zdCBjaGFyICogX3RraW50ZXJfc2tpcF90a19pbml0OworICAgIGNvbnN0IGNoYXIgKiBfdGtpbnRlcl9za2lwX3RrX2luaXQ7CiAKLQlpZiAoVGNsX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIlRjbF9Jbml0IGVycm9yOiAlc1xuIiwgVGNsX0dldFN0cmluZ1Jlc3VsdChpbnRlcnApKTsKLQkJcmV0dXJuIFRDTF9FUlJPUjsKLQl9CisgICAgaWYgKFRjbF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJUY2xfSW5pdCBlcnJvcjogJXNcbiIsIFRjbF9HZXRTdHJpbmdSZXN1bHQoaW50ZXJwKSk7CisgICAgICAgIHJldHVybiBUQ0xfRVJST1I7CisgICAgfQogCi0JX3RraW50ZXJfc2tpcF90a19pbml0ID0gVGNsX0dldFZhcihpbnRlcnAsCi0JCQkiX3RraW50ZXJfc2tpcF90a19pbml0IiwgVENMX0dMT0JBTF9PTkxZKTsKLQlpZiAoX3RraW50ZXJfc2tpcF90a19pbml0ICE9IE5VTEwgJiYKLQkJCXN0cmNtcChfdGtpbnRlcl9za2lwX3RrX2luaXQsICIxIikgPT0gMCkgewotCQlyZXR1cm4gVENMX09LOwotCX0KKyAgICBfdGtpbnRlcl9za2lwX3RrX2luaXQgPSBUY2xfR2V0VmFyKGludGVycCwKKyAgICAgICAgICAgICAgICAgICAgIl90a2ludGVyX3NraXBfdGtfaW5pdCIsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgaWYgKF90a2ludGVyX3NraXBfdGtfaW5pdCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgIHN0cmNtcChfdGtpbnRlcl9za2lwX3RrX2luaXQsICIxIikgPT0gMCkgeworICAgICAgICByZXR1cm4gVENMX09LOworICAgIH0KIAogI2lmZGVmIFRLSU5URVJfUFJPVEVDVF9MT0FEVEsKLQlpZiAodGtfbG9hZF9mYWlsZWQpIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIlRrX0luaXQgZXJyb3I6ICVzXG4iLCBUS0lOVEVSX0xPQURUS19FUlJNU0cpOwotCQlyZXR1cm4gVENMX0VSUk9SOwotCX0KKyAgICBpZiAodGtfbG9hZF9mYWlsZWQpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIlRrX0luaXQgZXJyb3I6ICVzXG4iLCBUS0lOVEVSX0xPQURUS19FUlJNU0cpOworICAgICAgICByZXR1cm4gVENMX0VSUk9SOworICAgIH0KICNlbmRpZgogCi0JaWYgKFRrX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKKyAgICBpZiAoVGtfSW5pdChpbnRlcnApID09IFRDTF9FUlJPUikgewogI2lmZGVmIFRLSU5URVJfUFJPVEVDVF9MT0FEVEsKLQkJdGtfbG9hZF9mYWlsZWQgPSAxOworICAgICAgICB0a19sb2FkX2ZhaWxlZCA9IDE7CiAjZW5kaWYKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIlRrX0luaXQgZXJyb3I6ICVzXG4iLCBUY2xfR2V0U3RyaW5nUmVzdWx0KGludGVycCkpOwotCQlyZXR1cm4gVENMX0VSUk9SOwotCX0KKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIlRrX0luaXQgZXJyb3I6ICVzXG4iLCBUY2xfR2V0U3RyaW5nUmVzdWx0KGludGVycCkpOworICAgICAgICByZXR1cm4gVENMX0VSUk9SOworICAgIH0KIAotCXJldHVybiBUQ0xfT0s7CisgICAgcmV0dXJuIFRDTF9PSzsKIH0KICNlbmRpZiAvKiAhV0lUSF9BUFBJTklUICovCiAKIAotDAorCiAKIC8qIEluaXRpYWxpemUgdGhlIFRrIGFwcGxpY2F0aW9uOyBzZWUgdGhlIGBtYWluJyBmdW5jdGlvbiBpbgogICogYHRrTWFpbi5jJy4KQEAgLTYwMywyMzUgKzYwMywyMzUgQEAKIAogc3RhdGljIFRrYXBwT2JqZWN0ICoKIFRrYXBwX05ldyhjaGFyICpzY3JlZW5OYW1lLCBjaGFyICpiYXNlTmFtZSwgY2hhciAqY2xhc3NOYW1lLAotCSAgaW50IGludGVyYWN0aXZlLCBpbnQgd2FudG9iamVjdHMsIGludAl3YW50VGssIGludCBzeW5jLCBjaGFyICp1c2UpCisgICAgICAgICAgaW50IGludGVyYWN0aXZlLCBpbnQgd2FudG9iamVjdHMsIGludCB3YW50VGssIGludCBzeW5jLCBjaGFyICp1c2UpCiB7Ci0JVGthcHBPYmplY3QgKnY7Ci0JY2hhciAqYXJndjA7CisgICAgVGthcHBPYmplY3QgKnY7CisgICAgY2hhciAqYXJndjA7CiAKLQl2ID0gUHlPYmplY3RfTmV3KFRrYXBwT2JqZWN0LCAmVGthcHBfVHlwZSk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgdiA9IFB5T2JqZWN0X05ldyhUa2FwcE9iamVjdCwgJlRrYXBwX1R5cGUpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jdi0+aW50ZXJwID0gVGNsX0NyZWF0ZUludGVycCgpOwotCXYtPndhbnRvYmplY3RzID0gd2FudG9iamVjdHM7Ci0Jdi0+dGhyZWFkZWQgPSBUY2xfR2V0VmFyMkV4KHYtPmludGVycCwgInRjbF9wbGF0Zm9ybSIsICJ0aHJlYWRlZCIsCi0JCQkJICAgIFRDTF9HTE9CQUxfT05MWSkgIT0gTlVMTDsKLQl2LT50aHJlYWRfaWQgPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpOwotCXYtPmRpc3BhdGNoaW5nID0gMDsKKyAgICB2LT5pbnRlcnAgPSBUY2xfQ3JlYXRlSW50ZXJwKCk7CisgICAgdi0+d2FudG9iamVjdHMgPSB3YW50b2JqZWN0czsKKyAgICB2LT50aHJlYWRlZCA9IFRjbF9HZXRWYXIyRXgodi0+aW50ZXJwLCAidGNsX3BsYXRmb3JtIiwgInRocmVhZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENMX0dMT0JBTF9PTkxZKSAhPSBOVUxMOworICAgIHYtPnRocmVhZF9pZCA9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCk7CisgICAgdi0+ZGlzcGF0Y2hpbmcgPSAwOwogCiAjaWZuZGVmIFRDTF9USFJFQURTCi0JaWYgKHYtPnRocmVhZGVkKSB7Ci0JICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJUY2wgaXMgdGhyZWFkZWQgYnV0IF90a2ludGVyIGlzIG5vdCIpOwotCSAgICBQeV9ERUNSRUYodik7Ci0JICAgIHJldHVybiAwOwotCX0KKyAgICBpZiAodi0+dGhyZWFkZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIlRjbCBpcyB0aHJlYWRlZCBidXQgX3RraW50ZXIgaXMgbm90Iik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogI2VuZGlmCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAodi0+dGhyZWFkZWQgJiYgdGNsX2xvY2spIHsKLQkgICAgLyogSWYgVGNsIGlzIHRocmVhZGVkLCB3ZSBkb24ndCBuZWVkIHRoZSBsb2NrLiAqLwotCSAgICBQeVRocmVhZF9mcmVlX2xvY2sodGNsX2xvY2spOwotCSAgICB0Y2xfbG9jayA9IE5VTEw7Ci0JfQorICAgIGlmICh2LT50aHJlYWRlZCAmJiB0Y2xfbG9jaykgeworICAgICAgICAvKiBJZiBUY2wgaXMgdGhyZWFkZWQsIHdlIGRvbid0IG5lZWQgdGhlIGxvY2suICovCisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayh0Y2xfbG9jayk7CisgICAgICAgIHRjbF9sb2NrID0gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCXYtPkJvb2xlYW5UeXBlID0gVGNsX0dldE9ialR5cGUoImJvb2xlYW4iKTsKLQl2LT5CeXRlQXJyYXlUeXBlID0gVGNsX0dldE9ialR5cGUoImJ5dGVhcnJheSIpOwotCXYtPkRvdWJsZVR5cGUgPSBUY2xfR2V0T2JqVHlwZSgiZG91YmxlIik7Ci0Jdi0+SW50VHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJpbnQiKTsKLQl2LT5MaXN0VHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJsaXN0Iik7Ci0Jdi0+UHJvY0JvZHlUeXBlID0gVGNsX0dldE9ialR5cGUoInByb2Nib2R5Iik7Ci0Jdi0+U3RyaW5nVHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJzdHJpbmciKTsKKyAgICB2LT5Cb29sZWFuVHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJib29sZWFuIik7CisgICAgdi0+Qnl0ZUFycmF5VHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJieXRlYXJyYXkiKTsKKyAgICB2LT5Eb3VibGVUeXBlID0gVGNsX0dldE9ialR5cGUoImRvdWJsZSIpOworICAgIHYtPkludFR5cGUgPSBUY2xfR2V0T2JqVHlwZSgiaW50Iik7CisgICAgdi0+TGlzdFR5cGUgPSBUY2xfR2V0T2JqVHlwZSgibGlzdCIpOworICAgIHYtPlByb2NCb2R5VHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJwcm9jYm9keSIpOworICAgIHYtPlN0cmluZ1R5cGUgPSBUY2xfR2V0T2JqVHlwZSgic3RyaW5nIik7CiAKLQkvKiBEZWxldGUgdGhlICdleGl0JyBjb21tYW5kLCB3aGljaCBjYW4gc2NyZXcgdGhpbmdzIHVwICovCi0JVGNsX0RlbGV0ZUNvbW1hbmQodi0+aW50ZXJwLCAiZXhpdCIpOworICAgIC8qIERlbGV0ZSB0aGUgJ2V4aXQnIGNvbW1hbmQsIHdoaWNoIGNhbiBzY3JldyB0aGluZ3MgdXAgKi8KKyAgICBUY2xfRGVsZXRlQ29tbWFuZCh2LT5pbnRlcnAsICJleGl0Iik7CiAKLQlpZiAoc2NyZWVuTmFtZSAhPSBOVUxMKQotCQlUY2xfU2V0VmFyMih2LT5pbnRlcnAsICJlbnYiLCAiRElTUExBWSIsCi0JCQkgICAgc2NyZWVuTmFtZSwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICBpZiAoc2NyZWVuTmFtZSAhPSBOVUxMKQorICAgICAgICBUY2xfU2V0VmFyMih2LT5pbnRlcnAsICJlbnYiLCAiRElTUExBWSIsCisgICAgICAgICAgICAgICAgICAgIHNjcmVlbk5hbWUsIFRDTF9HTE9CQUxfT05MWSk7CiAKLQlpZiAoaW50ZXJhY3RpdmUpCi0JCVRjbF9TZXRWYXIodi0+aW50ZXJwLCAidGNsX2ludGVyYWN0aXZlIiwgIjEiLCBUQ0xfR0xPQkFMX09OTFkpOwotCWVsc2UKLQkJVGNsX1NldFZhcih2LT5pbnRlcnAsICJ0Y2xfaW50ZXJhY3RpdmUiLCAiMCIsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgaWYgKGludGVyYWN0aXZlKQorICAgICAgICBUY2xfU2V0VmFyKHYtPmludGVycCwgInRjbF9pbnRlcmFjdGl2ZSIsICIxIiwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICBlbHNlCisgICAgICAgIFRjbF9TZXRWYXIodi0+aW50ZXJwLCAidGNsX2ludGVyYWN0aXZlIiwgIjAiLCBUQ0xfR0xPQkFMX09OTFkpOwogCi0JLyogVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgYXBwbGljYXRpb24gY2xhc3MgZm9yIFRrIDQuMSBhbmQgdXAgKi8KLQlhcmd2MCA9IChjaGFyKilja2FsbG9jKHN0cmxlbihjbGFzc05hbWUpICsgMSk7Ci0JaWYgKCFhcmd2MCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBhcHBsaWNhdGlvbiBjbGFzcyBmb3IgVGsgNC4xIGFuZCB1cCAqLworICAgIGFyZ3YwID0gKGNoYXIqKWNrYWxsb2Moc3RybGVuKGNsYXNzTmFtZSkgKyAxKTsKKyAgICBpZiAoIWFyZ3YwKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3RyY3B5KGFyZ3YwLCBjbGFzc05hbWUpOwotCWlmIChpc3VwcGVyKFB5X0NIQVJNQVNLKGFyZ3YwWzBdKSkpCi0JCWFyZ3YwWzBdID0gdG9sb3dlcihQeV9DSEFSTUFTSyhhcmd2MFswXSkpOwotCVRjbF9TZXRWYXIodi0+aW50ZXJwLCAiYXJndjAiLCBhcmd2MCwgVENMX0dMT0JBTF9PTkxZKTsKLQlja2ZyZWUoYXJndjApOworICAgIHN0cmNweShhcmd2MCwgY2xhc3NOYW1lKTsKKyAgICBpZiAoaXN1cHBlcihQeV9DSEFSTUFTSyhhcmd2MFswXSkpKQorICAgICAgICBhcmd2MFswXSA9IHRvbG93ZXIoUHlfQ0hBUk1BU0soYXJndjBbMF0pKTsKKyAgICBUY2xfU2V0VmFyKHYtPmludGVycCwgImFyZ3YwIiwgYXJndjAsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgY2tmcmVlKGFyZ3YwKTsKIAotCWlmICghIHdhbnRUaykgewotCQlUY2xfU2V0VmFyKHYtPmludGVycCwKLQkJCQkiX3RraW50ZXJfc2tpcF90a19pbml0IiwgIjEiLCBUQ0xfR0xPQkFMX09OTFkpOwotCX0KKyAgICBpZiAoISB3YW50VGspIHsKKyAgICAgICAgVGNsX1NldFZhcih2LT5pbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAiX3RraW50ZXJfc2tpcF90a19pbml0IiwgIjEiLCBUQ0xfR0xPQkFMX09OTFkpOworICAgIH0KICNpZmRlZiBUS0lOVEVSX1BST1RFQ1RfTE9BRFRLCi0JZWxzZSBpZiAodGtfbG9hZF9mYWlsZWQpIHsKLQkJVGNsX1NldFZhcih2LT5pbnRlcnAsCi0JCQkJIl90a2ludGVyX3RrX2ZhaWxlZCIsICIxIiwgVENMX0dMT0JBTF9PTkxZKTsKLQl9CisgICAgZWxzZSBpZiAodGtfbG9hZF9mYWlsZWQpIHsKKyAgICAgICAgVGNsX1NldFZhcih2LT5pbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAiX3RraW50ZXJfdGtfZmFpbGVkIiwgIjEiLCBUQ0xfR0xPQkFMX09OTFkpOworICAgIH0KICNlbmRpZgogCi0JLyogc29tZSBpbml0aWFsIGFyZ3VtZW50cyBuZWVkIHRvIGJlIGluIGFyZ3YgKi8KLQlpZiAoc3luYyB8fCB1c2UpIHsKLQkJY2hhciAqYXJnczsKLQkJaW50IGxlbiA9IDA7CisgICAgLyogc29tZSBpbml0aWFsIGFyZ3VtZW50cyBuZWVkIHRvIGJlIGluIGFyZ3YgKi8KKyAgICBpZiAoc3luYyB8fCB1c2UpIHsKKyAgICAgICAgY2hhciAqYXJnczsKKyAgICAgICAgaW50IGxlbiA9IDA7CiAKLQkJaWYgKHN5bmMpCi0JCQlsZW4gKz0gc2l6ZW9mICItc3luYyI7Ci0JCWlmICh1c2UpCi0JCQlsZW4gKz0gc3RybGVuKHVzZSkgKyBzaXplb2YgIi11c2UgIjsKKyAgICAgICAgaWYgKHN5bmMpCisgICAgICAgICAgICBsZW4gKz0gc2l6ZW9mICItc3luYyI7CisgICAgICAgIGlmICh1c2UpCisgICAgICAgICAgICBsZW4gKz0gc3RybGVuKHVzZSkgKyBzaXplb2YgIi11c2UgIjsKIAotCQlhcmdzID0gKGNoYXIqKWNrYWxsb2MobGVuKTsKLQkJaWYgKCFhcmdzKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgYXJncyA9IChjaGFyKilja2FsbG9jKGxlbik7CisgICAgICAgIGlmICghYXJncykgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJYXJnc1swXSA9ICdcMCc7Ci0JCWlmIChzeW5jKQotCQkJc3RyY2F0KGFyZ3MsICItc3luYyIpOwotCQlpZiAodXNlKSB7Ci0JCQlpZiAoc3luYykKLQkJCQlzdHJjYXQoYXJncywgIiAiKTsKLQkJCXN0cmNhdChhcmdzLCAiLXVzZSAiKTsKLQkJCXN0cmNhdChhcmdzLCB1c2UpOwotCQl9CisgICAgICAgIGFyZ3NbMF0gPSAnXDAnOworICAgICAgICBpZiAoc3luYykKKyAgICAgICAgICAgIHN0cmNhdChhcmdzLCAiLXN5bmMiKTsKKyAgICAgICAgaWYgKHVzZSkgeworICAgICAgICAgICAgaWYgKHN5bmMpCisgICAgICAgICAgICAgICAgc3RyY2F0KGFyZ3MsICIgIik7CisgICAgICAgICAgICBzdHJjYXQoYXJncywgIi11c2UgIik7CisgICAgICAgICAgICBzdHJjYXQoYXJncywgdXNlKTsKKyAgICAgICAgfQogCi0JCVRjbF9TZXRWYXIodi0+aW50ZXJwLCAiYXJndiIsIGFyZ3MsIFRDTF9HTE9CQUxfT05MWSk7Ci0JCWNrZnJlZShhcmdzKTsKLQl9CisgICAgICAgIFRjbF9TZXRWYXIodi0+aW50ZXJwLCAiYXJndiIsIGFyZ3MsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgICAgIGNrZnJlZShhcmdzKTsKKyAgICB9CiAKLQlpZiAoVGNsX0FwcEluaXQodi0+aW50ZXJwKSAhPSBUQ0xfT0spIHsKLQkJUHlPYmplY3QgKnJlc3VsdCA9IFRraW50ZXJfRXJyb3IoKFB5T2JqZWN0ICopdik7CisgICAgaWYgKFRjbF9BcHBJbml0KHYtPmludGVycCkgIT0gVENMX09LKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBUa2ludGVyX0Vycm9yKChQeU9iamVjdCAqKXYpOwogI2lmZGVmIFRLSU5URVJfUFJPVEVDVF9MT0FEVEsKLQkJaWYgKHdhbnRUaykgewotCQkJY29uc3QgY2hhciAqX3RraW50ZXJfdGtfZmFpbGVkOwotCQkJX3RraW50ZXJfdGtfZmFpbGVkID0gVGNsX0dldFZhcih2LT5pbnRlcnAsCi0JCQkJCSJfdGtpbnRlcl90a19mYWlsZWQiLCBUQ0xfR0xPQkFMX09OTFkpOworICAgICAgICBpZiAod2FudFRrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpfdGtpbnRlcl90a19mYWlsZWQ7CisgICAgICAgICAgICBfdGtpbnRlcl90a19mYWlsZWQgPSBUY2xfR2V0VmFyKHYtPmludGVycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3RraW50ZXJfdGtfZmFpbGVkIiwgVENMX0dMT0JBTF9PTkxZKTsKIAotCQkJaWYgKCBfdGtpbnRlcl90a19mYWlsZWQgIT0gTlVMTCAmJgotCQkJCQlzdHJjbXAoX3RraW50ZXJfdGtfZmFpbGVkLCAiMSIpID09IDApIHsKLQkJCQl0a19sb2FkX2ZhaWxlZCA9IDE7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIGlmICggX3RraW50ZXJfdGtfZmFpbGVkICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoX3RraW50ZXJfdGtfZmFpbGVkLCAiMSIpID09IDApIHsKKyAgICAgICAgICAgICAgICB0a19sb2FkX2ZhaWxlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbmRpZgotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopdik7Ci0JCXJldHVybiAoVGthcHBPYmplY3QgKilyZXN1bHQ7Ci0JfQorICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopdik7CisgICAgICAgIHJldHVybiAoVGthcHBPYmplY3QgKilyZXN1bHQ7CisgICAgfQogCi0JRW5hYmxlRXZlbnRIb29rKCk7CisgICAgRW5hYmxlRXZlbnRIb29rKCk7CiAKLQlyZXR1cm4gdjsKKyAgICByZXR1cm4gdjsKIH0KIAogCiAjaWZkZWYgV0lUSF9USFJFQUQKIHN0YXRpYyB2b2lkCiBUa2FwcF9UaHJlYWRTZW5kKFRrYXBwT2JqZWN0ICpzZWxmLCBUY2xfRXZlbnQgKmV2LAotCQkgVGNsX0NvbmRpdGlvbiAqY29uZCwgVGNsX011dGV4ICptdXRleCkKKyAgICAgICAgICAgICAgICAgVGNsX0NvbmRpdGlvbiAqY29uZCwgVGNsX011dGV4ICptdXRleCkKIHsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTOwotCVRjbF9NdXRleExvY2sobXV0ZXgpOwotCVRjbF9UaHJlYWRRdWV1ZUV2ZW50KHNlbGYtPnRocmVhZF9pZCwgZXYsIFRDTF9RVUVVRV9UQUlMKTsKLQlUY2xfVGhyZWFkQWxlcnQoc2VsZi0+dGhyZWFkX2lkKTsKLQlUY2xfQ29uZGl0aW9uV2FpdChjb25kLCBtdXRleCwgTlVMTCk7Ci0JVGNsX011dGV4VW5sb2NrKG11dGV4KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFM7CisgICAgVGNsX011dGV4TG9jayhtdXRleCk7CisgICAgVGNsX1RocmVhZFF1ZXVlRXZlbnQoc2VsZi0+dGhyZWFkX2lkLCBldiwgVENMX1FVRVVFX1RBSUwpOworICAgIFRjbF9UaHJlYWRBbGVydChzZWxmLT50aHJlYWRfaWQpOworICAgIFRjbF9Db25kaXRpb25XYWl0KGNvbmQsIG11dGV4LCBOVUxMKTsKKyAgICBUY2xfTXV0ZXhVbmxvY2sobXV0ZXgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiB9CiAjZW5kaWYKIAotDAorCiAvKiogVGNsIEV2YWwgKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVGNsX09iaiAqdmFsdWU7Ci0JUHlPYmplY3QgKnN0cmluZzsgLyogVGhpcyBjYW5ub3QgY2F1c2UgY3ljbGVzLiAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUY2xfT2JqICp2YWx1ZTsKKyAgICBQeU9iamVjdCAqc3RyaW5nOyAvKiBUaGlzIGNhbm5vdCBjYXVzZSBjeWNsZXMuICovCiB9IFB5VGNsT2JqZWN0OwogCiBzdGF0aWNmb3J3YXJkIFB5VHlwZU9iamVjdCBQeVRjbE9iamVjdF9UeXBlOwotI2RlZmluZSBQeVRjbE9iamVjdF9DaGVjayh2KQkoKHYpLT5vYl90eXBlID09ICZQeVRjbE9iamVjdF9UeXBlKQorI2RlZmluZSBQeVRjbE9iamVjdF9DaGVjayh2KSAgICAoKHYpLT5vYl90eXBlID09ICZQeVRjbE9iamVjdF9UeXBlKQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3UHlUY2xPYmplY3QoVGNsX09iaiAqYXJnKQogewotCVB5VGNsT2JqZWN0ICpzZWxmOwotCXNlbGYgPSBQeU9iamVjdF9OZXcoUHlUY2xPYmplY3QsICZQeVRjbE9iamVjdF9UeXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlUY2xfSW5jclJlZkNvdW50KGFyZyk7Ci0Jc2VsZi0+dmFsdWUgPSBhcmc7Ci0Jc2VsZi0+c3RyaW5nID0gTlVMTDsKLQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIFB5VGNsT2JqZWN0ICpzZWxmOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoUHlUY2xPYmplY3QsICZQeVRjbE9iamVjdF9UeXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUY2xfSW5jclJlZkNvdW50KGFyZyk7CisgICAgc2VsZi0+dmFsdWUgPSBhcmc7CisgICAgc2VsZi0+c3RyaW5nID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOwogfQogCiBzdGF0aWMgdm9pZAogUHlUY2xPYmplY3RfZGVhbGxvYyhQeVRjbE9iamVjdCAqc2VsZikKIHsKLQlUY2xfRGVjclJlZkNvdW50KHNlbGYtPnZhbHVlKTsKLQlQeV9YREVDUkVGKHNlbGYtPnN0cmluZyk7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIFRjbF9EZWNyUmVmQ291bnQoc2VsZi0+dmFsdWUpOworICAgIFB5X1hERUNSRUYoc2VsZi0+c3RyaW5nKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeVRjbE9iamVjdF9zdHIoUHlUY2xPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPnN0cmluZyAmJiBQeVN0cmluZ19DaGVjayhzZWxmLT5zdHJpbmcpKSB7Ci0JCVB5X0lOQ1JFRihzZWxmLT5zdHJpbmcpOwotCQlyZXR1cm4gc2VsZi0+c3RyaW5nOwotCX0KLQkvKiBYWFggQ291bGQgY2FjaGUgdmFsdWUgaWYgaXQgaXMgYW4gQVNDSUkgc3RyaW5nLiAqLwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKFRjbF9HZXRTdHJpbmcoc2VsZi0+dmFsdWUpKTsKKyAgICBpZiAoc2VsZi0+c3RyaW5nICYmIFB5U3RyaW5nX0NoZWNrKHNlbGYtPnN0cmluZykpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnN0cmluZyk7CisgICAgICAgIHJldHVybiBzZWxmLT5zdHJpbmc7CisgICAgfQorICAgIC8qIFhYWCBDb3VsZCBjYWNoZSB2YWx1ZSBpZiBpdCBpcyBhbiBBU0NJSSBzdHJpbmcuICovCisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoVGNsX0dldFN0cmluZyhzZWxmLT52YWx1ZSkpOwogfQogCiBzdGF0aWMgY2hhcioKIFB5VGNsT2JqZWN0X1RjbFN0cmluZyhQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gVGNsX0dldFN0cmluZygoKFB5VGNsT2JqZWN0KilzZWxmKS0+dmFsdWUpOworICAgIHJldHVybiBUY2xfR2V0U3RyaW5nKCgoUHlUY2xPYmplY3QqKXNlbGYpLT52YWx1ZSk7CiB9CiAKIC8qIExpa2UgX3N0ciwgYnV0IGNyZWF0ZSBVbmljb2RlIGlmIG5lY2Vzc2FyeS4gKi8KLVB5RG9jX1NUUlZBUihQeVRjbE9iamVjdF9zdHJpbmdfX2RvY19fLCAKK1B5RG9jX1NUUlZBUihQeVRjbE9iamVjdF9zdHJpbmdfX2RvY19fLAogInRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QsIGVpdGhlciBhcyBzdHJpbmcgb3IgVW5pY29kZSIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlUY2xPYmplY3Rfc3RyaW5nKFB5VGNsT2JqZWN0ICpzZWxmLCB2b2lkICppZ25vcmVkKQogewotCWNoYXIgKnM7Ci0JaW50IGksIGxlbjsKLQlpZiAoIXNlbGYtPnN0cmluZykgewotCQlzID0gVGNsX0dldFN0cmluZ0Zyb21PYmooc2VsZi0+dmFsdWUsICZsZW4pOwotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQlpZiAoc1tpXSAmIDB4ODApCi0JCQkJYnJlYWs7CisgICAgY2hhciAqczsKKyAgICBpbnQgaSwgbGVuOworICAgIGlmICghc2VsZi0+c3RyaW5nKSB7CisgICAgICAgIHMgPSBUY2xfR2V0U3RyaW5nRnJvbU9iaihzZWxmLT52YWx1ZSwgJmxlbik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgIGlmIChzW2ldICYgMHg4MCkKKyAgICAgICAgICAgICAgICBicmVhazsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWlmIChpID09IGxlbikKLQkJCS8qIEl0IGlzIGFuIEFTQ0lJIHN0cmluZy4gKi8KLQkJCXNlbGYtPnN0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7Ci0JCWVsc2UgewotCQkJc2VsZi0+c3RyaW5nID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgbGVuLCAic3RyaWN0Iik7Ci0JCQlpZiAoIXNlbGYtPnN0cmluZykgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJc2VsZi0+c3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoaSA9PSBsZW4pCisgICAgICAgICAgICAvKiBJdCBpcyBhbiBBU0NJSSBzdHJpbmcuICovCisgICAgICAgICAgICBzZWxmLT5zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYtPnN0cmluZyA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIGxlbiwgInN0cmljdCIpOworICAgICAgICAgICAgaWYgKCFzZWxmLT5zdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIHNlbGYtPnN0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbHNlCi0JCXNlbGYtPnN0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7CisgICAgICAgIHNlbGYtPnN0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7CiAjZW5kaWYKLQkJaWYgKCFzZWxmLT5zdHJpbmcpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKHNlbGYtPnN0cmluZyk7Ci0JcmV0dXJuIHNlbGYtPnN0cmluZzsKKyAgICAgICAgaWYgKCFzZWxmLT5zdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKHNlbGYtPnN0cmluZyk7CisgICAgcmV0dXJuIHNlbGYtPnN0cmluZzsKIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKQEAgLTg0MCwzNiArODQwLDM2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUHlUY2xPYmplY3RfdW5pY29kZShQeVRjbE9iamVjdCAqc2VsZiwgdm9pZCAqaWdub3JlZCkKIHsKLQljaGFyICpzOwotCWludCBsZW47Ci0JaWYgKHNlbGYtPnN0cmluZyAmJiBQeVVuaWNvZGVfQ2hlY2soc2VsZi0+c3RyaW5nKSkgewotCQlQeV9JTkNSRUYoc2VsZi0+c3RyaW5nKTsKLQkJcmV0dXJuIHNlbGYtPnN0cmluZzsKLQl9Ci0JLyogWFhYIENvdWxkIGNoYWNoZSByZXN1bHQgaWYgaXQgaXMgbm9uLUFTQ0lJLiAqLwotCXMgPSBUY2xfR2V0U3RyaW5nRnJvbU9iaihzZWxmLT52YWx1ZSwgJmxlbik7Ci0JcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIGxlbiwgInN0cmljdCIpOworICAgIGNoYXIgKnM7CisgICAgaW50IGxlbjsKKyAgICBpZiAoc2VsZi0+c3RyaW5nICYmIFB5VW5pY29kZV9DaGVjayhzZWxmLT5zdHJpbmcpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5zdHJpbmcpOworICAgICAgICByZXR1cm4gc2VsZi0+c3RyaW5nOworICAgIH0KKyAgICAvKiBYWFggQ291bGQgY2hhY2hlIHJlc3VsdCBpZiBpdCBpcyBub24tQVNDSUkuICovCisgICAgcyA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKHNlbGYtPnZhbHVlLCAmbGVuKTsKKyAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZVVURjgocywgbGVuLCAic3RyaWN0Iik7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5VGNsT2JqZWN0X3JlcHIoUHlUY2xPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbNTBdOwotCVB5T1Nfc25wcmludGYoYnVmLCA1MCwgIjwlcyBvYmplY3QgYXQgJXA+IiwKLQkJICAgICAgc2VsZi0+dmFsdWUtPnR5cGVQdHItPm5hbWUsIHNlbGYtPnZhbHVlKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzUwXTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1ZiwgNTAsICI8JXMgb2JqZWN0IGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICBzZWxmLT52YWx1ZS0+dHlwZVB0ci0+bmFtZSwgc2VsZi0+dmFsdWUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQKIFB5VGNsT2JqZWN0X2NtcChQeVRjbE9iamVjdCAqc2VsZiwgUHlUY2xPYmplY3QgKm90aGVyKQogewotCWludCByZXM7Ci0JcmVzID0gc3RyY21wKFRjbF9HZXRTdHJpbmcoc2VsZi0+dmFsdWUpLAotCQkgICAgIFRjbF9HZXRTdHJpbmcob3RoZXItPnZhbHVlKSk7Ci0JaWYgKHJlcyA8IDApIHJldHVybiAtMTsKLQlpZiAocmVzID4gMCkgcmV0dXJuIDE7Ci0JcmV0dXJuIDA7CisgICAgaW50IHJlczsKKyAgICByZXMgPSBzdHJjbXAoVGNsX0dldFN0cmluZyhzZWxmLT52YWx1ZSksCisgICAgICAgICAgICAgICAgIFRjbF9HZXRTdHJpbmcob3RoZXItPnZhbHVlKSk7CisgICAgaWYgKHJlcyA8IDApIHJldHVybiAtMTsKKyAgICBpZiAocmVzID4gMCkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRfdHlwZW5hbWVfX2RvY19fLCAibmFtZSBvZiB0aGUgVGNsIHR5cGUiKTsKQEAgLTg3NywyNjQgKzg3NywyNjQgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGdldF90eXBlbmFtZShQeVRjbE9iamVjdCogb2JqLCB2b2lkKiBpZ25vcmVkKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG9iai0+dmFsdWUtPnR5cGVQdHItPm5hbWUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG9iai0+dmFsdWUtPnR5cGVQdHItPm5hbWUpOwogfQogCiAKIHN0YXRpYyBQeUdldFNldERlZiBQeVRjbE9iamVjdF9nZXRzZXRsaXN0W10gPSB7Ci0JeyJ0eXBlbmFtZSIsIChnZXR0ZXIpZ2V0X3R5cGVuYW1lLCBOVUxMLCBnZXRfdHlwZW5hbWVfX2RvY19ffSwKLQl7InN0cmluZyIsIChnZXR0ZXIpUHlUY2xPYmplY3Rfc3RyaW5nLCBOVUxMLCAKLQkgUHlUY2xPYmplY3Rfc3RyaW5nX19kb2NfX30sCi0JezB9LAorICAgIHsidHlwZW5hbWUiLCAoZ2V0dGVyKWdldF90eXBlbmFtZSwgTlVMTCwgZ2V0X3R5cGVuYW1lX19kb2NfX30sCisgICAgeyJzdHJpbmciLCAoZ2V0dGVyKVB5VGNsT2JqZWN0X3N0cmluZywgTlVMTCwKKyAgICAgUHlUY2xPYmplY3Rfc3RyaW5nX19kb2NfX30sCisgICAgezB9LAogfTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIFB5VGNsT2JqZWN0X21ldGhvZHNbXSA9IHsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JeyJfX3VuaWNvZGVfXyIsCShQeUNGdW5jdGlvbilQeVRjbE9iamVjdF91bmljb2RlLCBNRVRIX05PQVJHUywKLQlQeVRjbE9iamVjdF91bmljb2RlX19kb2NfX30sCisgICAgeyJfX3VuaWNvZGVfXyIsICAgICAoUHlDRnVuY3Rpb24pUHlUY2xPYmplY3RfdW5pY29kZSwgTUVUSF9OT0FSR1MsCisgICAgUHlUY2xPYmplY3RfdW5pY29kZV9fZG9jX199LAogI2VuZGlmCi0JezB9CisgICAgezB9CiB9OwogCiBzdGF0aWNoZXJlIFB5VHlwZU9iamVjdCBQeVRjbE9iamVjdF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsCQkJLypvYl9zaXplKi8KLQkiX3RraW50ZXIuVGNsX09iaiIsCQkvKnRwX25hbWUqLwotCXNpemVvZihQeVRjbE9iamVjdCksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilQeVRjbE9iamVjdF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JMCwJCQkvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYylQeVRjbE9iamVjdF9jbXAsCS8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKVB5VGNsT2JqZWN0X3JlcHIsCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwotICAgICAgICAocmVwcmZ1bmMpUHlUY2xPYmplY3Rfc3RyLCAgICAgICAgLyp0cF9zdHIqLwotICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KLSAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwotICAgICAgICBQeVRjbE9iamVjdF9tZXRob2RzLCAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICAwLAkJCS8qdHBfbWVtYmVycyovCi0gICAgICAgIFB5VGNsT2JqZWN0X2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYWxsb2MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJfdGtpbnRlci5UY2xfT2JqIiwgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5VGNsT2JqZWN0KSwgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKVB5VGNsT2JqZWN0X2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKVB5VGNsT2JqZWN0X2NtcCwgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKVB5VGNsT2JqZWN0X3JlcHIsICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYylQeVRjbE9iamVjdF9zdHIsICAgICAgICAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgIC8qdHBfZmxhZ3MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIFB5VGNsT2JqZWN0X21ldGhvZHMsICAgIC8qdHBfbWV0aG9kcyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgUHlUY2xPYmplY3RfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAKIHN0YXRpYyBUY2xfT2JqKgogQXNPYmooUHlPYmplY3QgKnZhbHVlKQogewotCVRjbF9PYmogKnJlc3VsdDsKKyAgICBUY2xfT2JqICpyZXN1bHQ7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKQotCQlyZXR1cm4gVGNsX05ld1N0cmluZ09iaihQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpLAotCQkJCQlQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSkpOwotCWVsc2UgaWYgKFB5Qm9vbF9DaGVjayh2YWx1ZSkpCi0JCXJldHVybiBUY2xfTmV3Qm9vbGVhbk9iaihQeU9iamVjdF9Jc1RydWUodmFsdWUpKTsKLQllbHNlIGlmIChQeUludF9DaGVjayh2YWx1ZSkpCi0JCXJldHVybiBUY2xfTmV3TG9uZ09iaihQeUludF9BU19MT05HKHZhbHVlKSk7Ci0JZWxzZSBpZiAoUHlGbG9hdF9DaGVjayh2YWx1ZSkpCi0JCXJldHVybiBUY2xfTmV3RG91YmxlT2JqKFB5RmxvYXRfQVNfRE9VQkxFKHZhbHVlKSk7Ci0JZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKLQkJVGNsX09iaiAqKmFyZ3YgPSAoVGNsX09iaioqKQotCQkJY2thbGxvYyhQeVR1cGxlX1NpemUodmFsdWUpKnNpemVvZihUY2xfT2JqKikpOwotCQlpbnQgaTsKLQkJaWYoIWFyZ3YpCi0JCSAgcmV0dXJuIDA7Ci0JCWZvcihpPTA7aTxQeVR1cGxlX1NpemUodmFsdWUpO2krKykKLQkJICBhcmd2W2ldID0gQXNPYmooUHlUdXBsZV9HZXRJdGVtKHZhbHVlLGkpKTsKLQkJcmVzdWx0ID0gVGNsX05ld0xpc3RPYmooUHlUdXBsZV9TaXplKHZhbHVlKSwgYXJndik7Ci0JCWNrZnJlZShGUkVFQ0FTVCBhcmd2KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIFRjbF9OZXdTdHJpbmdPYmooUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUodmFsdWUpKTsKKyAgICBlbHNlIGlmIChQeUJvb2xfQ2hlY2sodmFsdWUpKQorICAgICAgICByZXR1cm4gVGNsX05ld0Jvb2xlYW5PYmooUHlPYmplY3RfSXNUcnVlKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2sodmFsdWUpKQorICAgICAgICByZXR1cm4gVGNsX05ld0xvbmdPYmooUHlJbnRfQVNfTE9ORyh2YWx1ZSkpOworICAgIGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2sodmFsdWUpKQorICAgICAgICByZXR1cm4gVGNsX05ld0RvdWJsZU9iaihQeUZsb2F0X0FTX0RPVUJMRSh2YWx1ZSkpOworICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFRjbF9PYmogKiphcmd2ID0gKFRjbF9PYmoqKikKKyAgICAgICAgICAgIGNrYWxsb2MoUHlUdXBsZV9TaXplKHZhbHVlKSpzaXplb2YoVGNsX09iaiopKTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGlmKCFhcmd2KQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3IoaT0wO2k8UHlUdXBsZV9TaXplKHZhbHVlKTtpKyspCisgICAgICAgICAgYXJndltpXSA9IEFzT2JqKFB5VHVwbGVfR2V0SXRlbSh2YWx1ZSxpKSk7CisgICAgICAgIHJlc3VsdCA9IFRjbF9OZXdMaXN0T2JqKFB5VHVwbGVfU2l6ZSh2YWx1ZSksIGFyZ3YpOworICAgICAgICBja2ZyZWUoRlJFRUNBU1QgYXJndik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5X1VOSUNPREUgKmluYnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpOwotCQlQeV9zc2l6ZV90IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOwotCQkvKiBUaGlzICNpZmRlZiBhc3N1bWVzIHRoYXQgVGNsIHVzZXMgVUNTLTIuCi0JCSAgIFNlZSBUQ0xfVVRGX01BWCB0ZXN0IGFib3ZlLiAqLworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlfVU5JQ09ERSAqaW5idWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2YWx1ZSk7CisgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSk7CisgICAgICAgIC8qIFRoaXMgI2lmZGVmIGFzc3VtZXMgdGhhdCBUY2wgdXNlcyBVQ1MtMi4KKyAgICAgICAgICAgU2VlIFRDTF9VVEZfTUFYIHRlc3QgYWJvdmUuICovCiAjaWYgZGVmaW5lZChQeV9VTklDT0RFX1dJREUpICYmIFRDTF9VVEZfTUFYID09IDMKLQkJVGNsX1VuaUNoYXIgKm91dGJ1ZiA9IE5VTEw7Ci0JCVB5X3NzaXplX3QgaTsKLQkJc2l6ZV90IGFsbG9jc2l6ZSA9ICgoc2l6ZV90KXNpemUpICogc2l6ZW9mKFRjbF9VbmlDaGFyKTsKLQkJaWYgKGFsbG9jc2l6ZSA+PSBzaXplKQotCQkJb3V0YnVmID0gKFRjbF9VbmlDaGFyKilja2FsbG9jKGFsbG9jc2l6ZSk7Ci0JCS8qIEVsc2Ugb3ZlcmZsb3cgb2NjdXJyZWQsIGFuZCB3ZSB0YWtlIHRoZSBuZXh0IGV4aXQgKi8KLQkJaWYgKCFvdXRidWYpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoaW5idWZbaV0gPj0gMHgxMDAwMCkgewotCQkJCS8qIFRjbCBkb2Vzbid0IGRvIFVURi0xNiwgeWV0LiAqLwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJInVuc3VwcG9ydGVkIGNoYXJhY3RlciIpOwotCQkJCWNrZnJlZShGUkVFQ0FTVCBvdXRidWYpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJb3V0YnVmW2ldID0gaW5idWZbaV07Ci0JCX0KLQkJcmVzdWx0ID0gVGNsX05ld1VuaWNvZGVPYmoob3V0YnVmLCBzaXplKTsKLQkJY2tmcmVlKEZSRUVDQVNUIG91dGJ1Zik7Ci0JCXJldHVybiByZXN1bHQ7CisgICAgICAgIFRjbF9VbmlDaGFyICpvdXRidWYgPSBOVUxMOworICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgIHNpemVfdCBhbGxvY3NpemUgPSAoKHNpemVfdClzaXplKSAqIHNpemVvZihUY2xfVW5pQ2hhcik7CisgICAgICAgIGlmIChhbGxvY3NpemUgPj0gc2l6ZSkKKyAgICAgICAgICAgIG91dGJ1ZiA9IChUY2xfVW5pQ2hhciopY2thbGxvYyhhbGxvY3NpemUpOworICAgICAgICAvKiBFbHNlIG92ZXJmbG93IG9jY3VycmVkLCBhbmQgd2UgdGFrZSB0aGUgbmV4dCBleGl0ICovCisgICAgICAgIGlmICghb3V0YnVmKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgaWYgKGluYnVmW2ldID49IDB4MTAwMDApIHsKKyAgICAgICAgICAgICAgICAvKiBUY2wgZG9lc24ndCBkbyBVVEYtMTYsIHlldC4gKi8KKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGNoYXJhY3RlciIpOworICAgICAgICAgICAgICAgIGNrZnJlZShGUkVFQ0FTVCBvdXRidWYpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0YnVmW2ldID0gaW5idWZbaV07CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gVGNsX05ld1VuaWNvZGVPYmoob3V0YnVmLCBzaXplKTsKKyAgICAgICAgY2tmcmVlKEZSRUVDQVNUIG91dGJ1Zik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAjZWxzZQotCQlyZXR1cm4gVGNsX05ld1VuaWNvZGVPYmooaW5idWYsIHNpemUpOworICAgICAgICByZXR1cm4gVGNsX05ld1VuaWNvZGVPYmooaW5idWYsIHNpemUpOwogI2VuZGlmCiAKLQl9CisgICAgfQogI2VuZGlmCi0JZWxzZSBpZihQeVRjbE9iamVjdF9DaGVjayh2YWx1ZSkpIHsKLQkJVGNsX09iaiAqdiA9ICgoUHlUY2xPYmplY3QqKXZhbHVlKS0+dmFsdWU7Ci0JCVRjbF9JbmNyUmVmQ291bnQodik7Ci0JCXJldHVybiB2OwotCX0gCi0JZWxzZSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKLQkJaWYgKCF2KQotCQkJcmV0dXJuIDA7Ci0JCXJlc3VsdCA9IEFzT2JqKHYpOwotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgIGVsc2UgaWYoUHlUY2xPYmplY3RfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFRjbF9PYmogKnYgPSAoKFB5VGNsT2JqZWN0Kil2YWx1ZSktPnZhbHVlOworICAgICAgICBUY2xfSW5jclJlZkNvdW50KHYpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKKyAgICAgICAgaWYgKCF2KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJlc3VsdCA9IEFzT2JqKHYpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBGcm9tT2JqKFB5T2JqZWN0KiB0a2FwcCwgVGNsX09iaiAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JVGthcHBPYmplY3QgKmFwcCA9IChUa2FwcE9iamVjdCopdGthcHA7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgVGthcHBPYmplY3QgKmFwcCA9IChUa2FwcE9iamVjdCopdGthcHA7CiAKLQlpZiAodmFsdWUtPnR5cGVQdHIgPT0gTlVMTCkgewotCQkvKiBJZiB0aGUgcmVzdWx0IGNvbnRhaW5zIGFueSBieXRlcyB3aXRoIHRoZSB0b3AgYml0IHNldCwKLQkJICAgaXQncyBVVEYtOCBhbmQgd2Ugc2hvdWxkIGRlY29kZSBpdCB0byBVbmljb2RlICovCisgICAgaWYgKHZhbHVlLT50eXBlUHRyID09IE5VTEwpIHsKKyAgICAgICAgLyogSWYgdGhlIHJlc3VsdCBjb250YWlucyBhbnkgYnl0ZXMgd2l0aCB0aGUgdG9wIGJpdCBzZXQsCisgICAgICAgICAgIGl0J3MgVVRGLTggYW5kIHdlIHNob3VsZCBkZWNvZGUgaXQgdG8gVW5pY29kZSAqLwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJaW50IGk7Ci0JCWNoYXIgKnMgPSB2YWx1ZS0+Ynl0ZXM7Ci0JCWludCBsZW4gPSB2YWx1ZS0+bGVuZ3RoOwotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICh2YWx1ZS0+Ynl0ZXNbaV0gJiAweDgwKQotCQkJCWJyZWFrOwotCQl9CisgICAgICAgIGludCBpOworICAgICAgICBjaGFyICpzID0gdmFsdWUtPmJ5dGVzOworICAgICAgICBpbnQgbGVuID0gdmFsdWUtPmxlbmd0aDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAodmFsdWUtPmJ5dGVzW2ldICYgMHg4MCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCWlmIChpID09IHZhbHVlLT5sZW5ndGgpCi0JCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotCQllbHNlIHsKLQkJCS8qIENvbnZlcnQgVVRGLTggdG8gVW5pY29kZSBzdHJpbmcgKi8KLQkJCXJlc3VsdCA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIGxlbiwgInN0cmljdCIpOwotCQkJaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotCQkJfQotCQl9CisgICAgICAgIGlmIChpID09IHZhbHVlLT5sZW5ndGgpCisgICAgICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIENvbnZlcnQgVVRGLTggdG8gVW5pY29kZSBzdHJpbmcgKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIGxlbiwgInN0cmljdCIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZWxzZQotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWx1ZS0+Ynl0ZXMsIHZhbHVlLT5sZW5ndGgpOworICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWx1ZS0+Ynl0ZXMsIHZhbHVlLT5sZW5ndGgpOwogI2VuZGlmCi0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAotCWlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPkJvb2xlYW5UeXBlKSB7Ci0JCXJlc3VsdCA9IHZhbHVlLT5pbnRlcm5hbFJlcC5sb25nVmFsdWUgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICBpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5Cb29sZWFuVHlwZSkgeworICAgICAgICByZXN1bHQgPSB2YWx1ZS0+aW50ZXJuYWxSZXAubG9uZ1ZhbHVlID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLQlpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5CeXRlQXJyYXlUeXBlKSB7Ci0JCWludCBzaXplOwotCQljaGFyICpkYXRhID0gKGNoYXIqKVRjbF9HZXRCeXRlQXJyYXlGcm9tT2JqKHZhbHVlLCAmc2l6ZSk7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBzaXplKTsKLQl9CisgICAgaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+Qnl0ZUFycmF5VHlwZSkgeworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgY2hhciAqZGF0YSA9IChjaGFyKilUY2xfR2V0Qnl0ZUFycmF5RnJvbU9iaih2YWx1ZSwgJnNpemUpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSk7CisgICAgfQogCi0JaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+RG91YmxlVHlwZSkgewotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbHVlLT5pbnRlcm5hbFJlcC5kb3VibGVWYWx1ZSk7Ci0JfQorICAgIGlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPkRvdWJsZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZS0+aW50ZXJuYWxSZXAuZG91YmxlVmFsdWUpOworICAgIH0KIAotCWlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPkludFR5cGUpIHsKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbHVlLT5pbnRlcm5hbFJlcC5sb25nVmFsdWUpOwotCX0KKyAgICBpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5JbnRUeXBlKSB7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZS0+aW50ZXJuYWxSZXAubG9uZ1ZhbHVlKTsKKyAgICB9CiAKLQlpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5MaXN0VHlwZSkgewotCQlpbnQgc2l6ZTsKLQkJaW50IGksIHN0YXR1czsKLQkJUHlPYmplY3QgKmVsZW07Ci0JCVRjbF9PYmogKnRjbF9lbGVtOworICAgIGlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPkxpc3RUeXBlKSB7CisgICAgICAgIGludCBzaXplOworICAgICAgICBpbnQgaSwgc3RhdHVzOworICAgICAgICBQeU9iamVjdCAqZWxlbTsKKyAgICAgICAgVGNsX09iaiAqdGNsX2VsZW07CiAKLQkJc3RhdHVzID0gVGNsX0xpc3RPYmpMZW5ndGgoVGthcHBfSW50ZXJwKHRrYXBwKSwgdmFsdWUsICZzaXplKTsKLQkJaWYgKHN0YXR1cyA9PSBUQ0xfRVJST1IpCi0JCQlyZXR1cm4gVGtpbnRlcl9FcnJvcih0a2FwcCk7Ci0JCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHNpemUpOwotCQlpZiAoIXJlc3VsdCkKLQkJCXJldHVybiBOVUxMOwotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBUY2xfTGlzdE9iakluZGV4KFRrYXBwX0ludGVycCh0a2FwcCksCi0JCQkJCQkgIHZhbHVlLCBpLCAmdGNsX2VsZW0pOwotCQkJaWYgKHN0YXR1cyA9PSBUQ0xfRVJST1IpIHsKLQkJCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCQlyZXR1cm4gVGtpbnRlcl9FcnJvcih0a2FwcCk7Ci0JCQl9Ci0JCQllbGVtID0gRnJvbU9iaih0a2FwcCwgdGNsX2VsZW0pOwotCQkJaWYgKCFlbGVtKSB7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBpLCBlbGVtKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICAgICAgc3RhdHVzID0gVGNsX0xpc3RPYmpMZW5ndGgoVGthcHBfSW50ZXJwKHRrYXBwKSwgdmFsdWUsICZzaXplKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBUQ0xfRVJST1IpCisgICAgICAgICAgICByZXR1cm4gVGtpbnRlcl9FcnJvcih0a2FwcCk7CisgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHNpemUpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBUY2xfTGlzdE9iakluZGV4KFRrYXBwX0ludGVycCh0a2FwcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBpLCAmdGNsX2VsZW0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBUQ0xfRVJST1IpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGtpbnRlcl9FcnJvcih0a2FwcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbGVtID0gRnJvbU9iaih0a2FwcCwgdGNsX2VsZW0pOworICAgICAgICAgICAgaWYgKCFlbGVtKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAotCWlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPlByb2NCb2R5VHlwZSkgewotCSAgLyogZmFsbCB0aHJvdWdoOiByZXR1cm4gdGNsIG9iamVjdC4gKi8KLQl9CisgICAgaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+UHJvY0JvZHlUeXBlKSB7CisgICAgICAvKiBmYWxsIHRocm91Z2g6IHJldHVybiB0Y2wgb2JqZWN0LiAqLworICAgIH0KIAotCWlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPlN0cmluZ1R5cGUpIHsKKyAgICBpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5TdHJpbmdUeXBlKSB7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogI2lmIGRlZmluZWQoUHlfVU5JQ09ERV9XSURFKSAmJiBUQ0xfVVRGX01BWD09MwotCQlQeU9iamVjdCAqcmVzdWx0OwotCQlpbnQgc2l6ZTsKLQkJVGNsX1VuaUNoYXIgKmlucHV0OwotCQlQeV9VTklDT0RFICpvdXRwdXQ7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgIGludCBzaXplOworICAgICAgICBUY2xfVW5pQ2hhciAqaW5wdXQ7CisgICAgICAgIFB5X1VOSUNPREUgKm91dHB1dDsKIAotCQlzaXplID0gVGNsX0dldENoYXJMZW5ndGgodmFsdWUpOwotCQlyZXN1bHQgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgc2l6ZSk7Ci0JCWlmICghcmVzdWx0KQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlucHV0ID0gVGNsX0dldFVuaWNvZGUodmFsdWUpOwotCQlvdXRwdXQgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOwotCQl3aGlsZSAoc2l6ZS0tKQotCQkJKm91dHB1dCsrID0gKmlucHV0Kys7Ci0JCXJldHVybiByZXN1bHQ7CisgICAgICAgIHNpemUgPSBUY2xfR2V0Q2hhckxlbmd0aCh2YWx1ZSk7CisgICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzaXplKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaW5wdXQgPSBUY2xfR2V0VW5pY29kZSh2YWx1ZSk7CisgICAgICAgIG91dHB1dCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CisgICAgICAgIHdoaWxlIChzaXplLS0pCisgICAgICAgICAgICAqb3V0cHV0KysgPSAqaW5wdXQrKzsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICNlbHNlCi0JCXJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoVGNsX0dldFVuaWNvZGUodmFsdWUpLAotCQkJCQkgICAgIFRjbF9HZXRDaGFyTGVuZ3RoKHZhbHVlKSk7CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoVGNsX0dldFVuaWNvZGUodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRjbF9HZXRDaGFyTGVuZ3RoKHZhbHVlKSk7CiAjZW5kaWYKICNlbHNlCi0JCWludCBzaXplOwotCQljaGFyICpjOwotCQljID0gVGNsX0dldFN0cmluZ0Zyb21PYmoodmFsdWUsICZzaXplKTsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGMsIHNpemUpOworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgY2hhciAqYzsKKyAgICAgICAgYyA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKHZhbHVlLCAmc2l6ZSk7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjLCBzaXplKTsKICNlbmRpZgotCX0KKyAgICB9CiAKLQlyZXR1cm4gbmV3UHlUY2xPYmplY3QodmFsdWUpOworICAgIHJldHVybiBuZXdQeVRjbE9iamVjdCh2YWx1ZSk7CiB9CiAKICNpZmRlZiBXSVRIX1RIUkVBRApAQCAtMTE0MiwyNCArMTE0MiwyNCBAQAogVENMX0RFQ0xBUkVfTVVURVgoY2FsbF9tdXRleCkKIAogdHlwZWRlZiBzdHJ1Y3QgVGthcHBfQ2FsbEV2ZW50IHsKLQlUY2xfRXZlbnQgZXY7CSAgICAgLyogTXVzdCBiZSBmaXJzdCAqLwotCVRrYXBwT2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICphcmdzOwotCWludCBmbGFnczsKLQlQeU9iamVjdCAqKnJlczsKLQlQeU9iamVjdCAqKmV4Y190eXBlLCAqKmV4Y192YWx1ZSwgKipleGNfdGI7Ci0JVGNsX0NvbmRpdGlvbiAqZG9uZTsKKyAgICBUY2xfRXZlbnQgZXY7ICAgICAgICAgICAgLyogTXVzdCBiZSBmaXJzdCAqLworICAgIFRrYXBwT2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIGludCBmbGFnczsKKyAgICBQeU9iamVjdCAqKnJlczsKKyAgICBQeU9iamVjdCAqKmV4Y190eXBlLCAqKmV4Y192YWx1ZSwgKipleGNfdGI7CisgICAgVGNsX0NvbmRpdGlvbiAqZG9uZTsKIH0gVGthcHBfQ2FsbEV2ZW50OwogI2VuZGlmCiAKIHZvaWQKIFRrYXBwX0NhbGxEZWFsbG9jQXJncyhUY2xfT2JqKiogb2JqdiwgVGNsX09iaioqIG9ialN0b3JlLCBpbnQgb2JqYykKIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgb2JqYzsgaSsrKQotCQlUY2xfRGVjclJlZkNvdW50KG9ianZbaV0pOwotCWlmIChvYmp2ICE9IG9ialN0b3JlKQotCQlja2ZyZWUoRlJFRUNBU1Qgb2Jqdik7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG9iamM7IGkrKykKKyAgICAgICAgVGNsX0RlY3JSZWZDb3VudChvYmp2W2ldKTsKKyAgICBpZiAob2JqdiAhPSBvYmpTdG9yZSkKKyAgICAgICAgY2tmcmVlKEZSRUVDQVNUIG9ianYpOwogfQogCiAvKiBDb252ZXJ0IFB5dGhvbiBvYmplY3RzIHRvIFRjbCBvYmplY3RzLiBUaGlzIG11c3QgaGFwcGVuIGluIHRoZQpAQCAtMTE2OCw1MSArMTE2OCw1MSBAQAogc3RhdGljIFRjbF9PYmoqKgogVGthcHBfQ2FsbEFyZ3MoUHlPYmplY3QgKmFyZ3MsIFRjbF9PYmoqKiBvYmpTdG9yZSwgaW50ICpwb2JqYykKIHsKLQlUY2xfT2JqICoqb2JqdiA9IG9ialN0b3JlOwotCWludCBvYmpjID0gMCwgaTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQkvKiBkbyBub3RoaW5nICovOworICAgIFRjbF9PYmogKipvYmp2ID0gb2JqU3RvcmU7CisgICAgaW50IG9iamMgPSAwLCBpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIC8qIGRvIG5vdGhpbmcgKi87CiAKLQllbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlvYmp2WzBdID0gQXNPYmooYXJncyk7Ci0JCWlmIChvYmp2WzBdID09IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JCW9iamMgPSAxOwotCQlUY2xfSW5jclJlZkNvdW50KG9ianZbMF0pOwotCX0KLQllbHNlIHsKLQkJb2JqYyA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKKyAgICBlbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgICAgICBvYmp2WzBdID0gQXNPYmooYXJncyk7CisgICAgICAgIGlmIChvYmp2WzBdID09IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIG9iamMgPSAxOworICAgICAgICBUY2xfSW5jclJlZkNvdW50KG9ianZbMF0pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgb2JqYyA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKIAotCQlpZiAob2JqYyA+IEFSR1NaKSB7Ci0JCQlvYmp2ID0gKFRjbF9PYmogKiopY2thbGxvYyhvYmpjICogc2l6ZW9mKGNoYXIgKikpOwotCQkJaWYgKG9ianYgPT0gTlVMTCkgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJb2JqYyA9IDA7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQotCQl9CisgICAgICAgIGlmIChvYmpjID4gQVJHU1opIHsKKyAgICAgICAgICAgIG9ianYgPSAoVGNsX09iaiAqKilja2FsbG9jKG9iamMgKiBzaXplb2YoY2hhciAqKSk7CisgICAgICAgICAgICBpZiAob2JqdiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICBvYmpjID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlmb3IgKGkgPSAwOyBpIDwgb2JqYzsgaSsrKSB7Ci0JCQlQeU9iamVjdCAqdiA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKTsKLQkJCWlmICh2ID09IFB5X05vbmUpIHsKLQkJCQlvYmpjID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW9ianZbaV0gPSBBc09iaih2KTsKLQkJCWlmICghb2JqdltpXSkgewotCQkJCS8qIFJlc2V0IG9iamMsIHNvIGl0IGF0dGVtcHRzIHRvIGNsZWFyCi0JCQkJICAgb2JqZWN0cyBvbmx5IHVwIHRvIGkuICovCi0JCQkJb2JqYyA9IGk7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQotCQkJVGNsX0luY3JSZWZDb3VudChvYmp2W2ldKTsKLQkJfQotCX0KLQkqcG9iamMgPSBvYmpjOwotCXJldHVybiBvYmp2OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2JqYzsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKTsKKyAgICAgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBvYmpjID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9ianZbaV0gPSBBc09iaih2KTsKKyAgICAgICAgICAgIGlmICghb2JqdltpXSkgeworICAgICAgICAgICAgICAgIC8qIFJlc2V0IG9iamMsIHNvIGl0IGF0dGVtcHRzIHRvIGNsZWFyCisgICAgICAgICAgICAgICAgICAgb2JqZWN0cyBvbmx5IHVwIHRvIGkuICovCisgICAgICAgICAgICAgICAgb2JqYyA9IGk7CisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgVGNsX0luY3JSZWZDb3VudChvYmp2W2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqcG9iamMgPSBvYmpjOworICAgIHJldHVybiBvYmp2OwogZmluYWxseToKLQlUa2FwcF9DYWxsRGVhbGxvY0FyZ3Mob2Jqdiwgb2JqU3RvcmUsIG9iamMpOwotCXJldHVybiBOVUxMOworICAgIFRrYXBwX0NhbGxEZWFsbG9jQXJncyhvYmp2LCBvYmpTdG9yZSwgb2JqYyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIENvbnZlcnQgdGhlIHJlc3VsdHMgb2YgYSBjb21tYW5kIGNhbGwgaW50byBhIFB5dGhvbiBvYmplY3RzLiAqLwpAQCAtMTIyMCw0NSArMTIyMCw0NSBAQAogc3RhdGljIFB5T2JqZWN0KgogVGthcHBfQ2FsbFJlc3VsdChUa2FwcE9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlpZihzZWxmLT53YW50b2JqZWN0cykgewotCQlUY2xfT2JqICp2YWx1ZSA9IFRjbF9HZXRPYmpSZXN1bHQoc2VsZi0+aW50ZXJwKTsKLQkJLyogTm90IHN1cmUgd2hldGhlciB0aGUgSW5jclJlZiBpcyBuZWNlc3NhcnksIGJ1dCBzb21ldGhpbmcKLQkJICAgbWF5IG92ZXJ3cml0ZSB0aGUgaW50ZXJwcmV0ZXIgcmVzdWx0IHdoaWxlIHdlIGFyZQotCQkgICBjb252ZXJ0aW5nIGl0LiAqLwotCQlUY2xfSW5jclJlZkNvdW50KHZhbHVlKTsKLQkJcmVzID0gRnJvbU9iaigoUHlPYmplY3QqKXNlbGYsIHZhbHVlKTsKLQkJVGNsX0RlY3JSZWZDb3VudCh2YWx1ZSk7Ci0JfSBlbHNlIHsKLQkJY29uc3QgY2hhciAqcyA9IFRjbF9HZXRTdHJpbmdSZXN1bHQoc2VsZi0+aW50ZXJwKTsKLQkJY29uc3QgY2hhciAqcCA9IHM7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgaWYoc2VsZi0+d2FudG9iamVjdHMpIHsKKyAgICAgICAgVGNsX09iaiAqdmFsdWUgPSBUY2xfR2V0T2JqUmVzdWx0KHNlbGYtPmludGVycCk7CisgICAgICAgIC8qIE5vdCBzdXJlIHdoZXRoZXIgdGhlIEluY3JSZWYgaXMgbmVjZXNzYXJ5LCBidXQgc29tZXRoaW5nCisgICAgICAgICAgIG1heSBvdmVyd3JpdGUgdGhlIGludGVycHJldGVyIHJlc3VsdCB3aGlsZSB3ZSBhcmUKKyAgICAgICAgICAgY29udmVydGluZyBpdC4gKi8KKyAgICAgICAgVGNsX0luY3JSZWZDb3VudCh2YWx1ZSk7CisgICAgICAgIHJlcyA9IEZyb21PYmooKFB5T2JqZWN0KilzZWxmLCB2YWx1ZSk7CisgICAgICAgIFRjbF9EZWNyUmVmQ291bnQodmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBUY2xfR2V0U3RyaW5nUmVzdWx0KHNlbGYtPmludGVycCk7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBzOwogCi0JCS8qIElmIHRoZSByZXN1bHQgY29udGFpbnMgYW55IGJ5dGVzIHdpdGggdGhlIHRvcCBiaXQgc2V0LAotCQkgICBpdCdzIFVURi04IGFuZCB3ZSBzaG91bGQgZGVjb2RlIGl0IHRvIFVuaWNvZGUgKi8KKyAgICAgICAgLyogSWYgdGhlIHJlc3VsdCBjb250YWlucyBhbnkgYnl0ZXMgd2l0aCB0aGUgdG9wIGJpdCBzZXQsCisgICAgICAgICAgIGl0J3MgVVRGLTggYW5kIHdlIHNob3VsZCBkZWNvZGUgaXQgdG8gVW5pY29kZSAqLwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJd2hpbGUgKCpwICE9ICdcMCcpIHsKLQkJCWlmICgqcCAmIDB4ODApCi0JCQkJYnJlYWs7Ci0JCQlwKys7Ci0JCX0KKyAgICAgICAgd2hpbGUgKCpwICE9ICdcMCcpIHsKKyAgICAgICAgICAgIGlmICgqcCAmIDB4ODApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KIAotCQlpZiAoKnAgPT0gJ1wwJykKLQkJCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIChpbnQpKHAtcykpOwotCQllbHNlIHsKLQkJCS8qIENvbnZlcnQgVVRGLTggdG8gVW5pY29kZSBzdHJpbmcgKi8KLQkJCXAgPSBzdHJjaHIocCwgJ1wwJyk7Ci0JCQlyZXMgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCAoaW50KShwLXMpLCAic3RyaWN0Iik7Ci0JCQlpZiAocmVzID09IE5VTEwpIHsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIChpbnQpKHAtcykpOwotCQkJfQotCQl9CisgICAgICAgIGlmICgqcCA9PSAnXDAnKQorICAgICAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgKGludCkocC1zKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogQ29udmVydCBVVEYtOCB0byBVbmljb2RlIHN0cmluZyAqLworICAgICAgICAgICAgcCA9IHN0cmNocihwLCAnXDAnKTsKKyAgICAgICAgICAgIHJlcyA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIChpbnQpKHAtcyksICJzdHJpY3QiKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgKGludCkocC1zKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbHNlCi0JCXAgPSBzdHJjaHIocCwgJ1wwJyk7Ci0JCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIChpbnQpKHAtcykpOworICAgICAgICBwID0gc3RyY2hyKHAsICdcMCcpOworICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAoaW50KShwLXMpKTsKICNlbmRpZgotCX0KLQlyZXR1cm4gcmVzOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiAjaWZkZWYgV0lUSF9USFJFQUQKQEAgLTEyNzAsNDEgKzEyNzAsNDEgQEAKIHN0YXRpYyBpbnQKIFRrYXBwX0NhbGxQcm9jKFRrYXBwX0NhbGxFdmVudCAqZSwgaW50IGZsYWdzKQogewotCVRjbF9PYmogKm9ialN0b3JlW0FSR1NaXTsKLQlUY2xfT2JqICoqb2JqdjsKLQlpbnQgb2JqYzsKLQlpbnQgaTsKLQlFTlRFUl9QWVRIT04KLQlvYmp2ID0gVGthcHBfQ2FsbEFyZ3MoZS0+YXJncywgb2JqU3RvcmUsICZvYmpjKTsKLQlpZiAoIW9ianYpIHsKLQkJUHlFcnJfRmV0Y2goZS0+ZXhjX3R5cGUsIGUtPmV4Y192YWx1ZSwgZS0+ZXhjX3RiKTsKLQkJKihlLT5yZXMpID0gTlVMTDsKLQl9Ci0JTEVBVkVfUFlUSE9OCi0JaWYgKCFvYmp2KQotCQlnb3RvIGRvbmU7Ci0JaSA9IFRjbF9FdmFsT2JqdihlLT5zZWxmLT5pbnRlcnAsIG9iamMsIG9ianYsIGUtPmZsYWdzKTsKLQlFTlRFUl9QWVRIT04KLQlpZiAoaSA9PSBUQ0xfRVJST1IpIHsKLQkJKihlLT5yZXMpID0gTlVMTDsKLQkJKihlLT5leGNfdHlwZSkgPSBOVUxMOwotCQkqKGUtPmV4Y190YikgPSBOVUxMOwotCQkqKGUtPmV4Y192YWx1ZSkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oCi0JCQlUa2ludGVyX1RjbEVycm9yLCAicyIsCi0JCQlUY2xfR2V0U3RyaW5nUmVzdWx0KGUtPnNlbGYtPmludGVycCkpOwotCX0KLQllbHNlIHsKLQkJKihlLT5yZXMpID0gVGthcHBfQ2FsbFJlc3VsdChlLT5zZWxmKTsKLQl9Ci0JTEVBVkVfUFlUSE9OCisgICAgVGNsX09iaiAqb2JqU3RvcmVbQVJHU1pdOworICAgIFRjbF9PYmogKipvYmp2OworICAgIGludCBvYmpjOworICAgIGludCBpOworICAgIEVOVEVSX1BZVEhPTgorICAgIG9ianYgPSBUa2FwcF9DYWxsQXJncyhlLT5hcmdzLCBvYmpTdG9yZSwgJm9iamMpOworICAgIGlmICghb2JqdikgeworICAgICAgICBQeUVycl9GZXRjaChlLT5leGNfdHlwZSwgZS0+ZXhjX3ZhbHVlLCBlLT5leGNfdGIpOworICAgICAgICAqKGUtPnJlcykgPSBOVUxMOworICAgIH0KKyAgICBMRUFWRV9QWVRIT04KKyAgICBpZiAoIW9ianYpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBpID0gVGNsX0V2YWxPYmp2KGUtPnNlbGYtPmludGVycCwgb2JqYywgb2JqdiwgZS0+ZmxhZ3MpOworICAgIEVOVEVSX1BZVEhPTgorICAgIGlmIChpID09IFRDTF9FUlJPUikgeworICAgICAgICAqKGUtPnJlcykgPSBOVUxMOworICAgICAgICAqKGUtPmV4Y190eXBlKSA9IE5VTEw7CisgICAgICAgICooZS0+ZXhjX3RiKSA9IE5VTEw7CisgICAgICAgICooZS0+ZXhjX3ZhbHVlKSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKKyAgICAgICAgICAgIFRraW50ZXJfVGNsRXJyb3IsICJzIiwKKyAgICAgICAgICAgIFRjbF9HZXRTdHJpbmdSZXN1bHQoZS0+c2VsZi0+aW50ZXJwKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqKGUtPnJlcykgPSBUa2FwcF9DYWxsUmVzdWx0KGUtPnNlbGYpOworICAgIH0KKyAgICBMRUFWRV9QWVRIT04KIAotCVRrYXBwX0NhbGxEZWFsbG9jQXJncyhvYmp2LCBvYmpTdG9yZSwgb2JqYyk7CisgICAgVGthcHBfQ2FsbERlYWxsb2NBcmdzKG9ianYsIG9ialN0b3JlLCBvYmpjKTsKIGRvbmU6Ci0JLyogV2FrZSB1cCBjYWxsaW5nIHRocmVhZC4gKi8KLQlUY2xfTXV0ZXhMb2NrKCZjYWxsX211dGV4KTsKLQlUY2xfQ29uZGl0aW9uTm90aWZ5KGUtPmRvbmUpOwotCVRjbF9NdXRleFVubG9jaygmY2FsbF9tdXRleCk7Ci0JcmV0dXJuIDE7CisgICAgLyogV2FrZSB1cCBjYWxsaW5nIHRocmVhZC4gKi8KKyAgICBUY2xfTXV0ZXhMb2NrKCZjYWxsX211dGV4KTsKKyAgICBUY2xfQ29uZGl0aW9uTm90aWZ5KGUtPmRvbmUpOworICAgIFRjbF9NdXRleFVubG9jaygmY2FsbF9tdXRleCk7CisgICAgcmV0dXJuIDE7CiB9CiAKICNlbmRpZgpAQCAtMTMyNCwyMTggKzEzMjQsMjE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfQ2FsbChQeU9iamVjdCAqc2VsZnB0ciwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JVGNsX09iaiAqb2JqU3RvcmVbQVJHU1pdOwotCVRjbF9PYmogKipvYmp2ID0gTlVMTDsKLQlpbnQgb2JqYywgaTsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKLQlpbnQgZmxhZ3MgPSBUQ0xfRVZBTF9ESVJFQ1QgfCBUQ0xfRVZBTF9HTE9CQUw7CisgICAgVGNsX09iaiAqb2JqU3RvcmVbQVJHU1pdOworICAgIFRjbF9PYmogKipvYmp2ID0gTlVMTDsKKyAgICBpbnQgb2JqYywgaTsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKKyAgICBpbnQgZmxhZ3MgPSBUQ0xfRVZBTF9ESVJFQ1QgfCBUQ0xfRVZBTF9HTE9CQUw7CiAKLQkvKiBJZiBhcmdzIGlzIGEgc2luZ2xlIHR1cGxlLCByZXBsYWNlIHdpdGggY29udGVudHMgb2YgdHVwbGUgKi8KLQlpZiAoMSA9PSBQeVR1cGxlX1NpemUoYXJncykpewotCQlQeU9iamVjdCogaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKLQkJaWYgKFB5VHVwbGVfQ2hlY2soaXRlbSkpCi0JCQlhcmdzID0gaXRlbTsKLQl9CisgICAgLyogSWYgYXJncyBpcyBhIHNpbmdsZSB0dXBsZSwgcmVwbGFjZSB3aXRoIGNvbnRlbnRzIG9mIHR1cGxlICovCisgICAgaWYgKDEgPT0gUHlUdXBsZV9TaXplKGFyZ3MpKXsKKyAgICAgICAgUHlPYmplY3QqIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKGl0ZW0pKQorICAgICAgICAgICAgYXJncyA9IGl0ZW07CisgICAgfQogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpKSB7Ci0JCS8qIFdlIGNhbm5vdCBjYWxsIHRoZSBjb21tYW5kIGRpcmVjdGx5LiBJbnN0ZWFkLCB3ZSBtdXN0Ci0JCSAgIG1hcnNoYWwgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIGludGVycHJldGVyIHRocmVhZC4gKi8KLQkJVGthcHBfQ2FsbEV2ZW50ICpldjsKLQkJVGNsX0NvbmRpdGlvbiBjb25kID0gTlVMTDsKLQkJUHlPYmplY3QgKmV4Y190eXBlLCAqZXhjX3ZhbHVlLCAqZXhjX3RiOwotCQlpZiAoIVdhaXRGb3JNYWlubG9vcChzZWxmKSkKLQkJCXJldHVybiBOVUxMOwotCQlldiA9IChUa2FwcF9DYWxsRXZlbnQqKWNrYWxsb2Moc2l6ZW9mKFRrYXBwX0NhbGxFdmVudCkpOwotCQlldi0+ZXYucHJvYyA9IChUY2xfRXZlbnRQcm9jKilUa2FwcF9DYWxsUHJvYzsKLQkJZXYtPnNlbGYgPSBzZWxmOwotCQlldi0+YXJncyA9IGFyZ3M7Ci0JCWV2LT5yZXMgPSAmcmVzOwotCQlldi0+ZXhjX3R5cGUgPSAmZXhjX3R5cGU7Ci0JCWV2LT5leGNfdmFsdWUgPSAmZXhjX3ZhbHVlOwotCQlldi0+ZXhjX3RiID0gJmV4Y190YjsKLQkJZXYtPmRvbmUgPSAmY29uZDsKKyAgICBpZiAoc2VsZi0+dGhyZWFkZWQgJiYgc2VsZi0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgLyogV2UgY2Fubm90IGNhbGwgdGhlIGNvbW1hbmQgZGlyZWN0bHkuIEluc3RlYWQsIHdlIG11c3QKKyAgICAgICAgICAgbWFyc2hhbCB0aGUgcGFyYW1ldGVycyB0byB0aGUgaW50ZXJwcmV0ZXIgdGhyZWFkLiAqLworICAgICAgICBUa2FwcF9DYWxsRXZlbnQgKmV2OworICAgICAgICBUY2xfQ29uZGl0aW9uIGNvbmQgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqZXhjX3R5cGUsICpleGNfdmFsdWUsICpleGNfdGI7CisgICAgICAgIGlmICghV2FpdEZvck1haW5sb29wKHNlbGYpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGV2ID0gKFRrYXBwX0NhbGxFdmVudCopY2thbGxvYyhzaXplb2YoVGthcHBfQ2FsbEV2ZW50KSk7CisgICAgICAgIGV2LT5ldi5wcm9jID0gKFRjbF9FdmVudFByb2MqKVRrYXBwX0NhbGxQcm9jOworICAgICAgICBldi0+c2VsZiA9IHNlbGY7CisgICAgICAgIGV2LT5hcmdzID0gYXJnczsKKyAgICAgICAgZXYtPnJlcyA9ICZyZXM7CisgICAgICAgIGV2LT5leGNfdHlwZSA9ICZleGNfdHlwZTsKKyAgICAgICAgZXYtPmV4Y192YWx1ZSA9ICZleGNfdmFsdWU7CisgICAgICAgIGV2LT5leGNfdGIgPSAmZXhjX3RiOworICAgICAgICBldi0+ZG9uZSA9ICZjb25kOwogCi0JCVRrYXBwX1RocmVhZFNlbmQoc2VsZiwgKFRjbF9FdmVudCopZXYsICZjb25kLCAmY2FsbF9tdXRleCk7CisgICAgICAgIFRrYXBwX1RocmVhZFNlbmQoc2VsZiwgKFRjbF9FdmVudCopZXYsICZjb25kLCAmY2FsbF9tdXRleCk7CiAKLQkJaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCQlpZiAoZXhjX3R5cGUpCi0JCQkJUHlFcnJfUmVzdG9yZShleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdGIpOwotCQkJZWxzZQotCQkJCVB5RXJyX1NldE9iamVjdChUa2ludGVyX1RjbEVycm9yLCBleGNfdmFsdWUpOwotCQl9Ci0JCVRjbF9Db25kaXRpb25GaW5hbGl6ZSgmY29uZCk7Ci0JfQotCWVsc2UgCisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGV4Y190eXBlKQorICAgICAgICAgICAgICAgIFB5RXJyX1Jlc3RvcmUoZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoVGtpbnRlcl9UY2xFcnJvciwgZXhjX3ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBUY2xfQ29uZGl0aW9uRmluYWxpemUoJmNvbmQpOworICAgIH0KKyAgICBlbHNlCiAjZW5kaWYKLQl7CisgICAgewogCi0JCW9ianYgPSBUa2FwcF9DYWxsQXJncyhhcmdzLCBvYmpTdG9yZSwgJm9iamMpOwotCQlpZiAoIW9ianYpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgb2JqdiA9IFRrYXBwX0NhbGxBcmdzKGFyZ3MsIG9ialN0b3JlLCAmb2JqYyk7CisgICAgICAgIGlmICghb2JqdikKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCUVOVEVSX1RDTAorICAgICAgICBFTlRFUl9UQ0wKIAotCQlpID0gVGNsX0V2YWxPYmp2KHNlbGYtPmludGVycCwgb2JqYywgb2JqdiwgZmxhZ3MpOworICAgICAgICBpID0gVGNsX0V2YWxPYmp2KHNlbGYtPmludGVycCwgb2JqYywgb2JqdiwgZmxhZ3MpOwogCi0JCUVOVEVSX09WRVJMQVAKKyAgICAgICAgRU5URVJfT1ZFUkxBUAogCi0JCWlmIChpID09IFRDTF9FUlJPUikKLQkJCVRraW50ZXJfRXJyb3Ioc2VsZnB0cik7Ci0JCWVsc2UKLQkJCXJlcyA9IFRrYXBwX0NhbGxSZXN1bHQoc2VsZik7CisgICAgICAgIGlmIChpID09IFRDTF9FUlJPUikKKyAgICAgICAgICAgIFRraW50ZXJfRXJyb3Ioc2VsZnB0cik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFRrYXBwX0NhbGxSZXN1bHQoc2VsZik7CiAKLQkJTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICAgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKIAotCQlUa2FwcF9DYWxsRGVhbGxvY0FyZ3Mob2Jqdiwgb2JqU3RvcmUsIG9iamMpOwotCX0KLQlyZXR1cm4gcmVzOworICAgICAgICBUa2FwcF9DYWxsRGVhbGxvY0FyZ3Mob2Jqdiwgb2JqU3RvcmUsIG9iamMpOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9HbG9iYWxDYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQkvKiBDb3VsZCBkbyB0aGUgc2FtZSBoZXJlIGFzIGZvciBUa2FwcF9DYWxsKCksIGJ1dCB0aGlzIGlzIG5vdCB1c2VkCi0JICAgbXVjaCwgc28gSSBjYW4ndCBiZSBib3RoZXJlZC4gIFVuZm9ydHVuYXRlbHkgVGNsIGRvZXNuJ3QgZXhwb3J0IGEKLQkgICB3YXkgZm9yIHRoZSB1c2VyIHRvIGRvIHdoYXQgYWxsIGl0cyBHbG9iYWwqIHZhcmlhbnRzIGRvIChzYXZlIGFuZAotCSAgIHJlc2V0IHRoZSBzY29wZSBwb2ludGVyLCBjYWxsIHRoZSBsb2NhbCB2ZXJzaW9uLCByZXN0b3JlIHRoZSBzYXZlZAotCSAgIHNjb3BlIHBvaW50ZXIpLiAqLworICAgIC8qIENvdWxkIGRvIHRoZSBzYW1lIGhlcmUgYXMgZm9yIFRrYXBwX0NhbGwoKSwgYnV0IHRoaXMgaXMgbm90IHVzZWQKKyAgICAgICBtdWNoLCBzbyBJIGNhbid0IGJlIGJvdGhlcmVkLiAgVW5mb3J0dW5hdGVseSBUY2wgZG9lc24ndCBleHBvcnQgYQorICAgICAgIHdheSBmb3IgdGhlIHVzZXIgdG8gZG8gd2hhdCBhbGwgaXRzIEdsb2JhbCogdmFyaWFudHMgZG8gKHNhdmUgYW5kCisgICAgICAgcmVzZXQgdGhlIHNjb3BlIHBvaW50ZXIsIGNhbGwgdGhlIGxvY2FsIHZlcnNpb24sIHJlc3RvcmUgdGhlIHNhdmVkCisgICAgICAgc2NvcGUgcG9pbnRlcikuICovCiAKLQljaGFyICpjbWQ7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgY2hhciAqY21kOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwogCi0JQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CiAKLQljbWQgID0gTWVyZ2UoYXJncyk7Ci0JaWYgKGNtZCkgewotCQlpbnQgZXJyOwotCQlFTlRFUl9UQ0wKLQkJZXJyID0gVGNsX0dsb2JhbEV2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCBjbWQpOwotCQlFTlRFUl9PVkVSTEFQCi0JCWlmIChlcnIgPT0gVENMX0VSUk9SKQotCQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQkJZWxzZQotCQkJcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhUa2FwcF9SZXN1bHQoc2VsZikpOwotCQlMRUFWRV9PVkVSTEFQX1RDTAotCQlja2ZyZWUoY21kKTsKLQl9CisgICAgY21kICA9IE1lcmdlKGFyZ3MpOworICAgIGlmIChjbWQpIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgRU5URVJfVENMCisgICAgICAgIGVyciA9IFRjbF9HbG9iYWxFdmFsKFRrYXBwX0ludGVycChzZWxmKSwgY21kKTsKKyAgICAgICAgRU5URVJfT1ZFUkxBUAorICAgICAgICBpZiAoZXJyID09IFRDTF9FUlJPUikKKyAgICAgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKKyAgICAgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICAgICAgY2tmcmVlKGNtZCk7CisgICAgfQogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfRXZhbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc2NyaXB0OwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWludCBlcnI7CisgICAgY2hhciAqc2NyaXB0OworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXZhbCIsICZzY3JpcHQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXZhbCIsICZzY3JpcHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCi0JRU5URVJfVENMCi0JZXJyID0gVGNsX0V2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCBzY3JpcHQpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAoZXJyID09IFRDTF9FUlJPUikKLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQllbHNlCi0JCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKLQlMRUFWRV9PVkVSTEFQX1RDTAotCXJldHVybiByZXM7CisgICAgRU5URVJfVENMCisgICAgZXJyID0gVGNsX0V2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCBzY3JpcHQpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAoZXJyID09IFRDTF9FUlJPUikKKyAgICAgICAgcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKKyAgICBMRUFWRV9PVkVSTEFQX1RDTAorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9HbG9iYWxFdmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzY3JpcHQ7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JaW50IGVycjsKKyAgICBjaGFyICpzY3JpcHQ7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgaW50IGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnbG9iYWxldmFsIiwgJnNjcmlwdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnbG9iYWxldmFsIiwgJnNjcmlwdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CiAKLQlFTlRFUl9UQ0wKLQllcnIgPSBUY2xfR2xvYmFsRXZhbChUa2FwcF9JbnRlcnAoc2VsZiksIHNjcmlwdCk7Ci0JRU5URVJfT1ZFUkxBUAotCWlmIChlcnIgPT0gVENMX0VSUk9SKQotCQlyZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOwotCWVsc2UKLQkJcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhUa2FwcF9SZXN1bHQoc2VsZikpOwotCUxFQVZFX09WRVJMQVBfVENMCi0JcmV0dXJuIHJlczsKKyAgICBFTlRFUl9UQ0wKKyAgICBlcnIgPSBUY2xfR2xvYmFsRXZhbChUa2FwcF9JbnRlcnAoc2VsZiksIHNjcmlwdCk7CisgICAgRU5URVJfT1ZFUkxBUAorICAgIGlmIChlcnIgPT0gVENMX0VSUk9SKQorICAgICAgICByZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhUa2FwcF9SZXN1bHQoc2VsZikpOworICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0V2YWxGaWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmaWxlTmFtZTsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlpbnQgZXJyOworICAgIGNoYXIgKmZpbGVOYW1lOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXZhbGZpbGUiLCAmZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXZhbGZpbGUiLCAmZmlsZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCi0JRU5URVJfVENMCi0JZXJyID0gVGNsX0V2YWxGaWxlKFRrYXBwX0ludGVycChzZWxmKSwgZmlsZU5hbWUpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAoZXJyID09IFRDTF9FUlJPUikKLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICBFTlRFUl9UQ0wKKyAgICBlcnIgPSBUY2xfRXZhbEZpbGUoVGthcHBfSW50ZXJwKHNlbGYpLCBmaWxlTmFtZSk7CisgICAgRU5URVJfT1ZFUkxBUAorICAgIGlmIChlcnIgPT0gVENMX0VSUk9SKQorICAgICAgICByZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOwogCi0JZWxzZQotCQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRrYXBwX1Jlc3VsdChzZWxmKSk7Ci0JTEVBVkVfT1ZFUkxBUF9UQ0wKLQlyZXR1cm4gcmVzOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhUa2FwcF9SZXN1bHQoc2VsZikpOworICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1JlY29yZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc2NyaXB0OwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWludCBlcnI7CisgICAgY2hhciAqc2NyaXB0OworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc2NyaXB0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnNjcmlwdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CiAKLQlFTlRFUl9UQ0wKLQllcnIgPSBUY2xfUmVjb3JkQW5kRXZhbChUa2FwcF9JbnRlcnAoc2VsZiksIHNjcmlwdCwgVENMX05PX0VWQUwpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAoZXJyID09IFRDTF9FUlJPUikKLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQllbHNlCi0JCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKLQlMRUFWRV9PVkVSTEFQX1RDTAotCXJldHVybiByZXM7CisgICAgRU5URVJfVENMCisgICAgZXJyID0gVGNsX1JlY29yZEFuZEV2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCBzY3JpcHQsIFRDTF9OT19FVkFMKTsKKyAgICBFTlRFUl9PVkVSTEFQCisgICAgaWYgKGVyciA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgZWxzZQorICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRrYXBwX1Jlc3VsdChzZWxmKSk7CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfQWRkRXJyb3JJbmZvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICptc2c7CisgICAgY2hhciAqbXNnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmFkZGVycm9yaW5mbyIsICZtc2cpKQotCQlyZXR1cm4gTlVMTDsKLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6YWRkZXJyb3JpbmZvIiwgJm1zZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCi0JRU5URVJfVENMCi0JVGNsX0FkZEVycm9ySW5mbyhUa2FwcF9JbnRlcnAoc2VsZiksIG1zZyk7Ci0JTEVBVkVfVENMCisgICAgRU5URVJfVENMCisgICAgVGNsX0FkZEVycm9ySW5mbyhUa2FwcF9JbnRlcnAoc2VsZiksIG1zZyk7CisgICAgTEVBVkVfVENMCiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLQwKKwogLyoqIFRjbCBWYXJpYWJsZSAqKi8KIAogdHlwZWRlZiBQeU9iamVjdCogKCpFdmVudEZ1bmMpKFB5T2JqZWN0KiwgUHlPYmplY3QgKmFyZ3MsIGludCBmbGFncyk7CkBAIC0xNTQ0LDYxICsxNTQ0LDYxIEBACiBUQ0xfREVDTEFSRV9NVVRFWCh2YXJfbXV0ZXgpCiAKIHR5cGVkZWYgc3RydWN0IFZhckV2ZW50IHsKLQlUY2xfRXZlbnQgZXY7IC8qIG11c3QgYmUgZmlyc3QgKi8KLQlQeU9iamVjdCAqc2VsZjsKLQlQeU9iamVjdCAqYXJnczsKLQlpbnQgZmxhZ3M7Ci0JRXZlbnRGdW5jIGZ1bmM7Ci0JUHlPYmplY3QgKipyZXM7Ci0JUHlPYmplY3QgKipleGNfdHlwZTsKLQlQeU9iamVjdCAqKmV4Y192YWw7Ci0JVGNsX0NvbmRpdGlvbiAqY29uZDsKKyAgICBUY2xfRXZlbnQgZXY7IC8qIG11c3QgYmUgZmlyc3QgKi8KKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBpbnQgZmxhZ3M7CisgICAgRXZlbnRGdW5jIGZ1bmM7CisgICAgUHlPYmplY3QgKipyZXM7CisgICAgUHlPYmplY3QgKipleGNfdHlwZTsKKyAgICBQeU9iamVjdCAqKmV4Y192YWw7CisgICAgVGNsX0NvbmRpdGlvbiAqY29uZDsKIH0gVmFyRXZlbnQ7CiAjZW5kaWYKIAogc3RhdGljIGludAogdmFybmFtZV9jb252ZXJ0ZXIoUHlPYmplY3QgKmluLCB2b2lkICpfb3V0KQogewotCWNoYXIgKipvdXQgPSAoY2hhcioqKV9vdXQ7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKGluKSkgewotCQkqb3V0ID0gUHlTdHJpbmdfQXNTdHJpbmcoaW4pOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5VGNsT2JqZWN0X0NoZWNrKGluKSkgewotCQkqb3V0ID0gUHlUY2xPYmplY3RfVGNsU3RyaW5nKGluKTsKLQkJcmV0dXJuIDE7Ci0JfQotCS8qIFhYWDogU2hvdWxkIGdpdmUgZGlhZ25vc3RpY3MuICovCi0JcmV0dXJuIDA7Ci19CQorICAgIGNoYXIgKipvdXQgPSAoY2hhcioqKV9vdXQ7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGluKSkgeworICAgICAgICAqb3V0ID0gUHlTdHJpbmdfQXNTdHJpbmcoaW4pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKFB5VGNsT2JqZWN0X0NoZWNrKGluKSkgeworICAgICAgICAqb3V0ID0gUHlUY2xPYmplY3RfVGNsU3RyaW5nKGluKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIC8qIFhYWDogU2hvdWxkIGdpdmUgZGlhZ25vc3RpY3MuICovCisgICAgcmV0dXJuIDA7Cit9CiAKICNpZmRlZiBXSVRIX1RIUkVBRAogCiBzdGF0aWMgdm9pZAogdmFyX3BlcmZvcm0oVmFyRXZlbnQgKmV2KQogewotCSooZXYtPnJlcykgPSBldi0+ZnVuYyhldi0+c2VsZiwgZXYtPmFyZ3MsIGV2LT5mbGFncyk7Ci0JaWYgKCEqKGV2LT5yZXMpKSB7Ci0JCVB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKLQkJUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKLQkJUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGMsICZ2YWwsICZ0Yik7Ci0JCSooZXYtPmV4Y190eXBlKSA9IGV4YzsKLQkJKihldi0+ZXhjX3ZhbCkgPSB2YWw7Ci0JCVB5X0RFQ1JFRih0Yik7Ci0JfQotCQkKKyAgICAqKGV2LT5yZXMpID0gZXYtPmZ1bmMoZXYtPnNlbGYsIGV2LT5hcmdzLCBldi0+ZmxhZ3MpOworICAgIGlmICghKihldi0+cmVzKSkgeworICAgICAgICBQeU9iamVjdCAqZXhjLCAqdmFsLCAqdGI7CisgICAgICAgIFB5RXJyX0ZldGNoKCZleGMsICZ2YWwsICZ0Yik7CisgICAgICAgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmZXhjLCAmdmFsLCAmdGIpOworICAgICAgICAqKGV2LT5leGNfdHlwZSkgPSBleGM7CisgICAgICAgICooZXYtPmV4Y192YWwpID0gdmFsOworICAgICAgICBQeV9ERUNSRUYodGIpOworICAgIH0KKwogfQogCiBzdGF0aWMgaW50CiB2YXJfcHJvYyhWYXJFdmVudCogZXYsIGludCBmbGFncykKIHsKLQlFTlRFUl9QWVRIT04KLSAgICAgICAgdmFyX3BlcmZvcm0oZXYpOwotCVRjbF9NdXRleExvY2soJnZhcl9tdXRleCk7Ci0JVGNsX0NvbmRpdGlvbk5vdGlmeShldi0+Y29uZCk7Ci0JVGNsX011dGV4VW5sb2NrKCZ2YXJfbXV0ZXgpOwotCUxFQVZFX1BZVEhPTgotCXJldHVybiAxOworICAgIEVOVEVSX1BZVEhPTgorICAgIHZhcl9wZXJmb3JtKGV2KTsKKyAgICBUY2xfTXV0ZXhMb2NrKCZ2YXJfbXV0ZXgpOworICAgIFRjbF9Db25kaXRpb25Ob3RpZnkoZXYtPmNvbmQpOworICAgIFRjbF9NdXRleFVubG9jaygmdmFyX211dGV4KTsKKyAgICBMRUFWRV9QWVRIT04KKyAgICByZXR1cm4gMTsKIH0KIAogI2VuZGlmCkBAIC0xNjA3LDQzOSArMTYwNyw0MzkgQEAKIHZhcl9pbnZva2UoRXZlbnRGdW5jIGZ1bmMsIFB5T2JqZWN0ICpzZWxmcHRyLCBQeU9iamVjdCAqYXJncywgaW50IGZsYWdzKQogewogI2lmZGVmIFdJVEhfVEhSRUFECi0JVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7Ci0JaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpKSB7Ci0JCVRrYXBwT2JqZWN0ICpzZWxmID0gKFRrYXBwT2JqZWN0KilzZWxmcHRyOwotCQlWYXJFdmVudCAqZXY7Ci0JCVB5T2JqZWN0ICpyZXMsICpleGNfdHlwZSwgKmV4Y192YWw7Ci0JCVRjbF9Db25kaXRpb24gY29uZCA9IE5VTEw7Ci0JCQotCQkvKiBUaGUgY3VycmVudCB0aHJlYWQgaXMgbm90IHRoZSBpbnRlcnByZXRlciB0aHJlYWQuICBNYXJzaGFsCi0JCSAgIHRoZSBjYWxsIHRvIHRoZSBpbnRlcnByZXRlciB0aHJlYWQsIHRoZW4gd2FpdCBmb3IKLQkJICAgY29tcGxldGlvbi4gKi8KLQkJaWYgKCFXYWl0Rm9yTWFpbmxvb3Aoc2VsZikpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKKyAgICBpZiAoc2VsZi0+dGhyZWFkZWQgJiYgc2VsZi0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7CisgICAgICAgIFZhckV2ZW50ICpldjsKKyAgICAgICAgUHlPYmplY3QgKnJlcywgKmV4Y190eXBlLCAqZXhjX3ZhbDsKKyAgICAgICAgVGNsX0NvbmRpdGlvbiBjb25kID0gTlVMTDsKIAotCQlldiA9IChWYXJFdmVudCopY2thbGxvYyhzaXplb2YoVmFyRXZlbnQpKTsKKyAgICAgICAgLyogVGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCB0aGUgaW50ZXJwcmV0ZXIgdGhyZWFkLiAgTWFyc2hhbAorICAgICAgICAgICB0aGUgY2FsbCB0byB0aGUgaW50ZXJwcmV0ZXIgdGhyZWFkLCB0aGVuIHdhaXQgZm9yCisgICAgICAgICAgIGNvbXBsZXRpb24uICovCisgICAgICAgIGlmICghV2FpdEZvck1haW5sb29wKHNlbGYpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJZXYtPnNlbGYgPSBzZWxmcHRyOwotCQlldi0+YXJncyA9IGFyZ3M7Ci0JCWV2LT5mbGFncyA9IGZsYWdzOwotCQlldi0+ZnVuYyA9IGZ1bmM7Ci0JCWV2LT5yZXMgPSAmcmVzOwotCQlldi0+ZXhjX3R5cGUgPSAmZXhjX3R5cGU7Ci0JCWV2LT5leGNfdmFsID0gJmV4Y192YWw7Ci0JCWV2LT5jb25kID0gJmNvbmQ7Ci0JCWV2LT5ldi5wcm9jID0gKFRjbF9FdmVudFByb2MqKXZhcl9wcm9jOwotCQlUa2FwcF9UaHJlYWRTZW5kKHNlbGYsIChUY2xfRXZlbnQqKWV2LCAmY29uZCwgJnZhcl9tdXRleCk7Ci0JCVRjbF9Db25kaXRpb25GaW5hbGl6ZSgmY29uZCk7Ci0JCWlmICghcmVzKSB7Ci0JCQlQeUVycl9TZXRPYmplY3QoZXhjX3R5cGUsIGV4Y192YWwpOwotCQkJUHlfREVDUkVGKGV4Y190eXBlKTsKLQkJCVB5X0RFQ1JFRihleGNfdmFsKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQorICAgICAgICBldiA9IChWYXJFdmVudCopY2thbGxvYyhzaXplb2YoVmFyRXZlbnQpKTsKKworICAgICAgICBldi0+c2VsZiA9IHNlbGZwdHI7CisgICAgICAgIGV2LT5hcmdzID0gYXJnczsKKyAgICAgICAgZXYtPmZsYWdzID0gZmxhZ3M7CisgICAgICAgIGV2LT5mdW5jID0gZnVuYzsKKyAgICAgICAgZXYtPnJlcyA9ICZyZXM7CisgICAgICAgIGV2LT5leGNfdHlwZSA9ICZleGNfdHlwZTsKKyAgICAgICAgZXYtPmV4Y192YWwgPSAmZXhjX3ZhbDsKKyAgICAgICAgZXYtPmNvbmQgPSAmY29uZDsKKyAgICAgICAgZXYtPmV2LnByb2MgPSAoVGNsX0V2ZW50UHJvYyopdmFyX3Byb2M7CisgICAgICAgIFRrYXBwX1RocmVhZFNlbmQoc2VsZiwgKFRjbF9FdmVudCopZXYsICZjb25kLCAmdmFyX211dGV4KTsKKyAgICAgICAgVGNsX0NvbmRpdGlvbkZpbmFsaXplKCZjb25kKTsKKyAgICAgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChleGNfdHlwZSwgZXhjX3ZhbCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXhjX3R5cGUpOworICAgICAgICAgICAgUHlfREVDUkVGKGV4Y192YWwpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAjZW5kaWYKLSAgICAgICAgLyogVGNsIGlzIG5vdCB0aHJlYWRlZCwgb3IgdGhpcyBpcyB0aGUgaW50ZXJwcmV0ZXIgdGhyZWFkLiAqLwotCXJldHVybiBmdW5jKHNlbGZwdHIsIGFyZ3MsIGZsYWdzKTsKKyAgICAvKiBUY2wgaXMgbm90IHRocmVhZGVkLCBvciB0aGlzIGlzIHRoZSBpbnRlcnByZXRlciB0aHJlYWQuICovCisgICAgcmV0dXJuIGZ1bmMoc2VsZnB0ciwgYXJncywgZmxhZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogU2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGZsYWdzKQogewotCWNoYXIgKm5hbWUxLCAqbmFtZTI7Ci0JUHlPYmplY3QgKm5ld1ZhbHVlOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCVRjbF9PYmogKm5ld3ZhbCwgKm9rOworICAgIGNoYXIgKm5hbWUxLCAqbmFtZTI7CisgICAgUHlPYmplY3QgKm5ld1ZhbHVlOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIFRjbF9PYmogKm5ld3ZhbCwgKm9rOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTzpzZXR2YXIiLCAKLQkJCSAgICAgdmFybmFtZV9jb252ZXJ0ZXIsICZuYW1lMSwgJm5ld1ZhbHVlKSkgewotCQkvKiBYWFggQWNxdWlyZSB0Y2wgbG9jaz8/PyAqLwotCQluZXd2YWwgPSBBc09iaihuZXdWYWx1ZSk7Ci0JCWlmIChuZXd2YWwgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlFTlRFUl9UQ0wKLQkJb2sgPSBUY2xfU2V0VmFyMkV4KFRrYXBwX0ludGVycChzZWxmKSwgbmFtZTEsIE5VTEwsIAotCQkJCSAgIG5ld3ZhbCwgZmxhZ3MpOwotCQlFTlRFUl9PVkVSTEFQCi0JCWlmICghb2spCi0JCQlUa2ludGVyX0Vycm9yKHNlbGYpOwotCQllbHNlIHsKLQkJCXJlcyA9IFB5X05vbmU7Ci0JCQlQeV9JTkNSRUYocmVzKTsKLQkJfQotCQlMRUFWRV9PVkVSTEFQX1RDTAotCX0KLQllbHNlIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzTzpzZXR2YXIiLAotCQkJCSAgICAgJm5hbWUxLCAmbmFtZTIsICZuZXdWYWx1ZSkpIHsKLQkJCS8qIFhYWCBtdXN0IGhvbGQgdGNsIGxvY2sgYWxyZWFkeT8/PyAqLwotCQkJbmV3dmFsID0gQXNPYmoobmV3VmFsdWUpOwotCQkJRU5URVJfVENMCi0JCQlvayA9IFRjbF9TZXRWYXIyRXgoVGthcHBfSW50ZXJwKHNlbGYpLCBuYW1lMSwgbmFtZTIsIG5ld3ZhbCwgZmxhZ3MpOwotCQkJRU5URVJfT1ZFUkxBUAotCQkJaWYgKCFvaykKLQkJCQlUa2ludGVyX0Vycm9yKHNlbGYpOwotCQkJZWxzZSB7Ci0JCQkJcmVzID0gUHlfTm9uZTsKLQkJCQlQeV9JTkNSRUYocmVzKTsKLQkJCX0KLQkJCUxFQVZFX09WRVJMQVBfVENMCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gcmVzOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk86c2V0dmFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YXJuYW1lX2NvbnZlcnRlciwgJm5hbWUxLCAmbmV3VmFsdWUpKSB7CisgICAgICAgIC8qIFhYWCBBY3F1aXJlIHRjbCBsb2NrPz8/ICovCisgICAgICAgIG5ld3ZhbCA9IEFzT2JqKG5ld1ZhbHVlKTsKKyAgICAgICAgaWYgKG5ld3ZhbCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIEVOVEVSX1RDTAorICAgICAgICBvayA9IFRjbF9TZXRWYXIyRXgoVGthcHBfSW50ZXJwKHNlbGYpLCBuYW1lMSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbCwgZmxhZ3MpOworICAgICAgICBFTlRFUl9PVkVSTEFQCisgICAgICAgIGlmICghb2spCisgICAgICAgICAgICBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IFB5X05vbmU7CisgICAgICAgICAgICBQeV9JTkNSRUYocmVzKTsKKyAgICAgICAgfQorICAgICAgICBMRUFWRV9PVkVSTEFQX1RDTAorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzTzpzZXR2YXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZTEsICZuYW1lMiwgJm5ld1ZhbHVlKSkgeworICAgICAgICAgICAgLyogWFhYIG11c3QgaG9sZCB0Y2wgbG9jayBhbHJlYWR5Pz8/ICovCisgICAgICAgICAgICBuZXd2YWwgPSBBc09iaihuZXdWYWx1ZSk7CisgICAgICAgICAgICBFTlRFUl9UQ0wKKyAgICAgICAgICAgIG9rID0gVGNsX1NldFZhcjJFeChUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgbmV3dmFsLCBmbGFncyk7CisgICAgICAgICAgICBFTlRFUl9PVkVSTEFQCisgICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgIFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBQeV9Ob25lOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9TZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiB2YXJfaW52b2tlKFNldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cpOworICAgIHJldHVybiB2YXJfaW52b2tlKFNldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2xvYmFsU2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gdmFyX2ludm9rZShTZXRWYXIsIHNlbGYsIGFyZ3MsIFRDTF9MRUFWRV9FUlJfTVNHIHwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICByZXR1cm4gdmFyX2ludm9rZShTZXRWYXIsIHNlbGYsIGFyZ3MsIFRDTF9MRUFWRV9FUlJfTVNHIHwgVENMX0dMT0JBTF9PTkxZKTsKIH0KIAogCi0MCisKIHN0YXRpYyBQeU9iamVjdCAqCiBHZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgZmxhZ3MpCiB7Ci0JY2hhciAqbmFtZTEsICpuYW1lMj1OVUxMOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCVRjbF9PYmogKnRyZXM7CisgICAgY2hhciAqbmFtZTEsICpuYW1lMj1OVUxMOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIFRjbF9PYmogKnRyZXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfHM6Z2V0dmFyIiwgCi0JCQkgICAgICB2YXJuYW1lX2NvbnZlcnRlciwgJm5hbWUxLCAmbmFtZTIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfHM6Z2V0dmFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFybmFtZV9jb252ZXJ0ZXIsICZuYW1lMSwgJm5hbWUyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlFTlRFUl9UQ0wKLQl0cmVzID0gVGNsX0dldFZhcjJFeChUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgZmxhZ3MpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAodHJlcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCBUY2xfR2V0U3RyaW5nUmVzdWx0KFRrYXBwX0ludGVycChzZWxmKSkpOwotCX0gZWxzZSB7Ci0JCWlmICgoKFRrYXBwT2JqZWN0KilzZWxmKS0+d2FudG9iamVjdHMpIHsKLQkJCXJlcyA9IEZyb21PYmooc2VsZiwgdHJlcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRjbF9HZXRTdHJpbmcodHJlcykpOwotCQl9Ci0JfQotCUxFQVZFX09WRVJMQVBfVENMCi0JcmV0dXJuIHJlczsKKyAgICBFTlRFUl9UQ0wKKyAgICB0cmVzID0gVGNsX0dldFZhcjJFeChUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgZmxhZ3MpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAodHJlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCBUY2xfR2V0U3RyaW5nUmVzdWx0KFRrYXBwX0ludGVycChzZWxmKSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoKFRrYXBwT2JqZWN0KilzZWxmKS0+d2FudG9iamVjdHMpIHsKKyAgICAgICAgICAgIHJlcyA9IEZyb21PYmooc2VsZiwgdHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRjbF9HZXRTdHJpbmcodHJlcykpOworICAgICAgICB9CisgICAgfQorICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0dldFZhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHZhcl9pbnZva2UoR2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyk7CisgICAgcmV0dXJuIHZhcl9pbnZva2UoR2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9HbG9iYWxHZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiB2YXJfaW52b2tlKEdldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cgfCBUQ0xfR0xPQkFMX09OTFkpOworICAgIHJldHVybiB2YXJfaW52b2tlKEdldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cgfCBUQ0xfR0xPQkFMX09OTFkpOwogfQogCiAKLQwKKwogc3RhdGljIFB5T2JqZWN0ICoKIFVuc2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGZsYWdzKQogewotCWNoYXIgKm5hbWUxLCAqbmFtZTI9TlVMTDsKLQlpbnQgY29kZTsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBjaGFyICpuYW1lMSwgKm5hbWUyPU5VTEw7CisgICAgaW50IGNvZGU7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp1bnNldHZhciIsICZuYW1lMSwgJm5hbWUyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHM6dW5zZXR2YXIiLCAmbmFtZTEsICZuYW1lMikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JRU5URVJfVENMCi0JY29kZSA9IFRjbF9VbnNldFZhcjIoVGthcHBfSW50ZXJwKHNlbGYpLCBuYW1lMSwgbmFtZTIsIGZsYWdzKTsKLQlFTlRFUl9PVkVSTEFQCi0JaWYgKGNvZGUgPT0gVENMX0VSUk9SKQotCQlyZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOwotCWVsc2UgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJlcyA9IFB5X05vbmU7Ci0JfQotCUxFQVZFX09WRVJMQVBfVENMCi0JcmV0dXJuIHJlczsKKyAgICBFTlRFUl9UQ0wKKyAgICBjb2RlID0gVGNsX1Vuc2V0VmFyMihUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgZmxhZ3MpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAoY29kZSA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmVzID0gUHlfTm9uZTsKKyAgICB9CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfVW5zZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiB2YXJfaW52b2tlKFVuc2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyk7CisgICAgcmV0dXJuIHZhcl9pbnZva2UoVW5zZXRWYXIsIHNlbGYsIGFyZ3MsIFRDTF9MRUFWRV9FUlJfTVNHKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0dsb2JhbFVuc2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gdmFyX2ludm9rZShVbnNldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cgfCBUQ0xfR0xPQkFMX09OTFkpOworICAgIHJldHVybiB2YXJfaW52b2tlKFVuc2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyB8IFRDTF9HTE9CQUxfT05MWSk7CiB9CiAKIAotDAorCiAvKiogVGNsIHRvIFB5dGhvbiAqKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0dldEludChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqczsKLQlpbnQgdjsKKyAgICBjaGFyICpzOworICAgIGludCB2OwogCi0JaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAxKSB7Ci0JCVB5T2JqZWN0KiBvID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCQlpZiAoUHlJbnRfQ2hlY2sobykpIHsKLQkJCVB5X0lOQ1JFRihvKTsKLQkJCXJldHVybiBvOwotCQl9Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRpbnQiLCAmcykpCi0JCXJldHVybiBOVUxMOwotCWlmIChUY2xfR2V0SW50KFRrYXBwX0ludGVycChzZWxmKSwgcywgJnYpID09IFRDTF9FUlJPUikKLQkJcmV0dXJuIFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCB2KTsKKyAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKKyAgICAgICAgUHlPYmplY3QqIG8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgICAgIGlmIChQeUludF9DaGVjayhvKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKG8pOworICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGludCIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFRjbF9HZXRJbnQoVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdikgPT0gVENMX0VSUk9SKQorICAgICAgICByZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2V0RG91YmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzOwotCWRvdWJsZSB2OworICAgIGNoYXIgKnM7CisgICAgZG91YmxlIHY7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKLQkJUHlPYmplY3QgKm8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JCWlmIChQeUZsb2F0X0NoZWNrKG8pKSB7Ci0JCQlQeV9JTkNSRUYobyk7Ci0JCQlyZXR1cm4gbzsKLQkJfQotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0ZG91YmxlIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoVGNsX0dldERvdWJsZShUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KSA9PSBUQ0xfRVJST1IpCi0JCXJldHVybiBUa2ludGVyX0Vycm9yKHNlbGYpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJkIiwgdik7CisgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAxKSB7CisgICAgICAgIFB5T2JqZWN0ICpvID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOworICAgICAgICBpZiAoUHlGbG9hdF9DaGVjayhvKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKG8pOworICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGRvdWJsZSIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFRjbF9HZXREb3VibGUoVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdikgPT0gVENMX0VSUk9SKQorICAgICAgICByZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZCIsIHYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2V0Qm9vbGVhbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqczsKLQlpbnQgdjsKKyAgICBjaGFyICpzOworICAgIGludCB2OwogCi0JaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAxKSB7Ci0JCVB5T2JqZWN0ICpvID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCQlpZiAoUHlJbnRfQ2hlY2sobykpIHsKLQkJCVB5X0lOQ1JFRihvKTsKLQkJCXJldHVybiBvOwotCQl9Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRib29sZWFuIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoVGNsX0dldEJvb2xlYW4oVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdikgPT0gVENMX0VSUk9SKQotCQlyZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHYpOworICAgIGlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMSkgeworICAgICAgICBQeU9iamVjdCAqbyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKG8pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0Ym9vbGVhbiIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFRjbF9HZXRCb29sZWFuKFRrYXBwX0ludGVycChzZWxmKSwgcywgJnYpID09IFRDTF9FUlJPUikKKyAgICAgICAgcmV0dXJuIFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyh2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0V4cHJTdHJpbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnM7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JaW50IHJldHZhbDsKKyAgICBjaGFyICpzOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGludCByZXR2YWw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwcnN0cmluZyIsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV4cHJzdHJpbmciLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JRU5URVJfVENMCi0JcmV0dmFsID0gVGNsX0V4cHJTdHJpbmcoVGthcHBfSW50ZXJwKHNlbGYpLCBzKTsKLQlFTlRFUl9PVkVSTEFQCi0JaWYgKHJldHZhbCA9PSBUQ0xfRVJST1IpCi0JCXJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JZWxzZQotCQlyZXMgPSBQeV9CdWlsZFZhbHVlKCJzIiwgVGthcHBfUmVzdWx0KHNlbGYpKTsKLQlMRUFWRV9PVkVSTEFQX1RDTAotCXJldHVybiByZXM7CisgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisKKyAgICBFTlRFUl9UQ0wKKyAgICByZXR2YWwgPSBUY2xfRXhwclN0cmluZyhUa2FwcF9JbnRlcnAoc2VsZiksIHMpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAocmV0dmFsID09IFRDTF9FUlJPUikKKyAgICAgICAgcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5X0J1aWxkVmFsdWUoInMiLCBUa2FwcF9SZXN1bHQoc2VsZikpOworICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0V4cHJMb25nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWludCByZXR2YWw7Ci0JbG9uZyB2OworICAgIGNoYXIgKnM7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgaW50IHJldHZhbDsKKyAgICBsb25nIHY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwcmxvbmciLCAmcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpleHBybG9uZyIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKIAotCUVOVEVSX1RDTAotCXJldHZhbCA9IFRjbF9FeHByTG9uZyhUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KTsKLQlFTlRFUl9PVkVSTEFQCi0JaWYgKHJldHZhbCA9PSBUQ0xfRVJST1IpCi0JCXJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JZWxzZQotCQlyZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwgdik7Ci0JTEVBVkVfT1ZFUkxBUF9UQ0wKLQlyZXR1cm4gcmVzOworICAgIEVOVEVSX1RDTAorICAgIHJldHZhbCA9IFRjbF9FeHByTG9uZyhUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KTsKKyAgICBFTlRFUl9PVkVSTEFQCisgICAgaWYgKHJldHZhbCA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgZWxzZQorICAgICAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwgdik7CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfRXhwckRvdWJsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqczsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlkb3VibGUgdjsKLQlpbnQgcmV0dmFsOworICAgIGNoYXIgKnM7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgZG91YmxlIHY7CisgICAgaW50IHJldHZhbDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpleHByZG91YmxlIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJUa2FwcF9FeHByRG91YmxlIiwgcmV0dXJuIDApCi0JRU5URVJfVENMCi0JcmV0dmFsID0gVGNsX0V4cHJEb3VibGUoVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdik7Ci0JRU5URVJfT1ZFUkxBUAotCVB5RlBFX0VORF9QUk9URUNUKHJldHZhbCkKLQlpZiAocmV0dmFsID09IFRDTF9FUlJPUikKLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQllbHNlCi0JCXJlcyA9IFB5X0J1aWxkVmFsdWUoImQiLCB2KTsKLQlMRUFWRV9PVkVSTEFQX1RDTAotCXJldHVybiByZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV4cHJkb3VibGUiLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoIlRrYXBwX0V4cHJEb3VibGUiLCByZXR1cm4gMCkKKyAgICBFTlRFUl9UQ0wKKyAgICByZXR2YWwgPSBUY2xfRXhwckRvdWJsZShUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KTsKKyAgICBFTlRFUl9PVkVSTEFQCisgICAgUHlGUEVfRU5EX1BST1RFQ1QocmV0dmFsKQorICAgIGlmIChyZXR2YWwgPT0gVENMX0VSUk9SKQorICAgICAgICByZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsIHYpOworICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0V4cHJCb29sZWFuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWludCByZXR2YWw7Ci0JaW50IHY7CisgICAgY2hhciAqczsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBpbnQgcmV0dmFsOworICAgIGludCB2OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV4cHJib29sZWFuIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKLQlFTlRFUl9UQ0wKLQlyZXR2YWwgPSBUY2xfRXhwckJvb2xlYW4oVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdik7Ci0JRU5URVJfT1ZFUkxBUAotCWlmIChyZXR2YWwgPT0gVENMX0VSUk9SKQotCQlyZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOwotCWVsc2UKLQkJcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsIHYpOwotCUxFQVZFX09WRVJMQVBfVENMCi0JcmV0dXJuIHJlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwcmJvb2xlYW4iLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIEVOVEVSX1RDTAorICAgIHJldHZhbCA9IFRjbF9FeHByQm9vbGVhbihUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KTsKKyAgICBFTlRFUl9PVkVSTEFQCisgICAgaWYgKHJldHZhbCA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgZWxzZQorICAgICAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgdik7CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiAKLQwKKwogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1NwbGl0TGlzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbGlzdDsKLQlpbnQgYXJnYzsKLQljaGFyICoqYXJndjsKLQlQeU9iamVjdCAqdjsKLQlpbnQgaTsKKyAgICBjaGFyICpsaXN0OworICAgIGludCBhcmdjOworICAgIGNoYXIgKiphcmd2OworICAgIFB5T2JqZWN0ICp2OworICAgIGludCBpOwogCi0JaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAxKSB7Ci0JCXYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JCWlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCQlQeV9JTkNSRUYodik7Ci0JCQlyZXR1cm4gdjsKLQkJfQotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0OnNwbGl0bGlzdCIsICJ1dGYtOCIsICZsaXN0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAxKSB7CisgICAgICAgIHYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0OnNwbGl0bGlzdCIsICJ1dGYtOCIsICZsaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoVGNsX1NwbGl0TGlzdChUa2FwcF9JbnRlcnAoc2VsZiksIGxpc3QsIAotCQkJICAmYXJnYywgJmFyZ3YpID09IFRDTF9FUlJPUikgIHsKLQkJUHlNZW1fRnJlZShsaXN0KTsKLQkJcmV0dXJuIFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JfQorICAgIGlmIChUY2xfU3BsaXRMaXN0KFRrYXBwX0ludGVycChzZWxmKSwgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAmYXJnYywgJmFyZ3YpID09IFRDTF9FUlJPUikgIHsKKyAgICAgICAgUHlNZW1fRnJlZShsaXN0KTsKKyAgICAgICAgcmV0dXJuIFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgfQogCi0JaWYgKCEodiA9IFB5VHVwbGVfTmV3KGFyZ2MpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKHYgPSBQeVR1cGxlX05ldyhhcmdjKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLQkJUHlPYmplY3QgKnMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbaV0pOwotCQlpZiAoIXMgfHwgUHlUdXBsZV9TZXRJdGVtKHYsIGksIHMpKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQl2ID0gTlVMTDsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2W2ldKTsKKyAgICAgICAgaWYgKCFzIHx8IFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBzKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CiAKICAgZmluYWxseToKLQlja2ZyZWUoRlJFRUNBU1QgYXJndik7Ci0JUHlNZW1fRnJlZShsaXN0KTsKLQlyZXR1cm4gdjsKKyAgICBja2ZyZWUoRlJFRUNBU1QgYXJndik7CisgICAgUHlNZW1fRnJlZShsaXN0KTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1NwbGl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdjsKLQljaGFyICpsaXN0OworICAgIFB5T2JqZWN0ICp2OworICAgIGNoYXIgKmxpc3Q7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKLQkJUHlPYmplY3QqIG8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JCWlmIChQeVR1cGxlX0NoZWNrKG8pKSB7Ci0JCQlvID0gU3BsaXRPYmoobyk7Ci0JCQlyZXR1cm4gbzsKLQkJfQotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0OnNwbGl0IiwgInV0Zi04IiwgJmxpc3QpKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gU3BsaXQobGlzdCk7Ci0JUHlNZW1fRnJlZShsaXN0KTsKLQlyZXR1cm4gdjsKKyAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKKyAgICAgICAgUHlPYmplY3QqIG8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKG8pKSB7CisgICAgICAgICAgICBvID0gU3BsaXRPYmoobyk7CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0OnNwbGl0IiwgInV0Zi04IiwgJmxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2ID0gU3BsaXQobGlzdCk7CisgICAgUHlNZW1fRnJlZShsaXN0KTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX01lcmdlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzID0gTWVyZ2UoYXJncyk7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgY2hhciAqcyA9IE1lcmdlKGFyZ3MpOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwogCi0JaWYgKHMpIHsKLQkJcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKLQkJY2tmcmVlKHMpOwotCX0KKyAgICBpZiAocykgeworICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOworICAgICAgICBja2ZyZWUocyk7CisgICAgfQogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKLQwKKwogLyoqIFRjbCBDb21tYW5kICoqLwogCiAvKiBDbGllbnQgZGF0YSBzdHJ1Y3QgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdCAqc2VsZjsKLQlQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqZnVuYzsKIH0gUHl0aG9uQ21kX0NsaWVudERhdGE7CiAKIHN0YXRpYyBpbnQKIFB5dGhvbkNtZF9FcnJvcihUY2xfSW50ZXJwICppbnRlcnApCiB7Ci0JZXJyb3JJbkNtZCA9IDE7Ci0JUHlFcnJfRmV0Y2goJmV4Y0luQ21kLCAmdmFsSW5DbWQsICZ0cmJJbkNtZCk7Ci0JTEVBVkVfUFlUSE9OCi0JcmV0dXJuIFRDTF9FUlJPUjsKKyAgICBlcnJvckluQ21kID0gMTsKKyAgICBQeUVycl9GZXRjaCgmZXhjSW5DbWQsICZ2YWxJbkNtZCwgJnRyYkluQ21kKTsKKyAgICBMRUFWRV9QWVRIT04KKyAgICByZXR1cm4gVENMX0VSUk9SOwogfQogCiAvKiBUaGlzIGlzIHRoZSBUY2wgY29tbWFuZCB0aGF0IGFjdHMgYXMgYSB3cmFwcGVyIGZvciBQeXRob24KQEAgLTIwNDgsMjExICsyMDQ4LDIxMSBAQAogc3RhdGljIGludAogUHl0aG9uQ21kKENsaWVudERhdGEgY2xpZW50RGF0YSwgVGNsX0ludGVycCAqaW50ZXJwLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewotCVB5dGhvbkNtZF9DbGllbnREYXRhICpkYXRhID0gKFB5dGhvbkNtZF9DbGllbnREYXRhICopY2xpZW50RGF0YTsKLQlQeU9iamVjdCAqZnVuYywgKmFyZywgKnJlczsKLQlpbnQgaSwgcnY7Ci0JVGNsX09iaiAqb2JqX3JlczsKKyAgICBQeXRob25DbWRfQ2xpZW50RGF0YSAqZGF0YSA9IChQeXRob25DbWRfQ2xpZW50RGF0YSAqKWNsaWVudERhdGE7CisgICAgUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7CisgICAgaW50IGksIHJ2OworICAgIFRjbF9PYmogKm9ial9yZXM7CiAKLQlFTlRFUl9QWVRIT04KKyAgICBFTlRFUl9QWVRIT04KIAotCS8qIFRCRDogbm8gZXJyb3IgY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBrbm93LCB2aWEgdGhlCi0JICogVGthcHBfQ3JlYXRlQ29tbWFuZCgpIHRoYXQgdGhlIGNsaWVudCBkYXRhIGlzIGEgdHdvLXR1cGxlCi0JICovCi0JZnVuYyA9IGRhdGEtPmZ1bmM7CisgICAgLyogVEJEOiBubyBlcnJvciBjaGVja2luZyBoZXJlIHNpbmNlIHdlIGtub3csIHZpYSB0aGUKKyAgICAgKiBUa2FwcF9DcmVhdGVDb21tYW5kKCkgdGhhdCB0aGUgY2xpZW50IGRhdGEgaXMgYSB0d28tdHVwbGUKKyAgICAgKi8KKyAgICBmdW5jID0gZGF0YS0+ZnVuYzsKIAotCS8qIENyZWF0ZSBhcmd1bWVudCBsaXN0IChhcmd2MSwgLi4uLCBhcmd2TikgKi8KLQlpZiAoIShhcmcgPSBQeVR1cGxlX05ldyhhcmdjIC0gMSkpKQotCQlyZXR1cm4gUHl0aG9uQ21kX0Vycm9yKGludGVycCk7CisgICAgLyogQ3JlYXRlIGFyZ3VtZW50IGxpc3QgKGFyZ3YxLCAuLi4sIGFyZ3ZOKSAqLworICAgIGlmICghKGFyZyA9IFB5VHVwbGVfTmV3KGFyZ2MgLSAxKSkpCisgICAgICAgIHJldHVybiBQeXRob25DbWRfRXJyb3IoaW50ZXJwKTsKIAotCWZvciAoaSA9IDA7IGkgPCAoYXJnYyAtIDEpOyBpKyspIHsKLQkJUHlPYmplY3QgKnMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbaSArIDFdKTsKLQkJaWYgKCFzIHx8IFB5VHVwbGVfU2V0SXRlbShhcmcsIGksIHMpKSB7Ci0JCQlQeV9ERUNSRUYoYXJnKTsKLQkJCXJldHVybiBQeXRob25DbWRfRXJyb3IoaW50ZXJwKTsKLQkJfQotCX0KLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwotCVB5X0RFQ1JFRihhcmcpOworICAgIGZvciAoaSA9IDA7IGkgPCAoYXJnYyAtIDEpOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbaSArIDFdKTsKKyAgICAgICAgaWYgKCFzIHx8IFB5VHVwbGVfU2V0SXRlbShhcmcsIGksIHMpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgIHJldHVybiBQeXRob25DbWRfRXJyb3IoaW50ZXJwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgIFB5X0RFQ1JFRihhcmcpOwogCi0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gUHl0aG9uQ21kX0Vycm9yKGludGVycCk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHl0aG9uQ21kX0Vycm9yKGludGVycCk7CiAKLQlvYmpfcmVzID0gQXNPYmoocmVzKTsKLQlpZiAob2JqX3JlcyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlyZXR1cm4gUHl0aG9uQ21kX0Vycm9yKGludGVycCk7Ci0JfQotCWVsc2UgewotCQlUY2xfU2V0T2JqUmVzdWx0KGludGVycCwgb2JqX3Jlcyk7Ci0JCXJ2ID0gVENMX09LOwotCX0KKyAgICBvYmpfcmVzID0gQXNPYmoocmVzKTsKKyAgICBpZiAob2JqX3JlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gUHl0aG9uQ21kX0Vycm9yKGludGVycCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBUY2xfU2V0T2JqUmVzdWx0KGludGVycCwgb2JqX3Jlcyk7CisgICAgICAgIHJ2ID0gVENMX09LOworICAgIH0KIAotCVB5X0RFQ1JFRihyZXMpOworICAgIFB5X0RFQ1JFRihyZXMpOwogCi0JTEVBVkVfUFlUSE9OCisgICAgTEVBVkVfUFlUSE9OCiAKLQlyZXR1cm4gcnY7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgdm9pZAogUHl0aG9uQ21kRGVsZXRlKENsaWVudERhdGEgY2xpZW50RGF0YSkKIHsKLQlQeXRob25DbWRfQ2xpZW50RGF0YSAqZGF0YSA9IChQeXRob25DbWRfQ2xpZW50RGF0YSAqKWNsaWVudERhdGE7CisgICAgUHl0aG9uQ21kX0NsaWVudERhdGEgKmRhdGEgPSAoUHl0aG9uQ21kX0NsaWVudERhdGEgKiljbGllbnREYXRhOwogCi0JRU5URVJfUFlUSE9OCi0JUHlfWERFQ1JFRihkYXRhLT5zZWxmKTsKLQlQeV9YREVDUkVGKGRhdGEtPmZ1bmMpOwotCVB5TWVtX0RFTChkYXRhKTsKLQlMRUFWRV9QWVRIT04KKyAgICBFTlRFUl9QWVRIT04KKyAgICBQeV9YREVDUkVGKGRhdGEtPnNlbGYpOworICAgIFB5X1hERUNSRUYoZGF0YS0+ZnVuYyk7CisgICAgUHlNZW1fREVMKGRhdGEpOworICAgIExFQVZFX1BZVEhPTgogfQogCiAKLQwKKwogCiAjaWZkZWYgV0lUSF9USFJFQUQKIFRDTF9ERUNMQVJFX01VVEVYKGNvbW1hbmRfbXV0ZXgpCiAKIHR5cGVkZWYgc3RydWN0IENvbW1hbmRFdmVudHsKLQlUY2xfRXZlbnQgZXY7Ci0JVGNsX0ludGVycCogaW50ZXJwOwotCWNoYXIgKm5hbWU7Ci0JaW50IGNyZWF0ZTsKLQlpbnQgKnN0YXR1czsKLQlDbGllbnREYXRhICpkYXRhOwotCVRjbF9Db25kaXRpb24gKmRvbmU7CisgICAgVGNsX0V2ZW50IGV2OworICAgIFRjbF9JbnRlcnAqIGludGVycDsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBjcmVhdGU7CisgICAgaW50ICpzdGF0dXM7CisgICAgQ2xpZW50RGF0YSAqZGF0YTsKKyAgICBUY2xfQ29uZGl0aW9uICpkb25lOwogfSBDb21tYW5kRXZlbnQ7CiAKIHN0YXRpYyBpbnQKIFRrYXBwX0NvbW1hbmRQcm9jKENvbW1hbmRFdmVudCAqZXYsIGludCBmbGFncykKIHsKLQlpZiAoZXYtPmNyZWF0ZSkKLQkJKmV2LT5zdGF0dXMgPSBUY2xfQ3JlYXRlQ29tbWFuZCgKLQkJCWV2LT5pbnRlcnAsIGV2LT5uYW1lLCBQeXRob25DbWQsCi0JCQlldi0+ZGF0YSwgUHl0aG9uQ21kRGVsZXRlKSA9PSBOVUxMOwotCWVsc2UKLQkJKmV2LT5zdGF0dXMgPSBUY2xfRGVsZXRlQ29tbWFuZChldi0+aW50ZXJwLCBldi0+bmFtZSk7Ci0JVGNsX011dGV4TG9jaygmY29tbWFuZF9tdXRleCk7Ci0JVGNsX0NvbmRpdGlvbk5vdGlmeShldi0+ZG9uZSk7Ci0JVGNsX011dGV4VW5sb2NrKCZjb21tYW5kX211dGV4KTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoZXYtPmNyZWF0ZSkKKyAgICAgICAgKmV2LT5zdGF0dXMgPSBUY2xfQ3JlYXRlQ29tbWFuZCgKKyAgICAgICAgICAgIGV2LT5pbnRlcnAsIGV2LT5uYW1lLCBQeXRob25DbWQsCisgICAgICAgICAgICBldi0+ZGF0YSwgUHl0aG9uQ21kRGVsZXRlKSA9PSBOVUxMOworICAgIGVsc2UKKyAgICAgICAgKmV2LT5zdGF0dXMgPSBUY2xfRGVsZXRlQ29tbWFuZChldi0+aW50ZXJwLCBldi0+bmFtZSk7CisgICAgVGNsX011dGV4TG9jaygmY29tbWFuZF9tdXRleCk7CisgICAgVGNsX0NvbmRpdGlvbk5vdGlmeShldi0+ZG9uZSk7CisgICAgVGNsX011dGV4VW5sb2NrKCZjb21tYW5kX211dGV4KTsKKyAgICByZXR1cm4gMTsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfQ3JlYXRlQ29tbWFuZChQeU9iamVjdCAqc2VsZnB0ciwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7Ci0JUHl0aG9uQ21kX0NsaWVudERhdGEgKmRhdGE7Ci0JY2hhciAqY21kTmFtZTsKLQlQeU9iamVjdCAqZnVuYzsKLQlpbnQgZXJyOworICAgIFRrYXBwT2JqZWN0ICpzZWxmID0gKFRrYXBwT2JqZWN0KilzZWxmcHRyOworICAgIFB5dGhvbkNtZF9DbGllbnREYXRhICpkYXRhOworICAgIGNoYXIgKmNtZE5hbWU7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgaW50IGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086Y3JlYXRlY29tbWFuZCIsICZjbWROYW1lLCAmZnVuYykpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29tbWFuZCBub3QgY2FsbGFibGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086Y3JlYXRlY29tbWFuZCIsICZjbWROYW1lLCAmZnVuYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29tbWFuZCBub3QgY2FsbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+dGhyZWFkZWQgJiYgc2VsZi0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkgJiYKLQkgICAgIVdhaXRGb3JNYWlubG9vcChzZWxmKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpICYmCisgICAgICAgICFXYWl0Rm9yTWFpbmxvb3Aoc2VsZikpCisgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiAKLQlkYXRhID0gUHlNZW1fTkVXKFB5dGhvbkNtZF9DbGllbnREYXRhLCAxKTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlQeV9JTkNSRUYoZnVuYyk7Ci0JZGF0YS0+c2VsZiA9IHNlbGZwdHI7Ci0JZGF0YS0+ZnVuYyA9IGZ1bmM7CisgICAgZGF0YSA9IFB5TWVtX05FVyhQeXRob25DbWRfQ2xpZW50RGF0YSwgMSk7CisgICAgaWYgKCFkYXRhKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIGRhdGEtPnNlbGYgPSBzZWxmcHRyOworICAgIGRhdGEtPmZ1bmMgPSBmdW5jOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+dGhyZWFkZWQgJiYgc2VsZi0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkpIHsKLQkJVGNsX0NvbmRpdGlvbiBjb25kID0gTlVMTDsKLQkJQ29tbWFuZEV2ZW50ICpldiA9IChDb21tYW5kRXZlbnQqKWNrYWxsb2Moc2l6ZW9mKENvbW1hbmRFdmVudCkpOwotCQlldi0+ZXYucHJvYyA9IChUY2xfRXZlbnRQcm9jKilUa2FwcF9Db21tYW5kUHJvYzsKLQkJZXYtPmludGVycCA9IHNlbGYtPmludGVycDsKLQkJZXYtPmNyZWF0ZSA9IDE7Ci0JCWV2LT5uYW1lID0gY21kTmFtZTsKLQkJZXYtPmRhdGEgPSAoQ2xpZW50RGF0YSlkYXRhOwotCQlldi0+c3RhdHVzID0gJmVycjsKLQkJZXYtPmRvbmUgPSAmY29uZDsKLQkJVGthcHBfVGhyZWFkU2VuZChzZWxmLCAoVGNsX0V2ZW50KilldiwgJmNvbmQsICZjb21tYW5kX211dGV4KTsKLQkJVGNsX0NvbmRpdGlvbkZpbmFsaXplKCZjb25kKTsKLQl9Ci0JZWxzZQorICAgIGlmIChzZWxmLT50aHJlYWRlZCAmJiBzZWxmLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICBUY2xfQ29uZGl0aW9uIGNvbmQgPSBOVUxMOworICAgICAgICBDb21tYW5kRXZlbnQgKmV2ID0gKENvbW1hbmRFdmVudCopY2thbGxvYyhzaXplb2YoQ29tbWFuZEV2ZW50KSk7CisgICAgICAgIGV2LT5ldi5wcm9jID0gKFRjbF9FdmVudFByb2MqKVRrYXBwX0NvbW1hbmRQcm9jOworICAgICAgICBldi0+aW50ZXJwID0gc2VsZi0+aW50ZXJwOworICAgICAgICBldi0+Y3JlYXRlID0gMTsKKyAgICAgICAgZXYtPm5hbWUgPSBjbWROYW1lOworICAgICAgICBldi0+ZGF0YSA9IChDbGllbnREYXRhKWRhdGE7CisgICAgICAgIGV2LT5zdGF0dXMgPSAmZXJyOworICAgICAgICBldi0+ZG9uZSA9ICZjb25kOworICAgICAgICBUa2FwcF9UaHJlYWRTZW5kKHNlbGYsIChUY2xfRXZlbnQqKWV2LCAmY29uZCwgJmNvbW1hbmRfbXV0ZXgpOworICAgICAgICBUY2xfQ29uZGl0aW9uRmluYWxpemUoJmNvbmQpOworICAgIH0KKyAgICBlbHNlCiAjZW5kaWYKLQl7Ci0JCUVOVEVSX1RDTAotCQllcnIgPSBUY2xfQ3JlYXRlQ29tbWFuZCgKLQkJCVRrYXBwX0ludGVycChzZWxmKSwgY21kTmFtZSwgUHl0aG9uQ21kLAotCQkJKENsaWVudERhdGEpZGF0YSwgUHl0aG9uQ21kRGVsZXRlKSA9PSBOVUxMOwotCQlMRUFWRV9UQ0wKLQl9Ci0JaWYgKGVycikgewotCQlQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgImNhbid0IGNyZWF0ZSBUY2wgY29tbWFuZCIpOwotCQlQeU1lbV9ERUwoZGF0YSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB7CisgICAgICAgIEVOVEVSX1RDTAorICAgICAgICBlcnIgPSBUY2xfQ3JlYXRlQ29tbWFuZCgKKyAgICAgICAgICAgIFRrYXBwX0ludGVycChzZWxmKSwgY21kTmFtZSwgUHl0aG9uQ21kLAorICAgICAgICAgICAgKENsaWVudERhdGEpZGF0YSwgUHl0aG9uQ21kRGVsZXRlKSA9PSBOVUxMOworICAgICAgICBMRUFWRV9UQ0wKKyAgICB9CisgICAgaWYgKGVycikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgImNhbid0IGNyZWF0ZSBUY2wgY29tbWFuZCIpOworICAgICAgICBQeU1lbV9ERUwoZGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotDAorCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfRGVsZXRlQ29tbWFuZChQeU9iamVjdCAqc2VsZnB0ciwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7Ci0JY2hhciAqY21kTmFtZTsKLQlpbnQgZXJyOworICAgIFRrYXBwT2JqZWN0ICpzZWxmID0gKFRrYXBwT2JqZWN0KilzZWxmcHRyOworICAgIGNoYXIgKmNtZE5hbWU7CisgICAgaW50IGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpkZWxldGVjb21tYW5kIiwgJmNtZE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZGVsZXRlY29tbWFuZCIsICZjbWROYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChzZWxmLT50aHJlYWRlZCAmJiBzZWxmLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSkgewotCQlUY2xfQ29uZGl0aW9uIGNvbmQgPSBOVUxMOwotCQlDb21tYW5kRXZlbnQgKmV2OwotCQlldiA9IChDb21tYW5kRXZlbnQqKWNrYWxsb2Moc2l6ZW9mKENvbW1hbmRFdmVudCkpOwotCQlldi0+ZXYucHJvYyA9IChUY2xfRXZlbnRQcm9jKilUa2FwcF9Db21tYW5kUHJvYzsKLQkJZXYtPmludGVycCA9IHNlbGYtPmludGVycDsKLQkJZXYtPmNyZWF0ZSA9IDA7Ci0JCWV2LT5uYW1lID0gY21kTmFtZTsKLQkJZXYtPnN0YXR1cyA9ICZlcnI7Ci0JCWV2LT5kb25lID0gJmNvbmQ7Ci0JCVRrYXBwX1RocmVhZFNlbmQoc2VsZiwgKFRjbF9FdmVudCopZXYsICZjb25kLCAKLQkJCQkgJmNvbW1hbmRfbXV0ZXgpOwotCQlUY2xfQ29uZGl0aW9uRmluYWxpemUoJmNvbmQpOwotCX0KLQllbHNlCisgICAgaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpKSB7CisgICAgICAgIFRjbF9Db25kaXRpb24gY29uZCA9IE5VTEw7CisgICAgICAgIENvbW1hbmRFdmVudCAqZXY7CisgICAgICAgIGV2ID0gKENvbW1hbmRFdmVudCopY2thbGxvYyhzaXplb2YoQ29tbWFuZEV2ZW50KSk7CisgICAgICAgIGV2LT5ldi5wcm9jID0gKFRjbF9FdmVudFByb2MqKVRrYXBwX0NvbW1hbmRQcm9jOworICAgICAgICBldi0+aW50ZXJwID0gc2VsZi0+aW50ZXJwOworICAgICAgICBldi0+Y3JlYXRlID0gMDsKKyAgICAgICAgZXYtPm5hbWUgPSBjbWROYW1lOworICAgICAgICBldi0+c3RhdHVzID0gJmVycjsKKyAgICAgICAgZXYtPmRvbmUgPSAmY29uZDsKKyAgICAgICAgVGthcHBfVGhyZWFkU2VuZChzZWxmLCAoVGNsX0V2ZW50KilldiwgJmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmRfbXV0ZXgpOworICAgICAgICBUY2xfQ29uZGl0aW9uRmluYWxpemUoJmNvbmQpOworICAgIH0KKyAgICBlbHNlCiAjZW5kaWYKLQl7Ci0JCUVOVEVSX1RDTAotCQllcnIgPSBUY2xfRGVsZXRlQ29tbWFuZChzZWxmLT5pbnRlcnAsIGNtZE5hbWUpOwotCQlMRUFWRV9UQ0wKLQl9Ci0JaWYgKGVyciA9PSAtMSkgewotCQlQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgImNhbid0IGRlbGV0ZSBUY2wgY29tbWFuZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHsKKyAgICAgICAgRU5URVJfVENMCisgICAgICAgIGVyciA9IFRjbF9EZWxldGVDb21tYW5kKHNlbGYtPmludGVycCwgY21kTmFtZSk7CisgICAgICAgIExFQVZFX1RDTAorICAgIH0KKyAgICBpZiAoZXJyID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCAiY2FuJ3QgZGVsZXRlIFRjbCBjb21tYW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotDAorCiAjaWZkZWYgSEFWRV9DUkVBVEVGSUxFSEFORExFUgogLyoqIEZpbGUgSGFuZGxlciAqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgX2ZoY2RhdGEgewotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICpmaWxlOwotCWludCBpZDsKLQlzdHJ1Y3QgX2ZoY2RhdGEgKm5leHQ7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKmZpbGU7CisgICAgaW50IGlkOworICAgIHN0cnVjdCBfZmhjZGF0YSAqbmV4dDsKIH0gRmlsZUhhbmRsZXJfQ2xpZW50RGF0YTsKIAogc3RhdGljIEZpbGVIYW5kbGVyX0NsaWVudERhdGEgKkhlYWRGSENEOwpAQCAtMjI2MCw3ODYgKzIyNjAsNzg2IEBACiBzdGF0aWMgRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqCiBOZXdGSENEKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqZmlsZSwgaW50IGlkKQogewotCUZpbGVIYW5kbGVyX0NsaWVudERhdGEgKnA7Ci0JcCA9IFB5TWVtX05FVyhGaWxlSGFuZGxlcl9DbGllbnREYXRhLCAxKTsKLQlpZiAocCAhPSBOVUxMKSB7Ci0JCVB5X1hJTkNSRUYoZnVuYyk7Ci0JCVB5X1hJTkNSRUYoZmlsZSk7Ci0JCXAtPmZ1bmMgPSBmdW5jOwotCQlwLT5maWxlID0gZmlsZTsKLQkJcC0+aWQgPSBpZDsKLQkJcC0+bmV4dCA9IEhlYWRGSENEOwotCQlIZWFkRkhDRCA9IHA7Ci0JfQotCXJldHVybiBwOworICAgIEZpbGVIYW5kbGVyX0NsaWVudERhdGEgKnA7CisgICAgcCA9IFB5TWVtX05FVyhGaWxlSGFuZGxlcl9DbGllbnREYXRhLCAxKTsKKyAgICBpZiAocCAhPSBOVUxMKSB7CisgICAgICAgIFB5X1hJTkNSRUYoZnVuYyk7CisgICAgICAgIFB5X1hJTkNSRUYoZmlsZSk7CisgICAgICAgIHAtPmZ1bmMgPSBmdW5jOworICAgICAgICBwLT5maWxlID0gZmlsZTsKKyAgICAgICAgcC0+aWQgPSBpZDsKKyAgICAgICAgcC0+bmV4dCA9IEhlYWRGSENEOworICAgICAgICBIZWFkRkhDRCA9IHA7CisgICAgfQorICAgIHJldHVybiBwOwogfQogCiBzdGF0aWMgdm9pZAogRGVsZXRlRkhDRChpbnQgaWQpCiB7Ci0JRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqcCwgKipwcDsKKyAgICBGaWxlSGFuZGxlcl9DbGllbnREYXRhICpwLCAqKnBwOwogCi0JcHAgPSAmSGVhZEZIQ0Q7Ci0Jd2hpbGUgKChwID0gKnBwKSAhPSBOVUxMKSB7Ci0JCWlmIChwLT5pZCA9PSBpZCkgewotCQkJKnBwID0gcC0+bmV4dDsKLQkJCVB5X1hERUNSRUYocC0+ZnVuYyk7Ci0JCQlQeV9YREVDUkVGKHAtPmZpbGUpOwotCQkJUHlNZW1fREVMKHApOwotCQl9Ci0JCWVsc2UKLQkJCXBwID0gJnAtPm5leHQ7Ci0JfQorICAgIHBwID0gJkhlYWRGSENEOworICAgIHdoaWxlICgocCA9ICpwcCkgIT0gTlVMTCkgeworICAgICAgICBpZiAocC0+aWQgPT0gaWQpIHsKKyAgICAgICAgICAgICpwcCA9IHAtPm5leHQ7CisgICAgICAgICAgICBQeV9YREVDUkVGKHAtPmZ1bmMpOworICAgICAgICAgICAgUHlfWERFQ1JFRihwLT5maWxlKTsKKyAgICAgICAgICAgIFB5TWVtX0RFTChwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBwcCA9ICZwLT5uZXh0OworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIEZpbGVIYW5kbGVyKENsaWVudERhdGEgY2xpZW50RGF0YSwgaW50IG1hc2spCiB7Ci0JRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqZGF0YSA9IChGaWxlSGFuZGxlcl9DbGllbnREYXRhICopY2xpZW50RGF0YTsKLQlQeU9iamVjdCAqZnVuYywgKmZpbGUsICphcmcsICpyZXM7CisgICAgRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqZGF0YSA9IChGaWxlSGFuZGxlcl9DbGllbnREYXRhICopY2xpZW50RGF0YTsKKyAgICBQeU9iamVjdCAqZnVuYywgKmZpbGUsICphcmcsICpyZXM7CiAKLQlFTlRFUl9QWVRIT04KLQlmdW5jID0gZGF0YS0+ZnVuYzsKLQlmaWxlID0gZGF0YS0+ZmlsZTsKKyAgICBFTlRFUl9QWVRIT04KKyAgICBmdW5jID0gZGF0YS0+ZnVuYzsKKyAgICBmaWxlID0gZGF0YS0+ZmlsZTsKIAotCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihPaSkiLCBmaWxlLCAobG9uZykgbWFzayk7Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKLQlQeV9ERUNSRUYoYXJnKTsKKyAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIoT2kpIiwgZmlsZSwgKGxvbmcpIG1hc2spOworICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgUHlfREVDUkVGKGFyZyk7CiAKLQlpZiAocmVzID09IE5VTEwpIHsKLQkJZXJyb3JJbkNtZCA9IDE7Ci0JCVB5RXJyX0ZldGNoKCZleGNJbkNtZCwgJnZhbEluQ21kLCAmdHJiSW5DbWQpOwotCX0KLQlQeV9YREVDUkVGKHJlcyk7Ci0JTEVBVkVfUFlUSE9OCisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIGVycm9ySW5DbWQgPSAxOworICAgICAgICBQeUVycl9GZXRjaCgmZXhjSW5DbWQsICZ2YWxJbkNtZCwgJnRyYkluQ21kKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihyZXMpOworICAgIExFQVZFX1BZVEhPTgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfQ3JlYXRlRmlsZUhhbmRsZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogICAgICAvKiBhcmdzIGlzIChmaWxlLCBtYXNrLCBmdW5jKSAqLwogewotCUZpbGVIYW5kbGVyX0NsaWVudERhdGEgKmRhdGE7Ci0JUHlPYmplY3QgKmZpbGUsICpmdW5jOwotCWludCBtYXNrLCB0ZmlsZTsKKyAgICBGaWxlSGFuZGxlcl9DbGllbnREYXRhICpkYXRhOworICAgIFB5T2JqZWN0ICpmaWxlLCAqZnVuYzsKKyAgICBpbnQgbWFzaywgdGZpbGU7CiAKLQlpZiAoIXNlbGYgJiYgUHlfUHkza1dhcm5pbmdGbGFnKSB7Ci0JCWlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkJIl90a2ludGVyLmNyZWF0ZWZpbGVoYW5kbGVyIGlzIGdvbmUgaW4gMy54IikgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghc2VsZiAmJiBQeV9QeTNrV2FybmluZ0ZsYWcpIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3RraW50ZXIuY3JlYXRlZmlsZWhhbmRsZXIgaXMgZ29uZSBpbiAzLngiKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pTzpjcmVhdGVmaWxlaGFuZGxlciIsCi0JCQkgICAgICAmZmlsZSwgJm1hc2ssICZmdW5jKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaU86Y3JlYXRlZmlsZWhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZSwgJm1hc2ssICZmdW5jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmICghc2VsZiAmJiAhdGNsX2xvY2spIHsKLQkJLyogV2UgZG9uJ3QgaGF2ZSB0aGUgVGNsIGxvY2sgc2luY2UgVGNsIGlzIHRocmVhZGVkLiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJfdGtpbnRlci5jcmVhdGVmaWxlaGFuZGxlciBub3Qgc3VwcG9ydGVkICIKLQkJCQkiZm9yIHRocmVhZGVkIFRjbCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFzZWxmICYmICF0Y2xfbG9jaykgeworICAgICAgICAvKiBXZSBkb24ndCBoYXZlIHRoZSBUY2wgbG9jayBzaW5jZSBUY2wgaXMgdGhyZWFkZWQuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX3RraW50ZXIuY3JlYXRlZmlsZWhhbmRsZXIgbm90IHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmVhZGVkIFRjbCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCWlmIChzZWxmKSB7Ci0JCUNIRUNLX1RDTF9BUFBBUlRNRU5UOwotCX0KKyAgICBpZiAoc2VsZikgeworICAgICAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICB9CiAKLQl0ZmlsZSA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IoZmlsZSk7Ci0JaWYgKHRmaWxlIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgYXJndW1lbnQgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgdGZpbGUgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKGZpbGUpOworICAgIGlmICh0ZmlsZSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIGFyZ3VtZW50IGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZGF0YSA9IE5ld0ZIQ0QoZnVuYywgZmlsZSwgdGZpbGUpOwotCWlmIChkYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGRhdGEgPSBOZXdGSENEKGZ1bmMsIGZpbGUsIHRmaWxlKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIE91Z2h0IHRvIGNoZWNrIGZvciBudWxsIFRjbF9GaWxlIG9iamVjdC4uLiAqLwotCUVOVEVSX1RDTAotCVRjbF9DcmVhdGVGaWxlSGFuZGxlcih0ZmlsZSwgbWFzaywgRmlsZUhhbmRsZXIsIChDbGllbnREYXRhKSBkYXRhKTsKLQlMRUFWRV9UQ0wKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgLyogT3VnaHQgdG8gY2hlY2sgZm9yIG51bGwgVGNsX0ZpbGUgb2JqZWN0Li4uICovCisgICAgRU5URVJfVENMCisgICAgVGNsX0NyZWF0ZUZpbGVIYW5kbGVyKHRmaWxlLCBtYXNrLCBGaWxlSGFuZGxlciwgKENsaWVudERhdGEpIGRhdGEpOworICAgIExFQVZFX1RDTAorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0RlbGV0ZUZpbGVIYW5kbGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZmlsZTsKLQlpbnQgdGZpbGU7CisgICAgUHlPYmplY3QgKmZpbGU7CisgICAgaW50IHRmaWxlOwogCi0JaWYgKCFzZWxmICYmIFB5X1B5M2tXYXJuaW5nRmxhZykgewotCQlpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkJCSJfdGtpbnRlci5kZWxldGVmaWxlaGFuZGxlciBpcyBnb25lIGluIDMueCIpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIXNlbGYgJiYgUHlfUHkza1dhcm5pbmdGbGFnKSB7CisgICAgICAgIGlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl90a2ludGVyLmRlbGV0ZWZpbGVoYW5kbGVyIGlzIGdvbmUgaW4gMy54IikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOmRlbGV0ZWZpbGVoYW5kbGVyIiwgJmZpbGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86ZGVsZXRlZmlsZWhhbmRsZXIiLCAmZmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoIXNlbGYgJiYgIXRjbF9sb2NrKSB7Ci0JCS8qIFdlIGRvbid0IGhhdmUgdGhlIFRjbCBsb2NrIHNpbmNlIFRjbCBpcyB0aHJlYWRlZC4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiX3RraW50ZXIuZGVsZXRlZmlsZWhhbmRsZXIgbm90IHN1cHBvcnRlZCAiCi0JCQkJImZvciB0aHJlYWRlZCBUY2wiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghc2VsZiAmJiAhdGNsX2xvY2spIHsKKyAgICAgICAgLyogV2UgZG9uJ3QgaGF2ZSB0aGUgVGNsIGxvY2sgc2luY2UgVGNsIGlzIHRocmVhZGVkLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl90a2ludGVyLmRlbGV0ZWZpbGVoYW5kbGVyIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJlYWRlZCBUY2wiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlpZiAoc2VsZikgewotCQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKLQl9CisgICAgaWYgKHNlbGYpIHsKKyAgICAgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgfQogCi0JdGZpbGUgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKGZpbGUpOwotCWlmICh0ZmlsZSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIHRmaWxlID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihmaWxlKTsKKyAgICBpZiAodGZpbGUgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCURlbGV0ZUZIQ0QodGZpbGUpOworICAgIERlbGV0ZUZIQ0QodGZpbGUpOwogCi0JLyogT3VnaHQgdG8gY2hlY2sgZm9yIG51bGwgVGNsX0ZpbGUgb2JqZWN0Li4uICovCi0JRU5URVJfVENMCi0JVGNsX0RlbGV0ZUZpbGVIYW5kbGVyKHRmaWxlKTsKLQlMRUFWRV9UQ0wKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgLyogT3VnaHQgdG8gY2hlY2sgZm9yIG51bGwgVGNsX0ZpbGUgb2JqZWN0Li4uICovCisgICAgRU5URVJfVENMCisgICAgVGNsX0RlbGV0ZUZpbGVIYW5kbGVyKHRmaWxlKTsKKyAgICBMRUFWRV9UQ0wKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYgLyogSEFWRV9DUkVBVEVGSUxFSEFORExFUiAqLwogCi0MCisKIC8qKioqIFRrdHQgT2JqZWN0ICh0aW1lciB0b2tlbikgKioqKi8KIAogc3RhdGljIFB5VHlwZU9iamVjdCBUa3R0X1R5cGU7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVGNsX1RpbWVyVG9rZW4gdG9rZW47Ci0JUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFRjbF9UaW1lclRva2VuIHRva2VuOworICAgIFB5T2JqZWN0ICpmdW5jOwogfSBUa3R0T2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKgogVGt0dF9EZWxldGVUaW1lckhhbmRsZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVRrdHRPYmplY3QgKnYgPSAoVGt0dE9iamVjdCAqKXNlbGY7Ci0JUHlPYmplY3QgKmZ1bmMgPSB2LT5mdW5jOworICAgIFRrdHRPYmplY3QgKnYgPSAoVGt0dE9iamVjdCAqKXNlbGY7CisgICAgUHlPYmplY3QgKmZ1bmMgPSB2LT5mdW5jOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZGVsZXRldGltZXJoYW5kbGVyIikpCi0JCXJldHVybiBOVUxMOwotCWlmICh2LT50b2tlbiAhPSBOVUxMKSB7Ci0JCVRjbF9EZWxldGVUaW1lckhhbmRsZXIodi0+dG9rZW4pOwotCQl2LT50b2tlbiA9IE5VTEw7Ci0JfQotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJdi0+ZnVuYyA9IE5VTEw7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJUHlfREVDUkVGKHYpOyAvKiBTZWUgVGt0dF9OZXcoKSAqLwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZGVsZXRldGltZXJoYW5kbGVyIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2LT50b2tlbiAhPSBOVUxMKSB7CisgICAgICAgIFRjbF9EZWxldGVUaW1lckhhbmRsZXIodi0+dG9rZW4pOworICAgICAgICB2LT50b2tlbiA9IE5VTEw7CisgICAgfQorICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgdi0+ZnVuYyA9IE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgUHlfREVDUkVGKHYpOyAvKiBTZWUgVGt0dF9OZXcoKSAqLworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUa3R0X21ldGhvZHNbXSA9CiB7Ci0JeyJkZWxldGV0aW1lcmhhbmRsZXIiLCBUa3R0X0RlbGV0ZVRpbWVySGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwgTlVMTH0KKyAgICB7ImRlbGV0ZXRpbWVyaGFuZGxlciIsIFRrdHRfRGVsZXRlVGltZXJIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCBOVUxMfQogfTsKIAogc3RhdGljIFRrdHRPYmplY3QgKgogVGt0dF9OZXcoUHlPYmplY3QgKmZ1bmMpCiB7Ci0JVGt0dE9iamVjdCAqdjsKLSAgCi0JdiA9IFB5T2JqZWN0X05ldyhUa3R0T2JqZWN0LCAmVGt0dF9UeXBlKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBUa3R0T2JqZWN0ICp2OwogCi0JUHlfSU5DUkVGKGZ1bmMpOwotCXYtPnRva2VuID0gTlVMTDsKLQl2LT5mdW5jID0gZnVuYzsKKyAgICB2ID0gUHlPYmplY3RfTmV3KFRrdHRPYmplY3QsICZUa3R0X1R5cGUpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogRXh0cmEgcmVmZXJlbmNlLCBkZWxldGVkIHdoZW4gY2FsbGVkIG9yIHdoZW4gaGFuZGxlciBpcyBkZWxldGVkICovCi0JUHlfSU5DUkVGKHYpOwotCXJldHVybiB2OworICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICB2LT50b2tlbiA9IE5VTEw7CisgICAgdi0+ZnVuYyA9IGZ1bmM7CisKKyAgICAvKiBFeHRyYSByZWZlcmVuY2UsIGRlbGV0ZWQgd2hlbiBjYWxsZWQgb3Igd2hlbiBoYW5kbGVyIGlzIGRlbGV0ZWQgKi8KKyAgICBQeV9JTkNSRUYodik7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyB2b2lkCiBUa3R0X0RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCiB7Ci0JVGt0dE9iamVjdCAqdiA9IChUa3R0T2JqZWN0ICopc2VsZjsKLQlQeU9iamVjdCAqZnVuYyA9IHYtPmZ1bmM7CisgICAgVGt0dE9iamVjdCAqdiA9IChUa3R0T2JqZWN0ICopc2VsZjsKKyAgICBQeU9iamVjdCAqZnVuYyA9IHYtPmZ1bmM7CiAKLQlQeV9YREVDUkVGKGZ1bmMpOworICAgIFB5X1hERUNSRUYoZnVuYyk7CiAKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGt0dF9SZXByKFB5T2JqZWN0ICpzZWxmKQogewotCVRrdHRPYmplY3QgKnYgPSAoVGt0dE9iamVjdCAqKXNlbGY7Ci0JY2hhciBidWZbMTAwXTsKKyAgICBUa3R0T2JqZWN0ICp2ID0gKFRrdHRPYmplY3QgKilzZWxmOworICAgIGNoYXIgYnVmWzEwMF07CiAKLQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICI8dGt0aW1lcnRva2VuIGF0ICVwJXM+IiwgdiwKLQkgICAgICAgICAgICAgICAgdi0+ZnVuYyA9PSBOVUxMID8gIiwgaGFuZGxlciBkZWxldGVkIiA6ICIiKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjx0a3RpbWVydG9rZW4gYXQgJXAlcz4iLCB2LAorICAgICAgICAgICAgICAgICAgICB2LT5mdW5jID09IE5VTEwgPyAiLCBoYW5kbGVyIGRlbGV0ZWQiIDogIiIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa3R0X0dldEF0dHIoUHlPYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoVGt0dF9tZXRob2RzLCBzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChUa3R0X21ldGhvZHMsIHNlbGYsIG5hbWUpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFRrdHRfVHlwZSA9CiB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInRrdGltZXJ0b2tlbiIsCQkJICAgICAvKnRwX25hbWUgKi8KLQlzaXplb2YoVGt0dE9iamVjdCksCQkgICAgIC8qdHBfYmFzaWNzaXplICovCi0JMCwJCQkJICAgICAvKnRwX2l0ZW1zaXplICovCi0JVGt0dF9EZWFsbG9jLAkJCSAgICAgLyp0cF9kZWFsbG9jICovCi0JMCwJCQkJICAgICAvKnRwX3ByaW50ICovCi0JVGt0dF9HZXRBdHRyLAkJCSAgICAgLyp0cF9nZXRhdHRyICovCi0JMCwJCQkJICAgICAvKnRwX3NldGF0dHIgKi8KLQkwLAkJCQkgICAgIC8qdHBfY29tcGFyZSAqLwotCVRrdHRfUmVwciwJCQkgICAgIC8qdHBfcmVwciAqLwotCTAsCQkJCSAgICAgLyp0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkgICAgIC8qdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkgICAgIC8qdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCSAgICAgLyp0cF9oYXNoICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgInRrdGltZXJ0b2tlbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUgKi8KKyAgICBzaXplb2YoVGt0dE9iamVjdCksICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplICovCisgICAgVGt0dF9EZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQgKi8KKyAgICBUa3R0X0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUgKi8KKyAgICBUa3R0X1JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCiB9OwogCiAKLQwKKwogLyoqIFRpbWVyIEhhbmRsZXIgKiovCiAKIHN0YXRpYyB2b2lkCiBUaW1lckhhbmRsZXIoQ2xpZW50RGF0YSBjbGllbnREYXRhKQogewotCVRrdHRPYmplY3QgKnYgPSAoVGt0dE9iamVjdCAqKWNsaWVudERhdGE7Ci0JUHlPYmplY3QgKmZ1bmMgPSB2LT5mdW5jOwotCVB5T2JqZWN0ICpyZXM7CisgICAgVGt0dE9iamVjdCAqdiA9IChUa3R0T2JqZWN0ICopY2xpZW50RGF0YTsKKyAgICBQeU9iamVjdCAqZnVuYyA9IHYtPmZ1bmM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQl2LT5mdW5jID0gTlVMTDsKKyAgICB2LT5mdW5jID0gTlVMTDsKIAotCUVOVEVSX1BZVEhPTgorICAgIEVOVEVSX1BZVEhPTgogCi0JcmVzICA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIE5VTEwpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlQeV9ERUNSRUYodik7IC8qIFNlZSBUa3R0X05ldygpICovCisgICAgcmVzICA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIE5VTEwpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBQeV9ERUNSRUYodik7IC8qIFNlZSBUa3R0X05ldygpICovCiAKLQlpZiAocmVzID09IE5VTEwpIHsKLQkJZXJyb3JJbkNtZCA9IDE7Ci0JCVB5RXJyX0ZldGNoKCZleGNJbkNtZCwgJnZhbEluQ21kLCAmdHJiSW5DbWQpOwotCX0KLQllbHNlCi0JCVB5X0RFQ1JFRihyZXMpOworICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICBlcnJvckluQ21kID0gMTsKKyAgICAgICAgUHlFcnJfRmV0Y2goJmV4Y0luQ21kLCAmdmFsSW5DbWQsICZ0cmJJbkNtZCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAKLQlMRUFWRV9QWVRIT04KKyAgICBMRUFWRV9QWVRIT04KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0NyZWF0ZVRpbWVySGFuZGxlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG1pbGxpc2Vjb25kczsKLQlQeU9iamVjdCAqZnVuYzsKLQlUa3R0T2JqZWN0ICp2OworICAgIGludCBtaWxsaXNlY29uZHM7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgVGt0dE9iamVjdCAqdjsKIAotCWlmICghc2VsZiAmJiBQeV9QeTNrV2FybmluZ0ZsYWcpIHsKLQkJaWYgKFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCQkiX3RraW50ZXIuY3JlYXRldGltZXJoYW5kbGVyIGlzIGdvbmUgaW4gMy54IikgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghc2VsZiAmJiBQeV9QeTNrV2FybmluZ0ZsYWcpIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3RraW50ZXIuY3JlYXRldGltZXJoYW5kbGVyIGlzIGdvbmUgaW4gMy54IikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpjcmVhdGV0aW1lcmhhbmRsZXIiLAotCQkJICAgICAgJm1pbGxpc2Vjb25kcywgJmZ1bmMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJhZCBhcmd1bWVudCBsaXN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOmNyZWF0ZXRpbWVyaGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaXNlY29uZHMsICZmdW5jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgYXJndW1lbnQgbGlzdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmICghc2VsZiAmJiAhdGNsX2xvY2spIHsKLQkJLyogV2UgZG9uJ3QgaGF2ZSB0aGUgVGNsIGxvY2sgc2luY2UgVGNsIGlzIHRocmVhZGVkLiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJfdGtpbnRlci5jcmVhdGV0aW1lcmhhbmRsZXIgbm90IHN1cHBvcnRlZCAiCi0JCQkJImZvciB0aHJlYWRlZCBUY2wiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghc2VsZiAmJiAhdGNsX2xvY2spIHsKKyAgICAgICAgLyogV2UgZG9uJ3QgaGF2ZSB0aGUgVGNsIGxvY2sgc2luY2UgVGNsIGlzIHRocmVhZGVkLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl90a2ludGVyLmNyZWF0ZXRpbWVyaGFuZGxlciBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyZWFkZWQgVGNsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JaWYgKHNlbGYpIHsKLQkJQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7Ci0JfQorICAgIGlmIChzZWxmKSB7CisgICAgICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIH0KIAotCXYgPSBUa3R0X05ldyhmdW5jKTsKLQlpZiAodikgewotCQl2LT50b2tlbiA9IFRjbF9DcmVhdGVUaW1lckhhbmRsZXIobWlsbGlzZWNvbmRzLCBUaW1lckhhbmRsZXIsCi0JCQkJCQkgIChDbGllbnREYXRhKXYpOwotCX0KKyAgICB2ID0gVGt0dF9OZXcoZnVuYyk7CisgICAgaWYgKHYpIHsKKyAgICAgICAgdi0+dG9rZW4gPSBUY2xfQ3JlYXRlVGltZXJIYW5kbGVyKG1pbGxpc2Vjb25kcywgVGltZXJIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENsaWVudERhdGEpdik7CisgICAgfQogCi0JcmV0dXJuIChQeU9iamVjdCAqKSB2OworICAgIHJldHVybiAoUHlPYmplY3QgKikgdjsKIH0KIAotDAorCiAvKiogRXZlbnQgTG9vcCAqKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX01haW5Mb29wKFB5T2JqZWN0ICpzZWxmcHRyLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgdGhyZXNob2xkID0gMDsKLQlUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKKyAgICBpbnQgdGhyZXNob2xkID0gMDsKKyAgICBUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKICNlbmRpZgogCi0JaWYgKCFzZWxmICYmIFB5X1B5M2tXYXJuaW5nRmxhZykgewotCQlpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkJCSJfdGtpbnRlci5tYWlubG9vcCBpcyBnb25lIGluIDMueCIpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIXNlbGYgJiYgUHlfUHkza1dhcm5pbmdGbGFnKSB7CisgICAgICAgIGlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl90a2ludGVyLm1haW5sb29wIGlzIGdvbmUgaW4gMy54IikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTptYWlubG9vcCIsICZ0aHJlc2hvbGQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOm1haW5sb29wIiwgJnRocmVzaG9sZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoIXNlbGYgJiYgIXRjbF9sb2NrKSB7Ci0JCS8qIFdlIGRvbid0IGhhdmUgdGhlIFRjbCBsb2NrIHNpbmNlIFRjbCBpcyB0aHJlYWRlZC4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiX3RraW50ZXIubWFpbmxvb3Agbm90IHN1cHBvcnRlZCAiCi0JCQkJImZvciB0aHJlYWRlZCBUY2wiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghc2VsZiAmJiAhdGNsX2xvY2spIHsKKyAgICAgICAgLyogV2UgZG9uJ3QgaGF2ZSB0aGUgVGNsIGxvY2sgc2luY2UgVGNsIGlzIHRocmVhZGVkLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl90a2ludGVyLm1haW5sb29wIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJlYWRlZCBUY2wiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlpZiAoc2VsZikgewotCQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKLQkJc2VsZi0+ZGlzcGF0Y2hpbmcgPSAxOwotCX0KKyAgICBpZiAoc2VsZikgeworICAgICAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICAgICAgc2VsZi0+ZGlzcGF0Y2hpbmcgPSAxOworICAgIH0KIAotCXF1aXRNYWluTG9vcCA9IDA7Ci0Jd2hpbGUgKFRrX0dldE51bU1haW5XaW5kb3dzKCkgPiB0aHJlc2hvbGQgJiYKLQkgICAgICAgIXF1aXRNYWluTG9vcCAmJgotCSAgICAgICAhZXJyb3JJbkNtZCkKLQl7Ci0JCWludCByZXN1bHQ7CisgICAgcXVpdE1haW5Mb29wID0gMDsKKyAgICB3aGlsZSAoVGtfR2V0TnVtTWFpbldpbmRvd3MoKSA+IHRocmVzaG9sZCAmJgorICAgICAgICAgICAhcXVpdE1haW5Mb29wICYmCisgICAgICAgICAgICFlcnJvckluQ21kKQorICAgIHsKKyAgICAgICAgaW50IHJlc3VsdDsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JCWlmIChzZWxmICYmIHNlbGYtPnRocmVhZGVkKSB7Ci0JCQkvKiBBbGxvdyBvdGhlciBQeXRob24gdGhyZWFkcyB0byBydW4uICovCi0JCQlFTlRFUl9UQ0wKLQkJCXJlc3VsdCA9IFRjbF9Eb09uZUV2ZW50KDApOwotCQkJTEVBVkVfVENMCi0JCX0KLQkJZWxzZSB7Ci0JCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQlpZih0Y2xfbG9jaylQeVRocmVhZF9hY3F1aXJlX2xvY2sodGNsX2xvY2ssIDEpOwotCQkJdGNsX3RzdGF0ZSA9IHRzdGF0ZTsKLQkJCXJlc3VsdCA9IFRjbF9Eb09uZUV2ZW50KFRDTF9ET05UX1dBSVQpOwotCQkJdGNsX3RzdGF0ZSA9IE5VTEw7Ci0JCQlpZih0Y2xfbG9jaylQeVRocmVhZF9yZWxlYXNlX2xvY2sodGNsX2xvY2spOwotCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCVNsZWVwKFRraW50ZXJfYnVzeXdhaXRpbnRlcnZhbCk7Ci0JCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQl9CisgICAgICAgIGlmIChzZWxmICYmIHNlbGYtPnRocmVhZGVkKSB7CisgICAgICAgICAgICAvKiBBbGxvdyBvdGhlciBQeXRob24gdGhyZWFkcyB0byBydW4uICovCisgICAgICAgICAgICBFTlRFUl9UQ0wKKyAgICAgICAgICAgIHJlc3VsdCA9IFRjbF9Eb09uZUV2ZW50KDApOworICAgICAgICAgICAgTEVBVkVfVENMCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICBpZih0Y2xfbG9jaylQeVRocmVhZF9hY3F1aXJlX2xvY2sodGNsX2xvY2ssIDEpOworICAgICAgICAgICAgdGNsX3RzdGF0ZSA9IHRzdGF0ZTsKKyAgICAgICAgICAgIHJlc3VsdCA9IFRjbF9Eb09uZUV2ZW50KFRDTF9ET05UX1dBSVQpOworICAgICAgICAgICAgdGNsX3RzdGF0ZSA9IE5VTEw7CisgICAgICAgICAgICBpZih0Y2xfbG9jaylQeVRocmVhZF9yZWxlYXNlX2xvY2sodGNsX2xvY2spOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKQorICAgICAgICAgICAgICAgIFNsZWVwKFRraW50ZXJfYnVzeXdhaXRpbnRlcnZhbCk7CisgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICB9CiAjZWxzZQotCQlyZXN1bHQgPSBUY2xfRG9PbmVFdmVudCgwKTsKKyAgICAgICAgcmVzdWx0ID0gVGNsX0RvT25lRXZlbnQoMCk7CiAjZW5kaWYKIAotCQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkgIT0gMCkgewotCQkJaWYgKHNlbGYpCi0JCQkJc2VsZi0+ZGlzcGF0Y2hpbmcgPSAwOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKHJlc3VsdCA8IDApCi0JCQlicmVhazsKLQl9Ci0JaWYgKHNlbGYpCi0JCXNlbGYtPmRpc3BhdGNoaW5nID0gMDsKLQlxdWl0TWFpbkxvb3AgPSAwOworICAgICAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi0+ZGlzcGF0Y2hpbmcgPSAwOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHNlbGYpCisgICAgICAgIHNlbGYtPmRpc3BhdGNoaW5nID0gMDsKKyAgICBxdWl0TWFpbkxvb3AgPSAwOwogCi0JaWYgKGVycm9ySW5DbWQpIHsKLQkJZXJyb3JJbkNtZCA9IDA7Ci0JCVB5RXJyX1Jlc3RvcmUoZXhjSW5DbWQsIHZhbEluQ21kLCB0cmJJbkNtZCk7Ci0JCWV4Y0luQ21kID0gdmFsSW5DbWQgPSB0cmJJbkNtZCA9IE5VTEw7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGVycm9ySW5DbWQpIHsKKyAgICAgICAgZXJyb3JJbkNtZCA9IDA7CisgICAgICAgIFB5RXJyX1Jlc3RvcmUoZXhjSW5DbWQsIHZhbEluQ21kLCB0cmJJbkNtZCk7CisgICAgICAgIGV4Y0luQ21kID0gdmFsSW5DbWQgPSB0cmJJbkNtZCA9IE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9Eb09uZUV2ZW50KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmxhZ3MgPSAwOwotCWludCBydjsKKyAgICBpbnQgZmxhZ3MgPSAwOworICAgIGludCBydjsKIAotCWlmICghc2VsZiAmJiBQeV9QeTNrV2FybmluZ0ZsYWcpIHsKLQkJaWYgKFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCQkiX3RraW50ZXIuZG9vbmVldmVudCBpcyBnb25lIGluIDMueCIpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIXNlbGYgJiYgUHlfUHkza1dhcm5pbmdGbGFnKSB7CisgICAgICAgIGlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl90a2ludGVyLmRvb25lZXZlbnQgaXMgZ29uZSBpbiAzLngiKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmRvb25lZXZlbnQiLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmRvb25lZXZlbnQiLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUVOVEVSX1RDTAotCXJ2ID0gVGNsX0RvT25lRXZlbnQoZmxhZ3MpOwotCUxFQVZFX1RDTAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgcnYpOworICAgIEVOVEVSX1RDTAorICAgIHJ2ID0gVGNsX0RvT25lRXZlbnQoZmxhZ3MpOworICAgIExFQVZFX1RDTAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgcnYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfUXVpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpZiAoIXNlbGYgJiYgUHlfUHkza1dhcm5pbmdGbGFnKSB7Ci0JCWlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkJIl90a2ludGVyLnF1aXQgaXMgZ29uZSBpbiAzLngiKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFzZWxmICYmIFB5X1B5M2tXYXJuaW5nRmxhZykgeworICAgICAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfdGtpbnRlci5xdWl0IGlzIGdvbmUgaW4gMy54IikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6cXVpdCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpxdWl0IikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcXVpdE1haW5Mb29wID0gMTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcXVpdE1haW5Mb29wID0gMTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9JbnRlcnBBZGRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmludGVycGFkZHIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6aW50ZXJwYWRkciIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylUa2FwcF9JbnRlcnAoc2VsZikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylUa2FwcF9JbnRlcnAoc2VsZikpOwogfQogCi1zdGF0aWMgUHlPYmplY3QJKgorc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1RrSW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JVGNsX0ludGVycCAqaW50ZXJwID0gVGthcHBfSW50ZXJwKHNlbGYpOwotCWNvbnN0IGNoYXIgKiBfdGtfZXhpc3RzID0gTlVMTDsKLQlpbnQgZXJyOworICAgIFRjbF9JbnRlcnAgKmludGVycCA9IFRrYXBwX0ludGVycChzZWxmKTsKKyAgICBjb25zdCBjaGFyICogX3RrX2V4aXN0cyA9IE5VTEw7CisgICAgaW50IGVycjsKIAogI2lmZGVmIFRLSU5URVJfUFJPVEVDVF9MT0FEVEsKLQkvKiBVcCB0byBUayA4LjQuMTMsIFRrX0luaXQgZGVhZGxvY2tzIG9uIHRoZSBzZWNvbmQgY2FsbCB3aGVuIHRoZQotCSAqIGZpcnN0IGNhbGwgZmFpbGVkLgotCSAqIFRvIGF2b2lkIHRoZSBkZWFkbG9jaywgd2UganVzdCByZWZ1c2UgdGhlIHNlY29uZCBjYWxsIHRocm91Z2gKLQkgKiBhIHN0YXRpYyB2YXJpYWJsZS4KLQkgKi8KLQlpZiAodGtfbG9hZF9mYWlsZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsIFRLSU5URVJfTE9BRFRLX0VSUk1TRyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBVcCB0byBUayA4LjQuMTMsIFRrX0luaXQgZGVhZGxvY2tzIG9uIHRoZSBzZWNvbmQgY2FsbCB3aGVuIHRoZQorICAgICAqIGZpcnN0IGNhbGwgZmFpbGVkLgorICAgICAqIFRvIGF2b2lkIHRoZSBkZWFkbG9jaywgd2UganVzdCByZWZ1c2UgdGhlIHNlY29uZCBjYWxsIHRocm91Z2gKKyAgICAgKiBhIHN0YXRpYyB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBpZiAodGtfbG9hZF9mYWlsZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsIFRLSU5URVJfTE9BRFRLX0VSUk1TRyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JLyogV2Ugd2FudCB0byBndWFyZCBhZ2FpbnN0IGNhbGxpbmcgVGtfSW5pdCgpIG11bHRpcGxlIHRpbWVzICovCi0JQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7Ci0JRU5URVJfVENMCi0JZXJyID0gVGNsX0V2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCAiaW5mbyBleGlzdHMJdGtfdmVyc2lvbiIpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAoZXJyID09IFRDTF9FUlJPUikgewotCQkvKiBUaGlzIHNldHMgYW4gZXhjZXB0aW9uLCBidXQgd2UgY2Fubm90IHJldHVybiByaWdodAotCQkgICBhd2F5IGJlY2F1c2Ugd2UgbmVlZCB0byBleGl0IHRoZSBvdmVybGFwIGZpcnN0LiAqLwotCQlUa2ludGVyX0Vycm9yKHNlbGYpOwotCX0gZWxzZSB7Ci0JCV90a19leGlzdHMgPSBUa2FwcF9SZXN1bHQoc2VsZik7Ci0JfQotCUxFQVZFX09WRVJMQVBfVENMCi0JaWYgKGVyciA9PSBUQ0xfRVJST1IpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChfdGtfZXhpc3RzID09IE5VTEwgfHwgc3RyY21wKF90a19leGlzdHMsICIxIikgIT0gMCkJewotCQlpZiAoVGtfSW5pdChpbnRlcnApCT09IFRDTF9FUlJPUikgewotCQkJUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsIFRjbF9HZXRTdHJpbmdSZXN1bHQoVGthcHBfSW50ZXJwKHNlbGYpKSk7CisgICAgLyogV2Ugd2FudCB0byBndWFyZCBhZ2FpbnN0IGNhbGxpbmcgVGtfSW5pdCgpIG11bHRpcGxlIHRpbWVzICovCisgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgRU5URVJfVENMCisgICAgZXJyID0gVGNsX0V2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCAiaW5mbyBleGlzdHMgICAgIHRrX3ZlcnNpb24iKTsKKyAgICBFTlRFUl9PVkVSTEFQCisgICAgaWYgKGVyciA9PSBUQ0xfRVJST1IpIHsKKyAgICAgICAgLyogVGhpcyBzZXRzIGFuIGV4Y2VwdGlvbiwgYnV0IHdlIGNhbm5vdCByZXR1cm4gcmlnaHQKKyAgICAgICAgICAgYXdheSBiZWNhdXNlIHdlIG5lZWQgdG8gZXhpdCB0aGUgb3ZlcmxhcCBmaXJzdC4gKi8KKyAgICAgICAgVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfdGtfZXhpc3RzID0gVGthcHBfUmVzdWx0KHNlbGYpOworICAgIH0KKyAgICBMRUFWRV9PVkVSTEFQX1RDTAorICAgIGlmIChlcnIgPT0gVENMX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoX3RrX2V4aXN0cyA9PSBOVUxMIHx8IHN0cmNtcChfdGtfZXhpc3RzLCAiMSIpICE9IDApICAgICB7CisgICAgICAgIGlmIChUa19Jbml0KGludGVycCkgICAgICAgICAgICAgPT0gVENMX0VSUk9SKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgVGNsX0dldFN0cmluZ1Jlc3VsdChUa2FwcF9JbnRlcnAoc2VsZikpKTsKICNpZmRlZiBUS0lOVEVSX1BST1RFQ1RfTE9BRFRLCi0JCQl0a19sb2FkX2ZhaWxlZCA9IDE7CisgICAgICAgICAgICB0a19sb2FkX2ZhaWxlZCA9IDE7CiAjZW5kaWYKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1dhbnRPYmplY3RzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWludCB3YW50b2JqZWN0cyA9IC0xOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6d2FudG9iamVjdHMiLCAmd2FudG9iamVjdHMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAod2FudG9iamVjdHMgPT0gLTEpCi0JCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKChUa2FwcE9iamVjdCopc2VsZiktPndhbnRvYmplY3RzKTsKLQkoKFRrYXBwT2JqZWN0KilzZWxmKS0+d2FudG9iamVjdHMgPSB3YW50b2JqZWN0czsKKyAgICBpbnQgd2FudG9iamVjdHMgPSAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOndhbnRvYmplY3RzIiwgJndhbnRvYmplY3RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHdhbnRvYmplY3RzID09IC0xKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKCgoVGthcHBPYmplY3QqKXNlbGYpLT53YW50b2JqZWN0cyk7CisgICAgKChUa2FwcE9iamVjdCopc2VsZiktPndhbnRvYmplY3RzID0gd2FudG9iamVjdHM7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfV2lsbERpc3BhdGNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCSgoVGthcHBPYmplY3QqKXNlbGYpLT5kaXNwYXRjaGluZyA9IDE7CisgICAgKChUa2FwcE9iamVjdCopc2VsZiktPmRpc3BhdGNoaW5nID0gMTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKLQwKKwogLyoqKiogVGthcHAgTWV0aG9kIExpc3QgKioqKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIFRrYXBwX21ldGhvZHNbXSA9CiB7Ci0JeyJ3aWxsZGlzcGF0Y2giLCAgICAgICBUa2FwcF9XaWxsRGlzcGF0Y2gsIE1FVEhfTk9BUkdTfSwKLQl7IndhbnRvYmplY3RzIiwJICAgICAgIFRrYXBwX1dhbnRPYmplY3RzLCBNRVRIX1ZBUkFSR1N9LAotCXsiY2FsbCIsIAkgICAgICAgVGthcHBfQ2FsbCwgTUVUSF9WQVJBUkdTfSwKLQl7Imdsb2JhbGNhbGwiLCAJICAgICAgIFRrYXBwX0dsb2JhbENhbGwsIE1FVEhfVkFSQVJHU30sCi0JeyJldmFsIiwgCSAgICAgICBUa2FwcF9FdmFsLCBNRVRIX1ZBUkFSR1N9LAotCXsiZ2xvYmFsZXZhbCIsIAkgICAgICAgVGthcHBfR2xvYmFsRXZhbCwgTUVUSF9WQVJBUkdTfSwKLQl7ImV2YWxmaWxlIiwgCSAgICAgICBUa2FwcF9FdmFsRmlsZSwgTUVUSF9WQVJBUkdTfSwKLQl7InJlY29yZCIsIAkgICAgICAgVGthcHBfUmVjb3JkLCBNRVRIX1ZBUkFSR1N9LAotCXsiYWRkZXJyb3JpbmZvIiwgICAgICAgVGthcHBfQWRkRXJyb3JJbmZvLCBNRVRIX1ZBUkFSR1N9LAotCXsic2V0dmFyIiwgCSAgICAgICBUa2FwcF9TZXRWYXIsIE1FVEhfVkFSQVJHU30sCi0JeyJnbG9iYWxzZXR2YXIiLCAgICAgICBUa2FwcF9HbG9iYWxTZXRWYXIsIE1FVEhfVkFSQVJHU30sCi0JeyJnZXR2YXIiLCAJICAgICAgIFRrYXBwX0dldFZhciwgTUVUSF9WQVJBUkdTfSwKLQl7Imdsb2JhbGdldHZhciIsICAgICAgIFRrYXBwX0dsb2JhbEdldFZhciwgTUVUSF9WQVJBUkdTfSwKLQl7InVuc2V0dmFyIiwgCSAgICAgICBUa2FwcF9VbnNldFZhciwgTUVUSF9WQVJBUkdTfSwKLQl7Imdsb2JhbHVuc2V0dmFyIiwgICAgIFRrYXBwX0dsb2JhbFVuc2V0VmFyLCBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0aW50IiwgCSAgICAgICBUa2FwcF9HZXRJbnQsIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRkb3VibGUiLCAJICAgICAgIFRrYXBwX0dldERvdWJsZSwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGJvb2xlYW4iLCAJICAgICAgIFRrYXBwX0dldEJvb2xlYW4sIE1FVEhfVkFSQVJHU30sCi0JeyJleHByc3RyaW5nIiwgCSAgICAgICBUa2FwcF9FeHByU3RyaW5nLCBNRVRIX1ZBUkFSR1N9LAotCXsiZXhwcmxvbmciLCAJICAgICAgIFRrYXBwX0V4cHJMb25nLCBNRVRIX1ZBUkFSR1N9LAotCXsiZXhwcmRvdWJsZSIsIAkgICAgICAgVGthcHBfRXhwckRvdWJsZSwgTUVUSF9WQVJBUkdTfSwKLQl7ImV4cHJib29sZWFuIiwgICAgICAgIFRrYXBwX0V4cHJCb29sZWFuLCBNRVRIX1ZBUkFSR1N9LAotCXsic3BsaXRsaXN0IiwgCSAgICAgICBUa2FwcF9TcGxpdExpc3QsIE1FVEhfVkFSQVJHU30sCi0JeyJzcGxpdCIsIAkgICAgICAgVGthcHBfU3BsaXQsIE1FVEhfVkFSQVJHU30sCi0JeyJtZXJnZSIsIAkgICAgICAgVGthcHBfTWVyZ2UsIE1FVEhfVkFSQVJHU30sCi0JeyJjcmVhdGVjb21tYW5kIiwgICAgICBUa2FwcF9DcmVhdGVDb21tYW5kLCBNRVRIX1ZBUkFSR1N9LAotCXsiZGVsZXRlY29tbWFuZCIsICAgICAgVGthcHBfRGVsZXRlQ29tbWFuZCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IndpbGxkaXNwYXRjaCIsICAgICAgIFRrYXBwX1dpbGxEaXNwYXRjaCwgTUVUSF9OT0FSR1N9LAorICAgIHsid2FudG9iamVjdHMiLCAgICAgICAgICAgIFRrYXBwX1dhbnRPYmplY3RzLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY2FsbCIsICAgICAgICAgICAgICAgICAgIFRrYXBwX0NhbGwsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnbG9iYWxjYWxsIiwgICAgICAgICAgICAgVGthcHBfR2xvYmFsQ2FsbCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImV2YWwiLCAgICAgICAgICAgICAgICAgICBUa2FwcF9FdmFsLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2xvYmFsZXZhbCIsICAgICAgICAgICAgIFRrYXBwX0dsb2JhbEV2YWwsIE1FVEhfVkFSQVJHU30sCisgICAgeyJldmFsZmlsZSIsICAgICAgICAgICAgICAgVGthcHBfRXZhbEZpbGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJyZWNvcmQiLCAgICAgICAgICAgICAgICAgVGthcHBfUmVjb3JkLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiYWRkZXJyb3JpbmZvIiwgICAgICAgVGthcHBfQWRkRXJyb3JJbmZvLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0dmFyIiwgICAgICAgICAgICAgICAgIFRrYXBwX1NldFZhciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Imdsb2JhbHNldHZhciIsICAgICAgIFRrYXBwX0dsb2JhbFNldFZhciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHZhciIsICAgICAgICAgICAgICAgICBUa2FwcF9HZXRWYXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnbG9iYWxnZXR2YXIiLCAgICAgICBUa2FwcF9HbG9iYWxHZXRWYXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1bnNldHZhciIsICAgICAgICAgICAgICAgVGthcHBfVW5zZXRWYXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnbG9iYWx1bnNldHZhciIsICAgICBUa2FwcF9HbG9iYWxVbnNldFZhciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGludCIsICAgICAgICAgICAgICAgICBUa2FwcF9HZXRJbnQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRkb3VibGUiLCAgICAgICAgICAgICAgVGthcHBfR2V0RG91YmxlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0Ym9vbGVhbiIsICAgICAgICAgICAgIFRrYXBwX0dldEJvb2xlYW4sIE1FVEhfVkFSQVJHU30sCisgICAgeyJleHByc3RyaW5nIiwgICAgICAgICAgICAgVGthcHBfRXhwclN0cmluZywgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImV4cHJsb25nIiwgICAgICAgICAgICAgICBUa2FwcF9FeHByTG9uZywgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImV4cHJkb3VibGUiLCAgICAgICAgICAgICBUa2FwcF9FeHByRG91YmxlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZXhwcmJvb2xlYW4iLCAgICAgICAgVGthcHBfRXhwckJvb2xlYW4sIE1FVEhfVkFSQVJHU30sCisgICAgeyJzcGxpdGxpc3QiLCAgICAgICAgICAgICAgVGthcHBfU3BsaXRMaXN0LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsic3BsaXQiLCAgICAgICAgICAgICAgICAgIFRrYXBwX1NwbGl0LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsibWVyZ2UiLCAgICAgICAgICAgICAgICAgIFRrYXBwX01lcmdlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY3JlYXRlY29tbWFuZCIsICAgICAgVGthcHBfQ3JlYXRlQ29tbWFuZCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImRlbGV0ZWNvbW1hbmQiLCAgICAgIFRrYXBwX0RlbGV0ZUNvbW1hbmQsIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgSEFWRV9DUkVBVEVGSUxFSEFORExFUgotCXsiY3JlYXRlZmlsZWhhbmRsZXIiLCAgVGthcHBfQ3JlYXRlRmlsZUhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCi0JeyJkZWxldGVmaWxlaGFuZGxlciIsICBUa2FwcF9EZWxldGVGaWxlSGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNyZWF0ZWZpbGVoYW5kbGVyIiwgIFRrYXBwX0NyZWF0ZUZpbGVIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZGVsZXRlZmlsZWhhbmRsZXIiLCAgVGthcHBfRGVsZXRlRmlsZUhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKLQl7ImNyZWF0ZXRpbWVyaGFuZGxlciIsIFRrYXBwX0NyZWF0ZVRpbWVySGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKLQl7Im1haW5sb29wIiwgCSAgICAgICBUa2FwcF9NYWluTG9vcCwgTUVUSF9WQVJBUkdTfSwKLQl7ImRvb25lZXZlbnQiLCAJICAgICAgIFRrYXBwX0RvT25lRXZlbnQsIE1FVEhfVkFSQVJHU30sCi0JeyJxdWl0IiwgCSAgICAgICBUa2FwcF9RdWl0LCBNRVRIX1ZBUkFSR1N9LAotCXsiaW50ZXJwYWRkciIsICAgICAgICAgVGthcHBfSW50ZXJwQWRkciwgTUVUSF9WQVJBUkdTfSwKLQl7ImxvYWR0ayIsCSAgICAgICBUa2FwcF9Ua0luaXQsIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwgCQkgICAgICAgTlVMTH0KKyAgICB7ImNyZWF0ZXRpbWVyaGFuZGxlciIsIFRrYXBwX0NyZWF0ZVRpbWVySGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1haW5sb29wIiwgICAgICAgICAgICAgICBUa2FwcF9NYWluTG9vcCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImRvb25lZXZlbnQiLCAgICAgICAgICAgICBUa2FwcF9Eb09uZUV2ZW50LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicXVpdCIsICAgICAgICAgICAgICAgICAgIFRrYXBwX1F1aXQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJpbnRlcnBhZGRyIiwgICAgICAgICBUa2FwcF9JbnRlcnBBZGRyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsibG9hZHRrIiwgICAgICAgICAgICAgICAgIFRrYXBwX1RrSW5pdCwgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgIE5VTEx9CiB9OwogCiAKLQwKKwogLyoqKiogVGthcHAgVHlwZSBNZXRob2RzICoqKiovCiAKIHN0YXRpYyB2b2lkCiBUa2FwcF9EZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCS8qQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7Ki8KLQlFTlRFUl9UQ0wKLQlUY2xfRGVsZXRlSW50ZXJwKFRrYXBwX0ludGVycChzZWxmKSk7Ci0JTEVBVkVfVENMCi0JUHlPYmplY3RfRGVsKHNlbGYpOwotCURpc2FibGVFdmVudEhvb2soKTsKKyAgICAvKkNIRUNLX1RDTF9BUFBBUlRNRU5UOyovCisgICAgRU5URVJfVENMCisgICAgVGNsX0RlbGV0ZUludGVycChUa2FwcF9JbnRlcnAoc2VsZikpOworICAgIExFQVZFX1RDTAorICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBEaXNhYmxlRXZlbnRIb29rKCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9HZXRBdHRyKFB5T2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKFRrYXBwX21ldGhvZHMsIHNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKFRrYXBwX21ldGhvZHMsIHNlbGYsIG5hbWUpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFRrYXBwX1R5cGUgPQogewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJ0a2FwcCIsCQkJICAgICAvKnRwX25hbWUgKi8KLQlzaXplb2YoVGthcHBPYmplY3QpLAkJICAgICAvKnRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCSAgICAgLyp0cF9pdGVtc2l6ZSAqLwotCVRrYXBwX0RlYWxsb2MsCQkJICAgICAvKnRwX2RlYWxsb2MgKi8KLQkwLAkJCQkgICAgIC8qdHBfcHJpbnQgKi8KLQlUa2FwcF9HZXRBdHRyLAkJCSAgICAgLyp0cF9nZXRhdHRyICovCi0JMCwJCQkJICAgICAvKnRwX3NldGF0dHIgKi8KLQkwLAkJCQkgICAgIC8qdHBfY29tcGFyZSAqLwotCTAsCQkJCSAgICAgLyp0cF9yZXByICovCi0JMCwJCQkJICAgICAvKnRwX2FzX251bWJlciAqLwotCTAsCQkJCSAgICAgLyp0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCSAgICAgLyp0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJICAgICAvKnRwX2hhc2ggKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAidGthcHAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSAqLworICAgIHNpemVvZihUa2FwcE9iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUgKi8KKyAgICBUa2FwcF9EZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCAqLworICAgIFRrYXBwX0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KIH07CiAKIAotDAorCiAvKioqKiBUa2ludGVyIE1vZHVsZSAqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3QqIHR1cGxlOwotCWludCBzaXplOyAvKiBjdXJyZW50IHNpemUgKi8KLQlpbnQgbWF4c2l6ZTsgLyogYWxsb2NhdGVkIHNpemUgKi8KKyAgICBQeU9iamVjdCogdHVwbGU7CisgICAgaW50IHNpemU7IC8qIGN1cnJlbnQgc2l6ZSAqLworICAgIGludCBtYXhzaXplOyAvKiBhbGxvY2F0ZWQgc2l6ZSAqLwogfSBGbGF0dGVuQ29udGV4dDsKIAogc3RhdGljIGludAogX2J1bXAoRmxhdHRlbkNvbnRleHQqIGNvbnRleHQsIGludCBzaXplKQogewotCS8qIGV4cGFuZCB0dXBsZSB0byBob2xkIChhdCBsZWFzdCkgc2l6ZSBuZXcgaXRlbXMuCi0JICAgcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgKi8KKyAgICAvKiBleHBhbmQgdHVwbGUgdG8gaG9sZCAoYXQgbGVhc3QpIHNpemUgbmV3IGl0ZW1zLgorICAgICAgIHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkICovCiAKLQlpbnQgbWF4c2l6ZSA9IGNvbnRleHQtPm1heHNpemUgKiAyOworICAgIGludCBtYXhzaXplID0gY29udGV4dC0+bWF4c2l6ZSAqIDI7CiAKLQlpZiAobWF4c2l6ZSA8IGNvbnRleHQtPnNpemUgKyBzaXplKQotCQltYXhzaXplID0gY29udGV4dC0+c2l6ZSArIHNpemU7CisgICAgaWYgKG1heHNpemUgPCBjb250ZXh0LT5zaXplICsgc2l6ZSkKKyAgICAgICAgbWF4c2l6ZSA9IGNvbnRleHQtPnNpemUgKyBzaXplOwogCi0JY29udGV4dC0+bWF4c2l6ZSA9IG1heHNpemU7CisgICAgY29udGV4dC0+bWF4c2l6ZSA9IG1heHNpemU7CiAKLQlyZXR1cm4gX1B5VHVwbGVfUmVzaXplKCZjb250ZXh0LT50dXBsZSwgbWF4c2l6ZSkgPj0gMDsKKyAgICByZXR1cm4gX1B5VHVwbGVfUmVzaXplKCZjb250ZXh0LT50dXBsZSwgbWF4c2l6ZSkgPj0gMDsKIH0KIAogc3RhdGljIGludAogX2ZsYXR0ZW4xKEZsYXR0ZW5Db250ZXh0KiBjb250ZXh0LCBQeU9iamVjdCogaXRlbSwgaW50IGRlcHRoKQogewotCS8qIGFkZCB0dXBsZSBvciBsaXN0IHRvIGFyZ3VtZW50IHR1cGxlIChyZWN1cnNpdmVseSkgKi8KKyAgICAvKiBhZGQgdHVwbGUgb3IgbGlzdCB0byBhcmd1bWVudCB0dXBsZSAocmVjdXJzaXZlbHkpICovCiAKLQlpbnQgaSwgc2l6ZTsKKyAgICBpbnQgaSwgc2l6ZTsKIAotCWlmIChkZXB0aCA+IDEwMDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm5lc3RpbmcgdG9vIGRlZXAgaW4gX2ZsYXR0ZW4iKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmIChQeUxpc3RfQ2hlY2soaXRlbSkpIHsKLQkJc2l6ZSA9IFB5TGlzdF9HRVRfU0laRShpdGVtKTsKLQkJLyogcHJlYWxsb2NhdGUgKGFzc3VtZSBubyBuZXN0aW5nKSAqLwotCQlpZiAoY29udGV4dC0+c2l6ZSArIHNpemUgPiBjb250ZXh0LT5tYXhzaXplICYmCi0JCSAgICAhX2J1bXAoY29udGV4dCwgc2l6ZSkpCi0JCQlyZXR1cm4gMDsKLQkJLyogY29weSBpdGVtcyB0byBvdXRwdXQgdHVwbGUgKi8KLQkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJUHlPYmplY3QgKm8gPSBQeUxpc3RfR0VUX0lURU0oaXRlbSwgaSk7Ci0JCQlpZiAoUHlMaXN0X0NoZWNrKG8pIHx8IFB5VHVwbGVfQ2hlY2sobykpIHsKLQkJCQlpZiAoIV9mbGF0dGVuMShjb250ZXh0LCBvLCBkZXB0aCArIDEpKQotCQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSBpZiAobyAhPSBQeV9Ob25lKSB7Ci0JCQkJaWYgKGNvbnRleHQtPnNpemUgKyAxID4gY29udGV4dC0+bWF4c2l6ZSAmJgotCQkJCSAgICAhX2J1bXAoY29udGV4dCwgMSkpCi0JCQkJCXJldHVybiAwOwotCQkJCVB5X0lOQ1JFRihvKTsKLQkJCQlQeVR1cGxlX1NFVF9JVEVNKGNvbnRleHQtPnR1cGxlLAotCQkJCQkJIGNvbnRleHQtPnNpemUrKywgbyk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soaXRlbSkpIHsKLQkJLyogc2FtZSwgZm9yIHR1cGxlcyAqLwotCQlzaXplID0gUHlUdXBsZV9HRVRfU0laRShpdGVtKTsKLQkJaWYgKGNvbnRleHQtPnNpemUgKyBzaXplID4gY29udGV4dC0+bWF4c2l6ZSAmJgotCQkgICAgIV9idW1wKGNvbnRleHQsIHNpemUpKQotCQkJcmV0dXJuIDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVB5T2JqZWN0ICpvID0gUHlUdXBsZV9HRVRfSVRFTShpdGVtLCBpKTsKLQkJCWlmIChQeUxpc3RfQ2hlY2sobykgfHwgUHlUdXBsZV9DaGVjayhvKSkgewotCQkJCWlmICghX2ZsYXR0ZW4xKGNvbnRleHQsIG8sIGRlcHRoICsgMSkpCi0JCQkJCXJldHVybiAwOwotCQkJfSBlbHNlIGlmIChvICE9IFB5X05vbmUpIHsKLQkJCQlpZiAoY29udGV4dC0+c2l6ZSArIDEgPiBjb250ZXh0LT5tYXhzaXplICYmCi0JCQkJICAgICFfYnVtcChjb250ZXh0LCAxKSkKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJUHlfSU5DUkVGKG8pOwotCQkJCVB5VHVwbGVfU0VUX0lURU0oY29udGV4dC0+dHVwbGUsCi0JCQkJCQkgY29udGV4dC0+c2l6ZSsrLCBvKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmd1bWVudCBtdXN0IGJlIHNlcXVlbmNlIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICBpZiAoZGVwdGggPiAxMDAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5lc3RpbmcgdG9vIGRlZXAgaW4gX2ZsYXR0ZW4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChQeUxpc3RfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgc2l6ZSA9IFB5TGlzdF9HRVRfU0laRShpdGVtKTsKKyAgICAgICAgLyogcHJlYWxsb2NhdGUgKGFzc3VtZSBubyBuZXN0aW5nKSAqLworICAgICAgICBpZiAoY29udGV4dC0+c2l6ZSArIHNpemUgPiBjb250ZXh0LT5tYXhzaXplICYmCisgICAgICAgICAgICAhX2J1bXAoY29udGV4dCwgc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgLyogY29weSBpdGVtcyB0byBvdXRwdXQgdHVwbGUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBQeUxpc3RfR0VUX0lURU0oaXRlbSwgaSk7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0NoZWNrKG8pIHx8IFB5VHVwbGVfQ2hlY2sobykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9mbGF0dGVuMShjb250ZXh0LCBvLCBkZXB0aCArIDEpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobyAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQtPnNpemUgKyAxID4gY29udGV4dC0+bWF4c2l6ZSAmJgorICAgICAgICAgICAgICAgICAgICAhX2J1bXAoY29udGV4dCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGNvbnRleHQtPnR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+c2l6ZSsrLCBvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoUHlUdXBsZV9DaGVjayhpdGVtKSkgeworICAgICAgICAvKiBzYW1lLCBmb3IgdHVwbGVzICovCisgICAgICAgIHNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGl0ZW0pOworICAgICAgICBpZiAoY29udGV4dC0+c2l6ZSArIHNpemUgPiBjb250ZXh0LT5tYXhzaXplICYmCisgICAgICAgICAgICAhX2J1bXAoY29udGV4dCwgc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBQeVR1cGxlX0dFVF9JVEVNKGl0ZW0sIGkpOworICAgICAgICAgICAgaWYgKFB5TGlzdF9DaGVjayhvKSB8fCBQeVR1cGxlX0NoZWNrKG8pKSB7CisgICAgICAgICAgICAgICAgaWYgKCFfZmxhdHRlbjEoY29udGV4dCwgbywgZGVwdGggKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG8gIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LT5zaXplICsgMSA+IGNvbnRleHQtPm1heHNpemUgJiYKKyAgICAgICAgICAgICAgICAgICAgIV9idW1wKGNvbnRleHQsIDEpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShjb250ZXh0LT50dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnNpemUrKywgbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJndW1lbnQgbXVzdCBiZSBzZXF1ZW5jZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2ludGVyX0ZsYXR0ZW4oUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUZsYXR0ZW5Db250ZXh0IGNvbnRleHQ7Ci0JUHlPYmplY3QqIGl0ZW07CisgICAgRmxhdHRlbkNvbnRleHQgY29udGV4dDsKKyAgICBQeU9iamVjdCogaXRlbTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfZmxhdHRlbiIsICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9mbGF0dGVuIiwgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNvbnRleHQubWF4c2l6ZSA9IFB5U2VxdWVuY2VfU2l6ZShpdGVtKTsKLQlpZiAoY29udGV4dC5tYXhzaXplIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGNvbnRleHQubWF4c2l6ZSA9PSAwKQotCQlyZXR1cm4gUHlUdXBsZV9OZXcoMCk7Ci0JCi0JY29udGV4dC50dXBsZSA9IFB5VHVwbGVfTmV3KGNvbnRleHQubWF4c2l6ZSk7Ci0JaWYgKCFjb250ZXh0LnR1cGxlKQotCQlyZXR1cm4gTlVMTDsKLQkKLQljb250ZXh0LnNpemUgPSAwOworICAgIGNvbnRleHQubWF4c2l6ZSA9IFB5U2VxdWVuY2VfU2l6ZShpdGVtKTsKKyAgICBpZiAoY29udGV4dC5tYXhzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGNvbnRleHQubWF4c2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gUHlUdXBsZV9OZXcoMCk7CiAKLQlpZiAoIV9mbGF0dGVuMSgmY29udGV4dCwgaXRlbSwwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgY29udGV4dC50dXBsZSA9IFB5VHVwbGVfTmV3KGNvbnRleHQubWF4c2l6ZSk7CisgICAgaWYgKCFjb250ZXh0LnR1cGxlKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChfUHlUdXBsZV9SZXNpemUoJmNvbnRleHQudHVwbGUsIGNvbnRleHQuc2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGNvbnRleHQuc2l6ZSA9IDA7CiAKLQlyZXR1cm4gY29udGV4dC50dXBsZTsKKyAgICBpZiAoIV9mbGF0dGVuMSgmY29udGV4dCwgaXRlbSwwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoX1B5VHVwbGVfUmVzaXplKCZjb250ZXh0LnR1cGxlLCBjb250ZXh0LnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBjb250ZXh0LnR1cGxlOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGtpbnRlcl9DcmVhdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnNjcmVlbk5hbWUgPSBOVUxMOwotCWNoYXIgKmJhc2VOYW1lID0gTlVMTDsKLQljaGFyICpjbGFzc05hbWUgPSBOVUxMOwotCWludCBpbnRlcmFjdGl2ZSA9IDA7Ci0JaW50IHdhbnRvYmplY3RzID0gMDsKLQlpbnQgd2FudFRrID0gMTsJLyogSWYgZmFsc2UsIHRoZW4gVGtfSW5pdCgpIGRvZXNuJ3QgZ2V0CWNhbGxlZCAqLwotCWludCBzeW5jID0gMDsgLyogcGFzcyAtc3luYyB0byB3aXNoICovCi0JY2hhciAqdXNlID0gTlVMTDsgLyogcGFzcyAtdXNlIHRvIHdpc2ggKi8KKyAgICBjaGFyICpzY3JlZW5OYW1lID0gTlVMTDsKKyAgICBjaGFyICpiYXNlTmFtZSA9IE5VTEw7CisgICAgY2hhciAqY2xhc3NOYW1lID0gTlVMTDsKKyAgICBpbnQgaW50ZXJhY3RpdmUgPSAwOworICAgIGludCB3YW50b2JqZWN0cyA9IDA7CisgICAgaW50IHdhbnRUayA9IDE7ICAgICAvKiBJZiBmYWxzZSwgdGhlbiBUa19Jbml0KCkgZG9lc24ndCBnZXQgY2FsbGVkICovCisgICAgaW50IHN5bmMgPSAwOyAvKiBwYXNzIC1zeW5jIHRvIHdpc2ggKi8KKyAgICBjaGFyICp1c2UgPSBOVUxMOyAvKiBwYXNzIC11c2UgdG8gd2lzaCAqLwogCi0JYmFzZU5hbWUgPSBzdHJyY2hyKFB5X0dldFByb2dyYW1OYW1lKCksICcvJyk7Ci0JaWYgKGJhc2VOYW1lICE9IE5VTEwpCi0JCWJhc2VOYW1lKys7Ci0JZWxzZQotCQliYXNlTmFtZSA9IFB5X0dldFByb2dyYW1OYW1lKCk7Ci0JY2xhc3NOYW1lID0gIlRrIjsKLSAgCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8enNzaWlpaXo6Y3JlYXRlIiwKLQkJCSAgICAgICZzY3JlZW5OYW1lLCAmYmFzZU5hbWUsICZjbGFzc05hbWUsCi0JCQkgICAgICAmaW50ZXJhY3RpdmUsICZ3YW50b2JqZWN0cywgJndhbnRUaywKLQkJCSAgICAgICZzeW5jLCAmdXNlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgYmFzZU5hbWUgPSBzdHJyY2hyKFB5X0dldFByb2dyYW1OYW1lKCksICcvJyk7CisgICAgaWYgKGJhc2VOYW1lICE9IE5VTEwpCisgICAgICAgIGJhc2VOYW1lKys7CisgICAgZWxzZQorICAgICAgICBiYXNlTmFtZSA9IFB5X0dldFByb2dyYW1OYW1lKCk7CisgICAgY2xhc3NOYW1lID0gIlRrIjsKIAotCXJldHVybiAoUHlPYmplY3QgKikgVGthcHBfTmV3KHNjcmVlbk5hbWUsIGJhc2VOYW1lLCBjbGFzc05hbWUsIAotCQkJCSAgICAgIGludGVyYWN0aXZlLCB3YW50b2JqZWN0cywJd2FudFRrLAotCQkJCSAgICAgIHN5bmMsIHVzZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8enNzaWlpaXo6Y3JlYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmVlbk5hbWUsICZiYXNlTmFtZSwgJmNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyYWN0aXZlLCAmd2FudG9iamVjdHMsICZ3YW50VGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW5jLCAmdXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIFRrYXBwX05ldyhzY3JlZW5OYW1lLCBiYXNlTmFtZSwgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlLCB3YW50b2JqZWN0cywgICAgIHdhbnRUaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLCB1c2UpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGtpbnRlcl9zZXRidXN5d2FpdGludGVydmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbmV3X3ZhbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0YnVzeXdhaXRpbnRlcnZhbCIsICZuZXdfdmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG5ld192YWwgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJidXN5d2FpdGludGVydmFsIG11c3QgYmUgPj0gMCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JVGtpbnRlcl9idXN5d2FpdGludGVydmFsID0gbmV3X3ZhbDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IG5ld192YWw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldGJ1c3l3YWl0aW50ZXJ2YWwiLCAmbmV3X3ZhbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuZXdfdmFsIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJidXN5d2FpdGludGVydmFsIG11c3QgYmUgPj0gMCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgVGtpbnRlcl9idXN5d2FpdGludGVydmFsID0gbmV3X3ZhbDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBjaGFyIHNldGJ1c3l3YWl0aW50ZXJ2YWxfZG9jW10gPQpAQCAtMzA1Myw3ICszMDUzLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2ludGVyX2dldGJ1c3l3YWl0aW50ZXJ2YWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoVGtpbnRlcl9idXN5d2FpdGludGVydmFsKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoVGtpbnRlcl9idXN5d2FpdGludGVydmFsKTsKIH0KIAogc3RhdGljIGNoYXIgZ2V0YnVzeXdhaXRpbnRlcnZhbF9kb2NbXSA9CkBAIC0zMDY0LDIxICszMDY0LDIxIEBACiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVNZXRob2RzW10gPQogewotCXsiX2ZsYXR0ZW4iLCAgICAgICAgICAgVGtpbnRlcl9GbGF0dGVuLCBNRVRIX1ZBUkFSR1N9LAotCXsiY3JlYXRlIiwgICAgICAgICAgICAgVGtpbnRlcl9DcmVhdGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJfZmxhdHRlbiIsICAgICAgICAgICBUa2ludGVyX0ZsYXR0ZW4sIE1FVEhfVkFSQVJHU30sCisgICAgeyJjcmVhdGUiLCAgICAgICAgICAgICBUa2ludGVyX0NyZWF0ZSwgTUVUSF9WQVJBUkdTfSwKICNpZmRlZiBIQVZFX0NSRUFURUZJTEVIQU5ETEVSCi0JeyJjcmVhdGVmaWxlaGFuZGxlciIsICBUa2FwcF9DcmVhdGVGaWxlSGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKLQl7ImRlbGV0ZWZpbGVoYW5kbGVyIiwgIFRrYXBwX0RlbGV0ZUZpbGVIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY3JlYXRlZmlsZWhhbmRsZXIiLCAgVGthcHBfQ3JlYXRlRmlsZUhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJkZWxldGVmaWxlaGFuZGxlciIsICBUa2FwcF9EZWxldGVGaWxlSGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgotCXsiY3JlYXRldGltZXJoYW5kbGVyIiwgVGthcHBfQ3JlYXRlVGltZXJIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAotCXsibWFpbmxvb3AiLCAgICAgICAgICAgVGthcHBfTWFpbkxvb3AsIE1FVEhfVkFSQVJHU30sCi0JeyJkb29uZWV2ZW50IiwgICAgICAgICBUa2FwcF9Eb09uZUV2ZW50LCBNRVRIX1ZBUkFSR1N9LAotCXsicXVpdCIsICAgICAgICAgICAgICAgVGthcHBfUXVpdCwgTUVUSF9WQVJBUkdTfSwKLQl7InNldGJ1c3l3YWl0aW50ZXJ2YWwiLFRraW50ZXJfc2V0YnVzeXdhaXRpbnRlcnZhbCwgTUVUSF9WQVJBUkdTLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2V0YnVzeXdhaXRpbnRlcnZhbF9kb2N9LAotCXsiZ2V0YnVzeXdhaXRpbnRlcnZhbCIsKFB5Q0Z1bmN0aW9uKVRraW50ZXJfZ2V0YnVzeXdhaXRpbnRlcnZhbCwKLQkgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfTk9BUkdTLCBnZXRidXN5d2FpdGludGVydmFsX2RvY30sCi0Je05VTEwsICAgICAgICAgICAgICAgICBOVUxMfQorICAgIHsiY3JlYXRldGltZXJoYW5kbGVyIiwgVGthcHBfQ3JlYXRlVGltZXJIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsibWFpbmxvb3AiLCAgICAgICAgICAgVGthcHBfTWFpbkxvb3AsIE1FVEhfVkFSQVJHU30sCisgICAgeyJkb29uZWV2ZW50IiwgICAgICAgICBUa2FwcF9Eb09uZUV2ZW50LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicXVpdCIsICAgICAgICAgICAgICAgVGthcHBfUXVpdCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldGJ1c3l3YWl0aW50ZXJ2YWwiLFRraW50ZXJfc2V0YnVzeXdhaXRpbnRlcnZhbCwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0YnVzeXdhaXRpbnRlcnZhbF9kb2N9LAorICAgIHsiZ2V0YnVzeXdhaXRpbnRlcnZhbCIsKFB5Q0Z1bmN0aW9uKVRraW50ZXJfZ2V0YnVzeXdhaXRpbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfTk9BUkdTLCBnZXRidXN5d2FpdGludGVydmFsX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICBOVUxMfQogfTsKIAogI2lmZGVmIFdBSVRfRk9SX1NURElOCkBAIC0zMDg5LDcgKzMwODksNyBAQAogc3RhdGljIHZvaWQKIE15RmlsZVByb2Modm9pZCAqY2xpZW50RGF0YSwgaW50IG1hc2spCiB7Ci0Jc3RkaW5fcmVhZHkgPSAxOworICAgIHN0ZGluX3JlYWR5ID0gMTsKIH0KICNlbmRpZgogCkBAIC0zMTAxLDU3ICszMTAxLDU3IEBACiBFdmVudEhvb2sodm9pZCkKIHsKICNpZm5kZWYgTVNfV0lORE9XUwotCWludCB0ZmlsZTsKKyAgICBpbnQgdGZpbGU7CiAjZW5kaWYKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5RXZhbF9SZXN0b3JlVGhyZWFkKGV2ZW50X3RzdGF0ZSk7CisgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoZXZlbnRfdHN0YXRlKTsKICNlbmRpZgotCXN0ZGluX3JlYWR5ID0gMDsKLQllcnJvckluQ21kID0gMDsKKyAgICBzdGRpbl9yZWFkeSA9IDA7CisgICAgZXJyb3JJbkNtZCA9IDA7CiAjaWZuZGVmIE1TX1dJTkRPV1MKLQl0ZmlsZSA9IGZpbGVubyhzdGRpbik7Ci0JVGNsX0NyZWF0ZUZpbGVIYW5kbGVyKHRmaWxlLCBUQ0xfUkVBREFCTEUsIE15RmlsZVByb2MsIE5VTEwpOworICAgIHRmaWxlID0gZmlsZW5vKHN0ZGluKTsKKyAgICBUY2xfQ3JlYXRlRmlsZUhhbmRsZXIodGZpbGUsIFRDTF9SRUFEQUJMRSwgTXlGaWxlUHJvYywgTlVMTCk7CiAjZW5kaWYKLQl3aGlsZSAoIWVycm9ySW5DbWQgJiYgIXN0ZGluX3JlYWR5KSB7Ci0JCWludCByZXN1bHQ7CisgICAgd2hpbGUgKCFlcnJvckluQ21kICYmICFzdGRpbl9yZWFkeSkgeworICAgICAgICBpbnQgcmVzdWx0OwogI2lmZGVmIE1TX1dJTkRPV1MKLQkJaWYgKF9rYmhpdCgpKSB7Ci0JCQlzdGRpbl9yZWFkeSA9IDE7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICBpZiAoX2tiaGl0KCkpIHsKKyAgICAgICAgICAgIHN0ZGluX3JlYWR5ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAjZW5kaWYKICNpZiBkZWZpbmVkKFdJVEhfVEhSRUFEKSB8fCBkZWZpbmVkKE1TX1dJTkRPV1MpCi0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJaWYodGNsX2xvY2spUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRjbF9sb2NrLCAxKTsKLQkJdGNsX3RzdGF0ZSA9IGV2ZW50X3RzdGF0ZTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBpZih0Y2xfbG9jaylQeVRocmVhZF9hY3F1aXJlX2xvY2sodGNsX2xvY2ssIDEpOworICAgICAgICB0Y2xfdHN0YXRlID0gZXZlbnRfdHN0YXRlOwogCi0JCXJlc3VsdCA9IFRjbF9Eb09uZUV2ZW50KFRDTF9ET05UX1dBSVQpOworICAgICAgICByZXN1bHQgPSBUY2xfRG9PbmVFdmVudChUQ0xfRE9OVF9XQUlUKTsKIAotCQl0Y2xfdHN0YXRlID0gTlVMTDsKLQkJaWYodGNsX2xvY2spUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRjbF9sb2NrKTsKLQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJU2xlZXAoVGtpbnRlcl9idXN5d2FpdGludGVydmFsKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgdGNsX3RzdGF0ZSA9IE5VTEw7CisgICAgICAgIGlmKHRjbF9sb2NrKVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0Y2xfbG9jayk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKKyAgICAgICAgICAgIFNsZWVwKFRraW50ZXJfYnVzeXdhaXRpbnRlcnZhbCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAjZWxzZQotCQlyZXN1bHQgPSBUY2xfRG9PbmVFdmVudCgwKTsKKyAgICAgICAgcmVzdWx0ID0gVGNsX0RvT25lRXZlbnQoMCk7CiAjZW5kaWYKIAotCQlpZiAocmVzdWx0IDwgMCkKLQkJCWJyZWFrOwotCX0KKyAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAjaWZuZGVmIE1TX1dJTkRPV1MKLQlUY2xfRGVsZXRlRmlsZUhhbmRsZXIodGZpbGUpOworICAgIFRjbF9EZWxldGVGaWxlSGFuZGxlcih0ZmlsZSk7CiAjZW5kaWYKLQlpZiAoZXJyb3JJbkNtZCkgewotCQllcnJvckluQ21kID0gMDsKLQkJUHlFcnJfUmVzdG9yZShleGNJbkNtZCwgdmFsSW5DbWQsIHRyYkluQ21kKTsKLQkJZXhjSW5DbWQgPSB2YWxJbkNtZCA9IHRyYkluQ21kID0gTlVMTDsKLQkJUHlFcnJfUHJpbnQoKTsKLQl9CisgICAgaWYgKGVycm9ySW5DbWQpIHsKKyAgICAgICAgZXJyb3JJbkNtZCA9IDA7CisgICAgICAgIFB5RXJyX1Jlc3RvcmUoZXhjSW5DbWQsIHZhbEluQ21kLCB0cmJJbkNtZCk7CisgICAgICAgIGV4Y0luQ21kID0gdmFsSW5DbWQgPSB0cmJJbkNtZCA9IE5VTEw7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlFdmFsX1NhdmVUaHJlYWQoKTsKKyAgICBQeUV2YWxfU2F2ZVRocmVhZCgpOwogI2VuZGlmCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKICNlbmRpZgpAQCAtMzE2MCwxMiArMzE2MCwxMiBAQAogRW5hYmxlRXZlbnRIb29rKHZvaWQpCiB7CiAjaWZkZWYgV0FJVF9GT1JfU1RESU4KLQlpZiAoUHlPU19JbnB1dEhvb2sgPT0gTlVMTCkgeworICAgIGlmIChQeU9TX0lucHV0SG9vayA9PSBOVUxMKSB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJZXZlbnRfdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKKyAgICAgICAgZXZlbnRfdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKICNlbmRpZgotCQlQeU9TX0lucHV0SG9vayA9IEV2ZW50SG9vazsKLQl9CisgICAgICAgIFB5T1NfSW5wdXRIb29rID0gRXZlbnRIb29rOworICAgIH0KICNlbmRpZgogfQogCkBAIC0zMTczLDkgKzMxNzMsOSBAQAogRGlzYWJsZUV2ZW50SG9vayh2b2lkKQogewogI2lmZGVmIFdBSVRfRk9SX1NURElOCi0JaWYgKFRrX0dldE51bU1haW5XaW5kb3dzKCkgPT0gMCAmJiBQeU9TX0lucHV0SG9vayA9PSBFdmVudEhvb2spIHsKLQkJUHlPU19JbnB1dEhvb2sgPSBOVUxMOwotCX0KKyAgICBpZiAoVGtfR2V0TnVtTWFpbldpbmRvd3MoKSA9PSAwICYmIFB5T1NfSW5wdXRIb29rID09IEV2ZW50SG9vaykgeworICAgICAgICBQeU9TX0lucHV0SG9vayA9IE5VTEw7CisgICAgfQogI2VuZGlmCiB9CiAKQEAgLTMxODQsODkgKzMxODQsODkgQEAKIHN0YXRpYyB2b2lkCiBpbnNfbG9uZyhQeU9iamVjdCAqZCwgY2hhciAqbmFtZSwgbG9uZyB2YWwpCiB7Ci0JUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZyh2YWwpOwotCWlmICh2KSB7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIHYpOwotCQlQeV9ERUNSRUYodik7Ci0JfQorICAgIFB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBpZiAodikgeworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIH0KIHN0YXRpYyB2b2lkCiBpbnNfc3RyaW5nKFB5T2JqZWN0ICpkLCBjaGFyICpuYW1lLCBjaGFyICp2YWwpCiB7Ci0JUHlPYmplY3QgKnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbCk7Ci0JaWYgKHYpIHsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgUHlPYmplY3QgKnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbCk7CisgICAgaWYgKHYpIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiB9CiAKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRfdGtpbnRlcih2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CiAKLQlQeV9UWVBFKCZUa2FwcF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeV9UWVBFKCZUa2FwcF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JdGNsX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgdGNsX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CiAjZW5kaWYKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfdGtpbnRlciIsIG1vZHVsZU1ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX3RraW50ZXIiLCBtb2R1bGVNZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlUa2ludGVyX1RjbEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJfdGtpbnRlci5UY2xFcnJvciIsIE5VTEwsIE5VTEwpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUY2xFcnJvciIsIFRraW50ZXJfVGNsRXJyb3IpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFRraW50ZXJfVGNsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oIl90a2ludGVyLlRjbEVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRjbEVycm9yIiwgVGtpbnRlcl9UY2xFcnJvcik7CiAKLQlpbnNfbG9uZyhkLCAiUkVBREFCTEUiLCBUQ0xfUkVBREFCTEUpOwotCWluc19sb25nKGQsICJXUklUQUJMRSIsIFRDTF9XUklUQUJMRSk7Ci0JaW5zX2xvbmcoZCwgIkVYQ0VQVElPTiIsIFRDTF9FWENFUFRJT04pOwotCWluc19sb25nKGQsICJXSU5ET1dfRVZFTlRTIiwgVENMX1dJTkRPV19FVkVOVFMpOwotCWluc19sb25nKGQsICJGSUxFX0VWRU5UUyIsIFRDTF9GSUxFX0VWRU5UUyk7Ci0JaW5zX2xvbmcoZCwgIlRJTUVSX0VWRU5UUyIsIFRDTF9USU1FUl9FVkVOVFMpOwotCWluc19sb25nKGQsICJJRExFX0VWRU5UUyIsIFRDTF9JRExFX0VWRU5UUyk7Ci0JaW5zX2xvbmcoZCwgIkFMTF9FVkVOVFMiLCBUQ0xfQUxMX0VWRU5UUyk7Ci0JaW5zX2xvbmcoZCwgIkRPTlRfV0FJVCIsIFRDTF9ET05UX1dBSVQpOwotCWluc19zdHJpbmcoZCwgIlRLX1ZFUlNJT04iLCBUS19WRVJTSU9OKTsKLQlpbnNfc3RyaW5nKGQsICJUQ0xfVkVSU0lPTiIsIFRDTF9WRVJTSU9OKTsKKyAgICBpbnNfbG9uZyhkLCAiUkVBREFCTEUiLCBUQ0xfUkVBREFCTEUpOworICAgIGluc19sb25nKGQsICJXUklUQUJMRSIsIFRDTF9XUklUQUJMRSk7CisgICAgaW5zX2xvbmcoZCwgIkVYQ0VQVElPTiIsIFRDTF9FWENFUFRJT04pOworICAgIGluc19sb25nKGQsICJXSU5ET1dfRVZFTlRTIiwgVENMX1dJTkRPV19FVkVOVFMpOworICAgIGluc19sb25nKGQsICJGSUxFX0VWRU5UUyIsIFRDTF9GSUxFX0VWRU5UUyk7CisgICAgaW5zX2xvbmcoZCwgIlRJTUVSX0VWRU5UUyIsIFRDTF9USU1FUl9FVkVOVFMpOworICAgIGluc19sb25nKGQsICJJRExFX0VWRU5UUyIsIFRDTF9JRExFX0VWRU5UUyk7CisgICAgaW5zX2xvbmcoZCwgIkFMTF9FVkVOVFMiLCBUQ0xfQUxMX0VWRU5UUyk7CisgICAgaW5zX2xvbmcoZCwgIkRPTlRfV0FJVCIsIFRDTF9ET05UX1dBSVQpOworICAgIGluc19zdHJpbmcoZCwgIlRLX1ZFUlNJT04iLCBUS19WRVJTSU9OKTsKKyAgICBpbnNfc3RyaW5nKGQsICJUQ0xfVkVSU0lPTiIsIFRDTF9WRVJTSU9OKTsKIAotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUa2FwcFR5cGUiLCAoUHlPYmplY3QgKikmVGthcHBfVHlwZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRrYXBwVHlwZSIsIChQeU9iamVjdCAqKSZUa2FwcF9UeXBlKTsKIAotCVB5X1RZUEUoJlRrdHRfVHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRrdHRUeXBlIiwgKFB5T2JqZWN0ICopJlRrdHRfVHlwZSk7CisgICAgUHlfVFlQRSgmVGt0dF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVGt0dFR5cGUiLCAoUHlPYmplY3QgKikmVGt0dF9UeXBlKTsKIAotCVB5X1RZUEUoJlB5VGNsT2JqZWN0X1R5cGUpID0gJlB5VHlwZV9UeXBlOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUY2xfT2JqIiwgKFB5T2JqZWN0ICopJlB5VGNsT2JqZWN0X1R5cGUpOworICAgIFB5X1RZUEUoJlB5VGNsT2JqZWN0X1R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUY2xfT2JqIiwgKFB5T2JqZWN0ICopJlB5VGNsT2JqZWN0X1R5cGUpOwogCiAjaWZkZWYgVEtfQVFVQQotCS8qIFRrX01hY09TWFNldHVwVGtOb3RpZmllciBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgVGNsJ3Mgc3Vic3lzdGVtcwotCSAqIHN0YXJ0IHdha2luZyB1cC4gIE5vdGUgdGhhdCBUY2xfRmluZEV4ZWN1dGFibGUgd2lsbCBkbyB0aGlzLCB0aGlzCi0JICogY29kZSBtdXN0IGJlIGFib3ZlIGl0ISBUaGUgb3JpZ2luYWwgd2FybmluZyBmcm9tCi0JICogdGtNYWNPU1hBcHBJbml0LmMgaXMgY29waWVkIGJlbG93LgotCSAqCi0JICogTkIgLSBZb3UgaGF2ZSB0byBzd2FwIGluIHRoZSBUayBOb3RpZmllciBCRUZPUkUgeW91IHN0YXJ0IHVwIHRoZQotCSAqIFRjbCBpbnRlcnByZXRlciBmb3Igbm93LiAgSXQgcHJvYmFibHkgc2hvdWxkIHdvcmsgdG8gZG8gdGhpcwotCSAqIGluIHRoZSBvdGhlciBvcmRlciwgYnV0IGZvciBub3cgaXQgZG9lc24ndCBzZWVtIHRvLgotCSAqCi0JICovCi0JVGtfTWFjT1NYU2V0dXBUa05vdGlmaWVyKCk7CisgICAgLyogVGtfTWFjT1NYU2V0dXBUa05vdGlmaWVyIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBUY2wncyBzdWJzeXN0ZW1zCisgICAgICogc3RhcnQgd2FraW5nIHVwLiAgTm90ZSB0aGF0IFRjbF9GaW5kRXhlY3V0YWJsZSB3aWxsIGRvIHRoaXMsIHRoaXMKKyAgICAgKiBjb2RlIG11c3QgYmUgYWJvdmUgaXQhIFRoZSBvcmlnaW5hbCB3YXJuaW5nIGZyb20KKyAgICAgKiB0a01hY09TWEFwcEluaXQuYyBpcyBjb3BpZWQgYmVsb3cuCisgICAgICoKKyAgICAgKiBOQiAtIFlvdSBoYXZlIHRvIHN3YXAgaW4gdGhlIFRrIE5vdGlmaWVyIEJFRk9SRSB5b3Ugc3RhcnQgdXAgdGhlCisgICAgICogVGNsIGludGVycHJldGVyIGZvciBub3cuICBJdCBwcm9iYWJseSBzaG91bGQgd29yayB0byBkbyB0aGlzCisgICAgICogaW4gdGhlIG90aGVyIG9yZGVyLCBidXQgZm9yIG5vdyBpdCBkb2Vzbid0IHNlZW0gdG8uCisgICAgICoKKyAgICAgKi8KKyAgICBUa19NYWNPU1hTZXR1cFRrTm90aWZpZXIoKTsKICNlbmRpZgogCiAKLQkvKiBUaGlzIGhlbHBzIHRoZSBkeW5hbWljIGxvYWRlcjsgaW4gVW5pY29kZSBhd2FyZSBUY2wgdmVyc2lvbnMKLQkgICBpdCBhbHNvIGhlbHBzIFRjbCBmaW5kIGl0cyBlbmNvZGluZ3MuICovCi0JVGNsX0ZpbmRFeGVjdXRhYmxlKFB5X0dldFByb2dyYW1OYW1lKCkpOworICAgIC8qIFRoaXMgaGVscHMgdGhlIGR5bmFtaWMgbG9hZGVyOyBpbiBVbmljb2RlIGF3YXJlIFRjbCB2ZXJzaW9ucworICAgICAgIGl0IGFsc28gaGVscHMgVGNsIGZpbmQgaXRzIGVuY29kaW5ncy4gKi8KKyAgICBUY2xfRmluZEV4ZWN1dGFibGUoUHlfR2V0UHJvZ3JhbU5hbWUoKSk7CiAKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm47CiAKICNpZiAwCi0JLyogVGhpcyB3YXMgbm90IGEgZ29vZCBpZGVhOyB0aHJvdWdoIDxEZXN0cm95PiBiaW5kaW5ncywKLQkgICBUY2xfRmluYWxpemUoKSBtYXkgaW52b2tlIFB5dGhvbiBjb2RlIGJ1dCBhdCB0aGF0IHBvaW50IHRoZQotCSAgIGludGVycHJldGVyIGFuZCB0aHJlYWQgc3RhdGUgaGF2ZSBhbHJlYWR5IGJlZW4gZGVzdHJveWVkISAqLwotCVB5X0F0RXhpdChUY2xfRmluYWxpemUpOworICAgIC8qIFRoaXMgd2FzIG5vdCBhIGdvb2QgaWRlYTsgdGhyb3VnaCA8RGVzdHJveT4gYmluZGluZ3MsCisgICAgICAgVGNsX0ZpbmFsaXplKCkgbWF5IGludm9rZSBQeXRob24gY29kZSBidXQgYXQgdGhhdCBwb2ludCB0aGUKKyAgICAgICBpbnRlcnByZXRlciBhbmQgdGhyZWFkIHN0YXRlIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCEgKi8KKyAgICBQeV9BdEV4aXQoVGNsX0ZpbmFsaXplKTsKICNlbmRpZgogCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2FkZHJpbmZvLmggYi9Nb2R1bGVzL2FkZHJpbmZvLmgKaW5kZXggNmY2N2EyZS4uNjcwYjE3MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hZGRyaW5mby5oCisrKyBiL01vZHVsZXMvYWRkcmluZm8uaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIGFuZCAxOTk5IFdJREUgUHJvamVjdC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKKyAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICogYXJlIG1ldDoKQEAgLTEzLDcgKzEzLDcgQEAKICAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCisgKgogICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKQEAgLTU1LDIwICs1NSwyMCBAQAogI2RlZmluZSBnZXRhZGRyaW5mbyBmYWtlX2dldGFkZHJpbmZvCiAjZW5kaWYgLyogRUFJX0FERFJGQU1JTFkgKi8KIAotI2RlZmluZQlFQUlfQUREUkZBTUlMWQkgMQkvKiBhZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZQlFQUlfQUdBSU4JIDIJLyogdGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uICovCi0jZGVmaW5lCUVBSV9CQURGTEFHUwkgMwkvKiBpbnZhbGlkIHZhbHVlIGZvciBhaV9mbGFncyAqLwotI2RlZmluZQlFQUlfRkFJTAkgNAkvKiBub24tcmVjb3ZlcmFibGUgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24gKi8KLSNkZWZpbmUJRUFJX0ZBTUlMWQkgNQkvKiBhaV9mYW1pbHkgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZQlFQUlfTUVNT1JZCSA2CS8qIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KLSNkZWZpbmUJRUFJX05PREFUQQkgNwkvKiBubyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBob3N0bmFtZSAqLwotI2RlZmluZQlFQUlfTk9OQU1FCSA4CS8qIGhvc3RuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duICovCi0jZGVmaW5lCUVBSV9TRVJWSUNFCSA5CS8qIHNlcnZuYW1lIG5vdCBzdXBwb3J0ZWQgZm9yIGFpX3NvY2t0eXBlICovCi0jZGVmaW5lCUVBSV9TT0NLVFlQRQkxMAkvKiBhaV9zb2NrdHlwZSBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lCUVBSV9TWVNURU0JMTEJLyogc3lzdGVtIGVycm9yIHJldHVybmVkIGluIGVycm5vICovCi0jZGVmaW5lIEVBSV9CQURISU5UUwkxMgotI2RlZmluZSBFQUlfUFJPVE9DT0wJMTMKLSNkZWZpbmUgRUFJX01BWAkJMTQKKyNkZWZpbmUgRUFJX0FERFJGQU1JTFkgICAxICAgICAgLyogYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRUFJX0FHQUlOICAgICAgICAyICAgICAgLyogdGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uICovCisjZGVmaW5lIEVBSV9CQURGTEFHUyAgICAgMyAgICAgIC8qIGludmFsaWQgdmFsdWUgZm9yIGFpX2ZsYWdzICovCisjZGVmaW5lIEVBSV9GQUlMICAgICAgICAgNCAgICAgIC8qIG5vbi1yZWNvdmVyYWJsZSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiAqLworI2RlZmluZSBFQUlfRkFNSUxZICAgICAgIDUgICAgICAvKiBhaV9mYW1pbHkgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBFQUlfTUVNT1JZICAgICAgIDYgICAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlICovCisjZGVmaW5lIEVBSV9OT0RBVEEgICAgICAgNyAgICAgIC8qIG5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lICovCisjZGVmaW5lIEVBSV9OT05BTUUgICAgICAgOCAgICAgIC8qIGhvc3RuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duICovCisjZGVmaW5lIEVBSV9TRVJWSUNFICAgICAgOSAgICAgIC8qIHNlcnZuYW1lIG5vdCBzdXBwb3J0ZWQgZm9yIGFpX3NvY2t0eXBlICovCisjZGVmaW5lIEVBSV9TT0NLVFlQRSAgICAxMCAgICAgIC8qIGFpX3NvY2t0eXBlIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRUFJX1NZU1RFTSAgICAgIDExICAgICAgLyogc3lzdGVtIGVycm9yIHJldHVybmVkIGluIGVycm5vICovCisjZGVmaW5lIEVBSV9CQURISU5UUyAgICAxMgorI2RlZmluZSBFQUlfUFJPVE9DT0wgICAgMTMKKyNkZWZpbmUgRUFJX01BWCAgICAgICAgIDE0CiAKIC8qCiAgKiBGbGFnIHZhbHVlcyBmb3IgZ2V0YWRkcmluZm8oKQpAQCAtODUsMTggKzg1LDE4IEBACiAjdW5kZWYgQUlfREVGQVVMVAogI2VuZGlmIC8qIEFJX1BBU1NJVkUgKi8KIAotI2RlZmluZQlBSV9QQVNTSVZFCTB4MDAwMDAwMDEgLyogZ2V0IGFkZHJlc3MgdG8gdXNlIGJpbmQoKSAqLwotI2RlZmluZQlBSV9DQU5PTk5BTUUJMHgwMDAwMDAwMiAvKiBmaWxsIGFpX2Nhbm9ubmFtZSAqLwotI2RlZmluZQlBSV9OVU1FUklDSE9TVAkweDAwMDAwMDA0IC8qIHByZXZlbnQgbmFtZSByZXNvbHV0aW9uICovCisjZGVmaW5lIEFJX1BBU1NJVkUgICAgICAweDAwMDAwMDAxIC8qIGdldCBhZGRyZXNzIHRvIHVzZSBiaW5kKCkgKi8KKyNkZWZpbmUgQUlfQ0FOT05OQU1FICAgIDB4MDAwMDAwMDIgLyogZmlsbCBhaV9jYW5vbm5hbWUgKi8KKyNkZWZpbmUgQUlfTlVNRVJJQ0hPU1QgIDB4MDAwMDAwMDQgLyogcHJldmVudCBuYW1lIHJlc29sdXRpb24gKi8KIC8qIHZhbGlkIGZsYWdzIGZvciBhZGRyaW5mbyAqLwotI2RlZmluZQlBSV9NQVNLCQkoQUlfUEFTU0lWRSB8IEFJX0NBTk9OTkFNRSB8IEFJX05VTUVSSUNIT1NUKQorI2RlZmluZSBBSV9NQVNLICAgICAgICAgKEFJX1BBU1NJVkUgfCBBSV9DQU5PTk5BTUUgfCBBSV9OVU1FUklDSE9TVCkKIAotI2RlZmluZQlBSV9BTEwJCTB4MDAwMDAxMDAgLyogSVB2NiBhbmQgSVB2NC1tYXBwZWQgKHdpdGggQUlfVjRNQVBQRUQpICovCi0jZGVmaW5lCUFJX1Y0TUFQUEVEX0NGRwkweDAwMDAwMjAwIC8qIGFjY2VwdCBJUHY0LW1hcHBlZCBpZiBrZXJuZWwgc3VwcG9ydHMgKi8KLSNkZWZpbmUJQUlfQUREUkNPTkZJRwkweDAwMDAwNDAwIC8qIG9ubHkgaWYgYW55IGFkZHJlc3MgaXMgYXNzaWduZWQgKi8KLSNkZWZpbmUJQUlfVjRNQVBQRUQJMHgwMDAwMDgwMCAvKiBhY2NlcHQgSVB2NC1tYXBwZWQgSVB2NiBhZGRyZXNzICovCisjZGVmaW5lIEFJX0FMTCAgICAgICAgICAweDAwMDAwMTAwIC8qIElQdjYgYW5kIElQdjQtbWFwcGVkICh3aXRoIEFJX1Y0TUFQUEVEKSAqLworI2RlZmluZSBBSV9WNE1BUFBFRF9DRkcgMHgwMDAwMDIwMCAvKiBhY2NlcHQgSVB2NC1tYXBwZWQgaWYga2VybmVsIHN1cHBvcnRzICovCisjZGVmaW5lIEFJX0FERFJDT05GSUcgICAweDAwMDAwNDAwIC8qIG9ubHkgaWYgYW55IGFkZHJlc3MgaXMgYXNzaWduZWQgKi8KKyNkZWZpbmUgQUlfVjRNQVBQRUQgICAgIDB4MDAwMDA4MDAgLyogYWNjZXB0IElQdjQtbWFwcGVkIElQdjYgYWRkcmVzcyAqLwogLyogc3BlY2lhbCByZWNvbW1lbmRlZCBmbGFncyBmb3IgZ2V0aXBub2RlYnluYW1lICovCi0jZGVmaW5lCUFJX0RFRkFVTFQJKEFJX1Y0TUFQUEVEX0NGRyB8IEFJX0FERFJDT05GSUcpCisjZGVmaW5lIEFJX0RFRkFVTFQgICAgICAoQUlfVjRNQVBQRURfQ0ZHIHwgQUlfQUREUkNPTkZJRykKIAogI2VuZGlmIC8qICFIQVZFX0dFVEFERFJJTkZPICovCiAKQEAgLTEwNiwzMyArMTA2LDMzIEBACiAgKiBDb25zdGFudHMgZm9yIGdldG5hbWVpbmZvKCkKICAqLwogI2lmbmRlZiBOSV9NQVhIT1NUCi0jZGVmaW5lCU5JX01BWEhPU1QJMTAyNQotI2RlZmluZQlOSV9NQVhTRVJWCTMyCisjZGVmaW5lIE5JX01BWEhPU1QgICAgICAxMDI1CisjZGVmaW5lIE5JX01BWFNFUlYgICAgICAzMgogI2VuZGlmIC8qICFOSV9NQVhIT1NUICovCiAKIC8qCiAgKiBGbGFnIHZhbHVlcyBmb3IgZ2V0bmFtZWluZm8oKQogICovCiAjaWZuZGVmIE5JX05PRlFETgotI2RlZmluZQlOSV9OT0ZRRE4JMHgwMDAwMDAwMQotI2RlZmluZQlOSV9OVU1FUklDSE9TVAkweDAwMDAwMDAyCi0jZGVmaW5lCU5JX05BTUVSRVFECTB4MDAwMDAwMDQKLSNkZWZpbmUJTklfTlVNRVJJQ1NFUlYJMHgwMDAwMDAwOAotI2RlZmluZQlOSV9ER1JBTQkweDAwMDAwMDEwCisjZGVmaW5lIE5JX05PRlFETiAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5JX05VTUVSSUNIT1NUICAweDAwMDAwMDAyCisjZGVmaW5lIE5JX05BTUVSRVFEICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE5JX05VTUVSSUNTRVJWICAweDAwMDAwMDA4CisjZGVmaW5lIE5JX0RHUkFNICAgICAgICAweDAwMDAwMDEwCiAjZW5kaWYgLyogIU5JX05PRlFETiAqLwogCiAjZW5kaWYgLyogIUhBVkVfR0VUTkFNRUlORk8gKi8KIAogI2lmbmRlZiBIQVZFX0FERFJJTkZPCiBzdHJ1Y3QgYWRkcmluZm8gewotCWludAlhaV9mbGFnczsJLyogQUlfUEFTU0lWRSwgQUlfQ0FOT05OQU1FICovCi0JaW50CWFpX2ZhbWlseTsJLyogUEZfeHh4ICovCi0JaW50CWFpX3NvY2t0eXBlOwkvKiBTT0NLX3h4eCAqLwotCWludAlhaV9wcm90b2NvbDsJLyogMCBvciBJUFBST1RPX3h4eCBmb3IgSVB2NCBhbmQgSVB2NiAqLwotCXNpemVfdAlhaV9hZGRybGVuOwkvKiBsZW5ndGggb2YgYWlfYWRkciAqLwotCWNoYXIJKmFpX2Nhbm9ubmFtZTsJLyogY2Fub25pY2FsIG5hbWUgZm9yIGhvc3RuYW1lICovCi0Jc3RydWN0IHNvY2thZGRyICphaV9hZGRyOwkvKiBiaW5hcnkgYWRkcmVzcyAqLwotCXN0cnVjdCBhZGRyaW5mbyAqYWlfbmV4dDsJLyogbmV4dCBzdHJ1Y3R1cmUgaW4gbGlua2VkIGxpc3QgKi8KKyAgICBpbnQgICAgICAgICBhaV9mbGFnczsgICAgICAgLyogQUlfUEFTU0lWRSwgQUlfQ0FOT05OQU1FICovCisgICAgaW50ICAgICAgICAgYWlfZmFtaWx5OyAgICAgIC8qIFBGX3h4eCAqLworICAgIGludCAgICAgICAgIGFpX3NvY2t0eXBlOyAgICAvKiBTT0NLX3h4eCAqLworICAgIGludCAgICAgICAgIGFpX3Byb3RvY29sOyAgICAvKiAwIG9yIElQUFJPVE9feHh4IGZvciBJUHY0IGFuZCBJUHY2ICovCisgICAgc2l6ZV90ICAgICAgYWlfYWRkcmxlbjsgICAgIC8qIGxlbmd0aCBvZiBhaV9hZGRyICovCisgICAgY2hhciAgICAgICAgKmFpX2Nhbm9ubmFtZTsgIC8qIGNhbm9uaWNhbCBuYW1lIGZvciBob3N0bmFtZSAqLworICAgIHN0cnVjdCBzb2NrYWRkciAqYWlfYWRkcjsgICAgICAgICAgIC8qIGJpbmFyeSBhZGRyZXNzICovCisgICAgc3RydWN0IGFkZHJpbmZvICphaV9uZXh0OyAgICAgICAgICAgLyogbmV4dCBzdHJ1Y3R1cmUgaW4gbGlua2VkIGxpc3QgKi8KIH07CiAjZW5kaWYgLyogIUhBVkVfQUREUklORk8gKi8KIApAQCAtMTQwLDMwICsxNDAsMzAgQEAKIC8qCiAgKiBSRkMgMjU1MzogcHJvdG9jb2wtaW5kZXBlbmRlbnQgcGxhY2Vob2xkZXIgZm9yIHNvY2tldCBhZGRyZXNzZXMKICAqLwotI2RlZmluZSBfU1NfTUFYU0laRQkxMjgKKyNkZWZpbmUgX1NTX01BWFNJWkUgICAgIDEyOAogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0jZGVmaW5lIF9TU19BTElHTlNJWkUJKHNpemVvZihQWV9MT05HX0xPTkcpKQorI2RlZmluZSBfU1NfQUxJR05TSVpFICAgKHNpemVvZihQWV9MT05HX0xPTkcpKQogI2Vsc2UKLSNkZWZpbmUgX1NTX0FMSUdOU0laRQkoc2l6ZW9mKGRvdWJsZSkpCisjZGVmaW5lIF9TU19BTElHTlNJWkUgICAoc2l6ZW9mKGRvdWJsZSkpCiAjZW5kaWYgLyogSEFWRV9MT05HX0xPTkcgKi8KLSNkZWZpbmUgX1NTX1BBRDFTSVpFCShfU1NfQUxJR05TSVpFIC0gc2l6ZW9mKHVfY2hhcikgKiAyKQotI2RlZmluZSBfU1NfUEFEMlNJWkUJKF9TU19NQVhTSVpFIC0gc2l6ZW9mKHVfY2hhcikgKiAyIC0gXAotCQkJCV9TU19QQUQxU0laRSAtIF9TU19BTElHTlNJWkUpCisjZGVmaW5lIF9TU19QQUQxU0laRSAgICAoX1NTX0FMSUdOU0laRSAtIHNpemVvZih1X2NoYXIpICogMikKKyNkZWZpbmUgX1NTX1BBRDJTSVpFICAgIChfU1NfTUFYU0laRSAtIHNpemVvZih1X2NoYXIpICogMiAtIFwKKyAgICAgICAgICAgICAgICBfU1NfUEFEMVNJWkUgLSBfU1NfQUxJR05TSVpFKQogCiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSB7CiAjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQl1bnNpZ25lZCBjaGFyIHNzX2xlbjsJCS8qIGFkZHJlc3MgbGVuZ3RoICovCi0JdW5zaWduZWQgY2hhciBzc19mYW1pbHk7CS8qIGFkZHJlc3MgZmFtaWx5ICovCisgICAgdW5zaWduZWQgY2hhciBzc19sZW47ICAgICAgICAgICAgICAgLyogYWRkcmVzcyBsZW5ndGggKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNzX2ZhbWlseTsgICAgICAgICAgICAvKiBhZGRyZXNzIGZhbWlseSAqLwogI2Vsc2UKLQl1bnNpZ25lZCBzaG9ydCBzc19mYW1pbHk7CS8qIGFkZHJlc3MgZmFtaWx5ICovCisgICAgdW5zaWduZWQgc2hvcnQgc3NfZmFtaWx5OyAgICAgICAgICAgLyogYWRkcmVzcyBmYW1pbHkgKi8KICNlbmRpZiAvKiBIQVZFX1NPQ0tBRERSX1NBX0xFTiAqLwotCWNoYXIJX19zc19wYWQxW19TU19QQUQxU0laRV07CisgICAgY2hhciAgICAgICAgX19zc19wYWQxW19TU19QQUQxU0laRV07CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQlQWV9MT05HX0xPTkcgX19zc19hbGlnbjsJLyogZm9yY2UgZGVzaXJlZCBzdHJ1Y3R1cmUgc3RvcmFnZSBhbGlnbm1lbnQgKi8KKyAgICBQWV9MT05HX0xPTkcgX19zc19hbGlnbjsgICAgICAgICAgICAvKiBmb3JjZSBkZXNpcmVkIHN0cnVjdHVyZSBzdG9yYWdlIGFsaWdubWVudCAqLwogI2Vsc2UKLQlkb3VibGUgX19zc19hbGlnbjsJLyogZm9yY2UgZGVzaXJlZCBzdHJ1Y3R1cmUgc3RvcmFnZSBhbGlnbm1lbnQgKi8KKyAgICBkb3VibGUgX19zc19hbGlnbjsgICAgICAgICAgLyogZm9yY2UgZGVzaXJlZCBzdHJ1Y3R1cmUgc3RvcmFnZSBhbGlnbm1lbnQgKi8KICNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLwotCWNoYXIJX19zc19wYWQyW19TU19QQUQyU0laRV07CisgICAgY2hhciAgICAgICAgX19zc19wYWQyW19TU19QQUQyU0laRV07CiB9OwogI2VuZGlmIC8qICFIQVZFX1NPQ0tBRERSX1NUT1JBR0UgKi8KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hbG1vZHVsZS5jIGIvTW9kdWxlcy9hbG1vZHVsZS5jCmluZGV4IDkzZjI2YmQuLjY5MTE3NWUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYWxtb2R1bGUuYworKysgYi9Nb2R1bGVzL2FsbW9kdWxlLmMKQEAgLTEsNSArMSw1IEBACiAKLSNkZWZpbmUgT0xEX0lOVEVSRkFDRQkJLyogZGVmaW5lIGZvciBwcmUtSXJpeCA2IGludGVyZmFjZSAqLworI2RlZmluZSBPTERfSU5URVJGQUNFICAgICAgICAgICAvKiBkZWZpbmUgZm9yIHByZS1Jcml4IDYgaW50ZXJmYWNlICovCiAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJpbmdvYmplY3QuaCIKQEAgLTE5LDkgKzE5LDkgQEAKIC8qIERlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBvZiB0eXBlIHBvcnQgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQkvKiBYWFhYIEFkZCB5b3VyIG93biBzdHVmZiBoZXJlICovCi0JQUxwb3J0IHBvcnQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFhYWFggQWRkIHlvdXIgb3duIHN0dWZmIGhlcmUgKi8KKyAgICBBTHBvcnQgcG9ydDsKIH0gYWxwb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEFscHR5cGU7CkBAIC0zMyw5ICszMyw5IEBACiAvKiBEZWNsYXJhdGlvbnMgZm9yIG9iamVjdHMgb2YgdHlwZSBjb25maWcgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQkvKiBYWFhYIEFkZCB5b3VyIG93biBzdHVmZiBoZXJlICovCi0JQUxjb25maWcgY29uZmlnOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBYWFhYIEFkZCB5b3VyIG93biBzdHVmZiBoZXJlICovCisgICAgQUxjb25maWcgY29uZmlnOwogfSBhbGNvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQWxjdHlwZTsKQEAgLTQ0LDE5OSArNDQsMTk5IEBACiBzdGF0aWMgdm9pZAogRXJyb3JIYW5kbGVyKGxvbmcgY29kZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0JdmFfbGlzdCBhcmdzOwotCWNoYXIgYnVmWzEyOF07CisgICAgdmFfbGlzdCBhcmdzOworICAgIGNoYXIgYnVmWzEyOF07CiAKLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCXZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0JUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCBidWYpOworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsIGJ1Zik7CiB9CiAKLSNpZmRlZiBBTF9OT19FTEVNCQkvKiBJUklYIDYgKi8KKyNpZmRlZiBBTF9OT19FTEVNICAgICAgICAgICAgICAgLyogSVJJWCA2ICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwYXJhbTJweXRob24oaW50IHJlc291cmNlLCBpbnQgcGFyYW0sIEFMdmFsdWUgdmFsdWUsIEFMcGFyYW1JbmZvICpwaW5mbykKIHsKLQlBTHBhcmFtSW5mbyBpbmZvOworICAgIEFMcGFyYW1JbmZvIGluZm87CiAKLQlpZiAocGluZm8gPT0gTlVMTCkgewotCQlwaW5mbyA9ICZpbmZvOwotCQlpZiAoYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UsIHBhcmFtLCAmaW5mbykgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN3aXRjaCAocGluZm8tPmVsZW1lbnRUeXBlKSB7Ci0JY2FzZSBBTF9QVFJfRUxFTToKLQkJLyogWFhYWCBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhpcyAqLwotCWNhc2UgQUxfTk9fRUxFTToKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQljYXNlIEFMX0lOVDMyX0VMRU06Ci0JY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgotCWNhc2UgQUxfRU5VTV9FTEVNOgotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlLmkpOwotCWNhc2UgQUxfSU5UNjRfRUxFTToKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsdWUubGwpOwotCWNhc2UgQUxfRklYRURfRUxFTToKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhbEZpeGVkVG9Eb3VibGUodmFsdWUubGwpKTsKLQljYXNlIEFMX0NIQVJfRUxFTToKLQkJaWYgKHZhbHVlLnB0ciA9PSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygoY2hhciAqKSB2YWx1ZS5wdHIpOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgInVua25vd24gZWxlbWVudCB0eXBlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocGluZm8gPT0gTlVMTCkgeworICAgICAgICBwaW5mbyA9ICZpbmZvOworICAgICAgICBpZiAoYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UsIHBhcmFtLCAmaW5mbykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN3aXRjaCAocGluZm8tPmVsZW1lbnRUeXBlKSB7CisgICAgY2FzZSBBTF9QVFJfRUxFTToKKyAgICAgICAgLyogWFhYWCBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhpcyAqLworICAgIGNhc2UgQUxfTk9fRUxFTToKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBjYXNlIEFMX0lOVDMyX0VMRU06CisgICAgY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgorICAgIGNhc2UgQUxfRU5VTV9FTEVNOgorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlLmkpOworICAgIGNhc2UgQUxfSU5UNjRfRUxFTToKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsdWUubGwpOworICAgIGNhc2UgQUxfRklYRURfRUxFTToKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhbEZpeGVkVG9Eb3VibGUodmFsdWUubGwpKTsKKyAgICBjYXNlIEFMX0NIQVJfRUxFTToKKyAgICAgICAgaWYgKHZhbHVlLnB0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygoY2hhciAqKSB2YWx1ZS5wdHIpOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgInVua25vd24gZWxlbWVudCB0eXBlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIGludAogcHl0aG9uMmVsZW0oUHlPYmplY3QgKml0ZW0sIHZvaWQgKnB0ciwgaW50IGVsZW1lbnRUeXBlKQogewotCXN3aXRjaCAoZWxlbWVudFR5cGUpIHsKLQljYXNlIEFMX0lOVDMyX0VMRU06Ci0JY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgotCWNhc2UgQUxfRU5VTV9FTEVNOgotCQlpZiAoIVB5SW50X0NoZWNrKGl0ZW0pKSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCSooKGludCAqKSBwdHIpID0gUHlJbnRfQXNMb25nKGl0ZW0pOwotCQlicmVhazsKLQljYXNlIEFMX0lOVDY0X0VMRU06Ci0JCWlmIChQeUludF9DaGVjayhpdGVtKSkKLQkJCSooKGxvbmcgbG9uZyAqKSBwdHIpID0gUHlJbnRfQXNMb25nKGl0ZW0pOwotCQllbHNlIGlmIChQeUxvbmdfQ2hlY2soaXRlbSkpCi0JCQkqKChsb25nIGxvbmcgKikgcHRyKSA9IFB5TG9uZ19Bc0xvbmdMb25nKGl0ZW0pOwotCQllbHNlIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBTF9GSVhFRF9FTEVNOgotCQlpZiAoUHlJbnRfQ2hlY2soaXRlbSkpCi0JCQkqKChsb25nIGxvbmcgKikgcHRyKSA9IGFsRG91YmxlVG9GaXhlZCgoZG91YmxlKSBQeUludF9Bc0xvbmcoaXRlbSkpOwotCQllbHNlIGlmIChQeUZsb2F0X0NoZWNrKGl0ZW0pKQotCQkJKigobG9uZyBsb25nICopIHB0cikgPSBhbERvdWJsZVRvRml4ZWQoUHlGbG9hdF9Bc0RvdWJsZShpdGVtKSk7Ci0JCWVsc2UgewotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJ1bmtub3duIGVsZW1lbnQgdHlwZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIHN3aXRjaCAoZWxlbWVudFR5cGUpIHsKKyAgICBjYXNlIEFMX0lOVDMyX0VMRU06CisgICAgY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgorICAgIGNhc2UgQUxfRU5VTV9FTEVNOgorICAgICAgICBpZiAoIVB5SW50X0NoZWNrKGl0ZW0pKSB7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgICooKGludCAqKSBwdHIpID0gUHlJbnRfQXNMb25nKGl0ZW0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFMX0lOVDY0X0VMRU06CisgICAgICAgIGlmIChQeUludF9DaGVjayhpdGVtKSkKKyAgICAgICAgICAgICooKGxvbmcgbG9uZyAqKSBwdHIpID0gUHlJbnRfQXNMb25nKGl0ZW0pOworICAgICAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soaXRlbSkpCisgICAgICAgICAgICAqKChsb25nIGxvbmcgKikgcHRyKSA9IFB5TG9uZ19Bc0xvbmdMb25nKGl0ZW0pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTF9GSVhFRF9FTEVNOgorICAgICAgICBpZiAoUHlJbnRfQ2hlY2soaXRlbSkpCisgICAgICAgICAgICAqKChsb25nIGxvbmcgKikgcHRyKSA9IGFsRG91YmxlVG9GaXhlZCgoZG91YmxlKSBQeUludF9Bc0xvbmcoaXRlbSkpOworICAgICAgICBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKGl0ZW0pKQorICAgICAgICAgICAgKigobG9uZyBsb25nICopIHB0cikgPSBhbERvdWJsZVRvRml4ZWQoUHlGbG9hdF9Bc0RvdWJsZShpdGVtKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJ1bmtub3duIGVsZW1lbnQgdHlwZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBweXRob24ycGFyYW0oaW50IHJlc291cmNlLCBBTHB2ICpwYXJhbSwgUHlPYmplY3QgKnZhbHVlLCBBTHBhcmFtSW5mbyAqcGluZm8pCiB7Ci0JQUxwYXJhbUluZm8gaW5mbzsKLQlpbnQgaSwgc3RlcHNpemU7Ci0JUHlPYmplY3QgKml0ZW07CisgICAgQUxwYXJhbUluZm8gaW5mbzsKKyAgICBpbnQgaSwgc3RlcHNpemU7CisgICAgUHlPYmplY3QgKml0ZW07CiAKLQlpZiAocGluZm8gPT0gTlVMTCkgewotCQlwaW5mbyA9ICZpbmZvOwotCQlpZiAoYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UsIHBhcmFtLT5wYXJhbSwgJmluZm8pIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0Jc3dpdGNoIChwaW5mby0+dmFsdWVUeXBlKSB7Ci0JY2FzZSBBTF9TVFJJTkdfVkFMOgotCQlpZiAocGluZm8tPmVsZW1lbnRUeXBlICE9IEFMX0NIQVJfRUxFTSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAidW5rbm93biBlbGVtZW50IHR5cGUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlwYXJhbS0+dmFsdWUucHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKTsKLQkJcGFyYW0tPnNpemVJbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKSsxOyAvKmFjY291bnQgZm9yIE5VTCovCi0JCWJyZWFrOwotCWNhc2UgQUxfU0VUX1ZBTDoKLQljYXNlIEFMX1ZFQ1RPUl9WQUw6Ci0JCWlmICghUHlMaXN0X0NoZWNrKHZhbHVlKSAmJiAhUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc3dpdGNoIChwaW5mby0+ZWxlbWVudFR5cGUpIHsKLQkJY2FzZSBBTF9JTlQzMl9FTEVNOgotCQljYXNlIEFMX1JFU09VUkNFX0VMRU06Ci0JCWNhc2UgQUxfRU5VTV9FTEVNOgotCQkJcGFyYW0tPnNpemVJbiA9IFB5U2VxdWVuY2VfU2l6ZSh2YWx1ZSk7Ci0JCQlwYXJhbS0+dmFsdWUucHRyID0gUHlNZW1fTkVXKGludCwgcGFyYW0tPnNpemVJbik7Ci0JCQlzdGVwc2l6ZSA9IHNpemVvZihpbnQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUxfSU5UNjRfRUxFTToKLQkJY2FzZSBBTF9GSVhFRF9FTEVNOgotCQkJcGFyYW0tPnNpemVJbiA9IFB5U2VxdWVuY2VfU2l6ZSh2YWx1ZSk7Ci0JCQlwYXJhbS0+dmFsdWUucHRyID0gUHlNZW1fTkVXKGxvbmcgbG9uZywgcGFyYW0tPnNpemVJbik7Ci0JCQlzdGVwc2l6ZSA9IHNpemVvZihsb25nIGxvbmcpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IHBhcmFtLT5zaXplSW47IGkrKykgewotCQkJaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbSh2YWx1ZSwgaSk7Ci0JCQlpZiAocHl0aG9uMmVsZW0oaXRlbSwgKHZvaWQgKikgKChjaGFyICopIHBhcmFtLT52YWx1ZS5wdHIgKyBpKnN0ZXBzaXplKSwgcGluZm8tPmVsZW1lbnRUeXBlKSA8IDApIHsKLQkJCQlQeU1lbV9ERUwocGFyYW0tPnZhbHVlLnB0cik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQUxfU0NBTEFSX1ZBTDoKLQkJc3dpdGNoIChwaW5mby0+ZWxlbWVudFR5cGUpIHsKLQkJY2FzZSBBTF9JTlQzMl9FTEVNOgotCQljYXNlIEFMX1JFU09VUkNFX0VMRU06Ci0JCWNhc2UgQUxfRU5VTV9FTEVNOgotCQkJcmV0dXJuIHB5dGhvbjJlbGVtKHZhbHVlLCAodm9pZCAqKSAmcGFyYW0tPnZhbHVlLmksCi0JCQkJCSAgIHBpbmZvLT5lbGVtZW50VHlwZSk7Ci0JCWNhc2UgQUxfSU5UNjRfRUxFTToKLQkJY2FzZSBBTF9GSVhFRF9FTEVNOgotCQkJcmV0dXJuIHB5dGhvbjJlbGVtKHZhbHVlLCAodm9pZCAqKSAmcGFyYW0tPnZhbHVlLmxsLAotCQkJCQkgICBwaW5mby0+ZWxlbWVudFR5cGUpOwotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAidW5rbm93biBlbGVtZW50IHR5cGUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAocGluZm8gPT0gTlVMTCkgeworICAgICAgICBwaW5mbyA9ICZpbmZvOworICAgICAgICBpZiAoYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UsIHBhcmFtLT5wYXJhbSwgJmluZm8pIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3dpdGNoIChwaW5mby0+dmFsdWVUeXBlKSB7CisgICAgY2FzZSBBTF9TVFJJTkdfVkFMOgorICAgICAgICBpZiAocGluZm8tPmVsZW1lbnRUeXBlICE9IEFMX0NIQVJfRUxFTSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAidW5rbm93biBlbGVtZW50IHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBwYXJhbS0+dmFsdWUucHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKTsKKyAgICAgICAgcGFyYW0tPnNpemVJbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKSsxOyAvKmFjY291bnQgZm9yIE5VTCovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUxfU0VUX1ZBTDoKKyAgICBjYXNlIEFMX1ZFQ1RPUl9WQUw6CisgICAgICAgIGlmICghUHlMaXN0X0NoZWNrKHZhbHVlKSAmJiAhUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChwaW5mby0+ZWxlbWVudFR5cGUpIHsKKyAgICAgICAgY2FzZSBBTF9JTlQzMl9FTEVNOgorICAgICAgICBjYXNlIEFMX1JFU09VUkNFX0VMRU06CisgICAgICAgIGNhc2UgQUxfRU5VTV9FTEVNOgorICAgICAgICAgICAgcGFyYW0tPnNpemVJbiA9IFB5U2VxdWVuY2VfU2l6ZSh2YWx1ZSk7CisgICAgICAgICAgICBwYXJhbS0+dmFsdWUucHRyID0gUHlNZW1fTkVXKGludCwgcGFyYW0tPnNpemVJbik7CisgICAgICAgICAgICBzdGVwc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxfSU5UNjRfRUxFTToKKyAgICAgICAgY2FzZSBBTF9GSVhFRF9FTEVNOgorICAgICAgICAgICAgcGFyYW0tPnNpemVJbiA9IFB5U2VxdWVuY2VfU2l6ZSh2YWx1ZSk7CisgICAgICAgICAgICBwYXJhbS0+dmFsdWUucHRyID0gUHlNZW1fTkVXKGxvbmcgbG9uZywgcGFyYW0tPnNpemVJbik7CisgICAgICAgICAgICBzdGVwc2l6ZSA9IHNpemVvZihsb25nIGxvbmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtLT5zaXplSW47IGkrKykgeworICAgICAgICAgICAgaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbSh2YWx1ZSwgaSk7CisgICAgICAgICAgICBpZiAocHl0aG9uMmVsZW0oaXRlbSwgKHZvaWQgKikgKChjaGFyICopIHBhcmFtLT52YWx1ZS5wdHIgKyBpKnN0ZXBzaXplKSwgcGluZm8tPmVsZW1lbnRUeXBlKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeU1lbV9ERUwocGFyYW0tPnZhbHVlLnB0cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUxfU0NBTEFSX1ZBTDoKKyAgICAgICAgc3dpdGNoIChwaW5mby0+ZWxlbWVudFR5cGUpIHsKKyAgICAgICAgY2FzZSBBTF9JTlQzMl9FTEVNOgorICAgICAgICBjYXNlIEFMX1JFU09VUkNFX0VMRU06CisgICAgICAgIGNhc2UgQUxfRU5VTV9FTEVNOgorICAgICAgICAgICAgcmV0dXJuIHB5dGhvbjJlbGVtKHZhbHVlLCAodm9pZCAqKSAmcGFyYW0tPnZhbHVlLmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluZm8tPmVsZW1lbnRUeXBlKTsKKyAgICAgICAgY2FzZSBBTF9JTlQ2NF9FTEVNOgorICAgICAgICBjYXNlIEFMX0ZJWEVEX0VMRU06CisgICAgICAgICAgICByZXR1cm4gcHl0aG9uMmVsZW0odmFsdWUsICh2b2lkICopICZwYXJhbS0+dmFsdWUubGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluZm8tPmVsZW1lbnRUeXBlKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgInVua25vd24gZWxlbWVudCB0eXBlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHB5dGhvbjJwYXJhbXMoaW50IHJlc291cmNlMSwgaW50IHJlc291cmNlMiwgUHlPYmplY3QgKmxpc3QsIEFMcHYgKipwdnNwLCBBTHBhcmFtSW5mbyAqKnBpbmZvcCkKIHsKLQlQeU9iamVjdCAqaXRlbTsKLQlBTHB2ICpwdnM7Ci0JQUxwYXJhbUluZm8gKnBpbmZvOwotCWludCBucHZzLCBpOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIEFMcHYgKnB2czsKKyAgICBBTHBhcmFtSW5mbyAqcGluZm87CisgICAgaW50IG5wdnMsIGk7CiAKLQlucHZzID0gUHlMaXN0X1NpemUobGlzdCk7Ci0JcHZzID0gUHlNZW1fTkVXKEFMcHYsIG5wdnMpOwotCXBpbmZvID0gUHlNZW1fTkVXKEFMcGFyYW1JbmZvLCBucHZzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnB2czsgaSsrKSB7Ci0JCWl0ZW0gPSBQeUxpc3RfR2V0SXRlbShsaXN0LCBpKTsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGl0ZW0sICJpTyIsICZwdnNbaV0ucGFyYW0sICZpdGVtKSkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmIChhbEdldFBhcmFtSW5mbyhyZXNvdXJjZTEsIHB2c1tpXS5wYXJhbSwgJnBpbmZvW2ldKSA8IDAgJiYKLQkJICAgIGFsR2V0UGFyYW1JbmZvKHJlc291cmNlMiwgcHZzW2ldLnBhcmFtLCAmcGluZm9baV0pIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmIChweXRob24ycGFyYW0ocmVzb3VyY2UxLCAmcHZzW2ldLCBpdGVtLCAmcGluZm9baV0pIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIG5wdnMgPSBQeUxpc3RfU2l6ZShsaXN0KTsKKyAgICBwdnMgPSBQeU1lbV9ORVcoQUxwdiwgbnB2cyk7CisgICAgcGluZm8gPSBQeU1lbV9ORVcoQUxwYXJhbUluZm8sIG5wdnMpOworICAgIGZvciAoaSA9IDA7IGkgPCBucHZzOyBpKyspIHsKKyAgICAgICAgaXRlbSA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoaXRlbSwgImlPIiwgJnB2c1tpXS5wYXJhbSwgJml0ZW0pKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGFsR2V0UGFyYW1JbmZvKHJlc291cmNlMSwgcHZzW2ldLnBhcmFtLCAmcGluZm9baV0pIDwgMCAmJgorICAgICAgICAgICAgYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UyLCBwdnNbaV0ucGFyYW0sICZwaW5mb1tpXSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKHB5dGhvbjJwYXJhbShyZXNvdXJjZTEsICZwdnNbaV0sIGl0ZW0sICZwaW5mb1tpXSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkqcHZzcCA9IHB2czsKLQkqcGluZm9wID0gcGluZm87Ci0JcmV0dXJuIG5wdnM7CisgICAgKnB2c3AgPSBwdnM7CisgICAgKnBpbmZvcCA9IHBpbmZvOworICAgIHJldHVybiBucHZzOwogCiAgIGVycm9yOgotCS8qIFhYWFggd2Ugc2hvdWxkIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgKi8KLQlpZiAocHZzKQotCQlQeU1lbV9ERUwocHZzKTsKLQlpZiAocGluZm8pCi0JCVB5TWVtX0RFTChwaW5mbyk7Ci0JcmV0dXJuIC0xOworICAgIC8qIFhYWFggd2Ugc2hvdWxkIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAocHZzKQorICAgICAgICBQeU1lbV9ERUwocHZzKTsKKyAgICBpZiAocGluZm8pCisgICAgICAgIFB5TWVtX0RFTChwaW5mbyk7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjQ1LDMwICsyNDUsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBTZXRDb25maWcoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50ICgqZnVuYykoQUxjb25maWcsIGludCkpCiB7Ci0JaW50IHBhcjsKKyAgICBpbnQgcGFyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOlNldENvbmZpZyIsICZwYXIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6U2V0Q29uZmlnIiwgJnBhcikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCgqZnVuYykoc2VsZi0+Y29uZmlnLCBwYXIpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKCpmdW5jKShzZWxmLT5jb25maWcsIHBhcikgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEdldENvbmZpZyhhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgKCpmdW5jKShBTGNvbmZpZykpCi17CQotCWludCBwYXI7Cit7CisgICAgaW50IHBhcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldENvbmZpZyIpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiAoKHBhciA9ICgqZnVuYykoc2VsZi0+Y29uZmlnKSkgPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldENvbmZpZyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcGFyKTsKKyAgICBpZiAoKHBhciA9ICgqZnVuYykoc2VsZi0+Y29uZmlnKSkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBwYXIpOwogfQogCiBQeURvY19TVFJWQVIoYWxjX1NldFdpZHRoX19kb2NfXywKQEAgLTI3Nyw3ICsyNzcsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19TZXRXaWR0aChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBTZXRDb25maWcoc2VsZiwgYXJncywgYWxTZXRXaWR0aCk7CisgICAgcmV0dXJuIFNldENvbmZpZyhzZWxmLCBhcmdzLCBhbFNldFdpZHRoKTsKIH0KIAogCkBAIC0yODcsNyArMjg3LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfR2V0V2lkdGgoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gR2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsR2V0V2lkdGgpOworICAgIHJldHVybiBHZXRDb25maWcoc2VsZiwgYXJncywgYWxHZXRXaWR0aCk7CiB9CiAKIApAQCAtMjk4LDcgKzI5OCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX1NldFNhbXBGbXQoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gU2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsU2V0U2FtcEZtdCk7CisgICAgcmV0dXJuIFNldENvbmZpZyhzZWxmLCBhcmdzLCBhbFNldFNhbXBGbXQpOwogfQogCiAKQEAgLTMwOSw3ICszMDksNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19HZXRTYW1wRm10KGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIEdldENvbmZpZyhzZWxmLCBhcmdzLCBhbEdldFNhbXBGbXQpOworICAgIHJldHVybiBHZXRDb25maWcoc2VsZiwgYXJncywgYWxHZXRTYW1wRm10KTsKIH0KIAogCkBAIC0zMTksNyArMzE5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfU2V0Q2hhbm5lbHMoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gU2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsU2V0Q2hhbm5lbHMpOworICAgIHJldHVybiBTZXRDb25maWcoc2VsZiwgYXJncywgYWxTZXRDaGFubmVscyk7CiB9CiAKIApAQCAtMzI5LDcgKzMyOSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX0dldENoYW5uZWxzKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIEdldENvbmZpZyhzZWxmLCBhcmdzLCBhbEdldENoYW5uZWxzKTsKKyAgICByZXR1cm4gR2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsR2V0Q2hhbm5lbHMpOwogfQogCiAKQEAgLTMzOSwxNCArMzM5LDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX1NldEZsb2F0TWF4KGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIG1heGltdW1fdmFsdWU7CisgICAgZG91YmxlIG1heGltdW1fdmFsdWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6U2V0RmxvYXRNYXgiLCAmbWF4aW11bV92YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChhbFNldEZsb2F0TWF4KHNlbGYtPmNvbmZpZywgbWF4aW11bV92YWx1ZSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkOlNldEZsb2F0TWF4IiwgJm1heGltdW1fdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYWxTZXRGbG9hdE1heChzZWxmLT5jb25maWcsIG1heGltdW1fdmFsdWUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTM1NiwxMyArMzU2LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX0dldEZsb2F0TWF4KGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIG1heGltdW1fdmFsdWU7CisgICAgZG91YmxlIG1heGltdW1fdmFsdWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGbG9hdE1heCIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKG1heGltdW1fdmFsdWUgPSBhbEdldEZsb2F0TWF4KHNlbGYtPmNvbmZpZykpID09IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUobWF4aW11bV92YWx1ZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmxvYXRNYXgiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChtYXhpbXVtX3ZhbHVlID0gYWxHZXRGbG9hdE1heChzZWxmLT5jb25maWcpKSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKG1heGltdW1fdmFsdWUpOwogfQogCiAKQEAgLTM3Miw3ICszNzIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19TZXREZXZpY2UoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gU2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsU2V0RGV2aWNlKTsKKyAgICByZXR1cm4gU2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsU2V0RGV2aWNlKTsKIH0KIAogCkBAIC0zODIsNyArMzgyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfR2V0RGV2aWNlKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIEdldENvbmZpZyhzZWxmLCBhcmdzLCBhbEdldERldmljZSk7CisgICAgcmV0dXJuIEdldENvbmZpZyhzZWxmLCBhcmdzLCBhbEdldERldmljZSk7CiB9CiAKIApAQCAtMzkyLDcgKzM5Miw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX1NldFF1ZXVlU2l6ZShhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBTZXRDb25maWcoc2VsZiwgYXJncywgYWxTZXRRdWV1ZVNpemUpOworICAgIHJldHVybiBTZXRDb25maWcoc2VsZiwgYXJncywgYWxTZXRRdWV1ZVNpemUpOwogfQogCiAKQEAgLTQwMiw3ICs0MDIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19HZXRRdWV1ZVNpemUoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gR2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsR2V0UXVldWVTaXplKTsKKyAgICByZXR1cm4gR2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsR2V0UXVldWVTaXplKTsKIH0KIAogI2VuZGlmIC8qIEFMX05PX0VMRU0gKi8KQEAgLTQxMCw2NiArNDEwLDY2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0Y29uZmlnKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCAoKmZ1bmMpKEFMY29uZmlnLCBsb25nKSkKIHsKLQlsb25nIHBhcjsKKyAgICBsb25nIHBhcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpTZXRDb25maWciLCAmcGFyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOlNldENvbmZpZyIsICZwYXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgoKmZ1bmMpKHNlbGYtPmNvbmZpZywgcGFyKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCgqZnVuYykoc2VsZi0+Y29uZmlnLCBwYXIpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRjb25maWcoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgbG9uZyAoKmZ1bmMpKEFMY29uZmlnKSkKLXsJCi0JbG9uZyBwYXI7Cit7CisgICAgbG9uZyBwYXI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRDb25maWciKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYgKChwYXIgPSAoKmZ1bmMpKHNlbGYtPmNvbmZpZykpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRDb25maWciKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBhcik7CisgICAgaWYgKChwYXIgPSAoKmZ1bmMpKHNlbGYtPmNvbmZpZykpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcGFyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19zZXRxdWV1ZXNpemUgKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHNldGNvbmZpZyhzZWxmLCBhcmdzLCBBTHNldHF1ZXVlc2l6ZSk7CisgICAgcmV0dXJuIHNldGNvbmZpZyhzZWxmLCBhcmdzLCBBTHNldHF1ZXVlc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfZ2V0cXVldWVzaXplIChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZXRjb25maWcoc2VsZiwgYXJncywgQUxnZXRxdWV1ZXNpemUpOworICAgIHJldHVybiBnZXRjb25maWcoc2VsZiwgYXJncywgQUxnZXRxdWV1ZXNpemUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX3NldHdpZHRoIChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzZXRjb25maWcoc2VsZiwgYXJncywgQUxzZXR3aWR0aCk7CisgICAgcmV0dXJuIHNldGNvbmZpZyhzZWxmLCBhcmdzLCBBTHNldHdpZHRoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19nZXR3aWR0aCAoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMZ2V0d2lkdGgpOwkKKyAgICByZXR1cm4gZ2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMZ2V0d2lkdGgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX2dldGNoYW5uZWxzIChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZXRjb25maWcoc2VsZiwgYXJncywgQUxnZXRjaGFubmVscyk7CQorICAgIHJldHVybiBnZXRjb25maWcoc2VsZiwgYXJncywgQUxnZXRjaGFubmVscyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfc2V0Y2hhbm5lbHMgKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHNldGNvbmZpZyhzZWxmLCBhcmdzLCBBTHNldGNoYW5uZWxzKTsKKyAgICByZXR1cm4gc2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMc2V0Y2hhbm5lbHMpOwogfQogCiAjaWZkZWYgQUxfNDA1CkBAIC00NzcsNzAgKzQ3Nyw3MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19nZXRzYW1wZm10IChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZXRjb25maWcoc2VsZiwgYXJncywgQUxnZXRzYW1wZm10KTsJCisgICAgcmV0dXJuIGdldGNvbmZpZyhzZWxmLCBhcmdzLCBBTGdldHNhbXBmbXQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX3NldHNhbXBmbXQgKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHNldGNvbmZpZyhzZWxmLCBhcmdzLCBBTHNldHNhbXBmbXQpOworICAgIHJldHVybiBzZXRjb25maWcoc2VsZiwgYXJncywgQUxzZXRzYW1wZm10KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19nZXRmbG9hdG1heChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSBhcmc7CisgICAgZG91YmxlIGFyZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZsb2F0TWF4IikpCi0JCXJldHVybiAwOwotCWlmICgoYXJnID0gQUxnZXRmbG9hdG1heChzZWxmLT5jb25maWcpKSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGFyZyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmxvYXRNYXgiKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKChhcmcgPSBBTGdldGZsb2F0bWF4KHNlbGYtPmNvbmZpZykpID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYXJnKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19zZXRmbG9hdG1heChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSBhcmc7CisgICAgZG91YmxlIGFyZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZDpTZXRGbG9hdE1heCIsICZhcmcpKQotCQlyZXR1cm4gMDsKLQlpZiAoQUxzZXRmbG9hdG1heChzZWxmLT5jb25maWcsIGFyZykgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6U2V0RmxvYXRNYXgiLCAmYXJnKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKEFMc2V0ZmxvYXRtYXgoc2VsZi0+Y29uZmlnLCBhcmcpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYgLyogQUxfNDA1ICovCi0JCisKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgYWxjX21ldGhvZHNbXSA9IHsKLSNpZmRlZiBBTF9OT19FTEVNCQkvKiBJUklYIDYgKi8KLQl7IlNldFdpZHRoIiwJKFB5Q0Z1bmN0aW9uKWFsY19TZXRXaWR0aCwJTUVUSF9WQVJBUkdTLAlhbGNfU2V0V2lkdGhfX2RvY19ffSwKLQl7IkdldFdpZHRoIiwJKFB5Q0Z1bmN0aW9uKWFsY19HZXRXaWR0aCwJTUVUSF9WQVJBUkdTLAlhbGNfR2V0V2lkdGhfX2RvY19ffSwKLQl7IlNldFNhbXBGbXQiLAkoUHlDRnVuY3Rpb24pYWxjX1NldFNhbXBGbXQsCU1FVEhfVkFSQVJHUywJYWxjX1NldFNhbXBGbXRfX2RvY19ffSwKLQl7IkdldFNhbXBGbXQiLAkoUHlDRnVuY3Rpb24pYWxjX0dldFNhbXBGbXQsCU1FVEhfVkFSQVJHUywJYWxjX0dldFNhbXBGbXRfX2RvY19ffSwKLQl7IlNldENoYW5uZWxzIiwJKFB5Q0Z1bmN0aW9uKWFsY19TZXRDaGFubmVscywJTUVUSF9WQVJBUkdTLAlhbGNfU2V0Q2hhbm5lbHNfX2RvY19ffSwKLQl7IkdldENoYW5uZWxzIiwJKFB5Q0Z1bmN0aW9uKWFsY19HZXRDaGFubmVscywJTUVUSF9WQVJBUkdTLAlhbGNfR2V0Q2hhbm5lbHNfX2RvY19ffSwKLQl7IlNldEZsb2F0TWF4IiwJKFB5Q0Z1bmN0aW9uKWFsY19TZXRGbG9hdE1heCwJTUVUSF9WQVJBUkdTLAlhbGNfU2V0RmxvYXRNYXhfX2RvY19ffSwKLQl7IkdldEZsb2F0TWF4IiwJKFB5Q0Z1bmN0aW9uKWFsY19HZXRGbG9hdE1heCwJTUVUSF9WQVJBUkdTLAlhbGNfR2V0RmxvYXRNYXhfX2RvY19ffSwKLQl7IlNldERldmljZSIsCShQeUNGdW5jdGlvbilhbGNfU2V0RGV2aWNlLAlNRVRIX1ZBUkFSR1MsCWFsY19TZXREZXZpY2VfX2RvY19ffSwKLQl7IkdldERldmljZSIsCShQeUNGdW5jdGlvbilhbGNfR2V0RGV2aWNlLAlNRVRIX1ZBUkFSR1MsCWFsY19HZXREZXZpY2VfX2RvY19ffSwKLQl7IlNldFF1ZXVlU2l6ZSIsCShQeUNGdW5jdGlvbilhbGNfU2V0UXVldWVTaXplLAlNRVRIX1ZBUkFSR1MsCWFsY19TZXRRdWV1ZVNpemVfX2RvY19ffSwKLQl7IkdldFF1ZXVlU2l6ZSIsCShQeUNGdW5jdGlvbilhbGNfR2V0UXVldWVTaXplLAlNRVRIX1ZBUkFSR1MsCWFsY19HZXRRdWV1ZVNpemVfX2RvY19ffSwKKyNpZmRlZiBBTF9OT19FTEVNICAgICAgICAgICAgICAgLyogSVJJWCA2ICovCisgICAgeyJTZXRXaWR0aCIsICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX1NldFdpZHRoLCAgICAgIE1FVEhfVkFSQVJHUywgICBhbGNfU2V0V2lkdGhfX2RvY19ffSwKKyAgICB7IkdldFdpZHRoIiwgICAgICAgIChQeUNGdW5jdGlvbilhbGNfR2V0V2lkdGgsICAgICAgTUVUSF9WQVJBUkdTLCAgIGFsY19HZXRXaWR0aF9fZG9jX199LAorICAgIHsiU2V0U2FtcEZtdCIsICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19TZXRTYW1wRm10LCAgICBNRVRIX1ZBUkFSR1MsICAgYWxjX1NldFNhbXBGbXRfX2RvY19ffSwKKyAgICB7IkdldFNhbXBGbXQiLCAgICAgIChQeUNGdW5jdGlvbilhbGNfR2V0U2FtcEZtdCwgICAgTUVUSF9WQVJBUkdTLCAgIGFsY19HZXRTYW1wRm10X19kb2NfX30sCisgICAgeyJTZXRDaGFubmVscyIsICAgICAoUHlDRnVuY3Rpb24pYWxjX1NldENoYW5uZWxzLCAgIE1FVEhfVkFSQVJHUywgICBhbGNfU2V0Q2hhbm5lbHNfX2RvY19ffSwKKyAgICB7IkdldENoYW5uZWxzIiwgICAgIChQeUNGdW5jdGlvbilhbGNfR2V0Q2hhbm5lbHMsICAgTUVUSF9WQVJBUkdTLCAgIGFsY19HZXRDaGFubmVsc19fZG9jX199LAorICAgIHsiU2V0RmxvYXRNYXgiLCAgICAgKFB5Q0Z1bmN0aW9uKWFsY19TZXRGbG9hdE1heCwgICBNRVRIX1ZBUkFSR1MsICAgYWxjX1NldEZsb2F0TWF4X19kb2NfX30sCisgICAgeyJHZXRGbG9hdE1heCIsICAgICAoUHlDRnVuY3Rpb24pYWxjX0dldEZsb2F0TWF4LCAgIE1FVEhfVkFSQVJHUywgICBhbGNfR2V0RmxvYXRNYXhfX2RvY19ffSwKKyAgICB7IlNldERldmljZSIsICAgICAgIChQeUNGdW5jdGlvbilhbGNfU2V0RGV2aWNlLCAgICAgTUVUSF9WQVJBUkdTLCAgIGFsY19TZXREZXZpY2VfX2RvY19ffSwKKyAgICB7IkdldERldmljZSIsICAgICAgIChQeUNGdW5jdGlvbilhbGNfR2V0RGV2aWNlLCAgICAgTUVUSF9WQVJBUkdTLCAgIGFsY19HZXREZXZpY2VfX2RvY19ffSwKKyAgICB7IlNldFF1ZXVlU2l6ZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19TZXRRdWV1ZVNpemUsICBNRVRIX1ZBUkFSR1MsICAgYWxjX1NldFF1ZXVlU2l6ZV9fZG9jX199LAorICAgIHsiR2V0UXVldWVTaXplIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX0dldFF1ZXVlU2l6ZSwgIE1FVEhfVkFSQVJHUywgICBhbGNfR2V0UXVldWVTaXplX19kb2NfX30sCiAjZW5kaWYgLyogQUxfTk9fRUxFTSAqLwotCXsiZ2V0cXVldWVzaXplIiwJKFB5Q0Z1bmN0aW9uKWFsY19nZXRxdWV1ZXNpemUsCU1FVEhfVkFSQVJHU30sCi0JeyJzZXRxdWV1ZXNpemUiLAkoUHlDRnVuY3Rpb24pYWxjX3NldHF1ZXVlc2l6ZSwJTUVUSF9WQVJBUkdTfSwKLQl7ImdldHdpZHRoIiwJCShQeUNGdW5jdGlvbilhbGNfZ2V0d2lkdGgsCU1FVEhfVkFSQVJHU30sCi0JeyJzZXR3aWR0aCIsCQkoUHlDRnVuY3Rpb24pYWxjX3NldHdpZHRoLAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0Y2hhbm5lbHMiLAkJKFB5Q0Z1bmN0aW9uKWFsY19nZXRjaGFubmVscywJTUVUSF9WQVJBUkdTfSwKLQl7InNldGNoYW5uZWxzIiwJCShQeUNGdW5jdGlvbilhbGNfc2V0Y2hhbm5lbHMsCU1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRxdWV1ZXNpemUiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfZ2V0cXVldWVzaXplLCAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldHF1ZXVlc2l6ZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19zZXRxdWV1ZXNpemUsICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0d2lkdGgiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX2dldHdpZHRoLCAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXR3aWR0aCIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfc2V0d2lkdGgsICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGNoYW5uZWxzIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19nZXRjaGFubmVscywgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0Y2hhbm5lbHMiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX3NldGNoYW5uZWxzLCAgIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgQUxfNDA1Ci0JeyJnZXRzYW1wZm10IiwJCShQeUNGdW5jdGlvbilhbGNfZ2V0c2FtcGZtdCwJTUVUSF9WQVJBUkdTfSwKLQl7InNldHNhbXBmbXQiLAkJKFB5Q0Z1bmN0aW9uKWFsY19zZXRzYW1wZm10LAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0ZmxvYXRtYXgiLAkJKFB5Q0Z1bmN0aW9uKWFsY19nZXRmbG9hdG1heCwJTUVUSF9WQVJBUkdTfSwKLQl7InNldGZsb2F0bWF4IiwJCShQeUNGdW5jdGlvbilhbGNfc2V0ZmxvYXRtYXgsCU1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRzYW1wZm10IiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfZ2V0c2FtcGZtdCwgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldHNhbXBmbXQiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19zZXRzYW1wZm10LCAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0ZmxvYXRtYXgiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX2dldGZsb2F0bWF4LCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRmbG9hdG1heCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfc2V0ZmxvYXRtYXgsICAgTUVUSF9WQVJBUkdTfSwKICNlbmRpZiAvKiBBTF80MDUgKi8KIAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0gKi8KQEAgLTU0OSw2NyArNTQ5LDY3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmV3YWxjb2JqZWN0KEFMY29uZmlnIGNvbmZpZykKIHsKLQlhbGNvYmplY3QgKnNlbGY7Ci0JCi0Jc2VsZiA9IFB5T2JqZWN0X05ldyhhbGNvYmplY3QsICZBbGN0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBYWFhYIEFkZCB5b3VyIG93biBpbml0aWFsaXplcnMgaGVyZSAqLwotCXNlbGYtPmNvbmZpZyA9IGNvbmZpZzsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHNlbGY7CisgICAgYWxjb2JqZWN0ICpzZWxmOworCisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhhbGNvYmplY3QsICZBbGN0eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIEFkZCB5b3VyIG93biBpbml0aWFsaXplcnMgaGVyZSAqLworICAgIHNlbGYtPmNvbmZpZyA9IGNvbmZpZzsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHNlbGY7CiB9CiAKIAogc3RhdGljIHZvaWQKIGFsY19kZWFsbG9jKGFsY29iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIEFkZCB5b3VyIG93biBjbGVhbnVwIGNvZGUgaGVyZSAqLwotI2lmZGVmIEFMX05PX0VMRU0JCS8qIElSSVggNiAqLwotCSh2b2lkKSBhbEZyZWVDb25maWcoc2VsZi0+Y29uZmlnKTsJLyogaWdub3JlIGVycm9ycyAqLworICAgIC8qIFhYWFggQWRkIHlvdXIgb3duIGNsZWFudXAgY29kZSBoZXJlICovCisjaWZkZWYgQUxfTk9fRUxFTSAgICAgICAgICAgICAgIC8qIElSSVggNiAqLworICAgICh2b2lkKSBhbEZyZWVDb25maWcoc2VsZi0+Y29uZmlnKTsgICAgICAgICAgLyogaWdub3JlIGVycm9ycyAqLwogI2Vsc2UKLQkodm9pZCkgQUxmcmVlY29uZmlnKHNlbGYtPmNvbmZpZyk7CS8qIGlnbm9yZSBlcnJvcnMgKi8KKyAgICAodm9pZCkgQUxmcmVlY29uZmlnKHNlbGYtPmNvbmZpZyk7ICAgICAgICAgIC8qIGlnbm9yZSBlcnJvcnMgKi8KICNlbmRpZgotCVB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfZ2V0YXR0cihhbGNvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JLyogWFhYWCBBZGQgeW91ciBvd24gZ2V0YXR0ciBjb2RlIGhlcmUgKi8KLQlyZXR1cm4gUHlfRmluZE1ldGhvZChhbGNfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgLyogWFhYWCBBZGQgeW91ciBvd24gZ2V0YXR0ciBjb2RlIGhlcmUgKi8KKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChhbGNfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihBbGN0eXBlX19kb2NfXywgIiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEFsY3R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJhbC5jb25maWciLAkJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGFsY29iamVjdCksCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWFsY19kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylhbGNfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYykwLAkJLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwJCS8qdHBfY2FsbCovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3N0ciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJhbC5jb25maWciLCAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKGFsY29iamVjdCksICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilhbGNfZGVhbGxvYywgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpYWxjX2dldGF0dHIsICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAKLQkvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotCTBMLDBMLDBMLDBMLAotCUFsY3R5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCisgICAgLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgICAwTCwwTCwwTCwwTCwKKyAgICBBbGN0eXBlX19kb2NfXyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLwogfTsKIAogLyogRW5kIG9mIGNvZGUgZm9yIGNvbmZpZyBvYmplY3RzICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZmRlZiBBTF9OT19FTEVNCQkvKiBJUklYIDYgKi8KKyNpZmRlZiBBTF9OT19FTEVNICAgICAgICAgICAgICAgLyogSVJJWCA2ICovCiAKIFB5RG9jX1NUUlZBUihhbHBfU2V0Q29uZmlnX19kb2NfXywKICJhbFNldENvbmZpZzogc2V0IHRoZSBBTGNvbmZpZyBvZiBhbiBhdWRpbyBBTHBvcnQuIik7CkBAIC02MTcsMTMgKzYxNywxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9TZXRDb25maWcoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlhbGNvYmplY3QgKmNvbmZpZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOlNldENvbmZpZyIsICZBbGN0eXBlLCAmY29uZmlnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFsU2V0Q29uZmlnKHNlbGYtPnBvcnQsIGNvbmZpZy0+Y29uZmlnKSA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBhbGNvYmplY3QgKmNvbmZpZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOlNldENvbmZpZyIsICZBbGN0eXBlLCAmY29uZmlnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFsU2V0Q29uZmlnKHNlbGYtPnBvcnQsIGNvbmZpZy0+Y29uZmlnKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC02MzMsMTIgKzYzMywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9HZXRDb25maWcoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlBTGNvbmZpZyBjb25maWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0Q29uZmlnIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoY29uZmlnID0gYWxHZXRDb25maWcoc2VsZi0+cG9ydCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBuZXdhbGNvYmplY3QoY29uZmlnKTsKKyAgICBBTGNvbmZpZyBjb25maWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0Q29uZmlnIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoY29uZmlnID0gYWxHZXRDb25maWcoc2VsZi0+cG9ydCkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBuZXdhbGNvYmplY3QoY29uZmlnKTsKIH0KIAogCkBAIC02NDgsMTMgKzY0OCwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9HZXRSZXNvdXJjZShhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZXNvdXJjZTsKKyAgICBpbnQgcmVzb3VyY2U7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRSZXNvdXJjZSIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHJlc291cmNlID0gYWxHZXRSZXNvdXJjZShzZWxmLT5wb3J0KSkgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSByZXNvdXJjZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0UmVzb3VyY2UiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChyZXNvdXJjZSA9IGFsR2V0UmVzb3VyY2Uoc2VsZi0+cG9ydCkpID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcmVzb3VyY2UpOwogfQogCiAKQEAgLTY2NCwxNSArNjY0LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX0dldEZEKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkOworICAgIGludCBmZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZEIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZEIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKChmZCA9IGFsR2V0RkQoc2VsZi0+cG9ydCkpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKChmZCA9IGFsR2V0RkQoc2VsZi0+cG9ydCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZkKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZkKTsKIH0KIAogCkBAIC02ODMsMTMgKzY4MywxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9HZXRGaWxsZWQoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmlsbGVkOworICAgIGludCBmaWxsZWQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsZWQiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChmaWxsZWQgPSBhbEdldEZpbGxlZChzZWxmLT5wb3J0KSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZpbGxlZCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbGVkIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZmlsbGVkID0gYWxHZXRGaWxsZWQoc2VsZi0+cG9ydCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmaWxsZWQpOwogfQogCiAKQEAgLTcwMCwxMyArNzAwLDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX0dldEZpbGxhYmxlKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZpbGxhYmxlOworICAgIGludCBmaWxsYWJsZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxhYmxlIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZmlsbGFibGUgPSBhbEdldEZpbGxhYmxlKHNlbGYtPnBvcnQpKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZmlsbGFibGUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxhYmxlIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZmlsbGFibGUgPSBhbEdldEZpbGxhYmxlKHNlbGYtPnBvcnQpKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZmlsbGFibGUpOwogfQogCiAKQEAgLTcxNiw2NCArNzE2LDY0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX1JlYWRGcmFtZXMoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZnJhbWVjb3VudDsKLQlQeU9iamVjdCAqdjsKLQlpbnQgc2l6ZTsKLQlpbnQgY2g7Ci0JQUxjb25maWcgYzsKKyAgICBpbnQgZnJhbWVjb3VudDsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgY2g7CisgICAgQUxjb25maWcgYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpSZWFkRnJhbWVzIiwgJmZyYW1lY291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZnJhbWVjb3VudCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAibmVnYXRpdmUgZnJhbWVjb3VudCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYyA9IGFsR2V0Q29uZmlnKHNlbGYtPnBvcnQpOwotCXN3aXRjaCAoYWxHZXRTYW1wRm10KGMpKSB7Ci0JY2FzZSBBTF9TQU1QRk1UX1RXT1NDT01QOgotCQlzd2l0Y2ggKGFsR2V0V2lkdGgoYykpIHsKLQkJY2FzZSBBTF9TQU1QTEVfODoKLQkJCXNpemUgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUxfU0FNUExFXzE2OgotCQkJc2l6ZSA9IDI7Ci0JCQlicmVhazsKLQkJY2FzZSBBTF9TQU1QTEVfMjQ6Ci0JCQlzaXplID0gNDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lIHdpZHRoIik7Ci0JCQlhbEZyZWVDb25maWcoYyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFMX1NBTVBGTVRfRkxPQVQ6Ci0JCXNpemUgPSA0OwotCQlicmVhazsKLQljYXNlIEFMX1NBTVBGTVRfRE9VQkxFOgotCQlzaXplID0gODsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lIGZvcm1hdCIpOwotCQlhbEZyZWVDb25maWcoYyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljaCA9IGFsR2V0Q2hhbm5lbHMoYyk7Ci0JYWxGcmVlQ29uZmlnKGMpOwotCWlmIChjaCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lICMgb2YgY2hhbm5lbHMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNpemUgKj0gY2g7Ci0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIE5VTEwsIHNpemUgKiBmcmFtZWNvdW50KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6UmVhZEZyYW1lcyIsICZmcmFtZWNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGZyYW1lY291bnQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgIm5lZ2F0aXZlIGZyYW1lY291bnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGMgPSBhbEdldENvbmZpZyhzZWxmLT5wb3J0KTsKKyAgICBzd2l0Y2ggKGFsR2V0U2FtcEZtdChjKSkgeworICAgIGNhc2UgQUxfU0FNUEZNVF9UV09TQ09NUDoKKyAgICAgICAgc3dpdGNoIChhbEdldFdpZHRoKGMpKSB7CisgICAgICAgIGNhc2UgQUxfU0FNUExFXzg6CisgICAgICAgICAgICBzaXplID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMX1NBTVBMRV8xNjoKKyAgICAgICAgICAgIHNpemUgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxfU0FNUExFXzI0OgorICAgICAgICAgICAgc2l6ZSA9IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSB3aWR0aCIpOworICAgICAgICAgICAgYWxGcmVlQ29uZmlnKGMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTF9TQU1QRk1UX0ZMT0FUOgorICAgICAgICBzaXplID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTF9TQU1QRk1UX0RPVUJMRToKKyAgICAgICAgc2l6ZSA9IDg7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSBmb3JtYXQiKTsKKyAgICAgICAgYWxGcmVlQ29uZmlnKGMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2ggPSBhbEdldENoYW5uZWxzKGMpOworICAgIGFsRnJlZUNvbmZpZyhjKTsKKyAgICBpZiAoY2ggPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSAjIG9mIGNoYW5uZWxzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzaXplICo9IGNoOworICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSBOVUxMLCBzaXplICogZnJhbWVjb3VudCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JYWxSZWFkRnJhbWVzKHNlbGYtPnBvcnQsICh2b2lkICopIFB5U3RyaW5nX0FTX1NUUklORyh2KSwgZnJhbWVjb3VudCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgYWxSZWFkRnJhbWVzKHNlbGYtPnBvcnQsICh2b2lkICopIFB5U3RyaW5nX0FTX1NUUklORyh2KSwgZnJhbWVjb3VudCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCXJldHVybiB2OworICAgIHJldHVybiB2OwogfQogCiAKQEAgLTc4MywxOSArNzgzLDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX0Rpc2NhcmRGcmFtZXMoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZnJhbWVjb3VudDsKKyAgICBpbnQgZnJhbWVjb3VudDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpEaXNjYXJkRnJhbWVzIiwgJmZyYW1lY291bnQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6RGlzY2FyZEZyYW1lcyIsICZmcmFtZWNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnJhbWVjb3VudCA9IGFsRGlzY2FyZEZyYW1lcyhzZWxmLT5wb3J0LCBmcmFtZWNvdW50KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmcmFtZWNvdW50ID0gYWxEaXNjYXJkRnJhbWVzKHNlbGYtPnBvcnQsIGZyYW1lY291bnQpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoZnJhbWVjb3VudCA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChmcmFtZWNvdW50IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZyYW1lY291bnQpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZnJhbWVjb3VudCk7CiB9CiAKIApAQCAtODA1LDIyICs4MDUsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfWmVyb0ZyYW1lcyhhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmcmFtZWNvdW50OworICAgIGludCBmcmFtZWNvdW50OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOlplcm9GcmFtZXMiLCAmZnJhbWVjb3VudCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpaZXJvRnJhbWVzIiwgJmZyYW1lY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChmcmFtZWNvdW50IDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJuZWdhdGl2ZSBmcmFtZWNvdW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZnJhbWVjb3VudCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAibmVnYXRpdmUgZnJhbWVjb3VudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JYWxaZXJvRnJhbWVzKHNlbGYtPnBvcnQsIGZyYW1lY291bnQpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGFsWmVyb0ZyYW1lcyhzZWxmLT5wb3J0LCBmcmFtZWNvdW50KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC04MzAsMTYgKzgzMCwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9TZXRGaWxsUG9pbnQoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmlsbHBvaW50OworICAgIGludCBmaWxscG9pbnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6U2V0RmlsbFBvaW50IiwgJmZpbGxwb2ludCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpTZXRGaWxsUG9pbnQiLCAmZmlsbHBvaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoYWxTZXRGaWxsUG9pbnQoc2VsZi0+cG9ydCwgZmlsbHBvaW50KSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChhbFNldEZpbGxQb2ludChzZWxmLT5wb3J0LCBmaWxscG9pbnQpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTg0OSwxNSArODQ5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX0dldEZpbGxQb2ludChhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmaWxscG9pbnQ7CisgICAgaW50IGZpbGxwb2ludDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxQb2ludCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsUG9pbnQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKGZpbGxwb2ludCA9IGFsR2V0RmlsbFBvaW50KHNlbGYtPnBvcnQpKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmICgoZmlsbHBvaW50ID0gYWxHZXRGaWxsUG9pbnQoc2VsZi0+cG9ydCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZpbGxwb2ludCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmaWxscG9pbnQpOwogfQogCiAKQEAgLTg2OCwxNSArODY4LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX0dldEZyYW1lTnVtYmVyKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RhbXBfdCBmbnVtOworICAgIHN0YW1wX3QgZm51bTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZyYW1lTnVtYmVyIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZyYW1lTnVtYmVyIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGFsR2V0RnJhbWVOdW1iZXIoc2VsZi0+cG9ydCwgJmZudW0pIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGFsR2V0RnJhbWVOdW1iZXIoc2VsZi0+cG9ydCwgJmZudW0pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSBmbnVtKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSBmbnVtKTsKIH0KIAogCkBAIC04ODcsMjQgKzg4NywyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9HZXRGcmFtZVRpbWUoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdGFtcF90IGZudW0sIHRpbWU7Ci0JUHlPYmplY3QgKnJldCwgKnYwLCAqdjE7CisgICAgc3RhbXBfdCBmbnVtLCB0aW1lOworICAgIFB5T2JqZWN0ICpyZXQsICp2MCwgKnYxOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RnJhbWVUaW1lIikpCi0JCXJldHVybiBOVUxMOwotCWlmIChhbEdldEZyYW1lVGltZShzZWxmLT5wb3J0LCAmZm51bSwgJnRpbWUpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JdjAgPSBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIGZudW0pOwotCXYxID0gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSB0aW1lKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeV9YREVDUkVGKHYwKTsKLQkJUHlfWERFQ1JFRih2MSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXQgPSBQeVR1cGxlX1BhY2soMiwgdjAsIHYxKTsKLQlQeV9ERUNSRUYodjApOwotCVB5X0RFQ1JFRih2MSk7Ci0JcmV0dXJuIHJldDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGcmFtZVRpbWUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFsR2V0RnJhbWVUaW1lKHNlbGYtPnBvcnQsICZmbnVtLCAmdGltZSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2MCA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgZm51bSk7CisgICAgdjEgPSBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIHRpbWUpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X1hERUNSRUYodjApOworICAgICAgICBQeV9YREVDUkVGKHYxKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldCA9IFB5VHVwbGVfUGFjaygyLCB2MCwgdjEpOworICAgIFB5X0RFQ1JFRih2MCk7CisgICAgUHlfREVDUkVGKHYxKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKQEAgLTkxNCw2MiArOTE0LDYyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX1dyaXRlRnJhbWVzKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc2FtcGxlczsKLQlpbnQgbGVuZ3RoOwotCWludCBzaXplLCBjaDsKLQlBTGNvbmZpZyBjOworICAgIGNoYXIgKnNhbXBsZXM7CisgICAgaW50IGxlbmd0aDsKKyAgICBpbnQgc2l6ZSwgY2g7CisgICAgQUxjb25maWcgYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6V3JpdGVGcmFtZXMiLCAmc2FtcGxlcywgJmxlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCWMgPSBhbEdldENvbmZpZyhzZWxmLT5wb3J0KTsKLQlzd2l0Y2ggKGFsR2V0U2FtcEZtdChjKSkgewotCWNhc2UgQUxfU0FNUEZNVF9UV09TQ09NUDoKLQkJc3dpdGNoIChhbEdldFdpZHRoKGMpKSB7Ci0JCWNhc2UgQUxfU0FNUExFXzg6Ci0JCQlzaXplID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIEFMX1NBTVBMRV8xNjoKLQkJCXNpemUgPSAyOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUxfU0FNUExFXzI0OgotCQkJc2l6ZSA9IDQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSB3aWR0aCIpOwotCQkJYWxGcmVlQ29uZmlnKGMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBTF9TQU1QRk1UX0ZMT0FUOgotCQlzaXplID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBBTF9TQU1QRk1UX0RPVUJMRToKLQkJc2l6ZSA9IDg7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSBmb3JtYXQiKTsKLQkJYWxGcmVlQ29uZmlnKGMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JY2ggPSBhbEdldENoYW5uZWxzKGMpOwotCWFsRnJlZUNvbmZpZyhjKTsKLQlpZiAoY2ggPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSAjIG9mIGNoYW5uZWxzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzaXplICo9IGNoOwotCWlmIChsZW5ndGggJSBzaXplICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LAotCQkJCSJidWZmZXIgbGVuZ3RoIG5vdCB3aG9sZSBudW1iZXIgb2YgZnJhbWVzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOldyaXRlRnJhbWVzIiwgJnNhbXBsZXMsICZsZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjID0gYWxHZXRDb25maWcoc2VsZi0+cG9ydCk7CisgICAgc3dpdGNoIChhbEdldFNhbXBGbXQoYykpIHsKKyAgICBjYXNlIEFMX1NBTVBGTVRfVFdPU0NPTVA6CisgICAgICAgIHN3aXRjaCAoYWxHZXRXaWR0aChjKSkgeworICAgICAgICBjYXNlIEFMX1NBTVBMRV84OgorICAgICAgICAgICAgc2l6ZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTF9TQU1QTEVfMTY6CisgICAgICAgICAgICBzaXplID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMX1NBTVBMRV8yNDoKKyAgICAgICAgICAgIHNpemUgPSA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgd2lkdGgiKTsKKyAgICAgICAgICAgIGFsRnJlZUNvbmZpZyhjKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUxfU0FNUEZNVF9GTE9BVDoKKyAgICAgICAgc2l6ZSA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUxfU0FNUEZNVF9ET1VCTEU6CisgICAgICAgIHNpemUgPSA4OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgZm9ybWF0Iik7CisgICAgICAgIGFsRnJlZUNvbmZpZyhjKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNoID0gYWxHZXRDaGFubmVscyhjKTsKKyAgICBhbEZyZWVDb25maWcoYyk7CisgICAgaWYgKGNoIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgIyBvZiBjaGFubmVscyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2l6ZSAqPSBjaDsKKyAgICBpZiAobGVuZ3RoICUgc2l6ZSAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgbGVuZ3RoIG5vdCB3aG9sZSBudW1iZXIgb2YgZnJhbWVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlhbFdyaXRlRnJhbWVzKHNlbGYtPnBvcnQsICh2b2lkICopIHNhbXBsZXMsIGxlbmd0aCAvIHNpemUpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGFsV3JpdGVGcmFtZXMoc2VsZi0+cG9ydCwgKHZvaWQgKikgc2FtcGxlcywgbGVuZ3RoIC8gc2l6ZSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtOTc4LDEzICs5NzgsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfQ2xvc2VQb3J0KGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Q2xvc2VQb3J0IikpCi0JCXJldHVybiBOVUxMOwotCWlmIChhbENsb3NlUG9ydChzZWxmLT5wb3J0KSA8IDApCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnBvcnQgPSBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpDbG9zZVBvcnQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFsQ2xvc2VQb3J0KHNlbGYtPnBvcnQpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+cG9ydCA9IE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAjZW5kaWYgLyogQUxfTk9fRUxFTSAqLwpAQCAtOTkzLDI1NyArOTkzLDI1NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9jbG9zZXBvcnQoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpDbG9zZVBvcnQiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKEFMY2xvc2Vwb3J0KHNlbGYtPnBvcnQpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+cG9ydCA9IE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkNsb3NlUG9ydCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoQUxjbG9zZXBvcnQoc2VsZi0+cG9ydCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5wb3J0ID0gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfZ2V0ZmQoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQ7CisgICAgaW50IGZkOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RkQiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChmZCA9IEFMZ2V0ZmQoc2VsZi0+IHBvcnQpKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZkKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGRCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGZkID0gQUxnZXRmZChzZWxmLT4gcG9ydCkpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZmQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX2dldGZpbGxlZChhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgY291bnQ7CisgICAgbG9uZyBjb3VudDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxlZCIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGNvdW50ID0gQUxnZXRmaWxsZWQoc2VsZi0+IHBvcnQpKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGNvdW50KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsZWQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChjb3VudCA9IEFMZ2V0ZmlsbGVkKHNlbGYtPiBwb3J0KSkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhjb3VudCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfZ2V0ZmlsbGFibGUoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGNvdW50OworICAgIGxvbmcgY291bnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsYWJsZSIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGNvdW50ID0gQUxnZXRmaWxsYWJsZShzZWxmLT4gcG9ydCkpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcgKGNvdW50KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsYWJsZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGNvdW50ID0gQUxnZXRmaWxsYWJsZShzZWxmLT4gcG9ydCkpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcgKGNvdW50KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9yZWFkc2FtcHMoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGNvdW50OwotCVB5T2JqZWN0ICp2OwotCUFMY29uZmlnIGM7Ci0JaW50IHdpZHRoOwotCWludCByZXQ7CisgICAgbG9uZyBjb3VudDsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBBTGNvbmZpZyBjOworICAgIGludCB3aWR0aDsKKyAgICBpbnQgcmV0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnJlYWRzYW1wcyIsICZjb3VudCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpyZWFkc2FtcHMiLCAmY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChjb3VudCA8PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImFsLnJlYWRzYW1wcyA6IGFyZyA8PSAwIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoY291bnQgPD0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJhbC5yZWFkc2FtcHMgOiBhcmcgPD0gMCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQljID0gQUxnZXRjb25maWcoc2VsZi0+cG9ydCk7CisgICAgYyA9IEFMZ2V0Y29uZmlnKHNlbGYtPnBvcnQpOwogI2lmZGVmIEFMXzQwNQotCXdpZHRoID0gQUxnZXRzYW1wZm10KGMpOwotCWlmICh3aWR0aCA9PSBBTF9TQU1QRk1UX0ZMT0FUKQotCQl3aWR0aCA9IHNpemVvZihmbG9hdCk7Ci0JZWxzZSBpZiAod2lkdGggPT0gQUxfU0FNUEZNVF9ET1VCTEUpCi0JCXdpZHRoID0gc2l6ZW9mKGRvdWJsZSk7Ci0JZWxzZQotCQl3aWR0aCA9IEFMZ2V0d2lkdGgoYyk7CisgICAgd2lkdGggPSBBTGdldHNhbXBmbXQoYyk7CisgICAgaWYgKHdpZHRoID09IEFMX1NBTVBGTVRfRkxPQVQpCisgICAgICAgIHdpZHRoID0gc2l6ZW9mKGZsb2F0KTsKKyAgICBlbHNlIGlmICh3aWR0aCA9PSBBTF9TQU1QRk1UX0RPVUJMRSkKKyAgICAgICAgd2lkdGggPSBzaXplb2YoZG91YmxlKTsKKyAgICBlbHNlCisgICAgICAgIHdpZHRoID0gQUxnZXR3aWR0aChjKTsKICNlbHNlCi0Jd2lkdGggPSBBTGdldHdpZHRoKGMpOworICAgIHdpZHRoID0gQUxnZXR3aWR0aChjKTsKICNlbmRpZiAvKiBBTF80MDUgKi8KLQlBTGZyZWVjb25maWcoYyk7Ci0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgd2lkdGggKiBjb3VudCk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgQUxmcmVlY29uZmlnKGMpOworICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHdpZHRoICogY291bnQpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJldCA9IEFMcmVhZHNhbXBzKHNlbGYtPnBvcnQsICh2b2lkICopIFB5U3RyaW5nX0FzU3RyaW5nKHYpLCBjb3VudCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmV0ID09IC0xKSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXQgPSBBTHJlYWRzYW1wcyhzZWxmLT5wb3J0LCAodm9pZCAqKSBQeVN0cmluZ19Bc1N0cmluZyh2KSwgY291bnQpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiAodik7CisgICAgcmV0dXJuICh2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF93cml0ZXNhbXBzKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqYnVmOwotCWludCBzaXplLCB3aWR0aDsKLQlBTGNvbmZpZyBjOwotCWludCByZXQ7CisgICAgY2hhciAqYnVmOworICAgIGludCBzaXplLCB3aWR0aDsKKyAgICBBTGNvbmZpZyBjOworICAgIGludCByZXQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOndyaXRlc2FtcHMiLCAmYnVmLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6d3JpdGVzYW1wcyIsICZidWYsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljID0gQUxnZXRjb25maWcoc2VsZi0+cG9ydCk7CisgICAgYyA9IEFMZ2V0Y29uZmlnKHNlbGYtPnBvcnQpOwogI2lmZGVmIEFMXzQwNQotCXdpZHRoID0gQUxnZXRzYW1wZm10KGMpOwotCWlmICh3aWR0aCA9PSBBTF9TQU1QRk1UX0ZMT0FUKQotCQl3aWR0aCA9IHNpemVvZihmbG9hdCk7Ci0JZWxzZSBpZiAod2lkdGggPT0gQUxfU0FNUEZNVF9ET1VCTEUpCi0JCXdpZHRoID0gc2l6ZW9mKGRvdWJsZSk7Ci0JZWxzZQotCQl3aWR0aCA9IEFMZ2V0d2lkdGgoYyk7CisgICAgd2lkdGggPSBBTGdldHNhbXBmbXQoYyk7CisgICAgaWYgKHdpZHRoID09IEFMX1NBTVBGTVRfRkxPQVQpCisgICAgICAgIHdpZHRoID0gc2l6ZW9mKGZsb2F0KTsKKyAgICBlbHNlIGlmICh3aWR0aCA9PSBBTF9TQU1QRk1UX0RPVUJMRSkKKyAgICAgICAgd2lkdGggPSBzaXplb2YoZG91YmxlKTsKKyAgICBlbHNlCisgICAgICAgIHdpZHRoID0gQUxnZXR3aWR0aChjKTsKICNlbHNlCi0Jd2lkdGggPSBBTGdldHdpZHRoKGMpOworICAgIHdpZHRoID0gQUxnZXR3aWR0aChjKTsKICNlbmRpZiAvKiBBTF80MDUgKi8KLQlBTGZyZWVjb25maWcoYyk7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJldCA9IEFMd3JpdGVzYW1wcyAoc2VsZi0+cG9ydCwgKHZvaWQgKikgYnVmLCAobG9uZykgc2l6ZSAvIHdpZHRoKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyZXQgPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIEFMZnJlZWNvbmZpZyhjKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmV0ID0gQUx3cml0ZXNhbXBzIChzZWxmLT5wb3J0LCAodm9pZCAqKSBidWYsIChsb25nKSBzaXplIC8gd2lkdGgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJldCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX2dldGZpbGxwb2ludChhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgY291bnQ7CisgICAgbG9uZyBjb3VudDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxQb2ludCIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGNvdW50ID0gQUxnZXRmaWxscG9pbnQoc2VsZi0+cG9ydCkpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoY291bnQpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxQb2ludCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGNvdW50ID0gQUxnZXRmaWxscG9pbnQoc2VsZi0+cG9ydCkpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoY291bnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX3NldGZpbGxwb2ludChhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgY291bnQ7CisgICAgbG9uZyBjb3VudDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpTZXRGaWxsUG9pbnQiLCAmY291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoQUxzZXRmaWxscG9pbnQoc2VsZi0+cG9ydCwgY291bnQpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOlNldEZpbGxQb2ludCIsICZjb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChBTHNldGZpbGxwb2ludChzZWxmLT5wb3J0LCBjb3VudCkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9zZXRjb25maWcoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlhbGNvYmplY3QgKmNvbmZpZzsKKyAgICBhbGNvYmplY3QgKmNvbmZpZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6U2V0Q29uZmlnIiwgJkFsY3R5cGUsICZjb25maWcpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoQUxzZXRjb25maWcoc2VsZi0+cG9ydCwgY29uZmlnLT5jb25maWcpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpTZXRDb25maWciLCAmQWxjdHlwZSwgJmNvbmZpZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChBTHNldGNvbmZpZyhzZWxmLT5wb3J0LCBjb25maWctPmNvbmZpZykgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9nZXRjb25maWcoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlBTGNvbmZpZyBjb25maWc7CisgICAgQUxjb25maWcgY29uZmlnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0Q29uZmlnIikpCi0JCXJldHVybiBOVUxMOwotCWNvbmZpZyA9IEFMZ2V0Y29uZmlnKHNlbGYtPnBvcnQpOwotCWlmIChjb25maWcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ld2FsY29iamVjdChjb25maWcpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldENvbmZpZyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjb25maWcgPSBBTGdldGNvbmZpZyhzZWxmLT5wb3J0KTsKKyAgICBpZiAoY29uZmlnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBuZXdhbGNvYmplY3QoY29uZmlnKTsKIH0KIAogI2lmZGVmIEFMXzQwNQogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9nZXRzdGF0dXMoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqbGlzdCwgKnY7Ci0JbG9uZyAqUFZidWZmZXI7Ci0JbG9uZyBsZW5ndGg7Ci0JaW50IGk7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeUxpc3RfVHlwZSwgJmxpc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlsZW5ndGggPSBQeUxpc3RfU2l6ZShsaXN0KTsKLQlQVmJ1ZmZlciA9IFB5TWVtX05FVyhsb25nLCBsZW5ndGgpOwotCWlmIChQVmJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOwotCQlpZiAoIVB5SW50X0NoZWNrKHYpKSB7Ci0JCQlQeU1lbV9ERUwoUFZidWZmZXIpOwotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVBWYnVmZmVyW2ldID0gUHlJbnRfQXNMb25nKHYpOwotCX0KKyAgICBQeU9iamVjdCAqbGlzdCwgKnY7CisgICAgbG9uZyAqUFZidWZmZXI7CisgICAgbG9uZyBsZW5ndGg7CisgICAgaW50IGk7CiAKLQlpZiAoQUxnZXRzdGF0dXMoc2VsZi0+cG9ydCwgUFZidWZmZXIsIGxlbmd0aCkgPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlMaXN0X1R5cGUsICZsaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGVuZ3RoID0gUHlMaXN0X1NpemUobGlzdCk7CisgICAgUFZidWZmZXIgPSBQeU1lbV9ORVcobG9uZywgbGVuZ3RoKTsKKyAgICBpZiAoUFZidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHYgPSBQeUxpc3RfR2V0SXRlbShsaXN0LCBpKTsKKyAgICAgICAgaWYgKCFQeUludF9DaGVjayh2KSkgeworICAgICAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQVmJ1ZmZlcltpXSA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKSk7CisgICAgaWYgKEFMZ2V0c3RhdHVzKHNlbGYtPnBvcnQsIFBWYnVmZmVyLCBsZW5ndGgpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSkpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYgLyogQUxfNDA1ICovCiAKICNlbmRpZiAvKiBPTERfSU5URVJGQUNFICovCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgYWxwX21ldGhvZHNbXSA9IHsKLSNpZmRlZiBBTF9OT19FTEVNCQkvKiBJUklYIDYgKi8KLQl7IlNldENvbmZpZyIsCShQeUNGdW5jdGlvbilhbHBfU2V0Q29uZmlnLAlNRVRIX1ZBUkFSR1MsCWFscF9TZXRDb25maWdfX2RvY19ffSwKLQl7IkdldENvbmZpZyIsCShQeUNGdW5jdGlvbilhbHBfR2V0Q29uZmlnLAlNRVRIX1ZBUkFSR1MsCWFscF9HZXRDb25maWdfX2RvY19ffSwKLQl7IkdldFJlc291cmNlIiwJKFB5Q0Z1bmN0aW9uKWFscF9HZXRSZXNvdXJjZSwJTUVUSF9WQVJBUkdTLAlhbHBfR2V0UmVzb3VyY2VfX2RvY19ffSwKLQl7IkdldEZEIiwJKFB5Q0Z1bmN0aW9uKWFscF9HZXRGRCwJTUVUSF9WQVJBUkdTLAlhbHBfR2V0RkRfX2RvY19ffSwKLQl7IkdldEZpbGxlZCIsCShQeUNGdW5jdGlvbilhbHBfR2V0RmlsbGVkLAlNRVRIX1ZBUkFSR1MsCWFscF9HZXRGaWxsZWRfX2RvY19ffSwKLQl7IkdldEZpbGxhYmxlIiwJKFB5Q0Z1bmN0aW9uKWFscF9HZXRGaWxsYWJsZSwJTUVUSF9WQVJBUkdTLAlhbHBfR2V0RmlsbGFibGVfX2RvY19ffSwKLQl7IlJlYWRGcmFtZXMiLAkoUHlDRnVuY3Rpb24pYWxwX1JlYWRGcmFtZXMsCU1FVEhfVkFSQVJHUywJYWxwX1JlYWRGcmFtZXNfX2RvY19ffSwKLQl7IkRpc2NhcmRGcmFtZXMiLAkoUHlDRnVuY3Rpb24pYWxwX0Rpc2NhcmRGcmFtZXMsCU1FVEhfVkFSQVJHUywJYWxwX0Rpc2NhcmRGcmFtZXNfX2RvY19ffSwKLQl7Ilplcm9GcmFtZXMiLAkoUHlDRnVuY3Rpb24pYWxwX1plcm9GcmFtZXMsCU1FVEhfVkFSQVJHUywJYWxwX1plcm9GcmFtZXNfX2RvY19ffSwKLQl7IlNldEZpbGxQb2ludCIsCShQeUNGdW5jdGlvbilhbHBfU2V0RmlsbFBvaW50LAlNRVRIX1ZBUkFSR1MsCWFscF9TZXRGaWxsUG9pbnRfX2RvY19ffSwKLQl7IkdldEZpbGxQb2ludCIsCShQeUNGdW5jdGlvbilhbHBfR2V0RmlsbFBvaW50LAlNRVRIX1ZBUkFSR1MsCWFscF9HZXRGaWxsUG9pbnRfX2RvY19ffSwKLQl7IkdldEZyYW1lTnVtYmVyIiwJKFB5Q0Z1bmN0aW9uKWFscF9HZXRGcmFtZU51bWJlciwJTUVUSF9WQVJBUkdTLAlhbHBfR2V0RnJhbWVOdW1iZXJfX2RvY19ffSwKLQl7IkdldEZyYW1lVGltZSIsCShQeUNGdW5jdGlvbilhbHBfR2V0RnJhbWVUaW1lLAlNRVRIX1ZBUkFSR1MsCWFscF9HZXRGcmFtZVRpbWVfX2RvY19ffSwKLQl7IldyaXRlRnJhbWVzIiwJKFB5Q0Z1bmN0aW9uKWFscF9Xcml0ZUZyYW1lcywJTUVUSF9WQVJBUkdTLAlhbHBfV3JpdGVGcmFtZXNfX2RvY19ffSwKLQl7IkNsb3NlUG9ydCIsCShQeUNGdW5jdGlvbilhbHBfQ2xvc2VQb3J0LAlNRVRIX1ZBUkFSR1MsCWFscF9DbG9zZVBvcnRfX2RvY19ffSwKKyNpZmRlZiBBTF9OT19FTEVNICAgICAgICAgICAgICAgLyogSVJJWCA2ICovCisgICAgeyJTZXRDb25maWciLCAgICAgICAoUHlDRnVuY3Rpb24pYWxwX1NldENvbmZpZywgICAgIE1FVEhfVkFSQVJHUywgICBhbHBfU2V0Q29uZmlnX19kb2NfX30sCisgICAgeyJHZXRDb25maWciLCAgICAgICAoUHlDRnVuY3Rpb24pYWxwX0dldENvbmZpZywgICAgIE1FVEhfVkFSQVJHUywgICBhbHBfR2V0Q29uZmlnX19kb2NfX30sCisgICAgeyJHZXRSZXNvdXJjZSIsICAgICAoUHlDRnVuY3Rpb24pYWxwX0dldFJlc291cmNlLCAgIE1FVEhfVkFSQVJHUywgICBhbHBfR2V0UmVzb3VyY2VfX2RvY19ffSwKKyAgICB7IkdldEZEIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfR2V0RkQsIE1FVEhfVkFSQVJHUywgICBhbHBfR2V0RkRfX2RvY19ffSwKKyAgICB7IkdldEZpbGxlZCIsICAgICAgIChQeUNGdW5jdGlvbilhbHBfR2V0RmlsbGVkLCAgICAgTUVUSF9WQVJBUkdTLCAgIGFscF9HZXRGaWxsZWRfX2RvY19ffSwKKyAgICB7IkdldEZpbGxhYmxlIiwgICAgIChQeUNGdW5jdGlvbilhbHBfR2V0RmlsbGFibGUsICAgTUVUSF9WQVJBUkdTLCAgIGFscF9HZXRGaWxsYWJsZV9fZG9jX199LAorICAgIHsiUmVhZEZyYW1lcyIsICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9SZWFkRnJhbWVzLCAgICBNRVRIX1ZBUkFSR1MsICAgYWxwX1JlYWRGcmFtZXNfX2RvY19ffSwKKyAgICB7IkRpc2NhcmRGcmFtZXMiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9EaXNjYXJkRnJhbWVzLCBNRVRIX1ZBUkFSR1MsICAgYWxwX0Rpc2NhcmRGcmFtZXNfX2RvY19ffSwKKyAgICB7Ilplcm9GcmFtZXMiLCAgICAgIChQeUNGdW5jdGlvbilhbHBfWmVyb0ZyYW1lcywgICAgTUVUSF9WQVJBUkdTLCAgIGFscF9aZXJvRnJhbWVzX19kb2NfX30sCisgICAgeyJTZXRGaWxsUG9pbnQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfU2V0RmlsbFBvaW50LCAgTUVUSF9WQVJBUkdTLCAgIGFscF9TZXRGaWxsUG9pbnRfX2RvY19ffSwKKyAgICB7IkdldEZpbGxQb2ludCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9HZXRGaWxsUG9pbnQsICBNRVRIX1ZBUkFSR1MsICAgYWxwX0dldEZpbGxQb2ludF9fZG9jX199LAorICAgIHsiR2V0RnJhbWVOdW1iZXIiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX0dldEZyYW1lTnVtYmVyLCAgICAgICAgTUVUSF9WQVJBUkdTLCAgIGFscF9HZXRGcmFtZU51bWJlcl9fZG9jX199LAorICAgIHsiR2V0RnJhbWVUaW1lIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX0dldEZyYW1lVGltZSwgIE1FVEhfVkFSQVJHUywgICBhbHBfR2V0RnJhbWVUaW1lX19kb2NfX30sCisgICAgeyJXcml0ZUZyYW1lcyIsICAgICAoUHlDRnVuY3Rpb24pYWxwX1dyaXRlRnJhbWVzLCAgIE1FVEhfVkFSQVJHUywgICBhbHBfV3JpdGVGcmFtZXNfX2RvY19ffSwKKyAgICB7IkNsb3NlUG9ydCIsICAgICAgIChQeUNGdW5jdGlvbilhbHBfQ2xvc2VQb3J0LCAgICAgTUVUSF9WQVJBUkdTLCAgIGFscF9DbG9zZVBvcnRfX2RvY19ffSwKICNlbmRpZiAvKiBBTF9OT19FTEVNICovCiAjaWZkZWYgT0xEX0lOVEVSRkFDRQotCXsiY2xvc2Vwb3J0IiwJCShQeUNGdW5jdGlvbilhbHBfY2xvc2Vwb3J0LAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0ZmQiLAkJKFB5Q0Z1bmN0aW9uKWFscF9nZXRmZCwJTUVUSF9WQVJBUkdTfSwKLSAgICAgICAgeyJmaWxlbm8iLAkJKFB5Q0Z1bmN0aW9uKWFscF9nZXRmZCwJTUVUSF9WQVJBUkdTfSwKLQl7ImdldGZpbGxlZCIsCQkoUHlDRnVuY3Rpb24pYWxwX2dldGZpbGxlZCwJTUVUSF9WQVJBUkdTfSwKLQl7ImdldGZpbGxhYmxlIiwJCShQeUNGdW5jdGlvbilhbHBfZ2V0ZmlsbGFibGUsCU1FVEhfVkFSQVJHU30sCi0JeyJyZWFkc2FtcHMiLAkJKFB5Q0Z1bmN0aW9uKWFscF9yZWFkc2FtcHMsCU1FVEhfVkFSQVJHU30sCi0JeyJ3cml0ZXNhbXBzIiwJCShQeUNGdW5jdGlvbilhbHBfd3JpdGVzYW1wcywJTUVUSF9WQVJBUkdTfSwKLQl7InNldGZpbGxwb2ludCIsCShQeUNGdW5jdGlvbilhbHBfc2V0ZmlsbHBvaW50LAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0ZmlsbHBvaW50IiwJKFB5Q0Z1bmN0aW9uKWFscF9nZXRmaWxscG9pbnQsCU1FVEhfVkFSQVJHU30sCi0JeyJzZXRjb25maWciLAkJKFB5Q0Z1bmN0aW9uKWFscF9zZXRjb25maWcsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXRjb25maWciLAkJKFB5Q0Z1bmN0aW9uKWFscF9nZXRjb25maWcsCU1FVEhfVkFSQVJHU30sCisgICAgeyJjbG9zZXBvcnQiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfY2xvc2Vwb3J0LCAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGZkIiwgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9nZXRmZCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImZpbGVubyIsICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9nZXRmZCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGZpbGxlZCIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9nZXRmaWxsZWQsICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0ZmlsbGFibGUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX2dldGZpbGxhYmxlLCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJyZWFkc2FtcHMiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfcmVhZHNhbXBzLCAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7IndyaXRlc2FtcHMiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF93cml0ZXNhbXBzLCAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0ZmlsbHBvaW50IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX3NldGZpbGxwb2ludCwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRmaWxscG9pbnQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfZ2V0ZmlsbHBvaW50LCAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldGNvbmZpZyIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9zZXRjb25maWcsICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0Y29uZmlnIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX2dldGNvbmZpZywgICAgIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgQUxfNDA1Ci0JeyJnZXRzdGF0dXMiLAkJKFB5Q0Z1bmN0aW9uKWFscF9nZXRzdGF0dXMsCU1FVEhfVkFSQVJHU30sCi0jZW5kaWYgLyogQUxfNDA1ICovCSAgICAKKyAgICB7ImdldHN0YXR1cyIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9nZXRzdGF0dXMsICAgICBNRVRIX1ZBUkFSR1N9LAorI2VuZGlmIC8qIEFMXzQwNSAqLwogI2VuZGlmIC8qIE9MRF9JTlRFUkZBQ0UgKi8KLSAKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0gKi8KQEAgLTEyNTIsNzQgKzEyNTIsNzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdhbHBvYmplY3QoQUxwb3J0IHBvcnQpCiB7Ci0JYWxwb2JqZWN0ICpzZWxmOwotCQotCXNlbGYgPSBQeU9iamVjdF9OZXcoYWxwb2JqZWN0LCAmQWxwdHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogWFhYWCBBZGQgeW91ciBvd24gaW5pdGlhbGl6ZXJzIGhlcmUgKi8KLQlzZWxmLT5wb3J0ID0gcG9ydDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHNlbGY7CisgICAgYWxwb2JqZWN0ICpzZWxmOworCisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhhbHBvYmplY3QsICZBbHB0eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIEFkZCB5b3VyIG93biBpbml0aWFsaXplcnMgaGVyZSAqLworICAgIHNlbGYtPnBvcnQgPSBwb3J0OworICAgIHJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKIH0KIAogCiBzdGF0aWMgdm9pZAogYWxwX2RlYWxsb2MoYWxwb2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggQWRkIHlvdXIgb3duIGNsZWFudXAgY29kZSBoZXJlICovCi0JaWYgKHNlbGYtPnBvcnQpIHsKLSNpZmRlZiBBTF9OT19FTEVNCQkvKiBJUklYIDYgKi8KLQkJYWxDbG9zZVBvcnQoc2VsZi0+cG9ydCk7CisgICAgLyogWFhYWCBBZGQgeW91ciBvd24gY2xlYW51cCBjb2RlIGhlcmUgKi8KKyAgICBpZiAoc2VsZi0+cG9ydCkgeworI2lmZGVmIEFMX05PX0VMRU0gICAgICAgICAgICAgICAvKiBJUklYIDYgKi8KKyAgICAgICAgYWxDbG9zZVBvcnQoc2VsZi0+cG9ydCk7CiAjZWxzZQotCQlBTGNsb3NlcG9ydChzZWxmLT5wb3J0KTsKKyAgICAgICAgQUxjbG9zZXBvcnQoc2VsZi0+cG9ydCk7CiAjZW5kaWYKLQl9Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIH0KKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfZ2V0YXR0cihhbHBvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JLyogWFhYWCBBZGQgeW91ciBvd24gZ2V0YXR0ciBjb2RlIGhlcmUgKi8KLQlpZiAoc2VsZi0+cG9ydCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgInBvcnQgYWxyZWFkeSBjbG9zZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9GaW5kTWV0aG9kKGFscF9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICAvKiBYWFhYIEFkZCB5b3VyIG93biBnZXRhdHRyIGNvZGUgaGVyZSAqLworICAgIGlmIChzZWxmLT5wb3J0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAicG9ydCBhbHJlYWR5IGNsb3NlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoYWxwX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogfQogCiBQeURvY19TVFJWQVIoQWxwdHlwZV9fZG9jX18sICIiKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBBbHB0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkiYWwucG9ydCIsCQkJLyp0cF9uYW1lKi8KLQlzaXplb2YoYWxwb2JqZWN0KSwJCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpYWxwX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JKHByaW50ZnVuYykwLAkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWFscF9nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLAkvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKTAsCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykwLAkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCS8qdHBfYXNfbWFwcGluZyovCi0JKGhhc2hmdW5jKTAsCQkvKnRwX2hhc2gqLwotCSh0ZXJuYXJ5ZnVuYykwLAkJLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgImFsLnBvcnQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoYWxwb2JqZWN0KSwgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWFscF9kZWFsbG9jLCAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylhbHBfZ2V0YXR0ciwgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsICAgICAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKTAsICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgKGhhc2hmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgKHRlcm5hcnlmdW5jKTAsICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgKHJlcHJmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KIAotCS8qIFNwYWNlIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCi0JMEwsMEwsMEwsMEwsCi0JQWxwdHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KKyAgICAvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAgIDBMLDBMLDBMLDBMLAorICAgIEFscHR5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCiB9OwogCiAvKiBFbmQgb2YgY29kZSBmb3IgcG9ydCBvYmplY3RzICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAKLSNpZmRlZiBBTF9OT19FTEVNCQkvKiBJUklYIDYgKi8KKyNpZmRlZiBBTF9OT19FTEVNICAgICAgICAgICAgICAgLyogSVJJWCA2ICovCiAKIFB5RG9jX1NUUlZBUihhbF9OZXdDb25maWdfX2RvY19fLAogImFsTmV3Q29uZmlnOiBjcmVhdGUgYW5kIGluaXRpYWxpemUgYW4gYXVkaW8gQUxjb25maWcgc3RydWN0dXJlLiIpOwpAQCAtMTMyNywxMyArMTMyNywxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX05ld0NvbmZpZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQUxjb25maWcgY29uZmlnOworICAgIEFMY29uZmlnIGNvbmZpZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOk5ld0NvbmZpZyIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGNvbmZpZyA9IGFsTmV3Q29uZmlnKCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBuZXdhbGNvYmplY3QoY29uZmlnKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpOZXdDb25maWciKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChjb25maWcgPSBhbE5ld0NvbmZpZygpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmV3YWxjb2JqZWN0KGNvbmZpZyk7CiB9CiAKIFB5RG9jX1NUUlZBUihhbF9PcGVuUG9ydF9fZG9jX18sCkBAIC0xMzQyLDE1ICsxMzQyLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxfT3BlblBvcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUFMcG9ydCBwb3J0OwotCWNoYXIgKm5hbWUsICpkaXI7Ci0JYWxjb2JqZWN0ICpjb25maWcgPSBOVUxMOworICAgIEFMcG9ydCBwb3J0OworICAgIGNoYXIgKm5hbWUsICpkaXI7CisgICAgYWxjb2JqZWN0ICpjb25maWcgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xPITpPcGVuUG9ydCIsICZuYW1lLCAmZGlyLCAmQWxjdHlwZSwgJmNvbmZpZykpCi0JCXJldHVybiBOVUxMOwotCWlmICgocG9ydCA9IGFsT3BlblBvcnQobmFtZSwgZGlyLCBjb25maWcgPyBjb25maWctPmNvbmZpZyA6IE5VTEwpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbmV3YWxwb2JqZWN0KHBvcnQpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3N8TyE6T3BlblBvcnQiLCAmbmFtZSwgJmRpciwgJkFsY3R5cGUsICZjb25maWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHBvcnQgPSBhbE9wZW5Qb3J0KG5hbWUsIGRpciwgY29uZmlnID8gY29uZmlnLT5jb25maWcgOiBOVUxMKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG5ld2FscG9iamVjdChwb3J0KTsKIH0KIAogUHlEb2NfU1RSVkFSKGFsX0Nvbm5lY3RfX2RvY19fLApAQCAtMTM1OSwzNyArMTM1OSwzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX0Nvbm5lY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzb3VyY2UsIGRlc3QsIG5wcm9wcyA9IDAsIGlkLCBpOwotCUFMcHYgKnByb3BzID0gTlVMTDsKLQlBTHBhcmFtSW5mbyAqcHJvcGluZm8gPSBOVUxMOwotCVB5T2JqZWN0ICpwcm9wb2JqID0gTlVMTDsKKyAgICBpbnQgc291cmNlLCBkZXN0LCBucHJvcHMgPSAwLCBpZCwgaTsKKyAgICBBTHB2ICpwcm9wcyA9IE5VTEw7CisgICAgQUxwYXJhbUluZm8gKnByb3BpbmZvID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcHJvcG9iaiA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpfE8hOkNvbm5lY3QiLCAmc291cmNlLCAmZGVzdCwgJlB5TGlzdF9UeXBlLCAmcHJvcG9iaikpCi0JCXJldHVybiBOVUxMOwotCWlmIChwcm9wb2JqICE9IE5VTEwpIHsKLQkJbnByb3BzID0gcHl0aG9uMnBhcmFtcyhzb3VyY2UsIGRlc3QsIHByb3BvYmosICZwcm9wcywgJnByb3BpbmZvKTsKLQkJaWYgKG5wcm9wcyA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaXxPITpDb25uZWN0IiwgJnNvdXJjZSwgJmRlc3QsICZQeUxpc3RfVHlwZSwgJnByb3BvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocHJvcG9iaiAhPSBOVUxMKSB7CisgICAgICAgIG5wcm9wcyA9IHB5dGhvbjJwYXJhbXMoc291cmNlLCBkZXN0LCBwcm9wb2JqLCAmcHJvcHMsICZwcm9waW5mbyk7CisgICAgICAgIGlmIChucHJvcHMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWQgPSBhbENvbm5lY3Qoc291cmNlLCBkZXN0LCBwcm9wcywgbnByb3BzKTsKKyAgICBpZCA9IGFsQ29ubmVjdChzb3VyY2UsIGRlc3QsIHByb3BzLCBucHJvcHMpOwogCi0JaWYgKHByb3BzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBucHJvcHM7IGkrKykgewotCQkJc3dpdGNoIChwcm9waW5mb1tpXS52YWx1ZVR5cGUpIHsKLQkJCWNhc2UgQUxfU0VUX1ZBTDoKLQkJCWNhc2UgQUxfVkVDVE9SX1ZBTDoKLQkJCQlQeU1lbV9ERUwocHJvcHNbaV0udmFsdWUucHRyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlQeU1lbV9ERUwocHJvcHMpOwotCQlQeU1lbV9ERUwocHJvcGluZm8pOwotCX0KKyAgICBpZiAocHJvcHMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5wcm9wczsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByb3BpbmZvW2ldLnZhbHVlVHlwZSkgeworICAgICAgICAgICAgY2FzZSBBTF9TRVRfVkFMOgorICAgICAgICAgICAgY2FzZSBBTF9WRUNUT1JfVkFMOgorICAgICAgICAgICAgICAgIFB5TWVtX0RFTChwcm9wc1tpXS52YWx1ZS5wdHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5TWVtX0RFTChwcm9wcyk7CisgICAgICAgIFB5TWVtX0RFTChwcm9waW5mbyk7CisgICAgfQogCi0JaWYgKGlkIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBpZCk7CisgICAgaWYgKGlkIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBpZCk7CiB9CiAKIFB5RG9jX1NUUlZBUihhbF9EaXNjb25uZWN0X19kb2NfXywKQEAgLTEzOTgsMTQgKzEzOTgsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9EaXNjb25uZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzOworICAgIGludCByZXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6RGlzY29ubmVjdCIsICZyZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYWxEaXNjb25uZWN0KHJlcykgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkRpc2Nvbm5lY3QiLCAmcmVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFsRGlzY29ubmVjdChyZXMpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoYWxfR2V0UGFyYW1zX19kb2NfXywKQEAgLTE0MTQsMTQzICsxNDE0LDE0MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX0dldFBhcmFtcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJlc291cmNlOwotCVB5T2JqZWN0ICpwdnNsaXN0LCAqaXRlbSA9IE5VTEwsICp2ID0gTlVMTDsKLQlBTHB2ICpwdnM7Ci0JaW50IGksIGosIG5wdnM7Ci0JQUxwYXJhbUluZm8gKnBpbmZvOworICAgIGludCByZXNvdXJjZTsKKyAgICBQeU9iamVjdCAqcHZzbGlzdCwgKml0ZW0gPSBOVUxMLCAqdiA9IE5VTEw7CisgICAgQUxwdiAqcHZzOworICAgIGludCBpLCBqLCBucHZzOworICAgIEFMcGFyYW1JbmZvICpwaW5mbzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU8hOkdldFBhcmFtcyIsICZyZXNvdXJjZSwgJlB5TGlzdF9UeXBlLCAmcHZzbGlzdCkpCi0JCXJldHVybiBOVUxMOwotCW5wdnMgPSBQeUxpc3RfU2l6ZShwdnNsaXN0KTsKLQlwdnMgPSBQeU1lbV9ORVcoQUxwdiwgbnB2cyk7Ci0JcGluZm8gPSBQeU1lbV9ORVcoQUxwYXJhbUluZm8sIG5wdnMpOwotCWZvciAoaSA9IDA7IGkgPCBucHZzOyBpKyspIHsKLQkJaXRlbSA9IFB5TGlzdF9HZXRJdGVtKHB2c2xpc3QsIGkpOwotCQlpZiAoIVB5SW50X0NoZWNrKGl0ZW0pKSB7Ci0JCQlpdGVtID0gTlVMTDsKLQkJCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImxpc3Qgb2YgaW50ZWdlcnMgZXhwZWN0ZWQiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJcHZzW2ldLnBhcmFtID0gKGludCkgUHlJbnRfQXNMb25nKGl0ZW0pOwotCQlpdGVtID0gTlVMTDsJLyogbm90IG5lZWRlZCBhbnltb3JlICovCi0JCWlmIChhbEdldFBhcmFtSW5mbyhyZXNvdXJjZSwgcHZzW2ldLnBhcmFtLCAmcGluZm9baV0pIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JCXN3aXRjaCAocGluZm9baV0udmFsdWVUeXBlKSB7Ci0JCWNhc2UgQUxfTk9fVkFMOgotCQkJYnJlYWs7Ci0JCWNhc2UgQUxfTUFUUklYX1ZBTDoKLQkJCXBpbmZvW2ldLm1heEVsZW1zICo9IHBpbmZvW2ldLm1heEVsZW1zMjsKLQkJCS8qIGZhbGwgdGhyb3VnaCAqLwotCQljYXNlIEFMX1NUUklOR19WQUw6Ci0JCWNhc2UgQUxfU0VUX1ZBTDoKLQkJY2FzZSBBTF9WRUNUT1JfVkFMOgotCQkJc3dpdGNoIChwaW5mb1tpXS5lbGVtZW50VHlwZSkgewotCQkJY2FzZSBBTF9JTlQzMl9FTEVNOgotCQkJY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgotCQkJY2FzZSBBTF9FTlVNX0VMRU06Ci0JCQkJcHZzW2ldLnZhbHVlLnB0ciA9IFB5TWVtX05FVyhpbnQsIHBpbmZvW2ldLm1heEVsZW1zKTsKLQkJCQlwdnNbaV0uc2l6ZUluID0gcGluZm9baV0ubWF4RWxlbXM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFMX0lOVDY0X0VMRU06Ci0JCQljYXNlIEFMX0ZJWEVEX0VMRU06Ci0JCQkJcHZzW2ldLnZhbHVlLnB0ciA9IFB5TWVtX05FVyhsb25nIGxvbmcsIHBpbmZvW2ldLm1heEVsZW1zKTsKLQkJCQlwdnNbaV0uc2l6ZUluID0gcGluZm9baV0ubWF4RWxlbXM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFMX0NIQVJfRUxFTToKLQkJCQlwdnNbaV0udmFsdWUucHRyID0gUHlNZW1fTkVXKGNoYXIsIDMyKTsKLQkJCQlwdnNbaV0uc2l6ZUluID0gMzI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFMX05PX0VMRU06Ci0JCQljYXNlIEFMX1BUUl9FTEVNOgotCQkJZGVmYXVsdDoKLQkJCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJpbnRlcm5hbCBlcnJvciIpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBBTF9TQ0FMQVJfVkFMOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJpbnRlcm5hbCBlcnJvciIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlpZiAocGluZm9baV0udmFsdWVUeXBlID09IEFMX01BVFJJWF9WQUwpIHsKLQkJCXBpbmZvW2ldLm1heEVsZW1zIC89IHBpbmZvW2ldLm1heEVsZW1zMjsKLQkJCXB2c1tpXS5zaXplSW4gLz0gcGluZm9baV0ubWF4RWxlbXMyOwotCQkJcHZzW2ldLnNpemUySW4gPSBwaW5mb1tpXS5tYXhFbGVtczI7Ci0JCX0KLQl9Ci0JaWYgKGFsR2V0UGFyYW1zKHJlc291cmNlLCBwdnMsIG5wdnMpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlpZiAoISh2ID0gUHlMaXN0X05ldyhucHZzKSkpCi0JCWdvdG8gZXJyb3I7Ci0JZm9yIChpID0gMDsgaSA8IG5wdnM7IGkrKykgewotCQlpZiAocHZzW2ldLnNpemVPdXQgPCAwKSB7Ci0JCQljaGFyIGJ1ZlszMl07Ci0JCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkJICAgICAgInByb2JsZW0gd2l0aCBwYXJhbSAlZCIsIGkpOwotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCBidWYpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlzd2l0Y2ggKHBpbmZvW2ldLnZhbHVlVHlwZSkgewotCQljYXNlIEFMX05PX1ZBTDoKLQkJCWl0ZW0gPSBQeV9Ob25lOwotCQkJUHlfSU5DUkVGKGl0ZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUxfU1RSSU5HX1ZBTDoKLQkJCWl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHB2c1tpXS52YWx1ZS5wdHIpOwotCQkJUHlNZW1fREVMKHB2c1tpXS52YWx1ZS5wdHIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUxfTUFUUklYX1ZBTDoKLQkJCS8qIFhYWFggdGhpcyBpcyBub3QgcmlnaHQgKi8KLQkJCXB2c1tpXS5zaXplT3V0ICo9IHB2c1tpXS5zaXplMk91dDsKLQkJCS8qIGZhbGwgdGhyb3VnaCAqLwotCQljYXNlIEFMX1NFVF9WQUw6Ci0JCWNhc2UgQUxfVkVDVE9SX1ZBTDoKLQkJCWl0ZW0gPSBQeUxpc3RfTmV3KHB2c1tpXS5zaXplT3V0KTsKLQkJCWZvciAoaiA9IDA7IGogPCBwdnNbaV0uc2l6ZU91dDsgaisrKSB7Ci0JCQkJc3dpdGNoIChwaW5mb1tpXS5lbGVtZW50VHlwZSkgewotCQkJCWNhc2UgQUxfSU5UMzJfRUxFTToKLQkJCQljYXNlIEFMX1JFU09VUkNFX0VMRU06Ci0JCQkJY2FzZSBBTF9FTlVNX0VMRU06Ci0JCQkJCVB5TGlzdF9TZXRJdGVtKGl0ZW0sIGosIFB5SW50X0Zyb21Mb25nKChsb25nKSAoKGludCAqKSBwdnNbaV0udmFsdWUucHRyKVtqXSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFMX0lOVDY0X0VMRU06Ci0JCQkJCVB5TGlzdF9TZXRJdGVtKGl0ZW0sIGosIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKChsb25nIGxvbmcgKikgcHZzW2ldLnZhbHVlLnB0cilbal0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBTF9GSVhFRF9FTEVNOgotCQkJCQlQeUxpc3RfU2V0SXRlbShpdGVtLCBqLCBQeUZsb2F0X0Zyb21Eb3VibGUoYWxGaXhlZFRvRG91YmxlKCgobG9uZyBsb25nICopIHB2c1tpXS52YWx1ZS5wdHIpW2pdKSkpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJpbnRlcm5hbCBlcnJvciIpOwotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJCX0KLQkJCVB5TWVtX0RFTChwdnNbaV0udmFsdWUucHRyKTsKLQkJCWJyZWFrOwotCQljYXNlIEFMX1NDQUxBUl9WQUw6Ci0JCQlpdGVtID0gcGFyYW0ycHl0aG9uKHJlc291cmNlLCBwdnNbaV0ucGFyYW0sIHB2c1tpXS52YWx1ZSwgJnBpbmZvW2ldKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpIHx8Ci0JCSAgICBQeUxpc3RfU2V0SXRlbSh2LCBpLCBQeV9CdWlsZFZhbHVlKCIoaU8pIiwgcHZzW2ldLnBhcmFtLAotCQkJCQkJICAgICAgIGl0ZW0pKSA8IDAgfHwKLQkJICAgIFB5RXJyX09jY3VycmVkKCkpCi0JCQlnb3RvIGVycm9yOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQotCVB5TWVtX0RFTChwdnMpOwotCVB5TWVtX0RFTChwaW5mbyk7Ci0JcmV0dXJuIHY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyE6R2V0UGFyYW1zIiwgJnJlc291cmNlLCAmUHlMaXN0X1R5cGUsICZwdnNsaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbnB2cyA9IFB5TGlzdF9TaXplKHB2c2xpc3QpOworICAgIHB2cyA9IFB5TWVtX05FVyhBTHB2LCBucHZzKTsKKyAgICBwaW5mbyA9IFB5TWVtX05FVyhBTHBhcmFtSW5mbywgbnB2cyk7CisgICAgZm9yIChpID0gMDsgaSA8IG5wdnM7IGkrKykgeworICAgICAgICBpdGVtID0gUHlMaXN0X0dldEl0ZW0ocHZzbGlzdCwgaSk7CisgICAgICAgIGlmICghUHlJbnRfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgIGl0ZW0gPSBOVUxMOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAibGlzdCBvZiBpbnRlZ2VycyBleHBlY3RlZCIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBwdnNbaV0ucGFyYW0gPSAoaW50KSBQeUludF9Bc0xvbmcoaXRlbSk7CisgICAgICAgIGl0ZW0gPSBOVUxMOyAgICAgICAgICAgIC8qIG5vdCBuZWVkZWQgYW55bW9yZSAqLworICAgICAgICBpZiAoYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UsIHB2c1tpXS5wYXJhbSwgJnBpbmZvW2ldKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBzd2l0Y2ggKHBpbmZvW2ldLnZhbHVlVHlwZSkgeworICAgICAgICBjYXNlIEFMX05PX1ZBTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMX01BVFJJWF9WQUw6CisgICAgICAgICAgICBwaW5mb1tpXS5tYXhFbGVtcyAqPSBwaW5mb1tpXS5tYXhFbGVtczI7CisgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBBTF9TVFJJTkdfVkFMOgorICAgICAgICBjYXNlIEFMX1NFVF9WQUw6CisgICAgICAgIGNhc2UgQUxfVkVDVE9SX1ZBTDoKKyAgICAgICAgICAgIHN3aXRjaCAocGluZm9baV0uZWxlbWVudFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUxfSU5UMzJfRUxFTToKKyAgICAgICAgICAgIGNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKKyAgICAgICAgICAgIGNhc2UgQUxfRU5VTV9FTEVNOgorICAgICAgICAgICAgICAgIHB2c1tpXS52YWx1ZS5wdHIgPSBQeU1lbV9ORVcoaW50LCBwaW5mb1tpXS5tYXhFbGVtcyk7CisgICAgICAgICAgICAgICAgcHZzW2ldLnNpemVJbiA9IHBpbmZvW2ldLm1heEVsZW1zOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTF9JTlQ2NF9FTEVNOgorICAgICAgICAgICAgY2FzZSBBTF9GSVhFRF9FTEVNOgorICAgICAgICAgICAgICAgIHB2c1tpXS52YWx1ZS5wdHIgPSBQeU1lbV9ORVcobG9uZyBsb25nLCBwaW5mb1tpXS5tYXhFbGVtcyk7CisgICAgICAgICAgICAgICAgcHZzW2ldLnNpemVJbiA9IHBpbmZvW2ldLm1heEVsZW1zOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTF9DSEFSX0VMRU06CisgICAgICAgICAgICAgICAgcHZzW2ldLnZhbHVlLnB0ciA9IFB5TWVtX05FVyhjaGFyLCAzMik7CisgICAgICAgICAgICAgICAgcHZzW2ldLnNpemVJbiA9IDMyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTF9OT19FTEVNOgorICAgICAgICAgICAgY2FzZSBBTF9QVFJfRUxFTToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiaW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxfU0NBTEFSX1ZBTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiaW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBpbmZvW2ldLnZhbHVlVHlwZSA9PSBBTF9NQVRSSVhfVkFMKSB7CisgICAgICAgICAgICBwaW5mb1tpXS5tYXhFbGVtcyAvPSBwaW5mb1tpXS5tYXhFbGVtczI7CisgICAgICAgICAgICBwdnNbaV0uc2l6ZUluIC89IHBpbmZvW2ldLm1heEVsZW1zMjsKKyAgICAgICAgICAgIHB2c1tpXS5zaXplMkluID0gcGluZm9baV0ubWF4RWxlbXMyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhbEdldFBhcmFtcyhyZXNvdXJjZSwgcHZzLCBucHZzKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKCEodiA9IFB5TGlzdF9OZXcobnB2cykpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGZvciAoaSA9IDA7IGkgPCBucHZzOyBpKyspIHsKKyAgICAgICAgaWYgKHB2c1tpXS5zaXplT3V0IDwgMCkgeworICAgICAgICAgICAgY2hhciBidWZbMzJdOworICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvYmxlbSB3aXRoIHBhcmFtICVkIiwgaSk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsIGJ1Zik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAocGluZm9baV0udmFsdWVUeXBlKSB7CisgICAgICAgIGNhc2UgQUxfTk9fVkFMOgorICAgICAgICAgICAgaXRlbSA9IFB5X05vbmU7CisgICAgICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTF9TVFJJTkdfVkFMOgorICAgICAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocHZzW2ldLnZhbHVlLnB0cik7CisgICAgICAgICAgICBQeU1lbV9ERUwocHZzW2ldLnZhbHVlLnB0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTF9NQVRSSVhfVkFMOgorICAgICAgICAgICAgLyogWFhYWCB0aGlzIGlzIG5vdCByaWdodCAqLworICAgICAgICAgICAgcHZzW2ldLnNpemVPdXQgKj0gcHZzW2ldLnNpemUyT3V0OworICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgQUxfU0VUX1ZBTDoKKyAgICAgICAgY2FzZSBBTF9WRUNUT1JfVkFMOgorICAgICAgICAgICAgaXRlbSA9IFB5TGlzdF9OZXcocHZzW2ldLnNpemVPdXQpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHB2c1tpXS5zaXplT3V0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBpbmZvW2ldLmVsZW1lbnRUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBTF9JTlQzMl9FTEVNOgorICAgICAgICAgICAgICAgIGNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKKyAgICAgICAgICAgICAgICBjYXNlIEFMX0VOVU1fRUxFTToKKyAgICAgICAgICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0oaXRlbSwgaiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpICgoaW50ICopIHB2c1tpXS52YWx1ZS5wdHIpW2pdKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQUxfSU5UNjRfRUxFTToKKyAgICAgICAgICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0oaXRlbSwgaiwgUHlMb25nX0Zyb21Mb25nTG9uZygoKGxvbmcgbG9uZyAqKSBwdnNbaV0udmFsdWUucHRyKVtqXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFMX0ZJWEVEX0VMRU06CisgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGl0ZW0sIGosIFB5RmxvYXRfRnJvbURvdWJsZShhbEZpeGVkVG9Eb3VibGUoKChsb25nIGxvbmcgKikgcHZzW2ldLnZhbHVlLnB0cilbal0pKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlNZW1fREVMKHB2c1tpXS52YWx1ZS5wdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxfU0NBTEFSX1ZBTDoKKyAgICAgICAgICAgIGl0ZW0gPSBwYXJhbTJweXRob24ocmVzb3VyY2UsIHB2c1tpXS5wYXJhbSwgcHZzW2ldLnZhbHVlLCAmcGluZm9baV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkgfHwKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKHYsIGksIFB5X0J1aWxkVmFsdWUoIihpTykiLCBwdnNbaV0ucGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pKSA8IDAgfHwKKyAgICAgICAgICAgIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQorICAgIFB5TWVtX0RFTChwdnMpOworICAgIFB5TWVtX0RFTChwaW5mbyk7CisgICAgcmV0dXJuIHY7CiAKICAgZXJyb3I6Ci0JUHlfWERFQ1JFRih2KTsKLQlQeV9YREVDUkVGKGl0ZW0pOwotCWlmIChwdnMpCi0JCVB5TWVtX0RFTChwdnMpOwotCWlmIChwaW5mbykKLQkJUHlNZW1fREVMKHBpbmZvKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIFB5X1hERUNSRUYoaXRlbSk7CisgICAgaWYgKHB2cykKKyAgICAgICAgUHlNZW1fREVMKHB2cyk7CisgICAgaWYgKHBpbmZvKQorICAgICAgICBQeU1lbV9ERUwocGluZm8pOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoYWxfU2V0UGFyYW1zX19kb2NfXywKQEAgLTE1NTksNDMgKzE1NTksNDMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9TZXRQYXJhbXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZXNvdXJjZTsKLQlQeU9iamVjdCAqcHZzbGlzdDsKLQlBTHB2ICpwdnM7Ci0JQUxwYXJhbUluZm8gKnBpbmZvOwotCWludCBucHZzLCBpOworICAgIGludCByZXNvdXJjZTsKKyAgICBQeU9iamVjdCAqcHZzbGlzdDsKKyAgICBBTHB2ICpwdnM7CisgICAgQUxwYXJhbUluZm8gKnBpbmZvOworICAgIGludCBucHZzLCBpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyE6U2V0UGFyYW1zIiwgJnJlc291cmNlLCAmUHlMaXN0X1R5cGUsICZwdnNsaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JbnB2cyA9IHB5dGhvbjJwYXJhbXMocmVzb3VyY2UsIC0xLCBwdnNsaXN0LCAmcHZzLCAmcGluZm8pOwotCWlmIChucHZzIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyE6U2V0UGFyYW1zIiwgJnJlc291cmNlLCAmUHlMaXN0X1R5cGUsICZwdnNsaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbnB2cyA9IHB5dGhvbjJwYXJhbXMocmVzb3VyY2UsIC0xLCBwdnNsaXN0LCAmcHZzLCAmcGluZm8pOworICAgIGlmIChucHZzIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoYWxTZXRQYXJhbXMocmVzb3VyY2UsIHB2cywgbnB2cykgPCAwKQotCQlnb3RvIGVycm9yOworICAgIGlmIChhbFNldFBhcmFtcyhyZXNvdXJjZSwgcHZzLCBucHZzKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQkvKiBjbGVhbnVwICovCi0JZm9yIChpID0gMDsgaSA8IG5wdnM7IGkrKykgewotCQlzd2l0Y2ggKHBpbmZvW2ldLnZhbHVlVHlwZSkgewotCQljYXNlIEFMX1NFVF9WQUw6Ci0JCWNhc2UgQUxfVkVDVE9SX1ZBTDoKLQkJCVB5TWVtX0RFTChwdnNbaV0udmFsdWUucHRyKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCVB5TWVtX0RFTChwdnMpOwotCVB5TWVtX0RFTChwaW5mbyk7CisgICAgLyogY2xlYW51cCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBucHZzOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChwaW5mb1tpXS52YWx1ZVR5cGUpIHsKKyAgICAgICAgY2FzZSBBTF9TRVRfVkFMOgorICAgICAgICBjYXNlIEFMX1ZFQ1RPUl9WQUw6CisgICAgICAgICAgICBQeU1lbV9ERUwocHZzW2ldLnZhbHVlLnB0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeU1lbV9ERUwocHZzKTsKKyAgICBQeU1lbV9ERUwocGluZm8pOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIAogICBlcnJvcjoKLQkvKiBYWFhYIHdlIHNob3VsZCBjbGVhbiB1cCBldmVyeXRoaW5nICovCi0JaWYgKHB2cykKLQkJUHlNZW1fREVMKHB2cyk7Ci0JaWYgKHBpbmZvKQotCQlQeU1lbV9ERUwocGluZm8pOwotCXJldHVybiBOVUxMOworICAgIC8qIFhYWFggd2Ugc2hvdWxkIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAocHZzKQorICAgICAgICBQeU1lbV9ERUwocHZzKTsKKyAgICBpZiAocGluZm8pCisgICAgICAgIFB5TWVtX0RFTChwaW5mbyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihhbF9RdWVyeVZhbHVlc19fZG9jX18sCkBAIC0xNjA0LDc5ICsxNjA0LDc5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxfUXVlcnlWYWx1ZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZXNvdXJjZSwgcGFyYW07Ci0JQUx2YWx1ZSAqcmV0dXJuX3NldCA9IE5VTEw7Ci0JaW50IHNldHNpemUgPSAzMiwgcXVhbHNpemUgPSAwLCBudmFscywgaTsKLQlBTHB2ICpxdWFscyA9IE5VTEw7Ci0JQUxwYXJhbUluZm8gcGluZm87Ci0JQUxwYXJhbUluZm8gKnF1YWxpbmZvID0gTlVMTDsKLQlQeU9iamVjdCAqcXVhbG9iaiA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEwsICppdGVtOworICAgIGludCByZXNvdXJjZSwgcGFyYW07CisgICAgQUx2YWx1ZSAqcmV0dXJuX3NldCA9IE5VTEw7CisgICAgaW50IHNldHNpemUgPSAzMiwgcXVhbHNpemUgPSAwLCBudmFscywgaTsKKyAgICBBTHB2ICpxdWFscyA9IE5VTEw7CisgICAgQUxwYXJhbUluZm8gcGluZm87CisgICAgQUxwYXJhbUluZm8gKnF1YWxpbmZvID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcXVhbG9iaiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEwsICppdGVtOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaXxPITpRdWVyeVZhbHVlcyIsICZyZXNvdXJjZSwgJnBhcmFtLAotCQkJICAgICAgJlB5TGlzdF9UeXBlLCAmcXVhbG9iaikpCi0JCXJldHVybiBOVUxMOwotCWlmIChxdWFsb2JqICE9IE5VTEwpIHsKLQkJcXVhbHNpemUgPSBweXRob24ycGFyYW1zKHJlc291cmNlLCBwYXJhbSwgcXVhbG9iaiwgJnF1YWxzLCAmcXVhbGluZm8pOwotCQlpZiAocXVhbHNpemUgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNldHNpemUgPSAzMjsKLQlyZXR1cm5fc2V0ID0gUHlNZW1fTkVXKEFMdmFsdWUsIHNldHNpemUpOwotCWlmIChyZXR1cm5fc2V0ID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBjbGVhbnVwOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpfE8hOlF1ZXJ5VmFsdWVzIiwgJnJlc291cmNlLCAmcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUxpc3RfVHlwZSwgJnF1YWxvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocXVhbG9iaiAhPSBOVUxMKSB7CisgICAgICAgIHF1YWxzaXplID0gcHl0aG9uMnBhcmFtcyhyZXNvdXJjZSwgcGFyYW0sIHF1YWxvYmosICZxdWFscywgJnF1YWxpbmZvKTsKKyAgICAgICAgaWYgKHF1YWxzaXplIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZXRzaXplID0gMzI7CisgICAgcmV0dXJuX3NldCA9IFB5TWVtX05FVyhBTHZhbHVlLCBzZXRzaXplKTsKKyAgICBpZiAocmV0dXJuX3NldCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAKICAgcmV0cnk6Ci0JbnZhbHMgPSBhbFF1ZXJ5VmFsdWVzKHJlc291cmNlLCBwYXJhbSwgcmV0dXJuX3NldCwgc2V0c2l6ZSwgcXVhbHMsIHF1YWxzaXplKTsKLQlpZiAobnZhbHMgPCAwKQotCQlnb3RvIGNsZWFudXA7Ci0JaWYgKG52YWxzID4gc2V0c2l6ZSkgewotCQlBTHZhbHVlICpvbGRfcmV0dXJuX3NldCA9IHJldHVybl9zZXQ7Ci0JCXNldHNpemUgPSBudmFsczsKLQkJUHlNZW1fUkVTSVpFKHJldHVybl9zZXQsIEFMdmFsdWUsIHNldHNpemUpOwotCQlpZiAocmV0dXJuX3NldCA9PSBOVUxMKSB7Ci0JCQlyZXR1cm5fc2V0ID0gb2xkX3JldHVybl9zZXQ7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JCWdvdG8gcmV0cnk7Ci0JfQorICAgIG52YWxzID0gYWxRdWVyeVZhbHVlcyhyZXNvdXJjZSwgcGFyYW0sIHJldHVybl9zZXQsIHNldHNpemUsIHF1YWxzLCBxdWFsc2l6ZSk7CisgICAgaWYgKG52YWxzIDwgMCkKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGlmIChudmFscyA+IHNldHNpemUpIHsKKyAgICAgICAgQUx2YWx1ZSAqb2xkX3JldHVybl9zZXQgPSByZXR1cm5fc2V0OworICAgICAgICBzZXRzaXplID0gbnZhbHM7CisgICAgICAgIFB5TWVtX1JFU0laRShyZXR1cm5fc2V0LCBBTHZhbHVlLCBzZXRzaXplKTsKKyAgICAgICAgaWYgKHJldHVybl9zZXQgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuX3NldCA9IG9sZF9yZXR1cm5fc2V0OworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KIAotCWlmIChhbEdldFBhcmFtSW5mbyhyZXNvdXJjZSwgcGFyYW0sICZwaW5mbykgPCAwKQotCQlnb3RvIGNsZWFudXA7CisgICAgaWYgKGFsR2V0UGFyYW1JbmZvKHJlc291cmNlLCBwYXJhbSwgJnBpbmZvKSA8IDApCisgICAgICAgIGdvdG8gY2xlYW51cDsKIAotCXJlcyA9IFB5TGlzdF9OZXcobnZhbHMpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJZ290byBjbGVhbnVwOwotCWZvciAoaSA9IDA7IGkgPCBudmFsczsgaSsrKSB7Ci0JCWl0ZW0gPSBwYXJhbTJweXRob24ocmVzb3VyY2UsIHBhcmFtLCByZXR1cm5fc2V0W2ldLCAmcGluZm8pOwotCQlpZiAoaXRlbSA9PSBOVUxMIHx8Ci0JCSAgICBQeUxpc3RfU2V0SXRlbShyZXMsIGksIGl0ZW0pIDwgMCkgewotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlyZXMgPSBOVUxMOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JfQorICAgIHJlcyA9IFB5TGlzdF9OZXcobnZhbHMpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGZvciAoaSA9IDA7IGkgPCBudmFsczsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBwYXJhbTJweXRob24ocmVzb3VyY2UsIHBhcmFtLCByZXR1cm5fc2V0W2ldLCAmcGluZm8pOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMIHx8CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShyZXMsIGksIGl0ZW0pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXMgPSBOVUxMOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgfQogCiAgIGNsZWFudXA6Ci0JaWYgKHJldHVybl9zZXQpCi0JCVB5TWVtX0RFTChyZXR1cm5fc2V0KTsKLQlpZiAocXVhbHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IHF1YWxzaXplOyBpKyspIHsKLQkJCXN3aXRjaCAocXVhbGluZm9baV0udmFsdWVUeXBlKSB7Ci0JCQljYXNlIEFMX1NFVF9WQUw6Ci0JCQljYXNlIEFMX1ZFQ1RPUl9WQUw6Ci0JCQkJUHlNZW1fREVMKHF1YWxzW2ldLnZhbHVlLnB0cik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJUHlNZW1fREVMKHF1YWxzKTsKLQkJUHlNZW1fREVMKHF1YWxpbmZvKTsKLQl9CisgICAgaWYgKHJldHVybl9zZXQpCisgICAgICAgIFB5TWVtX0RFTChyZXR1cm5fc2V0KTsKKyAgICBpZiAocXVhbHMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHF1YWxzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAocXVhbGluZm9baV0udmFsdWVUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEFMX1NFVF9WQUw6CisgICAgICAgICAgICBjYXNlIEFMX1ZFQ1RPUl9WQUw6CisgICAgICAgICAgICAgICAgUHlNZW1fREVMKHF1YWxzW2ldLnZhbHVlLnB0cik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlNZW1fREVMKHF1YWxzKTsKKyAgICAgICAgUHlNZW1fREVMKHF1YWxpbmZvKTsKKyAgICB9CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIFB5RG9jX1NUUlZBUihhbF9HZXRQYXJhbUluZm9fX2RvY19fLApAQCAtMTY4Niw4MSArMTY4Niw4MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX0dldFBhcmFtSW5mbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJlcywgcGFyYW07Ci0JQUxwYXJhbUluZm8gcGluZm87Ci0JUHlPYmplY3QgKnYsICppdGVtOworICAgIGludCByZXMsIHBhcmFtOworICAgIEFMcGFyYW1JbmZvIHBpbmZvOworICAgIFB5T2JqZWN0ICp2LCAqaXRlbTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6R2V0UGFyYW1JbmZvIiwgJnJlcywgJnBhcmFtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFsR2V0UGFyYW1JbmZvKHJlcywgcGFyYW0sICZwaW5mbykgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gUHlEaWN0X05ldygpOwotCWlmICghdikgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpHZXRQYXJhbUluZm8iLCAmcmVzLCAmcGFyYW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYWxHZXRQYXJhbUluZm8ocmVzLCBwYXJhbSwgJnBpbmZvKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCF2KSByZXR1cm4gTlVMTDsKIAotCWl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8ucmVzb3VyY2UpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJyZXNvdXJjZSIsIGl0ZW0pOwotCVB5X0RFQ1JFRihpdGVtKTsKKyAgICBpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLnJlc291cmNlKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAicmVzb3VyY2UiLCBpdGVtKTsKKyAgICBQeV9ERUNSRUYoaXRlbSk7CiAKLQlpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLnBhcmFtKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAicGFyYW0iLCBpdGVtKTsKLQlQeV9ERUNSRUYoaXRlbSk7CisgICAgaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5wYXJhbSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgInBhcmFtIiwgaXRlbSk7CisgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby52YWx1ZVR5cGUpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJ2YWx1ZVR5cGUiLCBpdGVtKTsKLQlQeV9ERUNSRUYoaXRlbSk7CisgICAgaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby52YWx1ZVR5cGUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJ2YWx1ZVR5cGUiLCBpdGVtKTsKKyAgICBQeV9ERUNSRUYoaXRlbSk7CiAKLQlpZiAocGluZm8udmFsdWVUeXBlICE9IEFMX05PX1ZBTCAmJiBwaW5mby52YWx1ZVR5cGUgIT0gQUxfU0NBTEFSX1ZBTCkgewotCQkvKiBtdWx0aXBsZSB2YWx1ZXMgKi8KLQkJaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5tYXhFbGVtcyk7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtYXhFbGVtcyIsIGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7CisgICAgaWYgKHBpbmZvLnZhbHVlVHlwZSAhPSBBTF9OT19WQUwgJiYgcGluZm8udmFsdWVUeXBlICE9IEFMX1NDQUxBUl9WQUwpIHsKKyAgICAgICAgLyogbXVsdGlwbGUgdmFsdWVzICovCisgICAgICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8ubWF4RWxlbXMpOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWF4RWxlbXMiLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JCWlmIChwaW5mby52YWx1ZVR5cGUgPT0gQUxfTUFUUklYX1ZBTCkgewotCQkJLyogMiBkaW1lbnNpb25hbCAqLwotCQkJaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5tYXhFbGVtczIpOwotCQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1heEVsZW1zMiIsIGl0ZW0pOwotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQl9Ci0JfQorICAgICAgICBpZiAocGluZm8udmFsdWVUeXBlID09IEFMX01BVFJJWF9WQUwpIHsKKyAgICAgICAgICAgIC8qIDIgZGltZW5zaW9uYWwgKi8KKyAgICAgICAgICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8ubWF4RWxlbXMyKTsKKyAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtYXhFbGVtczIiLCBpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgfQorICAgIH0KIAotCWl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8uZWxlbWVudFR5cGUpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJlbGVtZW50VHlwZSIsIGl0ZW0pOwotCVB5X0RFQ1JFRihpdGVtKTsKKyAgICBpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLmVsZW1lbnRUeXBlKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAiZWxlbWVudFR5cGUiLCBpdGVtKTsKKyAgICBQeV9ERUNSRUYoaXRlbSk7CiAKLQlpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwaW5mby5uYW1lKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibmFtZSIsIGl0ZW0pOwotCVB5X0RFQ1JFRihpdGVtKTsKKyAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwaW5mby5uYW1lKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibmFtZSIsIGl0ZW0pOworICAgIFB5X0RFQ1JFRihpdGVtKTsKIAotCWl0ZW0gPSBwYXJhbTJweXRob24ocmVzLCBwYXJhbSwgcGluZm8uaW5pdGlhbCwgJnBpbmZvKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAiaW5pdGlhbCIsIGl0ZW0pOwotCVB5X0RFQ1JFRihpdGVtKTsKKyAgICBpdGVtID0gcGFyYW0ycHl0aG9uKHJlcywgcGFyYW0sIHBpbmZvLmluaXRpYWwsICZwaW5mbyk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgImluaXRpYWwiLCBpdGVtKTsKKyAgICBQeV9ERUNSRUYoaXRlbSk7CiAKLQlpZiAocGluZm8uZWxlbWVudFR5cGUgIT0gQUxfRU5VTV9FTEVNICYmCi0JICAgIHBpbmZvLmVsZW1lbnRUeXBlICE9IEFMX1JFU09VUkNFX0VMRU0gJiYKLQkgICAgcGluZm8uZWxlbWVudFR5cGUgIT0gQUxfQ0hBUl9FTEVNKSB7Ci0JCS8qIHJhbmdlIHBhcmFtICovCi0JCWl0ZW0gPSBwYXJhbTJweXRob24ocmVzLCBwYXJhbSwgcGluZm8ubWluLCAmcGluZm8pOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWluIiwgaXRlbSk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKKyAgICBpZiAocGluZm8uZWxlbWVudFR5cGUgIT0gQUxfRU5VTV9FTEVNICYmCisgICAgICAgIHBpbmZvLmVsZW1lbnRUeXBlICE9IEFMX1JFU09VUkNFX0VMRU0gJiYKKyAgICAgICAgcGluZm8uZWxlbWVudFR5cGUgIT0gQUxfQ0hBUl9FTEVNKSB7CisgICAgICAgIC8qIHJhbmdlIHBhcmFtICovCisgICAgICAgIGl0ZW0gPSBwYXJhbTJweXRob24ocmVzLCBwYXJhbSwgcGluZm8ubWluLCAmcGluZm8pOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWluIiwgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKIAotCQlpdGVtID0gcGFyYW0ycHl0aG9uKHJlcywgcGFyYW0sIHBpbmZvLm1heCwgJnBpbmZvKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1heCIsIGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGl0ZW0gPSBwYXJhbTJweXRob24ocmVzLCBwYXJhbSwgcGluZm8ubWF4LCAmcGluZm8pOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWF4IiwgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKIAotCQlpdGVtID0gcGFyYW0ycHl0aG9uKHJlcywgcGFyYW0sIHBpbmZvLm1pbkRlbHRhLCAmcGluZm8pOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWluRGVsdGEiLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpdGVtID0gcGFyYW0ycHl0aG9uKHJlcywgcGFyYW0sIHBpbmZvLm1pbkRlbHRhLCAmcGluZm8pOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWluRGVsdGEiLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JCWl0ZW0gPSBwYXJhbTJweXRob24ocmVzLCBwYXJhbSwgcGluZm8ubWF4RGVsdGEsICZwaW5mbyk7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtYXhEZWx0YSIsIGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGl0ZW0gPSBwYXJhbTJweXRob24ocmVzLCBwYXJhbSwgcGluZm8ubWF4RGVsdGEsICZwaW5mbyk7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtYXhEZWx0YSIsIGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAKLQkJaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5zcGVjaWFsVmFscyk7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJzcGVjaWFsVmFscyIsIGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQorICAgICAgICBpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLnNwZWNpYWxWYWxzKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgInNwZWNpYWxWYWxzIiwgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CiAKLQlyZXR1cm4gdjsKKyAgICByZXR1cm4gdjsKIH0KIAogUHlEb2NfU1RSVkFSKGFsX0dldFJlc291cmNlQnlOYW1lX19kb2NfXywKQEAgLTE3NjksMTQgKzE3NjksMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9HZXRSZXNvdXJjZUJ5TmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJlcywgc3RhcnRfcmVzLCB0eXBlOwotCWNoYXIgKm5hbWU7CisgICAgaW50IHJlcywgc3RhcnRfcmVzLCB0eXBlOworICAgIGNoYXIgKm5hbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzaTpHZXRSZXNvdXJjZUJ5TmFtZSIsICZzdGFydF9yZXMsICZuYW1lLCAmdHlwZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgocmVzID0gYWxHZXRSZXNvdXJjZUJ5TmFtZShzdGFydF9yZXMsIG5hbWUsIHR5cGUpKSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHJlcyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpc2k6R2V0UmVzb3VyY2VCeU5hbWUiLCAmc3RhcnRfcmVzLCAmbmFtZSwgJnR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHJlcyA9IGFsR2V0UmVzb3VyY2VCeU5hbWUoc3RhcnRfcmVzLCBuYW1lLCB0eXBlKSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSByZXMpOwogfQogCiBQeURvY19TVFJWQVIoYWxfSXNTdWJ0eXBlX19kb2NfXywKQEAgLTE3ODUsMTEgKzE3ODUsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9Jc1N1YnR5cGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0eXBlLCBzdWJ0eXBlOworICAgIGludCB0eXBlLCBzdWJ0eXBlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpJc1N1YnR5cGUiLCAmdHlwZSwgJnN1YnR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGFsSXNTdWJ0eXBlKHR5cGUsIHN1YnR5cGUpKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOklzU3VidHlwZSIsICZ0eXBlLCAmc3VidHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgYWxJc1N1YnR5cGUodHlwZSwgc3VidHlwZSkpOwogfQogCiBQeURvY19TVFJWQVIoYWxfU2V0RXJyb3JIYW5kbGVyX19kb2NfXywgIiIpOwpAQCAtMTc5OCwxMCArMTc5OCwxMCBAQAogYWxfU2V0RXJyb3JIYW5kbGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOlNldEVycm9ySGFuZGxlciIpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6U2V0RXJyb3JIYW5kbGVyIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2VuZGlmIC8qIEFMX05PX0VMRU0gKi8KQEAgLTE4MTEsMTQ0ICsxODExLDE0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX29wZW5wb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lLCAqZGlyOwotCUFMcG9ydCBwb3J0OwotCWFsY29iamVjdCAqY29uZmlnID0gTlVMTDsKKyAgICBjaGFyICpuYW1lLCAqZGlyOworICAgIEFMcG9ydCBwb3J0OworICAgIGFsY29iamVjdCAqY29uZmlnID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3N8TyE6T3BlblBvcnQiLCAmbmFtZSwgJmRpciwgJkFsY3R5cGUsICZjb25maWcpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHBvcnQgPSBBTG9wZW5wb3J0KG5hbWUsIGRpciwgY29uZmlnID8gY29uZmlnLT5jb25maWcgOiBOVUxMKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ld2FscG9iamVjdChwb3J0KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzfE8hOk9wZW5Qb3J0IiwgJm5hbWUsICZkaXIsICZBbGN0eXBlLCAmY29uZmlnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChwb3J0ID0gQUxvcGVucG9ydChuYW1lLCBkaXIsIGNvbmZpZyA/IGNvbmZpZy0+Y29uZmlnIDogTlVMTCkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBuZXdhbHBvYmplY3QocG9ydCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9uZXdjb25maWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUFMY29uZmlnIGNvbmZpZzsKKyAgICBBTGNvbmZpZyBjb25maWc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpOZXdDb25maWciKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChjb25maWcgPSBBTG5ld2NvbmZpZyAoKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ld2FsY29iamVjdChjb25maWcpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOk5ld0NvbmZpZyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGNvbmZpZyA9IEFMbmV3Y29uZmlnICgpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmV3YWxjb2JqZWN0KGNvbmZpZyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9xdWVyeXBhcmFtcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBkZXZpY2U7Ci0JbG9uZyBsZW5ndGg7Ci0JbG9uZyAqUFZidWZmZXI7Ci0JbG9uZyBQVmR1bW15WzJdOwotCVB5T2JqZWN0ICp2ID0gTlVMTDsKLQlpbnQgaTsKKyAgICBsb25nIGRldmljZTsKKyAgICBsb25nIGxlbmd0aDsKKyAgICBsb25nICpQVmJ1ZmZlcjsKKyAgICBsb25nIFBWZHVtbXlbMl07CisgICAgUHlPYmplY3QgKnYgPSBOVUxMOworICAgIGludCBpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnF1ZXJ5cGFyYW1zIiwgJmRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgobGVuZ3RoID0gQUxxdWVyeXBhcmFtcyhkZXZpY2UsIFBWZHVtbXksIDJMKSkgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCWlmICgoUFZidWZmZXIgPSBQeU1lbV9ORVcobG9uZywgbGVuZ3RoKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKEFMcXVlcnlwYXJhbXMoZGV2aWNlLCBQVmJ1ZmZlciwgbGVuZ3RoKSA+PSAwICYmCi0JICAgICh2ID0gUHlMaXN0X05ldygoaW50KWxlbmd0aCkpICE9IE5VTEwpIHsKLQkJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJUHlMaXN0X1NldEl0ZW0odiwgaSwgUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pKTsKLQl9Ci0JUHlNZW1fREVMKFBWYnVmZmVyKTsKLQlyZXR1cm4gdjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6cXVlcnlwYXJhbXMiLCAmZGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChsZW5ndGggPSBBTHF1ZXJ5cGFyYW1zKGRldmljZSwgUFZkdW1teSwgMkwpKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChQVmJ1ZmZlciA9IFB5TWVtX05FVyhsb25nLCBsZW5ndGgpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoQUxxdWVyeXBhcmFtcyhkZXZpY2UsIFBWYnVmZmVyLCBsZW5ndGgpID49IDAgJiYKKyAgICAgICAgKHYgPSBQeUxpc3RfTmV3KChpbnQpbGVuZ3RoKSkgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbSh2LCBpLCBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSkpOworICAgIH0KKyAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9QYXJhbXMoUHlPYmplY3QgKmFyZ3MsIGludCAoKmZ1bmMpKGxvbmcsIGxvbmcgKiwgbG9uZyksIGludCBtb2RpZmllZCkKIHsKLQlsb25nIGRldmljZTsKLQlQeU9iamVjdCAqbGlzdCwgKnY7Ci0JbG9uZyAqUFZidWZmZXI7Ci0JbG9uZyBsZW5ndGg7Ci0JaW50IGk7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsTyEiLCAmZGV2aWNlLCAmUHlMaXN0X1R5cGUsICZsaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JbGVuZ3RoID0gUHlMaXN0X1NpemUobGlzdCk7Ci0JUFZidWZmZXIgPSBQeU1lbV9ORVcobG9uZywgbGVuZ3RoKTsKLQlpZiAoUFZidWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCXYgPSBQeUxpc3RfR2V0SXRlbShsaXN0LCBpKTsKLQkJaWYgKCFQeUludF9DaGVjayh2KSkgewotCQkJUHlNZW1fREVMKFBWYnVmZmVyKTsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQVmJ1ZmZlcltpXSA9IFB5SW50X0FzTG9uZyh2KTsKLQl9CisgICAgbG9uZyBkZXZpY2U7CisgICAgUHlPYmplY3QgKmxpc3QsICp2OworICAgIGxvbmcgKlBWYnVmZmVyOworICAgIGxvbmcgbGVuZ3RoOworICAgIGludCBpOwogCi0JaWYgKCgqZnVuYykoZGV2aWNlLCBQVmJ1ZmZlciwgbGVuZ3RoKSA9PSAtMSkgewotCQlQeU1lbV9ERUwoUFZidWZmZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsTyEiLCAmZGV2aWNlLCAmUHlMaXN0X1R5cGUsICZsaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGVuZ3RoID0gUHlMaXN0X1NpemUobGlzdCk7CisgICAgUFZidWZmZXIgPSBQeU1lbV9ORVcobG9uZywgbGVuZ3RoKTsKKyAgICBpZiAoUFZidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHYgPSBQeUxpc3RfR2V0SXRlbShsaXN0LCBpKTsKKyAgICAgICAgaWYgKCFQeUludF9DaGVjayh2KSkgeworICAgICAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQVmJ1ZmZlcltpXSA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICB9CiAKLQlpZiAobW9kaWZpZWQpIHsKLQkJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pKTsKLQl9CisgICAgaWYgKCgqZnVuYykoZGV2aWNlLCBQVmJ1ZmZlciwgbGVuZ3RoKSA9PSAtMSkgeworICAgICAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeU1lbV9ERUwoUFZidWZmZXIpOworICAgIGlmIChtb2RpZmllZCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSkpOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxfZ2V0cGFyYW1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9QYXJhbXMoYXJncywgQUxnZXRwYXJhbXMsIDEpOworICAgIHJldHVybiBkb1BhcmFtcyhhcmdzLCBBTGdldHBhcmFtcywgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9zZXRwYXJhbXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb1BhcmFtcyhhcmdzLCBBTHNldHBhcmFtcywgMCk7CisgICAgcmV0dXJuIGRvUGFyYW1zKGFyZ3MsIEFMc2V0cGFyYW1zLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX2dldG5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgZGV2aWNlLCBkZXNjcmlwdG9yOwotCWNoYXIgKm5hbWU7CisgICAgbG9uZyBkZXZpY2UsIGRlc2NyaXB0b3I7CisgICAgY2hhciAqbmFtZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGw6Z2V0bmFtZSIsICZkZXZpY2UsICZkZXNjcmlwdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChuYW1lID0gQUxnZXRuYW1lKGRldmljZSwgZGVzY3JpcHRvcikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGw6Z2V0bmFtZSIsICZkZXZpY2UsICZkZXNjcmlwdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChuYW1lID0gQUxnZXRuYW1lKGRldmljZSwgZGVzY3JpcHRvcikpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxfZ2V0ZGVmYXVsdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBkZXZpY2UsIGRlc2NyaXB0b3IsIHZhbHVlOworICAgIGxvbmcgZGV2aWNlLCBkZXNjcmlwdG9yLCB2YWx1ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGw6Z2V0ZGVmYXVsdCIsICZkZXZpY2UsICZkZXNjcmlwdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCh2YWx1ZSA9IEFMZ2V0ZGVmYXVsdChkZXZpY2UsIGRlc2NyaXB0b3IpKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsbDpnZXRkZWZhdWx0IiwgJmRldmljZSwgJmRlc2NyaXB0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHZhbHVlID0gQUxnZXRkZWZhdWx0KGRldmljZSwgZGVzY3JpcHRvcikpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX2dldG1pbm1heChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBkZXZpY2UsIGRlc2NyaXB0b3IsIG1pbiwgbWF4OworICAgIGxvbmcgZGV2aWNlLCBkZXNjcmlwdG9yLCBtaW4sIG1heDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGw6Z2V0bWlubWF4IiwgJmRldmljZSwgJmRlc2NyaXB0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQltaW4gPSAtMTsKLQltYXggPSAtMTsKLQlpZiAoQUxnZXRtaW5tYXgoZGV2aWNlLCBkZXNjcmlwdG9yLCAmbWluLCAmbWF4KSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgbWluLCBtYXgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGw6Z2V0bWlubWF4IiwgJmRldmljZSwgJmRlc2NyaXB0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtaW4gPSAtMTsKKyAgICBtYXggPSAtMTsKKyAgICBpZiAoQUxnZXRtaW5tYXgoZGV2aWNlLCBkZXNjcmlwdG9yLCAmbWluLCAmbWF4KSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgbWluLCBtYXgpOwogfQogCiAjZW5kaWYgLyogT0xEX0lOVEVSRkFDRSAqLwpAQCAtMTk1NiwzNCArMTk1NiwzNCBAQAogLyogTGlzdCBvZiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGFsX21ldGhvZHNbXSA9IHsKLSNpZmRlZiBBTF9OT19FTEVNCQkvKiBJUklYIDYgKi8KLQl7Ik5ld0NvbmZpZyIsCShQeUNGdW5jdGlvbilhbF9OZXdDb25maWcsCU1FVEhfVkFSQVJHUywJYWxfTmV3Q29uZmlnX19kb2NfX30sCi0JeyJPcGVuUG9ydCIsCShQeUNGdW5jdGlvbilhbF9PcGVuUG9ydCwJTUVUSF9WQVJBUkdTLAlhbF9PcGVuUG9ydF9fZG9jX199LAotCXsiQ29ubmVjdCIsCShQeUNGdW5jdGlvbilhbF9Db25uZWN0LAlNRVRIX1ZBUkFSR1MsCWFsX0Nvbm5lY3RfX2RvY19ffSwKLQl7IkRpc2Nvbm5lY3QiLAkoUHlDRnVuY3Rpb24pYWxfRGlzY29ubmVjdCwJTUVUSF9WQVJBUkdTLAlhbF9EaXNjb25uZWN0X19kb2NfX30sCi0JeyJHZXRQYXJhbXMiLAkoUHlDRnVuY3Rpb24pYWxfR2V0UGFyYW1zLAlNRVRIX1ZBUkFSR1MsCWFsX0dldFBhcmFtc19fZG9jX199LAotCXsiU2V0UGFyYW1zIiwJKFB5Q0Z1bmN0aW9uKWFsX1NldFBhcmFtcywJTUVUSF9WQVJBUkdTLAlhbF9TZXRQYXJhbXNfX2RvY19ffSwKLQl7IlF1ZXJ5VmFsdWVzIiwJKFB5Q0Z1bmN0aW9uKWFsX1F1ZXJ5VmFsdWVzLAlNRVRIX1ZBUkFSR1MsCWFsX1F1ZXJ5VmFsdWVzX19kb2NfX30sCi0JeyJHZXRQYXJhbUluZm8iLAkoUHlDRnVuY3Rpb24pYWxfR2V0UGFyYW1JbmZvLAlNRVRIX1ZBUkFSR1MsCWFsX0dldFBhcmFtSW5mb19fZG9jX199LAotCXsiR2V0UmVzb3VyY2VCeU5hbWUiLAkoUHlDRnVuY3Rpb24pYWxfR2V0UmVzb3VyY2VCeU5hbWUsCU1FVEhfVkFSQVJHUywJYWxfR2V0UmVzb3VyY2VCeU5hbWVfX2RvY19ffSwKLQl7IklzU3VidHlwZSIsCShQeUNGdW5jdGlvbilhbF9Jc1N1YnR5cGUsCU1FVEhfVkFSQVJHUywJYWxfSXNTdWJ0eXBlX19kb2NfX30sCisjaWZkZWYgQUxfTk9fRUxFTSAgICAgICAgICAgICAgIC8qIElSSVggNiAqLworICAgIHsiTmV3Q29uZmlnIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX05ld0NvbmZpZywgICAgICBNRVRIX1ZBUkFSR1MsICAgYWxfTmV3Q29uZmlnX19kb2NfX30sCisgICAgeyJPcGVuUG9ydCIsICAgICAgICAoUHlDRnVuY3Rpb24pYWxfT3BlblBvcnQsICAgICAgIE1FVEhfVkFSQVJHUywgICBhbF9PcGVuUG9ydF9fZG9jX199LAorICAgIHsiQ29ubmVjdCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX0Nvbm5lY3QsICAgICAgICBNRVRIX1ZBUkFSR1MsICAgYWxfQ29ubmVjdF9fZG9jX199LAorICAgIHsiRGlzY29ubmVjdCIsICAgICAgKFB5Q0Z1bmN0aW9uKWFsX0Rpc2Nvbm5lY3QsICAgICBNRVRIX1ZBUkFSR1MsICAgYWxfRGlzY29ubmVjdF9fZG9jX199LAorICAgIHsiR2V0UGFyYW1zIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX0dldFBhcmFtcywgICAgICBNRVRIX1ZBUkFSR1MsICAgYWxfR2V0UGFyYW1zX19kb2NfX30sCisgICAgeyJTZXRQYXJhbXMiLCAgICAgICAoUHlDRnVuY3Rpb24pYWxfU2V0UGFyYW1zLCAgICAgIE1FVEhfVkFSQVJHUywgICBhbF9TZXRQYXJhbXNfX2RvY19ffSwKKyAgICB7IlF1ZXJ5VmFsdWVzIiwgICAgIChQeUNGdW5jdGlvbilhbF9RdWVyeVZhbHVlcywgICAgTUVUSF9WQVJBUkdTLCAgIGFsX1F1ZXJ5VmFsdWVzX19kb2NfX30sCisgICAgeyJHZXRQYXJhbUluZm8iLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbF9HZXRQYXJhbUluZm8sICAgTUVUSF9WQVJBUkdTLCAgIGFsX0dldFBhcmFtSW5mb19fZG9jX199LAorICAgIHsiR2V0UmVzb3VyY2VCeU5hbWUiLCAgICAgICAoUHlDRnVuY3Rpb24pYWxfR2V0UmVzb3VyY2VCeU5hbWUsICAgICAgTUVUSF9WQVJBUkdTLCAgIGFsX0dldFJlc291cmNlQnlOYW1lX19kb2NfX30sCisgICAgeyJJc1N1YnR5cGUiLCAgICAgICAoUHlDRnVuY3Rpb24pYWxfSXNTdWJ0eXBlLCAgICAgIE1FVEhfVkFSQVJHUywgICBhbF9Jc1N1YnR5cGVfX2RvY19ffSwKICNpZiAwCi0JLyogdGhpcyBvbmUgbm90IHN1cHBvcnRlZCAqLwotCXsiU2V0RXJyb3JIYW5kbGVyIiwJKFB5Q0Z1bmN0aW9uKWFsX1NldEVycm9ySGFuZGxlciwJTUVUSF9WQVJBUkdTLAlhbF9TZXRFcnJvckhhbmRsZXJfX2RvY19ffSwKKyAgICAvKiB0aGlzIG9uZSBub3Qgc3VwcG9ydGVkICovCisgICAgeyJTZXRFcnJvckhhbmRsZXIiLCAgICAgICAgIChQeUNGdW5jdGlvbilhbF9TZXRFcnJvckhhbmRsZXIsICAgICAgICBNRVRIX1ZBUkFSR1MsICAgYWxfU2V0RXJyb3JIYW5kbGVyX19kb2NfX30sCiAjZW5kaWYKICNlbmRpZiAvKiBBTF9OT19FTEVNICovCiAjaWZkZWYgT0xEX0lOVEVSRkFDRQotCXsib3BlbnBvcnQiLAkJKFB5Q0Z1bmN0aW9uKWFsX29wZW5wb3J0LAlNRVRIX1ZBUkFSR1N9LAotCXsibmV3Y29uZmlnIiwJCShQeUNGdW5jdGlvbilhbF9uZXdjb25maWcsCU1FVEhfVkFSQVJHU30sCi0JeyJxdWVyeXBhcmFtcyIsCQkoUHlDRnVuY3Rpb24pYWxfcXVlcnlwYXJhbXMsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXRwYXJhbXMiLAkJKFB5Q0Z1bmN0aW9uKWFsX2dldHBhcmFtcywJTUVUSF9WQVJBUkdTfSwKLQl7InNldHBhcmFtcyIsCQkoUHlDRnVuY3Rpb24pYWxfc2V0cGFyYW1zLAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0bmFtZSIsCQkoUHlDRnVuY3Rpb24pYWxfZ2V0bmFtZSwJTUVUSF9WQVJBUkdTfSwKLQl7ImdldGRlZmF1bHQiLAkJKFB5Q0Z1bmN0aW9uKWFsX2dldGRlZmF1bHQsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXRtaW5tYXgiLAkJKFB5Q0Z1bmN0aW9uKWFsX2dldG1pbm1heCwJTUVUSF9WQVJBUkdTfSwKKyAgICB7Im9wZW5wb3J0IiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX29wZW5wb3J0LCAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsibmV3Y29uZmlnIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxfbmV3Y29uZmlnLCAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJxdWVyeXBhcmFtcyIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbF9xdWVyeXBhcmFtcywgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHBhcmFtcyIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX2dldHBhcmFtcywgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0cGFyYW1zIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxfc2V0cGFyYW1zLCAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRuYW1lIiwgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbF9nZXRuYW1lLCAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGRlZmF1bHQiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX2dldGRlZmF1bHQsICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0bWlubWF4IiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxfZ2V0bWlubWF4LCAgICAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYgLyogT0xEX0lOVEVSRkFDRSAqLwogCi0Je05VTEwsCSAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfSAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTE5OTQsMTIzOSArMTk5NCwxMjM5IEBACiB2b2lkCiBpbml0YWwodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp4OworICAgIFB5T2JqZWN0ICptLCAqZCwgKng7CiAKLQlpZiAoUHlFcnJfV2FyblB5M2soInRoZSBhbCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCi0JICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQotCSAgICByZXR1cm47CQorICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGFsIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlNCgiYWwiLCBhbF9tZXRob2RzLAotCQlhbF9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKLQkJKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgiYWwiLCBhbF9tZXRob2RzLAorICAgICAgICBhbF9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKKyAgICAgICAgKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlFcnJvck9iamVjdCA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYWwuZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBFcnJvck9iamVjdCk7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBFcnJvck9iamVjdCA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYWwuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBFcnJvck9iamVjdCk7CiAKLQkvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLworICAgIC8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCiAjaWZkZWYgQUxfNENIQU5ORUwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF80Q0hBTk5FTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9VUkNIQU5ORUwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMXzRDSEFOTkVMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1VSQ0hBTk5FTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9BREFUX0lGX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BREFUX0lGX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFEQVRfSUZfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQURBVF9JRl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBREFUX0lGX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQURBVF9NQ0xLX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BREFUX01DTEtfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQURBVF9NQ0xLX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FEQVRfTUNMS19UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBREFUX01DTEtfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9BRVNfSUZfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FFU19JRl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBRVNfSUZfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQUVTX0lGX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFFU19JRl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0FFU19NQ0xLX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BRVNfTUNMS19UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBRVNfTUNMS19UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BRVNfTUNMS19UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBRVNfTUNMS19UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0FOQUxPR19JRl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQU5BTE9HX0lGX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFOQUxPR19JRl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BTkFMT0dfSUZfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQU5BTE9HX0lGX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQVNTT0NJQVRFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQVNTT0NJQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBU1NPQ0lBVEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FTU09DSUFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVNTT0NJQVRFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9CVUZGRVJfTlVMTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9CVUZGRVJfTlVMTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9OVUxMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQlVGRkVSX05VTEwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfTlVMTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfQlVGRkVSTEVOR1RICi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0JVRkZFUkxFTkdUSCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUkxFTkdUSCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0JVRkZFUkxFTkdUSCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUkxFTkdUSCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfQlVGRkVSTEVOR1RIX05FRwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9CVUZGRVJMRU5HVEhfTkVHKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSTEVOR1RIX05FRyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0JVRkZFUkxFTkdUSF9ORUcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJMRU5HVEhfTkVHIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9CVUZGRVJMRU5HVEhfT0RECi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0JVRkZFUkxFTkdUSF9PREQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJMRU5HVEhfT0REIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQlVGRkVSTEVOR1RIX09ERCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUkxFTkdUSF9PREQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0NIQU5ORUxTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0NIQU5ORUxTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ0hBTk5FTFMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9DSEFOTkVMUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0NIQU5ORUxTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9DT05GSUcKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQ09ORklHKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09ORklHIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQ09ORklHKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09ORklHIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9DT1VOVF9ORUcKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQ09VTlRfTkVHKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09VTlRfTkVHIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQ09VTlRfTkVHKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09VTlRfTkVHIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9ERVZJQ0UKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfREVWSUNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfREVWSUNFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfREVWSUNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfREVWSUNFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9ERVZJQ0VfQUNDRVNTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0RFVklDRV9BQ0NFU1MpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9ERVZJQ0VfQUNDRVNTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfREVWSUNFX0FDQ0VTUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0RFVklDRV9BQ0NFU1MiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0RJUkVDVElPTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9ESVJFQ1RJT04pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9ESVJFQ1RJT04iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9ESVJFQ1RJT04pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9ESVJFQ1RJT04iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0ZJTExQT0lOVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9GSUxMUE9JTlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9GSUxMUE9JTlQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9GSUxMUE9JTlQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9GSUxMUE9JTlQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0ZMT0FUTUFYCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0ZMT0FUTUFYKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRkxPQVRNQVgiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9GTE9BVE1BWCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0ZMT0FUTUFYIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9JTExFR0FMX1NUQVRFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0lMTEVHQUxfU1RBVEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9JTExFR0FMX1NUQVRFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfSUxMRUdBTF9TVEFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0lMTEVHQUxfU1RBVEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX05PX1BPUlRTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX05PX1BPUlRTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTk9fUE9SVFMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9OT19QT1JUUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX05PX1BPUlRTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9OT1RfRk9VTkQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfTk9UX0ZPVU5EKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTk9UX0ZPVU5EIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfTk9UX0ZPVU5EKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTk9UX0ZPVU5EIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9OT1RfSU1QTEVNRU5URUQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfTk9UX0lNUExFTUVOVEVEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTk9UX0lNUExFTUVOVEVEIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfTk9UX0lNUExFTUVOVEVEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTk9UX0lNUExFTUVOVEVEIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9PVVRfT0ZfTUVNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX09VVF9PRl9NRU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9PVVRfT0ZfTUVNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfT1VUX09GX01FTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX09VVF9PRl9NRU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX1BBUkFNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1BBUkFNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEFSQU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9QQVJBTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BBUkFNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9QRVJNSVNTSU9OUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9QRVJNSVNTSU9OUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BFUk1JU1NJT05TIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUEVSTUlTU0lPTlMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QRVJNSVNTSU9OUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfUE9SVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9QT1JUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUE9SVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1BPUlQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QT1JUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9QT1JUU1RZTEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUE9SVFNUWUxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUE9SVFNUWUxFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUE9SVFNUWUxFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUE9SVFNUWUxFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9QVkJVRkZFUgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9QVkJVRkZFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BWQlVGRkVSIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUFZCVUZGRVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QVkJVRkZFUiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfUVNJWkUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUVNJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9RU0laRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1FTSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUVNJWkUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX1JBVEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUkFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1JBVEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9SQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUkFURSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfUkVTT1VSQ0UKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUkVTT1VSQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9SRVNPVVJDRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1JFU09VUkNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUkVTT1VSQ0UiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX1NBTVBGTVQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfU0FNUEZNVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1NBTVBGTVQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9TQU1QRk1UKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfU0FNUEZNVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfVFJBTlNGRVJfU0laRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9UUkFOU0ZFUl9TSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfVFJBTlNGRVJfU0laRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1RSQU5TRkVSX1NJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9UUkFOU0ZFUl9TSVpFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9XSURUSAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9XSURUSCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1dJRFRIIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfV0lEVEgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9XSURUSCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9DSEFOTkVMX01PREUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DSEFOTkVMX01PREUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNIQU5ORUxfTU9ERSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ0hBTk5FTF9NT0RFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDSEFOTkVMX01PREUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQ0hBTk5FTFMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DSEFOTkVMUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hBTk5FTFMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NIQU5ORUxTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDSEFOTkVMUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9DSEFSX0VMRU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DSEFSX0VMRU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNIQVJfRUxFTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ0hBUl9FTEVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDSEFSX0VMRU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQ0xPQ0tfR0VOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ0xPQ0tfR0VOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDTE9DS19HRU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NMT0NLX0dFTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0xPQ0tfR0VOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0NMT0NLR0VOX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DTE9DS0dFTl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDTE9DS0dFTl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DTE9DS0dFTl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDTE9DS0dFTl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0NPTk5FQ1QKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DT05ORUNUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT05ORUNUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DT05ORUNUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT05ORUNUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0NPTk5FQ1RJT05fVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NPTk5FQ1RJT05fVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09OTkVDVElPTl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DT05ORUNUSU9OX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTk5FQ1RJT05fVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9DT05ORUNUSU9OUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NPTk5FQ1RJT05TKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT05ORUNUSU9OUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ09OTkVDVElPTlMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTk5FQ1RJT05TIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0NSWVNUQUxfTUNMS19UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ1JZU1RBTF9NQ0xLX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNSWVNUQUxfTUNMS19UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DUllTVEFMX01DTEtfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ1JZU1RBTF9NQ0xLX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfREVGQVVMVF9ERVZJQ0UKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERUZBVUxUX0RFVklDRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVGQVVMVF9ERVZJQ0UiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFRkFVTFRfREVWSUNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERUZBVUxUX0RFVklDRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9ERUZBVUxUX0lOUFVUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVGQVVMVF9JTlBVVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVGQVVMVF9JTlBVVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVGQVVMVF9JTlBVVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVGQVVMVF9JTlBVVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9ERUZBVUxUX09VVFBVVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFRkFVTFRfT1VUUFVUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERUZBVUxUX09VVFBVVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVGQVVMVF9PVVRQVVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFRkFVTFRfT1VUUFVUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0RFU1QKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERVNUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERVNUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERVNUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERVNUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0RFVklDRV9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVWSUNFX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFVklDRV9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERVZJQ0VfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVWSUNFX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfREVWSUNFUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFVklDRVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFVklDRVMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFVklDRVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFVklDRVMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRElHSVRBTF9JRl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRElHSVRBTF9JRl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJESUdJVEFMX0lGX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RJR0lUQUxfSUZfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRElHSVRBTF9JRl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0RJR0lUQUxfSU5QVVRfUkFURQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RJR0lUQUxfSU5QVVRfUkFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRElHSVRBTF9JTlBVVF9SQVRFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ESUdJVEFMX0lOUFVUX1JBVEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRJR0lUQUxfSU5QVVRfUkFURSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9ESVNDT05ORUNUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRElTQ09OTkVDVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRElTQ09OTkVDVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRElTQ09OTkVDVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRElTQ09OTkVDVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9FTlVNX0VMRU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FTlVNX0VMRU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVOVU1fRUxFTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRU5VTV9FTEVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTlVNX0VMRU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRU5VTV9WQUxVRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VOVU1fVkFMVUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVOVU1fVkFMVUUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VOVU1fVkFMVUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVOVU1fVkFMVUUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRVJST1JfSU5QVVRfT1ZFUkZMT1cKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9JTlBVVF9PVkVSRkxPVyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfSU5QVVRfT1ZFUkZMT1ciLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX0lOUFVUX09WRVJGTE9XKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9JTlBVVF9PVkVSRkxPVyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9FUlJPUl9MRU5HVEgKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9MRU5HVEgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX0xFTkdUSCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfTEVOR1RIKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9MRU5HVEgiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRVJST1JfTE9DQVRJT05fTFNQCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfTE9DQVRJT05fTFNQKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9MT0NBVElPTl9MU1AiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX0xPQ0FUSU9OX0xTUCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfTE9DQVRJT05fTFNQIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0VSUk9SX0xPQ0FUSU9OX01TUAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX0xPQ0FUSU9OX01TUCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfTE9DQVRJT05fTVNQIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9MT0NBVElPTl9NU1ApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX0xPQ0FUSU9OX01TUCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9FUlJPUl9OVU1CRVIKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9OVU1CRVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX05VTUJFUiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfTlVNQkVSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9OVU1CRVIiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRVJST1JfT1VUUFVUX1VOREVSRkxPVwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX09VVFBVVF9VTkRFUkZMT1cpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX09VVFBVVF9VTkRFUkZMT1ciLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX09VVFBVVF9VTkRFUkZMT1cpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX09VVFBVVF9VTkRFUkZMT1ciLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRVJST1JfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRklYRURfRUxFTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0ZJWEVEX0VMRU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZJWEVEX0VMRU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0ZJWEVEX0VMRU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZJWEVEX0VMRU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRklYRURfTUNMS19UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRklYRURfTUNMS19UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGSVhFRF9NQ0xLX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0ZJWEVEX01DTEtfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRklYRURfTUNMS19UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0dBSU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9HQUlOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHQUlOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9HQUlOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHQUlOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0dBSU5fUkVGCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfR0FJTl9SRUYpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkdBSU5fUkVGIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9HQUlOX1JFRik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiR0FJTl9SRUYiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSFJCX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9IUkJfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSFJCX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0hSQl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIUkJfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlBVVF9DT1VOVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX0NPVU5UKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9DT1VOVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfQ09VTlQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX0NPVU5UIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOUFVUX0RFVklDRV9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfREVWSUNFX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX0RFVklDRV9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9ERVZJQ0VfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfREVWSUNFX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5QVVRfRElHSVRBTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX0RJR0lUQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX0RJR0lUQUwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX0RJR0lUQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX0RJR0lUQUwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5QVVRfSFJCX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9IUkJfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfSFJCX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX0hSQl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9IUkJfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlBVVF9MSU5FCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfTElORSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfTElORSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfTElORSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfTElORSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlBVVF9NSUMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9NSUMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX01JQyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfTUlDKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9NSUMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5QVVRfUE9SVF9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfUE9SVF9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9QT1JUX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX1BPUlRfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfUE9SVF9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOUFVUX1JBVEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9SQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9SQVRFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9SQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9SQVRFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOUFVUX1NPVVJDRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX1NPVVJDRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfU09VUkNFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9TT1VSQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX1NPVVJDRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlQzMl9FTEVNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5UMzJfRUxFTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5UMzJfRUxFTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5UMzJfRUxFTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5UMzJfRUxFTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlQ2NF9FTEVNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5UNjRfRUxFTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5UNjRfRUxFTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5UNjRfRUxFTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5UNjRfRUxFTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlRFUkZBQ0UKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlRFUkZBQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVEVSRkFDRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5URVJGQUNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRFUkZBQ0UiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5URVJGQUNFX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlRFUkZBQ0VfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5URVJGQUNFX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVEVSRkFDRV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRFUkZBQ0VfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlZBTElEX1BBUkFNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5WQUxJRF9QQVJBTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5WQUxJRF9QQVJBTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5WQUxJRF9QQVJBTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5WQUxJRF9QQVJBTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlZBTElEX1ZBTFVFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5WQUxJRF9WQUxVRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5WQUxJRF9WQUxVRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5WQUxJRF9WQUxVRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5WQUxJRF9WQUxVRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9KSVRURVIKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9KSVRURVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpJVFRFUiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSklUVEVSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKSVRURVIiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTEFCRUwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MQUJFTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEFCRUwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xBQkVMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMQUJFTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9MRUZUX0lOUFVUX0FUVEVOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEVGVF9JTlBVVF9BVFRFTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEVGVF9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEVGVF9JTlBVVF9BVFRFTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEVGVF9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9MRUZUX01PTklUT1JfQVRURU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MRUZUX01PTklUT1JfQVRURU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxFRlRfTU9OSVRPUl9BVFRFTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEVGVF9NT05JVE9SX0FUVEVOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMRUZUX01PTklUT1JfQVRURU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTEVGVF9TUEVBS0VSX0dBSU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MRUZUX1NQRUFLRVJfR0FJTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEVGVF9TUEVBS0VSX0dBSU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xFRlRfU1BFQUtFUl9HQUlOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMRUZUX1NQRUFLRVJfR0FJTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9MRUZUMV9JTlBVVF9BVFRFTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xFRlQxX0lOUFVUX0FUVEVOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMRUZUMV9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEVGVDFfSU5QVVRfQVRURU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxFRlQxX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0xFRlQyX0lOUFVUX0FUVEVOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEVGVDJfSU5QVVRfQVRURU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxFRlQyX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MRUZUMl9JTlBVVF9BVFRFTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEVGVDJfSU5QVVRfQVRURU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTElORV9JRl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTElORV9JRl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMSU5FX0lGX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xJTkVfSUZfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTElORV9JRl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0xPQ0tFRAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xPQ0tFRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTE9DS0VEIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MT0NLRUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxPQ0tFRCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NQVNURVJfQ0xPQ0sKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVNURVJfQ0xPQ0spOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BU1RFUl9DTE9DSyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFTVEVSX0NMT0NLKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVNURVJfQ0xPQ0siLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTUFUUklYX1ZBTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BVFJJWF9WQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BVFJJWF9WQUwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BVFJJWF9WQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BVFJJWF9WQUwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTUFYX0VSUk9SCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX0VSUk9SKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfRVJST1IiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9FUlJPUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX0VSUk9SIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01BWF9FVkVOVF9QQVJBTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9FVkVOVF9QQVJBTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX0VWRU5UX1BBUkFNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfRVZFTlRfUEFSQU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9FVkVOVF9QQVJBTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NQVhfUEJVRlNJWkUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfUEJVRlNJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9QQlVGU0laRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX1BCVUZTSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfUEJVRlNJWkUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTUFYX1BPUlRTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX1BPUlRTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfUE9SVFMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9QT1JUUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX1BPUlRTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01BWF9SRVNPVVJDRV9JRAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9SRVNPVVJDRV9JRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX1JFU09VUkNFX0lEIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfUkVTT1VSQ0VfSUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9SRVNPVVJDRV9JRCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NQVhfU0VUU0laRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9TRVRTSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfU0VUU0laRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX1NFVFNJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9TRVRTSVpFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01BWF9TVFJMRU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfU1RSTEVOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfU1RSTEVOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfU1RSTEVOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfU1RSTEVOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01DTEtfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01DTEtfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUNMS19UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQ0xLX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1DTEtfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NSUNfSUZfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01JQ19JRl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNSUNfSUZfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUlDX0lGX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1JQ19JRl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01PTklUT1JfQ1RMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTU9OSVRPUl9DVEwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1PTklUT1JfQ1RMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NT05JVE9SX0NUTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OSVRPUl9DVEwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTU9OSVRPUl9PRkYKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NT05JVE9SX09GRik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OSVRPUl9PRkYiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01PTklUT1JfT0ZGKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNT05JVE9SX09GRiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NT05JVE9SX09OCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTU9OSVRPUl9PTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OSVRPUl9PTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTU9OSVRPUl9PTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OSVRPUl9PTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NT05PCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTU9OTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OTyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTU9OTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OTyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NVVRFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTVVURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVVURSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTVVURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVVURSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9OQU1FCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTkFNRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTkFNRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTkFNRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTkFNRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9ORUdfSU5GSU5JVFkKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ORUdfSU5GSU5JVFkpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5FR19JTkZJTklUWSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTkVHX0lORklOSVRZKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJORUdfSU5GSU5JVFkiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTkVHX0lORklOSVRZX0JJVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05FR19JTkZJTklUWV9CSVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5FR19JTkZJTklUWV9CSVQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05FR19JTkZJTklUWV9CSVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5FR19JTkZJTklUWV9CSVQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTk9fQ0hBTkdFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fQ0hBTkdFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19DSEFOR0UiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX0NIQU5HRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fQ0hBTkdFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX05PX0NIQU5HRV9CSVQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19DSEFOR0VfQklUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19DSEFOR0VfQklUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19DSEFOR0VfQklUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19DSEFOR0VfQklUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX05PX0VMRU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19FTEVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19FTEVNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19FTEVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19FTEVNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX05PX0VSUk9SUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX0VSUk9SUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fRVJST1JTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19FUlJPUlMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX0VSUk9SUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9OT19PUAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX09QKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19PUCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fT1ApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX09QIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX05PX1ZBTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX1ZBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fVkFMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19WQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX1ZBTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9OVUxMX0lOVEVSRkFDRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05VTExfSU5URVJGQUNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVUxMX0lOVEVSRkFDRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTlVMTF9JTlRFUkZBQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5VTExfSU5URVJGQUNFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX05VTExfUkVTT1VSQ0UKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OVUxMX1JFU09VUkNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVUxMX1JFU09VUkNFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OVUxMX1JFU09VUkNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVUxMX1JFU09VUkNFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX09QVElDQUxfSUZfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09QVElDQUxfSUZfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1BUSUNBTF9JRl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PUFRJQ0FMX0lGX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9QVElDQUxfSUZfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9PVVRQVVRfQ09VTlQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PVVRQVVRfQ09VTlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9VVFBVVF9DT1VOVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1VUUFVUX0NPVU5UKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPVVRQVVRfQ09VTlQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfT1VUUFVUX0RFVklDRV9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1VUUFVUX0RFVklDRV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPVVRQVVRfREVWSUNFX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09VVFBVVF9ERVZJQ0VfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1VUUFVUX0RFVklDRV9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX09VVFBVVF9IUkJfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09VVFBVVF9IUkJfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1VUUFVUX0hSQl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PVVRQVVRfSFJCX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9VVFBVVF9IUkJfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9PVVRQVVRfUE9SVF9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1VUUFVUX1BPUlRfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1VUUFVUX1BPUlRfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1VUUFVUX1BPUlRfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1VUUFVUX1BPUlRfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9PVVRQVVRfUkFURQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09VVFBVVF9SQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPVVRQVVRfUkFURSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1VUUFVUX1JBVEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9VVFBVVF9SQVRFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1BBUkFNX0JJVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BBUkFNX0JJVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUEFSQU1fQklUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QQVJBTV9CSVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBBUkFNX0JJVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9QQVJBTVMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QQVJBTVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBBUkFNUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUEFSQU1TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQQVJBTVMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUE9SVF9DT1VOVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BPUlRfQ09VTlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBPUlRfQ09VTlQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BPUlRfQ09VTlQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBPUlRfQ09VTlQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUE9SVF9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUE9SVF9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQT1JUX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BPUlRfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUE9SVF9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1BPUlRTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUE9SVFMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBPUlRTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QT1JUUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUE9SVFMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUE9SVFNUWUxFX0RJUkVDVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BPUlRTVFlMRV9ESVJFQ1QpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBPUlRTVFlMRV9ESVJFQ1QiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BPUlRTVFlMRV9ESVJFQ1QpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBPUlRTVFlMRV9ESVJFQ1QiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUE9SVFNUWUxFX1NFUklBTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BPUlRTVFlMRV9TRVJJQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBPUlRTVFlMRV9TRVJJQUwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BPUlRTVFlMRV9TRVJJQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBPUlRTVFlMRV9TRVJJQUwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUFJJTlRfRVJST1JTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUFJJTlRfRVJST1JTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQUklOVF9FUlJPUlMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BSSU5UX0VSUk9SUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUFJJTlRfRVJST1JTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1BUUl9FTEVNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUFRSX0VMRU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBUUl9FTEVNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QVFJfRUxFTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUFRSX0VMRU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFOR0VfVkFMVUUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQU5HRV9WQUxVRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFOR0VfVkFMVUUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBTkdFX1ZBTFVFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQU5HRV9WQUxVRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFXzExMDI1Ci0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV8xMTAyNSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV8xMTAyNSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV8xMTAyNSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV8xMTAyNSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFXzE2MDAwCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV8xNjAwMCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV8xNjAwMCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV8xNjAwMCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV8xNjAwMCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFXzIyMDUwCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV8yMjA1MCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV8yMjA1MCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV8yMjA1MCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV8yMjA1MCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFXzMyMDAwCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV8zMjAwMCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV8zMjAwMCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV8zMjAwMCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV8zMjAwMCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFXzQ0MTAwCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV80NDEwMCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV80NDEwMCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV80NDEwMCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV80NDEwMCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFXzQ4MDAwCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV80ODAwMCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV80ODAwMCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV80ODAwMCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV80ODAwMCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFXzgwMDAKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFXzgwMDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfODAwMCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV84MDAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzgwMDAiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9BRVNfMQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzEpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzEiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzEpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzEiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9BRVNfMXMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU18xcyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfMXMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzFzKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU18xcyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX0FFU18yCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfMik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfMiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfMik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfMiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX0FFU18zCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfMyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfMyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfMyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfMyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX0FFU180Ci0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfNCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfNCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfNCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfNCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX0FFU182Ci0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfNik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfNiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfNik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfNiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX0ZSQUNUSU9OX0QKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0ZSQUNUSU9OX0QpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfRlJBQ1RJT05fRCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9GUkFDVElPTl9EKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0ZSQUNUSU9OX0QiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9GUkFDVElPTl9OCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9GUkFDVElPTl9OKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0ZSQUNUSU9OX04iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfRlJBQ1RJT05fTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9GUkFDVElPTl9OIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfSU5QVVRSQVRFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9JTlBVVFJBVEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfSU5QVVRSQVRFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0lOUFVUUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9JTlBVVFJBVEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9OT19ESUdJVEFMX0lOUFVUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9OT19ESUdJVEFMX0lOUFVUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX05PX0RJR0lUQUxfSU5QVVQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfTk9fRElHSVRBTF9JTlBVVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9OT19ESUdJVEFMX0lOUFVUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfVU5BQ1FVSVJFRAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfVU5BQ1FVSVJFRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9VTkFDUVVJUkVEIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX1VOQUNRVUlSRUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfVU5BQ1FVSVJFRCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX1VOREVGSU5FRAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfVU5ERUZJTkVEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX1VOREVGSU5FRCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9VTkRFRklORUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfVU5ERUZJTkVEIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JFRl8wREJWCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVGXzBEQlYpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFRl8wREJWIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRUZfMERCVik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVGXzBEQlYiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkVGX05PTkUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRUZfTk9ORSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVGX05PTkUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFRl9OT05FKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRUZfTk9ORSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SRVNFUlZFRDFfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU0VSVkVEMV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNFUlZFRDFfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTRVJWRUQxX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU0VSVkVEMV9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JFU0VSVkVEMl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTRVJWRUQyX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU0VSVkVEMl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNFUlZFRDJfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTRVJWRUQyX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkVTRVJWRUQzX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNFUlZFRDNfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTRVJWRUQzX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU0VSVkVEM19UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNFUlZFRDNfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SRVNFUlZFRDRfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU0VSVkVENF9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNFUlZFRDRfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTRVJWRUQ0X1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU0VSVkVENF9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JFU09VUkNFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTT1VSQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU09VUkNFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNPVVJDRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTT1VSQ0UiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkVTT1VSQ0VfRUxFTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU09VUkNFX0VMRU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU09VUkNFX0VMRU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU09VUkNFX0VMRU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU09VUkNFX0VMRU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkVTT1VSQ0VfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU09VUkNFX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU09VUkNFX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU09VUkNFX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU09VUkNFX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUklHSFRfSU5QVVRfQVRURU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SSUdIVF9JTlBVVF9BVFRFTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUklHSFRfSU5QVVRfQVRURU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JJR0hUX0lOUFVUX0FUVEVOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSSUdIVF9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SSUdIVF9NT05JVE9SX0FUVEVOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUklHSFRfTU9OSVRPUl9BVFRFTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUklHSFRfTU9OSVRPUl9BVFRFTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUklHSFRfTU9OSVRPUl9BVFRFTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUklHSFRfTU9OSVRPUl9BVFRFTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SSUdIVF9TUEVBS0VSX0dBSU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SSUdIVF9TUEVBS0VSX0dBSU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJJR0hUX1NQRUFLRVJfR0FJTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUklHSFRfU1BFQUtFUl9HQUlOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSSUdIVF9TUEVBS0VSX0dBSU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUklHSFQxX0lOUFVUX0FUVEVOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUklHSFQxX0lOUFVUX0FUVEVOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSSUdIVDFfSU5QVVRfQVRURU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JJR0hUMV9JTlBVVF9BVFRFTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUklHSFQxX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JJR0hUMl9JTlBVVF9BVFRFTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JJR0hUMl9JTlBVVF9BVFRFTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUklHSFQyX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SSUdIVDJfSU5QVVRfQVRURU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJJR0hUMl9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TQU1QRk1UX0RPVUJMRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBGTVRfRE9VQkxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QRk1UX0RPVUJMRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUEZNVF9ET1VCTEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBGTVRfRE9VQkxFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NBTVBGTVRfRkxPQVQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QRk1UX0ZMT0FUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QRk1UX0ZMT0FUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QRk1UX0ZMT0FUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QRk1UX0ZMT0FUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NBTVBGTVRfVFdPU0NPTVAKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QRk1UX1RXT1NDT01QKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QRk1UX1RXT1NDT01QIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QRk1UX1RXT1NDT01QKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QRk1UX1RXT1NDT01QIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NBTVBMRV8xNgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBMRV8xNik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUExFXzE2IiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QTEVfMTYpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBMRV8xNiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TQU1QTEVfMjQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QTEVfMjQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBMRV8yNCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUExFXzI0KTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QTEVfMjQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU0FNUExFXzgKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QTEVfOCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUExFXzgiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBMRV84KTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QTEVfOCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TQ0FMQVJfVkFMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0NBTEFSX1ZBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0NBTEFSX1ZBTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0NBTEFSX1ZBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0NBTEFSX1ZBTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TRVRfVkFMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0VUX1ZBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0VUX1ZBTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0VUX1ZBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0VUX1ZBTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TSE9SVF9OQU1FCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0hPUlRfTkFNRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0hPUlRfTkFNRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0hPUlRfTkFNRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0hPUlRfTkFNRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TTVBURTI3Mk1fSUZfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NNUFRFMjcyTV9JRl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTTVBURTI3Mk1fSUZfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU01QVEUyNzJNX0lGX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNNUFRFMjcyTV9JRl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NPVVJDRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NPVVJDRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU09VUkNFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TT1VSQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNPVVJDRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TUEVBS0VSX0lGX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TUEVBS0VSX0lGX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUFLRVJfSUZfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1BFQUtFUl9JRl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTUEVBS0VSX0lGX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1BFQUtFUl9NVVRFX0NUTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NQRUFLRVJfTVVURV9DVEwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUFLRVJfTVVURV9DVEwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NQRUFLRVJfTVVURV9DVEwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUFLRVJfTVVURV9DVEwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1BFQUtFUl9NVVRFX09GRgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NQRUFLRVJfTVVURV9PRkYpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUFLRVJfTVVURV9PRkYiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NQRUFLRVJfTVVURV9PRkYpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUFLRVJfTVVURV9PRkYiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1BFQUtFUl9NVVRFX09OCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1BFQUtFUl9NVVRFX09OKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTUEVBS0VSX01VVEVfT04iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NQRUFLRVJfTVVURV9PTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFQUtFUl9NVVRFX09OIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NQRUFLRVJfUExVU19MSU5FX0lGX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TUEVBS0VSX1BMVVNfTElORV9JRl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTUEVBS0VSX1BMVVNfTElORV9JRl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TUEVBS0VSX1BMVVNfTElORV9JRl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTUEVBS0VSX1BMVVNfTElORV9JRl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NURVJFTwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NURVJFTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1RFUkVPIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TVEVSRU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNURVJFTyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TVFJJTkdfVkFMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1RSSU5HX1ZBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1RSSU5HX1ZBTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1RSSU5HX1ZBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1RSSU5HX1ZBTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TVUJTWVNURU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TVUJTWVNURU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNVQlNZU1RFTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1VCU1lTVEVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVUJTWVNURU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1VCU1lTVEVNX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TVUJTWVNURU1fVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1VCU1lTVEVNX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NVQlNZU1RFTV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVUJTWVNURU1fVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TWU5DX0lOUFVUX1RPX0FFUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NZTkNfSU5QVVRfVE9fQUVTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTWU5DX0lOUFVUX1RPX0FFUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1lOQ19JTlBVVF9UT19BRVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNZTkNfSU5QVVRfVE9fQUVTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NZTkNfT1VUUFVUX1RPX0FFUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NZTkNfT1VUUFVUX1RPX0FFUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1lOQ19PVVRQVVRfVE9fQUVTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TWU5DX09VVFBVVF9UT19BRVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNZTkNfT1VUUFVUX1RPX0FFUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TWVNURU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TWVNURU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNZU1RFTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1lTVEVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTWVNURU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1lTVEVNX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TWVNURU1fVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1lTVEVNX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NZU1RFTV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTWVNURU1fVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9URVNUX0lGX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9URVNUX0lGX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRFU1RfSUZfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVEVTVF9JRl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJURVNUX0lGX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfVFlQRV9CSVQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9UWVBFX0JJVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVFlQRV9CSVQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1RZUEVfQklUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUWVBFX0JJVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9VTlVTRURfQ09VTlQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9VTlVTRURfQ09VTlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOVVNFRF9DT1VOVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVU5VU0VEX0NPVU5UKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTlVTRURfQ09VTlQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfVU5VU0VEX1BPUlRTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVU5VU0VEX1BPUlRTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTlVTRURfUE9SVFMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1VOVVNFRF9QT1JUUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5VU0VEX1BPUlRTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1ZBUklBQkxFX01DTEtfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1ZBUklBQkxFX01DTEtfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVkFSSUFCTEVfTUNMS19UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9WQVJJQUJMRV9NQ0xLX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlZBUklBQkxFX01DTEtfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9WRUNUT1JfVkFMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVkVDVE9SX1ZBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVkVDVE9SX1ZBTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVkVDVE9SX1ZBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVkVDVE9SX1ZBTCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9WSURFT19NQ0xLX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9WSURFT19NQ0xLX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlZJREVPX01DTEtfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVklERU9fTUNMS19UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJWSURFT19NQ0xLX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfV09SRFNJWkUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9XT1JEU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiV09SRFNJWkUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1dPUkRTSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJXT1JEU0laRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKIAotI2lmZGVmIEFMX05PX0VMRU0JCS8qIElSSVggNiAqLwotCSh2b2lkKSBhbFNldEVycm9ySGFuZGxlcihFcnJvckhhbmRsZXIpOworI2lmZGVmIEFMX05PX0VMRU0gICAgICAgICAgICAgICAvKiBJUklYIDYgKi8KKyAgICAodm9pZCkgYWxTZXRFcnJvckhhbmRsZXIoRXJyb3JIYW5kbGVyKTsKICNlbmRpZiAvKiBBTF9OT19FTEVNICovCiAjaWZkZWYgT0xEX0lOVEVSRkFDRQotCSh2b2lkKSBBTHNldGVycm9yaGFuZGxlcihFcnJvckhhbmRsZXIpOworICAgICh2b2lkKSBBTHNldGVycm9yaGFuZGxlcihFcnJvckhhbmRsZXIpOwogI2VuZGlmIC8qIE9MRF9JTlRFUkZBQ0UgKi8KLQkKKwogICBlcnJvcjoKLQlyZXR1cm47CisgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCmluZGV4IGVmNmZiODcuLjQwM2Y2NDYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXJyYXltb2R1bGUuYworKysgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxzdGRkZWYuaD4KICNlbHNlIC8qICFTVERDX0hFQURFUlMgKi8KICNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CQkvKiBGb3Igc2l6ZV90ICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgICAgIC8qIEZvciBzaXplX3QgKi8KICNlbmRpZiAvKiBIQVZFX1NZU19UWVBFU19IICovCiAjZW5kaWYgLyogIVNURENfSEVBREVSUyAqLwogCkBAIC0yMiwxOCArMjIsMTggQEAKICAqIGZ1bmN0aW9ucyBhcmVuJ3QgdmlzaWJsZSB5ZXQuCiAgKi8KIHN0cnVjdCBhcnJheWRlc2NyIHsKLQlpbnQgdHlwZWNvZGU7Ci0JaW50IGl0ZW1zaXplOwotCVB5T2JqZWN0ICogKCpnZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCk7Ci0JaW50ICgqc2V0aXRlbSkoc3RydWN0IGFycmF5b2JqZWN0ICosIFB5X3NzaXplX3QsIFB5T2JqZWN0ICopOworICAgIGludCB0eXBlY29kZTsKKyAgICBpbnQgaXRlbXNpemU7CisgICAgUHlPYmplY3QgKiAoKmdldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90KTsKKyAgICBpbnQgKCpzZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCwgUHlPYmplY3QgKik7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCBhcnJheW9iamVjdCB7Ci0JUHlPYmplY3RfVkFSX0hFQUQKLQljaGFyICpvYl9pdGVtOwotCVB5X3NzaXplX3QgYWxsb2NhdGVkOwotCXN0cnVjdCBhcnJheWRlc2NyICpvYl9kZXNjcjsKLQlQeU9iamVjdCAqd2Vha3JlZmxpc3Q7IC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCisgICAgUHlPYmplY3RfVkFSX0hFQUQKKyAgICBjaGFyICpvYl9pdGVtOworICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkOworICAgIHN0cnVjdCBhcnJheWRlc2NyICpvYl9kZXNjcjsKKyAgICBQeU9iamVjdCAqd2Vha3JlZmxpc3Q7IC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCiB9IGFycmF5b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEFycmF5dHlwZTsKQEAgLTQ0LDQ5ICs0NCw0OSBAQAogc3RhdGljIGludAogYXJyYXlfcmVzaXplKGFycmF5b2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IG5ld3NpemUpCiB7Ci0JY2hhciAqaXRlbXM7Ci0Jc2l6ZV90IF9uZXdfc2l6ZTsKKyAgICBjaGFyICppdGVtczsKKyAgICBzaXplX3QgX25ld19zaXplOwogCi0JLyogQnlwYXNzIHJlYWxsb2MoKSB3aGVuIGEgcHJldmlvdXMgb3ZlcmFsbG9jYXRpb24gaXMgbGFyZ2UgZW5vdWdoCi0JICAgdG8gYWNjb21tb2RhdGUgdGhlIG5ld3NpemUuICBJZiB0aGUgbmV3c2l6ZSBpcyAxNiBzbWFsbGVyIHRoYW4gdGhlCi0JICAgY3VycmVudCBzaXplLCB0aGVuIHByb2NlZWQgd2l0aCB0aGUgcmVhbGxvYygpIHRvIHNocmluayB0aGUgbGlzdC4KLQkqLworICAgIC8qIEJ5cGFzcyByZWFsbG9jKCkgd2hlbiBhIHByZXZpb3VzIG92ZXJhbGxvY2F0aW9uIGlzIGxhcmdlIGVub3VnaAorICAgICAgIHRvIGFjY29tbW9kYXRlIHRoZSBuZXdzaXplLiAgSWYgdGhlIG5ld3NpemUgaXMgMTYgc21hbGxlciB0aGFuIHRoZQorICAgICAgIGN1cnJlbnQgc2l6ZSwgdGhlbiBwcm9jZWVkIHdpdGggdGhlIHJlYWxsb2MoKSB0byBzaHJpbmsgdGhlIGxpc3QuCisgICAgKi8KIAotCWlmIChzZWxmLT5hbGxvY2F0ZWQgPj0gbmV3c2l6ZSAmJgotCSAgICBQeV9TSVpFKHNlbGYpIDwgbmV3c2l6ZSArIDE2ICYmCi0JICAgIHNlbGYtPm9iX2l0ZW0gIT0gTlVMTCkgewotCQlQeV9TSVpFKHNlbGYpID0gbmV3c2l6ZTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChzZWxmLT5hbGxvY2F0ZWQgPj0gbmV3c2l6ZSAmJgorICAgICAgICBQeV9TSVpFKHNlbGYpIDwgbmV3c2l6ZSArIDE2ICYmCisgICAgICAgIHNlbGYtPm9iX2l0ZW0gIT0gTlVMTCkgeworICAgICAgICBQeV9TSVpFKHNlbGYpID0gbmV3c2l6ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogVGhpcyBvdmVyLWFsbG9jYXRlcyBwcm9wb3J0aW9uYWwgdG8gdGhlIGFycmF5IHNpemUsIG1ha2luZyByb29tCi0JICogZm9yIGFkZGl0aW9uYWwgZ3Jvd3RoLiAgVGhlIG92ZXItYWxsb2NhdGlvbiBpcyBtaWxkLCBidXQgaXMKLQkgKiBlbm91Z2ggdG8gZ2l2ZSBsaW5lYXItdGltZSBhbW9ydGl6ZWQgYmVoYXZpb3Igb3ZlciBhIGxvbmcKLQkgKiBzZXF1ZW5jZSBvZiBhcHBlbmRzKCkgaW4gdGhlIHByZXNlbmNlIG9mIGEgcG9vcmx5LXBlcmZvcm1pbmcKLQkgKiBzeXN0ZW0gcmVhbGxvYygpLgotCSAqIFRoZSBncm93dGggcGF0dGVybiBpczogIDAsIDQsIDgsIDE2LCAyNSwgMzQsIDQ2LCA1NiwgNjcsIDc5LCAuLi4KLQkgKiBOb3RlLCB0aGUgcGF0dGVybiBzdGFydHMgb3V0IHRoZSBzYW1lIGFzIGZvciBsaXN0cyBidXQgdGhlbgotCSAqIGdyb3dzIGF0IGEgc21hbGxlciByYXRlIHNvIHRoYXQgbGFyZ2VyIGFycmF5cyBvbmx5IG92ZXJhbGxvY2F0ZQotCSAqIGJ5IGFib3V0IDEvMTZ0aCAtLSB0aGlzIGlzIGRvbmUgYmVjYXVzZSBhcnJheXMgYXJlIHByZXN1bWVkIHRvIGJlIG1vcmUKLQkgKiBtZW1vcnkgY3JpdGljYWwuCi0JICovCisgICAgLyogVGhpcyBvdmVyLWFsbG9jYXRlcyBwcm9wb3J0aW9uYWwgdG8gdGhlIGFycmF5IHNpemUsIG1ha2luZyByb29tCisgICAgICogZm9yIGFkZGl0aW9uYWwgZ3Jvd3RoLiAgVGhlIG92ZXItYWxsb2NhdGlvbiBpcyBtaWxkLCBidXQgaXMKKyAgICAgKiBlbm91Z2ggdG8gZ2l2ZSBsaW5lYXItdGltZSBhbW9ydGl6ZWQgYmVoYXZpb3Igb3ZlciBhIGxvbmcKKyAgICAgKiBzZXF1ZW5jZSBvZiBhcHBlbmRzKCkgaW4gdGhlIHByZXNlbmNlIG9mIGEgcG9vcmx5LXBlcmZvcm1pbmcKKyAgICAgKiBzeXN0ZW0gcmVhbGxvYygpLgorICAgICAqIFRoZSBncm93dGggcGF0dGVybiBpczogIDAsIDQsIDgsIDE2LCAyNSwgMzQsIDQ2LCA1NiwgNjcsIDc5LCAuLi4KKyAgICAgKiBOb3RlLCB0aGUgcGF0dGVybiBzdGFydHMgb3V0IHRoZSBzYW1lIGFzIGZvciBsaXN0cyBidXQgdGhlbgorICAgICAqIGdyb3dzIGF0IGEgc21hbGxlciByYXRlIHNvIHRoYXQgbGFyZ2VyIGFycmF5cyBvbmx5IG92ZXJhbGxvY2F0ZQorICAgICAqIGJ5IGFib3V0IDEvMTZ0aCAtLSB0aGlzIGlzIGRvbmUgYmVjYXVzZSBhcnJheXMgYXJlIHByZXN1bWVkIHRvIGJlIG1vcmUKKyAgICAgKiBtZW1vcnkgY3JpdGljYWwuCisgICAgICovCiAKLQlfbmV3X3NpemUgPSAobmV3c2l6ZSA+PiA0KSArIChQeV9TSVpFKHNlbGYpIDwgOCA/IDMgOiA3KSArIG5ld3NpemU7Ci0JaXRlbXMgPSBzZWxmLT5vYl9pdGVtOwotCS8qIFhYWCBUaGUgZm9sbG93aW5nIG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpc2lvbiBkb2VzIG5vdCBvcHRpbWl6ZSBhd2F5IAotCSAgIGxpa2UgaXQgZG9lcyBmb3IgbGlzdHMgc2luY2UgdGhlIHNpemUgaXMgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZSAqLwotCWlmIChfbmV3X3NpemUgPD0gKCh+KHNpemVfdCkwKSAvIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSkpCi0JCVB5TWVtX1JFU0laRShpdGVtcywgY2hhciwgKF9uZXdfc2l6ZSAqIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSkpOwotCWVsc2UKLQkJaXRlbXMgPSBOVUxMOwotCWlmIChpdGVtcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2VsZi0+b2JfaXRlbSA9IGl0ZW1zOwotCVB5X1NJWkUoc2VsZikgPSBuZXdzaXplOwotCXNlbGYtPmFsbG9jYXRlZCA9IF9uZXdfc2l6ZTsKLQlyZXR1cm4gMDsKKyAgICBfbmV3X3NpemUgPSAobmV3c2l6ZSA+PiA0KSArIChQeV9TSVpFKHNlbGYpIDwgOCA/IDMgOiA3KSArIG5ld3NpemU7CisgICAgaXRlbXMgPSBzZWxmLT5vYl9pdGVtOworICAgIC8qIFhYWCBUaGUgZm9sbG93aW5nIG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpc2lvbiBkb2VzIG5vdCBvcHRpbWl6ZSBhd2F5CisgICAgICAgbGlrZSBpdCBkb2VzIGZvciBsaXN0cyBzaW5jZSB0aGUgc2l6ZSBpcyBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lICovCisgICAgaWYgKF9uZXdfc2l6ZSA8PSAoKH4oc2l6ZV90KTApIC8gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSkKKyAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW1zLCBjaGFyLCAoX25ld19zaXplICogc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSk7CisgICAgZWxzZQorICAgICAgICBpdGVtcyA9IE5VTEw7CisgICAgaWYgKGl0ZW1zID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzZWxmLT5vYl9pdGVtID0gaXRlbXM7CisgICAgUHlfU0laRShzZWxmKSA9IG5ld3NpemU7CisgICAgc2VsZi0+YWxsb2NhdGVkID0gX25ld19zaXplOworICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA0LDMwOCArMTA0LDMwOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoJigoY2hhciAqKWFwLT5vYl9pdGVtKVtpXSwgMSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCYoKGNoYXIgKilhcC0+b2JfaXRlbSlbaV0sIDEpOwogfQogCiBzdGF0aWMgaW50CiBjX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCWNoYXIgeDsKLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJjO2FycmF5IGl0ZW0gbXVzdCBiZSBjaGFyIiwgJngpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGkgPj0gMCkKLQkJKChjaGFyICopYXAtPm9iX2l0ZW0pW2ldID0geDsKLQlyZXR1cm4gMDsKKyAgICBjaGFyIHg7CisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiYzthcnJheSBpdGVtIG11c3QgYmUgY2hhciIsICZ4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpID49IDApCisgICAgICAgICgoY2hhciAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JbG9uZyB4ID0gKChjaGFyICopYXAtPm9iX2l0ZW0pW2ldOwotCWlmICh4ID49IDEyOCkKLQkJeCAtPSAyNTY7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIGxvbmcgeCA9ICgoY2hhciAqKWFwLT5vYl9pdGVtKVtpXTsKKyAgICBpZiAoeCA+PSAxMjgpCisgICAgICAgIHggLT0gMjU2OworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKIH0KIAogc3RhdGljIGludAogYl9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQlzaG9ydCB4OwotCS8qIFB5QXJnX1BhcnNlJ3MgJ2InIGZvcm1hdHRlciBpcyBmb3IgYW4gdW5zaWduZWQgY2hhciwgdGhlcmVmb3JlCi0JICAgbXVzdCB1c2UgdGhlIG5leHQgc2l6ZSB1cCB0aGF0IGlzIHNpZ25lZCAoJ2gnKSBhbmQgbWFudWFsbHkgZG8KLQkgICB0aGUgb3ZlcmZsb3cgY2hlY2tpbmcgKi8KLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJoO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQotCQlyZXR1cm4gLTE7Ci0JZWxzZSBpZiAoeCA8IC0xMjgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkic2lnbmVkIGNoYXIgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIGlmICh4ID4gMTI3KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInNpZ25lZCBjaGFyIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGkgPj0gMCkKLQkJKChjaGFyICopYXAtPm9iX2l0ZW0pW2ldID0gKGNoYXIpeDsKLQlyZXR1cm4gMDsKKyAgICBzaG9ydCB4OworICAgIC8qIFB5QXJnX1BhcnNlJ3MgJ2InIGZvcm1hdHRlciBpcyBmb3IgYW4gdW5zaWduZWQgY2hhciwgdGhlcmVmb3JlCisgICAgICAgbXVzdCB1c2UgdGhlIG5leHQgc2l6ZSB1cCB0aGF0IGlzIHNpZ25lZCAoJ2gnKSBhbmQgbWFudWFsbHkgZG8KKyAgICAgICB0aGUgb3ZlcmZsb3cgY2hlY2tpbmcgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJoO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZSBpZiAoeCA8IC0xMjgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAic2lnbmVkIGNoYXIgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIGlmICh4ID4gMTI3KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgInNpZ25lZCBjaGFyIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgKChjaGFyICopYXAtPm9iX2l0ZW0pW2ldID0gKGNoYXIpeDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEJCX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JbG9uZyB4ID0gKCh1bnNpZ25lZCBjaGFyICopYXAtPm9iX2l0ZW0pW2ldOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKKyAgICBsb25nIHggPSAoKHVuc2lnbmVkIGNoYXIgKilhcC0+b2JfaXRlbSlbaV07CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwogfQogCiBzdGF0aWMgaW50CiBCQl9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQl1bnNpZ25lZCBjaGFyIHg7Ci0JLyogJ0InID09IHVuc2lnbmVkIGNoYXIsIG1hcHMgdG8gUHlBcmdfUGFyc2UncyAnYicgZm9ybWF0dGVyICovCi0JaWYgKCFQeUFyZ19QYXJzZSh2LCAiYjthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKLQkJcmV0dXJuIC0xOwotCWlmIChpID49IDApCi0JCSgoY2hhciAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7Ci0JcmV0dXJuIDA7CisgICAgdW5zaWduZWQgY2hhciB4OworICAgIC8qICdCJyA9PSB1bnNpZ25lZCBjaGFyLCBtYXBzIHRvIFB5QXJnX1BhcnNlJ3MgJ2InIGZvcm1hdHRlciAqLworICAgIGlmICghUHlBcmdfUGFyc2UodiwgImI7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAoKGNoYXIgKilhcC0+b2JfaXRlbSlbaV0gPSB4OworICAgIHJldHVybiAwOwogfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogc3RhdGljIFB5T2JqZWN0ICoKIHVfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKCYoKFB5X1VOSUNPREUgKikgYXAtPm9iX2l0ZW0pW2ldLCAxKTsKKyAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKCYoKFB5X1VOSUNPREUgKikgYXAtPm9iX2l0ZW0pW2ldLCAxKTsKIH0KIAogc3RhdGljIGludAogdV9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQlQeV9VTklDT0RFICpwOwotCVB5X3NzaXplX3QgbGVuOworICAgIFB5X1VOSUNPREUgKnA7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJ1IzthcnJheSBpdGVtIG11c3QgYmUgdW5pY29kZSBjaGFyYWN0ZXIiLCAmcCwgJmxlbikpCi0JCXJldHVybiAtMTsKLQlpZiAobGVuICE9IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXJyYXkgaXRlbSBtdXN0IGJlIHVuaWNvZGUgY2hhcmFjdGVyIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGkgPj0gMCkKLQkJKChQeV9VTklDT0RFICopYXAtPm9iX2l0ZW0pW2ldID0gcFswXTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJ1IzthcnJheSBpdGVtIG11c3QgYmUgdW5pY29kZSBjaGFyYWN0ZXIiLCAmcCwgJmxlbikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobGVuICE9IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSBpdGVtIG11c3QgYmUgdW5pY29kZSBjaGFyYWN0ZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAoKFB5X1VOSUNPREUgKilhcC0+b2JfaXRlbSlbaV0gPSBwWzBdOworICAgIHJldHVybiAwOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAoKHNob3J0ICopYXAtPm9iX2l0ZW0pW2ldKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICgoc2hvcnQgKilhcC0+b2JfaXRlbSlbaV0pOwogfQogCiBzdGF0aWMgaW50CiBoX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCXNob3J0IHg7Ci0JLyogJ2gnID09IHNpZ25lZCBzaG9ydCwgbWFwcyB0byBQeUFyZ19QYXJzZSdzICdoJyBmb3JtYXR0ZXIgKi8KLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJoO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGkgPj0gMCkKLQkJICAgICAoKHNob3J0ICopYXAtPm9iX2l0ZW0pW2ldID0geDsKLQlyZXR1cm4gMDsKKyAgICBzaG9ydCB4OworICAgIC8qICdoJyA9PSBzaWduZWQgc2hvcnQsIG1hcHMgdG8gUHlBcmdfUGFyc2UncyAnaCcgZm9ybWF0dGVyICovCisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiaDthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpID49IDApCisgICAgICAgICAgICAgICAgICgoc2hvcnQgKilhcC0+b2JfaXRlbSlbaV0gPSB4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSEhfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICgodW5zaWduZWQgc2hvcnQgKilhcC0+b2JfaXRlbSlbaV0pOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKCh1bnNpZ25lZCBzaG9ydCAqKWFwLT5vYl9pdGVtKVtpXSk7CiB9CiAKIHN0YXRpYyBpbnQKIEhIX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCWludCB4OwotCS8qIFB5QXJnX1BhcnNlJ3MgJ2gnIGZvcm1hdHRlciBpcyBmb3IgYSBzaWduZWQgc2hvcnQsIHRoZXJlZm9yZQotCSAgIG11c3QgdXNlIHRoZSBuZXh0IHNpemUgdXAgYW5kIG1hbnVhbGx5IGRvIHRoZSBvdmVyZmxvdyBjaGVja2luZyAqLwotCWlmICghUHlBcmdfUGFyc2UodiwgImk7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCi0JCXJldHVybiAtMTsKLQllbHNlIGlmICh4IDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJ1bnNpZ25lZCBzaG9ydCBpcyBsZXNzIHRoYW4gbWluaW11bSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgaWYgKHggPiBVU0hSVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkidW5zaWduZWQgc2hvcnQgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoaSA+PSAwKQotCQkoKHNob3J0ICopYXAtPm9iX2l0ZW0pW2ldID0gKHNob3J0KXg7Ci0JcmV0dXJuIDA7CisgICAgaW50IHg7CisgICAgLyogUHlBcmdfUGFyc2UncyAnaCcgZm9ybWF0dGVyIGlzIGZvciBhIHNpZ25lZCBzaG9ydCwgdGhlcmVmb3JlCisgICAgICAgbXVzdCB1c2UgdGhlIG5leHQgc2l6ZSB1cCBhbmQgbWFudWFsbHkgZG8gdGhlIG92ZXJmbG93IGNoZWNraW5nICovCisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiaTthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UgaWYgKHggPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgInVuc2lnbmVkIHNob3J0IGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoeCA+IFVTSFJUX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJ1bnNpZ25lZCBzaG9ydCBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChpID49IDApCisgICAgICAgICgoc2hvcnQgKilhcC0+b2JfaXRlbSlbaV0gPSAoc2hvcnQpeDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGlfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICgoaW50ICopYXAtPm9iX2l0ZW0pW2ldKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICgoaW50ICopYXAtPm9iX2l0ZW0pW2ldKTsKIH0KIAogc3RhdGljIGludAogaV9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQlpbnQgeDsKLQkvKiAnaScgPT0gc2lnbmVkIGludCwgbWFwcyB0byBQeUFyZ19QYXJzZSdzICdpJyBmb3JtYXR0ZXIgKi8KLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJpO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGkgPj0gMCkKLQkJICAgICAoKGludCAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7Ci0JcmV0dXJuIDA7CisgICAgaW50IHg7CisgICAgLyogJ2knID09IHNpZ25lZCBpbnQsIG1hcHMgdG8gUHlBcmdfUGFyc2UncyAnaScgZm9ybWF0dGVyICovCisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiaTthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpID49IDApCisgICAgICAgICAgICAgICAgICgoaW50ICopYXAtPm9iX2l0ZW0pW2ldID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIElJX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKAotCQkodW5zaWduZWQgbG9uZykgKCh1bnNpZ25lZCBpbnQgKilhcC0+b2JfaXRlbSlbaV0pOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygKKyAgICAgICAgKHVuc2lnbmVkIGxvbmcpICgodW5zaWduZWQgaW50ICopYXAtPm9iX2l0ZW0pW2ldKTsKIH0KIAogc3RhdGljIGludAogSUlfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCWlmIChQeUxvbmdfQ2hlY2sodikpIHsKLQkJeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2KTsKLQkJaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgewotCQlsb25nIHk7Ci0JCWlmICghUHlBcmdfUGFyc2UodiwgImw7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeSkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmICh5IDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInVuc2lnbmVkIGludCBpcyBsZXNzIHRoYW4gbWluaW11bSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXggPSAodW5zaWduZWQgbG9uZyl5OworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBpZiAoUHlMb25nX0NoZWNrKHYpKSB7CisgICAgICAgIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7CisgICAgICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbG9uZyB5OworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJsO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJnkpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoeSA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBpbnQgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB4ID0gKHVuc2lnbmVkIGxvbmcpeTsKIAotCX0KLQlpZiAoeCA+IFVJTlRfTUFYKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInVuc2lnbmVkIGludCBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIH0KKyAgICBpZiAoeCA+IFVJTlRfTUFYKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgInVuc2lnbmVkIGludCBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKGkgPj0gMCkKLQkJKCh1bnNpZ25lZCBpbnQgKilhcC0+b2JfaXRlbSlbaV0gPSAodW5zaWduZWQgaW50KXg7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgKCh1bnNpZ25lZCBpbnQgKilhcC0+b2JfaXRlbSlbaV0gPSAodW5zaWduZWQgaW50KXg7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKCgobG9uZyAqKWFwLT5vYl9pdGVtKVtpXSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKCgobG9uZyAqKWFwLT5vYl9pdGVtKVtpXSk7CiB9CiAKIHN0YXRpYyBpbnQKIGxfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JbG9uZyB4OwotCWlmICghUHlBcmdfUGFyc2UodiwgImw7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCi0JCXJldHVybiAtMTsKLQlpZiAoaSA+PSAwKQotCQkgICAgICgobG9uZyAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7Ci0JcmV0dXJuIDA7CisgICAgbG9uZyB4OworICAgIGlmICghUHlBcmdfUGFyc2UodiwgImw7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAgICAgICAgICAoKGxvbmcgKilhcC0+b2JfaXRlbSlbaV0gPSB4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogTExfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKCh1bnNpZ25lZCBsb25nICopYXAtPm9iX2l0ZW0pW2ldKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKCh1bnNpZ25lZCBsb25nICopYXAtPm9iX2l0ZW0pW2ldKTsKIH0KIAogc3RhdGljIGludAogTExfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCWlmIChQeUxvbmdfQ2hlY2sodikpIHsKLQkJeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2KTsKLQkJaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgewotCQlsb25nIHk7Ci0JCWlmICghUHlBcmdfUGFyc2UodiwgImw7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeSkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmICh5IDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInVuc2lnbmVkIGxvbmcgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQl4ID0gKHVuc2lnbmVkIGxvbmcpeTsKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgaWYgKFB5TG9uZ19DaGVjayh2KSkgeworICAgICAgICB4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOworICAgICAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxvbmcgeTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAibDthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ5KSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHkgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAidW5zaWduZWQgbG9uZyBpcyBsZXNzIHRoYW4gbWluaW11bSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHggPSAodW5zaWduZWQgbG9uZyl5OwogCi0JfQotCWlmICh4ID4gVUxPTkdfTUFYKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInVuc2lnbmVkIGxvbmcgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICB9CisgICAgaWYgKHggPiBVTE9OR19NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAidW5zaWduZWQgbG9uZyBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKGkgPj0gMCkKLQkJKCh1bnNpZ25lZCBsb25nICopYXAtPm9iX2l0ZW0pW2ldID0geDsKLQlyZXR1cm4gMDsKKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAoKHVuc2lnbmVkIGxvbmcgKilhcC0+b2JfaXRlbSlbaV0gPSB4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZl9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSkgKChmbG9hdCAqKWFwLT5vYl9pdGVtKVtpXSk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKSAoKGZsb2F0ICopYXAtPm9iX2l0ZW0pW2ldKTsKIH0KIAogc3RhdGljIGludAogZl9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQlmbG9hdCB4OwotCWlmICghUHlBcmdfUGFyc2UodiwgImY7YXJyYXkgaXRlbSBtdXN0IGJlIGZsb2F0IiwgJngpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGkgPj0gMCkKLQkJICAgICAoKGZsb2F0ICopYXAtPm9iX2l0ZW0pW2ldID0geDsKLQlyZXR1cm4gMDsKKyAgICBmbG9hdCB4OworICAgIGlmICghUHlBcmdfUGFyc2UodiwgImY7YXJyYXkgaXRlbSBtdXN0IGJlIGZsb2F0IiwgJngpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgICAgICAgICAgKChmbG9hdCAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoKGRvdWJsZSAqKWFwLT5vYl9pdGVtKVtpXSk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoKGRvdWJsZSAqKWFwLT5vYl9pdGVtKVtpXSk7CiB9CiAKIHN0YXRpYyBpbnQKIGRfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JZG91YmxlIHg7Ci0JaWYgKCFQeUFyZ19QYXJzZSh2LCAiZDthcnJheSBpdGVtIG11c3QgYmUgZmxvYXQiLCAmeCkpCi0JCXJldHVybiAtMTsKLQlpZiAoaSA+PSAwKQotCQkgICAgICgoZG91YmxlICopYXAtPm9iX2l0ZW0pW2ldID0geDsKLQlyZXR1cm4gMDsKKyAgICBkb3VibGUgeDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJkO2FycmF5IGl0ZW0gbXVzdCBiZSBmbG9hdCIsICZ4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpID49IDApCisgICAgICAgICAgICAgICAgICgoZG91YmxlICopYXAtPm9iX2l0ZW0pW2ldID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogRGVzY3JpcHRpb24gb2YgdHlwZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgYXJyYXlkZXNjciBkZXNjcmlwdG9yc1tdID0gewotCXsnYycsIHNpemVvZihjaGFyKSwgY19nZXRpdGVtLCBjX3NldGl0ZW19LAotCXsnYicsIHNpemVvZihjaGFyKSwgYl9nZXRpdGVtLCBiX3NldGl0ZW19LAotCXsnQicsIHNpemVvZihjaGFyKSwgQkJfZ2V0aXRlbSwgQkJfc2V0aXRlbX0sCisgICAgeydjJywgc2l6ZW9mKGNoYXIpLCBjX2dldGl0ZW0sIGNfc2V0aXRlbX0sCisgICAgeydiJywgc2l6ZW9mKGNoYXIpLCBiX2dldGl0ZW0sIGJfc2V0aXRlbX0sCisgICAgeydCJywgc2l6ZW9mKGNoYXIpLCBCQl9nZXRpdGVtLCBCQl9zZXRpdGVtfSwKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0Jeyd1Jywgc2l6ZW9mKFB5X1VOSUNPREUpLCB1X2dldGl0ZW0sIHVfc2V0aXRlbX0sCisgICAgeyd1Jywgc2l6ZW9mKFB5X1VOSUNPREUpLCB1X2dldGl0ZW0sIHVfc2V0aXRlbX0sCiAjZW5kaWYKLQl7J2gnLCBzaXplb2Yoc2hvcnQpLCBoX2dldGl0ZW0sIGhfc2V0aXRlbX0sCi0JeydIJywgc2l6ZW9mKHNob3J0KSwgSEhfZ2V0aXRlbSwgSEhfc2V0aXRlbX0sCi0JeydpJywgc2l6ZW9mKGludCksIGlfZ2V0aXRlbSwgaV9zZXRpdGVtfSwKLQl7J0knLCBzaXplb2YoaW50KSwgSUlfZ2V0aXRlbSwgSUlfc2V0aXRlbX0sCi0JeydsJywgc2l6ZW9mKGxvbmcpLCBsX2dldGl0ZW0sIGxfc2V0aXRlbX0sCi0JeydMJywgc2l6ZW9mKGxvbmcpLCBMTF9nZXRpdGVtLCBMTF9zZXRpdGVtfSwKLQl7J2YnLCBzaXplb2YoZmxvYXQpLCBmX2dldGl0ZW0sIGZfc2V0aXRlbX0sCi0JeydkJywgc2l6ZW9mKGRvdWJsZSksIGRfZ2V0aXRlbSwgZF9zZXRpdGVtfSwKLQl7J1wwJywgMCwgMCwgMH0gLyogU2VudGluZWwgKi8KKyAgICB7J2gnLCBzaXplb2Yoc2hvcnQpLCBoX2dldGl0ZW0sIGhfc2V0aXRlbX0sCisgICAgeydIJywgc2l6ZW9mKHNob3J0KSwgSEhfZ2V0aXRlbSwgSEhfc2V0aXRlbX0sCisgICAgeydpJywgc2l6ZW9mKGludCksIGlfZ2V0aXRlbSwgaV9zZXRpdGVtfSwKKyAgICB7J0knLCBzaXplb2YoaW50KSwgSUlfZ2V0aXRlbSwgSUlfc2V0aXRlbX0sCisgICAgeydsJywgc2l6ZW9mKGxvbmcpLCBsX2dldGl0ZW0sIGxfc2V0aXRlbX0sCisgICAgeydMJywgc2l6ZW9mKGxvbmcpLCBMTF9nZXRpdGVtLCBMTF9zZXRpdGVtfSwKKyAgICB7J2YnLCBzaXplb2YoZmxvYXQpLCBmX2dldGl0ZW0sIGZfc2V0aXRlbX0sCisgICAgeydkJywgc2l6ZW9mKGRvdWJsZSksIGRfZ2V0aXRlbSwgZF9zZXRpdGVtfSwKKyAgICB7J1wwJywgMCwgMCwgMH0gLyogU2VudGluZWwgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MTUsNzggKzQxNSw3OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2FycmF5b2JqZWN0KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlfc3NpemVfdCBzaXplLCBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3IpCiB7Ci0JYXJyYXlvYmplY3QgKm9wOwotCXNpemVfdCBuYnl0ZXM7CisgICAgYXJyYXlvYmplY3QgKm9wOworICAgIHNpemVfdCBuYnl0ZXM7CiAKLQlpZiAoc2l6ZSA8IDApIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW5ieXRlcyA9IHNpemUgKiBkZXNjci0+aXRlbXNpemU7Ci0JLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0JaWYgKG5ieXRlcyAvIGRlc2NyLT5pdGVtc2l6ZSAhPSAoc2l6ZV90KXNpemUpIHsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCW9wID0gKGFycmF5b2JqZWN0ICopIHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChvcCA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvcC0+b2JfZGVzY3IgPSBkZXNjcjsKLQlvcC0+YWxsb2NhdGVkID0gc2l6ZTsKLQlvcC0+d2Vha3JlZmxpc3QgPSBOVUxMOwotCVB5X1NJWkUob3ApID0gc2l6ZTsKLQlpZiAoc2l6ZSA8PSAwKSB7Ci0JCW9wLT5vYl9pdGVtID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCW9wLT5vYl9pdGVtID0gUHlNZW1fTkVXKGNoYXIsIG5ieXRlcyk7Ci0JCWlmIChvcC0+b2JfaXRlbSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYob3ApOwotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKKyAgICBuYnl0ZXMgPSBzaXplICogZGVzY3ItPml0ZW1zaXplOworICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLworICAgIGlmIChuYnl0ZXMgLyBkZXNjci0+aXRlbXNpemUgIT0gKHNpemVfdClzaXplKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBvcCA9IChhcnJheW9iamVjdCAqKSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAob3AgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb3AtPm9iX2Rlc2NyID0gZGVzY3I7CisgICAgb3AtPmFsbG9jYXRlZCA9IHNpemU7CisgICAgb3AtPndlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICBQeV9TSVpFKG9wKSA9IHNpemU7CisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBvcC0+b2JfaXRlbSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBvcC0+b2JfaXRlbSA9IFB5TWVtX05FVyhjaGFyLCBuYnl0ZXMpOworICAgICAgICBpZiAob3AtPm9iX2l0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG9wKTsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcnJheWl0ZW0oUHlPYmplY3QgKm9wLCBQeV9zc2l6ZV90IGkpCiB7Ci0JcmVnaXN0ZXIgYXJyYXlvYmplY3QgKmFwOwotCWFzc2VydChhcnJheV9DaGVjayhvcCkpOwotCWFwID0gKGFycmF5b2JqZWN0ICopb3A7Ci0JYXNzZXJ0KGk+PTAgJiYgaTxQeV9TSVpFKGFwKSk7Ci0JcmV0dXJuICgqYXAtPm9iX2Rlc2NyLT5nZXRpdGVtKShhcCwgaSk7CisgICAgcmVnaXN0ZXIgYXJyYXlvYmplY3QgKmFwOworICAgIGFzc2VydChhcnJheV9DaGVjayhvcCkpOworICAgIGFwID0gKGFycmF5b2JqZWN0ICopb3A7CisgICAgYXNzZXJ0KGk+PTAgJiYgaTxQeV9TSVpFKGFwKSk7CisgICAgcmV0dXJuICgqYXAtPm9iX2Rlc2NyLT5nZXRpdGVtKShhcCwgaSk7CiB9CiAKIHN0YXRpYyBpbnQKIGluczEoYXJyYXlvYmplY3QgKnNlbGYsIFB5X3NzaXplX3Qgd2hlcmUsIFB5T2JqZWN0ICp2KQogewotCWNoYXIgKml0ZW1zOwotCVB5X3NzaXplX3QgbiA9IFB5X1NJWkUoc2VsZik7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKCpzZWxmLT5vYl9kZXNjci0+c2V0aXRlbSkoc2VsZiwgLTEsIHYpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGNoYXIgKml0ZW1zOworICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoc2VsZik7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKCpzZWxmLT5vYl9kZXNjci0+c2V0aXRlbSkoc2VsZiwgLTEsIHYpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKGFycmF5X3Jlc2l6ZShzZWxmLCBuKzEpID09IC0xKQotCQlyZXR1cm4gLTE7Ci0JaXRlbXMgPSBzZWxmLT5vYl9pdGVtOwotCWlmICh3aGVyZSA8IDApIHsKLQkJd2hlcmUgKz0gbjsKLQkJaWYgKHdoZXJlIDwgMCkKLQkJCXdoZXJlID0gMDsKLQl9Ci0JaWYgKHdoZXJlID4gbikKLQkJd2hlcmUgPSBuOwotCS8qIGFwcGVuZHMgZG9uJ3QgbmVlZCB0byBjYWxsIG1lbW1vdmUoKSAqLwotCWlmICh3aGVyZSAhPSBuKQotCQltZW1tb3ZlKGl0ZW1zICsgKHdoZXJlKzEpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLQkJCWl0ZW1zICsgd2hlcmUqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplLAotCQkJKG4td2hlcmUpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0JcmV0dXJuICgqc2VsZi0+b2JfZGVzY3ItPnNldGl0ZW0pKHNlbGYsIHdoZXJlLCB2KTsKKyAgICBpZiAoYXJyYXlfcmVzaXplKHNlbGYsIG4rMSkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpdGVtcyA9IHNlbGYtPm9iX2l0ZW07CisgICAgaWYgKHdoZXJlIDwgMCkgeworICAgICAgICB3aGVyZSArPSBuOworICAgICAgICBpZiAod2hlcmUgPCAwKQorICAgICAgICAgICAgd2hlcmUgPSAwOworICAgIH0KKyAgICBpZiAod2hlcmUgPiBuKQorICAgICAgICB3aGVyZSA9IG47CisgICAgLyogYXBwZW5kcyBkb24ndCBuZWVkIHRvIGNhbGwgbWVtbW92ZSgpICovCisgICAgaWYgKHdoZXJlICE9IG4pCisgICAgICAgIG1lbW1vdmUoaXRlbXMgKyAod2hlcmUrMSkqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplLAorICAgICAgICAgICAgaXRlbXMgKyB3aGVyZSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUsCisgICAgICAgICAgICAobi13aGVyZSkqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICByZXR1cm4gKCpzZWxmLT5vYl9kZXNjci0+c2V0aXRlbSkoc2VsZiwgd2hlcmUsIHYpOwogfQogCiAvKiBNZXRob2RzICovCkBAIC00OTQsMTQxICs0OTQsMTQxIEBACiBzdGF0aWMgdm9pZAogYXJyYXlfZGVhbGxvYyhhcnJheW9iamVjdCAqb3ApCiB7Ci0JaWYgKG9wLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBvcCk7Ci0JaWYgKG9wLT5vYl9pdGVtICE9IE5VTEwpCi0JCVB5TWVtX0RFTChvcC0+b2JfaXRlbSk7Ci0JUHlfVFlQRShvcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopb3ApOworICAgIGlmIChvcC0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgb3ApOworICAgIGlmIChvcC0+b2JfaXRlbSAhPSBOVUxMKQorICAgICAgICBQeU1lbV9ERUwob3AtPm9iX2l0ZW0pOworICAgIFB5X1RZUEUob3ApLT50cF9mcmVlKChQeU9iamVjdCAqKW9wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3JpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCWFycmF5b2JqZWN0ICp2YSwgKndhOwotCVB5T2JqZWN0ICp2aSA9IE5VTEw7Ci0JUHlPYmplY3QgKndpID0gTlVMTDsKLQlQeV9zc2l6ZV90IGksIGs7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBhcnJheW9iamVjdCAqdmEsICp3YTsKKyAgICBQeU9iamVjdCAqdmkgPSBOVUxMOworICAgIFB5T2JqZWN0ICp3aSA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBpLCBrOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoIWFycmF5X0NoZWNrKHYpIHx8ICFhcnJheV9DaGVjayh3KSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGlmICghYXJyYXlfQ2hlY2sodikgfHwgIWFycmF5X0NoZWNrKHcpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CiAKLQl2YSA9IChhcnJheW9iamVjdCAqKXY7Ci0Jd2EgPSAoYXJyYXlvYmplY3QgKil3OworICAgIHZhID0gKGFycmF5b2JqZWN0ICopdjsKKyAgICB3YSA9IChhcnJheW9iamVjdCAqKXc7CiAKLQlpZiAoUHlfU0laRSh2YSkgIT0gUHlfU0laRSh3YSkgJiYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSkgewotCQkvKiBTaG9ydGN1dDogaWYgdGhlIGxlbmd0aHMgZGlmZmVyLCB0aGUgYXJyYXlzIGRpZmZlciAqLwotCQlpZiAob3AgPT0gUHlfRVEpCi0JCQlyZXMgPSBQeV9GYWxzZTsKLQkJZWxzZQotCQkJcmVzID0gUHlfVHJ1ZTsKLQkJUHlfSU5DUkVGKHJlcyk7Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIGlmIChQeV9TSVpFKHZhKSAhPSBQeV9TSVpFKHdhKSAmJiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpKSB7CisgICAgICAgIC8qIFNob3J0Y3V0OiBpZiB0aGUgbGVuZ3RocyBkaWZmZXIsIHRoZSBhcnJheXMgZGlmZmVyICovCisgICAgICAgIGlmIChvcCA9PSBQeV9FUSkKKyAgICAgICAgICAgIHJlcyA9IFB5X0ZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBQeV9UcnVlOworICAgICAgICBQeV9JTkNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQkvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBpbmRleCB3aGVyZSBpdGVtcyBhcmUgZGlmZmVyZW50ICovCi0JayA9IDE7Ci0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUodmEpICYmIGkgPCBQeV9TSVpFKHdhKTsgaSsrKSB7Ci0JCXZpID0gZ2V0YXJyYXlpdGVtKHYsIGkpOwotCQl3aSA9IGdldGFycmF5aXRlbSh3LCBpKTsKLQkJaWYgKHZpID09IE5VTEwgfHwgd2kgPT0gTlVMTCkgewotCQkJUHlfWERFQ1JFRih2aSk7Ci0JCQlQeV9YREVDUkVGKHdpKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWsgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodmksIHdpLCBQeV9FUSk7Ci0JCWlmIChrID09IDApCi0JCQlicmVhazsgLyogS2VlcGluZyB2aSBhbmQgd2kgYWxpdmUhICovCi0JCVB5X0RFQ1JFRih2aSk7Ci0JCVB5X0RFQ1JFRih3aSk7Ci0JCWlmIChrIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBpbmRleCB3aGVyZSBpdGVtcyBhcmUgZGlmZmVyZW50ICovCisgICAgayA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUodmEpICYmIGkgPCBQeV9TSVpFKHdhKTsgaSsrKSB7CisgICAgICAgIHZpID0gZ2V0YXJyYXlpdGVtKHYsIGkpOworICAgICAgICB3aSA9IGdldGFycmF5aXRlbSh3LCBpKTsKKyAgICAgICAgaWYgKHZpID09IE5VTEwgfHwgd2kgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfWERFQ1JFRih2aSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHdpKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGsgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodmksIHdpLCBQeV9FUSk7CisgICAgICAgIGlmIChrID09IDApCisgICAgICAgICAgICBicmVhazsgLyogS2VlcGluZyB2aSBhbmQgd2kgYWxpdmUhICovCisgICAgICAgIFB5X0RFQ1JFRih2aSk7CisgICAgICAgIFB5X0RFQ1JFRih3aSk7CisgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChrKSB7Ci0JCS8qIE5vIG1vcmUgaXRlbXMgdG8gY29tcGFyZSAtLSBjb21wYXJlIHNpemVzICovCi0JCVB5X3NzaXplX3QgdnMgPSBQeV9TSVpFKHZhKTsKLQkJUHlfc3NpemVfdCB3cyA9IFB5X1NJWkUod2EpOwotCQlpbnQgY21wOwotCQlzd2l0Y2ggKG9wKSB7Ci0JCWNhc2UgUHlfTFQ6IGNtcCA9IHZzIDwgIHdzOyBicmVhazsKLQkJY2FzZSBQeV9MRTogY21wID0gdnMgPD0gd3M7IGJyZWFrOwotCQljYXNlIFB5X0VROiBjbXAgPSB2cyA9PSB3czsgYnJlYWs7Ci0JCWNhc2UgUHlfTkU6IGNtcCA9IHZzICE9IHdzOyBicmVhazsKLQkJY2FzZSBQeV9HVDogY21wID0gdnMgPiAgd3M7IGJyZWFrOwotCQljYXNlIFB5X0dFOiBjbXAgPSB2cyA+PSB3czsgYnJlYWs7Ci0JCWRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBjYW5ub3QgaGFwcGVuICovCi0JCX0KLQkJaWYgKGNtcCkKLQkJCXJlcyA9IFB5X1RydWU7Ci0JCWVsc2UKLQkJCXJlcyA9IFB5X0ZhbHNlOwotCQlQeV9JTkNSRUYocmVzKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgaWYgKGspIHsKKyAgICAgICAgLyogTm8gbW9yZSBpdGVtcyB0byBjb21wYXJlIC0tIGNvbXBhcmUgc2l6ZXMgKi8KKyAgICAgICAgUHlfc3NpemVfdCB2cyA9IFB5X1NJWkUodmEpOworICAgICAgICBQeV9zc2l6ZV90IHdzID0gUHlfU0laRSh3YSk7CisgICAgICAgIGludCBjbXA7CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBQeV9MVDogY21wID0gdnMgPCAgd3M7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0xFOiBjbXAgPSB2cyA8PSB3czsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfRVE6IGNtcCA9IHZzID09IHdzOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9ORTogY21wID0gdnMgIT0gd3M7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0dUOiBjbXAgPSB2cyA+ICB3czsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfR0U6IGNtcCA9IHZzID49IHdzOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7IC8qIGNhbm5vdCBoYXBwZW4gKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoY21wKQorICAgICAgICAgICAgcmVzID0gUHlfVHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzID0gUHlfRmFsc2U7CisgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCS8qIFdlIGhhdmUgYW4gaXRlbSB0aGF0IGRpZmZlcnMuICBGaXJzdCwgc2hvcnRjdXRzIGZvciBFUS9ORSAqLwotCWlmIChvcCA9PSBQeV9FUSkgewotCQlQeV9JTkNSRUYoUHlfRmFsc2UpOwotCQlyZXMgPSBQeV9GYWxzZTsKLQl9Ci0JZWxzZSBpZiAob3AgPT0gUHlfTkUpIHsKLQkJUHlfSU5DUkVGKFB5X1RydWUpOwotCQlyZXMgPSBQeV9UcnVlOwotCX0KLQllbHNlIHsKLQkJLyogQ29tcGFyZSB0aGUgZmluYWwgaXRlbSBhZ2FpbiB1c2luZyB0aGUgcHJvcGVyIG9wZXJhdG9yICovCi0JCXJlcyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlKHZpLCB3aSwgb3ApOwotCX0KLQlQeV9ERUNSRUYodmkpOwotCVB5X0RFQ1JFRih3aSk7Ci0JcmV0dXJuIHJlczsKKyAgICAvKiBXZSBoYXZlIGFuIGl0ZW0gdGhhdCBkaWZmZXJzLiAgRmlyc3QsIHNob3J0Y3V0cyBmb3IgRVEvTkUgKi8KKyAgICBpZiAob3AgPT0gUHlfRVEpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X0ZhbHNlKTsKKyAgICAgICAgcmVzID0gUHlfRmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKG9wID09IFB5X05FKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9UcnVlKTsKKyAgICAgICAgcmVzID0gUHlfVHJ1ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIENvbXBhcmUgdGhlIGZpbmFsIGl0ZW0gYWdhaW4gdXNpbmcgdGhlIHByb3BlciBvcGVyYXRvciAqLworICAgICAgICByZXMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZSh2aSwgd2ksIG9wKTsKKyAgICB9CisgICAgUHlfREVDUkVGKHZpKTsKKyAgICBQeV9ERUNSRUYod2kpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBhcnJheV9sZW5ndGgoYXJyYXlvYmplY3QgKmEpCiB7Ci0JcmV0dXJuIFB5X1NJWkUoYSk7CisgICAgcmV0dXJuIFB5X1NJWkUoYSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9pdGVtKGFycmF5b2JqZWN0ICphLCBQeV9zc2l6ZV90IGkpCiB7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImFycmF5IGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilhLCBpKTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiYXJyYXkgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKWEsIGkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfc2xpY2UoYXJyYXlvYmplY3QgKmEsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKIHsKLQlhcnJheW9iamVjdCAqbnA7Ci0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQllbHNlIGlmIChpbG93ID4gUHlfU0laRShhKSkKLQkJaWxvdyA9IFB5X1NJWkUoYSk7Ci0JaWYgKGloaWdoIDwgMCkKLQkJaWhpZ2ggPSAwOwotCWlmIChpaGlnaCA8IGlsb3cpCi0JCWloaWdoID0gaWxvdzsKLQllbHNlIGlmIChpaGlnaCA+IFB5X1NJWkUoYSkpCi0JCWloaWdoID0gUHlfU0laRShhKTsKLQlucCA9IChhcnJheW9iamVjdCAqKSBuZXdhcnJheW9iamVjdCgmQXJyYXl0eXBlLCBpaGlnaCAtIGlsb3csIGEtPm9iX2Rlc2NyKTsKLQlpZiAobnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KG5wLT5vYl9pdGVtLCBhLT5vYl9pdGVtICsgaWxvdyAqIGEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLQkgICAgICAgKGloaWdoLWlsb3cpICogYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbnA7CisgICAgYXJyYXlvYmplY3QgKm5wOworICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgZWxzZSBpZiAoaWxvdyA+IFB5X1NJWkUoYSkpCisgICAgICAgIGlsb3cgPSBQeV9TSVpFKGEpOworICAgIGlmIChpaGlnaCA8IDApCisgICAgICAgIGloaWdoID0gMDsKKyAgICBpZiAoaWhpZ2ggPCBpbG93KQorICAgICAgICBpaGlnaCA9IGlsb3c7CisgICAgZWxzZSBpZiAoaWhpZ2ggPiBQeV9TSVpFKGEpKQorICAgICAgICBpaGlnaCA9IFB5X1NJWkUoYSk7CisgICAgbnAgPSAoYXJyYXlvYmplY3QgKikgbmV3YXJyYXlvYmplY3QoJkFycmF5dHlwZSwgaWhpZ2ggLSBpbG93LCBhLT5vYl9kZXNjcik7CisgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweShucC0+b2JfaXRlbSwgYS0+b2JfaXRlbSArIGlsb3cgKiBhLT5vYl9kZXNjci0+aXRlbXNpemUsCisgICAgICAgICAgIChpaGlnaC1pbG93KSAqIGEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5wOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfY29weShhcnJheW9iamVjdCAqYSwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlyZXR1cm4gYXJyYXlfc2xpY2UoYSwgMCwgUHlfU0laRShhKSk7CisgICAgcmV0dXJuIGFycmF5X3NsaWNlKGEsIDAsIFB5X1NJWkUoYSkpOwogfQogCiBQeURvY19TVFJWQVIoY29weV9kb2MsCkBAIC02MzksMjk3ICs2MzksMjk3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfY29uY2F0KGFycmF5b2JqZWN0ICphLCBQeU9iamVjdCAqYmIpCiB7Ci0JUHlfc3NpemVfdCBzaXplOwotCWFycmF5b2JqZWN0ICpucDsKLQlpZiAoIWFycmF5X0NoZWNrKGJiKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJjYW4gb25seSBhcHBlbmQgYXJyYXkgKG5vdCBcIiUuMjAwc1wiKSB0byBhcnJheSIsCi0JCQkgICAgIFB5X1RZUEUoYmIpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBhcnJheW9iamVjdCAqbnA7CisgICAgaWYgKCFhcnJheV9DaGVjayhiYikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAiY2FuIG9ubHkgYXBwZW5kIGFycmF5IChub3QgXCIlLjIwMHNcIikgdG8gYXJyYXkiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKGJiKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNkZWZpbmUgYiAoKGFycmF5b2JqZWN0ICopYmIpCi0JaWYgKGEtPm9iX2Rlc2NyICE9IGItPm9iX2Rlc2NyKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlfU0laRShhKSA+IFBZX1NTSVpFX1RfTUFYIC0gUHlfU0laRShiKSkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0Jc2l6ZSA9IFB5X1NJWkUoYSkgKyBQeV9TSVpFKGIpOwotCW5wID0gKGFycmF5b2JqZWN0ICopIG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIHNpemUsIGEtPm9iX2Rlc2NyKTsKLQlpZiAobnAgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtY3B5KG5wLT5vYl9pdGVtLCBhLT5vYl9pdGVtLCBQeV9TSVpFKGEpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0JbWVtY3B5KG5wLT5vYl9pdGVtICsgUHlfU0laRShhKSphLT5vYl9kZXNjci0+aXRlbXNpemUsCi0JICAgICAgIGItPm9iX2l0ZW0sIFB5X1NJWkUoYikqYi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbnA7CisgICAgaWYgKGEtPm9iX2Rlc2NyICE9IGItPm9iX2Rlc2NyKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlfU0laRShhKSA+IFBZX1NTSVpFX1RfTUFYIC0gUHlfU0laRShiKSkgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgc2l6ZSA9IFB5X1NJWkUoYSkgKyBQeV9TSVpFKGIpOworICAgIG5wID0gKGFycmF5b2JqZWN0ICopIG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIHNpemUsIGEtPm9iX2Rlc2NyKTsKKyAgICBpZiAobnAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtY3B5KG5wLT5vYl9pdGVtLCBhLT5vYl9pdGVtLCBQeV9TSVpFKGEpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgbWVtY3B5KG5wLT5vYl9pdGVtICsgUHlfU0laRShhKSphLT5vYl9kZXNjci0+aXRlbXNpemUsCisgICAgICAgICAgIGItPm9iX2l0ZW0sIFB5X1NJWkUoYikqYi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbnA7CiAjdW5kZWYgYgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfcmVwZWF0KGFycmF5b2JqZWN0ICphLCBQeV9zc2l6ZV90IG4pCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlhcnJheW9iamVjdCAqbnA7Ci0JY2hhciAqcDsKLQlQeV9zc2l6ZV90IG5ieXRlczsKLQlpZiAobiA8IDApCi0JCW4gPSAwOwotCWlmICgoUHlfU0laRShhKSAhPSAwKSAmJiAobiA+IFBZX1NTSVpFX1RfTUFYIC8gUHlfU0laRShhKSkpIHsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCXNpemUgPSBQeV9TSVpFKGEpICogbjsKLQlucCA9IChhcnJheW9iamVjdCAqKSBuZXdhcnJheW9iamVjdCgmQXJyYXl0eXBlLCBzaXplLCBhLT5vYl9kZXNjcik7Ci0JaWYgKG5wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXAgPSBucC0+b2JfaXRlbTsKLQluYnl0ZXMgPSBQeV9TSVpFKGEpICogYS0+b2JfZGVzY3ItPml0ZW1zaXplOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJbWVtY3B5KHAsIGEtPm9iX2l0ZW0sIG5ieXRlcyk7Ci0JCXAgKz0gbmJ5dGVzOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopIG5wOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgYXJyYXlvYmplY3QgKm5wOworICAgIGNoYXIgKnA7CisgICAgUHlfc3NpemVfdCBuYnl0ZXM7CisgICAgaWYgKG4gPCAwKQorICAgICAgICBuID0gMDsKKyAgICBpZiAoKFB5X1NJWkUoYSkgIT0gMCkgJiYgKG4gPiBQWV9TU0laRV9UX01BWCAvIFB5X1NJWkUoYSkpKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBzaXplID0gUHlfU0laRShhKSAqIG47CisgICAgbnAgPSAoYXJyYXlvYmplY3QgKikgbmV3YXJyYXlvYmplY3QoJkFycmF5dHlwZSwgc2l6ZSwgYS0+b2JfZGVzY3IpOworICAgIGlmIChucCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwID0gbnAtPm9iX2l0ZW07CisgICAgbmJ5dGVzID0gUHlfU0laRShhKSAqIGEtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIG1lbWNweShwLCBhLT5vYl9pdGVtLCBuYnl0ZXMpOworICAgICAgICBwICs9IG5ieXRlczsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBucDsKIH0KIAogc3RhdGljIGludAogYXJyYXlfYXNzX3NsaWNlKGFycmF5b2JqZWN0ICphLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gsIFB5T2JqZWN0ICp2KQogewotCWNoYXIgKml0ZW07Ci0JUHlfc3NpemVfdCBuOyAvKiBTaXplIG9mIHJlcGxhY2VtZW50IGFycmF5ICovCi0JUHlfc3NpemVfdCBkOyAvKiBDaGFuZ2UgaW4gc2l6ZSAqLworICAgIGNoYXIgKml0ZW07CisgICAgUHlfc3NpemVfdCBuOyAvKiBTaXplIG9mIHJlcGxhY2VtZW50IGFycmF5ICovCisgICAgUHlfc3NpemVfdCBkOyAvKiBDaGFuZ2UgaW4gc2l6ZSAqLwogI2RlZmluZSBiICgoYXJyYXlvYmplY3QgKil2KQotCWlmICh2ID09IE5VTEwpCi0JCW4gPSAwOwotCWVsc2UgaWYgKGFycmF5X0NoZWNrKHYpKSB7Ci0JCW4gPSBQeV9TSVpFKGIpOwotCQlpZiAoYSA9PSBiKSB7Ci0JCQkvKiBTcGVjaWFsIGNhc2UgImFbaTpqXSA9IGEiIC0tIGNvcHkgYiBmaXJzdCAqLwotCQkJaW50IHJldDsKLQkJCXYgPSBhcnJheV9zbGljZShiLCAwLCBuKTsKLQkJCWlmICghdikKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXQgPSBhcnJheV9hc3Nfc2xpY2UoYSwgaWxvdywgaWhpZ2gsIHYpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlpZiAoYi0+b2JfZGVzY3IgIT0gYS0+b2JfZGVzY3IpIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JICAgICAiY2FuIG9ubHkgYXNzaWduIGFycmF5IChub3QgXCIlLjIwMHNcIikgdG8gYXJyYXkgc2xpY2UiLAotCQkJICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoaWxvdyA8IDApCi0JCWlsb3cgPSAwOwotCWVsc2UgaWYgKGlsb3cgPiBQeV9TSVpFKGEpKQotCQlpbG93ID0gUHlfU0laRShhKTsKLQlpZiAoaWhpZ2ggPCAwKQotCQlpaGlnaCA9IDA7Ci0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWVsc2UgaWYgKGloaWdoID4gUHlfU0laRShhKSkKLQkJaWhpZ2ggPSBQeV9TSVpFKGEpOwotCWl0ZW0gPSBhLT5vYl9pdGVtOwotCWQgPSBuIC0gKGloaWdoLWlsb3cpOwotCWlmIChkIDwgMCkgeyAvKiBEZWxldGUgLWQgaXRlbXMgKi8KLQkJbWVtbW92ZShpdGVtICsgKGloaWdoK2QpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLQkJCWl0ZW0gKyBpaGlnaCphLT5vYl9kZXNjci0+aXRlbXNpemUsCi0JCQkoUHlfU0laRShhKS1paGlnaCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQkJUHlfU0laRShhKSArPSBkOwotCQlQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwgUHlfU0laRShhKSphLT5vYl9kZXNjci0+aXRlbXNpemUpOwotCQkJCQkJLyogQ2FuJ3QgZmFpbCAqLwotCQlhLT5vYl9pdGVtID0gaXRlbTsKLQkJYS0+YWxsb2NhdGVkID0gUHlfU0laRShhKTsKLQl9Ci0JZWxzZSBpZiAoZCA+IDApIHsgLyogSW5zZXJ0IGQgaXRlbXMgKi8KLQkJUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsCi0JCQkgICAgIChQeV9TSVpFKGEpICsgZCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQltZW1tb3ZlKGl0ZW0gKyAoaWhpZ2grZCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAotCQkJaXRlbSArIGloaWdoKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLQkJCShQeV9TSVpFKGEpLWloaWdoKSphLT5vYl9kZXNjci0+aXRlbXNpemUpOwotCQlhLT5vYl9pdGVtID0gaXRlbTsKLQkJUHlfU0laRShhKSArPSBkOwotCQlhLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKGEpOwotCX0KLQlpZiAobiA+IDApCi0JCW1lbWNweShpdGVtICsgaWxvdyphLT5vYl9kZXNjci0+aXRlbXNpemUsIGItPm9iX2l0ZW0sCi0JCSAgICAgICBuKmItPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgbiA9IDA7CisgICAgZWxzZSBpZiAoYXJyYXlfQ2hlY2sodikpIHsKKyAgICAgICAgbiA9IFB5X1NJWkUoYik7CisgICAgICAgIGlmIChhID09IGIpIHsKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSAiYVtpOmpdID0gYSIgLS0gY29weSBiIGZpcnN0ICovCisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgdiA9IGFycmF5X3NsaWNlKGIsIDAsIG4pOworICAgICAgICAgICAgaWYgKCF2KQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldCA9IGFycmF5X2Fzc19zbGljZShhLCBpbG93LCBpaGlnaCwgdik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmIChiLT5vYl9kZXNjciAhPSBhLT5vYl9kZXNjcikgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICJjYW4gb25seSBhc3NpZ24gYXJyYXkgKG5vdCBcIiUuMjAwc1wiKSB0byBhcnJheSBzbGljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGlsb3cgPCAwKQorICAgICAgICBpbG93ID0gMDsKKyAgICBlbHNlIGlmIChpbG93ID4gUHlfU0laRShhKSkKKyAgICAgICAgaWxvdyA9IFB5X1NJWkUoYSk7CisgICAgaWYgKGloaWdoIDwgMCkKKyAgICAgICAgaWhpZ2ggPSAwOworICAgIGlmIChpaGlnaCA8IGlsb3cpCisgICAgICAgIGloaWdoID0gaWxvdzsKKyAgICBlbHNlIGlmIChpaGlnaCA+IFB5X1NJWkUoYSkpCisgICAgICAgIGloaWdoID0gUHlfU0laRShhKTsKKyAgICBpdGVtID0gYS0+b2JfaXRlbTsKKyAgICBkID0gbiAtIChpaGlnaC1pbG93KTsKKyAgICBpZiAoZCA8IDApIHsgLyogRGVsZXRlIC1kIGl0ZW1zICovCisgICAgICAgIG1lbW1vdmUoaXRlbSArIChpaGlnaCtkKSphLT5vYl9kZXNjci0+aXRlbXNpemUsCisgICAgICAgICAgICBpdGVtICsgaWhpZ2gqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAorICAgICAgICAgICAgKFB5X1NJWkUoYSktaWhpZ2gpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgICAgIFB5X1NJWkUoYSkgKz0gZDsKKyAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIFB5X1NJWkUoYSkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYW4ndCBmYWlsICovCisgICAgICAgIGEtPm9iX2l0ZW0gPSBpdGVtOworICAgICAgICBhLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKGEpOworICAgIH0KKyAgICBlbHNlIGlmIChkID4gMCkgeyAvKiBJbnNlcnQgZCBpdGVtcyAqLworICAgICAgICBQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwKKyAgICAgICAgICAgICAgICAgICAgIChQeV9TSVpFKGEpICsgZCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1tb3ZlKGl0ZW0gKyAoaWhpZ2grZCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAorICAgICAgICAgICAgaXRlbSArIGloaWdoKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgIChQeV9TSVpFKGEpLWloaWdoKSphLT5vYl9kZXNjci0+aXRlbXNpemUpOworICAgICAgICBhLT5vYl9pdGVtID0gaXRlbTsKKyAgICAgICAgUHlfU0laRShhKSArPSBkOworICAgICAgICBhLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKGEpOworICAgIH0KKyAgICBpZiAobiA+IDApCisgICAgICAgIG1lbWNweShpdGVtICsgaWxvdyphLT5vYl9kZXNjci0+aXRlbXNpemUsIGItPm9iX2l0ZW0sCisgICAgICAgICAgICAgICBuKmItPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgcmV0dXJuIDA7CiAjdW5kZWYgYgogfQogCiBzdGF0aWMgaW50CiBhcnJheV9hc3NfaXRlbShhcnJheW9iamVjdCAqYSwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJICAgICAgICAgImFycmF5IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIGFycmF5X2Fzc19zbGljZShhLCBpLCBpKzEsIHYpOwotCXJldHVybiAoKmEtPm9iX2Rlc2NyLT5zZXRpdGVtKShhLCBpLCB2KTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBhcnJheV9hc3Nfc2xpY2UoYSwgaSwgaSsxLCB2KTsKKyAgICByZXR1cm4gKCphLT5vYl9kZXNjci0+c2V0aXRlbSkoYSwgaSwgdik7CiB9CiAKIHN0YXRpYyBpbnQKIHNldGFycmF5aXRlbShQeU9iamVjdCAqYSwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQlhc3NlcnQoYXJyYXlfQ2hlY2soYSkpOwotCXJldHVybiBhcnJheV9hc3NfaXRlbSgoYXJyYXlvYmplY3QgKilhLCBpLCB2KTsKKyAgICBhc3NlcnQoYXJyYXlfQ2hlY2soYSkpOworICAgIHJldHVybiBhcnJheV9hc3NfaXRlbSgoYXJyYXlvYmplY3QgKilhLCBpLCB2KTsKIH0KIAogc3RhdGljIGludAogYXJyYXlfaXRlcl9leHRlbmQoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpiYikKIHsKLQlQeU9iamVjdCAqaXQsICp2OworICAgIFB5T2JqZWN0ICppdCwgKnY7CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoYmIpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGJiKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0Jd2hpbGUgKCh2ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCWlmIChpbnMxKHNlbGYsIChpbnQpIFB5X1NJWkUoc2VsZiksIHYpICE9IDApIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKHYpOwotCX0KLQlQeV9ERUNSRUYoaXQpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgd2hpbGUgKCh2ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChpbnMxKHNlbGYsIChpbnQpIFB5X1NJWkUoc2VsZiksIHYpICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICBQeV9ERUNSRUYoaXQpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGFycmF5X2RvX2V4dGVuZChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmJiKQogewotCVB5X3NzaXplX3Qgc2l6ZTsKLQljaGFyICpvbGRfaXRlbTsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgY2hhciAqb2xkX2l0ZW07CiAKLQlpZiAoIWFycmF5X0NoZWNrKGJiKSkKLQkJcmV0dXJuIGFycmF5X2l0ZXJfZXh0ZW5kKHNlbGYsIGJiKTsKKyAgICBpZiAoIWFycmF5X0NoZWNrKGJiKSkKKyAgICAgICAgcmV0dXJuIGFycmF5X2l0ZXJfZXh0ZW5kKHNlbGYsIGJiKTsKICNkZWZpbmUgYiAoKGFycmF5b2JqZWN0ICopYmIpCi0JaWYgKHNlbGYtPm9iX2Rlc2NyICE9IGItPm9iX2Rlc2NyKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYW4gb25seSBleHRlbmQgd2l0aCBhcnJheSBvZiBzYW1lIGtpbmQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKFB5X1NJWkUoc2VsZikgPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoYikpIHx8Ci0JCSgoUHlfU0laRShzZWxmKSArIFB5X1NJWkUoYikpID4gUFlfU1NJWkVfVF9NQVggLyBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2l6ZSA9IFB5X1NJWkUoc2VsZikgKyBQeV9TSVpFKGIpOwotCW9sZF9pdGVtID0gc2VsZi0+b2JfaXRlbTsKLSAgICAgICAgUHlNZW1fUkVTSVpFKHNlbGYtPm9iX2l0ZW0sIGNoYXIsIHNpemUqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLSAgICAgICAgaWYgKHNlbGYtPm9iX2l0ZW0gPT0gTlVMTCkgewotCQlzZWxmLT5vYl9pdGVtID0gb2xkX2l0ZW07Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLSAgICAgICAgfQotCW1lbWNweShzZWxmLT5vYl9pdGVtICsgUHlfU0laRShzZWxmKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUsCi0gICAgICAgICAgICAgICBiLT5vYl9pdGVtLCBQeV9TSVpFKGIpKmItPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0JUHlfU0laRShzZWxmKSA9IHNpemU7Ci0Jc2VsZi0+YWxsb2NhdGVkID0gc2l6ZTsKKyAgICBpZiAoc2VsZi0+b2JfZGVzY3IgIT0gYi0+b2JfZGVzY3IpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjYW4gb25seSBleHRlbmQgd2l0aCBhcnJheSBvZiBzYW1lIGtpbmQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKFB5X1NJWkUoc2VsZikgPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoYikpIHx8CisgICAgICAgICgoUHlfU0laRShzZWxmKSArIFB5X1NJWkUoYikpID4gUFlfU1NJWkVfVF9NQVggLyBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc2l6ZSA9IFB5X1NJWkUoc2VsZikgKyBQeV9TSVpFKGIpOworICAgIG9sZF9pdGVtID0gc2VsZi0+b2JfaXRlbTsKKyAgICBQeU1lbV9SRVNJWkUoc2VsZi0+b2JfaXRlbSwgY2hhciwgc2l6ZSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpOworICAgIGlmIChzZWxmLT5vYl9pdGVtID09IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+b2JfaXRlbSA9IG9sZF9pdGVtOworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbWNweShzZWxmLT5vYl9pdGVtICsgUHlfU0laRShzZWxmKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUsCisgICAgICAgICAgIGItPm9iX2l0ZW0sIFB5X1NJWkUoYikqYi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICBQeV9TSVpFKHNlbGYpID0gc2l6ZTsKKyAgICBzZWxmLT5hbGxvY2F0ZWQgPSBzaXplOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAjdW5kZWYgYgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfaW5wbGFjZV9jb25jYXQoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpiYikKIHsKLQlpZiAoIWFycmF5X0NoZWNrKGJiKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJImNhbiBvbmx5IGV4dGVuZCBhcnJheSB3aXRoIGFycmF5IChub3QgXCIlLjIwMHNcIikiLAotCQkJUHlfVFlQRShiYiktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGFycmF5X2RvX2V4dGVuZChzZWxmLCBiYikgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBpZiAoIWFycmF5X0NoZWNrKGJiKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImNhbiBvbmx5IGV4dGVuZCBhcnJheSB3aXRoIGFycmF5IChub3QgXCIlLjIwMHNcIikiLAorICAgICAgICAgICAgUHlfVFlQRShiYiktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGFycmF5X2RvX2V4dGVuZChzZWxmLCBiYikgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2lucGxhY2VfcmVwZWF0KGFycmF5b2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IG4pCiB7Ci0JY2hhciAqaXRlbXMsICpwOwotCVB5X3NzaXplX3Qgc2l6ZSwgaTsKKyAgICBjaGFyICppdGVtcywgKnA7CisgICAgUHlfc3NpemVfdCBzaXplLCBpOwogCi0JaWYgKFB5X1NJWkUoc2VsZikgPiAwKSB7Ci0JCWlmIChuIDwgMCkKLQkJCW4gPSAwOwotCQlpdGVtcyA9IHNlbGYtPm9iX2l0ZW07Ci0JCWlmICgoc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplICE9IDApICYmIAotCQkJKFB5X1NJWkUoc2VsZikgPiBQWV9TU0laRV9UX01BWCAvIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSkpIHsKLQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQl9Ci0JCXNpemUgPSBQeV9TSVpFKHNlbGYpICogc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOwotCQlpZiAobiA9PSAwKSB7Ci0JCQlQeU1lbV9GUkVFKGl0ZW1zKTsKLQkJCXNlbGYtPm9iX2l0ZW0gPSBOVUxMOwotCQkJUHlfU0laRShzZWxmKSA9IDA7Ci0JCQlzZWxmLT5hbGxvY2F0ZWQgPSAwOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAvIG4pIHsKLQkJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJCX0KLQkJCVB5TWVtX1JFU0laRShpdGVtcywgY2hhciwgbiAqIHNpemUpOwotCQkJaWYgKGl0ZW1zID09IE5VTEwpCi0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCQlwID0gaXRlbXM7Ci0JCQlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7Ci0JCQkJcCArPSBzaXplOwotCQkJCW1lbWNweShwLCBpdGVtcywgc2l6ZSk7Ci0JCQl9Ci0JCQlzZWxmLT5vYl9pdGVtID0gaXRlbXM7Ci0JCQlQeV9TSVpFKHNlbGYpICo9IG47Ci0JCQlzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOwotCQl9Ci0JfQotCVB5X0lOQ1JFRihzZWxmKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBpZiAoUHlfU0laRShzZWxmKSA+IDApIHsKKyAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgbiA9IDA7CisgICAgICAgIGl0ZW1zID0gc2VsZi0+b2JfaXRlbTsKKyAgICAgICAgaWYgKChzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUgIT0gMCkgJiYKKyAgICAgICAgICAgIChQeV9TSVpFKHNlbGYpID4gUFlfU1NJWkVfVF9NQVggLyBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgfQorICAgICAgICBzaXplID0gUHlfU0laRShzZWxmKSAqIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgUHlNZW1fRlJFRShpdGVtcyk7CisgICAgICAgICAgICBzZWxmLT5vYl9pdGVtID0gTlVMTDsKKyAgICAgICAgICAgIFB5X1NJWkUoc2VsZikgPSAwOworICAgICAgICAgICAgc2VsZi0+YWxsb2NhdGVkID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLyBuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeU1lbV9SRVNJWkUoaXRlbXMsIGNoYXIsIG4gKiBzaXplKTsKKyAgICAgICAgICAgIGlmIChpdGVtcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcCA9IGl0ZW1zOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIHAgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocCwgaXRlbXMsIHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSA9IGl0ZW1zOworICAgICAgICAgICAgUHlfU0laRShzZWxmKSAqPSBuOworICAgICAgICAgICAgc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGlucyhhcnJheW9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCB3aGVyZSwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKGluczEoc2VsZiwgd2hlcmUsIHYpICE9IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoaW5zMShzZWxmLCB3aGVyZSwgdikgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfY291bnQoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgY291bnQgPSAwOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpzZWxmaSA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLCBpKTsKLQkJaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmaSwgdiwgUHlfRVEpOwotCQlQeV9ERUNSRUYoc2VsZmkpOwotCQlpZiAoY21wID4gMCkKLQkJCWNvdW50Kys7Ci0JCWVsc2UgaWYgKGNtcCA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpzZWxmaSA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLCBpKTsKKyAgICAgICAgaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmaSwgdiwgUHlfRVEpOworICAgICAgICBQeV9ERUNSRUYoc2VsZmkpOworICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvdW50X2RvYywKQEAgLTk0MCwyMCArOTQwLDIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfaW5kZXgoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpzZWxmaSA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLCBpKTsKLQkJaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmaSwgdiwgUHlfRVEpOwotCQlQeV9ERUNSRUYoc2VsZmkpOwotCQlpZiAoY21wID4gMCkgewotCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWkpOwotCQl9Ci0JCWVsc2UgaWYgKGNtcCA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJhcnJheS5pbmRleCh4KTogeCBub3QgaW4gbGlzdCIpOwotCXJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnNlbGZpID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsIGkpOworICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGZpLCB2LCBQeV9FUSk7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmaSk7CisgICAgICAgIGlmIChjbXAgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFycmF5LmluZGV4KHgpOiB4IG5vdCBpbiBsaXN0Iik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihpbmRleF9kb2MsCkBAIC05NjQsMzggKzk2NCwzOCBAQAogc3RhdGljIGludAogYXJyYXlfY29udGFpbnMoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgaTsKLQlpbnQgY21wOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgY21wOwogCi0JZm9yIChpID0gMCwgY21wID0gMCA7IGNtcCA9PSAwICYmIGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKLQkJUHlPYmplY3QgKnNlbGZpID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsIGkpOwotCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZmksIHYsIFB5X0VRKTsKLQkJUHlfREVDUkVGKHNlbGZpKTsKLQl9Ci0JcmV0dXJuIGNtcDsKKyAgICBmb3IgKGkgPSAwLCBjbXAgPSAwIDsgY21wID09IDAgJiYgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqc2VsZmkgPSBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopc2VsZiwgaSk7CisgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmaSwgdiwgUHlfRVEpOworICAgICAgICBQeV9ERUNSRUYoc2VsZmkpOworICAgIH0KKyAgICByZXR1cm4gY21wOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfcmVtb3ZlKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKLQkJUHlPYmplY3QgKnNlbGZpID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsaSk7Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZmksIHYsIFB5X0VRKTsKLQkJUHlfREVDUkVGKHNlbGZpKTsKLQkJaWYgKGNtcCA+IDApIHsKLQkJCWlmIChhcnJheV9hc3Nfc2xpY2Uoc2VsZiwgaSwgaSsxLAotCQkJCQkgICAoUHlPYmplY3QgKilOVUxMKSAhPSAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJZWxzZSBpZiAoY21wIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFycmF5LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdCIpOwotCXJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnNlbGZpID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsaSk7CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZmksIHYsIFB5X0VRKTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGZpKTsKKyAgICAgICAgaWYgKGNtcCA+IDApIHsKKyAgICAgICAgICAgIGlmIChhcnJheV9hc3Nfc2xpY2Uoc2VsZiwgaSwgaSsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKU5VTEwpICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYXJyYXkucmVtb3ZlKHgpOiB4IG5vdCBpbiBsaXN0Iik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihyZW1vdmVfZG9jLApAQCAtMTAwNiwyNyArMTAwNiwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3BvcChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpID0gLTE7Ci0JUHlPYmplY3QgKnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpwb3AiLCAmaSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeV9TSVpFKHNlbGYpID09IDApIHsKLQkJLyogU3BlY2lhbC1jYXNlIG1vc3QgY29tbW9uIGZhaWx1cmUgY2F1c2UgKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgZnJvbSBlbXB0eSBhcnJheSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGkgPCAwKQotCQlpICs9IFB5X1NJWkUoc2VsZik7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShzZWxmKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInBvcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXYgPSBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopc2VsZixpKTsKLQlpZiAoYXJyYXlfYXNzX3NsaWNlKHNlbGYsIGksIGkrMSwgKFB5T2JqZWN0ICopTlVMTCkgIT0gMCkgewotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gdjsKKyAgICBQeV9zc2l6ZV90IGkgPSAtMTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnBvcCIsICZpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5X1NJWkUoc2VsZikgPT0gMCkgeworICAgICAgICAvKiBTcGVjaWFsLWNhc2UgbW9zdCBjb21tb24gZmFpbHVyZSBjYXVzZSAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInBvcCBmcm9tIGVtcHR5IGFycmF5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaSA8IDApCisgICAgICAgIGkgKz0gUHlfU0laRShzZWxmKTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKHNlbGYpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdiA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLGkpOworICAgIGlmIChhcnJheV9hc3Nfc2xpY2Uoc2VsZiwgaSwgaSsxLCAoUHlPYmplY3QgKilOVUxMKSAhPSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB2OwogfQogCiBQeURvY19TVFJWQVIocG9wX2RvYywKQEAgLTEwMzcsMTAgKzEwMzcsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9leHRlbmQoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpiYikKIHsKLQlpZiAoYXJyYXlfZG9fZXh0ZW5kKHNlbGYsIGJiKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChhcnJheV9kb19leHRlbmQoc2VsZiwgYmIpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihleHRlbmRfZG9jLApAQCAtMTA1MSwxMSArMTA1MSwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2luc2VydChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICp2OwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5POmluc2VydCIsICZpLCAmdikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBpbnMoc2VsZiwgaSwgdik7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICp2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibk86aW5zZXJ0IiwgJmksICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGlucyhzZWxmLCBpLCB2KTsKIH0KIAogUHlEb2NfU1RSVkFSKGluc2VydF9kb2MsCkBAIC0xMDY3LDE1ICsxMDY3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfYnVmZmVyX2luZm8oYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7Ci0JcmV0dmFsID0gUHlUdXBsZV9OZXcoMik7Ci0JaWYgKCFyZXR2YWwpCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOworICAgIHJldHZhbCA9IFB5VHVwbGVfTmV3KDIpOworICAgIGlmICghcmV0dmFsKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5VHVwbGVfU0VUX0lURU0ocmV0dmFsLCAwLCBQeUxvbmdfRnJvbVZvaWRQdHIoc2VsZi0+b2JfaXRlbSkpOwotCVB5VHVwbGVfU0VUX0lURU0ocmV0dmFsLCAxLCBQeUludF9Gcm9tTG9uZygobG9uZykoUHlfU0laRShzZWxmKSkpKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHJldHZhbCwgMCwgUHlMb25nX0Zyb21Wb2lkUHRyKHNlbGYtPm9iX2l0ZW0pKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHJldHZhbCwgMSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpKFB5X1NJWkUoc2VsZikpKSk7CiAKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIFB5RG9jX1NUUlZBUihidWZmZXJfaW5mb19kb2MsCkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2FwcGVuZChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIGlucyhzZWxmLCAoaW50KSBQeV9TSVpFKHNlbGYpLCB2KTsKKyAgICByZXR1cm4gaW5zKHNlbGYsIChpbnQpIFB5X1NJWkUoc2VsZiksIHYpOwogfQogCiBQeURvY19TVFJWQVIoYXBwZW5kX2RvYywKQEAgLTExMDIsNTIgKzExMDIsNTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9ieXRlc3dhcChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQljaGFyICpwOwotCVB5X3NzaXplX3QgaTsKKyAgICBjaGFyICpwOworICAgIFB5X3NzaXplX3QgaTsKIAotCXN3aXRjaCAoc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSB7Ci0JY2FzZSAxOgotCQlicmVhazsKLQljYXNlIDI6Ci0JCWZvciAocCA9IHNlbGYtPm9iX2l0ZW0sIGkgPSBQeV9TSVpFKHNlbGYpOyAtLWkgPj0gMDsgcCArPSAyKSB7Ci0JCQljaGFyIHAwID0gcFswXTsKLQkJCXBbMF0gPSBwWzFdOwotCQkJcFsxXSA9IHAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJZm9yIChwID0gc2VsZi0+b2JfaXRlbSwgaSA9IFB5X1NJWkUoc2VsZik7IC0taSA+PSAwOyBwICs9IDQpIHsKLQkJCWNoYXIgcDAgPSBwWzBdOwotCQkJY2hhciBwMSA9IHBbMV07Ci0JCQlwWzBdID0gcFszXTsKLQkJCXBbMV0gPSBwWzJdOwotCQkJcFsyXSA9IHAxOwotCQkJcFszXSA9IHAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJZm9yIChwID0gc2VsZi0+b2JfaXRlbSwgaSA9IFB5X1NJWkUoc2VsZik7IC0taSA+PSAwOyBwICs9IDgpIHsKLQkJCWNoYXIgcDAgPSBwWzBdOwotCQkJY2hhciBwMSA9IHBbMV07Ci0JCQljaGFyIHAyID0gcFsyXTsKLQkJCWNoYXIgcDMgPSBwWzNdOwotCQkJcFswXSA9IHBbN107Ci0JCQlwWzFdID0gcFs2XTsKLQkJCXBbMl0gPSBwWzVdOwotCQkJcFszXSA9IHBbNF07Ci0JCQlwWzRdID0gcDM7Ci0JCQlwWzVdID0gcDI7Ci0JCQlwWzZdID0gcDE7Ci0JCQlwWzddID0gcDA7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJkb24ndCBrbm93IGhvdyB0byBieXRlc3dhcCB0aGlzIGFycmF5IHR5cGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzd2l0Y2ggKHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSkgeworICAgIGNhc2UgMToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBmb3IgKHAgPSBzZWxmLT5vYl9pdGVtLCBpID0gUHlfU0laRShzZWxmKTsgLS1pID49IDA7IHAgKz0gMikgeworICAgICAgICAgICAgY2hhciBwMCA9IHBbMF07CisgICAgICAgICAgICBwWzBdID0gcFsxXTsKKyAgICAgICAgICAgIHBbMV0gPSBwMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGZvciAocCA9IHNlbGYtPm9iX2l0ZW0sIGkgPSBQeV9TSVpFKHNlbGYpOyAtLWkgPj0gMDsgcCArPSA0KSB7CisgICAgICAgICAgICBjaGFyIHAwID0gcFswXTsKKyAgICAgICAgICAgIGNoYXIgcDEgPSBwWzFdOworICAgICAgICAgICAgcFswXSA9IHBbM107CisgICAgICAgICAgICBwWzFdID0gcFsyXTsKKyAgICAgICAgICAgIHBbMl0gPSBwMTsKKyAgICAgICAgICAgIHBbM10gPSBwMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIGZvciAocCA9IHNlbGYtPm9iX2l0ZW0sIGkgPSBQeV9TSVpFKHNlbGYpOyAtLWkgPj0gMDsgcCArPSA4KSB7CisgICAgICAgICAgICBjaGFyIHAwID0gcFswXTsKKyAgICAgICAgICAgIGNoYXIgcDEgPSBwWzFdOworICAgICAgICAgICAgY2hhciBwMiA9IHBbMl07CisgICAgICAgICAgICBjaGFyIHAzID0gcFszXTsKKyAgICAgICAgICAgIHBbMF0gPSBwWzddOworICAgICAgICAgICAgcFsxXSA9IHBbNl07CisgICAgICAgICAgICBwWzJdID0gcFs1XTsKKyAgICAgICAgICAgIHBbM10gPSBwWzRdOworICAgICAgICAgICAgcFs0XSA9IHAzOworICAgICAgICAgICAgcFs1XSA9IHAyOworICAgICAgICAgICAgcFs2XSA9IHAxOworICAgICAgICAgICAgcFs3XSA9IHAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgImRvbid0IGtub3cgaG93IHRvIGJ5dGVzd2FwIHRoaXMgYXJyYXkgdHlwZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoYnl0ZXN3YXBfZG9jLApAQCAtMTE1OSwyOCArMTE1OSwyOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3JldmVyc2UoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLQlyZWdpc3RlciBjaGFyICpwLCAqcTsKLQkvKiBsaXR0bGUgYnVmZmVyIHRvIGhvbGQgaXRlbXMgd2hpbGUgc3dhcHBpbmcgKi8KLQljaGFyIHRtcFsyNTZdOwkvKiA4IGlzIHByb2JhYmx5IGVub3VnaCAtLSBidXQgd2h5IHNraW1wICovCi0JYXNzZXJ0KChzaXplX3QpaXRlbXNpemUgPD0gc2l6ZW9mKHRtcCkpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaXRlbXNpemUgPSBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgcmVnaXN0ZXIgY2hhciAqcCwgKnE7CisgICAgLyogbGl0dGxlIGJ1ZmZlciB0byBob2xkIGl0ZW1zIHdoaWxlIHN3YXBwaW5nICovCisgICAgY2hhciB0bXBbMjU2XTsgICAgICAvKiA4IGlzIHByb2JhYmx5IGVub3VnaCAtLSBidXQgd2h5IHNraW1wICovCisgICAgYXNzZXJ0KChzaXplX3QpaXRlbXNpemUgPD0gc2l6ZW9mKHRtcCkpOwogCi0JaWYgKFB5X1NJWkUoc2VsZikgPiAxKSB7Ci0JCWZvciAocCA9IHNlbGYtPm9iX2l0ZW0sCi0JCSAgICAgcSA9IHNlbGYtPm9iX2l0ZW0gKyAoUHlfU0laRShzZWxmKSAtIDEpKml0ZW1zaXplOwotCQkgICAgIHAgPCBxOwotCQkgICAgIHAgKz0gaXRlbXNpemUsIHEgLT0gaXRlbXNpemUpIHsKLQkJCS8qIG1lbW9yeSBhcmVhcyBndWFyYW50ZWVkIGRpc2pvaW50LCBzbyBtZW1jcHkKLQkJCSAqIGlzIHNhZmUgKCYgbWVtbW92ZSBtYXkgYmUgc2xvd2VyKS4KLQkJCSAqLwotCQkJbWVtY3B5KHRtcCwgcCwgaXRlbXNpemUpOwotCQkJbWVtY3B5KHAsIHEsIGl0ZW1zaXplKTsKLQkJCW1lbWNweShxLCB0bXAsIGl0ZW1zaXplKTsKLQkJfQotCX0KKyAgICBpZiAoUHlfU0laRShzZWxmKSA+IDEpIHsKKyAgICAgICAgZm9yIChwID0gc2VsZi0+b2JfaXRlbSwKKyAgICAgICAgICAgICBxID0gc2VsZi0+b2JfaXRlbSArIChQeV9TSVpFKHNlbGYpIC0gMSkqaXRlbXNpemU7CisgICAgICAgICAgICAgcCA8IHE7CisgICAgICAgICAgICAgcCArPSBpdGVtc2l6ZSwgcSAtPSBpdGVtc2l6ZSkgeworICAgICAgICAgICAgLyogbWVtb3J5IGFyZWFzIGd1YXJhbnRlZWQgZGlzam9pbnQsIHNvIG1lbWNweQorICAgICAgICAgICAgICogaXMgc2FmZSAoJiBtZW1tb3ZlIG1heSBiZSBzbG93ZXIpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtZW1jcHkodG1wLCBwLCBpdGVtc2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkocCwgcSwgaXRlbXNpemUpOworICAgICAgICAgICAgbWVtY3B5KHEsIHRtcCwgaXRlbXNpemUpOworICAgICAgICB9CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHJldmVyc2VfZG9jLApAQCAtMTE5MSw1MCArMTE5MSw1MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2Zyb21maWxlKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZjsKLQlQeV9zc2l6ZV90IG47Ci0JRklMRSAqZnA7Ci0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT246ZnJvbWZpbGUiLCAmZiwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQlmcCA9IFB5RmlsZV9Bc0ZpbGUoZik7Ci0JaWYgKGZwID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZzEgbXVzdCBiZSBvcGVuIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuID4gMCkgewotCQljaGFyICppdGVtID0gc2VsZi0+b2JfaXRlbTsKLQkJUHlfc3NpemVfdCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLQkJc2l6ZV90IG5yZWFkOwotCQlQeV9zc2l6ZV90IG5ld2xlbmd0aDsKLQkJc2l6ZV90IG5ld2J5dGVzOwotCQkvKiBCZSBjYXJlZnVsIGhlcmUgYWJvdXQgb3ZlcmZsb3cgKi8KLQkJaWYgKChuZXdsZW5ndGggPSBQeV9TSVpFKHNlbGYpICsgbikgPD0gMCB8fAotCQkgICAgKG5ld2J5dGVzID0gbmV3bGVuZ3RoICogaXRlbXNpemUpIC8gaXRlbXNpemUgIT0KLQkJICAgIChzaXplX3QpbmV3bGVuZ3RoKQotCQkJZ290byBub21lbTsKLQkJUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIG5ld2J5dGVzKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkgIG5vbWVtOgotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNlbGYtPm9iX2l0ZW0gPSBpdGVtOwotCQlQeV9TSVpFKHNlbGYpICs9IG47Ci0JCXNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7Ci0JCW5yZWFkID0gZnJlYWQoaXRlbSArIChQeV9TSVpFKHNlbGYpIC0gbikgKiBpdGVtc2l6ZSwKLQkJCSAgICAgIGl0ZW1zaXplLCBuLCBmcCk7Ci0JCWlmIChucmVhZCA8IChzaXplX3QpbikgewotCQkgIFB5X1NJWkUoc2VsZikgLT0gKG4gLSBucmVhZCk7Ci0JCQlQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwgUHlfU0laRShzZWxmKSppdGVtc2l6ZSk7Ci0JCQlzZWxmLT5vYl9pdGVtID0gaXRlbTsKLQkJCXNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCi0JCQkJICAgICAgICAgIm5vdCBlbm91Z2ggaXRlbXMgaW4gZmlsZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5T2JqZWN0ICpmOworICAgIFB5X3NzaXplX3QgbjsKKyAgICBGSUxFICpmcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9uOmZyb21maWxlIiwgJmYsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZnAgPSBQeUZpbGVfQXNGaWxlKGYpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmcxIG11c3QgYmUgb3BlbiBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgY2hhciAqaXRlbSA9IHNlbGYtPm9iX2l0ZW07CisgICAgICAgIFB5X3NzaXplX3QgaXRlbXNpemUgPSBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgICAgIHNpemVfdCBucmVhZDsKKyAgICAgICAgUHlfc3NpemVfdCBuZXdsZW5ndGg7CisgICAgICAgIHNpemVfdCBuZXdieXRlczsKKyAgICAgICAgLyogQmUgY2FyZWZ1bCBoZXJlIGFib3V0IG92ZXJmbG93ICovCisgICAgICAgIGlmICgobmV3bGVuZ3RoID0gUHlfU0laRShzZWxmKSArIG4pIDw9IDAgfHwKKyAgICAgICAgICAgIChuZXdieXRlcyA9IG5ld2xlbmd0aCAqIGl0ZW1zaXplKSAvIGl0ZW1zaXplICE9CisgICAgICAgICAgICAoc2l6ZV90KW5ld2xlbmd0aCkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIFB5TWVtX1JFU0laRShpdGVtLCBjaGFyLCBuZXdieXRlcyk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICBub21lbToKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5vYl9pdGVtID0gaXRlbTsKKyAgICAgICAgUHlfU0laRShzZWxmKSArPSBuOworICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBucmVhZCA9IGZyZWFkKGl0ZW0gKyAoUHlfU0laRShzZWxmKSAtIG4pICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaXRlbXNpemUsIG4sIGZwKTsKKyAgICAgICAgaWYgKG5yZWFkIDwgKHNpemVfdCluKSB7CisgICAgICAgICAgUHlfU0laRShzZWxmKSAtPSAobiAtIG5yZWFkKTsKKyAgICAgICAgICAgIFB5TWVtX1JFU0laRShpdGVtLCBjaGFyLCBQeV9TSVpFKHNlbGYpKml0ZW1zaXplKTsKKyAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBpdGVtOworICAgICAgICAgICAgc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggaXRlbXMgaW4gZmlsZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZnJvbWZpbGVfZG9jLApAQCAtMTI0NywzMyArMTI0NywzMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2Zyb21maWxlX2FzX3JlYWQoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChQeUVycl9XYXJuUHkzaygiYXJyYXkucmVhZCgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCi0JCQkgICAidXNlIGFycmF5LmZyb21maWxlKCkiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBhcnJheV9mcm9tZmlsZShzZWxmLCBhcmdzKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImFycmF5LnJlYWQoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgorICAgICAgICAgICAgICAgICAgICAgICAidXNlIGFycmF5LmZyb21maWxlKCkiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBhcnJheV9mcm9tZmlsZShzZWxmLCBhcmdzKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfdG9maWxlKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqZikKIHsKLQlGSUxFICpmcDsKKyAgICBGSUxFICpmcDsKIAotCWZwID0gUHlGaWxlX0FzRmlsZShmKTsKLQlpZiAoZnAgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIG11c3QgYmUgb3BlbiBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc2VsZi0+b2Jfc2l6ZSA+IDApIHsKLQkJaWYgKGZ3cml0ZShzZWxmLT5vYl9pdGVtLCBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUsCi0JCQkgICBzZWxmLT5vYl9zaXplLCBmcCkgIT0gKHNpemVfdClzZWxmLT5vYl9zaXplKSB7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQljbGVhcmVycihmcCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZnAgPSBQeUZpbGVfQXNGaWxlKGYpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmcgbXVzdCBiZSBvcGVuIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzZWxmLT5vYl9zaXplID4gMCkgeworICAgICAgICBpZiAoZndyaXRlKHNlbGYtPm9iX2l0ZW0sIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9zaXplLCBmcCkgIT0gKHNpemVfdClzZWxmLT5vYl9zaXplKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICBjbGVhcmVycihmcCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUih0b2ZpbGVfZG9jLApAQCAtMTI4Niw1MyArMTI4Niw1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3RvZmlsZV9hc193cml0ZShhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmYpCiB7Ci0JaWYgKFB5RXJyX1dhcm5QeTNrKCJhcnJheS53cml0ZSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCi0JCQkgICAidXNlIGFycmF5LnRvZmlsZSgpIiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gYXJyYXlfdG9maWxlKHNlbGYsIGYpOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiYXJyYXkud3JpdGUoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgorICAgICAgICAgICAgICAgICAgICAgICAidXNlIGFycmF5LnRvZmlsZSgpIiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gYXJyYXlfdG9maWxlKHNlbGYsIGYpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9mcm9tbGlzdChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmxpc3QpCiB7Ci0JUHlfc3NpemVfdCBuOwotCVB5X3NzaXplX3QgaXRlbXNpemUgPSBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgUHlfc3NpemVfdCBuOworICAgIFB5X3NzaXplX3QgaXRlbXNpemUgPSBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhsaXN0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIG11c3QgYmUgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbiA9IFB5TGlzdF9TaXplKGxpc3QpOwotCWlmIChuID4gMCkgewotCQljaGFyICppdGVtID0gc2VsZi0+b2JfaXRlbTsKLQkJUHlfc3NpemVfdCBpOwotCQlQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwgKFB5X1NJWkUoc2VsZikgKyBuKSAqIGl0ZW1zaXplKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNlbGYtPm9iX2l0ZW0gPSBpdGVtOwotCQlQeV9TSVpFKHNlbGYpICs9IG47Ci0JCXNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCVB5T2JqZWN0ICp2ID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7Ci0JCQlpZiAoKCpzZWxmLT5vYl9kZXNjci0+c2V0aXRlbSkoc2VsZiwKLQkJCQkJUHlfU0laRShzZWxmKSAtIG4gKyBpLCB2KSAhPSAwKSB7Ci0JCQkJUHlfU0laRShzZWxmKSAtPSBuOwotCQkJCWlmIChpdGVtc2l6ZSAmJiAoc2VsZi0+b2Jfc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gaXRlbXNpemUpKSB7Ci0JCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQkJCX0KLQkJCQlQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwKLQkJCQkJICAgICAgICAgIFB5X1NJWkUoc2VsZikgKiBpdGVtc2l6ZSk7Ci0JCQkJc2VsZi0+b2JfaXRlbSA9IGl0ZW07Ci0JCQkJc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sobGlzdCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZyBtdXN0IGJlIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG4gPSBQeUxpc3RfU2l6ZShsaXN0KTsKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgY2hhciAqaXRlbSA9IHNlbGYtPm9iX2l0ZW07CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIChQeV9TSVpFKHNlbGYpICsgbikgKiBpdGVtc2l6ZSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5vYl9pdGVtID0gaXRlbTsKKyAgICAgICAgUHlfU0laRShzZWxmKSArPSBuOworICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOworICAgICAgICAgICAgaWYgKCgqc2VsZi0+b2JfZGVzY3ItPnNldGl0ZW0pKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfU0laRShzZWxmKSAtIG4gKyBpLCB2KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfU0laRShzZWxmKSAtPSBuOworICAgICAgICAgICAgICAgIGlmIChpdGVtc2l6ZSAmJiAoc2VsZi0+b2Jfc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gaXRlbXNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9TSVpFKHNlbGYpICogaXRlbXNpemUpOworICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBpdGVtOworICAgICAgICAgICAgICAgIHNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZnJvbWxpc3RfZG9jLApAQCAtMTM0NCwyMCArMTM0NCwyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3RvbGlzdChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoUHlfU0laRShzZWxmKSk7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQeV9TSVpFKHNlbGYpKTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsIGkpOwotCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYobGlzdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCB2KTsKLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdiA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLCBpKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgdik7CisgICAgfQorICAgIHJldHVybiBsaXN0OwogfQogCiBQeURvY19TVFJWQVIodG9saXN0X2RvYywKQEAgLTEzNjksMzYgKzEzNjksMzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9mcm9tc3RyaW5nKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzdHI7Ci0JUHlfc3NpemVfdCBuOwotCWludCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpmcm9tc3RyaW5nIiwgJnN0ciwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobiAlIGl0ZW1zaXplICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAic3RyaW5nIGxlbmd0aCBub3QgYSBtdWx0aXBsZSBvZiBpdGVtIHNpemUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW4gPSBuIC8gaXRlbXNpemU7Ci0JaWYgKG4gPiAwKSB7Ci0JCWNoYXIgKml0ZW0gPSBzZWxmLT5vYl9pdGVtOwotCQlpZiAoKG4gPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoc2VsZikpIHx8Ci0JCQkoKFB5X1NJWkUoc2VsZikgKyBuKSA+IFBZX1NTSVpFX1RfTUFYIC8gaXRlbXNpemUpKSB7Ci0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCX0KLQkJUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIChQeV9TSVpFKHNlbGYpICsgbikgKiBpdGVtc2l6ZSk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzZWxmLT5vYl9pdGVtID0gaXRlbTsKLQkJUHlfU0laRShzZWxmKSArPSBuOwotCQlzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOwotCQltZW1jcHkoaXRlbSArIChQeV9TSVpFKHNlbGYpIC0gbikgKiBpdGVtc2l6ZSwKLQkJICAgICAgIHN0ciwgaXRlbXNpemUqbik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjaGFyICpzdHI7CisgICAgUHlfc3NpemVfdCBuOworICAgIGludCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmZyb21zdHJpbmciLCAmc3RyLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuICUgaXRlbXNpemUgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAic3RyaW5nIGxlbmd0aCBub3QgYSBtdWx0aXBsZSBvZiBpdGVtIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG4gPSBuIC8gaXRlbXNpemU7CisgICAgaWYgKG4gPiAwKSB7CisgICAgICAgIGNoYXIgKml0ZW0gPSBzZWxmLT5vYl9pdGVtOworICAgICAgICBpZiAoKG4gPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoc2VsZikpIHx8CisgICAgICAgICAgICAoKFB5X1NJWkUoc2VsZikgKyBuKSA+IFBZX1NTSVpFX1RfTUFYIC8gaXRlbXNpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIChQeV9TSVpFKHNlbGYpICsgbikgKiBpdGVtc2l6ZSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5vYl9pdGVtID0gaXRlbTsKKyAgICAgICAgUHlfU0laRShzZWxmKSArPSBuOworICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBtZW1jcHkoaXRlbSArIChQeV9TSVpFKHNlbGYpIC0gbikgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgIHN0ciwgaXRlbXNpemUqbik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGZyb21zdHJpbmdfZG9jLApAQCAtMTQxMSwxMiArMTQxMSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3Rvc3RyaW5nKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCWlmIChzZWxmLT5vYl9zaXplIDw9IFBZX1NTSVpFX1RfTUFYIC8gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSB7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5vYl9pdGVtLAotCQkJCSAgICBQeV9TSVpFKHNlbGYpICogc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9CisgICAgaWYgKHNlbGYtPm9iX3NpemUgPD0gUFlfU1NJWkVfVF9NQVggLyBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpIHsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPm9iX2l0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfU0laRShzZWxmKSAqIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIodG9zdHJpbmdfZG9jLApAQCAtMTQzMSwzNiArMTQzMSwzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2Zyb211bmljb2RlKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9VTklDT0RFICp1c3RyOwotCVB5X3NzaXplX3QgbjsKKyAgICBQeV9VTklDT0RFICp1c3RyOworICAgIFB5X3NzaXplX3QgbjsKIAotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInUjOmZyb211bmljb2RlIiwgJnVzdHIsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNlbGYtPm9iX2Rlc2NyLT50eXBlY29kZSAhPSAndScpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkiZnJvbXVuaWNvZGUoKSBtYXkgb25seSBiZSBjYWxsZWQgb24gIgotCQkJInR5cGUgJ3UnIGFycmF5cyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG4gPiAwKSB7Ci0JCVB5X1VOSUNPREUgKml0ZW0gPSAoUHlfVU5JQ09ERSAqKSBzZWxmLT5vYl9pdGVtOwotCQlpZiAoUHlfU0laRShzZWxmKSA+IFBZX1NTSVpFX1RfTUFYIC0gbikgewotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCX0KLQkJUHlNZW1fUkVTSVpFKGl0ZW0sIFB5X1VOSUNPREUsIFB5X1NJWkUoc2VsZikgKyBuKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNlbGYtPm9iX2l0ZW0gPSAoY2hhciAqKSBpdGVtOwotCQlQeV9TSVpFKHNlbGYpICs9IG47Ci0JCXNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7Ci0JCW1lbWNweShpdGVtICsgUHlfU0laRShzZWxmKSAtIG4sCi0JCSAgICAgICB1c3RyLCBuICogc2l6ZW9mKFB5X1VOSUNPREUpKTsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1Izpmcm9tdW5pY29kZSIsICZ1c3RyLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzZWxmLT5vYl9kZXNjci0+dHlwZWNvZGUgIT0gJ3UnKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgImZyb211bmljb2RlKCkgbWF5IG9ubHkgYmUgY2FsbGVkIG9uICIKKyAgICAgICAgICAgICJ0eXBlICd1JyBhcnJheXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChuID4gMCkgeworICAgICAgICBQeV9VTklDT0RFICppdGVtID0gKFB5X1VOSUNPREUgKikgc2VsZi0+b2JfaXRlbTsKKyAgICAgICAgaWYgKFB5X1NJWkUoc2VsZikgPiBQWV9TU0laRV9UX01BWCAtIG4pIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICB9CisgICAgICAgIFB5TWVtX1JFU0laRShpdGVtLCBQeV9VTklDT0RFLCBQeV9TSVpFKHNlbGYpICsgbik7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5vYl9pdGVtID0gKGNoYXIgKikgaXRlbTsKKyAgICAgICAgUHlfU0laRShzZWxmKSArPSBuOworICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBtZW1jcHkoaXRlbSArIFB5X1NJWkUoc2VsZikgLSBuLAorICAgICAgICAgICAgICAgdXN0ciwgbiAqIHNpemVvZihQeV9VTklDT0RFKSk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGZyb211bmljb2RlX2RvYywKQEAgLTE0NzUsMTIgKzE0NzUsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV90b3VuaWNvZGUoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JaWYgKHNlbGYtPm9iX2Rlc2NyLT50eXBlY29kZSAhPSAndScpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkidG91bmljb2RlKCkgbWF5IG9ubHkgYmUgY2FsbGVkIG9uIHR5cGUgJ3UnIGFycmF5cyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZSgoUHlfVU5JQ09ERSAqKSBzZWxmLT5vYl9pdGVtLCBQeV9TSVpFKHNlbGYpKTsKKyAgICBpZiAoc2VsZi0+b2JfZGVzY3ItPnR5cGVjb2RlICE9ICd1JykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJ0b3VuaWNvZGUoKSBtYXkgb25seSBiZSBjYWxsZWQgb24gdHlwZSAndScgYXJyYXlzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKChQeV9VTklDT0RFICopIHNlbGYtPm9iX2l0ZW0sIFB5X1NJWkUoc2VsZikpOwogfQogCiBQeURvY19TVFJWQVIodG91bmljb2RlX2RvYywKQEAgLTE0OTYsMzIgKzE0OTYsMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9yZWR1Y2UoYXJyYXlvYmplY3QgKmFycmF5KQogewotCVB5T2JqZWN0ICpkaWN0LCAqcmVzdWx0LCAqbGlzdDsKKyAgICBQeU9iamVjdCAqZGljdCwgKnJlc3VsdCwgKmxpc3Q7CiAKLQlkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKilhcnJheSwgIl9fZGljdF9fIik7Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWRpY3QgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoZGljdCk7Ci0JfQotCS8qIFVubGlrZSBpbiBQeXRob24gMy54LCB3ZSBuZXZlciB1c2UgdGhlIG1vcmUgZWZmaWNpZW50IG1lbW9yeQotCSAqIHJlcHJlc2VudGF0aW9uIG9mIGFuIGFycmF5IGZvciBwaWNrbGluZy4gIFRoaXMgaXMgdW5mb3J0dW5hdGVseQotCSAqIG5lY2Vzc2FyeSB0byBhbGxvdyBhcnJheSBvYmplY3RzIHRvIGJlIHVucGlja2xlZCBieSBQeXRob24gMy54LAotCSAqIHNpbmNlIHN0ciBvYmplY3RzIGZyb20gMi54IGFyZSBhbHdheXMgZGVjb2RlZCB0byB1bmljb2RlIGluCi0JICogUHl0aG9uIDMueC4KLQkgKi8KLQlsaXN0ID0gYXJyYXlfdG9saXN0KGFycmF5LCBOVUxMKTsKLQlpZiAobGlzdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoCi0JCSJPKGNPKU8iLCBQeV9UWVBFKGFycmF5KSwgYXJyYXktPm9iX2Rlc2NyLT50eXBlY29kZSwgbGlzdCwgZGljdCk7Ci0JUHlfREVDUkVGKGxpc3QpOwotCVB5X0RFQ1JFRihkaWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKWFycmF5LCAiX19kaWN0X18iKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZGljdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihkaWN0KTsKKyAgICB9CisgICAgLyogVW5saWtlIGluIFB5dGhvbiAzLngsIHdlIG5ldmVyIHVzZSB0aGUgbW9yZSBlZmZpY2llbnQgbWVtb3J5CisgICAgICogcmVwcmVzZW50YXRpb24gb2YgYW4gYXJyYXkgZm9yIHBpY2tsaW5nLiAgVGhpcyBpcyB1bmZvcnR1bmF0ZWx5CisgICAgICogbmVjZXNzYXJ5IHRvIGFsbG93IGFycmF5IG9iamVjdHMgdG8gYmUgdW5waWNrbGVkIGJ5IFB5dGhvbiAzLngsCisgICAgICogc2luY2Ugc3RyIG9iamVjdHMgZnJvbSAyLnggYXJlIGFsd2F5cyBkZWNvZGVkIHRvIHVuaWNvZGUgaW4KKyAgICAgKiBQeXRob24gMy54LgorICAgICAqLworICAgIGxpc3QgPSBhcnJheV90b2xpc3QoYXJyYXksIE5VTEwpOworICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgKKyAgICAgICAgIk8oY08pTyIsIFB5X1RZUEUoYXJyYXkpLCBhcnJheS0+b2JfZGVzY3ItPnR5cGVjb2RlLCBsaXN0LCBkaWN0KTsKKyAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgUHlfREVDUkVGKGRpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihyZWR1Y2VfZG9jLCAiUmV0dXJuIHN0YXRlIGluZm9ybWF0aW9uIGZvciBwaWNrbGluZy4iKTsKQEAgLTE1MjksMzIxICsxNTI5LDMyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2dldF90eXBlY29kZShhcnJheW9iamVjdCAqYSwgdm9pZCAqY2xvc3VyZSkKIHsKLQljaGFyIHRjID0gYS0+b2JfZGVzY3ItPnR5cGVjb2RlOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgmdGMsIDEpOworICAgIGNoYXIgdGMgPSBhLT5vYl9kZXNjci0+dHlwZWNvZGU7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCZ0YywgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9nZXRfaXRlbXNpemUoYXJyYXlvYmplY3QgKmEsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBhcnJheV9nZXRzZXRzIFtdID0gewotCXsidHlwZWNvZGUiLCAoZ2V0dGVyKSBhcnJheV9nZXRfdHlwZWNvZGUsIE5VTEwsCi0JICJ0aGUgdHlwZWNvZGUgY2hhcmFjdGVyIHVzZWQgdG8gY3JlYXRlIHRoZSBhcnJheSJ9LAotCXsiaXRlbXNpemUiLCAoZ2V0dGVyKSBhcnJheV9nZXRfaXRlbXNpemUsIE5VTEwsCi0JICJ0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIG9uZSBhcnJheSBpdGVtIn0sCi0Je05VTEx9CisgICAgeyJ0eXBlY29kZSIsIChnZXR0ZXIpIGFycmF5X2dldF90eXBlY29kZSwgTlVMTCwKKyAgICAgInRoZSB0eXBlY29kZSBjaGFyYWN0ZXIgdXNlZCB0byBjcmVhdGUgdGhlIGFycmF5In0sCisgICAgeyJpdGVtc2l6ZSIsIChnZXR0ZXIpIGFycmF5X2dldF9pdGVtc2l6ZSwgTlVMTCwKKyAgICAgInRoZSBzaXplLCBpbiBieXRlcywgb2Ygb25lIGFycmF5IGl0ZW0ifSwKKyAgICB7TlVMTH0KIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBhcnJheV9tZXRob2RzW10gPSB7Ci0JeyJhcHBlbmQiLAkoUHlDRnVuY3Rpb24pYXJyYXlfYXBwZW5kLAlNRVRIX08sCi0JIGFwcGVuZF9kb2N9LAotCXsiYnVmZmVyX2luZm8iLCAoUHlDRnVuY3Rpb24pYXJyYXlfYnVmZmVyX2luZm8sIE1FVEhfTk9BUkdTLAotCSBidWZmZXJfaW5mb19kb2N9LAotCXsiYnl0ZXN3YXAiLAkoUHlDRnVuY3Rpb24pYXJyYXlfYnl0ZXN3YXAsCU1FVEhfTk9BUkdTLAotCSBieXRlc3dhcF9kb2N9LAotCXsiX19jb3B5X18iLAkoUHlDRnVuY3Rpb24pYXJyYXlfY29weSwJTUVUSF9OT0FSR1MsCi0JIGNvcHlfZG9jfSwKLQl7ImNvdW50IiwJKFB5Q0Z1bmN0aW9uKWFycmF5X2NvdW50LAlNRVRIX08sCi0JIGNvdW50X2RvY30sCi0JeyJfX2RlZXBjb3B5X18iLChQeUNGdW5jdGlvbilhcnJheV9jb3B5LAlNRVRIX08sCi0JIGNvcHlfZG9jfSwKLQl7ImV4dGVuZCIsICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2V4dGVuZCwJTUVUSF9PLAotCSBleHRlbmRfZG9jfSwKLQl7ImZyb21maWxlIiwJKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb21maWxlLAlNRVRIX1ZBUkFSR1MsCi0JIGZyb21maWxlX2RvY30sCi0JeyJmcm9tbGlzdCIsCShQeUNGdW5jdGlvbilhcnJheV9mcm9tbGlzdCwJTUVUSF9PLAotCSBmcm9tbGlzdF9kb2N9LAotCXsiZnJvbXN0cmluZyIsCShQeUNGdW5jdGlvbilhcnJheV9mcm9tc3RyaW5nLAlNRVRIX1ZBUkFSR1MsCi0JIGZyb21zdHJpbmdfZG9jfSwKKyAgICB7ImFwcGVuZCIsICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9hcHBlbmQsICAgICAgTUVUSF9PLAorICAgICBhcHBlbmRfZG9jfSwKKyAgICB7ImJ1ZmZlcl9pbmZvIiwgKFB5Q0Z1bmN0aW9uKWFycmF5X2J1ZmZlcl9pbmZvLCBNRVRIX05PQVJHUywKKyAgICAgYnVmZmVyX2luZm9fZG9jfSwKKyAgICB7ImJ5dGVzd2FwIiwgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9ieXRlc3dhcCwgICAgTUVUSF9OT0FSR1MsCisgICAgIGJ5dGVzd2FwX2RvY30sCisgICAgeyJfX2NvcHlfXyIsICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfY29weSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBjb3B5X2RvY30sCisgICAgeyJjb3VudCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfY291bnQsICAgICAgIE1FVEhfTywKKyAgICAgY291bnRfZG9jfSwKKyAgICB7Il9fZGVlcGNvcHlfXyIsKFB5Q0Z1bmN0aW9uKWFycmF5X2NvcHksICAgICAgICAgICAgTUVUSF9PLAorICAgICBjb3B5X2RvY30sCisgICAgeyJleHRlbmQiLCAgICAgIChQeUNGdW5jdGlvbilhcnJheV9leHRlbmQsICAgICAgICAgIE1FVEhfTywKKyAgICAgZXh0ZW5kX2RvY30sCisgICAgeyJmcm9tZmlsZSIsICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfZnJvbWZpbGUsICAgIE1FVEhfVkFSQVJHUywKKyAgICAgZnJvbWZpbGVfZG9jfSwKKyAgICB7ImZyb21saXN0IiwgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9mcm9tbGlzdCwgICAgTUVUSF9PLAorICAgICBmcm9tbGlzdF9kb2N9LAorICAgIHsiZnJvbXN0cmluZyIsICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb21zdHJpbmcsICBNRVRIX1ZBUkFSR1MsCisgICAgIGZyb21zdHJpbmdfZG9jfSwKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JeyJmcm9tdW5pY29kZSIsCShQeUNGdW5jdGlvbilhcnJheV9mcm9tdW5pY29kZSwJTUVUSF9WQVJBUkdTLAotCSBmcm9tdW5pY29kZV9kb2N9LAorICAgIHsiZnJvbXVuaWNvZGUiLCAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb211bmljb2RlLCBNRVRIX1ZBUkFSR1MsCisgICAgIGZyb211bmljb2RlX2RvY30sCiAjZW5kaWYKLQl7ImluZGV4IiwJKFB5Q0Z1bmN0aW9uKWFycmF5X2luZGV4LAlNRVRIX08sCi0JIGluZGV4X2RvY30sCi0JeyJpbnNlcnQiLAkoUHlDRnVuY3Rpb24pYXJyYXlfaW5zZXJ0LAlNRVRIX1ZBUkFSR1MsCi0JIGluc2VydF9kb2N9LAotCXsicG9wIiwJCShQeUNGdW5jdGlvbilhcnJheV9wb3AsCQlNRVRIX1ZBUkFSR1MsCi0JIHBvcF9kb2N9LAotCXsicmVhZCIsCShQeUNGdW5jdGlvbilhcnJheV9mcm9tZmlsZV9hc19yZWFkLAlNRVRIX1ZBUkFSR1MsCi0JIGZyb21maWxlX2RvY30sCi0JeyJfX3JlZHVjZV9fIiwJKFB5Q0Z1bmN0aW9uKWFycmF5X3JlZHVjZSwJTUVUSF9OT0FSR1MsCi0JIHJlZHVjZV9kb2N9LAotCXsicmVtb3ZlIiwJKFB5Q0Z1bmN0aW9uKWFycmF5X3JlbW92ZSwJTUVUSF9PLAotCSByZW1vdmVfZG9jfSwKLQl7InJldmVyc2UiLAkoUHlDRnVuY3Rpb24pYXJyYXlfcmV2ZXJzZSwJTUVUSF9OT0FSR1MsCi0JIHJldmVyc2VfZG9jfSwKLS8qCXsic29ydCIsCShQeUNGdW5jdGlvbilhcnJheV9zb3J0LAlNRVRIX1ZBUkFSR1MsCi0Jc29ydF9kb2N9LCovCi0JeyJ0b2ZpbGUiLAkoUHlDRnVuY3Rpb24pYXJyYXlfdG9maWxlLAlNRVRIX08sCi0JIHRvZmlsZV9kb2N9LAotCXsidG9saXN0IiwJKFB5Q0Z1bmN0aW9uKWFycmF5X3RvbGlzdCwJTUVUSF9OT0FSR1MsCi0JIHRvbGlzdF9kb2N9LAotCXsidG9zdHJpbmciLAkoUHlDRnVuY3Rpb24pYXJyYXlfdG9zdHJpbmcsCU1FVEhfTk9BUkdTLAotCSB0b3N0cmluZ19kb2N9LAorICAgIHsiaW5kZXgiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2luZGV4LCAgICAgICBNRVRIX08sCisgICAgIGluZGV4X2RvY30sCisgICAgeyJpbnNlcnQiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfaW5zZXJ0LCAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgaW5zZXJ0X2RvY30sCisgICAgeyJwb3AiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfcG9wLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgcG9wX2RvY30sCisgICAgeyJyZWFkIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfZnJvbWZpbGVfYXNfcmVhZCwgICAgTUVUSF9WQVJBUkdTLAorICAgICBmcm9tZmlsZV9kb2N9LAorICAgIHsiX19yZWR1Y2VfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X3JlZHVjZSwgICAgICBNRVRIX05PQVJHUywKKyAgICAgcmVkdWNlX2RvY30sCisgICAgeyJyZW1vdmUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfcmVtb3ZlLCAgICAgIE1FVEhfTywKKyAgICAgcmVtb3ZlX2RvY30sCisgICAgeyJyZXZlcnNlIiwgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfcmV2ZXJzZSwgICAgIE1FVEhfTk9BUkdTLAorICAgICByZXZlcnNlX2RvY30sCisvKiAgICAgIHsic29ydCIsICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfc29ydCwgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICBzb3J0X2RvY30sKi8KKyAgICB7InRvZmlsZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV90b2ZpbGUsICAgICAgTUVUSF9PLAorICAgICB0b2ZpbGVfZG9jfSwKKyAgICB7InRvbGlzdCIsICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV90b2xpc3QsICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHRvbGlzdF9kb2N9LAorICAgIHsidG9zdHJpbmciLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X3Rvc3RyaW5nLCAgICBNRVRIX05PQVJHUywKKyAgICAgdG9zdHJpbmdfZG9jfSwKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JeyJ0b3VuaWNvZGUiLCAgIChQeUNGdW5jdGlvbilhcnJheV90b3VuaWNvZGUsCU1FVEhfTk9BUkdTLAotCSB0b3VuaWNvZGVfZG9jfSwKKyAgICB7InRvdW5pY29kZSIsICAgKFB5Q0Z1bmN0aW9uKWFycmF5X3RvdW5pY29kZSwgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHRvdW5pY29kZV9kb2N9LAogI2VuZGlmCi0JeyJ3cml0ZSIsCShQeUNGdW5jdGlvbilhcnJheV90b2ZpbGVfYXNfd3JpdGUsCU1FVEhfTywKLQkgdG9maWxlX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7IndyaXRlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV90b2ZpbGVfYXNfd3JpdGUsICAgICBNRVRIX08sCisgICAgIHRvZmlsZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfcmVwcihhcnJheW9iamVjdCAqYSkKIHsKLQljaGFyIGJ1ZlsyNTZdLCB0eXBlY29kZTsKLQlQeU9iamVjdCAqcywgKnQsICp2ID0gTlVMTDsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBjaGFyIGJ1ZlsyNTZdLCB0eXBlY29kZTsKKyAgICBQeU9iamVjdCAqcywgKnQsICp2ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWxlbiA9IFB5X1NJWkUoYSk7Ci0JdHlwZWNvZGUgPSBhLT5vYl9kZXNjci0+dHlwZWNvZGU7Ci0JaWYgKGxlbiA9PSAwKSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImFycmF5KCclYycpIiwgdHlwZWNvZGUpOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotCX0KLQkJCi0JaWYgKHR5cGVjb2RlID09ICdjJykKLQkJdiA9IGFycmF5X3Rvc3RyaW5nKGEsIE5VTEwpOworICAgIGxlbiA9IFB5X1NJWkUoYSk7CisgICAgdHlwZWNvZGUgPSBhLT5vYl9kZXNjci0+dHlwZWNvZGU7CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImFycmF5KCclYycpIiwgdHlwZWNvZGUpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIH0KKworICAgIGlmICh0eXBlY29kZSA9PSAnYycpCisgICAgICAgIHYgPSBhcnJheV90b3N0cmluZyhhLCBOVUxMKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAodHlwZWNvZGUgPT0gJ3UnKQotCQl2ID0gYXJyYXlfdG91bmljb2RlKGEsIE5VTEwpOworICAgIGVsc2UgaWYgKHR5cGVjb2RlID09ICd1JykKKyAgICAgICAgdiA9IGFycmF5X3RvdW5pY29kZShhLCBOVUxMKTsKICNlbmRpZgotCWVsc2UKLQkJdiA9IGFycmF5X3RvbGlzdChhLCBOVUxMKTsKLQl0ID0gUHlPYmplY3RfUmVwcih2KTsKLQlQeV9YREVDUkVGKHYpOworICAgIGVsc2UKKyAgICAgICAgdiA9IGFycmF5X3RvbGlzdChhLCBOVUxMKTsKKyAgICB0ID0gUHlPYmplY3RfUmVwcih2KTsKKyAgICBQeV9YREVDUkVGKHYpOwogCi0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiYXJyYXkoJyVjJywgIiwgdHlwZWNvZGUpOwotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCB0KTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIikiKSk7Ci0JcmV0dXJuIHM7CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiYXJyYXkoJyVjJywgIiwgdHlwZWNvZGUpOworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCB0KTsKKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIikiKSk7CisgICAgcmV0dXJuIHM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGFycmF5X3N1YnNjcihhcnJheW9iamVjdCogc2VsZiwgUHlPYmplY3QqIGl0ZW0pCiB7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaT09LTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGkgPCAwKQotCQkJaSArPSBQeV9TSVpFKHNlbGYpOwotCQlyZXR1cm4gYXJyYXlfaXRlbShzZWxmLCBpKTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOwotCQlQeU9iamVjdCogcmVzdWx0OwotCQlhcnJheW9iamVjdCogYXI7Ci0JCWludCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgIGlmIChpPT0tMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IFB5X1NJWkUoc2VsZik7CisgICAgICAgIHJldHVybiBhcnJheV9pdGVtKHNlbGYsIGkpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoLCBjdXIsIGk7CisgICAgICAgIFB5T2JqZWN0KiByZXN1bHQ7CisgICAgICAgIGFycmF5b2JqZWN0KiBhcjsKKyAgICAgICAgaW50IGl0ZW1zaXplID0gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOwogCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwgUHlfU0laRShzZWxmKSwKLQkJCQkgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIFB5X1NJWkUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCWlmIChzbGljZWxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbmV3YXJyYXlvYmplY3QoJkFycmF5dHlwZSwgMCwgc2VsZi0+b2JfZGVzY3IpOwotCQl9Ci0JCWVsc2UgaWYgKHN0ZXAgPT0gMSkgewotCQkJUHlPYmplY3QgKnJlc3VsdCA9IG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsCi0JCQkJCQlzbGljZWxlbmd0aCwgc2VsZi0+b2JfZGVzY3IpOwotCQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJbWVtY3B5KCgoYXJyYXlvYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtLAotCQkJICAgICAgIHNlbGYtPm9iX2l0ZW0gKyBzdGFydCAqIGl0ZW1zaXplLAotCQkJICAgICAgIHNsaWNlbGVuZ3RoICogaXRlbXNpemUpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIHNsaWNlbGVuZ3RoLCBzZWxmLT5vYl9kZXNjcik7Ci0JCQlpZiAoIXJlc3VsdCkgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzbGljZWxlbmd0aCA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3YXJyYXlvYmplY3QoJkFycmF5dHlwZSwgMCwgc2VsZi0+b2JfZGVzY3IpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbmd0aCwgc2VsZi0+b2JfZGVzY3IpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgbWVtY3B5KCgoYXJyYXlvYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtLAorICAgICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gKyBzdGFydCAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgIHNsaWNlbGVuZ3RoICogaXRlbXNpemUpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIHNsaWNlbGVuZ3RoLCBzZWxmLT5vYl9kZXNjcik7CisgICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIE5VTEw7CiAKLQkJCWFyID0gKGFycmF5b2JqZWN0KilyZXN1bHQ7CisgICAgICAgICAgICBhciA9IChhcnJheW9iamVjdCopcmVzdWx0OwogCi0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOyAKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCW1lbWNweShhci0+b2JfaXRlbSArIGkqaXRlbXNpemUsCi0JCQkJICAgICAgIHNlbGYtPm9iX2l0ZW0gKyBjdXIqaXRlbXNpemUsCi0JCQkJICAgICAgIGl0ZW1zaXplKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQkJCi0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkiYXJyYXkgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYXItPm9iX2l0ZW0gKyBpKml0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9pdGVtICsgY3VyKml0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpdGVtc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIGludAogYXJyYXlfYXNzX3N1YnNjcihhcnJheW9iamVjdCogc2VsZiwgUHlPYmplY3QqIGl0ZW0sIFB5T2JqZWN0KiB2YWx1ZSkKIHsKLQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgbmVlZGVkOwotCWFycmF5b2JqZWN0KiBvdGhlcjsKLQlpbnQgaXRlbXNpemU7CisgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIG5lZWRlZDsKKyAgICBhcnJheW9iamVjdCogb3RoZXI7CisgICAgaW50IGl0ZW1zaXplOwogCi0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQkKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBQeV9TSVpFKHNlbGYpOwotCQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKHNlbGYpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkiYXJyYXkgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQkJLyogRmFsbCB0aHJvdWdoIHRvIHNsaWNlIGFzc2lnbm1lbnQgKi8KLQkJCXN0YXJ0ID0gaTsKLQkJCXN0b3AgPSBpICsgMTsKLQkJCXN0ZXAgPSAxOwotCQkJc2xpY2VsZW5ndGggPSAxOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAoKnNlbGYtPm9iX2Rlc2NyLT5zZXRpdGVtKShzZWxmLCBpLCB2YWx1ZSk7Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwKLQkJCQkJIFB5X1NJWkUoc2VsZiksICZzdGFydCwgJnN0b3AsCi0JCQkJCSAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXJyYXkgaW5kaWNlcyBtdXN0IGJlIGludGVnZXIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlvdGhlciA9IE5VTEw7Ci0JCW5lZWRlZCA9IDA7Ci0JfQotCWVsc2UgaWYgKGFycmF5X0NoZWNrKHZhbHVlKSkgewotCQlvdGhlciA9IChhcnJheW9iamVjdCAqKXZhbHVlOwotCQluZWVkZWQgPSBQeV9TSVpFKG90aGVyKTsKLQkJaWYgKHNlbGYgPT0gb3RoZXIpIHsKLQkJCS8qIFNwZWNpYWwgY2FzZSAic2VsZltpOmpdID0gc2VsZiIgLS0gY29weSBzZWxmIGZpcnN0ICovCi0JCQlpbnQgcmV0OwotCQkJdmFsdWUgPSBhcnJheV9zbGljZShvdGhlciwgMCwgbmVlZGVkKTsKLQkJCWlmICh2YWx1ZSA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCXJldCA9IGFycmF5X2Fzc19zdWJzY3Ioc2VsZiwgaXRlbSwgdmFsdWUpOwotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJaWYgKG90aGVyLT5vYl9kZXNjciAhPSBzZWxmLT5vYl9kZXNjcikgewotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkgICAgICJjYW4gb25seSBhc3NpZ24gYXJyYXkgKG5vdCBcIiUuMjAwc1wiKSB0byBhcnJheSBzbGljZSIsCi0JCQkgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLQkvKiBmb3IgJ2FbMjoxXSA9IC4uLicsIHRoZSBpbnNlcnRpb24gcG9pbnQgaXMgJ3N0YXJ0Jywgbm90ICdzdG9wJyAqLwotCWlmICgoc3RlcCA+IDAgJiYgc3RvcCA8IHN0YXJ0KSB8fAotCSAgICAoc3RlcCA8IDAgJiYgc3RvcCA+IHN0YXJ0KSkKLQkJc3RvcCA9IHN0YXJ0OwotCWlmIChzdGVwID09IDEpIHsKLQkJaWYgKHNsaWNlbGVuZ3RoID4gbmVlZGVkKSB7Ci0JCQltZW1tb3ZlKHNlbGYtPm9iX2l0ZW0gKyAoc3RhcnQgKyBuZWVkZWQpICogaXRlbXNpemUsCi0JCQkJc2VsZi0+b2JfaXRlbSArIHN0b3AgKiBpdGVtc2l6ZSwKLQkJCQkoUHlfU0laRShzZWxmKSAtIHN0b3ApICogaXRlbXNpemUpOwotCQkJaWYgKGFycmF5X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpICsKLQkJCQkJIG5lZWRlZCAtIHNsaWNlbGVuZ3RoKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgaWYgKHNsaWNlbGVuZ3RoIDwgbmVlZGVkKSB7Ci0JCQlpZiAoYXJyYXlfcmVzaXplKHNlbGYsIFB5X1NJWkUoc2VsZikgKwotCQkJCQkgbmVlZGVkIC0gc2xpY2VsZW5ndGgpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQltZW1tb3ZlKHNlbGYtPm9iX2l0ZW0gKyAoc3RhcnQgKyBuZWVkZWQpICogaXRlbXNpemUsCi0JCQkJc2VsZi0+b2JfaXRlbSArIHN0b3AgKiBpdGVtc2l6ZSwKLQkJCQkoUHlfU0laRShzZWxmKSAtIHN0YXJ0IC0gbmVlZGVkKSAqIGl0ZW1zaXplKTsKLQkJfQotCQlpZiAobmVlZGVkID4gMCkKLQkJCW1lbWNweShzZWxmLT5vYl9pdGVtICsgc3RhcnQgKiBpdGVtc2l6ZSwKLQkJCSAgICAgICBvdGhlci0+b2JfaXRlbSwgbmVlZGVkICogaXRlbXNpemUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAobmVlZGVkID09IDApIHsKLQkJLyogRGVsZXRlIHNsaWNlICovCi0JCXNpemVfdCBjdXI7Ci0JCVB5X3NzaXplX3QgaTsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CiAKLQkJaWYgKHN0ZXAgPCAwKSB7Ci0JCQlzdG9wID0gc3RhcnQgKyAxOwotCQkJc3RhcnQgPSBzdG9wICsgc3RlcCAqIChzbGljZWxlbmd0aCAtIDEpIC0gMTsKLQkJCXN0ZXAgPSAtc3RlcDsKLQkJfQotCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOwotCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCVB5X3NzaXplX3QgbGltID0gc3RlcCAtIDE7CisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShzZWxmKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgImFycmF5IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBzbGljZSBhc3NpZ25tZW50ICovCisgICAgICAgICAgICBzdGFydCA9IGk7CisgICAgICAgICAgICBzdG9wID0gaSArIDE7CisgICAgICAgICAgICBzdGVwID0gMTsKKyAgICAgICAgICAgIHNsaWNlbGVuZ3RoID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKCpzZWxmLT5vYl9kZXNjci0+c2V0aXRlbSkoc2VsZiwgaSwgdmFsdWUpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9TSVpFKHNlbGYpLCAmc3RhcnQsICZzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgaW5kaWNlcyBtdXN0IGJlIGludGVnZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBvdGhlciA9IE5VTEw7CisgICAgICAgIG5lZWRlZCA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKGFycmF5X0NoZWNrKHZhbHVlKSkgeworICAgICAgICBvdGhlciA9IChhcnJheW9iamVjdCAqKXZhbHVlOworICAgICAgICBuZWVkZWQgPSBQeV9TSVpFKG90aGVyKTsKKyAgICAgICAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSAic2VsZltpOmpdID0gc2VsZiIgLS0gY29weSBzZWxmIGZpcnN0ICovCisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgdmFsdWUgPSBhcnJheV9zbGljZShvdGhlciwgMCwgbmVlZGVkKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldCA9IGFycmF5X2Fzc19zdWJzY3Ioc2VsZiwgaXRlbSwgdmFsdWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG90aGVyLT5vYl9kZXNjciAhPSBzZWxmLT5vYl9kZXNjcikgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICJjYW4gb25seSBhc3NpZ24gYXJyYXkgKG5vdCBcIiUuMjAwc1wiKSB0byBhcnJheSBzbGljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGl0ZW1zaXplID0gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOworICAgIC8qIGZvciAnYVsyOjFdID0gLi4uJywgdGhlIGluc2VydGlvbiBwb2ludCBpcyAnc3RhcnQnLCBub3QgJ3N0b3AnICovCisgICAgaWYgKChzdGVwID4gMCAmJiBzdG9wIDwgc3RhcnQpIHx8CisgICAgICAgIChzdGVwIDwgMCAmJiBzdG9wID4gc3RhcnQpKQorICAgICAgICBzdG9wID0gc3RhcnQ7CisgICAgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICBpZiAoc2xpY2VsZW5ndGggPiBuZWVkZWQpIHsKKyAgICAgICAgICAgIG1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIChzdGFydCArIG5lZWRlZCkgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICBzZWxmLT5vYl9pdGVtICsgc3RvcCAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgIChQeV9TSVpFKHNlbGYpIC0gc3RvcCkgKiBpdGVtc2l6ZSk7CisgICAgICAgICAgICBpZiAoYXJyYXlfcmVzaXplKHNlbGYsIFB5X1NJWkUoc2VsZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgLSBzbGljZWxlbmd0aCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzbGljZWxlbmd0aCA8IG5lZWRlZCkgeworICAgICAgICAgICAgaWYgKGFycmF5X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIC0gc2xpY2VsZW5ndGgpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBtZW1tb3ZlKHNlbGYtPm9iX2l0ZW0gKyAoc3RhcnQgKyBuZWVkZWQpICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSArIHN0b3AgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAoUHlfU0laRShzZWxmKSAtIHN0YXJ0IC0gbmVlZGVkKSAqIGl0ZW1zaXplKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZGVkID4gMCkKKyAgICAgICAgICAgIG1lbWNweShzZWxmLT5vYl9pdGVtICsgc3RhcnQgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBvdGhlci0+b2JfaXRlbSwgbmVlZGVkICogaXRlbXNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAobmVlZGVkID09IDApIHsKKyAgICAgICAgLyogRGVsZXRlIHNsaWNlICovCisgICAgICAgIHNpemVfdCBjdXI7CisgICAgICAgIFB5X3NzaXplX3QgaTsKIAotCQkJaWYgKGN1ciArIHN0ZXAgPj0gKHNpemVfdClQeV9TSVpFKHNlbGYpKQotCQkJCWxpbSA9IFB5X1NJWkUoc2VsZikgLSBjdXIgLSAxOwotCQkJbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgKGN1ciAtIGkpICogaXRlbXNpemUsCi0JCQkJc2VsZi0+b2JfaXRlbSArIChjdXIgKyAxKSAqIGl0ZW1zaXplLAotCQkJCWxpbSAqIGl0ZW1zaXplKTsKLQkJfQotCQljdXIgPSBzdGFydCArIHNsaWNlbGVuZ3RoICogc3RlcDsKLQkJaWYgKGN1ciA8IChzaXplX3QpUHlfU0laRShzZWxmKSkgewotCQkJbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgKGN1ci1zbGljZWxlbmd0aCkgKiBpdGVtc2l6ZSwKLQkJCQlzZWxmLT5vYl9pdGVtICsgY3VyICogaXRlbXNpemUsCi0JCQkJKFB5X1NJWkUoc2VsZikgLSBjdXIpICogaXRlbXNpemUpOwotCQl9Ci0JCWlmIChhcnJheV9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSAtIHNsaWNlbGVuZ3RoKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJUHlfc3NpemVfdCBjdXIsIGk7CisgICAgICAgIGlmIChzdGVwIDwgMCkgeworICAgICAgICAgICAgc3RvcCA9IHN0YXJ0ICsgMTsKKyAgICAgICAgICAgIHN0YXJ0ID0gc3RvcCArIHN0ZXAgKiAoc2xpY2VsZW5ndGggLSAxKSAtIDE7CisgICAgICAgICAgICBzdGVwID0gLXN0ZXA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKKyAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGxpbSA9IHN0ZXAgLSAxOwogCi0JCWlmIChuZWVkZWQgIT0gc2xpY2VsZW5ndGgpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJhdHRlbXB0IHRvIGFzc2lnbiBhcnJheSBvZiBzaXplICV6ZCAiCi0JCQkJInRvIGV4dGVuZGVkIHNsaWNlIG9mIHNpemUgJXpkIiwKLQkJCQluZWVkZWQsIHNsaWNlbGVuZ3RoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOwotCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCW1lbWNweShzZWxmLT5vYl9pdGVtICsgY3VyICogaXRlbXNpemUsCi0JCQkgICAgICAgb3RoZXItPm9iX2l0ZW0gKyBpICogaXRlbXNpemUsCi0JCQkgICAgICAgaXRlbXNpemUpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgICAgIGlmIChjdXIgKyBzdGVwID49IChzaXplX3QpUHlfU0laRShzZWxmKSkKKyAgICAgICAgICAgICAgICBsaW0gPSBQeV9TSVpFKHNlbGYpIC0gY3VyIC0gMTsKKyAgICAgICAgICAgIG1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIChjdXIgLSBpKSAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gKyAoY3VyICsgMSkgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICBsaW0gKiBpdGVtc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY3VyID0gc3RhcnQgKyBzbGljZWxlbmd0aCAqIHN0ZXA7CisgICAgICAgIGlmIChjdXIgPCAoc2l6ZV90KVB5X1NJWkUoc2VsZikpIHsKKyAgICAgICAgICAgIG1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIChjdXItc2xpY2VsZW5ndGgpICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSArIGN1ciAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgIChQeV9TSVpFKHNlbGYpIC0gY3VyKSAqIGl0ZW1zaXplKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJyYXlfcmVzaXplKHNlbGYsIFB5X1NJWkUoc2VsZikgLSBzbGljZWxlbmd0aCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgY3VyLCBpOworCisgICAgICAgIGlmIChuZWVkZWQgIT0gc2xpY2VsZW5ndGgpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJhdHRlbXB0IHRvIGFzc2lnbiBhcnJheSBvZiBzaXplICV6ZCAiCisgICAgICAgICAgICAgICAgInRvIGV4dGVuZGVkIHNsaWNlIG9mIHNpemUgJXpkIiwKKyAgICAgICAgICAgICAgICBuZWVkZWQsIHNsaWNlbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOworICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgIG1lbWNweShzZWxmLT5vYl9pdGVtICsgY3VyICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgICAgb3RoZXItPm9iX2l0ZW0gKyBpICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgICAgaXRlbXNpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgYXJyYXlfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYylhcnJheV9sZW5ndGgsCi0JKGJpbmFyeWZ1bmMpYXJyYXlfc3Vic2NyLAotCShvYmpvYmphcmdwcm9jKWFycmF5X2Fzc19zdWJzY3IKKyAgICAobGVuZnVuYylhcnJheV9sZW5ndGgsCisgICAgKGJpbmFyeWZ1bmMpYXJyYXlfc3Vic2NyLAorICAgIChvYmpvYmphcmdwcm9jKWFycmF5X2Fzc19zdWJzY3IKIH07CiAKIHN0YXRpYyBjb25zdCB2b2lkICplbXB0eWJ1ZiA9ICIiOwpAQCAtMTg1MSwxNjQgKzE4NTEsMTY0IEBACiBzdGF0aWMgUHlfc3NpemVfdAogYXJyYXlfYnVmZmVyX2dldHJlYWRidWYoYXJyYXlvYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IHZvaWQgKipwdHIpCiB7Ci0JaWYgKCBpbmRleCAhPSAwICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIkFjY2Vzc2luZyBub24tZXhpc3RlbnQgYXJyYXkgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwdHIgPSAodm9pZCAqKXNlbGYtPm9iX2l0ZW07Ci0JaWYgKCpwdHIgPT0gTlVMTCkKLQkJKnB0ciA9IGVtcHR5YnVmOwotCXJldHVybiBQeV9TSVpFKHNlbGYpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICBpZiAoIGluZGV4ICE9IDAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGFycmF5IHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcHRyID0gKHZvaWQgKilzZWxmLT5vYl9pdGVtOworICAgIGlmICgqcHRyID09IE5VTEwpCisgICAgICAgICpwdHIgPSBlbXB0eWJ1ZjsKKyAgICByZXR1cm4gUHlfU0laRShzZWxmKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBhcnJheV9idWZmZXJfZ2V0d3JpdGVidWYoYXJyYXlvYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IHZvaWQgKipwdHIpCiB7Ci0JaWYgKCBpbmRleCAhPSAwICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIkFjY2Vzc2luZyBub24tZXhpc3RlbnQgYXJyYXkgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwdHIgPSAodm9pZCAqKXNlbGYtPm9iX2l0ZW07Ci0JaWYgKCpwdHIgPT0gTlVMTCkKLQkJKnB0ciA9IGVtcHR5YnVmOwotCXJldHVybiBQeV9TSVpFKHNlbGYpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICBpZiAoIGluZGV4ICE9IDAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGFycmF5IHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcHRyID0gKHZvaWQgKilzZWxmLT5vYl9pdGVtOworICAgIGlmICgqcHRyID09IE5VTEwpCisgICAgICAgICpwdHIgPSBlbXB0eWJ1ZjsKKyAgICByZXR1cm4gUHlfU0laRShzZWxmKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBhcnJheV9idWZmZXJfZ2V0c2VnY291bnQoYXJyYXlvYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgKmxlbnApCiB7Ci0JaWYgKCBsZW5wICkKLQkJKmxlbnAgPSBQeV9TSVpFKHNlbGYpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIGxlbnAgKQorICAgICAgICAqbGVucCA9IFB5X1NJWkUoc2VsZikqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgYXJyYXlfYXNfc2VxdWVuY2UgPSB7Ci0JKGxlbmZ1bmMpYXJyYXlfbGVuZ3RoLAkJICAgICAgICAvKnNxX2xlbmd0aCovCi0JKGJpbmFyeWZ1bmMpYXJyYXlfY29uY2F0LCAgICAgICAgICAgICAgIC8qc3FfY29uY2F0Ki8KLQkoc3NpemVhcmdmdW5jKWFycmF5X3JlcGVhdCwJCS8qc3FfcmVwZWF0Ki8KLQkoc3NpemVhcmdmdW5jKWFycmF5X2l0ZW0sCQkgICAgICAgIC8qc3FfaXRlbSovCi0JKHNzaXplc3NpemVhcmdmdW5jKWFycmF5X3NsaWNlLAkJLypzcV9zbGljZSovCi0JKHNzaXplb2JqYXJncHJvYylhcnJheV9hc3NfaXRlbSwJCS8qc3FfYXNzX2l0ZW0qLwotCShzc2l6ZXNzaXplb2JqYXJncHJvYylhcnJheV9hc3Nfc2xpY2UsCS8qc3FfYXNzX3NsaWNlKi8KLQkob2Jqb2JqcHJvYylhcnJheV9jb250YWlucywJCS8qc3FfY29udGFpbnMqLwotCShiaW5hcnlmdW5jKWFycmF5X2lucGxhY2VfY29uY2F0LAkvKnNxX2lucGxhY2VfY29uY2F0Ki8KLQkoc3NpemVhcmdmdW5jKWFycmF5X2lucGxhY2VfcmVwZWF0CS8qc3FfaW5wbGFjZV9yZXBlYXQqLworICAgIChsZW5mdW5jKWFycmF5X2xlbmd0aCwgICAgICAgICAgICAgICAgICAgICAgLypzcV9sZW5ndGgqLworICAgIChiaW5hcnlmdW5jKWFycmF5X2NvbmNhdCwgICAgICAgICAgICAgICAvKnNxX2NvbmNhdCovCisgICAgKHNzaXplYXJnZnVuYylhcnJheV9yZXBlYXQsICAgICAgICAgICAgICAgICAvKnNxX3JlcGVhdCovCisgICAgKHNzaXplYXJnZnVuYylhcnJheV9pdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qc3FfaXRlbSovCisgICAgKHNzaXplc3NpemVhcmdmdW5jKWFycmF5X3NsaWNlLCAgICAgICAgICAgICAvKnNxX3NsaWNlKi8KKyAgICAoc3NpemVvYmphcmdwcm9jKWFycmF5X2Fzc19pdGVtLCAgICAgICAgICAgICAgICAgICAgLypzcV9hc3NfaXRlbSovCisgICAgKHNzaXplc3NpemVvYmphcmdwcm9jKWFycmF5X2Fzc19zbGljZSwgICAgICAvKnNxX2Fzc19zbGljZSovCisgICAgKG9iam9ianByb2MpYXJyYXlfY29udGFpbnMsICAgICAgICAgICAgICAgICAvKnNxX2NvbnRhaW5zKi8KKyAgICAoYmluYXJ5ZnVuYylhcnJheV9pbnBsYWNlX2NvbmNhdCwgICAgICAgICAgIC8qc3FfaW5wbGFjZV9jb25jYXQqLworICAgIChzc2l6ZWFyZ2Z1bmMpYXJyYXlfaW5wbGFjZV9yZXBlYXQgICAgICAgICAgLypzcV9pbnBsYWNlX3JlcGVhdCovCiB9OwogCiBzdGF0aWMgUHlCdWZmZXJQcm9jcyBhcnJheV9hc19idWZmZXIgPSB7Ci0JKHJlYWRidWZmZXJwcm9jKWFycmF5X2J1ZmZlcl9nZXRyZWFkYnVmLAotCSh3cml0ZWJ1ZmZlcnByb2MpYXJyYXlfYnVmZmVyX2dldHdyaXRlYnVmLAotCShzZWdjb3VudHByb2MpYXJyYXlfYnVmZmVyX2dldHNlZ2NvdW50LAotCU5VTEwsCisgICAgKHJlYWRidWZmZXJwcm9jKWFycmF5X2J1ZmZlcl9nZXRyZWFkYnVmLAorICAgICh3cml0ZWJ1ZmZlcnByb2MpYXJyYXlfYnVmZmVyX2dldHdyaXRlYnVmLAorICAgIChzZWdjb3VudHByb2MpYXJyYXlfYnVmZmVyX2dldHNlZ2NvdW50LAorICAgIE5VTEwsCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWNoYXIgYzsKLQlQeU9iamVjdCAqaW5pdGlhbCA9IE5VTEwsICppdCA9IE5VTEw7Ci0Jc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOwotCQotCWlmICh0eXBlID09ICZBcnJheXR5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJhcnJheS5hcnJheSgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGNoYXIgYzsKKyAgICBQeU9iamVjdCAqaW5pdGlhbCA9IE5VTEwsICppdCA9IE5VTEw7CisgICAgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJjfE86YXJyYXkiLCAmYywgJmluaXRpYWwpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmQXJyYXl0eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiYXJyYXkuYXJyYXkoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghKGluaXRpYWwgPT0gTlVMTCB8fCBQeUxpc3RfQ2hlY2soaW5pdGlhbCkKLQkgICAgICB8fCBQeVN0cmluZ19DaGVjayhpbml0aWFsKSB8fCBQeVR1cGxlX0NoZWNrKGluaXRpYWwpCi0JICAgICAgfHwgKGMgPT0gJ3UnICYmIFB5VW5pY29kZV9DaGVjayhpbml0aWFsKSkpKSB7Ci0JCWl0ID0gUHlPYmplY3RfR2V0SXRlcihpbml0aWFsKTsKLQkJaWYgKGl0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJLyogV2Ugc2V0IGluaXRpYWwgdG8gTlVMTCBzbyB0aGF0IHRoZSBzdWJzZXF1ZW50IGNvZGUKLQkJICAgd2lsbCBjcmVhdGUgYW4gZW1wdHkgYXJyYXkgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKLQkJICAgYW5kIGFmdGVyd2FyZHMgd2UgY2FuIHVzZSBhcnJheV9pdGVyX2V4dGVuZCB0byBwb3B1bGF0ZQotCQkgICB0aGUgYXJyYXkuCi0JCSovCi0JCWluaXRpYWwgPSBOVUxMOwotCX0KLQlmb3IgKGRlc2NyID0gZGVzY3JpcHRvcnM7IGRlc2NyLT50eXBlY29kZSAhPSAnXDAnOyBkZXNjcisrKSB7Ci0JCWlmIChkZXNjci0+dHlwZWNvZGUgPT0gYykgewotCQkJUHlPYmplY3QgKmE7Ci0JCQlQeV9zc2l6ZV90IGxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImN8TzphcnJheSIsICZjLCAmaW5pdGlhbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JCQlpZiAoaW5pdGlhbCA9PSBOVUxMIHx8ICEoUHlMaXN0X0NoZWNrKGluaXRpYWwpIAotCQkJCXx8IFB5VHVwbGVfQ2hlY2soaW5pdGlhbCkpKQotCQkJCWxlbiA9IDA7Ci0JCQllbHNlCi0JCQkJbGVuID0gUHlTZXF1ZW5jZV9TaXplKGluaXRpYWwpOworICAgIGlmICghKGluaXRpYWwgPT0gTlVMTCB8fCBQeUxpc3RfQ2hlY2soaW5pdGlhbCkKKyAgICAgICAgICB8fCBQeVN0cmluZ19DaGVjayhpbml0aWFsKSB8fCBQeVR1cGxlX0NoZWNrKGluaXRpYWwpCisgICAgICAgICAgfHwgKGMgPT0gJ3UnICYmIFB5VW5pY29kZV9DaGVjayhpbml0aWFsKSkpKSB7CisgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihpbml0aWFsKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgLyogV2Ugc2V0IGluaXRpYWwgdG8gTlVMTCBzbyB0aGF0IHRoZSBzdWJzZXF1ZW50IGNvZGUKKyAgICAgICAgICAgd2lsbCBjcmVhdGUgYW4gZW1wdHkgYXJyYXkgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAgICAgICAgICAgYW5kIGFmdGVyd2FyZHMgd2UgY2FuIHVzZSBhcnJheV9pdGVyX2V4dGVuZCB0byBwb3B1bGF0ZQorICAgICAgICAgICB0aGUgYXJyYXkuCisgICAgICAgICovCisgICAgICAgIGluaXRpYWwgPSBOVUxMOworICAgIH0KKyAgICBmb3IgKGRlc2NyID0gZGVzY3JpcHRvcnM7IGRlc2NyLT50eXBlY29kZSAhPSAnXDAnOyBkZXNjcisrKSB7CisgICAgICAgIGlmIChkZXNjci0+dHlwZWNvZGUgPT0gYykgeworICAgICAgICAgICAgUHlPYmplY3QgKmE7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbjsKIAotCQkJYSA9IG5ld2FycmF5b2JqZWN0KHR5cGUsIGxlbiwgZGVzY3IpOwotCQkJaWYgKGEgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmIChpbml0aWFsID09IE5VTEwgfHwgIShQeUxpc3RfQ2hlY2soaW5pdGlhbCkKKyAgICAgICAgICAgICAgICB8fCBQeVR1cGxlX0NoZWNrKGluaXRpYWwpKSkKKyAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxlbiA9IFB5U2VxdWVuY2VfU2l6ZShpbml0aWFsKTsKIAotCQkJaWYgKGxlbiA+IDApIHsKLQkJCQlQeV9zc2l6ZV90IGk7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJCVB5T2JqZWN0ICp2ID0KLQkJCQkJICAgICAgICBQeVNlcXVlbmNlX0dldEl0ZW0oaW5pdGlhbCwgaSk7Ci0JCQkJCWlmICh2ID09IE5VTEwpIHsKLQkJCQkJCVB5X0RFQ1JFRihhKTsKLQkJCQkJCXJldHVybiBOVUxMOwotCQkJCQl9Ci0JCQkJCWlmIChzZXRhcnJheWl0ZW0oYSwgaSwgdikgIT0gMCkgewotCQkJCQkJUHlfREVDUkVGKHYpOwotCQkJCQkJUHlfREVDUkVGKGEpOwotCQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJCX0KLQkJCQkJUHlfREVDUkVGKHYpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaW5pdGlhbCAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGluaXRpYWwpKSB7Ci0JCQkJUHlPYmplY3QgKnRfaW5pdGlhbCwgKnY7Ci0JCQkJdF9pbml0aWFsID0gUHlUdXBsZV9QYWNrKDEsIGluaXRpYWwpOwotCQkJCWlmICh0X2luaXRpYWwgPT0gTlVMTCkgewotCQkJCQlQeV9ERUNSRUYoYSk7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCQl2ID0gYXJyYXlfZnJvbXN0cmluZygoYXJyYXlvYmplY3QgKilhLAotCQkJCQkJCSB0X2luaXRpYWwpOwotCQkJCVB5X0RFQ1JFRih0X2luaXRpYWwpOwotCQkJCWlmICh2ID09IE5VTEwpIHsKLQkJCQkJUHlfREVDUkVGKGEpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKHYpOworICAgICAgICAgICAgYSA9IG5ld2FycmF5b2JqZWN0KHR5cGUsIGxlbiwgZGVzY3IpOworICAgICAgICAgICAgaWYgKGEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfR2V0SXRlbShpbml0aWFsLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNldGFycmF5aXRlbShhLCBpLCB2KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2soaW5pdGlhbCkpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqdF9pbml0aWFsLCAqdjsKKyAgICAgICAgICAgICAgICB0X2luaXRpYWwgPSBQeVR1cGxlX1BhY2soMSwgaW5pdGlhbCk7CisgICAgICAgICAgICAgICAgaWYgKHRfaW5pdGlhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHYgPSBhcnJheV9mcm9tc3RyaW5nKChhcnJheW9iamVjdCAqKWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfaW5pdGlhbCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRfaW5pdGlhbCk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJfSBlbHNlIGlmIChpbml0aWFsICE9IE5VTEwgJiYgUHlVbmljb2RlX0NoZWNrKGluaXRpYWwpKSAgewotCQkJCVB5X3NzaXplX3QgbiA9IFB5VW5pY29kZV9HRVRfREFUQV9TSVpFKGluaXRpYWwpOwotCQkJCWlmIChuID4gMCkgewotCQkJCQlhcnJheW9iamVjdCAqc2VsZiA9IChhcnJheW9iamVjdCAqKWE7Ci0JCQkJCWNoYXIgKml0ZW0gPSBzZWxmLT5vYl9pdGVtOwotCQkJCQlpdGVtID0gKGNoYXIgKilQeU1lbV9SZWFsbG9jKGl0ZW0sIG4pOwotCQkJCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCQkJUHlfREVDUkVGKGEpOwotCQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJCX0KLQkJCQkJc2VsZi0+b2JfaXRlbSA9IGl0ZW07Ci0JCQkJCVB5X1NJWkUoc2VsZikgPSBuIC8gc2l6ZW9mKFB5X1VOSUNPREUpOwotCQkJCQltZW1jcHkoaXRlbSwgUHlVbmljb2RlX0FTX0RBVEEoaW5pdGlhbCksIG4pOwotCQkJCQlzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOwotCQkJCX0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbCAhPSBOVUxMICYmIFB5VW5pY29kZV9DaGVjayhpbml0aWFsKSkgIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG4gPSBQeVVuaWNvZGVfR0VUX0RBVEFfU0laRShpbml0aWFsKTsKKyAgICAgICAgICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlvYmplY3QgKnNlbGYgPSAoYXJyYXlvYmplY3QgKilhOworICAgICAgICAgICAgICAgICAgICBjaGFyICppdGVtID0gc2VsZi0+b2JfaXRlbTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IChjaGFyICopUHlNZW1fUmVhbGxvYyhpdGVtLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBpdGVtOworICAgICAgICAgICAgICAgICAgICBQeV9TSVpFKHNlbGYpID0gbiAvIHNpemVvZihQeV9VTklDT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGl0ZW0sIFB5VW5pY29kZV9BU19EQVRBKGluaXRpYWwpLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCX0KLQkJCWlmIChpdCAhPSBOVUxMKSB7Ci0JCQkJaWYgKGFycmF5X2l0ZXJfZXh0ZW5kKChhcnJheW9iamVjdCAqKWEsIGl0KSA9PSAtMSkgewotCQkJCQlQeV9ERUNSRUYoaXQpOwotCQkJCQlQeV9ERUNSRUYoYSk7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCQlQeV9ERUNSRUYoaXQpOwotCQkJfQotCQkJcmV0dXJuIGE7Ci0JCX0KLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCSJiYWQgdHlwZWNvZGUgKG11c3QgYmUgYywgYiwgQiwgdSwgaCwgSCwgaSwgSSwgbCwgTCwgZiBvciBkKSIpOwotCXJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXlfaXRlcl9leHRlbmQoKGFycmF5b2JqZWN0ICopYSwgaXQpID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgImJhZCB0eXBlY29kZSAobXVzdCBiZSBjLCBiLCBCLCB1LCBoLCBILCBpLCBJLCBsLCBMLCBmIG9yIGQpIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtMjA3OSw1NSArMjA3OSw1NSBAQAogc3RhdGljIFB5T2JqZWN0ICphcnJheV9pdGVyKGFycmF5b2JqZWN0ICphbyk7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQXJyYXl0eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJhcnJheS5hcnJheSIsCi0Jc2l6ZW9mKGFycmF5b2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWFycmF5X2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWFycmF5X3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIqLwotCSZhcnJheV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSovCi0JJmFycmF5X2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyovCi0JMCwgCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCSZhcnJheV9hc19idWZmZXIsCQkJLyogdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgLyogdHBfZmxhZ3MgKi8KLQlhcnJheXR5cGVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLSAJMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JYXJyYXlfcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihhcnJheW9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCShnZXRpdGVyZnVuYylhcnJheV9pdGVyLAkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWFycmF5X21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCWFycmF5X2dldHNldHMsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JYXJyYXlfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiYXJyYXkuYXJyYXkiLAorICAgIHNpemVvZihhcnJheW9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilhcnJheV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWFycmF5X3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIqLworICAgICZhcnJheV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UqLworICAgICZhcnJheV9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZhcnJheV9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgLyogdHBfZmxhZ3MgKi8KKyAgICBhcnJheXR5cGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgYXJyYXlfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKGFycmF5b2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAoZ2V0aXRlcmZ1bmMpYXJyYXlfaXRlciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgYXJyYXlfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgYXJyYXlfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGFycmF5X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiBBcnJheSBJdGVyYXRvciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90CQkJaW5kZXg7Ci0JYXJyYXlvYmplY3QJCSphbzsKLQlQeU9iamVjdAkJKiAoKmdldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90KTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CisgICAgYXJyYXlvYmplY3QgICAgICAgICAgICAgICAgICphbzsKKyAgICBQeU9iamVjdCAgICAgICAgICAgICAgICAgICAgKiAoKmdldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90KTsKIH0gYXJyYXlpdGVyb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5QXJyYXlJdGVyX1R5cGU7CkBAIC0yMTM3LDc5ICsyMTM3LDc5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfaXRlcihhcnJheW9iamVjdCAqYW8pCiB7Ci0JYXJyYXlpdGVyb2JqZWN0ICppdDsKKyAgICBhcnJheWl0ZXJvYmplY3QgKml0OwogCi0JaWYgKCFhcnJheV9DaGVjayhhbykpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIWFycmF5X0NoZWNrKGFvKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaXQgPSBQeU9iamVjdF9HQ19OZXcoYXJyYXlpdGVyb2JqZWN0LCAmUHlBcnJheUl0ZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGFycmF5aXRlcm9iamVjdCwgJlB5QXJyYXlJdGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0lOQ1JFRihhbyk7Ci0JaXQtPmFvID0gYW87Ci0JaXQtPmluZGV4ID0gMDsKLQlpdC0+Z2V0aXRlbSA9IGFvLT5vYl9kZXNjci0+Z2V0aXRlbTsKLQlQeU9iamVjdF9HQ19UcmFjayhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFB5X0lOQ1JFRihhbyk7CisgICAgaXQtPmFvID0gYW87CisgICAgaXQtPmluZGV4ID0gMDsKKyAgICBpdC0+Z2V0aXRlbSA9IGFvLT5vYl9kZXNjci0+Z2V0aXRlbTsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhpdCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlpdGVyX25leHQoYXJyYXlpdGVyb2JqZWN0ICppdCkKIHsKLQlhc3NlcnQoUHlBcnJheUl0ZXJfQ2hlY2soaXQpKTsKLQlpZiAoaXQtPmluZGV4IDwgUHlfU0laRShpdC0+YW8pKQotCQlyZXR1cm4gKCppdC0+Z2V0aXRlbSkoaXQtPmFvLCBpdC0+aW5kZXgrKyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5QXJyYXlJdGVyX0NoZWNrKGl0KSk7CisgICAgaWYgKGl0LT5pbmRleCA8IFB5X1NJWkUoaXQtPmFvKSkKKyAgICAgICAgcmV0dXJuICgqaXQtPmdldGl0ZW0pKGl0LT5hbywgaXQtPmluZGV4KyspOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAogYXJyYXlpdGVyX2RlYWxsb2MoYXJyYXlpdGVyb2JqZWN0ICppdCkKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGl0KTsKLQlQeV9YREVDUkVGKGl0LT5hbyk7Ci0JUHlPYmplY3RfR0NfRGVsKGl0KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGl0KTsKKyAgICBQeV9YREVDUkVGKGl0LT5hbyk7CisgICAgUHlPYmplY3RfR0NfRGVsKGl0KTsKIH0KIAogc3RhdGljIGludAogYXJyYXlpdGVyX3RyYXZlcnNlKGFycmF5aXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGl0LT5hbyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoaXQtPmFvKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeUFycmF5SXRlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJhcnJheWl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGFycmF5aXRlcm9iamVjdCksICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilhcnJheWl0ZXJfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWFycmF5aXRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylhcnJheWl0ZXJfbmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiYXJyYXlpdGVyYXRvciIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihhcnJheWl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpYXJyYXlpdGVyX2RlYWxsb2MsICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylhcnJheWl0ZXJfdHJhdmVyc2UsICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWFycmF5aXRlcl9uZXh0LCAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiB9OwogCiAKQEAgLTIyMjQsMTcgKzIyMjQsMTcgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0YXJyYXkodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCUFycmF5dHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCVB5QXJyYXlJdGVyX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQltID0gUHlfSW5pdE1vZHVsZTMoImFycmF5IiwgYV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgQXJyYXl0eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlBcnJheUl0ZXJfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiYXJyYXkiLCBhX21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotICAgICAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopJkFycmF5dHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBcnJheVR5cGUiLCAoUHlPYmplY3QgKikmQXJyYXl0eXBlKTsKLSAgICAgICAgUHlfSU5DUkVGKChQeU9iamVjdCAqKSZBcnJheXR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiYXJyYXkiLCAoUHlPYmplY3QgKikmQXJyYXl0eXBlKTsKLQkvKiBObyBuZWVkIHRvIGNoZWNrIHRoZSBlcnJvciBoZXJlLCB0aGUgY2FsbGVyIHdpbGwgZG8gdGhhdCAqLworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikmQXJyYXl0eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFycmF5VHlwZSIsIChQeU9iamVjdCAqKSZBcnJheXR5cGUpOworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikmQXJyYXl0eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImFycmF5IiwgKFB5T2JqZWN0ICopJkFycmF5dHlwZSk7CisgICAgLyogTm8gbmVlZCB0byBjaGVjayB0aGUgZXJyb3IgaGVyZSwgdGhlIGNhbGxlciB3aWxsIGRvIHRoYXQgKi8KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvYXVkaW9vcC5jIGIvTW9kdWxlcy9hdWRpb29wLmMKaW5kZXggYzFmNDQ2My4uMGI1NzI3MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hdWRpb29wLmMKKysrIGIvTW9kdWxlcy9hdWRpb29wLmMKQEAgLTUzLDEzICs1MywxMyBAQAogc3RhdGljIFB5SW50MTYKIHNlYXJjaChQeUludDE2IHZhbCwgUHlJbnQxNiAqdGFibGUsIGludCBzaXplKQogewotICAgICAgICBpbnQgaTsKKyAgICBpbnQgaTsKIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbCA8PSAqdGFibGUrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChzaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICh2YWwgPD0gKnRhYmxlKyspCisgICAgICAgICAgICByZXR1cm4gKGkpOworICAgIH0KKyAgICByZXR1cm4gKHNpemUpOwogfQogI2RlZmluZSBzdF91bGF3MmxpbmVhcjE2KHVjKSAoX3N0X3VsYXcybGluZWFyMTZbdWNdKQogI2RlZmluZSBzdF9hbGF3MmxpbmVhcjE2KHVjKSAoX3N0X2FsYXcybGluZWFyMTZbdWNdKQpAQCAtODMsNyArODMsNyBAQAogICAgICAgLTIyOCwgICAgLTIxMiwgICAgLTE5NiwgICAgLTE4MCwgICAgLTE2NCwgICAgLTE0OCwgICAgLTEzMiwKICAgICAgIC0xMjAsICAgIC0xMTIsICAgIC0xMDQsICAgICAtOTYsICAgICAtODgsICAgICAtODAsICAgICAtNzIsCiAgICAgICAgLTY0LCAgICAgLTU2LCAgICAgLTQ4LCAgICAgLTQwLCAgICAgLTMyLCAgICAgLTI0LCAgICAgLTE2LAotICAgICAgICAtOCwgICAgICAgMCwgICAzMjEyNCwgICAzMTEwMCwgICAzMDA3NiwgICAyOTA1MiwgICAyODAyOCwKKyAgICAtOCwgICAgICAgMCwgICAzMjEyNCwgICAzMTEwMCwgICAzMDA3NiwgICAyOTA1MiwgICAyODAyOCwKICAgICAgMjcwMDQsICAgMjU5ODAsICAgMjQ5NTYsICAgMjM5MzIsICAgMjI5MDgsICAgMjE4ODQsICAgMjA4NjAsCiAgICAgIDE5ODM2LCAgIDE4ODEyLCAgIDE3Nzg4LCAgIDE2NzY0LCAgIDE1OTk2LCAgIDE1NDg0LCAgIDE0OTcyLAogICAgICAxNDQ2MCwgICAxMzk0OCwgICAxMzQzNiwgICAxMjkyNCwgICAxMjQxMiwgICAxMTkwMCwgICAxMTM4OCwKQEAgLTEwMCw4ICsxMDAsOCBAQAogICAgICAgIDM3MiwgICAgIDM1NiwgICAgIDM0MCwgICAgIDMyNCwgICAgIDMwOCwgICAgIDI5MiwgICAgIDI3NiwKICAgICAgICAyNjAsICAgICAyNDQsICAgICAyMjgsICAgICAyMTIsICAgICAxOTYsICAgICAxODAsICAgICAxNjQsCiAgICAgICAgMTQ4LCAgICAgMTMyLCAgICAgMTIwLCAgICAgMTEyLCAgICAgMTA0LCAgICAgIDk2LCAgICAgIDg4LAotICAgICAgICA4MCwgICAgICA3MiwgICAgICA2NCwgICAgICA1NiwgICAgICA0OCwgICAgICA0MCwgICAgICAzMiwKLSAgICAgICAgMjQsICAgICAgMTYsICAgICAgIDgsICAgICAgIDAKKyAgICA4MCwgICAgICA3MiwgICAgICA2NCwgICAgICA1NiwgICAgICA0OCwgICAgICA0MCwgICAgICAzMiwKKyAgICAyNCwgICAgICAxNiwgICAgICAgOCwgICAgICAgMAogfTsKIAogLyoKQEAgLTEzNywzOSArMTM3LDM5IEBACiAgKiBKb2huIFdpbGV5ICYgU29ucywgcHBzIDk4LTExMSBhbmQgNDcyLTQ3Ni4KICAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIKLXN0XzE0bGluZWFyMnVsYXcoUHlJbnQxNiBwY21fdmFsKQkvKiAyJ3MgY29tcGxlbWVudCAoMTQtYml0IHJhbmdlKSAqLworc3RfMTRsaW5lYXIydWxhdyhQeUludDE2IHBjbV92YWwpICAgICAgIC8qIDIncyBjb21wbGVtZW50ICgxNC1iaXQgcmFuZ2UpICovCiB7Ci0gICAgICAgIFB5SW50MTYgICAgICAgICBtYXNrOwotICAgICAgICBQeUludDE2ICAgICAgICAgc2VnOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgdXZhbDsKKyAgICBQeUludDE2ICAgICAgICAgbWFzazsKKyAgICBQeUludDE2ICAgICAgICAgc2VnOworICAgIHVuc2lnbmVkIGNoYXIgICB1dmFsOwogCi0gICAgICAgIC8qIFRoZSBvcmlnaW5hbCBzb3ggY29kZSBkb2VzIHRoaXMgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCBoZXJlICovCi0gICAgICAgIHBjbV92YWwgPSBwY21fdmFsID4+IDI7CisgICAgLyogVGhlIG9yaWdpbmFsIHNveCBjb2RlIGRvZXMgdGhpcyBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbiwgbm90IGhlcmUgKi8KKyAgICBwY21fdmFsID0gcGNtX3ZhbCA+PiAyOwogCi0gICAgICAgIC8qIHUtbGF3IGludmVydHMgYWxsIGJpdHMgKi8KLSAgICAgICAgLyogR2V0IHRoZSBzaWduIGFuZCB0aGUgbWFnbml0dWRlIG9mIHRoZSB2YWx1ZS4gKi8KLSAgICAgICAgaWYgKHBjbV92YWwgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcGNtX3ZhbCA9IC1wY21fdmFsOwotICAgICAgICAgICAgICAgIG1hc2sgPSAweDdGOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1hc2sgPSAweEZGOwotICAgICAgICB9Ci0gICAgICAgIGlmICggcGNtX3ZhbCA+IENMSVAgKSBwY21fdmFsID0gQ0xJUDsgICAgICAgICAgIC8qIGNsaXAgdGhlIG1hZ25pdHVkZSAqLwotICAgICAgICBwY21fdmFsICs9IChCSUFTID4+IDIpOworICAgIC8qIHUtbGF3IGludmVydHMgYWxsIGJpdHMgKi8KKyAgICAvKiBHZXQgdGhlIHNpZ24gYW5kIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZhbHVlLiAqLworICAgIGlmIChwY21fdmFsIDwgMCkgeworICAgICAgICBwY21fdmFsID0gLXBjbV92YWw7CisgICAgICAgIG1hc2sgPSAweDdGOworICAgIH0gZWxzZSB7CisgICAgICAgIG1hc2sgPSAweEZGOworICAgIH0KKyAgICBpZiAoIHBjbV92YWwgPiBDTElQICkgcGNtX3ZhbCA9IENMSVA7ICAgICAgICAgICAvKiBjbGlwIHRoZSBtYWduaXR1ZGUgKi8KKyAgICBwY21fdmFsICs9IChCSUFTID4+IDIpOwogCi0gICAgICAgIC8qIENvbnZlcnQgdGhlIHNjYWxlZCBtYWduaXR1ZGUgdG8gc2VnbWVudCBudW1iZXIuICovCi0gICAgICAgIHNlZyA9IHNlYXJjaChwY21fdmFsLCBzZWdfdWVuZCwgOCk7CisgICAgLyogQ29udmVydCB0aGUgc2NhbGVkIG1hZ25pdHVkZSB0byBzZWdtZW50IG51bWJlci4gKi8KKyAgICBzZWcgPSBzZWFyY2gocGNtX3ZhbCwgc2VnX3VlbmQsIDgpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbWJpbmUgdGhlIHNpZ24sIHNlZ21lbnQsIHF1YW50aXphdGlvbiBiaXRzOwotICAgICAgICAgKiBhbmQgY29tcGxlbWVudCB0aGUgY29kZSB3b3JkLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHNlZyA+PSA4KSAgICAgICAgICAgLyogb3V0IG9mIHJhbmdlLCByZXR1cm4gbWF4aW11bSB2YWx1ZS4gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICgweDdGIF4gbWFzayk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHV2YWwgPSAodW5zaWduZWQgY2hhcikgKHNlZyA8PCA0KSB8ICgocGNtX3ZhbCA+PiAoc2VnICsgMSkpICYgMHhGKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHV2YWwgXiBtYXNrKTsKLSAgICAgICAgfQorICAgIC8qCisgICAgICogQ29tYmluZSB0aGUgc2lnbiwgc2VnbWVudCwgcXVhbnRpemF0aW9uIGJpdHM7CisgICAgICogYW5kIGNvbXBsZW1lbnQgdGhlIGNvZGUgd29yZC4KKyAgICAgKi8KKyAgICBpZiAoc2VnID49IDgpICAgICAgICAgICAvKiBvdXQgb2YgcmFuZ2UsIHJldHVybiBtYXhpbXVtIHZhbHVlLiAqLworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICgweDdGIF4gbWFzayk7CisgICAgZWxzZSB7CisgICAgICAgIHV2YWwgPSAodW5zaWduZWQgY2hhcikgKHNlZyA8PCA0KSB8ICgocGNtX3ZhbCA+PiAoc2VnICsgMSkpICYgMHhGKTsKKyAgICAgICAgcmV0dXJuICh1dmFsIF4gbWFzayk7CisgICAgfQogCiB9CiAKQEAgLTIzNCw1NyArMjM0LDU3IEBACiAgKiBKb2huIFdpbGV5ICYgU29ucywgcHBzIDk4LTExMSBhbmQgNDcyLTQ3Ni4KICAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIKLXN0X2xpbmVhcjJhbGF3KFB5SW50MTYgcGNtX3ZhbCkJLyogMidzIGNvbXBsZW1lbnQgKDEzLWJpdCByYW5nZSkgKi8KK3N0X2xpbmVhcjJhbGF3KFB5SW50MTYgcGNtX3ZhbCkgLyogMidzIGNvbXBsZW1lbnQgKDEzLWJpdCByYW5nZSkgKi8KIHsKLSAgICAgICAgUHlJbnQxNiAgICAgICAgIG1hc2s7Ci0gICAgICAgIHNob3J0ICAgICAgICAgICBzZWc7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBhdmFsOworICAgIFB5SW50MTYgICAgICAgICBtYXNrOworICAgIHNob3J0ICAgICAgICAgICBzZWc7CisgICAgdW5zaWduZWQgY2hhciAgIGF2YWw7CiAKLSAgICAgICAgLyogVGhlIG9yaWdpbmFsIHNveCBjb2RlIGRvZXMgdGhpcyBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbiwgbm90IGhlcmUgKi8KLSAgICAgICAgcGNtX3ZhbCA9IHBjbV92YWwgPj4gMzsKKyAgICAvKiBUaGUgb3JpZ2luYWwgc294IGNvZGUgZG9lcyB0aGlzIGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgaGVyZSAqLworICAgIHBjbV92YWwgPSBwY21fdmFsID4+IDM7CiAKLSAgICAgICAgLyogQS1sYXcgdXNpbmcgZXZlbiBiaXQgaW52ZXJzaW9uICovCi0gICAgICAgIGlmIChwY21fdmFsID49IDApIHsKLSAgICAgICAgICAgICAgICBtYXNrID0gMHhENTsgICAgICAgICAgICAvKiBzaWduICg3dGgpIGJpdCA9IDEgKi8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtYXNrID0gMHg1NTsgICAgICAgICAgICAvKiBzaWduIGJpdCA9IDAgKi8KLSAgICAgICAgICAgICAgICBwY21fdmFsID0gLXBjbV92YWwgLSAxOwotICAgICAgICB9CisgICAgLyogQS1sYXcgdXNpbmcgZXZlbiBiaXQgaW52ZXJzaW9uICovCisgICAgaWYgKHBjbV92YWwgPj0gMCkgeworICAgICAgICBtYXNrID0gMHhENTsgICAgICAgICAgICAvKiBzaWduICg3dGgpIGJpdCA9IDEgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBtYXNrID0gMHg1NTsgICAgICAgICAgICAvKiBzaWduIGJpdCA9IDAgKi8KKyAgICAgICAgcGNtX3ZhbCA9IC1wY21fdmFsIC0gMTsKKyAgICB9CiAKLSAgICAgICAgLyogQ29udmVydCB0aGUgc2NhbGVkIG1hZ25pdHVkZSB0byBzZWdtZW50IG51bWJlci4gKi8KLSAgICAgICAgc2VnID0gc2VhcmNoKHBjbV92YWwsIHNlZ19hZW5kLCA4KTsKKyAgICAvKiBDb252ZXJ0IHRoZSBzY2FsZWQgbWFnbml0dWRlIHRvIHNlZ21lbnQgbnVtYmVyLiAqLworICAgIHNlZyA9IHNlYXJjaChwY21fdmFsLCBzZWdfYWVuZCwgOCk7CiAKLSAgICAgICAgLyogQ29tYmluZSB0aGUgc2lnbiwgc2VnbWVudCwgYW5kIHF1YW50aXphdGlvbiBiaXRzLiAqLworICAgIC8qIENvbWJpbmUgdGhlIHNpZ24sIHNlZ21lbnQsIGFuZCBxdWFudGl6YXRpb24gYml0cy4gKi8KIAotICAgICAgICBpZiAoc2VnID49IDgpICAgICAgICAgICAvKiBvdXQgb2YgcmFuZ2UsIHJldHVybiBtYXhpbXVtIHZhbHVlLiAqLwotICAgICAgICAgICAgICAgIHJldHVybiAodW5zaWduZWQgY2hhcikgKDB4N0YgXiBtYXNrKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXZhbCA9ICh1bnNpZ25lZCBjaGFyKSBzZWcgPDwgU0VHX1NISUZUOwotICAgICAgICAgICAgICAgIGlmIChzZWcgPCAyKQotICAgICAgICAgICAgICAgICAgICAgICAgYXZhbCB8PSAocGNtX3ZhbCA+PiAxKSAmIFFVQU5UX01BU0s7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYXZhbCB8PSAocGNtX3ZhbCA+PiBzZWcpICYgUVVBTlRfTUFTSzsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGF2YWwgXiBtYXNrKTsKLSAgICAgICAgfQorICAgIGlmIChzZWcgPj0gOCkgICAgICAgICAgIC8qIG91dCBvZiByYW5nZSwgcmV0dXJuIG1heGltdW0gdmFsdWUuICovCisgICAgICAgIHJldHVybiAodW5zaWduZWQgY2hhcikgKDB4N0YgXiBtYXNrKTsKKyAgICBlbHNlIHsKKyAgICAgICAgYXZhbCA9ICh1bnNpZ25lZCBjaGFyKSBzZWcgPDwgU0VHX1NISUZUOworICAgICAgICBpZiAoc2VnIDwgMikKKyAgICAgICAgICAgIGF2YWwgfD0gKHBjbV92YWwgPj4gMSkgJiBRVUFOVF9NQVNLOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdmFsIHw9IChwY21fdmFsID4+IHNlZykgJiBRVUFOVF9NQVNLOworICAgICAgICByZXR1cm4gKGF2YWwgXiBtYXNrKTsKKyAgICB9CiB9CiAvKiBFbmQgb2YgY29kZSB0YWtlbiBmcm9tIHNveCAqLwogCiAvKiBJbnRlbCBBRFBDTSBzdGVwIHZhcmlhdGlvbiB0YWJsZSAqLwogc3RhdGljIGludCBpbmRleFRhYmxlWzE2XSA9IHsKLSAgICAgICAgLTEsIC0xLCAtMSwgLTEsIDIsIDQsIDYsIDgsCi0gICAgICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAorICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAorICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAogfTsKIAogc3RhdGljIGludCBzdGVwc2l6ZVRhYmxlWzg5XSA9IHsKLSAgICAgICAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsCi0gICAgICAgIDE5LCAyMSwgMjMsIDI1LCAyOCwgMzEsIDM0LCAzNywgNDEsIDQ1LAotICAgICAgICA1MCwgNTUsIDYwLCA2NiwgNzMsIDgwLCA4OCwgOTcsIDEwNywgMTE4LAotICAgICAgICAxMzAsIDE0MywgMTU3LCAxNzMsIDE5MCwgMjA5LCAyMzAsIDI1MywgMjc5LCAzMDcsCi0gICAgICAgIDMzNywgMzcxLCA0MDgsIDQ0OSwgNDk0LCA1NDQsIDU5OCwgNjU4LCA3MjQsIDc5NiwKLSAgICAgICAgODc2LCA5NjMsIDEwNjAsIDExNjYsIDEyODIsIDE0MTEsIDE1NTIsIDE3MDcsIDE4NzgsIDIwNjYsCi0gICAgICAgIDIyNzIsIDI0OTksIDI3NDksIDMwMjQsIDMzMjcsIDM2NjAsIDQwMjYsIDQ0MjgsIDQ4NzEsIDUzNTgsCi0gICAgICAgIDU4OTQsIDY0ODQsIDcxMzIsIDc4NDUsIDg2MzAsIDk0OTMsIDEwNDQyLCAxMTQ4NywgMTI2MzUsIDEzODk5LAotICAgICAgICAxNTI4OSwgMTY4MTgsIDE4NTAwLCAyMDM1MCwgMjIzODUsIDI0NjIzLCAyNzA4NiwgMjk3OTQsIDMyNzY3CisgICAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsCisgICAgMTksIDIxLCAyMywgMjUsIDI4LCAzMSwgMzQsIDM3LCA0MSwgNDUsCisgICAgNTAsIDU1LCA2MCwgNjYsIDczLCA4MCwgODgsIDk3LCAxMDcsIDExOCwKKyAgICAxMzAsIDE0MywgMTU3LCAxNzMsIDE5MCwgMjA5LCAyMzAsIDI1MywgMjc5LCAzMDcsCisgICAgMzM3LCAzNzEsIDQwOCwgNDQ5LCA0OTQsIDU0NCwgNTk4LCA2NTgsIDcyNCwgNzk2LAorICAgIDg3NiwgOTYzLCAxMDYwLCAxMTY2LCAxMjgyLCAxNDExLCAxNTUyLCAxNzA3LCAxODc4LCAyMDY2LAorICAgIDIyNzIsIDI0OTksIDI3NDksIDMwMjQsIDMzMjcsIDM2NjAsIDQwMjYsIDQ0MjgsIDQ4NzEsIDUzNTgsCisgICAgNTg5NCwgNjQ4NCwgNzEzMiwgNzg0NSwgODYzMCwgOTQ5MywgMTA0NDIsIDExNDg3LCAxMjYzNSwgMTM4OTksCisgICAgMTUyODksIDE2ODE4LCAxODUwMCwgMjAzNTAsIDIyMzg1LCAyNDYyMywgMjcwODYsIDI5Nzk0LCAzMjc2NwogfTsKIAogI2RlZmluZSBDSEFSUChjcCwgaSkgKChzaWduZWQgY2hhciAqKShjcCtpKSkKQEAgLTI5OCwxMzcgKzI5OCwxMzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2dldHNhbXBsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLSAgICAgICAgaW50IGk7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaTpnZXRzYW1wbGUiLCAmY3AsICZsZW4sICZzaXplLCAmaSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGkgPCAwIHx8IGkgPj0gbGVuL3NpemUgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIkluZGV4IG91dCBvZiByYW5nZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkqMik7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSo0KTsKLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaTpnZXRzYW1wbGUiLCAmY3AsICZsZW4sICZzaXplLCAmaSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIGkgPCAwIHx8IGkgPj0gbGVuL3NpemUgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSoyKTsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkqNCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX21heChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBtYXggPSAwOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIGludCBpOworICAgIGludCBtYXggPSAwOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTptYXgiLCAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoIGk9MDsgaTxsZW47IGkrPSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICAgICAgICAgIGlmICggdmFsIDwgMCApIHZhbCA9ICgtdmFsKTsKLSAgICAgICAgICAgICAgICBpZiAoIHZhbCA+IG1heCApIG1heCA9IHZhbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobWF4KTsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWF4IiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgaWYgKCB2YWwgPCAwICkgdmFsID0gKC12YWwpOworICAgICAgICBpZiAoIHZhbCA+IG1heCApIG1heCA9IHZhbDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1heCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX21pbm1heChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBtaW4gPSAweDdmZmZmZmZmLCBtYXggPSAtMHg3ZmZmZmZmZjsKKyAgICBzaWduZWQgY2hhciAqY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICBpbnQgaTsKKyAgICBpbnQgbWluID0gMHg3ZmZmZmZmZiwgbWF4ID0gLTB4N2ZmZmZmZmY7CiAKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWlubWF4IiwgJmNwLCAmbGVuLCAmc2l6ZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKSB2YWwgPSAoaW50KSAqQ0hBUlAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikgdmFsID0gKGludCkgKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KSB2YWwgPSAoaW50KSAqTE9OR1AoY3AsIGkpOwotICAgICAgICAgICAgICAgIGlmICh2YWwgPiBtYXgpIG1heCA9IHZhbDsKLSAgICAgICAgICAgICAgICBpZiAodmFsIDwgbWluKSBtaW4gPSB2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaSkiLCBtaW4sIG1heCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWlubWF4IiwgJmNwLCAmbGVuLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gMSkgdmFsID0gKGludCkgKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKSB2YWwgPSAoaW50KSAqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KSB2YWwgPSAoaW50KSAqTE9OR1AoY3AsIGkpOworICAgICAgICBpZiAodmFsID4gbWF4KSBtYXggPSB2YWw7CisgICAgICAgIGlmICh2YWwgPCBtaW4pIG1pbiA9IHZhbDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaSkiLCBtaW4sIG1heCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2F2ZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGRvdWJsZSBhdmcgPSAwLjA7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgaW50IGk7CisgICAgZG91YmxlIGF2ZyA9IDAuMDsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6YXZnIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBhdmcgKz0gdmFsOwotICAgICAgICB9Ci0gICAgICAgIGlmICggbGVuID09IDAgKQotICAgICAgICAgICAgICAgIHZhbCA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKShsZW4vc2l6ZSkpOwotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6YXZnIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgYXZnICs9IHZhbDsKKyAgICB9CisgICAgaWYgKCBsZW4gPT0gMCApCisgICAgICAgIHZhbCA9IDA7CisgICAgZWxzZQorICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKShsZW4vc2l6ZSkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9ybXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIGludCBpOwotICAgICAgICBkb3VibGUgc3VtX3NxdWFyZXMgPSAwLjA7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgaW50IGk7CisgICAgZG91YmxlIHN1bV9zcXVhcmVzID0gMC4wOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTpybXMiLCAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoIGk9MDsgaTxsZW47IGkrPSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICAgICAgICAgIHN1bV9zcXVhcmVzICs9IChkb3VibGUpdmFsKihkb3VibGUpdmFsOwotICAgICAgICB9Ci0gICAgICAgIGlmICggbGVuID09IDAgKQotICAgICAgICAgICAgICAgIHZhbCA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2YWwgPSAoaW50KXNxcnQoc3VtX3NxdWFyZXMgLyAoZG91YmxlKShsZW4vc2l6ZSkpOwotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6cm1zIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgc3VtX3NxdWFyZXMgKz0gKGRvdWJsZSl2YWwqKGRvdWJsZSl2YWw7CisgICAgfQorICAgIGlmICggbGVuID09IDAgKQorICAgICAgICB2YWwgPSAwOworICAgIGVsc2UKKyAgICAgICAgdmFsID0gKGludClzcXJ0KHN1bV9zcXVhcmVzIC8gKGRvdWJsZSkobGVuL3NpemUpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKIH0KIAogc3RhdGljIGRvdWJsZSBfc3VtMihzaG9ydCAqYSwgc2hvcnQgKmIsIGludCBsZW4pCiB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBkb3VibGUgc3VtID0gMC4wOworICAgIGludCBpOworICAgIGRvdWJsZSBzdW0gPSAwLjA7CiAKLSAgICAgICAgZm9yKCBpPTA7IGk8bGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzdW0gPSBzdW0gKyAoZG91YmxlKWFbaV0qKGRvdWJsZSliW2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdW07CisgICAgZm9yKCBpPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgc3VtID0gc3VtICsgKGRvdWJsZSlhW2ldKihkb3VibGUpYltpXTsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKIH0KIAogLyoKQEAgLTQ2Niw1OSArNDY2LDU5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9maW5kZml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2hvcnQgKmNwMSwgKmNwMjsKLSAgICAgICAgaW50IGxlbjEsIGxlbjI7Ci0gICAgICAgIGludCBqLCBiZXN0X2o7Ci0gICAgICAgIGRvdWJsZSBhal9tMSwgYWpfbG0xOwotICAgICAgICBkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfMiwgc3VtX2Fpal9yaSwgcmVzdWx0LCBiZXN0X3Jlc3VsdCwgZmFjdG9yOworICAgIHNob3J0ICpjcDEsICpjcDI7CisgICAgaW50IGxlbjEsIGxlbjI7CisgICAgaW50IGosIGJlc3RfajsKKyAgICBkb3VibGUgYWpfbTEsIGFqX2xtMTsKKyAgICBkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfMiwgc3VtX2Fpal9yaSwgcmVzdWx0LCBiZXN0X3Jlc3VsdCwgZmFjdG9yOwogCi0JLyogUGFzc2luZyBhIHNob3J0KiogZm9yIGFuICdzJyBhcmd1bWVudCBpcyBjb3JyZWN0IG9ubHkKLQkgICBpZiB0aGUgc3RyaW5nIGNvbnRlbnRzIGlzIGFsaWduZWQgZm9yIGludGVycHJldGF0aW9uCi0JICAgYXMgc2hvcnRbXS4gRHVlIHRvIHRoZSBkZWZpbml0aW9uIG9mIFB5U3RyaW5nT2JqZWN0LAotCSAgIHRoaXMgaXMgY3VycmVudGx5IChQeXRob24gMi42KSB0aGUgY2FzZS4gKi8KLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNzIzpmaW5kZml0IiwKLQkgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKiopJmNwMSwgJmxlbjEsIChjaGFyKiopJmNwMiwgJmxlbjIpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCBsZW4xICYgMSB8fCBsZW4yICYgMSApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGxlbjEgPj49IDE7Ci0gICAgICAgIGxlbjIgPj49IDE7CisgICAgLyogUGFzc2luZyBhIHNob3J0KiogZm9yIGFuICdzJyBhcmd1bWVudCBpcyBjb3JyZWN0IG9ubHkKKyAgICAgICBpZiB0aGUgc3RyaW5nIGNvbnRlbnRzIGlzIGFsaWduZWQgZm9yIGludGVycHJldGF0aW9uCisgICAgICAgYXMgc2hvcnRbXS4gRHVlIHRvIHRoZSBkZWZpbml0aW9uIG9mIFB5U3RyaW5nT2JqZWN0LAorICAgICAgIHRoaXMgaXMgY3VycmVudGx5IChQeXRob24gMi42KSB0aGUgY2FzZS4gKi8KKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3MjOmZpbmRmaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKikmY3AxLCAmbGVuMSwgKGNoYXIqKikmY3AyLCAmbGVuMikgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIGxlbjEgJiAxIHx8IGxlbjIgJiAxICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbGVuMSA+Pj0gMTsKKyAgICBsZW4yID4+PSAxOwogCi0gICAgICAgIGlmICggbGVuMSA8IGxlbjIgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIkZpcnN0IHNhbXBsZSBzaG91bGQgYmUgbG9uZ2VyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgc3VtX3JpXzIgPSBfc3VtMihjcDIsIGNwMiwgbGVuMik7Ci0gICAgICAgIHN1bV9haWpfMiA9IF9zdW0yKGNwMSwgY3AxLCBsZW4yKTsKLSAgICAgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMSwgY3AyLCBsZW4yKTsKKyAgICBpZiAoIGxlbjEgPCBsZW4yICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiRmlyc3Qgc2FtcGxlIHNob3VsZCBiZSBsb25nZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHN1bV9yaV8yID0gX3N1bTIoY3AyLCBjcDIsIGxlbjIpOworICAgIHN1bV9haWpfMiA9IF9zdW0yKGNwMSwgY3AxLCBsZW4yKTsKKyAgICBzdW1fYWlqX3JpID0gX3N1bTIoY3AxLCBjcDIsIGxlbjIpOwogCi0gICAgICAgIHJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpIC8gc3VtX2Fpal8yOworICAgIHJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpIC8gc3VtX2Fpal8yOwogCi0gICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OwotICAgICAgICBiZXN0X2ogPSAwOworICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgIGJlc3RfaiA9IDA7CiAKLSAgICAgICAgZm9yIChqPTE7IGo8PWxlbjEtbGVuMjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgYWpfbTEgPSAoZG91YmxlKWNwMVtqLTFdOwotICAgICAgICAgICAgICAgIGFqX2xtMSA9IChkb3VibGUpY3AxW2orbGVuMi0xXTsKKyAgICBmb3IgKGo9MTsgajw9bGVuMS1sZW4yOyBqKyspIHsKKyAgICAgICAgYWpfbTEgPSAoZG91YmxlKWNwMVtqLTFdOworICAgICAgICBhal9sbTEgPSAoZG91YmxlKWNwMVtqK2xlbjItMV07CiAKLSAgICAgICAgICAgICAgICBzdW1fYWlqXzIgPSBzdW1fYWlqXzIgKyBhal9sbTEqYWpfbG0xIC0gYWpfbTEqYWpfbTE7Ci0gICAgICAgICAgICAgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMStqLCBjcDIsIGxlbjIpOworICAgICAgICBzdW1fYWlqXzIgPSBzdW1fYWlqXzIgKyBhal9sbTEqYWpfbG0xIC0gYWpfbTEqYWpfbTE7CisgICAgICAgIHN1bV9haWpfcmkgPSBfc3VtMihjcDEraiwgY3AyLCBsZW4yKTsKIAotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpCi0gICAgICAgICAgICAgICAgICAgICAgICAvIHN1bV9haWpfMjsKKyAgICAgICAgcmVzdWx0ID0gKHN1bV9yaV8yKnN1bV9haWpfMiAtIHN1bV9haWpfcmkqc3VtX2Fpal9yaSkKKyAgICAgICAgICAgIC8gc3VtX2Fpal8yOwogCi0gICAgICAgICAgICAgICAgaWYgKCByZXN1bHQgPCBiZXN0X3Jlc3VsdCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9qID0gajsKLSAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgaWYgKCByZXN1bHQgPCBiZXN0X3Jlc3VsdCApIHsKKyAgICAgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgYmVzdF9qID0gajsKICAgICAgICAgfQogCi0gICAgICAgIGZhY3RvciA9IF9zdW0yKGNwMStiZXN0X2osIGNwMiwgbGVuMikgLyBzdW1fcmlfMjsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpZikiLCBiZXN0X2osIGZhY3Rvcik7CisgICAgZmFjdG9yID0gX3N1bTIoY3AxK2Jlc3RfaiwgY3AyLCBsZW4yKSAvIHN1bV9yaV8yOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpZikiLCBiZXN0X2osIGZhY3Rvcik7CiB9CiAKIC8qCkBAIC01MjgsMjggKzUyOCwyOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfZmluZGZhY3RvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNob3J0ICpjcDEsICpjcDI7Ci0gICAgICAgIGludCBsZW4xLCBsZW4yOwotICAgICAgICBkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfcmksIHJlc3VsdDsKKyAgICBzaG9ydCAqY3AxLCAqY3AyOworICAgIGludCBsZW4xLCBsZW4yOworICAgIGRvdWJsZSBzdW1fcmlfMiwgc3VtX2Fpal9yaSwgcmVzdWx0OwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjcyM6ZmluZGZhY3RvciIsCi0JICAgICAgICAgICAgICAgICAgICAgICAoY2hhcioqKSZjcDEsICZsZW4xLCAoY2hhcioqKSZjcDIsICZsZW4yKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggbGVuMSAmIDEgfHwgbGVuMiAmIDEgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGxlbjEgIT0gbGVuMiApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2FtcGxlcyBzaG91bGQgYmUgc2FtZSBzaXplIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuMiA+Pj0gMTsKLSAgICAgICAgc3VtX3JpXzIgPSBfc3VtMihjcDIsIGNwMiwgbGVuMik7Ci0gICAgICAgIHN1bV9haWpfcmkgPSBfc3VtMihjcDEsIGNwMiwgbGVuMik7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNzIzpmaW5kZmFjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKiopJmNwMSwgJmxlbjEsIChjaGFyKiopJmNwMiwgJmxlbjIpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBsZW4xICYgMSB8fCBsZW4yICYgMSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggbGVuMSAhPSBsZW4yICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2FtcGxlcyBzaG91bGQgYmUgc2FtZSBzaXplIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBsZW4yID4+PSAxOworICAgIHN1bV9yaV8yID0gX3N1bTIoY3AyLCBjcDIsIGxlbjIpOworICAgIHN1bV9haWpfcmkgPSBfc3VtMihjcDEsIGNwMiwgbGVuMik7CiAKLSAgICAgICAgcmVzdWx0ID0gc3VtX2Fpal9yaSAvIHN1bV9yaV8yOworICAgIHJlc3VsdCA9IHN1bV9haWpfcmkgLyBzdW1fcmlfMjsKIAotICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyZXN1bHQpOwogfQogCiAvKgpAQCAtNTU5LDEwOTMgKzU1OSwxMDkzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9maW5kbWF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2hvcnQgKmNwMTsKLSAgICAgICAgaW50IGxlbjEsIGxlbjI7Ci0gICAgICAgIGludCBqLCBiZXN0X2o7Ci0gICAgICAgIGRvdWJsZSBhal9tMSwgYWpfbG0xOwotICAgICAgICBkb3VibGUgcmVzdWx0LCBiZXN0X3Jlc3VsdDsKKyAgICBzaG9ydCAqY3AxOworICAgIGludCBsZW4xLCBsZW4yOworICAgIGludCBqLCBiZXN0X2o7CisgICAgZG91YmxlIGFqX20xLCBhal9sbTE7CisgICAgZG91YmxlIHJlc3VsdCwgYmVzdF9yZXN1bHQ7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmZpbmRtYXgiLAotCQkJICAgICAgIChjaGFyKiopJmNwMSwgJmxlbjEsICZsZW4yKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggbGVuMSAmIDEgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBsZW4xID4+PSAxOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTpmaW5kbWF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKiopJmNwMSwgJmxlbjEsICZsZW4yKSApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICggbGVuMSAmIDEgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTdHJpbmdzIHNob3VsZCBiZSBldmVuLXNpemVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBsZW4xID4+PSAxOwogCi0gICAgICAgIGlmICggbGVuMiA8IDAgfHwgbGVuMSA8IGxlbjIgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIklucHV0IHNhbXBsZSBzaG91bGQgYmUgbG9uZ2VyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBsZW4yIDwgMCB8fCBsZW4xIDwgbGVuMiApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIklucHV0IHNhbXBsZSBzaG91bGQgYmUgbG9uZ2VyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJlc3VsdCA9IF9zdW0yKGNwMSwgY3AxLCBsZW4yKTsKKworICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgIGJlc3RfaiA9IDA7CisKKyAgICBmb3IgKGo9MTsgajw9bGVuMS1sZW4yOyBqKyspIHsKKyAgICAgICAgYWpfbTEgPSAoZG91YmxlKWNwMVtqLTFdOworICAgICAgICBhal9sbTEgPSAoZG91YmxlKWNwMVtqK2xlbjItMV07CisKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgYWpfbG0xKmFqX2xtMSAtIGFqX20xKmFqX20xOworCisgICAgICAgIGlmICggcmVzdWx0ID4gYmVzdF9yZXN1bHQgKSB7CisgICAgICAgICAgICBiZXN0X3Jlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIGJlc3RfaiA9IGo7CiAgICAgICAgIH0KIAotICAgICAgICByZXN1bHQgPSBfc3VtMihjcDEsIGNwMSwgbGVuMik7CisgICAgfQogCi0gICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OwotICAgICAgICBiZXN0X2ogPSAwOwotCi0gICAgICAgIGZvciAoaj0xOyBqPD1sZW4xLWxlbjI7IGorKykgewotICAgICAgICAgICAgICAgIGFqX20xID0gKGRvdWJsZSljcDFbai0xXTsKLSAgICAgICAgICAgICAgICBhal9sbTEgPSAoZG91YmxlKWNwMVtqK2xlbjItMV07Ci0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBhal9sbTEqYWpfbG0xIC0gYWpfbTEqYWpfbTE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIHJlc3VsdCA+IGJlc3RfcmVzdWx0ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9yZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2ogPSBqOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGJlc3Rfaik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGJlc3Rfaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2F2Z3BwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCi0gICAgICAgICAgICAgICAgcHJldmV4dHJlbWUgPSAwOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgZG91YmxlIGF2ZyA9IDAuMDsKLSAgICAgICAgaW50IGRpZmYsIHByZXZkaWZmLCBleHRyZW1lZGlmZiwgbmV4dHJlbWUgPSAwOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCisgICAgICAgIHByZXZleHRyZW1lID0gMDsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgYXZnID0gMC4wOworICAgIGludCBkaWZmLCBwcmV2ZGlmZiwgZXh0cmVtZWRpZmYsIG5leHRyZW1lID0gMDsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6YXZncHAiLCAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8qIENvbXB1dGUgZmlyc3QgZGVsdGEgdmFsdWUgYWhlYWQuIEFsc28gYXV0b21hdGljYWxseSBtYWtlcyB1cwotICAgICAgICAqKiBza2lwIHRoZSBmaXJzdCBleHRyZW1lIHZhbHVlCi0gICAgICAgICovCi0gICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICBwcmV2dmFsID0gKGludCkqQ0hBUlAoY3AsIDApOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgcHJldnZhbCA9IChpbnQpKlNIT1JUUChjcCwgMCk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBwcmV2dmFsID0gKGludCkqTE9OR1AoY3AsIDApOwotICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIHNpemUpOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBzaXplKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBzaXplKTsKLSAgICAgICAgcHJldmRpZmYgPSB2YWwgLSBwcmV2dmFsOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTphdmdwcCIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogQ29tcHV0ZSBmaXJzdCBkZWx0YSB2YWx1ZSBhaGVhZC4gQWxzbyBhdXRvbWF0aWNhbGx5IG1ha2VzIHVzCisgICAgKiogc2tpcCB0aGUgZmlyc3QgZXh0cmVtZSB2YWx1ZQorICAgICovCisgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHByZXZ2YWwgPSAoaW50KSpDSEFSUChjcCwgMCk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHByZXZ2YWwgPSAoaW50KSpTSE9SVFAoY3AsIDApOworICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBwcmV2dmFsID0gKGludCkqTE9OR1AoY3AsIDApOworICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgc2l6ZSk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgc2l6ZSk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBzaXplKTsKKyAgICBwcmV2ZGlmZiA9IHZhbCAtIHByZXZ2YWw7CiAKLSAgICAgICAgZm9yICggaT1zaXplOyBpPGxlbjsgaSs9IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZGlmZiA9IHZhbCAtIHByZXZ2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKCBkaWZmKnByZXZkaWZmIDwgMCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlcml2YXRpdmUgY2hhbmdlZCBzaWduLiBDb21wdXRlIGRpZmZlcmVuY2UgdG8gbGFzdAotICAgICAgICAgICAgICAgICAgICAgICAgKiogZXh0cmVtZSB2YWx1ZSBhbmQgcmVtZW1iZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwcmV2ZXh0cmVtZXZhbGlkICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IHByZXZ2YWwgLSBwcmV2ZXh0cmVtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBleHRyZW1lZGlmZiA8IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gLWV4dHJlbWVkaWZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmcgKz0gZXh0cmVtZWRpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRyZW1lKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZXZhbGlkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZleHRyZW1lID0gcHJldnZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJldnZhbCA9IHZhbDsKLSAgICAgICAgICAgICAgICBpZiAoIGRpZmYgIT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZGlmZiA9IGRpZmY7CisgICAgZm9yICggaT1zaXplOyBpPGxlbjsgaSs9IHNpemUpIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgIGRpZmYgPSB2YWwgLSBwcmV2dmFsOworICAgICAgICBpZiAoIGRpZmYqcHJldmRpZmYgPCAwICkgeworICAgICAgICAgICAgLyogRGVyaXZhdGl2ZSBjaGFuZ2VkIHNpZ24uIENvbXB1dGUgZGlmZmVyZW5jZSB0byBsYXN0CisgICAgICAgICAgICAqKiBleHRyZW1lIHZhbHVlIGFuZCByZW1lbWJlci4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIHByZXZleHRyZW1ldmFsaWQgKSB7CisgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSBwcmV2dmFsIC0gcHJldmV4dHJlbWU7CisgICAgICAgICAgICAgICAgaWYgKCBleHRyZW1lZGlmZiA8IDAgKQorICAgICAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IC1leHRyZW1lZGlmZjsKKyAgICAgICAgICAgICAgICBhdmcgKz0gZXh0cmVtZWRpZmY7CisgICAgICAgICAgICAgICAgbmV4dHJlbWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZleHRyZW1ldmFsaWQgPSAxOworICAgICAgICAgICAgcHJldmV4dHJlbWUgPSBwcmV2dmFsOwogICAgICAgICB9Ci0gICAgICAgIGlmICggbmV4dHJlbWUgPT0gMCApCi0gICAgICAgICAgICAgICAgdmFsID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHZhbCA9IChpbnQpKGF2ZyAvIChkb3VibGUpbmV4dHJlbWUpOwotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICAgICAgcHJldnZhbCA9IHZhbDsKKyAgICAgICAgaWYgKCBkaWZmICE9IDAgKQorICAgICAgICAgICAgcHJldmRpZmYgPSBkaWZmOworICAgIH0KKyAgICBpZiAoIG5leHRyZW1lID09IDAgKQorICAgICAgICB2YWwgPSAwOworICAgIGVsc2UKKyAgICAgICAgdmFsID0gKGludCkoYXZnIC8gKGRvdWJsZSluZXh0cmVtZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX21heHBwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCi0gICAgICAgICAgICAgICAgcHJldmV4dHJlbWUgPSAwOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaW50IG1heCA9IDA7Ci0gICAgICAgIGludCBkaWZmLCBwcmV2ZGlmZiwgZXh0cmVtZWRpZmY7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDAsIHByZXZ2YWwgPSAwLCBwcmV2ZXh0cmVtZXZhbGlkID0gMCwKKyAgICAgICAgcHJldmV4dHJlbWUgPSAwOworICAgIGludCBpOworICAgIGludCBtYXggPSAwOworICAgIGludCBkaWZmLCBwcmV2ZGlmZiwgZXh0cmVtZWRpZmY7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOm1heHBwIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICAvKiBDb21wdXRlIGZpcnN0IGRlbHRhIHZhbHVlIGFoZWFkLiBBbHNvIGF1dG9tYXRpY2FsbHkgbWFrZXMgdXMKLSAgICAgICAgKiogc2tpcCB0aGUgZmlyc3QgZXh0cmVtZSB2YWx1ZQotICAgICAgICAqLwotICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgcHJldnZhbCA9IChpbnQpKkNIQVJQKGNwLCAwKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHByZXZ2YWwgPSAoaW50KSpTSE9SVFAoY3AsIDApOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgcHJldnZhbCA9IChpbnQpKkxPTkdQKGNwLCAwKTsKLSAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBzaXplKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgc2l6ZSk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgc2l6ZSk7Ci0gICAgICAgIHByZXZkaWZmID0gdmFsIC0gcHJldnZhbDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWF4cHAiLCAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIENvbXB1dGUgZmlyc3QgZGVsdGEgdmFsdWUgYWhlYWQuIEFsc28gYXV0b21hdGljYWxseSBtYWtlcyB1cworICAgICoqIHNraXAgdGhlIGZpcnN0IGV4dHJlbWUgdmFsdWUKKyAgICAqLworICAgIGlmICggc2l6ZSA9PSAxICkgICAgICBwcmV2dmFsID0gKGludCkqQ0hBUlAoY3AsIDApOworICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBwcmV2dmFsID0gKGludCkqU0hPUlRQKGNwLCAwKTsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgcHJldnZhbCA9IChpbnQpKkxPTkdQKGNwLCAwKTsKKyAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIHNpemUpOworICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIHNpemUpOworICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgc2l6ZSk7CisgICAgcHJldmRpZmYgPSB2YWwgLSBwcmV2dmFsOwogCi0gICAgICAgIGZvciAoIGk9c2l6ZTsgaTxsZW47IGkrPSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICAgICAgICAgIGRpZmYgPSB2YWwgLSBwcmV2dmFsOwotICAgICAgICAgICAgICAgIGlmICggZGlmZipwcmV2ZGlmZiA8IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXJpdmF0aXZlIGNoYW5nZWQgc2lnbi4gQ29tcHV0ZSBkaWZmZXJlbmNlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAqKiBsYXN0IGV4dHJlbWUgdmFsdWUgYW5kIHJlbWVtYmVyLgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHJldmV4dHJlbWV2YWxpZCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSBwcmV2dmFsIC0gcHJldmV4dHJlbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPCAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IC1leHRyZW1lZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBleHRyZW1lZGlmZiA+IG1heCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gZXh0cmVtZWRpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZXZhbGlkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZleHRyZW1lID0gcHJldnZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJldnZhbCA9IHZhbDsKLSAgICAgICAgICAgICAgICBpZiAoIGRpZmYgIT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZGlmZiA9IGRpZmY7CisgICAgZm9yICggaT1zaXplOyBpPGxlbjsgaSs9IHNpemUpIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgIGRpZmYgPSB2YWwgLSBwcmV2dmFsOworICAgICAgICBpZiAoIGRpZmYqcHJldmRpZmYgPCAwICkgeworICAgICAgICAgICAgLyogRGVyaXZhdGl2ZSBjaGFuZ2VkIHNpZ24uIENvbXB1dGUgZGlmZmVyZW5jZSB0bworICAgICAgICAgICAgKiogbGFzdCBleHRyZW1lIHZhbHVlIGFuZCByZW1lbWJlci4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIHByZXZleHRyZW1ldmFsaWQgKSB7CisgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSBwcmV2dmFsIC0gcHJldmV4dHJlbWU7CisgICAgICAgICAgICAgICAgaWYgKCBleHRyZW1lZGlmZiA8IDAgKQorICAgICAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IC1leHRyZW1lZGlmZjsKKyAgICAgICAgICAgICAgICBpZiAoIGV4dHJlbWVkaWZmID4gbWF4ICkKKyAgICAgICAgICAgICAgICAgICAgbWF4ID0gZXh0cmVtZWRpZmY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2ZXh0cmVtZXZhbGlkID0gMTsKKyAgICAgICAgICAgIHByZXZleHRyZW1lID0gcHJldnZhbDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobWF4KTsKKyAgICAgICAgcHJldnZhbCA9IHZhbDsKKyAgICAgICAgaWYgKCBkaWZmICE9IDAgKQorICAgICAgICAgICAgcHJldmRpZmYgPSBkaWZmOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobWF4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfY3Jvc3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgcHJldnZhbCwgbmNyb3NzOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIGludCBpOworICAgIGludCBwcmV2dmFsLCBuY3Jvc3M7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmNyb3NzIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBuY3Jvc3MgPSAtMTsKLSAgICAgICAgcHJldnZhbCA9IDE3OyAvKiBBbnl0aGluZyA8PiAwLDEgKi8KLSAgICAgICAgZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPj4gNzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKChpbnQpKlNIT1JUUChjcCwgaSkpID4+IDE1OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAzMTsKLSAgICAgICAgICAgICAgICB2YWwgPSB2YWwgJiAxOwotICAgICAgICAgICAgICAgIGlmICggdmFsICE9IHByZXZ2YWwgKSBuY3Jvc3MrKzsKLSAgICAgICAgICAgICAgICBwcmV2dmFsID0gdmFsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhuY3Jvc3MpOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTpjcm9zcyIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbmNyb3NzID0gLTE7CisgICAgcHJldnZhbCA9IDE3OyAvKiBBbnl0aGluZyA8PiAwLDEgKi8KKyAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPj4gNzsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9ICgoaW50KSpTSE9SVFAoY3AsIGkpKSA+PiAxNTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDMxOworICAgICAgICB2YWwgPSB2YWwgJiAxOworICAgICAgICBpZiAoIHZhbCAhPSBwcmV2dmFsICkgbmNyb3NzKys7CisgICAgICAgIHByZXZ2YWwgPSB2YWw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhuY3Jvc3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9tdWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIGRvdWJsZSBmYWN0b3IsIGZ2YWwsIG1heHZhbDsKLSAgICAgICAgUHlPYmplY3QgKnJ2OwotICAgICAgICBpbnQgaTsKKyAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICBkb3VibGUgZmFjdG9yLCBmdmFsLCBtYXh2YWw7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWQ6bXVsIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhY3RvciApICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lkOm11bCIsICZjcCwgJmxlbiwgJnNpemUsICZmYWN0b3IgKSApCisgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZmZmZmY7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOworICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCiAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICAgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWN0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLSAgICAgICAgICAgICAgICB2YWwgPSAoaW50KWZ2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKXZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KXZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpdmFsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydjsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWN0b3I7CisgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7CisgICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOworICAgICAgICB2YWwgPSAoaW50KWZ2YWw7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcil2YWw7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpdmFsOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpdmFsOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX3RvbW9ubyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsMSA9IDAsIHZhbDIgPSAwOwotICAgICAgICBkb3VibGUgZmFjMSwgZmFjMiwgZnZhbCwgbWF4dmFsOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwxID0gMCwgdmFsMiA9IDA7CisgICAgZG91YmxlIGZhYzEsIGZhYzIsIGZ2YWwsIG1heHZhbDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpZGQ6dG9tb25vIiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUsICZmYWMxLCAmZmFjMiApICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lkZDp0b21vbm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhYzEsICZmYWMyICkgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KKyAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vMik7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi8yKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSoyICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwxID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMSA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMiA9IChpbnQpKkNIQVJQKGNwLCBpKzEpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwLCBpKzIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AsIGkrNCk7Ci0gICAgICAgICAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsMSpmYWMxICsgKGRvdWJsZSl2YWwyKmZhYzI7Ci0gICAgICAgICAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLSAgICAgICAgICAgICAgICB2YWwxID0gKGludClmdmFsOwotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpLzIpID0gKHNpZ25lZCBjaGFyKXZhbDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpLzIpID0gKHNob3J0KXZhbDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkvMik9IChQeV9JbnQzMil2YWwxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydjsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSoyICkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMSA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDEgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMSA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDIgPSAoaW50KSpDSEFSUChjcCwgaSsxKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDIgPSAoaW50KSpTSE9SVFAoY3AsIGkrMik7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AsIGkrNCk7CisgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbDEqZmFjMSArIChkb3VibGUpdmFsMipmYWMyOworICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOworICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKKyAgICAgICAgdmFsMSA9IChpbnQpZnZhbDsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkvMikgPSAoc2lnbmVkIGNoYXIpdmFsMTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpLzIpID0gKHNob3J0KXZhbDE7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpLzIpPSAoUHlfSW50MzIpdmFsMTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF90b3N0ZXJlbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLSAgICAgICAgaW50IGxlbiwgbmV3X2xlbiwgc2l6ZSwgdmFsMSwgdmFsMiwgdmFsID0gMDsKLSAgICAgICAgZG91YmxlIGZhYzEsIGZhYzIsIGZ2YWwsIG1heHZhbDsKLSAgICAgICAgUHlPYmplY3QgKnJ2OwotICAgICAgICBpbnQgaTsKKyAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgaW50IGxlbiwgbmV3X2xlbiwgc2l6ZSwgdmFsMSwgdmFsMiwgdmFsID0gMDsKKyAgICBkb3VibGUgZmFjMSwgZmFjMiwgZnZhbCwgbWF4dmFsOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lkZDp0b3N0ZXJlbyIsCi0JICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmZmFjMSwgJmZhYzIgKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpZGQ6dG9zdGVyZW8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhYzEsICZmYWMyICkgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KKyAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICAgICAgbmV3X2xlbiA9IGxlbioyOwotICAgICAgICBpZiAobmV3X2xlbiA8IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisgICAgbmV3X2xlbiA9IGxlbioyOworICAgIGlmIChuZXdfbGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIG91dHB1dCBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmV3X2xlbik7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5ld19sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAogCi0gICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CiAKLSAgICAgICAgICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwqZmFjMTsKLSAgICAgICAgICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOwotICAgICAgICAgICAgICAgIHZhbDEgPSAoaW50KWZ2YWw7CisgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWMxOworICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOworICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKKyAgICAgICAgdmFsMSA9IChpbnQpZnZhbDsKIAotICAgICAgICAgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWMyOwotICAgICAgICAgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7Ci0gICAgICAgICAgICAgICAgdmFsMiA9IChpbnQpZnZhbDsKKyAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsKmZhYzI7CisgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7CisgICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOworICAgICAgICB2YWwyID0gKGludClmdmFsOwogCi0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkqMikgPSAoc2lnbmVkIGNoYXIpdmFsMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMikgPSAoc2hvcnQpdmFsMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSoyKSA9IChQeV9JbnQzMil2YWwxOworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSoyKSA9IChzaWduZWQgY2hhcil2YWwxOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMikgPSAoc2hvcnQpdmFsMTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkqMikgPSAoUHlfSW50MzIpdmFsMTsKIAotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKjIrMSkgPSAoc2lnbmVkIGNoYXIpdmFsMjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMisyKSA9IChzaG9ydCl2YWwyOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKjIrNCkgPSAoUHlfSW50MzIpdmFsMjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKjIrMSkgPSAoc2lnbmVkIGNoYXIpdmFsMjsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKjIrMikgPSAoc2hvcnQpdmFsMjsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkqMis0KSA9IChQeV9JbnQzMil2YWwyOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2FkZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDEsICpjcDIsICpuY3A7Ci0gICAgICAgIGludCBsZW4xLCBsZW4yLCBzaXplLCB2YWwxID0gMCwgdmFsMiA9IDAsIG1heHZhbCwgbmV3dmFsOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIHNpZ25lZCBjaGFyICpjcDEsICpjcDIsICpuY3A7CisgICAgaW50IGxlbjEsIGxlbjIsIHNpemUsIHZhbDEgPSAwLCB2YWwyID0gMCwgbWF4dmFsLCBuZXd2YWw7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjcyNpOmFkZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjcDEsICZsZW4xLCAmY3AyLCAmbGVuMiwgJnNpemUgKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNzI2k6YWRkIiwKKyAgICAgICAgICAgICAgICAgICAgICAmY3AxLCAmbGVuMSwgJmNwMiwgJmxlbjIsICZzaXplICkgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBpZiAoIGxlbjEgIT0gbGVuMiApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiTGVuZ3RocyBzaG91bGQgYmUgdGhlIHNhbWUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgIGlmICggbGVuMSAhPSBsZW4yICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiTGVuZ3RocyBzaG91bGQgYmUgdGhlIHNhbWUiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gMHg3ZjsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IDB4N2ZmZjsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IDB4N2ZmZmZmZmY7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gMHg3ZjsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gMHg3ZmZmOworICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAweDdmZmZmZmZmOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbjEpOwotICAgICAgICBpZiAoIHJ2ID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4xKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuMTsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AxLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMSA9IChpbnQpKlNIT1JUUChjcDEsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwxID0gKGludCkqTE9OR1AoY3AxLCBpKTsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW4xOyBpICs9IHNpemUgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AxLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDEgPSAoaW50KSpTSE9SVFAoY3AxLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDEgPSAoaW50KSpMT05HUChjcDEsIGkpOwogCi0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDIgPSAoaW50KSpDSEFSUChjcDIsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwMiwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDIgPSAoaW50KSpMT05HUChjcDIsIGkpOworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMiA9IChpbnQpKkNIQVJQKGNwMiwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwMiwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AyLCBpKTsKIAotICAgICAgICAgICAgICAgIG5ld3ZhbCA9IHZhbDEgKyB2YWwyOwotICAgICAgICAgICAgICAgIC8qIHRydW5jYXRlIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgKi8KLSAgICAgICAgICAgICAgICBpZiAobmV3dmFsID4gbWF4dmFsKSBuZXd2YWwgPSBtYXh2YWw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3dmFsIDwgLW1heHZhbCkgbmV3dmFsID0gLW1heHZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDQgJiYgKG5ld3ZhbF52YWwxKSA8IDAgJiYgKG5ld3ZhbF52YWwyKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWwgPSB2YWwxID4gMCA/IG1heHZhbCA6IC0gbWF4dmFsOworICAgICAgICBuZXd2YWwgPSB2YWwxICsgdmFsMjsKKyAgICAgICAgLyogdHJ1bmNhdGUgaW4gY2FzZSBvZiBvdmVyZmxvdyAqLworICAgICAgICBpZiAobmV3dmFsID4gbWF4dmFsKSBuZXd2YWwgPSBtYXh2YWw7CisgICAgICAgIGVsc2UgaWYgKG5ld3ZhbCA8IC1tYXh2YWwpIG5ld3ZhbCA9IC1tYXh2YWw7CisgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCAmJiAobmV3dmFsXnZhbDEpIDwgMCAmJiAobmV3dmFsXnZhbDIpIDwgMCkKKyAgICAgICAgICAgIG5ld3ZhbCA9IHZhbDEgPiAwID8gbWF4dmFsIDogLSBtYXh2YWw7CiAKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpbmV3dmFsOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpbmV3dmFsOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMiluZXd2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpbmV3dmFsOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KW5ld3ZhbDsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKW5ld3ZhbDsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9iaWFzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgYmlhczsKKyAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CisgICAgaW50IGJpYXM7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaTpiaWFzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSAsICZiaWFzKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaTpiaWFzIiwKKyAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplICwgJmJpYXMpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotICAgICAgICBpZiAoIHJ2ID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAogCi0gICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCtiaWFzKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWwrYmlhcyk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWwrYmlhcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCtiaWFzKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsK2JpYXMpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbCtiaWFzKTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9yZXZlcnNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICB1bnNpZ25lZCBjaGFyICpuY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGksIGo7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaSwgajsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6cmV2ZXJzZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6cmV2ZXJzZSIsCisgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKLSAgICAgICAgaWYgKCBydiA9PSAwICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0gICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CiAKLSAgICAgICAgICAgICAgICBqID0gbGVuIC0gaSAtIHNpemU7CisgICAgICAgIGogPSBsZW4gLSBpIC0gc2l6ZTsKIAotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBqKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGopID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBqKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGopID0gKHNob3J0KSh2YWwpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaikgPSAoUHlfSW50MzIpKHZhbDw8MTYpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2xpbjJsaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKLSAgICAgICAgaW50IGxlbiwgbmV3X2xlbiwgc2l6ZSwgc2l6ZTIsIHZhbCA9IDA7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGksIGo7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBpbnQgbGVuLCBuZXdfbGVuLCBzaXplLCBzaXplMiwgdmFsID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIGo7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaTpsaW4ybGluIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnNpemUyKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaTpsaW4ybGluIiwKKyAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmc2l6ZTIpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgaWYgKCAoc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHx8Ci0gICAgICAgICAgICAgKHNpemUyICE9IDEgJiYgc2l6ZTIgIT0gMiAmJiBzaXplMiAhPSA0KSkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgIGlmICggKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB8fAorICAgICAgICAgKHNpemUyICE9IDEgJiYgc2l6ZTIgIT0gMiAmJiBzaXplMiAhPSA0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotICAgICAgICBuZXdfbGVuID0gKGxlbi9zaXplKSpzaXplMjsKLSAgICAgICAgaWYgKG5ld19sZW4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIG91dHB1dCBidWZmZXIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5ld19sZW4pOwotICAgICAgICBpZiAoIHJ2ID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBuZXdfbGVuID0gKGxlbi9zaXplKSpzaXplMjsKKyAgICBpZiAobmV3X2xlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5ld19sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0gICAgICAgIGZvciAoIGk9MCwgaj0wOyBpIDwgbGVuOyBpICs9IHNpemUsIGogKz0gc2l6ZTIgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworICAgIGZvciAoIGk9MCwgaj0wOyBpIDwgbGVuOyBpICs9IHNpemUsIGogKz0gc2l6ZTIgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OwogCi0gICAgICAgICAgICAgICAgaWYgKCBzaXplMiA9PSAxICkgICpDSEFSUChuY3AsIGopID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUyID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUyID09IDQgKSAqTE9OR1AobmNwLCBqKSA9IChQeV9JbnQzMikodmFsPDwxNik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgICAgICBpZiAoIHNpemUyID09IDEgKSAgKkNIQVJQKG5jcCwgaikgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUyID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplMiA9PSA0ICkgKkxPTkdQKG5jcCwgaikgPSAoUHlfSW50MzIpKHZhbDw8MTYpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBpbnQKIGdjZChpbnQgYSwgaW50IGIpCiB7Ci0gICAgICAgIHdoaWxlIChiID4gMCkgewotICAgICAgICAgICAgICAgIGludCB0bXAgPSBhICUgYjsKLSAgICAgICAgICAgICAgICBhID0gYjsKLSAgICAgICAgICAgICAgICBiID0gdG1wOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhOworICAgIHdoaWxlIChiID4gMCkgeworICAgICAgICBpbnQgdG1wID0gYSAlIGI7CisgICAgICAgIGEgPSBiOworICAgICAgICBiID0gdG1wOworICAgIH0KKyAgICByZXR1cm4gYTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfcmF0ZWN2KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgY2hhciAqY3AsICpuY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIG5jaGFubmVscywgaW5yYXRlLCBvdXRyYXRlLCB3ZWlnaHRBLCB3ZWlnaHRCOwotICAgICAgICBpbnQgY2hhbiwgZCwgKnByZXZfaSwgKmN1cl9pLCBjdXJfbzsKLSAgICAgICAgUHlPYmplY3QgKnN0YXRlLCAqc2FtcHMsICpzdHIsICpydiA9IE5VTEw7Ci0gICAgICAgIGludCBieXRlc19wZXJfZnJhbWU7Ci0gICAgICAgIHNpemVfdCBhbGxvY19zaXplOworICAgIGNoYXIgKmNwLCAqbmNwOworICAgIGludCBsZW4sIHNpemUsIG5jaGFubmVscywgaW5yYXRlLCBvdXRyYXRlLCB3ZWlnaHRBLCB3ZWlnaHRCOworICAgIGludCBjaGFuLCBkLCAqcHJldl9pLCAqY3VyX2ksIGN1cl9vOworICAgIFB5T2JqZWN0ICpzdGF0ZSwgKnNhbXBzLCAqc3RyLCAqcnYgPSBOVUxMOworICAgIGludCBieXRlc19wZXJfZnJhbWU7CisgICAgc2l6ZV90IGFsbG9jX3NpemU7CiAKLSAgICAgICAgd2VpZ2h0QSA9IDE7Ci0gICAgICAgIHdlaWdodEIgPSAwOwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpaU98aWk6cmF0ZWN2IiwgJmNwLCAmbGVuLCAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5jaGFubmVscywgJmlucmF0ZSwgJm91dHJhdGUsICZzdGF0ZSwKLQkJCSAgICAgICZ3ZWlnaHRBLCAmd2VpZ2h0QikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAobmNoYW5uZWxzIDwgMSkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICIjIG9mIGNoYW5uZWxzIHNob3VsZCBiZSA+PSAxIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZXNfcGVyX2ZyYW1lID0gc2l6ZSAqIG5jaGFubmVsczsKLSAgICAgICAgaWYgKGJ5dGVzX3Blcl9mcmFtZSAvIG5jaGFubmVscyAhPSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgLyogVGhpcyBvdmVyZmxvdyB0ZXN0IGlzIHJpZ29yb3VzbHkgY29ycmVjdCBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgYm90aCBtdWx0aXBsaWNhbmRzIGFyZSA+PSAxLiAgVXNlIHRoZSBhcmd1bWVudCBuYW1lcwotICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGRvY3MgZm9yIHRoZSBlcnJvciBtc2cuICovCi0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCAqIG5jaGFubmVscyB0b28gYmlnIGZvciBhIEMgaW50Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdlaWdodEEgPCAxIHx8IHdlaWdodEIgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWlnaHRBIHNob3VsZCBiZSA+PSAxLCB3ZWlnaHRCIHNob3VsZCBiZSA+PSAwIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlbiAlIGJ5dGVzX3Blcl9mcmFtZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIm5vdCBhIHdob2xlIG51bWJlciBvZiBmcmFtZXMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5yYXRlIDw9IDAgfHwgb3V0cmF0ZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgInNhbXBsaW5nIHJhdGUgbm90ID4gMCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8qIGRpdmlkZSBpbnJhdGUgYW5kIG91dHJhdGUgYnkgdGhlaXIgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3IgKi8KLSAgICAgICAgZCA9IGdjZChpbnJhdGUsIG91dHJhdGUpOwotICAgICAgICBpbnJhdGUgLz0gZDsKLSAgICAgICAgb3V0cmF0ZSAvPSBkOworICAgIHdlaWdodEEgPSAxOworICAgIHdlaWdodEIgPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWlpT3xpaTpyYXRlY3YiLCAmY3AsICZsZW4sICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmNoYW5uZWxzLCAmaW5yYXRlLCAmb3V0cmF0ZSwgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2VpZ2h0QSwgJndlaWdodEIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG5jaGFubmVscyA8IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIiMgb2YgY2hhbm5lbHMgc2hvdWxkIGJlID49IDEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGJ5dGVzX3Blcl9mcmFtZSA9IHNpemUgKiBuY2hhbm5lbHM7CisgICAgaWYgKGJ5dGVzX3Blcl9mcmFtZSAvIG5jaGFubmVscyAhPSBzaXplKSB7CisgICAgICAgIC8qIFRoaXMgb3ZlcmZsb3cgdGVzdCBpcyByaWdvcm91c2x5IGNvcnJlY3QgYmVjYXVzZQorICAgICAgICAgICBib3RoIG11bHRpcGxpY2FuZHMgYXJlID49IDEuICBVc2UgdGhlIGFyZ3VtZW50IG5hbWVzCisgICAgICAgICAgIGZyb20gdGhlIGRvY3MgZm9yIHRoZSBlcnJvciBtc2cuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoICogbmNoYW5uZWxzIHRvbyBiaWcgZm9yIGEgQyBpbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh3ZWlnaHRBIDwgMSB8fCB3ZWlnaHRCIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLAorICAgICAgICAgICAgIndlaWdodEEgc2hvdWxkIGJlID49IDEsIHdlaWdodEIgc2hvdWxkIGJlID49IDAiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChsZW4gJSBieXRlc19wZXJfZnJhbWUgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAibm90IGEgd2hvbGUgbnVtYmVyIG9mIGZyYW1lcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGlucmF0ZSA8PSAwIHx8IG91dHJhdGUgPD0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAic2FtcGxpbmcgcmF0ZSBub3QgPiAwIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBkaXZpZGUgaW5yYXRlIGFuZCBvdXRyYXRlIGJ5IHRoZWlyIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yICovCisgICAgZCA9IGdjZChpbnJhdGUsIG91dHJhdGUpOworICAgIGlucmF0ZSAvPSBkOworICAgIG91dHJhdGUgLz0gZDsKIAotICAgICAgICBhbGxvY19zaXplID0gc2l6ZW9mKGludCkgKiAodW5zaWduZWQpbmNoYW5uZWxzOwotICAgICAgICBpZiAoYWxsb2Nfc2l6ZSA8ICh1bnNpZ25lZCluY2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGFsbG9jX3NpemUgPSBzaXplb2YoaW50KSAqICh1bnNpZ25lZCluY2hhbm5lbHM7CisgICAgaWYgKGFsbG9jX3NpemUgPCAodW5zaWduZWQpbmNoYW5uZWxzKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcHJldl9pID0gKGludCAqKSBtYWxsb2MoYWxsb2Nfc2l6ZSk7CisgICAgY3VyX2kgPSAoaW50ICopIG1hbGxvYyhhbGxvY19zaXplKTsKKyAgICBpZiAocHJldl9pID09IE5VTEwgfHwgY3VyX2kgPT0gTlVMTCkgeworICAgICAgICAodm9pZCkgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGxlbiAvPSBieXRlc19wZXJfZnJhbWU7IC8qICMgb2YgZnJhbWVzICovCisKKyAgICBpZiAoc3RhdGUgPT0gUHlfTm9uZSkgeworICAgICAgICBkID0gLW91dHJhdGU7CisgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykKKyAgICAgICAgICAgIHByZXZfaVtjaGFuXSA9IGN1cl9pW2NoYW5dID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpTyE7YXVkaW9vcC5yYXRlY3Y6IGlsbGVnYWwgc3RhdGUgYXJndW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgJmQsICZQeVR1cGxlX1R5cGUsICZzYW1wcykpCisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIGlmIChQeVR1cGxlX1NpemUoc2FtcHMpICE9IG5jaGFubmVscykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBzdGF0ZSBhcmd1bWVudCIpOworICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9Ci0gICAgICAgIHByZXZfaSA9IChpbnQgKikgbWFsbG9jKGFsbG9jX3NpemUpOwotICAgICAgICBjdXJfaSA9IChpbnQgKikgbWFsbG9jKGFsbG9jX3NpemUpOwotICAgICAgICBpZiAocHJldl9pID09IE5VTEwgfHwgY3VyX2kgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICh2b2lkKSBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShQeVR1cGxlX0dldEl0ZW0oc2FtcHMsIGNoYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpaTpyYXRlY3YiLCAmcHJldl9pW2NoYW5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyX2lbY2hhbl0pKQogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBsZW4gLz0gYnl0ZXNfcGVyX2ZyYW1lOyAvKiAjIG9mIGZyYW1lcyAqLworICAgIC8qIHN0ciA8LSBTcGFjZSBmb3IgdGhlIG91dHB1dCBidWZmZXIuICovCisgICAgeworICAgICAgICAvKiBUaGVyZSBhcmUgbGVuIGlucHV0IGZyYW1lcywgc28gd2UgbmVlZCAobWF0aGVtYXRpY2FsbHkpCisgICAgICAgICAgIGNlaWxpbmcobGVuKm91dHJhdGUvaW5yYXRlKSBvdXRwdXQgZnJhbWVzLCBhbmQgZWFjaCBmcmFtZQorICAgICAgICAgICByZXF1aXJlcyBieXRlc19wZXJfZnJhbWUgYnl0ZXMuICBDb21wdXRpbmcgdGhpcworICAgICAgICAgICB3aXRob3V0IHNwdXJpb3VzIG92ZXJmbG93IGlzIHRoZSBjaGFsbGVuZ2U7IHdlIGNhbgorICAgICAgICAgICBzZXR0bGUgZm9yIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCwgdGhvdWdoLiAqLworICAgICAgICBpbnQgY2VpbGluZzsgICAvKiB0aGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMgKi8KKyAgICAgICAgaW50IG5ieXRlczsgICAgLyogdGhlIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgbmVlZGVkICovCisgICAgICAgIGludCBxID0gbGVuIC8gaW5yYXRlOworICAgICAgICAvKiBOb3cgbGVuID0gcSAqIGlucmF0ZSArIHIgZXhhY3RseSAod2l0aCByID0gbGVuICUgaW5yYXRlKSwKKyAgICAgICAgICAgYW5kIHRoaXMgaXMgbGVzcyB0aGFuIHEgKiBpbnJhdGUgKyBpbnJhdGUgPSAocSsxKSppbnJhdGUuCisgICAgICAgICAgIFNvIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCBvbiBsZW4qb3V0cmF0ZS9pbnJhdGUgaXMKKyAgICAgICAgICAgKChxKzEpKmlucmF0ZSkqb3V0cmF0ZS9pbnJhdGUgPQorICAgICAgICAgICAocSsxKSpvdXRyYXRlLgorICAgICAgICAqLworICAgICAgICBjZWlsaW5nID0gKHErMSkgKiBvdXRyYXRlOworICAgICAgICBuYnl0ZXMgPSBjZWlsaW5nICogYnl0ZXNfcGVyX2ZyYW1lOworICAgICAgICAvKiBTZWUgd2hldGhlciBhbnl0aGluZyBvdmVyZmxvd2VkOyBpZiBub3QsIGdldCB0aGUgc3BhY2UuICovCisgICAgICAgIGlmIChxKzEgPCAwIHx8CisgICAgICAgICAgICBjZWlsaW5nIC8gb3V0cmF0ZSAhPSBxKzEgfHwKKyAgICAgICAgICAgIG5ieXRlcyAvIGJ5dGVzX3Blcl9mcmFtZSAhPSBjZWlsaW5nKQorICAgICAgICAgICAgc3RyID0gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmJ5dGVzKTsKIAotICAgICAgICBpZiAoc3RhdGUgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgIGQgPSAtb3V0cmF0ZTsKKyAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbmNwID0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgd2hpbGUgKGQgPCAwKSB7CisgICAgICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBzYW1wcyA9IFB5VHVwbGVfTmV3KG5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgaWYgKHNhbXBzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0gPSBjdXJfaVtjaGFuXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShzYW1wcywgY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIihpaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dKSk7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIGNoZWNrZWQgYmVmb3JlIHRoYXQgdGhlIGxlbmd0aAorICAgICAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgZml0cyBpbnRvIGludC4gKi8KKyAgICAgICAgICAgICAgICBsZW4gPSAoaW50KShuY3AgLSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLypkb24ndCB3YW50IHRvIHJlc2l6ZSB0byB6ZXJvIGxlbmd0aCovCisgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyID0gcnY7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfUHlTdHJpbmdfUmVzaXplKCZzdHIsIGxlbikgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpTykpIiwgc3RyLCBkLCBzYW1wcyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNhbXBzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7IC8qIHJldHVybiBydiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7CisgICAgICAgICAgICAgICAgcHJldl9pW2NoYW5dID0gY3VyX2lbY2hhbl07CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoKGludCkqQ0hBUlAoY3AsIDApKSA8PCA4OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoaW50KSpTSE9SVFAoY3AsIDApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoKGludCkqTE9OR1AoY3AsIDApKSA+PiAxNjsKKyAgICAgICAgICAgICAgICBjcCArPSBzaXplOworICAgICAgICAgICAgICAgIC8qIGltcGxlbWVudHMgYSBzaW1wbGUgZGlnaXRhbCBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9CisgICAgICAgICAgICAgICAgICAgICh3ZWlnaHRBICogY3VyX2lbY2hhbl0gKworICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0QiAqIHByZXZfaVtjaGFuXSkgLworICAgICAgICAgICAgICAgICAgICAod2VpZ2h0QSArIHdlaWdodEIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICBkICs9IG91dHJhdGU7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaU8hO2F1ZGlvb3AucmF0ZWN2OiBpbGxlZ2FsIHN0YXRlIGFyZ3VtZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQsICZQeVR1cGxlX1R5cGUsICZzYW1wcykpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgaWYgKFB5VHVwbGVfU2l6ZShzYW1wcykgIT0gbmNoYW5uZWxzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHN0YXRlIGFyZ3VtZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKFB5VHVwbGVfR2V0SXRlbShzYW1wcywgY2hhbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlpOnJhdGVjdiIsICZwcmV2X2lbY2hhbl0sCi0JCQkJCSAgICAgICAgICAgICAgICAgICAmY3VyX2lbY2hhbl0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICB3aGlsZSAoZCA+PSAwKSB7CisgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKKyAgICAgICAgICAgICAgICBjdXJfbyA9IChwcmV2X2lbY2hhbl0gKiBkICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSAqIChvdXRyYXRlIC0gZCkpIC8KKyAgICAgICAgICAgICAgICAgICAgb3V0cmF0ZTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAqQ0hBUlAobmNwLCAwKSA9IChzaWduZWQgY2hhcikoY3VyX28gPj4gOCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAqU0hPUlRQKG5jcCwgMCkgPSAoc2hvcnQpKGN1cl9vKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDQpCisgICAgICAgICAgICAgICAgICAgICpMT05HUChuY3AsIDApID0gKFB5X0ludDMyKShjdXJfbzw8MTYpOworICAgICAgICAgICAgICAgIG5jcCArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZCAtPSBpbnJhdGU7CiAgICAgICAgIH0KLQotICAgICAgICAvKiBzdHIgPC0gU3BhY2UgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGhlcmUgYXJlIGxlbiBpbnB1dCBmcmFtZXMsIHNvIHdlIG5lZWQgKG1hdGhlbWF0aWNhbGx5KQotICAgICAgICAgICAgICAgICAgIGNlaWxpbmcobGVuKm91dHJhdGUvaW5yYXRlKSBvdXRwdXQgZnJhbWVzLCBhbmQgZWFjaCBmcmFtZQotICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzIGJ5dGVzX3Blcl9mcmFtZSBieXRlcy4gIENvbXB1dGluZyB0aGlzCi0gICAgICAgICAgICAgICAgICAgd2l0aG91dCBzcHVyaW91cyBvdmVyZmxvdyBpcyB0aGUgY2hhbGxlbmdlOyB3ZSBjYW4KLSAgICAgICAgICAgICAgICAgICBzZXR0bGUgZm9yIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCwgdGhvdWdoLiAqLwotICAgICAgICAgICAgICAgIGludCBjZWlsaW5nOyAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcyAqLwotICAgICAgICAgICAgICAgIGludCBuYnl0ZXM7ICAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgIGludCBxID0gbGVuIC8gaW5yYXRlOwotICAgICAgICAgICAgICAgIC8qIE5vdyBsZW4gPSBxICogaW5yYXRlICsgciBleGFjdGx5ICh3aXRoIHIgPSBsZW4gJSBpbnJhdGUpLAotICAgICAgICAgICAgICAgICAgIGFuZCB0aGlzIGlzIGxlc3MgdGhhbiBxICogaW5yYXRlICsgaW5yYXRlID0gKHErMSkqaW5yYXRlLgotICAgICAgICAgICAgICAgICAgIFNvIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCBvbiBsZW4qb3V0cmF0ZS9pbnJhdGUgaXMKLSAgICAgICAgICAgICAgICAgICAoKHErMSkqaW5yYXRlKSpvdXRyYXRlL2lucmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgKHErMSkqb3V0cmF0ZS4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGNlaWxpbmcgPSAocSsxKSAqIG91dHJhdGU7Ci0gICAgICAgICAgICAgICAgbmJ5dGVzID0gY2VpbGluZyAqIGJ5dGVzX3Blcl9mcmFtZTsKLSAgICAgICAgICAgICAgICAvKiBTZWUgd2hldGhlciBhbnl0aGluZyBvdmVyZmxvd2VkOyBpZiBub3QsIGdldCB0aGUgc3BhY2UuICovCi0gICAgICAgICAgICAgICAgaWYgKHErMSA8IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgY2VpbGluZyAvIG91dHJhdGUgIT0gcSsxIHx8Ci0gICAgICAgICAgICAgICAgICAgIG5ieXRlcyAvIGJ5dGVzX3Blcl9mcmFtZSAhPSBjZWlsaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuYnl0ZXMpOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuY3AgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpOwotCi0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wcyA9IFB5VHVwbGVfTmV3KG5jaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYW1wcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShzYW1wcywgY2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIihpaSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBjaGVja2VkIGJlZm9yZSB0aGF0IHRoZSBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyBmaXRzIGludG8gaW50LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAoaW50KShuY3AgLSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypkb24ndCB3YW50IHRvIHJlc2l6ZSB0byB6ZXJvIGxlbmd0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gcnY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmc3RyLCBsZW4pIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaU8pKSIsIHN0ciwgZCwgc2FtcHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2FtcHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OyAvKiByZXR1cm4gcnYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0gPSBjdXJfaVtjaGFuXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0gKChpbnQpKkNIQVJQKGNwLCAwKSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoaW50KSpTSE9SVFAoY3AsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9ICgoaW50KSpMT05HUChjcCwgMCkpID4+IDE2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCArPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbXBsZW1lbnRzIGEgc2ltcGxlIGRpZ2l0YWwgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2VpZ2h0QSAqIGN1cl9pW2NoYW5dICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0QiAqIHByZXZfaVtjaGFuXSkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZWlnaHRBICsgd2VpZ2h0Qik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4tLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gb3V0cmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9vID0gKHByZXZfaVtjaGFuXSAqIGQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSAqIChvdXRyYXRlIC0gZCkpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkNIQVJQKG5jcCwgMCkgPSAoc2lnbmVkIGNoYXIpKGN1cl9vID4+IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU0hPUlRQKG5jcCwgMCkgPSAoc2hvcnQpKGN1cl9vKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkxPTkdQKG5jcCwgMCkgPSAoUHlfSW50MzIpKGN1cl9vPDwxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jcCArPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZCAtPSBpbnJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgfQogICBleGl0OgotICAgICAgICBpZiAocHJldl9pICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgZnJlZShwcmV2X2kpOwotICAgICAgICBpZiAoY3VyX2kgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBmcmVlKGN1cl9pKTsKLSAgICAgICAgcmV0dXJuIHJ2OworICAgIGlmIChwcmV2X2kgIT0gTlVMTCkKKyAgICAgICAgZnJlZShwcmV2X2kpOworICAgIGlmIChjdXJfaSAhPSBOVUxMKQorICAgICAgICBmcmVlKGN1cl9pKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2xpbjJ1bGF3KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICB1bnNpZ25lZCBjaGFyICpuY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGk7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bGluMnVsYXciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMCA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmxpbjJ1bGF3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDAgOwogCi0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuL3NpemUpOwotICAgICAgICBpZiAoIHJ2ID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi9zaXplKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OwogCi0gICAgICAgICAgICAgICAgKm5jcCsrID0gc3RfMTRsaW5lYXIydWxhdyh2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydjsKKyAgICAgICAgKm5jcCsrID0gc3RfMTRsaW5lYXIydWxhdyh2YWwpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX3VsYXcybGluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgY3ZhbDsKLSAgICAgICAgc2lnbmVkIGNoYXIgKm5jcDsKLSAgICAgICAgaW50IGxlbiwgbmV3X2xlbiwgc2l6ZSwgdmFsOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgY3ZhbDsKKyAgICBzaWduZWQgY2hhciAqbmNwOworICAgIGludCBsZW4sIG5ld19sZW4sIHNpemUsIHZhbDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOnVsYXcybGluIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOnVsYXcybGluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICAgICAgbmV3X2xlbiA9IGxlbipzaXplOwotICAgICAgICBpZiAobmV3X2xlbiA8IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmV3X2xlbik7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBuZXdfbGVuID0gbGVuKnNpemU7CisgICAgaWYgKG5ld19sZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfbGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbmV3X2xlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGN2YWwgPSAqY3ArKzsKLSAgICAgICAgICAgICAgICB2YWwgPSBzdF91bGF3MmxpbmVhcjE2KGN2YWwpOworICAgIGZvciAoIGk9MDsgaSA8IG5ld19sZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgY3ZhbCA9ICpjcCsrOworICAgICAgICB2YWwgPSBzdF91bGF3MmxpbmVhcjE2KGN2YWwpOwogCi0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbDw8MTYpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydjsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFsPDwxNik7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbGluMmFsYXcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLSAgICAgICAgUHlPYmplY3QgKnJ2OwotICAgICAgICBpbnQgaTsKKyAgICBzaWduZWQgY2hhciAqY3A7CisgICAgdW5zaWduZWQgY2hhciAqbmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTpsaW4yYWxhdyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTpsaW4yYWxhdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuL3NpemUpOwotICAgICAgICBpZiAoIHJ2ID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi9zaXplKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OwogCi0gICAgICAgICAgICAgICAgKm5jcCsrID0gc3RfbGluZWFyMmFsYXcodmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgICAgICpuY3ArKyA9IHN0X2xpbmVhcjJhbGF3KHZhbCk7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfYWxhdzJsaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICB1bnNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgdW5zaWduZWQgY2hhciBjdmFsOwotICAgICAgICBzaWduZWQgY2hhciAqbmNwOwotICAgICAgICBpbnQgbGVuLCBuZXdfbGVuLCBzaXplLCB2YWw7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciAqY3A7CisgICAgdW5zaWduZWQgY2hhciBjdmFsOworICAgIHNpZ25lZCBjaGFyICpuY3A7CisgICAgaW50IGxlbiwgbmV3X2xlbiwgc2l6ZSwgdmFsOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6YWxhdzJsaW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6YWxhdzJsaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotICAgICAgICBuZXdfbGVuID0gbGVuKnNpemU7Ci0gICAgICAgIGlmIChuZXdfbGVuIDwgMCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfbGVuKTsKLSAgICAgICAgaWYgKCBydiA9PSAwICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIG5ld19sZW4gPSBsZW4qc2l6ZTsKKyAgICBpZiAobmV3X2xlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5ld19sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBuZXdfbGVuOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgY3ZhbCA9ICpjcCsrOwotICAgICAgICAgICAgICAgIHZhbCA9IHN0X2FsYXcybGluZWFyMTYoY3ZhbCk7CisgICAgZm9yICggaT0wOyBpIDwgbmV3X2xlbjsgaSArPSBzaXplICkgeworICAgICAgICBjdmFsID0gKmNwKys7CisgICAgICAgIHZhbCA9IHN0X2FsYXcybGluZWFyMTYoY3ZhbCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWwpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFsPDwxNik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9saW4yYWRwY20oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpuY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDAsIHN0ZXAsIHZhbHByZWQsIGRlbHRhLAotICAgICAgICAgICAgICAgIGluZGV4LCBzaWduLCB2cGRpZmYsIGRpZmY7Ci0gICAgICAgIFB5T2JqZWN0ICpydiwgKnN0YXRlLCAqc3RyOwotICAgICAgICBpbnQgaSwgb3V0cHV0YnVmZmVyID0gMCwgYnVmZmVyc3RlcDsKKyAgICBzaWduZWQgY2hhciAqY3A7CisgICAgc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBzdGVwLCB2YWxwcmVkLCBkZWx0YSwKKyAgICAgICAgaW5kZXgsIHNpZ24sIHZwZGlmZiwgZGlmZjsKKyAgICBQeU9iamVjdCAqcnYsICpzdGF0ZSwgKnN0cjsKKyAgICBpbnQgaSwgb3V0cHV0YnVmZmVyID0gMCwgYnVmZmVyc3RlcDsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lPOmxpbjJhZHBjbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpTzpsaW4yYWRwY20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCisgICAgICAgIHJldHVybiAwOwogCiAKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLyhzaXplKjIpKTsKKyAgICBpZiAoIHN0ciA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcoc3RyKTsKKworICAgIC8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLworICAgIGlmICggc3RhdGUgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgLyogRmlyc3QgdGltZSwgaXQgc2VlbXMuIFNldCBkZWZhdWx0cyAqLworICAgICAgICB2YWxwcmVkID0gMDsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0gZWxzZSBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiaWkiLCAmdmFscHJlZCwgJmluZGV4KSApCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOworICAgIGJ1ZmZlcnN0ZXAgPSAxOworCisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworCisgICAgICAgIC8qIFN0ZXAgMSAtIGNvbXB1dGUgZGlmZmVyZW5jZSB3aXRoIHByZXZpb3VzIHZhbHVlICovCisgICAgICAgIGRpZmYgPSB2YWwgLSB2YWxwcmVkOworICAgICAgICBzaWduID0gKGRpZmYgPCAwKSA/IDggOiAwOworICAgICAgICBpZiAoIHNpZ24gKSBkaWZmID0gKC1kaWZmKTsKKworICAgICAgICAvKiBTdGVwIDIgLSBEaXZpZGUgYW5kIGNsYW1wICovCisgICAgICAgIC8qIE5vdGU6CisgICAgICAgICoqIFRoaXMgY29kZSAqYXBwcm94aW1hdGVseSogY29tcHV0ZXM6CisgICAgICAgICoqICAgIGRlbHRhID0gZGlmZio0L3N0ZXA7CisgICAgICAgICoqICAgIHZwZGlmZiA9IChkZWx0YSswLjUpKnN0ZXAvNDsKKyAgICAgICAgKiogYnV0IGluIHNoaWZ0IHN0ZXAgYml0cyBhcmUgZHJvcHBlZC4gVGhlIG5ldCByZXN1bHQgb2YgdGhpcworICAgICAgICAqKiBpcyB0aGF0IGV2ZW4gaWYgeW91IGhhdmUgZmFzdCBtdWwvZGl2IGhhcmR3YXJlIHlvdSBjYW5ub3QKKyAgICAgICAgKiogcHV0IGl0IHRvIGdvb2QgdXNlIHNpbmNlIHRoZSBmaXh1cCB3b3VsZCBiZSB0b28gZXhwZW5zaXZlLgorICAgICAgICAqLworICAgICAgICBkZWx0YSA9IDA7CisgICAgICAgIHZwZGlmZiA9IChzdGVwID4+IDMpOworCisgICAgICAgIGlmICggZGlmZiA+PSBzdGVwICkgeworICAgICAgICAgICAgZGVsdGEgPSA0OworICAgICAgICAgICAgZGlmZiAtPSBzdGVwOworICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7CisgICAgICAgIH0KKyAgICAgICAgc3RlcCA+Pj0gMTsKKyAgICAgICAgaWYgKCBkaWZmID49IHN0ZXAgICkgeworICAgICAgICAgICAgZGVsdGEgfD0gMjsKKyAgICAgICAgICAgIGRpZmYgLT0gc3RlcDsKKyAgICAgICAgICAgIHZwZGlmZiArPSBzdGVwOworICAgICAgICB9CisgICAgICAgIHN0ZXAgPj49IDE7CisgICAgICAgIGlmICggZGlmZiA+PSBzdGVwICkgeworICAgICAgICAgICAgZGVsdGEgfD0gMTsKKyAgICAgICAgICAgIHZwZGlmZiArPSBzdGVwOwogICAgICAgICB9CiAKLSAgICAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLyhzaXplKjIpKTsKLSAgICAgICAgaWYgKCBzdHIgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CisgICAgICAgIC8qIFN0ZXAgMyAtIFVwZGF0ZSBwcmV2aW91cyB2YWx1ZSAqLworICAgICAgICBpZiAoIHNpZ24gKQorICAgICAgICAgICAgdmFscHJlZCAtPSB2cGRpZmY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHByZWQgKz0gdnBkaWZmOwogCi0gICAgICAgIC8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLwotICAgICAgICBpZiAoIHN0YXRlID09IFB5X05vbmUgKSB7Ci0gICAgICAgICAgICAgICAgLyogRmlyc3QgdGltZSwgaXQgc2VlbXMuIFNldCBkZWZhdWx0cyAqLwotICAgICAgICAgICAgICAgIHZhbHByZWQgPSAwOwotICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgfSBlbHNlIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoc3RhdGUsICJpaSIsICZ2YWxwcmVkLCAmaW5kZXgpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgLyogU3RlcCA0IC0gQ2xhbXAgcHJldmlvdXMgdmFsdWUgdG8gMTYgYml0cyAqLworICAgICAgICBpZiAoIHZhbHByZWQgPiAzMjc2NyApCisgICAgICAgICAgICB2YWxwcmVkID0gMzI3Njc7CisgICAgICAgIGVsc2UgaWYgKCB2YWxwcmVkIDwgLTMyNzY4ICkKKyAgICAgICAgICAgIHZhbHByZWQgPSAtMzI3Njg7CiAKKyAgICAgICAgLyogU3RlcCA1IC0gQXNzZW1ibGUgdmFsdWUsIHVwZGF0ZSBpbmRleCBhbmQgc3RlcCB2YWx1ZXMgKi8KKyAgICAgICAgZGVsdGEgfD0gc2lnbjsKKworICAgICAgICBpbmRleCArPSBpbmRleFRhYmxlW2RlbHRhXTsKKyAgICAgICAgaWYgKCBpbmRleCA8IDAgKSBpbmRleCA9IDA7CisgICAgICAgIGlmICggaW5kZXggPiA4OCApIGluZGV4ID0gODg7CiAgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKLSAgICAgICAgYnVmZmVyc3RlcCA9IDE7CiAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCAxIC0gY29tcHV0ZSBkaWZmZXJlbmNlIHdpdGggcHJldmlvdXMgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBkaWZmID0gdmFsIC0gdmFscHJlZDsKLSAgICAgICAgICAgICAgICBzaWduID0gKGRpZmYgPCAwKSA/IDggOiAwOwotICAgICAgICAgICAgICAgIGlmICggc2lnbiApIGRpZmYgPSAoLWRpZmYpOwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCAyIC0gRGl2aWRlIGFuZCBjbGFtcCAqLwotICAgICAgICAgICAgICAgIC8qIE5vdGU6Ci0gICAgICAgICAgICAgICAgKiogVGhpcyBjb2RlICphcHByb3hpbWF0ZWx5KiBjb21wdXRlczoKLSAgICAgICAgICAgICAgICAqKiAgICBkZWx0YSA9IGRpZmYqNC9zdGVwOwotICAgICAgICAgICAgICAgICoqICAgIHZwZGlmZiA9IChkZWx0YSswLjUpKnN0ZXAvNDsKLSAgICAgICAgICAgICAgICAqKiBidXQgaW4gc2hpZnQgc3RlcCBiaXRzIGFyZSBkcm9wcGVkLiBUaGUgbmV0IHJlc3VsdCBvZiB0aGlzCi0gICAgICAgICAgICAgICAgKiogaXMgdGhhdCBldmVuIGlmIHlvdSBoYXZlIGZhc3QgbXVsL2RpdiBoYXJkd2FyZSB5b3UgY2Fubm90Ci0gICAgICAgICAgICAgICAgKiogcHV0IGl0IHRvIGdvb2QgdXNlIHNpbmNlIHRoZSBmaXh1cCB3b3VsZCBiZSB0b28gZXhwZW5zaXZlLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgZGVsdGEgPSAwOwotICAgICAgICAgICAgICAgIHZwZGlmZiA9IChzdGVwID4+IDMpOwotCi0gICAgICAgICAgICAgICAgaWYgKCBkaWZmID49IHN0ZXAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWZmIC09IHN0ZXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2cGRpZmYgKz0gc3RlcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RlcCA+Pj0gMTsKLSAgICAgICAgICAgICAgICBpZiAoIGRpZmYgPj0gc3RlcCAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSB8PSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiAtPSBzdGVwOwotICAgICAgICAgICAgICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0ZXAgPj49IDE7Ci0gICAgICAgICAgICAgICAgaWYgKCBkaWZmID49IHN0ZXAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSB8PSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogU3RlcCAzIC0gVXBkYXRlIHByZXZpb3VzIHZhbHVlICovCi0gICAgICAgICAgICAgICAgaWYgKCBzaWduICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgLT0gdnBkaWZmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgKz0gdnBkaWZmOwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCA0IC0gQ2xhbXAgcHJldmlvdXMgdmFsdWUgdG8gMTYgYml0cyAqLwotICAgICAgICAgICAgICAgIGlmICggdmFscHJlZCA+IDMyNzY3ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAzMjc2NzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkID0gLTMyNzY4OwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCA1IC0gQXNzZW1ibGUgdmFsdWUsIHVwZGF0ZSBpbmRleCBhbmQgc3RlcCB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICBkZWx0YSB8PSBzaWduOwotCi0gICAgICAgICAgICAgICAgaW5kZXggKz0gaW5kZXhUYWJsZVtkZWx0YV07Ci0gICAgICAgICAgICAgICAgaWYgKCBpbmRleCA8IDAgKSBpbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCBpbmRleCA+IDg4ICkgaW5kZXggPSA4ODsKLSAgICAgICAgICAgICAgICBzdGVwID0gc3RlcHNpemVUYWJsZVtpbmRleF07Ci0KLSAgICAgICAgICAgICAgICAvKiBTdGVwIDYgLSBPdXRwdXQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBpZiAoIGJ1ZmZlcnN0ZXAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRidWZmZXIgPSAoZGVsdGEgPDwgNCkgJiAweGYwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqbmNwKysgPSAoZGVsdGEgJiAweDBmKSB8IG91dHB1dGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmZmVyc3RlcCA9ICFidWZmZXJzdGVwOworICAgICAgICAvKiBTdGVwIDYgLSBPdXRwdXQgdmFsdWUgKi8KKyAgICAgICAgaWYgKCBidWZmZXJzdGVwICkgeworICAgICAgICAgICAgb3V0cHV0YnVmZmVyID0gKGRlbHRhIDw8IDQpICYgMHhmMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpuY3ArKyA9IChkZWx0YSAmIDB4MGYpIHwgb3V0cHV0YnVmZmVyOwogICAgICAgICB9Ci0gICAgICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaWkpKSIsIHN0ciwgdmFscHJlZCwgaW5kZXgpOwotICAgICAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIHJ2OworICAgICAgICBidWZmZXJzdGVwID0gIWJ1ZmZlcnN0ZXA7CisgICAgfQorICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaWkpKSIsIHN0ciwgdmFscHJlZCwgaW5kZXgpOworICAgIFB5X0RFQ1JFRihzdHIpOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfYWRwY20ybGluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICBzaWduZWQgY2hhciAqbmNwOwotICAgICAgICBpbnQgbGVuLCBuZXdfbGVuLCBzaXplLCB2YWxwcmVkLCBzdGVwLCBkZWx0YSwgaW5kZXgsIHNpZ24sIHZwZGlmZjsKLSAgICAgICAgUHlPYmplY3QgKnJ2LCAqc3RyLCAqc3RhdGU7Ci0gICAgICAgIGludCBpLCBpbnB1dGJ1ZmZlciA9IDAsIGJ1ZmZlcnN0ZXA7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIHNpZ25lZCBjaGFyICpuY3A7CisgICAgaW50IGxlbiwgbmV3X2xlbiwgc2l6ZSwgdmFscHJlZCwgc3RlcCwgZGVsdGEsIGluZGV4LCBzaWduLCB2cGRpZmY7CisgICAgUHlPYmplY3QgKnJ2LCAqc3RyLCAqc3RhdGU7CisgICAgaW50IGksIGlucHV0YnVmZmVyID0gMCwgYnVmZmVyc3RlcDsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lPOmFkcGNtMmxpbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpTzphZHBjbTJsaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCisgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLworICAgIGlmICggc3RhdGUgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgLyogRmlyc3QgdGltZSwgaXQgc2VlbXMuIFNldCBkZWZhdWx0cyAqLworICAgICAgICB2YWxwcmVkID0gMDsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0gZWxzZSBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiaWkiLCAmdmFscHJlZCwgJmluZGV4KSApCisgICAgICAgIHJldHVybiAwOworCisgICAgbmV3X2xlbiA9IGxlbipzaXplKjI7CisgICAgaWYgKG5ld19sZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmV3X2xlbik7CisgICAgaWYgKCBzdHIgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CisKKyAgICBzdGVwID0gc3RlcHNpemVUYWJsZVtpbmRleF07CisgICAgYnVmZmVyc3RlcCA9IDA7CisKKyAgICBmb3IgKCBpPTA7IGkgPCBuZXdfbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIC8qIFN0ZXAgMSAtIGdldCB0aGUgZGVsdGEgdmFsdWUgYW5kIGNvbXB1dGUgbmV4dCBpbmRleCAqLworICAgICAgICBpZiAoIGJ1ZmZlcnN0ZXAgKSB7CisgICAgICAgICAgICBkZWx0YSA9IGlucHV0YnVmZmVyICYgMHhmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5wdXRidWZmZXIgPSAqY3ArKzsKKyAgICAgICAgICAgIGRlbHRhID0gKGlucHV0YnVmZmVyID4+IDQpICYgMHhmOwogICAgICAgICB9CiAKLSAgICAgICAgLyogRGVjb2RlIHN0YXRlLCBzaG91bGQgaGF2ZSAodmFsdWUsIHN0ZXApICovCi0gICAgICAgIGlmICggc3RhdGUgPT0gUHlfTm9uZSApIHsKLSAgICAgICAgICAgICAgICAvKiBGaXJzdCB0aW1lLCBpdCBzZWVtcy4gU2V0IGRlZmF1bHRzICovCi0gICAgICAgICAgICAgICAgdmFscHJlZCA9IDA7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAwOwotICAgICAgICB9IGVsc2UgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwgImlpIiwgJnZhbHByZWQsICZpbmRleCkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBidWZmZXJzdGVwID0gIWJ1ZmZlcnN0ZXA7CiAKLSAgICAgICAgbmV3X2xlbiA9IGxlbipzaXplKjI7Ci0gICAgICAgIGlmIChuZXdfbGVuIDwgMCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmV3X2xlbik7Ci0gICAgICAgIGlmICggc3RyID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhzdHIpOworICAgICAgICAvKiBTdGVwIDIgLSBGaW5kIG5ldyBpbmRleCB2YWx1ZSAoZm9yIGxhdGVyKSAqLworICAgICAgICBpbmRleCArPSBpbmRleFRhYmxlW2RlbHRhXTsKKyAgICAgICAgaWYgKCBpbmRleCA8IDAgKSBpbmRleCA9IDA7CisgICAgICAgIGlmICggaW5kZXggPiA4OCApIGluZGV4ID0gODg7CiAKKyAgICAgICAgLyogU3RlcCAzIC0gU2VwYXJhdGUgc2lnbiBhbmQgbWFnbml0dWRlICovCisgICAgICAgIHNpZ24gPSBkZWx0YSAmIDg7CisgICAgICAgIGRlbHRhID0gZGVsdGEgJiA3OworCisgICAgICAgIC8qIFN0ZXAgNCAtIENvbXB1dGUgZGlmZmVyZW5jZSBhbmQgbmV3IHByZWRpY3RlZCB2YWx1ZSAqLworICAgICAgICAvKgorICAgICAgICAqKiBDb21wdXRlcyAndnBkaWZmID0gKGRlbHRhKzAuNSkqc3RlcC80JywgYnV0IHNlZSBjb21tZW50CisgICAgICAgICoqIGluIGFkcGNtX2NvZGVyLgorICAgICAgICAqLworICAgICAgICB2cGRpZmYgPSBzdGVwID4+IDM7CisgICAgICAgIGlmICggZGVsdGEgJiA0ICkgdnBkaWZmICs9IHN0ZXA7CisgICAgICAgIGlmICggZGVsdGEgJiAyICkgdnBkaWZmICs9IHN0ZXA+PjE7CisgICAgICAgIGlmICggZGVsdGEgJiAxICkgdnBkaWZmICs9IHN0ZXA+PjI7CisKKyAgICAgICAgaWYgKCBzaWduICkKKyAgICAgICAgICAgIHZhbHByZWQgLT0gdnBkaWZmOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWxwcmVkICs9IHZwZGlmZjsKKworICAgICAgICAvKiBTdGVwIDUgLSBjbGFtcCBvdXRwdXQgdmFsdWUgKi8KKyAgICAgICAgaWYgKCB2YWxwcmVkID4gMzI3NjcgKQorICAgICAgICAgICAgdmFscHJlZCA9IDMyNzY3OworICAgICAgICBlbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCisgICAgICAgICAgICB2YWxwcmVkID0gLTMyNzY4OworCisgICAgICAgIC8qIFN0ZXAgNiAtIFVwZGF0ZSBzdGVwIHZhbHVlICovCiAgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKLSAgICAgICAgYnVmZmVyc3RlcCA9IDA7CiAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbmV3X2xlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIC8qIFN0ZXAgMSAtIGdldCB0aGUgZGVsdGEgdmFsdWUgYW5kIGNvbXB1dGUgbmV4dCBpbmRleCAqLwotICAgICAgICAgICAgICAgIGlmICggYnVmZmVyc3RlcCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gaW5wdXRidWZmZXIgJiAweGY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0YnVmZmVyID0gKmNwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChpbnB1dGJ1ZmZlciA+PiA0KSAmIDB4ZjsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIC8qIFN0ZXAgNiAtIE91dHB1dCB2YWx1ZSAqLworICAgICAgICBpZiAoIHNpemUgPT0gMSApICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWxwcmVkID4+IDgpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWxwcmVkKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWxwcmVkPDwxNik7CisgICAgfQogCi0gICAgICAgICAgICAgICAgYnVmZmVyc3RlcCA9ICFidWZmZXJzdGVwOwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCAyIC0gRmluZCBuZXcgaW5kZXggdmFsdWUgKGZvciBsYXRlcikgKi8KLSAgICAgICAgICAgICAgICBpbmRleCArPSBpbmRleFRhYmxlW2RlbHRhXTsKLSAgICAgICAgICAgICAgICBpZiAoIGluZGV4IDwgMCApIGluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoIGluZGV4ID4gODggKSBpbmRleCA9IDg4OwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCAzIC0gU2VwYXJhdGUgc2lnbiBhbmQgbWFnbml0dWRlICovCi0gICAgICAgICAgICAgICAgc2lnbiA9IGRlbHRhICYgODsKLSAgICAgICAgICAgICAgICBkZWx0YSA9IGRlbHRhICYgNzsKLQotICAgICAgICAgICAgICAgIC8qIFN0ZXAgNCAtIENvbXB1dGUgZGlmZmVyZW5jZSBhbmQgbmV3IHByZWRpY3RlZCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgKiogQ29tcHV0ZXMgJ3ZwZGlmZiA9IChkZWx0YSswLjUpKnN0ZXAvNCcsIGJ1dCBzZWUgY29tbWVudAotICAgICAgICAgICAgICAgICoqIGluIGFkcGNtX2NvZGVyLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgdnBkaWZmID0gc3RlcCA+PiAzOwotICAgICAgICAgICAgICAgIGlmICggZGVsdGEgJiA0ICkgdnBkaWZmICs9IHN0ZXA7Ci0gICAgICAgICAgICAgICAgaWYgKCBkZWx0YSAmIDIgKSB2cGRpZmYgKz0gc3RlcD4+MTsKLSAgICAgICAgICAgICAgICBpZiAoIGRlbHRhICYgMSApIHZwZGlmZiArPSBzdGVwPj4yOwotCi0gICAgICAgICAgICAgICAgaWYgKCBzaWduICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgLT0gdnBkaWZmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgKz0gdnBkaWZmOwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCA1IC0gY2xhbXAgb3V0cHV0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgaWYgKCB2YWxwcmVkID4gMzI3NjcgKQotICAgICAgICAgICAgICAgICAgICAgICAgdmFscHJlZCA9IDMyNzY3OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB2YWxwcmVkIDwgLTMyNzY4ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAtMzI3Njg7Ci0KLSAgICAgICAgICAgICAgICAvKiBTdGVwIDYgLSBVcGRhdGUgc3RlcCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKLQotICAgICAgICAgICAgICAgIC8qIFN0ZXAgNiAtIE91dHB1dCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbHByZWQgPj4gOCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFscHJlZCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWxwcmVkPDwxNik7Ci0gICAgICAgIH0KLQotICAgICAgICBydiA9IFB5X0J1aWxkVmFsdWUoIihPKGlpKSkiLCBzdHIsIHZhbHByZWQsIGluZGV4KTsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBydjsKKyAgICBydiA9IFB5X0J1aWxkVmFsdWUoIihPKGlpKSkiLCBzdHIsIHZhbHByZWQsIGluZGV4KTsKKyAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBhdWRpb29wX21ldGhvZHNbXSA9IHsKLSAgICAgICAgeyAibWF4IiwgYXVkaW9vcF9tYXgsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJtaW5tYXgiLCBhdWRpb29wX21pbm1heCwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImF2ZyIsIGF1ZGlvb3BfYXZnLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAibWF4cHAiLCBhdWRpb29wX21heHBwLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAiYXZncHAiLCBhdWRpb29wX2F2Z3BwLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAicm1zIiwgYXVkaW9vcF9ybXMsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJmaW5kZml0IiwgYXVkaW9vcF9maW5kZml0LCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAiZmluZG1heCIsIGF1ZGlvb3BfZmluZG1heCwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImZpbmRmYWN0b3IiLCBhdWRpb29wX2ZpbmRmYWN0b3IsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJjcm9zcyIsIGF1ZGlvb3BfY3Jvc3MsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJtdWwiLCBhdWRpb29wX211bCwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImFkZCIsIGF1ZGlvb3BfYWRkLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAiYmlhcyIsIGF1ZGlvb3BfYmlhcywgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgInVsYXcybGluIiwgYXVkaW9vcF91bGF3MmxpbiwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImxpbjJ1bGF3IiwgYXVkaW9vcF9saW4ydWxhdywgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImFsYXcybGluIiwgYXVkaW9vcF9hbGF3MmxpbiwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImxpbjJhbGF3IiwgYXVkaW9vcF9saW4yYWxhdywgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImxpbjJsaW4iLCBhdWRpb29wX2xpbjJsaW4sIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJhZHBjbTJsaW4iLCBhdWRpb29wX2FkcGNtMmxpbiwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImxpbjJhZHBjbSIsIGF1ZGlvb3BfbGluMmFkcGNtLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAidG9tb25vIiwgYXVkaW9vcF90b21vbm8sIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJ0b3N0ZXJlbyIsIGF1ZGlvb3BfdG9zdGVyZW8sIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJnZXRzYW1wbGUiLCBhdWRpb29wX2dldHNhbXBsZSwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgInJldmVyc2UiLCBhdWRpb29wX3JldmVyc2UsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJyYXRlY3YiLCBhdWRpb29wX3JhdGVjdiwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgMCwgICAgICAgICAgMCB9CisgICAgeyAibWF4IiwgYXVkaW9vcF9tYXgsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgIm1pbm1heCIsIGF1ZGlvb3BfbWlubWF4LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJhdmciLCBhdWRpb29wX2F2ZywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAibWF4cHAiLCBhdWRpb29wX21heHBwLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJhdmdwcCIsIGF1ZGlvb3BfYXZncHAsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInJtcyIsIGF1ZGlvb3Bfcm1zLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJmaW5kZml0IiwgYXVkaW9vcF9maW5kZml0LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJmaW5kbWF4IiwgYXVkaW9vcF9maW5kbWF4LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJmaW5kZmFjdG9yIiwgYXVkaW9vcF9maW5kZmFjdG9yLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJjcm9zcyIsIGF1ZGlvb3BfY3Jvc3MsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgIm11bCIsIGF1ZGlvb3BfbXVsLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJhZGQiLCBhdWRpb29wX2FkZCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiYmlhcyIsIGF1ZGlvb3BfYmlhcywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAidWxhdzJsaW4iLCBhdWRpb29wX3VsYXcybGluLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJsaW4ydWxhdyIsIGF1ZGlvb3BfbGluMnVsYXcsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImFsYXcybGluIiwgYXVkaW9vcF9hbGF3MmxpbiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAibGluMmFsYXciLCBhdWRpb29wX2xpbjJhbGF3LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJsaW4ybGluIiwgYXVkaW9vcF9saW4ybGluLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJhZHBjbTJsaW4iLCBhdWRpb29wX2FkcGNtMmxpbiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAibGluMmFkcGNtIiwgYXVkaW9vcF9saW4yYWRwY20sIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInRvbW9ubyIsIGF1ZGlvb3BfdG9tb25vLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJ0b3N0ZXJlbyIsIGF1ZGlvb3BfdG9zdGVyZW8sIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImdldHNhbXBsZSIsIGF1ZGlvb3BfZ2V0c2FtcGxlLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJyZXZlcnNlIiwgYXVkaW9vcF9yZXZlcnNlLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJyYXRlY3YiLCBhdWRpb29wX3JhdGVjdiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAwLCAgICAgICAgICAwIH0KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0YXVkaW9vcCh2b2lkKQogewotICAgICAgICBQeU9iamVjdCAqbSwgKmQ7Ci0gICAgICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJhdWRpb29wIiwgYXVkaW9vcF9tZXRob2RzKTsKLSAgICAgICAgaWYgKG0gPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotICAgICAgICBpZiAoZCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgQXVkaW9vcEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJhdWRpb29wLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIGlmIChBdWRpb29wRXJyb3IgIT0gTlVMTCkKLSAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCJlcnJvciIsQXVkaW9vcEVycm9yKTsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoImF1ZGlvb3AiLCBhdWRpb29wX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgQXVkaW9vcEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJhdWRpb29wLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKEF1ZGlvb3BFcnJvciAhPSBOVUxMKQorICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiZXJyb3IiLEF1ZGlvb3BFcnJvcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2JpbmFzY2lpLmMgYi9Nb2R1bGVzL2JpbmFzY2lpLmMKaW5kZXggZGI2NzVmOS4uMmQ5MWI3ZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9iaW5hc2NpaS5jCisrKyBiL01vZHVsZXMvYmluYXNjaWkuYwpAQCAtMyw0MCArMyw0MCBAQAogKioKICoqIFRoaXMgbW9kdWxlIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGVuY29kaW5nczoKICoqIHV1ZW5jb2RlOgotKiogICAgIAllYWNoIGxpbmUgZW5jb2RlcyA0NSBieXRlcyAoZXhjZXB0IHBvc3NpYmx5IHRoZSBsYXN0KQotKioJRmlyc3QgY2hhciBlbmNvZGVzIChiaW5hcnkpIGxlbmd0aCwgcmVzdCBkYXRhCi0qKgllYWNoIGNoYXIgZW5jb2RlcyA2IGJpdHMsIGFzIGZvbGxvd3M6Ci0qKgliaW5hcnk6IDAxMjM0NTY3IGFiY2RlZmdoIGlqa2xtbm9wCi0qKglhc2NpaTogIDAxMjM0NSA2N2FiY2QgZWZnaGlqIGtsbW5vcAotKioJQVNDSUkgZW5jb2RpbmcgbWV0aG9kIGlzICJleGNlc3Mtc3BhY2UiOiAwMDAwMDAgaXMgZW5jb2RlZCBhcyAnICcsIGV0Yy4KLSoqCXNob3J0IGJpbmFyeSBkYXRhIGlzIHplcm8tZXh0ZW5kZWQgKHNvIHRoZSBiaXRzIGFyZSBhbHdheXMgaW4gdGhlCi0qKglyaWdodCBwbGFjZSksIHRoaXMgZG9lcyAqbm90KiByZWZsZWN0IGluIHRoZSBsZW5ndGguCisqKiAgICAgIGVhY2ggbGluZSBlbmNvZGVzIDQ1IGJ5dGVzIChleGNlcHQgcG9zc2libHkgdGhlIGxhc3QpCisqKiAgICAgIEZpcnN0IGNoYXIgZW5jb2RlcyAoYmluYXJ5KSBsZW5ndGgsIHJlc3QgZGF0YQorKiogICAgICBlYWNoIGNoYXIgZW5jb2RlcyA2IGJpdHMsIGFzIGZvbGxvd3M6CisqKiAgICAgIGJpbmFyeTogMDEyMzQ1NjcgYWJjZGVmZ2ggaWprbG1ub3AKKyoqICAgICAgYXNjaWk6ICAwMTIzNDUgNjdhYmNkIGVmZ2hpaiBrbG1ub3AKKyoqICAgICAgQVNDSUkgZW5jb2RpbmcgbWV0aG9kIGlzICJleGNlc3Mtc3BhY2UiOiAwMDAwMDAgaXMgZW5jb2RlZCBhcyAnICcsIGV0Yy4KKyoqICAgICAgc2hvcnQgYmluYXJ5IGRhdGEgaXMgemVyby1leHRlbmRlZCAoc28gdGhlIGJpdHMgYXJlIGFsd2F5cyBpbiB0aGUKKyoqICAgICAgcmlnaHQgcGxhY2UpLCB0aGlzIGRvZXMgKm5vdCogcmVmbGVjdCBpbiB0aGUgbGVuZ3RoLgogKiogYmFzZTY0OgogKiogICAgICBMaW5lIGJyZWFrcyBhcmUgaW5zaWduaWZpY2FudCwgYnV0IGxpbmVzIGFyZSBhdCBtb3N0IDc2IGNoYXJzCiAqKiAgICAgIGVhY2ggY2hhciBlbmNvZGVzIDYgYml0cywgaW4gc2ltaWxhciBvcmRlciBhcyB1dWNvZGUvaHF4LiBFbmNvZGluZwogKiogICAgICBpcyBkb25lIHZpYSBhIHRhYmxlLgogKiogICAgICBTaG9ydCBiaW5hcnkgZGF0YSBpcyBmaWxsZWQgKGluIEFTQ0lJKSB3aXRoICc9Jy4KICoqIGhxeDoKLSoqCUZpbGUgc3RhcnRzIHdpdGggaW50cm9kdWN0b3J5IHRleHQsIHJlYWwgZGF0YSBzdGFydHMgYW5kIGVuZHMKLSoqCXdpdGggY29sb25zLgotKioJRGF0YSBjb25zaXN0cyBvZiB0aHJlZSBzaW1pbGFyIHBhcnRzOiBpbmZvLCBkYXRhZm9yaywgcmVzb3VyY2Vmb3JrLgotKioJRWFjaCBwYXJ0IGlzIHByb3RlY3RlZCAoYXQgdGhlIGVuZCkgd2l0aCBhIDE2LWJpdCBjcmMKLSoqCVRoZSBiaW5hcnkgZGF0YSBpcyBydW4tbGVuZ3RoIGVuY29kZWQsIGFuZCB0aGVuIGFzY2lpLWZpZWQ6Ci0qKgliaW5hcnk6IDAxMjM0NTY3IGFiY2RlZmdoIGlqa2xtbm9wCi0qKglhc2NpaTogIDAxMjM0NSA2N2FiY2QgZWZnaGlqIGtsbW5vcAotKioJQVNDSUkgZW5jb2RpbmcgaXMgdGFibGUtZHJpdmVuLCBzZWUgdGhlIGNvZGUuCi0qKglTaG9ydCBiaW5hcnkgZGF0YSByZXN1bHRzIGluIHRoZSBydW50IGFzY2lpLWJ5dGUgYmVpbmcgb3V0cHV0IHdpdGgKLSoqCXRoZSBiaXRzIGluIHRoZSByaWdodCBwbGFjZS4KKyoqICAgICAgRmlsZSBzdGFydHMgd2l0aCBpbnRyb2R1Y3RvcnkgdGV4dCwgcmVhbCBkYXRhIHN0YXJ0cyBhbmQgZW5kcworKiogICAgICB3aXRoIGNvbG9ucy4KKyoqICAgICAgRGF0YSBjb25zaXN0cyBvZiB0aHJlZSBzaW1pbGFyIHBhcnRzOiBpbmZvLCBkYXRhZm9yaywgcmVzb3VyY2Vmb3JrLgorKiogICAgICBFYWNoIHBhcnQgaXMgcHJvdGVjdGVkIChhdCB0aGUgZW5kKSB3aXRoIGEgMTYtYml0IGNyYworKiogICAgICBUaGUgYmluYXJ5IGRhdGEgaXMgcnVuLWxlbmd0aCBlbmNvZGVkLCBhbmQgdGhlbiBhc2NpaS1maWVkOgorKiogICAgICBiaW5hcnk6IDAxMjM0NTY3IGFiY2RlZmdoIGlqa2xtbm9wCisqKiAgICAgIGFzY2lpOiAgMDEyMzQ1IDY3YWJjZCBlZmdoaWoga2xtbm9wCisqKiAgICAgIEFTQ0lJIGVuY29kaW5nIGlzIHRhYmxlLWRyaXZlbiwgc2VlIHRoZSBjb2RlLgorKiogICAgICBTaG9ydCBiaW5hcnkgZGF0YSByZXN1bHRzIGluIHRoZSBydW50IGFzY2lpLWJ5dGUgYmVpbmcgb3V0cHV0IHdpdGgKKyoqICAgICAgdGhlIGJpdHMgaW4gdGhlIHJpZ2h0IHBsYWNlLgogKioKICoqIFdoaWxlIEkgd2FzIHJlYWRpbmcgZG96ZW5zIG9mIHByb2dyYW1zIHRoYXQgZW5jb2RlIG9yIGRlY29kZSB0aGUgZm9ybWF0cwogKiogaGVyZSAoZG9jdW1lbnRhdGlvbj8gaGloaTotKSBJIGhhdmUgZm9ybXVsYXRlZCBKYW5zZW4ncyBPYnNlcnZhdGlvbjoKICoqCi0qKglQcm9ncmFtcyB0aGF0IGVuY29kZSBiaW5hcnkgZGF0YSBpbiBBU0NJSSBhcmUgd3JpdHRlbiBpbgotKioJc3VjaCBhIHN0eWxlIHRoYXQgdGhleSBhcmUgYXMgdW5yZWFkYWJsZSBhcyBwb3NzaWJsZS4gRGV2aWNlcyB1c2VkCi0qKglpbmNsdWRlIHVubmVjZXNzYXJ5IGdsb2JhbCB2YXJpYWJsZXMsIGJ1cnlpbmcgaW1wb3J0YW50IHRhYmxlcwotKioJaW4gdW5yZWxhdGVkIHNvdXJjZWZpbGVzLCBwdXR0aW5nIGZ1bmN0aW9ucyBpbiBpbmNsdWRlIGZpbGVzLAotKioJdXNpbmcgc2VlbWluZ2x5LWRlc2NyaXB0aXZlIHZhcmlhYmxlIG5hbWVzIGZvciBkaWZmZXJlbnQgcHVycG9zZXMsCi0qKgljYWxscyB0byBlbXB0eSBzdWJyb3V0aW5lcyBhbmQgYSBob3N0IG9mIG90aGVycy4KKyoqICAgICAgUHJvZ3JhbXMgdGhhdCBlbmNvZGUgYmluYXJ5IGRhdGEgaW4gQVNDSUkgYXJlIHdyaXR0ZW4gaW4KKyoqICAgICAgc3VjaCBhIHN0eWxlIHRoYXQgdGhleSBhcmUgYXMgdW5yZWFkYWJsZSBhcyBwb3NzaWJsZS4gRGV2aWNlcyB1c2VkCisqKiAgICAgIGluY2x1ZGUgdW5uZWNlc3NhcnkgZ2xvYmFsIHZhcmlhYmxlcywgYnVyeWluZyBpbXBvcnRhbnQgdGFibGVzCisqKiAgICAgIGluIHVucmVsYXRlZCBzb3VyY2VmaWxlcywgcHV0dGluZyBmdW5jdGlvbnMgaW4gaW5jbHVkZSBmaWxlcywKKyoqICAgICAgdXNpbmcgc2VlbWluZ2x5LWRlc2NyaXB0aXZlIHZhcmlhYmxlIG5hbWVzIGZvciBkaWZmZXJlbnQgcHVycG9zZXMsCisqKiAgICAgIGNhbGxzIHRvIGVtcHR5IHN1YnJvdXRpbmVzIGFuZCBhIGhvc3Qgb2Ygb3RoZXJzLgogKioKICoqIEkgaGF2ZSBhdHRlbXB0ZWQgdG8gYnJlYWsgd2l0aCB0aGlzIHRyYWRpdGlvbiwgYnV0IEkgZ3Vlc3MgdGhhdCB0aGF0CiAqKiBkb2VzIG1ha2UgdGhlIHBlcmZvcm1hbmNlIHN1Yi1vcHRpbWFsLiBPaCB3ZWxsLCB0b28gYmFkLi4uCkBAIC03NSw2NyArNzUsNjcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFibGVfYTJiX2hxeFsyNTZdID0gewogLyogICAgICAgXkAgICAgXkEgICAgXkIgICAgXkMgICAgXkQgICAgXkUgICAgXkYgICAgXkcgICAqLwotLyogMCovCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisvKiAwKi8gIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCiAvKiAgICAgICBcYiAgICBcdCAgICBcbiAgICBeSyAgICBeTCAgICBcciAgICBeTiAgICBeTyAgICovCi0vKiAxKi8JRkFJTCwgRkFJTCwgU0tJUCwgRkFJTCwgRkFJTCwgU0tJUCwgRkFJTCwgRkFJTCwKKy8qIDEqLyAgRkFJTCwgRkFJTCwgU0tJUCwgRkFJTCwgRkFJTCwgU0tJUCwgRkFJTCwgRkFJTCwKIC8qICAgICAgIF5QICAgIF5RICAgIF5SICAgIF5TICAgIF5UICAgIF5VICAgIF5WICAgIF5XICAgKi8KLS8qIDIqLwlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorLyogMiovICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgXlggICAgXlkgICAgXlogICAgXlsgICAgXlwgICAgXl0gICAgXl4gICAgXl8gICAqLwotLyogMyovCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisvKiAzKi8gIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCiAvKiAgICAgICAgICAgICAgISAgICAgIiAgICAgIyAgICAgJCAgICAgJSAgICAgJiAgICAgJyAgICovCi0vKiA0Ki8JRkFJTCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKKy8qIDQqLyAgRkFJTCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKIC8qICAgICAgICAoICAgICApICAgICAqICAgICArICAgICAsICAgICAtICAgICAuICAgICAvICAgKi8KLS8qIDUqLwkweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCBGQUlMLCBGQUlMLAorLyogNSovICAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCBGQUlMLCBGQUlMLAogLyogICAgICAgIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgICAqLwotLyogNiovCTB4MEQsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIEZBSUwsCisvKiA2Ki8gIDB4MEQsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIEZBSUwsCiAvKiAgICAgICAgOCAgICAgOSAgICAgOiAgICAgOyAgICAgPCAgICAgPSAgICAgPiAgICAgPyAgICovCi0vKiA3Ki8JMHgxNCwgMHgxNSwgRE9ORSwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKy8qIDcqLyAgMHgxNCwgMHgxNSwgRE9ORSwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKIC8qICAgICAgICBAICAgICBBICAgICBCICAgICBDICAgICBEICAgICBFICAgICBGICAgICBHICAgKi8KLS8qIDgqLwkweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELAorLyogOCovICAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELAogLyogICAgICAgIEggICAgIEkgICAgIEogICAgIEsgICAgIEwgICAgIE0gICAgIE4gICAgIE8gICAqLwotLyogOSovCTB4MUUsIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIEZBSUwsCisvKiA5Ki8gIDB4MUUsIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIEZBSUwsCiAvKiAgICAgICAgUCAgICAgUSAgICAgUiAgICAgUyAgICAgVCAgICAgVSAgICAgViAgICAgVyAgICovCi0vKjEwKi8JMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwgRkFJTCwKKy8qMTAqLyAgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwgRkFJTCwKIC8qICAgICAgICBYICAgICBZICAgICBaICAgICBbICAgICBcICAgICBdICAgICBeICAgICBfICAgKi8KLS8qMTEqLwkweDJDLCAweDJELCAweDJFLCAweDJGLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorLyoxMSovICAweDJDLCAweDJELCAweDJFLCAweDJGLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgIGAgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgIGcgICAqLwotLyoxMiovCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIEZBSUwsCisvKjEyKi8gIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIEZBSUwsCiAvKiAgICAgICAgaCAgICAgaSAgICAgaiAgICAgayAgICAgbCAgICAgbSAgICAgbiAgICAgbyAgICovCi0vKjEzKi8JMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwgMHgzQiwgMHgzQywgRkFJTCwgRkFJTCwKKy8qMTMqLyAgMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwgMHgzQiwgMHgzQywgRkFJTCwgRkFJTCwKIC8qICAgICAgICBwICAgICBxICAgICByICAgICBzICAgICB0ICAgICB1ICAgICB2ICAgICB3ICAgKi8KLS8qMTQqLwkweDNELCAweDNFLCAweDNGLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorLyoxNCovICAweDNELCAweDNFLCAweDNGLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgIHggICAgIHkgICAgIHogICAgIHsgICAgIHwgICAgIH0gICAgIH4gICAgXj8gICAqLwotLyoxNSovCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0vKjE2Ki8JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKy8qMTUqLyAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKy8qMTYqLyAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9ocXhbXSA9CiAiIVwiIyQlJicoKSorLC0wMTIzNDU2ODlAQUJDREVGR0hJSktMTU5QUVJTVFVWWFlaW2BhYmNkZWZoaWprbG1wcXIiOwogCiBzdGF0aWMgY2hhciB0YWJsZV9hMmJfYmFzZTY0W10gPSB7Ci0JLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCi0JLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCi0JLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSw2MiwgLTEsLTEsLTEsNjMsCi0JNTIsNTMsNTQsNTUsIDU2LDU3LDU4LDU5LCA2MCw2MSwtMSwtMSwgLTEsIDAsLTEsLTEsIC8qIE5vdGUgUEFELT4wICovCi0JLTEsIDAsIDEsIDIsICAzLCA0LCA1LCA2LCAgNywgOCwgOSwxMCwgMTEsMTIsMTMsMTQsCi0JMTUsMTYsMTcsMTgsIDE5LDIwLDIxLDIyLCAyMywyNCwyNSwtMSwgLTEsLTEsLTEsLTEsCi0JLTEsMjYsMjcsMjgsIDI5LDMwLDMxLDMyLCAzMywzNCwzNSwzNiwgMzcsMzgsMzksNDAsCi0JNDEsNDIsNDMsNDQsIDQ1LDQ2LDQ3LDQ4LCA0OSw1MCw1MSwtMSwgLTEsLTEsLTEsLTEKKyAgICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLDYyLCAtMSwtMSwtMSw2MywKKyAgICA1Miw1Myw1NCw1NSwgNTYsNTcsNTgsNTksIDYwLDYxLC0xLC0xLCAtMSwgMCwtMSwtMSwgLyogTm90ZSBQQUQtPjAgKi8KKyAgICAtMSwgMCwgMSwgMiwgIDMsIDQsIDUsIDYsICA3LCA4LCA5LDEwLCAxMSwxMiwxMywxNCwKKyAgICAxNSwxNiwxNywxOCwgMTksMjAsMjEsMjIsIDIzLDI0LDI1LC0xLCAtMSwtMSwtMSwtMSwKKyAgICAtMSwyNiwyNywyOCwgMjksMzAsMzEsMzIsIDMzLDM0LDM1LDM2LCAzNywzOCwzOSw0MCwKKyAgICA0MSw0Miw0Myw0NCwgNDUsNDYsNDcsNDgsIDQ5LDUwLDUxLC0xLCAtMSwtMSwtMSwtMQogfTsKIAogI2RlZmluZSBCQVNFNjRfUEFEICc9JwpAQCAtMTQ5LDM4ICsxNDksMzggQEAKIAogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgY3JjdGFiX2hxeFsyNTZdID0gewotCTB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwYTUsIDB4NjBjNiwgMHg3MGU3LAotCTB4ODEwOCwgMHg5MTI5LCAweGExNGEsIDB4YjE2YiwgMHhjMThjLCAweGQxYWQsIDB4ZTFjZSwgMHhmMWVmLAotCTB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MmI1LCAweDQyOTQsIDB4NzJmNywgMHg2MmQ2LAotCTB4OTMzOSwgMHg4MzE4LCAweGIzN2IsIDB4YTM1YSwgMHhkM2JkLCAweGMzOWMsIDB4ZjNmZiwgMHhlM2RlLAotCTB4MjQ2MiwgMHgzNDQzLCAweDA0MjAsIDB4MTQwMSwgMHg2NGU2LCAweDc0YzcsIDB4NDRhNCwgMHg1NDg1LAotCTB4YTU2YSwgMHhiNTRiLCAweDg1MjgsIDB4OTUwOSwgMHhlNWVlLCAweGY1Y2YsIDB4YzVhYywgMHhkNThkLAotCTB4MzY1MywgMHgyNjcyLCAweDE2MTEsIDB4MDYzMCwgMHg3NmQ3LCAweDY2ZjYsIDB4NTY5NSwgMHg0NmI0LAotCTB4Yjc1YiwgMHhhNzdhLCAweDk3MTksIDB4ODczOCwgMHhmN2RmLCAweGU3ZmUsIDB4ZDc5ZCwgMHhjN2JjLAotCTB4NDhjNCwgMHg1OGU1LCAweDY4ODYsIDB4NzhhNywgMHgwODQwLCAweDE4NjEsIDB4MjgwMiwgMHgzODIzLAotCTB4YzljYywgMHhkOWVkLCAweGU5OGUsIDB4ZjlhZiwgMHg4OTQ4LCAweDk5NjksIDB4YTkwYSwgMHhiOTJiLAotCTB4NWFmNSwgMHg0YWQ0LCAweDdhYjcsIDB4NmE5NiwgMHgxYTcxLCAweDBhNTAsIDB4M2EzMywgMHgyYTEyLAotCTB4ZGJmZCwgMHhjYmRjLCAweGZiYmYsIDB4ZWI5ZSwgMHg5Yjc5LCAweDhiNTgsIDB4YmIzYiwgMHhhYjFhLAotCTB4NmNhNiwgMHg3Yzg3LCAweDRjZTQsIDB4NWNjNSwgMHgyYzIyLCAweDNjMDMsIDB4MGM2MCwgMHgxYzQxLAotCTB4ZWRhZSwgMHhmZDhmLCAweGNkZWMsIDB4ZGRjZCwgMHhhZDJhLCAweGJkMGIsIDB4OGQ2OCwgMHg5ZDQ5LAotCTB4N2U5NywgMHg2ZWI2LCAweDVlZDUsIDB4NGVmNCwgMHgzZTEzLCAweDJlMzIsIDB4MWU1MSwgMHgwZTcwLAotCTB4ZmY5ZiwgMHhlZmJlLCAweGRmZGQsIDB4Y2ZmYywgMHhiZjFiLCAweGFmM2EsIDB4OWY1OSwgMHg4Zjc4LAotCTB4OTE4OCwgMHg4MWE5LCAweGIxY2EsIDB4YTFlYiwgMHhkMTBjLCAweGMxMmQsIDB4ZjE0ZSwgMHhlMTZmLAotCTB4MTA4MCwgMHgwMGExLCAweDMwYzIsIDB4MjBlMywgMHg1MDA0LCAweDQwMjUsIDB4NzA0NiwgMHg2MDY3LAotCTB4ODNiOSwgMHg5Mzk4LCAweGEzZmIsIDB4YjNkYSwgMHhjMzNkLCAweGQzMWMsIDB4ZTM3ZiwgMHhmMzVlLAotCTB4MDJiMSwgMHgxMjkwLCAweDIyZjMsIDB4MzJkMiwgMHg0MjM1LCAweDUyMTQsIDB4NjI3NywgMHg3MjU2LAotCTB4YjVlYSwgMHhhNWNiLCAweDk1YTgsIDB4ODU4OSwgMHhmNTZlLCAweGU1NGYsIDB4ZDUyYywgMHhjNTBkLAotCTB4MzRlMiwgMHgyNGMzLCAweDE0YTAsIDB4MDQ4MSwgMHg3NDY2LCAweDY0NDcsIDB4NTQyNCwgMHg0NDA1LAotCTB4YTdkYiwgMHhiN2ZhLCAweDg3OTksIDB4OTdiOCwgMHhlNzVmLCAweGY3N2UsIDB4YzcxZCwgMHhkNzNjLAotCTB4MjZkMywgMHgzNmYyLCAweDA2OTEsIDB4MTZiMCwgMHg2NjU3LCAweDc2NzYsIDB4NDYxNSwgMHg1NjM0LAotCTB4ZDk0YywgMHhjOTZkLCAweGY5MGUsIDB4ZTkyZiwgMHg5OWM4LCAweDg5ZTksIDB4Yjk4YSwgMHhhOWFiLAotCTB4NTg0NCwgMHg0ODY1LCAweDc4MDYsIDB4NjgyNywgMHgxOGMwLCAweDA4ZTEsIDB4Mzg4MiwgMHgyOGEzLAotCTB4Y2I3ZCwgMHhkYjVjLCAweGViM2YsIDB4ZmIxZSwgMHg4YmY5LCAweDliZDgsIDB4YWJiYiwgMHhiYjlhLAotCTB4NGE3NSwgMHg1YTU0LCAweDZhMzcsIDB4N2ExNiwgMHgwYWYxLCAweDFhZDAsIDB4MmFiMywgMHgzYTkyLAotCTB4ZmQyZSwgMHhlZDBmLCAweGRkNmMsIDB4Y2Q0ZCwgMHhiZGFhLCAweGFkOGIsIDB4OWRlOCwgMHg4ZGM5LAotCTB4N2MyNiwgMHg2YzA3LCAweDVjNjQsIDB4NGM0NSwgMHgzY2EyLCAweDJjODMsIDB4MWNlMCwgMHgwY2MxLAotCTB4ZWYxZiwgMHhmZjNlLCAweGNmNWQsIDB4ZGY3YywgMHhhZjliLCAweGJmYmEsIDB4OGZkOSwgMHg5ZmY4LAotCTB4NmUxNywgMHg3ZTM2LCAweDRlNTUsIDB4NWU3NCwgMHgyZTkzLCAweDNlYjIsIDB4MGVkMSwgMHgxZWYwLAorICAgIDB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwYTUsIDB4NjBjNiwgMHg3MGU3LAorICAgIDB4ODEwOCwgMHg5MTI5LCAweGExNGEsIDB4YjE2YiwgMHhjMThjLCAweGQxYWQsIDB4ZTFjZSwgMHhmMWVmLAorICAgIDB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MmI1LCAweDQyOTQsIDB4NzJmNywgMHg2MmQ2LAorICAgIDB4OTMzOSwgMHg4MzE4LCAweGIzN2IsIDB4YTM1YSwgMHhkM2JkLCAweGMzOWMsIDB4ZjNmZiwgMHhlM2RlLAorICAgIDB4MjQ2MiwgMHgzNDQzLCAweDA0MjAsIDB4MTQwMSwgMHg2NGU2LCAweDc0YzcsIDB4NDRhNCwgMHg1NDg1LAorICAgIDB4YTU2YSwgMHhiNTRiLCAweDg1MjgsIDB4OTUwOSwgMHhlNWVlLCAweGY1Y2YsIDB4YzVhYywgMHhkNThkLAorICAgIDB4MzY1MywgMHgyNjcyLCAweDE2MTEsIDB4MDYzMCwgMHg3NmQ3LCAweDY2ZjYsIDB4NTY5NSwgMHg0NmI0LAorICAgIDB4Yjc1YiwgMHhhNzdhLCAweDk3MTksIDB4ODczOCwgMHhmN2RmLCAweGU3ZmUsIDB4ZDc5ZCwgMHhjN2JjLAorICAgIDB4NDhjNCwgMHg1OGU1LCAweDY4ODYsIDB4NzhhNywgMHgwODQwLCAweDE4NjEsIDB4MjgwMiwgMHgzODIzLAorICAgIDB4YzljYywgMHhkOWVkLCAweGU5OGUsIDB4ZjlhZiwgMHg4OTQ4LCAweDk5NjksIDB4YTkwYSwgMHhiOTJiLAorICAgIDB4NWFmNSwgMHg0YWQ0LCAweDdhYjcsIDB4NmE5NiwgMHgxYTcxLCAweDBhNTAsIDB4M2EzMywgMHgyYTEyLAorICAgIDB4ZGJmZCwgMHhjYmRjLCAweGZiYmYsIDB4ZWI5ZSwgMHg5Yjc5LCAweDhiNTgsIDB4YmIzYiwgMHhhYjFhLAorICAgIDB4NmNhNiwgMHg3Yzg3LCAweDRjZTQsIDB4NWNjNSwgMHgyYzIyLCAweDNjMDMsIDB4MGM2MCwgMHgxYzQxLAorICAgIDB4ZWRhZSwgMHhmZDhmLCAweGNkZWMsIDB4ZGRjZCwgMHhhZDJhLCAweGJkMGIsIDB4OGQ2OCwgMHg5ZDQ5LAorICAgIDB4N2U5NywgMHg2ZWI2LCAweDVlZDUsIDB4NGVmNCwgMHgzZTEzLCAweDJlMzIsIDB4MWU1MSwgMHgwZTcwLAorICAgIDB4ZmY5ZiwgMHhlZmJlLCAweGRmZGQsIDB4Y2ZmYywgMHhiZjFiLCAweGFmM2EsIDB4OWY1OSwgMHg4Zjc4LAorICAgIDB4OTE4OCwgMHg4MWE5LCAweGIxY2EsIDB4YTFlYiwgMHhkMTBjLCAweGMxMmQsIDB4ZjE0ZSwgMHhlMTZmLAorICAgIDB4MTA4MCwgMHgwMGExLCAweDMwYzIsIDB4MjBlMywgMHg1MDA0LCAweDQwMjUsIDB4NzA0NiwgMHg2MDY3LAorICAgIDB4ODNiOSwgMHg5Mzk4LCAweGEzZmIsIDB4YjNkYSwgMHhjMzNkLCAweGQzMWMsIDB4ZTM3ZiwgMHhmMzVlLAorICAgIDB4MDJiMSwgMHgxMjkwLCAweDIyZjMsIDB4MzJkMiwgMHg0MjM1LCAweDUyMTQsIDB4NjI3NywgMHg3MjU2LAorICAgIDB4YjVlYSwgMHhhNWNiLCAweDk1YTgsIDB4ODU4OSwgMHhmNTZlLCAweGU1NGYsIDB4ZDUyYywgMHhjNTBkLAorICAgIDB4MzRlMiwgMHgyNGMzLCAweDE0YTAsIDB4MDQ4MSwgMHg3NDY2LCAweDY0NDcsIDB4NTQyNCwgMHg0NDA1LAorICAgIDB4YTdkYiwgMHhiN2ZhLCAweDg3OTksIDB4OTdiOCwgMHhlNzVmLCAweGY3N2UsIDB4YzcxZCwgMHhkNzNjLAorICAgIDB4MjZkMywgMHgzNmYyLCAweDA2OTEsIDB4MTZiMCwgMHg2NjU3LCAweDc2NzYsIDB4NDYxNSwgMHg1NjM0LAorICAgIDB4ZDk0YywgMHhjOTZkLCAweGY5MGUsIDB4ZTkyZiwgMHg5OWM4LCAweDg5ZTksIDB4Yjk4YSwgMHhhOWFiLAorICAgIDB4NTg0NCwgMHg0ODY1LCAweDc4MDYsIDB4NjgyNywgMHgxOGMwLCAweDA4ZTEsIDB4Mzg4MiwgMHgyOGEzLAorICAgIDB4Y2I3ZCwgMHhkYjVjLCAweGViM2YsIDB4ZmIxZSwgMHg4YmY5LCAweDliZDgsIDB4YWJiYiwgMHhiYjlhLAorICAgIDB4NGE3NSwgMHg1YTU0LCAweDZhMzcsIDB4N2ExNiwgMHgwYWYxLCAweDFhZDAsIDB4MmFiMywgMHgzYTkyLAorICAgIDB4ZmQyZSwgMHhlZDBmLCAweGRkNmMsIDB4Y2Q0ZCwgMHhiZGFhLCAweGFkOGIsIDB4OWRlOCwgMHg4ZGM5LAorICAgIDB4N2MyNiwgMHg2YzA3LCAweDVjNjQsIDB4NGM0NSwgMHgzY2EyLCAweDJjODMsIDB4MWNlMCwgMHgwY2MxLAorICAgIDB4ZWYxZiwgMHhmZjNlLCAweGNmNWQsIDB4ZGY3YywgMHhhZjliLCAweGJmYmEsIDB4OGZkOSwgMHg5ZmY4LAorICAgIDB4NmUxNywgMHg3ZTM2LCAweDRlNTUsIDB4NWU3NCwgMHgyZTkzLCAweDNlYjIsIDB4MGVkMSwgMHgxZWYwLAogfTsKIAogUHlEb2NfU1RSVkFSKGRvY19hMmJfdXUsICIoYXNjaWkpIC0+IGJpbi4gRGVjb2RlIGEgbGluZSBvZiB1dWVuY29kZWQgZGF0YSIpOwpAQCAtMTg4LDg1ICsxODgsODUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9hMmJfdXUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYXNjaWk7Ci0JdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOwotCWludCBsZWZ0Yml0cyA9IDA7Ci0JdW5zaWduZWQgY2hhciB0aGlzX2NoOwotCXVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCVB5X3NzaXplX3QgYXNjaWlfbGVuLCBiaW5fbGVuOworICAgIFB5X2J1ZmZlciBwYXNjaWk7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGludCBsZWZ0Yml0cyA9IDA7CisgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOworICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7CisgICAgUHlPYmplY3QgKnJ2OworICAgIFB5X3NzaXplX3QgYXNjaWlfbGVuLCBiaW5fbGVuOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6YTJiX3V1IiwgJnBhc2NpaSkgKQotCQlyZXR1cm4gTlVMTDsKLQlhc2NpaV9kYXRhID0gcGFzY2lpLmJ1ZjsKLQlhc2NpaV9sZW4gPSBwYXNjaWkubGVuOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOmEyYl91dSIsICZwYXNjaWkpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNjaWlfZGF0YSA9IHBhc2NpaS5idWY7CisgICAgYXNjaWlfbGVuID0gcGFzY2lpLmxlbjsKIAotCWFzc2VydChhc2NpaV9sZW4gPj0gMCk7CisgICAgYXNzZXJ0KGFzY2lpX2xlbiA+PSAwKTsKIAotCS8qIEZpcnN0IGJ5dGU6IGJpbmFyeSBkYXRhIGxlbmd0aCAoaW4gYnl0ZXMpICovCi0JYmluX2xlbiA9ICgqYXNjaWlfZGF0YSsrIC0gJyAnKSAmIDA3NzsKLQlhc2NpaV9sZW4tLTsKKyAgICAvKiBGaXJzdCBieXRlOiBiaW5hcnkgZGF0YSBsZW5ndGggKGluIGJ5dGVzKSAqLworICAgIGJpbl9sZW4gPSAoKmFzY2lpX2RhdGErKyAtICcgJykgJiAwNzc7CisgICAgYXNjaWlfbGVuLS07CiAKLQkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCi0JaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYmluX2xlbikpID09IE5VTEwgKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBhc2NpaSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQliaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KTsKKyAgICAvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCisgICAgaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYmluX2xlbikpID09IE5VTEwgKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhc2NpaSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KTsKIAotCWZvciggOyBiaW5fbGVuID4gMCA7IGFzY2lpX2xlbi0tLCBhc2NpaV9kYXRhKysgKSB7Ci0JCS8qIFhYWCBpcyBpdCByZWFsbHkgYmVzdCB0byBhZGQgTlVMcyBpZiB0aGVyZSdzIG5vIG1vcmUgZGF0YSAqLwotCQl0aGlzX2NoID0gKGFzY2lpX2xlbiA+IDApID8gKmFzY2lpX2RhdGEgOiAwOwotCQlpZiAoIHRoaXNfY2ggPT0gJ1xuJyB8fCB0aGlzX2NoID09ICdccicgfHwgYXNjaWlfbGVuIDw9IDApIHsKLQkJCS8qCi0JCQkqKiBXaGl0ZXNwYWNlLiBBc3N1bWUgc29tZSBzcGFjZXMgZ290IGVhdGVuIGF0Ci0JCQkqKiBlbmQtb2YtbGluZS4gKFdlIGNoZWNrIHRoaXMgbGF0ZXIpCi0JCQkqLwotCQkJdGhpc19jaCA9IDA7Ci0JICAgICAgICB9IGVsc2UgewotCQkJLyogQ2hlY2sgdGhlIGNoYXJhY3RlciBmb3IgbGVnYWxpdHkKLQkJCSoqIFRoZSA2NCBpbiBzdGVhZCBvZiB0aGUgZXhwZWN0ZWQgNjMgaXMgYmVjYXVzZQotCQkJKiogdGhlcmUgYXJlIGEgZmV3IHV1ZW5jb2RlcyBvdXQgdGhlcmUgdGhhdCB1c2UKLQkJCSoqICdgJyBhcyB6ZXJvIGluc3RlYWQgb2Ygc3BhY2UuCi0JCQkqLwotCQkJaWYgKCB0aGlzX2NoIDwgJyAnIHx8IHRoaXNfY2ggPiAoJyAnICsgNjQpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSWxsZWdhbCBjaGFyIik7Ci0JCQkJUHlCdWZmZXJfUmVsZWFzZSgmcGFzY2lpKTsKLQkJCQlQeV9ERUNSRUYocnYpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJdGhpc19jaCA9ICh0aGlzX2NoIC0gJyAnKSAmIDA3NzsKLQkJfQotCQkvKgotCQkqKiBTaGlmdCBpdCBpbiBvbiB0aGUgbG93IGVuZCwgYW5kIHNlZSBpZiB0aGVyZSdzCi0JCSoqIGEgYnl0ZSByZWFkeSBmb3Igb3V0cHV0LgotCQkqLwotCQlsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA2KSB8ICh0aGlzX2NoKTsKLQkJbGVmdGJpdHMgKz0gNjsKLQkJaWYgKCBsZWZ0Yml0cyA+PSA4ICkgewotCQkJbGVmdGJpdHMgLT0gODsKLQkJCSpiaW5fZGF0YSsrID0gKGxlZnRjaGFyID4+IGxlZnRiaXRzKSAmIDB4ZmY7Ci0JCQlsZWZ0Y2hhciAmPSAoKDEgPDwgbGVmdGJpdHMpIC0gMSk7Ci0JCQliaW5fbGVuLS07Ci0JCX0KLQl9Ci0JLyoKLQkqKiBGaW5hbGx5LCBjaGVjayB0aGF0IGlmIHRoZXJlJ3MgYW55dGhpbmcgbGVmdCBvbiB0aGUgbGluZQotCSoqIHRoYXQgaXQncyB3aGl0ZXNwYWNlIG9ubHkuCi0JKi8KLQl3aGlsZSggYXNjaWlfbGVuLS0gPiAwICkgewotCQl0aGlzX2NoID0gKmFzY2lpX2RhdGErKzsKLQkJLyogRXh0cmEgJ2AnIG1heSBiZSB3cml0dGVuIGFzIHBhZGRpbmcgaW4gc29tZSBjYXNlcyAqLwotCQlpZiAoIHRoaXNfY2ggIT0gJyAnICYmIHRoaXNfY2ggIT0gJyAnKzY0ICYmCi0JCSAgICAgdGhpc19jaCAhPSAnXG4nICYmIHRoaXNfY2ggIT0gJ1xyJyApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhFcnJvciwgIlRyYWlsaW5nIGdhcmJhZ2UiKTsKLQkJCVB5QnVmZmVyX1JlbGVhc2UoJnBhc2NpaSk7Ci0JCQlQeV9ERUNSRUYocnYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGFzY2lpKTsKLQlyZXR1cm4gcnY7CisgICAgZm9yKCA7IGJpbl9sZW4gPiAwIDsgYXNjaWlfbGVuLS0sIGFzY2lpX2RhdGErKyApIHsKKyAgICAgICAgLyogWFhYIGlzIGl0IHJlYWxseSBiZXN0IHRvIGFkZCBOVUxzIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhICovCisgICAgICAgIHRoaXNfY2ggPSAoYXNjaWlfbGVuID4gMCkgPyAqYXNjaWlfZGF0YSA6IDA7CisgICAgICAgIGlmICggdGhpc19jaCA9PSAnXG4nIHx8IHRoaXNfY2ggPT0gJ1xyJyB8fCBhc2NpaV9sZW4gPD0gMCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICoqIFdoaXRlc3BhY2UuIEFzc3VtZSBzb21lIHNwYWNlcyBnb3QgZWF0ZW4gYXQKKyAgICAgICAgICAgICoqIGVuZC1vZi1saW5lLiAoV2UgY2hlY2sgdGhpcyBsYXRlcikKKyAgICAgICAgICAgICovCisgICAgICAgICAgICB0aGlzX2NoID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIENoZWNrIHRoZSBjaGFyYWN0ZXIgZm9yIGxlZ2FsaXR5CisgICAgICAgICAgICAqKiBUaGUgNjQgaW4gc3RlYWQgb2YgdGhlIGV4cGVjdGVkIDYzIGlzIGJlY2F1c2UKKyAgICAgICAgICAgICoqIHRoZXJlIGFyZSBhIGZldyB1dWVuY29kZXMgb3V0IHRoZXJlIHRoYXQgdXNlCisgICAgICAgICAgICAqKiAnYCcgYXMgemVybyBpbnN0ZWFkIG9mIHNwYWNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggdGhpc19jaCA8ICcgJyB8fCB0aGlzX2NoID4gKCcgJyArIDY0KSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIklsbGVnYWwgY2hhciIpOworICAgICAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhc2NpaSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXNfY2ggPSAodGhpc19jaCAtICcgJykgJiAwNzc7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgKiogU2hpZnQgaXQgaW4gb24gdGhlIGxvdyBlbmQsIGFuZCBzZWUgaWYgdGhlcmUncworICAgICAgICAqKiBhIGJ5dGUgcmVhZHkgZm9yIG91dHB1dC4KKyAgICAgICAgKi8KKyAgICAgICAgbGVmdGNoYXIgPSAobGVmdGNoYXIgPDwgNikgfCAodGhpc19jaCk7CisgICAgICAgIGxlZnRiaXRzICs9IDY7CisgICAgICAgIGlmICggbGVmdGJpdHMgPj0gOCApIHsKKyAgICAgICAgICAgIGxlZnRiaXRzIC09IDg7CisgICAgICAgICAgICAqYmluX2RhdGErKyA9IChsZWZ0Y2hhciA+PiBsZWZ0Yml0cykgJiAweGZmOworICAgICAgICAgICAgbGVmdGNoYXIgJj0gKCgxIDw8IGxlZnRiaXRzKSAtIDEpOworICAgICAgICAgICAgYmluX2xlbi0tOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgKiogRmluYWxseSwgY2hlY2sgdGhhdCBpZiB0aGVyZSdzIGFueXRoaW5nIGxlZnQgb24gdGhlIGxpbmUKKyAgICAqKiB0aGF0IGl0J3Mgd2hpdGVzcGFjZSBvbmx5LgorICAgICovCisgICAgd2hpbGUoIGFzY2lpX2xlbi0tID4gMCApIHsKKyAgICAgICAgdGhpc19jaCA9ICphc2NpaV9kYXRhKys7CisgICAgICAgIC8qIEV4dHJhICdgJyBtYXkgYmUgd3JpdHRlbiBhcyBwYWRkaW5nIGluIHNvbWUgY2FzZXMgKi8KKyAgICAgICAgaWYgKCB0aGlzX2NoICE9ICcgJyAmJiB0aGlzX2NoICE9ICcgJys2NCAmJgorICAgICAgICAgICAgIHRoaXNfY2ggIT0gJ1xuJyAmJiB0aGlzX2NoICE9ICdccicgKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJUcmFpbGluZyBnYXJiYWdlIik7CisgICAgICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYXNjaWkpOworICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhc2NpaSk7CisgICAgcmV0dXJuIHJ2OwogfQogCiBQeURvY19TVFJWQVIoZG9jX2IyYV91dSwgIihiaW4pIC0+IGFzY2lpLiBVdWVuY29kZSBsaW5lIG9mIGRhdGEiKTsKQEAgLTI3NCw4NiArMjc0LDg2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXNjaWlfYjJhX3V1KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJpbjsKLQl1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7Ci0JaW50IGxlZnRiaXRzID0gMDsKLQl1bnNpZ25lZCBjaGFyIHRoaXNfY2g7Ci0JdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JUHlfc3NpemVfdCBiaW5fbGVuOworICAgIFB5X2J1ZmZlciBwYmluOworICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKKyAgICBpbnQgbGVmdGJpdHMgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKKyAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBQeV9zc2l6ZV90IGJpbl9sZW47CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpiMmFfdXUiLCAmcGJpbikgKQotCQlyZXR1cm4gTlVMTDsKLQliaW5fZGF0YSA9IHBiaW4uYnVmOwotCWJpbl9sZW4gPSBwYmluLmxlbjsKLQlpZiAoIGJpbl9sZW4gPiA0NSApIHsKLQkJLyogVGhlIDQ1IGlzIGEgbGltaXQgdGhhdCBhcHBlYXJzIGluIGFsbCB1dWVuY29kZSdzICovCi0JCVB5RXJyX1NldFN0cmluZyhFcnJvciwgIkF0IG1vc3QgNDUgYnl0ZXMgYXQgb25jZSIpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYmluKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOmIyYV91dSIsICZwYmluKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJpbl9kYXRhID0gcGJpbi5idWY7CisgICAgYmluX2xlbiA9IHBiaW4ubGVuOworICAgIGlmICggYmluX2xlbiA+IDQ1ICkgeworICAgICAgICAvKiBUaGUgNDUgaXMgYSBsaW1pdCB0aGF0IGFwcGVhcnMgaW4gYWxsIHV1ZW5jb2RlJ3MgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiQXQgbW9zdCA0NSBieXRlcyBhdCBvbmNlIik7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBiaW4pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBXZSdyZSBsYXp5IGFuZCBhbGxvY2F0ZSB0byBtdWNoIChmaXhlZCB1cCBsYXRlcikgKi8KLQlpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAyICsgKGJpbl9sZW4rMikvMyo0KSkgPT0gTlVMTCApIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGJpbik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhc2NpaV9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpOworICAgIC8qIFdlJ3JlIGxhenkgYW5kIGFsbG9jYXRlIHRvIG11Y2ggKGZpeGVkIHVwIGxhdGVyKSAqLworICAgIGlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDIgKyAoYmluX2xlbisyKS8zKjQpKSA9PSBOVUxMICkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYmluKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhydik7CiAKLQkvKiBTdG9yZSB0aGUgbGVuZ3RoICovCi0JKmFzY2lpX2RhdGErKyA9ICcgJyArIChiaW5fbGVuICYgMDc3KTsKKyAgICAvKiBTdG9yZSB0aGUgbGVuZ3RoICovCisgICAgKmFzY2lpX2RhdGErKyA9ICcgJyArIChiaW5fbGVuICYgMDc3KTsKIAotCWZvciggOyBiaW5fbGVuID4gMCB8fCBsZWZ0Yml0cyAhPSAwIDsgYmluX2xlbi0tLCBiaW5fZGF0YSsrICkgewotCQkvKiBTaGlmdCB0aGUgZGF0YSAob3IgcGFkZGluZykgaW50byBvdXIgYnVmZmVyICovCi0JCWlmICggYmluX2xlbiA+IDAgKQkvKiBEYXRhICovCi0JCQlsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA4KSB8ICpiaW5fZGF0YTsKLQkJZWxzZQkJCS8qIFBhZGRpbmcgKi8KLQkJCWxlZnRjaGFyIDw8PSA4OwotCQlsZWZ0Yml0cyArPSA4OworICAgIGZvciggOyBiaW5fbGVuID4gMCB8fCBsZWZ0Yml0cyAhPSAwIDsgYmluX2xlbi0tLCBiaW5fZGF0YSsrICkgeworICAgICAgICAvKiBTaGlmdCB0aGUgZGF0YSAob3IgcGFkZGluZykgaW50byBvdXIgYnVmZmVyICovCisgICAgICAgIGlmICggYmluX2xlbiA+IDAgKSAgICAgICAgICAgICAgLyogRGF0YSAqLworICAgICAgICAgICAgbGVmdGNoYXIgPSAobGVmdGNoYXIgPDwgOCkgfCAqYmluX2RhdGE7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFkZGluZyAqLworICAgICAgICAgICAgbGVmdGNoYXIgPDw9IDg7CisgICAgICAgIGxlZnRiaXRzICs9IDg7CiAKLQkJLyogU2VlIGlmIHRoZXJlIGFyZSA2LWJpdCBncm91cHMgcmVhZHkgKi8KLQkJd2hpbGUgKCBsZWZ0Yml0cyA+PSA2ICkgewotCQkJdGhpc19jaCA9IChsZWZ0Y2hhciA+PiAobGVmdGJpdHMtNikpICYgMHgzZjsKLQkJCWxlZnRiaXRzIC09IDY7Ci0JCQkqYXNjaWlfZGF0YSsrID0gdGhpc19jaCArICcgJzsKLQkJfQotCX0KLQkqYXNjaWlfZGF0YSsrID0gJ1xuJzsJLyogQXBwZW5kIGEgY291cnRlc3kgbmV3bGluZSAqLworICAgICAgICAvKiBTZWUgaWYgdGhlcmUgYXJlIDYtYml0IGdyb3VwcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoIGxlZnRiaXRzID49IDYgKSB7CisgICAgICAgICAgICB0aGlzX2NoID0gKGxlZnRjaGFyID4+IChsZWZ0Yml0cy02KSkgJiAweDNmOworICAgICAgICAgICAgbGVmdGJpdHMgLT0gNjsKKyAgICAgICAgICAgICphc2NpaV9kYXRhKysgPSB0aGlzX2NoICsgJyAnOworICAgICAgICB9CisgICAgfQorICAgICphc2NpaV9kYXRhKysgPSAnXG4nOyAgICAgICAvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCiAKLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0JCVB5X0RFQ1JFRihydik7Ci0JCXJ2ID0gTlVMTDsKLQl9Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJpbik7Ci0JcmV0dXJuIHJ2OworICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZydiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGFzY2lpX2RhdGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpKSkgPCAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJ2ID0gTlVMTDsKKyAgICB9CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJpbik7CisgICAgcmV0dXJuIHJ2OwogfQogCiAKIHN0YXRpYyBpbnQKIGJpbmFzY2lpX2ZpbmRfdmFsaWQodW5zaWduZWQgY2hhciAqcywgUHlfc3NpemVfdCBzbGVuLCBpbnQgbnVtKQogewotCS8qIEZpbmRzICYgcmV0dXJucyB0aGUgKG51bSsxKXRoCi0JKiogdmFsaWQgY2hhcmFjdGVyIGZvciBiYXNlNjQsIG9yIC0xIGlmIG5vbmUuCi0JKi8KKyAgICAvKiBGaW5kcyAmIHJldHVybnMgdGhlIChudW0rMSl0aAorICAgICoqIHZhbGlkIGNoYXJhY3RlciBmb3IgYmFzZTY0LCBvciAtMSBpZiBub25lLgorICAgICovCiAKLQlpbnQgcmV0ID0gLTE7Ci0JdW5zaWduZWQgY2hhciBjLCBiNjR2YWw7CisgICAgaW50IHJldCA9IC0xOworICAgIHVuc2lnbmVkIGNoYXIgYywgYjY0dmFsOwogCi0Jd2hpbGUgKChzbGVuID4gMCkgJiYgKHJldCA9PSAtMSkpIHsKLQkJYyA9ICpzOwotCQliNjR2YWwgPSB0YWJsZV9hMmJfYmFzZTY0W2MgJiAweDdmXTsKLQkJaWYgKCAoKGMgPD0gMHg3ZikgJiYgKGI2NHZhbCAhPSAodW5zaWduZWQgY2hhciktMSkpICkgewotCQkJaWYgKG51bSA9PSAwKQotCQkJCXJldCA9ICpzOwotCQkJbnVtLS07Ci0JCX0KKyAgICB3aGlsZSAoKHNsZW4gPiAwKSAmJiAocmV0ID09IC0xKSkgeworICAgICAgICBjID0gKnM7CisgICAgICAgIGI2NHZhbCA9IHRhYmxlX2EyYl9iYXNlNjRbYyAmIDB4N2ZdOworICAgICAgICBpZiAoICgoYyA8PSAweDdmKSAmJiAoYjY0dmFsICE9ICh1bnNpZ25lZCBjaGFyKS0xKSkgKSB7CisgICAgICAgICAgICBpZiAobnVtID09IDApCisgICAgICAgICAgICAgICAgcmV0ID0gKnM7CisgICAgICAgICAgICBudW0tLTsKKyAgICAgICAgfQogCi0JCXMrKzsKLQkJc2xlbi0tOwotCX0KLQlyZXR1cm4gcmV0OworICAgICAgICBzKys7CisgICAgICAgIHNsZW4tLTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19hMmJfYmFzZTY0LCAiKGFzY2lpKSAtPiBiaW4uIERlY29kZSBhIGxpbmUgb2YgYmFzZTY0IGRhdGEiKTsKQEAgLTM2MSwxMDggKzM2MSwxMDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9hMmJfYmFzZTY0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGFzY2lpOwotCXVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKLQlpbnQgbGVmdGJpdHMgPSAwOwotCXVuc2lnbmVkIGNoYXIgdGhpc19jaDsKLQl1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotCVB5T2JqZWN0ICpydjsKLQlQeV9zc2l6ZV90IGFzY2lpX2xlbiwgYmluX2xlbjsKLQlpbnQgcXVhZF9wb3MgPSAwOworICAgIFB5X2J1ZmZlciBwYXNjaWk7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGludCBsZWZ0Yml0cyA9IDA7CisgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOworICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7CisgICAgUHlPYmplY3QgKnJ2OworICAgIFB5X3NzaXplX3QgYXNjaWlfbGVuLCBiaW5fbGVuOworICAgIGludCBxdWFkX3BvcyA9IDA7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjphMmJfYmFzZTY0IiwgJnBhc2NpaSkgKQotCQlyZXR1cm4gTlVMTDsKLQlhc2NpaV9kYXRhID0gcGFzY2lpLmJ1ZjsKLQlhc2NpaV9sZW4gPSBwYXNjaWkubGVuOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOmEyYl9iYXNlNjQiLCAmcGFzY2lpKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzY2lpX2RhdGEgPSBwYXNjaWkuYnVmOworICAgIGFzY2lpX2xlbiA9IHBhc2NpaS5sZW47CiAKLQlhc3NlcnQoYXNjaWlfbGVuID49IDApOworICAgIGFzc2VydChhc2NpaV9sZW4gPj0gMCk7CiAKLQlpZiAoYXNjaWlfbGVuID4gUFlfU1NJWkVfVF9NQVggLSAzKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBhc2NpaSk7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KKyAgICBpZiAoYXNjaWlfbGVuID4gUFlfU1NJWkVfVF9NQVggLSAzKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhc2NpaSk7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KIAotCWJpbl9sZW4gPSAoKGFzY2lpX2xlbiszKS80KSozOyAvKiBVcHBlciBib3VuZCwgY29ycmVjdGVkIGxhdGVyICovCisgICAgYmluX2xlbiA9ICgoYXNjaWlfbGVuKzMpLzQpKjM7IC8qIFVwcGVyIGJvdW5kLCBjb3JyZWN0ZWQgbGF0ZXIgKi8KIAotCS8qIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KLQlpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKSkgPT0gTlVMTCApIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGFzY2lpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJpbl9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpOwotCWJpbl9sZW4gPSAwOworICAgIC8qIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KKyAgICBpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKSkgPT0gTlVMTCApIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGFzY2lpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGJpbl9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpOworICAgIGJpbl9sZW4gPSAwOwogCi0JZm9yKCA7IGFzY2lpX2xlbiA+IDA7IGFzY2lpX2xlbi0tLCBhc2NpaV9kYXRhKyspIHsKLQkJdGhpc19jaCA9ICphc2NpaV9kYXRhOworICAgIGZvciggOyBhc2NpaV9sZW4gPiAwOyBhc2NpaV9sZW4tLSwgYXNjaWlfZGF0YSsrKSB7CisgICAgICAgIHRoaXNfY2ggPSAqYXNjaWlfZGF0YTsKIAotCQlpZiAodGhpc19jaCA+IDB4N2YgfHwKLQkJICAgIHRoaXNfY2ggPT0gJ1xyJyB8fCB0aGlzX2NoID09ICdcbicgfHwgdGhpc19jaCA9PSAnICcpCi0JCQljb250aW51ZTsKKyAgICAgICAgaWYgKHRoaXNfY2ggPiAweDdmIHx8CisgICAgICAgICAgICB0aGlzX2NoID09ICdccicgfHwgdGhpc19jaCA9PSAnXG4nIHx8IHRoaXNfY2ggPT0gJyAnKQorICAgICAgICAgICAgY29udGludWU7CiAKLQkJLyogQ2hlY2sgZm9yIHBhZCBzZXF1ZW5jZXMgYW5kIGlnbm9yZQotCQkqKiB0aGUgaW52YWxpZCBvbmVzLgotCQkqLwotCQlpZiAodGhpc19jaCA9PSBCQVNFNjRfUEFEKSB7Ci0JCQlpZiAoIChxdWFkX3BvcyA8IDIpIHx8Ci0JCQkgICAgICgocXVhZF9wb3MgPT0gMikgJiYKLQkJCSAgICAgIChiaW5hc2NpaV9maW5kX3ZhbGlkKGFzY2lpX2RhdGEsIGFzY2lpX2xlbiwgMSkKLQkJCSAgICAgICAhPSBCQVNFNjRfUEFEKSkgKQotCQkJewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogQSBwYWQgc2VxdWVuY2UgbWVhbnMgbm8gbW9yZSBpbnB1dC4KLQkJCQkqKiBXZSd2ZSBhbHJlYWR5IGludGVycHJldGVkIHRoZSBkYXRhCi0JCQkJKiogZnJvbSB0aGUgcXVhZCBhdCB0aGlzIHBvaW50LgotCQkJCSovCi0JCQkJbGVmdGJpdHMgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQl9CisgICAgICAgIC8qIENoZWNrIGZvciBwYWQgc2VxdWVuY2VzIGFuZCBpZ25vcmUKKyAgICAgICAgKiogdGhlIGludmFsaWQgb25lcy4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHRoaXNfY2ggPT0gQkFTRTY0X1BBRCkgeworICAgICAgICAgICAgaWYgKCAocXVhZF9wb3MgPCAyKSB8fAorICAgICAgICAgICAgICAgICAoKHF1YWRfcG9zID09IDIpICYmCisgICAgICAgICAgICAgICAgICAoYmluYXNjaWlfZmluZF92YWxpZChhc2NpaV9kYXRhLCBhc2NpaV9sZW4sIDEpCisgICAgICAgICAgICAgICAgICAgIT0gQkFTRTY0X1BBRCkpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEEgcGFkIHNlcXVlbmNlIG1lYW5zIG5vIG1vcmUgaW5wdXQuCisgICAgICAgICAgICAgICAgKiogV2UndmUgYWxyZWFkeSBpbnRlcnByZXRlZCB0aGUgZGF0YQorICAgICAgICAgICAgICAgICoqIGZyb20gdGhlIHF1YWQgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxlZnRiaXRzID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXRoaXNfY2ggPSB0YWJsZV9hMmJfYmFzZTY0Wyphc2NpaV9kYXRhXTsKLQkJaWYgKCB0aGlzX2NoID09ICh1bnNpZ25lZCBjaGFyKSAtMSApCi0JCQljb250aW51ZTsKKyAgICAgICAgdGhpc19jaCA9IHRhYmxlX2EyYl9iYXNlNjRbKmFzY2lpX2RhdGFdOworICAgICAgICBpZiAoIHRoaXNfY2ggPT0gKHVuc2lnbmVkIGNoYXIpIC0xICkKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCS8qCi0JCSoqIFNoaWZ0IGl0IGluIG9uIHRoZSBsb3cgZW5kLCBhbmQgc2VlIGlmIHRoZXJlJ3MKLQkJKiogYSBieXRlIHJlYWR5IGZvciBvdXRwdXQuCi0JCSovCi0JCXF1YWRfcG9zID0gKHF1YWRfcG9zICsgMSkgJiAweDAzOwotCQlsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA2KSB8ICh0aGlzX2NoKTsKLQkJbGVmdGJpdHMgKz0gNjsKKyAgICAgICAgLyoKKyAgICAgICAgKiogU2hpZnQgaXQgaW4gb24gdGhlIGxvdyBlbmQsIGFuZCBzZWUgaWYgdGhlcmUncworICAgICAgICAqKiBhIGJ5dGUgcmVhZHkgZm9yIG91dHB1dC4KKyAgICAgICAgKi8KKyAgICAgICAgcXVhZF9wb3MgPSAocXVhZF9wb3MgKyAxKSAmIDB4MDM7CisgICAgICAgIGxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDYpIHwgKHRoaXNfY2gpOworICAgICAgICBsZWZ0Yml0cyArPSA2OwogCi0JCWlmICggbGVmdGJpdHMgPj0gOCApIHsKLQkJCWxlZnRiaXRzIC09IDg7Ci0JCQkqYmluX2RhdGErKyA9IChsZWZ0Y2hhciA+PiBsZWZ0Yml0cykgJiAweGZmOwotCQkJYmluX2xlbisrOwotCQkJbGVmdGNoYXIgJj0gKCgxIDw8IGxlZnRiaXRzKSAtIDEpOwotCQl9Ci0gCX0KKyAgICAgICAgaWYgKCBsZWZ0Yml0cyA+PSA4ICkgeworICAgICAgICAgICAgbGVmdGJpdHMgLT0gODsKKyAgICAgICAgICAgICpiaW5fZGF0YSsrID0gKGxlZnRjaGFyID4+IGxlZnRiaXRzKSAmIDB4ZmY7CisgICAgICAgICAgICBiaW5fbGVuKys7CisgICAgICAgICAgICBsZWZ0Y2hhciAmPSAoKDEgPDwgbGVmdGJpdHMpIC0gMSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAobGVmdGJpdHMgIT0gMCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYXNjaWkpOwotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJJbmNvcnJlY3QgcGFkZGluZyIpOwotCQlQeV9ERUNSRUYocnYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGxlZnRiaXRzICE9IDApIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGFzY2lpKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSW5jb3JyZWN0IHBhZGRpbmciKTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQW5kIHNldCBzdHJpbmcgc2l6ZSBjb3JyZWN0bHkuIElmIHRoZSByZXN1bHQgc3RyaW5nIGlzIGVtcHR5Ci0JKiogKGJlY2F1c2UgdGhlIGlucHV0IHdhcyBhbGwgaW52YWxpZCkgcmV0dXJuIHRoZSBzaGFyZWQgZW1wdHkKLQkqKiBzdHJpbmcgaW5zdGVhZDsgX1B5U3RyaW5nX1Jlc2l6ZSgpIHdvbid0IGRvIHRoaXMgZm9yIHVzLgotCSovCi0JaWYgKGJpbl9sZW4gPiAwKSB7Ci0JCWlmIChfUHlTdHJpbmdfUmVzaXplKCZydiwgYmluX2xlbikgPCAwKSB7Ci0JCQlQeV9ERUNSRUYocnYpOwotCQkJcnYgPSBOVUxMOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeV9ERUNSRUYocnYpOwotCQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCIiLCAwKTsKLQl9Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGFzY2lpKTsKLQlyZXR1cm4gcnY7CisgICAgLyogQW5kIHNldCBzdHJpbmcgc2l6ZSBjb3JyZWN0bHkuIElmIHRoZSByZXN1bHQgc3RyaW5nIGlzIGVtcHR5CisgICAgKiogKGJlY2F1c2UgdGhlIGlucHV0IHdhcyBhbGwgaW52YWxpZCkgcmV0dXJuIHRoZSBzaGFyZWQgZW1wdHkKKyAgICAqKiBzdHJpbmcgaW5zdGVhZDsgX1B5U3RyaW5nX1Jlc2l6ZSgpIHdvbid0IGRvIHRoaXMgZm9yIHVzLgorICAgICovCisgICAgaWYgKGJpbl9sZW4gPiAwKSB7CisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZydiwgYmluX2xlbikgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgcnYgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCIiLCAwKTsKKyAgICB9CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGFzY2lpKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfYjJhX2Jhc2U2NCwgIihiaW4pIC0+IGFzY2lpLiBCYXNlNjQtY29kZSBsaW5lIG9mIGRhdGEiKTsKQEAgLTQ3MCw2NiArNDcwLDY2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXNjaWlfYjJhX2Jhc2U2NChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7Ci0JdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOwotCWludCBsZWZ0Yml0cyA9IDA7Ci0JdW5zaWduZWQgY2hhciB0aGlzX2NoOwotCXVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCVB5X3NzaXplX3QgYmluX2xlbjsKKyAgICBQeV9idWZmZXIgcGJ1ZjsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgaW50IGxlZnRiaXRzID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CisgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgUHlfc3NpemVfdCBiaW5fbGVuOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6YjJhX2Jhc2U2NCIsICZwYnVmKSApCi0JCXJldHVybiBOVUxMOwotCWJpbl9kYXRhID0gcGJ1Zi5idWY7Ci0JYmluX2xlbiA9IHBidWYubGVuOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOmIyYV9iYXNlNjQiLCAmcGJ1ZikgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBiaW5fZGF0YSA9IHBidWYuYnVmOworICAgIGJpbl9sZW4gPSBwYnVmLmxlbjsKIAotCWFzc2VydChiaW5fbGVuID49IDApOworICAgIGFzc2VydChiaW5fbGVuID49IDApOwogCi0JaWYgKCBiaW5fbGVuID4gQkFTRTY0X01BWEJJTiApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiVG9vIG11Y2ggZGF0YSBmb3IgYmFzZTY0IGxpbmUiKTsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIGJpbl9sZW4gPiBCQVNFNjRfTUFYQklOICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJUb28gbXVjaCBkYXRhIGZvciBiYXNlNjQgbGluZSIpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogV2UncmUgbGF6eSBhbmQgYWxsb2NhdGUgdG9vIG11Y2ggKGZpeGVkIHVwIGxhdGVyKS4KLQkgICAiKzMiIGxlYXZlcyByb29tIGZvciB1cCB0byB0d28gcGFkIGNoYXJhY3RlcnMgYW5kIGEgdHJhaWxpbmcKLQkgICBuZXdsaW5lLiAgTm90ZSB0aGF0ICdiJyBnZXRzIGVuY29kZWQgYXMgJ1lnPT1cbicgKDEgaW4sIDUgb3V0KS4gKi8KLQlpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKjIgKyAzKSkgPT0gTlVMTCApIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhc2NpaV9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpOworICAgIC8qIFdlJ3JlIGxhenkgYW5kIGFsbG9jYXRlIHRvbyBtdWNoIChmaXhlZCB1cCBsYXRlcikuCisgICAgICAgIiszIiBsZWF2ZXMgcm9vbSBmb3IgdXAgdG8gdHdvIHBhZCBjaGFyYWN0ZXJzIGFuZCBhIHRyYWlsaW5nCisgICAgICAgbmV3bGluZS4gIE5vdGUgdGhhdCAnYicgZ2V0cyBlbmNvZGVkIGFzICdZZz09XG4nICgxIGluLCA1IG91dCkuICovCisgICAgaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYmluX2xlbioyICsgMykpID09IE5VTEwgKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KTsKIAotCWZvciggOyBiaW5fbGVuID4gMCA7IGJpbl9sZW4tLSwgYmluX2RhdGErKyApIHsKLQkJLyogU2hpZnQgdGhlIGRhdGEgaW50byBvdXIgYnVmZmVyICovCi0JCWxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDgpIHwgKmJpbl9kYXRhOwotCQlsZWZ0Yml0cyArPSA4OworICAgIGZvciggOyBiaW5fbGVuID4gMCA7IGJpbl9sZW4tLSwgYmluX2RhdGErKyApIHsKKyAgICAgICAgLyogU2hpZnQgdGhlIGRhdGEgaW50byBvdXIgYnVmZmVyICovCisgICAgICAgIGxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDgpIHwgKmJpbl9kYXRhOworICAgICAgICBsZWZ0Yml0cyArPSA4OwogCi0JCS8qIFNlZSBpZiB0aGVyZSBhcmUgNi1iaXQgZ3JvdXBzIHJlYWR5ICovCi0JCXdoaWxlICggbGVmdGJpdHMgPj0gNiApIHsKLQkJCXRoaXNfY2ggPSAobGVmdGNoYXIgPj4gKGxlZnRiaXRzLTYpKSAmIDB4M2Y7Ci0JCQlsZWZ0Yml0cyAtPSA2OwotCQkJKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9iYXNlNjRbdGhpc19jaF07Ci0JCX0KLQl9Ci0JaWYgKCBsZWZ0Yml0cyA9PSAyICkgewotCQkqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2Jhc2U2NFsobGVmdGNoYXImMykgPDwgNF07Ci0JCSphc2NpaV9kYXRhKysgPSBCQVNFNjRfUEFEOwotCQkqYXNjaWlfZGF0YSsrID0gQkFTRTY0X1BBRDsKLQl9IGVsc2UgaWYgKCBsZWZ0Yml0cyA9PSA0ICkgewotCQkqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2Jhc2U2NFsobGVmdGNoYXImMHhmKSA8PCAyXTsKLQkJKmFzY2lpX2RhdGErKyA9IEJBU0U2NF9QQUQ7Ci0JfQotCSphc2NpaV9kYXRhKysgPSAnXG4nOwkvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCisgICAgICAgIC8qIFNlZSBpZiB0aGVyZSBhcmUgNi1iaXQgZ3JvdXBzIHJlYWR5ICovCisgICAgICAgIHdoaWxlICggbGVmdGJpdHMgPj0gNiApIHsKKyAgICAgICAgICAgIHRoaXNfY2ggPSAobGVmdGNoYXIgPj4gKGxlZnRiaXRzLTYpKSAmIDB4M2Y7CisgICAgICAgICAgICBsZWZ0Yml0cyAtPSA2OworICAgICAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9iYXNlNjRbdGhpc19jaF07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBsZWZ0Yml0cyA9PSAyICkgeworICAgICAgICAqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2Jhc2U2NFsobGVmdGNoYXImMykgPDwgNF07CisgICAgICAgICphc2NpaV9kYXRhKysgPSBCQVNFNjRfUEFEOworICAgICAgICAqYXNjaWlfZGF0YSsrID0gQkFTRTY0X1BBRDsKKyAgICB9IGVsc2UgaWYgKCBsZWZ0Yml0cyA9PSA0ICkgeworICAgICAgICAqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2Jhc2U2NFsobGVmdGNoYXImMHhmKSA8PCAyXTsKKyAgICAgICAgKmFzY2lpX2RhdGErKyA9IEJBU0U2NF9QQUQ7CisgICAgfQorICAgICphc2NpaV9kYXRhKysgPSAnXG4nOyAgICAgICAvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCiAKLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsCi0JCQkgICAoYXNjaWlfZGF0YSAtCi0JCQkgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0JCVB5X0RFQ1JFRihydik7Ci0JCXJ2ID0gTlVMTDsKLQl9Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JcmV0dXJuIHJ2OworICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZydiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGFzY2lpX2RhdGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpKSkgPCAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJ2ID0gTlVMTDsKKyAgICB9CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgcmV0dXJuIHJ2OwogfQogCiBQeURvY19TVFJWQVIoZG9jX2EyYl9ocXgsICJhc2NpaSAtPiBiaW4sIGRvbmUuIERlY29kZSAuaHF4IGNvZGluZyIpOwpAQCAtNTM3LDg1ICs1MzcsODUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9hMmJfaHF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGFzY2lpOwotCXVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKLQlpbnQgbGVmdGJpdHMgPSAwOwotCXVuc2lnbmVkIGNoYXIgdGhpc19jaDsKLQl1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotCVB5T2JqZWN0ICpydjsKLQlQeV9zc2l6ZV90IGxlbjsKLQlpbnQgZG9uZSA9IDA7CisgICAgUHlfYnVmZmVyIHBhc2NpaTsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgaW50IGxlZnRiaXRzID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CisgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgaW50IGRvbmUgPSAwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6YTJiX2hxeCIsICZwYXNjaWkpICkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNjaWlfZGF0YSA9IHBhc2NpaS5idWY7Ci0JbGVuID0gcGFzY2lpLmxlbjsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjphMmJfaHF4IiwgJnBhc2NpaSkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc2NpaV9kYXRhID0gcGFzY2lpLmJ1ZjsKKyAgICBsZW4gPSBwYXNjaWkubGVuOwogCi0JYXNzZXJ0KGxlbiA+PSAwKTsKKyAgICBhc3NlcnQobGVuID49IDApOwogCi0JaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC0gMikgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYXNjaWkpOwotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9CisgICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC0gMikgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYXNjaWkpOworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CiAKLQkvKiBBbGxvY2F0ZSBhIHN0cmluZyB0aGF0IGlzIHRvbyBiaWcgKGZpeGVkIGxhdGVyKSAKLQkgICBBZGQgdHdvIHRvIHRoZSBpbml0aWFsIGxlbmd0aCB0byBwcmV2ZW50IGludGVybmluZyB3aGljaAotCSAgIHdvdWxkIHByZWNsdWRlIHN1YnNlcXVlbnQgcmVzaXppbmcuICAqLwotCWlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbisyKSkgPT0gTlVMTCApIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGFzY2lpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJpbl9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpOworICAgIC8qIEFsbG9jYXRlIGEgc3RyaW5nIHRoYXQgaXMgdG9vIGJpZyAoZml4ZWQgbGF0ZXIpCisgICAgICAgQWRkIHR3byB0byB0aGUgaW5pdGlhbCBsZW5ndGggdG8gcHJldmVudCBpbnRlcm5pbmcgd2hpY2gKKyAgICAgICB3b3VsZCBwcmVjbHVkZSBzdWJzZXF1ZW50IHJlc2l6aW5nLiAgKi8KKyAgICBpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4rMikpID09IE5VTEwgKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhc2NpaSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KTsKIAotCWZvciggOyBsZW4gPiAwIDsgbGVuLS0sIGFzY2lpX2RhdGErKyApIHsKLQkJLyogR2V0IHRoZSBieXRlIGFuZCBsb29rIGl0IHVwICovCi0JCXRoaXNfY2ggPSB0YWJsZV9hMmJfaHF4Wyphc2NpaV9kYXRhXTsKLQkJaWYgKCB0aGlzX2NoID09IFNLSVAgKQotCQkJY29udGludWU7Ci0JCWlmICggdGhpc19jaCA9PSBGQUlMICkgewotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSWxsZWdhbCBjaGFyIik7Ci0JCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYXNjaWkpOwotCQkJUHlfREVDUkVGKHJ2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmICggdGhpc19jaCA9PSBET05FICkgewotCQkJLyogVGhlIHRlcm1pbmF0aW5nIGNvbG9uICovCi0JCQlkb25lID0gMTsKLQkJCWJyZWFrOwotCQl9CisgICAgZm9yKCA7IGxlbiA+IDAgOyBsZW4tLSwgYXNjaWlfZGF0YSsrICkgeworICAgICAgICAvKiBHZXQgdGhlIGJ5dGUgYW5kIGxvb2sgaXQgdXAgKi8KKyAgICAgICAgdGhpc19jaCA9IHRhYmxlX2EyYl9ocXhbKmFzY2lpX2RhdGFdOworICAgICAgICBpZiAoIHRoaXNfY2ggPT0gU0tJUCApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCB0aGlzX2NoID09IEZBSUwgKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJJbGxlZ2FsIGNoYXIiKTsKKyAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhc2NpaSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCB0aGlzX2NoID09IERPTkUgKSB7CisgICAgICAgICAgICAvKiBUaGUgdGVybWluYXRpbmcgY29sb24gKi8KKyAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQkvKiBTaGlmdCBpdCBpbnRvIHRoZSBidWZmZXIgYW5kIHNlZSBpZiBhbnkgYnl0ZXMgYXJlIHJlYWR5ICovCi0JCWxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDYpIHwgKHRoaXNfY2gpOwotCQlsZWZ0Yml0cyArPSA2OwotCQlpZiAoIGxlZnRiaXRzID49IDggKSB7Ci0JCQlsZWZ0Yml0cyAtPSA4OwotCQkJKmJpbl9kYXRhKysgPSAobGVmdGNoYXIgPj4gbGVmdGJpdHMpICYgMHhmZjsKLQkJCWxlZnRjaGFyICY9ICgoMSA8PCBsZWZ0Yml0cykgLSAxKTsKLQkJfQotCX0KKyAgICAgICAgLyogU2hpZnQgaXQgaW50byB0aGUgYnVmZmVyIGFuZCBzZWUgaWYgYW55IGJ5dGVzIGFyZSByZWFkeSAqLworICAgICAgICBsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA2KSB8ICh0aGlzX2NoKTsKKyAgICAgICAgbGVmdGJpdHMgKz0gNjsKKyAgICAgICAgaWYgKCBsZWZ0Yml0cyA+PSA4ICkgeworICAgICAgICAgICAgbGVmdGJpdHMgLT0gODsKKyAgICAgICAgICAgICpiaW5fZGF0YSsrID0gKGxlZnRjaGFyID4+IGxlZnRiaXRzKSAmIDB4ZmY7CisgICAgICAgICAgICBsZWZ0Y2hhciAmPSAoKDEgPDwgbGVmdGJpdHMpIC0gMSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoIGxlZnRiaXRzICYmICFkb25lICkgewotCQlQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwKLQkJCQkiU3RyaW5nIGhhcyBpbmNvbXBsZXRlIG51bWJlciBvZiBieXRlcyIpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYXNjaWkpOwotCQlQeV9ERUNSRUYocnYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKF9QeVN0cmluZ19SZXNpemUoJnJ2LAotCQkJICAgKGJpbl9kYXRhIC0KLQkJCSAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhydikpKSA8IDApIHsKLQkJUHlfREVDUkVGKHJ2KTsKLQkJcnYgPSBOVUxMOwotCX0KLQlpZiAocnYpIHsKLQkJUHlPYmplY3QgKnJydiA9IFB5X0J1aWxkVmFsdWUoIk9pIiwgcnYsIGRvbmUpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYXNjaWkpOwotCQlQeV9ERUNSRUYocnYpOwotCQlyZXR1cm4gcnJ2OwotCX0KKyAgICBpZiAoIGxlZnRiaXRzICYmICFkb25lICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgaGFzIGluY29tcGxldGUgbnVtYmVyIG9mIGJ5dGVzIik7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhc2NpaSk7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsCisgICAgICAgICAgICAgICAgICAgICAgIChiaW5fZGF0YSAtCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhydikpKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgcnYgPSBOVUxMOworICAgIH0KKyAgICBpZiAocnYpIHsKKyAgICAgICAgUHlPYmplY3QgKnJydiA9IFB5X0J1aWxkVmFsdWUoIk9pIiwgcnYsIGRvbmUpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYXNjaWkpOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICByZXR1cm4gcnJ2OworICAgIH0KIAotCVB5QnVmZmVyX1JlbGVhc2UoJnBhc2NpaSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGFzY2lpKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19ybGVjb2RlX2hxeCwgIkJpbmhleCBSTEUtY29kZSBiaW5hcnkgZGF0YSIpOwpAQCAtNjIzLDYzICs2MjMsNjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9ybGVjb2RlX2hxeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7Ci0JdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOwotCVB5T2JqZWN0ICpydjsKLQl1bnNpZ25lZCBjaGFyIGNoOwotCVB5X3NzaXplX3QgaW4sIGluZW5kLCBsZW47CisgICAgUHlfYnVmZmVyIHBidWY7CisgICAgdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOworICAgIFB5T2JqZWN0ICpydjsKKyAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgIFB5X3NzaXplX3QgaW4sIGluZW5kLCBsZW47CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpybGVjb2RlX2hxeCIsICZwYnVmKSApCi0JCXJldHVybiBOVUxMOwotCWluX2RhdGEgPSBwYnVmLmJ1ZjsKLQlsZW4gPSBwYnVmLmxlbjsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpybGVjb2RlX2hxeCIsICZwYnVmKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGluX2RhdGEgPSBwYnVmLmJ1ZjsKKyAgICBsZW4gPSBwYnVmLmxlbjsKIAotCWFzc2VydChsZW4gPj0gMCk7CisgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIAotCWlmIChsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIgLSAyKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9CisgICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMiAtIDIpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KIAotCS8qIFdvcnN0IGNhc2U6IG91dHB1dCBpcyB0d2ljZSBhcyBiaWcgYXMgaW5wdXQgKGZpeGVkIGxhdGVyKSAqLwotCWlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpOworICAgIC8qIFdvcnN0IGNhc2U6IG91dHB1dCBpcyB0d2ljZSBhcyBiaWcgYXMgaW5wdXQgKGZpeGVkIGxhdGVyKSAqLworICAgIGlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpOwogCi0JZm9yKCBpbj0wOyBpbjxsZW47IGluKyspIHsKLQkJY2ggPSBpbl9kYXRhW2luXTsKLQkJaWYgKCBjaCA9PSBSVU5DSEFSICkgewotCQkJLyogUlVOQ0hBUi4gRXNjYXBlIGl0LiAqLwotCQkJKm91dF9kYXRhKysgPSBSVU5DSEFSOwotCQkJKm91dF9kYXRhKysgPSAwOwotCQl9IGVsc2UgewotCQkJLyogQ2hlY2sgaG93IG1hbnkgZm9sbG93aW5nIGFyZSB0aGUgc2FtZSAqLwotCQkJZm9yKGluZW5kPWluKzE7Ci0JCQkgICAgaW5lbmQ8bGVuICYmIGluX2RhdGFbaW5lbmRdID09IGNoICYmCi0JCQkJICAgIGluZW5kIDwgaW4rMjU1OwotCQkJICAgIGluZW5kKyspIDsKLQkJCWlmICggaW5lbmQgLSBpbiA+IDMgKSB7Ci0JCQkJLyogTW9yZSB0aGFuIDMgaW4gYSByb3cuIE91dHB1dCBSTEUuICovCi0JCQkJKm91dF9kYXRhKysgPSBjaDsKLQkJCQkqb3V0X2RhdGErKyA9IFJVTkNIQVI7Ci0JCQkJKm91dF9kYXRhKysgPSBpbmVuZC1pbjsKLQkJCQlpbiA9IGluZW5kLTE7Ci0JCQl9IGVsc2UgewotCQkJCS8qIExlc3MgdGhhbiAzLiBPdXRwdXQgdGhlIGJ5dGUgaXRzZWxmICovCi0JCQkJKm91dF9kYXRhKysgPSBjaDsKLQkJCX0KLQkJfQotCX0KLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsCi0JCQkgICAob3V0X2RhdGEgLQotCQkJICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotCQlQeV9ERUNSRUYocnYpOwotCQlydiA9IE5VTEw7Ci0JfQotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiBydjsKKyAgICBmb3IoIGluPTA7IGluPGxlbjsgaW4rKykgeworICAgICAgICBjaCA9IGluX2RhdGFbaW5dOworICAgICAgICBpZiAoIGNoID09IFJVTkNIQVIgKSB7CisgICAgICAgICAgICAvKiBSVU5DSEFSLiBFc2NhcGUgaXQuICovCisgICAgICAgICAgICAqb3V0X2RhdGErKyA9IFJVTkNIQVI7CisgICAgICAgICAgICAqb3V0X2RhdGErKyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDaGVjayBob3cgbWFueSBmb2xsb3dpbmcgYXJlIHRoZSBzYW1lICovCisgICAgICAgICAgICBmb3IoaW5lbmQ9aW4rMTsKKyAgICAgICAgICAgICAgICBpbmVuZDxsZW4gJiYgaW5fZGF0YVtpbmVuZF0gPT0gY2ggJiYKKyAgICAgICAgICAgICAgICAgICAgaW5lbmQgPCBpbisyNTU7CisgICAgICAgICAgICAgICAgaW5lbmQrKykgOworICAgICAgICAgICAgaWYgKCBpbmVuZCAtIGluID4gMyApIHsKKyAgICAgICAgICAgICAgICAvKiBNb3JlIHRoYW4gMyBpbiBhIHJvdy4gT3V0cHV0IFJMRS4gKi8KKyAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGNoOworICAgICAgICAgICAgICAgICpvdXRfZGF0YSsrID0gUlVOQ0hBUjsKKyAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGluZW5kLWluOworICAgICAgICAgICAgICAgIGluID0gaW5lbmQtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogTGVzcyB0aGFuIDMuIE91dHB1dCB0aGUgYnl0ZSBpdHNlbGYgKi8KKyAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGNoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZydiwKKyAgICAgICAgICAgICAgICAgICAgICAgKG91dF9kYXRhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBydiA9IE5VTEw7CisgICAgfQorICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgIHJldHVybiBydjsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19iMmFfaHF4LCAiRW5jb2RlIC5ocXggZGF0YSIpOwpAQCAtNjg3LDU2ICs2ODcsNTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9iMmFfaHF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJpbjsKLQl1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7Ci0JaW50IGxlZnRiaXRzID0gMDsKLQl1bnNpZ25lZCBjaGFyIHRoaXNfY2g7Ci0JdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlfYnVmZmVyIHBiaW47CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGludCBsZWZ0Yml0cyA9IDA7CisgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOworICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7CisgICAgUHlPYmplY3QgKnJ2OworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6YjJhX2hxeCIsICZwYmluKSApCi0JCXJldHVybiBOVUxMOwotCWJpbl9kYXRhID0gcGJpbi5idWY7Ci0JbGVuID0gcGJpbi5sZW47CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6YjJhX2hxeCIsICZwYmluKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJpbl9kYXRhID0gcGJpbi5idWY7CisgICAgbGVuID0gcGJpbi5sZW47CiAKLQlhc3NlcnQobGVuID49IDApOworICAgIGFzc2VydChsZW4gPj0gMCk7CiAKLQlpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLyAyIC0gMikgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYmluKTsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQorICAgIGlmIChsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIgLSAyKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBiaW4pOworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CiAKLQkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0aGF0IGlzIGF0IGxlYXN0IGxhcmdlIGVub3VnaCAqLwotCWlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYmluKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhydik7CisgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgdGhhdCBpcyBhdCBsZWFzdCBsYXJnZSBlbm91Z2ggKi8KKyAgICBpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qMisyKSkgPT0gTlVMTCApIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJpbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhc2NpaV9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpOwogCi0JZm9yKCA7IGxlbiA+IDAgOyBsZW4tLSwgYmluX2RhdGErKyApIHsKLQkJLyogU2hpZnQgaW50byBvdXIgYnVmZmVyLCBhbmQgb3V0cHV0IGFueSA2Yml0cyByZWFkeSAqLwotCQlsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA4KSB8ICpiaW5fZGF0YTsKLQkJbGVmdGJpdHMgKz0gODsKLQkJd2hpbGUgKCBsZWZ0Yml0cyA+PSA2ICkgewotCQkJdGhpc19jaCA9IChsZWZ0Y2hhciA+PiAobGVmdGJpdHMtNikpICYgMHgzZjsKLQkJCWxlZnRiaXRzIC09IDY7Ci0JCQkqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2hxeFt0aGlzX2NoXTsKLQkJfQotCX0KLQkvKiBPdXRwdXQgYSBwb3NzaWJsZSBydW50IGJ5dGUgKi8KLQlpZiAoIGxlZnRiaXRzICkgewotCQlsZWZ0Y2hhciA8PD0gKDYtbGVmdGJpdHMpOwotCQkqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2hxeFtsZWZ0Y2hhciAmIDB4M2ZdOwotCX0KLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsCi0JCQkgICAoYXNjaWlfZGF0YSAtCi0JCQkgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0JCVB5X0RFQ1JFRihydik7Ci0JCXJ2ID0gTlVMTDsKLQl9Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJpbik7Ci0JcmV0dXJuIHJ2OworICAgIGZvciggOyBsZW4gPiAwIDsgbGVuLS0sIGJpbl9kYXRhKysgKSB7CisgICAgICAgIC8qIFNoaWZ0IGludG8gb3VyIGJ1ZmZlciwgYW5kIG91dHB1dCBhbnkgNmJpdHMgcmVhZHkgKi8KKyAgICAgICAgbGVmdGNoYXIgPSAobGVmdGNoYXIgPDwgOCkgfCAqYmluX2RhdGE7CisgICAgICAgIGxlZnRiaXRzICs9IDg7CisgICAgICAgIHdoaWxlICggbGVmdGJpdHMgPj0gNiApIHsKKyAgICAgICAgICAgIHRoaXNfY2ggPSAobGVmdGNoYXIgPj4gKGxlZnRiaXRzLTYpKSAmIDB4M2Y7CisgICAgICAgICAgICBsZWZ0Yml0cyAtPSA2OworICAgICAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9ocXhbdGhpc19jaF07CisgICAgICAgIH0KKyAgICB9CisgICAgLyogT3V0cHV0IGEgcG9zc2libGUgcnVudCBieXRlICovCisgICAgaWYgKCBsZWZ0Yml0cyApIHsKKyAgICAgICAgbGVmdGNoYXIgPDw9ICg2LWxlZnRiaXRzKTsKKyAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9ocXhbbGVmdGNoYXIgJiAweDNmXTsKKyAgICB9CisgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJ2LAorICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhydikpKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgcnYgPSBOVUxMOworICAgIH0KKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYmluKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfcmxlZGVjb2RlX2hxeCwgIkRlY29kZSBoZXhiaW4gUkxFLWNvZGVkIHN0cmluZyIpOwpAQCAtNzQ0LDExNiArNzQ0LDExNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX3JsZWRlY29kZV9ocXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwaW47Ci0JdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOwotCXVuc2lnbmVkIGNoYXIgaW5fYnl0ZSwgaW5fcmVwZWF0OwotCVB5T2JqZWN0ICpydjsKLQlQeV9zc2l6ZV90IGluX2xlbiwgb3V0X2xlbiwgb3V0X2xlbl9sZWZ0OworICAgIFB5X2J1ZmZlciBwaW47CisgICAgdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgaW5fYnl0ZSwgaW5fcmVwZWF0OworICAgIFB5T2JqZWN0ICpydjsKKyAgICBQeV9zc2l6ZV90IGluX2xlbiwgb3V0X2xlbiwgb3V0X2xlbl9sZWZ0OwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6cmxlZGVjb2RlX2hxeCIsICZwaW4pICkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5fZGF0YSA9IHBpbi5idWY7Ci0JaW5fbGVuID0gcGluLmxlbjsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpybGVkZWNvZGVfaHF4IiwgJnBpbikgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbl9kYXRhID0gcGluLmJ1ZjsKKyAgICBpbl9sZW4gPSBwaW4ubGVuOwogCi0JYXNzZXJ0KGluX2xlbiA+PSAwKTsKKyAgICBhc3NlcnQoaW5fbGVuID49IDApOwogCi0JLyogRW1wdHkgc3RyaW5nIGlzIGEgc3BlY2lhbCBjYXNlICovCi0JaWYgKCBpbl9sZW4gPT0gMCApIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGluKTsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCIiLCAwKTsKLQl9Ci0JZWxzZSBpZiAoaW5fbGVuID4gUFlfU1NJWkVfVF9NQVggLyAyKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBpbik7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KKyAgICAvKiBFbXB0eSBzdHJpbmcgaXMgYSBzcGVjaWFsIGNhc2UgKi8KKyAgICBpZiAoIGluX2xlbiA9PSAwICkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwaW4pOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOworICAgIH0KKyAgICBlbHNlIGlmIChpbl9sZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGluKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQogCi0JLyogQWxsb2NhdGUgYSBidWZmZXIgb2YgcmVhc29uYWJsZSBzaXplLiBSZXNpemVkIHdoZW4gbmVlZGVkICovCi0Jb3V0X2xlbiA9IGluX2xlbioyOwotCWlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG91dF9sZW4pKSA9PSBOVUxMICkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwaW4pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb3V0X2xlbl9sZWZ0ID0gb3V0X2xlbjsKLQlvdXRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KTsKKyAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBvZiByZWFzb25hYmxlIHNpemUuIFJlc2l6ZWQgd2hlbiBuZWVkZWQgKi8KKyAgICBvdXRfbGVuID0gaW5fbGVuKjI7CisgICAgaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgb3V0X2xlbikpID09IE5VTEwgKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBpbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvdXRfbGVuX2xlZnQgPSBvdXRfbGVuOworICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpOwogCi0JLyoKLQkqKiBXZSBuZWVkIHR3byBtYWNyb3MgaGVyZSB0byBnZXQvcHV0IGJ5dGVzIGFuZCBoYW5kbGUKLQkqKiBlbmQtb2YtYnVmZmVyIGZvciBpbnB1dCBhbmQgb3V0cHV0IHN0cmluZ3MuCi0JKi8KKyAgICAvKgorICAgICoqIFdlIG5lZWQgdHdvIG1hY3JvcyBoZXJlIHRvIGdldC9wdXQgYnl0ZXMgYW5kIGhhbmRsZQorICAgICoqIGVuZC1vZi1idWZmZXIgZm9yIGlucHV0IGFuZCBvdXRwdXQgc3RyaW5ncy4KKyAgICAqLwogI2RlZmluZSBJTkJZVEUoYikgXAotCWRvIHsgXAotCSAgICAgICAgIGlmICggLS1pbl9sZW4gPCAwICkgeyBcCi0JCQkgICBQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwgIiIpOyBcCi0JCQkgICBQeV9ERUNSRUYocnYpOyBcCi0JCQkgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwaW4pOyBcCi0JCQkgICByZXR1cm4gTlVMTDsgXAotCQkgfSBcCi0JCSBiID0gKmluX2RhdGErKzsgXAotCX0gd2hpbGUoMCkKKyAgICBkbyB7IFwKKyAgICAgICAgICAgICBpZiAoIC0taW5fbGVuIDwgMCApIHsgXAorICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwgIiIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihydik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGluKTsgXAorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgIGIgPSAqaW5fZGF0YSsrOyBcCisgICAgfSB3aGlsZSgwKQogCiAjZGVmaW5lIE9VVEJZVEUoYikgXAotCWRvIHsgXAotCQkgaWYgKCAtLW91dF9sZW5fbGVmdCA8IDAgKSB7IFwKLQkJCSAgaWYgKCBvdXRfbGVuID4gUFlfU1NJWkVfVF9NQVggLyAyKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsgXAotCQkJICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIDIqb3V0X2xlbikgPCAwKSBcCi0JCQkgICAgeyBQeV9ERUNSRUYocnYpOyBQeUJ1ZmZlcl9SZWxlYXNlKCZwaW4pOyByZXR1cm4gTlVMTDsgfSBcCi0JCQkgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpIFwKLQkJCQkJCQkJICsgb3V0X2xlbjsgXAotCQkJICBvdXRfbGVuX2xlZnQgPSBvdXRfbGVuLTE7IFwKLQkJCSAgb3V0X2xlbiA9IG91dF9sZW4gKiAyOyBcCi0JCSB9IFwKLQkJICpvdXRfZGF0YSsrID0gYjsgXAotCX0gd2hpbGUoMCkKKyAgICBkbyB7IFwKKyAgICAgICAgICAgICBpZiAoIC0tb3V0X2xlbl9sZWZ0IDwgMCApIHsgXAorICAgICAgICAgICAgICAgICAgICAgIGlmICggb3V0X2xlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIDIqb3V0X2xlbikgPCAwKSBcCisgICAgICAgICAgICAgICAgICAgICAgICB7IFB5X0RFQ1JFRihydik7IFB5QnVmZmVyX1JlbGVhc2UoJnBpbik7IHJldHVybiBOVUxMOyB9IFwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJ2KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRfbGVuOyBcCisgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbl9sZWZ0ID0gb3V0X2xlbi0xOyBcCisgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiA9IG91dF9sZW4gKiAyOyBcCisgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgKm91dF9kYXRhKysgPSBiOyBcCisgICAgfSB3aGlsZSgwKQogCi0JCS8qCi0JCSoqIEhhbmRsZSBmaXJzdCBieXRlIHNlcGFyYXRlbHkgKHNpbmNlIHdlIGhhdmUgdG8gZ2V0IGFuZ3J5Ci0JCSoqIGluIGNhc2Ugb2YgYW4gb3JwaGFuZWQgUkxFIGNvZGUpLgotCQkqLwotCQlJTkJZVEUoaW5fYnl0ZSk7CisgICAgICAgIC8qCisgICAgICAgICoqIEhhbmRsZSBmaXJzdCBieXRlIHNlcGFyYXRlbHkgKHNpbmNlIHdlIGhhdmUgdG8gZ2V0IGFuZ3J5CisgICAgICAgICoqIGluIGNhc2Ugb2YgYW4gb3JwaGFuZWQgUkxFIGNvZGUpLgorICAgICAgICAqLworICAgICAgICBJTkJZVEUoaW5fYnl0ZSk7CiAKLQlpZiAoaW5fYnl0ZSA9PSBSVU5DSEFSKSB7Ci0JCUlOQllURShpbl9yZXBlYXQpOwotCQlpZiAoaW5fcmVwZWF0ICE9IDApIHsKLQkJCS8qIE5vdGUgRXJyb3IsIG5vdCBJbmNvbXBsZXRlICh3aGljaCBpcyBhdCB0aGUgZW5kCi0JCQkqKiBvZiB0aGUgc3RyaW5nIG9ubHkpLiBUaGlzIGlzIGEgcHJvZ3JhbW1lciBlcnJvci4KLQkJCSovCi0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJPcnBoYW5lZCBSTEUgY29kZSBhdCBzdGFydCIpOwotCQkJUHlCdWZmZXJfUmVsZWFzZSgmcGluKTsKLQkJCVB5X0RFQ1JFRihydik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlPVVRCWVRFKFJVTkNIQVIpOwotCX0gZWxzZSB7Ci0JCU9VVEJZVEUoaW5fYnl0ZSk7Ci0JfQorICAgIGlmIChpbl9ieXRlID09IFJVTkNIQVIpIHsKKyAgICAgICAgSU5CWVRFKGluX3JlcGVhdCk7CisgICAgICAgIGlmIChpbl9yZXBlYXQgIT0gMCkgeworICAgICAgICAgICAgLyogTm90ZSBFcnJvciwgbm90IEluY29tcGxldGUgKHdoaWNoIGlzIGF0IHRoZSBlbmQKKyAgICAgICAgICAgICoqIG9mIHRoZSBzdHJpbmcgb25seSkuIFRoaXMgaXMgYSBwcm9ncmFtbWVyIGVycm9yLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIk9ycGhhbmVkIFJMRSBjb2RlIGF0IHN0YXJ0Iik7CisgICAgICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwaW4pOworICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIE9VVEJZVEUoUlVOQ0hBUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgT1VUQllURShpbl9ieXRlKTsKKyAgICB9CiAKLQl3aGlsZSggaW5fbGVuID4gMCApIHsKLQkJSU5CWVRFKGluX2J5dGUpOworICAgIHdoaWxlKCBpbl9sZW4gPiAwICkgeworICAgICAgICBJTkJZVEUoaW5fYnl0ZSk7CiAKLQkJaWYgKGluX2J5dGUgPT0gUlVOQ0hBUikgewotCQkJSU5CWVRFKGluX3JlcGVhdCk7Ci0JCQlpZiAoIGluX3JlcGVhdCA9PSAwICkgewotCQkJCS8qIEp1c3QgYW4gZXNjYXBlZCBSVU5DSEFSIHZhbHVlICovCi0JCQkJT1VUQllURShSVU5DSEFSKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogUGljayB1cCB2YWx1ZSBhbmQgb3V0cHV0IGEgc2VxdWVuY2Ugb2YgaXQgKi8KLQkJCQlpbl9ieXRlID0gb3V0X2RhdGFbLTFdOwotCQkJCXdoaWxlICggLS1pbl9yZXBlYXQgPiAwICkKLQkJCQkJT1VUQllURShpbl9ieXRlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIE5vcm1hbCBieXRlICovCi0JCQlPVVRCWVRFKGluX2J5dGUpOwotCQl9Ci0JfQotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZydiwKLQkJCSAgIChvdXRfZGF0YSAtCi0JCQkgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0JCVB5X0RFQ1JFRihydik7Ci0JCXJ2ID0gTlVMTDsKLQl9Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGluKTsKLQlyZXR1cm4gcnY7CisgICAgICAgIGlmIChpbl9ieXRlID09IFJVTkNIQVIpIHsKKyAgICAgICAgICAgIElOQllURShpbl9yZXBlYXQpOworICAgICAgICAgICAgaWYgKCBpbl9yZXBlYXQgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAvKiBKdXN0IGFuIGVzY2FwZWQgUlVOQ0hBUiB2YWx1ZSAqLworICAgICAgICAgICAgICAgIE9VVEJZVEUoUlVOQ0hBUik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFBpY2sgdXAgdmFsdWUgYW5kIG91dHB1dCBhIHNlcXVlbmNlIG9mIGl0ICovCisgICAgICAgICAgICAgICAgaW5fYnl0ZSA9IG91dF9kYXRhWy0xXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIC0taW5fcmVwZWF0ID4gMCApCisgICAgICAgICAgICAgICAgICAgIE9VVEJZVEUoaW5fYnl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBOb3JtYWwgYnl0ZSAqLworICAgICAgICAgICAgT1VUQllURShpbl9ieXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsCisgICAgICAgICAgICAgICAgICAgICAgIChvdXRfZGF0YSAtCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhydikpKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgcnYgPSBOVUxMOworICAgIH0KKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwaW4pOworICAgIHJldHVybiBydjsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19jcmNfaHF4LApAQCAtODYyLDIyICs4NjIsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9jcmNfaHF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGluOwotCXVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwotCXVuc2lnbmVkIGludCBjcmM7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlfYnVmZmVyIHBpbjsKKyAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgY3JjOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyppOmNyY19ocXgiLCAmcGluLCAmY3JjKSApCi0JCXJldHVybiBOVUxMOwotCWJpbl9kYXRhID0gcGluLmJ1ZjsKLQlsZW4gPSBwaW4ubGVuOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqaTpjcmNfaHF4IiwgJnBpbiwgJmNyYykgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBiaW5fZGF0YSA9IHBpbi5idWY7CisgICAgbGVuID0gcGluLmxlbjsKIAotCXdoaWxlKGxlbi0tID4gMCkgewotCQljcmM9KChjcmM8PDgpJjB4ZmYwMCleY3JjdGFiX2hxeFsoKGNyYz4+OCkmMHhmZileKmJpbl9kYXRhKytdOwotCX0KKyAgICB3aGlsZShsZW4tLSA+IDApIHsKKyAgICAgICAgY3JjPSgoY3JjPDw4KSYweGZmMDApXmNyY3RhYl9ocXhbKChjcmM+PjgpJjB4ZmYpXipiaW5fZGF0YSsrXTsKKyAgICB9CiAKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwaW4pOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgY3JjKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwaW4pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgY3JjKTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19jcmMzMiwKQEAgLTg5NSw3ICs4OTUsNyBAQAogICAgIGludCBzaWduZWRfdmFsOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnxJOmNyYzMyIiwgJnBidWYsICZjcmMzMnZhbCkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIC8qIEluIFB5dGhvbiAyLnggd2UgcmV0dXJuIGEgc2lnbmVkIGludGVnZXIgcmVnYXJkbGVzcyBvZiBuYXRpdmUgcGxhdGZvcm0KICAgICAgKiBsb25nIHNpemUgKHRoZSAzMmJpdCB1bnNpZ25lZCBsb25nIGlzIHRyZWF0ZWQgYXMgMzItYml0IHNpZ25lZCBhbmQgc2lnbgogICAgICAqIGV4dGVuZGVkIGludG8gYSA2NC1iaXQgbG9uZyBpbnNpZGUgdGhlIGludGVnZXIgb2JqZWN0KS4gIDMuMCBkb2VzIHRoZQpAQCAtMTAyOCwyNSArMTAyOCwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX2NyYzMyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsgLyogQnkgSmltIEFobHN0cm9tOyBBbGwgcmlnaHRzIHRyYW5zZmVycmVkIHRvIENOUkkgKi8KLQlQeV9idWZmZXIgcGJpbjsKLQl1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKLQl1bnNpZ25lZCBpbnQgY3JjID0gMFU7CS8qIGluaXRpYWwgdmFsdWUgb2YgQ1JDICovCi0JUHlfc3NpemVfdCBsZW47Ci0JaW50IHJlc3VsdDsKKyAgICBQeV9idWZmZXIgcGJpbjsKKyAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgY3JjID0gMFU7ICAgICAgLyogaW5pdGlhbCB2YWx1ZSBvZiBDUkMgKi8KKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBpbnQgcmVzdWx0OwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8STpjcmMzMiIsICZwYmluLCAmY3JjKSApCi0JCXJldHVybiBOVUxMOwotCWJpbl9kYXRhID0gcGJpbi5idWY7Ci0JbGVuID0gcGJpbi5sZW47CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8STpjcmMzMiIsICZwYmluLCAmY3JjKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJpbl9kYXRhID0gcGJpbi5idWY7CisgICAgbGVuID0gcGJpbi5sZW47CiAKLQljcmMgPSB+IGNyYzsKLQl3aGlsZSAobGVuLS0gPiAwKQotCQljcmMgPSBjcmNfMzJfdGFiWyhjcmMgXiAqYmluX2RhdGErKykgJiAweGZmVV0gXiAoY3JjID4+IDgpOwotCQkvKiBOb3RlOiAgKGNyYyA+PiA4KSBNVVNUIHplcm8gZmlsbCBvbiBsZWZ0ICovCisgICAgY3JjID0gfiBjcmM7CisgICAgd2hpbGUgKGxlbi0tID4gMCkKKyAgICAgICAgY3JjID0gY3JjXzMyX3RhYlsoY3JjIF4gKmJpbl9kYXRhKyspICYgMHhmZlVdIF4gKGNyYyA+PiA4KTsKKyAgICAgICAgLyogTm90ZTogIChjcmMgPj4gOCkgTVVTVCB6ZXJvIGZpbGwgb24gbGVmdCAqLwogCi0JcmVzdWx0ID0gKGludCkoY3JjIF4gMHhGRkZGRkZGRlUpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBiaW4pOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIHJlc3VsdCA9IChpbnQpKGNyYyBeIDB4RkZGRkZGRkZVKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYmluKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzdWx0KTsKIH0KICNlbmRpZiAgLyogVVNFX1pMSUJfQ1JDMzIgKi8KIApAQCAtMTA1NCw0MyArMTA1NCw0MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX2hleGxpZnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYXJnOwotCWNoYXIqIGFyZ2J1ZjsKLQlQeV9zc2l6ZV90IGFyZ2xlbjsKLQlQeU9iamVjdCAqcmV0dmFsOwotCWNoYXIqIHJldGJ1ZjsKLQlQeV9zc2l6ZV90IGksIGo7CisgICAgUHlfYnVmZmVyIHBhcmc7CisgICAgY2hhciogYXJnYnVmOworICAgIFB5X3NzaXplX3QgYXJnbGVuOworICAgIFB5T2JqZWN0ICpyZXR2YWw7CisgICAgY2hhciogcmV0YnVmOworICAgIFB5X3NzaXplX3QgaSwgajsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6YjJhX2hleCIsICZwYXJnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnYnVmID0gcGFyZy5idWY7Ci0JYXJnbGVuID0gcGFyZy5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpiMmFfaGV4IiwgJnBhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmdidWYgPSBwYXJnLmJ1ZjsKKyAgICBhcmdsZW4gPSBwYXJnLmxlbjsKIAotCWFzc2VydChhcmdsZW4gPj0gMCk7Ci0JaWYgKGFyZ2xlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYXJnKTsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQorICAgIGFzc2VydChhcmdsZW4gPj0gMCk7CisgICAgaWYgKGFyZ2xlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYXJnKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQogCi0JcmV0dmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYXJnbGVuKjIpOwotCWlmICghcmV0dmFsKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBhcmcpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0YnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJldHZhbCk7CisgICAgcmV0dmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYXJnbGVuKjIpOworICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0YnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJldHZhbCk7CiAKLQkvKiBtYWtlIGhleCB2ZXJzaW9uIG9mIHN0cmluZywgdGFrZW4gZnJvbSBzaGFtb2R1bGUuYyAqLwotCWZvciAoaT1qPTA7IGkgPCBhcmdsZW47IGkrKykgewotCQljaGFyIGM7Ci0JCWMgPSAoYXJnYnVmW2ldID4+IDQpICYgMHhmOwotCQljID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7Ci0JCXJldGJ1ZltqKytdID0gYzsKLQkJYyA9IGFyZ2J1ZltpXSAmIDB4ZjsKLQkJYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwotCQlyZXRidWZbaisrXSA9IGM7Ci0JfQotCVB5QnVmZmVyX1JlbGVhc2UoJnBhcmcpOwotCXJldHVybiByZXR2YWw7CisgICAgLyogbWFrZSBoZXggdmVyc2lvbiBvZiBzdHJpbmcsIHRha2VuIGZyb20gc2hhbW9kdWxlLmMgKi8KKyAgICBmb3IgKGk9aj0wOyBpIDwgYXJnbGVuOyBpKyspIHsKKyAgICAgICAgY2hhciBjOworICAgICAgICBjID0gKGFyZ2J1ZltpXSA+PiA0KSAmIDB4ZjsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICByZXRidWZbaisrXSA9IGM7CisgICAgICAgIGMgPSBhcmdidWZbaV0gJiAweGY7CisgICAgICAgIGMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKKyAgICAgICAgcmV0YnVmW2orK10gPSBjOworICAgIH0KKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYXJnKTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2hleGxpZnksCkBAIC0xMTAyLDY5ICsxMTAyLDY5IEBACiBzdGF0aWMgaW50CiB0b19pbnQoaW50IGMpCiB7Ci0JaWYgKGlzZGlnaXQoYykpCi0JCXJldHVybiBjIC0gJzAnOwotCWVsc2UgewotCQlpZiAoaXN1cHBlcihjKSkKLQkJCWMgPSB0b2xvd2VyKGMpOwotCQlpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCi0JCQlyZXR1cm4gYyAtICdhJyArIDEwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgaWYgKGlzZGlnaXQoYykpCisgICAgICAgIHJldHVybiBjIC0gJzAnOworICAgIGVsc2UgeworICAgICAgICBpZiAoaXN1cHBlcihjKSkKKyAgICAgICAgICAgIGMgPSB0b2xvd2VyKGMpOworICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX3VuaGV4bGlmeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBhcmc7Ci0JY2hhciogYXJnYnVmOwotCVB5X3NzaXplX3QgYXJnbGVuOwotCVB5T2JqZWN0ICpyZXR2YWw7Ci0JY2hhciogcmV0YnVmOwotCVB5X3NzaXplX3QgaSwgajsKKyAgICBQeV9idWZmZXIgcGFyZzsKKyAgICBjaGFyKiBhcmdidWY7CisgICAgUHlfc3NpemVfdCBhcmdsZW47CisgICAgUHlPYmplY3QgKnJldHZhbDsKKyAgICBjaGFyKiByZXRidWY7CisgICAgUHlfc3NpemVfdCBpLCBqOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjphMmJfaGV4IiwgJnBhcmcpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmdidWYgPSBwYXJnLmJ1ZjsKLQlhcmdsZW4gPSBwYXJnLmxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOmEyYl9oZXgiLCAmcGFyZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZ2J1ZiA9IHBhcmcuYnVmOworICAgIGFyZ2xlbiA9IHBhcmcubGVuOwogCi0JYXNzZXJ0KGFyZ2xlbiA+PSAwKTsKKyAgICBhc3NlcnQoYXJnbGVuID49IDApOwogCi0JLyogWFhYIFdoYXQgc2hvdWxkIHdlIGRvIGFib3V0IHN0cmluZ3Mgd2l0aCBhbiBvZGQgbGVuZ3RoPyAgU2hvdWxkCi0JICogd2UgYWRkIGFuIGltcGxpY2l0IGxlYWRpbmcgemVybywgb3IgYSB0cmFpbGluZyB6ZXJvPyAgRm9yIG5vdywKLQkgKiByYWlzZSBhbiBleGNlcHRpb24uCi0JICovCi0JaWYgKGFyZ2xlbiAlIDIpIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGFyZyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPZGQtbGVuZ3RoIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogWFhYIFdoYXQgc2hvdWxkIHdlIGRvIGFib3V0IHN0cmluZ3Mgd2l0aCBhbiBvZGQgbGVuZ3RoPyAgU2hvdWxkCisgICAgICogd2UgYWRkIGFuIGltcGxpY2l0IGxlYWRpbmcgemVybywgb3IgYSB0cmFpbGluZyB6ZXJvPyAgRm9yIG5vdywKKyAgICAgKiByYWlzZSBhbiBleGNlcHRpb24uCisgICAgICovCisgICAgaWYgKGFyZ2xlbiAlIDIpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGFyZyk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPZGQtbGVuZ3RoIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR2YWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAoYXJnbGVuLzIpKTsKLQlpZiAoIXJldHZhbCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYXJnKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldGJ1ZiA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXR2YWwpOworICAgIHJldHZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChhcmdsZW4vMikpOworICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0YnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJldHZhbCk7CiAKLQlmb3IgKGk9aj0wOyBpIDwgYXJnbGVuOyBpICs9IDIpIHsKLQkJaW50IHRvcCA9IHRvX2ludChQeV9DSEFSTUFTSyhhcmdidWZbaV0pKTsKLQkJaW50IGJvdCA9IHRvX2ludChQeV9DSEFSTUFTSyhhcmdidWZbaSsxXSkpOwotCQlpZiAodG9wID09IC0xIHx8IGJvdCA9PSAtMSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIk5vbi1oZXhhZGVjaW1hbCBkaWdpdCBmb3VuZCIpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCXJldGJ1ZltqKytdID0gKHRvcCA8PCA0KSArIGJvdDsKLQl9Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGFyZyk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICBmb3IgKGk9aj0wOyBpIDwgYXJnbGVuOyBpICs9IDIpIHsKKyAgICAgICAgaW50IHRvcCA9IHRvX2ludChQeV9DSEFSTUFTSyhhcmdidWZbaV0pKTsKKyAgICAgICAgaW50IGJvdCA9IHRvX2ludChQeV9DSEFSTUFTSyhhcmdidWZbaSsxXSkpOworICAgICAgICBpZiAodG9wID09IC0xIHx8IGJvdCA9PSAtMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLWhleGFkZWNpbWFsIGRpZ2l0IGZvdW5kIik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgcmV0YnVmW2orK10gPSAodG9wIDw8IDQpICsgYm90OworICAgIH0KKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYXJnKTsKKyAgICByZXR1cm4gcmV0dmFsOwogCiAgIGZpbmFsbHk6Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGFyZyk7Ci0JUHlfREVDUkVGKHJldHZhbCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGFyZyk7CisgICAgUHlfREVDUkVGKHJldHZhbCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfdW5oZXhsaWZ5LApAQCAtMTE5Myw5NiArMTE5Myw5NiBAQAogc3RhdGljIFB5T2JqZWN0KgogYmluYXNjaWlfYTJiX3FwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlQeV9zc2l6ZV90IGluLCBvdXQ7Ci0JY2hhciBjaDsKLQlQeV9idWZmZXIgcGRhdGE7Ci0JdW5zaWduZWQgY2hhciAqZGF0YSwgKm9kYXRhOwotCVB5X3NzaXplX3QgZGF0YWxlbiA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YSIsICJoZWFkZXIiLCBOVUxMfTsKLQlpbnQgaGVhZGVyID0gMDsKKyAgICBQeV9zc2l6ZV90IGluLCBvdXQ7CisgICAgY2hhciBjaDsKKyAgICBQeV9idWZmZXIgcGRhdGE7CisgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgKm9kYXRhOworICAgIFB5X3NzaXplX3QgZGF0YWxlbiA9IDA7CisgICAgUHlPYmplY3QgKnJ2OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YSIsICJoZWFkZXIiLCBOVUxMfTsKKyAgICBpbnQgaGVhZGVyID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMqfGkiLCBrd2xpc3QsICZwZGF0YSwKLQkgICAgICAmaGVhZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YSA9IHBkYXRhLmJ1ZjsKLQlkYXRhbGVuID0gcGRhdGEubGVuOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMqfGkiLCBrd2xpc3QsICZwZGF0YSwKKyAgICAgICAgICAmaGVhZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YSA9IHBkYXRhLmJ1ZjsKKyAgICBkYXRhbGVuID0gcGRhdGEubGVuOwogCi0JLyogV2UgYWxsb2NhdGUgdGhlIG91dHB1dCBzYW1lIHNpemUgYXMgaW5wdXQsIHRoaXMgaXMgb3ZlcmtpbGwuCi0JICogVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIHVzZWQgY2FsbG9jKCkgc28gd2UnbGwgemVybyBvdXQgdGhlCi0JICogbWVtb3J5IGhlcmUgdG9vLCBzaW5jZSBQeU1lbV9NYWxsb2MoKSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdC4KLQkgKi8KLQlvZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIFB5TWVtX01hbGxvYyhkYXRhbGVuKTsKLQlpZiAob2RhdGEgPT0gTlVMTCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltZW1zZXQob2RhdGEsIDAsIGRhdGFsZW4pOworICAgIC8qIFdlIGFsbG9jYXRlIHRoZSBvdXRwdXQgc2FtZSBzaXplIGFzIGlucHV0LCB0aGlzIGlzIG92ZXJraWxsLgorICAgICAqIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB1c2VkIGNhbGxvYygpIHNvIHdlJ2xsIHplcm8gb3V0IHRoZQorICAgICAqIG1lbW9yeSBoZXJlIHRvbywgc2luY2UgUHlNZW1fTWFsbG9jKCkgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQuCisgICAgICovCisgICAgb2RhdGEgPSAodW5zaWduZWQgY2hhciAqKSBQeU1lbV9NYWxsb2MoZGF0YWxlbik7CisgICAgaWYgKG9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtc2V0KG9kYXRhLCAwLCBkYXRhbGVuKTsKIAotCWluID0gb3V0ID0gMDsKLQl3aGlsZSAoaW4gPCBkYXRhbGVuKSB7Ci0JCWlmIChkYXRhW2luXSA9PSAnPScpIHsKLQkJCWluKys7Ci0JCQlpZiAoaW4gPj0gZGF0YWxlbikgYnJlYWs7Ci0JCQkvKiBTb2Z0IGxpbmUgYnJlYWtzICovCi0JCQlpZiAoKGRhdGFbaW5dID09ICdcbicpIHx8IChkYXRhW2luXSA9PSAnXHInKSkgewotCQkJCWlmIChkYXRhW2luXSAhPSAnXG4nKSB7Ci0JCQkJCXdoaWxlIChpbiA8IGRhdGFsZW4gJiYgZGF0YVtpbl0gIT0gJ1xuJykgaW4rKzsKLQkJCQl9Ci0JCQkJaWYgKGluIDwgZGF0YWxlbikgaW4rKzsKLQkJCX0KLQkJCWVsc2UgaWYgKGRhdGFbaW5dID09ICc9JykgewotCQkJCS8qIGJyb2tlbiBjYXNlIGZyb20gYnJva2VuIHB5dGhvbiBxcCAqLwotCQkJCW9kYXRhW291dCsrXSA9ICc9JzsKLQkJCQlpbisrOwotCQkJfQotCQkJZWxzZSBpZiAoKChkYXRhW2luXSA+PSAnQScgJiYgZGF0YVtpbl0gPD0gJ0YnKSB8fAotCQkJICAgICAgICAgIChkYXRhW2luXSA+PSAnYScgJiYgZGF0YVtpbl0gPD0gJ2YnKSB8fAotCQkJCSAgKGRhdGFbaW5dID49ICcwJyAmJiBkYXRhW2luXSA8PSAnOScpKSAmJgotCQkJICAgICAgICAgKChkYXRhW2luKzFdID49ICdBJyAmJiBkYXRhW2luKzFdIDw9ICdGJykgfHwKLQkJCQkgIChkYXRhW2luKzFdID49ICdhJyAmJiBkYXRhW2luKzFdIDw9ICdmJykgfHwKLQkJCQkgIChkYXRhW2luKzFdID49ICcwJyAmJiBkYXRhW2luKzFdIDw9ICc5JykpKSB7Ci0JCQkJLyogaGV4dmFsICovCi0JCQkJY2ggPSBoZXh2YWwoZGF0YVtpbl0pIDw8IDQ7Ci0JCQkJaW4rKzsKLQkJCQljaCB8PSBoZXh2YWwoZGF0YVtpbl0pOwotCQkJCWluKys7Ci0JCQkJb2RhdGFbb3V0KytdID0gY2g7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCSAgb2RhdGFbb3V0KytdID0gJz0nOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGhlYWRlciAmJiBkYXRhW2luXSA9PSAnXycpIHsKLQkJCW9kYXRhW291dCsrXSA9ICcgJzsKLQkJCWluKys7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvZGF0YVtvdXRdID0gZGF0YVtpbl07Ci0JCQlpbisrOwotCQkJb3V0Kys7Ci0JCX0KLQl9Ci0JaWYgKChydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopb2RhdGEsIG91dCkpID09IE5VTEwpIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQlQeU1lbV9GcmVlKG9kYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQlQeU1lbV9GcmVlKG9kYXRhKTsKLQlyZXR1cm4gcnY7CisgICAgaW4gPSBvdXQgPSAwOworICAgIHdoaWxlIChpbiA8IGRhdGFsZW4pIHsKKyAgICAgICAgaWYgKGRhdGFbaW5dID09ICc9JykgeworICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgIGlmIChpbiA+PSBkYXRhbGVuKSBicmVhazsKKyAgICAgICAgICAgIC8qIFNvZnQgbGluZSBicmVha3MgKi8KKyAgICAgICAgICAgIGlmICgoZGF0YVtpbl0gPT0gJ1xuJykgfHwgKGRhdGFbaW5dID09ICdccicpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGFbaW5dICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGluIDwgZGF0YWxlbiAmJiBkYXRhW2luXSAhPSAnXG4nKSBpbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW4gPCBkYXRhbGVuKSBpbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZGF0YVtpbl0gPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgLyogYnJva2VuIGNhc2UgZnJvbSBicm9rZW4gcHl0aG9uIHFwICovCisgICAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJz0nOworICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoKGRhdGFbaW5dID49ICdBJyAmJiBkYXRhW2luXSA8PSAnRicpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKGRhdGFbaW5dID49ICdhJyAmJiBkYXRhW2luXSA8PSAnZicpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKGRhdGFbaW5dID49ICcwJyAmJiBkYXRhW2luXSA8PSAnOScpKSAmJgorICAgICAgICAgICAgICAgICAgICAgKChkYXRhW2luKzFdID49ICdBJyAmJiBkYXRhW2luKzFdIDw9ICdGJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoZGF0YVtpbisxXSA+PSAnYScgJiYgZGF0YVtpbisxXSA8PSAnZicpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKGRhdGFbaW4rMV0gPj0gJzAnICYmIGRhdGFbaW4rMV0gPD0gJzknKSkpIHsKKyAgICAgICAgICAgICAgICAvKiBoZXh2YWwgKi8KKyAgICAgICAgICAgICAgICBjaCA9IGhleHZhbChkYXRhW2luXSkgPDwgNDsKKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgICAgIGNoIHw9IGhleHZhbChkYXRhW2luXSk7CisgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgICAgICBvZGF0YVtvdXQrK10gPSBjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBvZGF0YVtvdXQrK10gPSAnPSc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaGVhZGVyICYmIGRhdGFbaW5dID09ICdfJykgeworICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJyAnOworICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG9kYXRhW291dF0gPSBkYXRhW2luXTsKKyAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilvZGF0YSwgb3V0KSkgPT0gTlVMTCkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgIFB5TWVtX0ZyZWUob2RhdGEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIFB5TWVtX0ZyZWUob2RhdGEpOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIGludAogdG9faGV4ICh1bnNpZ25lZCBjaGFyIGNoLCB1bnNpZ25lZCBjaGFyICpzKQogewotCXVuc2lnbmVkIGludCB1dmFsdWUgPSBjaDsKKyAgICB1bnNpZ25lZCBpbnQgdXZhbHVlID0gY2g7CiAKLQlzWzFdID0gIjAxMjM0NTY3ODlBQkNERUYiW3V2YWx1ZSAlIDE2XTsKLQl1dmFsdWUgPSAodXZhbHVlIC8gMTYpOwotCXNbMF0gPSAiMDEyMzQ1Njc4OUFCQ0RFRiJbdXZhbHVlICUgMTZdOwotCXJldHVybiAwOworICAgIHNbMV0gPSAiMDEyMzQ1Njc4OUFCQ0RFRiJbdXZhbHVlICUgMTZdOworICAgIHV2YWx1ZSA9ICh1dmFsdWUgLyAxNik7CisgICAgc1swXSA9ICIwMTIzNDU2Nzg5QUJDREVGIlt1dmFsdWUgJSAxNl07CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfYjJhX3FwLApAQCAtMTI5OSwyMTAgKzEyOTksMjEwIEBACiBzdGF0aWMgUHlPYmplY3QqCiBiaW5hc2NpaV9iMmFfcXAgKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlQeV9zc2l6ZV90IGluLCBvdXQ7Ci0JUHlfYnVmZmVyIHBkYXRhOwotCXVuc2lnbmVkIGNoYXIgKmRhdGEsICpvZGF0YTsKLQlQeV9zc2l6ZV90IGRhdGFsZW4gPSAwLCBvZGF0YWxlbiA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCXVuc2lnbmVkIGludCBsaW5lbGVuID0gMDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGEiLCAicXVvdGV0YWJzIiwgImlzdGV4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIiwgTlVMTH07Ci0JaW50IGlzdGV4dCA9IDE7Ci0JaW50IHF1b3RldGFicyA9IDA7Ci0JaW50IGhlYWRlciA9IDA7Ci0JdW5zaWduZWQgY2hhciBjaDsKLQlpbnQgY3JsZiA9IDA7Ci0JdW5zaWduZWQgY2hhciAqcDsKKyAgICBQeV9zc2l6ZV90IGluLCBvdXQ7CisgICAgUHlfYnVmZmVyIHBkYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsICpvZGF0YTsKKyAgICBQeV9zc2l6ZV90IGRhdGFsZW4gPSAwLCBvZGF0YWxlbiA9IDA7CisgICAgUHlPYmplY3QgKnJ2OworICAgIHVuc2lnbmVkIGludCBsaW5lbGVuID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGEiLCAicXVvdGV0YWJzIiwgImlzdGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXIiLCBOVUxMfTsKKyAgICBpbnQgaXN0ZXh0ID0gMTsKKyAgICBpbnQgcXVvdGV0YWJzID0gMDsKKyAgICBpbnQgaGVhZGVyID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgIGludCBjcmxmID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyICpwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyp8aWlpIiwga3dsaXN0LCAmcGRhdGEsCi0JICAgICAgJnF1b3RldGFicywgJmlzdGV4dCwgJmhlYWRlcikpCi0JCXJldHVybiBOVUxMOwotCWRhdGEgPSBwZGF0YS5idWY7Ci0JZGF0YWxlbiA9IHBkYXRhLmxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzKnxpaWkiLCBrd2xpc3QsICZwZGF0YSwKKyAgICAgICAgICAmcXVvdGV0YWJzLCAmaXN0ZXh0LCAmaGVhZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YSA9IHBkYXRhLmJ1ZjsKKyAgICBkYXRhbGVuID0gcGRhdGEubGVuOwogCi0JLyogU2VlIGlmIHRoaXMgc3RyaW5nIGlzIHVzaW5nIENSTEYgbGluZSBlbmRzICovCi0JLyogWFhYOiB0aGlzIGZ1bmN0aW9uIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY29udmVydGluZyBhbGwgb2YKLQkgKiB0aGUgZW5kIG9mIGxpbmVzIHRvIGJlIHRoZSBzYW1lIGRlcGVuZGluZyBvbiB0aGlzIGRldGVjdGlvbgotCSAqIGhlcmUgKi8KLQlwID0gKHVuc2lnbmVkIGNoYXIgKikgbWVtY2hyKGRhdGEsICdcbicsIGRhdGFsZW4pOwotCWlmICgocCAhPSBOVUxMKSAmJiAocCA+IGRhdGEpICYmICgqKHAtMSkgPT0gJ1xyJykpCi0JCWNybGYgPSAxOworICAgIC8qIFNlZSBpZiB0aGlzIHN0cmluZyBpcyB1c2luZyBDUkxGIGxpbmUgZW5kcyAqLworICAgIC8qIFhYWDogdGhpcyBmdW5jdGlvbiBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNvbnZlcnRpbmcgYWxsIG9mCisgICAgICogdGhlIGVuZCBvZiBsaW5lcyB0byBiZSB0aGUgc2FtZSBkZXBlbmRpbmcgb24gdGhpcyBkZXRlY3Rpb24KKyAgICAgKiBoZXJlICovCisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIG1lbWNocihkYXRhLCAnXG4nLCBkYXRhbGVuKTsKKyAgICBpZiAoKHAgIT0gTlVMTCkgJiYgKHAgPiBkYXRhKSAmJiAoKihwLTEpID09ICdccicpKQorICAgICAgICBjcmxmID0gMTsKIAotCS8qIEZpcnN0LCBzY2FuIHRvIHNlZSBob3cgbWFueSBjaGFyYWN0ZXJzIG5lZWQgdG8gYmUgZW5jb2RlZCAqLwotCWluID0gMDsKLQl3aGlsZSAoaW4gPCBkYXRhbGVuKSB7Ci0JCWlmICgoZGF0YVtpbl0gPiAxMjYpIHx8Ci0JCSAgICAoZGF0YVtpbl0gPT0gJz0nKSB8fAotCQkgICAgKGhlYWRlciAmJiBkYXRhW2luXSA9PSAnXycpIHx8Ci0JCSAgICAoKGRhdGFbaW5dID09ICcuJykgJiYgKGxpbmVsZW4gPT0gMCkgJiYKLQkJICAgICAoZGF0YVtpbisxXSA9PSAnXG4nIHx8IGRhdGFbaW4rMV0gPT0gJ1xyJyB8fCBkYXRhW2luKzFdID09IDApKSB8fAotCQkgICAgKCFpc3RleHQgJiYgKChkYXRhW2luXSA9PSAnXHInKSB8fCAoZGF0YVtpbl0gPT0gJ1xuJykpKSB8fAotCQkgICAgKChkYXRhW2luXSA9PSAnXHQnIHx8IGRhdGFbaW5dID09ICcgJykgJiYgKGluICsgMSA9PSBkYXRhbGVuKSkgfHwKLQkJICAgICgoZGF0YVtpbl0gPCAzMykgJiYKLQkJICAgICAoZGF0YVtpbl0gIT0gJ1xyJykgJiYgKGRhdGFbaW5dICE9ICdcbicpICYmCi0JCSAgICAgKHF1b3RldGFicyB8fAotCQkgICAgIAkoIXF1b3RldGFicyAmJiAoKGRhdGFbaW5dICE9ICdcdCcpICYmIChkYXRhW2luXSAhPSAnICcpKSkpKSkKLQkJewotCQkJaWYgKChsaW5lbGVuICsgMykgPj0gTUFYTElORVNJWkUpIHsKLQkJCQlsaW5lbGVuID0gMDsKLQkJCQlpZiAoY3JsZikKLQkJCQkJb2RhdGFsZW4gKz0gMzsKLQkJCQllbHNlCi0JCQkJCW9kYXRhbGVuICs9IDI7Ci0JCQl9Ci0JCQlsaW5lbGVuICs9IDM7Ci0JCQlvZGF0YWxlbiArPSAzOwotCQkJaW4rKzsKLQkJfQotCQllbHNlIHsKLQkJICAJaWYgKGlzdGV4dCAmJgotCQkJICAgICgoZGF0YVtpbl0gPT0gJ1xuJykgfHwKLQkJCSAgICAgKChpbisxIDwgZGF0YWxlbikgJiYgKGRhdGFbaW5dID09ICdccicpICYmCi0JCQkgICAgIChkYXRhW2luKzFdID09ICdcbicpKSkpCi0JCQl7Ci0JCQkgIAlsaW5lbGVuID0gMDsKLQkJCQkvKiBQcm90ZWN0IGFnYWluc3Qgd2hpdGVzcGFjZSBvbiBlbmQgb2YgbGluZSAqLwotCQkJCWlmIChpbiAmJiAoKGRhdGFbaW4tMV0gPT0gJyAnKSB8fCAoZGF0YVtpbi0xXSA9PSAnXHQnKSkpCi0JCQkJCW9kYXRhbGVuICs9IDI7Ci0JCQkJaWYgKGNybGYpCi0JCQkJCW9kYXRhbGVuICs9IDI7Ci0JCQkJZWxzZQotCQkJCQlvZGF0YWxlbiArPSAxOwotCQkJCWlmIChkYXRhW2luXSA9PSAnXHInKQotCQkJCQlpbiArPSAyOwotCQkJCWVsc2UKLQkJCQkJaW4rKzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICgoaW4gKyAxICE9IGRhdGFsZW4pICYmCi0JCQkJICAgIChkYXRhW2luKzFdICE9ICdcbicpICYmCi0JCQkJICAgIChsaW5lbGVuICsgMSkgPj0gTUFYTElORVNJWkUpIHsKLQkJCQkJbGluZWxlbiA9IDA7Ci0JCQkJCWlmIChjcmxmKQotCQkJCQkJb2RhdGFsZW4gKz0gMzsKLQkJCQkJZWxzZQotCQkJCQkJb2RhdGFsZW4gKz0gMjsKLQkJCQl9Ci0JCQkJbGluZWxlbisrOwotCQkJCW9kYXRhbGVuKys7Ci0JCQkJaW4rKzsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBGaXJzdCwgc2NhbiB0byBzZWUgaG93IG1hbnkgY2hhcmFjdGVycyBuZWVkIHRvIGJlIGVuY29kZWQgKi8KKyAgICBpbiA9IDA7CisgICAgd2hpbGUgKGluIDwgZGF0YWxlbikgeworICAgICAgICBpZiAoKGRhdGFbaW5dID4gMTI2KSB8fAorICAgICAgICAgICAgKGRhdGFbaW5dID09ICc9JykgfHwKKyAgICAgICAgICAgIChoZWFkZXIgJiYgZGF0YVtpbl0gPT0gJ18nKSB8fAorICAgICAgICAgICAgKChkYXRhW2luXSA9PSAnLicpICYmIChsaW5lbGVuID09IDApICYmCisgICAgICAgICAgICAgKGRhdGFbaW4rMV0gPT0gJ1xuJyB8fCBkYXRhW2luKzFdID09ICdccicgfHwgZGF0YVtpbisxXSA9PSAwKSkgfHwKKyAgICAgICAgICAgICghaXN0ZXh0ICYmICgoZGF0YVtpbl0gPT0gJ1xyJykgfHwgKGRhdGFbaW5dID09ICdcbicpKSkgfHwKKyAgICAgICAgICAgICgoZGF0YVtpbl0gPT0gJ1x0JyB8fCBkYXRhW2luXSA9PSAnICcpICYmIChpbiArIDEgPT0gZGF0YWxlbikpIHx8CisgICAgICAgICAgICAoKGRhdGFbaW5dIDwgMzMpICYmCisgICAgICAgICAgICAgKGRhdGFbaW5dICE9ICdccicpICYmIChkYXRhW2luXSAhPSAnXG4nKSAmJgorICAgICAgICAgICAgIChxdW90ZXRhYnMgfHwKKyAgICAgICAgICAgICghcXVvdGV0YWJzICYmICgoZGF0YVtpbl0gIT0gJ1x0JykgJiYgKGRhdGFbaW5dICE9ICcgJykpKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGxpbmVsZW4gKyAzKSA+PSBNQVhMSU5FU0laRSkgeworICAgICAgICAgICAgICAgIGxpbmVsZW4gPSAwOworICAgICAgICAgICAgICAgIGlmIChjcmxmKQorICAgICAgICAgICAgICAgICAgICBvZGF0YWxlbiArPSAzOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFsZW4gKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmVsZW4gKz0gMzsKKyAgICAgICAgICAgIG9kYXRhbGVuICs9IDM7CisgICAgICAgICAgICBpbisrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGlzdGV4dCAmJgorICAgICAgICAgICAgICAgICgoZGF0YVtpbl0gPT0gJ1xuJykgfHwKKyAgICAgICAgICAgICAgICAgKChpbisxIDwgZGF0YWxlbikgJiYgKGRhdGFbaW5dID09ICdccicpICYmCisgICAgICAgICAgICAgICAgIChkYXRhW2luKzFdID09ICdcbicpKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGluZWxlbiA9IDA7CisgICAgICAgICAgICAgICAgLyogUHJvdGVjdCBhZ2FpbnN0IHdoaXRlc3BhY2Ugb24gZW5kIG9mIGxpbmUgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW4gJiYgKChkYXRhW2luLTFdID09ICcgJykgfHwgKGRhdGFbaW4tMV0gPT0gJ1x0JykpKQorICAgICAgICAgICAgICAgICAgICBvZGF0YWxlbiArPSAyOworICAgICAgICAgICAgICAgIGlmIChjcmxmKQorICAgICAgICAgICAgICAgICAgICBvZGF0YWxlbiArPSAyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFsZW4gKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YVtpbl0gPT0gJ1xyJykKKyAgICAgICAgICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKGluICsgMSAhPSBkYXRhbGVuKSAmJgorICAgICAgICAgICAgICAgICAgICAoZGF0YVtpbisxXSAhPSAnXG4nKSAmJgorICAgICAgICAgICAgICAgICAgICAobGluZWxlbiArIDEpID49IE1BWExJTkVTSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoY3JsZikKKyAgICAgICAgICAgICAgICAgICAgICAgIG9kYXRhbGVuICs9IDM7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG9kYXRhbGVuICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmVsZW4rKzsKKyAgICAgICAgICAgICAgICBvZGF0YWxlbisrOworICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBXZSBhbGxvY2F0ZSB0aGUgb3V0cHV0IHNhbWUgc2l6ZSBhcyBpbnB1dCwgdGhpcyBpcyBvdmVya2lsbC4KLQkgKiBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gdXNlZCBjYWxsb2MoKSBzbyB3ZSdsbCB6ZXJvIG91dCB0aGUKLQkgKiBtZW1vcnkgaGVyZSB0b28sIHNpbmNlIFB5TWVtX01hbGxvYygpIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0LgotCSAqLwotCW9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgUHlNZW1fTWFsbG9jKG9kYXRhbGVuKTsKLQlpZiAob2RhdGEgPT0gTlVMTCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltZW1zZXQob2RhdGEsIDAsIG9kYXRhbGVuKTsKKyAgICAvKiBXZSBhbGxvY2F0ZSB0aGUgb3V0cHV0IHNhbWUgc2l6ZSBhcyBpbnB1dCwgdGhpcyBpcyBvdmVya2lsbC4KKyAgICAgKiBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gdXNlZCBjYWxsb2MoKSBzbyB3ZSdsbCB6ZXJvIG91dCB0aGUKKyAgICAgKiBtZW1vcnkgaGVyZSB0b28sIHNpbmNlIFB5TWVtX01hbGxvYygpIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0LgorICAgICAqLworICAgIG9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgUHlNZW1fTWFsbG9jKG9kYXRhbGVuKTsKKyAgICBpZiAob2RhdGEgPT0gTlVMTCkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQob2RhdGEsIDAsIG9kYXRhbGVuKTsKIAotCWluID0gb3V0ID0gbGluZWxlbiA9IDA7Ci0Jd2hpbGUgKGluIDwgZGF0YWxlbikgewotCQlpZiAoKGRhdGFbaW5dID4gMTI2KSB8fAotCQkgICAgKGRhdGFbaW5dID09ICc9JykgfHwKLQkJICAgIChoZWFkZXIgJiYgZGF0YVtpbl0gPT0gJ18nKSB8fAotCQkgICAgKChkYXRhW2luXSA9PSAnLicpICYmIChsaW5lbGVuID09IDApICYmCi0JCSAgICAgKGRhdGFbaW4rMV0gPT0gJ1xuJyB8fCBkYXRhW2luKzFdID09ICdccicgfHwgZGF0YVtpbisxXSA9PSAwKSkgfHwKLQkJICAgICghaXN0ZXh0ICYmICgoZGF0YVtpbl0gPT0gJ1xyJykgfHwgKGRhdGFbaW5dID09ICdcbicpKSkgfHwKLQkJICAgICgoZGF0YVtpbl0gPT0gJ1x0JyB8fCBkYXRhW2luXSA9PSAnICcpICYmIChpbiArIDEgPT0gZGF0YWxlbikpIHx8Ci0JCSAgICAoKGRhdGFbaW5dIDwgMzMpICYmCi0JCSAgICAgKGRhdGFbaW5dICE9ICdccicpICYmIChkYXRhW2luXSAhPSAnXG4nKSAmJgotCQkgICAgIChxdW90ZXRhYnMgfHwKLQkJICAgICAJKCFxdW90ZXRhYnMgJiYgKChkYXRhW2luXSAhPSAnXHQnKSAmJiAoZGF0YVtpbl0gIT0gJyAnKSkpKSkpCi0JCXsKLQkJCWlmICgobGluZWxlbiArIDMgKT49IE1BWExJTkVTSVpFKSB7Ci0JCQkJb2RhdGFbb3V0KytdID0gJz0nOwotCQkJCWlmIChjcmxmKSBvZGF0YVtvdXQrK10gPSAnXHInOwotCQkJCW9kYXRhW291dCsrXSA9ICdcbic7Ci0JCQkJbGluZWxlbiA9IDA7Ci0JCQl9Ci0JCQlvZGF0YVtvdXQrK10gPSAnPSc7Ci0JCQl0b19oZXgoZGF0YVtpbl0sICZvZGF0YVtvdXRdKTsKLQkJCW91dCArPSAyOwotCQkJaW4rKzsKLQkJCWxpbmVsZW4gKz0gMzsKLQkJfQotCQllbHNlIHsKLQkJICAJaWYgKGlzdGV4dCAmJgotCQkJICAgICgoZGF0YVtpbl0gPT0gJ1xuJykgfHwKLQkJCSAgICAgKChpbisxIDwgZGF0YWxlbikgJiYgKGRhdGFbaW5dID09ICdccicpICYmCi0JCQkgICAgIChkYXRhW2luKzFdID09ICdcbicpKSkpCi0JCQl7Ci0JCQkgIAlsaW5lbGVuID0gMDsKLQkJCQkvKiBQcm90ZWN0IGFnYWluc3Qgd2hpdGVzcGFjZSBvbiBlbmQgb2YgbGluZSAqLwotCQkJCWlmIChvdXQgJiYgKChvZGF0YVtvdXQtMV0gPT0gJyAnKSB8fCAob2RhdGFbb3V0LTFdID09ICdcdCcpKSkgewotCQkJCQljaCA9IG9kYXRhW291dC0xXTsKLQkJCQkJb2RhdGFbb3V0LTFdID0gJz0nOwotCQkJCQl0b19oZXgoY2gsICZvZGF0YVtvdXRdKTsKLQkJCQkJb3V0ICs9IDI7Ci0JCQkJfQorICAgIGluID0gb3V0ID0gbGluZWxlbiA9IDA7CisgICAgd2hpbGUgKGluIDwgZGF0YWxlbikgeworICAgICAgICBpZiAoKGRhdGFbaW5dID4gMTI2KSB8fAorICAgICAgICAgICAgKGRhdGFbaW5dID09ICc9JykgfHwKKyAgICAgICAgICAgIChoZWFkZXIgJiYgZGF0YVtpbl0gPT0gJ18nKSB8fAorICAgICAgICAgICAgKChkYXRhW2luXSA9PSAnLicpICYmIChsaW5lbGVuID09IDApICYmCisgICAgICAgICAgICAgKGRhdGFbaW4rMV0gPT0gJ1xuJyB8fCBkYXRhW2luKzFdID09ICdccicgfHwgZGF0YVtpbisxXSA9PSAwKSkgfHwKKyAgICAgICAgICAgICghaXN0ZXh0ICYmICgoZGF0YVtpbl0gPT0gJ1xyJykgfHwgKGRhdGFbaW5dID09ICdcbicpKSkgfHwKKyAgICAgICAgICAgICgoZGF0YVtpbl0gPT0gJ1x0JyB8fCBkYXRhW2luXSA9PSAnICcpICYmIChpbiArIDEgPT0gZGF0YWxlbikpIHx8CisgICAgICAgICAgICAoKGRhdGFbaW5dIDwgMzMpICYmCisgICAgICAgICAgICAgKGRhdGFbaW5dICE9ICdccicpICYmIChkYXRhW2luXSAhPSAnXG4nKSAmJgorICAgICAgICAgICAgIChxdW90ZXRhYnMgfHwKKyAgICAgICAgICAgICghcXVvdGV0YWJzICYmICgoZGF0YVtpbl0gIT0gJ1x0JykgJiYgKGRhdGFbaW5dICE9ICcgJykpKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGxpbmVsZW4gKyAzICk+PSBNQVhMSU5FU0laRSkgeworICAgICAgICAgICAgICAgIG9kYXRhW291dCsrXSA9ICc9JzsKKyAgICAgICAgICAgICAgICBpZiAoY3JsZikgb2RhdGFbb3V0KytdID0gJ1xyJzsKKyAgICAgICAgICAgICAgICBvZGF0YVtvdXQrK10gPSAnXG4nOworICAgICAgICAgICAgICAgIGxpbmVsZW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJz0nOworICAgICAgICAgICAgdG9faGV4KGRhdGFbaW5dLCAmb2RhdGFbb3V0XSk7CisgICAgICAgICAgICBvdXQgKz0gMjsKKyAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICBsaW5lbGVuICs9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoaXN0ZXh0ICYmCisgICAgICAgICAgICAgICAgKChkYXRhW2luXSA9PSAnXG4nKSB8fAorICAgICAgICAgICAgICAgICAoKGluKzEgPCBkYXRhbGVuKSAmJiAoZGF0YVtpbl0gPT0gJ1xyJykgJiYKKyAgICAgICAgICAgICAgICAgKGRhdGFbaW4rMV0gPT0gJ1xuJykpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW5lbGVuID0gMDsKKyAgICAgICAgICAgICAgICAvKiBQcm90ZWN0IGFnYWluc3Qgd2hpdGVzcGFjZSBvbiBlbmQgb2YgbGluZSAqLworICAgICAgICAgICAgICAgIGlmIChvdXQgJiYgKChvZGF0YVtvdXQtMV0gPT0gJyAnKSB8fCAob2RhdGFbb3V0LTFdID09ICdcdCcpKSkgeworICAgICAgICAgICAgICAgICAgICBjaCA9IG9kYXRhW291dC0xXTsKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFbb3V0LTFdID0gJz0nOworICAgICAgICAgICAgICAgICAgICB0b19oZXgoY2gsICZvZGF0YVtvdXRdKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJaWYgKGNybGYpIG9kYXRhW291dCsrXSA9ICdccic7Ci0JCQkJb2RhdGFbb3V0KytdID0gJ1xuJzsKLQkJCQlpZiAoZGF0YVtpbl0gPT0gJ1xyJykKLQkJCQkJaW4gKz0gMjsKLQkJCQllbHNlCi0JCQkJCWluKys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoKGluICsgMSAhPSBkYXRhbGVuKSAmJgotCQkJCSAgICAoZGF0YVtpbisxXSAhPSAnXG4nKSAmJgotCQkJCSAgICAobGluZWxlbiArIDEpID49IE1BWExJTkVTSVpFKSB7Ci0JCQkJCW9kYXRhW291dCsrXSA9ICc9JzsKLQkJCQkJaWYgKGNybGYpIG9kYXRhW291dCsrXSA9ICdccic7Ci0JCQkJCW9kYXRhW291dCsrXSA9ICdcbic7Ci0JCQkJCWxpbmVsZW4gPSAwOwotCQkJCX0KLQkJCQlsaW5lbGVuKys7Ci0JCQkJaWYgKGhlYWRlciAmJiBkYXRhW2luXSA9PSAnICcpIHsKLQkJCQkJb2RhdGFbb3V0KytdID0gJ18nOwotCQkJCQlpbisrOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJb2RhdGFbb3V0KytdID0gZGF0YVtpbisrXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKChydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopb2RhdGEsIG91dCkpID09IE5VTEwpIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQlQeU1lbV9GcmVlKG9kYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQlQeU1lbV9GcmVlKG9kYXRhKTsKLQlyZXR1cm4gcnY7CisgICAgICAgICAgICAgICAgaWYgKGNybGYpIG9kYXRhW291dCsrXSA9ICdccic7CisgICAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJ1xuJzsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YVtpbl0gPT0gJ1xyJykKKyAgICAgICAgICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKGluICsgMSAhPSBkYXRhbGVuKSAmJgorICAgICAgICAgICAgICAgICAgICAoZGF0YVtpbisxXSAhPSAnXG4nKSAmJgorICAgICAgICAgICAgICAgICAgICAobGluZWxlbiArIDEpID49IE1BWExJTkVTSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIG9kYXRhW291dCsrXSA9ICc9JzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNybGYpIG9kYXRhW291dCsrXSA9ICdccic7CisgICAgICAgICAgICAgICAgICAgIG9kYXRhW291dCsrXSA9ICdcbic7CisgICAgICAgICAgICAgICAgICAgIGxpbmVsZW4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lbGVuKys7CisgICAgICAgICAgICAgICAgaWYgKGhlYWRlciAmJiBkYXRhW2luXSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJ18nOworICAgICAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gZGF0YVtpbisrXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopb2RhdGEsIG91dCkpID09IE5VTEwpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICBQeU1lbV9GcmVlKG9kYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICBQeU1lbV9GcmVlKG9kYXRhKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGJpbmFzY2lpX21vZHVsZV9tZXRob2RzW10gPSB7Ci0JeyJhMmJfdXUiLCAgICAgYmluYXNjaWlfYTJiX3V1LCAgICAgTUVUSF9WQVJBUkdTLCBkb2NfYTJiX3V1fSwKLQl7ImIyYV91dSIsICAgICBiaW5hc2NpaV9iMmFfdXUsICAgICBNRVRIX1ZBUkFSR1MsIGRvY19iMmFfdXV9LAotCXsiYTJiX2Jhc2U2NCIsIGJpbmFzY2lpX2EyYl9iYXNlNjQsIE1FVEhfVkFSQVJHUywgZG9jX2EyYl9iYXNlNjR9LAotCXsiYjJhX2Jhc2U2NCIsIGJpbmFzY2lpX2IyYV9iYXNlNjQsIE1FVEhfVkFSQVJHUywgZG9jX2IyYV9iYXNlNjR9LAotCXsiYTJiX2hxeCIsICAgIGJpbmFzY2lpX2EyYl9ocXgsICAgIE1FVEhfVkFSQVJHUywgZG9jX2EyYl9ocXh9LAotCXsiYjJhX2hxeCIsICAgIGJpbmFzY2lpX2IyYV9ocXgsICAgIE1FVEhfVkFSQVJHUywgZG9jX2IyYV9ocXh9LAotCXsiYjJhX2hleCIsICAgIGJpbmFzY2lpX2hleGxpZnksICAgIE1FVEhfVkFSQVJHUywgZG9jX2hleGxpZnl9LAotCXsiYTJiX2hleCIsICAgIGJpbmFzY2lpX3VuaGV4bGlmeSwgIE1FVEhfVkFSQVJHUywgZG9jX3VuaGV4bGlmeX0sCi0JeyJoZXhsaWZ5IiwgICAgYmluYXNjaWlfaGV4bGlmeSwgICAgTUVUSF9WQVJBUkdTLCBkb2NfaGV4bGlmeX0sCi0JeyJ1bmhleGxpZnkiLCAgYmluYXNjaWlfdW5oZXhsaWZ5LCAgTUVUSF9WQVJBUkdTLCBkb2NfdW5oZXhsaWZ5fSwKLQl7InJsZWNvZGVfaHF4IiwgICBiaW5hc2NpaV9ybGVjb2RlX2hxeCwgTUVUSF9WQVJBUkdTLCBkb2NfcmxlY29kZV9ocXh9LAotCXsicmxlZGVjb2RlX2hxeCIsIGJpbmFzY2lpX3JsZWRlY29kZV9ocXgsIE1FVEhfVkFSQVJHUywKLQkgZG9jX3JsZWRlY29kZV9ocXh9LAotCXsiY3JjX2hxeCIsICAgIGJpbmFzY2lpX2NyY19ocXgsICAgIE1FVEhfVkFSQVJHUywgZG9jX2NyY19ocXh9LAotCXsiY3JjMzIiLCAgICAgIGJpbmFzY2lpX2NyYzMyLCAgICAgIE1FVEhfVkFSQVJHUywgZG9jX2NyYzMyfSwKLQl7ImEyYl9xcCIsIChQeUNGdW5jdGlvbiliaW5hc2NpaV9hMmJfcXAsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JICBkb2NfYTJiX3FwfSwKLQl7ImIyYV9xcCIsIChQeUNGdW5jdGlvbiliaW5hc2NpaV9iMmFfcXAsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0gICAgICAgICAgZG9jX2IyYV9xcH0sCi0Je05VTEwsIE5VTEx9CQkJICAgICAvKiBzZW50aW5lbCAqLworICAgIHsiYTJiX3V1IiwgICAgIGJpbmFzY2lpX2EyYl91dSwgICAgIE1FVEhfVkFSQVJHUywgZG9jX2EyYl91dX0sCisgICAgeyJiMmFfdXUiLCAgICAgYmluYXNjaWlfYjJhX3V1LCAgICAgTUVUSF9WQVJBUkdTLCBkb2NfYjJhX3V1fSwKKyAgICB7ImEyYl9iYXNlNjQiLCBiaW5hc2NpaV9hMmJfYmFzZTY0LCBNRVRIX1ZBUkFSR1MsIGRvY19hMmJfYmFzZTY0fSwKKyAgICB7ImIyYV9iYXNlNjQiLCBiaW5hc2NpaV9iMmFfYmFzZTY0LCBNRVRIX1ZBUkFSR1MsIGRvY19iMmFfYmFzZTY0fSwKKyAgICB7ImEyYl9ocXgiLCAgICBiaW5hc2NpaV9hMmJfaHF4LCAgICBNRVRIX1ZBUkFSR1MsIGRvY19hMmJfaHF4fSwKKyAgICB7ImIyYV9ocXgiLCAgICBiaW5hc2NpaV9iMmFfaHF4LCAgICBNRVRIX1ZBUkFSR1MsIGRvY19iMmFfaHF4fSwKKyAgICB7ImIyYV9oZXgiLCAgICBiaW5hc2NpaV9oZXhsaWZ5LCAgICBNRVRIX1ZBUkFSR1MsIGRvY19oZXhsaWZ5fSwKKyAgICB7ImEyYl9oZXgiLCAgICBiaW5hc2NpaV91bmhleGxpZnksICBNRVRIX1ZBUkFSR1MsIGRvY191bmhleGxpZnl9LAorICAgIHsiaGV4bGlmeSIsICAgIGJpbmFzY2lpX2hleGxpZnksICAgIE1FVEhfVkFSQVJHUywgZG9jX2hleGxpZnl9LAorICAgIHsidW5oZXhsaWZ5IiwgIGJpbmFzY2lpX3VuaGV4bGlmeSwgIE1FVEhfVkFSQVJHUywgZG9jX3VuaGV4bGlmeX0sCisgICAgeyJybGVjb2RlX2hxeCIsICAgYmluYXNjaWlfcmxlY29kZV9ocXgsIE1FVEhfVkFSQVJHUywgZG9jX3JsZWNvZGVfaHF4fSwKKyAgICB7InJsZWRlY29kZV9ocXgiLCBiaW5hc2NpaV9ybGVkZWNvZGVfaHF4LCBNRVRIX1ZBUkFSR1MsCisgICAgIGRvY19ybGVkZWNvZGVfaHF4fSwKKyAgICB7ImNyY19ocXgiLCAgICBiaW5hc2NpaV9jcmNfaHF4LCAgICBNRVRIX1ZBUkFSR1MsIGRvY19jcmNfaHF4fSwKKyAgICB7ImNyYzMyIiwgICAgICBiaW5hc2NpaV9jcmMzMiwgICAgICBNRVRIX1ZBUkFSR1MsIGRvY19jcmMzMn0sCisgICAgeyJhMmJfcXAiLCAoUHlDRnVuY3Rpb24pYmluYXNjaWlfYTJiX3FwLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgZG9jX2EyYl9xcH0sCisgICAgeyJiMmFfcXAiLCAoUHlDRnVuY3Rpb24pYmluYXNjaWlfYjJhX3FwLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgZG9jX2IyYV9xcH0sCisgICAge05VTEwsIE5VTEx9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0xNTEyLDIwICsxNTEyLDIwIEBACiBQeU1PRElOSVRfRlVOQwogaW5pdGJpbmFzY2lpKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqeDsKKyAgICBQeU9iamVjdCAqbSwgKmQsICp4OwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGUoImJpbmFzY2lpIiwgYmluYXNjaWlfbW9kdWxlX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiYmluYXNjaWkiLCBiaW5hc2NpaV9tb2R1bGVfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JeCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jX2JpbmFzY2lpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19kb2NfXyIsIHgpOwotCVB5X1hERUNSRUYoeCk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgeCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jX2JpbmFzY2lpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19kb2NfXyIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAKLQlFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYmluYXNjaWkuRXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBFcnJvcik7Ci0JSW5jb21wbGV0ZSA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYmluYXNjaWkuSW5jb21wbGV0ZSIsIE5VTEwsIE5VTEwpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbmNvbXBsZXRlIiwgSW5jb21wbGV0ZSk7CisgICAgRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImJpbmFzY2lpLkVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRXJyb3IpOworICAgIEluY29tcGxldGUgPSBQeUVycl9OZXdFeGNlcHRpb24oImJpbmFzY2lpLkluY29tcGxldGUiLCBOVUxMLCBOVUxMKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSW5jb21wbGV0ZSIsIEluY29tcGxldGUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9ic2RkYm1vZHVsZS5jIGIvTW9kdWxlcy9ic2RkYm1vZHVsZS5jCmluZGV4IGM1NWRmMTEuLjU3OGNmM2QgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYnNkZGJtb2R1bGUuYworKysgYi9Nb2R1bGVzL2JzZGRibW9kdWxlLmMKQEAgLTMwLDEyICszMCwxMiBAQAogICAgKGl0IG1lc3NlcyB1cCB0aGUgaW5mbyByZXF1aXJlZCBpbiB0aGUgU2V0dXAgZmlsZSkgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlEQiAqZGlfYnNkZGI7Ci0JaW50IGRpX3NpemU7CS8qIC0xIG1lYW5zIHJlY29tcHV0ZSAqLwotCWludCBkaV90eXBlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBEQiAqZGlfYnNkZGI7CisgICAgaW50IGRpX3NpemU7ICAgICAgICAvKiAtMSBtZWFucyByZWNvbXB1dGUgKi8KKyAgICBpbnQgZGlfdHlwZTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5VGhyZWFkX3R5cGVfbG9jayBkaV9sb2NrOworICAgIFB5VGhyZWFkX3R5cGVfbG9jayBkaV9sb2NrOwogI2VuZGlmCiB9IGJzZGRib2JqZWN0OwogCkBAIC00NCw4MjEgKzQ0LDgyMSBAQAogI2RlZmluZSBpc19ic2RkYm9iamVjdCh2KSAoKHYpLT5vYl90eXBlID09ICZCc2RkYnR5cGUpCiAjZGVmaW5lIGNoZWNrX2JzZGRib2JqZWN0X29wZW4odiwgcikgaWYgKCh2KS0+ZGlfYnNkZGIgPT0gTlVMTCkgXAogICAgICAgICAgICAgICAgeyBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwgXAotCQkJCSAiQlNEREIgb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCU0REQiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsgXAogICAgICAgICAgICAgICAgICByZXR1cm4gcjsgfQogCiBzdGF0aWMgUHlPYmplY3QgKkJzZGRiRXJyb3I7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdkYmhhc2hvYmplY3QoY2hhciAqZmlsZSwgaW50IGZsYWdzLCBpbnQgbW9kZSwKLQkJaW50IGJzaXplLCBpbnQgZmZhY3RvciwgaW50IG5lbGVtLCBpbnQgY2FjaGVzaXplLAotCQlpbnQgaGFzaCwgaW50IGxvcmRlcikKKyAgICAgICAgICAgICAgICBpbnQgYnNpemUsIGludCBmZmFjdG9yLCBpbnQgbmVsZW0sIGludCBjYWNoZXNpemUsCisgICAgICAgICAgICAgICAgaW50IGhhc2gsIGludCBsb3JkZXIpCiB7Ci0JYnNkZGJvYmplY3QgKmRwOwotCUhBU0hJTkZPIGluZm87CisgICAgYnNkZGJvYmplY3QgKmRwOworICAgIEhBU0hJTkZPIGluZm87CiAKLQlpZiAoKGRwID0gUHlPYmplY3RfTmV3KGJzZGRib2JqZWN0LCAmQnNkZGJ0eXBlKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKChkcCA9IFB5T2JqZWN0X05ldyhic2RkYm9iamVjdCwgJkJzZGRidHlwZSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaW5mby5ic2l6ZSA9IGJzaXplOwotCWluZm8uZmZhY3RvciA9IGZmYWN0b3I7Ci0JaW5mby5uZWxlbSA9IG5lbGVtOwotCWluZm8uY2FjaGVzaXplID0gY2FjaGVzaXplOwotCWluZm8uaGFzaCA9IE5VTEw7IC8qIFhYWCBzaG91bGQgZGVyaXZlIGZyb20gaGFzaCBhcmd1bWVudCAqLwotCWluZm8ubG9yZGVyID0gbG9yZGVyOworICAgIGluZm8uYnNpemUgPSBic2l6ZTsKKyAgICBpbmZvLmZmYWN0b3IgPSBmZmFjdG9yOworICAgIGluZm8ubmVsZW0gPSBuZWxlbTsKKyAgICBpbmZvLmNhY2hlc2l6ZSA9IGNhY2hlc2l6ZTsKKyAgICBpbmZvLmhhc2ggPSBOVUxMOyAvKiBYWFggc2hvdWxkIGRlcml2ZSBmcm9tIGhhc2ggYXJndW1lbnQgKi8KKyAgICBpbmZvLmxvcmRlciA9IGxvcmRlcjsKIAogI2lmZGVmIE9fQklOQVJZCi0JZmxhZ3MgfD0gT19CSU5BUlk7CisgICAgZmxhZ3MgfD0gT19CSU5BUlk7CiAjZW5kaWYKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZHAtPmRpX2JzZGRiID0gZGJvcGVuKGZpbGUsIGZsYWdzLCBtb2RlLCBEQl9IQVNILCAmaW5mbyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAoZHAtPmRpX2JzZGRiID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBkcC0+ZGlfYnNkZGIgPSBkYm9wZW4oZmlsZSwgZmxhZ3MsIG1vZGUsIERCX0hBU0gsICZpbmZvKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChkcC0+ZGlfYnNkZGIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJZHAtPmRpX2xvY2sgPSBOVUxMOworICAgICAgICBkcC0+ZGlfbG9jayA9IE5VTEw7CiAjZW5kaWYKLQkJUHlfREVDUkVGKGRwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBQeV9ERUNSRUYoZHApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlkcC0+ZGlfc2l6ZSA9IC0xOwotCWRwLT5kaV90eXBlID0gREJfSEFTSDsKKyAgICBkcC0+ZGlfc2l6ZSA9IC0xOworICAgIGRwLT5kaV90eXBlID0gREJfSEFTSDsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JZHAtPmRpX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKGRwLT5kaV9sb2NrID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7Ci0JCVB5X0RFQ1JFRihkcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBkcC0+ZGlfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBpZiAoZHAtPmRpX2xvY2sgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwgImNhbid0IGFsbG9jYXRlIGxvY2siKTsKKyAgICAgICAgUHlfREVDUkVGKGRwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopZHA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3ZGJidG9iamVjdChjaGFyICpmaWxlLCBpbnQgZmxhZ3MsIGludCBtb2RlLAotCSAgICAgIGludCBidGZsYWdzLCBpbnQgY2FjaGVzaXplLCBpbnQgbWF4a2V5cGFnZSwKLQkgICAgICBpbnQgbWlua2V5cGFnZSwgaW50IHBzaXplLCBpbnQgbG9yZGVyKQorICAgICAgICAgICAgICBpbnQgYnRmbGFncywgaW50IGNhY2hlc2l6ZSwgaW50IG1heGtleXBhZ2UsCisgICAgICAgICAgICAgIGludCBtaW5rZXlwYWdlLCBpbnQgcHNpemUsIGludCBsb3JkZXIpCiB7Ci0JYnNkZGJvYmplY3QgKmRwOwotCUJUUkVFSU5GTyBpbmZvOworICAgIGJzZGRib2JqZWN0ICpkcDsKKyAgICBCVFJFRUlORk8gaW5mbzsKIAotCWlmICgoZHAgPSBQeU9iamVjdF9OZXcoYnNkZGJvYmplY3QsICZCc2RkYnR5cGUpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKGRwID0gUHlPYmplY3RfTmV3KGJzZGRib2JqZWN0LCAmQnNkZGJ0eXBlKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpbmZvLmZsYWdzID0gYnRmbGFnczsKLQlpbmZvLmNhY2hlc2l6ZSA9IGNhY2hlc2l6ZTsKLQlpbmZvLm1heGtleXBhZ2UgPSBtYXhrZXlwYWdlOwotCWluZm8ubWlua2V5cGFnZSA9IG1pbmtleXBhZ2U7Ci0JaW5mby5wc2l6ZSA9IHBzaXplOwotCWluZm8ubG9yZGVyID0gbG9yZGVyOwotCWluZm8uY29tcGFyZSA9IDA7IC8qIFVzZSBkZWZhdWx0IGNvbXBhcmlzb24gZnVuY3Rpb25zLCBmb3Igbm93Li4qLwotCWluZm8ucHJlZml4ID0gMDsKKyAgICBpbmZvLmZsYWdzID0gYnRmbGFnczsKKyAgICBpbmZvLmNhY2hlc2l6ZSA9IGNhY2hlc2l6ZTsKKyAgICBpbmZvLm1heGtleXBhZ2UgPSBtYXhrZXlwYWdlOworICAgIGluZm8ubWlua2V5cGFnZSA9IG1pbmtleXBhZ2U7CisgICAgaW5mby5wc2l6ZSA9IHBzaXplOworICAgIGluZm8ubG9yZGVyID0gbG9yZGVyOworICAgIGluZm8uY29tcGFyZSA9IDA7IC8qIFVzZSBkZWZhdWx0IGNvbXBhcmlzb24gZnVuY3Rpb25zLCBmb3Igbm93Li4qLworICAgIGluZm8ucHJlZml4ID0gMDsKIAogI2lmZGVmIE9fQklOQVJZCi0JZmxhZ3MgfD0gT19CSU5BUlk7CisgICAgZmxhZ3MgfD0gT19CSU5BUlk7CiAjZW5kaWYKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZHAtPmRpX2JzZGRiID0gZGJvcGVuKGZpbGUsIGZsYWdzLCBtb2RlLCBEQl9CVFJFRSwgJmluZm8pOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKGRwLT5kaV9ic2RkYiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZHAtPmRpX2JzZGRiID0gZGJvcGVuKGZpbGUsIGZsYWdzLCBtb2RlLCBEQl9CVFJFRSwgJmluZm8pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKGRwLT5kaV9ic2RkYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlkcC0+ZGlfbG9jayA9IE5VTEw7CisgICAgICAgIGRwLT5kaV9sb2NrID0gTlVMTDsKICNlbmRpZgotCQlQeV9ERUNSRUYoZHApOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIFB5X0RFQ1JFRihkcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWRwLT5kaV9zaXplID0gLTE7Ci0JZHAtPmRpX3R5cGUgPSBEQl9CVFJFRTsKKyAgICBkcC0+ZGlfc2l6ZSA9IC0xOworICAgIGRwLT5kaV90eXBlID0gREJfQlRSRUU7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCWRwLT5kaV9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmIChkcC0+ZGlfbG9jayA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLCAiY2FuJ3QgYWxsb2NhdGUgbG9jayIpOwotCQlQeV9ERUNSRUYoZHApOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZHAtPmRpX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgaWYgKGRwLT5kaV9sb2NrID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7CisgICAgICAgIFB5X0RFQ1JFRihkcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JcmV0dXJuIChQeU9iamVjdCAqKWRwOworICAgIHJldHVybiAoUHlPYmplY3QgKilkcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2Ricm5vYmplY3QoY2hhciAqZmlsZSwgaW50IGZsYWdzLCBpbnQgbW9kZSwKLQkgICAgICBpbnQgcm5mbGFncywgaW50IGNhY2hlc2l6ZSwgaW50IHBzaXplLCBpbnQgbG9yZGVyLAotCSAgICAgIHNpemVfdCByZWNsZW4sIHVfY2hhciBidmFsLCBjaGFyICpiZm5hbWUpCisgICAgICAgICAgICAgIGludCBybmZsYWdzLCBpbnQgY2FjaGVzaXplLCBpbnQgcHNpemUsIGludCBsb3JkZXIsCisgICAgICAgICAgICAgIHNpemVfdCByZWNsZW4sIHVfY2hhciBidmFsLCBjaGFyICpiZm5hbWUpCiB7Ci0JYnNkZGJvYmplY3QgKmRwOwotCVJFQ05PSU5GTyBpbmZvOwotCWludCBmZDsKKyAgICBic2RkYm9iamVjdCAqZHA7CisgICAgUkVDTk9JTkZPIGluZm87CisgICAgaW50IGZkOwogCi0JaWYgKChkcCA9IFB5T2JqZWN0X05ldyhic2RkYm9iamVjdCwgJkJzZGRidHlwZSkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgoZHAgPSBQeU9iamVjdF9OZXcoYnNkZGJvYmplY3QsICZCc2RkYnR5cGUpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWluZm8uZmxhZ3MgPSBybmZsYWdzOwotCWluZm8uY2FjaGVzaXplID0gY2FjaGVzaXplOwotCWluZm8ucHNpemUgPSBwc2l6ZTsKLQlpbmZvLmxvcmRlciA9IGxvcmRlcjsKLQlpbmZvLnJlY2xlbiA9IHJlY2xlbjsKLQlpbmZvLmJ2YWwgPSBidmFsOwotCWluZm8uYmZuYW1lID0gYmZuYW1lOworICAgIGluZm8uZmxhZ3MgPSBybmZsYWdzOworICAgIGluZm8uY2FjaGVzaXplID0gY2FjaGVzaXplOworICAgIGluZm8ucHNpemUgPSBwc2l6ZTsKKyAgICBpbmZvLmxvcmRlciA9IGxvcmRlcjsKKyAgICBpbmZvLnJlY2xlbiA9IHJlY2xlbjsKKyAgICBpbmZvLmJ2YWwgPSBidmFsOworICAgIGluZm8uYmZuYW1lID0gYmZuYW1lOwogCiAjaWZkZWYgT19CSU5BUlkKLQlmbGFncyB8PSBPX0JJTkFSWTsKKyAgICBmbGFncyB8PSBPX0JJTkFSWTsKICNlbmRpZgotCS8qIFRoaXMgaXMgYSBoYWNrIHRvIGF2b2lkIGEgZGJvcGVuKCkgYnVnIHRoYXQgaGFwcGVucyB3aGVuCi0JICogaXQgZmFpbHMuICovCi0JZmQgPSBvcGVuKGZpbGUsIGZsYWdzKTsKLQlpZiAoZmQgPT0gLTEpIHsKLQkJZHAtPmRpX2JzZGRiID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCWNsb3NlKGZkKTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlkcC0+ZGlfYnNkZGIgPSBkYm9wZW4oZmlsZSwgZmxhZ3MsIG1vZGUsIERCX1JFQ05PLCAmaW5mbyk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCWlmIChkcC0+ZGlfYnNkZGIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgLyogVGhpcyBpcyBhIGhhY2sgdG8gYXZvaWQgYSBkYm9wZW4oKSBidWcgdGhhdCBoYXBwZW5zIHdoZW4KKyAgICAgKiBpdCBmYWlscy4gKi8KKyAgICBmZCA9IG9wZW4oZmlsZSwgZmxhZ3MpOworICAgIGlmIChmZCA9PSAtMSkgeworICAgICAgICBkcC0+ZGlfYnNkZGIgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGRwLT5kaV9ic2RkYiA9IGRib3BlbihmaWxlLCBmbGFncywgbW9kZSwgREJfUkVDTk8sICZpbmZvKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisgICAgaWYgKGRwLT5kaV9ic2RkYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlkcC0+ZGlfbG9jayA9IE5VTEw7CisgICAgICAgIGRwLT5kaV9sb2NrID0gTlVMTDsKICNlbmRpZgotCQlQeV9ERUNSRUYoZHApOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIFB5X0RFQ1JFRihkcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWRwLT5kaV9zaXplID0gLTE7Ci0JZHAtPmRpX3R5cGUgPSBEQl9SRUNOTzsKKyAgICBkcC0+ZGlfc2l6ZSA9IC0xOworICAgIGRwLT5kaV90eXBlID0gREJfUkVDTk87CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCWRwLT5kaV9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmIChkcC0+ZGlfbG9jayA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLCAiY2FuJ3QgYWxsb2NhdGUgbG9jayIpOwotCQlQeV9ERUNSRUYoZHApOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZHAtPmRpX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgaWYgKGRwLT5kaV9sb2NrID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7CisgICAgICAgIFB5X0RFQ1JFRihkcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JcmV0dXJuIChQeU9iamVjdCAqKWRwOworICAgIHJldHVybiAoUHlPYmplY3QgKilkcDsKIH0KIAogc3RhdGljIHZvaWQKIGJzZGRiX2RlYWxsb2MoYnNkZGJvYmplY3QgKmRwKQogewogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKGRwLT5kaV9sb2NrKSB7Ci0JCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhkcC0+ZGlfbG9jaywgMCk7Ci0JCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhkcC0+ZGlfbG9jayk7Ci0JCVB5VGhyZWFkX2ZyZWVfbG9jayhkcC0+ZGlfbG9jayk7Ci0JCWRwLT5kaV9sb2NrID0gTlVMTDsKLQl9CisgICAgaWYgKGRwLT5kaV9sb2NrKSB7CisgICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhkcC0+ZGlfbG9jaywgMCk7CisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhkcC0+ZGlfbG9jayk7CisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhkcC0+ZGlfbG9jayk7CisgICAgICAgIGRwLT5kaV9sb2NrID0gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlpZiAoZHAtPmRpX2JzZGRiICE9IE5VTEwpIHsKLQkJaW50IHN0YXR1czsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5jbG9zZSkoZHAtPmRpX2JzZGRiKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJaWYgKHN0YXR1cyAhPSAwKQotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIlB5dGhvbiBic2RkYjogY2xvc2UgZXJybm8gJWQgaW4gZGVhbGxvY1xuIiwKLQkJCQllcnJubyk7Ci0JfQotCVB5T2JqZWN0X0RlbChkcCk7CisgICAgaWYgKGRwLT5kaV9ic2RkYiAhPSBOVUxMKSB7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+Y2xvc2UpKGRwLT5kaV9ic2RkYik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJQeXRob24gYnNkZGI6IGNsb3NlIGVycm5vICVkIGluIGRlYWxsb2NcbiIsCisgICAgICAgICAgICAgICAgZXJybm8pOworICAgIH0KKyAgICBQeU9iamVjdF9EZWwoZHApOwogfQogCiAjaWZkZWYgV0lUSF9USFJFQUQKICNkZWZpbmUgQlNEREJfQkdOX1NBVkUoX2RwKSBcCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyBQeVRocmVhZF9hY3F1aXJlX2xvY2soX2RwLT5kaV9sb2NrLDEpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKF9kcC0+ZGlfbG9jaywxKTsKICNkZWZpbmUgQlNEREJfRU5EX1NBVkUoX2RwKSBcCi0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKF9kcC0+ZGlfbG9jayk7IFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKF9kcC0+ZGlfbG9jayk7IFB5X0VORF9BTExPV19USFJFQURTCiAjZWxzZQotI2RlZmluZSBCU0REQl9CR05fU0FWRShfZHApIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgCisjZGVmaW5lIEJTRERCX0JHTl9TQVZFKF9kcCkgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogI2RlZmluZSBCU0REQl9FTkRfU0FWRShfZHApIFB5X0VORF9BTExPV19USFJFQURTCiAjZW5kaWYKIAogc3RhdGljIFB5X3NzaXplX3QKIGJzZGRiX2xlbmd0aChic2RkYm9iamVjdCAqZHApCiB7Ci0JY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgLTEpOwotCWlmIChkcC0+ZGlfc2l6ZSA8IDApIHsKLQkJREJUIGtyZWMsIGRyZWM7Ci0JCWludCBzdGF0dXM7Ci0JCWludCBzaXplID0gMDsKLQkJQlNEREJfQkdOX1NBVkUoZHApCi0JCWZvciAoc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsCi0JCQkJCQkgICZrcmVjLCAmZHJlYyxSX0ZJUlNUKTsKLQkJICAgICBzdGF0dXMgPT0gMDsKLQkJICAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpKGRwLT5kaV9ic2RkYiwKLQkJCQkJCSAgJmtyZWMsICZkcmVjLCBSX05FWFQpKQotCQkJc2l6ZSsrOwotCQlCU0REQl9FTkRfU0FWRShkcCkKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlkcC0+ZGlfc2l6ZSA9IHNpemU7Ci0JfQotCXJldHVybiBkcC0+ZGlfc2l6ZTsKKyAgICBjaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCAtMSk7CisgICAgaWYgKGRwLT5kaV9zaXplIDwgMCkgeworICAgICAgICBEQlQga3JlYywgZHJlYzsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICAgICAgZm9yIChzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpKGRwLT5kaV9ic2RkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrcmVjLCAmZHJlYyxSX0ZJUlNUKTsKKyAgICAgICAgICAgICBzdGF0dXMgPT0gMDsKKyAgICAgICAgICAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpKGRwLT5kaV9ic2RkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrcmVjLCAmZHJlYywgUl9ORVhUKSkKKyAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgQlNEREJfRU5EX1NBVkUoZHApCisgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZHAtPmRpX3NpemUgPSBzaXplOworICAgIH0KKyAgICByZXR1cm4gZHAtPmRpX3NpemU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9zdWJzY3JpcHQoYnNkZGJvYmplY3QgKmRwLCBQeU9iamVjdCAqa2V5KQogewotCWludCBzdGF0dXM7Ci0JREJUIGtyZWMsIGRyZWM7Ci0JY2hhciAqZGF0YSA9IE5VTEw7Ci0JY2hhciBidWZbNDA5Nl07Ci0JaW50IHNpemU7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlyZWNub190IHJlY25vOworICAgIGludCBzdGF0dXM7CisgICAgREJUIGtyZWMsIGRyZWM7CisgICAgY2hhciAqZGF0YSA9IE5VTEw7CisgICAgY2hhciBidWZbNDA5Nl07CisgICAgaW50IHNpemU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICByZWNub190IHJlY25vOwogCi0JaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKSB7Ci0JCWlmICghUHlBcmdfUGFyc2Uoa2V5LCAiaSIsICZyZWNubykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWtyZWMuZGF0YSA9ICZyZWNubzsKLQkJa3JlYy5zaXplID0gc2l6ZW9mKHJlY25vKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghUHlBcmdfUGFyc2Uoa2V5LCAicyMiLCAmZGF0YSwgJnNpemUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkia2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWtyZWMuZGF0YSA9IGRhdGE7Ci0JCWtyZWMuc2l6ZSA9IHNpemU7Ci0JfQotICAgICAgICBjaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCBOVUxMKTsKKyAgICBpZiAoZHAtPmRpX3R5cGUgPT0gREJfUkVDTk8pIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShrZXksICJpIiwgJnJlY25vKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5IHR5cGUgbXVzdCBiZSBpbnRlZ2VyIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBrcmVjLmRhdGEgPSAmcmVjbm87CisgICAgICAgIGtyZWMuc2l6ZSA9IHNpemVvZihyZWNubyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKGtleSwgInMjIiwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGtyZWMuZGF0YSA9IGRhdGE7CisgICAgICAgIGtyZWMuc2l6ZSA9IHNpemU7CisgICAgfQorICAgIGNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOwogCi0JQlNEREJfQkdOX1NBVkUoZHApCi0Jc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+Z2V0KShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgMCk7Ci0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmIChkcmVjLnNpemUgPiBzaXplb2YoYnVmKSkgZGF0YSA9IG1hbGxvYyhkcmVjLnNpemUpOwotCQllbHNlIGRhdGEgPSBidWY7Ci0JCWlmIChkYXRhIT1OVUxMKSBtZW1jcHkoZGF0YSxkcmVjLmRhdGEsZHJlYy5zaXplKTsKLQl9Ci0JQlNEREJfRU5EX1NBVkUoZHApCi0JaWYgKGRhdGE9PU5VTEwpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBrZXkpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgQlNEREJfQkdOX1NBVkUoZHApCisgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+Z2V0KShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgMCk7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGlmIChkcmVjLnNpemUgPiBzaXplb2YoYnVmKSkgZGF0YSA9IG1hbGxvYyhkcmVjLnNpemUpOworICAgICAgICBlbHNlIGRhdGEgPSBidWY7CisgICAgICAgIGlmIChkYXRhIT1OVUxMKSBtZW1jcHkoZGF0YSxkcmVjLmRhdGEsZHJlYy5zaXplKTsKKyAgICB9CisgICAgQlNEREJfRU5EX1NBVkUoZHApCisgICAgaWYgKGRhdGE9PU5VTEwpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBrZXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCAoaW50KWRyZWMuc2l6ZSk7Ci0JaWYgKGRhdGEgIT0gYnVmKSBmcmVlKGRhdGEpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgKGludClkcmVjLnNpemUpOworICAgIGlmIChkYXRhICE9IGJ1ZikgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBic2RkYl9hc3Nfc3ViKGJzZGRib2JqZWN0ICpkcCwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZhbHVlKQogewotCWludCBzdGF0dXM7Ci0JREJUIGtyZWMsIGRyZWM7Ci0JY2hhciAqZGF0YTsKLQlpbnQgc2l6ZTsKLQlyZWNub190IHJlY25vOworICAgIGludCBzdGF0dXM7CisgICAgREJUIGtyZWMsIGRyZWM7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgc2l6ZTsKKyAgICByZWNub190IHJlY25vOwogCi0JaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKSB7Ci0JCWlmICghUHlBcmdfUGFyc2Uoa2V5LCAiaSIsICZyZWNubykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJic2RkYiBrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlrcmVjLmRhdGEgPSAmcmVjbm87Ci0JCWtyZWMuc2l6ZSA9IHNpemVvZihyZWNubyk7Ci0JfQotCWVsc2UgewotCQlpZiAoIVB5QXJnX1BhcnNlKGtleSwgInMjIiwgJmRhdGEsICZzaXplKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImJzZGRiIGtleSB0eXBlIG11c3QgYmUgc3RyaW5nIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJa3JlYy5kYXRhID0gZGF0YTsKLQkJa3JlYy5zaXplID0gc2l6ZTsKLQl9Ci0JY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgLTEpOwotCWRwLT5kaV9zaXplID0gLTE7Ci0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJQlNEREJfQkdOX1NBVkUoZHApCi0JCXN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPmRlbCkoZHAtPmRpX2JzZGRiLCAma3JlYywgMCk7Ci0JCUJTRERCX0VORF9TQVZFKGRwKQotCX0KLQllbHNlIHsKLQkJaWYgKCFQeUFyZ19QYXJzZSh2YWx1ZSwgInMjIiwgJmRhdGEsICZzaXplKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImJzZGRiIHZhbHVlIHR5cGUgbXVzdCBiZSBzdHJpbmciKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlkcmVjLmRhdGEgPSBkYXRhOwotCQlkcmVjLnNpemUgPSBzaXplOwotCQlCU0REQl9CR05fU0FWRShkcCkKLQkJc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+cHV0KShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgMCk7Ci0JCUJTRERCX0VORF9TQVZFKGRwKQotCX0KLQlpZiAoc3RhdHVzICE9IDApIHsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwga2V5KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoZHAtPmRpX3R5cGUgPT0gREJfUkVDTk8pIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShrZXksICJpIiwgJnJlY25vKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnNkZGIga2V5IHR5cGUgbXVzdCBiZSBpbnRlZ2VyIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAga3JlYy5kYXRhID0gJnJlY25vOworICAgICAgICBrcmVjLnNpemUgPSBzaXplb2YocmVjbm8pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShrZXksICJzIyIsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJzZGRiIGtleSB0eXBlIG11c3QgYmUgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAga3JlYy5kYXRhID0gZGF0YTsKKyAgICAgICAga3JlYy5zaXplID0gc2l6ZTsKKyAgICB9CisgICAgY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgLTEpOworICAgIGRwLT5kaV9zaXplID0gLTE7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgQlNEREJfQkdOX1NBVkUoZHApCisgICAgICAgIHN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPmRlbCkoZHAtPmRpX2JzZGRiLCAma3JlYywgMCk7CisgICAgICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh2YWx1ZSwgInMjIiwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnNkZGIgdmFsdWUgdHlwZSBtdXN0IGJlIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGRyZWMuZGF0YSA9IGRhdGE7CisgICAgICAgIGRyZWMuc2l6ZSA9IHNpemU7CisgICAgICAgIEJTRERCX0JHTl9TQVZFKGRwKQorICAgICAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5wdXQpKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCAwKTsKKyAgICAgICAgQlNEREJfRU5EX1NBVkUoZHApCisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBrZXkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBic2RkYl9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKWJzZGRiX2xlbmd0aCwJCS8qbXBfbGVuZ3RoKi8KLQkoYmluYXJ5ZnVuYylic2RkYl9zdWJzY3JpcHQsCS8qbXBfc3Vic2NyaXB0Ki8KLQkob2Jqb2JqYXJncHJvYylic2RkYl9hc3Nfc3ViLAkvKm1wX2Fzc19zdWJzY3JpcHQqLworICAgIChsZW5mdW5jKWJzZGRiX2xlbmd0aCwgICAgICAgICAgICAgIC8qbXBfbGVuZ3RoKi8KKyAgICAoYmluYXJ5ZnVuYylic2RkYl9zdWJzY3JpcHQsICAgICAgICAvKm1wX3N1YnNjcmlwdCovCisgICAgKG9iam9iamFyZ3Byb2MpYnNkZGJfYXNzX3N1YiwgICAgICAgLyptcF9hc3Nfc3Vic2NyaXB0Ki8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9jbG9zZShic2RkYm9iamVjdCAqZHApCiB7Ci0JaWYgKGRwLT5kaV9ic2RkYiAhPSBOVUxMKSB7Ci0JCWludCBzdGF0dXM7Ci0JCUJTRERCX0JHTl9TQVZFKGRwKQotCQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5jbG9zZSkoZHAtPmRpX2JzZGRiKTsKLQkJQlNEREJfRU5EX1NBVkUoZHApCi0JCWlmIChzdGF0dXMgIT0gMCkgewotCQkJZHAtPmRpX2JzZGRiID0gTlVMTDsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWRwLT5kaV9ic2RkYiA9IE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChkcC0+ZGlfYnNkZGIgIT0gTlVMTCkgeworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICAgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+Y2xvc2UpKGRwLT5kaV9ic2RkYik7CisgICAgICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIGRwLT5kaV9ic2RkYiA9IE5VTEw7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBkcC0+ZGlfYnNkZGIgPSBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX2tleXMoYnNkZGJvYmplY3QgKmRwKQogewotCVB5T2JqZWN0ICpsaXN0LCAqaXRlbT1OVUxMOwotCURCVCBrcmVjLCBkcmVjOwotCWNoYXIgKmRhdGE9TlVMTCxidWZbNDA5Nl07Ci0JaW50IHN0YXR1czsKLQlpbnQgZXJyOworICAgIFB5T2JqZWN0ICpsaXN0LCAqaXRlbT1OVUxMOworICAgIERCVCBrcmVjLCBkcmVjOworICAgIGNoYXIgKmRhdGE9TlVMTCxidWZbNDA5Nl07CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgZXJyOwogCi0JY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7Ci0JbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JQlNEREJfQkdOX1NBVkUoZHApCi0Jc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgUl9GSVJTVCk7Ci0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmIChrcmVjLnNpemUgPiBzaXplb2YoYnVmKSkgZGF0YSA9IG1hbGxvYyhrcmVjLnNpemUpOwotCQllbHNlIGRhdGEgPSBidWY7Ci0JCWlmIChkYXRhICE9IE5VTEwpIG1lbWNweShkYXRhLGtyZWMuZGF0YSxrcmVjLnNpemUpOwotCX0KLQlCU0REQl9FTkRfU0FWRShkcCkKLQlpZiAoc3RhdHVzID09IDAgJiYgZGF0YT09TlVMTCkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0Jd2hpbGUgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykKLQkJCWl0ZW0gPSBQeUludF9Gcm9tTG9uZygqKChpbnQqKWRhdGEpKTsKLQkJZWxzZQotCQkJaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsCi0JCQkJCQkJICAoaW50KWtyZWMuc2l6ZSk7Ci0JCWlmIChkYXRhICE9IGJ1ZikgZnJlZShkYXRhKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAoZXJyICE9IDApIHsKLQkJCVB5X0RFQ1JFRihsaXN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCUJTRERCX0JHTl9TQVZFKGRwKQotCQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpCi0JCQkoZHAtPmRpX2JzZGRiLCAma3JlYywgJmRyZWMsIFJfTkVYVCk7Ci0JCWlmIChzdGF0dXMgPT0gMCkgewotCQkJaWYgKGtyZWMuc2l6ZSA+IHNpemVvZihidWYpKQotCQkJCWRhdGEgPSBtYWxsb2Moa3JlYy5zaXplKTsKLQkJCWVsc2UgZGF0YSA9IGJ1ZjsKLQkJCWlmIChkYXRhICE9IE5VTEwpCi0JCQkJbWVtY3B5KGRhdGEsa3JlYy5kYXRhLGtyZWMuc2l6ZSk7Ci0JCX0KLQkJQlNEREJfRU5EX1NBVkUoZHApCi0JCWlmIChkYXRhID09IE5VTEwpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlpZiAoc3RhdHVzIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7Ci0JCVB5X0RFQ1JFRihsaXN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChkcC0+ZGlfc2l6ZSA8IDApCi0JCWRwLT5kaV9zaXplID0gUHlMaXN0X1NpemUobGlzdCk7IC8qIFdlIGp1c3QgZGlkIHRoZSB3b3JrICovCi0JcmV0dXJuIGxpc3Q7CisgICAgY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQlNEREJfQkdOX1NBVkUoZHApCisgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgUl9GSVJTVCk7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGlmIChrcmVjLnNpemUgPiBzaXplb2YoYnVmKSkgZGF0YSA9IG1hbGxvYyhrcmVjLnNpemUpOworICAgICAgICBlbHNlIGRhdGEgPSBidWY7CisgICAgICAgIGlmIChkYXRhICE9IE5VTEwpIG1lbWNweShkYXRhLGtyZWMuZGF0YSxrcmVjLnNpemUpOworICAgIH0KKyAgICBCU0REQl9FTkRfU0FWRShkcCkKKyAgICBpZiAoc3RhdHVzID09IDAgJiYgZGF0YT09TlVMTCkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgd2hpbGUgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykKKyAgICAgICAgICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZygqKChpbnQqKWRhdGEpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClrcmVjLnNpemUpOworICAgICAgICBpZiAoZGF0YSAhPSBidWYpIGZyZWUoZGF0YSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICAgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKQorICAgICAgICAgICAgKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCBSX05FWFQpOworICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgIGlmIChrcmVjLnNpemUgPiBzaXplb2YoYnVmKSkKKyAgICAgICAgICAgICAgICBkYXRhID0gbWFsbG9jKGtyZWMuc2l6ZSk7CisgICAgICAgICAgICBlbHNlIGRhdGEgPSBidWY7CisgICAgICAgICAgICBpZiAoZGF0YSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIG1lbWNweShkYXRhLGtyZWMuZGF0YSxrcmVjLnNpemUpOworICAgICAgICB9CisgICAgICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgICAgICBpZiAoZGF0YSA9PSBOVUxMKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOworICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZHAtPmRpX3NpemUgPCAwKQorICAgICAgICBkcC0+ZGlfc2l6ZSA9IFB5TGlzdF9TaXplKGxpc3QpOyAvKiBXZSBqdXN0IGRpZCB0aGUgd29yayAqLworICAgIHJldHVybiBsaXN0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfaGFzX2tleShic2RkYm9iamVjdCAqZHAsIFB5T2JqZWN0ICphcmdzKQogewotCURCVCBrcmVjLCBkcmVjOwotCWludCBzdGF0dXM7Ci0JY2hhciAqZGF0YTsKLQlpbnQgc2l6ZTsKLQlyZWNub190IHJlY25vOworICAgIERCVCBrcmVjLCBkcmVjOworICAgIGludCBzdGF0dXM7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgc2l6ZTsKKyAgICByZWNub190IHJlY25vOwogCi0JaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTtrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiLAotCQkJCSAgICAgICZyZWNubykpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWtyZWMuZGF0YSA9ICZyZWNubzsKLQkJa3JlYy5zaXplID0gc2l6ZW9mKHJlY25vKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM7a2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciLAotCQkJCSAgICAgICZkYXRhLCAmc2l6ZSkpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWtyZWMuZGF0YSA9IGRhdGE7Ci0JCWtyZWMuc2l6ZSA9IHNpemU7Ci0JfQotCWNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOworICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk7a2V5IHR5cGUgbXVzdCBiZSBpbnRlZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNubykpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGtyZWMuZGF0YSA9ICZyZWNubzsKKyAgICAgICAga3JlYy5zaXplID0gc2l6ZW9mKHJlY25vKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM7a2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAga3JlYy5kYXRhID0gZGF0YTsKKyAgICAgICAga3JlYy5zaXplID0gc2l6ZTsKKyAgICB9CisgICAgY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7CiAKLQlCU0REQl9CR05fU0FWRShkcCkKLQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5nZXQpKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCAwKTsKLQlCU0REQl9FTkRfU0FWRShkcCkKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5nZXQpKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCAwKTsKKyAgICBCU0REQl9FTkRfU0FWRShkcCkKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzdGF0dXMgPT0gMCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHN0YXR1cyA9PSAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX3NldF9sb2NhdGlvbihic2RkYm9iamVjdCAqZHAsIFB5T2JqZWN0ICprZXkpCiB7Ci0JaW50IHN0YXR1czsKLQlEQlQga3JlYywgZHJlYzsKLQljaGFyICpkYXRhID0gTlVMTDsKLQljaGFyIGJ1Zls0MDk2XTsKLQlpbnQgc2l6ZTsKLQlQeU9iamVjdCAqcmVzdWx0OwotCXJlY25vX3QgcmVjbm87CisgICAgaW50IHN0YXR1czsKKyAgICBEQlQga3JlYywgZHJlYzsKKyAgICBjaGFyICpkYXRhID0gTlVMTDsKKyAgICBjaGFyIGJ1Zls0MDk2XTsKKyAgICBpbnQgc2l6ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIHJlY25vX3QgcmVjbm87CiAKLQlpZiAoZHAtPmRpX3R5cGUgPT0gREJfUkVDTk8pIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGtleSwgImk7a2V5IHR5cGUgbXVzdCBiZSBpbnRlZ2VyIiwKLQkJCQkgICAgICAmcmVjbm8pKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlrcmVjLmRhdGEgPSAmcmVjbm87Ci0JCWtyZWMuc2l6ZSA9IHNpemVvZihyZWNubyk7Ci0JfQotCWVsc2UgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoa2V5LCAicyM7a2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciLAotCQkJCSAgICAgICZkYXRhLCAmc2l6ZSkpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWtyZWMuZGF0YSA9IGRhdGE7Ci0JCWtyZWMuc2l6ZSA9IHNpemU7Ci0JfQotCWNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOworICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoa2V5LCAiaTtrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY25vKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAga3JlYy5kYXRhID0gJnJlY25vOworICAgICAgICBrcmVjLnNpemUgPSBzaXplb2YocmVjbm8pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGtleSwgInMjO2tleSB0eXBlIG11c3QgYmUgc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGtyZWMuZGF0YSA9IGRhdGE7CisgICAgICAgIGtyZWMuc2l6ZSA9IHNpemU7CisgICAgfQorICAgIGNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOwogCi0JQlNEREJfQkdOX1NBVkUoZHApCi0Jc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgUl9DVVJTT1IpOwotCWlmIChzdGF0dXMgPT0gMCkgewotCQlpZiAoZHJlYy5zaXplID4gc2l6ZW9mKGJ1ZikpIGRhdGEgPSBtYWxsb2MoZHJlYy5zaXplKTsKLQkJZWxzZSBkYXRhID0gYnVmOwotCQlpZiAoZGF0YSE9TlVMTCkgbWVtY3B5KGRhdGEsZHJlYy5kYXRhLGRyZWMuc2l6ZSk7Ci0JfQotCUJTRERCX0VORF9TQVZFKGRwKQotCWlmIChkYXRhPT1OVUxMKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoc3RhdHVzICE9IDApIHsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwga2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIEJTRERCX0JHTl9TQVZFKGRwKQorICAgIHN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnNlcSkoZHAtPmRpX2JzZGRiLCAma3JlYywgJmRyZWMsIFJfQ1VSU09SKTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaWYgKGRyZWMuc2l6ZSA+IHNpemVvZihidWYpKSBkYXRhID0gbWFsbG9jKGRyZWMuc2l6ZSk7CisgICAgICAgIGVsc2UgZGF0YSA9IGJ1ZjsKKyAgICAgICAgaWYgKGRhdGEhPU5VTEwpIG1lbWNweShkYXRhLGRyZWMuZGF0YSxkcmVjLnNpemUpOworICAgIH0KKyAgICBCU0REQl9FTkRfU0FWRShkcCkKKyAgICBpZiAoZGF0YT09TlVMTCkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGtleSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykKLQkJcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiaXMjIiwgKigoaW50KilrcmVjLmRhdGEpLAotCQkJCSAgICAgICBkYXRhLCBkcmVjLnNpemUpOwotCWVsc2UKLQkJcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgicyNzIyIsIGtyZWMuZGF0YSwga3JlYy5zaXplLAotCQkJCSAgICAgICBkYXRhLCBkcmVjLnNpemUpOwotCWlmIChkYXRhICE9IGJ1ZikgZnJlZShkYXRhKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykKKyAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiaXMjIiwgKigoaW50KilrcmVjLmRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGRyZWMuc2l6ZSk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJzI3MjIiwga3JlYy5kYXRhLCBrcmVjLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZHJlYy5zaXplKTsKKyAgICBpZiAoZGF0YSAhPSBidWYpIGZyZWUoZGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX3NlcShic2RkYm9iamVjdCAqZHAsIGludCBzZXF1ZW5jZV9yZXF1ZXN0KQogewotCWludCBzdGF0dXM7Ci0JREJUIGtyZWMsIGRyZWM7Ci0JY2hhciAqa2RhdGE9TlVMTCxrYnVmWzQwOTZdOwotCWNoYXIgKmRkYXRhPU5VTEwsZGJ1Zls0MDk2XTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBzdGF0dXM7CisgICAgREJUIGtyZWMsIGRyZWM7CisgICAgY2hhciAqa2RhdGE9TlVMTCxrYnVmWzQwOTZdOworICAgIGNoYXIgKmRkYXRhPU5VTEwsZGJ1Zls0MDk2XTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7Ci0Ja3JlYy5kYXRhID0gMDsKLQlrcmVjLnNpemUgPSAwOworICAgIGNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOworICAgIGtyZWMuZGF0YSA9IDA7CisgICAga3JlYy5zaXplID0gMDsKIAotCUJTRERCX0JHTl9TQVZFKGRwKQotCXN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnNlcSkoZHAtPmRpX2JzZGRiLCAma3JlYywKLQkJCQkgICAgICZkcmVjLCBzZXF1ZW5jZV9yZXF1ZXN0KTsKLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKGtyZWMuc2l6ZSA+IHNpemVvZihrYnVmKSkga2RhdGEgPSBtYWxsb2Moa3JlYy5zaXplKTsKLQkJZWxzZSBrZGF0YSA9IGtidWY7Ci0JCWlmIChrZGF0YSAhPSBOVUxMKSBtZW1jcHkoa2RhdGEsa3JlYy5kYXRhLGtyZWMuc2l6ZSk7Ci0JCWlmIChkcmVjLnNpemUgPiBzaXplb2YoZGJ1ZikpIGRkYXRhID0gbWFsbG9jKGRyZWMuc2l6ZSk7Ci0JCWVsc2UgZGRhdGEgPSBkYnVmOwotCQlpZiAoZGRhdGEgIT0gTlVMTCkgbWVtY3B5KGRkYXRhLGRyZWMuZGF0YSxkcmVjLnNpemUpOwotCX0KLQlCU0REQl9FTkRfU0FWRShkcCkKLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKChrZGF0YSA9PSBOVUxMKSB8fCAoZGRhdGEgPT0gTlVMTCkpIAotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCWVsc2UgeyAKLQkJLyogKHN0YXR1cyAhPSAwKSAqLyAgCi0JCWlmIChzdGF0dXMgPCAwKQotCQkJUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJubyBrZXkvZGF0YSBwYWlycyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgQlNEREJfQkdOX1NBVkUoZHApCisgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsICZrcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyZWMsIHNlcXVlbmNlX3JlcXVlc3QpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpZiAoa3JlYy5zaXplID4gc2l6ZW9mKGtidWYpKSBrZGF0YSA9IG1hbGxvYyhrcmVjLnNpemUpOworICAgICAgICBlbHNlIGtkYXRhID0ga2J1ZjsKKyAgICAgICAgaWYgKGtkYXRhICE9IE5VTEwpIG1lbWNweShrZGF0YSxrcmVjLmRhdGEsa3JlYy5zaXplKTsKKyAgICAgICAgaWYgKGRyZWMuc2l6ZSA+IHNpemVvZihkYnVmKSkgZGRhdGEgPSBtYWxsb2MoZHJlYy5zaXplKTsKKyAgICAgICAgZWxzZSBkZGF0YSA9IGRidWY7CisgICAgICAgIGlmIChkZGF0YSAhPSBOVUxMKSBtZW1jcHkoZGRhdGEsZHJlYy5kYXRhLGRyZWMuc2l6ZSk7CisgICAgfQorICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpZiAoKGtkYXRhID09IE5VTEwpIHx8IChkZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogKHN0YXR1cyAhPSAwKSAqLworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLCAibm8ga2V5L2RhdGEgcGFpcnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKQotCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJpcyMiLCAqKChpbnQqKWtkYXRhKSwKLQkJCQkgICAgICAgZGRhdGEsIGRyZWMuc2l6ZSk7Ci0JZWxzZQotCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJzI3MjIiwga2RhdGEsIGtyZWMuc2l6ZSwKLQkJCQkgICAgICAgZGRhdGEsIGRyZWMuc2l6ZSk7Ci0JaWYgKGtkYXRhICE9IGtidWYpIGZyZWUoa2RhdGEpOwotCWlmIChkZGF0YSAhPSBkYnVmKSBmcmVlKGRkYXRhKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykKKyAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiaXMjIiwgKigoaW50KilrZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRhdGEsIGRyZWMuc2l6ZSk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJzI3MjIiwga2RhdGEsIGtyZWMuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZGF0YSwgZHJlYy5zaXplKTsKKyAgICBpZiAoa2RhdGEgIT0ga2J1ZikgZnJlZShrZGF0YSk7CisgICAgaWYgKGRkYXRhICE9IGRidWYpIGZyZWUoZGRhdGEpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9uZXh0KGJzZGRib2JqZWN0ICpkcCkKIHsKLQlyZXR1cm4gYnNkZGJfc2VxKGRwLCBSX05FWFQpOworICAgIHJldHVybiBic2RkYl9zZXEoZHAsIFJfTkVYVCk7CiB9CiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfcHJldmlvdXMoYnNkZGJvYmplY3QgKmRwKQogewotCXJldHVybiBic2RkYl9zZXEoZHAsIFJfUFJFVik7CisgICAgcmV0dXJuIGJzZGRiX3NlcShkcCwgUl9QUkVWKTsKIH0KIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9maXJzdChic2RkYm9iamVjdCAqZHApCiB7Ci0JcmV0dXJuIGJzZGRiX3NlcShkcCwgUl9GSVJTVCk7CisgICAgcmV0dXJuIGJzZGRiX3NlcShkcCwgUl9GSVJTVCk7CiB9CiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfbGFzdChic2RkYm9iamVjdCAqZHApCiB7Ci0JcmV0dXJuIGJzZGRiX3NlcShkcCwgUl9MQVNUKTsKKyAgICByZXR1cm4gYnNkZGJfc2VxKGRwLCBSX0xBU1QpOwogfQogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX3N5bmMoYnNkZGJvYmplY3QgKmRwKQogewotCWludCBzdGF0dXM7CisgICAgaW50IHN0YXR1czsKIAotCWNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOwotCUJTRERCX0JHTl9TQVZFKGRwKQotCXN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnN5bmMpKGRwLT5kaV9ic2RkYiwgMCk7Ci0JQlNEREJfRU5EX1NBVkUoZHApCi0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKKyAgICBjaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCBOVUxMKTsKKyAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zeW5jKShkcC0+ZGlfYnNkZGIsIDApOworICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7CiB9CiBzdGF0aWMgUHlNZXRob2REZWYgYnNkZGJfbWV0aG9kc1tdID0gewotCXsiY2xvc2UiLAkJKFB5Q0Z1bmN0aW9uKWJzZGRiX2Nsb3NlLCBNRVRIX05PQVJHU30sCi0JeyJrZXlzIiwJCShQeUNGdW5jdGlvbilic2RkYl9rZXlzLCBNRVRIX05PQVJHU30sCi0JeyJoYXNfa2V5IiwJCShQeUNGdW5jdGlvbilic2RkYl9oYXNfa2V5LCBNRVRIX1ZBUkFSR1N9LAotCXsic2V0X2xvY2F0aW9uIiwJKFB5Q0Z1bmN0aW9uKWJzZGRiX3NldF9sb2NhdGlvbiwgTUVUSF9WQVJBUkdTfSwKLQl7Im5leHQiLAkJKFB5Q0Z1bmN0aW9uKWJzZGRiX25leHQsIE1FVEhfTk9BUkdTfSwKLQl7InByZXZpb3VzIiwJKFB5Q0Z1bmN0aW9uKWJzZGRiX3ByZXZpb3VzLCBNRVRIX05PQVJHU30sCi0JeyJmaXJzdCIsCQkoUHlDRnVuY3Rpb24pYnNkZGJfZmlyc3QsIE1FVEhfTk9BUkdTfSwKLQl7Imxhc3QiLAkJKFB5Q0Z1bmN0aW9uKWJzZGRiX2xhc3QsIE1FVEhfTk9BUkdTfSwKLQl7InN5bmMiLAkJKFB5Q0Z1bmN0aW9uKWJzZGRiX3N5bmMsIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwJICAgICAgIAlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImNsb3NlIiwgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJzZGRiX2Nsb3NlLCBNRVRIX05PQVJHU30sCisgICAgeyJrZXlzIiwgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RkYl9rZXlzLCBNRVRIX05PQVJHU30sCisgICAgeyJoYXNfa2V5IiwgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RkYl9oYXNfa2V5LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0X2xvY2F0aW9uIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkZGJfc2V0X2xvY2F0aW9uLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsibmV4dCIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkZGJfbmV4dCwgTUVUSF9OT0FSR1N9LAorICAgIHsicHJldmlvdXMiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWJzZGRiX3ByZXZpb3VzLCBNRVRIX05PQVJHU30sCisgICAgeyJmaXJzdCIsICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RkYl9maXJzdCwgTUVUSF9OT0FSR1N9LAorICAgIHsibGFzdCIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkZGJfbGFzdCwgTUVUSF9OT0FSR1N9LAorICAgIHsic3luYyIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkZGJfc3luYywgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfZ2V0YXR0cihQeU9iamVjdCAqZHAsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoYnNkZGJfbWV0aG9kcywgZHAsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGJzZGRiX21ldGhvZHMsIGRwLCBuYW1lKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBCc2RkYnR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwKLQkiYnNkZGIuYnNkZGIiLAotCXNpemVvZihic2RkYm9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3Rvcilic2RkYl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWJzZGRiX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkmYnNkZGJfYXNfbWFwcGluZywJLyp0cF9hc19tYXBwaW5nKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLAorICAgICJic2RkYi5ic2RkYiIsCisgICAgc2l6ZW9mKGJzZGRib2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWJzZGRiX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylic2RkYl9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgICZic2RkYl9hc19tYXBwaW5nLCAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGhhc2hvcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmaWxlOwotCWNoYXIgKmZsYWcgPSBOVUxMOwotCWludCBmbGFncyA9IE9fUkRPTkxZOwotCWludCBtb2RlID0gMDY2NjsKLQlpbnQgYnNpemUgPSAwOwotCWludCBmZmFjdG9yID0gMDsKLQlpbnQgbmVsZW0gPSAwOwotCWludCBjYWNoZXNpemUgPSAwOwotCWludCBoYXNoID0gMDsgLyogWFhYIGN1cnJlbnRseSBpZ25vcmVkICovCi0JaW50IGxvcmRlciA9IDA7CisgICAgY2hhciAqZmlsZTsKKyAgICBjaGFyICpmbGFnID0gTlVMTDsKKyAgICBpbnQgZmxhZ3MgPSBPX1JET05MWTsKKyAgICBpbnQgbW9kZSA9IDA2NjY7CisgICAgaW50IGJzaXplID0gMDsKKyAgICBpbnQgZmZhY3RvciA9IDA7CisgICAgaW50IG5lbGVtID0gMDsKKyAgICBpbnQgY2FjaGVzaXplID0gMDsKKyAgICBpbnQgaGFzaCA9IDA7IC8qIFhYWCBjdXJyZW50bHkgaWdub3JlZCAqLworICAgIGludCBsb3JkZXIgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6fHNpaWlpaWlpOmhhc2hvcGVuIiwKLQkJCSAgICAgICZmaWxlLCAmZmxhZywgJm1vZGUsCi0JCQkgICAgICAmYnNpemUsICZmZmFjdG9yLCAmbmVsZW0sICZjYWNoZXNpemUsCi0JCQkgICAgICAmaGFzaCwgJmxvcmRlcikpCi0JCXJldHVybiBOVUxMOwotCWlmIChmbGFnICE9IE5VTEwpIHsKLQkJLyogWFhYIG5lZWQgdG8gcGFzcyBPX0VYQ0wsIE9fRVhMT0NLLCBPX05PTkJMT0NLLCBPX1NITE9DSyAqLwotCQlpZiAoZmxhZ1swXSA9PSAncicpCi0JCQlmbGFncyA9IE9fUkRPTkxZOwotCQllbHNlIGlmIChmbGFnWzBdID09ICd3JykKLQkJCWZsYWdzID0gT19SRFdSOwotCQllbHNlIGlmIChmbGFnWzBdID09ICdjJykKLQkJCWZsYWdzID0gT19SRFdSfE9fQ1JFQVQ7Ci0JCWVsc2UgaWYgKGZsYWdbMF0gPT0gJ24nKQotCQkJZmxhZ3MgPSBPX1JEV1J8T19DUkVBVHxPX1RSVU5DOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAotCQkJCSJGbGFnIHNob3VsZCBiZWdpbiB3aXRoICdyJywgJ3cnLCAnYycgb3IgJ24nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoZmxhZ1sxXSA9PSAnbCcpIHsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp8c2lpaWlpaWk6aGFzaG9wZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZSwgJmZsYWcsICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnNpemUsICZmZmFjdG9yLCAmbmVsZW0sICZjYWNoZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXNoLCAmbG9yZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgICAgICAvKiBYWFggbmVlZCB0byBwYXNzIE9fRVhDTCwgT19FWExPQ0ssIE9fTk9OQkxPQ0ssIE9fU0hMT0NLICovCisgICAgICAgIGlmIChmbGFnWzBdID09ICdyJykKKyAgICAgICAgICAgIGZsYWdzID0gT19SRE9OTFk7CisgICAgICAgIGVsc2UgaWYgKGZsYWdbMF0gPT0gJ3cnKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JEV1I7CisgICAgICAgIGVsc2UgaWYgKGZsYWdbMF0gPT0gJ2MnKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JEV1J8T19DUkVBVDsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAnbicpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUnxPX0NSRUFUfE9fVFJVTkM7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCisgICAgICAgICAgICAgICAgIkZsYWcgc2hvdWxkIGJlZ2luIHdpdGggJ3InLCAndycsICdjJyBvciAnbiciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFnWzFdID09ICdsJykgewogI2lmIGRlZmluZWQoT19FWExPQ0spICYmIGRlZmluZWQoT19TSExPQ0spCi0JCQlpZiAoZmxhZ1swXSA9PSAncicpCi0JCQkJZmxhZ3MgfD0gT19TSExPQ0s7Ci0JCQllbHNlCi0JCQkJZmxhZ3MgfD0gT19FWExPQ0s7CisgICAgICAgICAgICBpZiAoZmxhZ1swXSA9PSAncicpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gT19TSExPQ0s7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gT19FWExPQ0s7CiAjZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCi0JCQkJICAgICAibG9ja2luZyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKLQkJCXJldHVybiBOVUxMOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2tpbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgotCQl9Ci0JfQotCXJldHVybiBuZXdkYmhhc2hvYmplY3QoZmlsZSwgZmxhZ3MsIG1vZGUsCi0JCQkgICAgICAgYnNpemUsIGZmYWN0b3IsIG5lbGVtLCBjYWNoZXNpemUsIGhhc2gsIGxvcmRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ld2RiaGFzaG9iamVjdChmaWxlLCBmbGFncywgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzaXplLCBmZmFjdG9yLCBuZWxlbSwgY2FjaGVzaXplLCBoYXNoLCBsb3JkZXIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnNkYnRvcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmaWxlOwotCWNoYXIgKmZsYWcgPSBOVUxMOwotCWludCBmbGFncyA9IE9fUkRPTkxZOwotCWludCBtb2RlID0gMDY2NjsKLQlpbnQgY2FjaGVzaXplID0gMDsKLQlpbnQgbWF4a2V5cGFnZSA9IDA7Ci0JaW50IG1pbmtleXBhZ2UgPSAwOwotCWludCBidGZsYWdzID0gMDsKLQl1bnNpZ25lZCBpbnQgcHNpemUgPSAwOwotCWludCBsb3JkZXIgPSAwOworICAgIGNoYXIgKmZpbGU7CisgICAgY2hhciAqZmxhZyA9IE5VTEw7CisgICAgaW50IGZsYWdzID0gT19SRE9OTFk7CisgICAgaW50IG1vZGUgPSAwNjY2OworICAgIGludCBjYWNoZXNpemUgPSAwOworICAgIGludCBtYXhrZXlwYWdlID0gMDsKKyAgICBpbnQgbWlua2V5cGFnZSA9IDA7CisgICAgaW50IGJ0ZmxhZ3MgPSAwOworICAgIHVuc2lnbmVkIGludCBwc2l6ZSA9IDA7CisgICAgaW50IGxvcmRlciA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp8c2lpaWlpaWk6YnRvcGVuIiwKLQkJCSAgICAgICZmaWxlLCAmZmxhZywgJm1vZGUsCi0JCQkgICAgICAmYnRmbGFncywgJmNhY2hlc2l6ZSwgJm1heGtleXBhZ2UsICZtaW5rZXlwYWdlLAotCQkJICAgICAgJnBzaXplLCAmbG9yZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGZsYWcgIT0gTlVMTCkgewotCQkvKiBYWFggbmVlZCB0byBwYXNzIE9fRVhDTCwgT19FWExPQ0ssIE9fTk9OQkxPQ0ssIE9fU0hMT0NLICovCi0JCWlmIChmbGFnWzBdID09ICdyJykKLQkJCWZsYWdzID0gT19SRE9OTFk7Ci0JCWVsc2UgaWYgKGZsYWdbMF0gPT0gJ3cnKQotCQkJZmxhZ3MgPSBPX1JEV1I7Ci0JCWVsc2UgaWYgKGZsYWdbMF0gPT0gJ2MnKQotCQkJZmxhZ3MgPSBPX1JEV1J8T19DUkVBVDsKLQkJZWxzZSBpZiAoZmxhZ1swXSA9PSAnbicpCi0JCQlmbGFncyA9IE9fUkRXUnxPX0NSRUFUfE9fVFJVTkM7Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCi0JCQkgICAgICAgIkZsYWcgc2hvdWxkIGJlZ2luIHdpdGggJ3InLCAndycsICdjJyBvciAnbiciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChmbGFnWzFdID09ICdsJykgeworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxzaWlpaWlpaTpidG9wZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZSwgJmZsYWcsICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnRmbGFncywgJmNhY2hlc2l6ZSwgJm1heGtleXBhZ2UsICZtaW5rZXlwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNpemUsICZsb3JkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgICAgIC8qIFhYWCBuZWVkIHRvIHBhc3MgT19FWENMLCBPX0VYTE9DSywgT19OT05CTE9DSywgT19TSExPQ0sgKi8KKyAgICAgICAgaWYgKGZsYWdbMF0gPT0gJ3InKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JET05MWTsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAndycpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUjsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAnYycpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUnxPX0NSRUFUOworICAgICAgICBlbHNlIGlmIChmbGFnWzBdID09ICduJykKKyAgICAgICAgICAgIGZsYWdzID0gT19SRFdSfE9fQ1JFQVR8T19UUlVOQzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiRmxhZyBzaG91bGQgYmVnaW4gd2l0aCAncicsICd3JywgJ2MnIG9yICduJyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdbMV0gPT0gJ2wnKSB7CiAjaWYgZGVmaW5lZChPX0VYTE9DSykgJiYgZGVmaW5lZChPX1NITE9DSykKLQkJCWlmIChmbGFnWzBdID09ICdyJykKLQkJCQlmbGFncyB8PSBPX1NITE9DSzsKLQkJCWVsc2UKLQkJCQlmbGFncyB8PSBPX0VYTE9DSzsKKyAgICAgICAgICAgIGlmIChmbGFnWzBdID09ICdyJykKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBPX1NITE9DSzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBPX0VYTE9DSzsKICNlbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKLQkJCQkgICAgImxvY2tpbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7Ci0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvY2tpbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgotCQl9Ci0JfQotCXJldHVybiBuZXdkYmJ0b2JqZWN0KGZpbGUsIGZsYWdzLCBtb2RlLAotCQkJICAgICBidGZsYWdzLCBjYWNoZXNpemUsIG1heGtleXBhZ2UsIG1pbmtleXBhZ2UsCi0JCQkgICAgIHBzaXplLCBsb3JkZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXdkYmJ0b2JqZWN0KGZpbGUsIGZsYWdzLCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ0ZmxhZ3MsIGNhY2hlc2l6ZSwgbWF4a2V5cGFnZSwgbWlua2V5cGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwc2l6ZSwgbG9yZGVyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZHJub3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZmlsZTsKLQljaGFyICpmbGFnID0gTlVMTDsKLQlpbnQgZmxhZ3MgPSBPX1JET05MWTsKLQlpbnQgbW9kZSA9IDA2NjY7Ci0JaW50IGNhY2hlc2l6ZSA9IDA7Ci0JaW50IHJuZmxhZ3MgPSAwOwotCXVuc2lnbmVkIGludCBwc2l6ZSA9IDA7Ci0JaW50IGxvcmRlciA9IDA7Ci0Jc2l6ZV90IHJlY2xlbiA9IDA7Ci0JY2hhciAgKmJ2YWwgPSAiIjsKLQljaGFyICpiZm5hbWUgPSBOVUxMOworICAgIGNoYXIgKmZpbGU7CisgICAgY2hhciAqZmxhZyA9IE5VTEw7CisgICAgaW50IGZsYWdzID0gT19SRE9OTFk7CisgICAgaW50IG1vZGUgPSAwNjY2OworICAgIGludCBjYWNoZXNpemUgPSAwOworICAgIGludCBybmZsYWdzID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgcHNpemUgPSAwOworICAgIGludCBsb3JkZXIgPSAwOworICAgIHNpemVfdCByZWNsZW4gPSAwOworICAgIGNoYXIgICpidmFsID0gIiI7CisgICAgY2hhciAqYmZuYW1lID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxzaWlpaWlpc3M6cm5vcGVuIiwKLQkJCSAgICAgICZmaWxlLCAmZmxhZywgJm1vZGUsCi0JCQkgICAgICAmcm5mbGFncywgJmNhY2hlc2l6ZSwgJnBzaXplLCAmbG9yZGVyLAotCQkJICAgICAgJnJlY2xlbiwgJmJ2YWwsICZiZm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp8c2lpaWlpaXNzOnJub3BlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlLCAmZmxhZywgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZybmZsYWdzLCAmY2FjaGVzaXplLCAmcHNpemUsICZsb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNsZW4sICZidmFsLCAmYmZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZmxhZyAhPSBOVUxMKSB7Ci0JCS8qIFhYWCBuZWVkIHRvIHBhc3MgT19FWENMLCBPX0VYTE9DSywgT19OT05CTE9DSywgT19TSExPQ0sgKi8KLQkJaWYgKGZsYWdbMF0gPT0gJ3InKQotCQkJZmxhZ3MgPSBPX1JET05MWTsKLQkJZWxzZSBpZiAoZmxhZ1swXSA9PSAndycpCi0JCQlmbGFncyA9IE9fUkRXUjsKLQkJZWxzZSBpZiAoZmxhZ1swXSA9PSAnYycpCi0JCQlmbGFncyA9IE9fUkRXUnxPX0NSRUFUOwotCQllbHNlIGlmIChmbGFnWzBdID09ICduJykKLQkJCWZsYWdzID0gT19SRFdSfE9fQ1JFQVR8T19UUlVOQzsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKLQkJCSAgICAgICAiRmxhZyBzaG91bGQgYmVnaW4gd2l0aCAncicsICd3JywgJ2MnIG9yICduJyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGZsYWdbMV0gPT0gJ2wnKSB7CisgICAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgICAgICAvKiBYWFggbmVlZCB0byBwYXNzIE9fRVhDTCwgT19FWExPQ0ssIE9fTk9OQkxPQ0ssIE9fU0hMT0NLICovCisgICAgICAgIGlmIChmbGFnWzBdID09ICdyJykKKyAgICAgICAgICAgIGZsYWdzID0gT19SRE9OTFk7CisgICAgICAgIGVsc2UgaWYgKGZsYWdbMF0gPT0gJ3cnKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JEV1I7CisgICAgICAgIGVsc2UgaWYgKGZsYWdbMF0gPT0gJ2MnKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JEV1J8T19DUkVBVDsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAnbicpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUnxPX0NSRUFUfE9fVFJVTkM7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIkZsYWcgc2hvdWxkIGJlZ2luIHdpdGggJ3InLCAndycsICdjJyBvciAnbiciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFnWzFdID09ICdsJykgewogI2lmIGRlZmluZWQoT19FWExPQ0spICYmIGRlZmluZWQoT19TSExPQ0spCi0JCQlpZiAoZmxhZ1swXSA9PSAncicpCi0JCQkJZmxhZ3MgfD0gT19TSExPQ0s7Ci0JCQllbHNlCi0JCQkJZmxhZ3MgfD0gT19FWExPQ0s7CisgICAgICAgICAgICBpZiAoZmxhZ1swXSA9PSAncicpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gT19TSExPQ0s7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gT19FWExPQ0s7CiAjZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCi0JCQkJICAgICJsb2NraW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOwotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsb2NraW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKLQkJfQotCQllbHNlIGlmIChmbGFnWzFdICE9ICdcMCcpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAotCQkJCSAgICAgICAiRmxhZyBjaGFyIDIgc2hvdWxkIGJlICdsJyBvciBhYnNlbnQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBuZXdkYnJub2JqZWN0KGZpbGUsIGZsYWdzLCBtb2RlLCBybmZsYWdzLCBjYWNoZXNpemUsCi0JCQkgICAgIHBzaXplLCBsb3JkZXIsIHJlY2xlbiwgYnZhbFswXSwgYmZuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmbGFnWzFdICE9ICdcMCcpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZsYWcgY2hhciAyIHNob3VsZCBiZSAnbCcgb3IgYWJzZW50Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3ZGJybm9iamVjdChmaWxlLCBmbGFncywgbW9kZSwgcm5mbGFncywgY2FjaGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzaXplLCBsb3JkZXIsIHJlY2xlbiwgYnZhbFswXSwgYmZuYW1lKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGJzZGRibW9kdWxlX21ldGhvZHNbXSA9IHsKLQl7Imhhc2hvcGVuIiwJKFB5Q0Z1bmN0aW9uKWJzZGhhc2hvcGVuLCBNRVRIX1ZBUkFSR1N9LAotCXsiYnRvcGVuIiwJKFB5Q0Z1bmN0aW9uKWJzZGJ0b3BlbiwgTUVUSF9WQVJBUkdTfSwKLQl7InJub3BlbiIsCShQeUNGdW5jdGlvbilic2Rybm9wZW4sIE1FVEhfVkFSQVJHU30sCi0JLyogc3RyaWN0bHkgZm9yIHVzZSBieSBkYmhoYXNoISEhICovCi0JeyJvcGVuIiwJKFB5Q0Z1bmN0aW9uKWJzZGhhc2hvcGVuLCBNRVRIX1ZBUkFSR1N9LAotCXswLAkJMH0sCisgICAgeyJoYXNob3BlbiIsICAgICAgICAoUHlDRnVuY3Rpb24pYnNkaGFzaG9wZW4sIE1FVEhfVkFSQVJHU30sCisgICAgeyJidG9wZW4iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkYnRvcGVuLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicm5vcGVuIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJzZHJub3BlbiwgTUVUSF9WQVJBUkdTfSwKKyAgICAvKiBzdHJpY3RseSBmb3IgdXNlIGJ5IGRiaGhhc2ghISEgKi8KKyAgICB7Im9wZW4iLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RoYXNob3BlbiwgTUVUSF9WQVJBUkdTfSwKKyAgICB7MCwgICAgICAgICAgICAgICAgIDB9LAogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRic2RkYjE4NSh2b2lkKSB7Ci0JUHlPYmplY3QgKm0sICpkOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGJzZGRiMTg1IG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCi0gICAgICAgIHJldHVybjsgICAgCisgICAgcmV0dXJuOwogCi0JQnNkZGJ0eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JbSA9IFB5X0luaXRNb2R1bGUoImJzZGRiMTg1IiwgYnNkZGJtb2R1bGVfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUJzZGRiRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImJzZGRiLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JaWYgKEJzZGRiRXJyb3IgIT0gTlVMTCkKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgQnNkZGJFcnJvcik7CisgICAgQnNkZGJ0eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoImJzZGRiMTg1IiwgYnNkZGJtb2R1bGVfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEJzZGRiRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImJzZGRiLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKEJzZGRiRXJyb3IgIT0gTlVMTCkKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgQnNkZGJFcnJvcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2J6Mm1vZHVsZS5jIGIvTW9kdWxlcy9iejJtb2R1bGUuYwppbmRleCBjM2RhZTdhLi44ZTA5NzY2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2J6Mm1vZHVsZS5jCisrKyBiL01vZHVsZXMvYnoybW9kdWxlLmMKQEAgLTQxLDIwICs0MSwyMCBAQAogI2RlZmluZSBNT0RFX1JFQURfRU9GIDIKICNkZWZpbmUgTU9ERV9XUklURSAgICAzCiAKLSNkZWZpbmUgQloyRmlsZU9iamVjdF9DaGVjayh2KQkoUHlfVFlQRSh2KSA9PSAmQloyRmlsZV9UeXBlKQorI2RlZmluZSBCWjJGaWxlT2JqZWN0X0NoZWNrKHYpICAoUHlfVFlQRSh2KSA9PSAmQloyRmlsZV9UeXBlKQogCiAKICNpZmRlZiBCWl9DT05GSUdfRVJST1IKIAogI2lmIFNJWkVPRl9MT05HID49IDgKICNkZWZpbmUgQlpTX1RPVEFMX09VVChienMpIFwKLQkoKChsb25nKWJ6cy0+dG90YWxfb3V0X2hpMzIgPDwgMzIpICsgYnpzLT50b3RhbF9vdXRfbG8zMikKKyAgICAoKChsb25nKWJ6cy0+dG90YWxfb3V0X2hpMzIgPDwgMzIpICsgYnpzLT50b3RhbF9vdXRfbG8zMikKICNlbGlmIFNJWkVPRl9MT05HX0xPTkcgPj0gOAogI2RlZmluZSBCWlNfVE9UQUxfT1VUKGJ6cykgXAotCSgoKFBZX0xPTkdfTE9ORylienMtPnRvdGFsX291dF9oaTMyIDw8IDMyKSArIGJ6cy0+dG90YWxfb3V0X2xvMzIpCisgICAgKCgoUFlfTE9OR19MT05HKWJ6cy0+dG90YWxfb3V0X2hpMzIgPDwgMzIpICsgYnpzLT50b3RhbF9vdXRfbG8zMikKICNlbHNlCiAjZGVmaW5lIEJaU19UT1RBTF9PVVQoYnpzKSBcCi0JYnpzLT50b3RhbF9vdXRfbG8zMgorICAgIGJ6cy0+dG90YWxfb3V0X2xvMzIKICNlbmRpZgogCiAjZWxzZSAvKiAhIEJaX0NPTkZJR19FUlJPUiAqLwpAQCAtNzksMTEgKzc5LDExIEBACiAKICNpZmRlZiBXSVRIX1RIUkVBRAogI2RlZmluZSBBQ1FVSVJFX0xPQ0sob2JqKSBkbyB7IFwKLQlpZiAoIVB5VGhyZWFkX2FjcXVpcmVfbG9jayhvYmotPmxvY2ssIDApKSB7IFwKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyBcCi0JCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhvYmotPmxvY2ssIDEpOyBcCi0JCVB5X0VORF9BTExPV19USFJFQURTIFwKLQl9IH0gd2hpbGUoMCkKKyAgICBpZiAoIVB5VGhyZWFkX2FjcXVpcmVfbG9jayhvYmotPmxvY2ssIDApKSB7IFwKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyBcCisgICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhvYmotPmxvY2ssIDEpOyBcCisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTIFwKKyAgICB9IH0gd2hpbGUoMCkKICNkZWZpbmUgUkVMRUFTRV9MT0NLKG9iaikgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKG9iai0+bG9jaykKICNlbHNlCiAjZGVmaW5lIEFDUVVJUkVfTE9DSyhvYmopCkBAIC05MSw1MyArOTEsNTMgQEAKICNlbmRpZgogCiAvKiBCaXRzIGluIGZfbmV3bGluZXR5cGVzICovCi0jZGVmaW5lIE5FV0xJTkVfVU5LTk9XTgkwCS8qIE5vIG5ld2xpbmUgc2VlbiwgeWV0ICovCi0jZGVmaW5lIE5FV0xJTkVfQ1IgMQkJLyogXHIgbmV3bGluZSBzZWVuICovCi0jZGVmaW5lIE5FV0xJTkVfTEYgMgkJLyogXG4gbmV3bGluZSBzZWVuICovCi0jZGVmaW5lIE5FV0xJTkVfQ1JMRiA0CQkvKiBcclxuIG5ld2xpbmUgc2VlbiAqLworI2RlZmluZSBORVdMSU5FX1VOS05PV04gMCAgICAgICAvKiBObyBuZXdsaW5lIHNlZW4sIHlldCAqLworI2RlZmluZSBORVdMSU5FX0NSIDEgICAgICAgICAgICAvKiBcciBuZXdsaW5lIHNlZW4gKi8KKyNkZWZpbmUgTkVXTElORV9MRiAyICAgICAgICAgICAgLyogXG4gbmV3bGluZSBzZWVuICovCisjZGVmaW5lIE5FV0xJTkVfQ1JMRiA0ICAgICAgICAgIC8qIFxyXG4gbmV3bGluZSBzZWVuICovCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogU3RydWN0dXJlIGRlZmluaXRpb25zLiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpmaWxlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZmlsZTsKIAotCWNoYXIqIGZfYnVmOwkJLyogQWxsb2NhdGVkIHJlYWRhaGVhZCBidWZmZXIgKi8KLQljaGFyKiBmX2J1ZmVuZDsJCS8qIFBvaW50cyBhZnRlciBsYXN0IG9jY3VwaWVkIHBvc2l0aW9uICovCi0JY2hhciogZl9idWZwdHI7CQkvKiBDdXJyZW50IGJ1ZmZlciBwb3NpdGlvbiAqLworICAgIGNoYXIqIGZfYnVmOyAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZWQgcmVhZGFoZWFkIGJ1ZmZlciAqLworICAgIGNoYXIqIGZfYnVmZW5kOyAgICAgICAgICAgICAvKiBQb2ludHMgYWZ0ZXIgbGFzdCBvY2N1cGllZCBwb3NpdGlvbiAqLworICAgIGNoYXIqIGZfYnVmcHRyOyAgICAgICAgICAgICAvKiBDdXJyZW50IGJ1ZmZlciBwb3NpdGlvbiAqLwogCi0JaW50IGZfc29mdHNwYWNlOwkvKiBGbGFnIHVzZWQgYnkgJ3ByaW50JyBjb21tYW5kICovCisgICAgaW50IGZfc29mdHNwYWNlOyAgICAgICAgICAgIC8qIEZsYWcgdXNlZCBieSAncHJpbnQnIGNvbW1hbmQgKi8KIAotCWludCBmX3VuaXZfbmV3bGluZTsJLyogSGFuZGxlIGFueSBuZXdsaW5lIGNvbnZlbnRpb24gKi8KLQlpbnQgZl9uZXdsaW5ldHlwZXM7CS8qIFR5cGVzIG9mIG5ld2xpbmVzIHNlZW4gKi8KLQlpbnQgZl9za2lwbmV4dGxmOwkvKiBTa2lwIG5leHQgXG4gKi8KKyAgICBpbnQgZl91bml2X25ld2xpbmU7ICAgICAgICAgLyogSGFuZGxlIGFueSBuZXdsaW5lIGNvbnZlbnRpb24gKi8KKyAgICBpbnQgZl9uZXdsaW5ldHlwZXM7ICAgICAgICAgLyogVHlwZXMgb2YgbmV3bGluZXMgc2VlbiAqLworICAgIGludCBmX3NraXBuZXh0bGY7ICAgICAgICAgICAvKiBTa2lwIG5leHQgXG4gKi8KIAotCUJaRklMRSAqZnA7Ci0JaW50IG1vZGU7Ci0JUHlfb2ZmX3QgcG9zOwotCVB5X29mZl90IHNpemU7CisgICAgQlpGSUxFICpmcDsKKyAgICBpbnQgbW9kZTsKKyAgICBQeV9vZmZfdCBwb3M7CisgICAgUHlfb2ZmX3Qgc2l6ZTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5VGhyZWFkX3R5cGVfbG9jayBsb2NrOworICAgIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrOwogI2VuZGlmCiB9IEJaMkZpbGVPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JYnpfc3RyZWFtIGJ6czsKLQlpbnQgcnVubmluZzsKKyAgICBQeU9iamVjdF9IRUFECisgICAgYnpfc3RyZWFtIGJ6czsKKyAgICBpbnQgcnVubmluZzsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5VGhyZWFkX3R5cGVfbG9jayBsb2NrOworICAgIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrOwogI2VuZGlmCiB9IEJaMkNvbXBPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JYnpfc3RyZWFtIGJ6czsKLQlpbnQgcnVubmluZzsKLQlQeU9iamVjdCAqdW51c2VkX2RhdGE7CisgICAgUHlPYmplY3RfSEVBRAorICAgIGJ6X3N0cmVhbSBienM7CisgICAgaW50IHJ1bm5pbmc7CisgICAgUHlPYmplY3QgKnVudXNlZF9kYXRhOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2s7CisgICAgUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2s7CiAjZW5kaWYKIH0gQloyRGVjb21wT2JqZWN0OwogCkBAIC0xNDcsNTkgKzE0Nyw1OSBAQAogc3RhdGljIGludAogVXRpbF9DYXRjaEJaMkVycm9yKGludCBiemVycm9yKQogewotCWludCByZXQgPSAwOwotCXN3aXRjaChiemVycm9yKSB7Ci0JCWNhc2UgQlpfT0s6Ci0JCWNhc2UgQlpfU1RSRUFNX0VORDoKLQkJCWJyZWFrOworICAgIGludCByZXQgPSAwOworICAgIHN3aXRjaChiemVycm9yKSB7CisgICAgICAgIGNhc2UgQlpfT0s6CisgICAgICAgIGNhc2UgQlpfU1RSRUFNX0VORDoKKyAgICAgICAgICAgIGJyZWFrOwogCiAjaWZkZWYgQlpfQ09ORklHX0VSUk9SCi0JCWNhc2UgQlpfQ09ORklHX0VSUk9SOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkidGhlIGJ6MiBsaWJyYXJ5IHdhcyBub3QgY29tcGlsZWQgIgotCQkJCQkiY29ycmVjdGx5Iik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlpfQ09ORklHX0VSUk9SOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgYnoyIGxpYnJhcnkgd2FzIG5vdCBjb21waWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlY3RseSIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogI2VuZGlmCiAKLQkJY2FzZSBCWl9QQVJBTV9FUlJPUjoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkidGhlIGJ6MiBsaWJyYXJ5IGhhcyByZWNlaXZlZCB3cm9uZyAiCi0JCQkJCSJwYXJhbWV0ZXJzIik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlpfUEFSQU1fRVJST1I6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGJ6MiBsaWJyYXJ5IGhhcyByZWNlaXZlZCB3cm9uZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJaX01FTV9FUlJPUjoKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlpfTUVNX0VSUk9SOgorICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJaX0RBVEFfRVJST1I6Ci0JCWNhc2UgQlpfREFUQV9FUlJPUl9NQUdJQzoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiaW52YWxpZCBkYXRhIHN0cmVhbSIpOwotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJaX0RBVEFfRVJST1I6CisgICAgICAgIGNhc2UgQlpfREFUQV9FUlJPUl9NQUdJQzoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiaW52YWxpZCBkYXRhIHN0cmVhbSIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlpfSU9fRVJST1I6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgInVua25vd24gSU8gZXJyb3IiKTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCWl9JT19FUlJPUjoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAidW5rbm93biBJTyBlcnJvciIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlpfVU5FWFBFQ1RFRF9FT0Y6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCi0JCQkJCSJjb21wcmVzc2VkIGZpbGUgZW5kZWQgYmVmb3JlIHRoZSAiCi0JCQkJCSJsb2dpY2FsIGVuZC1vZi1zdHJlYW0gd2FzIGRldGVjdGVkIik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlpfVU5FWFBFQ1RFRF9FT0Y6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXByZXNzZWQgZmlsZSBlbmRlZCBiZWZvcmUgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9naWNhbCBlbmQtb2Ytc3RyZWFtIHdhcyBkZXRlY3RlZCIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlpfU0VRVUVOQ0VfRVJST1I6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkid3Jvbmcgc2VxdWVuY2Ugb2YgYnoyIGxpYnJhcnkgIgotCQkJCQkiY29tbWFuZHMgdXNlZCIpOwotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OworICAgICAgICBjYXNlIEJaX1NFUVVFTkNFX0VSUk9SOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3Jvbmcgc2VxdWVuY2Ugb2YgYnoyIGxpYnJhcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kcyB1c2VkIik7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7CiB9CiAKICNpZiBCVUZTSVogPCA4MTkyCkBAIC0yMTgsMjI4ICsyMTgsMjI4IEBACiBzdGF0aWMgc2l6ZV90CiBVdGlsX05ld0J1ZmZlclNpemUoc2l6ZV90IGN1cnJlbnRzaXplKQogewotCWlmIChjdXJyZW50c2l6ZSA+IFNNQUxMQ0hVTkspIHsKLQkJLyogS2VlcCBkb3VibGluZyB1bnRpbCB3ZSByZWFjaCBCSUdDSFVOSzsKLQkJICAgdGhlbiBrZWVwIGFkZGluZyBCSUdDSFVOSy4gKi8KLQkJaWYgKGN1cnJlbnRzaXplIDw9IEJJR0NIVU5LKQotCQkJcmV0dXJuIGN1cnJlbnRzaXplICsgY3VycmVudHNpemU7Ci0JCWVsc2UKLQkJCXJldHVybiBjdXJyZW50c2l6ZSArIEJJR0NIVU5LOwotCX0KLQlyZXR1cm4gY3VycmVudHNpemUgKyBTTUFMTENIVU5LOworICAgIGlmIChjdXJyZW50c2l6ZSA+IFNNQUxMQ0hVTkspIHsKKyAgICAgICAgLyogS2VlcCBkb3VibGluZyB1bnRpbCB3ZSByZWFjaCBCSUdDSFVOSzsKKyAgICAgICAgICAgdGhlbiBrZWVwIGFkZGluZyBCSUdDSFVOSy4gKi8KKyAgICAgICAgaWYgKGN1cnJlbnRzaXplIDw9IEJJR0NIVU5LKQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRzaXplICsgY3VycmVudHNpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50c2l6ZSArIEJJR0NIVU5LOworICAgIH0KKyAgICByZXR1cm4gY3VycmVudHNpemUgKyBTTUFMTENIVU5LOwogfQogCiAvKiBUaGlzIGlzIGEgaGFja2VkIHZlcnNpb24gb2YgUHl0aG9uJ3MgZmlsZW9iamVjdC5jOmdldF9saW5lKCkuICovCiBzdGF0aWMgUHlPYmplY3QgKgogVXRpbF9HZXRMaW5lKEJaMkZpbGVPYmplY3QgKmYsIGludCBuKQogewotCWNoYXIgYzsKLQljaGFyICpidWYsICplbmQ7Ci0Jc2l6ZV90IHRvdGFsX3Zfc2l6ZTsJLyogdG90YWwgIyBvZiBzbG90cyBpbiBidWZmZXIgKi8KLQlzaXplX3QgdXNlZF92X3NpemU7CS8qICMgdXNlZCBzbG90cyBpbiBidWZmZXIgKi8KLQlzaXplX3QgaW5jcmVtZW50OyAgICAgICAvKiBhbW91bnQgdG8gaW5jcmVtZW50IHRoZSBidWZmZXIgKi8KLQlQeU9iamVjdCAqdjsKLQlpbnQgYnplcnJvcjsKLQlpbnQgYnl0ZXNfcmVhZDsKLQlpbnQgbmV3bGluZXR5cGVzID0gZi0+Zl9uZXdsaW5ldHlwZXM7Ci0JaW50IHNraXBuZXh0bGYgPSBmLT5mX3NraXBuZXh0bGY7Ci0JaW50IHVuaXZfbmV3bGluZSA9IGYtPmZfdW5pdl9uZXdsaW5lOworICAgIGNoYXIgYzsKKyAgICBjaGFyICpidWYsICplbmQ7CisgICAgc2l6ZV90IHRvdGFsX3Zfc2l6ZTsgICAgICAgIC8qIHRvdGFsICMgb2Ygc2xvdHMgaW4gYnVmZmVyICovCisgICAgc2l6ZV90IHVzZWRfdl9zaXplOyAgICAgICAgIC8qICMgdXNlZCBzbG90cyBpbiBidWZmZXIgKi8KKyAgICBzaXplX3QgaW5jcmVtZW50OyAgICAgICAvKiBhbW91bnQgdG8gaW5jcmVtZW50IHRoZSBidWZmZXIgKi8KKyAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgYnplcnJvcjsKKyAgICBpbnQgYnl0ZXNfcmVhZDsKKyAgICBpbnQgbmV3bGluZXR5cGVzID0gZi0+Zl9uZXdsaW5ldHlwZXM7CisgICAgaW50IHNraXBuZXh0bGYgPSBmLT5mX3NraXBuZXh0bGY7CisgICAgaW50IHVuaXZfbmV3bGluZSA9IGYtPmZfdW5pdl9uZXdsaW5lOwogCi0JdG90YWxfdl9zaXplID0gbiA+IDAgPyBuIDogMTAwOwotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHRvdGFsX3Zfc2l6ZSk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgdG90YWxfdl9zaXplID0gbiA+IDAgPyBuIDogMTAwOworICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHRvdGFsX3Zfc2l6ZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlidWYgPSBCVUYodik7Ci0JZW5kID0gYnVmICsgdG90YWxfdl9zaXplOworICAgIGJ1ZiA9IEJVRih2KTsKKyAgICBlbmQgPSBidWYgKyB0b3RhbF92X3NpemU7CiAKLQlmb3IgKDs7KSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJd2hpbGUgKGJ1ZiAhPSBlbmQpIHsKLQkJCWJ5dGVzX3JlYWQgPSBCWjJfYnpSZWFkKCZiemVycm9yLCBmLT5mcCwgJmMsIDEpOwotCQkJZi0+cG9zKys7Ci0JCQlpZiAoYnl0ZXNfcmVhZCA9PSAwKSBicmVhazsKLQkJCWlmICh1bml2X25ld2xpbmUpIHsKLQkJCQlpZiAoc2tpcG5leHRsZikgewotCQkJCQlza2lwbmV4dGxmID0gMDsKLQkJCQkJaWYgKGMgPT0gJ1xuJykgewotCQkJCQkJLyogU2VlaW5nIGEgXG4gaGVyZSB3aXRoIHNraXBuZXh0bGYgdHJ1ZSBtZWFucyB3ZQotCQkJCQkJICogc2F3IGEgXHIgYmVmb3JlLgotCQkJCQkJICovCi0JCQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOwotCQkJCQkJaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIGJyZWFrOwotCQkJCQkJYnl0ZXNfcmVhZCA9IEJaMl9ielJlYWQoJmJ6ZXJyb3IsIGYtPmZwLCAmYywgMSk7Ci0JCQkJCQlmLT5wb3MrKzsKLQkJCQkJCWlmIChieXRlc19yZWFkID09IDApIGJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGMgPT0gJ1xyJykgewotCQkJCQlza2lwbmV4dGxmID0gMTsKLQkJCQkJYyA9ICdcbic7Ci0JCQkJfSBlbHNlIGlmIChjID09ICdcbicpCi0JCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0xGOwotCQkJfQotCQkJKmJ1ZisrID0gYzsKLQkJCWlmIChiemVycm9yICE9IEJaX09LIHx8IGMgPT0gJ1xuJykgYnJlYWs7Ci0JCX0KLQkJaWYgKHVuaXZfbmV3bGluZSAmJiBiemVycm9yID09IEJaX1NUUkVBTV9FTkQgJiYgc2tpcG5leHRsZikKLQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKLQkJZi0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKLQkJaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewotCQkJZi0+c2l6ZSA9IGYtPnBvczsKLQkJCWYtPm1vZGUgPSBNT0RFX1JFQURfRU9GOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGMgPT0gJ1xuJykKLQkJCWJyZWFrOwotCQkvKiBNdXN0IGJlIGJlY2F1c2UgYnVmID09IGVuZCAqLwotCQlpZiAobiA+IDApCi0JCQlicmVhazsKLQkJdXNlZF92X3NpemUgPSB0b3RhbF92X3NpemU7Ci0JCWluY3JlbWVudCA9IHRvdGFsX3Zfc2l6ZSA+PiAyOyAvKiBtaWxkIGV4cG9uZW50aWFsIGdyb3d0aCAqLwotCQl0b3RhbF92X3NpemUgKz0gaW5jcmVtZW50OwotCQlpZiAodG90YWxfdl9zaXplID4gSU5UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdG90YWxfdl9zaXplKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJYnVmID0gQlVGKHYpICsgdXNlZF92X3NpemU7Ci0JCWVuZCA9IEJVRih2KSArIHRvdGFsX3Zfc2l6ZTsKLQl9CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHdoaWxlIChidWYgIT0gZW5kKSB7CisgICAgICAgICAgICBieXRlc19yZWFkID0gQloyX2J6UmVhZCgmYnplcnJvciwgZi0+ZnAsICZjLCAxKTsKKyAgICAgICAgICAgIGYtPnBvcysrOworICAgICAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgYnJlYWs7CisgICAgICAgICAgICBpZiAodW5pdl9uZXdsaW5lKSB7CisgICAgICAgICAgICAgICAgaWYgKHNraXBuZXh0bGYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZWluZyBhIFxuIGhlcmUgd2l0aCBza2lwbmV4dGxmIHRydWUgbWVhbnMgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNhdyBhIFxyIGJlZm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1JMRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiemVycm9yICE9IEJaX09LKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSBCWjJfYnpSZWFkKCZiemVycm9yLCBmLT5mcCwgJmMsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgZi0+cG9zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjID09ICdccicpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGMgPSAnXG4nOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9MRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpidWYrKyA9IGM7CisgICAgICAgICAgICBpZiAoYnplcnJvciAhPSBCWl9PSyB8fCBjID09ICdcbicpIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh1bml2X25ld2xpbmUgJiYgYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EICYmIHNraXBuZXh0bGYpCisgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZi0+Zl9uZXdsaW5ldHlwZXMgPSBuZXdsaW5ldHlwZXM7CisgICAgICAgIGYtPmZfc2tpcG5leHRsZiA9IHNraXBuZXh0bGY7CisgICAgICAgIGlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGYtPnNpemUgPSBmLT5wb3M7CisgICAgICAgICAgICBmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChjID09ICdcbicpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogTXVzdCBiZSBiZWNhdXNlIGJ1ZiA9PSBlbmQgKi8KKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHVzZWRfdl9zaXplID0gdG90YWxfdl9zaXplOworICAgICAgICBpbmNyZW1lbnQgPSB0b3RhbF92X3NpemUgPj4gMjsgLyogbWlsZCBleHBvbmVudGlhbCBncm93dGggKi8KKyAgICAgICAgdG90YWxfdl9zaXplICs9IGluY3JlbWVudDsKKyAgICAgICAgaWYgKHRvdGFsX3Zfc2l6ZSA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIHRvdGFsX3Zfc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJ1ZiA9IEJVRih2KSArIHVzZWRfdl9zaXplOworICAgICAgICBlbmQgPSBCVUYodikgKyB0b3RhbF92X3NpemU7CisgICAgfQogCi0JdXNlZF92X3NpemUgPSBidWYgLSBCVUYodik7Ci0JaWYgKHVzZWRfdl9zaXplICE9IHRvdGFsX3Zfc2l6ZSkKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdXNlZF92X3NpemUpOwotCXJldHVybiB2OworICAgIHVzZWRfdl9zaXplID0gYnVmIC0gQlVGKHYpOworICAgIGlmICh1c2VkX3Zfc2l6ZSAhPSB0b3RhbF92X3NpemUpCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnYsIHVzZWRfdl9zaXplKTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyogVGhpcyBpcyBhIGhhY2tlZCB2ZXJzaW9uIG9mIFB5dGhvbidzCiAgKiBmaWxlb2JqZWN0LmM6UHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKCkuICovCiBzaXplX3QKIFV0aWxfVW5pdk5ld2xpbmVSZWFkKGludCAqYnplcnJvciwgQlpGSUxFICpzdHJlYW0sCi0JCSAgICAgY2hhciogYnVmLCBzaXplX3QgbiwgQloyRmlsZU9iamVjdCAqZikKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1Ziwgc2l6ZV90IG4sIEJaMkZpbGVPYmplY3QgKmYpCiB7Ci0JY2hhciAqZHN0ID0gYnVmOwotCWludCBuZXdsaW5ldHlwZXMsIHNraXBuZXh0bGY7CisgICAgY2hhciAqZHN0ID0gYnVmOworICAgIGludCBuZXdsaW5ldHlwZXMsIHNraXBuZXh0bGY7CiAKLQlhc3NlcnQoYnVmICE9IE5VTEwpOwotCWFzc2VydChzdHJlYW0gIT0gTlVMTCk7CisgICAgYXNzZXJ0KGJ1ZiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RyZWFtICE9IE5VTEwpOwogCi0JaWYgKCFmLT5mX3VuaXZfbmV3bGluZSkKLQkJcmV0dXJuIEJaMl9ielJlYWQoYnplcnJvciwgc3RyZWFtLCBidWYsIG4pOworICAgIGlmICghZi0+Zl91bml2X25ld2xpbmUpCisgICAgICAgIHJldHVybiBCWjJfYnpSZWFkKGJ6ZXJyb3IsIHN0cmVhbSwgYnVmLCBuKTsKIAotCW5ld2xpbmV0eXBlcyA9IGYtPmZfbmV3bGluZXR5cGVzOwotCXNraXBuZXh0bGYgPSBmLT5mX3NraXBuZXh0bGY7CisgICAgbmV3bGluZXR5cGVzID0gZi0+Zl9uZXdsaW5ldHlwZXM7CisgICAgc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKIAotCS8qIEludmFyaWFudDogIG4gaXMgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgdG8gYmUgZmlsbGVkCi0JICogaW4gdGhlIGJ1ZmZlci4KLQkgKi8KLQl3aGlsZSAobikgewotCQlzaXplX3QgbnJlYWQ7Ci0JCWludCBzaG9ydHJlYWQ7Ci0JCWNoYXIgKnNyYyA9IGRzdDsKKyAgICAvKiBJbnZhcmlhbnQ6ICBuIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIGZpbGxlZAorICAgICAqIGluIHRoZSBidWZmZXIuCisgICAgICovCisgICAgd2hpbGUgKG4pIHsKKyAgICAgICAgc2l6ZV90IG5yZWFkOworICAgICAgICBpbnQgc2hvcnRyZWFkOworICAgICAgICBjaGFyICpzcmMgPSBkc3Q7CiAKLQkJbnJlYWQgPSBCWjJfYnpSZWFkKGJ6ZXJyb3IsIHN0cmVhbSwgZHN0LCBuKTsKLQkJYXNzZXJ0KG5yZWFkIDw9IG4pOwotCQluIC09IG5yZWFkOyAvKiBhc3N1bWluZyAxIGJ5dGUgb3V0IGZvciBlYWNoIGluOyB3aWxsIGFkanVzdCAqLwotCQlzaG9ydHJlYWQgPSBuICE9IDA7CS8qIHRydWUgaWZmIEVPRiBvciBlcnJvciAqLwotCQl3aGlsZSAobnJlYWQtLSkgewotCQkJY2hhciBjID0gKnNyYysrOwotCQkJaWYgKGMgPT0gJ1xyJykgewotCQkJCS8qIFNhdmUgYXMgTEYgYW5kIHNldCBmbGFnIHRvIHNraXAgbmV4dCBMRi4gKi8KLQkJCQkqZHN0KysgPSAnXG4nOwotCQkJCXNraXBuZXh0bGYgPSAxOwotCQkJfQotCQkJZWxzZSBpZiAoc2tpcG5leHRsZiAmJiBjID09ICdcbicpIHsKLQkJCQkvKiBTa2lwIExGLCBhbmQgcmVtZW1iZXIgd2Ugc2F3IENSIExGLiAqLwotCQkJCXNraXBuZXh0bGYgPSAwOwotCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7Ci0JCQkJKytuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogTm9ybWFsIGNoYXIgdG8gYmUgc3RvcmVkIGluIGJ1ZmZlci4gIEFsc28KLQkJCQkgKiB1cGRhdGUgdGhlIG5ld2xpbmV0eXBlcyBmbGFnIGlmIGVpdGhlciB0aGlzCi0JCQkJICogaXMgYW4gTEYgb3IgdGhlIHByZXZpb3VzIGNoYXIgd2FzIGEgQ1IuCi0JCQkJICovCi0JCQkJaWYgKGMgPT0gJ1xuJykKLQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7Ci0JCQkJZWxzZSBpZiAoc2tpcG5leHRsZikKLQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCQkJKmRzdCsrID0gYzsKLQkJCQlza2lwbmV4dGxmID0gMDsKLQkJCX0KLQkJfQotCQlpZiAoc2hvcnRyZWFkKSB7Ci0JCQkvKiBJZiB0aGlzIGlzIEVPRiwgdXBkYXRlIHR5cGUgZmxhZ3MuICovCi0JCQlpZiAoc2tpcG5leHRsZiAmJiAqYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKQotCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZi0+Zl9uZXdsaW5ldHlwZXMgPSBuZXdsaW5ldHlwZXM7Ci0JZi0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKLQlyZXR1cm4gZHN0IC0gYnVmOworICAgICAgICBucmVhZCA9IEJaMl9ielJlYWQoYnplcnJvciwgc3RyZWFtLCBkc3QsIG4pOworICAgICAgICBhc3NlcnQobnJlYWQgPD0gbik7CisgICAgICAgIG4gLT0gbnJlYWQ7IC8qIGFzc3VtaW5nIDEgYnl0ZSBvdXQgZm9yIGVhY2ggaW47IHdpbGwgYWRqdXN0ICovCisgICAgICAgIHNob3J0cmVhZCA9IG4gIT0gMDsgICAgICAgICAgICAgLyogdHJ1ZSBpZmYgRU9GIG9yIGVycm9yICovCisgICAgICAgIHdoaWxlIChucmVhZC0tKSB7CisgICAgICAgICAgICBjaGFyIGMgPSAqc3JjKys7CisgICAgICAgICAgICBpZiAoYyA9PSAnXHInKSB7CisgICAgICAgICAgICAgICAgLyogU2F2ZSBhcyBMRiBhbmQgc2V0IGZsYWcgdG8gc2tpcCBuZXh0IExGLiAqLworICAgICAgICAgICAgICAgICpkc3QrKyA9ICdcbic7CisgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChza2lwbmV4dGxmICYmIGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIC8qIFNraXAgTEYsIGFuZCByZW1lbWJlciB3ZSBzYXcgQ1IgTEYuICovCisgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDA7CisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1JMRjsKKyAgICAgICAgICAgICAgICArK247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBOb3JtYWwgY2hhciB0byBiZSBzdG9yZWQgaW4gYnVmZmVyLiAgQWxzbworICAgICAgICAgICAgICAgICAqIHVwZGF0ZSB0aGUgbmV3bGluZXR5cGVzIGZsYWcgaWYgZWl0aGVyIHRoaXMKKyAgICAgICAgICAgICAgICAgKiBpcyBhbiBMRiBvciB0aGUgcHJldmlvdXMgY2hhciB3YXMgYSBDUi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9MRjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChza2lwbmV4dGxmKQorICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBjOworICAgICAgICAgICAgICAgIHNraXBuZXh0bGYgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzaG9ydHJlYWQpIHsKKyAgICAgICAgICAgIC8qIElmIHRoaXMgaXMgRU9GLCB1cGRhdGUgdHlwZSBmbGFncy4gKi8KKyAgICAgICAgICAgIGlmIChza2lwbmV4dGxmICYmICpiemVycm9yID09IEJaX1NUUkVBTV9FTkQpCisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKKyAgICBmLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOworICAgIHJldHVybiBkc3QgLSBidWY7CiB9CiAKIC8qIFRoaXMgaXMgYSBoYWNrZWQgdmVyc2lvbiBvZiBQeXRob24ncyBmaWxlb2JqZWN0LmM6ZHJvcF9yZWFkYWhlYWQoKS4gKi8KIHN0YXRpYyB2b2lkCiBVdGlsX0Ryb3BSZWFkQWhlYWQoQloyRmlsZU9iamVjdCAqZikKIHsKLQlpZiAoZi0+Zl9idWYgIT0gTlVMTCkgewotCQlQeU1lbV9GcmVlKGYtPmZfYnVmKTsKLQkJZi0+Zl9idWYgPSBOVUxMOwotCX0KKyAgICBpZiAoZi0+Zl9idWYgIT0gTlVMTCkgeworICAgICAgICBQeU1lbV9GcmVlKGYtPmZfYnVmKTsKKyAgICAgICAgZi0+Zl9idWYgPSBOVUxMOworICAgIH0KIH0KIAogLyogVGhpcyBpcyBhIGhhY2tlZCB2ZXJzaW9uIG9mIFB5dGhvbidzIGZpbGVvYmplY3QuYzpyZWFkYWhlYWQoKS4gKi8KIHN0YXRpYyBpbnQKIFV0aWxfUmVhZEFoZWFkKEJaMkZpbGVPYmplY3QgKmYsIGludCBidWZzaXplKQogewotCWludCBjaHVua3NpemU7Ci0JaW50IGJ6ZXJyb3I7CisgICAgaW50IGNodW5rc2l6ZTsKKyAgICBpbnQgYnplcnJvcjsKIAotCWlmIChmLT5mX2J1ZiAhPSBOVUxMKSB7Ci0JCWlmKChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+PSAxKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCVV0aWxfRHJvcFJlYWRBaGVhZChmKTsKLQl9Ci0JaWYgKGYtPm1vZGUgPT0gTU9ERV9SRUFEX0VPRikgewotCQlmLT5mX2J1ZnB0ciA9IGYtPmZfYnVmOwotCQlmLT5mX2J1ZmVuZCA9IGYtPmZfYnVmOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKChmLT5mX2J1ZiA9IFB5TWVtX01hbGxvYyhidWZzaXplKSkgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQljaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgZi0+ZnAsIGYtPmZfYnVmLAotCQkJCQkgYnVmc2l6ZSwgZik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlmLT5wb3MgKz0gY2h1bmtzaXplOwotCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJZi0+c2l6ZSA9IGYtPnBvczsKLQkJZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7Ci0JfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJVXRpbF9Ecm9wUmVhZEFoZWFkKGYpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWYtPmZfYnVmcHRyID0gZi0+Zl9idWY7Ci0JZi0+Zl9idWZlbmQgPSBmLT5mX2J1ZiArIGNodW5rc2l6ZTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoZi0+Zl9idWYgIT0gTlVMTCkgeworICAgICAgICBpZigoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPj0gMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBVdGlsX0Ryb3BSZWFkQWhlYWQoZik7CisgICAgfQorICAgIGlmIChmLT5tb2RlID09IE1PREVfUkVBRF9FT0YpIHsKKyAgICAgICAgZi0+Zl9idWZwdHIgPSBmLT5mX2J1ZjsKKyAgICAgICAgZi0+Zl9idWZlbmQgPSBmLT5mX2J1ZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoZi0+Zl9idWYgPSBQeU1lbV9NYWxsb2MoYnVmc2l6ZSkpID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgY2h1bmtzaXplID0gVXRpbF9Vbml2TmV3bGluZVJlYWQoJmJ6ZXJyb3IsIGYtPmZwLCBmLT5mX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplLCBmKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGYtPnBvcyArPSBjaHVua3NpemU7CisgICAgaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgeworICAgICAgICBmLT5zaXplID0gZi0+cG9zOworICAgICAgICBmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKKyAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICBVdGlsX0Ryb3BSZWFkQWhlYWQoZik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZi0+Zl9idWZwdHIgPSBmLT5mX2J1ZjsKKyAgICBmLT5mX2J1ZmVuZCA9IGYtPmZfYnVmICsgY2h1bmtzaXplOworICAgIHJldHVybiAwOwogfQogCiAvKiBUaGlzIGlzIGEgaGFja2VkIHZlcnNpb24gb2YgUHl0aG9uJ3MKQEAgLTQ0Nyw0NSArNDQ3LDQ1IEBACiBzdGF0aWMgUHlTdHJpbmdPYmplY3QgKgogVXRpbF9SZWFkQWhlYWRHZXRMaW5lU2tpcChCWjJGaWxlT2JqZWN0ICpmLCBpbnQgc2tpcCwgaW50IGJ1ZnNpemUpCiB7Ci0JUHlTdHJpbmdPYmplY3QqIHM7Ci0JY2hhciAqYnVmcHRyOwotCWNoYXIgKmJ1ZjsKLQlpbnQgbGVuOworICAgIFB5U3RyaW5nT2JqZWN0KiBzOworICAgIGNoYXIgKmJ1ZnB0cjsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGxlbjsKIAotCWlmIChmLT5mX2J1ZiA9PSBOVUxMKQotCQlpZiAoVXRpbF9SZWFkQWhlYWQoZiwgYnVmc2l6ZSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGYtPmZfYnVmID09IE5VTEwpCisgICAgICAgIGlmIChVdGlsX1JlYWRBaGVhZChmLCBidWZzaXplKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCWxlbiA9IGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHI7Ci0JaWYgKGxlbiA9PSAwKQotCQlyZXR1cm4gKFB5U3RyaW5nT2JqZWN0ICopCi0JCQlQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwKTsKLQlidWZwdHIgPSBtZW1jaHIoZi0+Zl9idWZwdHIsICdcbicsIGxlbik7Ci0JaWYgKGJ1ZnB0ciAhPSBOVUxMKSB7Ci0JCWJ1ZnB0cisrOwkJCS8qIENvdW50IHRoZSAnXG4nICovCi0JCWxlbiA9IGJ1ZnB0ciAtIGYtPmZfYnVmcHRyOwotCQlzID0gKFB5U3RyaW5nT2JqZWN0ICopCi0JCQlQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwK2xlbik7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyhzKStza2lwLCBmLT5mX2J1ZnB0ciwgbGVuKTsKLQkJZi0+Zl9idWZwdHIgPSBidWZwdHI7Ci0JCWlmIChidWZwdHIgPT0gZi0+Zl9idWZlbmQpCi0JCQlVdGlsX0Ryb3BSZWFkQWhlYWQoZik7Ci0JfSBlbHNlIHsKLQkJYnVmcHRyID0gZi0+Zl9idWZwdHI7Ci0JCWJ1ZiA9IGYtPmZfYnVmOwotCQlmLT5mX2J1ZiA9IE5VTEw7IAkvKiBGb3JjZSBuZXcgcmVhZGFoZWFkIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHMgPSBVdGlsX1JlYWRBaGVhZEdldExpbmVTa2lwKGYsIHNraXArbGVuLAotCQkJCQkgICAgICBidWZzaXplICsgKGJ1ZnNpemU+PjIpKTsKLQkJaWYgKHMgPT0gTlVMTCkgewotCQkgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW1lbWNweShQeVN0cmluZ19BU19TVFJJTkcocykrc2tpcCwgYnVmcHRyLCBsZW4pOwotCQlQeU1lbV9GcmVlKGJ1Zik7Ci0JfQotCXJldHVybiBzOworICAgIGxlbiA9IGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHI7CisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwKTsKKyAgICBidWZwdHIgPSBtZW1jaHIoZi0+Zl9idWZwdHIsICdcbicsIGxlbik7CisgICAgaWYgKGJ1ZnB0ciAhPSBOVUxMKSB7CisgICAgICAgIGJ1ZnB0cisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3VudCB0aGUgJ1xuJyAqLworICAgICAgICBsZW4gPSBidWZwdHIgLSBmLT5mX2J1ZnB0cjsKKyAgICAgICAgcyA9IChQeVN0cmluZ09iamVjdCAqKQorICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2tpcCtsZW4pOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG1lbWNweShQeVN0cmluZ19BU19TVFJJTkcocykrc2tpcCwgZi0+Zl9idWZwdHIsIGxlbik7CisgICAgICAgIGYtPmZfYnVmcHRyID0gYnVmcHRyOworICAgICAgICBpZiAoYnVmcHRyID09IGYtPmZfYnVmZW5kKQorICAgICAgICAgICAgVXRpbF9Ecm9wUmVhZEFoZWFkKGYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZnB0ciA9IGYtPmZfYnVmcHRyOworICAgICAgICBidWYgPSBmLT5mX2J1ZjsKKyAgICAgICAgZi0+Zl9idWYgPSBOVUxMOyAgICAgICAgICAgICAgICAvKiBGb3JjZSBuZXcgcmVhZGFoZWFkIGJ1ZmZlciAqLworICAgICAgICBzID0gVXRpbF9SZWFkQWhlYWRHZXRMaW5lU2tpcChmLCBza2lwK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSArIChidWZzaXplPj4yKSk7CisgICAgICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG1lbWNweShQeVN0cmluZ19BU19TVFJJTkcocykrc2tpcCwgYnVmcHRyLCBsZW4pOworICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgfQorICAgIHJldHVybiBzOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTUwMiw3OSArNTAyLDc5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9yZWFkKEJaMkZpbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYnl0ZXNyZXF1ZXN0ZWQgPSAtMTsKLQlzaXplX3QgYnl0ZXNyZWFkLCBidWZmZXJzaXplLCBjaHVua3NpemU7Ci0JaW50IGJ6ZXJyb3I7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgbG9uZyBieXRlc3JlcXVlc3RlZCA9IC0xOworICAgIHNpemVfdCBieXRlc3JlYWQsIGJ1ZmZlcnNpemUsIGNodW5rc2l6ZTsKKyAgICBpbnQgYnplcnJvcjsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZCIsICZieXRlc3JlcXVlc3RlZCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZCIsICZieXRlc3JlcXVlc3RlZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCXN3aXRjaCAoc2VsZi0+bW9kZSkgewotCQljYXNlIE1PREVfUkVBRDoKLQkJCWJyZWFrOwotCQljYXNlIE1PREVfUkVBRF9FT0Y6Ci0JCQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJY2FzZSBNT0RFX0NMT1NFRDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQkJZ290byBjbGVhbnVwOwotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJCSJmaWxlIGlzIG5vdCByZWFkeSBmb3IgcmVhZGluZyIpOwotCQkJZ290byBjbGVhbnVwOwotCX0KKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgc3dpdGNoIChzZWxmLT5tb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9SRUFEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV9SRUFEX0VPRjoKKyAgICAgICAgICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBjYXNlIE1PREVfQ0xPU0VEOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIGlzIG5vdCByZWFkeSBmb3IgcmVhZGluZyIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAotCWlmIChieXRlc3JlcXVlc3RlZCA8IDApCi0JCWJ1ZmZlcnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoKHNpemVfdCkwKTsKLQllbHNlCi0JCWJ1ZmZlcnNpemUgPSBieXRlc3JlcXVlc3RlZDsKLQlpZiAoYnVmZmVyc2l6ZSA+IElOVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMgaXMgIgotCQkJCSJtb3JlIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0JcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBidWZmZXJzaXplKTsKLQlpZiAocmV0ID09IE5VTEwpCi0JCWdvdG8gY2xlYW51cDsKLQlieXRlc3JlYWQgPSAwOworICAgIGlmIChieXRlc3JlcXVlc3RlZCA8IDApCisgICAgICAgIGJ1ZmZlcnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoKHNpemVfdCkwKTsKKyAgICBlbHNlCisgICAgICAgIGJ1ZmZlcnNpemUgPSBieXRlc3JlcXVlc3RlZDsKKyAgICBpZiAoYnVmZmVyc2l6ZSA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgYnVmZmVyc2l6ZSk7CisgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgYnl0ZXNyZWFkID0gMDsKIAotCWZvciAoOzspIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQljaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJCQkgQlVGKHJldCkrYnl0ZXNyZWFkLAotCQkJCQkJIGJ1ZmZlcnNpemUtYnl0ZXNyZWFkLAotCQkJCQkJIHNlbGYpOwotCQlzZWxmLT5wb3MgKz0gY2h1bmtzaXplOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlieXRlc3JlYWQgKz0gY2h1bmtzaXplOwotCQlpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7Ci0JCQlzZWxmLT5zaXplID0gc2VsZi0+cG9zOwotCQkJc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCQlQeV9ERUNSRUYocmV0KTsKLQkJCXJldCA9IE5VTEw7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJaWYgKGJ5dGVzcmVxdWVzdGVkIDwgMCkgewotCQkJYnVmZmVyc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZmZXJzaXplKTsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZmZlcnNpemUpIDwgMCkKLQkJCQlnb3RvIGNsZWFudXA7Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoYnl0ZXNyZWFkICE9IGJ1ZmZlcnNpemUpCi0JCV9QeVN0cmluZ19SZXNpemUoJnJldCwgYnl0ZXNyZWFkKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgY2h1bmtzaXplID0gVXRpbF9Vbml2TmV3bGluZVJlYWQoJmJ6ZXJyb3IsIHNlbGYtPmZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUYocmV0KStieXRlc3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNpemUtYnl0ZXNyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKKyAgICAgICAgc2VsZi0+cG9zICs9IGNodW5rc2l6ZTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgYnl0ZXNyZWFkICs9IGNodW5rc2l6ZTsKKyAgICAgICAgaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IHNlbGYtPnBvczsKKyAgICAgICAgICAgIHNlbGYtPm1vZGUgPSBNT0RFX1JFQURfRU9GOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgICAgICByZXQgPSBOVUxMOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlc3JlcXVlc3RlZCA8IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlcnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmZmVyc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZmZXJzaXplKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ5dGVzcmVhZCAhPSBidWZmZXJzaXplKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ5dGVzcmVhZCk7CiAKIGNsZWFudXA6Ci0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCXJldHVybiByZXQ7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihCWjJGaWxlX3JlYWRsaW5lX19kb2NfXywKQEAgLTU4OSwzNyArNTg5LDM3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9yZWFkbGluZShCWjJGaWxlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlpbnQgc2l6ZWhpbnQgPSAtMTsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBpbnQgc2l6ZWhpbnQgPSAtMTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6cmVhZGxpbmUiLCAmc2l6ZWhpbnQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnJlYWRsaW5lIiwgJnNpemVoaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlBQ1FVSVJFX0xPQ0soc2VsZik7Ci0Jc3dpdGNoIChzZWxmLT5tb2RlKSB7Ci0JCWNhc2UgTU9ERV9SRUFEOgotCQkJYnJlYWs7Ci0JCWNhc2UgTU9ERV9SRUFEX0VPRjoKLQkJCXJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCQkJZ290byBjbGVhbnVwOwotCQljYXNlIE1PREVfQ0xPU0VEOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKLQkJCQkJImZpbGUgaXMgbm90IHJlYWR5IGZvciByZWFkaW5nIik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JfQorICAgIEFDUVVJUkVfTE9DSyhzZWxmKTsKKyAgICBzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBNT0RFX1JFQUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFX1JFQURfRU9GOgorICAgICAgICAgICAgcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIGNhc2UgTU9ERV9DTE9TRUQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgaXMgbm90IHJlYWR5IGZvciByZWFkaW5nIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCi0JaWYgKHNpemVoaW50ID09IDApCi0JCXJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCWVsc2UKLQkJcmV0ID0gVXRpbF9HZXRMaW5lKHNlbGYsIChzaXplaGludCA8IDApID8gMCA6IHNpemVoaW50KTsKKyAgICBpZiAoc2l6ZWhpbnQgPT0gMCkKKyAgICAgICAgcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgZWxzZQorICAgICAgICByZXQgPSBVdGlsX0dldExpbmUoc2VsZiwgKHNpemVoaW50IDwgMCkgPyAwIDogc2l6ZWhpbnQpOwogCiBjbGVhbnVwOgotCVJFTEVBU0VfTE9DSyhzZWxmKTsKLQlyZXR1cm4gcmV0OworICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBQeURvY19TVFJWQVIoQloyRmlsZV9yZWFkbGluZXNfX2RvY19fLApAQCAtNjM0LDE0OCArNjM0LDE0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkZpbGVfcmVhZGxpbmVzKEJaMkZpbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgc2l6ZWhpbnQgPSAwOwotCVB5T2JqZWN0ICpsaXN0ID0gTlVMTDsKLQlQeU9iamVjdCAqbGluZTsKLQljaGFyIHNtYWxsX2J1ZmZlcltTTUFMTENIVU5LXTsKLQljaGFyICpidWZmZXIgPSBzbWFsbF9idWZmZXI7Ci0Jc2l6ZV90IGJ1ZmZlcnNpemUgPSBTTUFMTENIVU5LOwotCVB5T2JqZWN0ICpiaWdfYnVmZmVyID0gTlVMTDsKLQlzaXplX3QgbmZpbGxlZCA9IDA7Ci0Jc2l6ZV90IG5yZWFkOwotCXNpemVfdCB0b3RhbHJlYWQgPSAwOwotCWNoYXIgKnAsICpxLCAqZW5kOwotCWludCBlcnI7Ci0JaW50IHNob3J0cmVhZCA9IDA7Ci0JaW50IGJ6ZXJyb3I7CisgICAgbG9uZyBzaXplaGludCA9IDA7CisgICAgUHlPYmplY3QgKmxpc3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsaW5lOworICAgIGNoYXIgc21hbGxfYnVmZmVyW1NNQUxMQ0hVTktdOworICAgIGNoYXIgKmJ1ZmZlciA9IHNtYWxsX2J1ZmZlcjsKKyAgICBzaXplX3QgYnVmZmVyc2l6ZSA9IFNNQUxMQ0hVTks7CisgICAgUHlPYmplY3QgKmJpZ19idWZmZXIgPSBOVUxMOworICAgIHNpemVfdCBuZmlsbGVkID0gMDsKKyAgICBzaXplX3QgbnJlYWQ7CisgICAgc2l6ZV90IHRvdGFscmVhZCA9IDA7CisgICAgY2hhciAqcCwgKnEsICplbmQ7CisgICAgaW50IGVycjsKKyAgICBpbnQgc2hvcnRyZWFkID0gMDsKKyAgICBpbnQgYnplcnJvcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZGxpbmVzIiwgJnNpemVoaW50KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bDpyZWFkbGluZXMiLCAmc2l6ZWhpbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUFDUVVJUkVfTE9DSyhzZWxmKTsKLQlzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKLQkJY2FzZSBNT0RFX1JFQUQ6Ci0JCQlicmVhazsKLQkJY2FzZSBNT0RFX1JFQURfRU9GOgotCQkJbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCWNhc2UgTU9ERV9DTE9TRUQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAotCQkJCQkiZmlsZSBpcyBub3QgcmVhZHkgZm9yIHJlYWRpbmciKTsKLQkJCWdvdG8gY2xlYW51cDsKLQl9CisgICAgQUNRVUlSRV9MT0NLKHNlbGYpOworICAgIHN3aXRjaCAoc2VsZi0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfUkVBRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfUkVBRF9FT0Y6CisgICAgICAgICAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgY2FzZSBNT0RFX0NMT1NFRDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBpcyBub3QgcmVhZHkgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAKLQlpZiAoKGxpc3QgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQotCQlnb3RvIGNsZWFudXA7CisgICAgaWYgKChsaXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBjbGVhbnVwOwogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCW5yZWFkID0gVXRpbF9Vbml2TmV3bGluZVJlYWQoJmJ6ZXJyb3IsIHNlbGYtPmZwLAotCQkJCQkgICAgIGJ1ZmZlcituZmlsbGVkLAotCQkJCQkgICAgIGJ1ZmZlcnNpemUtbmZpbGxlZCwgc2VsZik7Ci0JCXNlbGYtPnBvcyArPSBucmVhZDsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewotCQkJc2VsZi0+c2l6ZSA9IHNlbGYtPnBvczsKLQkJCXNlbGYtPm1vZGUgPSBNT0RFX1JFQURfRU9GOwotCQkJaWYgKG5yZWFkID09IDApIHsKLQkJCQlzaXplaGludCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzaG9ydHJlYWQgPSAxOwotCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJICBlcnJvcjoKLQkJCVB5X0RFQ1JFRihsaXN0KTsKLQkJCWxpc3QgPSBOVUxMOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JCXRvdGFscmVhZCArPSBucmVhZDsKLQkJcCA9IG1lbWNocihidWZmZXIrbmZpbGxlZCwgJ1xuJywgbnJlYWQpOwotCQlpZiAoIXNob3J0cmVhZCAmJiBwID09IE5VTEwpIHsKLQkJCS8qIE5lZWQgYSBsYXJnZXIgYnVmZmVyIHRvIGZpdCB0aGlzIGxpbmUgKi8KLQkJCW5maWxsZWQgKz0gbnJlYWQ7Ci0JCQlidWZmZXJzaXplICo9IDI7Ci0JCQlpZiAoYnVmZmVyc2l6ZSA+IElOVF9NQVgpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibGluZSBpcyBsb25nZXIgdGhhbiBhIFB5dGhvbiBzdHJpbmcgY2FuIGhvbGQiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKGJpZ19idWZmZXIgPT0gTlVMTCkgewotCQkJCS8qIENyZWF0ZSB0aGUgYmlnIGJ1ZmZlciAqLwotCQkJCWJpZ19idWZmZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkJCQkJTlVMTCwgYnVmZmVyc2l6ZSk7Ci0JCQkJaWYgKGJpZ19idWZmZXIgPT0gTlVMTCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoYmlnX2J1ZmZlcik7Ci0JCQkJbWVtY3B5KGJ1ZmZlciwgc21hbGxfYnVmZmVyLCBuZmlsbGVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIEdyb3cgdGhlIGJpZyBidWZmZXIgKi8KLQkJCQlfUHlTdHJpbmdfUmVzaXplKCZiaWdfYnVmZmVyLCBidWZmZXJzaXplKTsKLQkJCQlidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoYmlnX2J1ZmZlcik7Ci0JCQl9Ci0JCQljb250aW51ZTsJCQkKLQkJfQotCQllbmQgPSBidWZmZXIrbmZpbGxlZCtucmVhZDsKLQkJcSA9IGJ1ZmZlcjsKLQkJd2hpbGUgKHAgIT0gTlVMTCkgewotCQkJLyogUHJvY2VzcyBjb21wbGV0ZSBsaW5lcyAqLwotCQkJcCsrOwotCQkJbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHEsIHAtcSk7Ci0JCQlpZiAobGluZSA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGxpbmUpOwotCQkJUHlfREVDUkVGKGxpbmUpOwotCQkJaWYgKGVyciAhPSAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQlxID0gcDsKLQkJCXAgPSBtZW1jaHIocSwgJ1xuJywgZW5kLXEpOwotCQl9Ci0JCS8qIE1vdmUgdGhlIHJlbWFpbmluZyBpbmNvbXBsZXRlIGxpbmUgdG8gdGhlIHN0YXJ0ICovCi0JCW5maWxsZWQgPSBlbmQtcTsKLQkJbWVtbW92ZShidWZmZXIsIHEsIG5maWxsZWQpOwotCQlpZiAoc2l6ZWhpbnQgPiAwKQotCQkJaWYgKHRvdGFscmVhZCA+PSAoc2l6ZV90KXNpemVoaW50KQotCQkJCWJyZWFrOwotCQlpZiAoc2hvcnRyZWFkKSB7Ci0JCQlzaXplaGludCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAobmZpbGxlZCAhPSAwKSB7Ci0JCS8qIFBhcnRpYWwgbGFzdCBsaW5lICovCi0JCWxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsIG5maWxsZWQpOwotCQlpZiAobGluZSA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKHNpemVoaW50ID4gMCkgewotCQkJLyogTmVlZCB0byBjb21wbGV0ZSB0aGUgbGFzdCBsaW5lICovCi0JCQlQeU9iamVjdCAqcmVzdCA9IFV0aWxfR2V0TGluZShzZWxmLCAwKTsKLQkJCWlmIChyZXN0ID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYobGluZSk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCVB5U3RyaW5nX0NvbmNhdCgmbGluZSwgcmVzdCk7Ci0JCQlQeV9ERUNSRUYocmVzdCk7Ci0JCQlpZiAobGluZSA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBsaW5lKTsKLQkJUHlfREVDUkVGKGxpbmUpOwotCQlpZiAoZXJyICE9IDApCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgbnJlYWQgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyK25maWxsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyc2l6ZS1uZmlsbGVkLCBzZWxmKTsKKyAgICAgICAgc2VsZi0+cG9zICs9IG5yZWFkOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICBzZWxmLT5zaXplID0gc2VsZi0+cG9zOworICAgICAgICAgICAgc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7CisgICAgICAgICAgICBpZiAobnJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHNpemVoaW50ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNob3J0cmVhZCA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgIGVycm9yOgorICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgbGlzdCA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxyZWFkICs9IG5yZWFkOworICAgICAgICBwID0gbWVtY2hyKGJ1ZmZlcituZmlsbGVkLCAnXG4nLCBucmVhZCk7CisgICAgICAgIGlmICghc2hvcnRyZWFkICYmIHAgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogTmVlZCBhIGxhcmdlciBidWZmZXIgdG8gZml0IHRoaXMgbGluZSAqLworICAgICAgICAgICAgbmZpbGxlZCArPSBucmVhZDsKKyAgICAgICAgICAgIGJ1ZmZlcnNpemUgKj0gMjsKKyAgICAgICAgICAgIGlmIChidWZmZXJzaXplID4gSU5UX01BWCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBiaWcgYnVmZmVyICovCisgICAgICAgICAgICAgICAgYmlnX2J1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBidWZmZXJzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhiaWdfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLCBzbWFsbF9idWZmZXIsIG5maWxsZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogR3JvdyB0aGUgYmlnIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJmJpZ19idWZmZXIsIGJ1ZmZlcnNpemUpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhiaWdfYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVuZCA9IGJ1ZmZlcituZmlsbGVkK25yZWFkOworICAgICAgICBxID0gYnVmZmVyOworICAgICAgICB3aGlsZSAocCAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiBQcm9jZXNzIGNvbXBsZXRlIGxpbmVzICovCisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocSwgcC1xKTsKKyAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbGluZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYobGluZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIHEgPSBwOworICAgICAgICAgICAgcCA9IG1lbWNocihxLCAnXG4nLCBlbmQtcSk7CisgICAgICAgIH0KKyAgICAgICAgLyogTW92ZSB0aGUgcmVtYWluaW5nIGluY29tcGxldGUgbGluZSB0byB0aGUgc3RhcnQgKi8KKyAgICAgICAgbmZpbGxlZCA9IGVuZC1xOworICAgICAgICBtZW1tb3ZlKGJ1ZmZlciwgcSwgbmZpbGxlZCk7CisgICAgICAgIGlmIChzaXplaGludCA+IDApCisgICAgICAgICAgICBpZiAodG90YWxyZWFkID49IChzaXplX3Qpc2l6ZWhpbnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzaG9ydHJlYWQpIHsKKyAgICAgICAgICAgIHNpemVoaW50ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuZmlsbGVkICE9IDApIHsKKyAgICAgICAgLyogUGFydGlhbCBsYXN0IGxpbmUgKi8KKyAgICAgICAgbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZmZlciwgbmZpbGxlZCk7CisgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAoc2l6ZWhpbnQgPiAwKSB7CisgICAgICAgICAgICAvKiBOZWVkIHRvIGNvbXBsZXRlIHRoZSBsYXN0IGxpbmUgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN0ID0gVXRpbF9HZXRMaW5lKHNlbGYsIDApOworICAgICAgICAgICAgaWYgKHJlc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlTdHJpbmdfQ29uY2F0KCZsaW5lLCByZXN0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN0KTsKKyAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGxpbmUpOworICAgICAgICBQeV9ERUNSRUYobGluZSk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCiAgIGNsZWFudXA6Ci0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCWlmIChiaWdfYnVmZmVyKSB7Ci0JCVB5X0RFQ1JFRihiaWdfYnVmZmVyKTsKLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIGlmIChiaWdfYnVmZmVyKSB7CisgICAgICAgIFB5X0RFQ1JFRihiaWdfYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7CiB9CiAKIFB5RG9jX1NUUlZBUihCWjJGaWxlX3hyZWFkbGluZXNfX2RvY19fLApAQCAtNzk2LDUyICs3OTYsNTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX3dyaXRlKEJaMkZpbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCVB5X2J1ZmZlciBwYnVmOwotCWNoYXIgKmJ1ZjsKLQlpbnQgbGVuOwotCWludCBiemVycm9yOworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIFB5X2J1ZmZlciBwYnVmOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworICAgIGludCBiemVycm9yOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjp3cml0ZSIsICZwYnVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVmID0gcGJ1Zi5idWY7Ci0JbGVuID0gcGJ1Zi5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjp3cml0ZSIsICZwYnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnVmID0gcGJ1Zi5idWY7CisgICAgbGVuID0gcGJ1Zi5sZW47CiAKLQlBQ1FVSVJFX0xPQ0soc2VsZik7Ci0Jc3dpdGNoIChzZWxmLT5tb2RlKSB7Ci0JCWNhc2UgTU9ERV9XUklURToKLQkJCWJyZWFrOworICAgIEFDUVVJUkVfTE9DSyhzZWxmKTsKKyAgICBzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBNT0RFX1dSSVRFOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBNT0RFX0NMT1NFRDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQkJZ290byBjbGVhbnVwOworICAgICAgICBjYXNlIE1PREVfQ0xPU0VEOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKIAotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJCSJmaWxlIGlzIG5vdCByZWFkeSBmb3Igd3JpdGluZyIpOwotCQkJZ290byBjbGVhbnVwOwotCX0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIGlzIG5vdCByZWFkeSBmb3Igd3JpdGluZyIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAotCXNlbGYtPmZfc29mdHNwYWNlID0gMDsKKyAgICBzZWxmLT5mX3NvZnRzcGFjZSA9IDA7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JQloyX2J6V3JpdGUgKCZiemVycm9yLCBzZWxmLT5mcCwgYnVmLCBsZW4pOwotCXNlbGYtPnBvcyArPSBsZW47Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgQloyX2J6V3JpdGUgKCZiemVycm9yLCBzZWxmLT5mcCwgYnVmLCBsZW4pOworICAgIHNlbGYtPnBvcyArPSBsZW47CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJZ290byBjbGVhbnVwOwotCX0KKyAgICBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0ID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0ID0gUHlfTm9uZTsKIAogY2xlYW51cDoKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JcmV0dXJuIHJldDsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKEJaMkZpbGVfd3JpdGVsaW5lc19fZG9jX18sCkBAIC04NTcsMTI0ICs4NTcsMTI0IEBACiBCWjJGaWxlX3dyaXRlbGluZXMoQloyRmlsZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcSkKIHsKICNkZWZpbmUgQ0hVTktTSVpFIDEwMDAKLQlQeU9iamVjdCAqbGlzdCA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ZXIgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCVB5T2JqZWN0ICpsaW5lOwotCWludCBpLCBqLCBpbmRleCwgbGVuLCBpc2xpc3Q7Ci0JaW50IGJ6ZXJyb3I7CisgICAgUHlPYmplY3QgKmxpc3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICppdGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbGluZTsKKyAgICBpbnQgaSwgaiwgaW5kZXgsIGxlbiwgaXNsaXN0OworICAgIGludCBiemVycm9yOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCXN3aXRjaCAoc2VsZi0+bW9kZSkgewotCQljYXNlIE1PREVfV1JJVEU6Ci0JCQlicmVhazsKKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgc3dpdGNoIChzZWxmLT5tb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9XUklURToKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTU9ERV9DTE9TRUQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJCWdvdG8gZXJyb3I7CisgICAgICAgIGNhc2UgTU9ERV9DTE9TRUQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKIAotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJCSJmaWxlIGlzIG5vdCByZWFkeSBmb3Igd3JpdGluZyIpOwotCQkJZ290byBlcnJvcjsKLQl9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBpcyBub3QgcmVhZHkgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JaXNsaXN0ID0gUHlMaXN0X0NoZWNrKHNlcSk7Ci0JaWYgICghaXNsaXN0KSB7Ci0JCWl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JCWlmIChpdGVyID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIndyaXRlbGluZXMoKSByZXF1aXJlcyBhbiBpdGVyYWJsZSBhcmd1bWVudCIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlsaXN0ID0gUHlMaXN0X05ldyhDSFVOS1NJWkUpOwotCQlpZiAobGlzdCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgaXNsaXN0ID0gUHlMaXN0X0NoZWNrKHNlcSk7CisgICAgaWYgICghaXNsaXN0KSB7CisgICAgICAgIGl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgICAgIGlmIChpdGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIndyaXRlbGluZXMoKSByZXF1aXJlcyBhbiBpdGVyYWJsZSBhcmd1bWVudCIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBsaXN0ID0gUHlMaXN0X05ldyhDSFVOS1NJWkUpOworICAgICAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBTdHJhdGVneTogc2x1cnAgQ0hVTktTSVpFIGxpbmVzIGludG8gYSBwcml2YXRlIGxpc3QsCi0JICAgY2hlY2tpbmcgdGhhdCB0aGV5IGFyZSBhbGwgc3RyaW5ncywgdGhlbiB3cml0ZSB0aGF0IGxpc3QKLQkgICB3aXRob3V0IGhvbGRpbmcgdGhlIGludGVycHJldGVyIGxvY2ssIHRoZW4gY29tZSBiYWNrIGZvciBtb3JlLiAqLwotCWZvciAoaW5kZXggPSAwOyA7IGluZGV4ICs9IENIVU5LU0laRSkgewotCQlpZiAoaXNsaXN0KSB7Ci0JCQlQeV9YREVDUkVGKGxpc3QpOwotCQkJbGlzdCA9IFB5TGlzdF9HZXRTbGljZShzZXEsIGluZGV4LCBpbmRleCtDSFVOS1NJWkUpOwotCQkJaWYgKGxpc3QgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQkJaiA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaiA9IDA7IGogPCBDSFVOS1NJWkU7IGorKykgewotCQkJCWxpbmUgPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJCQlpZiAobGluZSA9PSBOVUxMKSB7Ci0JCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGosIGxpbmUpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IDApCi0JCQlicmVhazsKKyAgICAvKiBTdHJhdGVneTogc2x1cnAgQ0hVTktTSVpFIGxpbmVzIGludG8gYSBwcml2YXRlIGxpc3QsCisgICAgICAgY2hlY2tpbmcgdGhhdCB0aGV5IGFyZSBhbGwgc3RyaW5ncywgdGhlbiB3cml0ZSB0aGF0IGxpc3QKKyAgICAgICB3aXRob3V0IGhvbGRpbmcgdGhlIGludGVycHJldGVyIGxvY2ssIHRoZW4gY29tZSBiYWNrIGZvciBtb3JlLiAqLworICAgIGZvciAoaW5kZXggPSAwOyA7IGluZGV4ICs9IENIVU5LU0laRSkgeworICAgICAgICBpZiAoaXNsaXN0KSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKGxpc3QpOworICAgICAgICAgICAgbGlzdCA9IFB5TGlzdF9HZXRTbGljZShzZXEsIGluZGV4LCBpbmRleCtDSFVOS1NJWkUpOworICAgICAgICAgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgaiA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBDSFVOS1NJWkU7IGorKykgeworICAgICAgICAgICAgICAgIGxpbmUgPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGosIGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChqID09IDApCisgICAgICAgICAgICBicmVhazsKIAotCQkvKiBDaGVjayB0aGF0IGFsbCBlbnRyaWVzIGFyZSBpbmRlZWQgc3RyaW5ncy4gSWYgbm90LAotCQkgICBhcHBseSB0aGUgc2FtZSBydWxlcyBhcyBmb3IgZmlsZS53cml0ZSgpIGFuZAotCQkgICBjb252ZXJ0IHRoZSByZXRzIHRvIHN0cmluZ3MuIFRoaXMgaXMgc2xvdywgYnV0Ci0JCSAgIHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSBzaW5jZSBhbGwgY29udmVyc2lvbiBBUElzCi0JCSAgIGNvdWxkIHBvdGVudGlhbGx5IGV4ZWN1dGUgUHl0aG9uIGNvZGUuICovCi0JCWZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKLQkJCVB5T2JqZWN0ICp2ID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOwotCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewotCQkJICAgIAljb25zdCBjaGFyICpidWZmZXI7Ci0JCQkgICAgCVB5X3NzaXplX3QgbGVuOwotCQkJCWlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodiwgJmJ1ZmZlciwgJmxlbikpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCQkid3JpdGVsaW5lcygpICIKLQkJCQkJCQkiYXJndW1lbnQgbXVzdCBiZSAiCi0JCQkJCQkJImEgc2VxdWVuY2Ugb2YgIgotCQkJCQkJCSJzdHJpbmdzIik7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCWxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsCi0JCQkJCQkJCSAgbGVuKTsKLQkJCQlpZiAobGluZSA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlQeUxpc3RfU0VUX0lURU0obGlzdCwgaSwgbGluZSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLyogQ2hlY2sgdGhhdCBhbGwgZW50cmllcyBhcmUgaW5kZWVkIHN0cmluZ3MuIElmIG5vdCwKKyAgICAgICAgICAgYXBwbHkgdGhlIHNhbWUgcnVsZXMgYXMgZm9yIGZpbGUud3JpdGUoKSBhbmQKKyAgICAgICAgICAgY29udmVydCB0aGUgcmV0cyB0byBzdHJpbmdzLiBUaGlzIGlzIHNsb3csIGJ1dAorICAgICAgICAgICBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgc2luY2UgYWxsIGNvbnZlcnNpb24gQVBJcworICAgICAgICAgICBjb3VsZCBwb3RlbnRpYWxseSBleGVjdXRlIFB5dGhvbiBjb2RlLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmZXI7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47CisgICAgICAgICAgICAgICAgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih2LCAmYnVmZmVyLCAmbGVuKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlbGluZXMoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBzZXF1ZW5jZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5ncyIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCBsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXNlbGYtPmZfc29mdHNwYWNlID0gMDsKKyAgICAgICAgc2VsZi0+Zl9zb2Z0c3BhY2UgPSAwOwogCi0JCS8qIFNpbmNlIHdlIGFyZSByZWxlYXNpbmcgdGhlIGdsb2JhbCBsb2NrLCB0aGUKLQkJICAgZm9sbG93aW5nIGNvZGUgbWF5ICpub3QqIGV4ZWN1dGUgUHl0aG9uIGNvZGUuICovCi0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQkgICAgCWxpbmUgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRShsaW5lKTsKLQkJCUJaMl9ieldyaXRlICgmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcobGluZSksIGxlbik7Ci0JCQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJCVB5X0JMT0NLX1RIUkVBRFMKLQkJCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJfQotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAvKiBTaW5jZSB3ZSBhcmUgcmVsZWFzaW5nIHRoZSBnbG9iYWwgbG9jaywgdGhlCisgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIG1heSAqbm90KiBleGVjdXRlIFB5dGhvbiBjb2RlLiAqLworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgICAgIGxpbmUgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CisgICAgICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShsaW5lKTsKKyAgICAgICAgICAgIEJaMl9ieldyaXRlICgmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGxpbmUpLCBsZW4pOworICAgICAgICAgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgICAgICBQeV9CTE9DS19USFJFQURTCisgICAgICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCQlpZiAoaiA8IENIVU5LU0laRSkKLQkJCWJyZWFrOwotCX0KKyAgICAgICAgaWYgKGogPCBDSFVOS1NJWkUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0ID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0ID0gUHlfTm9uZTsKIAogICBlcnJvcjoKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JUHlfWERFQ1JFRihsaXN0KTsKLSAgCVB5X1hERUNSRUYoaXRlcik7Ci0JcmV0dXJuIHJldDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgUHlfWERFQ1JFRihsaXN0KTsKKyAgICBQeV9YREVDUkVGKGl0ZXIpOworICAgIHJldHVybiByZXQ7CiAjdW5kZWYgQ0hVTktTSVpFCiB9CiAKQEAgLTk5NCwxNDggKzk5NCwxNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX3NlZWsoQloyRmlsZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHdoZXJlID0gMDsKLQlQeU9iamVjdCAqb2Zmb2JqOwotCVB5X29mZl90IG9mZnNldDsKLQljaGFyIHNtYWxsX2J1ZmZlcltTTUFMTENIVU5LXTsKLQljaGFyICpidWZmZXIgPSBzbWFsbF9idWZmZXI7Ci0Jc2l6ZV90IGJ1ZmZlcnNpemUgPSBTTUFMTENIVU5LOwotCVB5X29mZl90IGJ5dGVzcmVhZCA9IDA7Ci0Jc2l6ZV90IHJlYWRzaXplOwotCWludCBjaHVua3NpemU7Ci0JaW50IGJ6ZXJyb3I7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgaW50IHdoZXJlID0gMDsKKyAgICBQeU9iamVjdCAqb2Zmb2JqOworICAgIFB5X29mZl90IG9mZnNldDsKKyAgICBjaGFyIHNtYWxsX2J1ZmZlcltTTUFMTENIVU5LXTsKKyAgICBjaGFyICpidWZmZXIgPSBzbWFsbF9idWZmZXI7CisgICAgc2l6ZV90IGJ1ZmZlcnNpemUgPSBTTUFMTENIVU5LOworICAgIFB5X29mZl90IGJ5dGVzcmVhZCA9IDA7CisgICAgc2l6ZV90IHJlYWRzaXplOworICAgIGludCBjaHVua3NpemU7CisgICAgaW50IGJ6ZXJyb3I7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpzZWVrIiwgJm9mZm9iaiwgJndoZXJlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6c2VlayIsICZvZmZvYmosICZ3aGVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmICFkZWZpbmVkKEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQpCi0Jb2Zmc2V0ID0gUHlJbnRfQXNMb25nKG9mZm9iaik7CisgICAgb2Zmc2V0ID0gUHlJbnRfQXNMb25nKG9mZm9iaik7CiAjZWxzZQotCW9mZnNldCA9IFB5TG9uZ19DaGVjayhvZmZvYmopID8KLQkJUHlMb25nX0FzTG9uZ0xvbmcob2Zmb2JqKSA6IFB5SW50X0FzTG9uZyhvZmZvYmopOworICAgIG9mZnNldCA9IFB5TG9uZ19DaGVjayhvZmZvYmopID8KKyAgICAgICAgUHlMb25nX0FzTG9uZ0xvbmcob2Zmb2JqKSA6IFB5SW50X0FzTG9uZyhvZmZvYmopOwogI2VuZGlmCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUFDUVVJUkVfTE9DSyhzZWxmKTsKLQlVdGlsX0Ryb3BSZWFkQWhlYWQoc2VsZik7Ci0Jc3dpdGNoIChzZWxmLT5tb2RlKSB7Ci0JCWNhc2UgTU9ERV9SRUFEOgotCQljYXNlIE1PREVfUkVBRF9FT0Y6Ci0JCQlicmVhazsKKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgVXRpbF9Ecm9wUmVhZEFoZWFkKHNlbGYpOworICAgIHN3aXRjaCAoc2VsZi0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfUkVBRDoKKyAgICAgICAgY2FzZSBNT0RFX1JFQURfRU9GOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBNT0RFX0NMT1NFRDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQkJZ290byBjbGVhbnVwOworICAgICAgICBjYXNlIE1PREVfQ0xPU0VEOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKIAotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJCSJzZWVrIHdvcmtzIG9ubHkgd2hpbGUgcmVhZGluZyIpOwotCQkJZ290byBjbGVhbnVwOwotCX0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWVrIHdvcmtzIG9ubHkgd2hpbGUgcmVhZGluZyIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAotCWlmICh3aGVyZSA9PSAyKSB7Ci0JCWlmIChzZWxmLT5zaXplID09IC0xKSB7Ci0JCQlhc3NlcnQoc2VsZi0+bW9kZSAhPSBNT0RFX1JFQURfRU9GKTsKLQkJCWZvciAoOzspIHsKLQkJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQkJY2h1bmtzaXplID0gVXRpbF9Vbml2TmV3bGluZVJlYWQoCi0JCQkJCQkmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJCQlidWZmZXIsIGJ1ZmZlcnNpemUsCi0JCQkJCQlzZWxmKTsKLQkJCQlzZWxmLT5wb3MgKz0gY2h1bmtzaXplOwotCQkJCVB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHdoZXJlID09IDIpIHsKKyAgICAgICAgaWYgKHNlbGYtPnNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgIGFzc2VydChzZWxmLT5tb2RlICE9IE1PREVfUkVBRF9FT0YpOworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBjaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ6ZXJyb3IsIHNlbGYtPmZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlcnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOworICAgICAgICAgICAgICAgIHNlbGYtPnBvcyArPSBjaHVua3NpemU7CisgICAgICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCQkJCWJ5dGVzcmVhZCArPSBjaHVua3NpemU7Ci0JCQkJaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJCQlnb3RvIGNsZWFudXA7Ci0JCQkJfQotCQkJfQotCQkJc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7Ci0JCQlzZWxmLT5zaXplID0gc2VsZi0+cG9zOwotCQkJYnl0ZXNyZWFkID0gMDsKLQkJfQotCQlvZmZzZXQgPSBzZWxmLT5zaXplICsgb2Zmc2V0OwotCX0gZWxzZSBpZiAod2hlcmUgPT0gMSkgewotCQlvZmZzZXQgPSBzZWxmLT5wb3MgKyBvZmZzZXQ7Ci0JfQorICAgICAgICAgICAgICAgIGJ5dGVzcmVhZCArPSBjaHVua3NpemU7CisgICAgICAgICAgICAgICAgaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7CisgICAgICAgICAgICBzZWxmLT5zaXplID0gc2VsZi0+cG9zOworICAgICAgICAgICAgYnl0ZXNyZWFkID0gMDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgPSBzZWxmLT5zaXplICsgb2Zmc2V0OworICAgIH0gZWxzZSBpZiAod2hlcmUgPT0gMSkgeworICAgICAgICBvZmZzZXQgPSBzZWxmLT5wb3MgKyBvZmZzZXQ7CisgICAgfQogCi0JLyogQmVmb3JlIGdldHRpbmcgaGVyZSwgb2Zmc2V0IG11c3QgYmUgdGhlIGFic29sdXRlIHBvc2l0aW9uIHRoZSBmaWxlIAotCSAqIHBvaW50ZXIgc2hvdWxkIGJlIHNldCB0by4gKi8KKyAgICAvKiBCZWZvcmUgZ2V0dGluZyBoZXJlLCBvZmZzZXQgbXVzdCBiZSB0aGUgYWJzb2x1dGUgcG9zaXRpb24gdGhlIGZpbGUKKyAgICAgKiBwb2ludGVyIHNob3VsZCBiZSBzZXQgdG8uICovCiAKLQlpZiAob2Zmc2V0ID49IHNlbGYtPnBvcykgewotCQkvKiB3ZSBjYW4gbW92ZSBmb3J3YXJkICovCi0JCW9mZnNldCAtPSBzZWxmLT5wb3M7Ci0JfSBlbHNlIHsKLQkJLyogd2UgY2Fubm90IG1vdmUgYmFjaywgc28gcmV3aW5kIHRoZSBzdHJlYW0gKi8KLQkJQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7Ci0JCWlmIChzZWxmLT5mcCkgewotCQkJUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQkJCXNlbGYtPmZwID0gTlVMTDsKLQkJfQotCQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JCXJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+ZmlsZSwgInNlZWsiLCAiKGkpIiwgMCk7Ci0JCWlmICghcmV0KQotCQkJZ290byBjbGVhbnVwOwotCQlQeV9ERUNSRUYocmV0KTsKLQkJcmV0ID0gTlVMTDsKLQkJc2VsZi0+cG9zID0gMDsKLQkJc2VsZi0+ZnAgPSBCWjJfYnpSZWFkT3BlbigmYnplcnJvciwgUHlGaWxlX0FzRmlsZShzZWxmLT5maWxlKSwKLQkJCQkJICAwLCAwLCBOVUxMLCAwKTsKLQkJaWYgKHNlbGYtPmZwKQotCQkJUHlGaWxlX0luY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQkJaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCQlzZWxmLT5tb2RlID0gTU9ERV9SRUFEOwotCX0KKyAgICBpZiAob2Zmc2V0ID49IHNlbGYtPnBvcykgeworICAgICAgICAvKiB3ZSBjYW4gbW92ZSBmb3J3YXJkICovCisgICAgICAgIG9mZnNldCAtPSBzZWxmLT5wb3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogd2UgY2Fubm90IG1vdmUgYmFjaywgc28gcmV3aW5kIHRoZSBzdHJlYW0gKi8KKyAgICAgICAgQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7CisgICAgICAgIGlmIChzZWxmLT5mcCkgeworICAgICAgICAgICAgUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKKyAgICAgICAgICAgIHNlbGYtPmZwID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+ZmlsZSwgInNlZWsiLCAiKGkpIiwgMCk7CisgICAgICAgIGlmICghcmV0KQorICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBQeV9ERUNSRUYocmV0KTsKKyAgICAgICAgcmV0ID0gTlVMTDsKKyAgICAgICAgc2VsZi0+cG9zID0gMDsKKyAgICAgICAgc2VsZi0+ZnAgPSBCWjJfYnpSZWFkT3BlbigmYnplcnJvciwgUHlGaWxlX0FzRmlsZShzZWxmLT5maWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKHNlbGYtPmZwKQorICAgICAgICAgICAgUHlGaWxlX0luY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKKyAgICAgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5tb2RlID0gTU9ERV9SRUFEOworICAgIH0KIAotCWlmIChvZmZzZXQgPD0gMCB8fCBzZWxmLT5tb2RlID09IE1PREVfUkVBRF9FT0YpCi0JCWdvdG8gZXhpdDsKKyAgICBpZiAob2Zmc2V0IDw9IDAgfHwgc2VsZi0+bW9kZSA9PSBNT0RFX1JFQURfRU9GKQorICAgICAgICBnb3RvIGV4aXQ7CiAKLQkvKiBCZWZvcmUgZ2V0dGluZyBoZXJlLCBvZmZzZXQgbXVzdCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZiBieXRlcwotCSAqIHRvIHdhbGsgZm9yd2FyZC4gKi8KLQlmb3IgKDs7KSB7Ci0JCWlmIChvZmZzZXQtYnl0ZXNyZWFkID4gYnVmZmVyc2l6ZSkKLQkJCXJlYWRzaXplID0gYnVmZmVyc2l6ZTsKLQkJZWxzZQotCQkJLyogb2Zmc2V0IG1pZ2h0IGJlIHdpZGVyIHRoYXQgcmVhZHNpemUsIGJ1dCB0aGUgcmVzdWx0Ci0JCQkgKiBvZiB0aGUgc3VidHJhY3Rpb24gaXMgYm91bmQgYnkgYnVmZmVyc2l6ZSAoc2VlIHRoZQotCQkJICogY29uZGl0aW9uIGFib3ZlKS4gYnVmZmVyc2l6ZSBpcyA4MTkyLiAqLwotCQkJcmVhZHNpemUgPSAoc2l6ZV90KShvZmZzZXQtYnl0ZXNyZWFkKTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQljaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJCQkgYnVmZmVyLCByZWFkc2l6ZSwgc2VsZik7Ci0JCXNlbGYtPnBvcyArPSBjaHVua3NpemU7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWJ5dGVzcmVhZCArPSBjaHVua3NpemU7Ci0JCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJCXNlbGYtPnNpemUgPSBzZWxmLT5wb3M7Ci0JCQlzZWxmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCQlpZiAoYnl0ZXNyZWFkID09IG9mZnNldCkKLQkJCWJyZWFrOwotCX0KKyAgICAvKiBCZWZvcmUgZ2V0dGluZyBoZXJlLCBvZmZzZXQgbXVzdCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZiBieXRlcworICAgICAqIHRvIHdhbGsgZm9yd2FyZC4gKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChvZmZzZXQtYnl0ZXNyZWFkID4gYnVmZmVyc2l6ZSkKKyAgICAgICAgICAgIHJlYWRzaXplID0gYnVmZmVyc2l6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogb2Zmc2V0IG1pZ2h0IGJlIHdpZGVyIHRoYXQgcmVhZHNpemUsIGJ1dCB0aGUgcmVzdWx0CisgICAgICAgICAgICAgKiBvZiB0aGUgc3VidHJhY3Rpb24gaXMgYm91bmQgYnkgYnVmZmVyc2l6ZSAoc2VlIHRoZQorICAgICAgICAgICAgICogY29uZGl0aW9uIGFib3ZlKS4gYnVmZmVyc2l6ZSBpcyA4MTkyLiAqLworICAgICAgICAgICAgcmVhZHNpemUgPSAoc2l6ZV90KShvZmZzZXQtYnl0ZXNyZWFkKTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBjaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgcmVhZHNpemUsIHNlbGYpOworICAgICAgICBzZWxmLT5wb3MgKz0gY2h1bmtzaXplOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBieXRlc3JlYWQgKz0gY2h1bmtzaXplOworICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICBzZWxmLT5zaXplID0gc2VsZi0+cG9zOworICAgICAgICAgICAgc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzcmVhZCA9PSBvZmZzZXQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKIGV4aXQ6Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldCA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldCA9IFB5X05vbmU7CiAKIGNsZWFudXA6Ci0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCXJldHVybiByZXQ7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihCWjJGaWxlX3RlbGxfX2RvY19fLApAQCAtMTE0NywyMiArMTE0NywyMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkZpbGVfdGVsbChCWjJGaWxlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKIAotCWlmIChzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCWdvdG8gY2xlYW51cDsKLQl9CisgICAgaWYgKHNlbGYtPm1vZGUgPT0gTU9ERV9DTE9TRUQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQlyZXQgPSBQeUludF9Gcm9tTG9uZyhzZWxmLT5wb3MpOworICAgIHJldCA9IFB5SW50X0Zyb21Mb25nKHNlbGYtPnBvcyk7CiAjZWxzZQotCXJldCA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoc2VsZi0+cG9zKTsKKyAgICByZXQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHNlbGYtPnBvcyk7CiAjZW5kaWYKIAogY2xlYW51cDoKLQlyZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihCWjJGaWxlX2Nsb3NlX19kb2NfXywKQEAgLTExNzYsMzQgKzExNzYsMzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX2Nsb3NlKEJaMkZpbGVPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JaW50IGJ6ZXJyb3IgPSBCWl9PSzsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBpbnQgYnplcnJvciA9IEJaX09LOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCXN3aXRjaCAoc2VsZi0+bW9kZSkgewotCQljYXNlIE1PREVfUkVBRDoKLQkJY2FzZSBNT0RFX1JFQURfRU9GOgotCQkJQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNT0RFX1dSSVRFOgotCQkJQloyX2J6V3JpdGVDbG9zZSgmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJCSAwLCBOVUxMLCBOVUxMKTsKLQkJCWJyZWFrOwotCX0KLQlpZiAoc2VsZi0+ZnApIHsKLQkJUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQkJc2VsZi0+ZnAgPSBOVUxMOwotCX0KLQlzZWxmLT5tb2RlID0gTU9ERV9DTE9TRUQ7Ci0JcmV0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5maWxlLCAiY2xvc2UiLCBOVUxMKTsKLQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCVB5X1hERUNSRUYocmV0KTsKLQkJcmV0ID0gTlVMTDsKLQl9CisgICAgQUNRVUlSRV9MT0NLKHNlbGYpOworICAgIHN3aXRjaCAoc2VsZi0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfUkVBRDoKKyAgICAgICAgY2FzZSBNT0RFX1JFQURfRU9GOgorICAgICAgICAgICAgQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFX1dSSVRFOgorICAgICAgICAgICAgQloyX2J6V3JpdGVDbG9zZSgmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzZWxmLT5mcCkgeworICAgICAgICBQeUZpbGVfRGVjVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgICAgICBzZWxmLT5mcCA9IE5VTEw7CisgICAgfQorICAgIHNlbGYtPm1vZGUgPSBNT0RFX0NMT1NFRDsKKyAgICByZXQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPmZpbGUsICJjbG9zZSIsIE5VTEwpOworICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgUHlfWERFQ1JFRihyZXQpOworICAgICAgICByZXQgPSBOVUxMOworICAgIH0KIAotCVJFTEVBU0VfTE9DSyhzZWxmKTsKLQlyZXR1cm4gcmV0OworICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBQeURvY19TVFJWQVIoQloyRmlsZV9lbnRlcl9kb2MsCkBAIC0xMjEyLDEzICsxMjEyLDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9lbnRlcihCWjJGaWxlT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihzZWxmKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHNlbGY7CisgICAgaWYgKHNlbGYtPm1vZGUgPT0gTU9ERV9DTE9TRUQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKIH0KIAogUHlEb2NfU1RSVkFSKEJaMkZpbGVfZXhpdF9kb2MsCkBAIC0xMjI3LDMwICsxMjI3LDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9leGl0KEJaMkZpbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKSBzZWxmLCAiY2xvc2UiLCBOVUxMKTsKLQlpZiAoIXJldCkKLQkJLyogSWYgZXJyb3Igb2NjdXJyZWQsIHBhc3MgdGhyb3VnaCAqLwotCQlyZXR1cm4gTlVMTDsKLQlQeV9ERUNSRUYocmV0KTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeU9iamVjdCAqcmV0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKikgc2VsZiwgImNsb3NlIiwgTlVMTCk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIC8qIElmIGVycm9yIG9jY3VycmVkLCBwYXNzIHRocm91Z2ggKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJldCk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICpCWjJGaWxlX2dldGl0ZXIoQloyRmlsZU9iamVjdCAqc2VsZik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBCWjJGaWxlX21ldGhvZHNbXSA9IHsKLQl7InJlYWQiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV9yZWFkLCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfcmVhZF9fZG9jX199LAotCXsicmVhZGxpbmUiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV9yZWFkbGluZSwgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX3JlYWRsaW5lX19kb2NfX30sCi0JeyJyZWFkbGluZXMiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV9yZWFkbGluZXMsIE1FVEhfVkFSQVJHUywgQloyRmlsZV9yZWFkbGluZXNfX2RvY19ffSwKLQl7InhyZWFkbGluZXMiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV9nZXRpdGVyLCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfeHJlYWRsaW5lc19fZG9jX199LAotCXsid3JpdGUiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV93cml0ZSwgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX3dyaXRlX19kb2NfX30sCi0JeyJ3cml0ZWxpbmVzIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfd3JpdGVsaW5lcywgTUVUSF9PLCBCWjJGaWxlX3dyaXRlbGluZXNfX2RvY19ffSwKLQl7InNlZWsiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV9zZWVrLCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfc2Vla19fZG9jX199LAotCXsidGVsbCIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3RlbGwsIE1FVEhfTk9BUkdTLCBCWjJGaWxlX3RlbGxfX2RvY19ffSwKLQl7ImNsb3NlIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfY2xvc2UsIE1FVEhfTk9BUkdTLCBCWjJGaWxlX2Nsb3NlX19kb2NfX30sCi0JeyJfX2VudGVyX18iLCAoUHlDRnVuY3Rpb24pQloyRmlsZV9lbnRlciwgTUVUSF9OT0FSR1MsIEJaMkZpbGVfZW50ZXJfZG9jfSwKLQl7Il9fZXhpdF9fIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfZXhpdCwgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX2V4aXRfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsicmVhZCIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3JlYWQsIE1FVEhfVkFSQVJHUywgQloyRmlsZV9yZWFkX19kb2NfX30sCisgICAgeyJyZWFkbGluZSIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3JlYWRsaW5lLCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfcmVhZGxpbmVfX2RvY19ffSwKKyAgICB7InJlYWRsaW5lcyIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3JlYWRsaW5lcywgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX3JlYWRsaW5lc19fZG9jX199LAorICAgIHsieHJlYWRsaW5lcyIsIChQeUNGdW5jdGlvbilCWjJGaWxlX2dldGl0ZXIsIE1FVEhfVkFSQVJHUywgQloyRmlsZV94cmVhZGxpbmVzX19kb2NfX30sCisgICAgeyJ3cml0ZSIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3dyaXRlLCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfd3JpdGVfX2RvY19ffSwKKyAgICB7IndyaXRlbGluZXMiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV93cml0ZWxpbmVzLCBNRVRIX08sIEJaMkZpbGVfd3JpdGVsaW5lc19fZG9jX199LAorICAgIHsic2VlayIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3NlZWssIE1FVEhfVkFSQVJHUywgQloyRmlsZV9zZWVrX19kb2NfX30sCisgICAgeyJ0ZWxsIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfdGVsbCwgTUVUSF9OT0FSR1MsIEJaMkZpbGVfdGVsbF9fZG9jX199LAorICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV9jbG9zZSwgTUVUSF9OT0FSR1MsIEJaMkZpbGVfY2xvc2VfX2RvY19ffSwKKyAgICB7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilCWjJGaWxlX2VudGVyLCBNRVRIX05PQVJHUywgQloyRmlsZV9lbnRlcl9kb2N9LAorICAgIHsiX19leGl0X18iLCAoUHlDRnVuY3Rpb24pQloyRmlsZV9leGl0LCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfZXhpdF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTEyNjEsNjAgKzEyNjEsNjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX2dldF9uZXdsaW5lcyhCWjJGaWxlT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXN3aXRjaCAoc2VsZi0+Zl9uZXdsaW5ldHlwZXMpIHsKLQljYXNlIE5FV0xJTkVfVU5LTk9XTjoKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQljYXNlIE5FV0xJTkVfQ1I6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcciIpOwotCWNhc2UgTkVXTElORV9MRjoKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIlxuIik7Ci0JY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxyIiwgIlxuIik7Ci0JY2FzZSBORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcclxuIik7Ci0JY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfQ1JMRjoKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzcykiLCAiXHIiLCAiXHJcbiIpOwotCWNhc2UgTkVXTElORV9MRnxORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxuIiwgIlxyXG4iKTsKLQljYXNlIE5FV0xJTkVfQ1J8TkVXTElORV9MRnxORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3NzKSIsICJcciIsICJcbiIsICJcclxuIik7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAKLQkJCSAgICAgIlVua25vd24gbmV3bGluZXMgdmFsdWUgMHgleFxuIiwgCi0JCQkgICAgIHNlbGYtPmZfbmV3bGluZXR5cGVzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHN3aXRjaCAoc2VsZi0+Zl9uZXdsaW5ldHlwZXMpIHsKKyAgICBjYXNlIE5FV0xJTkVfVU5LTk9XTjoKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBjYXNlIE5FV0xJTkVfQ1I6CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcciIpOworICAgIGNhc2UgTkVXTElORV9MRjoKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIlxuIik7CisgICAgY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfTEY6CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxyIiwgIlxuIik7CisgICAgY2FzZSBORVdMSU5FX0NSTEY6CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcclxuIik7CisgICAgY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfQ1JMRjoKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzcykiLCAiXHIiLCAiXHJcbiIpOworICAgIGNhc2UgTkVXTElORV9MRnxORVdMSU5FX0NSTEY6CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxuIiwgIlxyXG4iKTsKKyAgICBjYXNlIE5FV0xJTkVfQ1J8TkVXTElORV9MRnxORVdMSU5FX0NSTEY6CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3NzKSIsICJcciIsICJcbiIsICJcclxuIik7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gbmV3bGluZXMgdmFsdWUgMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZfbmV3bGluZXR5cGVzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9nZXRfY2xvc2VkKEJaMkZpbGVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNlbGYtPm1vZGUgPT0gTU9ERV9DTE9TRUQpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkZpbGVfZ2V0X21vZGUoQloyRmlsZU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLT5maWxlLCAibW9kZSIpOworICAgIHJldHVybiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYtPmZpbGUsICJtb2RlIik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX2dldF9uYW1lKEJaMkZpbGVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZi0+ZmlsZSwgIm5hbWUiKTsKKyAgICByZXR1cm4gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLT5maWxlLCAibmFtZSIpOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgQloyRmlsZV9nZXRzZXRbXSA9IHsKLQl7ImNsb3NlZCIsIChnZXR0ZXIpQloyRmlsZV9nZXRfY2xvc2VkLCBOVUxMLAotCQkJIlRydWUgaWYgdGhlIGZpbGUgaXMgY2xvc2VkIn0sCi0JeyJuZXdsaW5lcyIsIChnZXR0ZXIpQloyRmlsZV9nZXRfbmV3bGluZXMsIE5VTEwsIAotCQkJImVuZC1vZi1saW5lIGNvbnZlbnRpb24gdXNlZCBpbiB0aGlzIGZpbGUifSwKLQl7Im1vZGUiLCAoZ2V0dGVyKUJaMkZpbGVfZ2V0X21vZGUsIE5VTEwsCi0JCQkiZmlsZSBtb2RlICgncicsICd3Jywgb3IgJ1UnKSJ9LAotCXsibmFtZSIsIChnZXR0ZXIpQloyRmlsZV9nZXRfbmFtZSwgTlVMTCwKLQkJCSJmaWxlIG5hbWUifSwKLQl7TlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7ImNsb3NlZCIsIChnZXR0ZXIpQloyRmlsZV9nZXRfY2xvc2VkLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAiVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjbG9zZWQifSwKKyAgICB7Im5ld2xpbmVzIiwgKGdldHRlcilCWjJGaWxlX2dldF9uZXdsaW5lcywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgImVuZC1vZi1saW5lIGNvbnZlbnRpb24gdXNlZCBpbiB0aGlzIGZpbGUifSwKKyAgICB7Im1vZGUiLCAoZ2V0dGVyKUJaMkZpbGVfZ2V0X21vZGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICJmaWxlIG1vZGUgKCdyJywgJ3cnLCBvciAnVScpIn0sCisgICAgeyJuYW1lIiwgKGdldHRlcilCWjJGaWxlX2dldF9uYW1lLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAiZmlsZSBuYW1lIn0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIApAQCAtMTMyNSw5ICsxMzI1LDkgQEAKICNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKEJaMkZpbGVPYmplY3QsIHgpCiAKIHN0YXRpYyBQeU1lbWJlckRlZiBCWjJGaWxlX21lbWJlcnNbXSA9IHsKLQl7InNvZnRzcGFjZSIsCVRfSU5ULAkJT0ZGKGZfc29mdHNwYWNlKSwgMCwKLQkgImZsYWcgaW5kaWNhdGluZyB0aGF0IGEgc3BhY2UgbmVlZHMgdG8gYmUgcHJpbnRlZDsgdXNlZCBieSBwcmludCJ9LAotCXtOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsic29mdHNwYWNlIiwgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihmX3NvZnRzcGFjZSksIDAsCisgICAgICJmbGFnIGluZGljYXRpbmcgdGhhdCBhIHNwYWNlIG5lZWRzIHRvIGJlIHByaW50ZWQ7IHVzZWQgYnkgcHJpbnQifSwKKyAgICB7TlVMTH0gICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCkBAIC0xMzM2LDE1MyArMTMzNiwxNTMgQEAKIHN0YXRpYyBpbnQKIEJaMkZpbGVfaW5pdChCWjJGaWxlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZpbGVuYW1lIiwgIm1vZGUiLCAiYnVmZmVyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2xldmVsIiwgMH07Ci0JUHlPYmplY3QgKm5hbWU7Ci0JY2hhciAqbW9kZSA9ICJyIjsKLQlpbnQgYnVmZmVyaW5nID0gLTE7Ci0JaW50IGNvbXByZXNzbGV2ZWwgPSA5OwotCWludCBiemVycm9yOwotCWludCBtb2RlX2NoYXIgPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmlsZW5hbWUiLCAibW9kZSIsICJidWZmZXJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3NsZXZlbCIsIDB9OworICAgIFB5T2JqZWN0ICpuYW1lOworICAgIGNoYXIgKm1vZGUgPSAiciI7CisgICAgaW50IGJ1ZmZlcmluZyA9IC0xOworICAgIGludCBjb21wcmVzc2xldmVsID0gOTsKKyAgICBpbnQgYnplcnJvcjsKKyAgICBpbnQgbW9kZV9jaGFyID0gMDsKIAotCXNlbGYtPnNpemUgPSAtMTsKKyAgICBzZWxmLT5zaXplID0gLTE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHNpaTpCWjJGaWxlIiwKLQkJCQkJIGt3bGlzdCwgJm5hbWUsICZtb2RlLCAmYnVmZmVyaW5nLAotCQkJCQkgJmNvbXByZXNzbGV2ZWwpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xzaWk6QloyRmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmbmFtZSwgJm1vZGUsICZidWZmZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzbGV2ZWwpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoY29tcHJlc3NsZXZlbCA8IDEgfHwgY29tcHJlc3NsZXZlbCA+IDkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNvbXByZXNzbGV2ZWwgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDkiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoY29tcHJlc3NsZXZlbCA8IDEgfHwgY29tcHJlc3NsZXZlbCA+IDkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3NsZXZlbCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgOSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JZm9yICg7OykgewotCQlpbnQgZXJyb3IgPSAwOwotCQlzd2l0Y2ggKCptb2RlKSB7Ci0JCQljYXNlICdyJzoKLQkJCWNhc2UgJ3cnOgotCQkJCWlmIChtb2RlX2NoYXIpCi0JCQkJCWVycm9yID0gMTsKLQkJCQltb2RlX2NoYXIgPSAqbW9kZTsKLQkJCQlicmVhazsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBlcnJvciA9IDA7CisgICAgICAgIHN3aXRjaCAoKm1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICAgICAgaWYgKG1vZGVfY2hhcikKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIG1vZGVfY2hhciA9ICptb2RlOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQljYXNlICdiJzoKLQkJCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQljYXNlICdVJzoKKyAgICAgICAgICAgIGNhc2UgJ1UnOgogI2lmZGVmIF9fVk1TCi0JCQkJc2VsZi0+Zl91bml2X25ld2xpbmUgPSAwOworICAgICAgICAgICAgICAgIHNlbGYtPmZfdW5pdl9uZXdsaW5lID0gMDsKICNlbHNlCi0JCQkJc2VsZi0+Zl91bml2X25ld2xpbmUgPSAxOworICAgICAgICAgICAgICAgIHNlbGYtPmZfdW5pdl9uZXdsaW5lID0gMTsKICNlbmRpZgotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQlkZWZhdWx0OgotCQkJCWVycm9yID0gMTsKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoZXJyb3IpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAgImludmFsaWQgbW9kZSBjaGFyICVjIiwgKm1vZGUpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCW1vZGUrKzsKLQkJaWYgKCptb2RlID09ICdcMCcpCi0JCQlicmVhazsKLQl9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG1vZGUgY2hhciAlYyIsICptb2RlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtb2RlKys7CisgICAgICAgIGlmICgqbW9kZSA9PSAnXDAnKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogCi0JaWYgKG1vZGVfY2hhciA9PSAwKSB7Ci0JCW1vZGVfY2hhciA9ICdyJzsKLQl9CisgICAgaWYgKG1vZGVfY2hhciA9PSAwKSB7CisgICAgICAgIG1vZGVfY2hhciA9ICdyJzsKKyAgICB9CiAKLQltb2RlID0gKG1vZGVfY2hhciA9PSAncicpID8gInJiIiA6ICJ3YiI7CisgICAgbW9kZSA9IChtb2RlX2NoYXIgPT0gJ3InKSA/ICJyYiIgOiAid2IiOwogCi0Jc2VsZi0+ZmlsZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSZQeUZpbGVfVHlwZSwgIihPc2kpIiwKLQkJCQkJICAgbmFtZSwgbW9kZSwgYnVmZmVyaW5nKTsKLQlpZiAoc2VsZi0+ZmlsZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgc2VsZi0+ZmlsZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSZQeUZpbGVfVHlwZSwgIihPc2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1vZGUsIGJ1ZmZlcmluZyk7CisgICAgaWYgKHNlbGYtPmZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JLyogRnJvbSBub3cgb24sIHdlIGhhdmUgc3R1ZmYgdG8gZGVhbGxvYywgc28ganVtcCB0byBlcnJvciBsYWJlbAotCSAqIGluc3RlYWQgb2YgcmV0dXJuaW5nICovCisgICAgLyogRnJvbSBub3cgb24sIHdlIGhhdmUgc3R1ZmYgdG8gZGVhbGxvYywgc28ganVtcCB0byBlcnJvciBsYWJlbAorICAgICAqIGluc3RlYWQgb2YgcmV0dXJuaW5nICovCiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCXNlbGYtPmxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKCFzZWxmLT5sb2NrKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgInVuYWJsZSB0byBhbGxvY2F0ZSBsb2NrIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIHNlbGYtPmxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgaWYgKCFzZWxmLT5sb2NrKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgInVuYWJsZSB0byBhbGxvY2F0ZSBsb2NrIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogI2VuZGlmCiAKLQlpZiAobW9kZV9jaGFyID09ICdyJykKLQkJc2VsZi0+ZnAgPSBCWjJfYnpSZWFkT3BlbigmYnplcnJvciwKLQkJCQkJICBQeUZpbGVfQXNGaWxlKHNlbGYtPmZpbGUpLAotCQkJCQkgIDAsIDAsIE5VTEwsIDApOwotCWVsc2UKLQkJc2VsZi0+ZnAgPSBCWjJfYnpXcml0ZU9wZW4oJmJ6ZXJyb3IsCi0JCQkJCSAgIFB5RmlsZV9Bc0ZpbGUoc2VsZi0+ZmlsZSksCi0JCQkJCSAgIGNvbXByZXNzbGV2ZWwsIDAsIDApOworICAgIGlmIChtb2RlX2NoYXIgPT0gJ3InKQorICAgICAgICBzZWxmLT5mcCA9IEJaMl9ielJlYWRPcGVuKCZiemVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Bc0ZpbGUoc2VsZi0+ZmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgTlVMTCwgMCk7CisgICAgZWxzZQorICAgICAgICBzZWxmLT5mcCA9IEJaMl9ieldyaXRlT3BlbigmYnplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGaWxlX0FzRmlsZShzZWxmLT5maWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NsZXZlbCwgMCwgMCk7CiAKLQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCVB5RmlsZV9JbmNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7CisgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeUZpbGVfSW5jVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOwogCi0Jc2VsZi0+bW9kZSA9IChtb2RlX2NoYXIgPT0gJ3InKSA/IE1PREVfUkVBRCA6IE1PREVfV1JJVEU7CisgICAgc2VsZi0+bW9kZSA9IChtb2RlX2NoYXIgPT0gJ3InKSA/IE1PREVfUkVBRCA6IE1PREVfV1JJVEU7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIAogZXJyb3I6Ci0JUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+bG9jaykgewotCQlQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7Ci0JCXNlbGYtPmxvY2sgPSBOVUxMOwotCX0KKyAgICBpZiAoc2VsZi0+bG9jaykgeworICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CisgICAgICAgIHNlbGYtPmxvY2sgPSBOVUxMOworICAgIH0KICNlbmRpZgotCXJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyB2b2lkCiBCWjJGaWxlX2RlYWxsb2MoQloyRmlsZU9iamVjdCAqc2VsZikKIHsKLQlpbnQgYnplcnJvcjsKKyAgICBpbnQgYnplcnJvcjsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChzZWxmLT5sb2NrKQotCQlQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CisgICAgaWYgKHNlbGYtPmxvY2spCisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrKTsKICNlbmRpZgotCXN3aXRjaCAoc2VsZi0+bW9kZSkgewotCQljYXNlIE1PREVfUkVBRDoKLQkJY2FzZSBNT0RFX1JFQURfRU9GOgotCQkJQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNT0RFX1dSSVRFOgotCQkJQloyX2J6V3JpdGVDbG9zZSgmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJCSAwLCBOVUxMLCBOVUxMKTsKLQkJCWJyZWFrOwotCX0KLQlpZiAoc2VsZi0+ZnApIHsKLQkJUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQkJc2VsZi0+ZnAgPSBOVUxMOwotCX0KLQlVdGlsX0Ryb3BSZWFkQWhlYWQoc2VsZik7Ci0JUHlfWERFQ1JFRihzZWxmLT5maWxlKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIHN3aXRjaCAoc2VsZi0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfUkVBRDoKKyAgICAgICAgY2FzZSBNT0RFX1JFQURfRU9GOgorICAgICAgICAgICAgQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFX1dSSVRFOgorICAgICAgICAgICAgQloyX2J6V3JpdGVDbG9zZSgmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzZWxmLT5mcCkgeworICAgICAgICBQeUZpbGVfRGVjVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgICAgICBzZWxmLT5mcCA9IE5VTEw7CisgICAgfQorICAgIFV0aWxfRHJvcFJlYWRBaGVhZChzZWxmKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmZpbGUpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIC8qIFRoaXMgaXMgYSBoYWNrZWQgdmVyc2lvbiBvZiBQeXRob24ncyBmaWxlb2JqZWN0LmM6ZmlsZV9nZXRpdGVyKCkuICovCiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9nZXRpdGVyKEJaMkZpbGVPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm1vZGUgPT0gTU9ERV9DTE9TRUQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRigoUHlPYmplY3QqKXNlbGYpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIGlmIChzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRigoUHlPYmplY3QqKXNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiAvKiBUaGlzIGlzIGEgaGFja2VkIHZlcnNpb24gb2YgUHl0aG9uJ3MgZmlsZW9iamVjdC5jOmZpbGVfaXRlcm5leHQoKS4gKi8KQEAgLTE0OTAsMjEgKzE0OTAsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX2l0ZXJuZXh0KEJaMkZpbGVPYmplY3QgKnNlbGYpCiB7Ci0JUHlTdHJpbmdPYmplY3QqIHJldDsKLQlBQ1FVSVJFX0xPQ0soc2VsZik7Ci0JaWYgKHNlbGYtPm1vZGUgPT0gTU9ERV9DTE9TRUQpIHsKLSAgICAgICAgICAgICAgICBSRUxFQVNFX0xPQ0soc2VsZik7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXQgPSBVdGlsX1JlYWRBaGVhZEdldExpbmVTa2lwKHNlbGYsIDAsIFJFQURBSEVBRF9CVUZTSVpFKTsKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JaWYgKHJldCA9PSBOVUxMIHx8IFB5U3RyaW5nX0dFVF9TSVpFKHJldCkgPT0gMCkgewotCQlQeV9YREVDUkVGKHJldCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcmV0OworICAgIFB5U3RyaW5nT2JqZWN0KiByZXQ7CisgICAgQUNRVUlSRV9MT0NLKHNlbGYpOworICAgIGlmIChzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKSB7CisgICAgICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0ID0gVXRpbF9SZWFkQWhlYWRHZXRMaW5lU2tpcChzZWxmLCAwLCBSRUFEQUhFQURfQlVGU0laRSk7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIGlmIChyZXQgPT0gTlVMTCB8fCBQeVN0cmluZ19HRVRfU0laRShyZXQpID09IDApIHsKKyAgICAgICAgUHlfWERFQ1JFRihyZXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJldDsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCkBAIC0xNTMyLDQ2ICsxNTMyLDQ2IEBACiA7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQloyRmlsZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJiejIuQloyRmlsZSIsCQkvKnRwX25hbWUqLwotCXNpemVvZihCWjJGaWxlT2JqZWN0KSwJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JKGRlc3RydWN0b3IpQloyRmlsZV9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JMCwJCQkvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwotICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KLSAgICAgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsLyp0cF9zZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KLSAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLwotICAgICAgICBCWjJGaWxlX19kb2NfXywgICAgICAgICAvKnRwX2RvYyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotICAgICAgICAoZ2V0aXRlcmZ1bmMpQloyRmlsZV9nZXRpdGVyLCAvKnRwX2l0ZXIqLwotICAgICAgICAoaXRlcm5leHRmdW5jKUJaMkZpbGVfaXRlcm5leHQsIC8qdHBfaXRlcm5leHQqLwotICAgICAgICBCWjJGaWxlX21ldGhvZHMsICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICBCWjJGaWxlX21lbWJlcnMsICAgICAgICAvKnRwX21lbWJlcnMqLwotICAgICAgICBCWjJGaWxlX2dldHNldCwgICAgICAgICAvKnRwX2dldHNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwotICAgICAgICAoaW5pdHByb2MpQloyRmlsZV9pbml0LCAvKnRwX2luaXQqLwotICAgICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAvKnRwX2FsbG9jKi8KLSAgICAgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgLyp0cF9uZXcqLwotICAgICAgCV9QeU9iamVjdF9EZWwsICAgICAgICAgIC8qdHBfZnJlZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJiejIuQloyRmlsZSIsICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihCWjJGaWxlT2JqZWN0KSwgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKUJaMkZpbGVfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKnRwX2ZsYWdzKi8KKyAgICBCWjJGaWxlX19kb2NfXywgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgKGdldGl0ZXJmdW5jKUJaMkZpbGVfZ2V0aXRlciwgLyp0cF9pdGVyKi8KKyAgICAoaXRlcm5leHRmdW5jKUJaMkZpbGVfaXRlcm5leHQsIC8qdHBfaXRlcm5leHQqLworICAgIEJaMkZpbGVfbWV0aG9kcywgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgQloyRmlsZV9tZW1iZXJzLCAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICBCWjJGaWxlX2dldHNldCwgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAoaW5pdHByb2MpQloyRmlsZV9pbml0LCAvKnRwX2luaXQqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgIC8qdHBfYWxsb2MqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgIC8qdHBfbmV3Ki8KKyAgICBfUHlPYmplY3RfRGVsLCAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLwogfTsKIAogCkBAIC0xNTkwLDc2ICsxNTkwLDc2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyQ29tcF9jb21wcmVzcyhCWjJDb21wT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGRhdGE7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YXNpemU7Ci0JaW50IGJ1ZnNpemUgPSBTTUFMTENIVU5LOwotCVBZX0xPTkdfTE9ORyB0b3RhbG91dDsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQliel9zdHJlYW0gKmJ6cyA9ICZzZWxmLT5ienM7Ci0JaW50IGJ6ZXJyb3I7CisgICAgUHlfYnVmZmVyIHBkYXRhOworICAgIGNoYXIgKmRhdGE7CisgICAgaW50IGRhdGFzaXplOworICAgIGludCBidWZzaXplID0gU01BTExDSFVOSzsKKyAgICBQWV9MT05HX0xPTkcgdG90YWxvdXQ7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgYnpfc3RyZWFtICpienMgPSAmc2VsZi0+YnpzOworICAgIGludCBiemVycm9yOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpjb21wcmVzcyIsICZwZGF0YSkpCi0JCXJldHVybiBOVUxMOwotCWRhdGEgPSBwZGF0YS5idWY7Ci0JZGF0YXNpemUgPSBwZGF0YS5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpjb21wcmVzcyIsICZwZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGEgPSBwZGF0YS5idWY7CisgICAgZGF0YXNpemUgPSBwZGF0YS5sZW47CiAKLQlpZiAoZGF0YXNpemUgPT0gMCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQl9CisgICAgaWYgKGRhdGFzaXplID09IDApIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgfQogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCWlmICghc2VsZi0+cnVubmluZykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkidGhpcyBvYmplY3Qgd2FzIGFscmVhZHkgZmx1c2hlZCIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgaWYgKCFzZWxmLT5ydW5uaW5nKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgb2JqZWN0IHdhcyBhbHJlYWR5IGZsdXNoZWQiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKLQlpZiAoIXJldCkKLQkJZ290byBlcnJvcjsKKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWJ6cy0+bmV4dF9pbiA9IGRhdGE7Ci0JYnpzLT5hdmFpbF9pbiA9IGRhdGFzaXplOwotCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLQlienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CisgICAgYnpzLT5uZXh0X2luID0gZGF0YTsKKyAgICBienMtPmF2YWlsX2luID0gZGF0YXNpemU7CisgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOworICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZTsKIAotCXRvdGFsb3V0ID0gQlpTX1RPVEFMX09VVChienMpOworICAgIHRvdGFsb3V0ID0gQlpTX1RPVEFMX09VVChienMpOwogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzcyhienMsIEJaX1JVTik7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChiemVycm9yICE9IEJaX1JVTl9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlpZiAoYnpzLT5hdmFpbF9pbiA9PSAwKQotCQkJYnJlYWs7IC8qIG5vIG1vcmUgaW5wdXQgZGF0YSAqLwotCQlpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgewotCQkJYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkgewotCQkJCUJaMl9iekNvbXByZXNzRW5kKGJ6cyk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIChCWlNfVE9UQUxfT1VUKGJ6cykKLQkJCQkJCSAgICAtIHRvdGFsb3V0KTsKLQkJCWJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOwotCQl9Ci0JfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBiemVycm9yID0gQloyX2J6Q29tcHJlc3MoYnpzLCBCWl9SVU4pOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAoYnplcnJvciAhPSBCWl9SVU5fT0spIHsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfaW4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOyAvKiBubyBtb3JlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKKyAgICAgICAgICAgICAgICBCWjJfYnpDb21wcmVzc0VuZChienMpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyAoQlpTX1RPVEFMX09VVChienMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0b3RhbG91dCk7CisgICAgICAgICAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemUgLSAoYnpzLT5uZXh0X291dCAtIEJVRihyZXQpKTsKKyAgICAgICAgfQorICAgIH0KIAotCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdCkoQlpTX1RPVEFMX09VVChienMpIC0gdG90YWxvdXQpKTsKIAotCVJFTEVBU0VfTE9DSyhzZWxmKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JcmV0dXJuIHJldDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIHJldHVybiByZXQ7CiAKIGVycm9yOgotCVJFTEVBU0VfTE9DSyhzZWxmKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JUHlfWERFQ1JFRihyZXQpOwotCXJldHVybiBOVUxMOworICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgUHlfWERFQ1JFRihyZXQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoQloyQ29tcF9mbHVzaF9fZG9jX18sCkBAIC0xNjcyLDY4ICsxNjcyLDY4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyQ29tcF9mbHVzaChCWjJDb21wT2JqZWN0ICpzZWxmKQogewotCWludCBidWZzaXplID0gU01BTExDSFVOSzsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQliel9zdHJlYW0gKmJ6cyA9ICZzZWxmLT5ienM7Ci0JUFlfTE9OR19MT05HIHRvdGFsb3V0OwotCWludCBiemVycm9yOworICAgIGludCBidWZzaXplID0gU01BTExDSFVOSzsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBiel9zdHJlYW0gKmJ6cyA9ICZzZWxmLT5ienM7CisgICAgUFlfTE9OR19MT05HIHRvdGFsb3V0OworICAgIGludCBiemVycm9yOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCWlmICghc2VsZi0+cnVubmluZykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm9iamVjdCB3YXMgYWxyZWFkeSAiCi0JCQkJCQkgICJmbHVzaGVkIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXNlbGYtPnJ1bm5pbmcgPSAwOworICAgIEFDUVVJUkVfTE9DSyhzZWxmKTsKKyAgICBpZiAoIXNlbGYtPnJ1bm5pbmcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvYmplY3Qgd2FzIGFscmVhZHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsdXNoZWQiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cnVubmluZyA9IDA7CiAKLQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKLQlpZiAoIXJldCkKLQkJZ290byBlcnJvcjsKKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLQlienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CisgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOworICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZTsKIAotCXRvdGFsb3V0ID0gQlpTX1RPVEFMX09VVChienMpOworICAgIHRvdGFsb3V0ID0gQlpTX1RPVEFMX09VVChienMpOwogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzcyhienMsIEJaX0ZJTklTSCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfRklOSVNIX09LKSB7Ci0JCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWlmIChienMtPmF2YWlsX291dCA9PSAwKSB7Ci0JCQlidWZzaXplID0gVXRpbF9OZXdCdWZmZXJTaXplKGJ1ZnNpemUpOwotCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldCwgYnVmc2l6ZSkgPCAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQlienMtPm5leHRfb3V0ID0gQlVGKHJldCk7Ci0JCQlienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyAoQlpTX1RPVEFMX09VVChienMpCi0JCQkJCQkgICAgLSB0b3RhbG91dCk7Ci0JCQlienMtPmF2YWlsX291dCA9IGJ1ZnNpemUgLSAoYnpzLT5uZXh0X291dCAtIEJVRihyZXQpKTsKLQkJfQotCX0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgYnplcnJvciA9IEJaMl9iekNvbXByZXNzKGJ6cywgQlpfRklOSVNIKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9GSU5JU0hfT0spIHsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKKyAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIChCWlNfVE9UQUxfT1VUKGJ6cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRvdGFsb3V0KTsKKyAgICAgICAgICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CisgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CiAKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JcmV0dXJuIHJldDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgcmV0dXJuIHJldDsKIAogZXJyb3I6Ci0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCVB5X1hERUNSRUYocmV0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgUHlfWERFQ1JFRihyZXQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQloyQ29tcF9tZXRob2RzW10gPSB7Ci0JeyJjb21wcmVzcyIsIChQeUNGdW5jdGlvbilCWjJDb21wX2NvbXByZXNzLCBNRVRIX1ZBUkFSR1MsCi0JIEJaMkNvbXBfY29tcHJlc3NfX2RvY19ffSwKLQl7ImZsdXNoIiwgKFB5Q0Z1bmN0aW9uKUJaMkNvbXBfZmx1c2gsIE1FVEhfTk9BUkdTLAotCSBCWjJDb21wX2ZsdXNoX19kb2NfX30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKUJaMkNvbXBfY29tcHJlc3MsIE1FVEhfVkFSQVJHUywKKyAgICAgQloyQ29tcF9jb21wcmVzc19fZG9jX199LAorICAgIHsiZmx1c2giLCAoUHlDRnVuY3Rpb24pQloyQ29tcF9mbHVzaCwgTUVUSF9OT0FSR1MsCisgICAgIEJaMkNvbXBfZmx1c2hfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0xNzQzLDU3ICsxNzQzLDU3IEBACiBzdGF0aWMgaW50CiBCWjJDb21wX2luaXQoQloyQ29tcE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JaW50IGNvbXByZXNzbGV2ZWwgPSA5OwotCWludCBiemVycm9yOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiY29tcHJlc3NsZXZlbCIsIDB9OworICAgIGludCBjb21wcmVzc2xldmVsID0gOTsKKyAgICBpbnQgYnplcnJvcjsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImNvbXByZXNzbGV2ZWwiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpOkJaMkNvbXByZXNzb3IiLAotCQkJCQkga3dsaXN0LCAmY29tcHJlc3NsZXZlbCkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8aTpCWjJDb21wcmVzc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZjb21wcmVzc2xldmVsKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKGNvbXByZXNzbGV2ZWwgPCAxIHx8IGNvbXByZXNzbGV2ZWwgPiA5KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjb21wcmVzc2xldmVsIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5Iik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGlmIChjb21wcmVzc2xldmVsIDwgMSB8fCBjb21wcmVzc2xldmVsID4gOSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2xldmVsIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5Iik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmICghc2VsZi0+bG9jaykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmICghc2VsZi0+bG9jaykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KICNlbmRpZgogCi0JbWVtc2V0KCZzZWxmLT5ienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKLQliemVycm9yID0gQloyX2J6Q29tcHJlc3NJbml0KCZzZWxmLT5ienMsIGNvbXByZXNzbGV2ZWwsIDAsIDApOwotCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgbWVtc2V0KCZzZWxmLT5ienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKKyAgICBiemVycm9yID0gQloyX2J6Q29tcHJlc3NJbml0KCZzZWxmLT5ienMsIGNvbXByZXNzbGV2ZWwsIDAsIDApOworICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlzZWxmLT5ydW5uaW5nID0gMTsKKyAgICBzZWxmLT5ydW5uaW5nID0gMTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogZXJyb3I6CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+bG9jaykgewotCQlQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7Ci0JCXNlbGYtPmxvY2sgPSBOVUxMOwotCX0KKyAgICBpZiAoc2VsZi0+bG9jaykgeworICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CisgICAgICAgIHNlbGYtPmxvY2sgPSBOVUxMOworICAgIH0KICNlbmRpZgotCXJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyB2b2lkCiBCWjJDb21wX2RlYWxsb2MoQloyQ29tcE9iamVjdCAqc2VsZikKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChzZWxmLT5sb2NrKQotCQlQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CisgICAgaWYgKHNlbGYtPmxvY2spCisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrKTsKICNlbmRpZgotCUJaMl9iekNvbXByZXNzRW5kKCZzZWxmLT5ienMpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgQloyX2J6Q29tcHJlc3NFbmQoJnNlbGYtPmJ6cyk7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogCkBAIC0xODEwLDQ2ICsxODEwLDQ2IEBACiAiKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBCWjJDb21wX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImJ6Mi5CWjJDb21wcmVzc29yIiwJLyp0cF9uYW1lKi8KLQlzaXplb2YoQloyQ29tcE9iamVjdCksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCShkZXN0cnVjdG9yKUJaMkNvbXBfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCTAsCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KLSAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCi0gICAgICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLC8qdHBfc2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0gICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKnRwX2ZsYWdzKi8KLSAgICAgICAgQloyQ29tcF9fZG9jX18sICAgICAgICAgLyp0cF9kb2MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCi0gICAgICAgIEJaMkNvbXBfbWV0aG9kcywgICAgICAgIC8qdHBfbWV0aG9kcyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCi0gICAgICAgIChpbml0cHJvYylCWjJDb21wX2luaXQsIC8qdHBfaW5pdCovCi0gICAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgIC8qdHBfYWxsb2MqLwotICAgICAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAvKnRwX25ldyovCi0gICAgICAJX1B5T2JqZWN0X0RlbCwgICAgICAgICAgLyp0cF9mcmVlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImJ6Mi5CWjJDb21wcmVzc29yIiwgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEJaMkNvbXBPYmplY3QpLCAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpQloyQ29tcF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLworICAgIEJaMkNvbXBfX2RvY19fLCAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIEJaMkNvbXBfbWV0aG9kcywgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAoaW5pdHByb2MpQloyQ29tcF9pbml0LCAvKnRwX2luaXQqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgIC8qdHBfYWxsb2MqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgIC8qdHBfbmV3Ki8KKyAgICBfUHlPYmplY3RfRGVsLCAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLwogfTsKIAogCkBAIC0xODYwLDggKzE4NjAsOCBAQAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoQloyRGVjb21wT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgQloyRGVjb21wX21lbWJlcnNbXSA9IHsKLQl7InVudXNlZF9kYXRhIiwgVF9PQkpFQ1QsIE9GRih1bnVzZWRfZGF0YSksIFJPfSwKLQl7TlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7InVudXNlZF9kYXRhIiwgVF9PQkpFQ1QsIE9GRih1bnVzZWRfZGF0YSksIFJPfSwKKyAgICB7TlVMTH0gICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogCkBAIC0xODgxLDg4ICsxODgxLDg4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRGVjb21wX2RlY29tcHJlc3MoQloyRGVjb21wT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGRhdGE7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YXNpemU7Ci0JaW50IGJ1ZnNpemUgPSBTTUFMTENIVU5LOwotCVBZX0xPTkdfTE9ORyB0b3RhbG91dDsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQliel9zdHJlYW0gKmJ6cyA9ICZzZWxmLT5ienM7Ci0JaW50IGJ6ZXJyb3I7CisgICAgUHlfYnVmZmVyIHBkYXRhOworICAgIGNoYXIgKmRhdGE7CisgICAgaW50IGRhdGFzaXplOworICAgIGludCBidWZzaXplID0gU01BTExDSFVOSzsKKyAgICBQWV9MT05HX0xPTkcgdG90YWxvdXQ7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgYnpfc3RyZWFtICpienMgPSAmc2VsZi0+YnpzOworICAgIGludCBiemVycm9yOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpkZWNvbXByZXNzIiwgJnBkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YSA9IHBkYXRhLmJ1ZjsKLQlkYXRhc2l6ZSA9IHBkYXRhLmxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOmRlY29tcHJlc3MiLCAmcGRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gcGRhdGEuYnVmOworICAgIGRhdGFzaXplID0gcGRhdGEubGVuOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCWlmICghc2VsZi0+cnVubmluZykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsICJlbmQgb2Ygc3RyZWFtIHdhcyAiCi0JCQkJCQkiYWxyZWFkeSBmb3VuZCIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgaWYgKCFzZWxmLT5ydW5uaW5nKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwgImVuZCBvZiBzdHJlYW0gd2FzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxyZWFkeSBmb3VuZCIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCXJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZnNpemUpOwotCWlmICghcmV0KQotCQlnb3RvIGVycm9yOworICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZnNpemUpOworICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIGVycm9yOwogCi0JYnpzLT5uZXh0X2luID0gZGF0YTsKLQlienMtPmF2YWlsX2luID0gZGF0YXNpemU7Ci0JYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOwotCWJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZTsKKyAgICBienMtPm5leHRfaW4gPSBkYXRhOworICAgIGJ6cy0+YXZhaWxfaW4gPSBkYXRhc2l6ZTsKKyAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCk7CisgICAgYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplOwogCi0JdG90YWxvdXQgPSBCWlNfVE9UQUxfT1VUKGJ6cyk7CisgICAgdG90YWxvdXQgPSBCWlNfVE9UQUxfT1VUKGJ6cyk7CiAKLQlmb3IgKDs7KSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJYnplcnJvciA9IEJaMl9iekRlY29tcHJlc3MoYnpzKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewotCQkJaWYgKGJ6cy0+YXZhaWxfaW4gIT0gMCkgewotCQkJCVB5X0RFQ1JFRihzZWxmLT51bnVzZWRfZGF0YSk7Ci0JCQkJc2VsZi0+dW51c2VkX2RhdGEgPQotCQkJCSAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShienMtPm5leHRfaW4sCi0JCQkJCQkJICAgICAgIGJ6cy0+YXZhaWxfaW4pOwotCQkJfQotCQkJc2VsZi0+cnVubmluZyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlpZiAoYnpzLT5hdmFpbF9pbiA9PSAwKQotCQkJYnJlYWs7IC8qIG5vIG1vcmUgaW5wdXQgZGF0YSAqLwotCQlpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgewotCQkJYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkgewotCQkJCUJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOwotCQkJYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgKEJaU19UT1RBTF9PVVQoYnpzKQotCQkJCQkJICAgIC0gdG90YWxvdXQpOwotCQkJYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7Ci0JCX0KLQl9CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzKGJ6cyk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGlmIChienMtPmF2YWlsX2luICE9IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOworICAgICAgICAgICAgICAgIHNlbGYtPnVudXNlZF9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnpzLT5uZXh0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBienMtPmF2YWlsX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbGYtPnJ1bm5pbmcgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfaW4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOyAvKiBubyBtb3JlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKKyAgICAgICAgICAgICAgICBCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKKyAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIChCWlNfVE9UQUxfT1VUKGJ6cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRvdGFsb3V0KTsKKyAgICAgICAgICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CisgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CiAKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCXJldHVybiByZXQ7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICByZXR1cm4gcmV0OwogCiBlcnJvcjoKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCVB5X1hERUNSRUYocmV0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIFB5X1hERUNSRUYocmV0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEJaMkRlY29tcF9tZXRob2RzW10gPSB7Ci0JeyJkZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKUJaMkRlY29tcF9kZWNvbXByZXNzLCBNRVRIX1ZBUkFSR1MsIEJaMkRlY29tcF9kZWNvbXByZXNzX19kb2NfX30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImRlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pQloyRGVjb21wX2RlY29tcHJlc3MsIE1FVEhfVkFSQVJHUywgQloyRGVjb21wX2RlY29tcHJlc3NfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0xOTcyLDU1ICsxOTcyLDU1IEBACiBzdGF0aWMgaW50CiBCWjJEZWNvbXBfaW5pdChCWjJEZWNvbXBPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCWludCBiemVycm9yOworICAgIGludCBiemVycm9yOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6QloyRGVjb21wcmVzc29yIikpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpCWjJEZWNvbXByZXNzb3IiKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmICghc2VsZi0+bG9jaykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmICghc2VsZi0+bG9jaykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KICNlbmRpZgogCi0Jc2VsZi0+dW51c2VkX2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQlpZiAoIXNlbGYtPnVudXNlZF9kYXRhKQotCQlnb3RvIGVycm9yOworICAgIHNlbGYtPnVudXNlZF9kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgaWYgKCFzZWxmLT51bnVzZWRfZGF0YSkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCW1lbXNldCgmc2VsZi0+YnpzLCAwLCBzaXplb2YoYnpfc3RyZWFtKSk7Ci0JYnplcnJvciA9IEJaMl9iekRlY29tcHJlc3NJbml0KCZzZWxmLT5ienMsIDAsIDApOwotCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgbWVtc2V0KCZzZWxmLT5ienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKKyAgICBiemVycm9yID0gQloyX2J6RGVjb21wcmVzc0luaXQoJnNlbGYtPmJ6cywgMCwgMCk7CisgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCXNlbGYtPnJ1bm5pbmcgPSAxOworICAgIHNlbGYtPnJ1bm5pbmcgPSAxOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKIGVycm9yOgogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPmxvY2spIHsKLQkJUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOwotCQlzZWxmLT5sb2NrID0gTlVMTDsKLQl9CisgICAgaWYgKHNlbGYtPmxvY2spIHsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOworICAgICAgICBzZWxmLT5sb2NrID0gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlQeV9DTEVBUihzZWxmLT51bnVzZWRfZGF0YSk7Ci0JcmV0dXJuIC0xOworICAgIFB5X0NMRUFSKHNlbGYtPnVudXNlZF9kYXRhKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyB2b2lkCiBCWjJEZWNvbXBfZGVhbGxvYyhCWjJEZWNvbXBPYmplY3QgKnNlbGYpCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+bG9jaykKLQkJUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOworICAgIGlmIChzZWxmLT5sb2NrKQorICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CiAjZW5kaWYKLQlQeV9YREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKLQlCWjJfYnpEZWNvbXByZXNzRW5kKCZzZWxmLT5ienMpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT51bnVzZWRfZGF0YSk7CisgICAgQloyX2J6RGVjb21wcmVzc0VuZCgmc2VsZi0+YnpzKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiAKQEAgLTIwMzYsNDYgKzIwMzYsNDYgQEAKICIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEJaMkRlY29tcF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJiejIuQloyRGVjb21wcmVzc29yIiwJLyp0cF9uYW1lKi8KLQlzaXplb2YoQloyRGVjb21wT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JKGRlc3RydWN0b3IpQloyRGVjb21wX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkwLAkJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCi0gICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwotICAgICAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCi0gICAgICAgIEJaMkRlY29tcF9fZG9jX18sICAgICAgIC8qdHBfZG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwotICAgICAgICBCWjJEZWNvbXBfbWV0aG9kcywgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICBCWjJEZWNvbXBfbWVtYmVycywgICAgICAvKnRwX21lbWJlcnMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwotICAgICAgICAoaW5pdHByb2MpQloyRGVjb21wX2luaXQsIC8qdHBfaW5pdCovCi0gICAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgIC8qdHBfYWxsb2MqLwotICAgICAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAvKnRwX25ldyovCi0gICAgICAJX1B5T2JqZWN0X0RlbCwgICAgICAgICAgLyp0cF9mcmVlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImJ6Mi5CWjJEZWNvbXByZXNzb3IiLCAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEJaMkRlY29tcE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpQloyRGVjb21wX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCisgICAgQloyRGVjb21wX19kb2NfXywgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgQloyRGVjb21wX21ldGhvZHMsICAgICAgLyp0cF9tZXRob2RzKi8KKyAgICBCWjJEZWNvbXBfbWVtYmVycywgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIChpbml0cHJvYylCWjJEZWNvbXBfaW5pdCwgLyp0cF9pbml0Ki8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAvKnRwX2FsbG9jKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAvKnRwX25ldyovCisgICAgX1B5T2JqZWN0X0RlbCwgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAKIApAQCAtMjA5Myw4OCArMjA5Myw4OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ6Ml9jb21wcmVzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JaW50IGNvbXByZXNzbGV2ZWw9OTsKLQlQeV9idWZmZXIgcGRhdGE7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YXNpemU7Ci0JaW50IGJ1ZnNpemU7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JYnpfc3RyZWFtIF9ienM7Ci0JYnpfc3RyZWFtICpienMgPSAmX2J6czsKLQlpbnQgYnplcnJvcjsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGEiLCAiY29tcHJlc3NsZXZlbCIsIDB9OworICAgIGludCBjb21wcmVzc2xldmVsPTk7CisgICAgUHlfYnVmZmVyIHBkYXRhOworICAgIGNoYXIgKmRhdGE7CisgICAgaW50IGRhdGFzaXplOworICAgIGludCBidWZzaXplOworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIGJ6X3N0cmVhbSBfYnpzOworICAgIGJ6X3N0cmVhbSAqYnpzID0gJl9ienM7CisgICAgaW50IGJ6ZXJyb3I7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhIiwgImNvbXByZXNzbGV2ZWwiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMqfGkiLAotCQkJCQkga3dsaXN0LCAmcGRhdGEsCi0JCQkJCSAmY29tcHJlc3NsZXZlbCkpCi0JCXJldHVybiBOVUxMOwotCWRhdGEgPSBwZGF0YS5idWY7Ci0JZGF0YXNpemUgPSBwZGF0YS5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyp8aSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmcGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzbGV2ZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gcGRhdGEuYnVmOworICAgIGRhdGFzaXplID0gcGRhdGEubGVuOwogCi0JaWYgKGNvbXByZXNzbGV2ZWwgPCAxIHx8IGNvbXByZXNzbGV2ZWwgPiA5KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjb21wcmVzc2xldmVsIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5Iik7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChjb21wcmVzc2xldmVsIDwgMSB8fCBjb21wcmVzc2xldmVsID4gOSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2xldmVsIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5Iik7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ29uZm9ybWluZyB0byBiejIgbWFudWFsLCB0aGlzIGlzIGxhcmdlIGVub3VnaCB0byBmaXQgY29tcHJlc3NlZAotCSAqIGRhdGEgaW4gb25lIHNob3QuIFdlIHdpbGwgY2hlY2sgaXQgbGF0ZXIgYW55d2F5LiAqLwotCWJ1ZnNpemUgPSBkYXRhc2l6ZSArIChkYXRhc2l6ZS8xMDArMSkgKyA2MDA7CisgICAgLyogQ29uZm9ybWluZyB0byBiejIgbWFudWFsLCB0aGlzIGlzIGxhcmdlIGVub3VnaCB0byBmaXQgY29tcHJlc3NlZAorICAgICAqIGRhdGEgaW4gb25lIHNob3QuIFdlIHdpbGwgY2hlY2sgaXQgbGF0ZXIgYW55d2F5LiAqLworICAgIGJ1ZnNpemUgPSBkYXRhc2l6ZSArIChkYXRhc2l6ZS8xMDArMSkgKyA2MDA7CiAKLQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKLQlpZiAoIXJldCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW1lbXNldChienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKKyAgICBtZW1zZXQoYnpzLCAwLCBzaXplb2YoYnpfc3RyZWFtKSk7CiAKLQlienMtPm5leHRfaW4gPSBkYXRhOwotCWJ6cy0+YXZhaWxfaW4gPSBkYXRhc2l6ZTsKLQlienMtPm5leHRfb3V0ID0gQlVGKHJldCk7Ci0JYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplOworICAgIGJ6cy0+bmV4dF9pbiA9IGRhdGE7CisgICAgYnpzLT5hdmFpbF9pbiA9IGRhdGFzaXplOworICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKKyAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CiAKLQliemVycm9yID0gQloyX2J6Q29tcHJlc3NJbml0KGJ6cywgY29tcHJlc3NsZXZlbCwgMCwgMCk7Ci0JaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCVB5X0RFQ1JFRihyZXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYnplcnJvciA9IEJaMl9iekNvbXByZXNzSW5pdChienMsIGNvbXByZXNzbGV2ZWwsIDAsIDApOworICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICBQeV9ERUNSRUYocmV0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzcyhienMsIEJaX0ZJTklTSCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfRklOSVNIX09LKSB7Ci0JCQlCWjJfYnpDb21wcmVzc0VuZChienMpOwotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQkJUHlfREVDUkVGKHJldCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgewotCQkJYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkgewotCQkJCUJaMl9iekNvbXByZXNzRW5kKGJ6cyk7Ci0JCQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQkJCVB5X0RFQ1JFRihyZXQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgQlpTX1RPVEFMX09VVChienMpOwotCQkJYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7Ci0JCX0KLQl9CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzcyhienMsIEJaX0ZJTklTSCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfRklOSVNIX09LKSB7CisgICAgICAgICAgICBCWjJfYnpDb21wcmVzc0VuZChienMpOworICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKKyAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkgeworICAgICAgICAgICAgICAgIEJaMl9iekNvbXByZXNzRW5kKGJ6cyk7CisgICAgICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgQlpTX1RPVEFMX09VVChienMpOworICAgICAgICAgICAgYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoYnpzLT5hdmFpbF9vdXQgIT0gMCkKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdClCWlNfVE9UQUxfT1VUKGJ6cykpOwotCUJaMl9iekNvbXByZXNzRW5kKGJ6cyk7CisgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpQlpTX1RPVEFMX09VVChienMpKTsKKyAgICBCWjJfYnpDb21wcmVzc0VuZChienMpOwogCi0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCXJldHVybiByZXQ7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihiejJfZGVjb21wcmVzc19fZG9jX18sCkBAIC0yMTg3LDk0ICsyMTg3LDk0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnoyX2RlY29tcHJlc3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwZGF0YTsKLQljaGFyICpkYXRhOwotCWludCBkYXRhc2l6ZTsKLQlpbnQgYnVmc2l6ZSA9IFNNQUxMQ0hVTks7Ci0JUHlPYmplY3QgKnJldDsKLQliel9zdHJlYW0gX2J6czsKLQliel9zdHJlYW0gKmJ6cyA9ICZfYnpzOwotCWludCBiemVycm9yOworICAgIFB5X2J1ZmZlciBwZGF0YTsKKyAgICBjaGFyICpkYXRhOworICAgIGludCBkYXRhc2l6ZTsKKyAgICBpbnQgYnVmc2l6ZSA9IFNNQUxMQ0hVTks7CisgICAgUHlPYmplY3QgKnJldDsKKyAgICBiel9zdHJlYW0gX2J6czsKKyAgICBiel9zdHJlYW0gKmJ6cyA9ICZfYnpzOworICAgIGludCBiemVycm9yOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpkZWNvbXByZXNzIiwgJnBkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YSA9IHBkYXRhLmJ1ZjsKLQlkYXRhc2l6ZSA9IHBkYXRhLmxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOmRlY29tcHJlc3MiLCAmcGRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gcGRhdGEuYnVmOworICAgIGRhdGFzaXplID0gcGRhdGEubGVuOwogCi0JaWYgKGRhdGFzaXplID09IDApIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JfQorICAgIGlmIChkYXRhc2l6ZSA9PSAwKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIH0KIAotCXJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZnNpemUpOwotCWlmICghcmV0KSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZnNpemUpOworICAgIGlmICghcmV0KSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbWVtc2V0KGJ6cywgMCwgc2l6ZW9mKGJ6X3N0cmVhbSkpOworICAgIG1lbXNldChienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKIAotCWJ6cy0+bmV4dF9pbiA9IGRhdGE7Ci0JYnpzLT5hdmFpbF9pbiA9IGRhdGFzaXplOwotCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLQlienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CisgICAgYnpzLT5uZXh0X2luID0gZGF0YTsKKyAgICBienMtPmF2YWlsX2luID0gZGF0YXNpemU7CisgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOworICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZTsKIAotCWJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzSW5pdChienMsIDAsIDApOwotCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJUHlfREVDUkVGKHJldCk7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzSW5pdChienMsIDAsIDApOworICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzKGJ6cyk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCUJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJCVB5X0RFQ1JFRihyZXQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGJ6cy0+YXZhaWxfaW4gPT0gMCkgewotCQkJQloyX2J6RGVjb21wcmVzc0VuZChienMpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJjb3VsZG4ndCBmaW5kIGVuZCBvZiBzdHJlYW0iKTsKLQkJCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJCVB5X0RFQ1JFRihyZXQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKLQkJCWJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7Ci0JCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKLQkJCQlCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7Ci0JCQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQkJCVB5X0RFQ1JFRihyZXQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgQlpTX1RPVEFMX09VVChienMpOwotCQkJYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7Ci0JCX0KLQl9CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzKGJ6cyk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgIEJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfaW4gPT0gMCkgeworICAgICAgICAgICAgQloyX2J6RGVjb21wcmVzc0VuZChienMpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkbid0IGZpbmQgZW5kIG9mIHN0cmVhbSIpOworICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKKyAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkgeworICAgICAgICAgICAgICAgIEJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyBCWlNfVE9UQUxfT1VUKGJ6cyk7CisgICAgICAgICAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemUgLSAoYnpzLT5uZXh0X291dCAtIEJVRihyZXQpKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChienMtPmF2YWlsX291dCAhPSAwKQotCQlfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KUJaU19UT1RBTF9PVVQoYnpzKSk7Ci0JQloyX2J6RGVjb21wcmVzc0VuZChienMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICBpZiAoYnpzLT5hdmFpbF9vdXQgIT0gMCkKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdClCWlNfVE9UQUxfT1VUKGJ6cykpOworICAgIEJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CiAKLQlyZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBiejJfbWV0aG9kc1tdID0gewotCXsiY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pIGJ6Ml9jb21wcmVzcywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCi0JCWJ6Ml9jb21wcmVzc19fZG9jX199LAotCXsiZGVjb21wcmVzcyIsIChQeUNGdW5jdGlvbikgYnoyX2RlY29tcHJlc3MsIE1FVEhfVkFSQVJHUywKLQkJYnoyX2RlY29tcHJlc3NfX2RvY19ffSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pIGJ6Ml9jb21wcmVzcywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgICAgIGJ6Ml9jb21wcmVzc19fZG9jX199LAorICAgIHsiZGVjb21wcmVzcyIsIChQeUNGdW5jdGlvbikgYnoyX2RlY29tcHJlc3MsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgYnoyX2RlY29tcHJlc3NfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCkBAIC0yMjkwLDI0ICsyMjkwLDI0IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdGJ6Mih2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JUHlfVFlQRSgmQloyRmlsZV9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKLQlQeV9UWVBFKCZCWjJDb21wX1R5cGUpID0gJlB5VHlwZV9UeXBlOwotCVB5X1RZUEUoJkJaMkRlY29tcF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeV9UWVBFKCZCWjJGaWxlX1R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIFB5X1RZUEUoJkJaMkNvbXBfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfVFlQRSgmQloyRGVjb21wX1R5cGUpID0gJlB5VHlwZV9UeXBlOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJiejIiLCBiejJfbWV0aG9kcywgYnoyX19kb2NfXyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiYnoyIiwgYnoyX21ldGhvZHMsIGJ6Ml9fZG9jX18pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX19hdXRob3JfXyIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoX19hdXRob3JfXykpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiX19hdXRob3JfXyIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoX19hdXRob3JfXykpOwogCi0JUHlfSU5DUkVGKCZCWjJGaWxlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQloyRmlsZSIsIChQeU9iamVjdCAqKSZCWjJGaWxlX1R5cGUpOworICAgIFB5X0lOQ1JFRigmQloyRmlsZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJaMkZpbGUiLCAoUHlPYmplY3QgKikmQloyRmlsZV9UeXBlKTsKIAotCVB5X0lOQ1JFRigmQloyQ29tcF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJaMkNvbXByZXNzb3IiLCAoUHlPYmplY3QgKikmQloyQ29tcF9UeXBlKTsKKyAgICBQeV9JTkNSRUYoJkJaMkNvbXBfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCWjJDb21wcmVzc29yIiwgKFB5T2JqZWN0ICopJkJaMkNvbXBfVHlwZSk7CiAKLQlQeV9JTkNSRUYoJkJaMkRlY29tcF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJaMkRlY29tcHJlc3NvciIsIChQeU9iamVjdCAqKSZCWjJEZWNvbXBfVHlwZSk7CisgICAgUHlfSU5DUkVGKCZCWjJEZWNvbXBfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCWjJEZWNvbXByZXNzb3IiLCAoUHlPYmplY3QgKikmQloyRGVjb21wX1R5cGUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jUGlja2xlLmMgYi9Nb2R1bGVzL2NQaWNrbGUuYwppbmRleCA3OWVlYmNhLi5iZDU3N2FkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NQaWNrbGUuYworKysgYi9Nb2R1bGVzL2NQaWNrbGUuYwpAQCAtNzIsNyArNzIsNyBAQAogI2RlZmluZSBTRVRJVEVNUyAgICAndScKIAogLyogUHJvdG9jb2wgMi4gKi8KLSNkZWZpbmUgUFJPVE8JICdceDgwJyAvKiBpZGVudGlmeSBwaWNrbGUgcHJvdG9jb2wgKi8KKyNkZWZpbmUgUFJPVE8gICAgJ1x4ODAnIC8qIGlkZW50aWZ5IHBpY2tsZSBwcm90b2NvbCAqLwogI2RlZmluZSBORVdPQkogICAnXHg4MScgLyogYnVpbGQgb2JqZWN0IGJ5IGFwcGx5aW5nIGNscy5fX25ld19fIHRvIGFyZ3R1cGxlICovCiAjZGVmaW5lIEVYVDEgICAgICdceDgyJyAvKiBwdXNoIG9iamVjdCBmcm9tIGV4dGVuc2lvbiByZWdpc3RyeTsgMS1ieXRlIGluZGV4ICovCiAjZGVmaW5lIEVYVDIgICAgICdceDgzJyAvKiBkaXR0bywgYnV0IDItYnl0ZSBpbmRleCAqLwpAQCAtMTMxLDM3ICsxMzEsMzcgQEAKICAgKl9fZ2V0c3RhdGVfX19zdHIsICpfX3NldHN0YXRlX19fc3RyLCAqX19uYW1lX19fc3RyLCAqX19yZWR1Y2VfX19zdHIsCiAgICpfX3JlZHVjZV9leF9fX3N0ciwKICAgKndyaXRlX3N0ciwgKmFwcGVuZF9zdHIsCi0gICpyZWFkX3N0ciwgKnJlYWRsaW5lX3N0ciwgKl9fbWFpbl9fX3N0ciwgCisgICpyZWFkX3N0ciwgKnJlYWRsaW5lX3N0ciwgKl9fbWFpbl9fX3N0ciwKICAgKmRpc3BhdGNoX3RhYmxlX3N0cjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJbnRlcm5hbCBEYXRhIHR5cGUgZm9yIHBpY2tsZSBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWludCBsZW5ndGg7CS8qIG51bWJlciBvZiBpbml0aWFsIHNsb3RzIGluIGRhdGEgY3VycmVudGx5IHVzZWQgKi8KLQlpbnQgc2l6ZTsJLyogbnVtYmVyIG9mIHNsb3RzIGluIGRhdGEgYWxsb2NhdGVkICovCi0JUHlPYmplY3QgKipkYXRhOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBpbnQgbGVuZ3RoOyAgICAgICAgIC8qIG51bWJlciBvZiBpbml0aWFsIHNsb3RzIGluIGRhdGEgY3VycmVudGx5IHVzZWQgKi8KKyAgICBpbnQgc2l6ZTsgICAgICAgICAgIC8qIG51bWJlciBvZiBzbG90cyBpbiBkYXRhIGFsbG9jYXRlZCAqLworICAgIFB5T2JqZWN0ICoqZGF0YTsKIH0gUGRhdGE7CiAKIHN0YXRpYyB2b2lkCiBQZGF0YV9kZWFsbG9jKFBkYXRhICpzZWxmKQogewotCWludCBpOwotCVB5T2JqZWN0ICoqcDsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqKnA7CiAKLQlmb3IgKGkgPSBzZWxmLT5sZW5ndGgsIHAgPSBzZWxmLT5kYXRhOyAtLWkgPj0gMDsgcCsrKSB7Ci0JCVB5X0RFQ1JFRigqcCk7Ci0JfQotCWlmIChzZWxmLT5kYXRhKQotCQlmcmVlKHNlbGYtPmRhdGEpOwotCVB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBmb3IgKGkgPSBzZWxmLT5sZW5ndGgsIHAgPSBzZWxmLT5kYXRhOyAtLWkgPj0gMDsgcCsrKSB7CisgICAgICAgIFB5X0RFQ1JFRigqcCk7CisgICAgfQorICAgIGlmIChzZWxmLT5kYXRhKQorICAgICAgICBmcmVlKHNlbGYtPmRhdGEpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBQZGF0YVR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApICJjUGlja2xlLlBkYXRhIiwgc2l6ZW9mKFBkYXRhKSwgMCwKLQkoZGVzdHJ1Y3RvcilQZGF0YV9kZWFsbG9jLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBMLDBMLDBMLDBMLCAiIgorICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKSAiY1BpY2tsZS5QZGF0YSIsIHNpemVvZihQZGF0YSksIDAsCisgICAgKGRlc3RydWN0b3IpUGRhdGFfZGVhbGxvYywKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwTCwwTCwwTCwwTCwgIiIKIH07CiAKICNkZWZpbmUgUGRhdGFfQ2hlY2soTykgKFB5X1RZUEUoTykgPT0gJlBkYXRhVHlwZSkKQEAgLTE2OSwyNCArMTY5LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUGRhdGFfTmV3KHZvaWQpCiB7Ci0JUGRhdGEgKnNlbGY7CisgICAgUGRhdGEgKnNlbGY7CiAKLQlpZiAoIShzZWxmID0gUHlPYmplY3RfTmV3KFBkYXRhLCAmUGRhdGFUeXBlKSkpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnNpemUgPSA4OwotCXNlbGYtPmxlbmd0aCA9IDA7Ci0Jc2VsZi0+ZGF0YSA9IG1hbGxvYyhzZWxmLT5zaXplICogc2l6ZW9mKFB5T2JqZWN0KikpOwotCWlmIChzZWxmLT5kYXRhKQotCQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOwotCVB5X0RFQ1JFRihzZWxmKTsKLQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIShzZWxmID0gUHlPYmplY3RfTmV3KFBkYXRhLCAmUGRhdGFUeXBlKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnNpemUgPSA4OworICAgIHNlbGYtPmxlbmd0aCA9IDA7CisgICAgc2VsZi0+ZGF0YSA9IG1hbGxvYyhzZWxmLT5zaXplICogc2l6ZW9mKFB5T2JqZWN0KikpOworICAgIGlmIChzZWxmLT5kYXRhKQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIH0KIAogc3RhdGljIGludAogc3RhY2tVbmRlcmZsb3codm9pZCkKIHsKLQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAidW5waWNrbGluZyBzdGFjayB1bmRlcmZsb3ciKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgInVucGlja2xpbmcgc3RhY2sgdW5kZXJmbG93Iik7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBSZXRhaW4gb25seSB0aGUgaW5pdGlhbCBjbGVhcnRvIGl0ZW1zLiAgSWYgY2xlYXJ0byA+PSB0aGUgY3VycmVudApAQCAtMTk1LDYwICsxOTUsNjAgQEAKIHN0YXRpYyBpbnQKIFBkYXRhX2NsZWFyKFBkYXRhICpzZWxmLCBpbnQgY2xlYXJ0bykKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqKnA7CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKipwOwogCi0JaWYgKGNsZWFydG8gPCAwKSByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKLQlpZiAoY2xlYXJ0byA+PSBzZWxmLT5sZW5ndGgpIHJldHVybiAwOworICAgIGlmIChjbGVhcnRvIDwgMCkgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgaWYgKGNsZWFydG8gPj0gc2VsZi0+bGVuZ3RoKSByZXR1cm4gMDsKIAotCWZvciAoaSA9IHNlbGYtPmxlbmd0aCwgcCA9IHNlbGYtPmRhdGEgKyBjbGVhcnRvOwotCSAgICAgLS1pID49IGNsZWFydG87Ci0JICAgICBwKyspIHsKLQkJUHlfQ0xFQVIoKnApOwotCX0KLQlzZWxmLT5sZW5ndGggPSBjbGVhcnRvOworICAgIGZvciAoaSA9IHNlbGYtPmxlbmd0aCwgcCA9IHNlbGYtPmRhdGEgKyBjbGVhcnRvOworICAgICAgICAgLS1pID49IGNsZWFydG87CisgICAgICAgICBwKyspIHsKKyAgICAgICAgUHlfQ0xFQVIoKnApOworICAgIH0KKyAgICBzZWxmLT5sZW5ndGggPSBjbGVhcnRvOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFBkYXRhX2dyb3coUGRhdGEgKnNlbGYpCiB7Ci0JaW50IGJpZ2dlcjsKLQlzaXplX3QgbmJ5dGVzOwotCVB5T2JqZWN0ICoqdG1wOworICAgIGludCBiaWdnZXI7CisgICAgc2l6ZV90IG5ieXRlczsKKyAgICBQeU9iamVjdCAqKnRtcDsKIAotCWJpZ2dlciA9IHNlbGYtPnNpemUgPDwgMTsKLQlpZiAoYmlnZ2VyIDw9IDApCS8qIHdhcyAwLCBvciBuZXcgdmFsdWUgb3ZlcmZsb3dzICovCi0JCWdvdG8gbm9tZW1vcnk7Ci0JaWYgKChpbnQpKHNpemVfdCliaWdnZXIgIT0gYmlnZ2VyKQotCQlnb3RvIG5vbWVtb3J5OwotCW5ieXRlcyA9IChzaXplX3QpYmlnZ2VyICogc2l6ZW9mKFB5T2JqZWN0ICopOwotCWlmIChuYnl0ZXMgLyBzaXplb2YoUHlPYmplY3QgKikgIT0gKHNpemVfdCliaWdnZXIpCi0JCWdvdG8gbm9tZW1vcnk7Ci0JdG1wID0gcmVhbGxvYyhzZWxmLT5kYXRhLCBuYnl0ZXMpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkJZ290byBub21lbW9yeTsKLQlzZWxmLT5kYXRhID0gdG1wOwotCXNlbGYtPnNpemUgPSBiaWdnZXI7Ci0JcmV0dXJuIDA7CisgICAgYmlnZ2VyID0gc2VsZi0+c2l6ZSA8PCAxOworICAgIGlmIChiaWdnZXIgPD0gMCkgICAgICAgICAgICAvKiB3YXMgMCwgb3IgbmV3IHZhbHVlIG92ZXJmbG93cyAqLworICAgICAgICBnb3RvIG5vbWVtb3J5OworICAgIGlmICgoaW50KShzaXplX3QpYmlnZ2VyICE9IGJpZ2dlcikKKyAgICAgICAgZ290byBub21lbW9yeTsKKyAgICBuYnl0ZXMgPSAoc2l6ZV90KWJpZ2dlciAqIHNpemVvZihQeU9iamVjdCAqKTsKKyAgICBpZiAobmJ5dGVzIC8gc2l6ZW9mKFB5T2JqZWN0ICopICE9IChzaXplX3QpYmlnZ2VyKQorICAgICAgICBnb3RvIG5vbWVtb3J5OworICAgIHRtcCA9IHJlYWxsb2Moc2VsZi0+ZGF0YSwgbmJ5dGVzKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW1vcnk7CisgICAgc2VsZi0+ZGF0YSA9IHRtcDsKKyAgICBzZWxmLT5zaXplID0gYmlnZ2VyOworICAgIHJldHVybiAwOwogCiAgIG5vbWVtb3J5OgotCVB5RXJyX05vTWVtb3J5KCk7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBEIGlzIGEgUGRhdGEqLiAgUG9wIHRoZSB0b3Btb3N0IGVsZW1lbnQgYW5kIHN0b3JlIGl0IGludG8gViwgd2hpY2gKICAqIG11c3QgYmUgYW4gbHZhbHVlIGhvbGRpbmcgUHlPYmplY3QqLiAgT24gc3RhY2sgdW5kZXJmbG93LCBVbnBpY2tsaW5nRXJyb3IKICAqIGlzIHJhaXNlZCBhbmQgViBpcyBzZXQgdG8gTlVMTC4gIEQgYW5kIFYgbWF5IGJlIGV2YWx1YXRlZCBzZXZlcmFsIHRpbWVzLgogICovCi0jZGVmaW5lIFBEQVRBX1BPUChELCBWKSB7CQkJCQlcCi0JaWYgKChEKS0+bGVuZ3RoKQkJCQkJXAotCQkoVikgPSAoRCktPmRhdGFbLS0oKEQpLT5sZW5ndGgpXTsJCVwKLQllbHNlIHsJCQkJCQkJXAotCQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiYmFkIHBpY2tsZSBkYXRhIik7CVwKLQkJKFYpID0gTlVMTDsJCQkJCVwKLQl9CQkJCQkJCVwKKyNkZWZpbmUgUERBVEFfUE9QKEQsIFYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChEKS0+bGVuZ3RoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoVikgPSAoRCktPmRhdGFbLS0oKEQpLT5sZW5ndGgpXTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJiYWQgcGlja2xlIGRhdGEiKTsgICAgICAgICAgICBcCisgICAgICAgIChWKSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAogLyogUERBVEFfUFVTSCBhbmQgUERBVEFfQVBQRU5EIGJvdGggcHVzaCBydmFsdWUgUHlPYmplY3QqIE8gb24gdG8gUGRhdGEqCkBAIC0yNjAsNTUgKzI2MCw1NSBAQAogICovCiAKIC8qIFB1c2ggTyBvbiBzdGFjayBELCBnaXZpbmcgb3duZXJzaGlwIG9mIE8gdG8gdGhlIHN0YWNrLiAqLwotI2RlZmluZSBQREFUQV9QVVNIKEQsIE8sIEVSKSB7CQkJCQlcCi0JaWYgKCgoUGRhdGEqKShEKSktPmxlbmd0aCA9PSAoKFBkYXRhKikoRCkpLT5zaXplICYmCVwKLQkgICAgUGRhdGFfZ3JvdygoUGRhdGEqKShEKSkgPCAwKSB7CQkJXAotCQlQeV9ERUNSRUYoTyk7CQkJCQlcCi0JCXJldHVybiBFUjsJCQkJCVwKLQl9CQkJCQkJCVwKLQkoKFBkYXRhKikoRCkpLT5kYXRhWygoUGRhdGEqKShEKSktPmxlbmd0aCsrXSA9IChPKTsJXAorI2RlZmluZSBQREFUQV9QVVNIKEQsIE8sIEVSKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKChQZGF0YSopKEQpKS0+bGVuZ3RoID09ICgoUGRhdGEqKShEKSktPnNpemUgJiYgICAgICAgICBcCisgICAgICAgIFBkYXRhX2dyb3coKFBkYXRhKikoRCkpIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9ERUNSRUYoTyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIEVSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoUGRhdGEqKShEKSktPmRhdGFbKChQZGF0YSopKEQpKS0+bGVuZ3RoKytdID0gKE8pOyAgICAgICAgIFwKIH0KIAogLyogUHVzaCBPIG9uIHN0YWNrIEQsIHB1c2hpbmcgYSBuZXcgcmVmZXJlbmNlLiAqLwotI2RlZmluZSBQREFUQV9BUFBFTkQoRCwgTywgRVIpIHsJCQkJXAotCWlmICgoKFBkYXRhKikoRCkpLT5sZW5ndGggPT0gKChQZGF0YSopKEQpKS0+c2l6ZSAmJglcCi0JICAgIFBkYXRhX2dyb3coKFBkYXRhKikoRCkpIDwgMCkJCQlcCi0JCXJldHVybiBFUjsJCQkJCVwKLQlQeV9JTkNSRUYoTyk7CQkJCQkJXAotCSgoUGRhdGEqKShEKSktPmRhdGFbKChQZGF0YSopKEQpKS0+bGVuZ3RoKytdID0gKE8pOwlcCisjZGVmaW5lIFBEQVRBX0FQUEVORChELCBPLCBFUikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoKFBkYXRhKikoRCkpLT5sZW5ndGggPT0gKChQZGF0YSopKEQpKS0+c2l6ZSAmJiAgICAgICAgIFwKKyAgICAgICAgUGRhdGFfZ3JvdygoUGRhdGEqKShEKSkgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBFUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFB5X0lOQ1JFRihPKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKFBkYXRhKikoRCkpLT5kYXRhWygoUGRhdGEqKShEKSktPmxlbmd0aCsrXSA9IChPKTsgICAgICAgICBcCiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIFBkYXRhX3BvcFR1cGxlKFBkYXRhICpzZWxmLCBpbnQgc3RhcnQpCiB7Ci0JUHlPYmplY3QgKnI7Ci0JaW50IGksIGosIGw7CisgICAgUHlPYmplY3QgKnI7CisgICAgaW50IGksIGosIGw7CiAKLQlsID0gc2VsZi0+bGVuZ3RoLXN0YXJ0OwotCXIgPSBQeVR1cGxlX05ldyhsKTsKLQlpZiAociA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSBzdGFydCwgaiA9IDAgOyBqIDwgbDsgaSsrLCBqKyspCi0JCVB5VHVwbGVfU0VUX0lURU0ociwgaiwgc2VsZi0+ZGF0YVtpXSk7CisgICAgbCA9IHNlbGYtPmxlbmd0aC1zdGFydDsKKyAgICByID0gUHlUdXBsZV9OZXcobCk7CisgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gc3RhcnQsIGogPSAwIDsgaiA8IGw7IGkrKywgaisrKQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHIsIGosIHNlbGYtPmRhdGFbaV0pOwogCi0Jc2VsZi0+bGVuZ3RoID0gc3RhcnQ7Ci0JcmV0dXJuIHI7CisgICAgc2VsZi0+bGVuZ3RoID0gc3RhcnQ7CisgICAgcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQZGF0YV9wb3BMaXN0KFBkYXRhICpzZWxmLCBpbnQgc3RhcnQpCiB7Ci0JUHlPYmplY3QgKnI7Ci0JaW50IGksIGosIGw7CisgICAgUHlPYmplY3QgKnI7CisgICAgaW50IGksIGosIGw7CiAKLQlsPXNlbGYtPmxlbmd0aC1zdGFydDsKLQlpZiAoISggcj1QeUxpc3RfTmV3KGwpKSkgIHJldHVybiBOVUxMOwotCWZvciAoaT1zdGFydCwgaj0wIDsgaiA8IGw7IGkrKywgaisrKQotCQlQeUxpc3RfU0VUX0lURU0ociwgaiwgc2VsZi0+ZGF0YVtpXSk7CisgICAgbD1zZWxmLT5sZW5ndGgtc3RhcnQ7CisgICAgaWYgKCEoIHI9UHlMaXN0X05ldyhsKSkpICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGk9c3RhcnQsIGo9MCA7IGogPCBsOyBpKyssIGorKykKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHIsIGosIHNlbGYtPmRhdGFbaV0pOwogCi0Jc2VsZi0+bGVuZ3RoPXN0YXJ0OwotCXJldHVybiByOworICAgIHNlbGYtPmxlbmd0aD1zdGFydDsKKyAgICByZXR1cm4gcjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMzEsMjggKzMzMSwyOCBAQAogICB9CiAKIHR5cGVkZWYgc3RydWN0IFBpY2tsZXJvYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlGSUxFICpmcDsKLQlQeU9iamVjdCAqd3JpdGU7Ci0JUHlPYmplY3QgKmZpbGU7Ci0JUHlPYmplY3QgKm1lbW87Ci0JUHlPYmplY3QgKmFyZzsKLQlQeU9iamVjdCAqcGVyc19mdW5jOwotCVB5T2JqZWN0ICppbnN0X3BlcnNfZnVuYzsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRklMRSAqZnA7CisgICAgUHlPYmplY3QgKndyaXRlOworICAgIFB5T2JqZWN0ICpmaWxlOworICAgIFB5T2JqZWN0ICptZW1vOworICAgIFB5T2JqZWN0ICphcmc7CisgICAgUHlPYmplY3QgKnBlcnNfZnVuYzsKKyAgICBQeU9iamVjdCAqaW5zdF9wZXJzX2Z1bmM7CiAKLQkvKiBwaWNrbGUgcHJvdG9jb2wgbnVtYmVyLCA+PSAwICovCi0JaW50IHByb3RvOworICAgIC8qIHBpY2tsZSBwcm90b2NvbCBudW1iZXIsID49IDAgKi8KKyAgICBpbnQgcHJvdG87CiAKLQkvKiBib29sLCB0cnVlIGlmIHByb3RvID4gMCAqLwotCWludCBiaW47CisgICAgLyogYm9vbCwgdHJ1ZSBpZiBwcm90byA+IDAgKi8KKyAgICBpbnQgYmluOwogCi0JaW50IGZhc3Q7IC8qIEZhc3QgbW9kZSBkb2Vzbid0IHNhdmUgaW4gbWVtbywgZG9uJ3QgdXNlIGlmIGNpcmMgcmVmICovCi0JaW50ICgqd3JpdGVfZnVuYykoc3RydWN0IFBpY2tsZXJvYmplY3QgKiwgY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90KTsKLQljaGFyICp3cml0ZV9idWY7Ci0JaW50IGJ1Zl9zaXplOwotCVB5T2JqZWN0ICpkaXNwYXRjaF90YWJsZTsKLQlpbnQgZmFzdF9jb250YWluZXI7IC8qIGNvdW50IG5lc3RlZCBjb250YWluZXIgZHVtcHMgKi8KLQlQeU9iamVjdCAqZmFzdF9tZW1vOworICAgIGludCBmYXN0OyAvKiBGYXN0IG1vZGUgZG9lc24ndCBzYXZlIGluIG1lbW8sIGRvbid0IHVzZSBpZiBjaXJjIHJlZiAqLworICAgIGludCAoKndyaXRlX2Z1bmMpKHN0cnVjdCBQaWNrbGVyb2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCk7CisgICAgY2hhciAqd3JpdGVfYnVmOworICAgIGludCBidWZfc2l6ZTsKKyAgICBQeU9iamVjdCAqZGlzcGF0Y2hfdGFibGU7CisgICAgaW50IGZhc3RfY29udGFpbmVyOyAvKiBjb3VudCBuZXN0ZWQgY29udGFpbmVyIGR1bXBzICovCisgICAgUHlPYmplY3QgKmZhc3RfbWVtbzsKIH0gUGlja2xlcm9iamVjdDsKIAogI2lmbmRlZiBQWV9DUElDS0xFX0ZBU1RfTElNSVQKQEAgLTM2MiwyNSArMzYyLDI1IEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0IFBpY2tsZXJ0eXBlOwogCiB0eXBlZGVmIHN0cnVjdCBVbnBpY2tsZXJvYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlGSUxFICpmcDsKLQlQeU9iamVjdCAqZmlsZTsKLQlQeU9iamVjdCAqcmVhZGxpbmU7Ci0JUHlPYmplY3QgKnJlYWQ7Ci0JUHlPYmplY3QgKm1lbW87Ci0JUHlPYmplY3QgKmFyZzsKLQlQZGF0YSAqc3RhY2s7Ci0JUHlPYmplY3QgKm1hcms7Ci0JUHlPYmplY3QgKnBlcnNfZnVuYzsKLQlQeU9iamVjdCAqbGFzdF9zdHJpbmc7Ci0JaW50ICptYXJrczsKLQlpbnQgbnVtX21hcmtzOwotCWludCBtYXJrc19zaXplOwotCVB5X3NzaXplX3QgKCpyZWFkX2Z1bmMpKHN0cnVjdCBVbnBpY2tsZXJvYmplY3QgKiwgY2hhciAqKiwgUHlfc3NpemVfdCk7Ci0JUHlfc3NpemVfdCAoKnJlYWRsaW5lX2Z1bmMpKHN0cnVjdCBVbnBpY2tsZXJvYmplY3QgKiwgY2hhciAqKik7Ci0JaW50IGJ1Zl9zaXplOwotCWNoYXIgKmJ1ZjsKLQlQeU9iamVjdCAqZmluZF9jbGFzczsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRklMRSAqZnA7CisgICAgUHlPYmplY3QgKmZpbGU7CisgICAgUHlPYmplY3QgKnJlYWRsaW5lOworICAgIFB5T2JqZWN0ICpyZWFkOworICAgIFB5T2JqZWN0ICptZW1vOworICAgIFB5T2JqZWN0ICphcmc7CisgICAgUGRhdGEgKnN0YWNrOworICAgIFB5T2JqZWN0ICptYXJrOworICAgIFB5T2JqZWN0ICpwZXJzX2Z1bmM7CisgICAgUHlPYmplY3QgKmxhc3Rfc3RyaW5nOworICAgIGludCAqbWFya3M7CisgICAgaW50IG51bV9tYXJrczsKKyAgICBpbnQgbWFya3Nfc2l6ZTsKKyAgICBQeV9zc2l6ZV90ICgqcmVhZF9mdW5jKShzdHJ1Y3QgVW5waWNrbGVyb2JqZWN0ICosIGNoYXIgKiosIFB5X3NzaXplX3QpOworICAgIFB5X3NzaXplX3QgKCpyZWFkbGluZV9mdW5jKShzdHJ1Y3QgVW5waWNrbGVyb2JqZWN0ICosIGNoYXIgKiopOworICAgIGludCBidWZfc2l6ZTsKKyAgICBjaGFyICpidWY7CisgICAgUHlPYmplY3QgKmZpbmRfY2xhc3M7CiB9IFVucGlja2xlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBVbnBpY2tsZXJ0eXBlOwpAQCAtMzkzLDMwNiArMzkzLDMwNiBAQAogUHlPYmplY3QgKgogY1BpY2tsZV9FcnJGb3JtYXQoUHlPYmplY3QgKkVyclR5cGUsIGNoYXIgKnN0cmluZ2Zvcm1hdCwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YTsKLQlQeU9iamVjdCAqYXJncz0wLCAqcmV0dmFsPTA7Ci0JdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCAqYXJncz0wLCAqcmV0dmFsPTA7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CiAKLQlpZiAoZm9ybWF0KSBhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOwotCXZhX2VuZCh2YSk7Ci0JaWYgKGZvcm1hdCAmJiAhIGFyZ3MpIHJldHVybiBOVUxMOwotCWlmIChzdHJpbmdmb3JtYXQgJiYgIShyZXR2YWw9UHlTdHJpbmdfRnJvbVN0cmluZyhzdHJpbmdmb3JtYXQpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGZvcm1hdCkgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworICAgIGlmIChmb3JtYXQgJiYgISBhcmdzKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RyaW5nZm9ybWF0ICYmICEocmV0dmFsPVB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyaW5nZm9ybWF0KSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJldHZhbCkgewotCQlpZiAoYXJncykgewotCQkJUHlPYmplY3QgKnY7Ci0JCQl2PVB5U3RyaW5nX0Zvcm1hdChyZXR2YWwsIGFyZ3MpOwotCQkJUHlfREVDUkVGKHJldHZhbCk7Ci0JCQlQeV9ERUNSRUYoYXJncyk7Ci0JCQlpZiAoISB2KSByZXR1cm4gTlVMTDsKLQkJCXJldHZhbD12OwotCQl9Ci0JfQotCWVsc2UKLQkJaWYgKGFyZ3MpIHJldHZhbD1hcmdzOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldE9iamVjdChFcnJUeXBlLFB5X05vbmUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQlQeUVycl9TZXRPYmplY3QoRXJyVHlwZSxyZXR2YWwpOwotCVB5X0RFQ1JFRihyZXR2YWwpOwotCXJldHVybiBOVUxMOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgaWYgKGFyZ3MpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICAgICAgdj1QeVN0cmluZ19Gb3JtYXQocmV0dmFsLCBhcmdzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgaWYgKCEgdikgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR2YWw9djsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIGlmIChhcmdzKSByZXR2YWw9YXJnczsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoRXJyVHlwZSxQeV9Ob25lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgUHlFcnJfU2V0T2JqZWN0KEVyclR5cGUscmV0dmFsKTsKKyAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogd3JpdGVfZmlsZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90ICBuKQogewotCXNpemVfdCBuYnl0ZXN3cml0dGVuOworICAgIHNpemVfdCBuYnl0ZXN3cml0dGVuOwogCi0JaWYgKHMgPT0gTlVMTCkgewotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAobiA+IElOVF9NQVgpIHsKLQkJLyogU3RyaW5nIHRvbyBsYXJnZSAqLwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChuID4gSU5UX01BWCkgeworICAgICAgICAvKiBTdHJpbmcgdG9vIGxhcmdlICovCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlQeUZpbGVfSW5jVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQluYnl0ZXN3cml0dGVuID0gZndyaXRlKHMsIHNpemVvZihjaGFyKSwgbiwgc2VsZi0+ZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQlpZiAobmJ5dGVzd3JpdHRlbiAhPSAoc2l6ZV90KW4pIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIFB5RmlsZV9JbmNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIG5ieXRlc3dyaXR0ZW4gPSBmd3JpdGUocywgc2l6ZW9mKGNoYXIpLCBuLCBzZWxmLT5mcCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeUZpbGVfRGVjVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgIGlmIChuYnl0ZXN3cml0dGVuICE9IChzaXplX3QpbikgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXR1cm4gKGludCluOworICAgIHJldHVybiAoaW50KW47CiB9CiAKIHN0YXRpYyBpbnQKIHdyaXRlX2NTdHJpbmdJTyhQaWNrbGVyb2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90ICBuKQogewotCWlmIChzID09IE5VTEwpIHsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKFB5Y1N0cmluZ0lPLT5jd3JpdGUoKFB5T2JqZWN0ICopc2VsZi0+ZmlsZSwgcywgbikgIT0gbikgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeWNTdHJpbmdJTy0+Y3dyaXRlKChQeU9iamVjdCAqKXNlbGYtPmZpbGUsIHMsIG4pICE9IG4pIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXJldHVybiAoaW50KW47CisgICAgcmV0dXJuIChpbnQpbjsKIH0KIAogc3RhdGljIGludAogd3JpdGVfbm9uZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90ICBuKQogewotCWlmIChzID09IE5VTEwpIHJldHVybiAwOwotCWlmIChuID4gSU5UX01BWCkgcmV0dXJuIC0xOwotCXJldHVybiAoaW50KW47CisgICAgaWYgKHMgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgaWYgKG4gPiBJTlRfTUFYKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIChpbnQpbjsKIH0KIAogc3RhdGljIGludAogd3JpdGVfb3RoZXIoUGlja2xlcm9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCAgX24pCiB7Ci0JUHlPYmplY3QgKnB5X3N0ciA9IDAsICpqdW5rID0gMDsKLQlpbnQgbjsKKyAgICBQeU9iamVjdCAqcHlfc3RyID0gMCwgKmp1bmsgPSAwOworICAgIGludCBuOwogCi0JaWYgKF9uID4gSU5UX01BWCkKLQkJcmV0dXJuIC0xOwotCW4gPSAoaW50KV9uOwotCWlmIChzID09IE5VTEwpIHsKLQkJaWYgKCEoIHNlbGYtPmJ1Zl9zaXplICkpICByZXR1cm4gMDsKLQkJcHlfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+d3JpdGVfYnVmLAotCQkJCQkJICAgIHNlbGYtPmJ1Zl9zaXplKTsKLQkJaWYgKCFweV9zdHIpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgewotCQlpZiAoc2VsZi0+YnVmX3NpemUgJiYgKG4gKyBzZWxmLT5idWZfc2l6ZSkgPiBXUklURV9CVUZfU0laRSkgewotCQkJaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICBpZiAoX24gPiBJTlRfTUFYKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbiA9IChpbnQpX247CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBpZiAoISggc2VsZi0+YnVmX3NpemUgKSkgIHJldHVybiAwOworICAgICAgICBweV9zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT53cml0ZV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKCFweV9zdHIpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoc2VsZi0+YnVmX3NpemUgJiYgKG4gKyBzZWxmLT5idWZfc2l6ZSkgPiBXUklURV9CVUZfU0laRSkgeworICAgICAgICAgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQlpZiAobiA+IFdSSVRFX0JVRl9TSVpFKSB7Ci0JCQlpZiAoISggcHlfc3RyID0KLQkJCSAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBuKSkpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgewotCQkJbWVtY3B5KHNlbGYtPndyaXRlX2J1ZiArIHNlbGYtPmJ1Zl9zaXplLCBzLCBuKTsKLQkJCXNlbGYtPmJ1Zl9zaXplICs9IG47Ci0JCQlyZXR1cm4gbjsKLQkJfQotCX0KKyAgICAgICAgaWYgKG4gPiBXUklURV9CVUZfU0laRSkgeworICAgICAgICAgICAgaWYgKCEoIHB5X3N0ciA9CisgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbikpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShzZWxmLT53cml0ZV9idWYgKyBzZWxmLT5idWZfc2l6ZSwgcywgbik7CisgICAgICAgICAgICBzZWxmLT5idWZfc2l6ZSArPSBuOworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoc2VsZi0+d3JpdGUpIHsKLQkJLyogb2JqZWN0IHdpdGggd3JpdGUgbWV0aG9kICovCi0JCUFSR19UVVAoc2VsZiwgcHlfc3RyKTsKLQkJaWYgKHNlbGYtPmFyZykgewotCQkJanVuayA9IFB5T2JqZWN0X0NhbGwoc2VsZi0+d3JpdGUsIHNlbGYtPmFyZywgTlVMTCk7Ci0JCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JCX0KLQkJaWYgKGp1bmspIFB5X0RFQ1JFRihqdW5rKTsKLQkJZWxzZSByZXR1cm4gLTE7Ci0JfQotCWVsc2UKLQkgICAgUERBVEFfUFVTSChzZWxmLT5maWxlLCBweV9zdHIsIC0xKTsKKyAgICBpZiAoc2VsZi0+d3JpdGUpIHsKKyAgICAgICAgLyogb2JqZWN0IHdpdGggd3JpdGUgbWV0aG9kICovCisgICAgICAgIEFSR19UVVAoc2VsZiwgcHlfc3RyKTsKKyAgICAgICAgaWYgKHNlbGYtPmFyZykgeworICAgICAgICAgICAganVuayA9IFB5T2JqZWN0X0NhbGwoc2VsZi0+d3JpdGUsIHNlbGYtPmFyZywgTlVMTCk7CisgICAgICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGp1bmspIFB5X0RFQ1JFRihqdW5rKTsKKyAgICAgICAgZWxzZSByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUERBVEFfUFVTSChzZWxmLT5maWxlLCBweV9zdHIsIC0xKTsKIAotCXNlbGYtPmJ1Zl9zaXplID0gMDsKLQlyZXR1cm4gbjsKKyAgICBzZWxmLT5idWZfc2l6ZSA9IDA7CisgICAgcmV0dXJuIG47CiB9CiAKIAogc3RhdGljIFB5X3NzaXplX3QKIHJlYWRfZmlsZShVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKipzLCBQeV9zc2l6ZV90IG4pCiB7Ci0Jc2l6ZV90IG5ieXRlc3JlYWQ7CisgICAgc2l6ZV90IG5ieXRlc3JlYWQ7CiAKLQlpZiAoc2VsZi0+YnVmX3NpemUgPT0gMCkgewotCQlpbnQgc2l6ZTsKKyAgICBpZiAoc2VsZi0+YnVmX3NpemUgPT0gMCkgeworICAgICAgICBpbnQgc2l6ZTsKIAotCQlzaXplID0gKChuIDwgMzIpID8gMzIgOiBuKTsKLQkJaWYgKCEoIHNlbGYtPmJ1ZiA9IChjaGFyICopbWFsbG9jKHNpemUpKSkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICBzaXplID0gKChuIDwgMzIpID8gMzIgOiBuKTsKKyAgICAgICAgaWYgKCEoIHNlbGYtPmJ1ZiA9IChjaGFyICopbWFsbG9jKHNpemUpKSkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCXNlbGYtPmJ1Zl9zaXplID0gc2l6ZTsKLQl9Ci0JZWxzZSBpZiAobiA+IHNlbGYtPmJ1Zl9zaXplKSB7Ci0JCWNoYXIgKm5ld2J1ZiA9IChjaGFyICopcmVhbGxvYyhzZWxmLT5idWYsIG4pOwotCQlpZiAoIW5ld2J1ZikgIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc2VsZi0+YnVmID0gbmV3YnVmOwotCQlzZWxmLT5idWZfc2l6ZSA9IG47Ci0JfQorICAgICAgICBzZWxmLT5idWZfc2l6ZSA9IHNpemU7CisgICAgfQorICAgIGVsc2UgaWYgKG4gPiBzZWxmLT5idWZfc2l6ZSkgeworICAgICAgICBjaGFyICpuZXdidWYgPSAoY2hhciAqKXJlYWxsb2Moc2VsZi0+YnVmLCBuKTsKKyAgICAgICAgaWYgKCFuZXdidWYpICB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmJ1ZiA9IG5ld2J1ZjsKKyAgICAgICAgc2VsZi0+YnVmX3NpemUgPSBuOworICAgIH0KIAotCVB5RmlsZV9JbmNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCW5ieXRlc3JlYWQgPSBmcmVhZChzZWxmLT5idWYsIHNpemVvZihjaGFyKSwgbiwgc2VsZi0+ZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQlpZiAobmJ5dGVzcmVhZCAhPSAoc2l6ZV90KW4pIHsKLQkJaWYgKGZlb2Yoc2VsZi0+ZnApKSB7Ci0JCQlQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgIFB5RmlsZV9JbmNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIG5ieXRlc3JlYWQgPSBmcmVhZChzZWxmLT5idWYsIHNpemVvZihjaGFyKSwgbiwgc2VsZi0+ZnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKKyAgICBpZiAobmJ5dGVzcmVhZCAhPSAoc2l6ZV90KW4pIHsKKyAgICAgICAgaWYgKGZlb2Yoc2VsZi0+ZnApKSB7CisgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JKnMgPSBzZWxmLT5idWY7CisgICAgKnMgPSBzZWxmLT5idWY7CiAKLQlyZXR1cm4gbjsKKyAgICByZXR1cm4gbjsKIH0KIAogCiBzdGF0aWMgUHlfc3NpemVfdAogcmVhZGxpbmVfZmlsZShVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKipzKQogewotCWludCBpOworICAgIGludCBpOwogCi0JaWYgKHNlbGYtPmJ1Zl9zaXplID09IDApIHsKLQkJaWYgKCEoIHNlbGYtPmJ1ZiA9IChjaGFyICopbWFsbG9jKDQwKSkpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc2VsZi0+YnVmX3NpemUgPSA0MDsKLQl9CisgICAgaWYgKHNlbGYtPmJ1Zl9zaXplID09IDApIHsKKyAgICAgICAgaWYgKCEoIHNlbGYtPmJ1ZiA9IChjaGFyICopbWFsbG9jKDQwKSkpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+YnVmX3NpemUgPSA0MDsKKyAgICB9CiAKLQlpID0gMDsKLQl3aGlsZSAoMSkgewotCQlpbnQgYmlnZ2VyOwotCQljaGFyICpuZXdidWY7Ci0JCWZvciAoOyBpIDwgKHNlbGYtPmJ1Zl9zaXplIC0gMSk7IGkrKykgewotCQkJaWYgKGZlb2Yoc2VsZi0+ZnApIHx8Ci0JCQkgICAgKHNlbGYtPmJ1ZltpXSA9IGdldGMoc2VsZi0+ZnApKSA9PSAnXG4nKSB7Ci0JCQkJc2VsZi0+YnVmW2kgKyAxXSA9ICdcMCc7Ci0JCQkJKnMgPSBzZWxmLT5idWY7Ci0JCQkJcmV0dXJuIGkgKyAxOwotCQkJfQotCQl9Ci0JCWJpZ2dlciA9IHNlbGYtPmJ1Zl9zaXplIDw8IDE7Ci0JCWlmIChiaWdnZXIgPD0gMCkgewkvKiBvdmVyZmxvdyAqLwotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQluZXdidWYgPSAoY2hhciAqKXJlYWxsb2Moc2VsZi0+YnVmLCBiaWdnZXIpOwotCQlpZiAoIW5ld2J1ZikgIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc2VsZi0+YnVmID0gbmV3YnVmOwotCQlzZWxmLT5idWZfc2l6ZSA9IGJpZ2dlcjsKLQl9CisgICAgaSA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IGJpZ2dlcjsKKyAgICAgICAgY2hhciAqbmV3YnVmOworICAgICAgICBmb3IgKDsgaSA8IChzZWxmLT5idWZfc2l6ZSAtIDEpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmZW9mKHNlbGYtPmZwKSB8fAorICAgICAgICAgICAgICAgIChzZWxmLT5idWZbaV0gPSBnZXRjKHNlbGYtPmZwKSkgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIHNlbGYtPmJ1ZltpICsgMV0gPSAnXDAnOworICAgICAgICAgICAgICAgICpzID0gc2VsZi0+YnVmOworICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiaWdnZXIgPSBzZWxmLT5idWZfc2l6ZSA8PCAxOworICAgICAgICBpZiAoYmlnZ2VyIDw9IDApIHsgICAgICAgICAgICAgIC8qIG92ZXJmbG93ICovCisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG5ld2J1ZiA9IChjaGFyICopcmVhbGxvYyhzZWxmLT5idWYsIGJpZ2dlcik7CisgICAgICAgIGlmICghbmV3YnVmKSAgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5idWYgPSBuZXdidWY7CisgICAgICAgIHNlbGYtPmJ1Zl9zaXplID0gYmlnZ2VyOworICAgIH0KIH0KIAogCiBzdGF0aWMgUHlfc3NpemVfdAogcmVhZF9jU3RyaW5nSU8oVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBjaGFyICoqcywgUHlfc3NpemVfdCAgbikKIHsKLQljaGFyICpwdHI7CisgICAgY2hhciAqcHRyOwogCi0JaWYgKFB5Y1N0cmluZ0lPLT5jcmVhZCgoUHlPYmplY3QgKilzZWxmLT5maWxlLCAmcHRyLCBuKSAhPSBuKSB7Ci0JCVB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeWNTdHJpbmdJTy0+Y3JlYWQoKFB5T2JqZWN0ICopc2VsZi0+ZmlsZSwgJnB0ciwgbikgIT0gbikgeworICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCSpzID0gcHRyOworICAgICpzID0gcHRyOwogCi0JcmV0dXJuIG47CisgICAgcmV0dXJuIG47CiB9CiAKIAogc3RhdGljIFB5X3NzaXplX3QKIHJlYWRsaW5lX2NTdHJpbmdJTyhVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKipzKQogewotCVB5X3NzaXplX3QgbjsKLQljaGFyICpwdHI7CisgICAgUHlfc3NpemVfdCBuOworICAgIGNoYXIgKnB0cjsKIAotCWlmICgobiA9IFB5Y1N0cmluZ0lPLT5jcmVhZGxpbmUoKFB5T2JqZWN0ICopc2VsZi0+ZmlsZSwgJnB0cikpIDwgMCkgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICgobiA9IFB5Y1N0cmluZ0lPLT5jcmVhZGxpbmUoKFB5T2JqZWN0ICopc2VsZi0+ZmlsZSwgJnB0cikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JKnMgPSBwdHI7CisgICAgKnMgPSBwdHI7CiAKLQlyZXR1cm4gbjsKKyAgICByZXR1cm4gbjsKIH0KIAogCiBzdGF0aWMgUHlfc3NpemVfdAogcmVhZF9vdGhlcihVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKipzLCBQeV9zc2l6ZV90ICBuKQogewotCVB5T2JqZWN0ICpieXRlcywgKnN0cj0wOworICAgIFB5T2JqZWN0ICpieXRlcywgKnN0cj0wOwogCi0JaWYgKCEoIGJ5dGVzID0gUHlJbnRfRnJvbVNzaXplX3QobikpKSAgcmV0dXJuIC0xOworICAgIGlmICghKCBieXRlcyA9IFB5SW50X0Zyb21Tc2l6ZV90KG4pKSkgIHJldHVybiAtMTsKIAotCUFSR19UVVAoc2VsZiwgYnl0ZXMpOwotCWlmIChzZWxmLT5hcmcpIHsKLQkJc3RyID0gUHlPYmplY3RfQ2FsbChzZWxmLT5yZWFkLCBzZWxmLT5hcmcsIE5VTEwpOwotCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JfQotCWlmICghIHN0cikgcmV0dXJuIC0xOworICAgIEFSR19UVVAoc2VsZiwgYnl0ZXMpOworICAgIGlmIChzZWxmLT5hcmcpIHsKKyAgICAgICAgc3RyID0gUHlPYmplY3RfQ2FsbChzZWxmLT5yZWFkLCBzZWxmLT5hcmcsIE5VTEwpOworICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgfQorICAgIGlmICghIHN0cikgcmV0dXJuIC0xOwogCi0JUHlfWERFQ1JFRihzZWxmLT5sYXN0X3N0cmluZyk7Ci0Jc2VsZi0+bGFzdF9zdHJpbmcgPSBzdHI7CisgICAgUHlfWERFQ1JFRihzZWxmLT5sYXN0X3N0cmluZyk7CisgICAgc2VsZi0+bGFzdF9zdHJpbmcgPSBzdHI7CiAKLQlpZiAoISAoKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKSkgcmV0dXJuIC0xOworICAgIGlmICghICgqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cikpKSByZXR1cm4gLTE7CiAKLQlpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc3RyKSAhPSBuKSB7Ci0JCVB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzdHIpICE9IG4pIHsKKyAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXR1cm4gbjsKKyAgICByZXR1cm4gbjsKIH0KIAogCiBzdGF0aWMgUHlfc3NpemVfdAogcmVhZGxpbmVfb3RoZXIoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBjaGFyICoqcykKIHsKLQlQeU9iamVjdCAqc3RyOwotCVB5X3NzaXplX3Qgc3RyX3NpemU7CisgICAgUHlPYmplY3QgKnN0cjsKKyAgICBQeV9zc2l6ZV90IHN0cl9zaXplOwogCi0JaWYgKCEoIHN0ciA9IFB5T2JqZWN0X0NhbGxPYmplY3Qoc2VsZi0+cmVhZGxpbmUsIGVtcHR5X3R1cGxlKSkpICB7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCEoIHN0ciA9IFB5T2JqZWN0X0NhbGxPYmplY3Qoc2VsZi0+cmVhZGxpbmUsIGVtcHR5X3R1cGxlKSkpICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoKHN0cl9zaXplID0gUHlTdHJpbmdfU2l6ZShzdHIpKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoKHN0cl9zaXplID0gUHlTdHJpbmdfU2l6ZShzdHIpKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X1hERUNSRUYoc2VsZi0+bGFzdF9zdHJpbmcpOwotCXNlbGYtPmxhc3Rfc3RyaW5nID0gc3RyOworICAgIFB5X1hERUNSRUYoc2VsZi0+bGFzdF9zdHJpbmcpOworICAgIHNlbGYtPmxhc3Rfc3RyaW5nID0gc3RyOwogCi0JaWYgKCEgKCpzID0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyKSkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoISAoKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIHN0cl9zaXplOworICAgIHJldHVybiBzdHJfc2l6ZTsKIH0KIAogLyogQ29weSB0aGUgZmlyc3QgbiBieXRlcyBmcm9tIHMgaW50byBuZXdseSBtYWxsb2MnZWQgbWVtb3J5LCBwbHVzIGEKQEAgLTcwMiw1NzcgKzcwMiw1NzcgQEAKIHN0YXRpYyBjaGFyICoKIHB5c3RybmR1cChjb25zdCBjaGFyICpzLCBpbnQgbikKIHsKLQljaGFyICpyID0gKGNoYXIgKiltYWxsb2MobisxKTsKLQlpZiAociA9PSBOVUxMKQotCQlyZXR1cm4gKGNoYXIqKVB5RXJyX05vTWVtb3J5KCk7Ci0JbWVtY3B5KHIsIHMsIG4pOwotCXJbbl0gPSAwOwotCXJldHVybiByOworICAgIGNoYXIgKnIgPSAoY2hhciAqKW1hbGxvYyhuKzEpOworICAgIGlmIChyID09IE5VTEwpCisgICAgICAgIHJldHVybiAoY2hhciopUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBtZW1jcHkociwgcywgbik7CisgICAgcltuXSA9IDA7CisgICAgcmV0dXJuIHI7CiB9CiAKIAogc3RhdGljIGludAogZ2V0KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppZCkKIHsKLQlQeU9iamVjdCAqdmFsdWUsICptdjsKLQlsb25nIGNfdmFsdWU7Ci0JY2hhciBzWzMwXTsKLQlzaXplX3QgbGVuOworICAgIFB5T2JqZWN0ICp2YWx1ZSwgKm12OworICAgIGxvbmcgY192YWx1ZTsKKyAgICBjaGFyIHNbMzBdOworICAgIHNpemVfdCBsZW47CiAKLQlpZiAoISggbXYgPSBQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBpZCkpKSAgewotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGlkKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoISggbXYgPSBQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBpZCkpKSAgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGlkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICghKCB2YWx1ZSA9IFB5VHVwbGVfR2V0SXRlbShtdiwgMCkpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoIHZhbHVlID0gUHlUdXBsZV9HZXRJdGVtKG12LCAwKSkpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghKCBQeUludF9DaGVjayh2YWx1ZSkpKSAgewotCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgIm5vIGludCB3aGVyZSBpbnQgZXhwZWN0ZWQgaW4gbWVtbyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWNfdmFsdWUgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCopdmFsdWUpOworICAgIGlmICghKCBQeUludF9DaGVjayh2YWx1ZSkpKSAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgIm5vIGludCB3aGVyZSBpbnQgZXhwZWN0ZWQgaW4gbWVtbyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNfdmFsdWUgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCopdmFsdWUpOwogCi0JaWYgKCFzZWxmLT5iaW4pIHsKLQkJc1swXSA9IEdFVDsKLQkJUHlPU19zbnByaW50ZihzICsgMSwgc2l6ZW9mKHMpIC0gMSwgIiVsZFxuIiwgY192YWx1ZSk7Ci0JCWxlbiA9IHN0cmxlbihzKTsKLQl9Ci0JZWxzZSBpZiAoUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKLQkJaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIC0xOwotCQlQREFUQV9BUFBFTkQoc2VsZi0+ZmlsZSwgbXYsIC0xKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgewotCQlpZiAoY192YWx1ZSA8IDI1NikgewotCQkJc1swXSA9IEJJTkdFVDsKLQkJCXNbMV0gPSAoaW50KShjX3ZhbHVlICYgMHhmZik7Ci0JCQlsZW4gPSAyOwotCQl9Ci0JCWVsc2UgewotCQkJc1swXSA9IExPTkdfQklOR0VUOwotCQkJc1sxXSA9IChpbnQpKGNfdmFsdWUgJiAweGZmKTsKLQkJCXNbMl0gPSAoaW50KSgoY192YWx1ZSA+PiA4KSAgJiAweGZmKTsKLQkJCXNbM10gPSAoaW50KSgoY192YWx1ZSA+PiAxNikgJiAweGZmKTsKLQkJCXNbNF0gPSAoaW50KSgoY192YWx1ZSA+PiAyNCkgJiAweGZmKTsKLQkJCWxlbiA9IDU7Ci0JCX0KLQl9CisgICAgaWYgKCFzZWxmLT5iaW4pIHsKKyAgICAgICAgc1swXSA9IEdFVDsKKyAgICAgICAgUHlPU19zbnByaW50ZihzICsgMSwgc2l6ZW9mKHMpIC0gMSwgIiVsZFxuIiwgY192YWx1ZSk7CisgICAgICAgIGxlbiA9IHN0cmxlbihzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKKyAgICAgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIC0xOworICAgICAgICBQREFUQV9BUFBFTkQoc2VsZi0+ZmlsZSwgbXYsIC0xKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoY192YWx1ZSA8IDI1NikgeworICAgICAgICAgICAgc1swXSA9IEJJTkdFVDsKKyAgICAgICAgICAgIHNbMV0gPSAoaW50KShjX3ZhbHVlICYgMHhmZik7CisgICAgICAgICAgICBsZW4gPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc1swXSA9IExPTkdfQklOR0VUOworICAgICAgICAgICAgc1sxXSA9IChpbnQpKGNfdmFsdWUgJiAweGZmKTsKKyAgICAgICAgICAgIHNbMl0gPSAoaW50KSgoY192YWx1ZSA+PiA4KSAgJiAweGZmKTsKKyAgICAgICAgICAgIHNbM10gPSAoaW50KSgoY192YWx1ZSA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgIHNbNF0gPSAoaW50KSgoY192YWx1ZSA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgIGxlbiA9IDU7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBzLCBsZW4pIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHMsIGxlbikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBwdXQoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iKQogewotCWlmIChQeV9SRUZDTlQob2IpIDwgMiB8fCBzZWxmLT5mYXN0KQotCQlyZXR1cm4gMDsKKyAgICBpZiAoUHlfUkVGQ05UKG9iKSA8IDIgfHwgc2VsZi0+ZmFzdCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlyZXR1cm4gcHV0MihzZWxmLCBvYik7CisgICAgcmV0dXJuIHB1dDIoc2VsZiwgb2IpOwogfQogCiAKIHN0YXRpYyBpbnQKIHB1dDIoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iKQogewotCWNoYXIgY19zdHJbMzBdOwotCWludCBwOwotCXNpemVfdCBsZW47Ci0JaW50IHJlcyA9IC0xOwotCVB5T2JqZWN0ICpweV9vYl9pZCA9IDAsICptZW1vX2xlbiA9IDAsICp0ID0gMDsKKyAgICBjaGFyIGNfc3RyWzMwXTsKKyAgICBpbnQgcDsKKyAgICBzaXplX3QgbGVuOworICAgIGludCByZXMgPSAtMTsKKyAgICBQeU9iamVjdCAqcHlfb2JfaWQgPSAwLCAqbWVtb19sZW4gPSAwLCAqdCA9IDA7CiAKLQlpZiAoc2VsZi0+ZmFzdCkKLQkJcmV0dXJuIDA7CisgICAgaWYgKHNlbGYtPmZhc3QpCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKChwID0gUHlEaWN0X1NpemUoc2VsZi0+bWVtbykpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICgocCA9IFB5RGljdF9TaXplKHNlbGYtPm1lbW8pKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIE1ha2Ugc3VyZSBtZW1vIGtleXMgYXJlIHBvc2l0aXZlISAqLwotCS8qIFhYWCBXaHk/Ci0JICogWFhYIEFuZCBkb2VzICJwb3NpdGl2ZSIgcmVhbGx5IG1lYW4gbm9uLW5lZ2F0aXZlPwotCSAqIFhYWCBwaWNrbGUucHkgc3RhcnRzIHdpdGggUFVUIGluZGV4IDAsIG5vdCAxLiAgVGhpcyBtYWtlcyBmb3IKLQkgKiBYWFggZ3JhdHVpdG91cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwaWNrbGluZyBtb2R1bGVzLgotCSAqLwotCXArKzsKKyAgICAvKiBNYWtlIHN1cmUgbWVtbyBrZXlzIGFyZSBwb3NpdGl2ZSEgKi8KKyAgICAvKiBYWFggV2h5PworICAgICAqIFhYWCBBbmQgZG9lcyAicG9zaXRpdmUiIHJlYWxseSBtZWFuIG5vbi1uZWdhdGl2ZT8KKyAgICAgKiBYWFggcGlja2xlLnB5IHN0YXJ0cyB3aXRoIFBVVCBpbmRleCAwLCBub3QgMS4gIFRoaXMgbWFrZXMgZm9yCisgICAgICogWFhYIGdyYXR1aXRvdXMgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgcGlja2xpbmcgbW9kdWxlcy4KKyAgICAgKi8KKyAgICBwKys7CiAKLQlpZiAoISggcHlfb2JfaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIob2IpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCBweV9vYl9pZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cihvYikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoISggbWVtb19sZW4gPSBQeUludF9Gcm9tTG9uZyhwKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggbWVtb19sZW4gPSBQeUludF9Gcm9tTG9uZyhwKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmICghKCB0ID0gUHlUdXBsZV9OZXcoMikpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIHQgPSBQeVR1cGxlX05ldygyKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCVB5VHVwbGVfU0VUX0lURU0odCwgMCwgbWVtb19sZW4pOwotCVB5X0lOQ1JFRihtZW1vX2xlbik7Ci0JUHlUdXBsZV9TRVRfSVRFTSh0LCAxLCBvYik7Ci0JUHlfSU5DUkVGKG9iKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHQsIDAsIG1lbW9fbGVuKTsKKyAgICBQeV9JTkNSRUYobWVtb19sZW4pOworICAgIFB5VHVwbGVfU0VUX0lURU0odCwgMSwgb2IpOworICAgIFB5X0lOQ1JFRihvYik7CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+bWVtbywgcHlfb2JfaWQsIHQpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5tZW1vLCBweV9vYl9pZCwgdCkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoIXNlbGYtPmJpbikgewotCQljX3N0clswXSA9IFBVVDsKLQkJUHlPU19zbnByaW50ZihjX3N0ciArIDEsIHNpemVvZihjX3N0cikgLSAxLCAiJWRcbiIsIHApOwotCQlsZW4gPSBzdHJsZW4oY19zdHIpOwotCX0KLQllbHNlIGlmIChQZGF0YV9DaGVjayhzZWxmLT5maWxlKSkgewotCQlpZiAod3JpdGVfb3RoZXIoc2VsZiwgTlVMTCwgMCkgPCAwKSByZXR1cm4gLTE7Ci0JCVBEQVRBX0FQUEVORChzZWxmLT5maWxlLCBtZW1vX2xlbiwgLTEpOwotCQlyZXM9MDsgICAgICAgICAgLyogSm9iIHdlbGwgZG9uZSA7KSAqLwotCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWVsc2UgewotCQlpZiAocCA+PSAyNTYpIHsKLQkJCWNfc3RyWzBdID0gTE9OR19CSU5QVVQ7Ci0JCQljX3N0clsxXSA9IChpbnQpKHAgJiAweGZmKTsKLQkJCWNfc3RyWzJdID0gKGludCkoKHAgPj4gOCkgICYgMHhmZik7Ci0JCQljX3N0clszXSA9IChpbnQpKChwID4+IDE2KSAmIDB4ZmYpOwotCQkJY19zdHJbNF0gPSAoaW50KSgocCA+PiAyNCkgJiAweGZmKTsKLQkJCWxlbiA9IDU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljX3N0clswXSA9IEJJTlBVVDsKLQkJCWNfc3RyWzFdID0gcDsKLQkJCWxlbiA9IDI7Ci0JCX0KLQl9CisgICAgaWYgKCFzZWxmLT5iaW4pIHsKKyAgICAgICAgY19zdHJbMF0gPSBQVVQ7CisgICAgICAgIFB5T1Nfc25wcmludGYoY19zdHIgKyAxLCBzaXplb2YoY19zdHIpIC0gMSwgIiVkXG4iLCBwKTsKKyAgICAgICAgbGVuID0gc3RybGVuKGNfc3RyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKKyAgICAgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIC0xOworICAgICAgICBQREFUQV9BUFBFTkQoc2VsZi0+ZmlsZSwgbWVtb19sZW4sIC0xKTsKKyAgICAgICAgcmVzPTA7ICAgICAgICAgIC8qIEpvYiB3ZWxsIGRvbmUgOykgKi8KKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHAgPj0gMjU2KSB7CisgICAgICAgICAgICBjX3N0clswXSA9IExPTkdfQklOUFVUOworICAgICAgICAgICAgY19zdHJbMV0gPSAoaW50KShwICYgMHhmZik7CisgICAgICAgICAgICBjX3N0clsyXSA9IChpbnQpKChwID4+IDgpICAmIDB4ZmYpOworICAgICAgICAgICAgY19zdHJbM10gPSAoaW50KSgocCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgIGNfc3RyWzRdID0gKGludCkoKHAgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICBsZW4gPSA1OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY19zdHJbMF0gPSBCSU5QVVQ7CisgICAgICAgICAgICBjX3N0clsxXSA9IHA7CisgICAgICAgICAgICBsZW4gPSAyOworICAgICAgICB9CisgICAgfQogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlyZXMgPSAwOworICAgIHJlcyA9IDA7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHB5X29iX2lkKTsKLQlQeV9YREVDUkVGKG1lbW9fbGVuKTsKLQlQeV9YREVDUkVGKHQpOworICAgIFB5X1hERUNSRUYocHlfb2JfaWQpOworICAgIFB5X1hERUNSRUYobWVtb19sZW4pOworICAgIFB5X1hERUNSRUYodCk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aGljaG1vZHVsZShQeU9iamVjdCAqZ2xvYmFsLCBQeU9iamVjdCAqZ2xvYmFsX25hbWUpCiB7Ci0JUHlfc3NpemVfdCBpLCBqOwotCVB5T2JqZWN0ICptb2R1bGUgPSAwLCAqbW9kdWxlc19kaWN0ID0gMCwKLQkJKmdsb2JhbF9uYW1lX2F0dHIgPSAwLCAqbmFtZSA9IDA7CisgICAgUHlfc3NpemVfdCBpLCBqOworICAgIFB5T2JqZWN0ICptb2R1bGUgPSAwLCAqbW9kdWxlc19kaWN0ID0gMCwKKyAgICAgICAgKmdsb2JhbF9uYW1lX2F0dHIgPSAwLCAqbmFtZSA9IDA7CiAKLQltb2R1bGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGdsb2JhbCwgIl9fbW9kdWxlX18iKTsKLQlpZiAobW9kdWxlKQotCQlyZXR1cm4gbW9kdWxlOwotCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJUHlFcnJfQ2xlYXIoKTsKLQllbHNlCi0JCXJldHVybiBOVUxMOworICAgIG1vZHVsZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZ2xvYmFsLCAiX19tb2R1bGVfXyIpOworICAgIGlmIChtb2R1bGUpCisgICAgICAgIHJldHVybiBtb2R1bGU7CisgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoISggbW9kdWxlc19kaWN0ID0gUHlTeXNfR2V0T2JqZWN0KCJtb2R1bGVzIikpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISggbW9kdWxlc19kaWN0ID0gUHlTeXNfR2V0T2JqZWN0KCJtb2R1bGVzIikpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWkgPSAwOwotCXdoaWxlICgoaiA9IFB5RGljdF9OZXh0KG1vZHVsZXNfZGljdCwgJmksICZuYW1lLCAmbW9kdWxlKSkpIHsKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoKGogPSBQeURpY3RfTmV4dChtb2R1bGVzX2RpY3QsICZpLCAmbmFtZSwgJm1vZHVsZSkpKSB7CiAKLQkJaWYgKFB5T2JqZWN0X0NvbXBhcmUobmFtZSwgX19tYWluX19fc3RyKT09MCkgY29udGludWU7CisgICAgICAgIGlmIChQeU9iamVjdF9Db21wYXJlKG5hbWUsIF9fbWFpbl9fX3N0cik9PTApIGNvbnRpbnVlOwogCi0JCWdsb2JhbF9uYW1lX2F0dHIgPSBQeU9iamVjdF9HZXRBdHRyKG1vZHVsZSwgZ2xvYmFsX25hbWUpOwotCQlpZiAoIWdsb2JhbF9uYW1lX2F0dHIpICB7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGdsb2JhbF9uYW1lX2F0dHIgPSBQeU9iamVjdF9HZXRBdHRyKG1vZHVsZSwgZ2xvYmFsX25hbWUpOworICAgICAgICBpZiAoIWdsb2JhbF9uYW1lX2F0dHIpICB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJaWYgKGdsb2JhbF9uYW1lX2F0dHIgIT0gZ2xvYmFsKSB7Ci0JCQlQeV9ERUNSRUYoZ2xvYmFsX25hbWVfYXR0cik7Ci0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoZ2xvYmFsX25hbWVfYXR0ciAhPSBnbG9iYWwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihnbG9iYWxfbmFtZV9hdHRyKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJUHlfREVDUkVGKGdsb2JhbF9uYW1lX2F0dHIpOworICAgICAgICBQeV9ERUNSRUYoZ2xvYmFsX25hbWVfYXR0cik7CiAKLQkJYnJlYWs7Ci0JfQorICAgICAgICBicmVhazsKKyAgICB9CiAKLQkvKiBUaGUgZm9sbG93aW5nIGltcGxlbWVudHMgdGhlIHJ1bGUgaW4gcGlja2xlLnB5IGFkZGVkIGluIDEuNQotCSAgIHRoYXQgdXNlZCBfX21haW5fXyBpZiBubyBtb2R1bGUgaXMgZm91bmQuICBJIGRvbid0IGFjdHVhbGx5Ci0JICAgbGlrZSB0aGlzIHJ1bGUuIGpsZgotCSovCi0JaWYgKCFqKSB7Ci0JCW5hbWU9X19tYWluX19fc3RyOwotCX0KKyAgICAvKiBUaGUgZm9sbG93aW5nIGltcGxlbWVudHMgdGhlIHJ1bGUgaW4gcGlja2xlLnB5IGFkZGVkIGluIDEuNQorICAgICAgIHRoYXQgdXNlZCBfX21haW5fXyBpZiBubyBtb2R1bGUgaXMgZm91bmQuICBJIGRvbid0IGFjdHVhbGx5CisgICAgICAgbGlrZSB0aGlzIHJ1bGUuIGpsZgorICAgICovCisgICAgaWYgKCFqKSB7CisgICAgICAgIG5hbWU9X19tYWluX19fc3RyOworICAgIH0KIAotCVB5X0lOQ1JFRihuYW1lKTsKLQlyZXR1cm4gbmFtZTsKKyAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgcmV0dXJuIG5hbWU7CiB9CiAKIAogc3RhdGljIGludAogZmFzdF9zYXZlX2VudGVyKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCiB7Ci0JLyogaWYgZmFzdF9jb250YWluZXIgPCAwLCB3ZSdyZSBkb2luZyBhbiBlcnJvciBleGl0LiAqLwotCWlmICgrK3NlbGYtPmZhc3RfY29udGFpbmVyID49IFBZX0NQSUNLTEVfRkFTVF9MSU1JVCkgewotCQlQeU9iamVjdCAqa2V5ID0gTlVMTDsKLQkJaWYgKHNlbGYtPmZhc3RfbWVtbyA9PSBOVUxMKSB7Ci0JCQlzZWxmLT5mYXN0X21lbW8gPSBQeURpY3RfTmV3KCk7Ci0JCQlpZiAoc2VsZi0+ZmFzdF9tZW1vID09IE5VTEwpIHsKLQkJCQlzZWxmLT5mYXN0X2NvbnRhaW5lciA9IC0xOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JCWtleSA9IFB5TG9uZ19Gcm9tVm9pZFB0cihvYmopOwotCQlpZiAoa2V5ID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKFB5RGljdF9HZXRJdGVtKHNlbGYtPmZhc3RfbWVtbywga2V5KSkgewotCQkJUHlfREVDUkVGKGtleSk7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICJmYXN0IG1vZGU6IGNhbid0IHBpY2tsZSBjeWNsaWMgb2JqZWN0cyAiCi0JCQkJICAgICAiaW5jbHVkaW5nIG9iamVjdCB0eXBlICVzIGF0ICVwIiwKLQkJCQkgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSwgb2JqKTsKLQkJCXNlbGYtPmZhc3RfY29udGFpbmVyID0gLTE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZmFzdF9tZW1vLCBrZXksIFB5X05vbmUpIDwgMCkgewotCQkJUHlfREVDUkVGKGtleSk7Ci0JCQlzZWxmLT5mYXN0X2NvbnRhaW5lciA9IC0xOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJUHlfREVDUkVGKGtleSk7Ci0JfQotCXJldHVybiAxOworICAgIC8qIGlmIGZhc3RfY29udGFpbmVyIDwgMCwgd2UncmUgZG9pbmcgYW4gZXJyb3IgZXhpdC4gKi8KKyAgICBpZiAoKytzZWxmLT5mYXN0X2NvbnRhaW5lciA+PSBQWV9DUElDS0xFX0ZBU1RfTElNSVQpIHsKKyAgICAgICAgUHlPYmplY3QgKmtleSA9IE5VTEw7CisgICAgICAgIGlmIChzZWxmLT5mYXN0X21lbW8gPT0gTlVMTCkgeworICAgICAgICAgICAgc2VsZi0+ZmFzdF9tZW1vID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKHNlbGYtPmZhc3RfbWVtbyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2VsZi0+ZmFzdF9jb250YWluZXIgPSAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBrZXkgPSBQeUxvbmdfRnJvbVZvaWRQdHIob2JqKTsKKyAgICAgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbShzZWxmLT5mYXN0X21lbW8sIGtleSkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImZhc3QgbW9kZTogY2FuJ3QgcGlja2xlIGN5Y2xpYyBvYmplY3RzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jbHVkaW5nIG9iamVjdCB0eXBlICVzIGF0ICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iaiktPnRwX25hbWUsIG9iaik7CisgICAgICAgICAgICBzZWxmLT5mYXN0X2NvbnRhaW5lciA9IC0xOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmZhc3RfbWVtbywga2V5LCBQeV9Ob25lKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgc2VsZi0+ZmFzdF9jb250YWluZXIgPSAtMTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogaW50CiBmYXN0X3NhdmVfbGVhdmUoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQlpZiAoc2VsZi0+ZmFzdF9jb250YWluZXItLSA+PSBQWV9DUElDS0xFX0ZBU1RfTElNSVQpIHsKLQkJUHlPYmplY3QgKmtleSA9IFB5TG9uZ19Gcm9tVm9pZFB0cihvYmopOwotCQlpZiAoa2V5ID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKFB5RGljdF9EZWxJdGVtKHNlbGYtPmZhc3RfbWVtbywga2V5KSA8IDApIHsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJUHlfREVDUkVGKGtleSk7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChzZWxmLT5mYXN0X2NvbnRhaW5lci0tID49IFBZX0NQSUNLTEVfRkFTVF9MSU1JVCkgeworICAgICAgICBQeU9iamVjdCAqa2V5ID0gUHlMb25nX0Zyb21Wb2lkUHRyKG9iaik7CisgICAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oc2VsZi0+ZmFzdF9tZW1vLCBrZXkpIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIHNhdmVfbm9uZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdGF0aWMgY2hhciBub25lID0gTk9ORTsKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmbm9uZSwgMSkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgc3RhdGljIGNoYXIgbm9uZSA9IE5PTkU7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJm5vbmUsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNhdmVfYm9vbChQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdGF0aWMgY29uc3QgY2hhciAqYnVmWzJdID0ge0ZBTFNFLCBUUlVFfTsKLQlzdGF0aWMgY2hhciBsZW5bMl0gPSB7c2l6ZW9mKEZBTFNFKS0xLCBzaXplb2YoVFJVRSktMX07Ci0JbG9uZyBsID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKilhcmdzKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYnVmWzJdID0ge0ZBTFNFLCBUUlVFfTsKKyAgICBzdGF0aWMgY2hhciBsZW5bMl0gPSB7c2l6ZW9mKEZBTFNFKS0xLCBzaXplb2YoVFJVRSktMX07CisgICAgbG9uZyBsID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKilhcmdzKTsKIAotCWlmIChzZWxmLT5wcm90byA+PSAyKSB7Ci0JCWNoYXIgb3Bjb2RlID0gbCA/IE5FV1RSVUUgOiBORVdGQUxTRTsKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJm9wY29kZSwgMSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGJ1ZltsXSwgbGVuW2xdKSA8IDApCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc2VsZi0+cHJvdG8gPj0gMikgeworICAgICAgICBjaGFyIG9wY29kZSA9IGwgPyBORVdUUlVFIDogTkVXRkFMU0U7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZvcGNvZGUsIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBidWZbbF0sIGxlbltsXSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNhdmVfaW50KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgY19zdHJbMzJdOwotCWxvbmcgbCA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopYXJncyk7Ci0JaW50IGxlbiA9IDA7CisgICAgY2hhciBjX3N0clszMl07CisgICAgbG9uZyBsID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKilhcmdzKTsKKyAgICBpbnQgbGVuID0gMDsKIAotCWlmICghc2VsZi0+YmluCisgICAgaWYgKCFzZWxmLT5iaW4KICNpZiBTSVpFT0ZfTE9ORyA+IDQKLQkgICAgfHwgbCA+ICAweDdmZmZmZmZmTAotCSAgICB8fCBsIDwgLTB4ODAwMDAwMDBMCisgICAgICAgIHx8IGwgPiAgMHg3ZmZmZmZmZkwKKyAgICAgICAgfHwgbCA8IC0weDgwMDAwMDAwTAogI2VuZGlmCi0JCSkgewotCQkvKiBUZXh0LW1vZGUgcGlja2xlLCBvciBsb25nIHRvbyBiaWcgdG8gZml0IGluIHRoZSA0LWJ5dGUKLQkJICogc2lnbmVkIEJJTklOVCBmb3JtYXQ6ICBzdG9yZSBhcyBhIHN0cmluZy4KLQkJICovCi0JCWNfc3RyWzBdID0gSU5UOwotCQlQeU9TX3NucHJpbnRmKGNfc3RyICsgMSwgc2l6ZW9mKGNfc3RyKSAtIDEsICIlbGRcbiIsIGwpOwotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgc3RybGVuKGNfc3RyKSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIHsKLQkJLyogQmluYXJ5IHBpY2tsZSBhbmQgbCBmaXRzIGluIGEgc2lnbmVkIDQtYnl0ZSBpbnQuICovCi0JCWNfc3RyWzFdID0gKGludCkoIGwgICAgICAgICYgMHhmZik7Ci0JCWNfc3RyWzJdID0gKGludCkoKGwgPj4gOCkgICYgMHhmZik7Ci0JCWNfc3RyWzNdID0gKGludCkoKGwgPj4gMTYpICYgMHhmZik7Ci0JCWNfc3RyWzRdID0gKGludCkoKGwgPj4gMjQpICYgMHhmZik7CisgICAgICAgICkgeworICAgICAgICAvKiBUZXh0LW1vZGUgcGlja2xlLCBvciBsb25nIHRvbyBiaWcgdG8gZml0IGluIHRoZSA0LWJ5dGUKKyAgICAgICAgICogc2lnbmVkIEJJTklOVCBmb3JtYXQ6ICBzdG9yZSBhcyBhIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIGNfc3RyWzBdID0gSU5UOworICAgICAgICBQeU9TX3NucHJpbnRmKGNfc3RyICsgMSwgc2l6ZW9mKGNfc3RyKSAtIDEsICIlbGRcbiIsIGwpOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgc3RybGVuKGNfc3RyKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogQmluYXJ5IHBpY2tsZSBhbmQgbCBmaXRzIGluIGEgc2lnbmVkIDQtYnl0ZSBpbnQuICovCisgICAgICAgIGNfc3RyWzFdID0gKGludCkoIGwgICAgICAgICYgMHhmZik7CisgICAgICAgIGNfc3RyWzJdID0gKGludCkoKGwgPj4gOCkgICYgMHhmZik7CisgICAgICAgIGNfc3RyWzNdID0gKGludCkoKGwgPj4gMTYpICYgMHhmZik7CisgICAgICAgIGNfc3RyWzRdID0gKGludCkoKGwgPj4gMjQpICYgMHhmZik7CiAKLQkJaWYgKChjX3N0cls0XSA9PSAwKSAmJiAoY19zdHJbM10gPT0gMCkpIHsKLQkJCWlmIChjX3N0clsyXSA9PSAwKSB7Ci0JCQkJY19zdHJbMF0gPSBCSU5JTlQxOwotCQkJCWxlbiA9IDI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljX3N0clswXSA9IEJJTklOVDI7Ci0JCQkJbGVuID0gMzsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWNfc3RyWzBdID0gQklOSU5UOwotCQkJbGVuID0gNTsKLQkJfQorICAgICAgICBpZiAoKGNfc3RyWzRdID09IDApICYmIChjX3N0clszXSA9PSAwKSkgeworICAgICAgICAgICAgaWYgKGNfc3RyWzJdID09IDApIHsKKyAgICAgICAgICAgICAgICBjX3N0clswXSA9IEJJTklOVDE7CisgICAgICAgICAgICAgICAgbGVuID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNfc3RyWzBdID0gQklOSU5UMjsKKyAgICAgICAgICAgICAgICBsZW4gPSAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY19zdHJbMF0gPSBCSU5JTlQ7CisgICAgICAgICAgICBsZW4gPSA1OworICAgICAgICB9CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIHNhdmVfbG9uZyhQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaW50IHJlcyA9IC0xOwotCVB5T2JqZWN0ICpyZXByID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaW50IHJlcyA9IC0xOworICAgIFB5T2JqZWN0ICpyZXByID0gTlVMTDsKIAotCXN0YXRpYyBjaGFyIGwgPSBMT05HOworICAgIHN0YXRpYyBjaGFyIGwgPSBMT05HOwogCi0JaWYgKHNlbGYtPnByb3RvID49IDIpIHsKLQkJLyogTGluZWFyLXRpbWUgcGlja2xpbmcuICovCi0JCXNpemVfdCBuYml0czsKLQkJc2l6ZV90IG5ieXRlczsKLQkJdW5zaWduZWQgY2hhciAqcGRhdGE7Ci0JCWNoYXIgY19zdHJbNV07Ci0JCWludCBpOwotCQlpbnQgc2lnbiA9IF9QeUxvbmdfU2lnbihhcmdzKTsKKyAgICBpZiAoc2VsZi0+cHJvdG8gPj0gMikgeworICAgICAgICAvKiBMaW5lYXItdGltZSBwaWNrbGluZy4gKi8KKyAgICAgICAgc2l6ZV90IG5iaXRzOworICAgICAgICBzaXplX3QgbmJ5dGVzOworICAgICAgICB1bnNpZ25lZCBjaGFyICpwZGF0YTsKKyAgICAgICAgY2hhciBjX3N0cls1XTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBzaWduID0gX1B5TG9uZ19TaWduKGFyZ3MpOwogCi0JCWlmIChzaWduID09IDApIHsKLQkJCS8qIEl0J3MgMCAtLSBhbiBlbXB0eSBieXRlc3RyaW5nLiAqLwotCQkJY19zdHJbMF0gPSBMT05HMTsKLQkJCWNfc3RyWzFdID0gMDsKLQkJCWkgPSBzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCAyKTsKLQkJCWlmIChpIDwgMCkgZ290byBmaW5hbGx5OwotCQkJcmVzID0gMDsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQluYml0cyA9IF9QeUxvbmdfTnVtQml0cyhhcmdzKTsKLQkJaWYgKG5iaXRzID09IChzaXplX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gZmluYWxseTsKLQkJLyogSG93IG1hbnkgYnl0ZXMgZG8gd2UgbmVlZD8gIFRoZXJlIGFyZSBuYml0cyA+PiAzIGZ1bGwKLQkJICogYnl0ZXMgb2YgZGF0YSwgYW5kIG5iaXRzICYgNyBsZWZ0b3ZlciBiaXRzLiAgSWYgdGhlcmUKLQkJICogYXJlIGFueSBsZWZ0b3ZlciBiaXRzLCB0aGVuIHdlIGNsZWFybHkgbmVlZCBhbm90aGVyCi0JCSAqIGJ5dGUuICBXbmF0J3Mgbm90IHNvIG9idmlvdXMgaXMgdGhhdCB3ZSAqcHJvYmFibHkqCi0JCSAqIG5lZWQgYW5vdGhlciBieXRlIGV2ZW4gaWYgdGhlcmUgYXJlbid0IGFueSBsZWZ0b3ZlcnM6Ci0JCSAqIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgbW9zdC1zaWduaWZpY2FudCBieXRlCi0JCSAqIGFjdHMgbGlrZSBhIHNpZ24gYml0LCBhbmQgaXQncyB1c3VhbGx5IGdvdCBhIHNlbnNlCi0JCSAqIG9wcG9zaXRlIG9mIHRoZSBvbmUgd2UgbmVlZC4gIFRoZSBleGNlcHRpb24gaXMgbG9uZ3MKLQkJICogb2YgdGhlIGZvcm0gLSgyKiooOCpqLTEpKSBmb3IgaiA+IDAuICBTdWNoIGEgbG9uZyBpcwotCQkgKiBpdHMgb3duIDI1NidzLWNvbXBsZW1lbnQsIHNvIGhhcyB0aGUgcmlnaHQgc2lnbiBiaXQKLQkJICogZXZlbiB3aXRob3V0IHRoZSBleHRyYSBieXRlLiAgVGhhdCdzIGEgcGFpbiB0byBjaGVjawotCQkgKiBmb3IgaW4gYWR2YW5jZSwgdGhvdWdoLCBzbyB3ZSBhbHdheXMgZ3JhYiBhbiBleHRyYQotCQkgKiBieXRlIGF0IHRoZSBzdGFydCwgYW5kIGN1dCBpdCBiYWNrIGxhdGVyIGlmIHBvc3NpYmxlLgotCQkgKi8KLQkJbmJ5dGVzID0gKG5iaXRzID4+IDMpICsgMTsKLQkJaWYgKG5ieXRlcyA+IElOVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibG9uZyB0b28gbGFyZ2UgIgotCQkJCSJ0byBwaWNrbGUiKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlyZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGludCluYnl0ZXMpOwotCQlpZiAocmVwciA9PSBOVUxMKSBnb3RvIGZpbmFsbHk7Ci0JCXBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocmVwcik7Ci0JCWkgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QgKilhcmdzLAotCSAJCQlwZGF0YSwgbmJ5dGVzLAotCQkJCTEgLyogbGl0dGxlIGVuZGlhbiAqLywgMSAvKiBzaWduZWQgKi8pOwotCQlpZiAoaSA8IDApIGdvdG8gZmluYWxseTsKLQkJLyogSWYgdGhlIGxvbmcgaXMgbmVnYXRpdmUsIHRoaXMgbWF5IGJlIGEgYnl0ZSBtb3JlIHRoYW4KLQkJICogbmVlZGVkLiAgVGhpcyBpcyBzbyBpZmYgdGhlIE1TQiBpcyBhbGwgcmVkdW5kYW50IHNpZ24KLQkJICogYml0cy4KLQkJICovCi0JCWlmIChzaWduIDwgMCAmJiBuYnl0ZXMgPiAxICYmIHBkYXRhW25ieXRlcyAtIDFdID09IDB4ZmYgJiYKLQkJICAgIChwZGF0YVtuYnl0ZXMgLSAyXSAmIDB4ODApICE9IDApCi0JCQktLW5ieXRlczsKKyAgICAgICAgaWYgKHNpZ24gPT0gMCkgeworICAgICAgICAgICAgLyogSXQncyAwIC0tIGFuIGVtcHR5IGJ5dGVzdHJpbmcuICovCisgICAgICAgICAgICBjX3N0clswXSA9IExPTkcxOworICAgICAgICAgICAgY19zdHJbMV0gPSAwOworICAgICAgICAgICAgaSA9IHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIDIpOworICAgICAgICAgICAgaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICByZXMgPSAwOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIG5iaXRzID0gX1B5TG9uZ19OdW1CaXRzKGFyZ3MpOworICAgICAgICBpZiAobmJpdHMgPT0gKHNpemVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAvKiBIb3cgbWFueSBieXRlcyBkbyB3ZSBuZWVkPyAgVGhlcmUgYXJlIG5iaXRzID4+IDMgZnVsbAorICAgICAgICAgKiBieXRlcyBvZiBkYXRhLCBhbmQgbmJpdHMgJiA3IGxlZnRvdmVyIGJpdHMuICBJZiB0aGVyZQorICAgICAgICAgKiBhcmUgYW55IGxlZnRvdmVyIGJpdHMsIHRoZW4gd2UgY2xlYXJseSBuZWVkIGFub3RoZXIKKyAgICAgICAgICogYnl0ZS4gIFduYXQncyBub3Qgc28gb2J2aW91cyBpcyB0aGF0IHdlICpwcm9iYWJseSoKKyAgICAgICAgICogbmVlZCBhbm90aGVyIGJ5dGUgZXZlbiBpZiB0aGVyZSBhcmVuJ3QgYW55IGxlZnRvdmVyczoKKyAgICAgICAgICogdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBtb3N0LXNpZ25pZmljYW50IGJ5dGUKKyAgICAgICAgICogYWN0cyBsaWtlIGEgc2lnbiBiaXQsIGFuZCBpdCdzIHVzdWFsbHkgZ290IGEgc2Vuc2UKKyAgICAgICAgICogb3Bwb3NpdGUgb2YgdGhlIG9uZSB3ZSBuZWVkLiAgVGhlIGV4Y2VwdGlvbiBpcyBsb25ncworICAgICAgICAgKiBvZiB0aGUgZm9ybSAtKDIqKig4KmotMSkpIGZvciBqID4gMC4gIFN1Y2ggYSBsb25nIGlzCisgICAgICAgICAqIGl0cyBvd24gMjU2J3MtY29tcGxlbWVudCwgc28gaGFzIHRoZSByaWdodCBzaWduIGJpdAorICAgICAgICAgKiBldmVuIHdpdGhvdXQgdGhlIGV4dHJhIGJ5dGUuICBUaGF0J3MgYSBwYWluIHRvIGNoZWNrCisgICAgICAgICAqIGZvciBpbiBhZHZhbmNlLCB0aG91Z2gsIHNvIHdlIGFsd2F5cyBncmFiIGFuIGV4dHJhCisgICAgICAgICAqIGJ5dGUgYXQgdGhlIHN0YXJ0LCBhbmQgY3V0IGl0IGJhY2sgbGF0ZXIgaWYgcG9zc2libGUuCisgICAgICAgICAqLworICAgICAgICBuYnl0ZXMgPSAobmJpdHMgPj4gMykgKyAxOworICAgICAgICBpZiAobmJ5dGVzID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsb25nIHRvbyBsYXJnZSAiCisgICAgICAgICAgICAgICAgInRvIHBpY2tsZSIpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIHJlcHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAoaW50KW5ieXRlcyk7CisgICAgICAgIGlmIChyZXByID09IE5VTEwpIGdvdG8gZmluYWxseTsKKyAgICAgICAgcGRhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhyZXByKTsKKyAgICAgICAgaSA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKWFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwZGF0YSwgbmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBsaXR0bGUgZW5kaWFuICovLCAxIC8qIHNpZ25lZCAqLyk7CisgICAgICAgIGlmIChpIDwgMCkgZ290byBmaW5hbGx5OworICAgICAgICAvKiBJZiB0aGUgbG9uZyBpcyBuZWdhdGl2ZSwgdGhpcyBtYXkgYmUgYSBieXRlIG1vcmUgdGhhbgorICAgICAgICAgKiBuZWVkZWQuICBUaGlzIGlzIHNvIGlmZiB0aGUgTVNCIGlzIGFsbCByZWR1bmRhbnQgc2lnbgorICAgICAgICAgKiBiaXRzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNpZ24gPCAwICYmIG5ieXRlcyA+IDEgJiYgcGRhdGFbbmJ5dGVzIC0gMV0gPT0gMHhmZiAmJgorICAgICAgICAgICAgKHBkYXRhW25ieXRlcyAtIDJdICYgMHg4MCkgIT0gMCkKKyAgICAgICAgICAgIC0tbmJ5dGVzOwogCi0JCWlmIChuYnl0ZXMgPCAyNTYpIHsKLQkJCWNfc3RyWzBdID0gTE9ORzE7Ci0JCQljX3N0clsxXSA9IChjaGFyKW5ieXRlczsKLQkJCXNpemUgPSAyOwotCQl9Ci0JCWVsc2UgewotCQkJY19zdHJbMF0gPSBMT05HNDsKLQkJCXNpemUgPSAoaW50KW5ieXRlczsKLQkJCWZvciAoaSA9IDE7IGkgPCA1OyBpKyspIHsKLQkJCQljX3N0cltpXSA9IChjaGFyKShzaXplICYgMHhmZik7Ci0JCQkJc2l6ZSA+Pj0gODsKLQkJCX0KLQkJCXNpemUgPSA1OwotCQl9Ci0JCWkgPSBzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBzaXplKTsKLQkJaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7Ci0JCWkgPSBzZWxmLT53cml0ZV9mdW5jKHNlbGYsIChjaGFyICopcGRhdGEsIChpbnQpbmJ5dGVzKTsKLQkJaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7Ci0JCXJlcyA9IDA7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgICAgIGlmIChuYnl0ZXMgPCAyNTYpIHsKKyAgICAgICAgICAgIGNfc3RyWzBdID0gTE9ORzE7CisgICAgICAgICAgICBjX3N0clsxXSA9IChjaGFyKW5ieXRlczsKKyAgICAgICAgICAgIHNpemUgPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY19zdHJbMF0gPSBMT05HNDsKKyAgICAgICAgICAgIHNpemUgPSAoaW50KW5ieXRlczsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjX3N0cltpXSA9IChjaGFyKShzaXplICYgMHhmZik7CisgICAgICAgICAgICAgICAgc2l6ZSA+Pj0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemUgPSA1OworICAgICAgICB9CisgICAgICAgIGkgPSBzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBzaXplKTsKKyAgICAgICAgaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7CisgICAgICAgIGkgPSBzZWxmLT53cml0ZV9mdW5jKHNlbGYsIChjaGFyICopcGRhdGEsIChpbnQpbmJ5dGVzKTsKKyAgICAgICAgaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7CisgICAgICAgIHJlcyA9IDA7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQkvKiBwcm90byA8IDI6ICB3cml0ZSB0aGUgcmVwciBhbmQgbmV3bGluZS4gIFRoaXMgaXMgcXVhZHJhdGljLXRpbWUKLQkgKiAoaW4gdGhlIG51bWJlciBvZiBkaWdpdHMpLCBpbiBib3RoIGRpcmVjdGlvbnMuCi0JICovCi0JaWYgKCEoIHJlcHIgPSBQeU9iamVjdF9SZXByKGFyZ3MpKSkKLQkJZ290byBmaW5hbGx5OworICAgIC8qIHByb3RvIDwgMjogIHdyaXRlIHRoZSByZXByIGFuZCBuZXdsaW5lLiAgVGhpcyBpcyBxdWFkcmF0aWMtdGltZQorICAgICAqIChpbiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyksIGluIGJvdGggZGlyZWN0aW9ucy4KKyAgICAgKi8KKyAgICBpZiAoISggcmVwciA9IFB5T2JqZWN0X1JlcHIoYXJncykpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoKHNpemUgPSBQeVN0cmluZ19TaXplKHJlcHIpKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoKHNpemUgPSBQeVN0cmluZ19TaXplKHJlcHIpKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZsLCAxKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmbCwgMSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLAotCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcmVwciksCi0JCQkgICAgIAkJCXNpemUpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXJlcHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JcmVzID0gMDsKKyAgICByZXMgPSAwOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihyZXByKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X1hERUNSRUYocmVwcik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCiBzdGF0aWMgaW50CiBzYXZlX2Zsb2F0KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QgKilhcmdzKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQVNfRE9VQkxFKChQeUZsb2F0T2JqZWN0ICopYXJncyk7CiAKLQlpZiAoc2VsZi0+YmluKSB7Ci0JCWNoYXIgc3RyWzldOwotCQlzdHJbMF0gPSBCSU5GTE9BVDsKLQkJaWYgKF9QeUZsb2F0X1BhY2s4KHgsICh1bnNpZ25lZCBjaGFyICopJnN0clsxXSwgMCkgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBzdHIsIDkpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JZWxzZSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJY2hhciAqYnVmID0gTlVMTDsKLQkJY2hhciBvcCA9IEZMT0FUOworICAgIGlmIChzZWxmLT5iaW4pIHsKKyAgICAgICAgY2hhciBzdHJbOV07CisgICAgICAgIHN0clswXSA9IEJJTkZMT0FUOworICAgICAgICBpZiAoX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKikmc3RyWzFdLCAwKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHN0ciwgOSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IC0xOworICAgICAgICBjaGFyICpidWYgPSBOVUxMOworICAgICAgICBjaGFyIG9wID0gRkxPQVQ7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJm9wLCAxKSA8IDApCi0JCQlnb3RvIGRvbmU7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZvcCwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBkb25lOwogCi0JCWJ1ZiA9IFB5T1NfZG91YmxlX3RvX3N0cmluZyh4LCAnZycsIDE3LCAwLCBOVUxMKTsKLQkJaWYgKCFidWYpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KKyAgICAgICAgYnVmID0gUHlPU19kb3VibGVfdG9fc3RyaW5nKHgsICdnJywgMTcsIDAsIE5VTEwpOworICAgICAgICBpZiAoIWJ1ZikgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGJ1Ziwgc3RybGVuKGJ1ZikpIDwgMCkKLQkJCWdvdG8gZG9uZTsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgYnVmLCBzdHJsZW4oYnVmKSkgPCAwKQorICAgICAgICAgICAgZ290byBkb25lOwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJCWdvdG8gZG9uZTsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBkb25lOwogCi0JCXJlc3VsdCA9IDA7CisgICAgICAgIHJlc3VsdCA9IDA7CiBkb25lOgotCQlQeU1lbV9GcmVlKGJ1Zik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludAogc2F2ZV9zdHJpbmcoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBkb3B1dCkKIHsKLQlpbnQgc2l6ZSwgbGVuOwotCVB5T2JqZWN0ICpyZXByPTA7CisgICAgaW50IHNpemUsIGxlbjsKKyAgICBQeU9iamVjdCAqcmVwcj0wOwogCi0JaWYgKChzaXplID0gUHlTdHJpbmdfU2l6ZShhcmdzKSkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKChzaXplID0gUHlTdHJpbmdfU2l6ZShhcmdzKSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoIXNlbGYtPmJpbikgewotCQljaGFyICpyZXByX3N0cjsKKyAgICBpZiAoIXNlbGYtPmJpbikgeworICAgICAgICBjaGFyICpyZXByX3N0cjsKIAotCQlzdGF0aWMgY2hhciBzdHJpbmcgPSBTVFJJTkc7CisgICAgICAgIHN0YXRpYyBjaGFyIHN0cmluZyA9IFNUUklORzsKIAotCQlpZiAoISggcmVwciA9IFB5T2JqZWN0X1JlcHIoYXJncykpKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoISggcmVwciA9IFB5T2JqZWN0X1JlcHIoYXJncykpKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWlmICgobGVuID0gUHlTdHJpbmdfU2l6ZShyZXByKSkgPCAwKQotCQkJZ290byBlcnI7Ci0JCXJlcHJfc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXJlcHIpOworICAgICAgICBpZiAoKGxlbiA9IFB5U3RyaW5nX1NpemUocmVwcikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICByZXByX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilyZXByKTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc3RyaW5nLCAxKSA8IDApCi0JCQlnb3RvIGVycjsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnN0cmluZywgMSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgcmVwcl9zdHIsIGxlbikgPCAwKQotCQkJZ290byBlcnI7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHJlcHJfc3RyLCBsZW4pIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJCWdvdG8gZXJyOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKIAotCQlQeV9YREVDUkVGKHJlcHIpOwotCX0KLQllbHNlIHsKLQkJaW50IGk7Ci0JCWNoYXIgY19zdHJbNV07CisgICAgICAgIFB5X1hERUNSRUYocmVwcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY2hhciBjX3N0cls1XTsKIAotCQlpZiAoc2l6ZSA8IDI1NikgewotCQkJY19zdHJbMF0gPSBTSE9SVF9CSU5TVFJJTkc7Ci0JCQljX3N0clsxXSA9IHNpemU7Ci0JCQlsZW4gPSAyOwotCQl9Ci0JCWVsc2UgaWYgKHNpemUgPD0gSU5UX01BWCkgewotCQkJY19zdHJbMF0gPSBCSU5TVFJJTkc7Ci0JCQlmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQotCQkJCWNfc3RyW2ldID0gKGludCkoc2l6ZSA+PiAoKGkgLSAxKSAqIDgpKTsKLQkJCWxlbiA9IDU7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIC0xOyAgICAvKiBzdHJpbmcgdG9vIGxhcmdlICovCisgICAgICAgIGlmIChzaXplIDwgMjU2KSB7CisgICAgICAgICAgICBjX3N0clswXSA9IFNIT1JUX0JJTlNUUklORzsKKyAgICAgICAgICAgIGNfc3RyWzFdID0gc2l6ZTsKKyAgICAgICAgICAgIGxlbiA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2l6ZSA8PSBJTlRfTUFYKSB7CisgICAgICAgICAgICBjX3N0clswXSA9IEJJTlNUUklORzsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICAgICAgY19zdHJbaV0gPSAoaW50KShzaXplID4+ICgoaSAtIDEpICogOCkpOworICAgICAgICAgICAgbGVuID0gNTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gLTE7ICAgIC8qIHN0cmluZyB0b28gbGFyZ2UgKi8KIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgbGVuKSA8IDApCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBsZW4pIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpZiAoc2l6ZSA+IDEyOCAmJiBQZGF0YV9DaGVjayhzZWxmLT5maWxlKSkgewotCQkJaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIC0xOwotCQkJUERBVEFfQVBQRU5EKHNlbGYtPmZpbGUsIGFyZ3MsIC0xKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsCi0JCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAotCQkJCQkgICAgIAkoUHlTdHJpbmdPYmplY3QgKilhcmdzKSwKLQkJCQkJICAgICBzaXplKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgICAgICBpZiAoc2l6ZSA+IDEyOCAmJiBQZGF0YV9DaGVjayhzZWxmLT5maWxlKSkgeworICAgICAgICAgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIC0xOworICAgICAgICAgICAgUERBVEFfQVBQRU5EKHNlbGYtPmZpbGUsIGFyZ3MsIC0xKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlTdHJpbmdPYmplY3QgKilhcmdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoZG9wdXQpCi0JCWlmIChwdXQoc2VsZiwgYXJncykgPCAwKQotCQkJcmV0dXJuIC0xOworICAgIGlmIChkb3B1dCkKKyAgICAgICAgaWYgKHB1dChzZWxmLCBhcmdzKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIAogICBlcnI6Ci0JUHlfWERFQ1JFRihyZXByKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfWERFQ1JFRihyZXByKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIApAQCAtMTI5NCw3MSArMTI5NCw3MSBAQAogI2VuZGlmCiAKICAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gZXhwYW5kc2l6ZSkKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKICAgICByZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZXhwYW5kc2l6ZSAqIHNpemUpOwogICAgIGlmIChyZXByID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIGlmIChzaXplID09IDApCi0JcmV0dXJuIHJlcHI7CisgICAgcmV0dXJuIHJlcHI7CiAKICAgICBwID0gcSA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXByKTsKICAgICB3aGlsZSAoc2l6ZS0tID4gMCkgewotICAgICAgICBQeV9VTklDT0RFIGNoID0gKnMrKzsKKyAgICBQeV9VTklDT0RFIGNoID0gKnMrKzsKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKLQkvKiBNYXAgMzItYml0IGNoYXJhY3RlcnMgdG8gJ1xVeHh4eHh4eHgnICovCi0JaWYgKGNoID49IDB4MTAwMDApIHsKLSAgICAgICAgICAgICpwKysgPSAnXFwnOwotICAgICAgICAgICAgKnArKyA9ICdVJzsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMjgpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMjQpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMjApICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMTYpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMTIpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gOCkgJiAweGZdOwotICAgICAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiA0KSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbY2ggJiAxNV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQorICAgIC8qIE1hcCAzMi1iaXQgY2hhcmFjdGVycyB0byAnXFV4eHh4eHh4eCcgKi8KKyAgICBpZiAoY2ggPj0gMHgxMDAwMCkgeworICAgICAgICAqcCsrID0gJ1xcJzsKKyAgICAgICAgKnArKyA9ICdVJzsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiAyOCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDI0KSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMjApICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiAxNikgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDEyKSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gOCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDQpICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0W2NoICYgMTVdOworICAgIH0KKyAgICBlbHNlCiAjZWxzZQotCS8qIE1hcCBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzIHRvICdcVTAweHh4eHh4JyAqLwotCWlmIChjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERDMDApIHsKLQkgICAgUHlfVU5JQ09ERSBjaDI7Ci0JICAgIFB5X1VDUzQgdWNzOworICAgIC8qIE1hcCBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzIHRvICdcVTAweHh4eHh4JyAqLworICAgIGlmIChjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERDMDApIHsKKyAgICAgICAgUHlfVU5JQ09ERSBjaDI7CisgICAgICAgIFB5X1VDUzQgdWNzOwogCi0JICAgIGNoMiA9ICpzKys7Ci0JICAgIHNpemUtLTsKLQkgICAgaWYgKGNoMiA+PSAweERDMDAgJiYgY2gyIDw9IDB4REZGRikgewotCQl1Y3MgPSAoKChjaCAmIDB4MDNGRikgPDwgMTApIHwgKGNoMiAmIDB4MDNGRikpICsgMHgwMDAxMDAwMDsKLQkJKnArKyA9ICdcXCc7Ci0JCSpwKysgPSAnVSc7Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDI4KSAmIDB4Zl07Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDI0KSAmIDB4Zl07Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDIwKSAmIDB4Zl07Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDE2KSAmIDB4Zl07Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDEyKSAmIDB4Zl07Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDgpICYgMHhmXTsKLQkJKnArKyA9IGhleGRpZ2l0Wyh1Y3MgPj4gNCkgJiAweGZdOwotCQkqcCsrID0gaGV4ZGlnaXRbdWNzICYgMHhmXTsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgLyogRmFsbCB0aHJvdWdoOiBpc29sYXRlZCBzdXJyb2dhdGVzIGFyZSBjb3BpZWQgYXMtaXMgKi8KLQkgICAgcy0tOwotCSAgICBzaXplKys7Ci0JfQotI2VuZGlmCi0JLyogTWFwIDE2LWJpdCBjaGFyYWN0ZXJzIHRvICdcdXh4eHgnICovCi0JaWYgKGNoID49IDI1NiB8fCBjaCA9PSAnXFwnIHx8IGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICpwKysgPSAnXFwnOwotICAgICAgICAgICAgKnArKyA9ICd1JzsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMTIpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gOCkgJiAweGZdOwotICAgICAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiA0KSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbY2ggJiAxNV07CisgICAgICAgIGNoMiA9ICpzKys7CisgICAgICAgIHNpemUtLTsKKyAgICAgICAgaWYgKGNoMiA+PSAweERDMDAgJiYgY2gyIDw9IDB4REZGRikgeworICAgICAgICB1Y3MgPSAoKChjaCAmIDB4MDNGRikgPDwgMTApIHwgKGNoMiAmIDB4MDNGRikpICsgMHgwMDAxMDAwMDsKKyAgICAgICAgKnArKyA9ICdcXCc7CisgICAgICAgICpwKysgPSAnVSc7CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDI4KSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDI0KSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDIwKSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDE2KSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDEyKSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDgpICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0Wyh1Y3MgPj4gNCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbdWNzICYgMHhmXTsKKyAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLQkvKiBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBhcy1pcyAqLwotCWVsc2UKLSAgICAgICAgICAgICpwKysgPSAoY2hhcikgY2g7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaDogaXNvbGF0ZWQgc3Vycm9nYXRlcyBhcmUgY29waWVkIGFzLWlzICovCisgICAgICAgIHMtLTsKKyAgICAgICAgc2l6ZSsrOworICAgIH0KKyNlbmRpZgorICAgIC8qIE1hcCAxNi1iaXQgY2hhcmFjdGVycyB0byAnXHV4eHh4JyAqLworICAgIGlmIChjaCA+PSAyNTYgfHwgY2ggPT0gJ1xcJyB8fCBjaCA9PSAnXG4nKSB7CisgICAgICAgICpwKysgPSAnXFwnOworICAgICAgICAqcCsrID0gJ3UnOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDEyKSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gOCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDQpICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0W2NoICYgMTVdOworICAgIH0KKyAgICAvKiBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBhcy1pcyAqLworICAgIGVsc2UKKyAgICAgICAgKnArKyA9IChjaGFyKSBjaDsKICAgICB9CiAgICAgKnAgPSAnXDAnOwogICAgIF9QeVN0cmluZ19SZXNpemUoJnJlcHIsIHAgLSBxKTsKQEAgLTEzNjgsNzkgKzEzNjgsNzkgQEAKIHN0YXRpYyBpbnQKIHNhdmVfdW5pY29kZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGRvcHV0KQogewotCVB5X3NzaXplX3Qgc2l6ZSwgbGVuOwotCVB5T2JqZWN0ICpyZXByPTA7CisgICAgUHlfc3NpemVfdCBzaXplLCBsZW47CisgICAgUHlPYmplY3QgKnJlcHI9MDsKIAotCWlmICghUHlVbmljb2RlX0NoZWNrKGFyZ3MpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soYXJncykpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghc2VsZi0+YmluKSB7Ci0JCWNoYXIgKnJlcHJfc3RyOwotCQlzdGF0aWMgY2hhciBzdHJpbmcgPSBVTklDT0RFOworICAgIGlmICghc2VsZi0+YmluKSB7CisgICAgICAgIGNoYXIgKnJlcHJfc3RyOworICAgICAgICBzdGF0aWMgY2hhciBzdHJpbmcgPSBVTklDT0RFOwogCi0JCXJlcHIgPSBtb2RpZmllZF9FbmNvZGVSYXdVbmljb2RlRXNjYXBlKAotCQkJUHlVbmljb2RlX0FTX1VOSUNPREUoYXJncyksIFB5VW5pY29kZV9HRVRfU0laRShhcmdzKSk7Ci0JCWlmICghcmVwcikKLQkJCXJldHVybiAtMTsKKyAgICAgICAgcmVwciA9IG1vZGlmaWVkX0VuY29kZVJhd1VuaWNvZGVFc2NhcGUoCisgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmdzKSwgUHlVbmljb2RlX0dFVF9TSVpFKGFyZ3MpKTsKKyAgICAgICAgaWYgKCFyZXByKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWlmICgobGVuID0gUHlTdHJpbmdfU2l6ZShyZXByKSkgPCAwKQotCQkJZ290byBlcnI7Ci0JCXJlcHJfc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXJlcHIpOworICAgICAgICBpZiAoKGxlbiA9IFB5U3RyaW5nX1NpemUocmVwcikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICByZXByX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilyZXByKTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc3RyaW5nLCAxKSA8IDApCi0JCQlnb3RvIGVycjsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnN0cmluZywgMSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgcmVwcl9zdHIsIGxlbikgPCAwKQotCQkJZ290byBlcnI7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHJlcHJfc3RyLCBsZW4pIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJCWdvdG8gZXJyOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKIAotCQlQeV9YREVDUkVGKHJlcHIpOwotCX0KLQllbHNlIHsKLQkJaW50IGk7Ci0JCWNoYXIgY19zdHJbNV07CisgICAgICAgIFB5X1hERUNSRUYocmVwcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY2hhciBjX3N0cls1XTsKIAotCQlpZiAoISggcmVwciA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoYXJncykpKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoISggcmVwciA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoYXJncykpKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWlmICgoc2l6ZSA9IFB5U3RyaW5nX1NpemUocmVwcikpIDwgMCkKLQkJCWdvdG8gZXJyOwotCQlpZiAoc2l6ZSA+IElOVF9NQVgpCi0JCQlyZXR1cm4gLTE7ICAgLyogc3RyaW5nIHRvbyBsYXJnZSAqLworICAgICAgICBpZiAoKHNpemUgPSBQeVN0cmluZ19TaXplKHJlcHIpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgaWYgKHNpemUgPiBJTlRfTUFYKQorICAgICAgICAgICAgcmV0dXJuIC0xOyAgIC8qIHN0cmluZyB0b28gbGFyZ2UgKi8KIAotCQljX3N0clswXSA9IEJJTlVOSUNPREU7Ci0JCWZvciAoaSA9IDE7IGkgPCA1OyBpKyspCi0JCQljX3N0cltpXSA9IChpbnQpKHNpemUgPj4gKChpIC0gMSkgKiA4KSk7Ci0JCWxlbiA9IDU7CisgICAgICAgIGNfc3RyWzBdID0gQklOVU5JQ09ERTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIGNfc3RyW2ldID0gKGludCkoc2l6ZSA+PiAoKGkgLSAxKSAqIDgpKTsKKyAgICAgICAgbGVuID0gNTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgbGVuKSA8IDApCi0JCQlnb3RvIGVycjsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CiAKLQkJaWYgKHNpemUgPiAxMjggJiYgUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKLQkJCWlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApCi0JCQkJZ290byBlcnI7Ci0JCQlQREFUQV9BUFBFTkQoc2VsZi0+ZmlsZSwgcmVwciwgLTEpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHJlcHIpLAotCQkJCQkgICAgIHNpemUpIDwgMCkKLQkJCQlnb3RvIGVycjsKLQkJfQorICAgICAgICBpZiAoc2l6ZSA+IDEyOCAmJiBQZGF0YV9DaGVjayhzZWxmLT5maWxlKSkgeworICAgICAgICAgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIFBEQVRBX0FQUEVORChzZWxmLT5maWxlLCByZXByLCAtMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBQeVN0cmluZ19BU19TVFJJTkcocmVwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KIAotCQlQeV9ERUNSRUYocmVwcik7Ci0JfQorICAgICAgICBQeV9ERUNSRUYocmVwcik7CisgICAgfQogCi0JaWYgKGRvcHV0KQotCQlpZiAocHV0KHNlbGYsIGFyZ3MpIDwgMCkKLQkJCXJldHVybiAtMTsKKyAgICBpZiAoZG9wdXQpCisgICAgICAgIGlmIChwdXQoc2VsZiwgYXJncykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKICAgZXJyOgotCVB5X1hERUNSRUYocmVwcik7Ci0JcmV0dXJuIC0xOworICAgIFB5X1hERUNSRUYocmVwcik7CisgICAgcmV0dXJuIC0xOwogfQogI2VuZGlmCiAKQEAgLTE0NDgsMjMgKzE0NDgsMjMgQEAKIHN0YXRpYyBpbnQKIHN0b3JlX3R1cGxlX2VsZW1lbnRzKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0LCBpbnQgbGVuKQogewotCWludCBpOwotCWludCByZXMgPSAtMTsJLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLworICAgIGludCBpOworICAgIGludCByZXMgPSAtMTsgICAgICAgLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLwogCi0JYXNzZXJ0KFB5VHVwbGVfU2l6ZSh0KSA9PSBsZW4pOworICAgIGFzc2VydChQeVR1cGxlX1NpemUodCkgPT0gbGVuKTsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqZWxlbWVudCA9IFB5VHVwbGVfR0VUX0lURU0odCwgaSk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICplbGVtZW50ID0gUHlUdXBsZV9HRVRfSVRFTSh0LCBpKTsKIAotCQlpZiAoZWxlbWVudCA9PSBOVUxMKQotCQkJZ290byBmaW5hbGx5OwotCQlpZiAoc2F2ZShzZWxmLCBlbGVtZW50LCAwKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQotCXJlcyA9IDA7CisgICAgICAgIGlmIChlbGVtZW50ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmIChzYXZlKHNlbGYsIGVsZW1lbnQsIDApIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgcmVzID0gMDsKIAogICBmaW5hbGx5OgotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogVHVwbGVzIGFyZSB1YmlxdWl0b3VzIGluIHRoZSBwaWNrbGUgcHJvdG9jb2xzLCBzbyBtYW55IHRlY2huaXF1ZXMgYXJlCkBAIC0xNDc2LDEwOCArMTQ3NiwxMDggQEAKIHN0YXRpYyBpbnQKIHNhdmVfdHVwbGUoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnB5X3R1cGxlX2lkID0gTlVMTDsKLQlpbnQgbGVuLCBpOwotCWludCByZXMgPSAtMTsKKyAgICBQeU9iamVjdCAqcHlfdHVwbGVfaWQgPSBOVUxMOworICAgIGludCBsZW4sIGk7CisgICAgaW50IHJlcyA9IC0xOwogCi0Jc3RhdGljIGNoYXIgdHVwbGUgPSBUVVBMRTsKLQlzdGF0aWMgY2hhciBwb3AgPSBQT1A7Ci0Jc3RhdGljIGNoYXIgcG9wX21hcmsgPSBQT1BfTUFSSzsKLQlzdGF0aWMgY2hhciBsZW4yb3Bjb2RlW10gPSB7RU1QVFlfVFVQTEUsIFRVUExFMSwgVFVQTEUyLCBUVVBMRTN9OworICAgIHN0YXRpYyBjaGFyIHR1cGxlID0gVFVQTEU7CisgICAgc3RhdGljIGNoYXIgcG9wID0gUE9QOworICAgIHN0YXRpYyBjaGFyIHBvcF9tYXJrID0gUE9QX01BUks7CisgICAgc3RhdGljIGNoYXIgbGVuMm9wY29kZVtdID0ge0VNUFRZX1RVUExFLCBUVVBMRTEsIFRVUExFMiwgVFVQTEUzfTsKIAotCWlmICgobGVuID0gUHlUdXBsZV9TaXplKGFyZ3MpKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoKGxlbiA9IFB5VHVwbGVfU2l6ZShhcmdzKSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAobGVuID09IDApIHsKLQkJY2hhciBjX3N0clsyXTsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgY2hhciBjX3N0clsyXTsKIAotCQlpZiAoc2VsZi0+cHJvdG8pIHsKLQkJCWNfc3RyWzBdID0gRU1QVFlfVFVQTEU7Ci0JCQlsZW4gPSAxOwotCQl9Ci0JCWVsc2UgewotCQkJY19zdHJbMF0gPSBNQVJLOwotCQkJY19zdHJbMV0gPSBUVVBMRTsKLQkJCWxlbiA9IDI7Ci0JCX0KLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPj0gMCkKLQkJCXJlcyA9IDA7Ci0JCS8qIERvbid0IG1lbW9pemUgYW4gZW1wdHkgdHVwbGUuICovCi0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgICAgIGlmIChzZWxmLT5wcm90bykgeworICAgICAgICAgICAgY19zdHJbMF0gPSBFTVBUWV9UVVBMRTsKKyAgICAgICAgICAgIGxlbiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjX3N0clswXSA9IE1BUks7CisgICAgICAgICAgICBjX3N0clsxXSA9IFRVUExFOworICAgICAgICAgICAgbGVuID0gMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgbGVuKSA+PSAwKQorICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgLyogRG9uJ3QgbWVtb2l6ZSBhbiBlbXB0eSB0dXBsZS4gKi8KKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCS8qIEEgbm9uLWVtcHR5IHR1cGxlLiAqLworICAgIC8qIEEgbm9uLWVtcHR5IHR1cGxlLiAqLwogCi0JLyogaWQodHVwbGUpIGlzbid0IGluIHRoZSBtZW1vIG5vdy4gIElmIGl0IHNob3dzIHVwIHRoZXJlIGFmdGVyCi0JICogc2F2aW5nIHRoZSB0dXBsZSBlbGVtZW50cywgdGhlIHR1cGxlIG11c3QgYmUgcmVjdXJzaXZlLCBpbgotCSAqIHdoaWNoIGNhc2Ugd2UnbGwgcG9wIGV2ZXJ5dGhpbmcgd2UgcHV0IG9uIHRoZSBzdGFjaywgYW5kIGZldGNoCi0JICogaXRzIHZhbHVlIGZyb20gdGhlIG1lbW8uCi0JICovCi0JcHlfdHVwbGVfaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoYXJncyk7Ci0JaWYgKHB5X3R1cGxlX2lkID09IE5VTEwpCi0JCWdvdG8gZmluYWxseTsKKyAgICAvKiBpZCh0dXBsZSkgaXNuJ3QgaW4gdGhlIG1lbW8gbm93LiAgSWYgaXQgc2hvd3MgdXAgdGhlcmUgYWZ0ZXIKKyAgICAgKiBzYXZpbmcgdGhlIHR1cGxlIGVsZW1lbnRzLCB0aGUgdHVwbGUgbXVzdCBiZSByZWN1cnNpdmUsIGluCisgICAgICogd2hpY2ggY2FzZSB3ZSdsbCBwb3AgZXZlcnl0aGluZyB3ZSBwdXQgb24gdGhlIHN0YWNrLCBhbmQgZmV0Y2gKKyAgICAgKiBpdHMgdmFsdWUgZnJvbSB0aGUgbWVtby4KKyAgICAgKi8KKyAgICBweV90dXBsZV9pZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cihhcmdzKTsKKyAgICBpZiAocHlfdHVwbGVfaWQgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKGxlbiA8PSAzICYmIHNlbGYtPnByb3RvID49IDIpIHsKLQkJLyogVXNlIFRVUExFezEsMiwzfSBvcGNvZGVzLiAqLwotCQlpZiAoc3RvcmVfdHVwbGVfZWxlbWVudHMoc2VsZiwgYXJncywgbGVuKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JCWlmIChQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBweV90dXBsZV9pZCkpIHsKLQkJCS8qIHBvcCB0aGUgbGVuIGVsZW1lbnRzICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCi0JCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBvcCwgMSkgPCAwKQotCQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQkvKiBmZXRjaCBmcm9tIG1lbW8gKi8KLQkJCWlmIChnZXQoc2VsZiwgcHlfdHVwbGVfaWQpIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQlyZXMgPSAwOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCS8qIE5vdCByZWN1cnNpdmUuICovCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGxlbjJvcGNvZGUgKyBsZW4sIDEpIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKLQkJZ290byBtZW1vaXplOwotCX0KKyAgICBpZiAobGVuIDw9IDMgJiYgc2VsZi0+cHJvdG8gPj0gMikgeworICAgICAgICAvKiBVc2UgVFVQTEV7MSwyLDN9IG9wY29kZXMuICovCisgICAgICAgIGlmIChzdG9yZV90dXBsZV9lbGVtZW50cyhzZWxmLCBhcmdzLCBsZW4pIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X3R1cGxlX2lkKSkgeworICAgICAgICAgICAgLyogcG9wIHRoZSBsZW4gZWxlbWVudHMgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICAgICAgICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmcG9wLCAxKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIC8qIGZldGNoIGZyb20gbWVtbyAqLworICAgICAgICAgICAgaWYgKGdldChzZWxmLCBweV90dXBsZV9pZCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgLyogTm90IHJlY3Vyc2l2ZS4gKi8KKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgbGVuMm9wY29kZSArIGxlbiwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICBnb3RvIG1lbW9pemU7CisgICAgfQogCi0JLyogcHJvdG8gPCAyIGFuZCBsZW4gPiAwLCBvciBwcm90byA+PSAyIGFuZCBsZW4gPiAzLgotCSAqIEdlbmVyYXRlIE1BUksgZWx0MSBlbHQyIC4uLiBUVVBMRQotCSAqLwotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZNQVJLdiwgMSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgLyogcHJvdG8gPCAyIGFuZCBsZW4gPiAwLCBvciBwcm90byA+PSAyIGFuZCBsZW4gPiAzLgorICAgICAqIEdlbmVyYXRlIE1BUksgZWx0MSBlbHQyIC4uLiBUVVBMRQorICAgICAqLworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZNQVJLdiwgMSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoc3RvcmVfdHVwbGVfZWxlbWVudHMoc2VsZiwgYXJncywgbGVuKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc3RvcmVfdHVwbGVfZWxlbWVudHMoc2VsZiwgYXJncywgbGVuKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBweV90dXBsZV9pZCkpIHsKLQkJLyogcG9wIHRoZSBzdGFjayBzdHVmZiB3ZSBwdXNoZWQgKi8KLQkJaWYgKHNlbGYtPmJpbikgewotCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBvcF9tYXJrLCAxKSA8IDApCi0JCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWVsc2UgewotCQkJLyogTm90ZSB0aGF0IHdlIHBvcCBvbmUgbW9yZSB0aGFuIGxlbiwgdG8gcmVtb3ZlCi0JCQkgKiB0aGUgTUFSSyB0b28uCi0JCQkgKi8KLQkJCWZvciAoaSA9IDA7IGkgPD0gbGVuOyBpKyspCi0JCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBvcCwgMSkgPCAwKQotCQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJLyogZmV0Y2ggZnJvbSBtZW1vICovCi0JCWlmIChnZXQoc2VsZiwgcHlfdHVwbGVfaWQpID49IDApCi0JCQlyZXMgPSAwOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmIChQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBweV90dXBsZV9pZCkpIHsKKyAgICAgICAgLyogcG9wIHRoZSBzdGFjayBzdHVmZiB3ZSBwdXNoZWQgKi8KKyAgICAgICAgaWYgKHNlbGYtPmJpbikgeworICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBvcF9tYXJrLCAxKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogTm90ZSB0aGF0IHdlIHBvcCBvbmUgbW9yZSB0aGFuIGxlbiwgdG8gcmVtb3ZlCisgICAgICAgICAgICAgKiB0aGUgTUFSSyB0b28uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbGVuOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBvcCwgMSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgLyogZmV0Y2ggZnJvbSBtZW1vICovCisgICAgICAgIGlmIChnZXQoc2VsZiwgcHlfdHVwbGVfaWQpID49IDApCisgICAgICAgICAgICByZXMgPSAwOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JLyogTm90IHJlY3Vyc2l2ZS4gKi8KLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmdHVwbGUsIDEpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIC8qIE5vdCByZWN1cnNpdmUuICovCisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnR1cGxlLCAxKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAogICBtZW1vaXplOgotCWlmIChwdXQoc2VsZiwgYXJncykgPj0gMCkKLQkJcmVzID0gMDsKKyAgICBpZiAocHV0KHNlbGYsIGFyZ3MpID49IDApCisgICAgICAgIHJlcyA9IDA7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHB5X3R1cGxlX2lkKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X1hERUNSRUYocHlfdHVwbGVfaWQpOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qIGl0ZXIgaXMgYW4gaXRlcmF0b3IgZ2l2aW5nIGl0ZW1zLCBhbmQgd2UgYmF0Y2ggdXAgY2h1bmtzIG9mCkBAIC0xNTg5LDE1NyArMTU4OSwxNTcgQEAKIHN0YXRpYyBpbnQKIGJhdGNoX2xpc3QoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKml0ZXIpCiB7Ci0JUHlPYmplY3QgKm9iaiA9IE5VTEw7Ci0JUHlPYmplY3QgKmZpcnN0aXRlbSA9IE5VTEw7Ci0JaW50IGksIG47CisgICAgUHlPYmplY3QgKm9iaiA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZpcnN0aXRlbSA9IE5VTEw7CisgICAgaW50IGksIG47CiAKLQlzdGF0aWMgY2hhciBhcHBlbmQgPSBBUFBFTkQ7Ci0Jc3RhdGljIGNoYXIgYXBwZW5kcyA9IEFQUEVORFM7CisgICAgc3RhdGljIGNoYXIgYXBwZW5kID0gQVBQRU5EOworICAgIHN0YXRpYyBjaGFyIGFwcGVuZHMgPSBBUFBFTkRTOwogCi0JYXNzZXJ0KGl0ZXIgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGl0ZXIgIT0gTlVMTCk7CiAKLQlpZiAoc2VsZi0+cHJvdG8gPT0gMCkgewotCQkvKiBBUFBFTkRTIGlzbid0IGF2YWlsYWJsZTsgZG8gb25lIGF0IGEgdGltZS4gKi8KLQkJZm9yICg7OykgewotCQkJb2JqID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCQlpZiAob2JqID09IE5VTEwpIHsKLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaSA9IHNhdmUoc2VsZiwgb2JqLCAwKTsKLQkJCVB5X0RFQ1JFRihvYmopOwotCQkJaWYgKGkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZhcHBlbmQsIDEpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChzZWxmLT5wcm90byA9PSAwKSB7CisgICAgICAgIC8qIEFQUEVORFMgaXNuJ3QgYXZhaWxhYmxlOyBkbyBvbmUgYXQgYSB0aW1lLiAqLworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBvYmogPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpID0gc2F2ZShzZWxmLCBvYmosIDApOworICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmFwcGVuZCwgMSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBwcm90byA+IDA6ICB3cml0ZSBpbiBiYXRjaGVzIG9mIEJBVENIU0laRS4gKi8KLQlkbyB7Ci0JCS8qIEdldCBmaXJzdCBpdGVtICovCi0JCWZpcnN0aXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQlpZiAoZmlyc3RpdGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgLyogcHJvdG8gPiAwOiAgd3JpdGUgaW4gYmF0Y2hlcyBvZiBCQVRDSFNJWkUuICovCisgICAgZG8geworICAgICAgICAvKiBHZXQgZmlyc3QgaXRlbSAqLworICAgICAgICBmaXJzdGl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgaWYgKGZpcnN0aXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOwogCi0JCQkvKiBub3RoaW5nIG1vcmUgdG8gYWRkICovCi0JCQlicmVhazsKLQkJfQorICAgICAgICAgICAgLyogbm90aGluZyBtb3JlIHRvIGFkZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQkvKiBUcnkgdG8gZ2V0IGEgc2Vjb25kIGl0ZW0gKi8KLQkJb2JqID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCWlmIChvYmogPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgLyogVHJ5IHRvIGdldCBhIHNlY29uZCBpdGVtICovCisgICAgICAgIG9iaiA9IFB5SXRlcl9OZXh0KGl0ZXIpOworICAgICAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CiAKLQkJCS8qIE9ubHkgb25lIGl0ZW0gdG8gd3JpdGUgKi8KLQkJCWlmIChzYXZlKHNlbGYsIGZpcnN0aXRlbSwgMCkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYXBwZW5kLCAxKSA8IDApCi0JCQkJZ290byBCYXRjaEZhaWxlZDsKLQkJCVB5X0NMRUFSKGZpcnN0aXRlbSk7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICAgICAgLyogT25seSBvbmUgaXRlbSB0byB3cml0ZSAqLworICAgICAgICAgICAgaWYgKHNhdmUoc2VsZiwgZmlyc3RpdGVtLCAwKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZhcHBlbmQsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIoZmlyc3RpdGVtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJLyogTW9yZSB0aGFuIG9uZSBpdGVtIHRvIHdyaXRlICovCisgICAgICAgIC8qIE1vcmUgdGhhbiBvbmUgaXRlbSB0byB3cml0ZSAqLwogCi0JCS8qIFB1bXAgb3V0IE1BUkssIGl0ZW1zLCBBUFBFTkRTLiAqLwotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmTUFSS3YsIDEpIDwgMCkKLQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQotCQlpZiAoc2F2ZShzZWxmLCBmaXJzdGl0ZW0sIDApIDwgMCkKLQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCVB5X0NMRUFSKGZpcnN0aXRlbSk7Ci0JCW4gPSAxOwotCQkKLQkJLyogRmV0Y2ggYW5kIHNhdmUgdXAgdG8gQkFUQ0hTSVpFIGl0ZW1zICovCi0JCXdoaWxlIChvYmopIHsKLQkJCWlmIChzYXZlKHNlbGYsIG9iaiwgMCkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlQeV9DTEVBUihvYmopOwotCQkJbiArPSAxOwotCQkJCi0JCQlpZiAobiA9PSBCQVRDSFNJWkUpCi0JCQkJYnJlYWs7CisgICAgICAgIC8qIFB1bXAgb3V0IE1BUkssIGl0ZW1zLCBBUFBFTkRTLiAqLworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmTUFSS3YsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CiAKLQkJCW9iaiA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQkJaWYgKG9iaiA9PSBOVUxMKSB7Ci0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKHNhdmUoc2VsZiwgZmlyc3RpdGVtLCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICBQeV9DTEVBUihmaXJzdGl0ZW0pOworICAgICAgICBuID0gMTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYXBwZW5kcywgMSkgPCAwKQotCQkJZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgLyogRmV0Y2ggYW5kIHNhdmUgdXAgdG8gQkFUQ0hTSVpFIGl0ZW1zICovCisgICAgICAgIHdoaWxlIChvYmopIHsKKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIG9iaiwgMCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgICAgICBQeV9DTEVBUihvYmopOworICAgICAgICAgICAgbiArPSAxOwogCi0JfSB3aGlsZSAobiA9PSBCQVRDSFNJWkUpOwotCXJldHVybiAwOworICAgICAgICAgICAgaWYgKG4gPT0gQkFUQ0hTSVpFKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBvYmogPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmFwcGVuZHMsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisKKyAgICB9IHdoaWxlIChuID09IEJBVENIU0laRSk7CisgICAgcmV0dXJuIDA7CiAKIEJhdGNoRmFpbGVkOgotCVB5X1hERUNSRUYoZmlyc3RpdGVtKTsKLQlQeV9YREVDUkVGKG9iaik7Ci0JcmV0dXJuIC0xOworICAgIFB5X1hERUNSRUYoZmlyc3RpdGVtKTsKKyAgICBQeV9YREVDUkVGKG9iaik7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW50CiBzYXZlX2xpc3QoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJlcyA9IC0xOwotCWNoYXIgc1szXTsKLQlpbnQgbGVuOwotCVB5T2JqZWN0ICppdGVyOworICAgIGludCByZXMgPSAtMTsKKyAgICBjaGFyIHNbM107CisgICAgaW50IGxlbjsKKyAgICBQeU9iamVjdCAqaXRlcjsKIAotCWlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfZW50ZXIoc2VsZiwgYXJncykpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+ZmFzdCAmJiAhZmFzdF9zYXZlX2VudGVyKHNlbGYsIGFyZ3MpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkvKiBDcmVhdGUgYW4gZW1wdHkgbGlzdC4gKi8KLQlpZiAoc2VsZi0+YmluKSB7Ci0JCXNbMF0gPSBFTVBUWV9MSVNUOwotCQlsZW4gPSAxOwotCX0KLQllbHNlIHsKLQkJc1swXSA9IE1BUks7Ci0JCXNbMV0gPSBMSVNUOwotCQlsZW4gPSAyOwotCX0KKyAgICAvKiBDcmVhdGUgYW4gZW1wdHkgbGlzdC4gKi8KKyAgICBpZiAoc2VsZi0+YmluKSB7CisgICAgICAgIHNbMF0gPSBFTVBUWV9MSVNUOworICAgICAgICBsZW4gPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc1swXSA9IE1BUks7CisgICAgICAgIHNbMV0gPSBMSVNUOworICAgICAgICBsZW4gPSAyOworICAgIH0KIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHMsIGxlbikgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgcywgbGVuKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIEdldCBsaXN0IGxlbmd0aCwgYW5kIGJvdyBvdXQgZWFybHkgaWYgZW1wdHkuICovCi0JaWYgKChsZW4gPSBQeUxpc3RfU2l6ZShhcmdzKSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgLyogR2V0IGxpc3QgbGVuZ3RoLCBhbmQgYm93IG91dCBlYXJseSBpZiBlbXB0eS4gKi8KKyAgICBpZiAoKGxlbiA9IFB5TGlzdF9TaXplKGFyZ3MpKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIE1lbW9pemUuICovCi0JaWYgKGxlbiA9PSAwKSB7Ci0JCWlmIChwdXQoc2VsZiwgYXJncykgPj0gMCkKLQkJCXJlcyA9IDA7Ci0JCWdvdG8gZmluYWxseTsKLQl9Ci0JaWYgKHB1dDIoc2VsZiwgYXJncykgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgLyogTWVtb2l6ZS4gKi8KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgaWYgKHB1dChzZWxmLCBhcmdzKSA+PSAwKQorICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBpZiAocHV0MihzZWxmLCBhcmdzKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIE1hdGVyaWFsaXplIHRoZSBsaXN0IGVsZW1lbnRzLiAqLwotCWl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKGFyZ3MpOwotCWlmIChpdGVyID09IE5VTEwpCi0JCWdvdG8gZmluYWxseTsKKyAgICAvKiBNYXRlcmlhbGl6ZSB0aGUgbGlzdCBlbGVtZW50cy4gKi8KKyAgICBpdGVyID0gUHlPYmplY3RfR2V0SXRlcihhcmdzKTsKKyAgICBpZiAoaXRlciA9PSBOVUxMKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgcGlja2xpbmcgYW4gb2JqZWN0IikgPT0gMCkKLQl7Ci0JCXJlcyA9IGJhdGNoX2xpc3Qoc2VsZiwgaXRlcik7Ci0JCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCX0KLQlQeV9ERUNSRUYoaXRlcik7CisgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIHBpY2tsaW5nIGFuIG9iamVjdCIpID09IDApCisgICAgeworICAgICAgICByZXMgPSBiYXRjaF9saXN0KHNlbGYsIGl0ZXIpOworICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0ZXIpOwogCiAgIGZpbmFsbHk6Ci0JaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9sZWF2ZShzZWxmLCBhcmdzKSkKLQkJcmVzID0gLTE7CisgICAgaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9sZWF2ZShzZWxmLCBhcmdzKSkKKyAgICAgICAgcmVzID0gLTE7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIApAQCAtMTc1NywxMjMgKzE3NTcsMTIzIEBACiBzdGF0aWMgaW50CiBiYXRjaF9kaWN0KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppdGVyKQogewotCVB5T2JqZWN0ICpwID0gTlVMTDsKLQlQeU9iamVjdCAqZmlyc3RpdGVtID0gTlVMTDsKLQlpbnQgaSwgbjsKKyAgICBQeU9iamVjdCAqcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZpcnN0aXRlbSA9IE5VTEw7CisgICAgaW50IGksIG47CiAKLQlzdGF0aWMgY2hhciBzZXRpdGVtID0gU0VUSVRFTTsKLQlzdGF0aWMgY2hhciBzZXRpdGVtcyA9IFNFVElURU1TOworICAgIHN0YXRpYyBjaGFyIHNldGl0ZW0gPSBTRVRJVEVNOworICAgIHN0YXRpYyBjaGFyIHNldGl0ZW1zID0gU0VUSVRFTVM7CiAKLQlhc3NlcnQoaXRlciAhPSBOVUxMKTsKKyAgICBhc3NlcnQoaXRlciAhPSBOVUxMKTsKIAotCWlmIChzZWxmLT5wcm90byA9PSAwKSB7Ci0JCS8qIFNFVElURU1TIGlzbid0IGF2YWlsYWJsZTsgZG8gb25lIGF0IGEgdGltZS4gKi8KLQkJZm9yICg7OykgewotCQkJcCA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQkJaWYgKHAgPT0gTlVMTCkgewotCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIVB5VHVwbGVfQ2hlY2socCkgfHwgUHlUdXBsZV9TaXplKHApICE9IDIpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGljdCBpdGVtcyAiCi0JCQkJCSJpdGVyYXRvciBtdXN0IHJldHVybiAyLXR1cGxlcyIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWkgPSBzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0ocCwgMCksIDApOwotCQkJaWYgKGkgPj0gMCkKLQkJCQlpID0gc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKHAsIDEpLCAwKTsKLQkJCVB5X0RFQ1JFRihwKTsKLQkJCWlmIChpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc2V0aXRlbSwgMSkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKHNlbGYtPnByb3RvID09IDApIHsKKyAgICAgICAgLyogU0VUSVRFTVMgaXNuJ3QgYXZhaWxhYmxlOyBkbyBvbmUgYXQgYSB0aW1lLiAqLworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBwID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghUHlUdXBsZV9DaGVjayhwKSB8fCBQeVR1cGxlX1NpemUocCkgIT0gMikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJkaWN0IGl0ZW1zICIKKyAgICAgICAgICAgICAgICAgICAgIml0ZXJhdG9yIG11c3QgcmV0dXJuIDItdHVwbGVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSA9IHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShwLCAwKSwgMCk7CisgICAgICAgICAgICBpZiAoaSA+PSAwKQorICAgICAgICAgICAgICAgIGkgPSBzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0ocCwgMSksIDApOworICAgICAgICAgICAgUHlfREVDUkVGKHApOworICAgICAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZzZXRpdGVtLCAxKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIHByb3RvID4gMDogIHdyaXRlIGluIGJhdGNoZXMgb2YgQkFUQ0hTSVpFLiAqLwotCWRvIHsKLQkJLyogR2V0IGZpcnN0IGl0ZW0gKi8KLQkJZmlyc3RpdGVtID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCWlmIChmaXJzdGl0ZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBCYXRjaEZhaWxlZDsKKyAgICAvKiBwcm90byA+IDA6ICB3cml0ZSBpbiBiYXRjaGVzIG9mIEJBVENIU0laRS4gKi8KKyAgICBkbyB7CisgICAgICAgIC8qIEdldCBmaXJzdCBpdGVtICovCisgICAgICAgIGZpcnN0aXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXIpOworICAgICAgICBpZiAoZmlyc3RpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CiAKLQkJCS8qIG5vdGhpbmcgbW9yZSB0byBhZGQgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghUHlUdXBsZV9DaGVjayhmaXJzdGl0ZW0pIHx8IFB5VHVwbGVfU2l6ZShmaXJzdGl0ZW0pICE9IDIpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJkaWN0IGl0ZW1zICIKLQkJCQkJIml0ZXJhdG9yIG11c3QgcmV0dXJuIDItdHVwbGVzIik7Ci0JCQlnb3RvIEJhdGNoRmFpbGVkOwotCQl9CisgICAgICAgICAgICAvKiBub3RoaW5nIG1vcmUgdG8gYWRkICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soZmlyc3RpdGVtKSB8fCBQeVR1cGxlX1NpemUoZmlyc3RpdGVtKSAhPSAyKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGljdCBpdGVtcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdG9yIG11c3QgcmV0dXJuIDItdHVwbGVzIik7CisgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICB9CiAKLQkJLyogVHJ5IHRvIGdldCBhIHNlY29uZCBpdGVtICovCi0JCXAgPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJaWYgKHAgPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgLyogVHJ5IHRvIGdldCBhIHNlY29uZCBpdGVtICovCisgICAgICAgIHAgPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKIAotCQkJLyogT25seSBvbmUgaXRlbSB0byB3cml0ZSAqLwotCQkJaWYgKHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShmaXJzdGl0ZW0sIDApLCAwKSA8IDApCi0JCQkJZ290byBCYXRjaEZhaWxlZDsKLQkJCWlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0oZmlyc3RpdGVtLCAxKSwgMCkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc2V0aXRlbSwgMSkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlQeV9DTEVBUihmaXJzdGl0ZW0pOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgICAgIC8qIE9ubHkgb25lIGl0ZW0gdG8gd3JpdGUgKi8KKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0oZmlyc3RpdGVtLCAwKSwgMCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKGZpcnN0aXRlbSwgMSksIDApIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnNldGl0ZW0sIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIoZmlyc3RpdGVtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJLyogTW9yZSB0aGFuIG9uZSBpdGVtIHRvIHdyaXRlICovCisgICAgICAgIC8qIE1vcmUgdGhhbiBvbmUgaXRlbSB0byB3cml0ZSAqLwogCi0JCS8qIFB1bXAgb3V0IE1BUkssIGl0ZW1zLCBTRVRJVEVNUy4gKi8KLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJk1BUkt2LCAxKSA8IDApCi0JCQlnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAvKiBQdW1wIG91dCBNQVJLLCBpdGVtcywgU0VUSVRFTVMuICovCisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZNQVJLdiwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKIAotCQlpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKGZpcnN0aXRlbSwgMCksIDApIDwgMCkKLQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCWlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0oZmlyc3RpdGVtLCAxKSwgMCkgPCAwKQotCQkJZ290byBCYXRjaEZhaWxlZDsKLQkJUHlfQ0xFQVIoZmlyc3RpdGVtKTsKLQkJbiA9IDE7CisgICAgICAgIGlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0oZmlyc3RpdGVtLCAwKSwgMCkgPCAwKQorICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgaWYgKHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShmaXJzdGl0ZW0sIDEpLCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICBQeV9DTEVBUihmaXJzdGl0ZW0pOworICAgICAgICBuID0gMTsKIAotCQkvKiBGZXRjaCBhbmQgc2F2ZSB1cCB0byBCQVRDSFNJWkUgaXRlbXMgKi8KLQkJd2hpbGUgKHApIHsKLQkJCWlmICghUHlUdXBsZV9DaGVjayhwKSB8fCBQeVR1cGxlX1NpemUocCkgIT0gMikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJkaWN0IGl0ZW1zICIKLQkJCQkJIml0ZXJhdG9yIG11c3QgcmV0dXJuIDItdHVwbGVzIik7Ci0JCQkJZ290byBCYXRjaEZhaWxlZDsKLQkJCX0KLQkJCWlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0ocCwgMCksIDApIDwgMCkKLQkJCQlnb3RvIEJhdGNoRmFpbGVkOwotCQkJaWYgKHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShwLCAxKSwgMCkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlQeV9DTEVBUihwKTsKLQkJCW4gKz0gMTsKKyAgICAgICAgLyogRmV0Y2ggYW5kIHNhdmUgdXAgdG8gQkFUQ0hTSVpFIGl0ZW1zICovCisgICAgICAgIHdoaWxlIChwKSB7CisgICAgICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2socCkgfHwgUHlUdXBsZV9TaXplKHApICE9IDIpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGljdCBpdGVtcyAiCisgICAgICAgICAgICAgICAgICAgICJpdGVyYXRvciBtdXN0IHJldHVybiAyLXR1cGxlcyIpOworICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKHAsIDApLCAwKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0ocCwgMSksIDApIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIocCk7CisgICAgICAgICAgICBuICs9IDE7CiAKLQkJCWlmIChuID09IEJBVENIU0laRSkKLQkJCQlicmVhazsKKyAgICAgICAgICAgIGlmIChuID09IEJBVENIU0laRSkKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJcCA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQkJaWYgKHAgPT0gTlVMTCkgewotCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQlnb3RvIEJhdGNoRmFpbGVkOwotCQkJCWJyZWFrOwotCQkJfQotCQl9CisgICAgICAgICAgICBwID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc2V0aXRlbXMsIDEpIDwgMCkKLQkJCWdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZzZXRpdGVtcywgMSkgPCAwKQorICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKIAotCX0gd2hpbGUgKG4gPT0gQkFUQ0hTSVpFKTsKLQlyZXR1cm4gMDsKKyAgICB9IHdoaWxlIChuID09IEJBVENIU0laRSk7CisgICAgcmV0dXJuIDA7CiAKIEJhdGNoRmFpbGVkOgotCVB5X1hERUNSRUYoZmlyc3RpdGVtKTsKLQlQeV9YREVDUkVGKHApOwotCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKGZpcnN0aXRlbSk7CisgICAgUHlfWERFQ1JFRihwKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIFRoaXMgaXMgYSB2YXJpYW50IG9mIGJhdGNoX2RpY3QoKSBhYm92ZSB0aGF0IHNwZWNpYWxpemVzIGZvciBkaWN0cywgd2l0aCBubwpAQCAtMTg4OCw0NjEgKzE4ODgsNDYxIEBACiBzdGF0aWMgaW50CiBiYXRjaF9kaWN0X2V4YWN0KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QgKmtleSA9IE5VTEwsICp2YWx1ZSA9IE5VTEw7Ci0JaW50IGk7Ci0JUHlfc3NpemVfdCBkaWN0X3NpemUsIHBwb3MgPSAwOworICAgIFB5T2JqZWN0ICprZXkgPSBOVUxMLCAqdmFsdWUgPSBOVUxMOworICAgIGludCBpOworICAgIFB5X3NzaXplX3QgZGljdF9zaXplLCBwcG9zID0gMDsKIAotCXN0YXRpYyBjaGFyIHNldGl0ZW0gPSBTRVRJVEVNOwotCXN0YXRpYyBjaGFyIHNldGl0ZW1zID0gU0VUSVRFTVM7CisgICAgc3RhdGljIGNoYXIgc2V0aXRlbSA9IFNFVElURU07CisgICAgc3RhdGljIGNoYXIgc2V0aXRlbXMgPSBTRVRJVEVNUzsKIAotCWFzc2VydChvYmogIT0gTlVMTCk7Ci0JYXNzZXJ0KHNlbGYtPnByb3RvID4gMCk7CisgICAgYXNzZXJ0KG9iaiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc2VsZi0+cHJvdG8gPiAwKTsKIAotCWRpY3Rfc2l6ZSA9IFB5RGljdF9TaXplKG9iaik7CisgICAgZGljdF9zaXplID0gUHlEaWN0X1NpemUob2JqKTsKIAotCS8qIFNwZWNpYWwtY2FzZSBsZW4oZCkgPT0gMSB0byBzYXZlIHNwYWNlLiAqLwotCWlmIChkaWN0X3NpemUgPT0gMSkgewotCQlQeURpY3RfTmV4dChvYmosICZwcG9zLCAma2V5LCAmdmFsdWUpOwotCQlpZiAoc2F2ZShzZWxmLCBrZXksIDApIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHNhdmUoc2VsZiwgdmFsdWUsIDApIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnNldGl0ZW0sIDEpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIFNwZWNpYWwtY2FzZSBsZW4oZCkgPT0gMSB0byBzYXZlIHNwYWNlLiAqLworICAgIGlmIChkaWN0X3NpemUgPT0gMSkgeworICAgICAgICBQeURpY3RfTmV4dChvYmosICZwcG9zLCAma2V5LCAmdmFsdWUpOworICAgICAgICBpZiAoc2F2ZShzZWxmLCBrZXksIDApIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHNhdmUoc2VsZiwgdmFsdWUsIDApIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnNldGl0ZW0sIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogV3JpdGUgaW4gYmF0Y2hlcyBvZiBCQVRDSFNJWkUuICovCi0JZG8gewotCQlpID0gMDsKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJk1BUkt2LCAxKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCXdoaWxlIChQeURpY3RfTmV4dChvYmosICZwcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCQlpZiAoc2F2ZShzZWxmLCBrZXksIDApIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlpZiAoc2F2ZShzZWxmLCB2YWx1ZSwgMCkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCWlmICgrK2kgPT0gQkFUQ0hTSVpFKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZzZXRpdGVtcywgMSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NpemUob2JqKSAhPSBkaWN0X3NpemUpIHsKLQkJCVB5RXJyX0Zvcm1hdCgKLQkJCQlQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgIC8qIFdyaXRlIGluIGJhdGNoZXMgb2YgQkFUQ0hTSVpFLiAqLworICAgIGRvIHsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZNQVJLdiwgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB3aGlsZSAoUHlEaWN0X05leHQob2JqLCAmcHBvcywgJmtleSwgJnZhbHVlKSkgeworICAgICAgICAgICAgaWYgKHNhdmUoc2VsZiwga2V5LCAwKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKHNhdmUoc2VsZiwgdmFsdWUsIDApIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoKytpID09IEJBVENIU0laRSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc2V0aXRlbXMsIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RGljdF9TaXplKG9iaikgIT0gZGljdF9zaXplKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCX0gd2hpbGUgKGkgPT0gQkFUQ0hTSVpFKTsKLQlyZXR1cm4gMDsKKyAgICB9IHdoaWxlIChpID09IEJBVENIU0laRSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNhdmVfZGljdChQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzID0gLTE7Ci0JY2hhciBzWzNdOwotCWludCBsZW47CisgICAgaW50IHJlcyA9IC0xOworICAgIGNoYXIgc1szXTsKKyAgICBpbnQgbGVuOwogCi0JaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9lbnRlcihzZWxmLCBhcmdzKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfZW50ZXIoc2VsZiwgYXJncykpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIENyZWF0ZSBhbiBlbXB0eSBkaWN0LiAqLwotCWlmIChzZWxmLT5iaW4pIHsKLQkJc1swXSA9IEVNUFRZX0RJQ1Q7Ci0JCWxlbiA9IDE7Ci0JfQotCWVsc2UgewotCQlzWzBdID0gTUFSSzsKLQkJc1sxXSA9IERJQ1Q7Ci0JCWxlbiA9IDI7Ci0JfQorICAgIC8qIENyZWF0ZSBhbiBlbXB0eSBkaWN0LiAqLworICAgIGlmIChzZWxmLT5iaW4pIHsKKyAgICAgICAgc1swXSA9IEVNUFRZX0RJQ1Q7CisgICAgICAgIGxlbiA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzWzBdID0gTUFSSzsKKyAgICAgICAgc1sxXSA9IERJQ1Q7CisgICAgICAgIGxlbiA9IDI7CisgICAgfQogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgcywgbGVuKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBzLCBsZW4pIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JLyogR2V0IGRpY3Qgc2l6ZSwgYW5kIGJvdyBvdXQgZWFybHkgaWYgZW1wdHkuICovCi0JaWYgKChsZW4gPSBQeURpY3RfU2l6ZShhcmdzKSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgLyogR2V0IGRpY3Qgc2l6ZSwgYW5kIGJvdyBvdXQgZWFybHkgaWYgZW1wdHkuICovCisgICAgaWYgKChsZW4gPSBQeURpY3RfU2l6ZShhcmdzKSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAobGVuID09IDApIHsKLQkJaWYgKHB1dChzZWxmLCBhcmdzKSA+PSAwKQotCQkJcmVzID0gMDsKLQkJZ290byBmaW5hbGx5OwotCX0KLQlpZiAocHV0MihzZWxmLCBhcmdzKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgaWYgKHB1dChzZWxmLCBhcmdzKSA+PSAwKQorICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBpZiAocHV0MihzZWxmLCBhcmdzKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIE1hdGVyaWFsaXplIHRoZSBkaWN0IGl0ZW1zLiAqLwotCWlmIChQeURpY3RfQ2hlY2tFeGFjdChhcmdzKSAmJiBzZWxmLT5wcm90byA+IDApIHsKLQkJLyogV2UgY2FuIHRha2UgY2VydGFpbiBzaG9ydGN1dHMgaWYgd2Uga25vdyB0aGlzIGlzIGEgZGljdCBhbmQKLQkJICAgbm90IGEgZGljdCBzdWJjbGFzcy4gKi8KLQkJaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIHBpY2tsaW5nIGFuIG9iamVjdCIpID09IDApIHsKLQkJCXJlcyA9IGJhdGNoX2RpY3RfZXhhY3Qoc2VsZiwgYXJncyk7Ci0JCQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQkJfQotCX0gZWxzZSB7Ci0JCVB5T2JqZWN0ICppdGVyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChhcmdzLCAiaXRlcml0ZW1zIiwgIigpIik7Ci0JCWlmIChpdGVyID09IE5VTEwpCi0JCQlnb3RvIGZpbmFsbHk7Ci0JCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBwaWNrbGluZyBhbiBvYmplY3QiKSA9PSAwKSB7Ci0JCQlyZXMgPSBiYXRjaF9kaWN0KHNlbGYsIGl0ZXIpOwotCQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JCX0KLQkJUHlfREVDUkVGKGl0ZXIpOwotCX0KKyAgICAvKiBNYXRlcmlhbGl6ZSB0aGUgZGljdCBpdGVtcy4gKi8KKyAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QoYXJncykgJiYgc2VsZi0+cHJvdG8gPiAwKSB7CisgICAgICAgIC8qIFdlIGNhbiB0YWtlIGNlcnRhaW4gc2hvcnRjdXRzIGlmIHdlIGtub3cgdGhpcyBpcyBhIGRpY3QgYW5kCisgICAgICAgICAgIG5vdCBhIGRpY3Qgc3ViY2xhc3MuICovCisgICAgICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBwaWNrbGluZyBhbiBvYmplY3QiKSA9PSAwKSB7CisgICAgICAgICAgICByZXMgPSBiYXRjaF9kaWN0X2V4YWN0KHNlbGYsIGFyZ3MpOworICAgICAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBQeU9iamVjdCAqaXRlciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoYXJncywgIml0ZXJpdGVtcyIsICIoKSIpOworICAgICAgICBpZiAoaXRlciA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgcGlja2xpbmcgYW4gb2JqZWN0IikgPT0gMCkgeworICAgICAgICAgICAgcmVzID0gYmF0Y2hfZGljdChzZWxmLCBpdGVyKTsKKyAgICAgICAgICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICB9CiAKICAgZmluYWxseToKLQlpZiAoc2VsZi0+ZmFzdCAmJiAhZmFzdF9zYXZlX2xlYXZlKHNlbGYsIGFyZ3MpKQotCQlyZXMgPSAtMTsKKyAgICBpZiAoc2VsZi0+ZmFzdCAmJiAhZmFzdF9zYXZlX2xlYXZlKHNlbGYsIGFyZ3MpKQorICAgICAgICByZXMgPSAtMTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCiBzdGF0aWMgaW50CiBzYXZlX2luc3QoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmNsYXNzID0gMCwgKm1vZHVsZSA9IDAsICpuYW1lID0gMCwgKnN0YXRlID0gMCwKLQkJKmdldGluaXRhcmdzX2Z1bmMgPSAwLCAqZ2V0c3RhdGVfZnVuYyA9IDAsICpjbGFzc19hcmdzID0gMDsKLQljaGFyICptb2R1bGVfc3RyLCAqbmFtZV9zdHI7Ci0JaW50IG1vZHVsZV9zaXplLCBuYW1lX3NpemUsIHJlcyA9IC0xOworICAgIFB5T2JqZWN0ICpjbGFzcyA9IDAsICptb2R1bGUgPSAwLCAqbmFtZSA9IDAsICpzdGF0ZSA9IDAsCisgICAgICAgICpnZXRpbml0YXJnc19mdW5jID0gMCwgKmdldHN0YXRlX2Z1bmMgPSAwLCAqY2xhc3NfYXJncyA9IDA7CisgICAgY2hhciAqbW9kdWxlX3N0ciwgKm5hbWVfc3RyOworICAgIGludCBtb2R1bGVfc2l6ZSwgbmFtZV9zaXplLCByZXMgPSAtMTsKIAotCXN0YXRpYyBjaGFyIGluc3QgPSBJTlNULCBvYmogPSBPQkosIGJ1aWxkID0gQlVJTEQ7CisgICAgc3RhdGljIGNoYXIgaW5zdCA9IElOU1QsIG9iaiA9IE9CSiwgYnVpbGQgPSBCVUlMRDsKIAotCWlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfZW50ZXIoc2VsZiwgYXJncykpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+ZmFzdCAmJiAhZmFzdF9zYXZlX2VudGVyKHNlbGYsIGFyZ3MpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmTUFSS3YsIDEpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZNQVJLdiwgMSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoISggY2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fY2xhc3NfX19zdHIpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCBjbGFzcyA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19jbGFzc19fX3N0cikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoc2VsZi0+YmluKSB7Ci0JCWlmIChzYXZlKHNlbGYsIGNsYXNzLCAwKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmIChzZWxmLT5iaW4pIHsKKyAgICAgICAgaWYgKHNhdmUoc2VsZiwgY2xhc3MsIDApIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlpZiAoKGdldGluaXRhcmdzX2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fZ2V0aW5pdGFyZ3NfX19zdHIpKSkgewotCQlQeU9iamVjdCAqZWxlbWVudCA9IDA7Ci0JCWludCBpLCBsZW47CisgICAgaWYgKChnZXRpbml0YXJnc19mdW5jID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX2dldGluaXRhcmdzX19fc3RyKSkpIHsKKyAgICAgICAgUHlPYmplY3QgKmVsZW1lbnQgPSAwOworICAgICAgICBpbnQgaSwgbGVuOwogCi0JCWlmICghKCBjbGFzc19hcmdzID0KLQkJICAgICAgIFB5T2JqZWN0X0NhbGwoZ2V0aW5pdGFyZ3NfZnVuYywgZW1wdHlfdHVwbGUsIE5VTEwpKSkKLQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKCEoIGNsYXNzX2FyZ3MgPQorICAgICAgICAgICAgICAgUHlPYmplY3RfQ2FsbChnZXRpbml0YXJnc19mdW5jLCBlbXB0eV90dXBsZSwgTlVMTCkpKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCWlmICgobGVuID0gUHlPYmplY3RfU2l6ZShjbGFzc19hcmdzKSkgPCAwKQotCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoKGxlbiA9IFB5T2JqZWN0X1NpemUoY2xhc3NfYXJncykpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICghKCBlbGVtZW50ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGNsYXNzX2FyZ3MsIGkpKSkKLQkJCQlnb3RvIGZpbmFsbHk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKCEoIGVsZW1lbnQgPSBQeVNlcXVlbmNlX0dldEl0ZW0oY2xhc3NfYXJncywgaSkpKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJaWYgKHNhdmUoc2VsZiwgZWxlbWVudCwgMCkgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGVsZW1lbnQpOwotCQkJCWdvdG8gZmluYWxseTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIGVsZW1lbnQsIDApIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtZW50KTsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICB9CiAKLQkJCVB5X0RFQ1JFRihlbGVtZW50KTsKLQkJfQotCX0KLQllbHNlIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZQotCQkJZ290byBmaW5hbGx5OwotCX0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmICghc2VsZi0+YmluKSB7Ci0JCWlmICghKCBuYW1lID0gKChQeUNsYXNzT2JqZWN0ICopY2xhc3MpLT5jbF9uYW1lICkpICB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgImNsYXNzIGhhcyBubyBuYW1lIik7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KKyAgICBpZiAoIXNlbGYtPmJpbikgeworICAgICAgICBpZiAoISggbmFtZSA9ICgoUHlDbGFzc09iamVjdCAqKWNsYXNzKS0+Y2xfbmFtZSApKSAgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsICJjbGFzcyBoYXMgbm8gbmFtZSIpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CiAKLQkJaWYgKCEoIG1vZHVsZSA9IHdoaWNobW9kdWxlKGNsYXNzLCBuYW1lKSkpCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmICghKCBtb2R1bGUgPSB3aGljaG1vZHVsZShjbGFzcywgbmFtZSkpKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCiAKLQkJaWYgKChtb2R1bGVfc2l6ZSA9IFB5U3RyaW5nX1NpemUobW9kdWxlKSkgPCAwIHx8Ci0JCSAgICAobmFtZV9zaXplID0gUHlTdHJpbmdfU2l6ZShuYW1lKSkgPCAwKQotCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoKG1vZHVsZV9zaXplID0gUHlTdHJpbmdfU2l6ZShtb2R1bGUpKSA8IDAgfHwKKyAgICAgICAgICAgIChuYW1lX3NpemUgPSBQeVN0cmluZ19TaXplKG5hbWUpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJbW9kdWxlX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKiltb2R1bGUpOwotCQluYW1lX3N0ciAgID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKW5hbWUpOworICAgICAgICBtb2R1bGVfc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKW1vZHVsZSk7CisgICAgICAgIG5hbWVfc3RyICAgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopbmFtZSk7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmluc3QsIDEpIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmluc3QsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBtb2R1bGVfc3RyLCBtb2R1bGVfc2l6ZSkgPCAwKQotCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBtb2R1bGVfc3RyLCBtb2R1bGVfc2l6ZSkgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIG5hbWVfc3RyLCBuYW1lX3NpemUpIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgbmFtZV9zdHIsIG5hbWVfc2l6ZSkgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKLQl9Ci0JZWxzZSBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmb2JqLCAxKSA8IDApIHsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBlbHNlIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZvYmosIDEpIDwgMCkgeworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JaWYgKChnZXRzdGF0ZV9mdW5jID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX2dldHN0YXRlX19fc3RyKSkpIHsKLQkJc3RhdGUgPSBQeU9iamVjdF9DYWxsKGdldHN0YXRlX2Z1bmMsIGVtcHR5X3R1cGxlLCBOVUxMKTsKLQkJaWYgKCFzdGF0ZSkKLQkJCWdvdG8gZmluYWxseTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UKLQkJCWdvdG8gZmluYWxseTsKKyAgICBpZiAoKGdldHN0YXRlX2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fZ2V0c3RhdGVfX19zdHIpKSkgeworICAgICAgICBzdGF0ZSA9IFB5T2JqZWN0X0NhbGwoZ2V0c3RhdGVfZnVuYywgZW1wdHlfdHVwbGUsIE5VTEwpOworICAgICAgICBpZiAoIXN0YXRlKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCWlmICghKCBzdGF0ZSA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19kaWN0X19fc3RyKSkpICB7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQlyZXMgPSAwOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfQorICAgICAgICBpZiAoISggc3RhdGUgPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fZGljdF9fX3N0cikpKSAgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmICghUHlEaWN0X0NoZWNrKHN0YXRlKSkgewotCQlpZiAocHV0MihzZWxmLCBhcmdzKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWVsc2UgewotCQlpZiAocHV0KHNlbGYsIGFyZ3MpIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKCFQeURpY3RfQ2hlY2soc3RhdGUpKSB7CisgICAgICAgIGlmIChwdXQyKHNlbGYsIGFyZ3MpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChwdXQoc2VsZiwgYXJncykgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmIChzYXZlKHNlbGYsIHN0YXRlLCAwKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2F2ZShzZWxmLCBzdGF0ZSwgMCkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYnVpbGQsIDEpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZidWlsZCwgMSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlyZXMgPSAwOworICAgIHJlcyA9IDA7CiAKICAgZmluYWxseToKLQlpZiAoc2VsZi0+ZmFzdCAmJiAhZmFzdF9zYXZlX2xlYXZlKHNlbGYsIGFyZ3MpKQotCQlyZXMgPSAtMTsKKyAgICBpZiAoc2VsZi0+ZmFzdCAmJiAhZmFzdF9zYXZlX2xlYXZlKHNlbGYsIGFyZ3MpKQorICAgICAgICByZXMgPSAtMTsKIAotCVB5X1hERUNSRUYobW9kdWxlKTsKLQlQeV9YREVDUkVGKGNsYXNzKTsKLQlQeV9YREVDUkVGKHN0YXRlKTsKLQlQeV9YREVDUkVGKGdldGluaXRhcmdzX2Z1bmMpOwotCVB5X1hERUNSRUYoZ2V0c3RhdGVfZnVuYyk7Ci0JUHlfWERFQ1JFRihjbGFzc19hcmdzKTsKKyAgICBQeV9YREVDUkVGKG1vZHVsZSk7CisgICAgUHlfWERFQ1JFRihjbGFzcyk7CisgICAgUHlfWERFQ1JFRihzdGF0ZSk7CisgICAgUHlfWERFQ1JFRihnZXRpbml0YXJnc19mdW5jKTsKKyAgICBQeV9YREVDUkVGKGdldHN0YXRlX2Z1bmMpOworICAgIFB5X1hERUNSRUYoY2xhc3NfYXJncyk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIAogc3RhdGljIGludAogc2F2ZV9nbG9iYWwoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5T2JqZWN0ICpnbG9iYWxfbmFtZSA9IDAsICptb2R1bGUgPSAwLCAqbW9kID0gMCwgKmtsYXNzID0gMDsKLQljaGFyICpuYW1lX3N0ciwgKm1vZHVsZV9zdHI7Ci0JaW50IG1vZHVsZV9zaXplLCBuYW1lX3NpemUsIHJlcyA9IC0xOworICAgIFB5T2JqZWN0ICpnbG9iYWxfbmFtZSA9IDAsICptb2R1bGUgPSAwLCAqbW9kID0gMCwgKmtsYXNzID0gMDsKKyAgICBjaGFyICpuYW1lX3N0ciwgKm1vZHVsZV9zdHI7CisgICAgaW50IG1vZHVsZV9zaXplLCBuYW1lX3NpemUsIHJlcyA9IC0xOwogCi0Jc3RhdGljIGNoYXIgZ2xvYmFsID0gR0xPQkFMOworICAgIHN0YXRpYyBjaGFyIGdsb2JhbCA9IEdMT0JBTDsKIAotCWlmIChuYW1lKSB7Ci0JCWdsb2JhbF9uYW1lID0gbmFtZTsKLQkJUHlfSU5DUkVGKGdsb2JhbF9uYW1lKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghKCBnbG9iYWxfbmFtZSA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19uYW1lX19fc3RyKSkpCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmIChuYW1lKSB7CisgICAgICAgIGdsb2JhbF9uYW1lID0gbmFtZTsKKyAgICAgICAgUHlfSU5DUkVGKGdsb2JhbF9uYW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghKCBnbG9iYWxfbmFtZSA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19uYW1lX19fc3RyKSkpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JaWYgKCEoIG1vZHVsZSA9IHdoaWNobW9kdWxlKGFyZ3MsIGdsb2JhbF9uYW1lKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggbW9kdWxlID0gd2hpY2htb2R1bGUoYXJncywgZ2xvYmFsX25hbWUpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKChtb2R1bGVfc2l6ZSA9IFB5U3RyaW5nX1NpemUobW9kdWxlKSkgPCAwIHx8Ci0JICAgIChuYW1lX3NpemUgPSBQeVN0cmluZ19TaXplKGdsb2JhbF9uYW1lKSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKChtb2R1bGVfc2l6ZSA9IFB5U3RyaW5nX1NpemUobW9kdWxlKSkgPCAwIHx8CisgICAgICAgIChuYW1lX3NpemUgPSBQeVN0cmluZ19TaXplKGdsb2JhbF9uYW1lKSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQltb2R1bGVfc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKW1vZHVsZSk7Ci0JbmFtZV9zdHIgICA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilnbG9iYWxfbmFtZSk7CisgICAgbW9kdWxlX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKiltb2R1bGUpOworICAgIG5hbWVfc3RyICAgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopZ2xvYmFsX25hbWUpOwogCi0JLyogWFhYIFRoaXMgY2FuIGJlIGRvaW5nIGEgcmVsYXRpdmUgaW1wb3J0LiAgQ2xlYXJseSBpdCBzaG91bGRuJ3QsCi0JICAgYnV0IEkgZG9uJ3Qga25vdyBob3cgdG8gc3RvcCBpdC4gOi0oICovCi0JbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKG1vZHVsZV9zdHIpOwotCWlmIChtb2QgPT0gTlVMTCkgewotCQljUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLAotCQkJCSAgIkNhbid0IHBpY2tsZSAlczogaW1wb3J0IG9mIG1vZHVsZSAlcyAiCi0JCQkJICAiZmFpbGVkIiwKLQkJCQkgICJPUyIsIGFyZ3MsIG1vZHVsZSk7Ci0JCWdvdG8gZmluYWxseTsKLQl9Ci0Ja2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgbmFtZV9zdHIpOwotCWlmIChrbGFzcyA9PSBOVUxMKSB7Ci0JCWNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsCi0JCQkJICAiQ2FuJ3QgcGlja2xlICVzOiBhdHRyaWJ1dGUgbG9va3VwICVzLiVzICIKLQkJCQkgICJmYWlsZWQiLAotCQkJCSAgIk9TUyIsIGFyZ3MsIG1vZHVsZSwgZ2xvYmFsX25hbWUpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWlmIChrbGFzcyAhPSBhcmdzKSB7Ci0JCVB5X0RFQ1JFRihrbGFzcyk7Ci0JCWNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsCi0JCQkJICAiQ2FuJ3QgcGlja2xlICVzOiBpdCdzIG5vdCB0aGUgc2FtZSBvYmplY3QgIgotCQkJCSAgCSJhcyAlcy4lcyIsCi0JCQkJICAiT1NTIiwgYXJncywgbW9kdWxlLCBnbG9iYWxfbmFtZSk7Ci0JCWdvdG8gZmluYWxseTsKLQl9Ci0JUHlfREVDUkVGKGtsYXNzKTsKKyAgICAvKiBYWFggVGhpcyBjYW4gYmUgZG9pbmcgYSByZWxhdGl2ZSBpbXBvcnQuICBDbGVhcmx5IGl0IHNob3VsZG4ndCwKKyAgICAgICBidXQgSSBkb24ndCBrbm93IGhvdyB0byBzdG9wIGl0LiA6LSggKi8KKyAgICBtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUobW9kdWxlX3N0cik7CisgICAgaWYgKG1vZCA9PSBOVUxMKSB7CisgICAgICAgIGNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBwaWNrbGUgJXM6IGltcG9ydCBvZiBtb2R1bGUgJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk9TIiwgYXJncywgbW9kdWxlKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBrbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCBuYW1lX3N0cik7CisgICAgaWYgKGtsYXNzID09IE5VTEwpIHsKKyAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IHBpY2tsZSAlczogYXR0cmlidXRlIGxvb2t1cCAlcy4lcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT1NTIiwgYXJncywgbW9kdWxlLCBnbG9iYWxfbmFtZSk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgaWYgKGtsYXNzICE9IGFyZ3MpIHsKKyAgICAgICAgUHlfREVDUkVGKGtsYXNzKTsKKyAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IHBpY2tsZSAlczogaXQncyBub3QgdGhlIHNhbWUgb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzICVzLiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk9TUyIsIGFyZ3MsIG1vZHVsZSwgZ2xvYmFsX25hbWUpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIFB5X0RFQ1JFRihrbGFzcyk7CiAKLQlpZiAoc2VsZi0+cHJvdG8gPj0gMikgewotCQkvKiBTZWUgd2hldGhlciB0aGlzIGlzIGluIHRoZSBleHRlbnNpb24gcmVnaXN0cnksIGFuZCBpZgotCQkgKiBzbyBnZW5lcmF0ZSBhbiBFWFQgb3Bjb2RlLgotCQkgKi8KLQkJUHlPYmplY3QgKnB5X2NvZGU7CS8qIGV4dGVuc2lvbiBjb2RlIGFzIFB5dGhvbiBvYmplY3QgKi8KLQkJbG9uZyBjb2RlOwkJLyogZXh0ZW5zaW9uIGNvZGUgYXMgQyB2YWx1ZSAqLwotCQljaGFyIGNfc3RyWzVdOwotCQlpbnQgbjsKKyAgICBpZiAoc2VsZi0+cHJvdG8gPj0gMikgeworICAgICAgICAvKiBTZWUgd2hldGhlciB0aGlzIGlzIGluIHRoZSBleHRlbnNpb24gcmVnaXN0cnksIGFuZCBpZgorICAgICAgICAgKiBzbyBnZW5lcmF0ZSBhbiBFWFQgb3Bjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgUHlPYmplY3QgKnB5X2NvZGU7ICAgICAgICAgICAgICAvKiBleHRlbnNpb24gY29kZSBhcyBQeXRob24gb2JqZWN0ICovCisgICAgICAgIGxvbmcgY29kZTsgICAgICAgICAgICAgICAgICAgICAgLyogZXh0ZW5zaW9uIGNvZGUgYXMgQyB2YWx1ZSAqLworICAgICAgICBjaGFyIGNfc3RyWzVdOworICAgICAgICBpbnQgbjsKIAotCQlQeVR1cGxlX1NFVF9JVEVNKHR3b190dXBsZSwgMCwgbW9kdWxlKTsKLQkJUHlUdXBsZV9TRVRfSVRFTSh0d29fdHVwbGUsIDEsIGdsb2JhbF9uYW1lKTsKLQkJcHlfY29kZSA9IFB5RGljdF9HZXRJdGVtKGV4dGVuc2lvbl9yZWdpc3RyeSwgdHdvX3R1cGxlKTsKLQkJaWYgKHB5X2NvZGUgPT0gTlVMTCkKLQkJCWdvdG8gZ2VuX2dsb2JhbDsJLyogbm90IHJlZ2lzdGVyZWQgKi8KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0d29fdHVwbGUsIDAsIG1vZHVsZSk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odHdvX3R1cGxlLCAxLCBnbG9iYWxfbmFtZSk7CisgICAgICAgIHB5X2NvZGUgPSBQeURpY3RfR2V0SXRlbShleHRlbnNpb25fcmVnaXN0cnksIHR3b190dXBsZSk7CisgICAgICAgIGlmIChweV9jb2RlID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGdlbl9nbG9iYWw7ICAgICAgICAgICAgICAgICAgICAvKiBub3QgcmVnaXN0ZXJlZCAqLwogCi0JCS8qIFZlcmlmeSBweV9jb2RlIGhhcyB0aGUgcmlnaHQgdHlwZSBhbmQgdmFsdWUuICovCi0JCWlmICghUHlJbnRfQ2hlY2socHlfY29kZSkpIHsKLQkJCWNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJDYW4ndCBwaWNrbGUgJXM6ICIKLQkJCQkiZXh0ZW5zaW9uIGNvZGUgJXMgaXNuJ3QgYW4gaW50ZWdlciIsCi0JCQkJIk9PIiwgYXJncywgcHlfY29kZSk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJY29kZSA9IFB5SW50X0FTX0xPTkcocHlfY29kZSk7Ci0JCWlmIChjb2RlIDw9IDAgfHwgIGNvZGUgPiAweDdmZmZmZmZmTCkgewotCQkJY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIkNhbid0IHBpY2tsZSAlczogIgotCQkJCSJleHRlbnNpb24gY29kZSAlbGQgaXMgb3V0IG9mIHJhbmdlIiwKLQkJCQkiT2wiLCBhcmdzLCBjb2RlKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQorICAgICAgICAvKiBWZXJpZnkgcHlfY29kZSBoYXMgdGhlIHJpZ2h0IHR5cGUgYW5kIHZhbHVlLiAqLworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHB5X2NvZGUpKSB7CisgICAgICAgICAgICBjUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiQ2FuJ3QgcGlja2xlICVzOiAiCisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiBjb2RlICVzIGlzbid0IGFuIGludGVnZXIiLAorICAgICAgICAgICAgICAgICJPTyIsIGFyZ3MsIHB5X2NvZGUpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGNvZGUgPSBQeUludF9BU19MT05HKHB5X2NvZGUpOworICAgICAgICBpZiAoY29kZSA8PSAwIHx8ICBjb2RlID4gMHg3ZmZmZmZmZkwpIHsKKyAgICAgICAgICAgIGNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJDYW4ndCBwaWNrbGUgJXM6ICIKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIGNvZGUgJWxkIGlzIG91dCBvZiByYW5nZSIsCisgICAgICAgICAgICAgICAgIk9sIiwgYXJncywgY29kZSk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KIAotCQkvKiBHZW5lcmF0ZSBhbiBFWFQgb3Bjb2RlLiAqLwotCQlpZiAoY29kZSA8PSAweGZmKSB7Ci0JCQljX3N0clswXSA9IEVYVDE7Ci0JCQljX3N0clsxXSA9IChjaGFyKWNvZGU7Ci0JCQluID0gMjsKLQkJfQotCQllbHNlIGlmIChjb2RlIDw9IDB4ZmZmZikgewotCQkJY19zdHJbMF0gPSBFWFQyOwotCQkJY19zdHJbMV0gPSAoY2hhcikoY29kZSAmIDB4ZmYpOwotCQkJY19zdHJbMl0gPSAoY2hhcikoKGNvZGUgPj4gOCkgJiAweGZmKTsKLQkJCW4gPSAzOwotCQl9Ci0JCWVsc2UgewotCQkJY19zdHJbMF0gPSBFWFQ0OwotCQkJY19zdHJbMV0gPSAoY2hhcikoY29kZSAmIDB4ZmYpOwotCQkJY19zdHJbMl0gPSAoY2hhcikoKGNvZGUgPj4gOCkgJiAweGZmKTsKLQkJCWNfc3RyWzNdID0gKGNoYXIpKChjb2RlID4+IDE2KSAmIDB4ZmYpOwotCQkJY19zdHJbNF0gPSAoY2hhcikoKGNvZGUgPj4gMjQpICYgMHhmZik7Ci0JCQluID0gNTsKLQkJfQorICAgICAgICAvKiBHZW5lcmF0ZSBhbiBFWFQgb3Bjb2RlLiAqLworICAgICAgICBpZiAoY29kZSA8PSAweGZmKSB7CisgICAgICAgICAgICBjX3N0clswXSA9IEVYVDE7CisgICAgICAgICAgICBjX3N0clsxXSA9IChjaGFyKWNvZGU7CisgICAgICAgICAgICBuID0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjb2RlIDw9IDB4ZmZmZikgeworICAgICAgICAgICAgY19zdHJbMF0gPSBFWFQyOworICAgICAgICAgICAgY19zdHJbMV0gPSAoY2hhcikoY29kZSAmIDB4ZmYpOworICAgICAgICAgICAgY19zdHJbMl0gPSAoY2hhcikoKGNvZGUgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIG4gPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY19zdHJbMF0gPSBFWFQ0OworICAgICAgICAgICAgY19zdHJbMV0gPSAoY2hhcikoY29kZSAmIDB4ZmYpOworICAgICAgICAgICAgY19zdHJbMl0gPSAoY2hhcikoKGNvZGUgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGNfc3RyWzNdID0gKGNoYXIpKChjb2RlID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgY19zdHJbNF0gPSAoY2hhcikoKGNvZGUgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICBuID0gNTsKKyAgICAgICAgfQogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBuKSA+PSAwKQotCQkJcmVzID0gMDsKLQkJZ290byBmaW5hbGx5OwkvKiBhbmQgZG9uJ3QgbWVtb2l6ZSAqLwotCX0KKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIG4pID49IDApCisgICAgICAgICAgICByZXMgPSAwOworICAgICAgICBnb3RvIGZpbmFsbHk7ICAgICAgICAgICAvKiBhbmQgZG9uJ3QgbWVtb2l6ZSAqLworICAgIH0KIAogICBnZW5fZ2xvYmFsOgotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZnbG9iYWwsIDEpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZnbG9iYWwsIDEpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgbW9kdWxlX3N0ciwgbW9kdWxlX3NpemUpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIG1vZHVsZV9zdHIsIG1vZHVsZV9zaXplKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgbmFtZV9zdHIsIG5hbWVfc2l6ZSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgbmFtZV9zdHIsIG5hbWVfc2l6ZSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChwdXQoc2VsZiwgYXJncykgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHB1dChzZWxmLCBhcmdzKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCXJlcyA9IDA7CisgICAgcmVzID0gMDsKIAogICBmaW5hbGx5OgotCVB5X1hERUNSRUYobW9kdWxlKTsKLQlQeV9YREVDUkVGKGdsb2JhbF9uYW1lKTsKLQlQeV9YREVDUkVGKG1vZCk7CisgICAgUHlfWERFQ1JFRihtb2R1bGUpOworICAgIFB5X1hERUNSRUYoZ2xvYmFsX25hbWUpOworICAgIFB5X1hERUNSRUYobW9kKTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogc2F2ZV9wZXJzKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqZikKIHsKLQlQeU9iamVjdCAqcGlkID0gMDsKLQlpbnQgc2l6ZSwgcmVzID0gLTE7CisgICAgUHlPYmplY3QgKnBpZCA9IDA7CisgICAgaW50IHNpemUsIHJlcyA9IC0xOwogCi0Jc3RhdGljIGNoYXIgcGVyc2lkID0gUEVSU0lELCBiaW5wZXJzaWQgPSBCSU5QRVJTSUQ7CisgICAgc3RhdGljIGNoYXIgcGVyc2lkID0gUEVSU0lELCBiaW5wZXJzaWQgPSBCSU5QRVJTSUQ7CiAKLQlQeV9JTkNSRUYoYXJncyk7Ci0JQVJHX1RVUChzZWxmLCBhcmdzKTsKLQlpZiAoc2VsZi0+YXJnKSB7Ci0JCXBpZCA9IFB5T2JqZWN0X0NhbGwoZiwgc2VsZi0+YXJnLCBOVUxMKTsKLQkJRlJFRV9BUkdfVFVQKHNlbGYpOwotCX0KLQlpZiAoISBwaWQpIHJldHVybiAtMTsKKyAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgQVJHX1RVUChzZWxmLCBhcmdzKTsKKyAgICBpZiAoc2VsZi0+YXJnKSB7CisgICAgICAgIHBpZCA9IFB5T2JqZWN0X0NhbGwoZiwgc2VsZi0+YXJnLCBOVUxMKTsKKyAgICAgICAgRlJFRV9BUkdfVFVQKHNlbGYpOworICAgIH0KKyAgICBpZiAoISBwaWQpIHJldHVybiAtMTsKIAotCWlmIChwaWQgIT0gUHlfTm9uZSkgewotCQlpZiAoIXNlbGYtPmJpbikgewotCQkJaWYgKCFQeVN0cmluZ19DaGVjayhwaWQpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCi0JCQkJCQkicGVyc2lzdGVudCBpZCBtdXN0IGJlIHN0cmluZyIpOwotCQkJCWdvdG8gZmluYWxseTsKLQkJCX0KKyAgICBpZiAocGlkICE9IFB5X05vbmUpIHsKKyAgICAgICAgaWYgKCFzZWxmLT5iaW4pIHsKKyAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2socGlkKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVyc2lzdGVudCBpZCBtdXN0IGJlIHN0cmluZyIpOworICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBlcnNpZCwgMSkgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZwZXJzaWQsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJCWlmICgoc2l6ZSA9IFB5U3RyaW5nX1NpemUocGlkKSkgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIGlmICgoc2l6ZSA9IFB5U3RyaW5nX1NpemUocGlkKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwKLQkJCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcoCi0JCQkJCSAgICAgCShQeVN0cmluZ09iamVjdCAqKXBpZCksCi0JCQkJCSAgICAgc2l6ZSkgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlTdHJpbmdPYmplY3QgKilwaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJCXJlcyA9IDE7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJZWxzZSBpZiAoc2F2ZShzZWxmLCBwaWQsIDEpID49IDApIHsKLQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZiaW5wZXJzaWQsIDEpIDwgMCkKLQkJCQlyZXMgPSAtMTsKLQkJCWVsc2UKLQkJCQlyZXMgPSAxOwotCQl9CisgICAgICAgICAgICByZXMgPSAxOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNhdmUoc2VsZiwgcGlkLCAxKSA+PSAwKSB7CisgICAgICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYmlucGVyc2lkLCAxKSA8IDApCisgICAgICAgICAgICAgICAgcmVzID0gLTE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzID0gMTsKKyAgICAgICAgfQogCi0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlyZXMgPSAwOworICAgIHJlcyA9IDA7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHBpZCk7CisgICAgUHlfWERFQ1JFRihwaWQpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAvKiBXZSdyZSBzYXZpbmcgb2IsIGFuZCBhcmdzIGlzIHRoZSAyLXRocnUtNSB0dXBsZSByZXR1cm5lZCBieSB0aGUKQEAgLTIzNTEsNjIxICsyMzUxLDYyMSBAQAogc3RhdGljIGludAogc2F2ZV9yZWR1Y2UoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICpmbiwgUHlPYmplY3QgKm9iKQogewotCVB5T2JqZWN0ICpjYWxsYWJsZTsKLQlQeU9iamVjdCAqYXJndHVwOwotCVB5T2JqZWN0ICpzdGF0ZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmxpc3RpdGVtcyA9IFB5X05vbmU7Ci0JUHlPYmplY3QgKmRpY3RpdGVtcyA9IFB5X05vbmU7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIFB5T2JqZWN0ICpjYWxsYWJsZTsKKyAgICBQeU9iamVjdCAqYXJndHVwOworICAgIFB5T2JqZWN0ICpzdGF0ZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKmxpc3RpdGVtcyA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKmRpY3RpdGVtcyA9IFB5X05vbmU7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JaW50IHVzZV9uZXdvYmogPSBzZWxmLT5wcm90byA+PSAyOworICAgIGludCB1c2VfbmV3b2JqID0gc2VsZi0+cHJvdG8gPj0gMjsKIAotCXN0YXRpYyBjaGFyIHJlZHVjZSA9IFJFRFVDRTsKLQlzdGF0aWMgY2hhciBidWlsZCA9IEJVSUxEOwotCXN0YXRpYyBjaGFyIG5ld29iaiA9IE5FV09CSjsKKyAgICBzdGF0aWMgY2hhciByZWR1Y2UgPSBSRURVQ0U7CisgICAgc3RhdGljIGNoYXIgYnVpbGQgPSBCVUlMRDsKKyAgICBzdGF0aWMgY2hhciBuZXdvYmogPSBORVdPQko7CiAKLQlzaXplID0gUHlUdXBsZV9TaXplKGFyZ3MpOwotCWlmIChzaXplIDwgMiB8fCBzaXplID4gNSkgewotCQljUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAidHVwbGUgcmV0dXJuZWQgYnkgIgotCQkJIiVzIG11c3QgY29udGFpbiAyIHRocm91Z2ggNSBlbGVtZW50cyIsCi0JCQkiTyIsIGZuKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBzaXplID0gUHlUdXBsZV9TaXplKGFyZ3MpOworICAgIGlmIChzaXplIDwgMiB8fCBzaXplID4gNSkgeworICAgICAgICBjUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAidHVwbGUgcmV0dXJuZWQgYnkgIgorICAgICAgICAgICAgIiVzIG11c3QgY29udGFpbiAyIHRocm91Z2ggNSBlbGVtZW50cyIsCisgICAgICAgICAgICAiTyIsIGZuKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICghIFB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzYXZlX3JlZHVjZSIsIDIsIDUsCi0JCQkJJmNhbGxhYmxlLAotCQkJCSZhcmd0dXAsCi0JCQkJJnN0YXRlLAotCQkJCSZsaXN0aXRlbXMsCi0JCQkJJmRpY3RpdGVtcykpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoISBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2F2ZV9yZWR1Y2UiLCAyLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJndHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGlzdGl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWN0aXRlbXMpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJndHVwKSkgewotCQljUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiU2Vjb25kIGVsZW1lbnQgb2YgIgotCQkJInR1cGxlIHJldHVybmVkIGJ5ICVzIG11c3QgYmUgYSB0dXBsZSIsCi0JCQkiTyIsIGZuKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJndHVwKSkgeworICAgICAgICBjUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiU2Vjb25kIGVsZW1lbnQgb2YgIgorICAgICAgICAgICAgInR1cGxlIHJldHVybmVkIGJ5ICVzIG11c3QgYmUgYSB0dXBsZSIsCisgICAgICAgICAgICAiTyIsIGZuKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChzdGF0ZSA9PSBQeV9Ob25lKQotCQlzdGF0ZSA9IE5VTEw7CisgICAgaWYgKHN0YXRlID09IFB5X05vbmUpCisgICAgICAgIHN0YXRlID0gTlVMTDsKIAotCWlmIChsaXN0aXRlbXMgPT0gUHlfTm9uZSkKLQkJbGlzdGl0ZW1zID0gTlVMTDsKLQllbHNlIGlmICghUHlJdGVyX0NoZWNrKGxpc3RpdGVtcykpIHsKLQkJY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIkZvdXJ0aCBlbGVtZW50IG9mICIKLQkJCSJ0dXBsZSByZXR1cm5lZCBieSAlcyBtdXN0IGJlIGFuIGl0ZXJhdG9yLCBub3QgJXMiLAotCQkJIk9zIiwgZm4sIFB5X1RZUEUobGlzdGl0ZW1zKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKGxpc3RpdGVtcyA9PSBQeV9Ob25lKQorICAgICAgICBsaXN0aXRlbXMgPSBOVUxMOworICAgIGVsc2UgaWYgKCFQeUl0ZXJfQ2hlY2sobGlzdGl0ZW1zKSkgeworICAgICAgICBjUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiRm91cnRoIGVsZW1lbnQgb2YgIgorICAgICAgICAgICAgInR1cGxlIHJldHVybmVkIGJ5ICVzIG11c3QgYmUgYW4gaXRlcmF0b3IsIG5vdCAlcyIsCisgICAgICAgICAgICAiT3MiLCBmbiwgUHlfVFlQRShsaXN0aXRlbXMpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChkaWN0aXRlbXMgPT0gUHlfTm9uZSkKLQkJZGljdGl0ZW1zID0gTlVMTDsKLQllbHNlIGlmICghUHlJdGVyX0NoZWNrKGRpY3RpdGVtcykpIHsKLQkJY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIkZpZnRoIGVsZW1lbnQgb2YgIgotCQkJInR1cGxlIHJldHVybmVkIGJ5ICVzIG11c3QgYmUgYW4gaXRlcmF0b3IsIG5vdCAlcyIsCi0JCQkiT3MiLCBmbiwgUHlfVFlQRShkaWN0aXRlbXMpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoZGljdGl0ZW1zID09IFB5X05vbmUpCisgICAgICAgIGRpY3RpdGVtcyA9IE5VTEw7CisgICAgZWxzZSBpZiAoIVB5SXRlcl9DaGVjayhkaWN0aXRlbXMpKSB7CisgICAgICAgIGNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJGaWZ0aCBlbGVtZW50IG9mICIKKyAgICAgICAgICAgICJ0dXBsZSByZXR1cm5lZCBieSAlcyBtdXN0IGJlIGFuIGl0ZXJhdG9yLCBub3QgJXMiLAorICAgICAgICAgICAgIk9zIiwgZm4sIFB5X1RZUEUoZGljdGl0ZW1zKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLSAgICAgICAgLyogUHJvdG9jb2wgMiBzcGVjaWFsIGNhc2U6IGlmIGNhbGxhYmxlJ3MgbmFtZSBpcyBfX25ld29ial9fLCB1c2UKLSAgICAgICAgICogTkVXT0JKLiAgVGhpcyBjb25zdW1lcyBhIGxvdCBvZiBjb2RlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHVzZV9uZXdvYmopIHsKLSAgICAgICAgCVB5T2JqZWN0ICp0ZW1wID0gUHlPYmplY3RfR2V0QXR0cihjYWxsYWJsZSwgX19uYW1lX19fc3RyKTsKKyAgICAvKiBQcm90b2NvbCAyIHNwZWNpYWwgY2FzZTogaWYgY2FsbGFibGUncyBuYW1lIGlzIF9fbmV3b2JqX18sIHVzZQorICAgICAqIE5FV09CSi4gIFRoaXMgY29uc3VtZXMgYSBsb3Qgb2YgY29kZS4KKyAgICAgKi8KKyAgICBpZiAodXNlX25ld29iaikgeworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IFB5T2JqZWN0X0dldEF0dHIoY2FsbGFibGUsIF9fbmFtZV9fX3N0cik7CiAKLQkJaWYgKHRlbXAgPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIC0xOwotCQkJdXNlX25ld29iaiA9IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1c2VfbmV3b2JqID0gUHlTdHJpbmdfQ2hlY2sodGVtcCkgJiYKLQkJCQkgICAgIHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcodGVtcCksCi0JCQkJICAgICAJICAgICJfX25ld29ial9fIikgPT0gMDsKLQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJfQotCX0KLQlpZiAodXNlX25ld29iaikgewotCQlQeU9iamVjdCAqY2xzOwotCQlQeU9iamVjdCAqbmV3YXJndHVwOwotCQlpbnQgbiwgaTsKKyAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgdXNlX25ld29iaiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB1c2VfbmV3b2JqID0gUHlTdHJpbmdfQ2hlY2sodGVtcCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKHRlbXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19uZXdvYmpfXyIpID09IDA7CisgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHVzZV9uZXdvYmopIHsKKyAgICAgICAgUHlPYmplY3QgKmNsczsKKyAgICAgICAgUHlPYmplY3QgKm5ld2FyZ3R1cDsKKyAgICAgICAgaW50IG4sIGk7CiAKLQkJLyogU2FuaXR5IGNoZWNrcy4gKi8KLQkJbiA9IFB5VHVwbGVfU2l6ZShhcmd0dXApOwotCQlpZiAobiA8IDEpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLCAiX19uZXdvYmpfXyBhcmdsaXN0ICIKLQkJCQkiaXMgZW1wdHkiKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICAvKiBTYW5pdHkgY2hlY2tzLiAqLworICAgICAgICBuID0gUHlUdXBsZV9TaXplKGFyZ3R1cCk7CisgICAgICAgIGlmIChuIDwgMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsICJfX25ld29ial9fIGFyZ2xpc3QgIgorICAgICAgICAgICAgICAgICJpcyBlbXB0eSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJY2xzID0gUHlUdXBsZV9HRVRfSVRFTShhcmd0dXAsIDApOwotCQlpZiAoISBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKGNscywgIl9fbmV3X18iKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsICJhcmdzWzBdIGZyb20gIgotCQkJCSJfX25ld29ial9fIGFyZ3MgaGFzIG5vIF9fbmV3X18iKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICBjbHMgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R1cCwgMCk7CisgICAgICAgIGlmICghIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoY2xzLCAiX19uZXdfXyIpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgImFyZ3NbMF0gZnJvbSAiCisgICAgICAgICAgICAgICAgIl9fbmV3b2JqX18gYXJncyBoYXMgbm8gX19uZXdfXyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJLyogWFhYIEhvdyBjb3VsZCBvYiBiZSBOVUxMPyAqLwotCQlpZiAob2IgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKm9iX2RvdF9jbGFzczsKKyAgICAgICAgLyogWFhYIEhvdyBjb3VsZCBvYiBiZSBOVUxMPyAqLworICAgICAgICBpZiAob2IgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKm9iX2RvdF9jbGFzczsKIAotCQkJb2JfZG90X2NsYXNzID0gUHlPYmplY3RfR2V0QXR0cihvYiwgX19jbGFzc19fX3N0cik7Ci0JCQlpZiAob2JfZG90X2NsYXNzID09IE5VTEwpIHsKLQkJCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcygKLQkJCQkJICAgIFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWkgPSBvYl9kb3RfY2xhc3MgIT0gY2xzOyAvKiB0cnVlIGlmZiBhIHByb2JsZW0gKi8KLQkJCVB5X1hERUNSRUYob2JfZG90X2NsYXNzKTsKLQkJCWlmIChpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsICJhcmdzWzBdIGZyb20gIgotCQkJCQkiX19uZXdvYmpfXyBhcmdzIGhhcyB0aGUgd3JvbmcgY2xhc3MiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIG9iX2RvdF9jbGFzcyA9IFB5T2JqZWN0X0dldEF0dHIob2IsIF9fY2xhc3NfX19zdHIpOworICAgICAgICAgICAgaWYgKG9iX2RvdF9jbGFzcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSA9IG9iX2RvdF9jbGFzcyAhPSBjbHM7IC8qIHRydWUgaWZmIGEgcHJvYmxlbSAqLworICAgICAgICAgICAgUHlfWERFQ1JFRihvYl9kb3RfY2xhc3MpOworICAgICAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgImFyZ3NbMF0gZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICJfX25ld29ial9fIGFyZ3MgaGFzIHRoZSB3cm9uZyBjbGFzcyIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8qIFNhdmUgdGhlIGNsYXNzIGFuZCBpdHMgX19uZXdfXyBhcmd1bWVudHMuICovCi0JCWlmIChzYXZlKHNlbGYsIGNscywgMCkgPCAwKQotCQkJcmV0dXJuIC0xOworICAgICAgICAvKiBTYXZlIHRoZSBjbGFzcyBhbmQgaXRzIF9fbmV3X18gYXJndW1lbnRzLiAqLworICAgICAgICBpZiAoc2F2ZShzZWxmLCBjbHMsIDApIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQluZXdhcmd0dXAgPSBQeVR1cGxlX05ldyhuLTEpOyAgLyogYXJndHVwWzE6XSAqLwotCQlpZiAobmV3YXJndHVwID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWZvciAoaSA9IDE7IGkgPCBuOyArK2kpIHsKLQkJCVB5T2JqZWN0ICp0ZW1wID0gUHlUdXBsZV9HRVRfSVRFTShhcmd0dXAsIGkpOwotCQkJUHlfSU5DUkVGKHRlbXApOwotCQkJUHlUdXBsZV9TRVRfSVRFTShuZXdhcmd0dXAsIGktMSwgdGVtcCk7Ci0JCX0KLQkJaSA9IHNhdmUoc2VsZiwgbmV3YXJndHVwLCAwKTsKLQkJUHlfREVDUkVGKG5ld2FyZ3R1cCk7Ci0JCWlmIChpIDwgMCkKLQkJCXJldHVybiAtMTsKKyAgICAgICAgbmV3YXJndHVwID0gUHlUdXBsZV9OZXcobi0xKTsgIC8qIGFyZ3R1cFsxOl0gKi8KKyAgICAgICAgaWYgKG5ld2FyZ3R1cCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdGVtcCA9IFB5VHVwbGVfR0VUX0lURU0oYXJndHVwLCBpKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0ZW1wKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJndHVwLCBpLTEsIHRlbXApOworICAgICAgICB9CisgICAgICAgIGkgPSBzYXZlKHNlbGYsIG5ld2FyZ3R1cCwgMCk7CisgICAgICAgIFB5X0RFQ1JFRihuZXdhcmd0dXApOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJLyogQWRkIE5FV09CSiBvcGNvZGUuICovCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZuZXdvYmosIDEpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIE5vdCB1c2luZyBORVdPQkouICovCi0JCWlmIChzYXZlKHNlbGYsIGNhbGxhYmxlLCAwKSA8IDAgfHwKLQkJICAgIHNhdmUoc2VsZiwgYXJndHVwLCAwKSA8IDAgfHwKLQkJICAgIHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnJlZHVjZSwgMSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICAgICAgLyogQWRkIE5FV09CSiBvcGNvZGUuICovCisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZuZXdvYmosIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIE5vdCB1c2luZyBORVdPQkouICovCisgICAgICAgIGlmIChzYXZlKHNlbGYsIGNhbGxhYmxlLCAwKSA8IDAgfHwKKyAgICAgICAgICAgIHNhdmUoc2VsZiwgYXJndHVwLCAwKSA8IDAgfHwKKyAgICAgICAgICAgIHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnJlZHVjZSwgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIE1lbW9pemUuICovCi0JLyogWFhYIEhvdyBjYW4gb2IgYmUgTlVMTD8gKi8KLQlpZiAob2IgIT0gTlVMTCkgewotCQlpZiAoc3RhdGUgJiYgIVB5RGljdF9DaGVjayhzdGF0ZSkpIHsKLQkJCWlmIChwdXQyKHNlbGYsIG9iKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgaWYgKHB1dChzZWxmLCBvYikgPCAwKQotCQkJCXJldHVybiAtMTsKLQl9CisgICAgLyogTWVtb2l6ZS4gKi8KKyAgICAvKiBYWFggSG93IGNhbiBvYiBiZSBOVUxMPyAqLworICAgIGlmIChvYiAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdGF0ZSAmJiAhUHlEaWN0X0NoZWNrKHN0YXRlKSkgeworICAgICAgICAgICAgaWYgKHB1dDIoc2VsZiwgb2IpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocHV0KHNlbGYsIG9iKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCiAKLSAgICAgICAgaWYgKGxpc3RpdGVtcyAmJiBiYXRjaF9saXN0KHNlbGYsIGxpc3RpdGVtcykgPCAwKQotICAgICAgICAJcmV0dXJuIC0xOworICAgIGlmIChsaXN0aXRlbXMgJiYgYmF0Y2hfbGlzdChzZWxmLCBsaXN0aXRlbXMpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICAgIGlmIChkaWN0aXRlbXMgJiYgYmF0Y2hfZGljdChzZWxmLCBkaWN0aXRlbXMpIDwgMCkKLSAgICAgICAgCXJldHVybiAtMTsKKyAgICBpZiAoZGljdGl0ZW1zICYmIGJhdGNoX2RpY3Qoc2VsZiwgZGljdGl0ZW1zKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmIChzdGF0ZSkgewotCQlpZiAoc2F2ZShzZWxmLCBzdGF0ZSwgMCkgPCAwIHx8Ci0JCSAgICBzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZidWlsZCwgMSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoc3RhdGUpIHsKKyAgICAgICAgaWYgKHNhdmUoc2VsZiwgc3RhdGUsIDApIDwgMCB8fAorICAgICAgICAgICAgc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYnVpbGQsIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogc2F2ZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IHBlcnNfc2F2ZSkKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGU7Ci0JUHlPYmplY3QgKnB5X29iX2lkID0gMCwgKl9fcmVkdWNlX18gPSAwLCAqdCA9IDA7Ci0JaW50IHJlcyA9IC0xOwotCWludCB0bXA7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlOworICAgIFB5T2JqZWN0ICpweV9vYl9pZCA9IDAsICpfX3JlZHVjZV9fID0gMCwgKnQgPSAwOworICAgIGludCByZXMgPSAtMTsKKyAgICBpbnQgdG1wOwogCi0JaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIHBpY2tsaW5nIGFuIG9iamVjdCIpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIHBpY2tsaW5nIGFuIG9iamVjdCIpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoIXBlcnNfc2F2ZSAmJiBzZWxmLT5wZXJzX2Z1bmMpIHsKLQkJaWYgKCh0bXAgPSBzYXZlX3BlcnMoc2VsZiwgYXJncywgc2VsZi0+cGVyc19mdW5jKSkgIT0gMCkgewotCQkJcmVzID0gdG1wOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfQorICAgIGlmICghcGVyc19zYXZlICYmIHNlbGYtPnBlcnNfZnVuYykgeworICAgICAgICBpZiAoKHRtcCA9IHNhdmVfcGVycyhzZWxmLCBhcmdzLCBzZWxmLT5wZXJzX2Z1bmMpKSAhPSAwKSB7CisgICAgICAgICAgICByZXMgPSB0bXA7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoYXJncyA9PSBQeV9Ob25lKSB7Ci0JCXJlcyA9IHNhdmVfbm9uZShzZWxmLCBhcmdzKTsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAoYXJncyA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJlcyA9IHNhdmVfbm9uZShzZWxmLCBhcmdzKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCXR5cGUgPSBQeV9UWVBFKGFyZ3MpOworICAgIHR5cGUgPSBQeV9UWVBFKGFyZ3MpOwogCi0Jc3dpdGNoICh0eXBlLT50cF9uYW1lWzBdKSB7Ci0JY2FzZSAnYic6Ci0JCWlmIChhcmdzID09IFB5X0ZhbHNlIHx8IGFyZ3MgPT0gUHlfVHJ1ZSkgewotCQkJcmVzID0gc2F2ZV9ib29sKHNlbGYsIGFyZ3MpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOwotICAgICAgICBjYXNlICdpJzoKLQkJaWYgKHR5cGUgPT0gJlB5SW50X1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfaW50KHNlbGYsIGFyZ3MpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIHN3aXRjaCAodHlwZS0+dHBfbmFtZVswXSkgeworICAgIGNhc2UgJ2InOgorICAgICAgICBpZiAoYXJncyA9PSBQeV9GYWxzZSB8fCBhcmdzID09IFB5X1RydWUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfYm9vbChzZWxmLCBhcmdzKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICdpJzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5SW50X1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfaW50KHNlbGYsIGFyZ3MpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgJ2wnOgotCQlpZiAodHlwZSA9PSAmUHlMb25nX1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfbG9uZyhzZWxmLCBhcmdzKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICdsJzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5TG9uZ19UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX2xvbmcoc2VsZiwgYXJncyk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAnZic6Ci0JCWlmICh0eXBlID09ICZQeUZsb2F0X1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfZmxvYXQoc2VsZiwgYXJncyk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAnZic6CisgICAgICAgIGlmICh0eXBlID09ICZQeUZsb2F0X1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfZmxvYXQoc2VsZiwgYXJncyk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAndCc6Ci0JCWlmICh0eXBlID09ICZQeVR1cGxlX1R5cGUgJiYgUHlUdXBsZV9TaXplKGFyZ3MpID09IDApIHsKLQkJCXJlcyA9IHNhdmVfdHVwbGUoc2VsZiwgYXJncyk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAndCc6CisgICAgICAgIGlmICh0eXBlID09ICZQeVR1cGxlX1R5cGUgJiYgUHlUdXBsZV9TaXplKGFyZ3MpID09IDApIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfdHVwbGUoc2VsZiwgYXJncyk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAncyc6Ci0JCWlmICgodHlwZSA9PSAmUHlTdHJpbmdfVHlwZSkgJiYgKFB5U3RyaW5nX0dFVF9TSVpFKGFyZ3MpIDwgMikpIHsKLQkJCXJlcyA9IHNhdmVfc3RyaW5nKHNlbGYsIGFyZ3MsIDApOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgICBpZiAoKHR5cGUgPT0gJlB5U3RyaW5nX1R5cGUpICYmIChQeVN0cmluZ19HRVRfU0laRShhcmdzKSA8IDIpKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX3N0cmluZyhzZWxmLCBhcmdzLCAwKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLSAgICAgICAgY2FzZSAndSc6Ci0JCWlmICgodHlwZSA9PSAmUHlVbmljb2RlX1R5cGUpICYmIChQeVN0cmluZ19HRVRfU0laRShhcmdzKSA8IDIpKSB7Ci0JCQlyZXMgPSBzYXZlX3VuaWNvZGUoc2VsZiwgYXJncywgMCk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAndSc6CisgICAgICAgIGlmICgodHlwZSA9PSAmUHlVbmljb2RlX1R5cGUpICYmIChQeVN0cmluZ19HRVRfU0laRShhcmdzKSA8IDIpKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX3VuaWNvZGUoc2VsZiwgYXJncywgMCk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAjZW5kaWYKLQl9CisgICAgfQogCi0JaWYgKFB5X1JFRkNOVChhcmdzKSA+IDEpIHsKLQkJaWYgKCEoIHB5X29iX2lkID0gUHlMb25nX0Zyb21Wb2lkUHRyKGFyZ3MpKSkKLQkJCWdvdG8gZmluYWxseTsKKyAgICBpZiAoUHlfUkVGQ05UKGFyZ3MpID4gMSkgeworICAgICAgICBpZiAoISggcHlfb2JfaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoYXJncykpKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCWlmIChQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBweV9vYl9pZCkpIHsKLQkJCWlmIChnZXQoc2VsZiwgcHlfb2JfaWQpIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBweV9vYl9pZCkpIHsKKyAgICAgICAgICAgIGlmIChnZXQoc2VsZiwgcHlfb2JfaWQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJCXJlcyA9IDA7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9CisgICAgICAgICAgICByZXMgPSAwOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQogCi0Jc3dpdGNoICh0eXBlLT50cF9uYW1lWzBdKSB7Ci0gICAgICAgIGNhc2UgJ3MnOgotCQlpZiAodHlwZSA9PSAmUHlTdHJpbmdfVHlwZSkgewotCQkJcmVzID0gc2F2ZV9zdHJpbmcoc2VsZiwgYXJncywgMSk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgc3dpdGNoICh0eXBlLT50cF9uYW1lWzBdKSB7CisgICAgY2FzZSAncyc6CisgICAgICAgIGlmICh0eXBlID09ICZQeVN0cmluZ19UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX3N0cmluZyhzZWxmLCBhcmdzLCAxKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLSAgICAgICAgY2FzZSAndSc6Ci0JCWlmICh0eXBlID09ICZQeVVuaWNvZGVfVHlwZSkgewotCQkJcmVzID0gc2F2ZV91bmljb2RlKHNlbGYsIGFyZ3MsIDEpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ3UnOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlVbmljb2RlX1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfdW5pY29kZShzZWxmLCBhcmdzLCAxKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICNlbmRpZgogCi0gICAgICAgIGNhc2UgJ3QnOgotCQlpZiAodHlwZSA9PSAmUHlUdXBsZV9UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX3R1cGxlKHNlbGYsIGFyZ3MpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWlmICh0eXBlID09ICZQeVR5cGVfVHlwZSkgewotCQkJcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgTlVMTCk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAndCc6CisgICAgICAgIGlmICh0eXBlID09ICZQeVR1cGxlX1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfdHVwbGUoc2VsZiwgYXJncyk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5VHlwZV9UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlICdsJzoKLQkJaWYgKHR5cGUgPT0gJlB5TGlzdF9UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX2xpc3Qoc2VsZiwgYXJncyk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgICAgIGlmICh0eXBlID09ICZQeUxpc3RfVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9saXN0KHNlbGYsIGFyZ3MpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgJ2QnOgotCQlpZiAodHlwZSA9PSAmUHlEaWN0X1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfZGljdChzZWxmLCBhcmdzKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5RGljdF9UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX2RpY3Qoc2VsZiwgYXJncyk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAnaSc6Ci0JCWlmICh0eXBlID09ICZQeUluc3RhbmNlX1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfaW5zdChzZWxmLCBhcmdzKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICdpJzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5SW5zdGFuY2VfVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9pbnN0KHNlbGYsIGFyZ3MpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgJ2MnOgotCQlpZiAodHlwZSA9PSAmUHlDbGFzc19UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCBOVUxMKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICdjJzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5Q2xhc3NfVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAnZic6Ci0JCWlmICh0eXBlID09ICZQeUZ1bmN0aW9uX1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIE5VTEwpOwotCQkJaWYgKHJlcyAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFBpY2tsZUVycm9yKSkgewotCQkJCS8qIGZhbGwgYmFjayB0byByZWR1Y2UgKi8KLQkJCQlQeUVycl9DbGVhcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ2YnOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlGdW5jdGlvbl9UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChyZXMgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQaWNrbGVFcnJvcikpIHsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIGJhY2sgdG8gcmVkdWNlICovCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlICdiJzoKLQkJaWYgKHR5cGUgPT0gJlB5Q0Z1bmN0aW9uX1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIE5VTEwpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfQorICAgIGNhc2UgJ2InOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlDRnVuY3Rpb25fVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoIXBlcnNfc2F2ZSAmJiBzZWxmLT5pbnN0X3BlcnNfZnVuYykgewotCQlpZiAoKHRtcCA9IHNhdmVfcGVycyhzZWxmLCBhcmdzLCBzZWxmLT5pbnN0X3BlcnNfZnVuYykpICE9IDApIHsKLQkJCXJlcyA9IHRtcDsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICBpZiAoIXBlcnNfc2F2ZSAmJiBzZWxmLT5pbnN0X3BlcnNfZnVuYykgeworICAgICAgICBpZiAoKHRtcCA9IHNhdmVfcGVycyhzZWxmLCBhcmdzLCBzZWxmLT5pbnN0X3BlcnNfZnVuYykpICE9IDApIHsKKyAgICAgICAgICAgIHJlcyA9IHRtcDsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeVR5cGVfVHlwZSkpIHsKLQkJcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgTlVMTCk7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5VHlwZV9UeXBlKSkgeworICAgICAgICByZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCS8qIEdldCBhIHJlZHVjdGlvbiBjYWxsYWJsZSwgYW5kIGNhbGwgaXQuICBUaGlzIG1heSBjb21lIGZyb20KLQkgKiBjb3B5X3JlZy5kaXNwYXRjaF90YWJsZSwgdGhlIG9iamVjdCdzIF9fcmVkdWNlX2V4X18gbWV0aG9kLAotCSAqIG9yIHRoZSBvYmplY3QncyBfX3JlZHVjZV9fIG1ldGhvZC4KLQkgKi8KLQlfX3JlZHVjZV9fID0gUHlEaWN0X0dldEl0ZW0oZGlzcGF0Y2hfdGFibGUsIChQeU9iamVjdCAqKXR5cGUpOwotCWlmIChfX3JlZHVjZV9fICE9IE5VTEwpIHsKLQkJUHlfSU5DUkVGKF9fcmVkdWNlX18pOwotCQlQeV9JTkNSRUYoYXJncyk7Ci0JCUFSR19UVVAoc2VsZiwgYXJncyk7Ci0JCWlmIChzZWxmLT5hcmcpIHsKLQkJCXQgPSBQeU9iamVjdF9DYWxsKF9fcmVkdWNlX18sIHNlbGYtPmFyZywgTlVMTCk7Ci0JCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8qIENoZWNrIGZvciBhIF9fcmVkdWNlX2V4X18gbWV0aG9kLiAqLwotCQlfX3JlZHVjZV9fID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX3JlZHVjZV9leF9fX3N0cik7Ci0JCWlmIChfX3JlZHVjZV9fICE9IE5VTEwpIHsKLQkJCXQgPSBQeUludF9Gcm9tTG9uZyhzZWxmLT5wcm90byk7Ci0JCQlpZiAodCAhPSBOVUxMKSB7Ci0JCQkJQVJHX1RVUChzZWxmLCB0KTsKLQkJCQl0ID0gTlVMTDsKLQkJCQlpZiAoc2VsZi0+YXJnKSB7Ci0JCQkJCXQgPSBQeU9iamVjdF9DYWxsKF9fcmVkdWNlX18sCi0JCQkJCQkJICBzZWxmLT5hcmcsIE5VTEwpOwotCQkJCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQllbHNlCi0JCQkJZ290byBmaW5hbGx5OwotCQkJLyogQ2hlY2sgZm9yIGEgX19yZWR1Y2VfXyBtZXRob2QuICovCi0JCQlfX3JlZHVjZV9fID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX3JlZHVjZV9fX3N0cik7Ci0JCQlpZiAoX19yZWR1Y2VfXyAhPSBOVUxMKSB7Ci0JCQkJdCA9IFB5T2JqZWN0X0NhbGwoX19yZWR1Y2VfXywKLQkJCQkJCSAgZW1wdHlfdHVwbGUsIE5VTEwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUHlFcnJfU2V0T2JqZWN0KFVucGlja2xlYWJsZUVycm9yLCBhcmdzKTsKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogR2V0IGEgcmVkdWN0aW9uIGNhbGxhYmxlLCBhbmQgY2FsbCBpdC4gIFRoaXMgbWF5IGNvbWUgZnJvbQorICAgICAqIGNvcHlfcmVnLmRpc3BhdGNoX3RhYmxlLCB0aGUgb2JqZWN0J3MgX19yZWR1Y2VfZXhfXyBtZXRob2QsCisgICAgICogb3IgdGhlIG9iamVjdCdzIF9fcmVkdWNlX18gbWV0aG9kLgorICAgICAqLworICAgIF9fcmVkdWNlX18gPSBQeURpY3RfR2V0SXRlbShkaXNwYXRjaF90YWJsZSwgKFB5T2JqZWN0ICopdHlwZSk7CisgICAgaWYgKF9fcmVkdWNlX18gIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoX19yZWR1Y2VfXyk7CisgICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICAgICAgQVJHX1RVUChzZWxmLCBhcmdzKTsKKyAgICAgICAgaWYgKHNlbGYtPmFyZykgeworICAgICAgICAgICAgdCA9IFB5T2JqZWN0X0NhbGwoX19yZWR1Y2VfXywgc2VsZi0+YXJnLCBOVUxMKTsKKyAgICAgICAgICAgIEZSRUVfQVJHX1RVUChzZWxmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogQ2hlY2sgZm9yIGEgX19yZWR1Y2VfZXhfXyBtZXRob2QuICovCisgICAgICAgIF9fcmVkdWNlX18gPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fcmVkdWNlX2V4X19fc3RyKTsKKyAgICAgICAgaWYgKF9fcmVkdWNlX18gIT0gTlVMTCkgeworICAgICAgICAgICAgdCA9IFB5SW50X0Zyb21Mb25nKHNlbGYtPnByb3RvKTsKKyAgICAgICAgICAgIGlmICh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBUkdfVFVQKHNlbGYsIHQpOworICAgICAgICAgICAgICAgIHQgPSBOVUxMOworICAgICAgICAgICAgICAgIGlmIChzZWxmLT5hcmcpIHsKKyAgICAgICAgICAgICAgICAgICAgdCA9IFB5T2JqZWN0X0NhbGwoX19yZWR1Y2VfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+YXJnLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRV9BUkdfVFVQKHNlbGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIC8qIENoZWNrIGZvciBhIF9fcmVkdWNlX18gbWV0aG9kLiAqLworICAgICAgICAgICAgX19yZWR1Y2VfXyA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19yZWR1Y2VfX19zdHIpOworICAgICAgICAgICAgaWYgKF9fcmVkdWNlX18gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHQgPSBQeU9iamVjdF9DYWxsKF9fcmVkdWNlX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlfdHVwbGUsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFVucGlja2xlYWJsZUVycm9yLCBhcmdzKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAodCA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHQgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHQpKSB7Ci0JCXJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIHQpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh0KSkgeworICAgICAgICByZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCB0KTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmICghUHlUdXBsZV9DaGVjayh0KSkgewotCQljUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiVmFsdWUgcmV0dXJuZWQgYnkgIgotCQkJCSIlcyBtdXN0IGJlIHN0cmluZyBvciB0dXBsZSIsCi0JCQkJIk8iLCBfX3JlZHVjZV9fKTsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2sodCkpIHsKKyAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIlZhbHVlIHJldHVybmVkIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyBtdXN0IGJlIHN0cmluZyBvciB0dXBsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTyIsIF9fcmVkdWNlX18pOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JcmVzID0gc2F2ZV9yZWR1Y2Uoc2VsZiwgdCwgX19yZWR1Y2VfXywgYXJncyk7CisgICAgcmVzID0gc2F2ZV9yZWR1Y2Uoc2VsZiwgdCwgX19yZWR1Y2VfXywgYXJncyk7CiAKICAgZmluYWxseToKLQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQlQeV9YREVDUkVGKHB5X29iX2lkKTsKLQlQeV9YREVDUkVGKF9fcmVkdWNlX18pOwotCVB5X1hERUNSRUYodCk7CisgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgUHlfWERFQ1JFRihweV9vYl9pZCk7CisgICAgUHlfWERFQ1JFRihfX3JlZHVjZV9fKTsKKyAgICBQeV9YREVDUkVGKHQpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKIHN0YXRpYyBpbnQKIGR1bXAoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RhdGljIGNoYXIgc3RvcCA9IFNUT1A7CisgICAgc3RhdGljIGNoYXIgc3RvcCA9IFNUT1A7CiAKLQlpZiAoc2VsZi0+cHJvdG8gPj0gMikgewotCQljaGFyIGJ5dGVzWzJdOworICAgIGlmIChzZWxmLT5wcm90byA+PSAyKSB7CisgICAgICAgIGNoYXIgYnl0ZXNbMl07CiAKLQkJYnl0ZXNbMF0gPSBQUk9UTzsKLQkJYXNzZXJ0KHNlbGYtPnByb3RvID49IDAgJiYgc2VsZi0+cHJvdG8gPCAyNTYpOwotCQlieXRlc1sxXSA9IChjaGFyKXNlbGYtPnByb3RvOwotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBieXRlcywgMikgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICAgICAgYnl0ZXNbMF0gPSBQUk9UTzsKKyAgICAgICAgYXNzZXJ0KHNlbGYtPnByb3RvID49IDAgJiYgc2VsZi0+cHJvdG8gPCAyNTYpOworICAgICAgICBieXRlc1sxXSA9IChjaGFyKXNlbGYtPnByb3RvOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBieXRlcywgMikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChzYXZlKHNlbGYsIGFyZ3MsIDApIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChzYXZlKHNlbGYsIGFyZ3MsIDApIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnN0b3AsIDEpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZzdG9wLCAxKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIE5VTEwsIDApIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIE5VTEwsIDApIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQaWNrbGVfY2xlYXJfbWVtbyhQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+bWVtbykKLQkJUHlEaWN0X0NsZWFyKHNlbGYtPm1lbW8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoc2VsZi0+bWVtbykKKyAgICAgICAgUHlEaWN0X0NsZWFyKHNlbGYtPm1lbW8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBpY2tsZV9nZXR2YWx1ZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbCwgaSwgcnNpemUsIHNzaXplLCBjbGVhcj0xLCBsbTsKLQlsb25nIGlrOwotCVB5T2JqZWN0ICprLCAqcjsKLQljaGFyICpzLCAqcCwgKmhhdmVfZ2V0OwotCVBkYXRhICpkYXRhOworICAgIGludCBsLCBpLCByc2l6ZSwgc3NpemUsIGNsZWFyPTEsIGxtOworICAgIGxvbmcgaWs7CisgICAgUHlPYmplY3QgKmssICpyOworICAgIGNoYXIgKnMsICpwLCAqaGF2ZV9nZXQ7CisgICAgUGRhdGEgKmRhdGE7CiAKLQkvKiBDYW4gYmUgY2FsbGVkIGJ5IFB5dGhvbiBjb2RlIG9yIEMgY29kZSAqLwotCWlmIChhcmdzICYmICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpnZXR2YWx1ZSIsICZjbGVhcikpCi0JCXJldHVybiBOVUxMOworICAgIC8qIENhbiBiZSBjYWxsZWQgYnkgUHl0aG9uIGNvZGUgb3IgQyBjb2RlICovCisgICAgaWYgKGFyZ3MgJiYgIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmdldHZhbHVlIiwgJmNsZWFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBDaGVjayB0byBtYWtlIHN1cmUgd2UgYXJlIGJhc2VkIG9uIGEgbGlzdCAqLwotCWlmICghIFBkYXRhX0NoZWNrKHNlbGYtPmZpbGUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLAotCQkJCSJBdHRlbXB0IHRvIGdldHZhbHVlKCkgYSBub24tbGlzdC1iYXNlZCBwaWNrbGVyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgd2UgYXJlIGJhc2VkIG9uIGEgbGlzdCAqLworICAgIGlmICghIFBkYXRhX0NoZWNrKHNlbGYtPmZpbGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gZ2V0dmFsdWUoKSBhIG5vbi1saXN0LWJhc2VkIHBpY2tsZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogZmx1c2ggd3JpdGUgYnVmZmVyICovCi0JaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIE5VTEw7CisgICAgLyogZmx1c2ggd3JpdGUgYnVmZmVyICovCisgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIE5VTEw7CiAKLQlkYXRhPShQZGF0YSopc2VsZi0+ZmlsZTsKLQlsPWRhdGEtPmxlbmd0aDsKKyAgICBkYXRhPShQZGF0YSopc2VsZi0+ZmlsZTsKKyAgICBsPWRhdGEtPmxlbmd0aDsKIAotCS8qIHNldCB1cCBhbiBhcnJheSB0byBob2xkIGdldC9wdXQgc3RhdHVzICovCi0JbG0gPSBQeURpY3RfU2l6ZShzZWxmLT5tZW1vKTsKLQlpZiAobG0gPCAwKSByZXR1cm4gTlVMTDsKLQlsbSsrOwotCWhhdmVfZ2V0ID0gbWFsbG9jKGxtKTsKLQlpZiAoaGF2ZV9nZXQgPT0gTlVMTCkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JbWVtc2V0KGhhdmVfZ2V0LCAwLCBsbSk7CisgICAgLyogc2V0IHVwIGFuIGFycmF5IHRvIGhvbGQgZ2V0L3B1dCBzdGF0dXMgKi8KKyAgICBsbSA9IFB5RGljdF9TaXplKHNlbGYtPm1lbW8pOworICAgIGlmIChsbSA8IDApIHJldHVybiBOVUxMOworICAgIGxtKys7CisgICAgaGF2ZV9nZXQgPSBtYWxsb2MobG0pOworICAgIGlmIChoYXZlX2dldCA9PSBOVUxMKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBtZW1zZXQoaGF2ZV9nZXQsIDAsIGxtKTsKIAotCS8qIFNjYW4gZm9yIGdldHMuICovCi0JZm9yIChyc2l6ZSA9IDAsIGkgPSBsOyAtLWkgPj0gMDsgKSB7Ci0JCWsgPSBkYXRhLT5kYXRhW2ldOworICAgIC8qIFNjYW4gZm9yIGdldHMuICovCisgICAgZm9yIChyc2l6ZSA9IDAsIGkgPSBsOyAtLWkgPj0gMDsgKSB7CisgICAgICAgIGsgPSBkYXRhLT5kYXRhW2ldOwogCi0JCWlmIChQeVN0cmluZ19DaGVjayhrKSkKLQkJCXJzaXplICs9IFB5U3RyaW5nX0dFVF9TSVpFKGspOworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soaykpCisgICAgICAgICAgICByc2l6ZSArPSBQeVN0cmluZ19HRVRfU0laRShrKTsKIAotCQllbHNlIGlmIChQeUludF9DaGVjayhrKSkgeyAvKiBwdXQgKi8KLQkJCWlrID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKWspOwotCQkJaWYgKGlrID49IGxtIHx8IGlrID09IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKLQkJCQkJCSJJbnZhbGlkIGdldCBkYXRhIik7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCQlpZiAoaGF2ZV9nZXRbaWtdKSAvKiB3aXRoIG1hdGNoaW5nIGdldCAqLwotCQkJCXJzaXplICs9IGlrIDwgMjU2ID8gMiA6IDU7Ci0JCX0KKyAgICAgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2soaykpIHsgLyogcHV0ICovCisgICAgICAgICAgICBpayA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0KilrKTsKKyAgICAgICAgICAgIGlmIChpayA+PSBsbSB8fCBpayA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGdldCBkYXRhIik7CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGF2ZV9nZXRbaWtdKSAvKiB3aXRoIG1hdGNoaW5nIGdldCAqLworICAgICAgICAgICAgICAgIHJzaXplICs9IGlrIDwgMjU2ID8gMiA6IDU7CisgICAgICAgIH0KIAotCQllbHNlIGlmICghIChQeVR1cGxlX0NoZWNrKGspICYmCi0JCQkgICAgUHlUdXBsZV9HRVRfU0laRShrKSA9PSAyICYmCi0JCQkgICAgUHlJbnRfQ2hlY2soKGsgPSBQeVR1cGxlX0dFVF9JVEVNKGssIDApKSkpCi0JCQkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLAotCQkJCQkiVW5leHBlY3RlZCBkYXRhIGluIGludGVybmFsIGxpc3QiKTsKLQkJCWdvdG8gZXJyOwotCQl9CisgICAgICAgIGVsc2UgaWYgKCEgKFB5VHVwbGVfQ2hlY2soaykgJiYKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfU0laRShrKSA9PSAyICYmCisgICAgICAgICAgICAgICAgICAgIFB5SW50X0NoZWNrKChrID0gUHlUdXBsZV9HRVRfSVRFTShrLCAwKSkpKQorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBkYXRhIGluIGludGVybmFsIGxpc3QiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CiAKLQkJZWxzZSB7IC8qIHB1dCAqLwotCQkJaWsgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKWspOwotCQkJaWYgKGlrID49IGxtIHx8IGlrID09IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKLQkJCQkJCSJJbnZhbGlkIGdldCBkYXRhIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQloYXZlX2dldFtpa10gPSAxOwotCQkJcnNpemUgKz0gaWsgPCAyNTYgPyAyIDogNTsKLQkJfQotCX0KKyAgICAgICAgZWxzZSB7IC8qIHB1dCAqLworICAgICAgICAgICAgaWsgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKWspOworICAgICAgICAgICAgaWYgKGlrID49IGxtIHx8IGlrID09IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZ2V0IGRhdGEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhdmVfZ2V0W2lrXSA9IDE7CisgICAgICAgICAgICByc2l6ZSArPSBpayA8IDI1NiA/IDIgOiA1OworICAgICAgICB9CisgICAgfQogCi0JLyogTm93IGdlbmVyYXRlIHRoZSByZXN1bHQgKi8KLQlyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcnNpemUpOwotCWlmIChyID09IE5VTEwpIGdvdG8gZXJyOwotCXMgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcik7CisgICAgLyogTm93IGdlbmVyYXRlIHRoZSByZXN1bHQgKi8KKyAgICByID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcnNpemUpOworICAgIGlmIChyID09IE5VTEwpIGdvdG8gZXJyOworICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0JCWsgPSBkYXRhLT5kYXRhW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgayA9IGRhdGEtPmRhdGFbaV07CiAKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGspKSB7Ci0JCQlzc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGspOwotCQkJaWYgKHNzaXplKSB7Ci0JCQkJcD1QeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopayk7Ci0JCQkJd2hpbGUgKC0tc3NpemUgPj0gMCkKLQkJCQkJKnMrKyA9ICpwKys7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGspKSB7CisgICAgICAgICAgICBzc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGspOworICAgICAgICAgICAgaWYgKHNzaXplKSB7CisgICAgICAgICAgICAgICAgcD1QeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopayk7CisgICAgICAgICAgICAgICAgd2hpbGUgKC0tc3NpemUgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgKnMrKyA9ICpwKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQllbHNlIGlmIChQeVR1cGxlX0NoZWNrKGspKSB7IC8qIGdldCAqLwotCQkJaWsgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKQotCQkJCQkgICAgUHlUdXBsZV9HRVRfSVRFTShrLCAwKSk7Ci0JCQlpZiAoaWsgPCAyNTYpIHsKLQkJCQkqcysrID0gQklOR0VUOwotCQkJCSpzKysgPSAoaW50KShpayAmIDB4ZmYpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJKnMrKyA9IExPTkdfQklOR0VUOwotCQkJCSpzKysgPSAoaW50KShpayAmIDB4ZmYpOwotCQkJCSpzKysgPSAoaW50KSgoaWsgPj4gOCkgICYgMHhmZik7Ci0JCQkJKnMrKyA9IChpbnQpKChpayA+PiAxNikgJiAweGZmKTsKLQkJCQkqcysrID0gKGludCkoKGlrID4+IDI0KSAmIDB4ZmYpOwotCQkJfQotCQl9CisgICAgICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soaykpIHsgLyogZ2V0ICovCisgICAgICAgICAgICBpayA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oaywgMCkpOworICAgICAgICAgICAgaWYgKGlrIDwgMjU2KSB7CisgICAgICAgICAgICAgICAgKnMrKyA9IEJJTkdFVDsKKyAgICAgICAgICAgICAgICAqcysrID0gKGludCkoaWsgJiAweGZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICpzKysgPSBMT05HX0JJTkdFVDsKKyAgICAgICAgICAgICAgICAqcysrID0gKGludCkoaWsgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAqcysrID0gKGludCkoKGlrID4+IDgpICAmIDB4ZmYpOworICAgICAgICAgICAgICAgICpzKysgPSAoaW50KSgoaWsgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgKnMrKyA9IChpbnQpKChpayA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWVsc2UgeyAvKiBwdXQgKi8KLQkJCWlrID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKWspOworICAgICAgICBlbHNlIHsgLyogcHV0ICovCisgICAgICAgICAgICBpayA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0KilrKTsKIAotCQkJaWYgKGhhdmVfZ2V0W2lrXSkgeyAvKiB3aXRoIG1hdGNoaW5nIGdldCAqLwotCQkJCWlmIChpayA8IDI1NikgewotCQkJCQkqcysrID0gQklOUFVUOwotCQkJCQkqcysrID0gKGludCkoaWsgJiAweGZmKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCSpzKysgPSBMT05HX0JJTlBVVDsKLQkJCQkJKnMrKyA9IChpbnQpKGlrICYgMHhmZik7Ci0JCQkJCSpzKysgPSAoaW50KSgoaWsgPj4gOCkgICYgMHhmZik7Ci0JCQkJCSpzKysgPSAoaW50KSgoaWsgPj4gMTYpICYgMHhmZik7Ci0JCQkJCSpzKysgPSAoaW50KSgoaWsgPj4gMjQpICYgMHhmZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgaWYgKGhhdmVfZ2V0W2lrXSkgeyAvKiB3aXRoIG1hdGNoaW5nIGdldCAqLworICAgICAgICAgICAgICAgIGlmIChpayA8IDI1NikgeworICAgICAgICAgICAgICAgICAgICAqcysrID0gQklOUFVUOworICAgICAgICAgICAgICAgICAgICAqcysrID0gKGludCkoaWsgJiAweGZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICpzKysgPSBMT05HX0JJTlBVVDsKKyAgICAgICAgICAgICAgICAgICAgKnMrKyA9IChpbnQpKGlrICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpzKysgPSAoaW50KSgoaWsgPj4gOCkgICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpzKysgPSAoaW50KSgoaWsgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICpzKysgPSAoaW50KSgoaWsgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKGNsZWFyKSB7Ci0JCVB5RGljdF9DbGVhcihzZWxmLT5tZW1vKTsKLQkJUGRhdGFfY2xlYXIoZGF0YSwgMCk7Ci0JfQorICAgIGlmIChjbGVhcikgeworICAgICAgICBQeURpY3RfQ2xlYXIoc2VsZi0+bWVtbyk7CisgICAgICAgIFBkYXRhX2NsZWFyKGRhdGEsIDApOworICAgIH0KIAotCWZyZWUoaGF2ZV9nZXQpOwotCXJldHVybiByOworICAgIGZyZWUoaGF2ZV9nZXQpOworICAgIHJldHVybiByOwogICBlcnI6Ci0JZnJlZShoYXZlX2dldCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgZnJlZShoYXZlX2dldCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQaWNrbGVyX2R1bXAoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKm9iOwotCWludCBnZXQ9MDsKKyAgICBQeU9iamVjdCAqb2I7CisgICAgaW50IGdldD0wOwogCi0JaWYgKCEoIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpkdW1wIiwgJm9iLCAmZ2V0KSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghKCBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6ZHVtcCIsICZvYiwgJmdldCkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChkdW1wKHNlbGYsIG9iKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChkdW1wKHNlbGYsIG9iKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGdldCkgcmV0dXJuIFBpY2tsZV9nZXR2YWx1ZShzZWxmLCBOVUxMKTsKKyAgICBpZiAoZ2V0KSByZXR1cm4gUGlja2xlX2dldHZhbHVlKHNlbGYsIE5VTEwpOwogCi0JLyogWFhYIFdoeSBkb2VzIGR1bXAoKSByZXR1cm4gc2VsZj8gKi8KLQlQeV9JTkNSRUYoc2VsZik7Ci0JcmV0dXJuIChQeU9iamVjdCopc2VsZjsKKyAgICAvKiBYWFggV2h5IGRvZXMgZHVtcCgpIHJldHVybiBzZWxmPyAqLworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOwogfQogCiAKQEAgLTI5ODUsMjUwICsyOTg1LDI1MCBAQAogc3RhdGljIFBpY2tsZXJvYmplY3QgKgogbmV3UGlja2xlcm9iamVjdChQeU9iamVjdCAqZmlsZSwgaW50IHByb3RvKQogewotCVBpY2tsZXJvYmplY3QgKnNlbGY7CisgICAgUGlja2xlcm9iamVjdCAqc2VsZjsKIAotCWlmIChwcm90byA8IDApCi0JCXByb3RvID0gSElHSEVTVF9QUk9UT0NPTDsKLQlpZiAocHJvdG8gPiBISUdIRVNUX1BST1RPQ09MKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAicGlja2xlIHByb3RvY29sICVkIGFza2VkIGZvcjsgIgotCQkJICAgICAidGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHByb3RvY29sIGlzICVkIiwKLQkJCSAgICAgcHJvdG8sIEhJR0hFU1RfUFJPVE9DT0wpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHByb3RvIDwgMCkKKyAgICAgICAgcHJvdG8gPSBISUdIRVNUX1BST1RPQ09MOworICAgIGlmIChwcm90byA+IEhJR0hFU1RfUFJPVE9DT0wpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJwaWNrbGUgcHJvdG9jb2wgJWQgYXNrZWQgZm9yOyAiCisgICAgICAgICAgICAgICAgICAgICAidGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHByb3RvY29sIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLCBISUdIRVNUX1BST1RPQ09MKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc2VsZiA9IFB5T2JqZWN0X0dDX05ldyhQaWNrbGVyb2JqZWN0LCAmUGlja2xlcnR5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnByb3RvID0gcHJvdG87Ci0Jc2VsZi0+YmluID0gcHJvdG8gPiAwOwotCXNlbGYtPmZwID0gTlVMTDsKLQlzZWxmLT53cml0ZSA9IE5VTEw7Ci0Jc2VsZi0+bWVtbyA9IE5VTEw7Ci0Jc2VsZi0+YXJnID0gTlVMTDsKLQlzZWxmLT5wZXJzX2Z1bmMgPSBOVUxMOwotCXNlbGYtPmluc3RfcGVyc19mdW5jID0gTlVMTDsKLQlzZWxmLT53cml0ZV9idWYgPSBOVUxMOwotCXNlbGYtPmZhc3QgPSAwOwotCXNlbGYtPmZhc3RfY29udGFpbmVyID0gMDsKLQlzZWxmLT5mYXN0X21lbW8gPSBOVUxMOwotCXNlbGYtPmJ1Zl9zaXplID0gMDsKLQlzZWxmLT5kaXNwYXRjaF90YWJsZSA9IE5VTEw7CisgICAgc2VsZiA9IFB5T2JqZWN0X0dDX05ldyhQaWNrbGVyb2JqZWN0LCAmUGlja2xlcnR5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnByb3RvID0gcHJvdG87CisgICAgc2VsZi0+YmluID0gcHJvdG8gPiAwOworICAgIHNlbGYtPmZwID0gTlVMTDsKKyAgICBzZWxmLT53cml0ZSA9IE5VTEw7CisgICAgc2VsZi0+bWVtbyA9IE5VTEw7CisgICAgc2VsZi0+YXJnID0gTlVMTDsKKyAgICBzZWxmLT5wZXJzX2Z1bmMgPSBOVUxMOworICAgIHNlbGYtPmluc3RfcGVyc19mdW5jID0gTlVMTDsKKyAgICBzZWxmLT53cml0ZV9idWYgPSBOVUxMOworICAgIHNlbGYtPmZhc3QgPSAwOworICAgIHNlbGYtPmZhc3RfY29udGFpbmVyID0gMDsKKyAgICBzZWxmLT5mYXN0X21lbW8gPSBOVUxMOworICAgIHNlbGYtPmJ1Zl9zaXplID0gMDsKKyAgICBzZWxmLT5kaXNwYXRjaF90YWJsZSA9IE5VTEw7CiAKLQlzZWxmLT5maWxlID0gTlVMTDsKLQlpZiAoZmlsZSkKLQkJUHlfSU5DUkVGKGZpbGUpOwotCWVsc2UgewotCQlmaWxlID0gUGRhdGFfTmV3KCk7Ci0JCWlmIChmaWxlID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQl9Ci0Jc2VsZi0+ZmlsZSA9IGZpbGU7CisgICAgc2VsZi0+ZmlsZSA9IE5VTEw7CisgICAgaWYgKGZpbGUpCisgICAgICAgIFB5X0lOQ1JFRihmaWxlKTsKKyAgICBlbHNlIHsKKyAgICAgICAgZmlsZSA9IFBkYXRhX05ldygpOworICAgICAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIHNlbGYtPmZpbGUgPSBmaWxlOwogCi0JaWYgKCEoIHNlbGYtPm1lbW8gPSBQeURpY3RfTmV3KCkpKQotCQlnb3RvIGVycjsKKyAgICBpZiAoISggc2VsZi0+bWVtbyA9IFB5RGljdF9OZXcoKSkpCisgICAgICAgIGdvdG8gZXJyOwogCi0JaWYgKFB5RmlsZV9DaGVjayhmaWxlKSkgewotCQlzZWxmLT5mcCA9IFB5RmlsZV9Bc0ZpbGUoZmlsZSk7Ci0JCWlmIChzZWxmLT5mcCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCXNlbGYtPndyaXRlX2Z1bmMgPSB3cml0ZV9maWxlOwotCX0KLQllbHNlIGlmIChQeWNTdHJpbmdJT19PdXRwdXRDaGVjayhmaWxlKSkgewotCQlzZWxmLT53cml0ZV9mdW5jID0gd3JpdGVfY1N0cmluZ0lPOwotCX0KLQllbHNlIGlmIChmaWxlID09IFB5X05vbmUpIHsKLQkJc2VsZi0+d3JpdGVfZnVuYyA9IHdyaXRlX25vbmU7Ci0JfQotCWVsc2UgewotCQlzZWxmLT53cml0ZV9mdW5jID0gd3JpdGVfb3RoZXI7CisgICAgaWYgKFB5RmlsZV9DaGVjayhmaWxlKSkgeworICAgICAgICBzZWxmLT5mcCA9IFB5RmlsZV9Bc0ZpbGUoZmlsZSk7CisgICAgICAgIGlmIChzZWxmLT5mcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+d3JpdGVfZnVuYyA9IHdyaXRlX2ZpbGU7CisgICAgfQorICAgIGVsc2UgaWYgKFB5Y1N0cmluZ0lPX091dHB1dENoZWNrKGZpbGUpKSB7CisgICAgICAgIHNlbGYtPndyaXRlX2Z1bmMgPSB3cml0ZV9jU3RyaW5nSU87CisgICAgfQorICAgIGVsc2UgaWYgKGZpbGUgPT0gUHlfTm9uZSkgeworICAgICAgICBzZWxmLT53cml0ZV9mdW5jID0gd3JpdGVfbm9uZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNlbGYtPndyaXRlX2Z1bmMgPSB3cml0ZV9vdGhlcjsKIAotCQlpZiAoISBQZGF0YV9DaGVjayhmaWxlKSkgewotCQkJc2VsZi0+d3JpdGUgPSBQeU9iamVjdF9HZXRBdHRyKGZpbGUsIHdyaXRlX3N0cik7Ci0JCQlpZiAoIXNlbGYtPndyaXRlKSAgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJhcmd1bWVudCBtdXN0IGhhdmUgJ3dyaXRlJyAiCi0JCQkJCQkiYXR0cmlidXRlIik7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKCEgUGRhdGFfQ2hlY2soZmlsZSkpIHsKKyAgICAgICAgICAgIHNlbGYtPndyaXRlID0gUHlPYmplY3RfR2V0QXR0cihmaWxlLCB3cml0ZV9zdHIpOworICAgICAgICAgICAgaWYgKCFzZWxmLT53cml0ZSkgIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBtdXN0IGhhdmUgJ3dyaXRlJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXNlbGYtPndyaXRlX2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKFdSSVRFX0JVRl9TSVpFKTsKLQkJaWYgKHNlbGYtPndyaXRlX2J1ZiA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9CisgICAgICAgIHNlbGYtPndyaXRlX2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKFdSSVRFX0JVRl9TSVpFKTsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgewotCQkvKiBSZXN0cmljdGVkIGV4ZWN1dGlvbiwgZ2V0IHByaXZhdGUgdGFibGVzICovCi0JCVB5T2JqZWN0ICptID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJjb3B5X3JlZyIpOworICAgIGlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7CisgICAgICAgIC8qIFJlc3RyaWN0ZWQgZXhlY3V0aW9uLCBnZXQgcHJpdmF0ZSB0YWJsZXMgKi8KKyAgICAgICAgUHlPYmplY3QgKm0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoImNvcHlfcmVnIik7CiAKLQkJaWYgKG0gPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCQlzZWxmLT5kaXNwYXRjaF90YWJsZSA9IFB5T2JqZWN0X0dldEF0dHIobSwgZGlzcGF0Y2hfdGFibGVfc3RyKTsKLQkJUHlfREVDUkVGKG0pOwotCQlpZiAoc2VsZi0+ZGlzcGF0Y2hfdGFibGUgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCX0KLQllbHNlIHsKLQkJc2VsZi0+ZGlzcGF0Y2hfdGFibGUgPSBkaXNwYXRjaF90YWJsZTsKLQkJUHlfSU5DUkVGKGRpc3BhdGNoX3RhYmxlKTsKLQl9Ci0JUHlPYmplY3RfR0NfVHJhY2soc2VsZik7CisgICAgICAgIGlmIChtID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgc2VsZi0+ZGlzcGF0Y2hfdGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKG0sIGRpc3BhdGNoX3RhYmxlX3N0cik7CisgICAgICAgIFB5X0RFQ1JFRihtKTsKKyAgICAgICAgaWYgKHNlbGYtPmRpc3BhdGNoX3RhYmxlID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNlbGYtPmRpc3BhdGNoX3RhYmxlID0gZGlzcGF0Y2hfdGFibGU7CisgICAgICAgIFB5X0lOQ1JFRihkaXNwYXRjaF90YWJsZSk7CisgICAgfQorICAgIFB5T2JqZWN0X0dDX1RyYWNrKHNlbGYpOwogCi0JcmV0dXJuIHNlbGY7CisgICAgcmV0dXJuIHNlbGY7CiAKICAgZXJyOgotCVB5X0RFQ1JFRihzZWxmKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9QaWNrbGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmaWxlIiwgInByb3RvY29sIiwgTlVMTH07Ci0JUHlPYmplY3QgKmZpbGUgPSBOVUxMOwotCWludCBwcm90byA9IDA7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmaWxlIiwgInByb3RvY29sIiwgTlVMTH07CisgICAgUHlPYmplY3QgKmZpbGUgPSBOVUxMOworICAgIGludCBwcm90byA9IDA7CiAKLQkvKiBYWFgKLQkgKiBUaGUgZG9jdW1lbnRlZCBzaWduYXR1cmUgaXMgUGlja2xlcihmaWxlLCBwcm90b2NvbD0wKSwgYnV0IHRoaXMKLQkgKiBhY2NlcHRzIFBpY2tsZXIoKSBhbmQgUGlja2xlcihpbnRlZ2VyKSB0b28uICBUaGUgbWVhbmluZyB0aGVuCi0JICogaXMgY2xlYXIgYXMgbXVkLCB1bmRvY3VtZW50ZWQsIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IHBpY2tsZS5weS4KLQkgKiBJJ20gdG9sZCBab3BlIHVzZXMgdGhpcywgYnV0IEkgaGF2ZW4ndCB0cmFjZWQgaW50byB0aGlzIGNvZGUKLQkgKiBmYXIgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgd2hhdCBpdCBtZWFucy4KLQkgKi8KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOlBpY2tsZXIiLCAmcHJvdG8pKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXByb3RvID0gMDsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98aTpQaWNrbGVyIiwKLQkJCSAgICBrd2xpc3QsICZmaWxlLCAmcHJvdG8pKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKiluZXdQaWNrbGVyb2JqZWN0KGZpbGUsIHByb3RvKTsKKyAgICAvKiBYWFgKKyAgICAgKiBUaGUgZG9jdW1lbnRlZCBzaWduYXR1cmUgaXMgUGlja2xlcihmaWxlLCBwcm90b2NvbD0wKSwgYnV0IHRoaXMKKyAgICAgKiBhY2NlcHRzIFBpY2tsZXIoKSBhbmQgUGlja2xlcihpbnRlZ2VyKSB0b28uICBUaGUgbWVhbmluZyB0aGVuCisgICAgICogaXMgY2xlYXIgYXMgbXVkLCB1bmRvY3VtZW50ZWQsIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IHBpY2tsZS5weS4KKyAgICAgKiBJJ20gdG9sZCBab3BlIHVzZXMgdGhpcywgYnV0IEkgaGF2ZW4ndCB0cmFjZWQgaW50byB0aGlzIGNvZGUKKyAgICAgKiBmYXIgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgd2hhdCBpdCBtZWFucy4KKyAgICAgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOlBpY2tsZXIiLCAmcHJvdG8pKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHByb3RvID0gMDsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98aTpQaWNrbGVyIiwKKyAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmZmlsZSwgJnByb3RvKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3UGlja2xlcm9iamVjdChmaWxlLCBwcm90byk7CiB9CiAKIAogc3RhdGljIHZvaWQKIFBpY2tsZXJfZGVhbGxvYyhQaWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0JUHlfWERFQ1JFRihzZWxmLT53cml0ZSk7Ci0JUHlfWERFQ1JFRihzZWxmLT5tZW1vKTsKLQlQeV9YREVDUkVGKHNlbGYtPmZhc3RfbWVtbyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5hcmcpOwotCVB5X1hERUNSRUYoc2VsZi0+ZmlsZSk7Ci0JUHlfWERFQ1JFRihzZWxmLT5wZXJzX2Z1bmMpOwotCVB5X1hERUNSRUYoc2VsZi0+aW5zdF9wZXJzX2Z1bmMpOwotCVB5X1hERUNSRUYoc2VsZi0+ZGlzcGF0Y2hfdGFibGUpOwotCVB5TWVtX0ZyZWUoc2VsZi0+d3JpdGVfYnVmKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT53cml0ZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5tZW1vKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmZhc3RfbWVtbyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5hcmcpOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZmlsZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5wZXJzX2Z1bmMpOworICAgIFB5X1hERUNSRUYoc2VsZi0+aW5zdF9wZXJzX2Z1bmMpOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZGlzcGF0Y2hfdGFibGUpOworICAgIFB5TWVtX0ZyZWUoc2VsZi0+d3JpdGVfYnVmKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBQaWNrbGVyX3RyYXZlcnNlKFBpY2tsZXJvYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNlbGYtPndyaXRlKTsKLQlQeV9WSVNJVChzZWxmLT5tZW1vKTsKLQlQeV9WSVNJVChzZWxmLT5mYXN0X21lbW8pOwotCVB5X1ZJU0lUKHNlbGYtPmFyZyk7Ci0JUHlfVklTSVQoc2VsZi0+ZmlsZSk7Ci0JUHlfVklTSVQoc2VsZi0+cGVyc19mdW5jKTsKLQlQeV9WSVNJVChzZWxmLT5pbnN0X3BlcnNfZnVuYyk7Ci0JUHlfVklTSVQoc2VsZi0+ZGlzcGF0Y2hfdGFibGUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNlbGYtPndyaXRlKTsKKyAgICBQeV9WSVNJVChzZWxmLT5tZW1vKTsKKyAgICBQeV9WSVNJVChzZWxmLT5mYXN0X21lbW8pOworICAgIFB5X1ZJU0lUKHNlbGYtPmFyZyk7CisgICAgUHlfVklTSVQoc2VsZi0+ZmlsZSk7CisgICAgUHlfVklTSVQoc2VsZi0+cGVyc19mdW5jKTsKKyAgICBQeV9WSVNJVChzZWxmLT5pbnN0X3BlcnNfZnVuYyk7CisgICAgUHlfVklTSVQoc2VsZi0+ZGlzcGF0Y2hfdGFibGUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBQaWNrbGVyX2NsZWFyKFBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlfQ0xFQVIoc2VsZi0+d3JpdGUpOwotCVB5X0NMRUFSKHNlbGYtPm1lbW8pOwotCVB5X0NMRUFSKHNlbGYtPmZhc3RfbWVtbyk7Ci0JUHlfQ0xFQVIoc2VsZi0+YXJnKTsKLQlQeV9DTEVBUihzZWxmLT5maWxlKTsKLQlQeV9DTEVBUihzZWxmLT5wZXJzX2Z1bmMpOwotCVB5X0NMRUFSKHNlbGYtPmluc3RfcGVyc19mdW5jKTsKLQlQeV9DTEVBUihzZWxmLT5kaXNwYXRjaF90YWJsZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfQ0xFQVIoc2VsZi0+d3JpdGUpOworICAgIFB5X0NMRUFSKHNlbGYtPm1lbW8pOworICAgIFB5X0NMRUFSKHNlbGYtPmZhc3RfbWVtbyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+YXJnKTsKKyAgICBQeV9DTEVBUihzZWxmLT5maWxlKTsKKyAgICBQeV9DTEVBUihzZWxmLT5wZXJzX2Z1bmMpOworICAgIFB5X0NMRUFSKHNlbGYtPmluc3RfcGVyc19mdW5jKTsKKyAgICBQeV9DTEVBUihzZWxmLT5kaXNwYXRjaF90YWJsZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQaWNrbGVyX2dldF9wZXJzX2Z1bmMoUGlja2xlcm9iamVjdCAqcCkKIHsKLQlpZiAocC0+cGVyc19mdW5jID09IE5VTEwpCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgInBlcnNpc3RlbnRfaWQiKTsKLQllbHNlCi0JCVB5X0lOQ1JFRihwLT5wZXJzX2Z1bmMpOwotCXJldHVybiBwLT5wZXJzX2Z1bmM7CisgICAgaWYgKHAtPnBlcnNfZnVuYyA9PSBOVUxMKQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJwZXJzaXN0ZW50X2lkIik7CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYocC0+cGVyc19mdW5jKTsKKyAgICByZXR1cm4gcC0+cGVyc19mdW5jOwogfQogCiBzdGF0aWMgaW50CiBQaWNrbGVyX3NldF9wZXJzX2Z1bmMoUGlja2xlcm9iamVjdCAqcCwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhdHRyaWJ1dGUgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X1hERUNSRUYocC0+cGVyc19mdW5jKTsKLQlQeV9JTkNSRUYodik7Ci0JcC0+cGVyc19mdW5jID0gdjsKLQlyZXR1cm4gMDsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9YREVDUkVGKHAtPnBlcnNfZnVuYyk7CisgICAgUHlfSU5DUkVGKHYpOworICAgIHAtPnBlcnNfZnVuYyA9IHY7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFBpY2tsZXJfc2V0X2luc3RfcGVyc19mdW5jKFBpY2tsZXJvYmplY3QgKnAsIFB5T2JqZWN0ICp2KQogewotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXR0cmlidXRlIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9YREVDUkVGKHAtPmluc3RfcGVyc19mdW5jKTsKLQlQeV9JTkNSRUYodik7Ci0JcC0+aW5zdF9wZXJzX2Z1bmMgPSB2OwotCXJldHVybiAwOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X1hERUNSRUYocC0+aW5zdF9wZXJzX2Z1bmMpOworICAgIFB5X0lOQ1JFRih2KTsKKyAgICBwLT5pbnN0X3BlcnNfZnVuYyA9IHY7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQaWNrbGVyX2dldF9tZW1vKFBpY2tsZXJvYmplY3QgKnApCiB7Ci0JaWYgKHAtPm1lbW8gPT0gTlVMTCkKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAibWVtbyIpOwotCWVsc2UKLQkJUHlfSU5DUkVGKHAtPm1lbW8pOwotCXJldHVybiBwLT5tZW1vOworICAgIGlmIChwLT5tZW1vID09IE5VTEwpCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIm1lbW8iKTsKKyAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRihwLT5tZW1vKTsKKyAgICByZXR1cm4gcC0+bWVtbzsKIH0KIAogc3RhdGljIGludAogUGlja2xlcl9zZXRfbWVtbyhQaWNrbGVyb2JqZWN0ICpwLCBQeU9iamVjdCAqdikKIHsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFQeURpY3RfQ2hlY2sodikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1lbW8gbXVzdCBiZSBhIGRpY3Rpb25hcnkiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9YREVDUkVGKHAtPm1lbW8pOwotCVB5X0lOQ1JFRih2KTsKLQlwLT5tZW1vID0gdjsKLQlyZXR1cm4gMDsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5RGljdF9DaGVjayh2KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWVtbyBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X1hERUNSRUYocC0+bWVtbyk7CisgICAgUHlfSU5DUkVGKHYpOworICAgIHAtPm1lbW8gPSB2OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUGlja2xlcl9nZXRfZXJyb3IoUGlja2xlcm9iamVjdCAqcCkKIHsKLQkvKiB3aHkgaXMgdGhpcyBhbiBhdHRyaWJ1dGUgb24gdGhlIFBpY2tsZXI/ICovCi0JUHlfSU5DUkVGKFBpY2tsaW5nRXJyb3IpOwotCXJldHVybiBQaWNrbGluZ0Vycm9yOworICAgIC8qIHdoeSBpcyB0aGlzIGFuIGF0dHJpYnV0ZSBvbiB0aGUgUGlja2xlcj8gKi8KKyAgICBQeV9JTkNSRUYoUGlja2xpbmdFcnJvcik7CisgICAgcmV0dXJuIFBpY2tsaW5nRXJyb3I7CiB9CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBQaWNrbGVyX21lbWJlcnNbXSA9IHsKQEAgLTMyNTQsMTQzICszMjU0LDE0MyBAQAogICAgICJjUGlja2xlLlBpY2tsZXIiLCAgICAgICAgICAgIC8qdHBfbmFtZSovCiAgICAgc2l6ZW9mKFBpY2tsZXJvYmplY3QpLCAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLwogICAgIDAsCi0gICAgKGRlc3RydWN0b3IpUGlja2xlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0gICAgMCwJCQkJCS8qIHRwX3ByaW50ICovCi0gICAgMCwJCQkgCQkvKiB0cF9nZXRhdHRyICovCi0gICAgMCwJCQkgCQkvKiB0cF9zZXRhdHRyICovCi0gICAgMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLSAgICAwLAkJIAkJCS8qIHRwX3JlcHIgKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLSAgICAwLAkJCQkJLyogdHBfaGFzaCAqLwotICAgIDAsCQkJCQkvKiB0cF9jYWxsICovCi0gICAgMCwJCQkJCS8qIHRwX3N0ciAqLwotICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLSAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLworICAgIChkZXN0cnVjdG9yKVBpY2tsZXJfZGVhbGxvYywgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLAotICAgIFBpY2tsZXJ0eXBlX19kb2NfXywJCQkvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKVBpY2tsZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0gICAgKGlucXVpcnkpUGlja2xlcl9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0gICAgMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0gICAgMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLSAgICAwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLSAgICBQaWNrbGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotICAgIFBpY2tsZXJfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzICovCi0gICAgUGlja2xlcl9nZXRzZXRzLAkJCS8qIHRwX2dldHNldCAqLworICAgIFBpY2tsZXJ0eXBlX19kb2NfXywgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpUGlja2xlcl90cmF2ZXJzZSwgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpUGlja2xlcl9jbGVhciwgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgUGlja2xlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFBpY2tsZXJfbWVtYmVycywgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBQaWNrbGVyX2dldHNldHMsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaW5kX2NsYXNzKFB5T2JqZWN0ICpweV9tb2R1bGVfbmFtZSwgUHlPYmplY3QgKnB5X2dsb2JhbF9uYW1lLCBQeU9iamVjdCAqZmMpCiB7Ci0JUHlPYmplY3QgKmdsb2JhbCA9IDAsICptb2R1bGU7CisgICAgUHlPYmplY3QgKmdsb2JhbCA9IDAsICptb2R1bGU7CiAKLQlpZiAoZmMpIHsKLQkJaWYgKGZjPT1QeV9Ob25lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiR2xvYmFsIGFuZCBpbnN0YW5jZSAiCi0JCQkJCSJwaWNrbGVzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZmMsIHB5X21vZHVsZV9uYW1lLAotCQkJCQkgICAgICAgICAgICBweV9nbG9iYWxfbmFtZSwgTlVMTCk7Ci0JfQorICAgIGlmIChmYykgeworICAgICAgICBpZiAoZmM9PVB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJHbG9iYWwgYW5kIGluc3RhbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGlja2xlcyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZjLCBweV9tb2R1bGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlfZ2xvYmFsX25hbWUsIE5VTEwpOworICAgIH0KIAotCW1vZHVsZSA9IFB5U3lzX0dldE9iamVjdCgibW9kdWxlcyIpOwotCWlmIChtb2R1bGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbW9kdWxlID0gUHlTeXNfR2V0T2JqZWN0KCJtb2R1bGVzIik7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1vZHVsZSA9IFB5RGljdF9HZXRJdGVtKG1vZHVsZSwgcHlfbW9kdWxlX25hbWUpOwotCWlmIChtb2R1bGUgPT0gTlVMTCkgewotCQltb2R1bGUgPSBQeUltcG9ydF9JbXBvcnQocHlfbW9kdWxlX25hbWUpOwotCQlpZiAoIW1vZHVsZSkKLQkJCXJldHVybiBOVUxMOwotCQlnbG9iYWwgPSBQeU9iamVjdF9HZXRBdHRyKG1vZHVsZSwgcHlfZ2xvYmFsX25hbWUpOwotCQlQeV9ERUNSRUYobW9kdWxlKTsKLQl9Ci0JZWxzZQotCQlnbG9iYWwgPSBQeU9iamVjdF9HZXRBdHRyKG1vZHVsZSwgcHlfZ2xvYmFsX25hbWUpOwotCXJldHVybiBnbG9iYWw7CisgICAgbW9kdWxlID0gUHlEaWN0X0dldEl0ZW0obW9kdWxlLCBweV9tb2R1bGVfbmFtZSk7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgIG1vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydChweV9tb2R1bGVfbmFtZSk7CisgICAgICAgIGlmICghbW9kdWxlKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdsb2JhbCA9IFB5T2JqZWN0X0dldEF0dHIobW9kdWxlLCBweV9nbG9iYWxfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihtb2R1bGUpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGdsb2JhbCA9IFB5T2JqZWN0X0dldEF0dHIobW9kdWxlLCBweV9nbG9iYWxfbmFtZSk7CisgICAgcmV0dXJuIGdsb2JhbDsKIH0KIAogc3RhdGljIGludAogbWFya2VyKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+bnVtX21hcmtzIDwgMSkgewotCQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiY291bGQgbm90IGZpbmQgTUFSSyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChzZWxmLT5udW1fbWFya3MgPCAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJjb3VsZCBub3QgZmluZCBNQVJLIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXR1cm4gc2VsZi0+bWFya3NbLS1zZWxmLT5udW1fbWFya3NdOworICAgIHJldHVybiBzZWxmLT5tYXJrc1stLXNlbGYtPm51bV9tYXJrc107CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9ub25lKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogYmFkX3JlYWRsaW5lKHZvaWQpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgInBpY2tsZSBkYXRhIHdhcyB0cnVuY2F0ZWQiKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgInBpY2tsZSBkYXRhIHdhcyB0cnVuY2F0ZWQiKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfaW50KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfaW50ID0gMDsKLQljaGFyICplbmRwdHIsICpzOwotCWludCBsZW4sIHJlcyA9IC0xOwotCWxvbmcgbDsKKyAgICBQeU9iamVjdCAqcHlfaW50ID0gMDsKKyAgICBjaGFyICplbmRwdHIsICpzOworICAgIGludCBsZW4sIHJlcyA9IC0xOworICAgIGxvbmcgbDsKIAotCWlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOwotCWlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7Ci0JaWYgKCEoIHM9cHlzdHJuZHVwKHMsbGVuKSkpICByZXR1cm4gLTE7CisgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICBpZiAoISggcz1weXN0cm5kdXAocyxsZW4pKSkgIHJldHVybiAtMTsKIAotCWVycm5vID0gMDsKLQlsID0gc3RydG9sKHMsICZlbmRwdHIsIDApOworICAgIGVycm5vID0gMDsKKyAgICBsID0gc3RydG9sKHMsICZlbmRwdHIsIDApOwogCi0JaWYgKGVycm5vIHx8ICgqZW5kcHRyICE9ICdcbicpIHx8IChlbmRwdHJbMV0gIT0gJ1wwJykpIHsKLQkJLyogSG0sIG1heWJlIHdlJ3ZlIGdvdCBzb21ldGhpbmcgbG9uZy4gIExldCdzIHRyeSByZWFkaW5nCi0JCSAgIGl0IGFzIGEgUHl0aG9uIGxvbmcgb2JqZWN0LiAqLwotCQllcnJubyA9IDA7Ci0JCXB5X2ludCA9IFB5TG9uZ19Gcm9tU3RyaW5nKHMsIE5VTEwsIDApOwotCQlpZiAocHlfaW50ID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGludCIpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfQotCWVsc2UgewotCQlpZiAobGVuID09IDMgJiYgKGwgPT0gMCB8fCBsID09IDEpKSB7Ci0JCQlpZiAoISggcHlfaW50ID0gUHlCb29sX0Zyb21Mb25nKGwpKSkgIGdvdG8gZmluYWxseTsKLQkJfQotCQllbHNlIHsKLQkJCWlmICghKCBweV9pbnQgPSBQeUludF9Gcm9tTG9uZyhsKSkpICBnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9CisgICAgaWYgKGVycm5vIHx8ICgqZW5kcHRyICE9ICdcbicpIHx8IChlbmRwdHJbMV0gIT0gJ1wwJykpIHsKKyAgICAgICAgLyogSG0sIG1heWJlIHdlJ3ZlIGdvdCBzb21ldGhpbmcgbG9uZy4gIExldCdzIHRyeSByZWFkaW5nCisgICAgICAgICAgIGl0IGFzIGEgUHl0aG9uIGxvbmcgb2JqZWN0LiAqLworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIHB5X2ludCA9IFB5TG9uZ19Gcm9tU3RyaW5nKHMsIE5VTEwsIDApOworICAgICAgICBpZiAocHlfaW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gaW50Iik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChsZW4gPT0gMyAmJiAobCA9PSAwIHx8IGwgPT0gMSkpIHsKKyAgICAgICAgICAgIGlmICghKCBweV9pbnQgPSBQeUJvb2xfRnJvbUxvbmcobCkpKSAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCEoIHB5X2ludCA9IFB5SW50X0Zyb21Mb25nKGwpKSkgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KIAotCWZyZWUocyk7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfaW50LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgZnJlZShzKTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9pbnQsIC0xKTsKKyAgICByZXR1cm4gMDsKIAogICBmaW5hbGx5OgotCWZyZWUocyk7CisgICAgZnJlZShzKTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogbG9hZF9ib29sKFVucGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmJvb2xlYW4pCiB7Ci0JYXNzZXJ0KGJvb2xlYW4gPT0gUHlfVHJ1ZSB8fCBib29sZWFuID09IFB5X0ZhbHNlKTsKLQlQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIGJvb2xlYW4sIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQoYm9vbGVhbiA9PSBQeV9UcnVlIHx8IGJvb2xlYW4gPT0gUHlfRmFsc2UpOworICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgYm9vbGVhbiwgLTEpOworICAgIHJldHVybiAwOwogfQogCiAvKiBzIGNvbnRhaW5zIHggYnl0ZXMgb2YgYSBsaXR0bGUtZW5kaWFuIGludGVnZXIuICBSZXR1cm4gaXRzIHZhbHVlIGFzIGEKQEAgLTM0MDEsOTkgKzM0MDEsOTkgQEAKIHN0YXRpYyBsb25nCiBjYWxjX2JpbmludChjaGFyICpzLCBpbnQgeCkKIHsKLQl1bnNpZ25lZCBjaGFyIGM7Ci0JaW50IGk7Ci0JbG9uZyBsOworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICBpbnQgaTsKKyAgICBsb25nIGw7CiAKLQlmb3IgKGkgPSAwLCBsID0gMEw7IGkgPCB4OyBpKyspIHsKLQkJYyA9ICh1bnNpZ25lZCBjaGFyKXNbaV07Ci0JCWwgfD0gKGxvbmcpYyA8PCAoaSAqIDgpOwotCX0KKyAgICBmb3IgKGkgPSAwLCBsID0gMEw7IGkgPCB4OyBpKyspIHsKKyAgICAgICAgYyA9ICh1bnNpZ25lZCBjaGFyKXNbaV07CisgICAgICAgIGwgfD0gKGxvbmcpYyA8PCAoaSAqIDgpOworICAgIH0KICNpZiBTSVpFT0ZfTE9ORyA+IDQKLQkvKiBVbmxpa2UgQklOSU5UMSBhbmQgQklOSU5UMiwgQklOSU5UIChtb3JlIGFjY3VyYXRlbHkgQklOSU5UNCkKLQkgKiBpcyBzaWduZWQsIHNvIG9uIGEgYm94IHdpdGggbG9uZ3MgYmlnZ2VyIHRoYW4gNCBieXRlcyB3ZSBuZWVkCi0JICogdG8gZXh0ZW5kIGEgQklOSU5UJ3Mgc2lnbiBiaXQgdG8gdGhlIGZ1bGwgd2lkdGguCi0JICovCi0JaWYgKHggPT0gNCAmJiBsICYgKDFMIDw8IDMxKSkKLQkJbCB8PSAofjBMKSA8PCAzMjsKKyAgICAvKiBVbmxpa2UgQklOSU5UMSBhbmQgQklOSU5UMiwgQklOSU5UIChtb3JlIGFjY3VyYXRlbHkgQklOSU5UNCkKKyAgICAgKiBpcyBzaWduZWQsIHNvIG9uIGEgYm94IHdpdGggbG9uZ3MgYmlnZ2VyIHRoYW4gNCBieXRlcyB3ZSBuZWVkCisgICAgICogdG8gZXh0ZW5kIGEgQklOSU5UJ3Mgc2lnbiBiaXQgdG8gdGhlIGZ1bGwgd2lkdGguCisgICAgICovCisgICAgaWYgKHggPT0gNCAmJiBsICYgKDFMIDw8IDMxKSkKKyAgICAgICAgbCB8PSAofjBMKSA8PCAzMjsKICNlbmRpZgotCXJldHVybiBsOworICAgIHJldHVybiBsOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfYmluaW50eChVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKnMsIGludCAgeCkKIHsKLQlQeU9iamVjdCAqcHlfaW50ID0gMDsKLQlsb25nIGw7CisgICAgUHlPYmplY3QgKnB5X2ludCA9IDA7CisgICAgbG9uZyBsOwogCi0JbCA9IGNhbGNfYmluaW50KHMsIHgpOworICAgIGwgPSBjYWxjX2JpbmludChzLCB4KTsKIAotCWlmICghKCBweV9pbnQgPSBQeUludF9Gcm9tTG9uZyhsKSkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoISggcHlfaW50ID0gUHlJbnRfRnJvbUxvbmcobCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9pbnQsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9pbnQsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2JpbmludChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqczsKKyAgICBjaGFyICpzOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXR1cm4gbG9hZF9iaW5pbnR4KHNlbGYsIHMsIDQpOworICAgIHJldHVybiBsb2FkX2JpbmludHgoc2VsZiwgcywgNCk7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9iaW5pbnQxKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQljaGFyICpzOworICAgIGNoYXIgKnM7CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCXJldHVybiBsb2FkX2JpbmludHgoc2VsZiwgcywgMSk7CisgICAgcmV0dXJuIGxvYWRfYmluaW50eChzZWxmLCBzLCAxKTsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2JpbmludDIoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWNoYXIgKnM7CisgICAgY2hhciAqczsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDIpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDIpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIGxvYWRfYmluaW50eChzZWxmLCBzLCAyKTsKKyAgICByZXR1cm4gbG9hZF9iaW5pbnR4KHNlbGYsIHMsIDIpOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX2xvbmcoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpsID0gMDsKLQljaGFyICplbmQsICpzOwotCWludCBsZW4sIHJlcyA9IC0xOworICAgIFB5T2JqZWN0ICpsID0gMDsKKyAgICBjaGFyICplbmQsICpzOworICAgIGludCBsZW4sIHJlcyA9IC0xOwogCi0JaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKLQlpZiAoISggcz1weXN0cm5kdXAocyxsZW4pKSkgIHJldHVybiAtMTsKKyAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOworICAgIGlmICghKCBzPXB5c3RybmR1cChzLGxlbikpKSAgcmV0dXJuIC0xOwogCi0JaWYgKCEoIGwgPSBQeUxvbmdfRnJvbVN0cmluZyhzLCAmZW5kLCAwKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggbCA9IFB5TG9uZ19Gcm9tU3RyaW5nKHMsICZlbmQsIDApKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JZnJlZShzKTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBsLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgZnJlZShzKTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBsLCAtMSk7CisgICAgcmV0dXJuIDA7CiAKICAgZmluYWxseToKLQlmcmVlKHMpOworICAgIGZyZWUocyk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qICdzaXplJyBieXRlcyBjb250YWluIHRoZSAjIG9mIGJ5dGVzIG9mIGxpdHRsZS1lbmRpYW4gMjU2J3MtY29tcGxlbWVudApAQCAtMzUwMiwxODcgKzM1MDIsMTg3IEBACiBzdGF0aWMgaW50CiBsb2FkX2NvdW50ZWRfbG9uZyhVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGludCBzaXplKQogewotCVB5X3NzaXplX3QgaTsKLQljaGFyICpuYnl0ZXM7Ci0JdW5zaWduZWQgY2hhciAqcGRhdGE7Ci0JUHlPYmplY3QgKmFsb25nOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBjaGFyICpuYnl0ZXM7CisgICAgdW5zaWduZWQgY2hhciAqcGRhdGE7CisgICAgUHlPYmplY3QgKmFsb25nOwogCi0JYXNzZXJ0KHNpemUgPT0gMSB8fCBzaXplID09IDQpOwotCWkgPSBzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJm5ieXRlcywgc2l6ZSk7Ci0JaWYgKGkgPCAwKSByZXR1cm4gLTE7CisgICAgYXNzZXJ0KHNpemUgPT0gMSB8fCBzaXplID09IDQpOworICAgIGkgPSBzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJm5ieXRlcywgc2l6ZSk7CisgICAgaWYgKGkgPCAwKSByZXR1cm4gLTE7CiAKLQlzaXplID0gY2FsY19iaW5pbnQobmJ5dGVzLCBzaXplKTsKLQlpZiAoc2l6ZSA8IDApIHsKLQkJLyogQ29ycnVwdCBvciBob3N0aWxlIHBpY2tsZSAtLSB3ZSBuZXZlciB3cml0ZSBvbmUgbGlrZQotCQkgKiB0aGlzLgotCQkgKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgIkxPTkcgcGlja2xlIGhhcyBuZWdhdGl2ZSAiCi0JCQkJImJ5dGUgY291bnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBzaXplID0gY2FsY19iaW5pbnQobmJ5dGVzLCBzaXplKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgLyogQ29ycnVwdCBvciBob3N0aWxlIHBpY2tsZSAtLSB3ZSBuZXZlciB3cml0ZSBvbmUgbGlrZQorICAgICAgICAgKiB0aGlzLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgIkxPTkcgcGlja2xlIGhhcyBuZWdhdGl2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZSBjb3VudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKHNpemUgPT0gMCkKLQkJYWxvbmcgPSBQeUxvbmdfRnJvbUxvbmcoMEwpOwotCWVsc2UgewotCQkvKiBSZWFkIHRoZSByYXcgbGl0dGxlLWVuZGlhbiBieXRlcyAmIGNvbnZlcnQuICovCi0JCWkgPSBzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgKGNoYXIgKiopJnBkYXRhLCBzaXplKTsKLQkJaWYgKGkgPCAwKSByZXR1cm4gLTE7Ci0JCWFsb25nID0gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KHBkYXRhLCAoc2l6ZV90KXNpemUsCi0JCQkJMSAvKiBsaXR0bGUgZW5kaWFuICovLCAxIC8qIHNpZ25lZCAqLyk7Ci0JfQotCWlmIChhbG9uZyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgYWxvbmcsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICBhbG9uZyA9IFB5TG9uZ19Gcm9tTG9uZygwTCk7CisgICAgZWxzZSB7CisgICAgICAgIC8qIFJlYWQgdGhlIHJhdyBsaXR0bGUtZW5kaWFuIGJ5dGVzICYgY29udmVydC4gKi8KKyAgICAgICAgaSA9IHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAoY2hhciAqKikmcGRhdGEsIHNpemUpOworICAgICAgICBpZiAoaSA8IDApIHJldHVybiAtMTsKKyAgICAgICAgYWxvbmcgPSBfUHlMb25nX0Zyb21CeXRlQXJyYXkocGRhdGEsIChzaXplX3Qpc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogbGl0dGxlIGVuZGlhbiAqLywgMSAvKiBzaWduZWQgKi8pOworICAgIH0KKyAgICBpZiAoYWxvbmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIGFsb25nLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfZmxvYXQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpweV9mbG9hdCA9IDA7Ci0JY2hhciAqZW5kcHRyLCAqczsKLQlpbnQgbGVuLCByZXMgPSAtMTsKLQlkb3VibGUgZDsKKyAgICBQeU9iamVjdCAqcHlfZmxvYXQgPSAwOworICAgIGNoYXIgKmVuZHB0ciwgKnM7CisgICAgaW50IGxlbiwgcmVzID0gLTE7CisgICAgZG91YmxlIGQ7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotCWlmICghKCBzPXB5c3RybmR1cChzLGxlbikpKSAgcmV0dXJuIC0xOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgaWYgKCEoIHM9cHlzdHJuZHVwKHMsbGVuKSkpICByZXR1cm4gLTE7CiAKLQlkID0gUHlPU19zdHJpbmdfdG9fZG91YmxlKHMsICZlbmRwdHIsIFB5RXhjX092ZXJmbG93RXJyb3IpOworICAgIGQgPSBQeU9TX3N0cmluZ190b19kb3VibGUocywgJmVuZHB0ciwgUHlFeGNfT3ZlcmZsb3dFcnJvcik7CiAKLQlpZiAoZCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJZ290byBmaW5hbGx5OwotICAgICAgICB9IGVsc2UgaWYgKChlbmRwdHJbMF0gIT0gJ1xuJykgfHwgKGVuZHB0clsxXSAhPSAnXDAnKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGZsb2F0Iik7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKGQgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9IGVsc2UgaWYgKChlbmRwdHJbMF0gIT0gJ1xuJykgfHwgKGVuZHB0clsxXSAhPSAnXDAnKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gZmxvYXQiKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmICghKCBweV9mbG9hdCA9IFB5RmxvYXRfRnJvbURvdWJsZShkKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggcHlfZmxvYXQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoZCkpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlmcmVlKHMpOwotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHB5X2Zsb2F0LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgZnJlZShzKTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9mbG9hdCwgLTEpOworICAgIHJldHVybiAwOwogCiAgIGZpbmFsbHk6Ci0JZnJlZShzKTsKKyAgICBmcmVlKHMpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX2JpbmZsb2F0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfZmxvYXQ7Ci0JZG91YmxlIHg7Ci0JY2hhciAqcDsKKyAgICBQeU9iamVjdCAqcHlfZmxvYXQ7CisgICAgZG91YmxlIHg7CisgICAgY2hhciAqcDsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnAsIDgpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnAsIDgpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JeCA9IF9QeUZsb2F0X1VucGFjazgoKHVuc2lnbmVkIGNoYXIgKilwLCAwKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKKyAgICB4ID0gX1B5RmxvYXRfVW5wYWNrOCgodW5zaWduZWQgY2hhciAqKXAsIDApOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcHlfZmxvYXQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7Ci0JaWYgKHB5X2Zsb2F0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBweV9mbG9hdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKKyAgICBpZiAocHlfZmxvYXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfZmxvYXQsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9mbG9hdCwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX3N0cmluZyhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnN0ciA9IDA7Ci0JaW50IGxlbiwgcmVzID0gLTE7Ci0JY2hhciAqcywgKnA7CisgICAgUHlPYmplY3QgKnN0ciA9IDA7CisgICAgaW50IGxlbiwgcmVzID0gLTE7CisgICAgY2hhciAqcywgKnA7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotCWlmICghKCBzPXB5c3RybmR1cChzLGxlbikpKSAgcmV0dXJuIC0xOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgaWYgKCEoIHM9cHlzdHJuZHVwKHMsbGVuKSkpICByZXR1cm4gLTE7CiAKIAotCS8qIFN0cmlwIG91dGVybW9zdCBxdW90ZXMgKi8KLQl3aGlsZSAoc1tsZW4tMV0gPD0gJyAnKQotCQlsZW4tLTsKLQlpZihzWzBdPT0nIicgJiYgc1tsZW4tMV09PSciJyl7Ci0JCXNbbGVuLTFdID0gJ1wwJzsKLQkJcCA9IHMgKyAxIDsKLQkJbGVuIC09IDI7Ci0JfSBlbHNlIGlmKHNbMF09PSdcJycgJiYgc1tsZW4tMV09PSdcJycpewotCQlzW2xlbi0xXSA9ICdcMCc7Ci0JCXAgPSBzICsgMSA7Ci0JCWxlbiAtPSAyOwotCX0gZWxzZQotCQlnb3RvIGluc2VjdXJlOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBTdHJpcCBvdXRlcm1vc3QgcXVvdGVzICovCisgICAgd2hpbGUgKHNbbGVuLTFdIDw9ICcgJykKKyAgICAgICAgbGVuLS07CisgICAgaWYoc1swXT09JyInICYmIHNbbGVuLTFdPT0nIicpeworICAgICAgICBzW2xlbi0xXSA9ICdcMCc7CisgICAgICAgIHAgPSBzICsgMSA7CisgICAgICAgIGxlbiAtPSAyOworICAgIH0gZWxzZSBpZihzWzBdPT0nXCcnICYmIHNbbGVuLTFdPT0nXCcnKXsKKyAgICAgICAgc1tsZW4tMV0gPSAnXDAnOworICAgICAgICBwID0gcyArIDEgOworICAgICAgICBsZW4gLT0gMjsKKyAgICB9IGVsc2UKKyAgICAgICAgZ290byBpbnNlY3VyZTsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQlzdHIgPSBQeVN0cmluZ19EZWNvZGVFc2NhcGUocCwgbGVuLCBOVUxMLCAwLCBOVUxMKTsKLQlmcmVlKHMpOwotCWlmIChzdHIpIHsKLQkJUERBVEFfUFVTSChzZWxmLT5zdGFjaywgc3RyLCAtMSk7Ci0JCXJlcyA9IDA7Ci0JfQotCXJldHVybiByZXM7CisgICAgc3RyID0gUHlTdHJpbmdfRGVjb2RlRXNjYXBlKHAsIGxlbiwgTlVMTCwgMCwgTlVMTCk7CisgICAgZnJlZShzKTsKKyAgICBpZiAoc3RyKSB7CisgICAgICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHN0ciwgLTEpOworICAgICAgICByZXMgPSAwOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogCiAgIGluc2VjdXJlOgotCWZyZWUocyk7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsImluc2VjdXJlIHN0cmluZyBwaWNrbGUiKTsKLQlyZXR1cm4gLTE7CisgICAgZnJlZShzKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwiaW5zZWN1cmUgc3RyaW5nIHBpY2tsZSIpOworICAgIHJldHVybiAtMTsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2JpbnN0cmluZyhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X3N0cmluZyA9IDA7Ci0JbG9uZyBsOwotCWNoYXIgKnM7CisgICAgUHlPYmplY3QgKnB5X3N0cmluZyA9IDA7CisgICAgbG9uZyBsOworICAgIGNoYXIgKnM7CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCA0KSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCA0KSA8IDApIHJldHVybiAtMTsKIAotCWwgPSBjYWxjX2JpbmludChzLCA0KTsKLQlpZiAobCA8IDApIHsKLQkJLyogQ29ycnVwdCBvciBob3N0aWxlIHBpY2tsZSAtLSB3ZSBuZXZlciB3cml0ZSBvbmUgbGlrZQotCQkgKiB0aGlzLgotCQkgKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwKLQkJCQkiQklOU1RSSU5HIHBpY2tsZSBoYXMgbmVnYXRpdmUgYnl0ZSBjb3VudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGwgPSBjYWxjX2JpbmludChzLCA0KTsKKyAgICBpZiAobCA8IDApIHsKKyAgICAgICAgLyogQ29ycnVwdCBvciBob3N0aWxlIHBpY2tsZSAtLSB3ZSBuZXZlciB3cml0ZSBvbmUgbGlrZQorICAgICAgICAgKiB0aGlzLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCSU5TVFJJTkcgcGlja2xlIGhhcyBuZWdhdGl2ZSBieXRlIGNvdW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCBsKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCBsKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghKCBweV9zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsKSkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoISggcHlfc3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9zdHJpbmcsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9zdHJpbmcsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX3Nob3J0X2JpbnN0cmluZyhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X3N0cmluZyA9IDA7Ci0JdW5zaWduZWQgY2hhciBsOwotCWNoYXIgKnM7CisgICAgUHlPYmplY3QgKnB5X3N0cmluZyA9IDA7CisgICAgdW5zaWduZWQgY2hhciBsOworICAgIGNoYXIgKnM7CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWwgPSAodW5zaWduZWQgY2hhcilzWzBdOworICAgIGwgPSAodW5zaWduZWQgY2hhcilzWzBdOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgbCkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgbCkgPCAwKSByZXR1cm4gLTE7CiAKLQlpZiAoISggcHlfc3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbCkpKSAgcmV0dXJuIC0xOworICAgIGlmICghKCBweV9zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsKSkpICByZXR1cm4gLTE7CiAKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9zdHJpbmcsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9zdHJpbmcsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0zNjkwLDIxICszNjkwLDIxIEBACiBzdGF0aWMgaW50CiBsb2FkX3VuaWNvZGUoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpzdHIgPSAwOwotCWludCBsZW4sIHJlcyA9IC0xOwotCWNoYXIgKnM7CisgICAgUHlPYmplY3QgKnN0ciA9IDA7CisgICAgaW50IGxlbiwgcmVzID0gLTE7CisgICAgY2hhciAqczsKIAotCWlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOwotCWlmIChsZW4gPCAxKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKGxlbiA8IDEpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKIAotCWlmICghKCBzdHIgPSBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZShzLCBsZW4gLSAxLCBOVUxMKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggc3RyID0gUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUocywgbGVuIC0gMSwgTlVMTCkpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBzdHIsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBzdHIsIC0xKTsKKyAgICByZXR1cm4gMDsKIAogICBmaW5hbGx5OgotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KICNlbmRpZgogCkBAIC0zNzEzLDMwICszNzEzLDMwIEBACiBzdGF0aWMgaW50CiBsb2FkX2JpbnVuaWNvZGUoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp1bmljb2RlOwotCWxvbmcgbDsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICp1bmljb2RlOworICAgIGxvbmcgbDsKKyAgICBjaGFyICpzOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CiAKLQlsID0gY2FsY19iaW5pbnQocywgNCk7Ci0JaWYgKGwgPCAwKSB7Ci0JCS8qIENvcnJ1cHQgb3IgaG9zdGlsZSBwaWNrbGUgLS0gd2UgbmV2ZXIgd3JpdGUgb25lIGxpa2UKLQkJICogdGhpcy4KLQkJICovCi0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsCi0JCQkJIkJJTlVOSUNPREUgcGlja2xlIGhhcyBuZWdhdGl2ZSBieXRlIGNvdW50Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgbCA9IGNhbGNfYmluaW50KHMsIDQpOworICAgIGlmIChsIDwgMCkgeworICAgICAgICAvKiBDb3JydXB0IG9yIGhvc3RpbGUgcGlja2xlIC0tIHdlIG5ldmVyIHdyaXRlIG9uZSBsaWtlCisgICAgICAgICAqIHRoaXMuCisgICAgICAgICAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJJTlVOSUNPREUgcGlja2xlIGhhcyBuZWdhdGl2ZSBieXRlIGNvdW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCBsKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCBsKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghKCB1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgbCwgTlVMTCkpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsLCBOVUxMKSkpCisgICAgICAgIHJldHVybiAtMTsKIAotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHVuaWNvZGUsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCB1bmljb2RlLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApAQCAtMzc0NCw1MDQgKzM3NDQsNTA0IEBACiBzdGF0aWMgaW50CiBsb2FkX3R1cGxlKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqdHVwOwotCWludCBpOworICAgIFB5T2JqZWN0ICp0dXA7CisgICAgaW50IGk7CiAKLQlpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwotCWlmICghKCB0dXA9UGRhdGFfcG9wVHVwbGUoc2VsZi0+c3RhY2ssIGkpKSkgIHJldHVybiAtMTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCB0dXAsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmICghKCB0dXA9UGRhdGFfcG9wVHVwbGUoc2VsZi0+c3RhY2ssIGkpKSkgIHJldHVybiAtMTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCB0dXAsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbG9hZF9jb3VudGVkX3R1cGxlKFVucGlja2xlcm9iamVjdCAqc2VsZiwgaW50IGxlbikKIHsKLQlQeU9iamVjdCAqdHVwID0gUHlUdXBsZV9OZXcobGVuKTsKKyAgICBQeU9iamVjdCAqdHVwID0gUHlUdXBsZV9OZXcobGVuKTsKIAotCWlmICh0dXAgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGlmICh0dXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0Jd2hpbGUgKC0tbGVuID49IDApIHsKLQkJUHlPYmplY3QgKmVsZW1lbnQ7CisgICAgd2hpbGUgKC0tbGVuID49IDApIHsKKyAgICAgICAgUHlPYmplY3QgKmVsZW1lbnQ7CiAKLQkJUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGxlbiwgZWxlbWVudCk7Ci0JfQotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHR1cCwgLTEpOwotCXJldHVybiAwOworICAgICAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGVsZW1lbnQpOworICAgICAgICBpZiAoZWxlbWVudCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cCwgbGVuLCBlbGVtZW50KTsKKyAgICB9CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgdHVwLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfZW1wdHlfbGlzdChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmxpc3Q7CisgICAgUHlPYmplY3QgKmxpc3Q7CiAKLQlpZiAoISggbGlzdD1QeUxpc3RfTmV3KDApKSkgIHJldHVybiAtMTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBsaXN0LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCEoIGxpc3Q9UHlMaXN0X05ldygwKSkpICByZXR1cm4gLTE7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgbGlzdCwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX2VtcHR5X2RpY3QoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICpkaWN0OwogCi0JaWYgKCEoIGRpY3Q9UHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBkaWN0LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCEoIGRpY3Q9UHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBkaWN0LCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9saXN0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqbGlzdCA9IDA7Ci0JaW50IGk7CisgICAgUHlPYmplY3QgKmxpc3QgPSAwOworICAgIGludCBpOwogCi0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKLQlpZiAoISggbGlzdD1QZGF0YV9wb3BMaXN0KHNlbGYtPnN0YWNrLCBpKSkpICByZXR1cm4gLTE7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgbGlzdCwgLTEpOwotCXJldHVybiAwOworICAgIGlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKCEoIGxpc3Q9UGRhdGFfcG9wTGlzdChzZWxmLT5zdGFjaywgaSkpKSAgcmV0dXJuIC0xOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIGxpc3QsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbG9hZF9kaWN0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZGljdCwgKmtleSwgKnZhbHVlOwotCWludCBpLCBqLCBrOworICAgIFB5T2JqZWN0ICpkaWN0LCAqa2V5LCAqdmFsdWU7CisgICAgaW50IGksIGosIGs7CiAKLQlpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwotCWo9c2VsZi0+c3RhY2stPmxlbmd0aDsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOworICAgIGo9c2VsZi0+c3RhY2stPmxlbmd0aDsKIAotCWlmICghKCBkaWN0ID0gUHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKKyAgICBpZiAoISggZGljdCA9IFB5RGljdF9OZXcoKSkpICByZXR1cm4gLTE7CiAKLQlmb3IgKGsgPSBpKzE7IGsgPCBqOyBrICs9IDIpIHsKLQkJa2V5ICA9c2VsZi0+c3RhY2stPmRhdGFbay0xXTsKLQkJdmFsdWU9c2VsZi0+c3RhY2stPmRhdGFbayAgXTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIGtleSwgdmFsdWUpIDwgMCkgewotCQkJUHlfREVDUkVGKGRpY3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCVBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBkaWN0LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgZm9yIChrID0gaSsxOyBrIDwgajsgayArPSAyKSB7CisgICAgICAgIGtleSAgPXNlbGYtPnN0YWNrLT5kYXRhW2stMV07CisgICAgICAgIHZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2sgIF07CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBrZXksIHZhbHVlKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgaSk7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgZGljdCwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSW5zdGFuY2VfTmV3KFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyID0gMDsKKyAgICBQeU9iamVjdCAqciA9IDA7CiAKLQlpZiAoUHlDbGFzc19DaGVjayhjbHMpKSB7Ci0JCWludCBsOworICAgIGlmIChQeUNsYXNzX0NoZWNrKGNscykpIHsKKyAgICAgICAgaW50IGw7CiAKLQkJaWYgKChsPVB5T2JqZWN0X1NpemUoYXJncykpIDwgMCkgZ290byBlcnI7Ci0JCWlmICghKCBsICkpICB7Ci0JCQlQeU9iamVjdCAqX19nZXRpbml0YXJnc19fOworICAgICAgICBpZiAoKGw9UHlPYmplY3RfU2l6ZShhcmdzKSkgPCAwKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKCEoIGwgKSkgIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpfX2dldGluaXRhcmdzX187CiAKLQkJCV9fZ2V0aW5pdGFyZ3NfXyA9IFB5T2JqZWN0X0dldEF0dHIoY2xzLAotCQkJCQkJICAgX19nZXRpbml0YXJnc19fX3N0cik7Ci0JCQlpZiAoIV9fZ2V0aW5pdGFyZ3NfXykgIHsKLQkJCQkvKiBXZSBoYXZlIGEgY2xhc3Mgd2l0aCBubyBfX2dldGluaXRhcmdzX18sCi0JCQkJICAgc28gYnlwYXNzIHVzdWFsIGNvbnN0cnVjdGlvbiAgKi8KLQkJCQlQeU9iamVjdCAqaW5zdDsKKyAgICAgICAgICAgIF9fZ2V0aW5pdGFyZ3NfXyA9IFB5T2JqZWN0X0dldEF0dHIoY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nZXRpbml0YXJnc19fX3N0cik7CisgICAgICAgICAgICBpZiAoIV9fZ2V0aW5pdGFyZ3NfXykgIHsKKyAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIGEgY2xhc3Mgd2l0aCBubyBfX2dldGluaXRhcmdzX18sCisgICAgICAgICAgICAgICAgICAgc28gYnlwYXNzIHVzdWFsIGNvbnN0cnVjdGlvbiAgKi8KKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqaW5zdDsKIAotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJaWYgKCEoIGluc3Q9UHlJbnN0YW5jZV9OZXdSYXcoY2xzLCBOVUxMKSkpCi0JCQkJCWdvdG8gZXJyOwotCQkJCXJldHVybiBpbnN0OwotCQkJfQotCQkJUHlfREVDUkVGKF9fZ2V0aW5pdGFyZ3NfXyk7Ci0JCX0KKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIGlmICghKCBpbnN0PVB5SW5zdGFuY2VfTmV3UmF3KGNscywgTlVMTCkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihfX2dldGluaXRhcmdzX18pOworICAgICAgICB9CiAKLQkJaWYgKChyPVB5SW5zdGFuY2VfTmV3KGNscywgYXJncywgTlVMTCkpKSByZXR1cm4gcjsKLQkJZWxzZSBnb3RvIGVycjsKLQl9CisgICAgICAgIGlmICgocj1QeUluc3RhbmNlX05ldyhjbHMsIGFyZ3MsIE5VTEwpKSkgcmV0dXJuIHI7CisgICAgICAgIGVsc2UgZ290byBlcnI7CisgICAgfQogCi0JaWYgKChyPVB5T2JqZWN0X0NhbGxPYmplY3QoY2xzLCBhcmdzKSkpIHJldHVybiByOworICAgIGlmICgocj1QeU9iamVjdF9DYWxsT2JqZWN0KGNscywgYXJncykpKSByZXR1cm4gcjsKIAogICBlcnI6Ci0JewotCQlQeU9iamVjdCAqdHAsICp2LCAqdGIsICp0bXBfdmFsdWU7CisgICAgeworICAgICAgICBQeU9iamVjdCAqdHAsICp2LCAqdGIsICp0bXBfdmFsdWU7CiAKLQkJUHlFcnJfRmV0Y2goJnRwLCAmdiwgJnRiKTsKLQkJdG1wX3ZhbHVlID0gdjsKLQkJLyogTlVMTCBvY2N1cnMgd2hlbiB0aGVyZSB3YXMgYSBLZXlib2FyZEludGVycnVwdCAqLwotCQlpZiAodG1wX3ZhbHVlID09IE5VTEwpCi0JCQl0bXBfdmFsdWUgPSBQeV9Ob25lOwotCQlpZiAoKHIgPSBQeVR1cGxlX1BhY2soMywgdG1wX3ZhbHVlLCBjbHMsIGFyZ3MpKSkgewotCQkJUHlfWERFQ1JFRih2KTsKLQkJCXY9cjsKLQkJfQotCQlQeUVycl9SZXN0b3JlKHRwLHYsdGIpOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfRmV0Y2goJnRwLCAmdiwgJnRiKTsKKyAgICAgICAgdG1wX3ZhbHVlID0gdjsKKyAgICAgICAgLyogTlVMTCBvY2N1cnMgd2hlbiB0aGVyZSB3YXMgYSBLZXlib2FyZEludGVycnVwdCAqLworICAgICAgICBpZiAodG1wX3ZhbHVlID09IE5VTEwpCisgICAgICAgICAgICB0bXBfdmFsdWUgPSBQeV9Ob25lOworICAgICAgICBpZiAoKHIgPSBQeVR1cGxlX1BhY2soMywgdG1wX3ZhbHVlLCBjbHMsIGFyZ3MpKSkgeworICAgICAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICAgICAgICAgIHY9cjsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9SZXN0b3JlKHRwLHYsdGIpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX29iaihVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmNsYXNzLCAqdHVwLCAqb2JqPTA7Ci0JaW50IGk7CisgICAgUHlPYmplY3QgKmNsYXNzLCAqdHVwLCAqb2JqPTA7CisgICAgaW50IGk7CiAKLQlpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwotCWlmICghKCB0dXA9UGRhdGFfcG9wVHVwbGUoc2VsZi0+c3RhY2ssIGkrMSkpKSAgcmV0dXJuIC0xOwotCVBEQVRBX1BPUChzZWxmLT5zdGFjaywgY2xhc3MpOwotCWlmIChjbGFzcykgewotCQlvYmogPSBJbnN0YW5jZV9OZXcoY2xhc3MsIHR1cCk7Ci0JCVB5X0RFQ1JFRihjbGFzcyk7Ci0JfQotCVB5X0RFQ1JFRih0dXApOworICAgIGlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKCEoIHR1cD1QZGF0YV9wb3BUdXBsZShzZWxmLT5zdGFjaywgaSsxKSkpICByZXR1cm4gLTE7CisgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBjbGFzcyk7CisgICAgaWYgKGNsYXNzKSB7CisgICAgICAgIG9iaiA9IEluc3RhbmNlX05ldyhjbGFzcywgdHVwKTsKKyAgICAgICAgUHlfREVDUkVGKGNsYXNzKTsKKyAgICB9CisgICAgUHlfREVDUkVGKHR1cCk7CiAKLQlpZiAoISBvYmopIHJldHVybiAtMTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYmosIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoISBvYmopIHJldHVybiAtMTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYmosIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2luc3QoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp0dXAsICpjbGFzcz0wLCAqb2JqPTAsICptb2R1bGVfbmFtZSwgKmNsYXNzX25hbWU7Ci0JaW50IGksIGxlbjsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICp0dXAsICpjbGFzcz0wLCAqb2JqPTAsICptb2R1bGVfbmFtZSwgKmNsYXNzX25hbWU7CisgICAgaW50IGksIGxlbjsKKyAgICBjaGFyICpzOwogCi0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwogCi0JaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKLQltb2R1bGVfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpOwotCWlmICghbW9kdWxlX25hbWUpICByZXR1cm4gLTE7CisgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICBtb2R1bGVfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpOworICAgIGlmICghbW9kdWxlX25hbWUpICByZXR1cm4gLTE7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA+PSAwKSB7Ci0JCWlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7Ci0JCWlmICgoY2xhc3NfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpKSkgewotCQkJY2xhc3MgPSBmaW5kX2NsYXNzKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lLAotCQkJCQkgICBzZWxmLT5maW5kX2NsYXNzKTsKLQkJCVB5X0RFQ1JFRihjbGFzc19uYW1lKTsKLQkJfQotCX0KLQlQeV9ERUNSRUYobW9kdWxlX25hbWUpOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpID49IDApIHsKKyAgICAgICAgaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICAgICAgaWYgKChjbGFzc19uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSkpKSB7CisgICAgICAgICAgICBjbGFzcyA9IGZpbmRfY2xhc3MobW9kdWxlX25hbWUsIGNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmluZF9jbGFzcyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2xhc3NfbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKG1vZHVsZV9uYW1lKTsKIAotCWlmICghIGNsYXNzKSByZXR1cm4gLTE7CisgICAgaWYgKCEgY2xhc3MpIHJldHVybiAtMTsKIAotCWlmICgodHVwPVBkYXRhX3BvcFR1cGxlKHNlbGYtPnN0YWNrLCBpKSkpIHsKLQkJb2JqID0gSW5zdGFuY2VfTmV3KGNsYXNzLCB0dXApOwotCQlQeV9ERUNSRUYodHVwKTsKLQl9Ci0JUHlfREVDUkVGKGNsYXNzKTsKKyAgICBpZiAoKHR1cD1QZGF0YV9wb3BUdXBsZShzZWxmLT5zdGFjaywgaSkpKSB7CisgICAgICAgIG9iaiA9IEluc3RhbmNlX05ldyhjbGFzcywgdHVwKTsKKyAgICAgICAgUHlfREVDUkVGKHR1cCk7CisgICAgfQorICAgIFB5X0RFQ1JFRihjbGFzcyk7CiAKLQlpZiAoISBvYmopIHJldHVybiAtMTsKKyAgICBpZiAoISBvYmopIHJldHVybiAtMTsKIAotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIG9iaiwgLTEpOwotCXJldHVybiAwOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIG9iaiwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX25ld29iaihVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmFyZ3MgPSBOVUxMOwotCVB5T2JqZWN0ICpjbHNyYXcgPSBOVUxMOwotCVB5VHlwZU9iamVjdCAqY2xzOwkvKiBjbHNyYXcgY2FzdCB0byBpdHMgdHJ1ZSB0eXBlICovCi0JUHlPYmplY3QgKm9iajsKKyAgICBQeU9iamVjdCAqYXJncyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNsc3JhdyA9IE5VTEw7CisgICAgUHlUeXBlT2JqZWN0ICpjbHM7ICAgICAgICAgIC8qIGNsc3JhdyBjYXN0IHRvIGl0cyB0cnVlIHR5cGUgKi8KKyAgICBQeU9iamVjdCAqb2JqOwogCi0JLyogU3RhY2sgaXMgLi4uIGNscyBhcmd0dXBsZSwgYW5kIHdlIHdhbnQgdG8gY2FsbAotCSAqIGNscy5fX25ld19fKGNscywgKmFyZ3R1cGxlKS4KLQkgKi8KLQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGFyZ3MpOwotCWlmIChhcmdzID09IE5VTEwpIGdvdG8gRmFpbDsKLQlpZiAoISBQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJORVdPQkogZXhwZWN0ZWQgYW4gYXJnICIKLQkJCQkJCSAidHVwbGUuIik7Ci0JCWdvdG8gRmFpbDsKLQl9CisgICAgLyogU3RhY2sgaXMgLi4uIGNscyBhcmd0dXBsZSwgYW5kIHdlIHdhbnQgdG8gY2FsbAorICAgICAqIGNscy5fX25ld19fKGNscywgKmFyZ3R1cGxlKS4KKyAgICAgKi8KKyAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGFyZ3MpOworICAgIGlmIChhcmdzID09IE5VTEwpIGdvdG8gRmFpbDsKKyAgICBpZiAoISBQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJORVdPQkogZXhwZWN0ZWQgYW4gYXJnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR1cGxlLiIpOworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQogCi0JUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBjbHNyYXcpOwotCWNscyA9IChQeVR5cGVPYmplY3QgKiljbHNyYXc7Ci0JaWYgKGNscyA9PSBOVUxMKSBnb3RvIEZhaWw7Ci0JaWYgKCEgUHlUeXBlX0NoZWNrKGNscykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgIk5FV09CSiBjbGFzcyBhcmd1bWVudCAiCi0JCQkJCSAJICJpc24ndCBhIHR5cGUgb2JqZWN0Iik7Ci0JCWdvdG8gRmFpbDsKLQl9Ci0JaWYgKGNscy0+dHBfbmV3ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgIk5FV09CSiBjbGFzcyBhcmd1bWVudCAiCi0JCQkJCQkgImhhcyBOVUxMIHRwX25ldyIpOwotCQlnb3RvIEZhaWw7Ci0JfQorICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgY2xzcmF3KTsKKyAgICBjbHMgPSAoUHlUeXBlT2JqZWN0ICopY2xzcmF3OworICAgIGlmIChjbHMgPT0gTlVMTCkgZ290byBGYWlsOworICAgIGlmICghIFB5VHlwZV9DaGVjayhjbHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJORVdPQkogY2xhc3MgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNuJ3QgYSB0eXBlIG9iamVjdCIpOworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQorICAgIGlmIChjbHMtPnRwX25ldyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJORVdPQkogY2xhc3MgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIE5VTEwgdHBfbmV3Iik7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CiAKLQkvKiBDYWxsIF9fbmV3X18uICovCi0Jb2JqID0gY2xzLT50cF9uZXcoY2xzLCBhcmdzLCBOVUxMKTsKLQlpZiAob2JqID09IE5VTEwpIGdvdG8gRmFpbDsKKyAgICAvKiBDYWxsIF9fbmV3X18uICovCisgICAgb2JqID0gY2xzLT50cF9uZXcoY2xzLCBhcmdzLCBOVUxMKTsKKyAgICBpZiAob2JqID09IE5VTEwpIGdvdG8gRmFpbDsKIAotIAlQeV9ERUNSRUYoYXJncyk7Ci0gCVB5X0RFQ1JFRihjbHNyYXcpOwotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIG9iaiwgLTEpOwotIAlyZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGNsc3Jhdyk7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgb2JqLCAtMSk7CisgICAgcmV0dXJuIDA7CiAKICBGYWlsOgotIAlQeV9YREVDUkVGKGFyZ3MpOwotIAlQeV9YREVDUkVGKGNsc3Jhdyk7Ci0gCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKGFyZ3MpOworICAgIFB5X1hERUNSRUYoY2xzcmF3KTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfZ2xvYmFsKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqY2xhc3MgPSAwLCAqbW9kdWxlX25hbWUgPSAwLCAqY2xhc3NfbmFtZSA9IDA7Ci0JaW50IGxlbjsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICpjbGFzcyA9IDAsICptb2R1bGVfbmFtZSA9IDAsICpjbGFzc19uYW1lID0gMDsKKyAgICBpbnQgbGVuOworICAgIGNoYXIgKnM7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotCW1vZHVsZV9uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSk7Ci0JaWYgKCFtb2R1bGVfbmFtZSkgIHJldHVybiAtMTsKKyAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOworICAgIG1vZHVsZV9uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSk7CisgICAgaWYgKCFtb2R1bGVfbmFtZSkgIHJldHVybiAtMTsKIAotCWlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpID49IDApIHsKLQkJaWYgKGxlbiA8IDIpIHsKLQkJCVB5X0RFQ1JFRihtb2R1bGVfbmFtZSk7Ci0JCQlyZXR1cm4gYmFkX3JlYWRsaW5lKCk7Ci0JCX0KLQkJaWYgKChjbGFzc19uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSkpKSB7Ci0JCQljbGFzcyA9IGZpbmRfY2xhc3MobW9kdWxlX25hbWUsIGNsYXNzX25hbWUsCi0JCQkJCSAgIHNlbGYtPmZpbmRfY2xhc3MpOwotCQkJUHlfREVDUkVGKGNsYXNzX25hbWUpOwotCQl9Ci0JfQotCVB5X0RFQ1JFRihtb2R1bGVfbmFtZSk7CisgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPj0gMCkgeworICAgICAgICBpZiAobGVuIDwgMikgeworICAgICAgICAgICAgUHlfREVDUkVGKG1vZHVsZV9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNsYXNzX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4gLSAxKSkpIHsKKyAgICAgICAgICAgIGNsYXNzID0gZmluZF9jbGFzcyhtb2R1bGVfbmFtZSwgY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5maW5kX2NsYXNzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjbGFzc19uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYobW9kdWxlX25hbWUpOwogCi0JaWYgKCEgY2xhc3MpIHJldHVybiAtMTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBjbGFzcywgLTEpOwotCXJldHVybiAwOworICAgIGlmICghIGNsYXNzKSByZXR1cm4gLTE7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgY2xhc3MsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX3BlcnNpZChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnBpZCA9IDA7Ci0JaW50IGxlbjsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICpwaWQgPSAwOworICAgIGludCBsZW47CisgICAgY2hhciAqczsKIAotCWlmIChzZWxmLT5wZXJzX2Z1bmMpIHsKLQkJaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7Ci0JCWlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgaWYgKHNlbGYtPnBlcnNfZnVuYykgeworICAgICAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKIAotCQlwaWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4gLSAxKTsKLQkJaWYgKCFwaWQpICByZXR1cm4gLTE7CisgICAgICAgIHBpZCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpOworICAgICAgICBpZiAoIXBpZCkgIHJldHVybiAtMTsKIAotCQlpZiAoUHlMaXN0X0NoZWNrKHNlbGYtPnBlcnNfZnVuYykpIHsKLQkJCWlmIChQeUxpc3RfQXBwZW5kKHNlbGYtPnBlcnNfZnVuYywgcGlkKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYocGlkKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBUkdfVFVQKHNlbGYsIHBpZCk7Ci0JCQlpZiAoc2VsZi0+YXJnKSB7Ci0JCQkJcGlkID0gUHlPYmplY3RfQ2FsbChzZWxmLT5wZXJzX2Z1bmMsIHNlbGYtPmFyZywKLQkJCQkJCSAgICBOVUxMKTsKLQkJCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKFB5TGlzdF9DaGVjayhzZWxmLT5wZXJzX2Z1bmMpKSB7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChzZWxmLT5wZXJzX2Z1bmMsIHBpZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHBpZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQVJHX1RVUChzZWxmLCBwaWQpOworICAgICAgICAgICAgaWYgKHNlbGYtPmFyZykgeworICAgICAgICAgICAgICAgIHBpZCA9IFB5T2JqZWN0X0NhbGwoc2VsZi0+cGVyc19mdW5jLCBzZWxmLT5hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAoISBwaWQpIHJldHVybiAtMTsKKyAgICAgICAgaWYgKCEgcGlkKSByZXR1cm4gLTE7CiAKLQkJUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcGlkLCAtMSk7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwKLQkJCQkiQSBsb2FkIHBlcnNpc3RlbnQgaWQgaW5zdHJ1Y3Rpb24gd2FzIGVuY291bnRlcmVkLFxuIgotCQkJCSJidXQgbm8gcGVyc2lzdGVudF9sb2FkIGZ1bmN0aW9uIHdhcyBzcGVjaWZpZWQuIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHBpZCwgLTEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQSBsb2FkIHBlcnNpc3RlbnQgaWQgaW5zdHJ1Y3Rpb24gd2FzIGVuY291bnRlcmVkLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBubyBwZXJzaXN0ZW50X2xvYWQgZnVuY3Rpb24gd2FzIHNwZWNpZmllZC4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogc3RhdGljIGludAogbG9hZF9iaW5wZXJzaWQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpwaWQgPSAwOworICAgIFB5T2JqZWN0ICpwaWQgPSAwOwogCi0JaWYgKHNlbGYtPnBlcnNfZnVuYykgewotCQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHBpZCk7Ci0JCWlmICghIHBpZCkgcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5wZXJzX2Z1bmMpIHsKKyAgICAgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBwaWQpOworICAgICAgICBpZiAoISBwaWQpIHJldHVybiAtMTsKIAotCQlpZiAoUHlMaXN0X0NoZWNrKHNlbGYtPnBlcnNfZnVuYykpIHsKLQkJCWlmIChQeUxpc3RfQXBwZW5kKHNlbGYtPnBlcnNfZnVuYywgcGlkKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYocGlkKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBUkdfVFVQKHNlbGYsIHBpZCk7Ci0JCQlpZiAoc2VsZi0+YXJnKSB7Ci0JCQkJcGlkID0gUHlPYmplY3RfQ2FsbChzZWxmLT5wZXJzX2Z1bmMsIHNlbGYtPmFyZywKLQkJCQkJCSAgICBOVUxMKTsKLQkJCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JCQl9Ci0JCQlpZiAoISBwaWQpIHJldHVybiAtMTsKLQkJfQorICAgICAgICBpZiAoUHlMaXN0X0NoZWNrKHNlbGYtPnBlcnNfZnVuYykpIHsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHNlbGYtPnBlcnNfZnVuYywgcGlkKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBUkdfVFVQKHNlbGYsIHBpZCk7CisgICAgICAgICAgICBpZiAoc2VsZi0+YXJnKSB7CisgICAgICAgICAgICAgICAgcGlkID0gUHlPYmplY3RfQ2FsbChzZWxmLT5wZXJzX2Z1bmMsIHNlbGYtPmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgIEZSRUVfQVJHX1RVUChzZWxmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghIHBpZCkgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcGlkLCAtMSk7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwKLQkJCQkiQSBsb2FkIHBlcnNpc3RlbnQgaWQgaW5zdHJ1Y3Rpb24gd2FzIGVuY291bnRlcmVkLFxuIgotCQkJCSJidXQgbm8gcGVyc2lzdGVudF9sb2FkIGZ1bmN0aW9uIHdhcyBzcGVjaWZpZWQuIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHBpZCwgLTEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQSBsb2FkIHBlcnNpc3RlbnQgaWQgaW5zdHJ1Y3Rpb24gd2FzIGVuY291bnRlcmVkLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBubyBwZXJzaXN0ZW50X2xvYWQgZnVuY3Rpb24gd2FzIHNwZWNpZmllZC4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX3BvcChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JaW50IGxlbiA9IHNlbGYtPnN0YWNrLT5sZW5ndGg7CisgICAgaW50IGxlbiA9IHNlbGYtPnN0YWNrLT5sZW5ndGg7CiAKLQkvKiBOb3RlIHRoYXQgd2Ugc3BsaXQgdGhlIChwaWNrbGUucHkpIHN0YWNrIGludG8gdHdvIHN0YWNrcywKLQkgICBhbiBvYmplY3Qgc3RhY2sgYW5kIGEgbWFyayBzdGFjay4gV2UgaGF2ZSB0byBiZSBjbGV2ZXIgYW5kCi0JICAgcG9wIHRoZSByaWdodCBvbmUuIFdlIGRvIHRoaXMgYnkgbG9va2luZyBhdCB0aGUgdG9wIG9mIHRoZQotCSAgIG1hcmsgc3RhY2sgZmlyc3QsIGFuZCBvbmx5IHNpZ25hbGxpbmcgYSBzdGFjayB1bmRlcmZsb3cgaWYKLQkgICB0aGUgb2JqZWN0IHN0YWNrIGlzIGVtcHR5IGFuZCB0aGUgbWFyayBzdGFjayBkb2Vzbid0IG1hdGNoCi0JICAgb3VyIGV4cGVjdGF0aW9ucy4KLQkqLwotCWlmIChzZWxmLT5udW1fbWFya3MgPiAwICYmIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcyAtIDFdID09IGxlbikgewotCQlzZWxmLT5udW1fbWFya3MtLTsKLQl9IGVsc2UgaWYgKGxlbiA+IDApIHsKLQkJbGVuLS07Ci0JCVB5X0RFQ1JFRihzZWxmLT5zdGFjay0+ZGF0YVtsZW5dKTsKLQkJc2VsZi0+c3RhY2stPmxlbmd0aCA9IGxlbjsKLQl9IGVsc2UgewotCQlyZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgLyogTm90ZSB0aGF0IHdlIHNwbGl0IHRoZSAocGlja2xlLnB5KSBzdGFjayBpbnRvIHR3byBzdGFja3MsCisgICAgICAgYW4gb2JqZWN0IHN0YWNrIGFuZCBhIG1hcmsgc3RhY2suIFdlIGhhdmUgdG8gYmUgY2xldmVyIGFuZAorICAgICAgIHBvcCB0aGUgcmlnaHQgb25lLiBXZSBkbyB0aGlzIGJ5IGxvb2tpbmcgYXQgdGhlIHRvcCBvZiB0aGUKKyAgICAgICBtYXJrIHN0YWNrIGZpcnN0LCBhbmQgb25seSBzaWduYWxsaW5nIGEgc3RhY2sgdW5kZXJmbG93IGlmCisgICAgICAgdGhlIG9iamVjdCBzdGFjayBpcyBlbXB0eSBhbmQgdGhlIG1hcmsgc3RhY2sgZG9lc24ndCBtYXRjaAorICAgICAgIG91ciBleHBlY3RhdGlvbnMuCisgICAgKi8KKyAgICBpZiAoc2VsZi0+bnVtX21hcmtzID4gMCAmJiBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MgLSAxXSA9PSBsZW4pIHsKKyAgICAgICAgc2VsZi0+bnVtX21hcmtzLS07CisgICAgfSBlbHNlIGlmIChsZW4gPiAwKSB7CisgICAgICAgIGxlbi0tOworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+c3RhY2stPmRhdGFbbGVuXSk7CisgICAgICAgIHNlbGYtPnN0YWNrLT5sZW5ndGggPSBsZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfcG9wX21hcmsoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWludCBpOworICAgIGludCBpOwogCi0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIGkpOworICAgIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfZHVwKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqbGFzdDsKLQlpbnQgbGVuOworICAgIFB5T2JqZWN0ICpsYXN0OworICAgIGludCBsZW47CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnN0YWNrLT5sZW5ndGgpIDw9IDApIHJldHVybiBzdGFja1VuZGVyZmxvdygpOwotCWxhc3Q9c2VsZi0+c3RhY2stPmRhdGFbbGVuLTFdOwotCVB5X0lOQ1JFRihsYXN0KTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBsYXN0LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKChsZW4gPSBzZWxmLT5zdGFjay0+bGVuZ3RoKSA8PSAwKSByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKKyAgICBsYXN0PXNlbGYtPnN0YWNrLT5kYXRhW2xlbi0xXTsKKyAgICBQeV9JTkNSRUYobGFzdCk7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgbGFzdCwgLTEpOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfZ2V0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfc3RyID0gMCwgKnZhbHVlID0gMDsKLQlpbnQgbGVuOwotCWNoYXIgKnM7Ci0JaW50IHJjOworICAgIFB5T2JqZWN0ICpweV9zdHIgPSAwLCAqdmFsdWUgPSAwOworICAgIGludCBsZW47CisgICAgY2hhciAqczsKKyAgICBpbnQgcmM7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CiAKLQlpZiAoISggcHlfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSkpKSAgcmV0dXJuIC0xOworICAgIGlmICghKCBweV9zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4gLSAxKSkpICByZXR1cm4gLTE7CiAKLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X3N0cik7Ci0JaWYgKCEgdmFsdWUpIHsKLQkJUHlFcnJfU2V0T2JqZWN0KEJhZFBpY2tsZUdldCwgcHlfc3RyKTsKLQkJcmMgPSAtMTsKLQl9Ci0JZWxzZSB7Ci0JCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgdmFsdWUsIC0xKTsKLQkJcmMgPSAwOwotCX0KKyAgICB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X3N0cik7CisgICAgaWYgKCEgdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KEJhZFBpY2tsZUdldCwgcHlfc3RyKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgdmFsdWUsIC0xKTsKKyAgICAgICAgcmMgPSAwOworICAgIH0KIAotCVB5X0RFQ1JFRihweV9zdHIpOwotCXJldHVybiByYzsKKyAgICBQeV9ERUNSRUYocHlfc3RyKTsKKyAgICByZXR1cm4gcmM7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9iaW5nZXQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpweV9rZXkgPSAwLCAqdmFsdWUgPSAwOwotCXVuc2lnbmVkIGNoYXIga2V5OwotCWNoYXIgKnM7Ci0JaW50IHJjOworICAgIFB5T2JqZWN0ICpweV9rZXkgPSAwLCAqdmFsdWUgPSAwOworICAgIHVuc2lnbmVkIGNoYXIga2V5OworICAgIGNoYXIgKnM7CisgICAgaW50IHJjOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKSByZXR1cm4gLTE7CiAKLQlrZXkgPSAodW5zaWduZWQgY2hhcilzWzBdOwotCWlmICghKCBweV9rZXkgPSBQeUludF9Gcm9tTG9uZygobG9uZylrZXkpKSkgIHJldHVybiAtMTsKKyAgICBrZXkgPSAodW5zaWduZWQgY2hhcilzWzBdOworICAgIGlmICghKCBweV9rZXkgPSBQeUludF9Gcm9tTG9uZygobG9uZylrZXkpKSkgIHJldHVybiAtMTsKIAotCXZhbHVlID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5KTsKLQlpZiAoISB2YWx1ZSkgewotCQlQeUVycl9TZXRPYmplY3QoQmFkUGlja2xlR2V0LCBweV9rZXkpOwotCQlyYyA9IC0xOwotCX0KLQllbHNlIHsKLQkJUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCB2YWx1ZSwgLTEpOwotCQlyYyA9IDA7Ci0JfQorICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5KTsKKyAgICBpZiAoISB2YWx1ZSkgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoQmFkUGlja2xlR2V0LCBweV9rZXkpOworICAgICAgICByYyA9IC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCB2YWx1ZSwgLTEpOworICAgICAgICByYyA9IDA7CisgICAgfQogCi0JUHlfREVDUkVGKHB5X2tleSk7Ci0JcmV0dXJuIHJjOworICAgIFB5X0RFQ1JFRihweV9rZXkpOworICAgIHJldHVybiByYzsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2xvbmdfYmluZ2V0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfa2V5ID0gMCwgKnZhbHVlID0gMDsKLQl1bnNpZ25lZCBjaGFyIGM7Ci0JY2hhciAqczsKLQlsb25nIGtleTsKLQlpbnQgcmM7CisgICAgUHlPYmplY3QgKnB5X2tleSA9IDAsICp2YWx1ZSA9IDA7CisgICAgdW5zaWduZWQgY2hhciBjOworICAgIGNoYXIgKnM7CisgICAgbG9uZyBrZXk7CisgICAgaW50IHJjOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CiAKLQljID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKLQlrZXkgPSAobG9uZyljOwotCWMgPSAodW5zaWduZWQgY2hhcilzWzFdOwotCWtleSB8PSAobG9uZyljIDw8IDg7Ci0JYyA9ICh1bnNpZ25lZCBjaGFyKXNbMl07Ci0Ja2V5IHw9IChsb25nKWMgPDwgMTY7Ci0JYyA9ICh1bnNpZ25lZCBjaGFyKXNbM107Ci0Ja2V5IHw9IChsb25nKWMgPDwgMjQ7CisgICAgYyA9ICh1bnNpZ25lZCBjaGFyKXNbMF07CisgICAga2V5ID0gKGxvbmcpYzsKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIpc1sxXTsKKyAgICBrZXkgfD0gKGxvbmcpYyA8PCA4OworICAgIGMgPSAodW5zaWduZWQgY2hhcilzWzJdOworICAgIGtleSB8PSAobG9uZyljIDw8IDE2OworICAgIGMgPSAodW5zaWduZWQgY2hhcilzWzNdOworICAgIGtleSB8PSAobG9uZyljIDw8IDI0OwogCi0JaWYgKCEoIHB5X2tleSA9IFB5SW50X0Zyb21Mb25nKChsb25nKWtleSkpKSAgcmV0dXJuIC0xOworICAgIGlmICghKCBweV9rZXkgPSBQeUludF9Gcm9tTG9uZygobG9uZylrZXkpKSkgIHJldHVybiAtMTsKIAotCXZhbHVlID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5KTsKLQlpZiAoISB2YWx1ZSkgewotCQlQeUVycl9TZXRPYmplY3QoQmFkUGlja2xlR2V0LCBweV9rZXkpOwotCQlyYyA9IC0xOwotCX0KLQllbHNlIHsKLQkJUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCB2YWx1ZSwgLTEpOwotCQlyYyA9IDA7Ci0JfQorICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5KTsKKyAgICBpZiAoISB2YWx1ZSkgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoQmFkUGlja2xlR2V0LCBweV9rZXkpOworICAgICAgICByYyA9IC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCB2YWx1ZSwgLTEpOworICAgICAgICByYyA9IDA7CisgICAgfQogCi0JUHlfREVDUkVGKHB5X2tleSk7Ci0JcmV0dXJuIHJjOworICAgIFB5X0RFQ1JFRihweV9rZXkpOworICAgIHJldHVybiByYzsKIH0KIAogLyogUHVzaCBhbiBvYmplY3QgZnJvbSB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IChFWFRbMTI0XSkuICBuYnl0ZXMgaXMKQEAgLTQyNTAsMzk5ICs0MjUwLDM5OSBAQAogc3RhdGljIGludAogbG9hZF9leHRlbnNpb24oVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBpbnQgbmJ5dGVzKQogewotCWNoYXIgKmNvZGVieXRlczsJLyogdGhlIG5ieXRlcyBieXRlcyBhZnRlciB0aGUgb3Bjb2RlICovCi0JbG9uZyBjb2RlOwkJLyogY2FsY19iaW5pbnQgcmV0dXJucyBsb25nICovCi0JUHlPYmplY3QgKnB5X2NvZGU7CS8qIGNvZGUgYXMgYSBQeXRob24gaW50ICovCi0JUHlPYmplY3QgKm9iajsJCS8qIHRoZSBvYmplY3QgdG8gcHVzaCAqLwotCVB5T2JqZWN0ICpwYWlyOwkJLyogKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lKSAqLwotCVB5T2JqZWN0ICptb2R1bGVfbmFtZSwgKmNsYXNzX25hbWU7CisgICAgY2hhciAqY29kZWJ5dGVzOyAgICAgICAgICAgIC8qIHRoZSBuYnl0ZXMgYnl0ZXMgYWZ0ZXIgdGhlIG9wY29kZSAqLworICAgIGxvbmcgY29kZTsgICAgICAgICAgICAgICAgICAvKiBjYWxjX2JpbmludCByZXR1cm5zIGxvbmcgKi8KKyAgICBQeU9iamVjdCAqcHlfY29kZTsgICAgICAgICAgLyogY29kZSBhcyBhIFB5dGhvbiBpbnQgKi8KKyAgICBQeU9iamVjdCAqb2JqOyAgICAgICAgICAgICAgLyogdGhlIG9iamVjdCB0byBwdXNoICovCisgICAgUHlPYmplY3QgKnBhaXI7ICAgICAgICAgICAgIC8qIChtb2R1bGVfbmFtZSwgY2xhc3NfbmFtZSkgKi8KKyAgICBQeU9iamVjdCAqbW9kdWxlX25hbWUsICpjbGFzc19uYW1lOwogCi0JYXNzZXJ0KG5ieXRlcyA9PSAxIHx8IG5ieXRlcyA9PSAyIHx8IG5ieXRlcyA9PSA0KTsKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZjb2RlYnl0ZXMsIG5ieXRlcykgPCAwKSByZXR1cm4gLTE7Ci0JY29kZSA9IGNhbGNfYmluaW50KGNvZGVieXRlcywgIG5ieXRlcyk7Ci0JaWYgKGNvZGUgPD0gMCkgewkJLyogbm90ZSB0aGF0IDAgaXMgZm9yYmlkZGVuICovCi0JCS8qIENvcnJ1cHQgb3IgaG9zdGlsZSBwaWNrbGUuICovCi0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJFWFQgc3BlY2lmaWVzIGNvZGUgPD0gMCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGFzc2VydChuYnl0ZXMgPT0gMSB8fCBuYnl0ZXMgPT0gMiB8fCBuYnl0ZXMgPT0gNCk7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmY29kZWJ5dGVzLCBuYnl0ZXMpIDwgMCkgcmV0dXJuIC0xOworICAgIGNvZGUgPSBjYWxjX2JpbmludChjb2RlYnl0ZXMsICBuYnl0ZXMpOworICAgIGlmIChjb2RlIDw9IDApIHsgICAgICAgICAgICAgICAgICAgIC8qIG5vdGUgdGhhdCAwIGlzIGZvcmJpZGRlbiAqLworICAgICAgICAvKiBDb3JydXB0IG9yIGhvc3RpbGUgcGlja2xlLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiRVhUIHNwZWNpZmllcyBjb2RlIDw9IDAiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIExvb2sgZm9yIHRoZSBjb2RlIGluIHRoZSBjYWNoZS4gKi8KLQlweV9jb2RlID0gUHlJbnRfRnJvbUxvbmcoY29kZSk7Ci0JaWYgKHB5X2NvZGUgPT0gTlVMTCkgcmV0dXJuIC0xOwotCW9iaiA9IFB5RGljdF9HZXRJdGVtKGV4dGVuc2lvbl9jYWNoZSwgcHlfY29kZSk7Ci0JaWYgKG9iaiAhPSBOVUxMKSB7Ci0JCS8qIEJpbmdvLiAqLwotCQlQeV9ERUNSRUYocHlfY29kZSk7Ci0JCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgb2JqLCAtMSk7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBMb29rIGZvciB0aGUgY29kZSBpbiB0aGUgY2FjaGUuICovCisgICAgcHlfY29kZSA9IFB5SW50X0Zyb21Mb25nKGNvZGUpOworICAgIGlmIChweV9jb2RlID09IE5VTEwpIHJldHVybiAtMTsKKyAgICBvYmogPSBQeURpY3RfR2V0SXRlbShleHRlbnNpb25fY2FjaGUsIHB5X2NvZGUpOworICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAvKiBCaW5nby4gKi8KKyAgICAgICAgUHlfREVDUkVGKHB5X2NvZGUpOworICAgICAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIG9iaiwgLTEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBMb29rIHVwIHRoZSAobW9kdWxlX25hbWUsIGNsYXNzX25hbWUpIHBhaXIuICovCi0JcGFpciA9IFB5RGljdF9HZXRJdGVtKGludmVydGVkX3JlZ2lzdHJ5LCBweV9jb2RlKTsKLQlpZiAocGFpciA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihweV9jb2RlKTsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bnJlZ2lzdGVyZWQgZXh0ZW5zaW9uICIKLQkJCSAgICAgImNvZGUgJWxkIiwgY29kZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogU2luY2UgdGhlIGV4dGVuc2lvbiByZWdpc3RyeSBpcyBtYW5pcHVsYWJsZSB2aWEgUHl0aG9uIGNvZGUsCi0JICogY29uZmlybSB0aGF0IHBhaXIgaXMgcmVhbGx5IGEgMi10dXBsZSBvZiBzdHJpbmdzLgotCSAqLwotCWlmICghUHlUdXBsZV9DaGVjayhwYWlyKSB8fCBQeVR1cGxlX1NpemUocGFpcikgIT0gMiB8fAotCSAgICAhUHlTdHJpbmdfQ2hlY2sobW9kdWxlX25hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKHBhaXIsIDApKSB8fAotCSAgICAhUHlTdHJpbmdfQ2hlY2soY2xhc3NfbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0ocGFpciwgMSkpKSB7Ci0JCVB5X0RFQ1JFRihweV9jb2RlKTsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJfaW52ZXJ0ZWRfcmVnaXN0cnlbJWxkXSAiCi0JCQkgICAgICJpc24ndCBhIDItdHVwbGUgb2Ygc3RyaW5ncyIsIGNvZGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIExvYWQgdGhlIG9iamVjdC4gKi8KLQlvYmogPSBmaW5kX2NsYXNzKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lLCBzZWxmLT5maW5kX2NsYXNzKTsKLQlpZiAob2JqID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHB5X2NvZGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIENhY2hlIGNvZGUgLT4gb2JqLiAqLwotCWNvZGUgPSBQeURpY3RfU2V0SXRlbShleHRlbnNpb25fY2FjaGUsIHB5X2NvZGUsIG9iaik7Ci0JUHlfREVDUkVGKHB5X2NvZGUpOwotCWlmIChjb2RlIDwgMCkgewotCQlQeV9ERUNSRUYob2JqKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYmosIC0xKTsKLQlyZXR1cm4gMDsKKyAgICAvKiBMb29rIHVwIHRoZSAobW9kdWxlX25hbWUsIGNsYXNzX25hbWUpIHBhaXIuICovCisgICAgcGFpciA9IFB5RGljdF9HZXRJdGVtKGludmVydGVkX3JlZ2lzdHJ5LCBweV9jb2RlKTsKKyAgICBpZiAocGFpciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihweV9jb2RlKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bnJlZ2lzdGVyZWQgZXh0ZW5zaW9uICIKKyAgICAgICAgICAgICAgICAgICAgICJjb2RlICVsZCIsIGNvZGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIFNpbmNlIHRoZSBleHRlbnNpb24gcmVnaXN0cnkgaXMgbWFuaXB1bGFibGUgdmlhIFB5dGhvbiBjb2RlLAorICAgICAqIGNvbmZpcm0gdGhhdCBwYWlyIGlzIHJlYWxseSBhIDItdHVwbGUgb2Ygc3RyaW5ncy4KKyAgICAgKi8KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2socGFpcikgfHwgUHlUdXBsZV9TaXplKHBhaXIpICE9IDIgfHwKKyAgICAgICAgIVB5U3RyaW5nX0NoZWNrKG1vZHVsZV9uYW1lID0gUHlUdXBsZV9HRVRfSVRFTShwYWlyLCAwKSkgfHwKKyAgICAgICAgIVB5U3RyaW5nX0NoZWNrKGNsYXNzX25hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKHBhaXIsIDEpKSkgeworICAgICAgICBQeV9ERUNSRUYocHlfY29kZSk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiX2ludmVydGVkX3JlZ2lzdHJ5WyVsZF0gIgorICAgICAgICAgICAgICAgICAgICAgImlzbid0IGEgMi10dXBsZSBvZiBzdHJpbmdzIiwgY29kZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogTG9hZCB0aGUgb2JqZWN0LiAqLworICAgIG9iaiA9IGZpbmRfY2xhc3MobW9kdWxlX25hbWUsIGNsYXNzX25hbWUsIHNlbGYtPmZpbmRfY2xhc3MpOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocHlfY29kZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogQ2FjaGUgY29kZSAtPiBvYmouICovCisgICAgY29kZSA9IFB5RGljdF9TZXRJdGVtKGV4dGVuc2lvbl9jYWNoZSwgcHlfY29kZSwgb2JqKTsKKyAgICBQeV9ERUNSRUYocHlfY29kZSk7CisgICAgaWYgKGNvZGUgPCAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIG9iaiwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX3B1dChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X3N0ciA9IDAsICp2YWx1ZSA9IDA7Ci0JaW50IGxlbiwgbDsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICpweV9zdHIgPSAwLCAqdmFsdWUgPSAwOworICAgIGludCBsZW4sIGw7CisgICAgY2hhciAqczsKIAotCWlmICgobCA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobCA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKLQlpZiAoISggbGVuPXNlbGYtPnN0YWNrLT5sZW5ndGggKSkgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOwotCWlmICghKCBweV9zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsIC0gMSkpKSAgcmV0dXJuIC0xOwotCXZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2xlbi0xXTsKLQlsPVB5RGljdF9TZXRJdGVtKHNlbGYtPm1lbW8sIHB5X3N0ciwgdmFsdWUpOwotCVB5X0RFQ1JFRihweV9zdHIpOwotCXJldHVybiBsOworICAgIGlmICgobCA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAobCA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICBpZiAoISggbGVuPXNlbGYtPnN0YWNrLT5sZW5ndGggKSkgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOworICAgIGlmICghKCBweV9zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsIC0gMSkpKSAgcmV0dXJuIC0xOworICAgIHZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2xlbi0xXTsKKyAgICBsPVB5RGljdF9TZXRJdGVtKHNlbGYtPm1lbW8sIHB5X3N0ciwgdmFsdWUpOworICAgIFB5X0RFQ1JFRihweV9zdHIpOworICAgIHJldHVybiBsOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfYmlucHV0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfa2V5ID0gMCwgKnZhbHVlID0gMDsKLQl1bnNpZ25lZCBjaGFyIGtleTsKLQljaGFyICpzOwotCWludCBsZW47CisgICAgUHlPYmplY3QgKnB5X2tleSA9IDAsICp2YWx1ZSA9IDA7CisgICAgdW5zaWduZWQgY2hhciBrZXk7CisgICAgY2hhciAqczsKKyAgICBpbnQgbGVuOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKCEoIChsZW49c2VsZi0+c3RhY2stPmxlbmd0aCkgPiAwICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAoISggKGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoKSA+IDAgKSkgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOwogCi0Ja2V5ID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKKyAgICBrZXkgPSAodW5zaWduZWQgY2hhcilzWzBdOwogCi0JaWYgKCEoIHB5X2tleSA9IFB5SW50X0Zyb21Mb25nKChsb25nKWtleSkpKSAgcmV0dXJuIC0xOwotCXZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2xlbi0xXTsKLQlsZW49UHlEaWN0X1NldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5LCB2YWx1ZSk7Ci0JUHlfREVDUkVGKHB5X2tleSk7Ci0JcmV0dXJuIGxlbjsKKyAgICBpZiAoISggcHlfa2V5ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpa2V5KSkpICByZXR1cm4gLTE7CisgICAgdmFsdWU9c2VsZi0+c3RhY2stPmRhdGFbbGVuLTFdOworICAgIGxlbj1QeURpY3RfU2V0SXRlbShzZWxmLT5tZW1vLCBweV9rZXksIHZhbHVlKTsKKyAgICBQeV9ERUNSRUYocHlfa2V5KTsKKyAgICByZXR1cm4gbGVuOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfbG9uZ19iaW5wdXQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpweV9rZXkgPSAwLCAqdmFsdWUgPSAwOwotCWxvbmcga2V5OwotCXVuc2lnbmVkIGNoYXIgYzsKLQljaGFyICpzOwotCWludCBsZW47CisgICAgUHlPYmplY3QgKnB5X2tleSA9IDAsICp2YWx1ZSA9IDA7CisgICAgbG9uZyBrZXk7CisgICAgdW5zaWduZWQgY2hhciBjOworICAgIGNoYXIgKnM7CisgICAgaW50IGxlbjsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkgcmV0dXJuIC0xOwotCWlmICghKCBsZW49c2VsZi0+c3RhY2stPmxlbmd0aCApKSAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKCEoIGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKIAotCWMgPSAodW5zaWduZWQgY2hhcilzWzBdOwotCWtleSA9IChsb25nKWM7Ci0JYyA9ICh1bnNpZ25lZCBjaGFyKXNbMV07Ci0Ja2V5IHw9IChsb25nKWMgPDwgODsKLQljID0gKHVuc2lnbmVkIGNoYXIpc1syXTsKLQlrZXkgfD0gKGxvbmcpYyA8PCAxNjsKLQljID0gKHVuc2lnbmVkIGNoYXIpc1szXTsKLQlrZXkgfD0gKGxvbmcpYyA8PCAyNDsKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKKyAgICBrZXkgPSAobG9uZyljOworICAgIGMgPSAodW5zaWduZWQgY2hhcilzWzFdOworICAgIGtleSB8PSAobG9uZyljIDw8IDg7CisgICAgYyA9ICh1bnNpZ25lZCBjaGFyKXNbMl07CisgICAga2V5IHw9IChsb25nKWMgPDwgMTY7CisgICAgYyA9ICh1bnNpZ25lZCBjaGFyKXNbM107CisgICAga2V5IHw9IChsb25nKWMgPDwgMjQ7CiAKLQlpZiAoISggcHlfa2V5ID0gUHlJbnRfRnJvbUxvbmcoa2V5KSkpICByZXR1cm4gLTE7Ci0JdmFsdWU9c2VsZi0+c3RhY2stPmRhdGFbbGVuLTFdOwotCWxlbj1QeURpY3RfU2V0SXRlbShzZWxmLT5tZW1vLCBweV9rZXksIHZhbHVlKTsKLQlQeV9ERUNSRUYocHlfa2V5KTsKLQlyZXR1cm4gbGVuOworICAgIGlmICghKCBweV9rZXkgPSBQeUludF9Gcm9tTG9uZyhrZXkpKSkgIHJldHVybiAtMTsKKyAgICB2YWx1ZT1zZWxmLT5zdGFjay0+ZGF0YVtsZW4tMV07CisgICAgbGVuPVB5RGljdF9TZXRJdGVtKHNlbGYtPm1lbW8sIHB5X2tleSwgdmFsdWUpOworICAgIFB5X0RFQ1JFRihweV9rZXkpOworICAgIHJldHVybiBsZW47CiB9CiAKIAogc3RhdGljIGludAogZG9fYXBwZW5kKFVucGlja2xlcm9iamVjdCAqc2VsZiwgaW50ICB4KQogewotCVB5T2JqZWN0ICp2YWx1ZSA9IDAsICpsaXN0ID0gMCwgKmFwcGVuZF9tZXRob2QgPSAwOwotCWludCBsZW4sIGk7CisgICAgUHlPYmplY3QgKnZhbHVlID0gMCwgKmxpc3QgPSAwLCAqYXBwZW5kX21ldGhvZCA9IDA7CisgICAgaW50IGxlbiwgaTsKIAotCWxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoOwotCWlmICghKCBsZW4gPj0geCAmJiB4ID4gMCApKSAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7Ci0JLyogbm90aGluZyB0byBkbyAqLwotCWlmIChsZW49PXgpIHJldHVybiAwOworICAgIGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoOworICAgIGlmICghKCBsZW4gPj0geCAmJiB4ID4gMCApKSAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICAgIGlmIChsZW49PXgpIHJldHVybiAwOwogCi0JbGlzdD1zZWxmLT5zdGFjay0+ZGF0YVt4LTFdOworICAgIGxpc3Q9c2VsZi0+c3RhY2stPmRhdGFbeC0xXTsKIAotCWlmIChQeUxpc3RfQ2hlY2sobGlzdCkpIHsKLQkJUHlPYmplY3QgKnNsaWNlOwotCQlpbnQgbGlzdF9sZW47CisgICAgaWYgKFB5TGlzdF9DaGVjayhsaXN0KSkgeworICAgICAgICBQeU9iamVjdCAqc2xpY2U7CisgICAgICAgIGludCBsaXN0X2xlbjsKIAotCQlzbGljZT1QZGF0YV9wb3BMaXN0KHNlbGYtPnN0YWNrLCB4KTsKLQkJaWYgKCEgc2xpY2UpIHJldHVybiAtMTsKLQkJbGlzdF9sZW4gPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7Ci0JCWk9UHlMaXN0X1NldFNsaWNlKGxpc3QsIGxpc3RfbGVuLCBsaXN0X2xlbiwgc2xpY2UpOwotCQlQeV9ERUNSRUYoc2xpY2UpOwotCQlyZXR1cm4gaTsKLQl9Ci0JZWxzZSB7CisgICAgICAgIHNsaWNlPVBkYXRhX3BvcExpc3Qoc2VsZi0+c3RhY2ssIHgpOworICAgICAgICBpZiAoISBzbGljZSkgcmV0dXJuIC0xOworICAgICAgICBsaXN0X2xlbiA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKKyAgICAgICAgaT1QeUxpc3RfU2V0U2xpY2UobGlzdCwgbGlzdF9sZW4sIGxpc3RfbGVuLCBzbGljZSk7CisgICAgICAgIFB5X0RFQ1JFRihzbGljZSk7CisgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICBlbHNlIHsKIAotCQlpZiAoISggYXBwZW5kX21ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIobGlzdCwgYXBwZW5kX3N0cikpKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoISggYXBwZW5kX21ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIobGlzdCwgYXBwZW5kX3N0cikpKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWZvciAoaSA9IHg7IGkgPCBsZW47IGkrKykgewotCQkJUHlPYmplY3QgKmp1bms7CisgICAgICAgIGZvciAoaSA9IHg7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKmp1bms7CiAKLQkJCXZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2ldOwotCQkJanVuaz0wOwotCQkJQVJHX1RVUChzZWxmLCB2YWx1ZSk7Ci0JCQlpZiAoc2VsZi0+YXJnKSB7Ci0JCQkJanVuayA9IFB5T2JqZWN0X0NhbGwoYXBwZW5kX21ldGhvZCwgc2VsZi0+YXJnLAotCQkJCQkJICAgICBOVUxMKTsKLQkJCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JCQl9Ci0JCQlpZiAoISBqdW5rKSB7Ci0JCQkJUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIGkrMSk7Ci0JCQkJc2VsZi0+c3RhY2stPmxlbmd0aD14OwotCQkJCVB5X0RFQ1JFRihhcHBlbmRfbWV0aG9kKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoanVuayk7Ci0JCX0KLQkJc2VsZi0+c3RhY2stPmxlbmd0aD14OwotCQlQeV9ERUNSRUYoYXBwZW5kX21ldGhvZCk7Ci0JfQorICAgICAgICAgICAgdmFsdWU9c2VsZi0+c3RhY2stPmRhdGFbaV07CisgICAgICAgICAgICBqdW5rPTA7CisgICAgICAgICAgICBBUkdfVFVQKHNlbGYsIHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5hcmcpIHsKKyAgICAgICAgICAgICAgICBqdW5rID0gUHlPYmplY3RfQ2FsbChhcHBlbmRfbWV0aG9kLCBzZWxmLT5hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgRlJFRV9BUkdfVFVQKHNlbGYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEganVuaykgeworICAgICAgICAgICAgICAgIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKzEpOworICAgICAgICAgICAgICAgIHNlbGYtPnN0YWNrLT5sZW5ndGg9eDsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXBwZW5kX21ldGhvZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGp1bmspOworICAgICAgICB9CisgICAgICAgIHNlbGYtPnN0YWNrLT5sZW5ndGg9eDsKKyAgICAgICAgUHlfREVDUkVGKGFwcGVuZF9tZXRob2QpOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfYXBwZW5kKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gZG9fYXBwZW5kKHNlbGYsIHNlbGYtPnN0YWNrLT5sZW5ndGggLSAxKTsKKyAgICByZXR1cm4gZG9fYXBwZW5kKHNlbGYsIHNlbGYtPnN0YWNrLT5sZW5ndGggLSAxKTsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2FwcGVuZHMoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCXJldHVybiBkb19hcHBlbmQoc2VsZiwgbWFya2VyKHNlbGYpKTsKKyAgICByZXR1cm4gZG9fYXBwZW5kKHNlbGYsIG1hcmtlcihzZWxmKSk7CiB9CiAKIAogc3RhdGljIGludAogZG9fc2V0aXRlbXMoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBpbnQgIHgpCiB7Ci0JUHlPYmplY3QgKnZhbHVlID0gMCwgKmtleSA9IDAsICpkaWN0ID0gMDsKLQlpbnQgbGVuLCBpLCByPTA7CisgICAgUHlPYmplY3QgKnZhbHVlID0gMCwgKmtleSA9IDAsICpkaWN0ID0gMDsKKyAgICBpbnQgbGVuLCBpLCByPTA7CiAKLQlpZiAoISggKGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoKSA+PSB4Ci0JICAgICAgICYmIHggPiAwICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKKyAgICBpZiAoISggKGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoKSA+PSB4CisgICAgICAgICAgICYmIHggPiAwICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKIAotCWRpY3Q9c2VsZi0+c3RhY2stPmRhdGFbeC0xXTsKKyAgICBkaWN0PXNlbGYtPnN0YWNrLT5kYXRhW3gtMV07CiAKLQlmb3IgKGkgPSB4KzE7IGkgPCBsZW47IGkgKz0gMikgewotCQlrZXkgID1zZWxmLT5zdGFjay0+ZGF0YVtpLTFdOwotCQl2YWx1ZT1zZWxmLT5zdGFjay0+ZGF0YVtpICBdOwotCQlpZiAoUHlPYmplY3RfU2V0SXRlbShkaWN0LCBrZXksIHZhbHVlKSA8IDApIHsKLQkJCXI9LTE7Ci0JCQlicmVhazsKLQkJfQotCX0KKyAgICBmb3IgKGkgPSB4KzE7IGkgPCBsZW47IGkgKz0gMikgeworICAgICAgICBrZXkgID1zZWxmLT5zdGFjay0+ZGF0YVtpLTFdOworICAgICAgICB2YWx1ZT1zZWxmLT5zdGFjay0+ZGF0YVtpICBdOworICAgICAgICBpZiAoUHlPYmplY3RfU2V0SXRlbShkaWN0LCBrZXksIHZhbHVlKSA8IDApIHsKKyAgICAgICAgICAgIHI9LTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIAotCVBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCB4KTsKKyAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgeCk7CiAKLQlyZXR1cm4gcjsKKyAgICByZXR1cm4gcjsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX3NldGl0ZW0oVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCXJldHVybiBkb19zZXRpdGVtcyhzZWxmLCBzZWxmLT5zdGFjay0+bGVuZ3RoIC0gMik7CisgICAgcmV0dXJuIGRvX3NldGl0ZW1zKHNlbGYsIHNlbGYtPnN0YWNrLT5sZW5ndGggLSAyKTsKIH0KIAogc3RhdGljIGludAogbG9hZF9zZXRpdGVtcyhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIGRvX3NldGl0ZW1zKHNlbGYsIG1hcmtlcihzZWxmKSk7CisgICAgcmV0dXJuIGRvX3NldGl0ZW1zKHNlbGYsIG1hcmtlcihzZWxmKSk7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9idWlsZChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnN0YXRlLCAqaW5zdCwgKnNsb3RzdGF0ZTsKLQlQeU9iamVjdCAqX19zZXRzdGF0ZV9fOwotCVB5T2JqZWN0ICpkX2tleSwgKmRfdmFsdWU7Ci0JUHlfc3NpemVfdCBpOwotCWludCByZXMgPSAtMTsKKyAgICBQeU9iamVjdCAqc3RhdGUsICppbnN0LCAqc2xvdHN0YXRlOworICAgIFB5T2JqZWN0ICpfX3NldHN0YXRlX187CisgICAgUHlPYmplY3QgKmRfa2V5LCAqZF92YWx1ZTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IHJlcyA9IC0xOwogCi0JLyogU3RhY2sgaXMgLi4uIGluc3RhbmNlLCBzdGF0ZS4gIFdlIHdhbnQgdG8gbGVhdmUgaW5zdGFuY2UgYXQKLQkgKiB0aGUgc3RhY2sgdG9wLCBwb3NzaWJseSBtdXRhdGVkIHZpYSBpbnN0YW5jZS5fX3NldHN0YXRlX18oc3RhdGUpLgotCSAqLwotCWlmIChzZWxmLT5zdGFjay0+bGVuZ3RoIDwgMikKLQkJcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7Ci0JUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBzdGF0ZSk7Ci0JaWYgKHN0YXRlID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpbnN0ID0gc2VsZi0+c3RhY2stPmRhdGFbc2VsZi0+c3RhY2stPmxlbmd0aCAtIDFdOworICAgIC8qIFN0YWNrIGlzIC4uLiBpbnN0YW5jZSwgc3RhdGUuICBXZSB3YW50IHRvIGxlYXZlIGluc3RhbmNlIGF0CisgICAgICogdGhlIHN0YWNrIHRvcCwgcG9zc2libHkgbXV0YXRlZCB2aWEgaW5zdGFuY2UuX19zZXRzdGF0ZV9fKHN0YXRlKS4KKyAgICAgKi8KKyAgICBpZiAoc2VsZi0+c3RhY2stPmxlbmd0aCA8IDIpCisgICAgICAgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOworICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgc3RhdGUpOworICAgIGlmIChzdGF0ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5zdCA9IHNlbGYtPnN0YWNrLT5kYXRhW3NlbGYtPnN0YWNrLT5sZW5ndGggLSAxXTsKIAotCV9fc2V0c3RhdGVfXyA9IFB5T2JqZWN0X0dldEF0dHIoaW5zdCwgX19zZXRzdGF0ZV9fX3N0cik7Ci0JaWYgKF9fc2V0c3RhdGVfXyAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpqdW5rID0gTlVMTDsKKyAgICBfX3NldHN0YXRlX18gPSBQeU9iamVjdF9HZXRBdHRyKGluc3QsIF9fc2V0c3RhdGVfX19zdHIpOworICAgIGlmIChfX3NldHN0YXRlX18gIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqanVuayA9IE5VTEw7CiAKLQkJLyogVGhlIGV4cGxpY2l0IF9fc2V0c3RhdGVfXyBpcyByZXNwb25zaWJsZSBmb3IgZXZlcnl0aGluZy4gKi8KLQkJQVJHX1RVUChzZWxmLCBzdGF0ZSk7Ci0JCWlmIChzZWxmLT5hcmcpIHsKLQkJCWp1bmsgPSBQeU9iamVjdF9DYWxsKF9fc2V0c3RhdGVfXywgc2VsZi0+YXJnLCBOVUxMKTsKLQkJCUZSRUVfQVJHX1RVUChzZWxmKTsKLQkJfQotCQlQeV9ERUNSRUYoX19zZXRzdGF0ZV9fKTsKLQkJaWYgKGp1bmsgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGp1bmspOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJcmV0dXJuIC0xOwotCVB5RXJyX0NsZWFyKCk7CisgICAgICAgIC8qIFRoZSBleHBsaWNpdCBfX3NldHN0YXRlX18gaXMgcmVzcG9uc2libGUgZm9yIGV2ZXJ5dGhpbmcuICovCisgICAgICAgIEFSR19UVVAoc2VsZiwgc3RhdGUpOworICAgICAgICBpZiAoc2VsZi0+YXJnKSB7CisgICAgICAgICAgICBqdW5rID0gUHlPYmplY3RfQ2FsbChfX3NldHN0YXRlX18sIHNlbGYtPmFyZywgTlVMTCk7CisgICAgICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKF9fc2V0c3RhdGVfXyk7CisgICAgICAgIGlmIChqdW5rID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihqdW5rKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeUVycl9DbGVhcigpOwogCi0JLyogQSBkZWZhdWx0IF9fc2V0c3RhdGVfXy4gIEZpcnN0IHNlZSB3aGV0aGVyIHN0YXRlIGVtYmVkcyBhCi0JICogc2xvdCBzdGF0ZSBkaWN0IHRvbyAoYSBwcm90byAyIGFkZGl0aW9uKS4KLQkgKi8KLQlpZiAoUHlUdXBsZV9DaGVjayhzdGF0ZSkgJiYgUHlUdXBsZV9TaXplKHN0YXRlKSA9PSAyKSB7Ci0JCVB5T2JqZWN0ICp0ZW1wID0gc3RhdGU7Ci0JCXN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTSh0ZW1wLCAwKTsKLQkJc2xvdHN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTSh0ZW1wLCAxKTsKLQkJUHlfSU5DUkVGKHN0YXRlKTsKLQkJUHlfSU5DUkVGKHNsb3RzdGF0ZSk7Ci0JCVB5X0RFQ1JFRih0ZW1wKTsKLQl9Ci0JZWxzZQotCQlzbG90c3RhdGUgPSBOVUxMOworICAgIC8qIEEgZGVmYXVsdCBfX3NldHN0YXRlX18uICBGaXJzdCBzZWUgd2hldGhlciBzdGF0ZSBlbWJlZHMgYQorICAgICAqIHNsb3Qgc3RhdGUgZGljdCB0b28gKGEgcHJvdG8gMiBhZGRpdGlvbikuCisgICAgICovCisgICAgaWYgKFB5VHVwbGVfQ2hlY2soc3RhdGUpICYmIFB5VHVwbGVfU2l6ZShzdGF0ZSkgPT0gMikgeworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IHN0YXRlOworICAgICAgICBzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0odGVtcCwgMCk7CisgICAgICAgIHNsb3RzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0odGVtcCwgMSk7CisgICAgICAgIFB5X0lOQ1JFRihzdGF0ZSk7CisgICAgICAgIFB5X0lOQ1JFRihzbG90c3RhdGUpOworICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc2xvdHN0YXRlID0gTlVMTDsKIAotCS8qIFNldCBpbnN0Ll9fZGljdF9fIGZyb20gdGhlIHN0YXRlIGRpY3QgKGlmIGFueSkuICovCi0JaWYgKHN0YXRlICE9IFB5X05vbmUpIHsKLQkJUHlPYmplY3QgKmRpY3Q7Ci0JCWlmICghIFB5RGljdF9DaGVjayhzdGF0ZSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJzdGF0ZSBpcyBub3QgYSAiCi0JCQkJCSJkaWN0aW9uYXJ5Iik7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJZGljdCA9IFB5T2JqZWN0X0dldEF0dHIoaW5zdCwgX19kaWN0X19fc3RyKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkKLQkJCWdvdG8gZmluYWxseTsKKyAgICAvKiBTZXQgaW5zdC5fX2RpY3RfXyBmcm9tIHRoZSBzdGF0ZSBkaWN0IChpZiBhbnkpLiAqLworICAgIGlmIChzdGF0ZSAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5T2JqZWN0ICpkaWN0OworICAgICAgICBpZiAoISBQeURpY3RfQ2hlY2soc3RhdGUpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAic3RhdGUgaXMgbm90IGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5Iik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgZGljdCA9IFB5T2JqZWN0X0dldEF0dHIoaW5zdCwgX19kaWN0X19fc3RyKTsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQlpID0gMDsKLQkJd2hpbGUgKFB5RGljdF9OZXh0KHN0YXRlLCAmaSwgJmRfa2V5LCAmZF92YWx1ZSkpIHsKLQkJCS8qIG5vcm1hbGx5IHRoZSBrZXlzIGZvciBpbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZQotCQkJICAgaW50ZXJuZWQuICB3ZSBzaG91bGQgdHJ5IHRvIGRvIHRoYXQgaGVyZS4gKi8KLQkJCVB5X0lOQ1JFRihkX2tleSk7Ci0JCQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChkX2tleSkpCi0JCQkJUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmZF9rZXkpOwotCQkJaWYgKFB5T2JqZWN0X1NldEl0ZW0oZGljdCwgZF9rZXksIGRfdmFsdWUpIDwgMCkgewotCQkJCVB5X0RFQ1JFRihkX2tleSk7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQotCQkJUHlfREVDUkVGKGRfa2V5KTsKLQkJfQotCQlQeV9ERUNSRUYoZGljdCk7Ci0JfQorICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KHN0YXRlLCAmaSwgJmRfa2V5LCAmZF92YWx1ZSkpIHsKKyAgICAgICAgICAgIC8qIG5vcm1hbGx5IHRoZSBrZXlzIGZvciBpbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZQorICAgICAgICAgICAgICAgaW50ZXJuZWQuICB3ZSBzaG91bGQgdHJ5IHRvIGRvIHRoYXQgaGVyZS4gKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihkX2tleSk7CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChkX2tleSkpCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmZF9rZXkpOworICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEl0ZW0oZGljdCwgZF9rZXksIGRfdmFsdWUpIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkX2tleSk7CisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGRfa2V5KTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgfQogCi0JLyogQWxzbyBzZXQgaW5zdGFuY2UgYXR0cmlidXRlcyBmcm9tIHRoZSBzbG90c3RhdGUgZGljdCAoaWYgYW55KS4gKi8KLQlpZiAoc2xvdHN0YXRlICE9IE5VTEwpIHsKLQkJaWYgKCEgUHlEaWN0X0NoZWNrKHNsb3RzdGF0ZSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJzbG90IHN0YXRlIGlzIG5vdCAiCi0JCQkJCSJhIGRpY3Rpb25hcnkiKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlpID0gMDsKLQkJd2hpbGUgKFB5RGljdF9OZXh0KHNsb3RzdGF0ZSwgJmksICZkX2tleSwgJmRfdmFsdWUpKSB7Ci0JCQlpZiAoUHlPYmplY3RfU2V0QXR0cihpbnN0LCBkX2tleSwgZF92YWx1ZSkgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KLQlyZXMgPSAwOworICAgIC8qIEFsc28gc2V0IGluc3RhbmNlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2xvdHN0YXRlIGRpY3QgKGlmIGFueSkuICovCisgICAgaWYgKHNsb3RzdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghIFB5RGljdF9DaGVjayhzbG90c3RhdGUpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAic2xvdCBzdGF0ZSBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KHNsb3RzdGF0ZSwgJmksICZkX2tleSwgJmRfdmFsdWUpKSB7CisgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0cihpbnN0LCBkX2tleSwgZF92YWx1ZSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXMgPSAwOwogCiAgIGZpbmFsbHk6Ci0JUHlfREVDUkVGKHN0YXRlKTsKLQlQeV9YREVDUkVGKHNsb3RzdGF0ZSk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9ERUNSRUYoc3RhdGUpOworICAgIFB5X1hERUNSRUYoc2xvdHN0YXRlKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfbWFyayhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JaW50IHM7CisgICAgaW50IHM7CiAKLQkvKiBOb3RlIHRoYXQgd2Ugc3BsaXQgdGhlIChwaWNrbGUucHkpIHN0YWNrIGludG8gdHdvIHN0YWNrcywgYW4KLQkgICBvYmplY3Qgc3RhY2sgYW5kIGEgbWFyayBzdGFjay4gSGVyZSB3ZSBwdXNoIGEgbWFyayBvbnRvIHRoZQotCSAgIG1hcmsgc3RhY2suCi0JKi8KKyAgICAvKiBOb3RlIHRoYXQgd2Ugc3BsaXQgdGhlIChwaWNrbGUucHkpIHN0YWNrIGludG8gdHdvIHN0YWNrcywgYW4KKyAgICAgICBvYmplY3Qgc3RhY2sgYW5kIGEgbWFyayBzdGFjay4gSGVyZSB3ZSBwdXNoIGEgbWFyayBvbnRvIHRoZQorICAgICAgIG1hcmsgc3RhY2suCisgICAgKi8KIAotCWlmICgoc2VsZi0+bnVtX21hcmtzICsgMSkgPj0gc2VsZi0+bWFya3Nfc2l6ZSkgewotCQlpbnQgKm1hcmtzOwotCQlzPXNlbGYtPm1hcmtzX3NpemUrMjA7Ci0JCWlmIChzIDw9IHNlbGYtPm51bV9tYXJrcykgcz1zZWxmLT5udW1fbWFya3MgKyAxOwotCQlpZiAoc2VsZi0+bWFya3MgPT0gTlVMTCkKLQkJCW1hcmtzPShpbnQgKiltYWxsb2MocyAqIHNpemVvZihpbnQpKTsKLQkJZWxzZQotCQkJbWFya3M9KGludCAqKXJlYWxsb2Moc2VsZi0+bWFya3MsCi0JCQkJCQkgICBzICogc2l6ZW9mKGludCkpOwotCQlpZiAoIW1hcmtzKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXNlbGYtPm1hcmtzID0gbWFya3M7Ci0JCXNlbGYtPm1hcmtzX3NpemUgPSBzOwotCX0KKyAgICBpZiAoKHNlbGYtPm51bV9tYXJrcyArIDEpID49IHNlbGYtPm1hcmtzX3NpemUpIHsKKyAgICAgICAgaW50ICptYXJrczsKKyAgICAgICAgcz1zZWxmLT5tYXJrc19zaXplKzIwOworICAgICAgICBpZiAocyA8PSBzZWxmLT5udW1fbWFya3MpIHM9c2VsZi0+bnVtX21hcmtzICsgMTsKKyAgICAgICAgaWYgKHNlbGYtPm1hcmtzID09IE5VTEwpCisgICAgICAgICAgICBtYXJrcz0oaW50ICopbWFsbG9jKHMgKiBzaXplb2YoaW50KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1hcmtzPShpbnQgKilyZWFsbG9jKHNlbGYtPm1hcmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgaWYgKCFtYXJrcykgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5tYXJrcyA9IG1hcmtzOworICAgICAgICBzZWxmLT5tYXJrc19zaXplID0gczsKKyAgICB9CiAKLQlzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MrK10gPSBzZWxmLT5zdGFjay0+bGVuZ3RoOworICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcysrXSA9IHNlbGYtPnN0YWNrLT5sZW5ndGg7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbG9hZF9yZWR1Y2UoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpjYWxsYWJsZSA9IDAsICphcmdfdHVwID0gMCwgKm9iID0gMDsKKyAgICBQeU9iamVjdCAqY2FsbGFibGUgPSAwLCAqYXJnX3R1cCA9IDAsICpvYiA9IDA7CiAKLQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGFyZ190dXApOwotCWlmICghIGFyZ190dXApIHJldHVybiAtMTsKLQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGNhbGxhYmxlKTsKLQlpZiAoY2FsbGFibGUpIHsKLQkJb2IgPSBJbnN0YW5jZV9OZXcoY2FsbGFibGUsIGFyZ190dXApOwotCQlQeV9ERUNSRUYoY2FsbGFibGUpOwotCX0KLQlQeV9ERUNSRUYoYXJnX3R1cCk7CisgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBhcmdfdHVwKTsKKyAgICBpZiAoISBhcmdfdHVwKSByZXR1cm4gLTE7CisgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBjYWxsYWJsZSk7CisgICAgaWYgKGNhbGxhYmxlKSB7CisgICAgICAgIG9iID0gSW5zdGFuY2VfTmV3KGNhbGxhYmxlLCBhcmdfdHVwKTsKKyAgICAgICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGFyZ190dXApOwogCi0JaWYgKCEgb2IpIHJldHVybiAtMTsKKyAgICBpZiAoISBvYikgcmV0dXJuIC0xOwogCi0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgb2IsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYiwgLTEpOworICAgIHJldHVybiAwOwogfQogCiAvKiBKdXN0IHJhaXNlcyBhbiBlcnJvciBpZiB3ZSBkb24ndCBrbm93IHRoZSBwcm90b2NvbCBzcGVjaWZpZWQuICBQUk9UTwpAQCAtNDY1MSwzMjcgKzQ2NTEsMzI3IEBACiBzdGF0aWMgaW50CiBsb2FkX3Byb3RvKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlpbnQgaTsKLQljaGFyICpwcm90b2J5dGU7CisgICAgaW50IGk7CisgICAgY2hhciAqcHJvdG9ieXRlOwogCi0JaSA9IHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcHJvdG9ieXRlLCAxKTsKLQlpZiAoaSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpID0gc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZwcm90b2J5dGUsIDEpOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaSA9IGNhbGNfYmluaW50KHByb3RvYnl0ZSwgMSk7Ci0JLyogTm8gcG9pbnQgY2hlY2tpbmcgZm9yIDwgMCwgc2luY2UgY2FsY19iaW5pbnQgcmV0dXJucyBhbiB1bnNpZ25lZAotCSAqIGludCB3aGVuIGNoZXdpbmcgb24gMSBieXRlLgotCSAqLwotCWFzc2VydChpID49IDApOwotCWlmIChpIDw9IEhJR0hFU1RfUFJPVE9DT0wpCi0JCXJldHVybiAwOworICAgIGkgPSBjYWxjX2JpbmludChwcm90b2J5dGUsIDEpOworICAgIC8qIE5vIHBvaW50IGNoZWNraW5nIGZvciA8IDAsIHNpbmNlIGNhbGNfYmluaW50IHJldHVybnMgYW4gdW5zaWduZWQKKyAgICAgKiBpbnQgd2hlbiBjaGV3aW5nIG9uIDEgYnl0ZS4KKyAgICAgKi8KKyAgICBhc3NlcnQoaSA+PSAwKTsKKyAgICBpZiAoaSA8PSBISUdIRVNUX1BST1RPQ09MKQorICAgICAgICByZXR1cm4gMDsKIAotCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAidW5zdXBwb3J0ZWQgcGlja2xlIHByb3RvY29sOiAlZCIsIGkpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgInVuc3VwcG9ydGVkIHBpY2tsZSBwcm90b2NvbDogJWQiLCBpKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZXJyID0gMCwgKnZhbCA9IDA7Ci0JY2hhciAqczsKKyAgICBQeU9iamVjdCAqZXJyID0gMCwgKnZhbCA9IDA7CisgICAgY2hhciAqczsKIAotCXNlbGYtPm51bV9tYXJrcyA9IDA7Ci0JaWYgKHNlbGYtPnN0YWNrLT5sZW5ndGgpIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCAwKTsKKyAgICBzZWxmLT5udW1fbWFya3MgPSAwOworICAgIGlmIChzZWxmLT5zdGFjay0+bGVuZ3RoKSBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgMCk7CiAKLQl3aGlsZSAoMSkgewotCQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCi0JCQlicmVhazsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCisgICAgICAgICAgICBicmVhazsKIAotCQlzd2l0Y2ggKHNbMF0pIHsKLQkJY2FzZSBOT05FOgotCQkJaWYgKGxvYWRfbm9uZShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgc3dpdGNoIChzWzBdKSB7CisgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgIGlmIChsb2FkX25vbmUoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5JTlQ6Ci0JCQlpZiAobG9hZF9iaW5pbnQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOSU5UOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluaW50KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOSU5UMToKLQkJCWlmIChsb2FkX2JpbmludDEoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOSU5UMToKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbmludDEoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5JTlQyOgotCQkJaWYgKGxvYWRfYmluaW50MihzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5JTlQyOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluaW50MihzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIElOVDoKLQkJCWlmIChsb2FkX2ludChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICBpZiAobG9hZF9pbnQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMT05HOgotCQkJaWYgKGxvYWRfbG9uZyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT05HOgorICAgICAgICAgICAgaWYgKGxvYWRfbG9uZyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExPTkcxOgotCQkJaWYgKGxvYWRfY291bnRlZF9sb25nKHNlbGYsIDEpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPTkcxOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF9sb25nKHNlbGYsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTE9ORzQ6Ci0JCQlpZiAobG9hZF9jb3VudGVkX2xvbmcoc2VsZiwgNCkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9ORzQ6CisgICAgICAgICAgICBpZiAobG9hZF9jb3VudGVkX2xvbmcoc2VsZiwgNCkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBGTE9BVDoKLQkJCWlmIChsb2FkX2Zsb2F0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgaWYgKGxvYWRfZmxvYXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5GTE9BVDoKLQkJCWlmIChsb2FkX2JpbmZsb2F0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTkZMT0FUOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluZmxvYXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5TVFJJTkc6Ci0JCQlpZiAobG9hZF9iaW5zdHJpbmcoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOU1RSSU5HOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluc3RyaW5nKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU0hPUlRfQklOU1RSSU5HOgotCQkJaWYgKGxvYWRfc2hvcnRfYmluc3RyaW5nKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFNIT1JUX0JJTlNUUklORzoKKyAgICAgICAgICAgIGlmIChsb2FkX3Nob3J0X2JpbnN0cmluZyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFNUUklORzoKLQkJCWlmIChsb2FkX3N0cmluZyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBTVFJJTkc6CisgICAgICAgICAgICBpZiAobG9hZF9zdHJpbmcoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWNhc2UgVU5JQ09ERToKLQkJCWlmIChsb2FkX3VuaWNvZGUoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVU5JQ09ERToKKyAgICAgICAgICAgIGlmIChsb2FkX3VuaWNvZGUoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5VTklDT0RFOgotCQkJaWYgKGxvYWRfYmludW5pY29kZShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5VTklDT0RFOgorICAgICAgICAgICAgaWYgKGxvYWRfYmludW5pY29kZShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKICNlbmRpZgogCi0JCWNhc2UgRU1QVFlfVFVQTEU6Ci0JCQlpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDApIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVNUFRZX1RVUExFOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAwKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFMToKLQkJCWlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMSkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEUxOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAxKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFMjoKLQkJCWlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEUyOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAyKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFMzoKLQkJCWlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMykgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEUzOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAzKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFOgotCQkJaWYgKGxvYWRfdHVwbGUoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEU6CisgICAgICAgICAgICBpZiAobG9hZF90dXBsZShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEVNUFRZX0xJU1Q6Ci0JCQlpZiAobG9hZF9lbXB0eV9saXN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVNUFRZX0xJU1Q6CisgICAgICAgICAgICBpZiAobG9hZF9lbXB0eV9saXN0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTElTVDoKLQkJCWlmIChsb2FkX2xpc3Qoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTElTVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2xpc3Qoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBFTVBUWV9ESUNUOgotCQkJaWYgKGxvYWRfZW1wdHlfZGljdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFTVBUWV9ESUNUOgorICAgICAgICAgICAgaWYgKGxvYWRfZW1wdHlfZGljdChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIERJQ1Q6Ci0JCQlpZiAobG9hZF9kaWN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIERJQ1Q6CisgICAgICAgICAgICBpZiAobG9hZF9kaWN0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgT0JKOgotCQkJaWYgKGxvYWRfb2JqKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIE9CSjoKKyAgICAgICAgICAgIGlmIChsb2FkX29iaihzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIElOU1Q6Ci0JCQlpZiAobG9hZF9pbnN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIElOU1Q6CisgICAgICAgICAgICBpZiAobG9hZF9pbnN0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTkVXT0JKOgotCQkJaWYgKGxvYWRfbmV3b2JqKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIE5FV09CSjoKKyAgICAgICAgICAgIGlmIChsb2FkX25ld29iaihzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEdMT0JBTDoKLQkJCWlmIChsb2FkX2dsb2JhbChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBHTE9CQUw6CisgICAgICAgICAgICBpZiAobG9hZF9nbG9iYWwoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBBUFBFTkQ6Ci0JCQlpZiAobG9hZF9hcHBlbmQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQVBQRU5EOgorICAgICAgICAgICAgaWYgKGxvYWRfYXBwZW5kKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQVBQRU5EUzoKLQkJCWlmIChsb2FkX2FwcGVuZHMoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQVBQRU5EUzoKKyAgICAgICAgICAgIGlmIChsb2FkX2FwcGVuZHMoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCVUlMRDoKLQkJCWlmIChsb2FkX2J1aWxkKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJVSUxEOgorICAgICAgICAgICAgaWYgKGxvYWRfYnVpbGQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBEVVA6Ci0JCQlpZiAobG9hZF9kdXAoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRFVQOgorICAgICAgICAgICAgaWYgKGxvYWRfZHVwKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOR0VUOgotCQkJaWYgKGxvYWRfYmluZ2V0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTkdFVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbmdldChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExPTkdfQklOR0VUOgotCQkJaWYgKGxvYWRfbG9uZ19iaW5nZXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9OR19CSU5HRVQ6CisgICAgICAgICAgICBpZiAobG9hZF9sb25nX2JpbmdldChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEdFVDoKLQkJCWlmIChsb2FkX2dldChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBHRVQ6CisgICAgICAgICAgICBpZiAobG9hZF9nZXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBFWFQxOgotCQkJaWYgKGxvYWRfZXh0ZW5zaW9uKHNlbGYsIDEpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVYVDE6CisgICAgICAgICAgICBpZiAobG9hZF9leHRlbnNpb24oc2VsZiwgMSkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBFWFQyOgotCQkJaWYgKGxvYWRfZXh0ZW5zaW9uKHNlbGYsIDIpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVYVDI6CisgICAgICAgICAgICBpZiAobG9hZF9leHRlbnNpb24oc2VsZiwgMikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBFWFQ0OgotCQkJaWYgKGxvYWRfZXh0ZW5zaW9uKHNlbGYsIDQpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOwotCQljYXNlIE1BUks6Ci0JCQlpZiAobG9hZF9tYXJrKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVYVDQ6CisgICAgICAgICAgICBpZiAobG9hZF9leHRlbnNpb24oc2VsZiwgNCkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgTUFSSzoKKyAgICAgICAgICAgIGlmIChsb2FkX21hcmsoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5QVVQ6Ci0JCQlpZiAobG9hZF9iaW5wdXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOUFVUOgorICAgICAgICAgICAgaWYgKGxvYWRfYmlucHV0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTE9OR19CSU5QVVQ6Ci0JCQlpZiAobG9hZF9sb25nX2JpbnB1dChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT05HX0JJTlBVVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2xvbmdfYmlucHV0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgUFVUOgotCQkJaWYgKGxvYWRfcHV0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBVVDoKKyAgICAgICAgICAgIGlmIChsb2FkX3B1dChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFBPUDoKLQkJCWlmIChsb2FkX3BvcChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBQT1A6CisgICAgICAgICAgICBpZiAobG9hZF9wb3Aoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBQT1BfTUFSSzoKLQkJCWlmIChsb2FkX3BvcF9tYXJrKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBPUF9NQVJLOgorICAgICAgICAgICAgaWYgKGxvYWRfcG9wX21hcmsoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBTRVRJVEVNOgotCQkJaWYgKGxvYWRfc2V0aXRlbShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBTRVRJVEVNOgorICAgICAgICAgICAgaWYgKGxvYWRfc2V0aXRlbShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFNFVElURU1TOgotCQkJaWYgKGxvYWRfc2V0aXRlbXMoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgU0VUSVRFTVM6CisgICAgICAgICAgICBpZiAobG9hZF9zZXRpdGVtcyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFNUT1A6Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBTVE9QOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQRVJTSUQ6Ci0JCQlpZiAobG9hZF9wZXJzaWQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUEVSU0lEOgorICAgICAgICAgICAgaWYgKGxvYWRfcGVyc2lkKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOUEVSU0lEOgotCQkJaWYgKGxvYWRfYmlucGVyc2lkKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTlBFUlNJRDoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbnBlcnNpZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFJFRFVDRToKLQkJCWlmIChsb2FkX3JlZHVjZShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBSRURVQ0U6CisgICAgICAgICAgICBpZiAobG9hZF9yZWR1Y2Uoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBQUk9UTzoKLQkJCWlmIChsb2FkX3Byb3RvKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBST1RPOgorICAgICAgICAgICAgaWYgKGxvYWRfcHJvdG8oc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBORVdUUlVFOgotCQkJaWYgKGxvYWRfYm9vbChzZWxmLCBQeV9UcnVlKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBORVdUUlVFOgorICAgICAgICAgICAgaWYgKGxvYWRfYm9vbChzZWxmLCBQeV9UcnVlKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIE5FV0ZBTFNFOgotCQkJaWYgKGxvYWRfYm9vbChzZWxmLCBQeV9GYWxzZSkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTkVXRkFMU0U6CisgICAgICAgICAgICBpZiAobG9hZF9ib29sKHNlbGYsIFB5X0ZhbHNlKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlICdcMCc6Ci0JCQkvKiBlbmQgb2YgZmlsZSAqLwotCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgLyogZW5kIG9mIGZpbGUgKi8KKyAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCWNQaWNrbGVfRXJyRm9ybWF0KFVucGlja2xpbmdFcnJvciwKLQkJCQkJICAiaW52YWxpZCBsb2FkIGtleSwgJyVzJy4iLAotCQkJCQkgICJjIiwgc1swXSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoVW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbG9hZCBrZXksICclcycuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjIiwgc1swXSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCWJyZWFrOwotCX0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JaWYgKChlcnIgPSBQeUVycl9PY2N1cnJlZCgpKSkgewotCQlpZiAoZXJyID09IFB5RXhjX0VPRkVycm9yKSB7Ci0JCQlQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChlcnIgPSBQeUVycl9PY2N1cnJlZCgpKSkgeworICAgICAgICBpZiAoZXJyID09IFB5RXhjX0VPRkVycm9yKSB7CisgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHZhbCk7Ci0JcmV0dXJuIHZhbDsKKyAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHZhbCk7CisgICAgcmV0dXJuIHZhbDsKIH0KIAogCkBAIC00OTgxLDYzICs0OTgxLDYzIEBACiBzdGF0aWMgaW50CiBub2xvYWRfb2JqKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAotCWlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7Ci0JcmV0dXJuIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKzEpOworICAgIGlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKzEpOwogfQogCiAKIHN0YXRpYyBpbnQKIG5vbG9hZF9pbnN0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlpbnQgaTsKLQljaGFyICpzOworICAgIGludCBpOworICAgIGNoYXIgKnM7CiAKLQlpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwotCVBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKTsKLQlpZiAoc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpIDwgMCkgcmV0dXJuIC0xOwotCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwgLTEpOwotCXJldHVybiAwOworICAgIGlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7CisgICAgUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIGkpOworICAgIGlmIChzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykgPCAwKSByZXR1cm4gLTE7CisgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5vbG9hZF9uZXdvYmooVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpvYmo7CisgICAgUHlPYmplY3QgKm9iajsKIAotCVBEQVRBX1BPUChzZWxmLT5zdGFjaywgb2JqKTsJLyogcG9wIGFyZ3R1cGxlICovCi0JaWYgKG9iaiA9PSBOVUxMKSByZXR1cm4gLTE7Ci0JUHlfREVDUkVGKG9iaik7CisgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBvYmopOyAgICAgICAgLyogcG9wIGFyZ3R1cGxlICovCisgICAgaWYgKG9iaiA9PSBOVUxMKSByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKG9iaik7CiAKLQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIG9iaik7CS8qIHBvcCBjbHMgKi8KLQlpZiAob2JqID09IE5VTEwpIHJldHVybiAtMTsKLQlQeV9ERUNSRUYob2JqKTsKKyAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIG9iaik7ICAgICAgICAvKiBwb3AgY2xzICovCisgICAgaWYgKG9iaiA9PSBOVUxMKSByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKG9iaik7CiAKLQlQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsIC0xKTsKLSAJcmV0dXJuIDA7CisgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5vbG9hZF9nbG9iYWwoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWNoYXIgKnM7CisgICAgY2hhciAqczsKIAotCWlmIChzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSA8IDApIHJldHVybiAtMTsKLQlpZiAoc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykgPCAwKSByZXR1cm4gLTE7Ci0JUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLC0xKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpIDwgMCkgcmV0dXJuIC0xOworICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5vbG9hZF9yZWR1Y2UoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewogCi0JaWYgKHNlbGYtPnN0YWNrLT5sZW5ndGggPCAyKSByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKLQlQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgc2VsZi0+c3RhY2stPmxlbmd0aC0yKTsKLQlQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsLTEpOwotCXJldHVybiAwOworICAgIGlmIChzZWxmLT5zdGFjay0+bGVuZ3RoIDwgMikgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIHNlbGYtPnN0YWNrLT5sZW5ndGgtMik7CisgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludApAQCAtNTA1MSwzNTIgKzUwNTEsMzUyIEBACiBzdGF0aWMgaW50CiBub2xvYWRfZXh0ZW5zaW9uKFVucGlja2xlcm9iamVjdCAqc2VsZiwgaW50IG5ieXRlcykKIHsKLQljaGFyICpjb2RlYnl0ZXM7CisgICAgY2hhciAqY29kZWJ5dGVzOwogCi0JYXNzZXJ0KG5ieXRlcyA9PSAxIHx8IG5ieXRlcyA9PSAyIHx8IG5ieXRlcyA9PSA0KTsKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZjb2RlYnl0ZXMsIG5ieXRlcykgPCAwKSByZXR1cm4gLTE7Ci0JUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgYXNzZXJ0KG5ieXRlcyA9PSAxIHx8IG5ieXRlcyA9PSAyIHx8IG5ieXRlcyA9PSA0KTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZjb2RlYnl0ZXMsIG5ieXRlcykgPCAwKSByZXR1cm4gLTE7CisgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5vbG9hZF9hcHBlbmQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgc2VsZi0+c3RhY2stPmxlbmd0aCAtIDEpOworICAgIHJldHVybiBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgc2VsZi0+c3RhY2stPmxlbmd0aCAtIDEpOwogfQogCiBzdGF0aWMgaW50CiBub2xvYWRfYXBwZW5kcyhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JaW50IGk7Ci0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKLQlyZXR1cm4gUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIGkpOworICAgIGludCBpOworICAgIGlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKTsKIH0KIAogc3RhdGljIGludAogbm9sb2FkX3NldGl0ZW0oVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgc2VsZi0+c3RhY2stPmxlbmd0aCAtIDIpOworICAgIHJldHVybiBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgc2VsZi0+c3RhY2stPmxlbmd0aCAtIDIpOwogfQogCiBzdGF0aWMgaW50CiBub2xvYWRfc2V0aXRlbXMoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWludCBpOwotCWlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7Ci0JcmV0dXJuIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKTsKKyAgICBpbnQgaTsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOworICAgIHJldHVybiBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgaSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBub2xvYWQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICplcnIgPSAwLCAqdmFsID0gMDsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICplcnIgPSAwLCAqdmFsID0gMDsKKyAgICBjaGFyICpzOwogCi0Jc2VsZi0+bnVtX21hcmtzID0gMDsKLQlQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgMCk7CisgICAgc2VsZi0+bnVtX21hcmtzID0gMDsKKyAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgMCk7CiAKLQl3aGlsZSAoMSkgewotCQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCi0JCQlicmVhazsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCisgICAgICAgICAgICBicmVhazsKIAotCQlzd2l0Y2ggKHNbMF0pIHsKLQkJY2FzZSBOT05FOgotCQkJaWYgKGxvYWRfbm9uZShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgc3dpdGNoIChzWzBdKSB7CisgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgIGlmIChsb2FkX25vbmUoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5JTlQ6Ci0JCQlpZiAobG9hZF9iaW5pbnQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOSU5UOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluaW50KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOSU5UMToKLQkJCWlmIChsb2FkX2JpbmludDEoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOSU5UMToKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbmludDEoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5JTlQyOgotCQkJaWYgKGxvYWRfYmluaW50MihzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5JTlQyOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluaW50MihzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIElOVDoKLQkJCWlmIChsb2FkX2ludChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICBpZiAobG9hZF9pbnQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMT05HOgotCQkJaWYgKGxvYWRfbG9uZyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT05HOgorICAgICAgICAgICAgaWYgKGxvYWRfbG9uZyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExPTkcxOgotCQkJaWYgKGxvYWRfY291bnRlZF9sb25nKHNlbGYsIDEpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPTkcxOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF9sb25nKHNlbGYsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTE9ORzQ6Ci0JCQlpZiAobG9hZF9jb3VudGVkX2xvbmcoc2VsZiwgNCkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9ORzQ6CisgICAgICAgICAgICBpZiAobG9hZF9jb3VudGVkX2xvbmcoc2VsZiwgNCkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBGTE9BVDoKLQkJCWlmIChsb2FkX2Zsb2F0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgaWYgKGxvYWRfZmxvYXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5GTE9BVDoKLQkJCWlmIChsb2FkX2JpbmZsb2F0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTkZMT0FUOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluZmxvYXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5TVFJJTkc6Ci0JCQlpZiAobG9hZF9iaW5zdHJpbmcoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOU1RSSU5HOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluc3RyaW5nKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU0hPUlRfQklOU1RSSU5HOgotCQkJaWYgKGxvYWRfc2hvcnRfYmluc3RyaW5nKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFNIT1JUX0JJTlNUUklORzoKKyAgICAgICAgICAgIGlmIChsb2FkX3Nob3J0X2JpbnN0cmluZyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFNUUklORzoKLQkJCWlmIChsb2FkX3N0cmluZyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBTVFJJTkc6CisgICAgICAgICAgICBpZiAobG9hZF9zdHJpbmcoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWNhc2UgVU5JQ09ERToKLQkJCWlmIChsb2FkX3VuaWNvZGUoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVU5JQ09ERToKKyAgICAgICAgICAgIGlmIChsb2FkX3VuaWNvZGUoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5VTklDT0RFOgotCQkJaWYgKGxvYWRfYmludW5pY29kZShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5VTklDT0RFOgorICAgICAgICAgICAgaWYgKGxvYWRfYmludW5pY29kZShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKICNlbmRpZgogCi0JCWNhc2UgRU1QVFlfVFVQTEU6Ci0JCQlpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDApIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVNUFRZX1RVUExFOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAwKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFMToKLQkJCWlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMSkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEUxOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAxKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFMjoKLQkJCWlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEUyOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAyKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFMzoKLQkJCWlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMykgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEUzOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAzKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFOgotCQkJaWYgKGxvYWRfdHVwbGUoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEU6CisgICAgICAgICAgICBpZiAobG9hZF90dXBsZShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEVNUFRZX0xJU1Q6Ci0JCQlpZiAobG9hZF9lbXB0eV9saXN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVNUFRZX0xJU1Q6CisgICAgICAgICAgICBpZiAobG9hZF9lbXB0eV9saXN0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTElTVDoKLQkJCWlmIChsb2FkX2xpc3Qoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTElTVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2xpc3Qoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBFTVBUWV9ESUNUOgotCQkJaWYgKGxvYWRfZW1wdHlfZGljdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFTVBUWV9ESUNUOgorICAgICAgICAgICAgaWYgKGxvYWRfZW1wdHlfZGljdChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIERJQ1Q6Ci0JCQlpZiAobG9hZF9kaWN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIERJQ1Q6CisgICAgICAgICAgICBpZiAobG9hZF9kaWN0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgT0JKOgotCQkJaWYgKG5vbG9hZF9vYmooc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgT0JKOgorICAgICAgICAgICAgaWYgKG5vbG9hZF9vYmooc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBJTlNUOgotCQkJaWYgKG5vbG9hZF9pbnN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIElOU1Q6CisgICAgICAgICAgICBpZiAobm9sb2FkX2luc3Qoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBORVdPQko6Ci0JCQlpZiAobm9sb2FkX25ld29iaihzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBORVdPQko6CisgICAgICAgICAgICBpZiAobm9sb2FkX25ld29iaihzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEdMT0JBTDoKLQkJCWlmIChub2xvYWRfZ2xvYmFsKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEdMT0JBTDoKKyAgICAgICAgICAgIGlmIChub2xvYWRfZ2xvYmFsKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQVBQRU5EOgotCQkJaWYgKG5vbG9hZF9hcHBlbmQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQVBQRU5EOgorICAgICAgICAgICAgaWYgKG5vbG9hZF9hcHBlbmQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBBUFBFTkRTOgotCQkJaWYgKG5vbG9hZF9hcHBlbmRzKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEFQUEVORFM6CisgICAgICAgICAgICBpZiAobm9sb2FkX2FwcGVuZHMoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCVUlMRDoKLQkJCWlmIChub2xvYWRfYnVpbGQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQlVJTEQ6CisgICAgICAgICAgICBpZiAobm9sb2FkX2J1aWxkKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRFVQOgotCQkJaWYgKGxvYWRfZHVwKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIERVUDoKKyAgICAgICAgICAgIGlmIChsb2FkX2R1cChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTkdFVDoKLQkJCWlmIChsb2FkX2JpbmdldChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5HRVQ6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5nZXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMT05HX0JJTkdFVDoKLQkJCWlmIChsb2FkX2xvbmdfYmluZ2V0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPTkdfQklOR0VUOgorICAgICAgICAgICAgaWYgKGxvYWRfbG9uZ19iaW5nZXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBHRVQ6Ci0JCQlpZiAobG9hZF9nZXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgR0VUOgorICAgICAgICAgICAgaWYgKGxvYWRfZ2V0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRVhUMToKLQkJCWlmIChub2xvYWRfZXh0ZW5zaW9uKHNlbGYsIDEpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVYVDE6CisgICAgICAgICAgICBpZiAobm9sb2FkX2V4dGVuc2lvbihzZWxmLCAxKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEVYVDI6Ci0JCQlpZiAobm9sb2FkX2V4dGVuc2lvbihzZWxmLCAyKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFWFQyOgorICAgICAgICAgICAgaWYgKG5vbG9hZF9leHRlbnNpb24oc2VsZiwgMikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBFWFQ0OgotCQkJaWYgKG5vbG9hZF9leHRlbnNpb24oc2VsZiwgNCkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRVhUNDoKKyAgICAgICAgICAgIGlmIChub2xvYWRfZXh0ZW5zaW9uKHNlbGYsIDQpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTUFSSzoKLQkJCWlmIChsb2FkX21hcmsoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTUFSSzoKKyAgICAgICAgICAgIGlmIChsb2FkX21hcmsoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5QVVQ6Ci0JCQlpZiAobG9hZF9iaW5wdXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOUFVUOgorICAgICAgICAgICAgaWYgKGxvYWRfYmlucHV0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTE9OR19CSU5QVVQ6Ci0JCQlpZiAobG9hZF9sb25nX2JpbnB1dChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT05HX0JJTlBVVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2xvbmdfYmlucHV0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgUFVUOgotCQkJaWYgKGxvYWRfcHV0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBVVDoKKyAgICAgICAgICAgIGlmIChsb2FkX3B1dChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFBPUDoKLQkJCWlmIChsb2FkX3BvcChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBQT1A6CisgICAgICAgICAgICBpZiAobG9hZF9wb3Aoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBQT1BfTUFSSzoKLQkJCWlmIChsb2FkX3BvcF9tYXJrKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBPUF9NQVJLOgorICAgICAgICAgICAgaWYgKGxvYWRfcG9wX21hcmsoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBTRVRJVEVNOgotCQkJaWYgKG5vbG9hZF9zZXRpdGVtKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFNFVElURU06CisgICAgICAgICAgICBpZiAobm9sb2FkX3NldGl0ZW0oc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBTRVRJVEVNUzoKLQkJCWlmIChub2xvYWRfc2V0aXRlbXMoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgU0VUSVRFTVM6CisgICAgICAgICAgICBpZiAobm9sb2FkX3NldGl0ZW1zKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU1RPUDoKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFNUT1A6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBFUlNJRDoKLQkJCWlmIChsb2FkX3BlcnNpZChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBQRVJTSUQ6CisgICAgICAgICAgICBpZiAobG9hZF9wZXJzaWQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5QRVJTSUQ6Ci0JCQlpZiAobG9hZF9iaW5wZXJzaWQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOUEVSU0lEOgorICAgICAgICAgICAgaWYgKGxvYWRfYmlucGVyc2lkKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgUkVEVUNFOgotCQkJaWYgKG5vbG9hZF9yZWR1Y2Uoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUkVEVUNFOgorICAgICAgICAgICAgaWYgKG5vbG9hZF9yZWR1Y2Uoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBQUk9UTzoKLQkJCWlmIChsb2FkX3Byb3RvKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBST1RPOgorICAgICAgICAgICAgaWYgKGxvYWRfcHJvdG8oc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBORVdUUlVFOgotCQkJaWYgKGxvYWRfYm9vbChzZWxmLCBQeV9UcnVlKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBORVdUUlVFOgorICAgICAgICAgICAgaWYgKGxvYWRfYm9vbChzZWxmLCBQeV9UcnVlKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIE5FV0ZBTFNFOgotCQkJaWYgKGxvYWRfYm9vbChzZWxmLCBQeV9GYWxzZSkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7Ci0JCWRlZmF1bHQ6Ci0JCQljUGlja2xlX0VyckZvcm1hdChVbnBpY2tsaW5nRXJyb3IsCi0JCQkJCSAgImludmFsaWQgbG9hZCBrZXksICclcycuIiwKLQkJCQkJICAiYyIsIHNbMF0pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgY2FzZSBORVdGQUxTRToKKyAgICAgICAgICAgIGlmIChsb2FkX2Jvb2woc2VsZiwgUHlfRmFsc2UpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoVW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbG9hZCBrZXksICclcycuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjIiwgc1swXSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCWJyZWFrOwotCX0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JaWYgKChlcnIgPSBQeUVycl9PY2N1cnJlZCgpKSkgewotCQlpZiAoZXJyID09IFB5RXhjX0VPRkVycm9yKSB7Ci0JCQlQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChlcnIgPSBQeUVycl9PY2N1cnJlZCgpKSkgeworICAgICAgICBpZiAoZXJyID09IFB5RXhjX0VPRkVycm9yKSB7CisgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHZhbCk7Ci0JcmV0dXJuIHZhbDsKKyAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHZhbCk7CisgICAgcmV0dXJuIHZhbDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogVW5waWNrbGVyX2xvYWQoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCXJldHVybiBsb2FkKHNlbGYpOworICAgIHJldHVybiBsb2FkKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVW5waWNrbGVyX25vbG9hZChVbnBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JcmV0dXJuIG5vbG9hZChzZWxmKTsKKyAgICByZXR1cm4gbm9sb2FkKHNlbGYpOwogfQogCiAKQEAgLTU0MjAsMTc1ICs1NDIwLDE3NSBAQAogc3RhdGljIFVucGlja2xlcm9iamVjdCAqCiBuZXdVbnBpY2tsZXJvYmplY3QoUHlPYmplY3QgKmYpCiB7Ci0JVW5waWNrbGVyb2JqZWN0ICpzZWxmOworICAgIFVucGlja2xlcm9iamVjdCAqc2VsZjsKIAotCWlmICghKCBzZWxmID0gUHlPYmplY3RfR0NfTmV3KFVucGlja2xlcm9iamVjdCwgJlVucGlja2xlcnR5cGUpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEoIHNlbGYgPSBQeU9iamVjdF9HQ19OZXcoVW5waWNrbGVyb2JqZWN0LCAmVW5waWNrbGVydHlwZSkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYtPmZpbGUgPSBOVUxMOwotCXNlbGYtPmFyZyA9IE5VTEw7Ci0Jc2VsZi0+c3RhY2sgPSAoUGRhdGEqKVBkYXRhX05ldygpOwotCXNlbGYtPnBlcnNfZnVuYyA9IE5VTEw7Ci0Jc2VsZi0+bGFzdF9zdHJpbmcgPSBOVUxMOwotCXNlbGYtPm1hcmtzID0gTlVMTDsKLQlzZWxmLT5udW1fbWFya3MgPSAwOwotCXNlbGYtPm1hcmtzX3NpemUgPSAwOwotCXNlbGYtPmJ1Zl9zaXplID0gMDsKLQlzZWxmLT5yZWFkID0gTlVMTDsKLQlzZWxmLT5yZWFkbGluZSA9IE5VTEw7Ci0Jc2VsZi0+ZmluZF9jbGFzcyA9IE5VTEw7CisgICAgc2VsZi0+ZmlsZSA9IE5VTEw7CisgICAgc2VsZi0+YXJnID0gTlVMTDsKKyAgICBzZWxmLT5zdGFjayA9IChQZGF0YSopUGRhdGFfTmV3KCk7CisgICAgc2VsZi0+cGVyc19mdW5jID0gTlVMTDsKKyAgICBzZWxmLT5sYXN0X3N0cmluZyA9IE5VTEw7CisgICAgc2VsZi0+bWFya3MgPSBOVUxMOworICAgIHNlbGYtPm51bV9tYXJrcyA9IDA7CisgICAgc2VsZi0+bWFya3Nfc2l6ZSA9IDA7CisgICAgc2VsZi0+YnVmX3NpemUgPSAwOworICAgIHNlbGYtPnJlYWQgPSBOVUxMOworICAgIHNlbGYtPnJlYWRsaW5lID0gTlVMTDsKKyAgICBzZWxmLT5maW5kX2NsYXNzID0gTlVMTDsKIAotCWlmICghKCBzZWxmLT5tZW1vID0gUHlEaWN0X05ldygpKSkKLQkJZ290byBlcnI7CisgICAgaWYgKCEoIHNlbGYtPm1lbW8gPSBQeURpY3RfTmV3KCkpKQorICAgICAgICBnb3RvIGVycjsKIAotCWlmICghc2VsZi0+c3RhY2spCi0JCWdvdG8gZXJyOworICAgIGlmICghc2VsZi0+c3RhY2spCisgICAgICAgIGdvdG8gZXJyOwogCi0JUHlfSU5DUkVGKGYpOwotCXNlbGYtPmZpbGUgPSBmOworICAgIFB5X0lOQ1JFRihmKTsKKyAgICBzZWxmLT5maWxlID0gZjsKIAotCS8qIFNldCByZWFkLCByZWFkbGluZSBiYXNlZCBvbiB0eXBlIG9mIGYgKi8KLQlpZiAoUHlGaWxlX0NoZWNrKGYpKSB7Ci0JCXNlbGYtPmZwID0gUHlGaWxlX0FzRmlsZShmKTsKLQkJaWYgKHNlbGYtPmZwID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJc2VsZi0+cmVhZF9mdW5jID0gcmVhZF9maWxlOwotCQlzZWxmLT5yZWFkbGluZV9mdW5jID0gcmVhZGxpbmVfZmlsZTsKLQl9Ci0JZWxzZSBpZiAoUHljU3RyaW5nSU9fSW5wdXRDaGVjayhmKSkgewotCQlzZWxmLT5mcCA9IE5VTEw7Ci0JCXNlbGYtPnJlYWRfZnVuYyA9IHJlYWRfY1N0cmluZ0lPOwotCQlzZWxmLT5yZWFkbGluZV9mdW5jID0gcmVhZGxpbmVfY1N0cmluZ0lPOwotCX0KLQllbHNlIHsKKyAgICAvKiBTZXQgcmVhZCwgcmVhZGxpbmUgYmFzZWQgb24gdHlwZSBvZiBmICovCisgICAgaWYgKFB5RmlsZV9DaGVjayhmKSkgeworICAgICAgICBzZWxmLT5mcCA9IFB5RmlsZV9Bc0ZpbGUoZik7CisgICAgICAgIGlmIChzZWxmLT5mcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+cmVhZF9mdW5jID0gcmVhZF9maWxlOworICAgICAgICBzZWxmLT5yZWFkbGluZV9mdW5jID0gcmVhZGxpbmVfZmlsZTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHljU3RyaW5nSU9fSW5wdXRDaGVjayhmKSkgeworICAgICAgICBzZWxmLT5mcCA9IE5VTEw7CisgICAgICAgIHNlbGYtPnJlYWRfZnVuYyA9IHJlYWRfY1N0cmluZ0lPOworICAgICAgICBzZWxmLT5yZWFkbGluZV9mdW5jID0gcmVhZGxpbmVfY1N0cmluZ0lPOworICAgIH0KKyAgICBlbHNlIHsKIAotCQlzZWxmLT5mcCA9IE5VTEw7Ci0JCXNlbGYtPnJlYWRfZnVuYyA9IHJlYWRfb3RoZXI7Ci0JCXNlbGYtPnJlYWRsaW5lX2Z1bmMgPSByZWFkbGluZV9vdGhlcjsKKyAgICAgICAgc2VsZi0+ZnAgPSBOVUxMOworICAgICAgICBzZWxmLT5yZWFkX2Z1bmMgPSByZWFkX290aGVyOworICAgICAgICBzZWxmLT5yZWFkbGluZV9mdW5jID0gcmVhZGxpbmVfb3RoZXI7CiAKLQkJaWYgKCEoIChzZWxmLT5yZWFkbGluZSA9IFB5T2JqZWN0X0dldEF0dHIoZiwgcmVhZGxpbmVfc3RyKSkgJiYKLQkJICAgICAgIChzZWxmLT5yZWFkID0gUHlPYmplY3RfR2V0QXR0cihmLCByZWFkX3N0cikpKSkgIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeUVycl9TZXRTdHJpbmcoIFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICJhcmd1bWVudCBtdXN0IGhhdmUgJ3JlYWQnIGFuZCAiCi0JCQkJCSAiJ3JlYWRsaW5lJyBhdHRyaWJ1dGVzIiApOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0JUHlPYmplY3RfR0NfVHJhY2soc2VsZik7CisgICAgICAgIGlmICghKCAoc2VsZi0+cmVhZGxpbmUgPSBQeU9iamVjdF9HZXRBdHRyKGYsIHJlYWRsaW5lX3N0cikpICYmCisgICAgICAgICAgICAgICAoc2VsZi0+cmVhZCA9IFB5T2JqZWN0X0dldEF0dHIoZiwgcmVhZF9zdHIpKSkpICB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKCBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBtdXN0IGhhdmUgJ3JlYWQnIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIncmVhZGxpbmUnIGF0dHJpYnV0ZXMiICk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKIAotCXJldHVybiBzZWxmOworICAgIHJldHVybiBzZWxmOwogCiAgIGVycjoKLQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc2VsZik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXNlbGYpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfVW5waWNrbGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqZmlsZSkKIHsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3VW5waWNrbGVyb2JqZWN0KGZpbGUpOworICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdVbnBpY2tsZXJvYmplY3QoZmlsZSk7CiB9CiAKIAogc3RhdGljIHZvaWQKIFVucGlja2xlcl9kZWFsbG9jKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKChQeU9iamVjdCAqKXNlbGYpOwotCVB5X1hERUNSRUYoc2VsZi0+cmVhZGxpbmUpOwotCVB5X1hERUNSRUYoc2VsZi0+cmVhZCk7Ci0JUHlfWERFQ1JFRihzZWxmLT5maWxlKTsKLQlQeV9YREVDUkVGKHNlbGYtPm1lbW8pOwotCVB5X1hERUNSRUYoc2VsZi0+c3RhY2spOwotCVB5X1hERUNSRUYoc2VsZi0+cGVyc19mdW5jKTsKLQlQeV9YREVDUkVGKHNlbGYtPmFyZyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5sYXN0X3N0cmluZyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5maW5kX2NsYXNzKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cmVhZGxpbmUpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cmVhZCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5maWxlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm1lbW8pOworICAgIFB5X1hERUNSRUYoc2VsZi0+c3RhY2spOworICAgIFB5X1hERUNSRUYoc2VsZi0+cGVyc19mdW5jKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmFyZyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5sYXN0X3N0cmluZyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5maW5kX2NsYXNzKTsKIAotCWlmIChzZWxmLT5tYXJrcykgewotCQlmcmVlKHNlbGYtPm1hcmtzKTsKLQl9CisgICAgaWYgKHNlbGYtPm1hcmtzKSB7CisgICAgICAgIGZyZWUoc2VsZi0+bWFya3MpOworICAgIH0KIAotCWlmIChzZWxmLT5idWZfc2l6ZSkgewotCQlmcmVlKHNlbGYtPmJ1Zik7Ci0JfQorICAgIGlmIChzZWxmLT5idWZfc2l6ZSkgeworICAgICAgICBmcmVlKHNlbGYtPmJ1Zik7CisgICAgfQogCi0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBVbnBpY2tsZXJfdHJhdmVyc2UoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChzZWxmLT5yZWFkbGluZSk7Ci0JUHlfVklTSVQoc2VsZi0+cmVhZCk7Ci0JUHlfVklTSVQoc2VsZi0+ZmlsZSk7Ci0JUHlfVklTSVQoc2VsZi0+bWVtbyk7Ci0JUHlfVklTSVQoc2VsZi0+c3RhY2spOwotCVB5X1ZJU0lUKHNlbGYtPnBlcnNfZnVuYyk7Ci0JUHlfVklTSVQoc2VsZi0+YXJnKTsKLQlQeV9WSVNJVChzZWxmLT5sYXN0X3N0cmluZyk7Ci0JUHlfVklTSVQoc2VsZi0+ZmluZF9jbGFzcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoc2VsZi0+cmVhZGxpbmUpOworICAgIFB5X1ZJU0lUKHNlbGYtPnJlYWQpOworICAgIFB5X1ZJU0lUKHNlbGYtPmZpbGUpOworICAgIFB5X1ZJU0lUKHNlbGYtPm1lbW8pOworICAgIFB5X1ZJU0lUKHNlbGYtPnN0YWNrKTsKKyAgICBQeV9WSVNJVChzZWxmLT5wZXJzX2Z1bmMpOworICAgIFB5X1ZJU0lUKHNlbGYtPmFyZyk7CisgICAgUHlfVklTSVQoc2VsZi0+bGFzdF9zdHJpbmcpOworICAgIFB5X1ZJU0lUKHNlbGYtPmZpbmRfY2xhc3MpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBVbnBpY2tsZXJfY2xlYXIoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5X0NMRUFSKHNlbGYtPnJlYWRsaW5lKTsKLQlQeV9DTEVBUihzZWxmLT5yZWFkKTsKLQlQeV9DTEVBUihzZWxmLT5maWxlKTsKLQlQeV9DTEVBUihzZWxmLT5tZW1vKTsKLQlQeV9DTEVBUihzZWxmLT5zdGFjayk7Ci0JUHlfQ0xFQVIoc2VsZi0+cGVyc19mdW5jKTsKLQlQeV9DTEVBUihzZWxmLT5hcmcpOwotCVB5X0NMRUFSKHNlbGYtPmxhc3Rfc3RyaW5nKTsKLQlQeV9DTEVBUihzZWxmLT5maW5kX2NsYXNzKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihzZWxmLT5yZWFkbGluZSk7CisgICAgUHlfQ0xFQVIoc2VsZi0+cmVhZCk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7CisgICAgUHlfQ0xFQVIoc2VsZi0+bWVtbyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+c3RhY2spOworICAgIFB5X0NMRUFSKHNlbGYtPnBlcnNfZnVuYyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+YXJnKTsKKyAgICBQeV9DTEVBUihzZWxmLT5sYXN0X3N0cmluZyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZmluZF9jbGFzcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBVbnBpY2tsZXJfZ2V0YXR0cihVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JaWYgKCFzdHJjbXAobmFtZSwgInBlcnNpc3RlbnRfbG9hZCIpKSB7Ci0JCWlmICghc2VsZi0+cGVyc19mdW5jKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAicGVyc2lzdGVudF9sb2FkIikpIHsKKyAgICAgICAgaWYgKCFzZWxmLT5wZXJzX2Z1bmMpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCVB5X0lOQ1JFRihzZWxmLT5wZXJzX2Z1bmMpOwotCQlyZXR1cm4gc2VsZi0+cGVyc19mdW5jOwotCX0KKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnBlcnNfZnVuYyk7CisgICAgICAgIHJldHVybiBzZWxmLT5wZXJzX2Z1bmM7CisgICAgfQogCi0JaWYgKCFzdHJjbXAobmFtZSwgImZpbmRfZ2xvYmFsIikpIHsKLQkJaWYgKCFzZWxmLT5maW5kX2NsYXNzKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiZmluZF9nbG9iYWwiKSkgeworICAgICAgICBpZiAoIXNlbGYtPmZpbmRfY2xhc3MpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCVB5X0lOQ1JFRihzZWxmLT5maW5kX2NsYXNzKTsKLQkJcmV0dXJuIHNlbGYtPmZpbmRfY2xhc3M7Ci0JfQorICAgICAgICBQeV9JTkNSRUYoc2VsZi0+ZmluZF9jbGFzcyk7CisgICAgICAgIHJldHVybiBzZWxmLT5maW5kX2NsYXNzOworICAgIH0KIAotCWlmICghc3RyY21wKG5hbWUsICJtZW1vIikpIHsKLQkJaWYgKCFzZWxmLT5tZW1vKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAibWVtbyIpKSB7CisgICAgICAgIGlmICghc2VsZi0+bWVtbykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJUHlfSU5DUkVGKHNlbGYtPm1lbW8pOwotCQlyZXR1cm4gc2VsZi0+bWVtbzsKLQl9CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5tZW1vKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPm1lbW87CisgICAgfQogCi0JaWYgKCFzdHJjbXAobmFtZSwgIlVucGlja2xpbmdFcnJvciIpKSB7Ci0JCVB5X0lOQ1JFRihVbnBpY2tsaW5nRXJyb3IpOwotCQlyZXR1cm4gVW5waWNrbGluZ0Vycm9yOwotCX0KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiVW5waWNrbGluZ0Vycm9yIikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFVucGlja2xpbmdFcnJvcik7CisgICAgICAgIHJldHVybiBVbnBpY2tsaW5nRXJyb3I7CisgICAgfQogCi0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoVW5waWNrbGVyX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKFVucGlja2xlcl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogCkBAIC01NTk2LDQwICs1NTk2LDQwIEBACiBVbnBpY2tsZXJfc2V0YXR0cihVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKIAotCWlmICghc3RyY21wKG5hbWUsICJwZXJzaXN0ZW50X2xvYWQiKSkgewotCQlQeV9YREVDUkVGKHNlbGYtPnBlcnNfZnVuYyk7Ci0JCXNlbGYtPnBlcnNfZnVuYyA9IHZhbHVlOwotCQlQeV9YSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICghc3RyY21wKG5hbWUsICJwZXJzaXN0ZW50X2xvYWQiKSkgeworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPnBlcnNfZnVuYyk7CisgICAgICAgIHNlbGYtPnBlcnNfZnVuYyA9IHZhbHVlOworICAgICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKCFzdHJjbXAobmFtZSwgImZpbmRfZ2xvYmFsIikpIHsKLQkJUHlfWERFQ1JFRihzZWxmLT5maW5kX2NsYXNzKTsKLQkJc2VsZi0+ZmluZF9jbGFzcyA9IHZhbHVlOwotCQlQeV9YSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICghc3RyY21wKG5hbWUsICJmaW5kX2dsb2JhbCIpKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZmluZF9jbGFzcyk7CisgICAgICAgIHNlbGYtPmZpbmRfY2xhc3MgPSB2YWx1ZTsKKyAgICAgICAgUHlfWElOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmICghIHZhbHVlKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCEgdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKHN0cmNtcChuYW1lLCAibWVtbyIpID09IDApIHsKLQkJaWYgKCFQeURpY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkibWVtbyBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X1hERUNSRUYoc2VsZi0+bWVtbyk7Ci0JCXNlbGYtPm1lbW8gPSB2YWx1ZTsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChzdHJjbXAobmFtZSwgIm1lbW8iKSA9PSAwKSB7CisgICAgICAgIGlmICghUHlEaWN0X0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVtbyBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+bWVtbyk7CisgICAgICAgIHNlbGYtPm1lbW8gPSB2YWx1ZTsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTY0MCwyOCArNTY0MCwyOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNwbV9kdW1wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJvYmoiLCAiZmlsZSIsICJwcm90b2NvbCIsIE5VTEx9OwotCVB5T2JqZWN0ICpvYiwgKmZpbGUsICpyZXMgPSBOVUxMOwotCVBpY2tsZXJvYmplY3QgKnBpY2tsZXIgPSAwOwotCWludCBwcm90byA9IDA7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJvYmoiLCAiZmlsZSIsICJwcm90b2NvbCIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpvYiwgKmZpbGUsICpyZXMgPSBOVUxMOworICAgIFBpY2tsZXJvYmplY3QgKnBpY2tsZXIgPSAwOworICAgIGludCBwcm90byA9IDA7CiAKLQlpZiAoISggUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPT3xpIiwga3dsaXN0LAotCQkgICAmb2IsICZmaWxlLCAmcHJvdG8pKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9PfGkiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAmb2IsICZmaWxlLCAmcHJvdG8pKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKCEoIHBpY2tsZXIgPSBuZXdQaWNrbGVyb2JqZWN0KGZpbGUsIHByb3RvKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggcGlja2xlciA9IG5ld1BpY2tsZXJvYmplY3QoZmlsZSwgcHJvdG8pKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKGR1bXAocGlja2xlciwgb2IpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChkdW1wKHBpY2tsZXIsIG9iKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXMgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXMgPSBQeV9Ob25lOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihwaWNrbGVyKTsKKyAgICBQeV9YREVDUkVGKHBpY2tsZXIpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKQEAgLTU2NjksMzEgKzU2NjksMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjcG1fZHVtcHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im9iaiIsICJwcm90b2NvbCIsIE5VTEx9OwotCVB5T2JqZWN0ICpvYiwgKmZpbGUgPSAwLCAqcmVzID0gTlVMTDsKLQlQaWNrbGVyb2JqZWN0ICpwaWNrbGVyID0gMDsKLQlpbnQgcHJvdG8gPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsib2JqIiwgInByb3RvY29sIiwgTlVMTH07CisgICAgUHlPYmplY3QgKm9iLCAqZmlsZSA9IDAsICpyZXMgPSBOVUxMOworICAgIFBpY2tsZXJvYmplY3QgKnBpY2tsZXIgPSAwOworICAgIGludCBwcm90byA9IDA7CiAKLQlpZiAoISggUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfGk6ZHVtcHMiLCBrd2xpc3QsCi0JCSAgICZvYiwgJnByb3RvKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfGk6ZHVtcHMiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAmb2IsICZwcm90bykpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoISggZmlsZSA9IFB5Y1N0cmluZ0lPLT5OZXdPdXRwdXQoMTI4KSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggZmlsZSA9IFB5Y1N0cmluZ0lPLT5OZXdPdXRwdXQoMTI4KSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmICghKCBwaWNrbGVyID0gbmV3UGlja2xlcm9iamVjdChmaWxlLCBwcm90bykpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIHBpY2tsZXIgPSBuZXdQaWNrbGVyb2JqZWN0KGZpbGUsIHByb3RvKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChkdW1wKHBpY2tsZXIsIG9iKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoZHVtcChwaWNrbGVyLCBvYikgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlyZXMgPSBQeWNTdHJpbmdJTy0+Y2dldHZhbHVlKGZpbGUpOworICAgIHJlcyA9IFB5Y1N0cmluZ0lPLT5jZ2V0dmFsdWUoZmlsZSk7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHBpY2tsZXIpOwotCVB5X1hERUNSRUYoZmlsZSk7CisgICAgUHlfWERFQ1JFRihwaWNrbGVyKTsKKyAgICBQeV9YREVDUkVGKGZpbGUpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKQEAgLTU3MDEsMTggKzU3MDEsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjcG1fbG9hZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iKQogewotCVVucGlja2xlcm9iamVjdCAqdW5waWNrbGVyID0gMDsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBVbnBpY2tsZXJvYmplY3QgKnVucGlja2xlciA9IDA7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CiAKLQlpZiAoISggdW5waWNrbGVyID0gbmV3VW5waWNrbGVyb2JqZWN0KG9iKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggdW5waWNrbGVyID0gbmV3VW5waWNrbGVyb2JqZWN0KG9iKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCXJlcyA9IGxvYWQodW5waWNrbGVyKTsKKyAgICByZXMgPSBsb2FkKHVucGlja2xlcik7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHVucGlja2xlcik7CisgICAgUHlfWERFQ1JFRih1bnBpY2tsZXIpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKQEAgLTU3MjAsMjUgKzU3MjAsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjcG1fbG9hZHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpvYiwgKmZpbGUgPSAwLCAqcmVzID0gTlVMTDsKLQlVbnBpY2tsZXJvYmplY3QgKnVucGlja2xlciA9IDA7CisgICAgUHlPYmplY3QgKm9iLCAqZmlsZSA9IDAsICpyZXMgPSBOVUxMOworICAgIFVucGlja2xlcm9iamVjdCAqdW5waWNrbGVyID0gMDsKIAotCWlmICghKCBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJTOmxvYWRzIiwgJm9iKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiUzpsb2FkcyIsICZvYikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoISggZmlsZSA9IFB5Y1N0cmluZ0lPLT5OZXdJbnB1dChvYikpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIGZpbGUgPSBQeWNTdHJpbmdJTy0+TmV3SW5wdXQob2IpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKCEoIHVucGlja2xlciA9IG5ld1VucGlja2xlcm9iamVjdChmaWxlKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggdW5waWNrbGVyID0gbmV3VW5waWNrbGVyb2JqZWN0KGZpbGUpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JcmVzID0gbG9hZCh1bnBpY2tsZXIpOworICAgIHJlcyA9IGxvYWQodW5waWNrbGVyKTsKIAogICBmaW5hbGx5OgotCVB5X1hERUNSRUYoZmlsZSk7Ci0JUHlfWERFQ1JFRih1bnBpY2tsZXIpOworICAgIFB5X1hERUNSRUYoZmlsZSk7CisgICAgUHlfWERFQ1JFRih1bnBpY2tsZXIpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKQEAgLTU3NDcsMjggKzU3NDcsMjggQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBVbnBpY2tsZXJ0eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAgICJjUGlja2xlLlVucGlja2xlciIsIAkgICAgICAgICAvKnRwX25hbWUqLworICAgICJjUGlja2xlLlVucGlja2xlciIsICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLwogICAgIHNpemVvZihVbnBpY2tsZXJvYmplY3QpLCAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCiAgICAgMCwKLSAgICAoZGVzdHJ1Y3RvcilVbnBpY2tsZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotICAgIDAsCQkJCQkvKiB0cF9wcmludCAqLwotICAgIChnZXRhdHRyZnVuYylVbnBpY2tsZXJfZ2V0YXR0ciwJLyogdHBfZ2V0YXR0ciAqLwotICAgIChzZXRhdHRyZnVuYylVbnBpY2tsZXJfc2V0YXR0ciwJLyogdHBfc2V0YXR0ciAqLwotICAgIDAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0gICAgMCwJCSAJCQkvKiB0cF9yZXByICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0gICAgMCwJCQkJCS8qIHRwX2hhc2ggKi8KLSAgICAwLAkJCQkJLyogdHBfY2FsbCAqLwotICAgIDAsCQkJCQkvKiB0cF9zdHIgKi8KLSAgICAwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLSAgICAwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCisgICAgKGRlc3RydWN0b3IpVW5waWNrbGVyX2RlYWxsb2MsICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgKGdldGF0dHJmdW5jKVVucGlja2xlcl9nZXRhdHRyLCAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIChzZXRhdHRyZnVuYylVbnBpY2tsZXJfc2V0YXR0ciwgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCi0gICAgVW5waWNrbGVydHlwZV9fZG9jX18sCQkvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKVVucGlja2xlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLSAgICAoaW5xdWlyeSlVbnBpY2tsZXJfY2xlYXIsCQkvKiB0cF9jbGVhciAqLworICAgIFVucGlja2xlcnR5cGVfX2RvY19fLCAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpVW5waWNrbGVyX3RyYXZlcnNlLCAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpVW5waWNrbGVyX2NsZWFyLCAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgY1BpY2tsZV9tZXRob2RzW10gPSB7CkBAIC01ODI2LDE5OCArNTgyNiwxOTggQEAKIHN0YXRpYyBpbnQKIGluaXRfc3R1ZmYoUHlPYmplY3QgKm1vZHVsZV9kaWN0KQogewotCVB5T2JqZWN0ICpjb3B5cmVnLCAqdCwgKnI7CisgICAgUHlPYmplY3QgKmNvcHlyZWcsICp0LCAqcjsKIAogI2RlZmluZSBJTklUX1NUUihTKSBpZiAoISggUyAjIyBfc3RyPVB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoI1MpKSkgIHJldHVybiAtMTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlVucGlja2xlcnR5cGUpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmIChQeVR5cGVfUmVhZHkoJlBpY2tsZXJ0eXBlKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZVbnBpY2tsZXJ0eXBlKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQaWNrbGVydHlwZSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlJTklUX1NUUihfX2NsYXNzX18pOwotCUlOSVRfU1RSKF9fZ2V0aW5pdGFyZ3NfXyk7Ci0JSU5JVF9TVFIoX19kaWN0X18pOwotCUlOSVRfU1RSKF9fZ2V0c3RhdGVfXyk7Ci0JSU5JVF9TVFIoX19zZXRzdGF0ZV9fKTsKLQlJTklUX1NUUihfX25hbWVfXyk7Ci0JSU5JVF9TVFIoX19tYWluX18pOwotCUlOSVRfU1RSKF9fcmVkdWNlX18pOwotCUlOSVRfU1RSKF9fcmVkdWNlX2V4X18pOwotCUlOSVRfU1RSKHdyaXRlKTsKLQlJTklUX1NUUihhcHBlbmQpOwotCUlOSVRfU1RSKHJlYWQpOwotCUlOSVRfU1RSKHJlYWRsaW5lKTsKLQlJTklUX1NUUihkaXNwYXRjaF90YWJsZSk7CisgICAgSU5JVF9TVFIoX19jbGFzc19fKTsKKyAgICBJTklUX1NUUihfX2dldGluaXRhcmdzX18pOworICAgIElOSVRfU1RSKF9fZGljdF9fKTsKKyAgICBJTklUX1NUUihfX2dldHN0YXRlX18pOworICAgIElOSVRfU1RSKF9fc2V0c3RhdGVfXyk7CisgICAgSU5JVF9TVFIoX19uYW1lX18pOworICAgIElOSVRfU1RSKF9fbWFpbl9fKTsKKyAgICBJTklUX1NUUihfX3JlZHVjZV9fKTsKKyAgICBJTklUX1NUUihfX3JlZHVjZV9leF9fKTsKKyAgICBJTklUX1NUUih3cml0ZSk7CisgICAgSU5JVF9TVFIoYXBwZW5kKTsKKyAgICBJTklUX1NUUihyZWFkKTsKKyAgICBJTklUX1NUUihyZWFkbGluZSk7CisgICAgSU5JVF9TVFIoZGlzcGF0Y2hfdGFibGUpOwogCi0JaWYgKCEoIGNvcHlyZWcgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoImNvcHlfcmVnIikpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoIGNvcHlyZWcgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoImNvcHlfcmVnIikpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQkvKiBUaGlzIGlzIHNwZWNpYWwgYmVjYXVzZSB3ZSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudAotCSAgIG9uZSBpbiByZXN0cmljdGVkIG1vZGUuICovCi0JZGlzcGF0Y2hfdGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKGNvcHlyZWcsIGRpc3BhdGNoX3RhYmxlX3N0cik7Ci0JaWYgKCFkaXNwYXRjaF90YWJsZSkgcmV0dXJuIC0xOworICAgIC8qIFRoaXMgaXMgc3BlY2lhbCBiZWNhdXNlIHdlIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50CisgICAgICAgb25lIGluIHJlc3RyaWN0ZWQgbW9kZS4gKi8KKyAgICBkaXNwYXRjaF90YWJsZSA9IFB5T2JqZWN0X0dldEF0dHIoY29weXJlZywgZGlzcGF0Y2hfdGFibGVfc3RyKTsKKyAgICBpZiAoIWRpc3BhdGNoX3RhYmxlKSByZXR1cm4gLTE7CiAKLQlleHRlbnNpb25fcmVnaXN0cnkgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNvcHlyZWcsCi0JCQkJIl9leHRlbnNpb25fcmVnaXN0cnkiKTsKLQlpZiAoIWV4dGVuc2lvbl9yZWdpc3RyeSkgcmV0dXJuIC0xOworICAgIGV4dGVuc2lvbl9yZWdpc3RyeSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29weXJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2V4dGVuc2lvbl9yZWdpc3RyeSIpOworICAgIGlmICghZXh0ZW5zaW9uX3JlZ2lzdHJ5KSByZXR1cm4gLTE7CiAKLQlpbnZlcnRlZF9yZWdpc3RyeSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29weXJlZywKLQkJCQkiX2ludmVydGVkX3JlZ2lzdHJ5Iik7Ci0JaWYgKCFpbnZlcnRlZF9yZWdpc3RyeSkgcmV0dXJuIC0xOworICAgIGludmVydGVkX3JlZ2lzdHJ5ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb3B5cmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfaW52ZXJ0ZWRfcmVnaXN0cnkiKTsKKyAgICBpZiAoIWludmVydGVkX3JlZ2lzdHJ5KSByZXR1cm4gLTE7CiAKLQlleHRlbnNpb25fY2FjaGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNvcHlyZWcsCi0JCQkJIl9leHRlbnNpb25fY2FjaGUiKTsKLQlpZiAoIWV4dGVuc2lvbl9jYWNoZSkgcmV0dXJuIC0xOworICAgIGV4dGVuc2lvbl9jYWNoZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29weXJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2V4dGVuc2lvbl9jYWNoZSIpOworICAgIGlmICghZXh0ZW5zaW9uX2NhY2hlKSByZXR1cm4gLTE7CiAKLQlQeV9ERUNSRUYoY29weXJlZyk7CisgICAgUHlfREVDUkVGKGNvcHlyZWcpOwogCi0JaWYgKCEoZW1wdHlfdHVwbGUgPSBQeVR1cGxlX05ldygwKSkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIShlbXB0eV90dXBsZSA9IFB5VHVwbGVfTmV3KDApKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JdHdvX3R1cGxlID0gUHlUdXBsZV9OZXcoMik7Ci0JaWYgKHR3b190dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JLyogV2UgdXNlIHRoaXMgdGVtcCBjb250YWluZXIgd2l0aCBubyByZWdhcmQgdG8gcmVmY291bnRzLCBvciB0bwotCSAqIGtlZXBpbmcgY29udGFpbmVlcyBhbGl2ZS4gIEV4ZW1wdCBmcm9tIEdDLCBiZWNhdXNlIHdlIGRvbid0Ci0JICogd2FudCBhbnl0aGluZyBsb29raW5nIGF0IHR3b190dXBsZSgpIGJ5IG1hZ2ljLgotCSAqLwotCVB5T2JqZWN0X0dDX1VuVHJhY2sodHdvX3R1cGxlKTsKKyAgICB0d29fdHVwbGUgPSBQeVR1cGxlX05ldygyKTsKKyAgICBpZiAodHdvX3R1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBXZSB1c2UgdGhpcyB0ZW1wIGNvbnRhaW5lciB3aXRoIG5vIHJlZ2FyZCB0byByZWZjb3VudHMsIG9yIHRvCisgICAgICoga2VlcGluZyBjb250YWluZWVzIGFsaXZlLiAgRXhlbXB0IGZyb20gR0MsIGJlY2F1c2Ugd2UgZG9uJ3QKKyAgICAgKiB3YW50IGFueXRoaW5nIGxvb2tpbmcgYXQgdHdvX3R1cGxlKCkgYnkgbWFnaWMuCisgICAgICovCisgICAgUHlPYmplY3RfR0NfVW5UcmFjayh0d29fdHVwbGUpOwogCi0JLyogVWdoICovCi0JaWYgKCEoIHQ9UHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJfX2J1aWx0aW5fXyIpKSkgIHJldHVybiAtMTsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJfX2J1aWx0aW5zX18iLCB0KSA8IDApCi0JCXJldHVybiAtMTsKKyAgICAvKiBVZ2ggKi8KKyAgICBpZiAoISggdD1QeUltcG9ydF9JbXBvcnRNb2R1bGUoIl9fYnVpbHRpbl9fIikpKSAgcmV0dXJuIC0xOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIl9fYnVpbHRpbnNfXyIsIHQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKCEoIHQ9UHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKLQlpZiAoISggcj1QeVJ1bl9TdHJpbmcoCi0JCSAgICAgICAiZGVmIF9fc3RyX18oc2VsZik6XG4iCi0JCSAgICAgICAiICByZXR1cm4gc2VsZi5hcmdzIGFuZCAoJyVzJyAlIHNlbGYuYXJnc1swXSkgb3IgJyh3aGF0KSdcbiIsCi0JCSAgICAgICBQeV9maWxlX2lucHV0LAotCQkgICAgICAgbW9kdWxlX2RpY3QsIHQpICApKSAgcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyKTsKKyAgICBpZiAoISggdD1QeURpY3RfTmV3KCkpKSAgcmV0dXJuIC0xOworICAgIGlmICghKCByPVB5UnVuX1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAiZGVmIF9fc3RyX18oc2VsZik6XG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHNlbGYuYXJncyBhbmQgKCclcycgJSBzZWxmLmFyZ3NbMF0pIG9yICcod2hhdCknXG4iLAorICAgICAgICAgICAgICAgICAgIFB5X2ZpbGVfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgbW9kdWxlX2RpY3QsIHQpICApKSAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyKTsKIAotCVBpY2tsZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLlBpY2tsZUVycm9yIiwgTlVMTCwgdCk7Ci0JaWYgKCFQaWNrbGVFcnJvcikKLQkJcmV0dXJuIC0xOworICAgIFBpY2tsZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLlBpY2tsZUVycm9yIiwgTlVMTCwgdCk7CisgICAgaWYgKCFQaWNrbGVFcnJvcikKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUHlfREVDUkVGKHQpOworICAgIFB5X0RFQ1JFRih0KTsKIAotCVBpY2tsaW5nRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNQaWNrbGUuUGlja2xpbmdFcnJvciIsCi0JCQkJCSAgIFBpY2tsZUVycm9yLCBOVUxMKTsKLQlpZiAoIVBpY2tsaW5nRXJyb3IpCi0JCXJldHVybiAtMTsKKyAgICBQaWNrbGluZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLlBpY2tsaW5nRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlja2xlRXJyb3IsIE5VTEwpOworICAgIGlmICghUGlja2xpbmdFcnJvcikKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKCEoIHQ9UHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKLQlpZiAoISggcj1QeVJ1bl9TdHJpbmcoCi0JCSAgICAgICAiZGVmIF9fc3RyX18oc2VsZik6XG4iCi0JCSAgICAgICAiICBhPXNlbGYuYXJnc1xuIgotCQkgICAgICAgIiAgYT1hIGFuZCB0eXBlKGFbMF0pIG9yICcod2hhdCknXG4iCi0JCSAgICAgICAiICByZXR1cm4gJ0Nhbm5vdCBwaWNrbGUgJXMgb2JqZWN0cycgJSBhXG4iCi0JCSAgICAgICAsIFB5X2ZpbGVfaW5wdXQsCi0JCSAgICAgICBtb2R1bGVfZGljdCwgdCkgICkpICByZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHIpOworICAgIGlmICghKCB0PVB5RGljdF9OZXcoKSkpICByZXR1cm4gLTE7CisgICAgaWYgKCEoIHI9UHlSdW5fU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICJkZWYgX19zdHJfXyhzZWxmKTpcbiIKKyAgICAgICAgICAgICAgICAgICAiICBhPXNlbGYuYXJnc1xuIgorICAgICAgICAgICAgICAgICAgICIgIGE9YSBhbmQgdHlwZShhWzBdKSBvciAnKHdoYXQpJ1xuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiAnQ2Fubm90IHBpY2tsZSAlcyBvYmplY3RzJyAlIGFcbiIKKyAgICAgICAgICAgICAgICAgICAsIFB5X2ZpbGVfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgbW9kdWxlX2RpY3QsIHQpICApKSAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyKTsKIAotCWlmICghKCBVbnBpY2tsZWFibGVFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigKLQkJICAgICAgICJjUGlja2xlLlVucGlja2xlYWJsZUVycm9yIiwgUGlja2xpbmdFcnJvciwgdCkpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoIFVucGlja2xlYWJsZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICJjUGlja2xlLlVucGlja2xlYWJsZUVycm9yIiwgUGlja2xpbmdFcnJvciwgdCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9ERUNSRUYodCk7CisgICAgUHlfREVDUkVGKHQpOwogCi0JaWYgKCEoIFVucGlja2xpbmdFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiY1BpY2tsZS5VbnBpY2tsaW5nRXJyb3IiLAotCQkJCQkJICAgIFBpY2tsZUVycm9yLCBOVUxMKSkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoISggVW5waWNrbGluZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLlVucGlja2xpbmdFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWNrbGVFcnJvciwgTlVMTCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgaWYgKCEoIEJhZFBpY2tsZUdldCA9IFB5RXJyX05ld0V4Y2VwdGlvbigiY1BpY2tsZS5CYWRQaWNrbGVHZXQiLAotCQkJCQkJIFVucGlja2xpbmdFcnJvciwgTlVMTCkpKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoISggQmFkUGlja2xlR2V0ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLkJhZFBpY2tsZUdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnBpY2tsaW5nRXJyb3IsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiUGlja2xlRXJyb3IiLAotCQkJCSBQaWNrbGVFcnJvcikgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiUGlja2xlRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWNrbGVFcnJvcikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJQaWNrbGluZ0Vycm9yIiwKLQkJCQkgUGlja2xpbmdFcnJvcikgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiUGlja2xpbmdFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpY2tsaW5nRXJyb3IpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiVW5waWNrbGluZ0Vycm9yIiwKLQkJCQkgVW5waWNrbGluZ0Vycm9yKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJVbnBpY2tsaW5nRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnBpY2tsaW5nRXJyb3IpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiVW5waWNrbGVhYmxlRXJyb3IiLAotCQkJCSBVbnBpY2tsZWFibGVFcnJvcikgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiVW5waWNrbGVhYmxlRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnBpY2tsZWFibGVFcnJvcikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJCYWRQaWNrbGVHZXQiLAotCQkJCSBCYWRQaWNrbGVHZXQpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIkJhZFBpY2tsZUdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhZFBpY2tsZUdldCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeWNTdHJpbmdfSU1QT1JUOworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAotI2lmbmRlZiBQeU1PRElOSVRfRlVOQwkvKiBkZWNsYXJhdGlvbnMgZm9yIERMTCBpbXBvcnQvZXhwb3J0ICovCisjaWZuZGVmIFB5TU9ESU5JVF9GVU5DICAvKiBkZWNsYXJhdGlvbnMgZm9yIERMTCBpbXBvcnQvZXhwb3J0ICovCiAjZGVmaW5lIFB5TU9ESU5JVF9GVU5DIHZvaWQKICNlbmRpZgogUHlNT0RJTklUX0ZVTkMKIGluaXRjUGlja2xlKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqZGksICp2LCAqazsKLQlQeV9zc2l6ZV90IGk7Ci0JY2hhciAqcmV2ID0gIjEuNzEiOwkvKiBYWFggd2hlbiBkb2VzIHRoaXMgY2hhbmdlPyAqLwotCVB5T2JqZWN0ICpmb3JtYXRfdmVyc2lvbjsKLQlQeU9iamVjdCAqY29tcGF0aWJsZV9mb3JtYXRzOworICAgIFB5T2JqZWN0ICptLCAqZCwgKmRpLCAqdiwgKms7CisgICAgUHlfc3NpemVfdCBpOworICAgIGNoYXIgKnJldiA9ICIxLjcxIjsgICAgICAgICAvKiBYWFggd2hlbiBkb2VzIHRoaXMgY2hhbmdlPyAqLworICAgIFB5T2JqZWN0ICpmb3JtYXRfdmVyc2lvbjsKKyAgICBQeU9iamVjdCAqY29tcGF0aWJsZV9mb3JtYXRzOwogCi0JUHlfVFlQRSgmUGlja2xlcnR5cGUpID0gJlB5VHlwZV9UeXBlOwotCVB5X1RZUEUoJlVucGlja2xlcnR5cGUpID0gJlB5VHlwZV9UeXBlOwotCVB5X1RZUEUoJlBkYXRhVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfVFlQRSgmUGlja2xlcnR5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIFB5X1RZUEUoJlVucGlja2xlcnR5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIFB5X1RZUEUoJlBkYXRhVHlwZSkgPSAmUHlUeXBlX1R5cGU7CiAKLQkvKiBJbml0aWFsaXplIHNvbWUgcGllY2VzLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG1vZHVsZSBjcmVhdGlvbiwKLQkgKiBzbyB3ZSdyZSBmb3JjZWQgdG8gdXNlIGEgdGVtcG9yYXJ5IGRpY3Rpb25hcnkuIDooCi0JICovCi0JZGkgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFkaSkgcmV0dXJuOwotCWlmIChpbml0X3N0dWZmKGRpKSA8IDApIHJldHVybjsKKyAgICAvKiBJbml0aWFsaXplIHNvbWUgcGllY2VzLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG1vZHVsZSBjcmVhdGlvbiwKKyAgICAgKiBzbyB3ZSdyZSBmb3JjZWQgdG8gdXNlIGEgdGVtcG9yYXJ5IGRpY3Rpb25hcnkuIDooCisgICAgICovCisgICAgZGkgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFkaSkgcmV0dXJuOworICAgIGlmIChpbml0X3N0dWZmKGRpKSA8IDApIHJldHVybjsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlNCgiY1BpY2tsZSIsIGNQaWNrbGVfbWV0aG9kcywKLQkJCSAgIGNQaWNrbGVfbW9kdWxlX2RvY3VtZW50YXRpb24sCi0JCQkgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJjUGlja2xlIiwgY1BpY2tsZV9tZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICBjUGlja2xlX21vZHVsZV9kb2N1bWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHJldik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fdmVyc2lvbl9fIiwgdik7Ci0JUHlfWERFQ1JFRih2KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHJldik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fdmVyc2lvbl9fIiwgdik7CisgICAgUHlfWERFQ1JFRih2KTsKIAotCS8qIENvcHkgZGF0YSBmcm9tIGRpLiBXYWFhLiAqLwotCWZvciAoaT0wOyBQeURpY3RfTmV4dChkaSwgJmksICZrLCAmdik7ICkgewotCQlpZiAoUHlPYmplY3RfU2V0SXRlbShkLCBrLCB2KSA8IDApIHsKLQkJCVB5X0RFQ1JFRihkaSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKGRpKTsKKyAgICAvKiBDb3B5IGRhdGEgZnJvbSBkaS4gV2FhYS4gKi8KKyAgICBmb3IgKGk9MDsgUHlEaWN0X05leHQoZGksICZpLCAmaywgJnYpOyApIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X1NldEl0ZW0oZCwgaywgdikgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihkaSk7CiAKLQlpID0gUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkhJR0hFU1RfUFJPVE9DT0wiLCBISUdIRVNUX1BST1RPQ09MKTsKLQlpZiAoaSA8IDApCi0JCXJldHVybjsKKyAgICBpID0gUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkhJR0hFU1RfUFJPVE9DT0wiLCBISUdIRVNUX1BST1RPQ09MKTsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIFRoZXNlIGFyZSBwdXJlbHkgaW5mb3JtYXRpb25hbDsgbm8gY29kZSB1c2VzIHRoZW0uICovCi0JLyogRmlsZSBmb3JtYXQgdmVyc2lvbiB3ZSB3cml0ZS4gKi8KLQlmb3JtYXRfdmVyc2lvbiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjIuMCIpOwotCS8qIEZvcm1hdCB2ZXJzaW9ucyB3ZSBjYW4gcmVhZC4gKi8KLQljb21wYXRpYmxlX2Zvcm1hdHMgPSBQeV9CdWlsZFZhbHVlKCJbc3Nzc3NdIiwKLQkJIjEuMCIsCS8qIE9yaWdpbmFsIHByb3RvY29sIDAgKi8KLQkJIjEuMSIsCS8qIFByb3RvY29sIDAgKyBJTlNUICovCi0JCSIxLjIiLAkvKiBPcmlnaW5hbCBwcm90b2NvbCAxICovCi0JCSIxLjMiLAkvKiBQcm90b2NvbCAxICsgQklORkxPQVQgKi8KLQkJIjIuMCIpOwkvKiBPcmlnaW5hbCBwcm90b2NvbCAyICovCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImZvcm1hdF92ZXJzaW9uIiwgZm9ybWF0X3ZlcnNpb24pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJjb21wYXRpYmxlX2Zvcm1hdHMiLCBjb21wYXRpYmxlX2Zvcm1hdHMpOwotCVB5X1hERUNSRUYoZm9ybWF0X3ZlcnNpb24pOwotCVB5X1hERUNSRUYoY29tcGF0aWJsZV9mb3JtYXRzKTsKKyAgICAvKiBUaGVzZSBhcmUgcHVyZWx5IGluZm9ybWF0aW9uYWw7IG5vIGNvZGUgdXNlcyB0aGVtLiAqLworICAgIC8qIEZpbGUgZm9ybWF0IHZlcnNpb24gd2Ugd3JpdGUuICovCisgICAgZm9ybWF0X3ZlcnNpb24gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIyLjAiKTsKKyAgICAvKiBGb3JtYXQgdmVyc2lvbnMgd2UgY2FuIHJlYWQuICovCisgICAgY29tcGF0aWJsZV9mb3JtYXRzID0gUHlfQnVpbGRWYWx1ZSgiW3Nzc3NzXSIsCisgICAgICAgICIxLjAiLCAgICAgICAgICAvKiBPcmlnaW5hbCBwcm90b2NvbCAwICovCisgICAgICAgICIxLjEiLCAgICAgICAgICAvKiBQcm90b2NvbCAwICsgSU5TVCAqLworICAgICAgICAiMS4yIiwgICAgICAgICAgLyogT3JpZ2luYWwgcHJvdG9jb2wgMSAqLworICAgICAgICAiMS4zIiwgICAgICAgICAgLyogUHJvdG9jb2wgMSArIEJJTkZMT0FUICovCisgICAgICAgICIyLjAiKTsgICAgICAgICAvKiBPcmlnaW5hbCBwcm90b2NvbCAyICovCisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImZvcm1hdF92ZXJzaW9uIiwgZm9ybWF0X3ZlcnNpb24pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJjb21wYXRpYmxlX2Zvcm1hdHMiLCBjb21wYXRpYmxlX2Zvcm1hdHMpOworICAgIFB5X1hERUNSRUYoZm9ybWF0X3ZlcnNpb24pOworICAgIFB5X1hERUNSRUYoY29tcGF0aWJsZV9mb3JtYXRzKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY1N0cmluZ0lPLmMgYi9Nb2R1bGVzL2NTdHJpbmdJTy5jCmluZGV4IDgwNTg4YmYuLjZhYTNkNWQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY1N0cmluZ0lPLmMKKysrIGIvTW9kdWxlcy9jU3RyaW5nSU8uYwpAQCAtMzMsNyArMzMsNyBAQAogIlxuIgogImNTdHJpbmdJTy5jLHYgMS4yOSAxOTk5LzA2LzE1IDE0OjEwOjI3IGppbSBFeHBcbiIpOwogCi0vKiBEZWNsYXJhdGlvbiBmb3IgZmlsZS1saWtlIG9iamVjdHMgdGhhdCBtYW5hZ2UgZGF0YSBhcyBzdHJpbmdzIAorLyogRGVjbGFyYXRpb24gZm9yIGZpbGUtbGlrZSBvYmplY3RzIHRoYXQgbWFuYWdlIGRhdGEgYXMgc3RyaW5ncwogCiAgICBUaGUgSU9vYmplY3QgdHlwZSBzaG91bGQgYmUgdGhvdWdoIG9mIGFzIGEgY29tbW9uIGJhc2UgdHlwZSBmb3IKICAgIElvYmplY3RzLCB3aGljaCBwcm92aWRlIGlucHV0IChyZWFkLW9ubHkpIFN0cmluZ0lPIG9iamVjdHMgYW5kCkBAIC03NywzNyArNzcsMzcgQEAKIAogc3RhdGljIGludAogSU9fX29wZW5jaGVjayhJT29iamVjdCAqc2VsZikgewotICAgICAgICBpZiAoIXNlbGYtPmJ1ZikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAxOworICAgIGlmICghc2VsZi0+YnVmKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9fZ2V0X2Nsb3NlZChJT29iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlfRmFsc2U7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5X0ZhbHNlOwogCi0JaWYgKHNlbGYtPmJ1ZiA9PSBOVUxMKQotCQlyZXN1bHQgPSBQeV9UcnVlOwotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHNlbGYtPmJ1ZiA9PSBOVUxMKQorICAgICAgICByZXN1bHQgPSBQeV9UcnVlOworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBmaWxlX2dldHNldGxpc3RbXSA9IHsKLQl7ImNsb3NlZCIsIChnZXR0ZXIpSU9fZ2V0X2Nsb3NlZCwgTlVMTCwgIlRydWUgaWYgdGhlIGZpbGUgaXMgY2xvc2VkIn0sCi0JezB9LAorICAgIHsiY2xvc2VkIiwgKGdldHRlcilJT19nZXRfY2xvc2VkLCBOVUxMLCAiVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjbG9zZWQifSwKKyAgICB7MH0sCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9fZmx1c2goSU9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpIHsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihJT19nZXR2YWxfX2RvY19fLApAQCAtMTE4LDM3ICsxMTgsMzcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIElPX2NnZXR2YWwoUHlPYmplY3QgKnNlbGYpIHsKLSAgICAgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiBOVUxMOwotICAgICAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5wb3MgPj0gMCk7Ci0gICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoKElPb2JqZWN0KilzZWxmKS0+YnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJT29iamVjdCopc2VsZiktPnBvcyk7CisgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiBOVUxMOworICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA+PSAwKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKChJT29iamVjdCopc2VsZiktPmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJT29iamVjdCopc2VsZiktPnBvcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJT19nZXR2YWwoSU9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp1c2VfcG9zPVB5X05vbmU7Ci0gICAgICAgIFB5X3NzaXplX3QgczsKKyAgICBQeU9iamVjdCAqdXNlX3Bvcz1QeV9Ob25lOworICAgIFB5X3NzaXplX3QgczsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsImdldHZhbCIsIDAsIDEsJnVzZV9wb3MpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywiZ2V0dmFsIiwgMCwgMSwmdXNlX3BvcykpIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmIChQeU9iamVjdF9Jc1RydWUodXNlX3BvcykpIHsKLSAgICAgICAgICAgICAgICAgIHM9c2VsZi0+cG9zOwotICAgICAgICAgICAgICAgICAgaWYgKHMgPiBzZWxmLT5zdHJpbmdfc2l6ZSkgcz1zZWxmLT5zdHJpbmdfc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzPXNlbGYtPnN0cmluZ19zaXplOwotICAgICAgICBhc3NlcnQoc2VsZi0+cG9zID49IDApOwotICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+YnVmLCBzKTsKKyAgICBpZiAoUHlPYmplY3RfSXNUcnVlKHVzZV9wb3MpKSB7CisgICAgICAgICAgICAgIHM9c2VsZi0+cG9zOworICAgICAgICAgICAgICBpZiAocyA+IHNlbGYtPnN0cmluZ19zaXplKSBzPXNlbGYtPnN0cmluZ19zaXplOworICAgIH0KKyAgICBlbHNlCisgICAgICAgICAgICAgIHM9c2VsZi0+c3RyaW5nX3NpemU7CisgICAgYXNzZXJ0KHNlbGYtPnBvcyA+PSAwKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+YnVmLCBzKTsKIH0KIAogUHlEb2NfU1RSVkFSKElPX2lzYXR0eV9fZG9jX18sICJpc2F0dHkoKTogYWx3YXlzIHJldHVybnMgMCIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9faXNhdHR5KElPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7Ci0gICAgICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7Ci0gICAgICAgIHJldHVybiBQeV9GYWxzZTsKKyAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgcmV0dXJuIFB5X0ZhbHNlOwogfQogCiBQeURvY19TVFJWQVIoSU9fcmVhZF9fZG9jX18sCkBAIC0xNTYsMTE0ICsxNTYsMTE0IEBACiAKIHN0YXRpYyBpbnQKIElPX2NyZWFkKFB5T2JqZWN0ICpzZWxmLCBjaGFyICoqb3V0cHV0LCBQeV9zc2l6ZV90ICBuKSB7Ci0gICAgICAgIFB5X3NzaXplX3QgbDsKKyAgICBQeV9zc2l6ZV90IGw7CiAKLSAgICAgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiAtMTsKLSAgICAgICAgYXNzZXJ0KElPT09CSkVDVChzZWxmKS0+cG9zID49IDApOwotICAgICAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5zdHJpbmdfc2l6ZSA+PSAwKTsKLSAgICAgICAgbCA9ICgoSU9vYmplY3QqKXNlbGYpLT5zdHJpbmdfc2l6ZSAtICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7ICAKLSAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBsKSB7Ci0gICAgICAgICAgICAgICAgbiA9IGw7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPCAwKSBuPTA7Ci0gICAgICAgIH0KKyAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIC0xOworICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA+PSAwKTsKKyAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5zdHJpbmdfc2l6ZSA+PSAwKTsKKyAgICBsID0gKChJT29iamVjdCopc2VsZiktPnN0cmluZ19zaXplIC0gKChJT29iamVjdCopc2VsZiktPnBvczsKKyAgICBpZiAobiA8IDAgfHwgbiA+IGwpIHsKKyAgICAgICAgbiA9IGw7CisgICAgICAgIGlmIChuIDwgMCkgbj0wOworICAgIH0KIAotICAgICAgICAqb3V0cHV0PSgoSU9vYmplY3QqKXNlbGYpLT5idWYgKyAoKElPb2JqZWN0KilzZWxmKS0+cG9zOwotICAgICAgICAoKElPb2JqZWN0KilzZWxmKS0+cG9zICs9IG47Ci0gICAgICAgIHJldHVybiBuOworICAgICpvdXRwdXQ9KChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7CisgICAgKChJT29iamVjdCopc2VsZiktPnBvcyArPSBuOworICAgIHJldHVybiBuOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9fcmVhZChJT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgICAgICAgUHlfc3NpemVfdCBuID0gLTE7Ci0gICAgICAgIGNoYXIgKm91dHB1dCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBuID0gLTE7CisgICAgY2hhciAqb3V0cHV0ID0gTlVMTDsKIAotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnJlYWQiLCAmbikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cmVhZCIsICZuKSkgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKCAobj1JT19jcmVhZCgoUHlPYmplY3QqKXNlbGYsJm91dHB1dCxuKSkgPCAwKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIChuPUlPX2NyZWFkKChQeU9iamVjdCopc2VsZiwmb3V0cHV0LG4pKSA8IDApIHJldHVybiBOVUxMOwogCi0gICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvdXRwdXQsIG4pOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvdXRwdXQsIG4pOwogfQogCiBQeURvY19TVFJWQVIoSU9fcmVhZGxpbmVfX2RvY19fLCAicmVhZGxpbmUoKSAtLSBSZWFkIG9uZSBsaW5lIik7CiAKIHN0YXRpYyBpbnQKIElPX2NyZWFkbGluZShQeU9iamVjdCAqc2VsZiwgY2hhciAqKm91dHB1dCkgewotICAgICAgICBjaGFyICpuLCAqczsKLSAgICAgICAgUHlfc3NpemVfdCBsOworICAgIGNoYXIgKm4sICpzOworICAgIFB5X3NzaXplX3QgbDsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIC0xOworICAgIGlmICghSU9fX29wZW5jaGVjayhJT09PQkpFQ1Qoc2VsZikpKSByZXR1cm4gLTE7CiAKLSAgICAgICAgZm9yIChuID0gKChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5wb3MsCi0gICAgICAgICAgICAgICBzID0gKChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5zdHJpbmdfc2l6ZTsgCi0gICAgICAgICAgICAgbiA8IHMgJiYgKm4gIT0gJ1xuJzsgbisrKTsKKyAgICBmb3IgKG4gPSAoKElPb2JqZWN0KilzZWxmKS0+YnVmICsgKChJT29iamVjdCopc2VsZiktPnBvcywKKyAgICAgICAgICAgcyA9ICgoSU9vYmplY3QqKXNlbGYpLT5idWYgKyAoKElPb2JqZWN0KilzZWxmKS0+c3RyaW5nX3NpemU7CisgICAgICAgICBuIDwgcyAmJiAqbiAhPSAnXG4nOyBuKyspOwogCi0gICAgICAgIGlmIChuIDwgcykgbisrOworICAgIGlmIChuIDwgcykgbisrOwogCi0gICAgICAgICpvdXRwdXQ9KChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7Ci0gICAgICAgIGwgPSBuIC0gKChJT29iamVjdCopc2VsZiktPmJ1ZiAtICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7CisgICAgKm91dHB1dD0oKElPb2JqZWN0KilzZWxmKS0+YnVmICsgKChJT29iamVjdCopc2VsZiktPnBvczsKKyAgICBsID0gbiAtICgoSU9vYmplY3QqKXNlbGYpLT5idWYgLSAoKElPb2JqZWN0KilzZWxmKS0+cG9zOwogCi0gICAgICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA8PSBQWV9TU0laRV9UX01BWCAtIGwpOwotICAgICAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5wb3MgPj0gMCk7Ci0gICAgICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnN0cmluZ19zaXplID49IDApOworICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA8PSBQWV9TU0laRV9UX01BWCAtIGwpOworICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA+PSAwKTsKKyAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5zdHJpbmdfc2l6ZSA+PSAwKTsKIAotICAgICAgICAoKElPb2JqZWN0KilzZWxmKS0+cG9zICs9IGw7Ci0gICAgICAgIHJldHVybiAoaW50KWw7CisgICAgKChJT29iamVjdCopc2VsZiktPnBvcyArPSBsOworICAgIHJldHVybiAoaW50KWw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJT19yZWFkbGluZShJT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgICAgICAgaW50IG4sIG09LTE7Ci0gICAgICAgIGNoYXIgKm91dHB1dDsKKyAgICBpbnQgbiwgbT0tMTsKKyAgICBjaGFyICpvdXRwdXQ7CiAKLSAgICAgICAgaWYgKGFyZ3MpCi0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpyZWFkbGluZSIsICZtKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZ3MpCisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6cmVhZGxpbmUiLCAmbSkpIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmKCAobj1JT19jcmVhZGxpbmUoKFB5T2JqZWN0KilzZWxmLCZvdXRwdXQpKSA8IDApIHJldHVybiBOVUxMOwotICAgICAgICBpZiAobSA+PSAwICYmIG0gPCBuKSB7Ci0gICAgICAgICAgICAgICAgbSA9IG4gLSBtOwotICAgICAgICAgICAgICAgIG4gLT0gbTsKLSAgICAgICAgICAgICAgICBzZWxmLT5wb3MgLT0gbTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5wb3MgPj0gMCk7Ci0gICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvdXRwdXQsIG4pOworICAgIGlmKCAobj1JT19jcmVhZGxpbmUoKFB5T2JqZWN0KilzZWxmLCZvdXRwdXQpKSA8IDApIHJldHVybiBOVUxMOworICAgIGlmIChtID49IDAgJiYgbSA8IG4pIHsKKyAgICAgICAgbSA9IG4gLSBtOworICAgICAgICBuIC09IG07CisgICAgICAgIHNlbGYtPnBvcyAtPSBtOworICAgIH0KKyAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5wb3MgPj0gMCk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG91dHB1dCwgbik7CiB9CiAKIFB5RG9jX1NUUlZBUihJT19yZWFkbGluZXNfX2RvY19fLCAicmVhZGxpbmVzKCkgLS0gUmVhZCBhbGwgbGluZXMiKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIElPX3JlYWRsaW5lcyhJT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLQlpbnQgbjsKLQljaGFyICpvdXRwdXQ7Ci0JUHlPYmplY3QgKnJlc3VsdCwgKmxpbmU7Ci0gICAgICAgIGludCBoaW50ID0gMCwgbGVuZ3RoID0gMDsKLQkKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpyZWFkbGluZXMiLCAmaGludCkpIHJldHVybiBOVUxMOworICAgIGludCBuOworICAgIGNoYXIgKm91dHB1dDsKKyAgICBQeU9iamVjdCAqcmVzdWx0LCAqbGluZTsKKyAgICBpbnQgaGludCA9IDAsIGxlbmd0aCA9IDA7CiAKLQlyZXN1bHQgPSBQeUxpc3RfTmV3KDApOwotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnJlYWRsaW5lcyIsICZoaW50KSkgcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoMSl7Ci0JCWlmICggKG4gPSBJT19jcmVhZGxpbmUoKFB5T2JqZWN0KilzZWxmLCZvdXRwdXQpKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKLQkJaWYgKG4gPT0gMCkKLQkJCWJyZWFrOwotCQlsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUgKG91dHB1dCwgbik7Ci0JCWlmICghbGluZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKLQkJaWYgKFB5TGlzdF9BcHBlbmQgKHJlc3VsdCwgbGluZSkgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRiAobGluZSk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlQeV9ERUNSRUYgKGxpbmUpOwotICAgICAgICAgICAgICAgIGxlbmd0aCArPSBuOwotICAgICAgICAgICAgICAgIGlmIChoaW50ID4gMCAmJiBsZW5ndGggPj0gaGludCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotIGVycjoKLSAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB3aGlsZSAoMSl7CisgICAgICAgIGlmICggKG4gPSBJT19jcmVhZGxpbmUoKFB5T2JqZWN0KilzZWxmLCZvdXRwdXQpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUgKG91dHB1dCwgbik7CisgICAgICAgIGlmICghbGluZSkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZCAocmVzdWx0LCBsaW5lKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGIChsaW5lKTsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRiAobGluZSk7CisgICAgICAgIGxlbmd0aCArPSBuOworICAgICAgICBpZiAoaGludCA+IDAgJiYgbGVuZ3RoID49IGhpbnQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyBlcnI6CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihJT19yZXNldF9fZG9jX18sCkBAIC0yNzIsMTIgKzI3MiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIElPX3Jlc2V0KElPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7CiAKLSAgICAgICAgaWYgKCFJT19fb3BlbmNoZWNrKHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOwogCi0gICAgICAgIHNlbGYtPnBvcyA9IDA7CisgICAgc2VsZi0+cG9zID0gMDsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKElPX3RlbGxfX2RvY19fLCAidGVsbCgpIC0tIGdldCB0aGUgY3VycmVudCBwb3NpdGlvbi4iKTsKQEAgLTI4NSwxMCArMjg1LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogSU9fdGVsbChJT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewogCi0gICAgICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFJT19fb3BlbmNoZWNrKHNlbGYpKSByZXR1cm4gTlVMTDsKIAotICAgICAgICBhc3NlcnQoc2VsZi0+cG9zID49IDApOwotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3Qoc2VsZi0+cG9zKTsKKyAgICBhc3NlcnQoc2VsZi0+cG9zID49IDApOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChzZWxmLT5wb3MpOwogfQogCiBQeURvY19TVFJWQVIoSU9fdHJ1bmNhdGVfX2RvY19fLApAQCAtMjk2LDQyICsyOTYsNDIgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIElPX3RydW5jYXRlKElPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotICAgICAgICBQeV9zc2l6ZV90IHBvcyA9IC0xOwotCQotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnRydW5jYXRlIiwgJnBvcykpIHJldHVybiBOVUxMOworICAgIFB5X3NzaXplX3QgcG9zID0gLTE7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDApIHsKLQkJLyogTm8gYXJndW1lbnQgcGFzc2VkLCB0cnVuY2F0ZSB0byBjdXJyZW50IHBvc2l0aW9uICovCi0JCXBvcyA9IHNlbGYtPnBvczsKLQl9CisgICAgaWYgKCFJT19fb3BlbmNoZWNrKHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnRydW5jYXRlIiwgJnBvcykpIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmIChwb3MgPCAwKSB7Ci0JCWVycm5vID0gRUlOVkFMOwotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDApIHsKKyAgICAgICAgLyogTm8gYXJndW1lbnQgcGFzc2VkLCB0cnVuY2F0ZSB0byBjdXJyZW50IHBvc2l0aW9uICovCisgICAgICAgIHBvcyA9IHNlbGYtPnBvczsKKyAgICB9CiAKLSAgICAgICAgaWYgKHNlbGYtPnN0cmluZ19zaXplID4gcG9zKSBzZWxmLT5zdHJpbmdfc2l6ZSA9IHBvczsKLSAgICAgICAgc2VsZi0+cG9zID0gc2VsZi0+c3RyaW5nX3NpemU7CisgICAgaWYgKHBvcyA8IDApIHsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHNlbGYtPnN0cmluZ19zaXplID4gcG9zKSBzZWxmLT5zdHJpbmdfc2l6ZSA9IHBvczsKKyAgICBzZWxmLT5wb3MgPSBzZWxmLT5zdHJpbmdfc2l6ZTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIElPX2l0ZXJuZXh0KElvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKm5leHQ7Ci0JbmV4dCA9IElPX3JlYWRsaW5lKChJT29iamVjdCAqKXNlbGYsIE5VTEwpOwotCWlmICghbmV4dCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeVN0cmluZ19HRVRfU0laRShuZXh0KSkgewotCQlQeV9ERUNSRUYobmV4dCk7Ci0JCVB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbmV4dDsKKyAgICBQeU9iamVjdCAqbmV4dDsKKyAgICBuZXh0ID0gSU9fcmVhZGxpbmUoKElPb2JqZWN0ICopc2VsZiwgTlVMTCk7CisgICAgaWYgKCFuZXh0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5U3RyaW5nX0dFVF9TSVpFKG5leHQpKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXh0KTsKKyAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuZXh0OwogfQogCiAKQEAgLTM0NSw0MSArMzQ1LDQxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBPX3NlZWsoT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLQlQeV9zc2l6ZV90IHBvc2l0aW9uOwotCWludCBtb2RlID0gMDsKKyAgICBQeV9zc2l6ZV90IHBvc2l0aW9uOworICAgIGludCBtb2RlID0gMDsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxpOnNlZWsiLCAmcG9zaXRpb24sICZtb2RlKSkgCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxpOnNlZWsiLCAmcG9zaXRpb24sICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKG1vZGUgPT0gMikgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IHNlbGYtPnN0cmluZ19zaXplOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1vZGUgPT0gMSkgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IHNlbGYtPnBvczsKLSAgICAgICAgfQorICAgIGlmIChtb2RlID09IDIpIHsKKyAgICAgICAgcG9zaXRpb24gKz0gc2VsZi0+c3RyaW5nX3NpemU7CisgICAgfQorICAgIGVsc2UgaWYgKG1vZGUgPT0gMSkgeworICAgICAgICBwb3NpdGlvbiArPSBzZWxmLT5wb3M7CisgICAgfQogCi0gICAgICAgIGlmIChwb3NpdGlvbiA+IHNlbGYtPmJ1Zl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICBjaGFyICpuZXdidWY7Ci0gICAgICAgICAgICAgICAgICBzZWxmLT5idWZfc2l6ZSo9MjsKLSAgICAgICAgICAgICAgICAgIGlmIChzZWxmLT5idWZfc2l6ZSA8PSBwb3NpdGlvbikgc2VsZi0+YnVmX3NpemU9cG9zaXRpb24rMTsKLQkJICBuZXdidWYgPSAoY2hhciopIHJlYWxsb2Moc2VsZi0+YnVmLHNlbGYtPmJ1Zl9zaXplKTsKLSAgICAgICAgICAgICAgICAgIGlmICghbmV3YnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgZnJlZShzZWxmLT5idWYpOwotICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmJ1ZiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgc2VsZi0+YnVmX3NpemU9c2VsZi0+cG9zPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHNlbGYtPmJ1ZiA9IG5ld2J1ZjsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb249MDsKKyAgICBpZiAocG9zaXRpb24gPiBzZWxmLT5idWZfc2l6ZSkgeworICAgICAgICAgICAgICBjaGFyICpuZXdidWY7CisgICAgICAgICAgICAgIHNlbGYtPmJ1Zl9zaXplKj0yOworICAgICAgICAgICAgICBpZiAoc2VsZi0+YnVmX3NpemUgPD0gcG9zaXRpb24pIHNlbGYtPmJ1Zl9zaXplPXBvc2l0aW9uKzE7CisgICAgICAgICAgICAgIG5ld2J1ZiA9IChjaGFyKikgcmVhbGxvYyhzZWxmLT5idWYsc2VsZi0+YnVmX3NpemUpOworICAgICAgICAgICAgICBpZiAoIW5ld2J1ZikgeworICAgICAgICAgICAgICAgICAgZnJlZShzZWxmLT5idWYpOworICAgICAgICAgICAgICAgICAgc2VsZi0+YnVmID0gMDsKKyAgICAgICAgICAgICAgICAgIHNlbGYtPmJ1Zl9zaXplPXNlbGYtPnBvcz0wOworICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzZWxmLT5idWYgPSBuZXdidWY7CisgICAgICB9CisgICAgZWxzZSBpZiAocG9zaXRpb24gPCAwKSBwb3NpdGlvbj0wOwogCi0gICAgICAgIHNlbGYtPnBvcz1wb3NpdGlvbjsKKyAgICBzZWxmLT5wb3M9cG9zaXRpb247CiAKLSAgICAgICAgd2hpbGUgKC0tcG9zaXRpb24gPj0gc2VsZi0+c3RyaW5nX3NpemUpIHNlbGYtPmJ1Zltwb3NpdGlvbl09MDsKKyAgICB3aGlsZSAoLS1wb3NpdGlvbiA+PSBzZWxmLT5zdHJpbmdfc2l6ZSkgc2VsZi0+YnVmW3Bvc2l0aW9uXT0wOwogCi0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoT193cml0ZV9fZG9jX18sCkBAIC0zODksNjcgKzM4OSw2NyBAQAogCiBzdGF0aWMgaW50CiBPX2N3cml0ZShQeU9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqYywgUHlfc3NpemVfdCAgbCkgewotICAgICAgICBQeV9zc2l6ZV90IG5ld2w7Ci0gICAgICAgIE9vYmplY3QgKm9zZWxmOwotICAgICAgICBjaGFyICpuZXdidWY7CisgICAgUHlfc3NpemVfdCBuZXdsOworICAgIE9vYmplY3QgKm9zZWxmOworICAgIGNoYXIgKm5ld2J1ZjsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIC0xOwotICAgICAgICBvc2VsZiA9IChPb2JqZWN0ICopc2VsZjsKKyAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIC0xOworICAgIG9zZWxmID0gKE9vYmplY3QgKilzZWxmOwogCi0gICAgICAgIG5ld2wgPSBvc2VsZi0+cG9zK2w7Ci0gICAgICAgIGlmIChuZXdsID49IG9zZWxmLT5idWZfc2l6ZSkgewotICAgICAgICAgICAgb3NlbGYtPmJ1Zl9zaXplICo9IDI7Ci0gICAgICAgICAgICBpZiAob3NlbGYtPmJ1Zl9zaXplIDw9IG5ld2wpIHsKLQkJICAgIGFzc2VydChuZXdsICsgMSA8IElOVF9NQVgpOwotICAgICAgICAgICAgICAgICAgICBvc2VsZi0+YnVmX3NpemUgPSAoaW50KShuZXdsKzEpOwotCSAgICB9Ci0gICAgICAgICAgICBuZXdidWYgPSAoY2hhciopcmVhbGxvYyhvc2VsZi0+YnVmLCBvc2VsZi0+YnVmX3NpemUpOwotCSAgICBpZiAoIW5ld2J1ZikgewotICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsIm91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShvc2VsZi0+YnVmKTsKLSAgICAgICAgICAgICAgICAgICAgb3NlbGYtPmJ1ZiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG9zZWxmLT5idWZfc2l6ZSA9IG9zZWxmLT5wb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9zZWxmLT5idWYgPSBuZXdidWY7Ci0gICAgICAgICAgfQotCi0gICAgICAgIG1lbWNweShvc2VsZi0+YnVmK29zZWxmLT5wb3MsYyxsKTsKLQotCWFzc2VydChvc2VsZi0+cG9zICsgbCA8IElOVF9NQVgpOwotICAgICAgICBvc2VsZi0+cG9zICs9IChpbnQpbDsKLQotICAgICAgICBpZiAob3NlbGYtPnN0cmluZ19zaXplIDwgb3NlbGYtPnBvcykgewotICAgICAgICAgICAgb3NlbGYtPnN0cmluZ19zaXplID0gb3NlbGYtPnBvczsKKyAgICBuZXdsID0gb3NlbGYtPnBvcytsOworICAgIGlmIChuZXdsID49IG9zZWxmLT5idWZfc2l6ZSkgeworICAgICAgICBvc2VsZi0+YnVmX3NpemUgKj0gMjsKKyAgICAgICAgaWYgKG9zZWxmLT5idWZfc2l6ZSA8PSBuZXdsKSB7CisgICAgICAgICAgICBhc3NlcnQobmV3bCArIDEgPCBJTlRfTUFYKTsKKyAgICAgICAgICAgIG9zZWxmLT5idWZfc2l6ZSA9IChpbnQpKG5ld2wrMSk7CiAgICAgICAgIH0KKyAgICAgICAgbmV3YnVmID0gKGNoYXIqKXJlYWxsb2Mob3NlbGYtPmJ1Ziwgb3NlbGYtPmJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKCFuZXdidWYpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwib3V0IG9mIG1lbW9yeSIpOworICAgICAgICAgICAgZnJlZShvc2VsZi0+YnVmKTsKKyAgICAgICAgICAgIG9zZWxmLT5idWYgPSAwOworICAgICAgICAgICAgb3NlbGYtPmJ1Zl9zaXplID0gb3NlbGYtPnBvcyA9IDA7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICBvc2VsZi0+YnVmID0gbmV3YnVmOworICAgICAgfQogCi0gICAgICAgIHJldHVybiAoaW50KWw7CisgICAgbWVtY3B5KG9zZWxmLT5idWYrb3NlbGYtPnBvcyxjLGwpOworCisgICAgYXNzZXJ0KG9zZWxmLT5wb3MgKyBsIDwgSU5UX01BWCk7CisgICAgb3NlbGYtPnBvcyArPSAoaW50KWw7CisKKyAgICBpZiAob3NlbGYtPnN0cmluZ19zaXplIDwgb3NlbGYtPnBvcykgeworICAgICAgICBvc2VsZi0+c3RyaW5nX3NpemUgPSBvc2VsZi0+cG9zOworICAgIH0KKworICAgIHJldHVybiAoaW50KWw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBPX3dyaXRlKE9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gICAgICAgIGNoYXIgKmM7Ci0gICAgICAgIGludCBsOworICAgIGNoYXIgKmM7CisgICAgaW50IGw7CiAKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0Izp3cml0ZSIsICZjLCAmbCkpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCM6d3JpdGUiLCAmYywgJmwpKSByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAoT19jd3JpdGUoKFB5T2JqZWN0KilzZWxmLGMsbCkgPCAwKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoT19jd3JpdGUoKFB5T2JqZWN0KilzZWxmLGMsbCkgPCAwKSByZXR1cm4gTlVMTDsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKE9fY2xvc2VfX2RvY19fLCAiY2xvc2UoKTogZXhwbGljaXRseSByZWxlYXNlIHJlc291cmNlcyBoZWxkLiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogT19jbG9zZShPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7Ci0gICAgICAgIGlmIChzZWxmLT5idWYgIT0gTlVMTCkgZnJlZShzZWxmLT5idWYpOwotICAgICAgICBzZWxmLT5idWYgPSBOVUxMOworICAgIGlmIChzZWxmLT5idWYgIT0gTlVMTCkgZnJlZShzZWxmLT5idWYpOworICAgIHNlbGYtPmJ1ZiA9IE5VTEw7CiAKLSAgICAgICAgc2VsZi0+cG9zID0gc2VsZi0+c3RyaW5nX3NpemUgPSBzZWxmLT5idWZfc2l6ZSA9IDA7CisgICAgc2VsZi0+cG9zID0gc2VsZi0+c3RyaW5nX3NpemUgPSBzZWxmLT5idWZfc2l6ZSA9IDA7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihPX3dyaXRlbGluZXNfX2RvY19fLApAQCAtNDU5LDMyICs0NTksMzIgQEAKICJwcm9kdWNpbmcgc3RyaW5ncy4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgd3JpdGUoKSBmb3IgZWFjaCBzdHJpbmcuIik7CiBzdGF0aWMgUHlPYmplY3QgKgogT193cml0ZWxpbmVzKE9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0JUHlPYmplY3QgKml0LCAqczsKLQkKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoYXJncyk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgocyA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQlQeV9zc2l6ZV90IG47Ci0JCWNoYXIgKmM7Ci0JCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUocywgJmMsICZuKSA9PSAtMSkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X0RFQ1JFRihzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChPX2N3cml0ZSgoUHlPYmplY3QgKilzZWxmLCBjLCBuKSA9PSAtMSkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X0RFQ1JFRihzKTsKLQkJCXJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgIFB5T2JqZWN0ICppdCwgKnM7CisKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoYXJncyk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdoaWxlICgocyA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBQeV9zc2l6ZV90IG47CisgICAgICAgIGNoYXIgKmM7CisgICAgICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUocywgJmMsICZuKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChPX2N3cml0ZSgoUHlPYmplY3QgKilzZWxmLCBjLCBuKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICB9CisgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKICAgICAgICB9CiAKICAgICAgICBQeV9ERUNSRUYoaXQpOwogCiAgICAgICAgLyogU2VlIGlmIFB5SXRlcl9OZXh0IGZhaWxlZCAqLwogICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgICAgUHlfUkVUVVJOX05PTkU7CiB9CkBAIC00OTMsOTIgKzQ5Myw5MiBAQAogICB7ImZsdXNoIiwgICAgIChQeUNGdW5jdGlvbilJT19mbHVzaCwgICAgTUVUSF9OT0FSR1MsICBJT19mbHVzaF9fZG9jX199LAogICB7ImdldHZhbHVlIiwgIChQeUNGdW5jdGlvbilJT19nZXR2YWwsICAgTUVUSF9WQVJBUkdTLCBJT19nZXR2YWxfX2RvY19ffSwKICAgeyJpc2F0dHkiLCAgICAoUHlDRnVuY3Rpb24pSU9faXNhdHR5LCAgIE1FVEhfTk9BUkdTLCAgSU9faXNhdHR5X19kb2NfX30sCi0gIHsicmVhZCIsCShQeUNGdW5jdGlvbilJT19yZWFkLCAgICAgTUVUSF9WQVJBUkdTLCBJT19yZWFkX19kb2NfX30sCi0gIHsicmVhZGxpbmUiLAkoUHlDRnVuY3Rpb24pSU9fcmVhZGxpbmUsIE1FVEhfVkFSQVJHUywgSU9fcmVhZGxpbmVfX2RvY19ffSwKLSAgeyJyZWFkbGluZXMiLAkoUHlDRnVuY3Rpb24pSU9fcmVhZGxpbmVzLE1FVEhfVkFSQVJHUywgSU9fcmVhZGxpbmVzX19kb2NfX30sCi0gIHsicmVzZXQiLAkoUHlDRnVuY3Rpb24pSU9fcmVzZXQsCSAgTUVUSF9OT0FSR1MsICBJT19yZXNldF9fZG9jX199LAorICB7InJlYWQiLCAgICAgIChQeUNGdW5jdGlvbilJT19yZWFkLCAgICAgTUVUSF9WQVJBUkdTLCBJT19yZWFkX19kb2NfX30sCisgIHsicmVhZGxpbmUiLCAgKFB5Q0Z1bmN0aW9uKUlPX3JlYWRsaW5lLCBNRVRIX1ZBUkFSR1MsIElPX3JlYWRsaW5lX19kb2NfX30sCisgIHsicmVhZGxpbmVzIiwgKFB5Q0Z1bmN0aW9uKUlPX3JlYWRsaW5lcyxNRVRIX1ZBUkFSR1MsIElPX3JlYWRsaW5lc19fZG9jX199LAorICB7InJlc2V0IiwgICAgIChQeUNGdW5jdGlvbilJT19yZXNldCwgICAgTUVUSF9OT0FSR1MsICBJT19yZXNldF9fZG9jX199LAogICB7InRlbGwiLCAgICAgIChQeUNGdW5jdGlvbilJT190ZWxsLCAgICAgTUVUSF9OT0FSR1MsICBJT190ZWxsX19kb2NfX30sCiAgIHsidHJ1bmNhdGUiLCAgKFB5Q0Z1bmN0aW9uKUlPX3RydW5jYXRlLCBNRVRIX1ZBUkFSR1MsIElPX3RydW5jYXRlX19kb2NfX30sCiAKICAgLyogUmVhZC13cml0ZSBTdHJpbmdJTyBzcGVjaWZpYyAgbWV0aG9kczogKi8KICAgeyJjbG9zZSIsICAgICAgKFB5Q0Z1bmN0aW9uKU9fY2xvc2UsICAgICAgTUVUSF9OT0FSR1MsICBPX2Nsb3NlX19kb2NfX30sCiAgIHsic2VlayIsICAgICAgIChQeUNGdW5jdGlvbilPX3NlZWssICAgICAgIE1FVEhfVkFSQVJHUywgT19zZWVrX19kb2NfX30sCi0gIHsid3JpdGUiLAkgKFB5Q0Z1bmN0aW9uKU9fd3JpdGUsICAgICAgTUVUSF9WQVJBUkdTLCBPX3dyaXRlX19kb2NfX30sCi0gIHsid3JpdGVsaW5lcyIsIChQeUNGdW5jdGlvbilPX3dyaXRlbGluZXMsIE1FVEhfTywJICBPX3dyaXRlbGluZXNfX2RvY19ffSwKLSAge05VTEwsCSBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgeyJ3cml0ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKU9fd3JpdGUsICAgICAgTUVUSF9WQVJBUkdTLCBPX3dyaXRlX19kb2NfX30sCisgIHsid3JpdGVsaW5lcyIsIChQeUNGdW5jdGlvbilPX3dyaXRlbGluZXMsIE1FVEhfTywgICAgICAgT193cml0ZWxpbmVzX19kb2NfX30sCisgIHtOVUxMLCAgICAgICAgIE5VTEx9ICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgT19tZW1iZXJsaXN0W10gPSB7Ci0JeyJzb2Z0c3BhY2UiLAlUX0lOVCwJb2Zmc2V0b2YoT29iamVjdCwgc29mdHNwYWNlKSwJMCwKLQkgImZsYWcgaW5kaWNhdGluZyB0aGF0IGEgc3BhY2UgbmVlZHMgdG8gYmUgcHJpbnRlZDsgdXNlZCBieSBwcmludCJ9LAotCSAvKiBnZXRhdHRyKGYsICJjbG9zZWQiKSBpcyBpbXBsZW1lbnRlZCB3aXRob3V0IHRoaXMgdGFibGUgKi8KLQl7TlVMTH0gLyogU2VudGluZWwgKi8KKyAgICB7InNvZnRzcGFjZSIsICAgICAgIFRfSU5ULCAgb2Zmc2V0b2YoT29iamVjdCwgc29mdHNwYWNlKSwgICAwLAorICAgICAiZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSBzcGFjZSBuZWVkcyB0byBiZSBwcmludGVkOyB1c2VkIGJ5IHByaW50In0sCisgICAgIC8qIGdldGF0dHIoZiwgImNsb3NlZCIpIGlzIGltcGxlbWVudGVkIHdpdGhvdXQgdGhpcyB0YWJsZSAqLworICAgIHtOVUxMfSAvKiBTZW50aW5lbCAqLwogfTsKIAogc3RhdGljIHZvaWQKIE9fZGVhbGxvYyhPb2JqZWN0ICpzZWxmKSB7Ci0gICAgICAgIGlmIChzZWxmLT5idWYgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBmcmVlKHNlbGYtPmJ1Zik7Ci0gICAgICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBpZiAoc2VsZi0+YnVmICE9IE5VTEwpCisgICAgICAgIGZyZWUoc2VsZi0+YnVmKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIFB5RG9jX1NUUlZBUihPdHlwZV9fZG9jX18sICJTaW1wbGUgdHlwZSBmb3Igb3V0cHV0IHRvIHN0cmluZ3MuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgT3R5cGUgPSB7CiAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAiY1N0cmluZ0lPLlN0cmluZ08iLCAgIAkvKnRwX25hbWUqLwotICBzaXplb2YoT29iamVjdCksICAgICAgIAkvKnRwX2Jhc2ljc2l6ZSovCi0gIDAsCSAgICAgICAJCQkvKnRwX2l0ZW1zaXplKi8KKyAgImNTdHJpbmdJTy5TdHJpbmdPIiwgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgc2l6ZW9mKE9vYmplY3QpLCAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgLyogbWV0aG9kcyAqLwotICAoZGVzdHJ1Y3RvcilPX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0gIDAsCQkJCS8qdHBfcHJpbnQqLwotICAwLAkJIAkJLyp0cF9nZXRhdHRyICovCi0gIDAsCQkgCQkvKnRwX3NldGF0dHIgKi8KLSAgMCwJCQkJLyp0cF9jb21wYXJlKi8KLSAgMCwJCQkJLyp0cF9yZXByKi8KLSAgMCwJCQkJLyp0cF9hc19udW1iZXIqLwotICAwLAkJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLSAgMCwJCQkJLyp0cF9hc19tYXBwaW5nKi8KLSAgMCwJCQkJLyp0cF9oYXNoKi8KLSAgMAksCQkJLyp0cF9jYWxsKi8KLSAgMCwJCQkJLyp0cF9zdHIqLwotICAwLAkJCQkvKnRwX2dldGF0dHJvICovCi0gIDAsCQkJCS8qdHBfc2V0YXR0cm8gKi8KLSAgMCwJCQkJLyp0cF9hc19idWZmZXIgKi8KLSAgUHlfVFBGTEFHU19ERUZBVUxULAkJLyp0cF9mbGFncyovCi0gIE90eXBlX19kb2NfXywgCQkvKnRwX2RvYyAqLwotICAwLAkJCQkvKnRwX3RyYXZlcnNlICovCi0gIDAsCQkJCS8qdHBfY2xlYXIgKi8KLSAgMCwJCQkJLyp0cF9yaWNoY29tcGFyZSAqLwotICAwLAkJCQkvKnRwX3dlYWtsaXN0b2Zmc2V0ICovCi0gIFB5T2JqZWN0X1NlbGZJdGVyLAkJLyp0cF9pdGVyICovCi0gIChpdGVybmV4dGZ1bmMpSU9faXRlcm5leHQsCS8qdHBfaXRlcm5leHQgKi8KLSAgT19tZXRob2RzLAkJCS8qdHBfbWV0aG9kcyAqLwotICBPX21lbWJlcmxpc3QsCQkJLyp0cF9tZW1iZXJzICovCi0gIGZpbGVfZ2V0c2V0bGlzdCwJCS8qdHBfZ2V0c2V0ICovCisgIChkZXN0cnVjdG9yKU9fZGVhbGxvYywgICAgICAgIC8qdHBfZGVhbGxvYyovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgIDAgICAgICwgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyICovCisgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICBPdHlwZV9fZG9jX18sICAgICAgICAgICAgICAgICAvKnRwX2RvYyAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0ICovCisgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgIC8qdHBfaXRlciAqLworICAoaXRlcm5leHRmdW5jKUlPX2l0ZXJuZXh0LCAgICAvKnRwX2l0ZXJuZXh0ICovCisgIE9fbWV0aG9kcywgICAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyAqLworICBPX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMgKi8KKyAgZmlsZV9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgLyp0cF9nZXRzZXQgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdPb2JqZWN0KGludCAgc2l6ZSkgewotICAgICAgICBPb2JqZWN0ICpzZWxmOworICAgIE9vYmplY3QgKnNlbGY7CiAKLSAgICAgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhPb2JqZWN0LCAmT3R5cGUpOwotICAgICAgICBpZiAoc2VsZiA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBzZWxmLT5wb3M9MDsKLSAgICAgICAgc2VsZi0+c3RyaW5nX3NpemUgPSAwOwotICAgICAgICBzZWxmLT5zb2Z0c3BhY2UgPSAwOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoT29iamVjdCwgJk90eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5wb3M9MDsKKyAgICBzZWxmLT5zdHJpbmdfc2l6ZSA9IDA7CisgICAgc2VsZi0+c29mdHNwYWNlID0gMDsKIAotICAgICAgICBzZWxmLT5idWYgPSAoY2hhciAqKW1hbGxvYyhzaXplKTsKLQlpZiAoIXNlbGYtPmJ1ZikgewotICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICAgICAgICBzZWxmLT5idWZfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICB9CisgICAgc2VsZi0+YnVmID0gKGNoYXIgKiltYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFzZWxmLT5idWYpIHsKKyAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCJvdXQgb2YgbWVtb3J5Iik7CisgICAgICAgICAgICAgIHNlbGYtPmJ1Zl9zaXplID0gMDsKKyAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KIAotICAgICAgICBzZWxmLT5idWZfc2l6ZT1zaXplOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIHNlbGYtPmJ1Zl9zaXplPXNpemU7CisgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKIH0KIAogLyogRW5kIG9mIGNvZGUgZm9yIFN0cmluZ08gb2JqZWN0cyAqLwpAQCAtNTg2LDMzICs1ODYsMzMgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIElfY2xvc2UoSW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewotICAgICAgICBQeV9DTEVBUihzZWxmLT5wYnVmKTsKLSAgICAgICAgc2VsZi0+YnVmID0gTlVMTDsKKyAgICBQeV9DTEVBUihzZWxmLT5wYnVmKTsKKyAgICBzZWxmLT5idWYgPSBOVUxMOwogCi0gICAgICAgIHNlbGYtPnBvcyA9IHNlbGYtPnN0cmluZ19zaXplID0gMDsKKyAgICBzZWxmLT5wb3MgPSBzZWxmLT5zdHJpbmdfc2l6ZSA9IDA7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJX3NlZWsoSW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgICAgICAgUHlfc3NpemVfdCBwb3NpdGlvbjsKLQlpbnQgbW9kZSA9IDA7CisgICAgUHlfc3NpemVfdCBwb3NpdGlvbjsKKyAgICBpbnQgbW9kZSA9IDA7CiAKLSAgICAgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58aTpzZWVrIiwgJnBvc2l0aW9uLCAmbW9kZSkpIAotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghSU9fX29wZW5jaGVjayhJT09PQkpFQ1Qoc2VsZikpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58aTpzZWVrIiwgJnBvc2l0aW9uLCAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmIChtb2RlID09IDIpIHBvc2l0aW9uICs9IHNlbGYtPnN0cmluZ19zaXplOwotICAgICAgICBlbHNlIGlmIChtb2RlID09IDEpIHBvc2l0aW9uICs9IHNlbGYtPnBvczsKKyAgICBpZiAobW9kZSA9PSAyKSBwb3NpdGlvbiArPSBzZWxmLT5zdHJpbmdfc2l6ZTsKKyAgICBlbHNlIGlmIChtb2RlID09IDEpIHBvc2l0aW9uICs9IHNlbGYtPnBvczsKIAotICAgICAgICBpZiAocG9zaXRpb24gPCAwKSBwb3NpdGlvbj0wOworICAgIGlmIChwb3NpdGlvbiA8IDApIHBvc2l0aW9uPTA7CiAKLSAgICAgICAgc2VsZi0+cG9zPXBvc2l0aW9uOworICAgIHNlbGYtPnBvcz1wb3NpdGlvbjsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBJX21ldGhvZHNbXSA9IHsKQEAgLTYyMCwxNyArNjIwLDE3IEBACiAgIHsiZmx1c2giLCAgICAgKFB5Q0Z1bmN0aW9uKUlPX2ZsdXNoLCAgICBNRVRIX05PQVJHUywgIElPX2ZsdXNoX19kb2NfX30sCiAgIHsiZ2V0dmFsdWUiLCAgKFB5Q0Z1bmN0aW9uKUlPX2dldHZhbCwgICBNRVRIX1ZBUkFSR1MsIElPX2dldHZhbF9fZG9jX199LAogICB7ImlzYXR0eSIsICAgIChQeUNGdW5jdGlvbilJT19pc2F0dHksICAgTUVUSF9OT0FSR1MsICBJT19pc2F0dHlfX2RvY19ffSwKLSAgeyJyZWFkIiwJKFB5Q0Z1bmN0aW9uKUlPX3JlYWQsICAgICBNRVRIX1ZBUkFSR1MsIElPX3JlYWRfX2RvY19ffSwKLSAgeyJyZWFkbGluZSIsCShQeUNGdW5jdGlvbilJT19yZWFkbGluZSwgTUVUSF9WQVJBUkdTLCBJT19yZWFkbGluZV9fZG9jX199LAotICB7InJlYWRsaW5lcyIsCShQeUNGdW5jdGlvbilJT19yZWFkbGluZXMsTUVUSF9WQVJBUkdTLCBJT19yZWFkbGluZXNfX2RvY19ffSwKLSAgeyJyZXNldCIsCShQeUNGdW5jdGlvbilJT19yZXNldCwJICBNRVRIX05PQVJHUywgIElPX3Jlc2V0X19kb2NfX30sCisgIHsicmVhZCIsICAgICAgKFB5Q0Z1bmN0aW9uKUlPX3JlYWQsICAgICBNRVRIX1ZBUkFSR1MsIElPX3JlYWRfX2RvY19ffSwKKyAgeyJyZWFkbGluZSIsICAoUHlDRnVuY3Rpb24pSU9fcmVhZGxpbmUsIE1FVEhfVkFSQVJHUywgSU9fcmVhZGxpbmVfX2RvY19ffSwKKyAgeyJyZWFkbGluZXMiLCAoUHlDRnVuY3Rpb24pSU9fcmVhZGxpbmVzLE1FVEhfVkFSQVJHUywgSU9fcmVhZGxpbmVzX19kb2NfX30sCisgIHsicmVzZXQiLCAgICAgKFB5Q0Z1bmN0aW9uKUlPX3Jlc2V0LCAgICBNRVRIX05PQVJHUywgIElPX3Jlc2V0X19kb2NfX30sCiAgIHsidGVsbCIsICAgICAgKFB5Q0Z1bmN0aW9uKUlPX3RlbGwsICAgICBNRVRIX05PQVJHUywgIElPX3RlbGxfX2RvY19ffSwKICAgeyJ0cnVuY2F0ZSIsICAoUHlDRnVuY3Rpb24pSU9fdHJ1bmNhdGUsIE1FVEhfVkFSQVJHUywgSU9fdHJ1bmNhdGVfX2RvY19ffSwKIAogICAvKiBSZWFkLW9ubHkgU3RyaW5nSU8gc3BlY2lmaWMgIG1ldGhvZHM6ICovCiAgIHsiY2xvc2UiLCAgICAgKFB5Q0Z1bmN0aW9uKUlfY2xvc2UsICAgIE1FVEhfTk9BUkdTLCAgT19jbG9zZV9fZG9jX199LAotICB7InNlZWsiLCAgICAgIChQeUNGdW5jdGlvbilJX3NlZWssICAgICBNRVRIX1ZBUkFSR1MsIE9fc2Vla19fZG9jX199LCAgCi0gIHtOVUxMLAlOVUxMfQorICB7InNlZWsiLCAgICAgIChQeUNGdW5jdGlvbilJX3NlZWssICAgICBNRVRIX1ZBUkFSR1MsIE9fc2Vla19fZG9jX199LAorICB7TlVMTCwgICAgICAgIE5VTEx9CiB9OwogCiBzdGF0aWMgdm9pZApAQCAtNjQ1LDM2ICs2NDUsMzYgQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBJdHlwZSA9IHsKICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICJjU3RyaW5nSU8uU3RyaW5nSSIsCQkJLyp0cF9uYW1lKi8KLSAgc2l6ZW9mKElvYmplY3QpLAkJCS8qdHBfYmFzaWNzaXplKi8KLSAgMCwJCQkJCS8qdHBfaXRlbXNpemUqLworICAiY1N0cmluZ0lPLlN0cmluZ0kiLCAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgIHNpemVvZihJb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwogICAvKiBtZXRob2RzICovCi0gIChkZXN0cnVjdG9yKUlfZGVhbGxvYywJCS8qdHBfZGVhbGxvYyovCi0gIDAsCQkJCQkvKnRwX3ByaW50Ki8KLSAgMCwJCSAJCQkvKiB0cF9nZXRhdHRyICovCi0gIDAsCQkJCQkvKnRwX3NldGF0dHIqLwotICAwLAkJCQkJLyp0cF9jb21wYXJlKi8KLSAgMCwJCQkJCS8qdHBfcmVwciovCi0gIDAsCQkJCQkvKnRwX2FzX251bWJlciovCi0gIDAsCQkJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLSAgMCwJCQkJCS8qdHBfYXNfbWFwcGluZyovCi0gIDAsCQkJCQkvKnRwX2hhc2gqLwotICAwLAkJCQkJLyp0cF9jYWxsKi8KLSAgMCwJCQkJCS8qdHBfc3RyKi8KLSAgMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0gIDAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotICAwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0gIFB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotICBJdHlwZV9fZG9jX18sCQkJCS8qIHRwX2RvYyAqLwotICAwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLSAgMCwJCQkJCS8qIHRwX2NsZWFyICovCi0gIDAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotICAwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLSAgUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotICAoaXRlcm5leHRmdW5jKUlPX2l0ZXJuZXh0LAkJLyogdHBfaXRlcm5leHQgKi8KLSAgSV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0gIDAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0gIGZpbGVfZ2V0c2V0bGlzdCwJCQkvKiB0cF9nZXRzZXQgKi8KKyAgKGRlc3RydWN0b3IpSV9kZWFsbG9jLCAgICAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICBJdHlwZV9fZG9jX18sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAoaXRlcm5leHRmdW5jKUlPX2l0ZXJuZXh0LCAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgIElfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgZmlsZV9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC02OTYsNyArNjk2LDcgQEAKICAgc2VsZi0+c3RyaW5nX3NpemU9c2l6ZTsKICAgc2VsZi0+cGJ1Zj1zOwogICBzZWxmLT5wb3M9MDsKLSAgCisKICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKIH0KIApAQCAtNzIwLDkgKzcyMCw5IEBACiAvKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgSU9fbWV0aG9kc1tdID0gewotICB7IlN0cmluZ0lPIiwJKFB5Q0Z1bmN0aW9uKUlPX1N0cmluZ0lPLAkKLSAgIE1FVEhfVkFSQVJHUywJSU9fU3RyaW5nSU9fX2RvY19ffSwKLSAge05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgeyJTdHJpbmdJTyIsICAoUHlDRnVuY3Rpb24pSU9fU3RyaW5nSU8sCisgICBNRVRIX1ZBUkFSR1MsICAgICAgICBJT19TdHJpbmdJT19fZG9jX199LAorICB7TlVMTCwgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTczOSw3ICs3MzksNyBAQAogICAmT3R5cGUsCiB9OwogCi0jaWZuZGVmIFB5TU9ESU5JVF9GVU5DCS8qIGRlY2xhcmF0aW9ucyBmb3IgRExMIGltcG9ydC9leHBvcnQgKi8KKyNpZm5kZWYgUHlNT0RJTklUX0ZVTkMgIC8qIGRlY2xhcmF0aW9ucyBmb3IgRExMIGltcG9ydC9leHBvcnQgKi8KICNkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAogI2VuZGlmCiBQeU1PRElOSVRfRlVOQwpAQCAtNzQ5LDEzICs3NDksMTMgQEAKIAogICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KICAgbSA9IFB5X0luaXRNb2R1bGU0KCJjU3RyaW5nSU8iLCBJT19tZXRob2RzLAotCQkgICAgIGNTdHJpbmdJT19tb2R1bGVfZG9jdW1lbnRhdGlvbiwKLQkJICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgIGNTdHJpbmdJT19tb2R1bGVfZG9jdW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOwogICBpZiAobSA9PSBOVUxMKSByZXR1cm47CiAKICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0gIAorCiAgIC8qIEV4cG9ydCBDIEFQSSAqLwogICBQeV9UWVBFKCZJdHlwZSk9JlB5VHlwZV9UeXBlOwogICBQeV9UWVBFKCZPdHlwZSk9JlB5VHlwZV9UeXBlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jZG1vZHVsZS5jIGIvTW9kdWxlcy9jZG1vZHVsZS5jCmluZGV4IGYwOWIwYTQuLjhkZmI3NjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL2NkbW9kdWxlLmMKQEAgLTUsNzk2ICs1LDc5NiBAQAogI2luY2x1ZGUgPGNkYXVkaW8uaD4KICNpbmNsdWRlICJQeXRob24uaCIKIAotI2RlZmluZSBOQ0FMTEJBQ0tTCTgKKyNkZWZpbmUgTkNBTExCQUNLUyAgICAgIDgKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRFBMQVlFUiAqb2JfY2RwbGF5ZXI7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENEUExBWUVSICpvYl9jZHBsYXllcjsKIH0gY2RwbGF5ZXJvYmplY3Q7CiAKLXN0YXRpYyBQeU9iamVjdCAqQ2RFcnJvcjsJCS8qIGV4Y2VwdGlvbiBjZC5lcnJvciAqLworc3RhdGljIFB5T2JqZWN0ICpDZEVycm9yOyAgICAgICAgICAgICAgIC8qIGV4Y2VwdGlvbiBjZC5lcnJvciAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfYWxsb3dyZW1vdmFsKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjphbGxvd3JlbW92YWwiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6YWxsb3dyZW1vdmFsIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQ0RhbGxvd3JlbW92YWwoc2VsZi0+b2JfY2RwbGF5ZXIpOworICAgIENEYWxsb3dyZW1vdmFsKHNlbGYtPm9iX2NkcGxheWVyKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9wcmV2ZW50cmVtb3ZhbChjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6cHJldmVudHJlbW92YWwiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6cHJldmVudHJlbW92YWwiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDRHByZXZlbnRyZW1vdmFsKHNlbGYtPm9iX2NkcGxheWVyKTsKKyAgICBDRHByZXZlbnRyZW1vdmFsKHNlbGYtPm9iX2NkcGxheWVyKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9iZXN0cmVhZHNpemUoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmJlc3RyZWFkc2l6ZSIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpiZXN0cmVhZHNpemUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEYmVzdHJlYWRzaXplKHNlbGYtPm9iX2NkcGxheWVyKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRGJlc3RyZWFkc2l6ZShzZWxmLT5vYl9jZHBsYXllcikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfY2xvc2UoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmNsb3NlIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmNsb3NlIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRGNsb3NlKHNlbGYtPm9iX2NkcGxheWVyKSkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7IC8qIFhYWCAtID8/PyAqLwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZi0+b2JfY2RwbGF5ZXIgPSBOVUxMOworICAgIGlmICghQ0RjbG9zZShzZWxmLT5vYl9jZHBsYXllcikpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOyAvKiBYWFggLSA/Pz8gKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNlbGYtPm9iX2NkcGxheWVyID0gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9lamVjdChjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQ0RTVEFUVVMgc3RhdHVzOworICAgIENEU1RBVFVTIHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmVqZWN0IikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmVqZWN0IikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRGVqZWN0KHNlbGYtPm9iX2NkcGxheWVyKSkgewotCQlpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCi0JCSAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgImVqZWN0IGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFDRGVqZWN0KHNlbGYtPm9iX2NkcGxheWVyKSkgeworICAgICAgICBpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCisgICAgICAgICAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgImVqZWN0IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfZ2V0c3RhdHVzKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlDRFNUQVRVUyBzdGF0dXM7CisgICAgQ0RTVEFUVVMgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0c3RhdHVzIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldHN0YXR1cyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhDZEVycm9yKTsgLyogWFhYIC0gPz8/ICovCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIUNEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7IC8qIFhYWCAtID8/PyAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpKGlpaSkoaWlpKShpaWkpaWlpaSkiLCBzdGF0dXMuc3RhdGUsCi0JCSAgICAgICBzdGF0dXMudHJhY2ssIHN0YXR1cy5taW4sIHN0YXR1cy5zZWMsIHN0YXR1cy5mcmFtZSwKLQkJICAgICAgIHN0YXR1cy5hYnNfbWluLCBzdGF0dXMuYWJzX3NlYywgc3RhdHVzLmFic19mcmFtZSwKLQkJICAgICAgIHN0YXR1cy50b3RhbF9taW4sIHN0YXR1cy50b3RhbF9zZWMsIHN0YXR1cy50b3RhbF9mcmFtZSwKLQkJICAgICAgIHN0YXR1cy5maXJzdCwgc3RhdHVzLmxhc3QsIHN0YXR1cy5zY3NpX2F1ZGlvLAotCQkgICAgICAgc3RhdHVzLmN1cl9ibG9jayk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaShpaWkpKGlpaSkoaWlpKWlpaWkpIiwgc3RhdHVzLnN0YXRlLAorICAgICAgICAgICAgICAgICAgIHN0YXR1cy50cmFjaywgc3RhdHVzLm1pbiwgc3RhdHVzLnNlYywgc3RhdHVzLmZyYW1lLAorICAgICAgICAgICAgICAgICAgIHN0YXR1cy5hYnNfbWluLCBzdGF0dXMuYWJzX3NlYywgc3RhdHVzLmFic19mcmFtZSwKKyAgICAgICAgICAgICAgICAgICBzdGF0dXMudG90YWxfbWluLCBzdGF0dXMudG90YWxfc2VjLCBzdGF0dXMudG90YWxfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgc3RhdHVzLmZpcnN0LCBzdGF0dXMubGFzdCwgc3RhdHVzLnNjc2lfYXVkaW8sCisgICAgICAgICAgICAgICAgICAgc3RhdHVzLmN1cl9ibG9jayk7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9nZXR0cmFja2luZm8oY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0cmFjazsKLQlDRFRSQUNLSU5GTyBpbmZvOwotCUNEU1RBVFVTIHN0YXR1czsKKyAgICBpbnQgdHJhY2s7CisgICAgQ0RUUkFDS0lORk8gaW5mbzsKKyAgICBDRFNUQVRVUyBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0dHJhY2tpbmZvIiwgJnRyYWNrKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmdldHRyYWNraW5mbyIsICZ0cmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRGdldHRyYWNraW5mbyhzZWxmLT5vYl9jZHBsYXllciwgdHJhY2ssICZpbmZvKSkgewotCQlpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCi0JCSAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgImdldHRyYWNraW5mbyBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghQ0RnZXR0cmFja2luZm8oc2VsZi0+b2JfY2RwbGF5ZXIsIHRyYWNrLCAmaW5mbykpIHsKKyAgICAgICAgaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgorICAgICAgICAgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJnZXR0cmFja2luZm8gZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoKGlpaSkoaWlpKSkiLAotCQkgICAgICAgaW5mby5zdGFydF9taW4sIGluZm8uc3RhcnRfc2VjLCBpbmZvLnN0YXJ0X2ZyYW1lLAotCQkgICAgICAgaW5mby50b3RhbF9taW4sIGluZm8udG90YWxfc2VjLCBpbmZvLnRvdGFsX2ZyYW1lKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKChpaWkpKGlpaSkpIiwKKyAgICAgICAgICAgICAgICAgICBpbmZvLnN0YXJ0X21pbiwgaW5mby5zdGFydF9zZWMsIGluZm8uc3RhcnRfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgaW5mby50b3RhbF9taW4sIGluZm8udG90YWxfc2VjLCBpbmZvLnRvdGFsX2ZyYW1lKTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX21zZnRvYmxvY2soY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBtaW4sIHNlYywgZnJhbWU7CisgICAgaW50IG1pbiwgc2VjLCBmcmFtZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOm1zZnRvYmxvY2siLCAmbWluLCAmc2VjLCAmZnJhbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTptc2Z0b2Jsb2NrIiwgJm1pbiwgJnNlYywgJmZyYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEbXNmdG9ibG9jayhzZWxmLT5vYl9jZHBsYXllciwKLQkJCQkJCW1pbiwgc2VjLCBmcmFtZSkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgQ0Rtc2Z0b2Jsb2NrKHNlbGYtPm9iX2NkcGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4sIHNlYywgZnJhbWUpKTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX3BsYXkoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzdGFydCwgcGxheTsKLQlDRFNUQVRVUyBzdGF0dXM7CisgICAgaW50IHN0YXJ0LCBwbGF5OworICAgIENEU1RBVFVTIHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6cGxheSIsICZzdGFydCwgJnBsYXkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOnBsYXkiLCAmc3RhcnQsICZwbGF5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIUNEcGxheShzZWxmLT5vYl9jZHBsYXllciwgc3RhcnQsIHBsYXkpKSB7Ci0JCWlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKLQkJICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAicGxheSBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghQ0RwbGF5KHNlbGYtPm9iX2NkcGxheWVyLCBzdGFydCwgcGxheSkpIHsKKyAgICAgICAgaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgorICAgICAgICAgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJwbGF5IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfcGxheWFicyhjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG1pbiwgc2VjLCBmcmFtZSwgcGxheTsKLQlDRFNUQVRVUyBzdGF0dXM7CisgICAgaW50IG1pbiwgc2VjLCBmcmFtZSwgcGxheTsKKyAgICBDRFNUQVRVUyBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWk6cGxheWFicyIsICZtaW4sICZzZWMsICZmcmFtZSwgJnBsYXkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWk6cGxheWFicyIsICZtaW4sICZzZWMsICZmcmFtZSwgJnBsYXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghQ0RwbGF5YWJzKHNlbGYtPm9iX2NkcGxheWVyLCBtaW4sIHNlYywgZnJhbWUsIHBsYXkpKSB7Ci0JCWlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKLQkJICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAicGxheWFicyBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghQ0RwbGF5YWJzKHNlbGYtPm9iX2NkcGxheWVyLCBtaW4sIHNlYywgZnJhbWUsIHBsYXkpKSB7CisgICAgICAgIGlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKKyAgICAgICAgICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAicGxheWFicyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX3BsYXl0cmFjayhjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN0YXJ0LCBwbGF5OwotCUNEU1RBVFVTIHN0YXR1czsKKyAgICBpbnQgc3RhcnQsIHBsYXk7CisgICAgQ0RTVEFUVVMgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpwbGF5dHJhY2siLCAmc3RhcnQsICZwbGF5KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpwbGF5dHJhY2siLCAmc3RhcnQsICZwbGF5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIUNEcGxheXRyYWNrKHNlbGYtPm9iX2NkcGxheWVyLCBzdGFydCwgcGxheSkpIHsKLQkJaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgotCQkgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJwbGF5dHJhY2sgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIUNEcGxheXRyYWNrKHNlbGYtPm9iX2NkcGxheWVyLCBzdGFydCwgcGxheSkpIHsKKyAgICAgICAgaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgorICAgICAgICAgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJwbGF5dHJhY2sgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9wbGF5dHJhY2thYnMoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0cmFjaywgbWluLCBzZWMsIGZyYW1lLCBwbGF5OwotCUNEU1RBVFVTIHN0YXR1czsKKyAgICBpbnQgdHJhY2ssIG1pbiwgc2VjLCBmcmFtZSwgcGxheTsKKyAgICBDRFNUQVRVUyBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWlpOnBsYXl0cmFja2FicyIsICZ0cmFjaywgJm1pbiwgJnNlYywKLQkJCSAgICAgICZmcmFtZSwgJnBsYXkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWlpOnBsYXl0cmFja2FicyIsICZ0cmFjaywgJm1pbiwgJnNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lLCAmcGxheSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRHBsYXl0cmFja2FicyhzZWxmLT5vYl9jZHBsYXllciwgdHJhY2ssIG1pbiwgc2VjLCBmcmFtZSwgcGxheSkpIHsKLQkJaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgotCQkgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJwbGF5dHJhY2thYnMgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIUNEcGxheXRyYWNrYWJzKHNlbGYtPm9iX2NkcGxheWVyLCB0cmFjaywgbWluLCBzZWMsIGZyYW1lLCBwbGF5KSkgeworICAgICAgICBpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCisgICAgICAgICAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInBsYXl0cmFja2FicyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX3JlYWRkYShjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG51bWZyYW1lcywgbjsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBudW1mcmFtZXMsIG47CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpyZWFkZGEiLCAmbnVtZnJhbWVzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlYWRkYSIsICZudW1mcmFtZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG51bWZyYW1lcyAqIHNpemVvZihDREZSQU1FKSk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBudW1mcmFtZXMgKiBzaXplb2YoQ0RGUkFNRSkpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluID0gQ0RyZWFkZGEoc2VsZi0+b2JfY2RwbGF5ZXIsCi0JCSAgICAgICAoQ0RGUkFNRSAqKSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpLCBudW1mcmFtZXMpOwotCWlmIChuID09IC0xKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobiA8IG51bWZyYW1lcykKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBuICogc2l6ZW9mKENERlJBTUUpKTsKKyAgICBuID0gQ0RyZWFkZGEoc2VsZi0+b2JfY2RwbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgKENERlJBTUUgKikgUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KSwgbnVtZnJhbWVzKTsKKyAgICBpZiAobiA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG4gPCBudW1mcmFtZXMpCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgbiAqIHNpemVvZihDREZSQU1FKSk7CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9zZWVrKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbWluLCBzZWMsIGZyYW1lOwotCWxvbmcgUHlUcnlCbG9jazsKKyAgICBpbnQgbWluLCBzZWMsIGZyYW1lOworICAgIGxvbmcgUHlUcnlCbG9jazsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOnNlZWsiLCAmbWluLCAmc2VjLCAmZnJhbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTpzZWVrIiwgJm1pbiwgJnNlYywgJmZyYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeVRyeUJsb2NrID0gQ0RzZWVrKHNlbGYtPm9iX2NkcGxheWVyLCBtaW4sIHNlYywgZnJhbWUpOwotCWlmIChQeVRyeUJsb2NrID09IC0xKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhDZEVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFB5VHJ5QmxvY2sgPSBDRHNlZWsoc2VsZi0+b2JfY2RwbGF5ZXIsIG1pbiwgc2VjLCBmcmFtZSk7CisgICAgaWYgKFB5VHJ5QmxvY2sgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlUcnlCbG9jayk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5VHJ5QmxvY2spOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Rfc2Vla3RyYWNrKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgdHJhY2s7Ci0JbG9uZyBQeVRyeUJsb2NrOworICAgIGludCB0cmFjazsKKyAgICBsb25nIFB5VHJ5QmxvY2s7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2Vla3RyYWNrIiwgJnRyYWNrKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNlZWt0cmFjayIsICZ0cmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlUcnlCbG9jayA9IENEc2Vla3RyYWNrKHNlbGYtPm9iX2NkcGxheWVyLCB0cmFjayk7Ci0JaWYgKFB5VHJ5QmxvY2sgPT0gLTEpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlUcnlCbG9jayA9IENEc2Vla3RyYWNrKHNlbGYtPm9iX2NkcGxheWVyLCB0cmFjayk7CisgICAgaWYgKFB5VHJ5QmxvY2sgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlUcnlCbG9jayk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5VHJ5QmxvY2spOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Rfc2Vla2Jsb2NrKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBsb25nIFB5VHJ5QmxvY2s7CisgICAgdW5zaWduZWQgbG9uZyBQeVRyeUJsb2NrOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnNlZWtibG9jayIsICZQeVRyeUJsb2NrKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnNlZWtibG9jayIsICZQeVRyeUJsb2NrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeVRyeUJsb2NrID0gQ0RzZWVrYmxvY2soc2VsZi0+b2JfY2RwbGF5ZXIsIFB5VHJ5QmxvY2spOwotCWlmIChQeVRyeUJsb2NrID09ICh1bnNpZ25lZCBsb25nKSAtMSkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeVRyeUJsb2NrID0gQ0RzZWVrYmxvY2soc2VsZi0+b2JfY2RwbGF5ZXIsIFB5VHJ5QmxvY2spOworICAgIGlmIChQeVRyeUJsb2NrID09ICh1bnNpZ25lZCBsb25nKSAtMSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeVRyeUJsb2NrKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlUcnlCbG9jayk7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9zdG9wKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlDRFNUQVRVUyBzdGF0dXM7CisgICAgQ0RTVEFUVVMgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6c3RvcCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpzdG9wIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRHN0b3Aoc2VsZi0+b2JfY2RwbGF5ZXIpKSB7Ci0JCWlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKLQkJICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAic3RvcCBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghQ0RzdG9wKHNlbGYtPm9iX2NkcGxheWVyKSkgeworICAgICAgICBpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCisgICAgICAgICAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInN0b3AgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF90b2dnbGVwYXVzZShjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQ0RTVEFUVVMgc3RhdHVzOworICAgIENEU1RBVFVTIHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnRvZ2dsZXBhdXNlIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnRvZ2dsZXBhdXNlIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRHRvZ2dsZXBhdXNlKHNlbGYtPm9iX2NkcGxheWVyKSkgewotCQlpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCi0JCSAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInRvZ2dsZXBhdXNlIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFDRHRvZ2dsZXBhdXNlKHNlbGYtPm9iX2NkcGxheWVyKSkgeworICAgICAgICBpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCisgICAgICAgICAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInRvZ2dsZXBhdXNlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQotCQorCiBzdGF0aWMgUHlNZXRob2REZWYgY2RwbGF5ZXJfbWV0aG9kc1tdID0gewotCXsiYWxsb3dyZW1vdmFsIiwJKFB5Q0Z1bmN0aW9uKUNEX2FsbG93cmVtb3ZhbCwJTUVUSF9WQVJBUkdTfSwKLQl7ImJlc3RyZWFkc2l6ZSIsCShQeUNGdW5jdGlvbilDRF9iZXN0cmVhZHNpemUsCU1FVEhfVkFSQVJHU30sCi0JeyJjbG9zZSIsCQkoUHlDRnVuY3Rpb24pQ0RfY2xvc2UsCQlNRVRIX1ZBUkFSR1N9LAotCXsiZWplY3QiLAkJKFB5Q0Z1bmN0aW9uKUNEX2VqZWN0LAkJTUVUSF9WQVJBUkdTfSwKLQl7ImdldHN0YXR1cyIsCQkoUHlDRnVuY3Rpb24pQ0RfZ2V0c3RhdHVzLAkJTUVUSF9WQVJBUkdTfSwKLQl7ImdldHRyYWNraW5mbyIsCShQeUNGdW5jdGlvbilDRF9nZXR0cmFja2luZm8sCU1FVEhfVkFSQVJHU30sCi0JeyJtc2Z0b2Jsb2NrIiwJCShQeUNGdW5jdGlvbilDRF9tc2Z0b2Jsb2NrLAkJTUVUSF9WQVJBUkdTfSwKLQl7InBsYXkiLAkJKFB5Q0Z1bmN0aW9uKUNEX3BsYXksCQlNRVRIX1ZBUkFSR1N9LAotCXsicGxheWFicyIsCQkoUHlDRnVuY3Rpb24pQ0RfcGxheWFicywJCU1FVEhfVkFSQVJHU30sCi0JeyJwbGF5dHJhY2siLAkJKFB5Q0Z1bmN0aW9uKUNEX3BsYXl0cmFjaywJCU1FVEhfVkFSQVJHU30sCi0JeyJwbGF5dHJhY2thYnMiLAkoUHlDRnVuY3Rpb24pQ0RfcGxheXRyYWNrYWJzLAlNRVRIX1ZBUkFSR1N9LAotCXsicHJldmVudHJlbW92YWwiLAkoUHlDRnVuY3Rpb24pQ0RfcHJldmVudHJlbW92YWwsCU1FVEhfVkFSQVJHU30sCi0JeyJyZWFkZGEiLAkJKFB5Q0Z1bmN0aW9uKUNEX3JlYWRkYSwJCU1FVEhfVkFSQVJHU30sCi0JeyJzZWVrIiwJCShQeUNGdW5jdGlvbilDRF9zZWVrLAkJTUVUSF9WQVJBUkdTfSwKLQl7InNlZWtibG9jayIsCQkoUHlDRnVuY3Rpb24pQ0Rfc2Vla2Jsb2NrLAkJTUVUSF9WQVJBUkdTfSwKLQl7InNlZWt0cmFjayIsCQkoUHlDRnVuY3Rpb24pQ0Rfc2Vla3RyYWNrLAkJTUVUSF9WQVJBUkdTfSwKLQl7InN0b3AiLAkJKFB5Q0Z1bmN0aW9uKUNEX3N0b3AsCQlNRVRIX1ZBUkFSR1N9LAotCXsidG9nZ2xlcGF1c2UiLAkJKFB5Q0Z1bmN0aW9uKUNEX3RvZ2dsZXBhdXNlLCAgIAlNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJCU5VTEx9IAkJLyogc2VudGluZWwgKi8KKyAgICB7ImFsbG93cmVtb3ZhbCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX2FsbG93cmVtb3ZhbCwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiYmVzdHJlYWRzaXplIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfYmVzdHJlYWRzaXplLCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJjbG9zZSIsICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9jbG9zZSwgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImVqZWN0IiwgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX2VqZWN0LCAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0c3RhdHVzIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfZ2V0c3RhdHVzLCAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHRyYWNraW5mbyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX2dldHRyYWNraW5mbywgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsibXNmdG9ibG9jayIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfbXNmdG9ibG9jaywgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InBsYXkiLCAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3BsYXksICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicGxheWFicyIsICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfcGxheWFicywgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InBsYXl0cmFjayIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3BsYXl0cmFjaywgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJwbGF5dHJhY2thYnMiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9wbGF5dHJhY2thYnMsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InByZXZlbnRyZW1vdmFsIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3ByZXZlbnRyZW1vdmFsLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicmVhZGRhIiwgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfcmVhZGRhLCAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZWVrIiwgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9zZWVrLCAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNlZWtibG9jayIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3NlZWtibG9jaywgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZWVrdHJhY2siLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9zZWVrdHJhY2ssICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic3RvcCIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0Rfc3RvcCwgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ0b2dnbGVwYXVzZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF90b2dnbGVwYXVzZSwgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgdm9pZAogY2RwbGF5ZXJfZGVhbGxvYyhjZHBsYXllcm9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfY2RwbGF5ZXIgIT0gTlVMTCkKLQkJQ0RjbG9zZShzZWxmLT5vYl9jZHBsYXllcik7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGlmIChzZWxmLT5vYl9jZHBsYXllciAhPSBOVUxMKQorICAgICAgICBDRGNsb3NlKHNlbGYtPm9iX2NkcGxheWVyKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjZHBsYXllcl9nZXRhdHRyKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCWlmIChzZWxmLT5vYl9jZHBsYXllciA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJubyBwbGF5ZXIgYWN0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfRmluZE1ldGhvZChjZHBsYXllcl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICBpZiAoc2VsZi0+b2JfY2RwbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibm8gcGxheWVyIGFjdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoY2RwbGF5ZXJfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKIFB5VHlwZU9iamVjdCBDZFBsYXllcnR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCS8qb2Jfc2l6ZSovCi0JImNkLmNkcGxheWVyIiwJLyp0cF9uYW1lKi8KLQlzaXplb2YoY2RwbGF5ZXJvYmplY3QpLAkvKnRwX3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWNkcGxheWVyX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpY2RwbGF5ZXJfZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJjZC5jZHBsYXllciIsICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoY2RwbGF5ZXJvYmplY3QpLCAgICAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWNkcGxheWVyX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYyljZHBsYXllcl9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2NkcGxheWVyb2JqZWN0KENEUExBWUVSICpjZHApCiB7Ci0JY2RwbGF5ZXJvYmplY3QgKnA7CisgICAgY2RwbGF5ZXJvYmplY3QgKnA7CiAKLQlwID0gUHlPYmplY3RfTmV3KGNkcGxheWVyb2JqZWN0LCAmQ2RQbGF5ZXJ0eXBlKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwLT5vYl9jZHBsYXllciA9IGNkcDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHA7CisgICAgcCA9IFB5T2JqZWN0X05ldyhjZHBsYXllcm9iamVjdCwgJkNkUGxheWVydHlwZSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcC0+b2JfY2RwbGF5ZXIgPSBjZHA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Rfb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZGV2LCAqZGlyZWN0aW9uOwotCUNEUExBWUVSICpjZHA7CisgICAgY2hhciAqZGV2LCAqZGlyZWN0aW9uOworICAgIENEUExBWUVSICpjZHA7CiAKLQkvKgotCSAqIFZhcmlhYmxlIG51bWJlciBvZiBhcmdzLgotCSAqIEZpcnN0IGRlZmF1bHRzIHRvICJOb25lIiwgc2Vjb25kIGRlZmF1bHRzIHRvICJyIi4KLQkgKi8KLQlkZXYgPSBOVUxMOwotCWRpcmVjdGlvbiA9ICJyIjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInx6czpvcGVuIiwgJmRldiwgJmRpcmVjdGlvbikpCi0JCXJldHVybiBOVUxMOworICAgIC8qCisgICAgICogVmFyaWFibGUgbnVtYmVyIG9mIGFyZ3MuCisgICAgICogRmlyc3QgZGVmYXVsdHMgdG8gIk5vbmUiLCBzZWNvbmQgZGVmYXVsdHMgdG8gInIiLgorICAgICAqLworICAgIGRldiA9IE5VTEw7CisgICAgZGlyZWN0aW9uID0gInIiOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHpzOm9wZW4iLCAmZGV2LCAmZGlyZWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljZHAgPSBDRG9wZW4oZGV2LCBkaXJlY3Rpb24pOwotCWlmIChjZHAgPT0gTlVMTCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBjZHAgPSBDRG9wZW4oZGV2LCBkaXJlY3Rpb24pOworICAgIGlmIChjZHAgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBuZXdjZHBsYXllcm9iamVjdChjZHApOworICAgIHJldHVybiBuZXdjZHBsYXllcm9iamVjdChjZHApOwogfQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNEUEFSU0VSICpvYl9jZHBhcnNlcjsKLQlzdHJ1Y3QgewotCQlQeU9iamVjdCAqb2JfY2RjYWxsYmFjazsKLQkJUHlPYmplY3QgKm9iX2NkY2FsbGJhY2thcmc7Ci0JfSBvYl9jZGNhbGxiYWNrc1tOQ0FMTEJBQ0tTXTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0RQQVJTRVIgKm9iX2NkcGFyc2VyOworICAgIHN0cnVjdCB7CisgICAgICAgIFB5T2JqZWN0ICpvYl9jZGNhbGxiYWNrOworICAgICAgICBQeU9iamVjdCAqb2JfY2RjYWxsYmFja2FyZzsKKyAgICB9IG9iX2NkY2FsbGJhY2tzW05DQUxMQkFDS1NdOwogfSBjZHBhcnNlcm9iamVjdDsKIAogc3RhdGljIHZvaWQKIENEX2NhbGxiYWNrKHZvaWQgKmFyZywgQ0REQVRBVFlQRVMgdHlwZSwgdm9pZCAqZGF0YSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0LCAqYXJncywgKnYgPSBOVUxMOwotCWNoYXIgKnA7Ci0JaW50IGk7Ci0JY2RwYXJzZXJvYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnJlc3VsdCwgKmFyZ3MsICp2ID0gTlVMTDsKKyAgICBjaGFyICpwOworICAgIGludCBpOworICAgIGNkcGFyc2Vyb2JqZWN0ICpzZWxmOwogCi0Jc2VsZiA9IChjZHBhcnNlcm9iamVjdCAqKSBhcmc7Ci0JYXJncyA9IFB5VHVwbGVfTmV3KDMpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7Ci0JUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDAsIHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcpOwotCVB5VHVwbGVfU2V0SXRlbShhcmdzLCAxLCBQeUludF9Gcm9tTG9uZygobG9uZykgdHlwZSkpOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgY2RfYXVkaW86Ci0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBDRERBX0RBVEFTSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSBjZF9wbnVtOgotCWNhc2UgY2RfaW5kZXg6Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygoKENEUFJPR05VTSAqKSBkYXRhKS0+dmFsdWUpOwotCQlicmVhazsKLQljYXNlIGNkX3B0aW1lOgotCWNhc2UgY2RfYXRpbWU6CisgICAgc2VsZiA9IChjZHBhcnNlcm9iamVjdCAqKSBhcmc7CisgICAgYXJncyA9IFB5VHVwbGVfTmV3KDMpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7CisgICAgUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDAsIHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcpOworICAgIFB5VHVwbGVfU2V0SXRlbShhcmdzLCAxLCBQeUludF9Gcm9tTG9uZygobG9uZykgdHlwZSkpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgY2RfYXVkaW86CisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBDRERBX0RBVEFTSVpFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBjZF9wbnVtOgorICAgIGNhc2UgY2RfaW5kZXg6CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZygoKENEUFJPR05VTSAqKSBkYXRhKS0+dmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGNkX3B0aW1lOgorICAgIGNhc2UgY2RfYXRpbWU6CiAjZGVmaW5lIHB0ciAoKHN0cnVjdCBjZHRpbWVjb2RlICopIGRhdGEpCi0JCXYgPSBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsCi0JCQkgICAgcHRyLT5taGkgKiAxMCArIHB0ci0+bWxvLAotCQkJICAgIHB0ci0+c2hpICogMTAgKyBwdHItPnNsbywKLQkJCSAgICBwdHItPmZoaSAqIDEwICsgcHRyLT5mbG8pOworICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlpaSkiLAorICAgICAgICAgICAgICAgICAgICBwdHItPm1oaSAqIDEwICsgcHRyLT5tbG8sCisgICAgICAgICAgICAgICAgICAgIHB0ci0+c2hpICogMTAgKyBwdHItPnNsbywKKyAgICAgICAgICAgICAgICAgICAgcHRyLT5maGkgKiAxMCArIHB0ci0+ZmxvKTsKICN1bmRlZiBwdHIKLQkJYnJlYWs7Ci0JY2FzZSBjZF9jYXRhbG9nOgotCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMTMpOwotCQlwID0gUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQotCQkJKnArKyA9ICgoY2hhciAqKSBkYXRhKVtpXSArICcwJzsKLQkJYnJlYWs7Ci0JY2FzZSBjZF9pZGVudDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBjZF9jYXRhbG9nOgorICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMTMpOworICAgICAgICBwID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQorICAgICAgICAgICAgKnArKyA9ICgoY2hhciAqKSBkYXRhKVtpXSArICcwJzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBjZF9pZGVudDoKICNkZWZpbmUgcHRyICgoc3RydWN0IGNkaWRlbnQgKikgZGF0YSkKLQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDEyKTsKLQkJcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCQlDRHNidG9hKHAsIHB0ci0+Y291bnRyeSwgMik7Ci0JCXAgKz0gMjsKLQkJQ0RzYnRvYShwLCBwdHItPm93bmVyLCAzKTsKLQkJcCArPSAzOwotCQkqcCsrID0gcHRyLT55ZWFyWzBdICsgJzAnOwotCQkqcCsrID0gcHRyLT55ZWFyWzFdICsgJzAnOwotCQkqcCsrID0gcHRyLT5zZXJpYWxbMF0gKyAnMCc7Ci0JCSpwKysgPSBwdHItPnNlcmlhbFsxXSArICcwJzsKLQkJKnArKyA9IHB0ci0+c2VyaWFsWzJdICsgJzAnOwotCQkqcCsrID0gcHRyLT5zZXJpYWxbM10gKyAnMCc7Ci0JCSpwKysgPSBwdHItPnNlcmlhbFs0XSArICcwJzsKKyAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDEyKTsKKyAgICAgICAgcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgICAgICBDRHNidG9hKHAsIHB0ci0+Y291bnRyeSwgMik7CisgICAgICAgIHAgKz0gMjsKKyAgICAgICAgQ0RzYnRvYShwLCBwdHItPm93bmVyLCAzKTsKKyAgICAgICAgcCArPSAzOworICAgICAgICAqcCsrID0gcHRyLT55ZWFyWzBdICsgJzAnOworICAgICAgICAqcCsrID0gcHRyLT55ZWFyWzFdICsgJzAnOworICAgICAgICAqcCsrID0gcHRyLT5zZXJpYWxbMF0gKyAnMCc7CisgICAgICAgICpwKysgPSBwdHItPnNlcmlhbFsxXSArICcwJzsKKyAgICAgICAgKnArKyA9IHB0ci0+c2VyaWFsWzJdICsgJzAnOworICAgICAgICAqcCsrID0gcHRyLT5zZXJpYWxbM10gKyAnMCc7CisgICAgICAgICpwKysgPSBwdHItPnNlcmlhbFs0XSArICcwJzsKICN1bmRlZiBwdHIKLQkJYnJlYWs7Ci0JY2FzZSBjZF9jb250cm9sOgotCQl2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICooKHVuY2hhciAqKSBkYXRhKSk7Ci0JCWJyZWFrOwotCX0KLQlQeVR1cGxlX1NldEl0ZW0oYXJncywgMiwgdik7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlyZXR1cm47Ci0JfQotCQotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2ssCi0JCQkJICAgYXJncyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCVB5X1hERUNSRUYocmVzdWx0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBjZF9jb250cm9sOgorICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICooKHVuY2hhciAqKSBkYXRhKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgMiwgdik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3Qoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfZGVsZXRlcGFyc2VyKGNkcGFyc2Vyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmRlbGV0ZXBhcnNlciIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpkZWxldGVwYXJzZXIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDRGRlbGV0ZXBhcnNlcihzZWxmLT5vYl9jZHBhcnNlcik7Ci0Jc2VsZi0+b2JfY2RwYXJzZXIgPSBOVUxMOworICAgIENEZGVsZXRlcGFyc2VyKHNlbGYtPm9iX2NkcGFyc2VyKTsKKyAgICBzZWxmLT5vYl9jZHBhcnNlciA9IE5VTEw7CiAKLQkvKiBubyBzZW5zZSBpbiBrZWVwaW5nIHRoZSBjYWxsYmFja3MsIHNvIHJlbW92ZSB0aGVtICovCi0JZm9yIChpID0gMDsgaSA8IE5DQUxMQkFDS1M7IGkrKykgewotCQlQeV9YREVDUkVGKHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2spOwotCQlzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrID0gTlVMTDsKLQkJUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrYXJnKTsKLQkJc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyA9IE5VTEw7Ci0JfQorICAgIC8qIG5vIHNlbnNlIGluIGtlZXBpbmcgdGhlIGNhbGxiYWNrcywgc28gcmVtb3ZlIHRoZW0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTkNBTExCQUNLUzsgaSsrKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayk7CisgICAgICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2sgPSBOVUxMOworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcpOworICAgICAgICBzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrYXJnID0gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfcGFyc2VmcmFtZShjZHBhcnNlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqY2RmcDsKLQlpbnQgbGVuZ3RoOwotCUNERlJBTUUgKnA7CisgICAgY2hhciAqY2RmcDsKKyAgICBpbnQgbGVuZ3RoOworICAgIENERlJBTUUgKnA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOnBhcnNlZnJhbWUiLCAmY2RmcCwgJmxlbmd0aCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6cGFyc2VmcmFtZSIsICZjZGZwLCAmbGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobGVuZ3RoICUgc2l6ZW9mKENERlJBTUUpICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJhZCBsZW5ndGgiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChsZW5ndGggJSBzaXplb2YoQ0RGUkFNRSkgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIGxlbmd0aCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwID0gKENERlJBTUUgKikgY2RmcDsKLQl3aGlsZSAobGVuZ3RoID4gMCkgewotCQlDRHBhcnNlZnJhbWUoc2VsZi0+b2JfY2RwYXJzZXIsIHApOwotCQlsZW5ndGggLT0gc2l6ZW9mKENERlJBTUUpOwotCQlwKys7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHAgPSAoQ0RGUkFNRSAqKSBjZGZwOworICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgICAgIENEcGFyc2VmcmFtZShzZWxmLT5vYl9jZHBhcnNlciwgcCk7CisgICAgICAgIGxlbmd0aCAtPSBzaXplb2YoQ0RGUkFNRSk7CisgICAgICAgIHArKzsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfcmVtb3ZlY2FsbGJhY2soY2RwYXJzZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0eXBlOworICAgIGludCB0eXBlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlbW92ZWNhbGxiYWNrIiwgJnR5cGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVtb3ZlY2FsbGJhY2siLCAmdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gTkNBTExCQUNLUykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIHR5cGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh0eXBlIDwgMCB8fCB0eXBlID49IE5DQUxMQkFDS1MpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJhZCB0eXBlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCUNEcmVtb3ZlY2FsbGJhY2soc2VsZi0+b2JfY2RwYXJzZXIsIChDRERBVEFUWVBFUykgdHlwZSk7CisgICAgQ0RyZW1vdmVjYWxsYmFjayhzZWxmLT5vYl9jZHBhcnNlciwgKENEREFUQVRZUEVTKSB0eXBlKTsKIAotCVB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayk7Ci0Jc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrKTsKKyAgICBzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrID0gTlVMTDsKIAotCVB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7Ci0Jc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrYXJnKTsKKyAgICBzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrYXJnID0gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9yZXNldHBhcnNlcihjZHBhcnNlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6cmVzZXRwYXJzZXIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6cmVzZXRwYXJzZXIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDRHJlc2V0cGFyc2VyKHNlbGYtPm9iX2NkcGFyc2VyKTsKKyAgICBDRHJlc2V0cGFyc2VyKHNlbGYtPm9iX2NkcGFyc2VyKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9hZGRjYWxsYmFjayhjZHBhcnNlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHR5cGU7Ci0JUHlPYmplY3QgKmZ1bmMsICpmdW5jYXJnOworICAgIGludCB0eXBlOworICAgIFB5T2JqZWN0ICpmdW5jLCAqZnVuY2FyZzsKIAotCS8qIFhYWCAtIG1vcmUgd29yayBoZXJlICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpT086YWRkY2FsbGJhY2siLCAmdHlwZSwgJmZ1bmMsICZmdW5jYXJnKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogWFhYIC0gbW9yZSB3b3JrIGhlcmUgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPTzphZGRjYWxsYmFjayIsICZ0eXBlLCAmZnVuYywgJmZ1bmNhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICh0eXBlIDwgMCB8fCB0eXBlID49IE5DQUxMQkFDS1MpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZ3VtZW50IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gTkNBTExCQUNLUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJndW1lbnQgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogI2lmZGVmIENEc2V0Y2FsbGJhY2sKLQlDRGFkZGNhbGxiYWNrKHNlbGYtPm9iX2NkcGFyc2VyLCAoQ0REQVRBVFlQRVMpIHR5cGUsIENEX2NhbGxiYWNrLAotCQkgICAgICAodm9pZCAqKSBzZWxmKTsKKyAgICBDRGFkZGNhbGxiYWNrKHNlbGYtPm9iX2NkcGFyc2VyLCAoQ0REQVRBVFlQRVMpIHR5cGUsIENEX2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgKHZvaWQgKikgc2VsZik7CiAjZWxzZQotCUNEc2V0Y2FsbGJhY2soc2VsZi0+b2JfY2RwYXJzZXIsIChDRERBVEFUWVBFUykgdHlwZSwgQ0RfY2FsbGJhY2ssCi0JCSAgICAgICh2b2lkICopIHNlbGYpOworICAgIENEc2V0Y2FsbGJhY2soc2VsZi0+b2JfY2RwYXJzZXIsIChDRERBVEFUWVBFUykgdHlwZSwgQ0RfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAodm9pZCAqKSBzZWxmKTsKICNlbmRpZgotCVB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayk7Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCXNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2sgPSBmdW5jOwotCVB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7Ci0JUHlfSU5DUkVGKGZ1bmNhcmcpOwotCXNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcgPSBmdW5jYXJnOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayk7CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2sgPSBmdW5jOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7CisgICAgUHlfSU5DUkVGKGZ1bmNhcmcpOworICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcgPSBmdW5jYXJnOwogCiAvKgotCWlmICh0eXBlID09IGNkX2F1ZGlvKSB7Ci0JCXNpZ2ZwZV9bX1VOREVSRkxdLnJlcGxzID0gX1pFUk87Ci0JCWhhbmRsZV9zaWdmcGVzKF9PTiwgX0VOX1VOREVSRkwsIE5VTEwsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIF9BQk9SVF9PTl9FUlJPUiwgTlVMTCk7Ci0JfQorICAgIGlmICh0eXBlID09IGNkX2F1ZGlvKSB7CisgICAgICAgIHNpZ2ZwZV9bX1VOREVSRkxdLnJlcGxzID0gX1pFUk87CisgICAgICAgIGhhbmRsZV9zaWdmcGVzKF9PTiwgX0VOX1VOREVSRkwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BQk9SVF9PTl9FUlJPUiwgTlVMTCk7CisgICAgfQogKi8KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjZHBhcnNlcl9tZXRob2RzW10gPSB7Ci0JeyJhZGRjYWxsYmFjayIsCQkoUHlDRnVuY3Rpb24pQ0RfYWRkY2FsbGJhY2ssICAgCU1FVEhfVkFSQVJHU30sCi0JeyJkZWxldGVwYXJzZXIiLAkoUHlDRnVuY3Rpb24pQ0RfZGVsZXRlcGFyc2VyLAlNRVRIX1ZBUkFSR1N9LAotCXsicGFyc2VmcmFtZSIsCQkoUHlDRnVuY3Rpb24pQ0RfcGFyc2VmcmFtZSwJTUVUSF9WQVJBUkdTfSwKLQl7InJlbW92ZWNhbGxiYWNrIiwJKFB5Q0Z1bmN0aW9uKUNEX3JlbW92ZWNhbGxiYWNrLAlNRVRIX1ZBUkFSR1N9LAotCXsicmVzZXRwYXJzZXIiLAkJKFB5Q0Z1bmN0aW9uKUNEX3Jlc2V0cGFyc2VyLAlNRVRIX1ZBUkFSR1N9LAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KLQl7InNldGNhbGxiYWNrIiwJCShQeUNGdW5jdGlvbilDRF9hZGRjYWxsYmFjaywgICAJTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfSAJCS8qIHNlbnRpbmVsICovCisgICAgeyJhZGRjYWxsYmFjayIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9hZGRjYWxsYmFjaywgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImRlbGV0ZXBhcnNlciIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX2RlbGV0ZXBhcnNlciwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicGFyc2VmcmFtZSIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfcGFyc2VmcmFtZSwgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJyZW1vdmVjYWxsYmFjayIsICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9yZW1vdmVjYWxsYmFjaywgTUVUSF9WQVJBUkdTfSwKKyAgICB7InJlc2V0cGFyc2VyIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3Jlc2V0cGFyc2VyLCAgICBNRVRIX1ZBUkFSR1N9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisgICAgeyJzZXRjYWxsYmFjayIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9hZGRjYWxsYmFjaywgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgdm9pZAogY2RwYXJzZXJfZGVhbGxvYyhjZHBhcnNlcm9iamVjdCAqc2VsZikKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBOQ0FMTEJBQ0tTOyBpKyspIHsKLQkJUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrKTsKLQkJc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7Ci0JCVB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyk7Ci0JCXNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcgPSBOVUxMOwotCX0KLQlDRGRlbGV0ZXBhcnNlcihzZWxmLT5vYl9jZHBhcnNlcik7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGZvciAoaSA9IDA7IGkgPCBOQ0FMTEJBQ0tTOyBpKyspIHsKKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrKTsKKyAgICAgICAgc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyk7CisgICAgICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcgPSBOVUxMOworICAgIH0KKyAgICBDRGRlbGV0ZXBhcnNlcihzZWxmLT5vYl9jZHBhcnNlcik7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2RwYXJzZXJfZ2V0YXR0cihjZHBhcnNlcm9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKLQlpZiAoc2VsZi0+b2JfY2RwYXJzZXIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibm8gcGFyc2VyIGFjdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNlbGYtPm9iX2NkcGFyc2VyID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIm5vIHBhcnNlciBhY3RpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoY2RwYXJzZXJfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoY2RwYXJzZXJfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKIFB5VHlwZU9iamVjdCBDZFBhcnNlcnR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCS8qb2Jfc2l6ZSovCi0JImNkLmNkcGFyc2VyIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGNkcGFyc2Vyb2JqZWN0KSwJLyp0cF9zaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciljZHBhcnNlcl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWNkcGFyc2VyX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiY2QuY2RwYXJzZXIiLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoY2RwYXJzZXJvYmplY3QpLCAgICAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWNkcGFyc2VyX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYyljZHBhcnNlcl9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2NkcGFyc2Vyb2JqZWN0KENEUEFSU0VSICpjZHApCiB7Ci0JY2RwYXJzZXJvYmplY3QgKnA7Ci0JaW50IGk7CisgICAgY2RwYXJzZXJvYmplY3QgKnA7CisgICAgaW50IGk7CiAKLQlwID0gUHlPYmplY3RfTmV3KGNkcGFyc2Vyb2JqZWN0LCAmQ2RQYXJzZXJ0eXBlKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwLT5vYl9jZHBhcnNlciA9IGNkcDsKLQlmb3IgKGkgPSAwOyBpIDwgTkNBTExCQUNLUzsgaSsrKSB7Ci0JCXAtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2sgPSBOVUxMOwotCQlwLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrYXJnID0gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBwOworICAgIHAgPSBQeU9iamVjdF9OZXcoY2RwYXJzZXJvYmplY3QsICZDZFBhcnNlcnR5cGUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPm9iX2NkcGFyc2VyID0gY2RwOworICAgIGZvciAoaSA9IDA7IGkgPCBOQ0FMTEJBQ0tTOyBpKyspIHsKKyAgICAgICAgcC0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7CisgICAgICAgIHAtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9jcmVhdGVwYXJzZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUNEUEFSU0VSICpjZHA7CisgICAgQ0RQQVJTRVIgKmNkcDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmNyZWF0ZXBhcnNlciIpKQotCQlyZXR1cm4gTlVMTDsKLQljZHAgPSBDRGNyZWF0ZXBhcnNlcigpOwotCWlmIChjZHAgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgImNyZWF0ZXBhcnNlciBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmNyZWF0ZXBhcnNlciIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjZHAgPSBDRGNyZWF0ZXBhcnNlcigpOworICAgIGlmIChjZHAgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgImNyZWF0ZXBhcnNlciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG5ld2NkcGFyc2Vyb2JqZWN0KGNkcCk7CisgICAgcmV0dXJuIG5ld2NkcGFyc2Vyb2JqZWN0KGNkcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9tc2Z0b2ZyYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbWluLCBzZWMsIGZyYW1lOworICAgIGludCBtaW4sIHNlYywgZnJhbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTptc2Z0b2ZyYW1lIiwgJm1pbiwgJnNlYywgJmZyYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWk6bXNmdG9mcmFtZSIsICZtaW4sICZzZWMsICZmcmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRG1zZnRvZnJhbWUobWluLCBzZWMsIGZyYW1lKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRG1zZnRvZnJhbWUobWluLCBzZWMsIGZyYW1lKSk7CiB9Ci0JCisKIHN0YXRpYyBQeU1ldGhvZERlZiBDRF9tZXRob2RzW10gPSB7Ci0JeyJvcGVuIiwJCShQeUNGdW5jdGlvbilDRF9vcGVuLAkJTUVUSF9WQVJBUkdTfSwKLQl7ImNyZWF0ZXBhcnNlciIsCShQeUNGdW5jdGlvbilDRF9jcmVhdGVwYXJzZXIsCU1FVEhfVkFSQVJHU30sCi0JeyJtc2Z0b2ZyYW1lIiwJCShQeUNGdW5jdGlvbilDRF9tc2Z0b2ZyYW1lLAlNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7Im9wZW4iLCAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX29wZW4sICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY3JlYXRlcGFyc2VyIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfY3JlYXRlcGFyc2VyLCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJtc2Z0b2ZyYW1lIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9tc2Z0b2ZyYW1lLCAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogU2VudGluZWwgKi8KIH07CiAKIHZvaWQKIGluaXRjZCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQkKLQlpZiAoUHlFcnJfV2FyblB5M2soInRoZSBjZCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCi0JICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQotCSAgICByZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JbSA9IFB5X0luaXRNb2R1bGUoImNkIiwgQ0RfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGNkIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCUNkRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNkLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgQ2RFcnJvcik7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoImNkIiwgQ0RfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogCi0JLyogSWRlbnRpZmllcnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgY2FsbGJhY2tzIGZyb20gdGhlIHBhcnNlciAqLwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJhdWRpbyIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9hdWRpbykpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJwbnVtIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX3BudW0pKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiaW5kZXgiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfaW5kZXgpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicHRpbWUiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfcHRpbWUpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiYXRpbWUiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfYXRpbWUpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY2F0YWxvZyIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9jYXRhbG9nKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImlkZW50IiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX2lkZW50KSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImNvbnRyb2wiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfY29udHJvbCkpOworICAgIENkRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNkLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgQ2RFcnJvcik7CiAKLQkvKiBCbG9jayBzaXplIGluZm9ybWF0aW9uIGZvciBkaWdpdGFsIGF1ZGlvIGRhdGEgKi8KLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREFUQVNJWkUiLAotCQkJICAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEREFfREFUQVNJWkUpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkxPQ0tTSVpFIiwKLQkJCSAgIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRERBX0JMT0NLU0laRSkpOworICAgIC8qIElkZW50aWZpZXJzIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGNhbGxiYWNrcyBmcm9tIHRoZSBwYXJzZXIgKi8KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiYXVkaW8iLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfYXVkaW8pKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicG51bSIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9wbnVtKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImluZGV4IiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX2luZGV4KSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInB0aW1lIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX3B0aW1lKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImF0aW1lIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX2F0aW1lKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImNhdGFsb2ciLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfY2F0YWxvZykpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJpZGVudCIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9pZGVudCkpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJjb250cm9sIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX2NvbnRyb2wpKTsKIAotCS8qIFBvc3NpYmxlIHN0YXRlcyBmb3IgdGhlIGNkIHBsYXllciAqLwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUiIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRF9FUlJPUikpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT0RJU0MiLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfTk9ESVNDKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFQURZIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX1JFQURZKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBMQVlJTkciLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfUExBWUlORykpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQQVVTRUQiLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfUEFVU0VEKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNUSUxMIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX1NUSUxMKSk7Ci0jaWZkZWYgQ0RfQ0RST00JCQkvKiBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5ICovCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNEUk9NIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX0NEUk9NKSk7CisgICAgLyogQmxvY2sgc2l6ZSBpbmZvcm1hdGlvbiBmb3IgZGlnaXRhbCBhdWRpbyBkYXRhICovCisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRBVEFTSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEREFfREFUQVNJWkUpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkxPQ0tTSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEREFfQkxPQ0tTSVpFKSk7CisKKyAgICAvKiBQb3NzaWJsZSBzdGF0ZXMgZm9yIHRoZSBjZCBwbGF5ZXIgKi8KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1IiLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfRVJST1IpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9ESVNDIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX05PRElTQykpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRUFEWSIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRF9SRUFEWSkpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQTEFZSU5HIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX1BMQVlJTkcpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUEFVU0VEIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX1BBVVNFRCkpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVElMTCIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRF9TVElMTCkpOworI2lmZGVmIENEX0NEUk9NICAgICAgICAgICAgICAgICAvKiBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5ICovCisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNEUk9NIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX0NEUk9NKSk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2dlbnN1cHBvcnQuYyBiL01vZHVsZXMvY2dlbnN1cHBvcnQuYwppbmRleCA3ZTdkMGZmLi5hYWQ0M2EyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NnZW5zdXBwb3J0LmMKKysrIGIvTW9kdWxlcy9jZ2Vuc3VwcG9ydC5jCkBAIC0xMywxNTggKzEzLDE1OCBAQAogaW50CiBQeUFyZ19HZXRPYmplY3QocmVnaXN0ZXIgUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywgaW50IGksIFB5T2JqZWN0ICoqcF9hcmcpCiB7Ci0JaWYgKG5hcmdzICE9IDEpIHsKLQkJaWYgKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSB8fAotCQkJCW5hcmdzICE9IFB5VHVwbGVfU2l6ZShhcmdzKSB8fAotCQkJCWkgPCAwIHx8IGkgPj0gbmFyZ3MpIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJYXJncyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKTsKLQkJfQotCX0KLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCX0KLQkqcF9hcmcgPSBhcmdzOwotCXJldHVybiAxOworICAgIGlmIChuYXJncyAhPSAxKSB7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hcmdzICE9IFB5VHVwbGVfU2l6ZShhcmdzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaSA8IDAgfHwgaSA+PSBuYXJncykgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgfQorICAgICpwX2FyZyA9IGFyZ3M7CisgICAgcmV0dXJuIDE7CiB9CiAKIGludAogUHlBcmdfR2V0TG9uZyhyZWdpc3RlciBQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLCBpbnQgaSwgbG9uZyAqcF9hcmcpCiB7Ci0JaWYgKG5hcmdzICE9IDEpIHsKLQkJaWYgKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSB8fAotCQkJCW5hcmdzICE9IFB5VHVwbGVfU2l6ZShhcmdzKSB8fAotCQkJCWkgPCAwIHx8IGkgPj0gbmFyZ3MpIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWFyZ3MgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7Ci0JfQotCWlmIChhcmdzID09IE5VTEwgfHwgIVB5SW50X0NoZWNrKGFyZ3MpKSB7Ci0JCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCX0KLQkqcF9hcmcgPSBQeUludF9Bc0xvbmcoYXJncyk7Ci0JcmV0dXJuIDE7CisgICAgaWYgKG5hcmdzICE9IDEpIHsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbmFyZ3MgIT0gUHlUdXBsZV9TaXplKGFyZ3MpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpIDwgMCB8fCBpID49IG5hcmdzKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBhcmdzID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOworICAgIH0KKyAgICBpZiAoYXJncyA9PSBOVUxMIHx8ICFQeUludF9DaGVjayhhcmdzKSkgeworICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICB9CisgICAgKnBfYXJnID0gUHlJbnRfQXNMb25nKGFyZ3MpOworICAgIHJldHVybiAxOwogfQogCiBpbnQKIFB5QXJnX0dldFNob3J0KHJlZ2lzdGVyIFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBzaG9ydCAqcF9hcmcpCiB7Ci0JbG9uZyB4OwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCBuYXJncywgaSwgJngpKQotCQlyZXR1cm4gMDsKLQkqcF9hcmcgPSAoc2hvcnQpIHg7Ci0JcmV0dXJuIDE7CisgICAgbG9uZyB4OworICAgIGlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCBuYXJncywgaSwgJngpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqcF9hcmcgPSAoc2hvcnQpIHg7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGV4dHJhY3Rkb3VibGUocmVnaXN0ZXIgUHlPYmplY3QgKnYsIGRvdWJsZSAqcF9hcmcpCiB7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQkvKiBGYWxsIHRocm91Z2ggdG8gZXJyb3IgcmV0dXJuIGF0IGVuZCBvZiBmdW5jdGlvbiAqLwotCX0KLQllbHNlIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IFB5RmxvYXRfQVNfRE9VQkxFKChQeUZsb2F0T2JqZWN0ICopdik7Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIGlmIChQeUludF9DaGVjayh2KSkgewotCQkqcF9hcmcgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKXYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IFB5TG9uZ19Bc0RvdWJsZSh2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvIGVycm9yIHJldHVybiBhdCBlbmQgb2YgZnVuY3Rpb24gKi8KKyAgICB9CisgICAgZWxzZSBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSBQeUZsb2F0X0FTX0RPVUJMRSgoUHlGbG9hdE9iamVjdCAqKXYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgKnBfYXJnID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKil2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSBQeUxvbmdfQXNEb3VibGUodik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKIH0KIAogc3RhdGljIGludAogZXh0cmFjdGZsb2F0KHJlZ2lzdGVyIFB5T2JqZWN0ICp2LCBmbG9hdCAqcF9hcmcpCiB7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQkvKiBGYWxsIHRocm91Z2ggdG8gZXJyb3IgcmV0dXJuIGF0IGVuZCBvZiBmdW5jdGlvbiAqLwotCX0KLQllbHNlIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IChmbG9hdCkgUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QgKil2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IChmbG9hdCkgUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKil2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjayh2KSkgewotCQkqcF9hcmcgPSAoZmxvYXQpIFB5TG9uZ19Bc0RvdWJsZSh2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvIGVycm9yIHJldHVybiBhdCBlbmQgb2YgZnVuY3Rpb24gKi8KKyAgICB9CisgICAgZWxzZSBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSAoZmxvYXQpIFB5RmxvYXRfQVNfRE9VQkxFKChQeUZsb2F0T2JqZWN0ICopdik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSAoZmxvYXQpIFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopdik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2sodikpIHsKKyAgICAgICAgKnBfYXJnID0gKGZsb2F0KSBQeUxvbmdfQXNEb3VibGUodik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKIH0KIAogaW50CiBQeUFyZ19HZXRGbG9hdChyZWdpc3RlciBQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLCBpbnQgaSwgZmxvYXQgKnBfYXJnKQogewotCVB5T2JqZWN0ICp2OwotCWZsb2F0IHg7Ci0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgbmFyZ3MsIGksICZ2KSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFleHRyYWN0ZmxvYXQodiwgJngpKQotCQlyZXR1cm4gMDsKLQkqcF9hcmcgPSB4OwotCXJldHVybiAxOworICAgIFB5T2JqZWN0ICp2OworICAgIGZsb2F0IHg7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgbmFyZ3MsIGksICZ2KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFleHRyYWN0ZmxvYXQodiwgJngpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqcF9hcmcgPSB4OworICAgIHJldHVybiAxOwogfQogCiBpbnQKIFB5QXJnX0dldFN0cmluZyhQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLCBpbnQgaSwgc3RyaW5nICpwX2FyZykKIHsKLQlQeU9iamVjdCAqdjsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQotCQlyZXR1cm4gMDsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCX0KLQkqcF9hcmcgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQlyZXR1cm4gMTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KKyAgICAqcF9hcmcgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICByZXR1cm4gMTsKIH0KIAogaW50CiBQeUFyZ19HZXRDaGFyKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBjaGFyICpwX2FyZykKIHsKLQlzdHJpbmcgeDsKLQlpZiAoIVB5QXJnX0dldFN0cmluZyhhcmdzLCBuYXJncywgaSwgJngpKQotCQlyZXR1cm4gMDsKLQlpZiAoeFswXSA9PSAnXDAnIHx8IHhbMV0gIT0gJ1wwJykgewotCQkvKiBOb3QgZXhhY3RseSBvbmUgY2hhciAqLwotCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQl9Ci0JKnBfYXJnID0geFswXTsKLQlyZXR1cm4gMTsKKyAgICBzdHJpbmcgeDsKKyAgICBpZiAoIVB5QXJnX0dldFN0cmluZyhhcmdzLCBuYXJncywgaSwgJngpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoeFswXSA9PSAnXDAnIHx8IHhbMV0gIT0gJ1wwJykgeworICAgICAgICAvKiBOb3QgZXhhY3RseSBvbmUgY2hhciAqLworICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICB9CisgICAgKnBfYXJnID0geFswXTsKKyAgICByZXR1cm4gMTsKIH0KIAogaW50CiBQeUFyZ19HZXRMb25nQXJyYXlTaXplKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBsb25nICpwX2FyZykKIHsKLQlQeU9iamVjdCAqdjsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQotCQlyZXR1cm4gMDsKLQlpZiAoUHlUdXBsZV9DaGVjayh2KSkgewotCQkqcF9hcmcgPSBQeVR1cGxlX1NpemUodik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoUHlMaXN0X0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IFB5TGlzdF9TaXplKHYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgbmFyZ3MsIGksICZ2KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKKyAgICAgICAgKnBfYXJnID0gUHlUdXBsZV9TaXplKHYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKFB5TGlzdF9DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSBQeUxpc3RfU2l6ZSh2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwogfQogCiBpbnQKIFB5QXJnX0dldFNob3J0QXJyYXlTaXplKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBzaG9ydCAqcF9hcmcpCiB7Ci0JbG9uZyB4OwotCWlmICghUHlBcmdfR2V0TG9uZ0FycmF5U2l6ZShhcmdzLCBuYXJncywgaSwgJngpKQotCQlyZXR1cm4gMDsKLQkqcF9hcmcgPSAoc2hvcnQpIHg7Ci0JcmV0dXJuIDE7CisgICAgbG9uZyB4OworICAgIGlmICghUHlBcmdfR2V0TG9uZ0FycmF5U2l6ZShhcmdzLCBuYXJncywgaSwgJngpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAqcF9hcmcgPSAoc2hvcnQpIHg7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIFhYWCBUaGUgZm9sbG93aW5nIGZvdXIgYXJlIHRvbyBzaW1pbGFyLiAgU2hvdWxkIHNoYXJlIG1vcmUgY29kZS4gKi8KQEAgLTE3MiwxMzkgKzE3MiwxMzkgQEAKIGludAogUHlBcmdfR2V0TG9uZ0FycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBpbnQgbiwgbG9uZyAqcF9hcmcpCiB7Ci0JUHlPYmplY3QgKnYsICp3OwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCi0JCXJldHVybiAwOwotCWlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCWlmIChQeVR1cGxlX1NpemUodikgIT0gbikgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghUHlJbnRfQ2hlY2sodykpIHsKLQkJCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCX0KLQkJCXBfYXJnW2ldID0gUHlJbnRfQXNMb25nKHcpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIGlmIChQeUxpc3RfQ2hlY2sodikpIHsKLQkJaWYgKFB5TGlzdF9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeUxpc3RfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghUHlJbnRfQ2hlY2sodykpIHsKLQkJCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCX0KLQkJCXBfYXJnW2ldID0gUHlJbnRfQXNMb25nKHcpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JfQorICAgIFB5T2JqZWN0ICp2LCAqdzsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlUdXBsZV9TaXplKHYpICE9IG4pIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHcgPSBQeVR1cGxlX0dldEl0ZW0odiwgaSk7CisgICAgICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2FyZ1tpXSA9IFB5SW50X0FzTG9uZyh3KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeUxpc3RfU2l6ZSh2KSAhPSBuKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB3ID0gUHlMaXN0X0dldEl0ZW0odiwgaSk7CisgICAgICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2FyZ1tpXSA9IFB5SW50X0FzTG9uZyh3KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KIH0KIAogaW50CiBQeUFyZ19HZXRTaG9ydEFycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBpbnQgbiwgc2hvcnQgKnBfYXJnKQogewotCVB5T2JqZWN0ICp2LCAqdzsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQotCQlyZXR1cm4gMDsKLQlpZiAoUHlUdXBsZV9DaGVjayh2KSkgewotCQlpZiAoUHlUdXBsZV9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeVR1cGxlX0dldEl0ZW0odiwgaSk7Ci0JCQlpZiAoIVB5SW50X0NoZWNrKHcpKSB7Ci0JCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQl9Ci0JCQlwX2FyZ1tpXSA9IChzaG9ydCkgUHlJbnRfQXNMb25nKHcpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIGlmIChQeUxpc3RfQ2hlY2sodikpIHsKLQkJaWYgKFB5TGlzdF9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeUxpc3RfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghUHlJbnRfQ2hlY2sodykpIHsKLQkJCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCX0KLQkJCXBfYXJnW2ldID0gKHNob3J0KSBQeUludF9Bc0xvbmcodyk7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQl9CisgICAgUHlPYmplY3QgKnYsICp3OworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeVR1cGxlX1NpemUodikgIT0gbikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKKyAgICAgICAgICAgIGlmICghUHlJbnRfQ2hlY2sodykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfYXJnW2ldID0gKHNob3J0KSBQeUludF9Bc0xvbmcodyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TGlzdF9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlMaXN0X1NpemUodikgIT0gbikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdyA9IFB5TGlzdF9HZXRJdGVtKHYsIGkpOworICAgICAgICAgICAgaWYgKCFQeUludF9DaGVjayh3KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9hcmdbaV0gPSAoc2hvcnQpIFB5SW50X0FzTG9uZyh3KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KIH0KIAogaW50CiBQeUFyZ19HZXREb3VibGVBcnJheShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLCBpbnQgaSwgaW50IG4sIGRvdWJsZSAqcF9hcmcpCiB7Ci0JUHlPYmplY3QgKnYsICp3OwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCi0JCXJldHVybiAwOwotCWlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCWlmIChQeVR1cGxlX1NpemUodikgIT0gbikgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghZXh0cmFjdGRvdWJsZSh3LCAmcF9hcmdbaV0pKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIGlmIChQeUxpc3RfQ2hlY2sodikpIHsKLQkJaWYgKFB5TGlzdF9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeUxpc3RfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghZXh0cmFjdGRvdWJsZSh3LCAmcF9hcmdbaV0pKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JfQorICAgIFB5T2JqZWN0ICp2LCAqdzsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlUdXBsZV9TaXplKHYpICE9IG4pIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHcgPSBQeVR1cGxlX0dldEl0ZW0odiwgaSk7CisgICAgICAgICAgICBpZiAoIWV4dHJhY3Rkb3VibGUodywgJnBfYXJnW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeUxpc3RfU2l6ZSh2KSAhPSBuKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB3ID0gUHlMaXN0X0dldEl0ZW0odiwgaSk7CisgICAgICAgICAgICBpZiAoIWV4dHJhY3Rkb3VibGUodywgJnBfYXJnW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KIH0KIAogaW50CiBQeUFyZ19HZXRGbG9hdEFycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBpbnQgbiwgZmxvYXQgKnBfYXJnKQogewotCVB5T2JqZWN0ICp2LCAqdzsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQotCQlyZXR1cm4gMDsKLQlpZiAoUHlUdXBsZV9DaGVjayh2KSkgewotCQlpZiAoUHlUdXBsZV9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeVR1cGxlX0dldEl0ZW0odiwgaSk7Ci0JCQlpZiAoIWV4dHJhY3RmbG9hdCh3LCAmcF9hcmdbaV0pKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIGlmIChQeUxpc3RfQ2hlY2sodikpIHsKLQkJaWYgKFB5TGlzdF9TaXplKHYpICE9IG4pIHsKLQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXcgPSBQeUxpc3RfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghZXh0cmFjdGZsb2F0KHcsICZwX2FyZ1tpXSkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQl9CisgICAgUHlPYmplY3QgKnYsICp3OworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeVR1cGxlX1NpemUodikgIT0gbikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKKyAgICAgICAgICAgIGlmICghZXh0cmFjdGZsb2F0KHcsICZwX2FyZ1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TGlzdF9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlMaXN0X1NpemUodikgIT0gbikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdyA9IFB5TGlzdF9HZXRJdGVtKHYsIGkpOworICAgICAgICAgICAgaWYgKCFleHRyYWN0ZmxvYXQodywgJnBfYXJnW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2dlbnN1cHBvcnQuaCBiL01vZHVsZXMvY2dlbnN1cHBvcnQuaAppbmRleCBiYzkwMWY2Li4yN2UxMjYxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NnZW5zdXBwb3J0LmgKKysrIGIvTW9kdWxlcy9jZ2Vuc3VwcG9ydC5oCkBAIC0zMCwzMyArMzAsMzMgQEAKICNkZWZpbmUgZ2V0aXN0cmluZ2FyZyBQeUFyZ19HZXRTdHJpbmcKIAogZXh0ZXJuIGludCBQeUFyZ19HZXRPYmplY3QoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywKLQkJCSAgIGludCBpLCBQeU9iamVjdCAqKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgUHlPYmplY3QgKipwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRMb25nKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkgaW50IGksIGxvbmcgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGxvbmcgKnBfYSk7CiBleHRlcm4gaW50IFB5QXJnX0dldFNob3J0KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkgIGludCBpLCBzaG9ydCAqcF9hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIHNob3J0ICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRGbG9hdChQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJICBpbnQgaSwgZmxvYXQgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBmbG9hdCAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0U3RyaW5nKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkgICBpbnQgaSwgc3RyaW5nICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIHN0cmluZyAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0Q2hhcihQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJIGludCBpLCBjaGFyICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBjaGFyICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRMb25nQXJyYXkoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywKLQkJCSAgICBpbnQgaSwgaW50IG4sIGxvbmcgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBuLCBsb25nICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRTaG9ydEFycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkgICAgaW50IGksIGludCBuLCBzaG9ydCAqcF9hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IG4sIHNob3J0ICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXREb3VibGVBcnJheShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJCWludCBpLCBpbnQgbiwgZG91YmxlICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IG4sIGRvdWJsZSAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0RmxvYXRBcnJheShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJICAgICAgIGludCBpLCBpbnQgbiwgZmxvYXQgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBuLCBmbG9hdCAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0TG9uZ0FycmF5U2l6ZShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJCSAgaW50IGksIGxvbmcgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGxvbmcgKnBfYSk7CiBleHRlcm4gaW50IFB5QXJnX0dldFNob3J0QXJyYXlTaXplKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkJaW50IGksIHNob3J0ICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgc2hvcnQgKnBfYSk7CiBleHRlcm4gaW50IFB5QXJnX0dldERvdWJsZUFycmF5U2l6ZShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJCSAgICBpbnQgaSwgZG91YmxlICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGRvdWJsZSAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0RmxvYXRBcnJheVNpemUoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywKLQkJCQkgICBpbnQgaSwgZmxvYXQgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBmbG9hdCAqcF9hKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2NuLmMgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2NuLmMKaW5kZXggNDU0MmNlNi4uYWI0ZTY1OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19jbi5jCisrKyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfY24uYwpAQCAtMTcsMjQgKzE3LDI0IEBACiAKIC8qIEdCSyBhbmQgR0IyMzEyIG1hcCBkaWZmZXJlbnRseSBpbiBmZXcgY29kZXBvaW50cyB0aGF0IGFyZSBsaXN0ZWQgYmVsb3c6CiAgKgotICoJCWdiMjMxMgkJCQlnYmsKLSAqIEExQTQJCVUrMzBGQiBLQVRBS0FOQSBNSURETEUgRE9UCVUrMDBCNyBNSURETEUgRE9UCi0gKiBBMUFBCQlVKzIwMTUgSE9SSVpPTlRBTCBCQVIJCVUrMjAxNCBFTSBEQVNICi0gKiBBODQ0CQl1bmRlZmluZWQJCQlVKzIwMTUgSE9SSVpPTlRBTCBCQVIKKyAqICAgICAgICAgICAgICBnYjIzMTIgICAgICAgICAgICAgICAgICAgICAgICAgIGdiaworICogQTFBNCAgICAgICAgIFUrMzBGQiBLQVRBS0FOQSBNSURETEUgRE9UICAgICAgVSswMEI3IE1JRERMRSBET1QKKyAqIEExQUEgICAgICAgICBVKzIwMTUgSE9SSVpPTlRBTCBCQVIgICAgICAgICAgIFUrMjAxNCBFTSBEQVNICisgKiBBODQ0ICAgICAgICAgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTUgSE9SSVpPTlRBTCBCQVIKICAqLwogCiAjZGVmaW5lIEdCS19ERUNPREUoZGMxLCBkYzIsIGFzc2kpIFwKLQlpZiAoKGRjMSkgPT0gMHhhMSAmJiAoZGMyKSA9PSAweGFhKSAoYXNzaSkgPSAweDIwMTQ7IFwKLQllbHNlIGlmICgoZGMxKSA9PSAweGE4ICYmIChkYzIpID09IDB4NDQpIChhc3NpKSA9IDB4MjAxNTsgXAotCWVsc2UgaWYgKChkYzEpID09IDB4YTEgJiYgKGRjMikgPT0gMHhhNCkgKGFzc2kpID0gMHgwMGI3OyBcCi0JZWxzZSBUUllNQVBfREVDKGdiMjMxMiwgYXNzaSwgZGMxIF4gMHg4MCwgZGMyIF4gMHg4MCk7IFwKLQllbHNlIFRSWU1BUF9ERUMoZ2JrZXh0LCBhc3NpLCBkYzEsIGRjMik7CisgICAgaWYgKChkYzEpID09IDB4YTEgJiYgKGRjMikgPT0gMHhhYSkgKGFzc2kpID0gMHgyMDE0OyBcCisgICAgZWxzZSBpZiAoKGRjMSkgPT0gMHhhOCAmJiAoZGMyKSA9PSAweDQ0KSAoYXNzaSkgPSAweDIwMTU7IFwKKyAgICBlbHNlIGlmICgoZGMxKSA9PSAweGExICYmIChkYzIpID09IDB4YTQpIChhc3NpKSA9IDB4MDBiNzsgXAorICAgIGVsc2UgVFJZTUFQX0RFQyhnYjIzMTIsIGFzc2ksIGRjMSBeIDB4ODAsIGRjMiBeIDB4ODApOyBcCisgICAgZWxzZSBUUllNQVBfREVDKGdia2V4dCwgYXNzaSwgZGMxLCBkYzIpOwogCiAjZGVmaW5lIEdCS19FTkNPREUoY29kZSwgYXNzaSkgXAotCWlmICgoY29kZSkgPT0gMHgyMDE0KSAoYXNzaSkgPSAweGExYWE7IFwKLQllbHNlIGlmICgoY29kZSkgPT0gMHgyMDE1KSAoYXNzaSkgPSAweGE4NDQ7IFwKLQllbHNlIGlmICgoY29kZSkgPT0gMHgwMGI3KSAoYXNzaSkgPSAweGExYTQ7IFwKLQllbHNlIGlmICgoY29kZSkgIT0gMHgzMGZiICYmIFRSWU1BUF9FTkNfQ09ORChnYmNvbW1vbiwgYXNzaSwgY29kZSkpOworICAgIGlmICgoY29kZSkgPT0gMHgyMDE0KSAoYXNzaSkgPSAweGExYWE7IFwKKyAgICBlbHNlIGlmICgoY29kZSkgPT0gMHgyMDE1KSAoYXNzaSkgPSAweGE4NDQ7IFwKKyAgICBlbHNlIGlmICgoY29kZSkgPT0gMHgwMGI3KSAoYXNzaSkgPSAweGExYTQ7IFwKKyAgICBlbHNlIGlmICgoY29kZSkgIT0gMHgzMGZiICYmIFRSWU1BUF9FTkNfQ09ORChnYmNvbW1vbiwgYXNzaSwgY29kZSkpOwogCiAvKgogICogR0IyMzEyIGNvZGVjCkBAIC00Miw1MyArNDIsNTMgQEAKIAogRU5DT0RFUihnYjIzMTIpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQotCQlUUllNQVBfRU5DKGdiY29tbW9uLCBjb2RlLCBjKTsKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgVFJZTUFQX0VOQyhnYmNvbW1vbiwgY29kZSwgYyk7CisgICAgICAgIGVsc2UgcmV0dXJuIDE7CiAKLQkJaWYgKGNvZGUgJiAweDgwMDApIC8qIE1TQiBzZXQ6IEdCSyAqLwotCQkJcmV0dXJuIDE7CisgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKSAvKiBNU0Igc2V0OiBHQksgKi8KKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCU9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQotCQlPVVQyKChjb2RlICYgMHhGRikgfCAweDgwKQotCQlORVhUKDEsIDIpCi0JfQorICAgICAgICBPVVQxKChjb2RlID4+IDgpIHwgMHg4MCkKKyAgICAgICAgT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkKKyAgICAgICAgTkVYVCgxLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGdiMjMxMikKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSAqKmluYnVmOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9ICoqaW5idWY7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCi0JCVRSWU1BUF9ERUMoZ2IyMzEyLCAqKm91dGJ1ZiwgYyBeIDB4ODAsIElOMiBeIDB4ODApIHsKLQkJCU5FWFQoMiwgMSkKLQkJfQotCQllbHNlIHJldHVybiAyOwotCX0KKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICBUUllNQVBfREVDKGdiMjMxMiwgKipvdXRidWYsIGMgXiAweDgwLCBJTjIgXiAweDgwKSB7CisgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgIH0KKyAgICAgICAgZWxzZSByZXR1cm4gMjsKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC05OCw1NSArOTgsNTUgQEAKIAogRU5DT0RFUihnYmspCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBSRVFVSVJFX09VVEJVRigyKQogCi0JCUdCS19FTkNPREUoYywgY29kZSkKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgR0JLX0VOQ09ERShjLCBjb2RlKQorICAgICAgICBlbHNlIHJldHVybiAxOwogCi0JCU9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQotCQlpZiAoY29kZSAmIDB4ODAwMCkKLQkJCU9VVDIoKGNvZGUgJiAweEZGKSkgLyogTVNCIHNldDogR0JLICovCi0JCWVsc2UKLQkJCU9VVDIoKGNvZGUgJiAweEZGKSB8IDB4ODApIC8qIE1TQiB1bnNldDogR0IyMzEyICovCi0JCU5FWFQoMSwgMikKLQl9CisgICAgICAgIE9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQorICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkKKyAgICAgICAgICAgIE9VVDIoKGNvZGUgJiAweEZGKSkgLyogTVNCIHNldDogR0JLICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE9VVDIoKGNvZGUgJiAweEZGKSB8IDB4ODApIC8qIE1TQiB1bnNldDogR0IyMzEyICovCisgICAgICAgIE5FWFQoMSwgMikKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUihnYmspCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKIAotCQlSRVFVSVJFX09VVEJVRigxKQorICAgICAgICBSRVFVSVJFX09VVEJVRigxKQogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJT1VUMShjKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBPVVQxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKQogCi0JCUdCS19ERUNPREUoYywgSU4yLCAqKm91dGJ1ZikKLQkJZWxzZSByZXR1cm4gMjsKKyAgICAgICAgR0JLX0RFQ09ERShjLCBJTjIsICoqb3V0YnVmKQorICAgICAgICBlbHNlIHJldHVybiAyOwogCi0JCU5FWFQoMiwgMSkKLQl9CisgICAgICAgIE5FWFQoMiwgMSkKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0xNTYsMTUzICsxNTYsMTUzIEBACiAKIEVOQ09ERVIoZ2IxODAzMCkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1Y3M0X3QgYyA9IElOMTsKLQkJREJDSEFSIGNvZGU7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdWNzNF90IGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlERUNPREVfU1VSUk9HQVRFKGMpCi0JCWlmIChjID4gMHgxMEZGRkYpCisgICAgICAgIERFQ09ERV9TVVJST0dBVEUoYykKKyAgICAgICAgaWYgKGMgPiAweDEwRkZGRikKICNpZiBQeV9VTklDT0RFX1NJWkUgPT0gMgotCQkJcmV0dXJuIDI7IC8qIHN1cnJvZ2F0ZXMgcGFpciAqLworICAgICAgICAgICAgcmV0dXJuIDI7IC8qIHN1cnJvZ2F0ZXMgcGFpciAqLwogI2Vsc2UKLQkJCXJldHVybiAxOworICAgICAgICAgICAgcmV0dXJuIDE7CiAjZW5kaWYKLQkJZWxzZSBpZiAoYyA+PSAweDEwMDAwKSB7Ci0JCQl1Y3M0X3QgdGMgPSBjIC0gMHgxMDAwMDsKKyAgICAgICAgZWxzZSBpZiAoYyA+PSAweDEwMDAwKSB7CisgICAgICAgICAgICB1Y3M0X3QgdGMgPSBjIC0gMHgxMDAwMDsKIAotCQkJUkVRVUlSRV9PVVRCVUYoNCkKKyAgICAgICAgICAgIFJFUVVJUkVfT1VUQlVGKDQpCiAKLQkJCU9VVDQoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKLQkJCXRjIC89IDEwOwotCQkJT1VUMygodW5zaWduZWQgY2hhcikodGMgJSAxMjYpICsgMHg4MSkKLQkJCXRjIC89IDEyNjsKLQkJCU9VVDIoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKLQkJCXRjIC89IDEwOwotCQkJT1VUMSgodW5zaWduZWQgY2hhcikodGMgKyAweDkwKSkKKyAgICAgICAgICAgIE9VVDQoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKKyAgICAgICAgICAgIHRjIC89IDEwOworICAgICAgICAgICAgT1VUMygodW5zaWduZWQgY2hhcikodGMgJSAxMjYpICsgMHg4MSkKKyAgICAgICAgICAgIHRjIC89IDEyNjsKKyAgICAgICAgICAgIE9VVDIoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKKyAgICAgICAgICAgIHRjIC89IDEwOworICAgICAgICAgICAgT1VUMSgodW5zaWduZWQgY2hhcikodGMgKyAweDkwKSkKIAogI2lmIFB5X1VOSUNPREVfU0laRSA9PSAyCi0JCQlORVhUKDIsIDQpIC8qIHN1cnJvZ2F0ZXMgcGFpciAqLworICAgICAgICAgICAgTkVYVCgyLCA0KSAvKiBzdXJyb2dhdGVzIHBhaXIgKi8KICNlbHNlCi0JCQlORVhUKDEsIDQpCisgICAgICAgICAgICBORVhUKDEsIDQpCiAjZW5kaWYKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfT1VUQlVGKDIpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDIpCiAKLQkJR0JLX0VOQ09ERShjLCBjb2RlKQotCQllbHNlIFRSWU1BUF9FTkMoZ2IxODAzMGV4dCwgY29kZSwgYyk7Ci0JCWVsc2UgewotCQkJY29uc3Qgc3RydWN0IF9nYjE4MDMwX3RvX3VuaWJtcF9yYW5nZXMgKnV0cnJhbmdlOworICAgICAgICBHQktfRU5DT0RFKGMsIGNvZGUpCisgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhnYjE4MDMwZXh0LCBjb2RlLCBjKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2diMTgwMzBfdG9fdW5pYm1wX3JhbmdlcyAqdXRycmFuZ2U7CiAKLQkJCVJFUVVJUkVfT1VUQlVGKDQpCisgICAgICAgICAgICBSRVFVSVJFX09VVEJVRig0KQogCi0JCQlmb3IgKHV0cnJhbmdlID0gZ2IxODAzMF90b191bmlibXBfcmFuZ2VzOwotCQkJICAgICB1dHJyYW5nZS0+Zmlyc3QgIT0gMDsKLQkJCSAgICAgdXRycmFuZ2UrKykKLQkJCQlpZiAodXRycmFuZ2UtPmZpcnN0IDw9IGMgJiYKLQkJCQkgICAgYyA8PSB1dHJyYW5nZS0+bGFzdCkgewotCQkJCQlQeV9VTklDT0RFIHRjOworICAgICAgICAgICAgZm9yICh1dHJyYW5nZSA9IGdiMTgwMzBfdG9fdW5pYm1wX3JhbmdlczsKKyAgICAgICAgICAgICAgICAgdXRycmFuZ2UtPmZpcnN0ICE9IDA7CisgICAgICAgICAgICAgICAgIHV0cnJhbmdlKyspCisgICAgICAgICAgICAgICAgaWYgKHV0cnJhbmdlLT5maXJzdCA8PSBjICYmCisgICAgICAgICAgICAgICAgICAgIGMgPD0gdXRycmFuZ2UtPmxhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfVU5JQ09ERSB0YzsKIAotCQkJCQl0YyA9IGMgLSB1dHJyYW5nZS0+Zmlyc3QgKwotCQkJCQkgICAgIHV0cnJhbmdlLT5iYXNlOworICAgICAgICAgICAgICAgICAgICB0YyA9IGMgLSB1dHJyYW5nZS0+Zmlyc3QgKworICAgICAgICAgICAgICAgICAgICAgICAgIHV0cnJhbmdlLT5iYXNlOwogCi0JCQkJCU9VVDQoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKLQkJCQkJdGMgLz0gMTA7Ci0JCQkJCU9VVDMoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTI2KSArIDB4ODEpCi0JCQkJCXRjIC89IDEyNjsKLQkJCQkJT1VUMigodW5zaWduZWQgY2hhcikodGMgJSAxMCkgKyAweDMwKQotCQkJCQl0YyAvPSAxMDsKLQkJCQkJT1VUMSgodW5zaWduZWQgY2hhcil0YyArIDB4ODEpCisgICAgICAgICAgICAgICAgICAgIE9VVDQoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTApICsgMHgzMCkKKyAgICAgICAgICAgICAgICAgICAgdGMgLz0gMTA7CisgICAgICAgICAgICAgICAgICAgIE9VVDMoKHVuc2lnbmVkIGNoYXIpKHRjICUgMTI2KSArIDB4ODEpCisgICAgICAgICAgICAgICAgICAgIHRjIC89IDEyNjsKKyAgICAgICAgICAgICAgICAgICAgT1VUMigodW5zaWduZWQgY2hhcikodGMgJSAxMCkgKyAweDMwKQorICAgICAgICAgICAgICAgICAgICB0YyAvPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgT1VUMSgodW5zaWduZWQgY2hhcil0YyArIDB4ODEpCiAKLQkJCQkJTkVYVCgxLCA0KQotCQkJCQlicmVhazsKLQkJCQl9CisgICAgICAgICAgICAgICAgICAgIE5FWFQoMSwgNCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0JCQlpZiAodXRycmFuZ2UtPmZpcnN0ID09IDApCi0JCQkJcmV0dXJuIDE7Ci0JCQljb250aW51ZTsKLQkJfQorICAgICAgICAgICAgaWYgKHV0cnJhbmdlLT5maXJzdCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlPVVQxKChjb2RlID4+IDgpIHwgMHg4MCkKLQkJaWYgKGNvZGUgJiAweDgwMDApCi0JCQlPVVQyKChjb2RlICYgMHhGRikpIC8qIE1TQiBzZXQ6IEdCSyBvciBHQjE4MDMwZXh0ICovCi0JCWVsc2UKLQkJCU9VVDIoKGNvZGUgJiAweEZGKSB8IDB4ODApIC8qIE1TQiB1bnNldDogR0IyMzEyICovCisgICAgICAgIE9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQorICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkKKyAgICAgICAgICAgIE9VVDIoKGNvZGUgJiAweEZGKSkgLyogTVNCIHNldDogR0JLIG9yIEdCMTgwMzBleHQgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkgLyogTVNCIHVuc2V0OiBHQjIzMTIgKi8KIAotCQlORVhUKDEsIDIpCi0JfQorICAgICAgICBORVhUKDEsIDIpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVIoZ2IxODAzMCkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjEsIGMyOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMSwgYzI7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKIAotCQljMiA9IElOMjsKLQkJaWYgKGMyID49IDB4MzAgJiYgYzIgPD0gMHgzOSkgeyAvKiA0IGJ5dGVzIHNlcSAqLwotCQkJY29uc3Qgc3RydWN0IF9nYjE4MDMwX3RvX3VuaWJtcF9yYW5nZXMgKnV0cjsKLQkJCXVuc2lnbmVkIGNoYXIgYzMsIGM0OwotCQkJdWNzNF90IGxzZXE7CisgICAgICAgIGMyID0gSU4yOworICAgICAgICBpZiAoYzIgPj0gMHgzMCAmJiBjMiA8PSAweDM5KSB7IC8qIDQgYnl0ZXMgc2VxICovCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2diMTgwMzBfdG9fdW5pYm1wX3JhbmdlcyAqdXRyOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjMywgYzQ7CisgICAgICAgICAgICB1Y3M0X3QgbHNlcTsKIAotCQkJUkVRVUlSRV9JTkJVRig0KQotCQkJYzMgPSBJTjM7Ci0JCQljNCA9IElONDsKLQkJCWlmIChjIDwgMHg4MSB8fCBjMyA8IDB4ODEgfHwgYzQgPCAweDMwIHx8IGM0ID4gMHgzOSkKLQkJCQlyZXR1cm4gNDsKLQkJCWMgLT0gMHg4MTsgIGMyIC09IDB4MzA7Ci0JCQljMyAtPSAweDgxOyBjNCAtPSAweDMwOworICAgICAgICAgICAgUkVRVUlSRV9JTkJVRig0KQorICAgICAgICAgICAgYzMgPSBJTjM7CisgICAgICAgICAgICBjNCA9IElONDsKKyAgICAgICAgICAgIGlmIChjIDwgMHg4MSB8fCBjMyA8IDB4ODEgfHwgYzQgPCAweDMwIHx8IGM0ID4gMHgzOSkKKyAgICAgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgICAgIGMgLT0gMHg4MTsgIGMyIC09IDB4MzA7CisgICAgICAgICAgICBjMyAtPSAweDgxOyBjNCAtPSAweDMwOwogCi0JCQlpZiAoYyA8IDQpIHsgLyogVSswMDgwIC0gVStGRkZGICovCi0JCQkJbHNlcSA9ICgodWNzNF90KWMgKiAxMCArIGMyKSAqIDEyNjAgKwotCQkJCQkodWNzNF90KWMzICogMTAgKyBjNDsKLQkJCQlpZiAobHNlcSA8IDM5NDIwKSB7Ci0JCQkJCWZvciAodXRyID0gZ2IxODAzMF90b191bmlibXBfcmFuZ2VzOwotCQkJCQkgICAgIGxzZXEgPj0gKHV0ciArIDEpLT5iYXNlOwotCQkJCQkgICAgIHV0cisrKSA7Ci0JCQkJCU9VVDEodXRyLT5maXJzdCAtIHV0ci0+YmFzZSArIGxzZXEpCi0JCQkJCU5FWFQoNCwgMSkKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYyA+PSAxNSkgeyAvKiBVKzEwMDAwIC0gVSsxMEZGRkYgKi8KLQkJCQlsc2VxID0gMHgxMDAwMCArICgoKHVjczRfdCljLTE1KSAqIDEwICsgYzIpCi0JCQkJCSogMTI2MCArICh1Y3M0X3QpYzMgKiAxMCArIGM0OwotCQkJCWlmIChsc2VxIDw9IDB4MTBGRkZGKSB7Ci0JCQkJCVdSSVRFVUNTNChsc2VxKTsKLQkJCQkJTkVYVF9JTig0KQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gNDsKLQkJfQorICAgICAgICAgICAgaWYgKGMgPCA0KSB7IC8qIFUrMDA4MCAtIFUrRkZGRiAqLworICAgICAgICAgICAgICAgIGxzZXEgPSAoKHVjczRfdCljICogMTAgKyBjMikgKiAxMjYwICsKKyAgICAgICAgICAgICAgICAgICAgKHVjczRfdCljMyAqIDEwICsgYzQ7CisgICAgICAgICAgICAgICAgaWYgKGxzZXEgPCAzOTQyMCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHV0ciA9IGdiMTgwMzBfdG9fdW5pYm1wX3JhbmdlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICBsc2VxID49ICh1dHIgKyAxKS0+YmFzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dHIrKykgOworICAgICAgICAgICAgICAgICAgICBPVVQxKHV0ci0+Zmlyc3QgLSB1dHItPmJhc2UgKyBsc2VxKQorICAgICAgICAgICAgICAgICAgICBORVhUKDQsIDEpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gMTUpIHsgLyogVSsxMDAwMCAtIFUrMTBGRkZGICovCisgICAgICAgICAgICAgICAgbHNlcSA9IDB4MTAwMDAgKyAoKCh1Y3M0X3QpYy0xNSkgKiAxMCArIGMyKQorICAgICAgICAgICAgICAgICAgICAqIDEyNjAgKyAodWNzNF90KWMzICogMTAgKyBjNDsKKyAgICAgICAgICAgICAgICBpZiAobHNlcSA8PSAweDEwRkZGRikgeworICAgICAgICAgICAgICAgICAgICBXUklURVVDUzQobHNlcSk7CisgICAgICAgICAgICAgICAgICAgIE5FWFRfSU4oNCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIH0KIAotCQlHQktfREVDT0RFKGMsIGMyLCAqKm91dGJ1ZikKLQkJZWxzZSBUUllNQVBfREVDKGdiMTgwMzBleHQsICoqb3V0YnVmLCBjLCBjMik7Ci0JCWVsc2UgcmV0dXJuIDI7CisgICAgICAgIEdCS19ERUNPREUoYywgYzIsICoqb3V0YnVmKQorICAgICAgICBlbHNlIFRSWU1BUF9ERUMoZ2IxODAzMGV4dCwgKipvdXRidWYsIGMsIGMyKTsKKyAgICAgICAgZWxzZSByZXR1cm4gMjsKIAotCQlORVhUKDIsIDEpCi0JfQorICAgICAgICBORVhUKDIsIDEpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMzEyLDExOCArMzEyLDExOCBAQAogCiBFTkNPREVSX0lOSVQoaHopCiB7Ci0Jc3RhdGUtPmkgPSAwOwotCXJldHVybiAwOworICAgIHN0YXRlLT5pID0gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogRU5DT0RFUl9SRVNFVChoeikKIHsKLQlpZiAoc3RhdGUtPmkgIT0gMCkgewotCQlXUklURTIoJ34nLCAnfScpCi0JCXN0YXRlLT5pID0gMDsKLQkJTkVYVF9PVVQoMikKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKHN0YXRlLT5pICE9IDApIHsKKyAgICAgICAgV1JJVEUyKCd+JywgJ30nKQorICAgICAgICBzdGF0ZS0+aSA9IDA7CisgICAgICAgIE5FWFRfT1VUKDIpCisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBFTkNPREVSKGh6KQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCVB5X1VOSUNPREUgYyA9IElOMTsKLQkJREJDSEFSIGNvZGU7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgUHlfVU5JQ09ERSBjID0gSU4xOworICAgICAgICBEQkNIQVIgY29kZTsKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCWlmIChzdGF0ZS0+aSA9PSAwKSB7Ci0JCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQkJTkVYVCgxLCAxKQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJV1JJVEUzKCd+JywgJ30nLCAodW5zaWduZWQgY2hhciljKQotCQkJCU5FWFQoMSwgMykKLQkJCQlzdGF0ZS0+aSA9IDA7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aSA9PSAwKSB7CisgICAgICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgV1JJVEUzKCd+JywgJ30nLCAodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgICAgIE5FWFQoMSwgMykKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVVDUzRJTlZBTElEKGMpCisgICAgICAgIFVDUzRJTlZBTElEKGMpCiAKLQkJVFJZTUFQX0VOQyhnYmNvbW1vbiwgY29kZSwgYyk7Ci0JCWVsc2UgcmV0dXJuIDE7CisgICAgICAgIFRSWU1BUF9FTkMoZ2Jjb21tb24sIGNvZGUsIGMpOworICAgICAgICBlbHNlIHJldHVybiAxOwogCi0JCWlmIChjb2RlICYgMHg4MDAwKSAvKiBNU0Igc2V0OiBHQksgKi8KLQkJCXJldHVybiAxOworICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkgLyogTVNCIHNldDogR0JLICovCisgICAgICAgICAgICByZXR1cm4gMTsKIAotCQlpZiAoc3RhdGUtPmkgPT0gMCkgewotCQkJV1JJVEU0KCd+JywgJ3snLCBjb2RlID4+IDgsIGNvZGUgJiAweGZmKQotCQkJTkVYVCgxLCA0KQotCQkJc3RhdGUtPmkgPSAxOwotCQl9Ci0JCWVsc2UgewotCQkJV1JJVEUyKGNvZGUgPj4gOCwgY29kZSAmIDB4ZmYpCi0JCQlORVhUKDEsIDIpCi0JCX0KLQl9CisgICAgICAgIGlmIChzdGF0ZS0+aSA9PSAwKSB7CisgICAgICAgICAgICBXUklURTQoJ34nLCAneycsIGNvZGUgPj4gOCwgY29kZSAmIDB4ZmYpCisgICAgICAgICAgICBORVhUKDEsIDQpCisgICAgICAgICAgICBzdGF0ZS0+aSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBXUklURTIoY29kZSA+PiA4LCBjb2RlICYgMHhmZikKKyAgICAgICAgICAgIE5FWFQoMSwgMikKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSX0lOSVQoaHopCiB7Ci0Jc3RhdGUtPmkgPSAwOwotCXJldHVybiAwOworICAgIHN0YXRlLT5pID0gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUl9SRVNFVChoeikKIHsKLQlzdGF0ZS0+aSA9IDA7Ci0JcmV0dXJuIDA7CisgICAgc3RhdGUtPmkgPSAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGh6KQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CiAKLQkJaWYgKGMgPT0gJ34nKSB7Ci0JCQl1bnNpZ25lZCBjaGFyIGMyID0gSU4yOworICAgICAgICBpZiAoYyA9PSAnficpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzIgPSBJTjI7CiAKLQkJCVJFUVVJUkVfSU5CVUYoMikKLQkJCWlmIChjMiA9PSAnficpIHsKLQkJCQlXUklURTEoJ34nKQotCQkJCU5FWFQoMiwgMSkKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGMyID09ICd7JyAmJiBzdGF0ZS0+aSA9PSAwKQotCQkJCXN0YXRlLT5pID0gMTsgLyogc2V0IEdCICovCi0JCQllbHNlIGlmIChjMiA9PSAnfScgJiYgc3RhdGUtPmkgPT0gMSkKLQkJCQlzdGF0ZS0+aSA9IDA7IC8qIHNldCBBU0NJSSAqLwotCQkJZWxzZSBpZiAoYzIgPT0gJ1xuJykKLQkJCQk7IC8qIGxpbmUtY29udGludWF0aW9uICovCi0JCQllbHNlCi0JCQkJcmV0dXJuIDI7Ci0JCQlORVhUKDIsIDApOwotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGlmIChjMiA9PSAnficpIHsKKyAgICAgICAgICAgICAgICBXUklURTEoJ34nKQorICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMyID09ICd7JyAmJiBzdGF0ZS0+aSA9PSAwKQorICAgICAgICAgICAgICAgIHN0YXRlLT5pID0gMTsgLyogc2V0IEdCICovCisgICAgICAgICAgICBlbHNlIGlmIChjMiA9PSAnfScgJiYgc3RhdGUtPmkgPT0gMSkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aSA9IDA7IC8qIHNldCBBU0NJSSAqLworICAgICAgICAgICAgZWxzZSBpZiAoYzIgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICA7IC8qIGxpbmUtY29udGludWF0aW9uICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICBORVhUKDIsIDApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlpZiAoYyAmIDB4ODApCi0JCQlyZXR1cm4gMTsKKyAgICAgICAgaWYgKGMgJiAweDgwKQorICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJaWYgKHN0YXRlLT5pID09IDApIHsgLyogQVNDSUkgbW9kZSAqLwotCQkJV1JJVEUxKGMpCi0JCQlORVhUKDEsIDEpCi0JCX0KLQkJZWxzZSB7IC8qIEdCIG1vZGUgKi8KLQkJCVJFUVVJUkVfSU5CVUYoMikKLQkJCVJFUVVJUkVfT1VUQlVGKDEpCi0JCQlUUllNQVBfREVDKGdiMjMxMiwgKipvdXRidWYsIGMsIElOMikgewotCQkJCU5FWFQoMiwgMSkKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gMjsKLQkJfQotCX0KKyAgICAgICAgaWYgKHN0YXRlLT5pID09IDApIHsgLyogQVNDSUkgbW9kZSAqLworICAgICAgICAgICAgV1JJVEUxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8qIEdCIG1vZGUgKi8KKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgICAgICBUUllNQVBfREVDKGdiMjMxMiwgKipvdXRidWYsIGMsIElOMikgeworICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfaGsuYyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfaGsuYwppbmRleCA0YmJkNjIyLi5hYWYxMDNkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2hrLmMKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19oay5jCkBAIC0xOCwxMiArMTgsMTIgQEAKIAogQ09ERUNfSU5JVChiaWc1aGtzY3MpCiB7Ci0Jc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CiAKLQlpZiAoIWluaXRpYWxpemVkICYmIElNUE9SVF9NQVAodHcsIGJpZzUsICZiaWc1X2VuY21hcCwgJmJpZzVfZGVjbWFwKSkKLQkJcmV0dXJuIC0xOwotCWluaXRpYWxpemVkID0gMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIWluaXRpYWxpemVkICYmIElNUE9SVF9NQVAodHcsIGJpZzUsICZiaWc1X2VuY21hcCwgJmJpZzVfZGVjbWFwKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGluaXRpYWxpemVkID0gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTM4LDEzNSArMzgsMTM1IEBACiAKIEVOQ09ERVIoYmlnNWhrc2NzKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVjczRfdCBjID0gKippbmJ1ZjsKLQkJREJDSEFSIGNvZGU7Ci0JCVB5X3NzaXplX3QgaW5zaXplOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVjczRfdCBjID0gKippbmJ1ZjsKKyAgICAgICAgREJDSEFSIGNvZGU7CisgICAgICAgIFB5X3NzaXplX3QgaW5zaXplOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJUkVRVUlSRV9PVVRCVUYoMSkKLQkJCSoqb3V0YnVmID0gKHVuc2lnbmVkIGNoYXIpYzsKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgICAgICoqb3V0YnVmID0gKHVuc2lnbmVkIGNoYXIpYzsKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJREVDT0RFX1NVUlJPR0FURShjKQotCQlpbnNpemUgPSBHRVRfSU5TSVpFKGMpOworICAgICAgICBERUNPREVfU1VSUk9HQVRFKGMpCisgICAgICAgIGluc2l6ZSA9IEdFVF9JTlNJWkUoYyk7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKIAotCQlpZiAoYyA8IDB4MTAwMDApIHsKLQkJCVRSWU1BUF9FTkMoYmlnNWhrc2NzX2JtcCwgY29kZSwgYykgewotCQkJCWlmIChjb2RlID09IE1VTFRJQykgewotCQkJCQlpZiAoaW5sZWZ0ID49IDIgJiYKLQkJCQkJICAgICgoYyAmIDB4ZmZkZikgPT0gMHgwMGNhKSAmJgotCQkJCQkgICAgKCgoKmluYnVmKVsxXSAmIDB4ZmZmNykgPT0gMHgwMzA0KSkgewotCQkJCQkJY29kZSA9IGJpZzVoa3Njc19wYWlyZW5jX3RhYmxlWwotCQkJCQkJCSgoYyA+PiA0KSB8Ci0JCQkJCQkJICgoKmluYnVmKVsxXSA+PiAzKSkgJiAzXTsKLQkJCQkJCWluc2l6ZSA9IDI7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaW5sZWZ0IDwgMiAmJgotCQkJCQkJICEoZmxhZ3MgJiBNQkVOQ19GTFVTSCkpCi0JCQkJCQlyZXR1cm4gTUJFUlJfVE9PRkVXOwotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChjID09IDB4Y2EpCi0JCQkJCQkJY29kZSA9IDB4ODg2NjsKLQkJCQkJCWVsc2UgLyogYyA9PSAweGVhICovCi0JCQkJCQkJY29kZSA9IDB4ODhhNzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgVFJZTUFQX0VOQyhiaWc1LCBjb2RlLCBjKTsKLQkJCWVsc2UgcmV0dXJuIDE7Ci0JCX0KLQkJZWxzZSBpZiAoYyA8IDB4MjAwMDApCi0JCQlyZXR1cm4gaW5zaXplOwotCQllbHNlIGlmIChjIDwgMHgzMDAwMCkgewotCQkJVFJZTUFQX0VOQyhiaWc1aGtzY3Nfbm9uYm1wLCBjb2RlLCBjICYgMHhmZmZmKTsKLQkJCWVsc2UgcmV0dXJuIGluc2l6ZTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gaW5zaXplOworICAgICAgICBpZiAoYyA8IDB4MTAwMDApIHsKKyAgICAgICAgICAgIFRSWU1BUF9FTkMoYmlnNWhrc2NzX2JtcCwgY29kZSwgYykgeworICAgICAgICAgICAgICAgIGlmIChjb2RlID09IE1VTFRJQykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5sZWZ0ID49IDIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgoYyAmIDB4ZmZkZikgPT0gMHgwMGNhKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCgoKmluYnVmKVsxXSAmIDB4ZmZmNykgPT0gMHgwMzA0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGJpZzVoa3Njc19wYWlyZW5jX3RhYmxlWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA+PiA0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKmluYnVmKVsxXSA+PiAzKSkgJiAzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2l6ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5sZWZ0IDwgMiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGZsYWdzICYgTUJFTkNfRkxVU0gpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1CRVJSX1RPT0ZFVzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAweGNhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAweDg4NjY7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGMgPT0gMHhlYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAweDg4YTc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIFRSWU1BUF9FTkMoYmlnNSwgY29kZSwgYyk7CisgICAgICAgICAgICBlbHNlIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPCAweDIwMDAwKQorICAgICAgICAgICAgcmV0dXJuIGluc2l6ZTsKKyAgICAgICAgZWxzZSBpZiAoYyA8IDB4MzAwMDApIHsKKyAgICAgICAgICAgIFRSWU1BUF9FTkMoYmlnNWhrc2NzX25vbmJtcCwgY29kZSwgYyAmIDB4ZmZmZik7CisgICAgICAgICAgICBlbHNlIHJldHVybiBpbnNpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGluc2l6ZTsKIAotCQlPVVQxKGNvZGUgPj4gOCkKLQkJT1VUMihjb2RlICYgMHhGRikKLQkJTkVYVChpbnNpemUsIDIpCi0JfQorICAgICAgICBPVVQxKGNvZGUgPj4gOCkKKyAgICAgICAgT1VUMihjb2RlICYgMHhGRikKKyAgICAgICAgTkVYVChpbnNpemUsIDIpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgQkgyUyhjMSwgYzIpICgoKGMxKSAtIDB4ODcpICogKDB4ZmUgLSAweDQwICsgMSkgKyAoKGMyKSAtIDB4NDApKQogCiBERUNPREVSKGJpZzVoa3NjcykKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7Ci0JCXVjczRfdCBkZWNvZGVkOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICAgICAgdWNzNF90IGRlY29kZWQ7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKIAotCQlpZiAoMHhjNiA8PSBjICYmIGMgPD0gMHhjOCAmJiAoYyA+PSAweGM3IHx8IElOMiA+PSAweGExKSkKLQkJCWdvdG8gaGtzY3NkZWM7CisgICAgICAgIGlmICgweGM2IDw9IGMgJiYgYyA8PSAweGM4ICYmIChjID49IDB4YzcgfHwgSU4yID49IDB4YTEpKQorICAgICAgICAgICAgZ290byBoa3Njc2RlYzsKIAotCQlUUllNQVBfREVDKGJpZzUsICoqb3V0YnVmLCBjLCBJTjIpIHsKLQkJCU5FWFQoMiwgMSkKLQkJfQotCQllbHNlCi1oa3Njc2RlYzoJVFJZTUFQX0RFQyhiaWc1aGtzY3MsIGRlY29kZWQsIGMsIElOMikgewotCQkJaW50IHMgPSBCSDJTKGMsIElOMik7Ci0JCQljb25zdCB1bnNpZ25lZCBjaGFyICpoaW50YmFzZTsKKyAgICAgICAgVFJZTUFQX0RFQyhiaWc1LCAqKm91dGJ1ZiwgYywgSU4yKSB7CisgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgIH0KKyAgICAgICAgZWxzZQoraGtzY3NkZWM6ICAgICAgIFRSWU1BUF9ERUMoYmlnNWhrc2NzLCBkZWNvZGVkLCBjLCBJTjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzID0gQkgyUyhjLCBJTjIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGludGJhc2U7CiAKLQkJCWFzc2VydCgweDg3IDw9IGMgJiYgYyA8PSAweGZlKTsKLQkJCWFzc2VydCgweDQwIDw9IElOMiAmJiBJTjIgPD0gMHhmZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMHg4NyA8PSBjICYmIGMgPD0gMHhmZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMHg0MCA8PSBJTjIgJiYgSU4yIDw9IDB4ZmUpOwogCi0JCQlpZiAoQkgyUygweDg3LCAweDQwKSA8PSBzICYmIHMgPD0gQkgyUygweGEwLCAweGZlKSkgewotCQkJCWhpbnRiYXNlID0gYmlnNWhrc2NzX3BoaW50XzA7Ci0JCQkJcyAtPSBCSDJTKDB4ODcsIDB4NDApOwotCQkJfQotCQkJZWxzZSBpZiAoQkgyUygweGM2LDB4YTEpIDw9IHMgJiYgcyA8PSBCSDJTKDB4YzgsMHhmZSkpewotCQkJCWhpbnRiYXNlID0gYmlnNWhrc2NzX3BoaW50XzEyMTMwOwotCQkJCXMgLT0gQkgyUygweGM2LCAweGExKTsKLQkJCX0KLQkJCWVsc2UgaWYgKEJIMlMoMHhmOSwweGQ2KSA8PSBzICYmIHMgPD0gQkgyUygweGZlLDB4ZmUpKXsKLQkJCQloaW50YmFzZSA9IGJpZzVoa3Njc19waGludF8yMTkyNDsKLQkJCQlzIC09IEJIMlMoMHhmOSwgMHhkNik7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE1CRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJIMlMoMHg4NywgMHg0MCkgPD0gcyAmJiBzIDw9IEJIMlMoMHhhMCwgMHhmZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludGJhc2UgPSBiaWc1aGtzY3NfcGhpbnRfMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAtPSBCSDJTKDB4ODcsIDB4NDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQkgyUygweGM2LDB4YTEpIDw9IHMgJiYgcyA8PSBCSDJTKDB4YzgsMHhmZSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50YmFzZSA9IGJpZzVoa3Njc19waGludF8xMjEzMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAtPSBCSDJTKDB4YzYsIDB4YTEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQkgyUygweGY5LDB4ZDYpIDw9IHMgJiYgcyA8PSBCSDJTKDB4ZmUsMHhmZSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50YmFzZSA9IGJpZzVoa3Njc19waGludF8yMTkyNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAtPSBCSDJTKDB4ZjksIDB4ZDYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUJFUlJfSU5URVJOQUw7CiAKLQkJCWlmIChoaW50YmFzZVtzID4+IDNdICYgKDEgPDwgKHMgJiA3KSkpIHsKLQkJCQlXUklURVVDUzQoZGVjb2RlZCB8IDB4MjAwMDApCi0JCQkJTkVYVF9JTigyKQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT1VUMShkZWNvZGVkKQotCQkJCU5FWFQoMiwgMSkKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXN3aXRjaCAoKGMgPDwgOCkgfCBJTjIpIHsKLQkJCWNhc2UgMHg4ODYyOiBXUklURTIoMHgwMGNhLCAweDAzMDQpOyBicmVhazsKLQkJCWNhc2UgMHg4ODY0OiBXUklURTIoMHgwMGNhLCAweDAzMGMpOyBicmVhazsKLQkJCWNhc2UgMHg4OGEzOiBXUklURTIoMHgwMGVhLCAweDAzMDQpOyBicmVhazsKLQkJCWNhc2UgMHg4OGE1OiBXUklURTIoMHgwMGVhLCAweDAzMGMpOyBicmVhazsKLQkJCWRlZmF1bHQ6IHJldHVybiAyOwotCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpbnRiYXNlW3MgPj4gM10gJiAoMSA8PCAocyAmIDcpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURVVDUzQoZGVjb2RlZCB8IDB4MjAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FWFRfSU4oMikKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQxKGRlY29kZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKChjIDw8IDgpIHwgSU4yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODg2MjogV1JJVEUyKDB4MDBjYSwgMHgwMzA0KTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODg2NDogV1JJVEUyKDB4MDBjYSwgMHgwMzBjKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODhhMzogV1JJVEUyKDB4MDBlYSwgMHgwMzA0KTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODhhNTogV1JJVEUyKDB4MDBlYSwgMHgwMzBjKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJTkVYVCgyLCAyKSAvKiBhbGwgZGVjb2RlZCBjb2RlcG9pbnRzIGFyZSBwYWlycywgYWJvdmUuICovCi0JCX0KLQl9CisgICAgICAgICAgICAgICAgICAgICAgICBORVhUKDIsIDIpIC8qIGFsbCBkZWNvZGVkIGNvZGVwb2ludHMgYXJlIHBhaXJzLCBhYm92ZS4gKi8KKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfaXNvMjAyMi5jIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19pc28yMDIyLmMKaW5kZXggOWNlN2I3NS4uMjVjMWEzNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19pc28yMDIyLmMKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19pc28yMDIyLmMKQEAgLTE5LDg1ICsxOSw4NSBAQAogCiAgICBzdGF0ZS0+Y1swLTNdCiAKLQkwMDAwMDAwMAotCXx8Xl5eXl58Ci0JfCstLS0tLSstLS0tICBHMC0zIENoYXJhY3RlciBTZXQKLQkrLS0tLS0tLS0tLS0gIElzIEcwLTMgZG91YmxlIGJ5dGU/CisgICAgMDAwMDAwMDAKKyAgICB8fF5eXl5efAorICAgIHwrLS0tLS0rLS0tLSAgRzAtMyBDaGFyYWN0ZXIgU2V0CisgICAgKy0tLS0tLS0tLS0tICBJcyBHMC0zIGRvdWJsZSBieXRlPwogCiAgICBzdGF0ZS0+Y1s0XQogCi0JMDAwMDAwMDAKLQkgICAgICB8fAotCSAgICAgIHwrLS0tLSAgTG9ja2VkLVNoaWZ0PwotCSAgICAgICstLS0tLSAgRVNDIFRocm91Z2hvdXQKKyAgICAwMDAwMDAwMAorICAgICAgICAgIHx8CisgICAgICAgICAgfCstLS0tICBMb2NrZWQtU2hpZnQ/CisgICAgICAgICAgKy0tLS0tICBFU0MgVGhyb3VnaG91dAogKi8KIAotI2RlZmluZSBFU0MJCQkweDFCCi0jZGVmaW5lIFNPCQkJMHgwRQotI2RlZmluZSBTSQkJCTB4MEYKLSNkZWZpbmUgTEYJCQkweDBBCisjZGVmaW5lIEVTQyAgICAgICAgICAgICAgICAgICAgIDB4MUIKKyNkZWZpbmUgU08gICAgICAgICAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBTSSAgICAgICAgICAgICAgICAgICAgICAweDBGCisjZGVmaW5lIExGICAgICAgICAgICAgICAgICAgICAgIDB4MEEKIAotI2RlZmluZSBNQVhfRVNDU0VRTEVOCQkxNgorI2RlZmluZSBNQVhfRVNDU0VRTEVOICAgICAgICAgICAxNgogCi0jZGVmaW5lIENIQVJTRVRfSVNPODg1OV8xCSdBJwotI2RlZmluZSBDSEFSU0VUX0FTQ0lJCQknQicKLSNkZWZpbmUgQ0hBUlNFVF9JU084ODU5XzcJJ0YnCi0jZGVmaW5lIENIQVJTRVRfSklTWDAyMDFfSwknSScKLSNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIwMV9SCSdKJworI2RlZmluZSBDSEFSU0VUX0lTTzg4NTlfMSAgICAgICAnQScKKyNkZWZpbmUgQ0hBUlNFVF9BU0NJSSAgICAgICAgICAgJ0InCisjZGVmaW5lIENIQVJTRVRfSVNPODg1OV83ICAgICAgICdGJworI2RlZmluZSBDSEFSU0VUX0pJU1gwMjAxX0sgICAgICAnSScKKyNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIwMV9SICAgICAgJ0onCiAKLSNkZWZpbmUgQ0hBUlNFVF9HQjIzMTIJCSgnQSd8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0pJU1gwMjA4CSgnQid8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0tTWDEwMDEJCSgnQyd8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0pJU1gwMjEyCSgnRCd8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0dCMjMxMl84NTY1CSgnRSd8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0NOUzExNjQzXzEJKCdHJ3xDSEFSU0VUX0RCQ1MpCi0jZGVmaW5lIENIQVJTRVRfQ05TMTE2NDNfMgkoJ0gnfENIQVJTRVRfREJDUykKLSNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIxM18yMDAwXzEJKCdPJ3xDSEFSU0VUX0RCQ1MpCi0jZGVmaW5lIENIQVJTRVRfSklTWDAyMTNfMgkoJ1AnfENIQVJTRVRfREJDUykKLSNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIxM18yMDA0XzEJKCdRJ3xDSEFSU0VUX0RCQ1MpCi0jZGVmaW5lIENIQVJTRVRfSklTWDAyMDhfTwkoJ0AnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9HQjIzMTIgICAgICAgICAgKCdBJ3xDSEFSU0VUX0RCQ1MpCisjZGVmaW5lIENIQVJTRVRfSklTWDAyMDggICAgICAgICgnQid8Q0hBUlNFVF9EQkNTKQorI2RlZmluZSBDSEFSU0VUX0tTWDEwMDEgICAgICAgICAoJ0MnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIxMiAgICAgICAgKCdEJ3xDSEFSU0VUX0RCQ1MpCisjZGVmaW5lIENIQVJTRVRfR0IyMzEyXzg1NjUgICAgICgnRSd8Q0hBUlNFVF9EQkNTKQorI2RlZmluZSBDSEFSU0VUX0NOUzExNjQzXzEgICAgICAoJ0cnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9DTlMxMTY0M18yICAgICAgKCdIJ3xDSEFSU0VUX0RCQ1MpCisjZGVmaW5lIENIQVJTRVRfSklTWDAyMTNfMjAwMF8xICgnTyd8Q0hBUlNFVF9EQkNTKQorI2RlZmluZSBDSEFSU0VUX0pJU1gwMjEzXzIgICAgICAoJ1AnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIxM18yMDA0XzEgKCdRJ3xDSEFSU0VUX0RCQ1MpCisjZGVmaW5lIENIQVJTRVRfSklTWDAyMDhfTyAgICAgICgnQCd8Q0hBUlNFVF9EQkNTKQogCi0jZGVmaW5lIENIQVJTRVRfREJDUwkJMHg4MAotI2RlZmluZSBFU0NNQVJLKG1hcmspCQkoKG1hcmspICYgMHg3ZikKKyNkZWZpbmUgQ0hBUlNFVF9EQkNTICAgICAgICAgICAgMHg4MAorI2RlZmluZSBFU0NNQVJLKG1hcmspICAgICAgICAgICAoKG1hcmspICYgMHg3ZikKIAotI2RlZmluZSBJU19FU0NFTkQoYykJKCgoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpIHx8IChjKSA9PSAnQCcpCisjZGVmaW5lIElTX0VTQ0VORChjKSAgICAoKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJykgfHwgKGMpID09ICdAJykKICNkZWZpbmUgSVNfSVNPMjAyMkVTQyhjMikgXAotCQkoKGMyKSA9PSAnKCcgfHwgKGMyKSA9PSAnKScgfHwgKGMyKSA9PSAnJCcgfHwgXAotCQkgKGMyKSA9PSAnLicgfHwgKGMyKSA9PSAnJicpCi0JLyogdGhpcyBpcyBub3QgYSBjb21wbGV0ZSBsaXN0IG9mIElTTy0yMDIyIGVzY2FwZSBzZXF1ZW5jZSBoZWFkZXJzLgotCSAqIGJ1dCwgaXQncyBlbm91Z2ggdG8gaW1wbGVtZW50IENKSyBpbnN0YW5jZXMgb2YgaXNvLTIwMjIuICovCisgICAgICAgICgoYzIpID09ICcoJyB8fCAoYzIpID09ICcpJyB8fCAoYzIpID09ICckJyB8fCBcCisgICAgICAgICAoYzIpID09ICcuJyB8fCAoYzIpID09ICcmJykKKyAgICAvKiB0aGlzIGlzIG5vdCBhIGNvbXBsZXRlIGxpc3Qgb2YgSVNPLTIwMjIgZXNjYXBlIHNlcXVlbmNlIGhlYWRlcnMuCisgICAgICogYnV0LCBpdCdzIGVub3VnaCB0byBpbXBsZW1lbnQgQ0pLIGluc3RhbmNlcyBvZiBpc28tMjAyMi4gKi8KIAotI2RlZmluZSBNQVBfVU5NQVBQQUJMRQkJMHhGRkZGCi0jZGVmaW5lIE1BUF9NVUxUSVBMRV9BVkFJTAkweEZGRkUgLyogZm9yIEpJUyBYIDAyMTMgKi8KKyNkZWZpbmUgTUFQX1VOTUFQUEFCTEUgICAgICAgICAgMHhGRkZGCisjZGVmaW5lIE1BUF9NVUxUSVBMRV9BVkFJTCAgICAgIDB4RkZGRSAvKiBmb3IgSklTIFggMDIxMyAqLwogCi0jZGVmaW5lIEZfU0hJRlRFRAkJMHgwMQotI2RlZmluZSBGX0VTQ1RIUk9VR0hPVVQJCTB4MDIKKyNkZWZpbmUgRl9TSElGVEVEICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBGX0VTQ1RIUk9VR0hPVVQgICAgICAgICAweDAyCiAKLSNkZWZpbmUgU1RBVEVfU0VURyhkbiwgdikJKChzdGF0ZSktPmNbZG5dKSA9ICh2KTsKLSNkZWZpbmUgU1RBVEVfR0VURyhkbikJCSgoc3RhdGUpLT5jW2RuXSkKKyNkZWZpbmUgU1RBVEVfU0VURyhkbiwgdikgICAgICAgKChzdGF0ZSktPmNbZG5dKSA9ICh2KTsKKyNkZWZpbmUgU1RBVEVfR0VURyhkbikgICAgICAgICAgKChzdGF0ZSktPmNbZG5dKQogCi0jZGVmaW5lIFNUQVRFX0cwCQlTVEFURV9HRVRHKDApCi0jZGVmaW5lIFNUQVRFX0cxCQlTVEFURV9HRVRHKDEpCi0jZGVmaW5lIFNUQVRFX0cyCQlTVEFURV9HRVRHKDIpCi0jZGVmaW5lIFNUQVRFX0czCQlTVEFURV9HRVRHKDMpCi0jZGVmaW5lIFNUQVRFX1NFVEcwKHYpCQlTVEFURV9TRVRHKDAsIHYpCi0jZGVmaW5lIFNUQVRFX1NFVEcxKHYpCQlTVEFURV9TRVRHKDEsIHYpCi0jZGVmaW5lIFNUQVRFX1NFVEcyKHYpCQlTVEFURV9TRVRHKDIsIHYpCi0jZGVmaW5lIFNUQVRFX1NFVEczKHYpCQlTVEFURV9TRVRHKDMsIHYpCisjZGVmaW5lIFNUQVRFX0cwICAgICAgICAgICAgICAgIFNUQVRFX0dFVEcoMCkKKyNkZWZpbmUgU1RBVEVfRzEgICAgICAgICAgICAgICAgU1RBVEVfR0VURygxKQorI2RlZmluZSBTVEFURV9HMiAgICAgICAgICAgICAgICBTVEFURV9HRVRHKDIpCisjZGVmaW5lIFNUQVRFX0czICAgICAgICAgICAgICAgIFNUQVRFX0dFVEcoMykKKyNkZWZpbmUgU1RBVEVfU0VURzAodikgICAgICAgICAgU1RBVEVfU0VURygwLCB2KQorI2RlZmluZSBTVEFURV9TRVRHMSh2KSAgICAgICAgICBTVEFURV9TRVRHKDEsIHYpCisjZGVmaW5lIFNUQVRFX1NFVEcyKHYpICAgICAgICAgIFNUQVRFX1NFVEcoMiwgdikKKyNkZWZpbmUgU1RBVEVfU0VURzModikgICAgICAgICAgU1RBVEVfU0VURygzLCB2KQogCi0jZGVmaW5lIFNUQVRFX1NFVEZMQUcoZikJKChzdGF0ZSktPmNbNF0pIHw9IChmKTsKLSNkZWZpbmUgU1RBVEVfR0VURkxBRyhmKQkoKHN0YXRlKS0+Y1s0XSAmIChmKSkKLSNkZWZpbmUgU1RBVEVfQ0xFQVJGTEFHKGYpCSgoc3RhdGUpLT5jWzRdKSAmPSB+KGYpOwotI2RlZmluZSBTVEFURV9DTEVBUkZMQUdTKCkJKChzdGF0ZSktPmNbNF0pID0gMDsKKyNkZWZpbmUgU1RBVEVfU0VURkxBRyhmKSAgICAgICAgKChzdGF0ZSktPmNbNF0pIHw9IChmKTsKKyNkZWZpbmUgU1RBVEVfR0VURkxBRyhmKSAgICAgICAgKChzdGF0ZSktPmNbNF0gJiAoZikpCisjZGVmaW5lIFNUQVRFX0NMRUFSRkxBRyhmKSAgICAgICgoc3RhdGUpLT5jWzRdKSAmPSB+KGYpOworI2RlZmluZSBTVEFURV9DTEVBUkZMQUdTKCkgICAgICAoKHN0YXRlKS0+Y1s0XSkgPSAwOwogCi0jZGVmaW5lIElTTzIwMjJfQ09ORklHCQkoKGNvbnN0IHN0cnVjdCBpc28yMDIyX2NvbmZpZyAqKWNvbmZpZykKLSNkZWZpbmUgQ09ORklHX0lTU0VUKGZsYWcpCShJU08yMDIyX0NPTkZJRy0+ZmxhZ3MgJiAoZmxhZykpCi0jZGVmaW5lIENPTkZJR19ERVNJR05BVElPTlMJKElTTzIwMjJfQ09ORklHLT5kZXNpZ25hdGlvbnMpCisjZGVmaW5lIElTTzIwMjJfQ09ORklHICAgICAgICAgICgoY29uc3Qgc3RydWN0IGlzbzIwMjJfY29uZmlnICopY29uZmlnKQorI2RlZmluZSBDT05GSUdfSVNTRVQoZmxhZykgICAgICAoSVNPMjAyMl9DT05GSUctPmZsYWdzICYgKGZsYWcpKQorI2RlZmluZSBDT05GSUdfREVTSUdOQVRJT05TICAgICAoSVNPMjAyMl9DT05GSUctPmRlc2lnbmF0aW9ucykKIAogLyogaXNvMjAyMl9jb25maWcuZmxhZ3MgKi8KLSNkZWZpbmUgTk9fU0hJRlQJCTB4MDEKLSNkZWZpbmUgVVNFX0cyCQkJMHgwMgotI2RlZmluZSBVU0VfSklTWDAyMDhfRVhUCTB4MDQKKyNkZWZpbmUgTk9fU0hJRlQgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBVU0VfRzIgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFVTRV9KSVNYMDIwOF9FWFQgICAgICAgIDB4MDQKIAogLyotKi0gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIC0qLSovCiAKQEAgLTEwNiw0MzQgKzEwNiw0MzQgQEAKIHR5cGVkZWYgREJDSEFSICgqaXNvMjAyMl9lbmNvZGVfZnVuYykoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpOwogCiBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiB7Ci0JdW5zaWduZWQgY2hhciBtYXJrOwotCXVuc2lnbmVkIGNoYXIgcGxhbmU7Ci0JdW5zaWduZWQgY2hhciB3aWR0aDsKLQlpc28yMDIyX2luaXRfZnVuYyBpbml0aWFsaXplcjsKLQlpc28yMDIyX2RlY29kZV9mdW5jIGRlY29kZXI7Ci0JaXNvMjAyMl9lbmNvZGVfZnVuYyBlbmNvZGVyOworICAgIHVuc2lnbmVkIGNoYXIgbWFyazsKKyAgICB1bnNpZ25lZCBjaGFyIHBsYW5lOworICAgIHVuc2lnbmVkIGNoYXIgd2lkdGg7CisgICAgaXNvMjAyMl9pbml0X2Z1bmMgaW5pdGlhbGl6ZXI7CisgICAgaXNvMjAyMl9kZWNvZGVfZnVuYyBkZWNvZGVyOworICAgIGlzbzIwMjJfZW5jb2RlX2Z1bmMgZW5jb2RlcjsKIH07CiAKIHN0cnVjdCBpc28yMDIyX2NvbmZpZyB7Ci0JaW50IGZsYWdzOwotCWNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uICpkZXNpZ25hdGlvbnM7IC8qIG5vbi1hc2NpaSBkZXNpZ3MgKi8KKyAgICBpbnQgZmxhZ3M7CisgICAgY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gKmRlc2lnbmF0aW9uczsgLyogbm9uLWFzY2lpIGRlc2lncyAqLwogfTsKIAogLyotKi0gaXNvLTIwMjIgY29kZWMgaW1wbGVtZW50YXRpb24gLSotKi8KIAogQ09ERUNfSU5JVChpc28yMDIyKQogewotCWNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uICpkZXNpZyA9IENPTkZJR19ERVNJR05BVElPTlM7Ci0JZm9yIChkZXNpZyA9IENPTkZJR19ERVNJR05BVElPTlM7IGRlc2lnLT5tYXJrOyBkZXNpZysrKQotCQlpZiAoZGVzaWctPmluaXRpYWxpemVyICE9IE5VTEwgJiYgZGVzaWctPmluaXRpYWxpemVyKCkgIT0gMCkKLQkJCXJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZGVzaWcgPSBDT05GSUdfREVTSUdOQVRJT05TOworICAgIGZvciAoZGVzaWcgPSBDT05GSUdfREVTSUdOQVRJT05TOyBkZXNpZy0+bWFyazsgZGVzaWcrKykKKyAgICAgICAgaWYgKGRlc2lnLT5pbml0aWFsaXplciAhPSBOVUxMICYmIGRlc2lnLT5pbml0aWFsaXplcigpICE9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIEVOQ09ERVJfSU5JVChpc28yMDIyKQogewotCVNUQVRFX0NMRUFSRkxBR1MoKQotCVNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCi0JU1RBVEVfU0VURzEoQ0hBUlNFVF9BU0NJSSkKLQlyZXR1cm4gMDsKKyAgICBTVEFURV9DTEVBUkZMQUdTKCkKKyAgICBTVEFURV9TRVRHMChDSEFSU0VUX0FTQ0lJKQorICAgIFNUQVRFX1NFVEcxKENIQVJTRVRfQVNDSUkpCisgICAgcmV0dXJuIDA7CiB9CiAKIEVOQ09ERVJfUkVTRVQoaXNvMjAyMikKIHsKLQlpZiAoU1RBVEVfR0VURkxBRyhGX1NISUZURUQpKSB7Ci0JCVdSSVRFMShTSSkKLQkJTkVYVF9PVVQoMSkKLQkJU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKLQl9Ci0JaWYgKFNUQVRFX0cwICE9IENIQVJTRVRfQVNDSUkpIHsKLQkJV1JJVEUzKEVTQywgJygnLCAnQicpCi0JCU5FWFRfT1VUKDMpCi0JCVNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCi0JfQotCXJldHVybiAwOworICAgIGlmIChTVEFURV9HRVRGTEFHKEZfU0hJRlRFRCkpIHsKKyAgICAgICAgV1JJVEUxKFNJKQorICAgICAgICBORVhUX09VVCgxKQorICAgICAgICBTVEFURV9DTEVBUkZMQUcoRl9TSElGVEVEKQorICAgIH0KKyAgICBpZiAoU1RBVEVfRzAgIT0gQ0hBUlNFVF9BU0NJSSkgeworICAgICAgICBXUklURTMoRVNDLCAnKCcsICdCJykKKyAgICAgICAgTkVYVF9PVVQoMykKKyAgICAgICAgU1RBVEVfU0VURzAoQ0hBUlNFVF9BU0NJSSkKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIEVOQ09ERVIoaXNvMjAyMikKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQljb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZHNnOwotCQlEQkNIQVIgZW5jb2RlZDsKLQkJdWNzNF90IGMgPSAqKmluYnVmOwotCQlQeV9zc2l6ZV90IGluc2l6ZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZHNnOworICAgICAgICBEQkNIQVIgZW5jb2RlZDsKKyAgICAgICAgdWNzNF90IGMgPSAqKmluYnVmOworICAgICAgICBQeV9zc2l6ZV90IGluc2l6ZTsKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCWlmIChTVEFURV9HMCAhPSBDSEFSU0VUX0FTQ0lJKSB7Ci0JCQkJV1JJVEUzKEVTQywgJygnLCAnQicpCi0JCQkJU1RBVEVfU0VURzAoQ0hBUlNFVF9BU0NJSSkKLQkJCQlORVhUX09VVCgzKQotCQkJfQotCQkJaWYgKFNUQVRFX0dFVEZMQUcoRl9TSElGVEVEKSkgewotCQkJCVdSSVRFMShTSSkKLQkJCQlTVEFURV9DTEVBUkZMQUcoRl9TSElGVEVEKQotCQkJCU5FWFRfT1VUKDEpCi0JCQl9Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgaWYgKFNUQVRFX0cwICE9IENIQVJTRVRfQVNDSUkpIHsKKyAgICAgICAgICAgICAgICBXUklURTMoRVNDLCAnKCcsICdCJykKKyAgICAgICAgICAgICAgICBTVEFURV9TRVRHMChDSEFSU0VUX0FTQ0lJKQorICAgICAgICAgICAgICAgIE5FWFRfT1VUKDMpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoU1RBVEVfR0VURkxBRyhGX1NISUZURUQpKSB7CisgICAgICAgICAgICAgICAgV1JJVEUxKFNJKQorICAgICAgICAgICAgICAgIFNUQVRFX0NMRUFSRkxBRyhGX1NISUZURUQpCisgICAgICAgICAgICAgICAgTkVYVF9PVVQoMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlERUNPREVfU1VSUk9HQVRFKGMpCi0JCWluc2l6ZSA9IEdFVF9JTlNJWkUoYyk7CisgICAgICAgIERFQ09ERV9TVVJST0dBVEUoYykKKyAgICAgICAgaW5zaXplID0gR0VUX0lOU0laRShjKTsKIAotCQllbmNvZGVkID0gTUFQX1VOTUFQUEFCTEU7Ci0JCWZvciAoZHNnID0gQ09ORklHX0RFU0lHTkFUSU9OUzsgZHNnLT5tYXJrOyBkc2crKykgewotCQkJUHlfc3NpemVfdCBsZW5ndGggPSAxOwotCQkJZW5jb2RlZCA9IGRzZy0+ZW5jb2RlcigmYywgJmxlbmd0aCk7Ci0JCQlpZiAoZW5jb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpIHsKLQkJCQkvKiB0aGlzIGltcGxlbWVudGF0aW9uIHdvbid0IHdvcmsgZm9yIHBhaXIKLQkJCQkgKiBvZiBub24tYm1wIGNoYXJhY3RlcnMuICovCi0JCQkJaWYgKGlubGVmdCA8IDIpIHsKLQkJCQkJaWYgKCEoZmxhZ3MgJiBNQkVOQ19GTFVTSCkpCi0JCQkJCQlyZXR1cm4gTUJFUlJfVE9PRkVXOwotCQkJCQlsZW5ndGggPSAtMTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlsZW5ndGggPSAyOworICAgICAgICBlbmNvZGVkID0gTUFQX1VOTUFQUEFCTEU7CisgICAgICAgIGZvciAoZHNnID0gQ09ORklHX0RFU0lHTkFUSU9OUzsgZHNnLT5tYXJrOyBkc2crKykgeworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW5ndGggPSAxOworICAgICAgICAgICAgZW5jb2RlZCA9IGRzZy0+ZW5jb2RlcigmYywgJmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoZW5jb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpIHsKKyAgICAgICAgICAgICAgICAvKiB0aGlzIGltcGxlbWVudGF0aW9uIHdvbid0IHdvcmsgZm9yIHBhaXIKKyAgICAgICAgICAgICAgICAgKiBvZiBub24tYm1wIGNoYXJhY3RlcnMuICovCisgICAgICAgICAgICAgICAgaWYgKGlubGVmdCA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBNQkVOQ19GTFVTSCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUJFUlJfVE9PRkVXOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAyOwogI2lmIFB5X1VOSUNPREVfU0laRSA9PSAyCi0JCQkJaWYgKGxlbmd0aCA9PSAyKSB7Ci0JCQkJCXVjczRfdCB1NGluWzJdOwotCQkJCQl1NGluWzBdID0gKHVjczRfdClJTjE7Ci0JCQkJCXU0aW5bMV0gPSAodWNzNF90KUlOMjsKLQkJCQkJZW5jb2RlZCA9IGRzZy0+ZW5jb2Rlcih1NGluLCAmbGVuZ3RoKTsKLQkJCQl9IGVsc2UKLQkJCQkJZW5jb2RlZCA9IGRzZy0+ZW5jb2RlcigmYywgJmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHVjczRfdCB1NGluWzJdOworICAgICAgICAgICAgICAgICAgICB1NGluWzBdID0gKHVjczRfdClJTjE7CisgICAgICAgICAgICAgICAgICAgIHU0aW5bMV0gPSAodWNzNF90KUlOMjsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCA9IGRzZy0+ZW5jb2Rlcih1NGluLCAmbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCA9IGRzZy0+ZW5jb2RlcigmYywgJmxlbmd0aCk7CiAjZWxzZQotCQkJCWVuY29kZWQgPSBkc2ctPmVuY29kZXIoJmMsICZsZW5ndGgpOworICAgICAgICAgICAgICAgIGVuY29kZWQgPSBkc2ctPmVuY29kZXIoJmMsICZsZW5ndGgpOwogI2VuZGlmCi0JCQkJaWYgKGVuY29kZWQgIT0gTUFQX1VOTUFQUEFCTEUpIHsKLQkJCQkJaW5zaXplID0gbGVuZ3RoOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChlbmNvZGVkICE9IE1BUF9VTk1BUFBBQkxFKQotCQkJCWJyZWFrOwotCQl9CisgICAgICAgICAgICAgICAgaWYgKGVuY29kZWQgIT0gTUFQX1VOTUFQUEFCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zaXplID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChlbmNvZGVkICE9IE1BUF9VTk1BUFBBQkxFKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJaWYgKCFkc2ctPm1hcmspCi0JCQlyZXR1cm4gMTsKLQkJYXNzZXJ0KGRzZy0+d2lkdGggPT0gMSB8fCBkc2ctPndpZHRoID09IDIpOworICAgICAgICBpZiAoIWRzZy0+bWFyaykKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBhc3NlcnQoZHNnLT53aWR0aCA9PSAxIHx8IGRzZy0+d2lkdGggPT0gMik7CiAKLQkJc3dpdGNoIChkc2ctPnBsYW5lKSB7Ci0JCWNhc2UgMDogLyogRzAgKi8KLQkJCWlmIChTVEFURV9HRVRGTEFHKEZfU0hJRlRFRCkpIHsKLQkJCQlXUklURTEoU0kpCi0JCQkJU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKLQkJCQlORVhUX09VVCgxKQotCQkJfQotCQkJaWYgKFNUQVRFX0cwICE9IGRzZy0+bWFyaykgewotCQkJCWlmIChkc2ctPndpZHRoID09IDEpIHsKLQkJCQkJV1JJVEUzKEVTQywgJygnLCBFU0NNQVJLKGRzZy0+bWFyaykpCi0JCQkJCVNUQVRFX1NFVEcwKGRzZy0+bWFyaykKLQkJCQkJTkVYVF9PVVQoMykKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZHNnLT5tYXJrID09IENIQVJTRVRfSklTWDAyMDgpIHsKLQkJCQkJV1JJVEUzKEVTQywgJyQnLCBFU0NNQVJLKGRzZy0+bWFyaykpCi0JCQkJCVNUQVRFX1NFVEcwKGRzZy0+bWFyaykKLQkJCQkJTkVYVF9PVVQoMykKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVdSSVRFNChFU0MsICckJywgJygnLAotCQkJCQkJRVNDTUFSSyhkc2ctPm1hcmspKQotCQkJCQlTVEFURV9TRVRHMChkc2ctPm1hcmspCi0JCQkJCU5FWFRfT1VUKDQpCi0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMTogLyogRzEgKi8KLQkJCWlmIChTVEFURV9HMSAhPSBkc2ctPm1hcmspIHsKLQkJCQlpZiAoZHNnLT53aWR0aCA9PSAxKSB7Ci0JCQkJCVdSSVRFMyhFU0MsICcpJywgRVNDTUFSSyhkc2ctPm1hcmspKQotCQkJCQlTVEFURV9TRVRHMShkc2ctPm1hcmspCi0JCQkJCU5FWFRfT1VUKDMpCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlXUklURTQoRVNDLCAnJCcsICcpJywKLQkJCQkJCUVTQ01BUksoZHNnLT5tYXJrKSkKLQkJCQkJU1RBVEVfU0VURzEoZHNnLT5tYXJrKQotCQkJCQlORVhUX09VVCg0KQotCQkJCX0KLQkJCX0KLQkJCWlmICghU1RBVEVfR0VURkxBRyhGX1NISUZURUQpKSB7Ci0JCQkJV1JJVEUxKFNPKQotCQkJCVNUQVRFX1NFVEZMQUcoRl9TSElGVEVEKQotCQkJCU5FWFRfT1VUKDEpCi0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDogLyogRzIgYW5kIEczIGlzIG5vdCBzdXBwb3J0ZWQ6IG5vIGVuY29kaW5nIGluCi0JCQkgICogQ0pLQ29kZWNzIGFyZSB1c2luZyB0aGVtIHlldCAqLwotCQkJcmV0dXJuIE1CRVJSX0lOVEVSTkFMOwotCQl9CisgICAgICAgIHN3aXRjaCAoZHNnLT5wbGFuZSkgeworICAgICAgICBjYXNlIDA6IC8qIEcwICovCisgICAgICAgICAgICBpZiAoU1RBVEVfR0VURkxBRyhGX1NISUZURUQpKSB7CisgICAgICAgICAgICAgICAgV1JJVEUxKFNJKQorICAgICAgICAgICAgICAgIFNUQVRFX0NMRUFSRkxBRyhGX1NISUZURUQpCisgICAgICAgICAgICAgICAgTkVYVF9PVVQoMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChTVEFURV9HMCAhPSBkc2ctPm1hcmspIHsKKyAgICAgICAgICAgICAgICBpZiAoZHNnLT53aWR0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFMyhFU0MsICcoJywgRVNDTUFSSyhkc2ctPm1hcmspKQorICAgICAgICAgICAgICAgICAgICBTVEFURV9TRVRHMChkc2ctPm1hcmspCisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDMpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRzZy0+bWFyayA9PSBDSEFSU0VUX0pJU1gwMjA4KSB7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFMyhFU0MsICckJywgRVNDTUFSSyhkc2ctPm1hcmspKQorICAgICAgICAgICAgICAgICAgICBTVEFURV9TRVRHMChkc2ctPm1hcmspCisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDMpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBXUklURTQoRVNDLCAnJCcsICcoJywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVTQ01BUksoZHNnLT5tYXJrKSkKKyAgICAgICAgICAgICAgICAgICAgU1RBVEVfU0VURzAoZHNnLT5tYXJrKQorICAgICAgICAgICAgICAgICAgICBORVhUX09VVCg0KQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8qIEcxICovCisgICAgICAgICAgICBpZiAoU1RBVEVfRzEgIT0gZHNnLT5tYXJrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRzZy0+d2lkdGggPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBXUklURTMoRVNDLCAnKScsIEVTQ01BUksoZHNnLT5tYXJrKSkKKyAgICAgICAgICAgICAgICAgICAgU1RBVEVfU0VURzEoZHNnLT5tYXJrKQorICAgICAgICAgICAgICAgICAgICBORVhUX09VVCgzKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgV1JJVEU0KEVTQywgJyQnLCAnKScsCisgICAgICAgICAgICAgICAgICAgICAgICBFU0NNQVJLKGRzZy0+bWFyaykpCisgICAgICAgICAgICAgICAgICAgIFNUQVRFX1NFVEcxKGRzZy0+bWFyaykKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9PVVQoNCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIVNUQVRFX0dFVEZMQUcoRl9TSElGVEVEKSkgeworICAgICAgICAgICAgICAgIFdSSVRFMShTTykKKyAgICAgICAgICAgICAgICBTVEFURV9TRVRGTEFHKEZfU0hJRlRFRCkKKyAgICAgICAgICAgICAgICBORVhUX09VVCgxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8qIEcyIGFuZCBHMyBpcyBub3Qgc3VwcG9ydGVkOiBubyBlbmNvZGluZyBpbgorICAgICAgICAgICAgICAgICAgKiBDSktDb2RlY3MgYXJlIHVzaW5nIHRoZW0geWV0ICovCisgICAgICAgICAgICByZXR1cm4gTUJFUlJfSU5URVJOQUw7CisgICAgICAgIH0KIAotCQlpZiAoZHNnLT53aWR0aCA9PSAxKSB7Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpZW5jb2RlZCkKLQkJCU5FWFRfT1VUKDEpCi0JCX0KLQkJZWxzZSB7Ci0JCQlXUklURTIoZW5jb2RlZCA+PiA4LCBlbmNvZGVkICYgMHhmZikKLQkJCU5FWFRfT1VUKDIpCi0JCX0KLQkJTkVYVF9JTihpbnNpemUpCi0JfQorICAgICAgICBpZiAoZHNnLT53aWR0aCA9PSAxKSB7CisgICAgICAgICAgICBXUklURTEoKHVuc2lnbmVkIGNoYXIpZW5jb2RlZCkKKyAgICAgICAgICAgIE5FWFRfT1VUKDEpCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBXUklURTIoZW5jb2RlZCA+PiA4LCBlbmNvZGVkICYgMHhmZikKKyAgICAgICAgICAgIE5FWFRfT1VUKDIpCisgICAgICAgIH0KKyAgICAgICAgTkVYVF9JTihpbnNpemUpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVJfSU5JVChpc28yMDIyKQogewotCVNUQVRFX0NMRUFSRkxBR1MoKQotCVNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCi0JU1RBVEVfU0VURzEoQ0hBUlNFVF9BU0NJSSkKLQlTVEFURV9TRVRHMihDSEFSU0VUX0FTQ0lJKQotCXJldHVybiAwOworICAgIFNUQVRFX0NMRUFSRkxBR1MoKQorICAgIFNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCisgICAgU1RBVEVfU0VURzEoQ0hBUlNFVF9BU0NJSSkKKyAgICBTVEFURV9TRVRHMihDSEFSU0VUX0FTQ0lJKQorICAgIHJldHVybiAwOwogfQogCiBERUNPREVSX1JFU0VUKGlzbzIwMjIpCiB7Ci0JU1RBVEVfU0VURzAoQ0hBUlNFVF9BU0NJSSkKLQlTVEFURV9DTEVBUkZMQUcoRl9TSElGVEVEKQotCXJldHVybiAwOworICAgIFNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCisgICAgU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGlzbzIwMjJwcm9jZXNzZXNjKGNvbnN0IHZvaWQgKmNvbmZpZywgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCAqaW5sZWZ0KQorICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKmluYnVmLCBQeV9zc2l6ZV90ICppbmxlZnQpCiB7Ci0JdW5zaWduZWQgY2hhciBjaGFyc2V0LCBkZXNpZ25hdGlvbjsKLQlQeV9zc2l6ZV90IGksIGVzY2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGNoYXJzZXQsIGRlc2lnbmF0aW9uOworICAgIFB5X3NzaXplX3QgaSwgZXNjbGVuOwogCi0JZm9yIChpID0gMTtpIDwgTUFYX0VTQ1NFUUxFTjtpKyspIHsKLQkJaWYgKGkgPj0gKmlubGVmdCkKLQkJCXJldHVybiBNQkVSUl9UT09GRVc7Ci0JCWlmIChJU19FU0NFTkQoKCppbmJ1ZilbaV0pKSB7Ci0JCQllc2NsZW4gPSBpICsgMTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYgKENPTkZJR19JU1NFVChVU0VfSklTWDAyMDhfRVhUKSAmJiBpKzEgPCAqaW5sZWZ0ICYmCi0JCQkgKCppbmJ1ZilbaV0gPT0gJyYnICYmICgqaW5idWYpW2krMV0gPT0gJ0AnKQotCQkJaSArPSAyOwotCX0KKyAgICBmb3IgKGkgPSAxO2kgPCBNQVhfRVNDU0VRTEVOO2krKykgeworICAgICAgICBpZiAoaSA+PSAqaW5sZWZ0KQorICAgICAgICAgICAgcmV0dXJuIE1CRVJSX1RPT0ZFVzsKKyAgICAgICAgaWYgKElTX0VTQ0VORCgoKmluYnVmKVtpXSkpIHsKKyAgICAgICAgICAgIGVzY2xlbiA9IGkgKyAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoQ09ORklHX0lTU0VUKFVTRV9KSVNYMDIwOF9FWFQpICYmIGkrMSA8ICppbmxlZnQgJiYKKyAgICAgICAgICAgICAgICAgKCppbmJ1ZilbaV0gPT0gJyYnICYmICgqaW5idWYpW2krMV0gPT0gJ0AnKQorICAgICAgICAgICAgaSArPSAyOworICAgIH0KIAotCWlmIChpID49IE1BWF9FU0NTRVFMRU4pCi0JCXJldHVybiAxOyAvKiB1bnRlcm1pbmF0ZWQgZXNjYXBlIHNlcXVlbmNlICovCisgICAgaWYgKGkgPj0gTUFYX0VTQ1NFUUxFTikKKyAgICAgICAgcmV0dXJuIDE7IC8qIHVudGVybWluYXRlZCBlc2NhcGUgc2VxdWVuY2UgKi8KIAotCXN3aXRjaCAoZXNjbGVuKSB7Ci0JY2FzZSAzOgotCQlpZiAoSU4yID09ICckJykgewotCQkJY2hhcnNldCA9IElOMyB8IENIQVJTRVRfREJDUzsKLQkJCWRlc2lnbmF0aW9uID0gMDsKLQkJfQotCQllbHNlIHsKLQkJCWNoYXJzZXQgPSBJTjM7Ci0JCQlpZiAoSU4yID09ICcoJykgZGVzaWduYXRpb24gPSAwOwotCQkJZWxzZSBpZiAoSU4yID09ICcpJykgZGVzaWduYXRpb24gPSAxOwotCQkJZWxzZSBpZiAoQ09ORklHX0lTU0VUKFVTRV9HMikgJiYgSU4yID09ICcuJykKLQkJCQlkZXNpZ25hdGlvbiA9IDI7Ci0JCQllbHNlIHJldHVybiAzOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJaWYgKElOMiAhPSAnJCcpCi0JCQlyZXR1cm4gNDsKKyAgICBzd2l0Y2ggKGVzY2xlbikgeworICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKElOMiA9PSAnJCcpIHsKKyAgICAgICAgICAgIGNoYXJzZXQgPSBJTjMgfCBDSEFSU0VUX0RCQ1M7CisgICAgICAgICAgICBkZXNpZ25hdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyc2V0ID0gSU4zOworICAgICAgICAgICAgaWYgKElOMiA9PSAnKCcpIGRlc2lnbmF0aW9uID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKElOMiA9PSAnKScpIGRlc2lnbmF0aW9uID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKENPTkZJR19JU1NFVChVU0VfRzIpICYmIElOMiA9PSAnLicpCisgICAgICAgICAgICAgICAgZGVzaWduYXRpb24gPSAyOworICAgICAgICAgICAgZWxzZSByZXR1cm4gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGlmIChJTjIgIT0gJyQnKQorICAgICAgICAgICAgcmV0dXJuIDQ7CiAKLQkJY2hhcnNldCA9IElONCB8IENIQVJTRVRfREJDUzsKLQkJaWYgKElOMyA9PSAnKCcpIGRlc2lnbmF0aW9uID0gMDsKLQkJZWxzZSBpZiAoSU4zID09ICcpJykgZGVzaWduYXRpb24gPSAxOwotCQllbHNlIHJldHVybiA0OwotCQlicmVhazsKLQljYXNlIDY6IC8qIGRlc2lnbmF0aW9uIHdpdGggcHJlZml4ICovCi0JCWlmIChDT05GSUdfSVNTRVQoVVNFX0pJU1gwMjA4X0VYVCkgJiYKLQkJICAgICgqaW5idWYpWzNdID09IEVTQyAmJiAoKmluYnVmKVs0XSA9PSAnJCcgJiYKLQkJICAgICgqaW5idWYpWzVdID09ICdCJykgewotCQkJY2hhcnNldCA9ICdCJyB8IENIQVJTRVRfREJDUzsKLQkJCWRlc2lnbmF0aW9uID0gMDsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gNjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGVzY2xlbjsKLQl9CisgICAgICAgIGNoYXJzZXQgPSBJTjQgfCBDSEFSU0VUX0RCQ1M7CisgICAgICAgIGlmIChJTjMgPT0gJygnKSBkZXNpZ25hdGlvbiA9IDA7CisgICAgICAgIGVsc2UgaWYgKElOMyA9PSAnKScpIGRlc2lnbmF0aW9uID0gMTsKKyAgICAgICAgZWxzZSByZXR1cm4gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiAvKiBkZXNpZ25hdGlvbiB3aXRoIHByZWZpeCAqLworICAgICAgICBpZiAoQ09ORklHX0lTU0VUKFVTRV9KSVNYMDIwOF9FWFQpICYmCisgICAgICAgICAgICAoKmluYnVmKVszXSA9PSBFU0MgJiYgKCppbmJ1ZilbNF0gPT0gJyQnICYmCisgICAgICAgICAgICAoKmluYnVmKVs1XSA9PSAnQicpIHsKKyAgICAgICAgICAgIGNoYXJzZXQgPSAnQicgfCBDSEFSU0VUX0RCQ1M7CisgICAgICAgICAgICBkZXNpZ25hdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDY7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBlc2NsZW47CisgICAgfQogCi0JLyogcmFpc2UgZXJyb3Igd2hlbiB0aGUgY2hhcnNldCBpcyBub3QgZGVzaWduYXRlZCBmb3IgdGhpcyBlbmNvZGluZyAqLwotCWlmIChjaGFyc2V0ICE9IENIQVJTRVRfQVNDSUkpIHsKLQkJY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gKmRzZzsKKyAgICAvKiByYWlzZSBlcnJvciB3aGVuIHRoZSBjaGFyc2V0IGlzIG5vdCBkZXNpZ25hdGVkIGZvciB0aGlzIGVuY29kaW5nICovCisgICAgaWYgKGNoYXJzZXQgIT0gQ0hBUlNFVF9BU0NJSSkgeworICAgICAgICBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZHNnOwogCi0JCWZvciAoZHNnID0gQ09ORklHX0RFU0lHTkFUSU9OUzsgZHNnLT5tYXJrOyBkc2crKykKLQkJCWlmIChkc2ctPm1hcmsgPT0gY2hhcnNldCkKLQkJCQlicmVhazsKLQkJaWYgKCFkc2ctPm1hcmspCi0JCQlyZXR1cm4gZXNjbGVuOwotCX0KKyAgICAgICAgZm9yIChkc2cgPSBDT05GSUdfREVTSUdOQVRJT05TOyBkc2ctPm1hcms7IGRzZysrKQorICAgICAgICAgICAgaWYgKGRzZy0+bWFyayA9PSBjaGFyc2V0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIWRzZy0+bWFyaykKKyAgICAgICAgICAgIHJldHVybiBlc2NsZW47CisgICAgfQogCi0JU1RBVEVfU0VURyhkZXNpZ25hdGlvbiwgY2hhcnNldCkKLQkqaW5sZWZ0IC09IGVzY2xlbjsKLQkoKmluYnVmKSArPSBlc2NsZW47Ci0JcmV0dXJuIDA7CisgICAgU1RBVEVfU0VURyhkZXNpZ25hdGlvbiwgY2hhcnNldCkKKyAgICAqaW5sZWZ0IC09IGVzY2xlbjsKKyAgICAoKmluYnVmKSArPSBlc2NsZW47CisgICAgcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgSVNPODg1OV83X0RFQ09ERShjLCBhc3NpKQkJCQkJXAotCWlmICgoYykgPCAweGEwKSAoYXNzaSkgPSAoYyk7CQkJCQlcCi0JZWxzZSBpZiAoKGMpIDwgMHhjMCAmJiAoMHgyODhmM2JjOUwgJiAoMUwgPDwgKChjKS0weGEwKSkpKQlcCi0JCShhc3NpKSA9IChjKTsJCQkJCQlcCi0JZWxzZSBpZiAoKGMpID49IDB4YjQgJiYgKGMpIDw9IDB4ZmUgJiYgKChjKSA+PSAweGQ0IHx8CQlcCi0JCSAoMHhiZmZmZmQ3N0wgJiAoMUwgPDwgKChjKS0weGI0KSkpKSkJCQlcCi0JCShhc3NpKSA9IDB4MDJkMCArIChjKTsJCQkJCVwKLQllbHNlIGlmICgoYykgPT0gMHhhMSkgKGFzc2kpID0gMHgyMDE4OwkJCQlcCi0JZWxzZSBpZiAoKGMpID09IDB4YTIpIChhc3NpKSA9IDB4MjAxOTsJCQkJXAotCWVsc2UgaWYgKChjKSA9PSAweGFmKSAoYXNzaSkgPSAweDIwMTU7CisjZGVmaW5lIElTTzg4NTlfN19ERUNPREUoYywgYXNzaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChjKSA8IDB4YTApIChhc3NpKSA9IChjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpIDwgMHhjMCAmJiAoMHgyODhmM2JjOUwgJiAoMUwgPDwgKChjKS0weGEwKSkpKSAgICAgICAgICBcCisgICAgICAgIChhc3NpKSA9IChjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID49IDB4YjQgJiYgKGMpIDw9IDB4ZmUgJiYgKChjKSA+PSAweGQ0IHx8ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKDB4YmZmZmZkNzdMICYgKDFMIDw8ICgoYyktMHhiNCkpKSkpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChhc3NpKSA9IDB4MDJkMCArIChjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4YTEpIChhc3NpKSA9IDB4MjAxODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4YTIpIChhc3NpKSA9IDB4MjAxOTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4YWYpIChhc3NpKSA9IDB4MjAxNTsKIAogc3RhdGljIFB5X3NzaXplX3QKIGlzbzIwMjJwcm9jZXNzZzIoY29uc3Qgdm9pZCAqY29uZmlnLCBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCi0JCSBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW5idWYsIFB5X3NzaXplX3QgKmlubGVmdCwKLQkJIFB5X1VOSUNPREUgKipvdXRidWYsIFB5X3NzaXplX3QgKm91dGxlZnQpCisgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCAqaW5sZWZ0LAorICAgICAgICAgICAgICAgICBQeV9VTklDT0RFICoqb3V0YnVmLCBQeV9zc2l6ZV90ICpvdXRsZWZ0KQogewotCS8qIG5vdCB3cml0dGVuIHRvIHVzZSBlbmNvZGVyLCBkZWNvZGVyIGZ1bmN0aW9ucyBiZWNhdXNlIG9ubHkgZmV3Ci0JICogZW5jb2RpbmdzIHVzZSBHMiBkZXNpZ25hdGlvbnMgaW4gQ0pLQ29kZWNzICovCi0JaWYgKFNUQVRFX0cyID09IENIQVJTRVRfSVNPODg1OV8xKSB7Ci0JCWlmIChJTjMgPCAweDgwKQotCQkJT1VUMShJTjMgKyAweDgwKQotCQllbHNlCi0JCQlyZXR1cm4gMzsKLQl9Ci0JZWxzZSBpZiAoU1RBVEVfRzIgPT0gQ0hBUlNFVF9JU084ODU5XzcpIHsKLQkJSVNPODg1OV83X0RFQ09ERShJTjMgXiAweDgwLCAqKm91dGJ1ZikKLQkJZWxzZSByZXR1cm4gMzsKLQl9Ci0JZWxzZSBpZiAoU1RBVEVfRzIgPT0gQ0hBUlNFVF9BU0NJSSkgewotCQlpZiAoSU4zICYgMHg4MCkgcmV0dXJuIDM7Ci0JCWVsc2UgKipvdXRidWYgPSBJTjM7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIE1CRVJSX0lOVEVSTkFMOworICAgIC8qIG5vdCB3cml0dGVuIHRvIHVzZSBlbmNvZGVyLCBkZWNvZGVyIGZ1bmN0aW9ucyBiZWNhdXNlIG9ubHkgZmV3CisgICAgICogZW5jb2RpbmdzIHVzZSBHMiBkZXNpZ25hdGlvbnMgaW4gQ0pLQ29kZWNzICovCisgICAgaWYgKFNUQVRFX0cyID09IENIQVJTRVRfSVNPODg1OV8xKSB7CisgICAgICAgIGlmIChJTjMgPCAweDgwKQorICAgICAgICAgICAgT1VUMShJTjMgKyAweDgwKQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICB9CisgICAgZWxzZSBpZiAoU1RBVEVfRzIgPT0gQ0hBUlNFVF9JU084ODU5XzcpIHsKKyAgICAgICAgSVNPODg1OV83X0RFQ09ERShJTjMgXiAweDgwLCAqKm91dGJ1ZikKKyAgICAgICAgZWxzZSByZXR1cm4gMzsKKyAgICB9CisgICAgZWxzZSBpZiAoU1RBVEVfRzIgPT0gQ0hBUlNFVF9BU0NJSSkgeworICAgICAgICBpZiAoSU4zICYgMHg4MCkgcmV0dXJuIDM7CisgICAgICAgIGVsc2UgKipvdXRidWYgPSBJTjM7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE1CRVJSX0lOVEVSTkFMOwogCi0JKCppbmJ1ZikgKz0gMzsKLQkqaW5sZWZ0IC09IDM7Ci0JKCpvdXRidWYpICs9IDE7Ci0JKm91dGxlZnQgLT0gMTsKLQlyZXR1cm4gMDsKKyAgICAoKmluYnVmKSArPSAzOworICAgICppbmxlZnQgLT0gMzsKKyAgICAoKm91dGJ1ZikgKz0gMTsKKyAgICAqb3V0bGVmdCAtPSAxOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGlzbzIwMjIpCiB7Ci0JY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gKmRzZ2NhY2hlID0gTlVMTDsKKyAgICBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZHNnY2FjaGUgPSBOVUxMOwogCi0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOwotCQlQeV9zc2l6ZV90IGVycjsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgICAgIFB5X3NzaXplX3QgZXJyOwogCi0JCWlmIChTVEFURV9HRVRGTEFHKEZfRVNDVEhST1VHSE9VVCkpIHsKLQkJCS8qIEVTQyB0aHJvdWdob3V0IG1vZGU6Ci0JCQkgKiBmb3Igbm9uLWlzbzIwMjIgZXNjYXBlIHNlcXVlbmNlcyAqLwotCQkJV1JJVEUxKGMpIC8qIGFzc3VtZSBhcyBJU08tODg1OS0xICovCi0JCQlORVhUKDEsIDEpCi0JCQlpZiAoSVNfRVNDRU5EKGMpKSB7Ci0JCQkJU1RBVEVfQ0xFQVJGTEFHKEZfRVNDVEhST1VHSE9VVCkKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChTVEFURV9HRVRGTEFHKEZfRVNDVEhST1VHSE9VVCkpIHsKKyAgICAgICAgICAgIC8qIEVTQyB0aHJvdWdob3V0IG1vZGU6CisgICAgICAgICAgICAgKiBmb3Igbm9uLWlzbzIwMjIgZXNjYXBlIHNlcXVlbmNlcyAqLworICAgICAgICAgICAgV1JJVEUxKGMpIC8qIGFzc3VtZSBhcyBJU08tODg1OS0xICovCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBpZiAoSVNfRVNDRU5EKGMpKSB7CisgICAgICAgICAgICAgICAgU1RBVEVfQ0xFQVJGTEFHKEZfRVNDVEhST1VHSE9VVCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgRVNDOgotCQkJUkVRVUlSRV9JTkJVRigyKQotCQkJaWYgKElTX0lTTzIwMjJFU0MoSU4yKSkgewotCQkJCWVyciA9IGlzbzIwMjJwcm9jZXNzZXNjKGNvbmZpZywgc3RhdGUsCi0JCQkJCQkJaW5idWYsICZpbmxlZnQpOwotCQkJCWlmIChlcnIgIT0gMCkKLQkJCQkJcmV0dXJuIGVycjsKLQkJCX0KLQkJCWVsc2UgaWYgKENPTkZJR19JU1NFVChVU0VfRzIpICYmIElOMiA9PSAnTicpIHsvKiBTUzIgKi8KLQkJCQlSRVFVSVJFX0lOQlVGKDMpCi0JCQkJZXJyID0gaXNvMjAyMnByb2Nlc3NnMihjb25maWcsIHN0YXRlLAotCQkJCQlpbmJ1ZiwgJmlubGVmdCwgb3V0YnVmLCAmb3V0bGVmdCk7Ci0JCQkJaWYgKGVyciAhPSAwKQotCQkJCQlyZXR1cm4gZXJyOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJV1JJVEUxKEVTQykKLQkJCQlTVEFURV9TRVRGTEFHKEZfRVNDVEhST1VHSE9VVCkKLQkJCQlORVhUKDEsIDEpCi0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTSToKLQkJCWlmIChDT05GSUdfSVNTRVQoTk9fU0hJRlQpKQotCQkJCWdvdG8gYnlwYXNzOwotCQkJU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKLQkJCU5FWFRfSU4oMSkKLQkJCWJyZWFrOwotCQljYXNlIFNPOgotCQkJaWYgKENPTkZJR19JU1NFVChOT19TSElGVCkpCi0JCQkJZ290byBieXBhc3M7Ci0JCQlTVEFURV9TRVRGTEFHKEZfU0hJRlRFRCkKLQkJCU5FWFRfSU4oMSkKLQkJCWJyZWFrOwotCQljYXNlIExGOgotCQkJU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKLQkJCVdSSVRFMShMRikKLQkJCU5FWFQoMSwgMSkKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKGMgPCAweDIwKSAvKiBDMCAqLwotCQkJCWdvdG8gYnlwYXNzOwotCQkJZWxzZSBpZiAoYyA+PSAweDgwKQotCQkJCXJldHVybiAxOwotCQkJZWxzZSB7Ci0JCQkJY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gKmRzZzsKLQkJCQl1bnNpZ25lZCBjaGFyIGNoYXJzZXQ7Ci0JCQkJdWNzNF90IGRlY29kZWQ7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlIEVTQzoKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGlmIChJU19JU08yMDIyRVNDKElOMikpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBpc28yMDIycHJvY2Vzc2VzYyhjb25maWcsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluYnVmLCAmaW5sZWZ0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChDT05GSUdfSVNTRVQoVVNFX0cyKSAmJiBJTjIgPT0gJ04nKSB7LyogU1MyICovCisgICAgICAgICAgICAgICAgUkVRVUlSRV9JTkJVRigzKQorICAgICAgICAgICAgICAgIGVyciA9IGlzbzIwMjJwcm9jZXNzZzIoY29uZmlnLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgaW5idWYsICZpbmxlZnQsIG91dGJ1ZiwgJm91dGxlZnQpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFdSSVRFMShFU0MpCisgICAgICAgICAgICAgICAgU1RBVEVfU0VURkxBRyhGX0VTQ1RIUk9VR0hPVVQpCisgICAgICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0k6CisgICAgICAgICAgICBpZiAoQ09ORklHX0lTU0VUKE5PX1NISUZUKSkKKyAgICAgICAgICAgICAgICBnb3RvIGJ5cGFzczsKKyAgICAgICAgICAgIFNUQVRFX0NMRUFSRkxBRyhGX1NISUZURUQpCisgICAgICAgICAgICBORVhUX0lOKDEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTTzoKKyAgICAgICAgICAgIGlmIChDT05GSUdfSVNTRVQoTk9fU0hJRlQpKQorICAgICAgICAgICAgICAgIGdvdG8gYnlwYXNzOworICAgICAgICAgICAgU1RBVEVfU0VURkxBRyhGX1NISUZURUQpCisgICAgICAgICAgICBORVhUX0lOKDEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMRjoKKyAgICAgICAgICAgIFNUQVRFX0NMRUFSRkxBRyhGX1NISUZURUQpCisgICAgICAgICAgICBXUklURTEoTEYpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChjIDwgMHgyMCkgLyogQzAgKi8KKyAgICAgICAgICAgICAgICBnb3RvIGJ5cGFzczsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gMHg4MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uICpkc2c7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjaGFyc2V0OworICAgICAgICAgICAgICAgIHVjczRfdCBkZWNvZGVkOwogCi0JCQkJaWYgKFNUQVRFX0dFVEZMQUcoRl9TSElGVEVEKSkKLQkJCQkJY2hhcnNldCA9IFNUQVRFX0cxOwotCQkJCWVsc2UKLQkJCQkJY2hhcnNldCA9IFNUQVRFX0cwOworICAgICAgICAgICAgICAgIGlmIChTVEFURV9HRVRGTEFHKEZfU0hJRlRFRCkpCisgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTVEFURV9HMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTVEFURV9HMDsKIAotCQkJCWlmIChjaGFyc2V0ID09IENIQVJTRVRfQVNDSUkpIHsKLWJ5cGFzczoJCQkJCVdSSVRFMShjKQotCQkJCQlORVhUKDEsIDEpCi0JCQkJCWJyZWFrOwotCQkJCX0KKyAgICAgICAgICAgICAgICBpZiAoY2hhcnNldCA9PSBDSEFSU0VUX0FTQ0lJKSB7CitieXBhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUxKGMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQlpZiAoZHNnY2FjaGUgIT0gTlVMTCAmJgotCQkJCSAgICBkc2djYWNoZS0+bWFyayA9PSBjaGFyc2V0KQotCQkJCQlkc2cgPSBkc2djYWNoZTsKLQkJCQllbHNlIHsKLQkJCQkJZm9yIChkc2cgPSBDT05GSUdfREVTSUdOQVRJT05TOwotCQkJCQkgICAgIGRzZy0+bWFyayAhPSBjaGFyc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkc2djYWNoZSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2djYWNoZS0+bWFyayA9PSBjaGFyc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzZyA9IGRzZ2NhY2hlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGRzZyA9IENPTkZJR19ERVNJR05BVElPTlM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2ctPm1hcmsgIT0gY2hhcnNldAogI2lmZGVmIFB5X0RFQlVHCi0JCQkJCQkmJiBkc2ctPm1hcmsgIT0gJ1wwJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHNnLT5tYXJrICE9ICdcMCcKICNlbmRpZgotCQkJCQkgICAgIDtkc2crKykKLQkJCQkJCS8qIG5vb3AgKi87Ci0JCQkJCWFzc2VydChkc2ctPm1hcmsgIT0gJ1wwJyk7Ci0JCQkJCWRzZ2NhY2hlID0gZHNnOwotCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtkc2crKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vb3AgKi87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGRzZy0+bWFyayAhPSAnXDAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2djYWNoZSA9IGRzZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJUkVRVUlSRV9JTkJVRihkc2ctPndpZHRoKQotCQkJCWRlY29kZWQgPSBkc2ctPmRlY29kZXIoKmluYnVmKTsKLQkJCQlpZiAoZGVjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSkKLQkJCQkJcmV0dXJuIGRzZy0+d2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoZHNnLT53aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCA9IGRzZy0+ZGVjb2RlcigqaW5idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHNnLT53aWR0aDsKIAotCQkJCWlmIChkZWNvZGVkIDwgMHgxMDAwMCkgewotCQkJCQlXUklURTEoZGVjb2RlZCkKLQkJCQkJTkVYVF9PVVQoMSkKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZGVjb2RlZCA8IDB4MzAwMDApIHsKLQkJCQkJV1JJVEVVQ1M0KGRlY29kZWQpCi0JCQkJfQotCQkJCWVsc2UgeyAvKiBKSVMgWCAwMjEzIHBhaXJzICovCi0JCQkJCVdSSVRFMihkZWNvZGVkID4+IDE2LCBkZWNvZGVkICYgMHhmZmZmKQotCQkJCQlORVhUX09VVCgyKQotCQkJCX0KLQkJCQlORVhUX0lOKGRzZy0+d2lkdGgpCi0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZWQgPCAweDEwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUxKGRlY29kZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVYVF9PVVQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWNvZGVkIDwgMHgzMDAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFVUNTNChkZWNvZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvKiBKSVMgWCAwMjEzIHBhaXJzICovCisgICAgICAgICAgICAgICAgICAgIFdSSVRFMihkZWNvZGVkID4+IDE2LCBkZWNvZGVkICYgMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICBORVhUX09VVCgyKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBORVhUX0lOKGRzZy0+d2lkdGgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyotKi0gbWFwcGluZyB0YWJsZSBob2xkZXJzIC0qLSovCkBAIC01NjcsNTQyICs1NjcsNTQyIEBACiBzdGF0aWMgaW50CiBrc3gxMDAxX2luaXQodm9pZCkKIHsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAotCWlmICghaW5pdGlhbGl6ZWQgJiYgKAotCQkJSU1QT1JUX01BUChrciwgY3A5NDksICZjcDk0OV9lbmNtYXAsIE5VTEwpIHx8Ci0JCQlJTVBPUlRfTUFQKGtyLCBrc3gxMDAxLCBOVUxMLCAma3N4MTAwMV9kZWNtYXApKSkKLQkJcmV0dXJuIC0xOwotCWluaXRpYWxpemVkID0gMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIWluaXRpYWxpemVkICYmICgKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChrciwgY3A5NDksICZjcDk0OV9lbmNtYXAsIE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoa3IsIGtzeDEwMDEsIE5VTEwsICZrc3gxMDAxX2RlY21hcCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdWNzNF90CiBrc3gxMDAxX2RlY29kZXIoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKLQl1Y3M0X3QgdTsKLQlUUllNQVBfREVDKGtzeDEwMDEsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCi0JCXJldHVybiB1OwotCWVsc2UKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHVjczRfdCB1OworICAgIFRSWU1BUF9ERUMoa3N4MTAwMSwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgcmV0dXJuIHU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGtzeDEwMDFfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQ7Ci0JYXNzZXJ0KCpsZW5ndGggPT0gMSk7Ci0JaWYgKCpkYXRhIDwgMHgxMDAwMCkgewotCQlUUllNQVBfRU5DKGNwOTQ5LCBjb2RlZCwgKmRhdGEpCi0JCQlpZiAoIShjb2RlZCAmIDB4ODAwMCkpCi0JCQkJcmV0dXJuIGNvZGVkOwotCX0KLQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgREJDSEFSIGNvZGVkOworICAgIGFzc2VydCgqbGVuZ3RoID09IDEpOworICAgIGlmICgqZGF0YSA8IDB4MTAwMDApIHsKKyAgICAgICAgVFJZTUFQX0VOQyhjcDk0OSwgY29kZWQsICpkYXRhKQorICAgICAgICAgICAgaWYgKCEoY29kZWQgJiAweDgwMDApKQorICAgICAgICAgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICB9CisgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwogfQogCiBzdGF0aWMgaW50CiBqaXN4MDIwOF9pbml0KHZvaWQpCiB7Ci0Jc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CiAKLQlpZiAoIWluaXRpYWxpemVkICYmICgKLQkJCUlNUE9SVF9NQVAoanAsIGppc3hjb21tb24sICZqaXN4Y29tbW9uX2VuY21hcCwgTlVMTCkgfHwKLQkJCUlNUE9SVF9NQVAoanAsIGppc3gwMjA4LCBOVUxMLCAmamlzeDAyMDhfZGVjbWFwKSkpCi0JCXJldHVybiAtMTsKLQlpbml0aWFsaXplZCA9IDE7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFpbml0aWFsaXplZCAmJiAoCisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoanAsIGppc3hjb21tb24sICZqaXN4Y29tbW9uX2VuY21hcCwgTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeDAyMDgsIE5VTEwsICZqaXN4MDIwOF9kZWNtYXApKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGluaXRpYWxpemVkID0gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHVjczRfdAogamlzeDAyMDhfZGVjb2Rlcihjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewotCXVjczRfdCB1OwotCWlmIChkYXRhWzBdID09IDB4MjEgJiYgZGF0YVsxXSA9PSAweDQwKSAvKiBGL1cgUkVWRVJTRSBTT0xJRFVTICovCi0JCXJldHVybiAweGZmM2M7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjA4LCB1LCBkYXRhWzBdLCBkYXRhWzFdKQotCQlyZXR1cm4gdTsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICB1Y3M0X3QgdTsKKyAgICBpZiAoZGF0YVswXSA9PSAweDIxICYmIGRhdGFbMV0gPT0gMHg0MCkgLyogRi9XIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICByZXR1cm4gMHhmZjNjOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgcmV0dXJuIHU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGppc3gwMjA4X2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkOwotCWFzc2VydCgqbGVuZ3RoID09IDEpOwotCWlmICgqZGF0YSA8IDB4MTAwMDApIHsKLQkJaWYgKCpkYXRhID09IDB4ZmYzYykgLyogRi9XIFJFVkVSU0UgU09MSURVUyAqLwotCQkJcmV0dXJuIDB4MjE0MDsKLQkJZWxzZSBUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGVkLCAqZGF0YSkgewotCQkJaWYgKCEoY29kZWQgJiAweDgwMDApKQotCQkJCXJldHVybiBjb2RlZDsKLQkJfQotCX0KLQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgREJDSEFSIGNvZGVkOworICAgIGFzc2VydCgqbGVuZ3RoID09IDEpOworICAgIGlmICgqZGF0YSA8IDB4MTAwMDApIHsKKyAgICAgICAgaWYgKCpkYXRhID09IDB4ZmYzYykgLyogRi9XIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICAgICAgcmV0dXJuIDB4MjE0MDsKKyAgICAgICAgZWxzZSBUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGVkLCAqZGF0YSkgeworICAgICAgICAgICAgaWYgKCEoY29kZWQgJiAweDgwMDApKQorICAgICAgICAgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIHN0YXRpYyBpbnQKIGppc3gwMjEyX2luaXQodm9pZCkKIHsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAotCWlmICghaW5pdGlhbGl6ZWQgJiYgKAotCQkJSU1QT1JUX01BUChqcCwgamlzeGNvbW1vbiwgJmppc3hjb21tb25fZW5jbWFwLCBOVUxMKSB8fAotCQkJSU1QT1JUX01BUChqcCwgamlzeDAyMTIsIE5VTEwsICZqaXN4MDIxMl9kZWNtYXApKSkKLQkJcmV0dXJuIC0xOwotCWluaXRpYWxpemVkID0gMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIWluaXRpYWxpemVkICYmICgKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeGNvbW1vbiwgJmppc3hjb21tb25fZW5jbWFwLCBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGpwLCBqaXN4MDIxMiwgTlVMTCwgJmppc3gwMjEyX2RlY21hcCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdWNzNF90CiBqaXN4MDIxMl9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JVFJZTUFQX0RFQyhqaXN4MDIxMiwgdSwgZGF0YVswXSwgZGF0YVsxXSkKLQkJcmV0dXJuIHU7Ci0JZWxzZQotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgdWNzNF90IHU7CisgICAgVFJZTUFQX0RFQyhqaXN4MDIxMiwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgcmV0dXJuIHU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGppc3gwMjEyX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkOwotCWFzc2VydCgqbGVuZ3RoID09IDEpOwotCWlmICgqZGF0YSA8IDB4MTAwMDApIHsKLQkJVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlZCwgKmRhdGEpIHsKLQkJCWlmIChjb2RlZCAmIDB4ODAwMCkKLQkJCQlyZXR1cm4gY29kZWQgJiAweDdmZmY7Ci0JCX0KLQl9Ci0JcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIERCQ0hBUiBjb2RlZDsKKyAgICBhc3NlcnQoKmxlbmd0aCA9PSAxKTsKKyAgICBpZiAoKmRhdGEgPCAweDEwMDAwKSB7CisgICAgICAgIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZWQsICpkYXRhKSB7CisgICAgICAgICAgICBpZiAoY29kZWQgJiAweDgwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVkICYgMHg3ZmZmOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIGludAogamlzeDAyMTNfaW5pdCh2b2lkKQogewotCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwogCi0JaWYgKCFpbml0aWFsaXplZCAmJiAoCi0JCQlqaXN4MDIwOF9pbml0KCkgfHwKLQkJCUlNUE9SVF9NQVAoanAsIGppc3gwMjEzX2JtcCwKLQkJCQkgICAmamlzeDAyMTNfYm1wX2VuY21hcCwgTlVMTCkgfHwKLQkJCUlNUE9SVF9NQVAoanAsIGppc3gwMjEzXzFfYm1wLAotCQkJCSAgIE5VTEwsICZqaXN4MDIxM18xX2JtcF9kZWNtYXApIHx8Ci0JCQlJTVBPUlRfTUFQKGpwLCBqaXN4MDIxM18yX2JtcCwKLQkJCQkgICBOVUxMLCAmamlzeDAyMTNfMl9ibXBfZGVjbWFwKSB8fAotCQkJSU1QT1JUX01BUChqcCwgamlzeDAyMTNfZW1wLAotCQkJCSAgICZqaXN4MDIxM19lbXBfZW5jbWFwLCBOVUxMKSB8fAotCQkJSU1QT1JUX01BUChqcCwgamlzeDAyMTNfMV9lbXAsCi0JCQkJICAgTlVMTCwgJmppc3gwMjEzXzFfZW1wX2RlY21hcCkgfHwKLQkJCUlNUE9SVF9NQVAoanAsIGppc3gwMjEzXzJfZW1wLAotCQkJCSAgIE5VTEwsICZqaXN4MDIxM18yX2VtcF9kZWNtYXApIHx8Ci0JCQlJTVBPUlRfTUFQKGpwLCBqaXN4MDIxM19wYWlyLCAmamlzeDAyMTNfcGFpcl9lbmNtYXAsCi0JCQkJICAgJmppc3gwMjEzX3BhaXJfZGVjbWFwKSkpCi0JCXJldHVybiAtMTsKLQlpbml0aWFsaXplZCA9IDE7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFpbml0aWFsaXplZCAmJiAoCisgICAgICAgICAgICAgICAgICAgIGppc3gwMjA4X2luaXQoKSB8fAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGpwLCBqaXN4MDIxM19ibXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmppc3gwMjEzX2JtcF9lbmNtYXAsIE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoanAsIGppc3gwMjEzXzFfYm1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZqaXN4MDIxM18xX2JtcF9kZWNtYXApIHx8CisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoanAsIGppc3gwMjEzXzJfYm1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZqaXN4MDIxM18yX2JtcF9kZWNtYXApIHx8CisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoanAsIGppc3gwMjEzX2VtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamlzeDAyMTNfZW1wX2VuY21hcCwgTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeDAyMTNfMV9lbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmppc3gwMjEzXzFfZW1wX2RlY21hcCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeDAyMTNfMl9lbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmppc3gwMjEzXzJfZW1wX2RlY21hcCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeDAyMTNfcGFpciwgJmppc3gwMjEzX3BhaXJfZW5jbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqaXN4MDIxM19wYWlyX2RlY21hcCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIGNvbmZpZyAoKHZvaWQgKikyMDAwKQogc3RhdGljIHVjczRfdAogamlzeDAyMTNfMjAwMF8xX2RlY29kZXIoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKLQl1Y3M0X3QgdTsKLQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMSh1LCBkYXRhWzBdLCBkYXRhWzFdKQotCWVsc2UgaWYgKGRhdGFbMF0gPT0gMHgyMSAmJiBkYXRhWzFdID09IDB4NDApIC8qIEYvVyBSRVZFUlNFIFNPTElEVVMgKi8KLQkJcmV0dXJuIDB4ZmYzYzsKLQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMDgsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOwotCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2JtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfZW1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQotCQl1IHw9IDB4MjAwMDA7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjEzX3BhaXIsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOwotCWVsc2UKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCXJldHVybiB1OworICAgIHVjczRfdCB1OworICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKHUsIGRhdGFbMF0sIGRhdGFbMV0pCisgICAgZWxzZSBpZiAoZGF0YVswXSA9PSAweDIxICYmIGRhdGFbMV0gPT0gMHg0MCkgLyogRi9XIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICByZXR1cm4gMHhmZjNjOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7CisgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfYm1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKKyAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9lbXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCisgICAgICAgIHUgfD0gMHgyMDAwMDsKKyAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfcGFpciwgdSwgZGF0YVswXSwgZGF0YVsxXSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIHU7CiB9CiAKIHN0YXRpYyB1Y3M0X3QKIGppc3gwMjEzXzIwMDBfMl9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTIodSwgZGF0YVswXSwgZGF0YVsxXSkKLQlUUllNQVBfREVDKGppc3gwMjEzXzJfYm1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKLQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9lbXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCi0JCXUgfD0gMHgyMDAwMDsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQlyZXR1cm4gdTsKKyAgICB1Y3M0X3QgdTsKKyAgICBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMih1LCBkYXRhWzBdLCBkYXRhWzFdKQorICAgIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9ibXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2VtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgdSB8PSAweDIwMDAwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHJldHVybiB1OwogfQogI3VuZGVmIGNvbmZpZwogCiBzdGF0aWMgdWNzNF90CiBqaXN4MDIxM18yMDA0XzFfZGVjb2Rlcihjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewotCXVjczRfdCB1OwotCWlmIChkYXRhWzBdID09IDB4MjEgJiYgZGF0YVsxXSA9PSAweDQwKSAvKiBGL1cgUkVWRVJTRSBTT0xJRFVTICovCi0JCXJldHVybiAweGZmM2M7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjA4LCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKLQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9ibXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOwotCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2VtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSkKLQkJdSB8PSAweDIwMDAwOwotCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM19wYWlyLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQlyZXR1cm4gdTsKKyAgICB1Y3M0X3QgdTsKKyAgICBpZiAoZGF0YVswXSA9PSAweDIxICYmIGRhdGFbMV0gPT0gMHg0MCkgLyogRi9XIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICByZXR1cm4gMHhmZjNjOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7CisgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfYm1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKKyAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9lbXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCisgICAgICAgIHUgfD0gMHgyMDAwMDsKKyAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfcGFpciwgdSwgZGF0YVswXSwgZGF0YVsxXSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIHU7CiB9CiAKIHN0YXRpYyB1Y3M0X3QKIGppc3gwMjEzXzIwMDRfMl9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JVFJZTUFQX0RFQyhqaXN4MDIxM18yX2JtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfZW1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQotCQl1IHw9IDB4MjAwMDA7Ci0JZWxzZQotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JcmV0dXJuIHU7CisgICAgdWNzNF90IHU7CisgICAgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2JtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7CisgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfZW1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQorICAgICAgICB1IHw9IDB4MjAwMDA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIHU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGppc3gwMjEzX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgsIHZvaWQgKmNvbmZpZykKIHsKLQlEQkNIQVIgY29kZWQ7CisgICAgREJDSEFSIGNvZGVkOwogCi0Jc3dpdGNoICgqbGVuZ3RoKSB7Ci0JY2FzZSAxOiAvKiBmaXJzdCBjaGFyYWN0ZXIgKi8KLQkJaWYgKCpkYXRhID49IDB4MTAwMDApIHsKLQkJCWlmICgoKmRhdGEpID4+IDE2ID09IDB4MjAwMDAgPj4gMTYpIHsKLQkJCQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0VNUChjb2RlZCwgKmRhdGEpCi0JCQkJZWxzZSBUUllNQVBfRU5DKGppc3gwMjEzX2VtcCwgY29kZWQsCi0JCQkJCQkoKmRhdGEpICYgMHhmZmZmKQotCQkJCQlyZXR1cm4gY29kZWQ7Ci0JCQl9Ci0JCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JCX0KKyAgICBzd2l0Y2ggKCpsZW5ndGgpIHsKKyAgICBjYXNlIDE6IC8qIGZpcnN0IGNoYXJhY3RlciAqLworICAgICAgICBpZiAoKmRhdGEgPj0gMHgxMDAwMCkgeworICAgICAgICAgICAgaWYgKCgqZGF0YSkgPj4gMTYgPT0gMHgyMDAwMCA+PiAxNikgeworICAgICAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfRU1QKGNvZGVkLCAqZGF0YSkKKyAgICAgICAgICAgICAgICBlbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfZW1wLCBjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkYXRhKSAmIDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgICAgICB9CiAKLQkJRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9CTVAoY29kZWQsICpkYXRhKQotCQllbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfYm1wLCBjb2RlZCwgKmRhdGEpIHsKLQkJCWlmIChjb2RlZCA9PSBNVUxUSUMpCi0JCQkJcmV0dXJuIE1BUF9NVUxUSVBMRV9BVkFJTDsKLQkJfQotCQllbHNlIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZWQsICpkYXRhKSB7Ci0JCQlpZiAoY29kZWQgJiAweDgwMDApCi0JCQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQkJcmV0dXJuIGNvZGVkOwotCWNhc2UgMjogLyogc2Vjb25kIGNoYXJhY3RlciBvZiB1bmljb2RlIHBhaXIgKi8KLQkJY29kZWQgPSBmaW5kX3BhaXJlbmNtYXAoKHVjczJfdClkYXRhWzBdLCAodWNzMl90KWRhdGFbMV0sCi0JCQkJamlzeDAyMTNfcGFpcl9lbmNtYXAsIEpJU1gwMjEzX0VOQ1BBSVJTKTsKLQkJaWYgKGNvZGVkID09IERCQ0lOVikgewotCQkJKmxlbmd0aCA9IDE7Ci0JCQljb2RlZCA9IGZpbmRfcGFpcmVuY21hcCgodWNzMl90KWRhdGFbMF0sIDAsCi0JCQkJICBqaXN4MDIxM19wYWlyX2VuY21hcCwgSklTWDAyMTNfRU5DUEFJUlMpOwotCQkJaWYgKGNvZGVkID09IERCQ0lOVikKLQkJCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGNvZGVkOwotCWNhc2UgLTE6IC8qIGZsdXNoIHVudGVybWluYXRlZCAqLwotCQkqbGVuZ3RoID0gMTsKLQkJY29kZWQgPSBmaW5kX3BhaXJlbmNtYXAoKHVjczJfdClkYXRhWzBdLCAwLAotCQkJCWppc3gwMjEzX3BhaXJfZW5jbWFwLCBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCWlmIChjb2RlZCA9PSBEQkNJTlYpCi0JCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JCWVsc2UKLQkJCXJldHVybiBjb2RlZDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JfQorICAgICAgICBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0JNUChjb2RlZCwgKmRhdGEpCisgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19ibXAsIGNvZGVkLCAqZGF0YSkgeworICAgICAgICAgICAgaWYgKGNvZGVkID09IE1VTFRJQykKKyAgICAgICAgICAgICAgICByZXR1cm4gTUFQX01VTFRJUExFX0FWQUlMOworICAgICAgICB9CisgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlZCwgKmRhdGEpIHsKKyAgICAgICAgICAgIGlmIChjb2RlZCAmIDB4ODAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgY2FzZSAyOiAvKiBzZWNvbmQgY2hhcmFjdGVyIG9mIHVuaWNvZGUgcGFpciAqLworICAgICAgICBjb2RlZCA9IGZpbmRfcGFpcmVuY21hcCgodWNzMl90KWRhdGFbMF0sICh1Y3MyX3QpZGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLCBKSVNYMDIxM19FTkNQQUlSUyk7CisgICAgICAgIGlmIChjb2RlZCA9PSBEQkNJTlYpIHsKKyAgICAgICAgICAgICpsZW5ndGggPSAxOworICAgICAgICAgICAgY29kZWQgPSBmaW5kX3BhaXJlbmNtYXAoKHVjczJfdClkYXRhWzBdLCAwLAorICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLCBKSVNYMDIxM19FTkNQQUlSUyk7CisgICAgICAgICAgICBpZiAoY29kZWQgPT0gREJDSU5WKQorICAgICAgICAgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgY2FzZSAtMTogLyogZmx1c2ggdW50ZXJtaW5hdGVkICovCisgICAgICAgICpsZW5ndGggPSAxOworICAgICAgICBjb2RlZCA9IGZpbmRfcGFpcmVuY21hcCgodWNzMl90KWRhdGFbMF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBqaXN4MDIxM19wYWlyX2VuY21hcCwgSklTWDAyMTNfRU5DUEFJUlMpOworICAgICAgICBpZiAoY29kZWQgPT0gREJDSU5WKQorICAgICAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIH0KIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMTNfMjAwMF8xX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsICh2b2lkICopMjAwMCk7Ci0JaWYgKGNvZGVkID09IE1BUF9VTk1BUFBBQkxFIHx8IGNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkKLQkJcmV0dXJuIGNvZGVkOwotCWVsc2UgaWYgKGNvZGVkICYgMHg4MDAwKQotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JZWxzZQotCQlyZXR1cm4gY29kZWQ7CisgICAgREJDSEFSIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsICh2b2lkICopMjAwMCk7CisgICAgaWYgKGNvZGVkID09IE1BUF9VTk1BUFBBQkxFIHx8IGNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkKKyAgICAgICAgcmV0dXJuIGNvZGVkOworICAgIGVsc2UgaWYgKGNvZGVkICYgMHg4MDAwKQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gY29kZWQ7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGppc3gwMjEzXzIwMDBfMV9lbmNvZGVyX3BhaXJvbmx5KGNvbnN0IHVjczRfdCAqZGF0YSwgUHlfc3NpemVfdCAqbGVuZ3RoKQogewotCURCQ0hBUiBjb2RlZDsKLQlQeV9zc2l6ZV90IGlsZW5ndGggPSAqbGVuZ3RoOworICAgIERCQ0hBUiBjb2RlZDsKKyAgICBQeV9zc2l6ZV90IGlsZW5ndGggPSAqbGVuZ3RoOwogCi0JY29kZWQgPSBqaXN4MDIxM19lbmNvZGVyKGRhdGEsIGxlbmd0aCwgKHZvaWQgKikyMDAwKTsKLQlzd2l0Y2ggKGlsZW5ndGgpIHsKLQljYXNlIDE6Ci0JCWlmIChjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCi0JCQlyZXR1cm4gTUFQX01VTFRJUExFX0FWQUlMOwotCQllbHNlCi0JCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JY2FzZSAyOgotCQlpZiAoKmxlbmd0aCAhPSAyKQotCQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCQllbHNlCi0JCQlyZXR1cm4gY29kZWQ7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCX0KKyAgICBjb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCAodm9pZCAqKTIwMDApOworICAgIHN3aXRjaCAoaWxlbmd0aCkgeworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkKKyAgICAgICAgICAgIHJldHVybiBNQVBfTVVMVElQTEVfQVZBSUw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmICgqbGVuZ3RoICE9IDIpCisgICAgICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgfQogfQogCiBzdGF0aWMgREJDSEFSCiBqaXN4MDIxM18yMDAwXzJfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQgPSBqaXN4MDIxM19lbmNvZGVyKGRhdGEsIGxlbmd0aCwgKHZvaWQgKikyMDAwKTsKLQlpZiAoY29kZWQgPT0gTUFQX1VOTUFQUEFCTEUgfHwgY29kZWQgPT0gTUFQX01VTFRJUExFX0FWQUlMKQotCQlyZXR1cm4gY29kZWQ7Ci0JZWxzZSBpZiAoY29kZWQgJiAweDgwMDApCi0JCXJldHVybiBjb2RlZCAmIDB4N2ZmZjsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICBEQkNIQVIgY29kZWQgPSBqaXN4MDIxM19lbmNvZGVyKGRhdGEsIGxlbmd0aCwgKHZvaWQgKikyMDAwKTsKKyAgICBpZiAoY29kZWQgPT0gTUFQX1VOTUFQUEFCTEUgfHwgY29kZWQgPT0gTUFQX01VTFRJUExFX0FWQUlMKQorICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgZWxzZSBpZiAoY29kZWQgJiAweDgwMDApCisgICAgICAgIHJldHVybiBjb2RlZCAmIDB4N2ZmZjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMTNfMjAwNF8xX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsIE5VTEwpOwotCWlmIChjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSB8fCBjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCi0JCXJldHVybiBjb2RlZDsKLQllbHNlIGlmIChjb2RlZCAmIDB4ODAwMCkKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCWVsc2UKLQkJcmV0dXJuIGNvZGVkOworICAgIERCQ0hBUiBjb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCBOVUxMKTsKKyAgICBpZiAoY29kZWQgPT0gTUFQX1VOTUFQUEFCTEUgfHwgY29kZWQgPT0gTUFQX01VTFRJUExFX0FWQUlMKQorICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgZWxzZSBpZiAoY29kZWQgJiAweDgwMDApCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBjb2RlZDsKIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMTNfMjAwNF8xX2VuY29kZXJfcGFpcm9ubHkoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkOwotCVB5X3NzaXplX3QgaWxlbmd0aCA9ICpsZW5ndGg7CisgICAgREJDSEFSIGNvZGVkOworICAgIFB5X3NzaXplX3QgaWxlbmd0aCA9ICpsZW5ndGg7CiAKLQljb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCBOVUxMKTsKLQlzd2l0Y2ggKGlsZW5ndGgpIHsKLQljYXNlIDE6Ci0JCWlmIChjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCi0JCQlyZXR1cm4gTUFQX01VTFRJUExFX0FWQUlMOwotCQllbHNlCi0JCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JY2FzZSAyOgotCQlpZiAoKmxlbmd0aCAhPSAyKQotCQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCQllbHNlCi0JCQlyZXR1cm4gY29kZWQ7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCX0KKyAgICBjb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCBOVUxMKTsKKyAgICBzd2l0Y2ggKGlsZW5ndGgpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCisgICAgICAgICAgICByZXR1cm4gTUFQX01VTFRJUExFX0FWQUlMOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAoKmxlbmd0aCAhPSAyKQorICAgICAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIH0KIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMTNfMjAwNF8yX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsIE5VTEwpOwotCWlmIChjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSB8fCBjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCi0JCXJldHVybiBjb2RlZDsKLQllbHNlIGlmIChjb2RlZCAmIDB4ODAwMCkKLQkJcmV0dXJuIGNvZGVkICYgMHg3ZmZmOwotCWVsc2UKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIERCQ0hBUiBjb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCBOVUxMKTsKKyAgICBpZiAoY29kZWQgPT0gTUFQX1VOTUFQUEFCTEUgfHwgY29kZWQgPT0gTUFQX01VTFRJUExFX0FWQUlMKQorICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgZWxzZSBpZiAoY29kZWQgJiAweDgwMDApCisgICAgICAgIHJldHVybiBjb2RlZCAmIDB4N2ZmZjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIHVjczRfdAogamlzeDAyMDFfcl9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JSklTWDAyMDFfUl9ERUNPREUoKmRhdGEsIHUpCi0JZWxzZSByZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JcmV0dXJuIHU7CisgICAgdWNzNF90IHU7CisgICAgSklTWDAyMDFfUl9ERUNPREUoKmRhdGEsIHUpCisgICAgZWxzZSByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIHU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGppc3gwMjAxX3JfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQ7Ci0JSklTWDAyMDFfUl9FTkNPREUoKmRhdGEsIGNvZGVkKQotCWVsc2UgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCXJldHVybiBjb2RlZDsKKyAgICBEQkNIQVIgY29kZWQ7CisgICAgSklTWDAyMDFfUl9FTkNPREUoKmRhdGEsIGNvZGVkKQorICAgIGVsc2UgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHJldHVybiBjb2RlZDsKIH0KIAogc3RhdGljIHVjczRfdAogamlzeDAyMDFfa19kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JSklTWDAyMDFfS19ERUNPREUoKmRhdGEgXiAweDgwLCB1KQotCWVsc2UgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCXJldHVybiB1OworICAgIHVjczRfdCB1OworICAgIEpJU1gwMjAxX0tfREVDT0RFKCpkYXRhIF4gMHg4MCwgdSkKKyAgICBlbHNlIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICByZXR1cm4gdTsKIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMDFfa19lbmNvZGVyKGNvbnN0IHVjczRfdCAqZGF0YSwgUHlfc3NpemVfdCAqbGVuZ3RoKQogewotCURCQ0hBUiBjb2RlZDsKLQlKSVNYMDIwMV9LX0VOQ09ERSgqZGF0YSwgY29kZWQpCi0JZWxzZSByZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JcmV0dXJuIGNvZGVkIC0gMHg4MDsKKyAgICBEQkNIQVIgY29kZWQ7CisgICAgSklTWDAyMDFfS19FTkNPREUoKmRhdGEsIGNvZGVkKQorICAgIGVsc2UgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHJldHVybiBjb2RlZCAtIDB4ODA7CiB9CiAKIHN0YXRpYyBpbnQKIGdiMjMxMl9pbml0KHZvaWQpCiB7Ci0Jc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CiAKLQlpZiAoIWluaXRpYWxpemVkICYmICgKLQkJCUlNUE9SVF9NQVAoY24sIGdiY29tbW9uLCAmZ2Jjb21tb25fZW5jbWFwLCBOVUxMKSB8fAotCQkJSU1QT1JUX01BUChjbiwgZ2IyMzEyLCBOVUxMLCAmZ2IyMzEyX2RlY21hcCkpKQotCQlyZXR1cm4gLTE7Ci0JaW5pdGlhbGl6ZWQgPSAxOwotCXJldHVybiAwOworICAgIGlmICghaW5pdGlhbGl6ZWQgJiYgKAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGNuLCBnYmNvbW1vbiwgJmdiY29tbW9uX2VuY21hcCwgTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChjbiwgZ2IyMzEyLCBOVUxMLCAmZ2IyMzEyX2RlY21hcCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdWNzNF90CiBnYjIzMTJfZGVjb2Rlcihjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewotCXVjczRfdCB1OwotCVRSWU1BUF9ERUMoZ2IyMzEyLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQotCQlyZXR1cm4gdTsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICB1Y3M0X3QgdTsKKyAgICBUUllNQVBfREVDKGdiMjMxMiwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgcmV0dXJuIHU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGdiMjMxMl9lbmNvZGVyKGNvbnN0IHVjczRfdCAqZGF0YSwgUHlfc3NpemVfdCAqbGVuZ3RoKQogewotCURCQ0hBUiBjb2RlZDsKLQlhc3NlcnQoKmxlbmd0aCA9PSAxKTsKLQlpZiAoKmRhdGEgPCAweDEwMDAwKSB7Ci0JCVRSWU1BUF9FTkMoZ2Jjb21tb24sIGNvZGVkLCAqZGF0YSkgewotCQkJaWYgKCEoY29kZWQgJiAweDgwMDApKQotCQkJCXJldHVybiBjb2RlZDsKLQkJfQotCX0KLQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgREJDSEFSIGNvZGVkOworICAgIGFzc2VydCgqbGVuZ3RoID09IDEpOworICAgIGlmICgqZGF0YSA8IDB4MTAwMDApIHsKKyAgICAgICAgVFJZTUFQX0VOQyhnYmNvbW1vbiwgY29kZWQsICpkYXRhKSB7CisgICAgICAgICAgICBpZiAoIShjb2RlZCAmIDB4ODAwMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogCiBzdGF0aWMgdWNzNF90CiBkdW1teV9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIERCQ0hBUgogZHVtbXlfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwogfQogCiAvKi0qLSByZWdpc3RyeSB0YWJsZXMgLSotKi8KIAotI2RlZmluZSBSRUdJU1RSWV9LU1gxMDAxX0cwCXsgQ0hBUlNFVF9LU1gxMDAxLCAwLCAyLAkJXAotCQkJCSAga3N4MTAwMV9pbml0LAkJCQlcCi0JCQkJICBrc3gxMDAxX2RlY29kZXIsIGtzeDEwMDFfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0tTWDEwMDFfRzEJeyBDSEFSU0VUX0tTWDEwMDEsIDEsIDIsCQlcCi0JCQkJICBrc3gxMDAxX2luaXQsCQkJCVwKLQkJCQkgIGtzeDEwMDFfZGVjb2Rlciwga3N4MTAwMV9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfSklTWDAyMDFfUgl7IENIQVJTRVRfSklTWDAyMDFfUiwgMCwgMSwJCVwKLQkJCQkgIE5VTEwsCQkJCQlcCi0JCQkJICBqaXN4MDIwMV9yX2RlY29kZXIsIGppc3gwMjAxX3JfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjAxX0sJeyBDSEFSU0VUX0pJU1gwMjAxX0ssIDAsIDEsCQlcCi0JCQkJICBOVUxMLAkJCQkJXAotCQkJCSAgamlzeDAyMDFfa19kZWNvZGVyLCBqaXN4MDIwMV9rX2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIwOAl7IENIQVJTRVRfSklTWDAyMDgsIDAsIDIsCQlcCi0JCQkJICBqaXN4MDIwOF9pbml0LAkJCVwKLQkJCQkgIGppc3gwMjA4X2RlY29kZXIsIGppc3gwMjA4X2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIwOF9PCXsgQ0hBUlNFVF9KSVNYMDIwOF9PLCAwLCAyLAkJXAotCQkJCSAgamlzeDAyMDhfaW5pdCwJCQlcCi0JCQkJICBqaXN4MDIwOF9kZWNvZGVyLCBqaXN4MDIwOF9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTIJeyBDSEFSU0VUX0pJU1gwMjEyLCAwLCAyLAkJXAotCQkJCSAgamlzeDAyMTJfaW5pdCwJCQlcCi0JCQkJICBqaXN4MDIxMl9kZWNvZGVyLCBqaXN4MDIxMl9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwMF8xIHsgQ0hBUlNFVF9KSVNYMDIxM18yMDAwXzEsIDAsIDIsCVwKLQkJCQkgIGppc3gwMjEzX2luaXQsCQkJXAotCQkJCSAgamlzeDAyMTNfMjAwMF8xX2RlY29kZXIsCQlcCi0JCQkJICBqaXN4MDIxM18yMDAwXzFfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0tTWDEwMDFfRzAgICAgIHsgQ0hBUlNFVF9LU1gxMDAxLCAwLCAyLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBrc3gxMDAxX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBrc3gxMDAxX2RlY29kZXIsIGtzeDEwMDFfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0tTWDEwMDFfRzEgICAgIHsgQ0hBUlNFVF9LU1gxMDAxLCAxLCAyLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBrc3gxMDAxX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBrc3gxMDAxX2RlY29kZXIsIGtzeDEwMDFfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjAxX1IgICAgIHsgQ0hBUlNFVF9KSVNYMDIwMV9SLCAwLCAxLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIwMV9yX2RlY29kZXIsIGppc3gwMjAxX3JfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjAxX0sgICAgIHsgQ0hBUlNFVF9KSVNYMDIwMV9LLCAwLCAxLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIwMV9rX2RlY29kZXIsIGppc3gwMjAxX2tfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjA4ICAgICAgIHsgQ0hBUlNFVF9KSVNYMDIwOCwgMCwgMiwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIwOF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIwOF9kZWNvZGVyLCBqaXN4MDIwOF9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfSklTWDAyMDhfTyAgICAgeyBDSEFSU0VUX0pJU1gwMjA4X08sIDAsIDIsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjA4X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjA4X2RlY29kZXIsIGppc3gwMjA4X2VuY29kZXIgfQorI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIxMiAgICAgICB7IENIQVJTRVRfSklTWDAyMTIsIDAsIDIsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTJfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTJfZGVjb2RlciwgamlzeDAyMTJfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDBfMSB7IENIQVJTRVRfSklTWDAyMTNfMjAwMF8xLCAwLCAyLCAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDAwXzFfZGVjb2RlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDAwXzFfZW5jb2RlciB9CiAjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDBfMV9QQUlST05MWSB7IENIQVJTRVRfSklTWDAyMTNfMjAwMF8xLCAwLCAyLCBcCi0JCQkJICBqaXN4MDIxM19pbml0LAkJCVwKLQkJCQkgIGppc3gwMjEzXzIwMDBfMV9kZWNvZGVyLAkJXAotCQkJCSAgamlzeDAyMTNfMjAwMF8xX2VuY29kZXJfcGFpcm9ubHkgfQotI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIxM18yMDAwXzIgeyBDSEFSU0VUX0pJU1gwMjEzXzIsIDAsIDIsCQlcCi0JCQkJICBqaXN4MDIxM19pbml0LAkJCVwKLQkJCQkgIGppc3gwMjEzXzIwMDBfMl9kZWNvZGVyLAkJXAotCQkJCSAgamlzeDAyMTNfMjAwMF8yX2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIxM18yMDA0XzEgeyBDSEFSU0VUX0pJU1gwMjEzXzIwMDRfMSwgMCwgMiwJXAotCQkJCSAgamlzeDAyMTNfaW5pdCwJCQlcCi0JCQkJICBqaXN4MDIxM18yMDA0XzFfZGVjb2RlciwJCVwKLQkJCQkgIGppc3gwMjEzXzIwMDRfMV9lbmNvZGVyIH0KKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDBfMV9kZWNvZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDBfMV9lbmNvZGVyX3BhaXJvbmx5IH0KKyNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwMF8yIHsgQ0hBUlNFVF9KSVNYMDIxM18yLCAwLCAyLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDBfMl9kZWNvZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDBfMl9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwNF8xIHsgQ0hBUlNFVF9KSVNYMDIxM18yMDA0XzEsIDAsIDIsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDRfMV9kZWNvZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDRfMV9lbmNvZGVyIH0KICNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwNF8xX1BBSVJPTkxZIHsgQ0hBUlNFVF9KSVNYMDIxM18yMDA0XzEsIDAsIDIsIFwKLQkJCQkgIGppc3gwMjEzX2luaXQsCQkJXAotCQkJCSAgamlzeDAyMTNfMjAwNF8xX2RlY29kZXIsCQlcCi0JCQkJICBqaXN4MDIxM18yMDA0XzFfZW5jb2Rlcl9wYWlyb25seSB9Ci0jZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDRfMiB7IENIQVJTRVRfSklTWDAyMTNfMiwgMCwgMiwJCVwKLQkJCQkgIGppc3gwMjEzX2luaXQsCQkJXAotCQkJCSAgamlzeDAyMTNfMjAwNF8yX2RlY29kZXIsCQlcCi0JCQkJICBqaXN4MDIxM18yMDA0XzJfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0dCMjMxMgkJeyBDSEFSU0VUX0dCMjMxMiwgMCwgMiwJCQlcCi0JCQkJICBnYjIzMTJfaW5pdCwJCQkJXAotCQkJCSAgZ2IyMzEyX2RlY29kZXIsIGdiMjMxMl9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfQ05TMTE2NDNfMQl7IENIQVJTRVRfQ05TMTE2NDNfMSwgMSwgMiwJCVwKLQkJCQkgIGNuczExNjQzX2luaXQsCQkJXAotCQkJCSAgY25zMTE2NDNfMV9kZWNvZGVyLCBjbnMxMTY0M18xX2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9DTlMxMTY0M18yCXsgQ0hBUlNFVF9DTlMxMTY0M18yLCAyLCAyLAkJXAotCQkJCSAgY25zMTE2NDNfaW5pdCwJCQlcCi0JCQkJICBjbnMxMTY0M18yX2RlY29kZXIsIGNuczExNjQzXzJfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0lTTzg4NTlfMQl7IENIQVJTRVRfSVNPODg1OV8xLCAyLCAxLAkJXAotCQkJCSAgTlVMTCwgZHVtbXlfZGVjb2RlciwgZHVtbXlfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0lTTzg4NTlfNwl7IENIQVJTRVRfSVNPODg1OV83LCAyLCAxLAkJXAotCQkJCSAgTlVMTCwgZHVtbXlfZGVjb2RlciwgZHVtbXlfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX1NFTlRJTkVMCXsgMCwgfQotI2RlZmluZSBDT05GSUdERUYodmFyLCBhdHRycykJCQkJCQlcCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2NvbmZpZyBpc28yMDIyXyMjdmFyIyNfY29uZmlnID0gewlcCi0JCWF0dHJzLCBpc28yMDIyXyMjdmFyIyNfZGVzaWduYXRpb25zCQkJXAotCX07CisgICAgICAgICAgICAgICAgICBqaXN4MDIxM19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDA0XzFfZGVjb2RlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDA0XzFfZW5jb2Rlcl9wYWlyb25seSB9CisjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDRfMiB7IENIQVJTRVRfSklTWDAyMTNfMiwgMCwgMiwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDA0XzJfZGVjb2RlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxM18yMDA0XzJfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0dCMjMxMiAgICAgICAgIHsgQ0hBUlNFVF9HQjIzMTIsIDAsIDIsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBnYjIzMTJfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBnYjIzMTJfZGVjb2RlciwgZ2IyMzEyX2VuY29kZXIgfQorI2RlZmluZSBSRUdJU1RSWV9DTlMxMTY0M18xICAgICB7IENIQVJTRVRfQ05TMTE2NDNfMSwgMSwgMiwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY25zMTE2NDNfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY25zMTE2NDNfMV9kZWNvZGVyLCBjbnMxMTY0M18xX2VuY29kZXIgfQorI2RlZmluZSBSRUdJU1RSWV9DTlMxMTY0M18yICAgICB7IENIQVJTRVRfQ05TMTE2NDNfMiwgMiwgMiwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY25zMTE2NDNfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY25zMTE2NDNfMl9kZWNvZGVyLCBjbnMxMTY0M18yX2VuY29kZXIgfQorI2RlZmluZSBSRUdJU1RSWV9JU084ODU5XzEgICAgICB7IENIQVJTRVRfSVNPODg1OV8xLCAyLCAxLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTlVMTCwgZHVtbXlfZGVjb2RlciwgZHVtbXlfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0lTTzg4NTlfNyAgICAgIHsgQ0hBUlNFVF9JU084ODU5XzcsIDIsIDEsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOVUxMLCBkdW1teV9kZWNvZGVyLCBkdW1teV9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfU0VOVElORUwgICAgICAgeyAwLCB9CisjZGVmaW5lIENPTkZJR0RFRih2YXIsIGF0dHJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2NvbmZpZyBpc28yMDIyXyMjdmFyIyNfY29uZmlnID0geyAgICAgICBcCisgICAgICAgIGF0dHJzLCBpc28yMDIyXyMjdmFyIyNfZGVzaWduYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uIGlzbzIwMjJfa3JfZGVzaWduYXRpb25zW10gPSB7Ci0JUkVHSVNUUllfS1NYMTAwMV9HMSwgUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9LU1gxMDAxX0cxLCBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihrciwgMCkKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uIGlzbzIwMjJfanBfZGVzaWduYXRpb25zW10gPSB7Ci0JUkVHSVNUUllfSklTWDAyMDgsIFJFR0lTVFJZX0pJU1gwMjAxX1IsIFJFR0lTVFJZX0pJU1gwMjA4X08sCi0JUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9KSVNYMDIwOCwgUkVHSVNUUllfSklTWDAyMDFfUiwgUkVHSVNUUllfSklTWDAyMDhfTywKKyAgICBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihqcCwgTk9fU0hJRlQgfCBVU0VfSklTWDAyMDhfRVhUKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gaXNvMjAyMl9qcF8xX2Rlc2lnbmF0aW9uc1tdID0gewotCVJFR0lTVFJZX0pJU1gwMjA4LCBSRUdJU1RSWV9KSVNYMDIxMiwgUkVHSVNUUllfSklTWDAyMDFfUiwKLQlSRUdJU1RSWV9KSVNYMDIwOF9PLCBSRUdJU1RSWV9TRU5USU5FTAorICAgIFJFR0lTVFJZX0pJU1gwMjA4LCBSRUdJU1RSWV9KSVNYMDIxMiwgUkVHSVNUUllfSklTWDAyMDFfUiwKKyAgICBSRUdJU1RSWV9KSVNYMDIwOF9PLCBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihqcF8xLCBOT19TSElGVCB8IFVTRV9KSVNYMDIwOF9FWFQpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiBpc28yMDIyX2pwXzJfZGVzaWduYXRpb25zW10gPSB7Ci0JUkVHSVNUUllfSklTWDAyMDgsIFJFR0lTVFJZX0pJU1gwMjEyLCBSRUdJU1RSWV9LU1gxMDAxX0cwLAotCVJFR0lTVFJZX0dCMjMxMiwgUkVHSVNUUllfSklTWDAyMDFfUiwgUkVHSVNUUllfSklTWDAyMDhfTywKLQlSRUdJU1RSWV9JU084ODU5XzEsIFJFR0lTVFJZX0lTTzg4NTlfNywgUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9KSVNYMDIwOCwgUkVHSVNUUllfSklTWDAyMTIsIFJFR0lTVFJZX0tTWDEwMDFfRzAsCisgICAgUkVHSVNUUllfR0IyMzEyLCBSRUdJU1RSWV9KSVNYMDIwMV9SLCBSRUdJU1RSWV9KSVNYMDIwOF9PLAorICAgIFJFR0lTVFJZX0lTTzg4NTlfMSwgUkVHSVNUUllfSVNPODg1OV83LCBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihqcF8yLCBOT19TSElGVCB8IFVTRV9HMiB8IFVTRV9KSVNYMDIwOF9FWFQpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiBpc28yMDIyX2pwXzIwMDRfZGVzaWduYXRpb25zW10gPSB7Ci0JUkVHSVNUUllfSklTWDAyMTNfMjAwNF8xX1BBSVJPTkxZLCBSRUdJU1RSWV9KSVNYMDIwOCwKLQlSRUdJU1RSWV9KSVNYMDIxM18yMDA0XzEsIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDRfMiwgUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9KSVNYMDIxM18yMDA0XzFfUEFJUk9OTFksIFJFR0lTVFJZX0pJU1gwMjA4LAorICAgIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDRfMSwgUkVHSVNUUllfSklTWDAyMTNfMjAwNF8yLCBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihqcF8yMDA0LCBOT19TSElGVCB8IFVTRV9KSVNYMDIwOF9FWFQpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiBpc28yMDIyX2pwXzNfZGVzaWduYXRpb25zW10gPSB7Ci0JUkVHSVNUUllfSklTWDAyMTNfMjAwMF8xX1BBSVJPTkxZLCBSRUdJU1RSWV9KSVNYMDIwOCwKLQlSRUdJU1RSWV9KSVNYMDIxM18yMDAwXzEsIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDBfMiwgUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9KSVNYMDIxM18yMDAwXzFfUEFJUk9OTFksIFJFR0lTVFJZX0pJU1gwMjA4LAorICAgIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDBfMSwgUkVHSVNUUllfSklTWDAyMTNfMjAwMF8yLCBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihqcF8zLCBOT19TSElGVCB8IFVTRV9KSVNYMDIwOF9FWFQpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiBpc28yMDIyX2pwX2V4dF9kZXNpZ25hdGlvbnNbXSA9IHsKLQlSRUdJU1RSWV9KSVNYMDIwOCwgUkVHSVNUUllfSklTWDAyMTIsIFJFR0lTVFJZX0pJU1gwMjAxX1IsCi0JUkVHSVNUUllfSklTWDAyMDFfSywgUkVHSVNUUllfSklTWDAyMDhfTywgUkVHSVNUUllfU0VOVElORUwKKyAgICBSRUdJU1RSWV9KSVNYMDIwOCwgUkVHSVNUUllfSklTWDAyMTIsIFJFR0lTVFJZX0pJU1gwMjAxX1IsCisgICAgUkVHSVNUUllfSklTWDAyMDFfSywgUkVHSVNUUllfSklTWDAyMDhfTywgUkVHSVNUUllfU0VOVElORUwKIH07CiBDT05GSUdERUYoanBfZXh0LCBOT19TSElGVCB8IFVTRV9KSVNYMDIwOF9FWFQpCiAKQEAgLTExMTEsMTEgKzExMTEsMTEgQEAKICAgLyogbm8gbWFwcGluZyB0YWJsZSBoZXJlICovCiBFTkRfTUFQUElOR1NfTElTVAogCi0jZGVmaW5lIElTTzIwMjJfQ09ERUModmFyaWF0aW9uKSB7CQlcCi0JImlzbzIwMjJfIiAjdmFyaWF0aW9uLAkJCVwKLQkmaXNvMjAyMl8jI3ZhcmlhdGlvbiMjX2NvbmZpZywJCVwKLQlpc28yMDIyX2NvZGVjX2luaXQsCQkJXAotCV9TVEFURUZVTF9NRVRIT0RTKGlzbzIwMjIpCQlcCisjZGVmaW5lIElTTzIwMjJfQ09ERUModmFyaWF0aW9uKSB7ICAgICAgICAgICAgICBcCisgICAgImlzbzIwMjJfIiAjdmFyaWF0aW9uLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgJmlzbzIwMjJfIyN2YXJpYXRpb24jI19jb25maWcsICAgICAgICAgICAgICBcCisgICAgaXNvMjAyMl9jb2RlY19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1NUQVRFRlVMX01FVEhPRFMoaXNvMjAyMikgICAgICAgICAgICAgICAgICBcCiB9LAogCiBCRUdJTl9DT0RFQ1NfTElTVApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19qcC5jIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19qcC5jCmluZGV4IGY0OWExMGIuLjkwMWQzYmUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfanAuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2pwLmMKQEAgLTE5LDEyNCArMTksMTI0IEBACiAKIEVOQ09ERVIoY3A5MzIpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKLQkJdW5zaWduZWQgY2hhciBjMSwgYzI7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgUHlfVU5JQ09ERSBjID0gSU4xOworICAgICAgICBEQkNIQVIgY29kZTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjMSwgYzI7CiAKLQkJaWYgKGMgPD0gMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChjID49IDB4ZmY2MSAmJiBjIDw9IDB4ZmY5ZikgewotCQkJV1JJVEUxKGMgLSAweGZlYzApCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChjID49IDB4ZjhmMCAmJiBjIDw9IDB4ZjhmMykgewotCQkJLyogV2luZG93cyBjb21wYXRpYmlsaXR5ICovCi0JCQlSRVFVSVJFX09VVEJVRigxKQotCQkJaWYgKGMgPT0gMHhmOGYwKQotCQkJCU9VVDEoMHhhMCkKLQkJCWVsc2UKLQkJCQlPVVQxKGMgLSAweGZlZjEgKyAweGZkKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPD0gMHg4MCkgeworICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID49IDB4ZmY2MSAmJiBjIDw9IDB4ZmY5ZikgeworICAgICAgICAgICAgV1JJVEUxKGMgLSAweGZlYzApCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID49IDB4ZjhmMCAmJiBjIDw9IDB4ZjhmMykgeworICAgICAgICAgICAgLyogV2luZG93cyBjb21wYXRpYmlsaXR5ICovCisgICAgICAgICAgICBSRVFVSVJFX09VVEJVRigxKQorICAgICAgICAgICAgaWYgKGMgPT0gMHhmOGYwKQorICAgICAgICAgICAgICAgIE9VVDEoMHhhMCkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBPVVQxKGMgLSAweGZlZjEgKyAweGZkKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlVQ1M0SU5WQUxJRChjKQotCQlSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBVQ1M0SU5WQUxJRChjKQorICAgICAgICBSRVFVSVJFX09VVEJVRigyKQogCi0JCVRSWU1BUF9FTkMoY3A5MzJleHQsIGNvZGUsIGMpIHsKLQkJCU9VVDEoY29kZSA+PiA4KQotCQkJT1VUMihjb2RlICYgMHhmZikKLQkJfQotCQllbHNlIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZSwgYykgewotCQkJaWYgKGNvZGUgJiAweDgwMDApIC8qIE1TQiBzZXQ6IEpJUyBYIDAyMTIgKi8KLQkJCQlyZXR1cm4gMTsKKyAgICAgICAgVFJZTUFQX0VOQyhjcDkzMmV4dCwgY29kZSwgYykgeworICAgICAgICAgICAgT1VUMShjb2RlID4+IDgpCisgICAgICAgICAgICBPVVQyKGNvZGUgJiAweGZmKQorICAgICAgICB9CisgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKSB7CisgICAgICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkgLyogTVNCIHNldDogSklTIFggMDIxMiAqLworICAgICAgICAgICAgICAgIHJldHVybiAxOwogCi0JCQkvKiBKSVMgWCAwMjA4ICovCi0JCQljMSA9IGNvZGUgPj4gODsKLQkJCWMyID0gY29kZSAmIDB4ZmY7Ci0JCQljMiA9ICgoKGMxIC0gMHgyMSkgJiAxKSA/IDB4NWUgOiAwKSArIChjMiAtIDB4MjEpOwotCQkJYzEgPSAoYzEgLSAweDIxKSA+PiAxOwotCQkJT1VUMShjMSA8IDB4MWYgPyBjMSArIDB4ODEgOiBjMSArIDB4YzEpCi0JCQlPVVQyKGMyIDwgMHgzZiA/IGMyICsgMHg0MCA6IGMyICsgMHg0MSkKLQkJfQotCQllbHNlIGlmIChjID49IDB4ZTAwMCAmJiBjIDwgMHhlNzU4KSB7Ci0JCQkvKiBVc2VyLWRlZmluZWQgYXJlYSAqLwotCQkJYzEgPSAoUHlfVU5JQ09ERSkoYyAtIDB4ZTAwMCkgLyAxODg7Ci0JCQljMiA9IChQeV9VTklDT0RFKShjIC0gMHhlMDAwKSAlIDE4ODsKLQkJCU9VVDEoYzEgKyAweGYwKQotCQkJT1VUMihjMiA8IDB4M2YgPyBjMiArIDB4NDAgOiBjMiArIDB4NDEpCi0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDE7CisgICAgICAgICAgICAvKiBKSVMgWCAwMjA4ICovCisgICAgICAgICAgICBjMSA9IGNvZGUgPj4gODsKKyAgICAgICAgICAgIGMyID0gY29kZSAmIDB4ZmY7CisgICAgICAgICAgICBjMiA9ICgoKGMxIC0gMHgyMSkgJiAxKSA/IDB4NWUgOiAwKSArIChjMiAtIDB4MjEpOworICAgICAgICAgICAgYzEgPSAoYzEgLSAweDIxKSA+PiAxOworICAgICAgICAgICAgT1VUMShjMSA8IDB4MWYgPyBjMSArIDB4ODEgOiBjMSArIDB4YzEpCisgICAgICAgICAgICBPVVQyKGMyIDwgMHgzZiA/IGMyICsgMHg0MCA6IGMyICsgMHg0MSkKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID49IDB4ZTAwMCAmJiBjIDwgMHhlNzU4KSB7CisgICAgICAgICAgICAvKiBVc2VyLWRlZmluZWQgYXJlYSAqLworICAgICAgICAgICAgYzEgPSAoUHlfVU5JQ09ERSkoYyAtIDB4ZTAwMCkgLyAxODg7CisgICAgICAgICAgICBjMiA9IChQeV9VTklDT0RFKShjIC0gMHhlMDAwKSAlIDE4ODsKKyAgICAgICAgICAgIE9VVDEoYzEgKyAweGYwKQorICAgICAgICAgICAgT1VUMihjMiA8IDB4M2YgPyBjMiArIDB4NDAgOiBjMiArIDB4NDEpCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJTkVYVCgxLCAyKQotCX0KKyAgICAgICAgTkVYVCgxLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGNwOTMyKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMSwgYzI7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xLCBjMjsKIAotCQlSRVFVSVJFX09VVEJVRigxKQotCQlpZiAoYyA8PSAweDgwKSB7Ci0JCQlPVVQxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChjID49IDB4YTAgJiYgYyA8PSAweGRmKSB7Ci0JCQlpZiAoYyA9PSAweGEwKQotCQkJCU9VVDEoMHhmOGYwKSAvKiBoYWxmLXdpZHRoIGthdGFrYW5hICovCi0JCQllbHNlCi0JCQkJT1VUMSgweGZlYzAgKyBjKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KLQkJZWxzZSBpZiAoYyA+PSAweGZkLyogJiYgYyA8PSAweGZmKi8pIHsKLQkJCS8qIFdpbmRvd3MgY29tcGF0aWJpbGl0eSAqLwotCQkJT1VUMSgweGY4ZjEgLSAweGZkICsgYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIGlmIChjIDw9IDB4ODApIHsKKyAgICAgICAgICAgIE9VVDEoYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPj0gMHhhMCAmJiBjIDw9IDB4ZGYpIHsKKyAgICAgICAgICAgIGlmIChjID09IDB4YTApCisgICAgICAgICAgICAgICAgT1VUMSgweGY4ZjApIC8qIGhhbGYtd2lkdGgga2F0YWthbmEgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBPVVQxKDB4ZmVjMCArIGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID49IDB4ZmQvKiAmJiBjIDw9IDB4ZmYqLykgeworICAgICAgICAgICAgLyogV2luZG93cyBjb21wYXRpYmlsaXR5ICovCisgICAgICAgICAgICBPVVQxKDB4ZjhmMSAtIDB4ZmQgKyBjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCi0JCWMyID0gSU4yOworICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIGMyID0gSU4yOwogCi0JCVRSWU1BUF9ERUMoY3A5MzJleHQsICoqb3V0YnVmLCBjLCBjMik7Ci0JCWVsc2UgaWYgKChjID49IDB4ODEgJiYgYyA8PSAweDlmKSB8fCAoYyA+PSAweGUwICYmIGMgPD0gMHhlYSkpewotCQkJaWYgKGMyIDwgMHg0MCB8fCAoYzIgPiAweDdlICYmIGMyIDwgMHg4MCkgfHwgYzIgPiAweGZjKQotCQkJCXJldHVybiAyOworICAgICAgICBUUllNQVBfREVDKGNwOTMyZXh0LCAqKm91dGJ1ZiwgYywgYzIpOworICAgICAgICBlbHNlIGlmICgoYyA+PSAweDgxICYmIGMgPD0gMHg5ZikgfHwgKGMgPj0gMHhlMCAmJiBjIDw9IDB4ZWEpKXsKKyAgICAgICAgICAgIGlmIChjMiA8IDB4NDAgfHwgKGMyID4gMHg3ZSAmJiBjMiA8IDB4ODApIHx8IGMyID4gMHhmYykKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKIAotCQkJYyA9IChjIDwgMHhlMCA/IGMgLSAweDgxIDogYyAtIDB4YzEpOwotCQkJYzIgPSAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKTsKLQkJCWMgPSAoMiAqIGMgKyAoYzIgPCAweDVlID8gMCA6IDEpICsgMHgyMSk7Ci0JCQljMiA9IChjMiA8IDB4NWUgPyBjMiA6IGMyIC0gMHg1ZSkgKyAweDIxOworICAgICAgICAgICAgYyA9IChjIDwgMHhlMCA/IGMgLSAweDgxIDogYyAtIDB4YzEpOworICAgICAgICAgICAgYzIgPSAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKTsKKyAgICAgICAgICAgIGMgPSAoMiAqIGMgKyAoYzIgPCAweDVlID8gMCA6IDEpICsgMHgyMSk7CisgICAgICAgICAgICBjMiA9IChjMiA8IDB4NWUgPyBjMiA6IGMyIC0gMHg1ZSkgKyAweDIxOwogCi0JCQlUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwgYywgYzIpOwotCQkJZWxzZSByZXR1cm4gMjsKLQkJfQotCQllbHNlIGlmIChjID49IDB4ZjAgJiYgYyA8PSAweGY5KSB7Ci0JCQlpZiAoKGMyID49IDB4NDAgJiYgYzIgPD0gMHg3ZSkgfHwKLQkJCSAgICAoYzIgPj0gMHg4MCAmJiBjMiA8PSAweGZjKSkKLQkJCQlPVVQxKDB4ZTAwMCArIDE4OCAqIChjIC0gMHhmMCkgKwotCQkJCSAgICAgKGMyIDwgMHg4MCA/IGMyIC0gMHg0MCA6IGMyIC0gMHg0MSkpCi0JCQllbHNlCi0JCQkJcmV0dXJuIDI7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDI7CisgICAgICAgICAgICBUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwgYywgYzIpOworICAgICAgICAgICAgZWxzZSByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID49IDB4ZjAgJiYgYyA8PSAweGY5KSB7CisgICAgICAgICAgICBpZiAoKGMyID49IDB4NDAgJiYgYzIgPD0gMHg3ZSkgfHwKKyAgICAgICAgICAgICAgICAoYzIgPj0gMHg4MCAmJiBjMiA8PSAweGZjKSkKKyAgICAgICAgICAgICAgICBPVVQxKDB4ZTAwMCArIDE4OCAqIChjIC0gMHhmMCkgKworICAgICAgICAgICAgICAgICAgICAgKGMyIDwgMHg4MCA/IGMyIC0gMHg0MCA6IGMyIC0gMHg0MSkpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDI7CiAKLQkJTkVYVCgyLCAxKQotCX0KKyAgICAgICAgTkVYVCgyLCAxKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTE0NiwxNjYgKzE0NiwxNjYgQEAKIAogRU5DT0RFUihldWNfamlzXzIwMDQpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdWNzNF90IGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlOwotCQlQeV9zc2l6ZV90IGluc2l6ZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1Y3M0X3QgYyA9IElOMTsKKyAgICAgICAgREJDSEFSIGNvZGU7CisgICAgICAgIFB5X3NzaXplX3QgaW5zaXplOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlERUNPREVfU1VSUk9HQVRFKGMpCi0JCWluc2l6ZSA9IEdFVF9JTlNJWkUoYyk7CisgICAgICAgIERFQ09ERV9TVVJST0dBVEUoYykKKyAgICAgICAgaW5zaXplID0gR0VUX0lOU0laRShjKTsKIAotCQlpZiAoYyA8PSAweEZGRkYpIHsKLQkJCUVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfQk1QKGNvZGUsIGMpCi0JCQllbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfYm1wLCBjb2RlLCBjKSB7Ci0JCQkJaWYgKGNvZGUgPT0gTVVMVElDKSB7Ci0JCQkJCWlmIChpbmxlZnQgPCAyKSB7Ci0JCQkJCQlpZiAoZmxhZ3MgJiBNQkVOQ19GTFVTSCkgewotCQkJCQkJCWNvZGUgPSBmaW5kX3BhaXJlbmNtYXAoCi0JCQkJCQkJICAgICh1Y3MyX3QpYywgMCwKLQkJCQkJCQkgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAotCQkJCQkJCSAgICBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCQkJCQkJaWYgKGNvZGUgPT0gREJDSU5WKQotCQkJCQkJCQlyZXR1cm4gMTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gTUJFUlJfVE9PRkVXOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKLQkJCQkJCQkodWNzMl90KWMsICgqaW5idWYpWzFdLAotCQkJCQkJCWppc3gwMjEzX3BhaXJfZW5jbWFwLAotCQkJCQkJCUpJU1gwMjEzX0VOQ1BBSVJTKTsKLQkJCQkJCWlmIChjb2RlID09IERCQ0lOVikgewotCQkJCQkJCWNvZGUgPSBmaW5kX3BhaXJlbmNtYXAoCi0JCQkJCQkJICAgICh1Y3MyX3QpYywgMCwKLQkJCQkJCQkgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAotCQkJCQkJCSAgICBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCQkJCQkJaWYgKGNvZGUgPT0gREJDSU5WKQotCQkJCQkJCQlyZXR1cm4gMTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCWluc2l6ZSA9IDI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZSwgYyk7Ci0JCQllbHNlIGlmIChjID49IDB4ZmY2MSAmJiBjIDw9IDB4ZmY5ZikgewotCQkJCS8qIEpJUyBYIDAyMDEgaGFsZi13aWR0aCBrYXRha2FuYSAqLwotCQkJCVdSSVRFMigweDhlLCBjIC0gMHhmZWMwKQotCQkJCU5FWFQoMSwgMikKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGMgPT0gMHhmZjNjKQotCQkJCS8qIEYvVyBSRVZFUlNFIFNPTElEVVMgKHNlZSBOT1RFUykgKi8KLQkJCQljb2RlID0gMHgyMTQwOwotCQkJZWxzZSBpZiAoYyA9PSAweGZmNWUpCi0JCQkJLyogRi9XIFRJTERFIChzZWUgTk9URVMpICovCi0JCQkJY29kZSA9IDB4MjIzMjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJfQotCQllbHNlIGlmIChjID4+IDE2ID09IEVNUEJBU0UgPj4gMTYpIHsKLQkJCUVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfRU1QKGNvZGUsIGMpCi0JCQllbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfZW1wLCBjb2RlLCBjICYgMHhmZmZmKTsKLQkJCWVsc2UgcmV0dXJuIGluc2l6ZTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gaW5zaXplOworICAgICAgICBpZiAoYyA8PSAweEZGRkYpIHsKKyAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfQk1QKGNvZGUsIGMpCisgICAgICAgICAgICBlbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfYm1wLCBjb2RlLCBjKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gTVVMVElDKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmxlZnQgPCAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNQkVOQ19GTFVTSCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBmaW5kX3BhaXJlbmNtYXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y3MyX3QpYywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVNYMDIxM19FTkNQQUlSUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gREJDSU5WKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUJFUlJfVE9PRkVXOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNzMl90KWMsICgqaW5idWYpWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IERCQ0lOVikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBmaW5kX3BhaXJlbmNtYXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y3MyX3QpYywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVNYMDIxM19FTkNQQUlSUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gREJDSU5WKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2l6ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZSwgYyk7CisgICAgICAgICAgICBlbHNlIGlmIChjID49IDB4ZmY2MSAmJiBjIDw9IDB4ZmY5ZikgeworICAgICAgICAgICAgICAgIC8qIEpJUyBYIDAyMDEgaGFsZi13aWR0aCBrYXRha2FuYSAqLworICAgICAgICAgICAgICAgIFdSSVRFMigweDhlLCBjIC0gMHhmZWMwKQorICAgICAgICAgICAgICAgIE5FWFQoMSwgMikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gMHhmZjNjKQorICAgICAgICAgICAgICAgIC8qIEYvVyBSRVZFUlNFIFNPTElEVVMgKHNlZSBOT1RFUykgKi8KKyAgICAgICAgICAgICAgICBjb2RlID0gMHgyMTQwOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAweGZmNWUpCisgICAgICAgICAgICAgICAgLyogRi9XIFRJTERFIChzZWUgTk9URVMpICovCisgICAgICAgICAgICAgICAgY29kZSA9IDB4MjIzMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID4+IDE2ID09IEVNUEJBU0UgPj4gMTYpIHsKKyAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfRU1QKGNvZGUsIGMpCisgICAgICAgICAgICBlbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfZW1wLCBjb2RlLCBjICYgMHhmZmZmKTsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIGluc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gaW5zaXplOwogCi0JCWlmIChjb2RlICYgMHg4MDAwKSB7Ci0JCQkvKiBDb2Rlc2V0IDIgKi8KLQkJCVdSSVRFMygweDhmLCBjb2RlID4+IDgsIChjb2RlICYgMHhGRikgfCAweDgwKQotCQkJTkVYVChpbnNpemUsIDMpCi0JCX0gZWxzZSB7Ci0JCQkvKiBDb2Rlc2V0IDEgKi8KLQkJCVdSSVRFMigoY29kZSA+PiA4KSB8IDB4ODAsIChjb2RlICYgMHhGRikgfCAweDgwKQotCQkJTkVYVChpbnNpemUsIDIpCi0JCX0KLQl9CisgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKSB7CisgICAgICAgICAgICAvKiBDb2Rlc2V0IDIgKi8KKyAgICAgICAgICAgIFdSSVRFMygweDhmLCBjb2RlID4+IDgsIChjb2RlICYgMHhGRikgfCAweDgwKQorICAgICAgICAgICAgTkVYVChpbnNpemUsIDMpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDb2Rlc2V0IDEgKi8KKyAgICAgICAgICAgIFdSSVRFMigoY29kZSA+PiA4KSB8IDB4ODAsIChjb2RlICYgMHhGRikgfCAweDgwKQorICAgICAgICAgICAgTkVYVChpbnNpemUsIDIpCisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUihldWNfamlzXzIwMDQpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOwotCQl1Y3M0X3QgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgICAgIHVjczRfdCBjb2RlOwogCi0JCVJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlPVVQxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIE9VVDEoYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJaWYgKGMgPT0gMHg4ZSkgewotCQkJLyogSklTIFggMDIwMSBoYWxmLXdpZHRoIGthdGFrYW5hICovCi0JCQl1bnNpZ25lZCBjaGFyIGMyOworICAgICAgICBpZiAoYyA9PSAweDhlKSB7CisgICAgICAgICAgICAvKiBKSVMgWCAwMjAxIGhhbGYtd2lkdGgga2F0YWthbmEgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzI7CiAKLQkJCVJFUVVJUkVfSU5CVUYoMikKLQkJCWMyID0gSU4yOwotCQkJaWYgKGMyID49IDB4YTEgJiYgYzIgPD0gMHhkZikgewotCQkJCU9VVDEoMHhmZWMwICsgYzIpCi0JCQkJTkVYVCgyLCAxKQotCQkJfQotCQkJZWxzZQotCQkJCXJldHVybiAyOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gMHg4ZikgewotCQkJdW5zaWduZWQgY2hhciBjMiwgYzM7CisgICAgICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgICAgICBjMiA9IElOMjsKKyAgICAgICAgICAgIGlmIChjMiA+PSAweGExICYmIGMyIDw9IDB4ZGYpIHsKKyAgICAgICAgICAgICAgICBPVVQxKDB4ZmVjMCArIGMyKQorICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09IDB4OGYpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzIsIGMzOwogCi0JCQlSRVFVSVJFX0lOQlVGKDMpCi0JCQljMiA9IElOMiBeIDB4ODA7Ci0JCQljMyA9IElOMyBeIDB4ODA7CisgICAgICAgICAgICBSRVFVSVJFX0lOQlVGKDMpCisgICAgICAgICAgICBjMiA9IElOMiBeIDB4ODA7CisgICAgICAgICAgICBjMyA9IElOMyBeIDB4ODA7CiAKLQkJCS8qIEpJUyBYIDAyMTMgUGxhbmUgMiBvciBKSVMgWCAwMjEyIChzZWUgTk9URVMpICovCi0JCQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMigqKm91dGJ1ZiwgYzIsIGMzKQotCQkJZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfYm1wLCAqKm91dGJ1ZiwgYzIsIGMzKSA7Ci0JCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9lbXAsIGNvZGUsIGMyLCBjMykgewotCQkJCVdSSVRFVUNTNChFTVBCQVNFIHwgY29kZSkKLQkJCQlORVhUX0lOKDMpCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTIsICoqb3V0YnVmLCBjMiwgYzMpIDsKLQkJCWVsc2UgcmV0dXJuIDM7Ci0JCQlORVhUKDMsIDEpCi0JCX0KLQkJZWxzZSB7Ci0JCQl1bnNpZ25lZCBjaGFyIGMyOworICAgICAgICAgICAgLyogSklTIFggMDIxMyBQbGFuZSAyIG9yIEpJUyBYIDAyMTIgKHNlZSBOT1RFUykgKi8KKyAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUyKCoqb3V0YnVmLCBjMiwgYzMpCisgICAgICAgICAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9ibXAsICoqb3V0YnVmLCBjMiwgYzMpIDsKKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2VtcCwgY29kZSwgYzIsIGMzKSB7CisgICAgICAgICAgICAgICAgV1JJVEVVQ1M0KEVNUEJBU0UgfCBjb2RlKQorICAgICAgICAgICAgICAgIE5FWFRfSU4oMykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxMiwgKipvdXRidWYsIGMyLCBjMykgOworICAgICAgICAgICAgZWxzZSByZXR1cm4gMzsKKyAgICAgICAgICAgIE5FWFQoMywgMSkKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzI7CiAKLQkJCVJFUVVJUkVfSU5CVUYoMikKLQkJCWMgXj0gMHg4MDsKLQkJCWMyID0gSU4yIF4gMHg4MDsKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGMgXj0gMHg4MDsKKyAgICAgICAgICAgIGMyID0gSU4yIF4gMHg4MDsKIAotCQkJLyogSklTIFggMDIxMyBQbGFuZSAxICovCi0JCQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMSgqKm91dGJ1ZiwgYywgYzIpCi0JCQllbHNlIGlmIChjID09IDB4MjEgJiYgYzIgPT0gMHg0MCkgKipvdXRidWYgPSAweGZmM2M7Ci0JCQllbHNlIGlmIChjID09IDB4MjIgJiYgYzIgPT0gMHgzMikgKipvdXRidWYgPSAweGZmNWU7Ci0JCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMDgsICoqb3V0YnVmLCBjLCBjMik7Ci0JCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9ibXAsICoqb3V0YnVmLCBjLCBjMik7Ci0JCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9lbXAsIGNvZGUsIGMsIGMyKSB7Ci0JCQkJV1JJVEVVQ1M0KEVNUEJBU0UgfCBjb2RlKQotCQkJCU5FWFRfSU4oMikKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM19wYWlyLCBjb2RlLCBjLCBjMikgewotCQkJCVdSSVRFMihjb2RlID4+IDE2LCBjb2RlICYgMHhmZmZmKQotCQkJCU5FWFQoMiwgMikKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgcmV0dXJuIDI7Ci0JCQlORVhUKDIsIDEpCi0JCX0KLQl9CisgICAgICAgICAgICAvKiBKSVMgWCAwMjEzIFBsYW5lIDEgKi8KKyAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKCoqb3V0YnVmLCBjLCBjMikKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gMHgyMSAmJiBjMiA9PSAweDQwKSAqKm91dGJ1ZiA9IDB4ZmYzYzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gMHgyMiAmJiBjMiA9PSAweDMyKSAqKm91dGJ1ZiA9IDB4ZmY1ZTsKKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgKipvdXRidWYsIGMsIGMyKTsKKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2JtcCwgKipvdXRidWYsIGMsIGMyKTsKKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2VtcCwgY29kZSwgYywgYzIpIHsKKyAgICAgICAgICAgICAgICBXUklURVVDUzQoRU1QQkFTRSB8IGNvZGUpCisgICAgICAgICAgICAgICAgTkVYVF9JTigyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzX3BhaXIsIGNvZGUsIGMsIGMyKSB7CisgICAgICAgICAgICAgICAgV1JJVEUyKGNvZGUgPj4gMTYsIGNvZGUgJiAweGZmZmYpCisgICAgICAgICAgICAgICAgTkVYVCgyLCAyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSByZXR1cm4gMjsKKyAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTMxNSwxMTQgKzMxNSwxMTQgQEAKIAogRU5DT0RFUihldWNfanApCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBVQ1M0SU5WQUxJRChjKQogCi0JCVRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZSwgYyk7Ci0JCWVsc2UgaWYgKGMgPj0gMHhmZjYxICYmIGMgPD0gMHhmZjlmKSB7Ci0JCQkvKiBKSVMgWCAwMjAxIGhhbGYtd2lkdGgga2F0YWthbmEgKi8KLQkJCVdSSVRFMigweDhlLCBjIC0gMHhmZWMwKQotCQkJTkVYVCgxLCAyKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKTsKKyAgICAgICAgZWxzZSBpZiAoYyA+PSAweGZmNjEgJiYgYyA8PSAweGZmOWYpIHsKKyAgICAgICAgICAgIC8qIEpJUyBYIDAyMDEgaGFsZi13aWR0aCBrYXRha2FuYSAqLworICAgICAgICAgICAgV1JJVEUyKDB4OGUsIGMgLSAweGZlYzApCisgICAgICAgICAgICBORVhUKDEsIDIpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogI2lmbmRlZiBTVFJJQ1RfQlVJTEQKLQkJZWxzZSBpZiAoYyA9PSAweGZmM2MpIC8qIEZVTEwtV0lEVEggUkVWRVJTRSBTT0xJRFVTICovCi0JCQljb2RlID0gMHgyMTQwOwotCQllbHNlIGlmIChjID09IDB4YTUpIHsgLyogWUVOIFNJR04gKi8KLQkJCVdSSVRFMSgweDVjKTsKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKGMgPT0gMHgyMDNlKSB7IC8qIE9WRVJMSU5FICovCi0JCQlXUklURTEoMHg3ZSk7Ci0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBlbHNlIGlmIChjID09IDB4ZmYzYykgLyogRlVMTC1XSURUSCBSRVZFUlNFIFNPTElEVVMgKi8KKyAgICAgICAgICAgIGNvZGUgPSAweDIxNDA7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gMHhhNSkgeyAvKiBZRU4gU0lHTiAqLworICAgICAgICAgICAgV1JJVEUxKDB4NWMpOworICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAweDIwM2UpIHsgLyogT1ZFUkxJTkUgKi8KKyAgICAgICAgICAgIFdSSVRFMSgweDdlKTsKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAjZW5kaWYKLQkJZWxzZQotCQkJcmV0dXJuIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCWlmIChjb2RlICYgMHg4MDAwKSB7Ci0JCQkvKiBKSVMgWCAwMjEyICovCi0JCQlXUklURTMoMHg4ZiwgY29kZSA+PiA4LCAoY29kZSAmIDB4RkYpIHwgMHg4MCkKLQkJCU5FWFQoMSwgMykKLQkJfSBlbHNlIHsKLQkJCS8qIEpJUyBYIDAyMDggKi8KLQkJCVdSSVRFMigoY29kZSA+PiA4KSB8IDB4ODAsIChjb2RlICYgMHhGRikgfCAweDgwKQotCQkJTkVYVCgxLCAyKQotCQl9Ci0JfQorICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkgeworICAgICAgICAgICAgLyogSklTIFggMDIxMiAqLworICAgICAgICAgICAgV1JJVEUzKDB4OGYsIGNvZGUgPj4gOCwgKGNvZGUgJiAweEZGKSB8IDB4ODApCisgICAgICAgICAgICBORVhUKDEsIDMpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBKSVMgWCAwMjA4ICovCisgICAgICAgICAgICBXUklURTIoKGNvZGUgPj4gOCkgfCAweDgwLCAoY29kZSAmIDB4RkYpIHwgMHg4MCkKKyAgICAgICAgICAgIE5FWFQoMSwgMikKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGV1Y19qcCkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xOwogCi0JCVJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCiAKLQkJCWlmIChjIDwgMHg4MCkgewotCQkJCU9VVDEoYykKLQkJCQlORVhUKDEsIDEpCi0JCQkJY29udGludWU7Ci0JCQl9CisgICAgICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgICAgICBPVVQxKGMpCisgICAgICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogCi0JCWlmIChjID09IDB4OGUpIHsKLQkJCS8qIEpJUyBYIDAyMDEgaGFsZi13aWR0aCBrYXRha2FuYSAqLwotCQkJdW5zaWduZWQgY2hhciBjMjsKKyAgICAgICAgaWYgKGMgPT0gMHg4ZSkgeworICAgICAgICAgICAgLyogSklTIFggMDIwMSBoYWxmLXdpZHRoIGthdGFrYW5hICovCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMyOwogCi0JCQlSRVFVSVJFX0lOQlVGKDIpCi0JCQljMiA9IElOMjsKLQkJCWlmIChjMiA+PSAweGExICYmIGMyIDw9IDB4ZGYpIHsKLQkJCQlPVVQxKDB4ZmVjMCArIGMyKQotCQkJCU5FWFQoMiwgMSkKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gMjsKLQkJfQotCQllbHNlIGlmIChjID09IDB4OGYpIHsKLQkJCXVuc2lnbmVkIGNoYXIgYzIsIGMzOworICAgICAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICAgICAgYzIgPSBJTjI7CisgICAgICAgICAgICBpZiAoYzIgPj0gMHhhMSAmJiBjMiA8PSAweGRmKSB7CisgICAgICAgICAgICAgICAgT1VUMSgweGZlYzAgKyBjMikKKyAgICAgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA9PSAweDhmKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMyLCBjMzsKIAotCQkJUkVRVUlSRV9JTkJVRigzKQotCQkJYzIgPSBJTjI7Ci0JCQljMyA9IElOMzsKLQkJCS8qIEpJUyBYIDAyMTIgKi8KLQkJCVRSWU1BUF9ERUMoamlzeDAyMTIsICoqb3V0YnVmLCBjMiBeIDB4ODAsIGMzIF4gMHg4MCkgewotCQkJCU5FWFQoMywgMSkKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gMzsKLQkJfQotCQllbHNlIHsKLQkJCXVuc2lnbmVkIGNoYXIgYzI7CisgICAgICAgICAgICBSRVFVSVJFX0lOQlVGKDMpCisgICAgICAgICAgICBjMiA9IElOMjsKKyAgICAgICAgICAgIGMzID0gSU4zOworICAgICAgICAgICAgLyogSklTIFggMDIxMiAqLworICAgICAgICAgICAgVFJZTUFQX0RFQyhqaXN4MDIxMiwgKipvdXRidWYsIGMyIF4gMHg4MCwgYzMgXiAweDgwKSB7CisgICAgICAgICAgICAgICAgTkVYVCgzLCAxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjMjsKIAotCQkJUkVRVUlSRV9JTkJVRigyKQotCQkJYzIgPSBJTjI7Ci0JCQkvKiBKSVMgWCAwMjA4ICovCisgICAgICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgICAgICBjMiA9IElOMjsKKyAgICAgICAgICAgIC8qIEpJUyBYIDAyMDggKi8KICNpZm5kZWYgU1RSSUNUX0JVSUxECi0JCQlpZiAoYyA9PSAweGExICYmIGMyID09IDB4YzApCi0JCQkJLyogRlVMTC1XSURUSCBSRVZFUlNFIFNPTElEVVMgKi8KLQkJCQkqKm91dGJ1ZiA9IDB4ZmYzYzsKLQkJCWVsc2UKKyAgICAgICAgICAgIGlmIChjID09IDB4YTEgJiYgYzIgPT0gMHhjMCkKKyAgICAgICAgICAgICAgICAvKiBGVUxMLVdJRFRIIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICAgICAgICAgICoqb3V0YnVmID0gMHhmZjNjOworICAgICAgICAgICAgZWxzZQogI2VuZGlmCi0JCQkJVFJZTUFQX0RFQyhqaXN4MDIwOCwgKipvdXRidWYsCi0JCQkJCSAgIGMgXiAweDgwLCBjMiBeIDB4ODApIDsKLQkJCWVsc2UgcmV0dXJuIDI7Ci0JCQlORVhUKDIsIDEpCi0JCX0KLQl9CisgICAgICAgICAgICAgICAgVFJZTUFQX0RFQyhqaXN4MDIwOCwgKipvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjIF4gMHg4MCwgYzIgXiAweDgwKSA7CisgICAgICAgICAgICBlbHNlIHJldHVybiAyOworICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtNDMyLDEwNSArNDMyLDEwNSBAQAogCiBFTkNPREVSKHNoaWZ0X2ppcykKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQlQeV9VTklDT0RFIGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlOwotCQl1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOworICAgICAgICB1bnNpZ25lZCBjaGFyIGMxLCBjMjsKIAogI2lmZGVmIFNUUklDVF9CVUlMRAotCQlKSVNYMDIwMV9SX0VOQ09ERShjLCBjb2RlKQorICAgICAgICBKSVNYMDIwMV9SX0VOQ09ERShjLCBjb2RlKQogI2Vsc2UKLQkJaWYgKGMgPCAweDgwKSBjb2RlID0gYzsKLQkJZWxzZSBpZiAoYyA9PSAweDAwYTUpIGNvZGUgPSAweDVjOyAvKiBZRU4gU0lHTiAqLwotCQllbHNlIGlmIChjID09IDB4MjAzZSkgY29kZSA9IDB4N2U7IC8qIE9WRVJMSU5FICovCisgICAgICAgIGlmIChjIDwgMHg4MCkgY29kZSA9IGM7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gMHgwMGE1KSBjb2RlID0gMHg1YzsgLyogWUVOIFNJR04gKi8KKyAgICAgICAgZWxzZSBpZiAoYyA9PSAweDIwM2UpIGNvZGUgPSAweDdlOyAvKiBPVkVSTElORSAqLwogI2VuZGlmCi0JCWVsc2UgSklTWDAyMDFfS19FTkNPREUoYywgY29kZSkKLQkJZWxzZSBVQ1M0SU5WQUxJRChjKQotCQllbHNlIGNvZGUgPSBOT0NIQVI7CisgICAgICAgIGVsc2UgSklTWDAyMDFfS19FTkNPREUoYywgY29kZSkKKyAgICAgICAgZWxzZSBVQ1M0SU5WQUxJRChjKQorICAgICAgICBlbHNlIGNvZGUgPSBOT0NIQVI7CiAKLQkJaWYgKGNvZGUgPCAweDgwIHx8IChjb2RlID49IDB4YTEgJiYgY29kZSA8PSAweGRmKSkgewotCQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgaWYgKGNvZGUgPCAweDgwIHx8IChjb2RlID49IDB4YTEgJiYgY29kZSA8PSAweGRmKSkgeworICAgICAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQkJT1VUMSgodW5zaWduZWQgY2hhciljb2RlKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgICAgIE9VVDEoKHVuc2lnbmVkIGNoYXIpY29kZSkKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKIAotCQlpZiAoY29kZSA9PSBOT0NIQVIpIHsKLQkJCVRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZSwgYyk7CisgICAgICAgIGlmIChjb2RlID09IE5PQ0hBUikgeworICAgICAgICAgICAgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKTsKICNpZm5kZWYgU1RSSUNUX0JVSUxECi0JCQllbHNlIGlmIChjID09IDB4ZmYzYykKLQkJCQljb2RlID0gMHgyMTQwOyAvKiBGVUxMLVdJRFRIIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAweGZmM2MpCisgICAgICAgICAgICAgICAgY29kZSA9IDB4MjE0MDsgLyogRlVMTC1XSURUSCBSRVZFUlNFIFNPTElEVVMgKi8KICNlbmRpZgotCQkJZWxzZQotCQkJCXJldHVybiAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAxOwogCi0JCQlpZiAoY29kZSAmIDB4ODAwMCkgLyogTVNCIHNldDogSklTIFggMDIxMiAqLwotCQkJCXJldHVybiAxOwotCQl9CisgICAgICAgICAgICBpZiAoY29kZSAmIDB4ODAwMCkgLyogTVNCIHNldDogSklTIFggMDIxMiAqLworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAKLQkJYzEgPSBjb2RlID4+IDg7Ci0JCWMyID0gY29kZSAmIDB4ZmY7Ci0JCWMyID0gKCgoYzEgLSAweDIxKSAmIDEpID8gMHg1ZSA6IDApICsgKGMyIC0gMHgyMSk7Ci0JCWMxID0gKGMxIC0gMHgyMSkgPj4gMTsKLQkJT1VUMShjMSA8IDB4MWYgPyBjMSArIDB4ODEgOiBjMSArIDB4YzEpCi0JCU9VVDIoYzIgPCAweDNmID8gYzIgKyAweDQwIDogYzIgKyAweDQxKQotCQlORVhUKDEsIDIpCi0JfQorICAgICAgICBjMSA9IGNvZGUgPj4gODsKKyAgICAgICAgYzIgPSBjb2RlICYgMHhmZjsKKyAgICAgICAgYzIgPSAoKChjMSAtIDB4MjEpICYgMSkgPyAweDVlIDogMCkgKyAoYzIgLSAweDIxKTsKKyAgICAgICAgYzEgPSAoYzEgLSAweDIxKSA+PiAxOworICAgICAgICBPVVQxKGMxIDwgMHgxZiA/IGMxICsgMHg4MSA6IGMxICsgMHhjMSkKKyAgICAgICAgT1VUMihjMiA8IDB4M2YgPyBjMiArIDB4NDAgOiBjMiArIDB4NDEpCisgICAgICAgIE5FWFQoMSwgMikKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUihzaGlmdF9qaXMpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKIAotCQlSRVFVSVJFX09VVEJVRigxKQorICAgICAgICBSRVFVSVJFX09VVEJVRigxKQogCiAjaWZkZWYgU1RSSUNUX0JVSUxECi0JCUpJU1gwMjAxX1JfREVDT0RFKGMsICoqb3V0YnVmKQorICAgICAgICBKSVNYMDIwMV9SX0RFQ09ERShjLCAqKm91dGJ1ZikKICNlbHNlCi0JCWlmIChjIDwgMHg4MCkgKipvdXRidWYgPSBjOworICAgICAgICBpZiAoYyA8IDB4ODApICoqb3V0YnVmID0gYzsKICNlbmRpZgotCQllbHNlIEpJU1gwMjAxX0tfREVDT0RFKGMsICoqb3V0YnVmKQotCQllbHNlIGlmICgoYyA+PSAweDgxICYmIGMgPD0gMHg5ZikgfHwgKGMgPj0gMHhlMCAmJiBjIDw9IDB4ZWEpKXsKLQkJCXVuc2lnbmVkIGNoYXIgYzEsIGMyOworICAgICAgICBlbHNlIEpJU1gwMjAxX0tfREVDT0RFKGMsICoqb3V0YnVmKQorICAgICAgICBlbHNlIGlmICgoYyA+PSAweDgxICYmIGMgPD0gMHg5ZikgfHwgKGMgPj0gMHhlMCAmJiBjIDw9IDB4ZWEpKXsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzEsIGMyOwogCi0JCQlSRVFVSVJFX0lOQlVGKDIpCi0JCQljMiA9IElOMjsKLQkJCWlmIChjMiA8IDB4NDAgfHwgKGMyID4gMHg3ZSAmJiBjMiA8IDB4ODApIHx8IGMyID4gMHhmYykKLQkJCQlyZXR1cm4gMjsKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGMyID0gSU4yOworICAgICAgICAgICAgaWYgKGMyIDwgMHg0MCB8fCAoYzIgPiAweDdlICYmIGMyIDwgMHg4MCkgfHwgYzIgPiAweGZjKQorICAgICAgICAgICAgICAgIHJldHVybiAyOwogCi0JCQljMSA9IChjIDwgMHhlMCA/IGMgLSAweDgxIDogYyAtIDB4YzEpOwotCQkJYzIgPSAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKTsKLQkJCWMxID0gKDIgKiBjMSArIChjMiA8IDB4NWUgPyAwIDogMSkgKyAweDIxKTsKLQkJCWMyID0gKGMyIDwgMHg1ZSA/IGMyIDogYzIgLSAweDVlKSArIDB4MjE7CisgICAgICAgICAgICBjMSA9IChjIDwgMHhlMCA/IGMgLSAweDgxIDogYyAtIDB4YzEpOworICAgICAgICAgICAgYzIgPSAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKTsKKyAgICAgICAgICAgIGMxID0gKDIgKiBjMSArIChjMiA8IDB4NWUgPyAwIDogMSkgKyAweDIxKTsKKyAgICAgICAgICAgIGMyID0gKGMyIDwgMHg1ZSA/IGMyIDogYzIgLSAweDVlKSArIDB4MjE7CiAKICNpZm5kZWYgU1RSSUNUX0JVSUxECi0JCQlpZiAoYzEgPT0gMHgyMSAmJiBjMiA9PSAweDQwKSB7Ci0JCQkJLyogRlVMTC1XSURUSCBSRVZFUlNFIFNPTElEVVMgKi8KLQkJCQlPVVQxKDB4ZmYzYykKLQkJCQlORVhUKDIsIDEpCi0JCQkJY29udGludWU7Ci0JCQl9CisgICAgICAgICAgICBpZiAoYzEgPT0gMHgyMSAmJiBjMiA9PSAweDQwKSB7CisgICAgICAgICAgICAgICAgLyogRlVMTC1XSURUSCBSRVZFUlNFIFNPTElEVVMgKi8KKyAgICAgICAgICAgICAgICBPVVQxKDB4ZmYzYykKKyAgICAgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCVRSWU1BUF9ERUMoamlzeDAyMDgsICoqb3V0YnVmLCBjMSwgYzIpIHsKLQkJCQlORVhUKDIsIDEpCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDI7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDI7CisgICAgICAgICAgICBUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwgYzEsIGMyKSB7CisgICAgICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAyOwogCi0JCU5FWFQoMSwgMSkgLyogSklTIFggMDIwMSAqLwotCX0KKyAgICAgICAgTkVYVCgxLCAxKSAvKiBKSVMgWCAwMjAxICovCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtNTQwLDE2NyArNTQwLDE2NyBAQAogCiBFTkNPREVSKHNoaWZ0X2ppc18yMDA0KQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVjczRfdCBjID0gSU4xOwotCQlEQkNIQVIgY29kZSA9IE5PQ0hBUjsKLQkJaW50IGMxLCBjMjsKLQkJUHlfc3NpemVfdCBpbnNpemU7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdWNzNF90IGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlID0gTk9DSEFSOworICAgICAgICBpbnQgYzEsIGMyOworICAgICAgICBQeV9zc2l6ZV90IGluc2l6ZTsKIAotCQlKSVNYMDIwMV9FTkNPREUoYywgY29kZSkKLQkJZWxzZSBERUNPREVfU1VSUk9HQVRFKGMpCisgICAgICAgIEpJU1gwMjAxX0VOQ09ERShjLCBjb2RlKQorICAgICAgICBlbHNlIERFQ09ERV9TVVJST0dBVEUoYykKIAotCQlpZiAoY29kZSA8IDB4ODAgfHwgKGNvZGUgPj0gMHhhMSAmJiBjb2RlIDw9IDB4ZGYpKSB7Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpY29kZSkKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjb2RlIDwgMHg4MCB8fCAoY29kZSA+PSAweGExICYmIGNvZGUgPD0gMHhkZikpIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljb2RlKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX09VVEJVRigyKQotCQlpbnNpemUgPSBHRVRfSU5TSVpFKGMpOworICAgICAgICBSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBpbnNpemUgPSBHRVRfSU5TSVpFKGMpOwogCi0JCWlmIChjb2RlID09IE5PQ0hBUikgewotCQkJaWYgKGMgPD0gMHhmZmZmKSB7Ci0JCQkJRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9CTVAoY29kZSwgYykKLQkJCQllbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfYm1wLCBjb2RlLCBjKSB7Ci0JCQkJCWlmIChjb2RlID09IE1VTFRJQykgewotCQkJCQkJaWYgKGlubGVmdCA8IDIpIHsKLQkJCQkJCSAgICBpZiAoZmxhZ3MgJiBNQkVOQ19GTFVTSCkgewotCQkJCQkJCWNvZGUgPSBmaW5kX3BhaXJlbmNtYXAKLQkJCQkJCQkgICAgKCh1Y3MyX3QpYywgMCwKLQkJCQkJCQkgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAotCQkJCQkJCSAgICBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCQkJCQkJaWYgKGNvZGUgPT0gREJDSU5WKQotCQkJCQkJCSAgICByZXR1cm4gMTsKLQkJCQkJCSAgICB9Ci0JCQkJCQkgICAgZWxzZQotCQkJCQkJCSAgICByZXR1cm4gTUJFUlJfVE9PRkVXOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkgICAgY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKLQkJCQkJCQkgICAgKHVjczJfdCljLCBJTjIsCi0JCQkJCQkJICBqaXN4MDIxM19wYWlyX2VuY21hcCwKLQkJCQkJCQkgICAgSklTWDAyMTNfRU5DUEFJUlMpOwotCQkJCQkJICAgIGlmIChjb2RlID09IERCQ0lOVikgewotCQkJCQkJCWNvZGUgPSBmaW5kX3BhaXJlbmNtYXAoCi0JCQkJCQkJICAgICh1Y3MyX3QpYywgMCwKLQkJCQkJCQkgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAotCQkJCQkJCSAgICBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCQkJCQkJaWYgKGNvZGUgPT0gREJDSU5WKQotCQkJCQkJCSAgICByZXR1cm4gMTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCSAgICBpbnNpemUgPSAyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKSB7Ci0JCQkJCS8qIGFiYW5kb24gSklTIFggMDIxMiBjb2RlcyAqLwotCQkJCQlpZiAoY29kZSAmIDB4ODAwMCkKLQkJCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQllbHNlIHJldHVybiAxOwotCQkJfQotCQkJZWxzZSBpZiAoYyA+PiAxNiA9PSBFTVBCQVNFID4+IDE2KSB7Ci0JCQkJRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9FTVAoY29kZSwgYykKLQkJCQllbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfZW1wLCBjb2RlLCBjJjB4ZmZmZik7Ci0JCQkJZWxzZSByZXR1cm4gaW5zaXplOwotCQkJfQotCQkJZWxzZQotCQkJCXJldHVybiBpbnNpemU7Ci0JCX0KKyAgICAgICAgaWYgKGNvZGUgPT0gTk9DSEFSKSB7CisgICAgICAgICAgICBpZiAoYyA8PSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0JNUChjb2RlLCBjKQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19ibXAsIGNvZGUsIGMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gTVVMVElDKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5sZWZ0IDwgMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIE1CRU5DX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGZpbmRfcGFpcmVuY21hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVjczJfdCljLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBEQkNJTlYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNQkVSUl9UT09GRVc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gZmluZF9wYWlyZW5jbWFwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNzMl90KWMsIElOMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVNYMDIxM19FTkNQQUlSUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gREJDSU5WKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjczJfdCljLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBEQkNJTlYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2l6ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGUsIGMpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYWJhbmRvbiBKSVMgWCAwMjEyIGNvZGVzICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID4+IDE2ID09IEVNUEJBU0UgPj4gMTYpIHsKKyAgICAgICAgICAgICAgICBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0VNUChjb2RlLCBjKQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19lbXAsIGNvZGUsIGMmMHhmZmZmKTsKKyAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBpbnNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGluc2l6ZTsKKyAgICAgICAgfQogCi0JCWMxID0gY29kZSA+PiA4OwotCQljMiA9IChjb2RlICYgMHhmZikgLSAweDIxOworICAgICAgICBjMSA9IGNvZGUgPj4gODsKKyAgICAgICAgYzIgPSAoY29kZSAmIDB4ZmYpIC0gMHgyMTsKIAotCQlpZiAoYzEgJiAweDgwKSB7IC8qIFBsYW5lIDIgKi8KLQkJCWlmIChjMSA+PSAweGVlKSBjMSAtPSAweDg3OwotCQkJZWxzZSBpZiAoYzEgPj0gMHhhYyB8fCBjMSA9PSAweGE4KSBjMSAtPSAweDQ5OwotCQkJZWxzZSBjMSAtPSAweDQzOwotCQl9Ci0JCWVsc2UgLyogUGxhbmUgMSAqLwotCQkJYzEgLT0gMHgyMTsKKyAgICAgICAgaWYgKGMxICYgMHg4MCkgeyAvKiBQbGFuZSAyICovCisgICAgICAgICAgICBpZiAoYzEgPj0gMHhlZSkgYzEgLT0gMHg4NzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMxID49IDB4YWMgfHwgYzEgPT0gMHhhOCkgYzEgLT0gMHg0OTsKKyAgICAgICAgICAgIGVsc2UgYzEgLT0gMHg0MzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIFBsYW5lIDEgKi8KKyAgICAgICAgICAgIGMxIC09IDB4MjE7CiAKLQkJaWYgKGMxICYgMSkgYzIgKz0gMHg1ZTsKLQkJYzEgPj49IDE7Ci0JCU9VVDEoYzEgKyAoYzEgPCAweDFmID8gMHg4MSA6IDB4YzEpKQotCQlPVVQyKGMyICsgKGMyIDwgMHgzZiA/IDB4NDAgOiAweDQxKSkKKyAgICAgICAgaWYgKGMxICYgMSkgYzIgKz0gMHg1ZTsKKyAgICAgICAgYzEgPj49IDE7CisgICAgICAgIE9VVDEoYzEgKyAoYzEgPCAweDFmID8gMHg4MSA6IDB4YzEpKQorICAgICAgICBPVVQyKGMyICsgKGMyIDwgMHgzZiA/IDB4NDAgOiAweDQxKSkKIAotCQlORVhUKGluc2l6ZSwgMikKLQl9CisgICAgICAgIE5FWFQoaW5zaXplLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKHNoaWZ0X2ppc18yMDA0KQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKLQkJSklTWDAyMDFfREVDT0RFKGMsICoqb3V0YnVmKQotCQllbHNlIGlmICgoYyA+PSAweDgxICYmIGMgPD0gMHg5ZikgfHwgKGMgPj0gMHhlMCAmJiBjIDw9IDB4ZmMpKXsKLQkJCXVuc2lnbmVkIGNoYXIgYzEsIGMyOwotCQkJdWNzNF90IGNvZGU7CisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIEpJU1gwMjAxX0RFQ09ERShjLCAqKm91dGJ1ZikKKyAgICAgICAgZWxzZSBpZiAoKGMgPj0gMHg4MSAmJiBjIDw9IDB4OWYpIHx8IChjID49IDB4ZTAgJiYgYyA8PSAweGZjKSl7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKyAgICAgICAgICAgIHVjczRfdCBjb2RlOwogCi0JCQlSRVFVSVJFX0lOQlVGKDIpCi0JCQljMiA9IElOMjsKLQkJCWlmIChjMiA8IDB4NDAgfHwgKGMyID4gMHg3ZSAmJiBjMiA8IDB4ODApIHx8IGMyID4gMHhmYykKLQkJCQlyZXR1cm4gMjsKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGMyID0gSU4yOworICAgICAgICAgICAgaWYgKGMyIDwgMHg0MCB8fCAoYzIgPiAweDdlICYmIGMyIDwgMHg4MCkgfHwgYzIgPiAweGZjKQorICAgICAgICAgICAgICAgIHJldHVybiAyOwogCi0JCQljMSA9IChjIDwgMHhlMCA/IGMgLSAweDgxIDogYyAtIDB4YzEpOwotCQkJYzIgPSAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKTsKLQkJCWMxID0gKDIgKiBjMSArIChjMiA8IDB4NWUgPyAwIDogMSkpOwotCQkJYzIgPSAoYzIgPCAweDVlID8gYzIgOiBjMiAtIDB4NWUpICsgMHgyMTsKKyAgICAgICAgICAgIGMxID0gKGMgPCAweGUwID8gYyAtIDB4ODEgOiBjIC0gMHhjMSk7CisgICAgICAgICAgICBjMiA9IChjMiA8IDB4ODAgPyBjMiAtIDB4NDAgOiBjMiAtIDB4NDEpOworICAgICAgICAgICAgYzEgPSAoMiAqIGMxICsgKGMyIDwgMHg1ZSA/IDAgOiAxKSk7CisgICAgICAgICAgICBjMiA9IChjMiA8IDB4NWUgPyBjMiA6IGMyIC0gMHg1ZSkgKyAweDIxOwogCi0JCQlpZiAoYzEgPCAweDVlKSB7IC8qIFBsYW5lIDEgKi8KLQkJCQljMSArPSAweDIxOwotCQkJCUVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKCoqb3V0YnVmLAotCQkJCQkJYzEsIGMyKQotCQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgKipvdXRidWYsIGMxLCBjMikgewotCQkJCQlORVhUX09VVCgxKQotCQkJCX0KLQkJCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9ibXAsICoqb3V0YnVmLAotCQkJCQkJYzEsIGMyKSB7Ci0JCQkJCU5FWFRfT1VUKDEpCi0JCQkJfQotCQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2VtcCwgY29kZSwgYzEsIGMyKSB7Ci0JCQkJCVdSSVRFVUNTNChFTVBCQVNFIHwgY29kZSkKLQkJCQl9Ci0JCQkJZWxzZSBUUllNQVBfREVDKGppc3gwMjEzX3BhaXIsIGNvZGUsIGMxLCBjMikgewotCQkJCQlXUklURTIoY29kZSA+PiAxNiwgY29kZSAmIDB4ZmZmZikKLQkJCQkJTkVYVF9PVVQoMikKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gMjsKLQkJCQlORVhUX0lOKDIpCi0JCQl9Ci0JCQllbHNlIHsgLyogUGxhbmUgMiAqLwotCQkJCWlmIChjMSA+PSAweDY3KSBjMSArPSAweDA3OwotCQkJCWVsc2UgaWYgKGMxID49IDB4NjMgfHwgYzEgPT0gMHg1ZikgYzEgLT0gMHgzNzsKLQkJCQllbHNlIGMxIC09IDB4M2Q7CisgICAgICAgICAgICBpZiAoYzEgPCAweDVlKSB7IC8qIFBsYW5lIDEgKi8KKyAgICAgICAgICAgICAgICBjMSArPSAweDIxOworICAgICAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKCoqb3V0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMSwgYzIpCisgICAgICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwgYzEsIGMyKSB7CisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDEpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2JtcCwgKipvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxLCBjMikgeworICAgICAgICAgICAgICAgICAgICBORVhUX09VVCgxKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9lbXAsIGNvZGUsIGMxLCBjMikgeworICAgICAgICAgICAgICAgICAgICBXUklURVVDUzQoRU1QQkFTRSB8IGNvZGUpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM19wYWlyLCBjb2RlLCBjMSwgYzIpIHsKKyAgICAgICAgICAgICAgICAgICAgV1JJVEUyKGNvZGUgPj4gMTYsIGNvZGUgJiAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICAgICAgTkVYVF9JTigyKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7IC8qIFBsYW5lIDIgKi8KKyAgICAgICAgICAgICAgICBpZiAoYzEgPj0gMHg2NykgYzEgKz0gMHgwNzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjMSA+PSAweDYzIHx8IGMxID09IDB4NWYpIGMxIC09IDB4Mzc7CisgICAgICAgICAgICAgICAgZWxzZSBjMSAtPSAweDNkOwogCi0JCQkJRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTIoKipvdXRidWYsCi0JCQkJCQljMSwgYzIpCi0JCQkJZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfYm1wLCAqKm91dGJ1ZiwKLQkJCQkJCWMxLCBjMikgOwotCQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2VtcCwgY29kZSwgYzEsIGMyKSB7Ci0JCQkJCVdSSVRFVUNTNChFTVBCQVNFIHwgY29kZSkKLQkJCQkJTkVYVF9JTigyKQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gMjsKLQkJCQlORVhUKDIsIDEpCi0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMjsKKyAgICAgICAgICAgICAgICBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMigqKm91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEsIGMyKQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2JtcCwgKipvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxLCBjMikgOworICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2VtcCwgY29kZSwgYzEsIGMyKSB7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFVUNTNChFTVBCQVNFIHwgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9JTigyKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMjsKIAotCQlORVhUKDEsIDEpIC8qIEpJUyBYIDAyMDEgKi8KLQl9CisgICAgICAgIE5FWFQoMSwgMSkgLyogSklTIFggMDIwMSAqLworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3Nfa3IuYyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3Nfa3IuYwppbmRleCAxNjE5NjdlLi45MjcyZTM2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2tyLmMKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19rci5jCkBAIC0xMSwxNTEgKzExLDE1MSBAQAogICogRVVDLUtSIGNvZGVjCiAgKi8KIAotI2RlZmluZSBFVUNLUl9KQU1PX0ZJUlNUQllURQkweEE0Ci0jZGVmaW5lIEVVQ0tSX0pBTU9fRklMTEVSCTB4RDQKKyNkZWZpbmUgRVVDS1JfSkFNT19GSVJTVEJZVEUgICAgMHhBNAorI2RlZmluZSBFVUNLUl9KQU1PX0ZJTExFUiAgICAgICAweEQ0CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHUyY2drX2Nob3Nlb25nWzE5XSA9IHsKLQkweGExLCAweGEyLCAweGE0LCAweGE3LCAweGE4LCAweGE5LCAweGIxLCAweGIyLAotCTB4YjMsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YmIsCi0JMHhiYywgMHhiZCwgMHhiZQorICAgIDB4YTEsIDB4YTIsIDB4YTQsIDB4YTcsIDB4YTgsIDB4YTksIDB4YjEsIDB4YjIsCisgICAgMHhiMywgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwKKyAgICAweGJjLCAweGJkLCAweGJlCiB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdTJjZ2tfanVuZ3Nlb25nWzIxXSA9IHsKLQkweGJmLCAweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LAotCTB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsCi0JMHhjZiwgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMworICAgIDB4YmYsIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsCisgICAgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwKKyAgICAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzCiB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdTJjZ2tfam9uZ3Nlb25nWzI4XSA9IHsKLQkweGQ0LCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LAotCTB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsCi0JMHhiMSwgMHhiMiwgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiYSwKLQkweGJiLCAweGJjLCAweGJkLCAweGJlCisgICAgMHhkNCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywKKyAgICAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLAorICAgIDB4YjEsIDB4YjIsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YmEsCisgICAgMHhiYiwgMHhiYywgMHhiZCwgMHhiZQogfTsKIAogRU5DT0RFUihldWNfa3IpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQotCQlUUllNQVBfRU5DKGNwOTQ5LCBjb2RlLCBjKTsKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgVFJZTUFQX0VOQyhjcDk0OSwgY29kZSwgYyk7CisgICAgICAgIGVsc2UgcmV0dXJuIDE7CiAKLQkJaWYgKChjb2RlICYgMHg4MDAwKSA9PSAwKSB7Ci0JCQkvKiBLUyBYIDEwMDEgY29kZWQgY2hhcmFjdGVyICovCi0JCQlPVVQxKChjb2RlID4+IDgpIHwgMHg4MCkKLQkJCU9VVDIoKGNvZGUgJiAweEZGKSB8IDB4ODApCi0JCQlORVhUKDEsIDIpCi0JCX0KLQkJZWxzZSB7CS8qIE1hcHBpbmcgaXMgZm91bmQgaW4gQ1A5NDkgZXh0ZW5zaW9uLAotCQkJICogYnV0IHdlIGVuY29kZSBpdCBpbiBLUyBYIDEwMDE6MTk5OCBBbm5leCAzLAotCQkJICogbWFrZS11cCBzZXF1ZW5jZSBmb3IgRVVDLUtSLiAqLworICAgICAgICBpZiAoKGNvZGUgJiAweDgwMDApID09IDApIHsKKyAgICAgICAgICAgIC8qIEtTIFggMTAwMSBjb2RlZCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIE9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQorICAgICAgICAgICAgT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkKKyAgICAgICAgICAgIE5FWFQoMSwgMikKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgICAgICAgICAgLyogTWFwcGluZyBpcyBmb3VuZCBpbiBDUDk0OSBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICogYnV0IHdlIGVuY29kZSBpdCBpbiBLUyBYIDEwMDE6MTk5OCBBbm5leCAzLAorICAgICAgICAgICAgICAgICAqIG1ha2UtdXAgc2VxdWVuY2UgZm9yIEVVQy1LUi4gKi8KIAotCQkJUkVRVUlSRV9PVVRCVUYoOCkKKyAgICAgICAgICAgIFJFUVVJUkVfT1VUQlVGKDgpCiAKLQkJCS8qIHN5bGxhYmxlIGNvbXBvc2l0aW9uIHByZWNlZGVuY2UgKi8KLQkJCU9VVDEoRVVDS1JfSkFNT19GSVJTVEJZVEUpCi0JCQlPVVQyKEVVQ0tSX0pBTU9fRklMTEVSKQorICAgICAgICAgICAgLyogc3lsbGFibGUgY29tcG9zaXRpb24gcHJlY2VkZW5jZSAqLworICAgICAgICAgICAgT1VUMShFVUNLUl9KQU1PX0ZJUlNUQllURSkKKyAgICAgICAgICAgIE9VVDIoRVVDS1JfSkFNT19GSUxMRVIpCiAKLQkJCS8qIEFsbCBjb2RlcG9pbnRzIGluIENQOTQ5IGV4dGVuc2lvbiBhcmUgaW4gdW5pY29kZQotCQkJICogSGFuZ3VsIFN5bGxhYmxlIGFyZWEuICovCi0JCQlhc3NlcnQoMHhhYzAwIDw9IGMgJiYgYyA8PSAweGQ3YTMpOwotCQkJYyAtPSAweGFjMDA7CisgICAgICAgICAgICAvKiBBbGwgY29kZXBvaW50cyBpbiBDUDk0OSBleHRlbnNpb24gYXJlIGluIHVuaWNvZGUKKyAgICAgICAgICAgICAqIEhhbmd1bCBTeWxsYWJsZSBhcmVhLiAqLworICAgICAgICAgICAgYXNzZXJ0KDB4YWMwMCA8PSBjICYmIGMgPD0gMHhkN2EzKTsKKyAgICAgICAgICAgIGMgLT0gMHhhYzAwOwogCi0JCQlPVVQzKEVVQ0tSX0pBTU9fRklSU1RCWVRFKQotCQkJT1VUNCh1MmNna19jaG9zZW9uZ1tjIC8gNTg4XSkKLQkJCU5FWFRfT1VUKDQpCisgICAgICAgICAgICBPVVQzKEVVQ0tSX0pBTU9fRklSU1RCWVRFKQorICAgICAgICAgICAgT1VUNCh1MmNna19jaG9zZW9uZ1tjIC8gNTg4XSkKKyAgICAgICAgICAgIE5FWFRfT1VUKDQpCiAKLQkJCU9VVDEoRVVDS1JfSkFNT19GSVJTVEJZVEUpCi0JCQlPVVQyKHUyY2drX2p1bmdzZW9uZ1soYyAvIDI4KSAlIDIxXSkKLQkJCU9VVDMoRVVDS1JfSkFNT19GSVJTVEJZVEUpCi0JCQlPVVQ0KHUyY2drX2pvbmdzZW9uZ1tjICUgMjhdKQotCQkJTkVYVCgxLCA0KQotCQl9Ci0JfQorICAgICAgICAgICAgT1VUMShFVUNLUl9KQU1PX0ZJUlNUQllURSkKKyAgICAgICAgICAgIE9VVDIodTJjZ2tfanVuZ3Nlb25nWyhjIC8gMjgpICUgMjFdKQorICAgICAgICAgICAgT1VUMyhFVUNLUl9KQU1PX0ZJUlNUQllURSkKKyAgICAgICAgICAgIE9VVDQodTJjZ2tfam9uZ3Nlb25nW2MgJSAyOF0pCisgICAgICAgICAgICBORVhUKDEsIDQpCisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAotI2RlZmluZSBOT05FCTEyNworI2RlZmluZSBOT05FICAgIDEyNwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjZ2sydV9jaG9zZW9uZ1tdID0geyAvKiBbQTEsIEJFXSAqLwotCSAgIDAsICAgIDEsIE5PTkUsICAgIDIsIE5PTkUsIE5PTkUsICAgIDMsICAgIDQsCi0JICAgNSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwKLQkgICA2LCAgICA3LCAgICA4LCBOT05FLCAgICA5LCAgIDEwLCAgIDExLCAgIDEyLAotCSAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgKKyAgICAgICAwLCAgICAxLCBOT05FLCAgICAyLCBOT05FLCBOT05FLCAgICAzLCAgICA0LAorICAgICAgIDUsIE5PTkUsIE5PTkUsIE5PTkUsIE5PTkUsIE5PTkUsIE5PTkUsIE5PTkUsCisgICAgICAgNiwgICAgNywgICAgOCwgTk9ORSwgICAgOSwgICAxMCwgICAxMSwgICAxMiwKKyAgICAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4CiB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2drMnVfam9uZ3Nlb25nW10gPSB7IC8qIFtBMSwgQkVdICovCi0JICAgMSwgICAgMiwgICAgMywgICAgNCwgICAgNSwgICAgNiwgICAgNywgTk9ORSwKLQkgICA4LCAgICA5LCAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LAotCSAgMTYsICAgMTcsIE5PTkUsICAgMTgsICAgMTksICAgMjAsICAgMjEsICAgMjIsCi0JTk9ORSwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNworICAgICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsICAgIDcsIE5PTkUsCisgICAgICAgOCwgICAgOSwgICAxMCwgICAxMSwgICAxMiwgICAxMywgICAxNCwgICAxNSwKKyAgICAgIDE2LCAgIDE3LCBOT05FLCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLCAgIDIyLAorICAgIE5PTkUsICAgMjMsICAgMjQsICAgMjUsICAgMjYsICAgMjcKIH07CiAKIERFQ09ERVIoZXVjX2tyKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKIAotCQlpZiAoYyA9PSBFVUNLUl9KQU1PX0ZJUlNUQllURSAmJgotCQkgICAgSU4yID09IEVVQ0tSX0pBTU9fRklMTEVSKSB7Ci0JCQkvKiBLUyBYIDEwMDE6MTk5OCBBbm5leCAzIG1ha2UtdXAgc2VxdWVuY2UgKi8KLQkJCURCQ0hBUiBjaG8sIGp1bmcsIGpvbmc7CisgICAgICAgIGlmIChjID09IEVVQ0tSX0pBTU9fRklSU1RCWVRFICYmCisgICAgICAgICAgICBJTjIgPT0gRVVDS1JfSkFNT19GSUxMRVIpIHsKKyAgICAgICAgICAgIC8qIEtTIFggMTAwMToxOTk4IEFubmV4IDMgbWFrZS11cCBzZXF1ZW5jZSAqLworICAgICAgICAgICAgREJDSEFSIGNobywganVuZywgam9uZzsKIAotCQkJUkVRVUlSRV9JTkJVRig4KQotCQkJaWYgKCgqaW5idWYpWzJdICE9IEVVQ0tSX0pBTU9fRklSU1RCWVRFIHx8Ci0JCQkgICAgKCppbmJ1ZilbNF0gIT0gRVVDS1JfSkFNT19GSVJTVEJZVEUgfHwKLQkJCSAgICAoKmluYnVmKVs2XSAhPSBFVUNLUl9KQU1PX0ZJUlNUQllURSkKLQkJCQlyZXR1cm4gODsKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoOCkKKyAgICAgICAgICAgIGlmICgoKmluYnVmKVsyXSAhPSBFVUNLUl9KQU1PX0ZJUlNUQllURSB8fAorICAgICAgICAgICAgICAgICgqaW5idWYpWzRdICE9IEVVQ0tSX0pBTU9fRklSU1RCWVRFIHx8CisgICAgICAgICAgICAgICAgKCppbmJ1ZilbNl0gIT0gRVVDS1JfSkFNT19GSVJTVEJZVEUpCisgICAgICAgICAgICAgICAgcmV0dXJuIDg7CiAKLQkJCWMgPSAoKmluYnVmKVszXTsKLQkJCWlmICgweGExIDw9IGMgJiYgYyA8PSAweGJlKQotCQkJCWNobyA9IGNnazJ1X2Nob3Nlb25nW2MgLSAweGExXTsKLQkJCWVsc2UKLQkJCQljaG8gPSBOT05FOworICAgICAgICAgICAgYyA9ICgqaW5idWYpWzNdOworICAgICAgICAgICAgaWYgKDB4YTEgPD0gYyAmJiBjIDw9IDB4YmUpCisgICAgICAgICAgICAgICAgY2hvID0gY2drMnVfY2hvc2VvbmdbYyAtIDB4YTFdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNobyA9IE5PTkU7CiAKLQkJCWMgPSAoKmluYnVmKVs1XTsKLQkJCWp1bmcgPSAoMHhiZiA8PSBjICYmIGMgPD0gMHhkMykgPyBjIC0gMHhiZiA6IE5PTkU7CisgICAgICAgICAgICBjID0gKCppbmJ1ZilbNV07CisgICAgICAgICAgICBqdW5nID0gKDB4YmYgPD0gYyAmJiBjIDw9IDB4ZDMpID8gYyAtIDB4YmYgOiBOT05FOwogCi0JCQljID0gKCppbmJ1ZilbN107Ci0JCQlpZiAoYyA9PSBFVUNLUl9KQU1PX0ZJTExFUikKLQkJCQlqb25nID0gMDsKLQkJCWVsc2UgaWYgKDB4YTEgPD0gYyAmJiBjIDw9IDB4YmUpCi0JCQkJam9uZyA9IGNnazJ1X2pvbmdzZW9uZ1tjIC0gMHhhMV07Ci0JCQllbHNlCi0JCQkJam9uZyA9IE5PTkU7CisgICAgICAgICAgICBjID0gKCppbmJ1ZilbN107CisgICAgICAgICAgICBpZiAoYyA9PSBFVUNLUl9KQU1PX0ZJTExFUikKKyAgICAgICAgICAgICAgICBqb25nID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKDB4YTEgPD0gYyAmJiBjIDw9IDB4YmUpCisgICAgICAgICAgICAgICAgam9uZyA9IGNnazJ1X2pvbmdzZW9uZ1tjIC0gMHhhMV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgam9uZyA9IE5PTkU7CiAKLQkJCWlmIChjaG8gPT0gTk9ORSB8fCBqdW5nID09IE5PTkUgfHwgam9uZyA9PSBOT05FKQotCQkJCXJldHVybiA4OworICAgICAgICAgICAgaWYgKGNobyA9PSBOT05FIHx8IGp1bmcgPT0gTk9ORSB8fCBqb25nID09IE5PTkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIDg7CiAKLQkJCU9VVDEoMHhhYzAwICsgY2hvKjU4OCArIGp1bmcqMjggKyBqb25nKTsKLQkJCU5FWFQoOCwgMSkKLQkJfQotCQllbHNlIFRSWU1BUF9ERUMoa3N4MTAwMSwgKipvdXRidWYsIGMgXiAweDgwLCBJTjIgXiAweDgwKSB7Ci0JCQlORVhUKDIsIDEpCi0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDI7Ci0JfQorICAgICAgICAgICAgT1VUMSgweGFjMDAgKyBjaG8qNTg4ICsganVuZyoyOCArIGpvbmcpOworICAgICAgICAgICAgTkVYVCg4LCAxKQorICAgICAgICB9CisgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhrc3gxMDAxLCAqKm91dGJ1ZiwgYyBeIDB4ODAsIElOMiBeIDB4ODApIHsKKyAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KICN1bmRlZiBOT05FCiAKQEAgLTE2Niw1NCArMTY2LDU0IEBACiAKIEVOQ09ERVIoY3A5NDkpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQotCQlUUllNQVBfRU5DKGNwOTQ5LCBjb2RlLCBjKTsKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgVFJZTUFQX0VOQyhjcDk0OSwgY29kZSwgYyk7CisgICAgICAgIGVsc2UgcmV0dXJuIDE7CiAKLQkJT1VUMSgoY29kZSA+PiA4KSB8IDB4ODApCi0JCWlmIChjb2RlICYgMHg4MDAwKQotCQkJT1VUMihjb2RlICYgMHhGRikgLyogTVNCIHNldDogQ1A5NDkgKi8KLQkJZWxzZQotCQkJT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkgLyogTVNCIHVuc2V0OiBrcyB4IDEwMDEgKi8KLQkJTkVYVCgxLCAyKQotCX0KKyAgICAgICAgT1VUMSgoY29kZSA+PiA4KSB8IDB4ODApCisgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKQorICAgICAgICAgICAgT1VUMihjb2RlICYgMHhGRikgLyogTVNCIHNldDogQ1A5NDkgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkgLyogTVNCIHVuc2V0OiBrcyB4IDEwMDEgKi8KKyAgICAgICAgTkVYVCgxLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGNwOTQ5KQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCi0JCVRSWU1BUF9ERUMoa3N4MTAwMSwgKipvdXRidWYsIGMgXiAweDgwLCBJTjIgXiAweDgwKTsKLQkJZWxzZSBUUllNQVBfREVDKGNwOTQ5ZXh0LCAqKm91dGJ1ZiwgYywgSU4yKTsKLQkJZWxzZSByZXR1cm4gMjsKKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICBUUllNQVBfREVDKGtzeDEwMDEsICoqb3V0YnVmLCBjIF4gMHg4MCwgSU4yIF4gMHg4MCk7CisgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhjcDk0OWV4dCwgKipvdXRidWYsIGMsIElOMik7CisgICAgICAgIGVsc2UgcmV0dXJuIDI7CiAKLQkJTkVYVCgyLCAxKQotCX0KKyAgICAgICAgTkVYVCgyLCAxKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTI1MCw1OCArMjUwLDU4IEBACiAKIEVOQ09ERVIoam9oYWIpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBSRVFVSVJFX09VVEJVRigyKQogCi0JCWlmIChjID49IDB4YWMwMCAmJiBjIDw9IDB4ZDdhMykgewotCQkJYyAtPSAweGFjMDA7Ci0JCQljb2RlID0gMHg4MDAwIHwKLQkJCQkodTJqb2hhYmlkeF9jaG9zZW9uZ1tjIC8gNTg4XSA8PCAxMCkgfAotCQkJCSh1MmpvaGFiaWR4X2p1bmdzZW9uZ1soYyAvIDI4KSAlIDIxXSA8PCA1KSB8Ci0JCQkJdTJqb2hhYmlkeF9qb25nc2VvbmdbYyAlIDI4XTsKLQkJfQotCQllbHNlIGlmIChjID49IDB4MzEzMSAmJiBjIDw9IDB4MzE2MykKLQkJCWNvZGUgPSB1MmpvaGFiamFtb1tjIC0gMHgzMTMxXTsKLQkJZWxzZSBUUllNQVBfRU5DKGNwOTQ5LCBjb2RlLCBjKSB7Ci0JCQl1bnNpZ25lZCBjaGFyIGMxLCBjMiwgdDI7Ci0JCQl1bnNpZ25lZCBzaG9ydCB0MTsKKyAgICAgICAgaWYgKGMgPj0gMHhhYzAwICYmIGMgPD0gMHhkN2EzKSB7CisgICAgICAgICAgICBjIC09IDB4YWMwMDsKKyAgICAgICAgICAgIGNvZGUgPSAweDgwMDAgfAorICAgICAgICAgICAgICAgICh1MmpvaGFiaWR4X2Nob3Nlb25nW2MgLyA1ODhdIDw8IDEwKSB8CisgICAgICAgICAgICAgICAgKHUyam9oYWJpZHhfanVuZ3Nlb25nWyhjIC8gMjgpICUgMjFdIDw8IDUpIHwKKyAgICAgICAgICAgICAgICB1MmpvaGFiaWR4X2pvbmdzZW9uZ1tjICUgMjhdOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPj0gMHgzMTMxICYmIGMgPD0gMHgzMTYzKQorICAgICAgICAgICAgY29kZSA9IHUyam9oYWJqYW1vW2MgLSAweDMxMzFdOworICAgICAgICBlbHNlIFRSWU1BUF9FTkMoY3A5NDksIGNvZGUsIGMpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzEsIGMyLCB0MjsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHQxOwogCi0JCQlhc3NlcnQoKGNvZGUgJiAweDgwMDApID09IDApOwotCQkJYzEgPSBjb2RlID4+IDg7Ci0JCQljMiA9IGNvZGUgJiAweGZmOwotCQkJaWYgKCgoYzEgPj0gMHgyMSAmJiBjMSA8PSAweDJjKSB8fAotCQkJICAgIChjMSA+PSAweDRhICYmIGMxIDw9IDB4N2QpKSAmJgotCQkJICAgIChjMiA+PSAweDIxICYmIGMyIDw9IDB4N2UpKSB7Ci0JCQkJdDEgPSAoYzEgPCAweDRhID8gKGMxIC0gMHgyMSArIDB4MWIyKSA6Ci0JCQkJCQkgIChjMSAtIDB4MjEgKyAweDE5NykpOwotCQkJCXQyID0gKCh0MSAmIDEpID8gMHg1ZSA6IDApICsgKGMyIC0gMHgyMSk7Ci0JCQkJT1VUMSh0MSA+PiAxKQotCQkJCU9VVDIodDIgPCAweDRlID8gdDIgKyAweDMxIDogdDIgKyAweDQzKQotCQkJCU5FWFQoMSwgMikKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMTsKKyAgICAgICAgICAgIGFzc2VydCgoY29kZSAmIDB4ODAwMCkgPT0gMCk7CisgICAgICAgICAgICBjMSA9IGNvZGUgPj4gODsKKyAgICAgICAgICAgIGMyID0gY29kZSAmIDB4ZmY7CisgICAgICAgICAgICBpZiAoKChjMSA+PSAweDIxICYmIGMxIDw9IDB4MmMpIHx8CisgICAgICAgICAgICAgICAgKGMxID49IDB4NGEgJiYgYzEgPD0gMHg3ZCkpICYmCisgICAgICAgICAgICAgICAgKGMyID49IDB4MjEgJiYgYzIgPD0gMHg3ZSkpIHsKKyAgICAgICAgICAgICAgICB0MSA9IChjMSA8IDB4NGEgPyAoYzEgLSAweDIxICsgMHgxYjIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGMxIC0gMHgyMSArIDB4MTk3KSk7CisgICAgICAgICAgICAgICAgdDIgPSAoKHQxICYgMSkgPyAweDVlIDogMCkgKyAoYzIgLSAweDIxKTsKKyAgICAgICAgICAgICAgICBPVVQxKHQxID4+IDEpCisgICAgICAgICAgICAgICAgT1VUMih0MiA8IDB4NGUgPyB0MiArIDB4MzEgOiB0MiArIDB4NDMpCisgICAgICAgICAgICAgICAgTkVYVCgxLCAyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCU9VVDEoY29kZSA+PiA4KQotCQlPVVQyKGNvZGUgJiAweGZmKQotCQlORVhUKDEsIDIpCi0JfQorICAgICAgICBPVVQxKGNvZGUgPj4gOCkKKyAgICAgICAgT1VUMihjb2RlICYgMHhmZikKKyAgICAgICAgTkVYVCgxLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIEZJTEwgMHhmZApAQCAtMzQ3LDkxICszNDcsOTEgQEAKIAogREVDT0RFUihqb2hhYikKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyICAgIGMgPSBJTjEsIGMyOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgYyA9IElOMSwgYzI7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCi0JCWMyID0gSU4yOworICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIGMyID0gSU4yOwogCi0JCWlmIChjIDwgMHhkOCkgewotCQkJLyogam9oYWIgaGFuZ3VsICovCi0JCQl1bnNpZ25lZCBjaGFyIGNfY2hvLCBjX2p1bmcsIGNfam9uZzsKLQkJCXVuc2lnbmVkIGNoYXIgaV9jaG8sIGlfanVuZywgaV9qb25nOworICAgICAgICBpZiAoYyA8IDB4ZDgpIHsKKyAgICAgICAgICAgIC8qIGpvaGFiIGhhbmd1bCAqLworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjX2NobywgY19qdW5nLCBjX2pvbmc7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGlfY2hvLCBpX2p1bmcsIGlfam9uZzsKIAotCQkJY19jaG8gPSAoYyA+PiAyKSAmIDB4MWY7Ci0JCQljX2p1bmcgPSAoKGMgPDwgMykgfCBjMiA+PiA1KSAmIDB4MWY7Ci0JCQljX2pvbmcgPSBjMiAmIDB4MWY7CisgICAgICAgICAgICBjX2NobyA9IChjID4+IDIpICYgMHgxZjsKKyAgICAgICAgICAgIGNfanVuZyA9ICgoYyA8PCAzKSB8IGMyID4+IDUpICYgMHgxZjsKKyAgICAgICAgICAgIGNfam9uZyA9IGMyICYgMHgxZjsKIAotCQkJaV9jaG8gPSBqb2hhYmlkeF9jaG9zZW9uZ1tjX2Nob107Ci0JCQlpX2p1bmcgPSBqb2hhYmlkeF9qdW5nc2VvbmdbY19qdW5nXTsKLQkJCWlfam9uZyA9IGpvaGFiaWR4X2pvbmdzZW9uZ1tjX2pvbmddOworICAgICAgICAgICAgaV9jaG8gPSBqb2hhYmlkeF9jaG9zZW9uZ1tjX2Nob107CisgICAgICAgICAgICBpX2p1bmcgPSBqb2hhYmlkeF9qdW5nc2VvbmdbY19qdW5nXTsKKyAgICAgICAgICAgIGlfam9uZyA9IGpvaGFiaWR4X2pvbmdzZW9uZ1tjX2pvbmddOwogCi0JCQlpZiAoaV9jaG8gPT0gTk9ORSB8fCBpX2p1bmcgPT0gTk9ORSB8fCBpX2pvbmcgPT0gTk9ORSkKLQkJCQlyZXR1cm4gMjsKKyAgICAgICAgICAgIGlmIChpX2NobyA9PSBOT05FIHx8IGlfanVuZyA9PSBOT05FIHx8IGlfam9uZyA9PSBOT05FKQorICAgICAgICAgICAgICAgIHJldHVybiAyOwogCi0JCQkvKiB3ZSBkb24ndCB1c2UgVSsxMTAwIGhhbmd1bCBqYW1vIHlldC4gKi8KLQkJCWlmIChpX2NobyA9PSBGSUxMKSB7Ci0JCQkJaWYgKGlfanVuZyA9PSBGSUxMKSB7Ci0JCQkJCWlmIChpX2pvbmcgPT0gRklMTCkKLQkJCQkJCU9VVDEoMHgzMDAwKQotCQkJCQllbHNlCi0JCQkJCQlPVVQxKDB4MzEwMCB8Ci0JCQkJCQkgIGpvaGFiamFtb19qb25nc2VvbmdbY19qb25nXSkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChpX2pvbmcgPT0gRklMTCkKLQkJCQkJCU9VVDEoMHgzMTAwIHwKLQkJCQkJCSAgam9oYWJqYW1vX2p1bmdzZW9uZ1tjX2p1bmddKQotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gMjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpX2p1bmcgPT0gRklMTCkgewotCQkJCQlpZiAoaV9qb25nID09IEZJTEwpCi0JCQkJCQlPVVQxKDB4MzEwMCB8Ci0JCQkJCQkgIGpvaGFiamFtb19jaG9zZW9uZ1tjX2Nob10pCi0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiAyOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCU9VVDEoMHhhYzAwICsKLQkJCQkJICAgICBpX2NobyAqIDU4OCArCi0JCQkJCSAgICAgaV9qdW5nICogMjggKwotCQkJCQkgICAgIChpX2pvbmcgPT0gRklMTCA/IDAgOiBpX2pvbmcpKQotCQkJfQotCQkJTkVYVCgyLCAxKQotCQl9IGVsc2UgewotCQkJLyogS1MgWCAxMDAxIGV4Y2VwdCBoYW5ndWwgamFtb3MgYW5kIHN5bGxhYmxlcyAqLwotCQkJaWYgKGMgPT0gMHhkZiB8fCBjID4gMHhmOSB8fAotCQkJICAgIGMyIDwgMHgzMSB8fCAoYzIgPj0gMHg4MCAmJiBjMiA8IDB4OTEpIHx8Ci0JCQkgICAgKGMyICYgMHg3ZikgPT0gMHg3ZiB8fAotCQkJICAgIChjID09IDB4ZGEgJiYgKGMyID49IDB4YTEgJiYgYzIgPD0gMHhkMykpKQotCQkJCXJldHVybiAyOwotCQkJZWxzZSB7Ci0JCQkJdW5zaWduZWQgY2hhciB0MSwgdDI7CisgICAgICAgICAgICAvKiB3ZSBkb24ndCB1c2UgVSsxMTAwIGhhbmd1bCBqYW1vIHlldC4gKi8KKyAgICAgICAgICAgIGlmIChpX2NobyA9PSBGSUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGlfanVuZyA9PSBGSUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpX2pvbmcgPT0gRklMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVDEoMHgzMDAwKQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBPVVQxKDB4MzEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaGFiamFtb19qb25nc2VvbmdbY19qb25nXSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpX2pvbmcgPT0gRklMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVDEoMHgzMTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgam9oYWJqYW1vX2p1bmdzZW9uZ1tjX2p1bmddKQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpX2p1bmcgPT0gRklMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaV9qb25nID09IEZJTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBPVVQxKDB4MzEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaGFiamFtb19jaG9zZW9uZ1tjX2Nob10pCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIE9VVDEoMHhhYzAwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpX2NobyAqIDU4OCArCisgICAgICAgICAgICAgICAgICAgICAgICAgaV9qdW5nICogMjggKworICAgICAgICAgICAgICAgICAgICAgICAgIChpX2pvbmcgPT0gRklMTCA/IDAgOiBpX2pvbmcpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogS1MgWCAxMDAxIGV4Y2VwdCBoYW5ndWwgamFtb3MgYW5kIHN5bGxhYmxlcyAqLworICAgICAgICAgICAgaWYgKGMgPT0gMHhkZiB8fCBjID4gMHhmOSB8fAorICAgICAgICAgICAgICAgIGMyIDwgMHgzMSB8fCAoYzIgPj0gMHg4MCAmJiBjMiA8IDB4OTEpIHx8CisgICAgICAgICAgICAgICAgKGMyICYgMHg3ZikgPT0gMHg3ZiB8fAorICAgICAgICAgICAgICAgIChjID09IDB4ZGEgJiYgKGMyID49IDB4YTEgJiYgYzIgPD0gMHhkMykpKQorICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0MSwgdDI7CiAKLQkJCQl0MSA9IChjIDwgMHhlMCA/IDIgKiAoYyAtIDB4ZDkpIDoKLQkJCQkJCSAyICogYyAtIDB4MTk3KTsKLQkJCQl0MiA9IChjMiA8IDB4OTEgPyBjMiAtIDB4MzEgOiBjMiAtIDB4NDMpOwotCQkJCXQxID0gdDEgKyAodDIgPCAweDVlID8gMCA6IDEpICsgMHgyMTsKLQkJCQl0MiA9ICh0MiA8IDB4NWUgPyB0MiA6IHQyIC0gMHg1ZSkgKyAweDIxOworICAgICAgICAgICAgICAgIHQxID0gKGMgPCAweGUwID8gMiAqIChjIC0gMHhkOSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBjIC0gMHgxOTcpOworICAgICAgICAgICAgICAgIHQyID0gKGMyIDwgMHg5MSA/IGMyIC0gMHgzMSA6IGMyIC0gMHg0Myk7CisgICAgICAgICAgICAgICAgdDEgPSB0MSArICh0MiA8IDB4NWUgPyAwIDogMSkgKyAweDIxOworICAgICAgICAgICAgICAgIHQyID0gKHQyIDwgMHg1ZSA/IHQyIDogdDIgLSAweDVlKSArIDB4MjE7CiAKLQkJCQlUUllNQVBfREVDKGtzeDEwMDEsICoqb3V0YnVmLCB0MSwgdDIpOwotCQkJCWVsc2UgcmV0dXJuIDI7Ci0JCQkJTkVYVCgyLCAxKQotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgICAgIFRSWU1BUF9ERUMoa3N4MTAwMSwgKipvdXRidWYsIHQxLCB0Mik7CisgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMjsKKyAgICAgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KICN1bmRlZiBOT05FCiAjdW5kZWYgRklMTApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc190dy5jIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc190dy5jCmluZGV4IDhjY2JjYTEuLjM4Y2Y3MjMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfdHcuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX3R3LmMKQEAgLTEzLDUyICsxMyw1MiBAQAogCiBFTkNPREVSKGJpZzUpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gKippbmJ1ZjsKLQkJREJDSEFSIGNvZGU7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgUHlfVU5JQ09ERSBjID0gKippbmJ1ZjsKKyAgICAgICAgREJDSEFSIGNvZGU7CiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlSRVFVSVJFX09VVEJVRigxKQotCQkJKipvdXRidWYgPSAodW5zaWduZWQgY2hhciljOwotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KLQkJVUNTNElOVkFMSUQoYykKKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBSRVFVSVJFX09VVEJVRigxKQorICAgICAgICAgICAgKipvdXRidWYgPSAodW5zaWduZWQgY2hhciljOworICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBSRVFVSVJFX09VVEJVRigyKQogCi0JCVRSWU1BUF9FTkMoYmlnNSwgY29kZSwgYyk7Ci0JCWVsc2UgcmV0dXJuIDE7CisgICAgICAgIFRSWU1BUF9FTkMoYmlnNSwgY29kZSwgYyk7CisgICAgICAgIGVsc2UgcmV0dXJuIDE7CiAKLQkJT1VUMShjb2RlID4+IDgpCi0JCU9VVDIoY29kZSAmIDB4RkYpCi0JCU5FWFQoMSwgMikKLQl9CisgICAgICAgIE9VVDEoY29kZSA+PiA4KQorICAgICAgICBPVVQyKGNvZGUgJiAweEZGKQorICAgICAgICBORVhUKDEsIDIpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVIoYmlnNSkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xOwogCi0JCVJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlPVVQxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIE9VVDEoYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJUkVRVUlSRV9JTkJVRigyKQotCQlUUllNQVBfREVDKGJpZzUsICoqb3V0YnVmLCBjLCBJTjIpIHsKLQkJCU5FWFQoMiwgMSkKLQkJfQotCQllbHNlIHJldHVybiAyOwotCX0KKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICBUUllNQVBfREVDKGJpZzUsICoqb3V0YnVmLCBjLCBJTjIpIHsKKyAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgfQorICAgICAgICBlbHNlIHJldHVybiAyOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTY4LDUzICs2OCw1MyBAQAogCiBFTkNPREVSKGNwOTUwKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCVB5X1VOSUNPREUgYyA9IElOMTsKLQkJREJDSEFSIGNvZGU7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgUHlfVU5JQ09ERSBjID0gSU4xOworICAgICAgICBEQkNIQVIgY29kZTsKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCVdSSVRFMSgodW5zaWduZWQgY2hhciljKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KLQkJVUNTNElOVkFMSUQoYykKKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFVDUzRJTlZBTElEKGMpCiAKLQkJUkVRVUlSRV9PVVRCVUYoMikKLQkJVFJZTUFQX0VOQyhjcDk1MGV4dCwgY29kZSwgYyk7Ci0JCWVsc2UgVFJZTUFQX0VOQyhiaWc1LCBjb2RlLCBjKTsKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgVFJZTUFQX0VOQyhjcDk1MGV4dCwgY29kZSwgYyk7CisgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhiaWc1LCBjb2RlLCBjKTsKKyAgICAgICAgZWxzZSByZXR1cm4gMTsKIAotCQlPVVQxKGNvZGUgPj4gOCkKLQkJT1VUMihjb2RlICYgMHhGRikKLQkJTkVYVCgxLCAyKQotCX0KKyAgICAgICAgT1VUMShjb2RlID4+IDgpCisgICAgICAgIE9VVDIoY29kZSAmIDB4RkYpCisgICAgICAgIE5FWFQoMSwgMikKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUihjcDk1MCkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xOwogCi0JCVJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlPVVQxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIE9VVDEoYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJUkVRVUlSRV9JTkJVRigyKQorICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCiAKLQkJVFJZTUFQX0RFQyhjcDk1MGV4dCwgKipvdXRidWYsIGMsIElOMik7Ci0JCWVsc2UgVFJZTUFQX0RFQyhiaWc1LCAqKm91dGJ1ZiwgYywgSU4yKTsKLQkJZWxzZSByZXR1cm4gMjsKKyAgICAgICAgVFJZTUFQX0RFQyhjcDk1MGV4dCwgKipvdXRidWYsIGMsIElOMik7CisgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhiaWc1LCAqKm91dGJ1ZiwgYywgSU4yKTsKKyAgICAgICAgZWxzZSByZXR1cm4gMjsKIAotCQlORVhUKDIsIDEpCi0JfQorICAgICAgICBORVhUKDIsIDEpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvYWxnX2ppc3gwMjAxLmggYi9Nb2R1bGVzL2Nqa2NvZGVjcy9hbGdfamlzeDAyMDEuaAppbmRleCAxZmNhMDZiLi4wYmM3ZGI1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9hbGdfamlzeDAyMDEuaAorKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9hbGdfamlzeDAyMDEuaApAQCAtMSwyNCArMSwyNCBAQAotI2RlZmluZSBKSVNYMDIwMV9SX0VOQ09ERShjLCBhc3NpKQkJCVwKLQlpZiAoKGMpIDwgMHg4MCAmJiAoYykgIT0gMHg1YyAmJiAoYykgIT0gMHg3ZSkJXAotCQkoYXNzaSkgPSAoYyk7CQkJCVwKLQllbHNlIGlmICgoYykgPT0gMHgwMGE1KSAoYXNzaSkgPSAweDVjOwkJXAotCWVsc2UgaWYgKChjKSA9PSAweDIwM2UpIChhc3NpKSA9IDB4N2U7Ci0jZGVmaW5lIEpJU1gwMjAxX0tfRU5DT0RFKGMsIGFzc2kpCQkJXAotCWlmICgoYykgPj0gMHhmZjYxICYmIChjKSA8PSAweGZmOWYpCQlcCi0JCShhc3NpKSA9IChjKSAtIDB4ZmVjMDsKLSNkZWZpbmUgSklTWDAyMDFfRU5DT0RFKGMsIGFzc2kpCQkJXAotCUpJU1gwMjAxX1JfRU5DT0RFKGMsIGFzc2kpCQkJXAotCWVsc2UgSklTWDAyMDFfS19FTkNPREUoYywgYXNzaSkKKyNkZWZpbmUgSklTWDAyMDFfUl9FTkNPREUoYywgYXNzaSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoYykgPCAweDgwICYmIChjKSAhPSAweDVjICYmIChjKSAhPSAweDdlKSAgICAgICBcCisgICAgICAgIChhc3NpKSA9IChjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoYykgPT0gMHgwMGE1KSAoYXNzaSkgPSAweDVjOyAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKChjKSA9PSAweDIwM2UpIChhc3NpKSA9IDB4N2U7CisjZGVmaW5lIEpJU1gwMjAxX0tfRU5DT0RFKGMsIGFzc2kpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKGMpID49IDB4ZmY2MSAmJiAoYykgPD0gMHhmZjlmKSAgICAgICAgICAgICAgICAgXAorICAgICAgICAoYXNzaSkgPSAoYykgLSAweGZlYzA7CisjZGVmaW5lIEpJU1gwMjAxX0VOQ09ERShjLCBhc3NpKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBKSVNYMDIwMV9SX0VOQ09ERShjLCBhc3NpKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgSklTWDAyMDFfS19FTkNPREUoYywgYXNzaSkKIAotI2RlZmluZSBKSVNYMDIwMV9SX0RFQ09ERShjLCBhc3NpKQkJCVwKLQlpZiAoKGMpIDwgMHg1YykgKGFzc2kpID0gKGMpOwkJCVwKLQllbHNlIGlmICgoYykgPT0gMHg1YykgKGFzc2kpID0gMHgwMGE1OwkJXAotCWVsc2UgaWYgKChjKSA8IDB4N2UpIChhc3NpKSA9IChjKTsJCVwKLQllbHNlIGlmICgoYykgPT0gMHg3ZSkgKGFzc2kpID0gMHgyMDNlOwkJXAotCWVsc2UgaWYgKChjKSA9PSAweDdmKSAoYXNzaSkgPSAweDdmOwotI2RlZmluZSBKSVNYMDIwMV9LX0RFQ09ERShjLCBhc3NpKQkJCVwKLQlpZiAoKGMpID49IDB4YTEgJiYgKGMpIDw9IDB4ZGYpCQkJXAotCShhc3NpKSA9IDB4ZmVjMCArIChjKTsKLSNkZWZpbmUgSklTWDAyMDFfREVDT0RFKGMsIGFzc2kpCQkJXAotCUpJU1gwMjAxX1JfREVDT0RFKGMsIGFzc2kpCQkJXAotCWVsc2UgSklTWDAyMDFfS19ERUNPREUoYywgYXNzaSkKKyNkZWZpbmUgSklTWDAyMDFfUl9ERUNPREUoYywgYXNzaSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoYykgPCAweDVjKSAoYXNzaSkgPSAoYyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4NWMpIChhc3NpKSA9IDB4MDBhNTsgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoYykgPCAweDdlKSAoYXNzaSkgPSAoYyk7ICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKChjKSA9PSAweDdlKSAoYXNzaSkgPSAweDIwM2U7ICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4N2YpIChhc3NpKSA9IDB4N2Y7CisjZGVmaW5lIEpJU1gwMjAxX0tfREVDT0RFKGMsIGFzc2kpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKGMpID49IDB4YTEgJiYgKGMpIDw9IDB4ZGYpICAgICAgICAgICAgICAgICAgICAgXAorICAgIChhc3NpKSA9IDB4ZmVjMCArIChjKTsKKyNkZWZpbmUgSklTWDAyMDFfREVDT0RFKGMsIGFzc2kpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEpJU1gwMjAxX1JfREVDT0RFKGMsIGFzc2kpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBKSVNYMDIwMV9LX0RFQ09ERShjLCBhc3NpKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvY2prY29kZWNzLmggYi9Nb2R1bGVzL2Nqa2NvZGVjcy9jamtjb2RlY3MuaAppbmRleCAyMzZjM2ZlLi43ZTgzOTBhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9jamtjb2RlY3MuaAorKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9jamtjb2RlY3MuaApAQCAtMTMsMTIgKzEzLDEyIEBACiAKIAogLyogYSB1bmljb2RlICJ1bmRlZmluZWQiIGNvZGVwb2ludCAqLwotI2RlZmluZSBVTklJTlYJMHhGRkZFCisjZGVmaW5lIFVOSUlOViAgMHhGRkZFCiAKIC8qIGludGVybmFsLXVzZSBEQkNTIGNvZGVwb2ludHMgd2hpY2ggYXJlbid0IHVzZWQgYnkgYW55IGNoYXJzZXRzICovCi0jZGVmaW5lIE5PQ0hBUgkweEZGRkYKLSNkZWZpbmUgTVVMVElDCTB4RkZGRQotI2RlZmluZSBEQkNJTlYJMHhGRkZECisjZGVmaW5lIE5PQ0hBUiAgMHhGRkZGCisjZGVmaW5lIE1VTFRJQyAgMHhGRkZFCisjZGVmaW5lIERCQ0lOViAgMHhGRkZECiAKIC8qIHNob3J0ZXIgbWFjcm9zIHRvIHNhdmUgc291cmNlIHNpemUgb2YgbWFwcGluZyB0YWJsZXMgKi8KICNkZWZpbmUgVSBVTklJTlYKQEAgLTI3LDk0ICsyNyw5NCBAQAogI2RlZmluZSBEIERCQ0lOVgogCiBzdHJ1Y3QgZGJjc19pbmRleCB7Ci0JY29uc3QgdWNzMl90ICptYXA7Ci0JdW5zaWduZWQgY2hhciBib3R0b20sIHRvcDsKKyAgICBjb25zdCB1Y3MyX3QgKm1hcDsKKyAgICB1bnNpZ25lZCBjaGFyIGJvdHRvbSwgdG9wOwogfTsKIHR5cGVkZWYgc3RydWN0IGRiY3NfaW5kZXggZGVjb2RlX21hcDsKIAogc3RydWN0IHdpZGVkYmNzX2luZGV4IHsKLQljb25zdCB1Y3M0X3QgKm1hcDsKLQl1bnNpZ25lZCBjaGFyIGJvdHRvbSwgdG9wOworICAgIGNvbnN0IHVjczRfdCAqbWFwOworICAgIHVuc2lnbmVkIGNoYXIgYm90dG9tLCB0b3A7CiB9OwogdHlwZWRlZiBzdHJ1Y3Qgd2lkZWRiY3NfaW5kZXggd2lkZWRlY29kZV9tYXA7CiAKIHN0cnVjdCB1bmltX2luZGV4IHsKLQljb25zdCBEQkNIQVIgKm1hcDsKLQl1bnNpZ25lZCBjaGFyIGJvdHRvbSwgdG9wOworICAgIGNvbnN0IERCQ0hBUiAqbWFwOworICAgIHVuc2lnbmVkIGNoYXIgYm90dG9tLCB0b3A7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgdW5pbV9pbmRleCBlbmNvZGVfbWFwOwogCiBzdHJ1Y3QgdW5pbV9pbmRleF9ieXRlYmFzZWQgewotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hcDsKLQl1bnNpZ25lZCBjaGFyIGJvdHRvbSwgdG9wOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hcDsKKyAgICB1bnNpZ25lZCBjaGFyIGJvdHRvbSwgdG9wOwogfTsKIAogc3RydWN0IGRiY3NfbWFwIHsKLQljb25zdCBjaGFyICpjaGFyc2V0OwotCWNvbnN0IHN0cnVjdCB1bmltX2luZGV4ICplbmNtYXA7Ci0JY29uc3Qgc3RydWN0IGRiY3NfaW5kZXggKmRlY21hcDsKKyAgICBjb25zdCBjaGFyICpjaGFyc2V0OworICAgIGNvbnN0IHN0cnVjdCB1bmltX2luZGV4ICplbmNtYXA7CisgICAgY29uc3Qgc3RydWN0IGRiY3NfaW5kZXggKmRlY21hcDsKIH07CiAKIHN0cnVjdCBwYWlyX2VuY29kZW1hcCB7Ci0JdWNzNF90IHVuaXNlcTsKLQlEQkNIQVIgY29kZTsKKyAgICB1Y3M0X3QgdW5pc2VxOworICAgIERCQ0hBUiBjb2RlOwogfTsKIAogc3RhdGljIGNvbnN0IE11bHRpYnl0ZUNvZGVjICpjb2RlY19saXN0Owogc3RhdGljIGNvbnN0IHN0cnVjdCBkYmNzX21hcCAqbWFwcGluZ19saXN0OwogCi0jZGVmaW5lIENPREVDX0lOSVQoZW5jb2RpbmcpCQkJCQkJXAotCXN0YXRpYyBpbnQgZW5jb2RpbmcjI19jb2RlY19pbml0KGNvbnN0IHZvaWQgKmNvbmZpZykKKyNkZWZpbmUgQ09ERUNfSU5JVChlbmNvZGluZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgaW50IGVuY29kaW5nIyNfY29kZWNfaW5pdChjb25zdCB2b2lkICpjb25maWcpCiAKLSNkZWZpbmUgRU5DT0RFUl9JTklUKGVuY29kaW5nKQkJCQkJCVwKLQlzdGF0aWMgaW50IGVuY29kaW5nIyNfZW5jb2RlX2luaXQoCQkJCVwKLQkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcpCi0jZGVmaW5lIEVOQ09ERVIoZW5jb2RpbmcpCQkJCQkJXAotCXN0YXRpYyBQeV9zc2l6ZV90IGVuY29kaW5nIyNfZW5jb2RlKAkJCQlcCi0JCU11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnLAlcCi0JCWNvbnN0IFB5X1VOSUNPREUgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsCQlcCi0JCXVuc2lnbmVkIGNoYXIgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCwgaW50IGZsYWdzKQotI2RlZmluZSBFTkNPREVSX1JFU0VUKGVuY29kaW5nKQkJCQkJCVwKLQlzdGF0aWMgUHlfc3NpemVfdCBlbmNvZGluZyMjX2VuY29kZV9yZXNldCgJCQlcCi0JCU11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnLAlcCi0JCXVuc2lnbmVkIGNoYXIgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCkKKyNkZWZpbmUgRU5DT0RFUl9JTklUKGVuY29kaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgaW50IGVuY29kaW5nIyNfZW5jb2RlX2luaXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcpCisjZGVmaW5lIEVOQ09ERVIoZW5jb2RpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIFB5X3NzaXplX3QgZW5jb2RpbmcjI19lbmNvZGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnLCAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IFB5X1VOSUNPREUgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCwgaW50IGZsYWdzKQorI2RlZmluZSBFTkNPREVSX1JFU0VUKGVuY29kaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBQeV9zc2l6ZV90IGVuY29kaW5nIyNfZW5jb2RlX3Jlc2V0KCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmNvbmZpZywgICAgICAgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBjaGFyICoqb3V0YnVmLCBQeV9zc2l6ZV90IG91dGxlZnQpCiAKLSNkZWZpbmUgREVDT0RFUl9JTklUKGVuY29kaW5nKQkJCQkJCVwKLQlzdGF0aWMgaW50IGVuY29kaW5nIyNfZGVjb2RlX2luaXQoCQkJCVwKLQkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcpCi0jZGVmaW5lIERFQ09ERVIoZW5jb2RpbmcpCQkJCQkJXAotCXN0YXRpYyBQeV9zc2l6ZV90IGVuY29kaW5nIyNfZGVjb2RlKAkJCQlcCi0JCU11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnLAlcCi0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsCQlcCi0JCVB5X1VOSUNPREUgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCkKLSNkZWZpbmUgREVDT0RFUl9SRVNFVChlbmNvZGluZykJCQkJCQlcCi0Jc3RhdGljIFB5X3NzaXplX3QgZW5jb2RpbmcjI19kZWNvZGVfcmVzZXQoCQkJXAotCQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmNvbmZpZykKKyNkZWZpbmUgREVDT0RFUl9JTklUKGVuY29kaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgaW50IGVuY29kaW5nIyNfZGVjb2RlX2luaXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcpCisjZGVmaW5lIERFQ09ERVIoZW5jb2RpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIFB5X3NzaXplX3QgZW5jb2RpbmcjI19kZWNvZGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnLCAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X1VOSUNPREUgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCkKKyNkZWZpbmUgREVDT0RFUl9SRVNFVChlbmNvZGluZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgUHlfc3NpemVfdCBlbmNvZGluZyMjX2RlY29kZV9yZXNldCggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcpCiAKICNpZiBQeV9VTklDT0RFX1NJWkUgPT0gNAotI2RlZmluZSBVQ1M0SU5WQUxJRChjb2RlKQlcCi0JaWYgKChjb2RlKSA+IDB4RkZGRikJXAotCXJldHVybiAxOworI2RlZmluZSBVQ1M0SU5WQUxJRChjb2RlKSAgICAgICBcCisgICAgaWYgKChjb2RlKSA+IDB4RkZGRikgICAgICAgIFwKKyAgICByZXR1cm4gMTsKICNlbHNlCi0jZGVmaW5lIFVDUzRJTlZBTElEKGNvZGUpCVwKLQlpZiAoMCkgOworI2RlZmluZSBVQ1M0SU5WQUxJRChjb2RlKSAgICAgICBcCisgICAgaWYgKDApIDsKICNlbmRpZgogCi0jZGVmaW5lIE5FWFRfSU4oaSkJCQkJXAotCSgqaW5idWYpICs9IChpKTsJCQlcCi0JKGlubGVmdCkgLT0gKGkpOwotI2RlZmluZSBORVhUX09VVChvKQkJCQlcCi0JKCpvdXRidWYpICs9IChvKTsJCQlcCi0JKG91dGxlZnQpIC09IChvKTsKLSNkZWZpbmUgTkVYVChpLCBvKQkJCQlcCi0JTkVYVF9JTihpKSBORVhUX09VVChvKQorI2RlZmluZSBORVhUX0lOKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqaW5idWYpICs9IChpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChpbmxlZnQpIC09IChpKTsKKyNkZWZpbmUgTkVYVF9PVVQobykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKm91dGJ1ZikgKz0gKG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAob3V0bGVmdCkgLT0gKG8pOworI2RlZmluZSBORVhUKGksIG8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE5FWFRfSU4oaSkgTkVYVF9PVVQobykKIAotI2RlZmluZSBSRVFVSVJFX0lOQlVGKG4pCQkJXAotCWlmIChpbmxlZnQgPCAobikpCQkJXAotCQlyZXR1cm4gTUJFUlJfVE9PRkVXOwotI2RlZmluZSBSRVFVSVJFX09VVEJVRihuKQkJCVwKLQlpZiAob3V0bGVmdCA8IChuKSkJCQlcCi0JCXJldHVybiBNQkVSUl9UT09TTUFMTDsKKyNkZWZpbmUgUkVRVUlSRV9JTkJVRihuKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoaW5sZWZ0IDwgKG4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIE1CRVJSX1RPT0ZFVzsKKyNkZWZpbmUgUkVRVUlSRV9PVVRCVUYobikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAob3V0bGVmdCA8IChuKSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIE1CRVJSX1RPT1NNQUxMOwogCiAjZGVmaW5lIElOMSAoKCppbmJ1ZilbMF0pCiAjZGVmaW5lIElOMiAoKCppbmJ1ZilbMV0pCkBAIC0xMjYsMjczICsxMjYsMjczIEBACiAjZGVmaW5lIE9VVDMoYykgKCgqb3V0YnVmKVsyXSkgPSAoYyk7CiAjZGVmaW5lIE9VVDQoYykgKCgqb3V0YnVmKVszXSkgPSAoYyk7CiAKLSNkZWZpbmUgV1JJVEUxKGMxKQkJXAotCVJFUVVJUkVfT1VUQlVGKDEpCVwKLQkoKm91dGJ1ZilbMF0gPSAoYzEpOwotI2RlZmluZSBXUklURTIoYzEsIGMyKQkJXAotCVJFUVVJUkVfT1VUQlVGKDIpCVwKLQkoKm91dGJ1ZilbMF0gPSAoYzEpOwlcCi0JKCpvdXRidWYpWzFdID0gKGMyKTsKLSNkZWZpbmUgV1JJVEUzKGMxLCBjMiwgYzMpCVwKLQlSRVFVSVJFX09VVEJVRigzKQlcCi0JKCpvdXRidWYpWzBdID0gKGMxKTsJXAotCSgqb3V0YnVmKVsxXSA9IChjMik7CVwKLQkoKm91dGJ1ZilbMl0gPSAoYzMpOwotI2RlZmluZSBXUklURTQoYzEsIGMyLCBjMywgYzQpCVwKLQlSRVFVSVJFX09VVEJVRig0KQlcCi0JKCpvdXRidWYpWzBdID0gKGMxKTsJXAotCSgqb3V0YnVmKVsxXSA9IChjMik7CVwKLQkoKm91dGJ1ZilbMl0gPSAoYzMpOwlcCi0JKCpvdXRidWYpWzNdID0gKGM0KTsKKyNkZWZpbmUgV1JJVEUxKGMxKSAgICAgICAgICAgICAgXAorICAgIFJFUVVJUkVfT1VUQlVGKDEpICAgICAgICAgICBcCisgICAgKCpvdXRidWYpWzBdID0gKGMxKTsKKyNkZWZpbmUgV1JJVEUyKGMxLCBjMikgICAgICAgICAgXAorICAgIFJFUVVJUkVfT1VUQlVGKDIpICAgICAgICAgICBcCisgICAgKCpvdXRidWYpWzBdID0gKGMxKTsgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbMV0gPSAoYzIpOworI2RlZmluZSBXUklURTMoYzEsIGMyLCBjMykgICAgICBcCisgICAgUkVRVUlSRV9PVVRCVUYoMykgICAgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbMF0gPSAoYzEpOyAgICAgICAgXAorICAgICgqb3V0YnVmKVsxXSA9IChjMik7ICAgICAgICBcCisgICAgKCpvdXRidWYpWzJdID0gKGMzKTsKKyNkZWZpbmUgV1JJVEU0KGMxLCBjMiwgYzMsIGM0KSAgXAorICAgIFJFUVVJUkVfT1VUQlVGKDQpICAgICAgICAgICBcCisgICAgKCpvdXRidWYpWzBdID0gKGMxKTsgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbMV0gPSAoYzIpOyAgICAgICAgXAorICAgICgqb3V0YnVmKVsyXSA9IChjMyk7ICAgICAgICBcCisgICAgKCpvdXRidWYpWzNdID0gKGM0KTsKIAogI2lmIFB5X1VOSUNPREVfU0laRSA9PSAyCi0jIGRlZmluZSBXUklURVVDUzQoYykJCQkJCQlcCi0JUkVRVUlSRV9PVVRCVUYoMikJCQkJCVwKLQkoKm91dGJ1ZilbMF0gPSAweGQ4MDAgKyAoKChjKSAtIDB4MTAwMDApID4+IDEwKTsJXAotCSgqb3V0YnVmKVsxXSA9IDB4ZGMwMCArICgoKGMpIC0gMHgxMDAwMCkgJiAweDNmZik7CVwKLQlORVhUX09VVCgyKQorIyBkZWZpbmUgV1JJVEVVQ1M0KGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSRVFVSVJFX09VVEJVRigyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpvdXRidWYpWzBdID0gMHhkODAwICsgKCgoYykgLSAweDEwMDAwKSA+PiAxMCk7ICAgICAgICAgICAgXAorICAgICgqb3V0YnVmKVsxXSA9IDB4ZGMwMCArICgoKGMpIC0gMHgxMDAwMCkgJiAweDNmZik7ICAgICAgICAgIFwKKyAgICBORVhUX09VVCgyKQogI2Vsc2UKLSMgZGVmaW5lIFdSSVRFVUNTNChjKQkJCQkJCVwKLQlSRVFVSVJFX09VVEJVRigxKQkJCQkJXAotCSoqb3V0YnVmID0gKFB5X1VOSUNPREUpKGMpOwkJCQlcCi0JTkVYVF9PVVQoMSkKKyMgZGVmaW5lIFdSSVRFVUNTNChjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkVRVUlSRV9PVVRCVUYoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICoqb3V0YnVmID0gKFB5X1VOSUNPREUpKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBORVhUX09VVCgxKQogI2VuZGlmCiAKLSNkZWZpbmUgX1RSWU1BUF9FTkMobSwgYXNzaSwgdmFsKQkJCQlcCi0JKChtKS0+bWFwICE9IE5VTEwgJiYgKHZhbCkgPj0gKG0pLT5ib3R0b20gJiYJCVwKLQkgICAgKHZhbCk8PSAobSktPnRvcCAmJiAoKGFzc2kpID0gKG0pLT5tYXBbKHZhbCkgLQlcCi0JICAgIChtKS0+Ym90dG9tXSkgIT0gTk9DSEFSKQotI2RlZmluZSBUUllNQVBfRU5DX0NPTkQoY2hhcnNldCwgYXNzaSwgdW5pKQkJCVwKLQlfVFJZTUFQX0VOQygmY2hhcnNldCMjX2VuY21hcFsodW5pKSA+PiA4XSwgYXNzaSwgKHVuaSkgJiAweGZmKQotI2RlZmluZSBUUllNQVBfRU5DKGNoYXJzZXQsIGFzc2ksIHVuaSkJCQkJXAotCWlmIFRSWU1BUF9FTkNfQ09ORChjaGFyc2V0LCBhc3NpLCB1bmkpCisjZGVmaW5lIF9UUllNQVBfRU5DKG0sIGFzc2ksIHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgobSktPm1hcCAhPSBOVUxMICYmICh2YWwpID49IChtKS0+Ym90dG9tICYmICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZhbCk8PSAobSktPnRvcCAmJiAoKGFzc2kpID0gKG0pLT5tYXBbKHZhbCkgLSAgICAgICAgICBcCisgICAgICAgIChtKS0+Ym90dG9tXSkgIT0gTk9DSEFSKQorI2RlZmluZSBUUllNQVBfRU5DX0NPTkQoY2hhcnNldCwgYXNzaSwgdW5pKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfVFJZTUFQX0VOQygmY2hhcnNldCMjX2VuY21hcFsodW5pKSA+PiA4XSwgYXNzaSwgKHVuaSkgJiAweGZmKQorI2RlZmluZSBUUllNQVBfRU5DKGNoYXJzZXQsIGFzc2ksIHVuaSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiBUUllNQVBfRU5DX0NPTkQoY2hhcnNldCwgYXNzaSwgdW5pKQogCi0jZGVmaW5lIF9UUllNQVBfREVDKG0sIGFzc2ksIHZhbCkJCQkJXAotCSgobSktPm1hcCAhPSBOVUxMICYmICh2YWwpID49IChtKS0+Ym90dG9tICYmCQlcCi0JICAgICh2YWwpPD0gKG0pLT50b3AgJiYgKChhc3NpKSA9IChtKS0+bWFwWyh2YWwpIC0JXAotCSAgICAobSktPmJvdHRvbV0pICE9IFVOSUlOVikKLSNkZWZpbmUgVFJZTUFQX0RFQyhjaGFyc2V0LCBhc3NpLCBjMSwgYzIpCQkJXAotCWlmIF9UUllNQVBfREVDKCZjaGFyc2V0IyNfZGVjbWFwW2MxXSwgYXNzaSwgYzIpCisjZGVmaW5lIF9UUllNQVBfREVDKG0sIGFzc2ksIHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgobSktPm1hcCAhPSBOVUxMICYmICh2YWwpID49IChtKS0+Ym90dG9tICYmICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZhbCk8PSAobSktPnRvcCAmJiAoKGFzc2kpID0gKG0pLT5tYXBbKHZhbCkgLSAgICAgICAgICBcCisgICAgICAgIChtKS0+Ym90dG9tXSkgIT0gVU5JSU5WKQorI2RlZmluZSBUUllNQVBfREVDKGNoYXJzZXQsIGFzc2ksIGMxLCBjMikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiBfVFJZTUFQX0RFQygmY2hhcnNldCMjX2RlY21hcFtjMV0sIGFzc2ksIGMyKQogCi0jZGVmaW5lIF9UUllNQVBfRU5DX01QTEFORShtLCBhc3NwbGFuZSwgYXNzaGksIGFzc2xvLCB2YWwpCVwKLQkoKG0pLT5tYXAgIT0gTlVMTCAmJiAodmFsKSA+PSAobSktPmJvdHRvbSAmJgkJXAotCSAgICAodmFsKTw9IChtKS0+dG9wICYmCQkJCQlcCi0JICAgICgoYXNzcGxhbmUpID0gKG0pLT5tYXBbKCh2YWwpIC0gKG0pLT5ib3R0b20pKjNdKSAhPSAwICYmIFwKLQkgICAgKCgoYXNzaGkpID0gKG0pLT5tYXBbKCh2YWwpIC0gKG0pLT5ib3R0b20pKjMgKyAxXSksIDEpICYmIFwKLQkgICAgKCgoYXNzbG8pID0gKG0pLT5tYXBbKCh2YWwpIC0gKG0pLT5ib3R0b20pKjMgKyAyXSksIDEpKQotI2RlZmluZSBUUllNQVBfRU5DX01QTEFORShjaGFyc2V0LCBhc3NwbGFuZSwgYXNzaGksIGFzc2xvLCB1bmkpCVwKLQlpZiBfVFJZTUFQX0VOQ19NUExBTkUoJmNoYXJzZXQjI19lbmNtYXBbKHVuaSkgPj4gOF0sIFwKLQkJCSAgIGFzc3BsYW5lLCBhc3NoaSwgYXNzbG8sICh1bmkpICYgMHhmZikKLSNkZWZpbmUgVFJZTUFQX0RFQ19NUExBTkUoY2hhcnNldCwgYXNzaSwgcGxhbmUsIGMxLCBjMikJCVwKLQlpZiBfVFJZTUFQX0RFQygmY2hhcnNldCMjX2RlY21hcFtwbGFuZV1bYzFdLCBhc3NpLCBjMikKKyNkZWZpbmUgX1RSWU1BUF9FTkNfTVBMQU5FKG0sIGFzc3BsYW5lLCBhc3NoaSwgYXNzbG8sIHZhbCkgICAgICBcCisgICAgKChtKS0+bWFwICE9IE5VTEwgJiYgKHZhbCkgPj0gKG0pLT5ib3R0b20gJiYgICAgICAgICAgICAgICAgXAorICAgICAgICAodmFsKTw9IChtKS0+dG9wICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKChhc3NwbGFuZSkgPSAobSktPm1hcFsoKHZhbCkgLSAobSktPmJvdHRvbSkqM10pICE9IDAgJiYgXAorICAgICAgICAoKChhc3NoaSkgPSAobSktPm1hcFsoKHZhbCkgLSAobSktPmJvdHRvbSkqMyArIDFdKSwgMSkgJiYgXAorICAgICAgICAoKChhc3NsbykgPSAobSktPm1hcFsoKHZhbCkgLSAobSktPmJvdHRvbSkqMyArIDJdKSwgMSkpCisjZGVmaW5lIFRSWU1BUF9FTkNfTVBMQU5FKGNoYXJzZXQsIGFzc3BsYW5lLCBhc3NoaSwgYXNzbG8sIHVuaSkgXAorICAgIGlmIF9UUllNQVBfRU5DX01QTEFORSgmY2hhcnNldCMjX2VuY21hcFsodW5pKSA+PiA4XSwgXAorICAgICAgICAgICAgICAgICAgICAgICBhc3NwbGFuZSwgYXNzaGksIGFzc2xvLCAodW5pKSAmIDB4ZmYpCisjZGVmaW5lIFRSWU1BUF9ERUNfTVBMQU5FKGNoYXJzZXQsIGFzc2ksIHBsYW5lLCBjMSwgYzIpICAgICAgICAgXAorICAgIGlmIF9UUllNQVBfREVDKCZjaGFyc2V0IyNfZGVjbWFwW3BsYW5lXVtjMV0sIGFzc2ksIGMyKQogCiAjaWYgUHlfVU5JQ09ERV9TSVpFID09IDIKLSNkZWZpbmUgREVDT0RFX1NVUlJPR0FURShjKQkJCQkJXAotCWlmIChjID4+IDEwID09IDB4ZDgwMCA+PiAxMCkgeyAvKiBoaWdoIHN1cnJvZ2F0ZSAqLwlcCi0JCVJFUVVJUkVfSU5CVUYoMikJCQkJXAotCQlpZiAoSU4yID4+IDEwID09IDB4ZGMwMCA+PiAxMCkgeyAvKiBsb3cgc3Vycm9nYXRlICovIFwKLQkJICAgIGMgPSAweDEwMDAwICsgKCh1Y3M0X3QpKGMgLSAweGQ4MDApIDw8IDEwKSArIFwKLQkJCSgodWNzNF90KShJTjIpIC0gMHhkYzAwKTsJCVwKLQkJfQkJCQkJCVwKLQl9Ci0jZGVmaW5lIEdFVF9JTlNJWkUoYykJKChjKSA+IDB4ZmZmZiA/IDIgOiAxKQorI2RlZmluZSBERUNPREVfU1VSUk9HQVRFKGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYyA+PiAxMCA9PSAweGQ4MDAgPj4gMTApIHsgLyogaGlnaCBzdXJyb2dhdGUgKi8gICAgICAgICBcCisgICAgICAgIFJFUVVJUkVfSU5CVUYoMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoSU4yID4+IDEwID09IDB4ZGMwMCA+PiAxMCkgeyAvKiBsb3cgc3Vycm9nYXRlICovIFwKKyAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKCh1Y3M0X3QpKGMgLSAweGQ4MDApIDw8IDEwKSArIFwKKyAgICAgICAgICAgICgodWNzNF90KShJTjIpIC0gMHhkYzAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNkZWZpbmUgR0VUX0lOU0laRShjKSAgICgoYykgPiAweGZmZmYgPyAyIDogMSkKICNlbHNlCiAjZGVmaW5lIERFQ09ERV9TVVJST0dBVEUoYykgezt9Ci0jZGVmaW5lIEdFVF9JTlNJWkUoYykJMQorI2RlZmluZSBHRVRfSU5TSVpFKGMpICAgMQogI2VuZGlmCiAKICNkZWZpbmUgQkVHSU5fTUFQUElOR1NfTElTVCBzdGF0aWMgY29uc3Qgc3RydWN0IGRiY3NfbWFwIF9tYXBwaW5nX2xpc3RbXSA9IHsKICNkZWZpbmUgTUFQUElOR19FTkNPTkxZKGVuYykgeyNlbmMsICh2b2lkKillbmMjI19lbmNtYXAsIE5VTEx9LAogI2RlZmluZSBNQVBQSU5HX0RFQ09OTFkoZW5jKSB7I2VuYywgTlVMTCwgKHZvaWQqKWVuYyMjX2RlY21hcH0sCiAjZGVmaW5lIE1BUFBJTkdfRU5DREVDKGVuYykgeyNlbmMsICh2b2lkKillbmMjI19lbmNtYXAsICh2b2lkKillbmMjI19kZWNtYXB9LAotI2RlZmluZSBFTkRfTUFQUElOR1NfTElTVAkJCQlcCi0JeyIiLCBOVUxMLCBOVUxMfSB9OwkJCQlcCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBkYmNzX21hcCAqbWFwcGluZ19saXN0ID0JXAotCQkoY29uc3Qgc3RydWN0IGRiY3NfbWFwICopX21hcHBpbmdfbGlzdDsKKyNkZWZpbmUgRU5EX01BUFBJTkdTX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsiIiwgTlVMTCwgTlVMTH0gfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBkYmNzX21hcCAqbWFwcGluZ19saXN0ID0gICAgICAgIFwKKyAgICAgICAgKGNvbnN0IHN0cnVjdCBkYmNzX21hcCAqKV9tYXBwaW5nX2xpc3Q7CiAKICNkZWZpbmUgQkVHSU5fQ09ERUNTX0xJU1Qgc3RhdGljIGNvbnN0IE11bHRpYnl0ZUNvZGVjIF9jb2RlY19saXN0W10gPSB7Ci0jZGVmaW5lIF9TVEFURUZVTF9NRVRIT0RTKGVuYykJCVwKLQllbmMjI19lbmNvZGUsCQkJXAotCWVuYyMjX2VuY29kZV9pbml0LAkJXAotCWVuYyMjX2VuY29kZV9yZXNldCwJCVwKLQllbmMjI19kZWNvZGUsCQkJXAotCWVuYyMjX2RlY29kZV9pbml0LAkJXAotCWVuYyMjX2RlY29kZV9yZXNldCwKLSNkZWZpbmUgX1NUQVRFTEVTU19NRVRIT0RTKGVuYykJCVwKLQllbmMjI19lbmNvZGUsIE5VTEwsIE5VTEwsCVwKLQllbmMjI19kZWNvZGUsIE5VTEwsIE5VTEwsCi0jZGVmaW5lIENPREVDX1NUQVRFRlVMKGVuYykgewkJXAotCSNlbmMsIE5VTEwsIE5VTEwsCQlcCi0JX1NUQVRFRlVMX01FVEhPRFMoZW5jKQkJXAorI2RlZmluZSBfU1RBVEVGVUxfTUVUSE9EUyhlbmMpICAgICAgICAgIFwKKyAgICBlbmMjI19lbmNvZGUsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW5jIyNfZW5jb2RlX2luaXQsICAgICAgICAgICAgICAgICAgXAorICAgIGVuYyMjX2VuY29kZV9yZXNldCwgICAgICAgICAgICAgICAgIFwKKyAgICBlbmMjI19kZWNvZGUsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW5jIyNfZGVjb2RlX2luaXQsICAgICAgICAgICAgICAgICAgXAorICAgIGVuYyMjX2RlY29kZV9yZXNldCwKKyNkZWZpbmUgX1NUQVRFTEVTU19NRVRIT0RTKGVuYykgICAgICAgICBcCisgICAgZW5jIyNfZW5jb2RlLCBOVUxMLCBOVUxMLCAgICAgICAgICAgXAorICAgIGVuYyMjX2RlY29kZSwgTlVMTCwgTlVMTCwKKyNkZWZpbmUgQ09ERUNfU1RBVEVGVUwoZW5jKSB7ICAgICAgICAgICBcCisgICAgI2VuYywgTlVMTCwgTlVMTCwgICAgICAgICAgICAgICAgICAgXAorICAgIF9TVEFURUZVTF9NRVRIT0RTKGVuYykgICAgICAgICAgICAgIFwKIH0sCi0jZGVmaW5lIENPREVDX1NUQVRFTEVTUyhlbmMpIHsJCVwKLQkjZW5jLCBOVUxMLCBOVUxMLAkJXAotCV9TVEFURUxFU1NfTUVUSE9EUyhlbmMpCQlcCisjZGVmaW5lIENPREVDX1NUQVRFTEVTUyhlbmMpIHsgICAgICAgICAgXAorICAgICNlbmMsIE5VTEwsIE5VTEwsICAgICAgICAgICAgICAgICAgIFwKKyAgICBfU1RBVEVMRVNTX01FVEhPRFMoZW5jKSAgICAgICAgICAgICBcCiB9LAotI2RlZmluZSBDT0RFQ19TVEFURUxFU1NfV0lOSVQoZW5jKSB7CVwKLQkjZW5jLCBOVUxMLAkJCVwKLQllbmMjI19jb2RlY19pbml0LAkJXAotCV9TVEFURUxFU1NfTUVUSE9EUyhlbmMpCQlcCisjZGVmaW5lIENPREVDX1NUQVRFTEVTU19XSU5JVChlbmMpIHsgICAgXAorICAgICNlbmMsIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbmMjI19jb2RlY19pbml0LCAgICAgICAgICAgICAgICAgICBcCisgICAgX1NUQVRFTEVTU19NRVRIT0RTKGVuYykgICAgICAgICAgICAgXAogfSwKLSNkZWZpbmUgRU5EX0NPREVDU19MSVNUCQkJCQlcCi0JeyIiLCBOVUxMLH0gfTsJCQkJCVwKLQlzdGF0aWMgY29uc3QgTXVsdGlieXRlQ29kZWMgKmNvZGVjX2xpc3QgPQlcCi0JCShjb25zdCBNdWx0aWJ5dGVDb2RlYyAqKV9jb2RlY19saXN0OworI2RlZmluZSBFTkRfQ09ERUNTX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyIiLCBOVUxMLH0gfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgY29uc3QgTXVsdGlieXRlQ29kZWMgKmNvZGVjX2xpc3QgPSAgICAgICAgICAgXAorICAgICAgICAoY29uc3QgTXVsdGlieXRlQ29kZWMgKilfY29kZWNfbGlzdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldG11bHRpYnl0ZWNvZGVjKHZvaWQpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpjb2Z1bmMgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqY29mdW5jID0gTlVMTDsKIAotCWlmIChjb2Z1bmMgPT0gTlVMTCkgewotCQlQeU9iamVjdCAqbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygiX211bHRpYnl0ZWNvZGVjIik7Ci0JCWlmIChtb2QgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQljb2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIl9fY3JlYXRlX2NvZGVjIik7Ci0JCVB5X0RFQ1JFRihtb2QpOwotCX0KLQlyZXR1cm4gY29mdW5jOworICAgIGlmIChjb2Z1bmMgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygiX211bHRpYnl0ZWNvZGVjIik7CisgICAgICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjb2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIl9fY3JlYXRlX2NvZGVjIik7CisgICAgICAgIFB5X0RFQ1JFRihtb2QpOworICAgIH0KKyAgICByZXR1cm4gY29mdW5jOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0Y29kZWMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICplbmNvZGluZykKIHsKLQlQeU9iamVjdCAqY29kZWNvYmosICpyLCAqY29mdW5jOwotCWNvbnN0IE11bHRpYnl0ZUNvZGVjICpjb2RlYzsKLQljb25zdCBjaGFyICplbmM7CisgICAgUHlPYmplY3QgKmNvZGVjb2JqLCAqciwgKmNvZnVuYzsKKyAgICBjb25zdCBNdWx0aWJ5dGVDb2RlYyAqY29kZWM7CisgICAgY29uc3QgY2hhciAqZW5jOwogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhlbmNvZGluZykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZW5jb2RpbmcgbmFtZSBtdXN0IGJlIGEgc3RyaW5nLiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhlbmNvZGluZykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGluZyBuYW1lIG11c3QgYmUgYSBzdHJpbmcuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWNvZnVuYyA9IGdldG11bHRpYnl0ZWNvZGVjKCk7Ci0JaWYgKGNvZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjb2Z1bmMgPSBnZXRtdWx0aWJ5dGVjb2RlYygpOworICAgIGlmIChjb2Z1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllbmMgPSBQeVN0cmluZ19BU19TVFJJTkcoZW5jb2RpbmcpOwotCWZvciAoY29kZWMgPSBjb2RlY19saXN0OyBjb2RlYy0+ZW5jb2RpbmdbMF07IGNvZGVjKyspCi0JCWlmIChzdHJjbXAoY29kZWMtPmVuY29kaW5nLCBlbmMpID09IDApCi0JCQlicmVhazsKKyAgICBlbmMgPSBQeVN0cmluZ19BU19TVFJJTkcoZW5jb2RpbmcpOworICAgIGZvciAoY29kZWMgPSBjb2RlY19saXN0OyBjb2RlYy0+ZW5jb2RpbmdbMF07IGNvZGVjKyspCisgICAgICAgIGlmIChzdHJjbXAoY29kZWMtPmVuY29kaW5nLCBlbmMpID09IDApCisgICAgICAgICAgICBicmVhazsKIAotCWlmIChjb2RlYy0+ZW5jb2RpbmdbMF0gPT0gJ1wwJykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTG9va3VwRXJyb3IsCi0JCQkJIm5vIHN1Y2ggY29kZWMgaXMgc3VwcG9ydGVkLiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGNvZGVjLT5lbmNvZGluZ1swXSA9PSAnXDAnKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Mb29rdXBFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJubyBzdWNoIGNvZGVjIGlzIHN1cHBvcnRlZC4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JY29kZWNvYmogPSBQeUNhcHN1bGVfTmV3KCh2b2lkICopY29kZWMsIFB5TXVsdGlieXRlQ29kZWNfQ0FQU1VMRV9OQU1FLCBOVUxMKTsKLQlpZiAoY29kZWNvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY29kZWNvYmogPSBQeUNhcHN1bGVfTmV3KCh2b2lkICopY29kZWMsIFB5TXVsdGlieXRlQ29kZWNfQ0FQU1VMRV9OQU1FLCBOVUxMKTsKKyAgICBpZiAoY29kZWNvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjb2Z1bmMsIGNvZGVjb2JqLCBOVUxMKTsKLQlQeV9ERUNSRUYoY29kZWNvYmopOworICAgIHIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNvZnVuYywgY29kZWNvYmosIE5VTEwpOworICAgIFB5X0RFQ1JFRihjb2RlY29iaik7CiAKLQlyZXR1cm4gcjsKKyAgICByZXR1cm4gcjsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBfX21ldGhvZHNbXSA9IHsKLQl7ImdldGNvZGVjIiwgKFB5Q0Z1bmN0aW9uKWdldGNvZGVjLCBNRVRIX08sICIifSwKLQl7TlVMTCwgTlVMTH0sCisgICAgeyJnZXRjb2RlYyIsIChQeUNGdW5jdGlvbilnZXRjb2RlYywgTUVUSF9PLCAiIn0sCisgICAge05VTEwsIE5VTEx9LAogfTsKIAogc3RhdGljIGludAogcmVnaXN0ZXJfbWFwcyhQeU9iamVjdCAqbW9kdWxlKQogewotCWNvbnN0IHN0cnVjdCBkYmNzX21hcCAqaDsKKyAgICBjb25zdCBzdHJ1Y3QgZGJjc19tYXAgKmg7CiAKLQlmb3IgKGggPSBtYXBwaW5nX2xpc3Q7IGgtPmNoYXJzZXRbMF0gIT0gJ1wwJzsgaCsrKSB7Ci0JCWNoYXIgbWhuYW1lWzI1Nl0gPSAiX19tYXBfIjsKLQkJaW50IHI7Ci0JCXN0cmNweShtaG5hbWUgKyBzaXplb2YoIl9fbWFwXyIpIC0gMSwgaC0+Y2hhcnNldCk7Ci0JCXIgPSBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCBtaG5hbWUsCi0JCQkJUHlDYXBzdWxlX05ldygodm9pZCAqKWgsIFB5TXVsdGlieXRlQ29kZWNfQ0FQU1VMRV9OQU1FLCBOVUxMKSk7Ci0JCWlmIChyID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBmb3IgKGggPSBtYXBwaW5nX2xpc3Q7IGgtPmNoYXJzZXRbMF0gIT0gJ1wwJzsgaCsrKSB7CisgICAgICAgIGNoYXIgbWhuYW1lWzI1Nl0gPSAiX19tYXBfIjsKKyAgICAgICAgaW50IHI7CisgICAgICAgIHN0cmNweShtaG5hbWUgKyBzaXplb2YoIl9fbWFwXyIpIC0gMSwgaC0+Y2hhcnNldCk7CisgICAgICAgIHIgPSBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCBtaG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUNhcHN1bGVfTmV3KCh2b2lkICopaCwgUHlNdWx0aWJ5dGVDb2RlY19DQVBTVUxFX05BTUUsIE5VTEwpKTsKKyAgICAgICAgaWYgKHIgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAjaWZkZWYgVVNJTkdfQklOQVJZX1BBSVJfU0VBUkNICiBzdGF0aWMgREJDSEFSCiBmaW5kX3BhaXJlbmNtYXAodWNzMl90IGJvZHksIHVjczJfdCBtb2RpZmllciwKLQkJY29uc3Qgc3RydWN0IHBhaXJfZW5jb2RlbWFwICpoYXlzdGFjaywgaW50IGhheXN0YWNrc2l6ZSkKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGFpcl9lbmNvZGVtYXAgKmhheXN0YWNrLCBpbnQgaGF5c3RhY2tzaXplKQogewotCWludCBwb3MsIG1pbiwgbWF4OwotCXVjczRfdCB2YWx1ZSA9IGJvZHkgPDwgMTYgfCBtb2RpZmllcjsKKyAgICBpbnQgcG9zLCBtaW4sIG1heDsKKyAgICB1Y3M0X3QgdmFsdWUgPSBib2R5IDw8IDE2IHwgbW9kaWZpZXI7CiAKLQltaW4gPSAwOwotCW1heCA9IGhheXN0YWNrc2l6ZTsKKyAgICBtaW4gPSAwOworICAgIG1heCA9IGhheXN0YWNrc2l6ZTsKIAotCWZvciAocG9zID0gaGF5c3RhY2tzaXplID4+IDE7IG1pbiAhPSBtYXg7IHBvcyA9IChtaW4gKyBtYXgpID4+IDEpCi0JCWlmICh2YWx1ZSA8IGhheXN0YWNrW3Bvc10udW5pc2VxKSB7Ci0JCQlpZiAobWF4ID09IHBvcykgYnJlYWs7Ci0JCQllbHNlIG1heCA9IHBvczsKLQkJfQotCQllbHNlIGlmICh2YWx1ZSA+IGhheXN0YWNrW3Bvc10udW5pc2VxKSB7Ci0JCQlpZiAobWluID09IHBvcykgYnJlYWs7Ci0JCQllbHNlIG1pbiA9IHBvczsKLQkJfQotCQllbHNlCi0JCQlicmVhazsKKyAgICBmb3IgKHBvcyA9IGhheXN0YWNrc2l6ZSA+PiAxOyBtaW4gIT0gbWF4OyBwb3MgPSAobWluICsgbWF4KSA+PiAxKQorICAgICAgICBpZiAodmFsdWUgPCBoYXlzdGFja1twb3NdLnVuaXNlcSkgeworICAgICAgICAgICAgaWYgKG1heCA9PSBwb3MpIGJyZWFrOworICAgICAgICAgICAgZWxzZSBtYXggPSBwb3M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBoYXlzdGFja1twb3NdLnVuaXNlcSkgeworICAgICAgICAgICAgaWYgKG1pbiA9PSBwb3MpIGJyZWFrOworICAgICAgICAgICAgZWxzZSBtaW4gPSBwb3M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJaWYgKHZhbHVlID09IGhheXN0YWNrW3Bvc10udW5pc2VxKQotCQkJcmV0dXJuIGhheXN0YWNrW3Bvc10uY29kZTsKLQkJZWxzZQotCQkJcmV0dXJuIERCQ0lOVjsKKyAgICAgICAgaWYgKHZhbHVlID09IGhheXN0YWNrW3Bvc10udW5pc2VxKQorICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrW3Bvc10uY29kZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIERCQ0lOVjsKIH0KICNlbmRpZgogCiAjaWZkZWYgVVNJTkdfSU1QT1JURURfTUFQUwogI2RlZmluZSBJTVBPUlRfTUFQKGxvY2FsZSwgY2hhcnNldCwgZW5jbWFwLCBkZWNtYXApIFwKLQlpbXBvcnRtYXAoIl9jb2RlY3NfIiAjbG9jYWxlLCAiX19tYXBfIiAjY2hhcnNldCwgXAotCQkgIChjb25zdCB2b2lkKiopZW5jbWFwLCAoY29uc3Qgdm9pZCoqKWRlY21hcCkKKyAgICBpbXBvcnRtYXAoIl9jb2RlY3NfIiAjbG9jYWxlLCAiX19tYXBfIiAjY2hhcnNldCwgXAorICAgICAgICAgICAgICAoY29uc3Qgdm9pZCoqKWVuY21hcCwgKGNvbnN0IHZvaWQqKilkZWNtYXApCiAKIHN0YXRpYyBpbnQKIGltcG9ydG1hcChjb25zdCBjaGFyICptb2RuYW1lLCBjb25zdCBjaGFyICpzeW1ib2wsCi0JICBjb25zdCB2b2lkICoqZW5jbWFwLCBjb25zdCB2b2lkICoqZGVjbWFwKQorICAgICAgICAgIGNvbnN0IHZvaWQgKiplbmNtYXAsIGNvbnN0IHZvaWQgKipkZWNtYXApCiB7Ci0JUHlPYmplY3QgKm8sICptb2Q7CisgICAgUHlPYmplY3QgKm8sICptb2Q7CiAKLQltb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoKGNoYXIgKiltb2RuYW1lKTsKLQlpZiAobW9kID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoKGNoYXIgKiltb2RuYW1lKTsKKyAgICBpZiAobW9kID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCW8gPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgKGNoYXIqKXN5bWJvbCk7Ci0JaWYgKG8gPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JZWxzZSBpZiAoIVB5Q2Fwc3VsZV9Jc1ZhbGlkKG8sIFB5TXVsdGlieXRlQ29kZWNfQ0FQU1VMRV9OQU1FKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibWFwIGRhdGEgbXVzdCBiZSBhIENhcHN1bGUuIik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KLQllbHNlIHsKLQkJc3RydWN0IGRiY3NfbWFwICptYXA7Ci0JCW1hcCA9IFB5Q2Fwc3VsZV9HZXRQb2ludGVyKG8sIFB5TXVsdGlieXRlQ29kZWNfQ0FQU1VMRV9OQU1FKTsKLQkJaWYgKGVuY21hcCAhPSBOVUxMKQotCQkJKmVuY21hcCA9IG1hcC0+ZW5jbWFwOwotCQlpZiAoZGVjbWFwICE9IE5VTEwpCi0JCQkqZGVjbWFwID0gbWFwLT5kZWNtYXA7Ci0JCVB5X0RFQ1JFRihvKTsKLQl9CisgICAgbyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAoY2hhciopc3ltYm9sKTsKKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBlbHNlIGlmICghUHlDYXBzdWxlX0lzVmFsaWQobywgUHlNdWx0aWJ5dGVDb2RlY19DQVBTVUxFX05BTUUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1hcCBkYXRhIG11c3QgYmUgYSBDYXBzdWxlLiIpOworICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0cnVjdCBkYmNzX21hcCAqbWFwOworICAgICAgICBtYXAgPSBQeUNhcHN1bGVfR2V0UG9pbnRlcihvLCBQeU11bHRpYnl0ZUNvZGVjX0NBUFNVTEVfTkFNRSk7CisgICAgICAgIGlmIChlbmNtYXAgIT0gTlVMTCkKKyAgICAgICAgICAgICplbmNtYXAgPSBtYXAtPmVuY21hcDsKKyAgICAgICAgaWYgKGRlY21hcCAhPSBOVUxMKQorICAgICAgICAgICAgKmRlY21hcCA9IG1hcC0+ZGVjbWFwOworICAgICAgICBQeV9ERUNSRUYobyk7CisgICAgfQogCi0JUHlfREVDUkVGKG1vZCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKG1vZCk7CisgICAgcmV0dXJuIDA7CiAKIGVycm9yZXhpdDoKLQlQeV9ERUNSRUYobW9kKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKG1vZCk7CisgICAgcmV0dXJuIC0xOwogfQogI2VuZGlmCiAKLSNkZWZpbmUgSV9BTV9BX01PRFVMRV9GT1IobG9jKQkJCQkJCVwKLQl2b2lkCQkJCQkJCQlcCi0JaW5pdF9jb2RlY3NfIyNsb2Modm9pZCkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQlQeU9iamVjdCAqbSA9IFB5X0luaXRNb2R1bGUoIl9jb2RlY3NfIiAjbG9jLCBfX21ldGhvZHMpO1wKLQkJaWYgKG0gIT0gTlVMTCkJCQkJCQlcCi0JCQkodm9pZClyZWdpc3Rlcl9tYXBzKG0pOwkJCQlcCi0JfQorI2RlZmluZSBJX0FNX0FfTU9EVUxFX0ZPUihsb2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluaXRfY29kZWNzXyMjbG9jKHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeU9iamVjdCAqbSA9IFB5X0luaXRNb2R1bGUoIl9jb2RlY3NfIiAjbG9jLCBfX21ldGhvZHMpO1wKKyAgICAgICAgaWYgKG0gIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh2b2lkKXJlZ2lzdGVyX21hcHMobSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvZW11X2ppc3gwMjEzXzIwMDAuaCBiL01vZHVsZXMvY2prY29kZWNzL2VtdV9qaXN4MDIxM18yMDAwLmgKaW5kZXggMjUwYzY3My4uNDIyN2ZiMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvZW11X2ppc3gwMjEzXzIwMDAuaAorKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9lbXVfamlzeDAyMTNfMjAwMC5oCkBAIC01LDM5ICs1LDM5IEBACiAjZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfSU5WQUxJRCAxCiAjZW5kaWYKIAotI2RlZmluZSBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0JNUChhc3NpLCBjKQkJCVwKLQlpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoCQkJCQlcCi0JCQkoYykgPT0gMHg5QjFDIHx8IChjKSA9PSAweDRGRjEgfHwJCVwKLQkJCShjKSA9PSAweDUyNUQgfHwgKGMpID09IDB4NTQxRSB8fAkJXAotCQkJKGMpID09IDB4NTY1MyB8fCAoYykgPT0gMHg1OUY4IHx8CQlcCi0JCQkoYykgPT0gMHg1QzVCIHx8IChjKSA9PSAweDVFNzcgfHwJCVwKLQkJCShjKSA9PSAweDc2MjYgfHwgKGMpID09IDB4N0U2QikpCQlcCi0JCXJldHVybiBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0lOVkFMSUQ7CQlcCi0JZWxzZSBpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoYykgPT0gMHg5QjFEKQkJXAotCQkoYXNzaSkgPSAweDgwMDAgfCAweDdkM2I7CQkJCVwKKyNkZWZpbmUgRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9CTVAoYXNzaSwgYykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKGMpID09IDB4OUIxQyB8fCAoYykgPT0gMHg0RkYxIHx8ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKGMpID09IDB4NTI1RCB8fCAoYykgPT0gMHg1NDFFIHx8ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKGMpID09IDB4NTY1MyB8fCAoYykgPT0gMHg1OUY4IHx8ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKGMpID09IDB4NUM1QiB8fCAoYykgPT0gMHg1RTc3IHx8ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKGMpID09IDB4NzYyNiB8fCAoYykgPT0gMHg3RTZCKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfSU5WQUxJRDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmIChjb25maWcgPT0gKHZvaWQgKikyMDAwICYmIChjKSA9PSAweDlCMUQpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGFzc2kpID0gMHg4MDAwIHwgMHg3ZDNiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAotI2RlZmluZSBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0VNUChhc3NpLCBjKQkJCVwKLQlpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoYykgPT0gMHgyMEI5RikJCQlcCi0JCXJldHVybiBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0lOVkFMSUQ7CisjZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfRU1QKGFzc2ksIGMpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNvbmZpZyA9PSAodm9pZCAqKTIwMDAgJiYgKGMpID09IDB4MjBCOUYpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0lOVkFMSUQ7CiAKICNpZm5kZWYgRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9JTlZBTElECiAjZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfSU5WQUxJRCAyCiAjZW5kaWYKIAotI2RlZmluZSBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMShhc3NpLCBjMSwgYzIpCQlcCi0JaWYgKGNvbmZpZyA9PSAodm9pZCAqKTIwMDAgJiYJCQkJCVwKLQkJCSgoKGMxKSA9PSAweDJFICYmIChjMikgPT0gMHgyMSkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDJGICYmIChjMikgPT0gMHg3RSkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDRGICYmIChjMikgPT0gMHg1NCkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDRGICYmIChjMikgPT0gMHg3RSkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDc0ICYmIChjMikgPT0gMHgyNykgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3QSkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3QikgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3QykgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3RCkgfHwJCVwKLQkJCSAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3RSkpKQkJXAotCQlyZXR1cm4gRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9JTlZBTElEOworI2RlZmluZSBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMShhc3NpLCBjMSwgYzIpICAgICAgICAgICAgICAgXAorICAgIGlmIChjb25maWcgPT0gKHZvaWQgKikyMDAwICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoKChjMSkgPT0gMHgyRSAmJiAoYzIpID09IDB4MjEpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHgyRiAmJiAoYzIpID09IDB4N0UpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg0RiAmJiAoYzIpID09IDB4NTQpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg0RiAmJiAoYzIpID09IDB4N0UpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3NCAmJiAoYzIpID09IDB4MjcpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3RSAmJiAoYzIpID09IDB4N0EpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3RSAmJiAoYzIpID09IDB4N0IpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3RSAmJiAoYzIpID09IDB4N0MpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3RSAmJiAoYzIpID09IDB4N0QpIHx8ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChjMSkgPT0gMHg3RSAmJiAoYzIpID09IDB4N0UpKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9JTlZBTElEOwogCi0jZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUyKGFzc2ksIGMxLCBjMikJCVwKLQlpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoYzEpID09IDB4N0QgJiYgKGMyKSA9PSAweDNCKQlcCi0JCShhc3NpKSA9IDB4OUIxRDsKKyNkZWZpbmUgRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTIoYXNzaSwgYzEsIGMyKSAgICAgICAgICAgICAgIFwKKyAgICBpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoYzEpID09IDB4N0QgJiYgKGMyKSA9PSAweDNCKSAgICAgICAgIFwKKyAgICAgICAgKGFzc2kpID0gMHg5QjFEOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYyBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmMKaW5kZXggNzk0Nzc0Yi4uNTYyNTFmMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jCkBAIC00NSwxNzAgKzQ1LDE3MCBAQAogc3RhdGljIGNoYXIgKnN0cmVhbWt3YXJnbGlzdFtdID0geyJzdHJlYW0iLCAiZXJyb3JzIiwgTlVMTH07CiAKIHN0YXRpYyBQeU9iamVjdCAqbXVsdGlieXRlY29kZWNfZW5jb2RlKE11bHRpYnl0ZUNvZGVjICosCi0JCU11bHRpYnl0ZUNvZGVjX1N0YXRlICosIGNvbnN0IFB5X1VOSUNPREUgKiosIFB5X3NzaXplX3QsCi0JCVB5T2JqZWN0ICosIGludCk7CisgICAgICAgICAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKiwgY29uc3QgUHlfVU5JQ09ERSAqKiwgUHlfc3NpemVfdCwKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBpbnQpOwogCi0jZGVmaW5lIE1CRU5DX1JFU0VUCU1CRU5DX01BWDw8MSAvKiByZXNldCBhZnRlciBhbiBlbmNvZGluZyBzZXNzaW9uICovCisjZGVmaW5lIE1CRU5DX1JFU0VUICAgICBNQkVOQ19NQVg8PDEgLyogcmVzZXQgYWZ0ZXIgYW4gZW5jb2Rpbmcgc2Vzc2lvbiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogbWFrZV90dXBsZShQeU9iamVjdCAqb2JqZWN0LCBQeV9zc2l6ZV90IGxlbikKIHsKLQlQeU9iamVjdCAqdiwgKnc7CisgICAgUHlPYmplY3QgKnYsICp3OwogCi0JaWYgKG9iamVjdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAob2JqZWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdiA9IFB5VHVwbGVfTmV3KDIpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG9iamVjdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeVR1cGxlX1NFVF9JVEVNKHYsIDAsIG9iamVjdCk7CisgICAgdiA9IFB5VHVwbGVfTmV3KDIpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG9iamVjdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIDAsIG9iamVjdCk7CiAKLQl3ID0gUHlJbnRfRnJvbVNzaXplX3QobGVuKTsKLQlpZiAodyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5VHVwbGVfU0VUX0lURU0odiwgMSwgdyk7CisgICAgdyA9IFB5SW50X0Zyb21Tc2l6ZV90KGxlbik7CisgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIDEsIHcpOwogCi0JcmV0dXJuIHY7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhjb25zdCBjaGFyICplcnJvcnMpCiB7Ci0JaWYgKGVycm9ycyA9PSBOVUxMIHx8IHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKQotCQlyZXR1cm4gRVJST1JfU1RSSUNUOwotCWVsc2UgaWYgKHN0cmNtcChlcnJvcnMsICJpZ25vcmUiKSA9PSAwKQotCQlyZXR1cm4gRVJST1JfSUdOT1JFOwotCWVsc2UgaWYgKHN0cmNtcChlcnJvcnMsICJyZXBsYWNlIikgPT0gMCkKLQkJcmV0dXJuIEVSUk9SX1JFUExBQ0U7Ci0JZWxzZQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhlcnJvcnMpOworICAgIGlmIChlcnJvcnMgPT0gTlVMTCB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX1NUUklDVDsKKyAgICBlbHNlIGlmIChzdHJjbXAoZXJyb3JzLCAiaWdub3JlIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lHTk9SRTsKKyAgICBlbHNlIGlmIChzdHJjbXAoZXJyb3JzLCAicmVwbGFjZSIpID09IDApCisgICAgICAgIHJldHVybiBFUlJPUl9SRVBMQUNFOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZXJyb3JzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZXJyb3JfY2FsbGJhY2soUHlPYmplY3QgKmVycm9ycywgUHlPYmplY3QgKmV4YykKIHsKLQlQeU9iamVjdCAqYXJncywgKmNiLCAqcjsKKyAgICBQeU9iamVjdCAqYXJncywgKmNiLCAqcjsKIAotCWFzc2VydChQeVN0cmluZ19DaGVjayhlcnJvcnMpKTsKLQljYiA9IFB5Q29kZWNfTG9va3VwRXJyb3IoUHlTdHJpbmdfQVNfU1RSSU5HKGVycm9ycykpOwotCWlmIChjYiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2soZXJyb3JzKSk7CisgICAgY2IgPSBQeUNvZGVjX0xvb2t1cEVycm9yKFB5U3RyaW5nX0FTX1NUUklORyhlcnJvcnMpKTsKKyAgICBpZiAoY2IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhcmdzID0gUHlUdXBsZV9OZXcoMSk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoY2IpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYXJncyA9IFB5VHVwbGVfTmV3KDEpOworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGNiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBleGMpOwotCVB5X0lOQ1JFRihleGMpOworICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMCwgZXhjKTsKKyAgICBQeV9JTkNSRUYoZXhjKTsKIAotCXIgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNiLCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKGNiKTsKLQlyZXR1cm4gcjsKKyAgICByID0gUHlPYmplY3RfQ2FsbE9iamVjdChjYiwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihjYik7CisgICAgcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb2RlY2N0eF9lcnJvcnNfZ2V0KE11bHRpYnl0ZVN0YXRlZnVsQ29kZWNDb250ZXh0ICpzZWxmKQogewotCWNvbnN0IGNoYXIgKmVycm9yczsKKyAgICBjb25zdCBjaGFyICplcnJvcnM7CiAKLQlpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX1NUUklDVCkKLQkJZXJyb3JzID0gInN0cmljdCI7Ci0JZWxzZSBpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX0lHTk9SRSkKLQkJZXJyb3JzID0gImlnbm9yZSI7Ci0JZWxzZSBpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX1JFUExBQ0UpCi0JCWVycm9ycyA9ICJyZXBsYWNlIjsKLQllbHNlIHsKLQkJUHlfSU5DUkVGKHNlbGYtPmVycm9ycyk7Ci0JCXJldHVybiBzZWxmLT5lcnJvcnM7Ci0JfQorICAgIGlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfU1RSSUNUKQorICAgICAgICBlcnJvcnMgPSAic3RyaWN0IjsKKyAgICBlbHNlIGlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfSUdOT1JFKQorICAgICAgICBlcnJvcnMgPSAiaWdub3JlIjsKKyAgICBlbHNlIGlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkKKyAgICAgICAgZXJyb3JzID0gInJlcGxhY2UiOworICAgIGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+ZXJyb3JzKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPmVycm9yczsKKyAgICB9CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhlcnJvcnMpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGVycm9ycyk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvZGVjY3R4X2Vycm9yc19zZXQoTXVsdGlieXRlU3RhdGVmdWxDb2RlY0NvbnRleHQgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKLQkJICAgIHZvaWQgKmNsb3N1cmUpCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlPYmplY3QgKmNiOworICAgIFB5T2JqZWN0ICpjYjsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJlcnJvcnMgbXVzdCBiZSBhIHN0cmluZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJlcnJvcnMgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JY2IgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpKTsKLQlpZiAoY2IgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGNiID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSk7CisgICAgaWYgKGNiID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCUVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOwotCXNlbGYtPmVycm9ycyA9IGNiOwotCXJldHVybiAwOworICAgIEVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOworICAgIHNlbGYtPmVycm9ycyA9IGNiOworICAgIHJldHVybiAwOwogfQogCiAvKiBUaGlzIGdldHNldCBoYW5kbGVycyBsaXN0IGlzIHVzZWQgYnkgYWxsIHRoZSBzdGF0ZWZ1bCBjb2RlYyBvYmplY3RzICovCiBzdGF0aWMgUHlHZXRTZXREZWYgY29kZWNjdHhfZ2V0c2V0c1tdID0gewotCXsiZXJyb3JzIiwJKGdldHRlciljb2RlY2N0eF9lcnJvcnNfZ2V0LAotCQkJKHNldHRlciljb2RlY2N0eF9lcnJvcnNfc2V0LAotCQkJUHlEb2NfU1RSKCJob3cgdG8gdHJlYXQgZXJyb3JzIil9LAotCXtOVUxMLH0KKyAgICB7ImVycm9ycyIsICAgICAgICAgIChnZXR0ZXIpY29kZWNjdHhfZXJyb3JzX2dldCwKKyAgICAgICAgICAgICAgICAgICAgKHNldHRlciljb2RlY2N0eF9lcnJvcnNfc2V0LAorICAgICAgICAgICAgICAgICAgICBQeURvY19TVFIoImhvdyB0byB0cmVhdCBlcnJvcnMiKX0sCisgICAge05VTEwsfQogfTsKIAogc3RhdGljIGludAogZXhwYW5kX2VuY29kZWJ1ZmZlcihNdWx0aWJ5dGVFbmNvZGVCdWZmZXIgKmJ1ZiwgUHlfc3NpemVfdCBlc2l6ZSkKIHsKLQlQeV9zc2l6ZV90IG9yZ3Bvcywgb3Jnc2l6ZSwgaW5jc2l6ZTsKKyAgICBQeV9zc2l6ZV90IG9yZ3Bvcywgb3Jnc2l6ZSwgaW5jc2l6ZTsKIAotCW9yZ3BvcyA9IChQeV9zc2l6ZV90KSgoY2hhciAqKWJ1Zi0+b3V0YnVmIC0KLQkJCQlQeVN0cmluZ19BU19TVFJJTkcoYnVmLT5vdXRvYmopKTsKLQlvcmdzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwotCWluY3NpemUgPSAoZXNpemUgPCAob3Jnc2l6ZSA+PiAxKSA/IChvcmdzaXplID4+IDEpIHwgMSA6IGVzaXplKTsKKyAgICBvcmdwb3MgPSAoUHlfc3NpemVfdCkoKGNoYXIgKilidWYtPm91dGJ1ZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKSk7CisgICAgb3Jnc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi0+b3V0b2JqKTsKKyAgICBpbmNzaXplID0gKGVzaXplIDwgKG9yZ3NpemUgPj4gMSkgPyAob3Jnc2l6ZSA+PiAxKSB8IDEgOiBlc2l6ZSk7CiAKLQlpZiAob3Jnc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gaW5jc2l6ZSkKLQkJcmV0dXJuIC0xOworICAgIGlmIChvcmdzaXplID4gUFlfU1NJWkVfVF9NQVggLSBpbmNzaXplKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLT5vdXRvYmosIG9yZ3NpemUgKyBpbmNzaXplKSA9PSAtMSkKLQkJcmV0dXJuIC0xOworICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYtPm91dG9iaiwgb3Jnc2l6ZSArIGluY3NpemUpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlidWYtPm91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKSArb3JncG9zOwotCWJ1Zi0+b3V0YnVmX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKQotCQkrIFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi0+b3V0b2JqKTsKKyAgICBidWYtPm91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKSArb3JncG9zOworICAgIGJ1Zi0+b3V0YnVmX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKQorICAgICAgICArIFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi0+b3V0b2JqKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQotI2RlZmluZSBSRVFVSVJFX0VOQ09ERUJVRkZFUihidWYsIHMpIHsJCQkJCVwKLQlpZiAoKHMpIDwgMSB8fCAoYnVmKS0+b3V0YnVmICsgKHMpID4gKGJ1ZiktPm91dGJ1Zl9lbmQpCQlcCi0JCWlmIChleHBhbmRfZW5jb2RlYnVmZmVyKGJ1ZiwgcykgPT0gLTEpCQkJXAotCQkJZ290byBlcnJvcmV4aXQ7CQkJCQlcCisjZGVmaW5lIFJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChzKSA8IDEgfHwgKGJ1ZiktPm91dGJ1ZiArIChzKSA+IChidWYpLT5vdXRidWZfZW5kKSAgICAgICAgICAgICBcCisgICAgICAgIGlmIChleHBhbmRfZW5jb2RlYnVmZmVyKGJ1ZiwgcykgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKIHN0YXRpYyBpbnQKIGV4cGFuZF9kZWNvZGVidWZmZXIoTXVsdGlieXRlRGVjb2RlQnVmZmVyICpidWYsIFB5X3NzaXplX3QgZXNpemUpCiB7Ci0JUHlfc3NpemVfdCBvcmdwb3MsIG9yZ3NpemU7CisgICAgUHlfc3NpemVfdCBvcmdwb3MsIG9yZ3NpemU7CiAKLQlvcmdwb3MgPSAoUHlfc3NpemVfdCkoYnVmLT5vdXRidWYgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaikpOwotCW9yZ3NpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwotCWlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYtPm91dG9iaiwgb3Jnc2l6ZSArICgKLQkgICAgZXNpemUgPCAob3Jnc2l6ZSA+PiAxKSA/IChvcmdzaXplID4+IDEpIHwgMSA6IGVzaXplKSkgPT0gLTEpCi0JCXJldHVybiAtMTsKKyAgICBvcmdwb3MgPSAoUHlfc3NpemVfdCkoYnVmLT5vdXRidWYgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaikpOworICAgIG9yZ3NpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOworICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYtPm91dG9iaiwgb3Jnc2l6ZSArICgKKyAgICAgICAgZXNpemUgPCAob3Jnc2l6ZSA+PiAxKSA/IChvcmdzaXplID4+IDEpIHwgMSA6IGVzaXplKSkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKIAotCWJ1Zi0+b3V0YnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopICsgb3JncG9zOwotCWJ1Zi0+b3V0YnVmX2VuZCA9IFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi0+b3V0b2JqKQotCQkJICArIFB5VW5pY29kZV9HRVRfU0laRShidWYtPm91dG9iaik7CisgICAgYnVmLT5vdXRidWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaikgKyBvcmdwb3M7CisgICAgYnVmLT5vdXRidWZfZW5kID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopCisgICAgICAgICAgICAgICAgICAgICAgKyBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9Ci0jZGVmaW5lIFJFUVVJUkVfREVDT0RFQlVGRkVSKGJ1ZiwgcykgewkJCQkJXAotCWlmICgocykgPCAxIHx8IChidWYpLT5vdXRidWYgKyAocykgPiAoYnVmKS0+b3V0YnVmX2VuZCkJCVwKLQkJaWYgKGV4cGFuZF9kZWNvZGVidWZmZXIoYnVmLCBzKSA9PSAtMSkJCQlcCi0JCQlnb3RvIGVycm9yZXhpdDsJCQkJCVwKKyNkZWZpbmUgUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCBzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKHMpIDwgMSB8fCAoYnVmKS0+b3V0YnVmICsgKHMpID4gKGJ1ZiktPm91dGJ1Zl9lbmQpICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGV4cGFuZF9kZWNvZGVidWZmZXIoYnVmLCBzKSA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAogCkBAIC0yMTgsNTA1ICsyMTgsNTA1IEBACiAKIHN0YXRpYyBpbnQKIG11bHRpYnl0ZWNvZGVjX2VuY2Vycm9yKE11bHRpYnl0ZUNvZGVjICpjb2RlYywKLQkJCU11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKLQkJCU11bHRpYnl0ZUVuY29kZUJ1ZmZlciAqYnVmLAotCQkJUHlPYmplY3QgKmVycm9ycywgUHlfc3NpemVfdCBlKQorICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlieXRlRW5jb2RlQnVmZmVyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZXJyb3JzLCBQeV9zc2l6ZV90IGUpCiB7Ci0JUHlPYmplY3QgKnJldG9iaiA9IE5VTEwsICpyZXRzdHIgPSBOVUxMLCAqdG9iajsKLQlQeV9zc2l6ZV90IHJldHN0cnNpemUsIG5ld3BvczsKLQlQeV9zc2l6ZV90IGVzaXplLCBzdGFydCwgZW5kOwotCWNvbnN0IGNoYXIgKnJlYXNvbjsKKyAgICBQeU9iamVjdCAqcmV0b2JqID0gTlVMTCwgKnJldHN0ciA9IE5VTEwsICp0b2JqOworICAgIFB5X3NzaXplX3QgcmV0c3Ryc2l6ZSwgbmV3cG9zOworICAgIFB5X3NzaXplX3QgZXNpemUsIHN0YXJ0LCBlbmQ7CisgICAgY29uc3QgY2hhciAqcmVhc29uOwogCi0JaWYgKGUgPiAwKSB7Ci0JCXJlYXNvbiA9ICJpbGxlZ2FsIG11bHRpYnl0ZSBzZXF1ZW5jZSI7Ci0JCWVzaXplID0gZTsKLQl9Ci0JZWxzZSB7Ci0JCXN3aXRjaCAoZSkgewotCQljYXNlIE1CRVJSX1RPT1NNQUxMOgotCQkJUkVRVUlSRV9FTkNPREVCVUZGRVIoYnVmLCAtMSk7Ci0JCQlyZXR1cm4gMDsgLyogcmV0cnkgaXQgKi8KLQkJY2FzZSBNQkVSUl9UT09GRVc6Ci0JCQlyZWFzb24gPSAiaW5jb21wbGV0ZSBtdWx0aWJ5dGUgc2VxdWVuY2UiOwotCQkJZXNpemUgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIE1CRVJSX0lOVEVSTkFMOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJImludGVybmFsIGNvZGVjIGVycm9yIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkidW5rbm93biBydW50aW1lIGVycm9yIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKGUgPiAwKSB7CisgICAgICAgIHJlYXNvbiA9ICJpbGxlZ2FsIG11bHRpYnl0ZSBzZXF1ZW5jZSI7CisgICAgICAgIGVzaXplID0gZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN3aXRjaCAoZSkgeworICAgICAgICBjYXNlIE1CRVJSX1RPT1NNQUxMOgorICAgICAgICAgICAgUkVRVUlSRV9FTkNPREVCVUZGRVIoYnVmLCAtMSk7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogcmV0cnkgaXQgKi8KKyAgICAgICAgY2FzZSBNQkVSUl9UT09GRVc6CisgICAgICAgICAgICByZWFzb24gPSAiaW5jb21wbGV0ZSBtdWx0aWJ5dGUgc2VxdWVuY2UiOworICAgICAgICAgICAgZXNpemUgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1CRVJSX0lOVEVSTkFMOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgY29kZWMgZXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gcnVudGltZSBlcnJvciIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGVycm9ycyA9PSBFUlJPUl9SRVBMQUNFKSB7Ci0JCWNvbnN0IFB5X1VOSUNPREUgcmVwbGNoYXIgPSAnPycsICppbmJ1ZiA9ICZyZXBsY2hhcjsKLQkJUHlfc3NpemVfdCByOworICAgIGlmIChlcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkgeworICAgICAgICBjb25zdCBQeV9VTklDT0RFIHJlcGxjaGFyID0gJz8nLCAqaW5idWYgPSAmcmVwbGNoYXI7CisgICAgICAgIFB5X3NzaXplX3QgcjsKIAotCQlmb3IgKDs7KSB7Ci0JCQlQeV9zc2l6ZV90IG91dGxlZnQ7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qgb3V0bGVmdDsKIAotCQkJb3V0bGVmdCA9IChQeV9zc2l6ZV90KShidWYtPm91dGJ1Zl9lbmQgLSBidWYtPm91dGJ1Zik7Ci0JCQlyID0gY29kZWMtPmVuY29kZShzdGF0ZSwgY29kZWMtPmNvbmZpZywgJmluYnVmLCAxLAotCQkJCQkgICZidWYtPm91dGJ1Ziwgb3V0bGVmdCwgMCk7Ci0JCQlpZiAociA9PSBNQkVSUl9UT09TTUFMTCkgewotCQkJCVJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgLTEpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9CisgICAgICAgICAgICBvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+b3V0YnVmX2VuZCAtIGJ1Zi0+b3V0YnVmKTsKKyAgICAgICAgICAgIHIgPSBjb2RlYy0+ZW5jb2RlKHN0YXRlLCBjb2RlYy0+Y29uZmlnLCAmaW5idWYsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLT5vdXRidWYsIG91dGxlZnQsIDApOworICAgICAgICAgICAgaWYgKHIgPT0gTUJFUlJfVE9PU01BTEwpIHsKKyAgICAgICAgICAgICAgICBSRVFVSVJFX0VOQ09ERUJVRkZFUihidWYsIC0xKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCWlmIChyICE9IDApIHsKLQkJCVJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgMSk7Ci0JCQkqYnVmLT5vdXRidWYrKyA9ICc/JzsKLQkJfQotCX0KLQlpZiAoZXJyb3JzID09IEVSUk9SX0lHTk9SRSB8fCBlcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkgewotCQlidWYtPmluYnVmICs9IGVzaXplOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmIChyICE9IDApIHsKKyAgICAgICAgICAgIFJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgMSk7CisgICAgICAgICAgICAqYnVmLT5vdXRidWYrKyA9ICc/JzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyb3JzID09IEVSUk9SX0lHTk9SRSB8fCBlcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkgeworICAgICAgICBidWYtPmluYnVmICs9IGVzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlzdGFydCA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmIC0gYnVmLT5pbmJ1Zl90b3ApOwotCWVuZCA9IHN0YXJ0ICsgZXNpemU7CisgICAgc3RhcnQgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1ZiAtIGJ1Zi0+aW5idWZfdG9wKTsKKyAgICBlbmQgPSBzdGFydCArIGVzaXplOwogCi0JLyogdXNlIGNhY2hlZCBleGNlcHRpb24gb2JqZWN0IGlmIGF2YWlsYWJsZSAqLwotCWlmIChidWYtPmV4Y29iaiA9PSBOVUxMKSB7Ci0JCWJ1Zi0+ZXhjb2JqID0gUHlVbmljb2RlRW5jb2RlRXJyb3JfQ3JlYXRlKGNvZGVjLT5lbmNvZGluZywKLQkJCQlidWYtPmluYnVmX3RvcCwKLQkJCQlidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wLAotCQkJCXN0YXJ0LCBlbmQsIHJlYXNvbik7Ci0JCWlmIChidWYtPmV4Y29iaiA9PSBOVUxMKQotCQkJZ290byBlcnJvcmV4aXQ7Ci0JfQotCWVsc2UKLQkJaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0KGJ1Zi0+ZXhjb2JqLCBzdGFydCkgIT0gMCB8fAotCQkgICAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kKGJ1Zi0+ZXhjb2JqLCBlbmQpICE9IDAgfHwKLQkJICAgIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbihidWYtPmV4Y29iaiwgcmVhc29uKSAhPSAwKQotCQkJZ290byBlcnJvcmV4aXQ7CisgICAgLyogdXNlIGNhY2hlZCBleGNlcHRpb24gb2JqZWN0IGlmIGF2YWlsYWJsZSAqLworICAgIGlmIChidWYtPmV4Y29iaiA9PSBOVUxMKSB7CisgICAgICAgIGJ1Zi0+ZXhjb2JqID0gUHlVbmljb2RlRW5jb2RlRXJyb3JfQ3JlYXRlKGNvZGVjLT5lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi0+aW5idWZfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIHJlYXNvbik7CisgICAgICAgIGlmIChidWYtPmV4Y29iaiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0KGJ1Zi0+ZXhjb2JqLCBzdGFydCkgIT0gMCB8fAorICAgICAgICAgICAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kKGJ1Zi0+ZXhjb2JqLCBlbmQpICE9IDAgfHwKKyAgICAgICAgICAgIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbihidWYtPmV4Y29iaiwgcmVhc29uKSAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoZXJyb3JzID09IEVSUk9SX1NUUklDVCkgewotCQlQeUNvZGVjX1N0cmljdEVycm9ycyhidWYtPmV4Y29iaik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBpZiAoZXJyb3JzID09IEVSUk9SX1NUUklDVCkgeworICAgICAgICBQeUNvZGVjX1N0cmljdEVycm9ycyhidWYtPmV4Y29iaik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXJldG9iaiA9IGNhbGxfZXJyb3JfY2FsbGJhY2soZXJyb3JzLCBidWYtPmV4Y29iaik7Ci0JaWYgKHJldG9iaiA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKKyAgICByZXRvYmogPSBjYWxsX2Vycm9yX2NhbGxiYWNrKGVycm9ycywgYnVmLT5leGNvYmopOworICAgIGlmIChyZXRvYmogPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2socmV0b2JqKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJldG9iaikgIT0gMiB8fAotCSAgICAhUHlVbmljb2RlX0NoZWNrKCh0b2JqID0gUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDApKSkgfHwKLQkgICAgIShQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpIHx8Ci0JICAgICAgUHlMb25nX0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImVuY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gIgotCQkJCSIodW5pY29kZSwgaW50KSB0dXBsZSIpOwotCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHJldG9iaikgfHwgUHlUdXBsZV9HRVRfU0laRShyZXRvYmopICE9IDIgfHwKKyAgICAgICAgIVB5VW5pY29kZV9DaGVjaygodG9iaiA9IFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAwKSkpIHx8CisgICAgICAgICEoUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSB8fAorICAgICAgICAgIFB5TG9uZ19DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIih1bmljb2RlLCBpbnQpIHR1cGxlIik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXsKLQkJY29uc3QgUHlfVU5JQ09ERSAqdXJhdyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHRvYmopOworICAgIHsKKyAgICAgICAgY29uc3QgUHlfVU5JQ09ERSAqdXJhdyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHRvYmopOwogCi0JCXJldHN0ciA9IG11bHRpYnl0ZWNvZGVjX2VuY29kZShjb2RlYywgc3RhdGUsICZ1cmF3LAotCQkJCVB5VW5pY29kZV9HRVRfU0laRSh0b2JqKSwgRVJST1JfU1RSSUNULAotCQkJCU1CRU5DX0ZMVVNIKTsKLQkJaWYgKHJldHN0ciA9PSBOVUxMKQotCQkJZ290byBlcnJvcmV4aXQ7Ci0JfQorICAgICAgICByZXRzdHIgPSBtdWx0aWJ5dGVjb2RlY19lbmNvZGUoY29kZWMsIHN0YXRlLCAmdXJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRSh0b2JqKSwgRVJST1JfU1RSSUNULAorICAgICAgICAgICAgICAgICAgICAgICAgTUJFTkNfRkxVU0gpOworICAgICAgICBpZiAocmV0c3RyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CiAKLQlyZXRzdHJzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUocmV0c3RyKTsKLQlSRVFVSVJFX0VOQ09ERUJVRkZFUihidWYsIHJldHN0cnNpemUpOworICAgIHJldHN0cnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShyZXRzdHIpOworICAgIFJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgcmV0c3Ryc2l6ZSk7CiAKLQltZW1jcHkoYnVmLT5vdXRidWYsIFB5U3RyaW5nX0FTX1NUUklORyhyZXRzdHIpLCByZXRzdHJzaXplKTsKLQlidWYtPm91dGJ1ZiArPSByZXRzdHJzaXplOworICAgIG1lbWNweShidWYtPm91dGJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHJldHN0ciksIHJldHN0cnNpemUpOworICAgIGJ1Zi0+b3V0YnVmICs9IHJldHN0cnNpemU7CiAKLQluZXdwb3MgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKTsKLQlpZiAobmV3cG9zIDwgMCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLQkJbmV3cG9zICs9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wKTsKLQlpZiAobmV3cG9zIDwgMCB8fCBidWYtPmluYnVmX3RvcCArIG5ld3BvcyA+IGJ1Zi0+aW5idWZfZW5kKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLAotCQkJICAgICAicG9zaXRpb24gJXpkIGZyb20gZXJyb3IgaGFuZGxlciBvdXQgb2YgYm91bmRzIiwKLQkJCSAgICAgbmV3cG9zKTsKLQkJZ290byBlcnJvcmV4aXQ7Ci0JfQotCWJ1Zi0+aW5idWYgPSBidWYtPmluYnVmX3RvcCArIG5ld3BvczsKKyAgICBuZXdwb3MgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKTsKKyAgICBpZiAobmV3cG9zIDwgMCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgbmV3cG9zICs9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wKTsKKyAgICBpZiAobmV3cG9zIDwgMCB8fCBidWYtPmluYnVmX3RvcCArIG5ld3BvcyA+IGJ1Zi0+aW5idWZfZW5kKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uICV6ZCBmcm9tIGVycm9yIGhhbmRsZXIgb3V0IG9mIGJvdW5kcyIsCisgICAgICAgICAgICAgICAgICAgICBuZXdwb3MpOworICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CisgICAgYnVmLT5pbmJ1ZiA9IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zOwogCi0JUHlfREVDUkVGKHJldG9iaik7Ci0JUHlfREVDUkVGKHJldHN0cik7Ci0JcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKHJldG9iaik7CisgICAgUHlfREVDUkVGKHJldHN0cik7CisgICAgcmV0dXJuIDA7CiAKIGVycm9yZXhpdDoKLQlQeV9YREVDUkVGKHJldG9iaik7Ci0JUHlfWERFQ1JFRihyZXRzdHIpOwotCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKHJldG9iaik7CisgICAgUHlfWERFQ1JFRihyZXRzdHIpOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIGludAogbXVsdGlieXRlY29kZWNfZGVjZXJyb3IoTXVsdGlieXRlQ29kZWMgKmNvZGVjLAotCQkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkJTXVsdGlieXRlRGVjb2RlQnVmZmVyICpidWYsCi0JCQlQeU9iamVjdCAqZXJyb3JzLCBQeV9zc2l6ZV90IGUpCisgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICplcnJvcnMsIFB5X3NzaXplX3QgZSkKIHsKLQlQeU9iamVjdCAqcmV0b2JqID0gTlVMTCwgKnJldHVuaSA9IE5VTEw7Ci0JUHlfc3NpemVfdCByZXR1bmlzaXplLCBuZXdwb3M7Ci0JY29uc3QgY2hhciAqcmVhc29uOwotCVB5X3NzaXplX3QgZXNpemUsIHN0YXJ0LCBlbmQ7CisgICAgUHlPYmplY3QgKnJldG9iaiA9IE5VTEwsICpyZXR1bmkgPSBOVUxMOworICAgIFB5X3NzaXplX3QgcmV0dW5pc2l6ZSwgbmV3cG9zOworICAgIGNvbnN0IGNoYXIgKnJlYXNvbjsKKyAgICBQeV9zc2l6ZV90IGVzaXplLCBzdGFydCwgZW5kOwogCi0JaWYgKGUgPiAwKSB7Ci0JCXJlYXNvbiA9ICJpbGxlZ2FsIG11bHRpYnl0ZSBzZXF1ZW5jZSI7Ci0JCWVzaXplID0gZTsKLQl9Ci0JZWxzZSB7Ci0JCXN3aXRjaCAoZSkgewotCQljYXNlIE1CRVJSX1RPT1NNQUxMOgotCQkJUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCAtMSk7Ci0JCQlyZXR1cm4gMDsgLyogcmV0cnkgaXQgKi8KLQkJY2FzZSBNQkVSUl9UT09GRVc6Ci0JCQlyZWFzb24gPSAiaW5jb21wbGV0ZSBtdWx0aWJ5dGUgc2VxdWVuY2UiOwotCQkJZXNpemUgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIE1CRVJSX0lOVEVSTkFMOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJImludGVybmFsIGNvZGVjIGVycm9yIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkidW5rbm93biBydW50aW1lIGVycm9yIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKGUgPiAwKSB7CisgICAgICAgIHJlYXNvbiA9ICJpbGxlZ2FsIG11bHRpYnl0ZSBzZXF1ZW5jZSI7CisgICAgICAgIGVzaXplID0gZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN3aXRjaCAoZSkgeworICAgICAgICBjYXNlIE1CRVJSX1RPT1NNQUxMOgorICAgICAgICAgICAgUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCAtMSk7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogcmV0cnkgaXQgKi8KKyAgICAgICAgY2FzZSBNQkVSUl9UT09GRVc6CisgICAgICAgICAgICByZWFzb24gPSAiaW5jb21wbGV0ZSBtdWx0aWJ5dGUgc2VxdWVuY2UiOworICAgICAgICAgICAgZXNpemUgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1CRVJSX0lOVEVSTkFMOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgY29kZWMgZXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gcnVudGltZSBlcnJvciIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGVycm9ycyA9PSBFUlJPUl9SRVBMQUNFKSB7Ci0JCVJFUVVJUkVfREVDT0RFQlVGRkVSKGJ1ZiwgMSk7Ci0JCSpidWYtPm91dGJ1ZisrID0gUHlfVU5JQ09ERV9SRVBMQUNFTUVOVF9DSEFSQUNURVI7Ci0JfQotCWlmIChlcnJvcnMgPT0gRVJST1JfSUdOT1JFIHx8IGVycm9ycyA9PSBFUlJPUl9SRVBMQUNFKSB7Ci0JCWJ1Zi0+aW5idWYgKz0gZXNpemU7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoZXJyb3JzID09IEVSUk9SX1JFUExBQ0UpIHsKKyAgICAgICAgUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCAxKTsKKyAgICAgICAgKmJ1Zi0+b3V0YnVmKysgPSBQeV9VTklDT0RFX1JFUExBQ0VNRU5UX0NIQVJBQ1RFUjsKKyAgICB9CisgICAgaWYgKGVycm9ycyA9PSBFUlJPUl9JR05PUkUgfHwgZXJyb3JzID09IEVSUk9SX1JFUExBQ0UpIHsKKyAgICAgICAgYnVmLT5pbmJ1ZiArPSBlc2l6ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0Jc3RhcnQgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1ZiAtIGJ1Zi0+aW5idWZfdG9wKTsKLQllbmQgPSBzdGFydCArIGVzaXplOworICAgIHN0YXJ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWYgLSBidWYtPmluYnVmX3RvcCk7CisgICAgZW5kID0gc3RhcnQgKyBlc2l6ZTsKIAotCS8qIHVzZSBjYWNoZWQgZXhjZXB0aW9uIG9iamVjdCBpZiBhdmFpbGFibGUgKi8KLQlpZiAoYnVmLT5leGNvYmogPT0gTlVMTCkgewotCQlidWYtPmV4Y29iaiA9IFB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZShjb2RlYy0+ZW5jb2RpbmcsCi0JCQkJKGNvbnN0IGNoYXIgKilidWYtPmluYnVmX3RvcCwKLQkJCQkoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmX3RvcCksCi0JCQkJc3RhcnQsIGVuZCwgcmVhc29uKTsKLQkJaWYgKGJ1Zi0+ZXhjb2JqID09IE5VTEwpCi0JCQlnb3RvIGVycm9yZXhpdDsKLQl9Ci0JZWxzZQotCQlpZiAoUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQoYnVmLT5leGNvYmosIHN0YXJ0KSB8fAotCQkgICAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kKGJ1Zi0+ZXhjb2JqLCBlbmQpIHx8Ci0JCSAgICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb24oYnVmLT5leGNvYmosIHJlYXNvbikpCi0JCQlnb3RvIGVycm9yZXhpdDsKKyAgICAvKiB1c2UgY2FjaGVkIGV4Y2VwdGlvbiBvYmplY3QgaWYgYXZhaWxhYmxlICovCisgICAgaWYgKGJ1Zi0+ZXhjb2JqID09IE5VTEwpIHsKKyAgICAgICAgYnVmLT5leGNvYmogPSBQeVVuaWNvZGVEZWNvZGVFcnJvcl9DcmVhdGUoY29kZWMtPmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilidWYtPmluYnVmX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIHJlYXNvbik7CisgICAgICAgIGlmIChidWYtPmV4Y29iaiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaWYgKFB5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0KGJ1Zi0+ZXhjb2JqLCBzdGFydCkgfHwKKyAgICAgICAgICAgIFB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZChidWYtPmV4Y29iaiwgZW5kKSB8fAorICAgICAgICAgICAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uKGJ1Zi0+ZXhjb2JqLCByZWFzb24pKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoZXJyb3JzID09IEVSUk9SX1NUUklDVCkgewotCQlQeUNvZGVjX1N0cmljdEVycm9ycyhidWYtPmV4Y29iaik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBpZiAoZXJyb3JzID09IEVSUk9SX1NUUklDVCkgeworICAgICAgICBQeUNvZGVjX1N0cmljdEVycm9ycyhidWYtPmV4Y29iaik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXJldG9iaiA9IGNhbGxfZXJyb3JfY2FsbGJhY2soZXJyb3JzLCBidWYtPmV4Y29iaik7Ci0JaWYgKHJldG9iaiA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKKyAgICByZXRvYmogPSBjYWxsX2Vycm9yX2NhbGxiYWNrKGVycm9ycywgYnVmLT5leGNvYmopOworICAgIGlmIChyZXRvYmogPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2socmV0b2JqKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJldG9iaikgIT0gMiB8fAotCSAgICAhUHlVbmljb2RlX0NoZWNrKChyZXR1bmkgPSBQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMCkpKSB8fAotCSAgICAhKFB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkgfHwKLQkgICAgICBQeUxvbmdfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZGVjb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAiCi0JCQkJIih1bmljb2RlLCBpbnQpIHR1cGxlIik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2socmV0b2JqKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJldG9iaikgIT0gMiB8fAorICAgICAgICAhUHlVbmljb2RlX0NoZWNrKChyZXR1bmkgPSBQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMCkpKSB8fAorICAgICAgICAhKFB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkgfHwKKyAgICAgICAgICBQeUxvbmdfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIodW5pY29kZSwgaW50KSB0dXBsZSIpOworICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CiAKLQlyZXR1bmlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHJldHVuaSk7Ci0JaWYgKHJldHVuaXNpemUgPiAwKSB7Ci0JCVJFUVVJUkVfREVDT0RFQlVGRkVSKGJ1ZiwgcmV0dW5pc2l6ZSk7Ci0JCW1lbWNweSgoY2hhciAqKWJ1Zi0+b3V0YnVmLCBQeVVuaWNvZGVfQVNfREFUQShyZXR1bmkpLAotCQkJCXJldHVuaXNpemUgKiBQeV9VTklDT0RFX1NJWkUpOwotCQlidWYtPm91dGJ1ZiArPSByZXR1bmlzaXplOwotCX0KKyAgICByZXR1bmlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHJldHVuaSk7CisgICAgaWYgKHJldHVuaXNpemUgPiAwKSB7CisgICAgICAgIFJFUVVJUkVfREVDT0RFQlVGRkVSKGJ1ZiwgcmV0dW5pc2l6ZSk7CisgICAgICAgIG1lbWNweSgoY2hhciAqKWJ1Zi0+b3V0YnVmLCBQeVVuaWNvZGVfQVNfREFUQShyZXR1bmkpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dW5pc2l6ZSAqIFB5X1VOSUNPREVfU0laRSk7CisgICAgICAgIGJ1Zi0+b3V0YnVmICs9IHJldHVuaXNpemU7CisgICAgfQogCi0JbmV3cG9zID0gUHlJbnRfQXNTc2l6ZV90KFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSk7Ci0JaWYgKG5ld3BvcyA8IDAgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0JCW5ld3BvcyArPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmX3RvcCk7Ci0JaWYgKG5ld3BvcyA8IDAgfHwgYnVmLT5pbmJ1Zl90b3AgKyBuZXdwb3MgPiBidWYtPmluYnVmX2VuZCkgewotCQlQeUVycl9DbGVhcigpOwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW5kZXhFcnJvciwKLQkJCSAgICAgInBvc2l0aW9uICV6ZCBmcm9tIGVycm9yIGhhbmRsZXIgb3V0IG9mIGJvdW5kcyIsCi0JCQkgICAgIG5ld3Bvcyk7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KLQlidWYtPmluYnVmID0gYnVmLT5pbmJ1Zl90b3AgKyBuZXdwb3M7Ci0JUHlfREVDUkVGKHJldG9iaik7Ci0JcmV0dXJuIDA7CisgICAgbmV3cG9zID0gUHlJbnRfQXNTc2l6ZV90KFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSk7CisgICAgaWYgKG5ld3BvcyA8IDAgJiYgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIG5ld3BvcyArPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmX3RvcCk7CisgICAgaWYgKG5ld3BvcyA8IDAgfHwgYnVmLT5pbmJ1Zl90b3AgKyBuZXdwb3MgPiBidWYtPmluYnVmX2VuZCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiAlemQgZnJvbSBlcnJvciBoYW5kbGVyIG91dCBvZiBib3VuZHMiLAorICAgICAgICAgICAgICAgICAgICAgbmV3cG9zKTsKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQorICAgIGJ1Zi0+aW5idWYgPSBidWYtPmluYnVmX3RvcCArIG5ld3BvczsKKyAgICBQeV9ERUNSRUYocmV0b2JqKTsKKyAgICByZXR1cm4gMDsKIAogZXJyb3JleGl0OgotCVB5X1hERUNSRUYocmV0b2JqKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfWERFQ1JFRihyZXRvYmopOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG11bHRpYnl0ZWNvZGVjX2VuY29kZShNdWx0aWJ5dGVDb2RlYyAqY29kZWMsCi0JCSAgICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKLQkJICAgICAgY29uc3QgUHlfVU5JQ09ERSAqKmRhdGEsIFB5X3NzaXplX3QgZGF0YWxlbiwKLQkJICAgICAgUHlPYmplY3QgKmVycm9ycywgaW50IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQeV9VTklDT0RFICoqZGF0YSwgUHlfc3NpemVfdCBkYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICplcnJvcnMsIGludCBmbGFncykKIHsKLQlNdWx0aWJ5dGVFbmNvZGVCdWZmZXIgYnVmOwotCVB5X3NzaXplX3QgZmluYWxzaXplLCByID0gMDsKKyAgICBNdWx0aWJ5dGVFbmNvZGVCdWZmZXIgYnVmOworICAgIFB5X3NzaXplX3QgZmluYWxzaXplLCByID0gMDsKIAotCWlmIChkYXRhbGVuID09IDApCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICBpZiAoZGF0YWxlbiA9PSAwKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CiAKLQlidWYuZXhjb2JqID0gTlVMTDsKLQlidWYuaW5idWYgPSBidWYuaW5idWZfdG9wID0gKmRhdGE7Ci0JYnVmLmluYnVmX2VuZCA9IGJ1Zi5pbmJ1Zl90b3AgKyBkYXRhbGVuOworICAgIGJ1Zi5leGNvYmogPSBOVUxMOworICAgIGJ1Zi5pbmJ1ZiA9IGJ1Zi5pbmJ1Zl90b3AgPSAqZGF0YTsKKyAgICBidWYuaW5idWZfZW5kID0gYnVmLmluYnVmX3RvcCArIGRhdGFsZW47CiAKLQlpZiAoZGF0YWxlbiA+IChQWV9TU0laRV9UX01BWCAtIDE2KSAvIDIpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBlcnJvcmV4aXQ7Ci0JfQorICAgIGlmIChkYXRhbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gMTYpIC8gMikgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CiAKLQlidWYub3V0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZGF0YWxlbiAqIDIgKyAxNik7Ci0JaWYgKGJ1Zi5vdXRvYmogPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JYnVmLm91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi5vdXRvYmopOwotCWJ1Zi5vdXRidWZfZW5kID0gYnVmLm91dGJ1ZiArIFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi5vdXRvYmopOworICAgIGJ1Zi5vdXRvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBkYXRhbGVuICogMiArIDE2KTsKKyAgICBpZiAoYnVmLm91dG9iaiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBidWYub3V0YnVmID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoYnVmLm91dG9iaik7CisgICAgYnVmLm91dGJ1Zl9lbmQgPSBidWYub3V0YnVmICsgUHlTdHJpbmdfR0VUX1NJWkUoYnVmLm91dG9iaik7CiAKLQl3aGlsZSAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgewotCQlQeV9zc2l6ZV90IGlubGVmdCwgb3V0bGVmdDsKKyAgICB3aGlsZSAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgeworICAgICAgICBQeV9zc2l6ZV90IGlubGVmdCwgb3V0bGVmdDsKIAotCQkvKiB3ZSBkb24ndCByZXVzZSBpbmxlZnQgYW5kIG91dGxlZnQgaGVyZS4KLQkJICogZXJyb3IgY2FsbGJhY2tzIGNhbiByZWxvY2F0ZSB0aGUgY3Vyc29yIGFueXdoZXJlIG9uIGJ1ZmZlciovCi0JCWlubGVmdCA9IChQeV9zc2l6ZV90KShidWYuaW5idWZfZW5kIC0gYnVmLmluYnVmKTsKLQkJb3V0bGVmdCA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmX2VuZCAtIGJ1Zi5vdXRidWYpOwotCQlyID0gY29kZWMtPmVuY29kZShzdGF0ZSwgY29kZWMtPmNvbmZpZywgJmJ1Zi5pbmJ1ZiwgaW5sZWZ0LAotCQkJCSAgJmJ1Zi5vdXRidWYsIG91dGxlZnQsIGZsYWdzKTsKLQkJKmRhdGEgPSBidWYuaW5idWY7Ci0JCWlmICgociA9PSAwKSB8fCAociA9PSBNQkVSUl9UT09GRVcgJiYgIShmbGFncyAmIE1CRU5DX0ZMVVNIKSkpCi0JCQlicmVhazsKLQkJZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZW5jZXJyb3IoY29kZWMsIHN0YXRlLCAmYnVmLCBlcnJvcnMscikpCi0JCQlnb3RvIGVycm9yZXhpdDsKLQkJZWxzZSBpZiAociA9PSBNQkVSUl9UT09GRVcpCi0JCQlicmVhazsKLQl9CisgICAgICAgIC8qIHdlIGRvbid0IHJldXNlIGlubGVmdCBhbmQgb3V0bGVmdCBoZXJlLgorICAgICAgICAgKiBlcnJvciBjYWxsYmFja3MgY2FuIHJlbG9jYXRlIHRoZSBjdXJzb3IgYW55d2hlcmUgb24gYnVmZmVyKi8KKyAgICAgICAgaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5pbmJ1Zl9lbmQgLSBidWYuaW5idWYpOworICAgICAgICBvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWZfZW5kIC0gYnVmLm91dGJ1Zik7CisgICAgICAgIHIgPSBjb2RlYy0+ZW5jb2RlKHN0YXRlLCBjb2RlYy0+Y29uZmlnLCAmYnVmLmluYnVmLCBpbmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWYub3V0YnVmLCBvdXRsZWZ0LCBmbGFncyk7CisgICAgICAgICpkYXRhID0gYnVmLmluYnVmOworICAgICAgICBpZiAoKHIgPT0gMCkgfHwgKHIgPT0gTUJFUlJfVE9PRkVXICYmICEoZmxhZ3MgJiBNQkVOQ19GTFVTSCkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKG11bHRpYnl0ZWNvZGVjX2VuY2Vycm9yKGNvZGVjLCBzdGF0ZSwgJmJ1ZiwgZXJyb3JzLHIpKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIGVsc2UgaWYgKHIgPT0gTUJFUlJfVE9PRkVXKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogCi0JaWYgKGNvZGVjLT5lbmNyZXNldCAhPSBOVUxMKQotCQlmb3IgKDs7KSB7Ci0JCQlQeV9zc2l6ZV90IG91dGxlZnQ7CisgICAgaWYgKGNvZGVjLT5lbmNyZXNldCAhPSBOVUxMKQorICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG91dGxlZnQ7CiAKLQkJCW91dGxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1Zl9lbmQgLSBidWYub3V0YnVmKTsKLQkJCXIgPSBjb2RlYy0+ZW5jcmVzZXQoc3RhdGUsIGNvZGVjLT5jb25maWcsICZidWYub3V0YnVmLAotCQkJCQkgICAgb3V0bGVmdCk7Ci0JCQlpZiAociA9PSAwKQotCQkJCWJyZWFrOwotCQkJZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZW5jZXJyb3IoY29kZWMsIHN0YXRlLAotCQkJCQkJCSAmYnVmLCBlcnJvcnMsIHIpKQotCQkJCWdvdG8gZXJyb3JleGl0OwotCQl9CisgICAgICAgICAgICBvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWZfZW5kIC0gYnVmLm91dGJ1Zik7CisgICAgICAgICAgICByID0gY29kZWMtPmVuY3Jlc2V0KHN0YXRlLCBjb2RlYy0+Y29uZmlnLCAmYnVmLm91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGVmdCk7CisgICAgICAgICAgICBpZiAociA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZW5jZXJyb3IoY29kZWMsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZiwgZXJyb3JzLCByKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgfQogCi0JZmluYWxzaXplID0gKFB5X3NzaXplX3QpKChjaGFyICopYnVmLm91dGJ1ZiAtCi0JCQkJIFB5U3RyaW5nX0FTX1NUUklORyhidWYub3V0b2JqKSk7CisgICAgZmluYWxzaXplID0gKFB5X3NzaXplX3QpKChjaGFyICopYnVmLm91dGJ1ZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhidWYub3V0b2JqKSk7CiAKLQlpZiAoZmluYWxzaXplICE9IFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi5vdXRvYmopKQotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLm91dG9iaiwgZmluYWxzaXplKSA9PSAtMSkKLQkJCWdvdG8gZXJyb3JleGl0OworICAgIGlmIChmaW5hbHNpemUgIT0gUHlTdHJpbmdfR0VUX1NJWkUoYnVmLm91dG9iaikpCisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCXJldHVybiBidWYub3V0b2JqOworICAgIFB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisgICAgcmV0dXJuIGJ1Zi5vdXRvYmo7CiAKIGVycm9yZXhpdDoKLQlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCVB5X1hERUNSRUYoYnVmLm91dG9iaik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKKyAgICBQeV9YREVDUkVGKGJ1Zi5vdXRvYmopOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogTXVsdGlieXRlQ29kZWNfRW5jb2RlKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICpzZWxmLAotCQkgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsKLQlQeV9VTklDT0RFICpkYXRhOwotCVB5T2JqZWN0ICplcnJvcmNiLCAqciwgKmFyZywgKnVjdnQ7Ci0JY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGRhdGFsZW47CisgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgc3RhdGU7CisgICAgUHlfVU5JQ09ERSAqZGF0YTsKKyAgICBQeU9iamVjdCAqZXJyb3JjYiwgKnIsICphcmcsICp1Y3Z0OworICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBkYXRhbGVuOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3x6OmVuY29kZSIsCi0JCQkJY29kZWNrd2FyZ2xpc3QsICZhcmcsICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHo6ZW5jb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY2t3YXJnbGlzdCwgJmFyZywgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKQotCQl1Y3Z0ID0gTlVMTDsKLQllbHNlIHsKLQkJYXJnID0gdWN2dCA9IFB5T2JqZWN0X1VuaWNvZGUoYXJnKTsKLQkJaWYgKGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY291bGRuJ3QgY29udmVydCB0aGUgb2JqZWN0IHRvIHVuaWNvZGUuIik7Ci0JCQlQeV9ERUNSRUYodWN2dCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpCisgICAgICAgIHVjdnQgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBhcmcgPSB1Y3Z0ID0gUHlPYmplY3RfVW5pY29kZShhcmcpOworICAgICAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJjb3VsZG4ndCBjb252ZXJ0IHRoZSBvYmplY3QgdG8gdW5pY29kZS4iKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1Y3Z0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JZGF0YSA9IFB5VW5pY29kZV9BU19VTklDT0RFKGFyZyk7Ci0JZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRShhcmcpOworICAgIGRhdGEgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmcpOworICAgIGRhdGFsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUoYXJnKTsKIAotCWVycm9yY2IgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOwotCWlmIChlcnJvcmNiID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRih1Y3Z0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVycm9yY2IgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOworICAgIGlmIChlcnJvcmNiID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRih1Y3Z0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHNlbGYtPmNvZGVjLT5lbmNpbml0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmVuY2luaXQoJnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlnb3RvIGVycm9yZXhpdDsKLQlyID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKHNlbGYtPmNvZGVjLCAmc3RhdGUsCi0JCQkoY29uc3QgUHlfVU5JQ09ERSAqKikmZGF0YSwgZGF0YWxlbiwgZXJyb3JjYiwKLQkJCU1CRU5DX0ZMVVNIIHwgTUJFTkNfUkVTRVQpOwotCWlmIChyID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OworICAgIGlmIChzZWxmLT5jb2RlYy0+ZW5jaW5pdCAhPSBOVUxMICYmCisgICAgICAgIHNlbGYtPmNvZGVjLT5lbmNpbml0KCZzdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgciA9IG11bHRpYnl0ZWNvZGVjX2VuY29kZShzZWxmLT5jb2RlYywgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgUHlfVU5JQ09ERSAqKikmZGF0YSwgZGF0YWxlbiwgZXJyb3JjYiwKKyAgICAgICAgICAgICAgICAgICAgTUJFTkNfRkxVU0ggfCBNQkVOQ19SRVNFVCk7CisgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlFUlJPUl9ERUNSRUYoZXJyb3JjYik7Ci0JUHlfWERFQ1JFRih1Y3Z0KTsKLQlyZXR1cm4gbWFrZV90dXBsZShyLCBkYXRhbGVuKTsKKyAgICBFUlJPUl9ERUNSRUYoZXJyb3JjYik7CisgICAgUHlfWERFQ1JFRih1Y3Z0KTsKKyAgICByZXR1cm4gbWFrZV90dXBsZShyLCBkYXRhbGVuKTsKIAogZXJyb3JleGl0OgotCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKLQlQeV9YREVDUkVGKHVjdnQpOwotCXJldHVybiBOVUxMOworICAgIEVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKKyAgICBQeV9YREVDUkVGKHVjdnQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogTXVsdGlieXRlQ29kZWNfRGVjb2RlKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICpzZWxmLAotCQkgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsKLQlNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgYnVmOwotCVB5T2JqZWN0ICplcnJvcmNiOwotCVB5X2J1ZmZlciBwZGF0YTsKLQljb25zdCBjaGFyICpkYXRhLCAqZXJyb3JzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGRhdGFsZW4sIGZpbmFsc2l6ZTsKKyAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsKKyAgICBNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgYnVmOworICAgIFB5T2JqZWN0ICplcnJvcmNiOworICAgIFB5X2J1ZmZlciBwZGF0YTsKKyAgICBjb25zdCBjaGFyICpkYXRhLCAqZXJyb3JzID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGRhdGFsZW4sIGZpbmFsc2l6ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMqfHo6ZGVjb2RlIiwKLQkJCQljb2RlY2t3YXJnbGlzdCwgJnBkYXRhLCAmZXJyb3JzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YSA9IHBkYXRhLmJ1ZjsKLQlkYXRhbGVuID0gcGRhdGEubGVuOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMqfHo6ZGVjb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY2t3YXJnbGlzdCwgJnBkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YSA9IHBkYXRhLmJ1ZjsKKyAgICBkYXRhbGVuID0gcGRhdGEubGVuOwogCi0JZXJyb3JjYiA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7Ci0JaWYgKGVycm9yY2IgPT0gTlVMTCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBlcnJvcmNiID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKKyAgICBpZiAoZXJyb3JjYiA9PSBOVUxMKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGRhdGFsZW4gPT0gMCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKLQkJcmV0dXJuIG1ha2VfdHVwbGUoUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApLCAwKTsKLQl9CisgICAgaWYgKGRhdGFsZW4gPT0gMCkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgIEVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKKyAgICAgICAgcmV0dXJuIG1ha2VfdHVwbGUoUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApLCAwKTsKKyAgICB9CiAKLQlidWYuZXhjb2JqID0gTlVMTDsKLQlidWYuaW5idWYgPSBidWYuaW5idWZfdG9wID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOwotCWJ1Zi5pbmJ1Zl9lbmQgPSBidWYuaW5idWZfdG9wICsgZGF0YWxlbjsKLQlidWYub3V0b2JqID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGRhdGFsZW4pOwotCWlmIChidWYub3V0b2JqID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OwotCWJ1Zi5vdXRidWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYub3V0b2JqKTsKLQlidWYub3V0YnVmX2VuZCA9IGJ1Zi5vdXRidWYgKyBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaik7CisgICAgYnVmLmV4Y29iaiA9IE5VTEw7CisgICAgYnVmLmluYnVmID0gYnVmLmluYnVmX3RvcCA9ICh1bnNpZ25lZCBjaGFyICopZGF0YTsKKyAgICBidWYuaW5idWZfZW5kID0gYnVmLmluYnVmX3RvcCArIGRhdGFsZW47CisgICAgYnVmLm91dG9iaiA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBkYXRhbGVuKTsKKyAgICBpZiAoYnVmLm91dG9iaiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBidWYub3V0YnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaik7CisgICAgYnVmLm91dGJ1Zl9lbmQgPSBidWYub3V0YnVmICsgUHlVbmljb2RlX0dFVF9TSVpFKGJ1Zi5vdXRvYmopOwogCi0JaWYgKHNlbGYtPmNvZGVjLT5kZWNpbml0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmRlY2luaXQoJnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0Jd2hpbGUgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsKLQkJUHlfc3NpemVfdCBpbmxlZnQsIG91dGxlZnQsIHI7CisgICAgd2hpbGUgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpbmxlZnQsIG91dGxlZnQsIHI7CiAKLQkJaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5pbmJ1Zl9lbmQgLSBidWYuaW5idWYpOwotCQlvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWZfZW5kIC0gYnVmLm91dGJ1Zik7CisgICAgICAgIGlubGVmdCA9IChQeV9zc2l6ZV90KShidWYuaW5idWZfZW5kIC0gYnVmLmluYnVmKTsKKyAgICAgICAgb3V0bGVmdCA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmX2VuZCAtIGJ1Zi5vdXRidWYpOwogCi0JCXIgPSBzZWxmLT5jb2RlYy0+ZGVjb2RlKCZzdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZywKLQkJCQkmYnVmLmluYnVmLCBpbmxlZnQsICZidWYub3V0YnVmLCBvdXRsZWZ0KTsKLQkJaWYgKHIgPT0gMCkKLQkJCWJyZWFrOwotCQllbHNlIGlmIChtdWx0aWJ5dGVjb2RlY19kZWNlcnJvcihzZWxmLT5jb2RlYywgJnN0YXRlLAotCQkJCQkJICZidWYsIGVycm9yY2IsIHIpKQotCQkJZ290byBlcnJvcmV4aXQ7Ci0JfQorICAgICAgICByID0gc2VsZi0+Y29kZWMtPmRlY29kZSgmc3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLmluYnVmLCBpbmxlZnQsICZidWYub3V0YnVmLCBvdXRsZWZ0KTsKKyAgICAgICAgaWYgKHIgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlIGlmIChtdWx0aWJ5dGVjb2RlY19kZWNlcnJvcihzZWxmLT5jb2RlYywgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCBlcnJvcmNiLCByKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCWZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmIC0KLQkJCQkgUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOworICAgIGZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOwogCi0JaWYgKGZpbmFsc2l6ZSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaikpCi0JCWlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQotCQkJZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKGZpbmFsc2l6ZSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaikpCisgICAgICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKLQlFUlJPUl9ERUNSRUYoZXJyb3JjYik7Ci0JcmV0dXJuIG1ha2VfdHVwbGUoYnVmLm91dG9iaiwgZGF0YWxlbik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIFB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisgICAgRVJST1JfREVDUkVGKGVycm9yY2IpOworICAgIHJldHVybiBtYWtlX3R1cGxlKGJ1Zi5vdXRvYmosIGRhdGFsZW4pOwogCiBlcnJvcmV4aXQ6Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKLQlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCVB5X1hERUNSRUYoYnVmLm91dG9iaik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIEVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKKyAgICBQeV9YREVDUkVGKGJ1Zi5leGNvYmopOworICAgIFB5X1hERUNSRUYoYnVmLm91dG9iaik7CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtdWx0aWJ5dGVjb2RlY19tZXRob2RzW10gPSB7Ci0JeyJlbmNvZGUiLAkoUHlDRnVuY3Rpb24pTXVsdGlieXRlQ29kZWNfRW5jb2RlLAotCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkJCU11bHRpYnl0ZUNvZGVjX0VuY29kZV9fZG9jX199LAotCXsiZGVjb2RlIiwJKFB5Q0Z1bmN0aW9uKU11bHRpYnl0ZUNvZGVjX0RlY29kZSwKLQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQlNdWx0aWJ5dGVDb2RlY19EZWNvZGVfX2RvY19ffSwKLQl7TlVMTCwJCU5VTEx9LAorICAgIHsiZW5jb2RlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKU11bHRpYnl0ZUNvZGVjX0VuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgICAgICAgICAgICAgICAgTXVsdGlieXRlQ29kZWNfRW5jb2RlX19kb2NfX30sCisgICAgeyJkZWNvZGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pTXVsdGlieXRlQ29kZWNfRGVjb2RlLAorICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICBNdWx0aWJ5dGVDb2RlY19EZWNvZGVfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9LAogfTsKIAogc3RhdGljIHZvaWQKIG11bHRpYnl0ZWNvZGVjX2RlYWxsb2MoTXVsdGlieXRlQ29kZWNPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVDb2RlY19UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJNdWx0aWJ5dGVDb2RlYyIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKE11bHRpYnl0ZUNvZGVjT2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbXVsdGlieXRlY29kZWNfZGVhbGxvYywgLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkvKiB0cF9mbGFncyAqLwotCTAsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KLQltdWx0aWJ5dGVjb2RlY19tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJNdWx0aWJ5dGVDb2RlYyIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoTXVsdGlieXRlQ29kZWNPYmplY3QpLCAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciltdWx0aWJ5dGVjb2RlY19kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyZXh0ICovCisgICAgbXVsdGlieXRlY29kZWNfbWV0aG9kcywgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogfTsKIAogCkBAIC03MjQsMTUwICs3MjQsMTUwIEBACiAgKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igc3RhdGVmdWwgY29kZWMgbWVjaGFuaXNtCiAgKi8KIAotI2RlZmluZSBTVEFURUZVTF9EQ1RYKG8pCSgoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqKShvKSkKLSNkZWZpbmUgU1RBVEVGVUxfRUNUWChvKQkoKE11bHRpYnl0ZVN0YXRlZnVsRW5jb2RlckNvbnRleHQgKikobykpCisjZGVmaW5lIFNUQVRFRlVMX0RDVFgobykgICAgICAgICgoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqKShvKSkKKyNkZWZpbmUgU1RBVEVGVUxfRUNUWChvKSAgICAgICAgKChNdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJDb250ZXh0ICopKG8pKQogCiBzdGF0aWMgUHlPYmplY3QgKgogZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyQ29udGV4dCAqY3R4LAotCQkJUHlPYmplY3QgKnVuaXN0ciwgaW50IGZpbmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnVuaXN0ciwgaW50IGZpbmFsKQogewotCVB5T2JqZWN0ICp1Y3Z0LCAqciA9IE5VTEw7Ci0JUHlfVU5JQ09ERSAqaW5idWYsICppbmJ1Zl9lbmQsICppbmJ1Zl90bXAgPSBOVUxMOwotCVB5X3NzaXplX3QgZGF0YWxlbiwgb3JpZ3BlbmRpbmc7CisgICAgUHlPYmplY3QgKnVjdnQsICpyID0gTlVMTDsKKyAgICBQeV9VTklDT0RFICppbmJ1ZiwgKmluYnVmX2VuZCwgKmluYnVmX3RtcCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBkYXRhbGVuLCBvcmlncGVuZGluZzsKIAotCWlmIChQeVVuaWNvZGVfQ2hlY2sodW5pc3RyKSkKLQkJdWN2dCA9IE5VTEw7Ci0JZWxzZSB7Ci0JCXVuaXN0ciA9IHVjdnQgPSBQeU9iamVjdF9Vbmljb2RlKHVuaXN0cik7Ci0JCWlmICh1bmlzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQllbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHVuaXN0cikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNvdWxkbid0IGNvbnZlcnQgdGhlIG9iamVjdCB0byB1bmljb2RlLiIpOwotCQkJUHlfREVDUkVGKHVjdnQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayh1bmlzdHIpKQorICAgICAgICB1Y3Z0ID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgdW5pc3RyID0gdWN2dCA9IFB5T2JqZWN0X1VuaWNvZGUodW5pc3RyKTsKKyAgICAgICAgaWYgKHVuaXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodW5pc3RyKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiY291bGRuJ3QgY29udmVydCB0aGUgb2JqZWN0IHRvIHVuaWNvZGUuIik7CisgICAgICAgICAgICBQeV9ERUNSRUYodWN2dCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCWRhdGFsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUodW5pc3RyKTsKLQlvcmlncGVuZGluZyA9IGN0eC0+cGVuZGluZ3NpemU7CisgICAgZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh1bmlzdHIpOworICAgIG9yaWdwZW5kaW5nID0gY3R4LT5wZW5kaW5nc2l6ZTsKIAotCWlmIChvcmlncGVuZGluZyA+IDApIHsKLQkJaWYgKGRhdGFsZW4gPiBQWV9TU0laRV9UX01BWCAtIGN0eC0+cGVuZGluZ3NpemUpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkvKiBpbmJ1Zl90bXAgPT0gTlVMTCAqLwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KLQkJaW5idWZfdG1wID0gUHlNZW1fTmV3KFB5X1VOSUNPREUsIGRhdGFsZW4gKyBjdHgtPnBlbmRpbmdzaXplKTsKLQkJaWYgKGluYnVmX3RtcCA9PSBOVUxMKQotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCW1lbWNweShpbmJ1Zl90bXAsIGN0eC0+cGVuZGluZywKLQkJCVB5X1VOSUNPREVfU0laRSAqIGN0eC0+cGVuZGluZ3NpemUpOwotCQltZW1jcHkoaW5idWZfdG1wICsgY3R4LT5wZW5kaW5nc2l6ZSwKLQkJCVB5VW5pY29kZV9BU19VTklDT0RFKHVuaXN0ciksCi0JCQlQeV9VTklDT0RFX1NJWkUgKiBkYXRhbGVuKTsKLQkJZGF0YWxlbiArPSBjdHgtPnBlbmRpbmdzaXplOwotCQljdHgtPnBlbmRpbmdzaXplID0gMDsKLQkJaW5idWYgPSBpbmJ1Zl90bXA7Ci0JfQotCWVsc2UKLQkJaW5idWYgPSAoUHlfVU5JQ09ERSAqKVB5VW5pY29kZV9BU19VTklDT0RFKHVuaXN0cik7CisgICAgaWYgKG9yaWdwZW5kaW5nID4gMCkgeworICAgICAgICBpZiAoZGF0YWxlbiA+IFBZX1NTSVpFX1RfTUFYIC0gY3R4LT5wZW5kaW5nc2l6ZSkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIC8qIGluYnVmX3RtcCA9PSBOVUxMICovCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgfQorICAgICAgICBpbmJ1Zl90bXAgPSBQeU1lbV9OZXcoUHlfVU5JQ09ERSwgZGF0YWxlbiArIGN0eC0+cGVuZGluZ3NpemUpOworICAgICAgICBpZiAoaW5idWZfdG1wID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgbWVtY3B5KGluYnVmX3RtcCwgY3R4LT5wZW5kaW5nLAorICAgICAgICAgICAgUHlfVU5JQ09ERV9TSVpFICogY3R4LT5wZW5kaW5nc2l6ZSk7CisgICAgICAgIG1lbWNweShpbmJ1Zl90bXAgKyBjdHgtPnBlbmRpbmdzaXplLAorICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUodW5pc3RyKSwKKyAgICAgICAgICAgIFB5X1VOSUNPREVfU0laRSAqIGRhdGFsZW4pOworICAgICAgICBkYXRhbGVuICs9IGN0eC0+cGVuZGluZ3NpemU7CisgICAgICAgIGN0eC0+cGVuZGluZ3NpemUgPSAwOworICAgICAgICBpbmJ1ZiA9IGluYnVmX3RtcDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBpbmJ1ZiA9IChQeV9VTklDT0RFICopUHlVbmljb2RlX0FTX1VOSUNPREUodW5pc3RyKTsKIAotCWluYnVmX2VuZCA9IGluYnVmICsgZGF0YWxlbjsKKyAgICBpbmJ1Zl9lbmQgPSBpbmJ1ZiArIGRhdGFsZW47CiAKLQlyID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKGN0eC0+Y29kZWMsICZjdHgtPnN0YXRlLAotCQkJKGNvbnN0IFB5X1VOSUNPREUgKiopJmluYnVmLAotCQkJZGF0YWxlbiwgY3R4LT5lcnJvcnMsIGZpbmFsID8gTUJFTkNfRkxVU0ggOiAwKTsKLQlpZiAociA9PSBOVUxMKSB7Ci0JCS8qIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBlbmRpbmcgYnVmZmVyICovCi0JCWlmIChvcmlncGVuZGluZyA+IDApCi0JCQltZW1jcHkoY3R4LT5wZW5kaW5nLCBpbmJ1Zl90bXAsCi0JCQkJUHlfVU5JQ09ERV9TSVpFICogb3JpZ3BlbmRpbmcpOwotCQljdHgtPnBlbmRpbmdzaXplID0gb3JpZ3BlbmRpbmc7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICByID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKGN0eC0+Y29kZWMsICZjdHgtPnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgUHlfVU5JQ09ERSAqKikmaW5idWYsCisgICAgICAgICAgICAgICAgICAgIGRhdGFsZW4sIGN0eC0+ZXJyb3JzLCBmaW5hbCA/IE1CRU5DX0ZMVVNIIDogMCk7CisgICAgaWYgKHIgPT0gTlVMTCkgeworICAgICAgICAvKiByZWNvdmVyIHRoZSBvcmlnaW5hbCBwZW5kaW5nIGJ1ZmZlciAqLworICAgICAgICBpZiAob3JpZ3BlbmRpbmcgPiAwKQorICAgICAgICAgICAgbWVtY3B5KGN0eC0+cGVuZGluZywgaW5idWZfdG1wLAorICAgICAgICAgICAgICAgIFB5X1VOSUNPREVfU0laRSAqIG9yaWdwZW5kaW5nKTsKKyAgICAgICAgY3R4LT5wZW5kaW5nc2l6ZSA9IG9yaWdwZW5kaW5nOworICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CiAKLQlpZiAoaW5idWYgPCBpbmJ1Zl9lbmQpIHsKLQkJY3R4LT5wZW5kaW5nc2l6ZSA9IChQeV9zc2l6ZV90KShpbmJ1Zl9lbmQgLSBpbmJ1Zik7Ci0JCWlmIChjdHgtPnBlbmRpbmdzaXplID4gTUFYRU5DUEVORElORykgewotCQkJLyogbm9ybWFsIGNvZGVjcyBjYW4ndCByZWFjaCBoZXJlICovCi0JCQljdHgtPnBlbmRpbmdzaXplID0gMDsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Vbmljb2RlRXJyb3IsCi0JCQkJCSJwZW5kaW5nIGJ1ZmZlciBvdmVyZmxvdyIpOwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KLQkJbWVtY3B5KGN0eC0+cGVuZGluZywgaW5idWYsCi0JCQljdHgtPnBlbmRpbmdzaXplICogUHlfVU5JQ09ERV9TSVpFKTsKLQl9CisgICAgaWYgKGluYnVmIDwgaW5idWZfZW5kKSB7CisgICAgICAgIGN0eC0+cGVuZGluZ3NpemUgPSAoUHlfc3NpemVfdCkoaW5idWZfZW5kIC0gaW5idWYpOworICAgICAgICBpZiAoY3R4LT5wZW5kaW5nc2l6ZSA+IE1BWEVOQ1BFTkRJTkcpIHsKKyAgICAgICAgICAgIC8qIG5vcm1hbCBjb2RlY3MgY2FuJ3QgcmVhY2ggaGVyZSAqLworICAgICAgICAgICAgY3R4LT5wZW5kaW5nc2l6ZSA9IDA7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVW5pY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZW5kaW5nIGJ1ZmZlciBvdmVyZmxvdyIpOworICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGN0eC0+cGVuZGluZywgaW5idWYsCisgICAgICAgICAgICBjdHgtPnBlbmRpbmdzaXplICogUHlfVU5JQ09ERV9TSVpFKTsKKyAgICB9CiAKLQlpZiAoaW5idWZfdG1wICE9IE5VTEwpCi0JCVB5TWVtX0RlbChpbmJ1Zl90bXApOwotCVB5X1hERUNSRUYodWN2dCk7Ci0JcmV0dXJuIHI7CisgICAgaWYgKGluYnVmX3RtcCAhPSBOVUxMKQorICAgICAgICBQeU1lbV9EZWwoaW5idWZfdG1wKTsKKyAgICBQeV9YREVDUkVGKHVjdnQpOworICAgIHJldHVybiByOwogCiBlcnJvcmV4aXQ6Ci0JaWYgKGluYnVmX3RtcCAhPSBOVUxMKQotCQlQeU1lbV9EZWwoaW5idWZfdG1wKTsKLQlQeV9YREVDUkVGKHIpOwotCVB5X1hERUNSRUYodWN2dCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGluYnVmX3RtcCAhPSBOVUxMKQorICAgICAgICBQeU1lbV9EZWwoaW5idWZfdG1wKTsKKyAgICBQeV9YREVDUkVGKHIpOworICAgIFB5X1hERUNSRUYodWN2dCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIGRlY29kZXJfYXBwZW5kX3BlbmRpbmcoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqY3R4LAotCQkgICAgICAgTXVsdGlieXRlRGVjb2RlQnVmZmVyICpidWYpCisgICAgICAgICAgICAgICAgICAgICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmKQogewotCVB5X3NzaXplX3QgbnBlbmRpbmdzOworICAgIFB5X3NzaXplX3QgbnBlbmRpbmdzOwogCi0JbnBlbmRpbmdzID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7Ci0JaWYgKG5wZW5kaW5ncyArIGN0eC0+cGVuZGluZ3NpemUgPiBNQVhERUNQRU5ESU5HIHx8Ci0JCW5wZW5kaW5ncyA+IFBZX1NTSVpFX1RfTUFYIC0gY3R4LT5wZW5kaW5nc2l6ZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1VuaWNvZGVFcnJvciwgInBlbmRpbmcgYnVmZmVyIG92ZXJmbG93Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JfQotCW1lbWNweShjdHgtPnBlbmRpbmcgKyBjdHgtPnBlbmRpbmdzaXplLCBidWYtPmluYnVmLCBucGVuZGluZ3MpOwotCWN0eC0+cGVuZGluZ3NpemUgKz0gbnBlbmRpbmdzOwotCXJldHVybiAwOworICAgIG5wZW5kaW5ncyA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOworICAgIGlmIChucGVuZGluZ3MgKyBjdHgtPnBlbmRpbmdzaXplID4gTUFYREVDUEVORElORyB8fAorICAgICAgICBucGVuZGluZ3MgPiBQWV9TU0laRV9UX01BWCAtIGN0eC0+cGVuZGluZ3NpemUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Vbmljb2RlRXJyb3IsICJwZW5kaW5nIGJ1ZmZlciBvdmVyZmxvdyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZW1jcHkoY3R4LT5wZW5kaW5nICsgY3R4LT5wZW5kaW5nc2l6ZSwgYnVmLT5pbmJ1ZiwgbnBlbmRpbmdzKTsKKyAgICBjdHgtPnBlbmRpbmdzaXplICs9IG5wZW5kaW5nczsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogZGVjb2Rlcl9wcmVwYXJlX2J1ZmZlcihNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgKmJ1ZiwgY29uc3QgY2hhciAqZGF0YSwKLQkJICAgICAgIFB5X3NzaXplX3Qgc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplKQogewotCWJ1Zi0+aW5idWYgPSBidWYtPmluYnVmX3RvcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopZGF0YTsKLQlidWYtPmluYnVmX2VuZCA9IGJ1Zi0+aW5idWZfdG9wICsgc2l6ZTsKLQlpZiAoYnVmLT5vdXRvYmogPT0gTlVMTCkgeyAvKiBvbmx5IGlmIG91dG9iaiBpcyBub3QgYWxsb2NhdGVkIHlldCAqLwotCQlidWYtPm91dG9iaiA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzaXplKTsKLQkJaWYgKGJ1Zi0+b3V0b2JqID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWJ1Zi0+b3V0YnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopOwotCQlidWYtPm91dGJ1Zl9lbmQgPSBidWYtPm91dGJ1ZiArCi0JCQkJICBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwotCX0KKyAgICBidWYtPmluYnVmID0gYnVmLT5pbmJ1Zl90b3AgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWRhdGE7CisgICAgYnVmLT5pbmJ1Zl9lbmQgPSBidWYtPmluYnVmX3RvcCArIHNpemU7CisgICAgaWYgKGJ1Zi0+b3V0b2JqID09IE5VTEwpIHsgLyogb25seSBpZiBvdXRvYmogaXMgbm90IGFsbG9jYXRlZCB5ZXQgKi8KKyAgICAgICAgYnVmLT5vdXRvYmogPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgc2l6ZSk7CisgICAgICAgIGlmIChidWYtPm91dG9iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBidWYtPm91dGJ1ZiA9IFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi0+b3V0b2JqKTsKKyAgICAgICAgYnVmLT5vdXRidWZfZW5kID0gYnVmLT5vdXRidWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBkZWNvZGVyX2ZlZWRfYnVmZmVyKE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQgKmN0eCwKLQkJICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmKQorICAgICAgICAgICAgICAgICAgICBNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgKmJ1ZikKIHsKLQl3aGlsZSAoYnVmLT5pbmJ1ZiA8IGJ1Zi0+aW5idWZfZW5kKSB7Ci0JCVB5X3NzaXplX3QgaW5sZWZ0LCBvdXRsZWZ0OwotCQlQeV9zc2l6ZV90IHI7CisgICAgd2hpbGUgKGJ1Zi0+aW5idWYgPCBidWYtPmluYnVmX2VuZCkgeworICAgICAgICBQeV9zc2l6ZV90IGlubGVmdCwgb3V0bGVmdDsKKyAgICAgICAgUHlfc3NpemVfdCByOwogCi0JCWlubGVmdCA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOwotCQlvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+b3V0YnVmX2VuZCAtIGJ1Zi0+b3V0YnVmKTsKKyAgICAgICAgaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7CisgICAgICAgIG91dGxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLT5vdXRidWZfZW5kIC0gYnVmLT5vdXRidWYpOwogCi0JCXIgPSBjdHgtPmNvZGVjLT5kZWNvZGUoJmN0eC0+c3RhdGUsIGN0eC0+Y29kZWMtPmNvbmZpZywKLQkJCSZidWYtPmluYnVmLCBpbmxlZnQsICZidWYtPm91dGJ1Ziwgb3V0bGVmdCk7Ci0JCWlmIChyID09IDAgfHwgciA9PSBNQkVSUl9UT09GRVcpCi0JCQlicmVhazsKLQkJZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZGVjZXJyb3IoY3R4LT5jb2RlYywgJmN0eC0+c3RhdGUsCi0JCQkJCQkgYnVmLCBjdHgtPmVycm9ycywgcikpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgICAgICByID0gY3R4LT5jb2RlYy0+ZGVjb2RlKCZjdHgtPnN0YXRlLCBjdHgtPmNvZGVjLT5jb25maWcsCisgICAgICAgICAgICAmYnVmLT5pbmJ1ZiwgaW5sZWZ0LCAmYnVmLT5vdXRidWYsIG91dGxlZnQpOworICAgICAgICBpZiAociA9PSAwIHx8IHIgPT0gTUJFUlJfVE9PRkVXKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKG11bHRpYnl0ZWNvZGVjX2RlY2Vycm9yKGN0eC0+Y29kZWMsICZjdHgtPnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGN0eC0+ZXJyb3JzLCByKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtODc3LDE0MiArODc3LDE0MiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJpZW5jb2Rlcl9lbmNvZGUoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmLAotCQkgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JUHlPYmplY3QgKmRhdGE7Ci0JaW50IGZpbmFsID0gMDsKKyAgICBQeU9iamVjdCAqZGF0YTsKKyAgICBpbnQgZmluYWwgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xpOmVuY29kZSIsCi0JCQlpbmNyZW1lbnRhbGt3YXJnbGlzdCwgJmRhdGEsICZmaW5hbCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aTplbmNvZGUiLAorICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbGt3YXJnbGlzdCwgJmRhdGEsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIGVuY29kZXJfZW5jb2RlX3N0YXRlZnVsKFNUQVRFRlVMX0VDVFgoc2VsZiksIGRhdGEsIGZpbmFsKTsKKyAgICByZXR1cm4gZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoU1RBVEVGVUxfRUNUWChzZWxmKSwgZGF0YSwgZmluYWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJpZW5jb2Rlcl9yZXNldChNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmNvZGVjLT5kZWNyZXNldCAhPSBOVUxMICYmCi0JICAgIHNlbGYtPmNvZGVjLT5kZWNyZXNldCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKKyAgICBpZiAoc2VsZi0+Y29kZWMtPmRlY3Jlc2V0ICE9IE5VTEwgJiYKKyAgICAgICAgc2VsZi0+Y29kZWMtPmRlY3Jlc2V0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbWJpZW5jb2Rlcl9tZXRob2RzW10gPSB7Ci0JeyJlbmNvZGUiLAkoUHlDRnVuY3Rpb24pbWJpZW5jb2Rlcl9lbmNvZGUsCi0JCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBOVUxMfSwKLQl7InJlc2V0IiwJKFB5Q0Z1bmN0aW9uKW1iaWVuY29kZXJfcmVzZXQsCi0JCQlNRVRIX05PQVJHUywgTlVMTH0sCi0Je05VTEwsCQlOVUxMfSwKKyAgICB7ImVuY29kZSIsICAgICAgICAgIChQeUNGdW5jdGlvbiltYmllbmNvZGVyX2VuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgTlVMTH0sCisgICAgeyJyZXNldCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pbWJpZW5jb2Rlcl9yZXNldCwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIE5VTEx9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJpZW5jb2Rlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICpjb2RlYyA9IE5VTEw7Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKKyAgICBNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKmNvZGVjID0gTlVMTDsKKyAgICBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxzOkluY3JlbWVudGFsRW5jb2RlciIsCi0JCQkJCSBpbmNuZXdrd2FyZ2xpc3QsICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifHM6SW5jcmVtZW50YWxFbmNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNuZXdrd2FyZ2xpc3QsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYgPSAoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc2VsZiA9IChNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKil0eXBlLCAiY29kZWMiKTsKLQlpZiAoY29kZWMgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JaWYgKCFNdWx0aWJ5dGVDb2RlY19DaGVjayhjb2RlYykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvZGVjIGlzIHVuZXhwZWN0ZWQgdHlwZSIpOwotCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOworICAgIGlmIChjb2RlYyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7Ci0JaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoc2VsZi0+Y29kZWMtPmVuY2luaXQgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5jb2RlYy0+ZW5jaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OworICAgIHNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIHNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisgICAgaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoc2VsZi0+Y29kZWMtPmVuY2luaXQgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5jb2RlYy0+ZW5jaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JUHlfREVDUkVGKGNvZGVjKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeV9ERUNSRUYoY29kZWMpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogCiBlcnJvcmV4aXQ6Ci0JUHlfWERFQ1JFRihzZWxmKTsKLQlQeV9YREVDUkVGKGNvZGVjKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKHNlbGYpOworICAgIFB5X1hERUNSRUYoY29kZWMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBtYmllbmNvZGVyX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbWJpZW5jb2Rlcl90cmF2ZXJzZShNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYsCi0JCSAgICB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCi0JCVB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCisgICAgICAgIFB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBtYmllbmNvZGVyX2RlYWxsb2MoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0JRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworICAgIEVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciIsCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiAgbWV0aG9kcyAgKi8KLQkoZGVzdHJ1Y3RvciltYmllbmNvZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCi0JCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKW1iaWVuY29kZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KLQltYmllbmNvZGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCWNvZGVjY3R4X2dldHNldHMsCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQltYmllbmNvZGVyX2luaXQsCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQltYmllbmNvZGVyX25ldywJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyIiwgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdCksIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogIG1ldGhvZHMgICovCisgICAgKGRlc3RydWN0b3IpbWJpZW5jb2Rlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisgICAgICAgIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKW1iaWVuY29kZXJfdHJhdmVyc2UsICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJleHQgKi8KKyAgICBtYmllbmNvZGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGNvZGVjY3R4X2dldHNldHMsICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIG1iaWVuY29kZXJfaW5pdCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIG1iaWVuY29kZXJfbmV3LCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogCkBAIC0xMDIyLDIwNiArMTAyMiwyMDYgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1iaWRlY29kZXJfZGVjb2RlKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZiwKLQkJICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCU11bHRpYnl0ZURlY29kZUJ1ZmZlciBidWY7Ci0JY2hhciAqZGF0YSwgKndkYXRhID0gTlVMTDsKLQlQeV9idWZmZXIgcGRhdGE7Ci0JUHlfc3NpemVfdCB3c2l6ZSwgZmluYWxzaXplID0gMCwgc2l6ZSwgb3JpZ3BlbmRpbmc7Ci0JaW50IGZpbmFsID0gMDsKKyAgICBNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgYnVmOworICAgIGNoYXIgKmRhdGEsICp3ZGF0YSA9IE5VTEw7CisgICAgUHlfYnVmZmVyIHBkYXRhOworICAgIFB5X3NzaXplX3Qgd3NpemUsIGZpbmFsc2l6ZSA9IDAsIHNpemUsIG9yaWdwZW5kaW5nOworICAgIGludCBmaW5hbCA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzKnxpOmRlY29kZSIsCi0JCQlpbmNyZW1lbnRhbGt3YXJnbGlzdCwgJnBkYXRhLCAmZmluYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhID0gcGRhdGEuYnVmOwotCXNpemUgPSBwZGF0YS5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyp8aTpkZWNvZGUiLAorICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbGt3YXJnbGlzdCwgJnBkYXRhLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gcGRhdGEuYnVmOworICAgIHNpemUgPSBwZGF0YS5sZW47CiAKLQlidWYub3V0b2JqID0gYnVmLmV4Y29iaiA9IE5VTEw7Ci0Jb3JpZ3BlbmRpbmcgPSBzZWxmLT5wZW5kaW5nc2l6ZTsKKyAgICBidWYub3V0b2JqID0gYnVmLmV4Y29iaiA9IE5VTEw7CisgICAgb3JpZ3BlbmRpbmcgPSBzZWxmLT5wZW5kaW5nc2l6ZTsKIAotCWlmIChzZWxmLT5wZW5kaW5nc2l6ZSA9PSAwKSB7Ci0JCXdzaXplID0gc2l6ZTsKLQkJd2RhdGEgPSBkYXRhOwotCX0KLQllbHNlIHsKLQkJaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIHNlbGYtPnBlbmRpbmdzaXplKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KLQkJd3NpemUgPSBzaXplICsgc2VsZi0+cGVuZGluZ3NpemU7Ci0JCXdkYXRhID0gUHlNZW1fTWFsbG9jKHdzaXplKTsKLQkJaWYgKHdkYXRhID09IE5VTEwpCi0JCQlnb3RvIGVycm9yZXhpdDsKLQkJbWVtY3B5KHdkYXRhLCBzZWxmLT5wZW5kaW5nLCBzZWxmLT5wZW5kaW5nc2l6ZSk7Ci0JCW1lbWNweSh3ZGF0YSArIHNlbGYtPnBlbmRpbmdzaXplLCBkYXRhLCBzaXplKTsKLQkJc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCX0KKyAgICBpZiAoc2VsZi0+cGVuZGluZ3NpemUgPT0gMCkgeworICAgICAgICB3c2l6ZSA9IHNpemU7CisgICAgICAgIHdkYXRhID0gZGF0YTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLSBzZWxmLT5wZW5kaW5nc2l6ZSkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgICAgICB9CisgICAgICAgIHdzaXplID0gc2l6ZSArIHNlbGYtPnBlbmRpbmdzaXplOworICAgICAgICB3ZGF0YSA9IFB5TWVtX01hbGxvYyh3c2l6ZSk7CisgICAgICAgIGlmICh3ZGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIG1lbWNweSh3ZGF0YSwgc2VsZi0+cGVuZGluZywgc2VsZi0+cGVuZGluZ3NpemUpOworICAgICAgICBtZW1jcHkod2RhdGEgKyBzZWxmLT5wZW5kaW5nc2l6ZSwgZGF0YSwgc2l6ZSk7CisgICAgICAgIHNlbGYtPnBlbmRpbmdzaXplID0gMDsKKyAgICB9CiAKLQlpZiAoZGVjb2Rlcl9wcmVwYXJlX2J1ZmZlcigmYnVmLCB3ZGF0YSwgd3NpemUpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OworICAgIGlmIChkZWNvZGVyX3ByZXBhcmVfYnVmZmVyKCZidWYsIHdkYXRhLCB3c2l6ZSkgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoZGVjb2Rlcl9mZWVkX2J1ZmZlcihTVEFURUZVTF9EQ1RYKHNlbGYpLCAmYnVmKSkKLQkJZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKGRlY29kZXJfZmVlZF9idWZmZXIoU1RBVEVGVUxfRENUWChzZWxmKSwgJmJ1ZikpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JaWYgKGZpbmFsICYmIGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsKLQkJaWYgKG11bHRpYnl0ZWNvZGVjX2RlY2Vycm9yKHNlbGYtPmNvZGVjLCAmc2VsZi0+c3RhdGUsCi0JCQkJJmJ1Ziwgc2VsZi0+ZXJyb3JzLCBNQkVSUl9UT09GRVcpKSB7Ci0JCQkvKiByZWNvdmVyIHRoZSBvcmlnaW5hbCBwZW5kaW5nIGJ1ZmZlciAqLwotCQkJbWVtY3B5KHNlbGYtPnBlbmRpbmcsIHdkYXRhLCBvcmlncGVuZGluZyk7Ci0JCQlzZWxmLT5wZW5kaW5nc2l6ZSA9IG9yaWdwZW5kaW5nOwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KLQl9CisgICAgaWYgKGZpbmFsICYmIGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsKKyAgICAgICAgaWYgKG11bHRpYnl0ZWNvZGVjX2RlY2Vycm9yKHNlbGYtPmNvZGVjLCAmc2VsZi0+c3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCBzZWxmLT5lcnJvcnMsIE1CRVJSX1RPT0ZFVykpIHsKKyAgICAgICAgICAgIC8qIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBlbmRpbmcgYnVmZmVyICovCisgICAgICAgICAgICBtZW1jcHkoc2VsZi0+cGVuZGluZywgd2RhdGEsIG9yaWdwZW5kaW5nKTsKKyAgICAgICAgICAgIHNlbGYtPnBlbmRpbmdzaXplID0gb3JpZ3BlbmRpbmc7CisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kKSB7IC8qIHBlbmRpbmcgc2VxdWVuY2Ugc3RpbGwgZXhpc3RzICovCi0JCWlmIChkZWNvZGVyX2FwcGVuZF9wZW5kaW5nKFNUQVRFRlVMX0RDVFgoc2VsZiksICZidWYpICE9IDApCi0JCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsgLyogcGVuZGluZyBzZXF1ZW5jZSBzdGlsbCBleGlzdHMgKi8KKyAgICAgICAgaWYgKGRlY29kZXJfYXBwZW5kX3BlbmRpbmcoU1RBVEVGVUxfRENUWChzZWxmKSwgJmJ1ZikgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCWZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmIC0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOwotCWlmIChmaW5hbHNpemUgIT0gUHlVbmljb2RlX0dFVF9TSVpFKGJ1Zi5vdXRvYmopKQotCQlpZiAoUHlVbmljb2RlX1Jlc2l6ZSgmYnVmLm91dG9iaiwgZmluYWxzaXplKSA9PSAtMSkKLQkJCWdvdG8gZXJyb3JleGl0OworICAgIGZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmIC0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOworICAgIGlmIChmaW5hbHNpemUgIT0gUHlVbmljb2RlX0dFVF9TSVpFKGJ1Zi5vdXRvYmopKQorICAgICAgICBpZiAoUHlVbmljb2RlX1Jlc2l6ZSgmYnVmLm91dG9iaiwgZmluYWxzaXplKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCWlmICh3ZGF0YSAhPSBkYXRhKQotCQlQeU1lbV9EZWwod2RhdGEpOwotCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7Ci0JcmV0dXJuIGJ1Zi5vdXRvYmo7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIGlmICh3ZGF0YSAhPSBkYXRhKQorICAgICAgICBQeU1lbV9EZWwod2RhdGEpOworICAgIFB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisgICAgcmV0dXJuIGJ1Zi5vdXRvYmo7CiAKIGVycm9yZXhpdDoKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JaWYgKHdkYXRhICE9IE5VTEwgJiYgd2RhdGEgIT0gZGF0YSkKLQkJUHlNZW1fRGVsKHdkYXRhKTsKLQlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCVB5X1hERUNSRUYoYnVmLm91dG9iaik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIGlmICh3ZGF0YSAhPSBOVUxMICYmIHdkYXRhICE9IGRhdGEpCisgICAgICAgIFB5TWVtX0RlbCh3ZGF0YSk7CisgICAgUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKKyAgICBQeV9YREVDUkVGKGJ1Zi5vdXRvYmopOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJpZGVjb2Rlcl9yZXNldChNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmNvZGVjLT5kZWNyZXNldCAhPSBOVUxMICYmCi0JICAgIHNlbGYtPmNvZGVjLT5kZWNyZXNldCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKKyAgICBpZiAoc2VsZi0+Y29kZWMtPmRlY3Jlc2V0ICE9IE5VTEwgJiYKKyAgICAgICAgc2VsZi0+Y29kZWMtPmRlY3Jlc2V0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbWJpZGVjb2Rlcl9tZXRob2RzW10gPSB7Ci0JeyJkZWNvZGUiLAkoUHlDRnVuY3Rpb24pbWJpZGVjb2Rlcl9kZWNvZGUsCi0JCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBOVUxMfSwKLQl7InJlc2V0IiwJKFB5Q0Z1bmN0aW9uKW1iaWRlY29kZXJfcmVzZXQsCi0JCQlNRVRIX05PQVJHUywgTlVMTH0sCi0Je05VTEwsCQlOVUxMfSwKKyAgICB7ImRlY29kZSIsICAgICAgICAgIChQeUNGdW5jdGlvbiltYmlkZWNvZGVyX2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgTlVMTH0sCisgICAgeyJyZXNldCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pbWJpZGVjb2Rlcl9yZXNldCwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIE5VTEx9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJpZGVjb2Rlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICpjb2RlYyA9IE5VTEw7Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKKyAgICBNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKmNvZGVjID0gTlVMTDsKKyAgICBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxzOkluY3JlbWVudGFsRGVjb2RlciIsCi0JCQkJCSBpbmNuZXdrd2FyZ2xpc3QsICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifHM6SW5jcmVtZW50YWxEZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNuZXdrd2FyZ2xpc3QsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYgPSAoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc2VsZiA9IChNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKil0eXBlLCAiY29kZWMiKTsKLQlpZiAoY29kZWMgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JaWYgKCFNdWx0aWJ5dGVDb2RlY19DaGVjayhjb2RlYykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvZGVjIGlzIHVuZXhwZWN0ZWQgdHlwZSIpOwotCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOworICAgIGlmIChjb2RlYyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7Ci0JaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OworICAgIHNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIHNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisgICAgaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JUHlfREVDUkVGKGNvZGVjKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeV9ERUNSRUYoY29kZWMpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogCiBlcnJvcmV4aXQ6Ci0JUHlfWERFQ1JFRihzZWxmKTsKLQlQeV9YREVDUkVGKGNvZGVjKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKHNlbGYpOworICAgIFB5X1hERUNSRUYoY29kZWMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBtYmlkZWNvZGVyX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbWJpZGVjb2Rlcl90cmF2ZXJzZShNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKnNlbGYsCi0JCSAgICB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCi0JCVB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCisgICAgICAgIFB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBtYmlkZWNvZGVyX2RlYWxsb2MoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0JRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworICAgIEVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciIsCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiAgbWV0aG9kcyAgKi8KLQkoZGVzdHJ1Y3RvciltYmlkZWNvZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCi0JCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKW1iaWRlY29kZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KLQltYmlkZWNvZGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCWNvZGVjY3R4X2dldHNldHMsCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQltYmlkZWNvZGVyX2luaXQsCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQltYmlkZWNvZGVyX25ldywJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyIiwgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCksIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogIG1ldGhvZHMgICovCisgICAgKGRlc3RydWN0b3IpbWJpZGVjb2Rlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisgICAgICAgIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKW1iaWRlY29kZXJfdHJhdmVyc2UsICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJleHQgKi8KKyAgICBtYmlkZWNvZGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGNvZGVjY3R4X2dldHNldHMsICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIG1iaWRlY29kZXJfaW5pdCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIG1iaWRlY29kZXJfbmV3LCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogCkBAIC0xMjMxLDMxNyArMTIzMSwzMTcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtcmVhZGVyX2lyZWFkKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZiwKLQkJICAgICBjb25zdCBjaGFyICptZXRob2QsIFB5X3NzaXplX3Qgc2l6ZWhpbnQpCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRob2QsIFB5X3NzaXplX3Qgc2l6ZWhpbnQpCiB7Ci0JTXVsdGlieXRlRGVjb2RlQnVmZmVyIGJ1ZjsKLQlQeU9iamVjdCAqY3JlczsKLQlQeV9zc2l6ZV90IHJzaXplLCBmaW5hbHNpemUgPSAwOworICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciBidWY7CisgICAgUHlPYmplY3QgKmNyZXM7CisgICAgUHlfc3NpemVfdCByc2l6ZSwgZmluYWxzaXplID0gMDsKIAotCWlmIChzaXplaGludCA9PSAwKQotCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApOworICAgIGlmIChzaXplaGludCA9PSAwKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApOwogCi0JYnVmLm91dG9iaiA9IGJ1Zi5leGNvYmogPSBOVUxMOwotCWNyZXMgPSBOVUxMOworICAgIGJ1Zi5vdXRvYmogPSBidWYuZXhjb2JqID0gTlVMTDsKKyAgICBjcmVzID0gTlVMTDsKIAotCWZvciAoOzspIHsKLQkJaW50IGVuZG9mZmlsZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBlbmRvZmZpbGU7CiAKLQkJaWYgKHNpemVoaW50IDwgMCkKLQkJCWNyZXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPnN0cmVhbSwKLQkJCQkJKGNoYXIgKiltZXRob2QsIE5VTEwpOwotCQllbHNlCi0JCQljcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5zdHJlYW0sCi0JCQkJCShjaGFyICopbWV0aG9kLCAiaSIsIHNpemVoaW50KTsKLQkJaWYgKGNyZXMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JleGl0OworICAgICAgICBpZiAoc2l6ZWhpbnQgPCAwKQorICAgICAgICAgICAgY3JlcyA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWV0aG9kLCBOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3JlcyA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWV0aG9kLCAiaSIsIHNpemVoaW50KTsKKyAgICAgICAgaWYgKGNyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JCWlmICghUHlTdHJpbmdfQ2hlY2soY3JlcykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJzdHJlYW0gZnVuY3Rpb24gcmV0dXJuZWQgYSAiCi0JCQkJCSJub24tc3RyaW5nIG9iamVjdCIpOwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhjcmVzKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtIGZ1bmN0aW9uIHJldHVybmVkIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub24tc3RyaW5nIG9iamVjdCIpOworICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIH0KIAotCQllbmRvZmZpbGUgPSAoUHlTdHJpbmdfR0VUX1NJWkUoY3JlcykgPT0gMCk7CisgICAgICAgIGVuZG9mZmlsZSA9IChQeVN0cmluZ19HRVRfU0laRShjcmVzKSA9PSAwKTsKIAotCQlpZiAoc2VsZi0+cGVuZGluZ3NpemUgPiAwKSB7Ci0JCQlQeU9iamVjdCAqY3RyOwotCQkJY2hhciAqY3RyZGF0YTsKKyAgICAgICAgaWYgKHNlbGYtPnBlbmRpbmdzaXplID4gMCkgeworICAgICAgICAgICAgUHlPYmplY3QgKmN0cjsKKyAgICAgICAgICAgIGNoYXIgKmN0cmRhdGE7CiAKLQkJCWlmIChQeVN0cmluZ19HRVRfU0laRShjcmVzKSA+IFBZX1NTSVpFX1RfTUFYIC0gc2VsZi0+cGVuZGluZ3NpemUpIHsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCWdvdG8gZXJyb3JleGl0OwotICAgICAgICAgICAgfQotCQkJcnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShjcmVzKSArIHNlbGYtPnBlbmRpbmdzaXplOwotCQkJY3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcnNpemUpOwotCQkJaWYgKGN0ciA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3JleGl0OwotCQkJY3RyZGF0YSA9IFB5U3RyaW5nX0FTX1NUUklORyhjdHIpOwotCQkJbWVtY3B5KGN0cmRhdGEsIHNlbGYtPnBlbmRpbmcsIHNlbGYtPnBlbmRpbmdzaXplKTsKLQkJCW1lbWNweShjdHJkYXRhICsgc2VsZi0+cGVuZGluZ3NpemUsCi0JCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGNyZXMpLAotCQkJCVB5U3RyaW5nX0dFVF9TSVpFKGNyZXMpKTsKLQkJCVB5X0RFQ1JFRihjcmVzKTsKLQkJCWNyZXMgPSBjdHI7Ci0JCQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7Ci0JCX0KKyAgICAgICAgICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShjcmVzKSA+IFBZX1NTSVpFX1RfTUFYIC0gc2VsZi0+cGVuZGluZ3NpemUpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoY3JlcykgKyBzZWxmLT5wZW5kaW5nc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcnNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgICAgICAgICAgICAgIGN0cmRhdGEgPSBQeVN0cmluZ19BU19TVFJJTkcoY3RyKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGN0cmRhdGEsIHNlbGYtPnBlbmRpbmcsIHNlbGYtPnBlbmRpbmdzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGN0cmRhdGEgKyBzZWxmLT5wZW5kaW5nc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoY3JlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoY3JlcykpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3Jlcyk7CisgICAgICAgICAgICAgICAgICAgIGNyZXMgPSBjdHI7CisgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBlbmRpbmdzaXplID0gMDsKKyAgICAgICAgfQogCi0JCXJzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoY3Jlcyk7Ci0JCWlmIChkZWNvZGVyX3ByZXBhcmVfYnVmZmVyKCZidWYsIFB5U3RyaW5nX0FTX1NUUklORyhjcmVzKSwKLQkJCQkJICAgcnNpemUpICE9IDApCi0JCQlnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgcnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShjcmVzKTsKKyAgICAgICAgaWYgKGRlY29kZXJfcHJlcGFyZV9idWZmZXIoJmJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKGNyZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2l6ZSkgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JCWlmIChyc2l6ZSA+IDAgJiYgZGVjb2Rlcl9mZWVkX2J1ZmZlcigKLQkJCQkoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqKXNlbGYsICZidWYpKQotCQkJZ290byBlcnJvcmV4aXQ7CisgICAgICAgIGlmIChyc2l6ZSA+IDAgJiYgZGVjb2Rlcl9mZWVkX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIChNdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJDb250ZXh0ICopc2VsZiwgJmJ1ZikpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCQlpZiAoZW5kb2ZmaWxlIHx8IHNpemVoaW50IDwgMCkgewotCQkJaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQgJiYKLQkJCSAgICBtdWx0aWJ5dGVjb2RlY19kZWNlcnJvcihzZWxmLT5jb2RlYywgJnNlbGYtPnN0YXRlLAotCQkJCQkmYnVmLCBzZWxmLT5lcnJvcnMsIE1CRVJSX1RPT0ZFVykpCi0JCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KKyAgICAgICAgaWYgKGVuZG9mZmlsZSB8fCBzaXplaGludCA8IDApIHsKKyAgICAgICAgICAgIGlmIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kICYmCisgICAgICAgICAgICAgICAgbXVsdGlieXRlY29kZWNfZGVjZXJyb3Ioc2VsZi0+Y29kZWMsICZzZWxmLT5zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCBzZWxmLT5lcnJvcnMsIE1CRVJSX1RPT0ZFVykpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIH0KIAotCQlpZiAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgeyAvKiBwZW5kaW5nIHNlcXVlbmNlIGV4aXN0cyAqLwotCQkJaWYgKGRlY29kZXJfYXBwZW5kX3BlbmRpbmcoU1RBVEVGVUxfRENUWChzZWxmKSwKLQkJCQkJCSAgICZidWYpICE9IDApCi0JCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KKyAgICAgICAgaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsgLyogcGVuZGluZyBzZXF1ZW5jZSBleGlzdHMgKi8KKyAgICAgICAgICAgIGlmIChkZWNvZGVyX2FwcGVuZF9wZW5kaW5nKFNUQVRFRlVMX0RDVFgoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmKSAhPSAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgICAgICB9CiAKLQkJZmluYWxzaXplID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWYgLQotCQkJCVB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi5vdXRvYmopKTsKLQkJUHlfREVDUkVGKGNyZXMpOwotCQljcmVzID0gTlVMTDsKKyAgICAgICAgZmluYWxzaXplID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWYgLQorICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOworICAgICAgICBQeV9ERUNSRUYoY3Jlcyk7CisgICAgICAgIGNyZXMgPSBOVUxMOwogCi0JCWlmIChzaXplaGludCA8IDAgfHwgZmluYWxzaXplICE9IDAgfHwgcnNpemUgPT0gMCkKLQkJCWJyZWFrOworICAgICAgICBpZiAoc2l6ZWhpbnQgPCAwIHx8IGZpbmFsc2l6ZSAhPSAwIHx8IHJzaXplID09IDApCisgICAgICAgICAgICBicmVhazsKIAotCQlzaXplaGludCA9IDE7IC8qIHJlYWQgMSBtb3JlIGJ5dGUgYW5kIHJldHJ5ICovCi0JfQorICAgICAgICBzaXplaGludCA9IDE7IC8qIHJlYWQgMSBtb3JlIGJ5dGUgYW5kIHJldHJ5ICovCisgICAgfQogCi0JaWYgKGZpbmFsc2l6ZSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaikpCi0JCWlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQotCQkJZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKGZpbmFsc2l6ZSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaikpCisgICAgICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlQeV9YREVDUkVGKGNyZXMpOwotCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7Ci0JcmV0dXJuIGJ1Zi5vdXRvYmo7CisgICAgUHlfWERFQ1JFRihjcmVzKTsKKyAgICBQeV9YREVDUkVGKGJ1Zi5leGNvYmopOworICAgIHJldHVybiBidWYub3V0b2JqOwogCiBlcnJvcmV4aXQ6Ci0JUHlfWERFQ1JFRihjcmVzKTsKLQlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCVB5X1hERUNSRUYoYnVmLm91dG9iaik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihjcmVzKTsKKyAgICBQeV9YREVDUkVGKGJ1Zi5leGNvYmopOworICAgIFB5X1hERUNSRUYoYnVmLm91dG9iaik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYnN0cmVhbXJlYWRlcl9yZWFkKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNpemVvYmogPSBOVUxMOwotCVB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeU9iamVjdCAqc2l6ZW9iaiA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZCIsIDAsIDEsICZzaXplb2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZCIsIDAsIDEsICZzaXplb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc2l6ZW9iaiA9PSBQeV9Ob25lIHx8IHNpemVvYmogPT0gTlVMTCkKLQkJc2l6ZSA9IC0xOwotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHNpemVvYmopKQotCQlzaXplID0gUHlJbnRfQXNTc2l6ZV90KHNpemVvYmopOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIDEgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2l6ZW9iaiA9PSBQeV9Ob25lIHx8IHNpemVvYmogPT0gTlVMTCkKKyAgICAgICAgc2l6ZSA9IC0xOworICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHNpemVvYmopKQorICAgICAgICBzaXplID0gUHlJbnRfQXNTc2l6ZV90KHNpemVvYmopOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIDEgbXVzdCBiZSBhbiBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBtYnN0cmVhbXJlYWRlcl9pcmVhZChzZWxmLCAicmVhZCIsIHNpemUpOworICAgIHJldHVybiBtYnN0cmVhbXJlYWRlcl9pcmVhZChzZWxmLCAicmVhZCIsIHNpemUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJzdHJlYW1yZWFkZXJfcmVhZGxpbmUoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc2l6ZW9iaiA9IE5VTEw7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIFB5T2JqZWN0ICpzaXplb2JqID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkbGluZSIsIDAsIDEsICZzaXplb2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZGxpbmUiLCAwLCAxLCAmc2l6ZW9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHNpemVvYmogPT0gUHlfTm9uZSB8fCBzaXplb2JqID09IE5VTEwpCi0JCXNpemUgPSAtMTsKLQllbHNlIGlmIChQeUludF9DaGVjayhzaXplb2JqKSkKLQkJc2l6ZSA9IFB5SW50X0FzU3NpemVfdChzaXplb2JqKTsKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZyAxIG11c3QgYmUgYW4gaW50ZWdlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNpemVvYmogPT0gUHlfTm9uZSB8fCBzaXplb2JqID09IE5VTEwpCisgICAgICAgIHNpemUgPSAtMTsKKyAgICBlbHNlIGlmIChQeUludF9DaGVjayhzaXplb2JqKSkKKyAgICAgICAgc2l6ZSA9IFB5SW50X0FzU3NpemVfdChzaXplb2JqKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZyAxIG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gbWJzdHJlYW1yZWFkZXJfaXJlYWQoc2VsZiwgInJlYWRsaW5lIiwgc2l6ZSk7CisgICAgcmV0dXJuIG1ic3RyZWFtcmVhZGVyX2lyZWFkKHNlbGYsICJyZWFkbGluZSIsIHNpemUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJzdHJlYW1yZWFkZXJfcmVhZGxpbmVzKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNpemVoaW50b2JqID0gTlVMTCwgKnIsICpzcjsKLQlQeV9zc2l6ZV90IHNpemVoaW50OworICAgIFB5T2JqZWN0ICpzaXplaGludG9iaiA9IE5VTEwsICpyLCAqc3I7CisgICAgUHlfc3NpemVfdCBzaXplaGludDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lcyIsIDAsIDEsICZzaXplaGludG9iaikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lcyIsIDAsIDEsICZzaXplaGludG9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHNpemVoaW50b2JqID09IFB5X05vbmUgfHwgc2l6ZWhpbnRvYmogPT0gTlVMTCkKLQkJc2l6ZWhpbnQgPSAtMTsKLQllbHNlIGlmIChQeUludF9DaGVjayhzaXplaGludG9iaikpCi0JCXNpemVoaW50ID0gUHlJbnRfQXNTc2l6ZV90KHNpemVoaW50b2JqKTsKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZyAxIG11c3QgYmUgYW4gaW50ZWdlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNpemVoaW50b2JqID09IFB5X05vbmUgfHwgc2l6ZWhpbnRvYmogPT0gTlVMTCkKKyAgICAgICAgc2l6ZWhpbnQgPSAtMTsKKyAgICBlbHNlIGlmIChQeUludF9DaGVjayhzaXplaGludG9iaikpCisgICAgICAgIHNpemVoaW50ID0gUHlJbnRfQXNTc2l6ZV90KHNpemVoaW50b2JqKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZyAxIG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyID0gbWJzdHJlYW1yZWFkZXJfaXJlYWQoc2VsZiwgInJlYWQiLCBzaXplaGludCk7Ci0JaWYgKHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgciA9IG1ic3RyZWFtcmVhZGVyX2lyZWFkKHNlbGYsICJyZWFkIiwgc2l6ZWhpbnQpOworICAgIGlmIChyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3IgPSBQeVVuaWNvZGVfU3BsaXRsaW5lcyhyLCAxKTsKLQlQeV9ERUNSRUYocik7Ci0JcmV0dXJuIHNyOworICAgIHNyID0gUHlVbmljb2RlX1NwbGl0bGluZXMociwgMSk7CisgICAgUHlfREVDUkVGKHIpOworICAgIHJldHVybiBzcjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtcmVhZGVyX3Jlc2V0KE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+Y29kZWMtPmRlY3Jlc2V0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmRlY3Jlc2V0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIGlmIChzZWxmLT5jb2RlYy0+ZGVjcmVzZXQgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5jb2RlYy0+ZGVjcmVzZXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYnN0cmVhbXJlYWRlcl9tZXRob2RzW10gPSB7Ci0JeyJyZWFkIiwJKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtcmVhZGVyX3JlYWQsCi0JCQlNRVRIX1ZBUkFSR1MsIE5VTEx9LAotCXsicmVhZGxpbmUiLAkoUHlDRnVuY3Rpb24pbWJzdHJlYW1yZWFkZXJfcmVhZGxpbmUsCi0JCQlNRVRIX1ZBUkFSR1MsIE5VTEx9LAotCXsicmVhZGxpbmVzIiwJKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtcmVhZGVyX3JlYWRsaW5lcywKLQkJCU1FVEhfVkFSQVJHUywgTlVMTH0sCi0JeyJyZXNldCIsCShQeUNGdW5jdGlvbiltYnN0cmVhbXJlYWRlcl9yZXNldCwKLQkJCU1FVEhfTk9BUkdTLCBOVUxMfSwKLQl7TlVMTCwJCU5VTEx9LAorICAgIHsicmVhZCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtcmVhZGVyX3JlYWQsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywgTlVMTH0sCisgICAgeyJyZWFkbGluZSIsICAgICAgICAoUHlDRnVuY3Rpb24pbWJzdHJlYW1yZWFkZXJfcmVhZGxpbmUsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywgTlVMTH0sCisgICAgeyJyZWFkbGluZXMiLCAgICAgICAoUHlDRnVuY3Rpb24pbWJzdHJlYW1yZWFkZXJfcmVhZGxpbmVzLAorICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsIE5VTEx9LAorICAgIHsicmVzZXQiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtcmVhZGVyX3Jlc2V0LAorICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgTlVMTH0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSwKIH07CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBtYnN0cmVhbXJlYWRlcl9tZW1iZXJzW10gPSB7Ci0JeyJzdHJlYW0iLAlUX09CSkVDVCwKLQkJCW9mZnNldG9mKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCwgc3RyZWFtKSwKLQkJCVJFQURPTkxZLCBOVUxMfSwKLQl7TlVMTCx9CisgICAgeyJzdHJlYW0iLCAgICAgICAgICBUX09CSkVDVCwKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0LCBzdHJlYW0pLAorICAgICAgICAgICAgICAgICAgICBSRUFET05MWSwgTlVMTH0sCisgICAge05VTEwsfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtcmVhZGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKnN0cmVhbSwgKmNvZGVjID0gTlVMTDsKLQljaGFyICplcnJvcnMgPSBOVUxMOworICAgIE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc3RyZWFtLCAqY29kZWMgPSBOVUxMOworICAgIGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xzOlN0cmVhbVJlYWRlciIsCi0JCQkJc3RyZWFta3dhcmdsaXN0LCAmc3RyZWFtLCAmZXJyb3JzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98czpTdHJlYW1SZWFkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbWt3YXJnbGlzdCwgJnN0cmVhbSwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZWxmID0gKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOwotCWlmIChjb2RlYyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBjb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopdHlwZSwgImNvZGVjIik7CisgICAgaWYgKGNvZGVjID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGlmICghTXVsdGlieXRlQ29kZWNfQ2hlY2soY29kZWMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBpcyB1bmV4cGVjdGVkIHR5cGUiKTsKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQogCi0Jc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKLQlzZWxmLT5zdHJlYW0gPSBzdHJlYW07Ci0JUHlfSU5DUkVGKHN0cmVhbSk7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7Ci0JaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OworICAgIHNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisgICAgc2VsZi0+c3RyZWFtID0gc3RyZWFtOworICAgIFB5X0lOQ1JFRihzdHJlYW0pOworICAgIHNlbGYtPnBlbmRpbmdzaXplID0gMDsKKyAgICBzZWxmLT5lcnJvcnMgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOworICAgIGlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKHNlbGYtPmNvZGVjLT5kZWNpbml0ICE9IE5VTEwgJiYKKyAgICAgICAgc2VsZi0+Y29kZWMtPmRlY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCVB5X0RFQ1JFRihjb2RlYyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgUHlfREVDUkVGKGNvZGVjKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIAogZXJyb3JleGl0OgotCVB5X1hERUNSRUYoc2VsZik7Ci0JUHlfWERFQ1JFRihjb2RlYyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihzZWxmKTsKKyAgICBQeV9YREVDUkVGKGNvZGVjKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogbWJzdHJlYW1yZWFkZXJfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBtYnN0cmVhbXJlYWRlcl90cmF2ZXJzZShNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKnNlbGYsCi0JCQl2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWlmIChFUlJPUl9JU0NVU1RPTShzZWxmLT5lcnJvcnMpKQotCQlQeV9WSVNJVChzZWxmLT5lcnJvcnMpOwotCVB5X1ZJU0lUKHNlbGYtPnN0cmVhbSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCisgICAgICAgIFB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7CisgICAgUHlfVklTSVQoc2VsZi0+c3RyZWFtKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIG1ic3RyZWFtcmVhZGVyX2RlYWxsb2MoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0JRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5zdHJlYW0pOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKyAgICBFUlJPUl9ERUNSRUYoc2VsZi0+ZXJyb3JzKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnN0cmVhbSk7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVTdHJlYW1SZWFkZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiTXVsdGlieXRlU3RyZWFtUmVhZGVyIiwJLyogdHBfbmFtZSAqLwotCXNpemVvZihNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QpLCAvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qICBtZXRob2RzICAqLwotCShkZXN0cnVjdG9yKW1ic3RyZWFtcmVhZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCi0JCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKW1ic3RyZWFtcmVhZGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVyZXh0ICovCi0JbWJzdHJlYW1yZWFkZXJfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KLQltYnN0cmVhbXJlYWRlcl9tZW1iZXJzLAkJLyogdHBfbWVtYmVycyAqLwotCWNvZGVjY3R4X2dldHNldHMsCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQltYnN0cmVhbXJlYWRlcl9pbml0LAkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JbWJzdHJlYW1yZWFkZXJfbmV3LAkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIk11bHRpYnl0ZVN0cmVhbVJlYWRlciIsICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QpLCAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qICBtZXRob2RzICAqLworICAgIChkZXN0cnVjdG9yKW1ic3RyZWFtcmVhZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKKyAgICAgICAgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbWJzdHJlYW1yZWFkZXJfdHJhdmVyc2UsICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcmV4dCAqLworICAgIG1ic3RyZWFtcmVhZGVyX21ldGhvZHMsICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBtYnN0cmVhbXJlYWRlcl9tZW1iZXJzLCAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgY29kZWNjdHhfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgbWJzdHJlYW1yZWFkZXJfaW5pdCwgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgbWJzdHJlYW1yZWFkZXJfbmV3LCAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAKQEAgLTE1NTEsMjE2ICsxNTUxLDIxNiBAQAogCiBzdGF0aWMgaW50CiBtYnN0cmVhbXdyaXRlcl9pd3JpdGUoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmLAotCQkgICAgICBQeU9iamVjdCAqdW5pc3RyKQorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp1bmlzdHIpCiB7Ci0JUHlPYmplY3QgKnN0ciwgKndyOworICAgIFB5T2JqZWN0ICpzdHIsICp3cjsKIAotCXN0ciA9IGVuY29kZXJfZW5jb2RlX3N0YXRlZnVsKFNUQVRFRlVMX0VDVFgoc2VsZiksIHVuaXN0ciwgMCk7Ci0JaWYgKHN0ciA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgc3RyID0gZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoU1RBVEVGVUxfRUNUWChzZWxmKSwgdW5pc3RyLCAwKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXdyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5zdHJlYW0sICJ3cml0ZSIsICJPIiwgc3RyKTsKLQlQeV9ERUNSRUYoc3RyKTsKLQlpZiAod3IgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIHdyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5zdHJlYW0sICJ3cml0ZSIsICJPIiwgc3RyKTsKKyAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICBpZiAod3IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUHlfREVDUkVGKHdyKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYod3IpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJzdHJlYW13cml0ZXJfd3JpdGUoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc3Ryb2JqKQogewotCWlmIChtYnN0cmVhbXdyaXRlcl9pd3JpdGUoc2VsZiwgc3Ryb2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAobWJzdHJlYW13cml0ZXJfaXdyaXRlKHNlbGYsIHN0cm9iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYnN0cmVhbXdyaXRlcl93cml0ZWxpbmVzKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmxpbmVzKQogewotCVB5T2JqZWN0ICpzdHJvYmo7Ci0JaW50IGksIHI7CisgICAgUHlPYmplY3QgKnN0cm9iajsKKyAgICBpbnQgaSwgcjsKIAotCWlmICghUHlTZXF1ZW5jZV9DaGVjayhsaW5lcykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXJnIG11c3QgYmUgYSBzZXF1ZW5jZSBvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlTZXF1ZW5jZV9DaGVjayhsaW5lcykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmcgbXVzdCBiZSBhIHNlcXVlbmNlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgUHlTZXF1ZW5jZV9MZW5ndGgobGluZXMpOyBpKyspIHsKLQkJLyogbGVuZ3RoIGNhbiBiZSBjaGFuZ2VkIGV2ZW4gd2l0aGluIHRoaXMgbG9vcCAqLwotCQlzdHJvYmogPSBQeVNlcXVlbmNlX0dldEl0ZW0obGluZXMsIGkpOwotCQlpZiAoc3Ryb2JqID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlTZXF1ZW5jZV9MZW5ndGgobGluZXMpOyBpKyspIHsKKyAgICAgICAgLyogbGVuZ3RoIGNhbiBiZSBjaGFuZ2VkIGV2ZW4gd2l0aGluIHRoaXMgbG9vcCAqLworICAgICAgICBzdHJvYmogPSBQeVNlcXVlbmNlX0dldEl0ZW0obGluZXMsIGkpOworICAgICAgICBpZiAoc3Ryb2JqID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlyID0gbWJzdHJlYW13cml0ZXJfaXdyaXRlKHNlbGYsIHN0cm9iaik7Ci0JCVB5X0RFQ1JFRihzdHJvYmopOwotCQlpZiAociA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgciA9IG1ic3RyZWFtd3JpdGVyX2l3cml0ZShzZWxmLCBzdHJvYmopOworICAgICAgICBQeV9ERUNSRUYoc3Ryb2JqKTsKKyAgICAgICAgaWYgKHIgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtd3JpdGVyX3Jlc2V0KE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZikKIHsKLQljb25zdCBQeV9VTklDT0RFICpwZW5kaW5nOwotCVB5T2JqZWN0ICpwd3J0OworICAgIGNvbnN0IFB5X1VOSUNPREUgKnBlbmRpbmc7CisgICAgUHlPYmplY3QgKnB3cnQ7CiAKLQlwZW5kaW5nID0gc2VsZi0+cGVuZGluZzsKLQlwd3J0ID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKHNlbGYtPmNvZGVjLCAmc2VsZi0+c3RhdGUsCi0JCQkmcGVuZGluZywgc2VsZi0+cGVuZGluZ3NpemUsIHNlbGYtPmVycm9ycywKLQkJCU1CRU5DX0ZMVVNIIHwgTUJFTkNfUkVTRVQpOwotCS8qIHNvbWUgcGVuZGluZyBidWZmZXIgY2FuIGJlIHRydW5jYXRlZCB3aGVuIFVuaWNvZGVFbmNvZGVFcnJvciBpcwotCSAqIHJhaXNlZCBvbiAnc3RyaWN0JyBtb2RlLiBidXQsICdyZXNldCcgbWV0aG9kIGlzIGRlc2lnbmVkIHRvCi0JICogcmVzZXQgdGhlIHBlbmRpbmcgYnVmZmVyIG9yIHN0YXRlcyBzbyBmYWlsZWQgc3RyaW5nIHNlcXVlbmNlCi0JICogb3VnaHQgdG8gYmUgbWlzc2VkICovCi0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCWlmIChwd3J0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHBlbmRpbmcgPSBzZWxmLT5wZW5kaW5nOworICAgIHB3cnQgPSBtdWx0aWJ5dGVjb2RlY19lbmNvZGUoc2VsZi0+Y29kZWMsICZzZWxmLT5zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgJnBlbmRpbmcsIHNlbGYtPnBlbmRpbmdzaXplLCBzZWxmLT5lcnJvcnMsCisgICAgICAgICAgICAgICAgICAgIE1CRU5DX0ZMVVNIIHwgTUJFTkNfUkVTRVQpOworICAgIC8qIHNvbWUgcGVuZGluZyBidWZmZXIgY2FuIGJlIHRydW5jYXRlZCB3aGVuIFVuaWNvZGVFbmNvZGVFcnJvciBpcworICAgICAqIHJhaXNlZCBvbiAnc3RyaWN0JyBtb2RlLiBidXQsICdyZXNldCcgbWV0aG9kIGlzIGRlc2lnbmVkIHRvCisgICAgICogcmVzZXQgdGhlIHBlbmRpbmcgYnVmZmVyIG9yIHN0YXRlcyBzbyBmYWlsZWQgc3RyaW5nIHNlcXVlbmNlCisgICAgICogb3VnaHQgdG8gYmUgbWlzc2VkICovCisgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIGlmIChwd3J0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5U3RyaW5nX1NpemUocHdydCkgPiAwKSB7Ci0JCVB5T2JqZWN0ICp3cjsKLQkJd3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPnN0cmVhbSwgIndyaXRlIiwgIk8iLCBwd3J0KTsKLQkJaWYgKHdyID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwd3J0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCVB5X0RFQ1JFRihwd3J0KTsKKyAgICBpZiAoUHlTdHJpbmdfU2l6ZShwd3J0KSA+IDApIHsKKyAgICAgICAgUHlPYmplY3QgKndyOworICAgICAgICB3ciA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+c3RyZWFtLCAid3JpdGUiLCAiTyIsIHB3cnQpOworICAgICAgICBpZiAod3IgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHB3cnQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKHB3cnQpOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYnN0cmVhbXdyaXRlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICpzdHJlYW0sICpjb2RlYyA9IE5VTEw7Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKKyAgICBNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnN0cmVhbSwgKmNvZGVjID0gTlVMTDsKKyAgICBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98czpTdHJlYW1Xcml0ZXIiLAotCQkJCXN0cmVhbWt3YXJnbGlzdCwgJnN0cmVhbSwgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfHM6U3RyZWFtV3JpdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1rd2FyZ2xpc3QsICZzdHJlYW0sICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYgPSAoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc2VsZiA9IChNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKil0eXBlLCAiY29kZWMiKTsKLQlpZiAoY29kZWMgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JaWYgKCFNdWx0aWJ5dGVDb2RlY19DaGVjayhjb2RlYykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvZGVjIGlzIHVuZXhwZWN0ZWQgdHlwZSIpOwotCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOworICAgIGlmIChjb2RlYyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7Ci0Jc2VsZi0+c3RyZWFtID0gc3RyZWFtOwotCVB5X0lOQ1JFRihzdHJlYW0pOwotCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKLQlzZWxmLT5lcnJvcnMgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOwotCWlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JaWYgKHNlbGYtPmNvZGVjLT5lbmNpbml0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmVuY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlnb3RvIGVycm9yZXhpdDsKKyAgICBzZWxmLT5jb2RlYyA9ICgoTXVsdGlieXRlQ29kZWNPYmplY3QgKiljb2RlYyktPmNvZGVjOworICAgIHNlbGYtPnN0cmVhbSA9IHN0cmVhbTsKKyAgICBQeV9JTkNSRUYoc3RyZWFtKTsKKyAgICBzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CisgICAgc2VsZi0+ZXJyb3JzID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKKyAgICBpZiAoc2VsZi0+ZXJyb3JzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGlmIChzZWxmLT5jb2RlYy0+ZW5jaW5pdCAhPSBOVUxMICYmCisgICAgICAgIHNlbGYtPmNvZGVjLT5lbmNpbml0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlQeV9ERUNSRUYoY29kZWMpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIFB5X0RFQ1JFRihjb2RlYyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiAKIGVycm9yZXhpdDoKLQlQeV9YREVDUkVGKHNlbGYpOwotCVB5X1hERUNSRUYoY29kZWMpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYoc2VsZik7CisgICAgUHlfWERFQ1JFRihjb2RlYyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIG1ic3RyZWFtd3JpdGVyX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbWJzdHJlYW13cml0ZXJfdHJhdmVyc2UoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmLAotCQkJdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCisgICAgICAgICAgICAgICAgICAgICAgICB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpZiAoRVJST1JfSVNDVVNUT00oc2VsZi0+ZXJyb3JzKSkKLQkJUHlfVklTSVQoc2VsZi0+ZXJyb3JzKTsKLQlQeV9WSVNJVChzZWxmLT5zdHJlYW0pOwotCXJldHVybiAwOworICAgIGlmIChFUlJPUl9JU0NVU1RPTShzZWxmLT5lcnJvcnMpKQorICAgICAgICBQeV9WSVNJVChzZWxmLT5lcnJvcnMpOworICAgIFB5X1ZJU0lUKHNlbGYtPnN0cmVhbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBtYnN0cmVhbXdyaXRlcl9kZWFsbG9jKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOwotCUVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOwotCVB5X1hERUNSRUYoc2VsZi0+c3RyZWFtKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5zdHJlYW0pOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbWJzdHJlYW13cml0ZXJfbWV0aG9kc1tdID0gewotCXsid3JpdGUiLAkoUHlDRnVuY3Rpb24pbWJzdHJlYW13cml0ZXJfd3JpdGUsCi0JCQlNRVRIX08sIE5VTEx9LAotCXsid3JpdGVsaW5lcyIsCShQeUNGdW5jdGlvbiltYnN0cmVhbXdyaXRlcl93cml0ZWxpbmVzLAotCQkJTUVUSF9PLCBOVUxMfSwKLQl7InJlc2V0IiwJKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtd3JpdGVyX3Jlc2V0LAotCQkJTUVUSF9OT0FSR1MsIE5VTEx9LAotCXtOVUxMLAkJTlVMTH0sCisgICAgeyJ3cml0ZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pbWJzdHJlYW13cml0ZXJfd3JpdGUsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfTywgTlVMTH0sCisgICAgeyJ3cml0ZWxpbmVzIiwgICAgICAoUHlDRnVuY3Rpb24pbWJzdHJlYW13cml0ZXJfd3JpdGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9PLCBOVUxMfSwKKyAgICB7InJlc2V0IiwgICAgICAgICAgIChQeUNGdW5jdGlvbiltYnN0cmVhbXdyaXRlcl9yZXNldCwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIE5VTEx9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgbWJzdHJlYW13cml0ZXJfbWVtYmVyc1tdID0gewotCXsic3RyZWFtIiwJVF9PQkpFQ1QsCi0JCQlvZmZzZXRvZihNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QsIHN0cmVhbSksCi0JCQlSRUFET05MWSwgTlVMTH0sCi0Je05VTEwsfQorICAgIHsic3RyZWFtIiwgICAgICAgICAgVF9PQkpFQ1QsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCwgc3RyZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgUkVBRE9OTFksIE5VTEx9LAorICAgIHtOVUxMLH0KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTXVsdGlieXRlU3RyZWFtV3JpdGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIk11bHRpYnl0ZVN0cmVhbVdyaXRlciIsCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiAgbWV0aG9kcyAgKi8KLQkoZGVzdHJ1Y3RvciltYnN0cmVhbXdyaXRlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQwotCQl8IFB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JMCwJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYyltYnN0cmVhbXdyaXRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcmV4dCAqLwotCW1ic3RyZWFtd3JpdGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCi0JbWJzdHJlYW13cml0ZXJfbWVtYmVycywJCS8qIHRwX21lbWJlcnMgKi8KLQljb2RlY2N0eF9nZXRzZXRzLAkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JbWJzdHJlYW13cml0ZXJfaW5pdCwJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCW1ic3RyZWFtd3JpdGVyX25ldywJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJNdWx0aWJ5dGVTdHJlYW1Xcml0ZXIiLCAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiAgbWV0aG9kcyAgKi8KKyAgICAoZGVzdHJ1Y3RvciltYnN0cmVhbXdyaXRlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisgICAgICAgIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKW1ic3RyZWFtd3JpdGVyX3RyYXZlcnNlLCAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJleHQgKi8KKyAgICBtYnN0cmVhbXdyaXRlcl9tZXRob2RzLCAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgbWJzdHJlYW13cml0ZXJfbWVtYmVycywgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGNvZGVjY3R4X2dldHNldHMsICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIG1ic3RyZWFtd3JpdGVyX2luaXQsICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIG1ic3RyZWFtd3JpdGVyX25ldywgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogCkBAIC0xNzcxLDU5ICsxNzcxLDU5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX19jcmVhdGVfY29kZWMoUHlPYmplY3QgKmlnbm9yZSwgUHlPYmplY3QgKmFyZykKIHsKLQlNdWx0aWJ5dGVDb2RlY09iamVjdCAqc2VsZjsKLQlNdWx0aWJ5dGVDb2RlYyAqY29kZWM7CisgICAgTXVsdGlieXRlQ29kZWNPYmplY3QgKnNlbGY7CisgICAgTXVsdGlieXRlQ29kZWMgKmNvZGVjOwogCi0JaWYgKCFQeUNhcHN1bGVfSXNWYWxpZChhcmcsIFB5TXVsdGlieXRlQ29kZWNfQ0FQU1VMRV9OQU1FKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFyZ3VtZW50IHR5cGUgaW52YWxpZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUNhcHN1bGVfSXNWYWxpZChhcmcsIFB5TXVsdGlieXRlQ29kZWNfQ0FQU1VMRV9OQU1FKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFyZ3VtZW50IHR5cGUgaW52YWxpZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQljb2RlYyA9IFB5Q2Fwc3VsZV9HZXRQb2ludGVyKGFyZywgUHlNdWx0aWJ5dGVDb2RlY19DQVBTVUxFX05BTUUpOwotCWlmIChjb2RlYy0+Y29kZWNpbml0ICE9IE5VTEwgJiYgY29kZWMtPmNvZGVjaW5pdChjb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjb2RlYyA9IFB5Q2Fwc3VsZV9HZXRQb2ludGVyKGFyZywgUHlNdWx0aWJ5dGVDb2RlY19DQVBTVUxFX05BTUUpOworICAgIGlmIChjb2RlYy0+Y29kZWNpbml0ICE9IE5VTEwgJiYgY29kZWMtPmNvZGVjaW5pdChjb2RlYy0+Y29uZmlnKSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNlbGYgPSBQeU9iamVjdF9OZXcoTXVsdGlieXRlQ29kZWNPYmplY3QsICZNdWx0aWJ5dGVDb2RlY19UeXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5jb2RlYyA9IGNvZGVjOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoTXVsdGlieXRlQ29kZWNPYmplY3QsICZNdWx0aWJ5dGVDb2RlY19UeXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5jb2RlYyA9IGNvZGVjOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgX19tZXRob2RzW10gPSB7Ci0JeyJfX2NyZWF0ZV9jb2RlYyIsIChQeUNGdW5jdGlvbilfX2NyZWF0ZV9jb2RlYywgTUVUSF9PfSwKLQl7TlVMTCwgTlVMTH0sCisgICAgeyJfX2NyZWF0ZV9jb2RlYyIsIChQeUNGdW5jdGlvbilfX2NyZWF0ZV9jb2RlYywgTUVUSF9PfSwKKyAgICB7TlVMTCwgTlVMTH0sCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdF9tdWx0aWJ5dGVjb2RlYyh2b2lkKQogewotCWludCBpOwotCVB5T2JqZWN0ICptOwotCVB5VHlwZU9iamVjdCAqdHlwZWxpc3RbXSA9IHsKLQkJJk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlcl9UeXBlLAotCQkmTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyX1R5cGUsCi0JCSZNdWx0aWJ5dGVTdHJlYW1SZWFkZXJfVHlwZSwKLQkJJk11bHRpYnl0ZVN0cmVhbVdyaXRlcl9UeXBlLAotCQlOVUxMCi0JfTsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGVsaXN0W10gPSB7CisgICAgICAgICZNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJfVHlwZSwKKyAgICAgICAgJk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlcl9UeXBlLAorICAgICAgICAmTXVsdGlieXRlU3RyZWFtUmVhZGVyX1R5cGUsCisgICAgICAgICZNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJfVHlwZSwKKyAgICAgICAgTlVMTAorICAgIH07CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZNdWx0aWJ5dGVDb2RlY19UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZNdWx0aWJ5dGVDb2RlY19UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfbXVsdGlieXRlY29kZWMiLCBfX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX211bHRpYnl0ZWNvZGVjIiwgX19tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlmb3IgKGkgPSAwOyB0eXBlbGlzdFtpXSAhPSBOVUxMOyBpKyspIHsKLQkJaWYgKFB5VHlwZV9SZWFkeSh0eXBlbGlzdFtpXSkgPCAwKQotCQkJcmV0dXJuOwotCQlQeV9JTkNSRUYodHlwZWxpc3RbaV0pOwotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgdHlwZWxpc3RbaV0tPnRwX25hbWUsCi0JCQkJICAgKFB5T2JqZWN0ICopdHlwZWxpc3RbaV0pOwotCX0KKyAgICBmb3IgKGkgPSAwOyB0eXBlbGlzdFtpXSAhPSBOVUxMOyBpKyspIHsKKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSh0eXBlbGlzdFtpXSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBQeV9JTkNSRUYodHlwZWxpc3RbaV0pOworICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgdHlwZWxpc3RbaV0tPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKil0eXBlbGlzdFtpXSk7CisgICAgfQogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgdGhlIF9tdWx0aWJ5dGVjb2RlYyBtb2R1bGUiKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSB0aGUgX211bHRpYnl0ZWNvZGVjIG1vZHVsZSIpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuaCBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmgKaW5kZXggNzFjMDJjYy4uMWI2ZWY1NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuaAorKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5oCkBAIC0yMywxMTQgKzIzLDExNCBAQAogI2VuZGlmCiAKIHR5cGVkZWYgdW5pb24gewotCXZvaWQgKnA7Ci0JaW50IGk7Ci0JdW5zaWduZWQgY2hhciBjWzhdOwotCXVjczJfdCB1Mls0XTsKLQl1Y3M0X3QgdTRbMl07CisgICAgdm9pZCAqcDsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyIGNbOF07CisgICAgdWNzMl90IHUyWzRdOworICAgIHVjczRfdCB1NFsyXTsKIH0gTXVsdGlieXRlQ29kZWNfU3RhdGU7CiAKIHR5cGVkZWYgaW50ICgqbWJjb2RlY19pbml0KShjb25zdCB2b2lkICpjb25maWcpOwogdHlwZWRlZiBQeV9zc2l6ZV90ICgqbWJlbmNvZGVfZnVuYykoTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkJY29uc3Qgdm9pZCAqY29uZmlnLAotCQkJY29uc3QgUHlfVU5JQ09ERSAqKmluYnVmLCBQeV9zc2l6ZV90IGlubGVmdCwKLQkJCXVuc2lnbmVkIGNoYXIgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCwKLQkJCWludCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQeV9VTklDT0RFICoqaW5idWYsIFB5X3NzaXplX3QgaW5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKm91dGJ1ZiwgUHlfc3NpemVfdCBvdXRsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKIHR5cGVkZWYgaW50ICgqbWJlbmNvZGVpbml0X2Z1bmMpKE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKLQkJCQkgY29uc3Qgdm9pZCAqY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNvbmZpZyk7CiB0eXBlZGVmIFB5X3NzaXplX3QgKCptYmVuY29kZXJlc2V0X2Z1bmMpKE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKLQkJCWNvbnN0IHZvaWQgKmNvbmZpZywKLQkJCXVuc2lnbmVkIGNoYXIgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqb3V0YnVmLCBQeV9zc2l6ZV90IG91dGxlZnQpOwogdHlwZWRlZiBQeV9zc2l6ZV90ICgqbWJkZWNvZGVfZnVuYykoTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkJY29uc3Qgdm9pZCAqY29uZmlnLAotCQkJY29uc3QgdW5zaWduZWQgY2hhciAqKmluYnVmLCBQeV9zc2l6ZV90IGlubGVmdCwKLQkJCVB5X1VOSUNPREUgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW5idWYsIFB5X3NzaXplX3QgaW5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgUHlfVU5JQ09ERSAqKm91dGJ1ZiwgUHlfc3NpemVfdCBvdXRsZWZ0KTsKIHR5cGVkZWYgaW50ICgqbWJkZWNvZGVpbml0X2Z1bmMpKE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKLQkJCQkgY29uc3Qgdm9pZCAqY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNvbmZpZyk7CiB0eXBlZGVmIFB5X3NzaXplX3QgKCptYmRlY29kZXJlc2V0X2Z1bmMpKE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKLQkJCQkJIGNvbnN0IHZvaWQgKmNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNvbmZpZyk7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQljb25zdCBjaGFyICplbmNvZGluZzsKLQljb25zdCB2b2lkICpjb25maWc7Ci0JbWJjb2RlY19pbml0IGNvZGVjaW5pdDsKLQltYmVuY29kZV9mdW5jIGVuY29kZTsKLQltYmVuY29kZWluaXRfZnVuYyBlbmNpbml0OwotCW1iZW5jb2RlcmVzZXRfZnVuYyBlbmNyZXNldDsKLQltYmRlY29kZV9mdW5jIGRlY29kZTsKLQltYmRlY29kZWluaXRfZnVuYyBkZWNpbml0OwotCW1iZGVjb2RlcmVzZXRfZnVuYyBkZWNyZXNldDsKKyAgICBjb25zdCBjaGFyICplbmNvZGluZzsKKyAgICBjb25zdCB2b2lkICpjb25maWc7CisgICAgbWJjb2RlY19pbml0IGNvZGVjaW5pdDsKKyAgICBtYmVuY29kZV9mdW5jIGVuY29kZTsKKyAgICBtYmVuY29kZWluaXRfZnVuYyBlbmNpbml0OworICAgIG1iZW5jb2RlcmVzZXRfZnVuYyBlbmNyZXNldDsKKyAgICBtYmRlY29kZV9mdW5jIGRlY29kZTsKKyAgICBtYmRlY29kZWluaXRfZnVuYyBkZWNpbml0OworICAgIG1iZGVjb2RlcmVzZXRfZnVuYyBkZWNyZXNldDsKIH0gTXVsdGlieXRlQ29kZWM7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JTXVsdGlieXRlQ29kZWMgKmNvZGVjOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBNdWx0aWJ5dGVDb2RlYyAqY29kZWM7CiB9IE11bHRpYnl0ZUNvZGVjT2JqZWN0OwogCiAjZGVmaW5lIE11bHRpYnl0ZUNvZGVjX0NoZWNrKG9wKSAoKG9wKS0+b2JfdHlwZSA9PSAmTXVsdGlieXRlQ29kZWNfVHlwZSkKIAotI2RlZmluZSBfTXVsdGlieXRlU3RhdGVmdWxDb2RlY19IRUFECQlcCi0JUHlPYmplY3RfSEVBRAkJCQlcCi0JTXVsdGlieXRlQ29kZWMgKmNvZGVjOwkJCVwKLQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsJCVwKLQlQeU9iamVjdCAqZXJyb3JzOworI2RlZmluZSBfTXVsdGlieXRlU3RhdGVmdWxDb2RlY19IRUFEICAgICAgICAgICAgXAorICAgIFB5T2JqZWN0X0hFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE11bHRpYnl0ZUNvZGVjICpjb2RlYzsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlIHN0YXRlOyAgICAgICAgICAgICAgICAgXAorICAgIFB5T2JqZWN0ICplcnJvcnM7CiB0eXBlZGVmIHN0cnVjdCB7Ci0JX011bHRpYnl0ZVN0YXRlZnVsQ29kZWNfSEVBRAorICAgIF9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQKIH0gTXVsdGlieXRlU3RhdGVmdWxDb2RlY0NvbnRleHQ7CiAKLSNkZWZpbmUgTUFYRU5DUEVORElORwkyCi0jZGVmaW5lIF9NdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJfSEVBRAkJXAotCV9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQJCVwKLQlQeV9VTklDT0RFIHBlbmRpbmdbTUFYRU5DUEVORElOR107CVwKLQlQeV9zc2l6ZV90IHBlbmRpbmdzaXplOworI2RlZmluZSBNQVhFTkNQRU5ESU5HICAgMgorI2RlZmluZSBfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQgICAgICAgICAgXAorICAgIF9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQgICAgICAgICAgICAgICAgXAorICAgIFB5X1VOSUNPREUgcGVuZGluZ1tNQVhFTkNQRU5ESU5HXTsgICAgICAgICAgXAorICAgIFB5X3NzaXplX3QgcGVuZGluZ3NpemU7CiB0eXBlZGVmIHN0cnVjdCB7Ci0JX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECisgICAgX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECiB9IE11bHRpYnl0ZVN0YXRlZnVsRW5jb2RlckNvbnRleHQ7CiAKLSNkZWZpbmUgTUFYREVDUEVORElORwk4Ci0jZGVmaW5lIF9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAkJXAotCV9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQJCVwKLQl1bnNpZ25lZCBjaGFyIHBlbmRpbmdbTUFYREVDUEVORElOR107CVwKLQlQeV9zc2l6ZV90IHBlbmRpbmdzaXplOworI2RlZmluZSBNQVhERUNQRU5ESU5HICAgOAorI2RlZmluZSBfTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyX0hFQUQgICAgICAgICAgXAorICAgIF9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGNoYXIgcGVuZGluZ1tNQVhERUNQRU5ESU5HXTsgICAgICAgXAorICAgIFB5X3NzaXplX3QgcGVuZGluZ3NpemU7CiB0eXBlZGVmIHN0cnVjdCB7Ci0JX011bHRpYnl0ZVN0YXRlZnVsRGVjb2Rlcl9IRUFECisgICAgX011bHRpYnl0ZVN0YXRlZnVsRGVjb2Rlcl9IRUFECiB9IE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQKKyAgICBfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQKIH0gTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JX011bHRpYnl0ZVN0YXRlZnVsRGVjb2Rlcl9IRUFECisgICAgX011bHRpYnl0ZVN0YXRlZnVsRGVjb2Rlcl9IRUFECiB9IE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCV9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAotCVB5T2JqZWN0ICpzdHJlYW07CisgICAgX011bHRpYnl0ZVN0YXRlZnVsRGVjb2Rlcl9IRUFECisgICAgUHlPYmplY3QgKnN0cmVhbTsKIH0gTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECi0JUHlPYmplY3QgKnN0cmVhbTsKKyAgICBfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQKKyAgICBQeU9iamVjdCAqc3RyZWFtOwogfSBNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3Q7CiAKIC8qIHBvc2l0aXZlIHZhbHVlcyBmb3IgaWxsZWdhbCBzZXF1ZW5jZXMgKi8KLSNkZWZpbmUgTUJFUlJfVE9PU01BTEwJCSgtMSkgLyogaW5zdWZmaWNpZW50IG91dHB1dCBidWZmZXIgc3BhY2UgKi8KLSNkZWZpbmUgTUJFUlJfVE9PRkVXCQkoLTIpIC8qIGluY29tcGxldGUgaW5wdXQgYnVmZmVyICovCi0jZGVmaW5lIE1CRVJSX0lOVEVSTkFMCQkoLTMpIC8qIGludGVybmFsIHJ1bnRpbWUgZXJyb3IgKi8KKyNkZWZpbmUgTUJFUlJfVE9PU01BTEwgICAgICAgICAgKC0xKSAvKiBpbnN1ZmZpY2llbnQgb3V0cHV0IGJ1ZmZlciBzcGFjZSAqLworI2RlZmluZSBNQkVSUl9UT09GRVcgICAgICAgICAgICAoLTIpIC8qIGluY29tcGxldGUgaW5wdXQgYnVmZmVyICovCisjZGVmaW5lIE1CRVJSX0lOVEVSTkFMICAgICAgICAgICgtMykgLyogaW50ZXJuYWwgcnVudGltZSBlcnJvciAqLwogCi0jZGVmaW5lIEVSUk9SX1NUUklDVAkJKFB5T2JqZWN0ICopKDEpCi0jZGVmaW5lIEVSUk9SX0lHTk9SRQkJKFB5T2JqZWN0ICopKDIpCi0jZGVmaW5lIEVSUk9SX1JFUExBQ0UJCShQeU9iamVjdCAqKSgzKQotI2RlZmluZSBFUlJPUl9JU0NVU1RPTShwKQkoKHApIDwgRVJST1JfU1RSSUNUIHx8IEVSUk9SX1JFUExBQ0UgPCAocCkpCi0jZGVmaW5lIEVSUk9SX0RFQ1JFRihwKSBkbyB7CQkJXAotCWlmIChwICE9IE5VTEwgJiYgRVJST1JfSVNDVVNUT00ocCkpIHsJXAotCQlQeV9ERUNSRUYocCk7CQkJXAotCX0JCQkJCVwKKyNkZWZpbmUgRVJST1JfU1RSSUNUICAgICAgICAgICAgKFB5T2JqZWN0ICopKDEpCisjZGVmaW5lIEVSUk9SX0lHTk9SRSAgICAgICAgICAgIChQeU9iamVjdCAqKSgyKQorI2RlZmluZSBFUlJPUl9SRVBMQUNFICAgICAgICAgICAoUHlPYmplY3QgKikoMykKKyNkZWZpbmUgRVJST1JfSVNDVVNUT00ocCkgICAgICAgKChwKSA8IEVSUk9SX1NUUklDVCB8fCBFUlJPUl9SRVBMQUNFIDwgKHApKQorI2RlZmluZSBFUlJPUl9ERUNSRUYocCkgZG8geyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChwICE9IE5VTEwgJiYgRVJST1JfSVNDVVNUT00ocCkpIHsgICAgICAgXAorICAgICAgICBQeV9ERUNSRUYocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSB3aGlsZSAoMCk7CiAKLSNkZWZpbmUgTUJFTkNfRkxVU0gJCTB4MDAwMSAvKiBlbmNvZGUgYWxsIGNoYXJhY3RlcnMgZW5jb2RhYmxlICovCi0jZGVmaW5lIE1CRU5DX01BWAkJTUJFTkNfRkxVU0gKKyNkZWZpbmUgTUJFTkNfRkxVU0ggICAgICAgICAgICAgMHgwMDAxIC8qIGVuY29kZSBhbGwgY2hhcmFjdGVycyBlbmNvZGFibGUgKi8KKyNkZWZpbmUgTUJFTkNfTUFYICAgICAgICAgICAgICAgTUJFTkNfRkxVU0gKIAogI2RlZmluZSBQeU11bHRpYnl0ZUNvZGVjX0NBUFNVTEVfTkFNRSAibXVsdGlieXRlY29kZWMuX19tYXBfKiIKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbG1vZHVsZS5jIGIvTW9kdWxlcy9jbG1vZHVsZS5jCmluZGV4IGQzZTBlZGYuLmU1ZDU2OGYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xtb2R1bGUuYworKysgYi9Nb2R1bGVzL2NsbW9kdWxlLmMKQEAgLTEyLDE0ICsxMiwxNCBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWludCBvYl9pc0NvbXByZXNzb3I7CS8qIENvbXByZXNzb3Igb3IgRGVjb21wcmVzc29yICovCi0JQ0xfSGFuZGxlIG9iX2NvbXByZXNzb3JIZGw7Ci0JaW50ICpvYl9wYXJhbXR5cGVzOwotCWludCBvYl9ucGFyYW1zOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBpbnQgb2JfaXNDb21wcmVzc29yOyAgICAgICAgLyogQ29tcHJlc3NvciBvciBEZWNvbXByZXNzb3IgKi8KKyAgICBDTF9IYW5kbGUgb2JfY29tcHJlc3NvckhkbDsKKyAgICBpbnQgKm9iX3BhcmFtdHlwZXM7CisgICAgaW50IG9iX25wYXJhbXM7CiB9IGNsb2JqZWN0OwogCi1zdGF0aWMgUHlPYmplY3QgKkNsRXJyb3I7CQkvKiBleGNlcHRpb24gY2wuZXJyb3IgKi8KK3N0YXRpYyBQeU9iamVjdCAqQ2xFcnJvcjsgICAgICAgICAgICAgICAvKiBleGNlcHRpb24gY2wuZXJyb3IgKi8KIAogc3RhdGljIGludCBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CiAKQEAgLTMwLDI4ICszMCwyOCBAQAogICogZXZlbiB0aG91Z2ggdGhleSBhcmUgcmVhbGx5ICJjbG9iamVjdCAqIi4gIFRoZXJlZm9yZSB3ZSBjYXN0IHRoZQogICogYXJndW1lbnQgdG8gdGhlIHByb3BlciB0eXBlIHVzaW5nIHRoaXMgbWFjcm8uCiAgKi8KLSNkZWZpbmUgU0VMRgkoKGNsb2JqZWN0ICopIHNlbGYpCisjZGVmaW5lIFNFTEYgICAgKChjbG9iamVjdCAqKSBzZWxmKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCSAgVXRpbGl0eSByb3V0aW5lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbGl0eSByb3V0aW5lcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQKIGNsX0Vycm9ySGFuZGxlcihDTF9IYW5kbGUgaGFuZGxlLCBpbnQgY29kZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0JdmFfbGlzdCBhcDsKLQljaGFyIGVycmJ1ZltCVUZTSVpdOwkvKiBob3BlZnVsbHkgYmlnIGVub3VnaCAqLwotCWNoYXIgKnA7CisgICAgdmFfbGlzdCBhcDsKKyAgICBjaGFyIGVycmJ1ZltCVUZTSVpdOyAgICAgICAgLyogaG9wZWZ1bGx5IGJpZyBlbm91Z2ggKi8KKyAgICBjaGFyICpwOwogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCS8qIGRvbid0IGNoYW5nZSBleGlzdGluZyBlcnJvciAqLwotCQlyZXR1cm47Ci0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAxOwotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCXZzcHJpbnRmKGVycmJ1ZiwgZm10LCBhcCk7Ci0JdmFfZW5kKGFwKTsKLQlwID0gJmVycmJ1ZltzdHJsZW4oZXJyYnVmKSAtIDFdOyAvKiBzd2F0IHRoZSBsaW5lIGZlZWQgKi8KLQlpZiAoKnAgPT0gJ1xuJykKLQkJKnAgPSAwOwotCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCBlcnJidWYpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSAgICAgICAvKiBkb24ndCBjaGFuZ2UgZXhpc3RpbmcgZXJyb3IgKi8KKyAgICAgICAgcmV0dXJuOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMTsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2c3ByaW50ZihlcnJidWYsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgcCA9ICZlcnJidWZbc3RybGVuKGVycmJ1ZikgLSAxXTsgLyogc3dhdCB0aGUgbGluZSBmZWVkICovCisgICAgaWYgKCpwID09ICdcbicpCisgICAgICAgICpwID0gMDsKKyAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgZXJyYnVmKTsKIH0KIAogLyoKQEAgLTYwLDgzOSArNjAsODM5IEBACiBzdGF0aWMgaW50CiBwYXJhbV90eXBlX2lzX2Zsb2F0KGNsb2JqZWN0ICpzZWxmLCBpbnQgcGFyYW0pCiB7Ci0JaW50IGJ1ZmZlcmxlbmd0aDsKKyAgICBpbnQgYnVmZmVybGVuZ3RoOwogCi0JaWYgKHNlbGYtPm9iX3BhcmFtdHlwZXMgPT0gTlVMTCkgewotCQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JCWJ1ZmZlcmxlbmd0aCA9IGNsUXVlcnlQYXJhbXMoc2VsZi0+b2JfY29tcHJlc3NvckhkbCwgMCwgMCk7Ci0JCWlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+b2JfcGFyYW10eXBlcyA9PSBOVUxMKSB7CisgICAgICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICAgICAgYnVmZmVybGVuZ3RoID0gY2xRdWVyeVBhcmFtcyhzZWxmLT5vYl9jb21wcmVzc29ySGRsLCAwLCAwKTsKKyAgICAgICAgaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCXNlbGYtPm9iX3BhcmFtdHlwZXMgPSBQeU1lbV9ORVcoaW50LCBidWZmZXJsZW5ndGgpOwotCQlpZiAoc2VsZi0+b2JfcGFyYW10eXBlcyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlzZWxmLT5vYl9ucGFyYW1zID0gYnVmZmVybGVuZ3RoIC8gMjsKKyAgICAgICAgc2VsZi0+b2JfcGFyYW10eXBlcyA9IFB5TWVtX05FVyhpbnQsIGJ1ZmZlcmxlbmd0aCk7CisgICAgICAgIGlmIChzZWxmLT5vYl9wYXJhbXR5cGVzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHNlbGYtPm9iX25wYXJhbXMgPSBidWZmZXJsZW5ndGggLyAyOwogCi0JCSh2b2lkKSBjbFF1ZXJ5UGFyYW1zKHNlbGYtPm9iX2NvbXByZXNzb3JIZGwsCi0JCQkJICAgICBzZWxmLT5vYl9wYXJhbXR5cGVzLCBidWZmZXJsZW5ndGgpOwotCQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJCVB5TWVtX0RFTChzZWxmLT5vYl9wYXJhbXR5cGVzKTsKLQkJCXNlbGYtPm9iX3BhcmFtdHlwZXMgPSBOVUxMOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgICAgICAodm9pZCkgY2xRdWVyeVBhcmFtcyhzZWxmLT5vYl9jb21wcmVzc29ySGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9wYXJhbXR5cGVzLCBidWZmZXJsZW5ndGgpOworICAgICAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgICAgIFB5TWVtX0RFTChzZWxmLT5vYl9wYXJhbXR5cGVzKTsKKyAgICAgICAgICAgIHNlbGYtPm9iX3BhcmFtdHlwZXMgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JaWYgKHBhcmFtIDwgMCB8fCBwYXJhbSA+PSBzZWxmLT5vYl9ucGFyYW1zKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHBhcmFtIDwgMCB8fCBwYXJhbSA+PSBzZWxmLT5vYl9ucGFyYW1zKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoc2VsZi0+b2JfcGFyYW10eXBlc1twYXJhbSoyICsgMV0gPT0gQ0xfRkxPQVRJTkdfRU5VTV9WQUxVRSB8fAotCSAgICBzZWxmLT5vYl9wYXJhbXR5cGVzW3BhcmFtKjIgKyAxXSA9PSBDTF9GTE9BVElOR19SQU5HRV9WQUxVRSkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKKyAgICBpZiAoc2VsZi0+b2JfcGFyYW10eXBlc1twYXJhbSoyICsgMV0gPT0gQ0xfRkxPQVRJTkdfRU5VTV9WQUxVRSB8fAorICAgICAgICBzZWxmLT5vYl9wYXJhbXR5cGVzW3BhcmFtKjIgKyAxXSA9PSBDTF9GTE9BVElOR19SQU5HRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICAgICAgIFNpbmdsZSBpbWFnZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgorICAgICAgICAgICAgICAgU2luZ2xlIGltYWdlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9Db21wcmVzc0ltYWdlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgY29tcHJlc3Npb25TY2hlbWUsIHdpZHRoLCBoZWlnaHQsIG9yaWdpbmFsRm9ybWF0OwotCWZsb2F0IGNvbXByZXNzaW9uUmF0aW87Ci0JaW50IGZyYW1lQnVmZmVyU2l6ZSwgY29tcHJlc3NlZEJ1ZmZlclNpemU7Ci0JY2hhciAqZnJhbWVCdWZmZXI7Ci0JUHlPYmplY3QgKmNvbXByZXNzZWRCdWZmZXI7CisgICAgaW50IGNvbXByZXNzaW9uU2NoZW1lLCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEZvcm1hdDsKKyAgICBmbG9hdCBjb21wcmVzc2lvblJhdGlvOworICAgIGludCBmcmFtZUJ1ZmZlclNpemUsIGNvbXByZXNzZWRCdWZmZXJTaXplOworICAgIGNoYXIgKmZyYW1lQnVmZmVyOworICAgIFB5T2JqZWN0ICpjb21wcmVzc2VkQnVmZmVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWlpZnMjIiwgJmNvbXByZXNzaW9uU2NoZW1lLAotCQkJICZ3aWR0aCwgJmhlaWdodCwKLQkJCSAmb3JpZ2luYWxGb3JtYXQsICZjb21wcmVzc2lvblJhdGlvLCAmZnJhbWVCdWZmZXIsCi0JCQkgJmZyYW1lQnVmZmVyU2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaWZzIyIsICZjb21wcmVzc2lvblNjaGVtZSwKKyAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwgJmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICZvcmlnaW5hbEZvcm1hdCwgJmNvbXByZXNzaW9uUmF0aW8sICZmcmFtZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICZmcmFtZUJ1ZmZlclNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICByZXRyeToKLQljb21wcmVzc2VkQnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZnJhbWVCdWZmZXJTaXplKTsKLQlpZiAoY29tcHJlc3NlZEJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjb21wcmVzc2VkQnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZnJhbWVCdWZmZXJTaXplKTsKKyAgICBpZiAoY29tcHJlc3NlZEJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNvbXByZXNzZWRCdWZmZXJTaXplID0gZnJhbWVCdWZmZXJTaXplOwotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQlpZiAoY2xDb21wcmVzc0ltYWdlKGNvbXByZXNzaW9uU2NoZW1lLCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEZvcm1hdCwKLQkJCSAgICBjb21wcmVzc2lvblJhdGlvLCAodm9pZCAqKSBmcmFtZUJ1ZmZlciwKLQkJCSAgICAmY29tcHJlc3NlZEJ1ZmZlclNpemUsCi0JCQkgICAgKHZvaWQgKikgUHlTdHJpbmdfQXNTdHJpbmcoY29tcHJlc3NlZEJ1ZmZlcikpCi0JICAgID09IEZBSUxVUkUgfHwgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJUHlfREVDUkVGKGNvbXByZXNzZWRCdWZmZXIpOwotCQlpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJjbENvbXByZXNzSW1hZ2UgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBjb21wcmVzc2VkQnVmZmVyU2l6ZSA9IGZyYW1lQnVmZmVyU2l6ZTsKKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgaWYgKGNsQ29tcHJlc3NJbWFnZShjb21wcmVzc2lvblNjaGVtZSwgd2lkdGgsIGhlaWdodCwgb3JpZ2luYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblJhdGlvLCAodm9pZCAqKSBmcmFtZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2VkQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIFB5U3RyaW5nX0FzU3RyaW5nKGNvbXByZXNzZWRCdWZmZXIpKQorICAgICAgICA9PSBGQUlMVVJFIHx8IGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihjb21wcmVzc2VkQnVmZmVyKTsKKyAgICAgICAgaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiY2xDb21wcmVzc0ltYWdlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoY29tcHJlc3NlZEJ1ZmZlclNpemUgPiBmcmFtZUJ1ZmZlclNpemUpIHsKLQkJZnJhbWVCdWZmZXJTaXplID0gY29tcHJlc3NlZEJ1ZmZlclNpemU7Ci0JCVB5X0RFQ1JFRihjb21wcmVzc2VkQnVmZmVyKTsKLQkJZ290byByZXRyeTsKLQl9CisgICAgaWYgKGNvbXByZXNzZWRCdWZmZXJTaXplID4gZnJhbWVCdWZmZXJTaXplKSB7CisgICAgICAgIGZyYW1lQnVmZmVyU2l6ZSA9IGNvbXByZXNzZWRCdWZmZXJTaXplOworICAgICAgICBQeV9ERUNSRUYoY29tcHJlc3NlZEJ1ZmZlcik7CisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQogCi0JaWYgKGNvbXByZXNzZWRCdWZmZXJTaXplIDwgZnJhbWVCdWZmZXJTaXplKQotCQlfUHlTdHJpbmdfUmVzaXplKCZjb21wcmVzc2VkQnVmZmVyLCBjb21wcmVzc2VkQnVmZmVyU2l6ZSk7CisgICAgaWYgKGNvbXByZXNzZWRCdWZmZXJTaXplIDwgZnJhbWVCdWZmZXJTaXplKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZjb21wcmVzc2VkQnVmZmVyLCBjb21wcmVzc2VkQnVmZmVyU2l6ZSk7CiAKLQlyZXR1cm4gY29tcHJlc3NlZEJ1ZmZlcjsKKyAgICByZXR1cm4gY29tcHJlc3NlZEJ1ZmZlcjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsX0RlY29tcHJlc3NJbWFnZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGNvbXByZXNzaW9uU2NoZW1lLCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEZvcm1hdDsKLQljaGFyICpjb21wcmVzc2VkQnVmZmVyOwotCWludCBjb21wcmVzc2VkQnVmZmVyU2l6ZSwgZnJhbWVCdWZmZXJTaXplOwotCVB5T2JqZWN0ICpmcmFtZUJ1ZmZlcjsKKyAgICBpbnQgY29tcHJlc3Npb25TY2hlbWUsIHdpZHRoLCBoZWlnaHQsIG9yaWdpbmFsRm9ybWF0OworICAgIGNoYXIgKmNvbXByZXNzZWRCdWZmZXI7CisgICAgaW50IGNvbXByZXNzZWRCdWZmZXJTaXplLCBmcmFtZUJ1ZmZlclNpemU7CisgICAgUHlPYmplY3QgKmZyYW1lQnVmZmVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWlpcyMiLCAmY29tcHJlc3Npb25TY2hlbWUsICZ3aWR0aCwgJmhlaWdodCwKLQkJCSAmb3JpZ2luYWxGb3JtYXQsICZjb21wcmVzc2VkQnVmZmVyLAotCQkJICZjb21wcmVzc2VkQnVmZmVyU2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaXMjIiwgJmNvbXByZXNzaW9uU2NoZW1lLCAmd2lkdGgsICZoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAmb3JpZ2luYWxGb3JtYXQsICZjb21wcmVzc2VkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzZWRCdWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmcmFtZUJ1ZmZlclNpemUgPSB3aWR0aCAqIGhlaWdodCAqIENMX0J5dGVzUGVyUGl4ZWwob3JpZ2luYWxGb3JtYXQpOworICAgIGZyYW1lQnVmZmVyU2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogQ0xfQnl0ZXNQZXJQaXhlbChvcmlnaW5hbEZvcm1hdCk7CiAKLQlmcmFtZUJ1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGZyYW1lQnVmZmVyU2l6ZSk7Ci0JaWYgKGZyYW1lQnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGZyYW1lQnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZnJhbWVCdWZmZXJTaXplKTsKKyAgICBpZiAoZnJhbWVCdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JaWYgKGNsRGVjb21wcmVzc0ltYWdlKGNvbXByZXNzaW9uU2NoZW1lLCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEZvcm1hdCwKLQkJCSAgICAgIGNvbXByZXNzZWRCdWZmZXJTaXplLCBjb21wcmVzc2VkQnVmZmVyLAotCQkJICAgICAgKHZvaWQgKikgUHlTdHJpbmdfQXNTdHJpbmcoZnJhbWVCdWZmZXIpKQotCSAgICA9PSBGQUlMVVJFIHx8IGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7Ci0JCVB5X0RFQ1JFRihmcmFtZUJ1ZmZlcik7Ci0JCWlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgImNsRGVjb21wcmVzc0ltYWdlIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIGlmIChjbERlY29tcHJlc3NJbWFnZShjb21wcmVzc2lvblNjaGVtZSwgd2lkdGgsIGhlaWdodCwgb3JpZ2luYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRCdWZmZXJTaXplLCBjb21wcmVzc2VkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBQeVN0cmluZ19Bc1N0cmluZyhmcmFtZUJ1ZmZlcikpCisgICAgICAgID09IEZBSUxVUkUgfHwgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKGZyYW1lQnVmZmVyKTsKKyAgICAgICAgaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiY2xEZWNvbXByZXNzSW1hZ2UgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBmcmFtZUJ1ZmZlcjsKKyAgICByZXR1cm4gZnJhbWVCdWZmZXI7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlTZXF1ZW50aWFsIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uCisgICAgICAgICAgICAgICAgU2VxdWVudGlhbCBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENoZWNrQ29tcHJlc3NvcihzZWxmKQlpZiAoKHNlbGYpLT5vYl9jb21wcmVzc29ySGRsID09IE5VTEwpIHsgXAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICIoZGUpY29tcHJlc3NvciBub3QgYWN0aXZlIik7IFwKLQlyZXR1cm4gTlVMTDsgXAorI2RlZmluZSBDaGVja0NvbXByZXNzb3Ioc2VsZikgICBpZiAoKHNlbGYpLT5vYl9jb21wcmVzc29ySGRsID09IE5VTEwpIHsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICIoZGUpY29tcHJlc3NvciBub3QgYWN0aXZlIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9DbG9zZShjbG9iamVjdCAqc2VsZiwgaW50ICgqY2xvc2VfZnVuYykoQ0xfSGFuZGxlKSkKIHsKLQlDaGVja0NvbXByZXNzb3Ioc2VsZik7CisgICAgQ2hlY2tDb21wcmVzc29yKHNlbGYpOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCWlmICgoKmNsb3NlX2Z1bmMpKHNlbGYtPm9iX2NvbXByZXNzb3JIZGwpID09IEZBSUxVUkUgfHwKLQkgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiY2xvc2UgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgaWYgKCgqY2xvc2VfZnVuYykoc2VsZi0+b2JfY29tcHJlc3NvckhkbCkgPT0gRkFJTFVSRSB8fAorICAgICAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJjbG9zZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc2VsZi0+b2JfY29tcHJlc3NvckhkbCA9IE5VTEw7CisgICAgc2VsZi0+b2JfY29tcHJlc3NvckhkbCA9IE5VTEw7CiAKLQlpZiAoc2VsZi0+b2JfcGFyYW10eXBlcykKLQkJUHlNZW1fREVMKHNlbGYtPm9iX3BhcmFtdHlwZXMpOwotCXNlbGYtPm9iX3BhcmFtdHlwZXMgPSBOVUxMOworICAgIGlmIChzZWxmLT5vYl9wYXJhbXR5cGVzKQorICAgICAgICBQeU1lbV9ERUwoc2VsZi0+b2JfcGFyYW10eXBlcyk7CisgICAgc2VsZi0+b2JfcGFyYW10eXBlcyA9IE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0Nsb3NlQ29tcHJlc3NvcihQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gZG9DbG9zZShTRUxGLCBjbENsb3NlQ29tcHJlc3Nvcik7CisgICAgcmV0dXJuIGRvQ2xvc2UoU0VMRiwgY2xDbG9zZUNvbXByZXNzb3IpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0Nsb3NlRGVjb21wcmVzc29yKFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBkb0Nsb3NlKFNFTEYsIGNsQ2xvc2VEZWNvbXByZXNzb3IpOworICAgIHJldHVybiBkb0Nsb3NlKFNFTEYsIGNsQ2xvc2VEZWNvbXByZXNzb3IpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0NvbXByZXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbnVtYmVyT2ZGcmFtZXM7Ci0JaW50IGZyYW1lQnVmZmVyU2l6ZSwgY29tcHJlc3NlZEJ1ZmZlclNpemUsIHNpemU7Ci0JY2hhciAqZnJhbWVCdWZmZXI7Ci0JUHlPYmplY3QgKmRhdGE7CisgICAgaW50IG51bWJlck9mRnJhbWVzOworICAgIGludCBmcmFtZUJ1ZmZlclNpemUsIGNvbXByZXNzZWRCdWZmZXJTaXplLCBzaXplOworICAgIGNoYXIgKmZyYW1lQnVmZmVyOworICAgIFB5T2JqZWN0ICpkYXRhOwogCi0JQ2hlY2tDb21wcmVzc29yKFNFTEYpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcyMpIiwgJm51bWJlck9mRnJhbWVzLAotCQkJICZmcmFtZUJ1ZmZlciwgJmZyYW1lQnVmZmVyU2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcyMpIiwgJm51bWJlck9mRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgJmZyYW1lQnVmZmVyLCAmZnJhbWVCdWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0Jc2l6ZSA9IGNsR2V0UGFyYW0oU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgQ0xfQ09NUFJFU1NFRF9CVUZGRVJfU0laRSk7Ci0JY29tcHJlc3NlZEJ1ZmZlclNpemUgPSBzaXplOwotCWlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIHNpemUgPSBjbEdldFBhcmFtKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIENMX0NPTVBSRVNTRURfQlVGRkVSX1NJWkUpOworICAgIGNvbXByZXNzZWRCdWZmZXJTaXplID0gc2l6ZTsKKyAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpOwotCWlmIChkYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGRhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQlpZiAoY2xDb21wcmVzcyhTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBudW1iZXJPZkZyYW1lcywKLQkJICAgICAgICh2b2lkICopIGZyYW1lQnVmZmVyLCAmY29tcHJlc3NlZEJ1ZmZlclNpemUsCi0JCSAgICAgICAodm9pZCAqKSBQeVN0cmluZ19Bc1N0cmluZyhkYXRhKSkgPT0gRkFJTFVSRSB8fAotCSAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgewotCQlQeV9ERUNSRUYoZGF0YSk7Ci0JCWlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgImNvbXByZXNzIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIGlmIChjbENvbXByZXNzKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIG51bWJlck9mRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopIGZyYW1lQnVmZmVyLCAmY29tcHJlc3NlZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgUHlTdHJpbmdfQXNTdHJpbmcoZGF0YSkpID09IEZBSUxVUkUgfHwKKyAgICAgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKGRhdGEpOworICAgICAgICBpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJjb21wcmVzcyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGNvbXByZXNzZWRCdWZmZXJTaXplIDwgc2l6ZSkKLQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmRhdGEsIGNvbXByZXNzZWRCdWZmZXJTaXplKSkKLQkJCXJldHVybiBOVUxMOworICAgIGlmIChjb21wcmVzc2VkQnVmZmVyU2l6ZSA8IHNpemUpCisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZkYXRhLCBjb21wcmVzc2VkQnVmZmVyU2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChjb21wcmVzc2VkQnVmZmVyU2l6ZSA+IHNpemUpIHsKLQkJLyogd2UgZGlkbid0IGdldCBhbGwgImNvbXByZXNzZWQiIGRhdGEgKi8KLQkJUHlfREVDUkVGKGRhdGEpOwotCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwKLQkJCQkiY29tcHJlc3NlZCBkYXRhIGlzIG1vcmUgdGhhbiBmaXR0ZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChjb21wcmVzc2VkQnVmZmVyU2l6ZSA+IHNpemUpIHsKKyAgICAgICAgLyogd2UgZGlkbid0IGdldCBhbGwgImNvbXByZXNzZWQiIGRhdGEgKi8KKyAgICAgICAgUHlfREVDUkVGKGRhdGEpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2VkIGRhdGEgaXMgbW9yZSB0aGFuIGZpdHRlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gZGF0YTsKKyAgICByZXR1cm4gZGF0YTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsbV9EZWNvbXByZXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZGF0YTsKLQlpbnQgbnVtYmVyT2ZGcmFtZXM7Ci0JY2hhciAqY29tcHJlc3NlZERhdGE7Ci0JaW50IGNvbXByZXNzZWREYXRhU2l6ZSwgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKmRhdGE7CisgICAgaW50IG51bWJlck9mRnJhbWVzOworICAgIGNoYXIgKmNvbXByZXNzZWREYXRhOworICAgIGludCBjb21wcmVzc2VkRGF0YVNpemUsIGRhdGFTaXplOwogCi0JQ2hlY2tDb21wcmVzc29yKFNFTEYpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcyMpIiwgJm51bWJlck9mRnJhbWVzLCAmY29tcHJlc3NlZERhdGEsCi0JCQkgJmNvbXByZXNzZWREYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcyMpIiwgJm51bWJlck9mRnJhbWVzLCAmY29tcHJlc3NlZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NlZERhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JZGF0YVNpemUgPSBjbEdldFBhcmFtKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIENMX0ZSQU1FX0JVRkZFUl9TSVpFKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCXJldHVybiBOVUxMOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBkYXRhU2l6ZSA9IGNsR2V0UGFyYW0oU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgQ0xfRlJBTUVfQlVGRkVSX1NJWkUpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlkYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZGF0YVNpemUpOwotCWlmIChkYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGRhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBkYXRhU2l6ZSk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JaWYgKGNsRGVjb21wcmVzcyhTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBudW1iZXJPZkZyYW1lcywKLQkJCSBjb21wcmVzc2VkRGF0YVNpemUsICh2b2lkICopIGNvbXByZXNzZWREYXRhLAotCQkJICh2b2lkICopIFB5U3RyaW5nX0FzU3RyaW5nKGRhdGEpKSA9PSBGQUlMVVJFIHx8Ci0JICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7Ci0JCVB5X0RFQ1JFRihkYXRhKTsKLQkJaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiZGVjb21wcmVzcyBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBpZiAoY2xEZWNvbXByZXNzKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIG51bWJlck9mRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZERhdGFTaXplLCAodm9pZCAqKSBjb21wcmVzc2VkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIFB5U3RyaW5nX0FzU3RyaW5nKGRhdGEpKSA9PSBGQUlMVVJFIHx8CisgICAgICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihkYXRhKTsKKyAgICAgICAgaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiZGVjb21wcmVzcyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIGRhdGE7CisgICAgcmV0dXJuIGRhdGE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb1BhcmFtcyhjbG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCAoKmZ1bmMpKENMX0hhbmRsZSwgaW50ICosIGludCksCi0JIGludCBtb2RpZmllZCkKKyAgICAgICAgIGludCBtb2RpZmllZCkKIHsKLQlQeU9iamVjdCAqbGlzdCwgKnY7Ci0JaW50ICpQVmJ1ZmZlcjsKLQlpbnQgbGVuZ3RoOwotCWludCBpOwotCWZsb2F0IG51bWJlcjsKLQkKLQlDaGVja0NvbXByZXNzb3Ioc2VsZik7CisgICAgUHlPYmplY3QgKmxpc3QsICp2OworICAgIGludCAqUFZidWZmZXI7CisgICAgaW50IGxlbmd0aDsKKyAgICBpbnQgaTsKKyAgICBmbG9hdCBudW1iZXI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJPIiwgJmxpc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5TGlzdF9DaGVjayhsaXN0KSkgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbGVuZ3RoID0gUHlMaXN0X1NpemUobGlzdCk7Ci0JUFZidWZmZXIgPSBQeU1lbV9ORVcoaW50LCBsZW5ndGgpOwotCWlmIChQVmJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOwotCQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgewotCQkJbnVtYmVyID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQkJCVBWYnVmZmVyW2ldID0gQ0xfVHlwZUlzSW50KG51bWJlcik7Ci0JCX0gZWxzZSBpZiAoUHlJbnRfQ2hlY2sodikpIHsKLQkJCVBWYnVmZmVyW2ldID0gUHlJbnRfQXNMb25nKHYpOwotCQkJaWYgKChpICYgMSkgJiYKLQkJCSAgICBwYXJhbV90eXBlX2lzX2Zsb2F0KHNlbGYsIFBWYnVmZmVyW2ktMV0pID4gMCkgewotCQkJCW51bWJlciA9IFBWYnVmZmVyW2ldOwotCQkJCVBWYnVmZmVyW2ldID0gQ0xfVHlwZUlzSW50KG51bWJlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlQeU1lbV9ERUwoUFZidWZmZXIpOwotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIENoZWNrQ29tcHJlc3NvcihzZWxmKTsKIAotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQkoKmZ1bmMpKHNlbGYtPm9iX2NvbXByZXNzb3JIZGwsIFBWYnVmZmVyLCBsZW5ndGgpOwotCWlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkgewotCQlQeU1lbV9ERUwoUFZidWZmZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiTyIsICZsaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sobGlzdCkpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGxlbmd0aCA9IFB5TGlzdF9TaXplKGxpc3QpOworICAgIFBWYnVmZmVyID0gUHlNZW1fTkVXKGludCwgbGVuZ3RoKTsKKyAgICBpZiAoUFZidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHYgPSBQeUxpc3RfR2V0SXRlbShsaXN0LCBpKTsKKyAgICAgICAgaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIG51bWJlciA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgICAgICAgICBQVmJ1ZmZlcltpXSA9IENMX1R5cGVJc0ludChudW1iZXIpOworICAgICAgICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgICAgICBQVmJ1ZmZlcltpXSA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgICAgIGlmICgoaSAmIDEpICYmCisgICAgICAgICAgICAgICAgcGFyYW1fdHlwZV9pc19mbG9hdChzZWxmLCBQVmJ1ZmZlcltpLTFdKSA+IDApIHsKKyAgICAgICAgICAgICAgICBudW1iZXIgPSBQVmJ1ZmZlcltpXTsKKyAgICAgICAgICAgICAgICBQVmJ1ZmZlcltpXSA9IENMX1R5cGVJc0ludChudW1iZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChtb2RpZmllZCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoaSAmIDEpICYmCi0JCQkgICAgcGFyYW1fdHlwZV9pc19mbG9hdChzZWxmLCBQVmJ1ZmZlcltpLTFdKSA+IDApIHsKLQkJCQludW1iZXIgPSBDTF9UeXBlSXNGbG9hdChQVmJ1ZmZlcltpXSk7Ci0JCQkJdiA9IFB5RmxvYXRfRnJvbURvdWJsZShudW1iZXIpOwotCQkJfSBlbHNlCi0JCQkJdiA9IFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKTsKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIHYpOwotCQl9Ci0JfQorICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICAoKmZ1bmMpKHNlbGYtPm9iX2NvbXByZXNzb3JIZGwsIFBWYnVmZmVyLCBsZW5ndGgpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeU1lbV9ERUwoUFZidWZmZXIpOworICAgIGlmIChtb2RpZmllZCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoaSAmIDEpICYmCisgICAgICAgICAgICAgICAgcGFyYW1fdHlwZV9pc19mbG9hdChzZWxmLCBQVmJ1ZmZlcltpLTFdKSA+IDApIHsKKyAgICAgICAgICAgICAgICBudW1iZXIgPSBDTF9UeXBlSXNGbG9hdChQVmJ1ZmZlcltpXSk7CisgICAgICAgICAgICAgICAgdiA9IFB5RmxvYXRfRnJvbURvdWJsZShudW1iZXIpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKTsKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIHYpOworICAgICAgICB9CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fR2V0UGFyYW1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9QYXJhbXMoU0VMRiwgYXJncywgY2xHZXRQYXJhbXMsIDEpOworICAgIHJldHVybiBkb1BhcmFtcyhTRUxGLCBhcmdzLCBjbEdldFBhcmFtcywgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fU2V0UGFyYW1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9QYXJhbXMoU0VMRiwgYXJncywgY2xTZXRQYXJhbXMsIDApOworICAgIHJldHVybiBkb1BhcmFtcyhTRUxGLCBhcmdzLCBjbFNldFBhcmFtcywgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb19nZXQoY2xvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgKCpmdW5jKShDTF9IYW5kbGUsIGludCkpCiB7Ci0JaW50IHBhcmFtSUQsIHZhbHVlOwotCWZsb2F0IGZ2YWx1ZTsKKyAgICBpbnQgcGFyYW1JRCwgdmFsdWU7CisgICAgZmxvYXQgZnZhbHVlOwogCi0JQ2hlY2tDb21wcmVzc29yKHNlbGYpOworICAgIENoZWNrQ29tcHJlc3NvcihzZWxmKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmcGFyYW1JRCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmcGFyYW1JRCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCXZhbHVlID0gKCpmdW5jKShzZWxmLT5vYl9jb21wcmVzc29ySGRsLCBwYXJhbUlEKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCXJldHVybiBOVUxMOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICB2YWx1ZSA9ICgqZnVuYykoc2VsZi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW1JRCk7CisgICAgaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChwYXJhbV90eXBlX2lzX2Zsb2F0KHNlbGYsIHBhcmFtSUQpID4gMCkgewotCQlmdmFsdWUgPSBDTF9UeXBlSXNGbG9hdCh2YWx1ZSk7Ci0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZnZhbHVlKTsKLQl9CisgICAgaWYgKHBhcmFtX3R5cGVfaXNfZmxvYXQoc2VsZiwgcGFyYW1JRCkgPiAwKSB7CisgICAgICAgIGZ2YWx1ZSA9IENMX1R5cGVJc0Zsb2F0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmdmFsdWUpOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsbV9HZXRQYXJhbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvX2dldChTRUxGLCBhcmdzLCBjbEdldFBhcmFtKTsKKyAgICByZXR1cm4gZG9fZ2V0KFNFTEYsIGFyZ3MsIGNsR2V0UGFyYW0pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0dldERlZmF1bHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb19nZXQoU0VMRiwgYXJncywgY2xHZXREZWZhdWx0KTsKKyAgICByZXR1cm4gZG9fZ2V0KFNFTEYsIGFyZ3MsIGNsR2V0RGVmYXVsdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fU2V0UGFyYW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBwYXJhbUlELCB2YWx1ZTsKLQlmbG9hdCBmdmFsdWU7CisgICAgaW50IHBhcmFtSUQsIHZhbHVlOworICAgIGZsb2F0IGZ2YWx1ZTsKIAotCUNoZWNrQ29tcHJlc3NvcihTRUxGKTsKKyAgICBDaGVja0NvbXByZXNzb3IoU0VMRik7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnBhcmFtSUQsICZ2YWx1ZSkpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlmKSIsICZwYXJhbUlELCAmZnZhbHVlKSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICAgImJhZCBhcmd1bWVudCBsaXN0IChmb3JtYXQgJyhpaSknIG9yICcoaWYpJykiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXZhbHVlID0gQ0xfVHlwZUlzSW50KGZ2YWx1ZSk7Ci0JfSBlbHNlIHsKLQkJaWYgKHBhcmFtX3R5cGVfaXNfZmxvYXQoU0VMRiwgcGFyYW1JRCkgPiAwKSB7Ci0JCQlmdmFsdWUgPSB2YWx1ZTsKLQkJCXZhbHVlID0gQ0xfVHlwZUlzSW50KGZ2YWx1ZSk7Ci0JCX0KLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZwYXJhbUlELCAmdmFsdWUpKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpZikiLCAmcGFyYW1JRCwgJmZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJiYWQgYXJndW1lbnQgbGlzdCAoZm9ybWF0ICcoaWkpJyBvciAnKGlmKScpIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IENMX1R5cGVJc0ludChmdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwYXJhbV90eXBlX2lzX2Zsb2F0KFNFTEYsIHBhcmFtSUQpID4gMCkgeworICAgICAgICAgICAgZnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB2YWx1ZSA9IENMX1R5cGVJc0ludChmdmFsdWUpOworICAgICAgICB9CisgICAgfQogCi0gCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQl2YWx1ZSA9IGNsU2V0UGFyYW0oU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW1JRCwgdmFsdWUpOwotCWlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIHZhbHVlID0gY2xTZXRQYXJhbShTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBwYXJhbUlELCB2YWx1ZSk7CisgICAgaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChwYXJhbV90eXBlX2lzX2Zsb2F0KFNFTEYsIHBhcmFtSUQpID4gMCkKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShDTF9UeXBlSXNGbG9hdCh2YWx1ZSkpOwotCWVsc2UKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKKyAgICBpZiAocGFyYW1fdHlwZV9pc19mbG9hdChTRUxGLCBwYXJhbUlEKSA+IDApCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoQ0xfVHlwZUlzRmxvYXQodmFsdWUpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fR2V0UGFyYW1JRChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgdmFsdWU7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgdmFsdWU7CiAKLQlDaGVja0NvbXByZXNzb3IoU0VMRik7CisgICAgQ2hlY2tDb21wcmVzc29yKFNFTEYpOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JdmFsdWUgPSBjbEdldFBhcmFtSUQoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgbmFtZSk7Ci0JaWYgKHZhbHVlID09IEZBSUxVUkUgfHwgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiZ2V0cGFyYW1pZCBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICB2YWx1ZSA9IGNsR2V0UGFyYW1JRChTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBuYW1lKTsKKyAgICBpZiAodmFsdWUgPT0gRkFJTFVSRSB8fCBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJnZXRwYXJhbWlkIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsdWUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fUXVlcnlQYXJhbXMoUHlPYmplY3QgKnNlbGYpCiB7Ci0JaW50IGJ1ZmZlcmxlbmd0aDsKLQlpbnQgKlBWYnVmZmVyOwotCVB5T2JqZWN0ICpsaXN0OwotCWludCBpOworICAgIGludCBidWZmZXJsZW5ndGg7CisgICAgaW50ICpQVmJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBpbnQgaTsKIAotCUNoZWNrQ29tcHJlc3NvcihTRUxGKTsKKyAgICBDaGVja0NvbXByZXNzb3IoU0VMRik7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JYnVmZmVybGVuZ3RoID0gY2xRdWVyeVBhcmFtcyhTRUxGLT5vYl9jb21wcmVzc29ySGRsLCAwLCAwKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCXJldHVybiBOVUxMOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBidWZmZXJsZW5ndGggPSBjbFF1ZXJ5UGFyYW1zKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIDAsIDApOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQVmJ1ZmZlciA9IFB5TWVtX05FVyhpbnQsIGJ1ZmZlcmxlbmd0aCk7Ci0JaWYgKFBWYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFBWYnVmZmVyID0gUHlNZW1fTkVXKGludCwgYnVmZmVybGVuZ3RoKTsKKyAgICBpZiAoUFZidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQlidWZmZXJsZW5ndGggPSBjbFF1ZXJ5UGFyYW1zKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIFBWYnVmZmVyLAotCQkJCSAgICAgYnVmZmVybGVuZ3RoKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJUHlNZW1fREVMKFBWYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGJ1ZmZlcmxlbmd0aCA9IGNsUXVlcnlQYXJhbXMoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgUFZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJsZW5ndGgpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlsaXN0ID0gUHlMaXN0X05ldyhidWZmZXJsZW5ndGgpOwotCWlmIChsaXN0ID09IE5VTEwpIHsKLQkJUHlNZW1fREVMKFBWYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGxpc3QgPSBQeUxpc3RfTmV3KGJ1ZmZlcmxlbmd0aCk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgYnVmZmVybGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgJiAxKQotCQkJUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pKTsKLQkJZWxzZSBpZiAoUFZidWZmZXJbaV0gPT0gMCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlfTm9uZSk7Ci0JCX0gZWxzZQotCQkJUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwKLQkJCQkgICBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyICopIFBWYnVmZmVyW2ldKSk7Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJsZW5ndGg7IGkrKykgeworICAgICAgICBpZiAoaSAmIDEpCisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSkpOworICAgICAgICBlbHNlIGlmIChQVmJ1ZmZlcltpXSA9PSAwKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBQeV9Ob25lKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyICopIFBWYnVmZmVyW2ldKSk7CisgICAgfQogCi0JUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICBQeU1lbV9ERUwoUFZidWZmZXIpOwogCi0JcmV0dXJuIGxpc3Q7CisgICAgcmV0dXJuIGxpc3Q7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fR2V0TWluTWF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcGFyYW0sIG1pbiwgbWF4OwotCWZsb2F0IGZtaW4sIGZtYXg7CisgICAgaW50IHBhcmFtLCBtaW4sIG1heDsKKyAgICBmbG9hdCBmbWluLCBmbWF4OwogCi0JQ2hlY2tDb21wcmVzc29yKFNFTEYpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmcGFyYW0pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnBhcmFtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljbEdldE1pbk1heChTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBwYXJhbSwgJm1pbiwgJm1heCk7CisgICAgY2xHZXRNaW5NYXgoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW0sICZtaW4sICZtYXgpOwogCi0JaWYgKHBhcmFtX3R5cGVfaXNfZmxvYXQoU0VMRiwgcGFyYW0pID4gMCkgewotCQlmbWluID0gQ0xfVHlwZUlzRmxvYXQobWluKTsKLQkJZm1heCA9IENMX1R5cGVJc0Zsb2F0KG1heCk7Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmYpIiwgZm1pbiwgZm1heCk7Ci0JfQorICAgIGlmIChwYXJhbV90eXBlX2lzX2Zsb2F0KFNFTEYsIHBhcmFtKSA+IDApIHsKKyAgICAgICAgZm1pbiA9IENMX1R5cGVJc0Zsb2F0KG1pbik7CisgICAgICAgIGZtYXggPSBDTF9UeXBlSXNGbG9hdChtYXgpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsIGZtaW4sIGZtYXgpOworICAgIH0KIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgbWluLCBtYXgpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgbWluLCBtYXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0dldE5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBwYXJhbTsKLQljaGFyICpuYW1lOworICAgIGludCBwYXJhbTsKKyAgICBjaGFyICpuYW1lOwogCi0JQ2hlY2tDb21wcmVzc29yKFNFTEYpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmcGFyYW0pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnBhcmFtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JbmFtZSA9IGNsR2V0TmFtZShTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBwYXJhbSk7Ci0JaWYgKG5hbWUgPT0gTlVMTCB8fCBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgewotCQlpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJnZXRuYW1lIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIG5hbWUgPSBjbEdldE5hbWUoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW0pOworICAgIGlmIChuYW1lID09IE5VTEwgfHwgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiZ2V0bmFtZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fUXVlcnlTY2hlbWVGcm9tSGFuZGxlKFB5T2JqZWN0ICpzZWxmKQogewotCUNoZWNrQ29tcHJlc3NvcihTRUxGKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoY2xRdWVyeVNjaGVtZUZyb21IYW5kbGUoU0VMRi0+b2JfY29tcHJlc3NvckhkbCkpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoY2xRdWVyeVNjaGVtZUZyb21IYW5kbGUoU0VMRi0+b2JfY29tcHJlc3NvckhkbCkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX1JlYWRIZWFkZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmhlYWRlcjsKLQlpbnQgaGVhZGVyU2l6ZTsKKyAgICBjaGFyICpoZWFkZXI7CisgICAgaW50IGhlYWRlclNpemU7CiAKLQlDaGVja0NvbXByZXNzb3IoU0VMRik7CisgICAgQ2hlY2tDb21wcmVzc29yKFNFTEYpOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyMiLCAmaGVhZGVyLCAmaGVhZGVyU2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgInMjIiwgJmhlYWRlciwgJmhlYWRlclNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhjbFJlYWRIZWFkZXIoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwKLQkJCQkJICAgaGVhZGVyU2l6ZSwgaGVhZGVyKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGNsUmVhZEhlYWRlcihTRUxGLT5vYl9jb21wcmVzc29ySGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyU2l6ZSwgaGVhZGVyKSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjb21wcmVzc29yX21ldGhvZHNbXSA9IHsKLQl7ImNsb3NlIiwJCWNsbV9DbG9zZUNvbXByZXNzb3IsIE1FVEhfTk9BUkdTfSwgLyogYWxpYXMgKi8KLQl7IkNsb3NlQ29tcHJlc3NvciIsCWNsbV9DbG9zZUNvbXByZXNzb3IsIE1FVEhfTk9BUkdTfSwKLQl7IkNvbXByZXNzIiwJCWNsbV9Db21wcmVzcywgTUVUSF9PTERBUkdTfSwKLQl7IkdldERlZmF1bHQiLAkJY2xtX0dldERlZmF1bHQsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRNaW5NYXgiLAkJY2xtX0dldE1pbk1heCwgTUVUSF9PTERBUkdTfSwKLQl7IkdldE5hbWUiLAkJY2xtX0dldE5hbWUsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRQYXJhbSIsCQljbG1fR2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRQYXJhbUlEIiwJCWNsbV9HZXRQYXJhbUlELCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW1zIiwJCWNsbV9HZXRQYXJhbXMsIE1FVEhfT0xEQVJHU30sCi0JeyJRdWVyeVBhcmFtcyIsCQljbG1fUXVlcnlQYXJhbXMsIE1FVEhfTk9BUkdTfSwKLQl7IlF1ZXJ5U2NoZW1lRnJvbUhhbmRsZSIsY2xtX1F1ZXJ5U2NoZW1lRnJvbUhhbmRsZSwgTUVUSF9OT0FSR1N9LAotCXsiU2V0UGFyYW0iLAkJY2xtX1NldFBhcmFtLCBNRVRIX09MREFSR1N9LAotCXsiU2V0UGFyYW1zIiwJCWNsbV9TZXRQYXJhbXMsIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJjbG9zZSIsICAgICAgICAgICAgICAgICAgIGNsbV9DbG9zZUNvbXByZXNzb3IsIE1FVEhfTk9BUkdTfSwgLyogYWxpYXMgKi8KKyAgICB7IkNsb3NlQ29tcHJlc3NvciIsICAgICAgICAgY2xtX0Nsb3NlQ29tcHJlc3NvciwgTUVUSF9OT0FSR1N9LAorICAgIHsiQ29tcHJlc3MiLCAgICAgICAgICAgICAgICBjbG1fQ29tcHJlc3MsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXREZWZhdWx0IiwgICAgICAgICAgICAgIGNsbV9HZXREZWZhdWx0LCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0TWluTWF4IiwgICAgICAgICAgICAgICBjbG1fR2V0TWluTWF4LCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0TmFtZSIsICAgICAgICAgICAgICAgICBjbG1fR2V0TmFtZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldFBhcmFtIiwgICAgICAgICAgICAgICAgY2xtX0dldFBhcmFtLCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0UGFyYW1JRCIsICAgICAgICAgICAgICBjbG1fR2V0UGFyYW1JRCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldFBhcmFtcyIsICAgICAgICAgICAgICAgY2xtX0dldFBhcmFtcywgTUVUSF9PTERBUkdTfSwKKyAgICB7IlF1ZXJ5UGFyYW1zIiwgICAgICAgICAgICAgY2xtX1F1ZXJ5UGFyYW1zLCBNRVRIX05PQVJHU30sCisgICAgeyJRdWVyeVNjaGVtZUZyb21IYW5kbGUiLGNsbV9RdWVyeVNjaGVtZUZyb21IYW5kbGUsIE1FVEhfTk9BUkdTfSwKKyAgICB7IlNldFBhcmFtIiwgICAgICAgICAgICAgICAgY2xtX1NldFBhcmFtLCBNRVRIX09MREFSR1N9LAorICAgIHsiU2V0UGFyYW1zIiwgICAgICAgICAgICAgICBjbG1fU2V0UGFyYW1zLCBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkZWNvbXByZXNzb3JfbWV0aG9kc1tdID0gewotCXsiY2xvc2UiLAkJY2xtX0Nsb3NlRGVjb21wcmVzc29yLCBNRVRIX05PQVJHU30sCS8qIGFsaWFzICovCi0JeyJDbG9zZURlY29tcHJlc3NvciIsCWNsbV9DbG9zZURlY29tcHJlc3NvciwgTUVUSF9OT0FSR1N9LAotCXsiRGVjb21wcmVzcyIsCQljbG1fRGVjb21wcmVzcywgTUVUSF9PTERBUkdTfSwKLQl7IkdldERlZmF1bHQiLAkJY2xtX0dldERlZmF1bHQsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRNaW5NYXgiLAkJY2xtX0dldE1pbk1heCwgTUVUSF9PTERBUkdTfSwKLQl7IkdldE5hbWUiLAkJY2xtX0dldE5hbWUsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRQYXJhbSIsCQljbG1fR2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRQYXJhbUlEIiwJCWNsbV9HZXRQYXJhbUlELCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW1zIiwJCWNsbV9HZXRQYXJhbXMsIE1FVEhfT0xEQVJHU30sCi0JeyJSZWFkSGVhZGVyIiwJCWNsbV9SZWFkSGVhZGVyLCBNRVRIX09MREFSR1N9LAotCXsiUXVlcnlQYXJhbXMiLAkJY2xtX1F1ZXJ5UGFyYW1zLCBNRVRIX05PQVJHU30sCi0JeyJRdWVyeVNjaGVtZUZyb21IYW5kbGUiLGNsbV9RdWVyeVNjaGVtZUZyb21IYW5kbGUsIE1FVEhfTk9BUkdTfSwKLQl7IlNldFBhcmFtIiwJCWNsbV9TZXRQYXJhbSwgTUVUSF9PTERBUkdTfSwKLQl7IlNldFBhcmFtcyIsCQljbG1fU2V0UGFyYW1zLCBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiY2xvc2UiLCAgICAgICAgICAgICAgICAgICBjbG1fQ2xvc2VEZWNvbXByZXNzb3IsIE1FVEhfTk9BUkdTfSwgICAgLyogYWxpYXMgKi8KKyAgICB7IkNsb3NlRGVjb21wcmVzc29yIiwgICAgICAgY2xtX0Nsb3NlRGVjb21wcmVzc29yLCBNRVRIX05PQVJHU30sCisgICAgeyJEZWNvbXByZXNzIiwgICAgICAgICAgICAgIGNsbV9EZWNvbXByZXNzLCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0RGVmYXVsdCIsICAgICAgICAgICAgICBjbG1fR2V0RGVmYXVsdCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldE1pbk1heCIsICAgICAgICAgICAgICAgY2xtX0dldE1pbk1heCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldE5hbWUiLCAgICAgICAgICAgICAgICAgY2xtX0dldE5hbWUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRQYXJhbSIsICAgICAgICAgICAgICAgIGNsbV9HZXRQYXJhbSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldFBhcmFtSUQiLCAgICAgICAgICAgICAgY2xtX0dldFBhcmFtSUQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRQYXJhbXMiLCAgICAgICAgICAgICAgIGNsbV9HZXRQYXJhbXMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJSZWFkSGVhZGVyIiwgICAgICAgICAgICAgIGNsbV9SZWFkSGVhZGVyLCBNRVRIX09MREFSR1N9LAorICAgIHsiUXVlcnlQYXJhbXMiLCAgICAgICAgICAgICBjbG1fUXVlcnlQYXJhbXMsIE1FVEhfTk9BUkdTfSwKKyAgICB7IlF1ZXJ5U2NoZW1lRnJvbUhhbmRsZSIsY2xtX1F1ZXJ5U2NoZW1lRnJvbUhhbmRsZSwgTUVUSF9OT0FSR1N9LAorICAgIHsiU2V0UGFyYW0iLCAgICAgICAgICAgICAgICBjbG1fU2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCisgICAgeyJTZXRQYXJhbXMiLCAgICAgICAgICAgICAgIGNsbV9TZXRQYXJhbXMsIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIHZvaWQKIGNsX2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpIHsKLQkJaWYgKFNFTEYtPm9iX2lzQ29tcHJlc3NvcikKLQkJCWNsQ2xvc2VDb21wcmVzc29yKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpOwotCQllbHNlCi0JCQljbENsb3NlRGVjb21wcmVzc29yKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpOwotCX0KLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgaWYgKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpIHsKKyAgICAgICAgaWYgKFNFTEYtPm9iX2lzQ29tcHJlc3NvcikKKyAgICAgICAgICAgIGNsQ2xvc2VDb21wcmVzc29yKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbENsb3NlRGVjb21wcmVzc29yKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpOworICAgIH0KKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9nZXRhdHRyKFB5T2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCWlmIChTRUxGLT5vYl9pc0NvbXByZXNzb3IpCi0JCXJldHVybiBQeV9GaW5kTWV0aG9kKGNvbXByZXNzb3JfbWV0aG9kcywgc2VsZiwgbmFtZSk7Ci0JZWxzZQotCQlyZXR1cm4gUHlfRmluZE1ldGhvZChkZWNvbXByZXNzb3JfbWV0aG9kcywgc2VsZiwgbmFtZSk7CisgICAgaWYgKFNFTEYtPm9iX2lzQ29tcHJlc3NvcikKKyAgICAgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoY29tcHJlc3Nvcl9tZXRob2RzLCBzZWxmLCBuYW1lKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGRlY29tcHJlc3Nvcl9tZXRob2RzLCBzZWxmLCBuYW1lKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBDbHR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCS8qb2Jfc2l6ZSovCi0JImNsLmNsIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGNsb2JqZWN0KSwJLyp0cF9zaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciljbF9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWNsX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiY2wuY2wiLCAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoY2xvYmplY3QpLCAgICAgICAgICAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWNsX2RlYWxsb2MsICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpY2xfZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb09wZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgKCpvcGVuX2Z1bmMpKGludCwgQ0xfSGFuZGxlICopLAogICAgICAgIGludCBpc2NvbXByZXNzb3IpCiB7Ci0JaW50IHNjaGVtZTsKLQljbG9iamVjdCAqbmV3OworICAgIGludCBzY2hlbWU7CisgICAgY2xvYmplY3QgKm5ldzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZzY2hlbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmc2NoZW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluZXcgPSBQeU9iamVjdF9OZXcoY2xvYmplY3QsICZDbHR5cGUpOwotCWlmIChuZXcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbmV3ID0gUHlPYmplY3RfTmV3KGNsb2JqZWN0LCAmQ2x0eXBlKTsKKyAgICBpZiAobmV3ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbmV3LT5vYl9jb21wcmVzc29ySGRsID0gTlVMTDsKLQluZXctPm9iX2lzQ29tcHJlc3NvciA9IGlzY29tcHJlc3NvcjsKLQluZXctPm9iX3BhcmFtdHlwZXMgPSBOVUxMOworICAgIG5ldy0+b2JfY29tcHJlc3NvckhkbCA9IE5VTEw7CisgICAgbmV3LT5vYl9pc0NvbXByZXNzb3IgPSBpc2NvbXByZXNzb3I7CisgICAgbmV3LT5vYl9wYXJhbXR5cGVzID0gTlVMTDsKIAotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQlpZiAoKCpvcGVuX2Z1bmMpKHNjaGVtZSwgJm5ldy0+b2JfY29tcHJlc3NvckhkbCkgPT0gRkFJTFVSRSB8fAotCSAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgewotCQlQeV9ERUNSRUYobmV3KTsKLQkJaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiT3BlbihEZSlDb21wcmVzc29yIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ldzsKKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgaWYgKCgqb3Blbl9mdW5jKShzY2hlbWUsICZuZXctPm9iX2NvbXByZXNzb3JIZGwpID09IEZBSUxVUkUgfHwKKyAgICAgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ldyk7CisgICAgICAgIGlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgIk9wZW4oRGUpQ29tcHJlc3NvciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXc7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9PcGVuQ29tcHJlc3NvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvT3BlbihzZWxmLCBhcmdzLCBjbE9wZW5Db21wcmVzc29yLCAxKTsKKyAgICByZXR1cm4gZG9PcGVuKHNlbGYsIGFyZ3MsIGNsT3BlbkNvbXByZXNzb3IsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfT3BlbkRlY29tcHJlc3NvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvT3BlbihzZWxmLCBhcmdzLCBjbE9wZW5EZWNvbXByZXNzb3IsIDApOworICAgIHJldHVybiBkb09wZW4oc2VsZiwgYXJncywgY2xPcGVuRGVjb21wcmVzc29yLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsX1F1ZXJ5U2NoZW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpoZWFkZXI7Ci0JaW50IGhlYWRlcmxlbjsKLQlpbnQgc2NoZW1lOworICAgIGNoYXIgKmhlYWRlcjsKKyAgICBpbnQgaGVhZGVybGVuOworICAgIGludCBzY2hlbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjIiwgJmhlYWRlciwgJmhlYWRlcmxlbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyMiLCAmaGVhZGVyLCAmaGVhZGVybGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzY2hlbWUgPSBjbFF1ZXJ5U2NoZW1lKGhlYWRlcik7Ci0JaWYgKHNjaGVtZSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJ1bmtub3duIGNvbXByZXNzaW9uIHNjaGVtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc2NoZW1lID0gY2xRdWVyeVNjaGVtZShoZWFkZXIpOworICAgIGlmIChzY2hlbWUgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAidW5rbm93biBjb21wcmVzc2lvbiBzY2hlbWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNjaGVtZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNjaGVtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9RdWVyeU1heEhlYWRlclNpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzY2hlbWU7CisgICAgaW50IHNjaGVtZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZzY2hlbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmc2NoZW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoY2xRdWVyeU1heEhlYWRlclNpemUoc2NoZW1lKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGNsUXVlcnlNYXhIZWFkZXJTaXplKHNjaGVtZSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfUXVlcnlBbGdvcml0aG1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYWxnb3JpdGhtTWVkaWFUeXBlOwotCWludCBidWZmZXJsZW5ndGg7Ci0JaW50ICpQVmJ1ZmZlcjsKLQlQeU9iamVjdCAqbGlzdDsKLQlpbnQgaTsKKyAgICBpbnQgYWxnb3JpdGhtTWVkaWFUeXBlOworICAgIGludCBidWZmZXJsZW5ndGg7CisgICAgaW50ICpQVmJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBpbnQgaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZhbGdvcml0aG1NZWRpYVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmYWxnb3JpdGhtTWVkaWFUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JYnVmZmVybGVuZ3RoID0gY2xRdWVyeUFsZ29yaXRobXMoYWxnb3JpdGhtTWVkaWFUeXBlLCAwLCAwKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCXJldHVybiBOVUxMOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBidWZmZXJsZW5ndGggPSBjbFF1ZXJ5QWxnb3JpdGhtcyhhbGdvcml0aG1NZWRpYVR5cGUsIDAsIDApOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQVmJ1ZmZlciA9IFB5TWVtX05FVyhpbnQsIGJ1ZmZlcmxlbmd0aCk7Ci0JaWYgKFBWYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFBWYnVmZmVyID0gUHlNZW1fTkVXKGludCwgYnVmZmVybGVuZ3RoKTsKKyAgICBpZiAoUFZidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQlidWZmZXJsZW5ndGggPSBjbFF1ZXJ5QWxnb3JpdGhtcyhhbGdvcml0aG1NZWRpYVR5cGUsIFBWYnVmZmVyLAotCQkJCQkgYnVmZmVybGVuZ3RoKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJUHlNZW1fREVMKFBWYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGJ1ZmZlcmxlbmd0aCA9IGNsUXVlcnlBbGdvcml0aG1zKGFsZ29yaXRobU1lZGlhVHlwZSwgUFZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVybGVuZ3RoKTsKKyAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbGlzdCA9IFB5TGlzdF9OZXcoYnVmZmVybGVuZ3RoKTsKLQlpZiAobGlzdCA9PSBOVUxMKSB7Ci0JCVB5TWVtX0RFTChQVmJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsaXN0ID0gUHlMaXN0X05ldyhidWZmZXJsZW5ndGgpOworICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IGJ1ZmZlcmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICYgMSkKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKSk7Ci0JCWVsc2UgaWYgKFBWYnVmZmVyW2ldID09IDApIHsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5X05vbmUpOwotCQl9IGVsc2UKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksCi0JCQkJICAgUHlTdHJpbmdfRnJvbVN0cmluZygoY2hhciAqKSBQVmJ1ZmZlcltpXSkpOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVybGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKGkgJiAxKQorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pKTsKKyAgICAgICAgZWxzZSBpZiAoUFZidWZmZXJbaV0gPT0gMCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlfTm9uZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZygoY2hhciAqKSBQVmJ1ZmZlcltpXSkpOworICAgIH0KIAotCVB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKIAotCXJldHVybiBsaXN0OworICAgIHJldHVybiBsaXN0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfUXVlcnlTY2hlbWVGcm9tTmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGFsZ29yaXRobU1lZGlhVHlwZTsKLQljaGFyICpuYW1lOwotCWludCBzY2hlbWU7CisgICAgaW50IGFsZ29yaXRobU1lZGlhVHlwZTsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBzY2hlbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzIiwgJmFsZ29yaXRobU1lZGlhVHlwZSwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzIiwgJmFsZ29yaXRobU1lZGlhVHlwZSwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQlzY2hlbWUgPSBjbFF1ZXJ5U2NoZW1lRnJvbU5hbWUoYWxnb3JpdGhtTWVkaWFUeXBlLCBuYW1lKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJ1bmtub3duIGNvbXByZXNzaW9uIHNjaGVtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIHNjaGVtZSA9IGNsUXVlcnlTY2hlbWVGcm9tTmFtZShhbGdvcml0aG1NZWRpYVR5cGUsIG5hbWUpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgInVua25vd24gY29tcHJlc3Npb24gc2NoZW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzY2hlbWUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzY2hlbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfR2V0QWxnb3JpdGhtTmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHNjaGVtZTsKLQljaGFyICpuYW1lOworICAgIGludCBzY2hlbWU7CisgICAgY2hhciAqbmFtZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZzY2hlbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmc2NoZW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluYW1lID0gY2xHZXRBbGdvcml0aG1OYW1lKHNjaGVtZSk7Ci0JaWYgKG5hbWUgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgInVua25vd24gY29tcHJlc3Npb24gc2NoZW1lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBuYW1lID0gY2xHZXRBbGdvcml0aG1OYW1lKHNjaGVtZSk7CisgICAgaWYgKG5hbWUgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgInVua25vd24gY29tcHJlc3Npb24gc2NoZW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9fc2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50ICgqZnVuYykoaW50LCBpbnQsIGludCkpCiB7Ci0JaW50IHNjaGVtZSwgcGFyYW1JRCwgdmFsdWU7Ci0JZmxvYXQgZnZhbHVlOwotCWludCBpc19mbG9hdCA9IDA7CisgICAgaW50IHNjaGVtZSwgcGFyYW1JRCwgdmFsdWU7CisgICAgZmxvYXQgZnZhbHVlOworICAgIGludCBpc19mbG9hdCA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaSIsICZzY2hlbWUsICZwYXJhbUlELCAmdmFsdWUpKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlmIiwgJnNjaGVtZSwgJnBhcmFtSUQsICZmdmFsdWUpKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImJhZCBhcmd1bWVudCBsaXN0IChmb3JtYXQgJyhpaWkpJyBvciAnKGlpZiknKSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJdmFsdWUgPSBDTF9UeXBlSXNJbnQoZnZhbHVlKTsKLQkJaXNfZmxvYXQgPSAxOwotCX0gZWxzZSB7Ci0JCS8qIGNoZWNrIHNvbWUgcGFyYW1ldGVycyB3aGljaCB3ZSBrbm93IHRvIGJlIGZsb2F0cyAqLwotCQlzd2l0Y2ggKHNjaGVtZSkgewotCQljYXNlIENMX0NPTVBSRVNTSU9OX1JBVElPOgotCQljYXNlIENMX1NQRUVEOgotCQkJZnZhbHVlID0gdmFsdWU7Ci0JCQl2YWx1ZSA9IENMX1R5cGVJc0ludChmdmFsdWUpOwotCQkJaXNfZmxvYXQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWkiLCAmc2NoZW1lLCAmcGFyYW1JRCwgJnZhbHVlKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpZiIsICZzY2hlbWUsICZwYXJhbUlELCAmZnZhbHVlKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJiYWQgYXJndW1lbnQgbGlzdCAoZm9ybWF0ICcoaWlpKScgb3IgJyhpaWYpJykiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHZhbHVlID0gQ0xfVHlwZUlzSW50KGZ2YWx1ZSk7CisgICAgICAgIGlzX2Zsb2F0ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBjaGVjayBzb21lIHBhcmFtZXRlcnMgd2hpY2ggd2Uga25vdyB0byBiZSBmbG9hdHMgKi8KKyAgICAgICAgc3dpdGNoIChzY2hlbWUpIHsKKyAgICAgICAgY2FzZSBDTF9DT01QUkVTU0lPTl9SQVRJTzoKKyAgICAgICAgY2FzZSBDTF9TUEVFRDoKKyAgICAgICAgICAgIGZ2YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgdmFsdWUgPSBDTF9UeXBlSXNJbnQoZnZhbHVlKTsKKyAgICAgICAgICAgIGlzX2Zsb2F0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogCi0gCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQl2YWx1ZSA9ICgqZnVuYykoc2NoZW1lLCBwYXJhbUlELCB2YWx1ZSk7Ci0JaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgdmFsdWUgPSAoKmZ1bmMpKHNjaGVtZSwgcGFyYW1JRCwgdmFsdWUpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoaXNfZmxvYXQpCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoQ0xfVHlwZUlzRmxvYXQodmFsdWUpKTsKLQllbHNlCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CisgICAgaWYgKGlzX2Zsb2F0KQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKENMX1R5cGVJc0Zsb2F0KHZhbHVlKSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfU2V0RGVmYXVsdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvX3NldChzZWxmLCBhcmdzLCBjbFNldERlZmF1bHQpOworICAgIHJldHVybiBkb19zZXQoc2VsZiwgYXJncywgY2xTZXREZWZhdWx0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsX1NldE1pbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvX3NldChzZWxmLCBhcmdzLCBjbFNldE1pbik7CisgICAgcmV0dXJuIGRvX3NldChzZWxmLCBhcmdzLCBjbFNldE1pbik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9TZXRNYXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb19zZXQoc2VsZiwgYXJncywgY2xTZXRNYXgpOworICAgIHJldHVybiBkb19zZXQoc2VsZiwgYXJncywgY2xTZXRNYXgpOwogfQogCi0jZGVmaW5lIGZ1bmMobmFtZSwgaGFuZGxlcikJXAorI2RlZmluZSBmdW5jKG5hbWUsIGhhbmRsZXIpICAgICBcCiBzdGF0aWMgUHlPYmplY3QgKmNsXyMjbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIFwKIHsgXAotCSAgaW50IHg7IFwKLQkgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZ4KSkgcmV0dXJuIE5VTEw7IFwKLQkgIHJldHVybiBQeSMjaGFuZGxlcihDTF8jI25hbWUoeCkpOyBcCisgICAgICAgICAgaW50IHg7IFwKKyAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmeCkpIHJldHVybiBOVUxMOyBcCisgICAgICAgICAgcmV0dXJuIFB5IyNoYW5kbGVyKENMXyMjbmFtZSh4KSk7IFwKIH0KIAotI2RlZmluZSBmdW5jMihuYW1lLCBoYW5kbGVyKQlcCisjZGVmaW5lIGZ1bmMyKG5hbWUsIGhhbmRsZXIpICAgIFwKIHN0YXRpYyBQeU9iamVjdCAqY2xfIyNuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgXAogeyBcCi0JICBpbnQgYTEsIGEyOyBcCi0JICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpIiwgJmExLCAmYTIpKSByZXR1cm4gTlVMTDsgXAotCSAgcmV0dXJuIFB5IyNoYW5kbGVyKENMXyMjbmFtZShhMSwgYTIpKTsgXAorICAgICAgICAgIGludCBhMSwgYTI7IFwKKyAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpIiwgJmExLCAmYTIpKSByZXR1cm4gTlVMTDsgXAorICAgICAgICAgIHJldHVybiBQeSMjaGFuZGxlcihDTF8jI25hbWUoYTEsIGEyKSk7IFwKIH0KIAogZnVuYyhCeXRlc1BlclNhbXBsZSwgSW50X0Zyb21Mb25nKQpAQCAtOTA3LDUwICs5MDcsNTAgQEAKIGZ1bmMyKFBhcmFtSUQsIEludF9Gcm9tTG9uZykKIAogI2lmZGVmIENMREVCVUcKLQlzdGF0aWMgUHlPYmplY3QgKgorICAgIHN0YXRpYyBQeU9iamVjdCAqCiBjdnRfdHlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG51bWJlcjsKLQlmbG9hdCBmbnVtYmVyOworICAgIGludCBudW1iZXI7CisgICAgZmxvYXQgZm51bWJlcjsKIAotCWlmIChQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZudW1iZXIpKQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKENMX1R5cGVJc0Zsb2F0KG51bWJlcikpOwotCWVsc2UgewotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoUHlBcmdfUGFyc2UoYXJncywgImYiLCAmZm51bWJlcikpCi0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoQ0xfVHlwZUlzSW50KGZudW1iZXIpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZudW1iZXIpKQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKENMX1R5cGVJc0Zsb2F0KG51bWJlcikpOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoUHlBcmdfUGFyc2UoYXJncywgImYiLCAmZm51bWJlcikpCisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoQ0xfVHlwZUlzSW50KGZudW1iZXIpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjbF9tZXRob2RzW10gPSB7Ci0JeyJDb21wcmVzc0ltYWdlIiwJY2xfQ29tcHJlc3NJbWFnZSwgTUVUSF9WQVJBUkdTfSwKLQl7IkRlY29tcHJlc3NJbWFnZSIsCWNsX0RlY29tcHJlc3NJbWFnZSwgTUVUSF9WQVJBUkdTfSwKLQl7IkdldEFsZ29yaXRobU5hbWUiLAljbF9HZXRBbGdvcml0aG1OYW1lLCBNRVRIX1ZBUkFSR1N9LAotCXsiT3BlbkNvbXByZXNzb3IiLAljbF9PcGVuQ29tcHJlc3NvciwgTUVUSF9WQVJBUkdTfSwKLQl7Ik9wZW5EZWNvbXByZXNzb3IiLAljbF9PcGVuRGVjb21wcmVzc29yLCBNRVRIX1ZBUkFSR1N9LAotCXsiUXVlcnlBbGdvcml0aG1zIiwJY2xfUXVlcnlBbGdvcml0aG1zLCBNRVRIX1ZBUkFSR1N9LAotCXsiUXVlcnlNYXhIZWFkZXJTaXplIiwJY2xfUXVlcnlNYXhIZWFkZXJTaXplLCBNRVRIX1ZBUkFSR1N9LAotCXsiUXVlcnlTY2hlbWUiLAkJY2xfUXVlcnlTY2hlbWUsIE1FVEhfVkFSQVJHU30sCi0JeyJRdWVyeVNjaGVtZUZyb21OYW1lIiwJY2xfUXVlcnlTY2hlbWVGcm9tTmFtZSwgTUVUSF9WQVJBUkdTfSwKLQl7IlNldERlZmF1bHQiLAkJY2xfU2V0RGVmYXVsdCwgTUVUSF9WQVJBUkdTfSwKLQl7IlNldE1heCIsCQljbF9TZXRNYXgsIE1FVEhfVkFSQVJHU30sCi0JeyJTZXRNaW4iLAkJY2xfU2V0TWluLCBNRVRIX1ZBUkFSR1N9LAotCXsiQnl0ZXNQZXJTYW1wbGUiLAljbF9CeXRlc1BlclNhbXBsZSwgTUVUSF9WQVJBUkdTfSwKLQl7IkJ5dGVzUGVyUGl4ZWwiLAljbF9CeXRlc1BlclBpeGVsLCBNRVRIX1ZBUkFSR1N9LAotCXsiQXVkaW9Gb3JtYXROYW1lIiwJY2xfQXVkaW9Gb3JtYXROYW1lLCBNRVRIX1ZBUkFSR1N9LAotCXsiVmlkZW9Gb3JtYXROYW1lIiwJY2xfVmlkZW9Gb3JtYXROYW1lLCBNRVRIX1ZBUkFSR1N9LAotCXsiQWxnb3JpdGhtTnVtYmVyIiwJY2xfQWxnb3JpdGhtTnVtYmVyLCBNRVRIX1ZBUkFSR1N9LAotCXsiQWxnb3JpdGhtVHlwZSIsCWNsX0FsZ29yaXRobVR5cGUsIE1FVEhfVkFSQVJHU30sCi0JeyJBbGdvcml0aG0iLAkJY2xfQWxnb3JpdGhtLCBNRVRIX1ZBUkFSR1N9LAotCXsiUGFyYW1OdW1iZXIiLAkJY2xfUGFyYW1OdW1iZXIsIE1FVEhfVkFSQVJHU30sCi0JeyJQYXJhbVR5cGUiLAkJY2xfUGFyYW1UeXBlLCBNRVRIX1ZBUkFSR1N9LAotCXsiUGFyYW1JRCIsCQljbF9QYXJhbUlELCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiQ29tcHJlc3NJbWFnZSIsICAgICAgICAgICBjbF9Db21wcmVzc0ltYWdlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiRGVjb21wcmVzc0ltYWdlIiwgICAgICAgICBjbF9EZWNvbXByZXNzSW1hZ2UsIE1FVEhfVkFSQVJHU30sCisgICAgeyJHZXRBbGdvcml0aG1OYW1lIiwgICAgICAgIGNsX0dldEFsZ29yaXRobU5hbWUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJPcGVuQ29tcHJlc3NvciIsICAgICAgICAgIGNsX09wZW5Db21wcmVzc29yLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiT3BlbkRlY29tcHJlc3NvciIsICAgICAgICBjbF9PcGVuRGVjb21wcmVzc29yLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiUXVlcnlBbGdvcml0aG1zIiwgICAgICAgICBjbF9RdWVyeUFsZ29yaXRobXMsIE1FVEhfVkFSQVJHU30sCisgICAgeyJRdWVyeU1heEhlYWRlclNpemUiLCAgICAgIGNsX1F1ZXJ5TWF4SGVhZGVyU2l6ZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IlF1ZXJ5U2NoZW1lIiwgICAgICAgICAgICAgY2xfUXVlcnlTY2hlbWUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJRdWVyeVNjaGVtZUZyb21OYW1lIiwgICAgIGNsX1F1ZXJ5U2NoZW1lRnJvbU5hbWUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJTZXREZWZhdWx0IiwgICAgICAgICAgICAgIGNsX1NldERlZmF1bHQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJTZXRNYXgiLCAgICAgICAgICAgICAgICAgIGNsX1NldE1heCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IlNldE1pbiIsICAgICAgICAgICAgICAgICAgY2xfU2V0TWluLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiQnl0ZXNQZXJTYW1wbGUiLCAgICAgICAgICBjbF9CeXRlc1BlclNhbXBsZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkJ5dGVzUGVyUGl4ZWwiLCAgICAgICAgICAgY2xfQnl0ZXNQZXJQaXhlbCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkF1ZGlvRm9ybWF0TmFtZSIsICAgICAgICAgY2xfQXVkaW9Gb3JtYXROYW1lLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiVmlkZW9Gb3JtYXROYW1lIiwgICAgICAgICBjbF9WaWRlb0Zvcm1hdE5hbWUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJBbGdvcml0aG1OdW1iZXIiLCAgICAgICAgIGNsX0FsZ29yaXRobU51bWJlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkFsZ29yaXRobVR5cGUiLCAgICAgICAgICAgY2xfQWxnb3JpdGhtVHlwZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkFsZ29yaXRobSIsICAgICAgICAgICAgICAgY2xfQWxnb3JpdGhtLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiUGFyYW1OdW1iZXIiLCAgICAgICAgICAgICBjbF9QYXJhbU51bWJlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IlBhcmFtVHlwZSIsICAgICAgICAgICAgICAgY2xfUGFyYW1UeXBlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiUGFyYW1JRCIsICAgICAgICAgICAgICAgICBjbF9QYXJhbUlELCBNRVRIX1ZBUkFSR1N9LAogI2lmZGVmIENMREVCVUcKLQl7ImN2dF90eXBlIiwJCWN2dF90eXBlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY3Z0X3R5cGUiLCAgICAgICAgICAgICAgICBjdnRfdHlwZSwgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgotCXtOVUxMLAkJCU5VTEx9IC8qIFNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9IC8qIFNlbnRpbmVsICovCiB9OwogCiAjaWZkZWYgQ0xfSlBFR19TT0ZUV0FSRQpAQCAtOTYwLDE2MDQgKzk2MCwxNjA0IEBACiB2b2lkCiBpbml0Y2wodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp4OwotICAgIAorICAgIFB5T2JqZWN0ICptLCAqZCwgKng7CisKICAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSBjbCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQotICAgICAgICByZXR1cm47Ci0gICAgCi0JbSA9IFB5X0luaXRNb2R1bGUoImNsIiwgY2xfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIHJldHVybjsKIAotCUNsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNsLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JKHZvaWQpIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIENsRXJyb3IpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJjbCIsIGNsX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKworICAgIENsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNsLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgKHZvaWQpIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIENsRXJyb3IpOwogCiAjaWZkZWYgQ0xfQURERURfQUxHT1JJVEhNX0VSUk9SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FEREVEX0FMR09SSVRITV9FUlJPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQURERURfQUxHT1JJVEhNX0VSUk9SIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BRERFRF9BTEdPUklUSE1fRVJST1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFEREVEX0FMR09SSVRITV9FUlJPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FMQVcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxBVyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxBVyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxBVyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxBVyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FMR09SSVRITV9JRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BTEdPUklUSE1fSUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMR09SSVRITV9JRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxHT1JJVEhNX0lEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdPUklUSE1fSUQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BTEdPUklUSE1fVEFCTEVfRlVMTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BTEdPUklUSE1fVEFCTEVfRlVMTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxHT1JJVEhNX1RBQkxFX0ZVTEwiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FMR09SSVRITV9UQUJMRV9GVUxMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdPUklUSE1fVEFCTEVfRlVMTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FMR09SSVRITV9WRVJTSU9OCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FMR09SSVRITV9WRVJTSU9OKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdPUklUSE1fVkVSU0lPTiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxHT1JJVEhNX1ZFUlNJT04pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMR09SSVRITV9WRVJTSU9OIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQUxHX0FVRElPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FMR19BVURJTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxHX0FVRElPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BTEdfQVVESU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMR19BVURJTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FMR19WSURFTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BTEdfVklERU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMR19WSURFTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxHX1ZJREVPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdfVklERU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BVURJTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BVURJTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVVESU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FVRElPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBVURJTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX0JJVFJBVEVfUE9MSUNZCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0JJVFJBVEVfUE9MSUNZKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9CSVRSQVRFX1BPTElDWSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfQklUUkFURV9QT0xJQ1kpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0JJVFJBVEVfUE9MSUNZIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfQklUUkFURV9UQVJHRVQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfQklUUkFURV9UQVJHRVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0JJVFJBVEVfVEFSR0VUIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9CSVRSQVRFX1RBUkdFVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfQklUUkFURV9UQVJHRVQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9DSEFOTkVMX1BPTElDWQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9DSEFOTkVMX1BPTElDWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfQ0hBTk5FTF9QT0xJQ1kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0NIQU5ORUxfUE9MSUNZKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9DSEFOTkVMX1BPTElDWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX0NPTlNUX1FVQUwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfQ09OU1RfUVVBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfQ09OU1RfUVVBTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfQ09OU1RfUVVBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfQ09OU1RfUVVBTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX0VSUk9SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0VSUk9SKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9FUlJPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfRVJST1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0VSUk9SIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfRklYRURfUkFURQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9GSVhFRF9SQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9GSVhFRF9SQVRFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9GSVhFRF9SQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9GSVhFRF9SQVRFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfSU5ERVBFTkRFTlQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfSU5ERVBFTkRFTlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0lOREVQRU5ERU5UIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9JTkRFUEVOREVOVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfSU5ERVBFTkRFTlQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9KT0lOVF9TVEVSRU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfSk9JTlRfU1RFUkVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9KT0lOVF9TVEVSRU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0pPSU5UX1NURVJFTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfSk9JTlRfU1RFUkVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfTEFZRVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTEFZRVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0xBWUVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9MQVlFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTEFZRVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9MT1NTTEVTUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9MT1NTTEVTUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTE9TU0xFU1MiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0xPU1NMRVNTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9MT1NTTEVTUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX01QRUdfQVVESU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTVBFR19BVURJTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTVBFR19BVURJTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTVBFR19BVURJTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTVBFR19BVURJTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX01QRUdfTEFZRVJfSQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9NUEVHX0xBWUVSX0kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX01QRUdfTEFZRVJfSSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTVBFR19MQVlFUl9JKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9NUEVHX0xBWUVSX0kiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9NUEVHX0xBWUVSX0lJCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX01QRUdfTEFZRVJfSUkpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX01QRUdfTEFZRVJfSUkiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX01QRUdfTEFZRVJfSUkpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX01QRUdfTEFZRVJfSUkiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9NVUxUSVJBVEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTVVMVElSQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9NVUxUSVJBVEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX01VTFRJUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTVVMVElSQVRFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfTk9JU0VfTUFSR0lOCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX05PSVNFX01BUkdJTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTk9JU0VfTUFSR0lOIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9OT0lTRV9NQVJHSU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX05PSVNFX01BUkdJTiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX1NURVJFTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9TVEVSRU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX1NURVJFTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfU1RFUkVPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9TVEVSRU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQUxHT1JJVEhNX05BTUUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0FMR09SSVRITV9OQU1FKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQUxHT1JJVEhNX05BTUUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9BTEdPUklUSE1fTkFNRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0FMR09SSVRITV9OQU1FIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0FMR09SSVRITV9UWVBFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9BTEdPUklUSE1fVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0FMR09SSVRITV9UWVBFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQUxHT1JJVEhNX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9BTEdPUklUSE1fVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CTE9DS19TSVpFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CTE9DS19TSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQkxPQ0tfU0laRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JMT0NLX1NJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CTE9DS19TSVpFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0JPQVJECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CT0FSRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JPQVJEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQk9BUkQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CT0FSRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CVUZGRVJJTkcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUklORyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUklORyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUklORyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUklORyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CVUZGRVJMRU5HVEhfTkVHCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJMRU5HVEhfTkVHKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSTEVOR1RIX05FRyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUkxFTkdUSF9ORUcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJMRU5HVEhfTkVHIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0JVRkZFUkxFTkdUSF9PREQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUkxFTkdUSF9PREQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJMRU5HVEhfT0REIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSTEVOR1RIX09ERCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUkxFTkdUSF9PREQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQlVGRkVSX0VYSVNUUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX0VYSVNUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9FWElTVFMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfRVhJU1RTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX0VYSVNUUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CVUZGRVJfSEFORExFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfSEFORExFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX0hBTkRMRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9IQU5ETEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfSEFORExFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0JVRkZFUl9QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfUE9JTlRFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9QT0lOVEVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfUE9JTlRFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CVUZGRVJfUVVFUllfU0laRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX1FVRVJZX1NJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfUVVFUllfU0laRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9RVUVSWV9TSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX1FVRVJZX1NJWkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQlVGRkVSX1NJWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9TSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX1NJWkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9TSVpFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0JVRkZFUl9TSVpFX1BPSU5URVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9TSVpFX1BPSU5URVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfU0laRV9QT0lOVEVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX1NJWkVfUE9JTlRFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9TSVpFX1BPSU5URVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQlVGRkVSX1RZUEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX1RZUEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9UWVBFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0NPTVBSRVNTSU9OX1NDSEVNRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQ09NUFJFU1NJT05fU0NIRU1FKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09NUFJFU1NJT05fU0NIRU1FIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQ09NUFJFU1NJT05fU0NIRU1FKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09NUFJFU1NJT05fU0NIRU1FIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0NPTVBSRVNTT1JfSEFORExFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9DT01QUkVTU09SX0hBTkRMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0NPTVBSRVNTT1JfSEFORExFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQ09NUFJFU1NPUl9IQU5ETEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9DT01QUkVTU09SX0hBTkRMRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9DT01QUkVTU09SX0hBTkRMRV9QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9DT01QUkVTU09SX0hBTkRMRV9QT0lOVEVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09NUFJFU1NPUl9IQU5ETEVfUE9JTlRFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0NPTVBSRVNTT1JfSEFORExFX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9DT01QUkVTU09SX0hBTkRMRV9QT0lOVEVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0ZSQU1FX1NJWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0ZSQU1FX1NJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9GUkFNRV9TSVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfRlJBTUVfU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0ZSQU1FX1NJWkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfRlVOQ1RJT05BTElUWQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfRlVOQ1RJT05BTElUWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0ZVTkNUSU9OQUxJVFkiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9GVU5DVElPTkFMSVRZKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRlVOQ1RJT05BTElUWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9GVU5DVElPTl9QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9GVU5DVElPTl9QT0lOVEVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRlVOQ1RJT05fUE9JTlRFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0ZVTkNUSU9OX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9GVU5DVElPTl9QT0lOVEVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0hFQURFUl9TSVpFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9IRUFERVJfU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0hFQURFUl9TSVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfSEVBREVSX1NJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9IRUFERVJfU0laRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9JTklUSUFMX1ZBTFVFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9JTklUSUFMX1ZBTFVFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfSU5JVElBTF9WQUxVRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0lOSVRJQUxfVkFMVUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9JTklUSUFMX1ZBTFVFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0lOVEVSTkFMX0ZPUk1BVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfSU5URVJOQUxfRk9STUFUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfSU5URVJOQUxfRk9STUFUIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfSU5URVJOQUxfRk9STUFUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfSU5URVJOQUxfRk9STUFUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0xJQ0VOU0UKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0xJQ0VOU0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9MSUNFTlNFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfTElDRU5TRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0xJQ0VOU0UiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfTUlOX0dUX01BWAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfTUlOX0dUX01BWCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX01JTl9HVF9NQVgiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9NSU5fR1RfTUFYKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTUlOX0dUX01BWCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9OT19CVUZGRVJTUEFDRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfTk9fQlVGRkVSU1BBQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9OT19CVUZGRVJTUEFDRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX05PX0JVRkZFUlNQQUNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTk9fQlVGRkVSU1BBQ0UiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfTlVNQkVSX09GX0JMT0NLUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfTlVNQkVSX09GX0JMT0NLUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX05VTUJFUl9PRl9CTE9DS1MiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9OVU1CRVJfT0ZfQkxPQ0tTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTlVNQkVSX09GX0JMT0NLUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9QQVJBTQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfUEFSQU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QQVJBTSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1BBUkFNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEFSQU0iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfUEFSQU1fSURfUE9JTlRFUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfUEFSQU1fSURfUE9JTlRFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BBUkFNX0lEX1BPSU5URVIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9QQVJBTV9JRF9QT0lOVEVSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEFSQU1fSURfUE9JTlRFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9QQVJBTV9UWVBFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9QQVJBTV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEFSQU1fVFlQRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1BBUkFNX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QQVJBTV9UWVBFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX1BPSU5URVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1BPSU5URVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QT0lOVEVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfUE9JTlRFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BPSU5URVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfUFZCVUZGRVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1BWQlVGRkVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUFZCVUZGRVIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9QVkJVRkZFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BWQlVGRkVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX1NDSEVNRV9QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9TQ0hFTUVfUE9JTlRFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1NDSEVNRV9QT0lOVEVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfU0NIRU1FX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9TQ0hFTUVfUE9JTlRFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9TVFJFQU1fSEVBREVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9TVFJFQU1fSEVBREVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfU1RSRUFNX0hFQURFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1NUUkVBTV9IRUFERVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9TVFJFQU1fSEVBREVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX1NUUklOR19QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9TVFJJTkdfUE9JTlRFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1NUUklOR19QT0lOVEVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfU1RSSU5HX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9TVFJJTkdfUE9JTlRFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9URVhUX1NUUklOR19QVFIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1RFWFRfU1RSSU5HX1BUUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1RFWFRfU1RSSU5HX1BUUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1RFWFRfU1RSSU5HX1BUUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1RFWFRfU1RSSU5HX1BUUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JFU1RfRklUCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JFU1RfRklUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCRVNUX0ZJVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkVTVF9GSVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJFU1RfRklUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQklESVJFQ1RJT05BTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CSURJUkVDVElPTkFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSURJUkVDVElPTkFMIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CSURJUkVDVElPTkFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSURJUkVDVElPTkFMIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQklUUkFURQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CSVRSQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSVRSQVRFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CSVRSQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSVRSQVRFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQklUUkFURV9QT0xJQ1kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQklUUkFURV9QT0xJQ1kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJJVFJBVEVfUE9MSUNZIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CSVRSQVRFX1BPTElDWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQklUUkFURV9QT0xJQ1kiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CSVRSQVRFX1RBUkdFVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CSVRSQVRFX1RBUkdFVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQklUUkFURV9UQVJHRVQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JJVFJBVEVfVEFSR0VUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSVRSQVRFX1RBUkdFVCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JJVFNfUEVSX0NPTVBPTkVOVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CSVRTX1BFUl9DT01QT05FTlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJJVFNfUEVSX0NPTVBPTkVOVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQklUU19QRVJfQ09NUE9ORU5UKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSVRTX1BFUl9DT01QT05FTlQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CTEVORElORwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CTEVORElORyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkxFTkRJTkciLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JMRU5ESU5HKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCTEVORElORyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JMT0NLX1NJWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkxPQ0tfU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkxPQ0tfU0laRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkxPQ0tfU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkxPQ0tfU0laRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JPVFRPTV9VUAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CT1RUT01fVVApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJPVFRPTV9VUCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQk9UVE9NX1VQKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCT1RUT01fVVAiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CVUZGRVJfTk9UX0NSRUFURUQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQlVGRkVSX05PVF9DUkVBVEVEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCVUZGRVJfTk9UX0NSRUFURUQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JVRkZFUl9OT1RfQ1JFQVRFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQlVGRkVSX05PVF9DUkVBVEVEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQlVGX0NPTVBSRVNTRUQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQlVGX0NPTVBSRVNTRUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJVRl9DT01QUkVTU0VEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CVUZfQ09NUFJFU1NFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQlVGX0NPTVBSRVNTRUQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CVUZfREFUQQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CVUZfREFUQSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQlVGX0RBVEEiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JVRl9EQVRBKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCVUZfREFUQSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JVRl9GUkFNRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CVUZfRlJBTUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJVRl9GUkFNRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQlVGX0ZSQU1FKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCVUZfRlJBTUUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DSEFOTkVMX1BPTElDWQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DSEFOTkVMX1BPTElDWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hBTk5FTF9QT0xJQ1kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NIQU5ORUxfUE9MSUNZKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDSEFOTkVMX1BPTElDWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0NIUk9NQV9USFJFU0hPTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ0hST01BX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hST01BX1RIUkVTSE9MRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ0hST01BX1RIUkVTSE9MRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hST01BX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0NPREVDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPREVDKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT0RFQyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09ERUMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPREVDIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09NUE9ORU5UUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QT05FTlRTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT01QT05FTlRTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QT05FTlRTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT01QT05FTlRTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09NUFJFU1NFRF9CVUZGRVJfU0laRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QUkVTU0VEX0JVRkZFUl9TSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT01QUkVTU0VEX0JVRkZFUl9TSVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QUkVTU0VEX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT01QUkVTU0VEX0JVRkZFUl9TSVpFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09NUFJFU1NJT05fUkFUSU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09NUFJFU1NJT05fUkFUSU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTVBSRVNTSU9OX1JBVElPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QUkVTU0lPTl9SQVRJTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09NUFJFU1NJT05fUkFUSU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT01QUkVTU09SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTVBSRVNTT1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTVBSRVNTT1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTVBSRVNTT1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTVBSRVNTT1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT05USU5VT1VTX0JMT0NLCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTlRJTlVPVVNfQkxPQ0spOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTlRJTlVPVVNfQkxPQ0siLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTlRJTlVPVVNfQkxPQ0spOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTlRJTlVPVVNfQkxPQ0siLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT05USU5VT1VTX05PTkJMT0NLCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTlRJTlVPVVNfTk9OQkxPQ0spOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTlRJTlVPVVNfTk9OQkxPQ0siLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTlRJTlVPVVNfTk9OQkxPQ0spOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTlRJTlVPVVNfTk9OQkxPQ0siLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT1NNT19DT0RFQ19DT05UUk9MCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX0NPREVDX0NPTlRST0wpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX0NPREVDX0NPTlRST0wiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX0NPREVDX0NPTlRST0wpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX0NPREVDX0NPTlRST0wiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT1NNT19OVU1fUEFSQU1TCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX05VTV9QQVJBTVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX05VTV9QQVJBTVMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX05VTV9QQVJBTVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX05VTV9QQVJBTVMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT1NNT19WQUxVRV9CQVNFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX1ZBTFVFX0JBU0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX1ZBTFVFX0JBU0UiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX1ZBTFVFX0JBU0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX1ZBTFVFX0JBU0UiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT1NNT19WSURFT19NQU5VQUxfQ09OVFJPTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT1NNT19WSURFT19NQU5VQUxfQ09OVFJPTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09TTU9fVklERU9fTUFOVUFMX0NPTlRST0wiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX1ZJREVPX01BTlVBTF9DT05UUk9MKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT1NNT19WSURFT19NQU5VQUxfQ09OVFJPTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0NPU01PX1ZJREVPX1RSQU5TRkVSX01PREUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09TTU9fVklERU9fVFJBTlNGRVJfTU9ERSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09TTU9fVklERU9fVFJBTlNGRVJfTU9ERSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09TTU9fVklERU9fVFJBTlNGRVJfTU9ERSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09TTU9fVklERU9fVFJBTlNGRVJfTU9ERSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0RBVEEKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfREFUQSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREFUQSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfREFUQSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREFUQSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0RFQ09NUFJFU1NPUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9ERUNPTVBSRVNTT1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFQ09NUFJFU1NPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfREVDT01QUkVTU09SKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERUNPTVBSRVNTT1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9EU09fRVJST1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRFNPX0VSUk9SKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJEU09fRVJST1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0RTT19FUlJPUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRFNPX0VSUk9SIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRURHRV9USFJFU0hPTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRURHRV9USFJFU0hPTEQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVER0VfVEhSRVNIT0xEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9FREdFX1RIUkVTSE9MRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRURHRV9USFJFU0hPTEQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9FTkFCTEVfSU1BR0VJTkZPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0VOQUJMRV9JTUFHRUlORk8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVOQUJMRV9JTUFHRUlORk8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0VOQUJMRV9JTUFHRUlORk8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVOQUJMRV9JTUFHRUlORk8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9FTkRfT0ZfU0VRVUVOQ0UKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRU5EX09GX1NFUVVFTkNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTkRfT0ZfU0VRVUVOQ0UiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0VORF9PRl9TRVFVRU5DRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRU5EX09GX1NFUVVFTkNFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRU5VTV9WQUxVRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9FTlVNX1ZBTFVFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTlVNX1ZBTFVFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9FTlVNX1ZBTFVFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTlVNX1ZBTFVFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRVhBQ1RfQ09NUFJFU1NJT05fUkFUSU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRVhBQ1RfQ09NUFJFU1NJT05fUkFUSU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVYQUNUX0NPTVBSRVNTSU9OX1JBVElPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9FWEFDVF9DT01QUkVTU0lPTl9SQVRJTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVhBQ1RfQ09NUFJFU1NJT05fUkFUSU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9FWFRFUk5BTF9ERVZJQ0UKLQl4ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENMX0VYVEVSTkFMX0RFVklDRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVhURVJOQUxfREVWSUNFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZygobG9uZykgQ0xfRVhURVJOQUxfREVWSUNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFWFRFUk5BTF9ERVZJQ0UiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GTE9BVElOR19FTlVNX1ZBTFVFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZMT0FUSU5HX0VOVU1fVkFMVUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZMT0FUSU5HX0VOVU1fVkFMVUUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZMT0FUSU5HX0VOVU1fVkFMVUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZMT0FUSU5HX0VOVU1fVkFMVUUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GTE9BVElOR19SQU5HRV9WQUxVRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GTE9BVElOR19SQU5HRV9WQUxVRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRkxPQVRJTkdfUkFOR0VfVkFMVUUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZMT0FUSU5HX1JBTkdFX1ZBTFVFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGTE9BVElOR19SQU5HRV9WQUxVRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GT1JNQVRfQUJHUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfQUJHUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0FCR1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9BQkdSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfQUJHUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9CR1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0JHUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0JHUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0JHUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0JHUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9CR1IyMzMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0JHUjIzMyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0JHUjIzMyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0JHUjIzMyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0JHUjIzMyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9HUkFZU0NBTEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0dSQVlTQ0FMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0dSQVlTQ0FMRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0dSQVlTQ0FMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0dSQVlTQ0FMRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9NT05PCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9NT05PKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfTU9OTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX01PTk8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9NT05PIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRk9STUFUX1JCRzMyMwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfUkJHMzIzKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfUkJHMzIzIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfUkJHMzIzKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfUkJHMzIzIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRk9STUFUX1NURVJFT19JTlRFUkxFQVZFRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfU1RFUkVPX0lOVEVSTEVBVkVEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfU1RFUkVPX0lOVEVSTEVBVkVEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfU1RFUkVPX0lOVEVSTEVBVkVEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfU1RFUkVPX0lOVEVSTEVBVkVEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRk9STUFUX1hCR1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1hCR1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9YQkdSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfWEJHUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1hCR1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GT1JNQVRfWUNiQ3IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1lDYkNyKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfWUNiQ3IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9ZQ2JDcik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1lDYkNyIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRk9STUFUX1lDYkNyNDIyCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9ZQ2JDcjQyMik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1lDYkNyNDIyIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfWUNiQ3I0MjIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9ZQ2JDcjQyMiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9ZQ2JDcjQyMkRDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9ZQ2JDcjQyMkRDKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfWUNiQ3I0MjJEQyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1lDYkNyNDIyREMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9ZQ2JDcjQyMkRDIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRlJBTUUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GUkFNRVNfUEVSX0NIVU5LCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FU19QRVJfQ0hVTkspOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FU19QRVJfQ0hVTksiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FU19QRVJfQ0hVTkspOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FU19QRVJfQ0hVTksiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GUkFNRV9CVUZGRVJfU0laRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9CVUZGRVJfU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfQlVGRkVSX1NJWkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9CVUZGRVJfU0laRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZSQU1FX0JVRkZFUl9TSVpFX1pFUk8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfQlVGRkVSX1NJWkVfWkVSTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfQlVGRkVSX1NJWkVfWkVSTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfQlVGRkVSX1NJWkVfWkVSTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfQlVGRkVSX1NJWkVfWkVSTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZSQU1FX0lOREVYCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FX0lOREVYKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9JTkRFWCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfSU5ERVgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FX0lOREVYIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRlJBTUVfUkFURQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9SQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9SQVRFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9SQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9SQVRFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRlJBTUVfU0laRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9TSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9TSVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9TSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9TSVpFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRlJBTUVfVFlQRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9UWVBFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9UWVBFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRzcxMV9BTEFXCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0c3MTFfQUxBVyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRzcxMV9BTEFXIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9HNzExX0FMQVcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkc3MTFfQUxBVyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0c3MTFfQUxBV19TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9HNzExX0FMQVdfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkc3MTFfQUxBV19TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRzcxMV9BTEFXX1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHNzExX0FMQVdfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9HNzExX1VMQVcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRzcxMV9VTEFXKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHNzExX1VMQVciLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0c3MTFfVUxBVyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRzcxMV9VTEFXIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRzcxMV9VTEFXX1NPRlRXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0c3MTFfVUxBV19TT0ZUV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRzcxMV9VTEFXX1NPRlRXQVJFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9HNzExX1VMQVdfU09GVFdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkc3MTFfVUxBV19TT0ZUV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0dSQVlTQ0FMRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9HUkFZU0NBTEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkdSQVlTQ0FMRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfR1JBWVNDQUxFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHUkFZU0NBTEUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9IRENDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0hEQ0MpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhEQ0MiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0hEQ0MpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhEQ0MiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9IRENDX1NBTVBMRVNfUEVSX1RJTEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSERDQ19TQU1QTEVTX1BFUl9USUxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDX1NBTVBMRVNfUEVSX1RJTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0hEQ0NfU0FNUExFU19QRVJfVElMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSERDQ19TQU1QTEVTX1BFUl9USUxFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSERDQ19TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9IRENDX1NPRlRXQVJFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDX1NPRlRXQVJFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9IRENDX1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDX1NPRlRXQVJFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSERDQ19USUxFX1RIUkVTSE9MRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9IRENDX1RJTEVfVEhSRVNIT0xEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDX1RJTEVfVEhSRVNIT0xEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9IRENDX1RJTEVfVEhSRVNIT0xEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDX1RJTEVfVEhSRVNIT0xEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSEVBREVSX1NUQVJUX0NPREUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSEVBREVSX1NUQVJUX0NPREUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhFQURFUl9TVEFSVF9DT0RFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9IRUFERVJfU1RBUlRfQ09ERSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSEVBREVSX1NUQVJUX0NPREUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRUlORk9fRklFTERNQVNLCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFSU5GT19GSUVMRE1BU0spOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFSU5GT19GSUVMRE1BU0siLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFSU5GT19GSUVMRE1BU0spOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFSU5GT19GSUVMRE1BU0siLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRV9DUk9QX0JPVFRPTQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9DUk9QX0JPVFRPTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1BR0VfQ1JPUF9CT1RUT00iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX0NST1BfQk9UVE9NKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9DUk9QX0JPVFRPTSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0lNQUdFX0NST1BfTEVGVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9DUk9QX0xFRlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFX0NST1BfTEVGVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1BR0VfQ1JPUF9MRUZUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9DUk9QX0xFRlQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRV9DUk9QX1JJR0hUCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX0NST1BfUklHSFQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFX0NST1BfUklHSFQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX0NST1BfUklHSFQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFX0NST1BfUklHSFQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRV9DUk9QX1RPUAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9DUk9QX1RPUCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1BR0VfQ1JPUF9UT1AiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX0NST1BfVE9QKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9DUk9QX1RPUCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0lNQUdFX0hFSUdIVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9IRUlHSFQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFX0hFSUdIVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1BR0VfSEVJR0hUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9IRUlHSFQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRV9XSURUSAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9XSURUSCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1BR0VfV0lEVEgiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX1dJRFRIKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9XSURUSCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0lNUEFDVF9DT0RFQ19DT05UUk9MCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNUEFDVF9DT0RFQ19DT05UUk9MKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTVBBQ1RfQ09ERUNfQ09OVFJPTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1QQUNUX0NPREVDX0NPTlRST0wpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNUEFDVF9DT0RFQ19DT05UUk9MIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU1QQUNUX0ZSQU1FX0lOVEVSTEVBVkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1QQUNUX0ZSQU1FX0lOVEVSTEVBVkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNUEFDVF9GUkFNRV9JTlRFUkxFQVZFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTVBBQ1RfRlJBTUVfSU5URVJMRUFWRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1QQUNUX0ZSQU1FX0lOVEVSTEVBVkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTVBBQ1RfTlVNX1BBUkFNUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTVBBQ1RfTlVNX1BBUkFNUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1QQUNUX05VTV9QQVJBTVMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNUEFDVF9OVU1fUEFSQU1TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTVBBQ1RfTlVNX1BBUkFNUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0lOVEVSTkFMX0ZPUk1BVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTlRFUk5BTF9GT1JNQVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVEVSTkFMX0ZPUk1BVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU5URVJOQUxfRk9STUFUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRFUk5BTF9GT1JNQVQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTlRFUk5BTF9JTUFHRV9IRUlHSFQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU5URVJOQUxfSU1BR0VfSEVJR0hUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRFUk5BTF9JTUFHRV9IRUlHSFQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lOVEVSTkFMX0lNQUdFX0hFSUdIVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5URVJOQUxfSU1BR0VfSEVJR0hUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU5URVJOQUxfSU1BR0VfV0lEVEgKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU5URVJOQUxfSU1BR0VfV0lEVEgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVEVSTkFMX0lNQUdFX1dJRFRIIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTlRFUk5BTF9JTUFHRV9XSURUSCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5URVJOQUxfSU1BR0VfV0lEVEgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTlRSQQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTlRSQSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5UUkEiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lOVFJBKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRSQSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFRyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFRyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFRyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFRyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUdfQ09TTU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19DT1NNTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19DT1NNTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19DT1NNTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19DT1NNTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUdfRVJST1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19FUlJPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19FUlJPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19FUlJPUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19FUlJPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUdfSU1QQUNUCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfSU1QQUNUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKUEVHX0lNUEFDVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19JTVBBQ1QpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfSU1QQUNUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSlBFR19OVU1fUEFSQU1TCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfTlVNX1BBUkFNUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19OVU1fUEFSQU1TIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9KUEVHX05VTV9QQVJBTVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfTlVNX1BBUkFNUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUdfUVVBTElUWV9GQUNUT1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19RVUFMSVRZX0ZBQ1RPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19RVUFMSVRZX0ZBQ1RPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19RVUFMSVRZX0ZBQ1RPUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19RVUFMSVRZX0ZBQ1RPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUdfUVVBTlRJWkFUSU9OX1RBQkxFUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9KUEVHX1FVQU5USVpBVElPTl9UQUJMRVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfUVVBTlRJWkFUSU9OX1RBQkxFUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19RVUFOVElaQVRJT05fVEFCTEVTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKUEVHX1FVQU5USVpBVElPTl9UQUJMRVMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9KUEVHX1NPRlRXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfU09GVFdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfU09GVFdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9KUEVHX1NUUkVBTV9IRUFERVJTCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfU1RSRUFNX0hFQURFUlMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfU1RSRUFNX0hFQURFUlMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfU1RSRUFNX0hFQURFUlMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfU1RSRUFNX0hFQURFUlMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9LRVlGUkFNRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9LRVlGUkFNRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiS0VZRlJBTUUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0tFWUZSQU1FKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJLRVlGUkFNRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0tFWUZSQU1FX0RJU1RBTkNFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0tFWUZSQU1FX0RJU1RBTkNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJLRVlGUkFNRV9ESVNUQU5DRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfS0VZRlJBTUVfRElTVEFOQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIktFWUZSQU1FX0RJU1RBTkNFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTEFTVF9GUkFNRV9JTkRFWAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9MQVNUX0ZSQU1FX0lOREVYKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMQVNUX0ZSQU1FX0lOREVYIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9MQVNUX0ZSQU1FX0lOREVYKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMQVNUX0ZSQU1FX0lOREVYIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTEFZRVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTEFZRVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxBWUVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9MQVlFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEFZRVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9MVU1BX1RIUkVTSE9MRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9MVU1BX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTFVNQV9USFJFU0hPTEQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0xVTUFfVEhSRVNIT0xEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMVU1BX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01BWF9OVU1CRVJfT0ZfQVVESU9fQUxHT1JJVEhNUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NQVhfTlVNQkVSX09GX0FVRElPX0FMR09SSVRITVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9OVU1CRVJfT0ZfQVVESU9fQUxHT1JJVEhNUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTUFYX05VTUJFUl9PRl9BVURJT19BTEdPUklUSE1TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfTlVNQkVSX09GX0FVRElPX0FMR09SSVRITVMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NQVhfTlVNQkVSX09GX0ZPUk1BVFMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTUFYX05VTUJFUl9PRl9GT1JNQVRTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfTlVNQkVSX09GX0ZPUk1BVFMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01BWF9OVU1CRVJfT0ZfRk9STUFUUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX05VTUJFUl9PRl9GT1JNQVRTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTUFYX05VTUJFUl9PRl9PUklHSU5BTF9GT1JNQVRTCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01BWF9OVU1CRVJfT0ZfT1JJR0lOQUxfRk9STUFUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX05VTUJFUl9PRl9PUklHSU5BTF9GT1JNQVRTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NQVhfTlVNQkVSX09GX09SSUdJTkFMX0ZPUk1BVFMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9OVU1CRVJfT0ZfT1JJR0lOQUxfRk9STUFUUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01BWF9OVU1CRVJfT0ZfUEFSQU1TCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01BWF9OVU1CRVJfT0ZfUEFSQU1TKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfTlVNQkVSX09GX1BBUkFNUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTUFYX05VTUJFUl9PRl9QQVJBTVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9OVU1CRVJfT0ZfUEFSQU1TIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTUFYX05VTUJFUl9PRl9WSURFT19BTEdPUklUSE1TCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01BWF9OVU1CRVJfT0ZfVklERU9fQUxHT1JJVEhNUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX05VTUJFUl9PRl9WSURFT19BTEdPUklUSE1TIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NQVhfTlVNQkVSX09GX1ZJREVPX0FMR09SSVRITVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9OVU1CRVJfT0ZfVklERU9fQUxHT1JJVEhNUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01PTk8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTU9OTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTU9OTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX0FVRElPX0FXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX0FXQVJFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19BV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fQVdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX0FXQVJFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfQVVESU9fTEFZRVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTEFZRVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX0xBWUVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19MQVlFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTEFZRVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19MQVlFUl9JCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX0xBWUVSX0kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX0xBWUVSX0kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX0xBWUVSX0kpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX0xBWUVSX0kiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19MQVlFUl9JSQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19MQVlFUl9JSSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTEFZRVJfSUkiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX0xBWUVSX0lJKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19MQVlFUl9JSSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX0FVRElPX01PREUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTU9ERSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTU9ERSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTU9ERSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTU9ERSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX0FVRElPX01PREVfRFVBTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19NT0RFX0RVQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX01PREVfRFVBTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTU9ERV9EVUFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19NT0RFX0RVQUwiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19NT0RFX0pPSU5UCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREVfSk9JTlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX01PREVfSk9JTlQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREVfSk9JTlQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX01PREVfSk9JTlQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19NT0RFX1NJTkdMRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19NT0RFX1NJTkdMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTU9ERV9TSU5HTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREVfU0lOR0xFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19NT0RFX1NJTkdMRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX0FVRElPX01PREVfU1RFUkVPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREVfU1RFUkVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19NT0RFX1NURVJFTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTU9ERV9TVEVSRU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX01PREVfU1RFUkVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfQVVESU9fU09GVFdBUkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX1NPRlRXQVJFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19TT0ZUV0FSRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9FTkRfT0ZfU1RSRUFNCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0VORF9PRl9TVFJFQU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0VORF9PRl9TVFJFQU0iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0VORF9PRl9TVFJFQU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0VORF9PRl9TVFJFQU0iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9FUlJPUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9FUlJPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfRVJST1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0VSUk9SKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9FUlJPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX05VTV9QQVJBTVMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfTlVNX1BBUkFNUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfTlVNX1BBUkFNUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfTlVNX1BBUkFNUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfTlVNX1BBUkFNUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX00KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1gKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1gKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX04KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX1NPRlRORVNTCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX1NPRlRORVNTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9WSURFT19TT0ZUTkVTUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fU09GVE5FU1MpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX1NPRlRORVNTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfVklERU9fU09GVE5FU1NfTUFYSU1VTQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9WSURFT19TT0ZUTkVTU19NQVhJTVVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9WSURFT19TT0ZUTkVTU19NQVhJTVVNIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9WSURFT19TT0ZUTkVTU19NQVhJTVVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9WSURFT19TT0ZUTkVTU19NQVhJTVVNIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfVklERU9fU09GVE5FU1NfTUVESVVNCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX1NPRlRORVNTX01FRElVTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fU09GVE5FU1NfTUVESVVNIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9WSURFT19TT0ZUTkVTU19NRURJVU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX1NPRlRORVNTX01FRElVTSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX1NPRlRORVNTX05PTkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fU09GVE5FU1NfTk9ORSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fU09GVE5FU1NfTk9ORSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fU09GVE5FU1NfTk9ORSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fU09GVE5FU1NfTk9ORSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX1NPRlRXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX1NPRlRXQVJFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9WSURFT19TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fU09GVFdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX1NPRlRXQVJFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFR19WSURFTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHX1ZJREVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHX1ZJREVPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHX1ZJREVPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHX1ZJREVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVVMVElSQVRFX0FXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01VTFRJUkFURV9BV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVVMVElSQVRFX0FXQVJFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NVUxUSVJBVEVfQVdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1VTFRJUkFURV9BV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzEKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzFfU09GVFdBUkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMV9TT0ZUV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMV9TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMV9TT0ZUV0FSRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMV9TT0ZUV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfQkxFTkRJTkcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9CTEVORElORyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9CTEVORElORyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9CTEVORElORyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9CTEVORElORyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfQkxFTkRJTkdfT0ZGCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfQkxFTkRJTkdfT0ZGKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMyX0JMRU5ESU5HX09GRiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9CTEVORElOR19PRkYpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfQkxFTkRJTkdfT0ZGIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVZDMl9CTEVORElOR19PTgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMyX0JMRU5ESU5HX09OKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMyX0JMRU5ESU5HX09OIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMyX0JMRU5ESU5HX09OKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMyX0JMRU5ESU5HX09OIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVZDMl9DSFJPTUFfVEhSRVNIT0xECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfQ0hST01BX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9DSFJPTUFfVEhSRVNIT0xEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMyX0NIUk9NQV9USFJFU0hPTEQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfQ0hST01BX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfRURHRV9USFJFU0hPTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9FREdFX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9FREdFX1RIUkVTSE9MRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9FREdFX1RIUkVTSE9MRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9FREdFX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfRVJST1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9FUlJPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9FUlJPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9FUlJPUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9FUlJPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfTFVNQV9USFJFU0hPTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9MVU1BX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9MVU1BX1RIUkVTSE9MRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9MVU1BX1RIUkVTSE9MRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9MVU1BX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfU09GVFdBUkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9TT0ZUV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9TT0ZUV0FSRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9TT0ZUV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzNfUVVBTElUWV9MRVZFTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMzX1FVQUxJVFlfTEVWRUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzNfUVVBTElUWV9MRVZFTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDM19RVUFMSVRZX0xFVkVMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMzX1FVQUxJVFlfTEVWRUwiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMzX1NPRlRXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzNfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzNfU09GVFdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzNfU09GVFdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzNfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ORVhUX05PVF9BVkFJTEFCTEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTkVYVF9OT1RfQVZBSUxBQkxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJORVhUX05PVF9BVkFJTEFCTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX05FWFRfTk9UX0FWQUlMQUJMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTkVYVF9OT1RfQVZBSUxBQkxFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTk9JU0VfTUFSR0lOCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX05PSVNFX01BUkdJTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9JU0VfTUFSR0lOIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9OT0lTRV9NQVJHSU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PSVNFX01BUkdJTiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX05PTkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTk9ORSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9ORSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTk9ORSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9ORSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX05VTUJFUl9PRl9GT1JNQVRTCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX05VTUJFUl9PRl9GT1JNQVRTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfRk9STUFUUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTlVNQkVSX09GX0ZPUk1BVFMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5VTUJFUl9PRl9GT1JNQVRTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTlVNQkVSX09GX0ZSQU1FUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfRlJBTUVTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfRlJBTUVTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfRlJBTUVTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfRlJBTUVTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTlVNQkVSX09GX1BBUkFNUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfUEFSQU1TKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfUEFSQU1TIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfUEFSQU1TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfUEFSQU1TIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTlVNQkVSX09GX1BBUkFNU19GUkVFWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTlVNQkVSX09GX1BBUkFNU19GUkVFWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5VTUJFUl9PRl9QQVJBTVNfRlJFRVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfUEFSQU1TX0ZSRUVaRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVNQkVSX09GX1BBUkFNU19GUkVFWkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9OVU1CRVJfT0ZfVklERU9fRk9STUFUUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfVklERU9fRk9STUFUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVNQkVSX09GX1ZJREVPX0ZPUk1BVFMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX05VTUJFUl9PRl9WSURFT19GT1JNQVRTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfVklERU9fRk9STUFUUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX09SSUVOVEFUSU9OCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX09SSUVOVEFUSU9OKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPUklFTlRBVElPTiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfT1JJRU5UQVRJT04pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9SSUVOVEFUSU9OIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfT1JJR0lOQUxfRk9STUFUCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX09SSUdJTkFMX0ZPUk1BVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1JJR0lOQUxfRk9STUFUIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9PUklHSU5BTF9GT1JNQVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9SSUdJTkFMX0ZPUk1BVCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1BBUkFNX09VVF9PRl9SQU5HRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9QQVJBTV9PVVRfT0ZfUkFOR0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBBUkFNX09VVF9PRl9SQU5HRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUEFSQU1fT1VUX09GX1JBTkdFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQQVJBTV9PVVRfT0ZfUkFOR0UiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9QSVhFTF9BU1BFQ1QKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUElYRUxfQVNQRUNUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQSVhFTF9BU1BFQ1QiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1BJWEVMX0FTUEVDVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUElYRUxfQVNQRUNUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUFJFRElDVEVECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1BSRURJQ1RFRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUFJFRElDVEVEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9QUkVESUNURUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBSRURJQ1RFRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1BSRVJPTEwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUFJFUk9MTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUFJFUk9MTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUFJFUk9MTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUFJFUk9MTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1FVQUxJVFlfRkFDVE9SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1FVQUxJVFlfRkFDVE9SKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJRVUFMSVRZX0ZBQ1RPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTElUWV9GQUNUT1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlFVQUxJVFlfRkFDVE9SIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUVVBTElUWV9MRVZFTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9RVUFMSVRZX0xFVkVMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJRVUFMSVRZX0xFVkVMIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9RVUFMSVRZX0xFVkVMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJRVUFMSVRZX0xFVkVMIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUVVBTElUWV9TUEFUSUFMCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1FVQUxJVFlfU1BBVElBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTElUWV9TUEFUSUFMIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9RVUFMSVRZX1NQQVRJQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlFVQUxJVFlfU1BBVElBTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1FVQUxJVFlfVEVNUE9SQUwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTElUWV9URU1QT1JBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTElUWV9URU1QT1JBTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTElUWV9URU1QT1JBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTElUWV9URU1QT1JBTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1FVQU5USVpBVElPTl9UQUJMRVMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTlRJWkFUSU9OX1RBQkxFUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTlRJWkFUSU9OX1RBQkxFUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTlRJWkFUSU9OX1RBQkxFUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTlRJWkFUSU9OX1RBQkxFUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1JBTkdFX1ZBTFVFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JBTkdFX1ZBTFVFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQU5HRV9WQUxVRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkFOR0VfVkFMVUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBTkdFX1ZBTFVFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUkdCCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkdCIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9SR0IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1JHQjMzMgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9SR0IzMzIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQjMzMiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkdCMzMyKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSR0IzMzIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9SR0I4Ci0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQjgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQjgiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQjgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQjgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9SR0JBCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQkEpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQkEiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQkEpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQkEiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9SR0JYCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQlgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQlgiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQlgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQlgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9STEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkxFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUkxFMjQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkxFMjQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJMRTI0IiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9STEUyNCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkxFMjQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9STEUyNF9TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9STEUyNF9TT0ZUV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkxFMjRfU09GVFdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JMRTI0X1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSTEUyNF9TT0ZUV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1JMRV9TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9STEVfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJMRV9TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkxFX1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSTEVfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9SVFIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUlRSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSVFIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JUUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUlRSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUlRSMQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9SVFIxKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSVFIxIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9SVFIxKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSVFIxIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUlRSX1FVQUxJVFlfTEVWRUwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUlRSX1FVQUxJVFlfTEVWRUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJUUl9RVUFMSVRZX0xFVkVMIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9SVFJfUVVBTElUWV9MRVZFTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUlRSX1FVQUxJVFlfTEVWRUwiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9TQU1QTEVTX1BFUl9USUxFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1NBTVBMRVNfUEVSX1RJTEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBMRVNfUEVSX1RJTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1NBTVBMRVNfUEVSX1RJTEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBMRVNfUEVSX1RJTEUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9TQ0hFTUVfQlVTWQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9TQ0hFTUVfQlVTWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0NIRU1FX0JVU1kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1NDSEVNRV9CVVNZKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQ0hFTUVfQlVTWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1NDSEVNRV9OT1RfQVZBSUxBQkxFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1NDSEVNRV9OT1RfQVZBSUxBQkxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQ0hFTUVfTk9UX0FWQUlMQUJMRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfU0NIRU1FX05PVF9BVkFJTEFCTEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNDSEVNRV9OT1RfQVZBSUxBQkxFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfU1BFRUQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfU1BFRUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUVEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9TUEVFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFRUQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9TVEVSRU9fSU5URVJMRUFWRUQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfU1RFUkVPX0lOVEVSTEVBVkVEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVEVSRU9fSU5URVJMRUFWRUQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1NURVJFT19JTlRFUkxFQVZFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1RFUkVPX0lOVEVSTEVBVkVEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfU1RSRUFNX0hFQURFUlMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfU1RSRUFNX0hFQURFUlMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNUUkVBTV9IRUFERVJTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9TVFJFQU1fSEVBREVSUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1RSRUFNX0hFQURFUlMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9USUxFX1RIUkVTSE9MRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9USUxFX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVElMRV9USFJFU0hPTEQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1RJTEVfVEhSRVNIT0xEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUSUxFX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1RPUF9ET1dOCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1RPUF9ET1dOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUT1BfRE9XTiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVE9QX0RPV04pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRPUF9ET1dOIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfVUxBVwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9VTEFXKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTEFXIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9VTEFXKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTEFXIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfVU5DT01QUkVTU0VECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1VOQ09NUFJFU1NFRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5DT01QUkVTU0VEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9VTkNPTVBSRVNTRUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOQ09NUFJFU1NFRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1VOQ09NUFJFU1NFRF9BVURJTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9VTkNPTVBSRVNTRURfQVVESU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOQ09NUFJFU1NFRF9BVURJTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVU5DT01QUkVTU0VEX0FVRElPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTkNPTVBSRVNTRURfQVVESU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9VTkNPTVBSRVNTRURfVklERU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVU5DT01QUkVTU0VEX1ZJREVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTkNPTVBSRVNTRURfVklERU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1VOQ09NUFJFU1NFRF9WSURFTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5DT01QUkVTU0VEX1ZJREVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfVU5LTk9XTl9TQ0hFTUUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVU5LTk9XTl9TQ0hFTUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOS05PV05fU0NIRU1FIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9VTktOT1dOX1NDSEVNRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5LTk9XTl9TQ0hFTUUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9WSURFTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9WSURFTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVklERU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1ZJREVPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJWSURFTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1lDYkNyCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZQ2JDciIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWUNiQ3IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfWUNiQ3I0MjIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWUNiQ3I0MjIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyNDIyIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9ZQ2JDcjQyMik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWUNiQ3I0MjIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ZQ2JDcjQyMkRDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyNDIyREMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyNDIyREMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyNDIyREMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyNDIyREMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ZQ2JDcjQyMkhDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyNDIySEMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyNDIySEMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyNDIySEMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyNDIySEMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ZVVYKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWVVWKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZVVYiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1lVVik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWVVWIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfWVVWNDIyCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lVVjQyMik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWVVWNDIyIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9ZVVY0MjIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllVVjQyMiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1lVVjQyMkRDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lVVjQyMkRDKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZVVY0MjJEQyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWVVWNDIyREMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllVVjQyMkRDIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfWVVWNDIySEMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWVVWNDIySEMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllVVjQyMkhDIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9ZVVY0MjJIQyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWVVWNDIySEMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBV0NNUF9TVEVSRU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfU1RFUkVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9TVEVSRU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX1NURVJFTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfU1RFUkVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfSk9JTlRfU1RFUkVPCi0JeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX0pPSU5UX1NURVJFTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfSk9JTlRfU1RFUkVPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9KT0lOVF9TVEVSRU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQ01QX0pPSU5UX1NURVJFTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFXQ01QX0lOREVQRU5ERU5UCi0JeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX0lOREVQRU5ERU5UKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9JTkRFUEVOREVOVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfSU5ERVBFTkRFTlQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQ01QX0lOREVQRU5ERU5UIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfRklYRURfUkFURQotCXggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9GSVhFRF9SQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9GSVhFRF9SQVRFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9GSVhFRF9SQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9GSVhFRF9SQVRFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfQ09OU1RfUVVBTAotCXggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9DT05TVF9RVUFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9DT05TVF9RVUFMIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9DT05TVF9RVUFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9DT05TVF9RVUFMIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfTE9TU0xFU1MKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfTE9TU0xFU1MpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQ01QX0xPU1NMRVNTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9MT1NTTEVTUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfTE9TU0xFU1MiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBV0NNUF9NUEVHX0xBWUVSX0kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfTVBFR19MQVlFUl9JKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9NUEVHX0xBWUVSX0kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX01QRUdfTEFZRVJfSSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfTVBFR19MQVlFUl9JIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfTVBFR19MQVlFUl9JSQotCXggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9NUEVHX0xBWUVSX0lJKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9NUEVHX0xBWUVSX0lJIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9NUEVHX0xBWUVSX0lJKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9NUEVHX0xBWUVSX0lJIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAKLQkodm9pZCkgY2xTZXRFcnJvckhhbmRsZXIoY2xfRXJyb3JIYW5kbGVyKTsKKyAgICAodm9pZCkgY2xTZXRFcnJvckhhbmRsZXIoY2xfRXJyb3JIYW5kbGVyKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY21hdGhtb2R1bGUuYyBiL01vZHVsZXMvY21hdGhtb2R1bGUuYwppbmRleCA3ODhhMTlkLi44MjVmN2FkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NtYXRobW9kdWxlLmMKKysrIGIvTW9kdWxlcy9jbWF0aG1vZHVsZS5jCkBAIC0zMiw3ICszMiw3IEBACiAjZGVmaW5lIENNX0xPR19MQVJHRV9ET1VCTEUgKGxvZyhDTV9MQVJHRV9ET1VCTEUpKQogI2RlZmluZSBDTV9TUVJUX0RCTF9NSU4gKHNxcnQoREJMX01JTikpCiAKLS8qIAorLyoKICAgIENNX1NDQUxFX1VQIGlzIGFuIG9kZCBpbnRlZ2VyIGNob3NlbiBzdWNoIHRoYXQgbXVsdGlwbGljYXRpb24gYnkKICAgIDIqKkNNX1NDQUxFX1VQIGlzIHN1ZmZpY2llbnQgdG8gdHVybiBhIHN1Ym5vcm1hbCBpbnRvIGEgbm9ybWFsLgogICAgQ01fU0NBTEVfRE9XTiBpcyAoLShDTV9TQ0FMRV9VUCsxKS8yKS4gIFRoZXNlIHNjYWxpbmdzIGFyZSB1c2VkIHRvIGNvbXB1dGUKQEAgLTYzLDQ2ICs2Myw0NiBAQAogKi8KIAogZW51bSBzcGVjaWFsX3R5cGVzIHsKLQlTVF9OSU5GLAkvKiAwLCBuZWdhdGl2ZSBpbmZpbml0eSAqLwotCVNUX05FRywJCS8qIDEsIG5lZ2F0aXZlIGZpbml0ZSBudW1iZXIgKG5vbnplcm8pICovCi0JU1RfTlpFUk8sCS8qIDIsIC0wLiAqLwotCVNUX1BaRVJPLAkvKiAzLCArMC4gKi8KLQlTVF9QT1MsCQkvKiA0LCBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyIChub256ZXJvKSAqLwotCVNUX1BJTkYsCS8qIDUsIHBvc2l0aXZlIGluZmluaXR5ICovCi0JU1RfTkFOCQkvKiA2LCBOb3QgYSBOdW1iZXIgKi8KKyAgICBTVF9OSU5GLCAgICAgICAgICAgIC8qIDAsIG5lZ2F0aXZlIGluZmluaXR5ICovCisgICAgU1RfTkVHLCAgICAgICAgICAgICAvKiAxLCBuZWdhdGl2ZSBmaW5pdGUgbnVtYmVyIChub256ZXJvKSAqLworICAgIFNUX05aRVJPLCAgICAgICAgICAgLyogMiwgLTAuICovCisgICAgU1RfUFpFUk8sICAgICAgICAgICAvKiAzLCArMC4gKi8KKyAgICBTVF9QT1MsICAgICAgICAgICAgIC8qIDQsIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIgKG5vbnplcm8pICovCisgICAgU1RfUElORiwgICAgICAgICAgICAvKiA1LCBwb3NpdGl2ZSBpbmZpbml0eSAqLworICAgIFNUX05BTiAgICAgICAgICAgICAgLyogNiwgTm90IGEgTnVtYmVyICovCiB9OwogCiBzdGF0aWMgZW51bSBzcGVjaWFsX3R5cGVzCiBzcGVjaWFsX3R5cGUoZG91YmxlIGQpCiB7Ci0JaWYgKFB5X0lTX0ZJTklURShkKSkgewotCQlpZiAoZCAhPSAwKSB7Ci0JCQlpZiAoY29weXNpZ24oMS4sIGQpID09IDEuKQotCQkJCXJldHVybiBTVF9QT1M7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIFNUX05FRzsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChjb3B5c2lnbigxLiwgZCkgPT0gMS4pCi0JCQkJcmV0dXJuIFNUX1BaRVJPOwotCQkJZWxzZQotCQkJCXJldHVybiBTVF9OWkVSTzsKLQkJfQotCX0KLQlpZiAoUHlfSVNfTkFOKGQpKQotCQlyZXR1cm4gU1RfTkFOOwotCWlmIChjb3B5c2lnbigxLiwgZCkgPT0gMS4pCi0JCXJldHVybiBTVF9QSU5GOwotCWVsc2UKLQkJcmV0dXJuIFNUX05JTkY7CisgICAgaWYgKFB5X0lTX0ZJTklURShkKSkgeworICAgICAgICBpZiAoZCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY29weXNpZ24oMS4sIGQpID09IDEuKQorICAgICAgICAgICAgICAgIHJldHVybiBTVF9QT1M7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIFNUX05FRzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjb3B5c2lnbigxLiwgZCkgPT0gMS4pCisgICAgICAgICAgICAgICAgcmV0dXJuIFNUX1BaRVJPOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBTVF9OWkVSTzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoUHlfSVNfTkFOKGQpKQorICAgICAgICByZXR1cm4gU1RfTkFOOworICAgIGlmIChjb3B5c2lnbigxLiwgZCkgPT0gMS4pCisgICAgICAgIHJldHVybiBTVF9QSU5GOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFNUX05JTkY7CiB9CiAKLSNkZWZpbmUgU1BFQ0lBTF9WQUxVRSh6LCB0YWJsZSkJCQkJCQlcCi0JaWYgKCFQeV9JU19GSU5JVEUoKHopLnJlYWwpIHx8ICFQeV9JU19GSU5JVEUoKHopLmltYWcpKSB7CVwKLQkJZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJldHVybiB0YWJsZVtzcGVjaWFsX3R5cGUoKHopLnJlYWwpXQkgICAgICAgICAgICAgICAgXAotCQkJICAgIFtzcGVjaWFsX3R5cGUoKHopLmltYWcpXTsJCQlcCi0JfQorI2RlZmluZSBTUEVDSUFMX1ZBTFVFKHosIHRhYmxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghUHlfSVNfRklOSVRFKCh6KS5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKCh6KS5pbWFnKSkgeyAgICAgICAgICAgXAorICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHRhYmxlW3NwZWNpYWxfdHlwZSgoeikucmVhbCldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZSgoeikuaW1hZyldOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKICNkZWZpbmUgUCBQeV9NQVRIX1BJCiAjZGVmaW5lIFAxNCAwLjI1KlB5X01BVEhfUEkKQEAgLTEyNiwzNCArMTI2LDM0IEBACiBzdGF0aWMgUHlfY29tcGxleAogY19hY29zKFB5X2NvbXBsZXggeikKIHsKLQlQeV9jb21wbGV4IHMxLCBzMiwgcjsKKyAgICBQeV9jb21wbGV4IHMxLCBzMiwgcjsKIAotCVNQRUNJQUxfVkFMVUUoeiwgYWNvc19zcGVjaWFsX3ZhbHVlcyk7CisgICAgU1BFQ0lBTF9WQUxVRSh6LCBhY29zX3NwZWNpYWxfdmFsdWVzKTsKIAotCWlmIChmYWJzKHoucmVhbCkgPiBDTV9MQVJHRV9ET1VCTEUgfHwgZmFicyh6LmltYWcpID4gQ01fTEFSR0VfRE9VQkxFKSB7Ci0JCS8qIGF2b2lkIHVubmVjZXNzYXJ5IG92ZXJmbG93IGZvciBsYXJnZSBhcmd1bWVudHMgKi8KLQkJci5yZWFsID0gYXRhbjIoZmFicyh6LmltYWcpLCB6LnJlYWwpOwotCQkvKiBzcGxpdCBpbnRvIGNhc2VzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBicmFuY2ggY3V0IGhhcyB0aGUKLQkJICAgY29ycmVjdCBjb250aW51aXR5IG9uIHN5c3RlbXMgd2l0aCB1bnNpZ25lZCB6ZXJvcyAqLwotCQlpZiAoei5yZWFsIDwgMC4pIHsKLQkJCXIuaW1hZyA9IC1jb3B5c2lnbihsb2coaHlwb3Qoei5yZWFsLzIuLCB6LmltYWcvMi4pKSArCi0JCQkJCSAgIE1fTE4yKjIuLCB6LmltYWcpOwotCQl9IGVsc2UgewotCQkJci5pbWFnID0gY29weXNpZ24obG9nKGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKSkgKwotCQkJCQkgIE1fTE4yKjIuLCAtei5pbWFnKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXMxLnJlYWwgPSAxLi16LnJlYWw7Ci0JCXMxLmltYWcgPSAtei5pbWFnOwotCQlzMSA9IGNfc3FydChzMSk7Ci0JCXMyLnJlYWwgPSAxLit6LnJlYWw7Ci0JCXMyLmltYWcgPSB6LmltYWc7Ci0JCXMyID0gY19zcXJ0KHMyKTsKLQkJci5yZWFsID0gMi4qYXRhbjIoczEucmVhbCwgczIucmVhbCk7Ci0JCXIuaW1hZyA9IG1fYXNpbmgoczIucmVhbCpzMS5pbWFnIC0gczIuaW1hZypzMS5yZWFsKTsKLQl9Ci0JZXJybm8gPSAwOwotCXJldHVybiByOworICAgIGlmIChmYWJzKHoucmVhbCkgPiBDTV9MQVJHRV9ET1VCTEUgfHwgZmFicyh6LmltYWcpID4gQ01fTEFSR0VfRE9VQkxFKSB7CisgICAgICAgIC8qIGF2b2lkIHVubmVjZXNzYXJ5IG92ZXJmbG93IGZvciBsYXJnZSBhcmd1bWVudHMgKi8KKyAgICAgICAgci5yZWFsID0gYXRhbjIoZmFicyh6LmltYWcpLCB6LnJlYWwpOworICAgICAgICAvKiBzcGxpdCBpbnRvIGNhc2VzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBicmFuY2ggY3V0IGhhcyB0aGUKKyAgICAgICAgICAgY29ycmVjdCBjb250aW51aXR5IG9uIHN5c3RlbXMgd2l0aCB1bnNpZ25lZCB6ZXJvcyAqLworICAgICAgICBpZiAoei5yZWFsIDwgMC4pIHsKKyAgICAgICAgICAgIHIuaW1hZyA9IC1jb3B5c2lnbihsb2coaHlwb3Qoei5yZWFsLzIuLCB6LmltYWcvMi4pKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTV9MTjIqMi4sIHouaW1hZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLmltYWcgPSBjb3B5c2lnbihsb2coaHlwb3Qoei5yZWFsLzIuLCB6LmltYWcvMi4pKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNX0xOMioyLiwgLXouaW1hZyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzMS5yZWFsID0gMS4tei5yZWFsOworICAgICAgICBzMS5pbWFnID0gLXouaW1hZzsKKyAgICAgICAgczEgPSBjX3NxcnQoczEpOworICAgICAgICBzMi5yZWFsID0gMS4rei5yZWFsOworICAgICAgICBzMi5pbWFnID0gei5pbWFnOworICAgICAgICBzMiA9IGNfc3FydChzMik7CisgICAgICAgIHIucmVhbCA9IDIuKmF0YW4yKHMxLnJlYWwsIHMyLnJlYWwpOworICAgICAgICByLmltYWcgPSBtX2FzaW5oKHMyLnJlYWwqczEuaW1hZyAtIHMyLmltYWcqczEucmVhbCk7CisgICAgfQorICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfYWNvc19kb2MsCkBAIC0xNjcsMjYgKzE2NywyNiBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfYWNvc2goUHlfY29tcGxleCB6KQogewotCVB5X2NvbXBsZXggczEsIHMyLCByOworICAgIFB5X2NvbXBsZXggczEsIHMyLCByOwogCi0JU1BFQ0lBTF9WQUxVRSh6LCBhY29zaF9zcGVjaWFsX3ZhbHVlcyk7CisgICAgU1BFQ0lBTF9WQUxVRSh6LCBhY29zaF9zcGVjaWFsX3ZhbHVlcyk7CiAKLQlpZiAoZmFicyh6LnJlYWwpID4gQ01fTEFSR0VfRE9VQkxFIHx8IGZhYnMoei5pbWFnKSA+IENNX0xBUkdFX0RPVUJMRSkgewotCQkvKiBhdm9pZCB1bm5lY2Vzc2FyeSBvdmVyZmxvdyBmb3IgbGFyZ2UgYXJndW1lbnRzICovCi0JCXIucmVhbCA9IGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsgTV9MTjIqMi47Ci0JCXIuaW1hZyA9IGF0YW4yKHouaW1hZywgei5yZWFsKTsKLQl9IGVsc2UgewotCQlzMS5yZWFsID0gei5yZWFsIC0gMS47Ci0JCXMxLmltYWcgPSB6LmltYWc7Ci0JCXMxID0gY19zcXJ0KHMxKTsKLQkJczIucmVhbCA9IHoucmVhbCArIDEuOwotCQlzMi5pbWFnID0gei5pbWFnOwotCQlzMiA9IGNfc3FydChzMik7Ci0JCXIucmVhbCA9IG1fYXNpbmgoczEucmVhbCpzMi5yZWFsICsgczEuaW1hZypzMi5pbWFnKTsKLQkJci5pbWFnID0gMi4qYXRhbjIoczEuaW1hZywgczIucmVhbCk7Ci0JfQotCWVycm5vID0gMDsKLQlyZXR1cm4gcjsKKyAgICBpZiAoZmFicyh6LnJlYWwpID4gQ01fTEFSR0VfRE9VQkxFIHx8IGZhYnMoei5pbWFnKSA+IENNX0xBUkdFX0RPVUJMRSkgeworICAgICAgICAvKiBhdm9pZCB1bm5lY2Vzc2FyeSBvdmVyZmxvdyBmb3IgbGFyZ2UgYXJndW1lbnRzICovCisgICAgICAgIHIucmVhbCA9IGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsgTV9MTjIqMi47CisgICAgICAgIHIuaW1hZyA9IGF0YW4yKHouaW1hZywgei5yZWFsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzMS5yZWFsID0gei5yZWFsIC0gMS47CisgICAgICAgIHMxLmltYWcgPSB6LmltYWc7CisgICAgICAgIHMxID0gY19zcXJ0KHMxKTsKKyAgICAgICAgczIucmVhbCA9IHoucmVhbCArIDEuOworICAgICAgICBzMi5pbWFnID0gei5pbWFnOworICAgICAgICBzMiA9IGNfc3FydChzMik7CisgICAgICAgIHIucmVhbCA9IG1fYXNpbmgoczEucmVhbCpzMi5yZWFsICsgczEuaW1hZypzMi5pbWFnKTsKKyAgICAgICAgci5pbWFnID0gMi4qYXRhbjIoczEuaW1hZywgczIucmVhbCk7CisgICAgfQorICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfYWNvc2hfZG9jLApAQCAtMTk4LDE0ICsxOTgsMTQgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2FzaW4oUHlfY29tcGxleCB6KQogewotCS8qIGFzaW4oeikgPSAtaSBhc2luaChpeikgKi8KLQlQeV9jb21wbGV4IHMsIHI7Ci0Jcy5yZWFsID0gLXouaW1hZzsKLQlzLmltYWcgPSB6LnJlYWw7Ci0JcyA9IGNfYXNpbmgocyk7Ci0Jci5yZWFsID0gcy5pbWFnOwotCXIuaW1hZyA9IC1zLnJlYWw7Ci0JcmV0dXJuIHI7CisgICAgLyogYXNpbih6KSA9IC1pIGFzaW5oKGl6KSAqLworICAgIFB5X2NvbXBsZXggcywgcjsKKyAgICBzLnJlYWwgPSAtei5pbWFnOworICAgIHMuaW1hZyA9IHoucmVhbDsKKyAgICBzID0gY19hc2luaChzKTsKKyAgICByLnJlYWwgPSBzLmltYWc7CisgICAgci5pbWFnID0gLXMucmVhbDsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfYXNpbl9kb2MsCkBAIC0yMTksMzEgKzIxOSwzMSBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfYXNpbmgoUHlfY29tcGxleCB6KQogewotCVB5X2NvbXBsZXggczEsIHMyLCByOworICAgIFB5X2NvbXBsZXggczEsIHMyLCByOwogCi0JU1BFQ0lBTF9WQUxVRSh6LCBhc2luaF9zcGVjaWFsX3ZhbHVlcyk7CisgICAgU1BFQ0lBTF9WQUxVRSh6LCBhc2luaF9zcGVjaWFsX3ZhbHVlcyk7CiAKLQlpZiAoZmFicyh6LnJlYWwpID4gQ01fTEFSR0VfRE9VQkxFIHx8IGZhYnMoei5pbWFnKSA+IENNX0xBUkdFX0RPVUJMRSkgewotCQlpZiAoei5pbWFnID49IDAuKSB7Ci0JCQlyLnJlYWwgPSBjb3B5c2lnbihsb2coaHlwb3Qoei5yZWFsLzIuLCB6LmltYWcvMi4pKSArCi0JCQkJCSAgTV9MTjIqMi4sIHoucmVhbCk7Ci0JCX0gZWxzZSB7Ci0JCQlyLnJlYWwgPSAtY29weXNpZ24obG9nKGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKSkgKwotCQkJCQkgICBNX0xOMioyLiwgLXoucmVhbCk7Ci0JCX0KLQkJci5pbWFnID0gYXRhbjIoei5pbWFnLCBmYWJzKHoucmVhbCkpOwotCX0gZWxzZSB7Ci0JCXMxLnJlYWwgPSAxLit6LmltYWc7Ci0JCXMxLmltYWcgPSAtei5yZWFsOwotCQlzMSA9IGNfc3FydChzMSk7Ci0JCXMyLnJlYWwgPSAxLi16LmltYWc7Ci0JCXMyLmltYWcgPSB6LnJlYWw7Ci0JCXMyID0gY19zcXJ0KHMyKTsKLQkJci5yZWFsID0gbV9hc2luaChzMS5yZWFsKnMyLmltYWctczIucmVhbCpzMS5pbWFnKTsKLQkJci5pbWFnID0gYXRhbjIoei5pbWFnLCBzMS5yZWFsKnMyLnJlYWwtczEuaW1hZypzMi5pbWFnKTsKLQl9Ci0JZXJybm8gPSAwOwotCXJldHVybiByOworICAgIGlmIChmYWJzKHoucmVhbCkgPiBDTV9MQVJHRV9ET1VCTEUgfHwgZmFicyh6LmltYWcpID4gQ01fTEFSR0VfRE9VQkxFKSB7CisgICAgICAgIGlmICh6LmltYWcgPj0gMC4pIHsKKyAgICAgICAgICAgIHIucmVhbCA9IGNvcHlzaWduKGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1fTE4yKjIuLCB6LnJlYWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgci5yZWFsID0gLWNvcHlzaWduKGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNX0xOMioyLiwgLXoucmVhbCk7CisgICAgICAgIH0KKyAgICAgICAgci5pbWFnID0gYXRhbjIoei5pbWFnLCBmYWJzKHoucmVhbCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHMxLnJlYWwgPSAxLit6LmltYWc7CisgICAgICAgIHMxLmltYWcgPSAtei5yZWFsOworICAgICAgICBzMSA9IGNfc3FydChzMSk7CisgICAgICAgIHMyLnJlYWwgPSAxLi16LmltYWc7CisgICAgICAgIHMyLmltYWcgPSB6LnJlYWw7CisgICAgICAgIHMyID0gY19zcXJ0KHMyKTsKKyAgICAgICAgci5yZWFsID0gbV9hc2luaChzMS5yZWFsKnMyLmltYWctczIucmVhbCpzMS5pbWFnKTsKKyAgICAgICAgci5pbWFnID0gYXRhbjIoei5pbWFnLCBzMS5yZWFsKnMyLnJlYWwtczEuaW1hZypzMi5pbWFnKTsKKyAgICB9CisgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19hc2luaF9kb2MsCkBAIC0yNTUsMTQgKzI1NSwxNCBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfYXRhbihQeV9jb21wbGV4IHopCiB7Ci0JLyogYXRhbih6KSA9IC1pIGF0YW5oKGl6KSAqLwotCVB5X2NvbXBsZXggcywgcjsKLQlzLnJlYWwgPSAtei5pbWFnOwotCXMuaW1hZyA9IHoucmVhbDsKLQlzID0gY19hdGFuaChzKTsKLQlyLnJlYWwgPSBzLmltYWc7Ci0Jci5pbWFnID0gLXMucmVhbDsKLQlyZXR1cm4gcjsKKyAgICAvKiBhdGFuKHopID0gLWkgYXRhbmgoaXopICovCisgICAgUHlfY29tcGxleCBzLCByOworICAgIHMucmVhbCA9IC16LmltYWc7CisgICAgcy5pbWFnID0gei5yZWFsOworICAgIHMgPSBjX2F0YW5oKHMpOworICAgIHIucmVhbCA9IHMuaW1hZzsKKyAgICByLmltYWcgPSAtcy5yZWFsOworICAgIHJldHVybiByOwogfQogCiAvKiBXaW5kb3dzIHNjcmV3cyB1cCBhdGFuMiBmb3IgaW5mIGFuZCBuYW4sIGFuZCBhbHBoYSBUcnU2NCA1LjEgZG9lc24ndCBmb2xsb3cKQEAgLTI3MCwyOSArMjcwLDI5IEBACiBzdGF0aWMgZG91YmxlCiBjX2F0YW4yKFB5X2NvbXBsZXggeikKIHsKLQlpZiAoUHlfSVNfTkFOKHoucmVhbCkgfHwgUHlfSVNfTkFOKHouaW1hZykpCi0JCXJldHVybiBQeV9OQU47Ci0JaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykpIHsKLQkJaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkpIHsKLQkJCWlmIChjb3B5c2lnbigxLiwgei5yZWFsKSA9PSAxLikKLQkJCQkvKiBhdGFuMigrLWluZiwgK2luZikgPT0gKy1waS80ICovCi0JCQkJcmV0dXJuIGNvcHlzaWduKDAuMjUqUHlfTUFUSF9QSSwgei5pbWFnKTsKLQkJCWVsc2UKLQkJCQkvKiBhdGFuMigrLWluZiwgLWluZikgPT0gKy1waSozLzQgKi8KLQkJCQlyZXR1cm4gY29weXNpZ24oMC43NSpQeV9NQVRIX1BJLCB6LmltYWcpOwotCQl9Ci0JCS8qIGF0YW4yKCstaW5mLCB4KSA9PSArLXBpLzIgZm9yIGZpbml0ZSB4ICovCi0JCXJldHVybiBjb3B5c2lnbigwLjUqUHlfTUFUSF9QSSwgei5pbWFnKTsKLQl9Ci0JaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkgfHwgei5pbWFnID09IDAuKSB7Ci0JCWlmIChjb3B5c2lnbigxLiwgei5yZWFsKSA9PSAxLikKLQkJCS8qIGF0YW4yKCsteSwgK2luZikgPSBhdGFuMigrLTAsICt4KSA9ICstMC4gKi8KLQkJCXJldHVybiBjb3B5c2lnbigwLiwgei5pbWFnKTsKLQkJZWxzZQotCQkJLyogYXRhbjIoKy15LCAtaW5mKSA9IGF0YW4yKCstMC4sIC14KSA9ICstcGkuICovCi0JCQlyZXR1cm4gY29weXNpZ24oUHlfTUFUSF9QSSwgei5pbWFnKTsKLQl9Ci0JcmV0dXJuIGF0YW4yKHouaW1hZywgei5yZWFsKTsKKyAgICBpZiAoUHlfSVNfTkFOKHoucmVhbCkgfHwgUHlfSVNfTkFOKHouaW1hZykpCisgICAgICAgIHJldHVybiBQeV9OQU47CisgICAgaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykpIHsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkpIHsKKyAgICAgICAgICAgIGlmIChjb3B5c2lnbigxLiwgei5yZWFsKSA9PSAxLikKKyAgICAgICAgICAgICAgICAvKiBhdGFuMigrLWluZiwgK2luZikgPT0gKy1waS80ICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlzaWduKDAuMjUqUHlfTUFUSF9QSSwgei5pbWFnKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvKiBhdGFuMigrLWluZiwgLWluZikgPT0gKy1waSozLzQgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oMC43NSpQeV9NQVRIX1BJLCB6LmltYWcpOworICAgICAgICB9CisgICAgICAgIC8qIGF0YW4yKCstaW5mLCB4KSA9PSArLXBpLzIgZm9yIGZpbml0ZSB4ICovCisgICAgICAgIHJldHVybiBjb3B5c2lnbigwLjUqUHlfTUFUSF9QSSwgei5pbWFnKTsKKyAgICB9CisgICAgaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkgfHwgei5pbWFnID09IDAuKSB7CisgICAgICAgIGlmIChjb3B5c2lnbigxLiwgei5yZWFsKSA9PSAxLikKKyAgICAgICAgICAgIC8qIGF0YW4yKCsteSwgK2luZikgPSBhdGFuMigrLTAsICt4KSA9ICstMC4gKi8KKyAgICAgICAgICAgIHJldHVybiBjb3B5c2lnbigwLiwgei5pbWFnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogYXRhbjIoKy15LCAtaW5mKSA9IGF0YW4yKCstMC4sIC14KSA9ICstcGkuICovCisgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oUHlfTUFUSF9QSSwgei5pbWFnKTsKKyAgICB9CisgICAgcmV0dXJuIGF0YW4yKHouaW1hZywgei5yZWFsKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNfYXRhbl9kb2MsCkBAIC0zMDYsNDggKzMwNiw0OCBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfYXRhbmgoUHlfY29tcGxleCB6KQogewotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgYXksIGg7CisgICAgUHlfY29tcGxleCByOworICAgIGRvdWJsZSBheSwgaDsKIAotCVNQRUNJQUxfVkFMVUUoeiwgYXRhbmhfc3BlY2lhbF92YWx1ZXMpOworICAgIFNQRUNJQUxfVkFMVUUoeiwgYXRhbmhfc3BlY2lhbF92YWx1ZXMpOwogCi0JLyogUmVkdWNlIHRvIGNhc2Ugd2hlcmUgei5yZWFsID49IDAuLCB1c2luZyBhdGFuaCh6KSA9IC1hdGFuaCgteikuICovCi0JaWYgKHoucmVhbCA8IDAuKSB7Ci0JCXJldHVybiBjX25lZyhjX2F0YW5oKGNfbmVnKHopKSk7Ci0JfQorICAgIC8qIFJlZHVjZSB0byBjYXNlIHdoZXJlIHoucmVhbCA+PSAwLiwgdXNpbmcgYXRhbmgoeikgPSAtYXRhbmgoLXopLiAqLworICAgIGlmICh6LnJlYWwgPCAwLikgeworICAgICAgICByZXR1cm4gY19uZWcoY19hdGFuaChjX25lZyh6KSkpOworICAgIH0KIAotCWF5ID0gZmFicyh6LmltYWcpOwotCWlmICh6LnJlYWwgPiBDTV9TUVJUX0xBUkdFX0RPVUJMRSB8fCBheSA+IENNX1NRUlRfTEFSR0VfRE9VQkxFKSB7Ci0JCS8qCi0JCSAgIGlmIGFicyh6KSBpcyBsYXJnZSB0aGVuIHdlIHVzZSB0aGUgYXBwcm94aW1hdGlvbgotCQkgICBhdGFuaCh6KSB+IDEveiArLy0gaSpwaS8yICgrLy0gZGVwZW5kaW5nIG9uIHRoZSBzaWduCi0JCSAgIG9mIHouaW1hZykKLQkJKi8KLQkJaCA9IGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKTsgIC8qIHNhZmUgZnJvbSBvdmVyZmxvdyAqLwotCQlyLnJlYWwgPSB6LnJlYWwvNC4vaC9oOwotCQkvKiB0aGUgdHdvIG5lZ2F0aW9ucyBpbiB0aGUgbmV4dCBsaW5lIGNhbmNlbCBlYWNoIG90aGVyIG91dAotCQkgICBleGNlcHQgd2hlbiB3b3JraW5nIHdpdGggdW5zaWduZWQgemVyb3M6IHRoZXkncmUgdGhlcmUgdG8KLQkJICAgZW5zdXJlIHRoYXQgdGhlIGJyYW5jaCBjdXQgaGFzIHRoZSBjb3JyZWN0IGNvbnRpbnVpdHkgb24KLQkJICAgc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgc2lnbmVkIHplcm9zICovCi0JCXIuaW1hZyA9IC1jb3B5c2lnbihQeV9NQVRIX1BJLzIuLCAtei5pbWFnKTsKLQkJZXJybm8gPSAwOwotCX0gZWxzZSBpZiAoei5yZWFsID09IDEuICYmIGF5IDwgQ01fU1FSVF9EQkxfTUlOKSB7Ci0JCS8qIEM5OSBzdGFuZGFyZCBzYXlzOiAgYXRhbmgoMSsvLTAuKSBzaG91bGQgYmUgaW5mICsvLSAwaSAqLwotCQlpZiAoYXkgPT0gMC4pIHsKLQkJCXIucmVhbCA9IElORjsKLQkJCXIuaW1hZyA9IHouaW1hZzsKLQkJCWVycm5vID0gRURPTTsKLQkJfSBlbHNlIHsKLQkJCXIucmVhbCA9IC1sb2coc3FydChheSkvc3FydChoeXBvdChheSwgMi4pKSk7Ci0JCQlyLmltYWcgPSBjb3B5c2lnbihhdGFuMigyLiwgLWF5KS8yLCB6LmltYWcpOwotCQkJZXJybm8gPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJci5yZWFsID0gbV9sb2cxcCg0Lip6LnJlYWwvKCgxLXoucmVhbCkqKDEtei5yZWFsKSArIGF5KmF5KSkvNC47Ci0JCXIuaW1hZyA9IC1hdGFuMigtMi4qei5pbWFnLCAoMS16LnJlYWwpKigxK3oucmVhbCkgLSBheSpheSkvMi47Ci0JCWVycm5vID0gMDsKLQl9Ci0JcmV0dXJuIHI7CisgICAgYXkgPSBmYWJzKHouaW1hZyk7CisgICAgaWYgKHoucmVhbCA+IENNX1NRUlRfTEFSR0VfRE9VQkxFIHx8IGF5ID4gQ01fU1FSVF9MQVJHRV9ET1VCTEUpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgaWYgYWJzKHopIGlzIGxhcmdlIHRoZW4gd2UgdXNlIHRoZSBhcHByb3hpbWF0aW9uCisgICAgICAgICAgIGF0YW5oKHopIH4gMS96ICsvLSBpKnBpLzIgKCsvLSBkZXBlbmRpbmcgb24gdGhlIHNpZ24KKyAgICAgICAgICAgb2Ygei5pbWFnKQorICAgICAgICAqLworICAgICAgICBoID0gaHlwb3Qoei5yZWFsLzIuLCB6LmltYWcvMi4pOyAgLyogc2FmZSBmcm9tIG92ZXJmbG93ICovCisgICAgICAgIHIucmVhbCA9IHoucmVhbC80Li9oL2g7CisgICAgICAgIC8qIHRoZSB0d28gbmVnYXRpb25zIGluIHRoZSBuZXh0IGxpbmUgY2FuY2VsIGVhY2ggb3RoZXIgb3V0CisgICAgICAgICAgIGV4Y2VwdCB3aGVuIHdvcmtpbmcgd2l0aCB1bnNpZ25lZCB6ZXJvczogdGhleSdyZSB0aGVyZSB0bworICAgICAgICAgICBlbnN1cmUgdGhhdCB0aGUgYnJhbmNoIGN1dCBoYXMgdGhlIGNvcnJlY3QgY29udGludWl0eSBvbgorICAgICAgICAgICBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBzaWduZWQgemVyb3MgKi8KKyAgICAgICAgci5pbWFnID0gLWNvcHlzaWduKFB5X01BVEhfUEkvMi4sIC16LmltYWcpOworICAgICAgICBlcnJubyA9IDA7CisgICAgfSBlbHNlIGlmICh6LnJlYWwgPT0gMS4gJiYgYXkgPCBDTV9TUVJUX0RCTF9NSU4pIHsKKyAgICAgICAgLyogQzk5IHN0YW5kYXJkIHNheXM6ICBhdGFuaCgxKy8tMC4pIHNob3VsZCBiZSBpbmYgKy8tIDBpICovCisgICAgICAgIGlmIChheSA9PSAwLikgeworICAgICAgICAgICAgci5yZWFsID0gSU5GOworICAgICAgICAgICAgci5pbWFnID0gei5pbWFnOworICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgci5yZWFsID0gLWxvZyhzcXJ0KGF5KS9zcXJ0KGh5cG90KGF5LCAyLikpKTsKKyAgICAgICAgICAgIHIuaW1hZyA9IGNvcHlzaWduKGF0YW4yKDIuLCAtYXkpLzIsIHouaW1hZyk7CisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByLnJlYWwgPSBtX2xvZzFwKDQuKnoucmVhbC8oKDEtei5yZWFsKSooMS16LnJlYWwpICsgYXkqYXkpKS80LjsKKyAgICAgICAgci5pbWFnID0gLWF0YW4yKC0yLip6LmltYWcsICgxLXoucmVhbCkqKDErei5yZWFsKSAtIGF5KmF5KS8yLjsKKyAgICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfYXRhbmhfZG9jLApAQCAtMzU5LDEyICszNTksMTIgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2NvcyhQeV9jb21wbGV4IHopCiB7Ci0JLyogY29zKHopID0gY29zaChpeikgKi8KLQlQeV9jb21wbGV4IHI7Ci0Jci5yZWFsID0gLXouaW1hZzsKLQlyLmltYWcgPSB6LnJlYWw7Ci0JciA9IGNfY29zaChyKTsKLQlyZXR1cm4gcjsKKyAgICAvKiBjb3MoeikgPSBjb3NoKGl6KSAqLworICAgIFB5X2NvbXBsZXggcjsKKyAgICByLnJlYWwgPSAtei5pbWFnOworICAgIHIuaW1hZyA9IHoucmVhbDsKKyAgICByID0gY19jb3NoKHIpOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19jb3NfZG9jLApAQCAtMzc5LDUxICszNzksNTEgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2Nvc2goUHlfY29tcGxleCB6KQogewotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgeF9taW51c19vbmU7CisgICAgUHlfY29tcGxleCByOworICAgIGRvdWJsZSB4X21pbnVzX29uZTsKIAotCS8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciBjb3NoKCsvLWluZiArIGl5KSBpZiB5IGlzIG5vdCBhIE5hTiAqLwotCWlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7Ci0JCWlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIFB5X0lTX0ZJTklURSh6LmltYWcpICYmCi0JCSAgICAoei5pbWFnICE9IDAuKSkgewotCQkJaWYgKHoucmVhbCA+IDApIHsKLQkJCQlyLnJlYWwgPSBjb3B5c2lnbihJTkYsIGNvcyh6LmltYWcpKTsKLQkJCQlyLmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXIucmVhbCA9IGNvcHlzaWduKElORiwgY29zKHouaW1hZykpOwotCQkJCXIuaW1hZyA9IC1jb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXIgPSBjb3NoX3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZSh6LnJlYWwpXQotCQkJCSAgICAgICAgICAgICAgIFtzcGVjaWFsX3R5cGUoei5pbWFnKV07Ci0JCX0KLQkJLyogbmVlZCB0byBzZXQgZXJybm8gPSBFRE9NIGlmIHkgaXMgKy8tIGluZmluaXR5IGFuZCB4IGlzIG5vdAotCQkgICBhIE5hTiAqLwotCQlpZiAoUHlfSVNfSU5GSU5JVFkoei5pbWFnKSAmJiAhUHlfSVNfTkFOKHoucmVhbCkpCi0JCQllcnJubyA9IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQkJcmV0dXJuIHI7Ci0JfQorICAgIC8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciBjb3NoKCsvLWluZiArIGl5KSBpZiB5IGlzIG5vdCBhIE5hTiAqLworICAgIGlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7CisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIFB5X0lTX0ZJTklURSh6LmltYWcpICYmCisgICAgICAgICAgICAoei5pbWFnICE9IDAuKSkgeworICAgICAgICAgICAgaWYgKHoucmVhbCA+IDApIHsKKyAgICAgICAgICAgICAgICByLnJlYWwgPSBjb3B5c2lnbihJTkYsIGNvcyh6LmltYWcpKTsKKyAgICAgICAgICAgICAgICByLmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHIucmVhbCA9IGNvcHlzaWduKElORiwgY29zKHouaW1hZykpOworICAgICAgICAgICAgICAgIHIuaW1hZyA9IC1jb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHIgPSBjb3NoX3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZSh6LnJlYWwpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3BlY2lhbF90eXBlKHouaW1hZyldOworICAgICAgICB9CisgICAgICAgIC8qIG5lZWQgdG8gc2V0IGVycm5vID0gRURPTSBpZiB5IGlzICsvLSBpbmZpbml0eSBhbmQgeCBpcyBub3QKKyAgICAgICAgICAgYSBOYU4gKi8KKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykgJiYgIVB5X0lTX05BTih6LnJlYWwpKQorICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIHJldHVybiByOworICAgIH0KIAotCWlmIChmYWJzKHoucmVhbCkgPiBDTV9MT0dfTEFSR0VfRE9VQkxFKSB7Ci0JCS8qIGRlYWwgY29ycmVjdGx5IHdpdGggY2FzZXMgd2hlcmUgY29zaCh6LnJlYWwpIG92ZXJmbG93cyBidXQKLQkJICAgY29zaCh6KSBkb2VzIG5vdC4gKi8KLQkJeF9taW51c19vbmUgPSB6LnJlYWwgLSBjb3B5c2lnbigxLiwgei5yZWFsKTsKLQkJci5yZWFsID0gY29zKHouaW1hZykgKiBjb3NoKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKLQkJci5pbWFnID0gc2luKHouaW1hZykgKiBzaW5oKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKLQl9IGVsc2UgewotCQlyLnJlYWwgPSBjb3Moei5pbWFnKSAqIGNvc2goei5yZWFsKTsKLQkJci5pbWFnID0gc2luKHouaW1hZykgKiBzaW5oKHoucmVhbCk7Ci0JfQotCS8qIGRldGVjdCBvdmVyZmxvdywgYW5kIHNldCBlcnJubyBhY2NvcmRpbmdseSAqLwotCWlmIChQeV9JU19JTkZJTklUWShyLnJlYWwpIHx8IFB5X0lTX0lORklOSVRZKHIuaW1hZykpCi0JCWVycm5vID0gRVJBTkdFOwotCWVsc2UKLQkJZXJybm8gPSAwOwotCXJldHVybiByOworICAgIGlmIChmYWJzKHoucmVhbCkgPiBDTV9MT0dfTEFSR0VfRE9VQkxFKSB7CisgICAgICAgIC8qIGRlYWwgY29ycmVjdGx5IHdpdGggY2FzZXMgd2hlcmUgY29zaCh6LnJlYWwpIG92ZXJmbG93cyBidXQKKyAgICAgICAgICAgY29zaCh6KSBkb2VzIG5vdC4gKi8KKyAgICAgICAgeF9taW51c19vbmUgPSB6LnJlYWwgLSBjb3B5c2lnbigxLiwgei5yZWFsKTsKKyAgICAgICAgci5yZWFsID0gY29zKHouaW1hZykgKiBjb3NoKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKKyAgICAgICAgci5pbWFnID0gc2luKHouaW1hZykgKiBzaW5oKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKKyAgICB9IGVsc2UgeworICAgICAgICByLnJlYWwgPSBjb3Moei5pbWFnKSAqIGNvc2goei5yZWFsKTsKKyAgICAgICAgci5pbWFnID0gc2luKHouaW1hZykgKiBzaW5oKHoucmVhbCk7CisgICAgfQorICAgIC8qIGRldGVjdCBvdmVyZmxvdywgYW5kIHNldCBlcnJubyBhY2NvcmRpbmdseSAqLworICAgIGlmIChQeV9JU19JTkZJTklUWShyLnJlYWwpIHx8IFB5X0lTX0lORklOSVRZKHIuaW1hZykpCisgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgIGVsc2UKKyAgICAgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19jb3NoX2RvYywKQEAgLTQzOSw1MSArNDM5LDUxIEBACiBzdGF0aWMgUHlfY29tcGxleAogY19leHAoUHlfY29tcGxleCB6KQogewotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgbDsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgZG91YmxlIGw7CiAKLQlpZiAoIVB5X0lTX0ZJTklURSh6LnJlYWwpIHx8ICFQeV9JU19GSU5JVEUoei5pbWFnKSkgewotCQlpZiAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSAmJiBQeV9JU19GSU5JVEUoei5pbWFnKQotCQkgICAgJiYgKHouaW1hZyAhPSAwLikpIHsKLQkJCWlmICh6LnJlYWwgPiAwKSB7Ci0JCQkJci5yZWFsID0gY29weXNpZ24oSU5GLCBjb3Moei5pbWFnKSk7Ci0JCQkJci5pbWFnID0gY29weXNpZ24oSU5GLCBzaW4oei5pbWFnKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyLnJlYWwgPSBjb3B5c2lnbigwLiwgY29zKHouaW1hZykpOwotCQkJCXIuaW1hZyA9IGNvcHlzaWduKDAuLCBzaW4oei5pbWFnKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyID0gZXhwX3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZSh6LnJlYWwpXQotCQkJCSAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZSh6LmltYWcpXTsKLQkJfQotCQkvKiBuZWVkIHRvIHNldCBlcnJubyA9IEVET00gaWYgeSBpcyArLy0gaW5maW5pdHkgYW5kIHggaXMgbm90Ci0JCSAgIGEgTmFOIGFuZCBub3QgLWluZmluaXR5ICovCi0JCWlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpICYmCi0JCSAgICAoUHlfSVNfRklOSVRFKHoucmVhbCkgfHwKLQkJICAgICAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSAmJiB6LnJlYWwgPiAwKSkpCi0JCQllcnJubyA9IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQkJcmV0dXJuIHI7Ci0JfQorICAgIGlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7CisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIFB5X0lTX0ZJTklURSh6LmltYWcpCisgICAgICAgICAgICAmJiAoei5pbWFnICE9IDAuKSkgeworICAgICAgICAgICAgaWYgKHoucmVhbCA+IDApIHsKKyAgICAgICAgICAgICAgICByLnJlYWwgPSBjb3B5c2lnbihJTkYsIGNvcyh6LmltYWcpKTsKKyAgICAgICAgICAgICAgICByLmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHIucmVhbCA9IGNvcHlzaWduKDAuLCBjb3Moei5pbWFnKSk7CisgICAgICAgICAgICAgICAgci5pbWFnID0gY29weXNpZ24oMC4sIHNpbih6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHIgPSBleHBfc3BlY2lhbF92YWx1ZXNbc3BlY2lhbF90eXBlKHoucmVhbCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZSh6LmltYWcpXTsKKyAgICAgICAgfQorICAgICAgICAvKiBuZWVkIHRvIHNldCBlcnJubyA9IEVET00gaWYgeSBpcyArLy0gaW5maW5pdHkgYW5kIHggaXMgbm90CisgICAgICAgICAgIGEgTmFOIGFuZCBub3QgLWluZmluaXR5ICovCisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpICYmCisgICAgICAgICAgICAoUHlfSVNfRklOSVRFKHoucmVhbCkgfHwKKyAgICAgICAgICAgICAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSAmJiB6LnJlYWwgPiAwKSkpCisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQogCi0JaWYgKHoucmVhbCA+IENNX0xPR19MQVJHRV9ET1VCTEUpIHsKLQkJbCA9IGV4cCh6LnJlYWwtMS4pOwotCQlyLnJlYWwgPSBsKmNvcyh6LmltYWcpKlB5X01BVEhfRTsKLQkJci5pbWFnID0gbCpzaW4oei5pbWFnKSpQeV9NQVRIX0U7Ci0JfSBlbHNlIHsKLQkJbCA9IGV4cCh6LnJlYWwpOwotCQlyLnJlYWwgPSBsKmNvcyh6LmltYWcpOwotCQlyLmltYWcgPSBsKnNpbih6LmltYWcpOwotCX0KLQkvKiBkZXRlY3Qgb3ZlcmZsb3csIGFuZCBzZXQgZXJybm8gYWNjb3JkaW5nbHkgKi8KLQlpZiAoUHlfSVNfSU5GSU5JVFkoci5yZWFsKSB8fCBQeV9JU19JTkZJTklUWShyLmltYWcpKQotCQllcnJubyA9IEVSQU5HRTsKLQllbHNlCi0JCWVycm5vID0gMDsKLQlyZXR1cm4gcjsKKyAgICBpZiAoei5yZWFsID4gQ01fTE9HX0xBUkdFX0RPVUJMRSkgeworICAgICAgICBsID0gZXhwKHoucmVhbC0xLik7CisgICAgICAgIHIucmVhbCA9IGwqY29zKHouaW1hZykqUHlfTUFUSF9FOworICAgICAgICByLmltYWcgPSBsKnNpbih6LmltYWcpKlB5X01BVEhfRTsKKyAgICB9IGVsc2UgeworICAgICAgICBsID0gZXhwKHoucmVhbCk7CisgICAgICAgIHIucmVhbCA9IGwqY29zKHouaW1hZyk7CisgICAgICAgIHIuaW1hZyA9IGwqc2luKHouaW1hZyk7CisgICAgfQorICAgIC8qIGRldGVjdCBvdmVyZmxvdywgYW5kIHNldCBlcnJubyBhY2NvcmRpbmdseSAqLworICAgIGlmIChQeV9JU19JTkZJTklUWShyLnJlYWwpIHx8IFB5X0lTX0lORklOSVRZKHIuaW1hZykpCisgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgIGVsc2UKKyAgICAgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19leHBfZG9jLApAQCAtNDk3LDg1ICs0OTcsODUgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2xvZyhQeV9jb21wbGV4IHopCiB7Ci0JLyoKLQkgICBUaGUgdXN1YWwgZm9ybXVsYSBmb3IgdGhlIHJlYWwgcGFydCBpcyBsb2coaHlwb3Qoei5yZWFsLCB6LmltYWcpKS4KLQkgICBUaGVyZSBhcmUgZm91ciBzaXR1YXRpb25zIHdoZXJlIHRoaXMgZm9ybXVsYSBpcyBwb3RlbnRpYWxseQotCSAgIHByb2JsZW1hdGljOgorICAgIC8qCisgICAgICAgVGhlIHVzdWFsIGZvcm11bGEgZm9yIHRoZSByZWFsIHBhcnQgaXMgbG9nKGh5cG90KHoucmVhbCwgei5pbWFnKSkuCisgICAgICAgVGhlcmUgYXJlIGZvdXIgc2l0dWF0aW9ucyB3aGVyZSB0aGlzIGZvcm11bGEgaXMgcG90ZW50aWFsbHkKKyAgICAgICBwcm9ibGVtYXRpYzoKIAotCSAgICgxKSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgeiBpcyBzdWJub3JtYWwuICBUaGVuIGh5cG90IGlzIHN1Ym5vcm1hbCwKLQkgICBzbyBoYXMgZmV3ZXIgdGhhbiB0aGUgdXN1YWwgbnVtYmVyIG9mIGJpdHMgb2YgYWNjdXJhY3ksIGhlbmNlIG1heQotCSAgIGhhdmUgbGFyZ2UgcmVsYXRpdmUgZXJyb3IuICBUaGlzIHRoZW4gZ2l2ZXMgYSBsYXJnZSBhYnNvbHV0ZSBlcnJvcgotCSAgIGluIHRoZSBsb2cuICBUaGlzIGNhbiBiZSBzb2x2ZWQgYnkgcmVzY2FsaW5nIHogYnkgYSBzdWl0YWJsZSBwb3dlcgotCSAgIG9mIDIuCisgICAgICAgKDEpIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB6IGlzIHN1Ym5vcm1hbC4gIFRoZW4gaHlwb3QgaXMgc3Vibm9ybWFsLAorICAgICAgIHNvIGhhcyBmZXdlciB0aGFuIHRoZSB1c3VhbCBudW1iZXIgb2YgYml0cyBvZiBhY2N1cmFjeSwgaGVuY2UgbWF5CisgICAgICAgaGF2ZSBsYXJnZSByZWxhdGl2ZSBlcnJvci4gIFRoaXMgdGhlbiBnaXZlcyBhIGxhcmdlIGFic29sdXRlIGVycm9yCisgICAgICAgaW4gdGhlIGxvZy4gIFRoaXMgY2FuIGJlIHNvbHZlZCBieSByZXNjYWxpbmcgeiBieSBhIHN1aXRhYmxlIHBvd2VyCisgICAgICAgb2YgMi4KIAotCSAgICgyKSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgeiBpcyBncmVhdGVyIHRoYW4gREJMX01BWCAoZS5nLiB3aGVuIGJvdGgKLQkgICB6LnJlYWwgYW5kIHouaW1hZyBhcmUgd2l0aGluIGEgZmFjdG9yIG9mIDEvc3FydCgyKSBvZiBEQkxfTUFYKQotCSAgIEFnYWluLCByZXNjYWxpbmcgc29sdmVzIHRoaXMuCisgICAgICAgKDIpIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB6IGlzIGdyZWF0ZXIgdGhhbiBEQkxfTUFYIChlLmcuIHdoZW4gYm90aAorICAgICAgIHoucmVhbCBhbmQgei5pbWFnIGFyZSB3aXRoaW4gYSBmYWN0b3Igb2YgMS9zcXJ0KDIpIG9mIERCTF9NQVgpCisgICAgICAgQWdhaW4sIHJlc2NhbGluZyBzb2x2ZXMgdGhpcy4KIAotCSAgICgzKSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgeiBpcyBjbG9zZSB0byAxLiAgSW4gdGhpcyBjYXNlIGl0J3MKLQkgICBkaWZmaWN1bHQgdG8gYWNoaWV2ZSBnb29kIGFjY3VyYWN5LCBhdCBsZWFzdCBpbiBwYXJ0IGJlY2F1c2UgYQotCSAgIGNoYW5nZSBvZiAxdWxwIGluIHRoZSByZWFsIG9yIGltYWdpbmFyeSBwYXJ0IG9mIHogY2FuIHJlc3VsdCBpbiBhCi0JICAgY2hhbmdlIG9mIGJpbGxpb25zIG9mIHVscHMgaW4gdGhlIGNvcnJlY3RseSByb3VuZGVkIGFuc3dlci4KKyAgICAgICAoMykgdGhlIGFic29sdXRlIHZhbHVlIG9mIHogaXMgY2xvc2UgdG8gMS4gIEluIHRoaXMgY2FzZSBpdCdzCisgICAgICAgZGlmZmljdWx0IHRvIGFjaGlldmUgZ29vZCBhY2N1cmFjeSwgYXQgbGVhc3QgaW4gcGFydCBiZWNhdXNlIGEKKyAgICAgICBjaGFuZ2Ugb2YgMXVscCBpbiB0aGUgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBvZiB6IGNhbiByZXN1bHQgaW4gYQorICAgICAgIGNoYW5nZSBvZiBiaWxsaW9ucyBvZiB1bHBzIGluIHRoZSBjb3JyZWN0bHkgcm91bmRlZCBhbnN3ZXIuCiAKLQkgICAoNCkgeiA9IDAuICBUaGUgc2ltcGxlc3QgdGhpbmcgdG8gZG8gaGVyZSBpcyB0byBjYWxsIHRoZQotCSAgIGZsb2F0aW5nLXBvaW50IGxvZyB3aXRoIGFuIGFyZ3VtZW50IG9mIDAsIGFuZCBsZXQgaXRzIGJlaGF2aW91cgotCSAgIChyZXR1cm5pbmcgLWluZmluaXR5LCBzaWduYWxpbmcgYSBmbG9hdGluZy1wb2ludCBleGNlcHRpb24sIHNldHRpbmcKLQkgICBlcnJubywgb3Igd2hhdGV2ZXIpIGRldGVybWluZSB0aGF0IG9mIGNfbG9nLiAgU28gdGhlIHVzdWFsIGZvcm11bGEKLQkgICBpcyBmaW5lIGhlcmUuCisgICAgICAgKDQpIHogPSAwLiAgVGhlIHNpbXBsZXN0IHRoaW5nIHRvIGRvIGhlcmUgaXMgdG8gY2FsbCB0aGUKKyAgICAgICBmbG9hdGluZy1wb2ludCBsb2cgd2l0aCBhbiBhcmd1bWVudCBvZiAwLCBhbmQgbGV0IGl0cyBiZWhhdmlvdXIKKyAgICAgICAocmV0dXJuaW5nIC1pbmZpbml0eSwgc2lnbmFsaW5nIGEgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uLCBzZXR0aW5nCisgICAgICAgZXJybm8sIG9yIHdoYXRldmVyKSBkZXRlcm1pbmUgdGhhdCBvZiBjX2xvZy4gIFNvIHRoZSB1c3VhbCBmb3JtdWxhCisgICAgICAgaXMgZmluZSBoZXJlLgogCi0JICovCisgICAgICovCiAKLQlQeV9jb21wbGV4IHI7Ci0JZG91YmxlIGF4LCBheSwgYW0sIGFuLCBoOworICAgIFB5X2NvbXBsZXggcjsKKyAgICBkb3VibGUgYXgsIGF5LCBhbSwgYW4sIGg7CiAKLQlTUEVDSUFMX1ZBTFVFKHosIGxvZ19zcGVjaWFsX3ZhbHVlcyk7CisgICAgU1BFQ0lBTF9WQUxVRSh6LCBsb2dfc3BlY2lhbF92YWx1ZXMpOwogCi0JYXggPSBmYWJzKHoucmVhbCk7Ci0JYXkgPSBmYWJzKHouaW1hZyk7CisgICAgYXggPSBmYWJzKHoucmVhbCk7CisgICAgYXkgPSBmYWJzKHouaW1hZyk7CiAKLQlpZiAoYXggPiBDTV9MQVJHRV9ET1VCTEUgfHwgYXkgPiBDTV9MQVJHRV9ET1VCTEUpIHsKLQkJci5yZWFsID0gbG9nKGh5cG90KGF4LzIuLCBheS8yLikpICsgTV9MTjI7Ci0JfSBlbHNlIGlmIChheCA8IERCTF9NSU4gJiYgYXkgPCBEQkxfTUlOKSB7Ci0JCWlmIChheCA+IDAuIHx8IGF5ID4gMC4pIHsKLQkJCS8qIGNhdGNoIGNhc2VzIHdoZXJlIGh5cG90KGF4LCBheSkgaXMgc3Vibm9ybWFsICovCi0JCQlyLnJlYWwgPSBsb2coaHlwb3QobGRleHAoYXgsIERCTF9NQU5UX0RJRyksCi0JCQkJIGxkZXhwKGF5LCBEQkxfTUFOVF9ESUcpKSkgLSBEQkxfTUFOVF9ESUcqTV9MTjI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBsb2coKy8tMC4gKy8tIDBpKSAqLwotCQkJci5yZWFsID0gLUlORjsKLQkJCXIuaW1hZyA9IGF0YW4yKHouaW1hZywgei5yZWFsKTsKLQkJCWVycm5vID0gRURPTTsKLQkJCXJldHVybiByOwotCQl9Ci0JfSBlbHNlIHsKLQkJaCA9IGh5cG90KGF4LCBheSk7Ci0JCWlmICgwLjcxIDw9IGggJiYgaCA8PSAxLjczKSB7Ci0JCQlhbSA9IGF4ID4gYXkgPyBheCA6IGF5OyAgLyogbWF4KGF4LCBheSkgKi8KLQkJCWFuID0gYXggPiBheSA/IGF5IDogYXg7ICAvKiBtaW4oYXgsIGF5KSAqLwotCQkJci5yZWFsID0gbV9sb2cxcCgoYW0tMSkqKGFtKzEpK2FuKmFuKS8yLjsKLQkJfSBlbHNlIHsKLQkJCXIucmVhbCA9IGxvZyhoKTsKLQkJfQotCX0KLQlyLmltYWcgPSBhdGFuMih6LmltYWcsIHoucmVhbCk7Ci0JZXJybm8gPSAwOwotCXJldHVybiByOworICAgIGlmIChheCA+IENNX0xBUkdFX0RPVUJMRSB8fCBheSA+IENNX0xBUkdFX0RPVUJMRSkgeworICAgICAgICByLnJlYWwgPSBsb2coaHlwb3QoYXgvMi4sIGF5LzIuKSkgKyBNX0xOMjsKKyAgICB9IGVsc2UgaWYgKGF4IDwgREJMX01JTiAmJiBheSA8IERCTF9NSU4pIHsKKyAgICAgICAgaWYgKGF4ID4gMC4gfHwgYXkgPiAwLikgeworICAgICAgICAgICAgLyogY2F0Y2ggY2FzZXMgd2hlcmUgaHlwb3QoYXgsIGF5KSBpcyBzdWJub3JtYWwgKi8KKyAgICAgICAgICAgIHIucmVhbCA9IGxvZyhoeXBvdChsZGV4cChheCwgREJMX01BTlRfRElHKSwKKyAgICAgICAgICAgICAgICAgICAgIGxkZXhwKGF5LCBEQkxfTUFOVF9ESUcpKSkgLSBEQkxfTUFOVF9ESUcqTV9MTjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBsb2coKy8tMC4gKy8tIDBpKSAqLworICAgICAgICAgICAgci5yZWFsID0gLUlORjsKKyAgICAgICAgICAgIHIuaW1hZyA9IGF0YW4yKHouaW1hZywgei5yZWFsKTsKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaCA9IGh5cG90KGF4LCBheSk7CisgICAgICAgIGlmICgwLjcxIDw9IGggJiYgaCA8PSAxLjczKSB7CisgICAgICAgICAgICBhbSA9IGF4ID4gYXkgPyBheCA6IGF5OyAgLyogbWF4KGF4LCBheSkgKi8KKyAgICAgICAgICAgIGFuID0gYXggPiBheSA/IGF5IDogYXg7ICAvKiBtaW4oYXgsIGF5KSAqLworICAgICAgICAgICAgci5yZWFsID0gbV9sb2cxcCgoYW0tMSkqKGFtKzEpK2FuKmFuKS8yLjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHIucmVhbCA9IGxvZyhoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByLmltYWcgPSBhdGFuMih6LmltYWcsIHoucmVhbCk7CisgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2xvZzEwKFB5X2NvbXBsZXggeikKIHsKLQlQeV9jb21wbGV4IHI7Ci0JaW50IGVycm5vX3NhdmU7CisgICAgUHlfY29tcGxleCByOworICAgIGludCBlcnJub19zYXZlOwogCi0JciA9IGNfbG9nKHopOwotCWVycm5vX3NhdmUgPSBlcnJubzsgLyoganVzdCBpbiBjYXNlIHRoZSBkaXZpc2lvbnMgYWZmZWN0IGVycm5vICovCi0Jci5yZWFsID0gci5yZWFsIC8gTV9MTjEwOwotCXIuaW1hZyA9IHIuaW1hZyAvIE1fTE4xMDsKLQllcnJubyA9IGVycm5vX3NhdmU7Ci0JcmV0dXJuIHI7CisgICAgciA9IGNfbG9nKHopOworICAgIGVycm5vX3NhdmUgPSBlcnJubzsgLyoganVzdCBpbiBjYXNlIHRoZSBkaXZpc2lvbnMgYWZmZWN0IGVycm5vICovCisgICAgci5yZWFsID0gci5yZWFsIC8gTV9MTjEwOworICAgIHIuaW1hZyA9IHIuaW1hZyAvIE1fTE4xMDsKKyAgICBlcnJubyA9IGVycm5vX3NhdmU7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihjX2xvZzEwX2RvYywKQEAgLTU4NywxNCArNTg3LDE0IEBACiBzdGF0aWMgUHlfY29tcGxleAogY19zaW4oUHlfY29tcGxleCB6KQogewotCS8qIHNpbih6KSA9IC1pIHNpbihpeikgKi8KLQlQeV9jb21wbGV4IHMsIHI7Ci0Jcy5yZWFsID0gLXouaW1hZzsKLQlzLmltYWcgPSB6LnJlYWw7Ci0JcyA9IGNfc2luaChzKTsKLQlyLnJlYWwgPSBzLmltYWc7Ci0Jci5pbWFnID0gLXMucmVhbDsKLQlyZXR1cm4gcjsKKyAgICAvKiBzaW4oeikgPSAtaSBzaW4oaXopICovCisgICAgUHlfY29tcGxleCBzLCByOworICAgIHMucmVhbCA9IC16LmltYWc7CisgICAgcy5pbWFnID0gei5yZWFsOworICAgIHMgPSBjX3Npbmgocyk7CisgICAgci5yZWFsID0gcy5pbWFnOworICAgIHIuaW1hZyA9IC1zLnJlYWw7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihjX3Npbl9kb2MsCkBAIC02MDksNTAgKzYwOSw1MCBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfc2luaChQeV9jb21wbGV4IHopCiB7Ci0JUHlfY29tcGxleCByOwotCWRvdWJsZSB4X21pbnVzX29uZTsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgZG91YmxlIHhfbWludXNfb25lOwogCi0JLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHNpbmgoKy8taW5mICsgaXkpIGlmIHkgaXMgZmluaXRlIGFuZAotCSAgIG5vbnplcm8gKi8KLQlpZiAoIVB5X0lTX0ZJTklURSh6LnJlYWwpIHx8ICFQeV9JU19GSU5JVEUoei5pbWFnKSkgewotCQlpZiAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSAmJiBQeV9JU19GSU5JVEUoei5pbWFnKQotCQkgICAgJiYgKHouaW1hZyAhPSAwLikpIHsKLQkJCWlmICh6LnJlYWwgPiAwKSB7Ci0JCQkJci5yZWFsID0gY29weXNpZ24oSU5GLCBjb3Moei5pbWFnKSk7Ci0JCQkJci5pbWFnID0gY29weXNpZ24oSU5GLCBzaW4oei5pbWFnKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyLnJlYWwgPSAtY29weXNpZ24oSU5GLCBjb3Moei5pbWFnKSk7Ci0JCQkJci5pbWFnID0gY29weXNpZ24oSU5GLCBzaW4oei5pbWFnKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyID0gc2luaF9zcGVjaWFsX3ZhbHVlc1tzcGVjaWFsX3R5cGUoei5yZWFsKV0KLQkJCQkgICAgICAgICAgICAgICBbc3BlY2lhbF90eXBlKHouaW1hZyldOwotCQl9Ci0JCS8qIG5lZWQgdG8gc2V0IGVycm5vID0gRURPTSBpZiB5IGlzICsvLSBpbmZpbml0eSBhbmQgeCBpcyBub3QKLQkJICAgYSBOYU4gKi8KLQkJaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykgJiYgIVB5X0lTX05BTih6LnJlYWwpKQotCQkJZXJybm8gPSBFRE9NOwotCQllbHNlCi0JCQllcnJubyA9IDA7Ci0JCXJldHVybiByOwotCX0KKyAgICAvKiBzcGVjaWFsIHRyZWF0bWVudCBmb3Igc2luaCgrLy1pbmYgKyBpeSkgaWYgeSBpcyBmaW5pdGUgYW5kCisgICAgICAgbm9uemVybyAqLworICAgIGlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7CisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIFB5X0lTX0ZJTklURSh6LmltYWcpCisgICAgICAgICAgICAmJiAoei5pbWFnICE9IDAuKSkgeworICAgICAgICAgICAgaWYgKHoucmVhbCA+IDApIHsKKyAgICAgICAgICAgICAgICByLnJlYWwgPSBjb3B5c2lnbihJTkYsIGNvcyh6LmltYWcpKTsKKyAgICAgICAgICAgICAgICByLmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHIucmVhbCA9IC1jb3B5c2lnbihJTkYsIGNvcyh6LmltYWcpKTsKKyAgICAgICAgICAgICAgICByLmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHIgPSBzaW5oX3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZSh6LnJlYWwpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3BlY2lhbF90eXBlKHouaW1hZyldOworICAgICAgICB9CisgICAgICAgIC8qIG5lZWQgdG8gc2V0IGVycm5vID0gRURPTSBpZiB5IGlzICsvLSBpbmZpbml0eSBhbmQgeCBpcyBub3QKKyAgICAgICAgICAgYSBOYU4gKi8KKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykgJiYgIVB5X0lTX05BTih6LnJlYWwpKQorICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIHJldHVybiByOworICAgIH0KIAotCWlmIChmYWJzKHoucmVhbCkgPiBDTV9MT0dfTEFSR0VfRE9VQkxFKSB7Ci0JCXhfbWludXNfb25lID0gei5yZWFsIC0gY29weXNpZ24oMS4sIHoucmVhbCk7Ci0JCXIucmVhbCA9IGNvcyh6LmltYWcpICogc2luaCh4X21pbnVzX29uZSkgKiBQeV9NQVRIX0U7Ci0JCXIuaW1hZyA9IHNpbih6LmltYWcpICogY29zaCh4X21pbnVzX29uZSkgKiBQeV9NQVRIX0U7Ci0JfSBlbHNlIHsKLQkJci5yZWFsID0gY29zKHouaW1hZykgKiBzaW5oKHoucmVhbCk7Ci0JCXIuaW1hZyA9IHNpbih6LmltYWcpICogY29zaCh6LnJlYWwpOwotCX0KLQkvKiBkZXRlY3Qgb3ZlcmZsb3csIGFuZCBzZXQgZXJybm8gYWNjb3JkaW5nbHkgKi8KLQlpZiAoUHlfSVNfSU5GSU5JVFkoci5yZWFsKSB8fCBQeV9JU19JTkZJTklUWShyLmltYWcpKQotCQllcnJubyA9IEVSQU5HRTsKLQllbHNlCi0JCWVycm5vID0gMDsKLQlyZXR1cm4gcjsKKyAgICBpZiAoZmFicyh6LnJlYWwpID4gQ01fTE9HX0xBUkdFX0RPVUJMRSkgeworICAgICAgICB4X21pbnVzX29uZSA9IHoucmVhbCAtIGNvcHlzaWduKDEuLCB6LnJlYWwpOworICAgICAgICByLnJlYWwgPSBjb3Moei5pbWFnKSAqIHNpbmgoeF9taW51c19vbmUpICogUHlfTUFUSF9FOworICAgICAgICByLmltYWcgPSBzaW4oei5pbWFnKSAqIGNvc2goeF9taW51c19vbmUpICogUHlfTUFUSF9FOworICAgIH0gZWxzZSB7CisgICAgICAgIHIucmVhbCA9IGNvcyh6LmltYWcpICogc2luaCh6LnJlYWwpOworICAgICAgICByLmltYWcgPSBzaW4oei5pbWFnKSAqIGNvc2goei5yZWFsKTsKKyAgICB9CisgICAgLyogZGV0ZWN0IG92ZXJmbG93LCBhbmQgc2V0IGVycm5vIGFjY29yZGluZ2x5ICovCisgICAgaWYgKFB5X0lTX0lORklOSVRZKHIucmVhbCkgfHwgUHlfSVNfSU5GSU5JVFkoci5pbWFnKSkKKyAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgZWxzZQorICAgICAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihjX3NpbmhfZG9jLApAQCAtNjY2LDY4ICs2NjYsNjggQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX3NxcnQoUHlfY29tcGxleCB6KQogewotCS8qCi0JICAgTWV0aG9kOiB1c2Ugc3ltbWV0cmllcyB0byByZWR1Y2UgdG8gdGhlIGNhc2Ugd2hlbiB4ID0gei5yZWFsIGFuZCB5Ci0JICAgPSB6LmltYWcgYXJlIG5vbm5lZ2F0aXZlLiAgVGhlbiB0aGUgcmVhbCBwYXJ0IG9mIHRoZSByZXN1bHQgaXMKLQkgICBnaXZlbiBieQorICAgIC8qCisgICAgICAgTWV0aG9kOiB1c2Ugc3ltbWV0cmllcyB0byByZWR1Y2UgdG8gdGhlIGNhc2Ugd2hlbiB4ID0gei5yZWFsIGFuZCB5CisgICAgICAgPSB6LmltYWcgYXJlIG5vbm5lZ2F0aXZlLiAgVGhlbiB0aGUgcmVhbCBwYXJ0IG9mIHRoZSByZXN1bHQgaXMKKyAgICAgICBnaXZlbiBieQogCi0JICAgICBzID0gc3FydCgoeCArIGh5cG90KHgsIHkpKS8yKQorICAgICAgICAgcyA9IHNxcnQoKHggKyBoeXBvdCh4LCB5KSkvMikKIAotCSAgIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgaXMKKyAgICAgICBhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IGlzCiAKLQkgICAgIGQgPSAoeS8yKS9zCisgICAgICAgICBkID0gKHkvMikvcwogCi0JICAgSWYgZWl0aGVyIHggb3IgeSBpcyB2ZXJ5IGxhcmdlIHRoZW4gdGhlcmUncyBhIHJpc2sgb2Ygb3ZlcmZsb3cgaW4KLQkgICBjb21wdXRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiB4ICsgaHlwb3QoeCwgeSkuICBXZSBjYW4gYXZvaWQgdGhpcwotCSAgIGJ5IHJld3JpdGluZyB0aGUgZm9ybXVsYSBmb3IgcyBhczoKKyAgICAgICBJZiBlaXRoZXIgeCBvciB5IGlzIHZlcnkgbGFyZ2UgdGhlbiB0aGVyZSdzIGEgcmlzayBvZiBvdmVyZmxvdyBpbgorICAgICAgIGNvbXB1dGF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHggKyBoeXBvdCh4LCB5KS4gIFdlIGNhbiBhdm9pZCB0aGlzCisgICAgICAgYnkgcmV3cml0aW5nIHRoZSBmb3JtdWxhIGZvciBzIGFzOgogCi0JICAgICBzID0gMipzcXJ0KHgvOCArIGh5cG90KHgvOCwgeS84KSkKKyAgICAgICAgIHMgPSAyKnNxcnQoeC84ICsgaHlwb3QoeC84LCB5LzgpKQogCi0JICAgVGhpcyBjb3N0cyB1cyB0d28gZXh0cmEgbXVsdGlwbGljYXRpb25zL2RpdmlzaW9ucywgYnV0IGF2b2lkcyB0aGUKLQkgICBvdmVyaGVhZCBvZiBjaGVja2luZyBmb3IgeCBhbmQgeSBsYXJnZS4KKyAgICAgICBUaGlzIGNvc3RzIHVzIHR3byBleHRyYSBtdWx0aXBsaWNhdGlvbnMvZGl2aXNpb25zLCBidXQgYXZvaWRzIHRoZQorICAgICAgIG92ZXJoZWFkIG9mIGNoZWNraW5nIGZvciB4IGFuZCB5IGxhcmdlLgogCi0JICAgSWYgYm90aCB4IGFuZCB5IGFyZSBzdWJub3JtYWwgdGhlbiBoeXBvdCh4LCB5KSBtYXkgYWxzbyBiZQotCSAgIHN1Ym5vcm1hbCwgc28gd2lsbCBsYWNrIGZ1bGwgcHJlY2lzaW9uLiAgV2Ugc29sdmUgdGhpcyBieSByZXNjYWxpbmcKLQkgICB4IGFuZCB5IGJ5IGEgc3VmZmljaWVudGx5IGxhcmdlIHBvd2VyIG9mIDIgdG8gZW5zdXJlIHRoYXQgeCBhbmQgeQotCSAgIGFyZSBub3JtYWwuCi0JKi8KKyAgICAgICBJZiBib3RoIHggYW5kIHkgYXJlIHN1Ym5vcm1hbCB0aGVuIGh5cG90KHgsIHkpIG1heSBhbHNvIGJlCisgICAgICAgc3Vibm9ybWFsLCBzbyB3aWxsIGxhY2sgZnVsbCBwcmVjaXNpb24uICBXZSBzb2x2ZSB0aGlzIGJ5IHJlc2NhbGluZworICAgICAgIHggYW5kIHkgYnkgYSBzdWZmaWNpZW50bHkgbGFyZ2UgcG93ZXIgb2YgMiB0byBlbnN1cmUgdGhhdCB4IGFuZCB5CisgICAgICAgYXJlIG5vcm1hbC4KKyAgICAqLwogCiAKLQlQeV9jb21wbGV4IHI7Ci0JZG91YmxlIHMsZDsKLQlkb3VibGUgYXgsIGF5OworICAgIFB5X2NvbXBsZXggcjsKKyAgICBkb3VibGUgcyxkOworICAgIGRvdWJsZSBheCwgYXk7CiAKLQlTUEVDSUFMX1ZBTFVFKHosIHNxcnRfc3BlY2lhbF92YWx1ZXMpOworICAgIFNQRUNJQUxfVkFMVUUoeiwgc3FydF9zcGVjaWFsX3ZhbHVlcyk7CiAKLQlpZiAoei5yZWFsID09IDAuICYmIHouaW1hZyA9PSAwLikgewotCQlyLnJlYWwgPSAwLjsKLQkJci5pbWFnID0gei5pbWFnOwotCQlyZXR1cm4gcjsKLQl9CisgICAgaWYgKHoucmVhbCA9PSAwLiAmJiB6LmltYWcgPT0gMC4pIHsKKyAgICAgICAgci5yZWFsID0gMC47CisgICAgICAgIHIuaW1hZyA9IHouaW1hZzsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQogCi0JYXggPSBmYWJzKHoucmVhbCk7Ci0JYXkgPSBmYWJzKHouaW1hZyk7CisgICAgYXggPSBmYWJzKHoucmVhbCk7CisgICAgYXkgPSBmYWJzKHouaW1hZyk7CiAKLQlpZiAoYXggPCBEQkxfTUlOICYmIGF5IDwgREJMX01JTiAmJiAoYXggPiAwLiB8fCBheSA+IDAuKSkgewotCQkvKiBoZXJlIHdlIGNhdGNoIGNhc2VzIHdoZXJlIGh5cG90KGF4LCBheSkgaXMgc3Vibm9ybWFsICovCi0JCWF4ID0gbGRleHAoYXgsIENNX1NDQUxFX1VQKTsKLQkJcyA9IGxkZXhwKHNxcnQoYXggKyBoeXBvdChheCwgbGRleHAoYXksIENNX1NDQUxFX1VQKSkpLAotCQkJICBDTV9TQ0FMRV9ET1dOKTsKLQl9IGVsc2UgewotCQlheCAvPSA4LjsKLQkJcyA9IDIuKnNxcnQoYXggKyBoeXBvdChheCwgYXkvOC4pKTsKLQl9Ci0JZCA9IGF5LygyLipzKTsKKyAgICBpZiAoYXggPCBEQkxfTUlOICYmIGF5IDwgREJMX01JTiAmJiAoYXggPiAwLiB8fCBheSA+IDAuKSkgeworICAgICAgICAvKiBoZXJlIHdlIGNhdGNoIGNhc2VzIHdoZXJlIGh5cG90KGF4LCBheSkgaXMgc3Vibm9ybWFsICovCisgICAgICAgIGF4ID0gbGRleHAoYXgsIENNX1NDQUxFX1VQKTsKKyAgICAgICAgcyA9IGxkZXhwKHNxcnQoYXggKyBoeXBvdChheCwgbGRleHAoYXksIENNX1NDQUxFX1VQKSkpLAorICAgICAgICAgICAgICAgICAgQ01fU0NBTEVfRE9XTik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXggLz0gOC47CisgICAgICAgIHMgPSAyLipzcXJ0KGF4ICsgaHlwb3QoYXgsIGF5LzguKSk7CisgICAgfQorICAgIGQgPSBheS8oMi4qcyk7CiAKLQlpZiAoei5yZWFsID49IDAuKSB7Ci0JCXIucmVhbCA9IHM7Ci0JCXIuaW1hZyA9IGNvcHlzaWduKGQsIHouaW1hZyk7Ci0JfSBlbHNlIHsKLQkJci5yZWFsID0gZDsKLQkJci5pbWFnID0gY29weXNpZ24ocywgei5pbWFnKTsKLQl9Ci0JZXJybm8gPSAwOwotCXJldHVybiByOworICAgIGlmICh6LnJlYWwgPj0gMC4pIHsKKyAgICAgICAgci5yZWFsID0gczsKKyAgICAgICAgci5pbWFnID0gY29weXNpZ24oZCwgei5pbWFnKTsKKyAgICB9IGVsc2UgeworICAgICAgICByLnJlYWwgPSBkOworICAgICAgICByLmltYWcgPSBjb3B5c2lnbihzLCB6LmltYWcpOworICAgIH0KKyAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihjX3NxcnRfZG9jLApAQCAtNzM5LDE0ICs3MzksMTQgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX3RhbihQeV9jb21wbGV4IHopCiB7Ci0JLyogdGFuKHopID0gLWkgdGFuaChpeikgKi8KLQlQeV9jb21wbGV4IHMsIHI7Ci0Jcy5yZWFsID0gLXouaW1hZzsKLQlzLmltYWcgPSB6LnJlYWw7Ci0JcyA9IGNfdGFuaChzKTsKLQlyLnJlYWwgPSBzLmltYWc7Ci0Jci5pbWFnID0gLXMucmVhbDsKLQlyZXR1cm4gcjsKKyAgICAvKiB0YW4oeikgPSAtaSB0YW5oKGl6KSAqLworICAgIFB5X2NvbXBsZXggcywgcjsKKyAgICBzLnJlYWwgPSAtei5pbWFnOworICAgIHMuaW1hZyA9IHoucmVhbDsKKyAgICBzID0gY190YW5oKHMpOworICAgIHIucmVhbCA9IHMuaW1hZzsKKyAgICByLmltYWcgPSAtcy5yZWFsOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY190YW5fZG9jLApAQCAtNzYxLDY1ICs3NjEsNjUgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX3RhbmgoUHlfY29tcGxleCB6KQogewotCS8qIEZvcm11bGE6CisgICAgLyogRm9ybXVsYToKIAotCSAgIHRhbmgoeCtpeSkgPSAodGFuaCh4KSgxK3Rhbih5KV4yKSArIGkgdGFuKHkpKDEtdGFuaCh4KSleMikgLwotCSAgICgxK3Rhbih5KV4yIHRhbmgoeCleMikKKyAgICAgICB0YW5oKHgraXkpID0gKHRhbmgoeCkoMSt0YW4oeSleMikgKyBpIHRhbih5KSgxLXRhbmgoeCkpXjIpIC8KKyAgICAgICAoMSt0YW4oeSleMiB0YW5oKHgpXjIpCiAKLQkgICBUbyBhdm9pZCBleGNlc3NpdmUgcm91bmRvZmYgZXJyb3IsIDEtdGFuaCh4KV4yIGlzIGJldHRlciBjb21wdXRlZAotCSAgIGFzIDEvY29zaCh4KV4yLiAgV2hlbiBhYnMoeCkgaXMgbGFyZ2UsIHdlIGFwcHJveGltYXRlIDEtdGFuaCh4KV4yCi0JICAgYnkgNCBleHAoLTIqeCkgaW5zdGVhZCwgdG8gYXZvaWQgcG9zc2libGUgb3ZlcmZsb3cgaW4gdGhlCi0JICAgY29tcHV0YXRpb24gb2YgY29zaCh4KS4KKyAgICAgICBUbyBhdm9pZCBleGNlc3NpdmUgcm91bmRvZmYgZXJyb3IsIDEtdGFuaCh4KV4yIGlzIGJldHRlciBjb21wdXRlZAorICAgICAgIGFzIDEvY29zaCh4KV4yLiAgV2hlbiBhYnMoeCkgaXMgbGFyZ2UsIHdlIGFwcHJveGltYXRlIDEtdGFuaCh4KV4yCisgICAgICAgYnkgNCBleHAoLTIqeCkgaW5zdGVhZCwgdG8gYXZvaWQgcG9zc2libGUgb3ZlcmZsb3cgaW4gdGhlCisgICAgICAgY29tcHV0YXRpb24gb2YgY29zaCh4KS4KIAotCSovCisgICAgKi8KIAotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgdHgsIHR5LCBjeCwgdHh0eSwgZGVub207CisgICAgUHlfY29tcGxleCByOworICAgIGRvdWJsZSB0eCwgdHksIGN4LCB0eHR5LCBkZW5vbTsKIAotCS8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciB0YW5oKCsvLWluZiArIGl5KSBpZiB5IGlzIGZpbml0ZSBhbmQKLQkgICBub256ZXJvICovCi0JaWYgKCFQeV9JU19GSU5JVEUoei5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKHouaW1hZykpIHsKLQkJaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkgJiYgUHlfSVNfRklOSVRFKHouaW1hZykKLQkJICAgICYmICh6LmltYWcgIT0gMC4pKSB7Ci0JCQlpZiAoei5yZWFsID4gMCkgewotCQkJCXIucmVhbCA9IDEuMDsKLQkJCQlyLmltYWcgPSBjb3B5c2lnbigwLiwKLQkJCQkJCSAgMi4qc2luKHouaW1hZykqY29zKHouaW1hZykpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJci5yZWFsID0gLTEuMDsKLQkJCQlyLmltYWcgPSBjb3B5c2lnbigwLiwKLQkJCQkJCSAgMi4qc2luKHouaW1hZykqY29zKHouaW1hZykpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJciA9IHRhbmhfc3BlY2lhbF92YWx1ZXNbc3BlY2lhbF90eXBlKHoucmVhbCldCi0JCQkJICAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZSh6LmltYWcpXTsKLQkJfQotCQkvKiBuZWVkIHRvIHNldCBlcnJubyA9IEVET00gaWYgei5pbWFnIGlzICsvLWluZmluaXR5IGFuZAotCQkgICB6LnJlYWwgaXMgZmluaXRlICovCi0JCWlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpICYmIFB5X0lTX0ZJTklURSh6LnJlYWwpKQotCQkJZXJybm8gPSBFRE9NOwotCQllbHNlCi0JCQllcnJubyA9IDA7Ci0JCXJldHVybiByOwotCX0KKyAgICAvKiBzcGVjaWFsIHRyZWF0bWVudCBmb3IgdGFuaCgrLy1pbmYgKyBpeSkgaWYgeSBpcyBmaW5pdGUgYW5kCisgICAgICAgbm9uemVybyAqLworICAgIGlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7CisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIFB5X0lTX0ZJTklURSh6LmltYWcpCisgICAgICAgICAgICAmJiAoei5pbWFnICE9IDAuKSkgeworICAgICAgICAgICAgaWYgKHoucmVhbCA+IDApIHsKKyAgICAgICAgICAgICAgICByLnJlYWwgPSAxLjA7CisgICAgICAgICAgICAgICAgci5pbWFnID0gY29weXNpZ24oMC4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4qc2luKHouaW1hZykqY29zKHouaW1hZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgci5yZWFsID0gLTEuMDsKKyAgICAgICAgICAgICAgICByLmltYWcgPSBjb3B5c2lnbigwLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLipzaW4oei5pbWFnKSpjb3Moei5pbWFnKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByID0gdGFuaF9zcGVjaWFsX3ZhbHVlc1tzcGVjaWFsX3R5cGUoei5yZWFsKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZSh6LmltYWcpXTsKKyAgICAgICAgfQorICAgICAgICAvKiBuZWVkIHRvIHNldCBlcnJubyA9IEVET00gaWYgei5pbWFnIGlzICsvLWluZmluaXR5IGFuZAorICAgICAgICAgICB6LnJlYWwgaXMgZmluaXRlICovCisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpICYmIFB5X0lTX0ZJTklURSh6LnJlYWwpKQorICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIHJldHVybiByOworICAgIH0KIAotCS8qIGRhbmdlciBvZiBvdmVyZmxvdyBpbiAyLip6LmltYWcgISovCi0JaWYgKGZhYnMoei5yZWFsKSA+IENNX0xPR19MQVJHRV9ET1VCTEUpIHsKLQkJci5yZWFsID0gY29weXNpZ24oMS4sIHoucmVhbCk7Ci0JCXIuaW1hZyA9IDQuKnNpbih6LmltYWcpKmNvcyh6LmltYWcpKmV4cCgtMi4qZmFicyh6LnJlYWwpKTsKLQl9IGVsc2UgewotCQl0eCA9IHRhbmgoei5yZWFsKTsKLQkJdHkgPSB0YW4oei5pbWFnKTsKLQkJY3ggPSAxLi9jb3NoKHoucmVhbCk7Ci0JCXR4dHkgPSB0eCp0eTsKLQkJZGVub20gPSAxLiArIHR4dHkqdHh0eTsKLQkJci5yZWFsID0gdHgqKDEuK3R5KnR5KS9kZW5vbTsKLQkJci5pbWFnID0gKCh0eS9kZW5vbSkqY3gpKmN4OwotCX0KLQllcnJubyA9IDA7Ci0JcmV0dXJuIHI7CisgICAgLyogZGFuZ2VyIG9mIG92ZXJmbG93IGluIDIuKnouaW1hZyAhKi8KKyAgICBpZiAoZmFicyh6LnJlYWwpID4gQ01fTE9HX0xBUkdFX0RPVUJMRSkgeworICAgICAgICByLnJlYWwgPSBjb3B5c2lnbigxLiwgei5yZWFsKTsKKyAgICAgICAgci5pbWFnID0gNC4qc2luKHouaW1hZykqY29zKHouaW1hZykqZXhwKC0yLipmYWJzKHoucmVhbCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHR4ID0gdGFuaCh6LnJlYWwpOworICAgICAgICB0eSA9IHRhbih6LmltYWcpOworICAgICAgICBjeCA9IDEuL2Nvc2goei5yZWFsKTsKKyAgICAgICAgdHh0eSA9IHR4KnR5OworICAgICAgICBkZW5vbSA9IDEuICsgdHh0eSp0eHR5OworICAgICAgICByLnJlYWwgPSB0eCooMS4rdHkqdHkpL2Rlbm9tOworICAgICAgICByLmltYWcgPSAoKHR5L2Rlbm9tKSpjeCkqY3g7CisgICAgfQorICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfdGFuaF9kb2MsCkBAIC04MzEsMjMgKzgzMSwyMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNtYXRoX2xvZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfY29tcGxleCB4OwotCVB5X2NvbXBsZXggeTsKKyAgICBQeV9jb21wbGV4IHg7CisgICAgUHlfY29tcGxleCB5OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEfEQiLCAmeCwgJnkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkR8RCIsICZ4LCAmeSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCByZXR1cm4gMCkKLQl4ID0gY19sb2coeCk7Ci0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMikgewotCQl5ID0gY19sb2coeSk7Ci0JCXggPSBjX3F1b3QoeCwgeSk7Ci0JfQotCVB5RlBFX0VORF9QUk9URUNUKHgpCi0JaWYgKGVycm5vICE9IDApCi0JCXJldHVybiBtYXRoX2Vycm9yKCk7Ci0JcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoeCk7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCByZXR1cm4gMCkKKyAgICB4ID0gY19sb2coeCk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMikgeworICAgICAgICB5ID0gY19sb2coeSk7CisgICAgICAgIHggPSBjX3F1b3QoeCwgeSk7CisgICAgfQorICAgIFB5RlBFX0VORF9QUk9URUNUKHgpCisgICAgaWYgKGVycm5vICE9IDApCisgICAgICAgIHJldHVybiBtYXRoX2Vycm9yKCk7CisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoeCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjbWF0aF9sb2dfZG9jLApAQCAtODYwLDQyICs4NjAsNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoX2Vycm9yKHZvaWQpCiB7Ci0JaWYgKGVycm5vID09IEVET00pCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF0aCBkb21haW4gZXJyb3IiKTsKLQllbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibWF0aCByYW5nZSBlcnJvciIpOwotCWVsc2UgICAgLyogVW5leHBlY3RlZCBtYXRoIGVycm9yICovCi0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19WYWx1ZUVycm9yKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZXJybm8gPT0gRURPTSkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtYXRoIGRvbWFpbiBlcnJvciIpOworICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJtYXRoIHJhbmdlIGVycm9yIik7CisgICAgZWxzZSAgICAvKiBVbmV4cGVjdGVkIG1hdGggZXJyb3IgKi8KKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX1ZhbHVlRXJyb3IpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF8xKFB5T2JqZWN0ICphcmdzLCBQeV9jb21wbGV4ICgqZnVuYykoUHlfY29tcGxleCkpCiB7Ci0JUHlfY29tcGxleCB4LHIgOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRCIsICZ4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCByZXR1cm4gMCk7Ci0JciA9ICgqZnVuYykoeCk7Ci0JUHlGUEVfRU5EX1BST1RFQ1Qocik7Ci0JaWYgKGVycm5vID09IEVET00pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtYXRoIGRvbWFpbiBlcnJvciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibWF0aCByYW5nZSBlcnJvciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHIpOwotCX0KKyAgICBQeV9jb21wbGV4IHgsciA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEIiwgJngpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIHJldHVybiAwKTsKKyAgICByID0gKCpmdW5jKSh4KTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChyKTsKKyAgICBpZiAoZXJybm8gPT0gRURPTSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1hdGggZG9tYWluIGVycm9yIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJtYXRoIHJhbmdlIGVycm9yIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocik7CisgICAgfQogfQogCiAjZGVmaW5lIEZVTkMxKHN0dWJuYW1lLCBmdW5jKSBcCi0Jc3RhdGljIFB5T2JqZWN0ICogc3R1Ym5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7IFwKLQkJcmV0dXJuIG1hdGhfMShhcmdzLCBmdW5jKTsgXAotCX0KKyAgICBzdGF0aWMgUHlPYmplY3QgKiBzdHVibmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsgXAorICAgICAgICByZXR1cm4gbWF0aF8xKGFyZ3MsIGZ1bmMpOyBcCisgICAgfQogCiBGVU5DMShjbWF0aF9hY29zLCBjX2Fjb3MpCiBGVU5DMShjbWF0aF9hY29zaCwgY19hY29zaCkKQEAgLTkxNiwxOCArOTE2LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY21hdGhfcGhhc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2NvbXBsZXggejsKLQlkb3VibGUgcGhpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRDpwaGFzZSIsICZ6KSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImFyZyBmdW5jdGlvbiIsIHJldHVybiAwKQotCXBoaSA9IGNfYXRhbjIoeik7Ci0JUHlGUEVfRU5EX1BST1RFQ1QocGhpKQotCWlmIChlcnJubyAhPSAwKQotCQlyZXR1cm4gbWF0aF9lcnJvcigpOwotCWVsc2UKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShwaGkpOworICAgIFB5X2NvbXBsZXggejsKKyAgICBkb3VibGUgcGhpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRDpwaGFzZSIsICZ6KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImFyZyBmdW5jdGlvbiIsIHJldHVybiAwKQorICAgIHBoaSA9IGNfYXRhbjIoeik7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QocGhpKQorICAgIGlmIChlcnJubyAhPSAwKQorICAgICAgICByZXR1cm4gbWF0aF9lcnJvcigpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShwaGkpOwogfQogCiBQeURvY19TVFJWQVIoY21hdGhfcGhhc2VfZG9jLApAQCAtOTM3LDE4ICs5MzcsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbWF0aF9wb2xhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfY29tcGxleCB6OwotCWRvdWJsZSByLCBwaGk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEOnBvbGFyIiwgJnopKQotCQlyZXR1cm4gTlVMTDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJwb2xhciBmdW5jdGlvbiIsIHJldHVybiAwKQotCXBoaSA9IGNfYXRhbjIoeik7IC8qIHNob3VsZCBub3QgY2F1c2UgYW55IGV4Y2VwdGlvbiAqLwotCXIgPSBjX2Ficyh6KTsgLyogc2V0cyBlcnJubyB0byBFUkFOR0Ugb24gb3ZlcmZsb3c7ICBvdGhlcndpc2UgMCAqLwotCVB5RlBFX0VORF9QUk9URUNUKHIpCi0JaWYgKGVycm5vICE9IDApCi0JCXJldHVybiBtYXRoX2Vycm9yKCk7Ci0JZWxzZQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZGQiLCByLCBwaGkpOworICAgIFB5X2NvbXBsZXggejsKKyAgICBkb3VibGUgciwgcGhpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRDpwb2xhciIsICZ6KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgicG9sYXIgZnVuY3Rpb24iLCByZXR1cm4gMCkKKyAgICBwaGkgPSBjX2F0YW4yKHopOyAvKiBzaG91bGQgbm90IGNhdXNlIGFueSBleGNlcHRpb24gKi8KKyAgICByID0gY19hYnMoeik7IC8qIHNldHMgZXJybm8gdG8gRVJBTkdFIG9uIG92ZXJmbG93OyAgb3RoZXJ3aXNlIDAgKi8KKyAgICBQeUZQRV9FTkRfUFJPVEVDVChyKQorICAgIGlmIChlcnJubyAhPSAwKQorICAgICAgICByZXR1cm4gbWF0aF9lcnJvcigpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImRkIiwgciwgcGhpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNtYXRoX3BvbGFyX2RvYywKQEAgLTk3Miw1MSArOTcyLDUxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY21hdGhfcmVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfY29tcGxleCB6OwotCWRvdWJsZSByLCBwaGk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkZDpyZWN0IiwgJnIsICZwaGkpKQotCQlyZXR1cm4gTlVMTDsKLQllcnJubyA9IDA7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgicmVjdCBmdW5jdGlvbiIsIHJldHVybiAwKQorICAgIFB5X2NvbXBsZXggejsKKyAgICBkb3VibGUgciwgcGhpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZGQ6cmVjdCIsICZyLCAmcGhpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoInJlY3QgZnVuY3Rpb24iLCByZXR1cm4gMCkKIAotCS8qIGRlYWwgd2l0aCBzcGVjaWFsIHZhbHVlcyAqLwotCWlmICghUHlfSVNfRklOSVRFKHIpIHx8ICFQeV9JU19GSU5JVEUocGhpKSkgewotCQkvKiBpZiByIGlzICsvLWluZmluaXR5IGFuZCBwaGkgaXMgZmluaXRlIGJ1dCBub256ZXJvIHRoZW4KLQkJICAgcmVzdWx0IGlzICgrLUlORiArLUlORiBpKSwgYnV0IHdlIG5lZWQgdG8gY29tcHV0ZSBjb3MocGhpKQotCQkgICBhbmQgc2luKHBoaSkgdG8gZmlndXJlIG91dCB0aGUgc2lnbnMuICovCi0JCWlmIChQeV9JU19JTkZJTklUWShyKSAmJiAoUHlfSVNfRklOSVRFKHBoaSkKLQkJCQkJICAmJiAocGhpICE9IDAuKSkpIHsKLQkJCWlmIChyID4gMCkgewotCQkJCXoucmVhbCA9IGNvcHlzaWduKElORiwgY29zKHBoaSkpOwotCQkJCXouaW1hZyA9IGNvcHlzaWduKElORiwgc2luKHBoaSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJei5yZWFsID0gLWNvcHlzaWduKElORiwgY29zKHBoaSkpOwotCQkJCXouaW1hZyA9IC1jb3B5c2lnbihJTkYsIHNpbihwaGkpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXogPSByZWN0X3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZShyKV0KLQkJCQkgICAgICAgICAgICAgICBbc3BlY2lhbF90eXBlKHBoaSldOwotCQl9Ci0JCS8qIG5lZWQgdG8gc2V0IGVycm5vID0gRURPTSBpZiByIGlzIGEgbm9uemVybyBudW1iZXIgYW5kIHBoaQotCQkgICBpcyBpbmZpbml0ZSAqLwotCQlpZiAociAhPSAwLiAmJiAhUHlfSVNfTkFOKHIpICYmIFB5X0lTX0lORklOSVRZKHBoaSkpCi0JCQllcnJubyA9IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQl9Ci0JZWxzZSB7Ci0JCXoucmVhbCA9IHIgKiBjb3MocGhpKTsKLQkJei5pbWFnID0gciAqIHNpbihwaGkpOwotCQllcnJubyA9IDA7Ci0JfQorICAgIC8qIGRlYWwgd2l0aCBzcGVjaWFsIHZhbHVlcyAqLworICAgIGlmICghUHlfSVNfRklOSVRFKHIpIHx8ICFQeV9JU19GSU5JVEUocGhpKSkgeworICAgICAgICAvKiBpZiByIGlzICsvLWluZmluaXR5IGFuZCBwaGkgaXMgZmluaXRlIGJ1dCBub256ZXJvIHRoZW4KKyAgICAgICAgICAgcmVzdWx0IGlzICgrLUlORiArLUlORiBpKSwgYnV0IHdlIG5lZWQgdG8gY29tcHV0ZSBjb3MocGhpKQorICAgICAgICAgICBhbmQgc2luKHBoaSkgdG8gZmlndXJlIG91dCB0aGUgc2lnbnMuICovCisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWShyKSAmJiAoUHlfSVNfRklOSVRFKHBoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocGhpICE9IDAuKSkpIHsKKyAgICAgICAgICAgIGlmIChyID4gMCkgeworICAgICAgICAgICAgICAgIHoucmVhbCA9IGNvcHlzaWduKElORiwgY29zKHBoaSkpOworICAgICAgICAgICAgICAgIHouaW1hZyA9IGNvcHlzaWduKElORiwgc2luKHBoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgei5yZWFsID0gLWNvcHlzaWduKElORiwgY29zKHBoaSkpOworICAgICAgICAgICAgICAgIHouaW1hZyA9IC1jb3B5c2lnbihJTkYsIHNpbihwaGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHogPSByZWN0X3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZShyKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZShwaGkpXTsKKyAgICAgICAgfQorICAgICAgICAvKiBuZWVkIHRvIHNldCBlcnJubyA9IEVET00gaWYgciBpcyBhIG5vbnplcm8gbnVtYmVyIGFuZCBwaGkKKyAgICAgICAgICAgaXMgaW5maW5pdGUgKi8KKyAgICAgICAgaWYgKHIgIT0gMC4gJiYgIVB5X0lTX05BTihyKSAmJiBQeV9JU19JTkZJTklUWShwaGkpKQorICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB6LnJlYWwgPSByICogY29zKHBoaSk7CisgICAgICAgIHouaW1hZyA9IHIgKiBzaW4ocGhpKTsKKyAgICAgICAgZXJybm8gPSAwOworICAgIH0KIAotCVB5RlBFX0VORF9QUk9URUNUKHopCi0JaWYgKGVycm5vICE9IDApCi0JCXJldHVybiBtYXRoX2Vycm9yKCk7Ci0JZWxzZQotCQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleCh6KTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVCh6KQorICAgIGlmIChlcnJubyAhPSAwKQorICAgICAgICByZXR1cm4gbWF0aF9lcnJvcigpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoeik7CiB9CiAKIFB5RG9jX1NUUlZBUihjbWF0aF9yZWN0X2RvYywKQEAgLTEwMjYsMTAgKzEwMjYsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbWF0aF9pc25hbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfY29tcGxleCB6OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRDppc25hbiIsICZ6KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhQeV9JU19OQU4oei5yZWFsKSB8fCBQeV9JU19OQU4oei5pbWFnKSk7CisgICAgUHlfY29tcGxleCB6OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRDppc25hbiIsICZ6KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhQeV9JU19OQU4oei5yZWFsKSB8fCBQeV9JU19OQU4oei5pbWFnKSk7CiB9CiAKIFB5RG9jX1NUUlZBUihjbWF0aF9pc25hbl9kb2MsCkBAIC0xMDM5LDExICsxMDM5LDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY21hdGhfaXNpbmYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2NvbXBsZXggejsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkQ6aXNuYW4iLCAmeikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSB8fAotCQkJICAgICAgIFB5X0lTX0lORklOSVRZKHouaW1hZykpOworICAgIFB5X2NvbXBsZXggejsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkQ6aXNuYW4iLCAmeikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfSVNfSU5GSU5JVFkoei5pbWFnKSk7CiB9CiAKIFB5RG9jX1NUUlZBUihjbWF0aF9pc2luZl9kb2MsCkBAIC0xMDU2LDE1NSArMTA1NiwxNTUgQEAKICJmdW5jdGlvbnMgZm9yIGNvbXBsZXggbnVtYmVycy4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGNtYXRoX21ldGhvZHNbXSA9IHsKLQl7ImFjb3MiLCAgIGNtYXRoX2Fjb3MsICBNRVRIX1ZBUkFSR1MsIGNfYWNvc19kb2N9LAotCXsiYWNvc2giLCAgY21hdGhfYWNvc2gsIE1FVEhfVkFSQVJHUywgY19hY29zaF9kb2N9LAotCXsiYXNpbiIsICAgY21hdGhfYXNpbiwgIE1FVEhfVkFSQVJHUywgY19hc2luX2RvY30sCi0JeyJhc2luaCIsICBjbWF0aF9hc2luaCwgTUVUSF9WQVJBUkdTLCBjX2FzaW5oX2RvY30sCi0JeyJhdGFuIiwgICBjbWF0aF9hdGFuLCAgTUVUSF9WQVJBUkdTLCBjX2F0YW5fZG9jfSwKLQl7ImF0YW5oIiwgIGNtYXRoX2F0YW5oLCBNRVRIX1ZBUkFSR1MsIGNfYXRhbmhfZG9jfSwKLQl7ImNvcyIsICAgIGNtYXRoX2NvcywgICBNRVRIX1ZBUkFSR1MsIGNfY29zX2RvY30sCi0JeyJjb3NoIiwgICBjbWF0aF9jb3NoLCAgTUVUSF9WQVJBUkdTLCBjX2Nvc2hfZG9jfSwKLQl7ImV4cCIsICAgIGNtYXRoX2V4cCwgICBNRVRIX1ZBUkFSR1MsIGNfZXhwX2RvY30sCi0JeyJpc2luZiIsICBjbWF0aF9pc2luZiwgTUVUSF9WQVJBUkdTLCBjbWF0aF9pc2luZl9kb2N9LAotCXsiaXNuYW4iLCAgY21hdGhfaXNuYW4sIE1FVEhfVkFSQVJHUywgY21hdGhfaXNuYW5fZG9jfSwKLQl7ImxvZyIsICAgIGNtYXRoX2xvZywgICBNRVRIX1ZBUkFSR1MsIGNtYXRoX2xvZ19kb2N9LAotCXsibG9nMTAiLCAgY21hdGhfbG9nMTAsIE1FVEhfVkFSQVJHUywgY19sb2cxMF9kb2N9LAotCXsicGhhc2UiLCAgY21hdGhfcGhhc2UsIE1FVEhfVkFSQVJHUywgY21hdGhfcGhhc2VfZG9jfSwKLQl7InBvbGFyIiwgIGNtYXRoX3BvbGFyLCBNRVRIX1ZBUkFSR1MsIGNtYXRoX3BvbGFyX2RvY30sCi0JeyJyZWN0IiwgICBjbWF0aF9yZWN0LCAgTUVUSF9WQVJBUkdTLCBjbWF0aF9yZWN0X2RvY30sCi0JeyJzaW4iLCAgICBjbWF0aF9zaW4sICAgTUVUSF9WQVJBUkdTLCBjX3Npbl9kb2N9LAotCXsic2luaCIsICAgY21hdGhfc2luaCwgIE1FVEhfVkFSQVJHUywgY19zaW5oX2RvY30sCi0JeyJzcXJ0IiwgICBjbWF0aF9zcXJ0LCAgTUVUSF9WQVJBUkdTLCBjX3NxcnRfZG9jfSwKLQl7InRhbiIsICAgIGNtYXRoX3RhbiwgICBNRVRIX1ZBUkFSR1MsIGNfdGFuX2RvY30sCi0JeyJ0YW5oIiwgICBjbWF0aF90YW5oLCAgTUVUSF9WQVJBUkdTLCBjX3RhbmhfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiYWNvcyIsICAgY21hdGhfYWNvcywgIE1FVEhfVkFSQVJHUywgY19hY29zX2RvY30sCisgICAgeyJhY29zaCIsICBjbWF0aF9hY29zaCwgTUVUSF9WQVJBUkdTLCBjX2Fjb3NoX2RvY30sCisgICAgeyJhc2luIiwgICBjbWF0aF9hc2luLCAgTUVUSF9WQVJBUkdTLCBjX2FzaW5fZG9jfSwKKyAgICB7ImFzaW5oIiwgIGNtYXRoX2FzaW5oLCBNRVRIX1ZBUkFSR1MsIGNfYXNpbmhfZG9jfSwKKyAgICB7ImF0YW4iLCAgIGNtYXRoX2F0YW4sICBNRVRIX1ZBUkFSR1MsIGNfYXRhbl9kb2N9LAorICAgIHsiYXRhbmgiLCAgY21hdGhfYXRhbmgsIE1FVEhfVkFSQVJHUywgY19hdGFuaF9kb2N9LAorICAgIHsiY29zIiwgICAgY21hdGhfY29zLCAgIE1FVEhfVkFSQVJHUywgY19jb3NfZG9jfSwKKyAgICB7ImNvc2giLCAgIGNtYXRoX2Nvc2gsICBNRVRIX1ZBUkFSR1MsIGNfY29zaF9kb2N9LAorICAgIHsiZXhwIiwgICAgY21hdGhfZXhwLCAgIE1FVEhfVkFSQVJHUywgY19leHBfZG9jfSwKKyAgICB7ImlzaW5mIiwgIGNtYXRoX2lzaW5mLCBNRVRIX1ZBUkFSR1MsIGNtYXRoX2lzaW5mX2RvY30sCisgICAgeyJpc25hbiIsICBjbWF0aF9pc25hbiwgTUVUSF9WQVJBUkdTLCBjbWF0aF9pc25hbl9kb2N9LAorICAgIHsibG9nIiwgICAgY21hdGhfbG9nLCAgIE1FVEhfVkFSQVJHUywgY21hdGhfbG9nX2RvY30sCisgICAgeyJsb2cxMCIsICBjbWF0aF9sb2cxMCwgTUVUSF9WQVJBUkdTLCBjX2xvZzEwX2RvY30sCisgICAgeyJwaGFzZSIsICBjbWF0aF9waGFzZSwgTUVUSF9WQVJBUkdTLCBjbWF0aF9waGFzZV9kb2N9LAorICAgIHsicG9sYXIiLCAgY21hdGhfcG9sYXIsIE1FVEhfVkFSQVJHUywgY21hdGhfcG9sYXJfZG9jfSwKKyAgICB7InJlY3QiLCAgIGNtYXRoX3JlY3QsICBNRVRIX1ZBUkFSR1MsIGNtYXRoX3JlY3RfZG9jfSwKKyAgICB7InNpbiIsICAgIGNtYXRoX3NpbiwgICBNRVRIX1ZBUkFSR1MsIGNfc2luX2RvY30sCisgICAgeyJzaW5oIiwgICBjbWF0aF9zaW5oLCAgTUVUSF9WQVJBUkdTLCBjX3NpbmhfZG9jfSwKKyAgICB7InNxcnQiLCAgIGNtYXRoX3NxcnQsICBNRVRIX1ZBUkFSR1MsIGNfc3FydF9kb2N9LAorICAgIHsidGFuIiwgICAgY21hdGhfdGFuLCAgIE1FVEhfVkFSQVJHUywgY190YW5fZG9jfSwKKyAgICB7InRhbmgiLCAgIGNtYXRoX3RhbmgsICBNRVRIX1ZBUkFSR1MsIGNfdGFuaF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdGNtYXRoKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQltID0gUHlfSW5pdE1vZHVsZTMoImNtYXRoIiwgY21hdGhfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiY21hdGgiLCBjbWF0aF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgInBpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RmxvYXRfRnJvbURvdWJsZShQeV9NQVRIX1BJKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlIiwgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfRSkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAicGkiLAorICAgICAgICAgICAgICAgICAgICAgICBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTUFUSF9QSSkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZSIsIFB5RmxvYXRfRnJvbURvdWJsZShQeV9NQVRIX0UpKTsKIAotCS8qIGluaXRpYWxpemUgc3BlY2lhbCB2YWx1ZSB0YWJsZXMgKi8KKyAgICAvKiBpbml0aWFsaXplIHNwZWNpYWwgdmFsdWUgdGFibGVzICovCiAKICNkZWZpbmUgSU5JVF9TUEVDSUFMX1ZBTFVFUyhOQU1FLCBCT0RZKSB7IFB5X2NvbXBsZXgqIHAgPSAoUHlfY29tcGxleCopTkFNRTsgQk9EWSB9CiAjZGVmaW5lIEMoUkVBTCwgSU1BRykgcC0+cmVhbCA9IFJFQUw7IHAtPmltYWcgPSBJTUFHOyArK3A7CiAKLQlJTklUX1NQRUNJQUxfVkFMVUVTKGFjb3Nfc3BlY2lhbF92YWx1ZXMsIHsKLQkgIEMoUDM0LElORikgQyhQLElORikgIEMoUCxJTkYpICBDKFAsLUlORikgIEMoUCwtSU5GKSAgQyhQMzQsLUlORikgQyhOLElORikKLQkgIEMoUDEyLElORikgQyhVLFUpICAgIEMoVSxVKSAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhQMTIsLUlORikgQyhOLE4pCi0JICBDKFAxMixJTkYpIEMoVSxVKSAgICBDKFAxMiwwLikgQyhQMTIsLTAuKSBDKFUsVSkgICAgIEMoUDEyLC1JTkYpIEMoUDEyLE4pCi0JICBDKFAxMixJTkYpIEMoVSxVKSAgICBDKFAxMiwwLikgQyhQMTIsLTAuKSBDKFUsVSkgICAgIEMoUDEyLC1JTkYpIEMoUDEyLE4pCi0JICBDKFAxMixJTkYpIEMoVSxVKSAgICBDKFUsVSkgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoUDEyLC1JTkYpIEMoTixOKQotCSAgQyhQMTQsSU5GKSBDKDAuLElORikgQygwLixJTkYpIEMoMC4sLUlORikgQygwLiwtSU5GKSBDKFAxNCwtSU5GKSBDKE4sSU5GKQotCSAgQyhOLElORikgICBDKE4sTikgICAgQyhOLE4pICAgIEMoTixOKSAgICAgQyhOLE4pICAgICBDKE4sLUlORikgICBDKE4sTikKLQl9KQorICAgIElOSVRfU1BFQ0lBTF9WQUxVRVMoYWNvc19zcGVjaWFsX3ZhbHVlcywgeworICAgICAgQyhQMzQsSU5GKSBDKFAsSU5GKSAgQyhQLElORikgIEMoUCwtSU5GKSAgQyhQLC1JTkYpICBDKFAzNCwtSU5GKSBDKE4sSU5GKQorICAgICAgQyhQMTIsSU5GKSBDKFUsVSkgICAgQyhVLFUpICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFAxMiwtSU5GKSBDKE4sTikKKyAgICAgIEMoUDEyLElORikgQyhVLFUpICAgIEMoUDEyLDAuKSBDKFAxMiwtMC4pIEMoVSxVKSAgICAgQyhQMTIsLUlORikgQyhQMTIsTikKKyAgICAgIEMoUDEyLElORikgQyhVLFUpICAgIEMoUDEyLDAuKSBDKFAxMiwtMC4pIEMoVSxVKSAgICAgQyhQMTIsLUlORikgQyhQMTIsTikKKyAgICAgIEMoUDEyLElORikgQyhVLFUpICAgIEMoVSxVKSAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhQMTIsLUlORikgQyhOLE4pCisgICAgICBDKFAxNCxJTkYpIEMoMC4sSU5GKSBDKDAuLElORikgQygwLiwtSU5GKSBDKDAuLC1JTkYpIEMoUDE0LC1JTkYpIEMoTixJTkYpCisgICAgICBDKE4sSU5GKSAgIEMoTixOKSAgICBDKE4sTikgICAgQyhOLE4pICAgICBDKE4sTikgICAgIEMoTiwtSU5GKSAgIEMoTixOKQorICAgIH0pCiAKLQlJTklUX1NQRUNJQUxfVkFMVUVTKGFjb3NoX3NwZWNpYWxfdmFsdWVzLCB7Ci0JICBDKElORiwtUDM0KSBDKElORiwtUCkgIEMoSU5GLC1QKSAgQyhJTkYsUCkgIEMoSU5GLFApICBDKElORixQMzQpIEMoSU5GLE4pCi0JICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSAgICBDKElORixQMTIpIEMoTixOKQotCSAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKDAuLC1QMTIpIEMoMC4sUDEyKSBDKFUsVSkgICAgQyhJTkYsUDEyKSBDKE4sTikKLQkgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQygwLiwtUDEyKSBDKDAuLFAxMikgQyhVLFUpICAgIEMoSU5GLFAxMikgQyhOLE4pCi0JICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSAgICBDKElORixQMTIpIEMoTixOKQotCSAgQyhJTkYsLVAxNCkgQyhJTkYsLTAuKSBDKElORiwtMC4pIEMoSU5GLDAuKSBDKElORiwwLikgQyhJTkYsUDE0KSBDKElORixOKQotCSAgQyhJTkYsTikgICAgQyhOLE4pICAgICBDKE4sTikgICAgIEMoTixOKSAgICBDKE4sTikgICAgQyhJTkYsTikgICBDKE4sTikKLQl9KQorICAgIElOSVRfU1BFQ0lBTF9WQUxVRVMoYWNvc2hfc3BlY2lhbF92YWx1ZXMsIHsKKyAgICAgIEMoSU5GLC1QMzQpIEMoSU5GLC1QKSAgQyhJTkYsLVApICBDKElORixQKSAgQyhJTkYsUCkgIEMoSU5GLFAzNCkgQyhJTkYsTikKKyAgICAgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpICAgIEMoSU5GLFAxMikgQyhOLE4pCisgICAgICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoMC4sLVAxMikgQygwLixQMTIpIEMoVSxVKSAgICBDKElORixQMTIpIEMoTixOKQorICAgICAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKDAuLC1QMTIpIEMoMC4sUDEyKSBDKFUsVSkgICAgQyhJTkYsUDEyKSBDKE4sTikKKyAgICAgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpICAgIEMoSU5GLFAxMikgQyhOLE4pCisgICAgICBDKElORiwtUDE0KSBDKElORiwtMC4pIEMoSU5GLC0wLikgQyhJTkYsMC4pIEMoSU5GLDAuKSBDKElORixQMTQpIEMoSU5GLE4pCisgICAgICBDKElORixOKSAgICBDKE4sTikgICAgIEMoTixOKSAgICAgQyhOLE4pICAgIEMoTixOKSAgICBDKElORixOKSAgIEMoTixOKQorICAgIH0pCiAKLQlJTklUX1NQRUNJQUxfVkFMVUVTKGFzaW5oX3NwZWNpYWxfdmFsdWVzLCB7Ci0JICBDKC1JTkYsLVAxNCkgQygtSU5GLC0wLikgQygtSU5GLC0wLikgQygtSU5GLDAuKSBDKC1JTkYsMC4pIEMoLUlORixQMTQpIEMoLUlORixOKQotCSAgQygtSU5GLC1QMTIpIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKC1JTkYsUDEyKSBDKE4sTikKLQkgIEMoLUlORiwtUDEyKSBDKFUsVSkgICAgICBDKC0wLiwtMC4pICBDKC0wLiwwLikgIEMoVSxVKSAgICAgQygtSU5GLFAxMikgQyhOLE4pCi0JICBDKElORiwtUDEyKSAgQyhVLFUpICAgICAgQygwLiwtMC4pICAgQygwLiwwLikgICBDKFUsVSkgICAgIEMoSU5GLFAxMikgIEMoTixOKQotCSAgQyhJTkYsLVAxMikgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKElORixQMTIpICBDKE4sTikKLQkgIEMoSU5GLC1QMTQpICBDKElORiwtMC4pICBDKElORiwtMC4pICBDKElORiwwLikgIEMoSU5GLDAuKSAgQyhJTkYsUDE0KSAgQyhJTkYsTikKLQkgIEMoSU5GLE4pICAgICBDKE4sTikgICAgICBDKE4sLTAuKSAgICBDKE4sMC4pICAgIEMoTixOKSAgICAgQyhJTkYsTikgICAgQyhOLE4pCi0JfSkKKyAgICBJTklUX1NQRUNJQUxfVkFMVUVTKGFzaW5oX3NwZWNpYWxfdmFsdWVzLCB7CisgICAgICBDKC1JTkYsLVAxNCkgQygtSU5GLC0wLikgQygtSU5GLC0wLikgQygtSU5GLDAuKSBDKC1JTkYsMC4pIEMoLUlORixQMTQpIEMoLUlORixOKQorICAgICAgQygtSU5GLC1QMTIpIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKC1JTkYsUDEyKSBDKE4sTikKKyAgICAgIEMoLUlORiwtUDEyKSBDKFUsVSkgICAgICBDKC0wLiwtMC4pICBDKC0wLiwwLikgIEMoVSxVKSAgICAgQygtSU5GLFAxMikgQyhOLE4pCisgICAgICBDKElORiwtUDEyKSAgQyhVLFUpICAgICAgQygwLiwtMC4pICAgQygwLiwwLikgICBDKFUsVSkgICAgIEMoSU5GLFAxMikgIEMoTixOKQorICAgICAgQyhJTkYsLVAxMikgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKElORixQMTIpICBDKE4sTikKKyAgICAgIEMoSU5GLC1QMTQpICBDKElORiwtMC4pICBDKElORiwtMC4pICBDKElORiwwLikgIEMoSU5GLDAuKSAgQyhJTkYsUDE0KSAgQyhJTkYsTikKKyAgICAgIEMoSU5GLE4pICAgICBDKE4sTikgICAgICBDKE4sLTAuKSAgICBDKE4sMC4pICAgIEMoTixOKSAgICAgQyhJTkYsTikgICAgQyhOLE4pCisgICAgfSkKIAotCUlOSVRfU1BFQ0lBTF9WQUxVRVMoYXRhbmhfc3BlY2lhbF92YWx1ZXMsIHsKLQkgIEMoLTAuLC1QMTIpIEMoLTAuLC1QMTIpIEMoLTAuLC1QMTIpIEMoLTAuLFAxMikgQygtMC4sUDEyKSBDKC0wLixQMTIpIEMoLTAuLE4pCi0JICBDKC0wLiwtUDEyKSBDKFUsVSkgICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQygtMC4sUDEyKSBDKE4sTikKLQkgIEMoLTAuLC1QMTIpIEMoVSxVKSAgICAgIEMoLTAuLC0wLikgIEMoLTAuLDAuKSAgQyhVLFUpICAgICBDKC0wLixQMTIpIEMoLTAuLE4pCi0JICBDKDAuLC1QMTIpICBDKFUsVSkgICAgICBDKDAuLC0wLikgICBDKDAuLDAuKSAgIEMoVSxVKSAgICAgQygwLixQMTIpICBDKDAuLE4pCi0JICBDKDAuLC1QMTIpICBDKFUsVSkgICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQygwLixQMTIpICBDKE4sTikKLQkgIEMoMC4sLVAxMikgIEMoMC4sLVAxMikgIEMoMC4sLVAxMikgIEMoMC4sUDEyKSAgQygwLixQMTIpICBDKDAuLFAxMikgIEMoMC4sTikKLQkgIEMoMC4sLVAxMikgIEMoTixOKSAgICAgIEMoTixOKSAgICAgIEMoTixOKSAgICAgQyhOLE4pICAgICBDKDAuLFAxMikgIEMoTixOKQotCX0pCisgICAgSU5JVF9TUEVDSUFMX1ZBTFVFUyhhdGFuaF9zcGVjaWFsX3ZhbHVlcywgeworICAgICAgQygtMC4sLVAxMikgQygtMC4sLVAxMikgQygtMC4sLVAxMikgQygtMC4sUDEyKSBDKC0wLixQMTIpIEMoLTAuLFAxMikgQygtMC4sTikKKyAgICAgIEMoLTAuLC1QMTIpIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKC0wLixQMTIpIEMoTixOKQorICAgICAgQygtMC4sLVAxMikgQyhVLFUpICAgICAgQygtMC4sLTAuKSAgQygtMC4sMC4pICBDKFUsVSkgICAgIEMoLTAuLFAxMikgQygtMC4sTikKKyAgICAgIEMoMC4sLVAxMikgIEMoVSxVKSAgICAgIEMoMC4sLTAuKSAgIEMoMC4sMC4pICAgQyhVLFUpICAgICBDKDAuLFAxMikgIEMoMC4sTikKKyAgICAgIEMoMC4sLVAxMikgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKDAuLFAxMikgIEMoTixOKQorICAgICAgQygwLiwtUDEyKSAgQygwLiwtUDEyKSAgQygwLiwtUDEyKSAgQygwLixQMTIpICBDKDAuLFAxMikgIEMoMC4sUDEyKSAgQygwLixOKQorICAgICAgQygwLiwtUDEyKSAgQyhOLE4pICAgICAgQyhOLE4pICAgICAgQyhOLE4pICAgICBDKE4sTikgICAgIEMoMC4sUDEyKSAgQyhOLE4pCisgICAgfSkKIAotCUlOSVRfU1BFQ0lBTF9WQUxVRVMoY29zaF9zcGVjaWFsX3ZhbHVlcywgewotCSAgQyhJTkYsTikgQyhVLFUpIEMoSU5GLDAuKSAgQyhJTkYsLTAuKSBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKLQkgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQotCSAgQyhOLDAuKSAgQyhVLFUpIEMoMS4sMC4pICAgQygxLiwtMC4pICBDKFUsVSkgQyhOLDAuKSAgQyhOLDAuKQotCSAgQyhOLDAuKSAgQyhVLFUpIEMoMS4sLTAuKSAgQygxLiwwLikgICBDKFUsVSkgQyhOLDAuKSAgQyhOLDAuKQotCSAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCi0JICBDKElORixOKSBDKFUsVSkgQyhJTkYsLTAuKSBDKElORiwwLikgIEMoVSxVKSBDKElORixOKSBDKElORixOKQotCSAgQyhOLE4pICAgQyhOLE4pIEMoTiwwLikgICAgQyhOLDAuKSAgICBDKE4sTikgQyhOLE4pICAgQyhOLE4pCi0JfSkKKyAgICBJTklUX1NQRUNJQUxfVkFMVUVTKGNvc2hfc3BlY2lhbF92YWx1ZXMsIHsKKyAgICAgIEMoSU5GLE4pIEMoVSxVKSBDKElORiwwLikgIEMoSU5GLC0wLikgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCisgICAgICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKKyAgICAgIEMoTiwwLikgIEMoVSxVKSBDKDEuLDAuKSAgIEMoMS4sLTAuKSAgQyhVLFUpIEMoTiwwLikgIEMoTiwwLikKKyAgICAgIEMoTiwwLikgIEMoVSxVKSBDKDEuLC0wLikgIEMoMS4sMC4pICAgQyhVLFUpIEMoTiwwLikgIEMoTiwwLikKKyAgICAgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQorICAgICAgQyhJTkYsTikgQyhVLFUpIEMoSU5GLC0wLikgQyhJTkYsMC4pICBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKKyAgICAgIEMoTixOKSAgIEMoTixOKSBDKE4sMC4pICAgIEMoTiwwLikgICAgQyhOLE4pIEMoTixOKSAgIEMoTixOKQorICAgIH0pCiAKLQlJTklUX1NQRUNJQUxfVkFMVUVTKGV4cF9zcGVjaWFsX3ZhbHVlcywgewotCSAgQygwLiwwLikgQyhVLFUpIEMoMC4sLTAuKSAgQygwLiwwLikgIEMoVSxVKSBDKDAuLDAuKSBDKDAuLDAuKQotCSAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKLQkgIEMoTixOKSAgIEMoVSxVKSBDKDEuLC0wLikgIEMoMS4sMC4pICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCi0JICBDKE4sTikgICBDKFUsVSkgQygxLiwtMC4pICBDKDEuLDAuKSAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQotCSAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKLQkgIEMoSU5GLE4pIEMoVSxVKSBDKElORiwtMC4pIEMoSU5GLDAuKSBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKLQkgIEMoTixOKSAgIEMoTixOKSBDKE4sLTAuKSAgIEMoTiwwLikgICBDKE4sTikgQyhOLE4pICAgQyhOLE4pCi0JfSkKKyAgICBJTklUX1NQRUNJQUxfVkFMVUVTKGV4cF9zcGVjaWFsX3ZhbHVlcywgeworICAgICAgQygwLiwwLikgQyhVLFUpIEMoMC4sLTAuKSAgQygwLiwwLikgIEMoVSxVKSBDKDAuLDAuKSBDKDAuLDAuKQorICAgICAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKKyAgICAgIEMoTixOKSAgIEMoVSxVKSBDKDEuLC0wLikgIEMoMS4sMC4pICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCisgICAgICBDKE4sTikgICBDKFUsVSkgQygxLiwtMC4pICBDKDEuLDAuKSAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQorICAgICAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKKyAgICAgIEMoSU5GLE4pIEMoVSxVKSBDKElORiwtMC4pIEMoSU5GLDAuKSBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKKyAgICAgIEMoTixOKSAgIEMoTixOKSBDKE4sLTAuKSAgIEMoTiwwLikgICBDKE4sTikgQyhOLE4pICAgQyhOLE4pCisgICAgfSkKIAotCUlOSVRfU1BFQ0lBTF9WQUxVRVMobG9nX3NwZWNpYWxfdmFsdWVzLCB7Ci0JICBDKElORiwtUDM0KSBDKElORiwtUCkgIEMoSU5GLC1QKSAgIEMoSU5GLFApICAgQyhJTkYsUCkgIEMoSU5GLFAzNCkgIEMoSU5GLE4pCi0JICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoSU5GLFAxMikgIEMoTixOKQotCSAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKC1JTkYsLVApICBDKC1JTkYsUCkgIEMoVSxVKSAgICBDKElORixQMTIpICBDKE4sTikKLQkgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQygtSU5GLC0wLikgQygtSU5GLDAuKSBDKFUsVSkgICAgQyhJTkYsUDEyKSAgQyhOLE4pCi0JICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoSU5GLFAxMikgIEMoTixOKQotCSAgQyhJTkYsLVAxNCkgQyhJTkYsLTAuKSBDKElORiwtMC4pICBDKElORiwwLikgIEMoSU5GLDAuKSBDKElORixQMTQpICBDKElORixOKQotCSAgQyhJTkYsTikgICAgQyhOLE4pICAgICBDKE4sTikgICAgICBDKE4sTikgICAgIEMoTixOKSAgICBDKElORixOKSAgICBDKE4sTikKLQl9KQorICAgIElOSVRfU1BFQ0lBTF9WQUxVRVMobG9nX3NwZWNpYWxfdmFsdWVzLCB7CisgICAgICBDKElORiwtUDM0KSBDKElORiwtUCkgIEMoSU5GLC1QKSAgIEMoSU5GLFApICAgQyhJTkYsUCkgIEMoSU5GLFAzNCkgIEMoSU5GLE4pCisgICAgICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoSU5GLFAxMikgIEMoTixOKQorICAgICAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKC1JTkYsLVApICBDKC1JTkYsUCkgIEMoVSxVKSAgICBDKElORixQMTIpICBDKE4sTikKKyAgICAgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQygtSU5GLC0wLikgQygtSU5GLDAuKSBDKFUsVSkgICAgQyhJTkYsUDEyKSAgQyhOLE4pCisgICAgICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoSU5GLFAxMikgIEMoTixOKQorICAgICAgQyhJTkYsLVAxNCkgQyhJTkYsLTAuKSBDKElORiwtMC4pICBDKElORiwwLikgIEMoSU5GLDAuKSBDKElORixQMTQpICBDKElORixOKQorICAgICAgQyhJTkYsTikgICAgQyhOLE4pICAgICBDKE4sTikgICAgICBDKE4sTikgICAgIEMoTixOKSAgICBDKElORixOKSAgICBDKE4sTikKKyAgICB9KQogCi0JSU5JVF9TUEVDSUFMX1ZBTFVFUyhzaW5oX3NwZWNpYWxfdmFsdWVzLCB7Ci0JICBDKElORixOKSBDKFUsVSkgQygtSU5GLC0wLikgQygtSU5GLDAuKSBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKLQkgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKLQkgIEMoMC4sTikgIEMoVSxVKSBDKC0wLiwtMC4pICBDKC0wLiwwLikgIEMoVSxVKSBDKDAuLE4pICBDKDAuLE4pCi0JICBDKDAuLE4pICBDKFUsVSkgQygwLiwtMC4pICAgQygwLiwwLikgICBDKFUsVSkgQygwLixOKSAgQygwLixOKQotCSAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQotCSAgQyhJTkYsTikgQyhVLFUpIEMoSU5GLC0wLikgIEMoSU5GLDAuKSAgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCi0JICBDKE4sTikgICBDKE4sTikgQyhOLC0wLikgICAgQyhOLDAuKSAgICBDKE4sTikgQyhOLE4pICAgQyhOLE4pCi0JfSkKKyAgICBJTklUX1NQRUNJQUxfVkFMVUVTKHNpbmhfc3BlY2lhbF92YWx1ZXMsIHsKKyAgICAgIEMoSU5GLE4pIEMoVSxVKSBDKC1JTkYsLTAuKSBDKC1JTkYsMC4pIEMoVSxVKSBDKElORixOKSBDKElORixOKQorICAgICAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQorICAgICAgQygwLixOKSAgQyhVLFUpIEMoLTAuLC0wLikgIEMoLTAuLDAuKSAgQyhVLFUpIEMoMC4sTikgIEMoMC4sTikKKyAgICAgIEMoMC4sTikgIEMoVSxVKSBDKDAuLC0wLikgICBDKDAuLDAuKSAgIEMoVSxVKSBDKDAuLE4pICBDKDAuLE4pCisgICAgICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCisgICAgICBDKElORixOKSBDKFUsVSkgQyhJTkYsLTAuKSAgQyhJTkYsMC4pICBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKKyAgICAgIEMoTixOKSAgIEMoTixOKSBDKE4sLTAuKSAgICBDKE4sMC4pICAgIEMoTixOKSBDKE4sTikgICBDKE4sTikKKyAgICB9KQogCi0JSU5JVF9TUEVDSUFMX1ZBTFVFUyhzcXJ0X3NwZWNpYWxfdmFsdWVzLCB7Ci0JICBDKElORiwtSU5GKSBDKDAuLC1JTkYpIEMoMC4sLUlORikgQygwLixJTkYpIEMoMC4sSU5GKSBDKElORixJTkYpIEMoTixJTkYpCi0JICBDKElORiwtSU5GKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSAgICBDKElORixJTkYpIEMoTixOKQotCSAgQyhJTkYsLUlORikgQyhVLFUpICAgICBDKDAuLC0wLikgIEMoMC4sMC4pICBDKFUsVSkgICAgQyhJTkYsSU5GKSBDKE4sTikKLQkgIEMoSU5GLC1JTkYpIEMoVSxVKSAgICAgQygwLiwtMC4pICBDKDAuLDAuKSAgQyhVLFUpICAgIEMoSU5GLElORikgQyhOLE4pCi0JICBDKElORiwtSU5GKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSAgICBDKElORixJTkYpIEMoTixOKQotCSAgQyhJTkYsLUlORikgQyhJTkYsLTAuKSBDKElORiwtMC4pIEMoSU5GLDAuKSBDKElORiwwLikgQyhJTkYsSU5GKSBDKElORixOKQotCSAgQyhJTkYsLUlORikgQyhOLE4pICAgICBDKE4sTikgICAgIEMoTixOKSAgICBDKE4sTikgICAgQyhJTkYsSU5GKSBDKE4sTikKLQl9KQorICAgIElOSVRfU1BFQ0lBTF9WQUxVRVMoc3FydF9zcGVjaWFsX3ZhbHVlcywgeworICAgICAgQyhJTkYsLUlORikgQygwLiwtSU5GKSBDKDAuLC1JTkYpIEMoMC4sSU5GKSBDKDAuLElORikgQyhJTkYsSU5GKSBDKE4sSU5GKQorICAgICAgQyhJTkYsLUlORikgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgICAgQyhJTkYsSU5GKSBDKE4sTikKKyAgICAgIEMoSU5GLC1JTkYpIEMoVSxVKSAgICAgQygwLiwtMC4pICBDKDAuLDAuKSAgQyhVLFUpICAgIEMoSU5GLElORikgQyhOLE4pCisgICAgICBDKElORiwtSU5GKSBDKFUsVSkgICAgIEMoMC4sLTAuKSAgQygwLiwwLikgIEMoVSxVKSAgICBDKElORixJTkYpIEMoTixOKQorICAgICAgQyhJTkYsLUlORikgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgICAgQyhJTkYsSU5GKSBDKE4sTikKKyAgICAgIEMoSU5GLC1JTkYpIEMoSU5GLC0wLikgQyhJTkYsLTAuKSBDKElORiwwLikgQyhJTkYsMC4pIEMoSU5GLElORikgQyhJTkYsTikKKyAgICAgIEMoSU5GLC1JTkYpIEMoTixOKSAgICAgQyhOLE4pICAgICBDKE4sTikgICAgQyhOLE4pICAgIEMoSU5GLElORikgQyhOLE4pCisgICAgfSkKIAotCUlOSVRfU1BFQ0lBTF9WQUxVRVModGFuaF9zcGVjaWFsX3ZhbHVlcywgewotCSAgQygtMS4sMC4pIEMoVSxVKSBDKC0xLiwtMC4pIEMoLTEuLDAuKSBDKFUsVSkgQygtMS4sMC4pIEMoLTEuLDAuKQotCSAgQyhOLE4pICAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgQyhOLE4pICAgIEMoTixOKQotCSAgQyhOLE4pICAgIEMoVSxVKSBDKC0wLiwtMC4pIEMoLTAuLDAuKSBDKFUsVSkgQyhOLE4pICAgIEMoTixOKQotCSAgQyhOLE4pICAgIEMoVSxVKSBDKDAuLC0wLikgIEMoMC4sMC4pICBDKFUsVSkgQyhOLE4pICAgIEMoTixOKQotCSAgQyhOLE4pICAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgQyhOLE4pICAgIEMoTixOKQotCSAgQygxLiwwLikgIEMoVSxVKSBDKDEuLC0wLikgIEMoMS4sMC4pICBDKFUsVSkgQygxLiwwLikgIEMoMS4sMC4pCi0JICBDKE4sTikgICAgQyhOLE4pIEMoTiwtMC4pICAgQyhOLDAuKSAgIEMoTixOKSBDKE4sTikgICAgQyhOLE4pCi0JfSkKKyAgICBJTklUX1NQRUNJQUxfVkFMVUVTKHRhbmhfc3BlY2lhbF92YWx1ZXMsIHsKKyAgICAgIEMoLTEuLDAuKSBDKFUsVSkgQygtMS4sLTAuKSBDKC0xLiwwLikgQyhVLFUpIEMoLTEuLDAuKSBDKC0xLiwwLikKKyAgICAgIEMoTixOKSAgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpIEMoTixOKSAgICBDKE4sTikKKyAgICAgIEMoTixOKSAgICBDKFUsVSkgQygtMC4sLTAuKSBDKC0wLiwwLikgQyhVLFUpIEMoTixOKSAgICBDKE4sTikKKyAgICAgIEMoTixOKSAgICBDKFUsVSkgQygwLiwtMC4pICBDKDAuLDAuKSAgQyhVLFUpIEMoTixOKSAgICBDKE4sTikKKyAgICAgIEMoTixOKSAgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpIEMoTixOKSAgICBDKE4sTikKKyAgICAgIEMoMS4sMC4pICBDKFUsVSkgQygxLiwtMC4pICBDKDEuLDAuKSAgQyhVLFUpIEMoMS4sMC4pICBDKDEuLDAuKQorICAgICAgQyhOLE4pICAgIEMoTixOKSBDKE4sLTAuKSAgIEMoTiwwLikgICBDKE4sTikgQyhOLE4pICAgIEMoTixOKQorICAgIH0pCiAKLQlJTklUX1NQRUNJQUxfVkFMVUVTKHJlY3Rfc3BlY2lhbF92YWx1ZXMsIHsKLQkgIEMoSU5GLE4pIEMoVSxVKSBDKC1JTkYsMC4pIEMoLUlORiwtMC4pIEMoVSxVKSBDKElORixOKSBDKElORixOKQotCSAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQotCSAgQygwLiwwLikgQyhVLFUpIEMoLTAuLDAuKSAgQygtMC4sLTAuKSAgQyhVLFUpIEMoMC4sMC4pIEMoMC4sMC4pCi0JICBDKDAuLDAuKSBDKFUsVSkgQygwLiwtMC4pICBDKDAuLDAuKSAgICBDKFUsVSkgQygwLiwwLikgQygwLiwwLikKLQkgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKLQkgIEMoSU5GLE4pIEMoVSxVKSBDKElORiwtMC4pIEMoSU5GLDAuKSAgIEMoVSxVKSBDKElORixOKSBDKElORixOKQotCSAgQyhOLE4pICAgQyhOLE4pIEMoTiwwLikgICAgQyhOLDAuKSAgICAgQyhOLE4pIEMoTixOKSAgIEMoTixOKQotCX0pCisgICAgSU5JVF9TUEVDSUFMX1ZBTFVFUyhyZWN0X3NwZWNpYWxfdmFsdWVzLCB7CisgICAgICBDKElORixOKSBDKFUsVSkgQygtSU5GLDAuKSBDKC1JTkYsLTAuKSBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKKyAgICAgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKKyAgICAgIEMoMC4sMC4pIEMoVSxVKSBDKC0wLiwwLikgIEMoLTAuLC0wLikgIEMoVSxVKSBDKDAuLDAuKSBDKDAuLDAuKQorICAgICAgQygwLiwwLikgQyhVLFUpIEMoMC4sLTAuKSAgQygwLiwwLikgICAgQyhVLFUpIEMoMC4sMC4pIEMoMC4sMC4pCisgICAgICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCisgICAgICBDKElORixOKSBDKFUsVSkgQyhJTkYsLTAuKSBDKElORiwwLikgICBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKKyAgICAgIEMoTixOKSAgIEMoTixOKSBDKE4sMC4pICAgIEMoTiwwLikgICAgIEMoTixOKSBDKE4sTikgICBDKE4sTikKKyAgICB9KQogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jcnlwdG1vZHVsZS5jIGIvTW9kdWxlcy9jcnlwdG1vZHVsZS5jCmluZGV4IDYzNzdmODQuLjc2ZGU1NGYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY3J5cHRtb2R1bGUuYworKysgYi9Nb2R1bGVzL2NyeXB0bW9kdWxlLmMKQEAgLTE0LDE3ICsxNCwxNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKmNyeXB0X2NyeXB0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICp3b3JkLCAqc2FsdDsgCisgICAgY2hhciAqd29yZCwgKnNhbHQ7CiAjaWZuZGVmIF9fVk1TCi0JZXh0ZXJuIGNoYXIgKiBjcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisgICAgZXh0ZXJuIGNoYXIgKiBjcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CiAjZW5kaWYKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6Y3J5cHQiLCAmd29yZCwgJnNhbHQpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBPbiBzb21lIHBsYXRmb3JtcyAoQXRoZU9TKSBjcnlwdCByZXR1cm5zIE5VTEwgZm9yIGFuIGludmFsaWQKLQkgICBzYWx0LiBSZXR1cm4gTm9uZSBpbiB0aGF0IGNhc2UuIFhYWCBNYXliZSByYWlzZSBhbiBleGNlcHRpb24/ICAqLwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJzIiwgY3J5cHQod29yZCwgc2FsdCkpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6Y3J5cHQiLCAmd29yZCwgJnNhbHQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBPbiBzb21lIHBsYXRmb3JtcyAoQXRoZU9TKSBjcnlwdCByZXR1cm5zIE5VTEwgZm9yIGFuIGludmFsaWQKKyAgICAgICBzYWx0LiBSZXR1cm4gTm9uZSBpbiB0aGF0IGNhc2UuIFhYWCBNYXliZSByYWlzZSBhbiBleGNlcHRpb24/ICAqLworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJzIiwgY3J5cHQod29yZCwgc2FsdCkpOwogCiB9CiAKQEAgLTM4LDEyICszOCwxMiBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjcnlwdF9tZXRob2RzW10gPSB7Ci0JeyJjcnlwdCIsCWNyeXB0X2NyeXB0LCBNRVRIX1ZBUkFSR1MsIGNyeXB0X2NyeXB0X19kb2NfX30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImNyeXB0IiwgICAgICAgICAgIGNyeXB0X2NyeXB0LCBNRVRIX1ZBUkFSR1MsIGNyeXB0X2NyeXB0X19kb2NfX30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0Y3J5cHQodm9pZCkKIHsKLQlQeV9Jbml0TW9kdWxlKCJjcnlwdCIsIGNyeXB0X21ldGhvZHMpOworICAgIFB5X0luaXRNb2R1bGUoImNyeXB0IiwgY3J5cHRfbWV0aG9kcyk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMKaW5kZXggNzEwNWM2OS4uYzgxZjZiYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9kYXRldGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvZGF0ZXRpbWVtb2R1bGUuYwpAQCAtMjcsNyArMjcsNyBAQAogICogZmluYWwgcmVzdWx0IGZpdHMgaW4gYSBDIGludCAodGhpcyBjYW4gYmUgYW4gaXNzdWUgb24gNjQtYml0IGJveGVzKS4KICAqLwogI2lmIFNJWkVPRl9JTlQgPCA0Ci0jCWVycm9yICJkYXRldGltZS5jIHJlcXVpcmVzIHRoYXQgQyBpbnQgaGF2ZSBhdCBsZWFzdCAzMiBiaXRzIgorIyAgICAgICBlcnJvciAiZGF0ZXRpbWUuYyByZXF1aXJlcyB0aGF0IEMgaW50IGhhdmUgYXQgbGVhc3QgMzIgYml0cyIKICNlbmRpZgogCiAjZGVmaW5lIE1JTllFQVIgMQpAQCAtNDEsNTkgKzQxLDU5IEBACiAjZGVmaW5lIE1BWF9ERUxUQV9EQVlTIDk5OTk5OTk5OQogCiAvKiBSZW5hbWUgdGhlIGxvbmcgbWFjcm9zIGluIGRhdGV0aW1lLmggdG8gbW9yZSByZWFzb25hYmxlIHNob3J0IG5hbWVzLiAqLwotI2RlZmluZSBHRVRfWUVBUgkJUHlEYXRlVGltZV9HRVRfWUVBUgotI2RlZmluZSBHRVRfTU9OVEgJCVB5RGF0ZVRpbWVfR0VUX01PTlRICi0jZGVmaW5lIEdFVF9EQVkJCQlQeURhdGVUaW1lX0dFVF9EQVkKLSNkZWZpbmUgREFURV9HRVRfSE9VUgkJUHlEYXRlVGltZV9EQVRFX0dFVF9IT1VSCi0jZGVmaW5lIERBVEVfR0VUX01JTlVURQkJUHlEYXRlVGltZV9EQVRFX0dFVF9NSU5VVEUKLSNkZWZpbmUgREFURV9HRVRfU0VDT05ECQlQeURhdGVUaW1lX0RBVEVfR0VUX1NFQ09ORAotI2RlZmluZSBEQVRFX0dFVF9NSUNST1NFQ09ORAlQeURhdGVUaW1lX0RBVEVfR0VUX01JQ1JPU0VDT05ECisjZGVmaW5lIEdFVF9ZRUFSICAgICAgICAgICAgICAgIFB5RGF0ZVRpbWVfR0VUX1lFQVIKKyNkZWZpbmUgR0VUX01PTlRIICAgICAgICAgICAgICAgUHlEYXRlVGltZV9HRVRfTU9OVEgKKyNkZWZpbmUgR0VUX0RBWSAgICAgICAgICAgICAgICAgUHlEYXRlVGltZV9HRVRfREFZCisjZGVmaW5lIERBVEVfR0VUX0hPVVIgICAgICAgICAgIFB5RGF0ZVRpbWVfREFURV9HRVRfSE9VUgorI2RlZmluZSBEQVRFX0dFVF9NSU5VVEUgICAgICAgICBQeURhdGVUaW1lX0RBVEVfR0VUX01JTlVURQorI2RlZmluZSBEQVRFX0dFVF9TRUNPTkQgICAgICAgICBQeURhdGVUaW1lX0RBVEVfR0VUX1NFQ09ORAorI2RlZmluZSBEQVRFX0dFVF9NSUNST1NFQ09ORCAgICBQeURhdGVUaW1lX0RBVEVfR0VUX01JQ1JPU0VDT05ECiAKIC8qIERhdGUgYWNjZXNzb3JzIGZvciBkYXRlIGFuZCBkYXRldGltZS4gKi8KLSNkZWZpbmUgU0VUX1lFQVIobywgdikJCSgoKG8pLT5kYXRhWzBdID0gKCh2KSAmIDB4ZmYwMCkgPj4gOCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobyktPmRhdGFbMV0gPSAoKHYpICYgMHgwMGZmKSkpCi0jZGVmaW5lIFNFVF9NT05USChvLCB2KQkJKFB5RGF0ZVRpbWVfR0VUX01PTlRIKG8pID0gKHYpKQotI2RlZmluZSBTRVRfREFZKG8sIHYpCQkoUHlEYXRlVGltZV9HRVRfREFZKG8pID0gKHYpKQorI2RlZmluZSBTRVRfWUVBUihvLCB2KSAgICAgICAgICAoKChvKS0+ZGF0YVswXSA9ICgodikgJiAweGZmMDApID4+IDgpLCBcCisgICAgICAgICAgICAgICAgICgobyktPmRhdGFbMV0gPSAoKHYpICYgMHgwMGZmKSkpCisjZGVmaW5lIFNFVF9NT05USChvLCB2KSAgICAgICAgIChQeURhdGVUaW1lX0dFVF9NT05USChvKSA9ICh2KSkKKyNkZWZpbmUgU0VUX0RBWShvLCB2KSAgICAgICAgICAgKFB5RGF0ZVRpbWVfR0VUX0RBWShvKSA9ICh2KSkKIAogLyogRGF0ZS9UaW1lIGFjY2Vzc29ycyBmb3IgZGF0ZXRpbWUuICovCi0jZGVmaW5lIERBVEVfU0VUX0hPVVIobywgdikJKFB5RGF0ZVRpbWVfREFURV9HRVRfSE9VUihvKSA9ICh2KSkKLSNkZWZpbmUgREFURV9TRVRfTUlOVVRFKG8sIHYpCShQeURhdGVUaW1lX0RBVEVfR0VUX01JTlVURShvKSA9ICh2KSkKLSNkZWZpbmUgREFURV9TRVRfU0VDT05EKG8sIHYpCShQeURhdGVUaW1lX0RBVEVfR0VUX1NFQ09ORChvKSA9ICh2KSkKLSNkZWZpbmUgREFURV9TRVRfTUlDUk9TRUNPTkQobywgdikJXAotCSgoKG8pLT5kYXRhWzddID0gKCh2KSAmIDB4ZmYwMDAwKSA+PiAxNiksIFwKLSAgICAgICAgICgobyktPmRhdGFbOF0gPSAoKHYpICYgMHgwMGZmMDApID4+IDgpLCBcCi0gICAgICAgICAoKG8pLT5kYXRhWzldID0gKCh2KSAmIDB4MDAwMGZmKSkpCisjZGVmaW5lIERBVEVfU0VUX0hPVVIobywgdikgICAgIChQeURhdGVUaW1lX0RBVEVfR0VUX0hPVVIobykgPSAodikpCisjZGVmaW5lIERBVEVfU0VUX01JTlVURShvLCB2KSAgIChQeURhdGVUaW1lX0RBVEVfR0VUX01JTlVURShvKSA9ICh2KSkKKyNkZWZpbmUgREFURV9TRVRfU0VDT05EKG8sIHYpICAgKFB5RGF0ZVRpbWVfREFURV9HRVRfU0VDT05EKG8pID0gKHYpKQorI2RlZmluZSBEQVRFX1NFVF9NSUNST1NFQ09ORChvLCB2KSAgICAgIFwKKyAgICAoKChvKS0+ZGF0YVs3XSA9ICgodikgJiAweGZmMDAwMCkgPj4gMTYpLCBcCisgICAgICgobyktPmRhdGFbOF0gPSAoKHYpICYgMHgwMGZmMDApID4+IDgpLCBcCisgICAgICgobyktPmRhdGFbOV0gPSAoKHYpICYgMHgwMDAwZmYpKSkKIAogLyogVGltZSBhY2Nlc3NvcnMgZm9yIHRpbWUuICovCi0jZGVmaW5lIFRJTUVfR0VUX0hPVVIJCVB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUgotI2RlZmluZSBUSU1FX0dFVF9NSU5VVEUJCVB5RGF0ZVRpbWVfVElNRV9HRVRfTUlOVVRFCi0jZGVmaW5lIFRJTUVfR0VUX1NFQ09ORAkJUHlEYXRlVGltZV9USU1FX0dFVF9TRUNPTkQKLSNkZWZpbmUgVElNRV9HRVRfTUlDUk9TRUNPTkQJUHlEYXRlVGltZV9USU1FX0dFVF9NSUNST1NFQ09ORAotI2RlZmluZSBUSU1FX1NFVF9IT1VSKG8sIHYpCShQeURhdGVUaW1lX1RJTUVfR0VUX0hPVVIobykgPSAodikpCi0jZGVmaW5lIFRJTUVfU0VUX01JTlVURShvLCB2KQkoUHlEYXRlVGltZV9USU1FX0dFVF9NSU5VVEUobykgPSAodikpCi0jZGVmaW5lIFRJTUVfU0VUX1NFQ09ORChvLCB2KQkoUHlEYXRlVGltZV9USU1FX0dFVF9TRUNPTkQobykgPSAodikpCi0jZGVmaW5lIFRJTUVfU0VUX01JQ1JPU0VDT05EKG8sIHYpCVwKLQkoKChvKS0+ZGF0YVszXSA9ICgodikgJiAweGZmMDAwMCkgPj4gMTYpLCBcCi0gICAgICAgICAoKG8pLT5kYXRhWzRdID0gKCh2KSAmIDB4MDBmZjAwKSA+PiA4KSwgXAotICAgICAgICAgKChvKS0+ZGF0YVs1XSA9ICgodikgJiAweDAwMDBmZikpKQorI2RlZmluZSBUSU1FX0dFVF9IT1VSICAgICAgICAgICBQeURhdGVUaW1lX1RJTUVfR0VUX0hPVVIKKyNkZWZpbmUgVElNRV9HRVRfTUlOVVRFICAgICAgICAgUHlEYXRlVGltZV9USU1FX0dFVF9NSU5VVEUKKyNkZWZpbmUgVElNRV9HRVRfU0VDT05EICAgICAgICAgUHlEYXRlVGltZV9USU1FX0dFVF9TRUNPTkQKKyNkZWZpbmUgVElNRV9HRVRfTUlDUk9TRUNPTkQgICAgUHlEYXRlVGltZV9USU1FX0dFVF9NSUNST1NFQ09ORAorI2RlZmluZSBUSU1FX1NFVF9IT1VSKG8sIHYpICAgICAoUHlEYXRlVGltZV9USU1FX0dFVF9IT1VSKG8pID0gKHYpKQorI2RlZmluZSBUSU1FX1NFVF9NSU5VVEUobywgdikgICAoUHlEYXRlVGltZV9USU1FX0dFVF9NSU5VVEUobykgPSAodikpCisjZGVmaW5lIFRJTUVfU0VUX1NFQ09ORChvLCB2KSAgIChQeURhdGVUaW1lX1RJTUVfR0VUX1NFQ09ORChvKSA9ICh2KSkKKyNkZWZpbmUgVElNRV9TRVRfTUlDUk9TRUNPTkQobywgdikgICAgICBcCisgICAgKCgobyktPmRhdGFbM10gPSAoKHYpICYgMHhmZjAwMDApID4+IDE2KSwgXAorICAgICAoKG8pLT5kYXRhWzRdID0gKCh2KSAmIDB4MDBmZjAwKSA+PiA4KSwgXAorICAgICAoKG8pLT5kYXRhWzVdID0gKCh2KSAmIDB4MDAwMGZmKSkpCiAKIC8qIERlbHRhIGFjY2Vzc29ycyBmb3IgdGltZWRlbHRhLiAqLwotI2RlZmluZSBHRVRfVERfREFZUyhvKQkJKCgoUHlEYXRlVGltZV9EZWx0YSAqKShvKSktPmRheXMpCi0jZGVmaW5lIEdFVF9URF9TRUNPTkRTKG8pCSgoKFB5RGF0ZVRpbWVfRGVsdGEgKikobykpLT5zZWNvbmRzKQotI2RlZmluZSBHRVRfVERfTUlDUk9TRUNPTkRTKG8pCSgoKFB5RGF0ZVRpbWVfRGVsdGEgKikobykpLT5taWNyb3NlY29uZHMpCisjZGVmaW5lIEdFVF9URF9EQVlTKG8pICAgICAgICAgICgoKFB5RGF0ZVRpbWVfRGVsdGEgKikobykpLT5kYXlzKQorI2RlZmluZSBHRVRfVERfU0VDT05EUyhvKSAgICAgICAoKChQeURhdGVUaW1lX0RlbHRhICopKG8pKS0+c2Vjb25kcykKKyNkZWZpbmUgR0VUX1REX01JQ1JPU0VDT05EUyhvKSAgKCgoUHlEYXRlVGltZV9EZWx0YSAqKShvKSktPm1pY3Jvc2Vjb25kcykKIAotI2RlZmluZSBTRVRfVERfREFZUyhvLCB2KQkoKG8pLT5kYXlzID0gKHYpKQotI2RlZmluZSBTRVRfVERfU0VDT05EUyhvLCB2KQkoKG8pLT5zZWNvbmRzID0gKHYpKQorI2RlZmluZSBTRVRfVERfREFZUyhvLCB2KSAgICAgICAoKG8pLT5kYXlzID0gKHYpKQorI2RlZmluZSBTRVRfVERfU0VDT05EUyhvLCB2KSAgICAoKG8pLT5zZWNvbmRzID0gKHYpKQogI2RlZmluZSBTRVRfVERfTUlDUk9TRUNPTkRTKG8sIHYpICgobyktPm1pY3Jvc2Vjb25kcyA9ICh2KSkKIAogLyogcCBpcyBhIHBvaW50ZXIgdG8gYSB0aW1lIG9yIGEgZGF0ZXRpbWUgb2JqZWN0OyBIQVNUWklORk8ocCkgcmV0dXJucwogICogcC0+aGFzdHppbmZvLgogICovCi0jZGVmaW5lIEhBU1RaSU5GTyhwKQkJKCgoX1B5RGF0ZVRpbWVfQmFzZVRaSW5mbyAqKShwKSktPmhhc3R6aW5mbykKKyNkZWZpbmUgSEFTVFpJTkZPKHApICAgICAgICAgICAgKCgoX1B5RGF0ZVRpbWVfQmFzZVRaSW5mbyAqKShwKSktPmhhc3R6aW5mbykKIAogLyogTSBpcyBhIGNoYXIgb3IgaW50IGNsYWltaW5nIHRvIGJlIGEgdmFsaWQgbW9udGguICBUaGUgbWFjcm8gaXMgZXF1aXZhbGVudAogICogdG8gdGhlIHR3by1zaWRlZCBQeXRob24gdGVzdAotICoJMSA8PSBNIDw9IDEyCisgKiAgICAgIDEgPD0gTSA8PSAxMgogICovCiAjZGVmaW5lIE1PTlRIX0lTX1NBTkUoTSkgKCh1bnNpZ25lZCBpbnQpKE0pIC0gMSA8IDEyKQogCkBAIC0xMTMsNyArMTEzLDcgQEAKICAqIGlmZiAoa15pKSYoa15qKSBoYXMgc2lnbiBiaXQgc2V0LgogICovCiAjZGVmaW5lIFNJR05FRF9BRERfT1ZFUkZMT1dFRChSRVNVTFQsIEksIEopIFwKLQkoKCgoUkVTVUxUKSBeIChJKSkgJiAoKFJFU1VMVCkgXiAoSikpKSA8IDApCisgICAgKCgoKFJFU1VMVCkgXiAoSSkpICYgKChSRVNVTFQpIF4gKEopKSkgPCAwKQogCiAvKiBDb21wdXRlIFB5dGhvbiBkaXZtb2QoeCwgeSksIHJldHVybmluZyB0aGUgcXVvdGllbnQgYW5kIHN0b3JpbmcgdGhlCiAgKiByZW1haW5kZXIgaW50byAqci4gIFRoZSBxdW90aWVudCBpcyB0aGUgZmxvb3Igb2YgeC95LCBhbmQgdGhhdCdzCkBAIC0xMjcsMTcgKzEyNywxNyBAQAogc3RhdGljIGludAogZGl2bW9kKGludCB4LCBpbnQgeSwgaW50ICpyKQogewotCWludCBxdW87CisgICAgaW50IHF1bzsKIAotCWFzc2VydCh5ID4gMCk7Ci0JcXVvID0geCAvIHk7Ci0JKnIgPSB4IC0gcXVvICogeTsKLQlpZiAoKnIgPCAwKSB7Ci0JCS0tcXVvOwotCQkqciArPSB5OwotCX0KLQlhc3NlcnQoMCA8PSAqciAmJiAqciA8IHkpOwotCXJldHVybiBxdW87CisgICAgYXNzZXJ0KHkgPiAwKTsKKyAgICBxdW8gPSB4IC8geTsKKyAgICAqciA9IHggLSBxdW8gKiB5OworICAgIGlmICgqciA8IDApIHsKKyAgICAgICAgLS1xdW87CisgICAgICAgICpyICs9IHk7CisgICAgfQorICAgIGFzc2VydCgwIDw9ICpyICYmICpyIDwgeSk7CisgICAgcmV0dXJuIHF1bzsKIH0KIAogLyogUm91bmQgYSBkb3VibGUgdG8gdGhlIG5lYXJlc3QgbG9uZy4gIHx4fCBtdXN0IGJlIHNtYWxsIGVub3VnaCB0byBmaXQKQEAgLTE0NiwxMSArMTQ2LDExIEBACiBzdGF0aWMgbG9uZwogcm91bmRfdG9fbG9uZyhkb3VibGUgeCkKIHsKLQlpZiAoeCA+PSAwLjApCi0JCXggPSBmbG9vcih4ICsgMC41KTsKLQllbHNlCi0JCXggPSBjZWlsKHggLSAwLjUpOwotCXJldHVybiAobG9uZyl4OworICAgIGlmICh4ID49IDAuMCkKKyAgICAgICAgeCA9IGZsb29yKHggKyAwLjUpOworICAgIGVsc2UKKyAgICAgICAgeCA9IGNlaWwoeCAtIDAuNSk7CisgICAgcmV0dXJuIChsb25nKXg7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTYyLDUyICsxNjIsNTIgQEAKICAqIGFyZSBjb3JyZWN0IGZvciBub24tbGVhcCB5ZWFycyBvbmx5LgogICovCiBzdGF0aWMgaW50IF9kYXlzX2luX21vbnRoW10gPSB7Ci0JMCwgLyogdW51c2VkOyB0aGlzIHZlY3RvciB1c2VzIDEtYmFzZWQgaW5kZXhpbmcgKi8KLQkzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCisgICAgMCwgLyogdW51c2VkOyB0aGlzIHZlY3RvciB1c2VzIDEtYmFzZWQgaW5kZXhpbmcgKi8KKyAgICAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCiB9OwogCiBzdGF0aWMgaW50IF9kYXlzX2JlZm9yZV9tb250aFtdID0gewotCTAsIC8qIHVudXNlZDsgdGhpcyB2ZWN0b3IgdXNlcyAxLWJhc2VkIGluZGV4aW5nICovCi0JMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQKKyAgICAwLCAvKiB1bnVzZWQ7IHRoaXMgdmVjdG9yIHVzZXMgMS1iYXNlZCBpbmRleGluZyAqLworICAgIDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0CiB9OwogCiAvKiB5ZWFyIC0+IDEgaWYgbGVhcCB5ZWFyLCBlbHNlIDAuICovCiBzdGF0aWMgaW50CiBpc19sZWFwKGludCB5ZWFyKQogewotCS8qIENhc3QgeWVhciB0byB1bnNpZ25lZC4gIFRoZSByZXN1bHQgaXMgdGhlIHNhbWUgZWl0aGVyIHdheSwgYnV0Ci0JICogQyBjYW4gZ2VuZXJhdGUgZmFzdGVyIGNvZGUgZm9yIHVuc2lnbmVkIG1vZCB0aGFuIGZvciBzaWduZWQKLQkgKiBtb2QgKGVzcGVjaWFsbHkgZm9yICUgNCAtLSBhIGdvb2QgY29tcGlsZXIgc2hvdWxkIGp1c3QgZ3JhYgotCSAqIHRoZSBsYXN0IDIgYml0cyB3aGVuIHRoZSBMSFMgaXMgdW5zaWduZWQpLgotCSAqLwotCWNvbnN0IHVuc2lnbmVkIGludCBheWVhciA9ICh1bnNpZ25lZCBpbnQpeWVhcjsKLQlyZXR1cm4gYXllYXIgJSA0ID09IDAgJiYgKGF5ZWFyICUgMTAwICE9IDAgfHwgYXllYXIgJSA0MDAgPT0gMCk7CisgICAgLyogQ2FzdCB5ZWFyIHRvIHVuc2lnbmVkLiAgVGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBlaXRoZXIgd2F5LCBidXQKKyAgICAgKiBDIGNhbiBnZW5lcmF0ZSBmYXN0ZXIgY29kZSBmb3IgdW5zaWduZWQgbW9kIHRoYW4gZm9yIHNpZ25lZAorICAgICAqIG1vZCAoZXNwZWNpYWxseSBmb3IgJSA0IC0tIGEgZ29vZCBjb21waWxlciBzaG91bGQganVzdCBncmFiCisgICAgICogdGhlIGxhc3QgMiBiaXRzIHdoZW4gdGhlIExIUyBpcyB1bnNpZ25lZCkuCisgICAgICovCisgICAgY29uc3QgdW5zaWduZWQgaW50IGF5ZWFyID0gKHVuc2lnbmVkIGludCl5ZWFyOworICAgIHJldHVybiBheWVhciAlIDQgPT0gMCAmJiAoYXllYXIgJSAxMDAgIT0gMCB8fCBheWVhciAlIDQwMCA9PSAwKTsKIH0KIAogLyogeWVhciwgbW9udGggLT4gbnVtYmVyIG9mIGRheXMgaW4gdGhhdCBtb250aCBpbiB0aGF0IHllYXIgKi8KIHN0YXRpYyBpbnQKIGRheXNfaW5fbW9udGgoaW50IHllYXIsIGludCBtb250aCkKIHsKLQlhc3NlcnQobW9udGggPj0gMSk7Ci0JYXNzZXJ0KG1vbnRoIDw9IDEyKTsKLQlpZiAobW9udGggPT0gMiAmJiBpc19sZWFwKHllYXIpKQotCQlyZXR1cm4gMjk7Ci0JZWxzZQotCQlyZXR1cm4gX2RheXNfaW5fbW9udGhbbW9udGhdOworICAgIGFzc2VydChtb250aCA+PSAxKTsKKyAgICBhc3NlcnQobW9udGggPD0gMTIpOworICAgIGlmIChtb250aCA9PSAyICYmIGlzX2xlYXAoeWVhcikpCisgICAgICAgIHJldHVybiAyOTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBfZGF5c19pbl9tb250aFttb250aF07CiB9CiAKIC8qIHllYXIsIG1vbnRoIC0+IG51bWJlciBvZiBkYXlzIGluIHllYXIgcHJlY2VlZGluZyBmaXJzdCBkYXkgb2YgbW9udGggKi8KIHN0YXRpYyBpbnQKIGRheXNfYmVmb3JlX21vbnRoKGludCB5ZWFyLCBpbnQgbW9udGgpCiB7Ci0JaW50IGRheXM7CisgICAgaW50IGRheXM7CiAKLQlhc3NlcnQobW9udGggPj0gMSk7Ci0JYXNzZXJ0KG1vbnRoIDw9IDEyKTsKLQlkYXlzID0gX2RheXNfYmVmb3JlX21vbnRoW21vbnRoXTsKLQlpZiAobW9udGggPiAyICYmIGlzX2xlYXAoeWVhcikpCi0JCSsrZGF5czsKLQlyZXR1cm4gZGF5czsKKyAgICBhc3NlcnQobW9udGggPj0gMSk7CisgICAgYXNzZXJ0KG1vbnRoIDw9IDEyKTsKKyAgICBkYXlzID0gX2RheXNfYmVmb3JlX21vbnRoW21vbnRoXTsKKyAgICBpZiAobW9udGggPiAyICYmIGlzX2xlYXAoeWVhcikpCisgICAgICAgICsrZGF5czsKKyAgICByZXR1cm4gZGF5czsKIH0KIAogLyogeWVhciAtPiBudW1iZXIgb2YgZGF5cyBiZWZvcmUgSmFudWFyeSAxc3Qgb2YgeWVhci4gIFJlbWVtYmVyIHRoYXQgd2UKQEAgLTIxNiwxMjQgKzIxNiwxMjQgQEAKIHN0YXRpYyBpbnQKIGRheXNfYmVmb3JlX3llYXIoaW50IHllYXIpCiB7Ci0JaW50IHkgPSB5ZWFyIC0gMTsKLQkvKiBUaGlzIGlzIGluY29ycmVjdCBpZiB5ZWFyIDw9IDA7IHdlIHJlYWxseSB3YW50IHRoZSBmbG9vcgotCSAqIGhlcmUuICBCdXQgc28gbG9uZyBhcyBNSU5ZRUFSIGlzIDEsIHRoZSBzbWFsbGVzdCB5ZWFyIHRoaXMKLQkgKiBjYW4gc2VlIGlzIDAgKHRoaXMgY2FuIGhhcHBlbiBpbiBzb21lIG5vcm1hbGl6YXRpb24gZW5kY2FzZXMpLAotCSAqIHNvIHdlJ2xsIGp1c3Qgc3BlY2lhbC1jYXNlIHRoYXQuCi0JICovCi0JYXNzZXJ0ICh5ZWFyID49IDApOwotCWlmICh5ID49IDApCi0JCXJldHVybiB5KjM2NSArIHkvNCAtIHkvMTAwICsgeS80MDA7Ci0JZWxzZSB7Ci0JCWFzc2VydCh5ID09IC0xKTsKLQkJcmV0dXJuIC0zNjY7Ci0JfQorICAgIGludCB5ID0geWVhciAtIDE7CisgICAgLyogVGhpcyBpcyBpbmNvcnJlY3QgaWYgeWVhciA8PSAwOyB3ZSByZWFsbHkgd2FudCB0aGUgZmxvb3IKKyAgICAgKiBoZXJlLiAgQnV0IHNvIGxvbmcgYXMgTUlOWUVBUiBpcyAxLCB0aGUgc21hbGxlc3QgeWVhciB0aGlzCisgICAgICogY2FuIHNlZSBpcyAwICh0aGlzIGNhbiBoYXBwZW4gaW4gc29tZSBub3JtYWxpemF0aW9uIGVuZGNhc2VzKSwKKyAgICAgKiBzbyB3ZSdsbCBqdXN0IHNwZWNpYWwtY2FzZSB0aGF0LgorICAgICAqLworICAgIGFzc2VydCAoeWVhciA+PSAwKTsKKyAgICBpZiAoeSA+PSAwKQorICAgICAgICByZXR1cm4geSozNjUgKyB5LzQgLSB5LzEwMCArIHkvNDAwOworICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoeSA9PSAtMSk7CisgICAgICAgIHJldHVybiAtMzY2OworICAgIH0KIH0KIAogLyogTnVtYmVyIG9mIGRheXMgaW4gNCwgMTAwLCBhbmQgNDAwIHllYXIgY3ljbGVzLiAgVGhhdCB0aGVzZSBoYXZlCiAgKiB0aGUgY29ycmVjdCB2YWx1ZXMgaXMgYXNzZXJ0ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uLgogICovCi0jZGVmaW5lIERJNFkJMTQ2MQkvKiBkYXlzX2JlZm9yZV95ZWFyKDUpOyBkYXlzIGluIDQgeWVhcnMgKi8KLSNkZWZpbmUgREkxMDBZCTM2NTI0CS8qIGRheXNfYmVmb3JlX3llYXIoMTAxKTsgZGF5cyBpbiAxMDAgeWVhcnMgKi8KLSNkZWZpbmUgREk0MDBZCTE0NjA5NwkvKiBkYXlzX2JlZm9yZV95ZWFyKDQwMSk7IGRheXMgaW4gNDAwIHllYXJzICAqLworI2RlZmluZSBESTRZICAgIDE0NjEgICAgLyogZGF5c19iZWZvcmVfeWVhcig1KTsgZGF5cyBpbiA0IHllYXJzICovCisjZGVmaW5lIERJMTAwWSAgMzY1MjQgICAvKiBkYXlzX2JlZm9yZV95ZWFyKDEwMSk7IGRheXMgaW4gMTAwIHllYXJzICovCisjZGVmaW5lIERJNDAwWSAgMTQ2MDk3ICAvKiBkYXlzX2JlZm9yZV95ZWFyKDQwMSk7IGRheXMgaW4gNDAwIHllYXJzICAqLwogCiAvKiBvcmRpbmFsIC0+IHllYXIsIG1vbnRoLCBkYXksIGNvbnNpZGVyaW5nIDAxLUphbi0wMDAxIGFzIGRheSAxLiAqLwogc3RhdGljIHZvaWQKIG9yZF90b195bWQoaW50IG9yZGluYWwsIGludCAqeWVhciwgaW50ICptb250aCwgaW50ICpkYXkpCiB7Ci0JaW50IG4sIG4xLCBuNCwgbjEwMCwgbjQwMCwgbGVhcHllYXIsIHByZWNlZGluZzsKKyAgICBpbnQgbiwgbjEsIG40LCBuMTAwLCBuNDAwLCBsZWFweWVhciwgcHJlY2VkaW5nOwogCi0JLyogb3JkaW5hbCBpcyBhIDEtYmFzZWQgaW5kZXgsIHN0YXJ0aW5nIGF0IDEtSmFuLTEuICBUaGUgcGF0dGVybiBvZgotCSAqIGxlYXAgeWVhcnMgcmVwZWF0cyBleGFjdGx5IGV2ZXJ5IDQwMCB5ZWFycy4gIFRoZSBiYXNpYyBzdHJhdGVneSBpcwotCSAqIHRvIGZpbmQgdGhlIGNsb3Nlc3QgNDAwLXllYXIgYm91bmRhcnkgYXQgb3IgYmVmb3JlIG9yZGluYWwsIHRoZW4KLQkgKiB3b3JrIHdpdGggdGhlIG9mZnNldCBmcm9tIHRoYXQgYm91bmRhcnkgdG8gb3JkaW5hbC4gIExpZmUgaXMgbXVjaAotCSAqIGNsZWFyZXIgaWYgd2Ugc3VidHJhY3QgMSBmcm9tIG9yZGluYWwgZmlyc3QgLS0gdGhlbiB0aGUgdmFsdWVzCi0JICogb2Ygb3JkaW5hbCBhdCA0MDAteWVhciBib3VuZGFyaWVzIGFyZSBleGFjdGx5IHRob3NlIGRpdmlzaWJsZQotCSAqIGJ5IERJNDAwWToKLQkgKgotCSAqICAgIEQgIE0gICBZICAgICAgICAgICAgbiAgICAgICAgICAgICAgbi0xCi0JICogICAgLS0gLS0tIC0tLS0gICAgICAgIC0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0KLQkgKiAgICAzMSBEZWMgLTQwMCAgICAgICAgLURJNDAwWSAgICAgICAtREk0MDBZIC0xCi0JICogICAgIDEgSmFuIC0zOTkgICAgICAgICAtREk0MDBZICsxICAgLURJNDAwWSAgICAgIDQwMC15ZWFyIGJvdW5kYXJ5Ci0JICogICAgLi4uCi0JICogICAgMzAgRGVjICAwMDAgICAgICAgIC0xICAgICAgICAgICAgIC0yCi0JICogICAgMzEgRGVjICAwMDAgICAgICAgICAwICAgICAgICAgICAgIC0xCi0JICogICAgIDEgSmFuICAwMDEgICAgICAgICAxICAgICAgICAgICAgICAwICAgICAgICAgIDQwMC15ZWFyIGJvdW5kYXJ5Ci0JICogICAgIDIgSmFuICAwMDEgICAgICAgICAyICAgICAgICAgICAgICAxCi0JICogICAgIDMgSmFuICAwMDEgICAgICAgICAzICAgICAgICAgICAgICAyCi0JICogICAgLi4uCi0JICogICAgMzEgRGVjICA0MDAgICAgICAgICBESTQwMFkgICAgICAgIERJNDAwWSAtMQotCSAqICAgICAxIEphbiAgNDAxICAgICAgICAgREk0MDBZICsxICAgICBESTQwMFkgICAgICA0MDAteWVhciBib3VuZGFyeQotCSAqLwotCWFzc2VydChvcmRpbmFsID49IDEpOwotCS0tb3JkaW5hbDsKLQluNDAwID0gb3JkaW5hbCAvIERJNDAwWTsKLQluID0gb3JkaW5hbCAlIERJNDAwWTsKLQkqeWVhciA9IG40MDAgKiA0MDAgKyAxOworICAgIC8qIG9yZGluYWwgaXMgYSAxLWJhc2VkIGluZGV4LCBzdGFydGluZyBhdCAxLUphbi0xLiAgVGhlIHBhdHRlcm4gb2YKKyAgICAgKiBsZWFwIHllYXJzIHJlcGVhdHMgZXhhY3RseSBldmVyeSA0MDAgeWVhcnMuICBUaGUgYmFzaWMgc3RyYXRlZ3kgaXMKKyAgICAgKiB0byBmaW5kIHRoZSBjbG9zZXN0IDQwMC15ZWFyIGJvdW5kYXJ5IGF0IG9yIGJlZm9yZSBvcmRpbmFsLCB0aGVuCisgICAgICogd29yayB3aXRoIHRoZSBvZmZzZXQgZnJvbSB0aGF0IGJvdW5kYXJ5IHRvIG9yZGluYWwuICBMaWZlIGlzIG11Y2gKKyAgICAgKiBjbGVhcmVyIGlmIHdlIHN1YnRyYWN0IDEgZnJvbSBvcmRpbmFsIGZpcnN0IC0tIHRoZW4gdGhlIHZhbHVlcworICAgICAqIG9mIG9yZGluYWwgYXQgNDAwLXllYXIgYm91bmRhcmllcyBhcmUgZXhhY3RseSB0aG9zZSBkaXZpc2libGUKKyAgICAgKiBieSBESTQwMFk6CisgICAgICoKKyAgICAgKiAgICBEICBNICAgWSAgICAgICAgICAgIG4gICAgICAgICAgICAgIG4tMQorICAgICAqICAgIC0tIC0tLSAtLS0tICAgICAgICAtLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tCisgICAgICogICAgMzEgRGVjIC00MDAgICAgICAgIC1ESTQwMFkgICAgICAgLURJNDAwWSAtMQorICAgICAqICAgICAxIEphbiAtMzk5ICAgICAgICAgLURJNDAwWSArMSAgIC1ESTQwMFkgICAgICA0MDAteWVhciBib3VuZGFyeQorICAgICAqICAgIC4uLgorICAgICAqICAgIDMwIERlYyAgMDAwICAgICAgICAtMSAgICAgICAgICAgICAtMgorICAgICAqICAgIDMxIERlYyAgMDAwICAgICAgICAgMCAgICAgICAgICAgICAtMQorICAgICAqICAgICAxIEphbiAgMDAxICAgICAgICAgMSAgICAgICAgICAgICAgMCAgICAgICAgICA0MDAteWVhciBib3VuZGFyeQorICAgICAqICAgICAyIEphbiAgMDAxICAgICAgICAgMiAgICAgICAgICAgICAgMQorICAgICAqICAgICAzIEphbiAgMDAxICAgICAgICAgMyAgICAgICAgICAgICAgMgorICAgICAqICAgIC4uLgorICAgICAqICAgIDMxIERlYyAgNDAwICAgICAgICAgREk0MDBZICAgICAgICBESTQwMFkgLTEKKyAgICAgKiAgICAgMSBKYW4gIDQwMSAgICAgICAgIERJNDAwWSArMSAgICAgREk0MDBZICAgICAgNDAwLXllYXIgYm91bmRhcnkKKyAgICAgKi8KKyAgICBhc3NlcnQob3JkaW5hbCA+PSAxKTsKKyAgICAtLW9yZGluYWw7CisgICAgbjQwMCA9IG9yZGluYWwgLyBESTQwMFk7CisgICAgbiA9IG9yZGluYWwgJSBESTQwMFk7CisgICAgKnllYXIgPSBuNDAwICogNDAwICsgMTsKIAotCS8qIE5vdyBuIGlzIHRoZSAobm9uLW5lZ2F0aXZlKSBvZmZzZXQsIGluIGRheXMsIGZyb20gSmFudWFyeSAxIG9mCi0JICogeWVhciwgdG8gdGhlIGRlc2lyZWQgZGF0ZS4gIE5vdyBjb21wdXRlIGhvdyBtYW55IDEwMC15ZWFyIGN5Y2xlcwotCSAqIHByZWNlZGUgbi4KLQkgKiBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgbjEwMCB0byBlcXVhbCA0ISAgSW4gdGhhdCBjYXNlIDQgZnVsbAotCSAqIDEwMC15ZWFyIGN5Y2xlcyBwcmVjZWRlIHRoZSBkZXNpcmVkIGRheSwgd2hpY2ggaW1wbGllcyB0aGUKLQkgKiBkZXNpcmVkIGRheSBpcyBEZWNlbWJlciAzMSBhdCB0aGUgZW5kIG9mIGEgNDAwLXllYXIgY3ljbGUuCi0JICovCi0JbjEwMCA9IG4gLyBESTEwMFk7Ci0JbiA9IG4gJSBESTEwMFk7CisgICAgLyogTm93IG4gaXMgdGhlIChub24tbmVnYXRpdmUpIG9mZnNldCwgaW4gZGF5cywgZnJvbSBKYW51YXJ5IDEgb2YKKyAgICAgKiB5ZWFyLCB0byB0aGUgZGVzaXJlZCBkYXRlLiAgTm93IGNvbXB1dGUgaG93IG1hbnkgMTAwLXllYXIgY3ljbGVzCisgICAgICogcHJlY2VkZSBuLgorICAgICAqIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvciBuMTAwIHRvIGVxdWFsIDQhICBJbiB0aGF0IGNhc2UgNCBmdWxsCisgICAgICogMTAwLXllYXIgY3ljbGVzIHByZWNlZGUgdGhlIGRlc2lyZWQgZGF5LCB3aGljaCBpbXBsaWVzIHRoZQorICAgICAqIGRlc2lyZWQgZGF5IGlzIERlY2VtYmVyIDMxIGF0IHRoZSBlbmQgb2YgYSA0MDAteWVhciBjeWNsZS4KKyAgICAgKi8KKyAgICBuMTAwID0gbiAvIERJMTAwWTsKKyAgICBuID0gbiAlIERJMTAwWTsKIAotCS8qIE5vdyBjb21wdXRlIGhvdyBtYW55IDQteWVhciBjeWNsZXMgcHJlY2VkZSBpdC4gKi8KLQluNCA9IG4gLyBESTRZOwotCW4gPSBuICUgREk0WTsKKyAgICAvKiBOb3cgY29tcHV0ZSBob3cgbWFueSA0LXllYXIgY3ljbGVzIHByZWNlZGUgaXQuICovCisgICAgbjQgPSBuIC8gREk0WTsKKyAgICBuID0gbiAlIERJNFk7CiAKLQkvKiBBbmQgbm93IGhvdyBtYW55IHNpbmdsZSB5ZWFycy4gIEFnYWluIG4xIGNhbiBiZSA0LCBhbmQgYWdhaW4KLQkgKiBtZWFuaW5nIHRoYXQgdGhlIGRlc2lyZWQgZGF5IGlzIERlY2VtYmVyIDMxIGF0IHRoZSBlbmQgb2YgdGhlCi0JICogNC15ZWFyIGN5Y2xlLgotCSAqLwotCW4xID0gbiAvIDM2NTsKLQluID0gbiAlIDM2NTsKKyAgICAvKiBBbmQgbm93IGhvdyBtYW55IHNpbmdsZSB5ZWFycy4gIEFnYWluIG4xIGNhbiBiZSA0LCBhbmQgYWdhaW4KKyAgICAgKiBtZWFuaW5nIHRoYXQgdGhlIGRlc2lyZWQgZGF5IGlzIERlY2VtYmVyIDMxIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICogNC15ZWFyIGN5Y2xlLgorICAgICAqLworICAgIG4xID0gbiAvIDM2NTsKKyAgICBuID0gbiAlIDM2NTsKIAotCSp5ZWFyICs9IG4xMDAgKiAxMDAgKyBuNCAqIDQgKyBuMTsKLQlpZiAobjEgPT0gNCB8fCBuMTAwID09IDQpIHsKLQkJYXNzZXJ0KG4gPT0gMCk7Ci0JCSp5ZWFyIC09IDE7Ci0JCSptb250aCA9IDEyOwotCQkqZGF5ID0gMzE7Ci0JCXJldHVybjsKLQl9CisgICAgKnllYXIgKz0gbjEwMCAqIDEwMCArIG40ICogNCArIG4xOworICAgIGlmIChuMSA9PSA0IHx8IG4xMDAgPT0gNCkgeworICAgICAgICBhc3NlcnQobiA9PSAwKTsKKyAgICAgICAgKnllYXIgLT0gMTsKKyAgICAgICAgKm1vbnRoID0gMTI7CisgICAgICAgICpkYXkgPSAzMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCS8qIE5vdyB0aGUgeWVhciBpcyBjb3JyZWN0LCBhbmQgbiBpcyB0aGUgb2Zmc2V0IGZyb20gSmFudWFyeSAxLiAgV2UKLQkgKiBmaW5kIHRoZSBtb250aCB2aWEgYW4gZXN0aW1hdGUgdGhhdCdzIGVpdGhlciBleGFjdCBvciBvbmUgdG9vCi0JICogbGFyZ2UuCi0JICovCi0JbGVhcHllYXIgPSBuMSA9PSAzICYmIChuNCAhPSAyNCB8fCBuMTAwID09IDMpOwotCWFzc2VydChsZWFweWVhciA9PSBpc19sZWFwKCp5ZWFyKSk7Ci0JKm1vbnRoID0gKG4gKyA1MCkgPj4gNTsKLQlwcmVjZWRpbmcgPSAoX2RheXNfYmVmb3JlX21vbnRoWyptb250aF0gKyAoKm1vbnRoID4gMiAmJiBsZWFweWVhcikpOwotCWlmIChwcmVjZWRpbmcgPiBuKSB7Ci0JCS8qIGVzdGltYXRlIGlzIHRvbyBsYXJnZSAqLwotCQkqbW9udGggLT0gMTsKLQkJcHJlY2VkaW5nIC09IGRheXNfaW5fbW9udGgoKnllYXIsICptb250aCk7Ci0JfQotCW4gLT0gcHJlY2VkaW5nOwotCWFzc2VydCgwIDw9IG4pOwotCWFzc2VydChuIDwgZGF5c19pbl9tb250aCgqeWVhciwgKm1vbnRoKSk7CisgICAgLyogTm93IHRoZSB5ZWFyIGlzIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSBKYW51YXJ5IDEuICBXZQorICAgICAqIGZpbmQgdGhlIG1vbnRoIHZpYSBhbiBlc3RpbWF0ZSB0aGF0J3MgZWl0aGVyIGV4YWN0IG9yIG9uZSB0b28KKyAgICAgKiBsYXJnZS4KKyAgICAgKi8KKyAgICBsZWFweWVhciA9IG4xID09IDMgJiYgKG40ICE9IDI0IHx8IG4xMDAgPT0gMyk7CisgICAgYXNzZXJ0KGxlYXB5ZWFyID09IGlzX2xlYXAoKnllYXIpKTsKKyAgICAqbW9udGggPSAobiArIDUwKSA+PiA1OworICAgIHByZWNlZGluZyA9IChfZGF5c19iZWZvcmVfbW9udGhbKm1vbnRoXSArICgqbW9udGggPiAyICYmIGxlYXB5ZWFyKSk7CisgICAgaWYgKHByZWNlZGluZyA+IG4pIHsKKyAgICAgICAgLyogZXN0aW1hdGUgaXMgdG9vIGxhcmdlICovCisgICAgICAgICptb250aCAtPSAxOworICAgICAgICBwcmVjZWRpbmcgLT0gZGF5c19pbl9tb250aCgqeWVhciwgKm1vbnRoKTsKKyAgICB9CisgICAgbiAtPSBwcmVjZWRpbmc7CisgICAgYXNzZXJ0KDAgPD0gbik7CisgICAgYXNzZXJ0KG4gPCBkYXlzX2luX21vbnRoKCp5ZWFyLCAqbW9udGgpKTsKIAotCSpkYXkgPSBuICsgMTsKKyAgICAqZGF5ID0gbiArIDE7CiB9CiAKIC8qIHllYXIsIG1vbnRoLCBkYXkgLT4gb3JkaW5hbCwgY29uc2lkZXJpbmcgMDEtSmFuLTAwMDEgYXMgZGF5IDEuICovCiBzdGF0aWMgaW50CiB5bWRfdG9fb3JkKGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXkpCiB7Ci0JcmV0dXJuIGRheXNfYmVmb3JlX3llYXIoeWVhcikgKyBkYXlzX2JlZm9yZV9tb250aCh5ZWFyLCBtb250aCkgKyBkYXk7CisgICAgcmV0dXJuIGRheXNfYmVmb3JlX3llYXIoeWVhcikgKyBkYXlzX2JlZm9yZV9tb250aCh5ZWFyLCBtb250aCkgKyBkYXk7CiB9CiAKIC8qIERheSBvZiB3ZWVrLCB3aGVyZSBNb25kYXk9PTAsIC4uLiwgU3VuZGF5PT02LiAgMS8xLzEgd2FzIGEgTW9uZGF5LiAqLwogc3RhdGljIGludAogd2Vla2RheShpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KQogewotCXJldHVybiAoeW1kX3RvX29yZCh5ZWFyLCBtb250aCwgZGF5KSArIDYpICUgNzsKKyAgICByZXR1cm4gKHltZF90b19vcmQoeWVhciwgbW9udGgsIGRheSkgKyA2KSAlIDc7CiB9CiAKIC8qIE9yZGluYWwgb2YgdGhlIE1vbmRheSBzdGFydGluZyB3ZWVrIDEgb2YgdGhlIElTTyB5ZWFyLiAgV2VlayAxIGlzIHRoZQpAQCAtMzQyLDE1ICszNDIsMTUgQEAKIHN0YXRpYyBpbnQKIGlzb193ZWVrMV9tb25kYXkoaW50IHllYXIpCiB7Ci0JaW50IGZpcnN0X2RheSA9IHltZF90b19vcmQoeWVhciwgMSwgMSk7CS8qIG9yZCBvZiAxLzEgKi8KLQkvKiAwIGlmIDEvMSBpcyBhIE1vbmRheSwgMSBpZiBhIFR1ZSwgZXRjLiAqLwotCWludCBmaXJzdF93ZWVrZGF5ID0gKGZpcnN0X2RheSArIDYpICUgNzsKLQkvKiBvcmRpbmFsIG9mIGNsb3Nlc3QgTW9uZGF5IGF0IG9yIGJlZm9yZSAxLzEgKi8KLQlpbnQgd2VlazFfbW9uZGF5ICA9IGZpcnN0X2RheSAtIGZpcnN0X3dlZWtkYXk7CisgICAgaW50IGZpcnN0X2RheSA9IHltZF90b19vcmQoeWVhciwgMSwgMSk7ICAgICAvKiBvcmQgb2YgMS8xICovCisgICAgLyogMCBpZiAxLzEgaXMgYSBNb25kYXksIDEgaWYgYSBUdWUsIGV0Yy4gKi8KKyAgICBpbnQgZmlyc3Rfd2Vla2RheSA9IChmaXJzdF9kYXkgKyA2KSAlIDc7CisgICAgLyogb3JkaW5hbCBvZiBjbG9zZXN0IE1vbmRheSBhdCBvciBiZWZvcmUgMS8xICovCisgICAgaW50IHdlZWsxX21vbmRheSAgPSBmaXJzdF9kYXkgLSBmaXJzdF93ZWVrZGF5OwogCi0JaWYgKGZpcnN0X3dlZWtkYXkgPiAzKQkvKiBpZiAxLzEgd2FzIEZyaSwgU2F0LCBTdW4gKi8KLQkJd2VlazFfbW9uZGF5ICs9IDc7Ci0JcmV0dXJuIHdlZWsxX21vbmRheTsKKyAgICBpZiAoZmlyc3Rfd2Vla2RheSA+IDMpICAgICAgLyogaWYgMS8xIHdhcyBGcmksIFNhdCwgU3VuICovCisgICAgICAgIHdlZWsxX21vbmRheSArPSA3OworICAgIHJldHVybiB3ZWVrMV9tb25kYXk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzYzLDEyICszNjMsMTIgQEAKIHN0YXRpYyBpbnQKIGNoZWNrX2RlbHRhX2RheV9yYW5nZShpbnQgZGF5cykKIHsKLQlpZiAoLU1BWF9ERUxUQV9EQVlTIDw9IGRheXMgJiYgZGF5cyA8PSBNQVhfREVMVEFfREFZUykKLQkJcmV0dXJuIDA7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCSAgICAgImRheXM9JWQ7IG11c3QgaGF2ZSBtYWduaXR1ZGUgPD0gJWQiLAotCQkgICAgIGRheXMsIE1BWF9ERUxUQV9EQVlTKTsKLQlyZXR1cm4gLTE7CisgICAgaWYgKC1NQVhfREVMVEFfREFZUyA8PSBkYXlzICYmIGRheXMgPD0gTUFYX0RFTFRBX0RBWVMpCisgICAgICAgIHJldHVybiAwOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAiZGF5cz0lZDsgbXVzdCBoYXZlIG1hZ25pdHVkZSA8PSAlZCIsCisgICAgICAgICAgICAgICAgIGRheXMsIE1BWF9ERUxUQV9EQVlTKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIENoZWNrIHRoYXQgZGF0ZSBhcmd1bWVudHMgYXJlIGluIHJhbmdlLiAgUmV0dXJuIDAgaWYgdGhleSBhcmUuICBJZiB0aGV5CkBAIC0zNzgsMjIgKzM3OCwyMiBAQAogY2hlY2tfZGF0ZV9hcmdzKGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXkpCiB7CiAKLQlpZiAoeWVhciA8IE1JTllFQVIgfHwgeWVhciA+IE1BWFlFQVIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInllYXIgaXMgb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKG1vbnRoIDwgMSB8fCBtb250aCA+IDEyKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJtb250aCBtdXN0IGJlIGluIDEuLjEyIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGRheSA8IDEgfHwgZGF5ID4gZGF5c19pbl9tb250aCh5ZWFyLCBtb250aCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImRheSBpcyBvdXQgb2YgcmFuZ2UgZm9yIG1vbnRoIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKHllYXIgPCBNSU5ZRUFSIHx8IHllYXIgPiBNQVhZRUFSKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInllYXIgaXMgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG1vbnRoIDwgMSB8fCBtb250aCA+IDEyKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1vbnRoIG11c3QgYmUgaW4gMS4uMTIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoZGF5IDwgMSB8fCBkYXkgPiBkYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYXkgaXMgb3V0IG9mIHJhbmdlIGZvciBtb250aCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBDaGVjayB0aGF0IHRpbWUgYXJndW1lbnRzIGFyZSBpbiByYW5nZS4gIFJldHVybiAwIGlmIHRoZXkgYXJlLiAgSWYgdGhleQpAQCAtNDAyLDI3ICs0MDIsMjcgQEAKIHN0YXRpYyBpbnQKIGNoZWNrX3RpbWVfYXJncyhpbnQgaCwgaW50IG0sIGludCBzLCBpbnQgdXMpCiB7Ci0JaWYgKGggPCAwIHx8IGggPiAyMykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiaG91ciBtdXN0IGJlIGluIDAuLjIzIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKG0gPCAwIHx8IG0gPiA1OSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibWludXRlIG11c3QgYmUgaW4gMC4uNTkiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocyA8IDAgfHwgcyA+IDU5KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzZWNvbmQgbXVzdCBiZSBpbiAwLi41OSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICh1cyA8IDAgfHwgdXMgPiA5OTk5OTkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm1pY3Jvc2Vjb25kIG11c3QgYmUgaW4gMC4uOTk5OTk5Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKGggPCAwIHx8IGggPiAyMykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJob3VyIG11c3QgYmUgaW4gMC4uMjMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobSA8IDAgfHwgbSA+IDU5KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1pbnV0ZSBtdXN0IGJlIGluIDAuLjU5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHMgPCAwIHx8IHMgPiA1OSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZWNvbmQgbXVzdCBiZSBpbiAwLi41OSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh1cyA8IDAgfHwgdXMgPiA5OTk5OTkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWljcm9zZWNvbmQgbXVzdCBiZSBpbiAwLi45OTk5OTkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MzgsMTA5ICs0MzgsMTA5IEBACiBzdGF0aWMgdm9pZAogbm9ybWFsaXplX3BhaXIoaW50ICpoaSwgaW50ICpsbywgaW50IGZhY3RvcikKIHsKLQlhc3NlcnQoZmFjdG9yID4gMCk7Ci0JYXNzZXJ0KGxvICE9IGhpKTsKLQlpZiAoKmxvIDwgMCB8fCAqbG8gPj0gZmFjdG9yKSB7Ci0JCWNvbnN0IGludCBudW1faGkgPSBkaXZtb2QoKmxvLCBmYWN0b3IsIGxvKTsKLQkJY29uc3QgaW50IG5ld19oaSA9ICpoaSArIG51bV9oaTsKLQkJYXNzZXJ0KCEgU0lHTkVEX0FERF9PVkVSRkxPV0VEKG5ld19oaSwgKmhpLCBudW1faGkpKTsKLQkJKmhpID0gbmV3X2hpOwotCX0KLQlhc3NlcnQoMCA8PSAqbG8gJiYgKmxvIDwgZmFjdG9yKTsKKyAgICBhc3NlcnQoZmFjdG9yID4gMCk7CisgICAgYXNzZXJ0KGxvICE9IGhpKTsKKyAgICBpZiAoKmxvIDwgMCB8fCAqbG8gPj0gZmFjdG9yKSB7CisgICAgICAgIGNvbnN0IGludCBudW1faGkgPSBkaXZtb2QoKmxvLCBmYWN0b3IsIGxvKTsKKyAgICAgICAgY29uc3QgaW50IG5ld19oaSA9ICpoaSArIG51bV9oaTsKKyAgICAgICAgYXNzZXJ0KCEgU0lHTkVEX0FERF9PVkVSRkxPV0VEKG5ld19oaSwgKmhpLCBudW1faGkpKTsKKyAgICAgICAgKmhpID0gbmV3X2hpOworICAgIH0KKyAgICBhc3NlcnQoMCA8PSAqbG8gJiYgKmxvIDwgZmFjdG9yKTsKIH0KIAogLyogRmlkZGxlIGRheXMgKGQpLCBzZWNvbmRzIChzKSwgYW5kIG1pY3Jvc2Vjb25kcyAodXMpIHNvIHRoYXQKLSAqIAkwIDw9ICpzIDwgMjQqMzYwMAotICogCTAgPD0gKnVzIDwgMTAwMDAwMAorICogICAgICAwIDw9ICpzIDwgMjQqMzYwMAorICogICAgICAwIDw9ICp1cyA8IDEwMDAwMDAKICAqIFRoZSBpbnB1dCB2YWx1ZXMgbXVzdCBiZSBzdWNoIHRoYXQgdGhlIGludGVybmFscyBkb24ndCBvdmVyZmxvdy4KICAqIFRoZSB3YXkgdGhpcyByb3V0aW5lIGlzIHVzZWQsIHdlIGRvbid0IGdldCBjbG9zZS4KICAqLwogc3RhdGljIHZvaWQKIG5vcm1hbGl6ZV9kX3NfdXMoaW50ICpkLCBpbnQgKnMsIGludCAqdXMpCiB7Ci0JaWYgKCp1cyA8IDAgfHwgKnVzID49IDEwMDAwMDApIHsKLQkJbm9ybWFsaXplX3BhaXIocywgdXMsIDEwMDAwMDApOwotCQkvKiB8c3wgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gYWJvdXQKLQkJICogfG9yaWdpbmFsIHN8ICsgfG9yaWdpbmFsIHVzfC8xMDAwMDAwIG5vdy4KLQkJICovCisgICAgaWYgKCp1cyA8IDAgfHwgKnVzID49IDEwMDAwMDApIHsKKyAgICAgICAgbm9ybWFsaXplX3BhaXIocywgdXMsIDEwMDAwMDApOworICAgICAgICAvKiB8c3wgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gYWJvdXQKKyAgICAgICAgICogfG9yaWdpbmFsIHN8ICsgfG9yaWdpbmFsIHVzfC8xMDAwMDAwIG5vdy4KKyAgICAgICAgICovCiAKLQl9Ci0JaWYgKCpzIDwgMCB8fCAqcyA+PSAyNCozNjAwKSB7Ci0JCW5vcm1hbGl6ZV9wYWlyKGQsIHMsIDI0KjM2MDApOwotCQkvKiB8ZHwgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gYWJvdXQKLQkJICogfG9yaWdpbmFsIGR8ICsKLQkJICogKHxvcmlnaW5hbCBzfCArIHxvcmlnaW5hbCB1c3wvMTAwMDAwMCkgLyAoMjQqMzYwMCkgbm93LgotCQkgKi8KLQl9Ci0JYXNzZXJ0KDAgPD0gKnMgJiYgKnMgPCAyNCozNjAwKTsKLQlhc3NlcnQoMCA8PSAqdXMgJiYgKnVzIDwgMTAwMDAwMCk7CisgICAgfQorICAgIGlmICgqcyA8IDAgfHwgKnMgPj0gMjQqMzYwMCkgeworICAgICAgICBub3JtYWxpemVfcGFpcihkLCBzLCAyNCozNjAwKTsKKyAgICAgICAgLyogfGR8IGNhbid0IGJlIGJpZ2dlciB0aGFuIGFib3V0CisgICAgICAgICAqIHxvcmlnaW5hbCBkfCArCisgICAgICAgICAqICh8b3JpZ2luYWwgc3wgKyB8b3JpZ2luYWwgdXN8LzEwMDAwMDApIC8gKDI0KjM2MDApIG5vdy4KKyAgICAgICAgICovCisgICAgfQorICAgIGFzc2VydCgwIDw9ICpzICYmICpzIDwgMjQqMzYwMCk7CisgICAgYXNzZXJ0KDAgPD0gKnVzICYmICp1cyA8IDEwMDAwMDApOwogfQogCiAvKiBGaWRkbGUgeWVhcnMgKHkpLCBtb250aHMgKG0pLCBhbmQgZGF5cyAoZCkgc28gdGhhdAotICogCTEgPD0gKm0gPD0gMTIKLSAqIAkxIDw9ICpkIDw9IGRheXNfaW5fbW9udGgoKnksICptKQorICogICAgICAxIDw9ICptIDw9IDEyCisgKiAgICAgIDEgPD0gKmQgPD0gZGF5c19pbl9tb250aCgqeSwgKm0pCiAgKiBUaGUgaW5wdXQgdmFsdWVzIG11c3QgYmUgc3VjaCB0aGF0IHRoZSBpbnRlcm5hbHMgZG9uJ3Qgb3ZlcmZsb3cuCiAgKiBUaGUgd2F5IHRoaXMgcm91dGluZSBpcyB1c2VkLCB3ZSBkb24ndCBnZXQgY2xvc2UuCiAgKi8KIHN0YXRpYyB2b2lkCiBub3JtYWxpemVfeV9tX2QoaW50ICp5LCBpbnQgKm0sIGludCAqZCkKIHsKLQlpbnQgZGltOwkvKiAjIG9mIGRheXMgaW4gbW9udGggKi8KKyAgICBpbnQgZGltOyAgICAgICAgICAgIC8qICMgb2YgZGF5cyBpbiBtb250aCAqLwogCi0JLyogVGhpcyBnZXRzIG11ZGR5OiAgdGhlIHByb3BlciByYW5nZSBmb3IgZGF5IGNhbid0IGJlIGRldGVybWluZWQKLQkgKiB3aXRob3V0IGtub3dpbmcgdGhlIGNvcnJlY3QgbW9udGggYW5kIHllYXIsIGJ1dCBpZiBkYXkgaXMsIGUuZy4sCi0JICogcGx1cyBvciBtaW51cyBhIG1pbGxpb24sIHRoZSBjdXJyZW50IG1vbnRoIGFuZCB5ZWFyIHZhbHVlcyBtYWtlCi0JICogbm8gc2Vuc2UgKGFuZCBtYXkgYWxzbyBiZSBvdXQgb2YgYm91bmRzIHRoZW1zZWx2ZXMpLgotCSAqIFNheWluZyAxMiBtb250aHMgPT0gMSB5ZWFyIHNob3VsZCBiZSBub24tY29udHJvdmVyc2lhbC4KLQkgKi8KLQlpZiAoKm0gPCAxIHx8ICptID4gMTIpIHsKLQkJLS0qbTsKLQkJbm9ybWFsaXplX3BhaXIoeSwgbSwgMTIpOwotCQkrKyptOwotCQkvKiB8eXwgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gYWJvdXQKLQkJICogfG9yaWdpbmFsIHl8ICsgfG9yaWdpbmFsIG18LzEyIG5vdy4KLQkJICovCi0JfQotCWFzc2VydCgxIDw9ICptICYmICptIDw9IDEyKTsKKyAgICAvKiBUaGlzIGdldHMgbXVkZHk6ICB0aGUgcHJvcGVyIHJhbmdlIGZvciBkYXkgY2FuJ3QgYmUgZGV0ZXJtaW5lZAorICAgICAqIHdpdGhvdXQga25vd2luZyB0aGUgY29ycmVjdCBtb250aCBhbmQgeWVhciwgYnV0IGlmIGRheSBpcywgZS5nLiwKKyAgICAgKiBwbHVzIG9yIG1pbnVzIGEgbWlsbGlvbiwgdGhlIGN1cnJlbnQgbW9udGggYW5kIHllYXIgdmFsdWVzIG1ha2UKKyAgICAgKiBubyBzZW5zZSAoYW5kIG1heSBhbHNvIGJlIG91dCBvZiBib3VuZHMgdGhlbXNlbHZlcykuCisgICAgICogU2F5aW5nIDEyIG1vbnRocyA9PSAxIHllYXIgc2hvdWxkIGJlIG5vbi1jb250cm92ZXJzaWFsLgorICAgICAqLworICAgIGlmICgqbSA8IDEgfHwgKm0gPiAxMikgeworICAgICAgICAtLSptOworICAgICAgICBub3JtYWxpemVfcGFpcih5LCBtLCAxMik7CisgICAgICAgICsrKm07CisgICAgICAgIC8qIHx5fCBjYW4ndCBiZSBiaWdnZXIgdGhhbiBhYm91dAorICAgICAgICAgKiB8b3JpZ2luYWwgeXwgKyB8b3JpZ2luYWwgbXwvMTIgbm93LgorICAgICAgICAgKi8KKyAgICB9CisgICAgYXNzZXJ0KDEgPD0gKm0gJiYgKm0gPD0gMTIpOwogCi0JLyogTm93IG9ubHkgZGF5IGNhbiBiZSBvdXQgb2YgYm91bmRzICh5ZWFyIG1heSBhbHNvIGJlIG91dCBvZiBib3VuZHMKLQkgKiBmb3IgYSBkYXRldGltZSBvYmplY3QsIGJ1dCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoYXQgaGVyZSkuCi0JICogSWYgZGF5IGlzIG91dCBvZiBib3VuZHMsIHdoYXQgdG8gZG8gaXMgYXJndWFibGUsIGJ1dCBhdCBsZWFzdCB0aGUKLQkgKiBtZXRob2QgaGVyZSBpcyBwcmluY2lwbGVkIGFuZCBleHBsYWluYWJsZS4KLQkgKi8KLQlkaW0gPSBkYXlzX2luX21vbnRoKCp5LCAqbSk7Ci0JaWYgKCpkIDwgMSB8fCAqZCA+IGRpbSkgewotCQkvKiBNb3ZlIGRheS0xIGRheXMgZnJvbSB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoLiAgRmlyc3QgdHJ5IHRvCi0JCSAqIGdldCBvZmYgY2hlYXAgaWYgd2UncmUgb25seSBvbmUgZGF5IG91dCBvZiByYW5nZQotCQkgKiAoYWRqdXN0bWVudHMgZm9yIHRpbWV6b25lIGFsb25lIGNhbid0IGJlIHdvcnNlIHRoYW4gdGhhdCkuCi0JCSAqLwotCQlpZiAoKmQgPT0gMCkgewotCQkJLS0qbTsKLQkJCWlmICgqbSA+IDApCi0JCQkJKmQgPSBkYXlzX2luX21vbnRoKCp5LCAqbSk7Ci0JCQllbHNlIHsKLQkJCQktLSp5OwotCQkJCSptID0gMTI7Ci0JCQkJKmQgPSAzMTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgqZCA9PSBkaW0gKyAxKSB7Ci0JCQkvKiBtb3ZlIGZvcndhcmQgYSBkYXkgKi8KLQkJCSsrKm07Ci0JCQkqZCA9IDE7Ci0JCQlpZiAoKm0gPiAxMikgewotCQkJCSptID0gMTsKLQkJCQkrKyp5OwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaW50IG9yZGluYWwgPSB5bWRfdG9fb3JkKCp5LCAqbSwgMSkgKwotCQkJCQkJICAqZCAtIDE7Ci0JCQlvcmRfdG9feW1kKG9yZGluYWwsIHksIG0sIGQpOwotCQl9Ci0JfQotCWFzc2VydCgqbSA+IDApOwotCWFzc2VydCgqZCA+IDApOworICAgIC8qIE5vdyBvbmx5IGRheSBjYW4gYmUgb3V0IG9mIGJvdW5kcyAoeWVhciBtYXkgYWxzbyBiZSBvdXQgb2YgYm91bmRzCisgICAgICogZm9yIGEgZGF0ZXRpbWUgb2JqZWN0LCBidXQgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0IGhlcmUpLgorICAgICAqIElmIGRheSBpcyBvdXQgb2YgYm91bmRzLCB3aGF0IHRvIGRvIGlzIGFyZ3VhYmxlLCBidXQgYXQgbGVhc3QgdGhlCisgICAgICogbWV0aG9kIGhlcmUgaXMgcHJpbmNpcGxlZCBhbmQgZXhwbGFpbmFibGUuCisgICAgICovCisgICAgZGltID0gZGF5c19pbl9tb250aCgqeSwgKm0pOworICAgIGlmICgqZCA8IDEgfHwgKmQgPiBkaW0pIHsKKyAgICAgICAgLyogTW92ZSBkYXktMSBkYXlzIGZyb20gdGhlIGZpcnN0IG9mIHRoZSBtb250aC4gIEZpcnN0IHRyeSB0bworICAgICAgICAgKiBnZXQgb2ZmIGNoZWFwIGlmIHdlJ3JlIG9ubHkgb25lIGRheSBvdXQgb2YgcmFuZ2UKKyAgICAgICAgICogKGFkanVzdG1lbnRzIGZvciB0aW1lem9uZSBhbG9uZSBjYW4ndCBiZSB3b3JzZSB0aGFuIHRoYXQpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCpkID09IDApIHsKKyAgICAgICAgICAgIC0tKm07CisgICAgICAgICAgICBpZiAoKm0gPiAwKQorICAgICAgICAgICAgICAgICpkID0gZGF5c19pbl9tb250aCgqeSwgKm0pOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLS0qeTsKKyAgICAgICAgICAgICAgICAqbSA9IDEyOworICAgICAgICAgICAgICAgICpkID0gMzE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKmQgPT0gZGltICsgMSkgeworICAgICAgICAgICAgLyogbW92ZSBmb3J3YXJkIGEgZGF5ICovCisgICAgICAgICAgICArKyptOworICAgICAgICAgICAgKmQgPSAxOworICAgICAgICAgICAgaWYgKCptID4gMTIpIHsKKyAgICAgICAgICAgICAgICAqbSA9IDE7CisgICAgICAgICAgICAgICAgKysqeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBvcmRpbmFsID0geW1kX3RvX29yZCgqeSwgKm0sIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmQgLSAxOworICAgICAgICAgICAgb3JkX3RvX3ltZChvcmRpbmFsLCB5LCBtLCBkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoKm0gPiAwKTsKKyAgICBhc3NlcnQoKmQgPiAwKTsKIH0KIAogLyogRmlkZGxlIG91dC1vZi1ib3VuZHMgbW9udGhzIGFuZCBkYXlzIHNvIHRoYXQgdGhlIHJlc3VsdCBtYWtlcyBzb21lIGtpbmQKQEAgLTU1MCwxNyArNTUwLDE3IEBACiBzdGF0aWMgaW50CiBub3JtYWxpemVfZGF0ZShpbnQgKnllYXIsIGludCAqbW9udGgsIGludCAqZGF5KQogewotCWludCByZXN1bHQ7CisgICAgaW50IHJlc3VsdDsKIAotCW5vcm1hbGl6ZV95X21fZCh5ZWFyLCBtb250aCwgZGF5KTsKLQlpZiAoTUlOWUVBUiA8PSAqeWVhciAmJiAqeWVhciA8PSBNQVhZRUFSKQotCQlyZXN1bHQgPSAwOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkiZGF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJcmVzdWx0ID0gLTE7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgbm9ybWFsaXplX3lfbV9kKHllYXIsIG1vbnRoLCBkYXkpOworICAgIGlmIChNSU5ZRUFSIDw9ICp5ZWFyICYmICp5ZWFyIDw9IE1BWFlFQVIpCisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRhdGUgdmFsdWUgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJlc3VsdCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBGb3JjZSBhbGwgdGhlIGRhdGV0aW1lIGZpZWxkcyBpbnRvIHJhbmdlLiAgVGhlIHBhcmFtZXRlcnMgYXJlIGJvdGgKQEAgLTU3MSwxMSArNTcxLDExIEBACiAgICAgICAgICAgICAgICAgICAgaW50ICpob3VyLCBpbnQgKm1pbnV0ZSwgaW50ICpzZWNvbmQsCiAgICAgICAgICAgICAgICAgICAgaW50ICptaWNyb3NlY29uZCkKIHsKLQlub3JtYWxpemVfcGFpcihzZWNvbmQsIG1pY3Jvc2Vjb25kLCAxMDAwMDAwKTsKLQlub3JtYWxpemVfcGFpcihtaW51dGUsIHNlY29uZCwgNjApOwotCW5vcm1hbGl6ZV9wYWlyKGhvdXIsIG1pbnV0ZSwgNjApOwotCW5vcm1hbGl6ZV9wYWlyKGRheSwgaG91ciwgMjQpOwotCXJldHVybiBub3JtYWxpemVfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KTsKKyAgICBub3JtYWxpemVfcGFpcihzZWNvbmQsIG1pY3Jvc2Vjb25kLCAxMDAwMDAwKTsKKyAgICBub3JtYWxpemVfcGFpcihtaW51dGUsIHNlY29uZCwgNjApOworICAgIG5vcm1hbGl6ZV9wYWlyKGhvdXIsIG1pbnV0ZSwgNjApOworICAgIG5vcm1hbGl6ZV9wYWlyKGRheSwgaG91ciwgMjQpOworICAgIHJldHVybiBub3JtYWxpemVfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MDIsMzEgKzYwMiwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfYWxsb2MoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IGF3YXJlKQogewotCVB5T2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOwogCi0Jc2VsZiA9IChQeU9iamVjdCAqKQotCQlQeU9iamVjdF9NQUxMT0MoYXdhcmUgPwotCQkJCXNpemVvZihQeURhdGVUaW1lX1RpbWUpIDoKLQkJCQlzaXplb2YoX1B5RGF0ZVRpbWVfQmFzZVRpbWUpKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gKFB5T2JqZWN0ICopUHlFcnJfTm9NZW1vcnkoKTsKLQlQeU9iamVjdF9JTklUKHNlbGYsIHR5cGUpOwotCXJldHVybiBzZWxmOworICAgIHNlbGYgPSAoUHlPYmplY3QgKikKKyAgICAgICAgUHlPYmplY3RfTUFMTE9DKGF3YXJlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQeURhdGVUaW1lX1RpbWUpIDoKKyAgICAgICAgICAgICAgICBzaXplb2YoX1B5RGF0ZVRpbWVfQmFzZVRpbWUpKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeU9iamVjdF9JTklUKHNlbGYsIHR5cGUpOworICAgIHJldHVybiBzZWxmOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfYWxsb2MoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IGF3YXJlKQogewotCVB5T2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOwogCi0Jc2VsZiA9IChQeU9iamVjdCAqKQotCQlQeU9iamVjdF9NQUxMT0MoYXdhcmUgPwotCQkJCXNpemVvZihQeURhdGVUaW1lX0RhdGVUaW1lKSA6Ci0JCQkJc2l6ZW9mKF9QeURhdGVUaW1lX0Jhc2VEYXRlVGltZSkpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiAoUHlPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOwotCVB5T2JqZWN0X0lOSVQoc2VsZiwgdHlwZSk7Ci0JcmV0dXJuIHNlbGY7CisgICAgc2VsZiA9IChQeU9iamVjdCAqKQorICAgICAgICBQeU9iamVjdF9NQUxMT0MoYXdhcmUgPworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFB5RGF0ZVRpbWVfRGF0ZVRpbWUpIDoKKyAgICAgICAgICAgICAgICBzaXplb2YoX1B5RGF0ZVRpbWVfQmFzZURhdGVUaW1lKSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKVB5RXJyX05vTWVtb3J5KCk7CisgICAgUHlPYmplY3RfSU5JVChzZWxmLCB0eXBlKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MzgsMTAgKzYzOCwxMCBAQAogc3RhdGljIHZvaWQKIHNldF9kYXRlX2ZpZWxkcyhQeURhdGVUaW1lX0RhdGUgKnNlbGYsIGludCB5LCBpbnQgbSwgaW50IGQpCiB7Ci0Jc2VsZi0+aGFzaGNvZGUgPSAtMTsKLQlTRVRfWUVBUihzZWxmLCB5KTsKLQlTRVRfTU9OVEgoc2VsZiwgbSk7Ci0JU0VUX0RBWShzZWxmLCBkKTsKKyAgICBzZWxmLT5oYXNoY29kZSA9IC0xOworICAgIFNFVF9ZRUFSKHNlbGYsIHkpOworICAgIFNFVF9NT05USChzZWxmLCBtKTsKKyAgICBTRVRfREFZKHNlbGYsIGQpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY1Miw3MSArNjUyLDcxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmV3X2RhdGVfZXgoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwgUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5RGF0ZVRpbWVfRGF0ZSAqc2VsZjsKKyAgICBQeURhdGVUaW1lX0RhdGUgKnNlbGY7CiAKLQlzZWxmID0gKFB5RGF0ZVRpbWVfRGF0ZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpOwotCWlmIChzZWxmICE9IE5VTEwpCi0JCXNldF9kYXRlX2ZpZWxkcyhzZWxmLCB5ZWFyLCBtb250aCwgZGF5KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHNlbGY7CisgICAgc2VsZiA9IChQeURhdGVUaW1lX0RhdGUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKQorICAgICAgICBzZXRfZGF0ZV9maWVsZHMoc2VsZiwgeWVhciwgbW9udGgsIGRheSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOwogfQogCiAjZGVmaW5lIG5ld19kYXRlKHllYXIsIG1vbnRoLCBkYXkpIFwKLQluZXdfZGF0ZV9leCh5ZWFyLCBtb250aCwgZGF5LCAmUHlEYXRlVGltZV9EYXRlVHlwZSkKKyAgICBuZXdfZGF0ZV9leCh5ZWFyLCBtb250aCwgZGF5LCAmUHlEYXRlVGltZV9EYXRlVHlwZSkKIAogLyogQ3JlYXRlIGEgZGF0ZXRpbWUgaW5zdGFuY2Ugd2l0aCBubyByYW5nZSBjaGVja2luZy4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdfZGF0ZXRpbWVfZXgoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwgaW50IGhvdXIsIGludCBtaW51dGUsCi0JICAgICBpbnQgc2Vjb25kLCBpbnQgdXNlY29uZCwgUHlPYmplY3QgKnR6aW5mbywgUHlUeXBlT2JqZWN0ICp0eXBlKQorICAgICAgICAgICAgIGludCBzZWNvbmQsIGludCB1c2Vjb25kLCBQeU9iamVjdCAqdHppbmZvLCBQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZjsKLQljaGFyIGF3YXJlID0gdHppbmZvICE9IFB5X05vbmU7CisgICAgUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZjsKKyAgICBjaGFyIGF3YXJlID0gdHppbmZvICE9IFB5X05vbmU7CiAKLQlzZWxmID0gKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIGF3YXJlKSk7Ci0JaWYgKHNlbGYgIT0gTlVMTCkgewotCQlzZWxmLT5oYXN0emluZm8gPSBhd2FyZTsKLQkJc2V0X2RhdGVfZmllbGRzKChQeURhdGVUaW1lX0RhdGUgKilzZWxmLCB5ZWFyLCBtb250aCwgZGF5KTsKLQkJREFURV9TRVRfSE9VUihzZWxmLCBob3VyKTsKLQkJREFURV9TRVRfTUlOVVRFKHNlbGYsIG1pbnV0ZSk7Ci0JCURBVEVfU0VUX1NFQ09ORChzZWxmLCBzZWNvbmQpOwotCQlEQVRFX1NFVF9NSUNST1NFQ09ORChzZWxmLCB1c2Vjb25kKTsKLQkJaWYgKGF3YXJlKSB7Ci0JCQlQeV9JTkNSRUYodHppbmZvKTsKLQkJCXNlbGYtPnR6aW5mbyA9IHR6aW5mbzsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBzZWxmID0gKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIGF3YXJlKSk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5oYXN0emluZm8gPSBhd2FyZTsKKyAgICAgICAgc2V0X2RhdGVfZmllbGRzKChQeURhdGVUaW1lX0RhdGUgKilzZWxmLCB5ZWFyLCBtb250aCwgZGF5KTsKKyAgICAgICAgREFURV9TRVRfSE9VUihzZWxmLCBob3VyKTsKKyAgICAgICAgREFURV9TRVRfTUlOVVRFKHNlbGYsIG1pbnV0ZSk7CisgICAgICAgIERBVEVfU0VUX1NFQ09ORChzZWxmLCBzZWNvbmQpOworICAgICAgICBEQVRFX1NFVF9NSUNST1NFQ09ORChzZWxmLCB1c2Vjb25kKTsKKyAgICAgICAgaWYgKGF3YXJlKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodHppbmZvKTsKKyAgICAgICAgICAgIHNlbGYtPnR6aW5mbyA9IHR6aW5mbzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAotI2RlZmluZSBuZXdfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbykJCVwKLQluZXdfZGF0ZXRpbWVfZXgoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbywJXAotCQkJJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlKQorI2RlZmluZSBuZXdfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbykgICAgICAgICAgIFwKKyAgICBuZXdfZGF0ZXRpbWVfZXgoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSkKIAogLyogQ3JlYXRlIGEgdGltZSBpbnN0YW5jZSB3aXRoIG5vIHJhbmdlIGNoZWNraW5nLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIG5ld190aW1lX2V4KGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kLCBpbnQgdXNlY29uZCwKLQkgICAgUHlPYmplY3QgKnR6aW5mbywgUHlUeXBlT2JqZWN0ICp0eXBlKQorICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mbywgUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5RGF0ZVRpbWVfVGltZSAqc2VsZjsKLQljaGFyIGF3YXJlID0gdHppbmZvICE9IFB5X05vbmU7CisgICAgUHlEYXRlVGltZV9UaW1lICpzZWxmOworICAgIGNoYXIgYXdhcmUgPSB0emluZm8gIT0gUHlfTm9uZTsKIAotCXNlbGYgPSAoUHlEYXRlVGltZV9UaW1lICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCBhd2FyZSkpOwotCWlmIChzZWxmICE9IE5VTEwpIHsKLQkJc2VsZi0+aGFzdHppbmZvID0gYXdhcmU7Ci0JCXNlbGYtPmhhc2hjb2RlID0gLTE7Ci0JCVRJTUVfU0VUX0hPVVIoc2VsZiwgaG91cik7Ci0JCVRJTUVfU0VUX01JTlVURShzZWxmLCBtaW51dGUpOwotCQlUSU1FX1NFVF9TRUNPTkQoc2VsZiwgc2Vjb25kKTsKLQkJVElNRV9TRVRfTUlDUk9TRUNPTkQoc2VsZiwgdXNlY29uZCk7Ci0JCWlmIChhd2FyZSkgewotCQkJUHlfSU5DUkVGKHR6aW5mbyk7Ci0JCQlzZWxmLT50emluZm8gPSB0emluZm87Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgc2VsZiA9IChQeURhdGVUaW1lX1RpbWUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIGF3YXJlKSk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5oYXN0emluZm8gPSBhd2FyZTsKKyAgICAgICAgc2VsZi0+aGFzaGNvZGUgPSAtMTsKKyAgICAgICAgVElNRV9TRVRfSE9VUihzZWxmLCBob3VyKTsKKyAgICAgICAgVElNRV9TRVRfTUlOVVRFKHNlbGYsIG1pbnV0ZSk7CisgICAgICAgIFRJTUVfU0VUX1NFQ09ORChzZWxmLCBzZWNvbmQpOworICAgICAgICBUSU1FX1NFVF9NSUNST1NFQ09ORChzZWxmLCB1c2Vjb25kKTsKKyAgICAgICAgaWYgKGF3YXJlKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodHppbmZvKTsKKyAgICAgICAgICAgIHNlbGYtPnR6aW5mbyA9IHR6aW5mbzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAotI2RlZmluZSBuZXdfdGltZShoaCwgbW0sIHNzLCB1cywgdHppbmZvKQkJXAotCW5ld190aW1lX2V4KGhoLCBtbSwgc3MsIHVzLCB0emluZm8sICZQeURhdGVUaW1lX1RpbWVUeXBlKQorI2RlZmluZSBuZXdfdGltZShoaCwgbW0sIHNzLCB1cywgdHppbmZvKSAgICAgICAgICAgICAgICBcCisgICAgbmV3X3RpbWVfZXgoaGgsIG1tLCBzcywgdXMsIHR6aW5mbywgJlB5RGF0ZVRpbWVfVGltZVR5cGUpCiAKIC8qIENyZWF0ZSBhIHRpbWVkZWx0YSBpbnN0YW5jZS4gIE5vcm1hbGl6ZSB0aGUgbWVtYmVycyBpZmYgbm9ybWFsaXplIGlzCiAgKiB0cnVlLiAgUGFzc2luZyBmYWxzZSBpcyBhIHNwZWVkIG9wdGltaXphdGlvbiwgaWYgeW91IGtub3cgZm9yIHN1cmUKQEAgLTcyNiwzMCArNzI2LDMwIEBACiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdfZGVsdGFfZXgoaW50IGRheXMsIGludCBzZWNvbmRzLCBpbnQgbWljcm9zZWNvbmRzLCBpbnQgbm9ybWFsaXplLAotCSAgICAgUHlUeXBlT2JqZWN0ICp0eXBlKQorICAgICAgICAgICAgIFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeURhdGVUaW1lX0RlbHRhICpzZWxmOworICAgIFB5RGF0ZVRpbWVfRGVsdGEgKnNlbGY7CiAKLQlpZiAobm9ybWFsaXplKQotCQlub3JtYWxpemVfZF9zX3VzKCZkYXlzLCAmc2Vjb25kcywgJm1pY3Jvc2Vjb25kcyk7Ci0JYXNzZXJ0KDAgPD0gc2Vjb25kcyAmJiBzZWNvbmRzIDwgMjQqMzYwMCk7Ci0JYXNzZXJ0KDAgPD0gbWljcm9zZWNvbmRzICYmIG1pY3Jvc2Vjb25kcyA8IDEwMDAwMDApOworICAgIGlmIChub3JtYWxpemUpCisgICAgICAgIG5vcm1hbGl6ZV9kX3NfdXMoJmRheXMsICZzZWNvbmRzLCAmbWljcm9zZWNvbmRzKTsKKyAgICBhc3NlcnQoMCA8PSBzZWNvbmRzICYmIHNlY29uZHMgPCAyNCozNjAwKTsKKyAgICBhc3NlcnQoMCA8PSBtaWNyb3NlY29uZHMgJiYgbWljcm9zZWNvbmRzIDwgMTAwMDAwMCk7CiAKLSAJaWYgKGNoZWNrX2RlbHRhX2RheV9yYW5nZShkYXlzKSA8IDApCi0gCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoY2hlY2tfZGVsdGFfZGF5X3JhbmdlKGRheXMpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzZWxmID0gKFB5RGF0ZVRpbWVfRGVsdGEgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKTsKLQlpZiAoc2VsZiAhPSBOVUxMKSB7Ci0JCXNlbGYtPmhhc2hjb2RlID0gLTE7Ci0JCVNFVF9URF9EQVlTKHNlbGYsIGRheXMpOwotCQlTRVRfVERfU0VDT05EUyhzZWxmLCBzZWNvbmRzKTsKLQkJU0VUX1REX01JQ1JPU0VDT05EUyhzZWxmLCBtaWNyb3NlY29uZHMpOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopIHNlbGY7CisgICAgc2VsZiA9IChQeURhdGVUaW1lX0RlbHRhICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5oYXNoY29kZSA9IC0xOworICAgICAgICBTRVRfVERfREFZUyhzZWxmLCBkYXlzKTsKKyAgICAgICAgU0VUX1REX1NFQ09ORFMoc2VsZiwgc2Vjb25kcyk7CisgICAgICAgIFNFVF9URF9NSUNST1NFQ09ORFMoc2VsZiwgbWljcm9zZWNvbmRzKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOwogfQogCi0jZGVmaW5lIG5ld19kZWx0YShkLCBzLCB1cywgbm9ybWFsaXplKQlcCi0JbmV3X2RlbHRhX2V4KGQsIHMsIHVzLCBub3JtYWxpemUsICZQeURhdGVUaW1lX0RlbHRhVHlwZSkKKyNkZWZpbmUgbmV3X2RlbHRhKGQsIHMsIHVzLCBub3JtYWxpemUpICBcCisgICAgbmV3X2RlbHRhX2V4KGQsIHMsIHVzLCBub3JtYWxpemUsICZQeURhdGVUaW1lX0RlbHRhVHlwZSkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiB0emluZm8gaGVscGVycy4KQEAgLTc2MSwxMyArNzYxLDEzIEBACiBzdGF0aWMgaW50CiBjaGVja190emluZm9fc3ViY2xhc3MoUHlPYmplY3QgKnApCiB7Ci0JaWYgKHAgPT0gUHlfTm9uZSB8fCBQeVRaSW5mb19DaGVjayhwKSkKLQkJcmV0dXJuIDA7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAidHppbmZvIGFyZ3VtZW50IG11c3QgYmUgTm9uZSBvciBvZiBhIHR6aW5mbyBzdWJjbGFzcywgIgotCQkgICAgICJub3QgdHlwZSAnJXMnIiwKLQkJICAgICBQeV9UWVBFKHApLT50cF9uYW1lKTsKLQlyZXR1cm4gLTE7CisgICAgaWYgKHAgPT0gUHlfTm9uZSB8fCBQeVRaSW5mb19DaGVjayhwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgInR6aW5mbyBhcmd1bWVudCBtdXN0IGJlIE5vbmUgb3Igb2YgYSB0emluZm8gc3ViY2xhc3MsICIKKyAgICAgICAgICAgICAgICAgIm5vdCB0eXBlICclcyciLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHApLT50cF9uYW1lKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIFJldHVybiB0emluZm8ubWV0aG5hbWUodHppbmZvYXJnKSwgd2l0aG91dCBhbnkgY2hlY2tpbmcgb2YgcmVzdWx0cy4KQEAgLTc3NiwxNyArNzc2LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF90emluZm9fbWV0aG9kKFB5T2JqZWN0ICp0emluZm8sIGNoYXIgKm1ldGhuYW1lLCBQeU9iamVjdCAqdHppbmZvYXJnKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWFzc2VydCh0emluZm8gJiYgbWV0aG5hbWUgJiYgdHppbmZvYXJnKTsKLQlhc3NlcnQoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPj0gMCk7Ci0JaWYgKHR6aW5mbyA9PSBQeV9Ob25lKSB7Ci0JCXJlc3VsdCA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCX0KLQllbHNlCi0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodHppbmZvLCBtZXRobmFtZSwgIk8iLCB0emluZm9hcmcpOwotCXJldHVybiByZXN1bHQ7CisgICAgYXNzZXJ0KHR6aW5mbyAmJiBtZXRobmFtZSAmJiB0emluZm9hcmcpOworICAgIGFzc2VydChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA+PSAwKTsKKyAgICBpZiAodHppbmZvID09IFB5X05vbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0emluZm8sIG1ldGhuYW1lLCAiTyIsIHR6aW5mb2FyZyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogSWYgc2VsZiBoYXMgYSB0emluZm8gbWVtYmVyLCByZXR1cm4gYSBCT1JST1dFRCByZWZlcmVuY2UgdG8gaXQuICBFbHNlCkBAIC03OTYsMTQgKzc5NiwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF90emluZm9fbWVtYmVyKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp0emluZm8gPSBOVUxMOworICAgIFB5T2JqZWN0ICp0emluZm8gPSBOVUxMOwogCi0JaWYgKFB5RGF0ZVRpbWVfQ2hlY2soc2VsZikgJiYgSEFTVFpJTkZPKHNlbGYpKQotCQl0emluZm8gPSAoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilzZWxmKS0+dHppbmZvOwotCWVsc2UgaWYgKFB5VGltZV9DaGVjayhzZWxmKSAmJiBIQVNUWklORk8oc2VsZikpCi0JCXR6aW5mbyA9ICgoUHlEYXRlVGltZV9UaW1lICopc2VsZiktPnR6aW5mbzsKKyAgICBpZiAoUHlEYXRlVGltZV9DaGVjayhzZWxmKSAmJiBIQVNUWklORk8oc2VsZikpCisgICAgICAgIHR6aW5mbyA9ICgoUHlEYXRlVGltZV9EYXRlVGltZSAqKXNlbGYpLT50emluZm87CisgICAgZWxzZSBpZiAoUHlUaW1lX0NoZWNrKHNlbGYpICYmIEhBU1RaSU5GTyhzZWxmKSkKKyAgICAgICAgdHppbmZvID0gKChQeURhdGVUaW1lX1RpbWUgKilzZWxmKS0+dHppbmZvOwogCi0JcmV0dXJuIHR6aW5mbzsKKyAgICByZXR1cm4gdHppbmZvOwogfQogCiAvKiBDYWxsIGdldGF0dHIodHppbmZvLCBuYW1lKSh0emluZm9hcmcpLCBhbmQgZXh0cmFjdCBhbiBpbnQgZnJvbSB0aGUKQEAgLTgxNiw1OSArODE2LDU5IEBACiAgKi8KIHN0YXRpYyBpbnQKIGNhbGxfdXRjX3R6aW5mb19tZXRob2QoUHlPYmplY3QgKnR6aW5mbywgY2hhciAqbmFtZSwgUHlPYmplY3QgKnR6aW5mb2FyZywKLQkJICAgICAgIGludCAqbm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICpub25lKQogewotCVB5T2JqZWN0ICp1OwotCWludCByZXN1bHQgPSAtMTsKKyAgICBQeU9iamVjdCAqdTsKKyAgICBpbnQgcmVzdWx0ID0gLTE7CiAKLQlhc3NlcnQodHppbmZvICE9IE5VTEwpOwotCWFzc2VydChQeVRaSW5mb19DaGVjayh0emluZm8pKTsKLQlhc3NlcnQodHppbmZvYXJnICE9IE5VTEwpOworICAgIGFzc2VydCh0emluZm8gIT0gTlVMTCk7CisgICAgYXNzZXJ0KFB5VFpJbmZvX0NoZWNrKHR6aW5mbykpOworICAgIGFzc2VydCh0emluZm9hcmcgIT0gTlVMTCk7CiAKLQkqbm9uZSA9IDA7Ci0JdSA9IGNhbGxfdHppbmZvX21ldGhvZCh0emluZm8sIG5hbWUsIHR6aW5mb2FyZyk7Ci0JaWYgKHUgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgICpub25lID0gMDsKKyAgICB1ID0gY2FsbF90emluZm9fbWV0aG9kKHR6aW5mbywgbmFtZSwgdHppbmZvYXJnKTsKKyAgICBpZiAodSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQllbHNlIGlmICh1ID09IFB5X05vbmUpIHsKLQkJcmVzdWx0ID0gMDsKLQkJKm5vbmUgPSAxOwotCX0KLQllbHNlIGlmIChQeURlbHRhX0NoZWNrKHUpKSB7Ci0JCWNvbnN0IGludCBkYXlzID0gR0VUX1REX0RBWVModSk7Ci0JCWlmIChkYXlzIDwgLTEgfHwgZGF5cyA+IDApCi0JCQlyZXN1bHQgPSAyNCo2MDsJLyogdHJpZ2dlciBWYWx1ZUVycm9yIGJlbG93ICovCi0JCWVsc2UgewotCQkJLyogbmV4dCBsaW5lIGNhbid0IG92ZXJmbG93IGJlY2F1c2Ugd2Uga25vdyBkYXlzCi0JCQkgKiBpcyAtMSBvciAwIG5vdwotCQkJICovCi0JCQlpbnQgc3MgPSBkYXlzICogMjQgKiAzNjAwICsgR0VUX1REX1NFQ09ORFModSk7Ci0JCQlyZXN1bHQgPSBkaXZtb2Qoc3MsIDYwLCAmc3MpOwotCQkJaWYgKHNzIHx8IEdFVF9URF9NSUNST1NFQ09ORFModSkpIHsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJICAgICAidHppbmZvLiVzKCkgbXVzdCByZXR1cm4gYSAiCi0JCQkJCSAgICAgIndob2xlIG51bWJlciBvZiBtaW51dGVzIiwKLQkJCQkJICAgICBuYW1lKTsKLQkJCQlyZXN1bHQgPSAtMTsKLQkJCX0KLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgInR6aW5mby4lcygpIG11c3QgcmV0dXJuIE5vbmUgb3IgIgotCQkJICAgICAidGltZWRlbHRhLCBub3QgJyVzJyIsCi0JCQkgICAgIG5hbWUsIFB5X1RZUEUodSktPnRwX25hbWUpOwotCX0KKyAgICBlbHNlIGlmICh1ID09IFB5X05vbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgKm5vbmUgPSAxOworICAgIH0KKyAgICBlbHNlIGlmIChQeURlbHRhX0NoZWNrKHUpKSB7CisgICAgICAgIGNvbnN0IGludCBkYXlzID0gR0VUX1REX0RBWVModSk7CisgICAgICAgIGlmIChkYXlzIDwgLTEgfHwgZGF5cyA+IDApCisgICAgICAgICAgICByZXN1bHQgPSAyNCo2MDsgICAgICAgICAgICAgLyogdHJpZ2dlciBWYWx1ZUVycm9yIGJlbG93ICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogbmV4dCBsaW5lIGNhbid0IG92ZXJmbG93IGJlY2F1c2Ugd2Uga25vdyBkYXlzCisgICAgICAgICAgICAgKiBpcyAtMSBvciAwIG5vdworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgc3MgPSBkYXlzICogMjQgKiAzNjAwICsgR0VUX1REX1NFQ09ORFModSk7CisgICAgICAgICAgICByZXN1bHQgPSBkaXZtb2Qoc3MsIDYwLCAmc3MpOworICAgICAgICAgICAgaWYgKHNzIHx8IEdFVF9URF9NSUNST1NFQ09ORFModSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR6aW5mby4lcygpIG11c3QgcmV0dXJuIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBOb25lIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICJ0aW1lZGVsdGEsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUsIFB5X1RZUEUodSktPnRwX25hbWUpOworICAgIH0KIAotCVB5X0RFQ1JFRih1KTsKLQlpZiAocmVzdWx0IDwgLTE0MzkgfHwgcmVzdWx0ID4gMTQzOSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgInR6aW5mby4lcygpIHJldHVybmVkICVkOyBtdXN0IGJlIGluICIKLQkJCSAgICAgIi0xNDM5IC4uIDE0MzkiLAotCQkJICAgICBuYW1lLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtMTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9ERUNSRUYodSk7CisgICAgaWYgKHJlc3VsdCA8IC0xNDM5IHx8IHJlc3VsdCA+IDE0MzkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAidHppbmZvLiVzKCkgcmV0dXJuZWQgJWQ7IG11c3QgYmUgaW4gIgorICAgICAgICAgICAgICAgICAgICAgIi0xNDM5IC4uIDE0MzkiLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSwgcmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIENhbGwgdHppbmZvLnV0Y29mZnNldCh0emluZm9hcmcpLCBhbmQgZXh0cmFjdCBhbiBpbnRlZ2VyIGZyb20gdGhlCkBAIC04ODIsMzQgKzg4MiwzNCBAQAogc3RhdGljIGludAogY2FsbF91dGNvZmZzZXQoUHlPYmplY3QgKnR6aW5mbywgUHlPYmplY3QgKnR6aW5mb2FyZywgaW50ICpub25lKQogewotCXJldHVybiBjYWxsX3V0Y190emluZm9fbWV0aG9kKHR6aW5mbywgInV0Y29mZnNldCIsIHR6aW5mb2FyZywgbm9uZSk7CisgICAgcmV0dXJuIGNhbGxfdXRjX3R6aW5mb19tZXRob2QodHppbmZvLCAidXRjb2Zmc2V0IiwgdHppbmZvYXJnLCBub25lKTsKIH0KIAogLyogQ2FsbCB0emluZm8ubmFtZSh0emluZm9hcmcpLCBhbmQgcmV0dXJuIHRoZSBvZmZzZXQgYXMgYSB0aW1lZGVsdGEgb3IgTm9uZS4KICAqLwogc3RhdGljIFB5T2JqZWN0ICoKIG9mZnNldF9hc190aW1lZGVsdGEoUHlPYmplY3QgKnR6aW5mbywgY2hhciAqbmFtZSwgUHlPYmplY3QgKnR6aW5mb2FyZykgewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWFzc2VydCh0emluZm8gJiYgbmFtZSAmJiB0emluZm9hcmcpOwotCWlmICh0emluZm8gPT0gUHlfTm9uZSkgewotCQlyZXN1bHQgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQl9Ci0JZWxzZSB7Ci0JCWludCBub25lOwotCQlpbnQgb2Zmc2V0ID0gY2FsbF91dGNfdHppbmZvX21ldGhvZCh0emluZm8sIG5hbWUsIHR6aW5mb2FyZywKLQkJCQkJCSAgICAmbm9uZSk7Ci0JCWlmIChvZmZzZXQgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKG5vbmUpIHsKLQkJCXJlc3VsdCA9IFB5X05vbmU7Ci0JCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJfQotCQllbHNlCi0JCQlyZXN1bHQgPSBuZXdfZGVsdGEoMCwgb2Zmc2V0ICogNjAsIDAsIDEpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGFzc2VydCh0emluZm8gJiYgbmFtZSAmJiB0emluZm9hcmcpOworICAgIGlmICh0emluZm8gPT0gUHlfTm9uZSkgeworICAgICAgICByZXN1bHQgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGludCBub25lOworICAgICAgICBpbnQgb2Zmc2V0ID0gY2FsbF91dGNfdHppbmZvX21ldGhvZCh0emluZm8sIG5hbWUsIHR6aW5mb2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vbmUpOworICAgICAgICBpZiAob2Zmc2V0IDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChub25lKSB7CisgICAgICAgICAgICByZXN1bHQgPSBQeV9Ob25lOworICAgICAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gbmV3X2RlbHRhKDAsIG9mZnNldCAqIDYwLCAwLCAxKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogQ2FsbCB0emluZm8uZHN0KHR6aW5mb2FyZyksIGFuZCBleHRyYWN0IGFuIGludGVnZXIgZnJvbSB0aGUKQEAgLTkyMyw3ICs5MjMsNyBAQAogc3RhdGljIGludAogY2FsbF9kc3QoUHlPYmplY3QgKnR6aW5mbywgUHlPYmplY3QgKnR6aW5mb2FyZywgaW50ICpub25lKQogewotCXJldHVybiBjYWxsX3V0Y190emluZm9fbWV0aG9kKHR6aW5mbywgImRzdCIsIHR6aW5mb2FyZywgbm9uZSk7CisgICAgcmV0dXJuIGNhbGxfdXRjX3R6aW5mb19tZXRob2QodHppbmZvLCAiZHN0IiwgdHppbmZvYXJnLCBub25lKTsKIH0KIAogLyogQ2FsbCB0emluZm8udHpuYW1lKHR6aW5mb2FyZyksIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gIHR6aW5mbyBtdXN0IGJlCkBAIC05MzQsNDggKzkzNCw0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfdHpuYW1lKFB5T2JqZWN0ICp0emluZm8sIFB5T2JqZWN0ICp0emluZm9hcmcpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JYXNzZXJ0KHR6aW5mbyAhPSBOVUxMKTsKLQlhc3NlcnQoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPj0gMCk7Ci0JYXNzZXJ0KHR6aW5mb2FyZyAhPSBOVUxMKTsKKyAgICBhc3NlcnQodHppbmZvICE9IE5VTEwpOworICAgIGFzc2VydChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA+PSAwKTsKKyAgICBhc3NlcnQodHppbmZvYXJnICE9IE5VTEwpOwogCi0JaWYgKHR6aW5mbyA9PSBQeV9Ob25lKSB7Ci0JCXJlc3VsdCA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCX0KLQllbHNlCi0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodHppbmZvLCAidHpuYW1lIiwgIk8iLCB0emluZm9hcmcpOworICAgIGlmICh0emluZm8gPT0gUHlfTm9uZSkgeworICAgICAgICByZXN1bHQgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR6aW5mbywgInR6bmFtZSIsICJPIiwgdHppbmZvYXJnKTsKIAotCWlmIChyZXN1bHQgIT0gTlVMTCAmJiByZXN1bHQgIT0gUHlfTm9uZSAmJiAhIFB5U3RyaW5nX0NoZWNrKHJlc3VsdCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInR6aW5mby50em5hbWUoKSBtdXN0ICIKLQkJCSAgICAgInJldHVybiBOb25lIG9yIGEgc3RyaW5nLCBub3QgJyVzJyIsCi0JCQkgICAgIFB5X1RZUEUocmVzdWx0KS0+dHBfbmFtZSk7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBOVUxMOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiByZXN1bHQgIT0gUHlfTm9uZSAmJiAhIFB5U3RyaW5nX0NoZWNrKHJlc3VsdCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInR6aW5mby50em5hbWUoKSBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICJyZXR1cm4gTm9uZSBvciBhIHN0cmluZywgbm90ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShyZXN1bHQpLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHR5cGVkZWYgZW51bSB7Ci0JICAgICAgLyogYW4gZXhjZXB0aW9uIGhhcyBiZWVuIHNldDsgdGhlIGNhbGxlciBzaG91bGQgcGFzcyBpdCBvbiAqLwotCSAgICAgIE9GRlNFVF9FUlJPUiwKKyAgICAgICAgICAgICAgLyogYW4gZXhjZXB0aW9uIGhhcyBiZWVuIHNldDsgdGhlIGNhbGxlciBzaG91bGQgcGFzcyBpdCBvbiAqLworICAgICAgICAgIE9GRlNFVF9FUlJPUiwKIAotCSAgICAgIC8qIHR5cGUgaXNuJ3QgZGF0ZSwgZGF0ZXRpbWUsIG9yIHRpbWUgc3ViY2xhc3MgKi8KLQkgICAgICBPRkZTRVRfVU5LTk9XTiwKKyAgICAgICAgICAvKiB0eXBlIGlzbid0IGRhdGUsIGRhdGV0aW1lLCBvciB0aW1lIHN1YmNsYXNzICovCisgICAgICAgICAgT0ZGU0VUX1VOS05PV04sCiAKLQkgICAgICAvKiBkYXRlLAotCSAgICAgICAqIGRhdGV0aW1lIHdpdGggIWhhc3R6aW5mbwotCSAgICAgICAqIGRhdGV0aW1lIHdpdGggTm9uZSB0emluZm8sCi0JICAgICAgICogZGF0ZXRpbWUgd2hlcmUgdXRjb2Zmc2V0KCkgcmV0dXJucyBOb25lCi0JICAgICAgICogdGltZSB3aXRoICFoYXN0emluZm8KLQkgICAgICAgKiB0aW1lIHdpdGggTm9uZSB0emluZm8sCi0JICAgICAgICogdGltZSB3aGVyZSB1dGNvZmZzZXQoKSByZXR1cm5zIE5vbmUKLQkgICAgICAgKi8KLQkgICAgICBPRkZTRVRfTkFJVkUsCisgICAgICAgICAgLyogZGF0ZSwKKyAgICAgICAgICAgKiBkYXRldGltZSB3aXRoICFoYXN0emluZm8KKyAgICAgICAgICAgKiBkYXRldGltZSB3aXRoIE5vbmUgdHppbmZvLAorICAgICAgICAgICAqIGRhdGV0aW1lIHdoZXJlIHV0Y29mZnNldCgpIHJldHVybnMgTm9uZQorICAgICAgICAgICAqIHRpbWUgd2l0aCAhaGFzdHppbmZvCisgICAgICAgICAgICogdGltZSB3aXRoIE5vbmUgdHppbmZvLAorICAgICAgICAgICAqIHRpbWUgd2hlcmUgdXRjb2Zmc2V0KCkgcmV0dXJucyBOb25lCisgICAgICAgICAgICovCisgICAgICAgICAgT0ZGU0VUX05BSVZFLAogCi0JICAgICAgLyogdGltZSBvciBkYXRldGltZSB3aGVyZSB1dGNvZmZzZXQoKSBkb2Vzbid0IHJldHVybiBOb25lICovCi0JICAgICAgT0ZGU0VUX0FXQVJFCisgICAgICAgICAgLyogdGltZSBvciBkYXRldGltZSB3aGVyZSB1dGNvZmZzZXQoKSBkb2Vzbid0IHJldHVybiBOb25lICovCisgICAgICAgICAgT0ZGU0VUX0FXQVJFCiB9IG5haXZldHk7CiAKIC8qIENsYXNzaWZ5IGFuIG9iamVjdCBhcyB0byB3aGV0aGVyIGl0J3MgbmFpdmUgb3Igb2Zmc2V0LWF3YXJlLiAgU2VlCkBAIC05ODcsMjMgKzk4NywyMyBAQAogc3RhdGljIG5haXZldHkKIGNsYXNzaWZ5X3V0Y29mZnNldChQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICp0emluZm9hcmcsIGludCAqb2Zmc2V0KQogewotCWludCBub25lOwotCVB5T2JqZWN0ICp0emluZm87CisgICAgaW50IG5vbmU7CisgICAgUHlPYmplY3QgKnR6aW5mbzsKIAotCWFzc2VydCh0emluZm9hcmcgIT0gTlVMTCk7Ci0JKm9mZnNldCA9IDA7Ci0JdHppbmZvID0gZ2V0X3R6aW5mb19tZW1iZXIob3ApOwkvKiBOVUxMIG1lYW5zIG5vIHR6aW5mbywgbm90IGVycm9yICovCi0JaWYgKHR6aW5mbyA9PSBQeV9Ob25lKQotCQlyZXR1cm4gT0ZGU0VUX05BSVZFOwotCWlmICh0emluZm8gPT0gTlVMTCkgewotCQkvKiBub3RlIHRoYXQgYSBkYXRldGltZSBwYXNzZXMgdGhlIFB5RGF0ZV9DaGVjayB0ZXN0ICovCi0JCXJldHVybiAoUHlUaW1lX0NoZWNrKG9wKSB8fCBQeURhdGVfQ2hlY2sob3ApKSA/Ci0JCSAgICAgICBPRkZTRVRfTkFJVkUgOiBPRkZTRVRfVU5LTk9XTjsKLQl9Ci0JKm9mZnNldCA9IGNhbGxfdXRjb2Zmc2V0KHR6aW5mbywgdHppbmZvYXJnLCAmbm9uZSk7Ci0JaWYgKCpvZmZzZXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE9GRlNFVF9FUlJPUjsKLQlyZXR1cm4gbm9uZSA/IE9GRlNFVF9OQUlWRSA6IE9GRlNFVF9BV0FSRTsKKyAgICBhc3NlcnQodHppbmZvYXJnICE9IE5VTEwpOworICAgICpvZmZzZXQgPSAwOworICAgIHR6aW5mbyA9IGdldF90emluZm9fbWVtYmVyKG9wKTsgICAgIC8qIE5VTEwgbWVhbnMgbm8gdHppbmZvLCBub3QgZXJyb3IgKi8KKyAgICBpZiAodHppbmZvID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiBPRkZTRVRfTkFJVkU7CisgICAgaWYgKHR6aW5mbyA9PSBOVUxMKSB7CisgICAgICAgIC8qIG5vdGUgdGhhdCBhIGRhdGV0aW1lIHBhc3NlcyB0aGUgUHlEYXRlX0NoZWNrIHRlc3QgKi8KKyAgICAgICAgcmV0dXJuIChQeVRpbWVfQ2hlY2sob3ApIHx8IFB5RGF0ZV9DaGVjayhvcCkpID8KKyAgICAgICAgICAgICAgIE9GRlNFVF9OQUlWRSA6IE9GRlNFVF9VTktOT1dOOworICAgIH0KKyAgICAqb2Zmc2V0ID0gY2FsbF91dGNvZmZzZXQodHppbmZvLCB0emluZm9hcmcsICZub25lKTsKKyAgICBpZiAoKm9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gT0ZGU0VUX0VSUk9SOworICAgIHJldHVybiBub25lID8gT0ZGU0VUX05BSVZFIDogT0ZGU0VUX0FXQVJFOwogfQogCiAvKiBDbGFzc2lmeSB0d28gb2JqZWN0cyBhcyB0byB3aGV0aGVyIHRoZXkncmUgbmFpdmUgb3Igb2Zmc2V0LWF3YXJlLgpAQCAtMTAxNywyMyArMTAxNywyMyBAQAogICovCiBzdGF0aWMgaW50CiBjbGFzc2lmeV90d29fdXRjb2Zmc2V0cyhQeU9iamVjdCAqbzEsIGludCAqb2Zmc2V0MSwgbmFpdmV0eSAqbjEsCi0JCQlQeU9iamVjdCAqdHppbmZvYXJnMSwKLQkJCVB5T2JqZWN0ICpvMiwgaW50ICpvZmZzZXQyLCBuYWl2ZXR5ICpuMiwKLQkJCVB5T2JqZWN0ICp0emluZm9hcmcyKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mb2FyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzIsIGludCAqb2Zmc2V0MiwgbmFpdmV0eSAqbjIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdHppbmZvYXJnMikKIHsKLQlpZiAoZ2V0X3R6aW5mb19tZW1iZXIobzEpID09IGdldF90emluZm9fbWVtYmVyKG8yKSkgewotCQkqb2Zmc2V0MSA9ICpvZmZzZXQyID0gMDsKLQkJKm4xID0gKm4yID0gT0ZGU0VUX05BSVZFOwotCX0KLQllbHNlIHsKLQkJKm4xID0gY2xhc3NpZnlfdXRjb2Zmc2V0KG8xLCB0emluZm9hcmcxLCBvZmZzZXQxKTsKLQkJaWYgKCpuMSA9PSBPRkZTRVRfRVJST1IpCi0JCQlyZXR1cm4gLTE7Ci0JCSpuMiA9IGNsYXNzaWZ5X3V0Y29mZnNldChvMiwgdHppbmZvYXJnMiwgb2Zmc2V0Mik7Ci0JCWlmICgqbjIgPT0gT0ZGU0VUX0VSUk9SKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoZ2V0X3R6aW5mb19tZW1iZXIobzEpID09IGdldF90emluZm9fbWVtYmVyKG8yKSkgeworICAgICAgICAqb2Zmc2V0MSA9ICpvZmZzZXQyID0gMDsKKyAgICAgICAgKm4xID0gKm4yID0gT0ZGU0VUX05BSVZFOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKm4xID0gY2xhc3NpZnlfdXRjb2Zmc2V0KG8xLCB0emluZm9hcmcxLCBvZmZzZXQxKTsKKyAgICAgICAgaWYgKCpuMSA9PSBPRkZTRVRfRVJST1IpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICpuMiA9IGNsYXNzaWZ5X3V0Y29mZnNldChvMiwgdHppbmZvYXJnMiwgb2Zmc2V0Mik7CisgICAgICAgIGlmICgqbjIgPT0gT0ZGU0VUX0VSUk9SKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogcmVwciBpcyBsaWtlICJzb21lY2xhc3MoYXJnMSwgYXJnMikiLiAgSWYgdHppbmZvIGlzbid0IE5vbmUsCkBAIC0xMDQ0LDMwICsxMDQ0LDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXBwZW5kX2tleXdvcmRfdHppbmZvKFB5T2JqZWN0ICpyZXByLCBQeU9iamVjdCAqdHppbmZvKQogewotCVB5T2JqZWN0ICp0ZW1wOworICAgIFB5T2JqZWN0ICp0ZW1wOwogCi0JYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHJlcHIpKTsKLQlhc3NlcnQodHppbmZvKTsKLQlpZiAodHppbmZvID09IFB5X05vbmUpCi0JCXJldHVybiByZXByOwotCS8qIEdldCByaWQgb2YgdGhlIHRyYWlsaW5nICcpJy4gKi8KLQlhc3NlcnQoUHlTdHJpbmdfQXNTdHJpbmcocmVwcilbUHlTdHJpbmdfU2l6ZShyZXByKS0xXSA9PSAnKScpOwotCXRlbXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShQeVN0cmluZ19Bc1N0cmluZyhyZXByKSwKLQkJCQkJICBQeVN0cmluZ19TaXplKHJlcHIpIC0gMSk7Ci0JUHlfREVDUkVGKHJlcHIpOwotCWlmICh0ZW1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlcHIgPSB0ZW1wOworICAgIGFzc2VydChQeVN0cmluZ19DaGVjayhyZXByKSk7CisgICAgYXNzZXJ0KHR6aW5mbyk7CisgICAgaWYgKHR6aW5mbyA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gcmVwcjsKKyAgICAvKiBHZXQgcmlkIG9mIHRoZSB0cmFpbGluZyAnKScuICovCisgICAgYXNzZXJ0KFB5U3RyaW5nX0FzU3RyaW5nKHJlcHIpW1B5U3RyaW5nX1NpemUocmVwciktMV0gPT0gJyknKTsKKyAgICB0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoUHlTdHJpbmdfQXNTdHJpbmcocmVwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX1NpemUocmVwcikgLSAxKTsKKyAgICBQeV9ERUNSRUYocmVwcik7CisgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVwciA9IHRlbXA7CiAKLQkvKiBBcHBlbmQgIiwgdHppbmZvPSIuICovCi0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXByLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCIsIHR6aW5mbz0iKSk7CisgICAgLyogQXBwZW5kICIsIHR6aW5mbz0iLiAqLworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVwciwgUHlTdHJpbmdfRnJvbVN0cmluZygiLCB0emluZm89IikpOwogCi0JLyogQXBwZW5kIHJlcHIodHppbmZvKS4gKi8KLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnJlcHIsIFB5T2JqZWN0X1JlcHIodHppbmZvKSk7CisgICAgLyogQXBwZW5kIHJlcHIodHppbmZvKS4gKi8KKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnJlcHIsIFB5T2JqZWN0X1JlcHIodHppbmZvKSk7CiAKLQkvKiBBZGQgYSBjbG9zaW5nIHBhcmVuLiAqLwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVwciwgUHlTdHJpbmdfRnJvbVN0cmluZygiKSIpKTsKLQlyZXR1cm4gcmVwcjsKKyAgICAvKiBBZGQgYSBjbG9zaW5nIHBhcmVuLiAqLworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVwciwgUHlTdHJpbmdfRnJvbVN0cmluZygiKSIpKTsKKyAgICByZXR1cm4gcmVwcjsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDc3LDIyICsxMDc3LDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybWF0X2N0aW1lKFB5RGF0ZVRpbWVfRGF0ZSAqZGF0ZSwgaW50IGhvdXJzLCBpbnQgbWludXRlcywgaW50IHNlY29uZHMpCiB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKkRheU5hbWVzW10gPSB7Ci0JCSJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIsICJTdW4iCi0JfTsKLQlzdGF0aWMgY29uc3QgY2hhciAqTW9udGhOYW1lc1tdID0gewotCQkiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAotCQkiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCi0JfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqRGF5TmFtZXNbXSA9IHsKKyAgICAgICAgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IiwgIlN1biIKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICpNb250aE5hbWVzW10gPSB7CisgICAgICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICAgICAgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIKKyAgICB9OwogCi0JY2hhciBidWZmZXJbMTI4XTsKLQlpbnQgd2RheSA9IHdlZWtkYXkoR0VUX1lFQVIoZGF0ZSksIEdFVF9NT05USChkYXRlKSwgR0VUX0RBWShkYXRlKSk7CisgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICBpbnQgd2RheSA9IHdlZWtkYXkoR0VUX1lFQVIoZGF0ZSksIEdFVF9NT05USChkYXRlKSwgR0VUX0RBWShkYXRlKSk7CiAKLQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyAlcyAlMmQgJTAyZDolMDJkOiUwMmQgJTA0ZCIsCi0JCSAgICAgIERheU5hbWVzW3dkYXldLCBNb250aE5hbWVzW0dFVF9NT05USChkYXRlKSAtIDFdLAotCQkgICAgICBHRVRfREFZKGRhdGUpLCBob3VycywgbWludXRlcywgc2Vjb25kcywKLQkJICAgICAgR0VUX1lFQVIoZGF0ZSkpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CisgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMgJXMgJTJkICUwMmQ6JTAyZDolMDJkICUwNGQiLAorICAgICAgICAgICAgICAgICAgRGF5TmFtZXNbd2RheV0sIE1vbnRoTmFtZXNbR0VUX01PTlRIKGRhdGUpIC0gMV0sCisgICAgICAgICAgICAgICAgICBHRVRfREFZKGRhdGUpLCBob3VycywgbWludXRlcywgc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKGRhdGUpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOwogfQogCiAvKiBBZGQgYW4gaG91cnMgJiBtaW51dGVzIFVUQyBvZmZzZXQgc3RyaW5nIHRvIGJ1Zi4gIGJ1ZiBoYXMgbm8gbW9yZSB0aGFuCkBAIC0xMTA3LDQ1ICsxMTA3LDQ1IEBACiAgKi8KIHN0YXRpYyBpbnQKIGZvcm1hdF91dGNvZmZzZXQoY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLCBjb25zdCBjaGFyICpzZXAsCi0JCVB5T2JqZWN0ICp0emluZm8sIFB5T2JqZWN0ICp0emluZm9hcmcpCisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mbywgUHlPYmplY3QgKnR6aW5mb2FyZykKIHsKLQlpbnQgb2Zmc2V0OwotCWludCBob3VyczsKLQlpbnQgbWludXRlczsKLQljaGFyIHNpZ247Ci0JaW50IG5vbmU7CisgICAgaW50IG9mZnNldDsKKyAgICBpbnQgaG91cnM7CisgICAgaW50IG1pbnV0ZXM7CisgICAgY2hhciBzaWduOworICAgIGludCBub25lOwogCi0JYXNzZXJ0KGJ1ZmxlbiA+PSAxKTsKKyAgICBhc3NlcnQoYnVmbGVuID49IDEpOwogCi0Jb2Zmc2V0ID0gY2FsbF91dGNvZmZzZXQodHppbmZvLCB0emluZm9hcmcsICZub25lKTsKLQlpZiAob2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQlpZiAobm9uZSkgewotCQkqYnVmID0gJ1wwJzsKLQkJcmV0dXJuIDA7Ci0JfQotCXNpZ24gPSAnKyc7Ci0JaWYgKG9mZnNldCA8IDApIHsKLQkJc2lnbiA9ICctJzsKLQkJb2Zmc2V0ID0gLSBvZmZzZXQ7Ci0JfQotCWhvdXJzID0gZGl2bW9kKG9mZnNldCwgNjAsICZtaW51dGVzKTsKLQlQeU9TX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWMlMDJkJXMlMDJkIiwgc2lnbiwgaG91cnMsIHNlcCwgbWludXRlcyk7Ci0JcmV0dXJuIDA7CisgICAgb2Zmc2V0ID0gY2FsbF91dGNvZmZzZXQodHppbmZvLCB0emluZm9hcmcsICZub25lKTsKKyAgICBpZiAob2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobm9uZSkgeworICAgICAgICAqYnVmID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNpZ24gPSAnKyc7CisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgc2lnbiA9ICctJzsKKyAgICAgICAgb2Zmc2V0ID0gLSBvZmZzZXQ7CisgICAgfQorICAgIGhvdXJzID0gZGl2bW9kKG9mZnNldCwgNjAsICZtaW51dGVzKTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWMlMDJkJXMlMDJkIiwgc2lnbiwgaG91cnMsIHNlcCwgbWludXRlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlX2ZyZXBsYWNlbWVudChQeU9iamVjdCAqb2JqZWN0KQogewotCWNoYXIgZnJlcGxhY2VtZW50WzY0XTsKLQlpZiAoUHlUaW1lX0NoZWNrKG9iamVjdCkpCi0JICAgIHNwcmludGYoZnJlcGxhY2VtZW50LCAiJTA2ZCIsIFRJTUVfR0VUX01JQ1JPU0VDT05EKG9iamVjdCkpOwotCWVsc2UgaWYgKFB5RGF0ZVRpbWVfQ2hlY2sob2JqZWN0KSkKLQkgICAgc3ByaW50ZihmcmVwbGFjZW1lbnQsICIlMDZkIiwgREFURV9HRVRfTUlDUk9TRUNPTkQob2JqZWN0KSk7Ci0JZWxzZQotCSAgICBzcHJpbnRmKGZyZXBsYWNlbWVudCwgIiUwNmQiLCAwKTsKKyAgICBjaGFyIGZyZXBsYWNlbWVudFs2NF07CisgICAgaWYgKFB5VGltZV9DaGVjayhvYmplY3QpKQorICAgICAgICBzcHJpbnRmKGZyZXBsYWNlbWVudCwgIiUwNmQiLCBUSU1FX0dFVF9NSUNST1NFQ09ORChvYmplY3QpKTsKKyAgICBlbHNlIGlmIChQeURhdGVUaW1lX0NoZWNrKG9iamVjdCkpCisgICAgICAgIHNwcmludGYoZnJlcGxhY2VtZW50LCAiJTA2ZCIsIERBVEVfR0VUX01JQ1JPU0VDT05EKG9iamVjdCkpOworICAgIGVsc2UKKyAgICAgICAgc3ByaW50ZihmcmVwbGFjZW1lbnQsICIlMDZkIiwgMCk7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZnJlcGxhY2VtZW50LCBzdHJsZW4oZnJlcGxhY2VtZW50KSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZyZXBsYWNlbWVudCwgc3RybGVuKGZyZXBsYWNlbWVudCkpOwogfQogCiAvKiBJIHN1cmUgZG9uJ3Qgd2FudCB0byByZXByb2R1Y2UgdGhlIHN0cmZ0aW1lIGNvZGUgZnJvbSB0aGUgdGltZSBtb2R1bGUsCkBAIC0xMTU3LDIzMSArMTE1NywyMzEgQEAKICAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfc3RyZnRpbWUoUHlPYmplY3QgKm9iamVjdCwgY29uc3QgY2hhciAqZm9ybWF0LCBzaXplX3QgZm9ybWF0X2xlbiwKLQkJUHlPYmplY3QgKnRpbWV0dXBsZSwgUHlPYmplY3QgKnR6aW5mb2FyZykKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGltZXR1cGxlLCBQeU9iamVjdCAqdHppbmZvYXJnKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwkvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7ICAgICAgICAgICAgLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLwogCi0JUHlPYmplY3QgKnpyZXBsYWNlbWVudCA9IE5VTEw7CS8qIHB5IHN0cmluZywgcmVwbGFjZW1lbnQgZm9yICV6ICovCi0JUHlPYmplY3QgKlpyZXBsYWNlbWVudCA9IE5VTEw7CS8qIHB5IHN0cmluZywgcmVwbGFjZW1lbnQgZm9yICVaICovCi0JUHlPYmplY3QgKmZyZXBsYWNlbWVudCA9IE5VTEw7CS8qIHB5IHN0cmluZywgcmVwbGFjZW1lbnQgZm9yICVmICovCisgICAgUHlPYmplY3QgKnpyZXBsYWNlbWVudCA9IE5VTEw7ICAgICAgLyogcHkgc3RyaW5nLCByZXBsYWNlbWVudCBmb3IgJXogKi8KKyAgICBQeU9iamVjdCAqWnJlcGxhY2VtZW50ID0gTlVMTDsgICAgICAvKiBweSBzdHJpbmcsIHJlcGxhY2VtZW50IGZvciAlWiAqLworICAgIFB5T2JqZWN0ICpmcmVwbGFjZW1lbnQgPSBOVUxMOyAgICAgIC8qIHB5IHN0cmluZywgcmVwbGFjZW1lbnQgZm9yICVmICovCiAKLQljb25zdCBjaGFyICpwaW47CS8qIHBvaW50ZXIgdG8gbmV4dCBjaGFyIGluIGlucHV0IGZvcm1hdCAqLwotCWNoYXIgY2g7CQkvKiBuZXh0IGNoYXIgaW4gaW5wdXQgZm9ybWF0ICovCisgICAgY29uc3QgY2hhciAqcGluOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBjaGFyIGluIGlucHV0IGZvcm1hdCAqLworICAgIGNoYXIgY2g7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGNoYXIgaW4gaW5wdXQgZm9ybWF0ICovCiAKLQlQeU9iamVjdCAqbmV3Zm10ID0gTlVMTDsJLyogcHkgc3RyaW5nLCB0aGUgb3V0cHV0IGZvcm1hdCAqLwotCWNoYXIgKnBuZXc7CS8qIHBvaW50ZXIgdG8gYXZhaWxhYmxlIGJ5dGUgaW4gb3V0cHV0IGZvcm1hdCAqLwotCXNpemVfdCB0b3RhbG5ldzsJLyogbnVtYmVyIGJ5dGVzIHRvdGFsIGluIG91dHB1dCBmb3JtYXQgYnVmZmVyLAotCQkJCSAgIGV4Y2x1c2l2ZSBvZiB0cmFpbGluZyBcMCAqLwotCXNpemVfdCB1c2VkbmV3OwkvKiBudW1iZXIgYnl0ZXMgdXNlZCBzbyBmYXIgaW4gb3V0cHV0IGZvcm1hdCBidWZmZXIgKi8KKyAgICBQeU9iamVjdCAqbmV3Zm10ID0gTlVMTDsgICAgICAgICAgICAvKiBweSBzdHJpbmcsIHRoZSBvdXRwdXQgZm9ybWF0ICovCisgICAgY2hhciAqcG5ldzsgICAgICAgICAvKiBwb2ludGVyIHRvIGF2YWlsYWJsZSBieXRlIGluIG91dHB1dCBmb3JtYXQgKi8KKyAgICBzaXplX3QgdG90YWxuZXc7ICAgICAgICAgICAgLyogbnVtYmVyIGJ5dGVzIHRvdGFsIGluIG91dHB1dCBmb3JtYXQgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZSBvZiB0cmFpbGluZyBcMCAqLworICAgIHNpemVfdCB1c2VkbmV3OyAgICAgLyogbnVtYmVyIGJ5dGVzIHVzZWQgc28gZmFyIGluIG91dHB1dCBmb3JtYXQgYnVmZmVyICovCiAKLQljb25zdCBjaGFyICpwdG9hcHBlbmQ7CS8qIHB0ciB0byBzdHJpbmcgdG8gYXBwZW5kIHRvIG91dHB1dCBidWZmZXIgKi8KLQlzaXplX3QgbnRvYXBwZW5kOwkvKiAjIG9mIGJ5dGVzIHRvIGFwcGVuZCB0byBvdXRwdXQgYnVmZmVyICovCisgICAgY29uc3QgY2hhciAqcHRvYXBwZW5kOyAgICAgIC8qIHB0ciB0byBzdHJpbmcgdG8gYXBwZW5kIHRvIG91dHB1dCBidWZmZXIgKi8KKyAgICBzaXplX3QgbnRvYXBwZW5kOyAgICAgICAgICAgLyogIyBvZiBieXRlcyB0byBhcHBlbmQgdG8gb3V0cHV0IGJ1ZmZlciAqLwogCi0JYXNzZXJ0KG9iamVjdCAmJiBmb3JtYXQgJiYgdGltZXR1cGxlKTsKKyAgICBhc3NlcnQob2JqZWN0ICYmIGZvcm1hdCAmJiB0aW1ldHVwbGUpOwogCi0JLyogR2l2ZSB1cCBpZiB0aGUgeWVhciBpcyBiZWZvcmUgMTkwMC4KLQkgKiBQeXRob24gc3RyZnRpbWUoKSBwbGF5cyBnYW1lcyB3aXRoIHRoZSB5ZWFyLCBhbmQgZGlmZmVyZW50Ci0JICogZ2FtZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgZW52YXIgUFlUSE9OMksgaXMgc2V0LiAgVGhpcyBtYWtlcwotCSAqIHllYXJzIGJlZm9yZSAxOTAwIGEgbmlnaHRtYXJlLCBldmVuIGlmIHRoZSBwbGF0Zm9ybSBzdHJmdGltZQotCSAqIHN1cHBvcnRzIHRoZW0gKGFuZCBub3QgYWxsIGRvKS4KLQkgKiBXZSBjb3VsZCBnZXQgYSBsb3QgZmFydGhlciBoZXJlIGJ5IGF2b2lkaW5nIFB5dGhvbidzIHN0cmZ0aW1lCi0JICogd3JhcHBlciBhbmQgY2FsbGluZyB0aGUgQyBzdHJmdGltZSgpIGRpcmVjdGx5LCBidXQgdGhhdCBpc24ndAotCSAqIGFuIG9wdGlvbiBpbiB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kdWxlLgotCSAqLwotCXsKLQkJbG9uZyB5ZWFyOwotCQlQeU9iamVjdCAqcHl5ZWFyID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHRpbWV0dXBsZSwgMCk7Ci0JCWlmIChweXllYXIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JCWFzc2VydChQeUludF9DaGVjayhweXllYXIpKTsKLQkJeWVhciA9IFB5SW50X0FzTG9uZyhweXllYXIpOwotCQlQeV9ERUNSRUYocHl5ZWFyKTsKLQkJaWYgKHllYXIgPCAxOTAwKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgInllYXI9JWxkIGlzIGJlZm9yZSAiCi0JCQkJICAgICAiMTkwMDsgdGhlIGRhdGV0aW1lIHN0cmZ0aW1lKCkgIgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZHMgcmVxdWlyZSB5ZWFyID49IDE5MDAiLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcik7Ci0JICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIC8qIEdpdmUgdXAgaWYgdGhlIHllYXIgaXMgYmVmb3JlIDE5MDAuCisgICAgICogUHl0aG9uIHN0cmZ0aW1lKCkgcGxheXMgZ2FtZXMgd2l0aCB0aGUgeWVhciwgYW5kIGRpZmZlcmVudAorICAgICAqIGdhbWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIGVudmFyIFBZVEhPTjJLIGlzIHNldC4gIFRoaXMgbWFrZXMKKyAgICAgKiB5ZWFycyBiZWZvcmUgMTkwMCBhIG5pZ2h0bWFyZSwgZXZlbiBpZiB0aGUgcGxhdGZvcm0gc3RyZnRpbWUKKyAgICAgKiBzdXBwb3J0cyB0aGVtIChhbmQgbm90IGFsbCBkbykuCisgICAgICogV2UgY291bGQgZ2V0IGEgbG90IGZhcnRoZXIgaGVyZSBieSBhdm9pZGluZyBQeXRob24ncyBzdHJmdGltZQorICAgICAqIHdyYXBwZXIgYW5kIGNhbGxpbmcgdGhlIEMgc3RyZnRpbWUoKSBkaXJlY3RseSwgYnV0IHRoYXQgaXNuJ3QKKyAgICAgKiBhbiBvcHRpb24gaW4gdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1vZHVsZS4KKyAgICAgKi8KKyAgICB7CisgICAgICAgIGxvbmcgeWVhcjsKKyAgICAgICAgUHlPYmplY3QgKnB5eWVhciA9IFB5U2VxdWVuY2VfR2V0SXRlbSh0aW1ldHVwbGUsIDApOworICAgICAgICBpZiAocHl5ZWFyID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgICBhc3NlcnQoUHlJbnRfQ2hlY2socHl5ZWFyKSk7CisgICAgICAgIHllYXIgPSBQeUludF9Bc0xvbmcocHl5ZWFyKTsKKyAgICAgICAgUHlfREVDUkVGKHB5eWVhcik7CisgICAgICAgIGlmICh5ZWFyIDwgMTkwMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ5ZWFyPSVsZCBpcyBiZWZvcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIxOTAwOyB0aGUgZGF0ZXRpbWUgc3RyZnRpbWUoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZHMgcmVxdWlyZSB5ZWFyID49IDE5MDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBTY2FuIHRoZSBpbnB1dCBmb3JtYXQsIGxvb2tpbmcgZm9yICV6LyVaLyVmIGVzY2FwZXMsIGJ1aWxkaW5nCi0JICogYSBuZXcgZm9ybWF0LiAgU2luY2UgY29tcHV0aW5nIHRoZSByZXBsYWNlbWVudHMgZm9yIHRob3NlIGNvZGVzCi0JICogaXMgZXhwZW5zaXZlLCBkb24ndCB1bmxlc3MgdGhleSdyZSBhY3R1YWxseSB1c2VkLgotCSAqLwotCWlmIChmb3JtYXRfbGVuID4gSU5UX01BWCAtIDEpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBEb25lOwotCX0KKyAgICAvKiBTY2FuIHRoZSBpbnB1dCBmb3JtYXQsIGxvb2tpbmcgZm9yICV6LyVaLyVmIGVzY2FwZXMsIGJ1aWxkaW5nCisgICAgICogYSBuZXcgZm9ybWF0LiAgU2luY2UgY29tcHV0aW5nIHRoZSByZXBsYWNlbWVudHMgZm9yIHRob3NlIGNvZGVzCisgICAgICogaXMgZXhwZW5zaXZlLCBkb24ndCB1bmxlc3MgdGhleSdyZSBhY3R1YWxseSB1c2VkLgorICAgICAqLworICAgIGlmIChmb3JtYXRfbGVuID4gSU5UX01BWCAtIDEpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KIAotCXRvdGFsbmV3ID0gZm9ybWF0X2xlbiArIDE7CS8qIHJlYWxpc3RpYyBpZiBubyAlei8lWi8lZiAqLwotCW5ld2ZtdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHRvdGFsbmV3KTsKLQlpZiAobmV3Zm10ID09IE5VTEwpIGdvdG8gRG9uZTsKLQlwbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3Zm10KTsKLQl1c2VkbmV3ID0gMDsKKyAgICB0b3RhbG5ldyA9IGZvcm1hdF9sZW4gKyAxOyAgICAgICAgICAvKiByZWFsaXN0aWMgaWYgbm8gJXovJVovJWYgKi8KKyAgICBuZXdmbXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCB0b3RhbG5ldyk7CisgICAgaWYgKG5ld2ZtdCA9PSBOVUxMKSBnb3RvIERvbmU7CisgICAgcG5ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld2ZtdCk7CisgICAgdXNlZG5ldyA9IDA7CiAKLQlwaW4gPSBmb3JtYXQ7Ci0Jd2hpbGUgKChjaCA9ICpwaW4rKykgIT0gJ1wwJykgewotCQlpZiAoY2ggIT0gJyUnKSB7Ci0JCQlwdG9hcHBlbmQgPSBwaW4gLSAxOwotCQkJbnRvYXBwZW5kID0gMTsKLQkJfQotCQllbHNlIGlmICgoY2ggPSAqcGluKyspID09ICdcMCcpIHsKLQkJCS8qIFRoZXJlJ3MgYSBsb25lIHRyYWlsaW5nICU7IGRvZXNuJ3QgbWFrZSBzZW5zZS4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic3RyZnRpbWUgZm9ybWF0ICIKLQkJCQkJImVuZHMgd2l0aCByYXcgJSIpOwotCQkJZ290byBEb25lOwotCQl9Ci0JCS8qIEEgJSBoYXMgYmVlbiBzZWVuIGFuZCBjaCBpcyB0aGUgY2hhcmFjdGVyIGFmdGVyIGl0LiAqLwotCQllbHNlIGlmIChjaCA9PSAneicpIHsKLQkJCWlmICh6cmVwbGFjZW1lbnQgPT0gTlVMTCkgewotCQkJCS8qIGZvcm1hdCB1dGNvZmZzZXQgKi8KLQkJCQljaGFyIGJ1ZlsxMDBdOwotCQkJCVB5T2JqZWN0ICp0emluZm8gPSBnZXRfdHppbmZvX21lbWJlcihvYmplY3QpOwotCQkJCXpyZXBsYWNlbWVudCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCQkJCWlmICh6cmVwbGFjZW1lbnQgPT0gTlVMTCkgZ290byBEb25lOwotCQkJCWlmICh0emluZm8gIT0gUHlfTm9uZSAmJiB0emluZm8gIT0gTlVMTCkgewotCQkJCQlhc3NlcnQodHppbmZvYXJnICE9IE5VTEwpOwotCQkJCQlpZiAoZm9ybWF0X3V0Y29mZnNldChidWYsCi0JCQkJCQkJICAgICBzaXplb2YoYnVmKSwKLQkJCQkJCQkgICAgICIiLAotCQkJCQkJCSAgICAgdHppbmZvLAotCQkJCQkJCSAgICAgdHppbmZvYXJnKSA8IDApCi0JCQkJCQlnb3RvIERvbmU7Ci0JCQkJCVB5X0RFQ1JFRih6cmVwbGFjZW1lbnQpOwotCQkJCQl6cmVwbGFjZW1lbnQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7Ci0JCQkJCWlmICh6cmVwbGFjZW1lbnQgPT0gTlVMTCkgZ290byBEb25lOwotCQkJCX0KLQkJCX0KLQkJCWFzc2VydCh6cmVwbGFjZW1lbnQgIT0gTlVMTCk7Ci0JCQlwdG9hcHBlbmQgPSBQeVN0cmluZ19BU19TVFJJTkcoenJlcGxhY2VtZW50KTsKLQkJCW50b2FwcGVuZCA9IFB5U3RyaW5nX0dFVF9TSVpFKHpyZXBsYWNlbWVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY2ggPT0gJ1onKSB7Ci0JCQkvKiBmb3JtYXQgdHpuYW1lICovCi0JCQlpZiAoWnJlcGxhY2VtZW50ID09IE5VTEwpIHsKLQkJCQlQeU9iamVjdCAqdHppbmZvID0gZ2V0X3R6aW5mb19tZW1iZXIob2JqZWN0KTsKLQkJCQlacmVwbGFjZW1lbnQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQkJCQlpZiAoWnJlcGxhY2VtZW50ID09IE5VTEwpIGdvdG8gRG9uZTsKLQkJCQlpZiAodHppbmZvICE9IFB5X05vbmUgJiYgdHppbmZvICE9IE5VTEwpIHsKLQkJCQkJUHlPYmplY3QgKnRlbXA7Ci0JCQkJCWFzc2VydCh0emluZm9hcmcgIT0gTlVMTCk7Ci0JCQkJCXRlbXAgPSBjYWxsX3R6bmFtZSh0emluZm8sIHR6aW5mb2FyZyk7Ci0JCQkJCWlmICh0ZW1wID09IE5VTEwpIGdvdG8gRG9uZTsKLQkJCQkJaWYgKHRlbXAgIT0gUHlfTm9uZSkgewotCQkJCQkJYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHRlbXApKTsKLQkJCQkJCS8qIFNpbmNlIHRoZSB0em5hbWUgaXMgZ2V0dGluZwotCQkJCQkJICogc3R1ZmZlZCBpbnRvIHRoZSBmb3JtYXQsIHdlCi0JCQkJCQkgKiBoYXZlIHRvIGRvdWJsZSBhbnkgJSBzaWducwotCQkJCQkJICogc28gdGhhdCBzdHJmdGltZSBkb2Vzbid0Ci0JCQkJCQkgKiB0cmVhdCB0aGVtIGFzIGZvcm1hdCBjb2Rlcy4KLQkJCQkJCSAqLwotCQkJCQkJUHlfREVDUkVGKFpyZXBsYWNlbWVudCk7Ci0JCQkJCQlacmVwbGFjZW1lbnQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKAotCQkJCQkJCXRlbXAsICJyZXBsYWNlIiwKLQkJCQkJCQkic3MiLCAiJSIsICIlJSIpOwotCQkJCQkJUHlfREVDUkVGKHRlbXApOwotCQkJCQkJaWYgKFpyZXBsYWNlbWVudCA9PSBOVUxMKQotCQkJCQkJCWdvdG8gRG9uZTsKLQkJCQkJCWlmICghUHlTdHJpbmdfQ2hlY2soWnJlcGxhY2VtZW50KSkgewotCQkJCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ0em5hbWUucmVwbGFjZSgpIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nIik7Ci0JCQkJCQkJZ290byBEb25lOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhc3NlcnQoWnJlcGxhY2VtZW50ICE9IE5VTEwpOwotCQkJcHRvYXBwZW5kID0gUHlTdHJpbmdfQVNfU1RSSU5HKFpyZXBsYWNlbWVudCk7Ci0JCQludG9hcHBlbmQgPSBQeVN0cmluZ19HRVRfU0laRShacmVwbGFjZW1lbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNoID09ICdmJykgewotCQkJLyogZm9ybWF0IG1pY3Jvc2Vjb25kcyAqLwotCQkJaWYgKGZyZXBsYWNlbWVudCA9PSBOVUxMKSB7Ci0JCQkJZnJlcGxhY2VtZW50ID0gbWFrZV9mcmVwbGFjZW1lbnQob2JqZWN0KTsKLQkJCQlpZiAoZnJlcGxhY2VtZW50ID09IE5VTEwpCi0JCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJCWFzc2VydChmcmVwbGFjZW1lbnQgIT0gTlVMTCk7Ci0JCQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2soZnJlcGxhY2VtZW50KSk7Ci0JCQlwdG9hcHBlbmQgPSBQeVN0cmluZ19BU19TVFJJTkcoZnJlcGxhY2VtZW50KTsKLQkJCW50b2FwcGVuZCA9IFB5U3RyaW5nX0dFVF9TSVpFKGZyZXBsYWNlbWVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBwZXJjZW50IGZvbGxvd2VkIGJ5IG5laXRoZXIgeiBub3IgWiAqLwotCQkJcHRvYXBwZW5kID0gcGluIC0gMjsKLQkJCW50b2FwcGVuZCA9IDI7Ci0JCX0KKyAgICBwaW4gPSBmb3JtYXQ7CisgICAgd2hpbGUgKChjaCA9ICpwaW4rKykgIT0gJ1wwJykgeworICAgICAgICBpZiAoY2ggIT0gJyUnKSB7CisgICAgICAgICAgICBwdG9hcHBlbmQgPSBwaW4gLSAxOworICAgICAgICAgICAgbnRvYXBwZW5kID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoY2ggPSAqcGluKyspID09ICdcMCcpIHsKKyAgICAgICAgICAgIC8qIFRoZXJlJ3MgYSBsb25lIHRyYWlsaW5nICU7IGRvZXNuJ3QgbWFrZSBzZW5zZS4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic3RyZnRpbWUgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5kcyB3aXRoIHJhdyAlIik7CisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIH0KKyAgICAgICAgLyogQSAlIGhhcyBiZWVuIHNlZW4gYW5kIGNoIGlzIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgaXQuICovCisgICAgICAgIGVsc2UgaWYgKGNoID09ICd6JykgeworICAgICAgICAgICAgaWYgKHpyZXBsYWNlbWVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogZm9ybWF0IHV0Y29mZnNldCAqLworICAgICAgICAgICAgICAgIGNoYXIgYnVmWzEwMF07CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mbyA9IGdldF90emluZm9fbWVtYmVyKG9iamVjdCk7CisgICAgICAgICAgICAgICAgenJlcGxhY2VtZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgICAgICAgICAgaWYgKHpyZXBsYWNlbWVudCA9PSBOVUxMKSBnb3RvIERvbmU7CisgICAgICAgICAgICAgICAgaWYgKHR6aW5mbyAhPSBQeV9Ob25lICYmIHR6aW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh0emluZm9hcmcgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXRfdXRjb2Zmc2V0KGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mb2FyZykgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoenJlcGxhY2VtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgenJlcGxhY2VtZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgICAgICAgICAgICAgICAgICBpZiAoenJlcGxhY2VtZW50ID09IE5VTEwpIGdvdG8gRG9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoenJlcGxhY2VtZW50ICE9IE5VTEwpOworICAgICAgICAgICAgcHRvYXBwZW5kID0gUHlTdHJpbmdfQVNfU1RSSU5HKHpyZXBsYWNlbWVudCk7CisgICAgICAgICAgICBudG9hcHBlbmQgPSBQeVN0cmluZ19HRVRfU0laRSh6cmVwbGFjZW1lbnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNoID09ICdaJykgeworICAgICAgICAgICAgLyogZm9ybWF0IHR6bmFtZSAqLworICAgICAgICAgICAgaWYgKFpyZXBsYWNlbWVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mbyA9IGdldF90emluZm9fbWVtYmVyKG9iamVjdCk7CisgICAgICAgICAgICAgICAgWnJlcGxhY2VtZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgICAgICAgICAgaWYgKFpyZXBsYWNlbWVudCA9PSBOVUxMKSBnb3RvIERvbmU7CisgICAgICAgICAgICAgICAgaWYgKHR6aW5mbyAhPSBQeV9Ob25lICYmIHR6aW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0ZW1wOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQodHppbmZvYXJnICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gY2FsbF90em5hbWUodHppbmZvLCB0emluZm9hcmcpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSBnb3RvIERvbmU7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChQeVN0cmluZ19DaGVjayh0ZW1wKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaW5jZSB0aGUgdHpuYW1lIGlzIGdldHRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0dWZmZWQgaW50byB0aGUgZm9ybWF0LCB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogaGF2ZSB0byBkb3VibGUgYW55ICUgc2lnbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNvIHRoYXQgc3RyZnRpbWUgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAgICAgICogdHJlYXQgdGhlbSBhcyBmb3JtYXQgY29kZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihacmVwbGFjZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgWnJlcGxhY2VtZW50ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCAicmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNzIiwgIiUiLCAiJSUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChacmVwbGFjZW1lbnQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKFpyZXBsYWNlbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidHpuYW1lLnJlcGxhY2UoKSBkaWQgbm90IHJldHVybiBhIHN0cmluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0KFpyZXBsYWNlbWVudCAhPSBOVUxMKTsKKyAgICAgICAgICAgIHB0b2FwcGVuZCA9IFB5U3RyaW5nX0FTX1NUUklORyhacmVwbGFjZW1lbnQpOworICAgICAgICAgICAgbnRvYXBwZW5kID0gUHlTdHJpbmdfR0VUX1NJWkUoWnJlcGxhY2VtZW50KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjaCA9PSAnZicpIHsKKyAgICAgICAgICAgIC8qIGZvcm1hdCBtaWNyb3NlY29uZHMgKi8KKyAgICAgICAgICAgIGlmIChmcmVwbGFjZW1lbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZyZXBsYWNlbWVudCA9IG1ha2VfZnJlcGxhY2VtZW50KG9iamVjdCk7CisgICAgICAgICAgICAgICAgaWYgKGZyZXBsYWNlbWVudCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoZnJlcGxhY2VtZW50ICE9IE5VTEwpOworICAgICAgICAgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGZyZXBsYWNlbWVudCkpOworICAgICAgICAgICAgcHRvYXBwZW5kID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZyZXBsYWNlbWVudCk7CisgICAgICAgICAgICBudG9hcHBlbmQgPSBQeVN0cmluZ19HRVRfU0laRShmcmVwbGFjZW1lbnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogcGVyY2VudCBmb2xsb3dlZCBieSBuZWl0aGVyIHogbm9yIFogKi8KKyAgICAgICAgICAgIHB0b2FwcGVuZCA9IHBpbiAtIDI7CisgICAgICAgICAgICBudG9hcHBlbmQgPSAyOworICAgICAgICB9CiAKLSAJCS8qIEFwcGVuZCB0aGUgbnRvYXBwZW5kIGNoYXJzIHN0YXJ0aW5nIGF0IHB0b2FwcGVuZCB0bwotIAkJICogdGhlIG5ldyBmb3JtYXQuCi0gCQkgKi8KLSAJCWFzc2VydChwdG9hcHBlbmQgIT0gTlVMTCk7Ci0gCQlhc3NlcnQobnRvYXBwZW5kID49IDApOwotIAkJaWYgKG50b2FwcGVuZCA9PSAwKQotIAkJCWNvbnRpbnVlOwotIAkJd2hpbGUgKHVzZWRuZXcgKyBudG9hcHBlbmQgPiB0b3RhbG5ldykgewotIAkJCXNpemVfdCBiaWdnZXIgPSB0b3RhbG5ldyA8PCAxOwotIAkJCWlmICgoYmlnZ2VyID4+IDEpICE9IHRvdGFsbmV3KSB7IC8qIG92ZXJmbG93ICovCi0gCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0gCQkJCWdvdG8gRG9uZTsKLSAJCQl9Ci0gCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJm5ld2ZtdCwgYmlnZ2VyKSA8IDApCi0gCQkJCWdvdG8gRG9uZTsKLSAJCQl0b3RhbG5ldyA9IGJpZ2dlcjsKLSAJCQlwbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3Zm10KSArIHVzZWRuZXc7Ci0gCQl9Ci0JCW1lbWNweShwbmV3LCBwdG9hcHBlbmQsIG50b2FwcGVuZCk7Ci0JCXBuZXcgKz0gbnRvYXBwZW5kOwotCQl1c2VkbmV3ICs9IG50b2FwcGVuZDsKLQkJYXNzZXJ0KHVzZWRuZXcgPD0gdG90YWxuZXcpOwotCX0gIC8qIGVuZCB3aGlsZSgpICovCisgICAgICAgIC8qIEFwcGVuZCB0aGUgbnRvYXBwZW5kIGNoYXJzIHN0YXJ0aW5nIGF0IHB0b2FwcGVuZCB0bworICAgICAgICAgKiB0aGUgbmV3IGZvcm1hdC4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydChwdG9hcHBlbmQgIT0gTlVMTCk7CisgICAgICAgIGFzc2VydChudG9hcHBlbmQgPj0gMCk7CisgICAgICAgIGlmIChudG9hcHBlbmQgPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB3aGlsZSAodXNlZG5ldyArIG50b2FwcGVuZCA+IHRvdGFsbmV3KSB7CisgICAgICAgICAgICBzaXplX3QgYmlnZ2VyID0gdG90YWxuZXcgPDwgMTsKKyAgICAgICAgICAgIGlmICgoYmlnZ2VyID4+IDEpICE9IHRvdGFsbmV3KSB7IC8qIG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmbmV3Zm10LCBiaWdnZXIpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB0b3RhbG5ldyA9IGJpZ2dlcjsKKyAgICAgICAgICAgIHBuZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdmbXQpICsgdXNlZG5ldzsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocG5ldywgcHRvYXBwZW5kLCBudG9hcHBlbmQpOworICAgICAgICBwbmV3ICs9IG50b2FwcGVuZDsKKyAgICAgICAgdXNlZG5ldyArPSBudG9hcHBlbmQ7CisgICAgICAgIGFzc2VydCh1c2VkbmV3IDw9IHRvdGFsbmV3KTsKKyAgICB9ICAvKiBlbmQgd2hpbGUoKSAqLwogCi0JaWYgKF9QeVN0cmluZ19SZXNpemUoJm5ld2ZtdCwgdXNlZG5ldykgPCAwKQotCQlnb3RvIERvbmU7Ci0JewotCQlQeU9iamVjdCAqdGltZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInRpbWUiKTsKLQkJaWYgKHRpbWUgPT0gTlVMTCkKLQkJCWdvdG8gRG9uZTsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0aW1lLCAic3RyZnRpbWUiLCAiT08iLAotCQkJCQkgICAgIG5ld2ZtdCwgdGltZXR1cGxlKTsKLQkJUHlfREVDUkVGKHRpbWUpOwotICAgIAl9CisgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJm5ld2ZtdCwgdXNlZG5ldykgPCAwKQorICAgICAgICBnb3RvIERvbmU7CisgICAgeworICAgICAgICBQeU9iamVjdCAqdGltZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInRpbWUiKTsKKyAgICAgICAgaWYgKHRpbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0aW1lLCAic3RyZnRpbWUiLCAiT08iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2ZtdCwgdGltZXR1cGxlKTsKKyAgICAgICAgUHlfREVDUkVGKHRpbWUpOworICAgIH0KICBEb25lOgotCVB5X1hERUNSRUYoZnJlcGxhY2VtZW50KTsKLQlQeV9YREVDUkVGKHpyZXBsYWNlbWVudCk7Ci0JUHlfWERFQ1JFRihacmVwbGFjZW1lbnQpOwotCVB5X1hERUNSRUYobmV3Zm10KTsKLSAgICAJcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGZyZXBsYWNlbWVudCk7CisgICAgUHlfWERFQ1JFRih6cmVwbGFjZW1lbnQpOworICAgIFB5X1hERUNSRUYoWnJlcGxhY2VtZW50KTsKKyAgICBQeV9YREVDUkVGKG5ld2ZtdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGNoYXIgKgogaXNvZm9ybWF0X2RhdGUoUHlEYXRlVGltZV9EYXRlICpkdCwgY2hhciBidWZmZXJbXSwgaW50IGJ1ZmZsZW4pCiB7Ci0JaW50IHg7Ci0JeCA9IFB5T1Nfc25wcmludGYoYnVmZmVyLCBidWZmbGVuLAotCQkJICAiJTA0ZC0lMDJkLSUwMmQiLAotCQkJICBHRVRfWUVBUihkdCksIEdFVF9NT05USChkdCksIEdFVF9EQVkoZHQpKTsKLQlhc3NlcnQoYnVmZmxlbiA+PSB4KTsKLQlyZXR1cm4gYnVmZmVyICsgeDsKKyAgICBpbnQgeDsKKyAgICB4ID0gUHlPU19zbnByaW50ZihidWZmZXIsIGJ1ZmZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIiwKKyAgICAgICAgICAgICAgICAgICAgICBHRVRfWUVBUihkdCksIEdFVF9NT05USChkdCksIEdFVF9EQVkoZHQpKTsKKyAgICBhc3NlcnQoYnVmZmxlbiA+PSB4KTsKKyAgICByZXR1cm4gYnVmZmVyICsgeDsKIH0KIAogc3RhdGljIGNoYXIgKgogaXNvZm9ybWF0X3RpbWUoUHlEYXRlVGltZV9EYXRlVGltZSAqZHQsIGNoYXIgYnVmZmVyW10sIGludCBidWZmbGVuKQogewotCWludCB4OwotCWludCB1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKGR0KTsKKyAgICBpbnQgeDsKKyAgICBpbnQgdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChkdCk7CiAKLQl4ID0gUHlPU19zbnByaW50ZihidWZmZXIsIGJ1ZmZsZW4sCi0JCQkgICIlMDJkOiUwMmQ6JTAyZCIsCi0JCQkgIERBVEVfR0VUX0hPVVIoZHQpLAotCQkJICBEQVRFX0dFVF9NSU5VVEUoZHQpLAotCQkJICBEQVRFX0dFVF9TRUNPTkQoZHQpKTsKLQlhc3NlcnQoYnVmZmxlbiA+PSB4KTsKLQlpZiAodXMpCi0JCXggKz0gUHlPU19zbnByaW50ZihidWZmZXIgKyB4LCBidWZmbGVuIC0geCwgIi4lMDZkIiwgdXMpOwotCWFzc2VydChidWZmbGVuID49IHgpOwotCXJldHVybiBidWZmZXIgKyB4OworICAgIHggPSBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgYnVmZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAiJTAyZDolMDJkOiUwMmQiLAorICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIoZHQpLAorICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURShkdCksCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKGR0KSk7CisgICAgYXNzZXJ0KGJ1ZmZsZW4gPj0geCk7CisgICAgaWYgKHVzKQorICAgICAgICB4ICs9IFB5T1Nfc25wcmludGYoYnVmZmVyICsgeCwgYnVmZmxlbiAtIHgsICIuJTA2ZCIsIHVzKTsKKyAgICBhc3NlcnQoYnVmZmxlbiA+PSB4KTsKKyAgICByZXR1cm4gYnVmZmVyICsgeDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMzkzLDE0ICsxMzkzLDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV90aW1lKHZvaWQpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JUHlPYmplY3QgKnRpbWUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ0aW1lIik7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRpbWUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ0aW1lIik7CiAKLQlpZiAodGltZSAhPSBOVUxMKSB7Ci0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGltZSwgInRpbWUiLCAiKCkiKTsKLQkJUHlfREVDUkVGKHRpbWUpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICh0aW1lICE9IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0aW1lLCAidGltZSIsICIoKSIpOworICAgICAgICBQeV9ERUNSRUYodGltZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEJ1aWxkIGEgdGltZS5zdHJ1Y3RfdGltZS4gIFRoZSB3ZWVrZGF5IGFuZCBkYXkgbnVtYmVyIGFyZSBhdXRvbWF0aWNhbGx5CkBAIC0xNDA5LDIxICsxNDA5LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbGRfc3RydWN0X3RpbWUoaW50IHksIGludCBtLCBpbnQgZCwgaW50IGhoLCBpbnQgbW0sIGludCBzcywgaW50IGRzdGZsYWcpCiB7Ci0JUHlPYmplY3QgKnRpbWU7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRpbWU7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLQl0aW1lID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOwotCWlmICh0aW1lICE9IE5VTEwpIHsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0aW1lLCAic3RydWN0X3RpbWUiLAotCQkJCQkgICAgICIoKGlpaWlpaWlpaSkpIiwKLQkJCQkJICAgICB5LCBtLCBkLAotCQkJCQkgICAgIGhoLCBtbSwgc3MsCi0JCQkJIAkgICAgIHdlZWtkYXkoeSwgbSwgZCksCi0JCQkJIAkgICAgIGRheXNfYmVmb3JlX21vbnRoKHksIG0pICsgZCwKLQkJCQkgCSAgICAgZHN0ZmxhZyk7Ci0JCVB5X0RFQ1JFRih0aW1lKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICB0aW1lID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOworICAgIGlmICh0aW1lICE9IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0aW1lLCAic3RydWN0X3RpbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKGlpaWlpaWlpaSkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCBtLCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoLCBtbSwgc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla2RheSh5LCBtLCBkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlzX2JlZm9yZV9tb250aCh5LCBtKSArIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ZmxhZyk7CisgICAgICAgIFB5X0RFQ1JFRih0aW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDM3LDMzICsxNDM3LDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGlmZl90b19ib29sKGludCBkaWZmLCBpbnQgb3ApCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlpbnQgaXN0cnVlOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IGlzdHJ1ZTsKIAotCXN3aXRjaCAob3ApIHsKLQkJY2FzZSBQeV9FUTogaXN0cnVlID0gZGlmZiA9PSAwOyBicmVhazsKLQkJY2FzZSBQeV9ORTogaXN0cnVlID0gZGlmZiAhPSAwOyBicmVhazsKLQkJY2FzZSBQeV9MRTogaXN0cnVlID0gZGlmZiA8PSAwOyBicmVhazsKLQkJY2FzZSBQeV9HRTogaXN0cnVlID0gZGlmZiA+PSAwOyBicmVhazsKLQkJY2FzZSBQeV9MVDogaXN0cnVlID0gZGlmZiA8IDA7IGJyZWFrOwotCQljYXNlIFB5X0dUOiBpc3RydWUgPSBkaWZmID4gMDsgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlhc3NlcnQoISAib3AgdW5rbm93biIpOwotCQkJaXN0cnVlID0gMDsgLyogVG8gc2h1dCB1cCBjb21waWxlciAqLwotCX0KLQlyZXN1bHQgPSBpc3RydWUgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgUHlfRVE6IGlzdHJ1ZSA9IGRpZmYgPT0gMDsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTkU6IGlzdHJ1ZSA9IGRpZmYgIT0gMDsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTEU6IGlzdHJ1ZSA9IGRpZmYgPD0gMDsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfR0U6IGlzdHJ1ZSA9IGRpZmYgPj0gMDsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTFQ6IGlzdHJ1ZSA9IGRpZmYgPCAwOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9HVDogaXN0cnVlID0gZGlmZiA+IDA7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KCEgIm9wIHVua25vd24iKTsKKyAgICAgICAgICAgIGlzdHJ1ZSA9IDA7IC8qIFRvIHNodXQgdXAgY29tcGlsZXIgKi8KKyAgICB9CisgICAgcmVzdWx0ID0gaXN0cnVlID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFJhaXNlcyBhICJjYW4ndCBjb21wYXJlIiBUeXBlRXJyb3IgYW5kIHJldHVybnMgTlVMTC4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBjbXBlcnJvcihQeU9iamVjdCAqYSwgUHlPYmplY3QgKmIpCiB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiY2FuJ3QgY29tcGFyZSAlcyB0byAlcyIsCi0JCSAgICAgUHlfVFlQRShhKS0+dHBfbmFtZSwgUHlfVFlQRShiKS0+dHBfbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImNhbid0IGNvbXBhcmUgJXMgdG8gJXMiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKGEpLT50cF9uYW1lLCBQeV9UWVBFKGIpLT50cF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDcxLDEzICsxNDcxLDEzIEBACiAgKi8KIAogLyogQ29udmVyc2lvbiBmYWN0b3JzLiAqLwotc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfdXMgPSBOVUxMOwkvKiAxICovCi1zdGF0aWMgUHlPYmplY3QgKnVzX3Blcl9tcyA9IE5VTEw7CS8qIDEwMDAgKi8KLXN0YXRpYyBQeU9iamVjdCAqdXNfcGVyX3NlY29uZCA9IE5VTEw7CS8qIDEwMDAwMDAgKi8KLXN0YXRpYyBQeU9iamVjdCAqdXNfcGVyX21pbnV0ZSA9IE5VTEw7CS8qIDFlNiAqIDYwIGFzIFB5dGhvbiBpbnQgKi8KLXN0YXRpYyBQeU9iamVjdCAqdXNfcGVyX2hvdXIgPSBOVUxMOwkvKiAxZTYgKiAzNjAwIGFzIFB5dGhvbiBsb25nICovCi1zdGF0aWMgUHlPYmplY3QgKnVzX3Blcl9kYXkgPSBOVUxMOwkvKiAxZTYgKiAzNjAwICogMjQgYXMgUHl0aG9uIGxvbmcgKi8KLXN0YXRpYyBQeU9iamVjdCAqdXNfcGVyX3dlZWsgPSBOVUxMOwkvKiAxZTYqMzYwMCoyNCo3IGFzIFB5dGhvbiBsb25nICovCitzdGF0aWMgUHlPYmplY3QgKnVzX3Blcl91cyA9IE5VTEw7ICAgICAgLyogMSAqLworc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfbXMgPSBOVUxMOyAgICAgIC8qIDEwMDAgKi8KK3N0YXRpYyBQeU9iamVjdCAqdXNfcGVyX3NlY29uZCA9IE5VTEw7ICAvKiAxMDAwMDAwICovCitzdGF0aWMgUHlPYmplY3QgKnVzX3Blcl9taW51dGUgPSBOVUxMOyAgLyogMWU2ICogNjAgYXMgUHl0aG9uIGludCAqLworc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfaG91ciA9IE5VTEw7ICAgIC8qIDFlNiAqIDM2MDAgYXMgUHl0aG9uIGxvbmcgKi8KK3N0YXRpYyBQeU9iamVjdCAqdXNfcGVyX2RheSA9IE5VTEw7ICAgICAvKiAxZTYgKiAzNjAwICogMjQgYXMgUHl0aG9uIGxvbmcgKi8KK3N0YXRpYyBQeU9iamVjdCAqdXNfcGVyX3dlZWsgPSBOVUxMOyAgICAvKiAxZTYqMzYwMCoyNCo3IGFzIFB5dGhvbiBsb25nICovCiBzdGF0aWMgUHlPYmplY3QgKnNlY29uZHNfcGVyX2RheSA9IE5VTEw7IC8qIDM2MDAqMjQgYXMgUHl0aG9uIGludCAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE0ODksNyArMTQ4OSw3IEBACiAgKi8KIAogLyogQ29udmVydCBhIHRpbWVkZWx0YSB0byBhIG51bWJlciBvZiB1cywKLSAqIAkoMjQqMzYwMCpzZWxmLmRheXMgKyBzZWxmLnNlY29uZHMpKjEwMDAwMDAgKyBzZWxmLm1pY3Jvc2Vjb25kcworICogICAgICAoMjQqMzYwMCpzZWxmLmRheXMgKyBzZWxmLnNlY29uZHMpKjEwMDAwMDAgKyBzZWxmLm1pY3Jvc2Vjb25kcwogICogYXMgYSBQeXRob24gaW50IG9yIGxvbmcuCiAgKiBEb2luZyBtaXhlZC1yYWRpeCBhcml0aG1ldGljIGJ5IGhhbmQgaW5zdGVhZCBpcyBleGNydWNpYXRpbmcgaW4gQywKICAqIGR1ZSB0byB1YmlxdWl0b3VzIG92ZXJmbG93IHBvc3NpYmlsaXRpZXMuCkBAIC0xNDk3LDQ5ICsxNDk3LDQ5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfdG9fbWljcm9zZWNvbmRzKFB5RGF0ZVRpbWVfRGVsdGEgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKngxID0gTlVMTDsKLQlQeU9iamVjdCAqeDIgPSBOVUxMOwotCVB5T2JqZWN0ICp4MyA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKngxID0gTlVMTDsKKyAgICBQeU9iamVjdCAqeDIgPSBOVUxMOworICAgIFB5T2JqZWN0ICp4MyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLQl4MSA9IFB5SW50X0Zyb21Mb25nKEdFVF9URF9EQVlTKHNlbGYpKTsKLQlpZiAoeDEgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXgyID0gUHlOdW1iZXJfTXVsdGlwbHkoeDEsIHNlY29uZHNfcGVyX2RheSk7CS8qIGRheXMgaW4gc2Vjb25kcyAqLwotCWlmICh4MiA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JUHlfREVDUkVGKHgxKTsKLQl4MSA9IE5VTEw7CisgICAgeDEgPSBQeUludF9Gcm9tTG9uZyhHRVRfVERfREFZUyhzZWxmKSk7CisgICAgaWYgKHgxID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB4MiA9IFB5TnVtYmVyX011bHRpcGx5KHgxLCBzZWNvbmRzX3Blcl9kYXkpOyAgICAgICAgLyogZGF5cyBpbiBzZWNvbmRzICovCisgICAgaWYgKHgyID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICBQeV9ERUNSRUYoeDEpOworICAgIHgxID0gTlVMTDsKIAotCS8qIHgyIGhhcyBkYXlzIGluIHNlY29uZHMgKi8KLQl4MSA9IFB5SW50X0Zyb21Mb25nKEdFVF9URF9TRUNPTkRTKHNlbGYpKTsJLyogc2Vjb25kcyAqLwotCWlmICh4MSA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JeDMgPSBQeU51bWJlcl9BZGQoeDEsIHgyKTsJLyogZGF5cyBhbmQgc2Vjb25kcyBpbiBzZWNvbmRzICovCi0JaWYgKHgzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlQeV9ERUNSRUYoeDEpOwotCVB5X0RFQ1JFRih4Mik7Ci0JeDIgPSBOVUxMOworICAgIC8qIHgyIGhhcyBkYXlzIGluIHNlY29uZHMgKi8KKyAgICB4MSA9IFB5SW50X0Zyb21Mb25nKEdFVF9URF9TRUNPTkRTKHNlbGYpKTsgICAgICAgICAgLyogc2Vjb25kcyAqLworICAgIGlmICh4MSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgeDMgPSBQeU51bWJlcl9BZGQoeDEsIHgyKTsgICAgICAgICAgLyogZGF5cyBhbmQgc2Vjb25kcyBpbiBzZWNvbmRzICovCisgICAgaWYgKHgzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICBQeV9ERUNSRUYoeDEpOworICAgIFB5X0RFQ1JFRih4Mik7CisgICAgeDIgPSBOVUxMOwogCi0JLyogeDMgaGFzIGRheXMrc2Vjb25kcyBpbiBzZWNvbmRzICovCi0JeDEgPSBQeU51bWJlcl9NdWx0aXBseSh4MywgdXNfcGVyX3NlY29uZCk7CS8qIHVzICovCi0JaWYgKHgxID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlQeV9ERUNSRUYoeDMpOwotCXgzID0gTlVMTDsKKyAgICAvKiB4MyBoYXMgZGF5cytzZWNvbmRzIGluIHNlY29uZHMgKi8KKyAgICB4MSA9IFB5TnVtYmVyX011bHRpcGx5KHgzLCB1c19wZXJfc2Vjb25kKTsgICAgICAgICAgLyogdXMgKi8KKyAgICBpZiAoeDEgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIFB5X0RFQ1JFRih4Myk7CisgICAgeDMgPSBOVUxMOwogCi0JLyogeDEgaGFzIGRheXMrc2Vjb25kcyBpbiB1cyAqLwotCXgyID0gUHlJbnRfRnJvbUxvbmcoR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSk7Ci0JaWYgKHgyID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlyZXN1bHQgPSBQeU51bWJlcl9BZGQoeDEsIHgyKTsKKyAgICAvKiB4MSBoYXMgZGF5cytzZWNvbmRzIGluIHVzICovCisgICAgeDIgPSBQeUludF9Gcm9tTG9uZyhHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpKTsKKyAgICBpZiAoeDIgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHJlc3VsdCA9IFB5TnVtYmVyX0FkZCh4MSwgeDIpOwogCiBEb25lOgotCVB5X1hERUNSRUYoeDEpOwotCVB5X1hERUNSRUYoeDIpOwotCVB5X1hERUNSRUYoeDMpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRih4MSk7CisgICAgUHlfWERFQ1JFRih4Mik7CisgICAgUHlfWERFQ1JFRih4Myk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogQ29udmVydCBhIG51bWJlciBvZiB1cyAoYXMgYSBQeXRob24gaW50IG9yIGxvbmcpIHRvIGEgdGltZWRlbHRhLgpAQCAtMTU0NywyMDUgKzE1NDcsMjA1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWljcm9zZWNvbmRzX3RvX2RlbHRhX2V4KFB5T2JqZWN0ICpweXVzLCBQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JaW50IHVzOwotCWludCBzOwotCWludCBkOwotCWxvbmcgdGVtcDsKKyAgICBpbnQgdXM7CisgICAgaW50IHM7CisgICAgaW50IGQ7CisgICAgbG9uZyB0ZW1wOwogCi0JUHlPYmplY3QgKnR1cGxlID0gTlVMTDsKLQlQeU9iamVjdCAqbnVtID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdHVwbGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpudW0gPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JdHVwbGUgPSBQeU51bWJlcl9EaXZtb2QocHl1cywgdXNfcGVyX3NlY29uZCk7Ci0JaWYgKHR1cGxlID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICB0dXBsZSA9IFB5TnVtYmVyX0Rpdm1vZChweXVzLCB1c19wZXJfc2Vjb25kKTsKKyAgICBpZiAodHVwbGUgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JbnVtID0gUHlUdXBsZV9HZXRJdGVtKHR1cGxlLCAxKTsJLyogdXMgKi8KLQlpZiAobnVtID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl0ZW1wID0gUHlMb25nX0FzTG9uZyhudW0pOwotCW51bSA9IE5VTEw7Ci0JaWYgKHRlbXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBEb25lOwotCWFzc2VydCgwIDw9IHRlbXAgJiYgdGVtcCA8IDEwMDAwMDApOwotCXVzID0gKGludCl0ZW1wOwotCWlmICh1cyA8IDApIHsKLQkJLyogVGhlIGRpdmlzb3Igd2FzIHBvc2l0aXZlLCBzbyB0aGlzIG11c3QgYmUgYW4gZXJyb3IuICovCi0JCWFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKLQkJZ290byBEb25lOwotCX0KKyAgICBudW0gPSBQeVR1cGxlX0dldEl0ZW0odHVwbGUsIDEpOyAgICAgICAgICAgIC8qIHVzICovCisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgdGVtcCA9IFB5TG9uZ19Bc0xvbmcobnVtKTsKKyAgICBudW0gPSBOVUxMOworICAgIGlmICh0ZW1wID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICBhc3NlcnQoMCA8PSB0ZW1wICYmIHRlbXAgPCAxMDAwMDAwKTsKKyAgICB1cyA9IChpbnQpdGVtcDsKKyAgICBpZiAodXMgPCAwKSB7CisgICAgICAgIC8qIFRoZSBkaXZpc29yIHdhcyBwb3NpdGl2ZSwgc28gdGhpcyBtdXN0IGJlIGFuIGVycm9yLiAqLworICAgICAgICBhc3NlcnQoUHlFcnJfT2NjdXJyZWQoKSk7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CiAKLQludW0gPSBQeVR1cGxlX0dldEl0ZW0odHVwbGUsIDApOwkvKiBsZWZ0b3ZlciBzZWNvbmRzICovCi0JaWYgKG51bSA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JUHlfSU5DUkVGKG51bSk7Ci0JUHlfREVDUkVGKHR1cGxlKTsKKyAgICBudW0gPSBQeVR1cGxlX0dldEl0ZW0odHVwbGUsIDApOyAgICAgICAgICAgIC8qIGxlZnRvdmVyIHNlY29uZHMgKi8KKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICBQeV9JTkNSRUYobnVtKTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOwogCi0JdHVwbGUgPSBQeU51bWJlcl9EaXZtb2QobnVtLCBzZWNvbmRzX3Blcl9kYXkpOwotCWlmICh0dXBsZSA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JUHlfREVDUkVGKG51bSk7CisgICAgdHVwbGUgPSBQeU51bWJlcl9EaXZtb2QobnVtLCBzZWNvbmRzX3Blcl9kYXkpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgUHlfREVDUkVGKG51bSk7CiAKLQludW0gPSBQeVR1cGxlX0dldEl0ZW0odHVwbGUsIDEpOyAJLyogc2Vjb25kcyAqLwotCWlmIChudW0gPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXRlbXAgPSBQeUxvbmdfQXNMb25nKG51bSk7Ci0JbnVtID0gTlVMTDsKLQlpZiAodGVtcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlnb3RvIERvbmU7Ci0JYXNzZXJ0KDAgPD0gdGVtcCAmJiB0ZW1wIDwgMjQqMzYwMCk7Ci0JcyA9IChpbnQpdGVtcDsKKyAgICBudW0gPSBQeVR1cGxlX0dldEl0ZW0odHVwbGUsIDEpOyAgICAgICAgICAgIC8qIHNlY29uZHMgKi8KKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB0ZW1wID0gUHlMb25nX0FzTG9uZyhudW0pOworICAgIG51bSA9IE5VTEw7CisgICAgaWYgKHRlbXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBEb25lOworICAgIGFzc2VydCgwIDw9IHRlbXAgJiYgdGVtcCA8IDI0KjM2MDApOworICAgIHMgPSAoaW50KXRlbXA7CiAKLQlpZiAocyA8IDApIHsKLQkJLyogVGhlIGRpdmlzb3Igd2FzIHBvc2l0aXZlLCBzbyB0aGlzIG11c3QgYmUgYW4gZXJyb3IuICovCi0JCWFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKLQkJZ290byBEb25lOwotCX0KKyAgICBpZiAocyA8IDApIHsKKyAgICAgICAgLyogVGhlIGRpdmlzb3Igd2FzIHBvc2l0aXZlLCBzbyB0aGlzIG11c3QgYmUgYW4gZXJyb3IuICovCisgICAgICAgIGFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KIAotCW51bSA9IFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwgMCk7CS8qIGxlZnRvdmVyIGRheXMgKi8KLQlpZiAobnVtID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlQeV9JTkNSRUYobnVtKTsKLQl0ZW1wID0gUHlMb25nX0FzTG9uZyhudW0pOwotCWlmICh0ZW1wID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCWdvdG8gRG9uZTsKLQlkID0gKGludCl0ZW1wOwotCWlmICgobG9uZylkICE9IHRlbXApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJub3JtYWxpemVkIGRheXMgdG9vICIKLQkJCQkibGFyZ2UgdG8gZml0IGluIGEgQyBpbnQiKTsKLQkJZ290byBEb25lOwotCX0KLQlyZXN1bHQgPSBuZXdfZGVsdGFfZXgoZCwgcywgdXMsIDAsIHR5cGUpOworICAgIG51bSA9IFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwgMCk7ICAgICAgICAgICAgLyogbGVmdG92ZXIgZGF5cyAqLworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIFB5X0lOQ1JFRihudW0pOworICAgIHRlbXAgPSBQeUxvbmdfQXNMb25nKG51bSk7CisgICAgaWYgKHRlbXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBEb25lOworICAgIGQgPSAoaW50KXRlbXA7CisgICAgaWYgKChsb25nKWQgIT0gdGVtcCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5vcm1hbGl6ZWQgZGF5cyB0b28gIgorICAgICAgICAgICAgICAgICAgICAgICAgImxhcmdlIHRvIGZpdCBpbiBhIEMgaW50Iik7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CisgICAgcmVzdWx0ID0gbmV3X2RlbHRhX2V4KGQsIHMsIHVzLCAwLCB0eXBlKTsKIAogRG9uZToKLQlQeV9YREVDUkVGKHR1cGxlKTsKLQlQeV9YREVDUkVGKG51bSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKHR1cGxlKTsKKyAgICBQeV9YREVDUkVGKG51bSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotI2RlZmluZSBtaWNyb3NlY29uZHNfdG9fZGVsdGEocHltaWNyb3MpCVwKLQltaWNyb3NlY29uZHNfdG9fZGVsdGFfZXgocHltaWNyb3MsICZQeURhdGVUaW1lX0RlbHRhVHlwZSkKKyNkZWZpbmUgbWljcm9zZWNvbmRzX3RvX2RlbHRhKHB5bWljcm9zKSBcCisgICAgbWljcm9zZWNvbmRzX3RvX2RlbHRhX2V4KHB5bWljcm9zLCAmUHlEYXRlVGltZV9EZWx0YVR5cGUpCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtdWx0aXBseV9pbnRfdGltZWRlbHRhKFB5T2JqZWN0ICppbnRvYmosIFB5RGF0ZVRpbWVfRGVsdGEgKmRlbHRhKQogewotCVB5T2JqZWN0ICpweXVzX2luOwotCVB5T2JqZWN0ICpweXVzX291dDsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpweXVzX2luOworICAgIFB5T2JqZWN0ICpweXVzX291dDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JcHl1c19pbiA9IGRlbHRhX3RvX21pY3Jvc2Vjb25kcyhkZWx0YSk7Ci0JaWYgKHB5dXNfaW4gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcHl1c19pbiA9IGRlbHRhX3RvX21pY3Jvc2Vjb25kcyhkZWx0YSk7CisgICAgaWYgKHB5dXNfaW4gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlweXVzX291dCA9IFB5TnVtYmVyX011bHRpcGx5KHB5dXNfaW4sIGludG9iaik7Ci0JUHlfREVDUkVGKHB5dXNfaW4pOwotCWlmIChweXVzX291dCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBweXVzX291dCA9IFB5TnVtYmVyX011bHRpcGx5KHB5dXNfaW4sIGludG9iaik7CisgICAgUHlfREVDUkVGKHB5dXNfaW4pOworICAgIGlmIChweXVzX291dCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IG1pY3Jvc2Vjb25kc190b19kZWx0YShweXVzX291dCk7Ci0JUHlfREVDUkVGKHB5dXNfb3V0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHJlc3VsdCA9IG1pY3Jvc2Vjb25kc190b19kZWx0YShweXVzX291dCk7CisgICAgUHlfREVDUkVGKHB5dXNfb3V0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGl2aWRlX3RpbWVkZWx0YV9pbnQoUHlEYXRlVGltZV9EZWx0YSAqZGVsdGEsIFB5T2JqZWN0ICppbnRvYmopCiB7Ci0JUHlPYmplY3QgKnB5dXNfaW47Ci0JUHlPYmplY3QgKnB5dXNfb3V0OwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnB5dXNfaW47CisgICAgUHlPYmplY3QgKnB5dXNfb3V0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlweXVzX2luID0gZGVsdGFfdG9fbWljcm9zZWNvbmRzKGRlbHRhKTsKLQlpZiAocHl1c19pbiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBweXVzX2luID0gZGVsdGFfdG9fbWljcm9zZWNvbmRzKGRlbHRhKTsKKyAgICBpZiAocHl1c19pbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXB5dXNfb3V0ID0gUHlOdW1iZXJfRmxvb3JEaXZpZGUocHl1c19pbiwgaW50b2JqKTsKLQlQeV9ERUNSRUYocHl1c19pbik7Ci0JaWYgKHB5dXNfb3V0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHB5dXNfb3V0ID0gUHlOdW1iZXJfRmxvb3JEaXZpZGUocHl1c19pbiwgaW50b2JqKTsKKyAgICBQeV9ERUNSRUYocHl1c19pbik7CisgICAgaWYgKHB5dXNfb3V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gbWljcm9zZWNvbmRzX3RvX2RlbHRhKHB5dXNfb3V0KTsKLQlQeV9ERUNSRUYocHl1c19vdXQpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gbWljcm9zZWNvbmRzX3RvX2RlbHRhKHB5dXNfb3V0KTsKKyAgICBQeV9ERUNSRUYocHl1c19vdXQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9hZGQoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOwogCi0JaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkgJiYgUHlEZWx0YV9DaGVjayhyaWdodCkpIHsKLQkJLyogZGVsdGEgKyBkZWx0YSAqLwotCQkvKiBUaGUgQy1sZXZlbCBhZGRpdGlvbnMgY2FuJ3Qgb3ZlcmZsb3cgYmVjYXVzZSBvZiB0aGUKLQkJICogaW52YXJpYW50IGJvdW5kcy4KLQkJICovCi0JCWludCBkYXlzID0gR0VUX1REX0RBWVMobGVmdCkgKyBHRVRfVERfREFZUyhyaWdodCk7Ci0JCWludCBzZWNvbmRzID0gR0VUX1REX1NFQ09ORFMobGVmdCkgKyBHRVRfVERfU0VDT05EUyhyaWdodCk7Ci0JCWludCBtaWNyb3NlY29uZHMgPSBHRVRfVERfTUlDUk9TRUNPTkRTKGxlZnQpICsKLQkJCQkgICBHRVRfVERfTUlDUk9TRUNPTkRTKHJpZ2h0KTsKLQkJcmVzdWx0ID0gbmV3X2RlbHRhKGRheXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcywgMSk7Ci0JfQorICAgIGlmIChQeURlbHRhX0NoZWNrKGxlZnQpICYmIFB5RGVsdGFfQ2hlY2socmlnaHQpKSB7CisgICAgICAgIC8qIGRlbHRhICsgZGVsdGEgKi8KKyAgICAgICAgLyogVGhlIEMtbGV2ZWwgYWRkaXRpb25zIGNhbid0IG92ZXJmbG93IGJlY2F1c2Ugb2YgdGhlCisgICAgICAgICAqIGludmFyaWFudCBib3VuZHMuCisgICAgICAgICAqLworICAgICAgICBpbnQgZGF5cyA9IEdFVF9URF9EQVlTKGxlZnQpICsgR0VUX1REX0RBWVMocmlnaHQpOworICAgICAgICBpbnQgc2Vjb25kcyA9IEdFVF9URF9TRUNPTkRTKGxlZnQpICsgR0VUX1REX1NFQ09ORFMocmlnaHQpOworICAgICAgICBpbnQgbWljcm9zZWNvbmRzID0gR0VUX1REX01JQ1JPU0VDT05EUyhsZWZ0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKHJpZ2h0KTsKKyAgICAgICAgcmVzdWx0ID0gbmV3X2RlbHRhKGRheXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcywgMSk7CisgICAgfQogCi0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfbmVnYXRpdmUoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQlyZXR1cm4gbmV3X2RlbHRhKC1HRVRfVERfREFZUyhzZWxmKSwKLQkJCSAtR0VUX1REX1NFQ09ORFMoc2VsZiksCi0JCQkgLUdFVF9URF9NSUNST1NFQ09ORFMoc2VsZiksCi0JCQkgMSk7CisgICAgcmV0dXJuIG5ld19kZWx0YSgtR0VUX1REX0RBWVMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAtR0VUX1REX1NFQ09ORFMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAtR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfcG9zaXRpdmUoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQkvKiBDb3VsZCBvcHRpbWl6ZSB0aGlzIChieSByZXR1cm5pbmcgc2VsZikgaWYgdGhpcyBpc24ndCBhCi0JICogc3ViY2xhc3MgLS0gYnV0IHdobyB1c2VzIHVuYXJ5ICsgPyAgQXBwcm94aW1hdGVseSBub2JvZHkuCi0JICovCi0JcmV0dXJuIG5ld19kZWx0YShHRVRfVERfREFZUyhzZWxmKSwKLQkJCSBHRVRfVERfU0VDT05EUyhzZWxmKSwKLQkJCSBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpLAotCQkJIDApOworICAgIC8qIENvdWxkIG9wdGltaXplIHRoaXMgKGJ5IHJldHVybmluZyBzZWxmKSBpZiB0aGlzIGlzbid0IGEKKyAgICAgKiBzdWJjbGFzcyAtLSBidXQgd2hvIHVzZXMgdW5hcnkgKyA/ICBBcHByb3hpbWF0ZWx5IG5vYm9keS4KKyAgICAgKi8KKyAgICByZXR1cm4gbmV3X2RlbHRhKEdFVF9URF9EQVlTKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgR0VUX1REX1NFQ09ORFMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9hYnMoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlhc3NlcnQoR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSA+PSAwKTsKLQlhc3NlcnQoR0VUX1REX1NFQ09ORFMoc2VsZikgPj0gMCk7CisgICAgYXNzZXJ0KEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikgPj0gMCk7CisgICAgYXNzZXJ0KEdFVF9URF9TRUNPTkRTKHNlbGYpID49IDApOwogCi0JaWYgKEdFVF9URF9EQVlTKHNlbGYpIDwgMCkKLQkJcmVzdWx0ID0gZGVsdGFfbmVnYXRpdmUoc2VsZik7Ci0JZWxzZQotCQlyZXN1bHQgPSBkZWx0YV9wb3NpdGl2ZShzZWxmKTsKKyAgICBpZiAoR0VUX1REX0RBWVMoc2VsZikgPCAwKQorICAgICAgICByZXN1bHQgPSBkZWx0YV9uZWdhdGl2ZShzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IGRlbHRhX3Bvc2l0aXZlKHNlbGYpOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfc3VidHJhY3QoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOwogCi0JaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkgJiYgUHlEZWx0YV9DaGVjayhyaWdodCkpIHsKLQkgICAgCS8qIGRlbHRhIC0gZGVsdGEgKi8KLQkgICAgCVB5T2JqZWN0ICptaW51c19yaWdodCA9IFB5TnVtYmVyX05lZ2F0aXZlKHJpZ2h0KTsKLQkgICAgCWlmIChtaW51c19yaWdodCkgewotCSAgICAJCXJlc3VsdCA9IGRlbHRhX2FkZChsZWZ0LCBtaW51c19yaWdodCk7Ci0JICAgIAkJUHlfREVDUkVGKG1pbnVzX3JpZ2h0KTsKLQkgICAgCX0KLQkgICAgCWVsc2UKLQkgICAgCQlyZXN1bHQgPSBOVUxMOwotCX0KKyAgICBpZiAoUHlEZWx0YV9DaGVjayhsZWZ0KSAmJiBQeURlbHRhX0NoZWNrKHJpZ2h0KSkgeworICAgICAgICAvKiBkZWx0YSAtIGRlbHRhICovCisgICAgICAgIFB5T2JqZWN0ICptaW51c19yaWdodCA9IFB5TnVtYmVyX05lZ2F0aXZlKHJpZ2h0KTsKKyAgICAgICAgaWYgKG1pbnVzX3JpZ2h0KSB7CisgICAgICAgICAgICByZXN1bHQgPSBkZWx0YV9hZGQobGVmdCwgbWludXNfcmlnaHQpOworICAgICAgICAgICAgUHlfREVDUkVGKG1pbnVzX3JpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgIH0KIAotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogVGhpcyBpcyBtb3JlIG5hdHVyYWwgYXMgYSB0cF9jb21wYXJlLCBidXQgZG9lc24ndCB3b3JrIHRoZW46ICBmb3Igd2hhdGV2ZXIKQEAgLTE3NTUsMjQgKzE3NTUsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9yaWNoY29tcGFyZShQeURhdGVUaW1lX0RlbHRhICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlpbnQgZGlmZiA9IDQyOwkvKiBub25zZW5zZSAqLworICAgIGludCBkaWZmID0gNDI7ICAgICAgLyogbm9uc2Vuc2UgKi8KIAotCWlmIChQeURlbHRhX0NoZWNrKG90aGVyKSkgewotCQlkaWZmID0gR0VUX1REX0RBWVMoc2VsZikgLSBHRVRfVERfREFZUyhvdGhlcik7Ci0JCWlmIChkaWZmID09IDApIHsKLQkJCWRpZmYgPSBHRVRfVERfU0VDT05EUyhzZWxmKSAtIEdFVF9URF9TRUNPTkRTKG90aGVyKTsKLQkJCWlmIChkaWZmID09IDApCi0JCQkJZGlmZiA9IEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikgLQotCQkJCSAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKG90aGVyKTsKLQkJfQotCX0KLQllbHNlIGlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkKLQkJZGlmZiA9IDE7CS8qIGFueSBub24temVybyB2YWx1ZSB3aWxsIGRvICovCisgICAgaWYgKFB5RGVsdGFfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIGRpZmYgPSBHRVRfVERfREFZUyhzZWxmKSAtIEdFVF9URF9EQVlTKG90aGVyKTsKKyAgICAgICAgaWYgKGRpZmYgPT0gMCkgeworICAgICAgICAgICAgZGlmZiA9IEdFVF9URF9TRUNPTkRTKHNlbGYpIC0gR0VUX1REX1NFQ09ORFMob3RoZXIpOworICAgICAgICAgICAgaWYgKGRpZmYgPT0gMCkKKyAgICAgICAgICAgICAgICBkaWZmID0gR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSAtCisgICAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMob3RoZXIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKQorICAgICAgICBkaWZmID0gMTsgICAgICAgICAgICAgICAvKiBhbnkgbm9uLXplcm8gdmFsdWUgd2lsbCBkbyAqLwogCi0JZWxzZSAvKiBzdG9wIHRoaXMgZnJvbSBmYWxsaW5nIGJhY2sgdG8gYWRkcmVzcyBjb21wYXJpc29uICovCi0JCXJldHVybiBjbXBlcnJvcigoUHlPYmplY3QgKilzZWxmLCBvdGhlcik7CisgICAgZWxzZSAvKiBzdG9wIHRoaXMgZnJvbSBmYWxsaW5nIGJhY2sgdG8gYWRkcmVzcyBjb21wYXJpc29uICovCisgICAgICAgIHJldHVybiBjbXBlcnJvcigoUHlPYmplY3QgKilzZWxmLCBvdGhlcik7CiAKLQlyZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKKyAgICByZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpkZWx0YV9nZXRzdGF0ZShQeURhdGVUaW1lX0RlbHRhICpzZWxmKTsKQEAgLTE3ODAsNTIgKzE3ODAsNTIgQEAKIHN0YXRpYyBsb25nCiBkZWx0YV9oYXNoKFB5RGF0ZVRpbWVfRGVsdGEgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmhhc2hjb2RlID09IC0xKSB7Ci0JCVB5T2JqZWN0ICp0ZW1wID0gZGVsdGFfZ2V0c3RhdGUoc2VsZik7Ci0JCWlmICh0ZW1wICE9IE5VTEwpIHsKLQkJCXNlbGYtPmhhc2hjb2RlID0gUHlPYmplY3RfSGFzaCh0ZW1wKTsKLQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJfQotCX0KLQlyZXR1cm4gc2VsZi0+aGFzaGNvZGU7CisgICAgaWYgKHNlbGYtPmhhc2hjb2RlID09IC0xKSB7CisgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gZGVsdGFfZ2V0c3RhdGUoc2VsZik7CisgICAgICAgIGlmICh0ZW1wICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNlbGYtPmhhc2hjb2RlID0gUHlPYmplY3RfSGFzaCh0ZW1wKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VsZi0+aGFzaGNvZGU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9tdWx0aXBseShQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CiAKLQlpZiAoUHlEZWx0YV9DaGVjayhsZWZ0KSkgewotCQkvKiBkZWx0YSAqID8/PyAqLwotCQlpZiAoUHlJbnRfQ2hlY2socmlnaHQpIHx8IFB5TG9uZ19DaGVjayhyaWdodCkpCi0JCQlyZXN1bHQgPSBtdWx0aXBseV9pbnRfdGltZWRlbHRhKHJpZ2h0LAotCQkJCQkoUHlEYXRlVGltZV9EZWx0YSAqKSBsZWZ0KTsKLQl9Ci0JZWxzZSBpZiAoUHlJbnRfQ2hlY2sobGVmdCkgfHwgUHlMb25nX0NoZWNrKGxlZnQpKQotCQlyZXN1bHQgPSBtdWx0aXBseV9pbnRfdGltZWRlbHRhKGxlZnQsCi0JCQkJCQkoUHlEYXRlVGltZV9EZWx0YSAqKSByaWdodCk7CisgICAgaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkpIHsKKyAgICAgICAgLyogZGVsdGEgKiA/Pz8gKi8KKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJpZ2h0KSB8fCBQeUxvbmdfQ2hlY2socmlnaHQpKQorICAgICAgICAgICAgcmVzdWx0ID0gbXVsdGlwbHlfaW50X3RpbWVkZWx0YShyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKSBsZWZ0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2sobGVmdCkgfHwgUHlMb25nX0NoZWNrKGxlZnQpKQorICAgICAgICByZXN1bHQgPSBtdWx0aXBseV9pbnRfdGltZWRlbHRhKGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKikgcmlnaHQpOwogCi0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfZGl2aWRlKFB5T2JqZWN0ICpsZWZ0LCBQeU9iamVjdCAqcmlnaHQpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKIAotCWlmIChQeURlbHRhX0NoZWNrKGxlZnQpKSB7Ci0JCS8qIGRlbHRhICogPz8/ICovCi0JCWlmIChQeUludF9DaGVjayhyaWdodCkgfHwgUHlMb25nX0NoZWNrKHJpZ2h0KSkKLQkJCXJlc3VsdCA9IGRpdmlkZV90aW1lZGVsdGFfaW50KAotCQkJCQkoUHlEYXRlVGltZV9EZWx0YSAqKWxlZnQsCi0JCQkJCXJpZ2h0KTsKLQl9CisgICAgaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkpIHsKKyAgICAgICAgLyogZGVsdGEgKiA/Pz8gKi8KKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJpZ2h0KSB8fCBQeUxvbmdfQ2hlY2socmlnaHQpKQorICAgICAgICAgICAgcmVzdWx0ID0gZGl2aWRlX3RpbWVkZWx0YV9pbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKilsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0KTsKKyAgICB9CiAKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKQotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEZvbGQgaW4gdGhlIHZhbHVlIG9mIHRoZSB0YWcgKCJzZWNvbmRzIiwgIndlZWtzIiwgZXRjKSBjb21wb25lbnQgb2YgYQpAQCAtMTg0MSwxNjkgKzE4NDEsMTY5IEBACiBhY2N1bShjb25zdCBjaGFyKiB0YWcsIFB5T2JqZWN0ICpzb2ZhciwgUHlPYmplY3QgKm51bSwgUHlPYmplY3QgKmZhY3RvciwKICAgICAgIGRvdWJsZSAqbGVmdG92ZXIpCiB7Ci0JUHlPYmplY3QgKnByb2Q7Ci0JUHlPYmplY3QgKnN1bTsKKyAgICBQeU9iamVjdCAqcHJvZDsKKyAgICBQeU9iamVjdCAqc3VtOwogCi0JYXNzZXJ0KG51bSAhPSBOVUxMKTsKKyAgICBhc3NlcnQobnVtICE9IE5VTEwpOwogCi0JaWYgKFB5SW50X0NoZWNrKG51bSkgfHwgUHlMb25nX0NoZWNrKG51bSkpIHsKLQkJcHJvZCA9IFB5TnVtYmVyX011bHRpcGx5KG51bSwgZmFjdG9yKTsKLQkJaWYgKHByb2QgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlzdW0gPSBQeU51bWJlcl9BZGQoc29mYXIsIHByb2QpOwotCQlQeV9ERUNSRUYocHJvZCk7Ci0JCXJldHVybiBzdW07Ci0JfQorICAgIGlmIChQeUludF9DaGVjayhudW0pIHx8IFB5TG9uZ19DaGVjayhudW0pKSB7CisgICAgICAgIHByb2QgPSBQeU51bWJlcl9NdWx0aXBseShudW0sIGZhY3Rvcik7CisgICAgICAgIGlmIChwcm9kID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc3VtID0gUHlOdW1iZXJfQWRkKHNvZmFyLCBwcm9kKTsKKyAgICAgICAgUHlfREVDUkVGKHByb2QpOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KIAotCWlmIChQeUZsb2F0X0NoZWNrKG51bSkpIHsKLQkJZG91YmxlIGRudW07Ci0JCWRvdWJsZSBmcmFjcGFydDsKLQkJZG91YmxlIGludHBhcnQ7Ci0JCVB5T2JqZWN0ICp4OwotCQlQeU9iamVjdCAqeTsKKyAgICBpZiAoUHlGbG9hdF9DaGVjayhudW0pKSB7CisgICAgICAgIGRvdWJsZSBkbnVtOworICAgICAgICBkb3VibGUgZnJhY3BhcnQ7CisgICAgICAgIGRvdWJsZSBpbnRwYXJ0OworICAgICAgICBQeU9iamVjdCAqeDsKKyAgICAgICAgUHlPYmplY3QgKnk7CiAKLQkJLyogVGhlIFBsYW46ICBkZWNvbXBvc2UgbnVtIGludG8gYW4gaW50ZWdlciBwYXJ0IGFuZCBhCi0JCSAqIGZyYWN0aW9uYWwgcGFydCwgbnVtID0gaW50cGFydCArIGZyYWNwYXJ0LgotCQkgKiBUaGVuIG51bSAqIGZhY3RvciA9PQotCQkgKiAgICAgIGludHBhcnQgKiBmYWN0b3IgKyBmcmFjcGFydCAqIGZhY3RvcgotCQkgKiBhbmQgdGhlIExIUyBjYW4gYmUgY29tcHV0ZWQgZXhhY3RseSBpbiBsb25nIGFyaXRobWV0aWMuCi0JCSAqIFRoZSBSSFMgaXMgYWdhaW4gYnJva2VuIGludG8gYW4gaW50IHBhcnQgYW5kIGZyYWMgcGFydC4KLQkJICogYW5kIHRoZSBmcmFjIHBhcnQgaXMgYWRkZWQgaW50byAqbGVmdG92ZXIuCi0JCSAqLwotCQlkbnVtID0gUHlGbG9hdF9Bc0RvdWJsZShudW0pOwotCQlpZiAoZG51bSA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZnJhY3BhcnQgPSBtb2RmKGRudW0sICZpbnRwYXJ0KTsKLQkJeCA9IFB5TG9uZ19Gcm9tRG91YmxlKGludHBhcnQpOwotCQlpZiAoeCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIC8qIFRoZSBQbGFuOiAgZGVjb21wb3NlIG51bSBpbnRvIGFuIGludGVnZXIgcGFydCBhbmQgYQorICAgICAgICAgKiBmcmFjdGlvbmFsIHBhcnQsIG51bSA9IGludHBhcnQgKyBmcmFjcGFydC4KKyAgICAgICAgICogVGhlbiBudW0gKiBmYWN0b3IgPT0KKyAgICAgICAgICogICAgICBpbnRwYXJ0ICogZmFjdG9yICsgZnJhY3BhcnQgKiBmYWN0b3IKKyAgICAgICAgICogYW5kIHRoZSBMSFMgY2FuIGJlIGNvbXB1dGVkIGV4YWN0bHkgaW4gbG9uZyBhcml0aG1ldGljLgorICAgICAgICAgKiBUaGUgUkhTIGlzIGFnYWluIGJyb2tlbiBpbnRvIGFuIGludCBwYXJ0IGFuZCBmcmFjIHBhcnQuCisgICAgICAgICAqIGFuZCB0aGUgZnJhYyBwYXJ0IGlzIGFkZGVkIGludG8gKmxlZnRvdmVyLgorICAgICAgICAgKi8KKyAgICAgICAgZG51bSA9IFB5RmxvYXRfQXNEb3VibGUobnVtKTsKKyAgICAgICAgaWYgKGRudW0gPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZyYWNwYXJ0ID0gbW9kZihkbnVtLCAmaW50cGFydCk7CisgICAgICAgIHggPSBQeUxvbmdfRnJvbURvdWJsZShpbnRwYXJ0KTsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXByb2QgPSBQeU51bWJlcl9NdWx0aXBseSh4LCBmYWN0b3IpOwotCQlQeV9ERUNSRUYoeCk7Ci0JCWlmIChwcm9kID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcHJvZCA9IFB5TnVtYmVyX011bHRpcGx5KHgsIGZhY3Rvcik7CisgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgaWYgKHByb2QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXN1bSA9IFB5TnVtYmVyX0FkZChzb2ZhciwgcHJvZCk7Ci0JCVB5X0RFQ1JFRihwcm9kKTsKLQkJaWYgKHN1bSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIHN1bSA9IFB5TnVtYmVyX0FkZChzb2ZhciwgcHJvZCk7CisgICAgICAgIFB5X0RFQ1JFRihwcm9kKTsKKyAgICAgICAgaWYgKHN1bSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKGZyYWNwYXJ0ID09IDAuMCkKLQkJCXJldHVybiBzdW07Ci0JCS8qIFNvIGZhciB3ZSd2ZSBsb3N0IG5vIGluZm9ybWF0aW9uLiAgRGVhbGluZyB3aXRoIHRoZQotCQkgKiBmcmFjdGlvbmFsIHBhcnQgcmVxdWlyZXMgZmxvYXQgYXJpdGhtZXRpYywgYW5kIG1heQotCQkgKiBsb3NlIGEgbGl0dGxlIGluZm8uCi0JCSAqLwotCQlhc3NlcnQoUHlJbnRfQ2hlY2soZmFjdG9yKSB8fCBQeUxvbmdfQ2hlY2soZmFjdG9yKSk7Ci0JCWlmIChQeUludF9DaGVjayhmYWN0b3IpKQotCQkJZG51bSA9IChkb3VibGUpUHlJbnRfQXNMb25nKGZhY3Rvcik7Ci0JCWVsc2UKLQkJCWRudW0gPSBQeUxvbmdfQXNEb3VibGUoZmFjdG9yKTsKKyAgICAgICAgaWYgKGZyYWNwYXJ0ID09IDAuMCkKKyAgICAgICAgICAgIHJldHVybiBzdW07CisgICAgICAgIC8qIFNvIGZhciB3ZSd2ZSBsb3N0IG5vIGluZm9ybWF0aW9uLiAgRGVhbGluZyB3aXRoIHRoZQorICAgICAgICAgKiBmcmFjdGlvbmFsIHBhcnQgcmVxdWlyZXMgZmxvYXQgYXJpdGhtZXRpYywgYW5kIG1heQorICAgICAgICAgKiBsb3NlIGEgbGl0dGxlIGluZm8uCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQoUHlJbnRfQ2hlY2soZmFjdG9yKSB8fCBQeUxvbmdfQ2hlY2soZmFjdG9yKSk7CisgICAgICAgIGlmIChQeUludF9DaGVjayhmYWN0b3IpKQorICAgICAgICAgICAgZG51bSA9IChkb3VibGUpUHlJbnRfQXNMb25nKGZhY3Rvcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRudW0gPSBQeUxvbmdfQXNEb3VibGUoZmFjdG9yKTsKIAotCQlkbnVtICo9IGZyYWNwYXJ0OwotCQlmcmFjcGFydCA9IG1vZGYoZG51bSwgJmludHBhcnQpOwotCQl4ID0gUHlMb25nX0Zyb21Eb3VibGUoaW50cGFydCk7Ci0JCWlmICh4ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihzdW0pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgZG51bSAqPSBmcmFjcGFydDsKKyAgICAgICAgZnJhY3BhcnQgPSBtb2RmKGRudW0sICZpbnRwYXJ0KTsKKyAgICAgICAgeCA9IFB5TG9uZ19Gcm9tRG91YmxlKGludHBhcnQpOworICAgICAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3VtKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJeSA9IFB5TnVtYmVyX0FkZChzdW0sIHgpOwotCQlQeV9ERUNSRUYoc3VtKTsKLQkJUHlfREVDUkVGKHgpOwotCQkqbGVmdG92ZXIgKz0gZnJhY3BhcnQ7Ci0JCXJldHVybiB5OwotCX0KKyAgICAgICAgeSA9IFB5TnVtYmVyX0FkZChzdW0sIHgpOworICAgICAgICBQeV9ERUNSRUYoc3VtKTsKKyAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICAqbGVmdG92ZXIgKz0gZnJhY3BhcnQ7CisgICAgICAgIHJldHVybiB5OworICAgIH0KIAotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgInVuc3VwcG9ydGVkIHR5cGUgZm9yIHRpbWVkZWx0YSAlcyBjb21wb25lbnQ6ICVzIiwKLQkJICAgICB0YWcsIFB5X1RZUEUobnVtKS0+dHBfbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIHR5cGUgZm9yIHRpbWVkZWx0YSAlcyBjb21wb25lbnQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgdGFnLCBQeV9UWVBFKG51bSktPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqc2VsZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnNlbGYgPSBOVUxMOwogCi0JLyogQXJndW1lbnQgb2JqZWN0cy4gKi8KLQlQeU9iamVjdCAqZGF5ID0gTlVMTDsKLQlQeU9iamVjdCAqc2Vjb25kID0gTlVMTDsKLQlQeU9iamVjdCAqdXMgPSBOVUxMOwotCVB5T2JqZWN0ICptcyA9IE5VTEw7Ci0JUHlPYmplY3QgKm1pbnV0ZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmhvdXIgPSBOVUxMOwotCVB5T2JqZWN0ICp3ZWVrID0gTlVMTDsKKyAgICAvKiBBcmd1bWVudCBvYmplY3RzLiAqLworICAgIFB5T2JqZWN0ICpkYXkgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzZWNvbmQgPSBOVUxMOworICAgIFB5T2JqZWN0ICp1cyA9IE5VTEw7CisgICAgUHlPYmplY3QgKm1zID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbWludXRlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaG91ciA9IE5VTEw7CisgICAgUHlPYmplY3QgKndlZWsgPSBOVUxMOwogCi0JUHlPYmplY3QgKnggPSBOVUxMOwkvKiBydW5uaW5nIHN1bSBvZiBtaWNyb3NlY29uZHMgKi8KLQlQeU9iamVjdCAqeSA9IE5VTEw7CS8qIHRlbXAgc3VtIG9mIG1pY3Jvc2Vjb25kcyAqLwotCWRvdWJsZSBsZWZ0b3Zlcl91cyA9IDAuMDsKKyAgICBQeU9iamVjdCAqeCA9IE5VTEw7ICAgICAgICAgLyogcnVubmluZyBzdW0gb2YgbWljcm9zZWNvbmRzICovCisgICAgUHlPYmplY3QgKnkgPSBOVUxMOyAgICAgICAgIC8qIHRlbXAgc3VtIG9mIG1pY3Jvc2Vjb25kcyAqLworICAgIGRvdWJsZSBsZWZ0b3Zlcl91cyA9IDAuMDsKIAotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0gewotCQkiZGF5cyIsICJzZWNvbmRzIiwgIm1pY3Jvc2Vjb25kcyIsICJtaWxsaXNlY29uZHMiLAotCQkibWludXRlcyIsICJob3VycyIsICJ3ZWVrcyIsIE5VTEwKLQl9OworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geworICAgICAgICAiZGF5cyIsICJzZWNvbmRzIiwgIm1pY3Jvc2Vjb25kcyIsICJtaWxsaXNlY29uZHMiLAorICAgICAgICAibWludXRlcyIsICJob3VycyIsICJ3ZWVrcyIsIE5VTEwKKyAgICB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPT09PT09POl9fbmV3X18iLAotCQkJCQlrZXl3b3JkcywKLQkJCQkJJmRheSwgJnNlY29uZCwgJnVzLAotCQkJCQkmbXMsICZtaW51dGUsICZob3VyLCAmd2VlaykgPT0gMCkKLQkJZ290byBEb25lOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8T09PT09PTzpfX25ld19fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRheSwgJnNlY29uZCwgJnVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zLCAmbWludXRlLCAmaG91ciwgJndlZWspID09IDApCisgICAgICAgIGdvdG8gRG9uZTsKIAotCXggPSBQeUludF9Gcm9tTG9uZygwKTsKLQlpZiAoeCA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKDApOworICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKIAotI2RlZmluZSBDTEVBTlVQIAlcCi0JUHlfREVDUkVGKHgpOwlcCi0JeCA9IHk7CQlcCi0JaWYgKHggPT0gTlVMTCkJXAotCQlnb3RvIERvbmUKKyNkZWZpbmUgQ0xFQU5VUCAgICAgICAgIFwKKyAgICBQeV9ERUNSRUYoeCk7ICAgICAgIFwKKyAgICB4ID0geTsgICAgICAgICAgICAgIFwKKyAgICBpZiAoeCA9PSBOVUxMKSAgICAgIFwKKyAgICAgICAgZ290byBEb25lCiAKLQlpZiAodXMpIHsKLQkJeSA9IGFjY3VtKCJtaWNyb3NlY29uZHMiLCB4LCB1cywgdXNfcGVyX3VzLCAmbGVmdG92ZXJfdXMpOwotCQlDTEVBTlVQOwotCX0KLQlpZiAobXMpIHsKLQkJeSA9IGFjY3VtKCJtaWxsaXNlY29uZHMiLCB4LCBtcywgdXNfcGVyX21zLCAmbGVmdG92ZXJfdXMpOwotCQlDTEVBTlVQOwotCX0KLQlpZiAoc2Vjb25kKSB7Ci0JCXkgPSBhY2N1bSgic2Vjb25kcyIsIHgsIHNlY29uZCwgdXNfcGVyX3NlY29uZCwgJmxlZnRvdmVyX3VzKTsKLQkJQ0xFQU5VUDsKLQl9Ci0JaWYgKG1pbnV0ZSkgewotCQl5ID0gYWNjdW0oIm1pbnV0ZXMiLCB4LCBtaW51dGUsIHVzX3Blcl9taW51dGUsICZsZWZ0b3Zlcl91cyk7Ci0JCUNMRUFOVVA7Ci0JfQotCWlmIChob3VyKSB7Ci0JCXkgPSBhY2N1bSgiaG91cnMiLCB4LCBob3VyLCB1c19wZXJfaG91ciwgJmxlZnRvdmVyX3VzKTsKLQkJQ0xFQU5VUDsKLQl9Ci0JaWYgKGRheSkgewotCQl5ID0gYWNjdW0oImRheXMiLCB4LCBkYXksIHVzX3Blcl9kYXksICZsZWZ0b3Zlcl91cyk7Ci0JCUNMRUFOVVA7Ci0JfQotCWlmICh3ZWVrKSB7Ci0JCXkgPSBhY2N1bSgid2Vla3MiLCB4LCB3ZWVrLCB1c19wZXJfd2VlaywgJmxlZnRvdmVyX3VzKTsKLQkJQ0xFQU5VUDsKLQl9Ci0JaWYgKGxlZnRvdmVyX3VzKSB7Ci0JCS8qIFJvdW5kIHRvIG5lYXJlc3Qgd2hvbGUgIyBvZiB1cywgYW5kIGFkZCBpbnRvIHguICovCi0JCVB5T2JqZWN0ICp0ZW1wID0gUHlMb25nX0Zyb21Mb25nKHJvdW5kX3RvX2xvbmcobGVmdG92ZXJfdXMpKTsKLQkJaWYgKHRlbXAgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHgpOwotCQkJZ290byBEb25lOwotCQl9Ci0JCXkgPSBQeU51bWJlcl9BZGQoeCwgdGVtcCk7Ci0JCVB5X0RFQ1JFRih0ZW1wKTsKLQkJQ0xFQU5VUDsKLQl9CisgICAgaWYgKHVzKSB7CisgICAgICAgIHkgPSBhY2N1bSgibWljcm9zZWNvbmRzIiwgeCwgdXMsIHVzX3Blcl91cywgJmxlZnRvdmVyX3VzKTsKKyAgICAgICAgQ0xFQU5VUDsKKyAgICB9CisgICAgaWYgKG1zKSB7CisgICAgICAgIHkgPSBhY2N1bSgibWlsbGlzZWNvbmRzIiwgeCwgbXMsIHVzX3Blcl9tcywgJmxlZnRvdmVyX3VzKTsKKyAgICAgICAgQ0xFQU5VUDsKKyAgICB9CisgICAgaWYgKHNlY29uZCkgeworICAgICAgICB5ID0gYWNjdW0oInNlY29uZHMiLCB4LCBzZWNvbmQsIHVzX3Blcl9zZWNvbmQsICZsZWZ0b3Zlcl91cyk7CisgICAgICAgIENMRUFOVVA7CisgICAgfQorICAgIGlmIChtaW51dGUpIHsKKyAgICAgICAgeSA9IGFjY3VtKCJtaW51dGVzIiwgeCwgbWludXRlLCB1c19wZXJfbWludXRlLCAmbGVmdG92ZXJfdXMpOworICAgICAgICBDTEVBTlVQOworICAgIH0KKyAgICBpZiAoaG91cikgeworICAgICAgICB5ID0gYWNjdW0oImhvdXJzIiwgeCwgaG91ciwgdXNfcGVyX2hvdXIsICZsZWZ0b3Zlcl91cyk7CisgICAgICAgIENMRUFOVVA7CisgICAgfQorICAgIGlmIChkYXkpIHsKKyAgICAgICAgeSA9IGFjY3VtKCJkYXlzIiwgeCwgZGF5LCB1c19wZXJfZGF5LCAmbGVmdG92ZXJfdXMpOworICAgICAgICBDTEVBTlVQOworICAgIH0KKyAgICBpZiAod2VlaykgeworICAgICAgICB5ID0gYWNjdW0oIndlZWtzIiwgeCwgd2VlaywgdXNfcGVyX3dlZWssICZsZWZ0b3Zlcl91cyk7CisgICAgICAgIENMRUFOVVA7CisgICAgfQorICAgIGlmIChsZWZ0b3Zlcl91cykgeworICAgICAgICAvKiBSb3VuZCB0byBuZWFyZXN0IHdob2xlICMgb2YgdXMsIGFuZCBhZGQgaW50byB4LiAqLworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IFB5TG9uZ19Gcm9tTG9uZyhyb3VuZF90b19sb25nKGxlZnRvdmVyX3VzKSk7CisgICAgICAgIGlmICh0ZW1wID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgfQorICAgICAgICB5ID0gUHlOdW1iZXJfQWRkKHgsIHRlbXApOworICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIENMRUFOVVA7CisgICAgfQogCi0Jc2VsZiA9IG1pY3Jvc2Vjb25kc190b19kZWx0YV9leCh4LCB0eXBlKTsKLQlQeV9ERUNSRUYoeCk7CisgICAgc2VsZiA9IG1pY3Jvc2Vjb25kc190b19kZWx0YV9leCh4LCB0eXBlKTsKKyAgICBQeV9ERUNSRUYoeCk7CiBEb25lOgotCXJldHVybiBzZWxmOworICAgIHJldHVybiBzZWxmOwogCiAjdW5kZWYgQ0xFQU5VUAogfQpAQCAtMjAxMSw3NSArMjAxMSw3NSBAQAogc3RhdGljIGludAogZGVsdGFfbm9uemVybyhQeURhdGVUaW1lX0RlbHRhICpzZWxmKQogewotCXJldHVybiAoR0VUX1REX0RBWVMoc2VsZikgIT0gMAotCQl8fCBHRVRfVERfU0VDT05EUyhzZWxmKSAhPSAwCi0JCXx8IEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikgIT0gMCk7CisgICAgcmV0dXJuIChHRVRfVERfREFZUyhzZWxmKSAhPSAwCisgICAgICAgIHx8IEdFVF9URF9TRUNPTkRTKHNlbGYpICE9IDAKKyAgICAgICAgfHwgR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSAhPSAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX3JlcHIoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQlpZiAoR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSAhPSAwKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJWQsICVkLCAlZCkiLAotCQkJCQkgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAotCQkJCQkgICBHRVRfVERfREFZUyhzZWxmKSwKLQkJCQkJICAgR0VUX1REX1NFQ09ORFMoc2VsZiksCi0JCQkJCSAgIEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikpOwotCWlmIChHRVRfVERfU0VDT05EUyhzZWxmKSAhPSAwKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJWQsICVkKSIsCi0JCQkJCSAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsCi0JCQkJCSAgIEdFVF9URF9EQVlTKHNlbGYpLAotCQkJCQkgICBHRVRfVERfU0VDT05EUyhzZWxmKSk7CisgICAgaWYgKEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikgIT0gMCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKCVkLCAlZCwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1REX0RBWVMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9TRUNPTkRTKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpKTsKKyAgICBpZiAoR0VUX1REX1NFQ09ORFMoc2VsZikgIT0gMCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKCVkLCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfREFZUyhzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1REX1NFQ09ORFMoc2VsZikpOwogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKCVkKSIsCi0JCQkJICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKLQkJCQkgICBHRVRfVERfREFZUyhzZWxmKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfREFZUyhzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9zdHIoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQlpbnQgZGF5cyA9IEdFVF9URF9EQVlTKHNlbGYpOwotCWludCBzZWNvbmRzID0gR0VUX1REX1NFQ09ORFMoc2VsZik7Ci0JaW50IHVzID0gR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKTsKLQlpbnQgaG91cnM7Ci0JaW50IG1pbnV0ZXM7Ci0JY2hhciBidWZbMTAwXTsKLQljaGFyICpwYnVmID0gYnVmOwotCXNpemVfdCBidWZsZW4gPSBzaXplb2YoYnVmKTsKLQlpbnQgbjsKKyAgICBpbnQgZGF5cyA9IEdFVF9URF9EQVlTKHNlbGYpOworICAgIGludCBzZWNvbmRzID0gR0VUX1REX1NFQ09ORFMoc2VsZik7CisgICAgaW50IHVzID0gR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKTsKKyAgICBpbnQgaG91cnM7CisgICAgaW50IG1pbnV0ZXM7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBjaGFyICpwYnVmID0gYnVmOworICAgIHNpemVfdCBidWZsZW4gPSBzaXplb2YoYnVmKTsKKyAgICBpbnQgbjsKIAotCW1pbnV0ZXMgPSBkaXZtb2Qoc2Vjb25kcywgNjAsICZzZWNvbmRzKTsKLQlob3VycyA9IGRpdm1vZChtaW51dGVzLCA2MCwgJm1pbnV0ZXMpOworICAgIG1pbnV0ZXMgPSBkaXZtb2Qoc2Vjb25kcywgNjAsICZzZWNvbmRzKTsKKyAgICBob3VycyA9IGRpdm1vZChtaW51dGVzLCA2MCwgJm1pbnV0ZXMpOwogCi0JaWYgKGRheXMpIHsKLQkJbiA9IFB5T1Nfc25wcmludGYocGJ1ZiwgYnVmbGVuLCAiJWQgZGF5JXMsICIsIGRheXMsCi0JCQkJICAoZGF5cyA9PSAxIHx8IGRheXMgPT0gLTEpID8gIiIgOiAicyIpOwotCQlpZiAobiA8IDAgfHwgKHNpemVfdCluID49IGJ1ZmxlbikKLQkJCWdvdG8gRmFpbDsKLQkJcGJ1ZiArPSBuOwotCQlidWZsZW4gLT0gKHNpemVfdCluOwotCX0KKyAgICBpZiAoZGF5cykgeworICAgICAgICBuID0gUHlPU19zbnByaW50ZihwYnVmLCBidWZsZW4sICIlZCBkYXklcywgIiwgZGF5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGRheXMgPT0gMSB8fCBkYXlzID09IC0xKSA/ICIiIDogInMiKTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IChzaXplX3QpbiA+PSBidWZsZW4pCisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIHBidWYgKz0gbjsKKyAgICAgICAgYnVmbGVuIC09IChzaXplX3QpbjsKKyAgICB9CiAKLQluID0gUHlPU19zbnByaW50ZihwYnVmLCBidWZsZW4sICIlZDolMDJkOiUwMmQiLAotCQkJICBob3VycywgbWludXRlcywgc2Vjb25kcyk7Ci0JaWYgKG4gPCAwIHx8IChzaXplX3QpbiA+PSBidWZsZW4pCi0JCWdvdG8gRmFpbDsKLQlwYnVmICs9IG47Ci0JYnVmbGVuIC09IChzaXplX3QpbjsKKyAgICBuID0gUHlPU19zbnByaW50ZihwYnVmLCBidWZsZW4sICIlZDolMDJkOiUwMmQiLAorICAgICAgICAgICAgICAgICAgICAgIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKTsKKyAgICBpZiAobiA8IDAgfHwgKHNpemVfdCluID49IGJ1ZmxlbikKKyAgICAgICAgZ290byBGYWlsOworICAgIHBidWYgKz0gbjsKKyAgICBidWZsZW4gLT0gKHNpemVfdCluOwogCi0JaWYgKHVzKSB7Ci0JCW4gPSBQeU9TX3NucHJpbnRmKHBidWYsIGJ1ZmxlbiwgIi4lMDZkIiwgdXMpOwotCQlpZiAobiA8IDAgfHwgKHNpemVfdCluID49IGJ1ZmxlbikKLQkJCWdvdG8gRmFpbDsKLQkJcGJ1ZiArPSBuOwotCX0KKyAgICBpZiAodXMpIHsKKyAgICAgICAgbiA9IFB5T1Nfc25wcmludGYocGJ1ZiwgYnVmbGVuLCAiLiUwNmQiLCB1cyk7CisgICAgICAgIGlmIChuIDwgMCB8fCAoc2l6ZV90KW4gPj0gYnVmbGVuKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICBwYnVmICs9IG47CisgICAgfQogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgcGJ1ZiAtIGJ1Zik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgcGJ1ZiAtIGJ1Zik7CiAKICBGYWlsOgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgImdvb2Z5IHJlc3VsdCBmcm9tIFB5T1Nfc25wcmludGYiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJnb29meSByZXN1bHQgZnJvbSBQeU9TX3NucHJpbnRmIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFBpY2tsZSBzdXBwb3J0LCBhIHNpbXBsZSB1c2Ugb2YgX19yZWR1Y2VfXy4gKi8KQEAgLTIwODgsMTUxICsyMDg4LDE1MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX2dldHN0YXRlKFB5RGF0ZVRpbWVfRGVsdGEgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIEdFVF9URF9EQVlTKHNlbGYpLAotCQkJCSAgICBHRVRfVERfU0VDT05EUyhzZWxmKSwKLQkJCQkgICAgR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIEdFVF9URF9EQVlTKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfU0VDT05EUyhzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV90b3RhbF9zZWNvbmRzKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp0b3RhbF9zZWNvbmRzOwotCVB5T2JqZWN0ICp0b3RhbF9taWNyb3NlY29uZHM7Ci0JUHlPYmplY3QgKm9uZV9taWxsaW9uOworICAgIFB5T2JqZWN0ICp0b3RhbF9zZWNvbmRzOworICAgIFB5T2JqZWN0ICp0b3RhbF9taWNyb3NlY29uZHM7CisgICAgUHlPYmplY3QgKm9uZV9taWxsaW9uOwogCi0JdG90YWxfbWljcm9zZWNvbmRzID0gZGVsdGFfdG9fbWljcm9zZWNvbmRzKChQeURhdGVUaW1lX0RlbHRhICopc2VsZik7Ci0JaWYgKHRvdGFsX21pY3Jvc2Vjb25kcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB0b3RhbF9taWNyb3NlY29uZHMgPSBkZWx0YV90b19taWNyb3NlY29uZHMoKFB5RGF0ZVRpbWVfRGVsdGEgKilzZWxmKTsKKyAgICBpZiAodG90YWxfbWljcm9zZWNvbmRzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jb25lX21pbGxpb24gPSBQeUxvbmdfRnJvbUxvbmcoMTAwMDAwMEwpOwotCWlmIChvbmVfbWlsbGlvbiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih0b3RhbF9taWNyb3NlY29uZHMpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgb25lX21pbGxpb24gPSBQeUxvbmdfRnJvbUxvbmcoMTAwMDAwMEwpOworICAgIGlmIChvbmVfbWlsbGlvbiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih0b3RhbF9taWNyb3NlY29uZHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl0b3RhbF9zZWNvbmRzID0gUHlOdW1iZXJfVHJ1ZURpdmlkZSh0b3RhbF9taWNyb3NlY29uZHMsIG9uZV9taWxsaW9uKTsKKyAgICB0b3RhbF9zZWNvbmRzID0gUHlOdW1iZXJfVHJ1ZURpdmlkZSh0b3RhbF9taWNyb3NlY29uZHMsIG9uZV9taWxsaW9uKTsKIAotCVB5X0RFQ1JFRih0b3RhbF9taWNyb3NlY29uZHMpOwotCVB5X0RFQ1JFRihvbmVfbWlsbGlvbik7Ci0JcmV0dXJuIHRvdGFsX3NlY29uZHM7CisgICAgUHlfREVDUkVGKHRvdGFsX21pY3Jvc2Vjb25kcyk7CisgICAgUHlfREVDUkVGKG9uZV9taWxsaW9uKTsKKyAgICByZXR1cm4gdG90YWxfc2Vjb25kczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX3JlZHVjZShQeURhdGVUaW1lX0RlbHRhKiBzZWxmKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPTiIsIFB5X1RZUEUoc2VsZiksIGRlbHRhX2dldHN0YXRlKHNlbGYpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiT04iLCBQeV9UWVBFKHNlbGYpLCBkZWx0YV9nZXRzdGF0ZShzZWxmKSk7CiB9CiAKICNkZWZpbmUgT0ZGU0VUKGZpZWxkKSAgb2Zmc2V0b2YoUHlEYXRlVGltZV9EZWx0YSwgZmllbGQpCiAKIHN0YXRpYyBQeU1lbWJlckRlZiBkZWx0YV9tZW1iZXJzW10gPSB7CiAKLQl7ImRheXMiLCAgICAgICAgIFRfSU5ULCBPRkZTRVQoZGF5cyksICAgICAgICAgUkVBRE9OTFksCi0JIFB5RG9jX1NUUigiTnVtYmVyIG9mIGRheXMuIil9LAorICAgIHsiZGF5cyIsICAgICAgICAgVF9JTlQsIE9GRlNFVChkYXlzKSwgICAgICAgICBSRUFET05MWSwKKyAgICAgUHlEb2NfU1RSKCJOdW1iZXIgb2YgZGF5cy4iKX0sCiAKLQl7InNlY29uZHMiLCAgICAgIFRfSU5ULCBPRkZTRVQoc2Vjb25kcyksICAgICAgUkVBRE9OTFksCi0JIFB5RG9jX1NUUigiTnVtYmVyIG9mIHNlY29uZHMgKD49IDAgYW5kIGxlc3MgdGhhbiAxIGRheSkuIil9LAorICAgIHsic2Vjb25kcyIsICAgICAgVF9JTlQsIE9GRlNFVChzZWNvbmRzKSwgICAgICBSRUFET05MWSwKKyAgICAgUHlEb2NfU1RSKCJOdW1iZXIgb2Ygc2Vjb25kcyAoPj0gMCBhbmQgbGVzcyB0aGFuIDEgZGF5KS4iKX0sCiAKLQl7Im1pY3Jvc2Vjb25kcyIsIFRfSU5ULCBPRkZTRVQobWljcm9zZWNvbmRzKSwgUkVBRE9OTFksCi0JIFB5RG9jX1NUUigiTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyAoPj0gMCBhbmQgbGVzcyB0aGFuIDEgc2Vjb25kKS4iKX0sCi0Je05VTEx9CisgICAgeyJtaWNyb3NlY29uZHMiLCBUX0lOVCwgT0ZGU0VUKG1pY3Jvc2Vjb25kcyksIFJFQURPTkxZLAorICAgICBQeURvY19TVFIoIk51bWJlciBvZiBtaWNyb3NlY29uZHMgKD49IDAgYW5kIGxlc3MgdGhhbiAxIHNlY29uZCkuIil9LAorICAgIHtOVUxMfQogfTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGRlbHRhX21ldGhvZHNbXSA9IHsKLQl7InRvdGFsX3NlY29uZHMiLCAoUHlDRnVuY3Rpb24pZGVsdGFfdG90YWxfc2Vjb25kcywgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiVG90YWwgc2Vjb25kcyBpbiB0aGUgZHVyYXRpb24uIil9LAorICAgIHsidG90YWxfc2Vjb25kcyIsIChQeUNGdW5jdGlvbilkZWx0YV90b3RhbF9zZWNvbmRzLCBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJUb3RhbCBzZWNvbmRzIGluIHRoZSBkdXJhdGlvbi4iKX0sCiAKLQl7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pZGVsdGFfcmVkdWNlLCBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJfX3JlZHVjZV9fKCkgLT4gKGNscywgc3RhdGUpIil9LAorICAgIHsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilkZWx0YV9yZWR1Y2UsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIl9fcmVkdWNlX18oKSAtPiAoY2xzLCBzdGF0ZSkiKX0sCiAKLQl7TlVMTCwJTlVMTH0sCisgICAge05VTEwsICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgY2hhciBkZWx0YV9kb2NbXSA9CiBQeURvY19TVFIoIkRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgdmFsdWVzLiIpOwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGRlbHRhX2FzX251bWJlciA9IHsKLQlkZWx0YV9hZGQsCQkJCS8qIG5iX2FkZCAqLwotCWRlbHRhX3N1YnRyYWN0LAkJCQkvKiBuYl9zdWJ0cmFjdCAqLwotCWRlbHRhX211bHRpcGx5LAkJCQkvKiBuYl9tdWx0aXBseSAqLwotCWRlbHRhX2RpdmlkZSwJCQkJLyogbmJfZGl2aWRlICovCi0JMCwJCQkJCS8qIG5iX3JlbWFpbmRlciAqLwotCTAsCQkJCQkvKiBuYl9kaXZtb2QgKi8KLQkwLAkJCQkJLyogbmJfcG93ZXIgKi8KLQkodW5hcnlmdW5jKWRlbHRhX25lZ2F0aXZlLAkJLyogbmJfbmVnYXRpdmUgKi8KLQkodW5hcnlmdW5jKWRlbHRhX3Bvc2l0aXZlLAkJLyogbmJfcG9zaXRpdmUgKi8KLQkodW5hcnlmdW5jKWRlbHRhX2FicywJCQkvKiBuYl9hYnNvbHV0ZSAqLwotCShpbnF1aXJ5KWRlbHRhX25vbnplcm8sCQkJLyogbmJfbm9uemVybyAqLwotCTAsCQkJCQkvKm5iX2ludmVydCovCi0JMCwJCQkJCS8qbmJfbHNoaWZ0Ki8KLQkwLAkJCQkJLypuYl9yc2hpZnQqLwotCTAsCQkJCQkvKm5iX2FuZCovCi0JMCwJCQkJCS8qbmJfeG9yKi8KLQkwLAkJCQkJLypuYl9vciovCi0JMCwJCQkJCS8qbmJfY29lcmNlKi8KLQkwLAkJCQkJLypuYl9pbnQqLwotCTAsCQkJCQkvKm5iX2xvbmcqLwotCTAsCQkJCQkvKm5iX2Zsb2F0Ki8KLQkwLAkJCQkJLypuYl9vY3QqLwotCTAsIAkJCQkJLypuYl9oZXgqLwotCTAsCQkJCQkvKm5iX2lucGxhY2VfYWRkKi8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX3N1YnRyYWN0Ki8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX211bHRpcGx5Ki8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX2RpdmlkZSovCi0JMCwJCQkJCS8qbmJfaW5wbGFjZV9yZW1haW5kZXIqLwotCTAsCQkJCQkvKm5iX2lucGxhY2VfcG93ZXIqLwotCTAsCQkJCQkvKm5iX2lucGxhY2VfbHNoaWZ0Ki8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX3JzaGlmdCovCi0JMCwJCQkJCS8qbmJfaW5wbGFjZV9hbmQqLwotCTAsCQkJCQkvKm5iX2lucGxhY2VfeG9yKi8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX29yKi8KLQlkZWx0YV9kaXZpZGUsCQkJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl90cnVlX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCisgICAgZGVsdGFfYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICBkZWx0YV9zdWJ0cmFjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3N1YnRyYWN0ICovCisgICAgZGVsdGFfbXVsdGlwbHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIGRlbHRhX2RpdmlkZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9yZW1haW5kZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAodW5hcnlmdW5jKWRlbHRhX25lZ2F0aXZlLCAgICAgICAgICAgICAgICAgIC8qIG5iX25lZ2F0aXZlICovCisgICAgKHVuYXJ5ZnVuYylkZWx0YV9wb3NpdGl2ZSwgICAgICAgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgICh1bmFyeWZ1bmMpZGVsdGFfYWJzLCAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSlkZWx0YV9ub256ZXJvLCAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbHNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfcnNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfYW5kKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfeG9yKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfb3IqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9jb2VyY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9sb25nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfZmxvYXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9vY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9oZXgqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2FkZCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2Vfc3VidHJhY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX211bHRpcGx5Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9kaXZpZGUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3JlbWFpbmRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcG93ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2xzaGlmdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcnNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9hbmQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3hvciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2Vfb3IqLworICAgIGRlbHRhX2RpdmlkZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZmxvb3JfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl90cnVlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlEYXRlVGltZV9EZWx0YVR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImRhdGV0aW1lLnRpbWVkZWx0YSIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoUHlEYXRlVGltZV9EZWx0YSksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZGVsdGFfcmVwciwJCQkJLyogdHBfcmVwciAqLwotCSZkZWx0YV9hc19udW1iZXIsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpZGVsdGFfaGFzaCwJCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkJLyogdHBfY2FsbCAqLwotCShyZXByZnVuYylkZWx0YV9zdHIsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLQkgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsCQkJLyogdHBfZmxhZ3MgKi8KLQlkZWx0YV9kb2MsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylkZWx0YV9yaWNoY29tcGFyZSwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGVsdGFfbWV0aG9kcywJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlkZWx0YV9tZW1iZXJzLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkJLyogdHBfYWxsb2MgKi8KLQlkZWx0YV9uZXcsCQkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiZGF0ZXRpbWUudGltZWRlbHRhIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeURhdGVUaW1lX0RlbHRhKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylkZWx0YV9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmRlbHRhX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWRlbHRhX2hhc2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYylkZWx0YV9zdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBkZWx0YV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKWRlbHRhX3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkZWx0YV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGRlbHRhX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBkZWx0YV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qCkBAIC0yMjQ0LDI2ICsyMjQ0LDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV95ZWFyKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZiwgdm9pZCAqdW51c2VkKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhHRVRfWUVBUihzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKEdFVF9ZRUFSKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfbW9udGgoUHlEYXRlVGltZV9EYXRlICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKEdFVF9NT05USChzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKEdFVF9NT05USChzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2RheShQeURhdGVUaW1lX0RhdGUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoR0VUX0RBWShzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKEdFVF9EQVkoc2VsZikpOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgZGF0ZV9nZXRzZXRbXSA9IHsKLQl7InllYXIiLCAgICAgICAgKGdldHRlcilkYXRlX3llYXJ9LAotCXsibW9udGgiLCAgICAgICAoZ2V0dGVyKWRhdGVfbW9udGh9LAotCXsiZGF5IiwgICAgICAgICAoZ2V0dGVyKWRhdGVfZGF5fSwKLQl7TlVMTH0KKyAgICB7InllYXIiLCAgICAgICAgKGdldHRlcilkYXRlX3llYXJ9LAorICAgIHsibW9udGgiLCAgICAgICAoZ2V0dGVyKWRhdGVfbW9udGh9LAorICAgIHsiZGF5IiwgICAgICAgICAoZ2V0dGVyKWRhdGVfZGF5fSwKKyAgICB7TlVMTH0KIH07CiAKIC8qIENvbnN0cnVjdG9ycy4gKi8KQEAgLTIyNzMsNjAgKzIyNzMsNjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnNlbGYgPSBOVUxMOwotCVB5T2JqZWN0ICpzdGF0ZTsKLQlpbnQgeWVhcjsKLQlpbnQgbW9udGg7Ci0JaW50IGRheTsKKyAgICBQeU9iamVjdCAqc2VsZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnN0YXRlOworICAgIGludCB5ZWFyOworICAgIGludCBtb250aDsKKyAgICBpbnQgZGF5OwogCi0JLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxICYmCi0JICAgIFB5U3RyaW5nX0NoZWNrKHN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkgJiYKLQkgICAgUHlTdHJpbmdfR0VUX1NJWkUoc3RhdGUpID09IF9QeURhdGVUaW1lX0RBVEVfREFUQVNJWkUgJiYKLQkgICAgTU9OVEhfSVNfU0FORShQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpWzJdKSkKLQl7Ci0JICAgIAlQeURhdGVUaW1lX0RhdGUgKm1lOworICAgIC8qIENoZWNrIGZvciBpbnZvY2F0aW9uIGZyb20gcGlja2xlIHdpdGggX19nZXRzdGF0ZV9fIHN0YXRlICovCisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSAmJgorICAgICAgICBQeVN0cmluZ19DaGVjayhzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpICYmCisgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHN0YXRlKSA9PSBfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFICYmCisgICAgICAgIE1PTlRIX0lTX1NBTkUoUHlTdHJpbmdfQVNfU1RSSU5HKHN0YXRlKVsyXSkpCisgICAgeworICAgICAgICBQeURhdGVUaW1lX0RhdGUgKm1lOwogCi0JCW1lID0gKFB5RGF0ZVRpbWVfRGF0ZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpOwotCQlpZiAobWUgIT0gTlVMTCkgewotCQkJY2hhciAqcGRhdGEgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpOwotCQkJbWVtY3B5KG1lLT5kYXRhLCBwZGF0YSwgX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSk7Ci0JCQltZS0+aGFzaGNvZGUgPSAtMTsKLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopbWU7Ci0JfQorICAgICAgICBtZSA9IChQeURhdGVUaW1lX0RhdGUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKTsKKyAgICAgICAgaWYgKG1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNoYXIgKnBkYXRhID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0YXRlKTsKKyAgICAgICAgICAgIG1lbWNweShtZS0+ZGF0YSwgcGRhdGEsIF9QeURhdGVUaW1lX0RBVEVfREFUQVNJWkUpOworICAgICAgICAgICAgbWUtPmhhc2hjb2RlID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW1lOworICAgIH0KIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJpaWkiLCBkYXRlX2t3cywKLQkJCQkJJnllYXIsICZtb250aCwgJmRheSkpIHsKLQkJaWYgKGNoZWNrX2RhdGVfYXJncyh5ZWFyLCBtb250aCwgZGF5KSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJc2VsZiA9IG5ld19kYXRlX2V4KHllYXIsIG1vbnRoLCBkYXksIHR5cGUpOwotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiaWlpIiwgZGF0ZV9rd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeWVhciwgJm1vbnRoLCAmZGF5KSkgeworICAgICAgICBpZiAoY2hlY2tfZGF0ZV9hcmdzKHllYXIsIG1vbnRoLCBkYXkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzZWxmID0gbmV3X2RhdGVfZXgoeWVhciwgbW9udGgsIGRheSwgdHlwZSk7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiAvKiBSZXR1cm4gbmV3IGRhdGUgZnJvbSBsb2NhbHRpbWUodCkuICovCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9sb2NhbF9mcm9tX3RpbWVfdChQeU9iamVjdCAqY2xzLCBkb3VibGUgdHMpCiB7Ci0Jc3RydWN0IHRtICp0bTsKLQl0aW1lX3QgdDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgdG0gKnRtOworICAgIHRpbWVfdCB0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JdCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldCh0cyk7Ci0JaWYgKHQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQl0bSA9IGxvY2FsdGltZSgmdCk7Ci0JaWYgKHRtKQotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpIiwKLQkJCQkJICAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwKLQkJCQkJICAgICAgIHRtLT50bV9tb24gKyAxLAotCQkJCQkgICAgICAgdG0tPnRtX21kYXkpOwotCWVsc2UKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UgZm9yICIKLQkJCQkicGxhdGZvcm0gbG9jYWx0aW1lKCkgZnVuY3Rpb24iKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHQgPSBfUHlUaW1lX0RvdWJsZVRvVGltZXQodHMpOworICAgIGlmICh0ID09ICh0aW1lX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdG0gPSBsb2NhbHRpbWUoJnQpOworICAgIGlmICh0bSkKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNscywgImlpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1feWVhciArIDE5MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1fbW9uICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9tZGF5KTsKKyAgICBlbHNlCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybSBsb2NhbHRpbWUoKSBmdW5jdGlvbiIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFJldHVybiBuZXcgZGF0ZSBmcm9tIGN1cnJlbnQgdGltZS4KQEAgLTIzMzcsMzQgKzIzMzcsMzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX3RvZGF5KFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICpkdW1teSkKIHsKLQlQeU9iamVjdCAqdGltZTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICp0aW1lOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQl0aW1lID0gdGltZV90aW1lKCk7Ci0JaWYgKHRpbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgdGltZSA9IHRpbWVfdGltZSgpOworICAgIGlmICh0aW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogTm90ZSB3ZWxsOiAgdG9kYXkoKSBpcyBhIGNsYXNzIG1ldGhvZCwgc28gdGhpcyBtYXkgbm90IGNhbGwKLQkgKiBkYXRlLmZyb210aW1lc3RhbXAuICBGb3IgZXhhbXBsZSwgaXQgbWF5IGNhbGwKLQkgKiBkYXRldGltZS5mcm9tdGltZXN0YW1wLiAgVGhhdCdzIHdoeSB3ZSBuZWVkIGFsbCB0aGUgYWNjdXJhY3kKLQkgKiB0aW1lLnRpbWUoKSBkZWxpdmVyczsgaWYgc29tZW9uZSB3ZXJlIGdvbnpvIGFib3V0IG9wdGltaXphdGlvbiwKLQkgKiBkYXRlLnRvZGF5KCkgY291bGQgZ2V0IGF3YXkgd2l0aCBwbGFpbiBDIHRpbWUoKS4KLQkgKi8KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGNscywgImZyb210aW1lc3RhbXAiLCAiTyIsIHRpbWUpOwotCVB5X0RFQ1JFRih0aW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIE5vdGUgd2VsbDogIHRvZGF5KCkgaXMgYSBjbGFzcyBtZXRob2QsIHNvIHRoaXMgbWF5IG5vdCBjYWxsCisgICAgICogZGF0ZS5mcm9tdGltZXN0YW1wLiAgRm9yIGV4YW1wbGUsIGl0IG1heSBjYWxsCisgICAgICogZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcC4gIFRoYXQncyB3aHkgd2UgbmVlZCBhbGwgdGhlIGFjY3VyYWN5CisgICAgICogdGltZS50aW1lKCkgZGVsaXZlcnM7IGlmIHNvbWVvbmUgd2VyZSBnb256byBhYm91dCBvcHRpbWl6YXRpb24sCisgICAgICogZGF0ZS50b2RheSgpIGNvdWxkIGdldCBhd2F5IHdpdGggcGxhaW4gQyB0aW1lKCkuCisgICAgICovCisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChjbHMsICJmcm9tdGltZXN0YW1wIiwgIk8iLCB0aW1lKTsKKyAgICBQeV9ERUNSRUYodGltZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogUmV0dXJuIG5ldyBkYXRlIGZyb20gZ2l2ZW4gdGltZXN0YW1wIChQeXRob24gdGltZXN0YW1wIC0tIGEgZG91YmxlKS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2Zyb210aW1lc3RhbXAoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIHRpbWVzdGFtcDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBkb3VibGUgdGltZXN0YW1wOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6ZnJvbXRpbWVzdGFtcCIsICZ0aW1lc3RhbXApKQotCQlyZXN1bHQgPSBkYXRlX2xvY2FsX2Zyb21fdGltZV90KGNscywgdGltZXN0YW1wKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkOmZyb210aW1lc3RhbXAiLCAmdGltZXN0YW1wKSkKKyAgICAgICAgcmVzdWx0ID0gZGF0ZV9sb2NhbF9mcm9tX3RpbWVfdChjbHMsIHRpbWVzdGFtcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogUmV0dXJuIG5ldyBkYXRlIGZyb20gcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFsLiAgUmFpc2VzIFZhbHVlRXJyb3IgaWYKQEAgLTIzNzMsMjQgKzIzNzMsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2Zyb21vcmRpbmFsKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCWludCBvcmRpbmFsOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIGludCBvcmRpbmFsOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6ZnJvbW9yZGluYWwiLCAmb3JkaW5hbCkpIHsKLQkJaW50IHllYXI7Ci0JCWludCBtb250aDsKLQkJaW50IGRheTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpmcm9tb3JkaW5hbCIsICZvcmRpbmFsKSkgeworICAgICAgICBpbnQgeWVhcjsKKyAgICAgICAgaW50IG1vbnRoOworICAgICAgICBpbnQgZGF5OwogCi0JCWlmIChvcmRpbmFsIDwgMSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAib3JkaW5hbCBtdXN0IGJlICIKLQkJCQkJCQkgICI+PSAxIik7Ci0JCWVsc2UgewotCQkJb3JkX3RvX3ltZChvcmRpbmFsLCAmeWVhciwgJm1vbnRoLCAmZGF5KTsKLQkJCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjbHMsICJpaWkiLAotCQkJCQkJICAgICAgIHllYXIsIG1vbnRoLCBkYXkpOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgICAgIGlmIChvcmRpbmFsIDwgMSkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAib3JkaW5hbCBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0gMSIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG9yZF90b195bWQob3JkaW5hbCwgJnllYXIsICZtb250aCwgJmRheSk7CisgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKgpAQCAtMjQwMyw3NCArMjQwMyw3NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFkZF9kYXRlX3RpbWVkZWx0YShQeURhdGVUaW1lX0RhdGUgKmRhdGUsIFB5RGF0ZVRpbWVfRGVsdGEgKmRlbHRhLCBpbnQgbmVnYXRlKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCWludCB5ZWFyID0gR0VUX1lFQVIoZGF0ZSk7Ci0JaW50IG1vbnRoID0gR0VUX01PTlRIKGRhdGUpOwotCWludCBkZWx0YWRheXMgPSBHRVRfVERfREFZUyhkZWx0YSk7Ci0JLyogQy1sZXZlbCBvdmVyZmxvdyBpcyBpbXBvc3NpYmxlIGJlY2F1c2UgfGRlbHRhZGF5c3wgPCAxZTkuICovCi0JaW50IGRheSA9IEdFVF9EQVkoZGF0ZSkgKyAobmVnYXRlID8gLWRlbHRhZGF5cyA6IGRlbHRhZGF5cyk7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgaW50IHllYXIgPSBHRVRfWUVBUihkYXRlKTsKKyAgICBpbnQgbW9udGggPSBHRVRfTU9OVEgoZGF0ZSk7CisgICAgaW50IGRlbHRhZGF5cyA9IEdFVF9URF9EQVlTKGRlbHRhKTsKKyAgICAvKiBDLWxldmVsIG92ZXJmbG93IGlzIGltcG9zc2libGUgYmVjYXVzZSB8ZGVsdGFkYXlzfCA8IDFlOS4gKi8KKyAgICBpbnQgZGF5ID0gR0VUX0RBWShkYXRlKSArIChuZWdhdGUgPyAtZGVsdGFkYXlzIDogZGVsdGFkYXlzKTsKIAotCWlmIChub3JtYWxpemVfZGF0ZSgmeWVhciwgJm1vbnRoLCAmZGF5KSA+PSAwKQotCQlyZXN1bHQgPSBuZXdfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChub3JtYWxpemVfZGF0ZSgmeWVhciwgJm1vbnRoLCAmZGF5KSA+PSAwKQorICAgICAgICByZXN1bHQgPSBuZXdfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9hZGQoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlpZiAoUHlEYXRlVGltZV9DaGVjayhsZWZ0KSB8fCBQeURhdGVUaW1lX0NoZWNrKHJpZ2h0KSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCWlmIChQeURhdGVfQ2hlY2sobGVmdCkpIHsKLQkJLyogZGF0ZSArID8/PyAqLwotCQlpZiAoUHlEZWx0YV9DaGVjayhyaWdodCkpCi0JCQkvKiBkYXRlICsgZGVsdGEgKi8KLQkJCXJldHVybiBhZGRfZGF0ZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZSAqKSBsZWZ0LAotCQkJCQkJICAoUHlEYXRlVGltZV9EZWx0YSAqKSByaWdodCwKLQkJCQkJCSAgMCk7Ci0JfQotCWVsc2UgewotCQkvKiA/Pz8gKyBkYXRlCi0JCSAqICdyaWdodCcgbXVzdCBiZSBvbmUgb2YgdXMsIG9yIHdlIHdvdWxkbid0IGhhdmUgYmVlbiBjYWxsZWQKLQkJICovCi0JCWlmIChQeURlbHRhX0NoZWNrKGxlZnQpKQotCQkJLyogZGVsdGEgKyBkYXRlICovCi0JCQlyZXR1cm4gYWRkX2RhdGVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGUgKikgcmlnaHQsCi0JCQkJCQkgIChQeURhdGVUaW1lX0RlbHRhICopIGxlZnQsCi0JCQkJCQkgIDApOwotCX0KLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBpZiAoUHlEYXRlVGltZV9DaGVjayhsZWZ0KSB8fCBQeURhdGVUaW1lX0NoZWNrKHJpZ2h0KSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGlmIChQeURhdGVfQ2hlY2sobGVmdCkpIHsKKyAgICAgICAgLyogZGF0ZSArID8/PyAqLworICAgICAgICBpZiAoUHlEZWx0YV9DaGVjayhyaWdodCkpCisgICAgICAgICAgICAvKiBkYXRlICsgZGVsdGEgKi8KKyAgICAgICAgICAgIHJldHVybiBhZGRfZGF0ZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZSAqKSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiA/Pz8gKyBkYXRlCisgICAgICAgICAqICdyaWdodCcgbXVzdCBiZSBvbmUgb2YgdXMsIG9yIHdlIHdvdWxkbid0IGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgICovCisgICAgICAgIGlmIChQeURlbHRhX0NoZWNrKGxlZnQpKQorICAgICAgICAgICAgLyogZGVsdGEgKyBkYXRlICovCisgICAgICAgICAgICByZXR1cm4gYWRkX2RhdGVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGUgKikgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfc3VidHJhY3QoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlpZiAoUHlEYXRlVGltZV9DaGVjayhsZWZ0KSB8fCBQeURhdGVUaW1lX0NoZWNrKHJpZ2h0KSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCWlmIChQeURhdGVfQ2hlY2sobGVmdCkpIHsKLQkJaWYgKFB5RGF0ZV9DaGVjayhyaWdodCkpIHsKLQkJCS8qIGRhdGUgLSBkYXRlICovCi0JCQlpbnQgbGVmdF9vcmQgPSB5bWRfdG9fb3JkKEdFVF9ZRUFSKGxlZnQpLAotCQkJCQkJICBHRVRfTU9OVEgobGVmdCksCi0JCQkJCQkgIEdFVF9EQVkobGVmdCkpOwotCQkJaW50IHJpZ2h0X29yZCA9IHltZF90b19vcmQoR0VUX1lFQVIocmlnaHQpLAotCQkJCQkJICAgR0VUX01PTlRIKHJpZ2h0KSwKLQkJCQkJCSAgIEdFVF9EQVkocmlnaHQpKTsKLQkJCXJldHVybiBuZXdfZGVsdGEobGVmdF9vcmQgLSByaWdodF9vcmQsIDAsIDAsIDApOwotCQl9Ci0JCWlmIChQeURlbHRhX0NoZWNrKHJpZ2h0KSkgewotCQkJLyogZGF0ZSAtIGRlbHRhICovCi0JCQlyZXR1cm4gYWRkX2RhdGVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGUgKikgbGVmdCwKLQkJCQkJCSAgKFB5RGF0ZVRpbWVfRGVsdGEgKikgcmlnaHQsCi0JCQkJCQkgIDEpOwotCQl9Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIGlmIChQeURhdGVUaW1lX0NoZWNrKGxlZnQpIHx8IFB5RGF0ZVRpbWVfQ2hlY2socmlnaHQpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgaWYgKFB5RGF0ZV9DaGVjayhsZWZ0KSkgeworICAgICAgICBpZiAoUHlEYXRlX0NoZWNrKHJpZ2h0KSkgeworICAgICAgICAgICAgLyogZGF0ZSAtIGRhdGUgKi8KKyAgICAgICAgICAgIGludCBsZWZ0X29yZCA9IHltZF90b19vcmQoR0VUX1lFQVIobGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChsZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShsZWZ0KSk7CisgICAgICAgICAgICBpbnQgcmlnaHRfb3JkID0geW1kX3RvX29yZChHRVRfWUVBUihyaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgocmlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShyaWdodCkpOworICAgICAgICAgICAgcmV0dXJuIG5ld19kZWx0YShsZWZ0X29yZCAtIHJpZ2h0X29yZCwgMCwgMCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5RGVsdGFfQ2hlY2socmlnaHQpKSB7CisgICAgICAgICAgICAvKiBkYXRlIC0gZGVsdGEgKi8KKyAgICAgICAgICAgIHJldHVybiBhZGRfZGF0ZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZSAqKSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIApAQCAtMjQ3OSw4OSArMjQ3OSw4OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfcmVwcihQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JY2hhciBidWZmZXJbMTAyOF07Ci0JY29uc3QgY2hhciAqdHlwZV9uYW1lOworICAgIGNoYXIgYnVmZmVyWzEwMjhdOworICAgIGNvbnN0IGNoYXIgKnR5cGVfbmFtZTsKIAotCXR5cGVfbmFtZSA9IFB5X1RZUEUoc2VsZiktPnRwX25hbWU7Ci0JUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMoJWQsICVkLCAlZCkiLAotCQkgICAgICB0eXBlX25hbWUsCi0JCSAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZikpOworICAgIHR5cGVfbmFtZSA9IFB5X1RZUEUoc2VsZiktPnRwX25hbWU7CisgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMoJWQsICVkLCAlZCkiLAorICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2lzb2Zvcm1hdChQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JY2hhciBidWZmZXJbMTI4XTsKKyAgICBjaGFyIGJ1ZmZlclsxMjhdOwogCi0JaXNvZm9ybWF0X2RhdGUoc2VsZiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKKyAgICBpc29mb3JtYXRfZGF0ZShzZWxmLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOwogfQogCiAvKiBzdHIoKSBjYWxscyB0aGUgYXBwcm9wcmlhdGUgaXNvZm9ybWF0KCkgbWV0aG9kLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfc3RyKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAiaXNvZm9ybWF0IiwgIigpIik7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopc2VsZiwgImlzb2Zvcm1hdCIsICIoKSIpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2N0aW1lKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlyZXR1cm4gZm9ybWF0X2N0aW1lKHNlbGYsIDAsIDAsIDApOworICAgIHJldHVybiBmb3JtYXRfY3RpbWUoc2VsZiwgMCwgMCwgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX3N0cmZ0aW1lKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQkvKiBUaGlzIG1ldGhvZCBjYW4gYmUgaW5oZXJpdGVkLCBhbmQgbmVlZHMgdG8gY2FsbCB0aGUKLQkgKiB0aW1ldHVwbGUoKSBtZXRob2QgYXBwcm9wcmlhdGUgdG8gc2VsZidzIGNsYXNzLgotCSAqLwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKnR1cGxlOwotCWNvbnN0IGNoYXIgKmZvcm1hdDsKLQlQeV9zc2l6ZV90IGZvcm1hdF9sZW47Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImZvcm1hdCIsIE5VTEx9OworICAgIC8qIFRoaXMgbWV0aG9kIGNhbiBiZSBpbmhlcml0ZWQsIGFuZCBuZWVkcyB0byBjYWxsIHRoZQorICAgICAqIHRpbWV0dXBsZSgpIG1ldGhvZCBhcHByb3ByaWF0ZSB0byBzZWxmJ3MgY2xhc3MuCisgICAgICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqdHVwbGU7CisgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgIFB5X3NzaXplX3QgZm9ybWF0X2xlbjsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZm9ybWF0IiwgTlVMTH07CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJzIzpzdHJmdGltZSIsIGtleXdvcmRzLAotCQkJCQkgICZmb3JtYXQsICZmb3JtYXRfbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAicyM6c3RyZnRpbWUiLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwgJmZvcm1hdF9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXR1cGxlID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAidGltZXR1cGxlIiwgIigpIik7Ci0JaWYgKHR1cGxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IHdyYXBfc3RyZnRpbWUoKFB5T2JqZWN0ICopc2VsZiwgZm9ybWF0LCBmb3JtYXRfbGVuLCB0dXBsZSwKLQkJCSAgICAgICAoUHlPYmplY3QgKilzZWxmKTsKLQlQeV9ERUNSRUYodHVwbGUpOwotCXJldHVybiByZXN1bHQ7CisgICAgdHVwbGUgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKXNlbGYsICJ0aW1ldHVwbGUiLCAiKCkiKTsKKyAgICBpZiAodHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gd3JhcF9zdHJmdGltZSgoUHlPYmplY3QgKilzZWxmLCBmb3JtYXQsIGZvcm1hdF9sZW4sIHR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9mb3JtYXQoUHlEYXRlVGltZV9EYXRlICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZm9ybWF0OworICAgIFB5T2JqZWN0ICpmb3JtYXQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19mb3JtYXRfXyIsICZmb3JtYXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19mb3JtYXRfXyIsICZmb3JtYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIENoZWNrIGZvciBzdHIgb3IgdW5pY29kZSAqLwotCWlmIChQeVN0cmluZ19DaGVjayhmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgLyogSWYgZm9ybWF0IGlzIHplcm8gbGVuZ3RoLCByZXR1cm4gc3RyKHNlbGYpICovCi0JCWlmIChQeVN0cmluZ19HRVRfU0laRShmb3JtYXQpID09IDApCi0JCQlyZXR1cm4gUHlPYmplY3RfU3RyKChQeU9iamVjdCAqKXNlbGYpOwotCX0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBmb3JtYXQgaXMgemVybyBsZW5ndGgsIHJldHVybiBzdHIoc2VsZikgKi8KLQkJaWYgKFB5VW5pY29kZV9HRVRfU0laRShmb3JtYXQpID09IDApCi0JCQlyZXR1cm4gUHlPYmplY3RfVW5pY29kZSgoUHlPYmplY3QgKilzZWxmKTsKLQl9IGVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIl9fZm9ybWF0X18gZXhwZWN0cyBzdHIgb3IgdW5pY29kZSwgbm90ICUuMjAwcyIsCi0JCQkgICAgIFB5X1RZUEUoZm9ybWF0KS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAic3RyZnRpbWUiLCAiTyIsIGZvcm1hdCk7CisgICAgLyogQ2hlY2sgZm9yIHN0ciBvciB1bmljb2RlICovCisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGZvcm1hdCkpIHsKKyAgICAgICAgLyogSWYgZm9ybWF0IGlzIHplcm8gbGVuZ3RoLCByZXR1cm4gc3RyKHNlbGYpICovCisgICAgICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShmb3JtYXQpID09IDApCisgICAgICAgICAgICByZXR1cm4gUHlPYmplY3RfU3RyKChQeU9iamVjdCAqKXNlbGYpOworICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdCkpIHsKKyAgICAgICAgLyogSWYgZm9ybWF0IGlzIHplcm8gbGVuZ3RoLCByZXR1cm4gc3RyKHNlbGYpICovCisgICAgICAgIGlmIChQeVVuaWNvZGVfR0VUX1NJWkUoZm9ybWF0KSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIFB5T2JqZWN0X1VuaWNvZGUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19mb3JtYXRfXyBleHBlY3RzIHN0ciBvciB1bmljb2RlLCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoZm9ybWF0KS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAic3RyZnRpbWUiLCAiTyIsIGZvcm1hdCk7CiB9CiAKIC8qIElTTyBtZXRob2RzLiAqLwpAQCAtMjU2OSwzMSArMjU2OSwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfaXNvd2Vla2RheShQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JaW50IGRvdyA9IHdlZWtkYXkoR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CisgICAgaW50IGRvdyA9IHdlZWtkYXkoR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZG93ICsgMSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGRvdyArIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9pc29jYWxlbmRhcihQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JaW50ICB5ZWFyICAgICAgICAgPSBHRVRfWUVBUihzZWxmKTsKLQlpbnQgIHdlZWsxX21vbmRheSA9IGlzb193ZWVrMV9tb25kYXkoeWVhcik7Ci0JaW50IHRvZGF5ICAgICAgICAgPSB5bWRfdG9fb3JkKHllYXIsIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7Ci0JaW50ICB3ZWVrOwotCWludCAgZGF5OworICAgIGludCAgeWVhciAgICAgICAgID0gR0VUX1lFQVIoc2VsZik7CisgICAgaW50ICB3ZWVrMV9tb25kYXkgPSBpc29fd2VlazFfbW9uZGF5KHllYXIpOworICAgIGludCB0b2RheSAgICAgICAgID0geW1kX3RvX29yZCh5ZWFyLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZikpOworICAgIGludCAgd2VlazsKKyAgICBpbnQgIGRheTsKIAotCXdlZWsgPSBkaXZtb2QodG9kYXkgLSB3ZWVrMV9tb25kYXksIDcsICZkYXkpOwotCWlmICh3ZWVrIDwgMCkgewotCQktLXllYXI7Ci0JCXdlZWsxX21vbmRheSA9IGlzb193ZWVrMV9tb25kYXkoeWVhcik7Ci0JCXdlZWsgPSBkaXZtb2QodG9kYXkgLSB3ZWVrMV9tb25kYXksIDcsICZkYXkpOwotCX0KLQllbHNlIGlmICh3ZWVrID49IDUyICYmIHRvZGF5ID49IGlzb193ZWVrMV9tb25kYXkoeWVhciArIDEpKSB7Ci0JCSsreWVhcjsKLQkJd2VlayA9IDA7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaWkiLCB5ZWFyLCB3ZWVrICsgMSwgZGF5ICsgMSk7CisgICAgd2VlayA9IGRpdm1vZCh0b2RheSAtIHdlZWsxX21vbmRheSwgNywgJmRheSk7CisgICAgaWYgKHdlZWsgPCAwKSB7CisgICAgICAgIC0teWVhcjsKKyAgICAgICAgd2VlazFfbW9uZGF5ID0gaXNvX3dlZWsxX21vbmRheSh5ZWFyKTsKKyAgICAgICAgd2VlayA9IGRpdm1vZCh0b2RheSAtIHdlZWsxX21vbmRheSwgNywgJmRheSk7CisgICAgfQorICAgIGVsc2UgaWYgKHdlZWsgPj0gNTIgJiYgdG9kYXkgPj0gaXNvX3dlZWsxX21vbmRheSh5ZWFyICsgMSkpIHsKKyAgICAgICAgKyt5ZWFyOworICAgICAgICB3ZWVrID0gMDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIHllYXIsIHdlZWsgKyAxLCBkYXkgKyAxKTsKIH0KIAogLyogTWlzY2VsbGFuZW91cyBtZXRob2RzLiAqLwpAQCAtMjYwNSw1MyArMjYwNSw1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfcmljaGNvbXBhcmUoUHlEYXRlVGltZV9EYXRlICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlpbnQgZGlmZiA9IDQyOwkvKiBub25zZW5zZSAqLworICAgIGludCBkaWZmID0gNDI7ICAgICAgLyogbm9uc2Vuc2UgKi8KIAotCWlmIChQeURhdGVfQ2hlY2sob3RoZXIpKQotCQlkaWZmID0gbWVtY21wKHNlbGYtPmRhdGEsICgoUHlEYXRlVGltZV9EYXRlICopb3RoZXIpLT5kYXRhLAotCQkJICAgICAgX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSk7CisgICAgaWYgKFB5RGF0ZV9DaGVjayhvdGhlcikpCisgICAgICAgIGRpZmYgPSBtZW1jbXAoc2VsZi0+ZGF0YSwgKChQeURhdGVUaW1lX0RhdGUgKilvdGhlciktPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSk7CiAKLQllbHNlIGlmIChQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG90aGVyLCAidGltZXR1cGxlIikpIHsKLQkJLyogQSBob29rIGZvciBvdGhlciBraW5kcyBvZiBkYXRlIG9iamVjdHMuICovCi0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JZWxzZSBpZiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpCi0JCWRpZmYgPSAxOwkvKiBhbnkgbm9uLXplcm8gdmFsdWUgd2lsbCBkbyAqLworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcob3RoZXIsICJ0aW1ldHVwbGUiKSkgeworICAgICAgICAvKiBBIGhvb2sgZm9yIG90aGVyIGtpbmRzIG9mIGRhdGUgb2JqZWN0cy4gKi8KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICBlbHNlIGlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkKKyAgICAgICAgZGlmZiA9IDE7ICAgICAgICAgICAgICAgLyogYW55IG5vbi16ZXJvIHZhbHVlIHdpbGwgZG8gKi8KIAotCWVsc2UgLyogc3RvcCB0aGlzIGZyb20gZmFsbGluZyBiYWNrIHRvIGFkZHJlc3MgY29tcGFyaXNvbiAqLwotCQlyZXR1cm4gY21wZXJyb3IoKFB5T2JqZWN0ICopc2VsZiwgb3RoZXIpOworICAgIGVsc2UgLyogc3RvcCB0aGlzIGZyb20gZmFsbGluZyBiYWNrIHRvIGFkZHJlc3MgY29tcGFyaXNvbiAqLworICAgICAgICByZXR1cm4gY21wZXJyb3IoKFB5T2JqZWN0ICopc2VsZiwgb3RoZXIpOwogCi0JcmV0dXJuIGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7CisgICAgcmV0dXJuIGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX3RpbWV0dXBsZShQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JcmV0dXJuIGJ1aWxkX3N0cnVjdF90aW1lKEdFVF9ZRUFSKHNlbGYpLAotCQkJCSBHRVRfTU9OVEgoc2VsZiksCi0JCQkJIEdFVF9EQVkoc2VsZiksCi0JCQkJIDAsIDAsIDAsIC0xKTsKKyAgICByZXR1cm4gYnVpbGRfc3RydWN0X3RpbWUoR0VUX1lFQVIoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgLTEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9yZXBsYWNlKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqY2xvbmU7Ci0JUHlPYmplY3QgKnR1cGxlOwotCWludCB5ZWFyID0gR0VUX1lFQVIoc2VsZik7Ci0JaW50IG1vbnRoID0gR0VUX01PTlRIKHNlbGYpOwotCWludCBkYXkgPSBHRVRfREFZKHNlbGYpOworICAgIFB5T2JqZWN0ICpjbG9uZTsKKyAgICBQeU9iamVjdCAqdHVwbGU7CisgICAgaW50IHllYXIgPSBHRVRfWUVBUihzZWxmKTsKKyAgICBpbnQgbW9udGggPSBHRVRfTU9OVEgoc2VsZik7CisgICAgaW50IGRheSA9IEdFVF9EQVkoc2VsZik7CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpOnJlcGxhY2UiLCBkYXRlX2t3cywKLQkJCQkJICAmeWVhciwgJm1vbnRoLCAmZGF5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWkiLCB5ZWFyLCBtb250aCwgZGF5KTsKLQlpZiAodHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JY2xvbmUgPSBkYXRlX25ldyhQeV9UWVBFKHNlbGYpLCB0dXBsZSwgTlVMTCk7Ci0JUHlfREVDUkVGKHR1cGxlKTsKLQlyZXR1cm4gY2xvbmU7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGlpaTpyZXBsYWNlIiwgZGF0ZV9rd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5ZWFyLCAmbW9udGgsICZkYXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaSIsIHllYXIsIG1vbnRoLCBkYXkpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjbG9uZSA9IGRhdGVfbmV3KFB5X1RZUEUoc2VsZiksIHR1cGxlLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIHJldHVybiBjbG9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpkYXRlX2dldHN0YXRlKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZik7CkBAIC0yNjU5LDI5ICsyNjU5LDI5IEBACiBzdGF0aWMgbG9uZwogZGF0ZV9oYXNoKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKLQkJUHlPYmplY3QgKnRlbXAgPSBkYXRlX2dldHN0YXRlKHNlbGYpOwotCQlpZiAodGVtcCAhPSBOVUxMKSB7Ci0JCQlzZWxmLT5oYXNoY29kZSA9IFB5T2JqZWN0X0hhc2godGVtcCk7Ci0JCQlQeV9ERUNSRUYodGVtcCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHNlbGYtPmhhc2hjb2RlOworICAgIGlmIChzZWxmLT5oYXNoY29kZSA9PSAtMSkgeworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IGRhdGVfZ2V0c3RhdGUoc2VsZik7CisgICAgICAgIGlmICh0ZW1wICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNlbGYtPmhhc2hjb2RlID0gUHlPYmplY3RfSGFzaCh0ZW1wKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VsZi0+aGFzaGNvZGU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX3Rvb3JkaW5hbChQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHltZF90b19vcmQoR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwKLQkJCQkJIEdFVF9EQVkoc2VsZikpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeW1kX3RvX29yZChHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoc2VsZikpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfd2Vla2RheShQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JaW50IGRvdyA9IHdlZWtkYXkoR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CisgICAgaW50IGRvdyA9IHdlZWtkYXkoR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZG93KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZG93KTsKIH0KIAogLyogUGlja2xlIHN1cHBvcnQsIGEgc2ltcGxlIHVzZSBvZiBfX3JlZHVjZV9fLiAqLwpAQCAtMjY5MCwxMzYgKzI2OTAsMTM2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9nZXRzdGF0ZShQeURhdGVUaW1lX0RhdGUgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoCi0JCSIoTikiLAotCQlQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCi0JCQkJCSAgIF9QeURhdGVUaW1lX0RBVEVfREFUQVNJWkUpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgKKyAgICAgICAgIihOKSIsCisgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9yZWR1Y2UoUHlEYXRlVGltZV9EYXRlICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgZGF0ZV9nZXRzdGF0ZShzZWxmKSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPTikiLCBQeV9UWVBFKHNlbGYpLCBkYXRlX2dldHN0YXRlKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGRhdGVfbWV0aG9kc1tdID0gewogCi0JLyogQ2xhc3MgbWV0aG9kczogKi8KKyAgICAvKiBDbGFzcyBtZXRob2RzOiAqLwogCi0JeyJmcm9tdGltZXN0YW1wIiwgKFB5Q0Z1bmN0aW9uKWRhdGVfZnJvbXRpbWVzdGFtcCwgTUVUSF9WQVJBUkdTIHwKLQkJCQkJCQkgICBNRVRIX0NMQVNTLAotCSBQeURvY19TVFIoInRpbWVzdGFtcCAtPiBsb2NhbCBkYXRlIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAgKGxpa2UgIgotCSAJICAgInRpbWUudGltZSgpKS4iKX0sCisgICAgeyJmcm9tdGltZXN0YW1wIiwgKFB5Q0Z1bmN0aW9uKWRhdGVfZnJvbXRpbWVzdGFtcCwgTUVUSF9WQVJBUkdTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoInRpbWVzdGFtcCAtPiBsb2NhbCBkYXRlIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAgKGxpa2UgIgorICAgICAgICAgICAgICAgInRpbWUudGltZSgpKS4iKX0sCiAKLQl7ImZyb21vcmRpbmFsIiwgKFB5Q0Z1bmN0aW9uKWRhdGVfZnJvbW9yZGluYWwsCU1FVEhfVkFSQVJHUyB8Ci0JCQkJCQkJTUVUSF9DTEFTUywKLQkgUHlEb2NfU1RSKCJpbnQgLT4gZGF0ZSBjb3JyZXNwb25kaW5nIHRvIGEgcHJvbGVwdGljIEdyZWdvcmlhbiAiCi0JIAkgICAib3JkaW5hbC4iKX0sCisgICAgeyJmcm9tb3JkaW5hbCIsIChQeUNGdW5jdGlvbilkYXRlX2Zyb21vcmRpbmFsLCAgICAgIE1FVEhfVkFSQVJHUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9DTEFTUywKKyAgICAgUHlEb2NfU1RSKCJpbnQgLT4gZGF0ZSBjb3JyZXNwb25kaW5nIHRvIGEgcHJvbGVwdGljIEdyZWdvcmlhbiAiCisgICAgICAgICAgICAgICAib3JkaW5hbC4iKX0sCiAKLQl7InRvZGF5IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGF0ZV90b2RheSwgICBNRVRIX05PQVJHUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigiQ3VycmVudCBkYXRlIG9yIGRhdGV0aW1lOiAgc2FtZSBhcyAiCi0JIAkgICAic2VsZi5fX2NsYXNzX18uZnJvbXRpbWVzdGFtcCh0aW1lLnRpbWUoKSkuIil9LAorICAgIHsidG9kYXkiLCAgICAgICAgIChQeUNGdW5jdGlvbilkYXRlX3RvZGF5LCAgIE1FVEhfTk9BUkdTIHwgTUVUSF9DTEFTUywKKyAgICAgUHlEb2NfU1RSKCJDdXJyZW50IGRhdGUgb3IgZGF0ZXRpbWU6ICBzYW1lIGFzICIKKyAgICAgICAgICAgICAgICJzZWxmLl9fY2xhc3NfXy5mcm9tdGltZXN0YW1wKHRpbWUudGltZSgpKS4iKX0sCiAKLQkvKiBJbnN0YW5jZSBtZXRob2RzOiAqLworICAgIC8qIEluc3RhbmNlIG1ldGhvZHM6ICovCiAKLQl7ImN0aW1lIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGVfY3RpbWUsICAgICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gY3RpbWUoKSBzdHlsZSBzdHJpbmcuIil9LAorICAgIHsiY3RpbWUiLCAgICAgICAoUHlDRnVuY3Rpb24pZGF0ZV9jdGltZSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBjdGltZSgpIHN0eWxlIHN0cmluZy4iKX0sCiAKLQl7InN0cmZ0aW1lIiwgICAJKFB5Q0Z1bmN0aW9uKWRhdGVfc3RyZnRpbWUsCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigiZm9ybWF0IC0+IHN0cmZ0aW1lKCkgc3R5bGUgc3RyaW5nLiIpfSwKKyAgICB7InN0cmZ0aW1lIiwgICAgICAgIChQeUNGdW5jdGlvbilkYXRlX3N0cmZ0aW1lLCAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgUHlEb2NfU1RSKCJmb3JtYXQgLT4gc3RyZnRpbWUoKSBzdHlsZSBzdHJpbmcuIil9LAogCi0JeyJfX2Zvcm1hdF9fIiwgCShQeUNGdW5jdGlvbilkYXRlX2Zvcm1hdCwJTUVUSF9WQVJBUkdTLAotCSBQeURvY19TVFIoIkZvcm1hdHMgc2VsZiB3aXRoIHN0cmZ0aW1lLiIpfSwKKyAgICB7Il9fZm9ybWF0X18iLCAgICAgIChQeUNGdW5jdGlvbilkYXRlX2Zvcm1hdCwgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBQeURvY19TVFIoIkZvcm1hdHMgc2VsZiB3aXRoIHN0cmZ0aW1lLiIpfSwKIAotCXsidGltZXR1cGxlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZV90aW1ldHVwbGUsICAgIE1FVEhfTk9BUkdTLAotICAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGltZSB0dXBsZSwgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuIil9LAorICAgIHsidGltZXR1cGxlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZV90aW1ldHVwbGUsICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiB0aW1lIHR1cGxlLCBjb21wYXRpYmxlIHdpdGggdGltZS5sb2NhbHRpbWUoKS4iKX0sCiAKLQl7Imlzb2NhbGVuZGFyIiwgKFB5Q0Z1bmN0aW9uKWRhdGVfaXNvY2FsZW5kYXIsICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgSVNPIHllYXIsIHdlZWsgbnVtYmVyLCBhbmQgIgotCSAJICAgIndlZWtkYXkuIil9LAorICAgIHsiaXNvY2FsZW5kYXIiLCAoUHlDRnVuY3Rpb24pZGF0ZV9pc29jYWxlbmRhciwgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyBJU08geWVhciwgd2VlayBudW1iZXIsIGFuZCAiCisgICAgICAgICAgICAgICAid2Vla2RheS4iKX0sCiAKLQl7Imlzb2Zvcm1hdCIsICAgKFB5Q0Z1bmN0aW9uKWRhdGVfaXNvZm9ybWF0LAlNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgWVlZWS1NTS1ERC4iKX0sCisgICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbilkYXRlX2lzb2Zvcm1hdCwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCBZWVlZLU1NLURELiIpfSwKIAotCXsiaXNvd2Vla2RheSIsICAoUHlDRnVuY3Rpb24pZGF0ZV9pc293ZWVrZGF5LCAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiB0aGUgZGF5IG9mIHRoZSB3ZWVrIHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRlLlxuIgotCSAJICAgIk1vbmRheSA9PSAxIC4uLiBTdW5kYXkgPT0gNyIpfSwKKyAgICB7Imlzb3dlZWtkYXkiLCAgKFB5Q0Z1bmN0aW9uKWRhdGVfaXNvd2Vla2RheSwgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGhlIGRheSBvZiB0aGUgd2VlayByZXByZXNlbnRlZCBieSB0aGUgZGF0ZS5cbiIKKyAgICAgICAgICAgICAgICJNb25kYXkgPT0gMSAuLi4gU3VuZGF5ID09IDciKX0sCiAKLQl7InRvb3JkaW5hbCIsICAgKFB5Q0Z1bmN0aW9uKWRhdGVfdG9vcmRpbmFsLCAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFsLiAgSmFudWFyeSAxIG9mIHllYXIgIgotCSAJICAgIjEgaXMgZGF5IDEuIil9LAorICAgIHsidG9vcmRpbmFsIiwgICAoUHlDRnVuY3Rpb24pZGF0ZV90b29yZGluYWwsICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwuICBKYW51YXJ5IDEgb2YgeWVhciAiCisgICAgICAgICAgICAgICAiMSBpcyBkYXkgMS4iKX0sCiAKLQl7IndlZWtkYXkiLCAgICAgKFB5Q0Z1bmN0aW9uKWRhdGVfd2Vla2RheSwgICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gdGhlIGRheSBvZiB0aGUgd2VlayByZXByZXNlbnRlZCBieSB0aGUgZGF0ZS5cbiIKLQkJICAgIk1vbmRheSA9PSAwIC4uLiBTdW5kYXkgPT0gNiIpfSwKKyAgICB7IndlZWtkYXkiLCAgICAgKFB5Q0Z1bmN0aW9uKWRhdGVfd2Vla2RheSwgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGhlIGRheSBvZiB0aGUgd2VlayByZXByZXNlbnRlZCBieSB0aGUgZGF0ZS5cbiIKKyAgICAgICAgICAgICAgICJNb25kYXkgPT0gMCAuLi4gU3VuZGF5ID09IDYiKX0sCiAKLQl7InJlcGxhY2UiLCAgICAgKFB5Q0Z1bmN0aW9uKWRhdGVfcmVwbGFjZSwgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCSBQeURvY19TVFIoIlJldHVybiBkYXRlIHdpdGggbmV3IHNwZWNpZmllZCBmaWVsZHMuIil9LAorICAgIHsicmVwbGFjZSIsICAgICAoUHlDRnVuY3Rpb24pZGF0ZV9yZXBsYWNlLCAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIGRhdGUgd2l0aCBuZXcgc3BlY2lmaWVkIGZpZWxkcy4iKX0sCiAKLQl7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pZGF0ZV9yZWR1Y2UsICAgICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJfX3JlZHVjZV9fKCkgLT4gKGNscywgc3RhdGUpIil9LAorICAgIHsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilkYXRlX3JlZHVjZSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIl9fcmVkdWNlX18oKSAtPiAoY2xzLCBzdGF0ZSkiKX0sCiAKLQl7TlVMTCwJTlVMTH0KKyAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAogc3RhdGljIGNoYXIgZGF0ZV9kb2NbXSA9CiBQeURvY19TVFIoImRhdGUoeWVhciwgbW9udGgsIGRheSkgLS0+IGRhdGUgb2JqZWN0Iik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgZGF0ZV9hc19udW1iZXIgPSB7Ci0JZGF0ZV9hZGQsCQkJCQkvKiBuYl9hZGQgKi8KLQlkYXRlX3N1YnRyYWN0LAkJCQkJLyogbmJfc3VidHJhY3QgKi8KLQkwLAkJCQkJCS8qIG5iX211bHRpcGx5ICovCi0JMCwJCQkJCQkvKiBuYl9kaXZpZGUgKi8KLQkwLAkJCQkJCS8qIG5iX3JlbWFpbmRlciAqLwotCTAsCQkJCQkJLyogbmJfZGl2bW9kICovCi0JMCwJCQkJCQkvKiBuYl9wb3dlciAqLwotCTAsCQkJCQkJLyogbmJfbmVnYXRpdmUgKi8KLQkwLAkJCQkJCS8qIG5iX3Bvc2l0aXZlICovCi0JMCwJCQkJCQkvKiBuYl9hYnNvbHV0ZSAqLwotCTAsCQkJCQkJLyogbmJfbm9uemVybyAqLworICAgIGRhdGVfYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICBkYXRlX3N1YnRyYWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfc3VidHJhY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbXVsdGlwbHkgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3JlbWFpbmRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9kaXZtb2QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbmVnYXRpdmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG9zaXRpdmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbm9uemVybyAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeURhdGVUaW1lX0RhdGVUeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJkYXRldGltZS5kYXRlIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeURhdGVUaW1lX0RhdGUpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWRhdGVfcmVwciwJCQkJLyogdHBfcmVwciAqLwotCSZkYXRlX2FzX251bWJlciwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylkYXRlX2hhc2gsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLCAgICAgICAgICAgICAgCQkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpZGF0ZV9zdHIsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLSAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwJCQkJLyogdHBfZmxhZ3MgKi8KLQlkYXRlX2RvYywJCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKWRhdGVfcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWRhdGVfbWV0aG9kcywJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlkYXRlX2dldHNldCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJCS8qIHRwX2FsbG9jICovCi0JZGF0ZV9uZXcsCQkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiZGF0ZXRpbWUuZGF0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeURhdGVUaW1lX0RhdGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylkYXRlX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmRhdGVfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWRhdGVfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYylkYXRlX3N0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBkYXRlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKWRhdGVfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkYXRlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgZGF0ZV9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBkYXRlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qCkBAIC0yODQyLDEwICsyODQyLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHppbmZvX25vZ28oY29uc3QgY2hhciogbWV0aG9kbmFtZSkKIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKLQkJICAgICAiYSB0emluZm8gc3ViY2xhc3MgbXVzdCBpbXBsZW1lbnQgJXMoKSIsCi0JCSAgICAgbWV0aG9kbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICJhIHR6aW5mbyBzdWJjbGFzcyBtdXN0IGltcGxlbWVudCAlcygpIiwKKyAgICAgICAgICAgICAgICAgbWV0aG9kbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIE1ldGhvZHMuICBBIHN1YmNsYXNzIG11c3QgaW1wbGVtZW50IHRoZXNlLiAqLwpAQCAtMjg1MywxMDEgKzI4NTMsMTAxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHppbmZvX3R6bmFtZShQeURhdGVUaW1lX1RaSW5mbyAqc2VsZiwgUHlPYmplY3QgKmR0KQogewotCXJldHVybiB0emluZm9fbm9nbygidHpuYW1lIik7CisgICAgcmV0dXJuIHR6aW5mb19ub2dvKCJ0em5hbWUiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR6aW5mb191dGNvZmZzZXQoUHlEYXRlVGltZV9UWkluZm8gKnNlbGYsIFB5T2JqZWN0ICpkdCkKIHsKLQlyZXR1cm4gdHppbmZvX25vZ28oInV0Y29mZnNldCIpOworICAgIHJldHVybiB0emluZm9fbm9nbygidXRjb2Zmc2V0Iik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0emluZm9fZHN0KFB5RGF0ZVRpbWVfVFpJbmZvICpzZWxmLCBQeU9iamVjdCAqZHQpCiB7Ci0JcmV0dXJuIHR6aW5mb19ub2dvKCJkc3QiKTsKKyAgICByZXR1cm4gdHppbmZvX25vZ28oImRzdCIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHppbmZvX2Zyb211dGMoUHlEYXRlVGltZV9UWkluZm8gKnNlbGYsIFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKmR0KQogewotCWludCB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1czsKKyAgICBpbnQgeSwgbSwgZCwgaGgsIG1tLCBzcywgdXM7CiAKLQlQeU9iamVjdCAqcmVzdWx0OwotCWludCBvZmYsIGRzdDsKLQlpbnQgbm9uZTsKLQlpbnQgZGVsdGE7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgb2ZmLCBkc3Q7CisgICAgaW50IG5vbmU7CisgICAgaW50IGRlbHRhOwogCi0JaWYgKCEgUHlEYXRlVGltZV9DaGVjayhkdCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZnJvbXV0YzogYXJndW1lbnQgbXVzdCBiZSBhIGRhdGV0aW1lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoISBIQVNUWklORk8oZHQpIHx8IGR0LT50emluZm8gIT0gKFB5T2JqZWN0ICopc2VsZikgewotCSAgICAJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmcm9tdXRjOiBkdC50emluZm8gIgotCSAgICAJCQkiaXMgbm90IHNlbGYiKTsKLQkgICAgCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoISBQeURhdGVUaW1lX0NoZWNrKGR0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZyb211dGM6IGFyZ3VtZW50IG11c3QgYmUgYSBkYXRldGltZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCEgSEFTVFpJTkZPKGR0KSB8fCBkdC0+dHppbmZvICE9IChQeU9iamVjdCAqKXNlbGYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmcm9tdXRjOiBkdC50emluZm8gIgorICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBzZWxmIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW9mZiA9IGNhbGxfdXRjb2Zmc2V0KGR0LT50emluZm8sIChQeU9iamVjdCAqKWR0LCAmbm9uZSk7Ci0JaWYgKG9mZiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobm9uZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZyb211dGM6IG5vbi1Ob25lICIKLQkJCQkidXRjb2Zmc2V0KCkgcmVzdWx0IHJlcXVpcmVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBvZmYgPSBjYWxsX3V0Y29mZnNldChkdC0+dHppbmZvLCAoUHlPYmplY3QgKilkdCwgJm5vbmUpOworICAgIGlmIChvZmYgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG5vbmUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmcm9tdXRjOiBub24tTm9uZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAidXRjb2Zmc2V0KCkgcmVzdWx0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWRzdCA9IGNhbGxfZHN0KGR0LT50emluZm8sIChQeU9iamVjdCAqKWR0LCAmbm9uZSk7Ci0JaWYgKGRzdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobm9uZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZyb211dGM6IG5vbi1Ob25lICIKLQkJCQkiZHN0KCkgcmVzdWx0IHJlcXVpcmVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBkc3QgPSBjYWxsX2RzdChkdC0+dHppbmZvLCAoUHlPYmplY3QgKilkdCwgJm5vbmUpOworICAgIGlmIChkc3QgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG5vbmUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmcm9tdXRjOiBub24tTm9uZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZHN0KCkgcmVzdWx0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXkgPSBHRVRfWUVBUihkdCk7Ci0JbSA9IEdFVF9NT05USChkdCk7Ci0JZCA9IEdFVF9EQVkoZHQpOwotCWhoID0gREFURV9HRVRfSE9VUihkdCk7Ci0JbW0gPSBEQVRFX0dFVF9NSU5VVEUoZHQpOwotCXNzID0gREFURV9HRVRfU0VDT05EKGR0KTsKLQl1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKGR0KTsKKyAgICB5ID0gR0VUX1lFQVIoZHQpOworICAgIG0gPSBHRVRfTU9OVEgoZHQpOworICAgIGQgPSBHRVRfREFZKGR0KTsKKyAgICBoaCA9IERBVEVfR0VUX0hPVVIoZHQpOworICAgIG1tID0gREFURV9HRVRfTUlOVVRFKGR0KTsKKyAgICBzcyA9IERBVEVfR0VUX1NFQ09ORChkdCk7CisgICAgdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChkdCk7CiAKLQlkZWx0YSA9IG9mZiAtIGRzdDsKLQltbSArPSBkZWx0YTsKLQlpZiAoKG1tIDwgMCB8fCBtbSA+PSA2MCkgJiYKLQkgICAgbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cykgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBuZXdfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIGR0LT50emluZm8pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKKyAgICBkZWx0YSA9IG9mZiAtIGRzdDsKKyAgICBtbSArPSBkZWx0YTsKKyAgICBpZiAoKG1tIDwgMCB8fCBtbSA+PSA2MCkgJiYKKyAgICAgICAgbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBuZXdfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIGR0LT50emluZm8pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKIAotCWRzdCA9IGNhbGxfZHN0KGR0LT50emluZm8sIHJlc3VsdCwgJm5vbmUpOwotCWlmIChkc3QgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBGYWlsOwotCWlmIChub25lKQotCQlnb3RvIEluY29uc2lzdGVudDsKLQlpZiAoZHN0ID09IDApCi0JCXJldHVybiByZXN1bHQ7CisgICAgZHN0ID0gY2FsbF9kc3QoZHQtPnR6aW5mbywgcmVzdWx0LCAmbm9uZSk7CisgICAgaWYgKGRzdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIEZhaWw7CisgICAgaWYgKG5vbmUpCisgICAgICAgIGdvdG8gSW5jb25zaXN0ZW50OworICAgIGlmIChkc3QgPT0gMCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKIAotCW1tICs9IGRzdDsKLQlpZiAoKG1tIDwgMCB8fCBtbSA+PSA2MCkgJiYKLQkgICAgbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cykgPCAwKQotCQlnb3RvIEZhaWw7Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmVzdWx0ID0gbmV3X2RhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCBkdC0+dHppbmZvKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIG1tICs9IGRzdDsKKyAgICBpZiAoKG1tIDwgMCB8fCBtbSA+PSA2MCkgJiYKKyAgICAgICAgbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cykgPCAwKQorICAgICAgICBnb3RvIEZhaWw7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gbmV3X2RhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCBkdC0+dHppbmZvKTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBJbmNvbnNpc3RlbnQ6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmcm9tdXRjOiB0ei5kc3QoKSBnYXZlIgotCQkJImluY29uc2lzdGVudCByZXN1bHRzOyBjYW5ub3QgY29udmVydCIpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZnJvbXV0YzogdHouZHN0KCkgZ2F2ZSIKKyAgICAgICAgICAgICAgICAgICAgImluY29uc2lzdGVudCByZXN1bHRzOyBjYW5ub3QgY29udmVydCIpOwogCi0JLyogZmFsbCB0aHJ1IHRvIGZhaWx1cmUgKi8KKyAgICAvKiBmYWxsIHRocnUgdG8gZmFpbHVyZSAqLwogRmFpbDoKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyoKQEAgLTI5NTgsMTI0ICsyOTU4LDEyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHR6aW5mb19yZWR1Y2UoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmFyZ3MsICpzdGF0ZSwgKnRtcDsKLQlQeU9iamVjdCAqZ2V0aW5pdGFyZ3MsICpnZXRzdGF0ZTsKKyAgICBQeU9iamVjdCAqYXJncywgKnN0YXRlLCAqdG1wOworICAgIFB5T2JqZWN0ICpnZXRpbml0YXJncywgKmdldHN0YXRlOwogCi0JdG1wID0gUHlUdXBsZV9OZXcoMCk7Ci0JaWYgKHRtcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB0bXAgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZ2V0aW5pdGFyZ3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJfX2dldGluaXRhcmdzX18iKTsKLQlpZiAoZ2V0aW5pdGFyZ3MgIT0gTlVMTCkgewotCQlhcmdzID0gUHlPYmplY3RfQ2FsbE9iamVjdChnZXRpbml0YXJncywgdG1wKTsKLQkJUHlfREVDUkVGKGdldGluaXRhcmdzKTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHRtcCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJYXJncyA9IHRtcDsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCX0KKyAgICBnZXRpbml0YXJncyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZiwgIl9fZ2V0aW5pdGFyZ3NfXyIpOworICAgIGlmIChnZXRpbml0YXJncyAhPSBOVUxMKSB7CisgICAgICAgIGFyZ3MgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGdldGluaXRhcmdzLCB0bXApOworICAgICAgICBQeV9ERUNSRUYoZ2V0aW5pdGFyZ3MpOworICAgICAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBhcmdzID0gdG1wOworICAgICAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgfQogCi0JZ2V0c3RhdGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJfX2dldHN0YXRlX18iKTsKLQlpZiAoZ2V0c3RhdGUgIT0gTlVMTCkgewotCQlzdGF0ZSA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZ2V0c3RhdGUsIHRtcCk7Ci0JCVB5X0RFQ1JFRihnZXRzdGF0ZSk7Ci0JCWlmIChzdGF0ZSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYXJncyk7Ci0JCQlQeV9ERUNSRUYodG1wKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqKmRpY3RwdHI7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXN0YXRlID0gUHlfTm9uZTsKLQkJZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKHNlbGYpOwotCQlpZiAoZGljdHB0ciAmJiAqZGljdHB0ciAmJiBQeURpY3RfU2l6ZSgqZGljdHB0cikpCi0JCQlzdGF0ZSA9ICpkaWN0cHRyOwotCQlQeV9JTkNSRUYoc3RhdGUpOwotCX0KKyAgICBnZXRzdGF0ZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZiwgIl9fZ2V0c3RhdGVfXyIpOworICAgIGlmIChnZXRzdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXRlID0gUHlPYmplY3RfQ2FsbE9iamVjdChnZXRzdGF0ZSwgdG1wKTsKKyAgICAgICAgUHlfREVDUkVGKGdldHN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICoqZGljdHB0cjsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgc3RhdGUgPSBQeV9Ob25lOworICAgICAgICBkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoc2VsZik7CisgICAgICAgIGlmIChkaWN0cHRyICYmICpkaWN0cHRyICYmIFB5RGljdF9TaXplKCpkaWN0cHRyKSkKKyAgICAgICAgICAgIHN0YXRlID0gKmRpY3RwdHI7CisgICAgICAgIFB5X0lOQ1JFRihzdGF0ZSk7CisgICAgfQogCi0JUHlfREVDUkVGKHRtcCk7CisgICAgUHlfREVDUkVGKHRtcCk7CiAKLQlpZiAoc3RhdGUgPT0gUHlfTm9uZSkgewotCQlQeV9ERUNSRUYoc3RhdGUpOwotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIGFyZ3MpOwotCX0KLQllbHNlCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoT05OKSIsIFB5X1RZUEUoc2VsZiksIGFyZ3MsIHN0YXRlKTsKKyAgICBpZiAoc3RhdGUgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9ERUNSRUYoc3RhdGUpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIGFyZ3MpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT05OKSIsIFB5X1RZUEUoc2VsZiksIGFyZ3MsIHN0YXRlKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHR6aW5mb19tZXRob2RzW10gPSB7CiAKLQl7InR6bmFtZSIsCShQeUNGdW5jdGlvbil0emluZm9fdHpuYW1lLAkJTUVUSF9PLAotCSBQeURvY19TVFIoImRhdGV0aW1lIC0+IHN0cmluZyBuYW1lIG9mIHRpbWUgem9uZS4iKX0sCisgICAgeyJ0em5hbWUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pdHppbmZvX3R6bmFtZSwgICAgICAgICAgICAgTUVUSF9PLAorICAgICBQeURvY19TVFIoImRhdGV0aW1lIC0+IHN0cmluZyBuYW1lIG9mIHRpbWUgem9uZS4iKX0sCiAKLQl7InV0Y29mZnNldCIsCShQeUNGdW5jdGlvbil0emluZm9fdXRjb2Zmc2V0LAkJTUVUSF9PLAotCSBQeURvY19TVFIoImRhdGV0aW1lIC0+IG1pbnV0ZXMgZWFzdCBvZiBVVEMgKG5lZ2F0aXZlIGZvciAiCi0JIAkgICAid2VzdCBvZiBVVEMpLiIpfSwKKyAgICB7InV0Y29mZnNldCIsICAgICAgIChQeUNGdW5jdGlvbil0emluZm9fdXRjb2Zmc2V0LCAgICAgICAgICBNRVRIX08sCisgICAgIFB5RG9jX1NUUigiZGF0ZXRpbWUgLT4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgZm9yICIKKyAgICAgICAgICAgICAgICJ3ZXN0IG9mIFVUQykuIil9LAogCi0JeyJkc3QiLAkJKFB5Q0Z1bmN0aW9uKXR6aW5mb19kc3QsCQlNRVRIX08sCi0JIFB5RG9jX1NUUigiZGF0ZXRpbWUgLT4gRFNUIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDLiIpfSwKKyAgICB7ImRzdCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0emluZm9fZHN0LCAgICAgICAgICAgICAgICBNRVRIX08sCisgICAgIFB5RG9jX1NUUigiZGF0ZXRpbWUgLT4gRFNUIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDLiIpfSwKIAotCXsiZnJvbXV0YyIsCShQeUNGdW5jdGlvbil0emluZm9fZnJvbXV0YywJCU1FVEhfTywKLQkgUHlEb2NfU1RSKCJkYXRldGltZSBpbiBVVEMgLT4gZGF0ZXRpbWUgaW4gbG9jYWwgdGltZS4iKX0sCisgICAgeyJmcm9tdXRjIiwgICAgICAgICAoUHlDRnVuY3Rpb24pdHppbmZvX2Zyb211dGMsICAgICAgICAgICAgTUVUSF9PLAorICAgICBQeURvY19TVFIoImRhdGV0aW1lIGluIFVUQyAtPiBkYXRldGltZSBpbiBsb2NhbCB0aW1lLiIpfSwKIAotCXsiX19yZWR1Y2VfXyIsICAoUHlDRnVuY3Rpb24pdHppbmZvX3JlZHVjZSwgICAgICAgICAgICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiLT4gKGNscywgc3RhdGUpIil9LAorICAgIHsiX19yZWR1Y2VfXyIsICAoUHlDRnVuY3Rpb24pdHppbmZvX3JlZHVjZSwgICAgICAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiLT4gKGNscywgc3RhdGUpIil9LAogCi0Je05VTEwsIE5VTEx9CisgICAge05VTEwsIE5VTEx9CiB9OwogCiBzdGF0aWMgY2hhciB0emluZm9fZG9jW10gPQogUHlEb2NfU1RSKCJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aW1lIHpvbmUgaW5mbyBvYmplY3RzLiIpOwogCiBzdGF0aWNoZXJlIFB5VHlwZU9iamVjdCBQeURhdGVUaW1lX1RaSW5mb1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwJCQkJCS8qIG9iX3NpemUgKi8KLQkiZGF0ZXRpbWUudHppbmZvIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5RGF0ZVRpbWVfVFpJbmZvKSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLSAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwJCQkvKiB0cF9mbGFncyAqLwotCXR6aW5mb19kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JdHppbmZvX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAiZGF0ZXRpbWUudHppbmZvIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlEYXRlVGltZV9UWkluZm8pLCAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgdHppbmZvX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHR6aW5mb19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyoKQEAgLTMwODgsNDMgKzMwODgsNDMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2hvdXIoUHlEYXRlVGltZV9UaW1lICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUVfR0VUX0hPVVIoc2VsZikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1FX0dFVF9IT1VSKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfbWludXRlKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgdm9pZCAqdW51c2VkKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1FX0dFVF9NSU5VVEUoc2VsZikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1FX0dFVF9NSU5VVEUoc2VsZikpOwogfQogCiAvKiBUaGUgbmFtZSB0aW1lX3NlY29uZCBjb25mbGljdGVkIHdpdGggc29tZSBwbGF0Zm9ybSBoZWFkZXIgZmlsZS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBweV90aW1lX3NlY29uZChQeURhdGVUaW1lX1RpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNRV9HRVRfU0VDT05EKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNRV9HRVRfU0VDT05EKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfbWljcm9zZWNvbmQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV90emluZm8oUHlEYXRlVGltZV9UaW1lICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmU7Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgdGltZV9nZXRzZXRbXSA9IHsKLQl7ImhvdXIiLCAgICAgICAgKGdldHRlcil0aW1lX2hvdXJ9LAotCXsibWludXRlIiwgICAgICAoZ2V0dGVyKXRpbWVfbWludXRlfSwKLQl7InNlY29uZCIsICAgICAgKGdldHRlcilweV90aW1lX3NlY29uZH0sCi0JeyJtaWNyb3NlY29uZCIsIChnZXR0ZXIpdGltZV9taWNyb3NlY29uZH0sCi0JeyJ0emluZm8iLAkoZ2V0dGVyKXRpbWVfdHppbmZvfSwKLQl7TlVMTH0KKyAgICB7ImhvdXIiLCAgICAgICAgKGdldHRlcil0aW1lX2hvdXJ9LAorICAgIHsibWludXRlIiwgICAgICAoZ2V0dGVyKXRpbWVfbWludXRlfSwKKyAgICB7InNlY29uZCIsICAgICAgKGdldHRlcilweV90aW1lX3NlY29uZH0sCisgICAgeyJtaWNyb3NlY29uZCIsIChnZXR0ZXIpdGltZV9taWNyb3NlY29uZH0sCisgICAgeyJ0emluZm8iLCAgICAgICAgICAoZ2V0dGVyKXRpbWVfdHppbmZvfSwKKyAgICB7TlVMTH0KIH07CiAKIC8qCkBAIC0zMTMyLDY0ICszMTMyLDY0IEBACiAgKi8KIAogc3RhdGljIGNoYXIgKnRpbWVfa3dzW10gPSB7ImhvdXIiLCAibWludXRlIiwgInNlY29uZCIsICJtaWNyb3NlY29uZCIsCi0JCQkgICAidHppbmZvIiwgTlVMTH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAidHppbmZvIiwgTlVMTH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnNlbGYgPSBOVUxMOwotCVB5T2JqZWN0ICpzdGF0ZTsKLQlpbnQgaG91ciA9IDA7Ci0JaW50IG1pbnV0ZSA9IDA7Ci0JaW50IHNlY29uZCA9IDA7Ci0JaW50IHVzZWNvbmQgPSAwOwotCVB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOworICAgIFB5T2JqZWN0ICpzZWxmID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RhdGU7CisgICAgaW50IGhvdXIgPSAwOworICAgIGludCBtaW51dGUgPSAwOworICAgIGludCBzZWNvbmQgPSAwOworICAgIGludCB1c2Vjb25kID0gMDsKKyAgICBQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKIAotCS8qIENoZWNrIGZvciBpbnZvY2F0aW9uIGZyb20gcGlja2xlIHdpdGggX19nZXRzdGF0ZV9fIHN0YXRlICovCi0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPj0gMSAmJgotCSAgICBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDw9IDIgJiYKLQkgICAgUHlTdHJpbmdfQ2hlY2soc3RhdGUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSAmJgotCSAgICBQeVN0cmluZ19HRVRfU0laRShzdGF0ZSkgPT0gX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSAmJgotCSAgICAoKHVuc2lnbmVkIGNoYXIpIChQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpWzBdKSkgPCAyNCkKLQl7Ci0JCVB5RGF0ZVRpbWVfVGltZSAqbWU7Ci0JCWNoYXIgYXdhcmU7CisgICAgLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA+PSAxICYmCisgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPD0gMiAmJgorICAgICAgICBQeVN0cmluZ19DaGVjayhzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpICYmCisgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHN0YXRlKSA9PSBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFICYmCisgICAgICAgICgodW5zaWduZWQgY2hhcikgKFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSlbMF0pKSA8IDI0KQorICAgIHsKKyAgICAgICAgUHlEYXRlVGltZV9UaW1lICptZTsKKyAgICAgICAgY2hhciBhd2FyZTsKIAotCQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAyKSB7Ci0JCQl0emluZm8gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOwotCQkJaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgIgotCQkJCQkidHppbmZvIHN0YXRlIGFyZyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCWF3YXJlID0gKGNoYXIpKHR6aW5mbyAhPSBQeV9Ob25lKTsKLQkJbWUgPSAoUHlEYXRlVGltZV9UaW1lICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCBhd2FyZSkpOwotCQlpZiAobWUgIT0gTlVMTCkgewotCQkJY2hhciAqcGRhdGEgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpOworICAgICAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAyKSB7CisgICAgICAgICAgICB0emluZm8gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOworICAgICAgICAgICAgaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgIgorICAgICAgICAgICAgICAgICAgICAidHppbmZvIHN0YXRlIGFyZyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF3YXJlID0gKGNoYXIpKHR6aW5mbyAhPSBQeV9Ob25lKTsKKyAgICAgICAgbWUgPSAoUHlEYXRlVGltZV9UaW1lICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCBhd2FyZSkpOworICAgICAgICBpZiAobWUgIT0gTlVMTCkgeworICAgICAgICAgICAgY2hhciAqcGRhdGEgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpOwogCi0JCQltZW1jcHkobWUtPmRhdGEsIHBkYXRhLCBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKLQkJCW1lLT5oYXNoY29kZSA9IC0xOwotCQkJbWUtPmhhc3R6aW5mbyA9IGF3YXJlOwotCQkJaWYgKGF3YXJlKSB7Ci0JCQkJUHlfSU5DUkVGKHR6aW5mbyk7Ci0JCQkJbWUtPnR6aW5mbyA9IHR6aW5mbzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopbWU7Ci0JfQorICAgICAgICAgICAgbWVtY3B5KG1lLT5kYXRhLCBwZGF0YSwgX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSk7CisgICAgICAgICAgICBtZS0+aGFzaGNvZGUgPSAtMTsKKyAgICAgICAgICAgIG1lLT5oYXN0emluZm8gPSBhd2FyZTsKKyAgICAgICAgICAgIGlmIChhd2FyZSkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0emluZm8pOworICAgICAgICAgICAgICAgIG1lLT50emluZm8gPSB0emluZm87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW1lOworICAgIH0KIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpaU8iLCB0aW1lX2t3cywKLQkJCQkJJmhvdXIsICZtaW51dGUsICZzZWNvbmQsICZ1c2Vjb25kLAotCQkJCQkmdHppbmZvKSkgewotCQlpZiAoY2hlY2tfdGltZV9hcmdzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlzZWxmID0gbmV3X3RpbWVfZXgoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsIHR6aW5mbywKLQkJCQkgICB0eXBlKTsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpTyIsIHRpbWVfa3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvdXIsICZtaW51dGUsICZzZWNvbmQsICZ1c2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR6aW5mbykpIHsKKyAgICAgICAgaWYgKGNoZWNrX3RpbWVfYXJncyhob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc2VsZiA9IG5ld190aW1lX2V4KGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCB0emluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIC8qCkBAIC0zMTk5LDEwICszMTk5LDEwIEBACiBzdGF0aWMgdm9pZAogdGltZV9kZWFsbG9jKFB5RGF0ZVRpbWVfVGltZSAqc2VsZikKIHsKLQlpZiAoSEFTVFpJTkZPKHNlbGYpKSB7Ci0JCVB5X1hERUNSRUYoc2VsZi0+dHppbmZvKTsKLQl9Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoSEFTVFpJTkZPKHNlbGYpKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+dHppbmZvKTsKKyAgICB9CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogLyoKQEAgLTMyMTIsMjAgKzMyMTIsMjAgQEAKIC8qIFRoZXNlIGFyZSBhbGwgTUVUSF9OT0FSR1MsIHNvIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIGFyZ2xpc3QuICovCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV91dGNvZmZzZXQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7Ci0JcmV0dXJuIG9mZnNldF9hc190aW1lZGVsdGEoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKLQkJCQkgICAidXRjb2Zmc2V0IiwgUHlfTm9uZSk7CisgICAgcmV0dXJuIG9mZnNldF9hc190aW1lZGVsdGEoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXRjb2Zmc2V0IiwgUHlfTm9uZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2RzdChQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpIHsKLQlyZXR1cm4gb2Zmc2V0X2FzX3RpbWVkZWx0YShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAotCQkJCSAgICJkc3QiLCBQeV9Ob25lKTsKKyAgICByZXR1cm4gb2Zmc2V0X2FzX3RpbWVkZWx0YShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc3QiLCBQeV9Ob25lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfdHpuYW1lKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewotCXJldHVybiBjYWxsX3R6bmFtZShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAotCQkJICAgUHlfTm9uZSk7CisgICAgcmV0dXJuIGNhbGxfdHpuYW1lKEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpOwogfQogCiAvKgpAQCAtMzIzNSw5NCArMzIzNSw5NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfcmVwcihQeURhdGVUaW1lX1RpbWUgKnNlbGYpCiB7Ci0JY2hhciBidWZmZXJbMTAwXTsKLQljb25zdCBjaGFyICp0eXBlX25hbWUgPSBQeV9UWVBFKHNlbGYpLT50cF9uYW1lOwotCWludCBoID0gVElNRV9HRVRfSE9VUihzZWxmKTsKLQlpbnQgbSA9IFRJTUVfR0VUX01JTlVURShzZWxmKTsKLQlpbnQgcyA9IFRJTUVfR0VUX1NFQ09ORChzZWxmKTsKLQlpbnQgdXMgPSBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBjaGFyIGJ1ZmZlclsxMDBdOworICAgIGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IFB5X1RZUEUoc2VsZiktPnRwX25hbWU7CisgICAgaW50IGggPSBUSU1FX0dFVF9IT1VSKHNlbGYpOworICAgIGludCBtID0gVElNRV9HRVRfTUlOVVRFKHNlbGYpOworICAgIGludCBzID0gVElNRV9HRVRfU0VDT05EKHNlbGYpOworICAgIGludCB1cyA9IFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JaWYgKHVzKQotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQpIiwgdHlwZV9uYW1lLCBoLCBtLCBzLCB1cyk7Ci0JZWxzZSBpZiAocykKLQkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJICAgICAgIiVzKCVkLCAlZCwgJWQpIiwgdHlwZV9uYW1lLCBoLCBtLCBzKTsKLQllbHNlCi0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICIlcyglZCwgJWQpIiwgdHlwZV9uYW1lLCBoLCBtKTsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7Ci0JaWYgKHJlc3VsdCAhPSBOVUxMICYmIEhBU1RaSU5GTyhzZWxmKSkKLQkJcmVzdWx0ID0gYXBwZW5kX2tleXdvcmRfdHppbmZvKHJlc3VsdCwgc2VsZi0+dHppbmZvKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICh1cykKKyAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICIlcyglZCwgJWQsICVkLCAlZCkiLCB0eXBlX25hbWUsIGgsIG0sIHMsIHVzKTsKKyAgICBlbHNlIGlmIChzKQorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkLCAlZCwgJWQpIiwgdHlwZV9uYW1lLCBoLCBtLCBzKTsKKyAgICBlbHNlCisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQsICVkKSIsIHR5cGVfbmFtZSwgaCwgbSk7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiBIQVNUWklORk8oc2VsZikpCisgICAgICAgIHJlc3VsdCA9IGFwcGVuZF9rZXl3b3JkX3R6aW5mbyhyZXN1bHQsIHNlbGYtPnR6aW5mbyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfc3RyKFB5RGF0ZVRpbWVfVGltZSAqc2VsZikKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAiaXNvZm9ybWF0IiwgIigpIik7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopc2VsZiwgImlzb2Zvcm1hdCIsICIoKSIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9pc29mb3JtYXQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCWNoYXIgYnVmWzEwMF07Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQkvKiBSZXVzZSB0aGUgdGltZSBmb3JtYXQgY29kZSBmcm9tIHRoZSBkYXRldGltZSB0eXBlLiAqLwotCVB5RGF0ZVRpbWVfRGF0ZVRpbWUgZGF0ZXRpbWU7Ci0JUHlEYXRlVGltZV9EYXRlVGltZSAqcGRhdGV0aW1lID0gJmRhdGV0aW1lOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAvKiBSZXVzZSB0aGUgdGltZSBmb3JtYXQgY29kZSBmcm9tIHRoZSBkYXRldGltZSB0eXBlLiAqLworICAgIFB5RGF0ZVRpbWVfRGF0ZVRpbWUgZGF0ZXRpbWU7CisgICAgUHlEYXRlVGltZV9EYXRlVGltZSAqcGRhdGV0aW1lID0gJmRhdGV0aW1lOwogCi0JLyogQ29weSBvdmVyIGp1c3QgdGhlIHRpbWUgYnl0ZXMuICovCi0JbWVtY3B5KHBkYXRldGltZS0+ZGF0YSArIF9QeURhdGVUaW1lX0RBVEVfREFUQVNJWkUsCi0JICAgICAgIHNlbGYtPmRhdGEsCi0JICAgICAgIF9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUpOworICAgIC8qIENvcHkgb3ZlciBqdXN0IHRoZSB0aW1lIGJ5dGVzLiAqLworICAgIG1lbWNweShwZGF0ZXRpbWUtPmRhdGEgKyBfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFLAorICAgICAgICAgICBzZWxmLT5kYXRhLAorICAgICAgICAgICBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKIAotCWlzb2Zvcm1hdF90aW1lKHBkYXRldGltZSwgYnVmLCBzaXplb2YoYnVmKSk7Ci0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotCWlmIChyZXN1bHQgPT0gTlVMTCB8fCAhIEhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKLQkJcmV0dXJuIHJlc3VsdDsKKyAgICBpc29mb3JtYXRfdGltZShwZGF0ZXRpbWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwgfHwgISBIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiByZXN1bHQ7CiAKLQkvKiBXZSBuZWVkIHRvIGFwcGVuZCB0aGUgVVRDIG9mZnNldC4gKi8KLQlpZiAoZm9ybWF0X3V0Y29mZnNldChidWYsIHNpemVvZihidWYpLCAiOiIsIHNlbGYtPnR6aW5mbywKLQkJCSAgICAgUHlfTm9uZSkgPCAwKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXN1bHQsIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBXZSBuZWVkIHRvIGFwcGVuZCB0aGUgVVRDIG9mZnNldC4gKi8KKyAgICBpZiAoZm9ybWF0X3V0Y29mZnNldChidWYsIHNpemVvZihidWYpLCAiOiIsIHNlbGYtPnR6aW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnJlc3VsdCwgUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9zdHJmdGltZShQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqdHVwbGU7Ci0JY29uc3QgY2hhciAqZm9ybWF0OwotCVB5X3NzaXplX3QgZm9ybWF0X2xlbjsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZm9ybWF0IiwgTlVMTH07CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqdHVwbGU7CisgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgIFB5X3NzaXplX3QgZm9ybWF0X2xlbjsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZm9ybWF0IiwgTlVMTH07CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJzIzpzdHJmdGltZSIsIGtleXdvcmRzLAotCQkJCQkgICZmb3JtYXQsICZmb3JtYXRfbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAicyM6c3RyZnRpbWUiLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwgJmZvcm1hdF9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFB5dGhvbidzIHN0cmZ0aW1lIGRvZXMgaW5zYW5lIHRoaW5ncyB3aXRoIHRoZSB5ZWFyIHBhcnQgb2YgdGhlCi0JICogdGltZXR1cGxlLiAgVGhlIHllYXIgaXMgZm9yY2VkIHRvICh0aGUgb3RoZXJ3aXNlIG5vbnNlbnNpY2FsKQotCSAqIDE5MDAgdG8gd29ybSBhcm91bmQgdGhhdC4KLQkgKi8KLQl0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaWlpaWlpaSIsCi0JCSAgICAgICAgICAgICAgMTkwMCwgMSwgMSwgLyogeWVhciwgbW9udGgsIGRheSAqLwotCQkJICAgICAgVElNRV9HRVRfSE9VUihzZWxmKSwKLQkJCSAgICAgIFRJTUVfR0VUX01JTlVURShzZWxmKSwKLQkJCSAgICAgIFRJTUVfR0VUX1NFQ09ORChzZWxmKSwKLQkJCSAgICAgIDAsIDEsIC0xKTsgLyogd2Vla2RheSwgZGF5bnVtLCBkc3QgKi8KLQlpZiAodHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5VHVwbGVfU2l6ZSh0dXBsZSkgPT0gOSk7Ci0JcmVzdWx0ID0gd3JhcF9zdHJmdGltZSgoUHlPYmplY3QgKilzZWxmLCBmb3JtYXQsIGZvcm1hdF9sZW4sIHR1cGxlLAotCQkJICAgICAgIFB5X05vbmUpOwotCVB5X0RFQ1JFRih0dXBsZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBQeXRob24ncyBzdHJmdGltZSBkb2VzIGluc2FuZSB0aGluZ3Mgd2l0aCB0aGUgeWVhciBwYXJ0IG9mIHRoZQorICAgICAqIHRpbWV0dXBsZS4gIFRoZSB5ZWFyIGlzIGZvcmNlZCB0byAodGhlIG90aGVyd2lzZSBub25zZW5zaWNhbCkKKyAgICAgKiAxOTAwIHRvIHdvcm0gYXJvdW5kIHRoYXQuCisgICAgICovCisgICAgdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWlpaWlpaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxOTAwLCAxLCAxLCAvKiB5ZWFyLCBtb250aCwgZGF5ICovCisgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9IT1VSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlOVVRFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgMCwgMSwgLTEpOyAvKiB3ZWVrZGF5LCBkYXludW0sIGRzdCAqLworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlUdXBsZV9TaXplKHR1cGxlKSA9PSA5KTsKKyAgICByZXN1bHQgPSB3cmFwX3N0cmZ0aW1lKChQeU9iamVjdCAqKXNlbGYsIGZvcm1hdCwgZm9ybWF0X2xlbiwgdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qCkBAIC0zMzM2LDE0NiArMzMzNiwxNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3JpY2hjb21wYXJlKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgUHlPYmplY3QgKm90aGVyLCBpbnQgb3ApCiB7Ci0JaW50IGRpZmY7Ci0JbmFpdmV0eSBuMSwgbjI7Ci0JaW50IG9mZnNldDEsIG9mZnNldDI7CisgICAgaW50IGRpZmY7CisgICAgbmFpdmV0eSBuMSwgbjI7CisgICAgaW50IG9mZnNldDEsIG9mZnNldDI7CiAKLQlpZiAoISBQeVRpbWVfQ2hlY2sob3RoZXIpKSB7Ci0JCWlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkgewotCQkJUHlPYmplY3QgKnJlc3VsdCA9IG9wID09IFB5X0VRID8gUHlfRmFsc2UgOiBQeV9UcnVlOwotCQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCS8qIFN0b3AgdGhpcyBmcm9tIGZhbGxpbmcgYmFjayB0byBhZGRyZXNzIGNvbXBhcmlzb24uICovCi0JCXJldHVybiBjbXBlcnJvcigoUHlPYmplY3QgKilzZWxmLCBvdGhlcik7Ci0JfQotCWlmIChjbGFzc2lmeV90d29fdXRjb2Zmc2V0cygoUHlPYmplY3QgKilzZWxmLCAmb2Zmc2V0MSwgJm4xLCBQeV9Ob25lLAotCQkJCSAgICAgb3RoZXIsICZvZmZzZXQyLCAmbjIsIFB5X05vbmUpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KG4xICE9IE9GRlNFVF9VTktOT1dOICYmIG4yICE9IE9GRlNFVF9VTktOT1dOKTsKLQkvKiBJZiB0aGV5J3JlIGJvdGggbmFpdmUsIG9yIGJvdGggYXdhcmUgYW5kIGhhdmUgdGhlIHNhbWUgb2Zmc2V0cywKLQkgKiB3ZSBnZXQgb2ZmIGNoZWFwLiAgTm90ZSB0aGF0IGlmIHRoZXkncmUgYm90aCBuYWl2ZSwgb2Zmc2V0MSA9PQotCSAqIG9mZnNldDIgPT0gMCBhdCB0aGlzIHBvaW50LgotCSAqLwotCWlmIChuMSA9PSBuMiAmJiBvZmZzZXQxID09IG9mZnNldDIpIHsKLQkJZGlmZiA9IG1lbWNtcChzZWxmLT5kYXRhLCAoKFB5RGF0ZVRpbWVfVGltZSAqKW90aGVyKS0+ZGF0YSwKLQkJCSAgICAgIF9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUpOwotCQlyZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKLQl9CisgICAgaWYgKCEgUHlUaW1lX0NoZWNrKG90aGVyKSkgeworICAgICAgICBpZiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBvcCA9PSBQeV9FUSA/IFB5X0ZhbHNlIDogUHlfVHJ1ZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAvKiBTdG9wIHRoaXMgZnJvbSBmYWxsaW5nIGJhY2sgdG8gYWRkcmVzcyBjb21wYXJpc29uLiAqLworICAgICAgICByZXR1cm4gY21wZXJyb3IoKFB5T2JqZWN0ICopc2VsZiwgb3RoZXIpOworICAgIH0KKyAgICBpZiAoY2xhc3NpZnlfdHdvX3V0Y29mZnNldHMoKFB5T2JqZWN0ICopc2VsZiwgJm9mZnNldDEsICZuMSwgUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLCAmb2Zmc2V0MiwgJm4yLCBQeV9Ob25lKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChuMSAhPSBPRkZTRVRfVU5LTk9XTiAmJiBuMiAhPSBPRkZTRVRfVU5LTk9XTik7CisgICAgLyogSWYgdGhleSdyZSBib3RoIG5haXZlLCBvciBib3RoIGF3YXJlIGFuZCBoYXZlIHRoZSBzYW1lIG9mZnNldHMsCisgICAgICogd2UgZ2V0IG9mZiBjaGVhcC4gIE5vdGUgdGhhdCBpZiB0aGV5J3JlIGJvdGggbmFpdmUsIG9mZnNldDEgPT0KKyAgICAgKiBvZmZzZXQyID09IDAgYXQgdGhpcyBwb2ludC4KKyAgICAgKi8KKyAgICBpZiAobjEgPT0gbjIgJiYgb2Zmc2V0MSA9PSBvZmZzZXQyKSB7CisgICAgICAgIGRpZmYgPSBtZW1jbXAoc2VsZi0+ZGF0YSwgKChQeURhdGVUaW1lX1RpbWUgKilvdGhlciktPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSk7CisgICAgICAgIHJldHVybiBkaWZmX3RvX2Jvb2woZGlmZiwgb3ApOworICAgIH0KIAotCWlmIChuMSA9PSBPRkZTRVRfQVdBUkUgJiYgbjIgPT0gT0ZGU0VUX0FXQVJFKSB7Ci0JCWFzc2VydChvZmZzZXQxICE9IG9mZnNldDIpOwkvKiBlbHNlIGxhc3QgImlmIiBoYW5kbGVkIGl0ICovCi0JCS8qIENvbnZlcnQgZXZlcnl0aGluZyBleGNlcHQgbWljcm9zZWNvbmRzIHRvIHNlY29uZHMuICBUaGVzZQotCQkgKiBjYW4ndCBvdmVyZmxvdyAobm8gbW9yZSB0aGFuIHRoZSAjIG9mIHNlY29uZHMgaW4gMiBkYXlzKS4KLQkJICovCi0JCW9mZnNldDEgPSBUSU1FX0dFVF9IT1VSKHNlbGYpICogMzYwMCArCi0JCQkgIChUSU1FX0dFVF9NSU5VVEUoc2VsZikgLSBvZmZzZXQxKSAqIDYwICsKLQkJCSAgVElNRV9HRVRfU0VDT05EKHNlbGYpOwotCQlvZmZzZXQyID0gVElNRV9HRVRfSE9VUihvdGhlcikgKiAzNjAwICsKLQkJCSAgKFRJTUVfR0VUX01JTlVURShvdGhlcikgLSBvZmZzZXQyKSAqIDYwICsKLQkJCSAgVElNRV9HRVRfU0VDT05EKG90aGVyKTsKLQkJZGlmZiA9IG9mZnNldDEgLSBvZmZzZXQyOwotCQlpZiAoZGlmZiA9PSAwKQotCQkJZGlmZiA9IFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpIC0KLQkJCSAgICAgICBUSU1FX0dFVF9NSUNST1NFQ09ORChvdGhlcik7Ci0JCXJldHVybiBkaWZmX3RvX2Jvb2woZGlmZiwgb3ApOwotCX0KKyAgICBpZiAobjEgPT0gT0ZGU0VUX0FXQVJFICYmIG4yID09IE9GRlNFVF9BV0FSRSkgeworICAgICAgICBhc3NlcnQob2Zmc2V0MSAhPSBvZmZzZXQyKTsgICAgICAgICAgICAgLyogZWxzZSBsYXN0ICJpZiIgaGFuZGxlZCBpdCAqLworICAgICAgICAvKiBDb252ZXJ0IGV2ZXJ5dGhpbmcgZXhjZXB0IG1pY3Jvc2Vjb25kcyB0byBzZWNvbmRzLiAgVGhlc2UKKyAgICAgICAgICogY2FuJ3Qgb3ZlcmZsb3cgKG5vIG1vcmUgdGhhbiB0aGUgIyBvZiBzZWNvbmRzIGluIDIgZGF5cykuCisgICAgICAgICAqLworICAgICAgICBvZmZzZXQxID0gVElNRV9HRVRfSE9VUihzZWxmKSAqIDM2MDAgKworICAgICAgICAgICAgICAgICAgKFRJTUVfR0VUX01JTlVURShzZWxmKSAtIG9mZnNldDEpICogNjAgKworICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpOworICAgICAgICBvZmZzZXQyID0gVElNRV9HRVRfSE9VUihvdGhlcikgKiAzNjAwICsKKyAgICAgICAgICAgICAgICAgIChUSU1FX0dFVF9NSU5VVEUob3RoZXIpIC0gb2Zmc2V0MikgKiA2MCArCisgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQob3RoZXIpOworICAgICAgICBkaWZmID0gb2Zmc2V0MSAtIG9mZnNldDI7CisgICAgICAgIGlmIChkaWZmID09IDApCisgICAgICAgICAgICBkaWZmID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZikgLQorICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JQ1JPU0VDT05EKG90aGVyKTsKKyAgICAgICAgcmV0dXJuIGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7CisgICAgfQogCi0JYXNzZXJ0KG4xICE9IG4yKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImNhbid0IGNvbXBhcmUgb2Zmc2V0LW5haXZlIGFuZCAiCi0JCQkib2Zmc2V0LWF3YXJlIHRpbWVzIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KG4xICE9IG4yKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgIm9mZnNldC1hd2FyZSB0aW1lcyIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgbG9uZwogdGltZV9oYXNoKFB5RGF0ZVRpbWVfVGltZSAqc2VsZikKIHsKLQlpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKLQkJbmFpdmV0eSBuOwotCQlpbnQgb2Zmc2V0OwotCQlQeU9iamVjdCAqdGVtcDsKKyAgICBpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKKyAgICAgICAgbmFpdmV0eSBuOworICAgICAgICBpbnQgb2Zmc2V0OworICAgICAgICBQeU9iamVjdCAqdGVtcDsKIAotCQluID0gY2xhc3NpZnlfdXRjb2Zmc2V0KChQeU9iamVjdCAqKXNlbGYsIFB5X05vbmUsICZvZmZzZXQpOwotCQlhc3NlcnQobiAhPSBPRkZTRVRfVU5LTk9XTik7Ci0JCWlmIChuID09IE9GRlNFVF9FUlJPUikKLQkJCXJldHVybiAtMTsKKyAgICAgICAgbiA9IGNsYXNzaWZ5X3V0Y29mZnNldCgoUHlPYmplY3QgKilzZWxmLCBQeV9Ob25lLCAmb2Zmc2V0KTsKKyAgICAgICAgYXNzZXJ0KG4gIT0gT0ZGU0VUX1VOS05PV04pOworICAgICAgICBpZiAobiA9PSBPRkZTRVRfRVJST1IpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJLyogUmVkdWNlIHRoaXMgdG8gYSBoYXNoIG9mIGFub3RoZXIgb2JqZWN0LiAqLwotCQlpZiAob2Zmc2V0ID09IDApCi0JCQl0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5kYXRhLAotCQkJCQkJX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSk7Ci0JCWVsc2UgewotCQkJaW50IGhvdXI7Ci0JCQlpbnQgbWludXRlOworICAgICAgICAvKiBSZWR1Y2UgdGhpcyB0byBhIGhhc2ggb2YgYW5vdGhlciBvYmplY3QuICovCisgICAgICAgIGlmIChvZmZzZXQgPT0gMCkKKyAgICAgICAgICAgIHRlbXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgaG91cjsKKyAgICAgICAgICAgIGludCBtaW51dGU7CiAKLQkJCWFzc2VydChuID09IE9GRlNFVF9BV0FSRSk7Ci0JCQlhc3NlcnQoSEFTVFpJTkZPKHNlbGYpKTsKLQkJCWhvdXIgPSBkaXZtb2QoVElNRV9HRVRfSE9VUihzZWxmKSAqIDYwICsKLQkJCQkJVElNRV9HRVRfTUlOVVRFKHNlbGYpIC0gb2Zmc2V0LAotCQkJCSAgICAgIDYwLAotCQkJCSAgICAgICZtaW51dGUpOwotCQkJaWYgKDAgPD0gaG91ciAmJiBob3VyIDwgMjQpCi0JCQkJdGVtcCA9IG5ld190aW1lKGhvdXIsIG1pbnV0ZSwKLQkJCQkJCVRJTUVfR0VUX1NFQ09ORChzZWxmKSwKLQkJCQkJCVRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAotCQkJCQkJUHlfTm9uZSk7Ci0JCQllbHNlCi0JCQkJdGVtcCA9IFB5X0J1aWxkVmFsdWUoImlpaWkiLAotCQkJCQkgICBob3VyLCBtaW51dGUsCi0JCQkJCSAgIFRJTUVfR0VUX1NFQ09ORChzZWxmKSwKLQkJCQkJICAgVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpOwotCQl9Ci0JCWlmICh0ZW1wICE9IE5VTEwpIHsKLQkJCXNlbGYtPmhhc2hjb2RlID0gUHlPYmplY3RfSGFzaCh0ZW1wKTsKLQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJfQotCX0KLQlyZXR1cm4gc2VsZi0+aGFzaGNvZGU7CisgICAgICAgICAgICBhc3NlcnQobiA9PSBPRkZTRVRfQVdBUkUpOworICAgICAgICAgICAgYXNzZXJ0KEhBU1RaSU5GTyhzZWxmKSk7CisgICAgICAgICAgICBob3VyID0gZGl2bW9kKFRJTUVfR0VUX0hPVVIoc2VsZikgKiA2MCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlOVVRFKHNlbGYpIC0gb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICA2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbnV0ZSk7CisgICAgICAgICAgICBpZiAoMCA8PSBob3VyICYmIGhvdXIgPCAyNCkKKyAgICAgICAgICAgICAgICB0ZW1wID0gbmV3X3RpbWUoaG91ciwgbWludXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0ZW1wID0gUHlfQnVpbGRWYWx1ZSgiaWlpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyLCBtaW51dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRlbXAgIT0gTlVMTCkgeworICAgICAgICAgICAgc2VsZi0+aGFzaGNvZGUgPSBQeU9iamVjdF9IYXNoKHRlbXApOworICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZWxmLT5oYXNoY29kZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfcmVwbGFjZShQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmNsb25lOwotCVB5T2JqZWN0ICp0dXBsZTsKLQlpbnQgaGggPSBUSU1FX0dFVF9IT1VSKHNlbGYpOwotCWludCBtbSA9IFRJTUVfR0VUX01JTlVURShzZWxmKTsKLQlpbnQgc3MgPSBUSU1FX0dFVF9TRUNPTkQoc2VsZik7Ci0JaW50IHVzID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7Ci0JUHlPYmplY3QgKnR6aW5mbyA9IEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmU7CisgICAgUHlPYmplY3QgKmNsb25lOworICAgIFB5T2JqZWN0ICp0dXBsZTsKKyAgICBpbnQgaGggPSBUSU1FX0dFVF9IT1VSKHNlbGYpOworICAgIGludCBtbSA9IFRJTUVfR0VUX01JTlVURShzZWxmKTsKKyAgICBpbnQgc3MgPSBUSU1FX0dFVF9TRUNPTkQoc2VsZik7CisgICAgaW50IHVzID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7CisgICAgUHlPYmplY3QgKnR6aW5mbyA9IEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmU7CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpaU86cmVwbGFjZSIsCi0JCQkJCSAgdGltZV9rd3MsCi0JCQkJCSAgJmhoLCAmbW0sICZzcywgJnVzLCAmdHppbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWlpTyIsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8pOwotCWlmICh0dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQljbG9uZSA9IHRpbWVfbmV3KFB5X1RZUEUoc2VsZiksIHR1cGxlLCBOVUxMKTsKLQlQeV9ERUNSRUYodHVwbGUpOwotCXJldHVybiBjbG9uZTsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpaU86cmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfa3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGgsICZtbSwgJnNzLCAmdXMsICZ0emluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaWlPIiwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbyk7CisgICAgaWYgKHR1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNsb25lID0gdGltZV9uZXcoUHlfVFlQRShzZWxmKSwgdHVwbGUsIE5VTEwpOworICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgcmV0dXJuIGNsb25lOwogfQogCiBzdGF0aWMgaW50CiB0aW1lX25vbnplcm8oUHlEYXRlVGltZV9UaW1lICpzZWxmKQogewotCWludCBvZmZzZXQ7Ci0JaW50IG5vbmU7CisgICAgaW50IG9mZnNldDsKKyAgICBpbnQgbm9uZTsKIAotCWlmIChUSU1FX0dFVF9TRUNPTkQoc2VsZikgfHwgVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpIHsKLQkJLyogU2luY2UgdXRjb2Zmc2V0IGlzIGluIHdob2xlIG1pbnV0ZXMsIG5vdGhpbmcgY2FuCi0JCSAqIGFsdGVyIHRoZSBjb25jbHVzaW9uIHRoYXQgdGhpcyBpcyBub256ZXJvLgotCQkgKi8KLQkJcmV0dXJuIDE7Ci0JfQotCW9mZnNldCA9IDA7Ci0JaWYgKEhBU1RaSU5GTyhzZWxmKSAmJiBzZWxmLT50emluZm8gIT0gUHlfTm9uZSkgewotCQlvZmZzZXQgPSBjYWxsX3V0Y29mZnNldChzZWxmLT50emluZm8sIFB5X05vbmUsICZub25lKTsKLQkJaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gKFRJTUVfR0VUX01JTlVURShzZWxmKSAtIG9mZnNldCArIFRJTUVfR0VUX0hPVVIoc2VsZikqNjApICE9IDA7CisgICAgaWYgKFRJTUVfR0VUX1NFQ09ORChzZWxmKSB8fCBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKSkgeworICAgICAgICAvKiBTaW5jZSB1dGNvZmZzZXQgaXMgaW4gd2hvbGUgbWludXRlcywgbm90aGluZyBjYW4KKyAgICAgICAgICogYWx0ZXIgdGhlIGNvbmNsdXNpb24gdGhhdCB0aGlzIGlzIG5vbnplcm8uCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgb2Zmc2V0ID0gMDsKKyAgICBpZiAoSEFTVFpJTkZPKHNlbGYpICYmIHNlbGYtPnR6aW5mbyAhPSBQeV9Ob25lKSB7CisgICAgICAgIG9mZnNldCA9IGNhbGxfdXRjb2Zmc2V0KHNlbGYtPnR6aW5mbywgUHlfTm9uZSwgJm5vbmUpOworICAgICAgICBpZiAob2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAoVElNRV9HRVRfTUlOVVRFKHNlbGYpIC0gb2Zmc2V0ICsgVElNRV9HRVRfSE9VUihzZWxmKSo2MCkgIT0gMDsKIH0KIAogLyogUGlja2xlIHN1cHBvcnQsIGEgc2ltcGxlIHVzZSBvZiBfX3JlZHVjZV9fLiAqLwpAQCAtMzQ4OCw1NSArMzQ4OCw1NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfZ2V0c3RhdGUoUHlEYXRlVGltZV9UaW1lICpzZWxmKQogewotCVB5T2JqZWN0ICpiYXNlc3RhdGU7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmJhc2VzdGF0ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCWJhc2VzdGF0ZSA9ICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCi0JCQkJCQlfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKLQlpZiAoYmFzZXN0YXRlICE9IE5VTEwpIHsKLQkJaWYgKCEgSEFTVFpJTkZPKHNlbGYpIHx8IHNlbGYtPnR6aW5mbyA9PSBQeV9Ob25lKQotCQkJcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDEsIGJhc2VzdGF0ZSk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IFB5VHVwbGVfUGFjaygyLCBiYXNlc3RhdGUsIHNlbGYtPnR6aW5mbyk7Ci0JCVB5X0RFQ1JFRihiYXNlc3RhdGUpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGJhc2VzdGF0ZSA9ICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUpOworICAgIGlmIChiYXNlc3RhdGUgIT0gTlVMTCkgeworICAgICAgICBpZiAoISBIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCisgICAgICAgICAgICByZXN1bHQgPSBQeVR1cGxlX1BhY2soMSwgYmFzZXN0YXRlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDIsIGJhc2VzdGF0ZSwgc2VsZi0+dHppbmZvKTsKKyAgICAgICAgUHlfREVDUkVGKGJhc2VzdGF0ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3JlZHVjZShQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPTikiLCBQeV9UWVBFKHNlbGYpLCB0aW1lX2dldHN0YXRlKHNlbGYpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIHRpbWVfZ2V0c3RhdGUoc2VsZikpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgdGltZV9tZXRob2RzW10gPSB7CiAKLQl7Imlzb2Zvcm1hdCIsICAgKFB5Q0Z1bmN0aW9uKXRpbWVfaXNvZm9ybWF0LAlNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgSEg6TU06U1NbLm1tbW1tbV0iCi0JIAkgICAiWytISDpNTV0uIil9LAorICAgIHsiaXNvZm9ybWF0IiwgICAoUHlDRnVuY3Rpb24pdGltZV9pc29mb3JtYXQsICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgSEg6TU06U1NbLm1tbW1tbV0iCisgICAgICAgICAgICAgICAiWytISDpNTV0uIil9LAogCi0JeyJzdHJmdGltZSIsICAgCShQeUNGdW5jdGlvbil0aW1lX3N0cmZ0aW1lLAlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCSBQeURvY19TVFIoImZvcm1hdCAtPiBzdHJmdGltZSgpIHN0eWxlIHN0cmluZy4iKX0sCisgICAgeyJzdHJmdGltZSIsICAgICAgICAoUHlDRnVuY3Rpb24pdGltZV9zdHJmdGltZSwgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgIFB5RG9jX1NUUigiZm9ybWF0IC0+IHN0cmZ0aW1lKCkgc3R5bGUgc3RyaW5nLiIpfSwKIAotCXsiX19mb3JtYXRfXyIsIAkoUHlDRnVuY3Rpb24pZGF0ZV9mb3JtYXQsCU1FVEhfVkFSQVJHUywKLQkgUHlEb2NfU1RSKCJGb3JtYXRzIHNlbGYgd2l0aCBzdHJmdGltZS4iKX0sCisgICAgeyJfX2Zvcm1hdF9fIiwgICAgICAoUHlDRnVuY3Rpb24pZGF0ZV9mb3JtYXQsICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgUHlEb2NfU1RSKCJGb3JtYXRzIHNlbGYgd2l0aCBzdHJmdGltZS4iKX0sCiAKLQl7InV0Y29mZnNldCIsCShQeUNGdW5jdGlvbil0aW1lX3V0Y29mZnNldCwJTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLnV0Y29mZnNldChzZWxmKS4iKX0sCisgICAgeyJ1dGNvZmZzZXQiLCAgICAgICAoUHlDRnVuY3Rpb24pdGltZV91dGNvZmZzZXQsICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby51dGNvZmZzZXQoc2VsZikuIil9LAogCi0JeyJ0em5hbWUiLAkoUHlDRnVuY3Rpb24pdGltZV90em5hbWUsCU1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby50em5hbWUoc2VsZikuIil9LAorICAgIHsidHpuYW1lIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRpbWVfdHpuYW1lLCAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8udHpuYW1lKHNlbGYpLiIpfSwKIAotCXsiZHN0IiwJCShQeUNGdW5jdGlvbil0aW1lX2RzdCwJCU1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby5kc3Qoc2VsZikuIil9LAorICAgIHsiZHN0IiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRpbWVfZHN0LCAgICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8uZHN0KHNlbGYpLiIpfSwKIAotCXsicmVwbGFjZSIsICAgICAoUHlDRnVuY3Rpb24pdGltZV9yZXBsYWNlLAlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCSBQeURvY19TVFIoIlJldHVybiB0aW1lIHdpdGggbmV3IHNwZWNpZmllZCBmaWVsZHMuIil9LAorICAgIHsicmVwbGFjZSIsICAgICAoUHlDRnVuY3Rpb24pdGltZV9yZXBsYWNlLCAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICBQeURvY19TVFIoIlJldHVybiB0aW1lIHdpdGggbmV3IHNwZWNpZmllZCBmaWVsZHMuIil9LAogCi0JeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKXRpbWVfcmVkdWNlLCAgICAgICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiX19yZWR1Y2VfXygpIC0+IChjbHMsIHN0YXRlKSIpfSwKKyAgICB7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pdGltZV9yZWR1Y2UsICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJfX3JlZHVjZV9fKCkgLT4gKGNscywgc3RhdGUpIil9LAogCi0Je05VTEwsCU5VTEx9CisgICAge05VTEwsICAgICAgTlVMTH0KIH07CiAKIHN0YXRpYyBjaGFyIHRpbWVfZG9jW10gPQpAQCAtMzU0Niw2MSArMzU0Niw2MSBAQAogYSB0emluZm8gc3ViY2xhc3MuIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIG1heSBiZSBpbnRzIG9yIGxvbmdzLlxuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgdGltZV9hc19udW1iZXIgPSB7Ci0JMCwJCQkJCS8qIG5iX2FkZCAqLwotCTAsCQkJCQkvKiBuYl9zdWJ0cmFjdCAqLwotCTAsCQkJCQkvKiBuYl9tdWx0aXBseSAqLwotCTAsCQkJCQkvKiBuYl9kaXZpZGUgKi8KLQkwLAkJCQkJLyogbmJfcmVtYWluZGVyICovCi0JMCwJCQkJCS8qIG5iX2Rpdm1vZCAqLwotCTAsCQkJCQkvKiBuYl9wb3dlciAqLwotCTAsCQkJCQkvKiBuYl9uZWdhdGl2ZSAqLwotCTAsCQkJCQkvKiBuYl9wb3NpdGl2ZSAqLwotCTAsCQkJCQkvKiBuYl9hYnNvbHV0ZSAqLwotCShpbnF1aXJ5KXRpbWVfbm9uemVybywJCQkvKiBuYl9ub256ZXJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3N1YnRyYWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9yZW1haW5kZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25lZ2F0aXZlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSl0aW1lX25vbnplcm8sICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25vbnplcm8gKi8KIH07CiAKIHN0YXRpY2hlcmUgUHlUeXBlT2JqZWN0IFB5RGF0ZVRpbWVfVGltZVR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwJCQkJCS8qIG9iX3NpemUgKi8KLQkiZGF0ZXRpbWUudGltZSIsCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeURhdGVUaW1lX1RpbWUpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3IpdGltZV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyl0aW1lX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCSZ0aW1lX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYyl0aW1lX2hhc2gsCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkvKiB0cF9jYWxsICovCi0JKHJlcHJmdW5jKXRpbWVfc3RyLAkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLSAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwJCQkvKiB0cF9mbGFncyAqLwotCXRpbWVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkocmljaGNtcGZ1bmMpdGltZV9yaWNoY29tcGFyZSwJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQl0aW1lX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCXRpbWVfZ2V0c2V0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JdGltZV9hbGxvYywJCQkJLyogdHBfYWxsb2MgKi8KLQl0aW1lX25ldywJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAiZGF0ZXRpbWUudGltZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlEYXRlVGltZV9UaW1lKSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAoZGVzdHJ1Y3Rvcil0aW1lX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXRpbWVfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJnRpbWVfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKXRpbWVfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKXRpbWVfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgdGltZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIChyaWNoY21wZnVuYyl0aW1lX3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHRpbWVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIHRpbWVfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIHRpbWVfYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICB0aW1lX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyoKQEAgLTM2MTQsNDIgKzM2MTQsNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9ob3VyKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfSE9VUihzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKERBVEVfR0VUX0hPVVIoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfbWludXRlKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfTUlOVVRFKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfTUlOVVRFKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3NlY29uZChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKERBVEVfR0VUX1NFQ09ORChzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKERBVEVfR0VUX1NFQ09ORChzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9taWNyb3NlY29uZChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfdHppbmZvKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBkYXRldGltZV9nZXRzZXRbXSA9IHsKLQl7ImhvdXIiLCAgICAgICAgKGdldHRlcilkYXRldGltZV9ob3VyfSwKLQl7Im1pbnV0ZSIsICAgICAgKGdldHRlcilkYXRldGltZV9taW51dGV9LAotCXsic2Vjb25kIiwgICAgICAoZ2V0dGVyKWRhdGV0aW1lX3NlY29uZH0sCi0JeyJtaWNyb3NlY29uZCIsIChnZXR0ZXIpZGF0ZXRpbWVfbWljcm9zZWNvbmR9LAotCXsidHppbmZvIiwJKGdldHRlcilkYXRldGltZV90emluZm99LAotCXtOVUxMfQorICAgIHsiaG91ciIsICAgICAgICAoZ2V0dGVyKWRhdGV0aW1lX2hvdXJ9LAorICAgIHsibWludXRlIiwgICAgICAoZ2V0dGVyKWRhdGV0aW1lX21pbnV0ZX0sCisgICAgeyJzZWNvbmQiLCAgICAgIChnZXR0ZXIpZGF0ZXRpbWVfc2Vjb25kfSwKKyAgICB7Im1pY3Jvc2Vjb25kIiwgKGdldHRlcilkYXRldGltZV9taWNyb3NlY29uZH0sCisgICAgeyJ0emluZm8iLCAgICAgICAgICAoZ2V0dGVyKWRhdGV0aW1lX3R6aW5mb30sCisgICAge05VTEx9CiB9OwogCiAvKgpAQCAtMzY1Nyw3MiArMzY1Nyw3MiBAQAogICovCiAKIHN0YXRpYyBjaGFyICpkYXRldGltZV9rd3NbXSA9IHsKLQkieWVhciIsICJtb250aCIsICJkYXkiLCAiaG91ciIsICJtaW51dGUiLCAic2Vjb25kIiwKLQkibWljcm9zZWNvbmQiLCAidHppbmZvIiwgTlVMTAorICAgICJ5ZWFyIiwgIm1vbnRoIiwgImRheSIsICJob3VyIiwgIm1pbnV0ZSIsICJzZWNvbmQiLAorICAgICJtaWNyb3NlY29uZCIsICJ0emluZm8iLCBOVUxMCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqc2VsZiA9IE5VTEw7Ci0JUHlPYmplY3QgKnN0YXRlOwotCWludCB5ZWFyOwotCWludCBtb250aDsKLQlpbnQgZGF5OwotCWludCBob3VyID0gMDsKLQlpbnQgbWludXRlID0gMDsKLQlpbnQgc2Vjb25kID0gMDsKLQlpbnQgdXNlY29uZCA9IDA7Ci0JUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKnNlbGYgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzdGF0ZTsKKyAgICBpbnQgeWVhcjsKKyAgICBpbnQgbW9udGg7CisgICAgaW50IGRheTsKKyAgICBpbnQgaG91ciA9IDA7CisgICAgaW50IG1pbnV0ZSA9IDA7CisgICAgaW50IHNlY29uZCA9IDA7CisgICAgaW50IHVzZWNvbmQgPSAwOworICAgIFB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOwogCi0JLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA+PSAxICYmCi0JICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPD0gMiAmJgotCSAgICBQeVN0cmluZ19DaGVjayhzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpICYmCi0JICAgIFB5U3RyaW5nX0dFVF9TSVpFKHN0YXRlKSA9PSBfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSAmJgotCSAgICBNT05USF9JU19TQU5FKFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSlbMl0pKQotCXsKLQkJUHlEYXRlVGltZV9EYXRlVGltZSAqbWU7Ci0JCWNoYXIgYXdhcmU7CisgICAgLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA+PSAxICYmCisgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPD0gMiAmJgorICAgICAgICBQeVN0cmluZ19DaGVjayhzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpICYmCisgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHN0YXRlKSA9PSBfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSAmJgorICAgICAgICBNT05USF9JU19TQU5FKFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSlbMl0pKQorICAgIHsKKyAgICAgICAgUHlEYXRlVGltZV9EYXRlVGltZSAqbWU7CisgICAgICAgIGNoYXIgYXdhcmU7CiAKLQkJaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMikgewotCQkJdHppbmZvID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAxKTsKLQkJCWlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkICIKLQkJCQkJInR6aW5mbyBzdGF0ZSBhcmciKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlhd2FyZSA9IChjaGFyKSh0emluZm8gIT0gUHlfTm9uZSk7Ci0JCW1lID0gKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUgLCBhd2FyZSkpOwotCQlpZiAobWUgIT0gTlVMTCkgewotCQkJY2hhciAqcGRhdGEgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpOworICAgICAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAyKSB7CisgICAgICAgICAgICB0emluZm8gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOworICAgICAgICAgICAgaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgIgorICAgICAgICAgICAgICAgICAgICAidHppbmZvIHN0YXRlIGFyZyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF3YXJlID0gKGNoYXIpKHR6aW5mbyAhPSBQeV9Ob25lKTsKKyAgICAgICAgbWUgPSAoUHlEYXRlVGltZV9EYXRlVGltZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSAsIGF3YXJlKSk7CisgICAgICAgIGlmIChtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjaGFyICpwZGF0YSA9IFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSk7CiAKLQkJCW1lbWNweShtZS0+ZGF0YSwgcGRhdGEsIF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFKTsKLQkJCW1lLT5oYXNoY29kZSA9IC0xOwotCQkJbWUtPmhhc3R6aW5mbyA9IGF3YXJlOwotCQkJaWYgKGF3YXJlKSB7Ci0JCQkJUHlfSU5DUkVGKHR6aW5mbyk7Ci0JCQkJbWUtPnR6aW5mbyA9IHR6aW5mbzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopbWU7Ci0JfQorICAgICAgICAgICAgbWVtY3B5KG1lLT5kYXRhLCBwZGF0YSwgX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkUpOworICAgICAgICAgICAgbWUtPmhhc2hjb2RlID0gLTE7CisgICAgICAgICAgICBtZS0+aGFzdHppbmZvID0gYXdhcmU7CisgICAgICAgICAgICBpZiAoYXdhcmUpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodHppbmZvKTsKKyAgICAgICAgICAgICAgICBtZS0+dHppbmZvID0gdHppbmZvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKiltZTsKKyAgICB9CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiaWlpfGlpaWlPIiwgZGF0ZXRpbWVfa3dzLAotCQkJCQkmeWVhciwgJm1vbnRoLCAmZGF5LCAmaG91ciwgJm1pbnV0ZSwKLQkJCQkJJnNlY29uZCwgJnVzZWNvbmQsICZ0emluZm8pKSB7Ci0JCWlmIChjaGVja19kYXRlX2FyZ3MoeWVhciwgbW9udGgsIGRheSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChjaGVja190aW1lX2FyZ3MoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXNlbGYgPSBuZXdfZGF0ZXRpbWVfZXgoeWVhciwgbW9udGgsIGRheSwKLQkJCQkgICAgCWhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLAotCQkJCSAgICAJdHppbmZvLCB0eXBlKTsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgImlpaXxpaWlpTyIsIGRhdGV0aW1lX2t3cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5ZWFyLCAmbW9udGgsICZkYXksICZob3VyLCAmbWludXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZCwgJnVzZWNvbmQsICZ0emluZm8pKSB7CisgICAgICAgIGlmIChjaGVja19kYXRlX2FyZ3MoeWVhciwgbW9udGgsIGRheSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChjaGVja190aW1lX2FyZ3MoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHNlbGYgPSBuZXdfZGF0ZXRpbWVfZXgoeWVhciwgbW9udGgsIGRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbywgdHlwZSk7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiAvKiBUTV9GVU5DIGlzIHRoZSBzaGFyZWQgdHlwZSBvZiBsb2NhbHRpbWUoKSBhbmQgZ210aW1lKCkuICovCkBAIC0zNzM0LDM2ICszNzM0LDM2IEBACiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9mcm9tX3RpbWV0X2FuZF91cyhQeU9iamVjdCAqY2xzLCBUTV9GVU5DIGYsIHRpbWVfdCB0aW1ldCwgaW50IHVzLAotCQkJICAgUHlPYmplY3QgKnR6aW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8pCiB7Ci0Jc3RydWN0IHRtICp0bTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgdG0gKnRtOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JdG0gPSBmKCZ0aW1ldCk7Ci0JaWYgKHRtKSB7Ci0JCS8qIFRoZSBwbGF0Zm9ybSBsb2NhbHRpbWUvZ210aW1lIG1heSBpbnNlcnQgbGVhcCBzZWNvbmRzLAotCQkgKiBpbmRpY2F0ZWQgYnkgdG0tPnRtX3NlYyA+IDU5LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVtLAotCQkgKiBleGNlcHQgdG8gdGhlIGV4dGVudCB0aGF0IHBhc3NpbmcgdGhlbSBvbiB0byB0aGUgZGF0ZXRpbWUKLQkJICogY29uc3RydWN0b3Igd291bGQgcmFpc2UgVmFsdWVFcnJvciBmb3IgYSByZWFzb24gdGhhdAotCQkgKiBtYWRlIG5vIHNlbnNlIHRvIHRoZSB1c2VyLgotCQkgKi8KLQkJaWYgKHRtLT50bV9zZWMgPiA1OSkKLQkJCXRtLT50bV9zZWMgPSA1OTsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNscywgImlpaWlpaWlPIiwKLQkJCQkJICAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwKLQkJCQkJICAgICAgIHRtLT50bV9tb24gKyAxLAotCQkJCQkgICAgICAgdG0tPnRtX21kYXksCi0JCQkJCSAgICAgICB0bS0+dG1faG91ciwKLQkJCQkJICAgICAgIHRtLT50bV9taW4sCi0JCQkJCSAgICAgICB0bS0+dG1fc2VjLAotCQkJCQkgICAgICAgdXMsCi0JCQkJCSAgICAgICB0emluZm8pOwotCX0KLQllbHNlCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJ0aW1lc3RhbXAgb3V0IG9mIHJhbmdlIGZvciAiCi0JCQkJInBsYXRmb3JtIGxvY2FsdGltZSgpL2dtdGltZSgpIGZ1bmN0aW9uIik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICB0bSA9IGYoJnRpbWV0KTsKKyAgICBpZiAodG0pIHsKKyAgICAgICAgLyogVGhlIHBsYXRmb3JtIGxvY2FsdGltZS9nbXRpbWUgbWF5IGluc2VydCBsZWFwIHNlY29uZHMsCisgICAgICAgICAqIGluZGljYXRlZCBieSB0bS0+dG1fc2VjID4gNTkuICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZW0sCisgICAgICAgICAqIGV4Y2VwdCB0byB0aGUgZXh0ZW50IHRoYXQgcGFzc2luZyB0aGVtIG9uIHRvIHRoZSBkYXRldGltZQorICAgICAgICAgKiBjb25zdHJ1Y3RvciB3b3VsZCByYWlzZSBWYWx1ZUVycm9yIGZvciBhIHJlYXNvbiB0aGF0CisgICAgICAgICAqIG1hZGUgbm8gc2Vuc2UgdG8gdGhlIHVzZXIuCisgICAgICAgICAqLworICAgICAgICBpZiAodG0tPnRtX3NlYyA+IDU5KQorICAgICAgICAgICAgdG0tPnRtX3NlYyA9IDU5OworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpaWlpaU8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX3llYXIgKyAxOTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX21vbiArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1fbWRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9ob3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIG91dCBvZiByYW5nZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtIGxvY2FsdGltZSgpL2dtdGltZSgpIGZ1bmN0aW9uIik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogSW50ZXJuYWwgaGVscGVyLgpAQCAtMzc3NSwzMSArMzc3NSwzMSBAQAogICovCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoUHlPYmplY3QgKmNscywgVE1fRlVOQyBmLCBkb3VibGUgdGltZXN0YW1wLAotCQkJUHlPYmplY3QgKnR6aW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8pCiB7Ci0JdGltZV90IHRpbWV0OwotCWRvdWJsZSBmcmFjdGlvbjsKLQlpbnQgdXM7CisgICAgdGltZV90IHRpbWV0OworICAgIGRvdWJsZSBmcmFjdGlvbjsKKyAgICBpbnQgdXM7CiAKLQl0aW1ldCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldCh0aW1lc3RhbXApOwotCWlmICh0aW1ldCA9PSAodGltZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWZyYWN0aW9uID0gdGltZXN0YW1wIC0gKGRvdWJsZSl0aW1ldDsKLQl1cyA9IChpbnQpcm91bmRfdG9fbG9uZyhmcmFjdGlvbiAqIDFlNik7Ci0JaWYgKHVzIDwgMCkgewotCQkvKiBUcnVuY2F0aW9uIHRvd2FyZHMgemVybyBpcyBub3Qgd2hhdCB3ZSB3YW50ZWQKLQkJICAgZm9yIG5lZ2F0aXZlIG51bWJlcnMgKFB5dGhvbidzIG1vZCBzZW1hbnRpY3MpICovCi0JCXRpbWV0IC09IDE7Ci0JCXVzICs9IDEwMDAwMDA7Ci0JfQotCS8qIElmIHRpbWVzdGFtcCBpcyBsZXNzIHRoYW4gb25lIG1pY3Jvc2Vjb25kIHNtYWxsZXIgdGhhbiBhCi0JICogZnVsbCBzZWNvbmQsIHJvdW5kIHVwLiBPdGhlcndpc2UsIFZhbHVlRXJyb3JzIGFyZSByYWlzZWQKLQkgKiBmb3Igc29tZSBmbG9hdHMuICovCi0JaWYgKHVzID09IDEwMDAwMDApIHsKLQkJdGltZXQgKz0gMTsKLQkJdXMgPSAwOwotCX0KLQlyZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1ldF9hbmRfdXMoY2xzLCBmLCB0aW1ldCwgdXMsIHR6aW5mbyk7CisgICAgdGltZXQgPSBfUHlUaW1lX0RvdWJsZVRvVGltZXQodGltZXN0YW1wKTsKKyAgICBpZiAodGltZXQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcmFjdGlvbiA9IHRpbWVzdGFtcCAtIChkb3VibGUpdGltZXQ7CisgICAgdXMgPSAoaW50KXJvdW5kX3RvX2xvbmcoZnJhY3Rpb24gKiAxZTYpOworICAgIGlmICh1cyA8IDApIHsKKyAgICAgICAgLyogVHJ1bmNhdGlvbiB0b3dhcmRzIHplcm8gaXMgbm90IHdoYXQgd2Ugd2FudGVkCisgICAgICAgICAgIGZvciBuZWdhdGl2ZSBudW1iZXJzIChQeXRob24ncyBtb2Qgc2VtYW50aWNzKSAqLworICAgICAgICB0aW1ldCAtPSAxOworICAgICAgICB1cyArPSAxMDAwMDAwOworICAgIH0KKyAgICAvKiBJZiB0aW1lc3RhbXAgaXMgbGVzcyB0aGFuIG9uZSBtaWNyb3NlY29uZCBzbWFsbGVyIHRoYW4gYQorICAgICAqIGZ1bGwgc2Vjb25kLCByb3VuZCB1cC4gT3RoZXJ3aXNlLCBWYWx1ZUVycm9ycyBhcmUgcmFpc2VkCisgICAgICogZm9yIHNvbWUgZmxvYXRzLiAqLworICAgIGlmICh1cyA9PSAxMDAwMDAwKSB7CisgICAgICAgIHRpbWV0ICs9IDE7CisgICAgICAgIHVzID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXRfYW5kX3VzKGNscywgZiwgdGltZXQsIHVzLCB0emluZm8pOwogfQogCiAvKiBJbnRlcm5hbCBoZWxwZXIuCkBAIC0zODEwLDM2ICszODEwLDM2IEBACiBkYXRldGltZV9iZXN0X3Bvc3NpYmxlKFB5T2JqZWN0ICpjbHMsIFRNX0ZVTkMgZiwgUHlPYmplY3QgKnR6aW5mbykKIHsKICNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotCXN0cnVjdCB0aW1ldmFsIHQ7CisgICAgc3RydWN0IHRpbWV2YWwgdDsKIAogI2lmZGVmIEdFVFRJTUVPRkRBWV9OT19UWgotCWdldHRpbWVvZmRheSgmdCk7CisgICAgZ2V0dGltZW9mZGF5KCZ0KTsKICNlbHNlCi0JZ2V0dGltZW9mZGF5KCZ0LCAoc3RydWN0IHRpbWV6b25lICopTlVMTCk7CisgICAgZ2V0dGltZW9mZGF5KCZ0LCAoc3RydWN0IHRpbWV6b25lICopTlVMTCk7CiAjZW5kaWYKLQlyZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1ldF9hbmRfdXMoY2xzLCBmLCB0LnR2X3NlYywgKGludCl0LnR2X3VzZWMsCi0JCQkJCSAgdHppbmZvKTsKKyAgICByZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1ldF9hbmRfdXMoY2xzLCBmLCB0LnR2X3NlYywgKGludCl0LnR2X3VzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyk7CiAKLSNlbHNlCS8qICEgSEFWRV9HRVRUSU1FT0ZEQVkgKi8KLQkvKiBObyBmbGF2b3Igb2YgZ2V0dGltZW9mZGF5IGV4aXN0cyBvbiB0aGlzIHBsYXRmb3JtLiAgUHl0aG9uJ3MKLQkgKiB0aW1lLnRpbWUoKSBkb2VzIGEgbG90IG9mIG90aGVyIHBsYXRmb3JtIHRyaWNrcyB0byBnZXQgdGhlCi0JICogYmVzdCB0aW1lIGl0IGNhbiBvbiB0aGUgcGxhdGZvcm0sIGFuZCB3ZSdyZSBub3QgZ29pbmcgdG8gZG8KLQkgKiBiZXR0ZXIgdGhhbiB0aGF0IChpZiB3ZSBjb3VsZCwgdGhlIGJldHRlciBjb2RlIHdvdWxkIGJlbG9uZwotCSAqIGluIHRpbWUudGltZSgpISkgIFdlJ3JlIGxpbWl0ZWQgYnkgdGhlIHByZWNpc2lvbiBvZiBhIGRvdWJsZSwKLQkgKiB0aG91Z2guCi0JICovCi0JUHlPYmplY3QgKnRpbWU7Ci0JZG91YmxlIGR0aW1lOworI2Vsc2UgICAvKiAhIEhBVkVfR0VUVElNRU9GREFZICovCisgICAgLyogTm8gZmxhdm9yIG9mIGdldHRpbWVvZmRheSBleGlzdHMgb24gdGhpcyBwbGF0Zm9ybS4gIFB5dGhvbidzCisgICAgICogdGltZS50aW1lKCkgZG9lcyBhIGxvdCBvZiBvdGhlciBwbGF0Zm9ybSB0cmlja3MgdG8gZ2V0IHRoZQorICAgICAqIGJlc3QgdGltZSBpdCBjYW4gb24gdGhlIHBsYXRmb3JtLCBhbmQgd2UncmUgbm90IGdvaW5nIHRvIGRvCisgICAgICogYmV0dGVyIHRoYW4gdGhhdCAoaWYgd2UgY291bGQsIHRoZSBiZXR0ZXIgY29kZSB3b3VsZCBiZWxvbmcKKyAgICAgKiBpbiB0aW1lLnRpbWUoKSEpICBXZSdyZSBsaW1pdGVkIGJ5IHRoZSBwcmVjaXNpb24gb2YgYSBkb3VibGUsCisgICAgICogdGhvdWdoLgorICAgICAqLworICAgIFB5T2JqZWN0ICp0aW1lOworICAgIGRvdWJsZSBkdGltZTsKIAotCXRpbWUgPSB0aW1lX3RpbWUoKTsKLSAgICAJaWYgKHRpbWUgPT0gTlVMTCkKLSAgICAJCXJldHVybiBOVUxMOwotCWR0aW1lID0gUHlGbG9hdF9Bc0RvdWJsZSh0aW1lKTsKLQlQeV9ERUNSRUYodGltZSk7Ci0JaWYgKGR0aW1lID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXN0YW1wKGNscywgZiwgZHRpbWUsIHR6aW5mbyk7Ci0jZW5kaWYJLyogISBIQVZFX0dFVFRJTUVPRkRBWSAqLworICAgIHRpbWUgPSB0aW1lX3RpbWUoKTsKKyAgICBpZiAodGltZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkdGltZSA9IFB5RmxvYXRfQXNEb3VibGUodGltZSk7CisgICAgUHlfREVDUkVGKHRpbWUpOworICAgIGlmIChkdGltZSA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBkYXRldGltZV9mcm9tX3RpbWVzdGFtcChjbHMsIGYsIGR0aW1lLCB0emluZm8pOworI2VuZGlmICAvKiAhIEhBVkVfR0VUVElNRU9GREFZICovCiB9CiAKIC8qIFJldHVybiBiZXN0IHBvc3NpYmxlIGxvY2FsIHRpbWUgLS0gdGhpcyBpc24ndCBjb25zdHJhaW5lZCBieSB0aGUKQEAgLTM4NDgsMjYgKzM4NDgsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9ub3coUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsidHoiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsidHoiLCBOVUxMfTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPOm5vdyIsIGtleXdvcmRzLAotCQkJCQkgICZ0emluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8Tzpub3ciLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR6aW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IGRhdGV0aW1lX2Jlc3RfcG9zc2libGUoY2xzLAotCQkJCSAgICAgIHR6aW5mbyA9PSBQeV9Ob25lID8gbG9jYWx0aW1lIDogZ210aW1lLAotCQkJCSAgICAgIHR6aW5mbyk7Ci0JaWYgKHNlbGYgIT0gTlVMTCAmJiB0emluZm8gIT0gUHlfTm9uZSkgewotCQkvKiBDb252ZXJ0IFVUQyB0byB0emluZm8ncyB6b25lLiAqLwotCQlQeU9iamVjdCAqdGVtcCA9IHNlbGY7Ci0JCXNlbGYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR6aW5mbywgImZyb211dGMiLCAiTyIsIHNlbGYpOwotCQlQeV9ERUNSRUYodGVtcCk7Ci0JfQotCXJldHVybiBzZWxmOworICAgIHNlbGYgPSBkYXRldGltZV9iZXN0X3Bvc3NpYmxlKGNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8gPT0gUHlfTm9uZSA/IGxvY2FsdGltZSA6IGdtdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pOworICAgIGlmIChzZWxmICE9IE5VTEwgJiYgdHppbmZvICE9IFB5X05vbmUpIHsKKyAgICAgICAgLyogQ29udmVydCBVVEMgdG8gdHppbmZvJ3Mgem9uZS4gKi8KKyAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBzZWxmOworICAgICAgICBzZWxmID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0emluZm8sICJmcm9tdXRjIiwgIk8iLCBzZWxmKTsKKyAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKIH0KIAogLyogUmV0dXJuIGJlc3QgcG9zc2libGUgVVRDIHRpbWUgLS0gdGhpcyBpc24ndCBjb25zdHJhaW5lZCBieSB0aGUKQEAgLTM4NzYsMTQ3ICszODc2LDE0NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3V0Y25vdyhQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqZHVtbXkpCiB7Ci0JcmV0dXJuIGRhdGV0aW1lX2Jlc3RfcG9zc2libGUoY2xzLCBnbXRpbWUsIFB5X05vbmUpOworICAgIHJldHVybiBkYXRldGltZV9iZXN0X3Bvc3NpYmxlKGNscywgZ210aW1lLCBQeV9Ob25lKTsKIH0KIAogLyogUmV0dXJuIG5ldyBsb2NhbCBkYXRldGltZSBmcm9tIHRpbWVzdGFtcCAoUHl0aG9uIHRpbWVzdGFtcCAtLSBhIGRvdWJsZSkuICovCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfZnJvbXRpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpzZWxmOwotCWRvdWJsZSB0aW1lc3RhbXA7Ci0JUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InRpbWVzdGFtcCIsICJ0eiIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGRvdWJsZSB0aW1lc3RhbXA7CisgICAgUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InRpbWVzdGFtcCIsICJ0eiIsIE5VTEx9OwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiZHxPOmZyb210aW1lc3RhbXAiLAotCQkJCQkgIGtleXdvcmRzLCAmdGltZXN0YW1wLCAmdHppbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiZHxPOmZyb210aW1lc3RhbXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkcywgJnRpbWVzdGFtcCwgJnR6aW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IGRhdGV0aW1lX2Zyb21fdGltZXN0YW1wKGNscywKLQkJCQkgICAgICAgdHppbmZvID09IFB5X05vbmUgPyBsb2NhbHRpbWUgOiBnbXRpbWUsCi0JCQkJICAgICAgIHRpbWVzdGFtcCwKLQkJCQkgICAgICAgdHppbmZvKTsKLQlpZiAoc2VsZiAhPSBOVUxMICYmIHR6aW5mbyAhPSBQeV9Ob25lKSB7Ci0JCS8qIENvbnZlcnQgVVRDIHRvIHR6aW5mbydzIHpvbmUuICovCi0JCVB5T2JqZWN0ICp0ZW1wID0gc2VsZjsKLQkJc2VsZiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodHppbmZvLCAiZnJvbXV0YyIsICJPIiwgc2VsZik7Ci0JCVB5X0RFQ1JFRih0ZW1wKTsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgc2VsZiA9IGRhdGV0aW1lX2Zyb21fdGltZXN0YW1wKGNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvID09IFB5X05vbmUgPyBsb2NhbHRpbWUgOiBnbXRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMICYmIHR6aW5mbyAhPSBQeV9Ob25lKSB7CisgICAgICAgIC8qIENvbnZlcnQgVVRDIHRvIHR6aW5mbydzIHpvbmUuICovCisgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gc2VsZjsKKyAgICAgICAgc2VsZiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodHppbmZvLCAiZnJvbXV0YyIsICJPIiwgc2VsZik7CisgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIC8qIFJldHVybiBuZXcgVVRDIGRhdGV0aW1lIGZyb20gdGltZXN0YW1wIChQeXRob24gdGltZXN0YW1wIC0tIGEgZG91YmxlKS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV91dGNmcm9tdGltZXN0YW1wKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSB0aW1lc3RhbXA7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgZG91YmxlIHRpbWVzdGFtcDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkOnV0Y2Zyb210aW1lc3RhbXAiLCAmdGltZXN0YW1wKSkKLQkJcmVzdWx0ID0gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoY2xzLCBnbXRpbWUsIHRpbWVzdGFtcCwKLQkJCQkJCSBQeV9Ob25lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkOnV0Y2Zyb210aW1lc3RhbXAiLCAmdGltZXN0YW1wKSkKKyAgICAgICAgcmVzdWx0ID0gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoY2xzLCBnbXRpbWUsIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogUmV0dXJuIG5ldyBkYXRldGltZSBmcm9tIHRpbWUuc3RycHRpbWUoKS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9zdHJwdGltZShQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKm1vZHVsZSA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEwsICpvYmosICpzdCA9IE5VTEwsICpmcmFjID0gTlVMTDsKLQljb25zdCBjaGFyICpzdHJpbmcsICpmb3JtYXQ7CisgICAgc3RhdGljIFB5T2JqZWN0ICptb2R1bGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMLCAqb2JqLCAqc3QgPSBOVUxMLCAqZnJhYyA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAqZm9ybWF0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpzdHJwdGltZSIsICZzdHJpbmcsICZmb3JtYXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOnN0cnB0aW1lIiwgJnN0cmluZywgJmZvcm1hdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKG1vZHVsZSA9PSBOVUxMICYmCi0JICAgIChtb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJfc3RycHRpbWUiKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMICYmCisgICAgICAgIChtb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJfc3RycHRpbWUiKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBfc3RycHRpbWUuX3N0cnB0aW1lIHJldHVybnMgYSB0d28tZWxlbWVudCB0dXBsZS4gIFRoZSBmaXJzdAotCSAgIGVsZW1lbnQgaXMgYSB0aW1lLnN0cnVjdF90aW1lIG9iamVjdC4gIFRoZSBzZWNvbmQgaXMgdGhlCi0JICAgbWljcm9zZWNvbmRzICh3aGljaCBhcmUgbm90IGRlZmluZWQgZm9yIHRpbWUuc3RydWN0X3RpbWUpLiAqLwotCW9iaiA9IFB5T2JqZWN0X0NhbGxNZXRob2QobW9kdWxlLCAiX3N0cnB0aW1lIiwgInNzIiwgc3RyaW5nLCBmb3JtYXQpOwotCWlmIChvYmogIT0gTlVMTCkgewotCQlpbnQgaSwgZ29vZF90aW1ldHVwbGUgPSAxOwotCQlsb25nIGludCBpYVs3XTsKLQkJaWYgKFB5U2VxdWVuY2VfQ2hlY2sob2JqKSAmJiBQeVNlcXVlbmNlX1NpemUob2JqKSA9PSAyKSB7Ci0JCQlzdCA9IFB5U2VxdWVuY2VfR2V0SXRlbShvYmosIDApOwotCQkJZnJhYyA9IFB5U2VxdWVuY2VfR2V0SXRlbShvYmosIDEpOwotCQkJaWYgKHN0ID09IE5VTEwgfHwgZnJhYyA9PSBOVUxMKQotCQkJCWdvb2RfdGltZXR1cGxlID0gMDsKLQkJCS8qIGNvcHkgeS9tL2QvaC9tL3MgdmFsdWVzIG91dCBvZiB0aGUKLQkJCSAgIHRpbWUuc3RydWN0X3RpbWUgKi8KLQkJCWlmIChnb29kX3RpbWV0dXBsZSAmJgotCQkJICAgIFB5U2VxdWVuY2VfQ2hlY2soc3QpICYmCi0JCQkgICAgUHlTZXF1ZW5jZV9TaXplKHN0KSA+PSA2KSB7Ci0JCQkJZm9yIChpPTA7IGkgPCA2OyBpKyspIHsKLQkJCQkJUHlPYmplY3QgKnAgPSBQeVNlcXVlbmNlX0dldEl0ZW0oc3QsIGkpOwotCQkJCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQkJCQlnb29kX3RpbWV0dXBsZSA9IDA7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoUHlJbnRfQ2hlY2socCkpCi0JCQkJCQlpYVtpXSA9IFB5SW50X0FzTG9uZyhwKTsKLQkJCQkJZWxzZQotCQkJCQkJZ29vZF90aW1ldHVwbGUgPSAwOwotCQkJCQlQeV9ERUNSRUYocCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCWdvb2RfdGltZXR1cGxlID0gMDsKLQkJCS8qIGZvbGxvdyB0aGF0IHVwIHdpdGggYSBsaXR0bGUgZG9zZSBvZiBtaWNyb3NlY29uZHMgKi8KLQkJCWlmIChnb29kX3RpbWV0dXBsZSAmJiBQeUludF9DaGVjayhmcmFjKSkKLQkJCQlpYVs2XSA9IFB5SW50X0FzTG9uZyhmcmFjKTsKLQkJCWVsc2UKLQkJCQlnb29kX3RpbWV0dXBsZSA9IDA7Ci0JCX0KLQkJZWxzZQotCQkJZ29vZF90aW1ldHVwbGUgPSAwOwotCQlpZiAoZ29vZF90aW1ldHVwbGUpCi0JCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpaWlpaSIsCi0JCQkJCQkgICAgICAgaWFbMF0sIGlhWzFdLCBpYVsyXSwKLQkJCQkJCSAgICAgICBpYVszXSwgaWFbNF0sIGlhWzVdLAotCQkJCQkJICAgICAgIGlhWzZdKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInVuZXhwZWN0ZWQgdmFsdWUgZnJvbSBfc3RycHRpbWUuX3N0cnB0aW1lIik7Ci0JfQotCVB5X1hERUNSRUYob2JqKTsKLQlQeV9YREVDUkVGKHN0KTsKLQlQeV9YREVDUkVGKGZyYWMpOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogX3N0cnB0aW1lLl9zdHJwdGltZSByZXR1cm5zIGEgdHdvLWVsZW1lbnQgdHVwbGUuICBUaGUgZmlyc3QKKyAgICAgICBlbGVtZW50IGlzIGEgdGltZS5zdHJ1Y3RfdGltZSBvYmplY3QuICBUaGUgc2Vjb25kIGlzIHRoZQorICAgICAgIG1pY3Jvc2Vjb25kcyAod2hpY2ggYXJlIG5vdCBkZWZpbmVkIGZvciB0aW1lLnN0cnVjdF90aW1lKS4gKi8KKyAgICBvYmogPSBQeU9iamVjdF9DYWxsTWV0aG9kKG1vZHVsZSwgIl9zdHJwdGltZSIsICJzcyIsIHN0cmluZywgZm9ybWF0KTsKKyAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGksIGdvb2RfdGltZXR1cGxlID0gMTsKKyAgICAgICAgbG9uZyBpbnQgaWFbN107CisgICAgICAgIGlmIChQeVNlcXVlbmNlX0NoZWNrKG9iaikgJiYgUHlTZXF1ZW5jZV9TaXplKG9iaikgPT0gMikgeworICAgICAgICAgICAgc3QgPSBQeVNlcXVlbmNlX0dldEl0ZW0ob2JqLCAwKTsKKyAgICAgICAgICAgIGZyYWMgPSBQeVNlcXVlbmNlX0dldEl0ZW0ob2JqLCAxKTsKKyAgICAgICAgICAgIGlmIChzdCA9PSBOVUxMIHx8IGZyYWMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb29kX3RpbWV0dXBsZSA9IDA7CisgICAgICAgICAgICAvKiBjb3B5IHkvbS9kL2gvbS9zIHZhbHVlcyBvdXQgb2YgdGhlCisgICAgICAgICAgICAgICB0aW1lLnN0cnVjdF90aW1lICovCisgICAgICAgICAgICBpZiAoZ29vZF90aW1ldHVwbGUgJiYKKyAgICAgICAgICAgICAgICBQeVNlcXVlbmNlX0NoZWNrKHN0KSAmJgorICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfU2l6ZShzdCkgPj0gNikgeworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpwID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHN0LCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ29vZF90aW1ldHVwbGUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKHApKQorICAgICAgICAgICAgICAgICAgICAgICAgaWFbaV0gPSBQeUludF9Bc0xvbmcocCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RfdGltZXR1cGxlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb29kX3RpbWV0dXBsZSA9IDA7CisgICAgICAgICAgICAvKiBmb2xsb3cgdGhhdCB1cCB3aXRoIGEgbGl0dGxlIGRvc2Ugb2YgbWljcm9zZWNvbmRzICovCisgICAgICAgICAgICBpZiAoZ29vZF90aW1ldHVwbGUgJiYgUHlJbnRfQ2hlY2soZnJhYykpCisgICAgICAgICAgICAgICAgaWFbNl0gPSBQeUludF9Bc0xvbmcoZnJhYyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ29vZF90aW1ldHVwbGUgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvb2RfdGltZXR1cGxlID0gMDsKKyAgICAgICAgaWYgKGdvb2RfdGltZXR1cGxlKQorICAgICAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNscywgImlpaWlpaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhWzBdLCBpYVsxXSwgaWFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWFbM10sIGlhWzRdLCBpYVs1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYVs2XSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHZhbHVlIGZyb20gX3N0cnB0aW1lLl9zdHJwdGltZSIpOworICAgIH0KKyAgICBQeV9YREVDUkVGKG9iaik7CisgICAgUHlfWERFQ1JFRihzdCk7CisgICAgUHlfWERFQ1JFRihmcmFjKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBSZXR1cm4gbmV3IGRhdGV0aW1lIGZyb20gZGF0ZS9kYXRldGltZSBhbmQgdGltZSBhcmd1bWVudHMuICovCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfY29tYmluZShQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotIAlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZGF0ZSIsICJ0aW1lIiwgTlVMTH07Ci0JUHlPYmplY3QgKmRhdGU7Ci0JUHlPYmplY3QgKnRpbWU7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImRhdGUiLCAidGltZSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpkYXRlOworICAgIFB5T2JqZWN0ICp0aW1lOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk8hTyE6Y29tYmluZSIsIGtleXdvcmRzLAotCQkJCQkmUHlEYXRlVGltZV9EYXRlVHlwZSwgJmRhdGUsCi0JCQkJCSZQeURhdGVUaW1lX1RpbWVUeXBlLCAmdGltZSkpIHsKLQkJUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk8hTyE6Y29tYmluZSIsIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5RGF0ZVRpbWVfRGF0ZVR5cGUsICZkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5RGF0ZVRpbWVfVGltZVR5cGUsICZ0aW1lKSkgeworICAgICAgICBQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKIAotCQlpZiAoSEFTVFpJTkZPKHRpbWUpKQotCQkJdHppbmZvID0gKChQeURhdGVUaW1lX1RpbWUgKil0aW1lKS0+dHppbmZvOwotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpaWlpaU8iLAotCQkJCQkJR0VUX1lFQVIoZGF0ZSksCi0JCQkJICAgIAkJR0VUX01PTlRIKGRhdGUpLAotCQkJCQkJR0VUX0RBWShkYXRlKSwKLQkJCQkgICAgCQlUSU1FX0dFVF9IT1VSKHRpbWUpLAotCQkJCSAgICAJCVRJTUVfR0VUX01JTlVURSh0aW1lKSwKLQkJCQkgICAgCQlUSU1FX0dFVF9TRUNPTkQodGltZSksCi0JCQkJICAgIAkJVElNRV9HRVRfTUlDUk9TRUNPTkQodGltZSksCi0JCQkJICAgIAkJdHppbmZvKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKEhBU1RaSU5GTyh0aW1lKSkKKyAgICAgICAgICAgIHR6aW5mbyA9ICgoUHlEYXRlVGltZV9UaW1lICopdGltZSktPnR6aW5mbzsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNscywgImlpaWlpaWlPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfWUVBUihkYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgoZGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShkYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9IT1VSKHRpbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JTlVURSh0aW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQodGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlDUk9TRUNPTkQodGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTQwMjYsMTAgKzQwMjYsMTAgQEAKIHN0YXRpYyB2b2lkCiBkYXRldGltZV9kZWFsbG9jKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYpCiB7Ci0JaWYgKEhBU1RaSU5GTyhzZWxmKSkgewotCQlQeV9YREVDUkVGKHNlbGYtPnR6aW5mbyk7Ci0JfQotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKEhBU1RaSU5GTyhzZWxmKSkgeworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPnR6aW5mbyk7CisgICAgfQorICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIC8qCkBAIC00MDM5LDIwICs0MDM5LDIwIEBACiAvKiBUaGVzZSBhcmUgYWxsIE1FVEhfTk9BUkdTLCBzbyBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBhcmdsaXN0LiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3V0Y29mZnNldChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7Ci0JcmV0dXJuIG9mZnNldF9hc190aW1lZGVsdGEoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKLQkJCQkgICAidXRjb2Zmc2V0IiwgKFB5T2JqZWN0ICopc2VsZik7CisgICAgcmV0dXJuIG9mZnNldF9hc190aW1lZGVsdGEoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXRjb2Zmc2V0IiwgKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9kc3QoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewotCXJldHVybiBvZmZzZXRfYXNfdGltZWRlbHRhKEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUsCi0JCQkJICAgImRzdCIsIChQeU9iamVjdCAqKXNlbGYpOworICAgIHJldHVybiBvZmZzZXRfYXNfdGltZWRlbHRhKEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzdCIsIChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfdHpuYW1lKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpIHsKLQlyZXR1cm4gY2FsbF90em5hbWUoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKLQkJCSAgIChQeU9iamVjdCAqKXNlbGYpOworICAgIHJldHVybiBjYWxsX3R6bmFtZShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogLyoKQEAgLTQwNjQsMTEyICs0MDY0LDExMiBAQAogICovCiBzdGF0aWMgUHlPYmplY3QgKgogYWRkX2RhdGV0aW1lX3RpbWVkZWx0YShQeURhdGVUaW1lX0RhdGVUaW1lICpkYXRlLCBQeURhdGVUaW1lX0RlbHRhICpkZWx0YSwKLQkJICAgICAgIGludCBmYWN0b3IpCisgICAgICAgICAgICAgICAgICAgICAgIGludCBmYWN0b3IpCiB7Ci0JLyogTm90ZSB0aGF0IHRoZSBDLWxldmVsIGFkZGl0aW9ucyBjYW4ndCBvdmVyZmxvdywgYmVjYXVzZSBvZgotCSAqIGludmFyaWFudCBib3VuZHMgb24gdGhlIG1lbWJlciB2YWx1ZXMuCi0JICovCi0JaW50IHllYXIgPSBHRVRfWUVBUihkYXRlKTsKLQlpbnQgbW9udGggPSBHRVRfTU9OVEgoZGF0ZSk7Ci0JaW50IGRheSA9IEdFVF9EQVkoZGF0ZSkgKyBHRVRfVERfREFZUyhkZWx0YSkgKiBmYWN0b3I7Ci0JaW50IGhvdXIgPSBEQVRFX0dFVF9IT1VSKGRhdGUpOwotCWludCBtaW51dGUgPSBEQVRFX0dFVF9NSU5VVEUoZGF0ZSk7Ci0JaW50IHNlY29uZCA9IERBVEVfR0VUX1NFQ09ORChkYXRlKSArIEdFVF9URF9TRUNPTkRTKGRlbHRhKSAqIGZhY3RvcjsKLQlpbnQgbWljcm9zZWNvbmQgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChkYXRlKSArCi0JCQkgIEdFVF9URF9NSUNST1NFQ09ORFMoZGVsdGEpICogZmFjdG9yOworICAgIC8qIE5vdGUgdGhhdCB0aGUgQy1sZXZlbCBhZGRpdGlvbnMgY2FuJ3Qgb3ZlcmZsb3csIGJlY2F1c2Ugb2YKKyAgICAgKiBpbnZhcmlhbnQgYm91bmRzIG9uIHRoZSBtZW1iZXIgdmFsdWVzLgorICAgICAqLworICAgIGludCB5ZWFyID0gR0VUX1lFQVIoZGF0ZSk7CisgICAgaW50IG1vbnRoID0gR0VUX01PTlRIKGRhdGUpOworICAgIGludCBkYXkgPSBHRVRfREFZKGRhdGUpICsgR0VUX1REX0RBWVMoZGVsdGEpICogZmFjdG9yOworICAgIGludCBob3VyID0gREFURV9HRVRfSE9VUihkYXRlKTsKKyAgICBpbnQgbWludXRlID0gREFURV9HRVRfTUlOVVRFKGRhdGUpOworICAgIGludCBzZWNvbmQgPSBEQVRFX0dFVF9TRUNPTkQoZGF0ZSkgKyBHRVRfVERfU0VDT05EUyhkZWx0YSkgKiBmYWN0b3I7CisgICAgaW50IG1pY3Jvc2Vjb25kID0gREFURV9HRVRfTUlDUk9TRUNPTkQoZGF0ZSkgKworICAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMoZGVsdGEpICogZmFjdG9yOwogCi0JYXNzZXJ0KGZhY3RvciA9PSAxIHx8IGZhY3RvciA9PSAtMSk7Ci0JaWYgKG5vcm1hbGl6ZV9kYXRldGltZSgmeWVhciwgJm1vbnRoLCAmZGF5LAotCQkJICAgICAgICZob3VyLCAmbWludXRlLCAmc2Vjb25kLCAmbWljcm9zZWNvbmQpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gbmV3X2RhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksCi0JCQkJICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwKLQkJCQkgICAgSEFTVFpJTkZPKGRhdGUpID8gZGF0ZS0+dHppbmZvIDogUHlfTm9uZSk7CisgICAgYXNzZXJ0KGZhY3RvciA9PSAxIHx8IGZhY3RvciA9PSAtMSk7CisgICAgaWYgKG5vcm1hbGl6ZV9kYXRldGltZSgmeWVhciwgJm1vbnRoLCAmZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvdXIsICZtaW51dGUsICZzZWNvbmQsICZtaWNyb3NlY29uZCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBuZXdfZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFTVFpJTkZPKGRhdGUpID8gZGF0ZS0+dHppbmZvIDogUHlfTm9uZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9hZGQoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlpZiAoUHlEYXRlVGltZV9DaGVjayhsZWZ0KSkgewotCQkvKiBkYXRldGltZSArID8/PyAqLwotCQlpZiAoUHlEZWx0YV9DaGVjayhyaWdodCkpCi0JCQkvKiBkYXRldGltZSArIGRlbHRhICovCi0JCQlyZXR1cm4gYWRkX2RhdGV0aW1lX3RpbWVkZWx0YSgKLQkJCQkJKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilsZWZ0LAotCQkJCQkoUHlEYXRlVGltZV9EZWx0YSAqKXJpZ2h0LAotCQkJCQkxKTsKLQl9Ci0JZWxzZSBpZiAoUHlEZWx0YV9DaGVjayhsZWZ0KSkgewotCQkvKiBkZWx0YSArIGRhdGV0aW1lICovCi0JCXJldHVybiBhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGVUaW1lICopIHJpZ2h0LAotCQkJCQkgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKSBsZWZ0LAotCQkJCQkgICAgICAxKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgaWYgKFB5RGF0ZVRpbWVfQ2hlY2sobGVmdCkpIHsKKyAgICAgICAgLyogZGF0ZXRpbWUgKyA/Pz8gKi8KKyAgICAgICAgaWYgKFB5RGVsdGFfQ2hlY2socmlnaHQpKQorICAgICAgICAgICAgLyogZGF0ZXRpbWUgKyBkZWx0YSAqLworICAgICAgICAgICAgcmV0dXJuIGFkZF9kYXRldGltZV90aW1lZGVsdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkpIHsKKyAgICAgICAgLyogZGVsdGEgKyBkYXRldGltZSAqLworICAgICAgICByZXR1cm4gYWRkX2RhdGV0aW1lX3RpbWVkZWx0YSgoUHlEYXRlVGltZV9EYXRlVGltZSAqKSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKikgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfc3VidHJhY3QoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOwogCi0JaWYgKFB5RGF0ZVRpbWVfQ2hlY2sobGVmdCkpIHsKLQkJLyogZGF0ZXRpbWUgLSA/Pz8gKi8KLQkJaWYgKFB5RGF0ZVRpbWVfQ2hlY2socmlnaHQpKSB7Ci0JCQkvKiBkYXRldGltZSAtIGRhdGV0aW1lICovCi0JCQluYWl2ZXR5IG4xLCBuMjsKLQkJCWludCBvZmZzZXQxLCBvZmZzZXQyOwotCQkJaW50IGRlbHRhX2QsIGRlbHRhX3MsIGRlbHRhX3VzOworICAgIGlmIChQeURhdGVUaW1lX0NoZWNrKGxlZnQpKSB7CisgICAgICAgIC8qIGRhdGV0aW1lIC0gPz8/ICovCisgICAgICAgIGlmIChQeURhdGVUaW1lX0NoZWNrKHJpZ2h0KSkgeworICAgICAgICAgICAgLyogZGF0ZXRpbWUgLSBkYXRldGltZSAqLworICAgICAgICAgICAgbmFpdmV0eSBuMSwgbjI7CisgICAgICAgICAgICBpbnQgb2Zmc2V0MSwgb2Zmc2V0MjsKKyAgICAgICAgICAgIGludCBkZWx0YV9kLCBkZWx0YV9zLCBkZWx0YV91czsKIAotCQkJaWYgKGNsYXNzaWZ5X3R3b191dGNvZmZzZXRzKGxlZnQsICZvZmZzZXQxLCAmbjEsIGxlZnQsCi0JCQkJCQkgICAgcmlnaHQsICZvZmZzZXQyLCAmbjIsCi0JCQkJCQkgICAgcmlnaHQpIDwgMCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWFzc2VydChuMSAhPSBPRkZTRVRfVU5LTk9XTiAmJiBuMiAhPSBPRkZTRVRfVU5LTk9XTik7Ci0JCQlpZiAobjEgIT0gbjIpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiY2FuJ3Qgc3VidHJhY3Qgb2Zmc2V0LW5haXZlIGFuZCAiCi0JCQkJCSJvZmZzZXQtYXdhcmUgZGF0ZXRpbWVzIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlkZWx0YV9kID0geW1kX3RvX29yZChHRVRfWUVBUihsZWZ0KSwKLQkJCQkJICAgICBHRVRfTU9OVEgobGVmdCksCi0JCQkJCSAgICAgR0VUX0RBWShsZWZ0KSkgLQotCQkJCSAgeW1kX3RvX29yZChHRVRfWUVBUihyaWdodCksCi0JCQkJCSAgICAgR0VUX01PTlRIKHJpZ2h0KSwKLQkJCQkJICAgICBHRVRfREFZKHJpZ2h0KSk7Ci0JCQkvKiBUaGVzZSBjYW4ndCBvdmVyZmxvdywgc2luY2UgdGhlIHZhbHVlcyBhcmUKLQkJCSAqIG5vcm1hbGl6ZWQuICBBdCBtb3N0IHRoaXMgZ2l2ZXMgdGhlIG51bWJlciBvZgotCQkJICogc2Vjb25kcyBpbiBvbmUgZGF5LgotCQkJICovCi0JCQlkZWx0YV9zID0gKERBVEVfR0VUX0hPVVIobGVmdCkgLQotCQkJCSAgIERBVEVfR0VUX0hPVVIocmlnaHQpKSAqIDM2MDAgKwotCQkJICAgICAgICAgIChEQVRFX0dFVF9NSU5VVEUobGVmdCkgLQotCQkJICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUocmlnaHQpKSAqIDYwICsKLQkJCQkgIChEQVRFX0dFVF9TRUNPTkQobGVmdCkgLQotCQkJCSAgIERBVEVfR0VUX1NFQ09ORChyaWdodCkpOwotCQkJZGVsdGFfdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChsZWZ0KSAtCi0JCQkJICAgREFURV9HRVRfTUlDUk9TRUNPTkQocmlnaHQpOwotCQkJLyogKGxlZnQgLSBvZmZzZXQxKSAtIChyaWdodCAtIG9mZnNldDIpID0KLQkJCSAqIChsZWZ0IC0gcmlnaHQpICsgKG9mZnNldDIgLSBvZmZzZXQxKQotCQkJICovCi0JCQlkZWx0YV9zICs9IChvZmZzZXQyIC0gb2Zmc2V0MSkgKiA2MDsKLQkJCXJlc3VsdCA9IG5ld19kZWx0YShkZWx0YV9kLCBkZWx0YV9zLCBkZWx0YV91cywgMSk7Ci0JCX0KLQkJZWxzZSBpZiAoUHlEZWx0YV9DaGVjayhyaWdodCkpIHsKLQkJCS8qIGRhdGV0aW1lIC0gZGVsdGEgKi8KLQkJCXJlc3VsdCA9IGFkZF9kYXRldGltZV90aW1lZGVsdGEoCi0JCQkJCShQeURhdGVUaW1lX0RhdGVUaW1lICopbGVmdCwKLQkJCQkJKFB5RGF0ZVRpbWVfRGVsdGEgKilyaWdodCwKLQkJCQkJLTEpOwotCQl9Ci0JfQorICAgICAgICAgICAgaWYgKGNsYXNzaWZ5X3R3b191dGNvZmZzZXRzKGxlZnQsICZvZmZzZXQxLCAmbjEsIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQsICZvZmZzZXQyLCAmbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGFzc2VydChuMSAhPSBPRkZTRVRfVU5LTk9XTiAmJiBuMiAhPSBPRkZTRVRfVU5LTk9XTik7CisgICAgICAgICAgICBpZiAobjEgIT0gbjIpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3VidHJhY3Qgb2Zmc2V0LW5haXZlIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICJvZmZzZXQtYXdhcmUgZGF0ZXRpbWVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWx0YV9kID0geW1kX3RvX29yZChHRVRfWUVBUihsZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChsZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkobGVmdCkpIC0KKyAgICAgICAgICAgICAgICAgICAgICB5bWRfdG9fb3JkKEdFVF9ZRUFSKHJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChyaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHJpZ2h0KSk7CisgICAgICAgICAgICAvKiBUaGVzZSBjYW4ndCBvdmVyZmxvdywgc2luY2UgdGhlIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAqIG5vcm1hbGl6ZWQuICBBdCBtb3N0IHRoaXMgZ2l2ZXMgdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICogc2Vjb25kcyBpbiBvbmUgZGF5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkZWx0YV9zID0gKERBVEVfR0VUX0hPVVIobGVmdCkgLQorICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHJpZ2h0KSkgKiAzNjAwICsKKyAgICAgICAgICAgICAgICAgICAgICAoREFURV9HRVRfTUlOVVRFKGxlZnQpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKHJpZ2h0KSkgKiA2MCArCisgICAgICAgICAgICAgICAgICAgICAgKERBVEVfR0VUX1NFQ09ORChsZWZ0KSAtCisgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChyaWdodCkpOworICAgICAgICAgICAgZGVsdGFfdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChsZWZ0KSAtCisgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHJpZ2h0KTsKKyAgICAgICAgICAgIC8qIChsZWZ0IC0gb2Zmc2V0MSkgLSAocmlnaHQgLSBvZmZzZXQyKSA9CisgICAgICAgICAgICAgKiAobGVmdCAtIHJpZ2h0KSArIChvZmZzZXQyIC0gb2Zmc2V0MSkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZGVsdGFfcyArPSAob2Zmc2V0MiAtIG9mZnNldDEpICogNjA7CisgICAgICAgICAgICByZXN1bHQgPSBuZXdfZGVsdGEoZGVsdGFfZCwgZGVsdGFfcywgZGVsdGFfdXMsIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5RGVsdGFfQ2hlY2socmlnaHQpKSB7CisgICAgICAgICAgICAvKiBkYXRldGltZSAtIGRlbHRhICovCisgICAgICAgICAgICByZXN1bHQgPSBhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RhdGVUaW1lICopbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKXJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogVmFyaW91cyB3YXlzIHRvIHR1cm4gYSBkYXRldGltZSBpbnRvIGEgc3RyaW5nLiAqLwpAQCAtNDE3Nyw4MyArNDE3Nyw4MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3JlcHIoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKLQljaGFyIGJ1ZmZlclsxMDAwXTsKLQljb25zdCBjaGFyICp0eXBlX25hbWUgPSBQeV9UWVBFKHNlbGYpLT50cF9uYW1lOwotCVB5T2JqZWN0ICpiYXNlcmVwcjsKKyAgICBjaGFyIGJ1ZmZlclsxMDAwXTsKKyAgICBjb25zdCBjaGFyICp0eXBlX25hbWUgPSBQeV9UWVBFKHNlbGYpLT50cF9uYW1lOworICAgIFB5T2JqZWN0ICpiYXNlcmVwcjsKIAotCWlmIChEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSkgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQpIiwKLQkJCSAgICAgIHR5cGVfbmFtZSwKLQkJCSAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZiksCi0JCQkgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCi0JCQkgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCi0JCQkgICAgICBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSk7Ci0JfQotCWVsc2UgaWYgKERBVEVfR0VUX1NFQ09ORChzZWxmKSkgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkLCAlZCkiLAotCQkJICAgICAgdHlwZV9uYW1lLAotCQkJICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSwKLQkJCSAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksIERBVEVfR0VUX01JTlVURShzZWxmKSwKLQkJCSAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSk7Ci0JfQotCWVsc2UgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkKSIsCi0JCQkgICAgICB0eXBlX25hbWUsCi0JCQkgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpLAotCQkJICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpKTsKLQl9Ci0JYmFzZXJlcHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7Ci0JaWYgKGJhc2VyZXByID09IE5VTEwgfHwgISBIQVNUWklORk8oc2VsZikpCi0JCXJldHVybiBiYXNlcmVwcjsKLQlyZXR1cm4gYXBwZW5kX2tleXdvcmRfdHppbmZvKGJhc2VyZXByLCBzZWxmLT50emluZm8pOworICAgIGlmIChEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSkgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSk7CisgICAgfQorICAgIGVsc2UgaWYgKERBVEVfR0VUX1NFQ09ORChzZWxmKSkgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkLCAlZCwgJWQsICVkLCAlZCwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpKTsKKyAgICB9CisgICAgYmFzZXJlcHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CisgICAgaWYgKGJhc2VyZXByID09IE5VTEwgfHwgISBIQVNUWklORk8oc2VsZikpCisgICAgICAgIHJldHVybiBiYXNlcmVwcjsKKyAgICByZXR1cm4gYXBwZW5kX2tleXdvcmRfdHppbmZvKGJhc2VyZXByLCBzZWxmLT50emluZm8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfc3RyKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopc2VsZiwgImlzb2Zvcm1hdCIsICIocykiLCAiICIpOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKXNlbGYsICJpc29mb3JtYXQiLCAiKHMpIiwgIiAiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2lzb2Zvcm1hdChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCWNoYXIgc2VwID0gJ1QnOwotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJzZXAiLCBOVUxMfTsKLQljaGFyIGJ1ZmZlclsxMDBdOwotCWNoYXIgKmNwOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciBzZXAgPSAnVCc7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InNlcCIsIE5VTEx9OworICAgIGNoYXIgYnVmZmVyWzEwMF07CisgICAgY2hhciAqY3A7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGM6aXNvZm9ybWF0Iiwga2V5d29yZHMsCi0JCQkJCSAmc2VwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3AgPSBpc29mb3JtYXRfZGF0ZSgoUHlEYXRlVGltZV9EYXRlICopc2VsZiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0JYXNzZXJ0KGNwICE9IE5VTEwpOwotCSpjcCsrID0gc2VwOwotCWNwID0gaXNvZm9ybWF0X3RpbWUoc2VsZiwgY3AsIHNpemVvZihidWZmZXIpIC0gKGNwIC0gYnVmZmVyKSk7Ci0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBjcCAtIGJ1ZmZlcik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICEgSEFTVFpJTkZPKHNlbGYpKQotCQlyZXR1cm4gcmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGM6aXNvZm9ybWF0Iiwga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNwID0gaXNvZm9ybWF0X2RhdGUoKFB5RGF0ZVRpbWVfRGF0ZSAqKXNlbGYsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIGFzc2VydChjcCAhPSBOVUxMKTsKKyAgICAqY3ArKyA9IHNlcDsKKyAgICBjcCA9IGlzb2Zvcm1hdF90aW1lKHNlbGYsIGNwLCBzaXplb2YoYnVmZmVyKSAtIChjcCAtIGJ1ZmZlcikpOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZmZlciwgY3AgLSBidWZmZXIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCAhIEhBU1RaSU5GTyhzZWxmKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKIAotCS8qIFdlIG5lZWQgdG8gYXBwZW5kIHRoZSBVVEMgb2Zmc2V0LiAqLwotCWlmIChmb3JtYXRfdXRjb2Zmc2V0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICI6Iiwgc2VsZi0+dHppbmZvLAotCQkJICAgICAoUHlPYmplY3QgKilzZWxmKSA8IDApIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnJlc3VsdCwgUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIFdlIG5lZWQgdG8gYXBwZW5kIHRoZSBVVEMgb2Zmc2V0LiAqLworICAgIGlmIChmb3JtYXRfdXRjb2Zmc2V0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICI6Iiwgc2VsZi0+dHppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXNlbGYpIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVzdWx0LCBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcikpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9jdGltZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCXJldHVybiBmb3JtYXRfY3RpbWUoKFB5RGF0ZVRpbWVfRGF0ZSAqKXNlbGYsCi0JCQkgICAgREFURV9HRVRfSE9VUihzZWxmKSwKLQkJCSAgICBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCi0JCQkgICAgREFURV9HRVRfU0VDT05EKHNlbGYpKTsKKyAgICByZXR1cm4gZm9ybWF0X2N0aW1lKChQeURhdGVUaW1lX0RhdGUgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSk7CiB9CiAKIC8qIE1pc2NlbGxhbmVvdXMgbWV0aG9kcy4gKi8KQEAgLTQyNjUsMjk4ICs0MjY1LDI5OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3JpY2hjb21wYXJlKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewotCWludCBkaWZmOwotCW5haXZldHkgbjEsIG4yOwotCWludCBvZmZzZXQxLCBvZmZzZXQyOworICAgIGludCBkaWZmOworICAgIG5haXZldHkgbjEsIG4yOworICAgIGludCBvZmZzZXQxLCBvZmZzZXQyOwogCi0JaWYgKCEgUHlEYXRlVGltZV9DaGVjayhvdGhlcikpIHsKLQkJLyogSWYgb3RoZXIgaGFzIGEgInRpbWV0dXBsZSIgYXR0ciwgdGhhdCdzIGFuIGFkdmVydGlzZWQKLQkJICogaG9vayBmb3Igb3RoZXIgY2xhc3NlcyB0byBhc2sgdG8gZ2V0IGNvbXBhcmlzb24gY29udHJvbC4KLQkJICogSG93ZXZlciwgZGF0ZSBpbnN0YW5jZXMgaGF2ZSBhIHRpbWV0dXBsZSBhdHRyLCBhbmQgd2UKLQkJICogZG9uJ3Qgd2FudCB0byBhbGxvdyB0aGF0IGNvbXBhcmlzb24uICBCZWNhdXNlIGRhdGV0aW1lCi0JCSAqIGlzIGEgc3ViY2xhc3Mgb2YgZGF0ZSwgd2hlbiBtaXhpbmcgZGF0ZSBhbmQgZGF0ZXRpbWUKLQkJICogaW4gYSBjb21wYXJpc29uLCBQeXRob24gZ2l2ZXMgZGF0ZXRpbWUgdGhlIGZpcnN0IHNob3QKLQkJICogKGl0J3MgdGhlIG1vcmUgc3BlY2lmaWMgc3VidHlwZSkuICBTbyB3ZSBjYW4gc3RvcCB0aGF0Ci0JCSAqIGNvbWJpbmF0aW9uIGhlcmUgcmVsaWFibHkuCi0JCSAqLwotCQlpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhvdGhlciwgInRpbWV0dXBsZSIpICYmCi0JCSAgICAhIFB5RGF0ZV9DaGVjayhvdGhlcikpIHsKLQkJCS8qIEEgaG9vayBmb3Igb3RoZXIga2luZHMgb2YgZGF0ZXRpbWUgb2JqZWN0cy4gKi8KLQkJCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JCX0KLQkJaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSB7Ci0JCQlQeU9iamVjdCAqcmVzdWx0ID0gb3AgPT0gUHlfRVEgPyBQeV9GYWxzZSA6IFB5X1RydWU7Ci0JCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJLyogU3RvcCB0aGlzIGZyb20gZmFsbGluZyBiYWNrIHRvIGFkZHJlc3MgY29tcGFyaXNvbi4gKi8KLQkJcmV0dXJuIGNtcGVycm9yKChQeU9iamVjdCAqKXNlbGYsIG90aGVyKTsKLQl9CisgICAgaWYgKCEgUHlEYXRlVGltZV9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgLyogSWYgb3RoZXIgaGFzIGEgInRpbWV0dXBsZSIgYXR0ciwgdGhhdCdzIGFuIGFkdmVydGlzZWQKKyAgICAgICAgICogaG9vayBmb3Igb3RoZXIgY2xhc3NlcyB0byBhc2sgdG8gZ2V0IGNvbXBhcmlzb24gY29udHJvbC4KKyAgICAgICAgICogSG93ZXZlciwgZGF0ZSBpbnN0YW5jZXMgaGF2ZSBhIHRpbWV0dXBsZSBhdHRyLCBhbmQgd2UKKyAgICAgICAgICogZG9uJ3Qgd2FudCB0byBhbGxvdyB0aGF0IGNvbXBhcmlzb24uICBCZWNhdXNlIGRhdGV0aW1lCisgICAgICAgICAqIGlzIGEgc3ViY2xhc3Mgb2YgZGF0ZSwgd2hlbiBtaXhpbmcgZGF0ZSBhbmQgZGF0ZXRpbWUKKyAgICAgICAgICogaW4gYSBjb21wYXJpc29uLCBQeXRob24gZ2l2ZXMgZGF0ZXRpbWUgdGhlIGZpcnN0IHNob3QKKyAgICAgICAgICogKGl0J3MgdGhlIG1vcmUgc3BlY2lmaWMgc3VidHlwZSkuICBTbyB3ZSBjYW4gc3RvcCB0aGF0CisgICAgICAgICAqIGNvbWJpbmF0aW9uIGhlcmUgcmVsaWFibHkuCisgICAgICAgICAqLworICAgICAgICBpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhvdGhlciwgInRpbWV0dXBsZSIpICYmCisgICAgICAgICAgICAhIFB5RGF0ZV9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgICAgIC8qIEEgaG9vayBmb3Igb3RoZXIga2luZHMgb2YgZGF0ZXRpbWUgb2JqZWN0cy4gKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gb3AgPT0gUHlfRVEgPyBQeV9GYWxzZSA6IFB5X1RydWU7CisgICAgICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgLyogU3RvcCB0aGlzIGZyb20gZmFsbGluZyBiYWNrIHRvIGFkZHJlc3MgY29tcGFyaXNvbi4gKi8KKyAgICAgICAgcmV0dXJuIGNtcGVycm9yKChQeU9iamVjdCAqKXNlbGYsIG90aGVyKTsKKyAgICB9CiAKLQlpZiAoY2xhc3NpZnlfdHdvX3V0Y29mZnNldHMoKFB5T2JqZWN0ICopc2VsZiwgJm9mZnNldDEsICZuMSwKLQkJCQkgICAgKFB5T2JqZWN0ICopc2VsZiwKLQkJCQkgICAgIG90aGVyLCAmb2Zmc2V0MiwgJm4yLAotCQkJCSAgICAgb3RoZXIpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KG4xICE9IE9GRlNFVF9VTktOT1dOICYmIG4yICE9IE9GRlNFVF9VTktOT1dOKTsKLSAJLyogSWYgdGhleSdyZSBib3RoIG5haXZlLCBvciBib3RoIGF3YXJlIGFuZCBoYXZlIHRoZSBzYW1lIG9mZnNldHMsCi0JICogd2UgZ2V0IG9mZiBjaGVhcC4gIE5vdGUgdGhhdCBpZiB0aGV5J3JlIGJvdGggbmFpdmUsIG9mZnNldDEgPT0KLQkgKiBvZmZzZXQyID09IDAgYXQgdGhpcyBwb2ludC4KLQkgKi8KLQlpZiAobjEgPT0gbjIgJiYgb2Zmc2V0MSA9PSBvZmZzZXQyKSB7Ci0JCWRpZmYgPSBtZW1jbXAoc2VsZi0+ZGF0YSwgKChQeURhdGVUaW1lX0RhdGVUaW1lICopb3RoZXIpLT5kYXRhLAotCQkJICAgICAgX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkUpOwotCQlyZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKLQl9CisgICAgaWYgKGNsYXNzaWZ5X3R3b191dGNvZmZzZXRzKChQeU9iamVjdCAqKXNlbGYsICZvZmZzZXQxLCAmbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciwgJm9mZnNldDIsICZuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChuMSAhPSBPRkZTRVRfVU5LTk9XTiAmJiBuMiAhPSBPRkZTRVRfVU5LTk9XTik7CisgICAgLyogSWYgdGhleSdyZSBib3RoIG5haXZlLCBvciBib3RoIGF3YXJlIGFuZCBoYXZlIHRoZSBzYW1lIG9mZnNldHMsCisgICAgICogd2UgZ2V0IG9mZiBjaGVhcC4gIE5vdGUgdGhhdCBpZiB0aGV5J3JlIGJvdGggbmFpdmUsIG9mZnNldDEgPT0KKyAgICAgKiBvZmZzZXQyID09IDAgYXQgdGhpcyBwb2ludC4KKyAgICAgKi8KKyAgICBpZiAobjEgPT0gbjIgJiYgb2Zmc2V0MSA9PSBvZmZzZXQyKSB7CisgICAgICAgIGRpZmYgPSBtZW1jbXAoc2VsZi0+ZGF0YSwgKChQeURhdGVUaW1lX0RhdGVUaW1lICopb3RoZXIpLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgIF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFKTsKKyAgICAgICAgcmV0dXJuIGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7CisgICAgfQogCi0JaWYgKG4xID09IE9GRlNFVF9BV0FSRSAmJiBuMiA9PSBPRkZTRVRfQVdBUkUpIHsKLQkJUHlEYXRlVGltZV9EZWx0YSAqZGVsdGE7CisgICAgaWYgKG4xID09IE9GRlNFVF9BV0FSRSAmJiBuMiA9PSBPRkZTRVRfQVdBUkUpIHsKKyAgICAgICAgUHlEYXRlVGltZV9EZWx0YSAqZGVsdGE7CiAKLQkJYXNzZXJ0KG9mZnNldDEgIT0gb2Zmc2V0Mik7CS8qIGVsc2UgbGFzdCAiaWYiIGhhbmRsZWQgaXQgKi8KLQkJZGVsdGEgPSAoUHlEYXRlVGltZV9EZWx0YSAqKWRhdGV0aW1lX3N1YnRyYWN0KChQeU9iamVjdCAqKXNlbGYsCi0JCQkJCQkJICAgICAgIG90aGVyKTsKLQkJaWYgKGRlbHRhID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGlmZiA9IEdFVF9URF9EQVlTKGRlbHRhKTsKLQkJaWYgKGRpZmYgPT0gMCkKLQkJCWRpZmYgPSBHRVRfVERfU0VDT05EUyhkZWx0YSkgfAotCQkJICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMoZGVsdGEpOwotCQlQeV9ERUNSRUYoZGVsdGEpOwotCQlyZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKLQl9CisgICAgICAgIGFzc2VydChvZmZzZXQxICE9IG9mZnNldDIpOyAgICAgICAgICAgICAvKiBlbHNlIGxhc3QgImlmIiBoYW5kbGVkIGl0ICovCisgICAgICAgIGRlbHRhID0gKFB5RGF0ZVRpbWVfRGVsdGEgKilkYXRldGltZV9zdWJ0cmFjdCgoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyKTsKKyAgICAgICAgaWYgKGRlbHRhID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGlmZiA9IEdFVF9URF9EQVlTKGRlbHRhKTsKKyAgICAgICAgaWYgKGRpZmYgPT0gMCkKKyAgICAgICAgICAgIGRpZmYgPSBHRVRfVERfU0VDT05EUyhkZWx0YSkgfAorICAgICAgICAgICAgICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMoZGVsdGEpOworICAgICAgICBQeV9ERUNSRUYoZGVsdGEpOworICAgICAgICByZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKKyAgICB9CiAKLQlhc3NlcnQobjEgIT0gbjIpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kICIKLQkJCSJvZmZzZXQtYXdhcmUgZGF0ZXRpbWVzIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KG4xICE9IG4yKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgIm9mZnNldC1hd2FyZSBkYXRldGltZXMiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGxvbmcKIGRhdGV0aW1lX2hhc2goUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKLQlpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKLQkJbmFpdmV0eSBuOwotCQlpbnQgb2Zmc2V0OwotCQlQeU9iamVjdCAqdGVtcDsKKyAgICBpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKKyAgICAgICAgbmFpdmV0eSBuOworICAgICAgICBpbnQgb2Zmc2V0OworICAgICAgICBQeU9iamVjdCAqdGVtcDsKIAotCQluID0gY2xhc3NpZnlfdXRjb2Zmc2V0KChQeU9iamVjdCAqKXNlbGYsIChQeU9iamVjdCAqKXNlbGYsCi0JCQkJICAgICAgICZvZmZzZXQpOwotCQlhc3NlcnQobiAhPSBPRkZTRVRfVU5LTk9XTik7Ci0JCWlmIChuID09IE9GRlNFVF9FUlJPUikKLQkJCXJldHVybiAtMTsKKyAgICAgICAgbiA9IGNsYXNzaWZ5X3V0Y29mZnNldCgoUHlPYmplY3QgKilzZWxmLCAoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOworICAgICAgICBhc3NlcnQobiAhPSBPRkZTRVRfVU5LTk9XTik7CisgICAgICAgIGlmIChuID09IE9GRlNFVF9FUlJPUikKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQkvKiBSZWR1Y2UgdGhpcyB0byBhIGhhc2ggb2YgYW5vdGhlciBvYmplY3QuICovCi0JCWlmIChuID09IE9GRlNFVF9OQUlWRSkKLQkJCXRlbXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkJCQkJKGNoYXIgKilzZWxmLT5kYXRhLAotCQkJCQlfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSk7Ci0JCWVsc2UgewotCQkJaW50IGRheXM7Ci0JCQlpbnQgc2Vjb25kczsKKyAgICAgICAgLyogUmVkdWNlIHRoaXMgdG8gYSBoYXNoIG9mIGFub3RoZXIgb2JqZWN0LiAqLworICAgICAgICBpZiAobiA9PSBPRkZTRVRfTkFJVkUpCisgICAgICAgICAgICB0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilzZWxmLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgZGF5czsKKyAgICAgICAgICAgIGludCBzZWNvbmRzOwogCi0JCQlhc3NlcnQobiA9PSBPRkZTRVRfQVdBUkUpOwotCQkJYXNzZXJ0KEhBU1RaSU5GTyhzZWxmKSk7Ci0JCQlkYXlzID0geW1kX3RvX29yZChHRVRfWUVBUihzZWxmKSwKLQkJCQkJICBHRVRfTU9OVEgoc2VsZiksCi0JCQkJCSAgR0VUX0RBWShzZWxmKSk7Ci0JCQlzZWNvbmRzID0gREFURV9HRVRfSE9VUihzZWxmKSAqIDM2MDAgKwotCQkJCSAgKERBVEVfR0VUX01JTlVURShzZWxmKSAtIG9mZnNldCkgKiA2MCArCi0JCQkJICBEQVRFX0dFVF9TRUNPTkQoc2VsZik7Ci0JCQl0ZW1wID0gbmV3X2RlbHRhKGRheXMsCi0JCQkJCSBzZWNvbmRzLAotCQkJCQkgREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCi0JCQkJCSAxKTsKLQkJfQotCQlpZiAodGVtcCAhPSBOVUxMKSB7Ci0JCQlzZWxmLT5oYXNoY29kZSA9IFB5T2JqZWN0X0hhc2godGVtcCk7Ci0JCQlQeV9ERUNSRUYodGVtcCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHNlbGYtPmhhc2hjb2RlOworICAgICAgICAgICAgYXNzZXJ0KG4gPT0gT0ZGU0VUX0FXQVJFKTsKKyAgICAgICAgICAgIGFzc2VydChIQVNUWklORk8oc2VsZikpOworICAgICAgICAgICAgZGF5cyA9IHltZF90b19vcmQoR0VUX1lFQVIoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHNlbGYpKTsKKyAgICAgICAgICAgIHNlY29uZHMgPSBEQVRFX0dFVF9IT1VSKHNlbGYpICogMzYwMCArCisgICAgICAgICAgICAgICAgICAgICAgKERBVEVfR0VUX01JTlVURShzZWxmKSAtIG9mZnNldCkgKiA2MCArCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpOworICAgICAgICAgICAgdGVtcCA9IG5ld19kZWx0YShkYXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRlbXAgIT0gTlVMTCkgeworICAgICAgICAgICAgc2VsZi0+aGFzaGNvZGUgPSBQeU9iamVjdF9IYXNoKHRlbXApOworICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZWxmLT5oYXNoY29kZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3JlcGxhY2UoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqY2xvbmU7Ci0JUHlPYmplY3QgKnR1cGxlOwotCWludCB5ID0gR0VUX1lFQVIoc2VsZik7Ci0JaW50IG0gPSBHRVRfTU9OVEgoc2VsZik7Ci0JaW50IGQgPSBHRVRfREFZKHNlbGYpOwotCWludCBoaCA9IERBVEVfR0VUX0hPVVIoc2VsZik7Ci0JaW50IG1tID0gREFURV9HRVRfTUlOVVRFKHNlbGYpOwotCWludCBzcyA9IERBVEVfR0VUX1NFQ09ORChzZWxmKTsKLQlpbnQgdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKLQlQeU9iamVjdCAqdHppbmZvID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqY2xvbmU7CisgICAgUHlPYmplY3QgKnR1cGxlOworICAgIGludCB5ID0gR0VUX1lFQVIoc2VsZik7CisgICAgaW50IG0gPSBHRVRfTU9OVEgoc2VsZik7CisgICAgaW50IGQgPSBHRVRfREFZKHNlbGYpOworICAgIGludCBoaCA9IERBVEVfR0VUX0hPVVIoc2VsZik7CisgICAgaW50IG1tID0gREFURV9HRVRfTUlOVVRFKHNlbGYpOworICAgIGludCBzcyA9IERBVEVfR0VUX1NFQ09ORChzZWxmKTsKKyAgICBpbnQgdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKKyAgICBQeU9iamVjdCAqdHppbmZvID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpaWlpTzpyZXBsYWNlIiwKLQkJCQkJICBkYXRldGltZV9rd3MsCi0JCQkJCSAgJnksICZtLCAmZCwgJmhoLCAmbW0sICZzcywgJnVzLAotCQkJCQkgICZ0emluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQl0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaWlpaWlPIiwgeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbyk7Ci0JaWYgKHR1cGxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWNsb25lID0gZGF0ZXRpbWVfbmV3KFB5X1RZUEUoc2VsZiksIHR1cGxlLCBOVUxMKTsKLQlQeV9ERUNSRUYodHVwbGUpOwotCXJldHVybiBjbG9uZTsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpaWlpaU86cmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lX2t3cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnksICZtLCAmZCwgJmhoLCAmbW0sICZzcywgJnVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHppbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWlpaWlpTyIsIHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8pOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjbG9uZSA9IGRhdGV0aW1lX25ldyhQeV9UWVBFKHNlbGYpLCB0dXBsZSwgTlVMTCk7CisgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICByZXR1cm4gY2xvbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9hc3RpbWV6b25lKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JaW50IHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JaW50IG9mZnNldCwgbm9uZTsKKyAgICBpbnQgeSwgbSwgZCwgaGgsIG1tLCBzcywgdXM7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgb2Zmc2V0LCBub25lOwogCi0JUHlPYmplY3QgKnR6aW5mbzsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsidHoiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqdHppbmZvOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJ0eiIsIE5VTEx9OwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiTyE6YXN0aW1lem9uZSIsIGtleXdvcmRzLAotCQkJCQkgICZQeURhdGVUaW1lX1RaSW5mb1R5cGUsICZ0emluZm8pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPITphc3RpbWV6b25lIiwga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeURhdGVUaW1lX1RaSW5mb1R5cGUsICZ0emluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAoIUhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKLSAgICAgICAgCWdvdG8gTmVlZEF3YXJlOworICAgIGlmICghSEFTVFpJTkZPKHNlbGYpIHx8IHNlbGYtPnR6aW5mbyA9PSBQeV9Ob25lKQorICAgICAgICBnb3RvIE5lZWRBd2FyZTsKIAotICAgICAgICAvKiBDb252ZXJzaW9uIHRvIHNlbGYncyBvd24gdGltZSB6b25lIGlzIGEgTk9QLiAqLwotCWlmIChzZWxmLT50emluZm8gPT0gdHppbmZvKSB7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Ci0JfQorICAgIC8qIENvbnZlcnNpb24gdG8gc2VsZidzIG93biB0aW1lIHpvbmUgaXMgYSBOT1AuICovCisgICAgaWYgKHNlbGYtPnR6aW5mbyA9PSB0emluZm8pIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICB9CiAKLSAgICAgICAgLyogQ29udmVydCBzZWxmIHRvIFVUQy4gKi8KLSAgICAgICAgb2Zmc2V0ID0gY2FsbF91dGNvZmZzZXQoc2VsZi0+dHppbmZvLCAoUHlPYmplY3QgKilzZWxmLCAmbm9uZSk7Ci0gICAgICAgIGlmIChvZmZzZXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgCXJldHVybiBOVUxMOwotICAgICAgICBpZiAobm9uZSkKLSAgICAgICAgCWdvdG8gTmVlZEF3YXJlOworICAgIC8qIENvbnZlcnQgc2VsZiB0byBVVEMuICovCisgICAgb2Zmc2V0ID0gY2FsbF91dGNvZmZzZXQoc2VsZi0+dHppbmZvLCAoUHlPYmplY3QgKilzZWxmLCAmbm9uZSk7CisgICAgaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobm9uZSkKKyAgICAgICAgZ290byBOZWVkQXdhcmU7CiAKLQl5ID0gR0VUX1lFQVIoc2VsZik7Ci0JbSA9IEdFVF9NT05USChzZWxmKTsKLQlkID0gR0VUX0RBWShzZWxmKTsKLQloaCA9IERBVEVfR0VUX0hPVVIoc2VsZik7Ci0JbW0gPSBEQVRFX0dFVF9NSU5VVEUoc2VsZik7Ci0Jc3MgPSBEQVRFX0dFVF9TRUNPTkQoc2VsZik7Ci0JdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKKyAgICB5ID0gR0VUX1lFQVIoc2VsZik7CisgICAgbSA9IEdFVF9NT05USChzZWxmKTsKKyAgICBkID0gR0VUX0RBWShzZWxmKTsKKyAgICBoaCA9IERBVEVfR0VUX0hPVVIoc2VsZik7CisgICAgbW0gPSBEQVRFX0dFVF9NSU5VVEUoc2VsZik7CisgICAgc3MgPSBEQVRFX0dFVF9TRUNPTkQoc2VsZik7CisgICAgdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKIAotCW1tIC09IG9mZnNldDsKLQlpZiAoKG1tIDwgMCB8fCBtbSA+PSA2MCkgJiYKLQkgICAgbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cykgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBtbSAtPSBvZmZzZXQ7CisgICAgaWYgKChtbSA8IDAgfHwgbW0gPj0gNjApICYmCisgICAgICAgIG5vcm1hbGl6ZV9kYXRldGltZSgmeSwgJm0sICZkLCAmaGgsICZtbSwgJnNzLCAmdXMpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBBdHRhY2ggbmV3IHR6aW5mbyBhbmQgbGV0IGZyb211dGMoKSBkbyB0aGUgcmVzdC4gKi8KLQlyZXN1bHQgPSBuZXdfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbyk7Ci0JaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp0ZW1wID0gcmVzdWx0OworICAgIC8qIEF0dGFjaCBuZXcgdHppbmZvIGFuZCBsZXQgZnJvbXV0YygpIGRvIHRoZSByZXN0LiAqLworICAgIHJlc3VsdCA9IG5ld19kYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKTsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnRlbXAgPSByZXN1bHQ7CiAKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0emluZm8sICJmcm9tdXRjIiwgIk8iLCB0ZW1wKTsKLQkJUHlfREVDUkVGKHRlbXApOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR6aW5mbywgImZyb211dGMiLCAiTyIsIHRlbXApOworICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiAKIE5lZWRBd2FyZToKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFzdGltZXpvbmUoKSBjYW5ub3QgYmUgYXBwbGllZCB0byAiCi0JCQkJCSAgImEgbmFpdmUgZGF0ZXRpbWUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFzdGltZXpvbmUoKSBjYW5ub3QgYmUgYXBwbGllZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIG5haXZlIGRhdGV0aW1lIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV90aW1ldHVwbGUoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKLQlpbnQgZHN0ZmxhZyA9IC0xOworICAgIGludCBkc3RmbGFnID0gLTE7CiAKLQlpZiAoSEFTVFpJTkZPKHNlbGYpICYmIHNlbGYtPnR6aW5mbyAhPSBQeV9Ob25lKSB7Ci0JCWludCBub25lOworICAgIGlmIChIQVNUWklORk8oc2VsZikgJiYgc2VsZi0+dHppbmZvICE9IFB5X05vbmUpIHsKKyAgICAgICAgaW50IG5vbmU7CiAKLQkJZHN0ZmxhZyA9IGNhbGxfZHN0KHNlbGYtPnR6aW5mbywgKFB5T2JqZWN0ICopc2VsZiwgJm5vbmUpOwotCQlpZiAoZHN0ZmxhZyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGRzdGZsYWcgPSBjYWxsX2RzdChzZWxmLT50emluZm8sIChQeU9iamVjdCAqKXNlbGYsICZub25lKTsKKyAgICAgICAgaWYgKGRzdGZsYWcgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCWlmIChub25lKQotCQkJZHN0ZmxhZyA9IC0xOwotCQllbHNlIGlmIChkc3RmbGFnICE9IDApCi0JCQlkc3RmbGFnID0gMTsKKyAgICAgICAgaWYgKG5vbmUpCisgICAgICAgICAgICBkc3RmbGFnID0gLTE7CisgICAgICAgIGVsc2UgaWYgKGRzdGZsYWcgIT0gMCkKKyAgICAgICAgICAgIGRzdGZsYWcgPSAxOwogCi0JfQotCXJldHVybiBidWlsZF9zdHJ1Y3RfdGltZShHRVRfWUVBUihzZWxmKSwKLQkJCQkgR0VUX01PTlRIKHNlbGYpLAotCQkJCSBHRVRfREFZKHNlbGYpLAotCQkJCSBEQVRFX0dFVF9IT1VSKHNlbGYpLAotCQkJCSBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCi0JCQkJIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKLQkJCQkgZHN0ZmxhZyk7CisgICAgfQorICAgIHJldHVybiBidWlsZF9zdHJ1Y3RfdGltZShHRVRfWUVBUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01PTlRIKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ZmxhZyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9nZXRkYXRlKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYpCiB7Ci0JcmV0dXJuIG5ld19kYXRlKEdFVF9ZRUFSKHNlbGYpLAotCQkJR0VUX01PTlRIKHNlbGYpLAotCQkJR0VUX0RBWShzZWxmKSk7CisgICAgcmV0dXJuIG5ld19kYXRlKEdFVF9ZRUFSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgoc2VsZiksCisgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfZ2V0dGltZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCXJldHVybiBuZXdfdGltZShEQVRFX0dFVF9IT1VSKHNlbGYpLAotCQkJREFURV9HRVRfTUlOVVRFKHNlbGYpLAotCQkJREFURV9HRVRfU0VDT05EKHNlbGYpLAotCQkJREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCi0JCQlQeV9Ob25lKTsKKyAgICByZXR1cm4gbmV3X3RpbWUoREFURV9HRVRfSE9VUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2dldHRpbWV0eihQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCXJldHVybiBuZXdfdGltZShEQVRFX0dFVF9IT1VSKHNlbGYpLAotCQkJREFURV9HRVRfTUlOVVRFKHNlbGYpLAotCQkJREFURV9HRVRfU0VDT05EKHNlbGYpLAotCQkJREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCi0JCQlIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lKTsKKyAgICByZXR1cm4gbmV3X3RpbWUoREFURV9HRVRfSE9VUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3V0Y3RpbWV0dXBsZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCWludCB5ID0gR0VUX1lFQVIoc2VsZik7Ci0JaW50IG0gPSBHRVRfTU9OVEgoc2VsZik7Ci0JaW50IGQgPSBHRVRfREFZKHNlbGYpOwotCWludCBoaCA9IERBVEVfR0VUX0hPVVIoc2VsZik7Ci0JaW50IG1tID0gREFURV9HRVRfTUlOVVRFKHNlbGYpOwotCWludCBzcyA9IERBVEVfR0VUX1NFQ09ORChzZWxmKTsKLQlpbnQgdXMgPSAwOwkvKiBtaWNyb3NlY29uZHMgYXJlIGlnbm9yZWQgaW4gYSB0aW1ldHVwbGUgKi8KLQlpbnQgb2Zmc2V0ID0gMDsKKyAgICBpbnQgeSA9IEdFVF9ZRUFSKHNlbGYpOworICAgIGludCBtID0gR0VUX01PTlRIKHNlbGYpOworICAgIGludCBkID0gR0VUX0RBWShzZWxmKTsKKyAgICBpbnQgaGggPSBEQVRFX0dFVF9IT1VSKHNlbGYpOworICAgIGludCBtbSA9IERBVEVfR0VUX01JTlVURShzZWxmKTsKKyAgICBpbnQgc3MgPSBEQVRFX0dFVF9TRUNPTkQoc2VsZik7CisgICAgaW50IHVzID0gMDsgICAgICAgICAvKiBtaWNyb3NlY29uZHMgYXJlIGlnbm9yZWQgaW4gYSB0aW1ldHVwbGUgKi8KKyAgICBpbnQgb2Zmc2V0ID0gMDsKIAotCWlmIChIQVNUWklORk8oc2VsZikgJiYgc2VsZi0+dHppbmZvICE9IFB5X05vbmUpIHsKLQkJaW50IG5vbmU7CisgICAgaWYgKEhBU1RaSU5GTyhzZWxmKSAmJiBzZWxmLT50emluZm8gIT0gUHlfTm9uZSkgeworICAgICAgICBpbnQgbm9uZTsKIAotCQlvZmZzZXQgPSBjYWxsX3V0Y29mZnNldChzZWxmLT50emluZm8sIChQeU9iamVjdCAqKXNlbGYsICZub25lKTsKLQkJaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIEV2ZW4gaWYgb2Zmc2V0IGlzIDAsIGRvbid0IGNhbGwgdGltZXR1cGxlKCkgLS0gdG1faXNkc3Qgc2hvdWxkIGJlCi0JICogMCBpbiBhIFVUQyB0aW1ldHVwbGUgcmVnYXJkbGVzcyBvZiB3aGF0IGRzdCgpIHNheXMuCi0JICovCi0JaWYgKG9mZnNldCkgewotCQkvKiBTdWJ0cmFjdCBvZmZzZXQgbWludXRlcyAmIG5vcm1hbGl6ZS4gKi8KLQkJaW50IHN0YXQ7CisgICAgICAgIG9mZnNldCA9IGNhbGxfdXRjb2Zmc2V0KHNlbGYtPnR6aW5mbywgKFB5T2JqZWN0ICopc2VsZiwgJm5vbmUpOworICAgICAgICBpZiAob2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogRXZlbiBpZiBvZmZzZXQgaXMgMCwgZG9uJ3QgY2FsbCB0aW1ldHVwbGUoKSAtLSB0bV9pc2RzdCBzaG91bGQgYmUKKyAgICAgKiAwIGluIGEgVVRDIHRpbWV0dXBsZSByZWdhcmRsZXNzIG9mIHdoYXQgZHN0KCkgc2F5cy4KKyAgICAgKi8KKyAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIC8qIFN1YnRyYWN0IG9mZnNldCBtaW51dGVzICYgbm9ybWFsaXplLiAqLworICAgICAgICBpbnQgc3RhdDsKIAotCQltbSAtPSBvZmZzZXQ7Ci0JCXN0YXQgPSBub3JtYWxpemVfZGF0ZXRpbWUoJnksICZtLCAmZCwgJmhoLCAmbW0sICZzcywgJnVzKTsKLQkJaWYgKHN0YXQgPCAwKSB7Ci0JCQkvKiBBdCB0aGUgZWRnZXMsIGl0J3MgcG9zc2libGUgd2Ugb3ZlcmZsb3dlZAotCQkJICogYmV5b25kIE1JTllFQVIgb3IgTUFYWUVBUi4KLQkJCSAqLwotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gYnVpbGRfc3RydWN0X3RpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgMCk7CisgICAgICAgIG1tIC09IG9mZnNldDsKKyAgICAgICAgc3RhdCA9IG5vcm1hbGl6ZV9kYXRldGltZSgmeSwgJm0sICZkLCAmaGgsICZtbSwgJnNzLCAmdXMpOworICAgICAgICBpZiAoc3RhdCA8IDApIHsKKyAgICAgICAgICAgIC8qIEF0IHRoZSBlZGdlcywgaXQncyBwb3NzaWJsZSB3ZSBvdmVyZmxvd2VkCisgICAgICAgICAgICAgKiBiZXlvbmQgTUlOWUVBUiBvciBNQVhZRUFSLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBidWlsZF9zdHJ1Y3RfdGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCAwKTsKIH0KIAogLyogUGlja2xlIHN1cHBvcnQsIGEgc2ltcGxlIHVzZSBvZiBfX3JlZHVjZV9fLiAqLwpAQCAtNDU2OSwxMDIgKzQ1NjksMTAyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfZ2V0c3RhdGUoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKLQlQeU9iamVjdCAqYmFzZXN0YXRlOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpiYXNlc3RhdGU7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLQliYXNlc3RhdGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCi0JCQkJCSAgX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkUpOwotCWlmIChiYXNlc3RhdGUgIT0gTlVMTCkgewotCQlpZiAoISBIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCi0JCQlyZXN1bHQgPSBQeVR1cGxlX1BhY2soMSwgYmFzZXN0YXRlKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDIsIGJhc2VzdGF0ZSwgc2VsZi0+dHppbmZvKTsKLQkJUHlfREVDUkVGKGJhc2VzdGF0ZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgYmFzZXN0YXRlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSk7CisgICAgaWYgKGJhc2VzdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghIEhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfUGFjaygxLCBiYXNlc3RhdGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBQeVR1cGxlX1BhY2soMiwgYmFzZXN0YXRlLCBzZWxmLT50emluZm8pOworICAgICAgICBQeV9ERUNSRUYoYmFzZXN0YXRlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3JlZHVjZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgZGF0ZXRpbWVfZ2V0c3RhdGUoc2VsZikpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgZGF0ZXRpbWVfZ2V0c3RhdGUoc2VsZikpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGF0ZXRpbWVfbWV0aG9kc1tdID0gewogCi0JLyogQ2xhc3MgbWV0aG9kczogKi8KKyAgICAvKiBDbGFzcyBtZXRob2RzOiAqLwogCi0JeyJub3ciLCAgICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV9ub3csCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX0NMQVNTLAotCSBQeURvY19TVFIoIlt0el0gLT4gbmV3IGRhdGV0aW1lIHdpdGggdHoncyBsb2NhbCBkYXkgYW5kIHRpbWUuIil9LAorICAgIHsibm93IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfbm93LAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTIHwgTUVUSF9DTEFTUywKKyAgICAgUHlEb2NfU1RSKCJbdHpdIC0+IG5ldyBkYXRldGltZSB3aXRoIHR6J3MgbG9jYWwgZGF5IGFuZCB0aW1lLiIpfSwKIAotCXsidXRjbm93IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdXRjbm93LAotCSBNRVRIX05PQVJHUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigiUmV0dXJuIGEgbmV3IGRhdGV0aW1lIHJlcHJlc2VudGluZyBVVEMgZGF5IGFuZCB0aW1lLiIpfSwKKyAgICB7InV0Y25vdyIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3V0Y25vdywKKyAgICAgTUVUSF9OT0FSR1MgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoIlJldHVybiBhIG5ldyBkYXRldGltZSByZXByZXNlbnRpbmcgVVRDIGRheSBhbmQgdGltZS4iKX0sCiAKLQl7ImZyb210aW1lc3RhbXAiLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZnJvbXRpbWVzdGFtcCwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigidGltZXN0YW1wWywgdHpdIC0+IHR6J3MgbG9jYWwgdGltZSBmcm9tIFBPU0lYIHRpbWVzdGFtcC4iKX0sCisgICAgeyJmcm9tdGltZXN0YW1wIiwgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2Zyb210aW1lc3RhbXAsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoInRpbWVzdGFtcFssIHR6XSAtPiB0eidzIGxvY2FsIHRpbWUgZnJvbSBQT1NJWCB0aW1lc3RhbXAuIil9LAogCi0JeyJ1dGNmcm9tdGltZXN0YW1wIiwgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3V0Y2Zyb210aW1lc3RhbXAsCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigidGltZXN0YW1wIC0+IFVUQyBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wICIKLQkgCSAgICIobGlrZSB0aW1lLnRpbWUoKSkuIil9LAorICAgIHsidXRjZnJvbXRpbWVzdGFtcCIsIChQeUNGdW5jdGlvbilkYXRldGltZV91dGNmcm9tdGltZXN0YW1wLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoInRpbWVzdGFtcCAtPiBVVEMgZGF0ZXRpbWUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAiCisgICAgICAgICAgICAgICAiKGxpa2UgdGltZS50aW1lKCkpLiIpfSwKIAotCXsic3RycHRpbWUiLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfc3RycHRpbWUsCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigic3RyaW5nLCBmb3JtYXQgLT4gbmV3IGRhdGV0aW1lIHBhcnNlZCBmcm9tIGEgc3RyaW5nICIKLQkgCSAgICIobGlrZSB0aW1lLnN0cnB0aW1lKCkpLiIpfSwKKyAgICB7InN0cnB0aW1lIiwgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3N0cnB0aW1lLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoInN0cmluZywgZm9ybWF0IC0+IG5ldyBkYXRldGltZSBwYXJzZWQgZnJvbSBhIHN0cmluZyAiCisgICAgICAgICAgICAgICAiKGxpa2UgdGltZS5zdHJwdGltZSgpKS4iKX0sCiAKLQl7ImNvbWJpbmUiLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfY29tYmluZSwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigiZGF0ZSwgdGltZSAtPiBkYXRldGltZSB3aXRoIHNhbWUgZGF0ZSBhbmQgdGltZSBmaWVsZHMiKX0sCisgICAgeyJjb21iaW5lIiwgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2NvbWJpbmUsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoImRhdGUsIHRpbWUgLT4gZGF0ZXRpbWUgd2l0aCBzYW1lIGRhdGUgYW5kIHRpbWUgZmllbGRzIil9LAogCi0JLyogSW5zdGFuY2UgbWV0aG9kczogKi8KKyAgICAvKiBJbnN0YW5jZSBtZXRob2RzOiAqLwogCi0JeyJkYXRlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZ2V0ZGF0ZSwgTUVUSF9OT0FSR1MsCi0gICAgICAgICBQeURvY19TVFIoIlJldHVybiBkYXRlIG9iamVjdCB3aXRoIHNhbWUgeWVhciwgbW9udGggYW5kIGRheS4iKX0sCisgICAgeyJkYXRlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZ2V0ZGF0ZSwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIGRhdGUgb2JqZWN0IHdpdGggc2FtZSB5ZWFyLCBtb250aCBhbmQgZGF5LiIpfSwKIAotCXsidGltZSIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2dldHRpbWUsIE1FVEhfTk9BUkdTLAotICAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGltZSBvYmplY3Qgd2l0aCBzYW1lIHRpbWUgYnV0IHdpdGggdHppbmZvPU5vbmUuIil9LAorICAgIHsidGltZSIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2dldHRpbWUsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiB0aW1lIG9iamVjdCB3aXRoIHNhbWUgdGltZSBidXQgd2l0aCB0emluZm89Tm9uZS4iKX0sCiAKLQl7InRpbWV0eiIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2dldHRpbWV0eiwgTUVUSF9OT0FSR1MsCi0gICAgICAgICBQeURvY19TVFIoIlJldHVybiB0aW1lIG9iamVjdCB3aXRoIHNhbWUgdGltZSBhbmQgdHppbmZvLiIpfSwKKyAgICB7InRpbWV0eiIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2dldHRpbWV0eiwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgb2JqZWN0IHdpdGggc2FtZSB0aW1lIGFuZCB0emluZm8uIil9LAogCi0JeyJjdGltZSIsICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV9jdGltZSwJTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLiIpfSwKKyAgICB7ImN0aW1lIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2N0aW1lLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLiIpfSwKIAotCXsidGltZXR1cGxlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdGltZXR1cGxlLCBNRVRIX05PQVJHUywKLSAgICAgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgdHVwbGUsIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLiIpfSwKKyAgICB7InRpbWV0dXBsZSIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3RpbWV0dXBsZSwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgdHVwbGUsIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLiIpfSwKIAotCXsidXRjdGltZXR1cGxlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdXRjdGltZXR1cGxlLCBNRVRIX05PQVJHUywKLSAgICAgICAgIFB5RG9jX1NUUigiUmV0dXJuIFVUQyB0aW1lIHR1cGxlLCBjb21wYXRpYmxlIHdpdGggdGltZS5sb2NhbHRpbWUoKS4iKX0sCisgICAgeyJ1dGN0aW1ldHVwbGUiLCAgIChQeUNGdW5jdGlvbilkYXRldGltZV91dGN0aW1ldHVwbGUsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBVVEMgdGltZSB0dXBsZSwgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuIil9LAogCi0JeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbilkYXRldGltZV9pc29mb3JtYXQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigiW3NlcF0gLT4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgIgotCSAJICAgIllZWVktTU0tRERUSEg6TU06U1NbLm1tbW1tbV1bK0hIOk1NXS5cblxuIgotCSAJICAgInNlcCBpcyB1c2VkIHRvIHNlcGFyYXRlIHRoZSB5ZWFyIGZyb20gdGhlIHRpbWUsIGFuZCAiCi0JIAkgICAiZGVmYXVsdHMgdG8gJ1QnLiIpfSwKKyAgICB7Imlzb2Zvcm1hdCIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2lzb2Zvcm1hdCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgUHlEb2NfU1RSKCJbc2VwXSAtPiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCAiCisgICAgICAgICAgICAgICAiWVlZWS1NTS1ERFRISDpNTTpTU1subW1tbW1tXVsrSEg6TU1dLlxuXG4iCisgICAgICAgICAgICAgICAic2VwIGlzIHVzZWQgdG8gc2VwYXJhdGUgdGhlIHllYXIgZnJvbSB0aGUgdGltZSwgYW5kICIKKyAgICAgICAgICAgICAgICJkZWZhdWx0cyB0byAnVCcuIil9LAogCi0JeyJ1dGNvZmZzZXQiLAkoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdXRjb2Zmc2V0LCBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8udXRjb2Zmc2V0KHNlbGYpLiIpfSwKKyAgICB7InV0Y29mZnNldCIsICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV91dGNvZmZzZXQsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby51dGNvZmZzZXQoc2VsZikuIil9LAogCi0JeyJ0em5hbWUiLAkoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdHpuYW1lLAlNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8udHpuYW1lKHNlbGYpLiIpfSwKKyAgICB7InR6bmFtZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV90em5hbWUsICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLnR6bmFtZShzZWxmKS4iKX0sCiAKLQl7ImRzdCIsCQkoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZHN0LCBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8uZHN0KHNlbGYpLiIpfSwKKyAgICB7ImRzdCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV9kc3QsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby5kc3Qoc2VsZikuIil9LAogCi0JeyJyZXBsYWNlIiwgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV9yZXBsYWNlLAlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCSBQeURvY19TVFIoIlJldHVybiBkYXRldGltZSB3aXRoIG5ldyBzcGVjaWZpZWQgZmllbGRzLiIpfSwKKyAgICB7InJlcGxhY2UiLCAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3JlcGxhY2UsICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gZGF0ZXRpbWUgd2l0aCBuZXcgc3BlY2lmaWVkIGZpZWxkcy4iKX0sCiAKLQl7ImFzdGltZXpvbmUiLCAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2FzdGltZXpvbmUsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigidHogLT4gY29udmVydCB0byBsb2NhbCB0aW1lIGluIG5ldyB0aW1lem9uZSB0elxuIil9LAorICAgIHsiYXN0aW1lem9uZSIsICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfYXN0aW1lem9uZSwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgUHlEb2NfU1RSKCJ0eiAtPiBjb252ZXJ0IHRvIGxvY2FsIHRpbWUgaW4gbmV3IHRpbWV6b25lIHR6XG4iKX0sCiAKLQl7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfcmVkdWNlLCAgICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiX19yZWR1Y2VfXygpIC0+IChjbHMsIHN0YXRlKSIpfSwKKyAgICB7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfcmVkdWNlLCAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiX19yZWR1Y2VfXygpIC0+IChjbHMsIHN0YXRlKSIpfSwKIAotCXtOVUxMLAlOVUxMfQorICAgIHtOVUxMLCAgICAgIE5VTEx9CiB9OwogCiBzdGF0aWMgY2hhciBkYXRldGltZV9kb2NbXSA9CkBAIC00Njc0LDYxICs0Njc0LDYxIEBACiBpbnN0YW5jZSBvZiBhIHR6aW5mbyBzdWJjbGFzcy4gVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgbWF5IGJlIGludHMgb3IgbG9uZ3MuXG4iKTsKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBkYXRldGltZV9hc19udW1iZXIgPSB7Ci0JZGF0ZXRpbWVfYWRkLAkJCQkvKiBuYl9hZGQgKi8KLQlkYXRldGltZV9zdWJ0cmFjdCwJCQkvKiBuYl9zdWJ0cmFjdCAqLwotCTAsCQkJCQkvKiBuYl9tdWx0aXBseSAqLwotCTAsCQkJCQkvKiBuYl9kaXZpZGUgKi8KLQkwLAkJCQkJLyogbmJfcmVtYWluZGVyICovCi0JMCwJCQkJCS8qIG5iX2Rpdm1vZCAqLwotCTAsCQkJCQkvKiBuYl9wb3dlciAqLwotCTAsCQkJCQkvKiBuYl9uZWdhdGl2ZSAqLwotCTAsCQkJCQkvKiBuYl9wb3NpdGl2ZSAqLwotCTAsCQkJCQkvKiBuYl9hYnNvbHV0ZSAqLwotCTAsCQkJCQkvKiBuYl9ub256ZXJvICovCisgICAgZGF0ZXRpbWVfYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICBkYXRldGltZV9zdWJ0cmFjdCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3N1YnRyYWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9yZW1haW5kZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25lZ2F0aXZlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25vbnplcm8gKi8KIH07CiAKIHN0YXRpY2hlcmUgUHlUeXBlT2JqZWN0IFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsCQkJCQkvKiBvYl9zaXplICovCi0JImRhdGV0aW1lLmRhdGV0aW1lIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5RGF0ZVRpbWVfRGF0ZVRpbWUpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3IpZGF0ZXRpbWVfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZGF0ZXRpbWVfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkmZGF0ZXRpbWVfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWRhdGV0aW1lX2hhc2gsCQkvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgIAkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpZGF0ZXRpbWVfc3RyLAkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLSAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwJCQkvKiB0cF9mbGFncyAqLwotCWRhdGV0aW1lX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKWRhdGV0aW1lX3JpY2hjb21wYXJlLAkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGF0ZXRpbWVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlkYXRldGltZV9nZXRzZXQsCQkJLyogdHBfZ2V0c2V0ICovCi0JJlB5RGF0ZVRpbWVfRGF0ZVR5cGUsCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JZGF0ZXRpbWVfYWxsb2MsCQkJCS8qIHRwX2FsbG9jICovCi0JZGF0ZXRpbWVfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICJkYXRldGltZS5kYXRldGltZSIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeURhdGVUaW1lX0RhdGVUaW1lKSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIChkZXN0cnVjdG9yKWRhdGV0aW1lX2RlYWxsb2MsICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpZGF0ZXRpbWVfcmVwciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmZGF0ZXRpbWVfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpZGF0ZXRpbWVfaGFzaCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpZGF0ZXRpbWVfc3RyLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBkYXRldGltZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKWRhdGV0aW1lX3JpY2hjb21wYXJlLCAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZGF0ZXRpbWVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgZGF0ZXRpbWVfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAmUHlEYXRlVGltZV9EYXRlVHlwZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgZGF0ZXRpbWVfYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGRhdGV0aW1lX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ3MzYsMTkxICs0NzM2LDE5MSBAQAogICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMfQorICAgIHtOVUxMLCBOVUxMfQogfTsKIAogLyogQyBBUEkuICBDbGllbnRzIGdldCBhdCB0aGlzIHZpYSBQeURhdGVUaW1lX0lNUE9SVCwgZGVmaW5lZCBpbgogICogZGF0ZXRpbWUuaC4KICAqLwogc3RhdGljIFB5RGF0ZVRpbWVfQ0FQSSBDQVBJID0gewotICAgICAgICAmUHlEYXRlVGltZV9EYXRlVHlwZSwKLSAgICAgICAgJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlLAotICAgICAgICAmUHlEYXRlVGltZV9UaW1lVHlwZSwKLSAgICAgICAgJlB5RGF0ZVRpbWVfRGVsdGFUeXBlLAotICAgICAgICAmUHlEYXRlVGltZV9UWkluZm9UeXBlLAotICAgICAgICBuZXdfZGF0ZV9leCwKLSAgICAgICAgbmV3X2RhdGV0aW1lX2V4LAotICAgICAgICBuZXdfdGltZV9leCwKLSAgICAgICAgbmV3X2RlbHRhX2V4LAotICAgICAgICBkYXRldGltZV9mcm9tdGltZXN0YW1wLAotICAgICAgICBkYXRlX2Zyb210aW1lc3RhbXAKKyAgICAmUHlEYXRlVGltZV9EYXRlVHlwZSwKKyAgICAmUHlEYXRlVGltZV9EYXRlVGltZVR5cGUsCisgICAgJlB5RGF0ZVRpbWVfVGltZVR5cGUsCisgICAgJlB5RGF0ZVRpbWVfRGVsdGFUeXBlLAorICAgICZQeURhdGVUaW1lX1RaSW5mb1R5cGUsCisgICAgbmV3X2RhdGVfZXgsCisgICAgbmV3X2RhdGV0aW1lX2V4LAorICAgIG5ld190aW1lX2V4LAorICAgIG5ld19kZWx0YV9leCwKKyAgICBkYXRldGltZV9mcm9tdGltZXN0YW1wLAorICAgIGRhdGVfZnJvbXRpbWVzdGFtcAogfTsKIAogCiBQeU1PRElOSVRfRlVOQwogaW5pdGRhdGV0aW1lKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CS8qIGEgbW9kdWxlIG9iamVjdCAqLwotCVB5T2JqZWN0ICpkOwkvKiBpdHMgZGljdCAqLwotCVB5T2JqZWN0ICp4OworICAgIFB5T2JqZWN0ICptOyAgICAgICAgLyogYSBtb2R1bGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKmQ7ICAgICAgICAvKiBpdHMgZGljdCAqLworICAgIFB5T2JqZWN0ICp4OwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJkYXRldGltZSIsIG1vZHVsZV9tZXRob2RzLAotCQkJICAgIkZhc3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRhdGV0aW1lIHR5cGUuIik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiZGF0ZXRpbWUiLCBtb2R1bGVfbWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIkZhc3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRhdGV0aW1lIHR5cGUuIik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlEYXRlVGltZV9EYXRlVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlEYXRlVGltZV9EYXRlVGltZVR5cGUpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChQeVR5cGVfUmVhZHkoJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKSA8IDApCi0JCXJldHVybjsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeURhdGVUaW1lX1RpbWVUeXBlKSA8IDApCi0JCXJldHVybjsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeURhdGVUaW1lX1RaSW5mb1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RGF0ZVRpbWVfRGF0ZVR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeURhdGVUaW1lX0RlbHRhVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlEYXRlVGltZV9UaW1lVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlEYXRlVGltZV9UWkluZm9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIHRpbWVkZWx0YSB2YWx1ZXMgKi8KLQlkID0gUHlEYXRlVGltZV9EZWx0YVR5cGUudHBfZGljdDsKKyAgICAvKiB0aW1lZGVsdGEgdmFsdWVzICovCisgICAgZCA9IFB5RGF0ZVRpbWVfRGVsdGFUeXBlLnRwX2RpY3Q7CiAKLQl4ID0gbmV3X2RlbHRhKDAsIDAsIDEsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld19kZWx0YSgwLCAwLCAxLCAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJyZXNvbHV0aW9uIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JeCA9IG5ld19kZWx0YSgtTUFYX0RFTFRBX0RBWVMsIDAsIDAsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RlbHRhKC1NQVhfREVMVEFfREFZUywgMCwgMCwgMCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWluIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JeCA9IG5ld19kZWx0YShNQVhfREVMVEFfREFZUywgMjQqMzYwMC0xLCAxMDAwMDAwLTEsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RlbHRhKE1BWF9ERUxUQV9EQVlTLCAyNCozNjAwLTEsIDEwMDAwMDAtMSwgMCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWF4IiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JLyogZGF0ZSB2YWx1ZXMgKi8KLQlkID0gUHlEYXRlVGltZV9EYXRlVHlwZS50cF9kaWN0OworICAgIC8qIGRhdGUgdmFsdWVzICovCisgICAgZCA9IFB5RGF0ZVRpbWVfRGF0ZVR5cGUudHBfZGljdDsKIAotCXggPSBuZXdfZGF0ZSgxLCAxLCAxKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtaW4iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld19kYXRlKDEsIDEsIDEpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKIAotCXggPSBuZXdfZGF0ZShNQVhZRUFSLCAxMiwgMzEpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RhdGUoTUFYWUVBUiwgMTIsIDMxKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtYXgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQl4ID0gbmV3X2RlbHRhKDEsIDAsIDAsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld19kZWx0YSgxLCAwLCAwLCAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJyZXNvbHV0aW9uIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JLyogdGltZSB2YWx1ZXMgKi8KLQlkID0gUHlEYXRlVGltZV9UaW1lVHlwZS50cF9kaWN0OworICAgIC8qIHRpbWUgdmFsdWVzICovCisgICAgZCA9IFB5RGF0ZVRpbWVfVGltZVR5cGUudHBfZGljdDsKIAotCXggPSBuZXdfdGltZSgwLCAwLCAwLCAwLCBQeV9Ob25lKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtaW4iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld190aW1lKDAsIDAsIDAsIDAsIFB5X05vbmUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKIAotCXggPSBuZXdfdGltZSgyMywgNTksIDU5LCA5OTk5OTksIFB5X05vbmUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X3RpbWUoMjMsIDU5LCA1OSwgOTk5OTk5LCBQeV9Ob25lKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtYXgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQl4ID0gbmV3X2RlbHRhKDAsIDAsIDEsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld19kZWx0YSgwLCAwLCAxLCAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJyZXNvbHV0aW9uIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JLyogZGF0ZXRpbWUgdmFsdWVzICovCi0JZCA9IFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlLnRwX2RpY3Q7CisgICAgLyogZGF0ZXRpbWUgdmFsdWVzICovCisgICAgZCA9IFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlLnRwX2RpY3Q7CiAKLQl4ID0gbmV3X2RhdGV0aW1lKDEsIDEsIDEsIDAsIDAsIDAsIDAsIFB5X05vbmUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RhdGV0aW1lKDEsIDEsIDEsIDAsIDAsIDAsIDAsIFB5X05vbmUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKIAotCXggPSBuZXdfZGF0ZXRpbWUoTUFYWUVBUiwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTk5OTksIFB5X05vbmUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RhdGV0aW1lKE1BWFlFQVIsIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5OTk5LCBQeV9Ob25lKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtYXgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQl4ID0gbmV3X2RlbHRhKDAsIDAsIDEsIDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IG5ld19kZWx0YSgwLCAwLCAxLCAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJyZXNvbHV0aW9uIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JLyogbW9kdWxlIGluaXRpYWxpemF0aW9uICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1JTllFQVIiLCBNSU5ZRUFSKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTUFYWUVBUiIsIE1BWFlFQVIpOworICAgIC8qIG1vZHVsZSBpbml0aWFsaXphdGlvbiAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNSU5ZRUFSIiwgTUlOWUVBUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1BWFlFQVIiLCBNQVhZRUFSKTsKIAotCVB5X0lOQ1JFRigmUHlEYXRlVGltZV9EYXRlVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkYXRlIiwgKFB5T2JqZWN0ICopICZQeURhdGVUaW1lX0RhdGVUeXBlKTsKKyAgICBQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfRGF0ZVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGF0ZSIsIChQeU9iamVjdCAqKSAmUHlEYXRlVGltZV9EYXRlVHlwZSk7CiAKLQlQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImRhdGV0aW1lIiwKLQkJCSAgIChQeU9iamVjdCAqKSZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSk7CisgICAgUHlfSU5DUkVGKCZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkYXRldGltZSIsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSk7CiAKLQlQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfVGltZVR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAidGltZSIsIChQeU9iamVjdCAqKSAmUHlEYXRlVGltZV9UaW1lVHlwZSk7CisgICAgUHlfSU5DUkVGKCZQeURhdGVUaW1lX1RpbWVUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInRpbWUiLCAoUHlPYmplY3QgKikgJlB5RGF0ZVRpbWVfVGltZVR5cGUpOwogCi0JUHlfSU5DUkVGKCZQeURhdGVUaW1lX0RlbHRhVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0aW1lZGVsdGEiLCAoUHlPYmplY3QgKikgJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKTsKKyAgICBQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInRpbWVkZWx0YSIsIChQeU9iamVjdCAqKSAmUHlEYXRlVGltZV9EZWx0YVR5cGUpOwogCi0JUHlfSU5DUkVGKCZQeURhdGVUaW1lX1RaSW5mb1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAidHppbmZvIiwgKFB5T2JqZWN0ICopICZQeURhdGVUaW1lX1RaSW5mb1R5cGUpOworICAgIFB5X0lOQ1JFRigmUHlEYXRlVGltZV9UWkluZm9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInR6aW5mbyIsIChQeU9iamVjdCAqKSAmUHlEYXRlVGltZV9UWkluZm9UeXBlKTsKIAotCXggPSBQeUNhcHN1bGVfTmV3KCZDQVBJLCBQeURhdGVUaW1lX0NBUFNVTEVfTkFNRSwgTlVMTCk7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGF0ZXRpbWVfQ0FQSSIsIHgpOworICAgIHggPSBQeUNhcHN1bGVfTmV3KCZDQVBJLCBQeURhdGVUaW1lX0NBUFNVTEVfTkFNRSwgTlVMTCk7CisgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGF0ZXRpbWVfQ0FQSSIsIHgpOwogCi0JLyogQSA0LXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkIGdldCBmcm9tCi0JICogcGFzdGluZyB0b2dldGhlciA0IHNpbmdsZSB5ZWFycy4KLQkgKi8KLQlhc3NlcnQoREk0WSA9PSA0ICogMzY1ICsgMSk7Ci0JYXNzZXJ0KERJNFkgPT0gZGF5c19iZWZvcmVfeWVhcig0KzEpKTsKKyAgICAvKiBBIDQteWVhciBjeWNsZSBoYXMgYW4gZXh0cmEgbGVhcCBkYXkgb3ZlciB3aGF0IHdlJ2QgZ2V0IGZyb20KKyAgICAgKiBwYXN0aW5nIHRvZ2V0aGVyIDQgc2luZ2xlIHllYXJzLgorICAgICAqLworICAgIGFzc2VydChESTRZID09IDQgKiAzNjUgKyAxKTsKKyAgICBhc3NlcnQoREk0WSA9PSBkYXlzX2JlZm9yZV95ZWFyKDQrMSkpOwogCi0JLyogU2ltaWxhcmx5LCBhIDQwMC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZAotCSAqIGdldCBmcm9tIHBhc3RpbmcgdG9nZXRoZXIgNCAxMDAteWVhciBjeWNsZXMuCi0JICovCi0JYXNzZXJ0KERJNDAwWSA9PSA0ICogREkxMDBZICsgMSk7Ci0JYXNzZXJ0KERJNDAwWSA9PSBkYXlzX2JlZm9yZV95ZWFyKDQwMCsxKSk7CisgICAgLyogU2ltaWxhcmx5LCBhIDQwMC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZAorICAgICAqIGdldCBmcm9tIHBhc3RpbmcgdG9nZXRoZXIgNCAxMDAteWVhciBjeWNsZXMuCisgICAgICovCisgICAgYXNzZXJ0KERJNDAwWSA9PSA0ICogREkxMDBZICsgMSk7CisgICAgYXNzZXJ0KERJNDAwWSA9PSBkYXlzX2JlZm9yZV95ZWFyKDQwMCsxKSk7CiAKLQkvKiBPVE9ILCBhIDEwMC15ZWFyIGN5Y2xlIGhhcyBvbmUgZmV3ZXIgbGVhcCBkYXkgdGhhbiB3ZSdkIGdldCBmcm9tCi0JICogcGFzdGluZyB0b2dldGhlciAyNSA0LXllYXIgY3ljbGVzLgotCSAqLwotCWFzc2VydChESTEwMFkgPT0gMjUgKiBESTRZIC0gMSk7Ci0JYXNzZXJ0KERJMTAwWSA9PSBkYXlzX2JlZm9yZV95ZWFyKDEwMCsxKSk7CisgICAgLyogT1RPSCwgYSAxMDAteWVhciBjeWNsZSBoYXMgb25lIGZld2VyIGxlYXAgZGF5IHRoYW4gd2UnZCBnZXQgZnJvbQorICAgICAqIHBhc3RpbmcgdG9nZXRoZXIgMjUgNC15ZWFyIGN5Y2xlcy4KKyAgICAgKi8KKyAgICBhc3NlcnQoREkxMDBZID09IDI1ICogREk0WSAtIDEpOworICAgIGFzc2VydChESTEwMFkgPT0gZGF5c19iZWZvcmVfeWVhcigxMDArMSkpOwogCi0JdXNfcGVyX3VzID0gUHlJbnRfRnJvbUxvbmcoMSk7Ci0JdXNfcGVyX21zID0gUHlJbnRfRnJvbUxvbmcoMTAwMCk7Ci0JdXNfcGVyX3NlY29uZCA9IFB5SW50X0Zyb21Mb25nKDEwMDAwMDApOwotCXVzX3Blcl9taW51dGUgPSBQeUludF9Gcm9tTG9uZyg2MDAwMDAwMCk7Ci0Jc2Vjb25kc19wZXJfZGF5ID0gUHlJbnRfRnJvbUxvbmcoMjQgKiAzNjAwKTsKLQlpZiAodXNfcGVyX3VzID09IE5VTEwgfHwgdXNfcGVyX21zID09IE5VTEwgfHwgdXNfcGVyX3NlY29uZCA9PSBOVUxMIHx8Ci0JICAgIHVzX3Blcl9taW51dGUgPT0gTlVMTCB8fCBzZWNvbmRzX3Blcl9kYXkgPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIHVzX3Blcl91cyA9IFB5SW50X0Zyb21Mb25nKDEpOworICAgIHVzX3Blcl9tcyA9IFB5SW50X0Zyb21Mb25nKDEwMDApOworICAgIHVzX3Blcl9zZWNvbmQgPSBQeUludF9Gcm9tTG9uZygxMDAwMDAwKTsKKyAgICB1c19wZXJfbWludXRlID0gUHlJbnRfRnJvbUxvbmcoNjAwMDAwMDApOworICAgIHNlY29uZHNfcGVyX2RheSA9IFB5SW50X0Zyb21Mb25nKDI0ICogMzYwMCk7CisgICAgaWYgKHVzX3Blcl91cyA9PSBOVUxMIHx8IHVzX3Blcl9tcyA9PSBOVUxMIHx8IHVzX3Blcl9zZWNvbmQgPT0gTlVMTCB8fAorICAgICAgICB1c19wZXJfbWludXRlID09IE5VTEwgfHwgc2Vjb25kc19wZXJfZGF5ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCS8qIFRoZSByZXN0IGFyZSB0b28gYmlnIGZvciAzMi1iaXQgaW50cywgYnV0IGV2ZW4KLQkgKiB1c19wZXJfd2VlayBmaXRzIGluIDQwIGJpdHMsIHNvIGRvdWJsZXMgc2hvdWxkIGJlIGV4YWN0LgotCSAqLwotCXVzX3Blcl9ob3VyID0gUHlMb25nX0Zyb21Eb3VibGUoMzYwMDAwMDAwMC4wKTsKLQl1c19wZXJfZGF5ID0gUHlMb25nX0Zyb21Eb3VibGUoODY0MDAwMDAwMDAuMCk7Ci0JdXNfcGVyX3dlZWsgPSBQeUxvbmdfRnJvbURvdWJsZSg2MDQ4MDAwMDAwMDAuMCk7Ci0JaWYgKHVzX3Blcl9ob3VyID09IE5VTEwgfHwgdXNfcGVyX2RheSA9PSBOVUxMIHx8IHVzX3Blcl93ZWVrID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBUaGUgcmVzdCBhcmUgdG9vIGJpZyBmb3IgMzItYml0IGludHMsIGJ1dCBldmVuCisgICAgICogdXNfcGVyX3dlZWsgZml0cyBpbiA0MCBiaXRzLCBzbyBkb3VibGVzIHNob3VsZCBiZSBleGFjdC4KKyAgICAgKi8KKyAgICB1c19wZXJfaG91ciA9IFB5TG9uZ19Gcm9tRG91YmxlKDM2MDAwMDAwMDAuMCk7CisgICAgdXNfcGVyX2RheSA9IFB5TG9uZ19Gcm9tRG91YmxlKDg2NDAwMDAwMDAwLjApOworICAgIHVzX3Blcl93ZWVrID0gUHlMb25nX0Zyb21Eb3VibGUoNjA0ODAwMDAwMDAwLjApOworICAgIGlmICh1c19wZXJfaG91ciA9PSBOVUxMIHx8IHVzX3Blcl9kYXkgPT0gTlVMTCB8fCB1c19wZXJfd2VlayA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29tZSB0aW1lIHpvbmUgYWxnZWJyYS4gIEZvciBhIGRhdGV0aW1lIHgsIGxldAogICAgIHgubiA9IHggc3RyaXBwZWQgb2YgaXRzIHRpbWV6b25lIC0tIGl0cyBuYWl2ZSB0aW1lLgogICAgIHgubyA9IHgudXRjb2Zmc2V0KCksIGFuZCBhc3N1bWluZyB0aGF0IGRvZXNuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIG9yCi0gICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgIHJldHVybiBOb25lCiAgICAgeC5kID0geC5kc3QoKSwgYW5kIGFzc3VtaW5nIHRoYXQgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24gb3IKLSAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgcmV0dXJuIE5vbmUKICAgICB4LnMgPSB4J3Mgc3RhbmRhcmQgb2Zmc2V0LCB4Lm8gLSB4LmQKIAogTm93IHNvbWUgZGVyaXZlZCBydWxlcywgd2hlcmUgayBpcyBhIGR1cmF0aW9uICh0aW1lZGVsdGEpLgpAQCAtNTA0MiwxMyArNTA0MiwxMyBAQAogYWxyZWFkeSk6CiAKICAgICBkaWZmJyA9IHgubiAtICh6Jy5uIC0geicubykgPSAgICAgICAgICAgcmVwbGFjaW5nIHonLm4gdmlhIFs3XQotICAgICAgICAgICAgeC5uICAtICh6Lm4gKyBkaWZmIC0geicubykgPSAgICByZXBsYWNpbmcgZGlmZiB2aWEgWzZdCi0gICAgICAgICAgICB4Lm4gLSAoei5uICsgeC5uIC0gKHoubiAtIHoubykgLSB6Jy5vKSA9Ci0gICAgICAgICAgICB4Lm4gLSB6Lm4gLSB4Lm4gKyB6Lm4gLSB6Lm8gKyB6Jy5vID0gICAgY2FuY2VsIHgubgotICAgICAgICAgICAgLSB6Lm4gKyB6Lm4gLSB6Lm8gKyB6Jy5vID0gICAgICAgICAgICAgIGNhbmNlbCB6Lm4KLSAgICAgICAgICAgIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICAgICAgICAgICMxIHR3aWNlCi0gICAgICAgICAgICAtei5zIC0gei5kICsgeicucyArIHonLmQgPSAgICAgICAgICB6IGFuZCB6JyBoYXZlIHNhbWUgdHppbmZvCi0gICAgICAgICAgICB6Jy5kIC0gei5kCisgICAgICAgIHgubiAgLSAoei5uICsgZGlmZiAtIHonLm8pID0gICAgcmVwbGFjaW5nIGRpZmYgdmlhIFs2XQorICAgICAgICB4Lm4gLSAoei5uICsgeC5uIC0gKHoubiAtIHoubykgLSB6Jy5vKSA9CisgICAgICAgIHgubiAtIHoubiAtIHgubiArIHoubiAtIHoubyArIHonLm8gPSAgICBjYW5jZWwgeC5uCisgICAgICAgIC0gei5uICsgei5uIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICBjYW5jZWwgei5uCisgICAgICAgIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICAgICAgICAgICMxIHR3aWNlCisgICAgICAgIC16LnMgLSB6LmQgKyB6Jy5zICsgeicuZCA9ICAgICAgICAgIHogYW5kIHonIGhhdmUgc2FtZSB0emluZm8KKyAgICAgICAgeicuZCAtIHouZAogCiBTbyB6JyBpcyBVVEMtZXF1aXZhbGVudCB0byB4IGlmZiB6Jy5kID0gei5kIGF0IHRoaXMgcG9pbnQuICBJZiB0aGV5IGFyZSBlcXVhbCwKIHdlJ3ZlIGZvdW5kIHRoZSBVVEMtZXF1aXZhbGVudCBzbyBhcmUgZG9uZS4gIEluIGZhY3QsIHdlIHN0b3Agd2l0aCBbN10gYW5kCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2RibW1vZHVsZS5jIGIvTW9kdWxlcy9kYm1tb2R1bGUuYwppbmRleCAwYzUwYjU0Li5mOWM5OWE4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2RibW1vZHVsZS5jCisrKyBiL01vZHVsZXMvZGJtbW9kdWxlLmMKQEAgLTMyLDkgKzMyLDkgQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWludCBkaV9zaXplOwkvKiAtMSBtZWFucyByZWNvbXB1dGUgKi8KLQlEQk0gKmRpX2RibTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgaW50IGRpX3NpemU7ICAgICAgICAvKiAtMSBtZWFucyByZWNvbXB1dGUgKi8KKyAgICBEQk0gKmRpX2RibTsKIH0gZGJtb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IERibXR5cGU7CkBAIC00OSwxOCArNDksMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdkYm1vYmplY3QoY2hhciAqZmlsZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKIHsKLSAgICAgICAgZGJtb2JqZWN0ICpkcDsKKyAgICBkYm1vYmplY3QgKmRwOwogCi0JZHAgPSBQeU9iamVjdF9OZXcoZGJtb2JqZWN0LCAmRGJtdHlwZSk7Ci0JaWYgKGRwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWRwLT5kaV9zaXplID0gLTE7Ci0JaWYgKCAoZHAtPmRpX2RibSA9IGRibV9vcGVuKGZpbGUsIGZsYWdzLCBtb2RlKSkgPT0gMCApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKERibUVycm9yKTsKLQkJUHlfREVDUkVGKGRwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilkcDsKKyAgICBkcCA9IFB5T2JqZWN0X05ldyhkYm1vYmplY3QsICZEYm10eXBlKTsKKyAgICBpZiAoZHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHAtPmRpX3NpemUgPSAtMTsKKyAgICBpZiAoIChkcC0+ZGlfZGJtID0gZGJtX29wZW4oZmlsZSwgZmxhZ3MsIG1vZGUpKSA9PSAwICkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oRGJtRXJyb3IpOworICAgICAgICBQeV9ERUNSRUYoZHApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRwOwogfQogCiAvKiBNZXRob2RzICovCkBAIC02OCwxMTkgKzY4LDExOSBAQAogc3RhdGljIHZvaWQKIGRibV9kZWFsbG9jKHJlZ2lzdGVyIGRibW9iamVjdCAqZHApCiB7Ci0gICAgICAgIGlmICggZHAtPmRpX2RibSApCi0JCWRibV9jbG9zZShkcC0+ZGlfZGJtKTsKLQlQeU9iamVjdF9EZWwoZHApOworICAgIGlmICggZHAtPmRpX2RibSApCisgICAgICAgIGRibV9jbG9zZShkcC0+ZGlfZGJtKTsKKyAgICBQeU9iamVjdF9EZWwoZHApOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogZGJtX2xlbmd0aChkYm1vYmplY3QgKmRwKQogewotICAgICAgICBpZiAoZHAtPmRpX2RibSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIkRCTSBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsgCi0gICAgICAgICAgICAgICAgIHJldHVybiAtMTsgCi0gICAgICAgIH0KLSAgICAgICAgaWYgKCBkcC0+ZGlfc2l6ZSA8IDAgKSB7Ci0JCWRhdHVtIGtleTsKLQkJaW50IHNpemU7CisgICAgaWYgKGRwLT5kaV9kYm0gPT0gTlVMTCkgeworICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIkRCTSBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsKKyAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICggZHAtPmRpX3NpemUgPCAwICkgeworICAgICAgICBkYXR1bSBrZXk7CisgICAgICAgIGludCBzaXplOwogCi0JCXNpemUgPSAwOwotCQlmb3IgKCBrZXk9ZGJtX2ZpcnN0a2V5KGRwLT5kaV9kYm0pOyBrZXkuZHB0cjsKLQkJICAgICAga2V5ID0gZGJtX25leHRrZXkoZHAtPmRpX2RibSkpCi0JCQlzaXplKys7Ci0JCWRwLT5kaV9zaXplID0gc2l6ZTsKLQl9Ci0JcmV0dXJuIGRwLT5kaV9zaXplOworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgZm9yICgga2V5PWRibV9maXJzdGtleShkcC0+ZGlfZGJtKTsga2V5LmRwdHI7CisgICAgICAgICAgICAgIGtleSA9IGRibV9uZXh0a2V5KGRwLT5kaV9kYm0pKQorICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICBkcC0+ZGlfc2l6ZSA9IHNpemU7CisgICAgfQorICAgIHJldHVybiBkcC0+ZGlfc2l6ZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRibV9zdWJzY3JpcHQoZGJtb2JqZWN0ICpkcCwgcmVnaXN0ZXIgUHlPYmplY3QgKmtleSkKIHsKLQlkYXR1bSBkcmVjLCBrcmVjOwotCWludCB0bXBfc2l6ZTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlKGtleSwgInMjIiwgJmtyZWMuZHB0ciwgJnRtcF9zaXplKSApCi0JCXJldHVybiBOVUxMOwotCQotCWtyZWMuZHNpemUgPSB0bXBfc2l6ZTsKLSAgICAgICAgY2hlY2tfZGJtb2JqZWN0X29wZW4oZHApOwotCWRyZWMgPSBkYm1fZmV0Y2goZHAtPmRpX2RibSwga3JlYyk7Ci0JaWYgKCBkcmVjLmRwdHIgPT0gMCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAotCQkJCVB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilrZXkpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICggZGJtX2Vycm9yKGRwLT5kaV9kYm0pICkgewotCQlkYm1fY2xlYXJlcnIoZHAtPmRpX2RibSk7Ci0JCVB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRyZWMuZHB0ciwgZHJlYy5kc2l6ZSk7CisgICAgZGF0dW0gZHJlYywga3JlYzsKKyAgICBpbnQgdG1wX3NpemU7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGtleSwgInMjIiwgJmtyZWMuZHB0ciwgJnRtcF9zaXplKSApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAga3JlYy5kc2l6ZSA9IHRtcF9zaXplOworICAgIGNoZWNrX2RibW9iamVjdF9vcGVuKGRwKTsKKyAgICBkcmVjID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtyZWMpOworICAgIGlmICggZHJlYy5kcHRyID09IDAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilrZXkpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggZGJtX2Vycm9yKGRwLT5kaV9kYm0pICkgeworICAgICAgICBkYm1fY2xlYXJlcnIoZHAtPmRpX2RibSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRyZWMuZHB0ciwgZHJlYy5kc2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGRibV9hc3Nfc3ViKGRibW9iamVjdCAqZHAsIFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLSAgICAgICAgZGF0dW0ga3JlYywgZHJlYzsKLQlpbnQgdG1wX3NpemU7Ci0JCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHYsICJzIyIsICZrcmVjLmRwdHIsICZ0bXBfc2l6ZSkgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImRibSBtYXBwaW5ncyBoYXZlIHN0cmluZyBpbmRpY2VzIG9ubHkiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlrcmVjLmRzaXplID0gdG1wX3NpemU7Ci0gICAgICAgIGlmIChkcC0+ZGlfZGJtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiREJNIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCIpOyAKLSAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIGRhdHVtIGtyZWMsIGRyZWM7CisgICAgaW50IHRtcF9zaXplOworCisgICAgaWYgKCAhUHlBcmdfUGFyc2UodiwgInMjIiwgJmtyZWMuZHB0ciwgJnRtcF9zaXplKSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYm0gbWFwcGluZ3MgaGF2ZSBzdHJpbmcgaW5kaWNlcyBvbmx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAga3JlYy5kc2l6ZSA9IHRtcF9zaXplOworICAgIGlmIChkcC0+ZGlfZGJtID09IE5VTEwpIHsKKyAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGJtRXJyb3IsICJEQk0gb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIik7CisgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBkcC0+ZGlfc2l6ZSA9IC0xOworICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCBkYm1fZGVsZXRlKGRwLT5kaV9kYm0sIGtyZWMpIDwgMCApIHsKKyAgICAgICAgICAgIGRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXYpKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotCWRwLT5kaV9zaXplID0gLTE7Ci0JaWYgKHcgPT0gTlVMTCkgewotCQlpZiAoIGRibV9kZWxldGUoZHAtPmRpX2RibSwga3JlYykgPCAwICkgewotCQkJZGJtX2NsZWFyZXJyKGRwLT5kaV9kYm0pOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAotCQkJCSAgICAgIFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKil2KSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoICFQeUFyZ19QYXJzZSh3LCAicyMiLCAmZHJlYy5kcHRyLCAmdG1wX3NpemUpICkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJkYm0gbWFwcGluZ3MgaGF2ZSBzdHJpbmcgZWxlbWVudHMgb25seSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWRyZWMuZHNpemUgPSB0bXBfc2l6ZTsKLQkJaWYgKCBkYm1fc3RvcmUoZHAtPmRpX2RibSwga3JlYywgZHJlYywgREJNX1JFUExBQ0UpIDwgMCApIHsKLQkJCWRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKLQkJCVB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwKLQkJCQkJImNhbm5vdCBhZGQgaXRlbSB0byBkYXRhYmFzZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWlmICggZGJtX2Vycm9yKGRwLT5kaV9kYm0pICkgewotCQlkYm1fY2xlYXJlcnIoZHAtPmRpX2RibSk7Ci0JCVB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHcsICJzIyIsICZkcmVjLmRwdHIsICZ0bXBfc2l6ZSkgKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJkYm0gbWFwcGluZ3MgaGF2ZSBzdHJpbmcgZWxlbWVudHMgb25seSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGRyZWMuZHNpemUgPSB0bXBfc2l6ZTsKKyAgICAgICAgaWYgKCBkYm1fc3RvcmUoZHAtPmRpX2RibSwga3JlYywgZHJlYywgREJNX1JFUExBQ0UpIDwgMCApIHsKKyAgICAgICAgICAgIGRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFkZCBpdGVtIHRvIGRhdGFiYXNlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBkYm1fZXJyb3IoZHAtPmRpX2RibSkgKSB7CisgICAgICAgIGRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGRibV9jb250YWlucyhyZWdpc3RlciBkYm1vYmplY3QgKmRwLCBQeU9iamVjdCAqdikKIHsKLQlkYXR1bSBrZXksIHZhbDsKKyAgICBkYXR1bSBrZXksIHZhbDsKIAotCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgKGNoYXIgKiopJmtleS5kcHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QgKikma2V5LmRzaXplKSkgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgKGNoYXIgKiopJmtleS5kcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QgKikma2V5LmRzaXplKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogRXhwYW5kIGNoZWNrX2RibW9iamVjdF9vcGVuIHRvIHJldHVybiAtMSAqLwotCWlmIChkcC0+ZGlfZGJtID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiREJNIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXZhbCA9IGRibV9mZXRjaChkcC0+ZGlfZGJtLCBrZXkpOwotCXJldHVybiB2YWwuZHB0ciAhPSBOVUxMOworICAgIC8qIEV4cGFuZCBjaGVja19kYm1vYmplY3Rfb3BlbiB0byByZXR1cm4gLTEgKi8KKyAgICBpZiAoZHAtPmRpX2RibSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIkRCTSBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB2YWwgPSBkYm1fZmV0Y2goZHAtPmRpX2RibSwga2V5KTsKKyAgICByZXR1cm4gdmFsLmRwdHIgIT0gTlVMTDsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGRibV9hc19zZXF1ZW5jZSA9IHsKQEAgLTE5NywxNTkgKzE5NywxNTkgQEAKIH07CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIGRibV9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKWRibV9sZW5ndGgsCQkvKm1wX2xlbmd0aCovCi0JKGJpbmFyeWZ1bmMpZGJtX3N1YnNjcmlwdCwJLyptcF9zdWJzY3JpcHQqLwotCShvYmpvYmphcmdwcm9jKWRibV9hc3Nfc3ViLAkvKm1wX2Fzc19zdWJzY3JpcHQqLworICAgIChsZW5mdW5jKWRibV9sZW5ndGgsICAgICAgICAgICAgICAgIC8qbXBfbGVuZ3RoKi8KKyAgICAoYmluYXJ5ZnVuYylkYm1fc3Vic2NyaXB0LCAgICAgICAgICAvKm1wX3N1YnNjcmlwdCovCisgICAgKG9iam9iamFyZ3Byb2MpZGJtX2Fzc19zdWIsICAgICAgICAgLyptcF9hc3Nfc3Vic2NyaXB0Ki8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYm1fX2Nsb3NlKHJlZ2lzdGVyIGRibW9iamVjdCAqZHAsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0gICAgICAgIGlmIChkcC0+ZGlfZGJtKQotCQlkYm1fY2xvc2UoZHAtPmRpX2RibSk7Ci0JZHAtPmRpX2RibSA9IE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChkcC0+ZGlfZGJtKQorICAgICAgICBkYm1fY2xvc2UoZHAtPmRpX2RibSk7CisgICAgZHAtPmRpX2RibSA9IE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGJtX2tleXMocmVnaXN0ZXIgZGJtb2JqZWN0ICpkcCwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqdiwgKml0ZW07Ci0JZGF0dW0ga2V5OwotCWludCBlcnI7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnYsICppdGVtOworICAgIGRhdHVtIGtleTsKKyAgICBpbnQgZXJyOwogCi0gICAgICAgIGNoZWNrX2RibW9iamVjdF9vcGVuKGRwKTsKLQl2ID0gUHlMaXN0X05ldygwKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGtleSA9IGRibV9maXJzdGtleShkcC0+ZGlfZGJtKTsga2V5LmRwdHI7Ci0JICAgICBrZXkgPSBkYm1fbmV4dGtleShkcC0+ZGlfZGJtKSkgewotCQlpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoa2V5LmRwdHIsIGtleS5kc2l6ZSk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVyciA9IFB5TGlzdF9BcHBlbmQodiwgaXRlbSk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQkJaWYgKGVyciAhPSAwKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gdjsKKyAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7CisgICAgdiA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChrZXkgPSBkYm1fZmlyc3RrZXkoZHAtPmRpX2RibSk7IGtleS5kcHRyOworICAgICAgICAga2V5ID0gZGJtX25leHRrZXkoZHAtPmRpX2RibSkpIHsKKyAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGtleS5kcHRyLCBrZXkuZHNpemUpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKHYsIGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYm1faGFzX2tleShyZWdpc3RlciBkYm1vYmplY3QgKmRwLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICp0bXBfcHRyOwotCWRhdHVtIGtleSwgdmFsOwotCWludCB0bXBfc2l6ZTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmhhc19rZXkiLCAmdG1wX3B0ciwgJnRtcF9zaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0Ja2V5LmRwdHIgPSB0bXBfcHRyOwotCWtleS5kc2l6ZSA9IHRtcF9zaXplOwotICAgICAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7Ci0JdmFsID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtleSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbC5kcHRyICE9IE5VTEwpOworICAgIGNoYXIgKnRtcF9wdHI7CisgICAgZGF0dW0ga2V5LCB2YWw7CisgICAgaW50IHRtcF9zaXplOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpoYXNfa2V5IiwgJnRtcF9wdHIsICZ0bXBfc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGtleS5kcHRyID0gdG1wX3B0cjsKKyAgICBrZXkuZHNpemUgPSB0bXBfc2l6ZTsKKyAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7CisgICAgdmFsID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtleSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbC5kcHRyICE9IE5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGJtX2dldChyZWdpc3RlciBkYm1vYmplY3QgKmRwLCBQeU9iamVjdCAqYXJncykKIHsKLQlkYXR1bSBrZXksIHZhbDsKLQlQeU9iamVjdCAqZGVmdmFsdWUgPSBQeV9Ob25lOwotCWNoYXIgKnRtcF9wdHI7Ci0JaW50IHRtcF9zaXplOworICAgIGRhdHVtIGtleSwgdmFsOworICAgIFB5T2JqZWN0ICpkZWZ2YWx1ZSA9IFB5X05vbmU7CisgICAgY2hhciAqdG1wX3B0cjsKKyAgICBpbnQgdG1wX3NpemU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfE86Z2V0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfcHRyLCAmdG1wX3NpemUsICZkZWZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCWtleS5kcHRyID0gdG1wX3B0cjsKLQlrZXkuZHNpemUgPSB0bXBfc2l6ZTsKLSAgICAgICAgY2hlY2tfZGJtb2JqZWN0X29wZW4oZHApOwotCXZhbCA9IGRibV9mZXRjaChkcC0+ZGlfZGJtLCBrZXkpOwotCWlmICh2YWwuZHB0ciAhPSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsLmRwdHIsIHZhbC5kc2l6ZSk7Ci0JZWxzZSB7Ci0JCVB5X0lOQ1JFRihkZWZ2YWx1ZSk7Ci0JCXJldHVybiBkZWZ2YWx1ZTsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xPOmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfcHRyLCAmdG1wX3NpemUsICZkZWZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGtleS5kcHRyID0gdG1wX3B0cjsKKyAgICBrZXkuZHNpemUgPSB0bXBfc2l6ZTsKKyAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7CisgICAgdmFsID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtleSk7CisgICAgaWYgKHZhbC5kcHRyICE9IE5VTEwpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWwuZHB0ciwgdmFsLmRzaXplKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlZnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIGRlZnZhbHVlOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRibV9zZXRkZWZhdWx0KHJlZ2lzdGVyIGRibW9iamVjdCAqZHAsIFB5T2JqZWN0ICphcmdzKQogewotCWRhdHVtIGtleSwgdmFsOwotCVB5T2JqZWN0ICpkZWZ2YWx1ZSA9IE5VTEw7Ci0JY2hhciAqdG1wX3B0cjsKLQlpbnQgdG1wX3NpemU7CisgICAgZGF0dW0ga2V5LCB2YWw7CisgICAgUHlPYmplY3QgKmRlZnZhbHVlID0gTlVMTDsKKyAgICBjaGFyICp0bXBfcHRyOworICAgIGludCB0bXBfc2l6ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8UzpzZXRkZWZhdWx0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfcHRyLCAmdG1wX3NpemUsICZkZWZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCWtleS5kcHRyID0gdG1wX3B0cjsKLQlrZXkuZHNpemUgPSB0bXBfc2l6ZTsKLSAgICAgICAgY2hlY2tfZGJtb2JqZWN0X29wZW4oZHApOwotCXZhbCA9IGRibV9mZXRjaChkcC0+ZGlfZGJtLCBrZXkpOwotCWlmICh2YWwuZHB0ciAhPSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsLmRwdHIsIHZhbC5kc2l6ZSk7Ci0JaWYgKGRlZnZhbHVlID09IE5VTEwpIHsKLQkJZGVmdmFsdWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKLQkJaWYgKGRlZnZhbHVlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZQotCQlQeV9JTkNSRUYoZGVmdmFsdWUpOwotCXZhbC5kcHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKGRlZnZhbHVlKTsKLQl2YWwuZHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShkZWZ2YWx1ZSk7Ci0JaWYgKGRibV9zdG9yZShkcC0+ZGlfZGJtLCBrZXksIHZhbCwgREJNX0lOU0VSVCkgPCAwKSB7Ci0JCWRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKLQkJUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiY2Fubm90IGFkZCBpdGVtIHRvIGRhdGFiYXNlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gZGVmdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xTOnNldGRlZmF1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX3B0ciwgJnRtcF9zaXplLCAmZGVmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBrZXkuZHB0ciA9IHRtcF9wdHI7CisgICAga2V5LmRzaXplID0gdG1wX3NpemU7CisgICAgY2hlY2tfZGJtb2JqZWN0X29wZW4oZHApOworICAgIHZhbCA9IGRibV9mZXRjaChkcC0+ZGlfZGJtLCBrZXkpOworICAgIGlmICh2YWwuZHB0ciAhPSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsLmRwdHIsIHZhbC5kc2l6ZSk7CisgICAgaWYgKGRlZnZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgZGVmdmFsdWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKKyAgICAgICAgaWYgKGRlZnZhbHVlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYoZGVmdmFsdWUpOworICAgIHZhbC5kcHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKGRlZnZhbHVlKTsKKyAgICB2YWwuZHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShkZWZ2YWx1ZSk7CisgICAgaWYgKGRibV9zdG9yZShkcC0+ZGlfZGJtLCBrZXksIHZhbCwgREJNX0lOU0VSVCkgPCAwKSB7CisgICAgICAgIGRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiY2Fubm90IGFkZCBpdGVtIHRvIGRhdGFiYXNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZGVmdmFsdWU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkYm1fbWV0aG9kc1tdID0gewotCXsiY2xvc2UiLAkoUHlDRnVuY3Rpb24pZGJtX19jbG9zZSwJTUVUSF9OT0FSR1MsCi0JICJjbG9zZSgpXG5DbG9zZSB0aGUgZGF0YWJhc2UuIn0sCi0JeyJrZXlzIiwJKFB5Q0Z1bmN0aW9uKWRibV9rZXlzLAkJTUVUSF9OT0FSR1MsCi0JICJrZXlzKCkgLT4gbGlzdFxuUmV0dXJuIGEgbGlzdCBvZiBhbGwga2V5cyBpbiB0aGUgZGF0YWJhc2UuIn0sCi0JeyJoYXNfa2V5IiwJKFB5Q0Z1bmN0aW9uKWRibV9oYXNfa2V5LAlNRVRIX1ZBUkFSR1MsCi0JICJoYXNfa2V5KGtleX0gLT4gYm9vbGVhblxuUmV0dXJuIHRydWUgaWZmIGtleSBpcyBpbiB0aGUgZGF0YWJhc2UuIn0sCi0JeyJnZXQiLAkJKFB5Q0Z1bmN0aW9uKWRibV9nZXQsCQlNRVRIX1ZBUkFSR1MsCi0JICJnZXQoa2V5WywgZGVmYXVsdF0pIC0+IHZhbHVlXG4iCi0JICJSZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRlZmF1bHQuIn0sCi0JeyJzZXRkZWZhdWx0IiwJKFB5Q0Z1bmN0aW9uKWRibV9zZXRkZWZhdWx0LAlNRVRIX1ZBUkFSR1MsCi0JICJzZXRkZWZhdWx0KGtleVssIGRlZmF1bHRdKSAtPiB2YWx1ZVxuIgotCSAiUmV0dXJuIHRoZSB2YWx1ZSBmb3Iga2V5IGlmIHByZXNlbnQsIG90aGVyd2lzZSBkZWZhdWx0LiAgSWYga2V5XG4iCi0JICJpcyBub3QgaW4gdGhlIGRhdGFiYXNlLCBpdCBpcyBpbnNlcnRlZCB3aXRoIGRlZmF1bHQgYXMgdGhlIHZhbHVlLiJ9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJjbG9zZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGJtX19jbG9zZSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICAiY2xvc2UoKVxuQ2xvc2UgdGhlIGRhdGFiYXNlLiJ9LAorICAgIHsia2V5cyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRibV9rZXlzLCAgICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgImtleXMoKSAtPiBsaXN0XG5SZXR1cm4gYSBsaXN0IG9mIGFsbCBrZXlzIGluIHRoZSBkYXRhYmFzZS4ifSwKKyAgICB7Imhhc19rZXkiLCAgICAgICAgIChQeUNGdW5jdGlvbilkYm1faGFzX2tleSwgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAiaGFzX2tleShrZXl9IC0+IGJvb2xlYW5cblJldHVybiB0cnVlIGlmZiBrZXkgaXMgaW4gdGhlIGRhdGFiYXNlLiJ9LAorICAgIHsiZ2V0IiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRibV9nZXQsICAgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICJnZXQoa2V5WywgZGVmYXVsdF0pIC0+IHZhbHVlXG4iCisgICAgICJSZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRlZmF1bHQuIn0sCisgICAgeyJzZXRkZWZhdWx0IiwgICAgICAoUHlDRnVuY3Rpb24pZGJtX3NldGRlZmF1bHQsICAgIE1FVEhfVkFSQVJHUywKKyAgICAgInNldGRlZmF1bHQoa2V5WywgZGVmYXVsdF0pIC0+IHZhbHVlXG4iCisgICAgICJSZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRlZmF1bHQuICBJZiBrZXlcbiIKKyAgICAgImlzIG5vdCBpbiB0aGUgZGF0YWJhc2UsIGl0IGlzIGluc2VydGVkIHdpdGggZGVmYXVsdCBhcyB0aGUgdmFsdWUuIn0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYm1fZ2V0YXR0cihkYm1vYmplY3QgKmRwLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKGRibV9tZXRob2RzLCAoUHlPYmplY3QgKilkcCwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoZGJtX21ldGhvZHMsIChQeU9iamVjdCAqKWRwLCBuYW1lKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBEYm10eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJkYm0uZGJtIiwKLQlzaXplb2YoZGJtb2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWRibV9kZWFsbG9jLCAgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCSAgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWRibV9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCTAsCQkJICAvKnRwX3NldGF0dHIqLwotCTAsCQkJICAvKnRwX2NvbXBhcmUqLwotCTAsCQkJICAvKnRwX3JlcHIqLwotCTAsCQkJICAvKnRwX2FzX251bWJlciovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImRibS5kYm0iLAorICAgIHNpemVvZihkYm1vYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpZGJtX2RlYWxsb2MsICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylkYm1fZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCiAgICAgJmRibV9hc19zZXF1ZW5jZSwgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwotCSZkYm1fYXNfbWFwcGluZywJICAvKnRwX2FzX21hcHBpbmcqLworICAgICZkYm1fYXNfbWFwcGluZywgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KQEAgLTM2NCw1NCArMzY0LDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGJtb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQljaGFyICpmbGFncyA9ICJyIjsKLQlpbnQgaWZsYWdzOwotCWludCBtb2RlID0gMDY2NjsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKmZsYWdzID0gInIiOworICAgIGludCBpZmxhZ3M7CisgICAgaW50IG1vZGUgPSAwNjY2OwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8c2k6b3BlbiIsICZuYW1lLCAmZmxhZ3MsICZtb2RlKSApCi0JCXJldHVybiBOVUxMOwotCWlmICggc3RyY21wKGZsYWdzLCAiciIpID09IDAgKQotCQlpZmxhZ3MgPSBPX1JET05MWTsKLQllbHNlIGlmICggc3RyY21wKGZsYWdzLCAidyIpID09IDAgKQotCQlpZmxhZ3MgPSBPX1JEV1I7Ci0JZWxzZSBpZiAoIHN0cmNtcChmbGFncywgInJ3IikgPT0gMCApIC8qIEIvVyBjb21wYXQgKi8KLQkJaWZsYWdzID0gT19SRFdSfE9fQ1JFQVQ7IAotCWVsc2UgaWYgKCBzdHJjbXAoZmxhZ3MsICJjIikgPT0gMCApCi0JCWlmbGFncyA9IE9fUkRXUnxPX0NSRUFUOwotCWVsc2UgaWYgKCBzdHJjbXAoZmxhZ3MsICJuIikgPT0gMCApCi0JCWlmbGFncyA9IE9fUkRXUnxPX0NSRUFUfE9fVFJVTkM7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwKLQkJCQkiYXJnIDIgdG8gb3BlbiBzaG91bGQgYmUgJ3InLCAndycsICdjJywgb3IgJ24nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLSAgICAgICAgcmV0dXJuIG5ld2RibW9iamVjdChuYW1lLCBpZmxhZ3MsIG1vZGUpOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8c2k6b3BlbiIsICZuYW1lLCAmZmxhZ3MsICZtb2RlKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggc3RyY21wKGZsYWdzLCAiciIpID09IDAgKQorICAgICAgICBpZmxhZ3MgPSBPX1JET05MWTsKKyAgICBlbHNlIGlmICggc3RyY21wKGZsYWdzLCAidyIpID09IDAgKQorICAgICAgICBpZmxhZ3MgPSBPX1JEV1I7CisgICAgZWxzZSBpZiAoIHN0cmNtcChmbGFncywgInJ3IikgPT0gMCApIC8qIEIvVyBjb21wYXQgKi8KKyAgICAgICAgaWZsYWdzID0gT19SRFdSfE9fQ1JFQVQ7CisgICAgZWxzZSBpZiAoIHN0cmNtcChmbGFncywgImMiKSA9PSAwICkKKyAgICAgICAgaWZsYWdzID0gT19SRFdSfE9fQ1JFQVQ7CisgICAgZWxzZSBpZiAoIHN0cmNtcChmbGFncywgIm4iKSA9PSAwICkKKyAgICAgICAgaWZsYWdzID0gT19SRFdSfE9fQ1JFQVR8T19UUlVOQzsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZyAyIHRvIG9wZW4gc2hvdWxkIGJlICdyJywgJ3cnLCAnYycsIG9yICduJyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ld2RibW9iamVjdChuYW1lLCBpZmxhZ3MsIG1vZGUpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGJtbW9kdWxlX21ldGhvZHNbXSA9IHsKLQl7ICJvcGVuIiwgKFB5Q0Z1bmN0aW9uKWRibW9wZW4sIE1FVEhfVkFSQVJHUywKLQkgICJvcGVuKHBhdGhbLCBmbGFnWywgbW9kZV1dKSAtPiBtYXBwaW5nXG4iCi0JICAiUmV0dXJuIGEgZGF0YWJhc2Ugb2JqZWN0LiJ9LAotCXsgMCwgMCB9LAorICAgIHsgIm9wZW4iLCAoUHlDRnVuY3Rpb24pZGJtb3BlbiwgTUVUSF9WQVJBUkdTLAorICAgICAgIm9wZW4ocGF0aFssIGZsYWdbLCBtb2RlXV0pIC0+IG1hcHBpbmdcbiIKKyAgICAgICJSZXR1cm4gYSBkYXRhYmFzZSBvYmplY3QuIn0sCisgICAgeyAwLCAwIH0sCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdGRibSh2b2lkKSB7Ci0JUHlPYmplY3QgKm0sICpkLCAqczsKKyAgICBQeU9iamVjdCAqbSwgKmQsICpzOwogCi0JRGJtdHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCW0gPSBQeV9Jbml0TW9kdWxlKCJkYm0iLCBkYm1tb2R1bGVfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWlmIChEYm1FcnJvciA9PSBOVUxMKQotCQlEYm1FcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiZGJtLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcod2hpY2hfZGJtKTsKLQlpZiAocyAhPSBOVUxMKSB7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJsaWJyYXJ5Iiwgcyk7Ci0JCVB5X0RFQ1JFRihzKTsKLQl9Ci0JaWYgKERibUVycm9yICE9IE5VTEwpCi0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIERibUVycm9yKTsKKyAgICBEYm10eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoImRibSIsIGRibW1vZHVsZV9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKERibUVycm9yID09IE5VTEwpCisgICAgICAgIERibUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJkYm0uZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyh3aGljaF9kYm0pOworICAgIGlmIChzICE9IE5VTEwpIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImxpYnJhcnkiLCBzKTsKKyAgICAgICAgUHlfREVDUkVGKHMpOworICAgIH0KKyAgICBpZiAoRGJtRXJyb3IgIT0gTlVMTCkKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRGJtRXJyb3IpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9kbG1vZHVsZS5jIGIvTW9kdWxlcy9kbG1vZHVsZS5jCmluZGV4IGIyZWE0ZjUuLmMzNDlhZDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZGxtb2R1bGUuYworKysgYi9Nb2R1bGVzL2RsbW9kdWxlLmMKQEAgLTE1LDggKzE1LDggQEAKIAogdHlwZWRlZiB2b2lkICpQeVVuaXZQdHI7CiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5VW5pdlB0ciAqZGxfaGFuZGxlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeVVuaXZQdHIgKmRsX2hhbmRsZTsKIH0gZGxvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgRGx0eXBlOwpAQCAtMjYsMTk2ICsyNiwxOTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdkbG9iamVjdChQeVVuaXZQdHIgKmhhbmRsZSkKIHsKLQlkbG9iamVjdCAqeHA7Ci0JeHAgPSBQeU9iamVjdF9OZXcoZGxvYmplY3QsICZEbHR5cGUpOwotCWlmICh4cCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl4cC0+ZGxfaGFuZGxlID0gaGFuZGxlOwotCXJldHVybiAoUHlPYmplY3QgKil4cDsKKyAgICBkbG9iamVjdCAqeHA7CisgICAgeHAgPSBQeU9iamVjdF9OZXcoZGxvYmplY3QsICZEbHR5cGUpOworICAgIGlmICh4cCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4cC0+ZGxfaGFuZGxlID0gaGFuZGxlOworICAgIHJldHVybiAoUHlPYmplY3QgKil4cDsKIH0KIAogc3RhdGljIHZvaWQKIGRsX2RlYWxsb2MoZGxvYmplY3QgKnhwKQogewotCWlmICh4cC0+ZGxfaGFuZGxlICE9IE5VTEwpCi0JCWRsY2xvc2UoeHAtPmRsX2hhbmRsZSk7Ci0JUHlPYmplY3RfRGVsKHhwKTsKKyAgICBpZiAoeHAtPmRsX2hhbmRsZSAhPSBOVUxMKQorICAgICAgICBkbGNsb3NlKHhwLT5kbF9oYW5kbGUpOworICAgIFB5T2JqZWN0X0RlbCh4cCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkbF9jbG9zZShkbG9iamVjdCAqeHApCiB7Ci0JaWYgKHhwLT5kbF9oYW5kbGUgIT0gTlVMTCkgewotCQlkbGNsb3NlKHhwLT5kbF9oYW5kbGUpOwotCQl4cC0+ZGxfaGFuZGxlID0gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICh4cC0+ZGxfaGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgZGxjbG9zZSh4cC0+ZGxfaGFuZGxlKTsKKyAgICAgICAgeHAtPmRsX2hhbmRsZSA9IE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRsX3N5bShkbG9iamVjdCAqeHAsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JUHlVbml2UHRyICpmdW5jOwotCWlmIChQeVN0cmluZ19DaGVjayhhcmdzKSkgewotCQluYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZ3MpOwotCX0gZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RlZCBzdHJpbmcsIGZvdW5kICUuMjAwcyIsCi0JCQkgICAgIFB5X1RZUEUoYXJncyktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZnVuYyA9IGRsc3ltKHhwLT5kbF9oYW5kbGUsIG5hbWUpOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWZ1bmMpOworICAgIGNoYXIgKm5hbWU7CisgICAgUHlVbml2UHRyICpmdW5jOworICAgIGlmIChQeVN0cmluZ19DaGVjayhhcmdzKSkgeworICAgICAgICBuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RlZCBzdHJpbmcsIGZvdW5kICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZ3MpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBkbHN5bSh4cC0+ZGxfaGFuZGxlLCBuYW1lKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylmdW5jKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRsX2NhbGwoZGxvYmplY3QgKnhwLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqbmFtZTsKLQlsb25nICgqZnVuYykobG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywKLSAgICAgICAgICAgICAgICAgICAgIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcpOwotCWxvbmcgYWxpc3RbMTBdOwotCWxvbmcgcmVzOwotCVB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX1NpemUoYXJncyk7Ci0JaWYgKG4gPCAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhdCBsZWFzdCBhIG5hbWUgaXMgbmVlZGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQluYW1lID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCWlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gKGxvbmcgKCopKGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcpKSAKLSAgICAgICAgICBkbHN5bSh4cC0+ZGxfaGFuZGxlLCBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgZGxlcnJvcigpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuLTEgPiAxMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0b28gbWFueSBhcmd1bWVudHMgKG1heCAxMCkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7Ci0JCWlmIChQeUludF9DaGVjayh2KSkKLQkJCWFsaXN0W2ktMV0gPSBQeUludF9Bc0xvbmcodik7Ci0JCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKQotCQkJYWxpc3RbaS0xXSA9IChsb25nKVB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCQllbHNlIGlmICh2ID09IFB5X05vbmUpCi0JCQlhbGlzdFtpLTFdID0gKGxvbmcpICgoY2hhciAqKU5VTEwpOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgImFyZ3VtZW50cyBtdXN0IGJlIGludCwgc3RyaW5nIG9yIE5vbmUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWZvciAoOyBpIDw9IDEwOyBpKyspCi0JCWFsaXN0W2ktMV0gPSAwOwotCXJlcyA9ICgqZnVuYykoYWxpc3RbMF0sIGFsaXN0WzFdLCBhbGlzdFsyXSwgYWxpc3RbM10sIGFsaXN0WzRdLAotCQkgICAgICBhbGlzdFs1XSwgYWxpc3RbNl0sIGFsaXN0WzddLCBhbGlzdFs4XSwgYWxpc3RbOV0pOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZXMpOworICAgIFB5T2JqZWN0ICpuYW1lOworICAgIGxvbmcgKCpmdW5jKShsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nLAorICAgICAgICAgICAgICAgICBsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nKTsKKyAgICBsb25nIGFsaXN0WzEwXTsKKyAgICBsb25nIHJlczsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9TaXplKGFyZ3MpOworICAgIGlmIChuIDwgMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXQgbGVhc3QgYSBuYW1lIGlzIG5lZWRlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbmFtZSA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmdW5jID0gKGxvbmcgKCopKGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsCisgICAgICAgICAgICAgICAgICAgICBsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nKSkKKyAgICAgIGRsc3ltKHhwLT5kbF9oYW5kbGUsIFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBkbGVycm9yKCkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG4tMSA+IDEwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidG9vIG1hbnkgYXJndW1lbnRzIChtYXggMTApIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOworICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikpCisgICAgICAgICAgICBhbGlzdFtpLTFdID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayh2KSkKKyAgICAgICAgICAgIGFsaXN0W2ktMV0gPSAobG9uZylQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICAgICAgZWxzZSBpZiAodiA9PSBQeV9Ob25lKQorICAgICAgICAgICAgYWxpc3RbaS0xXSA9IChsb25nKSAoKGNoYXIgKilOVUxMKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnRzIG11c3QgYmUgaW50LCBzdHJpbmcgb3IgTm9uZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yICg7IGkgPD0gMTA7IGkrKykKKyAgICAgICAgYWxpc3RbaS0xXSA9IDA7CisgICAgcmVzID0gKCpmdW5jKShhbGlzdFswXSwgYWxpc3RbMV0sIGFsaXN0WzJdLCBhbGlzdFszXSwgYWxpc3RbNF0sCisgICAgICAgICAgICAgICAgICBhbGlzdFs1XSwgYWxpc3RbNl0sIGFsaXN0WzddLCBhbGlzdFs4XSwgYWxpc3RbOV0pOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyZXMpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGxvYmplY3RfbWV0aG9kc1tdID0gewotCXsiY2FsbCIsCShQeUNGdW5jdGlvbilkbF9jYWxsLCBNRVRIX1ZBUkFSR1N9LAotCXsic3ltIiwgCShQeUNGdW5jdGlvbilkbF9zeW0sIE1FVEhfT30sCi0JeyJjbG9zZSIsCShQeUNGdW5jdGlvbilkbF9jbG9zZSwgTUVUSF9OT0FSR1N9LAotCXtOVUxMLCAgCU5VTEx9CQkJIC8qIFNlbnRpbmVsICovCisgICAgeyJjYWxsIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGxfY2FsbCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InN5bSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkbF9zeW0sIE1FVEhfT30sCisgICAgeyJjbG9zZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGxfY2xvc2UsIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRsX2dldGF0dHIoZGxvYmplY3QgKnhwLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKGRsb2JqZWN0X21ldGhvZHMsIChQeU9iamVjdCAqKXhwLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChkbG9iamVjdF9tZXRob2RzLCAoUHlPYmplY3QgKil4cCwgbmFtZSk7CiB9CiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBEbHR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImRsLmRsIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGRsb2JqZWN0KSwJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWRsX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpZGxfZ2V0YXR0ciwvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiZGwuZGwiLCAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoZGxvYmplY3QpLCAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZGxfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWRsX2dldGF0dHIsLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkbF9vcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWludCBtb2RlOwotCVB5VW5pdlB0ciAqaGFuZGxlOwotCWlmIChzaXplb2YoaW50KSAhPSBzaXplb2YobG9uZykgfHwKLQkgICAgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihjaGFyICopKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICBjaGFyICpuYW1lOworICAgIGludCBtb2RlOworICAgIFB5VW5pdlB0ciAqaGFuZGxlOworICAgIGlmIChzaXplb2YoaW50KSAhPSBzaXplb2YobG9uZykgfHwKKyAgICAgICAgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihjaGFyICopKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKICAibW9kdWxlIGRsIHJlcXVpcmVzIHNpemVvZihpbnQpID09IHNpemVvZihsb25nKSA9PSBzaXplb2YoY2hhciopIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiejpvcGVuIiwgJm5hbWUpKQotCQltb2RlID0gUlRMRF9MQVpZOwotCWVsc2UgewotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInppOm9wZW4iLCAmbmFtZSwgJm1vZGUpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIno6b3BlbiIsICZuYW1lKSkKKyAgICAgICAgbW9kZSA9IFJUTERfTEFaWTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6aTpvcGVuIiwgJm5hbWUsICZtb2RlKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2lmbmRlZiBSVExEX05PVwotCQlpZiAobW9kZSAhPSBSVExEX0xBWlkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibW9kZSBtdXN0IGJlIDEiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGlmIChtb2RlICE9IFJUTERfTEFaWSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtb2RlIG11c3QgYmUgMSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICNlbmRpZgotCX0KLQloYW5kbGUgPSBkbG9wZW4obmFtZSwgbW9kZSk7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCWNoYXIgKmVycm1zZyA9IGRsZXJyb3IoKTsKLQkJaWYgKCFlcnJtc2cpCi0JCQllcnJtc2cgPSAiZGxvcGVuKCkgZXJyb3IiOwotCQlQeUVycl9TZXRTdHJpbmcoRGxlcnJvciwgZXJybXNnKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIH0KKyAgICBoYW5kbGUgPSBkbG9wZW4obmFtZSwgbW9kZSk7CisgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIGNoYXIgKmVycm1zZyA9IGRsZXJyb3IoKTsKKyAgICAgICAgaWYgKCFlcnJtc2cpCisgICAgICAgICAgICBlcnJtc2cgPSAiZGxvcGVuKCkgZXJyb3IiOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGxlcnJvciwgZXJybXNnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2lmZGVmIF9fVk1TCi0JLyogICBVbmRlciBPcGVuVk1TIGRsb3BlbiBkb2Vzbid0IGRvIGFueSBjaGVjaywganVzdCBzYXZlIHRoZSBuYW1lCi0JICogZm9yIGxhdGVyIHVzZSwgc28gd2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgZmlsZSBpcyByZWFkYWJsZSwKLQkgKiB0aGUgbmFtZSBjYW4gYmUgYSBsb2dpY2FsIG9yIGEgZmlsZSBmcm9tIFNZUyRTSEFSRS4KLQkgKi8KLQlpZiAoYWNjZXNzKG5hbWUsIFJfT0spKSB7Ci0JCWNoYXIgZm5hbWVbc3RybGVuKG5hbWUpICsgMjBdOwotCQlzdHJjcHkoZm5hbWUsICJTWVMkU0hBUkU6Iik7Ci0JCXN0cmNhdChmbmFtZSwgbmFtZSk7Ci0JCXN0cmNhdChmbmFtZSwgIi5FWEUiKTsKLQkJaWYgKGFjY2VzcyhmbmFtZSwgUl9PSykpIHsKLQkJCWRsY2xvc2UoaGFuZGxlKTsKLQkJCVB5RXJyX1NldFN0cmluZyhEbGVycm9yLAotCQkJCSJGaWxlIG5vdCBmb3VuZCBvciBwcm90ZWN0aW9uIHZpb2xhdGlvbiIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgLyogICBVbmRlciBPcGVuVk1TIGRsb3BlbiBkb2Vzbid0IGRvIGFueSBjaGVjaywganVzdCBzYXZlIHRoZSBuYW1lCisgICAgICogZm9yIGxhdGVyIHVzZSwgc28gd2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgZmlsZSBpcyByZWFkYWJsZSwKKyAgICAgKiB0aGUgbmFtZSBjYW4gYmUgYSBsb2dpY2FsIG9yIGEgZmlsZSBmcm9tIFNZUyRTSEFSRS4KKyAgICAgKi8KKyAgICBpZiAoYWNjZXNzKG5hbWUsIFJfT0spKSB7CisgICAgICAgIGNoYXIgZm5hbWVbc3RybGVuKG5hbWUpICsgMjBdOworICAgICAgICBzdHJjcHkoZm5hbWUsICJTWVMkU0hBUkU6Iik7CisgICAgICAgIHN0cmNhdChmbmFtZSwgbmFtZSk7CisgICAgICAgIHN0cmNhdChmbmFtZSwgIi5FWEUiKTsKKyAgICAgICAgaWYgKGFjY2VzcyhmbmFtZSwgUl9PSykpIHsKKyAgICAgICAgICAgIGRsY2xvc2UoaGFuZGxlKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEbGVycm9yLAorICAgICAgICAgICAgICAgICJGaWxlIG5vdCBmb3VuZCBvciBwcm90ZWN0aW9uIHZpb2xhdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gbmV3ZGxvYmplY3QoaGFuZGxlKTsKKyAgICByZXR1cm4gbmV3ZGxvYmplY3QoaGFuZGxlKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGRsX21ldGhvZHNbXSA9IHsKLQl7Im9wZW4iLAlkbF9vcGVuLCBNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJvcGVuIiwgICAgICAgICAgICBkbF9vcGVuLCBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBGcm9tIHNvY2tldG1vZHVsZS5jCkBAIC0yMjYsNTkgKzIyNiw1OSBAQAogc3RhdGljIHZvaWQKIGluc2ludChQeU9iamVjdCAqZCwgY2hhciAqbmFtZSwgaW50IHZhbHVlKQogewotCVB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsKLQlpZiAoIXYgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdikpCi0JCVB5RXJyX0NsZWFyKCk7CisgICAgUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOworICAgIGlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIAotCVB5X1hERUNSRUYodik7CisgICAgUHlfWERFQ1JFRih2KTsKIH0KIAogUHlNT0RJTklUX0ZVTkMKIGluaXRkbCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZCwgKng7CisgICAgUHlPYmplY3QgKm0sICpkLCAqeDsKIAogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGRsIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wOyB1c2UgdGhlIGN0eXBlcyBtb2R1bGUgaW5zdGVhZCIsIDIpIDwgMCkKLSAgICAgICAgcmV0dXJuOyAgICAKKyAgICByZXR1cm47CiAKLQkvKiBJbml0aWFsaXplIG9iamVjdCB0eXBlICovCi0JUHlfVFlQRSgmRGx0eXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICAvKiBJbml0aWFsaXplIG9iamVjdCB0eXBlICovCisgICAgUHlfVFlQRSgmRGx0eXBlKSA9ICZQeVR5cGVfVHlwZTsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlKCJkbCIsIGRsX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiZGwiLCBkbF9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCURsZXJyb3IgPSB4ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJkbC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIHgpOwotCXggPSBQeUludF9Gcm9tTG9uZygobG9uZylSVExEX0xBWlkpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSVExEX0xBWlkiLCB4KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIERsZXJyb3IgPSB4ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJkbC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZygobG9uZylSVExEX0xBWlkpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSVExEX0xBWlkiLCB4KTsKICNkZWZpbmUgSU5TSU5UKFgpICAgIGluc2ludChkLCNYLFgpCiAjaWZkZWYgUlRMRF9OT1cKLSAgICAgICAgSU5TSU5UKFJUTERfTk9XKTsKKyAgICBJTlNJTlQoUlRMRF9OT1cpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9OT0xPQUQKLSAgICAgICAgSU5TSU5UKFJUTERfTk9MT0FEKTsKKyAgICBJTlNJTlQoUlRMRF9OT0xPQUQpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9HTE9CQUwKLSAgICAgICAgSU5TSU5UKFJUTERfR0xPQkFMKTsKKyAgICBJTlNJTlQoUlRMRF9HTE9CQUwpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9MT0NBTAotICAgICAgICBJTlNJTlQoUlRMRF9MT0NBTCk7CisgICAgSU5TSU5UKFJUTERfTE9DQUwpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9QQVJFTlQKLSAgICAgICAgSU5TSU5UKFJUTERfUEFSRU5UKTsKKyAgICBJTlNJTlQoUlRMRF9QQVJFTlQpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9HUk9VUAotICAgICAgICBJTlNJTlQoUlRMRF9HUk9VUCk7CisgICAgSU5TSU5UKFJUTERfR1JPVVApOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9XT1JMRAotICAgICAgICBJTlNJTlQoUlRMRF9XT1JMRCk7CisgICAgSU5TSU5UKFJUTERfV09STEQpOwogI2VuZGlmCiAjaWZkZWYgUlRMRF9OT0RFTEVURQotICAgICAgICBJTlNJTlQoUlRMRF9OT0RFTEVURSk7CisgICAgSU5TSU5UKFJUTERfTk9ERUxFVEUpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Vycm5vbW9kdWxlLmMgYi9Nb2R1bGVzL2Vycm5vbW9kdWxlLmMKaW5kZXggNjQyZDcyMS4uNjhjM2M0OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9lcnJub21vZHVsZS5jCisrKyBiL01vZHVsZXMvZXJybm9tb2R1bGUuYwpAQCAtMTAsMTAgKzEwLDEwIEBACiAKIC8qCiAgKiBQdWxsIGluIHRoZSBzeXN0ZW0gZXJyb3IgZGVmaW5pdGlvbnMKLSAqLyAKKyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgZXJybm9fbWV0aG9kc1tdID0gewotCXtOVUxMLAkgICAgICAJTlVMTH0KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9CiB9OwogCiAvKiBIZWxwZXIgZnVuY3Rpb24gZG9pbmcgdGhlIGRpY3Rpb25hcnkgaW5zZXJ0aW5nICovCkBAIC0yMSwyMSArMjEsMjEgQEAKIHN0YXRpYyB2b2lkCiBfaW5zY29kZShQeU9iamVjdCAqZCwgUHlPYmplY3QgKmRlLCBjaGFyICpuYW1lLCBpbnQgY29kZSkKIHsKLQlQeU9iamVjdCAqdSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7Ci0JUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgY29kZSk7CisgICAgUHlPYmplY3QgKnUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworICAgIFB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNvZGUpOwogCi0JLyogRG9uJ3QgYm90aGVyIGNoZWNraW5nIGZvciBlcnJvcnM7IHRoZXknbGwgYmUgY2F1Z2h0IGF0IHRoZSBlbmQKLQkgKiBvZiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGJ5IHRoZSBjYWxsZXIgb2YKLQkgKiBpbml0ZXJybm8oKS4KLQkgKi8KLQlpZiAodSAmJiB2KSB7Ci0JCS8qIGluc2VydCBpbiBtb2R1bGVzIGRpY3QgKi8KLQkJUHlEaWN0X1NldEl0ZW0oZCwgdSwgdik7Ci0JCS8qIGluc2VydCBpbiBlcnJvcmNvZGUgZGljdCAqLwotCQlQeURpY3RfU2V0SXRlbShkZSwgdiwgdSk7Ci0JfQotCVB5X1hERUNSRUYodSk7Ci0JUHlfWERFQ1JFRih2KTsKKyAgICAvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgZm9yIGVycm9yczsgdGhleSdsbCBiZSBjYXVnaHQgYXQgdGhlIGVuZAorICAgICAqIG9mIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gYnkgdGhlIGNhbGxlciBvZgorICAgICAqIGluaXRlcnJubygpLgorICAgICAqLworICAgIGlmICh1ICYmIHYpIHsKKyAgICAgICAgLyogaW5zZXJ0IGluIG1vZHVsZXMgZGljdCAqLworICAgICAgICBQeURpY3RfU2V0SXRlbShkLCB1LCB2KTsKKyAgICAgICAgLyogaW5zZXJ0IGluIGVycm9yY29kZSBkaWN0ICovCisgICAgICAgIFB5RGljdF9TZXRJdGVtKGRlLCB2LCB1KTsKKyAgICB9CisgICAgUHlfWERFQ1JFRih1KTsKKyAgICBQeV9YREVDUkVGKHYpOwogfQogCiBQeURvY19TVFJWQVIoZXJybm9fX2RvY19fLApAQCAtNTUsNzM0ICs1NSw3MzQgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0ZXJybm8odm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQsICpkZTsKLQltID0gUHlfSW5pdE1vZHVsZTMoImVycm5vIiwgZXJybm9fbWV0aG9kcywgZXJybm9fX2RvY19fKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JZGUgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFkIHx8ICFkZSB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3Jjb2RlIiwgZGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqZCwgKmRlOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiZXJybm8iLCBlcnJub19tZXRob2RzLCBlcnJub19fZG9jX18pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBkZSA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIWQgfHwgIWRlIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvcmNvZGUiLCBkZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKIC8qIE1hY3JvIHNvIEkgZG9uJ3QgaGF2ZSB0byBlZGl0IGVhY2ggYW5kIGV2ZXJ5IGxpbmUgYmVsb3cuLi4gKi8KICNkZWZpbmUgaW5zY29kZShkLCBkcywgZGUsIG5hbWUsIGNvZGUsIGNvbW1lbnQpIF9pbnNjb2RlKGQsIGRlLCBuYW1lLCBjb2RlKQogCi0JLyoKLQkgKiBUaGUgbmFtZXMgYW5kIGNvbW1lbnRzIGFyZSBib3Jyb3dlZCBmcm9tIGxpbnV4L2luY2x1ZGUvZXJybm8uaCwKLQkgKiB3aGljaCBzaG91bGQgYmUgcHJldHR5IGFsbC1pbmNsdXNpdmUKLQkgKi8gCisgICAgLyoKKyAgICAgKiBUaGUgbmFtZXMgYW5kIGNvbW1lbnRzIGFyZSBib3Jyb3dlZCBmcm9tIGxpbnV4L2luY2x1ZGUvZXJybm8uaCwKKyAgICAgKiB3aGljaCBzaG91bGQgYmUgcHJldHR5IGFsbC1pbmNsdXNpdmUKKyAgICAgKi8KIAogI2lmZGVmIEVOT0RFVgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PREVWIiwgRU5PREVWLCAiTm8gc3VjaCBkZXZpY2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0RFViIsIEVOT0RFViwgIk5vIHN1Y2ggZGV2aWNlIik7CiAjZW5kaWYKICNpZmRlZiBFTk9DU0kKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0NTSSIsIEVOT0NTSSwgIk5vIENTSSBzdHJ1Y3R1cmUgYXZhaWxhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9DU0kiLCBFTk9DU0ksICJObyBDU0kgc3RydWN0dXJlIGF2YWlsYWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgRUhPU1RVTlJFQUNICi0JaW5zY29kZShkLCBkcywgZGUsICJFSE9TVFVOUkVBQ0giLCBFSE9TVFVOUkVBQ0gsICJObyByb3V0ZSB0byBob3N0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSE9TVFVOUkVBQ0giLCBFSE9TVFVOUkVBQ0gsICJObyByb3V0ZSB0byBob3N0Iik7CiAjZWxzZQogI2lmZGVmIFdTQUVIT1NUVU5SRUFDSAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUhPU1RVTlJFQUNIIiwgV1NBRUhPU1RVTlJFQUNILCAiTm8gcm91dGUgdG8gaG9zdCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUhPU1RVTlJFQUNIIiwgV1NBRUhPU1RVTlJFQUNILCAiTm8gcm91dGUgdG8gaG9zdCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9NU0cKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT01TRyIsIEVOT01TRywgIk5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9NU0ciLCBFTk9NU0csICJObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZSIpOwogI2VuZGlmCiAjaWZkZWYgRVVDTEVBTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVVDTEVBTiIsIEVVQ0xFQU4sICJTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmciKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVVQ0xFQU4iLCBFVUNMRUFOLCAiU3RydWN0dXJlIG5lZWRzIGNsZWFuaW5nIik7CiAjZW5kaWYKICNpZmRlZiBFTDJOU1lOQwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUwyTlNZTkMiLCBFTDJOU1lOQywgIkxldmVsIDIgbm90IHN5bmNocm9uaXplZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUwyTlNZTkMiLCBFTDJOU1lOQywgIkxldmVsIDIgbm90IHN5bmNocm9uaXplZCIpOwogI2VuZGlmCiAjaWZkZWYgRUwySExUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTDJITFQiLCBFTDJITFQsICJMZXZlbCAyIGhhbHRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUwySExUIiwgRUwySExULCAiTGV2ZWwgMiBoYWx0ZWQiKTsKICNlbmRpZgogI2lmZGVmIEVOT0RBVEEKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0RBVEEiLCBFTk9EQVRBLCAiTm8gZGF0YSBhdmFpbGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0RBVEEiLCBFTk9EQVRBLCAiTm8gZGF0YSBhdmFpbGFibGUiKTsKICNlbmRpZgogI2lmZGVmIEVOT1RCTEsKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RCTEsiLCBFTk9UQkxLLCAiQmxvY2sgZGV2aWNlIHJlcXVpcmVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9UQkxLIiwgRU5PVEJMSywgIkJsb2NrIGRldmljZSByZXF1aXJlZCIpOwogI2VuZGlmCiAjaWZkZWYgRU5PU1lTCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9TWVMiLCBFTk9TWVMsICJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NZUyIsIEVOT1NZUywgIkZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCIpOwogI2VuZGlmCiAjaWZkZWYgRVBJUEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVQSVBFIiwgRVBJUEUsICJCcm9rZW4gcGlwZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVBJUEUiLCBFUElQRSwgIkJyb2tlbiBwaXBlIik7CiAjZW5kaWYKICNpZmRlZiBFSU5WQUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlZBTCIsIEVJTlZBTCwgIkludmFsaWQgYXJndW1lbnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlZBTCIsIEVJTlZBTCwgIkludmFsaWQgYXJndW1lbnQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUlOVkFMCi0JaW5zY29kZShkLCBkcywgZGUsICJFSU5WQUwiLCBXU0FFSU5WQUwsICJJbnZhbGlkIGFyZ3VtZW50Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSU5WQUwiLCBXU0FFSU5WQUwsICJJbnZhbGlkIGFyZ3VtZW50Iik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVPVkVSRkxPVwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU9WRVJGTE9XIiwgRU9WRVJGTE9XLCAiVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU9WRVJGTE9XIiwgRU9WRVJGTE9XLCAiVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSIpOwogI2VuZGlmCiAjaWZkZWYgRUFEVgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFEViIsIEVBRFYsICJBZHZlcnRpc2UgZXJyb3IiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVBRFYiLCBFQURWLCAiQWR2ZXJ0aXNlIGVycm9yIik7CiAjZW5kaWYKICNpZmRlZiBFSU5UUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUlOVFIiLCBFSU5UUiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSU5UUiIsIEVJTlRSLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUlOVFIKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlRSIiwgV1NBRUlOVFIsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUlOVFIiLCBXU0FFSU5UUiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVVU0VSUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVVTRVJTIiwgRVVTRVJTLCAiVG9vIG1hbnkgdXNlcnMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVVU0VSUyIsIEVVU0VSUywgIlRvbyBtYW55IHVzZXJzIik7CiAjZWxzZQogI2lmZGVmIFdTQUVVU0VSUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVVTRVJTIiwgV1NBRVVTRVJTLCAiVG9vIG1hbnkgdXNlcnMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVVU0VSUyIsIFdTQUVVU0VSUywgIlRvbyBtYW55IHVzZXJzIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT1RFTVBUWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVEVNUFRZIiwgRU5PVEVNUFRZLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVEVNUFRZIiwgRU5PVEVNUFRZLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSIpOwogI2Vsc2UKICNpZmRlZiBXU0FFTk9URU1QVFkKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RFTVBUWSIsIFdTQUVOT1RFTVBUWSwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RFTVBUWSIsIFdTQUVOT1RFTVBUWSwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU5PQlVGUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PQlVGUyIsIEVOT0JVRlMsICJObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9CVUZTIiwgRU5PQlVGUywgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU5PQlVGUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PQlVGUyIsIFdTQUVOT0JVRlMsICJObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9CVUZTIiwgV1NBRU5PQlVGUywgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRVBST1RPCi0JaW5zY29kZShkLCBkcywgZGUsICJFUFJPVE8iLCBFUFJPVE8sICJQcm90b2NvbCBlcnJvciIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPIiwgRVBST1RPLCAiUHJvdG9jb2wgZXJyb3IiKTsKICNlbmRpZgogI2lmZGVmIEVSRU1PVEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRU1PVEUiLCBFUkVNT1RFLCAiT2JqZWN0IGlzIHJlbW90ZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVJFTU9URSIsIEVSRU1PVEUsICJPYmplY3QgaXMgcmVtb3RlIik7CiAjZWxzZQogI2lmZGVmIFdTQUVSRU1PVEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRU1PVEUiLCBXU0FFUkVNT1RFLCAiT2JqZWN0IGlzIHJlbW90ZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVJFTU9URSIsIFdTQUVSRU1PVEUsICJPYmplY3QgaXMgcmVtb3RlIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOQVZBSUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOQVZBSUwiLCBFTkFWQUlMLCAiTm8gWEVOSVggc2VtYXBob3JlcyBhdmFpbGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOQVZBSUwiLCBFTkFWQUlMLCAiTm8gWEVOSVggc2VtYXBob3JlcyBhdmFpbGFibGUiKTsKICNlbmRpZgogI2lmZGVmIEVDSElMRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNISUxEIiwgRUNISUxELCAiTm8gY2hpbGQgcHJvY2Vzc2VzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQ0hJTEQiLCBFQ0hJTEQsICJObyBjaGlsZCBwcm9jZXNzZXMiKTsKICNlbmRpZgogI2lmZGVmIEVMT09QCi0JaW5zY29kZShkLCBkcywgZGUsICJFTE9PUCIsIEVMT09QLCAiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVMT09QIiwgRUxPT1AsICJUb28gbWFueSBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFTE9PUAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUxPT1AiLCBXU0FFTE9PUCwgIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTE9PUCIsIFdTQUVMT09QLCAiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRVhERVYKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVYREVWIiwgRVhERVYsICJDcm9zcy1kZXZpY2UgbGluayIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVhERVYiLCBFWERFViwgIkNyb3NzLWRldmljZSBsaW5rIik7CiAjZW5kaWYKICNpZmRlZiBFMkJJRwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRTJCSUciLCBFMkJJRywgIkFyZyBsaXN0IHRvbyBsb25nIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFMkJJRyIsIEUyQklHLCAiQXJnIGxpc3QgdG9vIGxvbmciKTsKICNlbmRpZgogI2lmZGVmIEVTUkNICi0JaW5zY29kZShkLCBkcywgZGUsICJFU1JDSCIsIEVTUkNILCAiTm8gc3VjaCBwcm9jZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU1JDSCIsIEVTUkNILCAiTm8gc3VjaCBwcm9jZXNzIik7CiAjZW5kaWYKICNpZmRlZiBFTVNHU0laRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU1TR1NJWkUiLCBFTVNHU0laRSwgIk1lc3NhZ2UgdG9vIGxvbmciKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVNU0dTSVpFIiwgRU1TR1NJWkUsICJNZXNzYWdlIHRvbyBsb25nIik7CiAjZWxzZQogI2lmZGVmIFdTQUVNU0dTSVpFCi0JaW5zY29kZShkLCBkcywgZGUsICJFTVNHU0laRSIsIFdTQUVNU0dTSVpFLCAiTWVzc2FnZSB0b28gbG9uZyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU1TR1NJWkUiLCBXU0FFTVNHU0laRSwgIk1lc3NhZ2UgdG9vIGxvbmciKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUFGTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUZOT1NVUFBPUlQiLCBFQUZOT1NVUFBPUlQsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUZOT1NVUFBPUlQiLCBFQUZOT1NVUFBPUlQsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIik7CiAjZWxzZQogI2lmZGVmIFdTQUVBRk5PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFGTk9TVVBQT1JUIiwgV1NBRUFGTk9TVVBQT1JULCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFGTk9TVVBQT1JUIiwgV1NBRUFGTk9TVVBQT1JULCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFQkFEUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUJBRFIiLCBFQkFEUiwgIkludmFsaWQgcmVxdWVzdCBkZXNjcmlwdG9yIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkFEUiIsIEVCQURSLCAiSW52YWxpZCByZXF1ZXN0IGRlc2NyaXB0b3IiKTsKICNlbmRpZgogI2lmZGVmIEVIT1NURE9XTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUhPU1RET1dOIiwgRUhPU1RET1dOLCAiSG9zdCBpcyBkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSE9TVERPV04iLCBFSE9TVERPV04sICJIb3N0IGlzIGRvd24iKTsKICNlbHNlCiAjaWZkZWYgV1NBRUhPU1RET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJFSE9TVERPV04iLCBXU0FFSE9TVERPV04sICJIb3N0IGlzIGRvd24iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVIT1NURE9XTiIsIFdTQUVIT1NURE9XTiwgIkhvc3QgaXMgZG93biIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFUEZOT1NVUFBPUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVQRk5PU1VQUE9SVCIsIEVQRk5PU1VQUE9SVCwgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUEZOT1NVUFBPUlQiLCBFUEZOT1NVUFBPUlQsICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFUEZOT1NVUFBPUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVQRk5PU1VQUE9SVCIsIFdTQUVQRk5PU1VQUE9SVCwgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUEZOT1NVUFBPUlQiLCBXU0FFUEZOT1NVUFBPUlQsICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9QUk9UT09QVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PUFJPVE9PUFQiLCBFTk9QUk9UT09QVCwgIlByb3RvY29sIG5vdCBhdmFpbGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1BST1RPT1BUIiwgRU5PUFJPVE9PUFQsICJQcm90b2NvbCBub3QgYXZhaWxhYmxlIik7CiAjZWxzZQogI2lmZGVmIFdTQUVOT1BST1RPT1BUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9QUk9UT09QVCIsIFdTQUVOT1BST1RPT1BULCAiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PUFJPVE9PUFQiLCBXU0FFTk9QUk9UT09QVCwgIlByb3RvY29sIG5vdCBhdmFpbGFibGUiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUJVU1kKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVCVVNZIiwgRUJVU1ksICJEZXZpY2Ugb3IgcmVzb3VyY2UgYnVzeSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUJVU1kiLCBFQlVTWSwgIkRldmljZSBvciByZXNvdXJjZSBidXN5Iik7CiAjZW5kaWYKICNpZmRlZiBFV09VTERCTE9DSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVdPVUxEQkxPQ0siLCBFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVdPVUxEQkxPQ0siLCBFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOwogI2Vsc2UKICNpZmRlZiBXU0FFV09VTERCTE9DSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVdPVUxEQkxPQ0siLCBXU0FFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVdPVUxEQkxPQ0siLCBXU0FFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFQkFERkQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURGRCIsIEVCQURGRCwgIkZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURGRCIsIEVCQURGRCwgIkZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUiKTsKICNlbmRpZgogI2lmZGVmIEVET1RET1QKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVET1RET1QiLCBFRE9URE9ULCAiUkZTIHNwZWNpZmljIGVycm9yIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFRE9URE9UIiwgRURPVERPVCwgIlJGUyBzcGVjaWZpYyBlcnJvciIpOwogI2VuZGlmCiAjaWZkZWYgRUlTQ09OTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUlTQ09OTiIsIEVJU0NPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJU0NPTk4iLCBFSVNDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkIik7CiAjZWxzZQogI2lmZGVmIFdTQUVJU0NPTk4KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJU0NPTk4iLCBXU0FFSVNDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSVNDT05OIiwgV1NBRUlTQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9BTk8KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0FOTyIsIEVOT0FOTywgIk5vIGFub2RlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9BTk8iLCBFTk9BTk8sICJObyBhbm9kZSIpOwogI2VuZGlmCiAjaWZkZWYgRVNIVVRET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJFU0hVVERPV04iLCBFU0hVVERPV04sICJDYW5ub3Qgc2VuZCBhZnRlciB0cmFuc3BvcnQgZW5kcG9pbnQgc2h1dGRvd24iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVTSFVURE9XTiIsIEVTSFVURE9XTiwgIkNhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biIpOwogI2Vsc2UKICNpZmRlZiBXU0FFU0hVVERPV04KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVTSFVURE9XTiIsIFdTQUVTSFVURE9XTiwgIkNhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVNIVVRET1dOIiwgV1NBRVNIVVRET1dOLCAiQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVDSFJORwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNIUk5HIiwgRUNIUk5HLCAiQ2hhbm5lbCBudW1iZXIgb3V0IG9mIHJhbmdlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQ0hSTkciLCBFQ0hSTkcsICJDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKICNlbmRpZgogI2lmZGVmIEVMSUJCQUQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVMSUJCQUQiLCBFTElCQkFELCAiQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJyYXJ5Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTElCQkFEIiwgRUxJQkJBRCwgIkFjY2Vzc2luZyBhIGNvcnJ1cHRlZCBzaGFyZWQgbGlicmFyeSIpOwogI2VuZGlmCiAjaWZkZWYgRU5PTkVUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9ORVQiLCBFTk9ORVQsICJNYWNoaW5lIGlzIG5vdCBvbiB0aGUgbmV0d29yayIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTkVUIiwgRU5PTkVULCAiTWFjaGluZSBpcyBub3Qgb24gdGhlIG5ldHdvcmsiKTsKICNlbmRpZgogI2lmZGVmIEVCQURFCi0JaW5zY29kZShkLCBkcywgZGUsICJFQkFERSIsIEVCQURFLCAiSW52YWxpZCBleGNoYW5nZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUJBREUiLCBFQkFERSwgIkludmFsaWQgZXhjaGFuZ2UiKTsKICNlbmRpZgogI2lmZGVmIEVCQURGCi0JaW5zY29kZShkLCBkcywgZGUsICJFQkFERiIsIEVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkFERiIsIEVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CiAjZWxzZQogI2lmZGVmIFdTQUVCQURGCi0JaW5zY29kZShkLCBkcywgZGUsICJFQkFERiIsIFdTQUVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkFERiIsIFdTQUVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVNVUxUSUhPUAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU1VTFRJSE9QIiwgRU1VTFRJSE9QLCAiTXVsdGlob3AgYXR0ZW1wdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTVVMVElIT1AiLCBFTVVMVElIT1AsICJNdWx0aWhvcCBhdHRlbXB0ZWQiKTsKICNlbmRpZgogI2lmZGVmIEVJTwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUlPIiwgRUlPLCAiSS9PIGVycm9yIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSU8iLCBFSU8sICJJL08gZXJyb3IiKTsKICNlbmRpZgogI2lmZGVmIEVVTkFUQ0gKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVVTkFUQ0giLCBFVU5BVENILCAiUHJvdG9jb2wgZHJpdmVyIG5vdCBhdHRhY2hlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVVOQVRDSCIsIEVVTkFUQ0gsICJQcm90b2NvbCBkcml2ZXIgbm90IGF0dGFjaGVkIik7CiAjZW5kaWYKICNpZmRlZiBFUFJPVE9UWVBFCi0JaW5zY29kZShkLCBkcywgZGUsICJFUFJPVE9UWVBFIiwgRVBST1RPVFlQRSwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPVFlQRSIsIEVQUk9UT1RZUEUsICJQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRVBST1RPVFlQRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPVFlQRSIsIFdTQUVQUk9UT1RZUEUsICJQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVQUk9UT1RZUEUiLCBXU0FFUFJPVE9UWVBFLCAiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0Iik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT1NQQwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PU1BDIiwgRU5PU1BDLCAiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NQQyIsIEVOT1NQQywgIk5vIHNwYWNlIGxlZnQgb24gZGV2aWNlIik7CiAjZW5kaWYKICNpZmRlZiBFTk9FWEVDCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9FWEVDIiwgRU5PRVhFQywgIkV4ZWMgZm9ybWF0IGVycm9yIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9FWEVDIiwgRU5PRVhFQywgIkV4ZWMgZm9ybWF0IGVycm9yIik7CiAjZW5kaWYKICNpZmRlZiBFQUxSRUFEWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFMUkVBRFkiLCBFQUxSRUFEWSwgIk9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUxSRUFEWSIsIEVBTFJFQURZLCAiT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUFMUkVBRFkKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVBTFJFQURZIiwgV1NBRUFMUkVBRFksICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFMUkVBRFkiLCBXU0FFQUxSRUFEWSwgIk9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVORVRET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJFTkVURE9XTiIsIEVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTkVURE9XTiIsIEVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CiAjZWxzZQogI2lmZGVmIFdTQUVORVRET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJFTkVURE9XTiIsIFdTQUVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTkVURE9XTiIsIFdTQUVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT1ROQU0KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1ROQU0iLCBFTk9UTkFNLCAiTm90IGEgWEVOSVggbmFtZWQgdHlwZSBmaWxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9UTkFNIiwgRU5PVE5BTSwgIk5vdCBhIFhFTklYIG5hbWVkIHR5cGUgZmlsZSIpOwogI2VuZGlmCiAjaWZkZWYgRUFDQ0VTCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUNDRVMiLCBFQUNDRVMsICJQZXJtaXNzaW9uIGRlbmllZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFDQ0VTIiwgRUFDQ0VTLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUFDQ0VTCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUNDRVMiLCBXU0FFQUNDRVMsICJQZXJtaXNzaW9uIGRlbmllZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFDQ0VTIiwgV1NBRUFDQ0VTLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUxOUk5HCi0JaW5zY29kZShkLCBkcywgZGUsICJFTE5STkciLCBFTE5STkcsICJMaW5rIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVMTlJORyIsIEVMTlJORywgIkxpbmsgbnVtYmVyIG91dCBvZiByYW5nZSIpOwogI2VuZGlmCiAjaWZkZWYgRUlMU0VRCi0JaW5zY29kZShkLCBkcywgZGUsICJFSUxTRVEiLCBFSUxTRVEsICJJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTFNFUSIsIEVJTFNFUSwgIklsbGVnYWwgYnl0ZSBzZXF1ZW5jZSIpOwogI2VuZGlmCiAjaWZkZWYgRU5PVERJUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVERJUiIsIEVOT1RESVIsICJOb3QgYSBkaXJlY3RvcnkiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RESVIiLCBFTk9URElSLCAiTm90IGEgZGlyZWN0b3J5Iik7CiAjZW5kaWYKICNpZmRlZiBFTk9UVU5JUQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVFVOSVEiLCBFTk9UVU5JUSwgIk5hbWUgbm90IHVuaXF1ZSBvbiBuZXR3b3JrIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9UVU5JUSIsIEVOT1RVTklRLCAiTmFtZSBub3QgdW5pcXVlIG9uIG5ldHdvcmsiKTsKICNlbmRpZgogI2lmZGVmIEVQRVJNCi0JaW5zY29kZShkLCBkcywgZGUsICJFUEVSTSIsIEVQRVJNLCAiT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVQRVJNIiwgRVBFUk0sICJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCIpOwogI2VuZGlmCiAjaWZkZWYgRURPTQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRURPTSIsIEVET00sICJNYXRoIGFyZ3VtZW50IG91dCBvZiBkb21haW4gb2YgZnVuYyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRURPTSIsIEVET00sICJNYXRoIGFyZ3VtZW50IG91dCBvZiBkb21haW4gb2YgZnVuYyIpOwogI2VuZGlmCiAjaWZkZWYgRVhGVUxMCi0JaW5zY29kZShkLCBkcywgZGUsICJFWEZVTEwiLCBFWEZVTEwsICJFeGNoYW5nZSBmdWxsIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFWEZVTEwiLCBFWEZVTEwsICJFeGNoYW5nZSBmdWxsIik7CiAjZW5kaWYKICNpZmRlZiBFQ09OTlJFRlVTRUQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVDT05OUkVGVVNFRCIsIEVDT05OUkVGVVNFRCwgIkNvbm5lY3Rpb24gcmVmdXNlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5SRUZVU0VEIiwgRUNPTk5SRUZVU0VELCAiQ29ubmVjdGlvbiByZWZ1c2VkIik7CiAjZWxzZQogI2lmZGVmIFdTQUVDT05OUkVGVVNFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5SRUZVU0VEIiwgV1NBRUNPTk5SRUZVU0VELCAiQ29ubmVjdGlvbiByZWZ1c2VkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQ09OTlJFRlVTRUQiLCBXU0FFQ09OTlJFRlVTRUQsICJDb25uZWN0aW9uIHJlZnVzZWQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUlTRElSCi0JaW5zY29kZShkLCBkcywgZGUsICJFSVNESVIiLCBFSVNESVIsICJJcyBhIGRpcmVjdG9yeSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUlTRElSIiwgRUlTRElSLCAiSXMgYSBkaXJlY3RvcnkiKTsKICNlbmRpZgogI2lmZGVmIEVQUk9UT05PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPTk9TVVBQT1JUIiwgRVBST1RPTk9TVVBQT1JULCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPTk9TVVBQT1JUIiwgRVBST1RPTk9TVVBQT1JULCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFUFJPVE9OT1NVUFBPUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVQUk9UT05PU1VQUE9SVCIsIFdTQUVQUk9UT05PU1VQUE9SVCwgIlByb3RvY29sIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVQUk9UT05PU1VQUE9SVCIsIFdTQUVQUk9UT05PU1VQUE9SVCwgIlByb3RvY29sIG5vdCBzdXBwb3J0ZWQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRVJPRlMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVST0ZTIiwgRVJPRlMsICJSZWFkLW9ubHkgZmlsZSBzeXN0ZW0iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVST0ZTIiwgRVJPRlMsICJSZWFkLW9ubHkgZmlsZSBzeXN0ZW0iKTsKICNlbmRpZgogI2lmZGVmIEVBRERSTk9UQVZBSUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVBRERSTk9UQVZBSUwiLCBFQUREUk5PVEFWQUlMLCAiQ2Fubm90IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFERFJOT1RBVkFJTCIsIEVBRERSTk9UQVZBSUwsICJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIik7CiAjZWxzZQogI2lmZGVmIFdTQUVBRERSTk9UQVZBSUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVBRERSTk9UQVZBSUwiLCBXU0FFQUREUk5PVEFWQUlMLCAiQ2Fubm90IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFERFJOT1RBVkFJTCIsIFdTQUVBRERSTk9UQVZBSUwsICJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVJRFJNCi0JaW5zY29kZShkLCBkcywgZGUsICJFSURSTSIsIEVJRFJNLCAiSWRlbnRpZmllciByZW1vdmVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSURSTSIsIEVJRFJNLCAiSWRlbnRpZmllciByZW1vdmVkIik7CiAjZW5kaWYKICNpZmRlZiBFQ09NTQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTU0iLCBFQ09NTSwgIkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTU0iLCBFQ09NTSwgIkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCIpOwogI2VuZGlmCiAjaWZkZWYgRVNSTU5UCi0JaW5zY29kZShkLCBkcywgZGUsICJFU1JNTlQiLCBFU1JNTlQsICJTcm1vdW50IGVycm9yIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU1JNTlQiLCBFU1JNTlQsICJTcm1vdW50IGVycm9yIik7CiAjZW5kaWYKICNpZmRlZiBFUkVNT1RFSU8KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRU1PVEVJTyIsIEVSRU1PVEVJTywgIlJlbW90ZSBJL08gZXJyb3IiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRU1PVEVJTyIsIEVSRU1PVEVJTywgIlJlbW90ZSBJL08gZXJyb3IiKTsKICNlbmRpZgogI2lmZGVmIEVMM1JTVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUwzUlNUIiwgRUwzUlNULCAiTGV2ZWwgMyByZXNldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUwzUlNUIiwgRUwzUlNULCAiTGV2ZWwgMyByZXNldCIpOwogI2VuZGlmCiAjaWZkZWYgRUJBRE1TRwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUJBRE1TRyIsIEVCQURNU0csICJOb3QgYSBkYXRhIG1lc3NhZ2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURNU0ciLCBFQkFETVNHLCAiTm90IGEgZGF0YSBtZXNzYWdlIik7CiAjZW5kaWYKICNpZmRlZiBFTkZJTEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVORklMRSIsIEVORklMRSwgIkZpbGUgdGFibGUgb3ZlcmZsb3ciKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVORklMRSIsIEVORklMRSwgIkZpbGUgdGFibGUgb3ZlcmZsb3ciKTsKICNlbmRpZgogI2lmZGVmIEVMSUJNQVgKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVMSUJNQVgiLCBFTElCTUFYLCAiQXR0ZW1wdGluZyB0byBsaW5rIGluIHRvbyBtYW55IHNoYXJlZCBsaWJyYXJpZXMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVMSUJNQVgiLCBFTElCTUFYLCAiQXR0ZW1wdGluZyB0byBsaW5rIGluIHRvbyBtYW55IHNoYXJlZCBsaWJyYXJpZXMiKTsKICNlbmRpZgogI2lmZGVmIEVTUElQRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVNQSVBFIiwgRVNQSVBFLCAiSWxsZWdhbCBzZWVrIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU1BJUEUiLCBFU1BJUEUsICJJbGxlZ2FsIHNlZWsiKTsKICNlbmRpZgogI2lmZGVmIEVOT0xJTksKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0xJTksiLCBFTk9MSU5LLCAiTGluayBoYXMgYmVlbiBzZXZlcmVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9MSU5LIiwgRU5PTElOSywgIkxpbmsgaGFzIGJlZW4gc2V2ZXJlZCIpOwogI2VuZGlmCiAjaWZkZWYgRU5FVFJFU0VUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTkVUUkVTRVQiLCBFTkVUUkVTRVQsICJOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTkVUUkVTRVQiLCBFTkVUUkVTRVQsICJOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0Iik7CiAjZWxzZQogI2lmZGVmIFdTQUVORVRSRVNFVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5FVFJFU0VUIiwgV1NBRU5FVFJFU0VULCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5FVFJFU0VUIiwgV1NBRU5FVFJFU0VULCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFVElNRURPVVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVUSU1FRE9VVCIsIEVUSU1FRE9VVCwgIkNvbm5lY3Rpb24gdGltZWQgb3V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFVElNRURPVVQiLCBFVElNRURPVVQsICJDb25uZWN0aW9uIHRpbWVkIG91dCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFVElNRURPVVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVUSU1FRE9VVCIsIFdTQUVUSU1FRE9VVCwgIkNvbm5lY3Rpb24gdGltZWQgb3V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFVElNRURPVVQiLCBXU0FFVElNRURPVVQsICJDb25uZWN0aW9uIHRpbWVkIG91dCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9FTlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0VOVCIsIEVOT0VOVCwgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0VOVCIsIEVOT0VOVCwgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsKICNlbmRpZgogI2lmZGVmIEVFWElTVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUVYSVNUIiwgRUVYSVNULCAiRmlsZSBleGlzdHMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVFWElTVCIsIEVFWElTVCwgIkZpbGUgZXhpc3RzIik7CiAjZW5kaWYKICNpZmRlZiBFRFFVT1QKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVEUVVPVCIsIEVEUVVPVCwgIlF1b3RhIGV4Y2VlZGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFRFFVT1QiLCBFRFFVT1QsICJRdW90YSBleGNlZWRlZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFRFFVT1QKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVEUVVPVCIsIFdTQUVEUVVPVCwgIlF1b3RhIGV4Y2VlZGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFRFFVT1QiLCBXU0FFRFFVT1QsICJRdW90YSBleGNlZWRlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9TVFIKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NUUiIsIEVOT1NUUiwgIkRldmljZSBub3QgYSBzdHJlYW0iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NUUiIsIEVOT1NUUiwgIkRldmljZSBub3QgYSBzdHJlYW0iKTsKICNlbmRpZgogI2lmZGVmIEVCQURTTFQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURTTFQiLCBFQkFEU0xULCAiSW52YWxpZCBzbG90Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkFEU0xUIiwgRUJBRFNMVCwgIkludmFsaWQgc2xvdCIpOwogI2VuZGlmCiAjaWZkZWYgRUJBRFJRQwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUJBRFJRQyIsIEVCQURSUUMsICJJbnZhbGlkIHJlcXVlc3QgY29kZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUJBRFJRQyIsIEVCQURSUUMsICJJbnZhbGlkIHJlcXVlc3QgY29kZSIpOwogI2VuZGlmCiAjaWZkZWYgRUxJQkFDQwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUxJQkFDQyIsIEVMSUJBQ0MsICJDYW4gbm90IGFjY2VzcyBhIG5lZWRlZCBzaGFyZWQgbGlicmFyeSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUxJQkFDQyIsIEVMSUJBQ0MsICJDYW4gbm90IGFjY2VzcyBhIG5lZWRlZCBzaGFyZWQgbGlicmFyeSIpOwogI2VuZGlmCiAjaWZkZWYgRUZBVUxUCi0JaW5zY29kZShkLCBkcywgZGUsICJFRkFVTFQiLCBFRkFVTFQsICJCYWQgYWRkcmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUZBVUxUIiwgRUZBVUxULCAiQmFkIGFkZHJlc3MiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUZBVUxUCi0JaW5zY29kZShkLCBkcywgZGUsICJFRkFVTFQiLCBXU0FFRkFVTFQsICJCYWQgYWRkcmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUZBVUxUIiwgV1NBRUZBVUxULCAiQmFkIGFkZHJlc3MiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUZCSUcKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVGQklHIiwgRUZCSUcsICJGaWxlIHRvbyBsYXJnZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUZCSUciLCBFRkJJRywgIkZpbGUgdG9vIGxhcmdlIik7CiAjZW5kaWYKICNpZmRlZiBFREVBRExLCi0JaW5zY29kZShkLCBkcywgZGUsICJFREVBRExLIiwgRURFQURMSywgIlJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFREVBRExLIiwgRURFQURMSywgIlJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyIik7CiAjZW5kaWYKICNpZmRlZiBFTk9UQ09OTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVENPTk4iLCBFTk9UQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9UQ09OTiIsIEVOT1RDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU5PVENPTk4KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RDT05OIiwgV1NBRU5PVENPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgbm90IGNvbm5lY3RlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVENPTk4iLCBXU0FFTk9UQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVERVNUQUREUlJFUQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRURFU1RBRERSUkVRIiwgRURFU1RBRERSUkVRLCAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRURFU1RBRERSUkVRIiwgRURFU1RBRERSUkVRLCAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFREVTVEFERFJSRVEKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVERVNUQUREUlJFUSIsIFdTQUVERVNUQUREUlJFUSwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVERVNUQUREUlJFUSIsIFdTQUVERVNUQUREUlJFUSwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUxJQlNDTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUxJQlNDTiIsIEVMSUJTQ04sICIubGliIHNlY3Rpb24gaW4gYS5vdXQgY29ycnVwdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTElCU0NOIiwgRUxJQlNDTiwgIi5saWIgc2VjdGlvbiBpbiBhLm91dCBjb3JydXB0ZWQiKTsKICNlbmRpZgogI2lmZGVmIEVOT0xDSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTENLIiwgRU5PTENLLCAiTm8gcmVjb3JkIGxvY2tzIGF2YWlsYWJsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTENLIiwgRU5PTENLLCAiTm8gcmVjb3JkIGxvY2tzIGF2YWlsYWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgRUlTTkFNCi0JaW5zY29kZShkLCBkcywgZGUsICJFSVNOQU0iLCBFSVNOQU0sICJJcyBhIG5hbWVkIHR5cGUgZmlsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUlTTkFNIiwgRUlTTkFNLCAiSXMgYSBuYW1lZCB0eXBlIGZpbGUiKTsKICNlbmRpZgogI2lmZGVmIEVDT05OQUJPUlRFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5BQk9SVEVEIiwgRUNPTk5BQk9SVEVELCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVDT05OQUJPUlRFRCIsIEVDT05OQUJPUlRFRCwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0Iik7CiAjZWxzZQogI2lmZGVmIFdTQUVDT05OQUJPUlRFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5BQk9SVEVEIiwgV1NBRUNPTk5BQk9SVEVELCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVDT05OQUJPUlRFRCIsIFdTQUVDT05OQUJPUlRFRCwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0Iik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVORVRVTlJFQUNICi0JaW5zY29kZShkLCBkcywgZGUsICJFTkVUVU5SRUFDSCIsIEVORVRVTlJFQUNILCAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5FVFVOUkVBQ0giLCBFTkVUVU5SRUFDSCwgIk5ldHdvcmsgaXMgdW5yZWFjaGFibGUiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU5FVFVOUkVBQ0gKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVORVRVTlJFQUNIIiwgV1NBRU5FVFVOUkVBQ0gsICJOZXR3b3JrIGlzIHVucmVhY2hhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTkVUVU5SRUFDSCIsIFdTQUVORVRVTlJFQUNILCAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFU1RBTEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVTVEFMRSIsIEVTVEFMRSwgIlN0YWxlIE5GUyBmaWxlIGhhbmRsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVNUQUxFIiwgRVNUQUxFLCAiU3RhbGUgTkZTIGZpbGUgaGFuZGxlIik7CiAjZWxzZQogI2lmZGVmIFdTQUVTVEFMRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVNUQUxFIiwgV1NBRVNUQUxFLCAiU3RhbGUgTkZTIGZpbGUgaGFuZGxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU1RBTEUiLCBXU0FFU1RBTEUsICJTdGFsZSBORlMgZmlsZSBoYW5kbGUiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU5PU1IKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NSIiwgRU5PU1IsICJPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NSIiwgRU5PU1IsICJPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMiKTsKICNlbmRpZgogI2lmZGVmIEVOT01FTQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTUVNIiwgRU5PTUVNLCAiT3V0IG9mIG1lbW9yeSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTUVNIiwgRU5PTUVNLCAiT3V0IG9mIG1lbW9yeSIpOwogI2VuZGlmCiAjaWZkZWYgRU5PVFNPQ0sKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RTT0NLIiwgRU5PVFNPQ0ssICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RTT0NLIiwgRU5PVFNPQ0ssICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU5PVFNPQ0sKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RTT0NLIiwgV1NBRU5PVFNPQ0ssICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RTT0NLIiwgV1NBRU5PVFNPQ0ssICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRVNUUlBJUEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVTVFJQSVBFIiwgRVNUUlBJUEUsICJTdHJlYW1zIHBpcGUgZXJyb3IiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVTVFJQSVBFIiwgRVNUUlBJUEUsICJTdHJlYW1zIHBpcGUgZXJyb3IiKTsKICNlbmRpZgogI2lmZGVmIEVNTElOSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU1MSU5LIiwgRU1MSU5LLCAiVG9vIG1hbnkgbGlua3MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVNTElOSyIsIEVNTElOSywgIlRvbyBtYW55IGxpbmtzIik7CiAjZW5kaWYKICNpZmRlZiBFUkFOR0UKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVSQU5HRSIsIEVSQU5HRSwgIk1hdGggcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUkFOR0UiLCBFUkFOR0UsICJNYXRoIHJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgRUxJQkVYRUMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVMSUJFWEVDIiwgRUxJQkVYRUMsICJDYW5ub3QgZXhlYyBhIHNoYXJlZCBsaWJyYXJ5IGRpcmVjdGx5Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTElCRVhFQyIsIEVMSUJFWEVDLCAiQ2Fubm90IGV4ZWMgYSBzaGFyZWQgbGlicmFyeSBkaXJlY3RseSIpOwogI2VuZGlmCiAjaWZkZWYgRUwzSExUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTDNITFQiLCBFTDNITFQsICJMZXZlbCAzIGhhbHRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUwzSExUIiwgRUwzSExULCAiTGV2ZWwgMyBoYWx0ZWQiKTsKICNlbmRpZgogI2lmZGVmIEVDT05OUkVTRVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVDT05OUkVTRVQiLCBFQ09OTlJFU0VULCAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQ09OTlJFU0VUIiwgRUNPTk5SRVNFVCwgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpOwogI2Vsc2UKICNpZmRlZiBXU0FFQ09OTlJFU0VUCi0JaW5zY29kZShkLCBkcywgZGUsICJFQ09OTlJFU0VUIiwgV1NBRUNPTk5SRVNFVCwgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5SRVNFVCIsIFdTQUVDT05OUkVTRVQsICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUFERFJJTlVTRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFERFJJTlVTRSIsIEVBRERSSU5VU0UsICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUREUklOVVNFIiwgRUFERFJJTlVTRSwgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUFERFJJTlVTRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFERFJJTlVTRSIsIFdTQUVBRERSSU5VU0UsICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUREUklOVVNFIiwgV1NBRUFERFJJTlVTRSwgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU9QTk9UU1VQUAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU9QTk9UU1VQUCIsIEVPUE5PVFNVUFAsICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0cmFuc3BvcnQgZW5kcG9pbnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVPUE5PVFNVUFAiLCBFT1BOT1RTVVBQLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50Iik7CiAjZWxzZQogI2lmZGVmIFdTQUVPUE5PVFNVUFAKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVPUE5PVFNVUFAiLCBXU0FFT1BOT1RTVVBQLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFT1BOT1RTVVBQIiwgV1NBRU9QTk9UU1VQUCwgIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRyYW5zcG9ydCBlbmRwb2ludCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFUkVNQ0hHCi0JaW5zY29kZShkLCBkcywgZGUsICJFUkVNQ0hHIiwgRVJFTUNIRywgIlJlbW90ZSBhZGRyZXNzIGNoYW5nZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRU1DSEciLCBFUkVNQ0hHLCAiUmVtb3RlIGFkZHJlc3MgY2hhbmdlZCIpOwogI2VuZGlmCiAjaWZkZWYgRUFHQUlOCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUdBSU4iLCBFQUdBSU4sICJUcnkgYWdhaW4iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVBR0FJTiIsIEVBR0FJTiwgIlRyeSBhZ2FpbiIpOwogI2VuZGlmCiAjaWZkZWYgRU5BTUVUT09MT05HCi0JaW5zY29kZShkLCBkcywgZGUsICJFTkFNRVRPT0xPTkciLCBFTkFNRVRPT0xPTkcsICJGaWxlIG5hbWUgdG9vIGxvbmciKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOQU1FVE9PTE9ORyIsIEVOQU1FVE9PTE9ORywgIkZpbGUgbmFtZSB0b28gbG9uZyIpOwogI2Vsc2UKICNpZmRlZiBXU0FFTkFNRVRPT0xPTkcKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOQU1FVE9PTE9ORyIsIFdTQUVOQU1FVE9PTE9ORywgIkZpbGUgbmFtZSB0b28gbG9uZyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5BTUVUT09MT05HIiwgV1NBRU5BTUVUT09MT05HLCAiRmlsZSBuYW1lIHRvbyBsb25nIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT1RUWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVFRZIiwgRU5PVFRZLCAiTm90IGEgdHlwZXdyaXRlciIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVFRZIiwgRU5PVFRZLCAiTm90IGEgdHlwZXdyaXRlciIpOwogI2VuZGlmCiAjaWZkZWYgRVJFU1RBUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRVNUQVJUIiwgRVJFU1RBUlQsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCBzaG91bGQgYmUgcmVzdGFydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUkVTVEFSVCIsIEVSRVNUQVJULCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgc2hvdWxkIGJlIHJlc3RhcnRlZCIpOwogI2VuZGlmCiAjaWZkZWYgRVNPQ0tUTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJFU09DS1ROT1NVUFBPUlQiLCBFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU09DS1ROT1NVUFBPUlQiLCBFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIik7CiAjZWxzZQogI2lmZGVmIFdTQUVTT0NLVE5PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVNPQ0tUTk9TVVBQT1JUIiwgV1NBRVNPQ0tUTk9TVVBQT1JULCAiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVNPQ0tUTk9TVVBQT1JUIiwgV1NBRVNPQ0tUTk9TVVBQT1JULCAiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFVElNRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVRJTUUiLCBFVElNRSwgIlRpbWVyIGV4cGlyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVUSU1FIiwgRVRJTUUsICJUaW1lciBleHBpcmVkIik7CiAjZW5kaWYKICNpZmRlZiBFQkZPTlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVCRk9OVCIsIEVCRk9OVCwgIkJhZCBmb250IGZpbGUgZm9ybWF0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkZPTlQiLCBFQkZPTlQsICJCYWQgZm9udCBmaWxlIGZvcm1hdCIpOwogI2VuZGlmCiAjaWZkZWYgRURFQURMT0NLCi0JaW5zY29kZShkLCBkcywgZGUsICJFREVBRExPQ0siLCBFREVBRExPQ0ssICJFcnJvciBFREVBRExPQ0siKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVERUFETE9DSyIsIEVERUFETE9DSywgIkVycm9yIEVERUFETE9DSyIpOwogI2VuZGlmCiAjaWZkZWYgRVRPT01BTllSRUZTCi0JaW5zY29kZShkLCBkcywgZGUsICJFVE9PTUFOWVJFRlMiLCBFVE9PTUFOWVJFRlMsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFVE9PTUFOWVJFRlMiLCBFVE9PTUFOWVJFRlMsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIik7CiAjZWxzZQogI2lmZGVmIFdTQUVUT09NQU5ZUkVGUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVRPT01BTllSRUZTIiwgV1NBRVRPT01BTllSRUZTLCAiVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVRPT01BTllSRUZTIiwgV1NBRVRPT01BTllSRUZTLCAiVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTUZJTEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVNRklMRSIsIEVNRklMRSwgIlRvbyBtYW55IG9wZW4gZmlsZXMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVNRklMRSIsIEVNRklMRSwgIlRvbyBtYW55IG9wZW4gZmlsZXMiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU1GSUxFCi0JaW5zY29kZShkLCBkcywgZGUsICJFTUZJTEUiLCBXU0FFTUZJTEUsICJUb28gbWFueSBvcGVuIGZpbGVzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTUZJTEUiLCBXU0FFTUZJTEUsICJUb28gbWFueSBvcGVuIGZpbGVzIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVUWFRCU1kKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVUWFRCU1kiLCBFVFhUQlNZLCAiVGV4dCBmaWxlIGJ1c3kiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVUWFRCU1kiLCBFVFhUQlNZLCAiVGV4dCBmaWxlIGJ1c3kiKTsKICNlbmRpZgogI2lmZGVmIEVJTlBST0dSRVNTCi0JaW5zY29kZShkLCBkcywgZGUsICJFSU5QUk9HUkVTUyIsIEVJTlBST0dSRVNTLCAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUlOUFJPR1JFU1MiLCBFSU5QUk9HUkVTUywgIk9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUlOUFJPR1JFU1MKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlBST0dSRVNTIiwgV1NBRUlOUFJPR1JFU1MsICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSU5QUk9HUkVTUyIsIFdTQUVJTlBST0dSRVNTLCAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTlhJTwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5YSU8iLCBFTlhJTywgIk5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOWElPIiwgRU5YSU8sICJObyBzdWNoIGRldmljZSBvciBhZGRyZXNzIik7CiAjZW5kaWYKICNpZmRlZiBFTk9QS0cKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1BLRyIsIEVOT1BLRywgIlBhY2thZ2Ugbm90IGluc3RhbGxlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PUEtHIiwgRU5PUEtHLCAiUGFja2FnZSBub3QgaW5zdGFsbGVkIik7CiAjZW5kaWYKICNpZmRlZiBXU0FTWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBU1kiLCBXU0FTWSwgIkVycm9yIFdTQVNZIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FTWSIsIFdTQVNZLCAiRXJyb3IgV1NBU1kiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVIT1NURE9XTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUhPU1RET1dOIiwgV1NBRUhPU1RET1dOLCAiSG9zdCBpcyBkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFSE9TVERPV04iLCBXU0FFSE9TVERPV04sICJIb3N0IGlzIGRvd24iKTsKICNlbmRpZgogI2lmZGVmIFdTQUVORVRET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFTkVURE9XTiIsIFdTQUVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTkVURE9XTiIsIFdTQUVORVRET1dOLCAiTmV0d29yayBpcyBkb3duIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFTk9UU09DSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PVFNPQ0siLCBXU0FFTk9UU09DSywgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PVFNPQ0siLCBXU0FFTk9UU09DSywgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUhPU1RVTlJFQUNICi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFSE9TVFVOUkVBQ0giLCBXU0FFSE9TVFVOUkVBQ0gsICJObyByb3V0ZSB0byBob3N0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFSE9TVFVOUkVBQ0giLCBXU0FFSE9TVFVOUkVBQ0gsICJObyByb3V0ZSB0byBob3N0Iik7CiAjZW5kaWYKICNpZmRlZiBXU0FFTE9PUAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUxPT1AiLCBXU0FFTE9PUCwgIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTE9PUCIsIFdTQUVMT09QLCAiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVNRklMRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU1GSUxFIiwgV1NBRU1GSUxFLCAiVG9vIG1hbnkgb3BlbiBmaWxlcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU1GSUxFIiwgV1NBRU1GSUxFLCAiVG9vIG1hbnkgb3BlbiBmaWxlcyIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVNUQUxFCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFU1RBTEUiLCBXU0FFU1RBTEUsICJTdGFsZSBORlMgZmlsZSBoYW5kbGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVTVEFMRSIsIFdTQUVTVEFMRSwgIlN0YWxlIE5GUyBmaWxlIGhhbmRsZSIpOwogI2VuZGlmCiAjaWZkZWYgV1NBVkVSTk9UU1VQUE9SVEVECi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FWRVJOT1RTVVBQT1JURUQiLCBXU0FWRVJOT1RTVVBQT1JURUQsICJFcnJvciBXU0FWRVJOT1RTVVBQT1JURUQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQVZFUk5PVFNVUFBPUlRFRCIsIFdTQVZFUk5PVFNVUFBPUlRFRCwgIkVycm9yIFdTQVZFUk5PVFNVUFBPUlRFRCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU5FVFVOUkVBQ0gKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVORVRVTlJFQUNIIiwgV1NBRU5FVFVOUkVBQ0gsICJOZXR3b3JrIGlzIHVucmVhY2hhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTkVUVU5SRUFDSCIsIFdTQUVORVRVTlJFQUNILCAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVBST0NMSU0KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVQUk9DTElNIiwgV1NBRVBST0NMSU0sICJFcnJvciBXU0FFUFJPQ0xJTSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVBST0NMSU0iLCBXU0FFUFJPQ0xJTSwgIkVycm9yIFdTQUVQUk9DTElNIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFRkFVTFQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVGQVVMVCIsIFdTQUVGQVVMVCwgIkJhZCBhZGRyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFRkFVTFQiLCBXU0FFRkFVTFQsICJCYWQgYWRkcmVzcyIpOwogI2VuZGlmCiAjaWZkZWYgV1NBTk9USU5JVElBTElTRUQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQU5PVElOSVRJQUxJU0VEIiwgV1NBTk9USU5JVElBTElTRUQsICJFcnJvciBXU0FOT1RJTklUSUFMSVNFRCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBTk9USU5JVElBTElTRUQiLCBXU0FOT1RJTklUSUFMSVNFRCwgIkVycm9yIFdTQU5PVElOSVRJQUxJU0VEIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFVVNFUlMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVVU0VSUyIsIFdTQUVVU0VSUywgIlRvbyBtYW55IHVzZXJzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFVVNFUlMiLCBXU0FFVVNFUlMsICJUb28gbWFueSB1c2VycyIpOwogI2VuZGlmCiAjaWZkZWYgV1NBTUFLRUFTWU5DUkVQTAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBTUFLRUFTWU5DUkVQTCIsIFdTQU1BS0VBU1lOQ1JFUEwsICJFcnJvciBXU0FNQUtFQVNZTkNSRVBMIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FNQUtFQVNZTkNSRVBMIiwgV1NBTUFLRUFTWU5DUkVQTCwgIkVycm9yIFdTQU1BS0VBU1lOQ1JFUEwiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVOT1BST1RPT1BUCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFTk9QUk9UT09QVCIsIFdTQUVOT1BST1RPT1BULCAiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PUFJPVE9PUFQiLCBXU0FFTk9QUk9UT09QVCwgIlByb3RvY29sIG5vdCBhdmFpbGFibGUiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVDT05OQUJPUlRFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUNPTk5BQk9SVEVEIiwgV1NBRUNPTk5BQk9SVEVELCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVDT05OQUJPUlRFRCIsIFdTQUVDT05OQUJPUlRFRCwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0Iik7CiAjZW5kaWYKICNpZmRlZiBXU0FFTkFNRVRPT0xPTkcKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVOQU1FVE9PTE9ORyIsIFdTQUVOQU1FVE9PTE9ORywgIkZpbGUgbmFtZSB0b28gbG9uZyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5BTUVUT09MT05HIiwgV1NBRU5BTUVUT09MT05HLCAiRmlsZSBuYW1lIHRvbyBsb25nIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFTk9URU1QVFkKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVOT1RFTVBUWSIsIFdTQUVOT1RFTVBUWSwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVOT1RFTVBUWSIsIFdTQUVOT1RFTVBUWSwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVTSFVURE9XTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVNIVVRET1dOIiwgV1NBRVNIVVRET1dOLCAiQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFU0hVVERPV04iLCBXU0FFU0hVVERPV04sICJDYW5ub3Qgc2VuZCBhZnRlciB0cmFuc3BvcnQgZW5kcG9pbnQgc2h1dGRvd24iKTsKICNlbmRpZgogI2lmZGVmIFdTQUVBRk5PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFGTk9TVVBQT1JUIiwgV1NBRUFGTk9TVVBQT1JULCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFGTk9TVVBQT1JUIiwgV1NBRUFGTk9TVVBQT1JULCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVRPT01BTllSRUZTCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFVE9PTUFOWVJFRlMiLCBXU0FFVE9PTUFOWVJFRlMsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFVE9PTUFOWVJFRlMiLCBXU0FFVE9PTUFOWVJFRlMsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFQUNDRVMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVBQ0NFUyIsIFdTQUVBQ0NFUywgIlBlcm1pc3Npb24gZGVuaWVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQUNDRVMiLCBXU0FFQUNDRVMsICJQZXJtaXNzaW9uIGRlbmllZCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBVFIKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQVRSIiwgV1NBVFIsICJFcnJvciBXU0FUUiIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBVFIiLCBXU0FUUiwgIkVycm9yIFdTQVRSIik7CiAjZW5kaWYKICNpZmRlZiBXU0FCQVNFRVJSCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FCQVNFRVJSIiwgV1NBQkFTRUVSUiwgIkVycm9yIFdTQUJBU0VFUlIiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUJBU0VFUlIiLCBXU0FCQVNFRVJSLCAiRXJyb3IgV1NBQkFTRUVSUiIpOwogI2VuZGlmCiAjaWZkZWYgV1NBREVTQ1JJUFRJTwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBREVTQ1JJUFRJTyIsIFdTQURFU0NSSVBUSU8sICJFcnJvciBXU0FERVNDUklQVElPIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FERVNDUklQVElPIiwgV1NBREVTQ1JJUFRJTywgIkVycm9yIFdTQURFU0NSSVBUSU8iKTsKICNlbmRpZgogI2lmZGVmIFdTQUVNU0dTSVpFCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFTVNHU0laRSIsIFdTQUVNU0dTSVpFLCAiTWVzc2FnZSB0b28gbG9uZyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU1TR1NJWkUiLCBXU0FFTVNHU0laRSwgIk1lc3NhZ2UgdG9vIGxvbmciKTsKICNlbmRpZgogI2lmZGVmIFdTQUVCQURGCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFQkFERiIsIFdTQUVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQkFERiIsIFdTQUVCQURGLCAiQmFkIGZpbGUgbnVtYmVyIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFQ09OTlJFU0VUCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFQ09OTlJFU0VUIiwgV1NBRUNPTk5SRVNFVCwgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUNPTk5SRVNFVCIsIFdTQUVDT05OUkVTRVQsICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKTsKICNlbmRpZgogI2lmZGVmIFdTQUdFVFNFTEVDVEVSUk8KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUdFVFNFTEVDVEVSUk8iLCBXU0FHRVRTRUxFQ1RFUlJPLCAiRXJyb3IgV1NBR0VUU0VMRUNURVJSTyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBR0VUU0VMRUNURVJSTyIsIFdTQUdFVFNFTEVDVEVSUk8sICJFcnJvciBXU0FHRVRTRUxFQ1RFUlJPIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFVElNRURPVVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVUSU1FRE9VVCIsIFdTQUVUSU1FRE9VVCwgIkNvbm5lY3Rpb24gdGltZWQgb3V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFVElNRURPVVQiLCBXU0FFVElNRURPVVQsICJDb25uZWN0aW9uIHRpbWVkIG91dCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU5PQlVGUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PQlVGUyIsIFdTQUVOT0JVRlMsICJObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTk9CVUZTIiwgV1NBRU5PQlVGUywgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVESVNDT04KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVESVNDT04iLCBXU0FFRElTQ09OLCAiRXJyb3IgV1NBRURJU0NPTiIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRURJU0NPTiIsIFdTQUVESVNDT04sICJFcnJvciBXU0FFRElTQ09OIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFSU5UUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUlOVFIiLCBXU0FFSU5UUiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFSU5UUiIsIFdTQUVJTlRSLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVQUk9UT1RZUEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVQUk9UT1RZUEUiLCBXU0FFUFJPVE9UWVBFLCAiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFUFJPVE9UWVBFIiwgV1NBRVBST1RPVFlQRSwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBSE9TCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FIT1MiLCBXU0FIT1MsICJFcnJvciBXU0FIT1MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUhPUyIsIFdTQUhPUywgIkVycm9yIFdTQUhPUyIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUFERFJJTlVTRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFERFJJTlVTRSIsIFdTQUVBRERSSU5VU0UsICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQUREUklOVVNFIiwgV1NBRUFERFJJTlVTRSwgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVBRERSTk9UQVZBSUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVBRERSTk9UQVZBSUwiLCBXU0FFQUREUk5PVEFWQUlMLCAiQ2Fubm90IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFERFJOT1RBVkFJTCIsIFdTQUVBRERSTk9UQVZBSUwsICJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFQUxSRUFEWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFMUkVBRFkiLCBXU0FFQUxSRUFEWSwgIk9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQUxSRUFEWSIsIFdTQUVBTFJFQURZLCAiT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVQUk9UT05PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVBST1RPTk9TVVBQT1JUIiwgV1NBRVBST1RPTk9TVVBQT1JULCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVBST1RPTk9TVVBQT1JUIiwgV1NBRVBST1RPTk9TVVBQT1JULCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBU1lTTk9UUkVBRFkKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQVNZU05PVFJFQURZIiwgV1NBU1lTTk9UUkVBRFksICJFcnJvciBXU0FTWVNOT1RSRUFEWSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBU1lTTk9UUkVBRFkiLCBXU0FTWVNOT1RSRUFEWSwgIkVycm9yIFdTQVNZU05PVFJFQURZIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFV09VTERCTE9DSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVdPVUxEQkxPQ0siLCBXU0FFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVdPVUxEQkxPQ0siLCBXU0FFV09VTERCTE9DSywgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVBGTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFUEZOT1NVUFBPUlQiLCBXU0FFUEZOT1NVUFBPUlQsICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVBGTk9TVVBQT1JUIiwgV1NBRVBGTk9TVVBQT1JULCAiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVPUE5PVFNVUFAKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVPUE5PVFNVUFAiLCBXU0FFT1BOT1RTVVBQLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFT1BOT1RTVVBQIiwgV1NBRU9QTk9UU1VQUCwgIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRyYW5zcG9ydCBlbmRwb2ludCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUlTQ09OTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUlTQ09OTiIsIFdTQUVJU0NPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVJU0NPTk4iLCBXU0FFSVNDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFRFFVT1QKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVEUVVPVCIsIFdTQUVEUVVPVCwgIlF1b3RhIGV4Y2VlZGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFRFFVT1QiLCBXU0FFRFFVT1QsICJRdW90YSBleGNlZWRlZCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU5PVENPTk4KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVOT1RDT05OIiwgV1NBRU5PVENPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgbm90IGNvbm5lY3RlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PVENPTk4iLCBXU0FFTk9UQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFUkVNT1RFCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFUkVNT1RFIiwgV1NBRVJFTU9URSwgIk9iamVjdCBpcyByZW1vdGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVSRU1PVEUiLCBXU0FFUkVNT1RFLCAiT2JqZWN0IGlzIHJlbW90ZSIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUlOVkFMCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFSU5WQUwiLCBXU0FFSU5WQUwsICJJbnZhbGlkIGFyZ3VtZW50Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFSU5WQUwiLCBXU0FFSU5WQUwsICJJbnZhbGlkIGFyZ3VtZW50Iik7CiAjZW5kaWYKICNpZmRlZiBXU0FFSU5QUk9HUkVTUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUlOUFJPR1JFU1MiLCBXU0FFSU5QUk9HUkVTUywgIk9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVJTlBST0dSRVNTIiwgV1NBRUlOUFJPR1JFU1MsICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIik7CiAjZW5kaWYKICNpZmRlZiBXU0FHRVRTRUxFQ1RFVkVOCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FHRVRTRUxFQ1RFVkVOIiwgV1NBR0VUU0VMRUNURVZFTiwgIkVycm9yIFdTQUdFVFNFTEVDVEVWRU4iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUdFVFNFTEVDVEVWRU4iLCBXU0FHRVRTRUxFQ1RFVkVOLCAiRXJyb3IgV1NBR0VUU0VMRUNURVZFTiIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVNPQ0tUTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFU09DS1ROT1NVUFBPUlQiLCBXU0FFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFU09DS1ROT1NVUFBPUlQiLCBXU0FFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIik7CiAjZW5kaWYKICNpZmRlZiBXU0FHRVRBU1lOQ0VSUk8KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUdFVEFTWU5DRVJSTyIsIFdTQUdFVEFTWU5DRVJSTywgIkVycm9yIFdTQUdFVEFTWU5DRVJSTyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBR0VUQVNZTkNFUlJPIiwgV1NBR0VUQVNZTkNFUlJPLCAiRXJyb3IgV1NBR0VUQVNZTkNFUlJPIik7CiAjZW5kaWYKICNpZmRlZiBXU0FNQUtFU0VMRUNUUkVQTAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBTUFLRVNFTEVDVFJFUEwiLCBXU0FNQUtFU0VMRUNUUkVQTCwgIkVycm9yIFdTQU1BS0VTRUxFQ1RSRVBMIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FNQUtFU0VMRUNUUkVQTCIsIFdTQU1BS0VTRUxFQ1RSRVBMLCAiRXJyb3IgV1NBTUFLRVNFTEVDVFJFUEwiKTsKICNlbmRpZgogI2lmZGVmIFdTQUdFVEFTWU5DQlVGTEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUdFVEFTWU5DQlVGTEUiLCBXU0FHRVRBU1lOQ0JVRkxFLCAiRXJyb3IgV1NBR0VUQVNZTkNCVUZMRSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBR0VUQVNZTkNCVUZMRSIsIFdTQUdFVEFTWU5DQlVGTEUsICJFcnJvciBXU0FHRVRBU1lOQ0JVRkxFIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFREVTVEFERFJSRVEKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVERVNUQUREUlJFUSIsIFdTQUVERVNUQUREUlJFUSwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVERVNUQUREUlJFUSIsIFdTQUVERVNUQUREUlJFUSwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVDT05OUkVGVVNFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUNPTk5SRUZVU0VEIiwgV1NBRUNPTk5SRUZVU0VELCAiQ29ubmVjdGlvbiByZWZ1c2VkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQ09OTlJFRlVTRUQiLCBXU0FFQ09OTlJFRlVTRUQsICJDb25uZWN0aW9uIHJlZnVzZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVORVRSRVNFVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5FVFJFU0VUIiwgV1NBRU5FVFJFU0VULCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5FVFJFU0VUIiwgV1NBRU5FVFJFU0VULCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBTiIsIFdTQU4sICJFcnJvciBXU0FOIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FOIiwgV1NBTiwgIkVycm9yIFdTQU4iKTsKICNlbmRpZgogCi0JUHlfREVDUkVGKGRlKTsKKyAgICBQeV9ERUNSRUYoZGUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9mY250bG1vZHVsZS5jIGIvTW9kdWxlcy9mY250bG1vZHVsZS5jCmluZGV4IGEzMzNhMzQuLjYzZDA2ZDMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZmNudGxtb2R1bGUuYworKysgYi9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMKQEAgLTIxLDcgKzIxLDcgQEAKICAgICBpbnQgZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKG9iamVjdCk7CiAKICAgICBpZiAoZmQgPCAwKQotICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKICAgICAqdGFyZ2V0ID0gZmQ7CiAgICAgcmV0dXJuIDE7CiB9CkBAIC0zMiw0OCArMzIsNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmY250bF9mY250bChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkOwotCWludCBjb2RlOwotCWxvbmcgYXJnOwotCWludCByZXQ7Ci0JY2hhciAqc3RyOwotCVB5X3NzaXplX3QgbGVuOwotCWNoYXIgYnVmWzEwMjRdOworICAgIGludCBmZDsKKyAgICBpbnQgY29kZTsKKyAgICBsb25nIGFyZzsKKyAgICBpbnQgcmV0OworICAgIGNoYXIgKnN0cjsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmlzIzpmY250bCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJnN0ciwgJmxlbikpIHsKLQkJaWYgKGxlbiA+IHNpemVvZiBidWYpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiZmNudGwgc3RyaW5nIGFyZyB0b28gbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJldCA9IGZjbnRsKGZkLCBjb2RlLCBidWYpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAocmV0IDwgMCkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgbGVuKTsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maXMjOmZjbnRsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZzdHIsICZsZW4pKSB7CisgICAgICAgIGlmIChsZW4gPiBzaXplb2YgYnVmKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmNudGwgc3RyaW5nIGFyZyB0b28gbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJldCA9IGZjbnRsKGZkLCBjb2RlLCBidWYpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgbGVuKTsKKyAgICB9CiAKLQlQeUVycl9DbGVhcigpOwotCWFyZyA9IDA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0gICAgICAgICAgICAgIk8maXxsO2ZjbnRsIHJlcXVpcmVzIGEgZmlsZSBvciBmaWxlIGRlc2NyaXB0b3IsIgotICAgICAgICAgICAgICIgYW4gaW50ZWdlciBhbmQgb3B0aW9uYWxseSBhIHRoaXJkIGludGVnZXIgb3IgYSBzdHJpbmciLCAKLQkJCSAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJmFyZykpIHsKLQkgIHJldHVybiBOVUxMOwotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmV0ID0gZmNudGwoZmQsIGNvZGUsIGFyZyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmV0IDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmV0KTsKKyAgICBQeUVycl9DbGVhcigpOworICAgIGFyZyA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgICAgICAiTyZpfGw7ZmNudGwgcmVxdWlyZXMgYSBmaWxlIG9yIGZpbGUgZGVzY3JpcHRvciwiCisgICAgICAgICAiIGFuIGludGVnZXIgYW5kIG9wdGlvbmFsbHkgYSB0aGlyZCBpbnRlZ2VyIG9yIGEgc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmYXJnKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXQgPSBmY250bChmZCwgY29kZSwgYXJnKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXQpOwogfQogCiBQeURvY19TVFJWQVIoZmNudGxfZG9jLApAQCAtOTYsMTE4ICs5NiwxMTggQEAKIGZjbnRsX2lvY3RsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICNkZWZpbmUgSU9DVExfQlVGU1ogMTAyNAotCWludCBmZDsKLQkvKiBJbiBQeUFyZ19QYXJzZVR1cGxlIGJlbG93LCB3ZSB1c2UgdGhlIHVuc2lnbmVkIG5vbi1jaGVja2VkICdJJwotCSAgIGZvcm1hdCBmb3IgdGhlICdjb2RlJyBwYXJhbWV0ZXIgYmVjYXVzZSBQeXRob24gdHVybnMgMHg4MDAwMDAwCi0JICAgaW50byBlaXRoZXIgYSBsYXJnZSBwb3NpdGl2ZSBudW1iZXIgKFB5TG9uZyBvciBQeUludCBvbiA2NC1iaXQKLQkgICBwbGF0Zm9ybXMpIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIG90aGVycyAoMzItYml0IFB5SW50KQotCSAgIHdoZXJlYXMgdGhlIHN5c3RlbSBleHBlY3RzIGl0IHRvIGJlIGEgMzJiaXQgYml0IGZpZWxkIHZhbHVlCi0JICAgcmVnYXJkbGVzcyBvZiBpdCBiZWluZyBwYXNzZWQgYXMgYW4gaW50IG9yIHVuc2lnbmVkIGxvbmcgb24KLQkgICB2YXJpb3VzIHBsYXRmb3Jtcy4gIFNlZSB0aGUgdGVybWlvcy5USU9DU1dJTlNaIGNvbnN0YW50IGFjcm9zcwotCSAgIHBsYXRmb3JtcyBmb3IgYW4gZXhhbXBsZSBvZiB0aGlzZS4KKyAgICBpbnQgZmQ7CisgICAgLyogSW4gUHlBcmdfUGFyc2VUdXBsZSBiZWxvdywgd2UgdXNlIHRoZSB1bnNpZ25lZCBub24tY2hlY2tlZCAnSScKKyAgICAgICBmb3JtYXQgZm9yIHRoZSAnY29kZScgcGFyYW1ldGVyIGJlY2F1c2UgUHl0aG9uIHR1cm5zIDB4ODAwMDAwMAorICAgICAgIGludG8gZWl0aGVyIGEgbGFyZ2UgcG9zaXRpdmUgbnVtYmVyIChQeUxvbmcgb3IgUHlJbnQgb24gNjQtYml0CisgICAgICAgcGxhdGZvcm1zKSBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBvdGhlcnMgKDMyLWJpdCBQeUludCkKKyAgICAgICB3aGVyZWFzIHRoZSBzeXN0ZW0gZXhwZWN0cyBpdCB0byBiZSBhIDMyYml0IGJpdCBmaWVsZCB2YWx1ZQorICAgICAgIHJlZ2FyZGxlc3Mgb2YgaXQgYmVpbmcgcGFzc2VkIGFzIGFuIGludCBvciB1bnNpZ25lZCBsb25nIG9uCisgICAgICAgdmFyaW91cyBwbGF0Zm9ybXMuICBTZWUgdGhlIHRlcm1pb3MuVElPQ1NXSU5TWiBjb25zdGFudCBhY3Jvc3MKKyAgICAgICBwbGF0Zm9ybXMgZm9yIGFuIGV4YW1wbGUgb2YgdGhpc2UuCiAKLQkgICBJZiBhbnkgb2YgdGhlIDY0Yml0IHBsYXRmb3JtcyBldmVyIGRlY2lkZSB0byB1c2UgbW9yZSB0aGFuIDMyYml0cwotCSAgIGluIHRoZWlyIHVuc2lnbmVkIGxvbmcgaW9jdGwgY29kZXMgdGhpcyB3aWxsIGJyZWFrIGFuZCBuZWVkCi0JICAgc3BlY2lhbCBjYXNpbmcgYmFzZWQgb24gdGhlIHBsYXRmb3JtIGJlaW5nIGJ1aWx0IG9uLgotCSAqLwotCXVuc2lnbmVkIGludCBjb2RlOwotCWludCBhcmc7Ci0JaW50IHJldDsKLQljaGFyICpzdHI7Ci0JUHlfc3NpemVfdCBsZW47Ci0JaW50IG11dGF0ZV9hcmcgPSAxOwotIAljaGFyIGJ1ZltJT0NUTF9CVUZTWisxXTsgIC8qIGFyZ3VtZW50IHBsdXMgTlVMIGJ5dGUgKi8KKyAgICAgICBJZiBhbnkgb2YgdGhlIDY0Yml0IHBsYXRmb3JtcyBldmVyIGRlY2lkZSB0byB1c2UgbW9yZSB0aGFuIDMyYml0cworICAgICAgIGluIHRoZWlyIHVuc2lnbmVkIGxvbmcgaW9jdGwgY29kZXMgdGhpcyB3aWxsIGJyZWFrIGFuZCBuZWVkCisgICAgICAgc3BlY2lhbCBjYXNpbmcgYmFzZWQgb24gdGhlIHBsYXRmb3JtIGJlaW5nIGJ1aWx0IG9uLgorICAgICAqLworICAgIHVuc2lnbmVkIGludCBjb2RlOworICAgIGludCBhcmc7CisgICAgaW50IHJldDsKKyAgICBjaGFyICpzdHI7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgaW50IG11dGF0ZV9hcmcgPSAxOworICAgIGNoYXIgYnVmW0lPQ1RMX0JVRlNaKzFdOyAgLyogYXJndW1lbnQgcGx1cyBOVUwgYnl0ZSAqLwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mSXcjfGk6aW9jdGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsIAotCQkJICAgICAmc3RyLCAmbGVuLCAmbXV0YXRlX2FyZykpIHsKLQkJY2hhciAqYXJnOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJkl3I3xpOmlvY3RsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ciwgJmxlbiwgJm11dGF0ZV9hcmcpKSB7CisgICAgICAgIGNoYXIgKmFyZzsKIAotCSAgICAgICAJaWYgKG11dGF0ZV9hcmcpIHsKLQkJCWlmIChsZW4gPD0gSU9DVExfQlVGU1opIHsKLQkJCQltZW1jcHkoYnVmLCBzdHIsIGxlbik7Ci0JCQkJYnVmW2xlbl0gPSAnXDAnOwotCQkJCWFyZyA9IGJ1ZjsKLQkJCX0gCi0JCQllbHNlIHsKLQkJCQlhcmcgPSBzdHI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobGVuID4gSU9DVExfQlVGU1opIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJImlvY3RsIHN0cmluZyBhcmcgdG9vIGxvbmciKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lbWNweShidWYsIHN0ciwgbGVuKTsKLQkJCQlidWZbbGVuXSA9ICdcMCc7Ci0JCQkJYXJnID0gYnVmOwotCQkJfQotCQl9Ci0JCWlmIChidWYgPT0gYXJnKSB7Ci0JCQlQeV9CRUdJTl9BTExPV19USFJFQURTIC8qIHRoaW5rIGFycmF5LnJlc2l6ZSgpICovCi0JCQlyZXQgPSBpb2N0bChmZCwgY29kZSwgYXJnKTsKLQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXQgPSBpb2N0bChmZCwgY29kZSwgYXJnKTsKLQkJfQotCQlpZiAobXV0YXRlX2FyZyAmJiAobGVuIDwgSU9DVExfQlVGU1opKSB7Ci0JCQltZW1jcHkoc3RyLCBidWYsIGxlbik7Ci0JCX0KLQkJaWYgKHJldCA8IDApIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChtdXRhdGVfYXJnKSB7Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcocmV0KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7Ci0JCX0KLQl9CisgICAgICAgIGlmIChtdXRhdGVfYXJnKSB7CisgICAgICAgICAgICBpZiAobGVuIDw9IElPQ1RMX0JVRlNaKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOworICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBhcmcgPSBidWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcmcgPSBzdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAobGVuID4gSU9DVExfQlVGU1opIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImlvY3RsIHN0cmluZyBhcmcgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweShidWYsIHN0ciwgbGVuKTsKKyAgICAgICAgICAgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgYXJnID0gYnVmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWYgPT0gYXJnKSB7CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTIC8qIHRoaW5rIGFycmF5LnJlc2l6ZSgpICovCisgICAgICAgICAgICByZXQgPSBpb2N0bChmZCwgY29kZSwgYXJnKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXQgPSBpb2N0bChmZCwgY29kZSwgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobXV0YXRlX2FyZyAmJiAobGVuIDwgSU9DVExfQlVGU1opKSB7CisgICAgICAgICAgICBtZW1jcHkoc3RyLCBidWYsIGxlbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChtdXRhdGVfYXJnKSB7CisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmV0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeUVycl9DbGVhcigpOwotCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJklzIzppb2N0bCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJnN0ciwgJmxlbikpIHsKLQkJaWYgKGxlbiA+IElPQ1RMX0JVRlNaKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJImlvY3RsIHN0cmluZyBhcmcgdG9vIGxvbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW1lbWNweShidWYsIHN0ciwgbGVuKTsKLQkJYnVmW2xlbl0gPSAnXDAnOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJldCA9IGlvY3RsKGZkLCBjb2RlLCBidWYpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAocmV0IDwgMCkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgbGVuKTsKLQl9CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZJcyM6aW9jdGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJnN0ciwgJmxlbikpIHsKKyAgICAgICAgaWYgKGxlbiA+IElPQ1RMX0JVRlNaKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW9jdGwgc3RyaW5nIGFyZyB0b28gbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOworICAgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmV0ID0gaW9jdGwoZmQsIGNvZGUsIGJ1Zik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBsZW4pOworICAgIH0KIAotCVB5RXJyX0NsZWFyKCk7Ci0JYXJnID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKLQkgICAgICJPJkl8aTtpb2N0bCByZXF1aXJlcyBhIGZpbGUgb3IgZmlsZSBkZXNjcmlwdG9yLCIKLQkgICAgICIgYW4gaW50ZWdlciBhbmQgb3B0aW9uYWxseSBhbiBpbnRlZ2VyIG9yIGJ1ZmZlciBhcmd1bWVudCIsCi0JCQkgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZhcmcpKSB7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgYXJnID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICJPJkl8aTtpb2N0bCByZXF1aXJlcyBhIGZpbGUgb3IgZmlsZSBkZXNjcmlwdG9yLCIKKyAgICAgICAgICIgYW4gaW50ZWdlciBhbmQgb3B0aW9uYWxseSBhbiBpbnRlZ2VyIG9yIGJ1ZmZlciBhcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJmFyZykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAjaWZkZWYgX19WTVMKLQlyZXQgPSBpb2N0bChmZCwgY29kZSwgKHZvaWQgKilhcmcpOworICAgIHJldCA9IGlvY3RsKGZkLCBjb2RlLCAodm9pZCAqKWFyZyk7CiAjZWxzZQotCXJldCA9IGlvY3RsKGZkLCBjb2RlLCBhcmcpOworICAgIHJldCA9IGlvY3RsKGZkLCBjb2RlLCBhcmcpOwogI2VuZGlmCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmV0IDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmV0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXQpOwogI3VuZGVmIElPQ1RMX0JVRlNaCiB9CiAKQEAgLTI0OCw1MSArMjQ4LDUxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmNudGxfZmxvY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZDsKLQlpbnQgY29kZTsKLQlpbnQgcmV0OworICAgIGludCBmZDsKKyAgICBpbnQgY29kZTsKKyAgICBpbnQgcmV0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6ZmxvY2siLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6ZmxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogI2lmZGVmIEhBVkVfRkxPQ0sKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmV0ID0gZmxvY2soZmQsIGNvZGUpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldCA9IGZsb2NrKGZkLCBjb2RlKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogI2Vsc2UKIAogI2lmbmRlZiBMT0NLX1NICi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIGRvbid0IGJsb2NrIHdoZW4gbG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHVubG9jayAqLworI2RlZmluZSBMT0NLX1NIICAgICAgICAgMSAgICAgICAvKiBzaGFyZWQgbG9jayAqLworI2RlZmluZSBMT0NLX0VYICAgICAgICAgMiAgICAgICAvKiBleGNsdXNpdmUgbG9jayAqLworI2RlZmluZSBMT0NLX05CICAgICAgICAgNCAgICAgICAvKiBkb24ndCBibG9jayB3aGVuIGxvY2tpbmcgKi8KKyNkZWZpbmUgTE9DS19VTiAgICAgICAgIDggICAgICAgLyogdW5sb2NrICovCiAjZW5kaWYKLQl7Ci0JCXN0cnVjdCBmbG9jayBsOwotCQlpZiAoY29kZSA9PSBMT0NLX1VOKQotCQkJbC5sX3R5cGUgPSBGX1VOTENLOwotCQllbHNlIGlmIChjb2RlICYgTE9DS19TSCkKLQkJCWwubF90eXBlID0gRl9SRExDSzsKLQkJZWxzZSBpZiAoY29kZSAmIExPQ0tfRVgpCi0JCQlsLmxfdHlwZSA9IEZfV1JMQ0s7Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJ1bnJlY29nbml6ZWQgZmxvY2sgYXJndW1lbnQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWwubF93aGVuY2UgPSBsLmxfc3RhcnQgPSBsLmxfbGVuID0gMDsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXQgPSBmY250bChmZCwgKGNvZGUgJiBMT0NLX05CKSA/IEZfU0VUTEsgOiBGX1NFVExLVywgJmwpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KKyAgICB7CisgICAgICAgIHN0cnVjdCBmbG9jayBsOworICAgICAgICBpZiAoY29kZSA9PSBMT0NLX1VOKQorICAgICAgICAgICAgbC5sX3R5cGUgPSBGX1VOTENLOworICAgICAgICBlbHNlIGlmIChjb2RlICYgTE9DS19TSCkKKyAgICAgICAgICAgIGwubF90eXBlID0gRl9SRExDSzsKKyAgICAgICAgZWxzZSBpZiAoY29kZSAmIExPQ0tfRVgpCisgICAgICAgICAgICBsLmxfdHlwZSA9IEZfV1JMQ0s7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBmbG9jayBhcmd1bWVudCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbC5sX3doZW5jZSA9IGwubF9zdGFydCA9IGwubF9sZW4gPSAwOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJldCA9IGZjbnRsKGZkLCAoY29kZSAmIExPQ0tfTkIpID8gRl9TRVRMSyA6IEZfU0VUTEtXLCAmbCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQogI2VuZGlmIC8qIEhBVkVfRkxPQ0sgKi8KLQlpZiAocmV0IDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZmxvY2tfZG9jLApAQCAtMzA3LDcyICszMDcsNzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmY250bF9sb2NrZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkLCBjb2RlLCByZXQsIHdoZW5jZSA9IDA7Ci0JUHlPYmplY3QgKmxlbm9iaiA9IE5VTEwsICpzdGFydG9iaiA9IE5VTEw7CisgICAgaW50IGZkLCBjb2RlLCByZXQsIHdoZW5jZSA9IDA7CisgICAgUHlPYmplY3QgKmxlbm9iaiA9IE5VTEwsICpzdGFydG9iaiA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maXxPT2k6bG9ja2YiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLAotCQkJICAgICAgJmxlbm9iaiwgJnN0YXJ0b2JqLCAmd2hlbmNlKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJml8T09pOmxvY2tmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVub2JqLCAmc3RhcnRvYmosICZ3aGVuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogI2lmIGRlZmluZWQoUFlPU19PUzIpICYmIGRlZmluZWQoUFlDQ19HQ0MpCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCi0JCQkibG9ja2Ygbm90IHN1cHBvcnRlZCBvbiBPUy8yIChFTVgpIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJsb2NrZiBub3Qgc3VwcG9ydGVkIG9uIE9TLzIgKEVNWCkiKTsKKyAgICByZXR1cm4gTlVMTDsKICNlbHNlCiAjaWZuZGVmIExPQ0tfU0gKLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogZG9uJ3QgYmxvY2sgd2hlbiBsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogdW5sb2NrICovCisjZGVmaW5lIExPQ0tfU0ggICAgICAgICAxICAgICAgIC8qIHNoYXJlZCBsb2NrICovCisjZGVmaW5lIExPQ0tfRVggICAgICAgICAyICAgICAgIC8qIGV4Y2x1c2l2ZSBsb2NrICovCisjZGVmaW5lIExPQ0tfTkIgICAgICAgICA0ICAgICAgIC8qIGRvbid0IGJsb2NrIHdoZW4gbG9ja2luZyAqLworI2RlZmluZSBMT0NLX1VOICAgICAgICAgOCAgICAgICAvKiB1bmxvY2sgKi8KICNlbmRpZiAgLyogTE9DS19TSCAqLwotCXsKLQkJc3RydWN0IGZsb2NrIGw7Ci0JCWlmIChjb2RlID09IExPQ0tfVU4pCi0JCQlsLmxfdHlwZSA9IEZfVU5MQ0s7Ci0JCWVsc2UgaWYgKGNvZGUgJiBMT0NLX1NIKQotCQkJbC5sX3R5cGUgPSBGX1JETENLOwotCQllbHNlIGlmIChjb2RlICYgTE9DS19FWCkKLQkJCWwubF90eXBlID0gRl9XUkxDSzsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInVucmVjb2duaXplZCBsb2NrZiBhcmd1bWVudCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbC5sX3N0YXJ0ID0gbC5sX2xlbiA9IDA7Ci0JCWlmIChzdGFydG9iaiAhPSBOVUxMKSB7CisgICAgeworICAgICAgICBzdHJ1Y3QgZmxvY2sgbDsKKyAgICAgICAgaWYgKGNvZGUgPT0gTE9DS19VTikKKyAgICAgICAgICAgIGwubF90eXBlID0gRl9VTkxDSzsKKyAgICAgICAgZWxzZSBpZiAoY29kZSAmIExPQ0tfU0gpCisgICAgICAgICAgICBsLmxfdHlwZSA9IEZfUkRMQ0s7CisgICAgICAgIGVsc2UgaWYgKGNvZGUgJiBMT0NLX0VYKQorICAgICAgICAgICAgbC5sX3R5cGUgPSBGX1dSTENLOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgbG9ja2YgYXJndW1lbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGwubF9zdGFydCA9IGwubF9sZW4gPSAwOworICAgICAgICBpZiAoc3RhcnRvYmogIT0gTlVMTCkgewogI2lmICFkZWZpbmVkKEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQpCi0JCQlsLmxfc3RhcnQgPSBQeUludF9Bc0xvbmcoc3RhcnRvYmopOworICAgICAgICAgICAgbC5sX3N0YXJ0ID0gUHlJbnRfQXNMb25nKHN0YXJ0b2JqKTsKICNlbHNlCi0JCQlsLmxfc3RhcnQgPSBQeUxvbmdfQ2hlY2soc3RhcnRvYmopID8KLQkJCQkJUHlMb25nX0FzTG9uZ0xvbmcoc3RhcnRvYmopIDoKLQkJCQkJUHlJbnRfQXNMb25nKHN0YXJ0b2JqKTsKKyAgICAgICAgICAgIGwubF9zdGFydCA9IFB5TG9uZ19DaGVjayhzdGFydG9iaikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Bc0xvbmdMb25nKHN0YXJ0b2JqKSA6CisgICAgICAgICAgICAgICAgICAgIFB5SW50X0FzTG9uZyhzdGFydG9iaik7CiAjZW5kaWYKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChsZW5vYmogIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbm9iaiAhPSBOVUxMKSB7CiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQkJCWwubF9sZW4gPSBQeUludF9Bc0xvbmcobGVub2JqKTsKKyAgICAgICAgICAgIGwubF9sZW4gPSBQeUludF9Bc0xvbmcobGVub2JqKTsKICNlbHNlCi0JCQlsLmxfbGVuID0gUHlMb25nX0NoZWNrKGxlbm9iaikgPwotCQkJCQlQeUxvbmdfQXNMb25nTG9uZyhsZW5vYmopIDoKLQkJCQkJUHlJbnRfQXNMb25nKGxlbm9iaik7CisgICAgICAgICAgICBsLmxfbGVuID0gUHlMb25nX0NoZWNrKGxlbm9iaikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Bc0xvbmdMb25nKGxlbm9iaikgOgorICAgICAgICAgICAgICAgICAgICBQeUludF9Bc0xvbmcobGVub2JqKTsKICNlbmRpZgotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbC5sX3doZW5jZSA9IHdoZW5jZTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXQgPSBmY250bChmZCwgKGNvZGUgJiBMT0NLX05CKSA/IEZfU0VUTEsgOiBGX1NFVExLVywgJmwpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KLQlpZiAocmV0IDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBsLmxfd2hlbmNlID0gd2hlbmNlOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJldCA9IGZjbnRsKGZkLCAoY29kZSAmIExPQ0tfTkIpID8gRl9TRVRMSyA6IEZfU0VUTEtXLCAmbCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKICNlbmRpZiAgLyogZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykgKi8KIH0KIApAQCAtNDA0LDExICs0MDQsMTEgQEAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmY250bF9tZXRob2RzW10gPSB7Ci0JeyJmY250bCIsCWZjbnRsX2ZjbnRsLCBNRVRIX1ZBUkFSR1MsIGZjbnRsX2RvY30sCi0JeyJpb2N0bCIsCWZjbnRsX2lvY3RsLCBNRVRIX1ZBUkFSR1MsIGlvY3RsX2RvY30sCi0JeyJmbG9jayIsCWZjbnRsX2Zsb2NrLCBNRVRIX1ZBUkFSR1MsIGZsb2NrX2RvY30sCi0JeyJsb2NrZiIsICAgICAgIGZjbnRsX2xvY2tmLCBNRVRIX1ZBUkFSR1MsIGxvY2tmX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImZjbnRsIiwgICAgICAgICAgIGZjbnRsX2ZjbnRsLCBNRVRIX1ZBUkFSR1MsIGZjbnRsX2RvY30sCisgICAgeyJpb2N0bCIsICAgICAgICAgICBmY250bF9pb2N0bCwgTUVUSF9WQVJBUkdTLCBpb2N0bF9kb2N9LAorICAgIHsiZmxvY2siLCAgICAgICAgICAgZmNudGxfZmxvY2ssIE1FVEhfVkFSQVJHUywgZmxvY2tfZG9jfSwKKyAgICB7ImxvY2tmIiwgICAgICAgZmNudGxfbG9ja2YsIE1FVEhfVkFSQVJHUywgbG9ja2ZfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC00MjMsMTIgKzQyMywxMiBAQAogc3RhdGljIGludAogaW5zKFB5T2JqZWN0KiBkLCBjaGFyKiBzeW1ib2wsIGxvbmcgdmFsdWUpCiB7Ci0gICAgICAgIFB5T2JqZWN0KiB2ID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOwotICAgICAgICBpZiAoIXYgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgc3ltYm9sLCB2KSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIFB5T2JqZWN0KiB2ID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOworICAgIGlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBzeW1ib2wsIHYpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIElOUyh4KSBpZiAoaW5zKGQsICN4LCAobG9uZyl4KSkgcmV0dXJuIC0xCkBAIC00MzYsMTg1ICs0MzYsMTg1IEBACiBzdGF0aWMgaW50CiBhbGxfaW5zKFB5T2JqZWN0KiBkKQogewotICAgICAgICBpZiAoaW5zKGQsICJMT0NLX1NIIiwgKGxvbmcpTE9DS19TSCkpIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGlucyhkLCAiTE9DS19FWCIsIChsb25nKUxPQ0tfRVgpKSByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChpbnMoZCwgIkxPQ0tfTkIiLCAobG9uZylMT0NLX05CKSkgcmV0dXJuIC0xOwotICAgICAgICBpZiAoaW5zKGQsICJMT0NLX1VOIiwgKGxvbmcpTE9DS19VTikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX1NIIiwgKGxvbmcpTE9DS19TSCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX0VYIiwgKGxvbmcpTE9DS19FWCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX05CIiwgKGxvbmcpTE9DS19OQikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX1VOIiwgKGxvbmcpTE9DS19VTikpIHJldHVybiAtMTsKIC8qIEdOVSBleHRlbnNpb25zLCBhcyBvZiBnbGliYyAyLjIuNCAqLwogI2lmZGVmIExPQ0tfTUFORAotICAgICAgICBpZiAoaW5zKGQsICJMT0NLX01BTkQiLCAobG9uZylMT0NLX01BTkQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiTE9DS19NQU5EIiwgKGxvbmcpTE9DS19NQU5EKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgTE9DS19SRUFECi0gICAgICAgIGlmIChpbnMoZCwgIkxPQ0tfUkVBRCIsIChsb25nKUxPQ0tfUkVBRCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX1JFQUQiLCAobG9uZylMT0NLX1JFQUQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBMT0NLX1dSSVRFCi0gICAgICAgIGlmIChpbnMoZCwgIkxPQ0tfV1JJVEUiLCAobG9uZylMT0NLX1dSSVRFKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkxPQ0tfV1JJVEUiLCAobG9uZylMT0NLX1dSSVRFKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgTE9DS19SVwotICAgICAgICBpZiAoaW5zKGQsICJMT0NLX1JXIiwgKGxvbmcpTE9DS19SVykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX1JXIiwgKGxvbmcpTE9DS19SVykpIHJldHVybiAtMTsKICNlbmRpZgogCiAjaWZkZWYgRl9EVVBGRAotICAgICAgICBpZiAoaW5zKGQsICJGX0RVUEZEIiwgKGxvbmcpRl9EVVBGRCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX0RVUEZEIiwgKGxvbmcpRl9EVVBGRCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfR0VURkQKLSAgICAgICAgaWYgKGlucyhkLCAiRl9HRVRGRCIsIChsb25nKUZfR0VURkQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9HRVRGRCIsIChsb25nKUZfR0VURkQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1NFVEZECi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VURkQiLCAobG9uZylGX1NFVEZEKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfU0VURkQiLCAobG9uZylGX1NFVEZEKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9HRVRGTAotICAgICAgICBpZiAoaW5zKGQsICJGX0dFVEZMIiwgKGxvbmcpRl9HRVRGTCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX0dFVEZMIiwgKGxvbmcpRl9HRVRGTCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0VURkwKLSAgICAgICAgaWYgKGlucyhkLCAiRl9TRVRGTCIsIChsb25nKUZfU0VURkwpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TRVRGTCIsIChsb25nKUZfU0VURkwpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX0dFVExLCi0gICAgICAgIGlmIChpbnMoZCwgIkZfR0VUTEsiLCAobG9uZylGX0dFVExLKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfR0VUTEsiLCAobG9uZylGX0dFVExLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9TRVRMSwotICAgICAgICBpZiAoaW5zKGQsICJGX1NFVExLIiwgKGxvbmcpRl9TRVRMSykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX1NFVExLIiwgKGxvbmcpRl9TRVRMSykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0VUTEtXCi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUTEtXIiwgKGxvbmcpRl9TRVRMS1cpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TRVRMS1ciLCAobG9uZylGX1NFVExLVykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfR0VUT1dOCi0gICAgICAgIGlmIChpbnMoZCwgIkZfR0VUT1dOIiwgKGxvbmcpRl9HRVRPV04pKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9HRVRPV04iLCAobG9uZylGX0dFVE9XTikpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0VUT1dOCi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUT1dOIiwgKGxvbmcpRl9TRVRPV04pKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TRVRPV04iLCAobG9uZylGX1NFVE9XTikpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfR0VUU0lHCi0gICAgICAgIGlmIChpbnMoZCwgIkZfR0VUU0lHIiwgKGxvbmcpRl9HRVRTSUcpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9HRVRTSUciLCAobG9uZylGX0dFVFNJRykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0VUU0lHCi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUU0lHIiwgKGxvbmcpRl9TRVRTSUcpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TRVRTSUciLCAobG9uZylGX1NFVFNJRykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfUkRMQ0sKLSAgICAgICAgaWYgKGlucyhkLCAiRl9SRExDSyIsIChsb25nKUZfUkRMQ0spKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9SRExDSyIsIChsb25nKUZfUkRMQ0spKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1dSTENLCi0gICAgICAgIGlmIChpbnMoZCwgIkZfV1JMQ0siLCAobG9uZylGX1dSTENLKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfV1JMQ0siLCAobG9uZylGX1dSTENLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9VTkxDSwotICAgICAgICBpZiAoaW5zKGQsICJGX1VOTENLIiwgKGxvbmcpRl9VTkxDSykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX1VOTENLIiwgKGxvbmcpRl9VTkxDSykpIHJldHVybiAtMTsKICNlbmRpZgogLyogTEZTIGNvbnN0YW50cyAqLwogI2lmZGVmIEZfR0VUTEs2NAotICAgICAgICBpZiAoaW5zKGQsICJGX0dFVExLNjQiLCAobG9uZylGX0dFVExLNjQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9HRVRMSzY0IiwgKGxvbmcpRl9HRVRMSzY0KSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9TRVRMSzY0Ci0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUTEs2NCIsIChsb25nKUZfU0VUTEs2NCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX1NFVExLNjQiLCAobG9uZylGX1NFVExLNjQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1NFVExLVzY0Ci0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUTEtXNjQiLCAobG9uZylGX1NFVExLVzY0KSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfU0VUTEtXNjQiLCAobG9uZylGX1NFVExLVzY0KSkgcmV0dXJuIC0xOwogI2VuZGlmCiAvKiBHTlUgZXh0ZW5zaW9ucywgYXMgb2YgZ2xpYmMgMi4yLjQuICovCiAjaWZkZWYgRkFTWU5DCi0gICAgICAgIGlmIChpbnMoZCwgIkZBU1lOQyIsIChsb25nKUZBU1lOQykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGQVNZTkMiLCAobG9uZylGQVNZTkMpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1NFVExFQVNFCi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUTEVBU0UiLCAobG9uZylGX1NFVExFQVNFKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfU0VUTEVBU0UiLCAobG9uZylGX1NFVExFQVNFKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9HRVRMRUFTRQotICAgICAgICBpZiAoaW5zKGQsICJGX0dFVExFQVNFIiwgKGxvbmcpRl9HRVRMRUFTRSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX0dFVExFQVNFIiwgKGxvbmcpRl9HRVRMRUFTRSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfTk9USUZZCi0gICAgICAgIGlmIChpbnMoZCwgIkZfTk9USUZZIiwgKGxvbmcpRl9OT1RJRlkpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9OT1RJRlkiLCAobG9uZylGX05PVElGWSkpIHJldHVybiAtMTsKICNlbmRpZgogLyogT2xkIEJTRCBmbG9jaygpLiAqLwogI2lmZGVmIEZfRVhMQ0sKLSAgICAgICAgaWYgKGlucyhkLCAiRl9FWExDSyIsIChsb25nKUZfRVhMQ0spKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9FWExDSyIsIChsb25nKUZfRVhMQ0spKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1NITENLCi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0hMQ0siLCAobG9uZylGX1NITENLKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfU0hMQ0siLCAobG9uZylGX1NITENLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKIC8qIE9TIFggKGFuZCBtYXliZSBvdGhlcnMpIGxldCB5b3UgdGVsbCB0aGUgc3RvcmFnZSBkZXZpY2UgdG8gZmx1c2ggdG8gcGh5c2ljYWwgbWVkaWEgKi8KICNpZmRlZiBGX0ZVTExGU1lOQwotICAgICAgICBpZiAoaW5zKGQsICJGX0ZVTExGU1lOQyIsIChsb25nKUZfRlVMTEZTWU5DKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfRlVMTEZTWU5DIiwgKGxvbmcpRl9GVUxMRlNZTkMpKSByZXR1cm4gLTE7CiAjZW5kaWYKIAogLyogRm9yIEZfe0dFVHxTRVR9RkwgKi8KICNpZmRlZiBGRF9DTE9FWEVDCi0gICAgICAgIGlmIChpbnMoZCwgIkZEX0NMT0VYRUMiLCAobG9uZylGRF9DTE9FWEVDKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZEX0NMT0VYRUMiLCAobG9uZylGRF9DTE9FWEVDKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKIC8qIEZvciBGX05PVElGWSAqLwogI2lmZGVmIEROX0FDQ0VTUwotICAgICAgICBpZiAoaW5zKGQsICJETl9BQ0NFU1MiLCAobG9uZylETl9BQ0NFU1MpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRE5fQUNDRVNTIiwgKGxvbmcpRE5fQUNDRVNTKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRE5fTU9ESUZZCi0gICAgICAgIGlmIChpbnMoZCwgIkROX01PRElGWSIsIChsb25nKUROX01PRElGWSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJETl9NT0RJRlkiLCAobG9uZylETl9NT0RJRlkpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBETl9DUkVBVEUKLSAgICAgICAgaWYgKGlucyhkLCAiRE5fQ1JFQVRFIiwgKGxvbmcpRE5fQ1JFQVRFKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkROX0NSRUFURSIsIChsb25nKUROX0NSRUFURSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEROX0RFTEVURQotICAgICAgICBpZiAoaW5zKGQsICJETl9ERUxFVEUiLCAobG9uZylETl9ERUxFVEUpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRE5fREVMRVRFIiwgKGxvbmcpRE5fREVMRVRFKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRE5fUkVOQU1FCi0gICAgICAgIGlmIChpbnMoZCwgIkROX1JFTkFNRSIsIChsb25nKUROX1JFTkFNRSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJETl9SRU5BTUUiLCAobG9uZylETl9SRU5BTUUpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBETl9BVFRSSUIKLSAgICAgICAgaWYgKGlucyhkLCAiRE5fQVRUUklCIiwgKGxvbmcpRE5fQVRUUklCKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkROX0FUVFJJQiIsIChsb25nKUROX0FUVFJJQikpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEROX01VTFRJU0hPVAotICAgICAgICBpZiAoaW5zKGQsICJETl9NVUxUSVNIT1QiLCAobG9uZylETl9NVUxUSVNIT1QpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRE5fTVVMVElTSE9UIiwgKGxvbmcpRE5fTVVMVElTSE9UKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX1NUUk9QVFNfSAotCS8qIFVuaXggOTggZ3VhcmFudGVlcyB0aGF0IHRoZXNlIGFyZSBpbiBzdHJvcHRzLmguICovCi0JSU5TKElfUFVTSCk7Ci0JSU5TKElfUE9QKTsKLQlJTlMoSV9MT09LKTsKLQlJTlMoSV9GTFVTSCk7Ci0JSU5TKElfRkxVU0hCQU5EKTsKLQlJTlMoSV9TRVRTSUcpOwotCUlOUyhJX0dFVFNJRyk7Ci0JSU5TKElfRklORCk7Ci0JSU5TKElfUEVFSyk7Ci0JSU5TKElfU1JET1BUKTsKLQlJTlMoSV9HUkRPUFQpOwotCUlOUyhJX05SRUFEKTsKLQlJTlMoSV9GRElOU0VSVCk7Ci0JSU5TKElfU1RSKTsKLQlJTlMoSV9TV1JPUFQpOworICAgIC8qIFVuaXggOTggZ3VhcmFudGVlcyB0aGF0IHRoZXNlIGFyZSBpbiBzdHJvcHRzLmguICovCisgICAgSU5TKElfUFVTSCk7CisgICAgSU5TKElfUE9QKTsKKyAgICBJTlMoSV9MT09LKTsKKyAgICBJTlMoSV9GTFVTSCk7CisgICAgSU5TKElfRkxVU0hCQU5EKTsKKyAgICBJTlMoSV9TRVRTSUcpOworICAgIElOUyhJX0dFVFNJRyk7CisgICAgSU5TKElfRklORCk7CisgICAgSU5TKElfUEVFSyk7CisgICAgSU5TKElfU1JET1BUKTsKKyAgICBJTlMoSV9HUkRPUFQpOworICAgIElOUyhJX05SRUFEKTsKKyAgICBJTlMoSV9GRElOU0VSVCk7CisgICAgSU5TKElfU1RSKTsKKyAgICBJTlMoSV9TV1JPUFQpOwogI2lmZGVmIElfR1dST1BUCi0JLyogZGVzcGl0ZSB0aGUgY29tbWVudCBhYm92ZSwgb2xkLWlzaCBnbGliY3MgbWlzcyBhIGNvdXBsZS4uLiAqLwotCUlOUyhJX0dXUk9QVCk7CisgICAgLyogZGVzcGl0ZSB0aGUgY29tbWVudCBhYm92ZSwgb2xkLWlzaCBnbGliY3MgbWlzcyBhIGNvdXBsZS4uLiAqLworICAgIElOUyhJX0dXUk9QVCk7CiAjZW5kaWYKLQlJTlMoSV9TRU5ERkQpOwotCUlOUyhJX1JFQ1ZGRCk7Ci0JSU5TKElfTElTVCk7Ci0JSU5TKElfQVRNQVJLKTsKLQlJTlMoSV9DS0JBTkQpOwotCUlOUyhJX0dFVEJBTkQpOwotCUlOUyhJX0NBTlBVVCk7Ci0JSU5TKElfU0VUQ0xUSU1FKTsKKyAgICBJTlMoSV9TRU5ERkQpOworICAgIElOUyhJX1JFQ1ZGRCk7CisgICAgSU5TKElfTElTVCk7CisgICAgSU5TKElfQVRNQVJLKTsKKyAgICBJTlMoSV9DS0JBTkQpOworICAgIElOUyhJX0dFVEJBTkQpOworICAgIElOUyhJX0NBTlBVVCk7CisgICAgSU5TKElfU0VUQ0xUSU1FKTsKICNpZmRlZiBJX0dFVENMVElNRQotCUlOUyhJX0dFVENMVElNRSk7CisgICAgSU5TKElfR0VUQ0xUSU1FKTsKICNlbmRpZgotCUlOUyhJX0xJTkspOwotCUlOUyhJX1VOTElOSyk7Ci0JSU5TKElfUExJTkspOwotCUlOUyhJX1BVTkxJTkspOworICAgIElOUyhJX0xJTkspOworICAgIElOUyhJX1VOTElOSyk7CisgICAgSU5TKElfUExJTkspOworICAgIElOUyhJX1BVTkxJTkspOwogI2VuZGlmCi0JCi0JcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMDsKIH0KIAogUHlNT0RJTklUX0ZVTkMKIGluaXRmY250bCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CiAKLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgYW5kIGRvY3VtZW50YXRpb24gKi8KLQltID0gUHlfSW5pdE1vZHVsZTMoImZjbnRsIiwgZmNudGxfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyBhbmQgZG9jdW1lbnRhdGlvbiAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiZmNudGwiLCBmY250bF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWFsbF9pbnMoZCk7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBhbGxfaW5zKGQpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9mbG1vZHVsZS5jIGIvTW9kdWxlcy9mbG1vZHVsZS5jCmluZGV4IGQyYzI1MDYuLmI1YTc4Y2YgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZmxtb2R1bGUuYworKysgYi9Nb2R1bGVzL2ZsbW9kdWxlLmMKQEAgLTIyLDExICsyMiwxMSBAQAogLyogR2VuZXJpYyBGb3JtcyBPYmplY3RzICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRkxfT0JKRUNUICpvYl9nZW5lcmljOwotCVB5TWV0aG9kRGVmICpvYl9tZXRob2RzOwotCVB5T2JqZWN0ICpvYl9jYWxsYmFjazsKLQlQeU9iamVjdCAqb2JfY2FsbGJhY2tfYXJnOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGTF9PQkpFQ1QgKm9iX2dlbmVyaWM7CisgICAgUHlNZXRob2REZWYgKm9iX21ldGhvZHM7CisgICAgUHlPYmplY3QgKm9iX2NhbGxiYWNrOworICAgIFB5T2JqZWN0ICpvYl9jYWxsYmFja19hcmc7CiB9IGdlbmVyaWNvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgR2VuZXJpY09iamVjdHR5cGU7CkBAIC00MywzMiArNDMsMzIgQEAKIHN0YXRpYyB2b2lkCiBrbm93Z2VuZXJpYyhnZW5lcmljb2JqZWN0ICpnKQogewotCWludCBpLCBuOwotCS8qIENyZWF0ZSB0aGUgbGlzdCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QgKi8KLQlpZiAoYWxsZ2VuZXJpY3MgPT0gTlVMTCkgewotCQlhbGxnZW5lcmljcyA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmIChhbGxnZW5lcmljcyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJcmV0dXJuOyAvKiBUb28gYmFkLCBsaXZlIHdpdGhvdXQgYWxsZ2VuZXJpY3MuLi4gKi8KLQkJfQotCX0KLQlpZiAobmZyZWVzbG90cyA+IDApIHsKLQkJLyogU2VhcmNoIHRoZSBsaXN0IGZvciByZXVzYWJsZSBzbG90cyAoTlVMTCBpdGVtcykgKi8KLQkJLyogWFhYIFRoaXMgY2FuIGJlIG1hZGUgZmFzdGVyISAqLwotCQluID0gUHlMaXN0X1NpemUoYWxsZ2VuZXJpY3MpOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlpZiAoUHlMaXN0X0dldEl0ZW0oYWxsZ2VuZXJpY3MsIGkpID09IE5VTEwpIHsKLQkJCQlQeV9JTkNSRUYoZyk7Ci0JCQkJUHlMaXN0X1NldEl0ZW0oYWxsZ2VuZXJpY3MsIGksIChQeU9iamVjdCAqKWcpOwotCQkJCW5mcmVlc2xvdHMtLTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLyogU3RyYW5nZS4uLiBubyBmcmVlIHNsb3RzIGZvdW5kLi4uICovCi0JCW5mcmVlc2xvdHMgPSAwOwotCX0KLQkvKiBObyBmcmVlIGVudHJpZXMsIGFwcGVuZCBuZXcgaXRlbSB0byB0aGUgZW5kICovCi0JUHlMaXN0X0FwcGVuZChhbGxnZW5lcmljcywgKFB5T2JqZWN0ICopZyk7CisgICAgaW50IGksIG47CisgICAgLyogQ3JlYXRlIHRoZSBsaXN0IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCAqLworICAgIGlmIChhbGxnZW5lcmljcyA9PSBOVUxMKSB7CisgICAgICAgIGFsbGdlbmVyaWNzID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgaWYgKGFsbGdlbmVyaWNzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm47IC8qIFRvbyBiYWQsIGxpdmUgd2l0aG91dCBhbGxnZW5lcmljcy4uLiAqLworICAgICAgICB9CisgICAgfQorICAgIGlmIChuZnJlZXNsb3RzID4gMCkgeworICAgICAgICAvKiBTZWFyY2ggdGhlIGxpc3QgZm9yIHJldXNhYmxlIHNsb3RzIChOVUxMIGl0ZW1zKSAqLworICAgICAgICAvKiBYWFggVGhpcyBjYW4gYmUgbWFkZSBmYXN0ZXIhICovCisgICAgICAgIG4gPSBQeUxpc3RfU2l6ZShhbGxnZW5lcmljcyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfR2V0SXRlbShhbGxnZW5lcmljcywgaSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihnKTsKKyAgICAgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShhbGxnZW5lcmljcywgaSwgKFB5T2JqZWN0ICopZyk7CisgICAgICAgICAgICAgICAgbmZyZWVzbG90cy0tOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBTdHJhbmdlLi4uIG5vIGZyZWUgc2xvdHMgZm91bmQuLi4gKi8KKyAgICAgICAgbmZyZWVzbG90cyA9IDA7CisgICAgfQorICAgIC8qIE5vIGZyZWUgZW50cmllcywgYXBwZW5kIG5ldyBpdGVtIHRvIHRoZSBlbmQgKi8KKyAgICBQeUxpc3RfQXBwZW5kKGFsbGdlbmVyaWNzLCAoUHlPYmplY3QgKilnKTsKIH0KIAogLyogRmluZCBhbiBvYmplY3QgaW4gdGhlIGxpc3Qgb2Yga25vd24gb2JqZWN0cyAqLwpAQCAtNzYsMTggKzc2LDE4IEBACiBzdGF0aWMgZ2VuZXJpY29iamVjdCAqCiBmaW5kZ2VuZXJpYyhGTF9PQkpFQ1QgKmdlbmVyaWMpCiB7Ci0JaW50IGksIG47Ci0JZ2VuZXJpY29iamVjdCAqZzsKLQkKLQlpZiAoYWxsZ2VuZXJpY3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7IC8qIE5vIG9iamVjdHMga25vd24geWV0ICovCi0JbiA9IFB5TGlzdF9TaXplKGFsbGdlbmVyaWNzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWcgPSAoZ2VuZXJpY29iamVjdCAqKVB5TGlzdF9HZXRJdGVtKGFsbGdlbmVyaWNzLCBpKTsKLQkJaWYgKGcgIT0gTlVMTCAmJiBnLT5vYl9nZW5lcmljID09IGdlbmVyaWMpCi0JCQlyZXR1cm4gZzsKLQl9Ci0JcmV0dXJuIE5VTEw7IC8qIFVua25vd24gb2JqZWN0ICovCisgICAgaW50IGksIG47CisgICAgZ2VuZXJpY29iamVjdCAqZzsKKworICAgIGlmIChhbGxnZW5lcmljcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsgLyogTm8gb2JqZWN0cyBrbm93biB5ZXQgKi8KKyAgICBuID0gUHlMaXN0X1NpemUoYWxsZ2VuZXJpY3MpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZyA9IChnZW5lcmljb2JqZWN0ICopUHlMaXN0X0dldEl0ZW0oYWxsZ2VuZXJpY3MsIGkpOworICAgICAgICBpZiAoZyAhPSBOVUxMICYmIGctPm9iX2dlbmVyaWMgPT0gZ2VuZXJpYykKKyAgICAgICAgICAgIHJldHVybiBnOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsgLyogVW5rbm93biBvYmplY3QgKi8KIH0KIAogLyogUmVtb3ZlIGFuIG9iamVjdCBmcm9tIHRoZSBsaXN0IG9mIGtub3duIG9iamVjdHMgKi8KQEAgLTk1LDIyICs5NSwyMiBAQAogc3RhdGljIHZvaWQKIGZvcmdldGdlbmVyaWMoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlpbnQgaSwgbjsKLQkKLQlQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrKTsKLQlnLT5vYl9jYWxsYmFjayA9IE5VTEw7Ci0JUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOwotCWctPm9iX2NhbGxiYWNrX2FyZyA9IE5VTEw7Ci0JaWYgKGFsbGdlbmVyaWNzID09IE5VTEwpCi0JCXJldHVybjsgLyogTm8gb2JqZWN0cyBrbm93biB5ZXQgKi8KLQluID0gUHlMaXN0X1NpemUoYWxsZ2VuZXJpY3MpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJaWYgKGcgPT0gKGdlbmVyaWNvYmplY3QgKilQeUxpc3RfR2V0SXRlbShhbGxnZW5lcmljcywgaSkpIHsKLQkJCVB5TGlzdF9TZXRJdGVtKGFsbGdlbmVyaWNzLCBpLCAoUHlPYmplY3QgKilOVUxMKTsKLQkJCW5mcmVlc2xvdHMrKzsKLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgIGludCBpLCBuOworCisgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFjayk7CisgICAgZy0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgIFB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKKyAgICBnLT5vYl9jYWxsYmFja19hcmcgPSBOVUxMOworICAgIGlmIChhbGxnZW5lcmljcyA9PSBOVUxMKQorICAgICAgICByZXR1cm47IC8qIE5vIG9iamVjdHMga25vd24geWV0ICovCisgICAgbiA9IFB5TGlzdF9TaXplKGFsbGdlbmVyaWNzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGlmIChnID09IChnZW5lcmljb2JqZWN0ICopUHlMaXN0X0dldEl0ZW0oYWxsZ2VuZXJpY3MsIGkpKSB7CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShhbGxnZW5lcmljcywgaSwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgICAgICAgICBuZnJlZXNsb3RzKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLyogQ2FsbGVkIHdoZW4gYSBmb3JtIGlzIGFib3V0IHRvIGJlIGZyZWVkIC0tCkBAIC0xMTksMjcgKzExOSwyNyBAQAogc3RhdGljIHZvaWQKIHJlbGVhc2VvYmplY3RzKEZMX0ZPUk0gKmZvcm0pCiB7Ci0JaW50IGksIG47Ci0JZ2VuZXJpY29iamVjdCAqZzsKLQkKLQlpZiAoYWxsZ2VuZXJpY3MgPT0gTlVMTCkKLQkJcmV0dXJuOyAvKiBObyBvYmplY3RzIGtub3duIHlldCAqLwotCW4gPSBQeUxpc3RfU2l6ZShhbGxnZW5lcmljcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlnID0gKGdlbmVyaWNvYmplY3QgKilQeUxpc3RfR2V0SXRlbShhbGxnZW5lcmljcywgaSk7Ci0JCWlmIChnICE9IE5VTEwgJiYgZy0+b2JfZ2VuZXJpYy0+Zm9ybSA9PSBmb3JtKSB7Ci0JCQlmbF9kZWxldGVfb2JqZWN0KGctPm9iX2dlbmVyaWMpOwotCQkJLyogVGhlIG9iamVjdCBpcyBub3cgdW5yZWFjaGFibGUgZm9yCi0JCQkgICBkb19mb3JtcyBhbmQgY2hlY2tfZm9ybXMsIHNvCi0JCQkgICBkZWxldGUgaXQgZnJvbSB0aGUgbGlzdCBvZiBrbm93biBvYmplY3RzICovCi0JCQlQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrKTsKLQkJCWctPm9iX2NhbGxiYWNrID0gTlVMTDsKLQkJCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKLQkJCWctPm9iX2NhbGxiYWNrX2FyZyA9IE5VTEw7Ci0JCQlQeUxpc3RfU2V0SXRlbShhbGxnZW5lcmljcywgaSwgKFB5T2JqZWN0ICopTlVMTCk7Ci0JCQluZnJlZXNsb3RzKys7Ci0JCX0KLQl9CisgICAgaW50IGksIG47CisgICAgZ2VuZXJpY29iamVjdCAqZzsKKworICAgIGlmIChhbGxnZW5lcmljcyA9PSBOVUxMKQorICAgICAgICByZXR1cm47IC8qIE5vIG9iamVjdHMga25vd24geWV0ICovCisgICAgbiA9IFB5TGlzdF9TaXplKGFsbGdlbmVyaWNzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGcgPSAoZ2VuZXJpY29iamVjdCAqKVB5TGlzdF9HZXRJdGVtKGFsbGdlbmVyaWNzLCBpKTsKKyAgICAgICAgaWYgKGcgIT0gTlVMTCAmJiBnLT5vYl9nZW5lcmljLT5mb3JtID09IGZvcm0pIHsKKyAgICAgICAgICAgIGZsX2RlbGV0ZV9vYmplY3QoZy0+b2JfZ2VuZXJpYyk7CisgICAgICAgICAgICAvKiBUaGUgb2JqZWN0IGlzIG5vdyB1bnJlYWNoYWJsZSBmb3IKKyAgICAgICAgICAgICAgIGRvX2Zvcm1zIGFuZCBjaGVja19mb3Jtcywgc28KKyAgICAgICAgICAgICAgIGRlbGV0ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGtub3duIG9iamVjdHMgKi8KKyAgICAgICAgICAgIFB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2spOworICAgICAgICAgICAgZy0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOworICAgICAgICAgICAgZy0+b2JfY2FsbGJhY2tfYXJnID0gTlVMTDsKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGFsbGdlbmVyaWNzLCBpLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICAgICAgICAgIG5mcmVlc2xvdHMrKzsKKyAgICAgICAgfQorICAgIH0KIH0KIAogCkBAIC0xNDgsNzkgKzE0OCw3OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfc2V0X2NhbGxfYmFjayhnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKSB7Ci0JCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2spOwotCQlQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrX2FyZyk7Ci0JCWctPm9iX2NhbGxiYWNrID0gTlVMTDsKLQkJZy0+b2JfY2FsbGJhY2tfYXJnID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0gICAgICAgIFB5T2JqZWN0ICphLCAqYjsKLSAgICAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2V0X2NhbGxfYmFjayIsIDIsIDIsICZhLCAmYikpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkJUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFjayk7Ci0JCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKLQkJZy0+b2JfY2FsbGJhY2sgPSBhOwotCQlQeV9JTkNSRUYoZy0+b2JfY2FsbGJhY2spOwotCQlnLT5vYl9jYWxsYmFja19hcmcgPSBiOwotCQlQeV9JTkNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApIHsKKyAgICAgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFjayk7CisgICAgICAgIFB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKKyAgICAgICAgZy0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgICAgICBnLT5vYl9jYWxsYmFja19hcmcgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICBQeU9iamVjdCAqYSwgKmI7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2V0X2NhbGxfYmFjayIsIDIsIDIsICZhLCAmYikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrKTsKKyAgICAgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOworICAgICAgICBnLT5vYl9jYWxsYmFjayA9IGE7CisgICAgICAgIFB5X0lOQ1JFRihnLT5vYl9jYWxsYmFjayk7CisgICAgICAgIGctPm9iX2NhbGxiYWNrX2FyZyA9IGI7CisgICAgICAgIFB5X0lOQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX2NhbGwoZ2VuZXJpY29iamVjdCAqZywgdm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqKSkKIHsKLQkoKmZ1bmMpKGctPm9iX2dlbmVyaWMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAoKmZ1bmMpKGctPm9iX2dlbmVyaWMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfZGVsZXRlX29iamVjdChnZW5lcmljb2JqZWN0ICpnKQogewotCVB5T2JqZWN0ICpyZXM7Ci0JcmVzID0gZ2VuZXJpY19jYWxsKGcsIGZsX2RlbGV0ZV9vYmplY3QpOwotCWlmIChyZXMgIT0gTlVMTCkKLQkJZm9yZ2V0Z2VuZXJpYyhnKTsKLQlyZXR1cm4gcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgcmVzID0gZ2VuZXJpY19jYWxsKGcsIGZsX2RlbGV0ZV9vYmplY3QpOworICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICAgICAgZm9yZ2V0Z2VuZXJpYyhnKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19zaG93X29iamVjdChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfc2hvd19vYmplY3QpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfc2hvd19vYmplY3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19oaWRlX29iamVjdChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfaGlkZV9vYmplY3QpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfaGlkZV9vYmplY3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19yZWRyYXdfb2JqZWN0KGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9yZWRyYXdfb2JqZWN0KTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsKGcsIGZsX3JlZHJhd19vYmplY3QpOwogfQogCiAjaWZkZWYgT0JTT0xFVEVfRk9STVNfQ0FMTFMKLSAKKwogIC8qICh1bilmcmVlemVfb2JqZWN0KCkgYXJlIG9ic29sZXRlIGluIEZPUk1TIDIuMiBhbmQgdW5zdXBwb3J0ZWQKICAgICBpbiAyLjMuICBTaW5jZSB0aGVyZSdzIG5vIGZvb2xwcm9vZiB3YXkgdG8gdGVsbCB3aGljaCB2ZXJzaW9uIHdlJ3JlCiAgICAgdXNpbmcsIHdlIG9taXQgdGhlbSB1bmNvbmRpdGlvbmFsbHkuICovCi0gCisKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX2ZyZWV6ZV9vYmplY3QoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gZ2VuZXJpY19jYWxsKGcsIGZsX2ZyZWV6ZV9vYmplY3QpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfZnJlZXplX29iamVjdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX3VuZnJlZXplX29iamVjdChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfdW5mcmVlemVfb2JqZWN0KTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsKGcsIGZsX3VuZnJlZXplX29iamVjdCk7CiB9CiAKICNlbmRpZiAvKiBPQlNPTEVURV9GT1JNU19DQUxMUyAqLwpAQCAtMjI4LDc4ICsyMjgsNzggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX2FjdGl2YXRlX29iamVjdChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfYWN0aXZhdGVfb2JqZWN0KTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsKGcsIGZsX2FjdGl2YXRlX29iamVjdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX2RlYWN0aXZhdGVfb2JqZWN0KGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9kZWFjdGl2YXRlX29iamVjdCk7CisgICAgcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9kZWFjdGl2YXRlX29iamVjdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX3NldF9vYmplY3Rfc2hvcnRjdXQoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc3RyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzZXRfb2JqZWN0X3Nob3J0Y3V0IiwgJnN0cikpCi0JCXJldHVybiBOVUxMOwotCWZsX3NldF9vYmplY3Rfc2hvcnRjdXQoZy0+b2JfZ2VuZXJpYywgc3RyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqc3RyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzZXRfb2JqZWN0X3Nob3J0Y3V0IiwgJnN0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZsX3NldF9vYmplY3Rfc2hvcnRjdXQoZy0+b2JfZ2VuZXJpYywgc3RyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBnZW5lcmljX21ldGhvZHNbXSA9IHsKLQl7InNldF9jYWxsX2JhY2siLAkoUHlDRnVuY3Rpb24pZ2VuZXJpY19zZXRfY2FsbF9iYWNrLCBNRVRIX1ZBUkFSR1N9LAotCXsiZGVsZXRlX29iamVjdCIsCShQeUNGdW5jdGlvbilnZW5lcmljX2RlbGV0ZV9vYmplY3QsIE1FVEhfTk9BUkdTfSwKLQl7InNob3dfb2JqZWN0IiwJCShQeUNGdW5jdGlvbilnZW5lcmljX3Nob3dfb2JqZWN0LCBNRVRIX05PQVJHU30sCi0JeyJoaWRlX29iamVjdCIsCQkoUHlDRnVuY3Rpb24pZ2VuZXJpY19oaWRlX29iamVjdCwgTUVUSF9OT0FSR1N9LAotCXsicmVkcmF3X29iamVjdCIsCShQeUNGdW5jdGlvbilnZW5lcmljX3JlZHJhd19vYmplY3QsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9jYWxsX2JhY2siLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfc2V0X2NhbGxfYmFjaywgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImRlbGV0ZV9vYmplY3QiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfZGVsZXRlX29iamVjdCwgTUVUSF9OT0FSR1N9LAorICAgIHsic2hvd19vYmplY3QiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY19zaG93X29iamVjdCwgTUVUSF9OT0FSR1N9LAorICAgIHsiaGlkZV9vYmplY3QiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY19oaWRlX29iamVjdCwgTUVUSF9OT0FSR1N9LAorICAgIHsicmVkcmF3X29iamVjdCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY19yZWRyYXdfb2JqZWN0LCBNRVRIX05PQVJHU30sCiAjaWZkZWYgT0JTT0xFVEVfRk9STVNfQ0FMTFMKLQl7ImZyZWV6ZV9vYmplY3QiLAkoUHlDRnVuY3Rpb24pZ2VuZXJpY19mcmVlemVfb2JqZWN0LCBNRVRIX05PQVJHU30sCi0JeyJ1bmZyZWV6ZV9vYmplY3QiLAkoUHlDRnVuY3Rpb24pZ2VuZXJpY191bmZyZWV6ZV9vYmplY3QsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImZyZWV6ZV9vYmplY3QiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfZnJlZXplX29iamVjdCwgTUVUSF9OT0FSR1N9LAorICAgIHsidW5mcmVlemVfb2JqZWN0IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY191bmZyZWV6ZV9vYmplY3QsIE1FVEhfTk9BUkdTfSwKICNlbmRpZgotCXsiYWN0aXZhdGVfb2JqZWN0IiwJKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfYWN0aXZhdGVfb2JqZWN0LCBNRVRIX05PQVJHU30sCi0JeyJkZWFjdGl2YXRlX29iamVjdCIsCShQeUNGdW5jdGlvbilnZW5lcmljX2RlYWN0aXZhdGVfb2JqZWN0LCBNRVRIX05PQVJHU30sCi0JeyJzZXRfb2JqZWN0X3Nob3J0Y3V0IiwJKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfc2V0X29iamVjdF9zaG9ydGN1dCwgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImFjdGl2YXRlX29iamVjdCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfYWN0aXZhdGVfb2JqZWN0LCBNRVRIX05PQVJHU30sCisgICAgeyJkZWFjdGl2YXRlX29iamVjdCIsICAgICAgIChQeUNGdW5jdGlvbilnZW5lcmljX2RlYWN0aXZhdGVfb2JqZWN0LCBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfb2JqZWN0X3Nob3J0Y3V0IiwgICAgIChQeUNGdW5jdGlvbilnZW5lcmljX3NldF9vYmplY3Rfc2hvcnRjdXQsIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIHZvaWQKIGdlbmVyaWNfZGVhbGxvYyhnZW5lcmljb2JqZWN0ICpnKQogewotCWZsX2ZyZWVfb2JqZWN0KGctPm9iX2dlbmVyaWMpOwotCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2spOwotCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKLQlQeU9iamVjdF9EZWwoZyk7CisgICAgZmxfZnJlZV9vYmplY3QoZy0+b2JfZ2VuZXJpYyk7CisgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFjayk7CisgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOworICAgIFB5T2JqZWN0X0RlbChnKTsKIH0KIAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoRkxfT0JKRUNULCB4KQogCiBzdGF0aWMgc3RydWN0IG1lbWJlcmxpc3QgZ2VuZXJpY19tZW1iZXJsaXN0W10gPSB7Ci0JeyJvYmpjbGFzcyIsCVRfSU5ULAkJT0ZGKG9iamNsYXNzKSwJUk99LAotCXsidHlwZSIsCVRfSU5ULAkJT0ZGKHR5cGUpLAlST30sCi0JeyJib3h0eXBlIiwJVF9JTlQsCQlPRkYoYm94dHlwZSl9LAotCXsieCIsCQlUX0ZMT0FULAlPRkYoeCl9LAotCXsieSIsCQlUX0ZMT0FULAlPRkYoeSl9LAotCXsidyIsCQlUX0ZMT0FULAlPRkYodyl9LAotCXsiaCIsCQlUX0ZMT0FULAlPRkYoaCl9LAotCXsiY29sMSIsCVRfSU5ULAkJT0ZGKGNvbDEpfSwKLQl7ImNvbDIiLAlUX0lOVCwJCU9GRihjb2wyKX0sCi0JeyJhbGlnbiIsCVRfSU5ULAkJT0ZGKGFsaWduKX0sCi0JeyJsY29sIiwJVF9JTlQsCQlPRkYobGNvbCl9LAotCXsibHNpemUiLAlUX0ZMT0FULAlPRkYobHNpemUpfSwKLQkvKiAibGFiZWwiIGlzIHRyZWF0ZWQgc3BlY2lhbGx5ISAqLwotCXsibHN0eWxlIiwJVF9JTlQsCQlPRkYobHN0eWxlKX0sCi0JeyJwdXNoZWQiLAlUX0lOVCwJCU9GRihwdXNoZWQpLAlST30sCi0JeyJmb2N1cyIsCVRfSU5ULAkJT0ZGKGZvY3VzKSwJUk99LAotCXsiYmVsb3dtb3VzZSIsCVRfSU5ULAkJT0ZGKGJlbG93bW91c2UpLFJPfSwKLS8qCXsiZnJvemVuIiwJVF9JTlQsCQlPRkYoZnJvemVuKSwJUk99LAkqLwotCXsiYWN0aXZlIiwJVF9JTlQsCQlPRkYoYWN0aXZlKX0sCi0JeyJpbnB1dCIsCVRfSU5ULAkJT0ZGKGlucHV0KX0sCi0JeyJ2aXNpYmxlIiwJVF9JTlQsCQlPRkYodmlzaWJsZSksCVJPfSwKLQl7InJhZGlvIiwJVF9JTlQsCQlPRkYocmFkaW8pfSwKLQl7ImF1dG9tYXRpYyIsCVRfSU5ULAkJT0ZGKGF1dG9tYXRpYyl9LAotCXtOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsib2JqY2xhc3MiLCAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihvYmpjbGFzcyksICBST30sCisgICAgeyJ0eXBlIiwgICAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKHR5cGUpLCAgICAgIFJPfSwKKyAgICB7ImJveHR5cGUiLCAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoYm94dHlwZSl9LAorICAgIHsieCIsICAgICAgICAgICAgICAgVF9GTE9BVCwgICAgICAgIE9GRih4KX0sCisgICAgeyJ5IiwgICAgICAgICAgICAgICBUX0ZMT0FULCAgICAgICAgT0ZGKHkpfSwKKyAgICB7InciLCAgICAgICAgICAgICAgIFRfRkxPQVQsICAgICAgICBPRkYodyl9LAorICAgIHsiaCIsICAgICAgICAgICAgICAgVF9GTE9BVCwgICAgICAgIE9GRihoKX0sCisgICAgeyJjb2wxIiwgICAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGNvbDEpfSwKKyAgICB7ImNvbDIiLCAgICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoY29sMil9LAorICAgIHsiYWxpZ24iLCAgICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihhbGlnbil9LAorICAgIHsibGNvbCIsICAgICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihsY29sKX0sCisgICAgeyJsc2l6ZSIsICAgICAgICAgICBUX0ZMT0FULCAgICAgICAgT0ZGKGxzaXplKX0sCisgICAgLyogImxhYmVsIiBpcyB0cmVhdGVkIHNwZWNpYWxseSEgKi8KKyAgICB7ImxzdHlsZSIsICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYobHN0eWxlKX0sCisgICAgeyJwdXNoZWQiLCAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKHB1c2hlZCksICAgIFJPfSwKKyAgICB7ImZvY3VzIiwgICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoZm9jdXMpLCAgICAgUk99LAorICAgIHsiYmVsb3dtb3VzZSIsICAgICAgVF9JTlQsICAgICAgICAgIE9GRihiZWxvd21vdXNlKSxST30sCisvKiAgICAgIHsiZnJvemVuIiwgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGZyb3plbiksICAgIFJPfSwgICAgKi8KKyAgICB7ImFjdGl2ZSIsICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoYWN0aXZlKX0sCisgICAgeyJpbnB1dCIsICAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGlucHV0KX0sCisgICAgeyJ2aXNpYmxlIiwgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKHZpc2libGUpLCAgIFJPfSwKKyAgICB7InJhZGlvIiwgICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYocmFkaW8pfSwKKyAgICB7ImF1dG9tYXRpYyIsICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoYXV0b21hdGljKX0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKICN1bmRlZiBPRkYKQEAgLTMwNyw5OSArMzA3LDk5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19nZXRhdHRyKGdlbmVyaWNvYmplY3QgKmcsIGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKm1ldGg7CisgICAgUHlPYmplY3QgKm1ldGg7CiAKLQkvKiBYWFggT3VnaHQgdG8gc3BlY2lhbC1jYXNlIG5hbWUgIl9fbWV0aG9kc19fIiAqLwotCWlmIChnLT4gb2JfbWV0aG9kcykgewotCQltZXRoID0gUHlfRmluZE1ldGhvZChnLT5vYl9tZXRob2RzLCAoUHlPYmplY3QgKilnLCBuYW1lKTsKLQkJaWYgKG1ldGggIT0gTlVMTCkgcmV0dXJuIG1ldGg7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQorICAgIC8qIFhYWCBPdWdodCB0byBzcGVjaWFsLWNhc2UgbmFtZSAiX19tZXRob2RzX18iICovCisgICAgaWYgKGctPiBvYl9tZXRob2RzKSB7CisgICAgICAgIG1ldGggPSBQeV9GaW5kTWV0aG9kKGctPm9iX21ldGhvZHMsIChQeU9iamVjdCAqKWcsIG5hbWUpOworICAgICAgICBpZiAobWV0aCAhPSBOVUxMKSByZXR1cm4gbWV0aDsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CiAKLQltZXRoID0gUHlfRmluZE1ldGhvZChnZW5lcmljX21ldGhvZHMsIChQeU9iamVjdCAqKWcsIG5hbWUpOwotCWlmIChtZXRoICE9IE5VTEwpCi0JCXJldHVybiBtZXRoOwotCVB5RXJyX0NsZWFyKCk7CisgICAgbWV0aCA9IFB5X0ZpbmRNZXRob2QoZ2VuZXJpY19tZXRob2RzLCAoUHlPYmplY3QgKilnLCBuYW1lKTsKKyAgICBpZiAobWV0aCAhPSBOVUxMKQorICAgICAgICByZXR1cm4gbWV0aDsKKyAgICBQeUVycl9DbGVhcigpOwogCi0JLyogImxhYmVsIiBpcyBhbiBleGNlcHRpb24sIGdldG1lbWJlciBvbmx5IHdvcmtzIGZvciBjaGFyIHBvaW50ZXJzLAotCSAgIG5vdCBmb3IgY2hhciBhcnJheXMgKi8KLQlpZiAoc3RyY21wKG5hbWUsICJsYWJlbCIpID09IDApCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGctPm9iX2dlbmVyaWMtPmxhYmVsKTsKKyAgICAvKiAibGFiZWwiIGlzIGFuIGV4Y2VwdGlvbiwgZ2V0bWVtYmVyIG9ubHkgd29ya3MgZm9yIGNoYXIgcG9pbnRlcnMsCisgICAgICAgbm90IGZvciBjaGFyIGFycmF5cyAqLworICAgIGlmIChzdHJjbXAobmFtZSwgImxhYmVsIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZy0+b2JfZ2VuZXJpYy0+bGFiZWwpOwogCi0JcmV0dXJuIFB5TWVtYmVyX0dldCgoY2hhciAqKWctPm9iX2dlbmVyaWMsIGdlbmVyaWNfbWVtYmVybGlzdCwgbmFtZSk7CisgICAgcmV0dXJuIFB5TWVtYmVyX0dldCgoY2hhciAqKWctPm9iX2dlbmVyaWMsIGdlbmVyaWNfbWVtYmVybGlzdCwgbmFtZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGdlbmVyaWNfc2V0YXR0cihnZW5lcmljb2JqZWN0ICpnLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlpbnQgcmV0OworICAgIGludCByZXQ7CiAKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBmb3JtcyBvYmplY3QgYXR0cmlidXRlcyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgZm9ybXMgb2JqZWN0IGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qICJsYWJlbCIgaXMgYW4gZXhjZXB0aW9uOiBzZXRtZW1iZXIgZG9lc24ndCBzZXQgc3RyaW5nczsKLQkgICBhbmQgRk9STVMgd2FudHMgeW91IHRvIGNhbGwgYSBmdW5jdGlvbiB0byBzZXQgdGhlIGxhYmVsICovCi0JaWYgKHN0cmNtcChuYW1lLCAibGFiZWwiKSA9PSAwKSB7Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJsYWJlbCBhdHRyIG11c3QgYmUgc3RyaW5nIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZmxfc2V0X29iamVjdF9sYWJlbChnLT5vYl9nZW5lcmljLCBQeVN0cmluZ19Bc1N0cmluZyh2KSk7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiAibGFiZWwiIGlzIGFuIGV4Y2VwdGlvbjogc2V0bWVtYmVyIGRvZXNuJ3Qgc2V0IHN0cmluZ3M7CisgICAgICAgYW5kIEZPUk1TIHdhbnRzIHlvdSB0byBjYWxsIGEgZnVuY3Rpb24gdG8gc2V0IHRoZSBsYWJlbCAqLworICAgIGlmIChzdHJjbXAobmFtZSwgImxhYmVsIikgPT0gMCkgeworICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbCBhdHRyIG11c3QgYmUgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZmxfc2V0X29iamVjdF9sYWJlbChnLT5vYl9nZW5lcmljLCBQeVN0cmluZ19Bc1N0cmluZyh2KSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJldCA9IFB5TWVtYmVyX1NldCgoY2hhciAqKWctPm9iX2dlbmVyaWMsIGdlbmVyaWNfbWVtYmVybGlzdCwgbmFtZSwgdik7CisgICAgcmV0ID0gUHlNZW1iZXJfU2V0KChjaGFyICopZy0+b2JfZ2VuZXJpYywgZ2VuZXJpY19tZW1iZXJsaXN0LCBuYW1lLCB2KTsKIAotCS8qIFJhdGhlciB0aGFuIGNhbGxpbmcgYWxsIHRoZSB2YXJpb3VzIHNldF9vYmplY3RfKiBmdW5jdGlvbnMsCi0JICAgd2UgY2FsbCBmbF9yZWRyYXdfb2JqZWN0IGhlcmUuICBUaGlzIGlzIHNvbWV0aW1lcyByZWR1bmRhbnQKLQkgICBidXQgSSBkb3VidCB0aGF0J3MgYSBiaWcgcHJvYmxlbSAqLwotCWlmIChyZXQgPT0gMCkKLQkJZmxfcmVkcmF3X29iamVjdChnLT5vYl9nZW5lcmljKTsKKyAgICAvKiBSYXRoZXIgdGhhbiBjYWxsaW5nIGFsbCB0aGUgdmFyaW91cyBzZXRfb2JqZWN0XyogZnVuY3Rpb25zLAorICAgICAgIHdlIGNhbGwgZmxfcmVkcmF3X29iamVjdCBoZXJlLiAgVGhpcyBpcyBzb21ldGltZXMgcmVkdW5kYW50CisgICAgICAgYnV0IEkgZG91YnQgdGhhdCdzIGEgYmlnIHByb2JsZW0gKi8KKyAgICBpZiAocmV0ID09IDApCisgICAgICAgIGZsX3JlZHJhd19vYmplY3QoZy0+b2JfZ2VuZXJpYyk7CiAKLQlyZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX3JlcHIoZ2VuZXJpY29iamVjdCAqZykKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjxGT1JNU19vYmplY3QgYXQgJXAsIG9iamNsYXNzPSVkPiIsCi0JCSAgICAgIGcsIGctPm9iX2dlbmVyaWMtPm9iamNsYXNzKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiPEZPUk1TX29iamVjdCBhdCAlcCwgb2JqY2xhc3M9JWQ+IiwKKyAgICAgICAgICAgICAgICAgIGcsIGctPm9iX2dlbmVyaWMtPm9iamNsYXNzKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEdlbmVyaWNPYmplY3R0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkiZmwuRk9STVNfb2JqZWN0IiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGdlbmVyaWNvYmplY3QpLAkJLyp0cF9zaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZ2VuZXJpY19kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCTAsCQkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylnZW5lcmljX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKWdlbmVyaWNfc2V0YXR0ciwJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYylnZW5lcmljX3JlcHIsCQkvKnRwX3JlcHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiZmwuRk9STVNfb2JqZWN0IiwgICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihnZW5lcmljb2JqZWN0KSwgICAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWdlbmVyaWNfZGVhbGxvYywgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWdlbmVyaWNfZ2V0YXR0ciwgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpZ2VuZXJpY19zZXRhdHRyLCAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKWdlbmVyaWNfcmVwciwgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdnZW5lcmljb2JqZWN0KEZMX09CSkVDVCAqZ2VuZXJpYywgUHlNZXRob2REZWYgKm1ldGhvZHMpCiB7Ci0JZ2VuZXJpY29iamVjdCAqZzsKLQlnID0gUHlPYmplY3RfTmV3KGdlbmVyaWNvYmplY3QsICZHZW5lcmljT2JqZWN0dHlwZSk7Ci0JaWYgKGcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZy0+IG9iX2dlbmVyaWMgPSBnZW5lcmljOwotCWctPm9iX21ldGhvZHMgPSBtZXRob2RzOwotCWctPm9iX2NhbGxiYWNrID0gTlVMTDsKLQlnLT5vYl9jYWxsYmFja19hcmcgPSBOVUxMOwotCWtub3dnZW5lcmljKGcpOwotCXJldHVybiAoUHlPYmplY3QgKilnOworICAgIGdlbmVyaWNvYmplY3QgKmc7CisgICAgZyA9IFB5T2JqZWN0X05ldyhnZW5lcmljb2JqZWN0LCAmR2VuZXJpY09iamVjdHR5cGUpOworICAgIGlmIChnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGctPiBvYl9nZW5lcmljID0gZ2VuZXJpYzsKKyAgICBnLT5vYl9tZXRob2RzID0gbWV0aG9kczsKKyAgICBnLT5vYl9jYWxsYmFjayA9IE5VTEw7CisgICAgZy0+b2JfY2FsbGJhY2tfYXJnID0gTlVMTDsKKyAgICBrbm93Z2VuZXJpYyhnKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MDksNzAgKzQwOSw3MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfSU5mICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGZsb2F0KSwgRkxfT0JKRUNUICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IHBhcmFtZXRlcjsKKyAgICBmbG9hdCBwYXJhbWV0ZXI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJmIiwgJnBhcmFtZXRlcikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgImYiLCAmcGFyYW1ldGVyKSkgcmV0dXJuIE5VTEw7CiAKLQkoKmZ1bmMpIChvYmosIHBhcmFtZXRlcik7CisgICAgKCpmdW5jKSAob2JqLCBwYXJhbWV0ZXIpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBmdW5jIChvYmplY3QsIGZsb2F0KSAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfSU5mSU5mICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGZsb2F0LCBmbG9hdCksIEZMX09CSkVDVCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBwYXIxLCBwYXIyOworICAgIGZsb2F0IHBhcjEsIHBhcjI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoZmYpIiwgJnBhcjEsICZwYXIyKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGZmKSIsICZwYXIxLCAmcGFyMikpIHJldHVybiBOVUxMOwogCi0JKCpmdW5jKSAob2JqLCBwYXIxLCBwYXIyKTsKKyAgICAoKmZ1bmMpIChvYmosIHBhcjEsIHBhcjIpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBmdW5jIChvYmplY3QsIGludCkgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2Zvcm1zX0lOaSAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBpbnQpLCBGTF9PQkpFQ1QgKm9iaiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHBhcmFtZXRlcjsKKyAgICBpbnQgcGFyYW1ldGVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZwYXJhbWV0ZXIpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnBhcmFtZXRlcikpIHJldHVybiBOVUxMOwogCi0JKCpmdW5jKSAob2JqLCBwYXJhbWV0ZXIpOworICAgICgqZnVuYykgKG9iaiwgcGFyYW1ldGVyKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZnVuYyAob2JqZWN0LCBjaGFyKSAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfSU5jICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGludCksIEZMX09CSkVDVCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICphOworICAgIGNoYXIgKmE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJzIiwgJmEpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJzIiwgJmEpKSByZXR1cm4gTlVMTDsKIAotCSgqZnVuYykgKG9iaiwgYVswXSk7CisgICAgKCpmdW5jKSAob2JqLCBhWzBdKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZnVuYyAob2JqZWN0LCBzdHJpbmcpICovCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19JTnN0ciAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBjaGFyICopLCBGTF9PQkpFQ1QgKm9iaiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqYTsKKyAgICBjaGFyICphOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyIsICZhKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyIsICZhKSkgcmV0dXJuIE5VTEw7CiAKLQkoKmZ1bmMpIChvYmosIGEpOworICAgICgqZnVuYykgKG9iaiwgYSk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTQ4MCwxNSArNDgwLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19JTmlJTnN0ciAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBpbnQsIGNoYXIgKiksIEZMX09CSkVDVCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpiOwotCWludCBhOwotCQotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcykiLCAmYSwgJmIpKSByZXR1cm4gTlVMTDsKLQkKLQkoKmZ1bmMpIChvYmosIGEsIGIpOwotCQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjaGFyICpiOworICAgIGludCBhOworCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlzKSIsICZhLCAmYikpIHJldHVybiBOVUxMOworCisgICAgKCpmdW5jKSAob2JqLCBhLCBiKTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2lmZGVmIFVOVVNFRApAQCAtNDk2LDE0ICs0OTYsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2Zvcm1zX0lOaUlOaSAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBpbnQsIGludCksIEZMX09CSkVDVCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcGFyMSwgcGFyMjsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnBhcjEsICZwYXIyKSkgcmV0dXJuIE5VTEw7Ci0JCi0JKCpmdW5jKSAob2JqLCBwYXIxLCBwYXIyKTsKLQkKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IHBhcjEsIHBhcjI7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnBhcjEsICZwYXIyKSkgcmV0dXJuIE5VTEw7CisKKyAgICAoKmZ1bmMpIChvYmosIHBhcjEsIHBhcjIpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmCiAKQEAgLTUxMSw1OCArNTExLDU4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19SaSAoaW50ICgqZnVuYykoRkxfT0JKRUNUICopLCBGTF9PQkpFQ1QgKm9iaikKIHsKLQlpbnQgcmV0dmFsOworICAgIGludCByZXR2YWw7CiAKLQlyZXR2YWwgPSAoKmZ1bmMpIChvYmopOworICAgIHJldHZhbCA9ICgqZnVuYykgKG9iaik7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcgKChsb25nKSByZXR2YWwpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyAoKGxvbmcpIHJldHZhbCk7CiB9CiAKIC8qIGNoYXIgKiBmdW5jIChvYmplY3QpICovCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19Sc3RyIChjaGFyICogKCpmdW5jKShGTF9PQkpFQ1QgKiksIEZMX09CSkVDVCAqb2JqKQogewotCWNoYXIgKnN0cjsKKyAgICBjaGFyICpzdHI7CiAKLQlzdHIgPSAoKmZ1bmMpIChvYmopOworICAgIHN0ciA9ICgqZnVuYykgKG9iaik7CiAKLQlpZiAoc3RyID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcgKHN0cik7CisgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nIChzdHIpOwogfQogCiAvKiBpbnQgZnVuYyAob2JqZWN0KSAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfUmYgKGZsb2F0ICgqZnVuYykoRkxfT0JKRUNUICopLCBGTF9PQkpFQ1QgKm9iaikKIHsKLQlmbG9hdCByZXR2YWw7CisgICAgZmxvYXQgcmV0dmFsOwogCi0JcmV0dmFsID0gKCpmdW5jKSAob2JqKTsKKyAgICByZXR2YWwgPSAoKmZ1bmMpIChvYmopOwogCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSAocmV0dmFsKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlIChyZXR2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19PVVRmT1VUZiAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBmbG9hdCAqLCBmbG9hdCAqKSwgRkxfT0JKRUNUICpvYmopCiB7Ci0JZmxvYXQgZjEsIGYyOworICAgIGZsb2F0IGYxLCBmMjsKIAotCSgqZnVuYykgKG9iaiwgJmYxLCAmZjIpOworICAgICgqZnVuYykgKG9iaiwgJmYxLCAmZjIpOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZikiLCBmMSwgZjIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmYpIiwgZjEsIGYyKTsKIH0KIAogI2lmZGVmIFVOVVNFRAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfT1VUZiAodm9pZCAoKmZ1bmMpKEZMX09CSkVDVCAqLCBmbG9hdCAqKSwgRkxfT0JKRUNUICpvYmopCiB7Ci0JZmxvYXQgZjsKKyAgICBmbG9hdCBmOwogCi0JKCpmdW5jKSAob2JqLCAmZik7CisgICAgKCpmdW5jKSAob2JqLCAmZik7CiAKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlIChmKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlIChmKTsKIH0KICNlbmRpZgogCkBAIC01NzIsMTcyICs1NzIsMTcyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2Jyb3dzZXJfdG9wbGluZShnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9icm93c2VyX3RvcGxpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9icm93c2VyX3RvcGxpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsZWFyX2Jyb3dzZXIoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gZ2VuZXJpY19jYWxsIChnLCBmbF9jbGVhcl9icm93c2VyKTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsIChnLCBmbF9jbGVhcl9icm93c2VyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFkZF9icm93c2VyX2xpbmUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9hZGRfYnJvd3Nlcl9saW5lLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX2FkZF9icm93c2VyX2xpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFkZHRvX2Jyb3dzZXIgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9hZGR0b19icm93c2VyLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX2FkZHRvX2Jyb3dzZXIsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc2VydF9icm93c2VyX2xpbmUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaUlOc3RyIChmbF9pbnNlcnRfYnJvd3Nlcl9saW5lLAotCQkJCSAgICBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pSU5zdHIgKGZsX2luc2VydF9icm93c2VyX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbGV0ZV9icm93c2VyX2xpbmUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfZGVsZXRlX2Jyb3dzZXJfbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfZGVsZXRlX2Jyb3dzZXJfbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVwbGFjZV9icm93c2VyX2xpbmUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaUlOc3RyIChmbF9yZXBsYWNlX2Jyb3dzZXJfbGluZSwKLQkJCQkgICAgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaUlOc3RyIChmbF9yZXBsYWNlX2Jyb3dzZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2Jyb3dzZXJfbGluZShnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaTsKLQljaGFyICpzdHI7CisgICAgaW50IGk7CisgICAgY2hhciAqc3RyOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdHIgPSBmbF9nZXRfYnJvd3Nlcl9saW5lIChnLT5vYl9nZW5lcmljLCBpKTsKKyAgICBzdHIgPSBmbF9nZXRfYnJvd3Nlcl9saW5lIChnLT5vYl9nZW5lcmljLCBpKTsKIAotCWlmIChzdHIgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyAoc3RyKTsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcgKHN0cik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkX2Jyb3dzZXIgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCS8qIFhYWCBzdHJpY3RseSBzcGVha2luZyB0aGlzIGlzIHdyb25nIHNpbmNlIGZsX2xvYWRfYnJvd3NlcgotCSAgIFhYWCByZXR1cm5zIGludCwgbm90IHZvaWQgKi8KLQlyZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfbG9hZF9icm93c2VyLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgLyogWFhYIHN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXMgd3Jvbmcgc2luY2UgZmxfbG9hZF9icm93c2VyCisgICAgICAgWFhYIHJldHVybnMgaW50LCBub3Qgdm9pZCAqLworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9sb2FkX2Jyb3dzZXIsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9icm93c2VyX21heGxpbmUoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X2Jyb3dzZXJfbWF4bGluZSwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JpIChmbF9nZXRfYnJvd3Nlcl9tYXhsaW5lLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZWxlY3RfYnJvd3Nlcl9saW5lIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NlbGVjdF9icm93c2VyX2xpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NlbGVjdF9icm93c2VyX2xpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlc2VsZWN0X2Jyb3dzZXJfbGluZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9kZXNlbGVjdF9icm93c2VyX2xpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX2Rlc2VsZWN0X2Jyb3dzZXJfbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVzZWxlY3RfYnJvd3NlciAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gZ2VuZXJpY19jYWxsIChnLCBmbF9kZXNlbGVjdF9icm93c2VyKTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsIChnLCBmbF9kZXNlbGVjdF9icm93c2VyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGlzc2VsZWN0ZWRfYnJvd3Nlcl9saW5lIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaSwgajsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmkpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlqID0gZmxfaXNzZWxlY3RlZF9icm93c2VyX2xpbmUgKGctPm9iX2dlbmVyaWMsIGkpOwotCQotCXJldHVybiBQeUludF9Gcm9tTG9uZyAoaik7CisgICAgaW50IGksIGo7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGogPSBmbF9pc3NlbGVjdGVkX2Jyb3dzZXJfbGluZSAoZy0+b2JfZ2VuZXJpYywgaSk7CisKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcgKGopOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2Jyb3dzZXIgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9icm93c2VyLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9icm93c2VyLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfYnJvd3Nlcl9mb250c2l6ZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfYnJvd3Nlcl9mb250c2l6ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X2Jyb3dzZXJfZm9udHNpemUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9icm93c2VyX2ZvbnRzdHlsZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfYnJvd3Nlcl9mb250c3R5bGUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9icm93c2VyX2ZvbnRzdHlsZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2Jyb3dzZXJfc3BlY2lhbGtleSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5jKGZsX3NldF9icm93c2VyX3NwZWNpYWxrZXksIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmMoZmxfc2V0X2Jyb3dzZXJfc3BlY2lhbGtleSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgYnJvd3Nlcl9tZXRob2RzW10gPSB7Ci0JeyJzZXRfYnJvd3Nlcl90b3BsaW5lIiwJCShQeUNGdW5jdGlvbilzZXRfYnJvd3Nlcl90b3BsaW5lLAotCSBNRVRIX09MREFSR1N9LAotCXsiY2xlYXJfYnJvd3NlciIsCQkoUHlDRnVuY3Rpb24pY2xlYXJfYnJvd3NlciwKLQkgTUVUSF9OT0FSR1N9LAotCXsiYWRkX2Jyb3dzZXJfbGluZSIsCQkoUHlDRnVuY3Rpb24pYWRkX2Jyb3dzZXJfbGluZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImFkZHRvX2Jyb3dzZXIiLAkJKFB5Q0Z1bmN0aW9uKWFkZHRvX2Jyb3dzZXIsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJpbnNlcnRfYnJvd3Nlcl9saW5lIiwJCShQeUNGdW5jdGlvbilpbnNlcnRfYnJvd3Nlcl9saW5lLAotCSBNRVRIX09MREFSR1N9LAotCXsiZGVsZXRlX2Jyb3dzZXJfbGluZSIsCQkoUHlDRnVuY3Rpb24pZGVsZXRlX2Jyb3dzZXJfbGluZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7InJlcGxhY2VfYnJvd3Nlcl9saW5lIiwJKFB5Q0Z1bmN0aW9uKXJlcGxhY2VfYnJvd3Nlcl9saW5lLAotCSBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2Jyb3dzZXJfbGluZSIsCQkoUHlDRnVuY3Rpb24pZ2V0X2Jyb3dzZXJfbGluZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImxvYWRfYnJvd3NlciIsCQkoUHlDRnVuY3Rpb24pbG9hZF9icm93c2VyLAotCSBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2Jyb3dzZXJfbWF4bGluZSIsCQkoUHlDRnVuY3Rpb24pZ2V0X2Jyb3dzZXJfbWF4bGluZSwKLQkgTUVUSF9OT0FSR1MsfQotCXsic2VsZWN0X2Jyb3dzZXJfbGluZSIsCQkoUHlDRnVuY3Rpb24pc2VsZWN0X2Jyb3dzZXJfbGluZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImRlc2VsZWN0X2Jyb3dzZXJfbGluZSIsCShQeUNGdW5jdGlvbilkZXNlbGVjdF9icm93c2VyX2xpbmUsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJkZXNlbGVjdF9icm93c2VyIiwJCShQeUNGdW5jdGlvbilkZXNlbGVjdF9icm93c2VyLAotCSBNRVRIX05PQVJHUyx9Ci0JeyJpc3NlbGVjdGVkX2Jyb3dzZXJfbGluZSIsCShQeUNGdW5jdGlvbilpc3NlbGVjdGVkX2Jyb3dzZXJfbGluZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9icm93c2VyIiwJCQkoUHlDRnVuY3Rpb24pZ2V0X2Jyb3dzZXIsCi0JIE1FVEhfTk9BUkdTLH0KLQl7InNldF9icm93c2VyX2ZvbnRzaXplIiwJKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX2ZvbnRzaXplLAotCSBNRVRIX09MREFSR1N9LAotCXsic2V0X2Jyb3dzZXJfZm9udHN0eWxlIiwJKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX2ZvbnRzdHlsZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7InNldF9icm93c2VyX3NwZWNpYWxrZXkiLAkoUHlDRnVuY3Rpb24pc2V0X2Jyb3dzZXJfc3BlY2lhbGtleSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzZXRfYnJvd3Nlcl90b3BsaW5lIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX3RvcGxpbmUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjbGVhcl9icm93c2VyIiwgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWNsZWFyX2Jyb3dzZXIsCisgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImFkZF9icm93c2VyX2xpbmUiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWRkX2Jyb3dzZXJfbGluZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFkZHRvX2Jyb3dzZXIiLCAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWRkdG9fYnJvd3NlciwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imluc2VydF9icm93c2VyX2xpbmUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24paW5zZXJ0X2Jyb3dzZXJfbGluZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRlbGV0ZV9icm93c2VyX2xpbmUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVsZXRlX2Jyb3dzZXJfbGluZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlcGxhY2VfYnJvd3Nlcl9saW5lIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pcmVwbGFjZV9icm93c2VyX2xpbmUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfYnJvd3Nlcl9saW5lIiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9icm93c2VyX2xpbmUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsb2FkX2Jyb3dzZXIiLCAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxvYWRfYnJvd3NlciwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9icm93c2VyX21heGxpbmUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2Jyb3dzZXJfbWF4bGluZSwKKyAgICAgTUVUSF9OT0FSR1MsfQorICAgIHsic2VsZWN0X2Jyb3dzZXJfbGluZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZWxlY3RfYnJvd3Nlcl9saW5lLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVzZWxlY3RfYnJvd3Nlcl9saW5lIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilkZXNlbGVjdF9icm93c2VyX2xpbmUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZXNlbGVjdF9icm93c2VyIiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlc2VsZWN0X2Jyb3dzZXIsCisgICAgIE1FVEhfTk9BUkdTLH0KKyAgICB7Imlzc2VsZWN0ZWRfYnJvd3Nlcl9saW5lIiwgICAgICAgICAoUHlDRnVuY3Rpb24paXNzZWxlY3RlZF9icm93c2VyX2xpbmUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfYnJvd3NlciIsICAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9icm93c2VyLAorICAgICBNRVRIX05PQVJHUyx9CisgICAgeyJzZXRfYnJvd3Nlcl9mb250c2l6ZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX2ZvbnRzaXplLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2Jyb3dzZXJfZm9udHN0eWxlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfYnJvd3Nlcl9mb250c3R5bGUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfYnJvd3Nlcl9zcGVjaWFsa2V5IiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX3NwZWNpYWxrZXksCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBDbGFzczogYnV0dG9uICovCkBAIC03NDUsMzMgKzc0NSwzMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9idXR0b24oZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfYnV0dG9uLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfYnV0dG9uLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfYnV0dG9uKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9idXR0b24sIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X2J1dHRvbiwgZy0+IG9iX2dlbmVyaWMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2J1dHRvbl9udW1iKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9idXR0b25fbnVtYiwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JpIChmbF9nZXRfYnV0dG9uX251bWIsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9idXR0b25fc2hvcnRjdXQoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX3NldF9idXR0b25fc2hvcnRjdXQsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfc2V0X2J1dHRvbl9zaG9ydGN1dCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgYnV0dG9uX21ldGhvZHNbXSA9IHsKLQl7InNldF9idXR0b24iLAkJKFB5Q0Z1bmN0aW9uKXNldF9idXR0b24sIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfYnV0dG9uIiwJCShQeUNGdW5jdGlvbilnZXRfYnV0dG9uLCBNRVRIX05PQVJHU30sCi0JeyJnZXRfYnV0dG9uX251bWIiLAkoUHlDRnVuY3Rpb24pZ2V0X2J1dHRvbl9udW1iLCBNRVRIX05PQVJHU30sCi0JeyJzZXRfYnV0dG9uX3Nob3J0Y3V0IiwJKFB5Q0Z1bmN0aW9uKXNldF9idXR0b25fc2hvcnRjdXQsIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzZXRfYnV0dG9uIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfYnV0dG9uLCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X2J1dHRvbiIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2J1dHRvbiwgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0X2J1dHRvbl9udW1iIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2J1dHRvbl9udW1iLCBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfYnV0dG9uX3Nob3J0Y3V0IiwgICAgIChQeUNGdW5jdGlvbilzZXRfYnV0dG9uX3Nob3J0Y3V0LCBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIENsYXNzOiBjaG9pY2UgKi8KQEAgLTc3OSw2OCArNzc5LDY4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2Nob2ljZShnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9jaG9pY2UsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9jaG9pY2UsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9jaG9pY2UoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X2Nob2ljZSwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JpIChmbF9nZXRfY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGVhcl9jaG9pY2UgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfY2FsbCAoZywgZmxfY2xlYXJfY2hvaWNlKTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsIChnLCBmbF9jbGVhcl9jaG9pY2UpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWRkdG9fY2hvaWNlIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfYWRkdG9fY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX2FkZHRvX2Nob2ljZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVwbGFjZV9jaG9pY2UgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaUlOc3RyIChmbF9yZXBsYWNlX2Nob2ljZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaUlOc3RyIChmbF9yZXBsYWNlX2Nob2ljZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsZXRlX2Nob2ljZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9kZWxldGVfY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9kZWxldGVfY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY2hvaWNlX3RleHQgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUnN0ciAoZmxfZ2V0X2Nob2ljZV90ZXh0LCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUnN0ciAoZmxfZ2V0X2Nob2ljZV90ZXh0LCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY2hvaWNlX2ZvbnRzaXplIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9jaG9pY2VfZm9udHNpemUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9jaG9pY2VfZm9udHNpemUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9jaG9pY2VfZm9udHN0eWxlIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9jaG9pY2VfZm9udHN0eWxlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfY2hvaWNlX2ZvbnRzdHlsZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY2hvaWNlX21ldGhvZHNbXSA9IHsKLQl7InNldF9jaG9pY2UiLAkJKFB5Q0Z1bmN0aW9uKXNldF9jaG9pY2UsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9jaG9pY2UiLAkJKFB5Q0Z1bmN0aW9uKWdldF9jaG9pY2UsICAgICAgTUVUSF9OT0FSR1N9LAotCXsiY2xlYXJfY2hvaWNlIiwJKFB5Q0Z1bmN0aW9uKWNsZWFyX2Nob2ljZSwgICAgTUVUSF9OT0FSR1N9LAotCXsiYWRkdG9fY2hvaWNlIiwJKFB5Q0Z1bmN0aW9uKWFkZHRvX2Nob2ljZSwgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlcGxhY2VfY2hvaWNlIiwJKFB5Q0Z1bmN0aW9uKXJlcGxhY2VfY2hvaWNlLCAgTUVUSF9PTERBUkdTfSwKLQl7ImRlbGV0ZV9jaG9pY2UiLAkoUHlDRnVuY3Rpb24pZGVsZXRlX2Nob2ljZSwgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2Nob2ljZV90ZXh0IiwJKFB5Q0Z1bmN0aW9uKWdldF9jaG9pY2VfdGV4dCwgTUVUSF9OT0FSR1N9LAotCXsic2V0X2Nob2ljZV9mb250c2l6ZSIsIChQeUNGdW5jdGlvbilzZXRfY2hvaWNlX2ZvbnRzaXplLCBNRVRIX09MREFSR1N9LAotCXsic2V0X2Nob2ljZV9mb250c3R5bGUiLChQeUNGdW5jdGlvbilzZXRfY2hvaWNlX2ZvbnRzdHlsZSwgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9jaG9pY2UiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9jaG9pY2UsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9jaG9pY2UiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9jaG9pY2UsICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiY2xlYXJfY2hvaWNlIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pY2xlYXJfY2hvaWNlLCAgICBNRVRIX05PQVJHU30sCisgICAgeyJhZGR0b19jaG9pY2UiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhZGR0b19jaG9pY2UsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJyZXBsYWNlX2Nob2ljZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilyZXBsYWNlX2Nob2ljZSwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZWxldGVfY2hvaWNlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilkZWxldGVfY2hvaWNlLCAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfY2hvaWNlX3RleHQiLCAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfY2hvaWNlX3RleHQsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9jaG9pY2VfZm9udHNpemUiLCAoUHlDRnVuY3Rpb24pc2V0X2Nob2ljZV9mb250c2l6ZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9jaG9pY2VfZm9udHN0eWxlIiwoUHlDRnVuY3Rpb24pc2V0X2Nob2ljZV9mb250c3R5bGUsIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogQ2xhc3MgOiBDbG9jayAqLwpAQCAtODQ4LDE2ICs4NDgsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY2xvY2soZ2VuZXJpY29iamVjdCAqZykKIHsKLQlpbnQgaTAsIGkxLCBpMjsKKyAgICBpbnQgaTAsIGkxLCBpMjsKIAotCWZsX2dldF9jbG9jayAoZy0+b2JfZ2VuZXJpYywgJmkwLCAmaTEsICZpMik7CisgICAgZmxfZ2V0X2Nsb2NrIChnLT5vYl9nZW5lcmljLCAmaTAsICZpMSwgJmkyKTsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsIGkwLCBpMSwgaTIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsIGkwLCBpMSwgaTIpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY2xvY2tfbWV0aG9kc1tdID0gewotCXsiZ2V0X2Nsb2NrIiwJCShQeUNGdW5jdGlvbilnZXRfY2xvY2ssIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImdldF9jbG9jayIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9jbG9jaywgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIENMYXNzIDogQ291bnRlcnMgKi8KQEAgLTg2NSw1MyArODY1LDUzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2NvdW50ZXJfdmFsdWUoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X2NvdW50ZXJfdmFsdWUsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X2NvdW50ZXJfdmFsdWUsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9jb3VudGVyX3ZhbHVlIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9jb3VudGVyX3ZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfY291bnRlcl92YWx1ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NvdW50ZXJfcHJlY2lzaW9uIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9jb3VudGVyX3ByZWNpc2lvbiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2NvdW50ZXJfcHJlY2lzaW9uLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY291bnRlcl9ib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X2NvdW50ZXJfYm91bmRzLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfY291bnRlcl9ib3VuZHMsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9jb3VudGVyX3N0ZXAgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X2NvdW50ZXJfc3RlcCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X2NvdW50ZXJfc3RlcCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NvdW50ZXJfcmV0dXJuIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9jb3VudGVyX3JldHVybiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2NvdW50ZXJfcmV0dXJuLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjb3VudGVyX21ldGhvZHNbXSA9IHsKLQl7InNldF9jb3VudGVyX3ZhbHVlIiwJCShQeUNGdW5jdGlvbilzZXRfY291bnRlcl92YWx1ZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9jb3VudGVyX3ZhbHVlIiwJCShQeUNGdW5jdGlvbilnZXRfY291bnRlcl92YWx1ZSwKLQkgTUVUSF9OT0FSR1N9LAotCXsic2V0X2NvdW50ZXJfYm91bmRzIiwJCShQeUNGdW5jdGlvbilzZXRfY291bnRlcl9ib3VuZHMsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfY291bnRlcl9zdGVwIiwJCShQeUNGdW5jdGlvbilzZXRfY291bnRlcl9zdGVwLAotCSBNRVRIX09MREFSR1N9LAotCXsic2V0X2NvdW50ZXJfcHJlY2lzaW9uIiwJKFB5Q0Z1bmN0aW9uKXNldF9jb3VudGVyX3ByZWNpc2lvbiwKLQkgTUVUSF9PTERBUkdTfSwKLQl7InNldF9jb3VudGVyX3JldHVybiIsCQkoUHlDRnVuY3Rpb24pc2V0X2NvdW50ZXJfcmV0dXJuLAotCSBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9jb3VudGVyX3ZhbHVlIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2NvdW50ZXJfdmFsdWUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfY291bnRlcl92YWx1ZSIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9jb3VudGVyX3ZhbHVlLAorICAgICBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfY291bnRlcl9ib3VuZHMiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9jb3VudGVyX2JvdW5kcywKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9jb3VudGVyX3N0ZXAiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2NvdW50ZXJfc3RlcCwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9jb3VudGVyX3ByZWNpc2lvbiIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2NvdW50ZXJfcHJlY2lzaW9uLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2NvdW50ZXJfcmV0dXJuIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfY291bnRlcl9yZXR1cm4sCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTkyMCw0MCArOTIwLDQwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2RpYWxfdmFsdWUoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X2RpYWxfdmFsdWUsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X2RpYWxfdmFsdWUsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9kaWFsX3ZhbHVlIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9kaWFsX3ZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfZGlhbF92YWx1ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2RpYWxfYm91bmRzIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmZJTmYgKGZsX3NldF9kaWFsX2JvdW5kcywgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X2RpYWxfYm91bmRzLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfZGlhbF9ib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfT1VUZk9VVGYgKGZsX2dldF9kaWFsX2JvdW5kcywgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX09VVGZPVVRmIChmbF9nZXRfZGlhbF9ib3VuZHMsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9kaWFsX3N0ZXAgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X2RpYWxfc3RlcCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X2RpYWxfc3RlcCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGlhbF9tZXRob2RzW10gPSB7Ci0JeyJzZXRfZGlhbF92YWx1ZSIsCShQeUNGdW5jdGlvbilzZXRfZGlhbF92YWx1ZSwgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfZGlhbF92YWx1ZSIsCShQeUNGdW5jdGlvbilnZXRfZGlhbF92YWx1ZSwgIE1FVEhfTk9BUkdTfSwKLQl7InNldF9kaWFsX2JvdW5kcyIsCShQeUNGdW5jdGlvbilzZXRfZGlhbF9ib3VuZHMsIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfZGlhbF9ib3VuZHMiLAkoUHlDRnVuY3Rpb24pZ2V0X2RpYWxfYm91bmRzLCBNRVRIX05PQVJHU30sCi0JeyJzZXRfZGlhbF9zdGVwIiwJKFB5Q0Z1bmN0aW9uKXNldF9kaWFsX3N0ZXAsICAgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9kaWFsX3ZhbHVlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9kaWFsX3ZhbHVlLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9kaWFsX3ZhbHVlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9kaWFsX3ZhbHVlLCAgTUVUSF9OT0FSR1N9LAorICAgIHsic2V0X2RpYWxfYm91bmRzIiwgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2RpYWxfYm91bmRzLCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X2RpYWxfYm91bmRzIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2RpYWxfYm91bmRzLCBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfZGlhbF9zdGVwIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfZGlhbF9zdGVwLCAgIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogQ2xhc3MgOiBJbnB1dCAqLwpAQCAtOTYxLDMzICs5NjEsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaW5wdXQgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9zZXRfaW5wdXQsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfc2V0X2lucHV0LCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfaW5wdXQgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUnN0ciAoZmxfZ2V0X2lucHV0LCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUnN0ciAoZmxfZ2V0X2lucHV0LCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaW5wdXRfY29sb3IgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X2lucHV0X2NvbG9yLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfaW5wdXRfY29sb3IsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pbnB1dF9yZXR1cm4gKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2lucHV0X3JldHVybiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2lucHV0X3JldHVybiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgaW5wdXRfbWV0aG9kc1tdID0gewotCXsic2V0X2lucHV0IiwJCShQeUNGdW5jdGlvbilzZXRfaW5wdXQsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2lucHV0IiwJCShQeUNGdW5jdGlvbilnZXRfaW5wdXQsICAgICAgICBNRVRIX05PQVJHU30sCi0JeyJzZXRfaW5wdXRfY29sb3IiLAkoUHlDRnVuY3Rpb24pc2V0X2lucHV0X2NvbG9yLCAgTUVUSF9PTERBUkdTfSwKLQl7InNldF9pbnB1dF9yZXR1cm4iLAkoUHlDRnVuY3Rpb24pc2V0X2lucHV0X3JldHVybiwgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9pbnB1dCIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pbnB1dCwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfaW5wdXQiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfaW5wdXQsICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfaW5wdXRfY29sb3IiLCAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfaW5wdXRfY29sb3IsICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2lucHV0X3JldHVybiIsICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2lucHV0X3JldHVybiwgTUVUSF9PTERBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTk5NiwzNSArOTk2LDM1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X21lbnUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9zZXRfbWVudSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9zZXRfbWVudSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X21lbnUgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JLyogWFhYIHN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXMgd3Jvbmcgc2luY2UgZmxfZ2V0X21lbnUKLQkgICBYWFggcmV0dXJucyBsb25nLCBub3QgaW50ICovCi0JcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9tZW51LCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgLyogWFhYIHN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXMgd3Jvbmcgc2luY2UgZmxfZ2V0X21lbnUKKyAgICAgICBYWFggcmV0dXJucyBsb25nLCBub3QgaW50ICovCisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9tZW51LCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfbWVudV90ZXh0IChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JzdHIgKGZsX2dldF9tZW51X3RleHQsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19Sc3RyIChmbF9nZXRfbWVudV90ZXh0LCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhZGR0b19tZW51IChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfYWRkdG9fbWVudSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9hZGR0b19tZW51LCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtZW51X21ldGhvZHNbXSA9IHsKLQl7InNldF9tZW51IiwJCShQeUNGdW5jdGlvbilzZXRfbWVudSwgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0X21lbnUiLAkJKFB5Q0Z1bmN0aW9uKWdldF9tZW51LCAgICAgIE1FVEhfTk9BUkdTfSwKLQl7ImdldF9tZW51X3RleHQiLAkoUHlDRnVuY3Rpb24pZ2V0X21lbnVfdGV4dCwgTUVUSF9OT0FSR1N9LAotCXsiYWRkdG9fbWVudSIsCQkoUHlDRnVuY3Rpb24pYWRkdG9fbWVudSwgICAgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9tZW51IiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9tZW51LCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfbWVudSIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfbWVudSwgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnZXRfbWVudV90ZXh0IiwgICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfbWVudV90ZXh0LCBNRVRIX05PQVJHU30sCisgICAgeyJhZGR0b19tZW51IiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhZGR0b19tZW51LCAgICBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtMTAzMywxMzIgKzEwMzMsMTMyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3NsaWRlcl92YWx1ZShnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfc2xpZGVyX3ZhbHVlLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUmYgKGZsX2dldF9zbGlkZXJfdmFsdWUsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9zbGlkZXJfdmFsdWUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3NsaWRlcl92YWx1ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3NsaWRlcl92YWx1ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3NsaWRlcl9ib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X3NsaWRlcl9ib3VuZHMsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmZJTmYgKGZsX3NldF9zbGlkZXJfYm91bmRzLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfc2xpZGVyX2JvdW5kcyAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19PVVRmT1VUZihmbF9nZXRfc2xpZGVyX2JvdW5kcywgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX09VVGZPVVRmKGZsX2dldF9zbGlkZXJfYm91bmRzLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfc2xpZGVyX3JldHVybiAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfc2xpZGVyX3JldHVybiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3NsaWRlcl9yZXR1cm4sIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9zbGlkZXJfc2l6ZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfc2xpZGVyX3NpemUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9zbGlkZXJfc2l6ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3NsaWRlcl9wcmVjaXNpb24gKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X3NsaWRlcl9wcmVjaXNpb24sIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9zbGlkZXJfcHJlY2lzaW9uLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfc2xpZGVyX3N0ZXAgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3NsaWRlcl9zdGVwLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfc2xpZGVyX3N0ZXAsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogCiBzdGF0aWMgUHlNZXRob2REZWYgc2xpZGVyX21ldGhvZHNbXSA9IHsKLQl7InNldF9zbGlkZXJfdmFsdWUiLAkoUHlDRnVuY3Rpb24pc2V0X3NsaWRlcl92YWx1ZSwgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfc2xpZGVyX3ZhbHVlIiwJKFB5Q0Z1bmN0aW9uKWdldF9zbGlkZXJfdmFsdWUsICBNRVRIX05PQVJHU30sCi0JeyJzZXRfc2xpZGVyX2JvdW5kcyIsCShQeUNGdW5jdGlvbilzZXRfc2xpZGVyX2JvdW5kcywgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9zbGlkZXJfYm91bmRzIiwJKFB5Q0Z1bmN0aW9uKWdldF9zbGlkZXJfYm91bmRzLCBNRVRIX05PQVJHU30sCi0JeyJzZXRfc2xpZGVyX3JldHVybiIsCShQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3JldHVybiwgTUVUSF9PTERBUkdTfSwKLQl7InNldF9zbGlkZXJfc2l6ZSIsCShQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3NpemUsICAgTUVUSF9PTERBUkdTfSwKLQl7InNldF9zbGlkZXJfcHJlY2lzaW9uIiwoUHlDRnVuY3Rpb24pc2V0X3NsaWRlcl9wcmVjaXNpb24sIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfc2xpZGVyX3N0ZXAiLAkoUHlDRnVuY3Rpb24pc2V0X3NsaWRlcl9zdGVwLCAgIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzZXRfc2xpZGVyX3ZhbHVlIiwgICAgICAgIChQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3ZhbHVlLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9zbGlkZXJfdmFsdWUiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9zbGlkZXJfdmFsdWUsICBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfc2xpZGVyX2JvdW5kcyIsICAgICAgIChQeUNGdW5jdGlvbilzZXRfc2xpZGVyX2JvdW5kcywgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9zbGlkZXJfYm91bmRzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9zbGlkZXJfYm91bmRzLCBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfc2xpZGVyX3JldHVybiIsICAgICAgIChQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3JldHVybiwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9zbGlkZXJfc2l6ZSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9zbGlkZXJfc2l6ZSwgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X3NsaWRlcl9wcmVjaXNpb24iLChQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3ByZWNpc2lvbiwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9zbGlkZXJfc3RlcCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9zbGlkZXJfc3RlcCwgICBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcG9zaXRpb25lcl94dmFsdWUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3Bvc2l0aW9uZXJfeHZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfcG9zaXRpb25lcl94dmFsdWUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9wb3NpdGlvbmVyX3hib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X3Bvc2l0aW9uZXJfeGJvdW5kcywKLQkJCQkgIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmZJTmYgKGZsX3NldF9wb3NpdGlvbmVyX3hib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcG9zaXRpb25lcl95dmFsdWUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3Bvc2l0aW9uZXJfeXZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfcG9zaXRpb25lcl95dmFsdWUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9wb3NpdGlvbmVyX3lib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X3Bvc2l0aW9uZXJfeWJvdW5kcywKLQkJCQkgIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmZJTmYgKGZsX3NldF9wb3NpdGlvbmVyX3lib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcG9zaXRpb25lcl94dmFsdWUgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUmYgKGZsX2dldF9wb3NpdGlvbmVyX3h2YWx1ZSwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfcG9zaXRpb25lcl94dmFsdWUsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9wb3NpdGlvbmVyX3hib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfT1VUZk9VVGYgKGZsX2dldF9wb3NpdGlvbmVyX3hib3VuZHMsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19PVVRmT1VUZiAoZmxfZ2V0X3Bvc2l0aW9uZXJfeGJvdW5kcywgZy0+IG9iX2dlbmVyaWMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3Bvc2l0aW9uZXJfeXZhbHVlIChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfcG9zaXRpb25lcl95dmFsdWUsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X3Bvc2l0aW9uZXJfeXZhbHVlLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcG9zaXRpb25lcl95Ym91bmRzIChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX09VVGZPVVRmIChmbF9nZXRfcG9zaXRpb25lcl95Ym91bmRzLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfT1VUZk9VVGYgKGZsX2dldF9wb3NpdGlvbmVyX3lib3VuZHMsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHBvc2l0aW9uZXJfbWV0aG9kc1tdID0gewotCXsic2V0X3Bvc2l0aW9uZXJfeHZhbHVlIiwJKFB5Q0Z1bmN0aW9uKXNldF9wb3NpdGlvbmVyX3h2YWx1ZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7InNldF9wb3NpdGlvbmVyX3l2YWx1ZSIsCShQeUNGdW5jdGlvbilzZXRfcG9zaXRpb25lcl95dmFsdWUsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfcG9zaXRpb25lcl94Ym91bmRzIiwJKFB5Q0Z1bmN0aW9uKXNldF9wb3NpdGlvbmVyX3hib3VuZHMsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfcG9zaXRpb25lcl95Ym91bmRzIiwJKFB5Q0Z1bmN0aW9uKXNldF9wb3NpdGlvbmVyX3lib3VuZHMsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfcG9zaXRpb25lcl94dmFsdWUiLAkoUHlDRnVuY3Rpb24pZ2V0X3Bvc2l0aW9uZXJfeHZhbHVlLAotCSBNRVRIX05PQVJHU30sCi0JeyJnZXRfcG9zaXRpb25lcl95dmFsdWUiLAkoUHlDRnVuY3Rpb24pZ2V0X3Bvc2l0aW9uZXJfeXZhbHVlLAotCSBNRVRIX05PQVJHU30sCi0JeyJnZXRfcG9zaXRpb25lcl94Ym91bmRzIiwJKFB5Q0Z1bmN0aW9uKWdldF9wb3NpdGlvbmVyX3hib3VuZHMsCi0JIE1FVEhfTk9BUkdTfSwKLQl7ImdldF9wb3NpdGlvbmVyX3lib3VuZHMiLAkoUHlDRnVuY3Rpb24pZ2V0X3Bvc2l0aW9uZXJfeWJvdW5kcywKLQkgTUVUSF9OT0FSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsic2V0X3Bvc2l0aW9uZXJfeHZhbHVlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfcG9zaXRpb25lcl94dmFsdWUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfcG9zaXRpb25lcl95dmFsdWUiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9wb3NpdGlvbmVyX3l2YWx1ZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9wb3NpdGlvbmVyX3hib3VuZHMiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3Bvc2l0aW9uZXJfeGJvdW5kcywKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9wb3NpdGlvbmVyX3lib3VuZHMiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3Bvc2l0aW9uZXJfeWJvdW5kcywKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9wb3NpdGlvbmVyX3h2YWx1ZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X3Bvc2l0aW9uZXJfeHZhbHVlLAorICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnZXRfcG9zaXRpb25lcl95dmFsdWUiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9wb3NpdGlvbmVyX3l2YWx1ZSwKKyAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0X3Bvc2l0aW9uZXJfeGJvdW5kcyIsICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfcG9zaXRpb25lcl94Ym91bmRzLAorICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnZXRfcG9zaXRpb25lcl95Ym91bmRzIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9wb3NpdGlvbmVyX3lib3VuZHMsCisgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBDbGFzcyB0aW1lciAqLwpAQCAtMTE2NiwyNiArMTE2NiwyNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF90aW1lciAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfdGltZXIsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF90aW1lciwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3RpbWVyIChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfdGltZXIsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X3RpbWVyLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0aW1lcl9tZXRob2RzW10gPSB7Ci0JeyJzZXRfdGltZXIiLAkJKFB5Q0Z1bmN0aW9uKXNldF90aW1lciwgTUVUSF9PTERBUkdTfSwKLQl7ImdldF90aW1lciIsCQkoUHlDRnVuY3Rpb24pZ2V0X3RpbWVyLCBNRVRIX05PQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzZXRfdGltZXIiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfdGltZXIsIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfdGltZXIiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfdGltZXIsIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBGb3JtIG9iamVjdHMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlGTF9GT1JNICpvYl9mb3JtOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGTF9GT1JNICpvYl9mb3JtOwogfSBmb3Jtb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZvcm10eXBlOwpAQCAtMTE5NSwzNzEgKzExOTUsMzcxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9zaG93X2Zvcm0oZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHBsYWNlLCBib3JkZXI7Ci0JY2hhciAqbmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlzKSIsICZwbGFjZSwgJmJvcmRlciwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlmbF9zaG93X2Zvcm0oZi0+b2JfZm9ybSwgcGxhY2UsIGJvcmRlciwgbmFtZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGludCBwbGFjZSwgYm9yZGVyOworICAgIGNoYXIgKm5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpcykiLCAmcGxhY2UsICZib3JkZXIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmxfc2hvd19mb3JtKGYtPm9iX2Zvcm0sIHBsYWNlLCBib3JkZXIsIG5hbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fY2FsbCh2b2lkICgqZnVuYykoRkxfRk9STSAqKSwgRkxfRk9STSAqZikKIHsKLQkoKmZ1bmMpKGYpOworICAgICgqZnVuYykoZik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9jYWxsX0lOaUlOaSh2b2lkICgqZnVuYykoRkxfRk9STSAqLCBpbnQsIGludCksIEZMX0ZPUk0gKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBhLCBiOworICAgIGludCBhLCBiOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZhLCAmYikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmYSwgJmIpKSByZXR1cm4gTlVMTDsKIAotCSgqZnVuYykoZiwgYSwgYik7CisgICAgKCpmdW5jKShmLCBhLCBiKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2NhbGxfSU5mSU5mKHZvaWQgKCpmdW5jKShGTF9GT1JNICosIGZsb2F0LCBmbG9hdCksIEZMX0ZPUk0gKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGEsIGI7CisgICAgZmxvYXQgYSwgYjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihmZikiLCAmYSwgJmIpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoZmYpIiwgJmEsICZiKSkgcmV0dXJuIE5VTEw7CiAKLQkoKmZ1bmMpKGYsIGEsIGIpOworICAgICgqZnVuYykoZiwgYSwgYik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9oaWRlX2Zvcm0oZm9ybW9iamVjdCAqZikKIHsKLQlyZXR1cm4gZm9ybV9jYWxsKGZsX2hpZGVfZm9ybSwgZi0+IG9iX2Zvcm0pOworICAgIHJldHVybiBmb3JtX2NhbGwoZmxfaGlkZV9mb3JtLCBmLT4gb2JfZm9ybSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3JlZHJhd19mb3JtKGZvcm1vYmplY3QgKmYpCiB7Ci0JcmV0dXJuIGZvcm1fY2FsbChmbF9yZWRyYXdfZm9ybSwgZi0+IG9iX2Zvcm0pOworICAgIHJldHVybiBmb3JtX2NhbGwoZmxfcmVkcmF3X2Zvcm0sIGYtPiBvYl9mb3JtKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fc2V0X2Zvcm1fcG9zaXRpb24oZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGZvcm1fY2FsbF9JTmlJTmkoZmxfc2V0X2Zvcm1fcG9zaXRpb24sIGYtPiBvYl9mb3JtLCBhcmdzKTsKKyAgICByZXR1cm4gZm9ybV9jYWxsX0lOaUlOaShmbF9zZXRfZm9ybV9wb3NpdGlvbiwgZi0+IG9iX2Zvcm0sIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9zZXRfZm9ybV9zaXplKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBmb3JtX2NhbGxfSU5pSU5pKGZsX3NldF9mb3JtX3NpemUsIGYtPiBvYl9mb3JtLCBhcmdzKTsKKyAgICByZXR1cm4gZm9ybV9jYWxsX0lOaUlOaShmbF9zZXRfZm9ybV9zaXplLCBmLT4gb2JfZm9ybSwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3NjYWxlX2Zvcm0oZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGZvcm1fY2FsbF9JTmZJTmYoZmxfc2NhbGVfZm9ybSwgZi0+IG9iX2Zvcm0sIGFyZ3MpOworICAgIHJldHVybiBmb3JtX2NhbGxfSU5mSU5mKGZsX3NjYWxlX2Zvcm0sIGYtPiBvYl9mb3JtLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfYWRkX29iamVjdChmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncywgRkxfT0JKRUNUICooKmZ1bmMpKGludCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGNoYXIqKSwgUHlNZXRob2REZWYgKmludGVybmFsX21ldGhvZHMpCiB7Ci0JaW50IHR5cGU7Ci0JZmxvYXQgeCwgeSwgdywgaDsKLQljaGFyICpuYW1lOwotCUZMX09CSkVDVCAqb2JqOworICAgIGludCB0eXBlOworICAgIGZsb2F0IHgsIHksIHcsIGg7CisgICAgY2hhciAqbmFtZTsKKyAgICBGTF9PQkpFQ1QgKm9iajsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywiKGlmZmZmcykiLCAmdHlwZSwmeCwmeSwmdywmaCwmbmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywiKGlmZmZmcykiLCAmdHlwZSwmeCwmeSwmdywmaCwmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZmxfYWRkdG9fZm9ybSAoZi0+IG9iX2Zvcm0pOworICAgIGZsX2FkZHRvX2Zvcm0gKGYtPiBvYl9mb3JtKTsKIAotCW9iaiA9ICgqZnVuYykgKHR5cGUsIHgsIHksIHcsIGgsIG5hbWUpOworICAgIG9iaiA9ICgqZnVuYykgKHR5cGUsIHgsIHksIHcsIGgsIG5hbWUpOwogCi0JZmxfZW5kX2Zvcm0oKTsKKyAgICBmbF9lbmRfZm9ybSgpOwogCi0JaWYgKG9iaiA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG5ld2dlbmVyaWNvYmplY3QgKG9iaiwgaW50ZXJuYWxfbWV0aG9kcyk7CisgICAgcmV0dXJuIG5ld2dlbmVyaWNvYmplY3QgKG9iaiwgaW50ZXJuYWxfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9idXR0b24oZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfYnV0dG9uLCBidXR0b25fbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfYnV0dG9uLCBidXR0b25fbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9saWdodGJ1dHRvbihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9saWdodGJ1dHRvbiwgYnV0dG9uX21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2xpZ2h0YnV0dG9uLCBidXR0b25fbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9yb3VuZGJ1dHRvbihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9yb3VuZGJ1dHRvbiwgYnV0dG9uX21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX3JvdW5kYnV0dG9uLCBidXR0b25fbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9tZW51IChmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9tZW51LCBtZW51X21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX21lbnUsIG1lbnVfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9zbGlkZXIoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfc2xpZGVyLCBzbGlkZXJfbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfc2xpZGVyLCBzbGlkZXJfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF92YWxzbGlkZXIoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfdmFsc2xpZGVyLCBzbGlkZXJfbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfdmFsc2xpZGVyLCBzbGlkZXJfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9kaWFsKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2RpYWwsIGRpYWxfbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfZGlhbCwgZGlhbF9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2NvdW50ZXIoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfY291bnRlciwgY291bnRlcl9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9jb3VudGVyLCBjb3VudGVyX21ldGhvZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9hZGRfY2xvY2soZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfY2xvY2ssIGNsb2NrX21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2Nsb2NrLCBjbG9ja19tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2JveChmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9ib3gsCi0JCQkJICAoUHlNZXRob2REZWYgKilOVUxMKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9ib3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlNZXRob2REZWYgKilOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2Nob2ljZShmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9jaG9pY2UsIGNob2ljZV9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9jaG9pY2UsIGNob2ljZV9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2Jyb3dzZXIoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfYnJvd3NlciwgYnJvd3Nlcl9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9icm93c2VyLCBicm93c2VyX21ldGhvZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9hZGRfcG9zaXRpb25lcihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9wb3NpdGlvbmVyLAotCQkJCSAgcG9zaXRpb25lcl9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9wb3NpdGlvbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25lcl9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2lucHV0KGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2lucHV0LCBpbnB1dF9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9pbnB1dCwgaW5wdXRfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF90ZXh0KGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX3RleHQsCi0JCQkJICAoUHlNZXRob2REZWYgKilOVUxMKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5TWV0aG9kRGVmICopTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF90aW1lcihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF90aW1lciwgdGltZXJfbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfdGltZXIsIHRpbWVyX21ldGhvZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9mcmVlemVfZm9ybShmb3Jtb2JqZWN0ICpmKQogewotCXJldHVybiBmb3JtX2NhbGwoZmxfZnJlZXplX2Zvcm0sIGYtPiBvYl9mb3JtKTsKKyAgICByZXR1cm4gZm9ybV9jYWxsKGZsX2ZyZWV6ZV9mb3JtLCBmLT4gb2JfZm9ybSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3VuZnJlZXplX2Zvcm0oZm9ybW9iamVjdCAqZikKIHsKLQlyZXR1cm4gZm9ybV9jYWxsKGZsX3VuZnJlZXplX2Zvcm0sIGYtPiBvYl9mb3JtKTsKKyAgICByZXR1cm4gZm9ybV9jYWxsKGZsX3VuZnJlZXplX2Zvcm0sIGYtPiBvYl9mb3JtKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWN0aXZhdGVfZm9ybShmb3Jtb2JqZWN0ICpmKQogewotCXJldHVybiBmb3JtX2NhbGwoZmxfYWN0aXZhdGVfZm9ybSwgZi0+IG9iX2Zvcm0pOworICAgIHJldHVybiBmb3JtX2NhbGwoZmxfYWN0aXZhdGVfZm9ybSwgZi0+IG9iX2Zvcm0pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9kZWFjdGl2YXRlX2Zvcm0oZm9ybW9iamVjdCAqZikKIHsKLQlyZXR1cm4gZm9ybV9jYWxsKGZsX2RlYWN0aXZhdGVfZm9ybSwgZi0+IG9iX2Zvcm0pOworICAgIHJldHVybiBmb3JtX2NhbGwoZmxfZGVhY3RpdmF0ZV9mb3JtLCBmLT4gb2JfZm9ybSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2Jnbl9ncm91cChmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlGTF9PQkpFQ1QgKm9iajsKKyAgICBGTF9PQkpFQ1QgKm9iajsKIAotCWZsX2FkZHRvX2Zvcm0oZi0+IG9iX2Zvcm0pOwotCW9iaiA9IGZsX2Jnbl9ncm91cCgpOwotCWZsX2VuZF9mb3JtKCk7CisgICAgZmxfYWRkdG9fZm9ybShmLT4gb2JfZm9ybSk7CisgICAgb2JqID0gZmxfYmduX2dyb3VwKCk7CisgICAgZmxfZW5kX2Zvcm0oKTsKIAotCWlmIChvYmogPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBuZXdnZW5lcmljb2JqZWN0IChvYmosIChQeU1ldGhvZERlZiAqKSBOVUxMKTsKKyAgICByZXR1cm4gbmV3Z2VuZXJpY29iamVjdCAob2JqLCAoUHlNZXRob2REZWYgKikgTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2VuZF9ncm91cChmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbF9hZGR0b19mb3JtKGYtPiBvYl9mb3JtKTsKLQlmbF9lbmRfZ3JvdXAoKTsKLQlmbF9lbmRfZm9ybSgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbF9hZGR0b19mb3JtKGYtPiBvYl9mb3JtKTsKKyAgICBmbF9lbmRfZ3JvdXAoKTsKKyAgICBmbF9lbmRfZm9ybSgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX2ZpbmRfZmlyc3Rfb3JfbGFzdChGTF9PQkpFQ1QgKigqZnVuYykoRkxfRk9STSAqLCBpbnQsIGZsb2F0LCBmbG9hdCksIGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0eXBlOwotCWZsb2F0IG14LCBteTsKLQlGTF9PQkpFQ1QgKmdlbmVyaWM7Ci0JZ2VuZXJpY29iamVjdCAqZzsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWZmKSIsICZ0eXBlLCAmbXgsICZteSkpIHJldHVybiBOVUxMOworICAgIGludCB0eXBlOworICAgIGZsb2F0IG14LCBteTsKKyAgICBGTF9PQkpFQ1QgKmdlbmVyaWM7CisgICAgZ2VuZXJpY29iamVjdCAqZzsKIAotCWdlbmVyaWMgPSAoKmZ1bmMpIChmLT4gb2JfZm9ybSwgdHlwZSwgbXgsIG15KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWZmKSIsICZ0eXBlLCAmbXgsICZteSkpIHJldHVybiBOVUxMOwogCi0JaWYgKGdlbmVyaWMgPT0gTlVMTCkKLQl7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIGdlbmVyaWMgPSAoKmZ1bmMpIChmLT4gb2JfZm9ybSwgdHlwZSwgbXgsIG15KTsKIAotCWcgPSBmaW5kZ2VuZXJpYyhnZW5lcmljKTsKLQlpZiAoZyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAiZm9ybXNfZmluZF97Zmlyc3R8bGFzdH0gcmV0dXJucyB1bmtub3duIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGcpOwotCXJldHVybiAoUHlPYmplY3QgKikgZzsKKyAgICBpZiAoZ2VuZXJpYyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisKKyAgICBnID0gZmluZGdlbmVyaWMoZ2VuZXJpYyk7CisgICAgaWYgKGcgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJmb3Jtc19maW5kX3tmaXJzdHxsYXN0fSByZXR1cm5zIHVua25vd24gb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBnOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9maW5kX2ZpcnN0KGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBmb3Jtc19maW5kX2ZpcnN0X29yX2xhc3QoZmxfZmluZF9maXJzdCwgZiwgYXJncyk7CisgICAgcmV0dXJuIGZvcm1zX2ZpbmRfZmlyc3Rfb3JfbGFzdChmbF9maW5kX2ZpcnN0LCBmLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fZmluZF9sYXN0KGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBmb3Jtc19maW5kX2ZpcnN0X29yX2xhc3QoZmxfZmluZF9sYXN0LCBmLCBhcmdzKTsKKyAgICByZXR1cm4gZm9ybXNfZmluZF9maXJzdF9vcl9sYXN0KGZsX2ZpbmRfbGFzdCwgZiwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3NldF9vYmplY3RfZm9jdXMoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZ2VuZXJpY29iamVjdCAqZzsKLQlpZiAoYXJncyA9PSBOVUxMIHx8ICFpc19nZW5lcmljb2JqZWN0KGFyZ3MpKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlnID0gKGdlbmVyaWNvYmplY3QgKilhcmdzOwotCWZsX3NldF9vYmplY3RfZm9jdXMoZi0+b2JfZm9ybSwgZy0+b2JfZ2VuZXJpYyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGdlbmVyaWNvYmplY3QgKmc7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCB8fCAhaXNfZ2VuZXJpY29iamVjdChhcmdzKSkgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZyA9IChnZW5lcmljb2JqZWN0ICopYXJnczsKKyAgICBmbF9zZXRfb2JqZWN0X2ZvY3VzKGYtPm9iX2Zvcm0sIGctPm9iX2dlbmVyaWMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGZvcm1fbWV0aG9kc1tdID0gewogLyogYWRtICovCi0JeyJzaG93X2Zvcm0iLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fc2hvd19mb3JtLCAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImhpZGVfZm9ybSIsCQkoUHlDRnVuY3Rpb24pZm9ybV9oaWRlX2Zvcm0sICAgICBNRVRIX05PQVJHU30sCi0JeyJyZWRyYXdfZm9ybSIsCQkoUHlDRnVuY3Rpb24pZm9ybV9yZWRyYXdfZm9ybSwgICBNRVRIX05PQVJHU30sCi0JeyJzZXRfZm9ybV9wb3NpdGlvbiIsCShQeUNGdW5jdGlvbilmb3JtX3NldF9mb3JtX3Bvc2l0aW9uLCBNRVRIX09MREFSR1N9LAotCXsic2V0X2Zvcm1fc2l6ZSIsCShQeUNGdW5jdGlvbilmb3JtX3NldF9mb3JtX3NpemUsIE1FVEhfT0xEQVJHU30sCi0JeyJzY2FsZV9mb3JtIiwJCShQeUNGdW5jdGlvbilmb3JtX3NjYWxlX2Zvcm0sICAgIE1FVEhfT0xEQVJHU30sCi0JeyJmcmVlemVfZm9ybSIsCQkoUHlDRnVuY3Rpb24pZm9ybV9mcmVlemVfZm9ybSwgICBNRVRIX05PQVJHU30sCi0JeyJ1bmZyZWV6ZV9mb3JtIiwJKFB5Q0Z1bmN0aW9uKWZvcm1fdW5mcmVlemVfZm9ybSwgTUVUSF9OT0FSR1N9LAotCXsiYWN0aXZhdGVfZm9ybSIsCShQeUNGdW5jdGlvbilmb3JtX2FjdGl2YXRlX2Zvcm0sIE1FVEhfTk9BUkdTfSwKLQl7ImRlYWN0aXZhdGVfZm9ybSIsCShQeUNGdW5jdGlvbilmb3JtX2RlYWN0aXZhdGVfZm9ybSwgTUVUSF9OT0FSR1N9LAotCXsiYmduX2dyb3VwIiwJCShQeUNGdW5jdGlvbilmb3JtX2Jnbl9ncm91cCwgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRfZ3JvdXAiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fZW5kX2dyb3VwLCAgTUVUSF9PTERBUkdTfSwKLQl7ImZpbmRfZmlyc3QiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fZmluZF9maXJzdCwgTUVUSF9PTERBUkdTfSwKLQl7ImZpbmRfbGFzdCIsCQkoUHlDRnVuY3Rpb24pZm9ybV9maW5kX2xhc3QsICBNRVRIX09MREFSR1N9LAotCXsic2V0X29iamVjdF9mb2N1cyIsCShQeUNGdW5jdGlvbilmb3JtX3NldF9vYmplY3RfZm9jdXMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJzaG93X2Zvcm0iLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX3Nob3dfZm9ybSwgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJoaWRlX2Zvcm0iLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2hpZGVfZm9ybSwgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InJlZHJhd19mb3JtIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fcmVkcmF3X2Zvcm0sICAgTUVUSF9OT0FSR1N9LAorICAgIHsic2V0X2Zvcm1fcG9zaXRpb24iLCAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9zZXRfZm9ybV9wb3NpdGlvbiwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9mb3JtX3NpemUiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fc2V0X2Zvcm1fc2l6ZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNjYWxlX2Zvcm0iLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fc2NhbGVfZm9ybSwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZyZWV6ZV9mb3JtIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fZnJlZXplX2Zvcm0sICAgTUVUSF9OT0FSR1N9LAorICAgIHsidW5mcmVlemVfZm9ybSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV91bmZyZWV6ZV9mb3JtLCBNRVRIX05PQVJHU30sCisgICAgeyJhY3RpdmF0ZV9mb3JtIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FjdGl2YXRlX2Zvcm0sIE1FVEhfTk9BUkdTfSwKKyAgICB7ImRlYWN0aXZhdGVfZm9ybSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fZGVhY3RpdmF0ZV9mb3JtLCBNRVRIX05PQVJHU30sCisgICAgeyJiZ25fZ3JvdXAiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2Jnbl9ncm91cCwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmRfZ3JvdXAiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2VuZF9ncm91cCwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJmaW5kX2ZpcnN0IiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2ZpbmRfZmlyc3QsIE1FVEhfT0xEQVJHU30sCisgICAgeyJmaW5kX2xhc3QiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2ZpbmRfbGFzdCwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfb2JqZWN0X2ZvY3VzIiwgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX3NldF9vYmplY3RfZm9jdXMsIE1FVEhfT0xEQVJHU30sCiAKIC8qIGJhc2ljIG9iamVjdHMgKi8KLQl7ImFkZF9idXR0b24iLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX2J1dHRvbiwgTUVUSF9PTERBUkdTfSwKLS8qCXsiYWRkX2JpdG1hcCIsCQkobWV0aG9kKWZvcm1fYWRkX2JpdG1hcCwgTUVUSF9PTERBUkdTfSwgKi8KLQl7ImFkZF9saWdodGJ1dHRvbiIsCShQeUNGdW5jdGlvbilmb3JtX2FkZF9saWdodGJ1dHRvbiwgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9yb3VuZGJ1dHRvbiIsCShQeUNGdW5jdGlvbilmb3JtX2FkZF9yb3VuZGJ1dHRvbiwgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9tZW51IiwJCShQeUNGdW5jdGlvbilmb3JtX2FkZF9tZW51LCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfc2xpZGVyIiwJCShQeUNGdW5jdGlvbilmb3JtX2FkZF9zbGlkZXIsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfcG9zaXRpb25lciIsCShQeUNGdW5jdGlvbilmb3JtX2FkZF9wb3NpdGlvbmVyLCBNRVRIX09MREFSR1N9LAotCXsiYWRkX3ZhbHNsaWRlciIsCShQeUNGdW5jdGlvbilmb3JtX2FkZF92YWxzbGlkZXIsIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfZGlhbCIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfZGlhbCwgICAgICBNRVRIX09MREFSR1N9LAotCXsiYWRkX2NvdW50ZXIiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX2NvdW50ZXIsICAgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9ib3giLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX2JveCwgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9jbG9jayIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfY2xvY2ssICAgICBNRVRIX09MREFSR1N9LAotCXsiYWRkX2Nob2ljZSIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfY2hvaWNlLCAgICBNRVRIX09MREFSR1N9LAotCXsiYWRkX2Jyb3dzZXIiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX2Jyb3dzZXIsICAgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9pbnB1dCIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfaW5wdXQsICAgICBNRVRIX09MREFSR1N9LAotCXsiYWRkX3RpbWVyIiwJCShQeUNGdW5jdGlvbilmb3JtX2FkZF90aW1lciwgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfdGV4dCIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfdGV4dCwgICAgICBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiYWRkX2J1dHRvbiIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfYnV0dG9uLCBNRVRIX09MREFSR1N9LAorLyogICAgICB7ImFkZF9iaXRtYXAiLCAgICAgICAgICAobWV0aG9kKWZvcm1fYWRkX2JpdG1hcCwgTUVUSF9PTERBUkdTfSwgKi8KKyAgICB7ImFkZF9saWdodGJ1dHRvbiIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX2xpZ2h0YnV0dG9uLCBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX3JvdW5kYnV0dG9uIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfcm91bmRidXR0b24sIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfbWVudSIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9tZW51LCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfc2xpZGVyIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9zbGlkZXIsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfcG9zaXRpb25lciIsICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9wb3NpdGlvbmVyLCBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX3ZhbHNsaWRlciIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfdmFsc2xpZGVyLCBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2RpYWwiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfZGlhbCwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2NvdW50ZXIiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfY291bnRlciwgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2JveCIsICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfYm94LCAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2Nsb2NrIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfY2xvY2ssICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2Nob2ljZSIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfY2hvaWNlLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2Jyb3dzZXIiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfYnJvd3NlciwgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX2lucHV0IiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfaW5wdXQsICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX3RpbWVyIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfdGltZXIsICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkX3RleHQiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfdGV4dCwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyB2b2lkCiBmb3JtX2RlYWxsb2MoZm9ybW9iamVjdCAqZikKIHsKLQlyZWxlYXNlb2JqZWN0cyhmLT5vYl9mb3JtKTsKLQlpZiAoZi0+b2JfZm9ybS0+dmlzaWJsZSkKLQkJZmxfaGlkZV9mb3JtKGYtPm9iX2Zvcm0pOwotCWZsX2ZyZWVfZm9ybShmLT5vYl9mb3JtKTsKLQlQeU9iamVjdF9EZWwoZik7CisgICAgcmVsZWFzZW9iamVjdHMoZi0+b2JfZm9ybSk7CisgICAgaWYgKGYtPm9iX2Zvcm0tPnZpc2libGUpCisgICAgICAgIGZsX2hpZGVfZm9ybShmLT5vYl9mb3JtKTsKKyAgICBmbF9mcmVlX2Zvcm0oZi0+b2JfZm9ybSk7CisgICAgUHlPYmplY3RfRGVsKGYpOwogfQogCiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihGTF9GT1JNLCB4KQogCiBzdGF0aWMgc3RydWN0IG1lbWJlcmxpc3QgZm9ybV9tZW1iZXJsaXN0W10gPSB7Ci0JeyJ3aW5kb3ciLAlUX0xPTkcsCQlPRkYod2luZG93KSwJUk99LAotCXsidyIsCQlUX0ZMT0FULAlPRkYodyl9LAotCXsiaCIsCQlUX0ZMT0FULAlPRkYoaCl9LAotCXsieCIsCQlUX0ZMT0FULAlPRkYoeCksCQlST30sCi0JeyJ5IiwJCVRfRkxPQVQsCU9GRih5KSwJCVJPfSwKLQl7ImRlYWN0aXZhdGVkIiwJVF9JTlQsCQlPRkYoZGVhY3RpdmF0ZWQpfSwKLQl7InZpc2libGUiLAlUX0lOVCwJCU9GRih2aXNpYmxlKSwJUk99LAotCXsiZnJvemVuIiwJVF9JTlQsCQlPRkYoZnJvemVuKSwJUk99LAotCXsiZG91YmxlYnVmIiwJVF9JTlQsCQlPRkYoZG91YmxlYnVmKX0sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJ3aW5kb3ciLCAgICAgICAgICBUX0xPTkcsICAgICAgICAgT0ZGKHdpbmRvdyksICAgIFJPfSwKKyAgICB7InciLCAgICAgICAgICAgICAgIFRfRkxPQVQsICAgICAgICBPRkYodyl9LAorICAgIHsiaCIsICAgICAgICAgICAgICAgVF9GTE9BVCwgICAgICAgIE9GRihoKX0sCisgICAgeyJ4IiwgICAgICAgICAgICAgICBUX0ZMT0FULCAgICAgICAgT0ZGKHgpLCAgICAgICAgIFJPfSwKKyAgICB7InkiLCAgICAgICAgICAgICAgIFRfRkxPQVQsICAgICAgICBPRkYoeSksICAgICAgICAgUk99LAorICAgIHsiZGVhY3RpdmF0ZWQiLCAgICAgVF9JTlQsICAgICAgICAgIE9GRihkZWFjdGl2YXRlZCl9LAorICAgIHsidmlzaWJsZSIsICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRih2aXNpYmxlKSwgICBST30sCisgICAgeyJmcm96ZW4iLCAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGZyb3plbiksICAgIFJPfSwKKyAgICB7ImRvdWJsZWJ1ZiIsICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoZG91YmxlYnVmKX0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKICN1bmRlZiBPRkYKQEAgLTE1NjcsNjAgKzE1NjcsNjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2dldGF0dHIoZm9ybW9iamVjdCAqZiwgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqbWV0aDsKKyAgICBQeU9iamVjdCAqbWV0aDsKIAotCW1ldGggPSBQeV9GaW5kTWV0aG9kKGZvcm1fbWV0aG9kcywgKFB5T2JqZWN0ICopZiwgbmFtZSk7Ci0JaWYgKG1ldGggIT0gTlVMTCkKLQkJcmV0dXJuIG1ldGg7Ci0JUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gUHlNZW1iZXJfR2V0KChjaGFyICopZi0+b2JfZm9ybSwgZm9ybV9tZW1iZXJsaXN0LCBuYW1lKTsKKyAgICBtZXRoID0gUHlfRmluZE1ldGhvZChmb3JtX21ldGhvZHMsIChQeU9iamVjdCAqKWYsIG5hbWUpOworICAgIGlmIChtZXRoICE9IE5VTEwpCisgICAgICAgIHJldHVybiBtZXRoOworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIFB5TWVtYmVyX0dldCgoY2hhciAqKWYtPm9iX2Zvcm0sIGZvcm1fbWVtYmVybGlzdCwgbmFtZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGZvcm1fc2V0YXR0cihmb3Jtb2JqZWN0ICpmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBmb3JtIGF0dHJpYnV0ZXMiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIGZvcm0gYXR0cmlidXRlcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmV0dXJuIFB5TWVtYmVyX1NldCgoY2hhciAqKWYtPm9iX2Zvcm0sIGZvcm1fbWVtYmVybGlzdCwgbmFtZSwgdik7CisgICAgcmV0dXJuIFB5TWVtYmVyX1NldCgoY2hhciAqKWYtPm9iX2Zvcm0sIGZvcm1fbWVtYmVybGlzdCwgbmFtZSwgdik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3JlcHIoZm9ybW9iamVjdCAqZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjxGT1JNU19mb3JtIGF0ICVwLCB3aW5kb3c9JWxkPiIsCi0JCSAgICAgIGYsIGYtPm9iX2Zvcm0tPndpbmRvdyk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjxGT1JNU19mb3JtIGF0ICVwLCB3aW5kb3c9JWxkPiIsCisgICAgICAgICAgICAgICAgICBmLCBmLT5vYl9mb3JtLT53aW5kb3cpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgRm9ybXR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJmbC5GT1JNU19mb3JtIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGZvcm1vYmplY3QpLAkJLyp0cF9zaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZm9ybV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCTAsCQkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylmb3JtX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKWZvcm1fc2V0YXR0ciwJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYylmb3JtX3JlcHIsCQkvKnRwX3JlcHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiZmwuRk9STVNfZm9ybSIsICAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihmb3Jtb2JqZWN0KSwgICAgICAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWZvcm1fZGVhbGxvYywgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWZvcm1fZ2V0YXR0ciwgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpZm9ybV9zZXRhdHRyLCAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKWZvcm1fcmVwciwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdmb3Jtb2JqZWN0KEZMX0ZPUk0gKmZvcm0pCiB7Ci0JZm9ybW9iamVjdCAqZjsKLQlmID0gUHlPYmplY3RfTmV3KGZvcm1vYmplY3QsICZGb3JtdHlwZSk7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZi0+b2JfZm9ybSA9IGZvcm07Ci0JcmV0dXJuIChQeU9iamVjdCAqKWY7CisgICAgZm9ybW9iamVjdCAqZjsKKyAgICBmID0gUHlPYmplY3RfTmV3KGZvcm1vYmplY3QsICZGb3JtdHlwZSk7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZi0+b2JfZm9ybSA9IGZvcm07CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWY7CiB9CiAKIApAQCAtMTYyOSwzNSArMTYyOSwzNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX21ha2VfZm9ybShQeU9iamVjdCAqZHVtbXksIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0eXBlOwotCWZsb2F0IHcsIGg7Ci0JRkxfRk9STSAqZm9ybTsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWZmKSIsICZ0eXBlLCAmdywgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlmb3JtID0gZmxfYmduX2Zvcm0odHlwZSwgdywgaCk7Ci0JaWYgKGZvcm0gPT0gTlVMTCkgewotCQkvKiBYWFggQWN0dWFsbHksIGNhbm5vdCBoYXBwZW4hICovCi0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmbF9lbmRfZm9ybSgpOwotCXJldHVybiBuZXdmb3Jtb2JqZWN0KGZvcm0pOworICAgIGludCB0eXBlOworICAgIGZsb2F0IHcsIGg7CisgICAgRkxfRk9STSAqZm9ybTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWZmKSIsICZ0eXBlLCAmdywgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3JtID0gZmxfYmduX2Zvcm0odHlwZSwgdywgaCk7CisgICAgaWYgKGZvcm0gPT0gTlVMTCkgeworICAgICAgICAvKiBYWFggQWN0dWFsbHksIGNhbm5vdCBoYXBwZW4hICovCisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmbF9lbmRfZm9ybSgpOworICAgIHJldHVybiBuZXdmb3Jtb2JqZWN0KGZvcm0pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfYWN0aXZhdGVfYWxsX2Zvcm1zKFB5T2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbF9hY3RpdmF0ZV9hbGxfZm9ybXMoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxfYWN0aXZhdGVfYWxsX2Zvcm1zKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZGVhY3RpdmF0ZV9hbGxfZm9ybXMoUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsX2RlYWN0aXZhdGVfYWxsX2Zvcm1zKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsX2RlYWN0aXZhdGVfYWxsX2Zvcm1zKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKm15X2V2ZW50X2NhbGxiYWNrID0gTlVMTDsKQEAgLTE2NjUsNDc5ICsxNjY1LDQ3OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3NldF9ldmVudF9jYWxsX2JhY2soUHlPYmplY3QgKmR1bW15LCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoYXJncyA9PSBQeV9Ob25lKQotCQlhcmdzID0gTlVMTDsKLQlteV9ldmVudF9jYWxsYmFjayA9IGFyZ3M7Ci0JUHlfWElOQ1JFRihhcmdzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGFyZ3MgPT0gUHlfTm9uZSkKKyAgICAgICAgYXJncyA9IE5VTEw7CisgICAgbXlfZXZlbnRfY2FsbGJhY2sgPSBhcmdzOworICAgIFB5X1hJTkNSRUYoYXJncyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZG9fb3JfY2hlY2tfZm9ybXMoUHlPYmplY3QgKmR1bW15LCBGTF9PQkpFQ1QgKigqZnVuYykodm9pZCkpCiB7Ci0JRkxfT0JKRUNUICpnZW5lcmljOwotCWdlbmVyaWNvYmplY3QgKmc7Ci0JUHlPYmplY3QgKmFyZywgKnJlczsKKyAgICBGTF9PQkpFQ1QgKmdlbmVyaWM7CisgICAgZ2VuZXJpY29iamVjdCAqZzsKKyAgICBQeU9iamVjdCAqYXJnLCAqcmVzOwogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWdlbmVyaWMgPSAoKmZ1bmMpKCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChnZW5lcmljID09IE5VTEwpIHsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXJldHVybiBQeV9Ob25lOwotCQl9Ci0JCWlmIChnZW5lcmljID09IEZMX0VWRU5UKSB7Ci0JCQlpbnQgZGV2OwotCQkJc2hvcnQgdmFsOwotCQkJaWYgKG15X2V2ZW50X2NhbGxiYWNrID09IE5VTEwpCi0JCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKC0xTCk7Ci0JCQlkZXYgPSBmbF9xcmVhZCgmdmFsKTsKLQkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihpaCkiLCBkZXYsIHZhbCk7Ci0JCQlpZiAoYXJnID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChteV9ldmVudF9jYWxsYmFjaywgYXJnKTsKLQkJCVB5X1hERUNSRUYocmVzKTsKLQkJCVB5X0RFQ1JFRihhcmcpOwotCQkJaWYgKHJlcyA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOyAvKiBDYWxsYmFjayByYWlzZWQgZXhjZXB0aW9uICovCi0JCQljb250aW51ZTsKLQkJfQotCQlnID0gZmluZGdlbmVyaWMoZ2VuZXJpYyk7Ci0JCWlmIChnID09IE5VTEwpIHsKLQkJCS8qIE9iamVjdCBub3Qga25vd24gdG8gdXMgKHNvbWUgZGlhbG9ncyBjYXVzZSB0aGlzKSAqLwotCQkJY29udGludWU7IC8qIElnbm9yZSBpdCAqLwotCQl9Ci0JCWlmIChnLT5vYl9jYWxsYmFjayA9PSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoZyk7Ci0JCQlyZXR1cm4gKChQeU9iamVjdCAqKSBnKTsKLQkJfQotCQlhcmcgPSBQeVR1cGxlX1BhY2soMiwgKFB5T2JqZWN0ICopZywgZy0+b2JfY2FsbGJhY2tfYXJnKTsKLQkJaWYgKGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGctPm9iX2NhbGxiYWNrLCBhcmcpOwotCQlQeV9YREVDUkVGKHJlcyk7Ci0JCVB5X0RFQ1JFRihhcmcpOwotCQlpZiAocmVzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsgLyogQ2FsbGJhY2sgcmFpc2VkIGV4Y2VwdGlvbiAqLwotCX0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZ2VuZXJpYyA9ICgqZnVuYykoKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKGdlbmVyaWMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdlbmVyaWMgPT0gRkxfRVZFTlQpIHsKKyAgICAgICAgICAgIGludCBkZXY7CisgICAgICAgICAgICBzaG9ydCB2YWw7CisgICAgICAgICAgICBpZiAobXlfZXZlbnRfY2FsbGJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoLTFMKTsKKyAgICAgICAgICAgIGRldiA9IGZsX3FyZWFkKCZ2YWwpOworICAgICAgICAgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKGloKSIsIGRldiwgdmFsKTsKKyAgICAgICAgICAgIGlmIChhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KG15X2V2ZW50X2NhbGxiYWNrLCBhcmcpOworICAgICAgICAgICAgUHlfWERFQ1JFRihyZXMpOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7IC8qIENhbGxiYWNrIHJhaXNlZCBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGcgPSBmaW5kZ2VuZXJpYyhnZW5lcmljKTsKKyAgICAgICAgaWYgKGcgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogT2JqZWN0IG5vdCBrbm93biB0byB1cyAoc29tZSBkaWFsb2dzIGNhdXNlIHRoaXMpICovCisgICAgICAgICAgICBjb250aW51ZTsgLyogSWdub3JlIGl0ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGctPm9iX2NhbGxiYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihnKTsKKyAgICAgICAgICAgIHJldHVybiAoKFB5T2JqZWN0ICopIGcpOworICAgICAgICB9CisgICAgICAgIGFyZyA9IFB5VHVwbGVfUGFjaygyLCAoUHlPYmplY3QgKilnLCBnLT5vYl9jYWxsYmFja19hcmcpOworICAgICAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZy0+b2JfY2FsbGJhY2ssIGFyZyk7CisgICAgICAgIFB5X1hERUNSRUYocmVzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAvKiBDYWxsYmFjayByYWlzZWQgZXhjZXB0aW9uICovCisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZG9fZm9ybXMoUHlPYmplY3QgKmR1bW15KQogewotCXJldHVybiBmb3Jtc19kb19vcl9jaGVja19mb3JtcyhkdW1teSwgZmxfZG9fZm9ybXMpOworICAgIHJldHVybiBmb3Jtc19kb19vcl9jaGVja19mb3JtcyhkdW1teSwgZmxfZG9fZm9ybXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfY2hlY2tfZm9ybXMoUHlPYmplY3QgKmR1bW15KQogewotCXJldHVybiBmb3Jtc19kb19vcl9jaGVja19mb3JtcyhkdW1teSwgZmxfY2hlY2tfZm9ybXMpOworICAgIHJldHVybiBmb3Jtc19kb19vcl9jaGVja19mb3JtcyhkdW1teSwgZmxfY2hlY2tfZm9ybXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZG9fb25seV9mb3JtcyhQeU9iamVjdCAqZHVtbXkpCiB7Ci0JcmV0dXJuIGZvcm1zX2RvX29yX2NoZWNrX2Zvcm1zKGR1bW15LCBmbF9kb19vbmx5X2Zvcm1zKTsKKyAgICByZXR1cm4gZm9ybXNfZG9fb3JfY2hlY2tfZm9ybXMoZHVtbXksIGZsX2RvX29ubHlfZm9ybXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfY2hlY2tfb25seV9mb3JtcyhQeU9iamVjdCAqZHVtbXkpCiB7Ci0JcmV0dXJuIGZvcm1zX2RvX29yX2NoZWNrX2Zvcm1zKGR1bW15LCBmbF9jaGVja19vbmx5X2Zvcm1zKTsKKyAgICByZXR1cm4gZm9ybXNfZG9fb3JfY2hlY2tfZm9ybXMoZHVtbXksIGZsX2NoZWNrX29ubHlfZm9ybXMpOwogfQogCiAjaWZkZWYgVU5VU0VECiBzdGF0aWMgUHlPYmplY3QgKgogZmxfY2FsbCh2b2lkICgqZnVuYykodm9pZCkpCiB7Ci0JKCpmdW5jKSgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAoKmZ1bmMpKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19zZXRfZ3JhcGhpY3NfbW9kZShQeU9iamVjdCAqZHVtbXksIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZ2Jtb2RlLCBkb3VibGVidWY7CisgICAgaW50IHJnYm1vZGUsIGRvdWJsZWJ1ZjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmcmdibW9kZSwgJmRvdWJsZWJ1ZikpCi0JCXJldHVybiBOVUxMOwotCWZsX3NldF9ncmFwaGljc19tb2RlKHJnYm1vZGUsZG91YmxlYnVmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZyZ2Jtb2RlLCAmZG91YmxlYnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmxfc2V0X2dyYXBoaWNzX21vZGUocmdibW9kZSxkb3VibGVidWYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX2dldF9yZ2Jtb2RlKFB5T2JqZWN0ICpkdW1teSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZXh0ZXJuIGludCBmbF9yZ2Jtb2RlOworICAgIGV4dGVybiBpbnQgZmxfcmdibW9kZTsKIAotCWlmIChhcmdzICE9IE5VTEwpIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylmbF9yZ2Jtb2RlKTsKKyAgICBpZiAoYXJncyAhPSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpZmxfcmdibW9kZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19zaG93X2Vycm9ycyhQeU9iamVjdCAqZHVtbXksIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzaG93OwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmc2hvdykpCi0JCXJldHVybiBOVUxMOwotCWZsX3Nob3dfZXJyb3JzKHNob3cpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbnQgc2hvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnNob3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbF9zaG93X2Vycm9ycyhzaG93KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19zZXRfZm9udF9uYW1lKFB5T2JqZWN0ICpkdW1teSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG51bWI7Ci0JY2hhciAqbmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaXMpIiwgJm51bWIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZmxfc2V0X2ZvbnRfbmFtZShudW1iLCBuYW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IG51bWI7CisgICAgY2hhciAqbmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaXMpIiwgJm51bWIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmxfc2V0X2ZvbnRfbmFtZShudW1iLCBuYW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3FkZXZpY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzE7Ci0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaCIsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZmxfcWRldmljZShhcmcxKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJoIiwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbF9xZGV2aWNlKGFyZzEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3VucWRldmljZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMTsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJoIiwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlmbF91bnFkZXZpY2UoYXJnMSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzE7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaCIsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmxfdW5xZGV2aWNlKGFyZzEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX2lzcXVldWVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlzaG9ydCBhcmcxOwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImgiLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IGZsX2lzcXVldWVkKGFyZzEpOworICAgIGxvbmcgcmV0dmFsOworICAgIHNob3J0IGFyZzE7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaCIsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gZmxfaXNxdWV1ZWQoYXJnMSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcocmV0dmFsKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmV0dmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3F0ZXN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBmbF9xdGVzdCgpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGZsX3F0ZXN0KCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJldHZhbCk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3FyZWFkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZGV2OwotCXNob3J0IHZhbDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZGV2ID0gZmxfcXJlYWQoJnZhbCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGloKSIsIGRldiwgdmFsKTsKKyAgICBpbnQgZGV2OworICAgIHNob3J0IHZhbDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZGV2ID0gZmxfcXJlYWQoJnZhbCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGloKSIsIGRldiwgdmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3FyZXNldChQeU9iamVjdCAqc2VsZikKIHsKLQlmbF9xcmVzZXQoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxfcXJlc2V0KCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfcWVudGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxLCBhcmcyOwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihoaCkiLCAmYXJnMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlmbF9xZW50ZXIoYXJnMSwgYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEsIGFyZzI7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGhoKSIsICZhcmcxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZsX3FlbnRlcihhcmcxLCBhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19jb2xvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGFyZzsKKyAgICBpbnQgYXJnOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZhcmcpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmFyZykpIHJldHVybiBOVUxMOwogCi0JZmxfY29sb3IoKHNob3J0KSBhcmcpOworICAgIGZsX2NvbG9yKChzaG9ydCkgYXJnKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19tYXBjb2xvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGFyZzAsIGFyZzEsIGFyZzIsIGFyZzM7CisgICAgaW50IGFyZzAsIGFyZzEsIGFyZzIsIGFyZzM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlpaSkiLCAmYXJnMCwgJmFyZzEsICZhcmcyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWlpKSIsICZhcmcwLCAmYXJnMSwgJmFyZzIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmbF9tYXBjb2xvcihhcmcwLCAoc2hvcnQpIGFyZzEsIChzaG9ydCkgYXJnMiwgKHNob3J0KSBhcmczKTsKKyAgICBmbF9tYXBjb2xvcihhcmcwLCAoc2hvcnQpIGFyZzEsIChzaG9ydCkgYXJnMiwgKHNob3J0KSBhcmczKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19nZXRtY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBhcmc7Ci0Jc2hvcnQgciwgZywgYjsKKyAgICBpbnQgYXJnOworICAgIHNob3J0IHIsIGcsIGI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmFyZykpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmYXJnKSkgcmV0dXJuIE5VTEw7CiAKLQlmbF9nZXRtY29sb3IoYXJnLCAmciwgJmcsICZiKTsKKyAgICBmbF9nZXRtY29sb3IoYXJnLCAmciwgJmcsICZiKTsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGhoKSIsIHIsIGcsIGIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGhoKSIsIHIsIGcsIGIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZ2V0X21vdXNlKFB5T2JqZWN0ICpzZWxmKQogewotCWZsb2F0IHgsIHk7CisgICAgZmxvYXQgeCwgeTsKIAotCWZsX2dldF9tb3VzZSgmeCwgJnkpOworICAgIGZsX2dldF9tb3VzZSgmeCwgJnkpOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZikiLCB4LCB5KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsIHgsIHkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfdGllKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxLCBhcmcyLCBhcmczOwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihoaGgpIiwgJmFyZzEsICZhcmcyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWZsX3RpZShhcmcxLCBhcmcyLCBhcmczKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSwgYXJnMiwgYXJnMzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaGhoKSIsICZhcmcxLCAmYXJnMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbF90aWUoYXJnMSwgYXJnMiwgYXJnMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfc2hvd19tZXNzYWdlKFB5T2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICphLCAqYiwgKmM7CisgICAgY2hhciAqYSwgKmIsICpjOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHNzcykiLCAmYSwgJmIsICZjKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHNzcykiLCAmYSwgJmIsICZjKSkgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZmxfc2hvd19tZXNzYWdlKGEsIGIsIGMpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZsX3Nob3dfbWVzc2FnZShhLCBiLCBjKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3Nob3dfY2hvaWNlKFB5T2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICptMSwgKm0yLCAqbTMsICpiMSwgKmIyLCAqYjM7Ci0JaW50IG5iOwotCWNoYXIgKmZvcm1hdDsKLQlsb25nIHJ2OworICAgIGNoYXIgKm0xLCAqbTIsICptMywgKmIxLCAqYjIsICpiMzsKKyAgICBpbnQgbmI7CisgICAgY2hhciAqZm9ybWF0OworICAgIGxvbmcgcnY7CiAKLQlpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQluYiA9IFB5VHVwbGVfU2l6ZShhcmdzKSAtIDM7Ci0JaWYgKG5iIDw9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibmVlZCBhdCBsZWFzdCBvbmUgYnV0dG9uIGxhYmVsIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlJbnRfQ2hlY2soUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDMpKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgIidudW1iZXItb2YtYnV0dG9ucycgYXJndW1lbnQgbm90IG5lZWRlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3dpdGNoIChuYikgewotCWNhc2UgMTogZm9ybWF0ID0gIihzc3NzKSI7IGJyZWFrOwotCWNhc2UgMjogZm9ybWF0ID0gIihzc3NzcykiOyBicmVhazsKLQljYXNlIDM6IGZvcm1hdCA9ICIoc3Nzc3NzKSI7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ0b28gbWFueSBidXR0b24gbGFiZWxzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBuYiA9IFB5VHVwbGVfU2l6ZShhcmdzKSAtIDM7CisgICAgaWYgKG5iIDw9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkIGF0IGxlYXN0IG9uZSBidXR0b24gbGFiZWwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUludF9DaGVjayhQeVR1cGxlX0dldEl0ZW0oYXJncywgMykpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIidudW1iZXItb2YtYnV0dG9ucycgYXJndW1lbnQgbm90IG5lZWRlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3dpdGNoIChuYikgeworICAgIGNhc2UgMTogZm9ybWF0ID0gIihzc3NzKSI7IGJyZWFrOworICAgIGNhc2UgMjogZm9ybWF0ID0gIihzc3NzcykiOyBicmVhazsKKyAgICBjYXNlIDM6IGZvcm1hdCA9ICIoc3Nzc3NzKSI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ0b28gbWFueSBidXR0b24gbGFiZWxzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgZm9ybWF0LCAmbTEsICZtMiwgJm0zLCAmYjEsICZiMiwgJmIzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCBmb3JtYXQsICZtMSwgJm0yLCAmbTMsICZiMSwgJmIyLCAmYjMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlydiA9IGZsX3Nob3dfY2hvaWNlKG0xLCBtMiwgbTMsIG5iLCBiMSwgYjIsIGIzKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhydik7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJ2ID0gZmxfc2hvd19jaG9pY2UobTEsIG0yLCBtMywgbmIsIGIxLCBiMiwgYjMpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJ2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3Nob3dfcXVlc3Rpb24oUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZXQ7Ci0JY2hhciAqYSwgKmIsICpjOworICAgIGludCByZXQ7CisgICAgY2hhciAqYSwgKmIsICpjOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHNzcykiLCAmYSwgJmIsICZjKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHNzcykiLCAmYSwgJmIsICZjKSkgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmV0ID0gZmxfc2hvd19xdWVzdGlvbihhLCBiLCBjKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXQgPSBmbF9zaG93X3F1ZXN0aW9uKGEsIGIsIGMpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHJldCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSByZXQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfc2hvd19pbnB1dChQeU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc3RyOwotCWNoYXIgKmEsICpiOworICAgIGNoYXIgKnN0cjsKKyAgICBjaGFyICphLCAqYjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihzcykiLCAmYSwgJmIpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoc3MpIiwgJmEsICZiKSkgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc3RyID0gZmxfc2hvd19pbnB1dChhLCBiKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzdHIgPSBmbF9zaG93X2lucHV0KGEsIGIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoc3RyID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyKTsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX2ZpbGVfc2VsZWN0b3IoUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnN0cjsKLQljaGFyICphLCAqYiwgKmMsICpkOworICAgIGNoYXIgKnN0cjsKKyAgICBjaGFyICphLCAqYiwgKmMsICpkOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHNzc3MpIiwgJmEsICZiLCAmYywgJmQpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoc3NzcykiLCAmYSwgJmIsICZjLCAmZCkpIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXN0ciA9IGZsX3Nob3dfZmlsZV9zZWxlY3RvcihhLCBiLCBjLCBkKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzdHIgPSBmbF9zaG93X2ZpbGVfc2VsZWN0b3IoYSwgYiwgYywgZCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChzdHIgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19maWxlX3NlbGVjdG9yX2Z1bmMoUHlPYmplY3QgKmFyZ3MsIGNoYXIgKigqZnVuYykodm9pZCkpCiB7Ci0JY2hhciAqc3RyOworICAgIGNoYXIgKnN0cjsKIAotCXN0ciA9ICgqZnVuYykgKCk7CisgICAgc3RyID0gKCpmdW5jKSAoKTsKIAotCWlmIChzdHIgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZ2V0X2RpcmVjdG9yeShQeU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGZvcm1zX2ZpbGVfc2VsZWN0b3JfZnVuYyhhcmdzLCBmbF9nZXRfZGlyZWN0b3J5KTsKKyAgICByZXR1cm4gZm9ybXNfZmlsZV9zZWxlY3Rvcl9mdW5jKGFyZ3MsIGZsX2dldF9kaXJlY3RvcnkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZ2V0X3BhdHRlcm4oUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBmb3Jtc19maWxlX3NlbGVjdG9yX2Z1bmMoYXJncywgZmxfZ2V0X3BhdHRlcm4pOworICAgIHJldHVybiBmb3Jtc19maWxlX3NlbGVjdG9yX2Z1bmMoYXJncywgZmxfZ2V0X3BhdHRlcm4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZ2V0X2ZpbGVuYW1lKFB5T2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZm9ybXNfZmlsZV9zZWxlY3Rvcl9mdW5jKGFyZ3MsIGZsX2dldF9maWxlbmFtZSk7CisgICAgcmV0dXJuIGZvcm1zX2ZpbGVfc2VsZWN0b3JfZnVuYyhhcmdzLCBmbF9nZXRfZmlsZW5hbWUpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZm9ybXNfbWV0aG9kc1tdID0gewogLyogYWRtICovCi0JeyJtYWtlX2Zvcm0iLAkJZm9ybXNfbWFrZV9mb3JtLCBNRVRIX09MREFSR1N9LAotCXsiYWN0aXZhdGVfYWxsX2Zvcm1zIiwJZm9ybXNfYWN0aXZhdGVfYWxsX2Zvcm1zLCBNRVRIX09MREFSR1N9LAotCXsiZGVhY3RpdmF0ZV9hbGxfZm9ybXMiLGZvcm1zX2RlYWN0aXZhdGVfYWxsX2Zvcm1zLCBNRVRIX09MREFSR1N9LAorICAgIHsibWFrZV9mb3JtIiwgICAgICAgICAgICAgICBmb3Jtc19tYWtlX2Zvcm0sIE1FVEhfT0xEQVJHU30sCisgICAgeyJhY3RpdmF0ZV9hbGxfZm9ybXMiLCAgICAgIGZvcm1zX2FjdGl2YXRlX2FsbF9mb3JtcywgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRlYWN0aXZhdGVfYWxsX2Zvcm1zIixmb3Jtc19kZWFjdGl2YXRlX2FsbF9mb3JtcywgTUVUSF9PTERBUkdTfSwKIC8qIGdsIHN1cHBvcnQgd3JhcHBlcnMgKi8KLQl7InFkZXZpY2UiLAkJZm9ybXNfcWRldmljZSwgTUVUSF9PTERBUkdTfSwKLQl7InVucWRldmljZSIsCQlmb3Jtc191bnFkZXZpY2UsIE1FVEhfT0xEQVJHU30sCi0JeyJpc3F1ZXVlZCIsCQlmb3Jtc19pc3F1ZXVlZCwgTUVUSF9PTERBUkdTfSwKLQl7InF0ZXN0IiwJCWZvcm1zX3F0ZXN0LCBNRVRIX09MREFSR1N9LAotCXsicXJlYWQiLAkJZm9ybXNfcXJlYWQsIE1FVEhfT0xEQVJHU30sCi0vKgl7ImJsa3FyZWFkIiwJCWZvcm1zX2Jsa3FyZWFkLCBNRVRIX09MREFSR1N9LCAqLwotCXsicXJlc2V0IiwJCWZvcm1zX3FyZXNldCwgTUVUSF9OT0FSR1N9LAotCXsicWVudGVyIiwJCWZvcm1zX3FlbnRlciwgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9tb3VzZSIsCQlmb3Jtc19nZXRfbW91c2UsIE1FVEhfTk9BUkdTfSwKLQl7InRpZSIsCQkJZm9ybXNfdGllLCBNRVRIX09MREFSR1N9LAotLyoJeyJuZXdfZXZlbnRzIiwJCWZvcm1zX25ld19ldmVudHMsIE1FVEhfT0xEQVJHU30sICovCi0JeyJjb2xvciIsCQlmb3Jtc19jb2xvciwgTUVUSF9PTERBUkdTfSwKLQl7Im1hcGNvbG9yIiwJCWZvcm1zX21hcGNvbG9yLCBNRVRIX09MREFSR1N9LAotCXsiZ2V0bWNvbG9yIiwJCWZvcm1zX2dldG1jb2xvciwgTUVUSF9PTERBUkdTfSwKKyAgICB7InFkZXZpY2UiLCAgICAgICAgICAgICAgICAgZm9ybXNfcWRldmljZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7InVucWRldmljZSIsICAgICAgICAgICAgICAgZm9ybXNfdW5xZGV2aWNlLCBNRVRIX09MREFSR1N9LAorICAgIHsiaXNxdWV1ZWQiLCAgICAgICAgICAgICAgICBmb3Jtc19pc3F1ZXVlZCwgTUVUSF9PTERBUkdTfSwKKyAgICB7InF0ZXN0IiwgICAgICAgICAgICAgICAgICAgZm9ybXNfcXRlc3QsIE1FVEhfT0xEQVJHU30sCisgICAgeyJxcmVhZCIsICAgICAgICAgICAgICAgICAgIGZvcm1zX3FyZWFkLCBNRVRIX09MREFSR1N9LAorLyogICAgICB7ImJsa3FyZWFkIiwgICAgICAgICAgICBmb3Jtc19ibGtxcmVhZCwgTUVUSF9PTERBUkdTfSwgKi8KKyAgICB7InFyZXNldCIsICAgICAgICAgICAgICAgICAgZm9ybXNfcXJlc2V0LCBNRVRIX05PQVJHU30sCisgICAgeyJxZW50ZXIiLCAgICAgICAgICAgICAgICAgIGZvcm1zX3FlbnRlciwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9tb3VzZSIsICAgICAgICAgICAgICAgZm9ybXNfZ2V0X21vdXNlLCBNRVRIX05PQVJHU30sCisgICAgeyJ0aWUiLCAgICAgICAgICAgICAgICAgICAgIGZvcm1zX3RpZSwgTUVUSF9PTERBUkdTfSwKKy8qICAgICAgeyJuZXdfZXZlbnRzIiwgICAgICAgICAgZm9ybXNfbmV3X2V2ZW50cywgTUVUSF9PTERBUkdTfSwgKi8KKyAgICB7ImNvbG9yIiwgICAgICAgICAgICAgICAgICAgZm9ybXNfY29sb3IsIE1FVEhfT0xEQVJHU30sCisgICAgeyJtYXBjb2xvciIsICAgICAgICAgICAgICAgIGZvcm1zX21hcGNvbG9yLCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0bWNvbG9yIiwgICAgICAgICAgICAgICBmb3Jtc19nZXRtY29sb3IsIE1FVEhfT0xEQVJHU30sCiAvKiBpbnRlcmFjdGlvbiAqLwotCXsiZG9fZm9ybXMiLAkJZm9ybXNfZG9fZm9ybXMsIE1FVEhfTk9BUkdTfSwKLQl7ImRvX29ubHlfZm9ybXMiLAlmb3Jtc19kb19vbmx5X2Zvcm1zLCBNRVRIX05PQVJHU30sCi0JeyJjaGVja19mb3JtcyIsCQlmb3Jtc19jaGVja19mb3JtcywgTUVUSF9OT0FSR1N9LAotCXsiY2hlY2tfb25seV9mb3JtcyIsCWZvcm1zX2NoZWNrX29ubHlfZm9ybXMsIE1FVEhfTk9BUkdTfSwKLQl7InNldF9ldmVudF9jYWxsX2JhY2siLAlmb3Jtc19zZXRfZXZlbnRfY2FsbF9iYWNrLCBNRVRIX09MREFSR1N9LAorICAgIHsiZG9fZm9ybXMiLCAgICAgICAgICAgICAgICBmb3Jtc19kb19mb3JtcywgTUVUSF9OT0FSR1N9LAorICAgIHsiZG9fb25seV9mb3JtcyIsICAgICAgICAgICBmb3Jtc19kb19vbmx5X2Zvcm1zLCBNRVRIX05PQVJHU30sCisgICAgeyJjaGVja19mb3JtcyIsICAgICAgICAgICAgIGZvcm1zX2NoZWNrX2Zvcm1zLCBNRVRIX05PQVJHU30sCisgICAgeyJjaGVja19vbmx5X2Zvcm1zIiwgICAgICAgIGZvcm1zX2NoZWNrX29ubHlfZm9ybXMsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9ldmVudF9jYWxsX2JhY2siLCAgICAgZm9ybXNfc2V0X2V2ZW50X2NhbGxfYmFjaywgTUVUSF9PTERBUkdTfSwKIC8qIGdvb2RpZXMgKi8KLQl7InNob3dfbWVzc2FnZSIsCWZvcm1zX3Nob3dfbWVzc2FnZSwgTUVUSF9PTERBUkdTfSwKLQl7InNob3dfcXVlc3Rpb24iLAlmb3Jtc19zaG93X3F1ZXN0aW9uLCBNRVRIX09MREFSR1N9LAotCXsic2hvd19jaG9pY2UiLAkJZm9ybXNfc2hvd19jaG9pY2UsIE1FVEhfT0xEQVJHU30sCi0JeyJzaG93X2lucHV0IiwJCWZvcm1zX3Nob3dfaW5wdXQsIE1FVEhfT0xEQVJHU30sCi0JeyJzaG93X2ZpbGVfc2VsZWN0b3IiLAlmb3Jtc19maWxlX3NlbGVjdG9yLCBNRVRIX09MREFSR1N9LAotCXsiZmlsZV9zZWxlY3RvciIsCWZvcm1zX2ZpbGVfc2VsZWN0b3IsIE1FVEhfT0xEQVJHU30sIC8qIEJXIGNvbXBhdCAqLwotCXsiZ2V0X2RpcmVjdG9yeSIsCWZvcm1zX2dldF9kaXJlY3RvcnksIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfcGF0dGVybiIsCQlmb3Jtc19nZXRfcGF0dGVybiwgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9maWxlbmFtZSIsCWZvcm1zX2dldF9maWxlbmFtZSwgTUVUSF9PTERBUkdTfSwKLQl7InNldF9ncmFwaGljc19tb2RlIiwJZm9ybXNfc2V0X2dyYXBoaWNzX21vZGUsIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfcmdibW9kZSIsCQlmb3Jtc19nZXRfcmdibW9kZSwgTUVUSF9PTERBUkdTfSwKLQl7InNob3dfZXJyb3JzIiwJCWZvcm1zX3Nob3dfZXJyb3JzLCBNRVRIX09MREFSR1N9LAotCXsic2V0X2ZvbnRfbmFtZSIsCWZvcm1zX3NldF9mb250X25hbWUsIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzaG93X21lc3NhZ2UiLCAgICAgICAgICAgIGZvcm1zX3Nob3dfbWVzc2FnZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNob3dfcXVlc3Rpb24iLCAgICAgICAgICAgZm9ybXNfc2hvd19xdWVzdGlvbiwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNob3dfY2hvaWNlIiwgICAgICAgICAgICAgZm9ybXNfc2hvd19jaG9pY2UsIE1FVEhfT0xEQVJHU30sCisgICAgeyJzaG93X2lucHV0IiwgICAgICAgICAgICAgIGZvcm1zX3Nob3dfaW5wdXQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJzaG93X2ZpbGVfc2VsZWN0b3IiLCAgICAgIGZvcm1zX2ZpbGVfc2VsZWN0b3IsIE1FVEhfT0xEQVJHU30sCisgICAgeyJmaWxlX3NlbGVjdG9yIiwgICAgICAgICAgIGZvcm1zX2ZpbGVfc2VsZWN0b3IsIE1FVEhfT0xEQVJHU30sIC8qIEJXIGNvbXBhdCAqLworICAgIHsiZ2V0X2RpcmVjdG9yeSIsICAgICAgICAgICBmb3Jtc19nZXRfZGlyZWN0b3J5LCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X3BhdHRlcm4iLCAgICAgICAgICAgICBmb3Jtc19nZXRfcGF0dGVybiwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9maWxlbmFtZSIsICAgICAgICAgICAgZm9ybXNfZ2V0X2ZpbGVuYW1lLCBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2dyYXBoaWNzX21vZGUiLCAgICAgICBmb3Jtc19zZXRfZ3JhcGhpY3NfbW9kZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9yZ2Jtb2RlIiwgICAgICAgICAgICAgZm9ybXNfZ2V0X3JnYm1vZGUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJzaG93X2Vycm9ycyIsICAgICAgICAgICAgIGZvcm1zX3Nob3dfZXJyb3JzLCBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2ZvbnRfbmFtZSIsICAgICAgICAgICBmb3Jtc19zZXRfZm9udF9uYW1lLCBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0Zmwodm9pZCkKIHsKLSAgICAKKwogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGZsIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgcmV0dXJuOworCisgICAgUHlfSW5pdE1vZHVsZSgiZmwiLCBmb3Jtc19tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQogICAgICAgICByZXR1cm47Ci0gICAgCi0JUHlfSW5pdE1vZHVsZSgiZmwiLCBmb3Jtc19tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZm9yZWdyb3VuZCgpOwotCWZsX2luaXQoKTsKKyAgICBmb3JlZ3JvdW5kKCk7CisgICAgZmxfaW5pdCgpOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvZm1tb2R1bGUuYyBiL01vZHVsZXMvZm1tb2R1bGUuYwppbmRleCBmM2YwZGM1Li4zYTc0MTA3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2ZtbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9mbW1vZHVsZS5jCkBAIC0xMSwyOCArMTEsMjggQEAKIC8qIEZvbnQgSGFuZGxlIG9iamVjdCBpbXBsZW1lbnRhdGlvbiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWZtZm9udGhhbmRsZSBmaF9maDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgZm1mb250aGFuZGxlIGZoX2ZoOwogfSBmaG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBGaHR5cGU7CiAKLSNkZWZpbmUgaXNfZmhvYmplY3QodikJCSgodiktPm9iX3R5cGUgPT0gJkZodHlwZSkKKyNkZWZpbmUgaXNfZmhvYmplY3QodikgICAgICAgICAgKCh2KS0+b2JfdHlwZSA9PSAmRmh0eXBlKQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3ZmhvYmplY3QoZm1mb250aGFuZGxlIGZoKQogewotCWZob2JqZWN0ICpmaHA7Ci0JaWYgKGZoID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiZXJyb3IgY3JlYXRpbmcgbmV3IGZvbnQgaGFuZGxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmaHAgPSBQeU9iamVjdF9OZXcoZmhvYmplY3QsICZGaHR5cGUpOwotCWlmIChmaHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZmhwLT5maF9maCA9IGZoOwotCXJldHVybiAoUHlPYmplY3QgKilmaHA7CisgICAgZmhvYmplY3QgKmZocDsKKyAgICBpZiAoZmggPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIGNyZWF0aW5nIG5ldyBmb250IGhhbmRsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZmhwID0gUHlPYmplY3RfTmV3KGZob2JqZWN0LCAmRmh0eXBlKTsKKyAgICBpZiAoZmhwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZocC0+ZmhfZmggPSBmaDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZmhwOwogfQogCiAvKiBGb250IEhhbmRsZSBtZXRob2RzICovCkBAIC00MCwxMCArNDAsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaF9zY2FsZWZvbnQoZmhvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSBzaXplOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZCIsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ld2Zob2JqZWN0KGZtc2NhbGVmb250KHNlbGYtPmZoX2ZoLCBzaXplKSk7CisgICAgZG91YmxlIHNpemU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkIiwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmV3ZmhvYmplY3QoZm1zY2FsZWZvbnQoc2VsZi0+ZmhfZmgsIHNpemUpKTsKIH0KIAogLyogWFhYIGZtbWFrZWZvbnQgKi8KQEAgLTUxLDU0ICs1MSw1NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZoX3NldGZvbnQoZmhvYmplY3QgKnNlbGYpCiB7Ci0JZm1zZXRmb250KHNlbGYtPmZoX2ZoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZm1zZXRmb250KHNlbGYtPmZoX2ZoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaF9nZXRmb250bmFtZShmaG9iamVjdCAqc2VsZikKIHsKLQljaGFyIGZvbnRuYW1lWzI1Nl07Ci0JaW50IGxlbjsKLQlsZW4gPSBmbWdldGZvbnRuYW1lKHNlbGYtPmZoX2ZoLCBzaXplb2YgZm9udG5hbWUsIGZvbnRuYW1lKTsKLQlpZiAobGVuIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiZXJyb3IgaW4gZm1nZXRmb250bmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZvbnRuYW1lLCBsZW4pOworICAgIGNoYXIgZm9udG5hbWVbMjU2XTsKKyAgICBpbnQgbGVuOworICAgIGxlbiA9IGZtZ2V0Zm9udG5hbWUoc2VsZi0+ZmhfZmgsIHNpemVvZiBmb250bmFtZSwgZm9udG5hbWUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJlcnJvciBpbiBmbWdldGZvbnRuYW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZm9udG5hbWUsIGxlbik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaF9nZXRjb21tZW50KGZob2JqZWN0ICpzZWxmKQogewotCWNoYXIgY29tbWVudFsyNTZdOwotCWludCBsZW47Ci0JbGVuID0gZm1nZXRjb21tZW50KHNlbGYtPmZoX2ZoLCBzaXplb2YgY29tbWVudCwgY29tbWVudCk7Ci0JaWYgKGxlbiA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImVycm9yIGluIGZtZ2V0Y29tbWVudCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNvbW1lbnQsIGxlbik7CisgICAgY2hhciBjb21tZW50WzI1Nl07CisgICAgaW50IGxlbjsKKyAgICBsZW4gPSBmbWdldGNvbW1lbnQoc2VsZi0+ZmhfZmgsIHNpemVvZiBjb21tZW50LCBjb21tZW50KTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiZXJyb3IgaW4gZm1nZXRjb21tZW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29tbWVudCwgbGVuKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZoX2dldGZvbnRpbmZvKGZob2JqZWN0ICpzZWxmKQogewotCWZtZm9udGluZm8gaW5mbzsKLQlpZiAoZm1nZXRmb250aW5mbyhzZWxmLT5maF9maCwgJmluZm8pIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiZXJyb3IgaW4gZm1nZXRmb250aW5mbyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsbGxsbGxsbCkiLAotCQkJICAgICBpbmZvLnByaW50ZXJtYXRjaGVkLAotCQkJICAgICBpbmZvLmZpeGVkX3dpZHRoLAotCQkJICAgICBpbmZvLnhvcmlnLAotCQkJICAgICBpbmZvLnlvcmlnLAotCQkJICAgICBpbmZvLnhzaXplLAotCQkJICAgICBpbmZvLnlzaXplLAotCQkJICAgICBpbmZvLmhlaWdodCwKLQkJCSAgICAgaW5mby5uZ2x5cGhzKTsKKyAgICBmbWZvbnRpbmZvIGluZm87CisgICAgaWYgKGZtZ2V0Zm9udGluZm8oc2VsZi0+ZmhfZmgsICZpbmZvKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImVycm9yIGluIGZtZ2V0Zm9udGluZm8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobGxsbGxsbGwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnByaW50ZXJtYXRjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZml4ZWRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby54b3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnlvcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ueHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby55c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm5nbHlwaHMpOwogfQogCiAjaWYgMApAQCAtMTExLDUxICsxMTEsNTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaF9nZXRzdHJ3aWR0aChmaG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc3RyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZm1nZXRzdHJ3aWR0aChzZWxmLT5maF9maCwgc3RyKSk7CisgICAgY2hhciAqc3RyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZm1nZXRzdHJ3aWR0aChzZWxmLT5maF9maCwgc3RyKSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmaF9tZXRob2RzW10gPSB7Ci0JeyJzY2FsZWZvbnQiLAkoUHlDRnVuY3Rpb24pZmhfc2NhbGVmb250LCAgIE1FVEhfVkFSQVJHU30sCi0JeyJzZXRmb250IiwJKFB5Q0Z1bmN0aW9uKWZoX3NldGZvbnQsICAgICBNRVRIX05PQVJHU30sCi0JeyJnZXRmb250bmFtZSIsCShQeUNGdW5jdGlvbilmaF9nZXRmb250bmFtZSwgTUVUSF9OT0FSR1N9LAotCXsiZ2V0Y29tbWVudCIsCShQeUNGdW5jdGlvbilmaF9nZXRjb21tZW50LCAgTUVUSF9OT0FSR1N9LAotCXsiZ2V0Zm9udGluZm8iLAkoUHlDRnVuY3Rpb24pZmhfZ2V0Zm9udGluZm8sIE1FVEhfTk9BUkdTfSwKKyAgICB7InNjYWxlZm9udCIsICAgICAgIChQeUNGdW5jdGlvbilmaF9zY2FsZWZvbnQsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldGZvbnQiLCAgICAgICAgIChQeUNGdW5jdGlvbilmaF9zZXRmb250LCAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0Zm9udG5hbWUiLCAgICAgKFB5Q0Z1bmN0aW9uKWZoX2dldGZvbnRuYW1lLCBNRVRIX05PQVJHU30sCisgICAgeyJnZXRjb21tZW50IiwgICAgICAoUHlDRnVuY3Rpb24pZmhfZ2V0Y29tbWVudCwgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImdldGZvbnRpbmZvIiwgICAgIChQeUNGdW5jdGlvbilmaF9nZXRmb250aW5mbywgTUVUSF9OT0FSR1N9LAogI2lmIDAKLQl7ImdldHdob2xlbWV0cmljcyIsCShQeUNGdW5jdGlvbilmaF9nZXR3aG9sZW1ldHJpY3MsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXR3aG9sZW1ldHJpY3MiLCAgICAgICAgIChQeUNGdW5jdGlvbilmaF9nZXR3aG9sZW1ldHJpY3MsIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKLQl7ImdldHN0cndpZHRoIiwJKFB5Q0Z1bmN0aW9uKWZoX2dldHN0cndpZHRoLCBNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJnZXRzdHJ3aWR0aCIsICAgICAoUHlDRnVuY3Rpb24pZmhfZ2V0c3Ryd2lkdGgsIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaF9nZXRhdHRyKGZob2JqZWN0ICpmaHAsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoZmhfbWV0aG9kcywgKFB5T2JqZWN0ICopZmhwLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChmaF9tZXRob2RzLCAoUHlPYmplY3QgKilmaHAsIG5hbWUpOwogfQogCiBzdGF0aWMgdm9pZAogZmhfZGVhbGxvYyhmaG9iamVjdCAqZmhwKQogewotCWZtZnJlZWZvbnQoZmhwLT5maF9maCk7Ci0JUHlPYmplY3RfRGVsKGZocCk7CisgICAgZm1mcmVlZm9udChmaHAtPmZoX2ZoKTsKKyAgICBQeU9iamVjdF9EZWwoZmhwKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBGaHR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJmbS5mb250IGhhbmRsZSIsCQkvKnRwX25hbWUqLwotCXNpemVvZihmaG9iamVjdCksCQkvKnRwX3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilmaF9kZWFsbG9jLAkJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpZmhfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkJLyp0cF9yZXByKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgImZtLmZvbnQgaGFuZGxlIiwgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoZmhvYmplY3QpLCAgICAgICAgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilmaF9kZWFsbG9jLCAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylmaF9nZXRhdHRyLCAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiB9OwogCiAKQEAgLTE2NCwyOSArMTY0LDI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZm1faW5pdChQeU9iamVjdCAqc2VsZikKIHsKLQlmbWluaXQoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZm1pbml0KCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm1fZmluZGZvbnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnN0cjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ld2Zob2JqZWN0KGZtZmluZGZvbnQoc3RyKSk7CisgICAgY2hhciAqc3RyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmV3ZmhvYmplY3QoZm1maW5kZm9udChzdHIpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZtX3Byc3RyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzdHI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnN0cikpCi0JCXJldHVybiBOVUxMOwotCWZtcHJzdHIoc3RyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqc3RyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbXByc3RyKHN0cik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBYWFggVGhpcyB1c2VzIGEgZ2xvYmFsIHZhcmlhYmxlIGFzIHRlbXBvcmFyeSEgTm90IHJlLWVudHJhbnQhICovCkBAIC0xOTYsNzQgKzE5Niw3NCBAQAogc3RhdGljIHZvaWQKIGNsaWVudHByb2MoY2hhciAqZm9udG5hbWUpCiB7Ci0JaW50IGVycjsKLQlQeU9iamVjdCAqdjsKLQlpZiAoZm9udGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuOwotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZvbnRuYW1lKTsKLQlpZiAodiA9PSBOVUxMKQotCQllcnIgPSAtMTsKLQllbHNlIHsKLQkJZXJyID0gUHlMaXN0X0FwcGVuZChmb250bGlzdCwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9Ci0JaWYgKGVyciAhPSAwKSB7Ci0JCVB5X0RFQ1JFRihmb250bGlzdCk7Ci0JCWZvbnRsaXN0ID0gTlVMTDsKLQl9CisgICAgaW50IGVycjsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpZiAoZm9udGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZvbnRuYW1lKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBlcnIgPSAtMTsKKyAgICBlbHNlIHsKKyAgICAgICAgZXJyID0gUHlMaXN0X0FwcGVuZChmb250bGlzdCwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihmb250bGlzdCk7CisgICAgICAgIGZvbnRsaXN0ID0gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbV9lbnVtZXJhdGUoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlmb250bGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKGZvbnRsaXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZtZW51bWVyYXRlKGNsaWVudHByb2MpOwotCXJlcyA9IGZvbnRsaXN0OwotCWZvbnRsaXN0ID0gTlVMTDsKLQlyZXR1cm4gcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgZm9udGxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChmb250bGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbWVudW1lcmF0ZShjbGllbnRwcm9jKTsKKyAgICByZXMgPSBmb250bGlzdDsKKyAgICBmb250bGlzdCA9IE5VTEw7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZtX3NldHBhdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnN0cjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm1zZXRwYXRoKHN0cik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNoYXIgKnN0cjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm1zZXRwYXRoKHN0cik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm1fZm9udHBhdGgoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZm1mb250cGF0aCgpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhmbWZvbnRwYXRoKCkpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZm1fbWV0aG9kc1tdID0gewotCXsiaW5pdCIsCWZtX2luaXQsICAgICAgTUVUSF9OT0FSR1N9LAotCXsiZmluZGZvbnQiLAlmbV9maW5kZm9udCwgIE1FVEhfVkFSQVJHU30sCi0JeyJlbnVtZXJhdGUiLAlmbV9lbnVtZXJhdGUsIE1FVEhfTk9BUkdTfSwKLQl7InByc3RyIiwJZm1fcHJzdHIsICAgICBNRVRIX1ZBUkFSR1N9LAotCXsic2V0cGF0aCIsCWZtX3NldHBhdGgsICAgTUVUSF9WQVJBUkdTfSwKLQl7ImZvbnRwYXRoIiwJZm1fZm9udHBhdGgsICBNRVRIX05PQVJHU30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImluaXQiLCAgICAgICAgICAgIGZtX2luaXQsICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiZmluZGZvbnQiLCAgICAgICAgZm1fZmluZGZvbnQsICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZW51bWVyYXRlIiwgICAgICAgZm1fZW51bWVyYXRlLCBNRVRIX05PQVJHU30sCisgICAgeyJwcnN0ciIsICAgICAgICAgICBmbV9wcnN0ciwgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRwYXRoIiwgICAgICAgICBmbV9zZXRwYXRoLCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJmb250cGF0aCIsICAgICAgICBmbV9mb250cGF0aCwgIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCiB2b2lkCiBpbml0Zm0odm9pZCkKIHsKLSAgICAKKwogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGZtIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgcmV0dXJuOworCisgICAgUHlfSW5pdE1vZHVsZSgiZm0iLCBmbV9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQogICAgICAgICByZXR1cm47Ci0gICAgCi0JUHlfSW5pdE1vZHVsZSgiZm0iLCBmbV9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZm1pbml0KCk7CisgICAgZm1pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ZwZWN0bG1vZHVsZS5jIGIvTW9kdWxlcy9mcGVjdGxtb2R1bGUuYwppbmRleCA3NDM1NGJhLi5mYWEyNzliIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2ZwZWN0bG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZnBlY3RsbW9kdWxlLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAotICAgIC8gICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5Ni4gICAgICAgICAgICAgICAgICAgICAgICAgICBcIAorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvICAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYuICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfCAgICAgICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgICAgICAgICAgICAgICAgfAogICAgfCAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfApAQCAtMzIsMTIgKzMyLDEyIEBACiAgICB8ICAgb3BpbmlvbnMgIG9mIGF1dGhvcnMgZXhwcmVzc2VkIGhlcmVpbiBkbyBub3QgbmVjZXNzYXJpbHkgc3RhdGUgb3IgICB8CiAgICB8ICAgcmVmbGVjdCB0aG9zZSBvZiB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IG9yICB0aGUgIFVuaXZlcnNpdHkgICB8CiAgICB8ICAgb2YgIENhbGlmb3JuaWEsICBhbmQgc2hhbGwgbm90IGJlIHVzZWQgZm9yIGFkdmVydGlzaW5nIG9yIHByb2R1Y3QgICB8Ci0gICAgXCAgZW5kb3JzZW1lbnQgcHVycG9zZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgICAgXCAgZW5kb3JzZW1lbnQgcHVycG9zZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwogCiAvKgotCQkgIEZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBjb250cm9sIG1vZHVsZS4KKyAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBjb250cm9sIG1vZHVsZS4KIAogICAgVGhpcyBQeXRob24gbW9kdWxlIHByb3ZpZGVzIGJhcmUtYm9uZXMgY29udHJvbCBvdmVyIGZsb2F0aW5nIHBvaW50CiAgICB1bml0cyBmcm9tIHNldmVyYWwgaGFyZHdhcmUgbWFudWZhY3R1cmVycy4gIFNwZWNpZmljYWxseSwgaXQgYWxsb3dzCkBAIC05NSw4ICs5NSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKnR1cm5vZmZfc2lnZnBlICAgICAgICAgICAoUHlPYmplY3QgKnNlbGYsUHlPYmplY3QgKmFyZ3MpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgZnBlY3RsX21ldGhvZHNbXSA9IHsKLSAgICB7InR1cm5vbl9zaWdmcGUiLAkJIChQeUNGdW5jdGlvbikgdHVybm9uX3NpZ2ZwZSwJCSBNRVRIX1ZBUkFSR1N9LAotICAgIHsidHVybm9mZl9zaWdmcGUiLAkJIChQeUNGdW5jdGlvbikgdHVybm9mZl9zaWdmcGUsIAkgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidHVybm9uX3NpZ2ZwZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKSB0dXJub25fc2lnZnBlLCAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ0dXJub2ZmX3NpZ2ZwZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pIHR1cm5vZmZfc2lnZnBlLCAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7MCwwfQogfTsKIApAQCAtMTIxLDE5ICsxMjEsMTkgQEAKICAgICAgKiBNeSB1c2FnZSBkb2Vzbid0IGZvbGxvdyB0aGUgbWFuIHBhZ2UgZXhhY3RseS4gIE1heWJlIHNvbWVib2R5CiAgICAgICogZWxzZSBjYW4gZXhwbGFpbiBoYW5kbGVfc2lnZnBlcyB0byBtZS4uLi4KICAgICAgKiBjYyAtYyAtSS91c3IvbG9jYWwvcHl0aG9uL2luY2x1ZGUgZnBlY3RsbW9kdWxlLmMKLSAgICAgKiBsZCAtc2hhcmVkIC1vIGZwZWN0bG1vZHVsZS5zbyBmcGVjdGxtb2R1bGUubyAtbGZwZSAKKyAgICAgKiBsZCAtc2hhcmVkIC1vIGZwZWN0bG1vZHVsZS5zbyBmcGVjdGxtb2R1bGUubyAtbGZwZQogICAgICAqLwogI2luY2x1ZGUgPHNpZ2ZwZS5oPgogICAgIHR5cGVkZWYgdm9pZCB1c2VyX3JvdXRpbmUgKHVuc2lnbmVkWzVdLCBpbnRbMl0pOwogICAgIHR5cGVkZWYgdm9pZCBhYm9ydF9yb3V0aW5lICh1bnNpZ25lZCBsb25nKTsKICAgICBoYW5kbGVfc2lnZnBlcyhfT0ZGLCAwLAotCQkgKHVzZXJfcm91dGluZSAqKTAsCi0JCSBfVFVSTl9PRkZfSEFORExFUl9PTl9FUlJPUiwKLQkJIE5VTEwpOworICAgICAgICAgICAgICAgICAodXNlcl9yb3V0aW5lICopMCwKKyAgICAgICAgICAgICAgICAgX1RVUk5fT0ZGX0hBTkRMRVJfT05fRVJST1IsCisgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgIGhhbmRsZV9zaWdmcGVzKF9PTiwgX0VOX09WRVJGTCB8IF9FTl9ESVZaRVJPIHwgX0VOX0lOVkFMSUQsCi0JCSAodXNlcl9yb3V0aW5lICopMCwKLQkJIF9BQk9SVF9PTl9FUlJPUiwKLQkJIE5VTEwpOworICAgICAgICAgICAgICAgICAodXNlcl9yb3V0aW5lICopMCwKKyAgICAgICAgICAgICAgICAgX0FCT1JUX09OX0VSUk9SLAorICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICBQeU9TX3NldHNpZyhTSUdGUEUsIGhhbmRsZXIpOwogCiAvKi0tIFN1bk9TIGFuZCBTb2xhcmlzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTk0LDE2ICsxOTQsMTYgQEAKIAogLyotLSBERUMgQUxQSEEgVk1TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNlbGlmIGRlZmluZWQoX19BTFBIQSkgJiYgZGVmaW5lZChfX1ZNUykKLQlJRUVFIGNscm1zazsKLQlJRUVFIHNldG1zazsKLQljbHJtc2suaWVlZSRxX2ZsYWdzID0KLQkJSUVFRSRNX1RSQVBfRU5BQkxFX1VORiB8ICBJRUVFJE1fVFJBUF9FTkFCTEVfSU5FIHwKLQkJIElFRUUkTV9NQVBfVU1aOwotCXNldG1zay5pZWVlJHFfZmxhZ3MgPQotCQlJRUVFJE1fVFJBUF9FTkFCTEVfSU5WIHwgSUVFRSRNX1RSQVBfRU5BQkxFX0RaRSB8Ci0JCUlFRUUkTV9UUkFQX0VOQUJMRV9PVkY7Ci0Jc3lzJGllZWVfc2V0X2ZwX2NvbnRyb2woJmNscm1zaywgJnNldG1zaywgMCk7Ci0JUHlPU19zZXRzaWcoU0lHRlBFLCBoYW5kbGVyKTsKKyAgICAgICAgSUVFRSBjbHJtc2s7CisgICAgICAgIElFRUUgc2V0bXNrOworICAgICAgICBjbHJtc2suaWVlZSRxX2ZsYWdzID0KKyAgICAgICAgICAgICAgICBJRUVFJE1fVFJBUF9FTkFCTEVfVU5GIHwgIElFRUUkTV9UUkFQX0VOQUJMRV9JTkUgfAorICAgICAgICAgICAgICAgICBJRUVFJE1fTUFQX1VNWjsKKyAgICAgICAgc2V0bXNrLmllZWUkcV9mbGFncyA9CisgICAgICAgICAgICAgICAgSUVFRSRNX1RSQVBfRU5BQkxFX0lOViB8IElFRUUkTV9UUkFQX0VOQUJMRV9EWkUgfAorICAgICAgICAgICAgICAgIElFRUUkTV9UUkFQX0VOQUJMRV9PVkY7CisgICAgICAgIHN5cyRpZWVlX3NldF9mcF9jb250cm9sKCZjbHJtc2ssICZzZXRtc2ssIDApOworICAgICAgICBQeU9TX3NldHNpZyhTSUdGUEUsIGhhbmRsZXIpOwogCiAvKi0tIEhQIElBNjQgVk1TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNlbGlmIGRlZmluZWQoX19pYTY0KSAmJiBkZWZpbmVkKF9fVk1TKQpAQCAtMjYyLDEzICsyNjIsMTMgQEAKICAgICBmcHJlc2V0c3RpY2t5KGZwZ2V0c3RpY2t5KCkpOwogICAgIGZwc2V0bWFzaygwKTsKICNlbGlmIGRlZmluZWQoX19WTVMpCi0JSUVFRSBjbHJtc2s7Ci0JIGNscm1zay5pZWVlJHFfZmxhZ3MgPQotCQlJRUVFJE1fVFJBUF9FTkFCTEVfVU5GIHwgIElFRUUkTV9UUkFQX0VOQUJMRV9JTkUgfAotCQlJRUVFJE1fTUFQX1VNWiB8IElFRUUkTV9UUkFQX0VOQUJMRV9JTlYgfAotCQlJRUVFJE1fVFJBUF9FTkFCTEVfRFpFIHwgSUVFRSRNX1RSQVBfRU5BQkxFX09WRiB8Ci0JCUlFRUUkTV9JTkhFUklUOwotCXN5cyRpZWVlX3NldF9mcF9jb250cm9sKCZjbHJtc2ssIDAsIDApOworICAgICAgICBJRUVFIGNscm1zazsKKyAgICAgICAgIGNscm1zay5pZWVlJHFfZmxhZ3MgPQorICAgICAgICAgICAgICAgIElFRUUkTV9UUkFQX0VOQUJMRV9VTkYgfCAgSUVFRSRNX1RSQVBfRU5BQkxFX0lORSB8CisgICAgICAgICAgICAgICAgSUVFRSRNX01BUF9VTVogfCBJRUVFJE1fVFJBUF9FTkFCTEVfSU5WIHwKKyAgICAgICAgICAgICAgICBJRUVFJE1fVFJBUF9FTkFCTEVfRFpFIHwgSUVFRSRNX1RSQVBfRU5BQkxFX09WRiB8CisgICAgICAgICAgICAgICAgSUVFRSRNX0lOSEVSSVQ7CisgICAgICAgIHN5cyRpZWVlX3NldF9mcF9jb250cm9sKCZjbHJtc2ssIDAsIDApOwogI2Vsc2UKICAgICBmcHV0cygiT3BlcmF0aW9uIG5vdCBpbXBsZW1lbnRlZFxuIiwgc3RkZXJyKTsKICNlbmRpZgpAQCAtMjkxLDExICsyOTEsMTEgQEAKICAgICBQeU9iamVjdCAqbSwgKmQ7CiAgICAgbSA9IFB5X0luaXRNb2R1bGUoImZwZWN0bCIsIGZwZWN0bF9tZXRob2RzKTsKICAgICBpZiAobSA9PSBOVUxMKQotICAgIAlyZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKICAgICBmcGVfZXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImZwZWN0bC5lcnJvciIsIE5VTEwsIE5VTEwpOwogICAgIGlmIChmcGVfZXJyb3IgIT0gTlVMTCkKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBmcGVfZXJyb3IpOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBmcGVfZXJyb3IpOwogfQogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL01vZHVsZXMvZnV0dXJlX2J1aWx0aW5zLmMgYi9Nb2R1bGVzL2Z1dHVyZV9idWlsdGlucy5jCmluZGV4IGJjZDQyZWYuLjNkZWVjZTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZnV0dXJlX2J1aWx0aW5zLmMKKysrIGIvTW9kdWxlcy9mdXR1cmVfYnVpbHRpbnMuYwpAQCAtMjQsNyArMjQsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5faGV4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlOdW1iZXJfVG9CYXNlKHYsIDE2KTsKKyAgICByZXR1cm4gUHlOdW1iZXJfVG9CYXNlKHYsIDE2KTsKIH0KIAogUHlEb2NfU1RSVkFSKGhleF9kb2MsCkBAIC0zNiw3ICszNiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9vY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCXJldHVybiBQeU51bWJlcl9Ub0Jhc2UodiwgOCk7CisgICAgcmV0dXJuIFB5TnVtYmVyX1RvQmFzZSh2LCA4KTsKIH0KIAogUHlEb2NfU1RSVkFSKG9jdF9kb2MsCkBAIC00OCw3ICs0OCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9hc2NpaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X1JlcHIodik7CisgICAgcmV0dXJuIFB5T2JqZWN0X1JlcHIodik7CiB9CiAKIFB5RG9jX1NUUlZBUihhc2NpaV9kb2MsCkBAIC02MSwxMCArNjEsMTAgQEAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoaXMgbW9kdWxlICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfZnVuY3Rpb25zW10gPSB7Ci0gCXsiaGV4IiwJCWJ1aWx0aW5faGV4LCAgICAgICAgTUVUSF9PLCBoZXhfZG9jfSwKLSAJeyJvY3QiLAkJYnVpbHRpbl9vY3QsICAgICAgICBNRVRIX08sIG9jdF9kb2N9LAotCXsiYXNjaWkiLAlidWlsdGluX2FzY2lpLCAgICAgIE1FVEhfTywgYXNjaWlfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJoZXgiLCAgICAgICAgICAgICBidWlsdGluX2hleCwgICAgICAgIE1FVEhfTywgaGV4X2RvY30sCisgICAgeyJvY3QiLCAgICAgICAgICAgICBidWlsdGluX29jdCwgICAgICAgIE1FVEhfTywgb2N0X2RvY30sCisgICAgeyJhc2NpaSIsICAgICAgICAgICBidWlsdGluX2FzY2lpLCAgICAgIE1FVEhfTywgYXNjaWlfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogU2VudGluZWwgKi8KIH07CiAKIApAQCAtNzMsMjUgKzczLDI1IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdGZ1dHVyZV9idWlsdGlucyh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqaXRlcnRvb2xzLCAqaXRlcl9mdW5jOwotCWNoYXIgKml0X2Z1bmNzW10gPSB7ImltYXAiLCAiaWZpbHRlciIsICJpemlwIiwgTlVMTH07Ci0JY2hhciAqKmN1cl9mdW5jOworICAgIFB5T2JqZWN0ICptLCAqaXRlcnRvb2xzLCAqaXRlcl9mdW5jOworICAgIGNoYXIgKml0X2Z1bmNzW10gPSB7ImltYXAiLCAiaWZpbHRlciIsICJpemlwIiwgTlVMTH07CisgICAgY2hhciAqKmN1cl9mdW5jOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJmdXR1cmVfYnVpbHRpbnMiLCBtb2R1bGVfZnVuY3Rpb25zLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJmdXR1cmVfYnVpbHRpbnMiLCBtb2R1bGVfZnVuY3Rpb25zLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlpdGVydG9vbHMgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJpdGVydG9vbHMiKTsKLQlpZiAoaXRlcnRvb2xzID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBpdGVydG9vbHMgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJpdGVydG9vbHMiKTsKKyAgICBpZiAoaXRlcnRvb2xzID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCS8qIElmIGFueXRoaW5nIGluIHRoZSBmb2xsb3dpbmcgbG9vcCBmYWlscywgd2UgZmFsbCB0aHJvdWdoLiAqLwotCWZvciAoY3VyX2Z1bmMgPSBpdF9mdW5jczsgKmN1cl9mdW5jOyArK2N1cl9mdW5jKXsKLQkJaXRlcl9mdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhpdGVydG9vbHMsICpjdXJfZnVuYyk7Ci0JCWlmIChpdGVyX2Z1bmMgPT0gTlVMTCB8fAotCQkgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICpjdXJfZnVuYysxLCBpdGVyX2Z1bmMpIDwgMCkKLQkJCWJyZWFrOwotCX0KLQlQeV9ERUNSRUYoaXRlcnRvb2xzKTsKLQkvKiBhbnkgb3RoZXIgaW5pdGlhbGl6YXRpb24gbmVlZGVkICovCisgICAgLyogSWYgYW55dGhpbmcgaW4gdGhlIGZvbGxvd2luZyBsb29wIGZhaWxzLCB3ZSBmYWxsIHRocm91Z2guICovCisgICAgZm9yIChjdXJfZnVuYyA9IGl0X2Z1bmNzOyAqY3VyX2Z1bmM7ICsrY3VyX2Z1bmMpeworICAgICAgICBpdGVyX2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGl0ZXJ0b29scywgKmN1cl9mdW5jKTsKKyAgICAgICAgaWYgKGl0ZXJfZnVuYyA9PSBOVUxMIHx8CisgICAgICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgKmN1cl9mdW5jKzEsIGl0ZXJfZnVuYykgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdGVydG9vbHMpOworICAgIC8qIGFueSBvdGhlciBpbml0aWFsaXphdGlvbiBuZWVkZWQgKi8KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2Ntb2R1bGUuYyBiL01vZHVsZXMvZ2Ntb2R1bGUuYwppbmRleCBmZDMzOTk2Li4zODRjNDdkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2djbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9nY21vZHVsZS5jCkBAIC0xOSw3ICsxOSw3IEBACiAqLwogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCi0jaW5jbHVkZSAiZnJhbWVvYmplY3QuaCIJLyogZm9yIFB5RnJhbWVfQ2xlYXJGcmVlTGlzdCAqLworI2luY2x1ZGUgImZyYW1lb2JqZWN0LmgiICAgICAgICAvKiBmb3IgUHlGcmFtZV9DbGVhckZyZWVMaXN0ICovCiAKIC8qIEdldCBhbiBvYmplY3QncyBHQyBoZWFkICovCiAjZGVmaW5lIEFTX0dDKG8pICgoUHlHQ19IZWFkICopKG8pLTEpCkBAIC0zMCwxMCArMzAsMTAgQEAKIC8qKiogR2xvYmFsIEdDIHN0YXRlICoqKi8KIAogc3RydWN0IGdjX2dlbmVyYXRpb24gewotCVB5R0NfSGVhZCBoZWFkOwotCWludCB0aHJlc2hvbGQ7IC8qIGNvbGxlY3Rpb24gdGhyZXNob2xkICovCi0JaW50IGNvdW50OyAvKiBjb3VudCBvZiBhbGxvY2F0aW9ucyBvciBjb2xsZWN0aW9ucyBvZiB5b3VuZ2VyCi0JCSAgICAgIGdlbmVyYXRpb25zICovCisgICAgUHlHQ19IZWFkIGhlYWQ7CisgICAgaW50IHRocmVzaG9sZDsgLyogY29sbGVjdGlvbiB0aHJlc2hvbGQgKi8KKyAgICBpbnQgY291bnQ7IC8qIGNvdW50IG9mIGFsbG9jYXRpb25zIG9yIGNvbGxlY3Rpb25zIG9mIHlvdW5nZXIKKyAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zICovCiB9OwogCiAjZGVmaW5lIE5VTV9HRU5FUkFUSU9OUyAzCkBAIC00MSwxMCArNDEsMTAgQEAKIAogLyogbGlua2VkIGxpc3RzIG9mIGNvbnRhaW5lciBvYmplY3RzICovCiBzdGF0aWMgc3RydWN0IGdjX2dlbmVyYXRpb24gZ2VuZXJhdGlvbnNbTlVNX0dFTkVSQVRJT05TXSA9IHsKLQkvKiBQeUdDX0hlYWQsCQkJCXRocmVzaG9sZCwJY291bnQgKi8KLQl7e3tHRU5fSEVBRCgwKSwgR0VOX0hFQUQoMCksIDB9fSwJNzAwLAkJMH0sCi0Je3t7R0VOX0hFQUQoMSksIEdFTl9IRUFEKDEpLCAwfX0sCTEwLAkJMH0sCi0Je3t7R0VOX0hFQUQoMiksIEdFTl9IRUFEKDIpLCAwfX0sCTEwLAkJMH0sCisgICAgLyogUHlHQ19IZWFkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQsICAgICAgY291bnQgKi8KKyAgICB7e3tHRU5fSEVBRCgwKSwgR0VOX0hFQUQoMCksIDB9fSwgICAgICAgICAgIDcwMCwgICAgICAgICAgICAwfSwKKyAgICB7e3tHRU5fSEVBRCgxKSwgR0VOX0hFQUQoMSksIDB9fSwgICAgICAgICAgIDEwLCAgICAgICAgICAgICAwfSwKKyAgICB7e3tHRU5fSEVBRCgyKSwgR0VOX0hFQUQoMiksIDB9fSwgICAgICAgICAgIDEwLCAgICAgICAgICAgICAwfSwKIH07CiAKIFB5R0NfSGVhZCAqX1B5R0NfZ2VuZXJhdGlvbjAgPSBHRU5fSEVBRCgwKTsKQEAgLTg2LDcgKzg2LDcgQEAKIAogICAgSW4gYWRkaXRpb24gdG8gdGhlIHZhcmlvdXMgY29uZmlndXJhYmxlIHRocmVzaG9sZHMsIHdlIG9ubHkgdHJpZ2dlciBhCiAgICBmdWxsIGNvbGxlY3Rpb24gaWYgdGhlIHJhdGlvCi0JbG9uZ19saXZlZF9wZW5kaW5nIC8gbG9uZ19saXZlZF90b3RhbAorICAgIGxvbmdfbGl2ZWRfcGVuZGluZyAvIGxvbmdfbGl2ZWRfdG90YWwKICAgIGlzIGFib3ZlIGEgZ2l2ZW4gdmFsdWUgKGhhcmR3aXJlZCB0byAyNSUpLgogCiAgICBUaGUgcmVhc29uIGlzIHRoYXQsIHdoaWxlICJub24tZnVsbCIgY29sbGVjdGlvbnMgKGkuZS4sIGNvbGxlY3Rpb25zIG9mCkBAIC0xMDgsMjIgKzEwOCwyMiBAQAogCiAgICBUaGlzIGhldXJpc3RpYyB3YXMgc3VnZ2VzdGVkIGJ5IE1hcnRpbiB2b24gTMO2d2lzIG9uIHB5dGhvbi1kZXYgaW4KICAgIEp1bmUgMjAwOC4gSGlzIG9yaWdpbmFsIGFuYWx5c2lzIGFuZCBwcm9wb3NhbCBjYW4gYmUgZm91bmQgYXQ6Ci0JaHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDA4LUp1bmUvMDgwNTc5Lmh0bWwKKyAgICBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDgtSnVuZS8wODA1NzkuaHRtbAogKi8KIAogCiAvKiBzZXQgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBERUJVR19TVEFUUwkJKDE8PDApIC8qIHByaW50IGNvbGxlY3Rpb24gc3RhdGlzdGljcyAqLwotI2RlZmluZSBERUJVR19DT0xMRUNUQUJMRQkoMTw8MSkgLyogcHJpbnQgY29sbGVjdGFibGUgb2JqZWN0cyAqLwotI2RlZmluZSBERUJVR19VTkNPTExFQ1RBQkxFCSgxPDwyKSAvKiBwcmludCB1bmNvbGxlY3RhYmxlIG9iamVjdHMgKi8KLSNkZWZpbmUgREVCVUdfSU5TVEFOQ0VTCQkoMTw8MykgLyogcHJpbnQgaW5zdGFuY2VzICovCi0jZGVmaW5lIERFQlVHX09CSkVDVFMJCSgxPDw0KSAvKiBwcmludCBvdGhlciBvYmplY3RzICovCi0jZGVmaW5lIERFQlVHX1NBVkVBTEwJCSgxPDw1KSAvKiBzYXZlIGFsbCBnYXJiYWdlIGluIGdjLmdhcmJhZ2UgKi8KLSNkZWZpbmUgREVCVUdfTEVBSwkJREVCVUdfQ09MTEVDVEFCTEUgfCBcCi0JCQkJREVCVUdfVU5DT0xMRUNUQUJMRSB8IFwKLQkJCQlERUJVR19JTlNUQU5DRVMgfCBcCi0JCQkJREVCVUdfT0JKRUNUUyB8IFwKLQkJCQlERUJVR19TQVZFQUxMCisjZGVmaW5lIERFQlVHX1NUQVRTICAgICAgICAgICAgICgxPDwwKSAvKiBwcmludCBjb2xsZWN0aW9uIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgREVCVUdfQ09MTEVDVEFCTEUgICAgICAgKDE8PDEpIC8qIHByaW50IGNvbGxlY3RhYmxlIG9iamVjdHMgKi8KKyNkZWZpbmUgREVCVUdfVU5DT0xMRUNUQUJMRSAgICAgKDE8PDIpIC8qIHByaW50IHVuY29sbGVjdGFibGUgb2JqZWN0cyAqLworI2RlZmluZSBERUJVR19JTlNUQU5DRVMgICAgICAgICAoMTw8MykgLyogcHJpbnQgaW5zdGFuY2VzICovCisjZGVmaW5lIERFQlVHX09CSkVDVFMgICAgICAgICAgICgxPDw0KSAvKiBwcmludCBvdGhlciBvYmplY3RzICovCisjZGVmaW5lIERFQlVHX1NBVkVBTEwgICAgICAgICAgICgxPDw1KSAvKiBzYXZlIGFsbCBnYXJiYWdlIGluIGdjLmdhcmJhZ2UgKi8KKyNkZWZpbmUgREVCVUdfTEVBSyAgICAgICAgICAgICAgREVCVUdfQ09MTEVDVEFCTEUgfCBcCisgICAgICAgICAgICAgICAgREVCVUdfVU5DT0xMRUNUQUJMRSB8IFwKKyAgICAgICAgICAgICAgICBERUJVR19JTlNUQU5DRVMgfCBcCisgICAgICAgICAgICAgICAgREVCVUdfT0JKRUNUUyB8IFwKKyAgICAgICAgICAgICAgICBERUJVR19TQVZFQUxMCiBzdGF0aWMgaW50IGRlYnVnOwogc3RhdGljIFB5T2JqZWN0ICp0bW9kID0gTlVMTDsKIApAQCAtMTY2LDI4ICsxNjYsMjggQEAKICAgICBpdCBoYXMgYSBfX2RlbF9fIG1ldGhvZCksIGl0cyBnY19yZWZzIGlzIHJlc3RvcmVkIHRvIEdDX1JFQUNIQUJMRSBhZ2Fpbi4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCi0jZGVmaW5lIEdDX1VOVFJBQ0tFRAkJCV9QeUdDX1JFRlNfVU5UUkFDS0VECi0jZGVmaW5lIEdDX1JFQUNIQUJMRQkJCV9QeUdDX1JFRlNfUkVBQ0hBQkxFCi0jZGVmaW5lIEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFCV9QeUdDX1JFRlNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUKKyNkZWZpbmUgR0NfVU5UUkFDS0VEICAgICAgICAgICAgICAgICAgICBfUHlHQ19SRUZTX1VOVFJBQ0tFRAorI2RlZmluZSBHQ19SRUFDSEFCTEUgICAgICAgICAgICAgICAgICAgIF9QeUdDX1JFRlNfUkVBQ0hBQkxFCisjZGVmaW5lIEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFICAgICAgX1B5R0NfUkVGU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRQogCiAjZGVmaW5lIElTX1RSQUNLRUQobykgKChBU19HQyhvKSktPmdjLmdjX3JlZnMgIT0gR0NfVU5UUkFDS0VEKQogI2RlZmluZSBJU19SRUFDSEFCTEUobykgKChBU19HQyhvKSktPmdjLmdjX3JlZnMgPT0gR0NfUkVBQ0hBQkxFKQogI2RlZmluZSBJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvKSAoIFwKLQkoQVNfR0MobykpLT5nYy5nY19yZWZzID09IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKQorICAgIChBU19HQyhvKSktPmdjLmdjX3JlZnMgPT0gR0NfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUpCiAKIC8qKiogbGlzdCBmdW5jdGlvbnMgKioqLwogCiBzdGF0aWMgdm9pZAogZ2NfbGlzdF9pbml0KFB5R0NfSGVhZCAqbGlzdCkKIHsKLQlsaXN0LT5nYy5nY19wcmV2ID0gbGlzdDsKLQlsaXN0LT5nYy5nY19uZXh0ID0gbGlzdDsKKyAgICBsaXN0LT5nYy5nY19wcmV2ID0gbGlzdDsKKyAgICBsaXN0LT5nYy5nY19uZXh0ID0gbGlzdDsKIH0KIAogc3RhdGljIGludAogZ2NfbGlzdF9pc19lbXB0eShQeUdDX0hlYWQgKmxpc3QpCiB7Ci0JcmV0dXJuIChsaXN0LT5nYy5nY19uZXh0ID09IGxpc3QpOworICAgIHJldHVybiAobGlzdC0+Z2MuZ2NfbmV4dCA9PSBsaXN0KTsKIH0KIAogI2lmIDAKQEAgLTE5NiwxMCArMTk2LDEwIEBACiBzdGF0aWMgdm9pZAogZ2NfbGlzdF9hcHBlbmQoUHlHQ19IZWFkICpub2RlLCBQeUdDX0hlYWQgKmxpc3QpCiB7Ci0Jbm9kZS0+Z2MuZ2NfbmV4dCA9IGxpc3Q7Ci0Jbm9kZS0+Z2MuZ2NfcHJldiA9IGxpc3QtPmdjLmdjX3ByZXY7Ci0Jbm9kZS0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IG5vZGU7Ci0JbGlzdC0+Z2MuZ2NfcHJldiA9IG5vZGU7CisgICAgbm9kZS0+Z2MuZ2NfbmV4dCA9IGxpc3Q7CisgICAgbm9kZS0+Z2MuZ2NfcHJldiA9IGxpc3QtPmdjLmdjX3ByZXY7CisgICAgbm9kZS0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IG5vZGU7CisgICAgbGlzdC0+Z2MuZ2NfcHJldiA9IG5vZGU7CiB9CiAjZW5kaWYKIApAQCAtMjA3LDkgKzIwNyw5IEBACiBzdGF0aWMgdm9pZAogZ2NfbGlzdF9yZW1vdmUoUHlHQ19IZWFkICpub2RlKQogewotCW5vZGUtPmdjLmdjX3ByZXYtPmdjLmdjX25leHQgPSBub2RlLT5nYy5nY19uZXh0OwotCW5vZGUtPmdjLmdjX25leHQtPmdjLmdjX3ByZXYgPSBub2RlLT5nYy5nY19wcmV2OwotCW5vZGUtPmdjLmdjX25leHQgPSBOVUxMOyAvKiBvYmplY3QgaXMgbm90IGN1cnJlbnRseSB0cmFja2VkICovCisgICAgbm9kZS0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IG5vZGUtPmdjLmdjX25leHQ7CisgICAgbm9kZS0+Z2MuZ2NfbmV4dC0+Z2MuZ2NfcHJldiA9IG5vZGUtPmdjLmdjX3ByZXY7CisgICAgbm9kZS0+Z2MuZ2NfbmV4dCA9IE5VTEw7IC8qIG9iamVjdCBpcyBub3QgY3VycmVudGx5IHRyYWNrZWQgKi8KIH0KIAogLyogTW92ZSBgbm9kZWAgZnJvbSB0aGUgZ2MgbGlzdCBpdCdzIGN1cnJlbnRseSBpbiAod2hpY2ggaXMgbm90IGV4cGxpY2l0bHkKQEAgLTIxOSw0MyArMjE5LDQzIEBACiBzdGF0aWMgdm9pZAogZ2NfbGlzdF9tb3ZlKFB5R0NfSGVhZCAqbm9kZSwgUHlHQ19IZWFkICpsaXN0KQogewotCVB5R0NfSGVhZCAqbmV3X3ByZXY7Ci0JUHlHQ19IZWFkICpjdXJyZW50X3ByZXYgPSBub2RlLT5nYy5nY19wcmV2OwotCVB5R0NfSGVhZCAqY3VycmVudF9uZXh0ID0gbm9kZS0+Z2MuZ2NfbmV4dDsKLQkvKiBVbmxpbmsgZnJvbSBjdXJyZW50IGxpc3QuICovCi0JY3VycmVudF9wcmV2LT5nYy5nY19uZXh0ID0gY3VycmVudF9uZXh0OwotCWN1cnJlbnRfbmV4dC0+Z2MuZ2NfcHJldiA9IGN1cnJlbnRfcHJldjsKLQkvKiBSZWxpbmsgYXQgZW5kIG9mIG5ldyBsaXN0LiAqLwotCW5ld19wcmV2ID0gbm9kZS0+Z2MuZ2NfcHJldiA9IGxpc3QtPmdjLmdjX3ByZXY7Ci0JbmV3X3ByZXYtPmdjLmdjX25leHQgPSBsaXN0LT5nYy5nY19wcmV2ID0gbm9kZTsKLQlub2RlLT5nYy5nY19uZXh0ID0gbGlzdDsKKyAgICBQeUdDX0hlYWQgKm5ld19wcmV2OworICAgIFB5R0NfSGVhZCAqY3VycmVudF9wcmV2ID0gbm9kZS0+Z2MuZ2NfcHJldjsKKyAgICBQeUdDX0hlYWQgKmN1cnJlbnRfbmV4dCA9IG5vZGUtPmdjLmdjX25leHQ7CisgICAgLyogVW5saW5rIGZyb20gY3VycmVudCBsaXN0LiAqLworICAgIGN1cnJlbnRfcHJldi0+Z2MuZ2NfbmV4dCA9IGN1cnJlbnRfbmV4dDsKKyAgICBjdXJyZW50X25leHQtPmdjLmdjX3ByZXYgPSBjdXJyZW50X3ByZXY7CisgICAgLyogUmVsaW5rIGF0IGVuZCBvZiBuZXcgbGlzdC4gKi8KKyAgICBuZXdfcHJldiA9IG5vZGUtPmdjLmdjX3ByZXYgPSBsaXN0LT5nYy5nY19wcmV2OworICAgIG5ld19wcmV2LT5nYy5nY19uZXh0ID0gbGlzdC0+Z2MuZ2NfcHJldiA9IG5vZGU7CisgICAgbm9kZS0+Z2MuZ2NfbmV4dCA9IGxpc3Q7CiB9CiAKIC8qIGFwcGVuZCBsaXN0IGBmcm9tYCBvbnRvIGxpc3QgYHRvYDsgYGZyb21gIGJlY29tZXMgYW4gZW1wdHkgbGlzdCAqLwogc3RhdGljIHZvaWQKIGdjX2xpc3RfbWVyZ2UoUHlHQ19IZWFkICpmcm9tLCBQeUdDX0hlYWQgKnRvKQogewotCVB5R0NfSGVhZCAqdGFpbDsKLQlhc3NlcnQoZnJvbSAhPSB0byk7Ci0JaWYgKCFnY19saXN0X2lzX2VtcHR5KGZyb20pKSB7Ci0JCXRhaWwgPSB0by0+Z2MuZ2NfcHJldjsKLQkJdGFpbC0+Z2MuZ2NfbmV4dCA9IGZyb20tPmdjLmdjX25leHQ7Ci0JCXRhaWwtPmdjLmdjX25leHQtPmdjLmdjX3ByZXYgPSB0YWlsOwotCQl0by0+Z2MuZ2NfcHJldiA9IGZyb20tPmdjLmdjX3ByZXY7Ci0JCXRvLT5nYy5nY19wcmV2LT5nYy5nY19uZXh0ID0gdG87Ci0JfQotCWdjX2xpc3RfaW5pdChmcm9tKTsKKyAgICBQeUdDX0hlYWQgKnRhaWw7CisgICAgYXNzZXJ0KGZyb20gIT0gdG8pOworICAgIGlmICghZ2NfbGlzdF9pc19lbXB0eShmcm9tKSkgeworICAgICAgICB0YWlsID0gdG8tPmdjLmdjX3ByZXY7CisgICAgICAgIHRhaWwtPmdjLmdjX25leHQgPSBmcm9tLT5nYy5nY19uZXh0OworICAgICAgICB0YWlsLT5nYy5nY19uZXh0LT5nYy5nY19wcmV2ID0gdGFpbDsKKyAgICAgICAgdG8tPmdjLmdjX3ByZXYgPSBmcm9tLT5nYy5nY19wcmV2OworICAgICAgICB0by0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IHRvOworICAgIH0KKyAgICBnY19saXN0X2luaXQoZnJvbSk7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBnY19saXN0X3NpemUoUHlHQ19IZWFkICpsaXN0KQogewotCVB5R0NfSGVhZCAqZ2M7Ci0JUHlfc3NpemVfdCBuID0gMDsKLQlmb3IgKGdjID0gbGlzdC0+Z2MuZ2NfbmV4dDsgZ2MgIT0gbGlzdDsgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgewotCQluKys7Ci0JfQotCXJldHVybiBuOworICAgIFB5R0NfSGVhZCAqZ2M7CisgICAgUHlfc3NpemVfdCBuID0gMDsKKyAgICBmb3IgKGdjID0gbGlzdC0+Z2MuZ2NfbmV4dDsgZ2MgIT0gbGlzdDsgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgeworICAgICAgICBuKys7CisgICAgfQorICAgIHJldHVybiBuOwogfQogCiAvKiBBcHBlbmQgb2JqZWN0cyBpbiBhIEdDIGxpc3QgdG8gYSBQeXRob24gbGlzdC4KQEAgLTI2NCwxNiArMjY0LDE2IEBACiBzdGF0aWMgaW50CiBhcHBlbmRfb2JqZWN0cyhQeU9iamVjdCAqcHlfbGlzdCwgUHlHQ19IZWFkICpnY19saXN0KQogewotCVB5R0NfSGVhZCAqZ2M7Ci0JZm9yIChnYyA9IGdjX2xpc3QtPmdjLmdjX25leHQ7IGdjICE9IGdjX2xpc3Q7IGdjID0gZ2MtPmdjLmdjX25leHQpIHsKLQkJUHlPYmplY3QgKm9wID0gRlJPTV9HQyhnYyk7Ci0JCWlmIChvcCAhPSBweV9saXN0KSB7Ci0JCQlpZiAoUHlMaXN0X0FwcGVuZChweV9saXN0LCBvcCkpIHsKLQkJCQlyZXR1cm4gLTE7IC8qIGV4Y2VwdGlvbiAqLwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOworICAgIFB5R0NfSGVhZCAqZ2M7CisgICAgZm9yIChnYyA9IGdjX2xpc3QtPmdjLmdjX25leHQ7IGdjICE9IGdjX2xpc3Q7IGdjID0gZ2MtPmdjLmdjX25leHQpIHsKKyAgICAgICAgUHlPYmplY3QgKm9wID0gRlJPTV9HQyhnYyk7CisgICAgICAgIGlmIChvcCAhPSBweV9saXN0KSB7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChweV9saXN0LCBvcCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7IC8qIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKioqIGVuZCBvZiBsaXN0IHN0dWZmICoqKi8KQEAgLTI4Niw0OCArMjg2LDQ4IEBACiBzdGF0aWMgdm9pZAogdXBkYXRlX3JlZnMoUHlHQ19IZWFkICpjb250YWluZXJzKQogewotCVB5R0NfSGVhZCAqZ2MgPSBjb250YWluZXJzLT5nYy5nY19uZXh0OwotCWZvciAoOyBnYyAhPSBjb250YWluZXJzOyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7Ci0JCWFzc2VydChnYy0+Z2MuZ2NfcmVmcyA9PSBHQ19SRUFDSEFCTEUpOwotCQlnYy0+Z2MuZ2NfcmVmcyA9IFB5X1JFRkNOVChGUk9NX0dDKGdjKSk7Ci0JCS8qIFB5dGhvbidzIGN5Y2xpYyBnYyBzaG91bGQgbmV2ZXIgc2VlIGFuIGluY29taW5nIHJlZmNvdW50Ci0JCSAqIG9mIDA6ICBpZiBzb21ldGhpbmcgZGVjcmVmJ2VkIHRvIDAsIGl0IHNob3VsZCBoYXZlIGJlZW4KLQkJICogZGVhbGxvY2F0ZWQgaW1tZWRpYXRlbHkgYXQgdGhhdCB0aW1lLgotCQkgKiBQb3NzaWJsZSBjYXVzZSAoaWYgdGhlIGFzc2VydCB0cmlnZ2Vycyk6ICBhIHRwX2RlYWxsb2MKLQkJICogcm91dGluZSBsZWZ0IGEgZ2MtYXdhcmUgb2JqZWN0IHRyYWNrZWQgZHVyaW5nIGl0cyB0ZWFyZG93bgotCQkgKiBwaGFzZSwgYW5kIGRpZCBzb21ldGhpbmctLSBvciBhbGxvd2VkIHNvbWV0aGluZyB0byBoYXBwZW4gLS0KLQkJICogdGhhdCBjYWxsZWQgYmFjayBpbnRvIFB5dGhvbi4gIGdjIGNhbiB0cmlnZ2VyIHRoZW4sIGFuZCBtYXkKLQkJICogc2VlIHRoZSBzdGlsbC10cmFja2VkIGR5aW5nIG9iamVjdC4gIEJlZm9yZSB0aGlzIGFzc2VydAotCQkgKiB3YXMgYWRkZWQsIHN1Y2ggbWlzdGFrZXMgd2VudCBvbiB0byBhbGxvdyBnYyB0byB0cnkgdG8KLQkJICogZGVsZXRlIHRoZSBvYmplY3QgYWdhaW4uICBJbiBhIGRlYnVnIGJ1aWxkLCB0aGF0IGNhdXNlZAotCQkgKiBhIG15c3RlcmlvdXMgc2VnZmF1bHQsIHdoZW4gX1B5X0ZvcmdldFJlZmVyZW5jZSB0cmllZAotCQkgKiB0byByZW1vdmUgdGhlIG9iamVjdCBmcm9tIHRoZSBkb3VibHktbGlua2VkIGxpc3Qgb2YgYWxsCi0JCSAqIG9iamVjdHMgYSBzZWNvbmQgdGltZS4gIEluIGEgcmVsZWFzZSBidWlsZCwgYW4gYWN0dWFsCi0JCSAqIGRvdWJsZSBkZWFsbG9jYXRpb24gb2NjdXJyZWQsIHdoaWNoIGxlYWRzIHRvIGNvcnJ1cHRpb24KLQkJICogb2YgdGhlIGFsbG9jYXRvcidzIGludGVybmFsIGJvb2trZWVwaW5nIHBvaW50ZXJzLiAgVGhhdCdzCi0JCSAqIHNvIHNlcmlvdXMgdGhhdCBtYXliZSB0aGlzIHNob3VsZCBiZSBhIHJlbGVhc2UtYnVpbGQKLQkJICogY2hlY2sgaW5zdGVhZCBvZiBhbiBhc3NlcnQ/Ci0JCSAqLwotCQlhc3NlcnQoZ2MtPmdjLmdjX3JlZnMgIT0gMCk7Ci0JfQorICAgIFB5R0NfSGVhZCAqZ2MgPSBjb250YWluZXJzLT5nYy5nY19uZXh0OworICAgIGZvciAoOyBnYyAhPSBjb250YWluZXJzOyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7CisgICAgICAgIGFzc2VydChnYy0+Z2MuZ2NfcmVmcyA9PSBHQ19SRUFDSEFCTEUpOworICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IFB5X1JFRkNOVChGUk9NX0dDKGdjKSk7CisgICAgICAgIC8qIFB5dGhvbidzIGN5Y2xpYyBnYyBzaG91bGQgbmV2ZXIgc2VlIGFuIGluY29taW5nIHJlZmNvdW50CisgICAgICAgICAqIG9mIDA6ICBpZiBzb21ldGhpbmcgZGVjcmVmJ2VkIHRvIDAsIGl0IHNob3VsZCBoYXZlIGJlZW4KKyAgICAgICAgICogZGVhbGxvY2F0ZWQgaW1tZWRpYXRlbHkgYXQgdGhhdCB0aW1lLgorICAgICAgICAgKiBQb3NzaWJsZSBjYXVzZSAoaWYgdGhlIGFzc2VydCB0cmlnZ2Vycyk6ICBhIHRwX2RlYWxsb2MKKyAgICAgICAgICogcm91dGluZSBsZWZ0IGEgZ2MtYXdhcmUgb2JqZWN0IHRyYWNrZWQgZHVyaW5nIGl0cyB0ZWFyZG93bgorICAgICAgICAgKiBwaGFzZSwgYW5kIGRpZCBzb21ldGhpbmctLSBvciBhbGxvd2VkIHNvbWV0aGluZyB0byBoYXBwZW4gLS0KKyAgICAgICAgICogdGhhdCBjYWxsZWQgYmFjayBpbnRvIFB5dGhvbi4gIGdjIGNhbiB0cmlnZ2VyIHRoZW4sIGFuZCBtYXkKKyAgICAgICAgICogc2VlIHRoZSBzdGlsbC10cmFja2VkIGR5aW5nIG9iamVjdC4gIEJlZm9yZSB0aGlzIGFzc2VydAorICAgICAgICAgKiB3YXMgYWRkZWQsIHN1Y2ggbWlzdGFrZXMgd2VudCBvbiB0byBhbGxvdyBnYyB0byB0cnkgdG8KKyAgICAgICAgICogZGVsZXRlIHRoZSBvYmplY3QgYWdhaW4uICBJbiBhIGRlYnVnIGJ1aWxkLCB0aGF0IGNhdXNlZAorICAgICAgICAgKiBhIG15c3RlcmlvdXMgc2VnZmF1bHQsIHdoZW4gX1B5X0ZvcmdldFJlZmVyZW5jZSB0cmllZAorICAgICAgICAgKiB0byByZW1vdmUgdGhlIG9iamVjdCBmcm9tIHRoZSBkb3VibHktbGlua2VkIGxpc3Qgb2YgYWxsCisgICAgICAgICAqIG9iamVjdHMgYSBzZWNvbmQgdGltZS4gIEluIGEgcmVsZWFzZSBidWlsZCwgYW4gYWN0dWFsCisgICAgICAgICAqIGRvdWJsZSBkZWFsbG9jYXRpb24gb2NjdXJyZWQsIHdoaWNoIGxlYWRzIHRvIGNvcnJ1cHRpb24KKyAgICAgICAgICogb2YgdGhlIGFsbG9jYXRvcidzIGludGVybmFsIGJvb2trZWVwaW5nIHBvaW50ZXJzLiAgVGhhdCdzCisgICAgICAgICAqIHNvIHNlcmlvdXMgdGhhdCBtYXliZSB0aGlzIHNob3VsZCBiZSBhIHJlbGVhc2UtYnVpbGQKKyAgICAgICAgICogY2hlY2sgaW5zdGVhZCBvZiBhbiBhc3NlcnQ/CisgICAgICAgICAqLworICAgICAgICBhc3NlcnQoZ2MtPmdjLmdjX3JlZnMgIT0gMCk7CisgICAgfQogfQogCiAvKiBBIHRyYXZlcnNhbCBjYWxsYmFjayBmb3Igc3VidHJhY3RfcmVmcy4gKi8KIHN0YXRpYyBpbnQKIHZpc2l0X2RlY3JlZihQeU9iamVjdCAqb3AsIHZvaWQgKmRhdGEpCiB7Ci0gICAgICAgIGFzc2VydChvcCAhPSBOVUxMKTsKLQlpZiAoUHlPYmplY3RfSVNfR0Mob3ApKSB7Ci0JCVB5R0NfSGVhZCAqZ2MgPSBBU19HQyhvcCk7Ci0JCS8qIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBnY19yZWZzIGZvciBvYmplY3RzIGluIHRoZQotCQkgKiBnZW5lcmF0aW9uIGJlaW5nIGNvbGxlY3RlZCwgd2hpY2ggY2FuIGJlIHJlY29nbml6ZWQKLQkJICogYmVjYXVzZSBvbmx5IHRoZXkgaGF2ZSBwb3NpdGl2ZSBnY19yZWZzLgotCQkgKi8KLQkJYXNzZXJ0KGdjLT5nYy5nY19yZWZzICE9IDApOyAvKiBlbHNlIHJlZmNvdW50IHdhcyB0b28gc21hbGwgKi8KLQkJaWYgKGdjLT5nYy5nY19yZWZzID4gMCkKLQkJCWdjLT5nYy5nY19yZWZzLS07Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChvcCAhPSBOVUxMKTsKKyAgICBpZiAoUHlPYmplY3RfSVNfR0Mob3ApKSB7CisgICAgICAgIFB5R0NfSGVhZCAqZ2MgPSBBU19HQyhvcCk7CisgICAgICAgIC8qIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBnY19yZWZzIGZvciBvYmplY3RzIGluIHRoZQorICAgICAgICAgKiBnZW5lcmF0aW9uIGJlaW5nIGNvbGxlY3RlZCwgd2hpY2ggY2FuIGJlIHJlY29nbml6ZWQKKyAgICAgICAgICogYmVjYXVzZSBvbmx5IHRoZXkgaGF2ZSBwb3NpdGl2ZSBnY19yZWZzLgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KGdjLT5nYy5nY19yZWZzICE9IDApOyAvKiBlbHNlIHJlZmNvdW50IHdhcyB0b28gc21hbGwgKi8KKyAgICAgICAgaWYgKGdjLT5nYy5nY19yZWZzID4gMCkKKyAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzLS07CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBTdWJ0cmFjdCBpbnRlcm5hbCByZWZlcmVuY2VzIGZyb20gZ2NfcmVmcy4gIEFmdGVyIHRoaXMsIGdjX3JlZnMgaXMgPj0gMApAQCAtMzM4LDU3ICszMzgsNTcgQEAKIHN0YXRpYyB2b2lkCiBzdWJ0cmFjdF9yZWZzKFB5R0NfSGVhZCAqY29udGFpbmVycykKIHsKLQl0cmF2ZXJzZXByb2MgdHJhdmVyc2U7Ci0JUHlHQ19IZWFkICpnYyA9IGNvbnRhaW5lcnMtPmdjLmdjX25leHQ7Ci0JZm9yICg7IGdjICE9IGNvbnRhaW5lcnM7IGdjPWdjLT5nYy5nY19uZXh0KSB7Ci0JCXRyYXZlcnNlID0gUHlfVFlQRShGUk9NX0dDKGdjKSktPnRwX3RyYXZlcnNlOwotCQkodm9pZCkgdHJhdmVyc2UoRlJPTV9HQyhnYyksCi0JCQkgICAgICAgKHZpc2l0cHJvYyl2aXNpdF9kZWNyZWYsCi0JCQkgICAgICAgTlVMTCk7Ci0JfQorICAgIHRyYXZlcnNlcHJvYyB0cmF2ZXJzZTsKKyAgICBQeUdDX0hlYWQgKmdjID0gY29udGFpbmVycy0+Z2MuZ2NfbmV4dDsKKyAgICBmb3IgKDsgZ2MgIT0gY29udGFpbmVyczsgZ2M9Z2MtPmdjLmdjX25leHQpIHsKKyAgICAgICAgdHJhdmVyc2UgPSBQeV9UWVBFKEZST01fR0MoZ2MpKS0+dHBfdHJhdmVyc2U7CisgICAgICAgICh2b2lkKSB0cmF2ZXJzZShGUk9NX0dDKGdjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHZpc2l0cHJvYyl2aXNpdF9kZWNyZWYsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KIH0KIAogLyogQSB0cmF2ZXJzYWwgY2FsbGJhY2sgZm9yIG1vdmVfdW5yZWFjaGFibGUuICovCiBzdGF0aWMgaW50CiB2aXNpdF9yZWFjaGFibGUoUHlPYmplY3QgKm9wLCBQeUdDX0hlYWQgKnJlYWNoYWJsZSkKIHsKLQlpZiAoUHlPYmplY3RfSVNfR0Mob3ApKSB7Ci0JCVB5R0NfSGVhZCAqZ2MgPSBBU19HQyhvcCk7Ci0JCWNvbnN0IFB5X3NzaXplX3QgZ2NfcmVmcyA9IGdjLT5nYy5nY19yZWZzOworICAgIGlmIChQeU9iamVjdF9JU19HQyhvcCkpIHsKKyAgICAgICAgUHlHQ19IZWFkICpnYyA9IEFTX0dDKG9wKTsKKyAgICAgICAgY29uc3QgUHlfc3NpemVfdCBnY19yZWZzID0gZ2MtPmdjLmdjX3JlZnM7CiAKLQkJaWYgKGdjX3JlZnMgPT0gMCkgewotCQkJLyogVGhpcyBpcyBpbiBtb3ZlX3VucmVhY2hhYmxlJ3MgJ3lvdW5nJyBsaXN0LCBidXQKLQkJCSAqIHRoZSB0cmF2ZXJzYWwgaGFzbid0IHlldCBnb3R0ZW4gdG8gaXQuICBBbGwKLQkJCSAqIHdlIG5lZWQgdG8gZG8gaXMgdGVsbCBtb3ZlX3VucmVhY2hhYmxlIHRoYXQgaXQncwotCQkJICogcmVhY2hhYmxlLgotCQkJICovCi0JCQlnYy0+Z2MuZ2NfcmVmcyA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoZ2NfcmVmcyA9PSBHQ19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRSkgewotCQkJLyogVGhpcyBoYWQgZ2NfcmVmcyA9IDAgd2hlbiBtb3ZlX3VucmVhY2hhYmxlIGdvdAotCQkJICogdG8gaXQsIGJ1dCB0dXJucyBvdXQgaXQncyByZWFjaGFibGUgYWZ0ZXIgYWxsLgotCQkJICogTW92ZSBpdCBiYWNrIHRvIG1vdmVfdW5yZWFjaGFibGUncyAneW91bmcnIGxpc3QsCi0JCQkgKiBhbmQgbW92ZV91bnJlYWNoYWJsZSB3aWxsIGV2ZW50dWFsbHkgZ2V0IHRvIGl0Ci0JCQkgKiBhZ2Fpbi4KLQkJCSAqLwotCQkJZ2NfbGlzdF9tb3ZlKGdjLCByZWFjaGFibGUpOwotCQkJZ2MtPmdjLmdjX3JlZnMgPSAxOwotCQl9Ci0JCS8qIEVsc2UgdGhlcmUncyBub3RoaW5nIHRvIGRvLgotCQkgKiBJZiBnY19yZWZzID4gMCwgaXQgbXVzdCBiZSBpbiBtb3ZlX3VucmVhY2hhYmxlJ3MgJ3lvdW5nJwotCQkgKiBsaXN0LCBhbmQgbW92ZV91bnJlYWNoYWJsZSB3aWxsIGV2ZW50dWFsbHkgZ2V0IHRvIGl0LgotCQkgKiBJZiBnY19yZWZzID09IEdDX1JFQUNIQUJMRSwgaXQncyBlaXRoZXIgaW4gc29tZSBvdGhlcgotCQkgKiBnZW5lcmF0aW9uIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgaXQsIG9yIG1vdmVfdW5yZWFjaGFibGUKLQkJICogYWxyZWFkeSBkZWFsdCB3aXRoIGl0LgotCQkgKiBJZiBnY19yZWZzID09IEdDX1VOVFJBQ0tFRCwgaXQgbXVzdCBiZSBpZ25vcmVkLgotCQkgKi8KLQkJIGVsc2UgewotCQkgCWFzc2VydChnY19yZWZzID4gMAotCQkgCSAgICAgICB8fCBnY19yZWZzID09IEdDX1JFQUNIQUJMRQotCQkgCSAgICAgICB8fCBnY19yZWZzID09IEdDX1VOVFJBQ0tFRCk7Ci0JCSB9Ci0JfQotCXJldHVybiAwOworICAgICAgICBpZiAoZ2NfcmVmcyA9PSAwKSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIGluIG1vdmVfdW5yZWFjaGFibGUncyAneW91bmcnIGxpc3QsIGJ1dAorICAgICAgICAgICAgICogdGhlIHRyYXZlcnNhbCBoYXNuJ3QgeWV0IGdvdHRlbiB0byBpdC4gIEFsbAorICAgICAgICAgICAgICogd2UgbmVlZCB0byBkbyBpcyB0ZWxsIG1vdmVfdW5yZWFjaGFibGUgdGhhdCBpdCdzCisgICAgICAgICAgICAgKiByZWFjaGFibGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChnY19yZWZzID09IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKSB7CisgICAgICAgICAgICAvKiBUaGlzIGhhZCBnY19yZWZzID0gMCB3aGVuIG1vdmVfdW5yZWFjaGFibGUgZ290CisgICAgICAgICAgICAgKiB0byBpdCwgYnV0IHR1cm5zIG91dCBpdCdzIHJlYWNoYWJsZSBhZnRlciBhbGwuCisgICAgICAgICAgICAgKiBNb3ZlIGl0IGJhY2sgdG8gbW92ZV91bnJlYWNoYWJsZSdzICd5b3VuZycgbGlzdCwKKyAgICAgICAgICAgICAqIGFuZCBtb3ZlX3VucmVhY2hhYmxlIHdpbGwgZXZlbnR1YWxseSBnZXQgdG8gaXQKKyAgICAgICAgICAgICAqIGFnYWluLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBnY19saXN0X21vdmUoZ2MsIHJlYWNoYWJsZSk7CisgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgLyogRWxzZSB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCisgICAgICAgICAqIElmIGdjX3JlZnMgPiAwLCBpdCBtdXN0IGJlIGluIG1vdmVfdW5yZWFjaGFibGUncyAneW91bmcnCisgICAgICAgICAqIGxpc3QsIGFuZCBtb3ZlX3VucmVhY2hhYmxlIHdpbGwgZXZlbnR1YWxseSBnZXQgdG8gaXQuCisgICAgICAgICAqIElmIGdjX3JlZnMgPT0gR0NfUkVBQ0hBQkxFLCBpdCdzIGVpdGhlciBpbiBzb21lIG90aGVyCisgICAgICAgICAqIGdlbmVyYXRpb24gc28gd2UgZG9uJ3QgY2FyZSBhYm91dCBpdCwgb3IgbW92ZV91bnJlYWNoYWJsZQorICAgICAgICAgKiBhbHJlYWR5IGRlYWx0IHdpdGggaXQuCisgICAgICAgICAqIElmIGdjX3JlZnMgPT0gR0NfVU5UUkFDS0VELCBpdCBtdXN0IGJlIGlnbm9yZWQuCisgICAgICAgICAqLworICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoZ2NfcmVmcyA+IDAKKyAgICAgICAgICAgICAgICAgICB8fCBnY19yZWZzID09IEdDX1JFQUNIQUJMRQorICAgICAgICAgICAgICAgICAgIHx8IGdjX3JlZnMgPT0gR0NfVU5UUkFDS0VEKTsKKyAgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIE1vdmUgdGhlIHVucmVhY2hhYmxlIG9iamVjdHMgZnJvbSB5b3VuZyB0byB1bnJlYWNoYWJsZS4gIEFmdGVyIHRoaXMsCkBAIC00MDIsNTggKzQwMiw1OCBAQAogc3RhdGljIHZvaWQKIG1vdmVfdW5yZWFjaGFibGUoUHlHQ19IZWFkICp5b3VuZywgUHlHQ19IZWFkICp1bnJlYWNoYWJsZSkKIHsKLQlQeUdDX0hlYWQgKmdjID0geW91bmctPmdjLmdjX25leHQ7CisgICAgUHlHQ19IZWFkICpnYyA9IHlvdW5nLT5nYy5nY19uZXh0OwogCi0JLyogSW52YXJpYW50czogIGFsbCBvYmplY3RzICJ0byB0aGUgbGVmdCIgb2YgdXMgaW4geW91bmcgaGF2ZSBnY19yZWZzCi0JICogPSBHQ19SRUFDSEFCTEUsIGFuZCBhcmUgaW5kZWVkIHJlYWNoYWJsZSAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKLQkgKiBmcm9tIG91dHNpZGUgdGhlIHlvdW5nIGxpc3QgYXMgaXQgd2FzIGF0IGVudHJ5LiAgQWxsIG90aGVyIG9iamVjdHMKLQkgKiBmcm9tIHRoZSBvcmlnaW5hbCB5b3VuZyAidG8gdGhlIGxlZnQiIG9mIHVzIGFyZSBpbiB1bnJlYWNoYWJsZSBub3csCi0JICogYW5kIGhhdmUgZ2NfcmVmcyA9IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFLiAgQWxsIG9iamVjdHMgdG8gdGhlCi0JICogbGVmdCBvZiB1cyBpbiAneW91bmcnIG5vdyBoYXZlIGJlZW4gc2Nhbm5lZCwgYW5kIG5vIG9iamVjdHMgaGVyZQotCSAqIG9yIHRvIHRoZSByaWdodCBoYXZlIGJlZW4gc2Nhbm5lZCB5ZXQuCi0JICovCisgICAgLyogSW52YXJpYW50czogIGFsbCBvYmplY3RzICJ0byB0aGUgbGVmdCIgb2YgdXMgaW4geW91bmcgaGF2ZSBnY19yZWZzCisgICAgICogPSBHQ19SRUFDSEFCTEUsIGFuZCBhcmUgaW5kZWVkIHJlYWNoYWJsZSAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKKyAgICAgKiBmcm9tIG91dHNpZGUgdGhlIHlvdW5nIGxpc3QgYXMgaXQgd2FzIGF0IGVudHJ5LiAgQWxsIG90aGVyIG9iamVjdHMKKyAgICAgKiBmcm9tIHRoZSBvcmlnaW5hbCB5b3VuZyAidG8gdGhlIGxlZnQiIG9mIHVzIGFyZSBpbiB1bnJlYWNoYWJsZSBub3csCisgICAgICogYW5kIGhhdmUgZ2NfcmVmcyA9IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFLiAgQWxsIG9iamVjdHMgdG8gdGhlCisgICAgICogbGVmdCBvZiB1cyBpbiAneW91bmcnIG5vdyBoYXZlIGJlZW4gc2Nhbm5lZCwgYW5kIG5vIG9iamVjdHMgaGVyZQorICAgICAqIG9yIHRvIHRoZSByaWdodCBoYXZlIGJlZW4gc2Nhbm5lZCB5ZXQuCisgICAgICovCiAKLQl3aGlsZSAoZ2MgIT0geW91bmcpIHsKLQkJUHlHQ19IZWFkICpuZXh0OworICAgIHdoaWxlIChnYyAhPSB5b3VuZykgeworICAgICAgICBQeUdDX0hlYWQgKm5leHQ7CiAKLQkJaWYgKGdjLT5nYy5nY19yZWZzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBnYyBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBmcm9tIG91dHNpZGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvcmlnaW5hbCAneW91bmcnLiAgTWFyayBpdCBhcyBzdWNoLCBhbmQgdHJhdmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGl0cyBwb2ludGVycyB0byBmaW5kIGFueSBvdGhlciBvYmplY3RzIHRoYXQgbWF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBiZSBkaXJlY3RseSByZWFjaGFibGUgZnJvbSBpdC4gIE5vdGUgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGNhbGwgdG8gdHBfdHJhdmVyc2UgbWF5IGFwcGVuZCBvYmplY3RzIHRvIHlvdW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICogc28gd2UgaGF2ZSB0byB3YWl0IHVudGlsIGl0IHJldHVybnMgdG8gZGV0ZXJtaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbmV4dCBvYmplY3QgdG8gdmlzaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2Vwcm9jIHRyYXZlcnNlID0gUHlfVFlQRShvcCktPnRwX3RyYXZlcnNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGdjLT5nYy5nY19yZWZzID4gMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IEdDX1JFQUNIQUJMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSB0cmF2ZXJzZShvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmlzaXRwcm9jKXZpc2l0X3JlYWNoYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXlvdW5nKTsKLQkJCW5leHQgPSBnYy0+Z2MuZ2NfbmV4dDsKLQkJCWlmIChQeVR1cGxlX0NoZWNrRXhhY3Qob3ApKSB7Ci0JCQkJX1B5VHVwbGVfTWF5YmVVbnRyYWNrKG9wKTsKLQkJCX0KLQkJCWVsc2UgaWYgKFB5RGljdF9DaGVja0V4YWN0KG9wKSkgewotCQkJCV9QeURpY3RfTWF5YmVVbnRyYWNrKG9wKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8qIFRoaXMgKm1heSogYmUgdW5yZWFjaGFibGUuICBUbyBtYWtlIHByb2dyZXNzLAotCQkJICogYXNzdW1lIGl0IGlzLiAgZ2MgaXNuJ3QgZGlyZWN0bHkgcmVhY2hhYmxlIGZyb20KLQkJCSAqIGFueSBvYmplY3Qgd2UndmUgYWxyZWFkeSB0cmF2ZXJzZWQsIGJ1dCBtYXkgYmUKLQkJCSAqIHJlYWNoYWJsZSBmcm9tIGFuIG9iamVjdCB3ZSBoYXZlbid0IGdvdHRlbiB0byB5ZXQuCi0JCQkgKiB2aXNpdF9yZWFjaGFibGUgd2lsbCBldmVudHVhbGx5IG1vdmUgZ2MgYmFjayBpbnRvCi0JCQkgKiB5b3VuZyBpZiB0aGF0J3Mgc28sIGFuZCB3ZSdsbCBzZWUgaXQgYWdhaW4uCi0JCQkgKi8KLQkJCW5leHQgPSBnYy0+Z2MuZ2NfbmV4dDsKLQkJCWdjX2xpc3RfbW92ZShnYywgdW5yZWFjaGFibGUpOwotCQkJZ2MtPmdjLmdjX3JlZnMgPSBHQ19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRTsKLQkJfQotCQlnYyA9IG5leHQ7Ci0JfQorICAgICAgICBpZiAoZ2MtPmdjLmdjX3JlZnMpIHsKKyAgICAgICAgICAgIC8qIGdjIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGZyb20gb3V0c2lkZSB0aGUKKyAgICAgICAgICAgICAqIG9yaWdpbmFsICd5b3VuZycuICBNYXJrIGl0IGFzIHN1Y2gsIGFuZCB0cmF2ZXJzZQorICAgICAgICAgICAgICogaXRzIHBvaW50ZXJzIHRvIGZpbmQgYW55IG90aGVyIG9iamVjdHMgdGhhdCBtYXkKKyAgICAgICAgICAgICAqIGJlIGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIGl0LiAgTm90ZSB0aGF0IHRoZQorICAgICAgICAgICAgICogY2FsbCB0byB0cF90cmF2ZXJzZSBtYXkgYXBwZW5kIG9iamVjdHMgdG8geW91bmcsCisgICAgICAgICAgICAgKiBzbyB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgaXQgcmV0dXJucyB0byBkZXRlcm1pbmUKKyAgICAgICAgICAgICAqIHRoZSBuZXh0IG9iamVjdCB0byB2aXNpdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgUHlPYmplY3QgKm9wID0gRlJPTV9HQyhnYyk7CisgICAgICAgICAgICB0cmF2ZXJzZXByb2MgdHJhdmVyc2UgPSBQeV9UWVBFKG9wKS0+dHBfdHJhdmVyc2U7CisgICAgICAgICAgICBhc3NlcnQoZ2MtPmdjLmdjX3JlZnMgPiAwKTsKKyAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzID0gR0NfUkVBQ0hBQkxFOworICAgICAgICAgICAgKHZvaWQpIHRyYXZlcnNlKG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2aXNpdHByb2MpdmlzaXRfcmVhY2hhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopeW91bmcpOworICAgICAgICAgICAgbmV4dCA9IGdjLT5nYy5nY19uZXh0OworICAgICAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdChvcCkpIHsKKyAgICAgICAgICAgICAgICBfUHlUdXBsZV9NYXliZVVudHJhY2sob3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob3ApKSB7CisgICAgICAgICAgICAgICAgX1B5RGljdF9NYXliZVVudHJhY2sob3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogVGhpcyAqbWF5KiBiZSB1bnJlYWNoYWJsZS4gIFRvIG1ha2UgcHJvZ3Jlc3MsCisgICAgICAgICAgICAgKiBhc3N1bWUgaXQgaXMuICBnYyBpc24ndCBkaXJlY3RseSByZWFjaGFibGUgZnJvbQorICAgICAgICAgICAgICogYW55IG9iamVjdCB3ZSd2ZSBhbHJlYWR5IHRyYXZlcnNlZCwgYnV0IG1heSBiZQorICAgICAgICAgICAgICogcmVhY2hhYmxlIGZyb20gYW4gb2JqZWN0IHdlIGhhdmVuJ3QgZ290dGVuIHRvIHlldC4KKyAgICAgICAgICAgICAqIHZpc2l0X3JlYWNoYWJsZSB3aWxsIGV2ZW50dWFsbHkgbW92ZSBnYyBiYWNrIGludG8KKyAgICAgICAgICAgICAqIHlvdW5nIGlmIHRoYXQncyBzbywgYW5kIHdlJ2xsIHNlZSBpdCBhZ2Fpbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbmV4dCA9IGdjLT5nYy5nY19uZXh0OworICAgICAgICAgICAgZ2NfbGlzdF9tb3ZlKGdjLCB1bnJlYWNoYWJsZSk7CisgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFOworICAgICAgICB9CisgICAgICAgIGdjID0gbmV4dDsKKyAgICB9CiB9CiAKIC8qIFJldHVybiB0cnVlIGlmIG9iamVjdCBoYXMgYSBmaW5hbGl6YXRpb24gbWV0aG9kLgpAQCAtNDY2LDE2ICs0NjYsMTYgQEAKIHN0YXRpYyBpbnQKIGhhc19maW5hbGl6ZXIoUHlPYmplY3QgKm9wKQogewotCWlmIChQeUluc3RhbmNlX0NoZWNrKG9wKSkgewotCQlhc3NlcnQoZGVsc3RyICE9IE5VTEwpOwotCQlyZXR1cm4gX1B5SW5zdGFuY2VfTG9va3VwKG9wLCBkZWxzdHIpICE9IE5VTEw7Ci0JfQotCWVsc2UgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKG9wLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKLQkJcmV0dXJuIG9wLT5vYl90eXBlLT50cF9kZWwgIT0gTlVMTDsKLQllbHNlIGlmIChQeUdlbl9DaGVja0V4YWN0KG9wKSkKLQkJcmV0dXJuIFB5R2VuX05lZWRzRmluYWxpemluZygoUHlHZW5PYmplY3QgKilvcCk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayhvcCkpIHsKKyAgICAgICAgYXNzZXJ0KGRlbHN0ciAhPSBOVUxMKTsKKyAgICAgICAgcmV0dXJuIF9QeUluc3RhbmNlX0xvb2t1cChvcCwgZGVsc3RyKSAhPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChQeVR5cGVfSGFzRmVhdHVyZShvcC0+b2JfdHlwZSwgUHlfVFBGTEFHU19IRUFQVFlQRSkpCisgICAgICAgIHJldHVybiBvcC0+b2JfdHlwZS0+dHBfZGVsICE9IE5VTEw7CisgICAgZWxzZSBpZiAoUHlHZW5fQ2hlY2tFeGFjdChvcCkpCisgICAgICAgIHJldHVybiBQeUdlbl9OZWVkc0ZpbmFsaXppbmcoKFB5R2VuT2JqZWN0ICopb3ApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIC8qIE1vdmUgdGhlIG9iamVjdHMgaW4gdW5yZWFjaGFibGUgd2l0aCBfX2RlbF9fIG1ldGhvZHMgaW50byBgZmluYWxpemVyc2AuCkBAIC00ODUsMzcgKzQ4NSwzNyBAQAogc3RhdGljIHZvaWQKIG1vdmVfZmluYWxpemVycyhQeUdDX0hlYWQgKnVucmVhY2hhYmxlLCBQeUdDX0hlYWQgKmZpbmFsaXplcnMpCiB7Ci0JUHlHQ19IZWFkICpnYzsKLQlQeUdDX0hlYWQgKm5leHQ7CisgICAgUHlHQ19IZWFkICpnYzsKKyAgICBQeUdDX0hlYWQgKm5leHQ7CiAKLQkvKiBNYXJjaCBvdmVyIHVucmVhY2hhYmxlLiAgTW92ZSBvYmplY3RzIHdpdGggZmluYWxpemVycyBpbnRvCi0JICogYGZpbmFsaXplcnNgLgotCSAqLwotCWZvciAoZ2MgPSB1bnJlYWNoYWJsZS0+Z2MuZ2NfbmV4dDsgZ2MgIT0gdW5yZWFjaGFibGU7IGdjID0gbmV4dCkgewotCQlQeU9iamVjdCAqb3AgPSBGUk9NX0dDKGdjKTsKKyAgICAvKiBNYXJjaCBvdmVyIHVucmVhY2hhYmxlLiAgTW92ZSBvYmplY3RzIHdpdGggZmluYWxpemVycyBpbnRvCisgICAgICogYGZpbmFsaXplcnNgLgorICAgICAqLworICAgIGZvciAoZ2MgPSB1bnJlYWNoYWJsZS0+Z2MuZ2NfbmV4dDsgZ2MgIT0gdW5yZWFjaGFibGU7IGdjID0gbmV4dCkgeworICAgICAgICBQeU9iamVjdCAqb3AgPSBGUk9NX0dDKGdjKTsKIAotCQlhc3NlcnQoSVNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUob3ApKTsKLQkJbmV4dCA9IGdjLT5nYy5nY19uZXh0OworICAgICAgICBhc3NlcnQoSVNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUob3ApKTsKKyAgICAgICAgbmV4dCA9IGdjLT5nYy5nY19uZXh0OwogCi0JCWlmIChoYXNfZmluYWxpemVyKG9wKSkgewotCQkJZ2NfbGlzdF9tb3ZlKGdjLCBmaW5hbGl6ZXJzKTsKLQkJCWdjLT5nYy5nY19yZWZzID0gR0NfUkVBQ0hBQkxFOwotCQl9Ci0JfQorICAgICAgICBpZiAoaGFzX2ZpbmFsaXplcihvcCkpIHsKKyAgICAgICAgICAgIGdjX2xpc3RfbW92ZShnYywgZmluYWxpemVycyk7CisgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IEdDX1JFQUNIQUJMRTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLyogQSB0cmF2ZXJzYWwgY2FsbGJhY2sgZm9yIG1vdmVfZmluYWxpemVyX3JlYWNoYWJsZS4gKi8KIHN0YXRpYyBpbnQKIHZpc2l0X21vdmUoUHlPYmplY3QgKm9wLCBQeUdDX0hlYWQgKnRvbGlzdCkKIHsKLQlpZiAoUHlPYmplY3RfSVNfR0Mob3ApKSB7Ci0JCWlmIChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpIHsKLQkJCVB5R0NfSGVhZCAqZ2MgPSBBU19HQyhvcCk7Ci0JCQlnY19saXN0X21vdmUoZ2MsIHRvbGlzdCk7Ci0JCQlnYy0+Z2MuZ2NfcmVmcyA9IEdDX1JFQUNIQUJMRTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlPYmplY3RfSVNfR0Mob3ApKSB7CisgICAgICAgIGlmIChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpIHsKKyAgICAgICAgICAgIFB5R0NfSGVhZCAqZ2MgPSBBU19HQyhvcCk7CisgICAgICAgICAgICBnY19saXN0X21vdmUoZ2MsIHRvbGlzdCk7CisgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IEdDX1JFQUNIQUJMRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogTW92ZSBvYmplY3RzIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIGZpbmFsaXplcnMsIGZyb20gdGhlIHVucmVhY2hhYmxlIHNldApAQCAtNTI0LDE1ICs1MjQsMTUgQEAKIHN0YXRpYyB2b2lkCiBtb3ZlX2ZpbmFsaXplcl9yZWFjaGFibGUoUHlHQ19IZWFkICpmaW5hbGl6ZXJzKQogewotCXRyYXZlcnNlcHJvYyB0cmF2ZXJzZTsKLQlQeUdDX0hlYWQgKmdjID0gZmluYWxpemVycy0+Z2MuZ2NfbmV4dDsKLQlmb3IgKDsgZ2MgIT0gZmluYWxpemVyczsgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgewotCQkvKiBOb3RlIHRoYXQgdGhlIGZpbmFsaXplcnMgbGlzdCBtYXkgZ3JvdyBkdXJpbmcgdGhpcy4gKi8KLQkJdHJhdmVyc2UgPSBQeV9UWVBFKEZST01fR0MoZ2MpKS0+dHBfdHJhdmVyc2U7Ci0JCSh2b2lkKSB0cmF2ZXJzZShGUk9NX0dDKGdjKSwKLQkJCQkodmlzaXRwcm9jKXZpc2l0X21vdmUsCi0JCQkJKHZvaWQgKilmaW5hbGl6ZXJzKTsKLQl9CisgICAgdHJhdmVyc2Vwcm9jIHRyYXZlcnNlOworICAgIFB5R0NfSGVhZCAqZ2MgPSBmaW5hbGl6ZXJzLT5nYy5nY19uZXh0OworICAgIGZvciAoOyBnYyAhPSBmaW5hbGl6ZXJzOyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7CisgICAgICAgIC8qIE5vdGUgdGhhdCB0aGUgZmluYWxpemVycyBsaXN0IG1heSBncm93IGR1cmluZyB0aGlzLiAqLworICAgICAgICB0cmF2ZXJzZSA9IFB5X1RZUEUoRlJPTV9HQyhnYykpLT50cF90cmF2ZXJzZTsKKyAgICAgICAgKHZvaWQpIHRyYXZlcnNlKEZST01fR0MoZ2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZpc2l0cHJvYyl2aXNpdF9tb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilmaW5hbGl6ZXJzKTsKKyAgICB9CiB9CiAKIC8qIENsZWFyIGFsbCB3ZWFrcmVmcyB0byB1bnJlYWNoYWJsZSBvYmplY3RzLCBhbmQgaWYgc3VjaCBhIHdlYWtyZWYgaGFzIGEKQEAgLTU0OSwxNjkgKzU0OSwxNjkgQEAKIHN0YXRpYyBpbnQKIGhhbmRsZV93ZWFrcmVmcyhQeUdDX0hlYWQgKnVucmVhY2hhYmxlLCBQeUdDX0hlYWQgKm9sZCkKIHsKLQlQeUdDX0hlYWQgKmdjOwotCVB5T2JqZWN0ICpvcDsJCS8qIGdlbmVyYWxseSBGUk9NX0dDKGdjKSAqLwotCVB5V2Vha1JlZmVyZW5jZSAqd3I7CS8qIGdlbmVyYWxseSBhIGNhc3Qgb2Ygb3AgKi8KLQlQeUdDX0hlYWQgd3JjYl90b19jYWxsOwkvKiB3ZWFrcmVmcyB3aXRoIGNhbGxiYWNrcyB0byBjYWxsICovCi0JUHlHQ19IZWFkICpuZXh0OwotCWludCBudW1fZnJlZWQgPSAwOworICAgIFB5R0NfSGVhZCAqZ2M7CisgICAgUHlPYmplY3QgKm9wOyAgICAgICAgICAgICAgIC8qIGdlbmVyYWxseSBGUk9NX0dDKGdjKSAqLworICAgIFB5V2Vha1JlZmVyZW5jZSAqd3I7ICAgICAgICAvKiBnZW5lcmFsbHkgYSBjYXN0IG9mIG9wICovCisgICAgUHlHQ19IZWFkIHdyY2JfdG9fY2FsbDsgICAgIC8qIHdlYWtyZWZzIHdpdGggY2FsbGJhY2tzIHRvIGNhbGwgKi8KKyAgICBQeUdDX0hlYWQgKm5leHQ7CisgICAgaW50IG51bV9mcmVlZCA9IDA7CiAKLQlnY19saXN0X2luaXQoJndyY2JfdG9fY2FsbCk7CisgICAgZ2NfbGlzdF9pbml0KCZ3cmNiX3RvX2NhbGwpOwogCi0JLyogQ2xlYXIgYWxsIHdlYWtyZWZzIHRvIHRoZSBvYmplY3RzIGluIHVucmVhY2hhYmxlLiAgSWYgc3VjaCBhIHdlYWtyZWYKLQkgKiBhbHNvIGhhcyBhIGNhbGxiYWNrLCBtb3ZlIGl0IGludG8gYHdyY2JfdG9fY2FsbGAgaWYgdGhlIGNhbGxiYWNrCi0JICogbmVlZHMgdG8gYmUgaW52b2tlZC4gIE5vdGUgdGhhdCB3ZSBjYW5ub3QgaW52b2tlIGFueSBjYWxsYmFja3MgdW50aWwKLQkgKiBhbGwgd2Vha3JlZnMgdG8gdW5yZWFjaGFibGUgb2JqZWN0cyBhcmUgY2xlYXJlZCwgbGVzdCB0aGUgY2FsbGJhY2sKLQkgKiByZXN1cnJlY3QgYW4gdW5yZWFjaGFibGUgb2JqZWN0IHZpYSBhIHN0aWxsLWFjdGl2ZSB3ZWFrcmVmLiAgV2UKLQkgKiBtYWtlIGFub3RoZXIgcGFzcyBvdmVyIHdyY2JfdG9fY2FsbCwgaW52b2tpbmcgY2FsbGJhY2tzLCBhZnRlciB0aGlzCi0JICogcGFzcyBjb21wbGV0ZXMuCi0JICovCi0JZm9yIChnYyA9IHVucmVhY2hhYmxlLT5nYy5nY19uZXh0OyBnYyAhPSB1bnJlYWNoYWJsZTsgZ2MgPSBuZXh0KSB7Ci0JCVB5V2Vha1JlZmVyZW5jZSAqKndybGlzdDsKKyAgICAvKiBDbGVhciBhbGwgd2Vha3JlZnMgdG8gdGhlIG9iamVjdHMgaW4gdW5yZWFjaGFibGUuICBJZiBzdWNoIGEgd2Vha3JlZgorICAgICAqIGFsc28gaGFzIGEgY2FsbGJhY2ssIG1vdmUgaXQgaW50byBgd3JjYl90b19jYWxsYCBpZiB0aGUgY2FsbGJhY2sKKyAgICAgKiBuZWVkcyB0byBiZSBpbnZva2VkLiAgTm90ZSB0aGF0IHdlIGNhbm5vdCBpbnZva2UgYW55IGNhbGxiYWNrcyB1bnRpbAorICAgICAqIGFsbCB3ZWFrcmVmcyB0byB1bnJlYWNoYWJsZSBvYmplY3RzIGFyZSBjbGVhcmVkLCBsZXN0IHRoZSBjYWxsYmFjaworICAgICAqIHJlc3VycmVjdCBhbiB1bnJlYWNoYWJsZSBvYmplY3QgdmlhIGEgc3RpbGwtYWN0aXZlIHdlYWtyZWYuICBXZQorICAgICAqIG1ha2UgYW5vdGhlciBwYXNzIG92ZXIgd3JjYl90b19jYWxsLCBpbnZva2luZyBjYWxsYmFja3MsIGFmdGVyIHRoaXMKKyAgICAgKiBwYXNzIGNvbXBsZXRlcy4KKyAgICAgKi8KKyAgICBmb3IgKGdjID0gdW5yZWFjaGFibGUtPmdjLmdjX25leHQ7IGdjICE9IHVucmVhY2hhYmxlOyBnYyA9IG5leHQpIHsKKyAgICAgICAgUHlXZWFrUmVmZXJlbmNlICoqd3JsaXN0OwogCi0JCW9wID0gRlJPTV9HQyhnYyk7Ci0JCWFzc2VydChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpOwotCQluZXh0ID0gZ2MtPmdjLmdjX25leHQ7CisgICAgICAgIG9wID0gRlJPTV9HQyhnYyk7CisgICAgICAgIGFzc2VydChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpOworICAgICAgICBuZXh0ID0gZ2MtPmdjLmdjX25leHQ7CiAKLQkJaWYgKCEgUHlUeXBlX1NVUFBPUlRTX1dFQUtSRUZTKFB5X1RZUEUob3ApKSkKLQkJCWNvbnRpbnVlOworICAgICAgICBpZiAoISBQeVR5cGVfU1VQUE9SVFNfV0VBS1JFRlMoUHlfVFlQRShvcCkpKQorICAgICAgICAgICAgY29udGludWU7CiAKLQkJLyogSXQgc3VwcG9ydHMgd2Vha3JlZnMuICBEb2VzIGl0IGhhdmUgYW55PyAqLwotCQl3cmxpc3QgPSAoUHlXZWFrUmVmZXJlbmNlICoqKQotCQkJICAgICAJCVB5T2JqZWN0X0dFVF9XRUFLUkVGU19MSVNUUFRSKG9wKTsKKyAgICAgICAgLyogSXQgc3VwcG9ydHMgd2Vha3JlZnMuICBEb2VzIGl0IGhhdmUgYW55PyAqLworICAgICAgICB3cmxpc3QgPSAoUHlXZWFrUmVmZXJlbmNlICoqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdF9HRVRfV0VBS1JFRlNfTElTVFBUUihvcCk7CiAKLQkJLyogYG9wYCBtYXkgaGF2ZSBzb21lIHdlYWtyZWZzLiAgTWFyY2ggb3ZlciB0aGUgbGlzdCwgY2xlYXIKLQkJICogYWxsIHRoZSB3ZWFrcmVmcywgYW5kIG1vdmUgdGhlIHdlYWtyZWZzIHdpdGggY2FsbGJhY2tzCi0JCSAqIHRoYXQgbXVzdCBiZSBjYWxsZWQgaW50byB3cmNiX3RvX2NhbGwuCi0JCSAqLwotCQlmb3IgKHdyID0gKndybGlzdDsgd3IgIT0gTlVMTDsgd3IgPSAqd3JsaXN0KSB7Ci0JCQlQeUdDX0hlYWQgKndyYXNnYzsJLyogQVNfR0Mod3IpICovCisgICAgICAgIC8qIGBvcGAgbWF5IGhhdmUgc29tZSB3ZWFrcmVmcy4gIE1hcmNoIG92ZXIgdGhlIGxpc3QsIGNsZWFyCisgICAgICAgICAqIGFsbCB0aGUgd2Vha3JlZnMsIGFuZCBtb3ZlIHRoZSB3ZWFrcmVmcyB3aXRoIGNhbGxiYWNrcworICAgICAgICAgKiB0aGF0IG11c3QgYmUgY2FsbGVkIGludG8gd3JjYl90b19jYWxsLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yICh3ciA9ICp3cmxpc3Q7IHdyICE9IE5VTEw7IHdyID0gKndybGlzdCkgeworICAgICAgICAgICAgUHlHQ19IZWFkICp3cmFzZ2M7ICAgICAgICAgICAgICAgICAgLyogQVNfR0Mod3IpICovCiAKLQkJCS8qIF9QeVdlYWtyZWZfQ2xlYXJSZWYgY2xlYXJzIHRoZSB3ZWFrcmVmIGJ1dCBsZWF2ZXMKLQkJCSAqIHRoZSBjYWxsYmFjayBwb2ludGVyIGludGFjdC4gIE9ic2N1cmU6ICBpdCBhbHNvCi0JCQkgKiBjaGFuZ2VzICp3cmxpc3QuCi0JCQkgKi8KLQkJCWFzc2VydCh3ci0+d3Jfb2JqZWN0ID09IG9wKTsKLQkJCV9QeVdlYWtyZWZfQ2xlYXJSZWYod3IpOwotCQkJYXNzZXJ0KHdyLT53cl9vYmplY3QgPT0gUHlfTm9uZSk7Ci0JCQlpZiAod3ItPndyX2NhbGxiYWNrID09IE5VTEwpCi0JCQkJY29udGludWU7CS8qIG5vIGNhbGxiYWNrICovCisgICAgICAgICAgICAvKiBfUHlXZWFrcmVmX0NsZWFyUmVmIGNsZWFycyB0aGUgd2Vha3JlZiBidXQgbGVhdmVzCisgICAgICAgICAgICAgKiB0aGUgY2FsbGJhY2sgcG9pbnRlciBpbnRhY3QuICBPYnNjdXJlOiAgaXQgYWxzbworICAgICAgICAgICAgICogY2hhbmdlcyAqd3JsaXN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhc3NlcnQod3ItPndyX29iamVjdCA9PSBvcCk7CisgICAgICAgICAgICBfUHlXZWFrcmVmX0NsZWFyUmVmKHdyKTsKKyAgICAgICAgICAgIGFzc2VydCh3ci0+d3Jfb2JqZWN0ID09IFB5X05vbmUpOworICAgICAgICAgICAgaWYgKHdyLT53cl9jYWxsYmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gY2FsbGJhY2sgKi8KIAotCS8qIEhlYWRhY2hlIHRpbWUuICBgb3BgIGlzIGdvaW5nIGF3YXksIGFuZCBpcyB3ZWFrbHkgcmVmZXJlbmNlZCBieQotCSAqIGB3cmAsIHdoaWNoIGhhcyBhIGNhbGxiYWNrLiAgU2hvdWxkIHRoZSBjYWxsYmFjayBiZSBpbnZva2VkPyAgSWYgd3IKLQkgKiBpcyBhbHNvIHRyYXNoLCBubzoKLQkgKgotCSAqIDEuIFRoZXJlJ3Mgbm8gbmVlZCB0byBjYWxsIGl0LiAgVGhlIG9iamVjdCBhbmQgdGhlIHdlYWtyZWYgYXJlCi0JICogICAgYm90aCBnb2luZyBhd2F5LCBzbyBpdCdzIGxlZ2l0aW1hdGUgdG8gcHJldGVuZCB0aGUgd2Vha3JlZiBpcwotCSAqICAgIGdvaW5nIGF3YXkgZmlyc3QuICBUaGUgdXNlciBoYXMgdG8gZW5zdXJlIGEgd2Vha3JlZiBvdXRsaXZlcyBpdHMKLQkgKiAgICByZWZlcmVudCBpZiB0aGV5IHdhbnQgYSBndWFyYW50ZWUgdGhhdCB0aGUgd3IgY2FsbGJhY2sgd2lsbCBnZXQKLQkgKiAgICBpbnZva2VkLgotCSAqCi0JICogMi4gSXQgbWF5IGJlIGNhdGFzdHJvcGhpYyB0byBjYWxsIGl0LiAgSWYgdGhlIGNhbGxiYWNrIGlzIGFsc28gaW4KLQkgKiAgICBjeWNsaWMgdHJhc2ggKENUKSwgdGhlbiBhbHRob3VnaCB0aGUgQ1QgaXMgdW5yZWFjaGFibGUgZnJvbQotCSAqICAgIG91dHNpZGUgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiwgQ1QgbWF5IGJlIHJlYWNoYWJsZSBmcm9tIHRoZQotCSAqICAgIGNhbGxiYWNrLiAgVGhlbiB0aGUgY2FsbGJhY2sgY291bGQgcmVzdXJyZWN0IGluc2FuZSBvYmplY3RzLgotCSAqCi0JICogU2luY2UgdGhlIGNhbGxiYWNrIGlzIG5ldmVyIG5lZWRlZCBhbmQgbWF5IGJlIHVuc2FmZSBpbiB0aGlzIGNhc2UsCi0JICogd3IgaXMgc2ltcGx5IGxlZnQgaW4gdGhlIHVucmVhY2hhYmxlIHNldC4gIE5vdGUgdGhhdCBiZWNhdXNlIHdlCi0JICogYWxyZWFkeSBjYWxsZWQgX1B5V2Vha3JlZl9DbGVhclJlZih3ciksIGl0cyBjYWxsYmFjayB3aWxsIG5ldmVyCi0JICogdHJpZ2dlci4KLQkgKgotCSAqIE9UT0gsIGlmIHdyIGlzbid0IHBhcnQgb2YgQ1QsIHdlIHNob3VsZCBpbnZva2UgdGhlIGNhbGxiYWNrOiAgdGhlCi0JICogd2Vha3JlZiBvdXRsaXZlZCB0aGUgdHJhc2guICBOb3RlIHRoYXQgc2luY2Ugd3IgaXNuJ3QgQ1QgaW4gdGhpcwotCSAqIGNhc2UsIGl0cyBjYWxsYmFjayBjYW4ndCBiZSBDVCBlaXRoZXIgLS0gd3IgYWN0ZWQgYXMgYW4gZXh0ZXJuYWwKLQkgKiByb290IHRvIHRoaXMgZ2VuZXJhdGlvbiwgYW5kIHRoZXJlZm9yZSBpdHMgY2FsbGJhY2sgZGlkIHRvby4gIFNvCi0JICogbm90aGluZyBpbiBDVCBpcyByZWFjaGFibGUgZnJvbSB0aGUgY2FsbGJhY2sgZWl0aGVyLCBzbyBpdCdzIGhhcmQKLQkgKiB0byBpbWFnaW5lIGhvdyBjYWxsaW5nIGl0IGxhdGVyIGNvdWxkIGNyZWF0ZSBhIHByb2JsZW0gZm9yIHVzLiAgd3IKLQkgKiBpcyBtb3ZlZCB0byB3cmNiX3RvX2NhbGwgaW4gdGhpcyBjYXNlLgotCSAqLwotCSAJCWlmIChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRSh3cikpCi0JIAkJCWNvbnRpbnVlOwotCQkJYXNzZXJ0KElTX1JFQUNIQUJMRSh3cikpOworICAgIC8qIEhlYWRhY2hlIHRpbWUuICBgb3BgIGlzIGdvaW5nIGF3YXksIGFuZCBpcyB3ZWFrbHkgcmVmZXJlbmNlZCBieQorICAgICAqIGB3cmAsIHdoaWNoIGhhcyBhIGNhbGxiYWNrLiAgU2hvdWxkIHRoZSBjYWxsYmFjayBiZSBpbnZva2VkPyAgSWYgd3IKKyAgICAgKiBpcyBhbHNvIHRyYXNoLCBubzoKKyAgICAgKgorICAgICAqIDEuIFRoZXJlJ3Mgbm8gbmVlZCB0byBjYWxsIGl0LiAgVGhlIG9iamVjdCBhbmQgdGhlIHdlYWtyZWYgYXJlCisgICAgICogICAgYm90aCBnb2luZyBhd2F5LCBzbyBpdCdzIGxlZ2l0aW1hdGUgdG8gcHJldGVuZCB0aGUgd2Vha3JlZiBpcworICAgICAqICAgIGdvaW5nIGF3YXkgZmlyc3QuICBUaGUgdXNlciBoYXMgdG8gZW5zdXJlIGEgd2Vha3JlZiBvdXRsaXZlcyBpdHMKKyAgICAgKiAgICByZWZlcmVudCBpZiB0aGV5IHdhbnQgYSBndWFyYW50ZWUgdGhhdCB0aGUgd3IgY2FsbGJhY2sgd2lsbCBnZXQKKyAgICAgKiAgICBpbnZva2VkLgorICAgICAqCisgICAgICogMi4gSXQgbWF5IGJlIGNhdGFzdHJvcGhpYyB0byBjYWxsIGl0LiAgSWYgdGhlIGNhbGxiYWNrIGlzIGFsc28gaW4KKyAgICAgKiAgICBjeWNsaWMgdHJhc2ggKENUKSwgdGhlbiBhbHRob3VnaCB0aGUgQ1QgaXMgdW5yZWFjaGFibGUgZnJvbQorICAgICAqICAgIG91dHNpZGUgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiwgQ1QgbWF5IGJlIHJlYWNoYWJsZSBmcm9tIHRoZQorICAgICAqICAgIGNhbGxiYWNrLiAgVGhlbiB0aGUgY2FsbGJhY2sgY291bGQgcmVzdXJyZWN0IGluc2FuZSBvYmplY3RzLgorICAgICAqCisgICAgICogU2luY2UgdGhlIGNhbGxiYWNrIGlzIG5ldmVyIG5lZWRlZCBhbmQgbWF5IGJlIHVuc2FmZSBpbiB0aGlzIGNhc2UsCisgICAgICogd3IgaXMgc2ltcGx5IGxlZnQgaW4gdGhlIHVucmVhY2hhYmxlIHNldC4gIE5vdGUgdGhhdCBiZWNhdXNlIHdlCisgICAgICogYWxyZWFkeSBjYWxsZWQgX1B5V2Vha3JlZl9DbGVhclJlZih3ciksIGl0cyBjYWxsYmFjayB3aWxsIG5ldmVyCisgICAgICogdHJpZ2dlci4KKyAgICAgKgorICAgICAqIE9UT0gsIGlmIHdyIGlzbid0IHBhcnQgb2YgQ1QsIHdlIHNob3VsZCBpbnZva2UgdGhlIGNhbGxiYWNrOiAgdGhlCisgICAgICogd2Vha3JlZiBvdXRsaXZlZCB0aGUgdHJhc2guICBOb3RlIHRoYXQgc2luY2Ugd3IgaXNuJ3QgQ1QgaW4gdGhpcworICAgICAqIGNhc2UsIGl0cyBjYWxsYmFjayBjYW4ndCBiZSBDVCBlaXRoZXIgLS0gd3IgYWN0ZWQgYXMgYW4gZXh0ZXJuYWwKKyAgICAgKiByb290IHRvIHRoaXMgZ2VuZXJhdGlvbiwgYW5kIHRoZXJlZm9yZSBpdHMgY2FsbGJhY2sgZGlkIHRvby4gIFNvCisgICAgICogbm90aGluZyBpbiBDVCBpcyByZWFjaGFibGUgZnJvbSB0aGUgY2FsbGJhY2sgZWl0aGVyLCBzbyBpdCdzIGhhcmQKKyAgICAgKiB0byBpbWFnaW5lIGhvdyBjYWxsaW5nIGl0IGxhdGVyIGNvdWxkIGNyZWF0ZSBhIHByb2JsZW0gZm9yIHVzLiAgd3IKKyAgICAgKiBpcyBtb3ZlZCB0byB3cmNiX3RvX2NhbGwgaW4gdGhpcyBjYXNlLgorICAgICAqLworICAgICAgICAgICAgaWYgKElTX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKHdyKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGFzc2VydChJU19SRUFDSEFCTEUod3IpKTsKIAotCQkJLyogQ3JlYXRlIGEgbmV3IHJlZmVyZW5jZSBzbyB0aGF0IHdyIGNhbid0IGdvIGF3YXkKLQkJCSAqIGJlZm9yZSB3ZSBjYW4gcHJvY2VzcyBpdCBhZ2Fpbi4KLQkJCSAqLwotCQkJUHlfSU5DUkVGKHdyKTsKKyAgICAgICAgICAgIC8qIENyZWF0ZSBhIG5ldyByZWZlcmVuY2Ugc28gdGhhdCB3ciBjYW4ndCBnbyBhd2F5CisgICAgICAgICAgICAgKiBiZWZvcmUgd2UgY2FuIHByb2Nlc3MgaXQgYWdhaW4uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRih3cik7CiAKLQkJCS8qIE1vdmUgd3IgdG8gd3JjYl90b19jYWxsLCBmb3IgdGhlIG5leHQgcGFzcy4gKi8KLQkJCXdyYXNnYyA9IEFTX0dDKHdyKTsKLQkJCWFzc2VydCh3cmFzZ2MgIT0gbmV4dCk7IC8qIHdyYXNnYyBpcyByZWFjaGFibGUsIGJ1dAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpc24ndCwgc28gdGhleSBjYW4ndAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdGhlIHNhbWUgKi8KLQkJCWdjX2xpc3RfbW92ZSh3cmFzZ2MsICZ3cmNiX3RvX2NhbGwpOwotCQl9Ci0JfQorICAgICAgICAgICAgLyogTW92ZSB3ciB0byB3cmNiX3RvX2NhbGwsIGZvciB0aGUgbmV4dCBwYXNzLiAqLworICAgICAgICAgICAgd3Jhc2djID0gQVNfR0Mod3IpOworICAgICAgICAgICAgYXNzZXJ0KHdyYXNnYyAhPSBuZXh0KTsgLyogd3Jhc2djIGlzIHJlYWNoYWJsZSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlzbid0LCBzbyB0aGV5IGNhbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB0aGUgc2FtZSAqLworICAgICAgICAgICAgZ2NfbGlzdF9tb3ZlKHdyYXNnYywgJndyY2JfdG9fY2FsbCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBJbnZva2UgdGhlIGNhbGxiYWNrcyB3ZSBkZWNpZGVkIHRvIGhvbm9yLiAgSXQncyBzYWZlIHRvIGludm9rZSB0aGVtCi0JICogYmVjYXVzZSB0aGV5IGNhbid0IHJlZmVyZW5jZSB1bnJlYWNoYWJsZSBvYmplY3RzLgotCSAqLwotCXdoaWxlICghIGdjX2xpc3RfaXNfZW1wdHkoJndyY2JfdG9fY2FsbCkpIHsKLQkJUHlPYmplY3QgKnRlbXA7Ci0JCVB5T2JqZWN0ICpjYWxsYmFjazsKKyAgICAvKiBJbnZva2UgdGhlIGNhbGxiYWNrcyB3ZSBkZWNpZGVkIHRvIGhvbm9yLiAgSXQncyBzYWZlIHRvIGludm9rZSB0aGVtCisgICAgICogYmVjYXVzZSB0aGV5IGNhbid0IHJlZmVyZW5jZSB1bnJlYWNoYWJsZSBvYmplY3RzLgorICAgICAqLworICAgIHdoaWxlICghIGdjX2xpc3RfaXNfZW1wdHkoJndyY2JfdG9fY2FsbCkpIHsKKyAgICAgICAgUHlPYmplY3QgKnRlbXA7CisgICAgICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKIAotCQlnYyA9IHdyY2JfdG9fY2FsbC5nYy5nY19uZXh0OwotCQlvcCA9IEZST01fR0MoZ2MpOwotCQlhc3NlcnQoSVNfUkVBQ0hBQkxFKG9wKSk7Ci0JCWFzc2VydChQeVdlYWtyZWZfQ2hlY2sob3ApKTsKLQkJd3IgPSAoUHlXZWFrUmVmZXJlbmNlICopb3A7Ci0JCWNhbGxiYWNrID0gd3ItPndyX2NhbGxiYWNrOwotCQlhc3NlcnQoY2FsbGJhY2sgIT0gTlVMTCk7CisgICAgICAgIGdjID0gd3JjYl90b19jYWxsLmdjLmdjX25leHQ7CisgICAgICAgIG9wID0gRlJPTV9HQyhnYyk7CisgICAgICAgIGFzc2VydChJU19SRUFDSEFCTEUob3ApKTsKKyAgICAgICAgYXNzZXJ0KFB5V2Vha3JlZl9DaGVjayhvcCkpOworICAgICAgICB3ciA9IChQeVdlYWtSZWZlcmVuY2UgKilvcDsKKyAgICAgICAgY2FsbGJhY2sgPSB3ci0+d3JfY2FsbGJhY2s7CisgICAgICAgIGFzc2VydChjYWxsYmFjayAhPSBOVUxMKTsKIAotCQkvKiBjb3B5LXBhc3RlIG9mIHdlYWtyZWZvYmplY3QuYydzIGhhbmRsZV9jYWxsYmFjaygpICovCi0JCXRlbXAgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNhbGxiYWNrLCB3ciwgTlVMTCk7Ci0JCWlmICh0ZW1wID09IE5VTEwpCi0JCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoY2FsbGJhY2spOwotCQllbHNlCi0JCQlQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIC8qIGNvcHktcGFzdGUgb2Ygd2Vha3JlZm9iamVjdC5jJ3MgaGFuZGxlX2NhbGxiYWNrKCkgKi8KKyAgICAgICAgdGVtcCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2FsbGJhY2ssIHdyLCBOVUxMKTsKKyAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjYWxsYmFjayk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKIAotCQkvKiBHaXZlIHVwIHRoZSByZWZlcmVuY2Ugd2UgY3JlYXRlZCBpbiB0aGUgZmlyc3QgcGFzcy4gIFdoZW4KLQkJICogb3AncyByZWZjb3VudCBoaXRzIDAgKHdoaWNoIGl0IG1heSBvciBtYXkgbm90IGRvIHJpZ2h0IG5vdyksCi0JCSAqIG9wJ3MgdHBfZGVhbGxvYyB3aWxsIGRlY3JlZiBvcC0+d3JfY2FsbGJhY2sgdG9vLiAgTm90ZQotCQkgKiB0aGF0IHRoZSByZWZjb3VudCBwcm9iYWJseSB3aWxsIGhpdCAwIG5vdywgYW5kIGJlY2F1c2UgdGhpcwotCQkgKiB3ZWFrcmVmIHdhcyByZWFjaGFibGUgdG8gYmVnaW4gd2l0aCwgZ2MgZGlkbid0IGFscmVhZHkKLQkJICogYWRkIGl0IHRvIGl0cyBjb3VudCBvZiBmcmVlZCBvYmplY3RzLiAgRXhhbXBsZTogIGEgcmVhY2hhYmxlCi0JCSAqIHdlYWsgdmFsdWUgZGljdCBtYXBzIHNvbWUga2V5IHRvIHRoaXMgcmVhY2hhYmxlIHdlYWtyZWYuCi0JCSAqIFRoZSBjYWxsYmFjayByZW1vdmVzIHRoaXMga2V5LT53ZWFrcmVmIG1hcHBpbmcgZnJvbSB0aGUKLQkJICogZGljdCwgbGVhdmluZyBubyBvdGhlciByZWZlcmVuY2VzIHRvIHRoZSB3ZWFrcmVmIChleGNlcHRpbmcKLQkJICogb3VycykuCi0JCSAqLwotCQlQeV9ERUNSRUYob3ApOwotCQlpZiAod3JjYl90b19jYWxsLmdjLmdjX25leHQgPT0gZ2MpIHsKLQkJCS8qIG9iamVjdCBpcyBzdGlsbCBhbGl2ZSAtLSBtb3ZlIGl0ICovCi0JCQlnY19saXN0X21vdmUoZ2MsIG9sZCk7Ci0JCX0KLQkJZWxzZQotCQkJKytudW1fZnJlZWQ7Ci0JfQorICAgICAgICAvKiBHaXZlIHVwIHRoZSByZWZlcmVuY2Ugd2UgY3JlYXRlZCBpbiB0aGUgZmlyc3QgcGFzcy4gIFdoZW4KKyAgICAgICAgICogb3AncyByZWZjb3VudCBoaXRzIDAgKHdoaWNoIGl0IG1heSBvciBtYXkgbm90IGRvIHJpZ2h0IG5vdyksCisgICAgICAgICAqIG9wJ3MgdHBfZGVhbGxvYyB3aWxsIGRlY3JlZiBvcC0+d3JfY2FsbGJhY2sgdG9vLiAgTm90ZQorICAgICAgICAgKiB0aGF0IHRoZSByZWZjb3VudCBwcm9iYWJseSB3aWxsIGhpdCAwIG5vdywgYW5kIGJlY2F1c2UgdGhpcworICAgICAgICAgKiB3ZWFrcmVmIHdhcyByZWFjaGFibGUgdG8gYmVnaW4gd2l0aCwgZ2MgZGlkbid0IGFscmVhZHkKKyAgICAgICAgICogYWRkIGl0IHRvIGl0cyBjb3VudCBvZiBmcmVlZCBvYmplY3RzLiAgRXhhbXBsZTogIGEgcmVhY2hhYmxlCisgICAgICAgICAqIHdlYWsgdmFsdWUgZGljdCBtYXBzIHNvbWUga2V5IHRvIHRoaXMgcmVhY2hhYmxlIHdlYWtyZWYuCisgICAgICAgICAqIFRoZSBjYWxsYmFjayByZW1vdmVzIHRoaXMga2V5LT53ZWFrcmVmIG1hcHBpbmcgZnJvbSB0aGUKKyAgICAgICAgICogZGljdCwgbGVhdmluZyBubyBvdGhlciByZWZlcmVuY2VzIHRvIHRoZSB3ZWFrcmVmIChleGNlcHRpbmcKKyAgICAgICAgICogb3VycykuCisgICAgICAgICAqLworICAgICAgICBQeV9ERUNSRUYob3ApOworICAgICAgICBpZiAod3JjYl90b19jYWxsLmdjLmdjX25leHQgPT0gZ2MpIHsKKyAgICAgICAgICAgIC8qIG9iamVjdCBpcyBzdGlsbCBhbGl2ZSAtLSBtb3ZlIGl0ICovCisgICAgICAgICAgICBnY19saXN0X21vdmUoZ2MsIG9sZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKytudW1fZnJlZWQ7CisgICAgfQogCi0JcmV0dXJuIG51bV9mcmVlZDsKKyAgICByZXR1cm4gbnVtX2ZyZWVkOwogfQogCiBzdGF0aWMgdm9pZAogZGVidWdfaW5zdGFuY2UoY2hhciAqbXNnLCBQeUluc3RhbmNlT2JqZWN0ICppbnN0KQogewotCWNoYXIgKmNuYW1lOwotCS8qIHNpbXBsZSB2ZXJzaW9uIG9mIGluc3RhbmNlX3JlcHIgKi8KLQlQeU9iamVjdCAqY2xhc3NuYW1lID0gaW5zdC0+aW5fY2xhc3MtPmNsX25hbWU7Ci0JaWYgKGNsYXNzbmFtZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGNsYXNzbmFtZSkpCi0JCWNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoY2xhc3NuYW1lKTsKLQllbHNlCi0JCWNuYW1lID0gIj8iOwotCVB5U3lzX1dyaXRlU3RkZXJyKCJnYzogJS4xMDBzIDwlLjEwMHMgaW5zdGFuY2UgYXQgJXA+XG4iLAotCQkJICBtc2csIGNuYW1lLCBpbnN0KTsKKyAgICBjaGFyICpjbmFtZTsKKyAgICAvKiBzaW1wbGUgdmVyc2lvbiBvZiBpbnN0YW5jZV9yZXByICovCisgICAgUHlPYmplY3QgKmNsYXNzbmFtZSA9IGluc3QtPmluX2NsYXNzLT5jbF9uYW1lOworICAgIGlmIChjbGFzc25hbWUgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhjbGFzc25hbWUpKQorICAgICAgICBjbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGNsYXNzbmFtZSk7CisgICAgZWxzZQorICAgICAgICBjbmFtZSA9ICI/IjsKKyAgICBQeVN5c19Xcml0ZVN0ZGVycigiZ2M6ICUuMTAwcyA8JS4xMDBzIGluc3RhbmNlIGF0ICVwPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBtc2csIGNuYW1lLCBpbnN0KTsKIH0KIAogc3RhdGljIHZvaWQKIGRlYnVnX2N5Y2xlKGNoYXIgKm1zZywgUHlPYmplY3QgKm9wKQogewotCWlmICgoZGVidWcgJiBERUJVR19JTlNUQU5DRVMpICYmIFB5SW5zdGFuY2VfQ2hlY2sob3ApKSB7Ci0JCWRlYnVnX2luc3RhbmNlKG1zZywgKFB5SW5zdGFuY2VPYmplY3QgKilvcCk7Ci0JfQotCWVsc2UgaWYgKGRlYnVnICYgREVCVUdfT0JKRUNUUykgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiZ2M6ICUuMTAwcyA8JS4xMDBzICVwPlxuIiwKLQkJCQkgIG1zZywgUHlfVFlQRShvcCktPnRwX25hbWUsIG9wKTsKLQl9CisgICAgaWYgKChkZWJ1ZyAmIERFQlVHX0lOU1RBTkNFUykgJiYgUHlJbnN0YW5jZV9DaGVjayhvcCkpIHsKKyAgICAgICAgZGVidWdfaW5zdGFuY2UobXNnLCAoUHlJbnN0YW5jZU9iamVjdCAqKW9wKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZGVidWcgJiBERUJVR19PQkpFQ1RTKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJnYzogJS4xMDBzIDwlLjEwMHMgJXA+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csIFB5X1RZUEUob3ApLT50cF9uYW1lLCBvcCk7CisgICAgfQogfQogCiAvKiBIYW5kbGUgdW5jb2xsZWN0YWJsZSBnYXJiYWdlIChjeWNsZXMgd2l0aCBmaW5hbGl6ZXJzLCBhbmQgc3R1ZmYgcmVhY2hhYmxlCkBAIC03MjYsNTYgKzcyNiw1NiBAQAogc3RhdGljIGludAogaGFuZGxlX2ZpbmFsaXplcnMoUHlHQ19IZWFkICpmaW5hbGl6ZXJzLCBQeUdDX0hlYWQgKm9sZCkKIHsKLQlQeUdDX0hlYWQgKmdjID0gZmluYWxpemVycy0+Z2MuZ2NfbmV4dDsKKyAgICBQeUdDX0hlYWQgKmdjID0gZmluYWxpemVycy0+Z2MuZ2NfbmV4dDsKIAotCWlmIChnYXJiYWdlID09IE5VTEwpIHsKLQkJZ2FyYmFnZSA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmIChnYXJiYWdlID09IE5VTEwpCi0JCQlQeV9GYXRhbEVycm9yKCJnYyBjb3VsZG4ndCBjcmVhdGUgZ2MuZ2FyYmFnZSBsaXN0Iik7Ci0JfQotCWZvciAoOyBnYyAhPSBmaW5hbGl6ZXJzOyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7Ci0JCVB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOworICAgIGlmIChnYXJiYWdlID09IE5VTEwpIHsKKyAgICAgICAgZ2FyYmFnZSA9IFB5TGlzdF9OZXcoMCk7CisgICAgICAgIGlmIChnYXJiYWdlID09IE5VTEwpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJnYyBjb3VsZG4ndCBjcmVhdGUgZ2MuZ2FyYmFnZSBsaXN0Iik7CisgICAgfQorICAgIGZvciAoOyBnYyAhPSBmaW5hbGl6ZXJzOyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7CisgICAgICAgIFB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOwogCi0JCWlmICgoZGVidWcgJiBERUJVR19TQVZFQUxMKSB8fCBoYXNfZmluYWxpemVyKG9wKSkgewotCQkJaWYgKFB5TGlzdF9BcHBlbmQoZ2FyYmFnZSwgb3ApIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgICAgIGlmICgoZGVidWcgJiBERUJVR19TQVZFQUxMKSB8fCBoYXNfZmluYWxpemVyKG9wKSkgeworICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoZ2FyYmFnZSwgb3ApIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQlnY19saXN0X21lcmdlKGZpbmFsaXplcnMsIG9sZCk7Ci0JcmV0dXJuIDA7CisgICAgZ2NfbGlzdF9tZXJnZShmaW5hbGl6ZXJzLCBvbGQpOworICAgIHJldHVybiAwOwogfQogCi0vKiBCcmVhayByZWZlcmVuY2UgY3ljbGVzIGJ5IGNsZWFyaW5nIHRoZSBjb250YWluZXJzIGludm9sdmVkLglUaGlzIGlzCisvKiBCcmVhayByZWZlcmVuY2UgY3ljbGVzIGJ5IGNsZWFyaW5nIHRoZSBjb250YWluZXJzIGludm9sdmVkLiAgVGhpcyBpcwogICogdHJpY2t5IGJ1c2luZXNzIGFzIHRoZSBsaXN0cyBjYW4gYmUgY2hhbmdpbmcgYW5kIHdlIGRvbid0IGtub3cgd2hpY2gKICAqIG9iamVjdHMgbWF5IGJlIGZyZWVkLiAgSXQgaXMgcG9zc2libGUgSSBzY3Jld2VkIHNvbWV0aGluZyB1cCBoZXJlLgogICovCiBzdGF0aWMgdm9pZAogZGVsZXRlX2dhcmJhZ2UoUHlHQ19IZWFkICpjb2xsZWN0YWJsZSwgUHlHQ19IZWFkICpvbGQpCiB7Ci0JaW5xdWlyeSBjbGVhcjsKKyAgICBpbnF1aXJ5IGNsZWFyOwogCi0Jd2hpbGUgKCFnY19saXN0X2lzX2VtcHR5KGNvbGxlY3RhYmxlKSkgewotCQlQeUdDX0hlYWQgKmdjID0gY29sbGVjdGFibGUtPmdjLmdjX25leHQ7Ci0JCVB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOworICAgIHdoaWxlICghZ2NfbGlzdF9pc19lbXB0eShjb2xsZWN0YWJsZSkpIHsKKyAgICAgICAgUHlHQ19IZWFkICpnYyA9IGNvbGxlY3RhYmxlLT5nYy5nY19uZXh0OworICAgICAgICBQeU9iamVjdCAqb3AgPSBGUk9NX0dDKGdjKTsKIAotCQlhc3NlcnQoSVNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUob3ApKTsKLQkJaWYgKGRlYnVnICYgREVCVUdfU0FWRUFMTCkgewotCQkJUHlMaXN0X0FwcGVuZChnYXJiYWdlLCBvcCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoKGNsZWFyID0gUHlfVFlQRShvcCktPnRwX2NsZWFyKSAhPSBOVUxMKSB7Ci0JCQkJUHlfSU5DUkVGKG9wKTsKLQkJCQljbGVhcihvcCk7Ci0JCQkJUHlfREVDUkVGKG9wKTsKLQkJCX0KLQkJfQotCQlpZiAoY29sbGVjdGFibGUtPmdjLmdjX25leHQgPT0gZ2MpIHsKLQkJCS8qIG9iamVjdCBpcyBzdGlsbCBhbGl2ZSwgbW92ZSBpdCwgaXQgbWF5IGRpZSBsYXRlciAqLwotCQkJZ2NfbGlzdF9tb3ZlKGdjLCBvbGQpOwotCQkJZ2MtPmdjLmdjX3JlZnMgPSBHQ19SRUFDSEFCTEU7Ci0JCX0KLQl9CisgICAgICAgIGFzc2VydChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpOworICAgICAgICBpZiAoZGVidWcgJiBERUJVR19TQVZFQUxMKSB7CisgICAgICAgICAgICBQeUxpc3RfQXBwZW5kKGdhcmJhZ2UsIG9wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoY2xlYXIgPSBQeV9UWVBFKG9wKS0+dHBfY2xlYXIpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYob3ApOworICAgICAgICAgICAgICAgIGNsZWFyKG9wKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYob3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb2xsZWN0YWJsZS0+Z2MuZ2NfbmV4dCA9PSBnYykgeworICAgICAgICAgICAgLyogb2JqZWN0IGlzIHN0aWxsIGFsaXZlLCBtb3ZlIGl0LCBpdCBtYXkgZGllIGxhdGVyICovCisgICAgICAgICAgICBnY19saXN0X21vdmUoZ2MsIG9sZCk7CisgICAgICAgICAgICBnYy0+Z2MuZ2NfcmVmcyA9IEdDX1JFQUNIQUJMRTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLyogQ2xlYXIgYWxsIGZyZWUgbGlzdHMKQEAgLTc4NiwzMyArNzg2LDMzIEBACiBzdGF0aWMgdm9pZAogY2xlYXJfZnJlZWxpc3RzKHZvaWQpCiB7Ci0JKHZvaWQpUHlNZXRob2RfQ2xlYXJGcmVlTGlzdCgpOwotCSh2b2lkKVB5RnJhbWVfQ2xlYXJGcmVlTGlzdCgpOwotCSh2b2lkKVB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3QoKTsKLQkodm9pZClQeVR1cGxlX0NsZWFyRnJlZUxpc3QoKTsKKyAgICAodm9pZClQeU1ldGhvZF9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlGcmFtZV9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdCgpOworICAgICh2b2lkKVB5VHVwbGVfQ2xlYXJGcmVlTGlzdCgpOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkodm9pZClQeVVuaWNvZGVfQ2xlYXJGcmVlTGlzdCgpOworICAgICh2b2lkKVB5VW5pY29kZV9DbGVhckZyZWVMaXN0KCk7CiAjZW5kaWYKLQkodm9pZClQeUludF9DbGVhckZyZWVMaXN0KCk7Ci0JKHZvaWQpUHlGbG9hdF9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlJbnRfQ2xlYXJGcmVlTGlzdCgpOworICAgICh2b2lkKVB5RmxvYXRfQ2xlYXJGcmVlTGlzdCgpOwogfQogCiBzdGF0aWMgZG91YmxlCiBnZXRfdGltZSh2b2lkKQogewotCWRvdWJsZSByZXN1bHQgPSAwOwotCWlmICh0bW9kICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKmYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRtb2QsICJ0aW1lIiwgTlVMTCk7Ci0JCWlmIChmID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoUHlGbG9hdF9DaGVjayhmKSkKLQkJCQlyZXN1bHQgPSBQeUZsb2F0X0FzRG91YmxlKGYpOwotCQkJUHlfREVDUkVGKGYpOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgZG91YmxlIHJlc3VsdCA9IDA7CisgICAgaWYgKHRtb2QgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqZiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodG1vZCwgInRpbWUiLCBOVUxMKTsKKyAgICAgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChQeUZsb2F0X0NoZWNrKGYpKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5RmxvYXRfQXNEb3VibGUoZik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogVGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbi4gIFJlYWQgdGhpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGUKQEAgLTgyMCwxODQgKzgyMCwxODQgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBjb2xsZWN0KGludCBnZW5lcmF0aW9uKQogewotCWludCBpOwotCVB5X3NzaXplX3QgbSA9IDA7IC8qICMgb2JqZWN0cyBjb2xsZWN0ZWQgKi8KLQlQeV9zc2l6ZV90IG4gPSAwOyAvKiAjIHVucmVhY2hhYmxlIG9iamVjdHMgdGhhdCBjb3VsZG4ndCBiZSBjb2xsZWN0ZWQgKi8KLQlQeUdDX0hlYWQgKnlvdW5nOyAvKiB0aGUgZ2VuZXJhdGlvbiB3ZSBhcmUgZXhhbWluaW5nICovCi0JUHlHQ19IZWFkICpvbGQ7IC8qIG5leHQgb2xkZXIgZ2VuZXJhdGlvbiAqLwotCVB5R0NfSGVhZCB1bnJlYWNoYWJsZTsgLyogbm9uLXByb2JsZW1hdGljIHVucmVhY2hhYmxlIHRyYXNoICovCi0JUHlHQ19IZWFkIGZpbmFsaXplcnM7ICAvKiBvYmplY3RzIHdpdGgsICYgcmVhY2hhYmxlIGZyb20sIF9fZGVsX18gKi8KLQlQeUdDX0hlYWQgKmdjOwotCWRvdWJsZSB0MSA9IDAuMDsKKyAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IG0gPSAwOyAvKiAjIG9iamVjdHMgY29sbGVjdGVkICovCisgICAgUHlfc3NpemVfdCBuID0gMDsgLyogIyB1bnJlYWNoYWJsZSBvYmplY3RzIHRoYXQgY291bGRuJ3QgYmUgY29sbGVjdGVkICovCisgICAgUHlHQ19IZWFkICp5b3VuZzsgLyogdGhlIGdlbmVyYXRpb24gd2UgYXJlIGV4YW1pbmluZyAqLworICAgIFB5R0NfSGVhZCAqb2xkOyAvKiBuZXh0IG9sZGVyIGdlbmVyYXRpb24gKi8KKyAgICBQeUdDX0hlYWQgdW5yZWFjaGFibGU7IC8qIG5vbi1wcm9ibGVtYXRpYyB1bnJlYWNoYWJsZSB0cmFzaCAqLworICAgIFB5R0NfSGVhZCBmaW5hbGl6ZXJzOyAgLyogb2JqZWN0cyB3aXRoLCAmIHJlYWNoYWJsZSBmcm9tLCBfX2RlbF9fICovCisgICAgUHlHQ19IZWFkICpnYzsKKyAgICBkb3VibGUgdDEgPSAwLjA7CiAKLQlpZiAoZGVsc3RyID09IE5VTEwpIHsKLQkJZGVsc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxfXyIpOwotCQlpZiAoZGVsc3RyID09IE5VTEwpCi0JCQlQeV9GYXRhbEVycm9yKCJnYyBjb3VsZG4ndCBhbGxvY2F0ZSBcIl9fZGVsX19cIiIpOwotCX0KKyAgICBpZiAoZGVsc3RyID09IE5VTEwpIHsKKyAgICAgICAgZGVsc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxfXyIpOworICAgICAgICBpZiAoZGVsc3RyID09IE5VTEwpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJnYyBjb3VsZG4ndCBhbGxvY2F0ZSBcIl9fZGVsX19cIiIpOworICAgIH0KIAotCWlmIChkZWJ1ZyAmIERFQlVHX1NUQVRTKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJnYzogY29sbGVjdGluZyBnZW5lcmF0aW9uICVkLi4uXG4iLAotCQkJCSAgZ2VuZXJhdGlvbik7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJnYzogb2JqZWN0cyBpbiBlYWNoIGdlbmVyYXRpb246Iik7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fR0VORVJBVElPTlM7IGkrKykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIgJSIgUFlfRk9STUFUX1NJWkVfVCAiZCIsCi0JCQkJCSAgZ2NfbGlzdF9zaXplKEdFTl9IRUFEKGkpKSk7Ci0JCXQxID0gZ2V0X3RpbWUoKTsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIlxuIik7Ci0JfQorICAgIGlmIChkZWJ1ZyAmIERFQlVHX1NUQVRTKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJnYzogY29sbGVjdGluZyBnZW5lcmF0aW9uICVkLi4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uKTsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBvYmplY3RzIGluIGVhY2ggZ2VuZXJhdGlvbjoiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiAlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjX2xpc3Rfc2l6ZShHRU5fSEVBRChpKSkpOworICAgICAgICB0MSA9IGdldF90aW1lKCk7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJcbiIpOworICAgIH0KIAotCS8qIHVwZGF0ZSBjb2xsZWN0aW9uIGFuZCBhbGxvY2F0aW9uIGNvdW50ZXJzICovCi0JaWYgKGdlbmVyYXRpb24rMSA8IE5VTV9HRU5FUkFUSU9OUykKLQkJZ2VuZXJhdGlvbnNbZ2VuZXJhdGlvbisxXS5jb3VudCArPSAxOwotCWZvciAoaSA9IDA7IGkgPD0gZ2VuZXJhdGlvbjsgaSsrKQotCQlnZW5lcmF0aW9uc1tpXS5jb3VudCA9IDA7CisgICAgLyogdXBkYXRlIGNvbGxlY3Rpb24gYW5kIGFsbG9jYXRpb24gY291bnRlcnMgKi8KKyAgICBpZiAoZ2VuZXJhdGlvbisxIDwgTlVNX0dFTkVSQVRJT05TKQorICAgICAgICBnZW5lcmF0aW9uc1tnZW5lcmF0aW9uKzFdLmNvdW50ICs9IDE7CisgICAgZm9yIChpID0gMDsgaSA8PSBnZW5lcmF0aW9uOyBpKyspCisgICAgICAgIGdlbmVyYXRpb25zW2ldLmNvdW50ID0gMDsKIAotCS8qIG1lcmdlIHlvdW5nZXIgZ2VuZXJhdGlvbnMgd2l0aCBvbmUgd2UgYXJlIGN1cnJlbnRseSBjb2xsZWN0aW5nICovCi0JZm9yIChpID0gMDsgaSA8IGdlbmVyYXRpb247IGkrKykgewotCQlnY19saXN0X21lcmdlKEdFTl9IRUFEKGkpLCBHRU5fSEVBRChnZW5lcmF0aW9uKSk7Ci0JfQorICAgIC8qIG1lcmdlIHlvdW5nZXIgZ2VuZXJhdGlvbnMgd2l0aCBvbmUgd2UgYXJlIGN1cnJlbnRseSBjb2xsZWN0aW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IGdlbmVyYXRpb247IGkrKykgeworICAgICAgICBnY19saXN0X21lcmdlKEdFTl9IRUFEKGkpLCBHRU5fSEVBRChnZW5lcmF0aW9uKSk7CisgICAgfQogCi0JLyogaGFuZHkgcmVmZXJlbmNlcyAqLwotCXlvdW5nID0gR0VOX0hFQUQoZ2VuZXJhdGlvbik7Ci0JaWYgKGdlbmVyYXRpb24gPCBOVU1fR0VORVJBVElPTlMtMSkKLQkJb2xkID0gR0VOX0hFQUQoZ2VuZXJhdGlvbisxKTsKLQllbHNlCi0JCW9sZCA9IHlvdW5nOworICAgIC8qIGhhbmR5IHJlZmVyZW5jZXMgKi8KKyAgICB5b3VuZyA9IEdFTl9IRUFEKGdlbmVyYXRpb24pOworICAgIGlmIChnZW5lcmF0aW9uIDwgTlVNX0dFTkVSQVRJT05TLTEpCisgICAgICAgIG9sZCA9IEdFTl9IRUFEKGdlbmVyYXRpb24rMSk7CisgICAgZWxzZQorICAgICAgICBvbGQgPSB5b3VuZzsKIAotCS8qIFVzaW5nIG9iX3JlZmNudCBhbmQgZ2NfcmVmcywgY2FsY3VsYXRlIHdoaWNoIG9iamVjdHMgaW4gdGhlCi0JICogY29udGFpbmVyIHNldCBhcmUgcmVhY2hhYmxlIGZyb20gb3V0c2lkZSB0aGUgc2V0IChpLmUuLCBoYXZlIGEKLQkgKiByZWZjb3VudCBncmVhdGVyIHRoYW4gMCB3aGVuIGFsbCB0aGUgcmVmZXJlbmNlcyB3aXRoaW4gdGhlCi0JICogc2V0IGFyZSB0YWtlbiBpbnRvIGFjY291bnQpLgotCSAqLwotCXVwZGF0ZV9yZWZzKHlvdW5nKTsKLQlzdWJ0cmFjdF9yZWZzKHlvdW5nKTsKKyAgICAvKiBVc2luZyBvYl9yZWZjbnQgYW5kIGdjX3JlZnMsIGNhbGN1bGF0ZSB3aGljaCBvYmplY3RzIGluIHRoZQorICAgICAqIGNvbnRhaW5lciBzZXQgYXJlIHJlYWNoYWJsZSBmcm9tIG91dHNpZGUgdGhlIHNldCAoaS5lLiwgaGF2ZSBhCisgICAgICogcmVmY291bnQgZ3JlYXRlciB0aGFuIDAgd2hlbiBhbGwgdGhlIHJlZmVyZW5jZXMgd2l0aGluIHRoZQorICAgICAqIHNldCBhcmUgdGFrZW4gaW50byBhY2NvdW50KS4KKyAgICAgKi8KKyAgICB1cGRhdGVfcmVmcyh5b3VuZyk7CisgICAgc3VidHJhY3RfcmVmcyh5b3VuZyk7CiAKLQkvKiBMZWF2ZSBldmVyeXRoaW5nIHJlYWNoYWJsZSBmcm9tIG91dHNpZGUgeW91bmcgaW4geW91bmcsIGFuZCBtb3ZlCi0JICogZXZlcnl0aGluZyBlbHNlIChpbiB5b3VuZykgdG8gdW5yZWFjaGFibGUuCi0JICogTk9URTogIFRoaXMgdXNlZCB0byBtb3ZlIHRoZSByZWFjaGFibGUgb2JqZWN0cyBpbnRvIGEgcmVhY2hhYmxlCi0JICogc2V0IGluc3RlYWQuICBCdXQgbW9zdCB0aGluZ3MgdXN1YWxseSB0dXJuIG91dCB0byBiZSByZWFjaGFibGUsCi0JICogc28gaXQncyBtb3JlIGVmZmljaWVudCB0byBtb3ZlIHRoZSB1bnJlYWNoYWJsZSB0aGluZ3MuCi0JICovCi0JZ2NfbGlzdF9pbml0KCZ1bnJlYWNoYWJsZSk7Ci0JbW92ZV91bnJlYWNoYWJsZSh5b3VuZywgJnVucmVhY2hhYmxlKTsKKyAgICAvKiBMZWF2ZSBldmVyeXRoaW5nIHJlYWNoYWJsZSBmcm9tIG91dHNpZGUgeW91bmcgaW4geW91bmcsIGFuZCBtb3ZlCisgICAgICogZXZlcnl0aGluZyBlbHNlIChpbiB5b3VuZykgdG8gdW5yZWFjaGFibGUuCisgICAgICogTk9URTogIFRoaXMgdXNlZCB0byBtb3ZlIHRoZSByZWFjaGFibGUgb2JqZWN0cyBpbnRvIGEgcmVhY2hhYmxlCisgICAgICogc2V0IGluc3RlYWQuICBCdXQgbW9zdCB0aGluZ3MgdXN1YWxseSB0dXJuIG91dCB0byBiZSByZWFjaGFibGUsCisgICAgICogc28gaXQncyBtb3JlIGVmZmljaWVudCB0byBtb3ZlIHRoZSB1bnJlYWNoYWJsZSB0aGluZ3MuCisgICAgICovCisgICAgZ2NfbGlzdF9pbml0KCZ1bnJlYWNoYWJsZSk7CisgICAgbW92ZV91bnJlYWNoYWJsZSh5b3VuZywgJnVucmVhY2hhYmxlKTsKIAotCS8qIE1vdmUgcmVhY2hhYmxlIG9iamVjdHMgdG8gbmV4dCBnZW5lcmF0aW9uLiAqLwotCWlmICh5b3VuZyAhPSBvbGQpIHsKLQkJaWYgKGdlbmVyYXRpb24gPT0gTlVNX0dFTkVSQVRJT05TIC0gMikgewotCQkJbG9uZ19saXZlZF9wZW5kaW5nICs9IGdjX2xpc3Rfc2l6ZSh5b3VuZyk7Ci0JCX0KLQkJZ2NfbGlzdF9tZXJnZSh5b3VuZywgb2xkKTsKLQl9Ci0JZWxzZSB7Ci0JCWxvbmdfbGl2ZWRfcGVuZGluZyA9IDA7Ci0JCWxvbmdfbGl2ZWRfdG90YWwgPSBnY19saXN0X3NpemUoeW91bmcpOwotCX0KKyAgICAvKiBNb3ZlIHJlYWNoYWJsZSBvYmplY3RzIHRvIG5leHQgZ2VuZXJhdGlvbi4gKi8KKyAgICBpZiAoeW91bmcgIT0gb2xkKSB7CisgICAgICAgIGlmIChnZW5lcmF0aW9uID09IE5VTV9HRU5FUkFUSU9OUyAtIDIpIHsKKyAgICAgICAgICAgIGxvbmdfbGl2ZWRfcGVuZGluZyArPSBnY19saXN0X3NpemUoeW91bmcpOworICAgICAgICB9CisgICAgICAgIGdjX2xpc3RfbWVyZ2UoeW91bmcsIG9sZCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsb25nX2xpdmVkX3BlbmRpbmcgPSAwOworICAgICAgICBsb25nX2xpdmVkX3RvdGFsID0gZ2NfbGlzdF9zaXplKHlvdW5nKTsKKyAgICB9CiAKLQkvKiBBbGwgb2JqZWN0cyBpbiB1bnJlYWNoYWJsZSBhcmUgdHJhc2gsIGJ1dCBvYmplY3RzIHJlYWNoYWJsZSBmcm9tCi0JICogZmluYWxpemVycyBjYW4ndCBzYWZlbHkgYmUgZGVsZXRlZC4gIFB5dGhvbiBwcm9ncmFtbWVycyBzaG91bGQgdGFrZQotCSAqIGNhcmUgbm90IHRvIGNyZWF0ZSBzdWNoIHRoaW5ncy4gIEZvciBQeXRob24sIGZpbmFsaXplcnMgbWVhbnMKLQkgKiBpbnN0YW5jZSBvYmplY3RzIHdpdGggX19kZWxfXyBtZXRob2RzLiAgV2Vha3JlZnMgd2l0aCBjYWxsYmFja3MKLQkgKiBjYW4gYWxzbyBjYWxsIGFyYml0cmFyeSBQeXRob24gY29kZSBidXQgdGhleSB3aWxsIGJlIGRlYWx0IHdpdGggYnkKLQkgKiBoYW5kbGVfd2Vha3JlZnMoKS4KLSAJICovCi0JZ2NfbGlzdF9pbml0KCZmaW5hbGl6ZXJzKTsKLQltb3ZlX2ZpbmFsaXplcnMoJnVucmVhY2hhYmxlLCAmZmluYWxpemVycyk7Ci0JLyogZmluYWxpemVycyBjb250YWlucyB0aGUgdW5yZWFjaGFibGUgb2JqZWN0cyB3aXRoIGEgZmluYWxpemVyOwotCSAqIHVucmVhY2hhYmxlIG9iamVjdHMgcmVhY2hhYmxlICpmcm9tKiB0aG9zZSBhcmUgYWxzbyB1bmNvbGxlY3RhYmxlLAotCSAqIGFuZCB3ZSBtb3ZlIHRob3NlIGludG8gdGhlIGZpbmFsaXplcnMgbGlzdCB0b28uCi0JICovCi0JbW92ZV9maW5hbGl6ZXJfcmVhY2hhYmxlKCZmaW5hbGl6ZXJzKTsKKyAgICAvKiBBbGwgb2JqZWN0cyBpbiB1bnJlYWNoYWJsZSBhcmUgdHJhc2gsIGJ1dCBvYmplY3RzIHJlYWNoYWJsZSBmcm9tCisgICAgICogZmluYWxpemVycyBjYW4ndCBzYWZlbHkgYmUgZGVsZXRlZC4gIFB5dGhvbiBwcm9ncmFtbWVycyBzaG91bGQgdGFrZQorICAgICAqIGNhcmUgbm90IHRvIGNyZWF0ZSBzdWNoIHRoaW5ncy4gIEZvciBQeXRob24sIGZpbmFsaXplcnMgbWVhbnMKKyAgICAgKiBpbnN0YW5jZSBvYmplY3RzIHdpdGggX19kZWxfXyBtZXRob2RzLiAgV2Vha3JlZnMgd2l0aCBjYWxsYmFja3MKKyAgICAgKiBjYW4gYWxzbyBjYWxsIGFyYml0cmFyeSBQeXRob24gY29kZSBidXQgdGhleSB3aWxsIGJlIGRlYWx0IHdpdGggYnkKKyAgICAgKiBoYW5kbGVfd2Vha3JlZnMoKS4KKyAgICAgKi8KKyAgICBnY19saXN0X2luaXQoJmZpbmFsaXplcnMpOworICAgIG1vdmVfZmluYWxpemVycygmdW5yZWFjaGFibGUsICZmaW5hbGl6ZXJzKTsKKyAgICAvKiBmaW5hbGl6ZXJzIGNvbnRhaW5zIHRoZSB1bnJlYWNoYWJsZSBvYmplY3RzIHdpdGggYSBmaW5hbGl6ZXI7CisgICAgICogdW5yZWFjaGFibGUgb2JqZWN0cyByZWFjaGFibGUgKmZyb20qIHRob3NlIGFyZSBhbHNvIHVuY29sbGVjdGFibGUsCisgICAgICogYW5kIHdlIG1vdmUgdGhvc2UgaW50byB0aGUgZmluYWxpemVycyBsaXN0IHRvby4KKyAgICAgKi8KKyAgICBtb3ZlX2ZpbmFsaXplcl9yZWFjaGFibGUoJmZpbmFsaXplcnMpOwogCi0JLyogQ29sbGVjdCBzdGF0aXN0aWNzIG9uIGNvbGxlY3RhYmxlIG9iamVjdHMgZm91bmQgYW5kIHByaW50Ci0JICogZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSAqLwotCWZvciAoZ2MgPSB1bnJlYWNoYWJsZS5nYy5nY19uZXh0OyBnYyAhPSAmdW5yZWFjaGFibGU7Ci0JCQlnYyA9IGdjLT5nYy5nY19uZXh0KSB7Ci0JCW0rKzsKLQkJaWYgKGRlYnVnICYgREVCVUdfQ09MTEVDVEFCTEUpIHsKLQkJCWRlYnVnX2N5Y2xlKCJjb2xsZWN0YWJsZSIsIEZST01fR0MoZ2MpKTsKLQkJfQotCX0KKyAgICAvKiBDb2xsZWN0IHN0YXRpc3RpY3Mgb24gY29sbGVjdGFibGUgb2JqZWN0cyBmb3VuZCBhbmQgcHJpbnQKKyAgICAgKiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgZm9yIChnYyA9IHVucmVhY2hhYmxlLmdjLmdjX25leHQ7IGdjICE9ICZ1bnJlYWNoYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgeworICAgICAgICBtKys7CisgICAgICAgIGlmIChkZWJ1ZyAmIERFQlVHX0NPTExFQ1RBQkxFKSB7CisgICAgICAgICAgICBkZWJ1Z19jeWNsZSgiY29sbGVjdGFibGUiLCBGUk9NX0dDKGdjKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBDbGVhciB3ZWFrcmVmcyBhbmQgaW52b2tlIGNhbGxiYWNrcyBhcyBuZWNlc3NhcnkuICovCi0JbSArPSBoYW5kbGVfd2Vha3JlZnMoJnVucmVhY2hhYmxlLCBvbGQpOworICAgIC8qIENsZWFyIHdlYWtyZWZzIGFuZCBpbnZva2UgY2FsbGJhY2tzIGFzIG5lY2Vzc2FyeS4gKi8KKyAgICBtICs9IGhhbmRsZV93ZWFrcmVmcygmdW5yZWFjaGFibGUsIG9sZCk7CiAKLQkvKiBDYWxsIHRwX2NsZWFyIG9uIG9iamVjdHMgaW4gdGhlIHVucmVhY2hhYmxlIHNldC4gIFRoaXMgd2lsbCBjYXVzZQotCSAqIHRoZSByZWZlcmVuY2UgY3ljbGVzIHRvIGJlIGJyb2tlbi4gIEl0IG1heSBhbHNvIGNhdXNlIHNvbWUgb2JqZWN0cwotCSAqIGluIGZpbmFsaXplcnMgdG8gYmUgZnJlZWQuCi0JICovCi0JZGVsZXRlX2dhcmJhZ2UoJnVucmVhY2hhYmxlLCBvbGQpOworICAgIC8qIENhbGwgdHBfY2xlYXIgb24gb2JqZWN0cyBpbiB0aGUgdW5yZWFjaGFibGUgc2V0LiAgVGhpcyB3aWxsIGNhdXNlCisgICAgICogdGhlIHJlZmVyZW5jZSBjeWNsZXMgdG8gYmUgYnJva2VuLiAgSXQgbWF5IGFsc28gY2F1c2Ugc29tZSBvYmplY3RzCisgICAgICogaW4gZmluYWxpemVycyB0byBiZSBmcmVlZC4KKyAgICAgKi8KKyAgICBkZWxldGVfZ2FyYmFnZSgmdW5yZWFjaGFibGUsIG9sZCk7CiAKLQkvKiBDb2xsZWN0IHN0YXRpc3RpY3Mgb24gdW5jb2xsZWN0YWJsZSBvYmplY3RzIGZvdW5kIGFuZCBwcmludAotCSAqIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gKi8KLQlmb3IgKGdjID0gZmluYWxpemVycy5nYy5nY19uZXh0OwotCSAgICAgZ2MgIT0gJmZpbmFsaXplcnM7Ci0JICAgICBnYyA9IGdjLT5nYy5nY19uZXh0KSB7Ci0JCW4rKzsKLQkJaWYgKGRlYnVnICYgREVCVUdfVU5DT0xMRUNUQUJMRSkKLQkJCWRlYnVnX2N5Y2xlKCJ1bmNvbGxlY3RhYmxlIiwgRlJPTV9HQyhnYykpOwotCX0KLQlpZiAoZGVidWcgJiBERUJVR19TVEFUUykgewotCQlkb3VibGUgdDIgPSBnZXRfdGltZSgpOwotCQlpZiAobSA9PSAwICYmIG4gPT0gMCkKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCJnYzogZG9uZSIpOwotCQllbHNlCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigKLQkJCSAgICAiZ2M6IGRvbmUsICIKLQkJCSAgICAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCB1bnJlYWNoYWJsZSwgIgotCQkJICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIHVuY29sbGVjdGFibGUiLAotCQkJICAgIG4rbSwgbik7Ci0JCWlmICh0MSAmJiB0MikgewotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiwgJS40ZnMgZWxhcHNlZCIsIHQyLXQxKTsKLQkJfQotCQlQeVN5c19Xcml0ZVN0ZGVycigiLlxuIik7Ci0JfQorICAgIC8qIENvbGxlY3Qgc3RhdGlzdGljcyBvbiB1bmNvbGxlY3RhYmxlIG9iamVjdHMgZm91bmQgYW5kIHByaW50CisgICAgICogZGVidWdnaW5nIGluZm9ybWF0aW9uLiAqLworICAgIGZvciAoZ2MgPSBmaW5hbGl6ZXJzLmdjLmdjX25leHQ7CisgICAgICAgICBnYyAhPSAmZmluYWxpemVyczsKKyAgICAgICAgIGdjID0gZ2MtPmdjLmdjX25leHQpIHsKKyAgICAgICAgbisrOworICAgICAgICBpZiAoZGVidWcgJiBERUJVR19VTkNPTExFQ1RBQkxFKQorICAgICAgICAgICAgZGVidWdfY3ljbGUoInVuY29sbGVjdGFibGUiLCBGUk9NX0dDKGdjKSk7CisgICAgfQorICAgIGlmIChkZWJ1ZyAmIERFQlVHX1NUQVRTKSB7CisgICAgICAgIGRvdWJsZSB0MiA9IGdldF90aW1lKCk7CisgICAgICAgIGlmIChtID09IDAgJiYgbiA9PSAwKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBkb25lIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKAorICAgICAgICAgICAgICAgICJnYzogZG9uZSwgIgorICAgICAgICAgICAgICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIHVucmVhY2hhYmxlLCAiCisgICAgICAgICAgICAgICAgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgdW5jb2xsZWN0YWJsZSIsCisgICAgICAgICAgICAgICAgbittLCBuKTsKKyAgICAgICAgaWYgKHQxICYmIHQyKSB7CisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiLCAlLjRmcyBlbGFwc2VkIiwgdDItdDEpOworICAgICAgICB9CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIuXG4iKTsKKyAgICB9CiAKLQkvKiBBcHBlbmQgaW5zdGFuY2VzIGluIHRoZSB1bmNvbGxlY3RhYmxlIHNldCB0byBhIFB5dGhvbgotCSAqIHJlYWNoYWJsZSBsaXN0IG9mIGdhcmJhZ2UuICBUaGUgcHJvZ3JhbW1lciBoYXMgdG8gZGVhbCB3aXRoCi0JICogdGhpcyBpZiB0aGV5IGluc2lzdCBvbiBjcmVhdGluZyB0aGlzIHR5cGUgb2Ygc3RydWN0dXJlLgotCSAqLwotCSh2b2lkKWhhbmRsZV9maW5hbGl6ZXJzKCZmaW5hbGl6ZXJzLCBvbGQpOworICAgIC8qIEFwcGVuZCBpbnN0YW5jZXMgaW4gdGhlIHVuY29sbGVjdGFibGUgc2V0IHRvIGEgUHl0aG9uCisgICAgICogcmVhY2hhYmxlIGxpc3Qgb2YgZ2FyYmFnZS4gIFRoZSBwcm9ncmFtbWVyIGhhcyB0byBkZWFsIHdpdGgKKyAgICAgKiB0aGlzIGlmIHRoZXkgaW5zaXN0IG9uIGNyZWF0aW5nIHRoaXMgdHlwZSBvZiBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgKHZvaWQpaGFuZGxlX2ZpbmFsaXplcnMoJmZpbmFsaXplcnMsIG9sZCk7CiAKLQkvKiBDbGVhciBmcmVlIGxpc3Qgb25seSBkdXJpbmcgdGhlIGNvbGxlY3Rpb24gb2YgdGhlIGhpZ2hlc3QKLQkgKiBnZW5lcmF0aW9uICovCi0JaWYgKGdlbmVyYXRpb24gPT0gTlVNX0dFTkVSQVRJT05TLTEpIHsKLQkJY2xlYXJfZnJlZWxpc3RzKCk7Ci0JfQorICAgIC8qIENsZWFyIGZyZWUgbGlzdCBvbmx5IGR1cmluZyB0aGUgY29sbGVjdGlvbiBvZiB0aGUgaGlnaGVzdAorICAgICAqIGdlbmVyYXRpb24gKi8KKyAgICBpZiAoZ2VuZXJhdGlvbiA9PSBOVU1fR0VORVJBVElPTlMtMSkgeworICAgICAgICBjbGVhcl9mcmVlbGlzdHMoKTsKKyAgICB9CiAKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlpZiAoZ2Nfc3RyID09IE5VTEwpCi0JCQlnY19zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJnYXJiYWdlIGNvbGxlY3Rpb24iKTsKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGdjX3N0cik7Ci0JCVB5X0ZhdGFsRXJyb3IoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24iKTsKLQl9Ci0JcmV0dXJuIG4rbTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBpZiAoZ2Nfc3RyID09IE5VTEwpCisgICAgICAgICAgICBnY19zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJnYXJiYWdlIGNvbGxlY3Rpb24iKTsKKyAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGdjX3N0cik7CisgICAgICAgIFB5X0ZhdGFsRXJyb3IoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24iKTsKKyAgICB9CisgICAgcmV0dXJuIG4rbTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGNvbGxlY3RfZ2VuZXJhdGlvbnModm9pZCkKIHsKLQlpbnQgaTsKLQlQeV9zc2l6ZV90IG4gPSAwOworICAgIGludCBpOworICAgIFB5X3NzaXplX3QgbiA9IDA7CiAKLQkvKiBGaW5kIHRoZSBvbGRlc3QgZ2VuZXJhdGlvbiAoaGlnaGVzdCBudW1iZXJlZCkgd2hlcmUgdGhlIGNvdW50Ci0JICogZXhjZWVkcyB0aGUgdGhyZXNob2xkLiAgT2JqZWN0cyBpbiB0aGUgdGhhdCBnZW5lcmF0aW9uIGFuZAotCSAqIGdlbmVyYXRpb25zIHlvdW5nZXIgdGhhbiBpdCB3aWxsIGJlIGNvbGxlY3RlZC4gKi8KLQlmb3IgKGkgPSBOVU1fR0VORVJBVElPTlMtMTsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKGdlbmVyYXRpb25zW2ldLmNvdW50ID4gZ2VuZXJhdGlvbnNbaV0udGhyZXNob2xkKSB7Ci0JCQkvKiBBdm9pZCBxdWFkcmF0aWMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gaW4gbnVtYmVyCi0JCQkgICBvZiB0cmFja2VkIG9iamVjdHMuIFNlZSBjb21tZW50cyBhdCB0aGUgYmVnaW5uaW5nCi0JCQkgICBvZiB0aGlzIGZpbGUsIGFuZCBpc3N1ZSAjNDA3NC4KLQkJCSovCi0JCQlpZiAoaSA9PSBOVU1fR0VORVJBVElPTlMgLSAxCi0JCQkgICAgJiYgbG9uZ19saXZlZF9wZW5kaW5nIDwgbG9uZ19saXZlZF90b3RhbCAvIDQpCi0JCQkJY29udGludWU7Ci0JCQluID0gY29sbGVjdChpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiBuOworICAgIC8qIEZpbmQgdGhlIG9sZGVzdCBnZW5lcmF0aW9uIChoaWdoZXN0IG51bWJlcmVkKSB3aGVyZSB0aGUgY291bnQKKyAgICAgKiBleGNlZWRzIHRoZSB0aHJlc2hvbGQuICBPYmplY3RzIGluIHRoZSB0aGF0IGdlbmVyYXRpb24gYW5kCisgICAgICogZ2VuZXJhdGlvbnMgeW91bmdlciB0aGFuIGl0IHdpbGwgYmUgY29sbGVjdGVkLiAqLworICAgIGZvciAoaSA9IE5VTV9HRU5FUkFUSU9OUy0xOyBpID49IDA7IGktLSkgeworICAgICAgICBpZiAoZ2VuZXJhdGlvbnNbaV0uY291bnQgPiBnZW5lcmF0aW9uc1tpXS50aHJlc2hvbGQpIHsKKyAgICAgICAgICAgIC8qIEF2b2lkIHF1YWRyYXRpYyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBpbiBudW1iZXIKKyAgICAgICAgICAgICAgIG9mIHRyYWNrZWQgb2JqZWN0cy4gU2VlIGNvbW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgICAgIG9mIHRoaXMgZmlsZSwgYW5kIGlzc3VlICM0MDc0LgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChpID09IE5VTV9HRU5FUkFUSU9OUyAtIDEKKyAgICAgICAgICAgICAgICAmJiBsb25nX2xpdmVkX3BlbmRpbmcgPCBsb25nX2xpdmVkX3RvdGFsIC8gNCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG4gPSBjb2xsZWN0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG47CiB9CiAKIFB5RG9jX1NUUlZBUihnY19lbmFibGVfX2RvY19fLApAQCAtMTAwOCw5ICsxMDA4LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19lbmFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JZW5hYmxlZCA9IDE7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuYWJsZWQgPSAxOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGdjX2Rpc2FibGVfX2RvY19fLApAQCAtMTAyMSw5ICsxMDIxLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19kaXNhYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCWVuYWJsZWQgPSAwOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmFibGVkID0gMDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihnY19pc2VuYWJsZWRfX2RvY19fLApAQCAtMTAzNCw3ICsxMDM0LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19pc2VuYWJsZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZyllbmFibGVkKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKWVuYWJsZWQpOwogfQogCiBQeURvY19TVFJWQVIoZ2NfY29sbGVjdF9fZG9jX18sCkBAIC0xMDQ4LDI3ICsxMDQ4LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2NfY29sbGVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd3MpCiB7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImdlbmVyYXRpb24iLCBOVUxMfTsKLQlpbnQgZ2VuYXJnID0gTlVNX0dFTkVSQVRJT05TIC0gMTsKLQlQeV9zc2l6ZV90IG47CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImdlbmVyYXRpb24iLCBOVUxMfTsKKyAgICBpbnQgZ2VuYXJnID0gTlVNX0dFTkVSQVRJT05TIC0gMTsKKyAgICBQeV9zc2l6ZV90IG47CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd3MsICJ8aSIsIGtleXdvcmRzLCAmZ2VuYXJnKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dzLCAifGkiLCBrZXl3b3JkcywgJmdlbmFyZykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZWxzZSBpZiAoZ2VuYXJnIDwgMCB8fCBnZW5hcmcgPj0gTlVNX0dFTkVSQVRJT05TKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBnZW5lcmF0aW9uIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBlbHNlIGlmIChnZW5hcmcgPCAwIHx8IGdlbmFyZyA+PSBOVU1fR0VORVJBVElPTlMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGdlbmVyYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGNvbGxlY3RpbmcpCi0JCW4gPSAwOyAvKiBhbHJlYWR5IGNvbGxlY3RpbmcsIGRvbid0IGRvIGFueXRoaW5nICovCi0JZWxzZSB7Ci0JCWNvbGxlY3RpbmcgPSAxOwotCQluID0gY29sbGVjdChnZW5hcmcpOwotCQljb2xsZWN0aW5nID0gMDsKLQl9CisgICAgaWYgKGNvbGxlY3RpbmcpCisgICAgICAgIG4gPSAwOyAvKiBhbHJlYWR5IGNvbGxlY3RpbmcsIGRvbid0IGRvIGFueXRoaW5nICovCisgICAgZWxzZSB7CisgICAgICAgIGNvbGxlY3RpbmcgPSAxOworICAgICAgICBuID0gY29sbGVjdChnZW5hcmcpOworICAgICAgICBjb2xsZWN0aW5nID0gMDsKKyAgICB9CiAKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3Qobik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KG4pOwogfQogCiBQeURvY19TVFJWQVIoZ2Nfc2V0X2RlYnVnX19kb2NfXywKQEAgLTEwOTAsMTEgKzEwOTAsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19zZXRfZGVidWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRfZGVidWciLCAmZGVidWcpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0X2RlYnVnIiwgJmRlYnVnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZ2NfZ2V0X2RlYnVnX19kb2NfXywKQEAgLTExMDUsNyArMTEwNSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2NfZ2V0X2RlYnVnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgZGVidWcpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgZGVidWcpOwogfQogCiBQeURvY19TVFJWQVIoZ2Nfc2V0X3RocmVzaF9fZG9jX18sCkBAIC0xMTE3LDE5ICsxMTE3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2Nfc2V0X3RocmVzaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfGlpOnNldF90aHJlc2hvbGQiLAotCQkJICAgICAgJmdlbmVyYXRpb25zWzBdLnRocmVzaG9sZCwKLQkJCSAgICAgICZnZW5lcmF0aW9uc1sxXS50aHJlc2hvbGQsCi0JCQkgICAgICAmZ2VuZXJhdGlvbnNbMl0udGhyZXNob2xkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMjsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKSB7Ci0gCQkvKiBnZW5lcmF0aW9ucyBoaWdoZXIgdGhhbiAyIGdldCB0aGUgc2FtZSB0aHJlc2hvbGQgKi8KLQkJZ2VuZXJhdGlvbnNbaV0udGhyZXNob2xkID0gZ2VuZXJhdGlvbnNbMl0udGhyZXNob2xkOwotCX0KKyAgICBpbnQgaTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8aWk6c2V0X3RocmVzaG9sZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnZW5lcmF0aW9uc1swXS50aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnZW5lcmF0aW9uc1sxXS50aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnZW5lcmF0aW9uc1syXS50aHJlc2hvbGQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAyOyBpIDwgTlVNX0dFTkVSQVRJT05TOyBpKyspIHsKKyAgICAgICAgLyogZ2VuZXJhdGlvbnMgaGlnaGVyIHRoYW4gMiBnZXQgdGhlIHNhbWUgdGhyZXNob2xkICovCisgICAgICAgIGdlbmVyYXRpb25zW2ldLnRocmVzaG9sZCA9IGdlbmVyYXRpb25zWzJdLnRocmVzaG9sZDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZ2NfZ2V0X3RocmVzaF9fZG9jX18sCkBAIC0xMTQwLDEwICsxMTQwLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2NfZ2V0X3RocmVzaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpaSkiLAotCQkJICAgICBnZW5lcmF0aW9uc1swXS50aHJlc2hvbGQsCi0JCQkgICAgIGdlbmVyYXRpb25zWzFdLnRocmVzaG9sZCwKLQkJCSAgICAgZ2VuZXJhdGlvbnNbMl0udGhyZXNob2xkKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zWzBdLnRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1sxXS50aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbMl0udGhyZXNob2xkKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdjX2dldF9jb3VudF9fZG9jX18sCkBAIC0xMTU0LDM5ICsxMTU0LDM5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2NfZ2V0X2NvdW50KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsCi0JCQkgICAgIGdlbmVyYXRpb25zWzBdLmNvdW50LAotCQkJICAgICBnZW5lcmF0aW9uc1sxXS5jb3VudCwKLQkJCSAgICAgZ2VuZXJhdGlvbnNbMl0uY291bnQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbMF0uY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbMV0uY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbMl0uY291bnQpOwogfQogCiBzdGF0aWMgaW50CiByZWZlcnJlcnN2aXNpdChQeU9iamVjdCogb2JqLCBQeU9iamVjdCAqb2JqcykKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUob2Jqcyk7IGkrKykKLQkJaWYgKFB5VHVwbGVfR0VUX0lURU0ob2JqcywgaSkgPT0gb2JqKQotCQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7CisgICAgUHlfc3NpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKG9ianMpOyBpKyspCisgICAgICAgIGlmIChQeVR1cGxlX0dFVF9JVEVNKG9ianMsIGkpID09IG9iaikKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBnY19yZWZlcnJlcnNfZm9yKFB5T2JqZWN0ICpvYmpzLCBQeUdDX0hlYWQgKmxpc3QsIFB5T2JqZWN0ICpyZXN1bHRsaXN0KQogewotCVB5R0NfSGVhZCAqZ2M7Ci0JUHlPYmplY3QgKm9iajsKLQl0cmF2ZXJzZXByb2MgdHJhdmVyc2U7Ci0JZm9yIChnYyA9IGxpc3QtPmdjLmdjX25leHQ7IGdjICE9IGxpc3Q7IGdjID0gZ2MtPmdjLmdjX25leHQpIHsKLQkJb2JqID0gRlJPTV9HQyhnYyk7Ci0JCXRyYXZlcnNlID0gUHlfVFlQRShvYmopLT50cF90cmF2ZXJzZTsKLQkJaWYgKG9iaiA9PSBvYmpzIHx8IG9iaiA9PSByZXN1bHRsaXN0KQotCQkJY29udGludWU7Ci0JCWlmICh0cmF2ZXJzZShvYmosICh2aXNpdHByb2MpcmVmZXJyZXJzdmlzaXQsIG9ianMpKSB7Ci0JCQlpZiAoUHlMaXN0X0FwcGVuZChyZXN1bHRsaXN0LCBvYmopIDwgMCkKLQkJCQlyZXR1cm4gMDsgLyogZXJyb3IgKi8KLQkJfQotCX0KLQlyZXR1cm4gMTsgLyogbm8gZXJyb3IgKi8KKyAgICBQeUdDX0hlYWQgKmdjOworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgdHJhdmVyc2Vwcm9jIHRyYXZlcnNlOworICAgIGZvciAoZ2MgPSBsaXN0LT5nYy5nY19uZXh0OyBnYyAhPSBsaXN0OyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7CisgICAgICAgIG9iaiA9IEZST01fR0MoZ2MpOworICAgICAgICB0cmF2ZXJzZSA9IFB5X1RZUEUob2JqKS0+dHBfdHJhdmVyc2U7CisgICAgICAgIGlmIChvYmogPT0gb2JqcyB8fCBvYmogPT0gcmVzdWx0bGlzdCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAodHJhdmVyc2Uob2JqLCAodmlzaXRwcm9jKXJlZmVycmVyc3Zpc2l0LCBvYmpzKSkgeworICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQocmVzdWx0bGlzdCwgb2JqKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGVycm9yICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7IC8qIG5vIGVycm9yICovCiB9CiAKIFB5RG9jX1NUUlZBUihnY19nZXRfcmVmZXJyZXJzX19kb2NfXywKQEAgLTExOTYsMjQgKzExOTYsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19nZXRfcmVmZXJyZXJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKLQlpZiAoIXJlc3VsdCkgcmV0dXJuIE5VTEw7CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKCFyZXN1bHQpIHJldHVybiBOVUxMOwogCi0JZm9yIChpID0gMDsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKSB7Ci0JCWlmICghKGdjX3JlZmVycmVyc19mb3IoYXJncywgR0VOX0hFQUQoaSksIHJlc3VsdCkpKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKSB7CisgICAgICAgIGlmICghKGdjX3JlZmVycmVyc19mb3IoYXJncywgR0VOX0hFQUQoaSksIHJlc3VsdCkpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEFwcGVuZCBvYmogdG8gbGlzdDsgcmV0dXJuIHRydWUgaWYgZXJyb3IgKG91dCBvZiBtZW1vcnkpLCBmYWxzZSBpZiBPSy4gKi8KIHN0YXRpYyBpbnQKIHJlZmVyZW50c3Zpc2l0KFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICpsaXN0KQogewotCXJldHVybiBQeUxpc3RfQXBwZW5kKGxpc3QsIG9iaikgPCAwOworICAgIHJldHVybiBQeUxpc3RfQXBwZW5kKGxpc3QsIG9iaikgPCAwOwogfQogCiBQeURvY19TVFJWQVIoZ2NfZ2V0X3JlZmVyZW50c19fZG9jX18sCkBAIC0xMjIzLDI3ICsxMjIzLDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2NfZ2V0X3JlZmVyZW50cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeUxpc3RfTmV3KDApOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKIAotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOyBpKyspIHsKLQkJdHJhdmVyc2Vwcm9jIHRyYXZlcnNlOwotCQlQeU9iamVjdCAqb2JqID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShhcmdzKTsgaSsrKSB7CisgICAgICAgIHRyYXZlcnNlcHJvYyB0cmF2ZXJzZTsKKyAgICAgICAgUHlPYmplY3QgKm9iaiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CiAKLQkJaWYgKCEgUHlPYmplY3RfSVNfR0Mob2JqKSkKLQkJCWNvbnRpbnVlOwotCQl0cmF2ZXJzZSA9IFB5X1RZUEUob2JqKS0+dHBfdHJhdmVyc2U7Ci0JCWlmICghIHRyYXZlcnNlKQotCQkJY29udGludWU7Ci0JCWlmICh0cmF2ZXJzZShvYmosICh2aXNpdHByb2MpcmVmZXJlbnRzdmlzaXQsIHJlc3VsdCkpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKCEgUHlPYmplY3RfSVNfR0Mob2JqKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB0cmF2ZXJzZSA9IFB5X1RZUEUob2JqKS0+dHBfdHJhdmVyc2U7CisgICAgICAgIGlmICghIHRyYXZlcnNlKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICh0cmF2ZXJzZShvYmosICh2aXNpdHByb2MpcmVmZXJlbnRzdmlzaXQsIHJlc3VsdCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGdjX2dldF9vYmplY3RzX19kb2NfXywKQEAgLTEyNTUsMTkgKzEyNTUsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19nZXRfb2JqZWN0cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCogcmVzdWx0OworICAgIGludCBpOworICAgIFB5T2JqZWN0KiByZXN1bHQ7CiAKLQlyZXN1bHQgPSBQeUxpc3RfTmV3KDApOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKSB7Ci0JCWlmIChhcHBlbmRfb2JqZWN0cyhyZXN1bHQsIEdFTl9IRUFEKGkpKSkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIHJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0dFTkVSQVRJT05TOyBpKyspIHsKKyAgICAgICAgaWYgKGFwcGVuZF9vYmplY3RzKHJlc3VsdCwgR0VOX0hFQUQoaSkpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihnY19pc190cmFja2VkX19kb2NfXywKQEAgLTEyODAsMTQgKzEyODAsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19pc190cmFja2VkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCi0JaWYgKFB5T2JqZWN0X0lTX0dDKG9iaikgJiYgSVNfVFJBQ0tFRChvYmopKQotCQlyZXN1bHQgPSBQeV9UcnVlOwotCWVsc2UKLQkJcmVzdWx0ID0gUHlfRmFsc2U7Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgaWYgKFB5T2JqZWN0X0lTX0dDKG9iaikgJiYgSVNfVFJBQ0tFRChvYmopKQorICAgICAgICByZXN1bHQgPSBQeV9UcnVlOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gUHlfRmFsc2U7CisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCkBAIC0xMzA5LDY3ICsxMzA5LDY3IEBACiAiZ2V0X3JlZmVyZW50cygpIC0tIFJldHVybiB0aGUgbGlzdCBvZiBvYmplY3RzIHRoYXQgYW4gb2JqZWN0IHJlZmVycyB0by5cbiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgR2NNZXRob2RzW10gPSB7Ci0JeyJlbmFibGUiLAkgICBnY19lbmFibGUsCSAgTUVUSF9OT0FSR1MsICBnY19lbmFibGVfX2RvY19ffSwKLQl7ImRpc2FibGUiLAkgICBnY19kaXNhYmxlLAkgIE1FVEhfTk9BUkdTLCAgZ2NfZGlzYWJsZV9fZG9jX199LAotCXsiaXNlbmFibGVkIiwJICAgZ2NfaXNlbmFibGVkLCAgTUVUSF9OT0FSR1MsICBnY19pc2VuYWJsZWRfX2RvY19ffSwKLQl7InNldF9kZWJ1ZyIsCSAgIGdjX3NldF9kZWJ1ZywgIE1FVEhfVkFSQVJHUywgZ2Nfc2V0X2RlYnVnX19kb2NfX30sCi0JeyJnZXRfZGVidWciLAkgICBnY19nZXRfZGVidWcsICBNRVRIX05PQVJHUywgIGdjX2dldF9kZWJ1Z19fZG9jX199LAotCXsiZ2V0X2NvdW50IiwJICAgZ2NfZ2V0X2NvdW50LCAgTUVUSF9OT0FSR1MsICBnY19nZXRfY291bnRfX2RvY19ffSwKLQl7InNldF90aHJlc2hvbGQiLCAgZ2Nfc2V0X3RocmVzaCwgTUVUSF9WQVJBUkdTLCBnY19zZXRfdGhyZXNoX19kb2NfX30sCi0JeyJnZXRfdGhyZXNob2xkIiwgIGdjX2dldF90aHJlc2gsIE1FVEhfTk9BUkdTLCAgZ2NfZ2V0X3RocmVzaF9fZG9jX199LAotCXsiY29sbGVjdCIsCSAgIChQeUNGdW5jdGlvbilnY19jb2xsZWN0LAotICAgICAgICAgCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsICAgICAgICAgICBnY19jb2xsZWN0X19kb2NfX30sCi0JeyJnZXRfb2JqZWN0cyIsICAgIGdjX2dldF9vYmplY3RzLE1FVEhfTk9BUkdTLCAgZ2NfZ2V0X29iamVjdHNfX2RvY19ffSwKLQl7ImlzX3RyYWNrZWQiLCAgICAgZ2NfaXNfdHJhY2tlZCwgTUVUSF9PLCAgICAgICBnY19pc190cmFja2VkX19kb2NfX30sCi0JeyJnZXRfcmVmZXJyZXJzIiwgIGdjX2dldF9yZWZlcnJlcnMsIE1FVEhfVkFSQVJHUywKLQkJZ2NfZ2V0X3JlZmVycmVyc19fZG9jX199LAotCXsiZ2V0X3JlZmVyZW50cyIsICBnY19nZXRfcmVmZXJlbnRzLCBNRVRIX1ZBUkFSR1MsCi0JCWdjX2dldF9yZWZlcmVudHNfX2RvY19ffSwKLQl7TlVMTCwJTlVMTH0JCS8qIFNlbnRpbmVsICovCisgICAgeyJlbmFibGUiLCAgICAgICAgICAgICBnY19lbmFibGUsICAgICBNRVRIX05PQVJHUywgIGdjX2VuYWJsZV9fZG9jX199LAorICAgIHsiZGlzYWJsZSIsICAgICAgICAgICAgZ2NfZGlzYWJsZSwgICAgTUVUSF9OT0FSR1MsICBnY19kaXNhYmxlX19kb2NfX30sCisgICAgeyJpc2VuYWJsZWQiLCAgICAgICAgICBnY19pc2VuYWJsZWQsICBNRVRIX05PQVJHUywgIGdjX2lzZW5hYmxlZF9fZG9jX199LAorICAgIHsic2V0X2RlYnVnIiwgICAgICAgICAgZ2Nfc2V0X2RlYnVnLCAgTUVUSF9WQVJBUkdTLCBnY19zZXRfZGVidWdfX2RvY19ffSwKKyAgICB7ImdldF9kZWJ1ZyIsICAgICAgICAgIGdjX2dldF9kZWJ1ZywgIE1FVEhfTk9BUkdTLCAgZ2NfZ2V0X2RlYnVnX19kb2NfX30sCisgICAgeyJnZXRfY291bnQiLCAgICAgICAgICBnY19nZXRfY291bnQsICBNRVRIX05PQVJHUywgIGdjX2dldF9jb3VudF9fZG9jX199LAorICAgIHsic2V0X3RocmVzaG9sZCIsICBnY19zZXRfdGhyZXNoLCBNRVRIX1ZBUkFSR1MsIGdjX3NldF90aHJlc2hfX2RvY19ffSwKKyAgICB7ImdldF90aHJlc2hvbGQiLCAgZ2NfZ2V0X3RocmVzaCwgTUVUSF9OT0FSR1MsICBnY19nZXRfdGhyZXNoX19kb2NfX30sCisgICAgeyJjb2xsZWN0IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2NfY29sbGVjdCwKKyAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgICAgICAgICAgIGdjX2NvbGxlY3RfX2RvY19ffSwKKyAgICB7ImdldF9vYmplY3RzIiwgICAgZ2NfZ2V0X29iamVjdHMsTUVUSF9OT0FSR1MsICBnY19nZXRfb2JqZWN0c19fZG9jX199LAorICAgIHsiaXNfdHJhY2tlZCIsICAgICBnY19pc190cmFja2VkLCBNRVRIX08sICAgICAgIGdjX2lzX3RyYWNrZWRfX2RvY19ffSwKKyAgICB7ImdldF9yZWZlcnJlcnMiLCAgZ2NfZ2V0X3JlZmVycmVycywgTUVUSF9WQVJBUkdTLAorICAgICAgICBnY19nZXRfcmVmZXJyZXJzX19kb2NfX30sCisgICAgeyJnZXRfcmVmZXJlbnRzIiwgIGdjX2dldF9yZWZlcmVudHMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgZ2NfZ2V0X3JlZmVyZW50c19fZG9jX199LAorICAgIHtOVUxMLCAgICAgIE5VTEx9ICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRnYyh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJnYyIsCi0JCQkgICAgICBHY01ldGhvZHMsCi0JCQkgICAgICBnY19fZG9jX18sCi0JCQkgICAgICBOVUxMLAotCQkJICAgICAgUFlUSE9OX0FQSV9WRVJTSU9OKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJnYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdjTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NfX2RvY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWlmIChnYXJiYWdlID09IE5VTEwpIHsKLQkJZ2FyYmFnZSA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmIChnYXJiYWdlID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JfQotCVB5X0lOQ1JFRihnYXJiYWdlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJnYXJiYWdlIiwgZ2FyYmFnZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKGdhcmJhZ2UgPT0gTlVMTCkgeworICAgICAgICBnYXJiYWdlID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgaWYgKGdhcmJhZ2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUHlfSU5DUkVGKGdhcmJhZ2UpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgImdhcmJhZ2UiLCBnYXJiYWdlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIEltcG9ydGluZyBjYW4ndCBiZSBkb25lIGluIGNvbGxlY3QoKSBiZWNhdXNlIGNvbGxlY3QoKQotCSAqIGNhbiBiZSBjYWxsZWQgdmlhIFB5R0NfQ29sbGVjdCgpIGluIFB5X0ZpbmFsaXplKCkuCi0JICogVGhpcyB3b3VsZG4ndCBiZSBhIHByb2JsZW0sIGV4Y2VwdCB0aGF0IDxpbml0aWFsaXplZD4gaXMKLQkgKiByZXNldCB0byAwIGJlZm9yZSBjYWxsaW5nIGNvbGxlY3Qgd2hpY2ggdHJpcHMgdXAKLQkgKiB0aGUgaW1wb3J0IGFuZCB0cmlnZ2VycyBhbiBhc3NlcnRpb24uCi0JICovCi0JaWYgKHRtb2QgPT0gTlVMTCkgewotCQl0bW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOwotCQlpZiAodG1vZCA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9CisgICAgLyogSW1wb3J0aW5nIGNhbid0IGJlIGRvbmUgaW4gY29sbGVjdCgpIGJlY2F1c2UgY29sbGVjdCgpCisgICAgICogY2FuIGJlIGNhbGxlZCB2aWEgUHlHQ19Db2xsZWN0KCkgaW4gUHlfRmluYWxpemUoKS4KKyAgICAgKiBUaGlzIHdvdWxkbid0IGJlIGEgcHJvYmxlbSwgZXhjZXB0IHRoYXQgPGluaXRpYWxpemVkPiBpcworICAgICAqIHJlc2V0IHRvIDAgYmVmb3JlIGNhbGxpbmcgY29sbGVjdCB3aGljaCB0cmlwcyB1cAorICAgICAqIHRoZSBpbXBvcnQgYW5kIHRyaWdnZXJzIGFuIGFzc2VydGlvbi4KKyAgICAgKi8KKyAgICBpZiAodG1vZCA9PSBOVUxMKSB7CisgICAgICAgIHRtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ0aW1lIik7CisgICAgICAgIGlmICh0bW9kID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KIAogI2RlZmluZSBBRERfSU5UKE5BTUUpIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAjTkFNRSwgTkFNRSkgPCAwKSByZXR1cm4KLQlBRERfSU5UKERFQlVHX1NUQVRTKTsKLQlBRERfSU5UKERFQlVHX0NPTExFQ1RBQkxFKTsKLQlBRERfSU5UKERFQlVHX1VOQ09MTEVDVEFCTEUpOwotCUFERF9JTlQoREVCVUdfSU5TVEFOQ0VTKTsKLQlBRERfSU5UKERFQlVHX09CSkVDVFMpOwotCUFERF9JTlQoREVCVUdfU0FWRUFMTCk7Ci0JQUREX0lOVChERUJVR19MRUFLKTsKKyAgICBBRERfSU5UKERFQlVHX1NUQVRTKTsKKyAgICBBRERfSU5UKERFQlVHX0NPTExFQ1RBQkxFKTsKKyAgICBBRERfSU5UKERFQlVHX1VOQ09MTEVDVEFCTEUpOworICAgIEFERF9JTlQoREVCVUdfSU5TVEFOQ0VTKTsKKyAgICBBRERfSU5UKERFQlVHX09CSkVDVFMpOworICAgIEFERF9JTlQoREVCVUdfU0FWRUFMTCk7CisgICAgQUREX0lOVChERUJVR19MRUFLKTsKICN1bmRlZiBBRERfSU5UCiB9CiAKQEAgLTEzNzcsMjQgKzEzNzcsMjQgQEAKIFB5X3NzaXplX3QKIFB5R0NfQ29sbGVjdCh2b2lkKQogewotCVB5X3NzaXplX3QgbjsKKyAgICBQeV9zc2l6ZV90IG47CiAKLQlpZiAoY29sbGVjdGluZykKLQkJbiA9IDA7IC8qIGFscmVhZHkgY29sbGVjdGluZywgZG9uJ3QgZG8gYW55dGhpbmcgKi8KLQllbHNlIHsKLQkJY29sbGVjdGluZyA9IDE7Ci0JCW4gPSBjb2xsZWN0KE5VTV9HRU5FUkFUSU9OUyAtIDEpOwotCQljb2xsZWN0aW5nID0gMDsKLQl9CisgICAgaWYgKGNvbGxlY3RpbmcpCisgICAgICAgIG4gPSAwOyAvKiBhbHJlYWR5IGNvbGxlY3RpbmcsIGRvbid0IGRvIGFueXRoaW5nICovCisgICAgZWxzZSB7CisgICAgICAgIGNvbGxlY3RpbmcgPSAxOworICAgICAgICBuID0gY29sbGVjdChOVU1fR0VORVJBVElPTlMgLSAxKTsKKyAgICAgICAgY29sbGVjdGluZyA9IDA7CisgICAgfQogCi0JcmV0dXJuIG47CisgICAgcmV0dXJuIG47CiB9CiAKIC8qIGZvciBkZWJ1Z2dpbmcgKi8KIHZvaWQKIF9QeUdDX0R1bXAoUHlHQ19IZWFkICpnKQogewotCV9QeU9iamVjdF9EdW1wKEZST01fR0MoZykpOworICAgIF9QeU9iamVjdF9EdW1wKEZST01fR0MoZykpOwogfQogCiAvKiBleHRlbnNpb24gbW9kdWxlcyBtaWdodCBiZSBjb21waWxlZCB3aXRoIEdDIHN1cHBvcnQgc28gdGhlc2UKQEAgLTE0MDgsNyArMTQwOCw3IEBACiB2b2lkCiBQeU9iamVjdF9HQ19UcmFjayh2b2lkICpvcCkKIHsKLQlfUHlPYmplY3RfR0NfVFJBQ0sob3ApOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CiB9CiAKIC8qIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIDIuMiAqLwpAQCAtMTQyMSwxMSArMTQyMSwxMSBAQAogdm9pZAogUHlPYmplY3RfR0NfVW5UcmFjayh2b2lkICpvcCkKIHsKLQkvKiBPYnNjdXJlOiAgdGhlIFB5X1RSQVNIQ0FOIG1lY2hhbmlzbSByZXF1aXJlcyB0aGF0IHdlIGJlIGFibGUgdG8KLQkgKiBjYWxsIFB5T2JqZWN0X0dDX1VuVHJhY2sgdHdpY2Ugb24gYW4gb2JqZWN0LgotCSAqLwotCWlmIChJU19UUkFDS0VEKG9wKSkKLQkJX1B5T2JqZWN0X0dDX1VOVFJBQ0sob3ApOworICAgIC8qIE9ic2N1cmU6ICB0aGUgUHlfVFJBU0hDQU4gbWVjaGFuaXNtIHJlcXVpcmVzIHRoYXQgd2UgYmUgYWJsZSB0bworICAgICAqIGNhbGwgUHlPYmplY3RfR0NfVW5UcmFjayB0d2ljZSBvbiBhbiBvYmplY3QuCisgICAgICovCisgICAgaWYgKElTX1RSQUNLRUQob3ApKQorICAgICAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhvcCk7CiB9CiAKIC8qIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIDIuMiAqLwpAQCAtMTQzOCw3MyArMTQzOCw3MyBAQAogUHlPYmplY3QgKgogX1B5T2JqZWN0X0dDX01hbGxvYyhzaXplX3QgYmFzaWNzaXplKQogewotCVB5T2JqZWN0ICpvcDsKLQlQeUdDX0hlYWQgKmc7Ci0JaWYgKGJhc2ljc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5R0NfSGVhZCkpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWcgPSAoUHlHQ19IZWFkICopUHlPYmplY3RfTUFMTE9DKAotICAgICAgICAgICAgICAgIHNpemVvZihQeUdDX0hlYWQpICsgYmFzaWNzaXplKTsKLQlpZiAoZyA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlnLT5nYy5nY19yZWZzID0gR0NfVU5UUkFDS0VEOwotCWdlbmVyYXRpb25zWzBdLmNvdW50Kys7IC8qIG51bWJlciBvZiBhbGxvY2F0ZWQgR0Mgb2JqZWN0cyAqLwotIAlpZiAoZ2VuZXJhdGlvbnNbMF0uY291bnQgPiBnZW5lcmF0aW9uc1swXS50aHJlc2hvbGQgJiYKLSAJICAgIGVuYWJsZWQgJiYKLSAJICAgIGdlbmVyYXRpb25zWzBdLnRocmVzaG9sZCAmJgotIAkgICAgIWNvbGxlY3RpbmcgJiYKLSAJICAgICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWNvbGxlY3RpbmcgPSAxOwotCQljb2xsZWN0X2dlbmVyYXRpb25zKCk7Ci0JCWNvbGxlY3RpbmcgPSAwOwotCX0KLQlvcCA9IEZST01fR0MoZyk7Ci0JcmV0dXJuIG9wOworICAgIFB5T2JqZWN0ICpvcDsKKyAgICBQeUdDX0hlYWQgKmc7CisgICAgaWYgKGJhc2ljc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5R0NfSGVhZCkpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGcgPSAoUHlHQ19IZWFkICopUHlPYmplY3RfTUFMTE9DKAorICAgICAgICBzaXplb2YoUHlHQ19IZWFkKSArIGJhc2ljc2l6ZSk7CisgICAgaWYgKGcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgZy0+Z2MuZ2NfcmVmcyA9IEdDX1VOVFJBQ0tFRDsKKyAgICBnZW5lcmF0aW9uc1swXS5jb3VudCsrOyAvKiBudW1iZXIgb2YgYWxsb2NhdGVkIEdDIG9iamVjdHMgKi8KKyAgICBpZiAoZ2VuZXJhdGlvbnNbMF0uY291bnQgPiBnZW5lcmF0aW9uc1swXS50aHJlc2hvbGQgJiYKKyAgICAgICAgZW5hYmxlZCAmJgorICAgICAgICBnZW5lcmF0aW9uc1swXS50aHJlc2hvbGQgJiYKKyAgICAgICAgIWNvbGxlY3RpbmcgJiYKKyAgICAgICAgIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgY29sbGVjdGluZyA9IDE7CisgICAgICAgIGNvbGxlY3RfZ2VuZXJhdGlvbnMoKTsKKyAgICAgICAgY29sbGVjdGluZyA9IDA7CisgICAgfQorICAgIG9wID0gRlJPTV9HQyhnKTsKKyAgICByZXR1cm4gb3A7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeU9iamVjdF9HQ19OZXcoUHlUeXBlT2JqZWN0ICp0cCkKIHsKLQlQeU9iamVjdCAqb3AgPSBfUHlPYmplY3RfR0NfTWFsbG9jKF9QeU9iamVjdF9TSVpFKHRwKSk7Ci0JaWYgKG9wICE9IE5VTEwpCi0JCW9wID0gUHlPYmplY3RfSU5JVChvcCwgdHApOwotCXJldHVybiBvcDsKKyAgICBQeU9iamVjdCAqb3AgPSBfUHlPYmplY3RfR0NfTWFsbG9jKF9QeU9iamVjdF9TSVpFKHRwKSk7CisgICAgaWYgKG9wICE9IE5VTEwpCisgICAgICAgIG9wID0gUHlPYmplY3RfSU5JVChvcCwgdHApOworICAgIHJldHVybiBvcDsKIH0KIAogUHlWYXJPYmplY3QgKgogX1B5T2JqZWN0X0dDX05ld1ZhcihQeVR5cGVPYmplY3QgKnRwLCBQeV9zc2l6ZV90IG5pdGVtcykKIHsKLQljb25zdCBzaXplX3Qgc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRSh0cCwgbml0ZW1zKTsKLQlQeVZhck9iamVjdCAqb3AgPSAoUHlWYXJPYmplY3QgKikgX1B5T2JqZWN0X0dDX01hbGxvYyhzaXplKTsKLQlpZiAob3AgIT0gTlVMTCkKLQkJb3AgPSBQeU9iamVjdF9JTklUX1ZBUihvcCwgdHAsIG5pdGVtcyk7Ci0JcmV0dXJuIG9wOworICAgIGNvbnN0IHNpemVfdCBzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHRwLCBuaXRlbXMpOworICAgIFB5VmFyT2JqZWN0ICpvcCA9IChQeVZhck9iamVjdCAqKSBfUHlPYmplY3RfR0NfTWFsbG9jKHNpemUpOworICAgIGlmIChvcCAhPSBOVUxMKQorICAgICAgICBvcCA9IFB5T2JqZWN0X0lOSVRfVkFSKG9wLCB0cCwgbml0ZW1zKTsKKyAgICByZXR1cm4gb3A7CiB9CiAKIFB5VmFyT2JqZWN0ICoKIF9QeU9iamVjdF9HQ19SZXNpemUoUHlWYXJPYmplY3QgKm9wLCBQeV9zc2l6ZV90IG5pdGVtcykKIHsKLQljb25zdCBzaXplX3QgYmFzaWNzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKFB5X1RZUEUob3ApLCBuaXRlbXMpOwotCVB5R0NfSGVhZCAqZyA9IEFTX0dDKG9wKTsKLQlpZiAoYmFzaWNzaXplID4gUFlfU1NJWkVfVF9NQVggLSBzaXplb2YoUHlHQ19IZWFkKSkKLQkJcmV0dXJuIChQeVZhck9iamVjdCAqKVB5RXJyX05vTWVtb3J5KCk7Ci0JZyA9IChQeUdDX0hlYWQgKilQeU9iamVjdF9SRUFMTE9DKGcsICBzaXplb2YoUHlHQ19IZWFkKSArIGJhc2ljc2l6ZSk7Ci0JaWYgKGcgPT0gTlVMTCkKLQkJcmV0dXJuIChQeVZhck9iamVjdCAqKVB5RXJyX05vTWVtb3J5KCk7Ci0Jb3AgPSAoUHlWYXJPYmplY3QgKikgRlJPTV9HQyhnKTsKLQlQeV9TSVpFKG9wKSA9IG5pdGVtczsKLQlyZXR1cm4gb3A7CisgICAgY29uc3Qgc2l6ZV90IGJhc2ljc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRShQeV9UWVBFKG9wKSwgbml0ZW1zKTsKKyAgICBQeUdDX0hlYWQgKmcgPSBBU19HQyhvcCk7CisgICAgaWYgKGJhc2ljc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5R0NfSGVhZCkpCisgICAgICAgIHJldHVybiAoUHlWYXJPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOworICAgIGcgPSAoUHlHQ19IZWFkICopUHlPYmplY3RfUkVBTExPQyhnLCAgc2l6ZW9mKFB5R0NfSGVhZCkgKyBiYXNpY3NpemUpOworICAgIGlmIChnID09IE5VTEwpCisgICAgICAgIHJldHVybiAoUHlWYXJPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOworICAgIG9wID0gKFB5VmFyT2JqZWN0ICopIEZST01fR0MoZyk7CisgICAgUHlfU0laRShvcCkgPSBuaXRlbXM7CisgICAgcmV0dXJuIG9wOwogfQogCiB2b2lkCiBQeU9iamVjdF9HQ19EZWwodm9pZCAqb3ApCiB7Ci0JUHlHQ19IZWFkICpnID0gQVNfR0Mob3ApOwotCWlmIChJU19UUkFDS0VEKG9wKSkKLQkJZ2NfbGlzdF9yZW1vdmUoZyk7Ci0JaWYgKGdlbmVyYXRpb25zWzBdLmNvdW50ID4gMCkgewotCQlnZW5lcmF0aW9uc1swXS5jb3VudC0tOwotCX0KLQlQeU9iamVjdF9GUkVFKGcpOworICAgIFB5R0NfSGVhZCAqZyA9IEFTX0dDKG9wKTsKKyAgICBpZiAoSVNfVFJBQ0tFRChvcCkpCisgICAgICAgIGdjX2xpc3RfcmVtb3ZlKGcpOworICAgIGlmIChnZW5lcmF0aW9uc1swXS5jb3VudCA+IDApIHsKKyAgICAgICAgZ2VuZXJhdGlvbnNbMF0uY291bnQtLTsKKyAgICB9CisgICAgUHlPYmplY3RfRlJFRShnKTsKIH0KIAogLyogZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggMi4yICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldGFkZHJpbmZvLmMgYi9Nb2R1bGVzL2dldGFkZHJpbmZvLmMKaW5kZXggNGQxOWMzNC4uMWQwYmZiYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRhZGRyaW5mby5jCisrKyBiL01vZHVsZXMvZ2V0YWRkcmluZm8uYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKKyAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICogYXJlIG1ldDoKQEAgLTEzLDcgKzEzLDcgQEAKICAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCisgKgogICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICAqIEdBSV9BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCkBAIC03Myw1MiArNzMsNTIgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgaW5fYWRkcmFueVtdID0geyAwLCAwLCAwLCAwIH07CiBzdGF0aWMgY29uc3QgY2hhciBpbjZfYWRkcmFueVtdID0gewotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCiB9Owotc3RhdGljIGNvbnN0IGNoYXIgaW5fbG9vcGJhY2tbXSA9IHsgMTI3LCAwLCAwLCAxIH07IAorc3RhdGljIGNvbnN0IGNoYXIgaW5fbG9vcGJhY2tbXSA9IHsgMTI3LCAwLCAwLCAxIH07CiBzdGF0aWMgY29uc3QgY2hhciBpbjZfbG9vcGJhY2tbXSA9IHsKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMQogfTsKIAogc3RydWN0IHNvY2tpbmV0IHsKLQl1X2NoYXIJc2lfbGVuOwotCXVfY2hhcglzaV9mYW1pbHk7Ci0JdV9zaG9ydAlzaV9wb3J0OworICAgIHVfY2hhciAgICAgIHNpX2xlbjsKKyAgICB1X2NoYXIgICAgICBzaV9mYW1pbHk7CisgICAgdV9zaG9ydCAgICAgc2lfcG9ydDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZ2FpX2FmZCB7Ci0JaW50IGFfYWY7Ci0JaW50IGFfYWRkcmxlbjsKLQlpbnQgYV9zb2NrbGVuOwotCWludCBhX29mZjsKLQljb25zdCBjaGFyICphX2FkZHJhbnk7Ci0JY29uc3QgY2hhciAqYV9sb29wYmFjazsJCisgICAgaW50IGFfYWY7CisgICAgaW50IGFfYWRkcmxlbjsKKyAgICBpbnQgYV9zb2NrbGVuOworICAgIGludCBhX29mZjsKKyAgICBjb25zdCBjaGFyICphX2FkZHJhbnk7CisgICAgY29uc3QgY2hhciAqYV9sb29wYmFjazsKIH0gZ2FpX2FmZGwgW10gPSB7CiAjaWZkZWYgRU5BQkxFX0lQVjYKICNkZWZpbmUgTl9JTkVUNiAwCi0Je1BGX0lORVQ2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKLQkgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpLAotCSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW42LCBzaW42X2FkZHIpLAotCSBpbjZfYWRkcmFueSwgaW42X2xvb3BiYWNrfSwKKyAgICB7UEZfSU5FVDYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAorICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNiksCisgICAgIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbjYsIHNpbjZfYWRkciksCisgICAgIGluNl9hZGRyYW55LCBpbjZfbG9vcGJhY2t9LAogI2RlZmluZSBOX0lORVQgIDEKICNlbHNlCiAjZGVmaW5lIE5fSU5FVCAgMAogI2VuZGlmCi0Je1BGX0lORVQsIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksCi0JIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLAotCSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW4sIHNpbl9hZGRyKSwKLQkgaW5fYWRkcmFueSwgaW5fbG9vcGJhY2t9LAotCXswLCAwLCAwLCAwLCBOVUxMLCBOVUxMfSwKKyAgICB7UEZfSU5FVCwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwKKyAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksCisgICAgIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbiwgc2luX2FkZHIpLAorICAgICBpbl9hZGRyYW55LCBpbl9sb29wYmFja30sCisgICAgezAsIDAsIDAsIDAsIE5VTEwsIE5VTEx9LAogfTsKIAogI2lmZGVmIEVOQUJMRV9JUFY2Ci0jZGVmaW5lIFBUT05fTUFYCTE2CisjZGVmaW5lIFBUT05fTUFYICAgICAgICAxNgogI2Vsc2UKLSNkZWZpbmUgUFRPTl9NQVgJNAorI2RlZmluZSBQVE9OX01BWCAgICAgICAgNAogI2VuZGlmCiAKICNpZm5kZWYgSU5fTVVMVElDQVNUCi0jZGVmaW5lIElOX01VTFRJQ0FTVChpKQkgICAgKCgoaSkgJiAweGYwMDAwMDAwVSkgPT0gMHhlMDAwMDAwMFUpCisjZGVmaW5lIElOX01VTFRJQ0FTVChpKSAgICAgKCgoaSkgJiAweGYwMDAwMDAwVSkgPT0gMHhlMDAwMDAwMFUpCiAjZW5kaWYKIAogI2lmbmRlZiBJTl9FWFBFUklNRU5UQUwKQEAgLTEyNiw3MyArMTI2LDczIEBACiAjZW5kaWYKIAogI2lmbmRlZiBJTl9MT09QQkFDS05FVAotI2RlZmluZSBJTl9MT09QQkFDS05FVAkgICAgMTI3CisjZGVmaW5lIElOX0xPT1BCQUNLTkVUICAgICAgMTI3CiAjZW5kaWYKIAogc3RhdGljIGludCBnZXRfbmFtZSBQeV9QUk9UTygoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZ2FpX2FmZCAqLAotCQkJICBzdHJ1Y3QgYWRkcmluZm8gKiosIGNoYXIgKiwgc3RydWN0IGFkZHJpbmZvICosCi0JCQkgIGludCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWRkcmluZm8gKiosIGNoYXIgKiwgc3RydWN0IGFkZHJpbmZvICosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCkpOwogc3RhdGljIGludCBnZXRfYWRkciBQeV9QUk9UTygoY29uc3QgY2hhciAqLCBpbnQsIHN0cnVjdCBhZGRyaW5mbyAqKiwKLQkJCXN0cnVjdCBhZGRyaW5mbyAqLCBpbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhZGRyaW5mbyAqLCBpbnQpKTsKIHN0YXRpYyBpbnQgc3RyX2lzbnVtYmVyIFB5X1BST1RPKChjb25zdCBjaGFyICopKTsKLQkKKwogc3RhdGljIGNoYXIgKmFpX2Vycmxpc3RbXSA9IHsKLQkic3VjY2Vzcy4iLAotCSJhZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZC4iLAkvKiBFQUlfQUREUkZBTUlMWSAqLwotCSJ0ZW1wb3JhcnkgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24uIiwJLyogRUFJX0FHQUlOICAgICAgKi8KLQkiaW52YWxpZCB2YWx1ZSBmb3IgYWlfZmxhZ3MuIiwJCSAgICAgICAJLyogRUFJX0JBREZMQUdTICAgKi8KLQkibm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsIAkvKiBFQUlfRkFJTCAgICAgICAqLwotCSJhaV9mYW1pbHkgbm90IHN1cHBvcnRlZC4iLAkJCS8qIEVBSV9GQU1JTFkgICAgICovCi0JIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuIiwgCQkJLyogRUFJX01FTU9SWSAgICAgKi8KLQkibm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggaG9zdG5hbWUuIiwgCS8qIEVBSV9OT0RBVEEgICAgICovCi0JImhvc3RuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duLiIsLyogRUFJX05PTkFNRSAgICAgKi8KLQkic2Vydm5hbWUgbm90IHN1cHBvcnRlZCBmb3IgYWlfc29ja3R5cGUuIiwJLyogRUFJX1NFUlZJQ0UgICAgKi8KLQkiYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZC4iLCAJCQkvKiBFQUlfU09DS1RZUEUgICAqLwotCSJzeXN0ZW0gZXJyb3IgcmV0dXJuZWQgaW4gZXJybm8uIiwgCQkvKiBFQUlfU1lTVEVNICAgICAqLwotCSJpbnZhbGlkIHZhbHVlIGZvciBoaW50cy4iLAkJCS8qIEVBSV9CQURISU5UUwkgICovCi0JInJlc29sdmVkIHByb3RvY29sIGlzIHVua25vd24uIiwJCS8qIEVBSV9QUk9UT0NPTCAgICovCi0JInVua25vd24gZXJyb3IuIiwgCQkJCS8qIEVBSV9NQVggICAgICAgICovCisgICAgInN1Y2Nlc3MuIiwKKyAgICAiYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQuIiwgICAgICAgLyogRUFJX0FERFJGQU1JTFkgKi8KKyAgICAidGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsICAgICAgICAgICAgLyogRUFJX0FHQUlOICAgICAgKi8KKyAgICAiaW52YWxpZCB2YWx1ZSBmb3IgYWlfZmxhZ3MuIiwgICAgICAgICAgICAgICAgICAgICAgLyogRUFJX0JBREZMQUdTICAgKi8KKyAgICAibm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsICAgICAgLyogRUFJX0ZBSUwgICAgICAgKi8KKyAgICAiYWlfZmFtaWx5IG5vdCBzdXBwb3J0ZWQuIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRUFJX0ZBTUlMWSAgICAgKi8KKyAgICAibWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4iLCAgICAgICAgICAgICAgICAgICAgICAgLyogRUFJX01FTU9SWSAgICAgKi8KKyAgICAibm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggaG9zdG5hbWUuIiwgICAgICAgICAgICAgLyogRUFJX05PREFUQSAgICAgKi8KKyAgICAiaG9zdG5hbWUgbm9yIHNlcnZuYW1lIHByb3ZpZGVkLCBvciBub3Qga25vd24uIiwvKiBFQUlfTk9OQU1FICAgICAqLworICAgICJzZXJ2bmFtZSBub3Qgc3VwcG9ydGVkIGZvciBhaV9zb2NrdHlwZS4iLCAgICAgICAgICAvKiBFQUlfU0VSVklDRSAgICAqLworICAgICJhaV9zb2NrdHlwZSBub3Qgc3VwcG9ydGVkLiIsICAgICAgICAgICAgICAgICAgICAgICAvKiBFQUlfU09DS1RZUEUgICAqLworICAgICJzeXN0ZW0gZXJyb3IgcmV0dXJuZWQgaW4gZXJybm8uIiwgICAgICAgICAgICAgICAgICAvKiBFQUlfU1lTVEVNICAgICAqLworICAgICJpbnZhbGlkIHZhbHVlIGZvciBoaW50cy4iLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFQUlfQkFESElOVFMgICAqLworICAgICJyZXNvbHZlZCBwcm90b2NvbCBpcyB1bmtub3duLiIsICAgICAgICAgICAgICAgICAgICAvKiBFQUlfUFJPVE9DT0wgICAqLworICAgICJ1bmtub3duIGVycm9yLiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFQUlfTUFYICAgICAgICAqLwogfTsKIAogI2RlZmluZSBHRVRfQ0FOT05OQU1FKGFpLCBzdHIpIFwKIGlmIChwYWktPmFpX2ZsYWdzICYgQUlfQ0FOT05OQU1FKSB7XAotCWlmICgoKGFpKS0+YWlfY2Fub25uYW1lID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHN0cikgKyAxKSkgIT0gTlVMTCkge1wKLQkJc3RyY3B5KChhaSktPmFpX2Nhbm9ubmFtZSwgKHN0cikpO1wKLQl9IGVsc2Uge1wKLQkJZXJyb3IgPSBFQUlfTUVNT1JZO1wKLQkJZ290byBmcmVlO1wKLQl9XAorICAgIGlmICgoKGFpKS0+YWlfY2Fub25uYW1lID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHN0cikgKyAxKSkgIT0gTlVMTCkge1wKKyAgICAgICAgc3RyY3B5KChhaSktPmFpX2Nhbm9ubmFtZSwgKHN0cikpO1wKKyAgICB9IGVsc2Uge1wKKyAgICAgICAgZXJyb3IgPSBFQUlfTUVNT1JZO1wKKyAgICAgICAgZ290byBmcmVlO1wKKyAgICB9XAogfQogCiAjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KICNkZWZpbmUgR0VUX0FJKGFpLCBnYWlfYWZkLCBhZGRyLCBwb3J0KSB7XAotCWNoYXIgKnA7XAotCWlmICgoKGFpKSA9IChzdHJ1Y3QgYWRkcmluZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykgK1wKLQkJCQkJICAgICAgKChnYWlfYWZkKS0+YV9zb2NrbGVuKSkpXAotCSAgICA9PSBOVUxMKSBnb3RvIGZyZWU7XAotCW1lbWNweShhaSwgcGFpLCBzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSk7XAotCShhaSktPmFpX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopKChhaSkgKyAxKTtcCi0JbWVtc2V0KChhaSktPmFpX2FkZHIsIDAsIChnYWlfYWZkKS0+YV9zb2NrbGVuKTtcCi0JKGFpKS0+YWlfYWRkci0+c2FfbGVuID0gKGFpKS0+YWlfYWRkcmxlbiA9IChnYWlfYWZkKS0+YV9zb2NrbGVuO1wKLQkoYWkpLT5haV9hZGRyLT5zYV9mYW1pbHkgPSAoYWkpLT5haV9mYW1pbHkgPSAoZ2FpX2FmZCktPmFfYWY7XAotCSgoc3RydWN0IHNvY2tpbmV0ICopKGFpKS0+YWlfYWRkciktPnNpX3BvcnQgPSBwb3J0O1wKLQlwID0gKGNoYXIgKikoKGFpKS0+YWlfYWRkcik7XAotCW1lbWNweShwICsgKGdhaV9hZmQpLT5hX29mZiwgKGFkZHIpLCAoZ2FpX2FmZCktPmFfYWRkcmxlbik7XAorICAgIGNoYXIgKnA7XAorICAgIGlmICgoKGFpKSA9IChzdHJ1Y3QgYWRkcmluZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykgK1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ2FpX2FmZCktPmFfc29ja2xlbikpKVwKKyAgICAgICAgPT0gTlVMTCkgZ290byBmcmVlO1wKKyAgICBtZW1jcHkoYWksIHBhaSwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpO1wKKyAgICAoYWkpLT5haV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSgoYWkpICsgMSk7XAorICAgIG1lbXNldCgoYWkpLT5haV9hZGRyLCAwLCAoZ2FpX2FmZCktPmFfc29ja2xlbik7XAorICAgIChhaSktPmFpX2FkZHItPnNhX2xlbiA9IChhaSktPmFpX2FkZHJsZW4gPSAoZ2FpX2FmZCktPmFfc29ja2xlbjtcCisgICAgKGFpKS0+YWlfYWRkci0+c2FfZmFtaWx5ID0gKGFpKS0+YWlfZmFtaWx5ID0gKGdhaV9hZmQpLT5hX2FmO1wKKyAgICAoKHN0cnVjdCBzb2NraW5ldCAqKShhaSktPmFpX2FkZHIpLT5zaV9wb3J0ID0gcG9ydDtcCisgICAgcCA9IChjaGFyICopKChhaSktPmFpX2FkZHIpO1wKKyAgICBtZW1jcHkocCArIChnYWlfYWZkKS0+YV9vZmYsIChhZGRyKSwgKGdhaV9hZmQpLT5hX2FkZHJsZW4pO1wKIH0KICNlbHNlCiAjZGVmaW5lIEdFVF9BSShhaSwgZ2FpX2FmZCwgYWRkciwgcG9ydCkge1wKLQljaGFyICpwO1wKLQlpZiAoKChhaSkgPSAoc3RydWN0IGFkZHJpbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pICtcCi0JCQkJCSAgICAgICgoZ2FpX2FmZCktPmFfc29ja2xlbikpKVwKLQkgICAgPT0gTlVMTCkgZ290byBmcmVlO1wKLQltZW1jcHkoYWksIHBhaSwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpO1wKLQkoYWkpLT5haV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSgoYWkpICsgMSk7XAotCW1lbXNldCgoYWkpLT5haV9hZGRyLCAwLCAoZ2FpX2FmZCktPmFfc29ja2xlbik7XAotCShhaSktPmFpX2FkZHJsZW4gPSAoZ2FpX2FmZCktPmFfc29ja2xlbjtcCi0JKGFpKS0+YWlfYWRkci0+c2FfZmFtaWx5ID0gKGFpKS0+YWlfZmFtaWx5ID0gKGdhaV9hZmQpLT5hX2FmO1wKLQkoKHN0cnVjdCBzb2NraW5ldCAqKShhaSktPmFpX2FkZHIpLT5zaV9wb3J0ID0gcG9ydDtcCi0JcCA9IChjaGFyICopKChhaSktPmFpX2FkZHIpO1wKLQltZW1jcHkocCArIChnYWlfYWZkKS0+YV9vZmYsIChhZGRyKSwgKGdhaV9hZmQpLT5hX2FkZHJsZW4pO1wKKyAgICBjaGFyICpwO1wKKyAgICBpZiAoKChhaSkgPSAoc3RydWN0IGFkZHJpbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pICtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdhaV9hZmQpLT5hX3NvY2tsZW4pKSlcCisgICAgICAgID09IE5VTEwpIGdvdG8gZnJlZTtcCisgICAgbWVtY3B5KGFpLCBwYWksIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTtcCisgICAgKGFpKS0+YWlfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikoKGFpKSArIDEpO1wKKyAgICBtZW1zZXQoKGFpKS0+YWlfYWRkciwgMCwgKGdhaV9hZmQpLT5hX3NvY2tsZW4pO1wKKyAgICAoYWkpLT5haV9hZGRybGVuID0gKGdhaV9hZmQpLT5hX3NvY2tsZW47XAorICAgIChhaSktPmFpX2FkZHItPnNhX2ZhbWlseSA9IChhaSktPmFpX2ZhbWlseSA9IChnYWlfYWZkKS0+YV9hZjtcCisgICAgKChzdHJ1Y3Qgc29ja2luZXQgKikoYWkpLT5haV9hZGRyKS0+c2lfcG9ydCA9IHBvcnQ7XAorICAgIHAgPSAoY2hhciAqKSgoYWkpLT5haV9hZGRyKTtcCisgICAgbWVtY3B5KHAgKyAoZ2FpX2FmZCktPmFfb2ZmLCAoYWRkciksIChnYWlfYWZkKS0+YV9hZGRybGVuKTtcCiB9CiAjZW5kaWYKIApAQCAtMjAxLDQzOCArMjAxLDQzOCBAQAogY2hhciAqCiBnYWlfc3RyZXJyb3IoaW50IGVjb2RlKQogewotCWlmIChlY29kZSA8IDAgfHwgZWNvZGUgPiBFQUlfTUFYKQotCQllY29kZSA9IEVBSV9NQVg7Ci0JcmV0dXJuIGFpX2Vycmxpc3RbZWNvZGVdOworICAgIGlmIChlY29kZSA8IDAgfHwgZWNvZGUgPiBFQUlfTUFYKQorICAgICAgICBlY29kZSA9IEVBSV9NQVg7CisgICAgcmV0dXJuIGFpX2Vycmxpc3RbZWNvZGVdOwogfQogCiB2b2lkCiBmcmVlYWRkcmluZm8oc3RydWN0IGFkZHJpbmZvICphaSkKIHsKLQlzdHJ1Y3QgYWRkcmluZm8gKm5leHQ7CisgICAgc3RydWN0IGFkZHJpbmZvICpuZXh0OwogCi0JZG8gewotCQluZXh0ID0gYWktPmFpX25leHQ7Ci0JCWlmIChhaS0+YWlfY2Fub25uYW1lKQotCQkJZnJlZShhaS0+YWlfY2Fub25uYW1lKTsKLQkJLyogbm8gbmVlZCB0byBmcmVlKGFpLT5haV9hZGRyKSAqLwotCQlmcmVlKGFpKTsKLQl9IHdoaWxlICgoYWkgPSBuZXh0KSAhPSBOVUxMKTsKKyAgICBkbyB7CisgICAgICAgIG5leHQgPSBhaS0+YWlfbmV4dDsKKyAgICAgICAgaWYgKGFpLT5haV9jYW5vbm5hbWUpCisgICAgICAgICAgICBmcmVlKGFpLT5haV9jYW5vbm5hbWUpOworICAgICAgICAvKiBubyBuZWVkIHRvIGZyZWUoYWktPmFpX2FkZHIpICovCisgICAgICAgIGZyZWUoYWkpOworICAgIH0gd2hpbGUgKChhaSA9IG5leHQpICE9IE5VTEwpOwogfQogCiBzdGF0aWMgaW50CiBzdHJfaXNudW1iZXIoY29uc3QgY2hhciAqcCkKIHsKLQl1bnNpZ25lZCBjaGFyICpxID0gKHVuc2lnbmVkIGNoYXIgKilwOwotCXdoaWxlICgqcSkgewotCQlpZiAoISBpc2RpZ2l0KCpxKSkKLQkJCXJldHVybiBOTzsKLQkJcSsrOwotCX0KLQlyZXR1cm4gWUVTOworICAgIHVuc2lnbmVkIGNoYXIgKnEgPSAodW5zaWduZWQgY2hhciAqKXA7CisgICAgd2hpbGUgKCpxKSB7CisgICAgICAgIGlmICghIGlzZGlnaXQoKnEpKQorICAgICAgICAgICAgcmV0dXJuIE5POworICAgICAgICBxKys7CisgICAgfQorICAgIHJldHVybiBZRVM7CiB9CiAKIGludAogZ2V0YWRkcmluZm8oY29uc3QgY2hhcipob3N0bmFtZSwgY29uc3QgY2hhcipzZXJ2bmFtZSwKICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqaGludHMsIHN0cnVjdCBhZGRyaW5mbyAqKnJlcykKIHsKLQlzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWw7Ci0Jc3RydWN0IGFkZHJpbmZvICp0b3AgPSBOVUxMOwotCXN0cnVjdCBhZGRyaW5mbyAqY3VyOwotCWludCBpLCBlcnJvciA9IDA7Ci0JY2hhciBwdG9uW1BUT05fTUFYXTsKLQlzdHJ1Y3QgYWRkcmluZm8gYWk7Ci0Jc3RydWN0IGFkZHJpbmZvICpwYWk7Ci0JdV9zaG9ydCBwb3J0OworICAgIHN0cnVjdCBhZGRyaW5mbyBzZW50aW5lbDsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKnRvcCA9IE5VTEw7CisgICAgc3RydWN0IGFkZHJpbmZvICpjdXI7CisgICAgaW50IGksIGVycm9yID0gMDsKKyAgICBjaGFyIHB0b25bUFRPTl9NQVhdOworICAgIHN0cnVjdCBhZGRyaW5mbyBhaTsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKKyAgICB1X3Nob3J0IHBvcnQ7CiAKICNpZmRlZiBGQUlUSAotCXN0YXRpYyBpbnQgZmlyc3R0aW1lID0gMTsKKyAgICBzdGF0aWMgaW50IGZpcnN0dGltZSA9IDE7CiAKLQlpZiAoZmlyc3R0aW1lKSB7Ci0JCS8qIHRyYW5zbGF0b3IgaGFjayAqLwotCQl7Ci0JCQljaGFyICpxID0gZ2V0ZW52KCJHQUkiKTsKLQkJCWlmIChxICYmIGluZXRfcHRvbihBRl9JTkVUNiwgcSwgJmZhaXRoX3ByZWZpeCkgPT0gMSkKLQkJCQl0cmFuc2xhdGUgPSBZRVM7Ci0JCX0KLQkJZmlyc3R0aW1lID0gMDsKLQl9CisgICAgaWYgKGZpcnN0dGltZSkgeworICAgICAgICAvKiB0cmFuc2xhdG9yIGhhY2sgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqcSA9IGdldGVudigiR0FJIik7CisgICAgICAgICAgICBpZiAocSAmJiBpbmV0X3B0b24oQUZfSU5FVDYsIHEsICZmYWl0aF9wcmVmaXgpID09IDEpCisgICAgICAgICAgICAgICAgdHJhbnNsYXRlID0gWUVTOworICAgICAgICB9CisgICAgICAgIGZpcnN0dGltZSA9IDA7CisgICAgfQogI2VuZGlmCiAKLQkvKiBpbml0aWFsaXplIGZpbGUgc3RhdGljIHZhcnMgKi8KLQlzZW50aW5lbC5haV9uZXh0ID0gTlVMTDsKLQljdXIgPSAmc2VudGluZWw7Ci0JcGFpID0gJmFpOwotCXBhaS0+YWlfZmxhZ3MgPSAwOwotCXBhaS0+YWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotCXBhaS0+YWlfc29ja3R5cGUgPSBHQUlfQU5ZOwotCXBhaS0+YWlfcHJvdG9jb2wgPSBHQUlfQU5ZOwotCXBhaS0+YWlfYWRkcmxlbiA9IDA7Ci0JcGFpLT5haV9jYW5vbm5hbWUgPSBOVUxMOwotCXBhaS0+YWlfYWRkciA9IE5VTEw7Ci0JcGFpLT5haV9uZXh0ID0gTlVMTDsKLQlwb3J0ID0gR0FJX0FOWTsKLQkKLQlpZiAoaG9zdG5hbWUgPT0gTlVMTCAmJiBzZXJ2bmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gRUFJX05PTkFNRTsKLQlpZiAoaGludHMpIHsKLQkJLyogZXJyb3IgY2hlY2sgZm9yIGhpbnRzICovCi0JCWlmIChoaW50cy0+YWlfYWRkcmxlbiB8fCBoaW50cy0+YWlfY2Fub25uYW1lIHx8Ci0JCSAgICBoaW50cy0+YWlfYWRkciB8fCBoaW50cy0+YWlfbmV4dCkKLQkJCUVSUihFQUlfQkFESElOVFMpOyAvKiB4eHggKi8KLQkJaWYgKGhpbnRzLT5haV9mbGFncyAmIH5BSV9NQVNLKQotCQkJRVJSKEVBSV9CQURGTEFHUyk7Ci0JCXN3aXRjaCAoaGludHMtPmFpX2ZhbWlseSkgewotCQljYXNlIFBGX1VOU1BFQzoKLQkJY2FzZSBQRl9JTkVUOgorICAgIC8qIGluaXRpYWxpemUgZmlsZSBzdGF0aWMgdmFycyAqLworICAgIHNlbnRpbmVsLmFpX25leHQgPSBOVUxMOworICAgIGN1ciA9ICZzZW50aW5lbDsKKyAgICBwYWkgPSAmYWk7CisgICAgcGFpLT5haV9mbGFncyA9IDA7CisgICAgcGFpLT5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisgICAgcGFpLT5haV9zb2NrdHlwZSA9IEdBSV9BTlk7CisgICAgcGFpLT5haV9wcm90b2NvbCA9IEdBSV9BTlk7CisgICAgcGFpLT5haV9hZGRybGVuID0gMDsKKyAgICBwYWktPmFpX2Nhbm9ubmFtZSA9IE5VTEw7CisgICAgcGFpLT5haV9hZGRyID0gTlVMTDsKKyAgICBwYWktPmFpX25leHQgPSBOVUxMOworICAgIHBvcnQgPSBHQUlfQU5ZOworCisgICAgaWYgKGhvc3RuYW1lID09IE5VTEwgJiYgc2Vydm5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEVBSV9OT05BTUU7CisgICAgaWYgKGhpbnRzKSB7CisgICAgICAgIC8qIGVycm9yIGNoZWNrIGZvciBoaW50cyAqLworICAgICAgICBpZiAoaGludHMtPmFpX2FkZHJsZW4gfHwgaGludHMtPmFpX2Nhbm9ubmFtZSB8fAorICAgICAgICAgICAgaGludHMtPmFpX2FkZHIgfHwgaGludHMtPmFpX25leHQpCisgICAgICAgICAgICBFUlIoRUFJX0JBREhJTlRTKTsgLyogeHh4ICovCisgICAgICAgIGlmIChoaW50cy0+YWlfZmxhZ3MgJiB+QUlfTUFTSykKKyAgICAgICAgICAgIEVSUihFQUlfQkFERkxBR1MpOworICAgICAgICBzd2l0Y2ggKGhpbnRzLT5haV9mYW1pbHkpIHsKKyAgICAgICAgY2FzZSBQRl9VTlNQRUM6CisgICAgICAgIGNhc2UgUEZfSU5FVDoKICNpZmRlZiBFTkFCTEVfSVBWNgotCQljYXNlIFBGX0lORVQ2OgorICAgICAgICBjYXNlIFBGX0lORVQ2OgogI2VuZGlmCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUVSUihFQUlfRkFNSUxZKTsKLQkJfQotCQltZW1jcHkocGFpLCBoaW50cywgc2l6ZW9mKCpwYWkpKTsKLQkJc3dpdGNoIChwYWktPmFpX3NvY2t0eXBlKSB7Ci0JCWNhc2UgR0FJX0FOWToKLQkJCXN3aXRjaCAocGFpLT5haV9wcm90b2NvbCkgewotCQkJY2FzZSBHQUlfQU5ZOgotCQkJCWJyZWFrOwotCQkJY2FzZSBJUFBST1RPX1VEUDoKLQkJCQlwYWktPmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVBQUk9UT19UQ1A6Ci0JCQkJcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwYWktPmFpX3NvY2t0eXBlID0gU09DS19SQVc7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTT0NLX1JBVzoKLQkJCWJyZWFrOwotCQljYXNlIFNPQ0tfREdSQU06Ci0JCQlpZiAocGFpLT5haV9wcm90b2NvbCAhPSBJUFBST1RPX1VEUCAmJgotCQkJICAgIHBhaS0+YWlfcHJvdG9jb2wgIT0gR0FJX0FOWSkKLQkJCQlFUlIoRUFJX0JBREhJTlRTKTsJLyp4eHgqLwotCQkJcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOwotCQkJYnJlYWs7Ci0JCWNhc2UgU09DS19TVFJFQU06Ci0JCQlpZiAocGFpLT5haV9wcm90b2NvbCAhPSBJUFBST1RPX1RDUCAmJgotCQkJICAgIHBhaS0+YWlfcHJvdG9jb2wgIT0gR0FJX0FOWSkKLQkJCQlFUlIoRUFJX0JBREhJTlRTKTsJLyp4eHgqLwotCQkJcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlFUlIoRUFJX1NPQ0tUWVBFKTsKLQkJCS8qIHVucmVhY2hhYmxlICovCi0JCX0KLQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEVSUihFQUlfRkFNSUxZKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocGFpLCBoaW50cywgc2l6ZW9mKCpwYWkpKTsKKyAgICAgICAgc3dpdGNoIChwYWktPmFpX3NvY2t0eXBlKSB7CisgICAgICAgIGNhc2UgR0FJX0FOWToKKyAgICAgICAgICAgIHN3aXRjaCAocGFpLT5haV9wcm90b2NvbCkgeworICAgICAgICAgICAgY2FzZSBHQUlfQU5ZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJUFBST1RPX1VEUDoKKyAgICAgICAgICAgICAgICBwYWktPmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVBQUk9UT19UQ1A6CisgICAgICAgICAgICAgICAgcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwYWktPmFpX3NvY2t0eXBlID0gU09DS19SQVc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTT0NLX1JBVzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNPQ0tfREdSQU06CisgICAgICAgICAgICBpZiAocGFpLT5haV9wcm90b2NvbCAhPSBJUFBST1RPX1VEUCAmJgorICAgICAgICAgICAgICAgIHBhaS0+YWlfcHJvdG9jb2wgIT0gR0FJX0FOWSkKKyAgICAgICAgICAgICAgICBFUlIoRUFJX0JBREhJTlRTKTsgICAgICAgICAgICAgICAgICAgICAgLyp4eHgqLworICAgICAgICAgICAgcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU09DS19TVFJFQU06CisgICAgICAgICAgICBpZiAocGFpLT5haV9wcm90b2NvbCAhPSBJUFBST1RPX1RDUCAmJgorICAgICAgICAgICAgICAgIHBhaS0+YWlfcHJvdG9jb2wgIT0gR0FJX0FOWSkKKyAgICAgICAgICAgICAgICBFUlIoRUFJX0JBREhJTlRTKTsgICAgICAgICAgICAgICAgICAgICAgLyp4eHgqLworICAgICAgICAgICAgcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBFUlIoRUFJX1NPQ0tUWVBFKTsKKyAgICAgICAgICAgIC8qIHVucmVhY2hhYmxlICovCisgICAgICAgIH0KKyAgICB9CiAKLQkvKgotCSAqIHNlcnZpY2UgcG9ydAotCSAqLwotCWlmIChzZXJ2bmFtZSkgewotCQlpZiAoc3RyX2lzbnVtYmVyKHNlcnZuYW1lKSkgewotCQkJaWYgKHBhaS0+YWlfc29ja3R5cGUgPT0gR0FJX0FOWSkgewotCQkJCS8qIGNhbGxlciBhY2NlcHQgKkdBSV9BTlkqIHNvY2t0eXBlICovCi0JCQkJcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07Ci0JCQkJcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOwotCQkJfQotCQkJcG9ydCA9IGh0b25zKCh1X3Nob3J0KWF0b2koc2Vydm5hbWUpKTsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBzZXJ2ZW50ICpzcDsKLQkJCWNoYXIgKnByb3RvOworICAgIC8qCisgICAgICogc2VydmljZSBwb3J0CisgICAgICovCisgICAgaWYgKHNlcnZuYW1lKSB7CisgICAgICAgIGlmIChzdHJfaXNudW1iZXIoc2Vydm5hbWUpKSB7CisgICAgICAgICAgICBpZiAocGFpLT5haV9zb2NrdHlwZSA9PSBHQUlfQU5ZKSB7CisgICAgICAgICAgICAgICAgLyogY2FsbGVyIGFjY2VwdCAqR0FJX0FOWSogc29ja3R5cGUgKi8KKyAgICAgICAgICAgICAgICBwYWktPmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgICAgICAgICAgICAgICBwYWktPmFpX3Byb3RvY29sID0gSVBQUk9UT19VRFA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3J0ID0gaHRvbnMoKHVfc2hvcnQpYXRvaShzZXJ2bmFtZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RydWN0IHNlcnZlbnQgKnNwOworICAgICAgICAgICAgY2hhciAqcHJvdG87CiAKLQkJCXByb3RvID0gTlVMTDsKLQkJCXN3aXRjaCAocGFpLT5haV9zb2NrdHlwZSkgewotCQkJY2FzZSBHQUlfQU5ZOgotCQkJCXByb3RvID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09DS19ER1JBTToKLQkJCQlwcm90byA9ICJ1ZHAiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT0NLX1NUUkVBTToKLQkJCQlwcm90byA9ICJ0Y3AiOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInBhbmljIVxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKHNwID0gZ2V0c2VydmJ5bmFtZShzZXJ2bmFtZSwgcHJvdG8pKSA9PSBOVUxMKQotCQkJCUVSUihFQUlfU0VSVklDRSk7Ci0JCQlwb3J0ID0gc3AtPnNfcG9ydDsKLQkJCWlmIChwYWktPmFpX3NvY2t0eXBlID09IEdBSV9BTlkpIHsKLQkJCQlpZiAoc3RyY21wKHNwLT5zX3Byb3RvLCAidWRwIikgPT0gMCkgewotCQkJCQlwYWktPmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKLQkJCQkJcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOwotCQkJCX0gZWxzZSBpZiAoc3RyY21wKHNwLT5zX3Byb3RvLCAidGNwIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaS0+YWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWktPmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUihFQUlfUFJPVE9DT0wpOwkvKnh4eCovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBob3N0bmFtZSA9PSBOVUxMLgotCSAqIHBhc3NpdmUgc29ja2V0IC0+IGFueWFkZHIgKDAuMC4wLjAgb3IgOjopCi0JICogbm9uLXBhc3NpdmUgc29ja2V0IC0+IGxvY2FsaG9zdCAoMTI3LjAuMC4xIG9yIDo6MSkKLQkgKi8KLQlpZiAoaG9zdG5hbWUgPT0gTlVMTCkgewotCQlzdHJ1Y3QgZ2FpX2FmZCAqZ2FpX2FmZDsKKyAgICAgICAgICAgIHByb3RvID0gTlVMTDsKKyAgICAgICAgICAgIHN3aXRjaCAocGFpLT5haV9zb2NrdHlwZSkgeworICAgICAgICAgICAgY2FzZSBHQUlfQU5ZOgorICAgICAgICAgICAgICAgIHByb3RvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU09DS19ER1JBTToKKyAgICAgICAgICAgICAgICBwcm90byA9ICJ1ZHAiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTT0NLX1NUUkVBTToKKyAgICAgICAgICAgICAgICBwcm90byA9ICJ0Y3AiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBhbmljIVxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHNwID0gZ2V0c2VydmJ5bmFtZShzZXJ2bmFtZSwgcHJvdG8pKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIEVSUihFQUlfU0VSVklDRSk7CisgICAgICAgICAgICBwb3J0ID0gc3AtPnNfcG9ydDsKKyAgICAgICAgICAgIGlmIChwYWktPmFpX3NvY2t0eXBlID09IEdBSV9BTlkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHNwLT5zX3Byb3RvLCAidWRwIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYWktPmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgICAgICAgICAgICAgICAgICAgcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHNwLT5zX3Byb3RvLCAidGNwIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYWktPmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgICAgICAgICAgICAgICAgICAgIHBhaS0+YWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgRVJSKEVBSV9QUk9UT0NPTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKnh4eCovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkJZm9yIChnYWlfYWZkID0gJmdhaV9hZmRsWzBdOyBnYWlfYWZkLT5hX2FmOyBnYWlfYWZkKyspIHsKLQkJCWlmICghKHBhaS0+YWlfZmFtaWx5ID09IFBGX1VOU1BFQwotCQkJICAgfHwgcGFpLT5haV9mYW1pbHkgPT0gZ2FpX2FmZC0+YV9hZikpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KKyAgICAvKgorICAgICAqIGhvc3RuYW1lID09IE5VTEwuCisgICAgICogcGFzc2l2ZSBzb2NrZXQgLT4gYW55YWRkciAoMC4wLjAuMCBvciA6OikKKyAgICAgKiBub24tcGFzc2l2ZSBzb2NrZXQgLT4gbG9jYWxob3N0ICgxMjcuMC4wLjEgb3IgOjoxKQorICAgICAqLworICAgIGlmIChob3N0bmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHN0cnVjdCBnYWlfYWZkICpnYWlfYWZkOwogCi0JCQlpZiAocGFpLT5haV9mbGFncyAmIEFJX1BBU1NJVkUpIHsKLQkJCQlHRVRfQUkoY3VyLT5haV9uZXh0LCBnYWlfYWZkLCBnYWlfYWZkLT5hX2FkZHJhbnksIHBvcnQpOwotCQkJCS8qIHh4eCBtZWFuaW5nbGVzcz8KLQkJCQkgKiBHRVRfQ0FOT05OQU1FKGN1ci0+YWlfbmV4dCwgImFueWFkZHIiKTsKLQkJCQkgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgZ2FpX2FmZCwgZ2FpX2FmZC0+YV9sb29wYmFjaywKLQkJCQkJcG9ydCk7Ci0JCQkJLyogeHh4IG1lYW5pbmdsZXNzPwotCQkJCSAqIEdFVF9DQU5PTk5BTUUoY3VyLT5haV9uZXh0LCAibG9jYWxob3N0Iik7Ci0JCQkJICovCi0JCQl9Ci0JCQljdXIgPSBjdXItPmFpX25leHQ7Ci0JCX0KLQkJdG9wID0gc2VudGluZWwuYWlfbmV4dDsKLQkJaWYgKHRvcCkKLQkJCWdvdG8gZ29vZDsKLQkJZWxzZQotCQkJRVJSKEVBSV9GQU1JTFkpOwotCX0KLQkKLQkvKiBob3N0bmFtZSBhcyBudW1lcmljIG5hbWUgKi8KLQlmb3IgKGkgPSAwOyBnYWlfYWZkbFtpXS5hX2FmOyBpKyspIHsKLQkJaWYgKGluZXRfcHRvbihnYWlfYWZkbFtpXS5hX2FmLCBob3N0bmFtZSwgcHRvbikpIHsKLQkJCXVfbG9uZyB2NGE7CisgICAgICAgIGZvciAoZ2FpX2FmZCA9ICZnYWlfYWZkbFswXTsgZ2FpX2FmZC0+YV9hZjsgZ2FpX2FmZCsrKSB7CisgICAgICAgICAgICBpZiAoIShwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMKKyAgICAgICAgICAgICAgIHx8IHBhaS0+YWlfZmFtaWx5ID09IGdhaV9hZmQtPmFfYWYpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYWktPmFpX2ZsYWdzICYgQUlfUEFTU0lWRSkgeworICAgICAgICAgICAgICAgIEdFVF9BSShjdXItPmFpX25leHQsIGdhaV9hZmQsIGdhaV9hZmQtPmFfYWRkcmFueSwgcG9ydCk7CisgICAgICAgICAgICAgICAgLyogeHh4IG1lYW5pbmdsZXNzPworICAgICAgICAgICAgICAgICAqIEdFVF9DQU5PTk5BTUUoY3VyLT5haV9uZXh0LCAiYW55YWRkciIpOworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBHRVRfQUkoY3VyLT5haV9uZXh0LCBnYWlfYWZkLCBnYWlfYWZkLT5hX2xvb3BiYWNrLAorICAgICAgICAgICAgICAgICAgICBwb3J0KTsKKyAgICAgICAgICAgICAgICAvKiB4eHggbWVhbmluZ2xlc3M/CisgICAgICAgICAgICAgICAgICogR0VUX0NBTk9OTkFNRShjdXItPmFpX25leHQsICJsb2NhbGhvc3QiKTsKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1ciA9IGN1ci0+YWlfbmV4dDsKKyAgICAgICAgfQorICAgICAgICB0b3AgPSBzZW50aW5lbC5haV9uZXh0OworICAgICAgICBpZiAodG9wKQorICAgICAgICAgICAgZ290byBnb29kOworICAgICAgICBlbHNlCisgICAgICAgICAgICBFUlIoRUFJX0ZBTUlMWSk7CisgICAgfQorCisgICAgLyogaG9zdG5hbWUgYXMgbnVtZXJpYyBuYW1lICovCisgICAgZm9yIChpID0gMDsgZ2FpX2FmZGxbaV0uYV9hZjsgaSsrKSB7CisgICAgICAgIGlmIChpbmV0X3B0b24oZ2FpX2FmZGxbaV0uYV9hZiwgaG9zdG5hbWUsIHB0b24pKSB7CisgICAgICAgICAgICB1X2xvbmcgdjRhOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCQl1X2NoYXIgcGZ4OworICAgICAgICAgICAgdV9jaGFyIHBmeDsKICNlbmRpZgogCi0JCQlzd2l0Y2ggKGdhaV9hZmRsW2ldLmFfYWYpIHsKLQkJCWNhc2UgQUZfSU5FVDoKLQkJCQl2NGEgPSAoKHN0cnVjdCBpbl9hZGRyICopcHRvbiktPnNfYWRkcjsKLQkJCQl2NGEgPSBudG9obCh2NGEpOwotCQkJCWlmIChJTl9NVUxUSUNBU1QodjRhKSB8fCBJTl9FWFBFUklNRU5UQUwodjRhKSkKLQkJCQkJcGFpLT5haV9mbGFncyAmPSB+QUlfQ0FOT05OQU1FOwotCQkJCXY0YSA+Pj0gSU5fQ0xBU1NBX05TSElGVDsKLQkJCQlpZiAodjRhID09IDAgfHwgdjRhID09IElOX0xPT1BCQUNLTkVUKQotCQkJCQlwYWktPmFpX2ZsYWdzICY9IH5BSV9DQU5PTk5BTUU7Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICBzd2l0Y2ggKGdhaV9hZmRsW2ldLmFfYWYpIHsKKyAgICAgICAgICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgICAgICAgICB2NGEgPSAoKHN0cnVjdCBpbl9hZGRyICopcHRvbiktPnNfYWRkcjsKKyAgICAgICAgICAgICAgICB2NGEgPSBudG9obCh2NGEpOworICAgICAgICAgICAgICAgIGlmIChJTl9NVUxUSUNBU1QodjRhKSB8fCBJTl9FWFBFUklNRU5UQUwodjRhKSkKKyAgICAgICAgICAgICAgICAgICAgcGFpLT5haV9mbGFncyAmPSB+QUlfQ0FOT05OQU1FOworICAgICAgICAgICAgICAgIHY0YSA+Pj0gSU5fQ0xBU1NBX05TSElGVDsKKyAgICAgICAgICAgICAgICBpZiAodjRhID09IDAgfHwgdjRhID09IElOX0xPT1BCQUNLTkVUKQorICAgICAgICAgICAgICAgICAgICBwYWktPmFpX2ZsYWdzICY9IH5BSV9DQU5PTk5BTUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQkJCWNhc2UgQUZfSU5FVDY6Ci0JCQkJcGZ4ID0gKChzdHJ1Y3QgaW42X2FkZHIgKilwdG9uKS0+czZfYWRkcjhbMF07Ci0JCQkJaWYgKHBmeCA9PSAwIHx8IHBmeCA9PSAweGZlIHx8IHBmeCA9PSAweGZmKQotCQkJCQlwYWktPmFpX2ZsYWdzICY9IH5BSV9DQU5PTk5BTUU7Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICAgICAgICAgIHBmeCA9ICgoc3RydWN0IGluNl9hZGRyICopcHRvbiktPnM2X2FkZHI4WzBdOworICAgICAgICAgICAgICAgIGlmIChwZnggPT0gMCB8fCBwZnggPT0gMHhmZSB8fCBwZnggPT0gMHhmZikKKyAgICAgICAgICAgICAgICAgICAgcGFpLT5haV9mbGFncyAmPSB+QUlfQ0FOT05OQU1FOworICAgICAgICAgICAgICAgIGJyZWFrOwogI2VuZGlmCi0JCQl9Ci0JCQkKLQkJCWlmIChwYWktPmFpX2ZhbWlseSA9PSBnYWlfYWZkbFtpXS5hX2FmIHx8Ci0JCQkgICAgcGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDKSB7Ci0JCQkJaWYgKCEgKHBhaS0+YWlfZmxhZ3MgJiBBSV9DQU5PTk5BTUUpKSB7Ci0JCQkJCUdFVF9BSSh0b3AsICZnYWlfYWZkbFtpXSwgcHRvbiwgcG9ydCk7Ci0JCQkJCWdvdG8gZ29vZDsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBpZiBBSV9DQU5PTk5BTUUgYW5kIGlmIHJldmVyc2UgbG9va3VwCi0JCQkJICogZmFpbCwgcmV0dXJuIGFpIGFueXdheSB0byBwYWNpZnkKLQkJCQkgKiBjYWxsaW5nIGFwcGxpY2F0aW9uLgotCQkJCSAqCi0JCQkJICogWFhYIGdldGFkZHJpbmZvKCkgaXMgYSBuYW1lLT5hZGRyZXNzCi0JCQkJICogdHJhbnNsYXRpb24gZnVuY3Rpb24sIGFuZCBpdCBsb29rcyBzdHJhbmdlCi0JCQkJICogdGhhdCB3ZSBkbyBhZGRyLT5uYW1lIHRyYW5zbGF0aW9uIGhlcmUuCi0JCQkJICovCi0JCQkJZ2V0X25hbWUocHRvbiwgJmdhaV9hZmRsW2ldLCAmdG9wLCBwdG9uLCBwYWksIHBvcnQpOwotCQkJCWdvdG8gZ29vZDsKLQkJCX0gZWxzZSAKLQkJCQlFUlIoRUFJX0ZBTUlMWSk7CS8qeHh4Ki8KLQkJfQotCX0KKyAgICAgICAgICAgIH0KIAotCWlmIChwYWktPmFpX2ZsYWdzICYgQUlfTlVNRVJJQ0hPU1QpCi0JCUVSUihFQUlfTk9OQU1FKTsKKyAgICAgICAgICAgIGlmIChwYWktPmFpX2ZhbWlseSA9PSBnYWlfYWZkbFtpXS5hX2FmIHx8CisgICAgICAgICAgICAgICAgcGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgKHBhaS0+YWlfZmxhZ3MgJiBBSV9DQU5PTk5BTUUpKSB7CisgICAgICAgICAgICAgICAgICAgIEdFVF9BSSh0b3AsICZnYWlfYWZkbFtpXSwgcHRvbiwgcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZ29vZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBpZiBBSV9DQU5PTk5BTUUgYW5kIGlmIHJldmVyc2UgbG9va3VwCisgICAgICAgICAgICAgICAgICogZmFpbCwgcmV0dXJuIGFpIGFueXdheSB0byBwYWNpZnkKKyAgICAgICAgICAgICAgICAgKiBjYWxsaW5nIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogWFhYIGdldGFkZHJpbmZvKCkgaXMgYSBuYW1lLT5hZGRyZXNzCisgICAgICAgICAgICAgICAgICogdHJhbnNsYXRpb24gZnVuY3Rpb24sIGFuZCBpdCBsb29rcyBzdHJhbmdlCisgICAgICAgICAgICAgICAgICogdGhhdCB3ZSBkbyBhZGRyLT5uYW1lIHRyYW5zbGF0aW9uIGhlcmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZ2V0X25hbWUocHRvbiwgJmdhaV9hZmRsW2ldLCAmdG9wLCBwdG9uLCBwYWksIHBvcnQpOworICAgICAgICAgICAgICAgIGdvdG8gZ29vZDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIEVSUihFQUlfRkFNSUxZKTsgICAgICAgICAgICAgICAgICAgICAgICAvKnh4eCovCisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBob3N0bmFtZSBhcyBhbHBoYWJldGljYWwgbmFtZSAqLwotCWVycm9yID0gZ2V0X2FkZHIoaG9zdG5hbWUsIHBhaS0+YWlfZmFtaWx5LCAmdG9wLCBwYWksIHBvcnQpOwotCWlmIChlcnJvciA9PSAwKSB7Ci0JCWlmICh0b3ApIHsKKyAgICBpZiAocGFpLT5haV9mbGFncyAmIEFJX05VTUVSSUNIT1NUKQorICAgICAgICBFUlIoRUFJX05PTkFNRSk7CisKKyAgICAvKiBob3N0bmFtZSBhcyBhbHBoYWJldGljYWwgbmFtZSAqLworICAgIGVycm9yID0gZ2V0X2FkZHIoaG9zdG5hbWUsIHBhaS0+YWlfZmFtaWx5LCAmdG9wLCBwYWksIHBvcnQpOworICAgIGlmIChlcnJvciA9PSAwKSB7CisgICAgICAgIGlmICh0b3ApIHsKICBnb29kOgotCQkJKnJlcyA9IHRvcDsKLQkJCXJldHVybiBTVUNDRVNTOwotCQl9IGVsc2UKLQkJCWVycm9yID0gRUFJX0ZBSUw7Ci0JfQorICAgICAgICAgICAgKnJlcyA9IHRvcDsKKyAgICAgICAgICAgIHJldHVybiBTVUNDRVNTOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGVycm9yID0gRUFJX0ZBSUw7CisgICAgfQogIGZyZWU6Ci0JaWYgKHRvcCkKLQkJZnJlZWFkZHJpbmZvKHRvcCk7CisgICAgaWYgKHRvcCkKKyAgICAgICAgZnJlZWFkZHJpbmZvKHRvcCk7CiAgYmFkOgotCSpyZXMgPSBOVUxMOwotCXJldHVybiBlcnJvcjsKKyAgICAqcmVzID0gTlVMTDsKKyAgICByZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQKIGdldF9uYW1lKGFkZHIsIGdhaV9hZmQsIHJlcywgbnVtYWRkciwgcGFpLCBwb3J0MCkKLQljb25zdCBjaGFyICphZGRyOwotCXN0cnVjdCBnYWlfYWZkICpnYWlfYWZkOwotCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKLQljaGFyICpudW1hZGRyOwotCXN0cnVjdCBhZGRyaW5mbyAqcGFpOwotCWludCBwb3J0MDsKKyAgICBjb25zdCBjaGFyICphZGRyOworICAgIHN0cnVjdCBnYWlfYWZkICpnYWlfYWZkOworICAgIHN0cnVjdCBhZGRyaW5mbyAqKnJlczsKKyAgICBjaGFyICpudW1hZGRyOworICAgIHN0cnVjdCBhZGRyaW5mbyAqcGFpOworICAgIGludCBwb3J0MDsKIHsKLQl1X3Nob3J0IHBvcnQgPSBwb3J0MCAmIDB4ZmZmZjsKLQlzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0Jc3RydWN0IGFkZHJpbmZvICpjdXI7Ci0JaW50IGVycm9yID0gMDsKKyAgICB1X3Nob3J0IHBvcnQgPSBwb3J0MCAmIDB4ZmZmZjsKKyAgICBzdHJ1Y3QgaG9zdGVudCAqaHA7CisgICAgc3RydWN0IGFkZHJpbmZvICpjdXI7CisgICAgaW50IGVycm9yID0gMDsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWludCBoX2Vycm9yOworICAgIGludCBoX2Vycm9yOwogI2VuZGlmCi0JCisKICNpZmRlZiBFTkFCTEVfSVBWNgotCWhwID0gZ2V0aXBub2RlYnlhZGRyKGFkZHIsIGdhaV9hZmQtPmFfYWRkcmxlbiwgZ2FpX2FmZC0+YV9hZiwgJmhfZXJyb3IpOworICAgIGhwID0gZ2V0aXBub2RlYnlhZGRyKGFkZHIsIGdhaV9hZmQtPmFfYWRkcmxlbiwgZ2FpX2FmZC0+YV9hZiwgJmhfZXJyb3IpOwogI2Vsc2UKLQlocCA9IGdldGhvc3RieWFkZHIoYWRkciwgZ2FpX2FmZC0+YV9hZGRybGVuLCBBRl9JTkVUKTsKKyAgICBocCA9IGdldGhvc3RieWFkZHIoYWRkciwgZ2FpX2FmZC0+YV9hZGRybGVuLCBBRl9JTkVUKTsKICNlbmRpZgotCWlmIChocCAmJiBocC0+aF9uYW1lICYmIGhwLT5oX25hbWVbMF0gJiYgaHAtPmhfYWRkcl9saXN0WzBdKSB7Ci0JCUdFVF9BSShjdXIsIGdhaV9hZmQsIGhwLT5oX2FkZHJfbGlzdFswXSwgcG9ydCk7Ci0JCUdFVF9DQU5PTk5BTUUoY3VyLCBocC0+aF9uYW1lKTsKLQl9IGVsc2UKLQkJR0VUX0FJKGN1ciwgZ2FpX2FmZCwgbnVtYWRkciwgcG9ydCk7Ci0JCisgICAgaWYgKGhwICYmIGhwLT5oX25hbWUgJiYgaHAtPmhfbmFtZVswXSAmJiBocC0+aF9hZGRyX2xpc3RbMF0pIHsKKyAgICAgICAgR0VUX0FJKGN1ciwgZ2FpX2FmZCwgaHAtPmhfYWRkcl9saXN0WzBdLCBwb3J0KTsKKyAgICAgICAgR0VUX0NBTk9OTkFNRShjdXIsIGhwLT5oX25hbWUpOworICAgIH0gZWxzZQorICAgICAgICBHRVRfQUkoY3VyLCBnYWlfYWZkLCBudW1hZGRyLCBwb3J0KTsKKwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JaWYgKGhwKQotCQlmcmVlaG9zdGVudChocCk7CisgICAgaWYgKGhwKQorICAgICAgICBmcmVlaG9zdGVudChocCk7CiAjZW5kaWYKLQkqcmVzID0gY3VyOwotCXJldHVybiBTVUNDRVNTOworICAgICpyZXMgPSBjdXI7CisgICAgcmV0dXJuIFNVQ0NFU1M7CiAgZnJlZToKLQlpZiAoY3VyKQotCQlmcmVlYWRkcmluZm8oY3VyKTsKKyAgICBpZiAoY3VyKQorICAgICAgICBmcmVlYWRkcmluZm8oY3VyKTsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWlmIChocCkKLQkJZnJlZWhvc3RlbnQoaHApOworICAgIGlmIChocCkKKyAgICAgICAgZnJlZWhvc3RlbnQoaHApOwogI2VuZGlmCiAgLyogYmFkOiAqLwotCSpyZXMgPSBOVUxMOwotCXJldHVybiBlcnJvcjsKKyAgICAqcmVzID0gTlVMTDsKKyAgICByZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQKIGdldF9hZGRyKGhvc3RuYW1lLCBhZiwgcmVzLCBwYWksIHBvcnQwKQotCWNvbnN0IGNoYXIgKmhvc3RuYW1lOwotCWludCBhZjsKLQlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7Ci0Jc3RydWN0IGFkZHJpbmZvICpwYWk7Ci0JaW50IHBvcnQwOworICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lOworICAgIGludCBhZjsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKipyZXM7CisgICAgc3RydWN0IGFkZHJpbmZvICpwYWk7CisgICAgaW50IHBvcnQwOwogewotCXVfc2hvcnQgcG9ydCA9IHBvcnQwICYgMHhmZmZmOwotCXN0cnVjdCBhZGRyaW5mbyBzZW50aW5lbDsKLQlzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0Jc3RydWN0IGFkZHJpbmZvICp0b3AsICpjdXI7Ci0Jc3RydWN0IGdhaV9hZmQgKmdhaV9hZmQ7Ci0JaW50IGksIGVycm9yID0gMCwgaF9lcnJvcjsKLQljaGFyICphcDsKKyAgICB1X3Nob3J0IHBvcnQgPSBwb3J0MCAmIDB4ZmZmZjsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWw7CisgICAgc3RydWN0IGhvc3RlbnQgKmhwOworICAgIHN0cnVjdCBhZGRyaW5mbyAqdG9wLCAqY3VyOworICAgIHN0cnVjdCBnYWlfYWZkICpnYWlfYWZkOworICAgIGludCBpLCBlcnJvciA9IDAsIGhfZXJyb3I7CisgICAgY2hhciAqYXA7CiAKLQl0b3AgPSBOVUxMOwotCXNlbnRpbmVsLmFpX25leHQgPSBOVUxMOwotCWN1ciA9ICZzZW50aW5lbDsKKyAgICB0b3AgPSBOVUxMOworICAgIHNlbnRpbmVsLmFpX25leHQgPSBOVUxMOworICAgIGN1ciA9ICZzZW50aW5lbDsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWlmIChhZiA9PSBBRl9VTlNQRUMpIHsKLQkJaHAgPSBnZXRpcG5vZGVieW5hbWUoaG9zdG5hbWUsIEFGX0lORVQ2LAotCQkJCUFJX0FERFJDT05GSUd8QUlfQUxMfEFJX1Y0TUFQUEVELCAmaF9lcnJvcik7Ci0JfSBlbHNlCi0JCWhwID0gZ2V0aXBub2RlYnluYW1lKGhvc3RuYW1lLCBhZiwgQUlfQUREUkNPTkZJRywgJmhfZXJyb3IpOworICAgIGlmIChhZiA9PSBBRl9VTlNQRUMpIHsKKyAgICAgICAgaHAgPSBnZXRpcG5vZGVieW5hbWUoaG9zdG5hbWUsIEFGX0lORVQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgQUlfQUREUkNPTkZJR3xBSV9BTEx8QUlfVjRNQVBQRUQsICZoX2Vycm9yKTsKKyAgICB9IGVsc2UKKyAgICAgICAgaHAgPSBnZXRpcG5vZGVieW5hbWUoaG9zdG5hbWUsIGFmLCBBSV9BRERSQ09ORklHLCAmaF9lcnJvcik7CiAjZWxzZQotCWhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7Ci0JaF9lcnJvciA9IGhfZXJybm87CisgICAgaHAgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lKTsKKyAgICBoX2Vycm9yID0gaF9lcnJubzsKICNlbmRpZgotCWlmIChocCA9PSBOVUxMKSB7Ci0JCXN3aXRjaCAoaF9lcnJvcikgewotCQljYXNlIEhPU1RfTk9UX0ZPVU5EOgotCQljYXNlIE5PX0RBVEE6Ci0JCQllcnJvciA9IEVBSV9OT0RBVEE7Ci0JCQlicmVhazsKLQkJY2FzZSBUUllfQUdBSU46Ci0JCQllcnJvciA9IEVBSV9BR0FJTjsKLQkJCWJyZWFrOwotCQljYXNlIE5PX1JFQ09WRVJZOgotCQlkZWZhdWx0OgotCQkJZXJyb3IgPSBFQUlfRkFJTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWdvdG8gZnJlZTsKLQl9CisgICAgaWYgKGhwID09IE5VTEwpIHsKKyAgICAgICAgc3dpdGNoIChoX2Vycm9yKSB7CisgICAgICAgIGNhc2UgSE9TVF9OT1RfRk9VTkQ6CisgICAgICAgIGNhc2UgTk9fREFUQToKKyAgICAgICAgICAgIGVycm9yID0gRUFJX05PREFUQTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRSWV9BR0FJTjoKKyAgICAgICAgICAgIGVycm9yID0gRUFJX0FHQUlOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTk9fUkVDT1ZFUlk6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnJvciA9IEVBSV9GQUlMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZ290byBmcmVlOworICAgIH0KIAotCWlmICgoaHAtPmhfbmFtZSA9PSBOVUxMKSB8fCAoaHAtPmhfbmFtZVswXSA9PSAwKSB8fAotCSAgICAoaHAtPmhfYWRkcl9saXN0WzBdID09IE5VTEwpKSB7Ci0JCWVycm9yID0gRUFJX0ZBSUw7Ci0JCWdvdG8gZnJlZTsKLQl9Ci0JCi0JZm9yIChpID0gMDsgKGFwID0gaHAtPmhfYWRkcl9saXN0W2ldKSAhPSBOVUxMOyBpKyspIHsKLQkJc3dpdGNoIChhZikgeworICAgIGlmICgoaHAtPmhfbmFtZSA9PSBOVUxMKSB8fCAoaHAtPmhfbmFtZVswXSA9PSAwKSB8fAorICAgICAgICAoaHAtPmhfYWRkcl9saXN0WzBdID09IE5VTEwpKSB7CisgICAgICAgIGVycm9yID0gRUFJX0ZBSUw7CisgICAgICAgIGdvdG8gZnJlZTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyAoYXAgPSBocC0+aF9hZGRyX2xpc3RbaV0pICE9IE5VTEw7IGkrKykgeworICAgICAgICBzd2l0Y2ggKGFmKSB7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQkJY2FzZSBBRl9JTkVUNjoKLQkJCWdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUNl07Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgICAgIGdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUNl07CisgICAgICAgICAgICBicmVhazsKICNlbmRpZgogI2lmbmRlZiBFTkFCTEVfSVBWNgotCQlkZWZhdWx0OgkvKiBBRl9VTlNQRUMgKi8KKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgLyogQUZfVU5TUEVDICovCiAjZW5kaWYKLQkJY2FzZSBBRl9JTkVUOgotCQkJZ2FpX2FmZCA9ICZnYWlfYWZkbFtOX0lORVRdOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgICAgIGdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUXTsKKyAgICAgICAgICAgIGJyZWFrOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCWRlZmF1bHQ6CS8qIEFGX1VOU1BFQyAqLwotCQkJaWYgKElONl9JU19BRERSX1Y0TUFQUEVEKChzdHJ1Y3QgaW42X2FkZHIgKilhcCkpIHsKLQkJCQlhcCArPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSAtCi0JCQkJCXNpemVvZihzdHJ1Y3QgaW5fYWRkcik7Ci0JCQkJZ2FpX2FmZCA9ICZnYWlfYWZkbFtOX0lORVRdOwotCQkJfSBlbHNlCi0JCQkJZ2FpX2FmZCA9ICZnYWlfYWZkbFtOX0lORVQ2XTsKLQkJCWJyZWFrOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiBBRl9VTlNQRUMgKi8KKyAgICAgICAgICAgIGlmIChJTjZfSVNfQUREUl9WNE1BUFBFRCgoc3RydWN0IGluNl9hZGRyICopYXApKSB7CisgICAgICAgICAgICAgICAgYXAgKz0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgLQorICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpOworICAgICAgICAgICAgICAgIGdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUXTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUNl07CisgICAgICAgICAgICBicmVhazsKICNlbmRpZgotCQl9CisgICAgICAgIH0KICNpZmRlZiBGQUlUSAotCQlpZiAodHJhbnNsYXRlICYmIGdhaV9hZmQtPmFfYWYgPT0gQUZfSU5FVCkgewotCQkJc3RydWN0IGluNl9hZGRyICppbjY7CisgICAgICAgIGlmICh0cmFuc2xhdGUgJiYgZ2FpX2FmZC0+YV9hZiA9PSBBRl9JTkVUKSB7CisgICAgICAgICAgICBzdHJ1Y3QgaW42X2FkZHIgKmluNjsKIAotCQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgJmdhaV9hZmRsW05fSU5FVDZdLCBhcCwgcG9ydCk7Ci0JCQlpbjYgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopY3VyLT5haV9uZXh0LT5haV9hZGRyKS0+c2luNl9hZGRyOwotCQkJbWVtY3B5KCZpbjYtPnM2X2FkZHIzMlswXSwgJmZhaXRoX3ByZWZpeCwKLQkJCSAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSAtIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCQkJbWVtY3B5KCZpbjYtPnM2X2FkZHIzMlszXSwgYXAsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCQl9IGVsc2UKKyAgICAgICAgICAgIEdFVF9BSShjdXItPmFpX25leHQsICZnYWlfYWZkbFtOX0lORVQ2XSwgYXAsIHBvcnQpOworICAgICAgICAgICAgaW42ID0gJigoc3RydWN0IHNvY2thZGRyX2luNiAqKWN1ci0+YWlfbmV4dC0+YWlfYWRkciktPnNpbjZfYWRkcjsKKyAgICAgICAgICAgIG1lbWNweSgmaW42LT5zNl9hZGRyMzJbMF0sICZmYWl0aF9wcmVmaXgsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgLSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgICAgICAgICAgIG1lbWNweSgmaW42LT5zNl9hZGRyMzJbM10sIGFwLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgICAgICAgfSBlbHNlCiAjZW5kaWYgLyogRkFJVEggKi8KLQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgZ2FpX2FmZCwgYXAsIHBvcnQpOwotCQlpZiAoY3VyID09ICZzZW50aW5lbCkgewotCQkJdG9wID0gY3VyLT5haV9uZXh0OwotCQkJR0VUX0NBTk9OTkFNRSh0b3AsIGhwLT5oX25hbWUpOwotCQl9Ci0JCWN1ciA9IGN1ci0+YWlfbmV4dDsKLQl9CisgICAgICAgIEdFVF9BSShjdXItPmFpX25leHQsIGdhaV9hZmQsIGFwLCBwb3J0KTsKKyAgICAgICAgaWYgKGN1ciA9PSAmc2VudGluZWwpIHsKKyAgICAgICAgICAgIHRvcCA9IGN1ci0+YWlfbmV4dDsKKyAgICAgICAgICAgIEdFVF9DQU5PTk5BTUUodG9wLCBocC0+aF9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPmFpX25leHQ7CisgICAgfQogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JZnJlZWhvc3RlbnQoaHApOworICAgIGZyZWVob3N0ZW50KGhwKTsKICNlbmRpZgotCSpyZXMgPSB0b3A7Ci0JcmV0dXJuIFNVQ0NFU1M7CisgICAgKnJlcyA9IHRvcDsKKyAgICByZXR1cm4gU1VDQ0VTUzsKICBmcmVlOgotCWlmICh0b3ApCi0JCWZyZWVhZGRyaW5mbyh0b3ApOworICAgIGlmICh0b3ApCisgICAgICAgIGZyZWVhZGRyaW5mbyh0b3ApOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JaWYgKGhwKQotCQlmcmVlaG9zdGVudChocCk7CisgICAgaWYgKGhwKQorICAgICAgICBmcmVlaG9zdGVudChocCk7CiAjZW5kaWYKIC8qIGJhZDogKi8KLQkqcmVzID0gTlVMTDsKLQlyZXR1cm4gZXJyb3I7CisgICAgKnJlcyA9IE5VTEw7CisgICAgcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRidWlsZGluZm8uYyBiL01vZHVsZXMvZ2V0YnVpbGRpbmZvLmMKaW5kZXggZjRiZDE0YS4uM2JhYzFjNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRidWlsZGluZm8uYworKysgYi9Nb2R1bGVzL2dldGJ1aWxkaW5mby5jCkBAIC0zMSwyMiArMzEsMjIgQEAKIGNvbnN0IGNoYXIgKgogUHlfR2V0QnVpbGRJbmZvKHZvaWQpCiB7Ci0Jc3RhdGljIGNoYXIgYnVpbGRpbmZvWzUwXTsKLQljb25zdCBjaGFyICpyZXZpc2lvbiA9IFB5X1N1YnZlcnNpb25SZXZpc2lvbigpOwotCWNvbnN0IGNoYXIgKnNlcCA9ICpyZXZpc2lvbiA/ICI6IiA6ICIiOwotCWNvbnN0IGNoYXIgKmJyYW5jaCA9IFB5X1N1YnZlcnNpb25TaG9ydEJyYW5jaCgpOwotCVB5T1Nfc25wcmludGYoYnVpbGRpbmZvLCBzaXplb2YoYnVpbGRpbmZvKSwKLQkJICAgICAgIiVzJXMlcywgJS4yMHMsICUuOXMiLCBicmFuY2gsIHNlcCwgcmV2aXNpb24sIAotCQkgICAgICBEQVRFLCBUSU1FKTsKLQlyZXR1cm4gYnVpbGRpbmZvOworICAgIHN0YXRpYyBjaGFyIGJ1aWxkaW5mb1s1MF07CisgICAgY29uc3QgY2hhciAqcmV2aXNpb24gPSBQeV9TdWJ2ZXJzaW9uUmV2aXNpb24oKTsKKyAgICBjb25zdCBjaGFyICpzZXAgPSAqcmV2aXNpb24gPyAiOiIgOiAiIjsKKyAgICBjb25zdCBjaGFyICpicmFuY2ggPSBQeV9TdWJ2ZXJzaW9uU2hvcnRCcmFuY2goKTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1aWxkaW5mbywgc2l6ZW9mKGJ1aWxkaW5mbyksCisgICAgICAgICAgICAgICAgICAiJXMlcyVzLCAlLjIwcywgJS45cyIsIGJyYW5jaCwgc2VwLCByZXZpc2lvbiwKKyAgICAgICAgICAgICAgICAgIERBVEUsIFRJTUUpOworICAgIHJldHVybiBidWlsZGluZm87CiB9CiAKIGNvbnN0IGNoYXIgKgogX1B5X3N2bnZlcnNpb24odm9pZCkKIHsKLQkvKiB0aGUgZm9sbG93aW5nIHN0cmluZyBjYW4gYmUgbW9kaWZpZWQgYnkgc3Vid2NyZXYuZXhlICovCi0Jc3RhdGljIGNvbnN0IGNoYXIgc3ZudmVyc2lvbltdID0gU1ZOVkVSU0lPTjsKLQlpZiAoc3ZudmVyc2lvblswXSAhPSAnJCcpCi0JCXJldHVybiBzdm52ZXJzaW9uOyAvKiBpdCB3YXMgaW50ZXJwb2xhdGVkLCBvciBwYXNzZWQgb24gY29tbWFuZCBsaW5lICovCi0JcmV0dXJuICJVbnZlcnNpb25lZCBkaXJlY3RvcnkiOworICAgIC8qIHRoZSBmb2xsb3dpbmcgc3RyaW5nIGNhbiBiZSBtb2RpZmllZCBieSBzdWJ3Y3Jldi5leGUgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciBzdm52ZXJzaW9uW10gPSBTVk5WRVJTSU9OOworICAgIGlmIChzdm52ZXJzaW9uWzBdICE9ICckJykKKyAgICAgICAgcmV0dXJuIHN2bnZlcnNpb247IC8qIGl0IHdhcyBpbnRlcnBvbGF0ZWQsIG9yIHBhc3NlZCBvbiBjb21tYW5kIGxpbmUgKi8KKyAgICByZXR1cm4gIlVudmVyc2lvbmVkIGRpcmVjdG9yeSI7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldG5hbWVpbmZvLmMgYi9Nb2R1bGVzL2dldG5hbWVpbmZvLmMKaW5kZXggZDNjMGFjNS4uNzg5MmFlOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRuYW1laW5mby5jCisrKyBiL01vZHVsZXMvZ2V0bmFtZWluZm8uYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKKyAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICogYXJlIG1ldDoKQEAgLTEzLDcgKzEzLDcgQEAKICAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCisgKgogICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKQEAgLTUzLDE2MiArNTMsMTYyIEBACiAjZGVmaW5lIE5PICAwCiAKIHN0YXRpYyBzdHJ1Y3QgZ25pX2FmZCB7Ci0JaW50IGFfYWY7Ci0JaW50IGFfYWRkcmxlbjsKLQlpbnQgYV9zb2NrbGVuOwotCWludCBhX29mZjsKKyAgICBpbnQgYV9hZjsKKyAgICBpbnQgYV9hZGRybGVuOworICAgIGludCBhX3NvY2tsZW47CisgICAgaW50IGFfb2ZmOwogfSBnbmlfYWZkbCBbXSA9IHsKICNpZmRlZiBFTkFCTEVfSVBWNgotCXtQRl9JTkVUNiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSwKLQkJb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luNiwgc2luNl9hZGRyKX0sCisgICAge1BGX0lORVQ2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpLAorICAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW42LCBzaW42X2FkZHIpfSwKICNlbmRpZgotCXtQRl9JTkVULCBzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSwKLQkJb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luLCBzaW5fYWRkcil9LAotCXswLCAwLCAwfSwKKyAgICB7UEZfSU5FVCwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksCisgICAgICAgIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbiwgc2luX2FkZHIpfSwKKyAgICB7MCwgMCwgMH0sCiB9OwogCiBzdHJ1Y3QgZ25pX3NvY2tpbmV0IHsKLQl1X2NoYXIJc2lfbGVuOwotCXVfY2hhcglzaV9mYW1pbHk7Ci0JdV9zaG9ydAlzaV9wb3J0OworICAgIHVfY2hhciAgICAgIHNpX2xlbjsKKyAgICB1X2NoYXIgICAgICBzaV9mYW1pbHk7CisgICAgdV9zaG9ydCAgICAgc2lfcG9ydDsKIH07CiAKLSNkZWZpbmUgRU5JX05PU09DS0VUIAkwCi0jZGVmaW5lIEVOSV9OT1NFUlZOQU1FCTEKLSNkZWZpbmUgRU5JX05PSE9TVE5BTUUJMgotI2RlZmluZSBFTklfTUVNT1JZCTMKLSNkZWZpbmUgRU5JX1NZU1RFTQk0Ci0jZGVmaW5lIEVOSV9GQU1JTFkJNQotI2RlZmluZSBFTklfU0FMRU4JNgorI2RlZmluZSBFTklfTk9TT0NLRVQgICAgMAorI2RlZmluZSBFTklfTk9TRVJWTkFNRSAgMQorI2RlZmluZSBFTklfTk9IT1NUTkFNRSAgMgorI2RlZmluZSBFTklfTUVNT1JZICAgICAgMworI2RlZmluZSBFTklfU1lTVEVNICAgICAgNAorI2RlZmluZSBFTklfRkFNSUxZICAgICAgNQorI2RlZmluZSBFTklfU0FMRU4gICAgICAgNgogCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIHRvIG1ha2UgZ2NjIGhhcHB5ICovCiBpbnQgZ2V0bmFtZWluZm8gUHlfUFJPVE8oKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLCBzaXplX3QsIGNoYXIgKiwgc2l6ZV90LAotCQkJICBjaGFyICosIHNpemVfdCwgaW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBpbnQpKTsKIAogaW50CiBnZXRuYW1laW5mbyhzYSwgc2FsZW4sIGhvc3QsIGhvc3RsZW4sIHNlcnYsIHNlcnZsZW4sIGZsYWdzKQotCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2E7Ci0Jc2l6ZV90IHNhbGVuOwotCWNoYXIgKmhvc3Q7Ci0Jc2l6ZV90IGhvc3RsZW47Ci0JY2hhciAqc2VydjsKLQlzaXplX3Qgc2VydmxlbjsKLQlpbnQgZmxhZ3M7CisgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYTsKKyAgICBzaXplX3Qgc2FsZW47CisgICAgY2hhciAqaG9zdDsKKyAgICBzaXplX3QgaG9zdGxlbjsKKyAgICBjaGFyICpzZXJ2OworICAgIHNpemVfdCBzZXJ2bGVuOworICAgIGludCBmbGFnczsKIHsKLQlzdHJ1Y3QgZ25pX2FmZCAqZ25pX2FmZDsKLQlzdHJ1Y3Qgc2VydmVudCAqc3A7Ci0Jc3RydWN0IGhvc3RlbnQgKmhwOwotCXVfc2hvcnQgcG9ydDsKLQlpbnQgZmFtaWx5LCBsZW4sIGk7Ci0JY2hhciAqYWRkciwgKnA7Ci0JdV9sb25nIHY0YTsKKyAgICBzdHJ1Y3QgZ25pX2FmZCAqZ25pX2FmZDsKKyAgICBzdHJ1Y3Qgc2VydmVudCAqc3A7CisgICAgc3RydWN0IGhvc3RlbnQgKmhwOworICAgIHVfc2hvcnQgcG9ydDsKKyAgICBpbnQgZmFtaWx5LCBsZW4sIGk7CisgICAgY2hhciAqYWRkciwgKnA7CisgICAgdV9sb25nIHY0YTsKICNpZmRlZiBFTkFCTEVfSVBWNgotCXVfY2hhciBwZng7CisgICAgdV9jaGFyIHBmeDsKICNlbmRpZgotCWludCBoX2Vycm9yOwotCWNoYXIgbnVtc2Vydls1MTJdOwotCWNoYXIgbnVtYWRkcls1MTJdOworICAgIGludCBoX2Vycm9yOworICAgIGNoYXIgbnVtc2Vydls1MTJdOworICAgIGNoYXIgbnVtYWRkcls1MTJdOwogCi0JaWYgKHNhID09IE5VTEwpCi0JCXJldHVybiBFTklfTk9TT0NLRVQ7CisgICAgaWYgKHNhID09IE5VTEwpCisgICAgICAgIHJldHVybiBFTklfTk9TT0NLRVQ7CiAKICNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCWxlbiA9IHNhLT5zYV9sZW47Ci0JaWYgKGxlbiAhPSBzYWxlbikgcmV0dXJuIEVOSV9TQUxFTjsKKyAgICBsZW4gPSBzYS0+c2FfbGVuOworICAgIGlmIChsZW4gIT0gc2FsZW4pIHJldHVybiBFTklfU0FMRU47CiAjZWxzZQotCWxlbiA9IHNhbGVuOworICAgIGxlbiA9IHNhbGVuOwogI2VuZGlmCi0JCi0JZmFtaWx5ID0gc2EtPnNhX2ZhbWlseTsKLQlmb3IgKGkgPSAwOyBnbmlfYWZkbFtpXS5hX2FmOyBpKyspCi0JCWlmIChnbmlfYWZkbFtpXS5hX2FmID09IGZhbWlseSkgewotCQkJZ25pX2FmZCA9ICZnbmlfYWZkbFtpXTsKLQkJCWdvdG8gZm91bmQ7Ci0JCX0KLQlyZXR1cm4gRU5JX0ZBTUlMWTsKLQkKKworICAgIGZhbWlseSA9IHNhLT5zYV9mYW1pbHk7CisgICAgZm9yIChpID0gMDsgZ25pX2FmZGxbaV0uYV9hZjsgaSsrKQorICAgICAgICBpZiAoZ25pX2FmZGxbaV0uYV9hZiA9PSBmYW1pbHkpIHsKKyAgICAgICAgICAgIGduaV9hZmQgPSAmZ25pX2FmZGxbaV07CisgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgICAgICB9CisgICAgcmV0dXJuIEVOSV9GQU1JTFk7CisKICBmb3VuZDoKLQlpZiAobGVuICE9IGduaV9hZmQtPmFfc29ja2xlbikgcmV0dXJuIEVOSV9TQUxFTjsKLQkKLQlwb3J0ID0gKChzdHJ1Y3QgZ25pX3NvY2tpbmV0ICopc2EpLT5zaV9wb3J0OyAvKiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KLQlhZGRyID0gKGNoYXIgKilzYSArIGduaV9hZmQtPmFfb2ZmOworICAgIGlmIChsZW4gIT0gZ25pX2FmZC0+YV9zb2NrbGVuKSByZXR1cm4gRU5JX1NBTEVOOwogCi0JaWYgKHNlcnYgPT0gTlVMTCB8fCBzZXJ2bGVuID09IDApIHsKLQkJLyogd2hhdCB3ZSBzaG91bGQgZG8/ICovCi0JfSBlbHNlIGlmIChmbGFncyAmIE5JX05VTUVSSUNTRVJWKSB7Ci0JCXNwcmludGYobnVtc2VydiwgIiVkIiwgbnRvaHMocG9ydCkpOwotCQlpZiAoc3RybGVuKG51bXNlcnYpID4gc2VydmxlbikKLQkJCXJldHVybiBFTklfTUVNT1JZOwotCQlzdHJjcHkoc2VydiwgbnVtc2Vydik7Ci0JfSBlbHNlIHsKLQkJc3AgPSBnZXRzZXJ2Ynlwb3J0KHBvcnQsIChmbGFncyAmIE5JX0RHUkFNKSA/ICJ1ZHAiIDogInRjcCIpOwotCQlpZiAoc3ApIHsKLQkJCWlmIChzdHJsZW4oc3AtPnNfbmFtZSkgPiBzZXJ2bGVuKQotCQkJCXJldHVybiBFTklfTUVNT1JZOwotCQkJc3RyY3B5KHNlcnYsIHNwLT5zX25hbWUpOwotCQl9IGVsc2UKLQkJCXJldHVybiBFTklfTk9TRVJWTkFNRTsKLQl9CisgICAgcG9ydCA9ICgoc3RydWN0IGduaV9zb2NraW5ldCAqKXNhKS0+c2lfcG9ydDsgLyogbmV0d29yayBieXRlIG9yZGVyICovCisgICAgYWRkciA9IChjaGFyICopc2EgKyBnbmlfYWZkLT5hX29mZjsKIAotCXN3aXRjaCAoc2EtPnNhX2ZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKLQkJdjRhID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9hZGRyLnNfYWRkcjsKLQkJaWYgKElOX01VTFRJQ0FTVCh2NGEpIHx8IElOX0VYUEVSSU1FTlRBTCh2NGEpKQotCQkJZmxhZ3MgfD0gTklfTlVNRVJJQ0hPU1Q7Ci0JCXY0YSA+Pj0gSU5fQ0xBU1NBX05TSElGVDsKLQkJaWYgKHY0YSA9PSAwIHx8IHY0YSA9PSBJTl9MT09QQkFDS05FVCkKLQkJCWZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOwkJCQotCQlicmVhazsKKyAgICBpZiAoc2VydiA9PSBOVUxMIHx8IHNlcnZsZW4gPT0gMCkgeworICAgICAgICAvKiB3aGF0IHdlIHNob3VsZCBkbz8gKi8KKyAgICB9IGVsc2UgaWYgKGZsYWdzICYgTklfTlVNRVJJQ1NFUlYpIHsKKyAgICAgICAgc3ByaW50ZihudW1zZXJ2LCAiJWQiLCBudG9ocyhwb3J0KSk7CisgICAgICAgIGlmIChzdHJsZW4obnVtc2VydikgPiBzZXJ2bGVuKQorICAgICAgICAgICAgcmV0dXJuIEVOSV9NRU1PUlk7CisgICAgICAgIHN0cmNweShzZXJ2LCBudW1zZXJ2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcCA9IGdldHNlcnZieXBvcnQocG9ydCwgKGZsYWdzICYgTklfREdSQU0pID8gInVkcCIgOiAidGNwIik7CisgICAgICAgIGlmIChzcCkgeworICAgICAgICAgICAgaWYgKHN0cmxlbihzcC0+c19uYW1lKSA+IHNlcnZsZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIEVOSV9NRU1PUlk7CisgICAgICAgICAgICBzdHJjcHkoc2Vydiwgc3AtPnNfbmFtZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIEVOSV9OT1NFUlZOQU1FOworICAgIH0KKworICAgIHN3aXRjaCAoc2EtPnNhX2ZhbWlseSkgeworICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgdjRhID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9hZGRyLnNfYWRkcjsKKyAgICAgICAgaWYgKElOX01VTFRJQ0FTVCh2NGEpIHx8IElOX0VYUEVSSU1FTlRBTCh2NGEpKQorICAgICAgICAgICAgZmxhZ3MgfD0gTklfTlVNRVJJQ0hPU1Q7CisgICAgICAgIHY0YSA+Pj0gSU5fQ0xBU1NBX05TSElGVDsKKyAgICAgICAgaWYgKHY0YSA9PSAwIHx8IHY0YSA9PSBJTl9MT09QQkFDS05FVCkKKyAgICAgICAgICAgIGZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOworICAgICAgICBicmVhazsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JCXBmeCA9ICgoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhKS0+c2luNl9hZGRyLnM2X2FkZHI4WzBdOwotCQlpZiAocGZ4ID09IDAgfHwgcGZ4ID09IDB4ZmUgfHwgcGZ4ID09IDB4ZmYpCi0JCQlmbGFncyB8PSBOSV9OVU1FUklDSE9TVDsKLQkJYnJlYWs7CisgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgcGZ4ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EpLT5zaW42X2FkZHIuczZfYWRkcjhbMF07CisgICAgICAgIGlmIChwZnggPT0gMCB8fCBwZnggPT0gMHhmZSB8fCBwZnggPT0gMHhmZikKKyAgICAgICAgICAgIGZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOworICAgICAgICBicmVhazsKICNlbmRpZgotCX0KLQlpZiAoaG9zdCA9PSBOVUxMIHx8IGhvc3RsZW4gPT0gMCkgewotCQkvKiB3aGF0IHNob3VsZCB3ZSBkbz8gKi8KLQl9IGVsc2UgaWYgKGZsYWdzICYgTklfTlVNRVJJQ0hPU1QpIHsKLQkJaWYgKGluZXRfbnRvcChnbmlfYWZkLT5hX2FmLCBhZGRyLCBudW1hZGRyLCBzaXplb2YobnVtYWRkcikpCi0JCSAgICA9PSBOVUxMKQotCQkJcmV0dXJuIEVOSV9TWVNURU07Ci0JCWlmIChzdHJsZW4obnVtYWRkcikgPiBob3N0bGVuKQotCQkJcmV0dXJuIEVOSV9NRU1PUlk7Ci0JCXN0cmNweShob3N0LCBudW1hZGRyKTsKLQl9IGVsc2UgeworICAgIH0KKyAgICBpZiAoaG9zdCA9PSBOVUxMIHx8IGhvc3RsZW4gPT0gMCkgeworICAgICAgICAvKiB3aGF0IHNob3VsZCB3ZSBkbz8gKi8KKyAgICB9IGVsc2UgaWYgKGZsYWdzICYgTklfTlVNRVJJQ0hPU1QpIHsKKyAgICAgICAgaWYgKGluZXRfbnRvcChnbmlfYWZkLT5hX2FmLCBhZGRyLCBudW1hZGRyLCBzaXplb2YobnVtYWRkcikpCisgICAgICAgICAgICA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIEVOSV9TWVNURU07CisgICAgICAgIGlmIChzdHJsZW4obnVtYWRkcikgPiBob3N0bGVuKQorICAgICAgICAgICAgcmV0dXJuIEVOSV9NRU1PUlk7CisgICAgICAgIHN0cmNweShob3N0LCBudW1hZGRyKTsKKyAgICB9IGVsc2UgewogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCWhwID0gZ2V0aXBub2RlYnlhZGRyKGFkZHIsIGduaV9hZmQtPmFfYWRkcmxlbiwgZ25pX2FmZC0+YV9hZiwgJmhfZXJyb3IpOworICAgICAgICBocCA9IGdldGlwbm9kZWJ5YWRkcihhZGRyLCBnbmlfYWZkLT5hX2FkZHJsZW4sIGduaV9hZmQtPmFfYWYsICZoX2Vycm9yKTsKICNlbHNlCi0JCWhwID0gZ2V0aG9zdGJ5YWRkcihhZGRyLCBnbmlfYWZkLT5hX2FkZHJsZW4sIGduaV9hZmQtPmFfYWYpOwotCQloX2Vycm9yID0gaF9lcnJubzsKKyAgICAgICAgaHAgPSBnZXRob3N0YnlhZGRyKGFkZHIsIGduaV9hZmQtPmFfYWRkcmxlbiwgZ25pX2FmZC0+YV9hZik7CisgICAgICAgIGhfZXJyb3IgPSBoX2Vycm5vOwogI2VuZGlmCiAKLQkJaWYgKGhwKSB7Ci0JCQlpZiAoZmxhZ3MgJiBOSV9OT0ZRRE4pIHsKLQkJCQlwID0gc3RyY2hyKGhwLT5oX25hbWUsICcuJyk7Ci0JCQkJaWYgKHApICpwID0gJ1wwJzsKLQkJCX0KLQkJCWlmIChzdHJsZW4oaHAtPmhfbmFtZSkgPiBob3N0bGVuKSB7CisgICAgICAgIGlmIChocCkgeworICAgICAgICAgICAgaWYgKGZsYWdzICYgTklfTk9GUUROKSB7CisgICAgICAgICAgICAgICAgcCA9IHN0cmNocihocC0+aF9uYW1lLCAnLicpOworICAgICAgICAgICAgICAgIGlmIChwKSAqcCA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RybGVuKGhwLT5oX25hbWUpID4gaG9zdGxlbikgewogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCQkJZnJlZWhvc3RlbnQoaHApOworICAgICAgICAgICAgICAgIGZyZWVob3N0ZW50KGhwKTsKICNlbmRpZgotCQkJCXJldHVybiBFTklfTUVNT1JZOwotCQkJfQotCQkJc3RyY3B5KGhvc3QsIGhwLT5oX25hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBFTklfTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyY3B5KGhvc3QsIGhwLT5oX25hbWUpOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCQlmcmVlaG9zdGVudChocCk7CisgICAgICAgICAgICBmcmVlaG9zdGVudChocCk7CiAjZW5kaWYKLQkJfSBlbHNlIHsKLQkJCWlmIChmbGFncyAmIE5JX05BTUVSRVFEKQotCQkJCXJldHVybiBFTklfTk9IT1NUTkFNRTsKLQkJCWlmIChpbmV0X250b3AoZ25pX2FmZC0+YV9hZiwgYWRkciwgbnVtYWRkciwgc2l6ZW9mKG51bWFkZHIpKQotCQkJICAgID09IE5VTEwpCi0JCQkJcmV0dXJuIEVOSV9OT0hPU1ROQU1FOwotCQkJaWYgKHN0cmxlbihudW1hZGRyKSA+IGhvc3RsZW4pCi0JCQkJcmV0dXJuIEVOSV9NRU1PUlk7Ci0JCQlzdHJjcHkoaG9zdCwgbnVtYWRkcik7Ci0JCX0KLQl9Ci0JcmV0dXJuIFNVQ0NFU1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBOSV9OQU1FUkVRRCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRU5JX05PSE9TVE5BTUU7CisgICAgICAgICAgICBpZiAoaW5ldF9udG9wKGduaV9hZmQtPmFfYWYsIGFkZHIsIG51bWFkZHIsIHNpemVvZihudW1hZGRyKSkKKyAgICAgICAgICAgICAgICA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFTklfTk9IT1NUTkFNRTsKKyAgICAgICAgICAgIGlmIChzdHJsZW4obnVtYWRkcikgPiBob3N0bGVuKQorICAgICAgICAgICAgICAgIHJldHVybiBFTklfTUVNT1JZOworICAgICAgICAgICAgc3RyY3B5KGhvc3QsIG51bWFkZHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRwYXRoLmMgYi9Nb2R1bGVzL2dldHBhdGguYwppbmRleCA2ODJhZDNlLi45NjUzZDNlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2dldHBhdGguYworKysgYi9Nb2R1bGVzL2dldHBhdGguYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAgICAgICAgICAgICBidWZmZXJbbisrXSA9IFNFUDsKICAgICB9CiAgICAgaWYgKG4gPiBNQVhQQVRITEVOKQotICAgIAlQeV9GYXRhbEVycm9yKCJidWZmZXIgb3ZlcmZsb3cgaW4gZ2V0cGF0aC5jJ3Mgam9pbnBhdGgoKSIpOworICAgICAgICBQeV9GYXRhbEVycm9yKCJidWZmZXIgb3ZlcmZsb3cgaW4gZ2V0cGF0aC5jJ3Mgam9pbnBhdGgoKSIpOwogICAgIGsgPSBzdHJsZW4oc3R1ZmYpOwogICAgIGlmIChuICsgayA+IE1BWFBBVEhMRU4pCiAgICAgICAgIGsgPSBNQVhQQVRITEVOIC0gbjsKQEAgLTM5MywxMyArMzkzLDEzIEBACiAjZW5kaWYKICNlbmRpZgogCi0JLyogSWYgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIGFyZ3YwIHBhdGgsIHRoZW4gd2UgaGF2ZSB0bwotCSAqIGFzc3VtZSBweXRob24gaXMgb24gdGhlIHVzZXIncyAkUEFUSCwgc2luY2UgdGhlcmUncyBubwotCSAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCi0JICogJFBBVEggaXNuJ3QgZXhwb3J0ZWQsIHlvdSBsb3NlLgotCSAqLwotCWlmIChzdHJjaHIocHJvZywgU0VQKSkKLQkJc3RybmNweShwcm9ncGF0aCwgcHJvZywgTUFYUEFUSExFTik7CisgICAgICAgIC8qIElmIHRoZXJlIGlzIG5vIHNsYXNoIGluIHRoZSBhcmd2MCBwYXRoLCB0aGVuIHdlIGhhdmUgdG8KKyAgICAgICAgICogYXNzdW1lIHB5dGhvbiBpcyBvbiB0aGUgdXNlcidzICRQQVRILCBzaW5jZSB0aGVyZSdzIG5vCisgICAgICAgICAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCisgICAgICAgICAqICRQQVRIIGlzbid0IGV4cG9ydGVkLCB5b3UgbG9zZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzdHJjaHIocHJvZywgU0VQKSkKKyAgICAgICAgICAgICAgICBzdHJuY3B5KHByb2dwYXRoLCBwcm9nLCBNQVhQQVRITEVOKTsKICNpZmRlZiBfX0FQUExFX18KICAgICAgLyogT24gTWFjIE9TIFgsIGlmIGEgc2NyaXB0IHVzZXMgYW4gaW50ZXJwcmV0ZXIgb2YgdGhlIGZvcm0KICAgICAgICogIiMhL29wdC9weXRob24yLjMvYmluL3B5dGhvbiIsIHRoZSBrZXJuZWwgb25seSBwYXNzZXMgInB5dGhvbiIKQEAgLTQxNCw0NCArNDE0LDQ0IEBACiAgICAgIGVsc2UgaWYoMCA9PSBfTlNHZXRFeGVjdXRhYmxlUGF0aChwcm9ncGF0aCwgJm5zZXhlY2xlbmd0aCkgJiYgcHJvZ3BhdGhbMF0gPT0gU0VQKQogICAgICAgIDsKICNlbmRpZiAvKiBfX0FQUExFX18gKi8KLQllbHNlIGlmIChwYXRoKSB7Ci0JCXdoaWxlICgxKSB7Ci0JCQljaGFyICpkZWxpbSA9IHN0cmNocihwYXRoLCBERUxJTSk7CisgICAgICAgIGVsc2UgaWYgKHBhdGgpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGVsaW0gPSBzdHJjaHIocGF0aCwgREVMSU0pOwogCi0JCQlpZiAoZGVsaW0pIHsKLQkJCQlzaXplX3QgbGVuID0gZGVsaW0gLSBwYXRoOwotCQkJCWlmIChsZW4gPiBNQVhQQVRITEVOKQotCQkJCQlsZW4gPSBNQVhQQVRITEVOOwotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7Ci0JCQkJKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOwotCQkJfQotCQkJZWxzZQotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIE1BWFBBVEhMRU4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGltKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSBkZWxpbSAtIHBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiBNQVhQQVRITEVOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IE1BWFBBVEhMRU47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHJvZ3BhdGggKyBsZW4pID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcGF0aCwgTUFYUEFUSExFTik7CiAKLQkJCWpvaW5wYXRoKHByb2dwYXRoLCBwcm9nKTsKLQkJCWlmIChpc3hmaWxlKHByb2dwYXRoKSkKLQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5wYXRoKHByb2dwYXRoLCBwcm9nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3hmaWxlKHByb2dwYXRoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCWlmICghZGVsaW0pIHsKLQkJCQlwcm9ncGF0aFswXSA9ICdcMCc7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwYXRoID0gZGVsaW0gKyAxOwotCQl9Ci0JfQotCWVsc2UKLQkJcHJvZ3BhdGhbMF0gPSAnXDAnOwotCWlmIChwcm9ncGF0aFswXSAhPSBTRVAgJiYgcHJvZ3BhdGhbMF0gIT0gJ1wwJykKLQkJYWJzb2x1dGl6ZShwcm9ncGF0aCk7Ci0Jc3RybmNweShhcmd2MF9wYXRoLCBwcm9ncGF0aCwgTUFYUEFUSExFTik7Ci0JYXJndjBfcGF0aFtNQVhQQVRITEVOXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbGltKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gZGVsaW0gKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJvZ3BhdGhbMF0gPSAnXDAnOworICAgICAgICBpZiAocHJvZ3BhdGhbMF0gIT0gU0VQICYmIHByb2dwYXRoWzBdICE9ICdcMCcpCisgICAgICAgICAgICAgICAgYWJzb2x1dGl6ZShwcm9ncGF0aCk7CisgICAgICAgIHN0cm5jcHkoYXJndjBfcGF0aCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pOworICAgICAgICBhcmd2MF9wYXRoW01BWFBBVEhMRU5dID0gJ1wwJzsKIAogI2lmZGVmIFdJVEhfTkVYVF9GUkFNRVdPUksKLQkvKiBPbiBNYWMgT1MgWCB3ZSBoYXZlIGEgc3BlY2lhbCBjYXNlIGlmIHdlJ3JlIHJ1bm5pbmcgZnJvbSBhIGZyYW1ld29yay4KLQkqKiBUaGlzIGlzIGJlY2F1c2UgdGhlIHB5dGhvbiBob21lIHNob3VsZCBiZSBzZXQgcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnksCi0JKiogd2hpY2ggaXMgaW4gdGhlIGZyYW1ld29yaywgbm90IHJlbGF0aXZlIHRvIHRoZSBleGVjdXRhYmxlLCB3aGljaCBtYXkKLQkqKiBiZSBvdXRzaWRlIG9mIHRoZSBmcmFtZXdvcmsuIEV4Y2VwdCB3aGVuIHdlJ3JlIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuLi4KLQkqLworICAgICAgICAvKiBPbiBNYWMgT1MgWCB3ZSBoYXZlIGEgc3BlY2lhbCBjYXNlIGlmIHdlJ3JlIHJ1bm5pbmcgZnJvbSBhIGZyYW1ld29yay4KKyAgICAgICAgKiogVGhpcyBpcyBiZWNhdXNlIHRoZSBweXRob24gaG9tZSBzaG91bGQgYmUgc2V0IHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5LAorICAgICAgICAqKiB3aGljaCBpcyBpbiB0aGUgZnJhbWV3b3JrLCBub3QgcmVsYXRpdmUgdG8gdGhlIGV4ZWN1dGFibGUsIHdoaWNoIG1heQorICAgICAgICAqKiBiZSBvdXRzaWRlIG9mIHRoZSBmcmFtZXdvcmsuIEV4Y2VwdCB3aGVuIHdlJ3JlIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuLi4KKyAgICAgICAgKi8KICAgICBweXRob25Nb2R1bGUgPSBOU01vZHVsZUZvclN5bWJvbChOU0xvb2t1cEFuZEJpbmRTeW1ib2woIl9QeV9Jbml0aWFsaXplIikpOwogICAgIC8qIFVzZSBkeWxpYiBmdW5jdGlvbnMgdG8gZmluZCBvdXQgd2hlcmUgdGhlIGZyYW1ld29yayB3YXMgbG9hZGVkIGZyb20gKi8KICAgICBidWYgPSAoY2hhciAqKU5TTGlicmFyeU5hbWVGb3JNb2R1bGUocHl0aG9uTW9kdWxlKTsKQEAgLTUyNSw3ICs1MjUsNyBAQAogICAgIGVsc2UKICAgICAgICAgc3RybmNweSh6aXBfcGF0aCwgUFJFRklYLCBNQVhQQVRITEVOKTsKICAgICBqb2lucGF0aCh6aXBfcGF0aCwgImxpYi9weXRob24wMC56aXAiKTsKLSAgICBidWZzeiA9IHN0cmxlbih6aXBfcGF0aCk7CS8qIFJlcGxhY2UgIjAwIiB3aXRoIHZlcnNpb24gKi8KKyAgICBidWZzeiA9IHN0cmxlbih6aXBfcGF0aCk7ICAgLyogUmVwbGFjZSAiMDAiIHdpdGggdmVyc2lvbiAqLwogICAgIHppcF9wYXRoW2J1ZnN6IC0gNl0gPSBWRVJTSU9OWzBdOwogICAgIHppcF9wYXRoW2J1ZnN6IC0gNV0gPSBWRVJTSU9OWzJdOwogCkBAIC02MzMsMTAgKzYzMywxMCBAQAogICAgIGlmIChwZm91bmQgPiAwKSB7CiAgICAgICAgIHJlZHVjZShwcmVmaXgpOwogICAgICAgICByZWR1Y2UocHJlZml4KTsKLQkvKiBUaGUgcHJlZml4IGlzIHRoZSByb290IGRpcmVjdG9yeSwgYnV0IHJlZHVjZSgpIGNob3BwZWQKLQkgKiBvZmYgdGhlICIvIi4gKi8KLQlpZiAoIXByZWZpeFswXSkKLQkJc3RyY3B5KHByZWZpeCwgc2VwYXJhdG9yKTsKKyAgICAgICAgLyogVGhlIHByZWZpeCBpcyB0aGUgcm9vdCBkaXJlY3RvcnksIGJ1dCByZWR1Y2UoKSBjaG9wcGVkCisgICAgICAgICAqIG9mZiB0aGUgIi8iLiAqLworICAgICAgICBpZiAoIXByZWZpeFswXSkKKyAgICAgICAgICAgICAgICBzdHJjcHkocHJlZml4LCBzZXBhcmF0b3IpOwogICAgIH0KICAgICBlbHNlCiAgICAgICAgIHN0cm5jcHkocHJlZml4LCBQUkVGSVgsIE1BWFBBVEhMRU4pOwpAQCAtNjQ1LDggKzY0NSw4IEBACiAgICAgICAgIHJlZHVjZShleGVjX3ByZWZpeCk7CiAgICAgICAgIHJlZHVjZShleGVjX3ByZWZpeCk7CiAgICAgICAgIHJlZHVjZShleGVjX3ByZWZpeCk7Ci0JaWYgKCFleGVjX3ByZWZpeFswXSkKLQkJc3RyY3B5KGV4ZWNfcHJlZml4LCBzZXBhcmF0b3IpOworICAgICAgICBpZiAoIWV4ZWNfcHJlZml4WzBdKQorICAgICAgICAgICAgICAgIHN0cmNweShleGVjX3ByZWZpeCwgc2VwYXJhdG9yKTsKICAgICB9CiAgICAgZWxzZQogICAgICAgICBzdHJuY3B5KGV4ZWNfcHJlZml4LCBFWEVDX1BSRUZJWCwgTUFYUEFUSExFTik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dsbW9kdWxlLmMgYi9Nb2R1bGVzL2dsbW9kdWxlLmMKaW5kZXggMDFkYjlmYy4uYjljNjRmYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nbG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZ2xtb2R1bGUuYwpAQCAtMTAsMjYgKzEwLDI2IEBACiA8cmV0dXJudHlwZT4gY2FuIGJlOiB2b2lkLCBzaG9ydCwgbG9uZyAoWFhYIG1heWJlIG90aGVycz8pCiAKIDx0eXBlPiBjYW4gYmU6IGNoYXIsIHN0cmluZywgc2hvcnQsIGZsb2F0LCBsb25nLCBvciBkb3VibGUKLQlzdHJpbmcgaW5kaWNhdGVzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZzsKLQlpZiA8dHlwZT4gaXMgY2hhciBhbmQgPGFyZz4gYmVnaW5zIHdpdGggYSAqLCB0aGUgKiBpcyBzdHJpcHBlZAotCWFuZCA8dHlwZT4gaXMgY2hhbmdlZCBpbnRvIHN0cmluZworICAgIHN0cmluZyBpbmRpY2F0ZXMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nOworICAgIGlmIDx0eXBlPiBpcyBjaGFyIGFuZCA8YXJnPiBiZWdpbnMgd2l0aCBhICosIHRoZSAqIGlzIHN0cmlwcGVkCisgICAgYW5kIDx0eXBlPiBpcyBjaGFuZ2VkIGludG8gc3RyaW5nCiAKIDxhcmc+IGhhcyB0aGUgZm9ybSA8bW9kZT4gb3IgPG1vZGU+WzxzdWJzY3JpcHQ+XQotCXdoZXJlIDxtb2RlPiBjYW4gYmUKLQkJczogYXJnIGlzIHNlbnQKLQkJcjogYXJnIGlzIHJlY2VpdmVkCQkoYXJnIGlzIGEgcG9pbnRlcikKLQlhbmQgPHN1YnNjcmlwdD4gY2FuIGJlIChOIGFuZCBJIGFyZSBudW1iZXJzKToKLQkJTgotCQlhcmdJCi0JCXJldHZhbAotCQlOKmFyZ0kKLQkJTipJCi0JCU4qcmV0dmFsCi0JSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN1YnNjcmlwdCBjb25zaXN0cyBvZiB0d28gcGFydHMKLQlzZXBhcmF0ZWQgYnkgKiwgdGhlIGZpcnN0IHBhcnQgaXMgdGhlIHdpZHRoIG9mIHRoZSBtYXRyaXgsIGFuZAotCXRoZSBzZWNvbmQgcGFydCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRyaXguICBUaGlzIG9yZGVyIGlzCi0Jb3Bwb3NpdGUgZnJvbSB0aGUgb3JkZXIgdXNlZCBpbiBDIHRvIGRlY2xhcmUgYSB0d28tZGltZW5zaW9uYWwKLQltYXRyaXguCisgICAgd2hlcmUgPG1vZGU+IGNhbiBiZQorICAgICAgICBzOiBhcmcgaXMgc2VudAorICAgICAgICByOiBhcmcgaXMgcmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgKGFyZyBpcyBhIHBvaW50ZXIpCisgICAgYW5kIDxzdWJzY3JpcHQ+IGNhbiBiZSAoTiBhbmQgSSBhcmUgbnVtYmVycyk6CisgICAgICAgIE4KKyAgICAgICAgYXJnSQorICAgICAgICByZXR2YWwKKyAgICAgICAgTiphcmdJCisgICAgICAgIE4qSQorICAgICAgICBOKnJldHZhbAorICAgIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBzdWJzY3JpcHQgY29uc2lzdHMgb2YgdHdvIHBhcnRzCisgICAgc2VwYXJhdGVkIGJ5ICosIHRoZSBmaXJzdCBwYXJ0IGlzIHRoZSB3aWR0aCBvZiB0aGUgbWF0cml4LCBhbmQKKyAgICB0aGUgc2Vjb25kIHBhcnQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0cml4LiAgVGhpcyBvcmRlciBpcworICAgIG9wcG9zaXRlIGZyb20gdGhlIG9yZGVyIHVzZWQgaW4gQyB0byBkZWNsYXJlIGEgdHdvLWRpbWVuc2lvbmFsCisgICAgbWF0cml4LgogKi8KIAogLyoKQEAgLTYyLDE3ICs2MiwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3FyZWFkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlzaG9ydCBhcmcxIDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmV0dmFsID0gcXJlYWQoICYgYXJnMSApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAyICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2xvbmdvYmplY3QocmV0dmFsKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgbG9uZyByZXR2YWw7CisgICAgc2hvcnQgYXJnMSA7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldHZhbCA9IHFyZWFkKCAmIGFyZzEgKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdsb25nb2JqZWN0KHJldHZhbCkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAKQEAgLTkxLDY0ICs5MSw2NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3ZhcnJheShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnYsICp3PU5VTEw7Ci0JaW50IGksIG4sIHdpZHRoOwotCWRvdWJsZSB2ZWNbM107Ci0JUHlPYmplY3QgKiAoKmdldGl0ZW0pKFB5T2JqZWN0ICosIGludCk7Ci0JCi0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgMSwgMCwgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiAoUHlMaXN0X0NoZWNrKHYpKSB7Ci0JCW4gPSBQeUxpc3RfU2l6ZSh2KTsKLQkJZ2V0aXRlbSA9IFB5TGlzdF9HZXRJdGVtOwotCX0KLQllbHNlIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCW4gPSBQeVR1cGxlX1NpemUodik7Ci0JCWdldGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW07Ci0JfQotCWVsc2UgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JaWYgKG4gPT0gMCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlpZiAobiA+IDApCi0JCXcgPSAoKmdldGl0ZW0pKHYsIDApOwotCQotCXdpZHRoID0gMDsKLQlpZiAodyA9PSBOVUxMKSB7Ci0JfQotCWVsc2UgaWYgKFB5TGlzdF9DaGVjayh3KSkgewotCQl3aWR0aCA9IFB5TGlzdF9TaXplKHcpOwotCX0KLQllbHNlIGlmIChQeVR1cGxlX0NoZWNrKHcpKSB7Ci0JCXdpZHRoID0gUHlUdXBsZV9TaXplKHcpOwotCX0KLQkKLQlzd2l0Y2ggKHdpZHRoKSB7Ci0JY2FzZSAyOgotCQl2ZWNbMl0gPSAwLjA7Ci0JCS8qIEZhbGwgdGhyb3VnaCAqLwotCWNhc2UgMzoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJdyA9ICgqZ2V0aXRlbSkodiwgaSk7Ci0JCWlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkodywgMSwgMCwgd2lkdGgsIHZlYykpCi0JCQlyZXR1cm4gTlVMTDsKLQkJdjNkKHZlYyk7Ci0JfQotCQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqdiwgKnc9TlVMTDsKKyAgICBpbnQgaSwgbiwgd2lkdGg7CisgICAgZG91YmxlIHZlY1szXTsKKyAgICBQeU9iamVjdCAqICgqZ2V0aXRlbSkoUHlPYmplY3QgKiwgaW50KTsKKworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDEsIDAsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIG4gPSBQeUxpc3RfU2l6ZSh2KTsKKyAgICAgICAgZ2V0aXRlbSA9IFB5TGlzdF9HZXRJdGVtOworICAgIH0KKyAgICBlbHNlIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgIG4gPSBQeVR1cGxlX1NpemUodik7CisgICAgICAgIGdldGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGlmIChuID4gMCkKKyAgICAgICAgdyA9ICgqZ2V0aXRlbSkodiwgMCk7CisKKyAgICB3aWR0aCA9IDA7CisgICAgaWYgKHcgPT0gTlVMTCkgeworICAgIH0KKyAgICBlbHNlIGlmIChQeUxpc3RfQ2hlY2sodykpIHsKKyAgICAgICAgd2lkdGggPSBQeUxpc3RfU2l6ZSh3KTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh3KSkgeworICAgICAgICB3aWR0aCA9IFB5VHVwbGVfU2l6ZSh3KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHdpZHRoKSB7CisgICAgY2FzZSAyOgorICAgICAgICB2ZWNbMl0gPSAwLjA7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgMzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICB3ID0gKCpnZXRpdGVtKSh2LCBpKTsKKyAgICAgICAgaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheSh3LCAxLCAwLCB3aWR0aCwgdmVjKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB2M2QodmVjKTsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qCkBAIC0xNzAsMTQgKzE3MCwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX252YXJyYXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5fbnZhcnJheShhcmdzLCAwKTsKKyAgICByZXR1cm4gZ2VuX252YXJyYXkoYXJncywgMCk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3ZuYXJyYXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5fbnZhcnJheShhcmdzLCAxKTsKKyAgICByZXR1cm4gZ2VuX252YXJyYXkoYXJncywgMSk7CiB9CiAKIC8qIEdlbmVyaWMsIGludGVybmFsIHZlcnNpb24gb2Yge252LG52fWFycmF5OiBpbm9ybSBpbmRpY2F0ZXMgdGhlCkBAIC0xODYsNDQgKzE4Niw0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9udmFycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgaW5vcm0pCiB7Ci0JUHlPYmplY3QgKnYsICp3LCAqd25vcm0sICp3dmVjOwotCWludCBpLCBuOwotCWZsb2F0IG5vcm1bM10sIHZlY1szXTsKLQlQeU9iamVjdCAqICgqZ2V0aXRlbSkoUHlPYmplY3QgKiwgaW50KTsKLQkKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCAxLCAwLCAmdikpCi0JCXJldHVybiBOVUxMOwotCQotCWlmIChQeUxpc3RfQ2hlY2sodikpIHsKLQkJbiA9IFB5TGlzdF9TaXplKHYpOwotCQlnZXRpdGVtID0gUHlMaXN0X0dldEl0ZW07Ci0JfQotCWVsc2UgaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKLQkJbiA9IFB5VHVwbGVfU2l6ZSh2KTsKLQkJZ2V0aXRlbSA9IFB5VHVwbGVfR2V0SXRlbTsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXcgPSAoKmdldGl0ZW0pKHYsIGkpOwotCQlpZiAoIVB5VHVwbGVfQ2hlY2sodykgfHwgUHlUdXBsZV9TaXplKHcpICE9IDIpIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQl3bm9ybSA9IFB5VHVwbGVfR2V0SXRlbSh3LCBpbm9ybSk7Ci0JCXd2ZWMgPSBQeVR1cGxlX0dldEl0ZW0odywgMSAtIGlub3JtKTsKLQkJaWYgKCFQeUFyZ19HZXRGbG9hdEFycmF5KHdub3JtLCAxLCAwLCAzLCBub3JtKSB8fAotCQkJIVB5QXJnX0dldEZsb2F0QXJyYXkod3ZlYywgMSwgMCwgMywgdmVjKSkKLQkJCXJldHVybiBOVUxMOwotCQluM2Yobm9ybSk7Ci0JCXYzZih2ZWMpOwotCX0KLQkKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlPYmplY3QgKnYsICp3LCAqd25vcm0sICp3dmVjOworICAgIGludCBpLCBuOworICAgIGZsb2F0IG5vcm1bM10sIHZlY1szXTsKKyAgICBQeU9iamVjdCAqICgqZ2V0aXRlbSkoUHlPYmplY3QgKiwgaW50KTsKKworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDEsIDAsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIG4gPSBQeUxpc3RfU2l6ZSh2KTsKKyAgICAgICAgZ2V0aXRlbSA9IFB5TGlzdF9HZXRJdGVtOworICAgIH0KKyAgICBlbHNlIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgIG4gPSBQeVR1cGxlX1NpemUodik7CisgICAgICAgIGdldGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHcgPSAoKmdldGl0ZW0pKHYsIGkpOworICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2sodykgfHwgUHlUdXBsZV9TaXplKHcpICE9IDIpIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB3bm9ybSA9IFB5VHVwbGVfR2V0SXRlbSh3LCBpbm9ybSk7CisgICAgICAgIHd2ZWMgPSBQeVR1cGxlX0dldEl0ZW0odywgMSAtIGlub3JtKTsKKyAgICAgICAgaWYgKCFQeUFyZ19HZXRGbG9hdEFycmF5KHdub3JtLCAxLCAwLCAzLCBub3JtKSB8fAorICAgICAgICAgICAgIVB5QXJnX0dldEZsb2F0QXJyYXkod3ZlYywgMSwgMCwgMywgdmVjKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBuM2Yobm9ybSk7CisgICAgICAgIHYzZih2ZWMpOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogbnVyYnNzdXJmYWNlKHNfa25vdHNbXSwgdF9rbm90c1tdLCBjdGxbXVtdLCBzX29yZGVyLCB0X29yZGVyLCB0eXBlKS4KQEAgLTIzNSw4MyArMjM1LDgzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbnVyYnNzdXJmYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWRvdWJsZSAqIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JZG91YmxlICogYXJnNCA7Ci0JZG91YmxlICphcmc1IDsKLQlsb25nIGFyZzYgOwotCWxvbmcgYXJnNyA7Ci0JbG9uZyBhcmc4IDsKLQlsb25nIG5jb29yZHM7Ci0JbG9uZyBzX2J5dGVfc3RyaWRlLCB0X2J5dGVfc3RyaWRlOwotCWxvbmcgc19uY3RsLCB0X25jdGw7Ci0JbG9uZyBzLCB0OwotCVB5T2JqZWN0ICp2LCAqdywgKnB0OwotCWRvdWJsZSAqcG5leHQ7Ci0JaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIDYsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmcyID0gUHlNZW1fTkVXKGRvdWJsZSwgYXJnMSApKSA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KGFyZ3MsIDYsIDAsIGFyZzEgLCBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIDYsIDEsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmc0ID0gUHlNZW1fTkVXKGRvdWJsZSwgYXJnMyApKSA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KGFyZ3MsIDYsIDEsIGFyZzMgLCBhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDYsIDMsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDYsIDQsICZhcmc3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDYsIDUsICZhcmc4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFyZzggPT0gTl9YWVopCi0JCW5jb29yZHMgPSAzOwotCWVsc2UgaWYgKGFyZzggPT0gTl9YWVpXKQotCQluY29vcmRzID0gNDsKLQllbHNlIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNfbmN0bCA9IGFyZzEgLSBhcmc2OwotCXRfbmN0bCA9IGFyZzMgLSBhcmc3OwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDYsIDIsICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUxpc3RfQ2hlY2sodikgfHwgUHlMaXN0X1NpemUodikgIT0gc19uY3RsKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoKGFyZzUgPSBQeU1lbV9ORVcoZG91YmxlLCBzX25jdGwqdF9uY3RsKm5jb29yZHMgKSkgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JcG5leHQgPSBhcmc1OwotCWZvciAocyA9IDA7IHMgPCBzX25jdGw7IHMrKykgewotCQl3ID0gUHlMaXN0X0dldEl0ZW0odiwgcyk7Ci0JCWlmICh3ID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh3KSB8fAotCQkJCQlQeUxpc3RfU2l6ZSh3KSAhPSB0X25jdGwpIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmb3IgKHQgPSAwOyB0IDwgdF9uY3RsOyB0KyspIHsKLQkJCXB0ID0gUHlMaXN0X0dldEl0ZW0odywgdCk7Ci0JCQlpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KHB0LCAxLCAwLCBuY29vcmRzLCBwbmV4dCkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlwbmV4dCArPSBuY29vcmRzOwotCQl9Ci0JfQotCXNfYnl0ZV9zdHJpZGUgPSBzaXplb2YoZG91YmxlKSAqIG5jb29yZHM7Ci0JdF9ieXRlX3N0cmlkZSA9IHNfYnl0ZV9zdHJpZGUgKiBzX25jdGw7Ci0JbnVyYnNzdXJmYWNlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwKLQkJc19ieXRlX3N0cmlkZSAsIHRfYnl0ZV9zdHJpZGUgLCBhcmc1ICwgYXJnNiAsIGFyZzcgLCBhcmc4ICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5TWVtX0RFTChhcmc0KTsKLQlQeU1lbV9ERUwoYXJnNSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZG91YmxlICogYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBkb3VibGUgKiBhcmc0IDsKKyAgICBkb3VibGUgKmFyZzUgOworICAgIGxvbmcgYXJnNiA7CisgICAgbG9uZyBhcmc3IDsKKyAgICBsb25nIGFyZzggOworICAgIGxvbmcgbmNvb3JkczsKKyAgICBsb25nIHNfYnl0ZV9zdHJpZGUsIHRfYnl0ZV9zdHJpZGU7CisgICAgbG9uZyBzX25jdGwsIHRfbmN0bDsKKyAgICBsb25nIHMsIHQ7CisgICAgUHlPYmplY3QgKnYsICp3LCAqcHQ7CisgICAgZG91YmxlICpwbmV4dDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmdBcnJheVNpemUoYXJncywgNiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzIgPSBQeU1lbV9ORVcoZG91YmxlLCBhcmcxICkpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIGlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkoYXJncywgNiwgMCwgYXJnMSAsIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmdBcnJheVNpemUoYXJncywgNiwgMSwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzQgPSBQeU1lbV9ORVcoZG91YmxlLCBhcmczICkpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIGlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkoYXJncywgNiwgMSwgYXJnMyAsIGFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNiwgMywgJmFyZzYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNiwgNCwgJmFyZzcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNiwgNSwgJmFyZzgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYXJnOCA9PSBOX1hZWikKKyAgICAgICAgbmNvb3JkcyA9IDM7CisgICAgZWxzZSBpZiAoYXJnOCA9PSBOX1hZWlcpCisgICAgICAgIG5jb29yZHMgPSA0OworICAgIGVsc2UgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc19uY3RsID0gYXJnMSAtIGFyZzY7CisgICAgdF9uY3RsID0gYXJnMyAtIGFyZzc7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgNiwgMiwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayh2KSB8fCBQeUxpc3RfU2l6ZSh2KSAhPSBzX25jdGwpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgoYXJnNSA9IFB5TWVtX05FVyhkb3VibGUsIHNfbmN0bCp0X25jdGwqbmNvb3JkcyApKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBwbmV4dCA9IGFyZzU7CisgICAgZm9yIChzID0gMDsgcyA8IHNfbmN0bDsgcysrKSB7CisgICAgICAgIHcgPSBQeUxpc3RfR2V0SXRlbSh2LCBzKTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9TaXplKHcpICE9IHRfbmN0bCkgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZvciAodCA9IDA7IHQgPCB0X25jdGw7IHQrKykgeworICAgICAgICAgICAgcHQgPSBQeUxpc3RfR2V0SXRlbSh3LCB0KTsKKyAgICAgICAgICAgIGlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkocHQsIDEsIDAsIG5jb29yZHMsIHBuZXh0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHBuZXh0ICs9IG5jb29yZHM7CisgICAgICAgIH0KKyAgICB9CisgICAgc19ieXRlX3N0cmlkZSA9IHNpemVvZihkb3VibGUpICogbmNvb3JkczsKKyAgICB0X2J5dGVfc3RyaWRlID0gc19ieXRlX3N0cmlkZSAqIHNfbmN0bDsKKyAgICBudXJic3N1cmZhY2UoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLAorICAgICAgICBzX2J5dGVfc3RyaWRlICwgdF9ieXRlX3N0cmlkZSAsIGFyZzUgLCBhcmc2ICwgYXJnNyAsIGFyZzggKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlNZW1fREVMKGFyZzQpOworICAgIFB5TWVtX0RFTChhcmc1KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIG51cmJzY3VydmUoa25vdHMsIGN0bHBvaW50cywgb3JkZXIsIHR5cGUpLgpAQCAtMzIxLDU3ICszMjEsNTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9udXJic2N1cnZlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWRvdWJsZSAqIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JZG91YmxlICogYXJnNCA7Ci0JbG9uZyBhcmc1IDsKLQlsb25nIGFyZzYgOwotCWludCBuY29vcmRzLCBucG9pbnRzOwotCWludCBpOwotCVB5T2JqZWN0ICp2OwotCWRvdWJsZSAqcG5leHQ7Ci0JaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmcyID0gUHlNZW1fTkVXKGRvdWJsZSwgYXJnMSApKSA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KGFyZ3MsIDQsIDAsIGFyZzEgLCBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDIsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDMsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFyZzYgPT0gTl9TVCkKLQkJbmNvb3JkcyA9IDI7Ci0JZWxzZSBpZiAoYXJnNiA9PSBOX1NUVykKLQkJbmNvb3JkcyA9IDM7Ci0JZWxzZSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlucG9pbnRzID0gYXJnMSAtIGFyZzU7Ci0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgNCwgMSwgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5TGlzdF9DaGVjayh2KSB8fCBQeUxpc3RfU2l6ZSh2KSAhPSBucG9pbnRzKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoKGFyZzQgPSBQeU1lbV9ORVcoZG91YmxlLCBucG9pbnRzKm5jb29yZHMgKSkgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JcG5leHQgPSBhcmc0OwotCWZvciAoaSA9IDA7IGkgPCBucG9pbnRzOyBpKyspIHsKLQkJaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShQeUxpc3RfR2V0SXRlbSh2LCBpKSwgMSwgMCwgbmNvb3JkcywgcG5leHQpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBuZXh0ICs9IG5jb29yZHM7Ci0JfQotCWFyZzMgPSAoc2l6ZW9mKGRvdWJsZSkpICogbmNvb3JkczsKLQludXJic2N1cnZlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlNZW1fREVMKGFyZzQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGRvdWJsZSAqIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgZG91YmxlICogYXJnNCA7CisgICAgbG9uZyBhcmc1IDsKKyAgICBsb25nIGFyZzYgOworICAgIGludCBuY29vcmRzLCBucG9pbnRzOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICp2OworICAgIGRvdWJsZSAqcG5leHQ7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmcyID0gUHlNZW1fTkVXKGRvdWJsZSwgYXJnMSApKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KGFyZ3MsIDQsIDAsIGFyZzEgLCBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDIsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDMsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZzYgPT0gTl9TVCkKKyAgICAgICAgbmNvb3JkcyA9IDI7CisgICAgZWxzZSBpZiAoYXJnNiA9PSBOX1NUVykKKyAgICAgICAgbmNvb3JkcyA9IDM7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBucG9pbnRzID0gYXJnMSAtIGFyZzU7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgNCwgMSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayh2KSB8fCBQeUxpc3RfU2l6ZSh2KSAhPSBucG9pbnRzKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoKGFyZzQgPSBQeU1lbV9ORVcoZG91YmxlLCBucG9pbnRzKm5jb29yZHMgKSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgcG5leHQgPSBhcmc0OworICAgIGZvciAoaSA9IDA7IGkgPCBucG9pbnRzOyBpKyspIHsKKyAgICAgICAgaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShQeUxpc3RfR2V0SXRlbSh2LCBpKSwgMSwgMCwgbmNvb3JkcywgcG5leHQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHBuZXh0ICs9IG5jb29yZHM7CisgICAgfQorICAgIGFyZzMgPSAoc2l6ZW9mKGRvdWJsZSkpICogbmNvb3JkczsKKyAgICBudXJic2N1cnZlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlNZW1fREVMKGFyZzQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogcHdsY3VydmUocG9pbnRzLCB0eXBlKS4KQEAgLTM4MSwzOSArMzgxLDM5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcHdsY3VydmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2OwotCWxvbmcgdHlwZTsKLQlkb3VibGUgKmRhdGEsICpwbmV4dDsKLQlsb25nIG5wb2ludHMsIG5jb29yZHM7Ci0JaW50IGk7Ci0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgMiwgMCwgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldExvbmcoYXJncywgMiwgMSwgJnR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5TGlzdF9DaGVjayh2KSkgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbnBvaW50cyA9IFB5TGlzdF9TaXplKHYpOwotCWlmICh0eXBlID09IE5fU1QpCi0JCW5jb29yZHMgPSAyOwotCWVsc2UgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKChkYXRhID0gUHlNZW1fTkVXKGRvdWJsZSwgbnBvaW50cypuY29vcmRzKSkgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JcG5leHQgPSBkYXRhOwotCWZvciAoaSA9IDA7IGkgPCBucG9pbnRzOyBpKyspIHsKLQkJaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShQeUxpc3RfR2V0SXRlbSh2LCBpKSwgMSwgMCwgbmNvb3JkcywgcG5leHQpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBuZXh0ICs9IG5jb29yZHM7Ci0JfQotCXB3bGN1cnZlKG5wb2ludHMsIGRhdGEsIHNpemVvZihkb3VibGUpKm5jb29yZHMsIHR5cGUpOwotCVB5TWVtX0RFTChkYXRhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlPYmplY3QgKnY7CisgICAgbG9uZyB0eXBlOworICAgIGRvdWJsZSAqZGF0YSwgKnBuZXh0OworICAgIGxvbmcgbnBvaW50cywgbmNvb3JkczsKKyAgICBpbnQgaTsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCAyLCAwLCAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCAyLCAxLCAmdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBucG9pbnRzID0gUHlMaXN0X1NpemUodik7CisgICAgaWYgKHR5cGUgPT0gTl9TVCkKKyAgICAgICAgbmNvb3JkcyA9IDI7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoKGRhdGEgPSBQeU1lbV9ORVcoZG91YmxlLCBucG9pbnRzKm5jb29yZHMpKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBwbmV4dCA9IGRhdGE7CisgICAgZm9yIChpID0gMDsgaSA8IG5wb2ludHM7IGkrKykgeworICAgICAgICBpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KFB5TGlzdF9HZXRJdGVtKHYsIGkpLCAxLCAwLCBuY29vcmRzLCBwbmV4dCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcG5leHQgKz0gbmNvb3JkczsKKyAgICB9CisgICAgcHdsY3VydmUobnBvaW50cywgZGF0YSwgc2l6ZW9mKGRvdWJsZSkqbmNvb3JkcywgdHlwZSk7CisgICAgUHlNZW1fREVMKGRhdGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC00MjUsNTYgKzQyNSw1NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBpY2tfc2VsZWN0KFB5T2JqZWN0ICphcmdzLCB2b2lkICgqZnVuYykoKSkKIHsKLQlpZiAoIVB5QXJnX0dldExvbmcoYXJncywgMSwgMCwgJnBpY2tidWZmZXJzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBpY2tidWZmZXIgIT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJInBpY2svZ3NlbGVjdDogYWxyZWFkeSBwaWNraW5nL3NlbGVjdGluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKChwaWNrYnVmZmVyID0gUHlNZW1fTkVXKHNob3J0LCBwaWNrYnVmZmVyc2l6ZSkpID09IE5VTEwpIHsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCSgqZnVuYykocGlja2J1ZmZlciwgcGlja2J1ZmZlcnNpemUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgMSwgMCwgJnBpY2tidWZmZXJzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBpY2tidWZmZXIgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgInBpY2svZ3NlbGVjdDogYWxyZWFkeSBwaWNraW5nL3NlbGVjdGluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKChwaWNrYnVmZmVyID0gUHlNZW1fTkVXKHNob3J0LCBwaWNrYnVmZmVyc2l6ZSkpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgICgqZnVuYykocGlja2J1ZmZlciwgcGlja2J1ZmZlcnNpemUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGVuZHBpY2tfc2VsZWN0KGxvbmcgKCpmdW5jKSgpKQogewotCVB5T2JqZWN0ICp2LCAqdzsKLQlpbnQgaSwgbmhpdHMsIG47Ci0JaWYgKHBpY2tidWZmZXIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJImVuZHBpY2svZW5kc2VsZWN0OiBub3QgaW4gcGljay9zZWxlY3QgbW9kZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbmhpdHMgPSAoKmZ1bmMpKHBpY2tidWZmZXIpOwotCWlmIChuaGl0cyA8IDApIHsKLQkJbmhpdHMgPSAtbmhpdHM7IC8qIEhvdyB0byByZXBvcnQgYnVmZmVyIG92ZXJmbG93IG90aGVyd2lzZT8gKi8KLQl9Ci0JLyogU2NhbiB0aGUgYnVmZmVyIHRvIHNlZSBob3cgbWFueSBpbnRlZ2VycyAqLwotCW4gPSAwOwotCWZvciAoOyBuaGl0cyA+IDA7IG5oaXRzLS0pIHsKLQkJbiArPSAxICsgcGlja2J1ZmZlcltuXTsKLQl9Ci0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogWFhYIENvdWxkIGRvIGl0IG5pY2VyIGFuZCBpbnRlcnByZXQgdGhlIGRhdGEgc3RydWN0dXJlIGhlcmUsCi0JICAgcmV0dXJuaW5nIGEgbGlzdCBvZiBsaXN0cy4gQnV0IHRoaXMgY2FuIGJlIGRvbmUgaW4gUHl0aG9uLi4uICovCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQl3ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcGlja2J1ZmZlcltpXSk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKHYsIGksIHcpOwotCX0KLQlQeU1lbV9ERUwocGlja2J1ZmZlcik7Ci0JcGlja2J1ZmZlciA9IE5VTEw7Ci0JcmV0dXJuIHY7CisgICAgUHlPYmplY3QgKnYsICp3OworICAgIGludCBpLCBuaGl0cywgbjsKKyAgICBpZiAocGlja2J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAiZW5kcGljay9lbmRzZWxlY3Q6IG5vdCBpbiBwaWNrL3NlbGVjdCBtb2RlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBuaGl0cyA9ICgqZnVuYykocGlja2J1ZmZlcik7CisgICAgaWYgKG5oaXRzIDwgMCkgeworICAgICAgICBuaGl0cyA9IC1uaGl0czsgLyogSG93IHRvIHJlcG9ydCBidWZmZXIgb3ZlcmZsb3cgb3RoZXJ3aXNlPyAqLworICAgIH0KKyAgICAvKiBTY2FuIHRoZSBidWZmZXIgdG8gc2VlIGhvdyBtYW55IGludGVnZXJzICovCisgICAgbiA9IDA7CisgICAgZm9yICg7IG5oaXRzID4gMDsgbmhpdHMtLSkgeworICAgICAgICBuICs9IDEgKyBwaWNrYnVmZmVyW25dOworICAgIH0KKyAgICB2ID0gUHlMaXN0X05ldyhuKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFggQ291bGQgZG8gaXQgbmljZXIgYW5kIGludGVycHJldCB0aGUgZGF0YSBzdHJ1Y3R1cmUgaGVyZSwKKyAgICAgICByZXR1cm5pbmcgYSBsaXN0IG9mIGxpc3RzLiBCdXQgdGhpcyBjYW4gYmUgZG9uZSBpbiBQeXRob24uLi4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHcgPSBQeUludF9Gcm9tTG9uZygobG9uZylwaWNrYnVmZmVyW2ldKTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NldEl0ZW0odiwgaSwgdyk7CisgICAgfQorICAgIFB5TWVtX0RFTChwaWNrYnVmZmVyKTsKKyAgICBwaWNrYnVmZmVyID0gTlVMTDsKKyAgICByZXR1cm4gdjsKIH0KIAogZXh0ZXJuIHZvaWQgcGljaygpLCBnc2VsZWN0KCk7CkBAIC00ODIsMjIgKzQ4MiwyMiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKmdsX3BpY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBwaWNrX3NlbGVjdChhcmdzLCBwaWNrKTsKKyAgICByZXR1cm4gcGlja19zZWxlY3QoYXJncywgcGljayk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqZ2xfZW5kcGljayhQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gZW5kcGlja19zZWxlY3QoZW5kcGljayk7CisgICAgcmV0dXJuIGVuZHBpY2tfc2VsZWN0KGVuZHBpY2spOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKmdsX2dzZWxlY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBwaWNrX3NlbGVjdChhcmdzLCBnc2VsZWN0KTsKKyAgICByZXR1cm4gcGlja19zZWxlY3QoYXJncywgZ3NlbGVjdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqZ2xfZW5kc2VsZWN0KFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBlbmRwaWNrX3NlbGVjdChlbmRzZWxlY3QpOworICAgIHJldHVybiBlbmRwaWNrX3NlbGVjdChlbmRzZWxlY3QpOwogfQogCiAKQEAgLTUwOSwyMyArNTA5LDIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0bWF0cml4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlNYXRyaXggYXJnMTsKLQlQeU9iamVjdCAqdiwgKnc7Ci0JaW50IGksIGo7Ci0JZ2V0bWF0cml4KCBhcmcxICk7Ci0JdiA9IFB5TGlzdF9OZXcoMTYpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJdyA9IG1rbmV3ZmxvYXRvYmplY3QoYXJnMVtpXVtqXSk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKHYsIGkqNCtqLCB3KTsKLQl9Ci0JcmV0dXJuIHY7CisgICAgTWF0cml4IGFyZzE7CisgICAgUHlPYmplY3QgKnYsICp3OworICAgIGludCBpLCBqOworICAgIGdldG1hdHJpeCggYXJnMSApOworICAgIHYgPSBQeUxpc3RfTmV3KDE2KTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIHcgPSBta25ld2Zsb2F0b2JqZWN0KGFyZzFbaV1bal0pOworICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU2V0SXRlbSh2LCBpKjQraiwgdyk7CisgICAgfQorICAgIHJldHVybiB2OwogfQogCiAvKiBIZXJlJ3MgYW4gYWx0ZXJuYXRlIHZlcnNpb24gdGhhdCByZXR1cm5zIGEgNHg0IG1hdHJpeCBpbnN0ZWFkIG9mCkBAIC01MzYsMTM3ICs1MzYsMTM3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYWx0Z2V0bWF0cml4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlNYXRyaXggYXJnMTsKLQlQeU9iamVjdCAqdiwgKnc7Ci0JaW50IGksIGo7Ci0JZ2V0bWF0cml4KCBhcmcxICk7Ci0JdiA9IFB5TGlzdF9OZXcoNCk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQl3ID0gUHlMaXN0X05ldyg0KTsKLQkJaWYgKHcgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlMaXN0X1NldEl0ZW0odiwgaSwgdyk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewotCQkJdyA9IG1rbmV3ZmxvYXRvYmplY3QoYXJnMVtpXVtqXSk7Ci0JCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJUHlMaXN0X1NldEl0ZW0oUHlMaXN0X0dldEl0ZW0odiwgaSksIGosIHcpOwotCQl9Ci0JfQotCXJldHVybiB2OworICAgIE1hdHJpeCBhcmcxOworICAgIFB5T2JqZWN0ICp2LCAqdzsKKyAgICBpbnQgaSwgajsKKyAgICBnZXRtYXRyaXgoIGFyZzEgKTsKKyAgICB2ID0gUHlMaXN0X05ldyg0KTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHcgPSBQeUxpc3RfTmV3KDQpOworICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU2V0SXRlbSh2LCBpLCB3KTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICB3ID0gbWtuZXdmbG9hdG9iamVjdChhcmcxW2ldW2pdKTsKKyAgICAgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShQeUxpc3RfR2V0SXRlbSh2LCBpKSwgaiwgdyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHY7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xyZWN0d3JpdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IHgxIDsKLQlzaG9ydCB5MSA7Ci0Jc2hvcnQgeDIgOwotCXNob3J0IHkyIDsKLQlzdHJpbmcgcGFycmF5IDsKLQlQeU9iamVjdCAqczsKKyAgICBzaG9ydCB4MSA7CisgICAgc2hvcnQgeTEgOworICAgIHNob3J0IHgyIDsKKyAgICBzaG9ydCB5MiA7CisgICAgc3RyaW5nIHBhcnJheSA7CisgICAgUHlPYmplY3QgKnM7CiAjaWYgMAotCWludCBwaXhjb3VudDsKKyAgICBpbnQgcGl4Y291bnQ7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDUsIDAsICZ4MSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNSwgMSwgJnkxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA1LCAyLCAmeDIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDUsIDMsICZ5MikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0U3RyaW5nKGFyZ3MsIDUsIDQsICZwYXJyYXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCA1LCA0LCAmcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNSwgMCwgJngxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA1LCAxLCAmeTEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDUsIDIsICZ4MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNSwgMywgJnkyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRTdHJpbmcoYXJncywgNSwgNCwgJnBhcnJheSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDUsIDQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWYgMAogLyogRG9uJ3QgY2hlY2sgdGhpcywgaXQgYnJlYWtzIGV4cGVyaW1lbnRzIHdpdGggcGl4bW9kZShQTV9TSVpFLCAuLi4pICovCi0JcGl4Y291bnQgPSAobG9uZykoeDIrMS14MSkgKiAobG9uZykoeTIrMS15MSk7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayhzKSB8fCBQeVN0cmluZ19TaXplKHMpICE9IHBpeGNvdW50KnNpemVvZihsb25nKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgInN0cmluZyBhcmcgdG8gbHJlY3R3cml0ZSBoYXMgd3Jvbmcgc2l6ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcGl4Y291bnQgPSAobG9uZykoeDIrMS14MSkgKiAobG9uZykoeTIrMS15MSk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhzKSB8fCBQeVN0cmluZ19TaXplKHMpICE9IHBpeGNvdW50KnNpemVvZihsb25nKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJzdHJpbmcgYXJnIHRvIGxyZWN0d3JpdGUgaGFzIHdyb25nIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JbHJlY3R3cml0ZSggeDEgLCB5MSAsIHgyICwgeTIgLCAodW5zaWduZWQgbG9uZyAqKSBwYXJyYXkgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbHJlY3R3cml0ZSggeDEgLCB5MSAsIHgyICwgeTIgLCAodW5zaWduZWQgbG9uZyAqKSBwYXJyYXkgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xyZWN0cmVhZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgeDEgOwotCXNob3J0IHkxIDsKLQlzaG9ydCB4MiA7Ci0Jc2hvcnQgeTIgOwotCVB5T2JqZWN0ICpwYXJyYXk7Ci0JaW50IHBpeGNvdW50OwotCWlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNCwgMCwgJngxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA0LCAxLCAmeTEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDQsIDIsICZ4MikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNCwgMywgJnkyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGl4Y291bnQgPSAobG9uZykoeDIrMS14MSkgKiAobG9uZykoeTIrMS15MSk7Ci0JcGFycmF5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBwaXhjb3VudCpzaXplb2YobG9uZykpOwotCWlmIChwYXJyYXkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7IC8qIE5vIG1lbW9yeSAqLwotCWxyZWN0cmVhZCh4MSwgeTEsIHgyLCB5MiwgKHVuc2lnbmVkIGxvbmcgKikgUHlTdHJpbmdfQXNTdHJpbmcocGFycmF5KSk7Ci0JcmV0dXJuIHBhcnJheTsKKyAgICBzaG9ydCB4MSA7CisgICAgc2hvcnQgeTEgOworICAgIHNob3J0IHgyIDsKKyAgICBzaG9ydCB5MiA7CisgICAgUHlPYmplY3QgKnBhcnJheTsKKyAgICBpbnQgcGl4Y291bnQ7CisgICAgaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA0LCAwLCAmeDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDQsIDEsICZ5MSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNCwgMiwgJngyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA0LCAzLCAmeTIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwaXhjb3VudCA9IChsb25nKSh4MisxLXgxKSAqIChsb25nKSh5MisxLXkxKTsKKyAgICBwYXJyYXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHBpeGNvdW50KnNpemVvZihsb25nKSk7CisgICAgaWYgKHBhcnJheSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsgLyogTm8gbWVtb3J5ICovCisgICAgbHJlY3RyZWFkKHgxLCB5MSwgeDIsIHkyLCAodW5zaWduZWQgbG9uZyAqKSBQeVN0cmluZ19Bc1N0cmluZyhwYXJyYXkpKTsKKyAgICByZXR1cm4gcGFycmF5OwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yZWFkZGlzcGxheShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNob3J0IHgxLCB5MSwgeDIsIHkyOwotCXVuc2lnbmVkIGxvbmcgKnBhcnJheSwgaGludHM7Ci0JbG9uZyBzaXplLCBzaXplX3JldDsKLQlQeU9iamVjdCAqcnY7CisgICAgc2hvcnQgeDEsIHkxLCB4MiwgeTI7CisgICAgdW5zaWduZWQgbG9uZyAqcGFycmF5LCBoaW50czsKKyAgICBsb25nIHNpemUsIHNpemVfcmV0OworICAgIFB5T2JqZWN0ICpydjsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICJoaGhobCIsICZ4MSwgJnkxLCAmeDIsICZ5MiwgJmhpbnRzKSApCi0JICByZXR1cm4gMDsKLQlzaXplID0gKGxvbmcpKHgyKzEteDEpICogKGxvbmcpKHkyKzEteTEpOwotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBzaXplKnNpemVvZihsb25nKSk7Ci0JaWYgKCBydiA9PSBOVUxMICkKLQkgIHJldHVybiBOVUxMOwotCXBhcnJheSA9ICh1bnNpZ25lZCBsb25nICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotCXNpemVfcmV0ID0gcmVhZGRpc3BsYXkoeDEsIHkxLCB4MiwgeTIsIHBhcnJheSwgaGludHMpOwotCWlmICggc2l6ZV9yZXQgIT0gc2l6ZSApIHsKLQkgICAgcHJpbnRmKCJnbF9yZWFkZGlzcGxheTogZ290ICVsZCBwaXhlbHMsIGV4cGVjdGVkICVsZFxuIiwKLQkJICAgc2l6ZV9yZXQsIHNpemUpOwotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicmVhZGRpc3BsYXkgcmV0dXJuZWQgdW5leHBlY3RlZCBsZW5ndGgiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBydjsKKyAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiaGhoaGwiLCAmeDEsICZ5MSwgJngyLCAmeTIsICZoaW50cykgKQorICAgICAgcmV0dXJuIDA7CisgICAgc2l6ZSA9IChsb25nKSh4MisxLXgxKSAqIChsb25nKSh5MisxLXkxKTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgc2l6ZSpzaXplb2YobG9uZykpOworICAgIGlmICggcnYgPT0gTlVMTCApCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBwYXJyYXkgPSAodW5zaWduZWQgbG9uZyAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBzaXplX3JldCA9IHJlYWRkaXNwbGF5KHgxLCB5MSwgeDIsIHkyLCBwYXJyYXksIGhpbnRzKTsKKyAgICBpZiAoIHNpemVfcmV0ICE9IHNpemUgKSB7CisgICAgICAgIHByaW50ZigiZ2xfcmVhZGRpc3BsYXk6IGdvdCAlbGQgcGl4ZWxzLCBleHBlY3RlZCAlbGRcbiIsCisgICAgICAgICAgIHNpemVfcmV0LCBzaXplKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInJlYWRkaXNwbGF5IHJldHVybmVkIHVuZXhwZWN0ZWQgbGVuZ3RoIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIC8qIERlc3BlcmF0ZWx5IG5lZWRlZCwgaGVyZSBhcmUgdG9vbHMgdG8gY29tcHJlc3MgYW5kIGRlY29tcHJlc3MKICAgIHRoZSBkYXRhIG1hbmlwdWxhdGVkIGJ5IGxyZWN0cmVhZC9scmVjdHdyaXRlLgogCiAgICBnbC5wYWNrcmVjdCh3aWR0aCwgaGVpZ2h0LCBwYWNrZmFjdG9yLCBiaWdkYXRhKSAtLT4gc21hbGxkYXRhCi0JCW1ha2VzICdiaWdkYXRhJyA0KihwYWNrZmFjdG9yKioyKSB0aW1lcyBzbWFsbGVyIGJ5OgotCQktIHR1cm5pbmcgaXQgaW50byBCL1cgKGEgZmFjdG9yIDQpCi0JCS0gcmVwbGFjaW5nIHNxdWFyZXMgb2Ygc2l6ZSBwYWNmYWN0b3IgYnkgb25lCi0JCSAgcmVwcmVzZW50YXRpdmUKKyAgICAgICAgICAgICAgICBtYWtlcyAnYmlnZGF0YScgNCoocGFja2ZhY3RvcioqMikgdGltZXMgc21hbGxlciBieToKKyAgICAgICAgLSB0dXJuaW5nIGl0IGludG8gQi9XIChhIGZhY3RvciA0KQorICAgICAgICAtIHJlcGxhY2luZyBzcXVhcmVzIG9mIHNpemUgcGFjZmFjdG9yIGJ5IG9uZQorICAgICAgICAgIHJlcHJlc2VudGF0aXZlCiAKICAgIGdsLnVucGFja3JlY3Qod2lkdGgsIGhlaWdodCwgcGFja2ZhY3Rvciwgc21hbGxkYXRhKSAtLT4gYmlnZGF0YQotCQlpcyB0aGUgaW52ZXJzZTsgdGhlIG51bWVyaWMgYXJndW1lbnRzIG11c3QgYmUgKnRoZSBzYW1lKi4KKyAgICAgICAgICAgICAgICBpcyB0aGUgaW52ZXJzZTsgdGhlIG51bWVyaWMgYXJndW1lbnRzIG11c3QgYmUgKnRoZSBzYW1lKi4KIAogICAgQm90aCB3b3JrIGJlc3QgaWYgd2lkdGggYW5kIGhlaWdodCBhcmUgbXVsdGlwbGVzIG9mIHBhY2tmYWN0b3IKICAgIChpbiBmYWN0IHVucGFja3JlY3Qgd2lsbCBsZWF2ZSBnYXJiYWdlIGJ5dGVzKS4KQEAgLTY3Niw1MCArNjc2LDUwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGFja3JlY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgd2lkdGgsIGhlaWdodCwgcGFja2ZhY3RvcjsKLQljaGFyICpzOwotCVB5T2JqZWN0ICp1bnBhY2tlZCwgKnBhY2tlZDsKLQlpbnQgcGl4Y291bnQsIHBhY2tlZGNvdW50LCB4LCB5LCByLCBnLCBiOwotCXVuc2lnbmVkIGxvbmcgcGl4ZWw7Ci0JdW5zaWduZWQgY2hhciAqcDsKLQl1bnNpZ25lZCBsb25nICpwYXJyYXk7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDAsICZ3aWR0aCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAxLCAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDIsICZwYWNrZmFjdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRTdHJpbmcoYXJncywgNCwgMywgJnMpKSAvKiBGb3IgdHlwZSBjaGVja2luZyBvbmx5ICovCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDQsIDMsICZ1bnBhY2tlZCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8IHBhY2tmYWN0b3IgPD0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicGFja3JlY3QgYXJncyBtdXN0IGJlID4gMCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGl4Y291bnQgPSB3aWR0aCpoZWlnaHQ7Ci0JcGFja2VkY291bnQgPSAoKHdpZHRoK3BhY2tmYWN0b3ItMSkvcGFja2ZhY3RvcikgKgotCQkoKGhlaWdodCtwYWNrZmFjdG9yLTEpL3BhY2tmYWN0b3IpOwotCWlmIChQeVN0cmluZ19TaXplKHVucGFja2VkKSAhPSBwaXhjb3VudCpzaXplb2YobG9uZykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJzdHJpbmcgYXJnIHRvIHBhY2tyZWN0IGhhcyB3cm9uZyBzaXplIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlwYWNrZWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHBhY2tlZGNvdW50KTsKLQlpZiAocGFja2VkID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXBhcnJheSA9ICh1bnNpZ25lZCBsb25nICopIFB5U3RyaW5nX0FzU3RyaW5nKHVucGFja2VkKTsKLQlwID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQXNTdHJpbmcocGFja2VkKTsKLQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IHBhY2tmYWN0b3IsIHBhcnJheSArPSBwYWNrZmFjdG9yKndpZHRoKSB7Ci0JCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCArPSBwYWNrZmFjdG9yKSB7Ci0JCQlwaXhlbCA9IHBhcnJheVt4XTsKLQkJCXIgPSBwaXhlbCAmIDB4ZmY7Ci0JCQlnID0gKHBpeGVsID4+IDgpICYgMHhmZjsKLQkJCWIgPSAocGl4ZWwgPj4gMTYpICYgMHhmZjsKLQkJCSpwKysgPSAoMzAqcis1OSpnKzExKmIpIC8gMTAwOwotCQl9Ci0JfQotCXJldHVybiBwYWNrZWQ7CisgICAgbG9uZyB3aWR0aCwgaGVpZ2h0LCBwYWNrZmFjdG9yOworICAgIGNoYXIgKnM7CisgICAgUHlPYmplY3QgKnVucGFja2VkLCAqcGFja2VkOworICAgIGludCBwaXhjb3VudCwgcGFja2VkY291bnQsIHgsIHksIHIsIGcsIGI7CisgICAgdW5zaWduZWQgbG9uZyBwaXhlbDsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIHVuc2lnbmVkIGxvbmcgKnBhcnJheTsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNCwgMCwgJndpZHRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDEsICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNCwgMiwgJnBhY2tmYWN0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldFN0cmluZyhhcmdzLCA0LCAzLCAmcykpIC8qIEZvciB0eXBlIGNoZWNraW5nIG9ubHkgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgNCwgMywgJnVucGFja2VkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgcGFja2ZhY3RvciA8PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJwYWNrcmVjdCBhcmdzIG11c3QgYmUgPiAwIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwaXhjb3VudCA9IHdpZHRoKmhlaWdodDsKKyAgICBwYWNrZWRjb3VudCA9ICgod2lkdGgrcGFja2ZhY3Rvci0xKS9wYWNrZmFjdG9yKSAqCisgICAgICAgICgoaGVpZ2h0K3BhY2tmYWN0b3ItMSkvcGFja2ZhY3Rvcik7CisgICAgaWYgKFB5U3RyaW5nX1NpemUodW5wYWNrZWQpICE9IHBpeGNvdW50KnNpemVvZihsb25nKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJzdHJpbmcgYXJnIHRvIHBhY2tyZWN0IGhhcyB3cm9uZyBzaXplIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwYWNrZWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHBhY2tlZGNvdW50KTsKKyAgICBpZiAocGFja2VkID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhcnJheSA9ICh1bnNpZ25lZCBsb25nICopIFB5U3RyaW5nX0FzU3RyaW5nKHVucGFja2VkKTsKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQXNTdHJpbmcocGFja2VkKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IHBhY2tmYWN0b3IsIHBhcnJheSArPSBwYWNrZmFjdG9yKndpZHRoKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCArPSBwYWNrZmFjdG9yKSB7CisgICAgICAgICAgICBwaXhlbCA9IHBhcnJheVt4XTsKKyAgICAgICAgICAgIHIgPSBwaXhlbCAmIDB4ZmY7CisgICAgICAgICAgICBnID0gKHBpeGVsID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIGIgPSAocGl4ZWwgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgICpwKysgPSAoMzAqcis1OSpnKzExKmIpIC8gMTAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYWNrZWQ7CiB9CiAKIApAQCAtNzI5LDc3ICs3MjksNzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF91bnBhY2tyZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHdpZHRoLCBoZWlnaHQsIHBhY2tmYWN0b3I7Ci0JY2hhciAqczsKLQlQeU9iamVjdCAqdW5wYWNrZWQsICpwYWNrZWQ7Ci0JaW50IHBpeGNvdW50LCBwYWNrZWRjb3VudDsKLQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKnBhcnJheTsKLQlpZiAoIXVucGFja3RhYl9pbml0ZWQpIHsKLQkJcmVnaXN0ZXIgaW50IHdoaXRlOwotCQlmb3IgKHdoaXRlID0gMjU2OyAtLXdoaXRlID49IDA7ICkKLQkJCXVucGFja3RhYlt3aGl0ZV0gPSB3aGl0ZSAqIDB4MDEwMTAxTDsKLQkJdW5wYWNrdGFiX2luaXRlZCsrOwotCX0KLQlpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNCwgMCwgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDEsICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNCwgMiwgJnBhY2tmYWN0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldFN0cmluZyhhcmdzLCA0LCAzLCAmcykpIC8qIEZvciB0eXBlIGNoZWNraW5nIG9ubHkgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgNCwgMywgJnBhY2tlZCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8IHBhY2tmYWN0b3IgPD0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicGFja3JlY3QgYXJncyBtdXN0IGJlID4gMCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGl4Y291bnQgPSB3aWR0aCpoZWlnaHQ7Ci0JcGFja2VkY291bnQgPSAoKHdpZHRoK3BhY2tmYWN0b3ItMSkvcGFja2ZhY3RvcikgKgotCQkoKGhlaWdodCtwYWNrZmFjdG9yLTEpL3BhY2tmYWN0b3IpOwotCWlmIChQeVN0cmluZ19TaXplKHBhY2tlZCkgIT0gcGFja2VkY291bnQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJzdHJpbmcgYXJnIHRvIHVucGFja3JlY3QgaGFzIHdyb25nIHNpemUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXVucGFja2VkID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBwaXhjb3VudCpzaXplb2YobG9uZykpOwotCWlmICh1bnBhY2tlZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwYXJyYXkgPSAodW5zaWduZWQgbG9uZyAqKSBQeVN0cmluZ19Bc1N0cmluZyh1bnBhY2tlZCk7Ci0JcCA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FzU3RyaW5nKHBhY2tlZCk7Ci0JaWYgKHBhY2tmYWN0b3IgPT0gMSAmJiB3aWR0aCpoZWlnaHQgPiAwKSB7Ci0JCS8qIEp1c3QgZXhwYW5kIGJ5dGVzIHRvIGxvbmdzICovCi0JCXJlZ2lzdGVyIGludCB4ID0gd2lkdGggKiBoZWlnaHQ7Ci0JCWRvIHsKLQkJCSpwYXJyYXkrKyA9IHVucGFja3RhYlsqcCsrXTsKLQkJfSB3aGlsZSAoLS14ID49IDApOwotCX0KLQllbHNlIHsKLQkJcmVnaXN0ZXIgaW50IHk7Ci0JCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQtcGFja2ZhY3RvcisxOwotCQkgICAgIHkgKz0gcGFja2ZhY3RvciwgcGFycmF5ICs9IHBhY2tmYWN0b3Iqd2lkdGgpIHsKLQkJCXJlZ2lzdGVyIGludCB4OwotCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoLXBhY2tmYWN0b3IrMTsgeCArPSBwYWNrZmFjdG9yKSB7Ci0JCQkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBwaXhlbCA9IHVucGFja3RhYlsqcCsrXTsKLQkJCQlyZWdpc3RlciBpbnQgaTsKLQkJCQlmb3IgKGkgPSBwYWNrZmFjdG9yKndpZHRoOyAoaS09d2lkdGgpID49IDA7KSB7Ci0JCQkJCXJlZ2lzdGVyIGludCBqOwotCQkJCQlmb3IgKGogPSBwYWNrZmFjdG9yOyAtLWogPj0gMDsgKQotCQkJCQkJcGFycmF5W2kreCtqXSA9IHBpeGVsOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gdW5wYWNrZWQ7CisgICAgbG9uZyB3aWR0aCwgaGVpZ2h0LCBwYWNrZmFjdG9yOworICAgIGNoYXIgKnM7CisgICAgUHlPYmplY3QgKnVucGFja2VkLCAqcGFja2VkOworICAgIGludCBwaXhjb3VudCwgcGFja2VkY291bnQ7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nICpwYXJyYXk7CisgICAgaWYgKCF1bnBhY2t0YWJfaW5pdGVkKSB7CisgICAgICAgIHJlZ2lzdGVyIGludCB3aGl0ZTsKKyAgICAgICAgZm9yICh3aGl0ZSA9IDI1NjsgLS13aGl0ZSA+PSAwOyApCisgICAgICAgICAgICB1bnBhY2t0YWJbd2hpdGVdID0gd2hpdGUgKiAweDAxMDEwMUw7CisgICAgICAgIHVucGFja3RhYl9pbml0ZWQrKzsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDAsICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAxLCAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDIsICZwYWNrZmFjdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRTdHJpbmcoYXJncywgNCwgMywgJnMpKSAvKiBGb3IgdHlwZSBjaGVja2luZyBvbmx5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDQsIDMsICZwYWNrZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCB8fCBwYWNrZmFjdG9yIDw9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInBhY2tyZWN0IGFyZ3MgbXVzdCBiZSA+IDAiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBpeGNvdW50ID0gd2lkdGgqaGVpZ2h0OworICAgIHBhY2tlZGNvdW50ID0gKCh3aWR0aCtwYWNrZmFjdG9yLTEpL3BhY2tmYWN0b3IpICoKKyAgICAgICAgKChoZWlnaHQrcGFja2ZhY3Rvci0xKS9wYWNrZmFjdG9yKTsKKyAgICBpZiAoUHlTdHJpbmdfU2l6ZShwYWNrZWQpICE9IHBhY2tlZGNvdW50KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgInN0cmluZyBhcmcgdG8gdW5wYWNrcmVjdCBoYXMgd3Jvbmcgc2l6ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdW5wYWNrZWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHBpeGNvdW50KnNpemVvZihsb25nKSk7CisgICAgaWYgKHVucGFja2VkID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhcnJheSA9ICh1bnNpZ25lZCBsb25nICopIFB5U3RyaW5nX0FzU3RyaW5nKHVucGFja2VkKTsKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQXNTdHJpbmcocGFja2VkKTsKKyAgICBpZiAocGFja2ZhY3RvciA9PSAxICYmIHdpZHRoKmhlaWdodCA+IDApIHsKKyAgICAgICAgLyogSnVzdCBleHBhbmQgYnl0ZXMgdG8gbG9uZ3MgKi8KKyAgICAgICAgcmVnaXN0ZXIgaW50IHggPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgKnBhcnJheSsrID0gdW5wYWNrdGFiWypwKytdOworICAgICAgICB9IHdoaWxlICgtLXggPj0gMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZWdpc3RlciBpbnQgeTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodC1wYWNrZmFjdG9yKzE7CisgICAgICAgICAgICAgeSArPSBwYWNrZmFjdG9yLCBwYXJyYXkgKz0gcGFja2ZhY3Rvcip3aWR0aCkgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IHg7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGgtcGFja2ZhY3RvcisxOyB4ICs9IHBhY2tmYWN0b3IpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHBpeGVsID0gdW5wYWNrdGFiWypwKytdOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IHBhY2tmYWN0b3Iqd2lkdGg7IChpLT13aWR0aCkgPj0gMDspIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgaW50IGo7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IHBhY2tmYWN0b3I7IC0taiA+PSAwOyApCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJyYXlbaSt4K2pdID0gcGl4ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB1bnBhY2tlZDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2d2ZXJzaW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyIGJ1ZlsyMF07Ci0JZ3ZlcnNpb24oYnVmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzIwXTsKKyAgICBndmVyc2lvbihidWYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIApAQCAtODA3LDkgKzgwNyw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2xlYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCV9fR0xjbGVhciggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgX19HTGNsZWFyKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogRW5kIG9mIG1hbnVhbGx5IHdyaXR0ZW4gc3R1YnMgKi8KQEAgLTgyMCw5ICs4MjAsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHNoYWRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRzaGFkZSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0c2hhZGUoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiB2b2lkIGRldnBvcnQgc2hvcnQgcyBsb25nIHMgKi8KQEAgLTgzMCwxNSArODMwLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGV2cG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlkZXZwb3J0KCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRldnBvcnQoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJkcjJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTg0NiwxNSArODQ2LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmRyMmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJkcjJpKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZHIyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmVjdGZzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTg2MiwyMSArODYyLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVjdGZzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXJlY3RmcyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlY3RmcyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZWN0cyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC04ODQsMjEgKzg4NCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JlY3RzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXJlY3RzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVjdHMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcm12MmkgbG9uZyBzIGxvbmcgcyAqLwpAQCAtOTA2LDE1ICs5MDYsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ybXYyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jcm12MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJtdjJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBub3BvcnQgKi8KQEAgLTkyMiw5ICs5MjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX25vcG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jbm9wb3J0KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBub3BvcnQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvcHZpZXdwb3J0ICovCkBAIC05MzIsOSArOTMyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb3B2aWV3cG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcG9wdmlld3BvcnQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHBvcHZpZXdwb3J0KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjbGVhcmhpdGNvZGUgKi8KQEAgLTk0Miw5ICs5NDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NsZWFyaGl0Y29kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2xlYXJoaXRjb2RlKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjbGVhcmhpdGNvZGUoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNsb3Nlb2JqICovCkBAIC05NTIsOSArOTUyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbG9zZW9iaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2xvc2VvYmooICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNsb3Nlb2JqKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjdXJzb2ZmICovCkBAIC05NjIsOSArOTYyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jdXJzb2ZmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljdXJzb2ZmKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjdXJzb2ZmKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjdXJzb24gKi8KQEAgLTk3Miw5ICs5NzIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2N1cnNvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY3Vyc29uKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjdXJzb24oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRvdWJsZWJ1ZmZlciAqLwpAQCAtOTgyLDkgKzk4Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZG91YmxlYnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGVidWZmZXIoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGRvdWJsZWJ1ZmZlciggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZmluaXNoICovCkBAIC05OTIsOSArOTkyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9maW5pc2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZpbmlzaCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmluaXNoKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBnY29uZmlnICovCkBAIC0xMDAyLDkgKzEwMDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2djb25maWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWdjb25maWcoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGdjb25maWcoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdpbml0ICovCkBAIC0xMDEyLDkgKzEwMTIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dpbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlnaW5pdCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZ2luaXQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdyZXNldCAqLwpAQCAtMTAyMiw5ICsxMDIyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ncmVzZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWdyZXNldCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZ3Jlc2V0KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtdWx0aW1hcCAqLwpAQCAtMTAzMiw5ICsxMDMyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tdWx0aW1hcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbXVsdGltYXAoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIG11bHRpbWFwKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBvbmVtYXAgKi8KQEAgLTEwNDIsOSArMTA0Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfb25lbWFwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlvbmVtYXAoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIG9uZW1hcCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9wYXR0cmlidXRlcyAqLwpAQCAtMTA1Miw5ICsxMDUyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb3BhdHRyaWJ1dGVzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlwb3BhdHRyaWJ1dGVzKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBwb3BhdHRyaWJ1dGVzKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb3BtYXRyaXggKi8KQEAgLTEwNjIsOSArMTA2Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9wbWF0cml4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlwb3BtYXRyaXgoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHBvcG1hdHJpeCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcHVzaGF0dHJpYnV0ZXMgKi8KQEAgLTEwNzIsOSArMTA3Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcHVzaGF0dHJpYnV0ZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXB1c2hhdHRyaWJ1dGVzKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBwdXNoYXR0cmlidXRlcyggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcHVzaG1hdHJpeCAqLwpAQCAtMTA4Miw5ICsxMDgyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wdXNobWF0cml4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlwdXNobWF0cml4KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBwdXNobWF0cml4KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwdXNodmlld3BvcnQgKi8KQEAgLTEwOTIsOSArMTA5Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcHVzaHZpZXdwb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlwdXNodmlld3BvcnQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHB1c2h2aWV3cG9ydCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcXJlc2V0ICovCkBAIC0xMTAyLDkgKzExMDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3FyZXNldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcXJlc2V0KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBxcmVzZXQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIFJHQm1vZGUgKi8KQEAgLTExMTIsOSArMTExMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfUkdCbW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUkdCbW9kZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUkdCbW9kZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2luZ2xlYnVmZmVyICovCkBAIC0xMTIyLDkgKzExMjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NpbmdsZWJ1ZmZlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2luZ2xlYnVmZmVyKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaW5nbGVidWZmZXIoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHN3YXBidWZmZXJzICovCkBAIC0xMTMyLDkgKzExMzIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3N3YXBidWZmZXJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzd2FwYnVmZmVycyggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc3dhcGJ1ZmZlcnMoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdzeW5jICovCkBAIC0xMTQyLDkgKzExNDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dzeW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlnc3luYyggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZ3N5bmMoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdmbHVzaCAqLwpAQCAtMTE1Miw5ICsxMTUyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZmx1c2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWdmbHVzaCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZ2ZsdXNoKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB0cG9uICovCkBAIC0xMTYyLDkgKzExNjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Rwb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXRwb24oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHRwb24oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHRwb2ZmICovCkBAIC0xMTcyLDkgKzExNzIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Rwb2ZmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl0cG9mZiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgdHBvZmYoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNsa29uICovCkBAIC0xMTgyLDkgKzExODIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Nsa29uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljbGtvbiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2xrb24oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNsa29mZiAqLwpAQCAtMTE5Miw5ICsxMTkyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbGtvZmYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNsa29mZiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2xrb2ZmKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByaW5nYmVsbCAqLwpAQCAtMTIwMiw5ICsxMjAyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yaW5nYmVsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmluZ2JlbGwoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHJpbmdiZWxsKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBnYmVnaW4gKi8KQEAgLTEyMTIsOSArMTIxMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2JlZ2luKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlnYmVnaW4oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGdiZWdpbiggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdGV4dGluaXQgKi8KQEAgLTEyMjIsOSArMTIyMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdGV4dGluaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXRleHRpbml0KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICB0ZXh0aW5pdCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgaW5pdG5hbWVzICovCkBAIC0xMjMyLDkgKzEyMzIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2luaXRuYW1lcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW5pdG5hbWVzKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbml0bmFtZXMoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBjbG9zICovCkBAIC0xMjQyLDkgKzEyNDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BjbG9zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlwY2xvcyggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcGNsb3MoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvcG5hbWUgKi8KQEAgLTEyNTIsOSArMTI1Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9wbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcG9wbmFtZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcG9wbmFtZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3BjbG9zICovCkBAIC0xMjYyLDkgKzEyNjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NwY2xvcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3BjbG9zKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzcGNsb3MoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHpjbGVhciAqLwpAQCAtMTI3Miw5ICsxMjcyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF96Y2xlYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXpjbGVhciggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgemNsZWFyKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzY3JlZW5zcGFjZSAqLwpAQCAtMTI4Miw5ICsxMjgyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zY3JlZW5zcGFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2NyZWVuc3BhY2UoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNjcmVlbnNwYWNlKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZXNoYXBldmlld3BvcnQgKi8KQEAgLTEyOTIsOSArMTI5Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVzaGFwZXZpZXdwb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXNoYXBldmlld3BvcnQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHJlc2hhcGV2aWV3cG9ydCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgd2lucHVzaCAqLwpAQCAtMTMwMiw5ICsxMzAyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93aW5wdXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl3aW5wdXNoKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICB3aW5wdXNoKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB3aW5wb3AgKi8KQEAgLTEzMTIsOSArMTMxMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2lucG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl3aW5wb3AoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHdpbnBvcCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZm9yZWdyb3VuZCAqLwpAQCAtMTMyMiw5ICsxMzIyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9mb3JlZ3JvdW5kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmb3JlZ3JvdW5kKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmb3JlZ3JvdW5kKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlbmRmdWxsc2NybiAqLwpAQCAtMTMzMiw5ICsxMzMyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9lbmRmdWxsc2NybihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZW5kZnVsbHNjcm4oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuZGZ1bGxzY3JuKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlbmRwdXBtb2RlICovCkBAIC0xMzQyLDkgKzEzNDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2VuZHB1cG1vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWVuZHB1cG1vZGUoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuZHB1cG1vZGUoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZ1bGxzY3JuICovCkBAIC0xMzUyLDkgKzEzNTIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Z1bGxzY3JuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmdWxsc2NybiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZnVsbHNjcm4oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHB1cG1vZGUgKi8KQEAgLTEzNjIsOSArMTM2Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcHVwbW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcHVwbW9kZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcHVwbW9kZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgd2luY29uc3RyYWludHMgKi8KQEAgLTEzNzIsOSArMTM3Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luY29uc3RyYWludHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXdpbmNvbnN0cmFpbnRzKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICB3aW5jb25zdHJhaW50cyggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGFnZWNvbG9yIHNob3J0IHMgKi8KQEAgLTEzODIsMTIgKzEzODIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wYWdlY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGFnZWNvbG9yKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGFnZWNvbG9yKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHRleHRjb2xvciBzaG9ydCBzICovCkBAIC0xMzk1LDEyICsxMzk1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdGV4dGNvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXRleHRjb2xvciggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHRleHRjb2xvciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjb2xvciBzaG9ydCBzICovCkBAIC0xNDA4LDEyICsxNDA4LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY29sb3IoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjb2xvciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjdXJ2ZWl0IHNob3J0IHMgKi8KQEAgLTE0MjEsMTIgKzE0MjEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jdXJ2ZWl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWN1cnZlaXQoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjdXJ2ZWl0KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZvbnQgc2hvcnQgcyAqLwpAQCAtMTQzNCwxMiArMTQzNCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2ZvbnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9udCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvbnQoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbGluZXdpZHRoIHNob3J0IHMgKi8KQEAgLTE0NDcsMTIgKzE0NDcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9saW5ld2lkdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbGluZXdpZHRoKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGluZXdpZHRoKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldGxpbmVzdHlsZSBzaG9ydCBzICovCkBAIC0xNDYwLDEyICsxNDYwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0bGluZXN0eWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXNldGxpbmVzdHlsZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldGxpbmVzdHlsZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXRtYXAgc2hvcnQgcyAqLwpAQCAtMTQ3MywxMiArMTQ3MywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NldG1hcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRtYXAoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRtYXAoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3dhcGludGVydmFsIHNob3J0IHMgKi8KQEAgLTE0ODYsMTIgKzE0ODYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zd2FwaW50ZXJ2YWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3dhcGludGVydmFsKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3dhcGludGVydmFsKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHdyaXRlbWFzayBzaG9ydCBzICovCkBAIC0xNDk5LDEyICsxNDk5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd3JpdGVtYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXdyaXRlbWFzayggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdyaXRlbWFzayggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB0ZXh0d3JpdGVtYXNrIHNob3J0IHMgKi8KQEAgLTE1MTIsMTIgKzE1MTIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF90ZXh0d3JpdGVtYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXRleHR3cml0ZW1hc2soIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0d3JpdGVtYXNrKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHFkZXZpY2Ugc2hvcnQgcyAqLwpAQCAtMTUyNSwxMiArMTUyNSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3FkZXZpY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcWRldmljZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHFkZXZpY2UoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdW5xZGV2aWNlIHNob3J0IHMgKi8KQEAgLTE1MzgsMTIgKzE1MzgsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF91bnFkZXZpY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdW5xZGV2aWNlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdW5xZGV2aWNlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGN1cnZlYmFzaXMgc2hvcnQgcyAqLwpAQCAtMTU1MSwxMiArMTU1MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2N1cnZlYmFzaXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3VydmViYXNpcyggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGN1cnZlYmFzaXMoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY3VydmVwcmVjaXNpb24gc2hvcnQgcyAqLwpAQCAtMTU2NCwxMiArMTU2NCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2N1cnZlcHJlY2lzaW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWN1cnZlcHJlY2lzaW9uKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3VydmVwcmVjaXNpb24oIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbG9hZG5hbWUgc2hvcnQgcyAqLwpAQCAtMTU3NywxMiArMTU3NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xvYWRuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxvYWRuYW1lKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbG9hZG5hbWUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGFzc3Rocm91Z2ggc2hvcnQgcyAqLwpAQCAtMTU5MCwxMiArMTU5MCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Bhc3N0aHJvdWdoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXBhc3N0aHJvdWdoKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGFzc3Rocm91Z2goIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcHVzaG5hbWUgc2hvcnQgcyAqLwpAQCAtMTYwMywxMiArMTYwMywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3B1c2huYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXB1c2huYW1lKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHVzaG5hbWUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2V0bW9uaXRvciBzaG9ydCBzICovCkBAIC0xNjE2LDEyICsxNjE2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0bW9uaXRvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRtb25pdG9yKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0bW9uaXRvciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXRzaGFkZSBzaG9ydCBzICovCkBAIC0xNjI5LDEyICsxNjI5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0c2hhZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0c2hhZGUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRzaGFkZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXRwYXR0ZXJuIHNob3J0IHMgKi8KQEAgLTE2NDIsMTIgKzE2NDIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zZXRwYXR0ZXJuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXNldHBhdHRlcm4oIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRwYXR0ZXJuKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBhZ2V3cml0ZW1hc2sgc2hvcnQgcyAqLwpAQCAtMTY1NSwxMiArMTY1NSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BhZ2V3cml0ZW1hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGFnZXdyaXRlbWFzayggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhZ2V3cml0ZW1hc2soIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY2FsbG9iaiBsb25nIHMgKi8KQEAgLTE2NjgsMTIgKzE2NjgsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jYWxsb2JqKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljYWxsb2JqKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhbGxvYmooIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZGVsb2JqIGxvbmcgcyAqLwpAQCAtMTY4MSwxMiArMTY4MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RlbG9iaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGVsb2JqKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRlbG9iaiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlZGl0b2JqIGxvbmcgcyAqLwpAQCAtMTY5NCwxMiArMTY5NCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2VkaXRvYmooUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWVkaXRvYmooIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWRpdG9iaiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtYWtlb2JqIGxvbmcgcyAqLwpAQCAtMTcwNywxMiArMTcwNywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21ha2VvYmooUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCW1ha2VvYmooIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFrZW9iaiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtYWtldGFnIGxvbmcgcyAqLwpAQCAtMTcyMCwxMiArMTcyMCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21ha2V0YWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCW1ha2V0YWcoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFrZXRhZyggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaHVua3NpemUgbG9uZyBzICovCkBAIC0xNzMzLDEyICsxNzMzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2h1bmtzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljaHVua3NpemUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2h1bmtzaXplKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNvbXBhY3RpZnkgbG9uZyBzICovCkBAIC0xNzQ2LDEyICsxNzQ2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY29tcGFjdGlmeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY29tcGFjdGlmeSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjb21wYWN0aWZ5KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRlbHRhZyBsb25nIHMgKi8KQEAgLTE3NTksMTIgKzE3NTksMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kZWx0YWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWRlbHRhZyggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkZWx0YWcoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbHNyZXBlYXQgbG9uZyBzICovCkBAIC0xNzcyLDEyICsxNzcyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbHNyZXBlYXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxzcmVwZWF0KCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxzcmVwZWF0KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIG9iamluc2VydCBsb25nIHMgKi8KQEAgLTE3ODUsMTIgKzE3ODUsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9vYmppbnNlcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCW9iamluc2VydCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvYmppbnNlcnQoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgb2JqcmVwbGFjZSBsb25nIHMgKi8KQEAgLTE3OTgsMTIgKzE3OTgsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9vYmpyZXBsYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlvYmpyZXBsYWNlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9ianJlcGxhY2UoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgd2luY2xvc2UgbG9uZyBzICovCkBAIC0xODExLDEyICsxODExLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luY2xvc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXdpbmNsb3NlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdpbmNsb3NlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJsYW5rdGltZSBsb25nIHMgKi8KQEAgLTE4MjQsMTIgKzE4MjQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ibGFua3RpbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWJsYW5rdGltZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBibGFua3RpbWUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZnJlZXB1cCBsb25nIHMgKi8KQEAgLTE4MzcsMTIgKzE4MzcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9mcmVlcHVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlmcmVlcHVwKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZyZWVwdXAoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmFja2J1ZmZlciBsb25nIHMgKi8KQEAgLTE4NTAsMTIgKzE4NTAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iYWNrYnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQliYWNrYnVmZmVyKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJhY2tidWZmZXIoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZnJvbnRidWZmZXIgbG9uZyBzICovCkBAIC0xODYzLDEyICsxODYzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZnJvbnRidWZmZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWZyb250YnVmZmVyKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZyb250YnVmZmVyKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxzYmFja3VwIGxvbmcgcyAqLwpAQCAtMTg3NiwxMiArMTg3NiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xzYmFja3VwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlsc2JhY2t1cCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsc2JhY2t1cCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZXNldGxzIGxvbmcgcyAqLwpAQCAtMTg4OSwxMiArMTg4OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Jlc2V0bHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJlc2V0bHMoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzZXRscyggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsYW1wb24gbG9uZyBzICovCkBAIC0xOTAyLDEyICsxOTAyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbGFtcG9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlsYW1wb24oIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGFtcG9uKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxhbXBvZmYgbG9uZyBzICovCkBAIC0xOTE1LDEyICsxOTE1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbGFtcG9mZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbGFtcG9mZiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsYW1wb2ZmKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldGJlbGwgbG9uZyBzICovCkBAIC0xOTI4LDEyICsxOTI4LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0YmVsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0YmVsbCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRiZWxsKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJsYW5rc2NyZWVuIGxvbmcgcyAqLwpAQCAtMTk0MSwxMiArMTk0MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2JsYW5rc2NyZWVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlibGFua3NjcmVlbiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBibGFua3NjcmVlbiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkZXB0aGN1ZSBsb25nIHMgKi8KQEAgLTE5NTQsMTIgKzE5NTQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kZXB0aGN1ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGVwdGhjdWUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVwdGhjdWUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgemJ1ZmZlciBsb25nIHMgKi8KQEAgLTE5NjcsMTIgKzE5NjcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF96YnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl6YnVmZmVyKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHpidWZmZXIoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmFja2ZhY2UgbG9uZyBzICovCkBAIC0xOTgwLDEyICsxOTgwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmFja2ZhY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWJhY2tmYWNlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJhY2tmYWNlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNtb3YyaSBsb25nIHMgbG9uZyBzICovCkBAIC0xOTkzLDE1ICsxOTkzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY21vdjJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQljbW92MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNtb3YyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZHJhdzJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIwMDksMTUgKzIwMDksMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kcmF3MmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWRyYXcyaSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHJhdzJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtb3ZlMmkgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjAyNSwxNSArMjAyNSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21vdmUyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbW92ZTJpKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtb3ZlMmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBudDJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIwNDEsMTUgKzIwNDEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wbnQyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG50MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBudDJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwYXRjaGJhc2lzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIwNTcsMTUgKzIwNTcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wYXRjaGJhc2lzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwYXRjaGJhc2lzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwYXRjaGJhc2lzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwYXRjaHByZWNpc2lvbiBsb25nIHMgbG9uZyBzICovCkBAIC0yMDczLDE1ICsyMDczLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGF0Y2hwcmVjaXNpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBhdGNocHJlY2lzaW9uKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwYXRjaHByZWNpc2lvbiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGRyMmkgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjA4OSwxNSArMjA4OSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BkcjJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwZHIyaSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGRyMmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBtdjJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIxMDUsMTUgKzIxMDUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wbXYyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG12MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBtdjJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycGRyMmkgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjEyMSwxNSArMjEyMSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwZHIyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBkcjJpKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycGRyMmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwbXYyaSBsb25nIHMgbG9uZyBzICovCkBAIC0yMTM3LDE1ICsyMTM3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcnBtdjJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlycG12MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwbXYyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgeGZwdDJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIxNTMsMTUgKzIxNTMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF94ZnB0MmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXhmcHQyaSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdDJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBvYmpkZWxldGUgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjE2OSwxNSArMjE2OSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX29iamRlbGV0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb2JqZGVsZXRlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvYmpkZWxldGUoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBhdGNoY3VydmVzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIxODUsMTUgKzIxODUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wYXRjaGN1cnZlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGF0Y2hjdXJ2ZXMoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhdGNoY3VydmVzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtaW5zaXplIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIyMDEsMTUgKzIyMDEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9taW5zaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQltaW5zaXplKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtaW5zaXplKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtYXhzaXplIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIyMTcsMTUgKzIyMTcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tYXhzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQltYXhzaXplKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtYXhzaXplKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBrZWVwYXNwZWN0IGxvbmcgcyBsb25nIHMgKi8KQEAgLTIyMzMsMTUgKzIyMzMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9rZWVwYXNwZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlrZWVwYXNwZWN0KCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBrZWVwYXNwZWN0KCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwcmVmc2l6ZSBsb25nIHMgbG9uZyBzICovCkBAIC0yMjQ5LDE1ICsyMjQ5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcHJlZnNpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXByZWZzaXplKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwcmVmc2l6ZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3RlcHVuaXQgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjI2NSwxNSArMjI2NSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3N0ZXB1bml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlzdGVwdW5pdCggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3RlcHVuaXQoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZ1ZGdlIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIyODEsMTUgKzIyODEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9mdWRnZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZnVkZ2UoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZ1ZGdlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB3aW5tb3ZlIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIyOTcsMTUgKzIyOTcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93aW5tb3ZlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQl3aW5tb3ZlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aW5tb3ZlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBhdHRhY2hjdXJzb3Igc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yMzEzLDE1ICsyMzEzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYXR0YWNoY3Vyc29yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXR0YWNoY3Vyc29yKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXR0YWNoY3Vyc29yKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkZWZsaW5lc3R5bGUgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yMzI5LDE1ICsyMzI5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGVmbGluZXN0eWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGVmbGluZXN0eWxlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVmbGluZXN0eWxlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBub2lzZSBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTIzNDUsMTUgKzIzNDUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ub2lzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCW5vaXNlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbm9pc2UoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBpY2tzaXplIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjM2MSwxNSArMjM2MSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BpY2tzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGlja3NpemUoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwaWNrc2l6ZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcWVudGVyIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjM3NywxNSArMjM3NywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3FlbnRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXFlbnRlciggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHFlbnRlciggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2V0ZGVwdGggc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yMzkzLDE1ICsyMzkzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0ZGVwdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRkZXB0aCggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldGRlcHRoKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjbW92MnMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yNDA5LDE1ICsyNDA5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY21vdjJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY21vdjJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY21vdjJzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkcmF3MnMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yNDI1LDE1ICsyNDI1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZHJhdzJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZHJhdzJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHJhdzJzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtb3ZlMnMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yNDQxLDE1ICsyNDQxLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbW92ZTJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbW92ZTJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW92ZTJzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwZHIycyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTI0NTcsMTUgKzI0NTcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wZHIycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBkcjJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGRyMnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBtdjJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjQ3MywxNSArMjQ3MywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BtdjJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG12MnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbXYycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG50MnMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yNDg5LDE1ICsyNDg5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG50MnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwbnQycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBudDJzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZHIycyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTI1MDUsMTUgKzI1MDUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yZHIycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJkcjJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmRyMnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJtdjJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjUyMSwxNSArMjUyMSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JtdjJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jcm12MnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybXYycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBkcjJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjUzNywxNSArMjUzNywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwZHIycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJwZHIycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwZHIycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBtdjJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjU1MywxNSArMjU1MywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwbXYycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJwbXYycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwbXYycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgeGZwdDJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjU2OSwxNSArMjU2OSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3hmcHQycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXhmcHQycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHhmcHQycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY21vdjIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNTg1LDE1ICsyNTg1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY21vdjIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQljbW92MiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNtb3YyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkcmF3MiBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTI2MDEsMTUgKzI2MDEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kcmF3MihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWRyYXcyKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHJhdzIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIG1vdmUyIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMjYxNywxNSArMjYxNywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21vdmUyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbW92ZTIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtb3ZlMiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG50MiBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTI2MzMsMTUgKzI2MzMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wbnQyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG50MiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBudDIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBkcjIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNjQ5LDE1ICsyNjQ5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGRyMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBkcjIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwZHIyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbXYyIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMjY2NSwxNSArMjY2NSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BtdjIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwbXYyKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG12MiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmRyMiBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTI2ODEsMTUgKzI2ODEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yZHIyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmRyMiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJkcjIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJtdjIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNjk3LDE1ICsyNjk3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcm12MihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJtdjIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybXYyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycGRyMiBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTI3MTMsMTUgKzI3MTMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycGRyMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJwZHIyKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnBkcjIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwbXYyIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMjcyOSwxNSArMjcyOSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwbXYyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBtdjIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycG12MiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgeGZwdDIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNzQ1LDE1ICsyNzQ1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdDIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQl4ZnB0MiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHhmcHQyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsb2FkbWF0cml4IGZsb2F0IHNbNCo0XSAqLwpAQCAtMjc2MSwxMiArMjc2MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xvYWRtYXRyaXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxvYWRtYXRyaXgoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDQgXSBbIDQgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICogNCAsIChmbG9hdCAqKSBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbG9hZG1hdHJpeCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtdWx0bWF0cml4IGZsb2F0IHNbNCo0XSAqLwpAQCAtMjc3NCwxMiArMjc3NCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX211bHRtYXRyaXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCW11bHRtYXRyaXgoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDQgXSBbIDQgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICogNCAsIChmbG9hdCAqKSBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbXVsdG1hdHJpeCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjcnYgZmxvYXQgc1szKjRdICovCkBAIC0yNzg3LDEyICsyNzg3LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY3J2KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgNCBdIFsgMyBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgKiA0ICwgKGZsb2F0ICopIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljcnYoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDQgXSBbIDMgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICogNCAsIChmbG9hdCAqKSBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3J2KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJjcnYgZmxvYXQgc1s0KjRdICovCkBAIC0yODAwLDEyICsyODAwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmNydihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSBbIDQgXSBbIDQgXSA7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICogNCAsIChmbG9hdCAqKSBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmNydiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIFsgNCBdIFsgNCBdIDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByY3J2KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGFkZHRvcHVwIGxvbmcgcyBjaGFyICpzIGxvbmcgcyAqLwpAQCAtMjgxMywxOCArMjgxMywxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2FkZHRvcHVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXN0cmluZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYWRkdG9wdXAoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIHN0cmluZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYWRkdG9wdXAoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaGFyc3RyIGNoYXIgKnMgKi8KQEAgLTI4MzIsMTIgKzI4MzIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jaGFyc3RyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJpbmcgYXJnMSA7Ci0JaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2hhcnN0ciggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzdHJpbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2hhcnN0ciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBnZXRwb3J0IGNoYXIgKnMgKi8KQEAgLTI4NDUsMTIgKzI4NDUsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRwb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJpbmcgYXJnMSA7Ci0JaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZ2V0cG9ydCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzdHJpbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ2V0cG9ydCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogbG9uZyBzdHJ3aWR0aCBjaGFyICpzICovCkBAIC0yODU4LDEyICsyODU4LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc3Ryd2lkdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXN0cmluZyBhcmcxIDsKLQlpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSBzdHJ3aWR0aCggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBzdHJpbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gc3Ryd2lkdGgoIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgd2lub3BlbiBjaGFyICpzICovCkBAIC0yODcxLDEyICsyODcxLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2lub3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0Jc3RyaW5nIGFyZzEgOwotCWlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IHdpbm9wZW4oIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgc3RyaW5nIGFyZzEgOworICAgIGlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHZhbCA9IHdpbm9wZW4oIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIHZvaWQgd2ludGl0bGUgY2hhciAqcyAqLwpAQCAtMjg4NCwxMiArMjg4NCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dpbnRpdGxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJpbmcgYXJnMSA7Ci0JaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2ludGl0bGUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc3RyaW5nIGFyZzEgOworICAgIGlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdpbnRpdGxlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbGYgbG9uZyBzIGZsb2F0IHNbMyphcmcxXSAqLwpAQCAtMjg5NywxOSArMjg5NywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbGYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAzIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2xmKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCAoKiBhcmcyKSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMzsKKyAgICBpZiAoKGFyZzIgPSAoZmxvYXQoKilbM10pIFB5TWVtX05FVyhmbG9hdCAsIDMgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAoZmxvYXQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbGYoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2xmMiBsb25nIHMgZmxvYXQgc1syKmFyZzFdICovCkBAIC0yOTE3LDE5ICsyOTE3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9sZjIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAyIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDI7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzJdKSBQeU1lbV9ORVcoZmxvYXQgLCAyICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2xmMiggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgKCogYXJnMikgWyAyIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDI7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzJdKSBQeU1lbV9ORVcoZmxvYXQgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2xmMiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbHkgbG9uZyBzIGZsb2F0IHNbMyphcmcxXSAqLwpAQCAtMjkzNywxOSArMjkzNywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbHkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAzIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2x5KCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCAoKiBhcmcyKSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMzsKKyAgICBpZiAoKGFyZzIgPSAoZmxvYXQoKilbM10pIFB5TWVtX05FVyhmbG9hdCAsIDMgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAoZmxvYXQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbHkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2x5MiBsb25nIHMgZmxvYXQgc1syKmFyZzFdICovCkBAIC0yOTU3LDE5ICsyOTU3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9seTIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAyIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDI7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzJdKSBQeU1lbV9ORVcoZmxvYXQgLCAyICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2x5MiggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgKCogYXJnMikgWyAyIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDI7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzJdKSBQeU1lbV9ORVcoZmxvYXQgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2x5MiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNydm4gbG9uZyBzIGZsb2F0IHNbMyphcmcxXSAqLwpAQCAtMjk3NywxOSArMjk3NywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Nydm4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAzIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQljcnZuKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCAoKiBhcmcyKSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMzsKKyAgICBpZiAoKGFyZzIgPSAoZmxvYXQoKilbM10pIFB5TWVtX05FVyhmbG9hdCAsIDMgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAoZmxvYXQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNydm4oIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByY3J2biBsb25nIHMgZmxvYXQgc1s0KmFyZzFdICovCkBAIC0yOTk3LDE5ICsyOTk3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmNydm4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyA0IF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDQ7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzRdKSBQeU1lbV9ORVcoZmxvYXQgLCA0ICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDQgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlyY3J2biggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgKCogYXJnMikgWyA0IF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDQ7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzRdKSBQeU1lbV9ORVcoZmxvYXQgLCA0ICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDQgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByY3J2biggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbGYyaSBsb25nIHMgbG9uZyBzWzIqYXJnMV0gKi8KQEAgLTMwMTcsMTkgKzMwMTcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb2xmMmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyAoKiBhcmcyKSBbIDIgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMjsKLQlpZiAoKGFyZzIgPSAobG9uZygqKVsyXSkgUHlNZW1fTkVXKGxvbmcgLCAyICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMiAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9sZjJpKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nICgqIGFyZzIpIFsgMiBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAyOworICAgIGlmICgoYXJnMiA9IChsb25nKCopWzJdKSBQeU1lbV9ORVcobG9uZyAsIDIgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChsb25nICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2xmMmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2xmaSBsb25nIHMgbG9uZyBzWzMqYXJnMV0gKi8KQEAgLTMwMzcsMTkgKzMwMzcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb2xmaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nICgqIGFyZzIpIFsgMyBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAzOwotCWlmICgoYXJnMiA9IChsb25nKCopWzNdKSBQeU1lbV9ORVcobG9uZyAsIDMgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChsb25nICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2xmaSggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyAoKiBhcmcyKSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMzsKKyAgICBpZiAoKGFyZzIgPSAobG9uZygqKVszXSkgUHlNZW1fTkVXKGxvbmcgLCAzICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9sZmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2x5MmkgbG9uZyBzIGxvbmcgc1syKmFyZzFdICovCkBAIC0zMDU3LDE5ICszMDU3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9seTJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgKCogYXJnMikgWyAyIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDI7Ci0JaWYgKChhcmcyID0gKGxvbmcoKilbMl0pIFB5TWVtX05FVyhsb25nICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBvbHkyaSggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyAoKiBhcmcyKSBbIDIgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMjsKKyAgICBpZiAoKGFyZzIgPSAobG9uZygqKVsyXSkgUHlNZW1fTkVXKGxvbmcgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMiAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9seTJpKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9seWkgbG9uZyBzIGxvbmcgc1szKmFyZzFdICovCkBAIC0zMDc3LDE5ICszMDc3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9seWkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyAoKiBhcmcyKSBbIDMgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMzsKLQlpZiAoKGFyZzIgPSAobG9uZygqKVszXSkgUHlNZW1fTkVXKGxvbmcgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9seWkoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgKCogYXJnMikgWyAzIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKGxvbmcoKilbM10pIFB5TWVtX05FVyhsb25nICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbHlpKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9sZjJzIGxvbmcgcyBzaG9ydCBzWzIqYXJnMV0gKi8KQEAgLTMwOTcsMTkgKzMwOTcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb2xmMnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0Jc2hvcnQgKCogYXJnMikgWyAyIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDI7Ci0JaWYgKChhcmcyID0gKHNob3J0KCopWzJdKSBQeU1lbV9ORVcoc2hvcnQgLCAyICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKHNob3J0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2xmMnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIHNob3J0ICgqIGFyZzIpIFsgMiBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAyOworICAgIGlmICgoYXJnMiA9IChzaG9ydCgqKVsyXSkgUHlNZW1fTkVXKHNob3J0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9sZjJzKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9sZnMgbG9uZyBzIHNob3J0IHNbMyphcmcxXSAqLwpAQCAtMzExNywxOSArMzExNywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbGZzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXNob3J0ICgqIGFyZzIpIFsgMyBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAzOwotCWlmICgoYXJnMiA9IChzaG9ydCgqKVszXSkgUHlNZW1fTkVXKHNob3J0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9sZnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIHNob3J0ICgqIGFyZzIpIFsgMyBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAzOworICAgIGlmICgoYXJnMiA9IChzaG9ydCgqKVszXSkgUHlNZW1fTkVXKHNob3J0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9sZnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2x5cyBsb25nIHMgc2hvcnQgc1szKmFyZzFdICovCkBAIC0zMTM3LDE5ICszMTM3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9seXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0Jc2hvcnQgKCogYXJnMikgWyAzIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKHNob3J0KCopWzNdKSBQeU1lbV9ORVcoc2hvcnQgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKHNob3J0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2x5cyggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgc2hvcnQgKCogYXJnMikgWyAzIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKHNob3J0KCopWzNdKSBQeU1lbV9ORVcoc2hvcnQgLCAzICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKHNob3J0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2x5cyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbHkycyBsb25nIHMgc2hvcnQgc1syKmFyZzFdICovCkBAIC0zMTU3LDE5ICszMTU3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9seTJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXNob3J0ICgqIGFyZzIpIFsgMiBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChzaG9ydCgqKVsyXSkgUHlNZW1fTkVXKHNob3J0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9seTJzKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBzaG9ydCAoKiBhcmcyKSBbIDIgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMjsKKyAgICBpZiAoKGFyZzIgPSAoc2hvcnQoKilbMl0pIFB5TWVtX05FVyhzaG9ydCAsIDIgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMiAqIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbHkycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRlZmN1cnNvciBzaG9ydCBzIHVfc2hvcnQgc1sxMjhdICovCkBAIC0zMTc3LDE1ICszMTc3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGVmY3Vyc29yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQl1bnNpZ25lZCBzaG9ydCBhcmcyIFsgMTI4IF0gOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCAxMjggLCAoc2hvcnQgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWRlZmN1cnNvciggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgdW5zaWduZWQgc2hvcnQgYXJnMiBbIDEyOCBdIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgMTI4ICwgKHNob3J0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkZWZjdXJzb3IoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHdyaXRlcGl4ZWxzIHNob3J0IHMgdV9zaG9ydCBzW2FyZzFdICovCkBAIC0zMTkzLDE4ICszMTkzLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd3JpdGVwaXhlbHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXVuc2lnbmVkIHNob3J0ICogYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGFyZzIgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd3JpdGVwaXhlbHMoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqIGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmcyID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdyaXRlcGl4ZWxzKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZGVmYmFzaXMgbG9uZyBzIGZsb2F0IHNbNCo0XSAqLwpAQCAtMzIxMiwxNSArMzIxMiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RlZmJhc2lzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWZsb2F0IGFyZzIgWyA0IF0gWyA0IF0gOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDIsIDEsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlkZWZiYXNpcyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIFsgNCBdIFsgNCBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAyLCAxLCA0ICogNCAsIChmbG9hdCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVmYmFzaXMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdld3JpdGUgc2hvcnQgcyBzaG9ydCBzW2FyZzFdICovCkBAIC0zMjI4LDE4ICszMjI4LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V3cml0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgKiBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnMiA9IFB5TWVtX05FVyhzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCBhcmcxICwgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWdld3JpdGUoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCAqIGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmcyID0gUHlNZW1fTkVXKHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIGFyZzEgLCBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ2V3cml0ZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJvdGF0ZSBzaG9ydCBzIGNoYXIgcyAqLwpAQCAtMzI0NywxNSArMzI0NywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JvdGF0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JY2hhciBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWNoYXJhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlyb3RhdGUoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGNoYXIgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGljaGFyYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcm90YXRlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByb3QgZmxvYXQgcyBjaGFyIHMgKi8KQEAgLTMyNjMsMTUgKzMyNjMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yb3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWNoYXIgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGljaGFyYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jcm90KCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBjaGFyIGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpY2hhcmFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJvdCggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY2lyY2ZpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zMjc5LDE4ICszMjc5LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2lyY2ZpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljaXJjZmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaXJjZmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaXJjaSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzI5OCwxOCArMzI5OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NpcmNpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljaXJjaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNpcmNpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY21vdmkgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTMzMTcsMTggKzMzMTcsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbW92aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY21vdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjbW92aSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRyYXdpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zMzM2LDE4ICszMzM2LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZHJhd2koUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWRyYXdpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHJhd2koIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtb3ZlaSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzM1NSwxOCArMzM1NSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21vdmVpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQltb3ZlaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1vdmVpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG50aSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzM3NCwxOCArMzM3NCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BudGkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXBudGkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbnRpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbmV3dGFnIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zMzkzLDE4ICszMzkzLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbmV3dGFnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQluZXd0YWcoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXd0YWcoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwZHJpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zNDEyLDE4ICszNDEyLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGRyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGRyaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBkcmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbXZpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zNDMxLDE4ICszNDMxLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG12aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG12aSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBtdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZHJpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zNDUwLDE4ICszNDUwLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmRyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmRyaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJkcmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBybXZpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zNDY5LDE4ICszNDY5LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcm12aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jcm12aSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJtdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycGRyaSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzQ4OCwxOCArMzQ4OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwZHJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlycGRyaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwZHJpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBtdmkgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTM1MDcsMTggKzM1MDcsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycG12aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBtdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycG12aSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHRpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zNTI2LDE4ICszNTI2LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdGkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXhmcHRpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdGkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaXJjIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNTQ1LDE4ICszNTQ1LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2lyYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2lyYyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNpcmMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaXJjZiBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzU2NCwxOCArMzU2NCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NpcmNmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljaXJjZiggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNpcmNmKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY21vdiBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzU4MywxOCArMzU4MywxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Ntb3YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWNtb3YoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjbW92KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZHJhdyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzYwMiwxOCArMzYwMiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RyYXcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWRyYXcoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkcmF3KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbW92ZSBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzYyMSwxOCArMzYyMSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21vdmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCW1vdmUoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtb3ZlKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG50IGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNjQwLDE4ICszNjQwLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG50KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlwbnQoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbnQoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzY2FsZSBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzY1OSwxOCArMzY1OSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NjYWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlzY2FsZSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNjYWxlKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdHJhbnNsYXRlIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNjc4LDE4ICszNjc4LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdHJhbnNsYXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQl0cmFuc2xhdGUoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0cmFuc2xhdGUoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwZHIgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM2OTcsMTggKzM2OTcsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wZHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXBkciggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBkciggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBtdiBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzcxNiwxOCArMzcxNiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BtdihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG12KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG12KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmRyIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNzM1LDE4ICszNzM1LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlyZHIoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZHIoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBybXYgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM3NTQsMTggKzM3NTQsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ybXYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXJtdiggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJtdiggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwZHIgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM3NzMsMTggKzM3NzMsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycGRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlycGRyKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnBkciggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwbXYgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM3OTIsMTggKzM3OTIsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycG12KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlycG12KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnBtdiggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHQgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM4MTEsMTggKzM4MTEsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF94ZnB0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQl4ZnB0KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdCggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIFJHQmNvbG9yIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0zODMwLDE4ICszODMwLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfUkdCY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCVJHQmNvbG9yKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUkdCY29sb3IoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBSR0J3cml0ZW1hc2sgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTM4NDksMTggKzM4NDksMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9SR0J3cml0ZW1hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCVJHQndyaXRlbWFzayggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJHQndyaXRlbWFzayggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldGN1cnNvciBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMzg2OCwxOCArMzg2OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NldGN1cnNvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0Y3Vyc29yKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0Y3Vyc29yKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdGllIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0zODg3LDE4ICszODg3LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdGllKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQl0aWUoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0aWUoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaXJjZnMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTM5MDYsMTggKzM5MDYsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jaXJjZnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWNpcmNmcyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNpcmNmcyggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNpcmNzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0zOTI1LDE4ICszOTI1LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2lyY3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWNpcmNzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2lyY3MoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjbW92cyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMzk0NCwxOCArMzk0NCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Ntb3ZzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljbW92cyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNtb3ZzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZHJhd3Mgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTM5NjMsMTggKzM5NjMsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kcmF3cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZHJhd3MoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkcmF3cyggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIG1vdmVzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0zOTgyLDE4ICszOTgyLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbW92ZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCW1vdmVzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW92ZXMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwZHJzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MDAxLDE4ICs0MDAxLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGRycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGRycyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBkcnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbXZzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MDIwLDE4ICs0MDIwLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG12cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG12cyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBtdnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbnRzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MDM5LDE4ICs0MDM5LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG50cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG50cyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBudHMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZHJzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MDU4LDE4ICs0MDU4LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmRycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmRycyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJkcnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBybXZzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MDc3LDE4ICs0MDc3LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcm12cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jcm12cyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJtdnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycGRycyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDA5NiwxOCArNDA5NiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwZHJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlycGRycyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwZHJzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBtdnMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQxMTUsMTggKzQxMTUsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycG12cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBtdnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycG12cyggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHRzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MTM0LDE4ICs0MTM0LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXhmcHRzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdHMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjdXJvcmlnaW4gc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQxNTMsMTggKzQxNTMsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jdXJvcmlnaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWN1cm9yaWdpbiggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGN1cm9yaWdpbiggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGN5Y2xlbWFwIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MTcyLDE4ICs0MTcyLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY3ljbGVtYXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWN5Y2xlbWFwKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3ljbGVtYXAoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwYXRjaCBmbG9hdCBzWzQqNF0gZmxvYXQgc1s0KjRdIGZsb2F0IHNbNCo0XSAqLwpAQCAtNDE5MSwxOCArNDE5MSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BhdGNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgNCBdIFsgNCBdIDsKLQlmbG9hdCBhcmcyIFsgNCBdIFsgNCBdIDsKLQlmbG9hdCBhcmczIFsgNCBdIFsgNCBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDMsIDAsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDMsIDEsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDMsIDIsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlwYXRjaCggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOworICAgIGZsb2F0IGFyZzIgWyA0IF0gWyA0IF0gOworICAgIGZsb2F0IGFyZzMgWyA0IF0gWyA0IF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMywgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMywgMSwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMywgMiwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhdGNoKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3BsZiBsb25nIHMgZmxvYXQgc1szKmFyZzFdIHVfc2hvcnQgc1thcmcxXSAqLwpAQCAtNDIxMCwyNSArNDIxMCwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NwbGYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAzIF0gOwotCXVuc2lnbmVkIHNob3J0ICogYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMzsKLQlpZiAoKGFyZzIgPSAoZmxvYXQoKilbM10pIFB5TWVtX05FVyhmbG9hdCAsIDMgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMiwgMCwgMyAqIGFyZzEgLCAoZmxvYXQgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnMyA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCBhcmcxICwgKHNob3J0ICopIGFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlzcGxmKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlNZW1fREVMKGFyZzMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGZsb2F0ICgqIGFyZzIpIFsgMyBdIDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDIsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzMgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgYXJnMSAsIChzaG9ydCAqKSBhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3BsZiggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5TWVtX0RFTChhcmczKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3BsZjIgbG9uZyBzIGZsb2F0IHNbMiphcmcxXSB1X3Nob3J0IHNbYXJnMV0gKi8KQEAgLTQyMzYsMjUgKzQyMzYsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zcGxmMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlmbG9hdCAoKiBhcmcyKSBbIDIgXSA7Ci0JdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChmbG9hdCgqKVsyXSkgUHlNZW1fTkVXKGZsb2F0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAyLCAwLCAyICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXNwbGYyKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlNZW1fREVMKGFyZzMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGZsb2F0ICgqIGFyZzIpIFsgMiBdIDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDI7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzJdKSBQeU1lbV9ORVcoZmxvYXQgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDIsIDAsIDIgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzMgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgYXJnMSAsIChzaG9ydCAqKSBhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3BsZjIoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeU1lbV9ERUwoYXJnMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNwbGZpIGxvbmcgcyBsb25nIHNbMyphcmcxXSB1X3Nob3J0IHNbYXJnMV0gKi8KQEAgLTQyNjIsMjUgKzQyNjIsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zcGxmaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nICgqIGFyZzIpIFsgMyBdIDsKLQl1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKGxvbmcoKilbM10pIFB5TWVtX05FVyhsb25nICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDIsIDAsIDMgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnMyA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCBhcmcxICwgKHNob3J0ICopIGFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlzcGxmaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5TWVtX0RFTChhcmczKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nICgqIGFyZzIpIFsgMyBdIDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKGxvbmcoKilbM10pIFB5TWVtX05FVyhsb25nICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDIsIDAsIDMgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoYXJnMyA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCBhcmcxICwgKHNob3J0ICopIGFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzcGxmaSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5TWVtX0RFTChhcmczKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3BsZjJpIGxvbmcgcyBsb25nIHNbMiphcmcxXSB1X3Nob3J0IHNbYXJnMV0gKi8KQEAgLTQyODgsMjUgKzQyODgsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zcGxmMmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyAoKiBhcmcyKSBbIDIgXSA7Ci0JdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChsb25nKCopWzJdKSBQeU1lbV9ORVcobG9uZyAsIDIgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAyLCAwLCAyICogYXJnMSAsIChsb25nICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGFyZzMgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgYXJnMSAsIChzaG9ydCAqKSBhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3BsZjJpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlNZW1fREVMKGFyZzMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgKCogYXJnMikgWyAyIF0gOworICAgIHVuc2lnbmVkIHNob3J0ICogYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMjsKKyAgICBpZiAoKGFyZzIgPSAobG9uZygqKVsyXSkgUHlNZW1fTkVXKGxvbmcgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMiwgMCwgMiAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNwbGYyaSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5TWVtX0RFTChhcmczKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3BsZnMgbG9uZyBzIHNob3J0IHNbMyphcmcxXSB1X3Nob3J0IHNbYXJnMV0gKi8KQEAgLTQzMTQsMjUgKzQzMTQsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zcGxmcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlzaG9ydCAoKiBhcmcyKSBbIDMgXSA7Ci0JdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAzOwotCWlmICgoYXJnMiA9IChzaG9ydCgqKVszXSkgUHlNZW1fTkVXKHNob3J0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAwLCAzICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXNwbGZzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlNZW1fREVMKGFyZzMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIHNob3J0ICgqIGFyZzIpIFsgMyBdIDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKHNob3J0KCopWzNdKSBQeU1lbV9ORVcoc2hvcnQgLCAzICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDAsIDMgKiBhcmcxICwgKHNob3J0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzMgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgYXJnMSAsIChzaG9ydCAqKSBhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3BsZnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeU1lbV9ERUwoYXJnMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNwbGYycyBsb25nIHMgc2hvcnQgc1syKmFyZzFdIHVfc2hvcnQgc1thcmcxXSAqLwpAQCAtNDM0MCwyNSArNDM0MCwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NwbGYycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlzaG9ydCAoKiBhcmcyKSBbIDIgXSA7Ci0JdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChzaG9ydCgqKVsyXSkgUHlNZW1fTkVXKHNob3J0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAwLCAyICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXNwbGYycyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5TWVtX0RFTChhcmczKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBzaG9ydCAoKiBhcmcyKSBbIDIgXSA7CisgICAgdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAyOworICAgIGlmICgoYXJnMiA9IChzaG9ydCgqKVsyXSkgUHlNZW1fTkVXKHNob3J0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAwLCAyICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNwbGYycyggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5TWVtX0RFTChhcmczKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBhdGNoIGZsb2F0IHNbNCo0XSBmbG9hdCBzWzQqNF0gZmxvYXQgc1s0KjRdIGZsb2F0IHNbNCo0XSAqLwpAQCAtNDM2NiwyMSArNDM2NiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwYXRjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSBbIDQgXSBbIDQgXSA7Ci0JZmxvYXQgYXJnMiBbIDQgXSBbIDQgXSA7Ci0JZmxvYXQgYXJnMyBbIDQgXSBbIDQgXSA7Ci0JZmxvYXQgYXJnNCBbIDQgXSBbIDQgXSA7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCA0LCAwLCA0ICogNCAsIChmbG9hdCAqKSBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCA0LCAxLCA0ICogNCAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCA0LCAyLCA0ICogNCAsIChmbG9hdCAqKSBhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCA0LCAzLCA0ICogNCAsIChmbG9hdCAqKSBhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBhdGNoKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOworICAgIGZsb2F0IGFyZzIgWyA0IF0gWyA0IF0gOworICAgIGZsb2F0IGFyZzMgWyA0IF0gWyA0IF0gOworICAgIGZsb2F0IGFyZzQgWyA0IF0gWyA0IF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMSwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMiwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMywgNCAqIDQgLCAoZmxvYXQgKikgYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwYXRjaCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBvcnRobzIgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNDM4OCwyMSArNDM4OCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX29ydGhvMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlvcnRobzIoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvcnRobzIoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmVjdCBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC00NDEwLDIxICs0NDEwLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlyZWN0KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVjdCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZWN0ZiBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC00NDMyLDIxICs0NDMyLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVjdGYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVjdGYoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZWN0ZiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB4ZnB0NCBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC00NDU0LDIxICs0NDU0LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdDQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JeGZwdDQoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4ZnB0NCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB0ZXh0cG9ydCBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NDc2LDIxICs0NDc2LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdGV4dHBvcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JdGV4dHBvcnQoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0cG9ydCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtYXBjb2xvciBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NDk4LDIxICs0NDk4LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbWFwY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWFwY29sb3IoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtYXBjb2xvciggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzY3JtYXNrIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ1MjAsMjEgKzQ1MjAsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zY3JtYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXNjcm1hc2soIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzY3JtYXNrKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldHZhbHVhdG9yIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ1NDIsMjEgKzQ1NDIsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zZXR2YWx1YXRvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlzZXR2YWx1YXRvciggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldHZhbHVhdG9yKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHZpZXdwb3J0IHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ1NjQsMjEgKzQ1NjQsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92aWV3cG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQl2aWV3cG9ydCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHZpZXdwb3J0KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNoYWRlcmFuZ2Ugc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDU4NiwyMSArNDU4NiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NoYWRlcmFuZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2hhZGVyYW5nZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNoYWRlcmFuZ2UoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgeGZwdDRzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ2MDgsMjEgKzQ2MDgsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF94ZnB0NHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JeGZwdDRzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdDRzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJlY3RmaSBsb25nIHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTQ2MzAsMjEgKzQ2MzAsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yZWN0ZmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXJlY3RmaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZWN0ZmkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmVjdGkgbG9uZyBzIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC00NjUyLDIxICs0NjUyLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVjdGkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXJlY3RpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGxvbmcgYXJnNCA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlY3RpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHQ0aSBsb25nIHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTQ2NzQsMjEgKzQ2NzQsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF94ZnB0NGkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXhmcHQ0aSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4ZnB0NGkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcHJlZnBvc2l0aW9uIGxvbmcgcyBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtNDY5NiwyMSArNDY5NiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3ByZWZwb3NpdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JbG9uZyBhcmc0IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcHJlZnBvc2l0aW9uKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGxvbmcgYXJnNCA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHByZWZwb3NpdGlvbiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBhcmMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NzE4LDI0ICs0NzE4LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYXJjKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJjKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBzaG9ydCBhcmc1IDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJjKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBhcmNmIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDc0MywyNCArNDc0MywyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2FyY2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmNmKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBzaG9ydCBhcmc1IDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJjZiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYXJjZmkgbG9uZyBzIGxvbmcgcyBsb25nIHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NzY4LDI0ICs0NzY4LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYXJjZmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmNmaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyY2ZpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBhcmNpIGxvbmcgcyBsb25nIHMgbG9uZyBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDc5MywyNCArNDc5MywyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2FyY2koUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmNpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBzaG9ydCBhcmc1IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJjaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmJveDIgc2hvcnQgcyBzaG9ydCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTQ4MTgsMjcgKzQ4MTgsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iYm94MihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JZmxvYXQgYXJnNSA7Ci0JZmxvYXQgYXJnNiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYmJveDIoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBmbG9hdCBhcmc1IDsKKyAgICBmbG9hdCBhcmc2IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNSwgJmFyZzYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBiYm94MiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJib3gyaSBzaG9ydCBzIHNob3J0IHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC00ODQ2LDI3ICs0ODQ2LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmJveDJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JbG9uZyBhcmc1IDsKLQlsb25nIGFyZzYgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNiwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYmJveDJpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGxvbmcgYXJnNSA7CisgICAgbG9uZyBhcmc2IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA2LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNiwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA2LCA1LCAmYXJnNikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJib3gyaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJib3gycyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDg3NCwyNyArNDg3NCwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Jib3gycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0Jc2hvcnQgYXJnNSA7Ci0Jc2hvcnQgYXJnNiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYmJveDJzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgc2hvcnQgYXJnNiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYmJveDJzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmxpbmsgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00OTAyLDI0ICs0OTAyLDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmxpbmsoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlibGluayggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJsaW5rKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBvcnRobyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNDkyNywyNyArNDkyNywyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX29ydGhvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlmbG9hdCBhcmc1IDsKLQlmbG9hdCBhcmc2IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNSwgJmFyZzYpKQotCQlyZXR1cm4gTlVMTDsKLQlvcnRobyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGZsb2F0IGFyZzUgOworICAgIGZsb2F0IGFyZzYgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCA1LCAmYXJnNikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9ydGhvKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgd2luZG93IGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC00OTU1LDI3ICs0OTU1LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luZG93KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlmbG9hdCBhcmc1IDsKLQlmbG9hdCBhcmc2IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNSwgJmFyZzYpKQotCQlyZXR1cm4gTlVMTDsKLQl3aW5kb3coIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBmbG9hdCBhcmc1IDsKKyAgICBmbG9hdCBhcmc2IDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNSwgJmFyZzYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aW5kb3coIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsb29rYXQgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgc2hvcnQgcyAqLwpAQCAtNDk4MywzMCArNDk4MywzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xvb2thdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JZmxvYXQgYXJnNSA7Ci0JZmxvYXQgYXJnNiA7Ci0Jc2hvcnQgYXJnNyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgNiwgJmFyZzcpKQotCQlyZXR1cm4gTlVMTDsKLQlsb29rYXQoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiAsIGFyZzcgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgZmxvYXQgYXJnNSA7CisgICAgZmxvYXQgYXJnNiA7CisgICAgc2hvcnQgYXJnNyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDUsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgNiwgJmFyZzcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsb29rYXQoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiAsIGFyZzcgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGVyc3BlY3RpdmUgc2hvcnQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNTAxNCwyMSArNTAxNCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BlcnNwZWN0aXZlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXBlcnNwZWN0aXZlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGVyc3BlY3RpdmUoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9sYXJ2aWV3IGZsb2F0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTUwMzYsMjEgKzUwMzYsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb2xhcnZpZXcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9sYXJ2aWV3KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9sYXJ2aWV3KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGFyY2ZzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNTA1OCwyNCArNTA1OCwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2FyY2ZzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJjZnMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIHNob3J0IGFyZzUgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmNmcyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYXJjcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTUwODMsMjQgKzUwODMsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9hcmNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJjcyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyY3MoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJlY3Rjb3B5IHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC01MTA4LDI3ICs1MTA4LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVjdGNvcHkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCXNob3J0IGFyZzYgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCA1LCAmYXJnNikpCi0JCXJldHVybiBOVUxMOwotCXJlY3Rjb3B5KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgc2hvcnQgYXJnNiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVjdGNvcHkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBSR0JjdXJzb3Igc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNTEzNiwzMCArNTEzNiwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX1JHQmN1cnNvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0Jc2hvcnQgYXJnNSA7Ci0Jc2hvcnQgYXJnNiA7Ci0Jc2hvcnQgYXJnNyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgNiwgJmFyZzcpKQotCQlyZXR1cm4gTlVMTDsKLQlSR0JjdXJzb3IoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiAsIGFyZzcgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgc2hvcnQgYXJnNiA7CisgICAgc2hvcnQgYXJnNyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDUsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgNiwgJmFyZzcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSR0JjdXJzb3IoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiAsIGFyZzcgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIGxvbmcgZ2V0YnV0dG9uIHNob3J0IHMgKi8KQEAgLTUxNjcsMTIgKzUxNjcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRidXR0b24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gZ2V0YnV0dG9uKCBhcmcxICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gZ2V0YnV0dG9uKCBhcmcxICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGNtbW9kZSAqLwpAQCAtNTE4MCw5ICs1MTgwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRjbW1vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGNtbW9kZSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0Y21tb2RlKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRsc2JhY2t1cCAqLwpAQCAtNTE5MCw5ICs1MTkwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRsc2JhY2t1cChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0bHNiYWNrdXAoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGxzYmFja3VwKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRyZXNldGxzICovCkBAIC01MjAwLDkgKzUyMDAsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHJlc2V0bHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldHJlc2V0bHMoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldHJlc2V0bHMoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGRjbSAqLwpAQCAtNTIxMCw5ICs1MjEwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRkY20oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGRjbSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0ZGNtKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXR6YnVmZmVyICovCkBAIC01MjIwLDkgKzUyMjAsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHpidWZmZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldHpidWZmZXIoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldHpidWZmZXIoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGlzbWV4ICovCkBAIC01MjMwLDkgKzUyMzAsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2lzbWV4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBpc21leCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gaXNtZXgoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGlzb2JqIGxvbmcgcyAqLwpAQCAtNTI0MCwxMiArNTI0MCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2lzb2JqKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSBpc29iaiggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBpc29iaiggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBpc3F1ZXVlZCBzaG9ydCBzICovCkBAIC01MjUzLDEyICs1MjUzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfaXNxdWV1ZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gaXNxdWV1ZWQoIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBpc3F1ZXVlZCggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBpc3RhZyBsb25nIHMgKi8KQEAgLTUyNjYsMTIgKzUyNjYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9pc3RhZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gaXN0YWcoIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gaXN0YWcoIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2Vub2JqICovCkBAIC01Mjc5LDkgKzUyNzksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dlbm9iaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2Vub2JqKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZW5vYmooICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdlbnRhZyAqLwpAQCAtNTI4OSw5ICs1Mjg5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZW50YWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdlbnRhZyggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2VudGFnKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRidWZmZXIgKi8KQEAgLTUyOTksOSArNTI5OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0YnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRidWZmZXIoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGJ1ZmZlciggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0Y29sb3IgKi8KQEAgLTUzMDksOSArNTMwOSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0Y29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGNvbG9yKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRjb2xvciggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0ZGlzcGxheW1vZGUgKi8KQEAgLTUzMTksOSArNTMxOSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0ZGlzcGxheW1vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGRpc3BsYXltb2RlKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRkaXNwbGF5bW9kZSggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0Zm9udCAqLwpAQCAtNTMyOSw5ICs1MzI5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRmb250KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRmb250KCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRmb250KCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRoZWlnaHQgKi8KQEAgLTUzMzksOSArNTMzOSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0aGVpZ2h0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRoZWlnaHQoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGhlaWdodCggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0aGl0Y29kZSAqLwpAQCAtNTM0OSw5ICs1MzQ5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRoaXRjb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRoaXRjb2RlKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRoaXRjb2RlKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRsc3R5bGUgKi8KQEAgLTUzNTksOSArNTM1OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0bHN0eWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRsc3R5bGUoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGxzdHlsZSggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0bHdpZHRoICovCkBAIC01MzY5LDkgKzUzNjksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGx3aWR0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0bHdpZHRoKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRsd2lkdGgoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldG1hcCAqLwpAQCAtNTM3OSw5ICs1Mzc5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRtYXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldG1hcCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0bWFwKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRwbGFuZXMgKi8KQEAgLTUzODksOSArNTM4OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0cGxhbmVzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRwbGFuZXMoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldHBsYW5lcyggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0d3JpdGVtYXNrICovCkBAIC01Mzk5LDkgKzUzOTksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHdyaXRlbWFzayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0d3JpdGVtYXNrKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXR3cml0ZW1hc2soICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIHF0ZXN0ICovCkBAIC01NDA5LDkgKzU0MDksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3F0ZXN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBxdGVzdCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gcXRlc3QoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGxzcmVwZWF0ICovCkBAIC01NDE5LDkgKzU0MTksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGxzcmVwZWF0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRsc3JlcGVhdCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0bHNyZXBlYXQoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldG1vbml0b3IgKi8KQEAgLTU0MjksOSArNTQyOSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0bW9uaXRvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0bW9uaXRvciggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0bW9uaXRvciggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0b3Blbm9iaiAqLwpAQCAtNTQzOSw5ICs1NDM5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRvcGVub2JqKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRvcGVub2JqKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRvcGVub2JqKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRwYXR0ZXJuICovCkBAIC01NDQ5LDkgKzU0NDksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHBhdHRlcm4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldHBhdHRlcm4oICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldHBhdHRlcm4oICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIHdpbmdldCAqLwpAQCAtNTQ1OSw5ICs1NDU5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93aW5nZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IHdpbmdldCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gd2luZ2V0KCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyB3aW5hdHRhY2ggKi8KQEAgLTU0NjksOSArNTQ2OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luYXR0YWNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSB3aW5hdHRhY2goICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IHdpbmF0dGFjaCggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0b3RoZXJtb25pdG9yICovCkBAIC01NDc5LDkgKzU0NzksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldG90aGVybW9uaXRvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0b3RoZXJtb25pdG9yKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRvdGhlcm1vbml0b3IoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIG5ld3B1cCAqLwpAQCAtNTQ4OSw5ICs1NDg5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9uZXdwdXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IG5ld3B1cCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gbmV3cHVwKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXR2YWx1YXRvciBzaG9ydCBzICovCkBAIC01NDk5LDEyICs1NDk5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0dmFsdWF0b3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gZ2V0dmFsdWF0b3IoIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBnZXR2YWx1YXRvciggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogdm9pZCB3aW5zZXQgbG9uZyBzICovCkBAIC01NTEyLDEyICs1NTEyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luc2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl3aW5zZXQoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2luc2V0KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBsb25nIGRvcHVwIGxvbmcgcyAqLwpAQCAtNTUyNSwxMiArNTUyNSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RvcHVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSBkb3B1cCggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBkb3B1cCggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogdm9pZCBnZXRkZXB0aCBzaG9ydCByIHNob3J0IHIgKi8KQEAgLTU1MzgsMTUgKzU1MzgsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRkZXB0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JZ2V0ZGVwdGgoICYgYXJnMSAsICYgYXJnMiApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgZ2V0ZGVwdGgoICYgYXJnMSAsICYgYXJnMiApOworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgZ2V0Y3BvcyBzaG9ydCByIHNob3J0IHIgKi8KQEAgLTU1NTQsMTUgKzU1NTQsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRjcG9zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlnZXRjcG9zKCAmIGFyZzEgLCAmIGFyZzIgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGdldGNwb3MoICYgYXJnMSAsICYgYXJnMiApOworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgZ2V0c2l6ZSBsb25nIHIgbG9uZyByICovCkBAIC01NTcwLDE1ICs1NTcwLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0c2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWdldHNpemUoICYgYXJnMSAsICYgYXJnMiApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdsb25nb2JqZWN0KGFyZzEpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld2xvbmdvYmplY3QoYXJnMikpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBnZXRzaXplKCAmIGFyZzEgLCAmIGFyZzIgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3bG9uZ29iamVjdChhcmcxKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdsb25nb2JqZWN0KGFyZzIpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBnZXRvcmlnaW4gbG9uZyByIGxvbmcgciAqLwpAQCAtNTU4NiwxNSArNTU4NiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldG9yaWdpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWdldG9yaWdpbiggJiBhcmcxICwgJiBhcmcyICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAyICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2xvbmdvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3bG9uZ29iamVjdChhcmcyKSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGdldG9yaWdpbiggJiBhcmcxICwgJiBhcmcyICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAyICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2xvbmdvYmplY3QoYXJnMSkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3bG9uZ29iamVjdChhcmcyKSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgZ2V0dmlld3BvcnQgc2hvcnQgciBzaG9ydCByIHNob3J0IHIgc2hvcnQgciAqLwpAQCAtNTYwMiwxOSArNTYwMiwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHZpZXdwb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlnZXR2aWV3cG9ydCggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld3Nob3J0b2JqZWN0KGFyZzQpKTsKLQkgIHJldHVybiB2OwotCX0KKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBnZXR2aWV3cG9ydCggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld3Nob3J0b2JqZWN0KGFyZzQpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBnZXR0cCBzaG9ydCByIHNob3J0IHIgc2hvcnQgciBzaG9ydCByICovCkBAIC01NjIyLDE5ICs1NjIyLDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0dHAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWdldHRwKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgLCAmIGFyZzQgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDQgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDMsIG1rbmV3c2hvcnRvYmplY3QoYXJnNCkpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGdldHRwKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgLCAmIGFyZzQgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDQgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDMsIG1rbmV3c2hvcnRvYmplY3QoYXJnNCkpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAvKiB2b2lkIGdldGdwb3MgZmxvYXQgciBmbG9hdCByIGZsb2F0IHIgZmxvYXQgciAqLwpAQCAtNTY0MiwxOSArNTY0MiwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGdwb3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWdldGdwb3MoICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyAsICYgYXJnNCApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNCApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdmbG9hdG9iamVjdChhcmcxKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdmbG9hdG9iamVjdChhcmcyKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdmbG9hdG9iamVjdChhcmczKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdmbG9hdG9iamVjdChhcmc0KSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgZ2V0Z3BvcyggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2Zsb2F0b2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld2Zsb2F0b2JqZWN0KGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld2Zsb2F0b2JqZWN0KGFyZzMpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld2Zsb2F0b2JqZWN0KGFyZzQpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCB3aW5wb3NpdGlvbiBsb25nIHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTU2NjIsMjEgKzU2NjIsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93aW5wb3NpdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JbG9uZyBhcmc0IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2lucG9zaXRpb24oIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgbG9uZyBhcmc0IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2lucG9zaXRpb24oIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZ1JHQmNvbG9yIHNob3J0IHIgc2hvcnQgciBzaG9ydCByICovCkBAIC01Njg0LDE3ICs1Njg0LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ1JHQmNvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlnUkdCY29sb3IoICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMyApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdzaG9ydG9iamVjdChhcmczKSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgZ1JHQmNvbG9yKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDMgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAvKiB2b2lkIGdSR0JtYXNrIHNob3J0IHIgc2hvcnQgciBzaG9ydCByICovCkBAIC01NzAyLDE3ICs1NzAyLDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ1JHQm1hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWdSR0JtYXNrKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDMgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGdSR0JtYXNrKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDMgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAvKiB2b2lkIGdldHNjcm1hc2sgc2hvcnQgciBzaG9ydCByIHNob3J0IHIgc2hvcnQgciAqLwpAQCAtNTcyMCwxOSArNTcyMCwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHNjcm1hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWdldHNjcm1hc2soICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyAsICYgYXJnNCApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNCApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdzaG9ydG9iamVjdChhcmczKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdzaG9ydG9iamVjdChhcmc0KSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgZ2V0c2NybWFzayggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld3Nob3J0b2JqZWN0KGFyZzQpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBnZXRtY29sb3Igc2hvcnQgcyBzaG9ydCByIHNob3J0IHIgc2hvcnQgciAqLwpAQCAtNTc0MCwyMCArNTc0MCwyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldG1jb2xvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlnZXRtY29sb3IoIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgLCAmIGFyZzQgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDMgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnNCkpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ2V0bWNvbG9yKCBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAzICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzQpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBtYXB3IGxvbmcgcyBzaG9ydCBzIHNob3J0IHMgZmxvYXQgciBmbG9hdCByIGZsb2F0IHIgZmxvYXQgciBmbG9hdCByIGZsb2F0IHIgKi8KQEAgLTU3NjEsMzIgKzU3NjEsMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tYXB3KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWZsb2F0IGFyZzUgOwotCWZsb2F0IGFyZzYgOwotCWZsb2F0IGFyZzcgOwotCWZsb2F0IGFyZzggOwotCWZsb2F0IGFyZzkgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWFwdyggYXJnMSAsIGFyZzIgLCBhcmczICwgJiBhcmc0ICwgJiBhcmc1ICwgJiBhcmc2ICwgJiBhcmc3ICwgJiBhcmc4ICwgJiBhcmc5ICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA2ICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2Zsb2F0b2JqZWN0KGFyZzQpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld2Zsb2F0b2JqZWN0KGFyZzUpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld2Zsb2F0b2JqZWN0KGFyZzYpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld2Zsb2F0b2JqZWN0KGFyZzcpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCA0LCBta25ld2Zsb2F0b2JqZWN0KGFyZzgpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCA1LCBta25ld2Zsb2F0b2JqZWN0KGFyZzkpKTsKLQkgIHJldHVybiB2OwotCX0KKyAgICBsb25nIGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGZsb2F0IGFyZzUgOworICAgIGZsb2F0IGFyZzYgOworICAgIGZsb2F0IGFyZzcgOworICAgIGZsb2F0IGFyZzggOworICAgIGZsb2F0IGFyZzkgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFwdyggYXJnMSAsIGFyZzIgLCBhcmczICwgJiBhcmc0ICwgJiBhcmc1ICwgJiBhcmc2ICwgJiBhcmc3ICwgJiBhcmc4ICwgJiBhcmc5ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA2ICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2Zsb2F0b2JqZWN0KGFyZzQpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld2Zsb2F0b2JqZWN0KGFyZzUpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld2Zsb2F0b2JqZWN0KGFyZzYpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld2Zsb2F0b2JqZWN0KGFyZzcpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCA0LCBta25ld2Zsb2F0b2JqZWN0KGFyZzgpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCA1LCBta25ld2Zsb2F0b2JqZWN0KGFyZzkpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBtYXB3MiBsb25nIHMgc2hvcnQgcyBzaG9ydCBzIGZsb2F0IHIgZmxvYXQgciAqLwpAQCAtNTc5NCwyNCArNTc5NCwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21hcHcyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWZsb2F0IGFyZzUgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWFwdzIoIGFyZzEgLCBhcmcyICwgYXJnMyAsICYgYXJnNCAsICYgYXJnNSApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdmbG9hdG9iamVjdChhcmc0KSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdmbG9hdG9iamVjdChhcmc1KSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgbG9uZyBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBmbG9hdCBhcmc1IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1hcHcyKCBhcmcxICwgYXJnMiAsIGFyZzMgLCAmIGFyZzQgLCAmIGFyZzUgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3ZmxvYXRvYmplY3QoYXJnNCkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3ZmxvYXRvYmplY3QoYXJnNSkpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAvKiB2b2lkIGdldGN1cnNvciBzaG9ydCByIHVfc2hvcnQgciB1X3Nob3J0IHIgbG9uZyByICovCkBAIC01ODE5LDE5ICs1ODE5LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0Y3Vyc29yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQl1bnNpZ25lZCBzaG9ydCBhcmcyIDsKLQl1bnNpZ25lZCBzaG9ydCBhcmczIDsKLQlsb25nIGFyZzQgOwotCWdldGN1cnNvciggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KChzaG9ydCkgYXJnMikpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoKHNob3J0KSBhcmczKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdsb25nb2JqZWN0KGFyZzQpKTsKLQkgIHJldHVybiB2OwotCX0KKyAgICBzaG9ydCBhcmcxIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBhcmcyIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGdldGN1cnNvciggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KChzaG9ydCkgYXJnMikpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoKHNob3J0KSBhcmczKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdsb25nb2JqZWN0KGFyZzQpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBjbW9kZSAqLwpAQCAtNTgzOSw5ICs1ODM5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY21vZGUoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNtb2RlKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjb25jYXZlIGxvbmcgcyAqLwpAQCAtNTg0OSwxMiArNTg0OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NvbmNhdmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWNvbmNhdmUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY29uY2F2ZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjdXJzdHlwZSBsb25nIHMgKi8KQEAgLTU4NjIsMTIgKzU4NjIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jdXJzdHlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3Vyc3R5cGUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3Vyc3R5cGUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZHJhd21vZGUgbG9uZyBzICovCkBAIC01ODc1LDEyICs1ODc1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZHJhd21vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWRyYXdtb2RlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRyYXdtb2RlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdhbW1hcmFtcCBzaG9ydCBzWzI1Nl0gc2hvcnQgc1syNTZdIHNob3J0IHNbMjU2XSAqLwpAQCAtNTg4OCwxOCArNTg4OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dhbW1hcmFtcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSBbIDI1NiBdIDsKLQlzaG9ydCBhcmcyIFsgMjU2IF0gOwotCXNob3J0IGFyZzMgWyAyNTYgXSA7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAwLCAyNTYgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAxLCAyNTYgLCBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAyLCAyNTYgLCBhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZ2FtbWFyYW1wKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSBbIDI1NiBdIDsKKyAgICBzaG9ydCBhcmcyIFsgMjU2IF0gOworICAgIHNob3J0IGFyZzMgWyAyNTYgXSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAwLCAyNTYgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAxLCAyNTYgLCBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAyLCAyNTYgLCBhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ2FtbWFyYW1wKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIGxvbmcgZ2V0YmFja2ZhY2UgKi8KQEAgLTU5MDcsOSArNTkwNyw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0YmFja2ZhY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGJhY2tmYWNlKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRiYWNrZmFjZSggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0ZGVzY2VuZGVyICovCkBAIC01OTE3LDkgKzU5MTcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGRlc2NlbmRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0ZGVzY2VuZGVyKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRkZXNjZW5kZXIoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGRyYXdtb2RlICovCkBAIC01OTI3LDkgKzU5MjcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGRyYXdtb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRkcmF3bW9kZSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0ZHJhd21vZGUoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldG1tb2RlICovCkBAIC01OTM3LDkgKzU5MzcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldG1tb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRtbW9kZSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0bW1vZGUoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldHNtICovCkBAIC01OTQ3LDkgKzU5NDcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHNtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRzbSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0c20oICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldHZpZGVvIGxvbmcgcyAqLwpAQCAtNTk1NywxMiArNTk1NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHZpZGVvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSBnZXR2aWRlbyggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBnZXR2aWRlbyggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogdm9pZCBpbWFrZWJhY2tncm91bmQgKi8KQEAgLTU5NzAsOSArNTk3MCw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfaW1ha2ViYWNrZ3JvdW5kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbWFrZWJhY2tncm91bmQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGltYWtlYmFja2dyb3VuZCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbG1iaW5kIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNTk4MCwxNSArNTk4MCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xtYmluZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWxtYmluZCggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxtYmluZCggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbG1kZWYgbG9uZyBzIGxvbmcgcyBsb25nIHMgZmxvYXQgc1thcmczXSAqLwpAQCAtNTk5NiwyNCArNTk5NiwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xtZGVmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlmbG9hdCAqIGFyZzQgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnNCA9IFB5TWVtX05FVyhmbG9hdCAsIGFyZzMgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAzLCAyLCBhcmczICwgYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWxtZGVmKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlNZW1fREVMKGFyZzQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBmbG9hdCAqIGFyZzQgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoYXJnNCA9IFB5TWVtX05FVyhmbG9hdCAsIGFyZzMgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAzLCAyLCBhcmczICwgYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxtZGVmKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlNZW1fREVMKGFyZzQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtbW9kZSBsb25nIHMgKi8KQEAgLTYwMjEsMTIgKzYwMjEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tbW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbW1vZGUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW1vZGUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbm9ybWFsIGZsb2F0IHNbM10gKi8KQEAgLTYwMzQsMTIgKzYwMzQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ub3JtYWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyAzIF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlub3JtYWwoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDMgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5vcm1hbCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBvdmVybGF5IGxvbmcgcyAqLwpAQCAtNjA0NywxMiArNjA0NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX292ZXJsYXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCW92ZXJsYXkoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3ZlcmxheSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBSR0JyYW5nZSBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTYwNjAsMzMgKzYwNjAsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9SR0JyYW5nZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0Jc2hvcnQgYXJnNSA7Ci0Jc2hvcnQgYXJnNiA7Ci0Jc2hvcnQgYXJnNyA7Ci0Jc2hvcnQgYXJnOCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNiwgJmFyZzcpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA3LCAmYXJnOCkpCi0JCXJldHVybiBOVUxMOwotCVJHQnJhbmdlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgLCBhcmc3ICwgYXJnOCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBzaG9ydCBhcmc1IDsKKyAgICBzaG9ydCBhcmc2IDsKKyAgICBzaG9ydCBhcmc3IDsKKyAgICBzaG9ydCBhcmc4IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNSwgJmFyZzYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA2LCAmYXJnNykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDcsICZhcmc4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUkdCcmFuZ2UoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiAsIGFyZzcgLCBhcmc4ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldHZpZGVvIGxvbmcgcyBsb25nIHMgKi8KQEAgLTYwOTQsMTUgKzYwOTQsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zZXR2aWRlbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0dmlkZW8oIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldHZpZGVvKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzaGFkZW1vZGVsIGxvbmcgcyAqLwpAQCAtNjExMCwxMiArNjExMCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NoYWRlbW9kZWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXNoYWRlbW9kZWwoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2hhZGVtb2RlbCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB1bmRlcmxheSBsb25nIHMgKi8KQEAgLTYxMjMsMTIgKzYxMjMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF91bmRlcmxheShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdW5kZXJsYXkoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdW5kZXJsYXkoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmduY2xvc2VkbGluZSAqLwpAQCAtNjEzNiw5ICs2MTM2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iZ25jbG9zZWRsaW5lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQliZ25jbG9zZWRsaW5lKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBiZ25jbG9zZWRsaW5lKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBiZ25saW5lICovCkBAIC02MTQ2LDkgKzYxNDYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2JnbmxpbmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWJnbmxpbmUoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGJnbmxpbmUoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJnbnBvaW50ICovCkBAIC02MTU2LDkgKzYxNTYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2JnbnBvaW50KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQliZ25wb2ludCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgYmducG9pbnQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJnbnBvbHlnb24gKi8KQEAgLTYxNjYsOSArNjE2Niw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmducG9seWdvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JYmducG9seWdvbiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgYmducG9seWdvbiggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmduc3VyZmFjZSAqLwpAQCAtNjE3Niw5ICs2MTc2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iZ25zdXJmYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQliZ25zdXJmYWNlKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBiZ25zdXJmYWNlKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBiZ250bWVzaCAqLwpAQCAtNjE4Niw5ICs2MTg2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iZ250bWVzaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JYmdudG1lc2goICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGJnbnRtZXNoKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBiZ250cmltICovCkBAIC02MTk2LDkgKzYxOTYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2JnbnRyaW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWJnbnRyaW0oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGJnbnRyaW0oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGVuZGNsb3NlZGxpbmUgKi8KQEAgLTYyMDYsOSArNjIwNiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZW5kY2xvc2VkbGluZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZW5kY2xvc2VkbGluZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZW5kY2xvc2VkbGluZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZW5kbGluZSAqLwpAQCAtNjIxNiw5ICs2MjE2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9lbmRsaW5lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQllbmRsaW5lKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmRsaW5lKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlbmRwb2ludCAqLwpAQCAtNjIyNiw5ICs2MjI2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9lbmRwb2ludChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZW5kcG9pbnQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuZHBvaW50KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlbmRwb2x5Z29uICovCkBAIC02MjM2LDkgKzYyMzYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2VuZHBvbHlnb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWVuZHBvbHlnb24oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuZHBvbHlnb24oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGVuZHN1cmZhY2UgKi8KQEAgLTYyNDYsOSArNjI0Niw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZW5kc3VyZmFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZW5kc3VyZmFjZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZW5kc3VyZmFjZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZW5kdG1lc2ggKi8KQEAgLTYyNTYsOSArNjI1Niw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZW5kdG1lc2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWVuZHRtZXNoKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmR0bWVzaCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZW5kdHJpbSAqLwpAQCAtNjI2Niw5ICs2MjY2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9lbmR0cmltKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQllbmR0cmltKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmR0cmltKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBibGVuZGZ1bmN0aW9uIGxvbmcgcyBsb25nIHMgKi8KQEAgLTYyNzYsMTUgKzYyNzYsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ibGVuZGZ1bmN0aW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlibGVuZGZ1bmN0aW9uKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBibGVuZGZ1bmN0aW9uKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjM2YgZmxvYXQgc1szXSAqLwpAQCAtNjI5MiwxMiArNjI5MiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2MzZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWMzZiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIFsgMyBdIDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYzNmKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGMzaSBsb25nIHNbM10gKi8KQEAgLTYzMDUsMTIgKzYzMDUsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jM2koUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYzNpKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYzNpKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGMzcyBzaG9ydCBzWzNdICovCkBAIC02MzE4LDEyICs2MzE4LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYzNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIFsgMyBdIDsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYzNzKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgWyAzIF0gOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjM3MoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYzRmIGZsb2F0IHNbNF0gKi8KQEAgLTYzMzEsMTIgKzYzMzEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jNGYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljNGYoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDQgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGM0ZiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjNGkgbG9uZyBzWzRdICovCkBAIC02MzQ0LDEyICs2MzQ0LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYzRpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWM0aSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgWyA0IF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGM0aSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjNHMgc2hvcnQgc1s0XSAqLwpAQCAtNjM1NywxMiArNjM1NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2M0cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSBbIDQgXSA7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWM0cyggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIFsgNCBdIDsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDQgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYzRzKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNvbG9yZiBmbG9hdCBzICovCkBAIC02MzcwLDEyICs2MzcwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY29sb3JmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWNvbG9yZiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNvbG9yZiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjcGFjayBsb25nIHMgKi8KQEAgLTYzODMsMTIgKzYzODMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jcGFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3BhY2soIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3BhY2soIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY3pjbGVhciBsb25nIHMgbG9uZyBzICovCkBAIC02Mzk2LDE1ICs2Mzk2LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY3pjbGVhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3pjbGVhciggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3pjbGVhciggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZGdsY2xvc2UgbG9uZyBzICovCkBAIC02NDEyLDEyICs2NDEyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGdsY2xvc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWRnbGNsb3NlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRnbGNsb3NlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBsb25nIGRnbG9wZW4gY2hhciAqcyBsb25nIHMgKi8KQEAgLTY0MjUsMTUgKzY0MjUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kZ2xvcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlzdHJpbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gZGdsb3BlbiggYXJnMSAsIGFyZzIgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgc3RyaW5nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHZhbCA9IGRnbG9wZW4oIGFyZzEgLCBhcmcyICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGdkZXNjIGxvbmcgcyAqLwpAQCAtNjQ0MSwxMiArNjQ0MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGdkZXNjKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSBnZXRnZGVzYyggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBnZXRnZGVzYyggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogdm9pZCBnZXRudXJic3Byb3BlcnR5IGxvbmcgcyBmbG9hdCByICovCkBAIC02NDU0LDEyICs2NDU0LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0bnVyYnNwcm9wZXJ0eShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZ2V0bnVyYnNwcm9wZXJ0eSggYXJnMSAsICYgYXJnMiApOwotCXJldHVybiBta25ld2Zsb2F0b2JqZWN0KGFyZzIpOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGdldG51cmJzcHJvcGVydHkoIGFyZzEgLCAmIGFyZzIgKTsKKyAgICByZXR1cm4gbWtuZXdmbG9hdG9iamVjdChhcmcyKTsKIH0KIAogLyogdm9pZCBnbGNvbXBhdCBsb25nIHMgbG9uZyBzICovCkBAIC02NDY3LDE1ICs2NDY3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2xjb21wYXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWdsY29tcGF0KCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBnbGNvbXBhdCggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgaWNvbnNpemUgbG9uZyBzIGxvbmcgcyAqLwpAQCAtNjQ4MywxNSArNjQ4MywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2ljb25zaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpY29uc2l6ZSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWNvbnNpemUoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGljb250aXRsZSBjaGFyICpzICovCkBAIC02NDk5LDEyICs2NDk5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfaWNvbnRpdGxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJpbmcgYXJnMSA7Ci0JaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWNvbnRpdGxlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHN0cmluZyBhcmcxIDsKKyAgICBpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpY29udGl0bGUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbFJHQnJhbmdlIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTY1MTIsMzMgKzY1MTIsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9sUkdCcmFuZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCXNob3J0IGFyZzYgOwotCWxvbmcgYXJnNyA7Ci0JbG9uZyBhcmc4IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNSwgJmFyZzYpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDgsIDYsICZhcmc3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA4LCA3LCAmYXJnOCkpCi0JCXJldHVybiBOVUxMOwotCWxSR0JyYW5nZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICwgYXJnNyAsIGFyZzggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgc2hvcnQgYXJnNiA7CisgICAgbG9uZyBhcmc3IDsKKyAgICBsb25nIGFyZzggOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA1LCAmYXJnNikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgOCwgNiwgJmFyZzcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDgsIDcsICZhcmc4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbFJHQnJhbmdlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgLCBhcmc3ICwgYXJnOCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsaW5lc21vb3RoIGxvbmcgcyAqLwpAQCAtNjU0NiwxMiArNjU0NiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xpbmVzbW9vdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxpbmVzbW9vdGgoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGluZXNtb290aCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsbWNvbG9yIGxvbmcgcyAqLwpAQCAtNjU1OSwxMiArNjU1OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xtY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxtY29sb3IoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbG1jb2xvciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsb2dpY29wIGxvbmcgcyAqLwpAQCAtNjU3MiwxMiArNjU3MiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xvZ2ljb3AoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxvZ2ljb3AoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbG9naWNvcCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsc2V0ZGVwdGggbG9uZyBzIGxvbmcgcyAqLwpAQCAtNjU4NSwxNSArNjU4NSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xzZXRkZXB0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbHNldGRlcHRoKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsc2V0ZGVwdGgoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxzaGFkZXJhbmdlIHNob3J0IHMgc2hvcnQgcyBsb25nIHMgbG9uZyBzICovCkBAIC02NjAxLDIxICs2NjAxLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbHNoYWRlcmFuZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JbG9uZyBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlsc2hhZGVyYW5nZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGxvbmcgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbHNoYWRlcmFuZ2UoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbjNmIGZsb2F0IHNbM10gKi8KQEAgLTY2MjMsMTIgKzY2MjMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9uM2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyAzIF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQluM2YoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDMgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG4zZiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBub2JvcmRlciAqLwpAQCAtNjYzNiw5ICs2NjM2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ub2JvcmRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jbm9ib3JkZXIoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIG5vYm9yZGVyKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbnRzbW9vdGggbG9uZyBzICovCkBAIC02NjQ2LDEyICs2NjQ2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG50c21vb3RoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlwbnRzbW9vdGgoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG50c21vb3RoKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJlYWRzb3VyY2UgbG9uZyBzICovCkBAIC02NjU5LDEyICs2NjU5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVhZHNvdXJjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVhZHNvdXJjZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZWFkc291cmNlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJlY3R6b29tIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNjY3MiwxNSArNjY3MiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JlY3R6b29tKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVjdHpvb20oIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZWN0em9vbSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2JveCBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC02Njg4LDIxICs2Njg4LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2JveChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlzYm94KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2JveCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzYm94aSBsb25nIHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTY3MTAsMjEgKzY3MTAsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zYm94aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JbG9uZyBhcmc0IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2JveGkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgbG9uZyBhcmc0IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2JveGkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2JveHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNjczMiwyMSArNjczMiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Nib3hzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXNib3hzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2JveHMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2JveGYgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNjc1NCwyMSArNjc1NCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Nib3hmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXNib3hmKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2JveGYoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2JveGZpIGxvbmcgcyBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtNjc3NiwyMSArNjc3NiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Nib3hmaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JbG9uZyBhcmc0IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2JveGZpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGxvbmcgYXJnNCA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNib3hmaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzYm94ZnMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNjc5OCwyMSArNjc5OCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Nib3hmcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlzYm94ZnMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzYm94ZnMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2V0bnVyYnNwcm9wZXJ0eSBsb25nIHMgZmxvYXQgcyAqLwpAQCAtNjgyMCwxNSArNjgyMCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NldG51cmJzcHJvcGVydHkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0bnVyYnNwcm9wZXJ0eSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRudXJic3Byb3BlcnR5KCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXRwdXAgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTY4MzYsMTggKzY4MzYsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zZXRwdXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXNldHB1cCggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldHB1cCggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNtb290aGxpbmUgbG9uZyBzICovCkBAIC02ODU1LDEyICs2ODU1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc21vb3RobGluZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc21vb3RobGluZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzbW9vdGhsaW5lKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHN1YnBpeGVsIGxvbmcgcyAqLwpAQCAtNjg2OCwxMiArNjg2OCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3N1YnBpeGVsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlzdWJwaXhlbCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdWJwaXhlbCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzd2FwdG1lc2ggKi8KQEAgLTY4ODEsOSArNjg4MSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc3dhcHRtZXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzd2FwdG1lc2goICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHN3YXB0bWVzaCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIGxvbmcgc3dpbm9wZW4gbG9uZyBzICovCkBAIC02ODkxLDEyICs2ODkxLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc3dpbm9wZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IHN3aW5vcGVuKCBhcmcxICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHZhbCA9IHN3aW5vcGVuKCBhcmcxICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiB2b2lkIHYyZiBmbG9hdCBzWzJdICovCkBAIC02OTA0LDEyICs2OTA0LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjJmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgMiBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDIgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjJmKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyAyIF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2MmYoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjJpIGxvbmcgc1syXSAqLwpAQCAtNjkxNywxMiArNjkxNywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3YyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIFsgMiBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2MmkoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIFsgMiBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2MmkoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjJzIHNob3J0IHNbMl0gKi8KQEAgLTY5MzAsMTIgKzY5MzAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92MnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgWyAyIF0gOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2MnMoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSBbIDIgXSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAyICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYycyggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2M2YgZmxvYXQgc1szXSAqLwpAQCAtNjk0MywxMiArNjk0MywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3YzZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXYzZiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIFsgMyBdIDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjNmKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHYzaSBsb25nIHNbM10gKi8KQEAgLTY5NTYsMTIgKzY5NTYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92M2koUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjNpKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjNpKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHYzcyBzaG9ydCBzWzNdICovCkBAIC02OTY5LDEyICs2OTY5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIFsgMyBdIDsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjNzKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgWyAzIF0gOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2M3MoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjRmIGZsb2F0IHNbNF0gKi8KQEAgLTY5ODIsMTIgKzY5ODIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92NGYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2NGYoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDQgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHY0ZiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2NGkgbG9uZyBzWzRdICovCkBAIC02OTk1LDEyICs2OTk1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjRpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXY0aSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgWyA0IF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHY0aSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2NHMgc2hvcnQgc1s0XSAqLwpAQCAtNzAwOCwxMiArNzAwOCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Y0cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSBbIDQgXSA7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXY0cyggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIFsgNCBdIDsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDQgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjRzKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHZpZGVvY21kIGxvbmcgcyAqLwpAQCAtNzAyMSwxMiArNzAyMSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3ZpZGVvY21kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2aWRlb2NtZCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2aWRlb2NtZCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogbG9uZyB3aW5kZXB0aCBsb25nIHMgKi8KQEAgLTcwMzQsMTIgKzcwMzQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93aW5kZXB0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gd2luZGVwdGgoIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gd2luZGVwdGgoIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIHZvaWQgd21wYWNrIGxvbmcgcyAqLwpAQCAtNzA0NywxMiArNzA0NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dtcGFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd21wYWNrKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdtcGFjayggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB6ZHJhdyBsb25nIHMgKi8KQEAgLTcwNjAsMTIgKzcwNjAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF96ZHJhdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JemRyYXcoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgemRyYXcoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgemZ1bmN0aW9uIGxvbmcgcyAqLwpAQCAtNzA3MywxMiArNzA3MywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3pmdW5jdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JemZ1bmN0aW9uKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHpmdW5jdGlvbiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB6c291cmNlIGxvbmcgcyAqLwpAQCAtNzA4NiwxMiArNzA4NiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3pzb3VyY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXpzb3VyY2UoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgenNvdXJjZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB6d3JpdGVtYXNrIGxvbmcgcyAqLwpAQCAtNzA5OSwxMiArNzA5OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3p3cml0ZW1hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXp3cml0ZW1hc2soIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgendyaXRlbWFzayggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2MmQgZG91YmxlIHNbMl0gKi8KQEAgLTcxMTIsMTIgKzcxMTIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92MmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSBhcmcxIFsgMiBdIDsKLQlpZiAoIWdldGlkb3VibGVhcnJheShhcmdzLCAxLCAwLCAyICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXYyZCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBkb3VibGUgYXJnMSBbIDIgXSA7CisgICAgaWYgKCFnZXRpZG91YmxlYXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2MmQoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjNkIGRvdWJsZSBzWzNdICovCkBAIC03MTI1LDEyICs3MTI1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjNkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGUgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpZG91YmxlYXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2M2QoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZG91YmxlIGFyZzEgWyAzIF0gOworICAgIGlmICghZ2V0aWRvdWJsZWFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjNkKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHY0ZCBkb3VibGUgc1s0XSAqLwpAQCAtNzEzOCwxMiArNzEzOCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Y0ZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aWRvdWJsZWFycmF5KGFyZ3MsIDEsIDAsIDQgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjRkKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGRvdWJsZSBhcmcxIFsgNCBdIDsKKyAgICBpZiAoIWdldGlkb3VibGVhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHY0ZCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwaXhtb2RlIGxvbmcgcyBsb25nIHMgKi8KQEAgLTcxNTEsMTUgKzcxNTEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9waXhtb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwaXhtb2RlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwaXhtb2RlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogbG9uZyBxZ2V0ZmQgKi8KQEAgLTcxNjcsOSArNzE2Nyw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcWdldGZkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBxZ2V0ZmQoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IHFnZXRmZCggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIHZvaWQgZGl0aGVyIGxvbmcgcyAqLwpAQCAtNzE3Nyw0NTcgKzcxNzcsNDU3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGl0aGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlkaXRoZXIoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGl0aGVyKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGdsX21ldGhvZHNbXSA9IHsKLQl7InFyZWFkIiwgZ2xfcXJlYWQsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InZhcnJheSIsIGdsX3ZhcnJheSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im52YXJyYXkiLCBnbF9udmFycmF5LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InZuYXJyYXkiLCBnbF92bmFycmF5LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im51cmJzc3VyZmFjZSIsIGdsX251cmJzc3VyZmFjZSwgICAgTUVUSF9PTERBUkdTfSwKLQl7Im51cmJzY3VydmUiLCBnbF9udXJic2N1cnZlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InB3bGN1cnZlIiwgZ2xfcHdsY3VydmUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBpY2siLCBnbF9waWNrLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImVuZHBpY2siLCBnbF9lbmRwaWNrLCAgICAgICAgICAgICAgTUVUSF9OT0FSR1N9LAotCXsiZ3NlbGVjdCIsIGdsX2dzZWxlY3QsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZW5kc2VsZWN0IiwgZ2xfZW5kc2VsZWN0LCAgICAgICAgICBNRVRIX05PQVJHU30sCi0JeyJnZXRtYXRyaXgiLCBnbF9nZXRtYXRyaXgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhbHRnZXRtYXRyaXgiLCBnbF9hbHRnZXRtYXRyaXgsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJscmVjdHdyaXRlIiwgZ2xfbHJlY3R3cml0ZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJscmVjdHJlYWQiLCBnbF9scmVjdHJlYWQsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWFkZGlzcGxheSIsIGdsX3JlYWRkaXNwbGF5LCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwYWNrcmVjdCIsIGdsX3BhY2tyZWN0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ1bnBhY2tyZWN0IiwgZ2xfdW5wYWNrcmVjdCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJndmVyc2lvbiIsIGdsX2d2ZXJzaW9uLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbGVhciIsIGdsX2NsZWFyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRzaGFkZSIsIGdsX2dldHNoYWRlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkZXZwb3J0IiwgZ2xfZGV2cG9ydCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZHIyaSIsIGdsX3JkcjJpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWN0ZnMiLCBnbF9yZWN0ZnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWN0cyIsIGdsX3JlY3RzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJybXYyaSIsIGdsX3JtdjJpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJub3BvcnQiLCBnbF9ub3BvcnQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb3B2aWV3cG9ydCIsIGdsX3BvcHZpZXdwb3J0LCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbGVhcmhpdGNvZGUiLCBnbF9jbGVhcmhpdGNvZGUsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbG9zZW9iaiIsIGdsX2Nsb3Nlb2JqLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjdXJzb2ZmIiwgZ2xfY3Vyc29mZiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjdXJzb24iLCBnbF9jdXJzb24sICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkb3VibGVidWZmZXIiLCBnbF9kb3VibGVidWZmZXIsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJmaW5pc2giLCBnbF9maW5pc2gsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnY29uZmlnIiwgZ2xfZ2NvbmZpZywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnaW5pdCIsIGdsX2dpbml0LCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJncmVzZXQiLCBnbF9ncmVzZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtdWx0aW1hcCIsIGdsX211bHRpbWFwLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJvbmVtYXAiLCBnbF9vbmVtYXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb3BhdHRyaWJ1dGVzIiwgZ2xfcG9wYXR0cmlidXRlcywgIE1FVEhfT0xEQVJHU30sCi0JeyJwb3BtYXRyaXgiLCBnbF9wb3BtYXRyaXgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwdXNoYXR0cmlidXRlcyIsIGdsX3B1c2hhdHRyaWJ1dGVzLE1FVEhfT0xEQVJHU30sCi0JeyJwdXNobWF0cml4IiwgZ2xfcHVzaG1hdHJpeCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwdXNodmlld3BvcnQiLCBnbF9wdXNodmlld3BvcnQsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJxcmVzZXQiLCBnbF9xcmVzZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJSR0Jtb2RlIiwgZ2xfUkdCbW9kZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzaW5nbGVidWZmZXIiLCBnbF9zaW5nbGVidWZmZXIsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzd2FwYnVmZmVycyIsIGdsX3N3YXBidWZmZXJzLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnc3luYyIsIGdsX2dzeW5jLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZmx1c2giLCBnbF9nZmx1c2gsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ0cG9uIiwgZ2xfdHBvbiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ0cG9mZiIsIGdsX3Rwb2ZmLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbGtvbiIsIGdsX2Nsa29uLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbGtvZmYiLCBnbF9jbGtvZmYsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyaW5nYmVsbCIsIGdsX3JpbmdiZWxsLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnYmVnaW4iLCBnbF9nYmVnaW4sICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ0ZXh0aW5pdCIsIGdsX3RleHRpbml0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJpbml0bmFtZXMiLCBnbF9pbml0bmFtZXMsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwY2xvcyIsIGdsX3BjbG9zLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb3BuYW1lIiwgZ2xfcG9wbmFtZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzcGNsb3MiLCBnbF9zcGNsb3MsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ6Y2xlYXIiLCBnbF96Y2xlYXIsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzY3JlZW5zcGFjZSIsIGdsX3NjcmVlbnNwYWNlLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZXNoYXBldmlld3BvcnQiLCBnbF9yZXNoYXBldmlld3BvcnQsIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5wdXNoIiwgZ2xfd2lucHVzaCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5wb3AiLCBnbF93aW5wb3AsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJmb3JlZ3JvdW5kIiwgZ2xfZm9yZWdyb3VuZCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRmdWxsc2NybiIsIGdsX2VuZGZ1bGxzY3JuLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRwdXBtb2RlIiwgZ2xfZW5kcHVwbW9kZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJmdWxsc2NybiIsIGdsX2Z1bGxzY3JuLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwdXBtb2RlIiwgZ2xfcHVwbW9kZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5jb25zdHJhaW50cyIsIGdsX3dpbmNvbnN0cmFpbnRzLCBNRVRIX09MREFSR1N9LAotCXsicGFnZWNvbG9yIiwgZ2xfcGFnZWNvbG9yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidGV4dGNvbG9yIiwgZ2xfdGV4dGNvbG9yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY29sb3IiLCBnbF9jb2xvciwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY3VydmVpdCIsIGdsX2N1cnZlaXQsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZm9udCIsIGdsX2ZvbnQsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibGluZXdpZHRoIiwgZ2xfbGluZXdpZHRoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2V0bGluZXN0eWxlIiwgZ2xfc2V0bGluZXN0eWxlLCAgICBNRVRIX09MREFSR1N9LAotCXsic2V0bWFwIiwgZ2xfc2V0bWFwLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic3dhcGludGVydmFsIiwgZ2xfc3dhcGludGVydmFsLCAgICBNRVRIX09MREFSR1N9LAotCXsid3JpdGVtYXNrIiwgZ2xfd3JpdGVtYXNrLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidGV4dHdyaXRlbWFzayIsIGdsX3RleHR3cml0ZW1hc2ssICBNRVRIX09MREFSR1N9LAotCXsicWRldmljZSIsIGdsX3FkZXZpY2UsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidW5xZGV2aWNlIiwgZ2xfdW5xZGV2aWNlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY3VydmViYXNpcyIsIGdsX2N1cnZlYmFzaXMsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY3VydmVwcmVjaXNpb24iLCBnbF9jdXJ2ZXByZWNpc2lvbixNRVRIX09MREFSR1N9LAotCXsibG9hZG5hbWUiLCBnbF9sb2FkbmFtZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicGFzc3Rocm91Z2giLCBnbF9wYXNzdGhyb3VnaCwgICAgICBNRVRIX09MREFSR1N9LAotCXsicHVzaG5hbWUiLCBnbF9wdXNobmFtZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2V0bW9uaXRvciIsIGdsX3NldG1vbml0b3IsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2V0c2hhZGUiLCBnbF9zZXRzaGFkZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2V0cGF0dGVybiIsIGdsX3NldHBhdHRlcm4sICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicGFnZXdyaXRlbWFzayIsIGdsX3BhZ2V3cml0ZW1hc2ssICBNRVRIX09MREFSR1N9LAotCXsiY2FsbG9iaiIsIGdsX2NhbGxvYmosICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZGVsb2JqIiwgZ2xfZGVsb2JqLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZWRpdG9iaiIsIGdsX2VkaXRvYmosICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibWFrZW9iaiIsIGdsX21ha2VvYmosICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibWFrZXRhZyIsIGdsX21ha2V0YWcsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY2h1bmtzaXplIiwgZ2xfY2h1bmtzaXplLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY29tcGFjdGlmeSIsIGdsX2NvbXBhY3RpZnksICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZGVsdGFnIiwgZ2xfZGVsdGFnLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibHNyZXBlYXQiLCBnbF9sc3JlcGVhdCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsib2JqaW5zZXJ0IiwgZ2xfb2JqaW5zZXJ0LCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsib2JqcmVwbGFjZSIsIGdsX29ianJlcGxhY2UsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsid2luY2xvc2UiLCBnbF93aW5jbG9zZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmxhbmt0aW1lIiwgZ2xfYmxhbmt0aW1lLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZnJlZXB1cCIsIGdsX2ZyZWVwdXAsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmFja2J1ZmZlciIsIGdsX2JhY2tidWZmZXIsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZnJvbnRidWZmZXIiLCBnbF9mcm9udGJ1ZmZlciwgICAgICBNRVRIX09MREFSR1N9LAotCXsibHNiYWNrdXAiLCBnbF9sc2JhY2t1cCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicmVzZXRscyIsIGdsX3Jlc2V0bHMsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibGFtcG9uIiwgZ2xfbGFtcG9uLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibGFtcG9mZiIsIGdsX2xhbXBvZmYsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2V0YmVsbCIsIGdsX3NldGJlbGwsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmxhbmtzY3JlZW4iLCBnbF9ibGFua3NjcmVlbiwgICAgICBNRVRIX09MREFSR1N9LAotCXsiZGVwdGhjdWUiLCBnbF9kZXB0aGN1ZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiemJ1ZmZlciIsIGdsX3pidWZmZXIsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmFja2ZhY2UiLCBnbF9iYWNrZmFjZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY21vdjJpIiwgZ2xfY21vdjJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZHJhdzJpIiwgZ2xfZHJhdzJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibW92ZTJpIiwgZ2xfbW92ZTJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicG50MmkiLCBnbF9wbnQyaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicGF0Y2hiYXNpcyIsIGdsX3BhdGNoYmFzaXMsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicGF0Y2hwcmVjaXNpb24iLCBnbF9wYXRjaHByZWNpc2lvbiwgTUVUSF9PTERBUkdTfSwKLQl7InBkcjJpIiwgZ2xfcGRyMmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdjJpIiwgZ2xfcG12MmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHIyaSIsIGdsX3JwZHIyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXYyaSIsIGdsX3JwbXYyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQyaSIsIGdsX3hmcHQyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im9iamRlbGV0ZSIsIGdsX29iamRlbGV0ZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBhdGNoY3VydmVzIiwgZ2xfcGF0Y2hjdXJ2ZXMsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1pbnNpemUiLCBnbF9taW5zaXplLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1heHNpemUiLCBnbF9tYXhzaXplLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImtlZXBhc3BlY3QiLCBnbF9rZWVwYXNwZWN0LCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InByZWZzaXplIiwgZ2xfcHJlZnNpemUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InN0ZXB1bml0IiwgZ2xfc3RlcHVuaXQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImZ1ZGdlIiwgZ2xfZnVkZ2UsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Indpbm1vdmUiLCBnbF93aW5tb3ZlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImF0dGFjaGN1cnNvciIsIGdsX2F0dGFjaGN1cnNvciwgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRlZmxpbmVzdHlsZSIsIGdsX2RlZmxpbmVzdHlsZSwgICAgTUVUSF9PTERBUkdTfSwKLQl7Im5vaXNlIiwgZ2xfbm9pc2UsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBpY2tzaXplIiwgZ2xfcGlja3NpemUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InFlbnRlciIsIGdsX3FlbnRlciwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldGRlcHRoIiwgZ2xfc2V0ZGVwdGgsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNtb3YycyIsIGdsX2Ntb3YycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRyYXcycyIsIGdsX2RyYXcycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1vdmUycyIsIGdsX21vdmUycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBkcjJzIiwgZ2xfcGRyMnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdjJzIiwgZ2xfcG12MnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudDJzIiwgZ2xfcG50MnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJkcjJzIiwgZ2xfcmRyMnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJtdjJzIiwgZ2xfcm12MnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHIycyIsIGdsX3JwZHIycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXYycyIsIGdsX3JwbXYycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQycyIsIGdsX3hmcHQycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNtb3YyIiwgZ2xfY21vdjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRyYXcyIiwgZ2xfZHJhdzIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1vdmUyIiwgZ2xfbW92ZTIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudDIiLCBnbF9wbnQyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBkcjIiLCBnbF9wZHIyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdjIiLCBnbF9wbXYyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJkcjIiLCBnbF9yZHIyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJtdjIiLCBnbF9ybXYyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHIyIiwgZ2xfcnBkcjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXYyIiwgZ2xfcnBtdjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQyIiwgZ2xfeGZwdDIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxvYWRtYXRyaXgiLCBnbF9sb2FkbWF0cml4LCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im11bHRtYXRyaXgiLCBnbF9tdWx0bWF0cml4LCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNydiIsIGdsX2NydiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJjcnYiLCBnbF9yY3J2LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFkZHRvcHVwIiwgZ2xfYWRkdG9wdXAsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNoYXJzdHIiLCBnbF9jaGFyc3RyLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldHBvcnQiLCBnbF9nZXRwb3J0LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InN0cndpZHRoIiwgZ2xfc3Ryd2lkdGgsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Indpbm9wZW4iLCBnbF93aW5vcGVuLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IndpbnRpdGxlIiwgZ2xfd2ludGl0bGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGYiLCBnbF9wb2xmLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGYyIiwgZ2xfcG9sZjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHkiLCBnbF9wb2x5LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHkyIiwgZ2xfcG9seTIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNydm4iLCBnbF9jcnZuLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJjcnZuIiwgZ2xfcmNydm4sICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGYyaSIsIGdsX3BvbGYyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGZpIiwgZ2xfcG9sZmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHkyaSIsIGdsX3BvbHkyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHlpIiwgZ2xfcG9seWksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGYycyIsIGdsX3BvbGYycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGZzIiwgZ2xfcG9sZnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHlzIiwgZ2xfcG9seXMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHkycyIsIGdsX3BvbHkycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRlZmN1cnNvciIsIGdsX2RlZmN1cnNvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IndyaXRlcGl4ZWxzIiwgZ2xfd3JpdGVwaXhlbHMsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRlZmJhc2lzIiwgZ2xfZGVmYmFzaXMsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imdld3JpdGUiLCBnbF9nZXdyaXRlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJvdGF0ZSIsIGdsX3JvdGF0ZSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJvdCIsIGdsX3JvdCwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmNmaSIsIGdsX2NpcmNmaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmNpIiwgZ2xfY2lyY2ksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNtb3ZpIiwgZ2xfY21vdmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRyYXdpIiwgZ2xfZHJhd2ksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1vdmVpIiwgZ2xfbW92ZWksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudGkiLCBnbF9wbnRpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im5ld3RhZyIsIGdsX25ld3RhZywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBkcmkiLCBnbF9wZHJpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdmkiLCBnbF9wbXZpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJkcmkiLCBnbF9yZHJpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJtdmkiLCBnbF9ybXZpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHJpIiwgZ2xfcnBkcmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXZpIiwgZ2xfcnBtdmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHRpIiwgZ2xfeGZwdGksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmMiLCBnbF9jaXJjLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmNmIiwgZ2xfY2lyY2YsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNtb3YiLCBnbF9jbW92LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRyYXciLCBnbF9kcmF3LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1vdmUiLCBnbF9tb3ZlLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudCIsIGdsX3BudCwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNjYWxlIiwgZ2xfc2NhbGUsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InRyYW5zbGF0ZSIsIGdsX3RyYW5zbGF0ZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBkciIsIGdsX3BkciwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdiIsIGdsX3BtdiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJkciIsIGdsX3JkciwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJtdiIsIGdsX3JtdiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHIiLCBnbF9ycGRyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXYiLCBnbF9ycG12LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQiLCBnbF94ZnB0LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IlJHQmNvbG9yIiwgZ2xfUkdCY29sb3IsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IlJHQndyaXRlbWFzayIsIGdsX1JHQndyaXRlbWFzaywgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldGN1cnNvciIsIGdsX3NldGN1cnNvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InRpZSIsIGdsX3RpZSwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmNmcyIsIGdsX2NpcmNmcywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmNzIiwgZ2xfY2lyY3MsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNtb3ZzIiwgZ2xfY21vdnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRyYXdzIiwgZ2xfZHJhd3MsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1vdmVzIiwgZ2xfbW92ZXMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBkcnMiLCBnbF9wZHJzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdnMiLCBnbF9wbXZzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudHMiLCBnbF9wbnRzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJkcnMiLCBnbF9yZHJzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJtdnMiLCBnbF9ybXZzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHJzIiwgZ2xfcnBkcnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXZzIiwgZ2xfcnBtdnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHRzIiwgZ2xfeGZwdHMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImN1cm9yaWdpbiIsIGdsX2N1cm9yaWdpbiwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImN5Y2xlbWFwIiwgZ2xfY3ljbGVtYXAsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBhdGNoIiwgZ2xfcGF0Y2gsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGYiLCBnbF9zcGxmLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGYyIiwgZ2xfc3BsZjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGZpIiwgZ2xfc3BsZmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGYyaSIsIGdsX3NwbGYyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGZzIiwgZ2xfc3BsZnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGYycyIsIGdsX3NwbGYycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwYXRjaCIsIGdsX3JwYXRjaCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im9ydGhvMiIsIGdsX29ydGhvMiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3QiLCBnbF9yZWN0LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3RmIiwgZ2xfcmVjdGYsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQ0IiwgZ2xfeGZwdDQsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InRleHRwb3J0IiwgZ2xfdGV4dHBvcnQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1hcGNvbG9yIiwgZ2xfbWFwY29sb3IsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNjcm1hc2siLCBnbF9zY3JtYXNrLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldHZhbHVhdG9yIiwgZ2xfc2V0dmFsdWF0b3IsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InZpZXdwb3J0IiwgZ2xfdmlld3BvcnQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNoYWRlcmFuZ2UiLCBnbF9zaGFkZXJhbmdlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQ0cyIsIGdsX3hmcHQ0cywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3RmaSIsIGdsX3JlY3RmaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3RpIiwgZ2xfcmVjdGksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQ0aSIsIGdsX3hmcHQ0aSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InByZWZwb3NpdGlvbiIsIGdsX3ByZWZwb3NpdGlvbiwgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyYyIsIGdsX2FyYywgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyY2YiLCBnbF9hcmNmLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyY2ZpIiwgZ2xfYXJjZmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyY2kiLCBnbF9hcmNpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJib3gyIiwgZ2xfYmJveDIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJib3gyaSIsIGdsX2Jib3gyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJib3gycyIsIGdsX2Jib3gycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJsaW5rIiwgZ2xfYmxpbmssICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im9ydGhvIiwgZ2xfb3J0aG8sICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IndpbmRvdyIsIGdsX3dpbmRvdywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imxvb2thdCIsIGdsX2xvb2thdCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBlcnNwZWN0aXZlIiwgZ2xfcGVyc3BlY3RpdmUsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGFydmlldyIsIGdsX3BvbGFydmlldywgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyY2ZzIiwgZ2xfYXJjZnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyY3MiLCBnbF9hcmNzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3Rjb3B5IiwgZ2xfcmVjdGNvcHksICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IlJHQmN1cnNvciIsIGdsX1JHQmN1cnNvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGJ1dHRvbiIsIGdsX2dldGJ1dHRvbiwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGNtbW9kZSIsIGdsX2dldGNtbW9kZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGxzYmFja3VwIiwgZ2xfZ2V0bHNiYWNrdXAsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldHJlc2V0bHMiLCBnbF9nZXRyZXNldGxzLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGRjbSIsIGdsX2dldGRjbSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldHpidWZmZXIiLCBnbF9nZXR6YnVmZmVyLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImlzbWV4IiwgZ2xfaXNtZXgsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imlzb2JqIiwgZ2xfaXNvYmosICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImlzcXVldWVkIiwgZ2xfaXNxdWV1ZWQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImlzdGFnIiwgZ2xfaXN0YWcsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imdlbm9iaiIsIGdsX2dlbm9iaiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdlbnRhZyIsIGdsX2dlbnRhZywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGJ1ZmZlciIsIGdsX2dldGJ1ZmZlciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGNvbG9yIiwgZ2xfZ2V0Y29sb3IsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGRpc3BsYXltb2RlIiwgZ2xfZ2V0ZGlzcGxheW1vZGUsIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRmb250IiwgZ2xfZ2V0Zm9udCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRoZWlnaHQiLCBnbF9nZXRoZWlnaHQsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRoaXRjb2RlIiwgZ2xfZ2V0aGl0Y29kZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRsc3R5bGUiLCBnbF9nZXRsc3R5bGUsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRsd2lkdGgiLCBnbF9nZXRsd2lkdGgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRtYXAiLCBnbF9nZXRtYXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRwbGFuZXMiLCBnbF9nZXRwbGFuZXMsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXR3cml0ZW1hc2siLCBnbF9nZXR3cml0ZW1hc2ssICAgIE1FVEhfT0xEQVJHU30sCi0JeyJxdGVzdCIsIGdsX3F0ZXN0LCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRsc3JlcGVhdCIsIGdsX2dldGxzcmVwZWF0LCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRtb25pdG9yIiwgZ2xfZ2V0bW9uaXRvciwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRvcGVub2JqIiwgZ2xfZ2V0b3Blbm9iaiwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRwYXR0ZXJuIiwgZ2xfZ2V0cGF0dGVybiwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5nZXQiLCBnbF93aW5nZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5hdHRhY2giLCBnbF93aW5hdHRhY2gsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRvdGhlcm1vbml0b3IiLCBnbF9nZXRvdGhlcm1vbml0b3IsIE1FVEhfT0xEQVJHU30sCi0JeyJuZXdwdXAiLCBnbF9uZXdwdXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXR2YWx1YXRvciIsIGdsX2dldHZhbHVhdG9yLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5zZXQiLCBnbF93aW5zZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkb3B1cCIsIGdsX2RvcHVwLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRkZXB0aCIsIGdsX2dldGRlcHRoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRjcG9zIiwgZ2xfZ2V0Y3BvcywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRzaXplIiwgZ2xfZ2V0c2l6ZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRvcmlnaW4iLCBnbF9nZXRvcmlnaW4sICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXR2aWV3cG9ydCIsIGdsX2dldHZpZXdwb3J0LCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXR0cCIsIGdsX2dldHRwLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRncG9zIiwgZ2xfZ2V0Z3BvcywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5wb3NpdGlvbiIsIGdsX3dpbnBvc2l0aW9uLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnUkdCY29sb3IiLCBnbF9nUkdCY29sb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnUkdCbWFzayIsIGdsX2dSR0JtYXNrLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRzY3JtYXNrIiwgZ2xfZ2V0c2NybWFzaywgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRtY29sb3IiLCBnbF9nZXRtY29sb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtYXB3IiwgZ2xfbWFwdywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtYXB3MiIsIGdsX21hcHcyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRjdXJzb3IiLCBnbF9nZXRjdXJzb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbW9kZSIsIGdsX2Ntb2RlLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjb25jYXZlIiwgZ2xfY29uY2F2ZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjdXJzdHlwZSIsIGdsX2N1cnN0eXBlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkcmF3bW9kZSIsIGdsX2RyYXdtb2RlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnYW1tYXJhbXAiLCBnbF9nYW1tYXJhbXAsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRiYWNrZmFjZSIsIGdsX2dldGJhY2tmYWNlLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRkZXNjZW5kZXIiLCBnbF9nZXRkZXNjZW5kZXIsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRkcmF3bW9kZSIsIGdsX2dldGRyYXdtb2RlLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRtbW9kZSIsIGdsX2dldG1tb2RlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRzbSIsIGdsX2dldHNtLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXR2aWRlbyIsIGdsX2dldHZpZGVvLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJpbWFrZWJhY2tncm91bmQiLCBnbF9pbWFrZWJhY2tncm91bmQsIE1FVEhfT0xEQVJHU30sCi0JeyJsbWJpbmQiLCBnbF9sbWJpbmQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJsbWRlZiIsIGdsX2xtZGVmLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtbW9kZSIsIGdsX21tb2RlLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJub3JtYWwiLCBnbF9ub3JtYWwsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJvdmVybGF5IiwgZ2xfb3ZlcmxheSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJSR0JyYW5nZSIsIGdsX1JHQnJhbmdlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzZXR2aWRlbyIsIGdsX3NldHZpZGVvLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzaGFkZW1vZGVsIiwgZ2xfc2hhZGVtb2RlbCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ1bmRlcmxheSIsIGdsX3VuZGVybGF5LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ25jbG9zZWRsaW5lIiwgZ2xfYmduY2xvc2VkbGluZSwgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ25saW5lIiwgZ2xfYmdubGluZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ25wb2ludCIsIGdsX2JnbnBvaW50LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ25wb2x5Z29uIiwgZ2xfYmducG9seWdvbiwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ25zdXJmYWNlIiwgZ2xfYmduc3VyZmFjZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ250bWVzaCIsIGdsX2JnbnRtZXNoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ250cmltIiwgZ2xfYmdudHJpbSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRjbG9zZWRsaW5lIiwgZ2xfZW5kY2xvc2VkbGluZSwgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRsaW5lIiwgZ2xfZW5kbGluZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRwb2ludCIsIGdsX2VuZHBvaW50LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRwb2x5Z29uIiwgZ2xfZW5kcG9seWdvbiwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRzdXJmYWNlIiwgZ2xfZW5kc3VyZmFjZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmR0bWVzaCIsIGdsX2VuZHRtZXNoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmR0cmltIiwgZ2xfZW5kdHJpbSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJibGVuZGZ1bmN0aW9uIiwgZ2xfYmxlbmRmdW5jdGlvbiwgIE1FVEhfT0xEQVJHU30sCi0JeyJjM2YiLCBnbF9jM2YsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjM2kiLCBnbF9jM2ksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjM3MiLCBnbF9jM3MsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjNGYiLCBnbF9jNGYsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjNGkiLCBnbF9jNGksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjNHMiLCBnbF9jNHMsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjb2xvcmYiLCBnbF9jb2xvcmYsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjcGFjayIsIGdsX2NwYWNrLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjemNsZWFyIiwgZ2xfY3pjbGVhciwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkZ2xjbG9zZSIsIGdsX2RnbGNsb3NlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkZ2xvcGVuIiwgZ2xfZGdsb3BlbiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRnZGVzYyIsIGdsX2dldGdkZXNjLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRudXJic3Byb3BlcnR5IiwgZ2xfZ2V0bnVyYnNwcm9wZXJ0eSwgTUVUSF9PTERBUkdTfSwKLQl7ImdsY29tcGF0IiwgZ2xfZ2xjb21wYXQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imljb25zaXplIiwgZ2xfaWNvbnNpemUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imljb250aXRsZSIsIGdsX2ljb250aXRsZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxSR0JyYW5nZSIsIGdsX2xSR0JyYW5nZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxpbmVzbW9vdGgiLCBnbF9saW5lc21vb3RoLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxtY29sb3IiLCBnbF9sbWNvbG9yLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxvZ2ljb3AiLCBnbF9sb2dpY29wLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxzZXRkZXB0aCIsIGdsX2xzZXRkZXB0aCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxzaGFkZXJhbmdlIiwgZ2xfbHNoYWRlcmFuZ2UsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im4zZiIsIGdsX24zZiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im5vYm9yZGVyIiwgZ2xfbm9ib3JkZXIsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudHNtb290aCIsIGdsX3BudHNtb290aCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlYWRzb3VyY2UiLCBnbF9yZWFkc291cmNlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3R6b29tIiwgZ2xfcmVjdHpvb20sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3giLCBnbF9zYm94LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3hpIiwgZ2xfc2JveGksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3hzIiwgZ2xfc2JveHMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3hmIiwgZ2xfc2JveGYsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3hmaSIsIGdsX3Nib3hmaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3hmcyIsIGdsX3Nib3hmcywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldG51cmJzcHJvcGVydHkiLCBnbF9zZXRudXJic3Byb3BlcnR5LCBNRVRIX09MREFSR1N9LAotCXsic2V0cHVwIiwgZ2xfc2V0cHVwLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic21vb3RobGluZSIsIGdsX3Ntb290aGxpbmUsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic3VicGl4ZWwiLCBnbF9zdWJwaXhlbCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic3dhcHRtZXNoIiwgZ2xfc3dhcHRtZXNoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic3dpbm9wZW4iLCBnbF9zd2lub3BlbiwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjJmIiwgZ2xfdjJmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjJpIiwgZ2xfdjJpLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjJzIiwgZ2xfdjJzLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjNmIiwgZ2xfdjNmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjNpIiwgZ2xfdjNpLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjNzIiwgZ2xfdjNzLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjRmIiwgZ2xfdjRmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjRpIiwgZ2xfdjRpLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjRzIiwgZ2xfdjRzLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidmlkZW9jbWQiLCBnbF92aWRlb2NtZCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsid2luZGVwdGgiLCBnbF93aW5kZXB0aCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsid21wYWNrIiwgZ2xfd21wYWNrLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiemRyYXciLCBnbF96ZHJhdywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiemZ1bmN0aW9uIiwgZ2xfemZ1bmN0aW9uLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsienNvdXJjZSIsIGdsX3pzb3VyY2UsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiendyaXRlbWFzayIsIGdsX3p3cml0ZW1hc2ssICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjJkIiwgZ2xfdjJkLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjNkIiwgZ2xfdjNkLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjRkIiwgZ2xfdjRkLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicGl4bW9kZSIsIGdsX3BpeG1vZGUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicWdldGZkIiwgZ2xfcWdldGZkLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZGl0aGVyIiwgZ2xfZGl0aGVyLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXtOVUxMLCBOVUxMfSAvKiBTZW50aW5lbCAqLworICAgIHsicXJlYWQiLCBnbF9xcmVhZCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidmFycmF5IiwgZ2xfdmFycmF5LCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibnZhcnJheSIsIGdsX252YXJyYXksICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidm5hcnJheSIsIGdsX3ZuYXJyYXksICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibnVyYnNzdXJmYWNlIiwgZ2xfbnVyYnNzdXJmYWNlLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsibnVyYnNjdXJ2ZSIsIGdsX251cmJzY3VydmUsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicHdsY3VydmUiLCBnbF9wd2xjdXJ2ZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGljayIsIGdsX3BpY2ssICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZW5kcGljayIsIGdsX2VuZHBpY2ssICAgICAgICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnc2VsZWN0IiwgZ2xfZ3NlbGVjdCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmRzZWxlY3QiLCBnbF9lbmRzZWxlY3QsICAgICAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImdldG1hdHJpeCIsIGdsX2dldG1hdHJpeCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFsdGdldG1hdHJpeCIsIGdsX2FsdGdldG1hdHJpeCwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxyZWN0d3JpdGUiLCBnbF9scmVjdHdyaXRlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxyZWN0cmVhZCIsIGdsX2xyZWN0cmVhZCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlYWRkaXNwbGF5IiwgZ2xfcmVhZGRpc3BsYXksICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBhY2tyZWN0IiwgZ2xfcGFja3JlY3QsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InVucGFja3JlY3QiLCBnbF91bnBhY2tyZWN0LCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imd2ZXJzaW9uIiwgZ2xfZ3ZlcnNpb24sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNsZWFyIiwgZ2xfY2xlYXIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHNoYWRlIiwgZ2xfZ2V0c2hhZGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRldnBvcnQiLCBnbF9kZXZwb3J0LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJkcjJpIiwgZ2xfcmRyMmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlY3RmcyIsIGdsX3JlY3RmcywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlY3RzIiwgZ2xfcmVjdHMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJtdjJpIiwgZ2xfcm12MmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im5vcG9ydCIsIGdsX25vcG9ydCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvcHZpZXdwb3J0IiwgZ2xfcG9wdmlld3BvcnQsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNsZWFyaGl0Y29kZSIsIGdsX2NsZWFyaGl0Y29kZSwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNsb3Nlb2JqIiwgZ2xfY2xvc2VvYmosICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImN1cnNvZmYiLCBnbF9jdXJzb2ZmLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImN1cnNvbiIsIGdsX2N1cnNvbiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRvdWJsZWJ1ZmZlciIsIGdsX2RvdWJsZWJ1ZmZlciwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZpbmlzaCIsIGdsX2ZpbmlzaCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imdjb25maWciLCBnbF9nY29uZmlnLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imdpbml0IiwgZ2xfZ2luaXQsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdyZXNldCIsIGdsX2dyZXNldCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im11bHRpbWFwIiwgZ2xfbXVsdGltYXAsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im9uZW1hcCIsIGdsX29uZW1hcCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvcGF0dHJpYnV0ZXMiLCBnbF9wb3BhdHRyaWJ1dGVzLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvcG1hdHJpeCIsIGdsX3BvcG1hdHJpeCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InB1c2hhdHRyaWJ1dGVzIiwgZ2xfcHVzaGF0dHJpYnV0ZXMsTUVUSF9PTERBUkdTfSwKKyAgICB7InB1c2htYXRyaXgiLCBnbF9wdXNobWF0cml4LCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InB1c2h2aWV3cG9ydCIsIGdsX3B1c2h2aWV3cG9ydCwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InFyZXNldCIsIGdsX3FyZXNldCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IlJHQm1vZGUiLCBnbF9SR0Jtb2RlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNpbmdsZWJ1ZmZlciIsIGdsX3NpbmdsZWJ1ZmZlciwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InN3YXBidWZmZXJzIiwgZ2xfc3dhcGJ1ZmZlcnMsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdzeW5jIiwgZ2xfZ3N5bmMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdmbHVzaCIsIGdsX2dmbHVzaCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InRwb24iLCBnbF90cG9uLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InRwb2ZmIiwgZ2xfdHBvZmYsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNsa29uIiwgZ2xfY2xrb24sICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNsa29mZiIsIGdsX2Nsa29mZiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJpbmdiZWxsIiwgZ2xfcmluZ2JlbGwsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdiZWdpbiIsIGdsX2diZWdpbiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InRleHRpbml0IiwgZ2xfdGV4dGluaXQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImluaXRuYW1lcyIsIGdsX2luaXRuYW1lcywgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBjbG9zIiwgZ2xfcGNsb3MsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvcG5hbWUiLCBnbF9wb3BuYW1lLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNwY2xvcyIsIGdsX3NwY2xvcywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InpjbGVhciIsIGdsX3pjbGVhciwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNjcmVlbnNwYWNlIiwgZ2xfc2NyZWVuc3BhY2UsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlc2hhcGV2aWV3cG9ydCIsIGdsX3Jlc2hhcGV2aWV3cG9ydCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbnB1c2giLCBnbF93aW5wdXNoLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbnBvcCIsIGdsX3dpbnBvcCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZvcmVncm91bmQiLCBnbF9mb3JlZ3JvdW5kLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZGZ1bGxzY3JuIiwgZ2xfZW5kZnVsbHNjcm4sICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHB1cG1vZGUiLCBnbF9lbmRwdXBtb2RlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZ1bGxzY3JuIiwgZ2xfZnVsbHNjcm4sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InB1cG1vZGUiLCBnbF9wdXBtb2RlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbmNvbnN0cmFpbnRzIiwgZ2xfd2luY29uc3RyYWludHMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJwYWdlY29sb3IiLCBnbF9wYWdlY29sb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ0ZXh0Y29sb3IiLCBnbF90ZXh0Y29sb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjb2xvciIsIGdsX2NvbG9yLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjdXJ2ZWl0IiwgZ2xfY3VydmVpdCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJmb250IiwgZ2xfZm9udCwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsaW5ld2lkdGgiLCBnbF9saW5ld2lkdGgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRsaW5lc3R5bGUiLCBnbF9zZXRsaW5lc3R5bGUsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRtYXAiLCBnbF9zZXRtYXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzd2FwaW50ZXJ2YWwiLCBnbF9zd2FwaW50ZXJ2YWwsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3cml0ZW1hc2siLCBnbF93cml0ZW1hc2ssICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ0ZXh0d3JpdGVtYXNrIiwgZ2xfdGV4dHdyaXRlbWFzaywgIE1FVEhfT0xEQVJHU30sCisgICAgeyJxZGV2aWNlIiwgZ2xfcWRldmljZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ1bnFkZXZpY2UiLCBnbF91bnFkZXZpY2UsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjdXJ2ZWJhc2lzIiwgZ2xfY3VydmViYXNpcywgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjdXJ2ZXByZWNpc2lvbiIsIGdsX2N1cnZlcHJlY2lzaW9uLE1FVEhfT0xEQVJHU30sCisgICAgeyJsb2FkbmFtZSIsIGdsX2xvYWRuYW1lLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwYXNzdGhyb3VnaCIsIGdsX3Bhc3N0aHJvdWdoLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwdXNobmFtZSIsIGdsX3B1c2huYW1lLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRtb25pdG9yIiwgZ2xfc2V0bW9uaXRvciwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRzaGFkZSIsIGdsX3NldHNoYWRlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRwYXR0ZXJuIiwgZ2xfc2V0cGF0dGVybiwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwYWdld3JpdGVtYXNrIiwgZ2xfcGFnZXdyaXRlbWFzaywgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjYWxsb2JqIiwgZ2xfY2FsbG9iaiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZWxvYmoiLCBnbF9kZWxvYmosICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlZGl0b2JqIiwgZ2xfZWRpdG9iaiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJtYWtlb2JqIiwgZ2xfbWFrZW9iaiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJtYWtldGFnIiwgZ2xfbWFrZXRhZywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjaHVua3NpemUiLCBnbF9jaHVua3NpemUsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjb21wYWN0aWZ5IiwgZ2xfY29tcGFjdGlmeSwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZWx0YWciLCBnbF9kZWx0YWcsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsc3JlcGVhdCIsIGdsX2xzcmVwZWF0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJvYmppbnNlcnQiLCBnbF9vYmppbnNlcnQsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJvYmpyZXBsYWNlIiwgZ2xfb2JqcmVwbGFjZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3aW5jbG9zZSIsIGdsX3dpbmNsb3NlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJibGFua3RpbWUiLCBnbF9ibGFua3RpbWUsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJmcmVlcHVwIiwgZ2xfZnJlZXB1cCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJiYWNrYnVmZmVyIiwgZ2xfYmFja2J1ZmZlciwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJmcm9udGJ1ZmZlciIsIGdsX2Zyb250YnVmZmVyLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsc2JhY2t1cCIsIGdsX2xzYmFja3VwLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJyZXNldGxzIiwgZ2xfcmVzZXRscywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsYW1wb24iLCBnbF9sYW1wb24sICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsYW1wb2ZmIiwgZ2xfbGFtcG9mZiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRiZWxsIiwgZ2xfc2V0YmVsbCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJibGFua3NjcmVlbiIsIGdsX2JsYW5rc2NyZWVuLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZXB0aGN1ZSIsIGdsX2RlcHRoY3VlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ6YnVmZmVyIiwgZ2xfemJ1ZmZlciwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJiYWNrZmFjZSIsIGdsX2JhY2tmYWNlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjbW92MmkiLCBnbF9jbW92MmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkcmF3MmkiLCBnbF9kcmF3MmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJtb3ZlMmkiLCBnbF9tb3ZlMmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwbnQyaSIsIGdsX3BudDJpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwYXRjaGJhc2lzIiwgZ2xfcGF0Y2hiYXNpcywgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwYXRjaHByZWNpc2lvbiIsIGdsX3BhdGNocHJlY2lzaW9uLCBNRVRIX09MREFSR1N9LAorICAgIHsicGRyMmkiLCBnbF9wZHIyaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12MmkiLCBnbF9wbXYyaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkcjJpIiwgZ2xfcnBkcjJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdjJpIiwgZ2xfcnBtdjJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDJpIiwgZ2xfeGZwdDJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsib2JqZGVsZXRlIiwgZ2xfb2JqZGVsZXRlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGF0Y2hjdXJ2ZXMiLCBnbF9wYXRjaGN1cnZlcywgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibWluc2l6ZSIsIGdsX21pbnNpemUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibWF4c2l6ZSIsIGdsX21heHNpemUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsia2VlcGFzcGVjdCIsIGdsX2tlZXBhc3BlY3QsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicHJlZnNpemUiLCBnbF9wcmVmc2l6ZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3RlcHVuaXQiLCBnbF9zdGVwdW5pdCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZnVkZ2UiLCBnbF9mdWRnZSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid2lubW92ZSIsIGdsX3dpbm1vdmUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXR0YWNoY3Vyc29yIiwgZ2xfYXR0YWNoY3Vyc29yLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVmbGluZXN0eWxlIiwgZ2xfZGVmbGluZXN0eWxlLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsibm9pc2UiLCBnbF9ub2lzZSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGlja3NpemUiLCBnbF9waWNrc2l6ZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicWVudGVyIiwgZ2xfcWVudGVyLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0ZGVwdGgiLCBnbF9zZXRkZXB0aCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY21vdjJzIiwgZ2xfY21vdjJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZHJhdzJzIiwgZ2xfZHJhdzJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibW92ZTJzIiwgZ2xfbW92ZTJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGRyMnMiLCBnbF9wZHIycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12MnMiLCBnbF9wbXYycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50MnMiLCBnbF9wbnQycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmRyMnMiLCBnbF9yZHIycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm12MnMiLCBnbF9ybXYycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkcjJzIiwgZ2xfcnBkcjJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdjJzIiwgZ2xfcnBtdjJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDJzIiwgZ2xfeGZwdDJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY21vdjIiLCBnbF9jbW92MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZHJhdzIiLCBnbF9kcmF3MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibW92ZTIiLCBnbF9tb3ZlMiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50MiIsIGdsX3BudDIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGRyMiIsIGdsX3BkcjIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12MiIsIGdsX3BtdjIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmRyMiIsIGdsX3JkcjIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm12MiIsIGdsX3JtdjIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkcjIiLCBnbF9ycGRyMiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdjIiLCBnbF9ycG12MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDIiLCBnbF94ZnB0MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibG9hZG1hdHJpeCIsIGdsX2xvYWRtYXRyaXgsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibXVsdG1hdHJpeCIsIGdsX211bHRtYXRyaXgsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY3J2IiwgZ2xfY3J2LCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmNydiIsIGdsX3JjcnYsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkdG9wdXAiLCBnbF9hZGR0b3B1cCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2hhcnN0ciIsIGdsX2NoYXJzdHIsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0cG9ydCIsIGdsX2dldHBvcnQsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3Ryd2lkdGgiLCBnbF9zdHJ3aWR0aCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid2lub3BlbiIsIGdsX3dpbm9wZW4sICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid2ludGl0bGUiLCBnbF93aW50aXRsZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZiIsIGdsX3BvbGYsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZjIiLCBnbF9wb2xmMiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seSIsIGdsX3BvbHksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seTIiLCBnbF9wb2x5MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY3J2biIsIGdsX2Nydm4sICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmNydm4iLCBnbF9yY3J2biwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZjJpIiwgZ2xfcG9sZjJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZmkiLCBnbF9wb2xmaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seTJpIiwgZ2xfcG9seTJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seWkiLCBnbF9wb2x5aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZjJzIiwgZ2xfcG9sZjJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZnMiLCBnbF9wb2xmcywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seXMiLCBnbF9wb2x5cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seTJzIiwgZ2xfcG9seTJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVmY3Vyc29yIiwgZ2xfZGVmY3Vyc29yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid3JpdGVwaXhlbHMiLCBnbF93cml0ZXBpeGVscywgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVmYmFzaXMiLCBnbF9kZWZiYXNpcywgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V3cml0ZSIsIGdsX2dld3JpdGUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm90YXRlIiwgZ2xfcm90YXRlLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm90IiwgZ2xfcm90LCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyY2ZpIiwgZ2xfY2lyY2ZpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyY2kiLCBnbF9jaXJjaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY21vdmkiLCBnbF9jbW92aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZHJhd2kiLCBnbF9kcmF3aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibW92ZWkiLCBnbF9tb3ZlaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50aSIsIGdsX3BudGksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibmV3dGFnIiwgZ2xfbmV3dGFnLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGRyaSIsIGdsX3BkcmksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12aSIsIGdsX3BtdmksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmRyaSIsIGdsX3JkcmksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm12aSIsIGdsX3JtdmksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkcmkiLCBnbF9ycGRyaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdmkiLCBnbF9ycG12aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdGkiLCBnbF94ZnB0aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyYyIsIGdsX2NpcmMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyY2YiLCBnbF9jaXJjZiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY21vdiIsIGdsX2Ntb3YsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZHJhdyIsIGdsX2RyYXcsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibW92ZSIsIGdsX21vdmUsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50IiwgZ2xfcG50LCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2NhbGUiLCBnbF9zY2FsZSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidHJhbnNsYXRlIiwgZ2xfdHJhbnNsYXRlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGRyIiwgZ2xfcGRyLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12IiwgZ2xfcG12LCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmRyIiwgZ2xfcmRyLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm12IiwgZ2xfcm12LCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkciIsIGdsX3JwZHIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdiIsIGdsX3JwbXYsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdCIsIGdsX3hmcHQsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiUkdCY29sb3IiLCBnbF9SR0Jjb2xvciwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiUkdCd3JpdGVtYXNrIiwgZ2xfUkdCd3JpdGVtYXNrLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0Y3Vyc29yIiwgZ2xfc2V0Y3Vyc29yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidGllIiwgZ2xfdGllLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyY2ZzIiwgZ2xfY2lyY2ZzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyY3MiLCBnbF9jaXJjcywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY21vdnMiLCBnbF9jbW92cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZHJhd3MiLCBnbF9kcmF3cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibW92ZXMiLCBnbF9tb3ZlcywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGRycyIsIGdsX3BkcnMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12cyIsIGdsX3BtdnMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50cyIsIGdsX3BudHMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmRycyIsIGdsX3JkcnMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm12cyIsIGdsX3JtdnMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkcnMiLCBnbF9ycGRycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdnMiLCBnbF9ycG12cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdHMiLCBnbF94ZnB0cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY3Vyb3JpZ2luIiwgZ2xfY3Vyb3JpZ2luLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY3ljbGVtYXAiLCBnbF9jeWNsZW1hcCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGF0Y2giLCBnbF9wYXRjaCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZiIsIGdsX3NwbGYsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZjIiLCBnbF9zcGxmMiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZmkiLCBnbF9zcGxmaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZjJpIiwgZ2xfc3BsZjJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZnMiLCBnbF9zcGxmcywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZjJzIiwgZ2xfc3BsZjJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBhdGNoIiwgZ2xfcnBhdGNoLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsib3J0aG8yIiwgZ2xfb3J0aG8yLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdCIsIGdsX3JlY3QsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdGYiLCBnbF9yZWN0ZiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDQiLCBnbF94ZnB0NCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidGV4dHBvcnQiLCBnbF90ZXh0cG9ydCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibWFwY29sb3IiLCBnbF9tYXBjb2xvciwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2NybWFzayIsIGdsX3Njcm1hc2ssICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0dmFsdWF0b3IiLCBnbF9zZXR2YWx1YXRvciwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidmlld3BvcnQiLCBnbF92aWV3cG9ydCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2hhZGVyYW5nZSIsIGdsX3NoYWRlcmFuZ2UsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDRzIiwgZ2xfeGZwdDRzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdGZpIiwgZ2xfcmVjdGZpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdGkiLCBnbF9yZWN0aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDRpIiwgZ2xfeGZwdDRpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicHJlZnBvc2l0aW9uIiwgZ2xfcHJlZnBvc2l0aW9uLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjIiwgZ2xfYXJjLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjZiIsIGdsX2FyY2YsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjZmkiLCBnbF9hcmNmaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjaSIsIGdsX2FyY2ksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmJveDIiLCBnbF9iYm94MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmJveDJpIiwgZ2xfYmJveDJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmJveDJzIiwgZ2xfYmJveDJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmxpbmsiLCBnbF9ibGluaywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsib3J0aG8iLCBnbF9vcnRobywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid2luZG93IiwgZ2xfd2luZG93LCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibG9va2F0IiwgZ2xfbG9va2F0LCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGVyc3BlY3RpdmUiLCBnbF9wZXJzcGVjdGl2ZSwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sYXJ2aWV3IiwgZ2xfcG9sYXJ2aWV3LCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjZnMiLCBnbF9hcmNmcywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjcyIsIGdsX2FyY3MsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdGNvcHkiLCBnbF9yZWN0Y29weSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiUkdCY3Vyc29yIiwgZ2xfUkdCY3Vyc29yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0YnV0dG9uIiwgZ2xfZ2V0YnV0dG9uLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0Y21tb2RlIiwgZ2xfZ2V0Y21tb2RlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0bHNiYWNrdXAiLCBnbF9nZXRsc2JhY2t1cCwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0cmVzZXRscyIsIGdsX2dldHJlc2V0bHMsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0ZGNtIiwgZ2xfZ2V0ZGNtLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0emJ1ZmZlciIsIGdsX2dldHpidWZmZXIsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaXNtZXgiLCBnbF9pc21leCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaXNvYmoiLCBnbF9pc29iaiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaXNxdWV1ZWQiLCBnbF9pc3F1ZXVlZCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaXN0YWciLCBnbF9pc3RhZywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2Vub2JqIiwgZ2xfZ2Vub2JqLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2VudGFnIiwgZ2xfZ2VudGFnLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0YnVmZmVyIiwgZ2xfZ2V0YnVmZmVyLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0Y29sb3IiLCBnbF9nZXRjb2xvciwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0ZGlzcGxheW1vZGUiLCBnbF9nZXRkaXNwbGF5bW9kZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGZvbnQiLCBnbF9nZXRmb250LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGhlaWdodCIsIGdsX2dldGhlaWdodCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGhpdGNvZGUiLCBnbF9nZXRoaXRjb2RlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGxzdHlsZSIsIGdsX2dldGxzdHlsZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGx3aWR0aCIsIGdsX2dldGx3aWR0aCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG1hcCIsIGdsX2dldG1hcCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHBsYW5lcyIsIGdsX2dldHBsYW5lcywgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHdyaXRlbWFzayIsIGdsX2dldHdyaXRlbWFzaywgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InF0ZXN0IiwgZ2xfcXRlc3QsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGxzcmVwZWF0IiwgZ2xfZ2V0bHNyZXBlYXQsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG1vbml0b3IiLCBnbF9nZXRtb25pdG9yLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG9wZW5vYmoiLCBnbF9nZXRvcGVub2JqLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHBhdHRlcm4iLCBnbF9nZXRwYXR0ZXJuLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbmdldCIsIGdsX3dpbmdldCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbmF0dGFjaCIsIGdsX3dpbmF0dGFjaCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG90aGVybW9uaXRvciIsIGdsX2dldG90aGVybW9uaXRvciwgTUVUSF9PTERBUkdTfSwKKyAgICB7Im5ld3B1cCIsIGdsX25ld3B1cCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHZhbHVhdG9yIiwgZ2xfZ2V0dmFsdWF0b3IsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbnNldCIsIGdsX3dpbnNldCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRvcHVwIiwgZ2xfZG9wdXAsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGRlcHRoIiwgZ2xfZ2V0ZGVwdGgsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGNwb3MiLCBnbF9nZXRjcG9zLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHNpemUiLCBnbF9nZXRzaXplLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG9yaWdpbiIsIGdsX2dldG9yaWdpbiwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHZpZXdwb3J0IiwgZ2xfZ2V0dmlld3BvcnQsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHRwIiwgZ2xfZ2V0dHAsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGdwb3MiLCBnbF9nZXRncG9zLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbnBvc2l0aW9uIiwgZ2xfd2lucG9zaXRpb24sICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdSR0Jjb2xvciIsIGdsX2dSR0Jjb2xvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdSR0JtYXNrIiwgZ2xfZ1JHQm1hc2ssICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHNjcm1hc2siLCBnbF9nZXRzY3JtYXNrLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG1jb2xvciIsIGdsX2dldG1jb2xvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1hcHciLCBnbF9tYXB3LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1hcHcyIiwgZ2xfbWFwdzIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGN1cnNvciIsIGdsX2dldGN1cnNvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNtb2RlIiwgZ2xfY21vZGUsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNvbmNhdmUiLCBnbF9jb25jYXZlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImN1cnN0eXBlIiwgZ2xfY3Vyc3R5cGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRyYXdtb2RlIiwgZ2xfZHJhd21vZGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdhbW1hcmFtcCIsIGdsX2dhbW1hcmFtcCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGJhY2tmYWNlIiwgZ2xfZ2V0YmFja2ZhY2UsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGRlc2NlbmRlciIsIGdsX2dldGRlc2NlbmRlciwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGRyYXdtb2RlIiwgZ2xfZ2V0ZHJhd21vZGUsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG1tb2RlIiwgZ2xfZ2V0bW1vZGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHNtIiwgZ2xfZ2V0c20sICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHZpZGVvIiwgZ2xfZ2V0dmlkZW8sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImltYWtlYmFja2dyb3VuZCIsIGdsX2ltYWtlYmFja2dyb3VuZCwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxtYmluZCIsIGdsX2xtYmluZCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxtZGVmIiwgZ2xfbG1kZWYsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1tb2RlIiwgZ2xfbW1vZGUsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im5vcm1hbCIsIGdsX25vcm1hbCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im92ZXJsYXkiLCBnbF9vdmVybGF5LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IlJHQnJhbmdlIiwgZ2xfUkdCcmFuZ2UsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldHZpZGVvIiwgZ2xfc2V0dmlkZW8sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNoYWRlbW9kZWwiLCBnbF9zaGFkZW1vZGVsLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InVuZGVybGF5IiwgZ2xfdW5kZXJsYXksICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbmNsb3NlZGxpbmUiLCBnbF9iZ25jbG9zZWRsaW5lLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbmxpbmUiLCBnbF9iZ25saW5lLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbnBvaW50IiwgZ2xfYmducG9pbnQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbnBvbHlnb24iLCBnbF9iZ25wb2x5Z29uLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbnN1cmZhY2UiLCBnbF9iZ25zdXJmYWNlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbnRtZXNoIiwgZ2xfYmdudG1lc2gsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbnRyaW0iLCBnbF9iZ250cmltLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZGNsb3NlZGxpbmUiLCBnbF9lbmRjbG9zZWRsaW5lLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZGxpbmUiLCBnbF9lbmRsaW5lLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHBvaW50IiwgZ2xfZW5kcG9pbnQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHBvbHlnb24iLCBnbF9lbmRwb2x5Z29uLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHN1cmZhY2UiLCBnbF9lbmRzdXJmYWNlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHRtZXNoIiwgZ2xfZW5kdG1lc2gsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHRyaW0iLCBnbF9lbmR0cmltLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJsZW5kZnVuY3Rpb24iLCBnbF9ibGVuZGZ1bmN0aW9uLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImMzZiIsIGdsX2MzZiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImMzaSIsIGdsX2MzaSwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImMzcyIsIGdsX2MzcywgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImM0ZiIsIGdsX2M0ZiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImM0aSIsIGdsX2M0aSwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImM0cyIsIGdsX2M0cywgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNvbG9yZiIsIGdsX2NvbG9yZiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNwYWNrIiwgZ2xfY3BhY2ssICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImN6Y2xlYXIiLCBnbF9jemNsZWFyLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRnbGNsb3NlIiwgZ2xfZGdsY2xvc2UsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRnbG9wZW4iLCBnbF9kZ2xvcGVuLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGdkZXNjIiwgZ2xfZ2V0Z2Rlc2MsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG51cmJzcHJvcGVydHkiLCBnbF9nZXRudXJic3Byb3BlcnR5LCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2xjb21wYXQiLCBnbF9nbGNvbXBhdCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaWNvbnNpemUiLCBnbF9pY29uc2l6ZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaWNvbnRpdGxlIiwgZ2xfaWNvbnRpdGxlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibFJHQnJhbmdlIiwgZ2xfbFJHQnJhbmdlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibGluZXNtb290aCIsIGdsX2xpbmVzbW9vdGgsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibG1jb2xvciIsIGdsX2xtY29sb3IsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibG9naWNvcCIsIGdsX2xvZ2ljb3AsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibHNldGRlcHRoIiwgZ2xfbHNldGRlcHRoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibHNoYWRlcmFuZ2UiLCBnbF9sc2hhZGVyYW5nZSwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibjNmIiwgZ2xfbjNmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibm9ib3JkZXIiLCBnbF9ub2JvcmRlciwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50c21vb3RoIiwgZ2xfcG50c21vb3RoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVhZHNvdXJjZSIsIGdsX3JlYWRzb3VyY2UsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdHpvb20iLCBnbF9yZWN0em9vbSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveCIsIGdsX3Nib3gsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveGkiLCBnbF9zYm94aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveHMiLCBnbF9zYm94cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveGYiLCBnbF9zYm94ZiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveGZpIiwgZ2xfc2JveGZpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveGZzIiwgZ2xfc2JveGZzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0bnVyYnNwcm9wZXJ0eSIsIGdsX3NldG51cmJzcHJvcGVydHksIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRwdXAiLCBnbF9zZXRwdXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzbW9vdGhsaW5lIiwgZ2xfc21vb3RobGluZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzdWJwaXhlbCIsIGdsX3N1YnBpeGVsLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzd2FwdG1lc2giLCBnbF9zd2FwdG1lc2gsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzd2lub3BlbiIsIGdsX3N3aW5vcGVuLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2MmYiLCBnbF92MmYsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2MmkiLCBnbF92MmksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2MnMiLCBnbF92MnMsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2M2YiLCBnbF92M2YsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2M2kiLCBnbF92M2ksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2M3MiLCBnbF92M3MsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2NGYiLCBnbF92NGYsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2NGkiLCBnbF92NGksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2NHMiLCBnbF92NHMsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2aWRlb2NtZCIsIGdsX3ZpZGVvY21kLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3aW5kZXB0aCIsIGdsX3dpbmRlcHRoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3bXBhY2siLCBnbF93bXBhY2ssICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ6ZHJhdyIsIGdsX3pkcmF3LCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ6ZnVuY3Rpb24iLCBnbF96ZnVuY3Rpb24sICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ6c291cmNlIiwgZ2xfenNvdXJjZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ6d3JpdGVtYXNrIiwgZ2xfendyaXRlbWFzaywgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2MmQiLCBnbF92MmQsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2M2QiLCBnbF92M2QsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2NGQiLCBnbF92NGQsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwaXhtb2RlIiwgZ2xfcGl4bW9kZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJxZ2V0ZmQiLCBnbF9xZ2V0ZmQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkaXRoZXIiLCBnbF9kaXRoZXIsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsIE5VTEx9IC8qIFNlbnRpbmVsICovCiB9OwogCiB2b2lkCiBpbml0Z2wodm9pZCkKIHsKLSAgICAKKwogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGdsIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCi0gICAgICAgIHJldHVybjsKLSAgICAKLQkodm9pZCkgUHlfSW5pdE1vZHVsZSgiZ2wiLCBnbF9tZXRob2RzKTsKKyAgICByZXR1cm47CisKKyAgICAodm9pZCkgUHlfSW5pdE1vZHVsZSgiZ2wiLCBnbF9tZXRob2RzKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvaW1hZ2VvcC5jIGIvTW9kdWxlcy9pbWFnZW9wLmMKaW5kZXggOGQwZDY4Zi4uOGJkMTFiMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9pbWFnZW9wLmMKKysrIGIvTW9kdWxlcy9pbWFnZW9wLmMKQEAgLTMzLDEwICszMywxMCBAQAogc3RhdGljIGludAogY2hlY2tfY29vcmRvbm5hdGUoaW50IHZhbHVlLCBjb25zdCBjaGFyKiBuYW1lKQogewotCWlmICggMCA8IHZhbHVlKQotCQlyZXR1cm4gMTsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIiVzIHZhbHVlIGlzIG5lZ2F0aXZlIG9yIG51bCIsIG5hbWUpOwotCXJldHVybiAwOworICAgIGlmICggMCA8IHZhbHVlKQorICAgICAgICByZXR1cm4gMTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIiVzIHZhbHVlIGlzIG5lZ2F0aXZlIG9yIG51bCIsIG5hbWUpOworICAgIHJldHVybiAwOwogfQogCiAvKioKQEAgLTQ2LDE0ICs0NiwxNCBAQAogc3RhdGljIGludAogY2hlY2tfbXVsdGlwbHlfc2l6ZShpbnQgcHJvZHVjdCwgaW50IHgsIGNvbnN0IGNoYXIqIHhuYW1lLCBpbnQgeSwgY29uc3QgY2hhciogeW5hbWUsIGludCBzaXplKQogewotCWlmICggIWNoZWNrX2Nvb3Jkb25uYXRlKHgsIHhuYW1lKSApCi0JCXJldHVybiAwOwotCWlmICggIWNoZWNrX2Nvb3Jkb25uYXRlKHksIHluYW1lKSApCi0JCXJldHVybiAwOwotCWlmICggc2l6ZSA9PSAocHJvZHVjdCAvIHkpIC8geCApCi0JCXJldHVybiAxOwotCVB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTdHJpbmcgaGFzIGluY29ycmVjdCBsZW5ndGgiKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19jb29yZG9ubmF0ZSh4LCB4bmFtZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19jb29yZG9ubmF0ZSh5LCB5bmFtZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgPT0gKHByb2R1Y3QgLyB5KSAvIHggKQorICAgICAgICByZXR1cm4gMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU3RyaW5nIGhhcyBpbmNvcnJlY3QgbGVuZ3RoIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNjMsNyArNjMsNyBAQAogc3RhdGljIGludAogY2hlY2tfbXVsdGlwbHkoaW50IHByb2R1Y3QsIGludCB4LCBpbnQgeSkKIHsKLQlyZXR1cm4gY2hlY2tfbXVsdGlwbHlfc2l6ZShwcm9kdWN0LCB4LCAieCIsIHksICJ5IiwgMSk7CisgICAgcmV0dXJuIGNoZWNrX211bHRpcGx5X3NpemUocHJvZHVjdCwgeCwgIngiLCB5LCAieSIsIDEpOwogfQogCiAvKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSAodGhlIGRlZmF1bHQgaWYgYW55dGhpbmcgZ29lcyB3cm9uZyksIHdlJ3JlCkBAIC04NiwxMzEgKzg2LDEzMSBAQAogc3RhdGljIGludAogaW1hZ2VvcF9iYWNrd2FyZF9jb21wYXRpYmxlKHZvaWQpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpiY29zOwotCVB5T2JqZWN0ICpiY287Ci0JbG9uZyByYzsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmJjb3M7CisgICAgUHlPYmplY3QgKmJjbzsKKyAgICBsb25nIHJjOwogCi0JaWYgKEltYWdlb3BEaWN0ID09IE5VTEwpIC8qICJjYW5ub3QgaGFwcGVuIiAqLwotCQlyZXR1cm4gMTsKLQlpZiAoYmNvcyA9PSBOVUxMKSB7Ci0JCS8qIGNhY2hlIHN0cmluZyBvYmplY3QgZm9yIGZ1dHVyZSB1c2UgKi8KLQkJYmNvcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoImJhY2t3YXJkX2NvbXBhdGlibGUiKTsKLQkJaWYgKGJjb3MgPT0gTlVMTCkKLQkJCXJldHVybiAxOwotCX0KLQliY28gPSBQeURpY3RfR2V0SXRlbShJbWFnZW9wRGljdCwgYmNvcyk7Ci0JaWYgKGJjbyA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQlpZiAoIVB5SW50X0NoZWNrKGJjbykpCi0JCXJldHVybiAxOwotCXJjID0gUHlJbnRfQXNMb25nKGJjbyk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJLyogbm90IGFuIGludGVnZXIsIG9yIHRvbyBsYXJnZSwgb3Igc29tZXRoaW5nICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJjID0gMTsKLQl9Ci0JcmV0dXJuIHJjICE9IDA7CQkvKiBjb252ZXJ0IHRvIHZhbHVlcyAwLCAxICovCisgICAgaWYgKEltYWdlb3BEaWN0ID09IE5VTEwpIC8qICJjYW5ub3QgaGFwcGVuIiAqLworICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoYmNvcyA9PSBOVUxMKSB7CisgICAgICAgIC8qIGNhY2hlIHN0cmluZyBvYmplY3QgZm9yIGZ1dHVyZSB1c2UgKi8KKyAgICAgICAgYmNvcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoImJhY2t3YXJkX2NvbXBhdGlibGUiKTsKKyAgICAgICAgaWYgKGJjb3MgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBiY28gPSBQeURpY3RfR2V0SXRlbShJbWFnZW9wRGljdCwgYmNvcyk7CisgICAgaWYgKGJjbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoIVB5SW50X0NoZWNrKGJjbykpCisgICAgICAgIHJldHVybiAxOworICAgIHJjID0gUHlJbnRfQXNMb25nKGJjbyk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgLyogbm90IGFuIGludGVnZXIsIG9yIHRvbyBsYXJnZSwgb3Igc29tZXRoaW5nICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJjID0gMTsKKyAgICB9CisgICAgcmV0dXJuIHJjICE9IDA7ICAgICAgICAgICAgIC8qIGNvbnZlcnQgdG8gdmFsdWVzIDAsIDEgKi8KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfY3JvcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqY3AsICpuY3A7Ci0Jc2hvcnQgKm5zcDsKLQlQeV9JbnQzMiAqbmxwOwotCWludCBsZW4sIHNpemUsIHgsIHksIG5ld3gxLCBuZXd4MiwgbmV3eTEsIG5ld3kyLCBubGVuOwotCWludCBpeCwgaXksIHhzdGVwLCB5c3RlcDsKLQlQeU9iamVjdCAqcnY7CisgICAgY2hhciAqY3AsICpuY3A7CisgICAgc2hvcnQgKm5zcDsKKyAgICBQeV9JbnQzMiAqbmxwOworICAgIGludCBsZW4sIHNpemUsIHgsIHksIG5ld3gxLCBuZXd4MiwgbmV3eTEsIG5ld3kyLCBubGVuOworICAgIGludCBpeCwgaXksIHhzdGVwLCB5c3RlcDsKKyAgICBQeU9iamVjdCAqcnY7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWlpaWkiLCAmY3AsICZsZW4sICZzaXplLCAmeCwgJnksCi0JCQkgICZuZXd4MSwgJm5ld3kxLCAmbmV3eDIsICZuZXd5MikgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWlpaWkiLCAmY3AsICZsZW4sICZzaXplLCAmeCwgJnksCisgICAgICAgICAgICAgICAgICAgICAgJm5ld3gxLCAmbmV3eTEsICZuZXd4MiwgJm5ld3kyKSApCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEltYWdlb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShsZW4sIHgsICJ4IiwgeSwgInkiLCBzaXplKSApCi0JCXJldHVybiAwOworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCB4LCAieCIsIHksICJ5Iiwgc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCXhzdGVwID0gKG5ld3gxIDwgbmV3eDIpPyAxIDogLTE7Ci0JeXN0ZXAgPSAobmV3eTEgPCBuZXd5Mik/IDEgOiAtMTsKKyAgICB4c3RlcCA9IChuZXd4MSA8IG5ld3gyKT8gMSA6IC0xOworICAgIHlzdGVwID0gKG5ld3kxIDwgbmV3eTIpPyAxIDogLTE7CiAKLSAgICAgICAgbmxlbiA9IChhYnMobmV3eDItbmV3eDEpKzEpKihhYnMobmV3eTItbmV3eTEpKzEpKnNpemU7Ci0JaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShubGVuLCBhYnMobmV3eDItbmV3eDEpKzEsICJhYnMobmV3eDItbmV3eDEpKzEiLCBhYnMobmV3eTItbmV3eTEpKzEsICJhYnMobmV3eTItbmV3eTEpKzEiLCBzaXplKSApCi0JCXJldHVybiAwOwotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JbnNwID0gKHNob3J0ICopbmNwOwotCW5scCA9IChQeV9JbnQzMiAqKW5jcDsKLQluZXd5MiArPSB5c3RlcDsKLQluZXd4MiArPSB4c3RlcDsKLQlmb3IoIGl5ID0gbmV3eTE7IGl5ICE9IG5ld3kyOyBpeSs9eXN0ZXAgKSB7Ci0JCWZvciAoIGl4ID0gbmV3eDE7IGl4ICE9IG5ld3gyOyBpeCs9eHN0ZXAgKSB7Ci0JCQlpZiAoIGl5IDwgMCB8fCBpeSA+PSB5IHx8IGl4IDwgMCB8fCBpeCA+PSB4ICkgewotCQkJCWlmICggc2l6ZSA9PSAxICkKLQkJCQkJKm5jcCsrID0gMDsKLQkJCQllbHNlCi0JCQkJCSpubHArKyA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmICggc2l6ZSA9PSAxICkKLQkJCQkJKm5jcCsrID0gKkNIQVJQKGNwLCB4LCBpeCwgaXkpOwotCQkJCWVsc2UgaWYgKCBzaXplID09IDIgKQotCQkJCQkqbnNwKysgPSAqU0hPUlRQKGNwLCB4LCBpeCwgaXkpOwotCQkJCWVsc2UKLQkJCQkJKm5scCsrID0gKkxPTkdQKGNwLCB4LCBpeCwgaXkpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBydjsKKyAgICBubGVuID0gKGFicyhuZXd4Mi1uZXd4MSkrMSkqKGFicyhuZXd5Mi1uZXd5MSkrMSkqc2l6ZTsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseV9zaXplKG5sZW4sIGFicyhuZXd4Mi1uZXd4MSkrMSwgImFicyhuZXd4Mi1uZXd4MSkrMSIsIGFicyhuZXd5Mi1uZXd5MSkrMSwgImFicyhuZXd5Mi1uZXd5MSkrMSIsIHNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBuc3AgPSAoc2hvcnQgKiluY3A7CisgICAgbmxwID0gKFB5X0ludDMyICopbmNwOworICAgIG5ld3kyICs9IHlzdGVwOworICAgIG5ld3gyICs9IHhzdGVwOworICAgIGZvciggaXkgPSBuZXd5MTsgaXkgIT0gbmV3eTI7IGl5Kz15c3RlcCApIHsKKyAgICAgICAgZm9yICggaXggPSBuZXd4MTsgaXggIT0gbmV3eDI7IGl4Kz14c3RlcCApIHsKKyAgICAgICAgICAgIGlmICggaXkgPCAwIHx8IGl5ID49IHkgfHwgaXggPCAwIHx8IGl4ID49IHggKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKQorICAgICAgICAgICAgICAgICAgICAqbmNwKysgPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKm5scCsrID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKQorICAgICAgICAgICAgICAgICAgICAqbmNwKysgPSAqQ0hBUlAoY3AsIHgsIGl4LCBpeSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApCisgICAgICAgICAgICAgICAgICAgICpuc3ArKyA9ICpTSE9SVFAoY3AsIHgsIGl4LCBpeSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqbmxwKysgPSAqTE9OR1AoY3AsIHgsIGl4LCBpeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9zY2FsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqY3AsICpuY3A7Ci0Jc2hvcnQgKm5zcDsKLQlQeV9JbnQzMiAqbmxwOwotCWludCBsZW4sIHNpemUsIHgsIHksIG5ld3gsIG5ld3ksIG5sZW47Ci0JaW50IGl4LCBpeTsKLQlpbnQgb2l4LCBvaXk7Ci0JUHlPYmplY3QgKnJ2OworICAgIGNoYXIgKmNwLCAqbmNwOworICAgIHNob3J0ICpuc3A7CisgICAgUHlfSW50MzIgKm5scDsKKyAgICBpbnQgbGVuLCBzaXplLCB4LCB5LCBuZXd4LCBuZXd5LCBubGVuOworICAgIGludCBpeCwgaXk7CisgICAgaW50IG9peCwgb2l5OworICAgIFB5T2JqZWN0ICpydjsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpaWkiLAotCQkJICAmY3AsICZsZW4sICZzaXplLCAmeCwgJnksICZuZXd4LCAmbmV3eSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWlpIiwKKyAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmeCwgJnksICZuZXd4LCAmbmV3eSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCB4LCAieCIsIHksICJ5Iiwgc2l6ZSkgKQotCQlyZXR1cm4gMDsKLSAgICAgICAgbmxlbiA9IG5ld3gqbmV3eSpzaXplOwotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobmxlbiwgbmV3eCwgIm5ld3giLCBuZXd5LCAibmV3eSIsIHNpemUpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltYWdlb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShsZW4sIHgsICJ4IiwgeSwgInkiLCBzaXplKSApCisgICAgICAgIHJldHVybiAwOworICAgIG5sZW4gPSBuZXd4Km5ld3kqc2l6ZTsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseV9zaXplKG5sZW4sIG5ld3gsICJuZXd4IiwgbmV3eSwgIm5ld3kiLCBzaXplKSApCisgICAgICAgIHJldHVybiAwOwogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAoY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLQluc3AgPSAoc2hvcnQgKiluY3A7Ci0JbmxwID0gKFB5X0ludDMyICopbmNwOwotCWZvciggaXkgPSAwOyBpeSA8IG5ld3k7IGl5KysgKSB7Ci0JCWZvciAoIGl4ID0gMDsgaXggPCBuZXd4OyBpeCsrICkgewotCQkJb2l4ID0gaXggKiB4IC8gbmV3eDsKLQkJCW9peSA9IGl5ICogeSAvIG5ld3k7Ci0JCQlpZiAoIHNpemUgPT0gMSApCi0JCQkJKm5jcCsrID0gKkNIQVJQKGNwLCB4LCBvaXgsIG9peSk7Ci0JCQllbHNlIGlmICggc2l6ZSA9PSAyICkKLQkJCQkqbnNwKysgPSAqU0hPUlRQKGNwLCB4LCBvaXgsIG9peSk7Ci0JCQllbHNlCi0JCQkJKm5scCsrID0gKkxPTkdQKGNwLCB4LCBvaXgsIG9peSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJ2OworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgbnNwID0gKHNob3J0ICopbmNwOworICAgIG5scCA9IChQeV9JbnQzMiAqKW5jcDsKKyAgICBmb3IoIGl5ID0gMDsgaXkgPCBuZXd5OyBpeSsrICkgeworICAgICAgICBmb3IgKCBpeCA9IDA7IGl4IDwgbmV3eDsgaXgrKyApIHsKKyAgICAgICAgICAgIG9peCA9IGl4ICogeCAvIG5ld3g7CisgICAgICAgICAgICBvaXkgPSBpeSAqIHkgLyBuZXd5OworICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKQorICAgICAgICAgICAgICAgICpuY3ArKyA9ICpDSEFSUChjcCwgeCwgb2l4LCBvaXkpOworICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApCisgICAgICAgICAgICAgICAgKm5zcCsrID0gKlNIT1JUUChjcCwgeCwgb2l4LCBvaXkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpubHArKyA9ICpMT05HUChjcCwgeCwgb2l4LCBvaXkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogLyogTm90ZTogdGhpcyByb3V0aW5lIGNhbiB1c2UgYSBiaXQgb2Ygb3B0aW1pemluZyAqLwpAQCAtMjE4LDU3NyArMjE4LDU3NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfdG92aWRlbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG1heHgsIG1heHksIHgsIHksIGxlbjsKLQlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQlpbnQgd2lkdGg7Ci0JUHlPYmplY3QgKnJ2OworICAgIGludCBtYXh4LCBtYXh5LCB4LCB5LCBsZW47CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgaW50IHdpZHRoOworICAgIFB5T2JqZWN0ICpydjsKIAogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWkiLCAmY3AsICZsZW4sICZ3aWR0aCwgJm1heHgsICZtYXh5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpIiwgJmNwLCAmbGVuLCAmd2lkdGgsICZtYXh4LCAmbWF4eSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggd2lkdGggIT0gMSAmJiB3aWR0aCAhPSA0ICkgewotCQlQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoICFjaGVja19tdWx0aXBseV9zaXplKGxlbiwgbWF4eCwgIm1heCIsIG1heHksICJtYXh5Iiwgd2lkdGgpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCB3aWR0aCAhPSAxICYmIHdpZHRoICE9IDQgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCBtYXh4LCAibWF4IiwgbWF4eSwgIm1heHkiLCB3aWR0aCkgKQorICAgICAgICByZXR1cm4gMDsKIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLQlpZiAoIHdpZHRoID09IDEgKSB7Ci0JCW1lbWNweShuY3AsIGNwLCBtYXh4KTsJCS8qIENvcHkgZmlyc3QgbGluZSAqLwotCQluY3AgKz0gbWF4eDsKLQkJZm9yICh5PTE7IHk8bWF4eTsgeSsrKSB7CS8qIEludGVycG9sYXRlIG90aGVyIGxpbmVzICovCi0JCQlmb3IoeD0wOyB4PG1heHg7IHgrKykgewotCQkJCWkgPSB5Km1heHggKyB4OwotCQkJCSpuY3ArKyA9ICgoaW50KWNwW2ldICsgKGludCljcFtpLW1heHhdKSA+PiAxOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KG5jcCwgY3AsIG1heHgqNCk7CQkvKiBDb3B5IGZpcnN0IGxpbmUgKi8KLQkJbmNwICs9IG1heHgqNDsKLQkJZm9yICh5PTE7IHk8bWF4eTsgeSsrKSB7CS8qIEludGVycG9sYXRlIG90aGVyIGxpbmVzICovCi0JCQlmb3IoeD0wOyB4PG1heHg7IHgrKykgewotCQkJCWkgPSAoeSptYXh4ICsgeCkqNCArIDE7Ci0JCQkJKm5jcCsrID0gMDsJLyogU2tpcCBhbGZhIGNvbXAgKi8KLQkJCQkqbmNwKysgPSAoKGludCljcFtpXSArIChpbnQpY3BbaS00Km1heHhdKSA+PiAxOwotCQkJCWkrKzsKLQkJCQkqbmNwKysgPSAoKGludCljcFtpXSArIChpbnQpY3BbaS00Km1heHhdKSA+PiAxOwotCQkJCWkrKzsKLQkJCQkqbmNwKysgPSAoKGludCljcFtpXSArIChpbnQpY3BbaS00Km1heHhdKSA+PiAxOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBydjsKKyAgICBpZiAoIHdpZHRoID09IDEgKSB7CisgICAgICAgIG1lbWNweShuY3AsIGNwLCBtYXh4KTsgICAgICAgICAgICAgICAgICAvKiBDb3B5IGZpcnN0IGxpbmUgKi8KKyAgICAgICAgbmNwICs9IG1heHg7CisgICAgICAgIGZvciAoeT0xOyB5PG1heHk7IHkrKykgeyAgICAgICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSBvdGhlciBsaW5lcyAqLworICAgICAgICAgICAgZm9yKHg9MDsgeDxtYXh4OyB4KyspIHsKKyAgICAgICAgICAgICAgICBpID0geSptYXh4ICsgeDsKKyAgICAgICAgICAgICAgICAqbmNwKysgPSAoKGludCljcFtpXSArIChpbnQpY3BbaS1tYXh4XSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShuY3AsIGNwLCBtYXh4KjQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZmlyc3QgbGluZSAqLworICAgICAgICBuY3AgKz0gbWF4eCo0OworICAgICAgICBmb3IgKHk9MTsgeTxtYXh5OyB5KyspIHsgICAgICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgb3RoZXIgbGluZXMgKi8KKyAgICAgICAgICAgIGZvcih4PTA7IHg8bWF4eDsgeCsrKSB7CisgICAgICAgICAgICAgICAgaSA9ICh5Km1heHggKyB4KSo0ICsgMTsKKyAgICAgICAgICAgICAgICAqbmNwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgYWxmYSBjb21wICovCisgICAgICAgICAgICAgICAgKm5jcCsrID0gKChpbnQpY3BbaV0gKyAoaW50KWNwW2ktNCptYXh4XSkgPj4gMTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgKm5jcCsrID0gKChpbnQpY3BbaV0gKyAoaW50KWNwW2ktNCptYXh4XSkgPj4gMTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgKm5jcCsrID0gKChpbnQpY3BbaV0gKyAoaW50KWNwW2ktNCptYXh4XSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX2dyZXkybW9ubyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHRyZXMsIHgsIHksIGxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQl1bnNpZ25lZCBjaGFyIG92YWx1ZTsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIGJpdDsKKyAgICBpbnQgdHJlcywgeCwgeSwgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIHVuc2lnbmVkIGNoYXIgb3ZhbHVlOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaSwgYml0OwogCiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaSIsICZjcCwgJmxlbiwgJngsICZ5LCAmdHJlcykgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaSIsICZjcCwgJmxlbiwgJngsICZ5LCAmdHJlcykgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rNykvOCk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzcpLzgpOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JYml0ID0gMHg4MDsKLQlvdmFsdWUgPSAwOwotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgewotCQlpZiAoIChpbnQpY3BbaV0gPiB0cmVzICkKLQkJCW92YWx1ZSB8PSBiaXQ7Ci0JCWJpdCA+Pj0gMTsKLQkJaWYgKCBiaXQgPT0gMCApIHsKLQkJCSpuY3ArKyA9IG92YWx1ZTsKLQkJCWJpdCA9IDB4ODA7Ci0JCQlvdmFsdWUgPSAwOwotCQl9Ci0JfQotCWlmICggYml0ICE9IDB4ODAgKQotCQkqbmNwKysgPSBvdmFsdWU7Ci0JcmV0dXJuIHJ2OworICAgIGJpdCA9IDB4ODA7CisgICAgb3ZhbHVlID0gMDsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgaWYgKCAoaW50KWNwW2ldID4gdHJlcyApCisgICAgICAgICAgICBvdmFsdWUgfD0gYml0OworICAgICAgICBiaXQgPj49IDE7CisgICAgICAgIGlmICggYml0ID09IDAgKSB7CisgICAgICAgICAgICAqbmNwKysgPSBvdmFsdWU7CisgICAgICAgICAgICBiaXQgPSAweDgwOworICAgICAgICAgICAgb3ZhbHVlID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIGJpdCAhPSAweDgwICkKKyAgICAgICAgKm5jcCsrID0gb3ZhbHVlOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfZ3JleTJncmV5NChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQl1bnNpZ25lZCBjaGFyIG92YWx1ZTsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7Ci0JaW50IHBvczsKKyAgICBpbnQgeCwgeSwgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIHVuc2lnbmVkIGNoYXIgb3ZhbHVlOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKKyAgICBpbnQgcG9zOwogCiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCAhY2hlY2tfbXVsdGlwbHkobGVuLCB4LCB5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGxlbisxKS8yKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLQlwb3MgPSAwOwotCW92YWx1ZSA9IDA7Ci0JZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7Ci0JCW92YWx1ZSB8PSAoKGludCljcFtpXSAmIDB4ZjApID4+IHBvczsKLQkJcG9zICs9IDQ7Ci0JCWlmICggcG9zID09IDggKSB7Ci0JCQkqbmNwKysgPSBvdmFsdWU7Ci0JCQlvdmFsdWUgPSAwOwotCQkJcG9zID0gMDsKLQkJfQotCX0KLQlpZiAoIHBvcyAhPSAwICkKLQkJKm5jcCsrID0gb3ZhbHVlOwotCXJldHVybiBydjsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rMSkvMik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcG9zID0gMDsKKyAgICBvdmFsdWUgPSAwOworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICBvdmFsdWUgfD0gKChpbnQpY3BbaV0gJiAweGYwKSA+PiBwb3M7CisgICAgICAgIHBvcyArPSA0OworICAgICAgICBpZiAoIHBvcyA9PSA4ICkgeworICAgICAgICAgICAgKm5jcCsrID0gb3ZhbHVlOworICAgICAgICAgICAgb3ZhbHVlID0gMDsKKyAgICAgICAgICAgIHBvcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBwb3MgIT0gMCApCisgICAgICAgICpuY3ArKyA9IG92YWx1ZTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX2dyZXkyZ3JleTIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4LCB5LCBsZW47Ci0JdW5zaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JdW5zaWduZWQgY2hhciBvdmFsdWU7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOwotCWludCBwb3M7CisgICAgaW50IHgsIHksIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICB1bnNpZ25lZCBjaGFyIG92YWx1ZTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CisgICAgaW50IHBvczsKIAogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rMykvNCk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JcG9zID0gMDsKLQlvdmFsdWUgPSAwOwotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgewotCQlvdmFsdWUgfD0gKChpbnQpY3BbaV0gJiAweGMwKSA+PiBwb3M7Ci0JCXBvcyArPSAyOwotCQlpZiAoIHBvcyA9PSA4ICkgewotCQkJKm5jcCsrID0gb3ZhbHVlOwotCQkJb3ZhbHVlID0gMDsKLQkJCXBvcyA9IDA7Ci0JCX0KLQl9Ci0JaWYgKCBwb3MgIT0gMCApCi0JCSpuY3ArKyA9IG92YWx1ZTsKLQlyZXR1cm4gcnY7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzMpLzQpOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIHBvcyA9IDA7CisgICAgb3ZhbHVlID0gMDsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgb3ZhbHVlIHw9ICgoaW50KWNwW2ldICYgMHhjMCkgPj4gcG9zOworICAgICAgICBwb3MgKz0gMjsKKyAgICAgICAgaWYgKCBwb3MgPT0gOCApIHsKKyAgICAgICAgICAgICpuY3ArKyA9IG92YWx1ZTsKKyAgICAgICAgICAgIG92YWx1ZSA9IDA7CisgICAgICAgICAgICBwb3MgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmICggcG9zICE9IDAgKQorICAgICAgICAqbmNwKysgPSBvdmFsdWU7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9kaXRoZXIybW9ubyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN1bSwgeCwgeSwgbGVuOwotCXVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotCXVuc2lnbmVkIGNoYXIgb3ZhbHVlOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaSwgYml0OworICAgIGludCBzdW0sIHgsIHksIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICB1bnNpZ25lZCBjaGFyIG92YWx1ZTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIGJpdDsKIAogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rNykvOCk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzcpLzgpOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JYml0ID0gMHg4MDsKLQlvdmFsdWUgPSAwOwotCXN1bSA9IDA7Ci0JZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7Ci0JCXN1bSArPSBjcFtpXTsKLQkJaWYgKCBzdW0gPj0gMjU2ICkgewotCQkJc3VtIC09IDI1NjsKLQkJCW92YWx1ZSB8PSBiaXQ7Ci0JCX0KLQkJYml0ID4+PSAxOwotCQlpZiAoIGJpdCA9PSAwICkgewotCQkJKm5jcCsrID0gb3ZhbHVlOwotCQkJYml0ID0gMHg4MDsKLQkJCW92YWx1ZSA9IDA7Ci0JCX0KLQl9Ci0JaWYgKCBiaXQgIT0gMHg4MCApCi0JCSpuY3ArKyA9IG92YWx1ZTsKLQlyZXR1cm4gcnY7CisgICAgYml0ID0gMHg4MDsKKyAgICBvdmFsdWUgPSAwOworICAgIHN1bSA9IDA7CisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgIHN1bSArPSBjcFtpXTsKKyAgICAgICAgaWYgKCBzdW0gPj0gMjU2ICkgeworICAgICAgICAgICAgc3VtIC09IDI1NjsKKyAgICAgICAgICAgIG92YWx1ZSB8PSBiaXQ7CisgICAgICAgIH0KKyAgICAgICAgYml0ID4+PSAxOworICAgICAgICBpZiAoIGJpdCA9PSAwICkgeworICAgICAgICAgICAgKm5jcCsrID0gb3ZhbHVlOworICAgICAgICAgICAgYml0ID0gMHg4MDsKKyAgICAgICAgICAgIG92YWx1ZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBiaXQgIT0gMHg4MCApCisgICAgICAgICpuY3ArKyA9IG92YWx1ZTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX2RpdGhlcjJncmV5MihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQl1bnNpZ25lZCBjaGFyIG92YWx1ZTsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7Ci0JaW50IHBvczsKLQlpbnQgc3VtID0gMCwgbnZhbHVlOworICAgIGludCB4LCB5LCBsZW47CisgICAgdW5zaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgdW5zaWduZWQgY2hhciBvdmFsdWU7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpOworICAgIGludCBwb3M7CisgICAgaW50IHN1bSA9IDAsIG52YWx1ZTsKIAogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rMykvNCk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JcG9zID0gMTsKLQlvdmFsdWUgPSAwOwotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgewotCQlzdW0gKz0gY3BbaV07Ci0JCW52YWx1ZSA9IHN1bSAmIDB4MTgwOwotCQlzdW0gLT0gbnZhbHVlOwotCQlvdmFsdWUgfD0gbnZhbHVlID4+IHBvczsKLQkJcG9zICs9IDI7Ci0JCWlmICggcG9zID09IDkgKSB7Ci0JCQkqbmNwKysgPSBvdmFsdWU7Ci0JCQlvdmFsdWUgPSAwOwotCQkJcG9zID0gMTsKLQkJfQotCX0KLQlpZiAoIHBvcyAhPSAwICkKLQkJKm5jcCsrID0gb3ZhbHVlOwotCXJldHVybiBydjsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rMykvNCk7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcG9zID0gMTsKKyAgICBvdmFsdWUgPSAwOworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICBzdW0gKz0gY3BbaV07CisgICAgICAgIG52YWx1ZSA9IHN1bSAmIDB4MTgwOworICAgICAgICBzdW0gLT0gbnZhbHVlOworICAgICAgICBvdmFsdWUgfD0gbnZhbHVlID4+IHBvczsKKyAgICAgICAgcG9zICs9IDI7CisgICAgICAgIGlmICggcG9zID09IDkgKSB7CisgICAgICAgICAgICAqbmNwKysgPSBvdmFsdWU7CisgICAgICAgICAgICBvdmFsdWUgPSAwOworICAgICAgICAgICAgcG9zID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIHBvcyAhPSAwICkKKyAgICAgICAgKm5jcCsrID0gb3ZhbHVlOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfbW9ubzJncmV5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgdjAsIHYxLCB4LCB5LCBsZW4sIG5sZW47Ci0JdW5zaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpLCBiaXQ7CisgICAgaW50IHYwLCB2MSwgeCwgeSwgbGVuLCBubGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaSwgYml0OwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWlpIiwgJmNwLCAmbGVuLCAmeCwgJnksICZ2MCwgJnYxKSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpaSIsICZjcCwgJmxlbiwgJngsICZ5LCAmdjAsICZ2MSkgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBubGVuID0geCp5OwotCWlmICggIWNoZWNrX211bHRpcGx5KG5sZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCAobmxlbis3KS84ICE9IGxlbiApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEltYWdlb3BFcnJvciwgIlN0cmluZyBoYXMgaW5jb3JyZWN0IGxlbmd0aCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgbmxlbiA9IHgqeTsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICggKG5sZW4rNykvOCAhPSBsZW4gKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTdHJpbmcgaGFzIGluY29ycmVjdCBsZW5ndGgiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JYml0ID0gMHg4MDsKLQlmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7Ci0JCWlmICggKmNwICYgYml0ICkKLQkJCSpuY3ArKyA9IHYxOwotCQllbHNlCi0JCQkqbmNwKysgPSB2MDsKLQkJYml0ID4+PSAxOwotCQlpZiAoIGJpdCA9PSAwICkgewotCQkJYml0ID0gMHg4MDsKLQkJCWNwKys7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJ2OworICAgIGJpdCA9IDB4ODA7CisgICAgZm9yICggaT0wOyBpIDwgbmxlbjsgaSsrICkgeworICAgICAgICBpZiAoICpjcCAmIGJpdCApCisgICAgICAgICAgICAqbmNwKysgPSB2MTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKm5jcCsrID0gdjA7CisgICAgICAgIGJpdCA+Pj0gMTsKKyAgICAgICAgaWYgKCBiaXQgPT0gMCApIHsKKyAgICAgICAgICAgIGJpdCA9IDB4ODA7CisgICAgICAgICAgICBjcCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfZ3JleTIyZ3JleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbiwgbmxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIHBvcywgdmFsdWUgPSAwLCBudmFsdWU7CisgICAgaW50IHgsIHksIGxlbiwgbmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIHBvcywgdmFsdWUgPSAwLCBudmFsdWU7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JbmxlbiA9IHgqeTsKLQlpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICggKG5sZW4rMykvNCAhPSBsZW4gKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTdHJpbmcgaGFzIGluY29ycmVjdCBsZW5ndGgiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIG5sZW4gPSB4Knk7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobmxlbiwgeCwgeSkgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIChubGVuKzMpLzQgIT0gbGVuICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU3RyaW5nIGhhcyBpbmNvcnJlY3QgbGVuZ3RoIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCXBvcyA9IDA7Ci0JZm9yICggaT0wOyBpIDwgbmxlbjsgaSsrICkgewotCQlpZiAoIHBvcyA9PSAwICkgewotCQkJdmFsdWUgPSAqY3ArKzsKLQkJCXBvcyA9IDg7Ci0JCX0KLQkJcG9zIC09IDI7Ci0JCW52YWx1ZSA9ICh2YWx1ZSA+PiBwb3MpICYgMHgwMzsKLQkJKm5jcCsrID0gbnZhbHVlIHwgKG52YWx1ZSA8PCAyKSB8Ci0JCQkgKG52YWx1ZSA8PCA0KSB8IChudmFsdWUgPDwgNik7Ci0JfQotCXJldHVybiBydjsKKyAgICBwb3MgPSAwOworICAgIGZvciAoIGk9MDsgaSA8IG5sZW47IGkrKyApIHsKKyAgICAgICAgaWYgKCBwb3MgPT0gMCApIHsKKyAgICAgICAgICAgIHZhbHVlID0gKmNwKys7CisgICAgICAgICAgICBwb3MgPSA4OworICAgICAgICB9CisgICAgICAgIHBvcyAtPSAyOworICAgICAgICBudmFsdWUgPSAodmFsdWUgPj4gcG9zKSAmIDB4MDM7CisgICAgICAgICpuY3ArKyA9IG52YWx1ZSB8IChudmFsdWUgPDwgMikgfAorICAgICAgICAgICAgICAgICAobnZhbHVlIDw8IDQpIHwgKG52YWx1ZSA8PCA2KTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9ncmV5NDJncmV5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeCwgeSwgbGVuLCBubGVuOwotCXVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaSwgcG9zLCB2YWx1ZSA9IDAsIG52YWx1ZTsKKyAgICBpbnQgeCwgeSwgbGVuLCBubGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaSwgcG9zLCB2YWx1ZSA9IDAsIG52YWx1ZTsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlubGVuID0geCp5OwotCWlmICggIWNoZWNrX211bHRpcGx5KG5sZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCAobmxlbisxKS8yICE9IGxlbiApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEltYWdlb3BFcnJvciwgIlN0cmluZyBoYXMgaW5jb3JyZWN0IGxlbmd0aCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgbmxlbiA9IHgqeTsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICggKG5sZW4rMSkvMiAhPSBsZW4gKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTdHJpbmcgaGFzIGluY29ycmVjdCBsZW5ndGgiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JcG9zID0gMDsKLQlmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7Ci0JCWlmICggcG9zID09IDAgKSB7Ci0JCQl2YWx1ZSA9ICpjcCsrOwotCQkJcG9zID0gODsKLQkJfQotCQlwb3MgLT0gNDsKLQkJbnZhbHVlID0gKHZhbHVlID4+IHBvcykgJiAweDBmOwotCQkqbmNwKysgPSBudmFsdWUgfCAobnZhbHVlIDw8IDQpOwotCX0KLQlyZXR1cm4gcnY7CisgICAgcG9zID0gMDsKKyAgICBmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7CisgICAgICAgIGlmICggcG9zID09IDAgKSB7CisgICAgICAgICAgICB2YWx1ZSA9ICpjcCsrOworICAgICAgICAgICAgcG9zID0gODsKKyAgICAgICAgfQorICAgICAgICBwb3MgLT0gNDsKKyAgICAgICAgbnZhbHVlID0gKHZhbHVlID4+IHBvcykgJiAweDBmOworICAgICAgICAqbmNwKysgPSBudmFsdWUgfCAobnZhbHVlIDw8IDQpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX3JnYjJyZ2I4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeCwgeSwgbGVuLCBubGVuOwotCXVuc2lnbmVkIGNoYXIgKmNwOwotCXVuc2lnbmVkIGNoYXIgKm5jcDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIHIsIGcsIGI7Ci0JaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKKyAgICBpbnQgeCwgeSwgbGVuLCBubGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIHIsIGcsIGI7CisgICAgaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoICFjaGVja19tdWx0aXBseV9zaXplKGxlbiwgeCwgIngiLCB5LCAieSIsIDQpICkKLQkJcmV0dXJuIDA7Ci0JbmxlbiA9IHgqeTsKLQlpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCB4LCAieCIsIHksICJ5IiwgNCkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBubGVuID0geCp5OworICAgIGlmICggIWNoZWNrX211bHRpcGx5KG5sZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLQlmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7Ci0JCS8qIEJpdHMgaW4gc291cmNlOiBhYWFhYWFhYSBCQmJiYmJiYiBHR0dnZ2dnZyBSUlJycnJyciAqLwotCQlpZiAoYmFja3dhcmRfY29tcGF0aWJsZSkgewotCQkJUHlfVUludDMyIHZhbHVlID0gKiAoUHlfVUludDMyICopIGNwOwotCQkJY3AgKz0gNDsKLQkJCXIgPSAoaW50KSAoKHZhbHVlICYgMHhmZikgLyAyNTUuICogNy4gKyAuNSk7Ci0JCQlnID0gKGludCkgKCgodmFsdWUgPj4gOCkgJiAweGZmKSAvIDI1NS4gKiA3LiArIC41KTsKLQkJCWIgPSAoaW50KSAoKCh2YWx1ZSA+PiAxNikgJiAweGZmKSAvIDI1NS4gKiAzLiArIC41KTsKLQkJfSBlbHNlIHsKLQkJCWNwKys7CQkvKiBza2lwIGFscGhhIGNoYW5uZWwgKi8KLQkJCWIgPSAoaW50KSAoKmNwKysgLyAyNTUuICogMy4gKyAuNSk7Ci0JCQlnID0gKGludCkgKCpjcCsrIC8gMjU1LiAqIDcuICsgLjUpOwotCQkJciA9IChpbnQpICgqY3ArKyAvIDI1NS4gKiA3LiArIC41KTsKLQkJfQotCQkqbmNwKysgPSAodW5zaWduZWQgY2hhcikoKHI8PDUpIHwgKGI8PDMpIHwgZyk7Ci0JfQotCXJldHVybiBydjsKKyAgICBmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7CisgICAgICAgIC8qIEJpdHMgaW4gc291cmNlOiBhYWFhYWFhYSBCQmJiYmJiYiBHR0dnZ2dnZyBSUlJycnJyciAqLworICAgICAgICBpZiAoYmFja3dhcmRfY29tcGF0aWJsZSkgeworICAgICAgICAgICAgUHlfVUludDMyIHZhbHVlID0gKiAoUHlfVUludDMyICopIGNwOworICAgICAgICAgICAgY3AgKz0gNDsKKyAgICAgICAgICAgIHIgPSAoaW50KSAoKHZhbHVlICYgMHhmZikgLyAyNTUuICogNy4gKyAuNSk7CisgICAgICAgICAgICBnID0gKGludCkgKCgodmFsdWUgPj4gOCkgJiAweGZmKSAvIDI1NS4gKiA3LiArIC41KTsKKyAgICAgICAgICAgIGIgPSAoaW50KSAoKCh2YWx1ZSA+PiAxNikgJiAweGZmKSAvIDI1NS4gKiAzLiArIC41KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNwKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIGFscGhhIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGIgPSAoaW50KSAoKmNwKysgLyAyNTUuICogMy4gKyAuNSk7CisgICAgICAgICAgICBnID0gKGludCkgKCpjcCsrIC8gMjU1LiAqIDcuICsgLjUpOworICAgICAgICAgICAgciA9IChpbnQpICgqY3ArKyAvIDI1NS4gKiA3LiArIC41KTsKKyAgICAgICAgfQorICAgICAgICAqbmNwKysgPSAodW5zaWduZWQgY2hhcikoKHI8PDUpIHwgKGI8PDMpIHwgZyk7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfcmdiODJyZ2IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4LCB5LCBsZW4sIG5sZW47Ci0JdW5zaWduZWQgY2hhciAqY3A7Ci0JdW5zaWduZWQgY2hhciAqbmNwOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaSwgciwgZywgYjsKLQl1bnNpZ25lZCBjaGFyIHZhbHVlOwotCWludCBiYWNrd2FyZF9jb21wYXRpYmxlID0gaW1hZ2VvcF9iYWNrd2FyZF9jb21wYXRpYmxlKCk7CisgICAgaW50IHgsIHksIGxlbiwgbmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpLCByLCBnLCBiOworICAgIHVuc2lnbmVkIGNoYXIgdmFsdWU7CisgICAgaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7Ci0JbmxlbiA9IHgqeSo0OwotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobmxlbiwgeCwgIngiLCB5LCAieSIsIDQpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOworICAgIG5sZW4gPSB4KnkqNDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseV9zaXplKG5sZW4sIHgsICJ4IiwgeSwgInkiLCA0KSApCisgICAgICAgIHJldHVybiAwOwogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7Ci0JCS8qIEJpdHMgaW4gc291cmNlOiBSUlJCQkdHRwotCQkqKiBSZWQgYW5kIEdyZWVuIGFyZSBtdWx0aXBsaWVkIGJ5IDM2LjUsIEJsdWUgYnkgODUKLQkJKi8KLQkJdmFsdWUgPSAqY3ArKzsKLQkJciA9ICh2YWx1ZSA+PiA1KSAmIDc7Ci0JCWcgPSAodmFsdWUgICAgICkgJiA3OwotCQliID0gKHZhbHVlID4+IDMpICYgMzsKLQkJciA9IChyPDw1KSB8IChyPDwzKSB8IChyPj4xKTsKLQkJZyA9IChnPDw1KSB8IChnPDwzKSB8IChnPj4xKTsKLQkJYiA9IChiPDw2KSB8IChiPDw0KSB8IChiPDwyKSB8IGI7Ci0JCWlmIChiYWNrd2FyZF9jb21wYXRpYmxlKSB7Ci0JCQlQeV9VSW50MzIgbnZhbHVlID0gciB8IChnPDw4KSB8IChiPDwxNik7Ci0JCQkqIChQeV9VSW50MzIgKikgbmNwID0gbnZhbHVlOwotCQkJbmNwICs9IDQ7Ci0JCX0gZWxzZSB7Ci0JCQkqbmNwKysgPSAwOwotCQkJKm5jcCsrID0gYjsKLQkJCSpuY3ArKyA9IGc7Ci0JCQkqbmNwKysgPSByOwotCQl9Ci0JfQotCXJldHVybiBydjsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgLyogQml0cyBpbiBzb3VyY2U6IFJSUkJCR0dHCisgICAgICAgICoqIFJlZCBhbmQgR3JlZW4gYXJlIG11bHRpcGxpZWQgYnkgMzYuNSwgQmx1ZSBieSA4NQorICAgICAgICAqLworICAgICAgICB2YWx1ZSA9ICpjcCsrOworICAgICAgICByID0gKHZhbHVlID4+IDUpICYgNzsKKyAgICAgICAgZyA9ICh2YWx1ZSAgICAgKSAmIDc7CisgICAgICAgIGIgPSAodmFsdWUgPj4gMykgJiAzOworICAgICAgICByID0gKHI8PDUpIHwgKHI8PDMpIHwgKHI+PjEpOworICAgICAgICBnID0gKGc8PDUpIHwgKGc8PDMpIHwgKGc+PjEpOworICAgICAgICBiID0gKGI8PDYpIHwgKGI8PDQpIHwgKGI8PDIpIHwgYjsKKyAgICAgICAgaWYgKGJhY2t3YXJkX2NvbXBhdGlibGUpIHsKKyAgICAgICAgICAgIFB5X1VJbnQzMiBudmFsdWUgPSByIHwgKGc8PDgpIHwgKGI8PDE2KTsKKyAgICAgICAgICAgICogKFB5X1VJbnQzMiAqKSBuY3AgPSBudmFsdWU7CisgICAgICAgICAgICBuY3AgKz0gNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpuY3ArKyA9IDA7CisgICAgICAgICAgICAqbmNwKysgPSBiOworICAgICAgICAgICAgKm5jcCsrID0gZzsKKyAgICAgICAgICAgICpuY3ArKyA9IHI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9yZ2IyZ3JleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbiwgbmxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyICpuY3A7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpLCByLCBnLCBiOwotCWludCBudmFsdWU7Ci0JaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKKyAgICBpbnQgeCwgeSwgbGVuLCBubGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIHIsIGcsIGI7CisgICAgaW50IG52YWx1ZTsKKyAgICBpbnQgYmFja3dhcmRfY29tcGF0aWJsZSA9IGltYWdlb3BfYmFja3dhcmRfY29tcGF0aWJsZSgpOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCB4LCAieCIsIHksICJ5IiwgNCkgKQotCQlyZXR1cm4gMDsKLQlubGVuID0geCp5OwotCWlmICggIWNoZWNrX211bHRpcGx5KG5sZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShsZW4sIHgsICJ4IiwgeSwgInkiLCA0KSApCisgICAgICAgIHJldHVybiAwOworICAgIG5sZW4gPSB4Knk7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobmxlbiwgeCwgeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCWZvciAoIGk9MDsgaSA8IG5sZW47IGkrKyApIHsKLQkJaWYgKGJhY2t3YXJkX2NvbXBhdGlibGUpIHsKLQkJCVB5X1VJbnQzMiB2YWx1ZSA9ICogKFB5X1VJbnQzMiAqKSBjcDsKLQkJCWNwICs9IDQ7Ci0JCQlyID0gKGludCkgKCh2YWx1ZSAmIDB4ZmYpIC8gMjU1LiAqIDcuICsgLjUpOwotCQkJZyA9IChpbnQpICgoKHZhbHVlID4+IDgpICYgMHhmZikgLyAyNTUuICogNy4gKyAuNSk7Ci0JCQliID0gKGludCkgKCgodmFsdWUgPj4gMTYpICYgMHhmZikgLyAyNTUuICogMy4gKyAuNSk7Ci0JCX0gZWxzZSB7Ci0JCQljcCsrOwkJLyogc2tpcCBhbHBoYSBjaGFubmVsICovCi0JCQliID0gKmNwKys7Ci0JCQlnID0gKmNwKys7Ci0JCQlyID0gKmNwKys7Ci0JCX0KLQkJbnZhbHVlID0gKGludCkoMC4zMCpyICsgMC41OSpnICsgMC4xMSpiKTsKLQkJaWYgKCBudmFsdWUgPiAyNTUgKSBudmFsdWUgPSAyNTU7Ci0JCSpuY3ArKyA9ICh1bnNpZ25lZCBjaGFyKW52YWx1ZTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgIGZvciAoIGk9MDsgaSA8IG5sZW47IGkrKyApIHsKKyAgICAgICAgaWYgKGJhY2t3YXJkX2NvbXBhdGlibGUpIHsKKyAgICAgICAgICAgIFB5X1VJbnQzMiB2YWx1ZSA9ICogKFB5X1VJbnQzMiAqKSBjcDsKKyAgICAgICAgICAgIGNwICs9IDQ7CisgICAgICAgICAgICByID0gKGludCkgKCh2YWx1ZSAmIDB4ZmYpIC8gMjU1LiAqIDcuICsgLjUpOworICAgICAgICAgICAgZyA9IChpbnQpICgoKHZhbHVlID4+IDgpICYgMHhmZikgLyAyNTUuICogNy4gKyAuNSk7CisgICAgICAgICAgICBiID0gKGludCkgKCgodmFsdWUgPj4gMTYpICYgMHhmZikgLyAyNTUuICogMy4gKyAuNSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcCsrOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBhbHBoYSBjaGFubmVsICovCisgICAgICAgICAgICBiID0gKmNwKys7CisgICAgICAgICAgICBnID0gKmNwKys7CisgICAgICAgICAgICByID0gKmNwKys7CisgICAgICAgIH0KKyAgICAgICAgbnZhbHVlID0gKGludCkoMC4zMCpyICsgMC41OSpnICsgMC4xMSpiKTsKKyAgICAgICAgaWYgKCBudmFsdWUgPiAyNTUgKSBudmFsdWUgPSAyNTU7CisgICAgICAgICpuY3ArKyA9ICh1bnNpZ25lZCBjaGFyKW52YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9ncmV5MnJnYihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbiwgbmxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyICpuY3A7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgdmFsdWU7Ci0JaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKKyAgICBpbnQgeCwgeSwgbGVuLCBubGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciB2YWx1ZTsKKyAgICBpbnQgYmFja3dhcmRfY29tcGF0aWJsZSA9IGltYWdlb3BfYmFja3dhcmRfY29tcGF0aWJsZSgpOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKLSAgICAgICAgbmxlbiA9IHgqeSo0OwotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobmxlbiwgeCwgIngiLCB5LCAieSIsIDQpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOworICAgIG5sZW4gPSB4KnkqNDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseV9zaXplKG5sZW4sIHgsICJ4IiwgeSwgInkiLCA0KSApCisgICAgICAgIHJldHVybiAwOwogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7Ci0JCXZhbHVlID0gKmNwKys7Ci0JCWlmIChiYWNrd2FyZF9jb21wYXRpYmxlKSB7Ci0JCQkqIChQeV9VSW50MzIgKikgbmNwID0gKFB5X1VJbnQzMikgdmFsdWUgfCAoKFB5X1VJbnQzMikgdmFsdWUgPDwgOCApIHwgKChQeV9VSW50MzIpIHZhbHVlIDw8IDE2KTsKLQkJCW5jcCArPSA0OwotCQl9IGVsc2UgewotCQkJKm5jcCsrID0gMDsKLQkJCSpuY3ArKyA9IHZhbHVlOwotCQkJKm5jcCsrID0gdmFsdWU7Ci0JCQkqbmNwKysgPSB2YWx1ZTsKLQkJfQotCX0KLQlyZXR1cm4gcnY7CisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgIHZhbHVlID0gKmNwKys7CisgICAgICAgIGlmIChiYWNrd2FyZF9jb21wYXRpYmxlKSB7CisgICAgICAgICAgICAqIChQeV9VSW50MzIgKikgbmNwID0gKFB5X1VJbnQzMikgdmFsdWUgfCAoKFB5X1VJbnQzMikgdmFsdWUgPDwgOCApIHwgKChQeV9VSW50MzIpIHZhbHVlIDw8IDE2KTsKKyAgICAgICAgICAgIG5jcCArPSA0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm5jcCsrID0gMDsKKyAgICAgICAgICAgICpuY3ArKyA9IHZhbHVlOworICAgICAgICAgICAgKm5jcCsrID0gdmFsdWU7CisgICAgICAgICAgICAqbmNwKysgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBpbWFnZW9wX21ldGhvZHNbXSA9IHsKLQl7ICJjcm9wIiwJCWltYWdlb3BfY3JvcCwgTUVUSF9WQVJBUkdTIH0sCi0JeyAic2NhbGUiLAkJaW1hZ2VvcF9zY2FsZSwgTUVUSF9WQVJBUkdTIH0sCi0JeyAiZ3JleTJtb25vIiwJICAgICAgICBpbWFnZW9wX2dyZXkybW9ubywgTUVUSF9WQVJBUkdTIH0sCi0JeyAiZ3JleTJncmV5MiIsCSAgICAgICAgaW1hZ2VvcF9ncmV5MmdyZXkyLCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJncmV5MmdyZXk0IiwJICAgICAgICBpbWFnZW9wX2dyZXkyZ3JleTQsIE1FVEhfVkFSQVJHUyB9LAotCXsgImRpdGhlcjJtb25vIiwJaW1hZ2VvcF9kaXRoZXIybW9ubywgTUVUSF9WQVJBUkdTIH0sCi0JeyAiZGl0aGVyMmdyZXkyIiwJaW1hZ2VvcF9kaXRoZXIyZ3JleTIsIE1FVEhfVkFSQVJHUyB9LAotCXsgIm1vbm8yZ3JleSIsCSAgICAgICAgaW1hZ2VvcF9tb25vMmdyZXksIE1FVEhfVkFSQVJHUyB9LAotCXsgImdyZXkyMmdyZXkiLAkgICAgICAgIGltYWdlb3BfZ3JleTIyZ3JleSwgTUVUSF9WQVJBUkdTIH0sCi0JeyAiZ3JleTQyZ3JleSIsCSAgICAgICAgaW1hZ2VvcF9ncmV5NDJncmV5LCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJ0b3ZpZGVvIiwJICAgICAgICBpbWFnZW9wX3RvdmlkZW8sIE1FVEhfVkFSQVJHUyB9LAotCXsgInJnYjJyZ2I4IiwJICAgICAgICBpbWFnZW9wX3JnYjJyZ2I4LCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJyZ2I4MnJnYiIsCSAgICAgICAgaW1hZ2VvcF9yZ2I4MnJnYiwgTUVUSF9WQVJBUkdTIH0sCi0JeyAicmdiMmdyZXkiLAkgICAgICAgIGltYWdlb3BfcmdiMmdyZXksIE1FVEhfVkFSQVJHUyB9LAotCXsgImdyZXkycmdiIiwJICAgICAgICBpbWFnZW9wX2dyZXkycmdiLCBNRVRIX1ZBUkFSR1MgfSwKLQl7IDAsICAgICAgICAgICAgICAgICAgICAwIH0KKyAgICB7ICJjcm9wIiwgICAgICAgICAgICAgICAgICAgaW1hZ2VvcF9jcm9wLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJzY2FsZSIsICAgICAgICAgICAgICAgICAgaW1hZ2VvcF9zY2FsZSwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiZ3JleTJtb25vIiwgICAgICAgICAgICAgIGltYWdlb3BfZ3JleTJtb25vLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJncmV5MmdyZXkyIiwgICAgICAgICAgICAgaW1hZ2VvcF9ncmV5MmdyZXkyLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJncmV5MmdyZXk0IiwgICAgICAgICAgICAgaW1hZ2VvcF9ncmV5MmdyZXk0LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJkaXRoZXIybW9ubyIsICAgICAgICAgICAgaW1hZ2VvcF9kaXRoZXIybW9ubywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiZGl0aGVyMmdyZXkyIiwgICAgICAgICAgIGltYWdlb3BfZGl0aGVyMmdyZXkyLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJtb25vMmdyZXkiLCAgICAgICAgICAgICAgaW1hZ2VvcF9tb25vMmdyZXksIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImdyZXkyMmdyZXkiLCAgICAgICAgICAgICBpbWFnZW9wX2dyZXkyMmdyZXksIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImdyZXk0MmdyZXkiLCAgICAgICAgICAgICBpbWFnZW9wX2dyZXk0MmdyZXksIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInRvdmlkZW8iLCAgICAgICAgICAgICAgICBpbWFnZW9wX3RvdmlkZW8sIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInJnYjJyZ2I4IiwgICAgICAgICAgICAgICBpbWFnZW9wX3JnYjJyZ2I4LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJyZ2I4MnJnYiIsICAgICAgICAgICAgICAgaW1hZ2VvcF9yZ2I4MnJnYiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAicmdiMmdyZXkiLCAgICAgICAgICAgICAgIGltYWdlb3BfcmdiMmdyZXksIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImdyZXkycmdiIiwgICAgICAgICAgICAgICBpbWFnZW9wX2dyZXkycmdiLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAwIH0KIH07CiAKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRpbWFnZW9wKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQlpZiAoUHlFcnJfV2FyblB5M2soInRoZSBpbWFnZW9wIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKLQkgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCi0JICAgIHJldHVybjsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSBpbWFnZW9wIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJpbWFnZW9wIiwgaW1hZ2VvcF9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JSW1hZ2VvcERpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUltYWdlb3BFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiaW1hZ2VvcC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChJbWFnZW9wRXJyb3IgIT0gTlVMTCkKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoSW1hZ2VvcERpY3QsICJlcnJvciIsIEltYWdlb3BFcnJvcik7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoImltYWdlb3AiLCBpbWFnZW9wX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBJbWFnZW9wRGljdCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgSW1hZ2VvcEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJpbWFnZW9wLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKEltYWdlb3BFcnJvciAhPSBOVUxMKQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhJbWFnZW9wRGljdCwgImVycm9yIiwgSW1hZ2VvcEVycm9yKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvaW1nZmlsZS5jIGIvTW9kdWxlcy9pbWdmaWxlLmMKaW5kZXggYmFhNmVhZC4uNzBkMzA3YiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9pbWdmaWxlLmMKKysrIGIvTW9kdWxlcy9pbWdmaWxlLmMKQEAgLTI1LDcgKzI1LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICogSW1nZmlsZUVycm9yOyAvKiBFeGNlcHRpb24gd2UgcmFpc2UgZm9yIHZhcmlvdXMgdHJvdWJsZSAqLwogCi1zdGF0aWMgaW50IHRvcF90b19ib3R0b207CS8qIFRydWUgaWYgd2Ugd2FudCB0b3AtdG8tYm90dG9tIGltYWdlcyAqLworc3RhdGljIGludCB0b3BfdG9fYm90dG9tOyAgICAgICAvKiBUcnVlIGlmIHdlIHdhbnQgdG9wLXRvLWJvdHRvbSBpbWFnZXMgKi8KIAogLyogVGhlIGltYWdlIGxpYnJhcnkgZG9lcyBub3QgYWx3YXlzIGNhbGwgdGhlIGVycm9yIGhhbmRlciA6LSgsCiAgICB0aGVyZWZvcmUgd2UgaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSBpbmRpY2F0aW5nIHRoYXQgaXQgd2FzIGNhbGxlZC4KQEAgLTM5LDkgKzM5LDkgQEAKIHN0YXRpYyB2b2lkCiBpbWdmaWxlX2Vycm9yKGNoYXIgKnN0cikKIHsKLQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLCBzdHIpOwotCWVycm9yX2NhbGxlZCA9IDE7Ci0JcmV0dXJuOwkvKiBUbyBpbWdsaWIsIHdoaWNoIHdpbGwgcmV0dXJuIGEgZmFpbHVyZSBpbmRpY2F0b3IgKi8KKyAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLCBzdHIpOworICAgIGVycm9yX2NhbGxlZCA9IDE7CisgICAgcmV0dXJuOyAgICAgLyogVG8gaW1nbGliLCB3aGljaCB3aWxsIHJldHVybiBhIGZhaWx1cmUgaW5kaWNhdG9yICovCiB9CiAKIApAQCAtNTEsMTIzICs1MSwxMjMgQEAKIHN0YXRpYyBJTUFHRSAqCiBpbWdmaWxlX29wZW4oY2hhciAqZm5hbWUpCiB7Ci0JSU1BR0UgKmltYWdlOwotCWlfc2V0ZXJyb3IoaW1nZmlsZV9lcnJvcik7Ci0JZXJyb3JfY2FsbGVkID0gMDsKLQllcnJubyA9IDA7Ci0JaWYgKCAoaW1hZ2UgPSBpb3BlbihmbmFtZSwgInIiKSkgPT0gTlVMTCApIHsKLQkJLyogRXJyb3IgbWF5IGFscmVhZHkgYmUgc2V0IGJ5IGltZ2ZpbGVfZXJyb3IgKi8KLQkJaWYgKCAhZXJyb3JfY2FsbGVkICkgewotCQkJaWYgKGVycm5vKQotCQkJCVB5RXJyX1NldEZyb21FcnJubyhJbWdmaWxlRXJyb3IpOwotCQkJZWxzZQotCQkJCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJCQkiQ2FuJ3Qgb3BlbiBpbWFnZSBmaWxlIik7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBpbWFnZTsKKyAgICBJTUFHRSAqaW1hZ2U7CisgICAgaV9zZXRlcnJvcihpbWdmaWxlX2Vycm9yKTsKKyAgICBlcnJvcl9jYWxsZWQgPSAwOworICAgIGVycm5vID0gMDsKKyAgICBpZiAoIChpbWFnZSA9IGlvcGVuKGZuYW1lLCAiciIpKSA9PSBOVUxMICkgeworICAgICAgICAvKiBFcnJvciBtYXkgYWxyZWFkeSBiZSBzZXQgYnkgaW1nZmlsZV9lcnJvciAqLworICAgICAgICBpZiAoICFlcnJvcl9jYWxsZWQgKSB7CisgICAgICAgICAgICBpZiAoZXJybm8pCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEltZ2ZpbGVFcnJvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IG9wZW4gaW1hZ2UgZmlsZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gaW1hZ2U7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWdmaWxlX3R0b2IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBuZXd2YWw7Ci0JUHlPYmplY3QgKnJ2OwotICAgIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTp0dG9iIiwgJm5ld3ZhbCkpCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gUHlJbnRfRnJvbUxvbmcodG9wX3RvX2JvdHRvbSk7Ci0JdG9wX3RvX2JvdHRvbSA9IG5ld3ZhbDsKLQlyZXR1cm4gcnY7CisgICAgaW50IG5ld3ZhbDsKKyAgICBQeU9iamVjdCAqcnY7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6dHRvYiIsICZuZXd2YWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IFB5SW50X0Zyb21Mb25nKHRvcF90b19ib3R0b20pOworICAgIHRvcF90b19ib3R0b20gPSBuZXd2YWw7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1nZmlsZV9yZWFkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmbmFtZTsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IHhzaXplLCB5c2l6ZSwgenNpemU7Ci0JY2hhciAqY2RhdGFwOwotCWxvbmcgKmlkYXRhcDsKLQlzdGF0aWMgc2hvcnQgcnNbODE5Ml0sIGdzWzgxOTJdLCBic1s4MTkyXTsKLQlpbnQgeCwgeTsKLQlJTUFHRSAqaW1hZ2U7Ci0JaW50IHlmaXJzdCwgeWxhc3QsIHlzdGVwOworICAgIGNoYXIgKmZuYW1lOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgeHNpemUsIHlzaXplLCB6c2l6ZTsKKyAgICBjaGFyICpjZGF0YXA7CisgICAgbG9uZyAqaWRhdGFwOworICAgIHN0YXRpYyBzaG9ydCByc1s4MTkyXSwgZ3NbODE5Ml0sIGJzWzgxOTJdOworICAgIGludCB4LCB5OworICAgIElNQUdFICppbWFnZTsKKyAgICBpbnQgeWZpcnN0LCB5bGFzdCwgeXN0ZXA7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnJlYWQiLCAmZm5hbWUpICkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgCi0JaWYgKCAoaW1hZ2UgPSBpbWdmaWxlX29wZW4oZm5hbWUpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgCi0JaWYgKCBpbWFnZS0+Y29sb3JtYXAgIT0gQ01fTk9STUFMICkgewotCQlpY2xvc2UoaW1hZ2UpOwotCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAotCQkJCSJDYW4gb25seSBoYW5kbGUgQ01fTk9STUFMIGltYWdlcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCBCUFAoaW1hZ2UtPnR5cGUpICE9IDEgKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbid0IGhhbmRsZSBpbWdmaWxlcyB3aXRoIGJwcCE9MSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JeHNpemUgPSBpbWFnZS0+eHNpemU7Ci0JeXNpemUgPSBpbWFnZS0+eXNpemU7Ci0JenNpemUgPSBpbWFnZS0+enNpemU7Ci0JaWYgKCB6c2l6ZSAhPSAxICYmIHpzaXplICE9IDMpIHsKLQkJaWNsb3NlKGltYWdlKTsKLQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKLQkJCQkiQ2FuIG9ubHkgaGFuZGxlIDEgb3IgMyBieXRlIHBpeGVscyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCB4c2l6ZSA+IDgxOTIgKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbid0IGhhbmRsZSBpbWFnZSB3aXRoID4gODE5MiBjb2x1bW5zIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnJlYWQiLCAmZm5hbWUpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIHpzaXplID09IDMgKSB6c2l6ZSA9IDQ7Ci0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHhzaXplKnlzaXplKnpzaXplKTsKLQlpZiAoIHJ2ID09IE5VTEwgKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljZGF0YXAgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JaWRhdGFwID0gKGxvbmcgKiljZGF0YXA7CisgICAgaWYgKCAoaW1hZ2UgPSBpbWdmaWxlX29wZW4oZm5hbWUpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodG9wX3RvX2JvdHRvbSkgewotCQl5Zmlyc3QgPSB5c2l6ZS0xOwotCQl5bGFzdCA9IC0xOwotCQl5c3RlcCA9IC0xOwotCX0gZWxzZSB7Ci0JCXlmaXJzdCA9IDA7Ci0JCXlsYXN0ID0geXNpemU7Ci0JCXlzdGVwID0gMTsKLQl9Ci0JZm9yICggeT15Zmlyc3Q7IHkgIT0geWxhc3QgJiYgIWVycm9yX2NhbGxlZDsgeSArPSB5c3RlcCApIHsKLQkJaWYgKCB6c2l6ZSA9PSAxICkgewotCQkJZ2V0cm93KGltYWdlLCBycywgeSwgMCk7Ci0JCQlmb3IoeD0wOyB4PHhzaXplOyB4KysgKQotCQkJCSpjZGF0YXArKyA9IHJzW3hdOwotCQl9IGVsc2UgewotCQkJZ2V0cm93KGltYWdlLCBycywgeSwgMCk7Ci0JCQlnZXRyb3coaW1hZ2UsIGdzLCB5LCAxKTsKLQkJCWdldHJvdyhpbWFnZSwgYnMsIHksIDIpOwotCQkJZm9yKHg9MDsgeDx4c2l6ZTsgeCsrICkKLQkJCQkqaWRhdGFwKysgPSAocnNbeF0gJiAweGZmKSAgfAotCQkJCQkoKGdzW3hdICYgMHhmZik8PDgpIHwKLQkJCQkJKChic1t4XSAmIDB4ZmYpPDwxNik7Ci0JCX0KLQl9Ci0JaWNsb3NlKGltYWdlKTsKLQlpZiAoIGVycm9yX2NhbGxlZCApIHsKLQkJUHlfREVDUkVGKHJ2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBydjsKKyAgICBpZiAoIGltYWdlLT5jb2xvcm1hcCAhPSBDTV9OT1JNQUwgKSB7CisgICAgICAgIGljbG9zZShpbWFnZSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG9ubHkgaGFuZGxlIENNX05PUk1BTCBpbWFnZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggQlBQKGltYWdlLT50eXBlKSAhPSAxICkgeworICAgICAgICBpY2xvc2UoaW1hZ2UpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGhhbmRsZSBpbWdmaWxlcyB3aXRoIGJwcCE9MSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgeHNpemUgPSBpbWFnZS0+eHNpemU7CisgICAgeXNpemUgPSBpbWFnZS0+eXNpemU7CisgICAgenNpemUgPSBpbWFnZS0+enNpemU7CisgICAgaWYgKCB6c2l6ZSAhPSAxICYmIHpzaXplICE9IDMpIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gb25seSBoYW5kbGUgMSBvciAzIGJ5dGUgcGl4ZWxzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIHhzaXplID4gODE5MiApIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBoYW5kbGUgaW1hZ2Ugd2l0aCA+IDgxOTIgY29sdW1ucyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIHpzaXplID09IDMgKSB6c2l6ZSA9IDQ7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHhzaXplKnlzaXplKnpzaXplKTsKKyAgICBpZiAoIHJ2ID09IE5VTEwgKSB7CisgICAgICAgIGljbG9zZShpbWFnZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjZGF0YXAgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgaWRhdGFwID0gKGxvbmcgKiljZGF0YXA7CisKKyAgICBpZiAodG9wX3RvX2JvdHRvbSkgeworICAgICAgICB5Zmlyc3QgPSB5c2l6ZS0xOworICAgICAgICB5bGFzdCA9IC0xOworICAgICAgICB5c3RlcCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIHlmaXJzdCA9IDA7CisgICAgICAgIHlsYXN0ID0geXNpemU7CisgICAgICAgIHlzdGVwID0gMTsKKyAgICB9CisgICAgZm9yICggeT15Zmlyc3Q7IHkgIT0geWxhc3QgJiYgIWVycm9yX2NhbGxlZDsgeSArPSB5c3RlcCApIHsKKyAgICAgICAgaWYgKCB6c2l6ZSA9PSAxICkgeworICAgICAgICAgICAgZ2V0cm93KGltYWdlLCBycywgeSwgMCk7CisgICAgICAgICAgICBmb3IoeD0wOyB4PHhzaXplOyB4KysgKQorICAgICAgICAgICAgICAgICpjZGF0YXArKyA9IHJzW3hdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0cm93KGltYWdlLCBycywgeSwgMCk7CisgICAgICAgICAgICBnZXRyb3coaW1hZ2UsIGdzLCB5LCAxKTsKKyAgICAgICAgICAgIGdldHJvdyhpbWFnZSwgYnMsIHksIDIpOworICAgICAgICAgICAgZm9yKHg9MDsgeDx4c2l6ZTsgeCsrICkKKyAgICAgICAgICAgICAgICAqaWRhdGFwKysgPSAocnNbeF0gJiAweGZmKSAgfAorICAgICAgICAgICAgICAgICAgICAoKGdzW3hdICYgMHhmZik8PDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKChic1t4XSAmIDB4ZmYpPDwxNik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWNsb3NlKGltYWdlKTsKKyAgICBpZiAoIGVycm9yX2NhbGxlZCApIHsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIElNQUdFICpnbG9iX2ltYWdlOwpAQCAtMTc3LDMzMiArMTc3LDMzMiBAQAogc3RhdGljIHZvaWQKIHhzX2dldChzaG9ydCAqYnVmLCBpbnQgeSkKIHsKLQlpZiAodG9wX3RvX2JvdHRvbSkKLQkJZ2V0cm93KGdsb2JfaW1hZ2UsIGJ1ZiwgKGdsb2JfeXNpemUtMS15KSwgZ2xvYl96KTsKLQllbHNlCi0JCWdldHJvdyhnbG9iX2ltYWdlLCBidWYsIHksIGdsb2Jfeik7CisgICAgaWYgKHRvcF90b19ib3R0b20pCisgICAgICAgIGdldHJvdyhnbG9iX2ltYWdlLCBidWYsIChnbG9iX3lzaXplLTEteSksIGdsb2Jfeik7CisgICAgZWxzZQorICAgICAgICBnZXRyb3coZ2xvYl9pbWFnZSwgYnVmLCB5LCBnbG9iX3opOwogfQogCiBzdGF0aWMgdm9pZAogeHNfcHV0X2Moc2hvcnQgKmJ1ZiwgaW50IHkpCiB7Ci0JY2hhciAqZGF0YXAgPSAoY2hhciAqKWdsb2JfZGF0YXAgKyB5Kmdsb2Jfd2lkdGg7Ci0JaW50IHdpZHRoID0gZ2xvYl93aWR0aDsKKyAgICBjaGFyICpkYXRhcCA9IChjaGFyICopZ2xvYl9kYXRhcCArIHkqZ2xvYl93aWR0aDsKKyAgICBpbnQgd2lkdGggPSBnbG9iX3dpZHRoOwogCi0Jd2hpbGUgKCB3aWR0aC0tICkKLQkJKmRhdGFwKysgPSAoKmJ1ZisrKSAmIDB4ZmY7CisgICAgd2hpbGUgKCB3aWR0aC0tICkKKyAgICAgICAgKmRhdGFwKysgPSAoKmJ1ZisrKSAmIDB4ZmY7CiB9CiAKIHN0YXRpYyB2b2lkCiB4c19wdXRfMChzaG9ydCAqYnVmLCBpbnQgeSkKIHsKLQlsb25nICpkYXRhcCA9IGdsb2JfZGF0YXAgKyB5Kmdsb2Jfd2lkdGg7Ci0JaW50IHdpZHRoID0gZ2xvYl93aWR0aDsKKyAgICBsb25nICpkYXRhcCA9IGdsb2JfZGF0YXAgKyB5Kmdsb2Jfd2lkdGg7CisgICAgaW50IHdpZHRoID0gZ2xvYl93aWR0aDsKIAotCXdoaWxlICggd2lkdGgtLSApCi0JCSpkYXRhcCsrID0gKCpidWYrKykgJiAweGZmOworICAgIHdoaWxlICggd2lkdGgtLSApCisgICAgICAgICpkYXRhcCsrID0gKCpidWYrKykgJiAweGZmOwogfQogc3RhdGljIHZvaWQKIHhzX3B1dF8xMihzaG9ydCAqYnVmLCBpbnQgeSkKIHsKLQlsb25nICpkYXRhcCA9IGdsb2JfZGF0YXAgKyB5Kmdsb2Jfd2lkdGg7Ci0JaW50IHdpZHRoID0gZ2xvYl93aWR0aDsKKyAgICBsb25nICpkYXRhcCA9IGdsb2JfZGF0YXAgKyB5Kmdsb2Jfd2lkdGg7CisgICAgaW50IHdpZHRoID0gZ2xvYl93aWR0aDsKIAotCXdoaWxlICggd2lkdGgtLSApCi0JCSpkYXRhcCsrIHw9ICgoKmJ1ZisrKSAmIDB4ZmYpIDw8IChnbG9iX3oqOCk7CisgICAgd2hpbGUgKCB3aWR0aC0tICkKKyAgICAgICAgKmRhdGFwKysgfD0gKCgqYnVmKyspICYgMHhmZikgPDwgKGdsb2Jfeio4KTsKIH0KIAogc3RhdGljIHZvaWQKIHhzY2FsZShJTUFHRSAqaW1hZ2UsIGludCB4c2l6ZSwgaW50IHlzaXplLCBpbnQgenNpemUsCiAgICAgICAgbG9uZyAqZGF0YXAsIGludCB4bmV3LCBpbnQgeW5ldywgaW50IGZtb2RlLCBkb3VibGUgYmx1cikKIHsKLQlnbG9iX2ltYWdlID0gaW1hZ2U7Ci0JZ2xvYl9kYXRhcCA9IGRhdGFwOwotCWdsb2Jfd2lkdGggPSB4bmV3OwotCWdsb2JfeXNpemUgPSB5c2l6ZTsKLQlpZiAoIHpzaXplID09IDEgKSB7Ci0JCWdsb2JfeiA9IDA7Ci0JCWZpbHRlcnpvb20oeHNfZ2V0LCB4c19wdXRfYywgeHNpemUsIHlzaXplLAotCQkJICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOwotCX0gZWxzZSB7Ci0JCWdsb2JfeiA9IDA7Ci0JCWZpbHRlcnpvb20oeHNfZ2V0LCB4c19wdXRfMCwgeHNpemUsIHlzaXplLAotCQkJICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOwotCQlnbG9iX3ogPSAxOwotCQlmaWx0ZXJ6b29tKHhzX2dldCwgeHNfcHV0XzEyLCB4c2l6ZSwgeXNpemUsCi0JCQkgICB4bmV3LCB5bmV3LCBmbW9kZSwgYmx1cik7Ci0JCWdsb2JfeiA9IDI7Ci0JCWZpbHRlcnpvb20oeHNfZ2V0LCB4c19wdXRfMTIsIHhzaXplLCB5c2l6ZSwKLQkJCSAgIHhuZXcsIHluZXcsIGZtb2RlLCBibHVyKTsKLQl9CisgICAgZ2xvYl9pbWFnZSA9IGltYWdlOworICAgIGdsb2JfZGF0YXAgPSBkYXRhcDsKKyAgICBnbG9iX3dpZHRoID0geG5ldzsKKyAgICBnbG9iX3lzaXplID0geXNpemU7CisgICAgaWYgKCB6c2l6ZSA9PSAxICkgeworICAgICAgICBnbG9iX3ogPSAwOworICAgICAgICBmaWx0ZXJ6b29tKHhzX2dldCwgeHNfcHV0X2MsIHhzaXplLCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICB4bmV3LCB5bmV3LCBmbW9kZSwgYmx1cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xvYl96ID0gMDsKKyAgICAgICAgZmlsdGVyem9vbSh4c19nZXQsIHhzX3B1dF8wLCB4c2l6ZSwgeXNpemUsCisgICAgICAgICAgICAgICAgICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOworICAgICAgICBnbG9iX3ogPSAxOworICAgICAgICBmaWx0ZXJ6b29tKHhzX2dldCwgeHNfcHV0XzEyLCB4c2l6ZSwgeXNpemUsCisgICAgICAgICAgICAgICAgICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOworICAgICAgICBnbG9iX3ogPSAyOworICAgICAgICBmaWx0ZXJ6b29tKHhzX2dldCwgeHNfcHV0XzEyLCB4c2l6ZSwgeXNpemUsCisgICAgICAgICAgICAgICAgICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOworICAgIH0KIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1nZmlsZV9yZWFkc2NhbGVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmbmFtZTsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IHhzaXplLCB5c2l6ZSwgenNpemU7Ci0JY2hhciAqY2RhdGFwOwotCWxvbmcgKmlkYXRhcDsKLQlzdGF0aWMgc2hvcnQgcnNbODE5Ml0sIGdzWzgxOTJdLCBic1s4MTkyXTsKLQlpbnQgeCwgeTsKLQlpbnQgeHd0ZCwgeXd0ZCwgeG9yaWcsIHlvcmlnOwotCWZsb2F0IHhmYWMsIHlmYWM7Ci0JSU1BR0UgKmltYWdlOwotCWNoYXIgKmZpbHRlcjsKLQlkb3VibGUgYmx1ciA9IDEuMDsKLQlpbnQgZXh0ZW5kZWQ7Ci0JaW50IGZtb2RlID0gMDsKLQlpbnQgeWZpcnN0LCB5bGFzdCwgeXN0ZXA7CisgICAgY2hhciAqZm5hbWU7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCB4c2l6ZSwgeXNpemUsIHpzaXplOworICAgIGNoYXIgKmNkYXRhcDsKKyAgICBsb25nICppZGF0YXA7CisgICAgc3RhdGljIHNob3J0IHJzWzgxOTJdLCBnc1s4MTkyXSwgYnNbODE5Ml07CisgICAgaW50IHgsIHk7CisgICAgaW50IHh3dGQsIHl3dGQsIHhvcmlnLCB5b3JpZzsKKyAgICBmbG9hdCB4ZmFjLCB5ZmFjOworICAgIElNQUdFICppbWFnZTsKKyAgICBjaGFyICpmaWx0ZXI7CisgICAgZG91YmxlIGJsdXIgPSAxLjA7CisgICAgaW50IGV4dGVuZGVkOworICAgIGludCBmbW9kZSA9IDA7CisgICAgaW50IHlmaXJzdCwgeWxhc3QsIHlzdGVwOwogCi0JLyoKLQkqKiBQYXJzZSBhcmdzLiBGdW5ueSwgc2luY2UgYXJnIDQgYW5kIDUgYXJlIG9wdGlvbmFsCi0JKiogKGZpbHRlciBuYW1lIGFuZCBibHVyIGZhY3RvcikuIEFsc28sIDQgb3IgNSBhcmd1bWVudHMgaW5kaWNhdGVzCi0JKiogZXh0ZW5kZWQgc2NhbGUgYWxnb3JpdGhtIGluIHN0ZWFkIG9mIHNpbXBsZS1taW5kZWQgcGl4ZWwgZHJvcC9kdXAuCi0JKi8KLQlleHRlbmRlZCA9IFB5VHVwbGVfU2l6ZShhcmdzKSA+PSA0OwotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpaXxzZCIsCi0JCQkgICAgICAgJmZuYW1lLCAmeHd0ZCwgJnl3dGQsICZmaWx0ZXIsICZibHVyKSApCi0JCXJldHVybiBOVUxMOworICAgIC8qCisgICAgKiogUGFyc2UgYXJncy4gRnVubnksIHNpbmNlIGFyZyA0IGFuZCA1IGFyZSBvcHRpb25hbAorICAgICoqIChmaWx0ZXIgbmFtZSBhbmQgYmx1ciBmYWN0b3IpLiBBbHNvLCA0IG9yIDUgYXJndW1lbnRzIGluZGljYXRlcworICAgICoqIGV4dGVuZGVkIHNjYWxlIGFsZ29yaXRobSBpbiBzdGVhZCBvZiBzaW1wbGUtbWluZGVkIHBpeGVsIGRyb3AvZHVwLgorICAgICovCisgICAgZXh0ZW5kZWQgPSBQeVR1cGxlX1NpemUoYXJncykgPj0gNDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaWl8c2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZuYW1lLCAmeHd0ZCwgJnl3dGQsICZmaWx0ZXIsICZibHVyKSApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyoKLQkqKiBDaGVjayBwYXJhbWV0ZXJzLCBvcGVuIGZpbGUgYW5kIGNoZWNrIHR5cGUsIHJvd3MsIGV0Yy4KLQkqLwotCWlmICggZXh0ZW5kZWQgKSB7Ci0JCWlmICggc3RyY21wKGZpbHRlciwgImltcHVsc2UiKSA9PSAwICkKLQkJCWZtb2RlID0gSU1QVUxTRTsKLQkJZWxzZSBpZiAoIHN0cmNtcCggZmlsdGVyLCAiYm94IikgPT0gMCApCi0JCQlmbW9kZSA9IEJPWDsKLQkJZWxzZSBpZiAoIHN0cmNtcCggZmlsdGVyLCAidHJpYW5nbGUiKSA9PSAwICkKLQkJCWZtb2RlID0gVFJJQU5HTEU7Ci0JCWVsc2UgaWYgKCBzdHJjbXAoIGZpbHRlciwgInF1YWRyYXRpYyIpID09IDAgKQotCQkJZm1vZGUgPSBRVUFEUkFUSUM7Ci0JCWVsc2UgaWYgKCBzdHJjbXAoIGZpbHRlciwgImdhdXNzaWFuIikgPT0gMCApCi0JCQlmbW9kZSA9IEdBVVNTSUFOOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsICJVbmtub3duIGZpbHRlciB0eXBlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLSAgICAKLQlpZiAoIChpbWFnZSA9IGltZ2ZpbGVfb3BlbihmbmFtZSkpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLSAgICAKLQlpZiAoIGltYWdlLT5jb2xvcm1hcCAhPSBDTV9OT1JNQUwgKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbiBvbmx5IGhhbmRsZSBDTV9OT1JNQUwgaW1hZ2VzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIEJQUChpbWFnZS0+dHlwZSkgIT0gMSApIHsKLQkJaWNsb3NlKGltYWdlKTsKLQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKLQkJCQkiQ2FuJ3QgaGFuZGxlIGltZ2ZpbGVzIHdpdGggYnBwIT0xIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl4c2l6ZSA9IGltYWdlLT54c2l6ZTsKLQl5c2l6ZSA9IGltYWdlLT55c2l6ZTsKLQl6c2l6ZSA9IGltYWdlLT56c2l6ZTsKLQlpZiAoIHpzaXplICE9IDEgJiYgenNpemUgIT0gMykgewotCQlpY2xvc2UoaW1hZ2UpOwotCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAotCQkJCSJDYW4gb25seSBoYW5kbGUgMSBvciAzIGJ5dGUgcGl4ZWxzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIHhzaXplID4gODE5MiApIHsKLQkJaWNsb3NlKGltYWdlKTsKLQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKLQkJCQkiQ2FuJ3QgaGFuZGxlIGltYWdlIHdpdGggPiA4MTkyIGNvbHVtbnMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qCisgICAgKiogQ2hlY2sgcGFyYW1ldGVycywgb3BlbiBmaWxlIGFuZCBjaGVjayB0eXBlLCByb3dzLCBldGMuCisgICAgKi8KKyAgICBpZiAoIGV4dGVuZGVkICkgeworICAgICAgICBpZiAoIHN0cmNtcChmaWx0ZXIsICJpbXB1bHNlIikgPT0gMCApCisgICAgICAgICAgICBmbW9kZSA9IElNUFVMU0U7CisgICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoIGZpbHRlciwgImJveCIpID09IDAgKQorICAgICAgICAgICAgZm1vZGUgPSBCT1g7CisgICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoIGZpbHRlciwgInRyaWFuZ2xlIikgPT0gMCApCisgICAgICAgICAgICBmbW9kZSA9IFRSSUFOR0xFOworICAgICAgICBlbHNlIGlmICggc3RyY21wKCBmaWx0ZXIsICJxdWFkcmF0aWMiKSA9PSAwICkKKyAgICAgICAgICAgIGZtb2RlID0gUVVBRFJBVElDOworICAgICAgICBlbHNlIGlmICggc3RyY21wKCBmaWx0ZXIsICJnYXVzc2lhbiIpID09IDAgKQorICAgICAgICAgICAgZm1vZGUgPSBHQVVTU0lBTjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLCAiVW5rbm93biBmaWx0ZXIgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoIHpzaXplID09IDMgKSB6c2l6ZSA9IDQ7Ci0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCB4d3RkKnl3dGQqenNpemUpOwotCWlmICggcnYgPT0gTlVMTCApIHsKLQkJaWNsb3NlKGltYWdlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RlBFX1NUQVJUX1BST1RFQ1QoInJlYWRzY2FsZWQiLCByZXR1cm4gMCkKLQl4ZmFjID0gKGZsb2F0KXhzaXplLyhmbG9hdCl4d3RkOwotCXlmYWMgPSAoZmxvYXQpeXNpemUvKGZsb2F0KXl3dGQ7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoeWZhYykKLQljZGF0YXAgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JaWRhdGFwID0gKGxvbmcgKiljZGF0YXA7CisgICAgaWYgKCAoaW1hZ2UgPSBpbWdmaWxlX29wZW4oZm5hbWUpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIGV4dGVuZGVkICkgewotCQl4c2NhbGUoaW1hZ2UsIHhzaXplLCB5c2l6ZSwgenNpemUsCi0JCSAgICAgICBpZGF0YXAsIHh3dGQsIHl3dGQsIGZtb2RlLCBibHVyKTsKLQl9IGVsc2UgewotCQlpZiAodG9wX3RvX2JvdHRvbSkgewotCQkJeWZpcnN0ID0geXd0ZC0xOwotCQkJeWxhc3QgPSAtMTsKLQkJCXlzdGVwID0gLTE7Ci0JCX0gZWxzZSB7Ci0JCQl5Zmlyc3QgPSAwOwotCQkJeWxhc3QgPSB5d3RkOwotCQkJeXN0ZXAgPSAxOwotCQl9Ci0JCWZvciAoIHk9eWZpcnN0OyB5ICE9IHlsYXN0ICYmICFlcnJvcl9jYWxsZWQ7IHkgKz0geXN0ZXAgKSB7Ci0JCQl5b3JpZyA9IChpbnQpKHkqeWZhYyk7Ci0JCQlpZiAoIHpzaXplID09IDEgKSB7Ci0JCQkJZ2V0cm93KGltYWdlLCBycywgeW9yaWcsIDApOwotCQkJCWZvcih4PTA7IHg8eHd0ZDsgeCsrICkgewotCQkJCQkqY2RhdGFwKysgPSByc1soaW50KSh4KnhmYWMpXTsJCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlnZXRyb3coaW1hZ2UsIHJzLCB5b3JpZywgMCk7Ci0JCQkJZ2V0cm93KGltYWdlLCBncywgeW9yaWcsIDEpOwotCQkJCWdldHJvdyhpbWFnZSwgYnMsIHlvcmlnLCAyKTsKLQkJCQlmb3IoeD0wOyB4PHh3dGQ7IHgrKyApIHsKLQkJCQkJeG9yaWcgPSAoaW50KSh4KnhmYWMpOwotCQkJCQkqaWRhdGFwKysgPSAocnNbeG9yaWddICYgMHhmZikgIHwKLQkJCQkJCSgoZ3NbeG9yaWddICYgMHhmZik8PDgpIHwKLQkJCQkJCSgoYnNbeG9yaWddICYgMHhmZik8PDE2KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWNsb3NlKGltYWdlKTsKLQlpZiAoIGVycm9yX2NhbGxlZCApIHsKLQkJUHlfREVDUkVGKHJ2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBydjsKKyAgICBpZiAoIGltYWdlLT5jb2xvcm1hcCAhPSBDTV9OT1JNQUwgKSB7CisgICAgICAgIGljbG9zZShpbWFnZSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG9ubHkgaGFuZGxlIENNX05PUk1BTCBpbWFnZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggQlBQKGltYWdlLT50eXBlKSAhPSAxICkgeworICAgICAgICBpY2xvc2UoaW1hZ2UpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGhhbmRsZSBpbWdmaWxlcyB3aXRoIGJwcCE9MSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgeHNpemUgPSBpbWFnZS0+eHNpemU7CisgICAgeXNpemUgPSBpbWFnZS0+eXNpemU7CisgICAgenNpemUgPSBpbWFnZS0+enNpemU7CisgICAgaWYgKCB6c2l6ZSAhPSAxICYmIHpzaXplICE9IDMpIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gb25seSBoYW5kbGUgMSBvciAzIGJ5dGUgcGl4ZWxzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIHhzaXplID4gODE5MiApIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBoYW5kbGUgaW1hZ2Ugd2l0aCA+IDgxOTIgY29sdW1ucyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIHpzaXplID09IDMgKSB6c2l6ZSA9IDQ7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCB4d3RkKnl3dGQqenNpemUpOworICAgIGlmICggcnYgPT0gTlVMTCApIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoInJlYWRzY2FsZWQiLCByZXR1cm4gMCkKKyAgICB4ZmFjID0gKGZsb2F0KXhzaXplLyhmbG9hdCl4d3RkOworICAgIHlmYWMgPSAoZmxvYXQpeXNpemUvKGZsb2F0KXl3dGQ7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoeWZhYykKKyAgICBjZGF0YXAgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgaWRhdGFwID0gKGxvbmcgKiljZGF0YXA7CisKKyAgICBpZiAoIGV4dGVuZGVkICkgeworICAgICAgICB4c2NhbGUoaW1hZ2UsIHhzaXplLCB5c2l6ZSwgenNpemUsCisgICAgICAgICAgICAgICBpZGF0YXAsIHh3dGQsIHl3dGQsIGZtb2RlLCBibHVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodG9wX3RvX2JvdHRvbSkgeworICAgICAgICAgICAgeWZpcnN0ID0geXd0ZC0xOworICAgICAgICAgICAgeWxhc3QgPSAtMTsKKyAgICAgICAgICAgIHlzdGVwID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB5Zmlyc3QgPSAwOworICAgICAgICAgICAgeWxhc3QgPSB5d3RkOworICAgICAgICAgICAgeXN0ZXAgPSAxOworICAgICAgICB9CisgICAgICAgIGZvciAoIHk9eWZpcnN0OyB5ICE9IHlsYXN0ICYmICFlcnJvcl9jYWxsZWQ7IHkgKz0geXN0ZXAgKSB7CisgICAgICAgICAgICB5b3JpZyA9IChpbnQpKHkqeWZhYyk7CisgICAgICAgICAgICBpZiAoIHpzaXplID09IDEgKSB7CisgICAgICAgICAgICAgICAgZ2V0cm93KGltYWdlLCBycywgeW9yaWcsIDApOworICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8eHd0ZDsgeCsrICkgeworICAgICAgICAgICAgICAgICAgICAqY2RhdGFwKysgPSByc1soaW50KSh4KnhmYWMpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdldHJvdyhpbWFnZSwgcnMsIHlvcmlnLCAwKTsKKyAgICAgICAgICAgICAgICBnZXRyb3coaW1hZ2UsIGdzLCB5b3JpZywgMSk7CisgICAgICAgICAgICAgICAgZ2V0cm93KGltYWdlLCBicywgeW9yaWcsIDIpOworICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8eHd0ZDsgeCsrICkgeworICAgICAgICAgICAgICAgICAgICB4b3JpZyA9IChpbnQpKHgqeGZhYyk7CisgICAgICAgICAgICAgICAgICAgICppZGF0YXArKyA9IChyc1t4b3JpZ10gJiAweGZmKSAgfAorICAgICAgICAgICAgICAgICAgICAgICAgKChnc1t4b3JpZ10gJiAweGZmKTw8OCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgKChic1t4b3JpZ10gJiAweGZmKTw8MTYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpY2xvc2UoaW1hZ2UpOworICAgIGlmICggZXJyb3JfY2FsbGVkICkgeworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1nZmlsZV9nZXRzaXplcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZm5hbWU7Ci0JUHlPYmplY3QgKnJ2OwotCUlNQUdFICppbWFnZTsKLSAgICAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldHNpemVzIiwgJmZuYW1lKSApCi0JCXJldHVybiBOVUxMOwotICAgIAotCWlmICggKGltYWdlID0gaW1nZmlsZV9vcGVuKGZuYW1lKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gUHlfQnVpbGRWYWx1ZSgiKGlpaSkiLCBpbWFnZS0+eHNpemUsIGltYWdlLT55c2l6ZSwgaW1hZ2UtPnpzaXplKTsKLQlpY2xvc2UoaW1hZ2UpOwotCXJldHVybiBydjsKKyAgICBjaGFyICpmbmFtZTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgSU1BR0UgKmltYWdlOworCisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRzaXplcyIsICZmbmFtZSkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICggKGltYWdlID0gaW1nZmlsZV9vcGVuKGZuYW1lKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKGlpaSkiLCBpbWFnZS0+eHNpemUsIGltYWdlLT55c2l6ZSwgaW1hZ2UtPnpzaXplKTsKKyAgICBpY2xvc2UoaW1hZ2UpOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltZ2ZpbGVfd3JpdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUlNQUdFICppbWFnZTsKLQljaGFyICpmbmFtZTsKLQlpbnQgeHNpemUsIHlzaXplLCB6c2l6ZSwgbGVuOwotCWNoYXIgKmNkYXRhcDsKLQlsb25nICppZGF0YXA7Ci0Jc2hvcnQgcnNbODE5Ml0sIGdzWzgxOTJdLCBic1s4MTkyXTsKLQlzaG9ydCByLCBnLCBiOwotCWxvbmcgcmdiOwotCWludCB4LCB5OwotCWludCB5Zmlyc3QsIHlsYXN0LCB5c3RlcDsKKyAgICBJTUFHRSAqaW1hZ2U7CisgICAgY2hhciAqZm5hbWU7CisgICAgaW50IHhzaXplLCB5c2l6ZSwgenNpemUsIGxlbjsKKyAgICBjaGFyICpjZGF0YXA7CisgICAgbG9uZyAqaWRhdGFwOworICAgIHNob3J0IHJzWzgxOTJdLCBnc1s4MTkyXSwgYnNbODE5Ml07CisgICAgc2hvcnQgciwgZywgYjsKKyAgICBsb25nIHJnYjsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgeWZpcnN0LCB5bGFzdCwgeXN0ZXA7CiAKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzI2lpaTp3cml0ZSIsCi0JCQkgICZmbmFtZSwgJmNkYXRhcCwgJmxlbiwgJnhzaXplLCAmeXNpemUsICZ6c2l6ZSkgKQotCQlyZXR1cm4gTlVMTDsKLSAgICAKLQlpZiAoIHpzaXplICE9IDEgJiYgenNpemUgIT0gMyApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKLQkJCQkiQ2FuIG9ubHkgaGFuZGxlIDEgb3IgMyBieXRlIHBpeGVscyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCBsZW4gIT0geHNpemUgKiB5c2l6ZSAqICh6c2l6ZSA9PSAxID8gMSA6IDQpICkgewotCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLCAiRGF0YSBkb2VzIG5vdCBtYXRjaCBzaXplcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCB4c2l6ZSA+IDgxOTIgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbid0IGhhbmRsZSBpbWFnZSB3aXRoID4gODE5MiBjb2x1bW5zIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzcyNpaWk6d3JpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICZmbmFtZSwgJmNkYXRhcCwgJmxlbiwgJnhzaXplLCAmeXNpemUsICZ6c2l6ZSkgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVycm9yX2NhbGxlZCA9IDA7Ci0JZXJybm8gPSAwOwotCWltYWdlID1pb3BlbihmbmFtZSwgInciLCBSTEUoMSksIDMsIHhzaXplLCB5c2l6ZSwgenNpemUpOwotCWlmICggaW1hZ2UgPT0gMCApIHsKLQkJaWYgKCAhIGVycm9yX2NhbGxlZCApIHsKLQkJCWlmIChlcnJubykKLQkJCQlQeUVycl9TZXRGcm9tRXJybm8oSW1nZmlsZUVycm9yKTsKLQkJCWVsc2UKLQkJCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAotCQkJCQkJIkNhbid0IGNyZWF0ZSBpbWFnZSBmaWxlIik7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICggenNpemUgIT0gMSAmJiB6c2l6ZSAhPSAzICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbiBvbmx5IGhhbmRsZSAxIG9yIDMgYnl0ZSBwaXhlbHMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggbGVuICE9IHhzaXplICogeXNpemUgKiAoenNpemUgPT0gMSA/IDEgOiA0KSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwgIkRhdGEgZG9lcyBub3QgbWF0Y2ggc2l6ZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggeHNpemUgPiA4MTkyICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGhhbmRsZSBpbWFnZSB3aXRoID4gODE5MiBjb2x1bW5zIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlkYXRhcCA9IChsb25nICopY2RhdGFwOwotICAgIAotCWlmICh0b3BfdG9fYm90dG9tKSB7Ci0JCXlmaXJzdCA9IHlzaXplLTE7Ci0JCXlsYXN0ID0gLTE7Ci0JCXlzdGVwID0gLTE7Ci0JfSBlbHNlIHsKLQkJeWZpcnN0ID0gMDsKLQkJeWxhc3QgPSB5c2l6ZTsKLQkJeXN0ZXAgPSAxOwotCX0KLQlmb3IgKCB5PXlmaXJzdDsgeSAhPSB5bGFzdCAmJiAhZXJyb3JfY2FsbGVkOyB5ICs9IHlzdGVwICkgewotCQlpZiAoIHpzaXplID09IDEgKSB7Ci0JCQlmb3IoIHg9MDsgeDx4c2l6ZTsgeCsrICkKLQkJCQlyc1t4XSA9ICpjZGF0YXArKzsKLQkJCXB1dHJvdyhpbWFnZSwgcnMsIHksIDApOwotCQl9IGVsc2UgewotCQkJZm9yKCB4PTA7IHg8eHNpemU7IHgrKyApIHsKLQkJCQlyZ2IgPSAqaWRhdGFwKys7Ci0JCQkJciA9IHJnYiAmIDB4ZmY7Ci0JCQkJZyA9IChyZ2IgPj4gOCApICYgMHhmZjsKLQkJCQliID0gKHJnYiA+PiAxNiApICYgMHhmZjsKLQkJCQlyc1t4XSA9IHI7Ci0JCQkJZ3NbeF0gPSBnOwotCQkJCWJzW3hdID0gYjsKLQkJCX0KLQkJCXB1dHJvdyhpbWFnZSwgcnMsIHksIDApOwotCQkJcHV0cm93KGltYWdlLCBncywgeSwgMSk7Ci0JCQlwdXRyb3coaW1hZ2UsIGJzLCB5LCAyKTsKLQkJfQotCX0KLQlpY2xvc2UoaW1hZ2UpOwotCWlmICggZXJyb3JfY2FsbGVkICkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOwotICAgIAorICAgIGVycm9yX2NhbGxlZCA9IDA7CisgICAgZXJybm8gPSAwOworICAgIGltYWdlID1pb3BlbihmbmFtZSwgInciLCBSTEUoMSksIDMsIHhzaXplLCB5c2l6ZSwgenNpemUpOworICAgIGlmICggaW1hZ2UgPT0gMCApIHsKKyAgICAgICAgaWYgKCAhIGVycm9yX2NhbGxlZCApIHsKKyAgICAgICAgICAgIGlmIChlcnJubykKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oSW1nZmlsZUVycm9yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgY3JlYXRlIGltYWdlIGZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZGF0YXAgPSAobG9uZyAqKWNkYXRhcDsKKworICAgIGlmICh0b3BfdG9fYm90dG9tKSB7CisgICAgICAgIHlmaXJzdCA9IHlzaXplLTE7CisgICAgICAgIHlsYXN0ID0gLTE7CisgICAgICAgIHlzdGVwID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgeWZpcnN0ID0gMDsKKyAgICAgICAgeWxhc3QgPSB5c2l6ZTsKKyAgICAgICAgeXN0ZXAgPSAxOworICAgIH0KKyAgICBmb3IgKCB5PXlmaXJzdDsgeSAhPSB5bGFzdCAmJiAhZXJyb3JfY2FsbGVkOyB5ICs9IHlzdGVwICkgeworICAgICAgICBpZiAoIHpzaXplID09IDEgKSB7CisgICAgICAgICAgICBmb3IoIHg9MDsgeDx4c2l6ZTsgeCsrICkKKyAgICAgICAgICAgICAgICByc1t4XSA9ICpjZGF0YXArKzsKKyAgICAgICAgICAgIHB1dHJvdyhpbWFnZSwgcnMsIHksIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yKCB4PTA7IHg8eHNpemU7IHgrKyApIHsKKyAgICAgICAgICAgICAgICByZ2IgPSAqaWRhdGFwKys7CisgICAgICAgICAgICAgICAgciA9IHJnYiAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZyA9IChyZ2IgPj4gOCApICYgMHhmZjsKKyAgICAgICAgICAgICAgICBiID0gKHJnYiA+PiAxNiApICYgMHhmZjsKKyAgICAgICAgICAgICAgICByc1t4XSA9IHI7CisgICAgICAgICAgICAgICAgZ3NbeF0gPSBnOworICAgICAgICAgICAgICAgIGJzW3hdID0gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1dHJvdyhpbWFnZSwgcnMsIHksIDApOworICAgICAgICAgICAgcHV0cm93KGltYWdlLCBncywgeSwgMSk7CisgICAgICAgICAgICBwdXRyb3coaW1hZ2UsIGJzLCB5LCAyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpY2xvc2UoaW1hZ2UpOworICAgIGlmICggZXJyb3JfY2FsbGVkICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworCiB9CiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIGltZ2ZpbGVfbWV0aG9kc1tdID0gewotCXsgImdldHNpemVzIiwJaW1nZmlsZV9nZXRzaXplcywgTUVUSF9WQVJBUkdTIH0sCi0JeyAicmVhZCIsCWltZ2ZpbGVfcmVhZCwgTUVUSF9WQVJBUkdTIH0sCi0JeyAicmVhZHNjYWxlZCIsCWltZ2ZpbGVfcmVhZHNjYWxlZCwgTUVUSF9WQVJBUkdTfSwKLQl7ICJ3cml0ZSIsCWltZ2ZpbGVfd3JpdGUsIE1FVEhfVkFSQVJHUyB9LAotCXsgInR0b2IiLAlpbWdmaWxlX3R0b2IsIE1FVEhfVkFSQVJHUyB9LAotCXsgTlVMTCwJCU5VTEwgfSAvKiBTZW50aW5lbCAqLworICAgIHsgImdldHNpemVzIiwgICAgICAgaW1nZmlsZV9nZXRzaXplcywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAicmVhZCIsICAgICAgICAgICBpbWdmaWxlX3JlYWQsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInJlYWRzY2FsZWQiLCAgICAgaW1nZmlsZV9yZWFkc2NhbGVkLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsgIndyaXRlIiwgICAgICAgICAgaW1nZmlsZV93cml0ZSwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAidHRvYiIsICAgICAgICAgICBpbWdmaWxlX3R0b2IsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgTlVMTCwgICAgICAgICAgICAgTlVMTCB9IC8qIFNlbnRpbmVsICovCiB9OwogCiAKIHZvaWQKIGluaXRpbWdmaWxlKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygidGhlIGltZ2ZpbGUgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgotCSAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKLQkgICAgcmV0dXJuOwotCQotCW0gPSBQeV9Jbml0TW9kdWxlKCJpbWdmaWxlIiwgaW1nZmlsZV9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JSW1nZmlsZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJpbWdmaWxlLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JaWYgKEltZ2ZpbGVFcnJvciAhPSBOVUxMKQotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBJbWdmaWxlRXJyb3IpOworICAgIFB5T2JqZWN0ICptLCAqZDsKKworICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGltZ2ZpbGUgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbSA9IFB5X0luaXRNb2R1bGUoImltZ2ZpbGUiLCBpbWdmaWxlX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBJbWdmaWxlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImltZ2ZpbGUuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoSW1nZmlsZUVycm9yICE9IE5VTEwpCisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEltZ2ZpbGVFcnJvcik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYyBiL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKaW5kZXggNjMzZDBhNy4uNzkzODViZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYworKysgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCi0vKiBJdGVydG9vbHMgbW9kdWxlIHdyaXR0ZW4gYW5kIG1haW50YWluZWQgCisvKiBJdGVydG9vbHMgbW9kdWxlIHdyaXR0ZW4gYW5kIG1haW50YWluZWQKICAgIGJ5IFJheW1vbmQgRC4gSGV0dGluZ2VyIDxweXRob25AcmNuLmNvbT4KICAgIENvcHlyaWdodCAoYykgMjAwMyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkBAIC0xMiwxMiArMTIsMTIgQEAKIC8qIGdyb3VwYnkgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICppdDsKLQlQeU9iamVjdCAqa2V5ZnVuYzsKLQlQeU9iamVjdCAqdGd0a2V5OwotCVB5T2JqZWN0ICpjdXJya2V5OwotCVB5T2JqZWN0ICpjdXJydmFsdWU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqa2V5ZnVuYzsKKyAgICBQeU9iamVjdCAqdGd0a2V5OworICAgIFB5T2JqZWN0ICpjdXJya2V5OworICAgIFB5T2JqZWN0ICpjdXJydmFsdWU7CiB9IGdyb3VwYnlvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZ3JvdXBieV90eXBlOwpAQCAtMjYsMTEyICsyNiwxMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBncm91cGJ5X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgImtleSIsIE5VTEx9OwotCWdyb3VwYnlvYmplY3QgKmdibzsKLSAJUHlPYmplY3QgKml0LCAqa2V5ZnVuYyA9IFB5X05vbmU7Ci0gCi0gCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86Z3JvdXBieSIsIGt3YXJncywKLQkJCQkJICZpdCwgJmtleWZ1bmMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgImtleSIsIE5VTEx9OworICAgIGdyb3VwYnlvYmplY3QgKmdibzsKKyAgICBQeU9iamVjdCAqaXQsICprZXlmdW5jID0gUHlfTm9uZTsKIAotCWdibyA9IChncm91cGJ5b2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGdibyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlnYm8tPnRndGtleSA9IE5VTEw7Ci0JZ2JvLT5jdXJya2V5ID0gTlVMTDsKLQlnYm8tPmN1cnJ2YWx1ZSA9IE5VTEw7Ci0JZ2JvLT5rZXlmdW5jID0ga2V5ZnVuYzsKLQlQeV9JTkNSRUYoa2V5ZnVuYyk7Ci0JZ2JvLT5pdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXQpOwotCWlmIChnYm8tPml0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGdibyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopZ2JvOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86Z3JvdXBieSIsIGt3YXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXQsICZrZXlmdW5jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBnYm8gPSAoZ3JvdXBieW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChnYm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ2JvLT50Z3RrZXkgPSBOVUxMOworICAgIGdiby0+Y3VycmtleSA9IE5VTEw7CisgICAgZ2JvLT5jdXJydmFsdWUgPSBOVUxMOworICAgIGdiby0+a2V5ZnVuYyA9IGtleWZ1bmM7CisgICAgUHlfSU5DUkVGKGtleWZ1bmMpOworICAgIGdiby0+aXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0KTsKKyAgICBpZiAoZ2JvLT5pdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihnYm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWdibzsKIH0KIAogc3RhdGljIHZvaWQKIGdyb3VwYnlfZGVhbGxvYyhncm91cGJ5b2JqZWN0ICpnYm8pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhnYm8pOwotCVB5X1hERUNSRUYoZ2JvLT5pdCk7Ci0JUHlfWERFQ1JFRihnYm8tPmtleWZ1bmMpOwotCVB5X1hERUNSRUYoZ2JvLT50Z3RrZXkpOwotCVB5X1hERUNSRUYoZ2JvLT5jdXJya2V5KTsKLQlQeV9YREVDUkVGKGdiby0+Y3VycnZhbHVlKTsKLQlQeV9UWVBFKGdibyktPnRwX2ZyZWUoZ2JvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGdibyk7CisgICAgUHlfWERFQ1JFRihnYm8tPml0KTsKKyAgICBQeV9YREVDUkVGKGdiby0+a2V5ZnVuYyk7CisgICAgUHlfWERFQ1JFRihnYm8tPnRndGtleSk7CisgICAgUHlfWERFQ1JFRihnYm8tPmN1cnJrZXkpOworICAgIFB5X1hERUNSRUYoZ2JvLT5jdXJydmFsdWUpOworICAgIFB5X1RZUEUoZ2JvKS0+dHBfZnJlZShnYm8pOwogfQogCiBzdGF0aWMgaW50CiBncm91cGJ5X3RyYXZlcnNlKGdyb3VwYnlvYmplY3QgKmdibywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoZ2JvLT5pdCk7Ci0JUHlfVklTSVQoZ2JvLT5rZXlmdW5jKTsKLQlQeV9WSVNJVChnYm8tPnRndGtleSk7Ci0JUHlfVklTSVQoZ2JvLT5jdXJya2V5KTsKLQlQeV9WSVNJVChnYm8tPmN1cnJ2YWx1ZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoZ2JvLT5pdCk7CisgICAgUHlfVklTSVQoZ2JvLT5rZXlmdW5jKTsKKyAgICBQeV9WSVNJVChnYm8tPnRndGtleSk7CisgICAgUHlfVklTSVQoZ2JvLT5jdXJya2V5KTsKKyAgICBQeV9WSVNJVChnYm8tPmN1cnJ2YWx1ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBncm91cGJ5X25leHQoZ3JvdXBieW9iamVjdCAqZ2JvKQogewotCVB5T2JqZWN0ICpuZXd2YWx1ZSwgKm5ld2tleSwgKnIsICpncm91cGVyLCAqdG1wOworICAgIFB5T2JqZWN0ICpuZXd2YWx1ZSwgKm5ld2tleSwgKnIsICpncm91cGVyLCAqdG1wOwogCi0JLyogc2tpcCB0byBuZXh0IGl0ZXJhdGlvbiBncm91cCAqLwotCWZvciAoOzspIHsKLQkJaWYgKGdiby0+Y3VycmtleSA9PSBOVUxMKQotCQkJLyogcGFzcyAqLzsKLQkJZWxzZSBpZiAoZ2JvLT50Z3RrZXkgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQllbHNlIHsKLQkJCWludCByY21wOworICAgIC8qIHNraXAgdG8gbmV4dCBpdGVyYXRpb24gZ3JvdXAgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChnYm8tPmN1cnJrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIC8qIHBhc3MgKi87CisgICAgICAgIGVsc2UgaWYgKGdiby0+dGd0a2V5ID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgcmNtcDsKIAotCQkJcmNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChnYm8tPnRndGtleSwKLQkJCQkJCQlnYm8tPmN1cnJrZXksIFB5X0VRKTsKLQkJCWlmIChyY21wID09IC0xKQotCQkJCXJldHVybiBOVUxMOwotCQkJZWxzZSBpZiAocmNtcCA9PSAwKQotCQkJCWJyZWFrOwotCQl9CisgICAgICAgICAgICByY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGdiby0+dGd0a2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm8tPmN1cnJrZXksIFB5X0VRKTsKKyAgICAgICAgICAgIGlmIChyY21wID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZWxzZSBpZiAocmNtcCA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJbmV3dmFsdWUgPSBQeUl0ZXJfTmV4dChnYm8tPml0KTsKLQkJaWYgKG5ld3ZhbHVlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgbmV3dmFsdWUgPSBQeUl0ZXJfTmV4dChnYm8tPml0KTsKKyAgICAgICAgaWYgKG5ld3ZhbHVlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlpZiAoZ2JvLT5rZXlmdW5jID09IFB5X05vbmUpIHsKLQkJCW5ld2tleSA9IG5ld3ZhbHVlOwotCQkJUHlfSU5DUkVGKG5ld3ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCW5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLAotCQkJCQkJCSAgICAgIG5ld3ZhbHVlLCBOVUxMKTsKLQkJCWlmIChuZXdrZXkgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihuZXd2YWx1ZSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKGdiby0+a2V5ZnVuYyA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBuZXdrZXkgPSBuZXd2YWx1ZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihuZXd2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdrZXkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdiby0+a2V5ZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsdWUsIE5VTEwpOworICAgICAgICAgICAgaWYgKG5ld2tleSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld3ZhbHVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXRtcCA9IGdiby0+Y3VycmtleTsKLQkJZ2JvLT5jdXJya2V5ID0gbmV3a2V5OwotCQlQeV9YREVDUkVGKHRtcCk7CisgICAgICAgIHRtcCA9IGdiby0+Y3VycmtleTsKKyAgICAgICAgZ2JvLT5jdXJya2V5ID0gbmV3a2V5OworICAgICAgICBQeV9YREVDUkVGKHRtcCk7CiAKLQkJdG1wID0gZ2JvLT5jdXJydmFsdWU7Ci0JCWdiby0+Y3VycnZhbHVlID0gbmV3dmFsdWU7Ci0JCVB5X1hERUNSRUYodG1wKTsKLQl9CisgICAgICAgIHRtcCA9IGdiby0+Y3VycnZhbHVlOworICAgICAgICBnYm8tPmN1cnJ2YWx1ZSA9IG5ld3ZhbHVlOworICAgICAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgfQogCi0JUHlfSU5DUkVGKGdiby0+Y3VycmtleSk7Ci0JdG1wID0gZ2JvLT50Z3RrZXk7Ci0JZ2JvLT50Z3RrZXkgPSBnYm8tPmN1cnJrZXk7Ci0JUHlfWERFQ1JFRih0bXApOworICAgIFB5X0lOQ1JFRihnYm8tPmN1cnJrZXkpOworICAgIHRtcCA9IGdiby0+dGd0a2V5OworICAgIGdiby0+dGd0a2V5ID0gZ2JvLT5jdXJya2V5OworICAgIFB5X1hERUNSRUYodG1wKTsKIAotCWdyb3VwZXIgPSBfZ3JvdXBlcl9jcmVhdGUoZ2JvLCBnYm8tPnRndGtleSk7Ci0JaWYgKGdyb3VwZXIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZ3JvdXBlciA9IF9ncm91cGVyX2NyZWF0ZShnYm8sIGdiby0+dGd0a2V5KTsKKyAgICBpZiAoZ3JvdXBlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXIgPSBQeVR1cGxlX1BhY2soMiwgZ2JvLT5jdXJya2V5LCBncm91cGVyKTsKLQlQeV9ERUNSRUYoZ3JvdXBlcik7Ci0JcmV0dXJuIHI7CisgICAgciA9IFB5VHVwbGVfUGFjaygyLCBnYm8tPmN1cnJrZXksIGdyb3VwZXIpOworICAgIFB5X0RFQ1JFRihncm91cGVyKTsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGdyb3VwYnlfZG9jLApAQCAtMTM5LDU2ICsxMzksNTYgQEAKIChrZXksIHN1Yi1pdGVyYXRvcikgZ3JvdXBlZCBieSBlYWNoIHZhbHVlIG9mIGtleSh2YWx1ZSkuXG4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBncm91cGJ5X3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5ncm91cGJ5IiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZ3JvdXBieW9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcilncm91cGJ5X2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlncm91cGJ5X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWdyb3VwYnlfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylncm91cGJ5X25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlncm91cGJ5X25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5ncm91cGJ5IiwgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihncm91cGJ5b2JqZWN0KSwgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWdyb3VwYnlfZGVhbGxvYywgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZ3JvdXBieV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylncm91cGJ5X3RyYXZlcnNlLCAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylncm91cGJ5X25leHQsICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGdyb3VwYnlfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIAogLyogX2dyb3VwZXIgb2JqZWN0IChpbnRlcm5hbCkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpwYXJlbnQ7Ci0JUHlPYmplY3QgKnRndGtleTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnBhcmVudDsKKyAgICBQeU9iamVjdCAqdGd0a2V5OwogfSBfZ3JvdXBlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBfZ3JvdXBlcl90eXBlOwpAQCAtMTk2LDEyOSArMTk2LDEyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9ncm91cGVyX2NyZWF0ZShncm91cGJ5b2JqZWN0ICpwYXJlbnQsIFB5T2JqZWN0ICp0Z3RrZXkpCiB7Ci0JX2dyb3VwZXJvYmplY3QgKmlnbzsKKyAgICBfZ3JvdXBlcm9iamVjdCAqaWdvOwogCi0JaWdvID0gUHlPYmplY3RfR0NfTmV3KF9ncm91cGVyb2JqZWN0LCAmX2dyb3VwZXJfdHlwZSk7Ci0JaWYgKGlnbyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZ28tPnBhcmVudCA9IChQeU9iamVjdCAqKXBhcmVudDsKLQlQeV9JTkNSRUYocGFyZW50KTsKLQlpZ28tPnRndGtleSA9IHRndGtleTsKLQlQeV9JTkNSRUYodGd0a2V5KTsKKyAgICBpZ28gPSBQeU9iamVjdF9HQ19OZXcoX2dyb3VwZXJvYmplY3QsICZfZ3JvdXBlcl90eXBlKTsKKyAgICBpZiAoaWdvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlnby0+cGFyZW50ID0gKFB5T2JqZWN0ICopcGFyZW50OworICAgIFB5X0lOQ1JFRihwYXJlbnQpOworICAgIGlnby0+dGd0a2V5ID0gdGd0a2V5OworICAgIFB5X0lOQ1JFRih0Z3RrZXkpOwogCi0JUHlPYmplY3RfR0NfVHJhY2soaWdvKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaWdvOworICAgIFB5T2JqZWN0X0dDX1RyYWNrKGlnbyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWlnbzsKIH0KIAogc3RhdGljIHZvaWQKIF9ncm91cGVyX2RlYWxsb2MoX2dyb3VwZXJvYmplY3QgKmlnbykKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGlnbyk7Ci0JUHlfREVDUkVGKGlnby0+cGFyZW50KTsKLQlQeV9ERUNSRUYoaWdvLT50Z3RrZXkpOwotCVB5T2JqZWN0X0dDX0RlbChpZ28pOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soaWdvKTsKKyAgICBQeV9ERUNSRUYoaWdvLT5wYXJlbnQpOworICAgIFB5X0RFQ1JFRihpZ28tPnRndGtleSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGlnbyk7CiB9CiAKIHN0YXRpYyBpbnQKIF9ncm91cGVyX3RyYXZlcnNlKF9ncm91cGVyb2JqZWN0ICppZ28sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGlnby0+cGFyZW50KTsKLQlQeV9WSVNJVChpZ28tPnRndGtleSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoaWdvLT5wYXJlbnQpOworICAgIFB5X1ZJU0lUKGlnby0+dGd0a2V5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIF9ncm91cGVyX25leHQoX2dyb3VwZXJvYmplY3QgKmlnbykKIHsKLQlncm91cGJ5b2JqZWN0ICpnYm8gPSAoZ3JvdXBieW9iamVjdCAqKWlnby0+cGFyZW50OwotCVB5T2JqZWN0ICpuZXd2YWx1ZSwgKm5ld2tleSwgKnI7Ci0JaW50IHJjbXA7CisgICAgZ3JvdXBieW9iamVjdCAqZ2JvID0gKGdyb3VwYnlvYmplY3QgKilpZ28tPnBhcmVudDsKKyAgICBQeU9iamVjdCAqbmV3dmFsdWUsICpuZXdrZXksICpyOworICAgIGludCByY21wOwogCi0JaWYgKGdiby0+Y3VycnZhbHVlID09IE5VTEwpIHsKLQkJbmV3dmFsdWUgPSBQeUl0ZXJfTmV4dChnYm8tPml0KTsKLQkJaWYgKG5ld3ZhbHVlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZ2JvLT5jdXJydmFsdWUgPT0gTlVMTCkgeworICAgICAgICBuZXd2YWx1ZSA9IFB5SXRlcl9OZXh0KGdiby0+aXQpOworICAgICAgICBpZiAobmV3dmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCWlmIChnYm8tPmtleWZ1bmMgPT0gUHlfTm9uZSkgewotCQkJbmV3a2V5ID0gbmV3dmFsdWU7Ci0JCQlQeV9JTkNSRUYobmV3dmFsdWUpOwotCQl9IGVsc2UgewotCQkJbmV3a2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnYm8tPmtleWZ1bmMsCi0JCQkJCQkJICAgICAgbmV3dmFsdWUsIE5VTEwpOwotCQkJaWYgKG5ld2tleSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKG5ld3ZhbHVlKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoZ2JvLT5rZXlmdW5jID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIG5ld2tleSA9IG5ld3ZhbHVlOworICAgICAgICAgICAgUHlfSU5DUkVGKG5ld3ZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWx1ZSwgTlVMTCk7CisgICAgICAgICAgICBpZiAobmV3a2V5ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3dmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJYXNzZXJ0KGdiby0+Y3VycmtleSA9PSBOVUxMKTsKLQkJZ2JvLT5jdXJya2V5ID0gbmV3a2V5OwotCQlnYm8tPmN1cnJ2YWx1ZSA9IG5ld3ZhbHVlOwotCX0KKyAgICAgICAgYXNzZXJ0KGdiby0+Y3VycmtleSA9PSBOVUxMKTsKKyAgICAgICAgZ2JvLT5jdXJya2V5ID0gbmV3a2V5OworICAgICAgICBnYm8tPmN1cnJ2YWx1ZSA9IG5ld3ZhbHVlOworICAgIH0KIAotCWFzc2VydChnYm8tPmN1cnJrZXkgIT0gTlVMTCk7Ci0JcmNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpZ28tPnRndGtleSwgZ2JvLT5jdXJya2V5LCBQeV9FUSk7Ci0JaWYgKHJjbXAgPD0gMCkKLQkJLyogZ290IGFueSBlcnJvciBvciBjdXJyZW50IGdyb3VwIGlzIGVuZCAqLwotCQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoZ2JvLT5jdXJya2V5ICE9IE5VTEwpOworICAgIHJjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaWdvLT50Z3RrZXksIGdiby0+Y3VycmtleSwgUHlfRVEpOworICAgIGlmIChyY21wIDw9IDApCisgICAgICAgIC8qIGdvdCBhbnkgZXJyb3Igb3IgY3VycmVudCBncm91cCBpcyBlbmQgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyID0gZ2JvLT5jdXJydmFsdWU7Ci0JZ2JvLT5jdXJydmFsdWUgPSBOVUxMOwotCVB5X0NMRUFSKGdiby0+Y3VycmtleSk7CisgICAgciA9IGdiby0+Y3VycnZhbHVlOworICAgIGdiby0+Y3VycnZhbHVlID0gTlVMTDsKKyAgICBQeV9DTEVBUihnYm8tPmN1cnJrZXkpOwogCi0JcmV0dXJuIHI7CisgICAgcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgX2dyb3VwZXJfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLl9ncm91cGVyIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoX2dyb3VwZXJvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpX2dyb3VwZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCS8qIHRwX2ZsYWdzICovCi0JMCwJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylfZ3JvdXBlcl90cmF2ZXJzZSwvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpX2dyb3VwZXJfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLl9ncm91cGVyIiwgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKF9ncm91cGVyb2JqZWN0KSwgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpX2dyb3VwZXJfZGVhbGxvYywgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpX2dyb3VwZXJfdHJhdmVyc2UsLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylfZ3JvdXBlcl9uZXh0LCAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKLSAKKwogCiAvKiB0ZWUgb2JqZWN0IGFuZCB3aXRoIHN1cHBvcnRpbmcgZnVuY3Rpb24gYW5kIG9iamVjdHMgKioqKioqKioqKioqKioqLwogCiAvKiBUaGUgdGVlZGF0YW9iamVjdCBwcmUtYWxsb2NhdGVzIHNwYWNlIGZvciBMSU5LQ0VMTFMgbnVtYmVyIG9mIG9iamVjdHMuCiAgICBUbyBoZWxwIHRoZSBvYmplY3QgZml0IG5lYXRseSBpbnNpZGUgY2FjaGUgbGluZXMgKHNwYWNlIGZvciAxNiB0byAzMgotICAgcG9pbnRlcnMpLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMTYgbWludXMgIHNwYWNlIGZvciAKKyAgIHBvaW50ZXJzKSwgdGhlIHZhbHVlIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDE2IG1pbnVzICBzcGFjZSBmb3IKICAgIHRoZSBvdGhlciBzdHJ1Y3R1cmUgbWVtYmVycyBpbmNsdWRpbmcgUHlIRUFEIG92ZXJoZWFkLiAgVGhlIGxhcmdlciB0aGUKICAgIHZhbHVlLCB0aGUgbGVzcyBtZW1vcnkgb3ZlcmhlYWQgcGVyIG9iamVjdCBhbmQgdGhlIGxlc3MgdGltZSBzcGVudAogICAgYWxsb2NhdGluZy9kZWFsbG9jYXRpbmcgbmV3IGxpbmtzLiAgVGhlIHNtYWxsZXIgdGhlIG51bWJlciwgdGhlIGxlc3MKQEAgLTMyNywxOCArMzI3LDE4IEBACiAjZGVmaW5lIExJTktDRUxMUyA1NwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICppdDsKLQlpbnQgbnVtcmVhZDsKLQlQeU9iamVjdCAqbmV4dGxpbms7Ci0JUHlPYmplY3QgKih2YWx1ZXNbTElOS0NFTExTXSk7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICppdDsKKyAgICBpbnQgbnVtcmVhZDsKKyAgICBQeU9iamVjdCAqbmV4dGxpbms7CisgICAgUHlPYmplY3QgKih2YWx1ZXNbTElOS0NFTExTXSk7CiB9IHRlZWRhdGFvYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JdGVlZGF0YW9iamVjdCAqZGF0YW9iajsKLQlpbnQgaW5kZXg7Ci0JUHlPYmplY3QgKndlYWtyZWZsaXN0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICB0ZWVkYXRhb2JqZWN0ICpkYXRhb2JqOworICAgIGludCBpbmRleDsKKyAgICBQeU9iamVjdCAqd2Vha3JlZmxpc3Q7CiB9IHRlZW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCB0ZWVkYXRhb2JqZWN0X3R5cGU7CkBAIC0zNDYsMTIzICszNDYsMTIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVlZGF0YW9iamVjdF9uZXcoUHlPYmplY3QgKml0KQogewotCXRlZWRhdGFvYmplY3QgKnRkbzsKKyAgICB0ZWVkYXRhb2JqZWN0ICp0ZG87CiAKLQl0ZG8gPSBQeU9iamVjdF9HQ19OZXcodGVlZGF0YW9iamVjdCwgJnRlZWRhdGFvYmplY3RfdHlwZSk7Ci0JaWYgKHRkbyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB0ZG8gPSBQeU9iamVjdF9HQ19OZXcodGVlZGF0YW9iamVjdCwgJnRlZWRhdGFvYmplY3RfdHlwZSk7CisgICAgaWYgKHRkbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXRkby0+bnVtcmVhZCA9IDA7Ci0JdGRvLT5uZXh0bGluayA9IE5VTEw7Ci0JUHlfSU5DUkVGKGl0KTsKLQl0ZG8tPml0ID0gaXQ7Ci0JUHlPYmplY3RfR0NfVHJhY2sodGRvKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopdGRvOworICAgIHRkby0+bnVtcmVhZCA9IDA7CisgICAgdGRvLT5uZXh0bGluayA9IE5VTEw7CisgICAgUHlfSU5DUkVGKGl0KTsKKyAgICB0ZG8tPml0ID0gaXQ7CisgICAgUHlPYmplY3RfR0NfVHJhY2sodGRvKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopdGRvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVlZGF0YW9iamVjdF9qdW1wbGluayh0ZWVkYXRhb2JqZWN0ICp0ZG8pCiB7Ci0JaWYgKHRkby0+bmV4dGxpbmsgPT0gTlVMTCkKLQkJdGRvLT5uZXh0bGluayA9IHRlZWRhdGFvYmplY3RfbmV3KHRkby0+aXQpOwotCVB5X1hJTkNSRUYodGRvLT5uZXh0bGluayk7Ci0JcmV0dXJuIHRkby0+bmV4dGxpbms7CisgICAgaWYgKHRkby0+bmV4dGxpbmsgPT0gTlVMTCkKKyAgICAgICAgdGRvLT5uZXh0bGluayA9IHRlZWRhdGFvYmplY3RfbmV3KHRkby0+aXQpOworICAgIFB5X1hJTkNSRUYodGRvLT5uZXh0bGluayk7CisgICAgcmV0dXJuIHRkby0+bmV4dGxpbms7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZWVkYXRhb2JqZWN0X2dldGl0ZW0odGVlZGF0YW9iamVjdCAqdGRvLCBpbnQgaSkKIHsKLQlQeU9iamVjdCAqdmFsdWU7CisgICAgUHlPYmplY3QgKnZhbHVlOwogCi0JYXNzZXJ0KGkgPCBMSU5LQ0VMTFMpOwotCWlmIChpIDwgdGRvLT5udW1yZWFkKQotCQl2YWx1ZSA9IHRkby0+dmFsdWVzW2ldOwotCWVsc2UgewotCQkvKiB0aGlzIGlzIHRoZSBsZWFkIGl0ZXJhdG9yLCBzbyBmZXRjaCBtb3JlIGRhdGEgKi8KLQkJYXNzZXJ0KGkgPT0gdGRvLT5udW1yZWFkKTsKLQkJdmFsdWUgPSBQeUl0ZXJfTmV4dCh0ZG8tPml0KTsKLQkJaWYgKHZhbHVlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJdGRvLT5udW1yZWFkKys7Ci0JCXRkby0+dmFsdWVzW2ldID0gdmFsdWU7Ci0JfQotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JcmV0dXJuIHZhbHVlOworICAgIGFzc2VydChpIDwgTElOS0NFTExTKTsKKyAgICBpZiAoaSA8IHRkby0+bnVtcmVhZCkKKyAgICAgICAgdmFsdWUgPSB0ZG8tPnZhbHVlc1tpXTsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogdGhpcyBpcyB0aGUgbGVhZCBpdGVyYXRvciwgc28gZmV0Y2ggbW9yZSBkYXRhICovCisgICAgICAgIGFzc2VydChpID09IHRkby0+bnVtcmVhZCk7CisgICAgICAgIHZhbHVlID0gUHlJdGVyX05leHQodGRvLT5pdCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHRkby0+bnVtcmVhZCsrOworICAgICAgICB0ZG8tPnZhbHVlc1tpXSA9IHZhbHVlOworICAgIH0KKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKIH0KIAogc3RhdGljIGludAogdGVlZGF0YW9iamVjdF90cmF2ZXJzZSh0ZWVkYXRhb2JqZWN0ICp0ZG8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqIGFyZykKIHsKLQlpbnQgaTsKLQlQeV9WSVNJVCh0ZG8tPml0KTsKLQlmb3IgKGkgPSAwOyBpIDwgdGRvLT5udW1yZWFkOyBpKyspCi0JCVB5X1ZJU0lUKHRkby0+dmFsdWVzW2ldKTsKLQlQeV9WSVNJVCh0ZG8tPm5leHRsaW5rKTsKLQlyZXR1cm4gMDsKKyAgICBpbnQgaTsKKyAgICBQeV9WSVNJVCh0ZG8tPml0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGRvLT5udW1yZWFkOyBpKyspCisgICAgICAgIFB5X1ZJU0lUKHRkby0+dmFsdWVzW2ldKTsKKyAgICBQeV9WSVNJVCh0ZG8tPm5leHRsaW5rKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogdGVlZGF0YW9iamVjdF9jbGVhcih0ZWVkYXRhb2JqZWN0ICp0ZG8pCiB7Ci0JaW50IGk7Ci0JUHlfQ0xFQVIodGRvLT5pdCk7Ci0JZm9yIChpPTAgOyBpPHRkby0+bnVtcmVhZCA7IGkrKykKLQkJUHlfQ0xFQVIodGRvLT52YWx1ZXNbaV0pOwotCVB5X0NMRUFSKHRkby0+bmV4dGxpbmspOwotCXJldHVybiAwOworICAgIGludCBpOworICAgIFB5X0NMRUFSKHRkby0+aXQpOworICAgIGZvciAoaT0wIDsgaTx0ZG8tPm51bXJlYWQgOyBpKyspCisgICAgICAgIFB5X0NMRUFSKHRkby0+dmFsdWVzW2ldKTsKKyAgICBQeV9DTEVBUih0ZG8tPm5leHRsaW5rKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIHRlZWRhdGFvYmplY3RfZGVhbGxvYyh0ZWVkYXRhb2JqZWN0ICp0ZG8pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayh0ZG8pOwotCXRlZWRhdGFvYmplY3RfY2xlYXIodGRvKTsKLQlQeU9iamVjdF9HQ19EZWwodGRvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHRkbyk7CisgICAgdGVlZGF0YW9iamVjdF9jbGVhcih0ZG8pOworICAgIFB5T2JqZWN0X0dDX0RlbCh0ZG8pOwogfQogCiBQeURvY19TVFJWQVIodGVlZGF0YW9iamVjdF9kb2MsICJEYXRhIGNvbnRhaW5lciBjb21tb24gdG8gbXVsdGlwbGUgdGVlIG9iamVjdHMuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgdGVlZGF0YW9iamVjdF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKQkvKiBNdXN0IGZpbGwgaW4gdHlwZSB2YWx1ZSBsYXRlciAqLwotCSJpdGVydG9vbHMudGVlX2RhdGFvYmplY3QiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZih0ZWVkYXRhb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpdGVlZGF0YW9iamVjdF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLAkvKiB0cF9mbGFncyAqLwotCXRlZWRhdGFvYmplY3RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpdGVlZGF0YW9iamVjdF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSl0ZWVkYXRhb2JqZWN0X2NsZWFyLAkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKSAgICAgICAgIC8qIE11c3QgZmlsbCBpbiB0eXBlIHZhbHVlIGxhdGVyICovCisgICAgIml0ZXJ0b29scy50ZWVfZGF0YW9iamVjdCIsICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHRlZWRhdGFvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXRlZWRhdGFvYmplY3RfZGVhbGxvYywgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICB0ZWVkYXRhb2JqZWN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpdGVlZGF0YW9iamVjdF90cmF2ZXJzZSwgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSl0ZWVkYXRhb2JqZWN0X2NsZWFyLCAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKQEAgLTQ3MSw0MiArNDcxLDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVlX25leHQodGVlb2JqZWN0ICp0bykKIHsKLQlQeU9iamVjdCAqdmFsdWUsICpsaW5rOworICAgIFB5T2JqZWN0ICp2YWx1ZSwgKmxpbms7CiAKLQlpZiAodG8tPmluZGV4ID49IExJTktDRUxMUykgewotCQlsaW5rID0gdGVlZGF0YW9iamVjdF9qdW1wbGluayh0by0+ZGF0YW9iaik7Ci0JCVB5X0RFQ1JFRih0by0+ZGF0YW9iaik7Ci0JCXRvLT5kYXRhb2JqID0gKHRlZWRhdGFvYmplY3QgKilsaW5rOwotCQl0by0+aW5kZXggPSAwOwotCX0KLQl2YWx1ZSA9IHRlZWRhdGFvYmplY3RfZ2V0aXRlbSh0by0+ZGF0YW9iaiwgdG8tPmluZGV4KTsKLQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdG8tPmluZGV4Kys7Ci0JcmV0dXJuIHZhbHVlOworICAgIGlmICh0by0+aW5kZXggPj0gTElOS0NFTExTKSB7CisgICAgICAgIGxpbmsgPSB0ZWVkYXRhb2JqZWN0X2p1bXBsaW5rKHRvLT5kYXRhb2JqKTsKKyAgICAgICAgUHlfREVDUkVGKHRvLT5kYXRhb2JqKTsKKyAgICAgICAgdG8tPmRhdGFvYmogPSAodGVlZGF0YW9iamVjdCAqKWxpbms7CisgICAgICAgIHRvLT5pbmRleCA9IDA7CisgICAgfQorICAgIHZhbHVlID0gdGVlZGF0YW9iamVjdF9nZXRpdGVtKHRvLT5kYXRhb2JqLCB0by0+aW5kZXgpOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0by0+aW5kZXgrKzsKKyAgICByZXR1cm4gdmFsdWU7CiB9CiAKIHN0YXRpYyBpbnQKIHRlZV90cmF2ZXJzZSh0ZWVvYmplY3QgKnRvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVCgoUHlPYmplY3QgKil0by0+ZGF0YW9iaik7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoKFB5T2JqZWN0ICopdG8tPmRhdGFvYmopOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVlX2NvcHkodGVlb2JqZWN0ICp0bykKIHsKLQl0ZWVvYmplY3QgKm5ld3RvOworICAgIHRlZW9iamVjdCAqbmV3dG87CiAKLQluZXd0byA9IFB5T2JqZWN0X0dDX05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7Ci0JaWYgKG5ld3RvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRih0by0+ZGF0YW9iaik7Ci0JbmV3dG8tPmRhdGFvYmogPSB0by0+ZGF0YW9iajsKLQluZXd0by0+aW5kZXggPSB0by0+aW5kZXg7Ci0JbmV3dG8tPndlYWtyZWZsaXN0ID0gTlVMTDsKLQlQeU9iamVjdF9HQ19UcmFjayhuZXd0byk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld3RvOworICAgIG5ld3RvID0gUHlPYmplY3RfR0NfTmV3KHRlZW9iamVjdCwgJnRlZV90eXBlKTsKKyAgICBpZiAobmV3dG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKHRvLT5kYXRhb2JqKTsKKyAgICBuZXd0by0+ZGF0YW9iaiA9IHRvLT5kYXRhb2JqOworICAgIG5ld3RvLT5pbmRleCA9IHRvLT5pbmRleDsKKyAgICBuZXd0by0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIFB5T2JqZWN0X0dDX1RyYWNrKG5ld3RvKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3dG87CiB9CiAKIFB5RG9jX1NUUlZBUih0ZWVjb3B5X2RvYywgIlJldHVybnMgYW4gaW5kZXBlbmRlbnQgaXRlcmF0b3IuIik7CkBAIC01MTQsMTU0ICs1MTQsMTU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVlX2Zyb21pdGVyYWJsZShQeU9iamVjdCAqaXRlcmFibGUpCiB7Ci0JdGVlb2JqZWN0ICp0bzsKLQlQeU9iamVjdCAqaXQgPSBOVUxMOworICAgIHRlZW9iamVjdCAqdG87CisgICAgUHlPYmplY3QgKml0ID0gTlVMTDsKIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeU9iamVjdF9UeXBlQ2hlY2soaXQsICZ0ZWVfdHlwZSkpIHsKLQkJdG8gPSAodGVlb2JqZWN0ICopdGVlX2NvcHkoKHRlZW9iamVjdCAqKWl0KTsKLQkJZ290byBkb25lOwotCX0KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlPYmplY3RfVHlwZUNoZWNrKGl0LCAmdGVlX3R5cGUpKSB7CisgICAgICAgIHRvID0gKHRlZW9iamVjdCAqKXRlZV9jb3B5KCh0ZWVvYmplY3QgKilpdCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQl0byA9IFB5T2JqZWN0X0dDX05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7Ci0JaWYgKHRvID09IE5VTEwpIAotCQlnb3RvIGRvbmU7Ci0JdG8tPmRhdGFvYmogPSAodGVlZGF0YW9iamVjdCAqKXRlZWRhdGFvYmplY3RfbmV3KGl0KTsKLQlpZiAoIXRvLT5kYXRhb2JqKSB7Ci0JCVB5T2JqZWN0X0dDX0RlbCh0byk7Ci0JCXRvID0gTlVMTDsKLQkJZ290byBkb25lOwotCX0KKyAgICB0byA9IFB5T2JqZWN0X0dDX05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7CisgICAgaWYgKHRvID09IE5VTEwpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB0by0+ZGF0YW9iaiA9ICh0ZWVkYXRhb2JqZWN0ICopdGVlZGF0YW9iamVjdF9uZXcoaXQpOworICAgIGlmICghdG8tPmRhdGFvYmopIHsKKyAgICAgICAgUHlPYmplY3RfR0NfRGVsKHRvKTsKKyAgICAgICAgdG8gPSBOVUxMOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JdG8tPmluZGV4ID0gMDsKLQl0by0+d2Vha3JlZmxpc3QgPSBOVUxMOwotCVB5T2JqZWN0X0dDX1RyYWNrKHRvKTsKKyAgICB0by0+aW5kZXggPSAwOworICAgIHRvLT53ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgUHlPYmplY3RfR0NfVHJhY2sodG8pOwogZG9uZToKLQlQeV9YREVDUkVGKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopdG87CisgICAgUHlfWERFQ1JFRihpdCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXRvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKml0ZXJhYmxlOworICAgIFB5T2JqZWN0ICppdGVyYWJsZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRlZSIsIDEsIDEsICZpdGVyYWJsZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiB0ZWVfZnJvbWl0ZXJhYmxlKGl0ZXJhYmxlKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0ZWUiLCAxLCAxLCAmaXRlcmFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gdGVlX2Zyb21pdGVyYWJsZShpdGVyYWJsZSk7CiB9CiAKIHN0YXRpYyBpbnQKIHRlZV9jbGVhcih0ZWVvYmplY3QgKnRvKQogewotCWlmICh0by0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgdG8pOwotCVB5X0NMRUFSKHRvLT5kYXRhb2JqKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodG8tPndlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIHRvKTsKKyAgICBQeV9DTEVBUih0by0+ZGF0YW9iaik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiB0ZWVfZGVhbGxvYyh0ZWVvYmplY3QgKnRvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sodG8pOwotCXRlZV9jbGVhcih0byk7Ci0JUHlPYmplY3RfR0NfRGVsKHRvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHRvKTsKKyAgICB0ZWVfY2xlYXIodG8pOworICAgIFB5T2JqZWN0X0dDX0RlbCh0byk7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZWVvYmplY3RfZG9jLAogIkl0ZXJhdG9yIHdyYXBwZWQgdG8gbWFrZSBpdCBjb3B5YWJsZSIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgdGVlX21ldGhvZHNbXSA9IHsKLQl7Il9fY29weV9fIiwJKFB5Q0Z1bmN0aW9uKXRlZV9jb3B5LAlNRVRIX05PQVJHUywgdGVlY29weV9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19jb3B5X18iLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlZV9jb3B5LCAgTUVUSF9OT0FSR1MsIHRlZWNvcHlfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCB0ZWVfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLnRlZSIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHRlZW9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcil0ZWVfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywJLyogdHBfZmxhZ3MgKi8KLQl0ZWVvYmplY3RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpdGVlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KXRlZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZih0ZWVvYmplY3QsIHdlYWtyZWZsaXN0KSwJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKXRlZV9uZXh0LAkJLyogdHBfaXRlcm5leHQgKi8KLQl0ZWVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCXRlZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMudGVlIiwgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YodGVlb2JqZWN0KSwgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcil0ZWVfZGVhbGxvYywgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgdGVlb2JqZWN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyl0ZWVfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSl0ZWVfY2xlYXIsICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YodGVlb2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXRlZV9uZXh0LCAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHRlZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgdGVlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpLCBuPTI7Ci0JUHlPYmplY3QgKml0LCAqaXRlcmFibGUsICpjb3B5YWJsZSwgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGksIG49MjsKKyAgICBQeU9iamVjdCAqaXQsICppdGVyYWJsZSwgKmNvcHlhYmxlLCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfG4iLCAmaXRlcmFibGUsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibiBtdXN0IGJlID49IDAiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5VHVwbGVfTmV3KG4pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotCWlmIChpdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKGl0LCAiX19jb3B5X18iKSkgewotCQljb3B5YWJsZSA9IHRlZV9mcm9taXRlcmFibGUoaXQpOwotCQlQeV9ERUNSRUYoaXQpOwotCQlpZiAoY29weWFibGUgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0gZWxzZQotCQljb3B5YWJsZSA9IGl0OwotCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAwLCBjb3B5YWJsZSk7Ci0JZm9yIChpPTEgOyBpPG4gOyBpKyspIHsKLQkJY29weWFibGUgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGNvcHlhYmxlLCAiX19jb3B5X18iLCBOVUxMKTsKLQkJaWYgKGNvcHlhYmxlID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGNvcHlhYmxlKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98biIsICZpdGVyYWJsZSwgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuIG11c3QgYmUgPj0gMCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoaXQsICJfX2NvcHlfXyIpKSB7CisgICAgICAgIGNvcHlhYmxlID0gdGVlX2Zyb21pdGVyYWJsZShpdCk7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIGlmIChjb3B5YWJsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGNvcHlhYmxlID0gaXQ7CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIGNvcHlhYmxlKTsKKyAgICBmb3IgKGk9MSA7IGk8biA7IGkrKykgeworICAgICAgICBjb3B5YWJsZSA9IFB5T2JqZWN0X0NhbGxNZXRob2QoY29weWFibGUsICJfX2NvcHlfXyIsIE5VTEwpOworICAgICAgICBpZiAoY29weWFibGUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgY29weWFibGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIodGVlX2RvYywKQEAgLTY3MSwxMCArNjcxLDEwIEBACiAvKiBjeWNsZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqaXQ7Ci0JUHlPYmplY3QgKnNhdmVkOwotCWludCBmaXJzdHBhc3M7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqc2F2ZWQ7CisgICAgaW50IGZpcnN0cGFzczsKIH0gY3ljbGVvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY3ljbGVfdHlwZTsKQEAgLTY4Miw5MSArNjgyLDkxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY3ljbGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICppdDsKLQlQeU9iamVjdCAqaXRlcmFibGU7Ci0JUHlPYmplY3QgKnNhdmVkOwotCWN5Y2xlb2JqZWN0ICpsejsKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKml0ZXJhYmxlOworICAgIFB5T2JqZWN0ICpzYXZlZDsKKyAgICBjeWNsZW9iamVjdCAqbHo7CiAKLQlpZiAodHlwZSA9PSAmY3ljbGVfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImN5Y2xlKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJmN5Y2xlX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJjeWNsZSgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY3ljbGUiLCAxLCAxLCAmaXRlcmFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjeWNsZSIsIDEsIDEsICZpdGVyYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogR2V0IGl0ZXJhdG9yLiAqLwotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEdldCBpdGVyYXRvci4gKi8KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNhdmVkID0gUHlMaXN0X05ldygwKTsKLQlpZiAoc2F2ZWQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc2F2ZWQgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChzYXZlZCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIGNyZWF0ZSBjeWNsZW9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChjeWNsZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChseiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdCk7Ci0JCVB5X0RFQ1JFRihzYXZlZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlsei0+aXQgPSBpdDsKLQlsei0+c2F2ZWQgPSBzYXZlZDsKLQlsei0+Zmlyc3RwYXNzID0gMDsKKyAgICAvKiBjcmVhdGUgY3ljbGVvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAoY3ljbGVvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobHogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICBQeV9ERUNSRUYoc2F2ZWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbHotPml0ID0gaXQ7CisgICAgbHotPnNhdmVkID0gc2F2ZWQ7CisgICAgbHotPmZpcnN0cGFzcyA9IDA7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogY3ljbGVfZGVhbGxvYyhjeWNsZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+c2F2ZWQpOwotCVB5X1hERUNSRUYobHotPml0KTsKLQlQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7CisgICAgUHlfWERFQ1JFRihsei0+c2F2ZWQpOworICAgIFB5X1hERUNSRUYobHotPml0KTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIGN5Y2xlX3RyYXZlcnNlKGN5Y2xlb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0KTsKLQlQeV9WSVNJVChsei0+c2F2ZWQpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5pdCk7CisgICAgUHlfVklTSVQobHotPnNhdmVkKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGN5Y2xlX25leHQoY3ljbGVvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICppdGVtOwotCVB5T2JqZWN0ICppdDsKLQlQeU9iamVjdCAqdG1wOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqdG1wOwogCi0Jd2hpbGUgKDEpIHsKLQkJaXRlbSA9IFB5SXRlcl9OZXh0KGx6LT5pdCk7Ci0JCWlmIChpdGVtICE9IE5VTEwpIHsKLQkJCWlmICghbHotPmZpcnN0cGFzcyAmJiBQeUxpc3RfQXBwZW5kKGx6LT5zYXZlZCwgaXRlbSkpIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfQotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoUHlMaXN0X1NpemUobHotPnNhdmVkKSA9PSAwKSAKLQkJCXJldHVybiBOVUxMOwotCQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIobHotPnNhdmVkKTsKLQkJaWYgKGl0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJdG1wID0gbHotPml0OwotCQlsei0+aXQgPSBpdDsKLQkJbHotPmZpcnN0cGFzcyA9IDE7Ci0JCVB5X0RFQ1JFRih0bXApOwotCX0KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpdGVtID0gUHlJdGVyX05leHQobHotPml0KTsKKyAgICAgICAgaWYgKGl0ZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFsei0+Zmlyc3RwYXNzICYmIFB5TGlzdF9BcHBlbmQobHotPnNhdmVkLCBpdGVtKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChQeUxpc3RfU2l6ZShsei0+c2F2ZWQpID09IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGx6LT5zYXZlZCk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHRtcCA9IGx6LT5pdDsKKyAgICAgICAgbHotPml0ID0gaXQ7CisgICAgICAgIGx6LT5maXJzdHBhc3MgPSAxOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihjeWNsZV9kb2MsCkBAIC03NzYsNTcgKzc3Niw1NyBAQAogVGhlbiByZXBlYXQgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjeWNsZV90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuY3ljbGUiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihjeWNsZW9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciljeWNsZV9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JY3ljbGVfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY3ljbGVfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYyljeWNsZV9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JY3ljbGVfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLmN5Y2xlIiwgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGN5Y2xlb2JqZWN0KSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpY3ljbGVfZGVhbGxvYywgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjeWNsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWN5Y2xlX3RyYXZlcnNlLCAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWN5Y2xlX25leHQsICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgY3ljbGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBkcm9wd2hpbGUgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKml0OwotCWxvbmcJIHN0YXJ0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgbG9uZyAgICAgICAgIHN0YXJ0OwogfSBkcm9wd2hpbGVvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZHJvcHdoaWxlX3R5cGU7CkBAIC04MzQsODEgKzgzNCw4MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRyb3B3aGlsZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpzZXE7Ci0JUHlPYmplY3QgKml0OwotCWRyb3B3aGlsZW9iamVjdCAqbHo7CisgICAgUHlPYmplY3QgKmZ1bmMsICpzZXE7CisgICAgUHlPYmplY3QgKml0OworICAgIGRyb3B3aGlsZW9iamVjdCAqbHo7CiAKLQlpZiAodHlwZSA9PSAmZHJvcHdoaWxlX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJkcm9wd2hpbGUoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmZHJvcHdoaWxlX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJkcm9wd2hpbGUoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRyb3B3aGlsZSIsIDIsIDIsICZmdW5jLCAmc2VxKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZHJvcHdoaWxlIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEdldCBpdGVyYXRvci4gKi8KLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogR2V0IGl0ZXJhdG9yLiAqLworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGNyZWF0ZSBkcm9wd2hpbGVvYmplY3Qgc3RydWN0dXJlICovCi0JbHogPSAoZHJvcHdoaWxlb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihmdW5jKTsKLQlsei0+ZnVuYyA9IGZ1bmM7Ci0JbHotPml0ID0gaXQ7Ci0JbHotPnN0YXJ0ID0gMDsKKyAgICAvKiBjcmVhdGUgZHJvcHdoaWxlb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKGRyb3B3aGlsZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgbHotPmZ1bmMgPSBmdW5jOworICAgIGx6LT5pdCA9IGl0OworICAgIGx6LT5zdGFydCA9IDA7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogZHJvcHdoaWxlX2RlYWxsb2MoZHJvcHdoaWxlb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLQlQeV9YREVDUkVGKGx6LT5mdW5jKTsKLQlQeV9YREVDUkVGKGx6LT5pdCk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPmZ1bmMpOworICAgIFB5X1hERUNSRUYobHotPml0KTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIGRyb3B3aGlsZV90cmF2ZXJzZShkcm9wd2hpbGVvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChsei0+aXQpOwotCVB5X1ZJU0lUKGx6LT5mdW5jKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChsei0+aXQpOworICAgIFB5X1ZJU0lUKGx6LT5mdW5jKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRyb3B3aGlsZV9uZXh0KGRyb3B3aGlsZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKml0ZW0sICpnb29kOwotCVB5T2JqZWN0ICppdCA9IGx6LT5pdDsKLQlsb25nIG9rOwotCVB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqaXRlbSwgKmdvb2Q7CisgICAgUHlPYmplY3QgKml0ID0gbHotPml0OworICAgIGxvbmcgb2s7CisgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOwogCi0JaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OwotCWZvciAoOzspIHsKLQkJaXRlbSA9IGl0ZXJuZXh0KGl0KTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAobHotPnN0YXJ0ID09IDEpCi0JCQlyZXR1cm4gaXRlbTsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgZm9yICg7OykgeworICAgICAgICBpdGVtID0gaXRlcm5leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChsei0+c3RhcnQgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBpdGVtOwogCi0JCWdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLCBpdGVtLCBOVUxMKTsKLQkJaWYgKGdvb2QgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7Ci0JCVB5X0RFQ1JFRihnb29kKTsKLQkJaWYgKCFvaykgewotCQkJbHotPnN0YXJ0ID0gMTsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9CisgICAgICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLCBpdGVtLCBOVUxMKTsKKyAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CisgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgbHotPnN0YXJ0ID0gMTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihkcm9wd2hpbGVfZG9jLApAQCAtOTE4LDU3ICs5MTgsNTcgQEAKIEFmdGVyd2FyZHMsIHJldHVybiBldmVyeSBlbGVtZW50IHVudGlsIHRoZSBpdGVyYWJsZSBpcyBleGhhdXN0ZWQuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZHJvcHdoaWxlX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5kcm9wd2hpbGUiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihkcm9wd2hpbGVvYmplY3QpLAkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcilkcm9wd2hpbGVfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWRyb3B3aGlsZV9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylkcm9wd2hpbGVfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylkcm9wd2hpbGVfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCWRyb3B3aGlsZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuZHJvcHdoaWxlIiwgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZHJvcHdoaWxlb2JqZWN0KSwgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcilkcm9wd2hpbGVfZGVhbGxvYywgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGRyb3B3aGlsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZHJvcHdoaWxlX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWRyb3B3aGlsZV9uZXh0LCAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgZHJvcHdoaWxlX25ldywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiB0YWtld2hpbGUgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKml0OwotCWxvbmcJIHN0b3A7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICppdDsKKyAgICBsb25nICAgICAgICAgc3RvcDsKIH0gdGFrZXdoaWxlb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHRha2V3aGlsZV90eXBlOwpAQCAtOTc2LDc4ICs5NzYsNzggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0YWtld2hpbGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqc2VxOwotCVB5T2JqZWN0ICppdDsKLQl0YWtld2hpbGVvYmplY3QgKmx6OworICAgIFB5T2JqZWN0ICpmdW5jLCAqc2VxOworICAgIFB5T2JqZWN0ICppdDsKKyAgICB0YWtld2hpbGVvYmplY3QgKmx6OwogCi0JaWYgKHR5cGUgPT0gJnRha2V3aGlsZV90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygidGFrZXdoaWxlKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJnRha2V3aGlsZV90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygidGFrZXdoaWxlKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0YWtld2hpbGUiLCAyLCAyLCAmZnVuYywgJnNlcSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRha2V3aGlsZSIsIDIsIDIsICZmdW5jLCAmc2VxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBHZXQgaXRlcmF0b3IuICovCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEdldCBpdGVyYXRvci4gKi8KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBjcmVhdGUgdGFrZXdoaWxlb2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKHRha2V3aGlsZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChseiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoZnVuYyk7Ci0JbHotPmZ1bmMgPSBmdW5jOwotCWx6LT5pdCA9IGl0OwotCWx6LT5zdG9wID0gMDsKKyAgICAvKiBjcmVhdGUgdGFrZXdoaWxlb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKHRha2V3aGlsZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgbHotPmZ1bmMgPSBmdW5jOworICAgIGx6LT5pdCA9IGl0OworICAgIGx6LT5zdG9wID0gMDsKIAotCXJldHVybiAoUHlPYmplY3QgKilsejsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbHo7CiB9CiAKIHN0YXRpYyB2b2lkCiB0YWtld2hpbGVfZGVhbGxvYyh0YWtld2hpbGVvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPmZ1bmMpOwotCVB5X1hERUNSRUYobHotPml0KTsKLQlQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7CisgICAgUHlfWERFQ1JFRihsei0+ZnVuYyk7CisgICAgUHlfWERFQ1JFRihsei0+aXQpOworICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogdGFrZXdoaWxlX3RyYXZlcnNlKHRha2V3aGlsZW9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGx6LT5pdCk7Ci0JUHlfVklTSVQobHotPmZ1bmMpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5pdCk7CisgICAgUHlfVklTSVQobHotPmZ1bmMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGFrZXdoaWxlX25leHQodGFrZXdoaWxlb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdCAqaXRlbSwgKmdvb2Q7Ci0JUHlPYmplY3QgKml0ID0gbHotPml0OwotCWxvbmcgb2s7CisgICAgUHlPYmplY3QgKml0ZW0sICpnb29kOworICAgIFB5T2JqZWN0ICppdCA9IGx6LT5pdDsKKyAgICBsb25nIG9rOwogCi0JaWYgKGx6LT5zdG9wID09IDEpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChsei0+c3RvcCA9PSAxKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWl0ZW0gPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOwotCWlmIChpdGVtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGl0ZW0gPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOworICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsIGl0ZW0sIE5VTEwpOwotCWlmIChnb29kID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7Ci0JUHlfREVDUkVGKGdvb2QpOwotCWlmIChvaykKLQkJcmV0dXJuIGl0ZW07Ci0JUHlfREVDUkVGKGl0ZW0pOwotCWx6LT5zdG9wID0gMTsKLQlyZXR1cm4gTlVMTDsKKyAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywgaXRlbSwgTlVMTCk7CisgICAgaWYgKGdvb2QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKKyAgICBQeV9ERUNSRUYoZ29vZCk7CisgICAgaWYgKG9rKQorICAgICAgICByZXR1cm4gaXRlbTsKKyAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgbHotPnN0b3AgPSAxOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIodGFrZXdoaWxlX2RvYywKQEAgLTEwNTcsNTkgKzEwNTcsNTkgQEAKIHByZWRpY2F0ZSBldmFsdWF0ZXMgdG8gdHJ1ZSBmb3IgZWFjaCBlbnRyeS4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCB0YWtld2hpbGVfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLnRha2V3aGlsZSIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHRha2V3aGlsZW9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXRha2V3aGlsZV9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JdGFrZXdoaWxlX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXRha2V3aGlsZV90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKXRha2V3aGlsZV9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JdGFrZXdoaWxlX25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy50YWtld2hpbGUiLCAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZih0YWtld2hpbGVvYmplY3QpLCAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXRha2V3aGlsZV9kZWFsbG9jLCAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgdGFrZXdoaWxlX2RvYywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyl0YWtld2hpbGVfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpdGFrZXdoaWxlX25leHQsICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICB0YWtld2hpbGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIGlzbGljZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICppdDsKLQlQeV9zc2l6ZV90IG5leHQ7Ci0JUHlfc3NpemVfdCBzdG9wOwotCVB5X3NzaXplX3Qgc3RlcDsKLQlQeV9zc2l6ZV90IGNudDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKml0OworICAgIFB5X3NzaXplX3QgbmV4dDsKKyAgICBQeV9zc2l6ZV90IHN0b3A7CisgICAgUHlfc3NpemVfdCBzdGVwOworICAgIFB5X3NzaXplX3QgY250OwogfSBpc2xpY2VvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaXNsaWNlX3R5cGU7CkBAIC0xMTE3LDEyNiArMTExNywxMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpc2xpY2VfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpzZXE7Ci0JUHlfc3NpemVfdCBzdGFydD0wLCBzdG9wPS0xLCBzdGVwPTE7Ci0JUHlPYmplY3QgKml0LCAqYTE9TlVMTCwgKmEyPU5VTEwsICphMz1OVUxMOwotCVB5X3NzaXplX3QgbnVtYXJnczsKLQlpc2xpY2VvYmplY3QgKmx6OworICAgIFB5T2JqZWN0ICpzZXE7CisgICAgUHlfc3NpemVfdCBzdGFydD0wLCBzdG9wPS0xLCBzdGVwPTE7CisgICAgUHlPYmplY3QgKml0LCAqYTE9TlVMTCwgKmEyPU5VTEwsICphMz1OVUxMOworICAgIFB5X3NzaXplX3QgbnVtYXJnczsKKyAgICBpc2xpY2VvYmplY3QgKmx6OwogCi0JaWYgKHR5cGUgPT0gJmlzbGljZV90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiaXNsaWNlKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJmlzbGljZV90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiaXNsaWNlKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpc2xpY2UiLCAyLCA0LCAmc2VxLCAmYTEsICZhMiwgJmEzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaXNsaWNlIiwgMiwgNCwgJnNlcSwgJmExLCAmYTIsICZhMykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbnVtYXJncyA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKLQlpZiAobnVtYXJncyA9PSAyKSB7Ci0JCWlmIChhMSAhPSBQeV9Ob25lKSB7Ci0JCQlzdG9wID0gUHlJbnRfQXNTc2l6ZV90KGExKTsKLQkJCWlmIChzdG9wID09IC0xKSB7Ci0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IG1heGludC4iKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChhMSAhPSBQeV9Ob25lKQotCQkJc3RhcnQgPSBQeUludF9Bc1NzaXplX3QoYTEpOwotCQlpZiAoc3RhcnQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWlmIChhMiAhPSBQeV9Ob25lKSB7Ci0JCQlzdG9wID0gUHlJbnRfQXNTc2l6ZV90KGEyKTsKLQkJCWlmIChzdG9wID09IC0xKSB7Ci0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gbWF4aW50LiIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JfQotCWlmIChzdGFydDwwIHx8IHN0b3A8LTEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCSAgICJJbmRpY2VzIGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IG1heGludC4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG51bWFyZ3MgPSBQeVR1cGxlX1NpemUoYXJncyk7CisgICAgaWYgKG51bWFyZ3MgPT0gMikgeworICAgICAgICBpZiAoYTEgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgc3RvcCA9IFB5SW50X0FzU3NpemVfdChhMSk7CisgICAgICAgICAgICBpZiAoc3RvcCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiU3RvcCBhcmd1bWVudCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBtYXhpbnQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYTEgIT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHN0YXJ0ID0gUHlJbnRfQXNTc2l6ZV90KGExKTsKKyAgICAgICAgaWYgKHN0YXJ0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoYTIgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgc3RvcCA9IFB5SW50X0FzU3NpemVfdChhMik7CisgICAgICAgICAgICBpZiAoc3RvcCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IG1heGludC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhcnQ8MCB8fCBzdG9wPC0xKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBtYXhpbnQuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChhMyAhPSBOVUxMKSB7Ci0JCWlmIChhMyAhPSBQeV9Ob25lKQotCQkJc3RlcCA9IFB5SW50X0FzU3NpemVfdChhMyk7Ci0JCWlmIChzdGVwID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlQeUVycl9DbGVhcigpOwotCX0KLQlpZiAoc3RlcDwxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkgICAiU3RlcCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgb3IgTm9uZS4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChhMyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChhMyAhPSBQeV9Ob25lKQorICAgICAgICAgICAgc3RlcCA9IFB5SW50X0FzU3NpemVfdChhMyk7CisgICAgICAgIGlmIChzdGVwID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoc3RlcDwxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAiU3RlcCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgb3IgTm9uZS4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogR2V0IGl0ZXJhdG9yLiAqLwotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogY3JlYXRlIGlzbGljZW9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChpc2xpY2VvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbHotPml0ID0gaXQ7Ci0JbHotPm5leHQgPSBzdGFydDsKLQlsei0+c3RvcCA9IHN0b3A7Ci0JbHotPnN0ZXAgPSBzdGVwOwotCWx6LT5jbnQgPSAwTDsKKyAgICAvKiBjcmVhdGUgaXNsaWNlb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKGlzbGljZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsei0+aXQgPSBpdDsKKyAgICBsei0+bmV4dCA9IHN0YXJ0OworICAgIGx6LT5zdG9wID0gc3RvcDsKKyAgICBsei0+c3RlcCA9IHN0ZXA7CisgICAgbHotPmNudCA9IDBMOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIGlzbGljZV9kZWFsbG9jKGlzbGljZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+aXQpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdCk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBpc2xpY2VfdHJhdmVyc2UoaXNsaWNlb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChsei0+aXQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaXNsaWNlX25leHQoaXNsaWNlb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdCAqaXRlbTsKLQlQeU9iamVjdCAqaXQgPSBsei0+aXQ7Ci0JUHlfc3NpemVfdCBvbGRuZXh0OwotCVB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXQgPSBsei0+aXQ7CisgICAgUHlfc3NpemVfdCBvbGRuZXh0OworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKIAotCWl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKLQl3aGlsZSAobHotPmNudCA8IGx6LT5uZXh0KSB7Ci0JCWl0ZW0gPSBpdGVybmV4dChpdCk7Ci0JCWlmIChpdGVtID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlsei0+Y250Kys7Ci0JfQotCWlmIChsei0+c3RvcCAhPSAtMSAmJiBsei0+Y250ID49IGx6LT5zdG9wKQotCQlyZXR1cm4gTlVMTDsKLQlpdGVtID0gaXRlcm5leHQoaXQpOwotCWlmIChpdGVtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWx6LT5jbnQrKzsKLQlvbGRuZXh0ID0gbHotPm5leHQ7Ci0JbHotPm5leHQgKz0gbHotPnN0ZXA7Ci0JaWYgKGx6LT5uZXh0IDwgb2xkbmV4dCkJLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0JCWx6LT5uZXh0ID0gbHotPnN0b3A7Ci0JcmV0dXJuIGl0ZW07CisgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OworICAgIHdoaWxlIChsei0+Y250IDwgbHotPm5leHQpIHsKKyAgICAgICAgaXRlbSA9IGl0ZXJuZXh0KGl0KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGx6LT5jbnQrKzsKKyAgICB9CisgICAgaWYgKGx6LT5zdG9wICE9IC0xICYmIGx6LT5jbnQgPj0gbHotPnN0b3ApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGl0ZW0gPSBpdGVybmV4dChpdCk7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbHotPmNudCsrOworICAgIG9sZG5leHQgPSBsei0+bmV4dDsKKyAgICBsei0+bmV4dCArPSBsei0+c3RlcDsKKyAgICBpZiAobHotPm5leHQgPCBvbGRuZXh0KSAgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgICAgIGx6LT5uZXh0ID0gbHotPnN0b3A7CisgICAgcmV0dXJuIGl0ZW07CiB9CiAKIFB5RG9jX1NUUlZBUihpc2xpY2VfZG9jLApAQCAtMTI1MCw1NiArMTI1MCw1NiBAQAogYnV0IHJldHVybnMgYW4gaXRlcmF0b3IuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaXNsaWNlX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5pc2xpY2UiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihpc2xpY2VvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpaXNsaWNlX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlpc2xpY2VfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpaXNsaWNlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpaXNsaWNlX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlpc2xpY2VfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLmlzbGljZSIsICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGlzbGljZW9iamVjdCksICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpaXNsaWNlX2RlYWxsb2MsICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBpc2xpY2VfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWlzbGljZV90cmF2ZXJzZSwgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWlzbGljZV9uZXh0LCAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaXNsaWNlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBzdGFybWFwIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqaXQ7CiB9IHN0YXJtYXBvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qgc3Rhcm1hcF90eXBlOwpAQCAtMTMwNyw3MSArMTMwNyw3MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0YXJtYXBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqc2VxOwotCVB5T2JqZWN0ICppdDsKLQlzdGFybWFwb2JqZWN0ICpsejsKKyAgICBQeU9iamVjdCAqZnVuYywgKnNlcTsKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgc3Rhcm1hcG9iamVjdCAqbHo7CiAKLQlpZiAodHlwZSA9PSAmc3Rhcm1hcF90eXBlICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic3Rhcm1hcCgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZzdGFybWFwX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJzdGFybWFwKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdGFybWFwIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdGFybWFwIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEdldCBpdGVyYXRvci4gKi8KLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogR2V0IGl0ZXJhdG9yLiAqLworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGNyZWF0ZSBzdGFybWFwb2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKHN0YXJtYXBvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCWx6LT5mdW5jID0gZnVuYzsKLQlsei0+aXQgPSBpdDsKKyAgICAvKiBjcmVhdGUgc3Rhcm1hcG9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBseiA9IChzdGFybWFwb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICBsei0+ZnVuYyA9IGZ1bmM7CisgICAgbHotPml0ID0gaXQ7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogc3Rhcm1hcF9kZWFsbG9jKHN0YXJtYXBvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPmZ1bmMpOwotCVB5X1hERUNSRUYobHotPml0KTsKLQlQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7CisgICAgUHlfWERFQ1JFRihsei0+ZnVuYyk7CisgICAgUHlfWERFQ1JFRihsei0+aXQpOworICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogc3Rhcm1hcF90cmF2ZXJzZShzdGFybWFwb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0KTsKLQlQeV9WSVNJVChsei0+ZnVuYyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0KTsKKyAgICBQeV9WSVNJVChsei0+ZnVuYyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdGFybWFwX25leHQoc3Rhcm1hcG9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqaXQgPSBsei0+aXQ7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqaXQgPSBsei0+aXQ7CiAKLQlhcmdzID0gKCpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQpKGl0KTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5VHVwbGVfQ2hlY2tFeGFjdChhcmdzKSkgewotCQlQeU9iamVjdCAqbmV3YXJncyA9IFB5U2VxdWVuY2VfVHVwbGUoYXJncyk7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQkJaWYgKG5ld2FyZ3MgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlhcmdzID0gbmV3YXJnczsKLQl9Ci0JcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChsei0+ZnVuYywgYXJncywgTlVMTCk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgYXJncyA9ICgqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KShpdCk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrRXhhY3QoYXJncykpIHsKKyAgICAgICAgUHlPYmplY3QgKm5ld2FyZ3MgPSBQeVNlcXVlbmNlX1R1cGxlKGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYXJncyA9IG5ld2FyZ3M7CisgICAgfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwobHotPmZ1bmMsIGFyZ3MsIE5VTEwpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoc3Rhcm1hcF9kb2MsCkBAIC0xMzgxLDU2ICsxMzgxLDU2IEBACiB3aXRoIGEgYXJndW1lbnQgdHVwbGUgdGFrZW4gZnJvbSB0aGUgZ2l2ZW4gc2VxdWVuY2UuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qgc3Rhcm1hcF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuc3Rhcm1hcCIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHN0YXJtYXBvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3Ipc3Rhcm1hcF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0Jc3Rhcm1hcF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylzdGFybWFwX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpc3Rhcm1hcF9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0Jc3Rhcm1hcF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuc3Rhcm1hcCIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2Yoc3Rhcm1hcG9iamVjdCksICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilzdGFybWFwX2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHN0YXJtYXBfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2Mpc3Rhcm1hcF90cmF2ZXJzZSwgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpc3Rhcm1hcF9uZXh0LCAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBzdGFybWFwX25ldywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIGltYXAgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqaXRlcnM7Ci0JUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICppdGVyczsKKyAgICBQeU9iamVjdCAqZnVuYzsKIH0gaW1hcG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpbWFwX3R5cGU7CkBAIC0xNDM4LDY2ICsxNDM4LDY2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW1hcF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKml0LCAqaXRlcnMsICpmdW5jOwotCWltYXBvYmplY3QgKmx6OwotCVB5X3NzaXplX3QgbnVtYXJncywgaTsKKyAgICBQeU9iamVjdCAqaXQsICppdGVycywgKmZ1bmM7CisgICAgaW1hcG9iamVjdCAqbHo7CisgICAgUHlfc3NpemVfdCBudW1hcmdzLCBpOwogCi0JaWYgKHR5cGUgPT0gJmltYXBfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImltYXAoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmaW1hcF90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiaW1hcCgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbnVtYXJncyA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKLQlpZiAobnVtYXJncyA8IDIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgImltYXAoKSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cy4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG51bWFyZ3MgPSBQeVR1cGxlX1NpemUoYXJncyk7CisgICAgaWYgKG51bWFyZ3MgPCAyKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICJpbWFwKCkgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBhcmd1bWVudHMuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWl0ZXJzID0gUHlUdXBsZV9OZXcobnVtYXJncy0xKTsKLQlpZiAoaXRlcnMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaXRlcnMgPSBQeVR1cGxlX05ldyhudW1hcmdzLTEpOworICAgIGlmIChpdGVycyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaT0xIDsgaTxudW1hcmdzIDsgaSsrKSB7Ci0JCS8qIEdldCBpdGVyYXRvci4gKi8KLQkJaXQgPSBQeU9iamVjdF9HZXRJdGVyKFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSkpOwotCQlpZiAoaXQgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGl0ZXJzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5VHVwbGVfU0VUX0lURU0oaXRlcnMsIGktMSwgaXQpOwotCX0KKyAgICBmb3IgKGk9MSA7IGk8bnVtYXJncyA7IGkrKykgeworICAgICAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVycyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGl0ZXJzLCBpLTEsIGl0KTsKKyAgICB9CiAKLQkvKiBjcmVhdGUgaW1hcG9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChpbWFwb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0ZXJzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWx6LT5pdGVycyA9IGl0ZXJzOwotCWZ1bmMgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCVB5X0lOQ1JFRihmdW5jKTsKLQlsei0+ZnVuYyA9IGZ1bmM7CisgICAgLyogY3JlYXRlIGltYXBvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAoaW1hcG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdGVycyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsei0+aXRlcnMgPSBpdGVyczsKKyAgICBmdW5jID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgbHotPmZ1bmMgPSBmdW5jOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIGltYXBfZGVhbGxvYyhpbWFwb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLQlQeV9YREVDUkVGKGx6LT5pdGVycyk7Ci0JUHlfWERFQ1JFRihsei0+ZnVuYyk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPml0ZXJzKTsKKyAgICBQeV9YREVDUkVGKGx6LT5mdW5jKTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIGltYXBfdHJhdmVyc2UoaW1hcG9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGx6LT5pdGVycyk7Ci0JUHlfVklTSVQobHotPmZ1bmMpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5pdGVycyk7CisgICAgUHlfVklTSVQobHotPmZ1bmMpOworICAgIHJldHVybiAwOwogfQogCi0vKgkKKy8qCiBpbWFwKCkgaXMgYW4gaXRlcmF0b3IgdmVyc2lvbiBvZiBfX2J1aWx0aW5zX18ubWFwKCkgZXhjZXB0IHRoYXQgaXQgZG9lcwogbm90IGhhdmUgdGhlIE5vbmUgZmlsbC1pbiBmZWF0dXJlLiAgVGhhdCB3YXMgaW50ZW50aW9uYWxseSBsZWZ0IG91dCBmb3IKIHRoZSBmb2xsb3dpbmcgcmVhc29uczoKQEAgLTE1MDgsMTUgKzE1MDgsMTUgQEAKICAgICAgaW5maW5pdGUgaXRlcmF0b3JzIGxpa2UgY291bnQoKSBhbmQgcmVwZWF0KCkgKGZvciBzdXBwbHlpbmcgc2VxdWVudGlhbAogICAgICBvciBjb25zdGFudCBhcmd1bWVudHMgdG8gYSBmdW5jdGlvbikuCiAKLSAgMikgSW4gdHlwaWNhbCB1c2UgY2FzZXMgZm9yIGNvbWJpbmluZyBpdGVydG9vbHMsIGhhdmluZyBvbmUgZmluaXRlIGRhdGEgCisgIDIpIEluIHR5cGljYWwgdXNlIGNhc2VzIGZvciBjb21iaW5pbmcgaXRlcnRvb2xzLCBoYXZpbmcgb25lIGZpbml0ZSBkYXRhCiAgICAgIHN1cHBsaWVyIHJ1biBvdXQgYmVmb3JlIGFub3RoZXIgaXMgbGlrZWx5IHRvIGJlIGFuIGVycm9yIGNvbmRpdGlvbiB3aGljaAogICAgICBzaG91bGQgbm90IHBhc3Mgc2lsZW50bHkgYnkgYXV0b21hdGljYWxseSBzdXBwbHlpbmcgTm9uZS4KIAogICAzKSBUaGUgdXNlIGNhc2VzIGZvciBhdXRvbWF0aWMgTm9uZSBmaWxsLWluIGFyZSByYXJlIC0tIG5vdCBtYW55IGZ1bmN0aW9ucwogICAgICBkbyBzb21ldGhpbmcgdXNlZnVsIHdoZW4gYSBwYXJhbWV0ZXIgc3VkZGVubHkgc3dpdGNoZXMgdHlwZSBhbmQgYmVjb21lcwotICAgICBOb25lLiAgCisgICAgIE5vbmUuCiAKLSAgNCkgSWYgYSBuZWVkIGRvZXMgYXJpc2UsIGl0IGNhbiBiZSBtZXQgYnkgX19idWlsdGluc19fLm1hcCgpIG9yIGJ5IAorICA0KSBJZiBhIG5lZWQgZG9lcyBhcmlzZSwgaXQgY2FuIGJlIG1ldCBieSBfX2J1aWx0aW5zX18ubWFwKCkgb3IgYnkKICAgICAgd3JpdGluZzogIGNoYWluKGl0ZXJhYmxlLCByZXBlYXQoTm9uZSkpLgogCiAgIDUpIFNpbWlsYXIgdG9vbHNldHMgaW4gSGFza2VsbCBhbmQgU01MIGRvIG5vdCBoYXZlIGF1dG9tYXRpYyBOb25lIGZpbGwtaW4uCkBAIC0xNTI1LDE4NyArMTUyNSwxODcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFwX25leHQoaW1hcG9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKnZhbDsKLQlQeU9iamVjdCAqYXJndHVwbGU7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IG51bWFyZ3MsIGk7CisgICAgUHlPYmplY3QgKnZhbDsKKyAgICBQeU9iamVjdCAqYXJndHVwbGU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG51bWFyZ3MsIGk7CiAKLQludW1hcmdzID0gUHlUdXBsZV9TaXplKGx6LT5pdGVycyk7Ci0JYXJndHVwbGUgPSBQeVR1cGxlX05ldyhudW1hcmdzKTsKLQlpZiAoYXJndHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbnVtYXJncyA9IFB5VHVwbGVfU2l6ZShsei0+aXRlcnMpOworICAgIGFyZ3R1cGxlID0gUHlUdXBsZV9OZXcobnVtYXJncyk7CisgICAgaWYgKGFyZ3R1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpPTAgOyBpPG51bWFyZ3MgOyBpKyspIHsKLQkJdmFsID0gUHlJdGVyX05leHQoUHlUdXBsZV9HRVRfSVRFTShsei0+aXRlcnMsIGkpKTsKLQkJaWYgKHZhbCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYXJndHVwbGUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShhcmd0dXBsZSwgaSwgdmFsKTsKLQl9Ci0JaWYgKGx6LT5mdW5jID09IFB5X05vbmUpIAotCQlyZXR1cm4gYXJndHVwbGU7Ci0JcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChsei0+ZnVuYywgYXJndHVwbGUsIE5VTEwpOwotCVB5X0RFQ1JFRihhcmd0dXBsZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmb3IgKGk9MCA7IGk8bnVtYXJncyA7IGkrKykgeworICAgICAgICB2YWwgPSBQeUl0ZXJfTmV4dChQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdGVycywgaSkpOworICAgICAgICBpZiAodmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmd0dXBsZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3R1cGxlLCBpLCB2YWwpOworICAgIH0KKyAgICBpZiAobHotPmZ1bmMgPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIGFyZ3R1cGxlOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwobHotPmZ1bmMsIGFyZ3R1cGxlLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoYXJndHVwbGUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihpbWFwX2RvYywKICJpbWFwKGZ1bmMsICppdGVyYWJsZXMpIC0tPiBpbWFwIG9iamVjdFxuXAogXG5cCiBNYWtlIGFuIGl0ZXJhdG9yIHRoYXQgY29tcHV0ZXMgdGhlIGZ1bmN0aW9uIHVzaW5nIGFyZ3VtZW50cyBmcm9tXG5cCi1lYWNoIG9mIHRoZSBpdGVyYWJsZXMuCUxpa2UgbWFwKCkgZXhjZXB0IHRoYXQgaXQgcmV0dXJuc1xuXAorZWFjaCBvZiB0aGUgaXRlcmFibGVzLiAgTGlrZSBtYXAoKSBleGNlcHQgdGhhdCBpdCByZXR1cm5zXG5cCiBhbiBpdGVyYXRvciBpbnN0ZWFkIG9mIGEgbGlzdCBhbmQgdGhhdCBpdCBzdG9wcyB3aGVuIHRoZSBzaG9ydGVzdFxuXAogaXRlcmFibGUgaXMgZXhoYXVzdGVkIGluc3RlYWQgb2YgZmlsbGluZyBpbiBOb25lIGZvciBzaG9ydGVyXG5cCiBpdGVyYWJsZXMuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaW1hcF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuaW1hcCIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGltYXBvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpaW1hcF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JaW1hcF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpbWFwX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpaW1hcF9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JaW1hcF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuaW1hcCIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoaW1hcG9iamVjdCksICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpbWFwX2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGltYXBfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpaW1hcF90cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpaW1hcF9uZXh0LCAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpbWFwX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIGNoYWluIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKnNvdXJjZTsJCS8qIEl0ZXJhdG9yIG92ZXIgaW5wdXQgaXRlcmFibGVzICovCi0JUHlPYmplY3QgKmFjdGl2ZTsJCS8qIEN1cnJlbnRseSBydW5uaW5nIGlucHV0IGl0ZXJhdG9yICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpzb3VyY2U7ICAgICAgICAgICAgICAgICAgIC8qIEl0ZXJhdG9yIG92ZXIgaW5wdXQgaXRlcmFibGVzICovCisgICAgUHlPYmplY3QgKmFjdGl2ZTsgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudGx5IHJ1bm5pbmcgaW5wdXQgaXRlcmF0b3IgKi8KIH0gY2hhaW5vYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY2hhaW5fdHlwZTsKIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogY2hhaW5fbmV3X2ludGVybmFsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnNvdXJjZSkKIHsKLQljaGFpbm9iamVjdCAqbHo7CisgICAgY2hhaW5vYmplY3QgKmx6OwogCi0JbHogPSAoY2hhaW5vYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoc291cmNlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCWx6LT5zb3VyY2UgPSBzb3VyY2U7Ci0JbHotPmFjdGl2ZSA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIGx6ID0gKGNoYWlub2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHNvdXJjZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGx6LT5zb3VyY2UgPSBzb3VyY2U7CisgICAgbHotPmFjdGl2ZSA9IE5VTEw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2hhaW5fbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpzb3VyY2U7CisgICAgUHlPYmplY3QgKnNvdXJjZTsKIAotCWlmICh0eXBlID09ICZjaGFpbl90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiY2hhaW4oKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlzb3VyY2UgPSBQeU9iamVjdF9HZXRJdGVyKGFyZ3MpOwotCWlmIChzb3VyY2UgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJmNoYWluX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJjaGFpbigpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIGNoYWluX25ld19pbnRlcm5hbCh0eXBlLCBzb3VyY2UpOworICAgIHNvdXJjZSA9IFB5T2JqZWN0X0dldEl0ZXIoYXJncyk7CisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBjaGFpbl9uZXdfaW50ZXJuYWwodHlwZSwgc291cmNlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNoYWluX25ld19mcm9tX2l0ZXJhYmxlKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZykKIHsKLQlQeU9iamVjdCAqc291cmNlOwotCQotCXNvdXJjZSA9IFB5T2JqZWN0X0dldEl0ZXIoYXJnKTsKLQlpZiAoc291cmNlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICpzb3VyY2U7CiAKLQlyZXR1cm4gY2hhaW5fbmV3X2ludGVybmFsKHR5cGUsIHNvdXJjZSk7CisgICAgc291cmNlID0gUHlPYmplY3RfR2V0SXRlcihhcmcpOworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gY2hhaW5fbmV3X2ludGVybmFsKHR5cGUsIHNvdXJjZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBjaGFpbl9kZWFsbG9jKGNoYWlub2JqZWN0ICpseikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLQlQeV9YREVDUkVGKGx6LT5hY3RpdmUpOwotCVB5X1hERUNSRUYobHotPnNvdXJjZSk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPmFjdGl2ZSk7CisgICAgUHlfWERFQ1JFRihsei0+c291cmNlKTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIGNoYWluX3RyYXZlcnNlKGNoYWlub2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPnNvdXJjZSk7Ci0JUHlfVklTSVQobHotPmFjdGl2ZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPnNvdXJjZSk7CisgICAgUHlfVklTSVQobHotPmFjdGl2ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjaGFpbl9uZXh0KGNoYWlub2JqZWN0ICpseikKIHsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXRlbTsKIAotCWlmIChsei0+c291cmNlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwkJCQkvKiBhbHJlYWR5IHN0b3BwZWQgKi8KKyAgICBpZiAobHotPnNvdXJjZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHJlYWR5IHN0b3BwZWQgKi8KIAotCWlmIChsei0+YWN0aXZlID09IE5VTEwpIHsKLQkJUHlPYmplY3QgKml0ZXJhYmxlID0gUHlJdGVyX05leHQobHotPnNvdXJjZSk7Ci0JCWlmIChpdGVyYWJsZSA9PSBOVUxMKSB7Ci0JCQlQeV9DTEVBUihsei0+c291cmNlKTsKLQkJCXJldHVybiBOVUxMOwkJCS8qIG5vIG1vcmUgaW5wdXQgc291cmNlcyAqLwotCQl9Ci0JCWx6LT5hY3RpdmUgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLQkJUHlfREVDUkVGKGl0ZXJhYmxlKTsKLQkJaWYgKGx6LT5hY3RpdmUgPT0gTlVMTCkgewotCQkJUHlfQ0xFQVIobHotPnNvdXJjZSk7Ci0JCQlyZXR1cm4gTlVMTDsJCQkvKiBpbnB1dCBub3QgaXRlcmFibGUgKi8KLQkJfQotCX0KLQlpdGVtID0gUHlJdGVyX05leHQobHotPmFjdGl2ZSk7Ci0JaWYgKGl0ZW0gIT0gTlVMTCkKLQkJcmV0dXJuIGl0ZW07Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlCi0JCQlyZXR1cm4gTlVMTDsgCQkJLyogaW5wdXQgcmFpc2VkIGFuIGV4Y2VwdGlvbiAqLwotCX0KLQlQeV9DTEVBUihsei0+YWN0aXZlKTsKLQlyZXR1cm4gY2hhaW5fbmV4dChseik7CQkJLyogcmVjdXJzZSBhbmQgdXNlIG5leHQgYWN0aXZlICovCisgICAgaWYgKGx6LT5hY3RpdmUgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBQeUl0ZXJfTmV4dChsei0+c291cmNlKTsKKyAgICAgICAgaWYgKGl0ZXJhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0NMRUFSKGx6LT5zb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBtb3JlIGlucHV0IHNvdXJjZXMgKi8KKyAgICAgICAgfQorICAgICAgICBsei0+YWN0aXZlID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVyYWJsZSk7CisgICAgICAgIGlmIChsei0+YWN0aXZlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0NMRUFSKGx6LT5zb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBub3QgaXRlcmFibGUgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpdGVtID0gUHlJdGVyX05leHQobHotPmFjdGl2ZSk7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IHJhaXNlZCBhbiBleGNlcHRpb24gKi8KKyAgICB9CisgICAgUHlfQ0xFQVIobHotPmFjdGl2ZSk7CisgICAgcmV0dXJuIGNoYWluX25leHQobHopOyAgICAgICAgICAgICAgICAgICAgICAvKiByZWN1cnNlIGFuZCB1c2UgbmV4dCBhY3RpdmUgKi8KIH0KIAogUHlEb2NfU1RSVkFSKGNoYWluX2RvYywKQEAgLTE3MjIsNjQgKzE3MjIsNjQgQEAKIHRoYXQgZXZhbHVhdGVzIGxhemlseS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGNoYWluX21ldGhvZHNbXSA9IHsKLQl7ImZyb21faXRlcmFibGUiLCAoUHlDRnVuY3Rpb24pIGNoYWluX25ld19mcm9tX2l0ZXJhYmxlLAlNRVRIX08gfCBNRVRIX0NMQVNTLAotCQljaGFpbl9mcm9tX2l0ZXJhYmxlX2RvY30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiZnJvbV9pdGVyYWJsZSIsIChQeUNGdW5jdGlvbikgY2hhaW5fbmV3X2Zyb21faXRlcmFibGUsICAgICAgICAgICAgTUVUSF9PIHwgTUVUSF9DTEFTUywKKyAgICAgICAgY2hhaW5fZnJvbV9pdGVyYWJsZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjaGFpbl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuY2hhaW4iLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihjaGFpbm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciljaGFpbl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JY2hhaW5fZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY2hhaW5fdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYyljaGFpbl9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCWNoYWluX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQljaGFpbl9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuY2hhaW4iLCAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoY2hhaW5vYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciljaGFpbl9kZWFsbG9jLCAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGNoYWluX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpY2hhaW5fdHJhdmVyc2UsICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpY2hhaW5fbmV4dCwgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgY2hhaW5fbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBjaGFpbl9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIHByb2R1Y3Qgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqcG9vbHM7CQkvKiB0dXBsZSBvZiBwb29sIHR1cGxlcyAqLwotCVB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciBwb29sICovCi0JUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLwotCWludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgcHJvZHVjdCBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnBvb2xzOyAgICAgICAgICAgICAgICAgICAgLyogdHVwbGUgb2YgcG9vbCB0dXBsZXMgKi8KKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAgICAgICAgIC8qIG9uZSBpbmRleCBwZXIgcG9vbCAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KKyAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIHByb2R1Y3QgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IHByb2R1Y3RvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcHJvZHVjdF90eXBlOwpAQCAtMTc4NywxODEgKzE3ODcsMTgxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHJvZHVjdF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JcHJvZHVjdG9iamVjdCAqbHo7Ci0JUHlfc3NpemVfdCBuYXJncywgbnBvb2xzLCByZXBlYXQ9MTsKLQlQeU9iamVjdCAqcG9vbHMgPSBOVUxMOwotCVB5X3NzaXplX3QgKmluZGljZXMgPSBOVUxMOwotCVB5X3NzaXplX3QgaTsKKyAgICBwcm9kdWN0b2JqZWN0ICpsejsKKyAgICBQeV9zc2l6ZV90IG5hcmdzLCBucG9vbHMsIHJlcGVhdD0xOworICAgIFB5T2JqZWN0ICpwb29scyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCAqaW5kaWNlcyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBpOwogCi0JaWYgKGt3ZHMgIT0gTlVMTCkgewotCQljaGFyICprd2xpc3RbXSA9IHsicmVwZWF0IiwgMH07Ci0JCVB5T2JqZWN0ICp0bXBhcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0JCWlmICh0bXBhcmdzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHModG1wYXJncywga3dkcywgInxuOnByb2R1Y3QiLCBrd2xpc3QsICZyZXBlYXQpKSB7Ci0JCQlQeV9ERUNSRUYodG1wYXJncyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYodG1wYXJncyk7Ci0JCWlmIChyZXBlYXQgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgCi0JCQkJCSJyZXBlYXQgYXJndW1lbnQgY2Fubm90IGJlIG5lZ2F0aXZlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAoa3dkcyAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKmt3bGlzdFtdID0geyJyZXBlYXQiLCAwfTsKKyAgICAgICAgUHlPYmplY3QgKnRtcGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgaWYgKHRtcGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcyh0bXBhcmdzLCBrd2RzLCAifG46cHJvZHVjdCIsIGt3bGlzdCwgJnJlcGVhdCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXBhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih0bXBhcmdzKTsKKyAgICAgICAgaWYgKHJlcGVhdCA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXQgYXJndW1lbnQgY2Fubm90IGJlIG5lZ2F0aXZlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLQluYXJncyA9IChyZXBlYXQgPT0gMCkgPyAwIDogUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQlucG9vbHMgPSBuYXJncyAqIHJlcGVhdDsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgbmFyZ3MgPSAocmVwZWF0ID09IDApID8gMCA6IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgbnBvb2xzID0gbmFyZ3MgKiByZXBlYXQ7CiAKLQlpbmRpY2VzID0gUHlNZW1fTWFsbG9jKG5wb29scyAqIHNpemVvZihQeV9zc2l6ZV90KSk7Ci0JaWYgKGluZGljZXMgPT0gTlVMTCkgewotICAgIAkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgaW5kaWNlcyA9IFB5TWVtX01hbGxvYyhucG9vbHMgKiBzaXplb2YoUHlfc3NpemVfdCkpOworICAgIGlmIChpbmRpY2VzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlwb29scyA9IFB5VHVwbGVfTmV3KG5wb29scyk7Ci0JaWYgKHBvb2xzID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7CisgICAgcG9vbHMgPSBQeVR1cGxlX05ldyhucG9vbHMpOworICAgIGlmIChwb29scyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JZm9yIChpPTA7IGkgPCBuYXJncyA7ICsraSkgewotCQlQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCVB5T2JqZWN0ICpwb29sID0gUHlTZXF1ZW5jZV9UdXBsZShpdGVtKTsKLQkJaWYgKHBvb2wgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocG9vbHMsIGksIHBvb2wpOwotCQlpbmRpY2VzW2ldID0gMDsKLQl9Ci0JZm9yICggOyBpIDwgbnBvb2xzOyArK2kpIHsKLQkJUHlPYmplY3QgKnBvb2wgPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2xzLCBpIC0gbmFyZ3MpOwotCQlQeV9JTkNSRUYocG9vbCk7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocG9vbHMsIGksIHBvb2wpOwotCQlpbmRpY2VzW2ldID0gMDsKLQl9CisgICAgZm9yIChpPTA7IGkgPCBuYXJncyA7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIFB5T2JqZWN0ICpwb29sID0gUHlTZXF1ZW5jZV9UdXBsZShpdGVtKTsKKyAgICAgICAgaWYgKHBvb2wgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocG9vbHMsIGksIHBvb2wpOworICAgICAgICBpbmRpY2VzW2ldID0gMDsKKyAgICB9CisgICAgZm9yICggOyBpIDwgbnBvb2xzOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKnBvb2wgPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2xzLCBpIC0gbmFyZ3MpOworICAgICAgICBQeV9JTkNSRUYocG9vbCk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocG9vbHMsIGksIHBvb2wpOworICAgICAgICBpbmRpY2VzW2ldID0gMDsKKyAgICB9CiAKLQkvKiBjcmVhdGUgcHJvZHVjdG9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChwcm9kdWN0b2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7CisgICAgLyogY3JlYXRlIHByb2R1Y3RvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAocHJvZHVjdG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JbHotPnBvb2xzID0gcG9vbHM7Ci0JbHotPmluZGljZXMgPSBpbmRpY2VzOwotCWx6LT5yZXN1bHQgPSBOVUxMOwotCWx6LT5zdG9wcGVkID0gMDsKKyAgICBsei0+cG9vbHMgPSBwb29sczsKKyAgICBsei0+aW5kaWNlcyA9IGluZGljZXM7CisgICAgbHotPnJlc3VsdCA9IE5VTEw7CisgICAgbHotPnN0b3BwZWQgPSAwOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIAogZXJyb3I6Ci0JaWYgKGluZGljZXMgIT0gTlVMTCkKLQkJUHlNZW1fRnJlZShpbmRpY2VzKTsKLQlQeV9YREVDUkVGKHBvb2xzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoaW5kaWNlcyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKGluZGljZXMpOworICAgIFB5X1hERUNSRUYocG9vbHMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAogcHJvZHVjdF9kZWFsbG9jKHByb2R1Y3RvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPnBvb2xzKTsKLQlQeV9YREVDUkVGKGx6LT5yZXN1bHQpOwotCWlmIChsei0+aW5kaWNlcyAhPSBOVUxMKQotCQlQeU1lbV9GcmVlKGx6LT5pbmRpY2VzKTsKLQlQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7CisgICAgUHlfWERFQ1JFRihsei0+cG9vbHMpOworICAgIFB5X1hERUNSRUYobHotPnJlc3VsdCk7CisgICAgaWYgKGx6LT5pbmRpY2VzICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZyZWUobHotPmluZGljZXMpOworICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogcHJvZHVjdF90cmF2ZXJzZShwcm9kdWN0b2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPnBvb2xzKTsKLQlQeV9WSVNJVChsei0+cmVzdWx0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChsei0+cG9vbHMpOworICAgIFB5X1ZJU0lUKGx6LT5yZXN1bHQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJvZHVjdF9uZXh0KHByb2R1Y3RvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICpwb29sOwotCVB5T2JqZWN0ICplbGVtOwotCVB5T2JqZWN0ICpvbGRlbGVtOwotCVB5T2JqZWN0ICpwb29scyA9IGx6LT5wb29sczsKLQlQeU9iamVjdCAqcmVzdWx0ID0gbHotPnJlc3VsdDsKLQlQeV9zc2l6ZV90IG5wb29scyA9IFB5VHVwbGVfR0VUX1NJWkUocG9vbHMpOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcG9vbDsKKyAgICBQeU9iamVjdCAqZWxlbTsKKyAgICBQeU9iamVjdCAqb2xkZWxlbTsKKyAgICBQeU9iamVjdCAqcG9vbHMgPSBsei0+cG9vbHM7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGx6LT5yZXN1bHQ7CisgICAgUHlfc3NpemVfdCBucG9vbHMgPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2xzKTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAobHotPnN0b3BwZWQpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChsei0+c3RvcHBlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBPbiB0aGUgZmlyc3QgcGFzcywgcmV0dXJuIGFuIGluaXRpYWwgdHVwbGUgZmlsbGVkIHdpdGggdGhlIAotICAgICAgICAgICAgICAgICAgIGZpcnN0IGVsZW1lbnQgZnJvbSBlYWNoIHBvb2wuICovCi0JCXJlc3VsdCA9IFB5VHVwbGVfTmV3KG5wb29scyk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgIAkJZ290byBlbXB0eTsKLQkJbHotPnJlc3VsdCA9IHJlc3VsdDsKLQkJZm9yIChpPTA7IGkgPCBucG9vbHM7IGkrKykgewotCQkJcG9vbCA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbHMsIGkpOwotCQkJaWYgKFB5VHVwbGVfR0VUX1NJWkUocG9vbCkgPT0gMCkKLQkJCQlnb3RvIGVtcHR5OwotICAgIAkJCWVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIDApOwotICAgIAkJCVB5X0lOQ1JFRihlbGVtKTsKLSAgICAJCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7Ci0JCX0KLQl9IGVsc2UgewotCQlQeV9zc2l6ZV90ICppbmRpY2VzID0gbHotPmluZGljZXM7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIC8qIE9uIHRoZSBmaXJzdCBwYXNzLCByZXR1cm4gYW4gaW5pdGlhbCB0dXBsZSBmaWxsZWQgd2l0aCB0aGUKKyAgICAgICAgICAgZmlyc3QgZWxlbWVudCBmcm9tIGVhY2ggcG9vbC4gKi8KKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobnBvb2xzKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlbXB0eTsKKyAgICAgICAgbHotPnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBucG9vbHM7IGkrKykgeworICAgICAgICAgICAgcG9vbCA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbHMsIGkpOworICAgICAgICAgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUocG9vbCkgPT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVtcHR5OworICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgMCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBQeV9zc2l6ZV90ICppbmRpY2VzID0gbHotPmluZGljZXM7CiAKLQkJLyogQ29weSB0aGUgcHJldmlvdXMgcmVzdWx0IHR1cGxlIG9yIHJlLXVzZSBpdCBpZiBhdmFpbGFibGUgKi8KLQkJaWYgKFB5X1JFRkNOVChyZXN1bHQpID4gMSkgewotCQkJUHlPYmplY3QgKm9sZF9yZXN1bHQgPSByZXN1bHQ7Ci0JCQlyZXN1bHQgPSBQeVR1cGxlX05ldyhucG9vbHMpOwotCQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJCWdvdG8gZW1wdHk7Ci0JCQlsei0+cmVzdWx0ID0gcmVzdWx0OwotCQkJZm9yIChpPTA7IGkgPCBucG9vbHM7IGkrKykgewotCQkJCWVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKG9sZF9yZXN1bHQsIGkpOwotICAgIAkJCQlQeV9JTkNSRUYoZWxlbSk7Ci0gICAgCQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKLQkJCX0KLQkJCVB5X0RFQ1JFRihvbGRfcmVzdWx0KTsKLQkJfQotCQkvKiBOb3csIHdlJ3ZlIGdvdCB0aGUgb25seSBjb3B5IHNvIHdlIGNhbiB1cGRhdGUgaXQgaW4tcGxhY2UgKi8KLQkJYXNzZXJ0IChucG9vbHM9PTAgfHwgUHlfUkVGQ05UKHJlc3VsdCkgPT0gMSk7CisgICAgICAgIC8qIENvcHkgdGhlIHByZXZpb3VzIHJlc3VsdCB0dXBsZSBvciByZS11c2UgaXQgaWYgYXZhaWxhYmxlICovCisgICAgICAgIGlmIChQeV9SRUZDTlQocmVzdWx0KSA+IDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvbGRfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobnBvb2xzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVtcHR5OworICAgICAgICAgICAgbHotPnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgbnBvb2xzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShvbGRfcmVzdWx0LCBpKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKG9sZF9yZXN1bHQpOworICAgICAgICB9CisgICAgICAgIC8qIE5vdywgd2UndmUgZ290IHRoZSBvbmx5IGNvcHkgc28gd2UgY2FuIHVwZGF0ZSBpdCBpbi1wbGFjZSAqLworICAgICAgICBhc3NlcnQgKG5wb29scz09MCB8fCBQeV9SRUZDTlQocmVzdWx0KSA9PSAxKTsKIAotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgcG9vbCBpbmRpY2VzIHJpZ2h0LXRvLWxlZnQuICBPbmx5IGFkdmFuY2UgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgbmV4dCBwb29sIHdoZW4gdGhlIHByZXZpb3VzIG9uZSByb2xscy1vdmVyICovCi0JCWZvciAoaT1ucG9vbHMtMSA7IGkgPj0gMCA7IGktLSkgewotCQkJcG9vbCA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbHMsIGkpOwotCQkJaW5kaWNlc1tpXSsrOwotCQkJaWYgKGluZGljZXNbaV0gPT0gUHlUdXBsZV9HRVRfU0laRShwb29sKSkgewotCQkJCS8qIFJvbGwtb3ZlciBhbmQgYWR2YW5jZSB0byBuZXh0IHBvb2wgKi8KLQkJCQlpbmRpY2VzW2ldID0gMDsKLQkJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCAwKTsKLQkJCQlQeV9JTkNSRUYoZWxlbSk7Ci0JCQkJb2xkZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBpKTsKLQkJCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7Ci0JCQkJUHlfREVDUkVGKG9sZGVsZW0pOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBObyByb2xsb3Zlci4gSnVzdCBpbmNyZW1lbnQgYW5kIHN0b3AgaGVyZS4gKi8KLQkJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCBpbmRpY2VzW2ldKTsKLQkJCQlQeV9JTkNSRUYoZWxlbSk7Ci0JCQkJb2xkZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBpKTsKLQkJCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7Ci0JCQkJUHlfREVDUkVGKG9sZGVsZW0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgcG9vbCBpbmRpY2VzIHJpZ2h0LXRvLWxlZnQuICBPbmx5IGFkdmFuY2UgdG8gdGhlCisgICAgICAgICAgIG5leHQgcG9vbCB3aGVuIHRoZSBwcmV2aW91cyBvbmUgcm9sbHMtb3ZlciAqLworICAgICAgICBmb3IgKGk9bnBvb2xzLTEgOyBpID49IDAgOyBpLS0pIHsKKyAgICAgICAgICAgIHBvb2wgPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2xzLCBpKTsKKyAgICAgICAgICAgIGluZGljZXNbaV0rKzsKKyAgICAgICAgICAgIGlmIChpbmRpY2VzW2ldID09IFB5VHVwbGVfR0VUX1NJWkUocG9vbCkpIHsKKyAgICAgICAgICAgICAgICAvKiBSb2xsLW92ZXIgYW5kIGFkdmFuY2UgdG8gbmV4dCBwb29sICovCisgICAgICAgICAgICAgICAgaW5kaWNlc1tpXSA9IDA7CisgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgMCk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgICAgIG9sZGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgaSk7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogTm8gcm9sbG92ZXIuIEp1c3QgaW5jcmVtZW50IGFuZCBzdG9wIGhlcmUuICovCisgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgaW5kaWNlc1tpXSk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgICAgIG9sZGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgaSk7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRlbGVtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8qIElmIGkgaXMgbmVnYXRpdmUsIHRoZW4gdGhlIGluZGljZXMgaGF2ZSBhbGwgcm9sbGVkLW92ZXIKLSAgICAgICAgICAgICAgICAgICBhbmQgd2UncmUgZG9uZS4gKi8KLQkJaWYgKGkgPCAwKQotCQkJZ290byBlbXB0eTsKLQl9CisgICAgICAgIC8qIElmIGkgaXMgbmVnYXRpdmUsIHRoZW4gdGhlIGluZGljZXMgaGF2ZSBhbGwgcm9sbGVkLW92ZXIKKyAgICAgICAgICAgYW5kIHdlJ3JlIGRvbmUuICovCisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW1wdHk7CisgICAgfQogCi0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBlbXB0eToKLQlsei0+c3RvcHBlZCA9IDE7Ci0JcmV0dXJuIE5VTEw7CisgICAgbHotPnN0b3BwZWQgPSAxOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIocHJvZHVjdF9kb2MsCkBAIC0xOTc5LDU5ICsxOTc5LDU5IEBACiBwcm9kdWN0KCgwLDEpLCAoMCwxKSwgKDAsMSkpIC0tPiAoMCwwLDApICgwLDAsMSkgKDAsMSwwKSAoMCwxLDEpICgxLDAsMCkgLi4uIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcHJvZHVjdF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMucHJvZHVjdCIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHByb2R1Y3RvYmplY3QpLAkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcilwcm9kdWN0X2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlwcm9kdWN0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXByb2R1Y3RfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylwcm9kdWN0X25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlwcm9kdWN0X25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5wcm9kdWN0IiwgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihwcm9kdWN0b2JqZWN0KSwgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcilwcm9kdWN0X2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHByb2R1Y3RfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpcHJvZHVjdF90cmF2ZXJzZSwgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpcHJvZHVjdF9uZXh0LCAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBwcm9kdWN0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIGNvbWJpbmF0aW9ucyBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpwb29sOwkJCS8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCi0JUHlfc3NpemVfdCAqaW5kaWNlczsgICAgICAgICAgICAvKiBvbmUgaW5kZXggcGVyIHJlc3VsdCBlbGVtZW50ICovCi0JUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLwotCVB5X3NzaXplX3QgcjsJCQkvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotCWludCBzdG9wcGVkOwkJCS8qIHNldCB0byAxIHdoZW4gdGhlIGNvbWJpbmF0aW9ucyBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnBvb2w7ICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAgICAgICAgIC8qIG9uZSBpbmRleCBwZXIgcmVzdWx0IGVsZW1lbnQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAgICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCisgICAgUHlfc3NpemVfdCByOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiByZXN1bHQgdHVwbGUgKi8KKyAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBjb21iaW5hdGlvbnMgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IGNvbWJpbmF0aW9uc29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjb21iaW5hdGlvbnNfdHlwZTsKQEAgLTIwMzksMTYwICsyMDM5LDE2MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbWJpbmF0aW9uc19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JY29tYmluYXRpb25zb2JqZWN0ICpjbzsKLQlQeV9zc2l6ZV90IG47Ci0JUHlfc3NpemVfdCByOwotCVB5T2JqZWN0ICpwb29sID0gTlVMTDsKLQlQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMOwotCVB5X3NzaXplX3QgKmluZGljZXMgPSBOVUxMOwotCVB5X3NzaXplX3QgaTsKLQlzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgInIiLCBOVUxMfTsKLSAKLSAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9uOmNvbWJpbmF0aW9ucyIsIGt3YXJncywgCi0JCQkJCSAmaXRlcmFibGUsICZyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgY29tYmluYXRpb25zb2JqZWN0ICpjbzsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlfc3NpemVfdCByOworICAgIFB5T2JqZWN0ICpwb29sID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMOworICAgIFB5X3NzaXplX3QgKmluZGljZXMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgInIiLCBOVUxMfTsKIAotCXBvb2wgPSBQeVNlcXVlbmNlX1R1cGxlKGl0ZXJhYmxlKTsKLQlpZiAocG9vbCA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOwotCWlmIChyIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInIgbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9uOmNvbWJpbmF0aW9ucyIsIGt3YXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlcmFibGUsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpbmRpY2VzID0gUHlNZW1fTWFsbG9jKHIgKiBzaXplb2YoUHlfc3NpemVfdCkpOwotCWlmIChpbmRpY2VzID09IE5VTEwpIHsKLSAgICAJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIHBvb2wgPSBQeVNlcXVlbmNlX1R1cGxlKGl0ZXJhYmxlKTsKKyAgICBpZiAocG9vbCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOworICAgIGlmIChyIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInIgbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlmb3IgKGk9MCA7IGk8ciA7IGkrKykKLQkJaW5kaWNlc1tpXSA9IGk7CisgICAgaW5kaWNlcyA9IFB5TWVtX01hbGxvYyhyICogc2l6ZW9mKFB5X3NzaXplX3QpKTsKKyAgICBpZiAoaW5kaWNlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JLyogY3JlYXRlIGNvbWJpbmF0aW9uc29iamVjdCBzdHJ1Y3R1cmUgKi8KLQljbyA9IChjb21iaW5hdGlvbnNvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoY28gPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKKyAgICBmb3IgKGk9MCA7IGk8ciA7IGkrKykKKyAgICAgICAgaW5kaWNlc1tpXSA9IGk7CiAKLQljby0+cG9vbCA9IHBvb2w7Ci0JY28tPmluZGljZXMgPSBpbmRpY2VzOwotCWNvLT5yZXN1bHQgPSBOVUxMOwotCWNvLT5yID0gcjsKLQljby0+c3RvcHBlZCA9IHIgPiBuID8gMSA6IDA7CisgICAgLyogY3JlYXRlIGNvbWJpbmF0aW9uc29iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBjbyA9IChjb21iaW5hdGlvbnNvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoY28gPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCXJldHVybiAoUHlPYmplY3QgKiljbzsKKyAgICBjby0+cG9vbCA9IHBvb2w7CisgICAgY28tPmluZGljZXMgPSBpbmRpY2VzOworICAgIGNvLT5yZXN1bHQgPSBOVUxMOworICAgIGNvLT5yID0gcjsKKyAgICBjby0+c3RvcHBlZCA9IHIgPiBuID8gMSA6IDA7CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopY287CiAKIGVycm9yOgotCWlmIChpbmRpY2VzICE9IE5VTEwpCi0JCVB5TWVtX0ZyZWUoaW5kaWNlcyk7Ci0JUHlfWERFQ1JFRihwb29sKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoaW5kaWNlcyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKGluZGljZXMpOworICAgIFB5X1hERUNSRUYocG9vbCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkCiBjb21iaW5hdGlvbnNfZGVhbGxvYyhjb21iaW5hdGlvbnNvYmplY3QgKmNvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soY28pOwotCVB5X1hERUNSRUYoY28tPnBvb2wpOwotCVB5X1hERUNSRUYoY28tPnJlc3VsdCk7Ci0JaWYgKGNvLT5pbmRpY2VzICE9IE5VTEwpCi0JCVB5TWVtX0ZyZWUoY28tPmluZGljZXMpOwotCVB5X1RZUEUoY28pLT50cF9mcmVlKGNvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGNvKTsKKyAgICBQeV9YREVDUkVGKGNvLT5wb29sKTsKKyAgICBQeV9YREVDUkVGKGNvLT5yZXN1bHQpOworICAgIGlmIChjby0+aW5kaWNlcyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKGNvLT5pbmRpY2VzKTsKKyAgICBQeV9UWVBFKGNvKS0+dHBfZnJlZShjbyk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbWJpbmF0aW9uc190cmF2ZXJzZShjb21iaW5hdGlvbnNvYmplY3QgKmNvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChjby0+cG9vbCk7Ci0JUHlfVklTSVQoY28tPnJlc3VsdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoY28tPnBvb2wpOworICAgIFB5X1ZJU0lUKGNvLT5yZXN1bHQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tYmluYXRpb25zX25leHQoY29tYmluYXRpb25zb2JqZWN0ICpjbykKIHsKLQlQeU9iamVjdCAqZWxlbTsKLQlQeU9iamVjdCAqb2xkZWxlbTsKLQlQeU9iamVjdCAqcG9vbCA9IGNvLT5wb29sOwotCVB5X3NzaXplX3QgKmluZGljZXMgPSBjby0+aW5kaWNlczsKLQlQeU9iamVjdCAqcmVzdWx0ID0gY28tPnJlc3VsdDsKLQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOwotCVB5X3NzaXplX3QgciA9IGNvLT5yOwotCVB5X3NzaXplX3QgaSwgaiwgaW5kZXg7CisgICAgUHlPYmplY3QgKmVsZW07CisgICAgUHlPYmplY3QgKm9sZGVsZW07CisgICAgUHlPYmplY3QgKnBvb2wgPSBjby0+cG9vbDsKKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzID0gY28tPmluZGljZXM7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGNvLT5yZXN1bHQ7CisgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShwb29sKTsKKyAgICBQeV9zc2l6ZV90IHIgPSBjby0+cjsKKyAgICBQeV9zc2l6ZV90IGksIGosIGluZGV4OwogCi0JaWYgKGNvLT5zdG9wcGVkKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoY28tPnN0b3BwZWQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogT24gdGhlIGZpcnN0IHBhc3MsIGluaXRpYWxpemUgcmVzdWx0IHR1cGxlIHVzaW5nIHRoZSBpbmRpY2VzICovCi0JCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHIpOwotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICAJCWdvdG8gZW1wdHk7Ci0JCWNvLT5yZXN1bHQgPSByZXN1bHQ7Ci0JCWZvciAoaT0wOyBpPHIgOyBpKyspIHsKLQkJCWluZGV4ID0gaW5kaWNlc1tpXTsKLSAgICAJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCBpbmRleCk7Ci0gICAgCQkJUHlfSU5DUkVGKGVsZW0pOwotICAgIAkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIENvcHkgdGhlIHByZXZpb3VzIHJlc3VsdCB0dXBsZSBvciByZS11c2UgaXQgaWYgYXZhaWxhYmxlICovCi0JCWlmIChQeV9SRUZDTlQocmVzdWx0KSA+IDEpIHsKLQkJCVB5T2JqZWN0ICpvbGRfcmVzdWx0ID0gcmVzdWx0OwotCQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7Ci0JCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQkJZ290byBlbXB0eTsKLQkJCWNvLT5yZXN1bHQgPSByZXN1bHQ7Ci0JCQlmb3IgKGk9MDsgaTxyIDsgaSsrKSB7Ci0JCQkJZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX3Jlc3VsdCwgaSk7Ci0gICAgCQkJCVB5X0lOQ1JFRihlbGVtKTsKLSAgICAJCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQkJfQotCQkJUHlfREVDUkVGKG9sZF9yZXN1bHQpOwotCQl9Ci0JCS8qIE5vdywgd2UndmUgZ290IHRoZSBvbmx5IGNvcHkgc28gd2UgY2FuIHVwZGF0ZSBpdCBpbi1wbGFjZSAKLQkJICogQ1B5dGhvbidzIGVtcHR5IHR1cGxlIGlzIGEgc2luZ2xldG9uIGFuZCBjYWNoZWQgaW4gCi0JCSAqIFB5VHVwbGUncyBmcmVlbGlzdC4gCi0JCSAqLwotCQlhc3NlcnQociA9PSAwIHx8IFB5X1JFRkNOVChyZXN1bHQpID09IDEpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAvKiBPbiB0aGUgZmlyc3QgcGFzcywgaW5pdGlhbGl6ZSByZXN1bHQgdHVwbGUgdXNpbmcgdGhlIGluZGljZXMgKi8KKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZW1wdHk7CisgICAgICAgIGNvLT5yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgIGZvciAoaT0wOyBpPHIgOyBpKyspIHsKKyAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1tpXTsKKyAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENvcHkgdGhlIHByZXZpb3VzIHJlc3VsdCB0dXBsZSBvciByZS11c2UgaXQgaWYgYXZhaWxhYmxlICovCisgICAgICAgIGlmIChQeV9SRUZDTlQocmVzdWx0KSA+IDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvbGRfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlbXB0eTsKKyAgICAgICAgICAgIGNvLT5yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxyIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX3Jlc3VsdCwgaSk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRfcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICAvKiBOb3csIHdlJ3ZlIGdvdCB0aGUgb25seSBjb3B5IHNvIHdlIGNhbiB1cGRhdGUgaXQgaW4tcGxhY2UKKyAgICAgICAgICogQ1B5dGhvbidzIGVtcHR5IHR1cGxlIGlzIGEgc2luZ2xldG9uIGFuZCBjYWNoZWQgaW4KKyAgICAgICAgICogUHlUdXBsZSdzIGZyZWVsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KHIgPT0gMCB8fCBQeV9SRUZDTlQocmVzdWx0KSA9PSAxKTsKIAotICAgICAgICAgICAgICAgIC8qIFNjYW4gaW5kaWNlcyByaWdodC10by1sZWZ0IHVudGlsIGZpbmRpbmcgb25lIHRoYXQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgYXQgaXRzIG1heGltdW0gKGkgKyBuIC0gcikuICovCi0JCWZvciAoaT1yLTEgOyBpID49IDAgJiYgaW5kaWNlc1tpXSA9PSBpK24tciA7IGktLSkKLQkJCTsKKyAgICAgICAgLyogU2NhbiBpbmRpY2VzIHJpZ2h0LXRvLWxlZnQgdW50aWwgZmluZGluZyBvbmUgdGhhdCBpcyBub3QKKyAgICAgICAgICAgYXQgaXRzIG1heGltdW0gKGkgKyBuIC0gcikuICovCisgICAgICAgIGZvciAoaT1yLTEgOyBpID49IDAgJiYgaW5kaWNlc1tpXSA9PSBpK24tciA7IGktLSkKKyAgICAgICAgICAgIDsKIAotCQkvKiBJZiBpIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbmRpY2VzIGFyZSBhbGwgYXQKLSAgICAgICAgICAgICAgICAgICB0aGVpciBtYXhpbXVtIHZhbHVlIGFuZCB3ZSdyZSBkb25lLiAqLwotCQlpZiAoaSA8IDApCi0JCQlnb3RvIGVtcHR5OworICAgICAgICAvKiBJZiBpIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbmRpY2VzIGFyZSBhbGwgYXQKKyAgICAgICAgICAgdGhlaXIgbWF4aW11bSB2YWx1ZSBhbmQgd2UncmUgZG9uZS4gKi8KKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgZ290byBlbXB0eTsKIAotCQkvKiBJbmNyZW1lbnQgdGhlIGN1cnJlbnQgaW5kZXggd2hpY2ggd2Uga25vdyBpcyBub3QgYXQgaXRzCi0gICAgICAgICAgICAgICAgICAgbWF4aW11bS4gIFRoZW4gbW92ZSBiYWNrIHRvIHRoZSByaWdodCBzZXR0aW5nIGVhY2ggaW5kZXgKLSAgICAgICAgICAgICAgICAgICB0byBpdHMgbG93ZXN0IHBvc3NpYmxlIHZhbHVlIChvbmUgaGlnaGVyIHRoYW4gdGhlIGluZGV4Ci0gICAgICAgICAgICAgICAgICAgdG8gaXRzIGxlZnQgLS0gdGhpcyBtYWludGFpbnMgdGhlIHNvcnQgb3JkZXIgaW52YXJpYW50KS4gKi8KLQkJaW5kaWNlc1tpXSsrOwotCQlmb3IgKGo9aSsxIDsgajxyIDsgaisrKQotCQkJaW5kaWNlc1tqXSA9IGluZGljZXNbai0xXSArIDE7CisgICAgICAgIC8qIEluY3JlbWVudCB0aGUgY3VycmVudCBpbmRleCB3aGljaCB3ZSBrbm93IGlzIG5vdCBhdCBpdHMKKyAgICAgICAgICAgbWF4aW11bS4gIFRoZW4gbW92ZSBiYWNrIHRvIHRoZSByaWdodCBzZXR0aW5nIGVhY2ggaW5kZXgKKyAgICAgICAgICAgdG8gaXRzIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZSAob25lIGhpZ2hlciB0aGFuIHRoZSBpbmRleAorICAgICAgICAgICB0byBpdHMgbGVmdCAtLSB0aGlzIG1haW50YWlucyB0aGUgc29ydCBvcmRlciBpbnZhcmlhbnQpLiAqLworICAgICAgICBpbmRpY2VzW2ldKys7CisgICAgICAgIGZvciAoaj1pKzEgOyBqPHIgOyBqKyspCisgICAgICAgICAgICBpbmRpY2VzW2pdID0gaW5kaWNlc1tqLTFdICsgMTsKIAotCQkvKiBVcGRhdGUgdGhlIHJlc3VsdCB0dXBsZSBmb3IgdGhlIG5ldyBpbmRpY2VzCi0JCSAgIHN0YXJ0aW5nIHdpdGggaSwgdGhlIGxlZnRtb3N0IGluZGV4IHRoYXQgY2hhbmdlZCAqLwotCQlmb3IgKCA7IGk8ciA7IGkrKykgewotCQkJaW5kZXggPSBpbmRpY2VzW2ldOwotCQkJZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgaW5kZXgpOwotCQkJUHlfSU5DUkVGKGVsZW0pOwotCQkJb2xkZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBpKTsKLQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKLQkJCVB5X0RFQ1JFRihvbGRlbGVtKTsKLQkJfQotCX0KKyAgICAgICAgLyogVXBkYXRlIHRoZSByZXN1bHQgdHVwbGUgZm9yIHRoZSBuZXcgaW5kaWNlcworICAgICAgICAgICBzdGFydGluZyB3aXRoIGksIHRoZSBsZWZ0bW9zdCBpbmRleCB0aGF0IGNoYW5nZWQgKi8KKyAgICAgICAgZm9yICggOyBpPHIgOyBpKyspIHsKKyAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1tpXTsKKyAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIG9sZGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgaSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYob2xkZWxlbSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiAKIGVtcHR5OgotCWNvLT5zdG9wcGVkID0gMTsKLQlyZXR1cm4gTlVMTDsKKyAgICBjby0+c3RvcHBlZCA9IDE7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihjb21iaW5hdGlvbnNfZG9jLApAQCAtMjIwMiw0NyArMjIwMiw0NyBAQAogY29tYmluYXRpb25zKHJhbmdlKDQpLCAzKSAtLT4gKDAsMSwyKSwgKDAsMSwzKSwgKDAsMiwzKSwgKDEsMiwzKSIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGNvbWJpbmF0aW9uc190eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuY29tYmluYXRpb25zIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoY29tYmluYXRpb25zb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY29tYmluYXRpb25zX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQljb21iaW5hdGlvbnNfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY29tYmluYXRpb25zX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpY29tYmluYXRpb25zX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQljb21iaW5hdGlvbnNfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLmNvbWJpbmF0aW9ucyIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoY29tYmluYXRpb25zb2JqZWN0KSwgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvciljb21iaW5hdGlvbnNfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgY29tYmluYXRpb25zX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNvbWJpbmF0aW9uc190cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpY29tYmluYXRpb25zX25leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvbWJpbmF0aW9uc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC0yMjUwLDM3ICsyMjUwLDM3IEBACiAKIC8qIEVxdWl2YWxlbnQgdG86CiAKLQkJZGVmIGNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KGl0ZXJhYmxlLCByKToKLQkJCSJjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCgnQUJDJywgMikgLS0+IEFBIEFCIEFDIEJCIEJDIENDIgotCQkJIyBudW1iZXIgaXRlbXMgcmV0dXJuZWQ6ICAobityLTEpISAvIHIhIC8gKG4tMSkhCi0JCQlwb29sID0gdHVwbGUoaXRlcmFibGUpCi0JCQluID0gbGVuKHBvb2wpCi0JCQlpbmRpY2VzID0gWzBdICogcgotCQkJeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzKSAgIAotCQkJd2hpbGUgMToKLQkJCQlmb3IgaSBpbiByZXZlcnNlZChyYW5nZShyKSk6Ci0JCQkJCWlmIGluZGljZXNbaV0gIT0gbiAtIDE6Ci0JCQkJCQlicmVhawotCQkJCWVsc2U6Ci0JCQkJCXJldHVybgotCQkJCWluZGljZXNbaTpdID0gW2luZGljZXNbaV0gKyAxXSAqIChyIC0gaSkKLQkJCQl5aWVsZCB0dXBsZShwb29sW2ldIGZvciBpIGluIGluZGljZXMpCisgICAgICAgIGRlZiBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudChpdGVyYWJsZSwgcik6CisgICAgICAgICAgICAiY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoJ0FCQycsIDIpIC0tPiBBQSBBQiBBQyBCQiBCQyBDQyIKKyAgICAgICAgICAgICMgbnVtYmVyIGl0ZW1zIHJldHVybmVkOiAgKG4rci0xKSEgLyByISAvIChuLTEpIQorICAgICAgICAgICAgcG9vbCA9IHR1cGxlKGl0ZXJhYmxlKQorICAgICAgICAgICAgbiA9IGxlbihwb29sKQorICAgICAgICAgICAgaW5kaWNlcyA9IFswXSAqIHIKKyAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlcykKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UocikpOgorICAgICAgICAgICAgICAgICAgICBpZiBpbmRpY2VzW2ldICE9IG4gLSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBpbmRpY2VzW2k6XSA9IFtpbmRpY2VzW2ldICsgMV0gKiAociAtIGkpCisgICAgICAgICAgICAgICAgeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzKQogCi0JCWRlZiBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudDIoaXRlcmFibGUsIHIpOgotCQkJJ0FsdGVybmF0ZSB2ZXJzaW9uIHRoYXQgZmlsdGVycyBmcm9tIHByb2R1Y3QoKScKLQkJCXBvb2wgPSB0dXBsZShpdGVyYWJsZSkKLQkJCW4gPSBsZW4ocG9vbCkKLQkJCWZvciBpbmRpY2VzIGluIHByb2R1Y3QocmFuZ2UobiksIHJlcGVhdD1yKToKLQkJCQlpZiBzb3J0ZWQoaW5kaWNlcykgPT0gbGlzdChpbmRpY2VzKToKLQkJCQkJeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzKQorICAgICAgICBkZWYgY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQyKGl0ZXJhYmxlLCByKToKKyAgICAgICAgICAgICdBbHRlcm5hdGUgdmVyc2lvbiB0aGF0IGZpbHRlcnMgZnJvbSBwcm9kdWN0KCknCisgICAgICAgICAgICBwb29sID0gdHVwbGUoaXRlcmFibGUpCisgICAgICAgICAgICBuID0gbGVuKHBvb2wpCisgICAgICAgICAgICBmb3IgaW5kaWNlcyBpbiBwcm9kdWN0KHJhbmdlKG4pLCByZXBlYXQ9cik6CisgICAgICAgICAgICAgICAgaWYgc29ydGVkKGluZGljZXMpID09IGxpc3QoaW5kaWNlcyk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlcykKICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpwb29sOwkJCS8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCi0JUHlfc3NpemVfdCAqaW5kaWNlczsgICAgLyogb25lIGluZGV4IHBlciByZXN1bHQgZWxlbWVudCAqLwotCVB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCi0JUHlfc3NpemVfdCByOwkJCS8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCi0JaW50IHN0b3BwZWQ7CQkJLyogc2V0IHRvIDEgd2hlbiB0aGUgY3dyIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgIC8qIG9uZSBpbmRleCBwZXIgcmVzdWx0IGVsZW1lbnQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgY3dyIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBjd3JvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY3dyX3R5cGU7CkBAIC0yMjg4LDE1NiArMjI4OCwxNTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjd3JfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWN3cm9iamVjdCAqY287Ci0JUHlfc3NpemVfdCBuOwotCVB5X3NzaXplX3QgcjsKLQlQeU9iamVjdCAqcG9vbCA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTDsKLQlQeV9zc2l6ZV90ICppbmRpY2VzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGk7Ci0Jc3RhdGljIGNoYXIgKmt3YXJnc1tdID0geyJpdGVyYWJsZSIsICJyIiwgTlVMTH07Ci0gCi0gCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPbjpjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCIsIGt3YXJncywgCi0JCQkJCSAmaXRlcmFibGUsICZyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgY3dyb2JqZWN0ICpjbzsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlfc3NpemVfdCByOworICAgIFB5T2JqZWN0ICpwb29sID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMOworICAgIFB5X3NzaXplX3QgKmluZGljZXMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgInIiLCBOVUxMfTsKIAotCXBvb2wgPSBQeVNlcXVlbmNlX1R1cGxlKGl0ZXJhYmxlKTsKLQlpZiAocG9vbCA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOwotCWlmIChyIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInIgbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9uOmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50Iiwga3dhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyYWJsZSwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWluZGljZXMgPSBQeU1lbV9NYWxsb2MociAqIHNpemVvZihQeV9zc2l6ZV90KSk7Ci0JaWYgKGluZGljZXMgPT0gTlVMTCkgewotICAgIAkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgcG9vbCA9IFB5U2VxdWVuY2VfVHVwbGUoaXRlcmFibGUpOworICAgIGlmIChwb29sID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUocG9vbCk7CisgICAgaWYgKHIgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWZvciAoaT0wIDsgaTxyIDsgaSsrKQotCQlpbmRpY2VzW2ldID0gMDsKKyAgICBpbmRpY2VzID0gUHlNZW1fTWFsbG9jKHIgKiBzaXplb2YoUHlfc3NpemVfdCkpOworICAgIGlmIChpbmRpY2VzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBjcmVhdGUgY3dyb2JqZWN0IHN0cnVjdHVyZSAqLwotCWNvID0gKGN3cm9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChjbyA9PSBOVUxMKQotCQlnb3RvIGVycm9yOworICAgIGZvciAoaT0wIDsgaTxyIDsgaSsrKQorICAgICAgICBpbmRpY2VzW2ldID0gMDsKIAotCWNvLT5wb29sID0gcG9vbDsKLQljby0+aW5kaWNlcyA9IGluZGljZXM7Ci0JY28tPnJlc3VsdCA9IE5VTEw7Ci0JY28tPnIgPSByOwotCWNvLT5zdG9wcGVkID0gIW4gJiYgcjsKKyAgICAvKiBjcmVhdGUgY3dyb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGNvID0gKGN3cm9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWNvOworICAgIGNvLT5wb29sID0gcG9vbDsKKyAgICBjby0+aW5kaWNlcyA9IGluZGljZXM7CisgICAgY28tPnJlc3VsdCA9IE5VTEw7CisgICAgY28tPnIgPSByOworICAgIGNvLT5zdG9wcGVkID0gIW4gJiYgcjsKKworICAgIHJldHVybiAoUHlPYmplY3QgKiljbzsKIAogZXJyb3I6Ci0JaWYgKGluZGljZXMgIT0gTlVMTCkKLQkJUHlNZW1fRnJlZShpbmRpY2VzKTsKLQlQeV9YREVDUkVGKHBvb2wpOwotCXJldHVybiBOVUxMOworICAgIGlmIChpbmRpY2VzICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZyZWUoaW5kaWNlcyk7CisgICAgUHlfWERFQ1JFRihwb29sKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQKIGN3cl9kZWFsbG9jKGN3cm9iamVjdCAqY28pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhjbyk7Ci0JUHlfWERFQ1JFRihjby0+cG9vbCk7Ci0JUHlfWERFQ1JFRihjby0+cmVzdWx0KTsKLQlpZiAoY28tPmluZGljZXMgIT0gTlVMTCkKLQkJUHlNZW1fRnJlZShjby0+aW5kaWNlcyk7Ci0JUHlfVFlQRShjbyktPnRwX2ZyZWUoY28pOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soY28pOworICAgIFB5X1hERUNSRUYoY28tPnBvb2wpOworICAgIFB5X1hERUNSRUYoY28tPnJlc3VsdCk7CisgICAgaWYgKGNvLT5pbmRpY2VzICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZyZWUoY28tPmluZGljZXMpOworICAgIFB5X1RZUEUoY28pLT50cF9mcmVlKGNvKTsKIH0KIAogc3RhdGljIGludAogY3dyX3RyYXZlcnNlKGN3cm9iamVjdCAqY28sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGNvLT5wb29sKTsKLQlQeV9WSVNJVChjby0+cmVzdWx0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChjby0+cG9vbCk7CisgICAgUHlfVklTSVQoY28tPnJlc3VsdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjd3JfbmV4dChjd3JvYmplY3QgKmNvKQogewotCVB5T2JqZWN0ICplbGVtOwotCVB5T2JqZWN0ICpvbGRlbGVtOwotCVB5T2JqZWN0ICpwb29sID0gY28tPnBvb2w7Ci0JUHlfc3NpemVfdCAqaW5kaWNlcyA9IGNvLT5pbmRpY2VzOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBjby0+cmVzdWx0OwotCVB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUocG9vbCk7Ci0JUHlfc3NpemVfdCByID0gY28tPnI7Ci0JUHlfc3NpemVfdCBpLCBqLCBpbmRleDsKKyAgICBQeU9iamVjdCAqZWxlbTsKKyAgICBQeU9iamVjdCAqb2xkZWxlbTsKKyAgICBQeU9iamVjdCAqcG9vbCA9IGNvLT5wb29sOworICAgIFB5X3NzaXplX3QgKmluZGljZXMgPSBjby0+aW5kaWNlczsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gY28tPnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOworICAgIFB5X3NzaXplX3QgciA9IGNvLT5yOworICAgIFB5X3NzaXplX3QgaSwgaiwgaW5kZXg7CiAKLQlpZiAoY28tPnN0b3BwZWQpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChjby0+c3RvcHBlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBPbiB0aGUgZmlyc3QgcGFzcywgaW5pdGlhbGl6ZSByZXN1bHQgdHVwbGUgdXNpbmcgdGhlIGluZGljZXMgKi8KLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgIAkJZ290byBlbXB0eTsKLQkJY28tPnJlc3VsdCA9IHJlc3VsdDsKLQkJZm9yIChpPTA7IGk8ciA7IGkrKykgewotCQkJaW5kZXggPSBpbmRpY2VzW2ldOwotICAgIAkJCWVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKLSAgICAJCQlQeV9JTkNSRUYoZWxlbSk7Ci0gICAgCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogQ29weSB0aGUgcHJldmlvdXMgcmVzdWx0IHR1cGxlIG9yIHJlLXVzZSBpdCBpZiBhdmFpbGFibGUgKi8KLQkJaWYgKFB5X1JFRkNOVChyZXN1bHQpID4gMSkgewotCQkJUHlPYmplY3QgKm9sZF9yZXN1bHQgPSByZXN1bHQ7Ci0JCQlyZXN1bHQgPSBQeVR1cGxlX05ldyhyKTsKLQkJCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCQlnb3RvIGVtcHR5OwotCQkJY28tPnJlc3VsdCA9IHJlc3VsdDsKLQkJCWZvciAoaT0wOyBpPHIgOyBpKyspIHsKLQkJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShvbGRfcmVzdWx0LCBpKTsKLSAgICAJCQkJUHlfSU5DUkVGKGVsZW0pOwotICAgIAkJCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYob2xkX3Jlc3VsdCk7Ci0JCX0KLQkJLyogTm93LCB3ZSd2ZSBnb3QgdGhlIG9ubHkgY29weSBzbyB3ZSBjYW4gdXBkYXRlIGl0IGluLXBsYWNlIENQeXRob24ncwotCQkgICBlbXB0eSB0dXBsZSBpcyBhIHNpbmdsZXRvbiBhbmQgY2FjaGVkIGluIFB5VHVwbGUncyBmcmVlbGlzdC4gKi8KLQkJYXNzZXJ0KHIgPT0gMCB8fCBQeV9SRUZDTlQocmVzdWx0KSA9PSAxKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgLyogT24gdGhlIGZpcnN0IHBhc3MsIGluaXRpYWxpemUgcmVzdWx0IHR1cGxlIHVzaW5nIHRoZSBpbmRpY2VzICovCisgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHIpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVtcHR5OworICAgICAgICBjby0+cmVzdWx0ID0gcmVzdWx0OworICAgICAgICBmb3IgKGk9MDsgaTxyIDsgaSsrKSB7CisgICAgICAgICAgICBpbmRleCA9IGluZGljZXNbaV07CisgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCBpbmRleCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBDb3B5IHRoZSBwcmV2aW91cyByZXN1bHQgdHVwbGUgb3IgcmUtdXNlIGl0IGlmIGF2YWlsYWJsZSAqLworICAgICAgICBpZiAoUHlfUkVGQ05UKHJlc3VsdCkgPiAxKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqb2xkX3Jlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZW1wdHk7CisgICAgICAgICAgICBjby0+cmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgZm9yIChpPTA7IGk8ciA7IGkrKykgeworICAgICAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKG9sZF9yZXN1bHQsIGkpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYob2xkX3Jlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgLyogTm93LCB3ZSd2ZSBnb3QgdGhlIG9ubHkgY29weSBzbyB3ZSBjYW4gdXBkYXRlIGl0IGluLXBsYWNlIENQeXRob24ncworICAgICAgICAgICBlbXB0eSB0dXBsZSBpcyBhIHNpbmdsZXRvbiBhbmQgY2FjaGVkIGluIFB5VHVwbGUncyBmcmVlbGlzdC4gKi8KKyAgICAgICAgYXNzZXJ0KHIgPT0gMCB8fCBQeV9SRUZDTlQocmVzdWx0KSA9PSAxKTsKIAotICAgICAgICAvKiBTY2FuIGluZGljZXMgcmlnaHQtdG8tbGVmdCB1bnRpbCBmaW5kaW5nIG9uZSB0aGF0IGlzIG5vdAotICAgICAgICAgKiBhdCBpdHMgbWF4aW11bSAobi0xKS4gKi8KLQkJZm9yIChpPXItMSA7IGkgPj0gMCAmJiBpbmRpY2VzW2ldID09IG4tMTsgaS0tKQotCQkJOworICAgIC8qIFNjYW4gaW5kaWNlcyByaWdodC10by1sZWZ0IHVudGlsIGZpbmRpbmcgb25lIHRoYXQgaXMgbm90CisgICAgICogYXQgaXRzIG1heGltdW0gKG4tMSkuICovCisgICAgICAgIGZvciAoaT1yLTEgOyBpID49IDAgJiYgaW5kaWNlc1tpXSA9PSBuLTE7IGktLSkKKyAgICAgICAgICAgIDsKIAotCQkvKiBJZiBpIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbmRpY2VzIGFyZSBhbGwgYXQKLSAgICAgICAgICAgdGhlaXIgbWF4aW11bSB2YWx1ZSBhbmQgd2UncmUgZG9uZS4gKi8KLQkJaWYgKGkgPCAwKQotCQkJZ290byBlbXB0eTsKKyAgICAgICAgLyogSWYgaSBpcyBuZWdhdGl2ZSwgdGhlbiB0aGUgaW5kaWNlcyBhcmUgYWxsIGF0CisgICAgICAgdGhlaXIgbWF4aW11bSB2YWx1ZSBhbmQgd2UncmUgZG9uZS4gKi8KKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgZ290byBlbXB0eTsKIAotCQkvKiBJbmNyZW1lbnQgdGhlIGN1cnJlbnQgaW5kZXggd2hpY2ggd2Uga25vdyBpcyBub3QgYXQgaXRzCi0gICAgICAgICAgIG1heGltdW0uICBUaGVuIHNldCBhbGwgdG8gdGhlIHJpZ2h0IHRvIHRoZSBzYW1lIHZhbHVlLiAqLwotCQlpbmRpY2VzW2ldKys7Ci0JCWZvciAoaj1pKzEgOyBqPHIgOyBqKyspCi0JCQlpbmRpY2VzW2pdID0gaW5kaWNlc1tqLTFdOworICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIGN1cnJlbnQgaW5kZXggd2hpY2ggd2Uga25vdyBpcyBub3QgYXQgaXRzCisgICAgICAgbWF4aW11bS4gIFRoZW4gc2V0IGFsbCB0byB0aGUgcmlnaHQgdG8gdGhlIHNhbWUgdmFsdWUuICovCisgICAgICAgIGluZGljZXNbaV0rKzsKKyAgICAgICAgZm9yIChqPWkrMSA7IGo8ciA7IGorKykKKyAgICAgICAgICAgIGluZGljZXNbal0gPSBpbmRpY2VzW2otMV07CiAKLQkJLyogVXBkYXRlIHRoZSByZXN1bHQgdHVwbGUgZm9yIHRoZSBuZXcgaW5kaWNlcwotCQkgICBzdGFydGluZyB3aXRoIGksIHRoZSBsZWZ0bW9zdCBpbmRleCB0aGF0IGNoYW5nZWQgKi8KLQkJZm9yICggOyBpPHIgOyBpKyspIHsKLQkJCWluZGV4ID0gaW5kaWNlc1tpXTsKLQkJCWVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKLQkJCVB5X0lOQ1JFRihlbGVtKTsKLQkJCW9sZGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgaSk7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7Ci0JCQlQeV9ERUNSRUYob2xkZWxlbSk7Ci0JCX0KLQl9CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgcmVzdWx0IHR1cGxlIGZvciB0aGUgbmV3IGluZGljZXMKKyAgICAgICAgICAgc3RhcnRpbmcgd2l0aCBpLCB0aGUgbGVmdG1vc3QgaW5kZXggdGhhdCBjaGFuZ2VkICovCisgICAgICAgIGZvciAoIDsgaTxyIDsgaSsrKSB7CisgICAgICAgICAgICBpbmRleCA9IGluZGljZXNbaV07CisgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCBpbmRleCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgICAgICBvbGRlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKG9sZGVsZW0pOworICAgICAgICB9CisgICAgfQogCi0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiBlbXB0eToKLQljby0+c3RvcHBlZCA9IDE7Ci0JcmV0dXJuIE5VTEw7CisgICAgY28tPnN0b3BwZWQgPSAxOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoY3dyX2RvYywKQEAgLTI0NDgsNTIgKzI0NDgsNTIgQEAKIGNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KCdBQkMnLCAyKSAtLT4gQUEgQUIgQUMgQkIgQkMgQ0MiKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjd3JfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50IiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoY3dyb2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY3dyX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWN3cl9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY3dyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpY3dyX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCQkvKiB0cF9hbGxvYyAqLwotCWN3cl9uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50IiwgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGN3cm9iamVjdCksICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWN3cl9kZWFsbG9jLCAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGN3cl9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyljd3JfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYyljd3JfbmV4dCwgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgY3dyX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIHBlcm11dGF0aW9ucyBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gIAorCiBkZWYgcGVybXV0YXRpb25zKGl0ZXJhYmxlLCByPU5vbmUpOgogICAgICdwZXJtdXRhdGlvbnMocmFuZ2UoMyksIDIpIC0tPiAoMCwxKSAoMCwyKSAoMSwwKSAoMSwyKSAoMiwwKSAoMiwxKScKICAgICBwb29sID0gdHVwbGUoaXRlcmFibGUpCkBAIC0yNTAzLDI4ICsyNTAzLDI4IEBACiAgICAgY3ljbGVzID0gcmFuZ2Uobi1yKzEsIG4rMSlbOjotMV0KICAgICB5aWVsZCB0dXBsZShwb29sW2ldIGZvciBpIGluIGluZGljZXNbOnJdKQogICAgIHdoaWxlIG46Ci0gICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKHIpKToKLSAgICAgICAgICAgIGN5Y2xlc1tpXSAtPSAxCi0gICAgICAgICAgICBpZiBjeWNsZXNbaV0gPT0gMDoKLSAgICAgICAgICAgICAgICBpbmRpY2VzW2k6XSA9IGluZGljZXNbaSsxOl0gKyBpbmRpY2VzW2k6aSsxXQotICAgICAgICAgICAgICAgIGN5Y2xlc1tpXSA9IG4gLSBpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGogPSBjeWNsZXNbaV0KLSAgICAgICAgICAgICAgICBpbmRpY2VzW2ldLCBpbmRpY2VzWy1qXSA9IGluZGljZXNbLWpdLCBpbmRpY2VzW2ldCi0gICAgICAgICAgICAgICAgeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzWzpyXSkKLSAgICAgICAgICAgICAgICBicmVhaworICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKHIpKToKKyAgICAgICAgY3ljbGVzW2ldIC09IDEKKyAgICAgICAgaWYgY3ljbGVzW2ldID09IDA6CisgICAgICAgIGluZGljZXNbaTpdID0gaW5kaWNlc1tpKzE6XSArIGluZGljZXNbaTppKzFdCisgICAgICAgIGN5Y2xlc1tpXSA9IG4gLSBpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaiA9IGN5Y2xlc1tpXQorICAgICAgICBpbmRpY2VzW2ldLCBpbmRpY2VzWy1qXSA9IGluZGljZXNbLWpdLCBpbmRpY2VzW2ldCisgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlc1s6cl0pCisgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuCiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpwb29sOwkJCS8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCi0JUHlfc3NpemVfdCAqaW5kaWNlczsgICAgICAgICAgICAvKiBvbmUgaW5kZXggcGVyIGVsZW1lbnQgaW4gdGhlIHBvb2wgKi8KLQlQeV9zc2l6ZV90ICpjeWNsZXM7CQkvKiBvbmUgcm9sbG92ZXIgY291bnRlciBwZXIgZWxlbWVudCBpbiB0aGUgcmVzdWx0ICovCi0JUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLwotCVB5X3NzaXplX3QgcjsJCQkvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotCWludCBzdG9wcGVkOwkJCS8qIHNldCB0byAxIHdoZW4gdGhlIHBlcm11dGF0aW9ucyBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnBvb2w7ICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAgICAgICAgIC8qIG9uZSBpbmRleCBwZXIgZWxlbWVudCBpbiB0aGUgcG9vbCAqLworICAgIFB5X3NzaXplX3QgKmN5Y2xlczsgICAgICAgICAgICAgICAgIC8qIG9uZSByb2xsb3ZlciBjb3VudGVyIHBlciBlbGVtZW50IGluIHRoZSByZXN1bHQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAgICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCisgICAgUHlfc3NpemVfdCByOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiByZXN1bHQgdHVwbGUgKi8KKyAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBwZXJtdXRhdGlvbnMgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IHBlcm11dGF0aW9uc29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwZXJtdXRhdGlvbnNfdHlwZTsKQEAgLTI1MzIsMTgwICsyNTMyLDE4MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBlcm11dGF0aW9uc19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JcGVybXV0YXRpb25zb2JqZWN0ICpwbzsKLQlQeV9zc2l6ZV90IG47Ci0JUHlfc3NpemVfdCByOwotCVB5T2JqZWN0ICpyb2JqID0gUHlfTm9uZTsKLQlQeU9iamVjdCAqcG9vbCA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTDsKLQlQeV9zc2l6ZV90ICppbmRpY2VzID0gTlVMTDsKLQlQeV9zc2l6ZV90ICpjeWNsZXMgPSBOVUxMOwotCVB5X3NzaXplX3QgaTsKLQlzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgInIiLCBOVUxMfTsKLSAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPOnBlcm11dGF0aW9ucyIsIGt3YXJncywgCi0JCQkJCSAmaXRlcmFibGUsICZyb2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgcGVybXV0YXRpb25zb2JqZWN0ICpwbzsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlfc3NpemVfdCByOworICAgIFB5T2JqZWN0ICpyb2JqID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqcG9vbCA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90ICpjeWNsZXMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgInIiLCBOVUxMfTsKIAotCXBvb2wgPSBQeVNlcXVlbmNlX1R1cGxlKGl0ZXJhYmxlKTsKLQlpZiAocG9vbCA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86cGVybXV0YXRpb25zIiwga3dhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyYWJsZSwgJnJvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXIgPSBuOwotCWlmIChyb2JqICE9IFB5X05vbmUpIHsKLQkJciA9IFB5SW50X0FzU3NpemVfdChyb2JqKTsKLQkJaWYgKHIgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCWlmIChyIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInIgbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgcG9vbCA9IFB5U2VxdWVuY2VfVHVwbGUoaXRlcmFibGUpOworICAgIGlmIChwb29sID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUocG9vbCk7CiAKLQlpbmRpY2VzID0gUHlNZW1fTWFsbG9jKG4gKiBzaXplb2YoUHlfc3NpemVfdCkpOwotCWN5Y2xlcyA9IFB5TWVtX01hbGxvYyhyICogc2l6ZW9mKFB5X3NzaXplX3QpKTsKLQlpZiAoaW5kaWNlcyA9PSBOVUxMIHx8IGN5Y2xlcyA9PSBOVUxMKSB7Ci0gICAgCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICByID0gbjsKKyAgICBpZiAocm9iaiAhPSBQeV9Ob25lKSB7CisgICAgICAgIHIgPSBQeUludF9Bc1NzaXplX3Qocm9iaik7CisgICAgICAgIGlmIChyID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAociA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJyIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JZm9yIChpPTAgOyBpPG4gOyBpKyspCi0JCWluZGljZXNbaV0gPSBpOwotCWZvciAoaT0wIDsgaTxyIDsgaSsrKQotCQljeWNsZXNbaV0gPSBuIC0gaTsKKyAgICBpbmRpY2VzID0gUHlNZW1fTWFsbG9jKG4gKiBzaXplb2YoUHlfc3NpemVfdCkpOworICAgIGN5Y2xlcyA9IFB5TWVtX01hbGxvYyhyICogc2l6ZW9mKFB5X3NzaXplX3QpKTsKKyAgICBpZiAoaW5kaWNlcyA9PSBOVUxMIHx8IGN5Y2xlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JLyogY3JlYXRlIHBlcm11dGF0aW9uc29iamVjdCBzdHJ1Y3R1cmUgKi8KLQlwbyA9IChwZXJtdXRhdGlvbnNvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAocG8gPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKKyAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykKKyAgICAgICAgaW5kaWNlc1tpXSA9IGk7CisgICAgZm9yIChpPTAgOyBpPHIgOyBpKyspCisgICAgICAgIGN5Y2xlc1tpXSA9IG4gLSBpOwogCi0JcG8tPnBvb2wgPSBwb29sOwotCXBvLT5pbmRpY2VzID0gaW5kaWNlczsKLQlwby0+Y3ljbGVzID0gY3ljbGVzOwotCXBvLT5yZXN1bHQgPSBOVUxMOwotCXBvLT5yID0gcjsKLQlwby0+c3RvcHBlZCA9IHIgPiBuID8gMSA6IDA7CisgICAgLyogY3JlYXRlIHBlcm11dGF0aW9uc29iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBwbyA9IChwZXJtdXRhdGlvbnNvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAocG8gPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCXJldHVybiAoUHlPYmplY3QgKilwbzsKKyAgICBwby0+cG9vbCA9IHBvb2w7CisgICAgcG8tPmluZGljZXMgPSBpbmRpY2VzOworICAgIHBvLT5jeWNsZXMgPSBjeWNsZXM7CisgICAgcG8tPnJlc3VsdCA9IE5VTEw7CisgICAgcG8tPnIgPSByOworICAgIHBvLT5zdG9wcGVkID0gciA+IG4gPyAxIDogMDsKKworICAgIHJldHVybiAoUHlPYmplY3QgKilwbzsKIAogZXJyb3I6Ci0JaWYgKGluZGljZXMgIT0gTlVMTCkKLQkJUHlNZW1fRnJlZShpbmRpY2VzKTsKLQlpZiAoY3ljbGVzICE9IE5VTEwpCi0JCVB5TWVtX0ZyZWUoY3ljbGVzKTsKLQlQeV9YREVDUkVGKHBvb2wpOwotCXJldHVybiBOVUxMOworICAgIGlmIChpbmRpY2VzICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZyZWUoaW5kaWNlcyk7CisgICAgaWYgKGN5Y2xlcyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKGN5Y2xlcyk7CisgICAgUHlfWERFQ1JFRihwb29sKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQKIHBlcm11dGF0aW9uc19kZWFsbG9jKHBlcm11dGF0aW9uc29iamVjdCAqcG8pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhwbyk7Ci0JUHlfWERFQ1JFRihwby0+cG9vbCk7Ci0JUHlfWERFQ1JFRihwby0+cmVzdWx0KTsKLQlQeU1lbV9GcmVlKHBvLT5pbmRpY2VzKTsKLQlQeU1lbV9GcmVlKHBvLT5jeWNsZXMpOwotCVB5X1RZUEUocG8pLT50cF9mcmVlKHBvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHBvKTsKKyAgICBQeV9YREVDUkVGKHBvLT5wb29sKTsKKyAgICBQeV9YREVDUkVGKHBvLT5yZXN1bHQpOworICAgIFB5TWVtX0ZyZWUocG8tPmluZGljZXMpOworICAgIFB5TWVtX0ZyZWUocG8tPmN5Y2xlcyk7CisgICAgUHlfVFlQRShwbyktPnRwX2ZyZWUocG8pOwogfQogCiBzdGF0aWMgaW50CiBwZXJtdXRhdGlvbnNfdHJhdmVyc2UocGVybXV0YXRpb25zb2JqZWN0ICpwbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQocG8tPnBvb2wpOwotCVB5X1ZJU0lUKHBvLT5yZXN1bHQpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHBvLT5wb29sKTsKKyAgICBQeV9WSVNJVChwby0+cmVzdWx0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHBlcm11dGF0aW9uc19uZXh0KHBlcm11dGF0aW9uc29iamVjdCAqcG8pCiB7Ci0JUHlPYmplY3QgKmVsZW07Ci0JUHlPYmplY3QgKm9sZGVsZW07Ci0JUHlPYmplY3QgKnBvb2wgPSBwby0+cG9vbDsKLQlQeV9zc2l6ZV90ICppbmRpY2VzID0gcG8tPmluZGljZXM7Ci0JUHlfc3NpemVfdCAqY3ljbGVzID0gcG8tPmN5Y2xlczsKLQlQeU9iamVjdCAqcmVzdWx0ID0gcG8tPnJlc3VsdDsKLQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOwotCVB5X3NzaXplX3QgciA9IHBvLT5yOwotCVB5X3NzaXplX3QgaSwgaiwgaywgaW5kZXg7CisgICAgUHlPYmplY3QgKmVsZW07CisgICAgUHlPYmplY3QgKm9sZGVsZW07CisgICAgUHlPYmplY3QgKnBvb2wgPSBwby0+cG9vbDsKKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzID0gcG8tPmluZGljZXM7CisgICAgUHlfc3NpemVfdCAqY3ljbGVzID0gcG8tPmN5Y2xlczsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gcG8tPnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOworICAgIFB5X3NzaXplX3QgciA9IHBvLT5yOworICAgIFB5X3NzaXplX3QgaSwgaiwgaywgaW5kZXg7CiAKLQlpZiAocG8tPnN0b3BwZWQpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChwby0+c3RvcHBlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBPbiB0aGUgZmlyc3QgcGFzcywgaW5pdGlhbGl6ZSByZXN1bHQgdHVwbGUgdXNpbmcgdGhlIGluZGljZXMgKi8KLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgIAkJZ290byBlbXB0eTsKLQkJcG8tPnJlc3VsdCA9IHJlc3VsdDsKLQkJZm9yIChpPTA7IGk8ciA7IGkrKykgewotCQkJaW5kZXggPSBpbmRpY2VzW2ldOwotICAgIAkJCWVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKLSAgICAJCQlQeV9JTkNSRUYoZWxlbSk7Ci0gICAgCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKG4gPT0gMCkKLQkJCWdvdG8gZW1wdHk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIC8qIE9uIHRoZSBmaXJzdCBwYXNzLCBpbml0aWFsaXplIHJlc3VsdCB0dXBsZSB1c2luZyB0aGUgaW5kaWNlcyAqLworICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlbXB0eTsKKyAgICAgICAgcG8tPnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgZm9yIChpPTA7IGk8ciA7IGkrKykgeworICAgICAgICAgICAgaW5kZXggPSBpbmRpY2VzW2ldOworICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgaW5kZXgpOworICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIGdvdG8gZW1wdHk7CiAKLQkJLyogQ29weSB0aGUgcHJldmlvdXMgcmVzdWx0IHR1cGxlIG9yIHJlLXVzZSBpdCBpZiBhdmFpbGFibGUgKi8KLQkJaWYgKFB5X1JFRkNOVChyZXN1bHQpID4gMSkgewotCQkJUHlPYmplY3QgKm9sZF9yZXN1bHQgPSByZXN1bHQ7Ci0JCQlyZXN1bHQgPSBQeVR1cGxlX05ldyhyKTsKLQkJCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCQlnb3RvIGVtcHR5OwotCQkJcG8tPnJlc3VsdCA9IHJlc3VsdDsKLQkJCWZvciAoaT0wOyBpPHIgOyBpKyspIHsKLQkJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShvbGRfcmVzdWx0LCBpKTsKLSAgICAJCQkJUHlfSU5DUkVGKGVsZW0pOwotICAgIAkJCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYob2xkX3Jlc3VsdCk7Ci0JCX0KLQkJLyogTm93LCB3ZSd2ZSBnb3QgdGhlIG9ubHkgY29weSBzbyB3ZSBjYW4gdXBkYXRlIGl0IGluLXBsYWNlICovCi0JCWFzc2VydChyID09IDAgfHwgUHlfUkVGQ05UKHJlc3VsdCkgPT0gMSk7CisgICAgICAgIC8qIENvcHkgdGhlIHByZXZpb3VzIHJlc3VsdCB0dXBsZSBvciByZS11c2UgaXQgaWYgYXZhaWxhYmxlICovCisgICAgICAgIGlmIChQeV9SRUZDTlQocmVzdWx0KSA+IDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvbGRfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlbXB0eTsKKyAgICAgICAgICAgIHBvLT5yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxyIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX3Jlc3VsdCwgaSk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRfcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICAvKiBOb3csIHdlJ3ZlIGdvdCB0aGUgb25seSBjb3B5IHNvIHdlIGNhbiB1cGRhdGUgaXQgaW4tcGxhY2UgKi8KKyAgICAgICAgYXNzZXJ0KHIgPT0gMCB8fCBQeV9SRUZDTlQocmVzdWx0KSA9PSAxKTsKIAotICAgICAgICAgICAgICAgIC8qIERlY3JlbWVudCByaWdodG1vc3QgY3ljbGUsIG1vdmluZyBsZWZ0d2FyZCB1cG9uIHplcm8gcm9sbG92ZXIgKi8KLQkJZm9yIChpPXItMSA7IGk+PTAgOyBpLS0pIHsKLQkJCWN5Y2xlc1tpXSAtPSAxOwotCQkJaWYgKGN5Y2xlc1tpXSA9PSAwKSB7Ci0JCQkJLyogcm90YXRhdGlvbjogaW5kaWNlc1tpOl0gPSBpbmRpY2VzW2krMTpdICsgaW5kaWNlc1tpOmkrMV0gKi8KLQkJCQlpbmRleCA9IGluZGljZXNbaV07Ci0JCQkJZm9yIChqPWkgOyBqPG4tMSA7IGorKykKLQkJCQkJaW5kaWNlc1tqXSA9IGluZGljZXNbaisxXTsKLQkJCQlpbmRpY2VzW24tMV0gPSBpbmRleDsKLQkJCQljeWNsZXNbaV0gPSBuIC0gaTsKLQkJCX0gZWxzZSB7Ci0JCQkJaiA9IGN5Y2xlc1tpXTsKLQkJCQlpbmRleCA9IGluZGljZXNbaV07Ci0JCQkJaW5kaWNlc1tpXSA9IGluZGljZXNbbi1qXTsKLQkJCQlpbmRpY2VzW24tal0gPSBpbmRleDsKKyAgICAgICAgLyogRGVjcmVtZW50IHJpZ2h0bW9zdCBjeWNsZSwgbW92aW5nIGxlZnR3YXJkIHVwb24gemVybyByb2xsb3ZlciAqLworICAgICAgICBmb3IgKGk9ci0xIDsgaT49MCA7IGktLSkgeworICAgICAgICAgICAgY3ljbGVzW2ldIC09IDE7CisgICAgICAgICAgICBpZiAoY3ljbGVzW2ldID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiByb3RhdGF0aW9uOiBpbmRpY2VzW2k6XSA9IGluZGljZXNbaSsxOl0gKyBpbmRpY2VzW2k6aSsxXSAqLworICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1tpXTsKKyAgICAgICAgICAgICAgICBmb3IgKGo9aSA7IGo8bi0xIDsgaisrKQorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2pdID0gaW5kaWNlc1tqKzFdOworICAgICAgICAgICAgICAgIGluZGljZXNbbi0xXSA9IGluZGV4OworICAgICAgICAgICAgICAgIGN5Y2xlc1tpXSA9IG4gLSBpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBqID0gY3ljbGVzW2ldOworICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1tpXTsKKyAgICAgICAgICAgICAgICBpbmRpY2VzW2ldID0gaW5kaWNlc1tuLWpdOworICAgICAgICAgICAgICAgIGluZGljZXNbbi1qXSA9IGluZGV4OwogCi0JCQkJZm9yIChrPWk7IGs8ciA7IGsrKykgewotCQkJCQkvKiBzdGFydCB3aXRoIGksIHRoZSBsZWZ0bW9zdCBlbGVtZW50IHRoYXQgY2hhbmdlZCAqLwotCQkJCQkvKiB5aWVsZCB0dXBsZShwb29sW2tdIGZvciBrIGluIGluZGljZXNbOnJdKSAqLwotCQkJCQlpbmRleCA9IGluZGljZXNba107Ci0JCQkJCWVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKLSAgICAJCQkJCVB5X0lOQ1JFRihlbGVtKTsKLQkJCQkJb2xkZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBrKTsKLSAgICAJCQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBrLCBlbGVtKTsKLQkJCQkJUHlfREVDUkVGKG9sZGVsZW0pOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKiBJZiBpIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBjeWNsZXMgaGF2ZSBhbGwKLSAgICAgICAgICAgICAgICAgICByb2xsZWQtb3ZlciBhbmQgd2UncmUgZG9uZS4gKi8KLQkJaWYgKGkgPCAwKQotCQkJZ290byBlbXB0eTsKLQl9Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICBmb3IgKGs9aTsgazxyIDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHdpdGggaSwgdGhlIGxlZnRtb3N0IGVsZW1lbnQgdGhhdCBjaGFuZ2VkICovCisgICAgICAgICAgICAgICAgICAgIC8qIHlpZWxkIHR1cGxlKHBvb2xba10gZm9yIGsgaW4gaW5kaWNlc1s6cl0pICovCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1trXTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgICAgICAgICAgICAgIG9sZGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgayk7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBrLCBlbGVtKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9sZGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBJZiBpIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBjeWNsZXMgaGF2ZSBhbGwKKyAgICAgICAgICAgcm9sbGVkLW92ZXIgYW5kIHdlJ3JlIGRvbmUuICovCisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW1wdHk7CisgICAgfQorICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiAKIGVtcHR5OgotCXBvLT5zdG9wcGVkID0gMTsKLQlyZXR1cm4gTlVMTDsKKyAgICBwby0+c3RvcHBlZCA9IDE7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihwZXJtdXRhdGlvbnNfZG9jLApAQCAtMjcxNSw0NyArMjcxNSw0NyBAQAogcGVybXV0YXRpb25zKHJhbmdlKDMpLCAyKSAtLT4gKDAsMSksICgwLDIpLCAoMSwwKSwgKDEsMiksICgyLDApLCAoMiwxKSIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHBlcm11dGF0aW9uc190eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMucGVybXV0YXRpb25zIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YocGVybXV0YXRpb25zb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpcGVybXV0YXRpb25zX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlwZXJtdXRhdGlvbnNfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpcGVybXV0YXRpb25zX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpcGVybXV0YXRpb25zX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlwZXJtdXRhdGlvbnNfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLnBlcm11dGF0aW9ucyIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YocGVybXV0YXRpb25zb2JqZWN0KSwgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilwZXJtdXRhdGlvbnNfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgcGVybXV0YXRpb25zX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXBlcm11dGF0aW9uc190cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpcGVybXV0YXRpb25zX25leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHBlcm11dGF0aW9uc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC0yNzYzLDE1ICsyNzYzLDE1IEBACiAKIC8qIEVxdWl2YWxlbnQgdG86CiAKLQlkZWYgY29tcHJlc3MoZGF0YSwgc2VsZWN0b3JzKToKLQkJImNvbXByZXNzKCdBQkNERUYnLCBbMSwwLDEsMCwxLDFdKSAtLT4gQSBDIEUgRiIKLQkJcmV0dXJuIChkIGZvciBkLCBzIGluIGl6aXAoZGF0YSwgc2VsZWN0b3JzKSBpZiBzKQorICAgIGRlZiBjb21wcmVzcyhkYXRhLCBzZWxlY3RvcnMpOgorICAgICAgICAiY29tcHJlc3MoJ0FCQ0RFRicsIFsxLDAsMSwwLDEsMV0pIC0tPiBBIEMgRSBGIgorICAgICAgICByZXR1cm4gKGQgZm9yIGQsIHMgaW4gaXppcChkYXRhLCBzZWxlY3RvcnMpIGlmIHMpCiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpkYXRhOwotCVB5T2JqZWN0ICpzZWxlY3RvcnM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpkYXRhOworICAgIFB5T2JqZWN0ICpzZWxlY3RvcnM7CiB9IGNvbXByZXNzb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGNvbXByZXNzX3R5cGU7CkBAIC0yNzc5LDg2ICsyNzc5LDg2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY29tcHJlc3NfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpzZXExLCAqc2VxMjsKLQlQeU9iamVjdCAqZGF0YT1OVUxMLCAqc2VsZWN0b3JzPU5VTEw7Ci0JY29tcHJlc3NvYmplY3QgKmx6OwotCXN0YXRpYyBjaGFyICprd2FyZ3NbXSA9IHsiZGF0YSIsICJzZWxlY3RvcnMiLCBOVUxMfTsKLSAKLSAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9POmNvbXByZXNzIiwga3dhcmdzLCAmc2VxMSwgJnNlcTIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqc2VxMSwgKnNlcTI7CisgICAgUHlPYmplY3QgKmRhdGE9TlVMTCwgKnNlbGVjdG9ycz1OVUxMOworICAgIGNvbXByZXNzb2JqZWN0ICpsejsKKyAgICBzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7ImRhdGEiLCAic2VsZWN0b3JzIiwgTlVMTH07CiAKLQlkYXRhID0gUHlPYmplY3RfR2V0SXRlcihzZXExKTsKLQlpZiAoZGF0YSA9PSBOVUxMKQotCQlnb3RvIGZhaWw7Ci0Jc2VsZWN0b3JzID0gUHlPYmplY3RfR2V0SXRlcihzZXEyKTsKLQlpZiAoc2VsZWN0b3JzID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT086Y29tcHJlc3MiLCBrd2FyZ3MsICZzZXExLCAmc2VxMikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogY3JlYXRlIGNvbXByZXNzb2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKGNvbXByZXNzb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQlsei0+ZGF0YSA9IGRhdGE7Ci0JbHotPnNlbGVjdG9ycyA9IHNlbGVjdG9yczsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgZGF0YSA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxMSk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIHNlbGVjdG9ycyA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxMik7CisgICAgaWYgKHNlbGVjdG9ycyA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiBjcmVhdGUgY29tcHJlc3NvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAoY29tcHJlc3NvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobHogPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGx6LT5kYXRhID0gZGF0YTsKKyAgICBsei0+c2VsZWN0b3JzID0gc2VsZWN0b3JzOworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIAogZmFpbDoKLQlQeV9YREVDUkVGKGRhdGEpOwotCVB5X1hERUNSRUYoc2VsZWN0b3JzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGRhdGEpOworICAgIFB5X1hERUNSRUYoc2VsZWN0b3JzKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQKIGNvbXByZXNzX2RlYWxsb2MoY29tcHJlc3NvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPmRhdGEpOwotCVB5X1hERUNSRUYobHotPnNlbGVjdG9ycyk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPmRhdGEpOworICAgIFB5X1hERUNSRUYobHotPnNlbGVjdG9ycyk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBjb21wcmVzc190cmF2ZXJzZShjb21wcmVzc29iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGx6LT5kYXRhKTsKLQlQeV9WSVNJVChsei0+c2VsZWN0b3JzKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChsei0+ZGF0YSk7CisgICAgUHlfVklTSVQobHotPnNlbGVjdG9ycyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wcmVzc19uZXh0KGNvbXByZXNzb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdCAqZGF0YSA9IGx6LT5kYXRhLCAqc2VsZWN0b3JzID0gbHotPnNlbGVjdG9yczsKLQlQeU9iamVjdCAqZGF0dW0sICpzZWxlY3RvcjsKLQlQeU9iamVjdCAqKCpkYXRhbmV4dCkoUHlPYmplY3QgKikgPSAqUHlfVFlQRShkYXRhKS0+dHBfaXRlcm5leHQ7Ci0JUHlPYmplY3QgKigqc2VsZWN0b3JuZXh0KShQeU9iamVjdCAqKSA9ICpQeV9UWVBFKHNlbGVjdG9ycyktPnRwX2l0ZXJuZXh0OwotCWludCBvazsKKyAgICBQeU9iamVjdCAqZGF0YSA9IGx6LT5kYXRhLCAqc2VsZWN0b3JzID0gbHotPnNlbGVjdG9yczsKKyAgICBQeU9iamVjdCAqZGF0dW0sICpzZWxlY3RvcjsKKyAgICBQeU9iamVjdCAqKCpkYXRhbmV4dCkoUHlPYmplY3QgKikgPSAqUHlfVFlQRShkYXRhKS0+dHBfaXRlcm5leHQ7CisgICAgUHlPYmplY3QgKigqc2VsZWN0b3JuZXh0KShQeU9iamVjdCAqKSA9ICpQeV9UWVBFKHNlbGVjdG9ycyktPnRwX2l0ZXJuZXh0OworICAgIGludCBvazsKIAotCXdoaWxlICgxKSB7Ci0JCS8qIFN0ZXBzOiAgZ2V0IGRhdHVtLCBnZXQgc2VsZWN0b3IsIGV2YWx1YXRlIHNlbGVjdG9yLgotCQkgICBPcmRlciBpcyBpbXBvcnRhbnQgKHRvIG1hdGNoIHRoZSBwdXJlIHB5dGhvbiB2ZXJzaW9uCi0JCSAgIGluIHRlcm1zIG9mIHdoaWNoIGlucHV0IGdldHMgYSBjaGFuY2UgdG8gcmFpc2UgYW4KLQkJICAgZXhjZXB0aW9uIGZpcnN0KS4KLQkJKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgICAvKiBTdGVwczogIGdldCBkYXR1bSwgZ2V0IHNlbGVjdG9yLCBldmFsdWF0ZSBzZWxlY3Rvci4KKyAgICAgICAgICAgT3JkZXIgaXMgaW1wb3J0YW50ICh0byBtYXRjaCB0aGUgcHVyZSBweXRob24gdmVyc2lvbgorICAgICAgICAgICBpbiB0ZXJtcyBvZiB3aGljaCBpbnB1dCBnZXRzIGEgY2hhbmNlIHRvIHJhaXNlIGFuCisgICAgICAgICAgIGV4Y2VwdGlvbiBmaXJzdCkuCisgICAgICAgICovCiAKLQkJZGF0dW0gPSBkYXRhbmV4dChkYXRhKTsKLQkJaWYgKGRhdHVtID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgZGF0dW0gPSBkYXRhbmV4dChkYXRhKTsKKyAgICAgICAgaWYgKGRhdHVtID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlzZWxlY3RvciA9IHNlbGVjdG9ybmV4dChzZWxlY3RvcnMpOwotCQlpZiAoc2VsZWN0b3IgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGRhdHVtKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3JuZXh0KHNlbGVjdG9ycyk7CisgICAgICAgIGlmIChzZWxlY3RvciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGF0dW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShzZWxlY3Rvcik7Ci0JCVB5X0RFQ1JFRihzZWxlY3Rvcik7Ci0JCWlmIChvayA9PSAxKQotCQkJcmV0dXJuIGRhdHVtOwotCQlQeV9ERUNSRUYoZGF0dW0pOwotCQlpZiAob2sgPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKHNlbGVjdG9yKTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGVjdG9yKTsKKyAgICAgICAgaWYgKG9rID09IDEpCisgICAgICAgICAgICByZXR1cm4gZGF0dW07CisgICAgICAgIFB5X0RFQ1JFRihkYXR1bSk7CisgICAgICAgIGlmIChvayA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogUHlEb2NfU1RSVkFSKGNvbXByZXNzX2RvYywKQEAgLTI4NjksNTYgKzI4NjksNTYgQEAKIHNlbGVjdG9ycyB0byBjaG9vc2UgdGhlIGRhdGEgZWxlbWVudHMuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY29tcHJlc3NfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLmNvbXByZXNzIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoY29tcHJlc3NvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY29tcHJlc3NfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCQkvKiB0cF9mbGFncyAqLwotCWNvbXByZXNzX2RvYywJCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY29tcHJlc3NfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWNvbXByZXNzX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCQkJCS8qIHRwX2FsbG9jICovCi0JY29tcHJlc3NfbmV3LAkJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5jb21wcmVzcyIsICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihjb21wcmVzc29iamVjdCksICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWNvbXByZXNzX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgY29tcHJlc3NfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpY29tcHJlc3NfdHJhdmVyc2UsICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpY29tcHJlc3NfbmV4dCwgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvbXByZXNzX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBpZmlsdGVyIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqaXQ7CiB9IGlmaWx0ZXJvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaWZpbHRlcl90eXBlOwpAQCAtMjkyNiw4MiArMjkyNiw4MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGlmaWx0ZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqc2VxOwotCVB5T2JqZWN0ICppdDsKLQlpZmlsdGVyb2JqZWN0ICpsejsKKyAgICBQeU9iamVjdCAqZnVuYywgKnNlcTsKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgaWZpbHRlcm9iamVjdCAqbHo7CiAKLQlpZiAodHlwZSA9PSAmaWZpbHRlcl90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiaWZpbHRlcigpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZpZmlsdGVyX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJpZmlsdGVyKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpZmlsdGVyIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpZmlsdGVyIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEdldCBpdGVyYXRvci4gKi8KLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogR2V0IGl0ZXJhdG9yLiAqLworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGNyZWF0ZSBpZmlsdGVyb2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKGlmaWx0ZXJvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCWx6LT5mdW5jID0gZnVuYzsKLQlsei0+aXQgPSBpdDsKKyAgICAvKiBjcmVhdGUgaWZpbHRlcm9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBseiA9IChpZmlsdGVyb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICBsei0+ZnVuYyA9IGZ1bmM7CisgICAgbHotPml0ID0gaXQ7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogaWZpbHRlcl9kZWFsbG9jKGlmaWx0ZXJvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPmZ1bmMpOwotCVB5X1hERUNSRUYobHotPml0KTsKLQlQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7CisgICAgUHlfWERFQ1JFRihsei0+ZnVuYyk7CisgICAgUHlfWERFQ1JFRihsei0+aXQpOworICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogaWZpbHRlcl90cmF2ZXJzZShpZmlsdGVyb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0KTsKLQlQeV9WSVNJVChsei0+ZnVuYyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0KTsKKyAgICBQeV9WSVNJVChsei0+ZnVuYyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpZmlsdGVyX25leHQoaWZpbHRlcm9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKml0ZW07Ci0JUHlPYmplY3QgKml0ID0gbHotPml0OwotCWxvbmcgb2s7Ci0JUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICppdCA9IGx6LT5pdDsKKyAgICBsb25nIG9rOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKIAotCWl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKLQlmb3IgKDs7KSB7Ci0JCWl0ZW0gPSBpdGVybmV4dChpdCk7Ci0JCWlmIChpdGVtID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgZm9yICg7OykgeworICAgICAgICBpdGVtID0gaXRlcm5leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKGx6LT5mdW5jID09IFB5X05vbmUgfHwgbHotPmZ1bmMgPT0gKFB5T2JqZWN0ICopJlB5Qm9vbF9UeXBlKSB7Ci0JCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKLQkJfSBlbHNlIHsKLQkJCVB5T2JqZWN0ICpnb29kOwotCQkJZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsCi0JCQkJCQkJICAgIGl0ZW0sIE5VTEwpOwotCQkJaWYgKGdvb2QgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCW9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwotCQkJUHlfREVDUkVGKGdvb2QpOwotCQl9Ci0JCWlmIChvaykKLQkJCXJldHVybiBpdGVtOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQorICAgICAgICBpZiAobHotPmZ1bmMgPT0gUHlfTm9uZSB8fCBsei0+ZnVuYyA9PSAoUHlPYmplY3QgKikmUHlCb29sX1R5cGUpIHsKKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKmdvb2Q7CisgICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sIE5VTEwpOworICAgICAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOworICAgICAgICAgICAgUHlfREVDUkVGKGdvb2QpOworICAgICAgICB9CisgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIoaWZpbHRlcl9kb2MsCkBAIC0zMDExLDU2ICszMDExLDU2IEBACiBJZiBmdW5jdGlvbiBpcyBOb25lLCByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIHRydWUuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaWZpbHRlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuaWZpbHRlciIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGlmaWx0ZXJvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpaWZpbHRlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JaWZpbHRlcl9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpZmlsdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpaWZpbHRlcl9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JaWZpbHRlcl9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuaWZpbHRlciIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoaWZpbHRlcm9iamVjdCksICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpZmlsdGVyX2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGlmaWx0ZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpaWZpbHRlcl90cmF2ZXJzZSwgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpaWZpbHRlcl9uZXh0LCAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpZmlsdGVyX25ldywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIGlmaWx0ZXJmYWxzZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKml0OwogfSBpZmlsdGVyZmFsc2VvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaWZpbHRlcmZhbHNlX3R5cGU7CkBAIC0zMDY4LDgzICszMDY4LDgzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaWZpbHRlcmZhbHNlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqZnVuYywgKnNlcTsKLQlQeU9iamVjdCAqaXQ7Ci0JaWZpbHRlcmZhbHNlb2JqZWN0ICpsejsKKyAgICBQeU9iamVjdCAqZnVuYywgKnNlcTsKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgaWZpbHRlcmZhbHNlb2JqZWN0ICpsejsKIAotCWlmICh0eXBlID09ICZpZmlsdGVyZmFsc2VfdHlwZSAmJgotCSAgICAhX1B5QXJnX05vS2V5d29yZHMoImlmaWx0ZXJmYWxzZSgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZpZmlsdGVyZmFsc2VfdHlwZSAmJgorICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoImlmaWx0ZXJmYWxzZSgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaWZpbHRlcmZhbHNlIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpZmlsdGVyZmFsc2UiLCAyLCAyLCAmZnVuYywgJnNlcSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogR2V0IGl0ZXJhdG9yLiAqLwotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogY3JlYXRlIGlmaWx0ZXJmYWxzZW9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChpZmlsdGVyZmFsc2VvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCWx6LT5mdW5jID0gZnVuYzsKLQlsei0+aXQgPSBpdDsKKyAgICAvKiBjcmVhdGUgaWZpbHRlcmZhbHNlb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKGlmaWx0ZXJmYWxzZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgbHotPmZ1bmMgPSBmdW5jOworICAgIGx6LT5pdCA9IGl0OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIGlmaWx0ZXJmYWxzZV9kZWFsbG9jKGlmaWx0ZXJmYWxzZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+ZnVuYyk7Ci0JUHlfWERFQ1JFRihsei0+aXQpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5mdW5jKTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdCk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBpZmlsdGVyZmFsc2VfdHJhdmVyc2UoaWZpbHRlcmZhbHNlb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0KTsKLQlQeV9WSVNJVChsei0+ZnVuYyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0KTsKKyAgICBQeV9WSVNJVChsei0+ZnVuYyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpZmlsdGVyZmFsc2VfbmV4dChpZmlsdGVyZmFsc2VvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICppdGVtOwotCVB5T2JqZWN0ICppdCA9IGx6LT5pdDsKLQlsb25nIG9rOwotCVB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXQgPSBsei0+aXQ7CisgICAgbG9uZyBvazsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CiAKLQlpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7Ci0JZm9yICg7OykgewotCQlpdGVtID0gaXRlcm5leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OworICAgIGZvciAoOzspIHsKKyAgICAgICAgaXRlbSA9IGl0ZXJuZXh0KGl0KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCWlmIChsei0+ZnVuYyA9PSBQeV9Ob25lIHx8IGx6LT5mdW5jID09IChQeU9iamVjdCAqKSZQeUJvb2xfVHlwZSkgewotCQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7Ci0JCX0gZWxzZSB7Ci0JCQlQeU9iamVjdCAqZ29vZDsKLQkJCWdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLAotCQkJCQkJCSAgICBpdGVtLCBOVUxMKTsKLQkJCWlmIChnb29kID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKLQkJCVB5X0RFQ1JFRihnb29kKTsKLQkJfQotCQlpZiAoIW9rKQotCQkJcmV0dXJuIGl0ZW07Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9CisgICAgICAgIGlmIChsei0+ZnVuYyA9PSBQeV9Ob25lIHx8IGx6LT5mdW5jID09IChQeU9iamVjdCAqKSZQeUJvb2xfVHlwZSkgeworICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqZ29vZDsKKyAgICAgICAgICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwgTlVMTCk7CisgICAgICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZ29vZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIoaWZpbHRlcmZhbHNlX2RvYywKQEAgLTMxNTQsNzQgKzMxNTQsNzQgQEAKIElmIGZ1bmN0aW9uIGlzIE5vbmUsIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgZmFsc2UuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaWZpbHRlcmZhbHNlX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5pZmlsdGVyZmFsc2UiLAkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGlmaWx0ZXJmYWxzZW9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWlmaWx0ZXJmYWxzZV9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JaWZpbHRlcmZhbHNlX2RvYywJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpaWZpbHRlcmZhbHNlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpaWZpbHRlcmZhbHNlX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlpZmlsdGVyZmFsc2VfbmV3LAkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuaWZpbHRlcmZhbHNlIiwgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoaWZpbHRlcmZhbHNlb2JqZWN0KSwgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpZmlsdGVyZmFsc2VfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgaWZpbHRlcmZhbHNlX2RvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylpZmlsdGVyZmFsc2VfdHJhdmVyc2UsICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWlmaWx0ZXJmYWxzZV9uZXh0LCAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpZmlsdGVyZmFsc2VfbmV3LCAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIGNvdW50IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdCBjbnQ7Ci0JUHlPYmplY3QgKmxvbmdfY250OwotCVB5T2JqZWN0ICpsb25nX3N0ZXA7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgY250OworICAgIFB5T2JqZWN0ICpsb25nX2NudDsKKyAgICBQeU9iamVjdCAqbG9uZ19zdGVwOwogfSBjb3VudG9iamVjdDsKIAogLyogQ291bnRpbmcgbG9naWMgYW5kIGludmFyaWFudHM6CiAKIGZhc3RfbW9kZTogIHdoZW4gY250IGFuIGludGVnZXIgPCBQWV9TU0laRV9UX01BWCBhbmQgbm8gc3RlcCBpcyBzcGVjaWZpZWQuCiAKLQlhc3NlcnQoY250ICE9IFBZX1NTSVpFX1RfTUFYICYmIGxvbmdfY250ID09IE5VTEwgJiYgbG9uZ19zdGVwPT1QeUludCgxKSk7Ci0JQWR2YW5jZXMgd2l0aDogIGNudCArPSAxCi0JV2hlbiBjb3VudCBoaXRzIFlfU1NJWkVfVF9NQVgsIHN3aXRjaCB0byBzbG93X21vZGUuCisgICAgYXNzZXJ0KGNudCAhPSBQWV9TU0laRV9UX01BWCAmJiBsb25nX2NudCA9PSBOVUxMICYmIGxvbmdfc3RlcD09UHlJbnQoMSkpOworICAgIEFkdmFuY2VzIHdpdGg6ICBjbnQgKz0gMQorICAgIFdoZW4gY291bnQgaGl0cyBZX1NTSVpFX1RfTUFYLCBzd2l0Y2ggdG8gc2xvd19tb2RlLgogCiBzbG93X21vZGU6ICB3aGVuIGNudCA9PSBQWV9TU0laRV9UX01BWCwgc3RlcCBpcyBub3QgaW50KDEpLCBvciBjbnQgaXMgYSBmbG9hdC4KIAotCWFzc2VydChjbnQgPT0gUFlfU1NJWkVfVF9NQVggJiYgbG9uZ19jbnQgIT0gTlVMTCAmJiBsb25nX3N0ZXAgIT0gTlVMTCk7Ci0JQWxsIGNvdW50aW5nIGlzIGRvbmUgd2l0aCBweXRob24gb2JqZWN0cyAobm8gb3ZlcmZsb3dzIG9yIHVuZGVyZmxvd3MpLgotCUFkdmFuY2VzIHdpdGg6ICBsb25nX2NudCArPSBsb25nX3N0ZXAKLQlTdGVwIG1heSBiZSB6ZXJvIC0tIGVmZmVjdGl2ZWx5IGEgc2xvdyB2ZXJzaW9uIG9mIHJlcGVhdChjbnQpLgotCUVpdGhlciBsb25nX2NudCBvciBsb25nX3N0ZXAgbWF5IGJlIGEgZmxvYXQsIEZyYWN0aW9uLCBvciBEZWNpbWFsLgorICAgIGFzc2VydChjbnQgPT0gUFlfU1NJWkVfVF9NQVggJiYgbG9uZ19jbnQgIT0gTlVMTCAmJiBsb25nX3N0ZXAgIT0gTlVMTCk7CisgICAgQWxsIGNvdW50aW5nIGlzIGRvbmUgd2l0aCBweXRob24gb2JqZWN0cyAobm8gb3ZlcmZsb3dzIG9yIHVuZGVyZmxvd3MpLgorICAgIEFkdmFuY2VzIHdpdGg6ICBsb25nX2NudCArPSBsb25nX3N0ZXAKKyAgICBTdGVwIG1heSBiZSB6ZXJvIC0tIGVmZmVjdGl2ZWx5IGEgc2xvdyB2ZXJzaW9uIG9mIHJlcGVhdChjbnQpLgorICAgIEVpdGhlciBsb25nX2NudCBvciBsb25nX3N0ZXAgbWF5IGJlIGEgZmxvYXQsIEZyYWN0aW9uLCBvciBEZWNpbWFsLgogKi8KIAogc3RhdGljIFB5VHlwZU9iamVjdCBjb3VudF90eXBlOwpAQCAtMzIyOSwyMjEgKzMyMjksMjIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY291bnRfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWNvdW50b2JqZWN0ICpsejsKLQlpbnQgc2xvd19tb2RlID0gMDsKLQlQeV9zc2l6ZV90IGNudCA9IDA7Ci0JUHlPYmplY3QgKmxvbmdfY250ID0gTlVMTDsKLQlQeU9iamVjdCAqbG9uZ19zdGVwID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InN0YXJ0IiwgInN0ZXAiLCAwfTsKKyAgICBjb3VudG9iamVjdCAqbHo7CisgICAgaW50IHNsb3dfbW9kZSA9IDA7CisgICAgUHlfc3NpemVfdCBjbnQgPSAwOworICAgIFB5T2JqZWN0ICpsb25nX2NudCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmxvbmdfc3RlcCA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzdGFydCIsICJzdGVwIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9POmNvdW50IiwKLQkJCWt3bGlzdCwgJmxvbmdfY250LCAmbG9uZ19zdGVwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPTzpjb3VudCIsCisgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmxvbmdfY250LCAmbG9uZ19zdGVwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKGxvbmdfY250ICE9IE5VTEwgJiYgIVB5TnVtYmVyX0NoZWNrKGxvbmdfY250KSkgfHwKLSAgICAgICAgICAgIChsb25nX3N0ZXAgIT0gTlVMTCAmJiAhUHlOdW1iZXJfQ2hlY2sobG9uZ19zdGVwKSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhIG51bWJlciBpcyByZXF1aXJlZCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgobG9uZ19jbnQgIT0gTlVMTCAmJiAhUHlOdW1iZXJfQ2hlY2sobG9uZ19jbnQpKSB8fAorICAgICAgICAobG9uZ19zdGVwICE9IE5VTEwgJiYgIVB5TnVtYmVyX0NoZWNrKGxvbmdfc3RlcCkpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhIG51bWJlciBpcyByZXF1aXJlZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAobG9uZ19jbnQgIT0gTlVMTCkgewotCQljbnQgPSBQeUludF9Bc1NzaXplX3QobG9uZ19jbnQpOwotCQlpZiAoKGNudCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB8fCAhUHlJbnRfQ2hlY2sobG9uZ19jbnQpKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJc2xvd19tb2RlID0gMTsKLQkJfQotCQlQeV9JTkNSRUYobG9uZ19jbnQpOwotCX0gZWxzZSB7Ci0JCWNudCA9IDA7Ci0JCWxvbmdfY250ID0gUHlJbnRfRnJvbUxvbmcoMCk7Ci0JfQorICAgIGlmIChsb25nX2NudCAhPSBOVUxMKSB7CisgICAgICAgIGNudCA9IFB5SW50X0FzU3NpemVfdChsb25nX2NudCk7CisgICAgICAgIGlmICgoY250ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHx8ICFQeUludF9DaGVjayhsb25nX2NudCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBzbG93X21vZGUgPSAxOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihsb25nX2NudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY250ID0gMDsKKyAgICAgICAgbG9uZ19jbnQgPSBQeUludF9Gcm9tTG9uZygwKTsKKyAgICB9CiAKLQkvKiBJZiBub3Qgc3BlY2lmaWVkLCBzdGVwIGRlZmF1bHRzIHRvIDEgKi8KLQlpZiAobG9uZ19zdGVwID09IE5VTEwpIHsKLQkJbG9uZ19zdGVwID0gUHlJbnRfRnJvbUxvbmcoMSk7Ci0JCWlmIChsb25nX3N0ZXAgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGxvbmdfY250KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfSBlbHNlCi0JCVB5X0lOQ1JFRihsb25nX3N0ZXApOworICAgIC8qIElmIG5vdCBzcGVjaWZpZWQsIHN0ZXAgZGVmYXVsdHMgdG8gMSAqLworICAgIGlmIChsb25nX3N0ZXAgPT0gTlVMTCkgeworICAgICAgICBsb25nX3N0ZXAgPSBQeUludF9Gcm9tTG9uZygxKTsKKyAgICAgICAgaWYgKGxvbmdfc3RlcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobG9uZ19jbnQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKGxvbmdfc3RlcCk7CiAKLQlhc3NlcnQobG9uZ19jbnQgIT0gTlVMTCAmJiBsb25nX3N0ZXAgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGxvbmdfY250ICE9IE5VTEwgJiYgbG9uZ19zdGVwICE9IE5VTEwpOwogCi0JLyogRmFzdCBtb2RlIG9ubHkgd29ya3Mgd2hlbiB0aGUgc3RlcCBpcyAxICovCi0JaWYgKCFQeUludF9DaGVjayhsb25nX3N0ZXApIHx8Ci0JCVB5SW50X0FTX0xPTkcobG9uZ19zdGVwKSAhPSAxKSB7Ci0JCQlzbG93X21vZGUgPSAxOwotCX0KKyAgICAvKiBGYXN0IG1vZGUgb25seSB3b3JrcyB3aGVuIHRoZSBzdGVwIGlzIDEgKi8KKyAgICBpZiAoIVB5SW50X0NoZWNrKGxvbmdfc3RlcCkgfHwKKyAgICAgICAgUHlJbnRfQVNfTE9ORyhsb25nX3N0ZXApICE9IDEpIHsKKyAgICAgICAgICAgIHNsb3dfbW9kZSA9IDE7CisgICAgfQogCi0JaWYgKHNsb3dfbW9kZSkKLQkJY250ID0gUFlfU1NJWkVfVF9NQVg7Ci0JZWxzZQotCQlQeV9DTEVBUihsb25nX2NudCk7CisgICAgaWYgKHNsb3dfbW9kZSkKKyAgICAgICAgY250ID0gUFlfU1NJWkVfVF9NQVg7CisgICAgZWxzZQorICAgICAgICBQeV9DTEVBUihsb25nX2NudCk7CiAKLQlhc3NlcnQoKGNudCAhPSBQWV9TU0laRV9UX01BWCAmJiBsb25nX2NudCA9PSBOVUxMICYmICFzbG93X21vZGUpIHx8Ci0gICAgICAgICAgICAgICAoY250ID09IFBZX1NTSVpFX1RfTUFYICYmIGxvbmdfY250ICE9IE5VTEwgJiYgc2xvd19tb2RlKSk7Ci0JYXNzZXJ0KHNsb3dfbW9kZSB8fCAKLSAgICAgICAgICAgICAgIChQeUludF9DaGVjayhsb25nX3N0ZXApICYmIFB5SW50X0FTX0xPTkcobG9uZ19zdGVwKSA9PSAxKSk7CisgICAgYXNzZXJ0KChjbnQgIT0gUFlfU1NJWkVfVF9NQVggJiYgbG9uZ19jbnQgPT0gTlVMTCAmJiAhc2xvd19tb2RlKSB8fAorICAgICAgICAgICAoY250ID09IFBZX1NTSVpFX1RfTUFYICYmIGxvbmdfY250ICE9IE5VTEwgJiYgc2xvd19tb2RlKSk7CisgICAgYXNzZXJ0KHNsb3dfbW9kZSB8fAorICAgICAgICAgICAoUHlJbnRfQ2hlY2sobG9uZ19zdGVwKSAmJiBQeUludF9BU19MT05HKGxvbmdfc3RlcCkgPT0gMSkpOwogCi0JLyogY3JlYXRlIGNvdW50b2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKGNvdW50b2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRihsb25nX2NudCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlsei0+Y250ID0gY250OwotCWx6LT5sb25nX2NudCA9IGxvbmdfY250OwotCWx6LT5sb25nX3N0ZXAgPSBsb25nX3N0ZXA7CisgICAgLyogY3JlYXRlIGNvdW50b2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKGNvdW50b2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRihsb25nX2NudCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsei0+Y250ID0gY250OworICAgIGx6LT5sb25nX2NudCA9IGxvbmdfY250OworICAgIGx6LT5sb25nX3N0ZXAgPSBsb25nX3N0ZXA7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogY291bnRfZGVhbGxvYyhjb3VudG9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+bG9uZ19jbnQpOwotCVB5X1hERUNSRUYobHotPmxvbmdfc3RlcCk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPmxvbmdfY250KTsKKyAgICBQeV9YREVDUkVGKGx6LT5sb25nX3N0ZXApOworICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogY291bnRfdHJhdmVyc2UoY291bnRvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChsei0+bG9uZ19jbnQpOwotCVB5X1ZJU0lUKGx6LT5sb25nX3N0ZXApOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5sb25nX2NudCk7CisgICAgUHlfVklTSVQobHotPmxvbmdfc3RlcCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb3VudF9uZXh0bG9uZyhjb3VudG9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKmxvbmdfY250OwotCVB5T2JqZWN0ICpzdGVwcGVkX3VwOworICAgIFB5T2JqZWN0ICpsb25nX2NudDsKKyAgICBQeU9iamVjdCAqc3RlcHBlZF91cDsKIAotCWxvbmdfY250ID0gbHotPmxvbmdfY250OwotCWlmIChsb25nX2NudCA9PSBOVUxMKSB7Ci0JCS8qIFN3aXRjaCB0byBzbG93X21vZGUgKi8KLQkJbG9uZ19jbnQgPSBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCk7Ci0JCWlmIChsb25nX2NudCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWFzc2VydChsei0+Y250ID09IFBZX1NTSVpFX1RfTUFYICYmIGxvbmdfY250ICE9IE5VTEwpOworICAgIGxvbmdfY250ID0gbHotPmxvbmdfY250OworICAgIGlmIChsb25nX2NudCA9PSBOVUxMKSB7CisgICAgICAgIC8qIFN3aXRjaCB0byBzbG93X21vZGUgKi8KKyAgICAgICAgbG9uZ19jbnQgPSBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCk7CisgICAgICAgIGlmIChsb25nX2NudCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzc2VydChsei0+Y250ID09IFBZX1NTSVpFX1RfTUFYICYmIGxvbmdfY250ICE9IE5VTEwpOwogCi0Jc3RlcHBlZF91cCA9IFB5TnVtYmVyX0FkZChsb25nX2NudCwgbHotPmxvbmdfc3RlcCk7Ci0JaWYgKHN0ZXBwZWRfdXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbHotPmxvbmdfY250ID0gc3RlcHBlZF91cDsKLQlyZXR1cm4gbG9uZ19jbnQ7CisgICAgc3RlcHBlZF91cCA9IFB5TnVtYmVyX0FkZChsb25nX2NudCwgbHotPmxvbmdfc3RlcCk7CisgICAgaWYgKHN0ZXBwZWRfdXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbHotPmxvbmdfY250ID0gc3RlcHBlZF91cDsKKyAgICByZXR1cm4gbG9uZ19jbnQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb3VudF9uZXh0KGNvdW50b2JqZWN0ICpseikKIHsKLQlpZiAobHotPmNudCA9PSBQWV9TU0laRV9UX01BWCkKLQkJcmV0dXJuIGNvdW50X25leHRsb25nKGx6KTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QobHotPmNudCsrKTsKKyAgICBpZiAobHotPmNudCA9PSBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgcmV0dXJuIGNvdW50X25leHRsb25nKGx6KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QobHotPmNudCsrKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvdW50X3JlcHIoY291bnRvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICpjbnRfcmVwciwgKnN0ZXBfcmVwciA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNudF9yZXByLCAqc3RlcF9yZXByID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAogICAgIGlmIChsei0+Y250ICE9IFBZX1NTSVpFX1RfTUFYKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiY291bnQoJXpkKSIsIGx6LT5jbnQpOworICAgICAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCJjb3VudCglemQpIiwgbHotPmNudCk7CiAKLQljbnRfcmVwciA9IFB5T2JqZWN0X1JlcHIobHotPmxvbmdfY250KTsKLQlpZiAoY250X3JlcHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY250X3JlcHIgPSBQeU9iamVjdF9SZXByKGx6LT5sb25nX2NudCk7CisgICAgaWYgKGNudF9yZXByID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5SW50X0NoZWNrKGx6LT5sb25nX3N0ZXApICYmIFB5SW50X0FTX0xPTkcobHotPmxvbmdfc3RlcCkgPT0gMSkgewotCQkJLyogRG9uJ3QgZGlzcGxheSBzdGVwIHdoZW4gaXQgaXMgYW4gaW50ZWdlciBlcXVhbCB0byAxICovCi0JCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJjb3VudCglcykiLAotCQkJCQkJCQkJCSBQeVN0cmluZ19BU19TVFJJTkcoY250X3JlcHIpKTsKLQl9IGVsc2UgewotCQlzdGVwX3JlcHIgPSBQeU9iamVjdF9SZXByKGx6LT5sb25nX3N0ZXApOwotCQlpZiAoc3RlcF9yZXByICE9IE5VTEwpCi0JCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJjb3VudCglcywgJXMpIiwKLQkJCQkJCQkJCQlQeVN0cmluZ19BU19TVFJJTkcoY250X3JlcHIpLAotCQkJCQkJCQkJCVB5U3RyaW5nX0FTX1NUUklORyhzdGVwX3JlcHIpKTsKLQl9Ci0JUHlfREVDUkVGKGNudF9yZXByKTsKLQlQeV9YREVDUkVGKHN0ZXBfcmVwcik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoUHlJbnRfQ2hlY2sobHotPmxvbmdfc3RlcCkgJiYgUHlJbnRfQVNfTE9ORyhsei0+bG9uZ19zdGVwKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc3BsYXkgc3RlcCB3aGVuIGl0IGlzIGFuIGludGVnZXIgZXF1YWwgdG8gMSAqLworICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiY291bnQoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhjbnRfcmVwcikpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZXBfcmVwciA9IFB5T2JqZWN0X1JlcHIobHotPmxvbmdfc3RlcCk7CisgICAgICAgIGlmIChzdGVwX3JlcHIgIT0gTlVMTCkKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoImNvdW50KCVzLCAlcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoY250X3JlcHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RlcF9yZXByKSk7CisgICAgfQorICAgIFB5X0RFQ1JFRihjbnRfcmVwcik7CisgICAgUHlfWERFQ1JFRihzdGVwX3JlcHIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb3VudF9yZWR1Y2UoY291bnRvYmplY3QgKmx6KQogewotCWlmIChsei0+Y250ID09IFBZX1NTSVpFX1RfTUFYKQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTykiLCBQeV9UWVBFKGx6KSwgbHotPmxvbmdfY250LCBsei0+bG9uZ19zdGVwKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhuKSIsIFB5X1RZUEUobHopLCBsei0+Y250KTsKKyAgICBpZiAobHotPmNudCA9PSBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pIiwgUHlfVFlQRShseiksIGx6LT5sb25nX2NudCwgbHotPmxvbmdfc3RlcCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8obikiLCBQeV9UWVBFKGx6KSwgbHotPmNudCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb3VudF9yZWR1Y2VfZG9jLCAiUmV0dXJuIHN0YXRlIGluZm9ybWF0aW9uIGZvciBwaWNrbGluZy4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGNvdW50X21ldGhvZHNbXSA9IHsKLQl7Il9fcmVkdWNlX18iLAkoUHlDRnVuY3Rpb24pY291bnRfcmVkdWNlLAlNRVRIX05PQVJHUywKLQkgY291bnRfcmVkdWNlX2RvY30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiX19yZWR1Y2VfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWNvdW50X3JlZHVjZSwgICAgICBNRVRIX05PQVJHUywKKyAgICAgY291bnRfcmVkdWNlX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoY291bnRfZG9jLAotCQkJICJjb3VudChzdGFydD0wLCBzdGVwPTFdKSAtLT4gY291bnQgb2JqZWN0XG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50KHN0YXJ0PTAsIHN0ZXA9MV0pIC0tPiBjb3VudCBvYmplY3RcblwKIFxuXAogUmV0dXJuIGEgY291bnQgb2JqZWN0IHdob3NlIC5uZXh0KCkgbWV0aG9kIHJldHVybnMgY29uc2VjdXRpdmUgdmFsdWVzLlxuXAogRXF1aXZhbGVudCB0bzpcblxuXAogICAgIGRlZiBjb3VudChmaXJzdHZhbD0wLCBzdGVwPTEpOlxuXAotICAgICAgICB4ID0gZmlyc3R2YWxcblwKLSAgICAgICAgd2hpbGUgMTpcblwKLSAgICAgICAgICAgIHlpZWxkIHhcblwKLSAgICAgICAgICAgIHggKz0gc3RlcFxuIik7CisgICAgeCA9IGZpcnN0dmFsXG5cCisgICAgd2hpbGUgMTpcblwKKyAgICAgICAgeWllbGQgeFxuXAorICAgICAgICB4ICs9IHN0ZXBcbiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGNvdW50X3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5jb3VudCIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGNvdW50b2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWNvdW50X2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyljb3VudF9yZXByLAkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkJLyogdHBfZmxhZ3MgKi8KLQljb3VudF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYyljb3VudF90cmF2ZXJzZSwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWNvdW50X25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JY291bnRfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQljb3VudF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuY291bnQiLCAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoY291bnRvYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvciljb3VudF9kZWFsbG9jLCAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpY291bnRfcmVwciwgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgY291bnRfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyljb3VudF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYyljb3VudF9uZXh0LCAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBjb3VudF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgY291bnRfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC0zNDUyLDEwICszNDUyLDEwIEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdAl0dXBsZXNpemU7Ci0JUHlPYmplY3QgKml0dHVwbGU7CQkvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90ICAgICAgICAgIHR1cGxlc2l6ZTsKKyAgICBQeU9iamVjdCAqaXR0dXBsZTsgICAgICAgICAgICAgICAgICAvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OwogfSBpemlwb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGl6aXBfdHlwZTsKQEAgLTM0NjMsMTE4ICszNDYzLDExOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGl6aXBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWl6aXBvYmplY3QgKmx6OwotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqaXR0dXBsZTsgIC8qIHR1cGxlIG9mIGl0ZXJhdG9ycyAqLwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCB0dXBsZXNpemUgPSBQeVNlcXVlbmNlX0xlbmd0aChhcmdzKTsKKyAgICBpemlwb2JqZWN0ICpsejsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKml0dHVwbGU7ICAvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgdHVwbGVzaXplID0gUHlTZXF1ZW5jZV9MZW5ndGgoYXJncyk7CiAKLQlpZiAodHlwZSA9PSAmaXppcF90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiaXppcCgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZpemlwX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJpemlwKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBhcmdzIG11c3QgYmUgYSB0dXBsZSAqLwotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICAvKiBhcmdzIG11c3QgYmUgYSB0dXBsZSAqLworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKIAotCS8qIG9idGFpbiBpdGVyYXRvcnMgKi8KLQlpdHR1cGxlID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKLQlpZiAoaXR0dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGk9MDsgaSA8IHR1cGxlc2l6ZTsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJUHlPYmplY3QgKml0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVtKTsKLQkJaWYgKGl0ID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgIml6aXAgYXJndW1lbnQgIyV6ZCBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIiwKLQkJCQkgICAgaSsxKTsKLQkJCVB5X0RFQ1JFRihpdHR1cGxlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5VHVwbGVfU0VUX0lURU0oaXR0dXBsZSwgaSwgaXQpOwotCX0KKyAgICAvKiBvYnRhaW4gaXRlcmF0b3JzICovCisgICAgaXR0dXBsZSA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7CisgICAgaWYgKGl0dHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpPTA7IGkgPCB0dXBsZXNpemU7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIFB5T2JqZWN0ICppdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlbSk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJpemlwIGFyZ3VtZW50ICMlemQgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIGkrMSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXR0dXBsZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGl0dHVwbGUsIGksIGl0KTsKKyAgICB9CiAKLQkvKiBjcmVhdGUgYSByZXN1bHQgaG9sZGVyICovCi0JcmVzdWx0ID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0dHVwbGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIFB5X05vbmUpOwotCX0KKyAgICAvKiBjcmVhdGUgYSByZXN1bHQgaG9sZGVyICovCisgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0dHVwbGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIFB5X05vbmUpOworICAgIH0KIAotCS8qIGNyZWF0ZSBpemlwb2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKGl6aXBvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXR0dXBsZSk7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbHotPml0dHVwbGUgPSBpdHR1cGxlOwotCWx6LT50dXBsZXNpemUgPSB0dXBsZXNpemU7Ci0JbHotPnJlc3VsdCA9IHJlc3VsdDsKKyAgICAvKiBjcmVhdGUgaXppcG9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBseiA9IChpemlwb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0dHVwbGUpOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGx6LT5pdHR1cGxlID0gaXR0dXBsZTsKKyAgICBsei0+dHVwbGVzaXplID0gdHVwbGVzaXplOworICAgIGx6LT5yZXN1bHQgPSByZXN1bHQ7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogaXppcF9kZWFsbG9jKGl6aXBvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPml0dHVwbGUpOwotCVB5X1hERUNSRUYobHotPnJlc3VsdCk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPml0dHVwbGUpOworICAgIFB5X1hERUNSRUYobHotPnJlc3VsdCk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBpemlwX3RyYXZlcnNlKGl6aXBvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChsei0+aXR0dXBsZSk7Ci0JUHlfVklTSVQobHotPnJlc3VsdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0dHVwbGUpOworICAgIFB5X1ZJU0lUKGx6LT5yZXN1bHQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaXppcF9uZXh0KGl6aXBvYmplY3QgKmx6KQogewotCVB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IGx6LT50dXBsZXNpemU7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IGx6LT5yZXN1bHQ7Ci0JUHlPYmplY3QgKml0OwotCVB5T2JqZWN0ICppdGVtOwotCVB5T2JqZWN0ICpvbGRpdGVtOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IGx6LT50dXBsZXNpemU7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGx6LT5yZXN1bHQ7CisgICAgUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICpvbGRpdGVtOwogCi0JaWYgKHR1cGxlc2l6ZSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlfUkVGQ05UKHJlc3VsdCkgPT0gMSkgewotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7Ci0JCQlpdCA9IFB5VHVwbGVfR0VUX0lURU0obHotPml0dHVwbGUsIGkpOwotCQkJaXRlbSA9ICgqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KShpdCk7Ci0JCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlvbGRpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOwotCQkJUHlfREVDUkVGKG9sZGl0ZW0pOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgewotCQkJaXQgPSBQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdHR1cGxlLCBpKTsKLQkJCWl0ZW0gPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOwotCQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHR1cGxlc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlfUkVGQ05UKHJlc3VsdCkgPT0gMSkgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7CisgICAgICAgICAgICBpdCA9IFB5VHVwbGVfR0VUX0lURU0obHotPml0dHVwbGUsIGkpOworICAgICAgICAgICAgaXRlbSA9ICgqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KShpdCk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbGRpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKG9sZGl0ZW0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgeworICAgICAgICAgICAgaXQgPSBQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdHR1cGxlLCBpKTsKKyAgICAgICAgICAgIGl0ZW0gPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihpemlwX2RvYywKQEAgLTM1ODgsNTYgKzM1ODgsNTYgQEAKIGEgbGlzdC4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpemlwX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5pemlwIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoaXppcG9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilpemlwX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlpemlwX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWl6aXBfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylpemlwX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlpemlwX25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5pemlwIiwgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihpemlwb2JqZWN0KSwgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWl6aXBfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgaXppcF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylpemlwX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWl6aXBfbmV4dCwgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaXppcF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiByZXBlYXQgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqZWxlbWVudDsKLQlQeV9zc2l6ZV90IGNudDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmVsZW1lbnQ7CisgICAgUHlfc3NpemVfdCBjbnQ7CiB9IHJlcGVhdG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCByZXBlYXRfdHlwZTsKQEAgLTM2NDUsODcgKzM2NDUsODcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByZXBlYXRfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJlcGVhdG9iamVjdCAqcm87Ci0JUHlPYmplY3QgKmVsZW1lbnQ7Ci0JUHlfc3NpemVfdCBjbnQgPSAtMTsKLQlzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Im9iamVjdCIsICJ0aW1lcyIsIE5VTEx9OwotIAotIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xuOnJlcGVhdCIsIGt3YXJncywgCi0JCQkJCSAmZWxlbWVudCwgJmNudCkpCi0JCXJldHVybiBOVUxMOworICAgIHJlcGVhdG9iamVjdCAqcm87CisgICAgUHlPYmplY3QgKmVsZW1lbnQ7CisgICAgUHlfc3NpemVfdCBjbnQgPSAtMTsKKyAgICBzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Im9iamVjdCIsICJ0aW1lcyIsIE5VTEx9OwogCi0JaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAyICYmIGNudCA8IDApCi0JCWNudCA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98bjpyZXBlYXQiLCBrd2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnQsICZjbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJvID0gKHJlcGVhdG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChybyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoZWxlbWVudCk7Ci0Jcm8tPmVsZW1lbnQgPSBlbGVtZW50OwotCXJvLT5jbnQgPSBjbnQ7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXJvOworICAgIGlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMiAmJiBjbnQgPCAwKQorICAgICAgICBjbnQgPSAwOworCisgICAgcm8gPSAocmVwZWF0b2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHJvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihlbGVtZW50KTsKKyAgICByby0+ZWxlbWVudCA9IGVsZW1lbnQ7CisgICAgcm8tPmNudCA9IGNudDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcm87CiB9CiAKIHN0YXRpYyB2b2lkCiByZXBlYXRfZGVhbGxvYyhyZXBlYXRvYmplY3QgKnJvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2socm8pOwotCVB5X1hERUNSRUYocm8tPmVsZW1lbnQpOwotCVB5X1RZUEUocm8pLT50cF9mcmVlKHJvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHJvKTsKKyAgICBQeV9YREVDUkVGKHJvLT5lbGVtZW50KTsKKyAgICBQeV9UWVBFKHJvKS0+dHBfZnJlZShybyk7CiB9CiAKIHN0YXRpYyBpbnQKIHJlcGVhdF90cmF2ZXJzZShyZXBlYXRvYmplY3QgKnJvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChyby0+ZWxlbWVudCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQocm8tPmVsZW1lbnQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVwZWF0X25leHQocmVwZWF0b2JqZWN0ICpybykKIHsKLQlpZiAocm8tPmNudCA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocm8tPmNudCA+IDApCi0JCXJvLT5jbnQtLTsKLQlQeV9JTkNSRUYocm8tPmVsZW1lbnQpOwotCXJldHVybiByby0+ZWxlbWVudDsKKyAgICBpZiAocm8tPmNudCA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocm8tPmNudCA+IDApCisgICAgICAgIHJvLT5jbnQtLTsKKyAgICBQeV9JTkNSRUYocm8tPmVsZW1lbnQpOworICAgIHJldHVybiByby0+ZWxlbWVudDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlcGVhdF9yZXByKHJlcGVhdG9iamVjdCAqcm8pCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCwgKm9ianJlcHI7CisgICAgUHlPYmplY3QgKnJlc3VsdCwgKm9ianJlcHI7CiAKLQlvYmpyZXByID0gUHlPYmplY3RfUmVwcihyby0+ZWxlbWVudCk7Ci0JaWYgKG9ianJlcHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgb2JqcmVwciA9IFB5T2JqZWN0X1JlcHIocm8tPmVsZW1lbnQpOworICAgIGlmIChvYmpyZXByID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJvLT5jbnQgPT0gLTEpCi0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInJlcGVhdCglcykiLAotCQkJUHlTdHJpbmdfQVNfU1RSSU5HKG9ianJlcHIpKTsKLQllbHNlCi0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInJlcGVhdCglcywgJXpkKSIsCi0JCQlQeVN0cmluZ19BU19TVFJJTkcob2JqcmVwciksIHJvLT5jbnQpOwotCVB5X0RFQ1JFRihvYmpyZXByKTsKLQlyZXR1cm4gcmVzdWx0OwotfQkKKyAgICBpZiAocm8tPmNudCA9PSAtMSkKKyAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgicmVwZWF0KCVzKSIsCisgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcob2JqcmVwcikpOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgicmVwZWF0KCVzLCAlemQpIiwKKyAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhvYmpyZXByKSwgcm8tPmNudCk7CisgICAgUHlfREVDUkVGKG9ianJlcHIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZXBlYXRfbGVuKHJlcGVhdG9iamVjdCAqcm8pCiB7Ci0gICAgICAgIGlmIChyby0+Y250ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxlbigpIG9mIHVuc2l6ZWQgb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21TaXplX3Qocm8tPmNudCk7CisgICAgaWYgKHJvLT5jbnQgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxlbigpIG9mIHVuc2l6ZWQgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbVNpemVfdChyby0+Y250KTsKIH0KIAogUHlEb2NfU1RSVkFSKGxlbmd0aF9oaW50X2RvYywgIlByaXZhdGUgbWV0aG9kIHJldHVybmluZyBhbiBlc3RpbWF0ZSBvZiBsZW4obGlzdChpdCkpLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgcmVwZWF0X21ldGhvZHNbXSA9IHsKLQl7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilyZXBlYXRfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilyZXBlYXRfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKHJlcGVhdF9kb2MsCkBAIC0zNzM0LDQ3ICszNzM0LDQ3IEBACiBlbmRsZXNzbHkuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcmVwZWF0X3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5yZXBlYXQiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihyZXBlYXRvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpcmVwZWF0X2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylyZXBlYXRfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlyZXBlYXRfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpcmVwZWF0X3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpcmVwZWF0X25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JcmVwZWF0X21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlyZXBlYXRfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLnJlcGVhdCIsICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHJlcGVhdG9iamVjdCksICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpcmVwZWF0X2RlYWxsb2MsICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXJlcGVhdF9yZXByLCAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICByZXBlYXRfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXJlcGVhdF90cmF2ZXJzZSwgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXJlcGVhdF9uZXh0LCAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHJlcGVhdF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgcmVwZWF0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogaXppcGxvbmdlc3Qgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM3ODIsMTIgKzM3ODIsMTIgQEAKICNpbmNsdWRlICJQeXRob24uaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90IHR1cGxlc2l6ZTsKLQlQeV9zc2l6ZV90IG51bWFjdGl2ZTsJCi0JUHlPYmplY3QgKml0dHVwbGU7CQkvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICpmaWxsdmFsdWU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgdHVwbGVzaXplOworICAgIFB5X3NzaXplX3QgbnVtYWN0aXZlOworICAgIFB5T2JqZWN0ICppdHR1cGxlOyAgICAgICAgICAgICAgICAgIC8qIHR1cGxlIG9mIGl0ZXJhdG9ycyAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmZpbGx2YWx1ZTsKIH0gaXppcGxvbmdlc3RvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaXppcGxvbmdlc3RfdHlwZTsKQEAgLTM3OTUsMTU5ICszNzk1LDE1OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGl6aXBfbG9uZ2VzdF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaXppcGxvbmdlc3RvYmplY3QgKmx6OwotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqaXR0dXBsZTsgIC8qIHR1cGxlIG9mIGl0ZXJhdG9ycyAqLwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKmZpbGx2YWx1ZSA9IFB5X05vbmU7Ci0JUHlfc3NpemVfdCB0dXBsZXNpemUgPSBQeVNlcXVlbmNlX0xlbmd0aChhcmdzKTsKKyAgICBpemlwbG9uZ2VzdG9iamVjdCAqbHo7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICppdHR1cGxlOyAgLyogdHVwbGUgb2YgaXRlcmF0b3JzICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqZmlsbHZhbHVlID0gUHlfTm9uZTsKKyAgICBQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IFB5U2VxdWVuY2VfTGVuZ3RoKGFyZ3MpOwogCi0gICAgICAgIGlmIChrd2RzICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrRXhhY3Qoa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZmlsbHZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoa3dkcywgImZpbGx2YWx1ZSIpOwotICAgICAgICAgICAgICAgIGlmIChmaWxsdmFsdWUgPT0gTlVMTCAgfHwgIFB5RGljdF9TaXplKGt3ZHMpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiaXppcF9sb25nZXN0KCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KKyAgICBpZiAoa3dkcyAhPSBOVUxMICYmIFB5RGljdF9DaGVja0V4YWN0KGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpID4gMCkgeworICAgICAgICBmaWxsdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhrd2RzLCAiZmlsbHZhbHVlIik7CisgICAgICAgIGlmIChmaWxsdmFsdWUgPT0gTlVMTCAgfHwgIFB5RGljdF9TaXplKGt3ZHMpID4gMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiaXppcF9sb25nZXN0KCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KKyAgICB9CiAKLQkvKiBhcmdzIG11c3QgYmUgYSB0dXBsZSAqLwotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICAvKiBhcmdzIG11c3QgYmUgYSB0dXBsZSAqLworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKIAotCS8qIG9idGFpbiBpdGVyYXRvcnMgKi8KLQlpdHR1cGxlID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKLQlpZiAoaXR0dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGk9MDsgaSA8IHR1cGxlc2l6ZTsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJUHlPYmplY3QgKml0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVtKTsKLQkJaWYgKGl0ID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgIml6aXBfbG9uZ2VzdCBhcmd1bWVudCAjJXpkIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iLAotCQkJCSAgICBpKzEpOwotCQkJUHlfREVDUkVGKGl0dHVwbGUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShpdHR1cGxlLCBpLCBpdCk7Ci0JfQorICAgIC8qIG9idGFpbiBpdGVyYXRvcnMgKi8KKyAgICBpdHR1cGxlID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKKyAgICBpZiAoaXR0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGk9MDsgaSA8IHR1cGxlc2l6ZTsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgUHlPYmplY3QgKml0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVtKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIml6aXBfbG9uZ2VzdCBhcmd1bWVudCAjJXpkIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICBpKzEpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0dHVwbGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShpdHR1cGxlLCBpLCBpdCk7CisgICAgfQogCi0JLyogY3JlYXRlIGEgcmVzdWx0IGhvbGRlciAqLwotCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdHR1cGxlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBQeV9Ob25lKTsKLQl9CisgICAgLyogY3JlYXRlIGEgcmVzdWx0IGhvbGRlciAqLworICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdHR1cGxlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBQeV9Ob25lKTsKKyAgICB9CiAKLQkvKiBjcmVhdGUgaXppcGxvbmdlc3RvYmplY3Qgc3RydWN0dXJlICovCi0JbHogPSAoaXppcGxvbmdlc3RvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXR0dXBsZSk7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbHotPml0dHVwbGUgPSBpdHR1cGxlOwotCWx6LT50dXBsZXNpemUgPSB0dXBsZXNpemU7Ci0JbHotPm51bWFjdGl2ZSA9IHR1cGxlc2l6ZTsKLQlsei0+cmVzdWx0ID0gcmVzdWx0OwotCVB5X0lOQ1JFRihmaWxsdmFsdWUpOwotCWx6LT5maWxsdmFsdWUgPSBmaWxsdmFsdWU7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIC8qIGNyZWF0ZSBpemlwbG9uZ2VzdG9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBseiA9IChpemlwbG9uZ2VzdG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdHR1cGxlKTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsei0+aXR0dXBsZSA9IGl0dHVwbGU7CisgICAgbHotPnR1cGxlc2l6ZSA9IHR1cGxlc2l6ZTsKKyAgICBsei0+bnVtYWN0aXZlID0gdHVwbGVzaXplOworICAgIGx6LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgUHlfSU5DUkVGKGZpbGx2YWx1ZSk7CisgICAgbHotPmZpbGx2YWx1ZSA9IGZpbGx2YWx1ZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbHo7CiB9CiAKIHN0YXRpYyB2b2lkCiBpemlwX2xvbmdlc3RfZGVhbGxvYyhpemlwbG9uZ2VzdG9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+aXR0dXBsZSk7Ci0JUHlfWERFQ1JFRihsei0+cmVzdWx0KTsKLQlQeV9YREVDUkVGKGx6LT5maWxsdmFsdWUpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdHR1cGxlKTsKKyAgICBQeV9YREVDUkVGKGx6LT5yZXN1bHQpOworICAgIFB5X1hERUNSRUYobHotPmZpbGx2YWx1ZSk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBpemlwX2xvbmdlc3RfdHJhdmVyc2UoaXppcGxvbmdlc3RvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChsei0+aXR0dXBsZSk7Ci0JUHlfVklTSVQobHotPnJlc3VsdCk7Ci0JUHlfVklTSVQobHotPmZpbGx2YWx1ZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0dHVwbGUpOworICAgIFB5X1ZJU0lUKGx6LT5yZXN1bHQpOworICAgIFB5X1ZJU0lUKGx6LT5maWxsdmFsdWUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaXppcF9sb25nZXN0X25leHQoaXppcGxvbmdlc3RvYmplY3QgKmx6KQogewotICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgIFB5X3NzaXplX3QgdHVwbGVzaXplID0gbHotPnR1cGxlc2l6ZTsKLSAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IGx6LT5yZXN1bHQ7Ci0gICAgICAgIFB5T2JqZWN0ICppdDsKLSAgICAgICAgUHlPYmplY3QgKml0ZW07Ci0gICAgICAgIFB5T2JqZWN0ICpvbGRpdGVtOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IGx6LT50dXBsZXNpemU7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGx6LT5yZXN1bHQ7CisgICAgUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICpvbGRpdGVtOwogCi0gICAgICAgIGlmICh0dXBsZXNpemUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKGx6LT5udW1hY3RpdmUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKFB5X1JFRkNOVChyZXN1bHQpID09IDEpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MCA7IGkgPCB0dXBsZXNpemUgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXR0dXBsZSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYobHotPmZpbGx2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBsei0+ZmlsbHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGl0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5udW1hY3RpdmUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobHotPm51bWFjdGl2ZSA9PSAwIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5udW1hY3RpdmUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGx6LT5maWxsdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGx6LT5maWxsdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGx6LT5pdHR1cGxlLCBpLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbGRpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9sZGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyh0dXBsZXNpemUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICBpZiAodHVwbGVzaXplID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChsei0+bnVtYWN0aXZlID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeV9SRUZDTlQocmVzdWx0KSA9PSAxKSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICBmb3IgKGk9MCA7IGkgPCB0dXBsZXNpemUgOyBpKyspIHsKKyAgICAgICAgICAgIGl0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXR0dXBsZSwgaSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihsei0+ZmlsbHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpdGVtID0gbHotPmZpbGx2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGx6LT5udW1hY3RpdmUgLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGx6LT5udW1hY3RpdmUgPT0gMCB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsei0+bnVtYWN0aXZlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdCA9IFB5VHVwbGVfR0VUX0lURU0obHotPml0dHVwbGUsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGx6LT5maWxsdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gbHotPmZpbGx2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsei0+bnVtYWN0aXZlIC09IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGx6LT5udW1hY3RpdmUgPT0gMCB8fCBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsei0+bnVtYWN0aXZlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihsei0+ZmlsbHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBsei0+ZmlsbHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShsei0+aXR0dXBsZSwgaSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGx6LT5maWxsdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGx6LT5maWxsdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGx6LT5pdHR1cGxlLCBpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbGRpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKG9sZGl0ZW0pOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgeworICAgICAgICAgICAgaXQgPSBQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdHR1cGxlLCBpKTsKKyAgICAgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGx6LT5maWxsdmFsdWUpOworICAgICAgICAgICAgICAgIGl0ZW0gPSBsei0+ZmlsbHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbHotPm51bWFjdGl2ZSAtPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAobHotPm51bWFjdGl2ZSA9PSAwIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5udW1hY3RpdmUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihsei0+ZmlsbHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBsei0+ZmlsbHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShsei0+aXR0dXBsZSwgaSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihpemlwX2xvbmdlc3RfZG9jLApAQCAtMzk2Miw0NyArMzk2Miw0NyBAQAogIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaXppcGxvbmdlc3RfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLml6aXBfbG9uZ2VzdCIsCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoaXppcGxvbmdlc3RvYmplY3QpLAkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilpemlwX2xvbmdlc3RfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWl6aXBfbG9uZ2VzdF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpemlwX2xvbmdlc3RfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylpemlwX2xvbmdlc3RfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCWl6aXBfbG9uZ2VzdF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuaXppcF9sb25nZXN0IiwgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoaXppcGxvbmdlc3RvYmplY3QpLCAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpemlwX2xvbmdlc3RfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgaXppcF9sb25nZXN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWl6aXBfbG9uZ2VzdF90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylpemlwX2xvbmdlc3RfbmV4dCwgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaXppcF9sb25nZXN0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAvKiBtb2R1bGUgbGV2ZWwgY29kZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQwNDAsNTcgKzQwNDAsNTcgQEAKIAogCiBzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKLQl7InRlZSIsCShQeUNGdW5jdGlvbil0ZWUsCU1FVEhfVkFSQVJHUywgdGVlX2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJ0ZWUiLCAgICAgKFB5Q0Z1bmN0aW9uKXRlZSwgICAgICAgTUVUSF9WQVJBUkdTLCB0ZWVfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRpdGVydG9vbHModm9pZCkKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqbTsKLQljaGFyICpuYW1lOwotCVB5VHlwZU9iamVjdCAqdHlwZWxpc3RbXSA9IHsKLQkJJmNvbWJpbmF0aW9uc190eXBlLAotCQkmY3dyX3R5cGUsCi0JCSZjeWNsZV90eXBlLAotCQkmZHJvcHdoaWxlX3R5cGUsCi0JCSZ0YWtld2hpbGVfdHlwZSwKLQkJJmlzbGljZV90eXBlLAotCQkmc3Rhcm1hcF90eXBlLAotCQkmaW1hcF90eXBlLAotCQkmY2hhaW5fdHlwZSwKLQkJJmNvbXByZXNzX3R5cGUsCi0JCSZpZmlsdGVyX3R5cGUsCi0JCSZpZmlsdGVyZmFsc2VfdHlwZSwKLQkJJmNvdW50X3R5cGUsCi0JCSZpemlwX3R5cGUsCi0JCSZpemlwbG9uZ2VzdF90eXBlLAotCQkmcGVybXV0YXRpb25zX3R5cGUsCi0JCSZwcm9kdWN0X3R5cGUsCi0JCSZyZXBlYXRfdHlwZSwKLQkJJmdyb3VwYnlfdHlwZSwKLQkJTlVMTAotCX07CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKm07CisgICAgY2hhciAqbmFtZTsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGVsaXN0W10gPSB7CisgICAgICAgICZjb21iaW5hdGlvbnNfdHlwZSwKKyAgICAgICAgJmN3cl90eXBlLAorICAgICAgICAmY3ljbGVfdHlwZSwKKyAgICAgICAgJmRyb3B3aGlsZV90eXBlLAorICAgICAgICAmdGFrZXdoaWxlX3R5cGUsCisgICAgICAgICZpc2xpY2VfdHlwZSwKKyAgICAgICAgJnN0YXJtYXBfdHlwZSwKKyAgICAgICAgJmltYXBfdHlwZSwKKyAgICAgICAgJmNoYWluX3R5cGUsCisgICAgICAgICZjb21wcmVzc190eXBlLAorICAgICAgICAmaWZpbHRlcl90eXBlLAorICAgICAgICAmaWZpbHRlcmZhbHNlX3R5cGUsCisgICAgICAgICZjb3VudF90eXBlLAorICAgICAgICAmaXppcF90eXBlLAorICAgICAgICAmaXppcGxvbmdlc3RfdHlwZSwKKyAgICAgICAgJnBlcm11dGF0aW9uc190eXBlLAorICAgICAgICAmcHJvZHVjdF90eXBlLAorICAgICAgICAmcmVwZWF0X3R5cGUsCisgICAgICAgICZncm91cGJ5X3R5cGUsCisgICAgICAgIE5VTEwKKyAgICB9OwogCi0JUHlfVFlQRSgmdGVlZGF0YW9iamVjdF90eXBlKSA9ICZQeVR5cGVfVHlwZTsKLQltID0gUHlfSW5pdE1vZHVsZTMoIml0ZXJ0b29scyIsIG1vZHVsZV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgUHlfVFlQRSgmdGVlZGF0YW9iamVjdF90eXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIml0ZXJ0b29scyIsIG1vZHVsZV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlmb3IgKGk9MCA7IHR5cGVsaXN0W2ldICE9IE5VTEwgOyBpKyspIHsKLQkJaWYgKFB5VHlwZV9SZWFkeSh0eXBlbGlzdFtpXSkgPCAwKQotCQkJcmV0dXJuOwotCQluYW1lID0gc3RyY2hyKHR5cGVsaXN0W2ldLT50cF9uYW1lLCAnLicpOwotCQlhc3NlcnQgKG5hbWUgIT0gTlVMTCk7Ci0JCVB5X0lOQ1JFRih0eXBlbGlzdFtpXSk7Ci0JCVB5TW9kdWxlX0FkZE9iamVjdChtLCBuYW1lKzEsIChQeU9iamVjdCAqKXR5cGVsaXN0W2ldKTsKLQl9CisgICAgZm9yIChpPTAgOyB0eXBlbGlzdFtpXSAhPSBOVUxMIDsgaSsrKSB7CisgICAgICAgIGlmIChQeVR5cGVfUmVhZHkodHlwZWxpc3RbaV0pIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbmFtZSA9IHN0cmNocih0eXBlbGlzdFtpXS0+dHBfbmFtZSwgJy4nKTsKKyAgICAgICAgYXNzZXJ0IChuYW1lICE9IE5VTEwpOworICAgICAgICBQeV9JTkNSRUYodHlwZWxpc3RbaV0pOworICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgbmFtZSsxLCAoUHlPYmplY3QgKil0eXBlbGlzdFtpXSk7CisgICAgfQogCi0JaWYgKFB5VHlwZV9SZWFkeSgmdGVlZGF0YW9iamVjdF90eXBlKSA8IDApCi0JCXJldHVybjsKLQlpZiAoUHlUeXBlX1JlYWR5KCZ0ZWVfdHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKFB5VHlwZV9SZWFkeSgmX2dyb3VwZXJfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmdGVlZGF0YW9iamVjdF90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZ0ZWVfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmX2dyb3VwZXJfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2xpbnV4YXVkaW9kZXYuYyBiL01vZHVsZXMvbGludXhhdWRpb2Rldi5jCmluZGV4IDgwMDc3YzYuLjdmZTIwYWUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbGludXhhdWRpb2Rldi5jCisrKyBiL01vZHVsZXMvbGludXhhdWRpb2Rldi5jCkBAIC0xLDE0ICsxLDE0IEBACi0vKiBIZXkgRW1hY3MsIHRoaXMgaXMgLSotQy0qLSAKKy8qIEhleSBFbWFjcywgdGhpcyBpcyAtKi1DLSotCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBsaW51eGF1ZGlvZGV2LmMgLS0gTGludXggYXVkaW8gZGV2aWNlIGZvciBweXRob24uCi0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgOiBQZXRlciBCb3NjaAogICogQ3JlYXRlZCBPbiAgICAgIDogVGh1IE1hciAgMiAyMToxMDozMyAyMDAwCiAgKiBTdGF0dXMgICAgICAgICAgOiBVbmtub3duLCBVc2Ugd2l0aCBjYXV0aW9uIQotICogCisgKgogICogVW5sZXNzIG90aGVyIG5vdGljZXMgYXJlIHByZXNlbnQgaW4gYW55IHBhcnQgb2YgdGhpcyBmaWxlCi0gKiBleHBsaWNpdGx5IGNsYWltaW5nIGNvcHlyaWdodHMgZm9yIG90aGVyIHBlb3BsZSBhbmQvb3IgCi0gKiBvcmdhbml6YXRpb25zLCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGlzIGZ1bGx5IGNvcHlyaWdodCAKKyAqIGV4cGxpY2l0bHkgY2xhaW1pbmcgY29weXJpZ2h0cyBmb3Igb3RoZXIgcGVvcGxlIGFuZC9vcgorICogb3JnYW5pemF0aW9ucywgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBpcyBmdWxseSBjb3B5cmlnaHQKICAqIChDKSAyMDAwIFBldGVyIEJvc2NoLCBhbGwgcmlnaHRzIHJlc2VydmVkLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCkBAIC00MywxMSArNDMsMTEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBpbnQJCXhfZmQ7CQkvKiBUaGUgb3BlbiBmaWxlICovCisgICAgaW50ICAgICAgICAgeF9mZDsgICAgICAgICAgIC8qIFRoZSBvcGVuIGZpbGUgKi8KICAgICBpbnQgICAgICAgICB4X21vZGU7ICAgICAgICAgICAvKiBmaWxlIG1vZGUgKi8KLSAgICBpbnQJCXhfaWNvdW50OwkvKiBJbnB1dCBjb3VudCAqLwotICAgIGludAkJeF9vY291bnQ7CS8qIE91dHB1dCBjb3VudCAqLwotICAgIHVpbnQzMl90CXhfYWZtdHM7CS8qIEF1ZGlvIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlKi8KKyAgICBpbnQgICAgICAgICB4X2ljb3VudDsgICAgICAgLyogSW5wdXQgY291bnQgKi8KKyAgICBpbnQgICAgICAgICB4X29jb3VudDsgICAgICAgLyogT3V0cHV0IGNvdW50ICovCisgICAgdWludDMyX3QgICAgeF9hZm10czsgICAgICAgIC8qIEF1ZGlvIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlKi8KIH0gbGFkX3Q7CiAKIC8qIFhYWCBzZXZlcmFsIGZvcm1hdCBkZWZpbmVkIGluIHNvdW5kY2FyZC5oIGFyZSBub3Qgc3VwcG9ydGVkLApAQCAtNTUsMTkgKzU1LDE5IEBACiAqLwogCiBzdGF0aWMgc3RydWN0IHsKLSAgICBpbnQJCWFfYnBzOwotICAgIHVpbnQzMl90CWFfZm10OworICAgIGludCAgICAgICAgIGFfYnBzOworICAgIHVpbnQzMl90ICAgIGFfZm10OwogICAgIGNoYXIgICAgICAgKmFfbmFtZTsKIH0gYXVkaW9fdHlwZXNbXSA9IHsKLSAgICB7ICA4LCAJQUZNVF9NVV9MQVcsICJsb2dhcml0aG1pYyBtdS1sYXcgOC1iaXQgYXVkaW8iIH0sCi0gICAgeyAgOCwgCUFGTVRfQV9MQVcsICAibG9nYXJpdGhtaWMgQS1sYXcgOC1iaXQgYXVkaW8iIH0sCi0gICAgeyAgOCwJQUZNVF9VOCwgICAgICJsaW5lYXIgdW5zaWduZWQgOC1iaXQgYXVkaW8iIH0sCi0gICAgeyAgOCwgCUFGTVRfUzgsICAgICAibGluZWFyIHNpZ25lZCA4LWJpdCBhdWRpbyIgfSwKLSAgICB7IDE2LCAJQUZNVF9VMTZfQkUsICJsaW5lYXIgdW5zaWduZWQgMTYtYml0IGJpZy1lbmRpYW4gYXVkaW8iIH0sCi0gICAgeyAxNiwgCUFGTVRfVTE2X0xFLCAibGluZWFyIHVuc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIGF1ZGlvIiB9LAotICAgIHsgMTYsIAlBRk1UX1MxNl9CRSwgImxpbmVhciBzaWduZWQgMTYtYml0IGJpZy1lbmRpYW4gYXVkaW8iIH0sCi0gICAgeyAxNiwgCUFGTVRfUzE2X0xFLCAibGluZWFyIHNpZ25lZCAxNi1iaXQgbGl0dGxlLWVuZGlhbiBhdWRpbyIgfSwKLSAgICB7IDE2LCAJQUZNVF9TMTZfTkUsICJsaW5lYXIgc2lnbmVkIDE2LWJpdCBuYXRpdmUtZW5kaWFuIGF1ZGlvIiB9LAorICAgIHsgIDgsICAgICAgIEFGTVRfTVVfTEFXLCAibG9nYXJpdGhtaWMgbXUtbGF3IDgtYml0IGF1ZGlvIiB9LAorICAgIHsgIDgsICAgICAgIEFGTVRfQV9MQVcsICAibG9nYXJpdGhtaWMgQS1sYXcgOC1iaXQgYXVkaW8iIH0sCisgICAgeyAgOCwgICAgICAgQUZNVF9VOCwgICAgICJsaW5lYXIgdW5zaWduZWQgOC1iaXQgYXVkaW8iIH0sCisgICAgeyAgOCwgICAgICAgQUZNVF9TOCwgICAgICJsaW5lYXIgc2lnbmVkIDgtYml0IGF1ZGlvIiB9LAorICAgIHsgMTYsICAgICAgIEFGTVRfVTE2X0JFLCAibGluZWFyIHVuc2lnbmVkIDE2LWJpdCBiaWctZW5kaWFuIGF1ZGlvIiB9LAorICAgIHsgMTYsICAgICAgIEFGTVRfVTE2X0xFLCAibGluZWFyIHVuc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIGF1ZGlvIiB9LAorICAgIHsgMTYsICAgICAgIEFGTVRfUzE2X0JFLCAibGluZWFyIHNpZ25lZCAxNi1iaXQgYmlnLWVuZGlhbiBhdWRpbyIgfSwKKyAgICB7IDE2LCAgICAgICBBRk1UX1MxNl9MRSwgImxpbmVhciBzaWduZWQgMTYtYml0IGxpdHRsZS1lbmRpYW4gYXVkaW8iIH0sCisgICAgeyAxNiwgICAgICAgQUZNVF9TMTZfTkUsICJsaW5lYXIgc2lnbmVkIDE2LWJpdCBuYXRpdmUtZW5kaWFuIGF1ZGlvIiB9LAogfTsKIAogc3RhdGljIGludCBuX2F1ZGlvX3R5cGVzID0gc2l6ZW9mKGF1ZGlvX3R5cGVzKSAvIHNpemVvZihhdWRpb190eXBlc1swXSk7CkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAvKiBPcGVuIHRoZSBjb3JyZWN0IGRldmljZS4gIFRoZSBiYXNlIGRldmljZSBuYW1lIGNvbWVzIGZyb20gdGhlCiAgICAgICogQVVESU9ERVYgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlyc3QsIHRoZW4gL2Rldi9kc3AuICBUaGUKICAgICAgKiBjb250cm9sIGRldmljZSB0YWNrcyAiY3RsIiBvbnRvIHRoZSBiYXNlIGRldmljZSBuYW1lLgotICAgICAqIAorICAgICAqCiAgICAgICogTm90ZSB0aGF0IHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiAvZGV2L2F1ZGlvIGFuZCAvZGV2L2RzcAogICAgICAqIGlzIHRoYXQgdGhlIGZvcm1lciB1c2VzIGxvZ2FyaXRobWljIG11LWxhdyBlbmNvZGluZyBhbmQgdGhlCiAgICAgICogbGF0dGVyIHVzZXMgOC1iaXQgdW5zaWduZWQgZW5jb2RpbmcuCkBAIC0xNDksNyArMTQ5LDcgQEAKIHsKICAgICAvKiBpZiBhbHJlYWR5IGNsb3NlZCwgZG9uJ3QgcmVjbG9zZSBpdCAqLwogICAgIGlmICh4cC0+eF9mZCAhPSAtMSkKLQljbG9zZSh4cC0+eF9mZCk7CisgICAgICAgIGNsb3NlKHhwLT54X2ZkKTsKICAgICBQeU9iamVjdF9EZWwoeHApOwogfQogCkBAIC0xNTksNyArMTU5LDcgQEAKICAgICBpbnQgc2l6ZSwgY291bnQ7CiAgICAgY2hhciAqY3A7CiAgICAgUHlPYmplY3QgKnJ2OwotCQorCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlYWQiLCAmc2l6ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7CkBAIC0xODQsMzYgKzE4NCwzNiBAQAogICAgIGZkX3NldCB3cml0ZV9zZXRfZmRzOwogICAgIHN0cnVjdCB0aW1ldmFsIHR2OwogICAgIGludCBzZWxlY3RfcmV0dmFsOwotICAgIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6d3JpdGUiLCAmY3AsICZzaXplKSkgCi0JcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOndyaXRlIiwgJmNwLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogdXNlIHNlbGVjdCB0byB3YWl0IGZvciBhdWRpbyBkZXZpY2UgdG8gYmUgYXZhaWxhYmxlICovCiAgICAgRkRfWkVSTygmd3JpdGVfc2V0X2Zkcyk7CiAgICAgRkRfU0VUKHNlbGYtPnhfZmQsICZ3cml0ZV9zZXRfZmRzKTsKICAgICB0di50dl9zZWMgPSA0OyAvKiB0aW1lb3V0IHZhbHVlcyAqLwotICAgIHR2LnR2X3VzZWMgPSAwOyAKKyAgICB0di50dl91c2VjID0gMDsKIAogICAgIHdoaWxlIChzaXplID4gMCkgewogICAgICAgc2VsZWN0X3JldHZhbCA9IHNlbGVjdChzZWxmLT54X2ZkKzEsIE5VTEwsICZ3cml0ZV9zZXRfZmRzLCBOVUxMLCAmdHYpOwogICAgICAgdHYudHZfc2VjID0gMTsgdHYudHZfdXNlYyA9IDA7IC8qIHdpbGxpbmcgdG8gd2FpdCB0aGlzIGxvbmcgbmV4dCB0aW1lKi8KICAgICAgIGlmIChzZWxlY3RfcmV0dmFsKSB7CiAgICAgICAgIGlmICgocnYgPSB3cml0ZShzZWxmLT54X2ZkLCBjcCwgc2l6ZSkpID09IC0xKSB7Ci0JICBpZiAoZXJybm8gIT0gRUFHQUlOKSB7Ci0JICAgIFB5RXJyX1NldEZyb21FcnJubyhMaW51eEF1ZGlvRXJyb3IpOwotCSAgICByZXR1cm4gTlVMTDsKLQkgIH0gZWxzZSB7Ci0JICAgIGVycm5vID0gMDsgLyogRUFHQUlOOiBidWZmZXIgaXMgZnVsbCwgdHJ5IGFnYWluICovCi0JICB9CisgICAgICAgICAgaWYgKGVycm5vICE9IEVBR0FJTikgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKExpbnV4QXVkaW9FcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJybm8gPSAwOyAvKiBFQUdBSU46IGJ1ZmZlciBpcyBmdWxsLCB0cnkgYWdhaW4gKi8KKyAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0JICBzZWxmLT54X29jb3VudCArPSBydjsKLQkgIHNpemUgLT0gcnY7Ci0JICBjcCArPSBydjsKLQl9CisgICAgICAgICAgc2VsZi0+eF9vY291bnQgKz0gcnY7CisgICAgICAgICAgc2l6ZSAtPSBydjsKKyAgICAgICAgICBjcCArPSBydjsKKyAgICAgICAgfQogICAgICAgfSBlbHNlIHsKLQkvKiBwcmludGYoIk5vdCBhYmxlIHRvIHdyaXRlIHRvIGxpbnV4IGF1ZGlvIGRldmljZSB3aXRoaW4gJWxkIHNlY29uZHNcbiIsIHR2LnR2X3NlYyk7ICovCi0JUHlFcnJfU2V0RnJvbUVycm5vKExpbnV4QXVkaW9FcnJvcik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIC8qIHByaW50ZigiTm90IGFibGUgdG8gd3JpdGUgdG8gbGludXggYXVkaW8gZGV2aWNlIHdpdGhpbiAlbGQgc2Vjb25kc1xuIiwgdHYudHZfc2VjKTsgKi8KKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKExpbnV4QXVkaW9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgfQogICAgIH0KICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC0yNDQsNDcgKzI0NCw0NyBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaXxpOnNldHBhcmFtZXRlcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmcmF0ZSwgJnNzaXplLCAmbmNoYW5uZWxzLCAmZm10LCAmZW11bGF0ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAKKwogICAgIGlmIChyYXRlIDwgMCkgewotCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiZXhwZWN0ZWQgcmF0ZSA+PSAwLCBub3QgJWQiLAotCQkgICAgIHJhdGUpOyAKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJleHBlY3RlZCByYXRlID49IDAsIG5vdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICByYXRlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChzc2l6ZSA8IDApIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgImV4cGVjdGVkIHNhbXBsZSBzaXplID49IDAsIG5vdCAlZCIsCi0JCSAgICAgc3NpemUpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgImV4cGVjdGVkIHNhbXBsZSBzaXplID49IDAsIG5vdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICBzc2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAobmNoYW5uZWxzICE9IDEgJiYgbmNoYW5uZWxzICE9IDIpIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIm5jaGFubmVscyBtdXN0IGJlIDEgb3IgMiwgbm90ICVkIiwKLQkJICAgICBuY2hhbm5lbHMpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIm5jaGFubmVscyBtdXN0IGJlIDEgb3IgMiwgbm90ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIG5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGZvciAobiA9IDA7IG4gPCBuX2F1ZGlvX3R5cGVzOyBuKyspCiAgICAgICAgIGlmIChmbXQgPT0gYXVkaW9fdHlwZXNbbl0uYV9mbXQpCiAgICAgICAgICAgICBicmVhazsKICAgICBpZiAobiA9PSBuX2F1ZGlvX3R5cGVzKSB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bmtub3duIGF1ZGlvIGVuY29kaW5nOiAlZCIsIGZtdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAidW5rbm93biBhdWRpbyBlbmNvZGluZzogJWQiLCBmbXQpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKGF1ZGlvX3R5cGVzW25dLmFfYnBzICE9IHNzaXplKSB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsIAotCQkgICAgICJmb3IgJXMsIGV4cGVjdGVkIHNhbXBsZSBzaXplICVkLCBub3QgJWQiLAotCQkgICAgIGF1ZGlvX3R5cGVzW25dLmFfbmFtZSwgYXVkaW9fdHlwZXNbbl0uYV9icHMsIHNzaXplKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZm9yICVzLCBleHBlY3RlZCBzYW1wbGUgc2l6ZSAlZCwgbm90ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3R5cGVzW25dLmFfbmFtZSwgYXVkaW9fdHlwZXNbbl0uYV9icHMsIHNzaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgaWYgKGVtdWxhdGUgPT0gMCkgewotCWlmICgoc2VsZi0+eF9hZm10cyAmIGF1ZGlvX3R5cGVzW25dLmFfZm10KSA9PSAwKSB7Ci0JICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAKLQkJCSAiJXMgZm9ybWF0IG5vdCBzdXBwb3J0ZWQgYnkgZGV2aWNlIiwKLQkJCSBhdWRpb190eXBlc1tuXS5hX25hbWUpOwotCSAgICByZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIGlmICgoc2VsZi0+eF9hZm10cyAmIGF1ZGlvX3R5cGVzW25dLmFfZm10KSA9PSAwKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgZm9ybWF0IG5vdCBzdXBwb3J0ZWQgYnkgZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb190eXBlc1tuXS5hX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIFNORENUTF9EU1BfU0VURk1ULCAKLQkgICAgICAmYXVkaW9fdHlwZXNbbl0uYV9mbXQpID09IC0xKSB7CisgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIFNORENUTF9EU1BfU0VURk1ULAorICAgICAgICAgICAgICAmYXVkaW9fdHlwZXNbbl0uYV9mbXQpID09IC0xKSB7CiAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhMaW51eEF1ZGlvRXJyb3IpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0zMDcsNyArMzA3LDcgQEAKICAgICBpbnQgZm10OwogCiAgICAgZm10ID0gMDsKLSAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgU05EQ1RMX0RTUF9TRVRGTVQsICZmbXQpIDwgMCkgCisgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIFNORENUTF9EU1BfU0VURk1ULCAmZm10KSA8IDApCiAgICAgICAgIHJldHVybiAtZXJybm87CiAKICAgICBzd2l0Y2ggKGZtdCkgewpAQCAtMzM0LDcgKzMzNCw3IEBACiB9CiAKIAotLyogYnVmc2l6ZSByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBoYXJkd2FyZSBhdWRpbyBidWZmZXIgaW4gbnVtYmVyIAorLyogYnVmc2l6ZSByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBoYXJkd2FyZSBhdWRpbyBidWZmZXIgaW4gbnVtYmVyCiAgICBvZiBzYW1wbGVzICovCiBzdGF0aWMgUHlPYmplY3QgKgogbGFkX2J1ZnNpemUobGFkX3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCkBAIC0zNTMsNyArMzUzLDcgQEAKICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGFpLmZyYWdzdG90YWwgKiBhaS5mcmFnc2l6ZSkgLyAobmNoYW5uZWxzICogc3NpemUpKTsKIH0KIAotLyogb2J1ZmNvdW50IHJldHVybnMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbiB0aGUgCisvKiBvYnVmY291bnQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIHRoZQogICAgaGFyZHdhcmUgZm9yIHBsYXlpbmcgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBsYWRfb2J1ZmNvdW50KGxhZF90ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQpAQCAtMzY5LDcgKzM2OSw3IEBACiAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhMaW51eEF1ZGlvRXJyb3IpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChhaS5mcmFnc3RvdGFsICogYWkuZnJhZ3NpemUgLSBhaS5ieXRlcykgLyAKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGFpLmZyYWdzdG90YWwgKiBhaS5mcmFnc2l6ZSAtIGFpLmJ5dGVzKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzc2l6ZSAqIG5jaGFubmVscykpOwogfQogCkBAIC00MTAsOSArNDEwLDkgQEAKICAgICBpbnQgcmVxOwogCiAgICAgaWYgKHNlbGYtPnhfbW9kZSA9PSBPX1JET05MWSkKLQlyZXEgPSBTTkRDVExfRFNQX0dFVElQVFI7CisgICAgICAgIHJlcSA9IFNORENUTF9EU1BfR0VUSVBUUjsKICAgICBlbHNlCi0JcmVxID0gU05EQ1RMX0RTUF9HRVRPUFRSOworICAgICAgICByZXEgPSBTTkRDVExfRFNQX0dFVE9QVFI7CiAgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIHJlcSwgJmluZm8pID09IC0xKSB7CiAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhMaW51eEF1ZGlvRXJyb3IpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQyMSwxNyArNDIxLDE3IEBACiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBsYWRfbWV0aG9kc1tdID0gewotICAgIHsgInJlYWQiLAkJKFB5Q0Z1bmN0aW9uKWxhZF9yZWFkLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICB7ICJ3cml0ZSIsCQkoUHlDRnVuY3Rpb24pbGFkX3dyaXRlLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICB7ICJzZXRwYXJhbWV0ZXJzIiwJKFB5Q0Z1bmN0aW9uKWxhZF9zZXRwYXJhbWV0ZXJzLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICB7ICJidWZzaXplIiwJKFB5Q0Z1bmN0aW9uKWxhZF9idWZzaXplLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICB7ICJvYnVmY291bnQiLAkoUHlDRnVuY3Rpb24pbGFkX29idWZjb3VudCwgTUVUSF9OT0FSR1MgfSwKLSAgICB7ICJvYnVmZnJlZSIsCShQeUNGdW5jdGlvbilsYWRfb2J1ZmZyZWUsIE1FVEhfTk9BUkdTIH0sCi0gICAgeyAiZmx1c2giLAkJKFB5Q0Z1bmN0aW9uKWxhZF9mbHVzaCwgTUVUSF9OT0FSR1MgfSwKLSAgICB7ICJjbG9zZSIsCQkoUHlDRnVuY3Rpb24pbGFkX2Nsb3NlLCBNRVRIX05PQVJHUyB9LAotICAgIHsgImZpbGVubyIsICAgICAJKFB5Q0Z1bmN0aW9uKWxhZF9maWxlbm8sIE1FVEhfTk9BUkdTIH0sCisgICAgeyAicmVhZCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pbGFkX3JlYWQsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgIndyaXRlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxhZF93cml0ZSwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAic2V0cGFyYW1ldGVycyIsICAoUHlDRnVuY3Rpb24pbGFkX3NldHBhcmFtZXRlcnMsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImJ1ZnNpemUiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWxhZF9idWZzaXplLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJvYnVmY291bnQiLCAgICAgIChQeUNGdW5jdGlvbilsYWRfb2J1ZmNvdW50LCBNRVRIX05PQVJHUyB9LAorICAgIHsgIm9idWZmcmVlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWxhZF9vYnVmZnJlZSwgTUVUSF9OT0FSR1MgfSwKKyAgICB7ICJmbHVzaCIsICAgICAgICAgIChQeUNGdW5jdGlvbilsYWRfZmx1c2gsIE1FVEhfTk9BUkdTIH0sCisgICAgeyAiY2xvc2UiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pbGFkX2Nsb3NlLCBNRVRIX05PQVJHUyB9LAorICAgIHsgImZpbGVubyIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxhZF9maWxlbm8sIE1FVEhfTk9BUkdTIH0sCiAgICAgeyAiZ2V0cHRyIiwgICAgICAgICAoUHlDRnVuY3Rpb24pbGFkX2dldHB0ciwgTUVUSF9OT0FSR1MgfSwKLSAgICB7IE5VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7IE5VTEwsICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQ0MywxNSArNDQzLDE1IEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0IExhZHR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKICAgICAibGludXhhdWRpb2Rldi5saW51eF9hdWRpb19kZXZpY2UiLCAvKnRwX25hbWUqLwotICAgIHNpemVvZihsYWRfdCksCQkvKnRwX3NpemUqLwotICAgIDAsCQkJCS8qdHBfaXRlbXNpemUqLworICAgIHNpemVvZihsYWRfdCksICAgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgKGRlc3RydWN0b3IpbGFkX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0gICAgMCwJCQkJLyp0cF9wcmludCovCi0gICAgKGdldGF0dHJmdW5jKWxhZF9nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotICAgIDAsCQkJCS8qdHBfc2V0YXR0ciovCi0gICAgMCwJCQkJLyp0cF9jb21wYXJlKi8KLSAgICAwLAkJCQkvKnRwX3JlcHIqLworICAgIChkZXN0cnVjdG9yKWxhZF9kZWFsbG9jLCAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpbGFkX2dldGF0dHIsICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00NjksMzcgKzQ2OSwzNyBAQAogaW5pdGxpbnV4YXVkaW9kZXYodm9pZCkKIHsKICAgICBQeU9iamVjdCAqbTsKLSAgICAKKwogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGxpbnV4YXVkaW9kZXYgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMDsgdXNlIHRoZSBvc3NhdWRpb2RldiBtb2R1bGUgaW5zdGVhZCIsIDIpIDwgMCkKICAgICAgICAgcmV0dXJuOwotICAKKwogICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJsaW51eGF1ZGlvZGV2IiwgbGludXhhdWRpb2Rldl9tZXRob2RzKTsKICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgTGludXhBdWRpb0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJsaW51eGF1ZGlvZGV2LmVycm9yIiwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKExpbnV4QXVkaW9FcnJvcikKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgTGludXhBdWRpb0Vycm9yKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIExpbnV4QXVkaW9FcnJvcik7CiAKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGTVRfTVVfTEFXIiwgKGxvbmcpQUZNVF9NVV9MQVcpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9BX0xBVyIsIChsb25nKUFGTVRfQV9MQVcpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9VOCIsIChsb25nKUFGTVRfVTgpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9TOCIsIChsb25nKUFGTVRfUzgpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9VMTZfQkUiLCAobG9uZylBRk1UX1UxNl9CRSkgPT0gLTEpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRk1UX1UxNl9MRSIsIChsb25nKUFGTVRfVTE2X0xFKSA9PSAtMSkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGTVRfUzE2X0JFIiwgKGxvbmcpQUZNVF9TMTZfQkUpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9TMTZfTEUiLCAobG9uZylBRk1UX1MxNl9MRSkgPT0gLTEpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRk1UX1MxNl9ORSIsIChsb25nKUFGTVRfUzE2X05FKSA9PSAtMSkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvbWFpbi5jIGIvTW9kdWxlcy9tYWluLmMKaW5kZXggMmY1ZGM1Ny4uN2Q3MzVhOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tYWluLmMKKysrIGIvTW9kdWxlcy9tYWluLmMKQEAgLTEwNywxMTkgKzEwNywxMTkgQEAKIHN0YXRpYyBpbnQKIHVzYWdlKGludCBleGl0Y29kZSwgY2hhciogcHJvZ3JhbSkKIHsKLQlGSUxFICpmID0gZXhpdGNvZGUgPyBzdGRlcnIgOiBzdGRvdXQ7CisgICAgRklMRSAqZiA9IGV4aXRjb2RlID8gc3RkZXJyIDogc3Rkb3V0OwogCi0JZnByaW50ZihmLCB1c2FnZV9saW5lLCBwcm9ncmFtKTsKLQlpZiAoZXhpdGNvZGUpCi0JCWZwcmludGYoZiwgIlRyeSBgcHl0aG9uIC1oJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpOwotCWVsc2UgewotCQlmcHV0cyh1c2FnZV8xLCBmKTsKLQkJZnB1dHModXNhZ2VfMiwgZik7Ci0JCWZwdXRzKHVzYWdlXzMsIGYpOwotCQlmcHJpbnRmKGYsIHVzYWdlXzQsIERFTElNKTsKLQkJZnByaW50ZihmLCB1c2FnZV81LCBERUxJTSwgUFlUSE9OSE9NRUhFTFApOwotCX0KKyAgICBmcHJpbnRmKGYsIHVzYWdlX2xpbmUsIHByb2dyYW0pOworICAgIGlmIChleGl0Y29kZSkKKyAgICAgICAgZnByaW50ZihmLCAiVHJ5IGBweXRob24gLWgnIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIik7CisgICAgZWxzZSB7CisgICAgICAgIGZwdXRzKHVzYWdlXzEsIGYpOworICAgICAgICBmcHV0cyh1c2FnZV8yLCBmKTsKKyAgICAgICAgZnB1dHModXNhZ2VfMywgZik7CisgICAgICAgIGZwcmludGYoZiwgdXNhZ2VfNCwgREVMSU0pOworICAgICAgICBmcHJpbnRmKGYsIHVzYWdlXzUsIERFTElNLCBQWVRIT05IT01FSEVMUCk7CisgICAgfQogI2lmIGRlZmluZWQoX19WTVMpCi0JaWYgKGV4aXRjb2RlID09IDApIHsKLQkJLyogc3VwcHJlc3MgJ2Vycm9yJyBtZXNzYWdlICovCi0JCXJldHVybiAxOwotCX0KLQllbHNlIHsKLQkJLyogU1RTJE1fSU5ISUJfTVNHICsgU1MkX0FCT1JUICovCi0JCXJldHVybiAweDEwMDAwMDJjOwotCX0KKyAgICBpZiAoZXhpdGNvZGUgPT0gMCkgeworICAgICAgICAvKiBzdXBwcmVzcyAnZXJyb3InIG1lc3NhZ2UgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBTVFMkTV9JTkhJQl9NU0cgKyBTUyRfQUJPUlQgKi8KKyAgICAgICAgcmV0dXJuIDB4MTAwMDAwMmM7CisgICAgfQogI2Vsc2UKLQlyZXR1cm4gZXhpdGNvZGU7CisgICAgcmV0dXJuIGV4aXRjb2RlOwogI2VuZGlmCi0JLypOT1RSRUFDSEVEKi8KKyAgICAvKk5PVFJFQUNIRUQqLwogfQogCiBzdGF0aWMgdm9pZCBSdW5TdGFydHVwRmlsZShQeUNvbXBpbGVyRmxhZ3MgKmNmKQogewotCWNoYXIgKnN0YXJ0dXAgPSBQeV9HRVRFTlYoIlBZVEhPTlNUQVJUVVAiKTsKLQlpZiAoc3RhcnR1cCAhPSBOVUxMICYmIHN0YXJ0dXBbMF0gIT0gJ1wwJykgewotCQlGSUxFICpmcCA9IGZvcGVuKHN0YXJ0dXAsICJyIik7Ci0JCWlmIChmcCAhPSBOVUxMKSB7Ci0JCQkodm9pZCkgUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZnAsIHN0YXJ0dXAsIDAsIGNmKTsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlmY2xvc2UoZnApOwotICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJCWludCBzYXZlX2Vycm5vOwotCQkJc2F2ZV9lcnJubyA9IGVycm5vOwotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIkNvdWxkIG5vdCBvcGVuIFBZVEhPTlNUQVJUVVBcbiIpOwotCQkJZXJybm8gPSBzYXZlX2Vycm5vOwotCQkJUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5RXhjX0lPRXJyb3IsCi0JCQkJCQkgICAgICAgc3RhcnR1cCk7Ci0JCQlQeUVycl9QcmludCgpOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCX0KKyAgICBjaGFyICpzdGFydHVwID0gUHlfR0VURU5WKCJQWVRIT05TVEFSVFVQIik7CisgICAgaWYgKHN0YXJ0dXAgIT0gTlVMTCAmJiBzdGFydHVwWzBdICE9ICdcMCcpIHsKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihzdGFydHVwLCAiciIpOworICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeworICAgICAgICAgICAgKHZvaWQpIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKGZwLCBzdGFydHVwLCAwLCBjZik7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNhdmVfZXJybm87CisgICAgICAgICAgICAgICAgICAgIHNhdmVfZXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkNvdWxkIG5vdCBvcGVuIFBZVEhPTlNUQVJUVVBcbiIpOworICAgICAgICAgICAgICAgICAgICBlcnJubyA9IHNhdmVfZXJybm87CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cCk7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIAogc3RhdGljIGludCBSdW5Nb2R1bGUoY2hhciAqbW9kdWxlLCBpbnQgc2V0X2FyZ3YwKQogewotCVB5T2JqZWN0ICpydW5weSwgKnJ1bm1vZHVsZSwgKnJ1bmFyZ3MsICpyZXN1bHQ7Ci0JcnVucHkgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInJ1bnB5Iik7Ci0JaWYgKHJ1bnB5ID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgaW1wb3J0IHJ1bnB5IG1vZHVsZVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcnVubW9kdWxlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhydW5weSwgIl9ydW5fbW9kdWxlX2FzX21haW4iKTsKLQlpZiAocnVubW9kdWxlID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWNjZXNzIHJ1bnB5Ll9ydW5fbW9kdWxlX2FzX21haW5cbiIpOwotCQlQeV9ERUNSRUYocnVucHkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJ1bmFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoc2kpIiwgbW9kdWxlLCBzZXRfYXJndjApOwotCWlmIChydW5hcmdzID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCQkiQ291bGQgbm90IGNyZWF0ZSBhcmd1bWVudHMgZm9yIHJ1bnB5Ll9ydW5fbW9kdWxlX2FzX21haW5cbiIpOwotCQlQeV9ERUNSRUYocnVucHkpOwotCQlQeV9ERUNSRUYocnVubW9kdWxlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKHJ1bm1vZHVsZSwgcnVuYXJncywgTlVMTCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfQotCVB5X0RFQ1JFRihydW5weSk7Ci0JUHlfREVDUkVGKHJ1bm1vZHVsZSk7Ci0JUHlfREVDUkVGKHJ1bmFyZ3MpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICpydW5weSwgKnJ1bm1vZHVsZSwgKnJ1bmFyZ3MsICpyZXN1bHQ7CisgICAgcnVucHkgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInJ1bnB5Iik7CisgICAgaWYgKHJ1bnB5ID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgaW1wb3J0IHJ1bnB5IG1vZHVsZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcnVubW9kdWxlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhydW5weSwgIl9ydW5fbW9kdWxlX2FzX21haW4iKTsKKyAgICBpZiAocnVubW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWNjZXNzIHJ1bnB5Ll9ydW5fbW9kdWxlX2FzX21haW5cbiIpOworICAgICAgICBQeV9ERUNSRUYocnVucHkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJ1bmFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoc2kpIiwgbW9kdWxlLCBzZXRfYXJndjApOworICAgIGlmIChydW5hcmdzID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBhcmd1bWVudHMgZm9yIHJ1bnB5Ll9ydW5fbW9kdWxlX2FzX21haW5cbiIpOworICAgICAgICBQeV9ERUNSRUYocnVucHkpOworICAgICAgICBQeV9ERUNSRUYocnVubW9kdWxlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKHJ1bm1vZHVsZSwgcnVuYXJncywgTlVMTCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQorICAgIFB5X0RFQ1JFRihydW5weSk7CisgICAgUHlfREVDUkVGKHJ1bm1vZHVsZSk7CisgICAgUHlfREVDUkVGKHJ1bmFyZ3MpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IFJ1bk1haW5Gcm9tSW1wb3J0ZXIoY2hhciAqZmlsZW5hbWUpCiB7Ci0JUHlPYmplY3QgKmFyZ3YwID0gTlVMTCwgKmltcG9ydGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYXJndjAgPSBOVUxMLCAqaW1wb3J0ZXIgPSBOVUxMOwogCi0JaWYgKChhcmd2MCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpKSAmJiAKLQkgICAgKGltcG9ydGVyID0gUHlJbXBvcnRfR2V0SW1wb3J0ZXIoYXJndjApKSAmJgotCSAgICAoaW1wb3J0ZXItPm9iX3R5cGUgIT0gJlB5TnVsbEltcG9ydGVyX1R5cGUpKQotCXsKLQkJIC8qIGFyZ3YwIGlzIHVzYWJsZSBhcyBhbiBpbXBvcnQgc291cmNlLCBzbwotCQkJcHV0IGl0IGluIHN5cy5wYXRoWzBdIGFuZCBpbXBvcnQgX19tYWluX18gKi8KLQkJUHlPYmplY3QgKnN5c19wYXRoID0gTlVMTDsKLQkJaWYgKChzeXNfcGF0aCA9IFB5U3lzX0dldE9iamVjdCgicGF0aCIpKSAmJgotCQkgICAgIVB5TGlzdF9TZXRJdGVtKHN5c19wYXRoLCAwLCBhcmd2MCkpCi0JCXsKLQkJCVB5X0lOQ1JFRihhcmd2MCk7Ci0JCQlQeV9ERUNSRUYoaW1wb3J0ZXIpOwotCQkJc3lzX3BhdGggPSBOVUxMOwotCQkJcmV0dXJuIFJ1bk1vZHVsZSgiX19tYWluX18iLCAwKSAhPSAwOwotCQl9Ci0JfQotCVB5X1hERUNSRUYoYXJndjApOwotCVB5X1hERUNSRUYoaW1wb3J0ZXIpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gLTE7CisgICAgaWYgKChhcmd2MCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpKSAmJgorICAgICAgICAoaW1wb3J0ZXIgPSBQeUltcG9ydF9HZXRJbXBvcnRlcihhcmd2MCkpICYmCisgICAgICAgIChpbXBvcnRlci0+b2JfdHlwZSAhPSAmUHlOdWxsSW1wb3J0ZXJfVHlwZSkpCisgICAgeworICAgICAgICAgICAgIC8qIGFyZ3YwIGlzIHVzYWJsZSBhcyBhbiBpbXBvcnQgc291cmNlLCBzbworICAgICAgICAgICAgICAgICAgICBwdXQgaXQgaW4gc3lzLnBhdGhbMF0gYW5kIGltcG9ydCBfX21haW5fXyAqLworICAgICAgICBQeU9iamVjdCAqc3lzX3BhdGggPSBOVUxMOworICAgICAgICBpZiAoKHN5c19wYXRoID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoIikpICYmCisgICAgICAgICAgICAhUHlMaXN0X1NldEl0ZW0oc3lzX3BhdGgsIDAsIGFyZ3YwKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlfSU5DUkVGKGFyZ3YwKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbXBvcnRlcik7CisgICAgICAgICAgICBzeXNfcGF0aCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gUnVuTW9kdWxlKCJfX21haW5fXyIsIDApICE9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfWERFQ1JFRihhcmd2MCk7CisgICAgUHlfWERFQ1JFRihpbXBvcnRlcik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogCkBAIC0yMjgsNDE3ICsyMjgsNDE3IEBACiBpbnQKIFB5X01haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCWludCBjOwotCWludCBzdHM7Ci0JY2hhciAqY29tbWFuZCA9IE5VTEw7Ci0JY2hhciAqZmlsZW5hbWUgPSBOVUxMOwotCWNoYXIgKm1vZHVsZSA9IE5VTEw7Ci0JRklMRSAqZnAgPSBzdGRpbjsKLQljaGFyICpwOwotCWludCB1bmJ1ZmZlcmVkID0gMDsKLQlpbnQgc2tpcGZpcnN0bGluZSA9IDA7Ci0JaW50IHN0ZGluX2lzX2ludGVyYWN0aXZlID0gMDsKLQlpbnQgaGVscCA9IDA7Ci0JaW50IHZlcnNpb24gPSAwOwotCWludCBzYXdfdW5idWZmZXJlZF9mbGFnID0gMDsKLQlQeUNvbXBpbGVyRmxhZ3MgY2Y7CisgICAgaW50IGM7CisgICAgaW50IHN0czsKKyAgICBjaGFyICpjb21tYW5kID0gTlVMTDsKKyAgICBjaGFyICpmaWxlbmFtZSA9IE5VTEw7CisgICAgY2hhciAqbW9kdWxlID0gTlVMTDsKKyAgICBGSUxFICpmcCA9IHN0ZGluOworICAgIGNoYXIgKnA7CisgICAgaW50IHVuYnVmZmVyZWQgPSAwOworICAgIGludCBza2lwZmlyc3RsaW5lID0gMDsKKyAgICBpbnQgc3RkaW5faXNfaW50ZXJhY3RpdmUgPSAwOworICAgIGludCBoZWxwID0gMDsKKyAgICBpbnQgdmVyc2lvbiA9IDA7CisgICAgaW50IHNhd191bmJ1ZmZlcmVkX2ZsYWcgPSAwOworICAgIFB5Q29tcGlsZXJGbGFncyBjZjsKIAotCWNmLmNmX2ZsYWdzID0gMDsKKyAgICBjZi5jZl9mbGFncyA9IDA7CiAKLQlvcmlnX2FyZ2MgPSBhcmdjOwkvKiBGb3IgUHlfR2V0QXJnY0FyZ3YoKSAqLwotCW9yaWdfYXJndiA9IGFyZ3Y7CisgICAgb3JpZ19hcmdjID0gYXJnYzsgICAgICAgICAgIC8qIEZvciBQeV9HZXRBcmdjQXJndigpICovCisgICAgb3JpZ19hcmd2ID0gYXJndjsKIAogI2lmZGVmIFJJU0NPUwotCVB5X1JJU0NPU1dpbXBGbGFnID0gMDsKKyAgICBQeV9SSVNDT1NXaW1wRmxhZyA9IDA7CiAjZW5kaWYKIAotCVB5U3lzX1Jlc2V0V2Fybk9wdGlvbnMoKTsKKyAgICBQeVN5c19SZXNldFdhcm5PcHRpb25zKCk7CiAKLQl3aGlsZSAoKGMgPSBfUHlPU19HZXRPcHQoYXJnYywgYXJndiwgUFJPR1JBTV9PUFRTKSkgIT0gRU9GKSB7Ci0JCWlmIChjID09ICdjJykgewotCQkJLyogLWMgaXMgdGhlIGxhc3Qgb3B0aW9uOyBmb2xsb3dpbmcgYXJndW1lbnRzCi0JCQkgICB0aGF0IGxvb2sgbGlrZSBvcHRpb25zIGFyZSBsZWZ0IGZvciB0aGUKLQkJCSAgIGNvbW1hbmQgdG8gaW50ZXJwcmV0LiAqLwotCQkJY29tbWFuZCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihfUHlPU19vcHRhcmcpICsgMik7Ci0JCQlpZiAoY29tbWFuZCA9PSBOVUxMKQotCQkJCVB5X0ZhdGFsRXJyb3IoCi0JCQkJICAgIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvcHkgLWMgYXJndW1lbnQiKTsKLQkJCXN0cmNweShjb21tYW5kLCBfUHlPU19vcHRhcmcpOwotCQkJc3RyY2F0KGNvbW1hbmQsICJcbiIpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICB3aGlsZSAoKGMgPSBfUHlPU19HZXRPcHQoYXJnYywgYXJndiwgUFJPR1JBTV9PUFRTKSkgIT0gRU9GKSB7CisgICAgICAgIGlmIChjID09ICdjJykgeworICAgICAgICAgICAgLyogLWMgaXMgdGhlIGxhc3Qgb3B0aW9uOyBmb2xsb3dpbmcgYXJndW1lbnRzCisgICAgICAgICAgICAgICB0aGF0IGxvb2sgbGlrZSBvcHRpb25zIGFyZSBsZWZ0IGZvciB0aGUKKyAgICAgICAgICAgICAgIGNvbW1hbmQgdG8gaW50ZXJwcmV0LiAqLworICAgICAgICAgICAgY29tbWFuZCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihfUHlPU19vcHRhcmcpICsgMik7CisgICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvcHkgLWMgYXJndW1lbnQiKTsKKyAgICAgICAgICAgIHN0cmNweShjb21tYW5kLCBfUHlPU19vcHRhcmcpOworICAgICAgICAgICAgc3RyY2F0KGNvbW1hbmQsICJcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlpZiAoYyA9PSAnbScpIHsKLQkJCS8qIC1tIGlzIHRoZSBsYXN0IG9wdGlvbjsgZm9sbG93aW5nIGFyZ3VtZW50cwotCQkJICAgdGhhdCBsb29rIGxpa2Ugb3B0aW9ucyBhcmUgbGVmdCBmb3IgdGhlCi0JCQkgICBtb2R1bGUgdG8gaW50ZXJwcmV0LiAqLwotCQkJbW9kdWxlID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKF9QeU9TX29wdGFyZykgKyAyKTsKLQkJCWlmIChtb2R1bGUgPT0gTlVMTCkKLQkJCQlQeV9GYXRhbEVycm9yKAotCQkJCSAgICJub3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IC1tIGFyZ3VtZW50Iik7Ci0JCQlzdHJjcHkobW9kdWxlLCBfUHlPU19vcHRhcmcpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaWYgKGMgPT0gJ20nKSB7CisgICAgICAgICAgICAvKiAtbSBpcyB0aGUgbGFzdCBvcHRpb247IGZvbGxvd2luZyBhcmd1bWVudHMKKyAgICAgICAgICAgICAgIHRoYXQgbG9vayBsaWtlIG9wdGlvbnMgYXJlIGxlZnQgZm9yIHRoZQorICAgICAgICAgICAgICAgbW9kdWxlIHRvIGludGVycHJldC4gKi8KKyAgICAgICAgICAgIG1vZHVsZSA9IChjaGFyICopbWFsbG9jKHN0cmxlbihfUHlPU19vcHRhcmcpICsgMik7CisgICAgICAgICAgICBpZiAobW9kdWxlID09IE5VTEwpCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigKKyAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgdG8gY29weSAtbSBhcmd1bWVudCIpOworICAgICAgICAgICAgc3RyY3B5KG1vZHVsZSwgX1B5T1Nfb3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgJ2InOgotCQkJUHlfQnl0ZXNXYXJuaW5nRmxhZysrOwotCQkJYnJlYWs7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgIFB5X0J5dGVzV2FybmluZ0ZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ2QnOgotCQkJUHlfRGVidWdGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICBQeV9EZWJ1Z0ZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJzMnOgotCQkJUHlfUHkza1dhcm5pbmdGbGFnKys7Ci0JCQlpZiAoIVB5X0RpdmlzaW9uV2FybmluZ0ZsYWcpCi0JCQkJUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICBQeV9QeTNrV2FybmluZ0ZsYWcrKzsKKyAgICAgICAgICAgIGlmICghUHlfRGl2aXNpb25XYXJuaW5nRmxhZykKKyAgICAgICAgICAgICAgICBQeV9EaXZpc2lvbldhcm5pbmdGbGFnID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ1EnOgotCQkJaWYgKHN0cmNtcChfUHlPU19vcHRhcmcsICJvbGQiKSA9PSAwKSB7Ci0JCQkJUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIndhcm4iKSA9PSAwKSB7Ci0JCQkJUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIndhcm5hbGwiKSA9PSAwKSB7Ci0JCQkJUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIm5ldyIpID09IDApIHsKLQkJCQkvKiBUaGlzIG9ubHkgYWZmZWN0cyBfX21haW5fXyAqLwotCQkJCWNmLmNmX2ZsYWdzIHw9IENPX0ZVVFVSRV9ESVZJU0lPTjsKLQkJCQkvKiBBbmQgdGhpcyB0ZWxscyB0aGUgZXZhbCBsb29wIHRvIHRyZWF0Ci0JCQkJICAgQklOQVJZX0RJVklERSBhcyBCSU5BUllfVFJVRV9ESVZJREUgKi8KLQkJCQlfUHlfUW5ld0ZsYWcgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIi1RIG9wdGlvbiBzaG91bGQgYmUgYC1Rb2xkJywgIgotCQkJCSJgLVF3YXJuJywgYC1Rd2FybmFsbCcsIG9yIGAtUW5ldycgb25seVxuIik7Ci0JCQlyZXR1cm4gdXNhZ2UoMiwgYXJndlswXSk7Ci0JCQkvKiBOT1RSRUFDSEVEICovCisgICAgICAgIGNhc2UgJ1EnOgorICAgICAgICAgICAgaWYgKHN0cmNtcChfUHlPU19vcHRhcmcsICJvbGQiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIndhcm4iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIndhcm5hbGwiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIm5ldyIpID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIG9ubHkgYWZmZWN0cyBfX21haW5fXyAqLworICAgICAgICAgICAgICAgIGNmLmNmX2ZsYWdzIHw9IENPX0ZVVFVSRV9ESVZJU0lPTjsKKyAgICAgICAgICAgICAgICAvKiBBbmQgdGhpcyB0ZWxscyB0aGUgZXZhbCBsb29wIHRvIHRyZWF0CisgICAgICAgICAgICAgICAgICAgQklOQVJZX0RJVklERSBhcyBCSU5BUllfVFJVRV9ESVZJREUgKi8KKyAgICAgICAgICAgICAgICBfUHlfUW5ld0ZsYWcgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIi1RIG9wdGlvbiBzaG91bGQgYmUgYC1Rb2xkJywgIgorICAgICAgICAgICAgICAgICJgLVF3YXJuJywgYC1Rd2FybmFsbCcsIG9yIGAtUW5ldycgb25seVxuIik7CisgICAgICAgICAgICByZXR1cm4gdXNhZ2UoMiwgYXJndlswXSk7CisgICAgICAgICAgICAvKiBOT1RSRUFDSEVEICovCiAKLQkJY2FzZSAnaSc6Ci0JCQlQeV9JbnNwZWN0RmxhZysrOwotCQkJUHlfSW50ZXJhY3RpdmVGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBQeV9JbnNwZWN0RmxhZysrOworICAgICAgICAgICAgUHlfSW50ZXJhY3RpdmVGbGFnKys7CisgICAgICAgICAgICBicmVhazsKIAotCQkvKiBjYXNlICdKJzogcmVzZXJ2ZWQgZm9yIEp5dGhvbiAqLworICAgICAgICAvKiBjYXNlICdKJzogcmVzZXJ2ZWQgZm9yIEp5dGhvbiAqLwogCi0JCWNhc2UgJ08nOgotCQkJUHlfT3B0aW1pemVGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnTyc6CisgICAgICAgICAgICBQeV9PcHRpbWl6ZUZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ0InOgotCQkJUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICBQeV9Eb250V3JpdGVCeXRlY29kZUZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ3MnOgotCQkJUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeSsrOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeSsrOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSAnUyc6Ci0JCQlQeV9Ob1NpdGVGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICBQeV9Ob1NpdGVGbGFnKys7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICdFJzoKLQkJCVB5X0lnbm9yZUVudmlyb25tZW50RmxhZysrOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnKys7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICd0JzoKLQkJCVB5X1RhYmNoZWNrRmxhZysrOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgUHlfVGFiY2hlY2tGbGFnKys7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICd1JzoKLQkJCXVuYnVmZmVyZWQrKzsKLQkJCXNhd191bmJ1ZmZlcmVkX2ZsYWcgPSAxOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgdW5idWZmZXJlZCsrOworICAgICAgICAgICAgc2F3X3VuYnVmZmVyZWRfZmxhZyA9IDE7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICd2JzoKLQkJCVB5X1ZlcmJvc2VGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICBQeV9WZXJib3NlRmxhZysrOworICAgICAgICAgICAgYnJlYWs7CiAKICNpZmRlZiBSSVNDT1MKLQkJY2FzZSAndyc6Ci0JCQlQeV9SSVNDT1NXaW1wRmxhZyA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICBQeV9SSVNDT1NXaW1wRmxhZyA9IDE7CisgICAgICAgICAgICBicmVhazsKICNlbmRpZgogCi0JCWNhc2UgJ3gnOgotCQkJc2tpcGZpcnN0bGluZSA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICBza2lwZmlyc3RsaW5lID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCS8qIGNhc2UgJ1gnOiByZXNlcnZlZCBmb3IgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYXJndW1lbnRzICovCisgICAgICAgIC8qIGNhc2UgJ1gnOiByZXNlcnZlZCBmb3IgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYXJndW1lbnRzICovCiAKLQkJY2FzZSAnVSc6Ci0JCQlQeV9Vbmljb2RlRmxhZysrOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2gnOgotCQljYXNlICc/JzoKLQkJCWhlbHArKzsKLQkJCWJyZWFrOwotCQljYXNlICdWJzoKLQkJCXZlcnNpb24rKzsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICdVJzoKKyAgICAgICAgICAgIFB5X1VuaWNvZGVGbGFnKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnaCc6CisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAgaGVscCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1YnOgorICAgICAgICAgICAgdmVyc2lvbisrOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSAnVyc6Ci0JCQlQeVN5c19BZGRXYXJuT3B0aW9uKF9QeU9TX29wdGFyZyk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICBQeVN5c19BZGRXYXJuT3B0aW9uKF9QeU9TX29wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKIAotCQkvKiBUaGlzIHNwYWNlIHJlc2VydmVkIGZvciBvdGhlciBvcHRpb25zICovCisgICAgICAgIC8qIFRoaXMgc3BhY2UgcmVzZXJ2ZWQgZm9yIG90aGVyIG9wdGlvbnMgKi8KIAotCQlkZWZhdWx0OgotCQkJcmV0dXJuIHVzYWdlKDIsIGFyZ3ZbMF0pOwotCQkJLypOT1RSRUFDSEVEKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB1c2FnZSgyLCBhcmd2WzBdKTsKKyAgICAgICAgICAgIC8qTk9UUkVBQ0hFRCovCiAKLQkJfQotCX0KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChoZWxwKQotCQlyZXR1cm4gdXNhZ2UoMCwgYXJndlswXSk7CisgICAgaWYgKGhlbHApCisgICAgICAgIHJldHVybiB1c2FnZSgwLCBhcmd2WzBdKTsKIAotCWlmICh2ZXJzaW9uKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiUHl0aG9uICVzXG4iLCBQWV9WRVJTSU9OKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICh2ZXJzaW9uKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUHl0aG9uICVzXG4iLCBQWV9WRVJTSU9OKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAmJiAhUHlfVGFiY2hlY2tGbGFnKQotCQkvKiAtMyBpbXBsaWVzIC10IChidXQgbm90IC10dCkgKi8KLQkJUHlfVGFiY2hlY2tGbGFnID0gMTsKKyAgICBpZiAoUHlfUHkza1dhcm5pbmdGbGFnICYmICFQeV9UYWJjaGVja0ZsYWcpCisgICAgICAgIC8qIC0zIGltcGxpZXMgLXQgKGJ1dCBub3QgLXR0KSAqLworICAgICAgICBQeV9UYWJjaGVja0ZsYWcgPSAxOwogCi0JaWYgKCFQeV9JbnNwZWN0RmxhZyAmJgotCSAgICAocCA9IFB5X0dFVEVOVigiUFlUSE9OSU5TUEVDVCIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9JbnNwZWN0RmxhZyA9IDE7Ci0JaWYgKCFzYXdfdW5idWZmZXJlZF9mbGFnICYmCi0JICAgIChwID0gUHlfR0VURU5WKCJQWVRIT05VTkJVRkZFUkVEIikpICYmICpwICE9ICdcMCcpCi0JCXVuYnVmZmVyZWQgPSAxOworICAgIGlmICghUHlfSW5zcGVjdEZsYWcgJiYKKyAgICAgICAgKHAgPSBQeV9HRVRFTlYoIlBZVEhPTklOU1BFQ1QiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfSW5zcGVjdEZsYWcgPSAxOworICAgIGlmICghc2F3X3VuYnVmZmVyZWRfZmxhZyAmJgorICAgICAgICAocCA9IFB5X0dFVEVOVigiUFlUSE9OVU5CVUZGRVJFRCIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICB1bmJ1ZmZlcmVkID0gMTsKIAotCWlmICghUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeSAmJgotCSAgICAocCA9IFB5X0dFVEVOVigiUFlUSE9OTk9VU0VSU0lURSIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9Ob1VzZXJTaXRlRGlyZWN0b3J5ID0gMTsKKyAgICBpZiAoIVB5X05vVXNlclNpdGVEaXJlY3RvcnkgJiYKKyAgICAgICAgKHAgPSBQeV9HRVRFTlYoIlBZVEhPTk5PVVNFUlNJVEUiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeSA9IDE7CiAKLQlpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTldBUk5JTkdTIikpICYmICpwICE9ICdcMCcpIHsKLQkJY2hhciAqYnVmLCAqd2FybmluZzsKKyAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTldBUk5JTkdTIikpICYmICpwICE9ICdcMCcpIHsKKyAgICAgICAgY2hhciAqYnVmLCAqd2FybmluZzsKIAotCQlidWYgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4ocCkgKyAxKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJUHlfRmF0YWxFcnJvcigKLQkJCSAgICJub3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IFBZVEhPTldBUk5JTkdTIik7Ci0JCXN0cmNweShidWYsIHApOwotCQlmb3IgKHdhcm5pbmcgPSBzdHJ0b2soYnVmLCAiLCIpOwotCQkgICAgIHdhcm5pbmcgIT0gTlVMTDsKLQkJICAgICB3YXJuaW5nID0gc3RydG9rKE5VTEwsICIsIikpCi0JCQlQeVN5c19BZGRXYXJuT3B0aW9uKHdhcm5pbmcpOwotCQlmcmVlKGJ1Zik7Ci0JfQorICAgICAgICBidWYgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4ocCkgKyAxKTsKKyAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigKKyAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IFBZVEhPTldBUk5JTkdTIik7CisgICAgICAgIHN0cmNweShidWYsIHApOworICAgICAgICBmb3IgKHdhcm5pbmcgPSBzdHJ0b2soYnVmLCAiLCIpOworICAgICAgICAgICAgIHdhcm5pbmcgIT0gTlVMTDsKKyAgICAgICAgICAgICB3YXJuaW5nID0gc3RydG9rKE5VTEwsICIsIikpCisgICAgICAgICAgICBQeVN5c19BZGRXYXJuT3B0aW9uKHdhcm5pbmcpOworICAgICAgICBmcmVlKGJ1Zik7CisgICAgfQogCi0JaWYgKGNvbW1hbmQgPT0gTlVMTCAmJiBtb2R1bGUgPT0gTlVMTCAmJiBfUHlPU19vcHRpbmQgPCBhcmdjICYmCi0JICAgIHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICItIikgIT0gMCkKLQl7CisgICAgaWYgKGNvbW1hbmQgPT0gTlVMTCAmJiBtb2R1bGUgPT0gTlVMTCAmJiBfUHlPU19vcHRpbmQgPCBhcmdjICYmCisgICAgICAgIHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICItIikgIT0gMCkKKyAgICB7CiAjaWZkZWYgX19WTVMKLQkJZmlsZW5hbWUgPSBkZWNjJHRyYW5zbGF0ZV92bXMoYXJndltfUHlPU19vcHRpbmRdKTsKLQkJaWYgKGZpbGVuYW1lID09IChjaGFyICopMCB8fCBmaWxlbmFtZSA9PSAoY2hhciAqKS0xKQotCQkJZmlsZW5hbWUgPSBhcmd2W19QeU9TX29wdGluZF07CisgICAgICAgIGZpbGVuYW1lID0gZGVjYyR0cmFuc2xhdGVfdm1zKGFyZ3ZbX1B5T1Nfb3B0aW5kXSk7CisgICAgICAgIGlmIChmaWxlbmFtZSA9PSAoY2hhciAqKTAgfHwgZmlsZW5hbWUgPT0gKGNoYXIgKiktMSkKKyAgICAgICAgICAgIGZpbGVuYW1lID0gYXJndltfUHlPU19vcHRpbmRdOwogCiAjZWxzZQotCQlmaWxlbmFtZSA9IGFyZ3ZbX1B5T1Nfb3B0aW5kXTsKKyAgICAgICAgZmlsZW5hbWUgPSBhcmd2W19QeU9TX29wdGluZF07CiAjZW5kaWYKLQl9CisgICAgfQogCi0Jc3RkaW5faXNfaW50ZXJhY3RpdmUgPSBQeV9GZElzSW50ZXJhY3RpdmUoc3RkaW4sIChjaGFyICopMCk7CisgICAgc3RkaW5faXNfaW50ZXJhY3RpdmUgPSBQeV9GZElzSW50ZXJhY3RpdmUoc3RkaW4sIChjaGFyICopMCk7CiAKLQlpZiAodW5idWZmZXJlZCkgeworICAgIGlmICh1bmJ1ZmZlcmVkKSB7CiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0JCV9zZXRtb2RlKGZpbGVubyhzdGRpbiksIE9fQklOQVJZKTsKLQkJX3NldG1vZGUoZmlsZW5vKHN0ZG91dCksIE9fQklOQVJZKTsKKyAgICAgICAgX3NldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpOworICAgICAgICBfc2V0bW9kZShmaWxlbm8oc3Rkb3V0KSwgT19CSU5BUlkpOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9TRVRWQlVGCi0JCXNldHZidWYoc3RkaW4sICAoY2hhciAqKU5VTEwsIF9JT05CRiwgQlVGU0laKTsKLQkJc2V0dmJ1ZihzdGRvdXQsIChjaGFyICopTlVMTCwgX0lPTkJGLCBCVUZTSVopOwotCQlzZXR2YnVmKHN0ZGVyciwgKGNoYXIgKilOVUxMLCBfSU9OQkYsIEJVRlNJWik7CisgICAgICAgIHNldHZidWYoc3RkaW4sICAoY2hhciAqKU5VTEwsIF9JT05CRiwgQlVGU0laKTsKKyAgICAgICAgc2V0dmJ1ZihzdGRvdXQsIChjaGFyICopTlVMTCwgX0lPTkJGLCBCVUZTSVopOworICAgICAgICBzZXR2YnVmKHN0ZGVyciwgKGNoYXIgKilOVUxMLCBfSU9OQkYsIEJVRlNJWik7CiAjZWxzZSAvKiAhSEFWRV9TRVRWQlVGICovCi0JCXNldGJ1ZihzdGRpbiwgIChjaGFyICopTlVMTCk7Ci0JCXNldGJ1ZihzdGRvdXQsIChjaGFyICopTlVMTCk7Ci0JCXNldGJ1ZihzdGRlcnIsIChjaGFyICopTlVMTCk7CisgICAgICAgIHNldGJ1ZihzdGRpbiwgIChjaGFyICopTlVMTCk7CisgICAgICAgIHNldGJ1ZihzdGRvdXQsIChjaGFyICopTlVMTCk7CisgICAgICAgIHNldGJ1ZihzdGRlcnIsIChjaGFyICopTlVMTCk7CiAjZW5kaWYgLyogIUhBVkVfU0VUVkJVRiAqLwotCX0KLQllbHNlIGlmIChQeV9JbnRlcmFjdGl2ZUZsYWcpIHsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlfSW50ZXJhY3RpdmVGbGFnKSB7CiAjaWZkZWYgTVNfV0lORE9XUwotCQkvKiBEb2Vzbid0IGhhdmUgdG8gaGF2ZSBsaW5lLWJ1ZmZlcmVkIC0tIHVzZSB1bmJ1ZmZlcmVkICovCi0JCS8qIEFueSBzZXRbdl1idWYoc3RkaW4sIC4uLikgc2NyZXdzIHVwIFRraW50ZXIgOi0oICovCi0JCXNldHZidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwsIF9JT05CRiwgQlVGU0laKTsKKyAgICAgICAgLyogRG9lc24ndCBoYXZlIHRvIGhhdmUgbGluZS1idWZmZXJlZCAtLSB1c2UgdW5idWZmZXJlZCAqLworICAgICAgICAvKiBBbnkgc2V0W3ZdYnVmKHN0ZGluLCAuLi4pIHNjcmV3cyB1cCBUa2ludGVyIDotKCAqLworICAgICAgICBzZXR2YnVmKHN0ZG91dCwgKGNoYXIgKilOVUxMLCBfSU9OQkYsIEJVRlNJWik7CiAjZWxzZSAvKiAhTVNfV0lORE9XUyAqLwogI2lmZGVmIEhBVkVfU0VUVkJVRgotCQlzZXR2YnVmKHN0ZGluLCAgKGNoYXIgKilOVUxMLCBfSU9MQkYsIEJVRlNJWik7Ci0JCXNldHZidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwsIF9JT0xCRiwgQlVGU0laKTsKKyAgICAgICAgc2V0dmJ1ZihzdGRpbiwgIChjaGFyICopTlVMTCwgX0lPTEJGLCBCVUZTSVopOworICAgICAgICBzZXR2YnVmKHN0ZG91dCwgKGNoYXIgKilOVUxMLCBfSU9MQkYsIEJVRlNJWik7CiAjZW5kaWYgLyogSEFWRV9TRVRWQlVGICovCiAjZW5kaWYgLyogIU1TX1dJTkRPV1MgKi8KLQkJLyogTGVhdmUgc3RkZXJyIGFsb25lIC0gaXQgc2hvdWxkIGJlIHVuYnVmZmVyZWQgYW55d2F5LiAqLwotICAJfQorICAgICAgICAvKiBMZWF2ZSBzdGRlcnIgYWxvbmUgLSBpdCBzaG91bGQgYmUgdW5idWZmZXJlZCBhbnl3YXkuICovCisgICAgfQogI2lmZGVmIF9fVk1TCi0JZWxzZSB7Ci0JCXNldHZidWYgKHN0ZG91dCwgKGNoYXIgKilOVUxMLCBfSU9MQkYsIEJVRlNJWik7Ci0JfQorICAgIGVsc2UgeworICAgICAgICBzZXR2YnVmIChzdGRvdXQsIChjaGFyICopTlVMTCwgX0lPTEJGLCBCVUZTSVopOworICAgIH0KICNlbmRpZiAvKiBfX1ZNUyAqLwogCiAjaWZkZWYgX19BUFBMRV9fCi0JLyogT24gTWFjT1MgWCwgd2hlbiB0aGUgUHl0aG9uIGludGVycHJldGVyIGlzIGVtYmVkZGVkIGluIGFuCi0JICAgYXBwbGljYXRpb24gYnVuZGxlLCBpdCBnZXRzIGV4ZWN1dGVkIGJ5IGEgYm9vdHN0cmFwcGluZyBzY3JpcHQKLQkgICB0aGF0IGRvZXMgb3MuZXhlY3ZlKCkgd2l0aCBhbiBhcmd2WzBdIHRoYXQncyBkaWZmZXJlbnQgZnJvbSB0aGUKLQkgICBhY3R1YWwgUHl0aG9uIGV4ZWN1dGFibGUuIFRoaXMgaXMgbmVlZGVkIHRvIGtlZXAgdGhlIEZpbmRlciBoYXBweSwKLQkgICBvciByYXRoZXIsIHRvIHdvcmsgYXJvdW5kIEFwcGxlJ3Mgb3Zlcmx5IHN0cmljdCByZXF1aXJlbWVudHMgb2YKLQkgICB0aGUgcHJvY2VzcyBuYW1lLiBIb3dldmVyLCB3ZSBzdGlsbCBuZWVkIGEgdXNhYmxlIHN5cy5leGVjdXRhYmxlLAotCSAgIHNvIHRoZSBhY3R1YWwgZXhlY3V0YWJsZSBwYXRoIGlzIHBhc3NlZCBpbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLQkgICBTZWUgTGliL3BsYXQtbWFjL2J1bmRsZWJ1aWxlci5weSBmb3IgZGV0YWlscyBhYm91dCB0aGUgYm9vdHN0cmFwCi0JICAgc2NyaXB0LiAqLwotCWlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9ORVhFQ1VUQUJMRSIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9TZXRQcm9ncmFtTmFtZShwKTsKLQllbHNlCi0JCVB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOworICAgIC8qIE9uIE1hY09TIFgsIHdoZW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyBlbWJlZGRlZCBpbiBhbgorICAgICAgIGFwcGxpY2F0aW9uIGJ1bmRsZSwgaXQgZ2V0cyBleGVjdXRlZCBieSBhIGJvb3RzdHJhcHBpbmcgc2NyaXB0CisgICAgICAgdGhhdCBkb2VzIG9zLmV4ZWN2ZSgpIHdpdGggYW4gYXJndlswXSB0aGF0J3MgZGlmZmVyZW50IGZyb20gdGhlCisgICAgICAgYWN0dWFsIFB5dGhvbiBleGVjdXRhYmxlLiBUaGlzIGlzIG5lZWRlZCB0byBrZWVwIHRoZSBGaW5kZXIgaGFwcHksCisgICAgICAgb3IgcmF0aGVyLCB0byB3b3JrIGFyb3VuZCBBcHBsZSdzIG92ZXJseSBzdHJpY3QgcmVxdWlyZW1lbnRzIG9mCisgICAgICAgdGhlIHByb2Nlc3MgbmFtZS4gSG93ZXZlciwgd2Ugc3RpbGwgbmVlZCBhIHVzYWJsZSBzeXMuZXhlY3V0YWJsZSwKKyAgICAgICBzbyB0aGUgYWN0dWFsIGV4ZWN1dGFibGUgcGF0aCBpcyBwYXNzZWQgaW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICAgU2VlIExpYi9wbGF0LW1hYy9idW5kbGVidWlsZXIucHkgZm9yIGRldGFpbHMgYWJvdXQgdGhlIGJvb3RzdHJhcAorICAgICAgIHNjcmlwdC4gKi8KKyAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTkVYRUNVVEFCTEUiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfU2V0UHJvZ3JhbU5hbWUocCk7CisgICAgZWxzZQorICAgICAgICBQeV9TZXRQcm9ncmFtTmFtZShhcmd2WzBdKTsKICNlbHNlCi0JUHlfU2V0UHJvZ3JhbU5hbWUoYXJndlswXSk7CisgICAgUHlfU2V0UHJvZ3JhbU5hbWUoYXJndlswXSk7CiAjZW5kaWYKLQlQeV9Jbml0aWFsaXplKCk7CisgICAgUHlfSW5pdGlhbGl6ZSgpOwogCi0JaWYgKFB5X1ZlcmJvc2VGbGFnIHx8Ci0JICAgIChjb21tYW5kID09IE5VTEwgJiYgZmlsZW5hbWUgPT0gTlVMTCAmJiBtb2R1bGUgPT0gTlVMTCAmJiBzdGRpbl9pc19pbnRlcmFjdGl2ZSkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJQeXRob24gJXMgb24gJXNcbiIsCi0JCQlQeV9HZXRWZXJzaW9uKCksIFB5X0dldFBsYXRmb3JtKCkpOwotIAkJaWYgKCFQeV9Ob1NpdGVGbGFnKQotIAkJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIENPUFlSSUdIVCk7Ci0JfQorICAgIGlmIChQeV9WZXJib3NlRmxhZyB8fAorICAgICAgICAoY29tbWFuZCA9PSBOVUxMICYmIGZpbGVuYW1lID09IE5VTEwgJiYgbW9kdWxlID09IE5VTEwgJiYgc3RkaW5faXNfaW50ZXJhY3RpdmUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUHl0aG9uICVzIG9uICVzXG4iLAorICAgICAgICAgICAgUHlfR2V0VmVyc2lvbigpLCBQeV9HZXRQbGF0Zm9ybSgpKTsKKyAgICAgICAgaWYgKCFQeV9Ob1NpdGVGbGFnKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgQ09QWVJJR0hUKTsKKyAgICB9CiAKLQlpZiAoY29tbWFuZCAhPSBOVUxMKSB7Ci0JCS8qIEJhY2t1cCBfUHlPU19vcHRpbmQgYW5kIGZvcmNlIHN5cy5hcmd2WzBdID0gJy1jJyAqLwotCQlfUHlPU19vcHRpbmQtLTsKLQkJYXJndltfUHlPU19vcHRpbmRdID0gIi1jIjsKLQl9CisgICAgaWYgKGNvbW1hbmQgIT0gTlVMTCkgeworICAgICAgICAvKiBCYWNrdXAgX1B5T1Nfb3B0aW5kIGFuZCBmb3JjZSBzeXMuYXJndlswXSA9ICctYycgKi8KKyAgICAgICAgX1B5T1Nfb3B0aW5kLS07CisgICAgICAgIGFyZ3ZbX1B5T1Nfb3B0aW5kXSA9ICItYyI7CisgICAgfQogCi0JaWYgKG1vZHVsZSAhPSBOVUxMKSB7Ci0JCS8qIEJhY2t1cCBfUHlPU19vcHRpbmQgYW5kIGZvcmNlIHN5cy5hcmd2WzBdID0gJy1tJwotCQkgICBzbyB0aGF0IFB5U3lzX1NldEFyZ3YgY29ycmVjdGx5IHNldHMgc3lzLnBhdGhbMF0gdG8gJycqLwotCQlfUHlPU19vcHRpbmQtLTsKLQkJYXJndltfUHlPU19vcHRpbmRdID0gIi1tIjsKLQl9CisgICAgaWYgKG1vZHVsZSAhPSBOVUxMKSB7CisgICAgICAgIC8qIEJhY2t1cCBfUHlPU19vcHRpbmQgYW5kIGZvcmNlIHN5cy5hcmd2WzBdID0gJy1tJworICAgICAgICAgICBzbyB0aGF0IFB5U3lzX1NldEFyZ3YgY29ycmVjdGx5IHNldHMgc3lzLnBhdGhbMF0gdG8gJycqLworICAgICAgICBfUHlPU19vcHRpbmQtLTsKKyAgICAgICAgYXJndltfUHlPU19vcHRpbmRdID0gIi1tIjsKKyAgICB9CiAKLQlQeVN5c19TZXRBcmd2KGFyZ2MtX1B5T1Nfb3B0aW5kLCBhcmd2K19QeU9TX29wdGluZCk7CisgICAgUHlTeXNfU2V0QXJndihhcmdjLV9QeU9TX29wdGluZCwgYXJnditfUHlPU19vcHRpbmQpOwogCi0JaWYgKChQeV9JbnNwZWN0RmxhZyB8fCAoY29tbWFuZCA9PSBOVUxMICYmIGZpbGVuYW1lID09IE5VTEwgJiYgbW9kdWxlID09IE5VTEwpKSAmJgotCSAgICBpc2F0dHkoZmlsZW5vKHN0ZGluKSkpIHsKLQkJUHlPYmplY3QgKnY7Ci0JCXYgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInJlYWRsaW5lIik7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlCi0JCQlQeV9ERUNSRUYodik7Ci0JfQorICAgIGlmICgoUHlfSW5zcGVjdEZsYWcgfHwgKGNvbW1hbmQgPT0gTlVMTCAmJiBmaWxlbmFtZSA9PSBOVUxMICYmIG1vZHVsZSA9PSBOVUxMKSkgJiYKKyAgICAgICAgaXNhdHR5KGZpbGVubyhzdGRpbikpKSB7CisgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICB2ID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJyZWFkbGluZSIpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIAotCWlmIChjb21tYW5kKSB7Ci0JCXN0cyA9IFB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzKGNvbW1hbmQsICZjZikgIT0gMDsKLQkJZnJlZShjb21tYW5kKTsKLQl9IGVsc2UgaWYgKG1vZHVsZSkgewotCQlzdHMgPSBSdW5Nb2R1bGUobW9kdWxlLCAxKTsKLQkJZnJlZShtb2R1bGUpOwotCX0KLQllbHNlIHsKKyAgICBpZiAoY29tbWFuZCkgeworICAgICAgICBzdHMgPSBQeVJ1bl9TaW1wbGVTdHJpbmdGbGFncyhjb21tYW5kLCAmY2YpICE9IDA7CisgICAgICAgIGZyZWUoY29tbWFuZCk7CisgICAgfSBlbHNlIGlmIChtb2R1bGUpIHsKKyAgICAgICAgc3RzID0gUnVuTW9kdWxlKG1vZHVsZSwgMSk7CisgICAgICAgIGZyZWUobW9kdWxlKTsKKyAgICB9CisgICAgZWxzZSB7CiAKLQkJaWYgKGZpbGVuYW1lID09IE5VTEwgJiYgc3RkaW5faXNfaW50ZXJhY3RpdmUpIHsKLQkJCVB5X0luc3BlY3RGbGFnID0gMDsgLyogZG8gZXhpdCBvbiBTeXN0ZW1FeGl0ICovCi0JCQlSdW5TdGFydHVwRmlsZSgmY2YpOwotCQl9Ci0JCS8qIFhYWCAqLworICAgICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCAmJiBzdGRpbl9pc19pbnRlcmFjdGl2ZSkgeworICAgICAgICAgICAgUHlfSW5zcGVjdEZsYWcgPSAwOyAvKiBkbyBleGl0IG9uIFN5c3RlbUV4aXQgKi8KKyAgICAgICAgICAgIFJ1blN0YXJ0dXBGaWxlKCZjZik7CisgICAgICAgIH0KKyAgICAgICAgLyogWFhYICovCiAKLQkJc3RzID0gLTE7CS8qIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB3ZSd2ZSBhbHJlYWR5IHJ1biBfX21haW5fXyAqLworICAgICAgICBzdHMgPSAtMTsgICAgICAgICAgICAgICAvKiBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UndmUgYWxyZWFkeSBydW4gX19tYWluX18gKi8KIAotCQlpZiAoZmlsZW5hbWUgIT0gTlVMTCkgewotCQkJc3RzID0gUnVuTWFpbkZyb21JbXBvcnRlcihmaWxlbmFtZSk7Ci0JCX0KKyAgICAgICAgaWYgKGZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0cyA9IFJ1bk1haW5Gcm9tSW1wb3J0ZXIoZmlsZW5hbWUpOworICAgICAgICB9CiAKLQkJaWYgKHN0cz09LTEgJiYgZmlsZW5hbWUhPU5VTEwpIHsKLQkJCWlmICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gZmlsZSAnJXMnOiBbRXJybm8gJWRdICVzXG4iLAotCQkJCQlhcmd2WzBdLCBmaWxlbmFtZSwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGlmIChzdHM9PS0xICYmIGZpbGVuYW1lIT1OVUxMKSB7CisgICAgICAgICAgICBpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuIGZpbGUgJyVzJzogW0Vycm5vICVkXSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgYXJndlswXSwgZmlsZW5hbWUsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogCi0JCQkJcmV0dXJuIDI7Ci0JCQl9Ci0JCQllbHNlIGlmIChza2lwZmlyc3RsaW5lKSB7Ci0JCQkJaW50IGNoOwotCQkJCS8qIFB1c2ggYmFjayBmaXJzdCBuZXdsaW5lIHNvIGxpbmUgbnVtYmVycwotCQkJCSAgIHJlbWFpbiB0aGUgc2FtZSAqLwotCQkJCXdoaWxlICgoY2ggPSBnZXRjKGZwKSkgIT0gRU9GKSB7Ci0JCQkJCWlmIChjaCA9PSAnXG4nKSB7Ci0JCQkJCQkodm9pZCl1bmdldGMoY2gsIGZwKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJewotCQkJCS8qIFhYWDogZG9lcyB0aGlzIHdvcmsgb24gV2luL1dpbjY0PyAoc2VlIHBvc2l4X2ZzdGF0KSAqLwotCQkJCXN0cnVjdCBzdGF0IHNiOwotCQkJCWlmIChmc3RhdChmaWxlbm8oZnApLCAmc2IpID09IDAgJiYKLQkJCQkgICAgU19JU0RJUihzYi5zdF9tb2RlKSkgewotCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAnJXMnIGlzIGEgZGlyZWN0b3J5LCBjYW5ub3QgY29udGludWVcbiIsIGFyZ3ZbMF0sIGZpbGVuYW1lKTsKLQkJCQkJZmNsb3NlKGZwKTsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChza2lwZmlyc3RsaW5lKSB7CisgICAgICAgICAgICAgICAgaW50IGNoOworICAgICAgICAgICAgICAgIC8qIFB1c2ggYmFjayBmaXJzdCBuZXdsaW5lIHNvIGxpbmUgbnVtYmVycworICAgICAgICAgICAgICAgICAgIHJlbWFpbiB0aGUgc2FtZSAqLworICAgICAgICAgICAgICAgIHdoaWxlICgoY2ggPSBnZXRjKGZwKSkgIT0gRU9GKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCl1bmdldGMoY2gsIGZwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFhYWDogZG9lcyB0aGlzIHdvcmsgb24gV2luL1dpbjY0PyAoc2VlIHBvc2l4X2ZzdGF0KSAqLworICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHNiOworICAgICAgICAgICAgICAgIGlmIChmc3RhdChmaWxlbm8oZnApLCAmc2IpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgU19JU0RJUihzYi5zdF9tb2RlKSkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAnJXMnIGlzIGEgZGlyZWN0b3J5LCBjYW5ub3QgY29udGludWVcbiIsIGFyZ3ZbMF0sIGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJaWYgKHN0cz09LTEpIHsKLQkJCS8qIGNhbGwgcGVuZGluZyBjYWxscyBsaWtlIHNpZ25hbCBoYW5kbGVycyAoU0lHSU5UKSAqLwotCQkJaWYgKFB5X01ha2VQZW5kaW5nQ2FsbHMoKSA9PSAtMSkgewotCQkJCVB5RXJyX1ByaW50KCk7Ci0JCQkJc3RzID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RzID0gUHlSdW5fQW55RmlsZUV4RmxhZ3MoCi0JCQkJCWZwLAotCQkJCQlmaWxlbmFtZSA9PSBOVUxMID8gIjxzdGRpbj4iIDogZmlsZW5hbWUsCi0JCQkJCWZpbGVuYW1lICE9IE5VTEwsICZjZikgIT0gMDsKLQkJCX0KLQkJfQotCQkKLQl9CisgICAgICAgIGlmIChzdHM9PS0xKSB7CisgICAgICAgICAgICAvKiBjYWxsIHBlbmRpbmcgY2FsbHMgbGlrZSBzaWduYWwgaGFuZGxlcnMgKFNJR0lOVCkgKi8KKyAgICAgICAgICAgIGlmIChQeV9NYWtlUGVuZGluZ0NhbGxzKCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgICAgIHN0cyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cyA9IFB5UnVuX0FueUZpbGVFeEZsYWdzKAorICAgICAgICAgICAgICAgICAgICBmcCwKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPT0gTlVMTCA/ICI8c3RkaW4+IiA6IGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSAhPSBOVUxMLCAmY2YpICE9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCS8qIENoZWNrIHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgYXQgdGhlIGVuZCwgdG8gZ2l2ZSBwcm9ncmFtcyB0aGUKLQkgKiBvcHBvcnR1bml0eSB0byBzZXQgaXQgZnJvbSBQeXRob24uCi0JICovCi0JaWYgKCFQeV9JbnNwZWN0RmxhZyAmJgotCSAgICAocCA9IFB5X0dFVEVOVigiUFlUSE9OSU5TUEVDVCIpKSAmJiAqcCAhPSAnXDAnKQotCXsKLQkJUHlfSW5zcGVjdEZsYWcgPSAxOwotCX0KKyAgICB9CiAKLQlpZiAoUHlfSW5zcGVjdEZsYWcgJiYgc3RkaW5faXNfaW50ZXJhY3RpdmUgJiYKLQkgICAgKGZpbGVuYW1lICE9IE5VTEwgfHwgY29tbWFuZCAhPSBOVUxMIHx8IG1vZHVsZSAhPSBOVUxMKSkgewotCQlQeV9JbnNwZWN0RmxhZyA9IDA7Ci0JCS8qIFhYWCAqLwotCQlzdHMgPSBQeVJ1bl9BbnlGaWxlRmxhZ3Moc3RkaW4sICI8c3RkaW4+IiwgJmNmKSAhPSAwOwotCX0KKyAgICAvKiBDaGVjayB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGF0IHRoZSBlbmQsIHRvIGdpdmUgcHJvZ3JhbXMgdGhlCisgICAgICogb3Bwb3J0dW5pdHkgdG8gc2V0IGl0IGZyb20gUHl0aG9uLgorICAgICAqLworICAgIGlmICghUHlfSW5zcGVjdEZsYWcgJiYKKyAgICAgICAgKHAgPSBQeV9HRVRFTlYoIlBZVEhPTklOU1BFQ1QiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICB7CisgICAgICAgIFB5X0luc3BlY3RGbGFnID0gMTsKKyAgICB9CiAKLQlQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9JbnNwZWN0RmxhZyAmJiBzdGRpbl9pc19pbnRlcmFjdGl2ZSAmJgorICAgICAgICAoZmlsZW5hbWUgIT0gTlVMTCB8fCBjb21tYW5kICE9IE5VTEwgfHwgbW9kdWxlICE9IE5VTEwpKSB7CisgICAgICAgIFB5X0luc3BlY3RGbGFnID0gMDsKKyAgICAgICAgLyogWFhYICovCisgICAgICAgIHN0cyA9IFB5UnVuX0FueUZpbGVGbGFncyhzdGRpbiwgIjxzdGRpbj4iLCAmY2YpICE9IDA7CisgICAgfQorCisgICAgUHlfRmluYWxpemUoKTsKICNpZmRlZiBSSVNDT1MKLQlpZiAoUHlfUklTQ09TV2ltcEZsYWcpCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJceDBjcVx4MGMiKTsgLyogbWFrZSBmcm9udGVuZCBxdWl0ICovCisgICAgaWYgKFB5X1JJU0NPU1dpbXBGbGFnKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlx4MGNxXHgwYyIpOyAvKiBtYWtlIGZyb250ZW5kIHF1aXQgKi8KICNlbmRpZgogCiAjaWZkZWYgX19JTlNVUkVfXwotCS8qIEluc3VyZSsrIGlzIGEgbWVtb3J5IGFuYWx5c2lzIHRvb2wgdGhhdCBhaWRzIGluIGRpc2NvdmVyaW5nCi0JICogbWVtb3J5IGxlYWtzIGFuZCBvdGhlciBtZW1vcnkgcHJvYmxlbXMuICBPbiBQeXRob24gZXhpdCwgdGhlCi0JICogaW50ZXJuZWQgc3RyaW5nIGRpY3Rpb25hcnkgaXMgZmxhZ2dlZCBhcyBiZWluZyBpbiB1c2UgYXQgZXhpdAotCSAqICh3aGljaCBpdCBpcykuICBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgdGhpcyBpcyBmaW5lIGJlY2F1c2UKLQkgKiB0aGUgbWVtb3J5IHdpbGwgYmUgYXV0b21hdGljYWxseSByZWNsYWltZWQgYnkgdGhlIHN5c3RlbS4gIFVuZGVyCi0JICogbWVtb3J5IGRlYnVnZ2luZywgaXQncyBhIGh1Z2Ugc291cmNlIG9mIHVzZWxlc3Mgbm9pc2UsIHNvIHdlCi0JICogdHJhZGUgb2ZmIHNsb3dlciBzaHV0ZG93biBmb3IgbGVzcyBkaXN0cmFjdGlvbiBpbiB0aGUgbWVtb3J5Ci0JICogcmVwb3J0cy4gIC1iYXcKLQkgKi8KLQlfUHlfUmVsZWFzZUludGVybmVkU3RyaW5ncygpOworICAgIC8qIEluc3VyZSsrIGlzIGEgbWVtb3J5IGFuYWx5c2lzIHRvb2wgdGhhdCBhaWRzIGluIGRpc2NvdmVyaW5nCisgICAgICogbWVtb3J5IGxlYWtzIGFuZCBvdGhlciBtZW1vcnkgcHJvYmxlbXMuICBPbiBQeXRob24gZXhpdCwgdGhlCisgICAgICogaW50ZXJuZWQgc3RyaW5nIGRpY3Rpb25hcnkgaXMgZmxhZ2dlZCBhcyBiZWluZyBpbiB1c2UgYXQgZXhpdAorICAgICAqICh3aGljaCBpdCBpcykuICBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgdGhpcyBpcyBmaW5lIGJlY2F1c2UKKyAgICAgKiB0aGUgbWVtb3J5IHdpbGwgYmUgYXV0b21hdGljYWxseSByZWNsYWltZWQgYnkgdGhlIHN5c3RlbS4gIFVuZGVyCisgICAgICogbWVtb3J5IGRlYnVnZ2luZywgaXQncyBhIGh1Z2Ugc291cmNlIG9mIHVzZWxlc3Mgbm9pc2UsIHNvIHdlCisgICAgICogdHJhZGUgb2ZmIHNsb3dlciBzaHV0ZG93biBmb3IgbGVzcyBkaXN0cmFjdGlvbiBpbiB0aGUgbWVtb3J5CisgICAgICogcmVwb3J0cy4gIC1iYXcKKyAgICAgKi8KKyAgICBfUHlfUmVsZWFzZUludGVybmVkU3RyaW5ncygpOwogI2VuZGlmIC8qIF9fSU5TVVJFX18gKi8KIAotCXJldHVybiBzdHM7CisgICAgcmV0dXJuIHN0czsKIH0KIAogLyogdGhpcyBpcyBnb25uYSBzZWVtICpyZWFsIHdlaXJkKiwgYnV0IGlmIHlvdSBwdXQgc29tZSBvdGhlciBjb2RlIGJldHdlZW4KQEAgLTY1MSw4ICs2NTEsOCBAQAogdm9pZAogUHlfR2V0QXJnY0FyZ3YoaW50ICphcmdjLCBjaGFyICoqKmFyZ3YpCiB7Ci0JKmFyZ2MgPSBvcmlnX2FyZ2M7Ci0JKmFyZ3YgPSBvcmlnX2FyZ3Y7CisgICAgKmFyZ2MgPSBvcmlnX2FyZ2M7CisgICAgKmFyZ3YgPSBvcmlnX2FyZ3Y7CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tYXRobW9kdWxlLmMgYi9Nb2R1bGVzL21hdGhtb2R1bGUuYwppbmRleCAyZGQ3YTY2Li43N2I1NmEwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL21hdGhtb2R1bGUuYworKysgYi9Nb2R1bGVzL21hdGhtb2R1bGUuYwpAQCAtNzMsMzYgKzczLDM2IEBACiBzdGF0aWMgZG91YmxlCiBzaW5waShkb3VibGUgeCkKIHsKLQlkb3VibGUgeSwgcjsKLQlpbnQgbjsKLQkvKiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGV2ZXIgYmUgY2FsbGVkIGZvciBmaW5pdGUgYXJndW1lbnRzICovCi0JYXNzZXJ0KFB5X0lTX0ZJTklURSh4KSk7Ci0JeSA9IGZtb2QoZmFicyh4KSwgMi4wKTsKLQluID0gKGludClyb3VuZCgyLjAqeSk7Ci0JYXNzZXJ0KDAgPD0gbiAmJiBuIDw9IDQpOwotCXN3aXRjaCAobikgewotCWNhc2UgMDoKLQkJciA9IHNpbihwaSp5KTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlyID0gY29zKHBpKih5LTAuNSkpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCS8qIE4uQi4gLXNpbihwaSooeS0xLjApKSBpcyAqbm90KiBlcXVpdmFsZW50OiBpdCB3b3VsZCBnaXZlCi0JCSAgIC0wLjAgaW5zdGVhZCBvZiAwLjAgd2hlbiB5ID09IDEuMC4gKi8KLQkJciA9IHNpbihwaSooMS4wLXkpKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlyID0gLWNvcyhwaSooeS0xLjUpKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlyID0gc2luKHBpKih5LTIuMCkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlhc3NlcnQoMCk7ICAvKiBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KLQkJciA9IC0xLjIzZTIwMDsgLyogc2lsZW5jZSBnY2Mgd2FybmluZyAqLwotCX0KLQlyZXR1cm4gY29weXNpZ24oMS4wLCB4KSpyOworICAgIGRvdWJsZSB5LCByOworICAgIGludCBuOworICAgIC8qIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgZXZlciBiZSBjYWxsZWQgZm9yIGZpbml0ZSBhcmd1bWVudHMgKi8KKyAgICBhc3NlcnQoUHlfSVNfRklOSVRFKHgpKTsKKyAgICB5ID0gZm1vZChmYWJzKHgpLCAyLjApOworICAgIG4gPSAoaW50KXJvdW5kKDIuMCp5KTsKKyAgICBhc3NlcnQoMCA8PSBuICYmIG4gPD0gNCk7CisgICAgc3dpdGNoIChuKSB7CisgICAgY2FzZSAwOgorICAgICAgICByID0gc2luKHBpKnkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHIgPSBjb3MocGkqKHktMC41KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgLyogTi5CLiAtc2luKHBpKih5LTEuMCkpIGlzICpub3QqIGVxdWl2YWxlbnQ6IGl0IHdvdWxkIGdpdmUKKyAgICAgICAgICAgLTAuMCBpbnN0ZWFkIG9mIDAuMCB3aGVuIHkgPT0gMS4wLiAqLworICAgICAgICByID0gc2luKHBpKigxLjAteSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIHIgPSAtY29zKHBpKih5LTEuNSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHIgPSBzaW4ocGkqKHktMi4wKSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCgwKTsgIC8qIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworICAgICAgICByID0gLTEuMjNlMjAwOyAvKiBzaWxlbmNlIGdjYyB3YXJuaW5nICovCisgICAgfQorICAgIHJldHVybiBjb3B5c2lnbigxLjAsIHgpKnI7CiB9CiAKIC8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSByZWFsIGdhbW1hIGZ1bmN0aW9uLiAgSW4gZXh0ZW5zaXZlIGJ1dCBub24tZXhoYXVzdGl2ZQpAQCAtMTY2LDM0ICsxNjYsMzQgQEAKIHN0YXRpYyBjb25zdCBkb3VibGUgbGFuY3pvc19nID0gNi4wMjQ2ODAwNDA3NzY3Mjk1ODM3NDAyMzQzNzU7CiBzdGF0aWMgY29uc3QgZG91YmxlIGxhbmN6b3NfZ19taW51c19oYWxmID0gNS41MjQ2ODAwNDA3NzY3Mjk1ODM3NDAyMzQzNzU7CiBzdGF0aWMgY29uc3QgZG91YmxlIGxhbmN6b3NfbnVtX2NvZWZmc1tMQU5DWk9TX05dID0gewotCTIzNTMxMzc2ODgwLjQxMDc1OTY4ODU3MjAwNzY3NDQ1MTYzNjc1NDczNDg0NjgwNDk0MCwKLQk0MjkxOTgwMzY0Mi42NDkwOTg3Njg5NTc4OTkwNDcwMDE5ODg4NTA5MjYzNTU4NDg5NTksCi0JMzU3MTE5NTkyMzcuMzU1NjY4MDQ5NDQwMTg1NDUxNTQ3MTY2NzA1OTYwNDg4NjM1ODQzLAotCTE3OTIxMDM0NDI2LjAzNzIwOTY5OTkxOTc1NTc1NDQ1ODkzMTExMjY3MTQwMzI2NTM5MCwKLQk2MDM5NTQyNTg2LjM1MjAyODAwNTA2NDI5MTY0NDMwNzI5NzkyMTA2OTkzODg0MjA3MDgsCi0JMTQzOTcyMDQwNy4zMTE3MjE2NzM2NjMyMjMwNzI3OTQ5MTIzOTM5NzE1NDg1Nzg2NzcyLAotCTI0ODg3NDU1Ny44NjIwNTQxNTY1MTE0NjAzODY0MTMyMjk0MjMyMTYzMjEyNTEyNzgwMSwKLQkzMTQyNjQxNS41ODU0MDAxOTQzODA2MTQyMzE2MjgzMTgyMDUzNjI4NzQ2ODQ5ODc2NDAsCi0JMjg3NjM3MC42Mjg5MzUzNzI0NDEyMjU0MDkwNTE2MjA4NDk2MTM1OTkxMTQ1Mzc4NzY4LAotCTE4NjA1Ni4yNjUzOTUyMjM0OTUwNDAyOTQ5ODk3MTYwNDU2OTkyODIyMDc4NDIzNjMyOCwKLQk4MDcxLjY3MjAwMjM2NTgxNjIxMDYzODAwMjkwMjI3MjI1MDYxMzgyMTg1MTYzMjUwMjQsCi0JMjEwLjgyNDI3Nzc1MTU3OTM0NTg3MjUwOTczMzkyMDcxMzM2MjcxMTY2OTY5NTgwMjkxLAotCTIuNTA2NjI4Mjc0NjMxMDAwMjcwMTY0OTA4MTc3MTMzODM3MzM4NjI2NDMxMDc5MzQwOAorICAgIDIzNTMxMzc2ODgwLjQxMDc1OTY4ODU3MjAwNzY3NDQ1MTYzNjc1NDczNDg0NjgwNDk0MCwKKyAgICA0MjkxOTgwMzY0Mi42NDkwOTg3Njg5NTc4OTkwNDcwMDE5ODg4NTA5MjYzNTU4NDg5NTksCisgICAgMzU3MTE5NTkyMzcuMzU1NjY4MDQ5NDQwMTg1NDUxNTQ3MTY2NzA1OTYwNDg4NjM1ODQzLAorICAgIDE3OTIxMDM0NDI2LjAzNzIwOTY5OTkxOTc1NTc1NDQ1ODkzMTExMjY3MTQwMzI2NTM5MCwKKyAgICA2MDM5NTQyNTg2LjM1MjAyODAwNTA2NDI5MTY0NDMwNzI5NzkyMTA2OTkzODg0MjA3MDgsCisgICAgMTQzOTcyMDQwNy4zMTE3MjE2NzM2NjMyMjMwNzI3OTQ5MTIzOTM5NzE1NDg1Nzg2NzcyLAorICAgIDI0ODg3NDU1Ny44NjIwNTQxNTY1MTE0NjAzODY0MTMyMjk0MjMyMTYzMjEyNTEyNzgwMSwKKyAgICAzMTQyNjQxNS41ODU0MDAxOTQzODA2MTQyMzE2MjgzMTgyMDUzNjI4NzQ2ODQ5ODc2NDAsCisgICAgMjg3NjM3MC42Mjg5MzUzNzI0NDEyMjU0MDkwNTE2MjA4NDk2MTM1OTkxMTQ1Mzc4NzY4LAorICAgIDE4NjA1Ni4yNjUzOTUyMjM0OTUwNDAyOTQ5ODk3MTYwNDU2OTkyODIyMDc4NDIzNjMyOCwKKyAgICA4MDcxLjY3MjAwMjM2NTgxNjIxMDYzODAwMjkwMjI3MjI1MDYxMzgyMTg1MTYzMjUwMjQsCisgICAgMjEwLjgyNDI3Nzc1MTU3OTM0NTg3MjUwOTczMzkyMDcxMzM2MjcxMTY2OTY5NTgwMjkxLAorICAgIDIuNTA2NjI4Mjc0NjMxMDAwMjcwMTY0OTA4MTc3MTMzODM3MzM4NjI2NDMxMDc5MzQwOAogfTsKIAogLyogZGVub21pbmF0b3IgaXMgeCooeCsxKSouLi4qKHgrTEFOQ1pPU19OLTIpICovCiBzdGF0aWMgY29uc3QgZG91YmxlIGxhbmN6b3NfZGVuX2NvZWZmc1tMQU5DWk9TX05dID0gewotCTAuMCwgMzk5MTY4MDAuMCwgMTIwNTQzODQwLjAsIDE1MDkxNzk3Ni4wLCAxMDUyNTgwNzYuMCwgNDU5OTU3MzAuMCwKLQkxMzMzOTUzNS4wLCAyNjM3NTU4LjAsIDM1NzQyMy4wLCAzMjY3MC4wLCAxOTI1LjAsIDY2LjAsIDEuMH07CisgICAgMC4wLCAzOTkxNjgwMC4wLCAxMjA1NDM4NDAuMCwgMTUwOTE3OTc2LjAsIDEwNTI1ODA3Ni4wLCA0NTk5NTczMC4wLAorICAgIDEzMzM5NTM1LjAsIDI2Mzc1NTguMCwgMzU3NDIzLjAsIDMyNjcwLjAsIDE5MjUuMCwgNjYuMCwgMS4wfTsKIAogLyogZ2FtbWEgdmFsdWVzIGZvciBzbWFsbCBwb3NpdGl2ZSBpbnRlZ2VycywgMSB0aG91Z2ggTkdBTU1BX0lOVEVHUkFMICovCiAjZGVmaW5lIE5HQU1NQV9JTlRFR1JBTCAyMwogc3RhdGljIGNvbnN0IGRvdWJsZSBnYW1tYV9pbnRlZ3JhbFtOR0FNTUFfSU5URUdSQUxdID0gewotCTEuMCwgMS4wLCAyLjAsIDYuMCwgMjQuMCwgMTIwLjAsIDcyMC4wLCA1MDQwLjAsIDQwMzIwLjAsIDM2Mjg4MC4wLAotCTM2Mjg4MDAuMCwgMzk5MTY4MDAuMCwgNDc5MDAxNjAwLjAsIDYyMjcwMjA4MDAuMCwgODcxNzgyOTEyMDAuMCwKLQkxMzA3Njc0MzY4MDAwLjAsIDIwOTIyNzg5ODg4MDAwLjAsIDM1NTY4NzQyODA5NjAwMC4wLAotCTY0MDIzNzM3MDU3MjgwMDAuMCwgMTIxNjQ1MTAwNDA4ODMyMDAwLjAsIDI0MzI5MDIwMDgxNzY2NDAwMDAuMCwKLQk1MTA5MDk0MjE3MTcwOTQ0MDAwMC4wLCAxMTI0MDAwNzI3Nzc3NjA3NjgwMDAwLjAsCisgICAgMS4wLCAxLjAsIDIuMCwgNi4wLCAyNC4wLCAxMjAuMCwgNzIwLjAsIDUwNDAuMCwgNDAzMjAuMCwgMzYyODgwLjAsCisgICAgMzYyODgwMC4wLCAzOTkxNjgwMC4wLCA0NzkwMDE2MDAuMCwgNjIyNzAyMDgwMC4wLCA4NzE3ODI5MTIwMC4wLAorICAgIDEzMDc2NzQzNjgwMDAuMCwgMjA5MjI3ODk4ODgwMDAuMCwgMzU1Njg3NDI4MDk2MDAwLjAsCisgICAgNjQwMjM3MzcwNTcyODAwMC4wLCAxMjE2NDUxMDA0MDg4MzIwMDAuMCwgMjQzMjkwMjAwODE3NjY0MDAwMC4wLAorICAgIDUxMDkwOTQyMTcxNzA5NDQwMDAwLjAsIDExMjQwMDA3Mjc3Nzc2MDc2ODAwMDAuMCwKIH07CiAKIC8qIExhbmN6b3MnIHN1bSBMX2coeCksIGZvciBwb3NpdGl2ZSB4ICovCkBAIC0yMDEsMTI1ICsyMDEsMTI1IEBACiBzdGF0aWMgZG91YmxlCiBsYW5jem9zX3N1bShkb3VibGUgeCkKIHsKLQlkb3VibGUgbnVtID0gMC4wLCBkZW4gPSAwLjA7Ci0JaW50IGk7Ci0JYXNzZXJ0KHggPiAwLjApOwotCS8qIGV2YWx1YXRlIHRoZSByYXRpb25hbCBmdW5jdGlvbiBsYW5jem9zX3N1bSh4KS4gIEZvciBsYXJnZQotCSAgIHgsIHRoZSBvYnZpb3VzIGFsZ29yaXRobSByaXNrcyBvdmVyZmxvdywgc28gd2UgaW5zdGVhZAotCSAgIHJlc2NhbGUgdGhlIGRlbm9taW5hdG9yIGFuZCBudW1lcmF0b3Igb2YgdGhlIHJhdGlvbmFsCi0JICAgZnVuY3Rpb24gYnkgeCoqKDEtTEFOQ1pPU19OKSBhbmQgdHJlYXQgdGhpcyBhcyBhCi0JICAgcmF0aW9uYWwgZnVuY3Rpb24gaW4gMS94LiAgVGhpcyBhbHNvIHJlZHVjZXMgdGhlIGVycm9yIGZvcgotCSAgIGxhcmdlciB4IHZhbHVlcy4gIFRoZSBjaG9pY2Ugb2YgY3V0b2ZmIHBvaW50ICg1LjAgYmVsb3cpIGlzCi0JICAgc29tZXdoYXQgYXJiaXRyYXJ5OyBpbiB0ZXN0cywgc21hbGxlciBjdXRvZmYgdmFsdWVzIHRoYW4KLQkgICB0aGlzIHJlc3VsdGVkIGluIGxvd2VyIGFjY3VyYWN5LiAqLwotCWlmICh4IDwgNS4wKSB7Ci0JCWZvciAoaSA9IExBTkNaT1NfTjsgLS1pID49IDA7ICkgewotCQkJbnVtID0gbnVtICogeCArIGxhbmN6b3NfbnVtX2NvZWZmc1tpXTsKLQkJCWRlbiA9IGRlbiAqIHggKyBsYW5jem9zX2Rlbl9jb2VmZnNbaV07Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBMQU5DWk9TX047IGkrKykgewotCQkJbnVtID0gbnVtIC8geCArIGxhbmN6b3NfbnVtX2NvZWZmc1tpXTsKLQkJCWRlbiA9IGRlbiAvIHggKyBsYW5jem9zX2Rlbl9jb2VmZnNbaV07Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bS9kZW47CisgICAgZG91YmxlIG51bSA9IDAuMCwgZGVuID0gMC4wOworICAgIGludCBpOworICAgIGFzc2VydCh4ID4gMC4wKTsKKyAgICAvKiBldmFsdWF0ZSB0aGUgcmF0aW9uYWwgZnVuY3Rpb24gbGFuY3pvc19zdW0oeCkuICBGb3IgbGFyZ2UKKyAgICAgICB4LCB0aGUgb2J2aW91cyBhbGdvcml0aG0gcmlza3Mgb3ZlcmZsb3csIHNvIHdlIGluc3RlYWQKKyAgICAgICByZXNjYWxlIHRoZSBkZW5vbWluYXRvciBhbmQgbnVtZXJhdG9yIG9mIHRoZSByYXRpb25hbAorICAgICAgIGZ1bmN0aW9uIGJ5IHgqKigxLUxBTkNaT1NfTikgYW5kIHRyZWF0IHRoaXMgYXMgYQorICAgICAgIHJhdGlvbmFsIGZ1bmN0aW9uIGluIDEveC4gIFRoaXMgYWxzbyByZWR1Y2VzIHRoZSBlcnJvciBmb3IKKyAgICAgICBsYXJnZXIgeCB2YWx1ZXMuICBUaGUgY2hvaWNlIG9mIGN1dG9mZiBwb2ludCAoNS4wIGJlbG93KSBpcworICAgICAgIHNvbWV3aGF0IGFyYml0cmFyeTsgaW4gdGVzdHMsIHNtYWxsZXIgY3V0b2ZmIHZhbHVlcyB0aGFuCisgICAgICAgdGhpcyByZXN1bHRlZCBpbiBsb3dlciBhY2N1cmFjeS4gKi8KKyAgICBpZiAoeCA8IDUuMCkgeworICAgICAgICBmb3IgKGkgPSBMQU5DWk9TX047IC0taSA+PSAwOyApIHsKKyAgICAgICAgICAgIG51bSA9IG51bSAqIHggKyBsYW5jem9zX251bV9jb2VmZnNbaV07CisgICAgICAgICAgICBkZW4gPSBkZW4gKiB4ICsgbGFuY3pvc19kZW5fY29lZmZzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTEFOQ1pPU19OOyBpKyspIHsKKyAgICAgICAgICAgIG51bSA9IG51bSAvIHggKyBsYW5jem9zX251bV9jb2VmZnNbaV07CisgICAgICAgICAgICBkZW4gPSBkZW4gLyB4ICsgbGFuY3pvc19kZW5fY29lZmZzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudW0vZGVuOwogfQogCiBzdGF0aWMgZG91YmxlCiBtX3RnYW1tYShkb3VibGUgeCkKIHsKLQlkb3VibGUgYWJzeCwgciwgeSwgeiwgc3FydHBvdzsKKyAgICBkb3VibGUgYWJzeCwgciwgeSwgeiwgc3FydHBvdzsKIAotCS8qIHNwZWNpYWwgY2FzZXMgKi8KLQlpZiAoIVB5X0lTX0ZJTklURSh4KSkgewotCQlpZiAoUHlfSVNfTkFOKHgpIHx8IHggPiAwLjApCi0JCQlyZXR1cm4geDsgIC8qIHRnYW1tYShuYW4pID0gbmFuLCB0Z2FtbWEoaW5mKSA9IGluZiAqLwotCQllbHNlIHsKLQkJCWVycm5vID0gRURPTTsKLQkJCXJldHVybiBQeV9OQU47ICAvKiB0Z2FtbWEoLWluZikgPSBuYW4sIGludmFsaWQgKi8KLQkJfQotCX0KLQlpZiAoeCA9PSAwLjApIHsKLQkJZXJybm8gPSBFRE9NOwotCQlyZXR1cm4gMS4wL3g7IC8qIHRnYW1tYSgrLTAuMCkgPSArLWluZiwgZGl2aWRlLWJ5LXplcm8gKi8KLQl9CisgICAgLyogc3BlY2lhbCBjYXNlcyAqLworICAgIGlmICghUHlfSVNfRklOSVRFKHgpKSB7CisgICAgICAgIGlmIChQeV9JU19OQU4oeCkgfHwgeCA+IDAuMCkKKyAgICAgICAgICAgIHJldHVybiB4OyAgLyogdGdhbW1hKG5hbikgPSBuYW4sIHRnYW1tYShpbmYpID0gaW5mICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICAgICAgcmV0dXJuIFB5X05BTjsgIC8qIHRnYW1tYSgtaW5mKSA9IG5hbiwgaW52YWxpZCAqLworICAgICAgICB9CisgICAgfQorICAgIGlmICh4ID09IDAuMCkgeworICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIHJldHVybiAxLjAveDsgLyogdGdhbW1hKCstMC4wKSA9ICstaW5mLCBkaXZpZGUtYnktemVybyAqLworICAgIH0KIAotCS8qIGludGVnZXIgYXJndW1lbnRzICovCi0JaWYgKHggPT0gZmxvb3IoeCkpIHsKLQkJaWYgKHggPCAwLjApIHsKLQkJCWVycm5vID0gRURPTTsgIC8qIHRnYW1tYShuKSA9IG5hbiwgaW52YWxpZCBmb3IgKi8KLQkJCXJldHVybiBQeV9OQU47IC8qIG5lZ2F0aXZlIGludGVnZXJzIG4gKi8KLQkJfQotCQlpZiAoeCA8PSBOR0FNTUFfSU5URUdSQUwpCi0JCQlyZXR1cm4gZ2FtbWFfaW50ZWdyYWxbKGludCl4IC0gMV07Ci0JfQotCWFic3ggPSBmYWJzKHgpOworICAgIC8qIGludGVnZXIgYXJndW1lbnRzICovCisgICAgaWYgKHggPT0gZmxvb3IoeCkpIHsKKyAgICAgICAgaWYgKHggPCAwLjApIHsKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsgIC8qIHRnYW1tYShuKSA9IG5hbiwgaW52YWxpZCBmb3IgKi8KKyAgICAgICAgICAgIHJldHVybiBQeV9OQU47IC8qIG5lZ2F0aXZlIGludGVnZXJzIG4gKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoeCA8PSBOR0FNTUFfSU5URUdSQUwpCisgICAgICAgICAgICByZXR1cm4gZ2FtbWFfaW50ZWdyYWxbKGludCl4IC0gMV07CisgICAgfQorICAgIGFic3ggPSBmYWJzKHgpOwogCi0JLyogdGlueSBhcmd1bWVudHM6ICB0Z2FtbWEoeCkgfiAxL3ggZm9yIHggbmVhciAwICovCi0JaWYgKGFic3ggPCAxZS0yMCkgewotCQlyID0gMS4wL3g7Ci0JCWlmIChQeV9JU19JTkZJTklUWShyKSkKLQkJCWVycm5vID0gRVJBTkdFOwotCQlyZXR1cm4gcjsKLQl9CisgICAgLyogdGlueSBhcmd1bWVudHM6ICB0Z2FtbWEoeCkgfiAxL3ggZm9yIHggbmVhciAwICovCisgICAgaWYgKGFic3ggPCAxZS0yMCkgeworICAgICAgICByID0gMS4wL3g7CisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWShyKSkKKyAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CiAKLQkvKiBsYXJnZSBhcmd1bWVudHM6IGFzc3VtaW5nIElFRUUgNzU0IGRvdWJsZXMsIHRnYW1tYSh4KSBvdmVyZmxvd3MgZm9yCi0JICAgeCA+IDIwMCwgYW5kIHVuZGVyZmxvd3MgdG8gKy0wLjAgZm9yIHggPCAtMjAwLCBub3QgYSBuZWdhdGl2ZQotCSAgIGludGVnZXIuICovCi0JaWYgKGFic3ggPiAyMDAuMCkgewotCQlpZiAoeCA8IDAuMCkgewotCQkJcmV0dXJuIDAuMC9zaW5waSh4KTsKLQkJfQotCQllbHNlIHsKLQkJCWVycm5vID0gRVJBTkdFOwotCQkJcmV0dXJuIFB5X0hVR0VfVkFMOwotCQl9Ci0JfQorICAgIC8qIGxhcmdlIGFyZ3VtZW50czogYXNzdW1pbmcgSUVFRSA3NTQgZG91YmxlcywgdGdhbW1hKHgpIG92ZXJmbG93cyBmb3IKKyAgICAgICB4ID4gMjAwLCBhbmQgdW5kZXJmbG93cyB0byArLTAuMCBmb3IgeCA8IC0yMDAsIG5vdCBhIG5lZ2F0aXZlCisgICAgICAgaW50ZWdlci4gKi8KKyAgICBpZiAoYWJzeCA+IDIwMC4wKSB7CisgICAgICAgIGlmICh4IDwgMC4wKSB7CisgICAgICAgICAgICByZXR1cm4gMC4wL3NpbnBpKHgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgICAgICAgICByZXR1cm4gUHlfSFVHRV9WQUw7CisgICAgICAgIH0KKyAgICB9CiAKLQl5ID0gYWJzeCArIGxhbmN6b3NfZ19taW51c19oYWxmOwotCS8qIGNvbXB1dGUgZXJyb3IgaW4gc3VtICovCi0JaWYgKGFic3ggPiBsYW5jem9zX2dfbWludXNfaGFsZikgewotCQkvKiBub3RlOiB0aGUgY29ycmVjdGlvbiBjYW4gYmUgZm9pbGVkIGJ5IGFuIG9wdGltaXppbmcKLQkJICAgY29tcGlsZXIgdGhhdCAoaW5jb3JyZWN0bHkpIHRoaW5rcyB0aGF0IGFuIGV4cHJlc3Npb24gbGlrZQotCQkgICBhICsgYiAtIGEgLSBiIGNhbiBiZSBvcHRpbWl6ZWQgdG8gMC4wLiAgVGhpcyBzaG91bGRuJ3QKLQkJICAgaGFwcGVuIGluIGEgc3RhbmRhcmRzLWNvbmZvcm1pbmcgY29tcGlsZXIuICovCi0JCWRvdWJsZSBxID0geSAtIGFic3g7Ci0JCXogPSBxIC0gbGFuY3pvc19nX21pbnVzX2hhbGY7Ci0JfQotCWVsc2UgewotCQlkb3VibGUgcSA9IHkgLSBsYW5jem9zX2dfbWludXNfaGFsZjsKLQkJeiA9IHEgLSBhYnN4OwotCX0KLQl6ID0geiAqIGxhbmN6b3NfZyAvIHk7Ci0JaWYgKHggPCAwLjApIHsKLQkJciA9IC1waSAvIHNpbnBpKGFic3gpIC8gYWJzeCAqIGV4cCh5KSAvIGxhbmN6b3Nfc3VtKGFic3gpOwotCQlyIC09IHogKiByOwotCQlpZiAoYWJzeCA8IDE0MC4wKSB7Ci0JCQlyIC89IHBvdyh5LCBhYnN4IC0gMC41KTsKLQkJfQotCQllbHNlIHsKLQkJCXNxcnRwb3cgPSBwb3coeSwgYWJzeCAvIDIuMCAtIDAuMjUpOwotCQkJciAvPSBzcXJ0cG93OwotCQkJciAvPSBzcXJ0cG93OwotCQl9Ci0JfQotCWVsc2UgewotCQlyID0gbGFuY3pvc19zdW0oYWJzeCkgLyBleHAoeSk7Ci0JCXIgKz0geiAqIHI7Ci0JCWlmIChhYnN4IDwgMTQwLjApIHsKLQkJCXIgKj0gcG93KHksIGFic3ggLSAwLjUpOwotCQl9Ci0JCWVsc2UgewotCQkJc3FydHBvdyA9IHBvdyh5LCBhYnN4IC8gMi4wIC0gMC4yNSk7Ci0JCQlyICo9IHNxcnRwb3c7Ci0JCQlyICo9IHNxcnRwb3c7Ci0JCX0KLQl9Ci0JaWYgKFB5X0lTX0lORklOSVRZKHIpKQotCQllcnJubyA9IEVSQU5HRTsKLQlyZXR1cm4gcjsKKyAgICB5ID0gYWJzeCArIGxhbmN6b3NfZ19taW51c19oYWxmOworICAgIC8qIGNvbXB1dGUgZXJyb3IgaW4gc3VtICovCisgICAgaWYgKGFic3ggPiBsYW5jem9zX2dfbWludXNfaGFsZikgeworICAgICAgICAvKiBub3RlOiB0aGUgY29ycmVjdGlvbiBjYW4gYmUgZm9pbGVkIGJ5IGFuIG9wdGltaXppbmcKKyAgICAgICAgICAgY29tcGlsZXIgdGhhdCAoaW5jb3JyZWN0bHkpIHRoaW5rcyB0aGF0IGFuIGV4cHJlc3Npb24gbGlrZQorICAgICAgICAgICBhICsgYiAtIGEgLSBiIGNhbiBiZSBvcHRpbWl6ZWQgdG8gMC4wLiAgVGhpcyBzaG91bGRuJ3QKKyAgICAgICAgICAgaGFwcGVuIGluIGEgc3RhbmRhcmRzLWNvbmZvcm1pbmcgY29tcGlsZXIuICovCisgICAgICAgIGRvdWJsZSBxID0geSAtIGFic3g7CisgICAgICAgIHogPSBxIC0gbGFuY3pvc19nX21pbnVzX2hhbGY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkb3VibGUgcSA9IHkgLSBsYW5jem9zX2dfbWludXNfaGFsZjsKKyAgICAgICAgeiA9IHEgLSBhYnN4OworICAgIH0KKyAgICB6ID0geiAqIGxhbmN6b3NfZyAvIHk7CisgICAgaWYgKHggPCAwLjApIHsKKyAgICAgICAgciA9IC1waSAvIHNpbnBpKGFic3gpIC8gYWJzeCAqIGV4cCh5KSAvIGxhbmN6b3Nfc3VtKGFic3gpOworICAgICAgICByIC09IHogKiByOworICAgICAgICBpZiAoYWJzeCA8IDE0MC4wKSB7CisgICAgICAgICAgICByIC89IHBvdyh5LCBhYnN4IC0gMC41KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNxcnRwb3cgPSBwb3coeSwgYWJzeCAvIDIuMCAtIDAuMjUpOworICAgICAgICAgICAgciAvPSBzcXJ0cG93OworICAgICAgICAgICAgciAvPSBzcXJ0cG93OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByID0gbGFuY3pvc19zdW0oYWJzeCkgLyBleHAoeSk7CisgICAgICAgIHIgKz0geiAqIHI7CisgICAgICAgIGlmIChhYnN4IDwgMTQwLjApIHsKKyAgICAgICAgICAgIHIgKj0gcG93KHksIGFic3ggLSAwLjUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3FydHBvdyA9IHBvdyh5LCBhYnN4IC8gMi4wIC0gMC4yNSk7CisgICAgICAgICAgICByICo9IHNxcnRwb3c7CisgICAgICAgICAgICByICo9IHNxcnRwb3c7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKFB5X0lTX0lORklOSVRZKHIpKQorICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICByZXR1cm4gcjsKIH0KIAogLyoKQEAgLTMzMCw0OSArMzMwLDQ5IEBACiBzdGF0aWMgZG91YmxlCiBtX2xnYW1tYShkb3VibGUgeCkKIHsKLQlkb3VibGUgciwgYWJzeDsKKyAgICBkb3VibGUgciwgYWJzeDsKIAotCS8qIHNwZWNpYWwgY2FzZXMgKi8KLQlpZiAoIVB5X0lTX0ZJTklURSh4KSkgewotCQlpZiAoUHlfSVNfTkFOKHgpKQotCQkJcmV0dXJuIHg7ICAvKiBsZ2FtbWEobmFuKSA9IG5hbiAqLwotCQllbHNlCi0JCQlyZXR1cm4gUHlfSFVHRV9WQUw7IC8qIGxnYW1tYSgrLWluZikgPSAraW5mICovCi0JfQorICAgIC8qIHNwZWNpYWwgY2FzZXMgKi8KKyAgICBpZiAoIVB5X0lTX0ZJTklURSh4KSkgeworICAgICAgICBpZiAoUHlfSVNfTkFOKHgpKQorICAgICAgICAgICAgcmV0dXJuIHg7ICAvKiBsZ2FtbWEobmFuKSA9IG5hbiAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlfSFVHRV9WQUw7IC8qIGxnYW1tYSgrLWluZikgPSAraW5mICovCisgICAgfQogCi0JLyogaW50ZWdlciBhcmd1bWVudHMgKi8KLQlpZiAoeCA9PSBmbG9vcih4KSAmJiB4IDw9IDIuMCkgewotCQlpZiAoeCA8PSAwLjApIHsKLQkJCWVycm5vID0gRURPTTsgIC8qIGxnYW1tYShuKSA9IGluZiwgZGl2aWRlLWJ5LXplcm8gZm9yICovCi0JCQlyZXR1cm4gUHlfSFVHRV9WQUw7IC8qIGludGVnZXJzIG4gPD0gMCAqLwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIDAuMDsgLyogbGdhbW1hKDEpID0gbGdhbW1hKDIpID0gMC4wICovCi0JCX0KLQl9CisgICAgLyogaW50ZWdlciBhcmd1bWVudHMgKi8KKyAgICBpZiAoeCA9PSBmbG9vcih4KSAmJiB4IDw9IDIuMCkgeworICAgICAgICBpZiAoeCA8PSAwLjApIHsKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsgIC8qIGxnYW1tYShuKSA9IGluZiwgZGl2aWRlLWJ5LXplcm8gZm9yICovCisgICAgICAgICAgICByZXR1cm4gUHlfSFVHRV9WQUw7IC8qIGludGVnZXJzIG4gPD0gMCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDAuMDsgLyogbGdhbW1hKDEpID0gbGdhbW1hKDIpID0gMC4wICovCisgICAgICAgIH0KKyAgICB9CiAKLQlhYnN4ID0gZmFicyh4KTsKLQkvKiB0aW55IGFyZ3VtZW50czogbGdhbW1hKHgpIH4gLWxvZyhmYWJzKHgpKSBmb3Igc21hbGwgeCAqLwotCWlmIChhYnN4IDwgMWUtMjApCi0JCXJldHVybiAtbG9nKGFic3gpOworICAgIGFic3ggPSBmYWJzKHgpOworICAgIC8qIHRpbnkgYXJndW1lbnRzOiBsZ2FtbWEoeCkgfiAtbG9nKGZhYnMoeCkpIGZvciBzbWFsbCB4ICovCisgICAgaWYgKGFic3ggPCAxZS0yMCkKKyAgICAgICAgcmV0dXJuIC1sb2coYWJzeCk7CiAKLQkvKiBMYW5jem9zJyBmb3JtdWxhICovCi0JaWYgKHggPiAwLjApIHsKLQkJLyogd2UgY291bGQgc2F2ZSBhIGZyYWN0aW9uIG9mIGEgdWxwIGluIGFjY3VyYWN5IGJ5IGhhdmluZyBhCi0JCSAgIHNlY29uZCBzZXQgb2YgbnVtZXJhdG9yIGNvZWZmaWNpZW50cyBmb3IgbGFuY3pvc19zdW0gdGhhdAotCQkgICBhYnNvcmJlZCB0aGUgZXhwKC1sYW5jem9zX2cpIHRlcm0sIGFuZCB0aHJvd2luZyBvdXQgdGhlCi0JCSAgIGxhbmN6b3NfZyBzdWJ0cmFjdGlvbiBiZWxvdzsgaXQncyBwcm9iYWJseSBub3Qgd29ydGggaXQuICovCi0JCXIgPSBsb2cobGFuY3pvc19zdW0oeCkpIC0gbGFuY3pvc19nICsKLQkJCSh4LTAuNSkqKGxvZyh4K2xhbmN6b3NfZy0wLjUpLTEpOwotCX0KLQllbHNlIHsKLQkJciA9IGxvZyhwaSkgLSBsb2coZmFicyhzaW5waShhYnN4KSkpIC0gbG9nKGFic3gpIC0KLQkJCShsb2cobGFuY3pvc19zdW0oYWJzeCkpIC0gbGFuY3pvc19nICsKLQkJCSAoYWJzeC0wLjUpKihsb2coYWJzeCtsYW5jem9zX2ctMC41KS0xKSk7Ci0JfQotCWlmIChQeV9JU19JTkZJTklUWShyKSkKLQkJZXJybm8gPSBFUkFOR0U7Ci0JcmV0dXJuIHI7CisgICAgLyogTGFuY3pvcycgZm9ybXVsYSAqLworICAgIGlmICh4ID4gMC4wKSB7CisgICAgICAgIC8qIHdlIGNvdWxkIHNhdmUgYSBmcmFjdGlvbiBvZiBhIHVscCBpbiBhY2N1cmFjeSBieSBoYXZpbmcgYQorICAgICAgICAgICBzZWNvbmQgc2V0IG9mIG51bWVyYXRvciBjb2VmZmljaWVudHMgZm9yIGxhbmN6b3Nfc3VtIHRoYXQKKyAgICAgICAgICAgYWJzb3JiZWQgdGhlIGV4cCgtbGFuY3pvc19nKSB0ZXJtLCBhbmQgdGhyb3dpbmcgb3V0IHRoZQorICAgICAgICAgICBsYW5jem9zX2cgc3VidHJhY3Rpb24gYmVsb3c7IGl0J3MgcHJvYmFibHkgbm90IHdvcnRoIGl0LiAqLworICAgICAgICByID0gbG9nKGxhbmN6b3Nfc3VtKHgpKSAtIGxhbmN6b3NfZyArCisgICAgICAgICAgICAoeC0wLjUpKihsb2coeCtsYW5jem9zX2ctMC41KS0xKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHIgPSBsb2cocGkpIC0gbG9nKGZhYnMoc2lucGkoYWJzeCkpKSAtIGxvZyhhYnN4KSAtCisgICAgICAgICAgICAobG9nKGxhbmN6b3Nfc3VtKGFic3gpKSAtIGxhbmN6b3NfZyArCisgICAgICAgICAgICAgKGFic3gtMC41KSoobG9nKGFic3grbGFuY3pvc19nLTAuNSktMSkpOworICAgIH0KKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkocikpCisgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgIHJldHVybiByOwogfQogCiAvKgpAQCAtNDI4LDE3ICs0MjgsMTcgQEAKIHN0YXRpYyBkb3VibGUKIG1fZXJmX3Nlcmllcyhkb3VibGUgeCkKIHsKLQlkb3VibGUgeDIsIGFjYywgZms7Ci0JaW50IGk7CisgICAgZG91YmxlIHgyLCBhY2MsIGZrOworICAgIGludCBpOwogCi0JeDIgPSB4ICogeDsKLQlhY2MgPSAwLjA7Ci0JZmsgPSAoZG91YmxlKUVSRl9TRVJJRVNfVEVSTVMgKyAwLjU7Ci0JZm9yIChpID0gMDsgaSA8IEVSRl9TRVJJRVNfVEVSTVM7IGkrKykgewotCQlhY2MgPSAyLjAgKyB4MiAqIGFjYyAvIGZrOwotCQlmayAtPSAxLjA7Ci0JfQotCXJldHVybiBhY2MgKiB4ICogZXhwKC14MikgLyBzcXJ0cGk7CisgICAgeDIgPSB4ICogeDsKKyAgICBhY2MgPSAwLjA7CisgICAgZmsgPSAoZG91YmxlKUVSRl9TRVJJRVNfVEVSTVMgKyAwLjU7CisgICAgZm9yIChpID0gMDsgaSA8IEVSRl9TRVJJRVNfVEVSTVM7IGkrKykgeworICAgICAgICBhY2MgPSAyLjAgKyB4MiAqIGFjYyAvIGZrOworICAgICAgICBmayAtPSAxLjA7CisgICAgfQorICAgIHJldHVybiBhY2MgKiB4ICogZXhwKC14MikgLyBzcXJ0cGk7CiB9CiAKIC8qCkBAIC00NTMsMjYgKzQ1MywyNiBAQAogc3RhdGljIGRvdWJsZQogbV9lcmZjX2NvbnRmcmFjKGRvdWJsZSB4KQogewotCWRvdWJsZSB4MiwgYSwgZGEsIHAsIHBfbGFzdCwgcSwgcV9sYXN0LCBiOwotCWludCBpOworICAgIGRvdWJsZSB4MiwgYSwgZGEsIHAsIHBfbGFzdCwgcSwgcV9sYXN0LCBiOworICAgIGludCBpOwogCi0JaWYgKHggPj0gRVJGQ19DT05URlJBQ19DVVRPRkYpCi0JCXJldHVybiAwLjA7CisgICAgaWYgKHggPj0gRVJGQ19DT05URlJBQ19DVVRPRkYpCisgICAgICAgIHJldHVybiAwLjA7CiAKLQl4MiA9IHgqeDsKLQlhID0gMC4wOwotCWRhID0gMC41OwotCXAgPSAxLjA7IHBfbGFzdCA9IDAuMDsKLQlxID0gZGEgKyB4MjsgcV9sYXN0ID0gMS4wOwotCWZvciAoaSA9IDA7IGkgPCBFUkZDX0NPTlRGUkFDX1RFUk1TOyBpKyspIHsKLQkJZG91YmxlIHRlbXA7Ci0JCWEgKz0gZGE7Ci0JCWRhICs9IDIuMDsKLQkJYiA9IGRhICsgeDI7Ci0JCXRlbXAgPSBwOyBwID0gYipwIC0gYSpwX2xhc3Q7IHBfbGFzdCA9IHRlbXA7Ci0JCXRlbXAgPSBxOyBxID0gYipxIC0gYSpxX2xhc3Q7IHFfbGFzdCA9IHRlbXA7Ci0JfQotCXJldHVybiBwIC8gcSAqIHggKiBleHAoLXgyKSAvIHNxcnRwaTsKKyAgICB4MiA9IHgqeDsKKyAgICBhID0gMC4wOworICAgIGRhID0gMC41OworICAgIHAgPSAxLjA7IHBfbGFzdCA9IDAuMDsKKyAgICBxID0gZGEgKyB4MjsgcV9sYXN0ID0gMS4wOworICAgIGZvciAoaSA9IDA7IGkgPCBFUkZDX0NPTlRGUkFDX1RFUk1TOyBpKyspIHsKKyAgICAgICAgZG91YmxlIHRlbXA7CisgICAgICAgIGEgKz0gZGE7CisgICAgICAgIGRhICs9IDIuMDsKKyAgICAgICAgYiA9IGRhICsgeDI7CisgICAgICAgIHRlbXAgPSBwOyBwID0gYipwIC0gYSpwX2xhc3Q7IHBfbGFzdCA9IHRlbXA7CisgICAgICAgIHRlbXAgPSBxOyBxID0gYipxIC0gYSpxX2xhc3Q7IHFfbGFzdCA9IHRlbXA7CisgICAgfQorICAgIHJldHVybiBwIC8gcSAqIHggKiBleHAoLXgyKSAvIHNxcnRwaTsKIH0KIAogLyogRXJyb3IgZnVuY3Rpb24gZXJmKHgpLCBmb3IgZ2VuZXJhbCB4ICovCkBAIC00ODAsMTcgKzQ4MCwxNyBAQAogc3RhdGljIGRvdWJsZQogbV9lcmYoZG91YmxlIHgpCiB7Ci0JZG91YmxlIGFic3gsIGNmOworICAgIGRvdWJsZSBhYnN4LCBjZjsKIAotCWlmIChQeV9JU19OQU4oeCkpCi0JCXJldHVybiB4OwotCWFic3ggPSBmYWJzKHgpOwotCWlmIChhYnN4IDwgRVJGX1NFUklFU19DVVRPRkYpCi0JCXJldHVybiBtX2VyZl9zZXJpZXMoeCk7Ci0JZWxzZSB7Ci0JCWNmID0gbV9lcmZjX2NvbnRmcmFjKGFic3gpOwotCQlyZXR1cm4geCA+IDAuMCA/IDEuMCAtIGNmIDogY2YgLSAxLjA7Ci0JfQorICAgIGlmIChQeV9JU19OQU4oeCkpCisgICAgICAgIHJldHVybiB4OworICAgIGFic3ggPSBmYWJzKHgpOworICAgIGlmIChhYnN4IDwgRVJGX1NFUklFU19DVVRPRkYpCisgICAgICAgIHJldHVybiBtX2VyZl9zZXJpZXMoeCk7CisgICAgZWxzZSB7CisgICAgICAgIGNmID0gbV9lcmZjX2NvbnRmcmFjKGFic3gpOworICAgICAgICByZXR1cm4geCA+IDAuMCA/IDEuMCAtIGNmIDogY2YgLSAxLjA7CisgICAgfQogfQogCiAvKiBDb21wbGVtZW50YXJ5IGVycm9yIGZ1bmN0aW9uIGVyZmMoeCksIGZvciBnZW5lcmFsIHguICovCkBAIC00OTgsMTcgKzQ5OCwxNyBAQAogc3RhdGljIGRvdWJsZQogbV9lcmZjKGRvdWJsZSB4KQogewotCWRvdWJsZSBhYnN4LCBjZjsKKyAgICBkb3VibGUgYWJzeCwgY2Y7CiAKLQlpZiAoUHlfSVNfTkFOKHgpKQotCQlyZXR1cm4geDsKLQlhYnN4ID0gZmFicyh4KTsKLQlpZiAoYWJzeCA8IEVSRl9TRVJJRVNfQ1VUT0ZGKQotCQlyZXR1cm4gMS4wIC0gbV9lcmZfc2VyaWVzKHgpOwotCWVsc2UgewotCQljZiA9IG1fZXJmY19jb250ZnJhYyhhYnN4KTsKLQkJcmV0dXJuIHggPiAwLjAgPyBjZiA6IDIuMCAtIGNmOwotCX0KKyAgICBpZiAoUHlfSVNfTkFOKHgpKQorICAgICAgICByZXR1cm4geDsKKyAgICBhYnN4ID0gZmFicyh4KTsKKyAgICBpZiAoYWJzeCA8IEVSRl9TRVJJRVNfQ1VUT0ZGKQorICAgICAgICByZXR1cm4gMS4wIC0gbV9lcmZfc2VyaWVzKHgpOworICAgIGVsc2UgeworICAgICAgICBjZiA9IG1fZXJmY19jb250ZnJhYyhhYnN4KTsKKyAgICAgICAgcmV0dXJuIHggPiAwLjAgPyBjZiA6IDIuMCAtIGNmOworICAgIH0KIH0KIAogLyoKQEAgLTUyMiwyOSArNTIyLDI5IEBACiBzdGF0aWMgZG91YmxlCiBtX2F0YW4yKGRvdWJsZSB5LCBkb3VibGUgeCkKIHsKLQlpZiAoUHlfSVNfTkFOKHgpIHx8IFB5X0lTX05BTih5KSkKLQkJcmV0dXJuIFB5X05BTjsKLQlpZiAoUHlfSVNfSU5GSU5JVFkoeSkpIHsKLQkJaWYgKFB5X0lTX0lORklOSVRZKHgpKSB7Ci0JCQlpZiAoY29weXNpZ24oMS4sIHgpID09IDEuKQotCQkJCS8qIGF0YW4yKCstaW5mLCAraW5mKSA9PSArLXBpLzQgKi8KLQkJCQlyZXR1cm4gY29weXNpZ24oMC4yNSpQeV9NQVRIX1BJLCB5KTsKLQkJCWVsc2UKLQkJCQkvKiBhdGFuMigrLWluZiwgLWluZikgPT0gKy1waSozLzQgKi8KLQkJCQlyZXR1cm4gY29weXNpZ24oMC43NSpQeV9NQVRIX1BJLCB5KTsKLQkJfQotCQkvKiBhdGFuMigrLWluZiwgeCkgPT0gKy1waS8yIGZvciBmaW5pdGUgeCAqLwotCQlyZXR1cm4gY29weXNpZ24oMC41KlB5X01BVEhfUEksIHkpOwotCX0KLQlpZiAoUHlfSVNfSU5GSU5JVFkoeCkgfHwgeSA9PSAwLikgewotCQlpZiAoY29weXNpZ24oMS4sIHgpID09IDEuKQotCQkJLyogYXRhbjIoKy15LCAraW5mKSA9IGF0YW4yKCstMCwgK3gpID0gKy0wLiAqLwotCQkJcmV0dXJuIGNvcHlzaWduKDAuLCB5KTsKLQkJZWxzZQotCQkJLyogYXRhbjIoKy15LCAtaW5mKSA9IGF0YW4yKCstMC4sIC14KSA9ICstcGkuICovCi0JCQlyZXR1cm4gY29weXNpZ24oUHlfTUFUSF9QSSwgeSk7Ci0JfQotCXJldHVybiBhdGFuMih5LCB4KTsKKyAgICBpZiAoUHlfSVNfTkFOKHgpIHx8IFB5X0lTX05BTih5KSkKKyAgICAgICAgcmV0dXJuIFB5X05BTjsKKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeSkpIHsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHgpKSB7CisgICAgICAgICAgICBpZiAoY29weXNpZ24oMS4sIHgpID09IDEuKQorICAgICAgICAgICAgICAgIC8qIGF0YW4yKCstaW5mLCAraW5mKSA9PSArLXBpLzQgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oMC4yNSpQeV9NQVRIX1BJLCB5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvKiBhdGFuMigrLWluZiwgLWluZikgPT0gKy1waSozLzQgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oMC43NSpQeV9NQVRIX1BJLCB5KTsKKyAgICAgICAgfQorICAgICAgICAvKiBhdGFuMigrLWluZiwgeCkgPT0gKy1waS8yIGZvciBmaW5pdGUgeCAqLworICAgICAgICByZXR1cm4gY29weXNpZ24oMC41KlB5X01BVEhfUEksIHkpOworICAgIH0KKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeCkgfHwgeSA9PSAwLikgeworICAgICAgICBpZiAoY29weXNpZ24oMS4sIHgpID09IDEuKQorICAgICAgICAgICAgLyogYXRhbjIoKy15LCAraW5mKSA9IGF0YW4yKCstMCwgK3gpID0gKy0wLiAqLworICAgICAgICAgICAgcmV0dXJuIGNvcHlzaWduKDAuLCB5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogYXRhbjIoKy15LCAtaW5mKSA9IGF0YW4yKCstMC4sIC14KSA9ICstcGkuICovCisgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oUHlfTUFUSF9QSSwgeSk7CisgICAgfQorICAgIHJldHVybiBhdGFuMih5LCB4KTsKIH0KIAogLyoKQEAgLTU1Nyw0NSArNTU3LDQ1IEBACiBzdGF0aWMgZG91YmxlCiBtX2xvZyhkb3VibGUgeCkKIHsKLQlpZiAoUHlfSVNfRklOSVRFKHgpKSB7Ci0JCWlmICh4ID4gMC4wKQotCQkJcmV0dXJuIGxvZyh4KTsKLQkJZXJybm8gPSBFRE9NOwotCQlpZiAoeCA9PSAwLjApCi0JCQlyZXR1cm4gLVB5X0hVR0VfVkFMOyAvKiBsb2coMCkgPSAtaW5mICovCi0JCWVsc2UKLQkJCXJldHVybiBQeV9OQU47IC8qIGxvZygtdmUpID0gbmFuICovCi0JfQotCWVsc2UgaWYgKFB5X0lTX05BTih4KSkKLQkJcmV0dXJuIHg7IC8qIGxvZyhuYW4pID0gbmFuICovCi0JZWxzZSBpZiAoeCA+IDAuMCkKLQkJcmV0dXJuIHg7IC8qIGxvZyhpbmYpID0gaW5mICovCi0JZWxzZSB7Ci0JCWVycm5vID0gRURPTTsKLQkJcmV0dXJuIFB5X05BTjsgLyogbG9nKC1pbmYpID0gbmFuICovCi0JfQorICAgIGlmIChQeV9JU19GSU5JVEUoeCkpIHsKKyAgICAgICAgaWYgKHggPiAwLjApCisgICAgICAgICAgICByZXR1cm4gbG9nKHgpOworICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGlmICh4ID09IDAuMCkKKyAgICAgICAgICAgIHJldHVybiAtUHlfSFVHRV9WQUw7IC8qIGxvZygwKSA9IC1pbmYgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5X05BTjsgLyogbG9nKC12ZSkgPSBuYW4gKi8KKyAgICB9CisgICAgZWxzZSBpZiAoUHlfSVNfTkFOKHgpKQorICAgICAgICByZXR1cm4geDsgLyogbG9nKG5hbikgPSBuYW4gKi8KKyAgICBlbHNlIGlmICh4ID4gMC4wKQorICAgICAgICByZXR1cm4geDsgLyogbG9nKGluZikgPSBpbmYgKi8KKyAgICBlbHNlIHsKKyAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICByZXR1cm4gUHlfTkFOOyAvKiBsb2coLWluZikgPSBuYW4gKi8KKyAgICB9CiB9CiAKIHN0YXRpYyBkb3VibGUKIG1fbG9nMTAoZG91YmxlIHgpCiB7Ci0JaWYgKFB5X0lTX0ZJTklURSh4KSkgewotCQlpZiAoeCA+IDAuMCkKLQkJCXJldHVybiBsb2cxMCh4KTsKLQkJZXJybm8gPSBFRE9NOwotCQlpZiAoeCA9PSAwLjApCi0JCQlyZXR1cm4gLVB5X0hVR0VfVkFMOyAvKiBsb2cxMCgwKSA9IC1pbmYgKi8KLQkJZWxzZQotCQkJcmV0dXJuIFB5X05BTjsgLyogbG9nMTAoLXZlKSA9IG5hbiAqLwotCX0KLQllbHNlIGlmIChQeV9JU19OQU4oeCkpCi0JCXJldHVybiB4OyAvKiBsb2cxMChuYW4pID0gbmFuICovCi0JZWxzZSBpZiAoeCA+IDAuMCkKLQkJcmV0dXJuIHg7IC8qIGxvZzEwKGluZikgPSBpbmYgKi8KLQllbHNlIHsKLQkJZXJybm8gPSBFRE9NOwotCQlyZXR1cm4gUHlfTkFOOyAvKiBsb2cxMCgtaW5mKSA9IG5hbiAqLwotCX0KKyAgICBpZiAoUHlfSVNfRklOSVRFKHgpKSB7CisgICAgICAgIGlmICh4ID4gMC4wKQorICAgICAgICAgICAgcmV0dXJuIGxvZzEwKHgpOworICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGlmICh4ID09IDAuMCkKKyAgICAgICAgICAgIHJldHVybiAtUHlfSFVHRV9WQUw7IC8qIGxvZzEwKDApID0gLWluZiAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlfTkFOOyAvKiBsb2cxMCgtdmUpID0gbmFuICovCisgICAgfQorICAgIGVsc2UgaWYgKFB5X0lTX05BTih4KSkKKyAgICAgICAgcmV0dXJuIHg7IC8qIGxvZzEwKG5hbikgPSBuYW4gKi8KKyAgICBlbHNlIGlmICh4ID4gMC4wKQorICAgICAgICByZXR1cm4geDsgLyogbG9nMTAoaW5mKSA9IGluZiAqLworICAgIGVsc2UgeworICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIHJldHVybiBQeV9OQU47IC8qIGxvZzEwKC1pbmYpID0gbmFuICovCisgICAgfQogfQogCiAKQEAgLTYwNiwzNyArNjA2LDM3IEBACiBzdGF0aWMgaW50CiBpc19lcnJvcihkb3VibGUgeCkKIHsKLQlpbnQgcmVzdWx0ID0gMTsJLyogcHJlc3VtcHRpb24gb2YgZ3VpbHQgKi8KLQlhc3NlcnQoZXJybm8pOwkvKiBub24temVybyBlcnJubyBpcyBhIHByZWNvbmRpdGlvbiBmb3IgY2FsbGluZyAqLwotCWlmIChlcnJubyA9PSBFRE9NKQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1hdGggZG9tYWluIGVycm9yIik7CisgICAgaW50IHJlc3VsdCA9IDE7ICAgICAvKiBwcmVzdW1wdGlvbiBvZiBndWlsdCAqLworICAgIGFzc2VydChlcnJubyk7ICAgICAgLyogbm9uLXplcm8gZXJybm8gaXMgYSBwcmVjb25kaXRpb24gZm9yIGNhbGxpbmcgKi8KKyAgICBpZiAoZXJybm8gPT0gRURPTSkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtYXRoIGRvbWFpbiBlcnJvciIpOwogCi0JZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKSB7Ci0JCS8qIEFOU0kgQyBnZW5lcmFsbHkgcmVxdWlyZXMgbGlibSBmdW5jdGlvbnMgdG8gc2V0IEVSQU5HRQotCQkgKiBvbiBvdmVyZmxvdywgYnV0IGFsc28gZ2VuZXJhbGx5ICphbGxvd3MqIHRoZW0gdG8gc2V0Ci0JCSAqIEVSQU5HRSBvbiB1bmRlcmZsb3cgdG9vLiAgVGhlcmUncyBubyBjb25zaXN0ZW5jeSBhYm91dAotCQkgKiB0aGUgbGF0dGVyIGFjcm9zcyBwbGF0Zm9ybXMuCi0JCSAqIEFsYXMsIEM5OSBuZXZlciByZXF1aXJlcyB0aGF0IGVycm5vIGJlIHNldC4KLQkJICogSGVyZSB3ZSBzdXBwcmVzcyB0aGUgdW5kZXJmbG93IGVycm9ycyAobGlibSBmdW5jdGlvbnMKLQkJICogc2hvdWxkIHJldHVybiBhIHplcm8gb24gdW5kZXJmbG93LCBhbmQgKy0gSFVHRV9WQUwgb24KLQkJICogb3ZlcmZsb3csIHNvIHRlc3RpbmcgdGhlIHJlc3VsdCBmb3IgemVybyBzdWZmaWNlcyB0bwotCQkgKiBkaXN0aW5ndWlzaCB0aGUgY2FzZXMpLgotCQkgKgotCQkgKiBPbiBzb21lIHBsYXRmb3JtcyAoVWJ1bnR1L2lhNjQpIGl0IHNlZW1zIHRoYXQgZXJybm8gY2FuIGJlCi0JCSAqIHNldCB0byBFUkFOR0UgZm9yIHN1Ym5vcm1hbCByZXN1bHRzIHRoYXQgZG8gKm5vdCogdW5kZXJmbG93Ci0JCSAqIHRvIHplcm8uICBTbyB0byBiZSBzYWZlLCB3ZSdsbCBpZ25vcmUgRVJBTkdFIHdoZW5ldmVyIHRoZQotCQkgKiBmdW5jdGlvbiByZXN1bHQgaXMgbGVzcyB0aGFuIG9uZSBpbiBhYnNvbHV0ZSB2YWx1ZS4KLQkJICovCi0JCWlmIChmYWJzKHgpIDwgMS4wKQotCQkJcmVzdWx0ID0gMDsKLQkJZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCSJtYXRoIHJhbmdlIGVycm9yIik7Ci0JfQotCWVsc2UKLSAgICAgICAgICAgICAgICAvKiBVbmV4cGVjdGVkIG1hdGggZXJyb3IgKi8KLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX1ZhbHVlRXJyb3IpOwotCXJldHVybiByZXN1bHQ7CisgICAgZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKSB7CisgICAgICAgIC8qIEFOU0kgQyBnZW5lcmFsbHkgcmVxdWlyZXMgbGlibSBmdW5jdGlvbnMgdG8gc2V0IEVSQU5HRQorICAgICAgICAgKiBvbiBvdmVyZmxvdywgYnV0IGFsc28gZ2VuZXJhbGx5ICphbGxvd3MqIHRoZW0gdG8gc2V0CisgICAgICAgICAqIEVSQU5HRSBvbiB1bmRlcmZsb3cgdG9vLiAgVGhlcmUncyBubyBjb25zaXN0ZW5jeSBhYm91dAorICAgICAgICAgKiB0aGUgbGF0dGVyIGFjcm9zcyBwbGF0Zm9ybXMuCisgICAgICAgICAqIEFsYXMsIEM5OSBuZXZlciByZXF1aXJlcyB0aGF0IGVycm5vIGJlIHNldC4KKyAgICAgICAgICogSGVyZSB3ZSBzdXBwcmVzcyB0aGUgdW5kZXJmbG93IGVycm9ycyAobGlibSBmdW5jdGlvbnMKKyAgICAgICAgICogc2hvdWxkIHJldHVybiBhIHplcm8gb24gdW5kZXJmbG93LCBhbmQgKy0gSFVHRV9WQUwgb24KKyAgICAgICAgICogb3ZlcmZsb3csIHNvIHRlc3RpbmcgdGhlIHJlc3VsdCBmb3IgemVybyBzdWZmaWNlcyB0bworICAgICAgICAgKiBkaXN0aW5ndWlzaCB0aGUgY2FzZXMpLgorICAgICAgICAgKgorICAgICAgICAgKiBPbiBzb21lIHBsYXRmb3JtcyAoVWJ1bnR1L2lhNjQpIGl0IHNlZW1zIHRoYXQgZXJybm8gY2FuIGJlCisgICAgICAgICAqIHNldCB0byBFUkFOR0UgZm9yIHN1Ym5vcm1hbCByZXN1bHRzIHRoYXQgZG8gKm5vdCogdW5kZXJmbG93CisgICAgICAgICAqIHRvIHplcm8uICBTbyB0byBiZSBzYWZlLCB3ZSdsbCBpZ25vcmUgRVJBTkdFIHdoZW5ldmVyIHRoZQorICAgICAgICAgKiBmdW5jdGlvbiByZXN1bHQgaXMgbGVzcyB0aGFuIG9uZSBpbiBhYnNvbHV0ZSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChmYWJzKHgpIDwgMS4wKQorICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGggcmFuZ2UgZXJyb3IiKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICAvKiBVbmV4cGVjdGVkIG1hdGggZXJyb3IgKi8KKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX1ZhbHVlRXJyb3IpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qCkBAIC02NzIsMzAgKzY3MiwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfMShQeU9iamVjdCAqYXJnLCBkb3VibGUgKCpmdW5jKSAoZG91YmxlKSwgaW50IGNhbl9vdmVyZmxvdykKIHsKLQlkb3VibGUgeCwgcjsKLQl4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfMSIsIHJldHVybiAwKTsKLQlyID0gKCpmdW5jKSh4KTsKLQlQeUZQRV9FTkRfUFJPVEVDVChyKTsKLQlpZiAoUHlfSVNfTkFOKHIpKSB7Ci0JCWlmICghUHlfSVNfTkFOKHgpKQotCQkJZXJybm8gPSBFRE9NOwotCQllbHNlCi0JCQllcnJubyA9IDA7Ci0JfQotCWVsc2UgaWYgKFB5X0lTX0lORklOSVRZKHIpKSB7Ci0JCWlmIChQeV9JU19GSU5JVEUoeCkpCi0JCQllcnJubyA9IGNhbl9vdmVyZmxvdyA/IEVSQU5HRSA6IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQl9Ci0JaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocik7CisgICAgZG91YmxlIHgsIHI7CisgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVycm5vID0gMDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoXzEiLCByZXR1cm4gMCk7CisgICAgciA9ICgqZnVuYykoeCk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1Qocik7CisgICAgaWYgKFB5X0lTX05BTihyKSkgeworICAgICAgICBpZiAoIVB5X0lTX05BTih4KSkKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeV9JU19JTkZJTklUWShyKSkgeworICAgICAgICBpZiAoUHlfSVNfRklOSVRFKHgpKQorICAgICAgICAgICAgZXJybm8gPSBjYW5fb3ZlcmZsb3cgPyBFUkFOR0UgOiBFRE9NOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgfQorICAgIGlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOwogfQogCiAvKiB2YXJpYW50IG9mIG1hdGhfMSwgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBiZWluZyB3cmFwcGVkIGlzIGtub3duIHRvCkBAIC03MDUsMTcgKzcwNSwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfMWEoUHlPYmplY3QgKmFyZywgZG91YmxlICgqZnVuYykgKGRvdWJsZSkpCiB7Ci0JZG91YmxlIHgsIHI7Ci0JeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoXzFhIiwgcmV0dXJuIDApOwotCXIgPSAoKmZ1bmMpKHgpOwotCVB5RlBFX0VORF9QUk9URUNUKHIpOwotCWlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKKyAgICBkb3VibGUgeCwgcjsKKyAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfMWEiLCByZXR1cm4gMCk7CisgICAgciA9ICgqZnVuYykoeCk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1Qocik7CisgICAgaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOwogfQogCiAvKgpAQCAtNzQ4LDUzICs3NDgsNTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoXzIoUHlPYmplY3QgKmFyZ3MsIGRvdWJsZSAoKmZ1bmMpIChkb3VibGUsIGRvdWJsZSksIGNoYXIgKmZ1bmNuYW1lKQogewotCVB5T2JqZWN0ICpveCwgKm95OwotCWRvdWJsZSB4LCB5LCByOwotCWlmICghIFB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIGZ1bmNuYW1lLCAyLCAyLCAmb3gsICZveSkpCi0JCXJldHVybiBOVUxMOwotCXggPSBQeUZsb2F0X0FzRG91YmxlKG94KTsKLQl5ID0gUHlGbG9hdF9Bc0RvdWJsZShveSk7Ci0JaWYgKCh4ID09IC0xLjAgfHwgeSA9PSAtMS4wKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQllcnJubyA9IDA7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF8yIiwgcmV0dXJuIDApOwotCXIgPSAoKmZ1bmMpKHgsIHkpOwotCVB5RlBFX0VORF9QUk9URUNUKHIpOwotCWlmIChQeV9JU19OQU4ocikpIHsKLQkJaWYgKCFQeV9JU19OQU4oeCkgJiYgIVB5X0lTX05BTih5KSkKLQkJCWVycm5vID0gRURPTTsKLQkJZWxzZQotCQkJZXJybm8gPSAwOwotCX0KLQllbHNlIGlmIChQeV9JU19JTkZJTklUWShyKSkgewotCQlpZiAoUHlfSVNfRklOSVRFKHgpICYmIFB5X0lTX0ZJTklURSh5KSkKLQkJCWVycm5vID0gRVJBTkdFOwotCQllbHNlCi0JCQllcnJubyA9IDA7Ci0JfQotCWlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOworICAgIFB5T2JqZWN0ICpveCwgKm95OworICAgIGRvdWJsZSB4LCB5LCByOworICAgIGlmICghIFB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIGZ1bmNuYW1lLCAyLCAyLCAmb3gsICZveSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKG94KTsKKyAgICB5ID0gUHlGbG9hdF9Bc0RvdWJsZShveSk7CisgICAgaWYgKCh4ID09IC0xLjAgfHwgeSA9PSAtMS4wKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF8yIiwgcmV0dXJuIDApOworICAgIHIgPSAoKmZ1bmMpKHgsIHkpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHIpOworICAgIGlmIChQeV9JU19OQU4ocikpIHsKKyAgICAgICAgaWYgKCFQeV9JU19OQU4oeCkgJiYgIVB5X0lTX05BTih5KSkKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeV9JU19JTkZJTklUWShyKSkgeworICAgICAgICBpZiAoUHlfSVNfRklOSVRFKHgpICYmIFB5X0lTX0ZJTklURSh5KSkKKyAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgfQorICAgIGlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOwogfQogCi0jZGVmaW5lIEZVTkMxKGZ1bmNuYW1lLCBmdW5jLCBjYW5fb3ZlcmZsb3csIGRvY3N0cmluZykJCQlcCi0Jc3RhdGljIFB5T2JqZWN0ICogbWF0aF8jI2Z1bmNuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgeyBcCi0JCXJldHVybiBtYXRoXzEoYXJncywgZnVuYywgY2FuX292ZXJmbG93KTsJCSAgICBcCi0JfVwKLSAgICAgICAgUHlEb2NfU1RSVkFSKG1hdGhfIyNmdW5jbmFtZSMjX2RvYywgZG9jc3RyaW5nKTsKKyNkZWZpbmUgRlVOQzEoZnVuY25hbWUsIGZ1bmMsIGNhbl9vdmVyZmxvdywgZG9jc3RyaW5nKSAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgUHlPYmplY3QgKiBtYXRoXyMjZnVuY25hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7IFwKKyAgICAgICAgcmV0dXJuIG1hdGhfMShhcmdzLCBmdW5jLCBjYW5fb3ZlcmZsb3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfVwKKyAgICBQeURvY19TVFJWQVIobWF0aF8jI2Z1bmNuYW1lIyNfZG9jLCBkb2NzdHJpbmcpOwogCi0jZGVmaW5lIEZVTkMxQShmdW5jbmFtZSwgZnVuYywgZG9jc3RyaW5nKQkJCQlcCi0Jc3RhdGljIFB5T2JqZWN0ICogbWF0aF8jI2Z1bmNuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgeyBcCi0JCXJldHVybiBtYXRoXzFhKGFyZ3MsIGZ1bmMpOwkJCQlcCi0JfVwKLSAgICAgICAgUHlEb2NfU1RSVkFSKG1hdGhfIyNmdW5jbmFtZSMjX2RvYywgZG9jc3RyaW5nKTsKKyNkZWZpbmUgRlVOQzFBKGZ1bmNuYW1lLCBmdW5jLCBkb2NzdHJpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgUHlPYmplY3QgKiBtYXRoXyMjZnVuY25hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7IFwKKyAgICAgICAgcmV0dXJuIG1hdGhfMWEoYXJncywgZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9XAorICAgIFB5RG9jX1NUUlZBUihtYXRoXyMjZnVuY25hbWUjI19kb2MsIGRvY3N0cmluZyk7CiAKICNkZWZpbmUgRlVOQzIoZnVuY25hbWUsIGZ1bmMsIGRvY3N0cmluZykgXAotCXN0YXRpYyBQeU9iamVjdCAqIG1hdGhfIyNmdW5jbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsgXAotCQlyZXR1cm4gbWF0aF8yKGFyZ3MsIGZ1bmMsICNmdW5jbmFtZSk7IFwKLQl9XAotICAgICAgICBQeURvY19TVFJWQVIobWF0aF8jI2Z1bmNuYW1lIyNfZG9jLCBkb2NzdHJpbmcpOworICAgIHN0YXRpYyBQeU9iamVjdCAqIG1hdGhfIyNmdW5jbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsgXAorICAgICAgICByZXR1cm4gbWF0aF8yKGFyZ3MsIGZ1bmMsICNmdW5jbmFtZSk7IFwKKyAgICB9XAorICAgIFB5RG9jX1NUUlZBUihtYXRoXyMjZnVuY25hbWUjI19kb2MsIGRvY3N0cmluZyk7CiAKIEZVTkMxKGFjb3MsIGFjb3MsIDAsCiAgICAgICAiYWNvcyh4KVxuXG5SZXR1cm4gdGhlIGFyYyBjb3NpbmUgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguIikKQEAgLTg3Myw3ICs4NzMsNyBAQAogICAgQWxzbywgdGhlIHZvbGF0aWxlIGRlY2xhcmF0aW9uIGZvcmNlcyB0aGUgdmFsdWVzIHRvIGJlIHN0b3JlZCBpbiBtZW1vcnkgYXMKICAgIHJlZ3VsYXIgZG91YmxlcyBpbnN0ZWFkIG9mIGV4dGVuZGVkIGxvbmcgcHJlY2lzaW9uICg4MC1iaXQpIHZhbHVlcy4gIFRoaXMKICAgIHByZXZlbnRzIGRvdWJsZSByb3VuZGluZyBiZWNhdXNlIGFueSBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbiBvZiB0d28gZG91YmxlcwotICAgY2FuIGJlIHJlc29sdmVkIGV4YWN0bHkgaW50byBkb3VibGUtc2l6ZWQgaGkgYW5kIGxvIHZhbHVlcy4gIEFzIGxvbmcgYXMgdGhlIAorICAgY2FuIGJlIHJlc29sdmVkIGV4YWN0bHkgaW50byBkb3VibGUtc2l6ZWQgaGkgYW5kIGxvIHZhbHVlcy4gIEFzIGxvbmcgYXMgdGhlCiAgICBoaSB2YWx1ZSBnZXRzIGZvcmNlZCBpbnRvIGEgZG91YmxlIGJlZm9yZSB5ciBhbmQgbG8gYXJlIGNvbXB1dGVkLCB0aGUgZXh0cmEKICAgIGJpdHMgaW4gZG93bnN0cmVhbSBleHRlbmRlZCBwcmVjaXNpb24gb3BlcmF0aW9ucyAoeDg3IGZvciBleGFtcGxlKSB3aWxsIGJlCiAgICBleGFjdGx5IHplcm8gYW5kIHRoZXJlZm9yZSBjYW4gYmUgbG9zc2xlc3NseSBzdG9yZWQgYmFjayBpbnRvIGEgZG91YmxlLApAQCAtODk2LDI3ICs4OTYsMjcgQEAKIF9mc3VtX3JlYWxsb2MoZG91YmxlICoqcF9wdHIsIFB5X3NzaXplX3QgIG4sCiAgICAgICAgICAgICAgZG91YmxlICAqcHMsICAgIFB5X3NzaXplX3QgKm1fcHRyKQogewotCXZvaWQgKnYgPSBOVUxMOwotCVB5X3NzaXplX3QgbSA9ICptX3B0cjsKKyAgICB2b2lkICp2ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IG0gPSAqbV9wdHI7CiAKLQltICs9IG07ICAvKiBkb3VibGUgKi8KLQlpZiAobiA8IG0gJiYgbSA8IChQWV9TU0laRV9UX01BWCAvIHNpemVvZihkb3VibGUpKSkgewotCQlkb3VibGUgKnAgPSAqcF9wdHI7Ci0JCWlmIChwID09IHBzKSB7Ci0JCQl2ID0gUHlNZW1fTWFsbG9jKHNpemVvZihkb3VibGUpICogbSk7Ci0JCQlpZiAodiAhPSBOVUxMKQotCQkJCW1lbWNweSh2LCBwcywgc2l6ZW9mKGRvdWJsZSkgKiBuKTsKLQkJfQotCQllbHNlCi0JCQl2ID0gUHlNZW1fUmVhbGxvYyhwLCBzaXplb2YoZG91YmxlKSAqIG0pOwotCX0KLQlpZiAodiA9PSBOVUxMKSB7ICAgICAgICAvKiBzaXplIG92ZXJmbG93IG9yIG5vIG1lbW9yeSAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJtYXRoLmZzdW0gcGFydGlhbHMiKTsKLQkJcmV0dXJuIDE7Ci0JfQotCSpwX3B0ciA9IChkb3VibGUqKSB2OwotCSptX3B0ciA9IG07Ci0JcmV0dXJuIDA7CisgICAgbSArPSBtOyAgLyogZG91YmxlICovCisgICAgaWYgKG4gPCBtICYmIG0gPCAoUFlfU1NJWkVfVF9NQVggLyBzaXplb2YoZG91YmxlKSkpIHsKKyAgICAgICAgZG91YmxlICpwID0gKnBfcHRyOworICAgICAgICBpZiAocCA9PSBwcykgeworICAgICAgICAgICAgdiA9IFB5TWVtX01hbGxvYyhzaXplb2YoZG91YmxlKSAqIG0pOworICAgICAgICAgICAgaWYgKHYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBtZW1jcHkodiwgcHMsIHNpemVvZihkb3VibGUpICogbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdiA9IFB5TWVtX1JlYWxsb2MocCwgc2l6ZW9mKGRvdWJsZSkgKiBtKTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeyAgICAgICAgLyogc2l6ZSBvdmVyZmxvdyBvciBubyBtZW1vcnkgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAibWF0aC5mc3VtIHBhcnRpYWxzIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAqcF9wdHIgPSAoZG91YmxlKikgdjsKKyAgICAqbV9wdHIgPSBtOworICAgIHJldHVybiAwOwogfQogCiAvKiBGdWxsIHByZWNpc2lvbiBzdW1tYXRpb24gb2YgYSBzZXF1ZW5jZSBvZiBmbG9hdHMuCkBAIC05MjQsMTcgKzkyNCwxNyBAQAogICAgZGVmIG1zdW0oaXRlcmFibGUpOgogICAgICAgIHBhcnRpYWxzID0gW10gICMgc29ydGVkLCBub24tb3ZlcmxhcHBpbmcgcGFydGlhbCBzdW1zCiAgICAgICAgZm9yIHggaW4gaXRlcmFibGU6Ci0gICAgICAgICAgIGkgPSAwCi0gICAgICAgICAgIGZvciB5IGluIHBhcnRpYWxzOgotICAgICAgICAgICAgICAgaWYgYWJzKHgpIDwgYWJzKHkpOgotICAgICAgICAgICAgICAgICAgIHgsIHkgPSB5LCB4Ci0gICAgICAgICAgICAgICBoaSA9IHggKyB5Ci0gICAgICAgICAgICAgICBsbyA9IHkgLSAoaGkgLSB4KQotICAgICAgICAgICAgICAgaWYgbG86Ci0gICAgICAgICAgICAgICAgICAgcGFydGlhbHNbaV0gPSBsbwotICAgICAgICAgICAgICAgICAgIGkgKz0gMQotICAgICAgICAgICAgICAgeCA9IGhpCi0gICAgICAgICAgIHBhcnRpYWxzW2k6XSA9IFt4XQorICAgICAgIGkgPSAwCisgICAgICAgZm9yIHkgaW4gcGFydGlhbHM6CisgICAgICAgICAgIGlmIGFicyh4KSA8IGFicyh5KToKKyAgICAgICAgICAgeCwgeSA9IHksIHgKKyAgICAgICAgICAgaGkgPSB4ICsgeQorICAgICAgICAgICBsbyA9IHkgLSAoaGkgLSB4KQorICAgICAgICAgICBpZiBsbzoKKyAgICAgICAgICAgcGFydGlhbHNbaV0gPSBsbworICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgeCA9IGhpCisgICAgICAgcGFydGlhbHNbaTpdID0gW3hdCiAgICAgICAgcmV0dXJuIHN1bV9leGFjdChwYXJ0aWFscykKIAogICAgUm91bmRlZCB4K3kgc3RvcmVkIGluIGhpIHdpdGggdGhlIHJvdW5kb2ZmIHN0b3JlZCBpbiBsby4gIFRvZ2V0aGVyIGhpK2xvCkBAIC05NTIsMTE5ICs5NTIsMTE5IEBACiBzdGF0aWMgUHlPYmplY3QqCiBtYXRoX2ZzdW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXEpCiB7Ci0JUHlPYmplY3QgKml0ZW0sICppdGVyLCAqc3VtID0gTlVMTDsKLQlQeV9zc2l6ZV90IGksIGosIG4gPSAwLCBtID0gTlVNX1BBUlRJQUxTOwotCWRvdWJsZSB4LCB5LCB0LCBwc1tOVU1fUEFSVElBTFNdLCAqcCA9IHBzOwotCWRvdWJsZSB4c2F2ZSwgc3BlY2lhbF9zdW0gPSAwLjAsIGluZl9zdW0gPSAwLjA7Ci0Jdm9sYXRpbGUgZG91YmxlIGhpLCB5ciwgbG87CisgICAgUHlPYmplY3QgKml0ZW0sICppdGVyLCAqc3VtID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGksIGosIG4gPSAwLCBtID0gTlVNX1BBUlRJQUxTOworICAgIGRvdWJsZSB4LCB5LCB0LCBwc1tOVU1fUEFSVElBTFNdLCAqcCA9IHBzOworICAgIGRvdWJsZSB4c2F2ZSwgc3BlY2lhbF9zdW0gPSAwLjAsIGluZl9zdW0gPSAwLjA7CisgICAgdm9sYXRpbGUgZG91YmxlIGhpLCB5ciwgbG87CiAKLQlpdGVyID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCWlmIChpdGVyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJmc3VtIiwgUHlfREVDUkVGKGl0ZXIpOyByZXR1cm4gTlVMTCkKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJmc3VtIiwgUHlfREVDUkVGKGl0ZXIpOyByZXR1cm4gTlVMTCkKIAotCWZvcig7OykgeyAgICAgICAgICAgLyogZm9yIHggaW4gaXRlcmFibGUgKi8KLQkJYXNzZXJ0KDAgPD0gbiAmJiBuIDw9IG0pOwotCQlhc3NlcnQoKG0gPT0gTlVNX1BBUlRJQUxTICYmIHAgPT0gcHMpIHx8Ci0JCSAgICAgICAobSA+ICBOVU1fUEFSVElBTFMgJiYgcCAhPSBOVUxMKSk7CisgICAgZm9yKDs7KSB7ICAgICAgICAgICAvKiBmb3IgeCBpbiBpdGVyYWJsZSAqLworICAgICAgICBhc3NlcnQoMCA8PSBuICYmIG4gPD0gbSk7CisgICAgICAgIGFzc2VydCgobSA9PSBOVU1fUEFSVElBTFMgJiYgcCA9PSBwcykgfHwKKyAgICAgICAgICAgICAgIChtID4gIE5VTV9QQVJUSUFMUyAmJiBwICE9IE5VTEwpKTsKIAotCQlpdGVtID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gX2ZzdW1fZXJyb3I7Ci0JCQlicmVhazsKLQkJfQotCQl4ID0gUHlGbG9hdF9Bc0RvdWJsZShpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gX2ZzdW1fZXJyb3I7CisgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBfZnN1bV9lcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBfZnN1bV9lcnJvcjsKIAotCQl4c2F2ZSA9IHg7Ci0JCWZvciAoaSA9IGogPSAwOyBqIDwgbjsgaisrKSB7ICAgICAgIC8qIGZvciB5IGluIHBhcnRpYWxzICovCi0JCQl5ID0gcFtqXTsKLQkJCWlmIChmYWJzKHgpIDwgZmFicyh5KSkgewotCQkJCXQgPSB4OyB4ID0geTsgeSA9IHQ7Ci0JCQl9Ci0JCQloaSA9IHggKyB5OwotCQkJeXIgPSBoaSAtIHg7Ci0JCQlsbyA9IHkgLSB5cjsKLQkJCWlmIChsbyAhPSAwLjApCi0JCQkJcFtpKytdID0gbG87Ci0JCQl4ID0gaGk7Ci0JCX0KKyAgICAgICAgeHNhdmUgPSB4OworICAgICAgICBmb3IgKGkgPSBqID0gMDsgaiA8IG47IGorKykgeyAgICAgICAvKiBmb3IgeSBpbiBwYXJ0aWFscyAqLworICAgICAgICAgICAgeSA9IHBbal07CisgICAgICAgICAgICBpZiAoZmFicyh4KSA8IGZhYnMoeSkpIHsKKyAgICAgICAgICAgICAgICB0ID0geDsgeCA9IHk7IHkgPSB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGkgPSB4ICsgeTsKKyAgICAgICAgICAgIHlyID0gaGkgLSB4OworICAgICAgICAgICAgbG8gPSB5IC0geXI7CisgICAgICAgICAgICBpZiAobG8gIT0gMC4wKQorICAgICAgICAgICAgICAgIHBbaSsrXSA9IGxvOworICAgICAgICAgICAgeCA9IGhpOworICAgICAgICB9CiAKLQkJbiA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNbaTpdID0gW3hdICovCi0JCWlmICh4ICE9IDAuMCkgewotCQkJaWYgKCEgUHlfSVNfRklOSVRFKHgpKSB7Ci0JCQkJLyogYSBub25maW5pdGUgeCBjb3VsZCBhcmlzZSBlaXRoZXIgYXMKLQkJCQkgICBhIHJlc3VsdCBvZiBpbnRlcm1lZGlhdGUgb3ZlcmZsb3csIG9yCi0JCQkJICAgYXMgYSByZXN1bHQgb2YgYSBuYW4gb3IgaW5mIGluIHRoZQotCQkJCSAgIHN1bW1hbmRzICovCi0JCQkJaWYgKFB5X0lTX0ZJTklURSh4c2F2ZSkpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCSAgICAgICJpbnRlcm1lZGlhdGUgb3ZlcmZsb3cgaW4gZnN1bSIpOwotCQkJCQlnb3RvIF9mc3VtX2Vycm9yOwotCQkJCX0KLQkJCQlpZiAoUHlfSVNfSU5GSU5JVFkoeHNhdmUpKQotCQkJCQlpbmZfc3VtICs9IHhzYXZlOwotCQkJCXNwZWNpYWxfc3VtICs9IHhzYXZlOwotCQkJCS8qIHJlc2V0IHBhcnRpYWxzICovCi0JCQkJbiA9IDA7Ci0JCQl9Ci0JCQllbHNlIGlmIChuID49IG0gJiYgX2ZzdW1fcmVhbGxvYygmcCwgbiwgcHMsICZtKSkKLQkJCQlnb3RvIF9mc3VtX2Vycm9yOwotCQkJZWxzZQotCQkJCXBbbisrXSA9IHg7Ci0JCX0KLQl9CisgICAgICAgIG4gPSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBzW2k6XSA9IFt4XSAqLworICAgICAgICBpZiAoeCAhPSAwLjApIHsKKyAgICAgICAgICAgIGlmICghIFB5X0lTX0ZJTklURSh4KSkgeworICAgICAgICAgICAgICAgIC8qIGEgbm9uZmluaXRlIHggY291bGQgYXJpc2UgZWl0aGVyIGFzCisgICAgICAgICAgICAgICAgICAgYSByZXN1bHQgb2YgaW50ZXJtZWRpYXRlIG92ZXJmbG93LCBvcgorICAgICAgICAgICAgICAgICAgIGFzIGEgcmVzdWx0IG9mIGEgbmFuIG9yIGluZiBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICBzdW1tYW5kcyAqLworICAgICAgICAgICAgICAgIGlmIChQeV9JU19GSU5JVEUoeHNhdmUpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJtZWRpYXRlIG92ZXJmbG93IGluIGZzdW0iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBfZnN1bV9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHhzYXZlKSkKKyAgICAgICAgICAgICAgICAgICAgaW5mX3N1bSArPSB4c2F2ZTsKKyAgICAgICAgICAgICAgICBzcGVjaWFsX3N1bSArPSB4c2F2ZTsKKyAgICAgICAgICAgICAgICAvKiByZXNldCBwYXJ0aWFscyAqLworICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobiA+PSBtICYmIF9mc3VtX3JlYWxsb2MoJnAsIG4sIHBzLCAmbSkpCisgICAgICAgICAgICAgICAgZ290byBfZnN1bV9lcnJvcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwW24rK10gPSB4OworICAgICAgICB9CisgICAgfQogCi0JaWYgKHNwZWNpYWxfc3VtICE9IDAuMCkgewotCQlpZiAoUHlfSVNfTkFOKGluZl9zdW0pKQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSItaW5mICsgaW5mIGluIGZzdW0iKTsKLQkJZWxzZQotCQkJc3VtID0gUHlGbG9hdF9Gcm9tRG91YmxlKHNwZWNpYWxfc3VtKTsKLQkJZ290byBfZnN1bV9lcnJvcjsKLQl9CisgICAgaWYgKHNwZWNpYWxfc3VtICE9IDAuMCkgeworICAgICAgICBpZiAoUHlfSVNfTkFOKGluZl9zdW0pKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1pbmYgKyBpbmYgaW4gZnN1bSIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdW0gPSBQeUZsb2F0X0Zyb21Eb3VibGUoc3BlY2lhbF9zdW0pOworICAgICAgICBnb3RvIF9mc3VtX2Vycm9yOworICAgIH0KIAotCWhpID0gMC4wOwotCWlmIChuID4gMCkgewotCQloaSA9IHBbLS1uXTsKLQkJLyogc3VtX2V4YWN0KHBzLCBoaSkgZnJvbSB0aGUgdG9wLCBzdG9wIHdoZW4gdGhlIHN1bSBiZWNvbWVzCi0JCSAgIGluZXhhY3QuICovCi0JCXdoaWxlIChuID4gMCkgewotCQkJeCA9IGhpOwotCQkJeSA9IHBbLS1uXTsKLQkJCWFzc2VydChmYWJzKHkpIDwgZmFicyh4KSk7Ci0JCQloaSA9IHggKyB5OwotCQkJeXIgPSBoaSAtIHg7Ci0JCQlsbyA9IHkgLSB5cjsKLQkJCWlmIChsbyAhPSAwLjApCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLyogTWFrZSBoYWxmLWV2ZW4gcm91bmRpbmcgd29yayBhY3Jvc3MgbXVsdGlwbGUgcGFydGlhbHMuCi0JCSAgIE5lZWRlZCBzbyB0aGF0IHN1bShbMWUtMTYsIDEsIDFlMTZdKSB3aWxsIHJvdW5kLXVwIHRoZSBsYXN0Ci0JCSAgIGRpZ2l0IHRvIHR3byBpbnN0ZWFkIG9mIGRvd24gdG8gemVybyAodGhlIDFlLTE2IG1ha2VzIHRoZSAxCi0JCSAgIHNsaWdodGx5IGNsb3NlciB0byB0d28pLiAgV2l0aCBhIHBvdGVudGlhbCAxIFVMUCByb3VuZGluZwotCQkgICBlcnJvciBmaXhlZC11cCwgbWF0aC5mc3VtKCkgY2FuIGd1YXJhbnRlZSBjb21tdXRhdGl2aXR5LiAqLwotCQlpZiAobiA+IDAgJiYgKChsbyA8IDAuMCAmJiBwW24tMV0gPCAwLjApIHx8Ci0JCQkgICAgICAobG8gPiAwLjAgJiYgcFtuLTFdID4gMC4wKSkpIHsKLQkJCXkgPSBsbyAqIDIuMDsKLQkJCXggPSBoaSArIHk7Ci0JCQl5ciA9IHggLSBoaTsKLQkJCWlmICh5ID09IHlyKQotCQkJCWhpID0geDsKLQkJfQotCX0KLQlzdW0gPSBQeUZsb2F0X0Zyb21Eb3VibGUoaGkpOworICAgIGhpID0gMC4wOworICAgIGlmIChuID4gMCkgeworICAgICAgICBoaSA9IHBbLS1uXTsKKyAgICAgICAgLyogc3VtX2V4YWN0KHBzLCBoaSkgZnJvbSB0aGUgdG9wLCBzdG9wIHdoZW4gdGhlIHN1bSBiZWNvbWVzCisgICAgICAgICAgIGluZXhhY3QuICovCisgICAgICAgIHdoaWxlIChuID4gMCkgeworICAgICAgICAgICAgeCA9IGhpOworICAgICAgICAgICAgeSA9IHBbLS1uXTsKKyAgICAgICAgICAgIGFzc2VydChmYWJzKHkpIDwgZmFicyh4KSk7CisgICAgICAgICAgICBoaSA9IHggKyB5OworICAgICAgICAgICAgeXIgPSBoaSAtIHg7CisgICAgICAgICAgICBsbyA9IHkgLSB5cjsKKyAgICAgICAgICAgIGlmIChsbyAhPSAwLjApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogTWFrZSBoYWxmLWV2ZW4gcm91bmRpbmcgd29yayBhY3Jvc3MgbXVsdGlwbGUgcGFydGlhbHMuCisgICAgICAgICAgIE5lZWRlZCBzbyB0aGF0IHN1bShbMWUtMTYsIDEsIDFlMTZdKSB3aWxsIHJvdW5kLXVwIHRoZSBsYXN0CisgICAgICAgICAgIGRpZ2l0IHRvIHR3byBpbnN0ZWFkIG9mIGRvd24gdG8gemVybyAodGhlIDFlLTE2IG1ha2VzIHRoZSAxCisgICAgICAgICAgIHNsaWdodGx5IGNsb3NlciB0byB0d28pLiAgV2l0aCBhIHBvdGVudGlhbCAxIFVMUCByb3VuZGluZworICAgICAgICAgICBlcnJvciBmaXhlZC11cCwgbWF0aC5mc3VtKCkgY2FuIGd1YXJhbnRlZSBjb21tdXRhdGl2aXR5LiAqLworICAgICAgICBpZiAobiA+IDAgJiYgKChsbyA8IDAuMCAmJiBwW24tMV0gPCAwLjApIHx8CisgICAgICAgICAgICAgICAgICAgICAgKGxvID4gMC4wICYmIHBbbi0xXSA+IDAuMCkpKSB7CisgICAgICAgICAgICB5ID0gbG8gKiAyLjA7CisgICAgICAgICAgICB4ID0gaGkgKyB5OworICAgICAgICAgICAgeXIgPSB4IC0gaGk7CisgICAgICAgICAgICBpZiAoeSA9PSB5cikKKyAgICAgICAgICAgICAgICBoaSA9IHg7CisgICAgICAgIH0KKyAgICB9CisgICAgc3VtID0gUHlGbG9hdF9Gcm9tRG91YmxlKGhpKTsKIAogX2ZzdW1fZXJyb3I6Ci0JUHlGUEVfRU5EX1BST1RFQ1QoaGkpCi0JUHlfREVDUkVGKGl0ZXIpOwotCWlmIChwICE9IHBzKQotCQlQeU1lbV9GcmVlKHApOwotCXJldHVybiBzdW07CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoaGkpCisgICAgUHlfREVDUkVGKGl0ZXIpOworICAgIGlmIChwICE9IHBzKQorICAgICAgICBQeU1lbV9GcmVlKHApOworICAgIHJldHVybiBzdW07CiB9CiAKICN1bmRlZiBOVU1fUEFSVElBTFMKQEAgLTEwNzcsNTMgKzEwNzcsNTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoX2ZhY3RvcmlhbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlsb25nIGksIHg7Ci0JUHlPYmplY3QgKnJlc3VsdCwgKmlvYmosICpuZXdyZXN1bHQ7CisgICAgbG9uZyBpLCB4OworICAgIFB5T2JqZWN0ICpyZXN1bHQsICppb2JqLCAqbmV3cmVzdWx0OwogCi0JaWYgKFB5RmxvYXRfQ2hlY2soYXJnKSkgewotCQlQeU9iamVjdCAqbHg7Ci0JCWRvdWJsZSBkeCA9IFB5RmxvYXRfQVNfRE9VQkxFKChQeUZsb2F0T2JqZWN0ICopYXJnKTsKLQkJaWYgKCEoUHlfSVNfRklOSVRFKGR4KSAmJiBkeCA9PSBmbG9vcihkeCkpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgCi0JCQkJImZhY3RvcmlhbCgpIG9ubHkgYWNjZXB0cyBpbnRlZ3JhbCB2YWx1ZXMiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWx4ID0gUHlMb25nX0Zyb21Eb3VibGUoZHgpOwotCQlpZiAobHggPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQl4ID0gUHlMb25nX0FzTG9uZyhseCk7Ci0JCVB5X0RFQ1JFRihseCk7Ci0JfQotCWVsc2UKLQkJeCA9IFB5SW50X0FzTG9uZyhhcmcpOworICAgIGlmIChQeUZsb2F0X0NoZWNrKGFyZykpIHsKKyAgICAgICAgUHlPYmplY3QgKmx4OworICAgICAgICBkb3VibGUgZHggPSBQeUZsb2F0X0FTX0RPVUJMRSgoUHlGbG9hdE9iamVjdCAqKWFyZyk7CisgICAgICAgIGlmICghKFB5X0lTX0ZJTklURShkeCkgJiYgZHggPT0gZmxvb3IoZHgpKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImZhY3RvcmlhbCgpIG9ubHkgYWNjZXB0cyBpbnRlZ3JhbCB2YWx1ZXMiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGx4ID0gUHlMb25nX0Zyb21Eb3VibGUoZHgpOworICAgICAgICBpZiAobHggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB4ID0gUHlMb25nX0FzTG9uZyhseCk7CisgICAgICAgIFB5X0RFQ1JFRihseCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgeCA9IFB5SW50X0FzTG9uZyhhcmcpOwogCi0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHggPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAKLQkJCSJmYWN0b3JpYWwoKSBub3QgZGVmaW5lZCBmb3IgbmVnYXRpdmUgdmFsdWVzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAiZmFjdG9yaWFsKCkgbm90IGRlZmluZWQgZm9yIG5lZ2F0aXZlIHZhbHVlcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXN1bHQgPSAoUHlPYmplY3QgKilQeUludF9Gcm9tTG9uZygxKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaT0xIDsgaTw9eCA7IGkrKykgewotCQlpb2JqID0gKFB5T2JqZWN0ICopUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCWlmIChpb2JqID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQluZXdyZXN1bHQgPSBQeU51bWJlcl9NdWx0aXBseShyZXN1bHQsIGlvYmopOwotCQlQeV9ERUNSRUYoaW9iaik7Ci0JCWlmIChuZXdyZXN1bHQgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBuZXdyZXN1bHQ7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gKFB5T2JqZWN0ICopUHlJbnRfRnJvbUxvbmcoMSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGk9MSA7IGk8PXggOyBpKyspIHsKKyAgICAgICAgaW9iaiA9IChQeU9iamVjdCAqKVB5SW50X0Zyb21Mb25nKGkpOworICAgICAgICBpZiAoaW9iaiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgbmV3cmVzdWx0ID0gUHlOdW1iZXJfTXVsdGlwbHkocmVzdWx0LCBpb2JqKTsKKyAgICAgICAgUHlfREVDUkVGKGlvYmopOworICAgICAgICBpZiAobmV3cmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gbmV3cmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogCiBlcnJvcjoKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfZmFjdG9yaWFsX2RvYywKQEAgLTExMzQsNyArMTEzNCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF90cnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm51bWJlcikKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChudW1iZXIsICJfX3RydW5jX18iLCBOVUxMKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChudW1iZXIsICJfX3RydW5jX18iLCBOVUxMKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfdHJ1bmNfZG9jLApAQCAtMTE0NSwyMSArMTE0NSwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfZnJleHAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JaW50IGk7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBkZWFsIHdpdGggc3BlY2lhbCBjYXNlcyBkaXJlY3RseSwgdG8gc2lkZXN0ZXAgcGxhdGZvcm0KLQkgICBkaWZmZXJlbmNlcyAqLwotCWlmIChQeV9JU19OQU4oeCkgfHwgUHlfSVNfSU5GSU5JVFkoeCkgfHwgIXgpIHsKLQkJaSA9IDA7Ci0JfQotCWVsc2UgewotCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX2ZyZXhwIiwgcmV0dXJuIDApOwotCQl4ID0gZnJleHAoeCwgJmkpOwotCQlQeUZQRV9FTkRfUFJPVEVDVCh4KTsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkaSkiLCB4LCBpKTsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIGRlYWwgd2l0aCBzcGVjaWFsIGNhc2VzIGRpcmVjdGx5LCB0byBzaWRlc3RlcCBwbGF0Zm9ybQorICAgICAgIGRpZmZlcmVuY2VzICovCisgICAgaWYgKFB5X0lTX05BTih4KSB8fCBQeV9JU19JTkZJTklUWSh4KSB8fCAheCkgeworICAgICAgICBpID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfZnJleHAiLCByZXR1cm4gMCk7CisgICAgICAgIHggPSBmcmV4cCh4LCAmaSk7CisgICAgICAgIFB5RlBFX0VORF9QUk9URUNUKHgpOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRpKSIsIHgsIGkpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9mcmV4cF9kb2MsCkBAIC0xMTcyLDUzICsxMTcyLDUzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9sZGV4cChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIHgsIHI7Ci0JUHlPYmplY3QgKm9leHA7Ci0JbG9uZyBleHA7Ci0JaW50IG92ZXJmbG93OwotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImRPOmxkZXhwIiwgJngsICZvZXhwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgZG91YmxlIHgsIHI7CisgICAgUHlPYmplY3QgKm9leHA7CisgICAgbG9uZyBleHA7CisgICAgaW50IG92ZXJmbG93OworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImRPOmxkZXhwIiwgJngsICZvZXhwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlMb25nX0NoZWNrKG9leHApIHx8IFB5SW50X0NoZWNrKG9leHApKSB7Ci0JCS8qIG9uIG92ZXJmbG93LCByZXBsYWNlIGV4cG9uZW50IHdpdGggZWl0aGVyIExPTkdfTUFYCi0JCSAgIG9yIExPTkdfTUlOLCBkZXBlbmRpbmcgb24gdGhlIHNpZ24uICovCi0JCWV4cCA9IFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdyhvZXhwLCAmb3ZlcmZsb3cpOwotCQlpZiAoZXhwID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKG92ZXJmbG93KQotCQkJZXhwID0gb3ZlcmZsb3cgPCAwID8gTE9OR19NSU4gOiBMT05HX01BWDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIkV4cGVjdGVkIGFuIGludCBvciBsb25nIGFzIHNlY29uZCBhcmd1bWVudCAiCi0JCQkJInRvIGxkZXhwLiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5TG9uZ19DaGVjayhvZXhwKSB8fCBQeUludF9DaGVjayhvZXhwKSkgeworICAgICAgICAvKiBvbiBvdmVyZmxvdywgcmVwbGFjZSBleHBvbmVudCB3aXRoIGVpdGhlciBMT05HX01BWAorICAgICAgICAgICBvciBMT05HX01JTiwgZGVwZW5kaW5nIG9uIHRoZSBzaWduLiAqLworICAgICAgICBleHAgPSBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cob2V4cCwgJm92ZXJmbG93KTsKKyAgICAgICAgaWYgKGV4cCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChvdmVyZmxvdykKKyAgICAgICAgICAgIGV4cCA9IG92ZXJmbG93IDwgMCA/IExPTkdfTUlOIDogTE9OR19NQVg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGFuIGludCBvciBsb25nIGFzIHNlY29uZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidG8gbGRleHAuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICh4ID09IDAuIHx8ICFQeV9JU19GSU5JVEUoeCkpIHsKLQkJLyogTmFOcywgemVyb3MgYW5kIGluZmluaXRpZXMgYXJlIHJldHVybmVkIHVuY2hhbmdlZCAqLwotCQlyID0geDsKLQkJZXJybm8gPSAwOwotCX0gZWxzZSBpZiAoZXhwID4gSU5UX01BWCkgewotCQkvKiBvdmVyZmxvdyAqLwotCQlyID0gY29weXNpZ24oUHlfSFVHRV9WQUwsIHgpOwotCQllcnJubyA9IEVSQU5HRTsKLQl9IGVsc2UgaWYgKGV4cCA8IElOVF9NSU4pIHsKLQkJLyogdW5kZXJmbG93IHRvICstMCAqLwotCQlyID0gY29weXNpZ24oMC4sIHgpOwotCQllcnJubyA9IDA7Ci0JfSBlbHNlIHsKLQkJZXJybm8gPSAwOwotCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX2xkZXhwIiwgcmV0dXJuIDApOwotCQlyID0gbGRleHAoeCwgKGludClleHApOwotCQlQeUZQRV9FTkRfUFJPVEVDVChyKTsKLQkJaWYgKFB5X0lTX0lORklOSVRZKHIpKQotCQkJZXJybm8gPSBFUkFOR0U7Ci0JfQorICAgIGlmICh4ID09IDAuIHx8ICFQeV9JU19GSU5JVEUoeCkpIHsKKyAgICAgICAgLyogTmFOcywgemVyb3MgYW5kIGluZmluaXRpZXMgYXJlIHJldHVybmVkIHVuY2hhbmdlZCAqLworICAgICAgICByID0geDsKKyAgICAgICAgZXJybm8gPSAwOworICAgIH0gZWxzZSBpZiAoZXhwID4gSU5UX01BWCkgeworICAgICAgICAvKiBvdmVyZmxvdyAqLworICAgICAgICByID0gY29weXNpZ24oUHlfSFVHRV9WQUwsIHgpOworICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICB9IGVsc2UgaWYgKGV4cCA8IElOVF9NSU4pIHsKKyAgICAgICAgLyogdW5kZXJmbG93IHRvICstMCAqLworICAgICAgICByID0gY29weXNpZ24oMC4sIHgpOworICAgICAgICBlcnJubyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX2xkZXhwIiwgcmV0dXJuIDApOworICAgICAgICByID0gbGRleHAoeCwgKGludClleHApOworICAgICAgICBQeUZQRV9FTkRfUFJPVEVDVChyKTsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHIpKQorICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgfQogCi0JaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOworICAgIGlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfbGRleHBfZG9jLApAQCAtMTIyOCwyMyArMTIyOCwyMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfbW9kZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlkb3VibGUgeSwgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCS8qIHNvbWUgcGxhdGZvcm1zIGRvbid0IGRvIHRoZSByaWdodCB0aGluZyBmb3IgTmFOcyBhbmQKLQkgICBpbmZpbml0aWVzLCBzbyB3ZSB0YWtlIGNhcmUgb2Ygc3BlY2lhbCBjYXNlcyBkaXJlY3RseS4gKi8KLQlpZiAoIVB5X0lTX0ZJTklURSh4KSkgewotCQlpZiAoUHlfSVNfSU5GSU5JVFkoeCkpCi0JCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRkKSIsIGNvcHlzaWduKDAuLCB4KSwgeCk7Ci0JCWVsc2UgaWYgKFB5X0lTX05BTih4KSkKLQkJCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZGQpIiwgeCwgeCk7Ci0JfSAgICAgICAgICAKKyAgICBkb3VibGUgeSwgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIHNvbWUgcGxhdGZvcm1zIGRvbid0IGRvIHRoZSByaWdodCB0aGluZyBmb3IgTmFOcyBhbmQKKyAgICAgICBpbmZpbml0aWVzLCBzbyB3ZSB0YWtlIGNhcmUgb2Ygc3BlY2lhbCBjYXNlcyBkaXJlY3RseS4gKi8KKyAgICBpZiAoIVB5X0lTX0ZJTklURSh4KSkgeworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeCkpCisgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRkKSIsIGNvcHlzaWduKDAuLCB4KSwgeCk7CisgICAgICAgIGVsc2UgaWYgKFB5X0lTX05BTih4KSkKKyAgICAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZGQpIiwgeCwgeCk7CisgICAgfQogCi0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfbW9kZiIsIHJldHVybiAwKTsKLQl4ID0gbW9kZih4LCAmeSk7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoeCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkZCkiLCB4LCB5KTsKKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF9tb2RmIiwgcmV0dXJuIDApOworICAgIHggPSBtb2RmKHgsICZ5KTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVCh4KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRkKSIsIHgsIHkpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9tb2RmX2RvYywKQEAgLTEyNjUsNTYgKzEyNjUsNTYgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGxvZ2hlbHBlcihQeU9iamVjdCogYXJnLCBkb3VibGUgKCpmdW5jKShkb3VibGUpLCBjaGFyICpmdW5jbmFtZSkKIHsKLQkvKiBJZiBpdCBpcyBsb25nLCBkbyBpdCBvdXJzZWx2ZXMuICovCi0JaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7Ci0JCWRvdWJsZSB4OwotCQlQeV9zc2l6ZV90IGU7Ci0JCXggPSBfUHlMb25nX0ZyZXhwKChQeUxvbmdPYmplY3QgKilhcmcsICZlKTsKLQkJaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICh4IDw9IDAuMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJtYXRoIGRvbWFpbiBlcnJvciIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJLyogU3BlY2lhbCBjYXNlIGZvciBsb2coMSksIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYW4KLQkJICAgZXhhY3QgcmVzdWx0IHRoZXJlLiAqLwotCQlpZiAoZSA9PSAxICYmIHggPT0gMC41KQotCQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgwLjApOwotCQkvKiBWYWx1ZSBpcyB+PSB4ICogMioqZSwgc28gdGhlIGxvZyB+PSBsb2coeCkgKyBsb2coMikgKiBlLiAqLwotCQl4ID0gZnVuYyh4KSArIGZ1bmMoMi4wKSAqIGU7Ci0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7Ci0JfQorICAgIC8qIElmIGl0IGlzIGxvbmcsIGRvIGl0IG91cnNlbHZlcy4gKi8KKyAgICBpZiAoUHlMb25nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgZG91YmxlIHg7CisgICAgICAgIFB5X3NzaXplX3QgZTsKKyAgICAgICAgeCA9IF9QeUxvbmdfRnJleHAoKFB5TG9uZ09iamVjdCAqKWFyZywgJmUpOworICAgICAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHggPD0gMC4wKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0aCBkb21haW4gZXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbG9nKDEpLCB0byBtYWtlIHN1cmUgd2UgZ2V0IGFuCisgICAgICAgICAgIGV4YWN0IHJlc3VsdCB0aGVyZS4gKi8KKyAgICAgICAgaWYgKGUgPT0gMSAmJiB4ID09IDAuNSkKKyAgICAgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoMC4wKTsKKyAgICAgICAgLyogVmFsdWUgaXMgfj0geCAqIDIqKmUsIHNvIHRoZSBsb2cgfj0gbG9nKHgpICsgbG9nKDIpICogZS4gKi8KKyAgICAgICAgeCA9IGZ1bmMoeCkgKyBmdW5jKDIuMCkgKiBlOworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworICAgIH0KIAotCS8qIEVsc2UgbGV0IGxpYm0gaGFuZGxlIGl0IGJ5IGl0c2VsZi4gKi8KLQlyZXR1cm4gbWF0aF8xKGFyZywgZnVuYywgMCk7CisgICAgLyogRWxzZSBsZXQgbGlibSBoYW5kbGUgaXQgYnkgaXRzZWxmLiAqLworICAgIHJldHVybiBtYXRoXzEoYXJnLCBmdW5jLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfbG9nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqYXJnOwotCVB5T2JqZWN0ICpiYXNlID0gTlVMTDsKLQlQeU9iamVjdCAqbnVtLCAqZGVuOwotCVB5T2JqZWN0ICphbnM7CisgICAgUHlPYmplY3QgKmFyZzsKKyAgICBQeU9iamVjdCAqYmFzZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm51bSwgKmRlbjsKKyAgICBQeU9iamVjdCAqYW5zOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAibG9nIiwgMSwgMiwgJmFyZywgJmJhc2UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJsb2ciLCAxLCAyLCAmYXJnLCAmYmFzZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbnVtID0gbG9naGVscGVyKGFyZywgbV9sb2csICJsb2ciKTsKLQlpZiAobnVtID09IE5VTEwgfHwgYmFzZSA9PSBOVUxMKQotCQlyZXR1cm4gbnVtOworICAgIG51bSA9IGxvZ2hlbHBlcihhcmcsIG1fbG9nLCAibG9nIik7CisgICAgaWYgKG51bSA9PSBOVUxMIHx8IGJhc2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bTsKIAotCWRlbiA9IGxvZ2hlbHBlcihiYXNlLCBtX2xvZywgImxvZyIpOwotCWlmIChkZW4gPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobnVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGRlbiA9IGxvZ2hlbHBlcihiYXNlLCBtX2xvZywgImxvZyIpOworICAgIGlmIChkZW4gPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobnVtKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYW5zID0gUHlOdW1iZXJfRGl2aWRlKG51bSwgZGVuKTsKLQlQeV9ERUNSRUYobnVtKTsKLQlQeV9ERUNSRUYoZGVuKTsKLQlyZXR1cm4gYW5zOworICAgIGFucyA9IFB5TnVtYmVyX0RpdmlkZShudW0sIGRlbik7CisgICAgUHlfREVDUkVGKG51bSk7CisgICAgUHlfREVDUkVGKGRlbik7CisgICAgcmV0dXJuIGFuczsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfbG9nX2RvYywKQEAgLTEzMjUsNyArMTMyNSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9sb2cxMChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlyZXR1cm4gbG9naGVscGVyKGFyZywgbV9sb2cxMCwgImxvZzEwIik7CisgICAgcmV0dXJuIGxvZ2hlbHBlcihhcmcsIG1fbG9nMTAsICJsb2cxMCIpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9sb2cxMF9kb2MsCkBAIC0xMzM0LDMxICsxMzM0LDMxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9mbW9kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb3gsICpveTsKLQlkb3VibGUgciwgeCwgeTsKLQlpZiAoISBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZm1vZCIsIDIsIDIsICZveCwgJm95KSkKLQkJcmV0dXJuIE5VTEw7Ci0JeCA9IFB5RmxvYXRfQXNEb3VibGUob3gpOwotCXkgPSBQeUZsb2F0X0FzRG91YmxlKG95KTsKLQlpZiAoKHggPT0gLTEuMCB8fCB5ID09IC0xLjApICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCS8qIGZtb2QoeCwgKy8tSW5mKSByZXR1cm5zIHggZm9yIGZpbml0ZSB4LiAqLwotCWlmIChQeV9JU19JTkZJTklUWSh5KSAmJiBQeV9JU19GSU5JVEUoeCkpCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7Ci0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfZm1vZCIsIHJldHVybiAwKTsKLQlyID0gZm1vZCh4LCB5KTsKLQlQeUZQRV9FTkRfUFJPVEVDVChyKTsKLQlpZiAoUHlfSVNfTkFOKHIpKSB7Ci0JCWlmICghUHlfSVNfTkFOKHgpICYmICFQeV9JU19OQU4oeSkpCi0JCQllcnJubyA9IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQl9Ci0JaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocik7CisgICAgUHlPYmplY3QgKm94LCAqb3k7CisgICAgZG91YmxlIHIsIHgsIHk7CisgICAgaWYgKCEgUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZtb2QiLCAyLCAyLCAmb3gsICZveSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKG94KTsKKyAgICB5ID0gUHlGbG9hdF9Bc0RvdWJsZShveSk7CisgICAgaWYgKCh4ID09IC0xLjAgfHwgeSA9PSAtMS4wKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBmbW9kKHgsICsvLUluZikgcmV0dXJucyB4IGZvciBmaW5pdGUgeC4gKi8KKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeSkgJiYgUHlfSVNfRklOSVRFKHgpKQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworICAgIGVycm5vID0gMDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX2Ztb2QiLCByZXR1cm4gMCk7CisgICAgciA9IGZtb2QoeCwgeSk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1Qocik7CisgICAgaWYgKFB5X0lTX05BTihyKSkgeworICAgICAgICBpZiAoIVB5X0lTX05BTih4KSAmJiAhUHlfSVNfTkFOKHkpKQorICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgfQorICAgIGlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9mbW9kX2RvYywKQEAgLTEzNjgsMzkgKzEzNjgsMzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoX2h5cG90KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb3gsICpveTsKLQlkb3VibGUgciwgeCwgeTsKLQlpZiAoISBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaHlwb3QiLCAyLCAyLCAmb3gsICZveSkpCi0JCXJldHVybiBOVUxMOwotCXggPSBQeUZsb2F0X0FzRG91YmxlKG94KTsKLQl5ID0gUHlGbG9hdF9Bc0RvdWJsZShveSk7Ci0JaWYgKCh4ID09IC0xLjAgfHwgeSA9PSAtMS4wKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBoeXBvdCh4LCArLy1JbmYpIHJldHVybnMgSW5mLCBldmVuIGlmIHggaXMgYSBOYU4uICovCi0JaWYgKFB5X0lTX0lORklOSVRZKHgpKQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGZhYnMoeCkpOwotCWlmIChQeV9JU19JTkZJTklUWSh5KSkKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmYWJzKHkpKTsKLQllcnJubyA9IDA7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF9oeXBvdCIsIHJldHVybiAwKTsKLQlyID0gaHlwb3QoeCwgeSk7Ci0JUHlGUEVfRU5EX1BST1RFQ1Qocik7Ci0JaWYgKFB5X0lTX05BTihyKSkgewotCQlpZiAoIVB5X0lTX05BTih4KSAmJiAhUHlfSVNfTkFOKHkpKQotCQkJZXJybm8gPSBFRE9NOwotCQllbHNlCi0JCQllcnJubyA9IDA7Ci0JfQotCWVsc2UgaWYgKFB5X0lTX0lORklOSVRZKHIpKSB7Ci0JCWlmIChQeV9JU19GSU5JVEUoeCkgJiYgUHlfSVNfRklOSVRFKHkpKQotCQkJZXJybm8gPSBFUkFOR0U7Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQl9Ci0JaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocik7CisgICAgUHlPYmplY3QgKm94LCAqb3k7CisgICAgZG91YmxlIHIsIHgsIHk7CisgICAgaWYgKCEgUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImh5cG90IiwgMiwgMiwgJm94LCAmb3kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZShveCk7CisgICAgeSA9IFB5RmxvYXRfQXNEb3VibGUob3kpOworICAgIGlmICgoeCA9PSAtMS4wIHx8IHkgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogaHlwb3QoeCwgKy8tSW5mKSByZXR1cm5zIEluZiwgZXZlbiBpZiB4IGlzIGEgTmFOLiAqLworICAgIGlmIChQeV9JU19JTkZJTklUWSh4KSkKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmYWJzKHgpKTsKKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeSkpCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZmFicyh5KSk7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfaHlwb3QiLCByZXR1cm4gMCk7CisgICAgciA9IGh5cG90KHgsIHkpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHIpOworICAgIGlmIChQeV9JU19OQU4ocikpIHsKKyAgICAgICAgaWYgKCFQeV9JU19OQU4oeCkgJiYgIVB5X0lTX05BTih5KSkKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeV9JU19JTkZJTklUWShyKSkgeworICAgICAgICBpZiAoUHlfSVNfRklOSVRFKHgpICYmIFB5X0lTX0ZJTklURSh5KSkKKyAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgfQorICAgIGlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9oeXBvdF9kb2MsCkBAIC0xNDE1LDc5ICsxNDE1LDc5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9wb3coUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpveCwgKm95OwotCWRvdWJsZSByLCB4LCB5OwotCWludCBvZGRfeTsKKyAgICBQeU9iamVjdCAqb3gsICpveTsKKyAgICBkb3VibGUgciwgeCwgeTsKKyAgICBpbnQgb2RkX3k7CiAKLQlpZiAoISBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicG93IiwgMiwgMiwgJm94LCAmb3kpKQotCQlyZXR1cm4gTlVMTDsKLQl4ID0gUHlGbG9hdF9Bc0RvdWJsZShveCk7Ci0JeSA9IFB5RmxvYXRfQXNEb3VibGUob3kpOwotCWlmICgoeCA9PSAtMS4wIHx8IHkgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvdyIsIDIsIDIsICZveCwgJm95KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUob3gpOworICAgIHkgPSBQeUZsb2F0X0FzRG91YmxlKG95KTsKKyAgICBpZiAoKHggPT0gLTEuMCB8fCB5ID09IC0xLjApICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogZGVhbCBkaXJlY3RseSB3aXRoIElFRUUgc3BlY2lhbHMsIHRvIGNvcGUgd2l0aCBwcm9ibGVtcyBvbiB2YXJpb3VzCi0JICAgcGxhdGZvcm1zIHdob3NlIHNlbWFudGljcyBkb24ndCBleGFjdGx5IG1hdGNoIEM5OSAqLwotCXIgPSAwLjsgLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5nICovCi0JaWYgKCFQeV9JU19GSU5JVEUoeCkgfHwgIVB5X0lTX0ZJTklURSh5KSkgewotCQllcnJubyA9IDA7Ci0JCWlmIChQeV9JU19OQU4oeCkpCi0JCQlyID0geSA9PSAwLiA/IDEuIDogeDsgLyogTmFOKiowID0gMSAqLwotCQllbHNlIGlmIChQeV9JU19OQU4oeSkpCi0JCQlyID0geCA9PSAxLiA/IDEuIDogeTsgLyogMSoqTmFOID0gMSAqLwotCQllbHNlIGlmIChQeV9JU19JTkZJTklUWSh4KSkgewotCQkJb2RkX3kgPSBQeV9JU19GSU5JVEUoeSkgJiYgZm1vZChmYWJzKHkpLCAyLjApID09IDEuMDsKLQkJCWlmICh5ID4gMC4pCi0JCQkJciA9IG9kZF95ID8geCA6IGZhYnMoeCk7Ci0JCQllbHNlIGlmICh5ID09IDAuKQotCQkJCXIgPSAxLjsKLQkJCWVsc2UgLyogeSA8IDAuICovCi0JCQkJciA9IG9kZF95ID8gY29weXNpZ24oMC4sIHgpIDogMC47Ci0JCX0KLQkJZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkoeSkpIHsKLQkJCWlmIChmYWJzKHgpID09IDEuMCkKLQkJCQlyID0gMS47Ci0JCQllbHNlIGlmICh5ID4gMC4gJiYgZmFicyh4KSA+IDEuMCkKLQkJCQlyID0geTsKLQkJCWVsc2UgaWYgKHkgPCAwLiAmJiBmYWJzKHgpIDwgMS4wKSB7Ci0JCQkJciA9IC15OyAvKiByZXN1bHQgaXMgK2luZiAqLwotCQkJCWlmICh4ID09IDAuKSAvKiAwKiotaW5mOiBkaXZpZGUtYnktemVybyAqLwotCQkJCQllcnJubyA9IEVET007Ci0JCQl9Ci0JCQllbHNlCi0JCQkJciA9IDAuOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBsZXQgbGlibSBoYW5kbGUgZmluaXRlKipmaW5pdGUgKi8KLQkJZXJybm8gPSAwOwotCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX3BvdyIsIHJldHVybiAwKTsKLQkJciA9IHBvdyh4LCB5KTsKLQkJUHlGUEVfRU5EX1BST1RFQ1Qocik7Ci0JCS8qIGEgTmFOIHJlc3VsdCBzaG91bGQgYXJpc2Ugb25seSBmcm9tICgtdmUpKiooZmluaXRlCi0JCSAgIG5vbi1pbnRlZ2VyKTsgaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gcmFpc2UgVmFsdWVFcnJvci4gKi8KLQkJaWYgKCFQeV9JU19GSU5JVEUocikpIHsKLQkJCWlmIChQeV9JU19OQU4ocikpIHsKLQkJCQllcnJubyA9IEVET007Ci0JCQl9Ci0JCQkvKiAKLQkJCSAgIGFuIGluZmluaXRlIHJlc3VsdCBoZXJlIGFyaXNlcyBlaXRoZXIgZnJvbToKLQkJCSAgIChBKSAoKy8tMC4pKipuZWdhdGl2ZSAoLT4gZGl2aWRlLWJ5LXplcm8pCi0JCQkgICAoQikgb3ZlcmZsb3cgb2YgeCoqeSB3aXRoIHggYW5kIHkgZmluaXRlCi0JCQkqLwotCQkJZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkocikpIHsKLQkJCQlpZiAoeCA9PSAwLikKLQkJCQkJZXJybm8gPSBFRE9NOwotCQkJCWVsc2UKLQkJCQkJZXJybm8gPSBFUkFOR0U7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogZGVhbCBkaXJlY3RseSB3aXRoIElFRUUgc3BlY2lhbHMsIHRvIGNvcGUgd2l0aCBwcm9ibGVtcyBvbiB2YXJpb3VzCisgICAgICAgcGxhdGZvcm1zIHdob3NlIHNlbWFudGljcyBkb24ndCBleGFjdGx5IG1hdGNoIEM5OSAqLworICAgIHIgPSAwLjsgLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5nICovCisgICAgaWYgKCFQeV9JU19GSU5JVEUoeCkgfHwgIVB5X0lTX0ZJTklURSh5KSkgeworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGlmIChQeV9JU19OQU4oeCkpCisgICAgICAgICAgICByID0geSA9PSAwLiA/IDEuIDogeDsgLyogTmFOKiowID0gMSAqLworICAgICAgICBlbHNlIGlmIChQeV9JU19OQU4oeSkpCisgICAgICAgICAgICByID0geCA9PSAxLiA/IDEuIDogeTsgLyogMSoqTmFOID0gMSAqLworICAgICAgICBlbHNlIGlmIChQeV9JU19JTkZJTklUWSh4KSkgeworICAgICAgICAgICAgb2RkX3kgPSBQeV9JU19GSU5JVEUoeSkgJiYgZm1vZChmYWJzKHkpLCAyLjApID09IDEuMDsKKyAgICAgICAgICAgIGlmICh5ID4gMC4pCisgICAgICAgICAgICAgICAgciA9IG9kZF95ID8geCA6IGZhYnMoeCk7CisgICAgICAgICAgICBlbHNlIGlmICh5ID09IDAuKQorICAgICAgICAgICAgICAgIHIgPSAxLjsKKyAgICAgICAgICAgIGVsc2UgLyogeSA8IDAuICovCisgICAgICAgICAgICAgICAgciA9IG9kZF95ID8gY29weXNpZ24oMC4sIHgpIDogMC47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkoeSkpIHsKKyAgICAgICAgICAgIGlmIChmYWJzKHgpID09IDEuMCkKKyAgICAgICAgICAgICAgICByID0gMS47CisgICAgICAgICAgICBlbHNlIGlmICh5ID4gMC4gJiYgZmFicyh4KSA+IDEuMCkKKyAgICAgICAgICAgICAgICByID0geTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHkgPCAwLiAmJiBmYWJzKHgpIDwgMS4wKSB7CisgICAgICAgICAgICAgICAgciA9IC15OyAvKiByZXN1bHQgaXMgK2luZiAqLworICAgICAgICAgICAgICAgIGlmICh4ID09IDAuKSAvKiAwKiotaW5mOiBkaXZpZGUtYnktemVybyAqLworICAgICAgICAgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgciA9IDAuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBsZXQgbGlibSBoYW5kbGUgZmluaXRlKipmaW5pdGUgKi8KKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX3BvdyIsIHJldHVybiAwKTsKKyAgICAgICAgciA9IHBvdyh4LCB5KTsKKyAgICAgICAgUHlGUEVfRU5EX1BST1RFQ1Qocik7CisgICAgICAgIC8qIGEgTmFOIHJlc3VsdCBzaG91bGQgYXJpc2Ugb25seSBmcm9tICgtdmUpKiooZmluaXRlCisgICAgICAgICAgIG5vbi1pbnRlZ2VyKTsgaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gcmFpc2UgVmFsdWVFcnJvci4gKi8KKyAgICAgICAgaWYgKCFQeV9JU19GSU5JVEUocikpIHsKKyAgICAgICAgICAgIGlmIChQeV9JU19OQU4ocikpIHsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgYW4gaW5maW5pdGUgcmVzdWx0IGhlcmUgYXJpc2VzIGVpdGhlciBmcm9tOgorICAgICAgICAgICAgICAgKEEpICgrLy0wLikqKm5lZ2F0aXZlICgtPiBkaXZpZGUtYnktemVybykKKyAgICAgICAgICAgICAgIChCKSBvdmVyZmxvdyBvZiB4Kip5IHdpdGggeCBhbmQgeSBmaW5pdGUKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBlbHNlIGlmIChQeV9JU19JTkZJTklUWShyKSkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IDAuKQorICAgICAgICAgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOworICAgIGlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9wb3dfZG9jLApAQCAtMTQ5OSwxMCArMTQ5OSwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfZGVncmVlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCAqIHJhZFRvRGVnKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCAqIHJhZFRvRGVnKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfZGVncmVlc19kb2MsCkBAIC0xNTEyLDEwICsxNTEyLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9yYWRpYW5zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4ICogZGVnVG9SYWQpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4ICogZGVnVG9SYWQpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9yYWRpYW5zX2RvYywKQEAgLTE1MjUsMTAgKzE1MjUsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoX2lzbmFuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19OQU4oeCkpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19OQU4oeCkpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9pc25hbl9kb2MsCkBAIC0xNTM4LDEwICsxNTM4LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9pc2luZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfSU5GSU5JVFkoeCkpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19JTkZJTklUWSh4KSk7CiB9CiAKIFB5RG9jX1NUUlZBUihtYXRoX2lzaW5mX2RvYywKQEAgLTE1NDksNDcgKzE1NDksNDcgQEAKIENoZWNrIGlmIGZsb2F0IHggaXMgaW5maW5pdGUgKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1hdGhfbWV0aG9kc1tdID0gewotCXsiYWNvcyIsCW1hdGhfYWNvcywJTUVUSF9PLAkJbWF0aF9hY29zX2RvY30sCi0JeyJhY29zaCIsCW1hdGhfYWNvc2gsCU1FVEhfTywJCW1hdGhfYWNvc2hfZG9jfSwKLQl7ImFzaW4iLAltYXRoX2FzaW4sCU1FVEhfTywJCW1hdGhfYXNpbl9kb2N9LAotCXsiYXNpbmgiLAltYXRoX2FzaW5oLAlNRVRIX08sCQltYXRoX2FzaW5oX2RvY30sCi0JeyJhdGFuIiwJbWF0aF9hdGFuLAlNRVRIX08sCQltYXRoX2F0YW5fZG9jfSwKLQl7ImF0YW4yIiwJbWF0aF9hdGFuMiwJTUVUSF9WQVJBUkdTLAltYXRoX2F0YW4yX2RvY30sCi0JeyJhdGFuaCIsCW1hdGhfYXRhbmgsCU1FVEhfTywJCW1hdGhfYXRhbmhfZG9jfSwKLQl7ImNlaWwiLAltYXRoX2NlaWwsCU1FVEhfTywJCW1hdGhfY2VpbF9kb2N9LAotCXsiY29weXNpZ24iLAltYXRoX2NvcHlzaWduLAlNRVRIX1ZBUkFSR1MsCW1hdGhfY29weXNpZ25fZG9jfSwKLQl7ImNvcyIsCQltYXRoX2NvcywJTUVUSF9PLAkJbWF0aF9jb3NfZG9jfSwKLQl7ImNvc2giLAltYXRoX2Nvc2gsCU1FVEhfTywJCW1hdGhfY29zaF9kb2N9LAotCXsiZGVncmVlcyIsCW1hdGhfZGVncmVlcywJTUVUSF9PLAkJbWF0aF9kZWdyZWVzX2RvY30sCi0JeyJlcmYiLAkJbWF0aF9lcmYsCU1FVEhfTywJCW1hdGhfZXJmX2RvY30sCi0JeyJlcmZjIiwJbWF0aF9lcmZjLAlNRVRIX08sCQltYXRoX2VyZmNfZG9jfSwKLQl7ImV4cCIsCQltYXRoX2V4cCwJTUVUSF9PLAkJbWF0aF9leHBfZG9jfSwKLQl7ImV4cG0xIiwJbWF0aF9leHBtMSwJTUVUSF9PLAkJbWF0aF9leHBtMV9kb2N9LAotCXsiZmFicyIsCW1hdGhfZmFicywJTUVUSF9PLAkJbWF0aF9mYWJzX2RvY30sCi0JeyJmYWN0b3JpYWwiLAltYXRoX2ZhY3RvcmlhbCwJTUVUSF9PLAkJbWF0aF9mYWN0b3JpYWxfZG9jfSwKLQl7ImZsb29yIiwJbWF0aF9mbG9vciwJTUVUSF9PLAkJbWF0aF9mbG9vcl9kb2N9LAotCXsiZm1vZCIsCW1hdGhfZm1vZCwJTUVUSF9WQVJBUkdTLAltYXRoX2Ztb2RfZG9jfSwKLQl7ImZyZXhwIiwJbWF0aF9mcmV4cCwJTUVUSF9PLAkJbWF0aF9mcmV4cF9kb2N9LAotCXsiZnN1bSIsCW1hdGhfZnN1bSwJTUVUSF9PLAkJbWF0aF9mc3VtX2RvY30sCi0JeyJnYW1tYSIsCW1hdGhfZ2FtbWEsCU1FVEhfTywJCW1hdGhfZ2FtbWFfZG9jfSwKLQl7Imh5cG90IiwJbWF0aF9oeXBvdCwJTUVUSF9WQVJBUkdTLAltYXRoX2h5cG90X2RvY30sCi0JeyJpc2luZiIsCW1hdGhfaXNpbmYsCU1FVEhfTywJCW1hdGhfaXNpbmZfZG9jfSwKLQl7ImlzbmFuIiwJbWF0aF9pc25hbiwJTUVUSF9PLAkJbWF0aF9pc25hbl9kb2N9LAotCXsibGRleHAiLAltYXRoX2xkZXhwLAlNRVRIX1ZBUkFSR1MsCW1hdGhfbGRleHBfZG9jfSwKLQl7ImxnYW1tYSIsCW1hdGhfbGdhbW1hLAlNRVRIX08sCQltYXRoX2xnYW1tYV9kb2N9LAotCXsibG9nIiwJCW1hdGhfbG9nLAlNRVRIX1ZBUkFSR1MsCW1hdGhfbG9nX2RvY30sCi0JeyJsb2cxcCIsCW1hdGhfbG9nMXAsCU1FVEhfTywJCW1hdGhfbG9nMXBfZG9jfSwKLQl7ImxvZzEwIiwJbWF0aF9sb2cxMCwJTUVUSF9PLAkJbWF0aF9sb2cxMF9kb2N9LAotCXsibW9kZiIsCW1hdGhfbW9kZiwJTUVUSF9PLAkJbWF0aF9tb2RmX2RvY30sCi0JeyJwb3ciLAkJbWF0aF9wb3csCU1FVEhfVkFSQVJHUywJbWF0aF9wb3dfZG9jfSwKLQl7InJhZGlhbnMiLAltYXRoX3JhZGlhbnMsCU1FVEhfTywJCW1hdGhfcmFkaWFuc19kb2N9LAotCXsic2luIiwJCW1hdGhfc2luLAlNRVRIX08sCQltYXRoX3Npbl9kb2N9LAotCXsic2luaCIsCW1hdGhfc2luaCwJTUVUSF9PLAkJbWF0aF9zaW5oX2RvY30sCi0JeyJzcXJ0IiwJbWF0aF9zcXJ0LAlNRVRIX08sCQltYXRoX3NxcnRfZG9jfSwKLQl7InRhbiIsCQltYXRoX3RhbiwJTUVUSF9PLAkJbWF0aF90YW5fZG9jfSwKLQl7InRhbmgiLAltYXRoX3RhbmgsCU1FVEhfTywJCW1hdGhfdGFuaF9kb2N9LAotCXsidHJ1bmMiLAltYXRoX3RydW5jLAlNRVRIX08sCQltYXRoX3RydW5jX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImFjb3MiLCAgICAgICAgICAgIG1hdGhfYWNvcywgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9hY29zX2RvY30sCisgICAgeyJhY29zaCIsICAgICAgICAgICBtYXRoX2Fjb3NoLCAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfYWNvc2hfZG9jfSwKKyAgICB7ImFzaW4iLCAgICAgICAgICAgIG1hdGhfYXNpbiwgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9hc2luX2RvY30sCisgICAgeyJhc2luaCIsICAgICAgICAgICBtYXRoX2FzaW5oLCAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfYXNpbmhfZG9jfSwKKyAgICB7ImF0YW4iLCAgICAgICAgICAgIG1hdGhfYXRhbiwgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9hdGFuX2RvY30sCisgICAgeyJhdGFuMiIsICAgICAgICAgICBtYXRoX2F0YW4yLCAgICAgTUVUSF9WQVJBUkdTLCAgIG1hdGhfYXRhbjJfZG9jfSwKKyAgICB7ImF0YW5oIiwgICAgICAgICAgIG1hdGhfYXRhbmgsICAgICBNRVRIX08sICAgICAgICAgbWF0aF9hdGFuaF9kb2N9LAorICAgIHsiY2VpbCIsICAgICAgICAgICAgbWF0aF9jZWlsLCAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2NlaWxfZG9jfSwKKyAgICB7ImNvcHlzaWduIiwgICAgICAgIG1hdGhfY29weXNpZ24sICBNRVRIX1ZBUkFSR1MsICAgbWF0aF9jb3B5c2lnbl9kb2N9LAorICAgIHsiY29zIiwgICAgICAgICAgICAgbWF0aF9jb3MsICAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2Nvc19kb2N9LAorICAgIHsiY29zaCIsICAgICAgICAgICAgbWF0aF9jb3NoLCAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2Nvc2hfZG9jfSwKKyAgICB7ImRlZ3JlZXMiLCAgICAgICAgIG1hdGhfZGVncmVlcywgICBNRVRIX08sICAgICAgICAgbWF0aF9kZWdyZWVzX2RvY30sCisgICAgeyJlcmYiLCAgICAgICAgICAgICBtYXRoX2VyZiwgICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfZXJmX2RvY30sCisgICAgeyJlcmZjIiwgICAgICAgICAgICBtYXRoX2VyZmMsICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfZXJmY19kb2N9LAorICAgIHsiZXhwIiwgICAgICAgICAgICAgbWF0aF9leHAsICAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2V4cF9kb2N9LAorICAgIHsiZXhwbTEiLCAgICAgICAgICAgbWF0aF9leHBtMSwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2V4cG0xX2RvY30sCisgICAgeyJmYWJzIiwgICAgICAgICAgICBtYXRoX2ZhYnMsICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfZmFic19kb2N9LAorICAgIHsiZmFjdG9yaWFsIiwgICAgICAgbWF0aF9mYWN0b3JpYWwsIE1FVEhfTywgICAgICAgICBtYXRoX2ZhY3RvcmlhbF9kb2N9LAorICAgIHsiZmxvb3IiLCAgICAgICAgICAgbWF0aF9mbG9vciwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2Zsb29yX2RvY30sCisgICAgeyJmbW9kIiwgICAgICAgICAgICBtYXRoX2Ztb2QsICAgICAgTUVUSF9WQVJBUkdTLCAgIG1hdGhfZm1vZF9kb2N9LAorICAgIHsiZnJleHAiLCAgICAgICAgICAgbWF0aF9mcmV4cCwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2ZyZXhwX2RvY30sCisgICAgeyJmc3VtIiwgICAgICAgICAgICBtYXRoX2ZzdW0sICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfZnN1bV9kb2N9LAorICAgIHsiZ2FtbWEiLCAgICAgICAgICAgbWF0aF9nYW1tYSwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2dhbW1hX2RvY30sCisgICAgeyJoeXBvdCIsICAgICAgICAgICBtYXRoX2h5cG90LCAgICAgTUVUSF9WQVJBUkdTLCAgIG1hdGhfaHlwb3RfZG9jfSwKKyAgICB7ImlzaW5mIiwgICAgICAgICAgIG1hdGhfaXNpbmYsICAgICBNRVRIX08sICAgICAgICAgbWF0aF9pc2luZl9kb2N9LAorICAgIHsiaXNuYW4iLCAgICAgICAgICAgbWF0aF9pc25hbiwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2lzbmFuX2RvY30sCisgICAgeyJsZGV4cCIsICAgICAgICAgICBtYXRoX2xkZXhwLCAgICAgTUVUSF9WQVJBUkdTLCAgIG1hdGhfbGRleHBfZG9jfSwKKyAgICB7ImxnYW1tYSIsICAgICAgICAgIG1hdGhfbGdhbW1hLCAgICBNRVRIX08sICAgICAgICAgbWF0aF9sZ2FtbWFfZG9jfSwKKyAgICB7ImxvZyIsICAgICAgICAgICAgIG1hdGhfbG9nLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgbWF0aF9sb2dfZG9jfSwKKyAgICB7ImxvZzFwIiwgICAgICAgICAgIG1hdGhfbG9nMXAsICAgICBNRVRIX08sICAgICAgICAgbWF0aF9sb2cxcF9kb2N9LAorICAgIHsibG9nMTAiLCAgICAgICAgICAgbWF0aF9sb2cxMCwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2xvZzEwX2RvY30sCisgICAgeyJtb2RmIiwgICAgICAgICAgICBtYXRoX21vZGYsICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfbW9kZl9kb2N9LAorICAgIHsicG93IiwgICAgICAgICAgICAgbWF0aF9wb3csICAgICAgIE1FVEhfVkFSQVJHUywgICBtYXRoX3Bvd19kb2N9LAorICAgIHsicmFkaWFucyIsICAgICAgICAgbWF0aF9yYWRpYW5zLCAgIE1FVEhfTywgICAgICAgICBtYXRoX3JhZGlhbnNfZG9jfSwKKyAgICB7InNpbiIsICAgICAgICAgICAgIG1hdGhfc2luLCAgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9zaW5fZG9jfSwKKyAgICB7InNpbmgiLCAgICAgICAgICAgIG1hdGhfc2luaCwgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9zaW5oX2RvY30sCisgICAgeyJzcXJ0IiwgICAgICAgICAgICBtYXRoX3NxcnQsICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfc3FydF9kb2N9LAorICAgIHsidGFuIiwgICAgICAgICAgICAgbWF0aF90YW4sICAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX3Rhbl9kb2N9LAorICAgIHsidGFuaCIsICAgICAgICAgICAgbWF0aF90YW5oLCAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX3RhbmhfZG9jfSwKKyAgICB7InRydW5jIiwgICAgICAgICAgIG1hdGhfdHJ1bmMsICAgICBNRVRIX08sICAgICAgICAgbWF0aF90cnVuY19kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTE2MDAsMTUgKzE2MDAsMTUgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0bWF0aCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJtYXRoIiwgbWF0aF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJtYXRoIiwgbWF0aF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgInBpIiwgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfUEkpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImUiLCBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTUFUSF9FKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJwaSIsIFB5RmxvYXRfRnJvbURvdWJsZShQeV9NQVRIX1BJKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlIiwgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfRSkpOwogCiAgICAgZmluYWxseToKLQlyZXR1cm47CisgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tZDUuYyBiL01vZHVsZXMvbWQ1LmMKaW5kZXggNjQyZjBiZC4uOGZkYzYwMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tZDUuYworKysgYi9Nb2R1bGVzL21kNS5jCkBAIC0yNyw3ICsyNyw3IEBACiAKICAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKICAgdGV4dCBpcyBhdmFpbGFibGUgYXQKLQlodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAorICAgICAgICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAogICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCiAgIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQogICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCkBAIC0zOCwxNCArMzgsMTQgQEAKICAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgogCiAgIDIwMDItMDQtMTMgbHBkIENsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7IG5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIKLQllaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseTsgYWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0JaW4gbGlicmFyeS4KKyAgICAgICAgZWl0aGVyIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHk7IGFkZGVkIG1pc3NpbmcgI2luY2x1ZGUgPHN0cmluZy5oPgorICAgICAgICBpbiBsaWJyYXJ5LgogICAyMDAyLTAzLTExIGxwZCBDb3JyZWN0ZWQgYXJndW1lbnQgbGlzdCBmb3IgbWFpbigpLCBhbmQgYWRkZWQgaW50IHJldHVybgotCXR5cGUsIGluIHRlc3QgcHJvZ3JhbSBhbmQgVCB2YWx1ZSBwcm9ncmFtLgorICAgICAgICB0eXBlLCBpbiB0ZXN0IHByb2dyYW0gYW5kIFQgdmFsdWUgcHJvZ3JhbS4KICAgMjAwMi0wMi0yMSBscGQgQWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RkaW8uaD4gaW4gdGVzdCBwcm9ncmFtLgogICAyMDAwLTA3LTAzIGxwZCBQYXRjaGVkIHRvIGVsaW1pbmF0ZSB3YXJuaW5ncyBhYm91dCAiY29uc3RhbnQgaXMKLQl1bnNpZ25lZCBpbiBBTlNJIEMsIHNpZ25lZCBpbiB0cmFkaXRpb25hbCI7IG1hZGUgdGVzdCBwcm9ncmFtCi0Jc2VsZi1jaGVja2luZy4KKyAgICAgICAgdW5zaWduZWQgaW4gQU5TSSBDLCBzaWduZWQgaW4gdHJhZGl0aW9uYWwiOyBtYWRlIHRlc3QgcHJvZ3JhbQorICAgICAgICBzZWxmLWNoZWNraW5nLgogICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KICAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KS4KICAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KQEAgLTU1LDcgKzU1LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KIAotI3VuZGVmIEJZVEVfT1JERVIJLyogMSA9IGJpZy1lbmRpYW4sIC0xID0gbGl0dGxlLWVuZGlhbiwgMCA9IHVua25vd24gKi8KKyN1bmRlZiBCWVRFX09SREVSICAgICAgIC8qIDEgPSBiaWctZW5kaWFuLCAtMSA9IGxpdHRsZS1lbmRpYW4sIDAgPSB1bmtub3duICovCiAjaWZkZWYgQVJDSF9JU19CSUdfRU5ESUFOCiAjICBkZWZpbmUgQllURV9PUkRFUiAoQVJDSF9JU19CSUdfRU5ESUFOID8gMSA6IC0xKQogI2Vsc2UKQEAgLTEzMyw4ICsxMzMsOCBAQAogbWQ1X3Byb2Nlc3MobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSAvKls2NF0qLykKIHsKICAgICBtZDVfd29yZF90Ci0JYSA9IHBtcy0+YWJjZFswXSwgYiA9IHBtcy0+YWJjZFsxXSwKLQljID0gcG1zLT5hYmNkWzJdLCBkID0gcG1zLT5hYmNkWzNdOworICAgICAgICBhID0gcG1zLT5hYmNkWzBdLCBiID0gcG1zLT5hYmNkWzFdLAorICAgICAgICBjID0gcG1zLT5hYmNkWzJdLCBkID0gcG1zLT5hYmNkWzNdOwogICAgIG1kNV93b3JkX3QgdDsKICNpZiBCWVRFX09SREVSID4gMAogICAgIC8qIERlZmluZSBzdG9yYWdlIG9ubHkgZm9yIGJpZy1lbmRpYW4gQ1BVcy4gKi8KQEAgLTE0Nyw1MSArMTQ3LDUxIEBACiAKICAgICB7CiAjaWYgQllURV9PUkRFUiA9PSAwCi0JLyoKLQkgKiBEZXRlcm1pbmUgZHluYW1pY2FsbHkgd2hldGhlciB0aGlzIGlzIGEgYmlnLWVuZGlhbiBvcgotCSAqIGxpdHRsZS1lbmRpYW4gbWFjaGluZSwgc2luY2Ugd2UgY2FuIHVzZSBhIG1vcmUgZWZmaWNpZW50Ci0JICogYWxnb3JpdGhtIG9uIHRoZSBsYXR0ZXIuCi0JICovCi0Jc3RhdGljIGNvbnN0IGludCB3ID0gMTsKKyAgICAgICAgLyoKKyAgICAgICAgICogRGV0ZXJtaW5lIGR5bmFtaWNhbGx5IHdoZXRoZXIgdGhpcyBpcyBhIGJpZy1lbmRpYW4gb3IKKyAgICAgICAgICogbGl0dGxlLWVuZGlhbiBtYWNoaW5lLCBzaW5jZSB3ZSBjYW4gdXNlIGEgbW9yZSBlZmZpY2llbnQKKyAgICAgICAgICogYWxnb3JpdGhtIG9uIHRoZSBsYXR0ZXIuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgY29uc3QgaW50IHcgPSAxOwogCi0JaWYgKCooKGNvbnN0IG1kNV9ieXRlX3QgKikmdykpIC8qIGR5bmFtaWMgbGl0dGxlLWVuZGlhbiAqLworICAgICAgICBpZiAoKigoY29uc3QgbWQ1X2J5dGVfdCAqKSZ3KSkgLyogZHluYW1pYyBsaXR0bGUtZW5kaWFuICovCiAjZW5kaWYKLSNpZiBCWVRFX09SREVSIDw9IDAJCS8qIGxpdHRsZS1lbmRpYW4gKi8KLQl7Ci0JICAgIC8qCi0JICAgICAqIE9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHdlIGNhbiBwcm9jZXNzIHByb3Blcmx5IGFsaWduZWQKLQkgICAgICogZGF0YSB3aXRob3V0IGNvcHlpbmcgaXQuCi0JICAgICAqLwotCSAgICBpZiAoISgoZGF0YSAtIChjb25zdCBtZDVfYnl0ZV90ICopMCkgJiAzKSkgewotCQkvKiBkYXRhIGFyZSBwcm9wZXJseSBhbGlnbmVkICovCi0JCVggPSAoY29uc3QgbWQ1X3dvcmRfdCAqKWRhdGE7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIG5vdCBhbGlnbmVkICovCi0JCW1lbWNweSh4YnVmLCBkYXRhLCA2NCk7Ci0JCVggPSB4YnVmOwotCSAgICB9Ci0JfQorI2lmIEJZVEVfT1JERVIgPD0gMCAgICAgICAgICAgICAvKiBsaXR0bGUtZW5kaWFuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBPbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLCB3ZSBjYW4gcHJvY2VzcyBwcm9wZXJseSBhbGlnbmVkCisgICAgICAgICAgICAgKiBkYXRhIHdpdGhvdXQgY29weWluZyBpdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCEoKGRhdGEgLSAoY29uc3QgbWQ1X2J5dGVfdCAqKTApICYgMykpIHsKKyAgICAgICAgICAgICAgICAvKiBkYXRhIGFyZSBwcm9wZXJseSBhbGlnbmVkICovCisgICAgICAgICAgICAgICAgWCA9IChjb25zdCBtZDVfd29yZF90ICopZGF0YTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbm90IGFsaWduZWQgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoeGJ1ZiwgZGF0YSwgNjQpOworICAgICAgICAgICAgICAgIFggPSB4YnVmOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYKICNpZiBCWVRFX09SREVSID09IDAKLQllbHNlCQkJLyogZHluYW1pYyBiaWctZW5kaWFuICovCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmlnLWVuZGlhbiAqLwogI2VuZGlmCi0jaWYgQllURV9PUkRFUiA+PSAwCQkvKiBiaWctZW5kaWFuICovCi0JewotCSAgICAvKgotCSAgICAgKiBPbiBiaWctZW5kaWFuIG1hY2hpbmVzLCB3ZSBtdXN0IGFycmFuZ2UgdGhlIGJ5dGVzIGluIHRoZQotCSAgICAgKiByaWdodCBvcmRlci4KLQkgICAgICovCi0JICAgIGNvbnN0IG1kNV9ieXRlX3QgKnhwID0gZGF0YTsKLQkgICAgaW50IGk7CisjaWYgQllURV9PUkRFUiA+PSAwICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIHdlIG11c3QgYXJyYW5nZSB0aGUgYnl0ZXMgaW4gdGhlCisgICAgICAgICAgICAgKiByaWdodCBvcmRlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY29uc3QgbWQ1X2J5dGVfdCAqeHAgPSBkYXRhOworICAgICAgICAgICAgaW50IGk7CiAKICMgIGlmIEJZVEVfT1JERVIgPT0gMAotCSAgICBYID0geGJ1ZjsJCS8qIChkeW5hbWljIG9ubHkpICovCisgICAgICAgICAgICBYID0geGJ1ZjsgICAgICAgICAgIC8qIChkeW5hbWljIG9ubHkpICovCiAjICBlbHNlCi0jICAgIGRlZmluZSB4YnVmIFgJCS8qIChzdGF0aWMgb25seSkgKi8KKyMgICAgZGVmaW5lIHhidWYgWCAgICAgICAgICAgICAgLyogKHN0YXRpYyBvbmx5KSAqLwogIyAgZW5kaWYKLQkgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2ksIHhwICs9IDQpCi0JCXhidWZbaV0gPSB4cFswXSArICh4cFsxXSA8PCA4KSArICh4cFsyXSA8PCAxNikgKyAoeHBbM10gPDwgMjQpOwotCX0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpLCB4cCArPSA0KQorICAgICAgICAgICAgICAgIHhidWZbaV0gPSB4cFswXSArICh4cFsxXSA8PCA4KSArICh4cFsyXSA8PCAxNikgKyAoeHBbM10gPDwgMjQpOworICAgICAgICB9CiAjZW5kaWYKICAgICB9CiAKQEAgLTMyOSw3ICszMjksNyBAQAogICAgIG1kNV93b3JkX3QgbmJpdHMgPSAobWQ1X3dvcmRfdCkobmJ5dGVzIDw8IDMpOwogCiAgICAgaWYgKG5ieXRlcyA8PSAwKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgLyogdGhpcyBzcGVjaWFsIGNhc2UgaXMgaGFuZGxlZCByZWN1cnNpdmVseSAqLwogICAgIGlmIChuYnl0ZXMgPiBJTlRfTUFYIC0gb2Zmc2V0KSB7CkBAIC0zMzksNyArMzM5LDcgQEAKICAgICAgICAgb3ZlcmxhcCA9IDY0IC0gb2Zmc2V0OwogCiAgICAgICAgIG1kNV9hcHBlbmQocG1zLCBkYXRhLCBvdmVybGFwKTsKLSAgICAgICAgbWQ1X2FwcGVuZChwbXMsIGRhdGEgKyBvdmVybGFwLCBuYnl0ZXMgLSBvdmVybGFwKTsgCisgICAgICAgIG1kNV9hcHBlbmQocG1zLCBkYXRhICsgb3ZlcmxhcCwgbmJ5dGVzIC0gb3ZlcmxhcCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTM0Nyw0OCArMzQ3LDQ4IEBACiAgICAgcG1zLT5jb3VudFsxXSArPSBuYnl0ZXMgPj4gMjk7CiAgICAgcG1zLT5jb3VudFswXSArPSBuYml0czsKICAgICBpZiAocG1zLT5jb3VudFswXSA8IG5iaXRzKQotCXBtcy0+Y291bnRbMV0rKzsKKyAgICAgICAgcG1zLT5jb3VudFsxXSsrOwogCiAgICAgLyogUHJvY2VzcyBhbiBpbml0aWFsIHBhcnRpYWwgYmxvY2suICovCiAgICAgaWYgKG9mZnNldCkgewotCXVuc2lnbmVkIGludCBjb3B5ID0gKG9mZnNldCArIG5ieXRlcyA+IDY0ID8gNjQgLSBvZmZzZXQgOiBuYnl0ZXMpOworICAgICAgICB1bnNpZ25lZCBpbnQgY29weSA9IChvZmZzZXQgKyBuYnl0ZXMgPiA2NCA/IDY0IC0gb2Zmc2V0IDogbmJ5dGVzKTsKIAotCW1lbWNweShwbXMtPmJ1ZiArIG9mZnNldCwgcCwgY29weSk7Ci0JaWYgKG9mZnNldCArIGNvcHkgPCA2NCkKLQkgICAgcmV0dXJuOwotCXAgKz0gY29weTsKLQlsZWZ0IC09IGNvcHk7Ci0JbWQ1X3Byb2Nlc3MocG1zLCBwbXMtPmJ1Zik7CisgICAgICAgIG1lbWNweShwbXMtPmJ1ZiArIG9mZnNldCwgcCwgY29weSk7CisgICAgICAgIGlmIChvZmZzZXQgKyBjb3B5IDwgNjQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHAgKz0gY29weTsKKyAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICBtZDVfcHJvY2VzcyhwbXMsIHBtcy0+YnVmKTsKICAgICB9CiAKICAgICAvKiBQcm9jZXNzIGZ1bGwgYmxvY2tzLiAqLwogICAgIGZvciAoOyBsZWZ0ID49IDY0OyBwICs9IDY0LCBsZWZ0IC09IDY0KQotCW1kNV9wcm9jZXNzKHBtcywgcCk7CisgICAgICAgIG1kNV9wcm9jZXNzKHBtcywgcCk7CiAKICAgICAvKiBQcm9jZXNzIGEgZmluYWwgcGFydGlhbCBibG9jay4gKi8KICAgICBpZiAobGVmdCkKLQltZW1jcHkocG1zLT5idWYsIHAsIGxlZnQpOworICAgICAgICBtZW1jcHkocG1zLT5idWYsIHAsIGxlZnQpOwogfQogCiB2b2lkCiBtZDVfZmluaXNoKG1kNV9zdGF0ZV90ICpwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSkKIHsKICAgICBzdGF0aWMgY29uc3QgbWQ1X2J5dGVfdCBwYWRbNjRdID0gewotCTB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKyAgICAgICAgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAogICAgIH07CiAgICAgbWQ1X2J5dGVfdCBkYXRhWzhdOwogICAgIGludCBpOwogCiAgICAgLyogU2F2ZSB0aGUgbGVuZ3RoIGJlZm9yZSBwYWRkaW5nLiAqLwogICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCi0JZGF0YVtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmNvdW50W2kgPj4gMl0gPj4gKChpICYgMykgPDwgMykpOworICAgICAgICBkYXRhW2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+Y291bnRbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7CiAgICAgLyogUGFkIHRvIDU2IGJ5dGVzIG1vZCA2NC4gKi8KICAgICBtZDVfYXBwZW5kKHBtcywgcGFkLCAoKDU1IC0gKHBtcy0+Y291bnRbMF0gPj4gMykpICYgNjMpICsgMSk7CiAgICAgLyogQXBwZW5kIHRoZSBsZW5ndGguICovCiAgICAgbWQ1X2FwcGVuZChwbXMsIGRhdGEsIDgpOwogICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQotCWRpZ2VzdFtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmFiY2RbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7CisgICAgICAgIGRpZ2VzdFtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmFiY2RbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL21kNW1vZHVsZS5jIGIvTW9kdWxlcy9tZDVtb2R1bGUuYwppbmRleCA5ZDdlM2ZkLi4wNjgzZWY1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL21kNW1vZHVsZS5jCisrKyBiL01vZHVsZXMvbWQ1bW9kdWxlLmMKQEAgLTE0LDI1ICsxNCwyNSBAQAogI2luY2x1ZGUgIm1kNS5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotICAgICAgICBtZDVfc3RhdGVfdAltZDU7CQkvKiB0aGUgY29udGV4dCBob2xkZXIgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgbWQ1X3N0YXRlX3QgICAgICAgICBtZDU7ICAgICAgICAgICAgLyogdGhlIGNvbnRleHQgaG9sZGVyICovCiB9IG1kNW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBNRDV0eXBlOwogCi0jZGVmaW5lIGlzX21kNW9iamVjdCh2KQkJKCh2KS0+b2JfdHlwZSA9PSAmTUQ1dHlwZSkKKyNkZWZpbmUgaXNfbWQ1b2JqZWN0KHYpICAgICAgICAgKCh2KS0+b2JfdHlwZSA9PSAmTUQ1dHlwZSkKIAogc3RhdGljIG1kNW9iamVjdCAqCiBuZXdtZDVvYmplY3Qodm9pZCkKIHsKLQltZDVvYmplY3QgKm1kNXA7CisgICAgbWQ1b2JqZWN0ICptZDVwOwogCi0JbWQ1cCA9IFB5T2JqZWN0X05ldyhtZDVvYmplY3QsICZNRDV0eXBlKTsKLQlpZiAobWQ1cCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBtZDVwID0gUHlPYmplY3RfTmV3KG1kNW9iamVjdCwgJk1ENXR5cGUpOworICAgIGlmIChtZDVwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbWQ1X2luaXQoJm1kNXAtPm1kNSk7CS8qIGFjdHVhbCBpbml0aWFsaXNhdGlvbiAqLwotCXJldHVybiBtZDVwOworICAgIG1kNV9pbml0KCZtZDVwLT5tZDUpOyAgICAgICAvKiBhY3R1YWwgaW5pdGlhbGlzYXRpb24gKi8KKyAgICByZXR1cm4gbWQ1cDsKIH0KIAogCkBAIC00MSw3ICs0MSw3IEBACiBzdGF0aWMgdm9pZAogbWQ1X2RlYWxsb2MobWQ1b2JqZWN0ICptZDVwKQogewotCVB5T2JqZWN0X0RlbChtZDVwKTsKKyAgICBQeU9iamVjdF9EZWwobWQ1cCk7CiB9CiAKIApAQCAtNTAsMTYgKzUwLDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWQ1X3VwZGF0ZShtZDVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciB2aWV3OworICAgIFB5X2J1ZmZlciB2aWV3OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjp1cGRhdGUiLCAmdmlldykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyo6dXBkYXRlIiwgJnZpZXcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1kNV9hcHBlbmQoJnNlbGYtPm1kNSwgKHVuc2lnbmVkIGNoYXIqKXZpZXcuYnVmLAotCQkgICBQeV9TQUZFX0RPV05DQVNUKHZpZXcubGVuLCBQeV9zc2l6ZV90LCB1bnNpZ25lZCBpbnQpKTsKKyAgICBtZDVfYXBwZW5kKCZzZWxmLT5tZDUsICh1bnNpZ25lZCBjaGFyKil2aWV3LmJ1ZiwKKyAgICAgICAgICAgICAgIFB5X1NBRkVfRE9XTkNBU1Qodmlldy5sZW4sIFB5X3NzaXplX3QsIHVuc2lnbmVkIGludCkpOwogCi0JUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUih1cGRhdGVfZG9jLApAQCAtNzMsMTQgKzczLDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWQ1X2RpZ2VzdChtZDVvYmplY3QgKnNlbGYpCiB7Ci0gCW1kNV9zdGF0ZV90IG1kQ29udGV4dDsKLQl1bnNpZ25lZCBjaGFyIGFEaWdlc3RbMTZdOworICAgIG1kNV9zdGF0ZV90IG1kQ29udGV4dDsKKyAgICB1bnNpZ25lZCBjaGFyIGFEaWdlc3RbMTZdOwogCi0JLyogbWFrZSBhIHRlbXBvcmFyeSBjb3B5LCBhbmQgcGVyZm9ybSB0aGUgZmluYWwgKi8KLQltZENvbnRleHQgPSBzZWxmLT5tZDU7Ci0JbWQ1X2ZpbmlzaCgmbWRDb250ZXh0LCBhRGlnZXN0KTsKKyAgICAvKiBtYWtlIGEgdGVtcG9yYXJ5IGNvcHksIGFuZCBwZXJmb3JtIHRoZSBmaW5hbCAqLworICAgIG1kQ29udGV4dCA9IHNlbGYtPm1kNTsKKyAgICBtZDVfZmluaXNoKCZtZENvbnRleHQsIGFEaWdlc3QpOwogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopYURpZ2VzdCwgMTYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKWFEaWdlc3QsIDE2KTsKIH0KIAogUHlEb2NfU1RSVkFSKGRpZ2VzdF9kb2MsCkBAIC05NCwyNiArOTQsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZDVfaGV4ZGlnZXN0KG1kNW9iamVjdCAqc2VsZikKIHsKLSAJbWQ1X3N0YXRlX3QgbWRDb250ZXh0OwotCXVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XTsKLQl1bnNpZ25lZCBjaGFyIGhleGRpZ2VzdFszMl07Ci0JaW50IGksIGo7CisgICAgbWQ1X3N0YXRlX3QgbWRDb250ZXh0OworICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XTsKKyAgICB1bnNpZ25lZCBjaGFyIGhleGRpZ2VzdFszMl07CisgICAgaW50IGksIGo7CiAKLQkvKiBtYWtlIGEgdGVtcG9yYXJ5IGNvcHksIGFuZCBwZXJmb3JtIHRoZSBmaW5hbCAqLwotCW1kQ29udGV4dCA9IHNlbGYtPm1kNTsKLQltZDVfZmluaXNoKCZtZENvbnRleHQsIGRpZ2VzdCk7CisgICAgLyogbWFrZSBhIHRlbXBvcmFyeSBjb3B5LCBhbmQgcGVyZm9ybSB0aGUgZmluYWwgKi8KKyAgICBtZENvbnRleHQgPSBzZWxmLT5tZDU7CisgICAgbWQ1X2ZpbmlzaCgmbWRDb250ZXh0LCBkaWdlc3QpOwogCi0JLyogTWFrZSBoZXggdmVyc2lvbiBvZiB0aGUgZGlnZXN0ICovCi0JZm9yKGk9aj0wOyBpPDE2OyBpKyspIHsKLQkJY2hhciBjOwotCQljID0gKGRpZ2VzdFtpXSA+PiA0KSAmIDB4ZjsKLQkJYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwotCQloZXhkaWdlc3RbaisrXSA9IGM7Ci0JCWMgPSAoZGlnZXN0W2ldICYgMHhmKTsKLQkJYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwotCQloZXhkaWdlc3RbaisrXSA9IGM7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopaGV4ZGlnZXN0LCAzMik7CisgICAgLyogTWFrZSBoZXggdmVyc2lvbiBvZiB0aGUgZGlnZXN0ICovCisgICAgZm9yKGk9aj0wOyBpPDE2OyBpKyspIHsKKyAgICAgICAgY2hhciBjOworICAgICAgICBjID0gKGRpZ2VzdFtpXSA+PiA0KSAmIDB4ZjsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICBoZXhkaWdlc3RbaisrXSA9IGM7CisgICAgICAgIGMgPSAoZGlnZXN0W2ldICYgMHhmKTsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICBoZXhkaWdlc3RbaisrXSA9IGM7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopaGV4ZGlnZXN0LCAzMik7CiB9CiAKIApAQCAtMTI2LDE0ICsxMjYsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZDVfY29weShtZDVvYmplY3QgKnNlbGYpCiB7Ci0JbWQ1b2JqZWN0ICptZDVwOworICAgIG1kNW9iamVjdCAqbWQ1cDsKIAotCWlmICgobWQ1cCA9IG5ld21kNW9iamVjdCgpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKG1kNXAgPSBuZXdtZDVvYmplY3QoKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQltZDVwLT5tZDUgPSBzZWxmLT5tZDU7CisgICAgbWQ1cC0+bWQ1ID0gc2VsZi0+bWQ1OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKW1kNXA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW1kNXA7CiB9CiAKIFB5RG9jX1NUUlZBUihjb3B5X2RvYywKQEAgLTE0MywxMSArMTQzLDExIEBACiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1kNV9tZXRob2RzW10gPSB7Ci0JeyJ1cGRhdGUiLCAgICAoUHlDRnVuY3Rpb24pbWQ1X3VwZGF0ZSwgICAgTUVUSF9WQVJBUkdTLCB1cGRhdGVfZG9jfSwKLQl7ImRpZ2VzdCIsICAgIChQeUNGdW5jdGlvbiltZDVfZGlnZXN0LCAgICBNRVRIX05PQVJHUywgIGRpZ2VzdF9kb2N9LAotCXsiaGV4ZGlnZXN0IiwgKFB5Q0Z1bmN0aW9uKW1kNV9oZXhkaWdlc3QsIE1FVEhfTk9BUkdTLCAgaGV4ZGlnZXN0X2RvY30sCi0JeyJjb3B5IiwgICAgICAoUHlDRnVuY3Rpb24pbWQ1X2NvcHksICAgICAgTUVUSF9OT0FSR1MsICBjb3B5X2RvY30sCi0Je05VTEwsIE5VTEx9CQkJICAgICAvKiBzZW50aW5lbCAqLworICAgIHsidXBkYXRlIiwgICAgKFB5Q0Z1bmN0aW9uKW1kNV91cGRhdGUsICAgIE1FVEhfVkFSQVJHUywgdXBkYXRlX2RvY30sCisgICAgeyJkaWdlc3QiLCAgICAoUHlDRnVuY3Rpb24pbWQ1X2RpZ2VzdCwgICAgTUVUSF9OT0FSR1MsICBkaWdlc3RfZG9jfSwKKyAgICB7ImhleGRpZ2VzdCIsIChQeUNGdW5jdGlvbiltZDVfaGV4ZGlnZXN0LCBNRVRIX05PQVJHUywgIGhleGRpZ2VzdF9kb2N9LAorICAgIHsiY29weSIsICAgICAgKFB5Q0Z1bmN0aW9uKW1kNV9jb3B5LCAgICAgIE1FVEhfTk9BUkdTLCAgY29weV9kb2N9LAorICAgIHtOVUxMLCBOVUxMfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0yMjEsMzcgKzIyMSwzNyBAQAogY29weSgpIC0tIHJldHVybiBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgbWQ1IG9iamVjdCIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE1ENXR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9tZDUubWQ1IiwJCSAgLyp0cF9uYW1lKi8KLQlzaXplb2YobWQ1b2JqZWN0KSwJICAvKnRwX3NpemUqLwotCTAsCQkJICAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbWQ1X2RlYWxsb2MsICAvKnRwX2RlYWxsb2MqLwotCTAsCQkJICAvKnRwX3ByaW50Ki8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkgIC8qdHBfc2V0YXR0ciovCi0JMCwJCQkgIC8qdHBfY29tcGFyZSovCi0JMCwJCQkgIC8qdHBfcmVwciovCi0gICAgICAgIDAsCQkJICAvKnRwX2FzX251bWJlciovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCSAgLyp0cF9hc19tYXBwaW5nKi8KLQkwLCAJCQkgIC8qdHBfaGFzaCovCi0JMCwJCQkgIC8qdHBfY2FsbCovCi0JMCwJCQkgIC8qdHBfc3RyKi8KLQkwLAkJCSAgLyp0cF9nZXRhdHRybyovCi0JMCwJCQkgIC8qdHBfc2V0YXR0cm8qLwotCTAsCSAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCSAgLyp0cF9mbGFncyovCi0JbWQ1dHlwZV9kb2MsCQkgIC8qdHBfZG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAgICAgMCwJCQkgIC8qdHBfY2xlYXIqLwotICAgICAgICAwLAkJCSAgLyp0cF9yaWNoY29tcGFyZSovCi0gICAgICAgIDAsCQkJICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAgICAgMCwJCQkgIC8qdHBfaXRlciovCi0gICAgICAgIDAsCQkJICAvKnRwX2l0ZXJuZXh0Ki8KLSAgICAgICAgbWQ1X21ldGhvZHMsCSAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICAwLCAgICAgIAkgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgbWQ1X2dldHNldGVycywgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9tZDUubWQ1IiwgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YobWQ1b2JqZWN0KSwgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciltZDVfZGVhbGxvYywgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgbWQ1dHlwZV9kb2MsICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBtZDVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgbWQ1X2dldHNldGVycywgICAgICAgICAgICAvKnRwX2dldHNldCovCiB9OwogCiAKQEAgLTI2MCwyNCArMjYwLDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTUQ1X25ldyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbWQ1b2JqZWN0ICptZDVwOwotCVB5X2J1ZmZlciB2aWV3ID0geyAwIH07CisgICAgbWQ1b2JqZWN0ICptZDVwOworICAgIFB5X2J1ZmZlciB2aWV3ID0geyAwIH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxzKjpuZXciLCAmdmlldykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHMqOm5ldyIsICZ2aWV3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKG1kNXAgPSBuZXdtZDVvYmplY3QoKSkgPT0gTlVMTCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgobWQ1cCA9IG5ld21kNW9iamVjdCgpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAodmlldy5sZW4gPiAwKSB7Ci0JCW1kNV9hcHBlbmQoJm1kNXAtPm1kNSwgKHVuc2lnbmVkIGNoYXIqKXZpZXcuYnVmLAotCQkgICAgICAgUHlfU0FGRV9ET1dOQ0FTVCh2aWV3LmxlbiwgUHlfc3NpemVfdCwgdW5zaWduZWQgaW50KSk7Ci0JfQotCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwotCQotCXJldHVybiAoUHlPYmplY3QgKiltZDVwOworICAgIGlmICh2aWV3LmxlbiA+IDApIHsKKyAgICAgICAgbWQ1X2FwcGVuZCgmbWQ1cC0+bWQ1LCAodW5zaWduZWQgY2hhciopdmlldy5idWYsCisgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKHZpZXcubGVuLCBQeV9zc2l6ZV90LCB1bnNpZ25lZCBpbnQpKTsKKyAgICB9CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbWQ1cDsKIH0KIAogUHlEb2NfU1RSVkFSKG5ld19kb2MsCkBAIC0yOTAsOCArMjkwLDggQEAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoaXMgbW9kdWxlICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtZDVfZnVuY3Rpb25zW10gPSB7Ci0JeyJuZXciLAkJKFB5Q0Z1bmN0aW9uKU1ENV9uZXcsIE1FVEhfVkFSQVJHUywgbmV3X2RvY30sCi0Je05VTEwsCQlOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsibmV3IiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKU1ENV9uZXcsIE1FVEhfVkFSQVJHUywgbmV3X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAKQEAgLTMwMCwxNiArMzAwLDE2IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdF9tZDUodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0gICAgICAgIFB5X1RZUEUoJk1ENXR5cGUpID0gJlB5VHlwZV9UeXBlOwotICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KCZNRDV0eXBlKSA8IDApCi0gICAgICAgICAgICByZXR1cm47Ci0JbSA9IFB5X0luaXRNb2R1bGUzKCJfbWQ1IiwgbWQ1X2Z1bmN0aW9ucywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkgICAgcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNRDVUeXBlIiwgKFB5T2JqZWN0ICopJk1ENXR5cGUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJkaWdlc3Rfc2l6ZSIsIDE2KTsKLQkvKiBObyBuZWVkIHRvIGNoZWNrIHRoZSBlcnJvciBoZXJlLCB0aGUgY2FsbGVyIHdpbGwgZG8gdGhhdCAqLworICAgIFB5X1RZUEUoJk1ENXR5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk1ENXR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiX21kNSIsIG1kNV9mdW5jdGlvbnMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUQ1VHlwZSIsIChQeU9iamVjdCAqKSZNRDV0eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiZGlnZXN0X3NpemUiLCAxNik7CisgICAgLyogTm8gbmVlZCB0byBjaGVjayB0aGUgZXJyb3IgaGVyZSwgdGhlIGNhbGxlciB3aWxsIGRvIHRoYXQgKi8KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvbW1hcG1vZHVsZS5jIGIvTW9kdWxlcy9tbWFwbW9kdWxlLmMKaW5kZXggNWUwYjNhZC4uMWFjZDFkOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tbWFwbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9tbWFwbW9kdWxlLmMKQEAgLTMwLDE4ICszMCwxOCBAQAogc3RhdGljIGludAogbXlfZ2V0cGFnZXNpemUodm9pZCkKIHsKLQlTWVNURU1fSU5GTyBzaTsKLQlHZXRTeXN0ZW1JbmZvKCZzaSk7Ci0JcmV0dXJuIHNpLmR3UGFnZVNpemU7CisgICAgU1lTVEVNX0lORk8gc2k7CisgICAgR2V0U3lzdGVtSW5mbygmc2kpOworICAgIHJldHVybiBzaS5kd1BhZ2VTaXplOwogfQogCiBzdGF0aWMgaW50CiBteV9nZXRhbGxvY2F0aW9uZ3JhbnVsYXJpdHkgKHZvaWQpCiB7CiAKLQlTWVNURU1fSU5GTyBzaTsKLQlHZXRTeXN0ZW1JbmZvKCZzaSk7Ci0JcmV0dXJuIHNpLmR3QWxsb2NhdGlvbkdyYW51bGFyaXR5OworICAgIFNZU1RFTV9JTkZPIHNpOworICAgIEdldFN5c3RlbUluZm8oJnNpKTsKKyAgICByZXR1cm4gc2kuZHdBbGxvY2F0aW9uR3JhbnVsYXJpdHk7CiB9CiAKICNlbmRpZgpAQCAtNTQsNyArNTQsNyBAQAogc3RhdGljIGludAogbXlfZ2V0cGFnZXNpemUodm9pZCkKIHsKLQlyZXR1cm4gc3lzY29uZihfU0NfUEFHRVNJWkUpOworICAgIHJldHVybiBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiB9CiAKICNkZWZpbmUgbXlfZ2V0YWxsb2NhdGlvbmdyYW51bGFyaXR5IG15X2dldHBhZ2VzaXplCkBAIC03OSwzMCArNzksMzAgQEAKIAogdHlwZWRlZiBlbnVtCiB7Ci0JQUNDRVNTX0RFRkFVTFQsCi0JQUNDRVNTX1JFQUQsCi0JQUNDRVNTX1dSSVRFLAotCUFDQ0VTU19DT1BZCisgICAgQUNDRVNTX0RFRkFVTFQsCisgICAgQUNDRVNTX1JFQUQsCisgICAgQUNDRVNTX1dSSVRFLAorICAgIEFDQ0VTU19DT1BZCiB9IGFjY2Vzc19tb2RlOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWNoYXIgKglkYXRhOwotCXNpemVfdAlzaXplOwotCXNpemVfdAlwb3M7ICAgIC8qIHJlbGF0aXZlIHRvIG9mZnNldCAqLwotCXNpemVfdAlvZmZzZXQ7IAorICAgIFB5T2JqZWN0X0hFQUQKKyAgICBjaGFyICogICAgICBkYXRhOworICAgIHNpemVfdCAgICAgIHNpemU7CisgICAgc2l6ZV90ICAgICAgcG9zOyAgICAvKiByZWxhdGl2ZSB0byBvZmZzZXQgKi8KKyAgICBzaXplX3QgICAgICBvZmZzZXQ7CiAKICNpZmRlZiBNU19XSU5ET1dTCi0JSEFORExFCW1hcF9oYW5kbGU7Ci0JSEFORExFCWZpbGVfaGFuZGxlOwotCWNoYXIgKgl0YWduYW1lOworICAgIEhBTkRMRSAgICAgIG1hcF9oYW5kbGU7CisgICAgSEFORExFICAgICAgZmlsZV9oYW5kbGU7CisgICAgY2hhciAqICAgICAgdGFnbmFtZTsKICNlbmRpZgogCiAjaWZkZWYgVU5JWAotICAgICAgICBpbnQgZmQ7CisgICAgaW50IGZkOwogI2VuZGlmCiAKLSAgICAgICAgYWNjZXNzX21vZGUgYWNjZXNzOworICAgIGFjY2Vzc19tb2RlIGFjY2VzczsKIH0gbW1hcF9vYmplY3Q7CiAKIApAQCAtMTEwLDMyMSArMTEwLDMyMSBAQAogbW1hcF9vYmplY3RfZGVhbGxvYyhtbWFwX29iamVjdCAqbV9vYmopCiB7CiAjaWZkZWYgTVNfV0lORE9XUwotCWlmIChtX29iai0+ZGF0YSAhPSBOVUxMKQotCQlVbm1hcFZpZXdPZkZpbGUgKG1fb2JqLT5kYXRhKTsKLQlpZiAobV9vYmotPm1hcF9oYW5kbGUgIT0gTlVMTCkKLQkJQ2xvc2VIYW5kbGUgKG1fb2JqLT5tYXBfaGFuZGxlKTsKLQlpZiAobV9vYmotPmZpbGVfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQotCQlDbG9zZUhhbmRsZSAobV9vYmotPmZpbGVfaGFuZGxlKTsKLQlpZiAobV9vYmotPnRhZ25hbWUpCi0JCVB5TWVtX0ZyZWUobV9vYmotPnRhZ25hbWUpOworICAgIGlmIChtX29iai0+ZGF0YSAhPSBOVUxMKQorICAgICAgICBVbm1hcFZpZXdPZkZpbGUgKG1fb2JqLT5kYXRhKTsKKyAgICBpZiAobV9vYmotPm1hcF9oYW5kbGUgIT0gTlVMTCkKKyAgICAgICAgQ2xvc2VIYW5kbGUgKG1fb2JqLT5tYXBfaGFuZGxlKTsKKyAgICBpZiAobV9vYmotPmZpbGVfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICBDbG9zZUhhbmRsZSAobV9vYmotPmZpbGVfaGFuZGxlKTsKKyAgICBpZiAobV9vYmotPnRhZ25hbWUpCisgICAgICAgIFB5TWVtX0ZyZWUobV9vYmotPnRhZ25hbWUpOwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogI2lmZGVmIFVOSVgKLQlpZiAobV9vYmotPmZkID49IDApCi0JCSh2b2lkKSBjbG9zZShtX29iai0+ZmQpOwotCWlmIChtX29iai0+ZGF0YSE9TlVMTCkgewotCQltc3luYyhtX29iai0+ZGF0YSwgbV9vYmotPnNpemUsIE1TX1NZTkMpOwotCQltdW5tYXAobV9vYmotPmRhdGEsIG1fb2JqLT5zaXplKTsKLQl9CisgICAgaWYgKG1fb2JqLT5mZCA+PSAwKQorICAgICAgICAodm9pZCkgY2xvc2UobV9vYmotPmZkKTsKKyAgICBpZiAobV9vYmotPmRhdGEhPU5VTEwpIHsKKyAgICAgICAgbXN5bmMobV9vYmotPmRhdGEsIG1fb2JqLT5zaXplLCBNU19TWU5DKTsKKyAgICAgICAgbXVubWFwKG1fb2JqLT5kYXRhLCBtX29iai0+c2l6ZSk7CisgICAgfQogI2VuZGlmIC8qIFVOSVggKi8KIAotCVB5X1RZUEUobV9vYmopLT50cF9mcmVlKChQeU9iamVjdCopbV9vYmopOworICAgIFB5X1RZUEUobV9vYmopLT50cF9mcmVlKChQeU9iamVjdCopbV9vYmopOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9jbG9zZV9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7CiAjaWZkZWYgTVNfV0lORE9XUwotCS8qIEZvciBlYWNoIHJlc291cmNlIHdlIG1haW50YWluLCB3ZSBuZWVkIHRvIGNoZWNrCi0JICAgdGhlIHZhbHVlIGlzIHZhbGlkLCBhbmQgaWYgc28sIGZyZWUgdGhlIHJlc291cmNlCi0JICAgYW5kIHNldCB0aGUgbWVtYmVyIHZhbHVlIHRvIGFuIGludmFsaWQgdmFsdWUgc28KLQkgICB0aGUgZGVhbGxvYyBkb2VzIG5vdCBhdHRlbXB0IHRvIHJlc291cmNlIGNsZWFyaW5nCi0JICAgYWdhaW4uCi0JICAgVE9ETyAtIHNob3VsZCB3ZSBjaGVjayBmb3IgZXJyb3JzIGluIHRoZSBjbG9zZSBvcGVyYXRpb25zPz8/Ci0JKi8KLQlpZiAoc2VsZi0+ZGF0YSAhPSBOVUxMKSB7Ci0JCVVubWFwVmlld09mRmlsZShzZWxmLT5kYXRhKTsKLQkJc2VsZi0+ZGF0YSA9IE5VTEw7Ci0JfQotCWlmIChzZWxmLT5tYXBfaGFuZGxlICE9IE5VTEwpIHsKLQkJQ2xvc2VIYW5kbGUoc2VsZi0+bWFwX2hhbmRsZSk7Ci0JCXNlbGYtPm1hcF9oYW5kbGUgPSBOVUxMOwotCX0KLQlpZiAoc2VsZi0+ZmlsZV9oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJQ2xvc2VIYW5kbGUoc2VsZi0+ZmlsZV9oYW5kbGUpOwotCQlzZWxmLT5maWxlX2hhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotCX0KKyAgICAvKiBGb3IgZWFjaCByZXNvdXJjZSB3ZSBtYWludGFpbiwgd2UgbmVlZCB0byBjaGVjaworICAgICAgIHRoZSB2YWx1ZSBpcyB2YWxpZCwgYW5kIGlmIHNvLCBmcmVlIHRoZSByZXNvdXJjZQorICAgICAgIGFuZCBzZXQgdGhlIG1lbWJlciB2YWx1ZSB0byBhbiBpbnZhbGlkIHZhbHVlIHNvCisgICAgICAgdGhlIGRlYWxsb2MgZG9lcyBub3QgYXR0ZW1wdCB0byByZXNvdXJjZSBjbGVhcmluZworICAgICAgIGFnYWluLgorICAgICAgIFRPRE8gLSBzaG91bGQgd2UgY2hlY2sgZm9yIGVycm9ycyBpbiB0aGUgY2xvc2Ugb3BlcmF0aW9ucz8/PworICAgICovCisgICAgaWYgKHNlbGYtPmRhdGEgIT0gTlVMTCkgeworICAgICAgICBVbm1hcFZpZXdPZkZpbGUoc2VsZi0+ZGF0YSk7CisgICAgICAgIHNlbGYtPmRhdGEgPSBOVUxMOworICAgIH0KKyAgICBpZiAoc2VsZi0+bWFwX2hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIENsb3NlSGFuZGxlKHNlbGYtPm1hcF9oYW5kbGUpOworICAgICAgICBzZWxmLT5tYXBfaGFuZGxlID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHNlbGYtPmZpbGVfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIENsb3NlSGFuZGxlKHNlbGYtPmZpbGVfaGFuZGxlKTsKKyAgICAgICAgc2VsZi0+ZmlsZV9oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICB9CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiAjaWZkZWYgVU5JWAotCWlmICgwIDw9IHNlbGYtPmZkKQotCQkodm9pZCkgY2xvc2Uoc2VsZi0+ZmQpOwotCXNlbGYtPmZkID0gLTE7Ci0JaWYgKHNlbGYtPmRhdGEgIT0gTlVMTCkgewotCQltdW5tYXAoc2VsZi0+ZGF0YSwgc2VsZi0+c2l6ZSk7Ci0JCXNlbGYtPmRhdGEgPSBOVUxMOwotCX0KKyAgICBpZiAoMCA8PSBzZWxmLT5mZCkKKyAgICAgICAgKHZvaWQpIGNsb3NlKHNlbGYtPmZkKTsKKyAgICBzZWxmLT5mZCA9IC0xOworICAgIGlmIChzZWxmLT5kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgbXVubWFwKHNlbGYtPmRhdGEsIHNlbGYtPnNpemUpOworICAgICAgICBzZWxmLT5kYXRhID0gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNpZmRlZiBNU19XSU5ET1dTCi0jZGVmaW5lIENIRUNLX1ZBTElEKGVycikJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICAgIGlmIChzZWxmLT5tYXBfaGFuZGxlID09IE5VTEwpIHsJCQkJCVwKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1tYXAgY2xvc2VkIG9yIGludmFsaWQiKTsJXAotCXJldHVybiBlcnI7CQkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAorI2RlZmluZSBDSEVDS19WQUxJRChlcnIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzZWxmLT5tYXBfaGFuZGxlID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibW1hcCBjbG9zZWQgb3IgaW52YWxpZCIpOyAgICAgICAgXAorICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSB3aGlsZSAoMCkKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKICNpZmRlZiBVTklYCi0jZGVmaW5lIENIRUNLX1ZBTElEKGVycikJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICAgIGlmIChzZWxmLT5kYXRhID09IE5VTEwpIHsJCQkJCQlcCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtbWFwIGNsb3NlZCBvciBpbnZhbGlkIik7CVwKLQlyZXR1cm4gZXJyOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAorI2RlZmluZSBDSEVDS19WQUxJRChlcnIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzZWxmLT5kYXRhID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibW1hcCBjbG9zZWQgb3IgaW52YWxpZCIpOyAgICAgICAgXAorICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSB3aGlsZSAoMCkKICNlbmRpZiAvKiBVTklYICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3JlYWRfYnl0ZV9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsCi0JCSAgICAgIFB5T2JqZWN0ICp1bnVzZWQpCisgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoc2VsZi0+cG9zIDwgc2VsZi0+c2l6ZSkgewotCSAgICAgICAgY2hhciB2YWx1ZSA9IHNlbGYtPmRhdGFbc2VsZi0+cG9zXTsKLQkJc2VsZi0+cG9zICs9IDE7Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJjIiwgdmFsdWUpOwotCX0gZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicmVhZCBieXRlIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKHNlbGYtPnBvcyA8IHNlbGYtPnNpemUpIHsKKyAgICAgICAgY2hhciB2YWx1ZSA9IHNlbGYtPmRhdGFbc2VsZi0+cG9zXTsKKyAgICAgICAgc2VsZi0+cG9zICs9IDE7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJjIiwgdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicmVhZCBieXRlIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3JlYWRfbGluZV9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsCi0JCSAgICAgIFB5T2JqZWN0ICp1bnVzZWQpCisgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnVudXNlZCkKIHsKLQljaGFyICpzdGFydCA9IHNlbGYtPmRhdGErc2VsZi0+cG9zOwotCWNoYXIgKmVvZiA9IHNlbGYtPmRhdGErc2VsZi0+c2l6ZTsKLQljaGFyICplb2w7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBjaGFyICpzdGFydCA9IHNlbGYtPmRhdGErc2VsZi0+cG9zOworICAgIGNoYXIgKmVvZiA9IHNlbGYtPmRhdGErc2VsZi0+c2l6ZTsKKyAgICBjaGFyICplb2w7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCUNIRUNLX1ZBTElEKE5VTEwpOworICAgIENIRUNLX1ZBTElEKE5VTEwpOwogCi0JZW9sID0gbWVtY2hyKHN0YXJ0LCAnXG4nLCBzZWxmLT5zaXplIC0gc2VsZi0+cG9zKTsKLQlpZiAoIWVvbCkKLQkJZW9sID0gZW9mOwotCWVsc2UKLQkJKytlb2w7CQkvKiB3ZSdyZSBpbnRlcmVzdGVkIGluIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUKLQkJCQkgICBuZXdsaW5lLiAqLwotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0YXJ0LCAoZW9sIC0gc3RhcnQpKTsKLQlzZWxmLT5wb3MgKz0gKGVvbCAtIHN0YXJ0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGVvbCA9IG1lbWNocihzdGFydCwgJ1xuJywgc2VsZi0+c2l6ZSAtIHNlbGYtPnBvcyk7CisgICAgaWYgKCFlb2wpCisgICAgICAgIGVvbCA9IGVvZjsKKyAgICBlbHNlCisgICAgICAgICsrZW9sOyAgICAgICAgICAgICAgICAgIC8qIHdlJ3JlIGludGVyZXN0ZWQgaW4gdGhlIHBvc2l0aW9uIGFmdGVyIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZS4gKi8KKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdGFydCwgKGVvbCAtIHN0YXJ0KSk7CisgICAgc2VsZi0+cG9zICs9IChlb2wgLSBzdGFydCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfcmVhZF9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsCi0JCSBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBudW1fYnl0ZXMsIG47Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG51bV9ieXRlcywgbjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuOnJlYWQiLCAmbnVtX2J5dGVzKSkKLQkJcmV0dXJuKE5VTEwpOworICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibjpyZWFkIiwgJm51bV9ieXRlcykpCisgICAgICAgIHJldHVybihOVUxMKTsKIAotCS8qIHNpbGVudGx5ICdhZGp1c3QnIG91dC1vZi1yYW5nZSByZXF1ZXN0cyAqLwotCWFzc2VydChzZWxmLT5zaXplID49IHNlbGYtPnBvcyk7Ci0JbiA9IHNlbGYtPnNpemUgLSBzZWxmLT5wb3M7Ci0JLyogVGhlIGRpZmZlcmVuY2UgY2FuIG92ZXJmbG93LCBvbmx5IGlmIHNlbGYtPnNpemUgaXMgZ3JlYXRlciB0aGFuCi0JICogUFlfU1NJWkVfVF9NQVguICBCdXQgdGhlbiB0aGUgb3BlcmF0aW9uIGNhbm5vdCBwb3NzaWJseSBzdWNjZWVkLAotCSAqIGJlY2F1c2UgdGhlIG1hcHBlZCBhcmVhIGFuZCB0aGUgcmV0dXJuZWQgc3RyaW5nIGVhY2ggbmVlZCBtb3JlIAotCSAqIHRoYW4gaGFsZiBvZiB0aGUgYWRkcmVzc2FibGUgbWVtb3J5LiAgU28gd2UgY2xpcCB0aGUgc2l6ZSwgYW5kIGxldAotCSAqIHRoZSBjb2RlIGJlbG93IHJhaXNlIE1lbW9yeUVycm9yLgotCSAqLwotCWlmIChuIDwgMCkKLQkJbiA9IFBZX1NTSVpFX1RfTUFYOwotCWlmIChudW1fYnl0ZXMgPCAwIHx8IG51bV9ieXRlcyA+IG4pIHsKLQkJbnVtX2J5dGVzID0gbjsKLQl9Ci0JcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBzZWxmLT5kYXRhK3NlbGYtPnBvcywgbnVtX2J5dGVzKTsKLQlzZWxmLT5wb3MgKz0gbnVtX2J5dGVzOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogc2lsZW50bHkgJ2FkanVzdCcgb3V0LW9mLXJhbmdlIHJlcXVlc3RzICovCisgICAgYXNzZXJ0KHNlbGYtPnNpemUgPj0gc2VsZi0+cG9zKTsKKyAgICBuID0gc2VsZi0+c2l6ZSAtIHNlbGYtPnBvczsKKyAgICAvKiBUaGUgZGlmZmVyZW5jZSBjYW4gb3ZlcmZsb3csIG9ubHkgaWYgc2VsZi0+c2l6ZSBpcyBncmVhdGVyIHRoYW4KKyAgICAgKiBQWV9TU0laRV9UX01BWC4gIEJ1dCB0aGVuIHRoZSBvcGVyYXRpb24gY2Fubm90IHBvc3NpYmx5IHN1Y2NlZWQsCisgICAgICogYmVjYXVzZSB0aGUgbWFwcGVkIGFyZWEgYW5kIHRoZSByZXR1cm5lZCBzdHJpbmcgZWFjaCBuZWVkIG1vcmUKKyAgICAgKiB0aGFuIGhhbGYgb2YgdGhlIGFkZHJlc3NhYmxlIG1lbW9yeS4gIFNvIHdlIGNsaXAgdGhlIHNpemUsIGFuZCBsZXQKKyAgICAgKiB0aGUgY29kZSBiZWxvdyByYWlzZSBNZW1vcnlFcnJvci4KKyAgICAgKi8KKyAgICBpZiAobiA8IDApCisgICAgICAgIG4gPSBQWV9TU0laRV9UX01BWDsKKyAgICBpZiAobnVtX2J5dGVzIDwgMCB8fCBudW1fYnl0ZXMgPiBuKSB7CisgICAgICAgIG51bV9ieXRlcyA9IG47CisgICAgfQorICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoInMjIiwgc2VsZi0+ZGF0YStzZWxmLT5wb3MsIG51bV9ieXRlcyk7CisgICAgc2VsZi0+cG9zICs9IG51bV9ieXRlczsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9nZmluZChtbWFwX29iamVjdCAqc2VsZiwKLQkgICBQeU9iamVjdCAqYXJncywKLQkgICBpbnQgcmV2ZXJzZSkKKyAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsCisgICAgICAgICAgIGludCByZXZlcnNlKQogewotCVB5X3NzaXplX3Qgc3RhcnQgPSBzZWxmLT5wb3M7Ci0JUHlfc3NpemVfdCBlbmQgPSBzZWxmLT5zaXplOwotCWNvbnN0IGNoYXIgKm5lZWRsZTsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gc2VsZi0+cG9zOworICAgIFB5X3NzaXplX3QgZW5kID0gc2VsZi0+c2l6ZTsKKyAgICBjb25zdCBjaGFyICpuZWVkbGU7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgcmV2ZXJzZSA/ICJzI3xubjpyZmluZCIgOiAicyN8bm46ZmluZCIsCi0JCQkgICAgICAmbmVlZGxlLCAmbGVuLCAmc3RhcnQsICZlbmQpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0gZWxzZSB7Ci0JCWNvbnN0IGNoYXIgKnAsICpzdGFydF9wLCAqZW5kX3A7Ci0JCWludCBzaWduID0gcmV2ZXJzZSA/IC0xIDogMTsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgcmV2ZXJzZSA/ICJzI3xubjpyZmluZCIgOiAicyN8bm46ZmluZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZWVkbGUsICZsZW4sICZzdGFydCwgJmVuZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgY2hhciAqcCwgKnN0YXJ0X3AsICplbmRfcDsKKyAgICAgICAgaW50IHNpZ24gPSByZXZlcnNlID8gLTEgOiAxOwogCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkKLQkJCXN0YXJ0ICs9IHNlbGYtPnNpemU7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkKLQkJCXN0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgoc2l6ZV90KXN0YXJ0ID4gc2VsZi0+c2l6ZSkKLQkJCXN0YXJ0ID0gc2VsZi0+c2l6ZTsKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgICAgIHN0YXJ0ICs9IHNlbGYtPnNpemU7CisgICAgICAgIGlmIChzdGFydCA8IDApCisgICAgICAgICAgICBzdGFydCA9IDA7CisgICAgICAgIGVsc2UgaWYgKChzaXplX3Qpc3RhcnQgPiBzZWxmLT5zaXplKQorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLT5zaXplOwogCi0gICAgICAgICAgICAgICAgaWYgKGVuZCA8IDApCi0JCQllbmQgKz0gc2VsZi0+c2l6ZTsKLQkJaWYgKGVuZCA8IDApCi0JCQllbmQgPSAwOwotCQllbHNlIGlmICgoc2l6ZV90KWVuZCA+IHNlbGYtPnNpemUpCi0JCQllbmQgPSBzZWxmLT5zaXplOworICAgICAgICBpZiAoZW5kIDwgMCkKKyAgICAgICAgICAgIGVuZCArPSBzZWxmLT5zaXplOworICAgICAgICBpZiAoZW5kIDwgMCkKKyAgICAgICAgICAgIGVuZCA9IDA7CisgICAgICAgIGVsc2UgaWYgKChzaXplX3QpZW5kID4gc2VsZi0+c2l6ZSkKKyAgICAgICAgICAgIGVuZCA9IHNlbGYtPnNpemU7CiAKLQkJc3RhcnRfcCA9IHNlbGYtPmRhdGEgKyBzdGFydDsKLQkJZW5kX3AgPSBzZWxmLT5kYXRhICsgZW5kOworICAgICAgICBzdGFydF9wID0gc2VsZi0+ZGF0YSArIHN0YXJ0OworICAgICAgICBlbmRfcCA9IHNlbGYtPmRhdGEgKyBlbmQ7CiAKLQkJZm9yIChwID0gKHJldmVyc2UgPyBlbmRfcCAtIGxlbiA6IHN0YXJ0X3ApOwotCQkgICAgIChwID49IHN0YXJ0X3ApICYmIChwICsgbGVuIDw9IGVuZF9wKTsgcCArPSBzaWduKSB7Ci0JCQlQeV9zc2l6ZV90IGk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIG5lZWRsZVtpXSA9PSBwW2ldOyArK2kpCi0JCQkJLyogbm90aGluZyAqLzsKLQkJCWlmIChpID09IGxlbikgewotCQkJCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChwIC0gc2VsZi0+ZGF0YSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKC0xKTsKLQl9CisgICAgICAgIGZvciAocCA9IChyZXZlcnNlID8gZW5kX3AgLSBsZW4gOiBzdGFydF9wKTsKKyAgICAgICAgICAgICAocCA+PSBzdGFydF9wKSAmJiAocCArIGxlbiA8PSBlbmRfcCk7IHAgKz0gc2lnbikgeworICAgICAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbiAmJiBuZWVkbGVbaV0gPT0gcFtpXTsgKytpKQorICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgKi87CisgICAgICAgICAgICBpZiAoaSA9PSBsZW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocCAtIHNlbGYtPmRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygtMSk7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9maW5kX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwKLQkJIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gbW1hcF9nZmluZChzZWxmLCBhcmdzLCAwKTsKKyAgICByZXR1cm4gbW1hcF9nZmluZChzZWxmLCBhcmdzLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfcmZpbmRfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBtbWFwX2dmaW5kKHNlbGYsIGFyZ3MsIDEpOworICAgIHJldHVybiBtbWFwX2dmaW5kKHNlbGYsIGFyZ3MsIDEpOwogfQogCiBzdGF0aWMgaW50CiBpc193cml0ZWFibGUobW1hcF9vYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmFjY2VzcyAhPSBBQ0NFU1NfUkVBRCkKLQkJcmV0dXJuIDE7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIm1tYXAgY2FuJ3QgbW9kaWZ5IGEgcmVhZG9ubHkgbWVtb3J5IG1hcC4iKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc2VsZi0+YWNjZXNzICE9IEFDQ0VTU19SRUFEKQorICAgICAgICByZXR1cm4gMTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAibW1hcCBjYW4ndCBtb2RpZnkgYSByZWFkb25seSBtZW1vcnkgbWFwLiIpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBpc19yZXNpemVhYmxlKG1tYXBfb2JqZWN0ICpzZWxmKQogewotCWlmICgoc2VsZi0+YWNjZXNzID09IEFDQ0VTU19XUklURSkgfHwgKHNlbGYtPmFjY2VzcyA9PSBBQ0NFU1NfREVGQVVMVCkpCi0JCXJldHVybiAxOwotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgIm1tYXAgY2FuJ3QgcmVzaXplIGEgcmVhZG9ubHkgb3IgY29weS1vbi13cml0ZSBtZW1vcnkgbWFwLiIpOwotCXJldHVybiAwOworICAgIGlmICgoc2VsZi0+YWNjZXNzID09IEFDQ0VTU19XUklURSkgfHwgKHNlbGYtPmFjY2VzcyA9PSBBQ0NFU1NfREVGQVVMVCkpCisgICAgICAgIHJldHVybiAxOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJtbWFwIGNhbid0IHJlc2l6ZSBhIHJlYWRvbmx5IG9yIGNvcHktb24td3JpdGUgbWVtb3J5IG1hcC4iKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF93cml0ZV9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsCi0JCSAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGxlbmd0aDsKLQljaGFyICpkYXRhOworICAgIFB5X3NzaXplX3QgbGVuZ3RoOworICAgIGNoYXIgKmRhdGE7CiAKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOndyaXRlIiwgJmRhdGEsICZsZW5ndGgpKQotCQlyZXR1cm4oTlVMTCk7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp3cml0ZSIsICZkYXRhLCAmbGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuKE5VTEwpOwogCi0JaWYgKCFpc193cml0ZWFibGUoc2VsZikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgoc2VsZi0+cG9zICsgbGVuZ3RoKSA+IHNlbGYtPnNpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXRhIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtY3B5KHNlbGYtPmRhdGErc2VsZi0+cG9zLCBkYXRhLCBsZW5ndGgpOwotCXNlbGYtPnBvcyA9IHNlbGYtPnBvcytsZW5ndGg7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICgoc2VsZi0+cG9zICsgbGVuZ3RoKSA+IHNlbGYtPnNpemUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXRhIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtY3B5KHNlbGYtPmRhdGErc2VsZi0+cG9zLCBkYXRhLCBsZW5ndGgpOworICAgIHNlbGYtPnBvcyA9IHNlbGYtPnBvcytsZW5ndGg7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF93cml0ZV9ieXRlX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwKLQkJICAgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyIHZhbHVlOworICAgIGNoYXIgdmFsdWU7CiAKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImM6d3JpdGVfYnl0ZSIsICZ2YWx1ZSkpCi0JCXJldHVybihOVUxMKTsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImM6d3JpdGVfYnl0ZSIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybihOVUxMKTsKIAotCWlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc2VsZi0+cG9zIDwgc2VsZi0+c2l6ZSkgewotCQkqKHNlbGYtPmRhdGErc2VsZi0+cG9zKSA9IHZhbHVlOwotCQlzZWxmLT5wb3MgKz0gMTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAid3JpdGUgYnl0ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzZWxmLT5wb3MgPCBzZWxmLT5zaXplKSB7CisgICAgICAgICooc2VsZi0+ZGF0YStzZWxmLT5wb3MpID0gdmFsdWU7CisgICAgICAgIHNlbGYtPnBvcyArPSAxOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ3cml0ZSBieXRlIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3NpemVfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKnVudXNlZCkKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlDSEVDS19WQUxJRChOVUxMKTsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQlpZiAoc2VsZi0+ZmlsZV9oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJRFdPUkQgbG93LGhpZ2g7Ci0JCVBZX0xPTkdfTE9ORyBzaXplOwotCQlsb3cgPSBHZXRGaWxlU2l6ZShzZWxmLT5maWxlX2hhbmRsZSwgJmhpZ2gpOwotCQlpZiAobG93ID09IElOVkFMSURfRklMRV9TSVpFKSB7Ci0JCQkvKiBJdCBtaWdodCBiZSB0aGF0IHRoZSBmdW5jdGlvbiBhcHBlYXJzIHRvIGhhdmUgZmFpbGVkLAotCQkJICAgd2hlbiBpbmRlZWQgaXRzIHNpemUgZXF1YWxzIElOVkFMSURfRklMRV9TSVpFICovCi0JCQlEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOwotCQkJaWYgKGVycm9yICE9IE5PX0VSUk9SKQotCQkJCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihlcnJvcik7Ci0JCX0KLQkJaWYgKCFoaWdoICYmIGxvdyA8IExPTkdfTUFYKQotCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWxvdyk7Ci0JCXNpemUgPSAoKChQWV9MT05HX0xPTkcpaGlnaCk8PDMyKSArIGxvdzsKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoc2l6ZSk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHNlbGYtPnNpemUpOwotCX0KKyAgICBpZiAoc2VsZi0+ZmlsZV9oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgRFdPUkQgbG93LGhpZ2g7CisgICAgICAgIFBZX0xPTkdfTE9ORyBzaXplOworICAgICAgICBsb3cgPSBHZXRGaWxlU2l6ZShzZWxmLT5maWxlX2hhbmRsZSwgJmhpZ2gpOworICAgICAgICBpZiAobG93ID09IElOVkFMSURfRklMRV9TSVpFKSB7CisgICAgICAgICAgICAvKiBJdCBtaWdodCBiZSB0aGF0IHRoZSBmdW5jdGlvbiBhcHBlYXJzIHRvIGhhdmUgZmFpbGVkLAorICAgICAgICAgICAgICAgd2hlbiBpbmRlZWQgaXRzIHNpemUgZXF1YWxzIElOVkFMSURfRklMRV9TSVpFICovCisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGVycm9yICE9IE5PX0VSUk9SKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoaWdoICYmIGxvdyA8IExPTkdfTUFYKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWxvdyk7CisgICAgICAgIHNpemUgPSAoKChQWV9MT05HX0xPTkcpaGlnaCk8PDMyKSArIGxvdzsKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHNlbGYtPnNpemUpOworICAgIH0KICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKICNpZmRlZiBVTklYCi0JewotCQlzdHJ1Y3Qgc3RhdCBidWY7Ci0JCWlmICgtMSA9PSBmc3RhdChzZWxmLT5mZCwgJmJ1ZikpIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoYnVmLnN0X3NpemUpOwotCX0KKyAgICB7CisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgaWYgKC0xID09IGZzdGF0KHNlbGYtPmZkLCAmYnVmKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChidWYuc3Rfc2l6ZSk7CisgICAgfQogI2VuZGlmIC8qIFVOSVggKi8KIH0KIApAQCAtNDM5LDIyMyArNDM5LDIyMyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9yZXNpemVfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLAotCQkgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IG5ld19zaXplOwotCUNIRUNLX1ZBTElEKE5VTEwpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibjpyZXNpemUiLCAmbmV3X3NpemUpIHx8Ci0JICAgICFpc19yZXNpemVhYmxlKHNlbGYpKSB7Ci0JCXJldHVybiBOVUxMOworICAgIFB5X3NzaXplX3QgbmV3X3NpemU7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuOnJlc2l6ZSIsICZuZXdfc2l6ZSkgfHwKKyAgICAgICAgIWlzX3Jlc2l6ZWFibGUoc2VsZikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgTVNfV0lORE9XUwotCX0gZWxzZSB7Ci0JCURXT1JEIGR3RXJyQ29kZSA9IDA7Ci0JCURXT1JEIG9mZl9oaSwgb2ZmX2xvLCBuZXdTaXplTG93LCBuZXdTaXplSGlnaDsKLQkJLyogRmlyc3QsIHVubWFwIHRoZSBmaWxlIHZpZXcgKi8KLQkJVW5tYXBWaWV3T2ZGaWxlKHNlbGYtPmRhdGEpOwotCQlzZWxmLT5kYXRhID0gTlVMTDsKLQkJLyogQ2xvc2UgdGhlIG1hcHBpbmcgb2JqZWN0ICovCi0JCUNsb3NlSGFuZGxlKHNlbGYtPm1hcF9oYW5kbGUpOwotCQlzZWxmLT5tYXBfaGFuZGxlID0gTlVMTDsKLQkJLyogTW92ZSB0byB0aGUgZGVzaXJlZCBFT0YgcG9zaXRpb24gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBEV09SRCBkd0VyckNvZGUgPSAwOworICAgICAgICBEV09SRCBvZmZfaGksIG9mZl9sbywgbmV3U2l6ZUxvdywgbmV3U2l6ZUhpZ2g7CisgICAgICAgIC8qIEZpcnN0LCB1bm1hcCB0aGUgZmlsZSB2aWV3ICovCisgICAgICAgIFVubWFwVmlld09mRmlsZShzZWxmLT5kYXRhKTsKKyAgICAgICAgc2VsZi0+ZGF0YSA9IE5VTEw7CisgICAgICAgIC8qIENsb3NlIHRoZSBtYXBwaW5nIG9iamVjdCAqLworICAgICAgICBDbG9zZUhhbmRsZShzZWxmLT5tYXBfaGFuZGxlKTsKKyAgICAgICAgc2VsZi0+bWFwX2hhbmRsZSA9IE5VTEw7CisgICAgICAgIC8qIE1vdmUgdG8gdGhlIGRlc2lyZWQgRU9GIHBvc2l0aW9uICovCiAjaWYgU0laRU9GX1NJWkVfVCA+IDQKLQkJbmV3U2l6ZUhpZ2ggPSAoRFdPUkQpKChzZWxmLT5vZmZzZXQgKyBuZXdfc2l6ZSkgPj4gMzIpOwotCQluZXdTaXplTG93ID0gKERXT1JEKSgoc2VsZi0+b2Zmc2V0ICsgbmV3X3NpemUpICYgMHhGRkZGRkZGRik7Ci0JCW9mZl9oaSA9IChEV09SRCkoc2VsZi0+b2Zmc2V0ID4+IDMyKTsKLQkJb2ZmX2xvID0gKERXT1JEKShzZWxmLT5vZmZzZXQgJiAweEZGRkZGRkZGKTsKKyAgICAgICAgbmV3U2l6ZUhpZ2ggPSAoRFdPUkQpKChzZWxmLT5vZmZzZXQgKyBuZXdfc2l6ZSkgPj4gMzIpOworICAgICAgICBuZXdTaXplTG93ID0gKERXT1JEKSgoc2VsZi0+b2Zmc2V0ICsgbmV3X3NpemUpICYgMHhGRkZGRkZGRik7CisgICAgICAgIG9mZl9oaSA9IChEV09SRCkoc2VsZi0+b2Zmc2V0ID4+IDMyKTsKKyAgICAgICAgb2ZmX2xvID0gKERXT1JEKShzZWxmLT5vZmZzZXQgJiAweEZGRkZGRkZGKTsKICNlbHNlCi0JCW5ld1NpemVIaWdoID0gMDsKLQkJbmV3U2l6ZUxvdyA9IChEV09SRCkoc2VsZi0+b2Zmc2V0ICsgbmV3X3NpemUpOwotCQlvZmZfaGkgPSAwOwotCQlvZmZfbG8gPSAoRFdPUkQpc2VsZi0+b2Zmc2V0OworICAgICAgICBuZXdTaXplSGlnaCA9IDA7CisgICAgICAgIG5ld1NpemVMb3cgPSAoRFdPUkQpKHNlbGYtPm9mZnNldCArIG5ld19zaXplKTsKKyAgICAgICAgb2ZmX2hpID0gMDsKKyAgICAgICAgb2ZmX2xvID0gKERXT1JEKXNlbGYtPm9mZnNldDsKICNlbmRpZgotCQlTZXRGaWxlUG9pbnRlcihzZWxmLT5maWxlX2hhbmRsZSwKLQkJCSAgICAgICBuZXdTaXplTG93LCAmbmV3U2l6ZUhpZ2gsIEZJTEVfQkVHSU4pOwotCQkvKiBDaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGZpbGUgKi8KLQkJU2V0RW5kT2ZGaWxlKHNlbGYtPmZpbGVfaGFuZGxlKTsKLQkJLyogQ3JlYXRlIGFub3RoZXIgbWFwcGluZyBvYmplY3QgYW5kIHJlbWFwIHRoZSBmaWxlIHZpZXcgKi8KLQkJc2VsZi0+bWFwX2hhbmRsZSA9IENyZWF0ZUZpbGVNYXBwaW5nKAotCQkJc2VsZi0+ZmlsZV9oYW5kbGUsCi0JCQlOVUxMLAotCQkJUEFHRV9SRUFEV1JJVEUsCi0JCQkwLAotCQkJMCwKLQkJCXNlbGYtPnRhZ25hbWUpOwotCQlpZiAoc2VsZi0+bWFwX2hhbmRsZSAhPSBOVUxMKSB7Ci0JCQlzZWxmLT5kYXRhID0gKGNoYXIgKikgTWFwVmlld09mRmlsZShzZWxmLT5tYXBfaGFuZGxlLAotCQkJCQkJCSAgICBGSUxFX01BUF9XUklURSwKLQkJCQkJCQkgICAgb2ZmX2hpLAotCQkJCQkJCSAgICBvZmZfbG8sCi0JCQkJCQkJICAgIG5ld19zaXplKTsKLQkJCWlmIChzZWxmLT5kYXRhICE9IE5VTEwpIHsKLQkJCQlzZWxmLT5zaXplID0gbmV3X3NpemU7Ci0JCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJCXJldHVybiBQeV9Ob25lOwotCQkJfSBlbHNlIHsKLQkJCQlkd0VyckNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKLQkJCQlDbG9zZUhhbmRsZShzZWxmLT5tYXBfaGFuZGxlKTsKLQkJCQlzZWxmLT5tYXBfaGFuZGxlID0gTlVMTDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWR3RXJyQ29kZSA9IEdldExhc3RFcnJvcigpOwotCQl9Ci0JCVB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGR3RXJyQ29kZSk7Ci0JCXJldHVybiBOVUxMOworICAgICAgICBTZXRGaWxlUG9pbnRlcihzZWxmLT5maWxlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3U2l6ZUxvdywgJm5ld1NpemVIaWdoLCBGSUxFX0JFR0lOKTsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBzaXplIG9mIHRoZSBmaWxlICovCisgICAgICAgIFNldEVuZE9mRmlsZShzZWxmLT5maWxlX2hhbmRsZSk7CisgICAgICAgIC8qIENyZWF0ZSBhbm90aGVyIG1hcHBpbmcgb2JqZWN0IGFuZCByZW1hcCB0aGUgZmlsZSB2aWV3ICovCisgICAgICAgIHNlbGYtPm1hcF9oYW5kbGUgPSBDcmVhdGVGaWxlTWFwcGluZygKKyAgICAgICAgICAgIHNlbGYtPmZpbGVfaGFuZGxlLAorICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgIFBBR0VfUkVBRFdSSVRFLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBzZWxmLT50YWduYW1lKTsKKyAgICAgICAgaWYgKHNlbGYtPm1hcF9oYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgc2VsZi0+ZGF0YSA9IChjaGFyICopIE1hcFZpZXdPZkZpbGUoc2VsZi0+bWFwX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfTUFQX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX2hpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX2xvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NpemUpOworICAgICAgICAgICAgaWYgKHNlbGYtPmRhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNlbGYtPnNpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGR3RXJyQ29kZSA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgIENsb3NlSGFuZGxlKHNlbGYtPm1hcF9oYW5kbGUpOworICAgICAgICAgICAgICAgIHNlbGYtPm1hcF9oYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHdFcnJDb2RlID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoZHdFcnJDb2RlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiAjaWZkZWYgVU5JWAogI2lmbmRlZiBIQVZFX01SRU1BUAotCX0gZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkibW1hcDogcmVzaXppbmcgbm90IGF2YWlsYWJsZS0tbm8gbXJlbWFwKCkiKTsKLQkJcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXA6IHJlc2l6aW5nIG5vdCBhdmFpbGFibGUtLW5vIG1yZW1hcCgpIik7CisgICAgICAgIHJldHVybiBOVUxMOwogI2Vsc2UKLQl9IGVsc2UgewotCQl2b2lkICpuZXdtYXA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdm9pZCAqbmV3bWFwOwogCi0JCWlmIChmdHJ1bmNhdGUoc2VsZi0+ZmQsIHNlbGYtPm9mZnNldCArIG5ld19zaXplKSA9PSAtMSkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGlmIChmdHJ1bmNhdGUoc2VsZi0+ZmQsIHNlbGYtPm9mZnNldCArIG5ld19zaXplKSA9PSAtMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKICNpZmRlZiBNUkVNQVBfTUFZTU9WRQotCQluZXdtYXAgPSBtcmVtYXAoc2VsZi0+ZGF0YSwgc2VsZi0+c2l6ZSwgbmV3X3NpemUsIE1SRU1BUF9NQVlNT1ZFKTsKKyAgICAgICAgbmV3bWFwID0gbXJlbWFwKHNlbGYtPmRhdGEsIHNlbGYtPnNpemUsIG5ld19zaXplLCBNUkVNQVBfTUFZTU9WRSk7CiAjZWxzZQotCQkjaWYgZGVmaW5lZChfX05ldEJTRF9fKQotCQkJbmV3bWFwID0gbXJlbWFwKHNlbGYtPmRhdGEsIHNlbGYtPnNpemUsIHNlbGYtPmRhdGEsIG5ld19zaXplLCAwKTsKLQkJI2Vsc2UKLQkJCW5ld21hcCA9IG1yZW1hcChzZWxmLT5kYXRhLCBzZWxmLT5zaXplLCBuZXdfc2l6ZSwgMCk7Ci0JCSNlbmRpZiAvKiBfX05ldEJTRF9fICovCisgICAgICAgICNpZiBkZWZpbmVkKF9fTmV0QlNEX18pCisgICAgICAgICAgICBuZXdtYXAgPSBtcmVtYXAoc2VsZi0+ZGF0YSwgc2VsZi0+c2l6ZSwgc2VsZi0+ZGF0YSwgbmV3X3NpemUsIDApOworICAgICAgICAjZWxzZQorICAgICAgICAgICAgbmV3bWFwID0gbXJlbWFwKHNlbGYtPmRhdGEsIHNlbGYtPnNpemUsIG5ld19zaXplLCAwKTsKKyAgICAgICAgI2VuZGlmIC8qIF9fTmV0QlNEX18gKi8KICNlbmRpZgotCQlpZiAobmV3bWFwID09ICh2b2lkICopLTEpCi0JCXsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzZWxmLT5kYXRhID0gbmV3bWFwOwotCQlzZWxmLT5zaXplID0gbmV3X3NpemU7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7CisgICAgICAgIGlmIChuZXdtYXAgPT0gKHZvaWQgKiktMSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmRhdGEgPSBuZXdtYXA7CisgICAgICAgIHNlbGYtPnNpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKICNlbmRpZiAvKiBIQVZFX01SRU1BUCAqLwogI2VuZGlmIC8qIFVOSVggKi8KLQl9CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF90ZWxsX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNpemVfdChzZWxmLT5wb3MpOworICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIHJldHVybiBQeUludF9Gcm9tU2l6ZV90KHNlbGYtPnBvcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX2ZsdXNoX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBvZmZzZXQgPSAwOwotCVB5X3NzaXplX3Qgc2l6ZSA9IHNlbGYtPnNpemU7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bm46Zmx1c2giLCAmb2Zmc2V0LCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoc2l6ZV90KShvZmZzZXQgKyBzaXplKSA+IHNlbGYtPnNpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmbHVzaCB2YWx1ZXMgb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9zc2l6ZV90IG9mZnNldCA9IDA7CisgICAgUHlfc3NpemVfdCBzaXplID0gc2VsZi0+c2l6ZTsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxubjpmbHVzaCIsICZvZmZzZXQsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChzaXplX3QpKG9mZnNldCArIHNpemUpID4gc2VsZi0+c2l6ZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZsdXNoIHZhbHVlcyBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2lmZGVmIE1TX1dJTkRPV1MKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEZsdXNoVmlld09mRmlsZShzZWxmLT5kYXRhK29mZnNldCwgc2l6ZSkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgRmx1c2hWaWV3T2ZGaWxlKHNlbGYtPmRhdGErb2Zmc2V0LCBzaXplKSk7CiAjZWxpZiBkZWZpbmVkKFVOSVgpCi0JLyogWFhYIHNlbWFudGljcyBvZiByZXR1cm4gdmFsdWU/ICovCi0JLyogWFhYIGZsYWdzIGZvciBtc3luYz8gKi8KLQlpZiAoLTEgPT0gbXN5bmMoc2VsZi0+ZGF0YSArIG9mZnNldCwgc2l6ZSwgTVNfU1lOQykpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKKyAgICAvKiBYWFggc2VtYW50aWNzIG9mIHJldHVybiB2YWx1ZT8gKi8KKyAgICAvKiBYWFggZmxhZ3MgZm9yIG1zeW5jPyAqLworICAgIGlmICgtMSA9PSBtc3luYyhzZWxmLT5kYXRhICsgb2Zmc2V0LCBzaXplLCBNU19TWU5DKSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOwogI2Vsc2UKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZsdXNoIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW0iKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZsdXNoIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW0iKTsKKyAgICByZXR1cm4gTlVMTDsKICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9zZWVrX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBkaXN0OwotCWludCBob3c9MDsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58aTpzZWVrIiwgJmRpc3QsICZob3cpKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlIHsKLQkJc2l6ZV90IHdoZXJlOwotCQlzd2l0Y2ggKGhvdykgewotCQljYXNlIDA6IC8qIHJlbGF0aXZlIHRvIHN0YXJ0ICovCi0JCQlpZiAoZGlzdCA8IDApCi0JCQkJZ290byBvbm91dG9mcmFuZ2U7Ci0JCQl3aGVyZSA9IGRpc3Q7Ci0JCQlicmVhazsKLQkJY2FzZSAxOiAvKiByZWxhdGl2ZSB0byBjdXJyZW50IHBvc2l0aW9uICovCi0JCQlpZiAoKFB5X3NzaXplX3Qpc2VsZi0+cG9zICsgZGlzdCA8IDApCi0JCQkJZ290byBvbm91dG9mcmFuZ2U7Ci0JCQl3aGVyZSA9IHNlbGYtPnBvcyArIGRpc3Q7Ci0JCQlicmVhazsKLQkJY2FzZSAyOiAvKiByZWxhdGl2ZSB0byBlbmQgKi8KLQkJCWlmICgoUHlfc3NpemVfdClzZWxmLT5zaXplICsgZGlzdCA8IDApCi0JCQkJZ290byBvbm91dG9mcmFuZ2U7Ci0JCQl3aGVyZSA9IHNlbGYtPnNpemUgKyBkaXN0OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInVua25vd24gc2VlayB0eXBlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAod2hlcmUgPiBzZWxmLT5zaXplKQotCQkJZ290byBvbm91dG9mcmFuZ2U7Ci0JCXNlbGYtPnBvcyA9IHdoZXJlOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICBQeV9zc2l6ZV90IGRpc3Q7CisgICAgaW50IGhvdz0wOworICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxpOnNlZWsiLCAmZGlzdCwgJmhvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UgeworICAgICAgICBzaXplX3Qgd2hlcmU7CisgICAgICAgIHN3aXRjaCAoaG93KSB7CisgICAgICAgIGNhc2UgMDogLyogcmVsYXRpdmUgdG8gc3RhcnQgKi8KKyAgICAgICAgICAgIGlmIChkaXN0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIG9ub3V0b2ZyYW5nZTsKKyAgICAgICAgICAgIHdoZXJlID0gZGlzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8qIHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICAgICAgICAgIGlmICgoUHlfc3NpemVfdClzZWxmLT5wb3MgKyBkaXN0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIG9ub3V0b2ZyYW5nZTsKKyAgICAgICAgICAgIHdoZXJlID0gc2VsZi0+cG9zICsgZGlzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IC8qIHJlbGF0aXZlIHRvIGVuZCAqLworICAgICAgICAgICAgaWYgKChQeV9zc2l6ZV90KXNlbGYtPnNpemUgKyBkaXN0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIG9ub3V0b2ZyYW5nZTsKKyAgICAgICAgICAgIHdoZXJlID0gc2VsZi0+c2l6ZSArIGRpc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidW5rbm93biBzZWVrIHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICh3aGVyZSA+IHNlbGYtPnNpemUpCisgICAgICAgICAgICBnb3RvIG9ub3V0b2ZyYW5nZTsKKyAgICAgICAgc2VsZi0+cG9zID0gd2hlcmU7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogCiAgIG9ub3V0b2ZyYW5nZToKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNlZWsgb3V0IG9mIHJhbmdlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzZWVrIG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9tb3ZlX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgbG9uZyBkZXN0LCBzcmMsIGNudDsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImtrazptb3ZlIiwgJmRlc3QsICZzcmMsICZjbnQpIHx8Ci0JICAgICFpc193cml0ZWFibGUoc2VsZikpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJLyogYm91bmRzIGNoZWNrIHRoZSB2YWx1ZXMgKi8KLQkJaWYgKGNudCA8IDAgfHwgKGNudCArIGRlc3QpIDwgY250IHx8IChjbnQgKyBzcmMpIDwgY250IHx8Ci0JCSAgIHNyYyA8IDAgfHwgc3JjID4gc2VsZi0+c2l6ZSB8fCAoc3JjICsgY250KSA+IHNlbGYtPnNpemUgfHwKLQkJICAgZGVzdCA8IDAgfHwgZGVzdCA+IHNlbGYtPnNpemUgfHwgKGRlc3QgKyBjbnQpID4gc2VsZi0+c2l6ZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInNvdXJjZSwgZGVzdGluYXRpb24sIG9yIGNvdW50IG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbWVtbW92ZShzZWxmLT5kYXRhK2Rlc3QsIHNlbGYtPmRhdGErc3JjLCBjbnQpOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICB1bnNpZ25lZCBsb25nIGRlc3QsIHNyYywgY250OworICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAia2trOm1vdmUiLCAmZGVzdCwgJnNyYywgJmNudCkgfHwKKyAgICAgICAgIWlzX3dyaXRlYWJsZShzZWxmKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBib3VuZHMgY2hlY2sgdGhlIHZhbHVlcyAqLworICAgICAgICBpZiAoY250IDwgMCB8fCAoY250ICsgZGVzdCkgPCBjbnQgfHwgKGNudCArIHNyYykgPCBjbnQgfHwKKyAgICAgICAgICAgc3JjIDwgMCB8fCBzcmMgPiBzZWxmLT5zaXplIHx8IChzcmMgKyBjbnQpID4gc2VsZi0+c2l6ZSB8fAorICAgICAgICAgICBkZXN0IDwgMCB8fCBkZXN0ID4gc2VsZi0+c2l6ZSB8fCAoZGVzdCArIGNudCkgPiBzZWxmLT5zaXplKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAic291cmNlLCBkZXN0aW5hdGlvbiwgb3IgY291bnQgb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBtZW1tb3ZlKHNlbGYtPmRhdGErZGVzdCwgc2VsZi0+ZGF0YStzcmMsIGNudCk7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG1tYXBfb2JqZWN0X21ldGhvZHNbXSA9IHsKLQl7ImNsb3NlIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX2Nsb3NlX21ldGhvZCwJTUVUSF9OT0FSR1N9LAotCXsiZmluZCIsCShQeUNGdW5jdGlvbikgbW1hcF9maW5kX21ldGhvZCwJCU1FVEhfVkFSQVJHU30sCi0JeyJyZmluZCIsCShQeUNGdW5jdGlvbikgbW1hcF9yZmluZF9tZXRob2QsCU1FVEhfVkFSQVJHU30sCi0JeyJmbHVzaCIsCShQeUNGdW5jdGlvbikgbW1hcF9mbHVzaF9tZXRob2QsCU1FVEhfVkFSQVJHU30sCi0JeyJtb3ZlIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX21vdmVfbWV0aG9kLAkJTUVUSF9WQVJBUkdTfSwKLQl7InJlYWQiLAkoUHlDRnVuY3Rpb24pIG1tYXBfcmVhZF9tZXRob2QsCQlNRVRIX1ZBUkFSR1N9LAotCXsicmVhZF9ieXRlIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX3JlYWRfYnl0ZV9tZXRob2QsICAJTUVUSF9OT0FSR1N9LAotCXsicmVhZGxpbmUiLAkoUHlDRnVuY3Rpb24pIG1tYXBfcmVhZF9saW5lX21ldGhvZCwJTUVUSF9OT0FSR1N9LAotCXsicmVzaXplIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX3Jlc2l6ZV9tZXRob2QsCU1FVEhfVkFSQVJHU30sCi0JeyJzZWVrIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX3NlZWtfbWV0aG9kLAkJTUVUSF9WQVJBUkdTfSwKLQl7InNpemUiLAkoUHlDRnVuY3Rpb24pIG1tYXBfc2l6ZV9tZXRob2QsCQlNRVRIX05PQVJHU30sCi0JeyJ0ZWxsIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX3RlbGxfbWV0aG9kLAkJTUVUSF9OT0FSR1N9LAotCXsid3JpdGUiLAkoUHlDRnVuY3Rpb24pIG1tYXBfd3JpdGVfbWV0aG9kLAlNRVRIX1ZBUkFSR1N9LAotCXsid3JpdGVfYnl0ZSIsCShQeUNGdW5jdGlvbikgbW1hcF93cml0ZV9ieXRlX21ldGhvZCwJTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJICAgTlVMTH0gICAgICAgLyogc2VudGluZWwgKi8KKyAgICB7ImNsb3NlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9jbG9zZV9tZXRob2QsICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJmaW5kIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pIG1tYXBfZmluZF9tZXRob2QsICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InJmaW5kIiwgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9yZmluZF9tZXRob2QsICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZmx1c2giLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX2ZsdXNoX21ldGhvZCwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJtb3ZlIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pIG1tYXBfbW92ZV9tZXRob2QsICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InJlYWQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9yZWFkX21ldGhvZCwgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicmVhZF9ieXRlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX3JlYWRfYnl0ZV9tZXRob2QsICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InJlYWRsaW5lIiwgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9yZWFkX2xpbmVfbWV0aG9kLCAgICBNRVRIX05PQVJHU30sCisgICAgeyJyZXNpemUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pIG1tYXBfcmVzaXplX21ldGhvZCwgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNlZWsiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9zZWVrX21ldGhvZCwgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2l6ZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX3NpemVfbWV0aG9kLCAgICAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InRlbGwiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF90ZWxsX21ldGhvZCwgICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJ3cml0ZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pIG1tYXBfd3JpdGVfbWV0aG9kLCAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7IndyaXRlX2J5dGUiLCAgICAgIChQeUNGdW5jdGlvbikgbW1hcF93cml0ZV9ieXRlX21ldGhvZCwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgIE5VTEx9ICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBGdW5jdGlvbnMgZm9yIHRyZWF0aW5nIGFuIG1tYXAnZWQgZmlsZSBhcyBhIGJ1ZmZlciAqLwpAQCAtNjYzLDMzNyArNjYzLDMzNyBAQAogc3RhdGljIFB5X3NzaXplX3QKIG1tYXBfYnVmZmVyX2dldHJlYWRidWYobW1hcF9vYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IHZvaWQgKipwdHIpCiB7Ci0JQ0hFQ0tfVkFMSUQoLTEpOwotCWlmIChpbmRleCAhPSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiQWNjZXNzaW5nIG5vbi1leGlzdGVudCBtbWFwIHNlZ21lbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcHRyID0gc2VsZi0+ZGF0YTsKLQlyZXR1cm4gc2VsZi0+c2l6ZTsKKyAgICBDSEVDS19WQUxJRCgtMSk7CisgICAgaWYgKGluZGV4ICE9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFjY2Vzc2luZyBub24tZXhpc3RlbnQgbW1hcCBzZWdtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnB0ciA9IHNlbGYtPmRhdGE7CisgICAgcmV0dXJuIHNlbGYtPnNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBtbWFwX2J1ZmZlcl9nZXR3cml0ZWJ1ZihtbWFwX29iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgY29uc3Qgdm9pZCAqKnB0cikKIHsKLQlDSEVDS19WQUxJRCgtMSk7Ci0JaWYgKGluZGV4ICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJBY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IG1tYXAgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQotCQlyZXR1cm4gLTE7Ci0JKnB0ciA9IHNlbGYtPmRhdGE7Ci0JcmV0dXJuIHNlbGYtPnNpemU7CisgICAgQ0hFQ0tfVkFMSUQoLTEpOworICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IG1tYXAgc2VnbWVudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnB0ciA9IHNlbGYtPmRhdGE7CisgICAgcmV0dXJuIHNlbGYtPnNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBtbWFwX2J1ZmZlcl9nZXRzZWdjb3VudChtbWFwX29iamVjdCAqc2VsZiwgUHlfc3NpemVfdCAqbGVucCkKIHsKLQlDSEVDS19WQUxJRCgtMSk7Ci0JaWYgKGxlbnApCi0JCSpsZW5wID0gc2VsZi0+c2l6ZTsKLQlyZXR1cm4gMTsKKyAgICBDSEVDS19WQUxJRCgtMSk7CisgICAgaWYgKGxlbnApCisgICAgICAgICpsZW5wID0gc2VsZi0+c2l6ZTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIG1tYXBfYnVmZmVyX2dldGNoYXJidWZmZXIobW1hcF9vYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IHZvaWQgKipwdHIpCiB7Ci0JaWYgKGluZGV4ICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGJ1ZmZlciBzZWdtZW50Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JKnB0ciA9IChjb25zdCBjaGFyICopc2VsZi0+ZGF0YTsKLQlyZXR1cm4gc2VsZi0+c2l6ZTsKKyAgICBpZiAoaW5kZXggIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzaW5nIG5vbi1leGlzdGVudCBidWZmZXIgc2VnbWVudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpwdHIgPSAoY29uc3QgY2hhciAqKXNlbGYtPmRhdGE7CisgICAgcmV0dXJuIHNlbGYtPnNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBtbWFwX2xlbmd0aChtbWFwX29iamVjdCAqc2VsZikKIHsKLQlDSEVDS19WQUxJRCgtMSk7Ci0JcmV0dXJuIHNlbGYtPnNpemU7CisgICAgQ0hFQ0tfVkFMSUQoLTEpOworICAgIHJldHVybiBzZWxmLT5zaXplOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9pdGVtKG1tYXBfb2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGkpCiB7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgaSwgMSk7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgaSwgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3NsaWNlKG1tYXBfb2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gpCiB7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQllbHNlIGlmICgoc2l6ZV90KWlsb3cgPiBzZWxmLT5zaXplKQotCQlpbG93ID0gc2VsZi0+c2l6ZTsKLQlpZiAoaWhpZ2ggPCAwKQotCQlpaGlnaCA9IDA7Ci0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWVsc2UgaWYgKChzaXplX3QpaWhpZ2ggPiBzZWxmLT5zaXplKQotCQlpaGlnaCA9IHNlbGYtPnNpemU7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKGlsb3cgPCAwKQorICAgICAgICBpbG93ID0gMDsKKyAgICBlbHNlIGlmICgoc2l6ZV90KWlsb3cgPiBzZWxmLT5zaXplKQorICAgICAgICBpbG93ID0gc2VsZi0+c2l6ZTsKKyAgICBpZiAoaWhpZ2ggPCAwKQorICAgICAgICBpaGlnaCA9IDA7CisgICAgaWYgKGloaWdoIDwgaWxvdykKKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgIGVsc2UgaWYgKChzaXplX3QpaWhpZ2ggPiBzZWxmLT5zaXplKQorICAgICAgICBpaGlnaCA9IHNlbGYtPnNpemU7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+ZGF0YSArIGlsb3csIGloaWdoLWlsb3cpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgaWxvdywgaWhpZ2gtaWxvdyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3N1YnNjcmlwdChtbWFwX29iamVjdCAqc2VsZiwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gc2VsZi0+c2l6ZTsKLQkJaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgaSwgMSk7Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW47CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gc2VsZi0+c2l6ZTsKKyAgICAgICAgaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgaSwgMSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW47CiAKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwgc2VsZi0+c2l6ZSwKLQkJCQkgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkKLQkJaWYgKHNsaWNlbGVuIDw9IDApCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOwotCQllbHNlIGlmIChzdGVwID09IDEpCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+ZGF0YSArIHN0YXJ0LAotCQkJCQkJCSAgc2xpY2VsZW4pOwotCQllbHNlIHsKLQkJCWNoYXIgKnJlc3VsdF9idWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhzbGljZWxlbik7Ci0JCQlQeV9zc2l6ZV90IGN1ciwgaTsKLQkJCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sIHNlbGYtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCQlpZiAocmVzdWx0X2J1ZiA9PSBOVUxMKQotCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJICAgICAJcmVzdWx0X2J1ZltpXSA9IHNlbGYtPmRhdGFbY3VyXTsKLQkJCX0KLQkJCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlc3VsdF9idWYsCi0JCQkJCQkJICAgIHNsaWNlbGVuKTsKLQkJCVB5TWVtX0ZyZWUocmVzdWx0X2J1Zik7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJtbWFwIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIGlmIChzbGljZWxlbiA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCIiLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoc3RlcCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmRhdGEgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciAqcmVzdWx0X2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKHNsaWNlbGVuKTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgY3VyLCBpOworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgICAgICAgICAgaWYgKHJlc3VsdF9idWYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICByZXN1bHRfYnVmW2ldID0gc2VsZi0+ZGF0YVtjdXJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzdWx0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlbGVuKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUocmVzdWx0X2J1Zik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXAgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfY29uY2F0KG1tYXBfb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYmIpCiB7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJIm1tYXBzIGRvbid0IHN1cHBvcnQgY29uY2F0ZW5hdGlvbiIpOwotCXJldHVybiBOVUxMOworICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIm1tYXBzIGRvbid0IHN1cHBvcnQgY29uY2F0ZW5hdGlvbiIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9yZXBlYXQobW1hcF9vYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgbikKIHsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkibW1hcHMgZG9uJ3Qgc3VwcG9ydCByZXBlYXQgb3BlcmF0aW9uIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAibW1hcHMgZG9uJ3Qgc3VwcG9ydCByZXBlYXQgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIG1tYXBfYXNzX3NsaWNlKG1tYXBfb2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gsIFB5T2JqZWN0ICp2KQogewotCWNvbnN0IGNoYXIgKmJ1ZjsKKyAgICBjb25zdCBjaGFyICpidWY7CiAKLQlDSEVDS19WQUxJRCgtMSk7Ci0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQllbHNlIGlmICgoc2l6ZV90KWlsb3cgPiBzZWxmLT5zaXplKQotCQlpbG93ID0gc2VsZi0+c2l6ZTsKLQlpZiAoaWhpZ2ggPCAwKQotCQlpaGlnaCA9IDA7Ci0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWVsc2UgaWYgKChzaXplX3QpaWhpZ2ggPiBzZWxmLT5zaXplKQotCQlpaGlnaCA9IHNlbGYtPnNpemU7CisgICAgQ0hFQ0tfVkFMSUQoLTEpOworICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgZWxzZSBpZiAoKHNpemVfdClpbG93ID4gc2VsZi0+c2l6ZSkKKyAgICAgICAgaWxvdyA9IHNlbGYtPnNpemU7CisgICAgaWYgKGloaWdoIDwgMCkKKyAgICAgICAgaWhpZ2ggPSAwOworICAgIGlmIChpaGlnaCA8IGlsb3cpCisgICAgICAgIGloaWdoID0gaWxvdzsKKyAgICBlbHNlIGlmICgoc2l6ZV90KWloaWdoID4gc2VsZi0+c2l6ZSkKKyAgICAgICAgaWhpZ2ggPSBzZWxmLT5zaXplOwogCi0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJtbWFwIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgZGVsZXRpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoISAoUHlTdHJpbmdfQ2hlY2sodikpICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibW1hcCBzbGljZSBhc3NpZ25tZW50IG11c3QgYmUgYSBzdHJpbmciKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlTdHJpbmdfU2l6ZSh2KSAhPSAoaWhpZ2ggLSBpbG93KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibW1hcCBzbGljZSBhc3NpZ25tZW50IGlzIHdyb25nIHNpemUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKLQkJcmV0dXJuIC0xOwotCWJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCW1lbWNweShzZWxmLT5kYXRhICsgaWxvdywgYnVmLCBpaGlnaC1pbG93KTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBvYmplY3QgZG9lc24ndCBzdXBwb3J0IHNsaWNlIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEgKFB5U3RyaW5nX0NoZWNrKHYpKSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBzbGljZSBhc3NpZ25tZW50IG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoUHlTdHJpbmdfU2l6ZSh2KSAhPSAoaWhpZ2ggLSBpbG93KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIHNsaWNlIGFzc2lnbm1lbnQgaXMgd3Jvbmcgc2l6ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgbWVtY3B5KHNlbGYtPmRhdGEgKyBpbG93LCBidWYsIGloaWdoLWlsb3cpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBtbWFwX2Fzc19pdGVtKG1tYXBfb2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCWNvbnN0IGNoYXIgKmJ1ZjsKKyAgICBjb25zdCBjaGFyICpidWY7CiAKLQlDSEVDS19WQUxJRCgtMSk7Ci0JaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCEgKFB5U3RyaW5nX0NoZWNrKHYpICYmIFB5U3RyaW5nX1NpemUodik9PTEpICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibW1hcCBhc3NpZ25tZW50IG11c3QgYmUgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmciKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKLQkJcmV0dXJuIC0xOwotCWJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCXNlbGYtPmRhdGFbaV0gPSBidWZbMF07Ci0JcmV0dXJuIDA7CisgICAgQ0hFQ0tfVkFMSUQoLTEpOworICAgIGlmIChpIDwgMCB8fCAoc2l6ZV90KWkgPj0gc2VsZi0+c2l6ZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgIm1tYXAgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEgKFB5U3RyaW5nX0NoZWNrKHYpICYmIFB5U3RyaW5nX1NpemUodik9PTEpICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIGFzc2lnbm1lbnQgbXVzdCBiZSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgc2VsZi0+ZGF0YVtpXSA9IGJ1ZlswXTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbW1hcF9hc3Nfc3Vic2NyaXB0KG1tYXBfb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaXRlbSwgUHlPYmplY3QgKnZhbHVlKQogewotCUNIRUNLX1ZBTElEKC0xKTsKKyAgICBDSEVDS19WQUxJRCgtMSk7CiAKLQlpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCWNvbnN0IGNoYXIgKmJ1ZjsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZjsKIAotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoaSA8IDApCi0JCQlpICs9IHNlbGYtPnNpemU7Ci0JCWlmIChpIDwgMCB8fCAoc2l6ZV90KWkgPj0gc2VsZi0+c2l6ZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJIm1tYXAgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkgfHwgUHlTdHJpbmdfU2l6ZSh2YWx1ZSkgIT0gMSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCSAgICAgICAgICAibW1hcCBhc3NpZ25tZW50IG11c3QgYmUgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmciKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKLQkJCXJldHVybiAtMTsKLQkJYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpOwotCQlzZWxmLT5kYXRhW2ldID0gYnVmWzBdOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbjsKLQkJCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCi0JCQkJCSBzZWxmLT5zaXplLCAmc3RhcnQsICZzdG9wLAotCQkJCQkgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBkZWxldGlvbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibW1hcCBzbGljZSBhc3NpZ25tZW50IG11c3QgYmUgYSBzdHJpbmciKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoUHlTdHJpbmdfU2l6ZSh2YWx1ZSkgIT0gc2xpY2VsZW4pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJtbWFwIHNsaWNlIGFzc2lnbm1lbnQgaXMgd3Jvbmcgc2l6ZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IHNlbGYtPnNpemU7CisgICAgICAgIGlmIChpIDwgMCB8fCAoc2l6ZV90KWkgPj0gc2VsZi0+c2l6ZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgIm1tYXAgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkgfHwgUHlTdHJpbmdfU2l6ZSh2YWx1ZSkgIT0gMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICJtbWFwIGFzc2lnbm1lbnQgbXVzdCBiZSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBidWYgPSBQeVN0cmluZ19Bc1N0cmluZyh2YWx1ZSk7CisgICAgICAgIHNlbGYtPmRhdGFbaV0gPSBidWZbMF07CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuOwogCi0JCWlmIChzbGljZWxlbiA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKHN0ZXAgPT0gMSkgewotCQkJY29uc3QgY2hhciAqYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpOworICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QgKilpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c2l6ZSwgJnN0YXJ0LCAmc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGVwLCAmc2xpY2VsZW4pIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJtbWFwIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgZGVsZXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgIm1tYXAgc2xpY2UgYXNzaWdubWVudCBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5U3RyaW5nX1NpemUodmFsdWUpICE9IHNsaWNlbGVuKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAibW1hcCBzbGljZSBhc3NpZ25tZW50IGlzIHdyb25nIHNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCW1lbWNweShzZWxmLT5kYXRhICsgc3RhcnQsIGJ1Ziwgc2xpY2VsZW4pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeV9zc2l6ZV90IGN1ciwgaTsKLQkJCWNvbnN0IGNoYXIgKmJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKLQkJCQotCQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47Ci0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlzZWxmLT5kYXRhW2N1cl0gPSBidWZbaV07Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibW1hcCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlciIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICBpZiAoc2xpY2VsZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKKworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIG1lbWNweShzZWxmLT5kYXRhICsgc3RhcnQsIGJ1Ziwgc2xpY2VsZW4pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGN1ciwgaTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKKworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5kYXRhW2N1cl0gPSBidWZbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBtbWFwX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKW1tYXBfbGVuZ3RoLAkJICAgICAgIC8qc3FfbGVuZ3RoKi8KLQkoYmluYXJ5ZnVuYyltbWFwX2NvbmNhdCwJICAgICAgIC8qc3FfY29uY2F0Ki8KLQkoc3NpemVhcmdmdW5jKW1tYXBfcmVwZWF0LAkgICAgICAgLypzcV9yZXBlYXQqLwotCShzc2l6ZWFyZ2Z1bmMpbW1hcF9pdGVtLAkJICAgICAgIC8qc3FfaXRlbSovCi0JKHNzaXplc3NpemVhcmdmdW5jKW1tYXBfc2xpY2UsCSAgICAgICAvKnNxX3NsaWNlKi8KLQkoc3NpemVvYmphcmdwcm9jKW1tYXBfYXNzX2l0ZW0sCSAgICAgICAvKnNxX2Fzc19pdGVtKi8KLQkoc3NpemVzc2l6ZW9iamFyZ3Byb2MpbW1hcF9hc3Nfc2xpY2UsICAgICAgLypzcV9hc3Nfc2xpY2UqLworICAgIChsZW5mdW5jKW1tYXBfbGVuZ3RoLCAgICAgICAgICAgICAgICAgICAgICAvKnNxX2xlbmd0aCovCisgICAgKGJpbmFyeWZ1bmMpbW1hcF9jb25jYXQsICAgICAgICAgICAgICAgICAgIC8qc3FfY29uY2F0Ki8KKyAgICAoc3NpemVhcmdmdW5jKW1tYXBfcmVwZWF0LCAgICAgICAgICAgICAgICAgLypzcV9yZXBlYXQqLworICAgIChzc2l6ZWFyZ2Z1bmMpbW1hcF9pdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qc3FfaXRlbSovCisgICAgKHNzaXplc3NpemVhcmdmdW5jKW1tYXBfc2xpY2UsICAgICAgICAgICAgIC8qc3Ffc2xpY2UqLworICAgIChzc2l6ZW9iamFyZ3Byb2MpbW1hcF9hc3NfaXRlbSwgICAgICAgICAgICAvKnNxX2Fzc19pdGVtKi8KKyAgICAoc3NpemVzc2l6ZW9iamFyZ3Byb2MpbW1hcF9hc3Nfc2xpY2UsICAgICAgLypzcV9hc3Nfc2xpY2UqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgbW1hcF9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKW1tYXBfbGVuZ3RoLAotCShiaW5hcnlmdW5jKW1tYXBfc3Vic2NyaXB0LAotCShvYmpvYmphcmdwcm9jKW1tYXBfYXNzX3N1YnNjcmlwdCwKKyAgICAobGVuZnVuYyltbWFwX2xlbmd0aCwKKyAgICAoYmluYXJ5ZnVuYyltbWFwX3N1YnNjcmlwdCwKKyAgICAob2Jqb2JqYXJncHJvYyltbWFwX2Fzc19zdWJzY3JpcHQsCiB9OwogCiBzdGF0aWMgUHlCdWZmZXJQcm9jcyBtbWFwX2FzX2J1ZmZlciA9IHsKLQkocmVhZGJ1ZmZlcnByb2MpbW1hcF9idWZmZXJfZ2V0cmVhZGJ1ZiwKLQkod3JpdGVidWZmZXJwcm9jKW1tYXBfYnVmZmVyX2dldHdyaXRlYnVmLAotCShzZWdjb3VudHByb2MpbW1hcF9idWZmZXJfZ2V0c2VnY291bnQsCi0JKGNoYXJidWZmZXJwcm9jKW1tYXBfYnVmZmVyX2dldGNoYXJidWZmZXIsCisgICAgKHJlYWRidWZmZXJwcm9jKW1tYXBfYnVmZmVyX2dldHJlYWRidWYsCisgICAgKHdyaXRlYnVmZmVycHJvYyltbWFwX2J1ZmZlcl9nZXR3cml0ZWJ1ZiwKKyAgICAoc2VnY291bnRwcm9jKW1tYXBfYnVmZmVyX2dldHNlZ2NvdW50LAorICAgIChjaGFyYnVmZmVycHJvYyltbWFwX2J1ZmZlcl9nZXRjaGFyYnVmZmVyLAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEwMjQsNDYgKzEwMjQsNDYgQEAKIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IG1tYXBfb2JqZWN0X3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIm1tYXAubW1hcCIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YobW1hcF9vYmplY3QpLAkJCS8qIHRwX3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIG1tYXBfb2JqZWN0X2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmbW1hcF9hc19zZXF1ZW5jZSwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkmbW1hcF9hc19tYXBwaW5nLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkJCS8qdHBfaGFzaCovCi0JMCwJCQkJCS8qdHBfY2FsbCovCi0JMCwJCQkJCS8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qdHBfZ2V0YXR0cm8qLwotCTAsCQkJCQkvKnRwX3NldGF0dHJvKi8KLQkmbW1hcF9hc19idWZmZXIsCQkJLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUiwJCS8qdHBfZmxhZ3MqLwotCW1tYXBfZG9jLAkJCQkvKnRwX2RvYyovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KLQkwLAkJICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLQltbWFwX29iamVjdF9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCW5ld19tbWFwX29iamVjdCwJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJtbWFwLm1tYXAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihtbWFwX29iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIG1tYXBfb2JqZWN0X2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJm1tYXBfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAmbW1hcF9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgJm1tYXBfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSLCAgICAgICAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICBtbWFwX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIG1tYXBfb2JqZWN0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIG5ld19tbWFwX29iamVjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMTA3NCwyMyArMTA3NCwyMyBAQAogc3RhdGljIFB5X3NzaXplX3QKIF9HZXRNYXBTaXplKFB5T2JqZWN0ICpvLCBjb25zdCBjaGFyKiBwYXJhbSkKIHsKLQlpZiAobyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlpZiAoUHlJbmRleF9DaGVjayhvKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QobywgUHlFeGNfT3ZlcmZsb3dFcnJvcik7Ci0JCWlmIChpPT0tMSAmJiBQeUVycl9PY2N1cnJlZCgpKSAKLQkJCXJldHVybiAtMTsKLQkJaWYgKGkgPCAwKSB7CSAKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkibWVtb3J5IG1hcHBlZCAlcyBtdXN0IGJlIHBvc2l0aXZlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQorICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChQeUluZGV4X0NoZWNrKG8pKSB7CisgICAgICAgIFB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChvLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKKyAgICAgICAgaWYgKGk9PS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSBtYXBwZWQgJXMgbXVzdCBiZSBwb3NpdGl2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpOworICAgIH0KIAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtYXAgc2l6ZSBtdXN0IGJlIGFuIGludGVncmFsIHZhbHVlIik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtYXAgc2l6ZSBtdXN0IGJlIGFuIGludGVncmFsIHZhbHVlIik7CisgICAgcmV0dXJuIC0xOwogfQogCiAjaWZkZWYgVU5JWApAQCAtMTA5OCwxMjQgKzEwOTgsMTI0IEBACiBuZXdfbW1hcF9vYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZGljdCkKIHsKICNpZmRlZiBIQVZFX0ZTVEFUCi0Jc3RydWN0IHN0YXQgc3Q7CisgICAgc3RydWN0IHN0YXQgc3Q7CiAjZW5kaWYKLQltbWFwX29iamVjdCAqbV9vYmo7Ci0JUHlPYmplY3QgKm1hcF9zaXplX29iaiA9IE5VTEwsICpvZmZzZXRfb2JqID0gTlVMTDsKLQlQeV9zc2l6ZV90IG1hcF9zaXplLCBvZmZzZXQ7Ci0JaW50IGZkLCBmbGFncyA9IE1BUF9TSEFSRUQsIHByb3QgPSBQUk9UX1dSSVRFIHwgUFJPVF9SRUFEOwotCWludCBkZXZ6ZXJvID0gLTE7Ci0JaW50IGFjY2VzcyA9IChpbnQpQUNDRVNTX0RFRkFVTFQ7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImZpbGVubyIsICJsZW5ndGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3MiLCAicHJvdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MiLCAib2Zmc2V0IiwgTlVMTH07CisgICAgbW1hcF9vYmplY3QgKm1fb2JqOworICAgIFB5T2JqZWN0ICptYXBfc2l6ZV9vYmogPSBOVUxMLCAqb2Zmc2V0X29iaiA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBtYXBfc2l6ZSwgb2Zmc2V0OworICAgIGludCBmZCwgZmxhZ3MgPSBNQVBfU0hBUkVELCBwcm90ID0gUFJPVF9XUklURSB8IFBST1RfUkVBRDsKKyAgICBpbnQgZGV2emVybyA9IC0xOworICAgIGludCBhY2Nlc3MgPSAoaW50KUFDQ0VTU19ERUZBVUxUOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJmaWxlbm8iLCAibGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3MiLCAicHJvdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VzcyIsICJvZmZzZXQiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGljdCwgImlPfGlpaU8iLCBrZXl3b3JkcywKLQkJCQkJICZmZCwgJm1hcF9zaXplX29iaiwgJmZsYWdzLCAmcHJvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjY2VzcywgJm9mZnNldF9vYmopKQotCQlyZXR1cm4gTlVMTDsKLQltYXBfc2l6ZSA9IF9HZXRNYXBTaXplKG1hcF9zaXplX29iaiwgInNpemUiKTsKLQlpZiAobWFwX3NpemUgPCAwKQotCQlyZXR1cm4gTlVMTDsKLSAgICAgICAgb2Zmc2V0ID0gX0dldE1hcFNpemUob2Zmc2V0X29iaiwgIm9mZnNldCIpOwotICAgICAgICBpZiAob2Zmc2V0IDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RpY3QsICJpT3xpaWlPIiwga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZkLCAmbWFwX3NpemVfb2JqLCAmZmxhZ3MsICZwcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2Nlc3MsICZvZmZzZXRfb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFwX3NpemUgPSBfR2V0TWFwU2l6ZShtYXBfc2l6ZV9vYmosICJzaXplIik7CisgICAgaWYgKG1hcF9zaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb2Zmc2V0ID0gX0dldE1hcFNpemUob2Zmc2V0X29iaiwgIm9mZnNldCIpOworICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgoYWNjZXNzICE9IChpbnQpQUNDRVNTX0RFRkFVTFQpICYmCi0JICAgICgoZmxhZ3MgIT0gTUFQX1NIQVJFRCkgfHwgKHByb3QgIT0gKFBST1RfV1JJVEUgfCBQUk9UX1JFQUQpKSkpCi0JCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgIm1tYXAgY2FuJ3Qgc3BlY2lmeSBib3RoIGFjY2VzcyBhbmQgZmxhZ3MsIHByb3QuIik7Ci0Jc3dpdGNoICgoYWNjZXNzX21vZGUpYWNjZXNzKSB7Ci0JY2FzZSBBQ0NFU1NfUkVBRDoKLQkJZmxhZ3MgPSBNQVBfU0hBUkVEOwotCQlwcm90ID0gUFJPVF9SRUFEOwotCQlicmVhazsKLQljYXNlIEFDQ0VTU19XUklURToKLQkJZmxhZ3MgPSBNQVBfU0hBUkVEOwotCQlwcm90ID0gUFJPVF9SRUFEIHwgUFJPVF9XUklURTsKLQkJYnJlYWs7Ci0JY2FzZSBBQ0NFU1NfQ09QWToKLQkJZmxhZ3MgPSBNQVBfUFJJVkFURTsKLQkJcHJvdCA9IFBST1RfUkVBRCB8IFBST1RfV1JJVEU7Ci0JCWJyZWFrOwotCWNhc2UgQUNDRVNTX0RFRkFVTFQ6Ci0JCS8qIHVzZSB0aGUgc3BlY2lmaWVkIG9yIGRlZmF1bHQgdmFsdWVzIG9mIGZsYWdzIGFuZCBwcm90ICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgIm1tYXAgaW52YWxpZCBhY2Nlc3MgcGFyYW1ldGVyLiIpOwotCX0KKyAgICBpZiAoKGFjY2VzcyAhPSAoaW50KUFDQ0VTU19ERUZBVUxUKSAmJgorICAgICAgICAoKGZsYWdzICE9IE1BUF9TSEFSRUQpIHx8IChwcm90ICE9IChQUk9UX1dSSVRFIHwgUFJPVF9SRUFEKSkpKQorICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXAgY2FuJ3Qgc3BlY2lmeSBib3RoIGFjY2VzcyBhbmQgZmxhZ3MsIHByb3QuIik7CisgICAgc3dpdGNoICgoYWNjZXNzX21vZGUpYWNjZXNzKSB7CisgICAgY2FzZSBBQ0NFU1NfUkVBRDoKKyAgICAgICAgZmxhZ3MgPSBNQVBfU0hBUkVEOworICAgICAgICBwcm90ID0gUFJPVF9SRUFEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFDQ0VTU19XUklURToKKyAgICAgICAgZmxhZ3MgPSBNQVBfU0hBUkVEOworICAgICAgICBwcm90ID0gUFJPVF9SRUFEIHwgUFJPVF9XUklURTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQ0NFU1NfQ09QWToKKyAgICAgICAgZmxhZ3MgPSBNQVBfUFJJVkFURTsKKyAgICAgICAgcHJvdCA9IFBST1RfUkVBRCB8IFBST1RfV1JJVEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUNDRVNTX0RFRkFVTFQ6CisgICAgICAgIC8qIHVzZSB0aGUgc3BlY2lmaWVkIG9yIGRlZmF1bHQgdmFsdWVzIG9mIGZsYWdzIGFuZCBwcm90ICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBpbnZhbGlkIGFjY2VzcyBwYXJhbWV0ZXIuIik7CisgICAgfQogCiAgICAgaWYgKHByb3QgPT0gUFJPVF9SRUFEKSB7Ci0gICAgICAgIGFjY2VzcyA9IEFDQ0VTU19SRUFEOworICAgIGFjY2VzcyA9IEFDQ0VTU19SRUFEOwogICAgIH0KIAogI2lmZGVmIEhBVkVfRlNUQVQKICMgIGlmZGVmIF9fVk1TCi0JLyogb24gT3BlblZNUyB3ZSBtdXN0IGVuc3VyZSB0aGF0IGFsbCBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgZmlsZSAqLwotCWlmIChmZCAhPSAtMSkgewotCSAgICAgICAgZnN5bmMoZmQpOwotCX0KKyAgICAvKiBvbiBPcGVuVk1TIHdlIG11c3QgZW5zdXJlIHRoYXQgYWxsIGJ5dGVzIGFyZSB3cml0dGVuIHRvIHRoZSBmaWxlICovCisgICAgaWYgKGZkICE9IC0xKSB7CisgICAgICAgIGZzeW5jKGZkKTsKKyAgICB9CiAjICBlbmRpZgotCWlmIChmZCAhPSAtMSAmJiBmc3RhdChmZCwgJnN0KSA9PSAwICYmIFNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKLQkJaWYgKG1hcF9zaXplID09IDApIHsKLQkJCW1hcF9zaXplID0gc3Quc3Rfc2l6ZTsKLQkJfSBlbHNlIGlmICgoc2l6ZV90KW9mZnNldCArIChzaXplX3QpbWFwX3NpemUgPiBzdC5zdF9zaXplKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIm1tYXAgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBmaWxlIHNpemUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmIChmZCAhPSAtMSAmJiBmc3RhdChmZCwgJnN0KSA9PSAwICYmIFNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKyAgICAgICAgaWYgKG1hcF9zaXplID09IDApIHsKKyAgICAgICAgICAgIG1hcF9zaXplID0gc3Quc3Rfc2l6ZTsKKyAgICAgICAgfSBlbHNlIGlmICgoc2l6ZV90KW9mZnNldCArIChzaXplX3QpbWFwX3NpemUgPiBzdC5zdF9zaXplKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGZpbGUgc2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKLQltX29iaiA9IChtbWFwX29iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChtX29iaiA9PSBOVUxMKSB7cmV0dXJuIE5VTEw7fQotCW1fb2JqLT5kYXRhID0gTlVMTDsKLQltX29iai0+c2l6ZSA9IChzaXplX3QpIG1hcF9zaXplOwotCW1fb2JqLT5wb3MgPSAoc2l6ZV90KSAwOwotICAgICAgICBtX29iai0+b2Zmc2V0ID0gb2Zmc2V0OwotCWlmIChmZCA9PSAtMSkgewotCQltX29iai0+ZmQgPSAtMTsKLQkJLyogQXNzdW1lIHRoZSBjYWxsZXIgd2FudHMgdG8gbWFwIGFub255bW91cyBtZW1vcnkuCi0JCSAgIFRoaXMgaXMgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIFdpbmRvd3MuICBtbWFwLm1tYXAoLTEsIHNpemUpCi0JCSAgIG9uIGJvdGggV2luZG93cyBhbmQgVW5peCBtYXAgYW5vbnltb3VzIG1lbW9yeS4KLQkJKi8KKyAgICBtX29iaiA9IChtbWFwX29iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChtX29iaiA9PSBOVUxMKSB7cmV0dXJuIE5VTEw7fQorICAgIG1fb2JqLT5kYXRhID0gTlVMTDsKKyAgICBtX29iai0+c2l6ZSA9IChzaXplX3QpIG1hcF9zaXplOworICAgIG1fb2JqLT5wb3MgPSAoc2l6ZV90KSAwOworICAgIG1fb2JqLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgaWYgKGZkID09IC0xKSB7CisgICAgICAgIG1fb2JqLT5mZCA9IC0xOworICAgICAgICAvKiBBc3N1bWUgdGhlIGNhbGxlciB3YW50cyB0byBtYXAgYW5vbnltb3VzIG1lbW9yeS4KKyAgICAgICAgICAgVGhpcyBpcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgV2luZG93cy4gIG1tYXAubW1hcCgtMSwgc2l6ZSkKKyAgICAgICAgICAgb24gYm90aCBXaW5kb3dzIGFuZCBVbml4IG1hcCBhbm9ueW1vdXMgbWVtb3J5LgorICAgICAgICAqLwogI2lmZGVmIE1BUF9BTk9OWU1PVVMKLQkJLyogQlNEIHdheSB0byBtYXAgYW5vbnltb3VzIG1lbW9yeSAqLwotCQlmbGFncyB8PSBNQVBfQU5PTllNT1VTOworICAgICAgICAvKiBCU0Qgd2F5IHRvIG1hcCBhbm9ueW1vdXMgbWVtb3J5ICovCisgICAgICAgIGZsYWdzIHw9IE1BUF9BTk9OWU1PVVM7CiAjZWxzZQotCQkvKiBTVlI0IG1ldGhvZCB0byBtYXAgYW5vbnltb3VzIG1lbW9yeSBpcyB0byBvcGVuIC9kZXYvemVybyAqLwotCQlmZCA9IGRldnplcm8gPSBvcGVuKCIvZGV2L3plcm8iLCBPX1JEV1IpOwotCQlpZiAoZGV2emVybyA9PSAtMSkgewotCQkJUHlfREVDUkVGKG1fb2JqKTsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICAvKiBTVlI0IG1ldGhvZCB0byBtYXAgYW5vbnltb3VzIG1lbW9yeSBpcyB0byBvcGVuIC9kZXYvemVybyAqLworICAgICAgICBmZCA9IGRldnplcm8gPSBvcGVuKCIvZGV2L3plcm8iLCBPX1JEV1IpOworICAgICAgICBpZiAoZGV2emVybyA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JfSBlbHNlIHsKLQkJbV9vYmotPmZkID0gZHVwKGZkKTsKLQkJaWYgKG1fb2JqLT5mZCA9PSAtMSkgewotCQkJUHlfREVDUkVGKG1fb2JqKTsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQkKLQltX29iai0+ZGF0YSA9IG1tYXAoTlVMTCwgbWFwX3NpemUsCi0JCQkgICBwcm90LCBmbGFncywKLQkJCSAgIGZkLCBvZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fb2JqLT5mZCA9IGR1cChmZCk7CisgICAgICAgIGlmIChtX29iai0+ZmQgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihtX29iaik7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoZGV2emVybyAhPSAtMSkgewotCQljbG9zZShkZXZ6ZXJvKTsKLQl9CisgICAgbV9vYmotPmRhdGEgPSBtbWFwKE5VTEwsIG1hcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBwcm90LCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgZmQsIG9mZnNldCk7CiAKLQlpZiAobV9vYmotPmRhdGEgPT0gKGNoYXIgKiktMSkgewotCSAgICAgICAgbV9vYmotPmRhdGEgPSBOVUxMOwotCQlQeV9ERUNSRUYobV9vYmopOwotCQlQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbV9vYmotPmFjY2VzcyA9IChhY2Nlc3NfbW9kZSlhY2Nlc3M7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW1fb2JqOworICAgIGlmIChkZXZ6ZXJvICE9IC0xKSB7CisgICAgICAgIGNsb3NlKGRldnplcm8pOworICAgIH0KKworICAgIGlmIChtX29iai0+ZGF0YSA9PSAoY2hhciAqKS0xKSB7CisgICAgICAgIG1fb2JqLT5kYXRhID0gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1fb2JqLT5hY2Nlc3MgPSAoYWNjZXNzX21vZGUpYWNjZXNzOworICAgIHJldHVybiAoUHlPYmplY3QgKiltX29iajsKIH0KICNlbmRpZiAvKiBVTklYICovCiAKQEAgLTEyMjMsMjUwICsxMjIzLDI1MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld19tbWFwX29iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkaWN0KQogewotCW1tYXBfb2JqZWN0ICptX29iajsKLQlQeU9iamVjdCAqbWFwX3NpemVfb2JqID0gTlVMTCwgKm9mZnNldF9vYmogPSBOVUxMOwotCVB5X3NzaXplX3QgbWFwX3NpemUsIG9mZnNldDsKLQlEV09SRCBvZmZfaGk7CS8qIHVwcGVyIDMyIGJpdHMgb2Ygb2Zmc2V0ICovCi0JRFdPUkQgb2ZmX2xvOwkvKiBsb3dlciAzMiBiaXRzIG9mIG9mZnNldCAqLwotCURXT1JEIHNpemVfaGk7CS8qIHVwcGVyIDMyIGJpdHMgb2Ygc2l6ZSAqLwotCURXT1JEIHNpemVfbG87CS8qIGxvd2VyIDMyIGJpdHMgb2Ygc2l6ZSAqLwotCWNoYXIgKnRhZ25hbWUgPSAiIjsKLQlEV09SRCBkd0VyciA9IDA7Ci0JaW50IGZpbGVubzsKLQlIQU5ETEUgZmggPSAwOwotCWludCBhY2Nlc3MgPSAoYWNjZXNzX21vZGUpQUNDRVNTX0RFRkFVTFQ7Ci0JRFdPUkQgZmxQcm90ZWN0LCBkd0Rlc2lyZWRBY2Nlc3M7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ICJmaWxlbm8iLCAibGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWduYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MiLCAib2Zmc2V0IiwgTlVMTCB9OworICAgIG1tYXBfb2JqZWN0ICptX29iajsKKyAgICBQeU9iamVjdCAqbWFwX3NpemVfb2JqID0gTlVMTCwgKm9mZnNldF9vYmogPSBOVUxMOworICAgIFB5X3NzaXplX3QgbWFwX3NpemUsIG9mZnNldDsKKyAgICBEV09SRCBvZmZfaGk7ICAgICAgIC8qIHVwcGVyIDMyIGJpdHMgb2Ygb2Zmc2V0ICovCisgICAgRFdPUkQgb2ZmX2xvOyAgICAgICAvKiBsb3dlciAzMiBiaXRzIG9mIG9mZnNldCAqLworICAgIERXT1JEIHNpemVfaGk7ICAgICAgLyogdXBwZXIgMzIgYml0cyBvZiBzaXplICovCisgICAgRFdPUkQgc2l6ZV9sbzsgICAgICAvKiBsb3dlciAzMiBiaXRzIG9mIHNpemUgKi8KKyAgICBjaGFyICp0YWduYW1lID0gIiI7CisgICAgRFdPUkQgZHdFcnIgPSAwOworICAgIGludCBmaWxlbm87CisgICAgSEFORExFIGZoID0gMDsKKyAgICBpbnQgYWNjZXNzID0gKGFjY2Vzc19tb2RlKUFDQ0VTU19ERUZBVUxUOworICAgIERXT1JEIGZsUHJvdGVjdCwgZHdEZXNpcmVkQWNjZXNzOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyAiZmlsZW5vIiwgImxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWduYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VzcyIsICJvZmZzZXQiLCBOVUxMIH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RpY3QsICJpT3x6aU8iLCBrZXl3b3JkcywKLQkJCQkJICZmaWxlbm8sICZtYXBfc2l6ZV9vYmosCi0JCQkJCSAmdGFnbmFtZSwgJmFjY2VzcywgJm9mZnNldF9vYmopKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RpY3QsICJpT3x6aU8iLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZW5vLCAmbWFwX3NpemVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWduYW1lLCAmYWNjZXNzLCAmb2Zmc2V0X29iaikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3dpdGNoKChhY2Nlc3NfbW9kZSlhY2Nlc3MpIHsKLQljYXNlIEFDQ0VTU19SRUFEOgotCQlmbFByb3RlY3QgPSBQQUdFX1JFQURPTkxZOwotCQlkd0Rlc2lyZWRBY2Nlc3MgPSBGSUxFX01BUF9SRUFEOwotCQlicmVhazsKLQljYXNlIEFDQ0VTU19ERUZBVUxUOiAgY2FzZSBBQ0NFU1NfV1JJVEU6Ci0JCWZsUHJvdGVjdCA9IFBBR0VfUkVBRFdSSVRFOwotCQlkd0Rlc2lyZWRBY2Nlc3MgPSBGSUxFX01BUF9XUklURTsKLQkJYnJlYWs7Ci0JY2FzZSBBQ0NFU1NfQ09QWToKLQkJZmxQcm90ZWN0ID0gUEFHRV9XUklURUNPUFk7Ci0JCWR3RGVzaXJlZEFjY2VzcyA9IEZJTEVfTUFQX0NPUFk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgIm1tYXAgaW52YWxpZCBhY2Nlc3MgcGFyYW1ldGVyLiIpOwotCX0KKyAgICBzd2l0Y2goKGFjY2Vzc19tb2RlKWFjY2VzcykgeworICAgIGNhc2UgQUNDRVNTX1JFQUQ6CisgICAgICAgIGZsUHJvdGVjdCA9IFBBR0VfUkVBRE9OTFk7CisgICAgICAgIGR3RGVzaXJlZEFjY2VzcyA9IEZJTEVfTUFQX1JFQUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUNDRVNTX0RFRkFVTFQ6ICBjYXNlIEFDQ0VTU19XUklURToKKyAgICAgICAgZmxQcm90ZWN0ID0gUEFHRV9SRUFEV1JJVEU7CisgICAgICAgIGR3RGVzaXJlZEFjY2VzcyA9IEZJTEVfTUFQX1dSSVRFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFDQ0VTU19DT1BZOgorICAgICAgICBmbFByb3RlY3QgPSBQQUdFX1dSSVRFQ09QWTsKKyAgICAgICAgZHdEZXNpcmVkQWNjZXNzID0gRklMRV9NQVBfQ09QWTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIGludmFsaWQgYWNjZXNzIHBhcmFtZXRlci4iKTsKKyAgICB9CiAKLQltYXBfc2l6ZSA9IF9HZXRNYXBTaXplKG1hcF9zaXplX29iaiwgInNpemUiKTsKLQlpZiAobWFwX3NpemUgPCAwKQotCQlyZXR1cm4gTlVMTDsKLSAgICAgICAgb2Zmc2V0ID0gX0dldE1hcFNpemUob2Zmc2V0X29iaiwgIm9mZnNldCIpOwotICAgICAgICBpZiAob2Zmc2V0IDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtYXBfc2l6ZSA9IF9HZXRNYXBTaXplKG1hcF9zaXplX29iaiwgInNpemUiKTsKKyAgICBpZiAobWFwX3NpemUgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvZmZzZXQgPSBfR2V0TWFwU2l6ZShvZmZzZXRfb2JqLCAib2Zmc2V0Iik7CisgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogYXNzdW1lIC0xIGFuZCAwIGJvdGggbWVhbiBpbnZhbGlkIGZpbGVkZXNjcmlwdG9yCi0JICAgdG8gJ2Fub255bW91c2x5JyBtYXAgbWVtb3J5LgotCSAgIFhYWDogZmlsZW5vID09IDAgaXMgYSB2YWxpZCBmZCwgYnV0IHdhcyBhY2NlcHRlZCBwcmlvciB0byAyLjUuCi0JICAgWFhYOiBTaG91bGQgdGhpcyBjb2RlIGJlIGFkZGVkPwotCSAgIGlmIChmaWxlbm8gPT0gMCkKLQkgICAJUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkgICAiZG9uJ3QgdXNlIDAgZm9yIGFub255bW91cyBtZW1vcnkiKTsKLQkgKi8KLQlpZiAoZmlsZW5vICE9IC0xICYmIGZpbGVubyAhPSAwKSB7Ci0JCWZoID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmaWxlbm8pOwotCQlpZiAoZmg9PShIQU5ETEUpLTEpIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiBXaW45eCBhcHBlYXJzIHRvIG5lZWQgdXMgc2Vla2VkIHRvIHplcm8gKi8KLQkJbHNlZWsoZmlsZW5vLCAwLCBTRUVLX1NFVCk7Ci0JfQorICAgIC8qIGFzc3VtZSAtMSBhbmQgMCBib3RoIG1lYW4gaW52YWxpZCBmaWxlZGVzY3JpcHRvcgorICAgICAgIHRvICdhbm9ueW1vdXNseScgbWFwIG1lbW9yeS4KKyAgICAgICBYWFg6IGZpbGVubyA9PSAwIGlzIGEgdmFsaWQgZmQsIGJ1dCB3YXMgYWNjZXB0ZWQgcHJpb3IgdG8gMi41LgorICAgICAgIFhYWDogU2hvdWxkIHRoaXMgY29kZSBiZSBhZGRlZD8KKyAgICAgICBpZiAoZmlsZW5vID09IDApCisgICAgICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICJkb24ndCB1c2UgMCBmb3IgYW5vbnltb3VzIG1lbW9yeSIpOworICAgICAqLworICAgIGlmIChmaWxlbm8gIT0gLTEgJiYgZmlsZW5vICE9IDApIHsKKyAgICAgICAgZmggPSAoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZpbGVubyk7CisgICAgICAgIGlmIChmaD09KEhBTkRMRSktMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIFdpbjl4IGFwcGVhcnMgdG8gbmVlZCB1cyBzZWVrZWQgdG8gemVybyAqLworICAgICAgICBsc2VlayhmaWxlbm8sIDAsIFNFRUtfU0VUKTsKKyAgICB9CiAKLQltX29iaiA9IChtbWFwX29iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChtX29iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBTZXQgZXZlcnkgZmllbGQgdG8gYW4gaW52YWxpZCBtYXJrZXIsIHNvIHdlIGNhbiBzYWZlbHkKLQkgICBkZXN0cnVjdCB0aGUgb2JqZWN0IGluIHRoZSBmYWNlIG9mIGZhaWx1cmUgKi8KLQltX29iai0+ZGF0YSA9IE5VTEw7Ci0JbV9vYmotPmZpbGVfaGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0JbV9vYmotPm1hcF9oYW5kbGUgPSBOVUxMOwotCW1fb2JqLT50YWduYW1lID0gTlVMTDsKLQltX29iai0+b2Zmc2V0ID0gb2Zmc2V0OworICAgIG1fb2JqID0gKG1tYXBfb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKG1fb2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIFNldCBldmVyeSBmaWVsZCB0byBhbiBpbnZhbGlkIG1hcmtlciwgc28gd2UgY2FuIHNhZmVseQorICAgICAgIGRlc3RydWN0IHRoZSBvYmplY3QgaW4gdGhlIGZhY2Ugb2YgZmFpbHVyZSAqLworICAgIG1fb2JqLT5kYXRhID0gTlVMTDsKKyAgICBtX29iai0+ZmlsZV9oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICBtX29iai0+bWFwX2hhbmRsZSA9IE5VTEw7CisgICAgbV9vYmotPnRhZ25hbWUgPSBOVUxMOworICAgIG1fb2JqLT5vZmZzZXQgPSBvZmZzZXQ7CiAKLQlpZiAoZmgpIHsKLQkJLyogSXQgaXMgbmVjZXNzYXJ5IHRvIGR1cGxpY2F0ZSB0aGUgaGFuZGxlLCBzbyB0aGUKLQkJICAgUHl0aG9uIGNvZGUgY2FuIGNsb3NlIGl0IG9uIHVzICovCi0JCWlmICghRHVwbGljYXRlSGFuZGxlKAotCQkJR2V0Q3VycmVudFByb2Nlc3MoKSwgLyogc291cmNlIHByb2Nlc3MgaGFuZGxlICovCi0JCQlmaCwgLyogaGFuZGxlIHRvIGJlIGR1cGxpY2F0ZWQgKi8KLQkJCUdldEN1cnJlbnRQcm9jZXNzKCksIC8qIHRhcmdldCBwcm9jIGhhbmRsZSAqLwotCQkJKExQSEFORExFKSZtX29iai0+ZmlsZV9oYW5kbGUsIC8qIHJlc3VsdCAqLwotCQkJMCwgLyogYWNjZXNzIC0gaWdub3JlZCBkdWUgdG8gb3B0aW9ucyB2YWx1ZSAqLwotCQkJRkFMU0UsIC8qIGluaGVyaXRlZCBieSBjaGlsZCBwcm9jZXNzZXM/ICovCi0JCQlEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7IC8qIG9wdGlvbnMgKi8KLQkJCWR3RXJyID0gR2V0TGFzdEVycm9yKCk7Ci0JCQlQeV9ERUNSRUYobV9vYmopOwotCQkJUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoZHdFcnIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKCFtYXBfc2l6ZSkgewotCQkJRFdPUkQgbG93LGhpZ2g7Ci0JCQlsb3cgPSBHZXRGaWxlU2l6ZShmaCwgJmhpZ2gpOwotCQkJLyogbG93IG1pZ2h0IGp1c3QgaGFwcGVuIHRvIGhhdmUgdGhlIHZhbHVlIElOVkFMSURfRklMRV9TSVpFOwotICAgIAkJCSAgIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGxhc3QgZXJyb3IgYWxzby4gKi8KLQkJCWlmIChsb3cgPT0gSU5WQUxJRF9GSUxFX1NJWkUgJiYKLQkJCSAgICAoZHdFcnIgPSBHZXRMYXN0RXJyb3IoKSkgIT0gTk9fRVJST1IpIHsKLQkJCQlQeV9ERUNSRUYobV9vYmopOwotCQkJCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0Vycik7Ci0JCQl9CQotCQkJCSAgICAKKyAgICBpZiAoZmgpIHsKKyAgICAgICAgLyogSXQgaXMgbmVjZXNzYXJ5IHRvIGR1cGxpY2F0ZSB0aGUgaGFuZGxlLCBzbyB0aGUKKyAgICAgICAgICAgUHl0aG9uIGNvZGUgY2FuIGNsb3NlIGl0IG9uIHVzICovCisgICAgICAgIGlmICghRHVwbGljYXRlSGFuZGxlKAorICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MoKSwgLyogc291cmNlIHByb2Nlc3MgaGFuZGxlICovCisgICAgICAgICAgICBmaCwgLyogaGFuZGxlIHRvIGJlIGR1cGxpY2F0ZWQgKi8KKyAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksIC8qIHRhcmdldCBwcm9jIGhhbmRsZSAqLworICAgICAgICAgICAgKExQSEFORExFKSZtX29iai0+ZmlsZV9oYW5kbGUsIC8qIHJlc3VsdCAqLworICAgICAgICAgICAgMCwgLyogYWNjZXNzIC0gaWdub3JlZCBkdWUgdG8gb3B0aW9ucyB2YWx1ZSAqLworICAgICAgICAgICAgRkFMU0UsIC8qIGluaGVyaXRlZCBieSBjaGlsZCBwcm9jZXNzZXM/ICovCisgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7IC8qIG9wdGlvbnMgKi8KKyAgICAgICAgICAgIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBQeV9ERUNSRUYobV9vYmopOworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoZHdFcnIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtYXBfc2l6ZSkgeworICAgICAgICAgICAgRFdPUkQgbG93LGhpZ2g7CisgICAgICAgICAgICBsb3cgPSBHZXRGaWxlU2l6ZShmaCwgJmhpZ2gpOworICAgICAgICAgICAgLyogbG93IG1pZ2h0IGp1c3QgaGFwcGVuIHRvIGhhdmUgdGhlIHZhbHVlIElOVkFMSURfRklMRV9TSVpFOworICAgICAgICAgICAgICAgc28gd2UgbmVlZCB0byBjaGVjayB0aGUgbGFzdCBlcnJvciBhbHNvLiAqLworICAgICAgICAgICAgaWYgKGxvdyA9PSBJTlZBTElEX0ZJTEVfU0laRSAmJgorICAgICAgICAgICAgICAgIChkd0VyciA9IEdldExhc3RFcnJvcigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtX29iaik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGR3RXJyKTsKKyAgICAgICAgICAgIH0KKwogI2lmIFNJWkVPRl9TSVpFX1QgPiA0Ci0JCQltX29iai0+c2l6ZSA9ICgoKHNpemVfdCloaWdoKTw8MzIpICsgbG93OworICAgICAgICAgICAgbV9vYmotPnNpemUgPSAoKChzaXplX3QpaGlnaCk8PDMyKSArIGxvdzsKICNlbHNlCi0JCQlpZiAoaGlnaCkKLQkJCQkvKiBGaWxlIGlzIHRvbyBsYXJnZSB0byBtYXAgY29tcGxldGVseSAqLwotCQkJCW1fb2JqLT5zaXplID0gKHNpemVfdCktMTsKLQkJCWVsc2UKLQkJCQltX29iai0+c2l6ZSA9IGxvdzsKKyAgICAgICAgICAgIGlmIChoaWdoKQorICAgICAgICAgICAgICAgIC8qIEZpbGUgaXMgdG9vIGxhcmdlIHRvIG1hcCBjb21wbGV0ZWx5ICovCisgICAgICAgICAgICAgICAgbV9vYmotPnNpemUgPSAoc2l6ZV90KS0xOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fb2JqLT5zaXplID0gbG93OwogI2VuZGlmCi0JCX0gZWxzZSB7Ci0JCQltX29iai0+c2l6ZSA9IG1hcF9zaXplOwotCQl9Ci0JfQotCWVsc2UgewotCQltX29iai0+c2l6ZSA9IG1hcF9zaXplOwotCX0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fb2JqLT5zaXplID0gbWFwX3NpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG1fb2JqLT5zaXplID0gbWFwX3NpemU7CisgICAgfQogCi0JLyogc2V0IHRoZSBpbml0aWFsIHBvc2l0aW9uICovCi0JbV9vYmotPnBvcyA9IChzaXplX3QpIDA7CisgICAgLyogc2V0IHRoZSBpbml0aWFsIHBvc2l0aW9uICovCisgICAgbV9vYmotPnBvcyA9IChzaXplX3QpIDA7CiAKLQkvKiBzZXQgdGhlIHRhZyBuYW1lICovCi0JaWYgKHRhZ25hbWUgIT0gTlVMTCAmJiAqdGFnbmFtZSAhPSAnXDAnKSB7Ci0JCW1fb2JqLT50YWduYW1lID0gUHlNZW1fTWFsbG9jKHN0cmxlbih0YWduYW1lKSsxKTsKLQkJaWYgKG1fb2JqLT50YWduYW1lID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlQeV9ERUNSRUYobV9vYmopOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3RyY3B5KG1fb2JqLT50YWduYW1lLCB0YWduYW1lKTsKLQl9Ci0JZWxzZQotCQltX29iai0+dGFnbmFtZSA9IE5VTEw7CisgICAgLyogc2V0IHRoZSB0YWcgbmFtZSAqLworICAgIGlmICh0YWduYW1lICE9IE5VTEwgJiYgKnRhZ25hbWUgIT0gJ1wwJykgeworICAgICAgICBtX29iai0+dGFnbmFtZSA9IFB5TWVtX01hbGxvYyhzdHJsZW4odGFnbmFtZSkrMSk7CisgICAgICAgIGlmIChtX29iai0+dGFnbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0cmNweShtX29iai0+dGFnbmFtZSwgdGFnbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbV9vYmotPnRhZ25hbWUgPSBOVUxMOwogCi0JbV9vYmotPmFjY2VzcyA9IChhY2Nlc3NfbW9kZSlhY2Nlc3M7Ci0JLyogRFdPUkQgaXMgYSA0LWJ5dGUgaW50LiAgSWYgd2UncmUgb24gYSBib3ggd2hlcmUgc2l6ZV90IGNvbnN1bWVzCi0JICogbW9yZSB0aGFuIDQgYnl0ZXMsIHdlIG5lZWQgdG8gYnJlYWsgaXQgYXBhcnQuICBFbHNlIChzaXplX3QKLQkgKiBjb25zdW1lcyA0IGJ5dGVzKSwgQyBkb2Vzbid0IGRlZmluZSB3aGF0IGhhcHBlbnMgaWYgd2Ugc2hpZnQKLQkgKiByaWdodCBieSAzMiwgc28gd2UgbmVlZCBkaWZmZXJlbnQgY29kZS4KLQkgKi8KKyAgICBtX29iai0+YWNjZXNzID0gKGFjY2Vzc19tb2RlKWFjY2VzczsKKyAgICAvKiBEV09SRCBpcyBhIDQtYnl0ZSBpbnQuICBJZiB3ZSdyZSBvbiBhIGJveCB3aGVyZSBzaXplX3QgY29uc3VtZXMKKyAgICAgKiBtb3JlIHRoYW4gNCBieXRlcywgd2UgbmVlZCB0byBicmVhayBpdCBhcGFydC4gIEVsc2UgKHNpemVfdAorICAgICAqIGNvbnN1bWVzIDQgYnl0ZXMpLCBDIGRvZXNuJ3QgZGVmaW5lIHdoYXQgaGFwcGVucyBpZiB3ZSBzaGlmdAorICAgICAqIHJpZ2h0IGJ5IDMyLCBzbyB3ZSBuZWVkIGRpZmZlcmVudCBjb2RlLgorICAgICAqLwogI2lmIFNJWkVPRl9TSVpFX1QgPiA0Ci0Jc2l6ZV9oaSA9IChEV09SRCkoKG9mZnNldCArIG1fb2JqLT5zaXplKSA+PiAzMik7Ci0Jc2l6ZV9sbyA9IChEV09SRCkoKG9mZnNldCArIG1fb2JqLT5zaXplKSAmIDB4RkZGRkZGRkYpOwotCW9mZl9oaSA9IChEV09SRCkob2Zmc2V0ID4+IDMyKTsKLQlvZmZfbG8gPSAoRFdPUkQpKG9mZnNldCAmIDB4RkZGRkZGRkYpOworICAgIHNpemVfaGkgPSAoRFdPUkQpKChvZmZzZXQgKyBtX29iai0+c2l6ZSkgPj4gMzIpOworICAgIHNpemVfbG8gPSAoRFdPUkQpKChvZmZzZXQgKyBtX29iai0+c2l6ZSkgJiAweEZGRkZGRkZGKTsKKyAgICBvZmZfaGkgPSAoRFdPUkQpKG9mZnNldCA+PiAzMik7CisgICAgb2ZmX2xvID0gKERXT1JEKShvZmZzZXQgJiAweEZGRkZGRkZGKTsKICNlbHNlCi0Jc2l6ZV9oaSA9IDA7Ci0Jc2l6ZV9sbyA9IChEV09SRCkob2Zmc2V0ICsgbV9vYmotPnNpemUpOwotCW9mZl9oaSA9IDA7Ci0Jb2ZmX2xvID0gKERXT1JEKW9mZnNldDsKKyAgICBzaXplX2hpID0gMDsKKyAgICBzaXplX2xvID0gKERXT1JEKShvZmZzZXQgKyBtX29iai0+c2l6ZSk7CisgICAgb2ZmX2hpID0gMDsKKyAgICBvZmZfbG8gPSAoRFdPUkQpb2Zmc2V0OwogI2VuZGlmCi0JLyogRm9yIGZpbGVzLCBpdCB3b3VsZCBiZSBzdWZmaWNpZW50IHRvIHBhc3MgMCBhcyBzaXplLgotCSAgIEZvciBhbm9ueW1vdXMgbWFwcywgd2UgaGF2ZSB0byBwYXNzIHRoZSBzaXplIGV4cGxpY2l0bHkuICovCi0JbV9vYmotPm1hcF9oYW5kbGUgPSBDcmVhdGVGaWxlTWFwcGluZyhtX29iai0+ZmlsZV9oYW5kbGUsCi0JCQkJCSAgICAgIE5VTEwsCi0JCQkJCSAgICAgIGZsUHJvdGVjdCwKLQkJCQkJICAgICAgc2l6ZV9oaSwKLQkJCQkJICAgICAgc2l6ZV9sbywKLQkJCQkJICAgICAgbV9vYmotPnRhZ25hbWUpOwotCWlmIChtX29iai0+bWFwX2hhbmRsZSAhPSBOVUxMKSB7Ci0JCW1fb2JqLT5kYXRhID0gKGNoYXIgKikgTWFwVmlld09mRmlsZShtX29iai0+bWFwX2hhbmRsZSwKLQkJCQkJCSAgICAgZHdEZXNpcmVkQWNjZXNzLAotCQkJCQkJICAgICBvZmZfaGksCi0JCQkJCQkgICAgIG9mZl9sbywKLQkJCQkJCSAgICAgbV9vYmotPnNpemUpOwotCQlpZiAobV9vYmotPmRhdGEgIT0gTlVMTCkKLQkJCXJldHVybiAoUHlPYmplY3QgKiltX29iajsKLQkJZWxzZSB7Ci0JCQlkd0VyciA9IEdldExhc3RFcnJvcigpOwotCQkJQ2xvc2VIYW5kbGUobV9vYmotPm1hcF9oYW5kbGUpOwotCQkJbV9vYmotPm1hcF9oYW5kbGUgPSBOVUxMOwotCQl9Ci0JfSBlbHNlCi0JCWR3RXJyID0gR2V0TGFzdEVycm9yKCk7Ci0JUHlfREVDUkVGKG1fb2JqKTsKLQlQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0Vycik7Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogRm9yIGZpbGVzLCBpdCB3b3VsZCBiZSBzdWZmaWNpZW50IHRvIHBhc3MgMCBhcyBzaXplLgorICAgICAgIEZvciBhbm9ueW1vdXMgbWFwcywgd2UgaGF2ZSB0byBwYXNzIHRoZSBzaXplIGV4cGxpY2l0bHkuICovCisgICAgbV9vYmotPm1hcF9oYW5kbGUgPSBDcmVhdGVGaWxlTWFwcGluZyhtX29iai0+ZmlsZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxQcm90ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9oaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX29iai0+dGFnbmFtZSk7CisgICAgaWYgKG1fb2JqLT5tYXBfaGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgbV9vYmotPmRhdGEgPSAoY2hhciAqKSBNYXBWaWV3T2ZGaWxlKG1fb2JqLT5tYXBfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdEZXNpcmVkQWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX2hpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX2xvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9vYmotPnNpemUpOworICAgICAgICBpZiAobV9vYmotPmRhdGEgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKiltX29iajsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkd0VyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgQ2xvc2VIYW5kbGUobV9vYmotPm1hcF9oYW5kbGUpOworICAgICAgICAgICAgbV9vYmotPm1hcF9oYW5kbGUgPSBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICBQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0Vycik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiBzdGF0aWMgdm9pZAogc2V0aW50KFB5T2JqZWN0ICpkLCBjb25zdCBjaGFyICpuYW1lLCBsb25nIHZhbHVlKQogewotCVB5T2JqZWN0ICpvID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOwotCWlmIChvICYmIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIG8pID09IDApIHsKLQkJUHlfREVDUkVGKG8pOwotCX0KKyAgICBQeU9iamVjdCAqbyA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKKyAgICBpZiAobyAmJiBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCBvKSA9PSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICB9CiB9CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0bW1hcCh2b2lkKQogewotCVB5T2JqZWN0ICpkaWN0LCAqbW9kdWxlOworICAgIFB5T2JqZWN0ICpkaWN0LCAqbW9kdWxlOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmbW1hcF9vYmplY3RfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmbW1hcF9vYmplY3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQltb2R1bGUgPSBQeV9Jbml0TW9kdWxlKCJtbWFwIiwgTlVMTCk7Ci0JaWYgKG1vZHVsZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKTsKLQlpZiAoIWRpY3QpCi0JCXJldHVybjsKLQltbWFwX21vZHVsZV9lcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigibW1hcC5lcnJvciIsCi0JCVB5RXhjX0Vudmlyb25tZW50RXJyb3IgLCBOVUxMKTsKLQlpZiAobW1hcF9tb2R1bGVfZXJyb3IgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJlcnJvciIsIG1tYXBfbW9kdWxlX2Vycm9yKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAibW1hcCIsIChQeU9iamVjdCopICZtbWFwX29iamVjdF90eXBlKTsKKyAgICBtb2R1bGUgPSBQeV9Jbml0TW9kdWxlKCJtbWFwIiwgTlVMTCk7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKTsKKyAgICBpZiAoIWRpY3QpCisgICAgICAgIHJldHVybjsKKyAgICBtbWFwX21vZHVsZV9lcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigibW1hcC5lcnJvciIsCisgICAgICAgIFB5RXhjX0Vudmlyb25tZW50RXJyb3IgLCBOVUxMKTsKKyAgICBpZiAobW1hcF9tb2R1bGVfZXJyb3IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJlcnJvciIsIG1tYXBfbW9kdWxlX2Vycm9yKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAibW1hcCIsIChQeU9iamVjdCopICZtbWFwX29iamVjdF90eXBlKTsKICNpZmRlZiBQUk9UX0VYRUMKLQlzZXRpbnQoZGljdCwgIlBST1RfRVhFQyIsIFBST1RfRVhFQyk7CisgICAgc2V0aW50KGRpY3QsICJQUk9UX0VYRUMiLCBQUk9UX0VYRUMpOwogI2VuZGlmCiAjaWZkZWYgUFJPVF9SRUFECi0Jc2V0aW50KGRpY3QsICJQUk9UX1JFQUQiLCBQUk9UX1JFQUQpOworICAgIHNldGludChkaWN0LCAiUFJPVF9SRUFEIiwgUFJPVF9SRUFEKTsKICNlbmRpZgogI2lmZGVmIFBST1RfV1JJVEUKLQlzZXRpbnQoZGljdCwgIlBST1RfV1JJVEUiLCBQUk9UX1dSSVRFKTsKKyAgICBzZXRpbnQoZGljdCwgIlBST1RfV1JJVEUiLCBQUk9UX1dSSVRFKTsKICNlbmRpZgogCiAjaWZkZWYgTUFQX1NIQVJFRAotCXNldGludChkaWN0LCAiTUFQX1NIQVJFRCIsIE1BUF9TSEFSRUQpOworICAgIHNldGludChkaWN0LCAiTUFQX1NIQVJFRCIsIE1BUF9TSEFSRUQpOwogI2VuZGlmCiAjaWZkZWYgTUFQX1BSSVZBVEUKLQlzZXRpbnQoZGljdCwgIk1BUF9QUklWQVRFIiwgTUFQX1BSSVZBVEUpOworICAgIHNldGludChkaWN0LCAiTUFQX1BSSVZBVEUiLCBNQVBfUFJJVkFURSk7CiAjZW5kaWYKICNpZmRlZiBNQVBfREVOWVdSSVRFCi0Jc2V0aW50KGRpY3QsICJNQVBfREVOWVdSSVRFIiwgTUFQX0RFTllXUklURSk7CisgICAgc2V0aW50KGRpY3QsICJNQVBfREVOWVdSSVRFIiwgTUFQX0RFTllXUklURSk7CiAjZW5kaWYKICNpZmRlZiBNQVBfRVhFQ1VUQUJMRQotCXNldGludChkaWN0LCAiTUFQX0VYRUNVVEFCTEUiLCBNQVBfRVhFQ1VUQUJMRSk7CisgICAgc2V0aW50KGRpY3QsICJNQVBfRVhFQ1VUQUJMRSIsIE1BUF9FWEVDVVRBQkxFKTsKICNlbmRpZgogI2lmZGVmIE1BUF9BTk9OWU1PVVMKLQlzZXRpbnQoZGljdCwgIk1BUF9BTk9OIiwgTUFQX0FOT05ZTU9VUyk7Ci0Jc2V0aW50KGRpY3QsICJNQVBfQU5PTllNT1VTIiwgTUFQX0FOT05ZTU9VUyk7CisgICAgc2V0aW50KGRpY3QsICJNQVBfQU5PTiIsIE1BUF9BTk9OWU1PVVMpOworICAgIHNldGludChkaWN0LCAiTUFQX0FOT05ZTU9VUyIsIE1BUF9BTk9OWU1PVVMpOwogI2VuZGlmCiAKLQlzZXRpbnQoZGljdCwgIlBBR0VTSVpFIiwgKGxvbmcpbXlfZ2V0cGFnZXNpemUoKSk7CisgICAgc2V0aW50KGRpY3QsICJQQUdFU0laRSIsIChsb25nKW15X2dldHBhZ2VzaXplKCkpOwogCi0Jc2V0aW50KGRpY3QsICJBTExPQ0FUSU9OR1JBTlVMQVJJVFkiLCAobG9uZylteV9nZXRhbGxvY2F0aW9uZ3JhbnVsYXJpdHkoKSk7IAorICAgIHNldGludChkaWN0LCAiQUxMT0NBVElPTkdSQU5VTEFSSVRZIiwgKGxvbmcpbXlfZ2V0YWxsb2NhdGlvbmdyYW51bGFyaXR5KCkpOwogCi0Jc2V0aW50KGRpY3QsICJBQ0NFU1NfUkVBRCIsIEFDQ0VTU19SRUFEKTsKLQlzZXRpbnQoZGljdCwgIkFDQ0VTU19XUklURSIsIEFDQ0VTU19XUklURSk7Ci0Jc2V0aW50KGRpY3QsICJBQ0NFU1NfQ09QWSIsIEFDQ0VTU19DT1BZKTsKKyAgICBzZXRpbnQoZGljdCwgIkFDQ0VTU19SRUFEIiwgQUNDRVNTX1JFQUQpOworICAgIHNldGludChkaWN0LCAiQUNDRVNTX1dSSVRFIiwgQUNDRVNTX1dSSVRFKTsKKyAgICBzZXRpbnQoZGljdCwgIkFDQ0VTU19DT1BZIiwgQUNDRVNTX0NPUFkpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9uaXNtb2R1bGUuYyBiL01vZHVsZXMvbmlzbW9kdWxlLmMKaW5kZXggOWZiYWI1YS4uMDRkODU3MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9uaXNtb2R1bGUuYworKysgYi9Nb2R1bGVzL25pc21vZHVsZS5jCkBAIC0xLDExICsxLDExIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBXcml0dGVuIGJ5OgotCUZyZWQgR2Fuc2V2bGVzIDxGcmVkLkdhbnNldmxlc0Bjcy51dHdlbnRlLm5sPgotCUImTyBncm91cCwKLQlGYWN1bHRlaXQgZGVyIEluZm9ybWF0aWNhLAotCVVuaXZlcnNpdGVpdCBUd2VudGUsCi0JRW5zY2hlZGUsCi0JdGhlIE5ldGhlcmxhbmRzLgorICAgIEZyZWQgR2Fuc2V2bGVzIDxGcmVkLkdhbnNldmxlc0Bjcy51dHdlbnRlLm5sPgorICAgIEImTyBncm91cCwKKyAgICBGYWN1bHRlaXQgZGVyIEluZm9ybWF0aWNhLAorICAgIFVuaXZlcnNpdGVpdCBUd2VudGUsCisgICAgRW5zY2hlZGUsCisgICAgdGhlIE5ldGhlcmxhbmRzLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBOSVMgbW9kdWxlIGltcGxlbWVudGF0aW9uICovCkBAIC0yMyw3ICsyMyw3IEBACiBleHRlcm4gaW50IHlwX2dldF9kZWZhdWx0X2RvbWFpbihjaGFyICoqKTsKICNlbmRpZgogCi1QeURvY19TVFJWQVIoZ2V0X2RlZmF1bHRfZG9tYWluX19kb2NfXywgCitQeURvY19TVFJWQVIoZ2V0X2RlZmF1bHRfZG9tYWluX19kb2NfXywKICJnZXRfZGVmYXVsdF9kb21haW4oKSAtPiBzdHJcblwKIENvcnJlc3BvbmRzIHRvIHRoZSBDIGxpYnJhcnkgeXBfZ2V0X2RlZmF1bHRfZG9tYWluKCkgY2FsbCwgcmV0dXJuaW5nXG5cCiB0aGUgZGVmYXVsdCBOSVMgZG9tYWluLlxuIik7CkBAIC00OSw0NCArNDksNDQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuaXNfZXJyb3IgKGludCBlcnIpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKE5pc0Vycm9yLCB5cGVycl9zdHJpbmcoZXJyKSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKE5pc0Vycm9yLCB5cGVycl9zdHJpbmcoZXJyKSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmlzX21hcCB7Ci0JY2hhciAqYWxpYXM7Ci0JY2hhciAqbWFwOwotCWludCAgZml4OworICAgIGNoYXIgKmFsaWFzOworICAgIGNoYXIgKm1hcDsKKyAgICBpbnQgIGZpeDsKIH0gYWxpYXNlcyBbXSA9IHsKLQl7InBhc3N3ZCIsCSJwYXNzd2QuYnluYW1lIiwJMH0sCi0JeyJncm91cCIsCSJncm91cC5ieW5hbWUiLAkJMH0sCi0JeyJuZXR3b3JrcyIsCSJuZXR3b3Jrcy5ieWFkZHIiLAkwfSwKLQl7Imhvc3RzIiwJImhvc3RzLmJ5bmFtZSIsCQkwfSwKLQl7InByb3RvY29scyIsCSJwcm90b2NvbHMuYnludW1iZXIiLAkwfSwKLQl7InNlcnZpY2VzIiwJInNlcnZpY2VzLmJ5bmFtZSIsCTB9LAotCXsiYWxpYXNlcyIsCSJtYWlsLmFsaWFzZXMiLAkJMX0sIC8qIGNyZWF0ZWQgd2l0aCAnbWFrZWRibSAtYScgKi8KLQl7ImV0aGVycyIsCSJldGhlcnMuYnluYW1lIiwJMH0sCi0JezBMLAkJMEwsCQkJMH0KKyAgICB7InBhc3N3ZCIsICAgICAgICAgICJwYXNzd2QuYnluYW1lIiwgICAgICAgIDB9LAorICAgIHsiZ3JvdXAiLCAgICAgICAgICAgImdyb3VwLmJ5bmFtZSIsICAgICAgICAgMH0sCisgICAgeyJuZXR3b3JrcyIsICAgICAgICAibmV0d29ya3MuYnlhZGRyIiwgICAgICAwfSwKKyAgICB7Imhvc3RzIiwgICAgICAgICAgICJob3N0cy5ieW5hbWUiLCAgICAgICAgIDB9LAorICAgIHsicHJvdG9jb2xzIiwgICAgICAgInByb3RvY29scy5ieW51bWJlciIsICAgMH0sCisgICAgeyJzZXJ2aWNlcyIsICAgICAgICAic2VydmljZXMuYnluYW1lIiwgICAgICAwfSwKKyAgICB7ImFsaWFzZXMiLCAgICAgICAgICJtYWlsLmFsaWFzZXMiLCAgICAgICAgIDF9LCAvKiBjcmVhdGVkIHdpdGggJ21ha2VkYm0gLWEnICovCisgICAgeyJldGhlcnMiLCAgICAgICAgICAiZXRoZXJzLmJ5bmFtZSIsICAgICAgICAwfSwKKyAgICB7MEwsICAgICAgICAgICAgICAgIDBMLCAgICAgICAgICAgICAgICAgICAgIDB9CiB9OwogCiBzdGF0aWMgY2hhciAqCiBuaXNfbWFwbmFtZSAoY2hhciAqbWFwLCBpbnQgKnBmaXgpCiB7Ci0JaW50IGk7CisgICAgaW50IGk7CiAKLQkqcGZpeCA9IDA7Ci0JZm9yIChpPTA7IGFsaWFzZXNbaV0uYWxpYXMgIT0gMEw7IGkrKykgewotCQlpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5hbGlhcywgbWFwKSkgewotCQkJKnBmaXggPSBhbGlhc2VzW2ldLmZpeDsKLQkJCXJldHVybiBhbGlhc2VzW2ldLm1hcDsKLQkJfQotCQlpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5tYXAsIG1hcCkpIHsKLQkJCSpwZml4ID0gYWxpYXNlc1tpXS5maXg7Ci0JCQlyZXR1cm4gYWxpYXNlc1tpXS5tYXA7Ci0JCX0KLQl9CisgICAgKnBmaXggPSAwOworICAgIGZvciAoaT0wOyBhbGlhc2VzW2ldLmFsaWFzICE9IDBMOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAgKGFsaWFzZXNbaV0uYWxpYXMsIG1hcCkpIHsKKyAgICAgICAgICAgICpwZml4ID0gYWxpYXNlc1tpXS5maXg7CisgICAgICAgICAgICByZXR1cm4gYWxpYXNlc1tpXS5tYXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJjbXAgKGFsaWFzZXNbaV0ubWFwLCBtYXApKSB7CisgICAgICAgICAgICAqcGZpeCA9IGFsaWFzZXNbaV0uZml4OworICAgICAgICAgICAgcmV0dXJuIGFsaWFzZXNbaV0ubWFwOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIG1hcDsKKyAgICByZXR1cm4gbWFwOwogfQogCiAjaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCkBAIC05NiwxNjggKzk2LDE2OCBAQAogI2VuZGlmCiAKIHN0cnVjdCB5cGNhbGxiYWNrX2RhdGEgewotCVB5T2JqZWN0CSpkaWN0OwotCWludAkJCWZpeDsKLQlQeVRocmVhZFN0YXRlICpzdGF0ZTsKKyAgICBQeU9iamVjdCAgICAgICAgICAgICpkaWN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBmaXg7CisgICAgUHlUaHJlYWRTdGF0ZSAqc3RhdGU7CiB9OwogCiBzdGF0aWMgaW50CiBuaXNfZm9yZWFjaCAoaW50IGluc3RhdHVzLCBjaGFyICppbmtleSwgaW50IGlua2V5bGVuLCBjaGFyICppbnZhbCwKICAgICAgICAgICAgICBpbnQgaW52YWxsZW4sIHN0cnVjdCB5cGNhbGxiYWNrX2RhdGEgKmluZGF0YSkKIHsKLQlpZiAoaW5zdGF0dXMgPT0gWVBfVFJVRSkgewotCQlQeU9iamVjdCAqa2V5OwotCQlQeU9iamVjdCAqdmFsOwotCQlpbnQgZXJyOworICAgIGlmIChpbnN0YXR1cyA9PSBZUF9UUlVFKSB7CisgICAgICAgIFB5T2JqZWN0ICprZXk7CisgICAgICAgIFB5T2JqZWN0ICp2YWw7CisgICAgICAgIGludCBlcnI7CiAKLQkJUHlFdmFsX1Jlc3RvcmVUaHJlYWQoaW5kYXRhLT5zdGF0ZSk7Ci0JCWlmIChpbmRhdGEtPmZpeCkgewotCQkgICAgaWYgKGlua2V5bGVuID4gMCAmJiBpbmtleVtpbmtleWxlbi0xXSA9PSAnXDAnKQotCQkJaW5rZXlsZW4tLTsKLQkJICAgIGlmIChpbnZhbGxlbiA+IDAgJiYgaW52YWxbaW52YWxsZW4tMV0gPT0gJ1wwJykKLQkJCWludmFsbGVuLS07Ci0JCX0KLQkJa2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW5rZXksIGlua2V5bGVuKTsKLQkJdmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW52YWwsIGludmFsbGVuKTsKLQkJaWYgKGtleSA9PSBOVUxMIHx8IHZhbCA9PSBOVUxMKSB7Ci0JCQkvKiBYWFggZXJyb3IgLS0gZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICovCi0JCQlQeUVycl9DbGVhcigpOwotCQkJUHlfWERFQ1JFRihrZXkpOwotCQkJUHlfWERFQ1JFRih2YWwpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJZXJyID0gUHlEaWN0X1NldEl0ZW0oaW5kYXRhLT5kaWN0LCBrZXksIHZhbCk7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlQeV9ERUNSRUYodmFsKTsKLQkJaWYgKGVyciAhPSAwKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJaW5kYXRhLT5zdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7Ci0JCWlmIChlcnIgIT0gMCkKLQkJICAJcmV0dXJuIDE7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICAgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoaW5kYXRhLT5zdGF0ZSk7CisgICAgICAgIGlmIChpbmRhdGEtPmZpeCkgeworICAgICAgICAgICAgaWYgKGlua2V5bGVuID4gMCAmJiBpbmtleVtpbmtleWxlbi0xXSA9PSAnXDAnKQorICAgICAgICAgICAgaW5rZXlsZW4tLTsKKyAgICAgICAgICAgIGlmIChpbnZhbGxlbiA+IDAgJiYgaW52YWxbaW52YWxsZW4tMV0gPT0gJ1wwJykKKyAgICAgICAgICAgIGludmFsbGVuLS07CisgICAgICAgIH0KKyAgICAgICAga2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW5rZXksIGlua2V5bGVuKTsKKyAgICAgICAgdmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW52YWwsIGludmFsbGVuKTsKKyAgICAgICAgaWYgKGtleSA9PSBOVUxMIHx8IHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBYWFggZXJyb3IgLS0gZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICovCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlfWERFQ1JFRihrZXkpOworICAgICAgICAgICAgUHlfWERFQ1JFRih2YWwpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oaW5kYXRhLT5kaWN0LCBrZXksIHZhbCk7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICBQeV9ERUNSRUYodmFsKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaW5kYXRhLT5zdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuaXNfZ2V0X2RlZmF1bHRfZG9tYWluIChQeU9iamVjdCAqc2VsZikKIHsKLQljaGFyICpkb21haW47Ci0JaW50IGVycjsKLQlQeU9iamVjdCAqcmVzOworICAgIGNoYXIgKmRvbWFpbjsKKyAgICBpbnQgZXJyOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoKGVyciA9IHlwX2dldF9kZWZhdWx0X2RvbWFpbigmZG9tYWluKSkgIT0gMCkKLQkJcmV0dXJuIG5pc19lcnJvcihlcnIpOworICAgIGlmICgoZXJyID0geXBfZ2V0X2RlZmF1bHRfZG9tYWluKCZkb21haW4pKSAhPSAwKQorICAgICAgICByZXR1cm4gbmlzX2Vycm9yKGVycik7CiAKLQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSAoZG9tYWluLCBzdHJsZW4oZG9tYWluKSk7Ci0JcmV0dXJuIHJlczsKKyAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSAoZG9tYWluLCBzdHJsZW4oZG9tYWluKSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5pc19tYXRjaCAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkaWN0KQogewotCWNoYXIgKm1hdGNoOwotCWNoYXIgKmRvbWFpbiA9IE5VTEw7Ci0JaW50IGtleWxlbiwgbGVuOwotCWNoYXIgKmtleSwgKm1hcDsKLQlpbnQgZXJyOwotCVB5T2JqZWN0ICpyZXM7Ci0JaW50IGZpeDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImtleSIsICJtYXAiLCAiZG9tYWluIiwgTlVMTH07CisgICAgY2hhciAqbWF0Y2g7CisgICAgY2hhciAqZG9tYWluID0gTlVMTDsKKyAgICBpbnQga2V5bGVuLCBsZW47CisgICAgY2hhciAqa2V5LCAqbWFwOworICAgIGludCBlcnI7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBpbnQgZml4OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsia2V5IiwgIm1hcCIsICJkb21haW4iLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGljdCwKLQkJCQkJICJ0I3N8czptYXRjaCIsIGt3bGlzdCwKLQkJCQkJICZrZXksICZrZXlsZW4sICZtYXAsICZkb21haW4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWRvbWFpbiAmJiAoKGVyciA9IHlwX2dldF9kZWZhdWx0X2RvbWFpbigmZG9tYWluKSkgIT0gMCkpCi0JCXJldHVybiBuaXNfZXJyb3IoZXJyKTsKLQltYXAgPSBuaXNfbWFwbmFtZSAobWFwLCAmZml4KTsKLQlpZiAoZml4KQotCSAgICBrZXlsZW4rKzsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZXJyID0geXBfbWF0Y2ggKGRvbWFpbiwgbWFwLCBrZXksIGtleWxlbiwgJm1hdGNoLCAmbGVuKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChmaXgpCi0JICAgIGxlbi0tOwotCWlmIChlcnIgIT0gMCkKLQkJcmV0dXJuIG5pc19lcnJvcihlcnIpOwotCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIChtYXRjaCwgbGVuKTsKLQlmcmVlIChtYXRjaCk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInQjc3xzOm1hdGNoIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksICZrZXlsZW4sICZtYXAsICZkb21haW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWRvbWFpbiAmJiAoKGVyciA9IHlwX2dldF9kZWZhdWx0X2RvbWFpbigmZG9tYWluKSkgIT0gMCkpCisgICAgICAgIHJldHVybiBuaXNfZXJyb3IoZXJyKTsKKyAgICBtYXAgPSBuaXNfbWFwbmFtZSAobWFwLCAmZml4KTsKKyAgICBpZiAoZml4KQorICAgICAgICBrZXlsZW4rKzsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZXJyID0geXBfbWF0Y2ggKGRvbWFpbiwgbWFwLCBrZXksIGtleWxlbiwgJm1hdGNoLCAmbGVuKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChmaXgpCisgICAgICAgIGxlbi0tOworICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgcmV0dXJuIG5pc19lcnJvcihlcnIpOworICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIChtYXRjaCwgbGVuKTsKKyAgICBmcmVlIChtYXRjaCk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5pc19jYXQgKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZGljdCkKIHsKLQljaGFyICpkb21haW4gPSBOVUxMOwotCWNoYXIgKm1hcDsKLQlzdHJ1Y3QgeXBhbGxfY2FsbGJhY2sgY2I7Ci0Jc3RydWN0IHlwY2FsbGJhY2tfZGF0YSBkYXRhOwotCVB5T2JqZWN0ICpkaWN0OwotCWludCBlcnI7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJtYXAiLCAiZG9tYWluIiwgTlVMTH07CisgICAgY2hhciAqZG9tYWluID0gTlVMTDsKKyAgICBjaGFyICptYXA7CisgICAgc3RydWN0IHlwYWxsX2NhbGxiYWNrIGNiOworICAgIHN0cnVjdCB5cGNhbGxiYWNrX2RhdGEgZGF0YTsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBpbnQgZXJyOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibWFwIiwgImRvbWFpbiIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LCAic3xzOmNhdCIsCi0JCQkJICAgICAgICAga3dsaXN0LCAmbWFwLCAmZG9tYWluKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFkb21haW4gJiYgKChlcnIgPSB5cF9nZXRfZGVmYXVsdF9kb21haW4oJmRvbWFpbikpICE9IDApKQotCQlyZXR1cm4gbmlzX2Vycm9yKGVycik7Ci0JZGljdCA9IFB5RGljdF9OZXcgKCk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JY2IuZm9yZWFjaCA9IChmb3JlYWNoZnVuYyluaXNfZm9yZWFjaDsKLQlkYXRhLmRpY3QgPSBkaWN0OwotCW1hcCA9IG5pc19tYXBuYW1lIChtYXAsICZkYXRhLmZpeCk7Ci0JY2IuZGF0YSA9IChjaGFyICopJmRhdGE7Ci0JZGF0YS5zdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7Ci0JZXJyID0geXBfYWxsIChkb21haW4sIG1hcCwgJmNiKTsKLQlQeUV2YWxfUmVzdG9yZVRocmVhZChkYXRhLnN0YXRlKTsKLQlpZiAoZXJyICE9IDApIHsKLQkJUHlfREVDUkVGKGRpY3QpOwotCQlyZXR1cm4gbmlzX2Vycm9yKGVycik7Ci0JfQotCXJldHVybiBkaWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGljdCwgInN8czpjYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm1hcCwgJmRvbWFpbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZG9tYWluICYmICgoZXJyID0geXBfZ2V0X2RlZmF1bHRfZG9tYWluKCZkb21haW4pKSAhPSAwKSkKKyAgICAgICAgcmV0dXJuIG5pc19lcnJvcihlcnIpOworICAgIGRpY3QgPSBQeURpY3RfTmV3ICgpOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNiLmZvcmVhY2ggPSAoZm9yZWFjaGZ1bmMpbmlzX2ZvcmVhY2g7CisgICAgZGF0YS5kaWN0ID0gZGljdDsKKyAgICBtYXAgPSBuaXNfbWFwbmFtZSAobWFwLCAmZGF0YS5maXgpOworICAgIGNiLmRhdGEgPSAoY2hhciAqKSZkYXRhOworICAgIGRhdGEuc3RhdGUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOworICAgIGVyciA9IHlwX2FsbCAoZG9tYWluLCBtYXAsICZjYik7CisgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoZGF0YS5zdGF0ZSk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgcmV0dXJuIG5pc19lcnJvcihlcnIpOworICAgIH0KKyAgICByZXR1cm4gZGljdDsKIH0KIAogLyogVGhlc2Ugc2hvdWxkIGJlIHVfbG9uZyBvbiBTdW4gaC93IGJ1dCBub3Qgb24gNjQtYml0IGgvdy4KICAgIFRoaXMgaXMgbm90IHBvcnRhYmxlIHRvIG1hY2hpbmVzIHdpdGggMTYtYml0IGludHMgYW5kIG5vIHByb3RvdHlwZXMgKi8KICNpZm5kZWYgWVBQUk9DX01BUExJU1QKLSNkZWZpbmUgWVBQUk9DX01BUExJU1QJMTEKKyNkZWZpbmUgWVBQUk9DX01BUExJU1QgIDExCiAjZW5kaWYKICNpZm5kZWYgWVBQUk9HCi0jZGVmaW5lIFlQUFJPRwkJMTAwMDA0CisjZGVmaW5lIFlQUFJPRyAgICAgICAgICAxMDAwMDQKICNlbmRpZgogI2lmbmRlZiBZUFZFUlMKLSNkZWZpbmUgWVBWRVJTCQkyCisjZGVmaW5lIFlQVkVSUyAgICAgICAgICAyCiAjZW5kaWYKIAogdHlwZWRlZiBjaGFyICpkb21haW5uYW1lOwogdHlwZWRlZiBjaGFyICptYXBuYW1lOwogCiBlbnVtIG5pc3N0YXQgewotCU5JU19UUlVFID0gMSwKLQlOSVNfTk9NT1JFID0gMiwKLQlOSVNfRkFMU0UgPSAwLAotCU5JU19OT01BUCA9IC0xLAotCU5JU19OT0RPTSA9IC0yLAotCU5JU19OT0tFWSA9IC0zLAotCU5JU19CQURPUCA9IC00LAotCU5JU19CQUREQiA9IC01LAotCU5JU19ZUEVSUiA9IC02LAotCU5JU19CQURBUkdTID0gLTcsCi0JTklTX1ZFUlMgPSAtOAorICAgIE5JU19UUlVFID0gMSwKKyAgICBOSVNfTk9NT1JFID0gMiwKKyAgICBOSVNfRkFMU0UgPSAwLAorICAgIE5JU19OT01BUCA9IC0xLAorICAgIE5JU19OT0RPTSA9IC0yLAorICAgIE5JU19OT0tFWSA9IC0zLAorICAgIE5JU19CQURPUCA9IC00LAorICAgIE5JU19CQUREQiA9IC01LAorICAgIE5JU19ZUEVSUiA9IC02LAorICAgIE5JU19CQURBUkdTID0gLTcsCisgICAgTklTX1ZFUlMgPSAtOAogfTsKIHR5cGVkZWYgZW51bSBuaXNzdGF0IG5pc3N0YXQ7CiAKIHN0cnVjdCBuaXNtYXBsaXN0IHsKLQltYXBuYW1lIG1hcDsKLQlzdHJ1Y3QgbmlzbWFwbGlzdCAqbmV4dDsKKyAgICBtYXBuYW1lIG1hcDsKKyAgICBzdHJ1Y3QgbmlzbWFwbGlzdCAqbmV4dDsKIH07CiB0eXBlZGVmIHN0cnVjdCBuaXNtYXBsaXN0IG5pc21hcGxpc3Q7CiAKIHN0cnVjdCBuaXNyZXNwX21hcGxpc3QgewotCW5pc3N0YXQgc3RhdDsKLQluaXNtYXBsaXN0ICptYXBzOworICAgIG5pc3N0YXQgc3RhdDsKKyAgICBuaXNtYXBsaXN0ICptYXBzOwogfTsKIHR5cGVkZWYgc3RydWN0IG5pc3Jlc3BfbWFwbGlzdCBuaXNyZXNwX21hcGxpc3Q7CiAKQEAgLTI2Nyw0NSArMjY3LDQ1IEBACiBib29sX3QKIG5pc194ZHJfZG9tYWlubmFtZShYRFIgKnhkcnMsIGRvbWFpbm5hbWUgKm9ianApCiB7Ci0JaWYgKCF4ZHJfc3RyaW5nKHhkcnMsIG9ianAsIFlQTUFYRE9NQUlOKSkgewotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JcmV0dXJuIChUUlVFKTsKKyAgICBpZiAoIXhkcl9zdHJpbmcoeGRycywgb2JqcCwgWVBNQVhET01BSU4pKSB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICByZXR1cm4gKFRSVUUpOwogfQogCiBzdGF0aWMKIGJvb2xfdAogbmlzX3hkcl9tYXBuYW1lKFhEUiAqeGRycywgbWFwbmFtZSAqb2JqcCkKIHsKLQlpZiAoIXhkcl9zdHJpbmcoeGRycywgb2JqcCwgWVBNQVhNQVApKSB7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOworICAgIGlmICgheGRyX3N0cmluZyh4ZHJzLCBvYmpwLCBZUE1BWE1BUCkpIHsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorICAgIHJldHVybiAoVFJVRSk7CiB9CiAKIHN0YXRpYwogYm9vbF90CiBuaXNfeGRyX3lwbWFwbGlzdChYRFIgKnhkcnMsIG5pc21hcGxpc3QgKm9ianApCiB7Ci0JaWYgKCFuaXNfeGRyX21hcG5hbWUoeGRycywgJm9ianAtPm1hcCkpIHsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCWlmICgheGRyX3BvaW50ZXIoeGRycywgKGNoYXIgKiopJm9ianAtPm5leHQsCi0JCQkgc2l6ZW9mKG5pc21hcGxpc3QpLCAoeGRycHJvY190KW5pc194ZHJfeXBtYXBsaXN0KSkKLQl7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOworICAgIGlmICghbmlzX3hkcl9tYXBuYW1lKHhkcnMsICZvYmpwLT5tYXApKSB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICBpZiAoIXhkcl9wb2ludGVyKHhkcnMsIChjaGFyICoqKSZvYmpwLT5uZXh0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5pc21hcGxpc3QpLCAoeGRycHJvY190KW5pc194ZHJfeXBtYXBsaXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICByZXR1cm4gKFRSVUUpOwogfQogCiBzdGF0aWMKIGJvb2xfdAogbmlzX3hkcl95cHN0YXQoWERSICp4ZHJzLCBuaXNzdGF0ICpvYmpwKQogewotCWlmICgheGRyX2VudW0oeGRycywgKGVudW1fdCAqKW9ianApKSB7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOworICAgIGlmICgheGRyX2VudW0oeGRycywgKGVudW1fdCAqKW9ianApKSB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICByZXR1cm4gKFRSVUUpOwogfQogCiAKQEAgLTMxMywxNSArMzEzLDE1IEBACiBib29sX3QKIG5pc194ZHJfeXByZXNwX21hcGxpc3QoWERSICp4ZHJzLCBuaXNyZXNwX21hcGxpc3QgKm9ianApCiB7Ci0JaWYgKCFuaXNfeGRyX3lwc3RhdCh4ZHJzLCAmb2JqcC0+c3RhdCkpIHsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCWlmICgheGRyX3BvaW50ZXIoeGRycywgKGNoYXIgKiopJm9ianAtPm1hcHMsCi0JCQkgc2l6ZW9mKG5pc21hcGxpc3QpLCAoeGRycHJvY190KW5pc194ZHJfeXBtYXBsaXN0KSkKLQl7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOworICAgIGlmICghbmlzX3hkcl95cHN0YXQoeGRycywgJm9ianAtPnN0YXQpKSB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICBpZiAoIXhkcl9wb2ludGVyKHhkcnMsIChjaGFyICoqKSZvYmpwLT5tYXBzLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5pc21hcGxpc3QpLCAoeGRycHJvY190KW5pc194ZHJfeXBtYXBsaXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKyAgICByZXR1cm4gKFRSVUUpOwogfQogCiAKQEAgLTMyOSwxMDUgKzMyOSwxMDUgQEAKIG5pc3Jlc3BfbWFwbGlzdCAqCiBuaXNwcm9jX21hcGxpc3RfMihkb21haW5uYW1lICphcmdwLCBDTElFTlQgKmNsbnQpCiB7Ci0Jc3RhdGljIG5pc3Jlc3BfbWFwbGlzdCByZXM7CisgICAgc3RhdGljIG5pc3Jlc3BfbWFwbGlzdCByZXM7CiAKLQltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOwotCWlmIChjbG50X2NhbGwoY2xudCwgWVBQUk9DX01BUExJU1QsCi0JCSAgICAgICh4ZHJwcm9jX3QpbmlzX3hkcl9kb21haW5uYW1lLCAoY2FkZHJfdClhcmdwLAotCQkgICAgICAoeGRycHJvY190KW5pc194ZHJfeXByZXNwX21hcGxpc3QsIChjYWRkcl90KSZyZXMsCi0JCSAgICAgIFRJTUVPVVQpICE9IFJQQ19TVUNDRVNTKQotCXsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JcmV0dXJuICgmcmVzKTsKKyAgICBtZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworICAgIGlmIChjbG50X2NhbGwoY2xudCwgWVBQUk9DX01BUExJU1QsCisgICAgICAgICAgICAgICAgICAoeGRycHJvY190KW5pc194ZHJfZG9tYWlubmFtZSwgKGNhZGRyX3QpYXJncCwKKyAgICAgICAgICAgICAgICAgICh4ZHJwcm9jX3QpbmlzX3hkcl95cHJlc3BfbWFwbGlzdCwgKGNhZGRyX3QpJnJlcywKKyAgICAgICAgICAgICAgICAgIFRJTUVPVVQpICE9IFJQQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuICgmcmVzKTsKIH0KIAogc3RhdGljCiBuaXNtYXBsaXN0ICoKIG5pc19tYXBsaXN0IChjaGFyICpkb20pCiB7Ci0JbmlzcmVzcF9tYXBsaXN0ICpsaXN0OwotCUNMSUVOVCAqY2w7Ci0JY2hhciAqc2VydmVyID0gTlVMTDsKLQlpbnQgbWFwaSA9IDA7CisgICAgbmlzcmVzcF9tYXBsaXN0ICpsaXN0OworICAgIENMSUVOVCAqY2w7CisgICAgY2hhciAqc2VydmVyID0gTlVMTDsKKyAgICBpbnQgbWFwaSA9IDA7CiAKLQl3aGlsZSAoIXNlcnZlciAmJiBhbGlhc2VzW21hcGldLm1hcCAhPSAwTCkgewotCQl5cF9tYXN0ZXIgKGRvbSwgYWxpYXNlc1ttYXBpXS5tYXAsICZzZXJ2ZXIpOwotCQltYXBpKys7Ci0JfQotICAgICAgICBpZiAoIXNlcnZlcikgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE5pc0Vycm9yLCAiTm8gTklTIG1hc3RlciBmb3VuZCBmb3IgYW55IG1hcCIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQljbCA9IGNsbnRfY3JlYXRlKHNlcnZlciwgWVBQUk9HLCBZUFZFUlMsICJ0Y3AiKTsKLQlpZiAoY2wgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoTmlzRXJyb3IsIGNsbnRfc3BjcmVhdGVlcnJvcihzZXJ2ZXIpKTsKLQkJZ290byBmaW5hbGx5OwotCX0KLQlsaXN0ID0gbmlzcHJvY19tYXBsaXN0XzIgKCZkb20sIGNsKTsKLQljbG50X2Rlc3Ryb3koY2wpOwotCWlmIChsaXN0ID09IE5VTEwpCi0JCWdvdG8gZmluYWxseTsKLQlpZiAobGlzdC0+c3RhdCAhPSBOSVNfVFJVRSkKLQkJZ290byBmaW5hbGx5OworICAgIHdoaWxlICghc2VydmVyICYmIGFsaWFzZXNbbWFwaV0ubWFwICE9IDBMKSB7CisgICAgICAgIHlwX21hc3RlciAoZG9tLCBhbGlhc2VzW21hcGldLm1hcCwgJnNlcnZlcik7CisgICAgICAgIG1hcGkrKzsKKyAgICB9CisgICAgaWYgKCFzZXJ2ZXIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE5pc0Vycm9yLCAiTm8gTklTIG1hc3RlciBmb3VuZCBmb3IgYW55IG1hcCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2wgPSBjbG50X2NyZWF0ZShzZXJ2ZXIsIFlQUFJPRywgWVBWRVJTLCAidGNwIik7CisgICAgaWYgKGNsID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE5pc0Vycm9yLCBjbG50X3NwY3JlYXRlZXJyb3Ioc2VydmVyKSk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgbGlzdCA9IG5pc3Byb2NfbWFwbGlzdF8yICgmZG9tLCBjbCk7CisgICAgY2xudF9kZXN0cm95KGNsKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKGxpc3QtPnN0YXQgIT0gTklTX1RSVUUpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWZyZWUoc2VydmVyKTsKLQlyZXR1cm4gbGlzdC0+bWFwczsKKyAgICBmcmVlKHNlcnZlcik7CisgICAgcmV0dXJuIGxpc3QtPm1hcHM7CiAKICAgZmluYWxseToKLQlmcmVlKHNlcnZlcik7Ci0JcmV0dXJuIE5VTEw7CisgICAgZnJlZShzZXJ2ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmlzX21hcHMgKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZGljdCkKIHsKLQljaGFyICpkb21haW4gPSBOVUxMOwotCW5pc21hcGxpc3QgKm1hcHM7Ci0JUHlPYmplY3QgKmxpc3Q7Ci0gICAgICAgIGludCBlcnI7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkb21haW4iLCBOVUxMfTsKKyAgICBjaGFyICpkb21haW4gPSBOVUxMOworICAgIG5pc21hcGxpc3QgKm1hcHM7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgaW50IGVycjsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRvbWFpbiIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LAotCQkJCQkgInxzOm1hcHMiLCBrd2xpc3QsICZkb21haW4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWRvbWFpbiAmJiAoKGVyciA9IHlwX2dldF9kZWZhdWx0X2RvbWFpbiAoJmRvbWFpbikpICE9IDApKSB7Ci0JCW5pc19lcnJvcihlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8czptYXBzIiwga3dsaXN0LCAmZG9tYWluKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFkb21haW4gJiYgKChlcnIgPSB5cF9nZXRfZGVmYXVsdF9kb21haW4gKCZkb21haW4pKSAhPSAwKSkgeworICAgICAgICBuaXNfZXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKChtYXBzID0gbmlzX21hcGxpc3QgKGRvbWFpbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICgobGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAobWFwcyA9IG1hcHM7IG1hcHM7IG1hcHMgPSBtYXBzLT5uZXh0KSB7Ci0JCVB5T2JqZWN0ICpzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG1hcHMtPm1hcCk7Ci0JCWlmICghc3RyIHx8IFB5TGlzdF9BcHBlbmQobGlzdCwgc3RyKSA8IDApCi0JCXsKLQkJCVB5X0RFQ1JFRihsaXN0KTsKLQkJCWxpc3QgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJUHlfREVDUkVGKHN0cik7Ci0JfQotCS8qIFhYWCBTaG91bGRuJ3Qgd2UgZnJlZSB0aGUgbGlzdCBvZiBtYXBzIG5vdz8gKi8KLQlyZXR1cm4gbGlzdDsKKyAgICBpZiAoKG1hcHMgPSBuaXNfbWFwbGlzdCAoZG9tYWluKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChsaXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChtYXBzID0gbWFwczsgbWFwczsgbWFwcyA9IG1hcHMtPm5leHQpIHsKKyAgICAgICAgUHlPYmplY3QgKnN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobWFwcy0+bWFwKTsKKyAgICAgICAgaWYgKCFzdHIgfHwgUHlMaXN0X0FwcGVuZChsaXN0LCBzdHIpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgbGlzdCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICB9CisgICAgLyogWFhYIFNob3VsZG4ndCB3ZSBmcmVlIHRoZSBsaXN0IG9mIG1hcHMgbm93PyAqLworICAgIHJldHVybiBsaXN0OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgbmlzX21ldGhvZHNbXSA9IHsKLQl7Im1hdGNoIiwJCShQeUNGdW5jdGlvbiluaXNfbWF0Y2gsCi0JCQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQkJCW1hdGNoX19kb2NfX30sCi0JeyJjYXQiLAkJCShQeUNGdW5jdGlvbiluaXNfY2F0LAotCQkJCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCQkJCQljYXRfX2RvY19ffSwKLQl7Im1hcHMiLAkJKFB5Q0Z1bmN0aW9uKW5pc19tYXBzLAotCQkJCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCQkJCQltYXBzX19kb2NfX30sCi0JeyJnZXRfZGVmYXVsdF9kb21haW4iLAkoUHlDRnVuY3Rpb24pbmlzX2dldF9kZWZhdWx0X2RvbWFpbiwKLSAJCQkJCU1FVEhfTk9BUkdTLAotCQkJCQlnZXRfZGVmYXVsdF9kb21haW5fX2RvY19ffSwKLQl7TlVMTCwJCQlOVUxMfQkJIC8qIFNlbnRpbmVsICovCisgICAgeyJtYXRjaCIsICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbiluaXNfbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfX2RvY19ffSwKKyAgICB7ImNhdCIsICAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKW5pc19jYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0X19kb2NfX30sCisgICAgeyJtYXBzIiwgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbiluaXNfbWFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBzX19kb2NfX30sCisgICAgeyJnZXRfZGVmYXVsdF9kb21haW4iLCAgICAgIChQeUNGdW5jdGlvbiluaXNfZ2V0X2RlZmF1bHRfZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZGVmYXVsdF9kb21haW5fX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKG5pc19fZG9jX18sCkBAIC00MzYsMTIgKzQzNiwxMiBAQAogdm9pZAogaW5pdG5pcyAodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JbSA9IFB5X0luaXRNb2R1bGUzKCJuaXMiLCBuaXNfbWV0aG9kcywgbmlzX19kb2NfXyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCU5pc0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJuaXMuZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlpZiAoTmlzRXJyb3IgIT0gTlVMTCkKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgTmlzRXJyb3IpOworICAgIFB5T2JqZWN0ICptLCAqZDsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIm5pcyIsIG5pc19tZXRob2RzLCBuaXNfX2RvY19fKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgTmlzRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oIm5pcy5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIGlmIChOaXNFcnJvciAhPSBOVUxMKQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBOaXNFcnJvcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL29wZXJhdG9yLmMgYi9Nb2R1bGVzL29wZXJhdG9yLmMKaW5kZXggZjAxODFkZS4uMjc0ZDhhYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9vcGVyYXRvci5jCisrKyBiL01vZHVsZXMvb3BlcmF0b3IuYwpAQCAtNjksMTkgKzY5LDE5IEBACiBzdGF0aWMgaW50CiBvcF9pc0NhbGxhYmxlKFB5T2JqZWN0ICp4KQogewotCWlmIChQeUVycl9XYXJuUHkzaygib3BlcmF0b3IuaXNDYWxsYWJsZSgpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMy54LiAiCi0JCQkgICAiVXNlIGhhc2F0dHIob2JqLCAnX19jYWxsX18nKS4iLCAxKSA8IDApCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gUHlDYWxsYWJsZV9DaGVjayh4KTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soIm9wZXJhdG9yLmlzQ2FsbGFibGUoKSBpcyBub3Qgc3VwcG9ydGVkIGluIDMueC4gIgorICAgICAgICAgICAgICAgICAgICAgICAiVXNlIGhhc2F0dHIob2JqLCAnX19jYWxsX18nKS4iLCAxKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gUHlDYWxsYWJsZV9DaGVjayh4KTsKIH0KIAogc3RhdGljIGludAogb3Bfc2VxdWVuY2VJbmNsdWRlcyhQeU9iamVjdCAqc2VxLCBQeU9iamVjdCogb2IpCiB7Ci0JaWYgKFB5RXJyX1dhcm5QeTNrKCJvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKCkgaXMgbm90IHN1cHBvcnRlZCAiCi0JCQkgICAiaW4gMy54LiBVc2Ugb3BlcmF0b3IuY29udGFpbnMoKS4iLCAxKSA8IDApCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gUHlTZXF1ZW5jZV9Db250YWlucyhzZXEsIG9iKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soIm9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMoKSBpcyBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgImluIDMueC4gVXNlIG9wZXJhdG9yLmNvbnRhaW5zKCkuIiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIFB5U2VxdWVuY2VfQ29udGFpbnMoc2VxLCBvYik7CiB9CiAKIHNwYW1pKGlzQ2FsbGFibGUgICAgICAgLCBvcF9pc0NhbGxhYmxlKQpAQCAtMTQwLDg4ICsxNDAsODggQEAKIHN0YXRpYyBQeU9iamVjdCoKIG9wX3BvdyhQeU9iamVjdCAqcywgUHlPYmplY3QgKmEpCiB7Ci0JUHlPYmplY3QgKmExLCAqYTI7Ci0JaWYgKFB5QXJnX1VucGFja1R1cGxlKGEsInBvdyIsIDIsIDIsICZhMSwgJmEyKSkKLQkJcmV0dXJuIFB5TnVtYmVyX1Bvd2VyKGExLCBhMiwgUHlfTm9uZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKmExLCAqYTI7CisgICAgaWYgKFB5QXJnX1VucGFja1R1cGxlKGEsInBvdyIsIDIsIDIsICZhMSwgJmEyKSkKKyAgICAgICAgcmV0dXJuIFB5TnVtYmVyX1Bvd2VyKGExLCBhMiwgUHlfTm9uZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIG9wX2lwb3coUHlPYmplY3QgKnMsIFB5T2JqZWN0ICphKQogewotCVB5T2JqZWN0ICphMSwgKmEyOwotCWlmIChQeUFyZ19VbnBhY2tUdXBsZShhLCJpcG93IiwgMiwgMiwgJmExLCAmYTIpKQotCQlyZXR1cm4gUHlOdW1iZXJfSW5QbGFjZVBvd2VyKGExLCBhMiwgUHlfTm9uZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKmExLCAqYTI7CisgICAgaWYgKFB5QXJnX1VucGFja1R1cGxlKGEsImlwb3ciLCAyLCAyLCAmYTEsICZhMikpCisgICAgICAgIHJldHVybiBQeU51bWJlcl9JblBsYWNlUG93ZXIoYTEsIGEyLCBQeV9Ob25lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9wX2luZGV4KFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqYSkKIHsKLQlyZXR1cm4gUHlOdW1iZXJfSW5kZXgoYSk7CisgICAgcmV0dXJuIFB5TnVtYmVyX0luZGV4KGEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBpc18oUHlPYmplY3QgKnMsIFB5T2JqZWN0ICphKQogewotCVB5T2JqZWN0ICphMSwgKmEyLCAqcmVzdWx0ID0gTlVMTDsKLQlpZiAoUHlBcmdfVW5wYWNrVHVwbGUoYSwiaXNfIiwgMiwgMiwgJmExLCAmYTIpKSB7Ci0JCXJlc3VsdCA9IChhMSA9PSBhMikgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICphMSwgKmEyLCAqcmVzdWx0ID0gTlVMTDsKKyAgICBpZiAoUHlBcmdfVW5wYWNrVHVwbGUoYSwiaXNfIiwgMiwgMiwgJmExLCAmYTIpKSB7CisgICAgICAgIHJlc3VsdCA9IChhMSA9PSBhMikgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBpc19ub3QoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICphKQogewotCVB5T2JqZWN0ICphMSwgKmEyLCAqcmVzdWx0ID0gTlVMTDsKLQlpZiAoUHlBcmdfVW5wYWNrVHVwbGUoYSwiaXNfbm90IiwgMiwgMiwgJmExLCAmYTIpKSB7Ci0JCXJlc3VsdCA9IChhMSAhPSBhMikgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICphMSwgKmEyLCAqcmVzdWx0ID0gTlVMTDsKKyAgICBpZiAoUHlBcmdfVW5wYWNrVHVwbGUoYSwiaXNfbm90IiwgMiwgMiwgJmExLCAmYTIpKSB7CisgICAgICAgIHJlc3VsdCA9IChhMSAhPSBhMikgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBvcF9nZXRzbGljZShQeU9iamVjdCAqcywgUHlPYmplY3QgKmEpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICphMTsKLSAgICAgICAgUHlfc3NpemVfdCBhMiwgYTM7CisgICAgUHlPYmplY3QgKmExOworICAgIFB5X3NzaXplX3QgYTIsIGEzOwogCi0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhLCAiT25uOmdldHNsaWNlIiwgJmExLCAmYTIsICZhMykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHJldHVybiBQeVNlcXVlbmNlX0dldFNsaWNlKGExLCBhMiwgYTMpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhLCAiT25uOmdldHNsaWNlIiwgJmExLCAmYTIsICZhMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeVNlcXVlbmNlX0dldFNsaWNlKGExLCBhMiwgYTMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBvcF9zZXRzbGljZShQeU9iamVjdCAqcywgUHlPYmplY3QgKmEpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICphMSwgKmE0OwotICAgICAgICBQeV9zc2l6ZV90IGEyLCBhMzsKKyAgICBQeU9iamVjdCAqYTEsICphNDsKKyAgICBQeV9zc2l6ZV90IGEyLCBhMzsKIAotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYSwgIk9ubk86c2V0c2xpY2UiLCAmYTEsICZhMiwgJmEzLCAmYTQpKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhLCAiT25uTzpzZXRzbGljZSIsICZhMSwgJmEyLCAmYTMsICZhNCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmICgtMSA9PSBQeVNlcXVlbmNlX1NldFNsaWNlKGExLCBhMiwgYTMsIGE0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoLTEgPT0gUHlTZXF1ZW5jZV9TZXRTbGljZShhMSwgYTIsIGEzLCBhNCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIG9wX2RlbHNsaWNlKFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqYSkKIHsKLSAgICAgICAgUHlPYmplY3QgKmExOwotICAgICAgICBQeV9zc2l6ZV90IGEyLCBhMzsKKyAgICBQeU9iamVjdCAqYTE7CisgICAgUHlfc3NpemVfdCBhMiwgYTM7CiAKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGEsICJPbm46ZGVsc2xpY2UiLCAmYTEsICZhMiwgJmEzKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYSwgIk9ubjpkZWxzbGljZSIsICZhMSwgJmEyLCAmYTMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAoLTEgPT0gUHlTZXF1ZW5jZV9EZWxTbGljZShhMSwgYTIsIGEzKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoLTEgPT0gUHlTZXF1ZW5jZV9EZWxTbGljZShhMSwgYTIsIGEzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogI3VuZGVmIHNwYW0xCkBAIC0yMzAsMTAgKzIzMCwxMCBAQAogI3VuZGVmIHNwYW0xbwogI2RlZmluZSBzcGFtMShPUCxET0MpIHsjT1AsIE9QLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUihET0MpfSwKICNkZWZpbmUgc3BhbTIoT1AsQUxUT1AsRE9DKSB7I09QLCBvcF8jI09QLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUihET0MpfSwgXAotCQkJICAgeyNBTFRPUCwgb3BfIyNPUCwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoRE9DKX0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyNBTFRPUCwgb3BfIyNPUCwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoRE9DKX0sCiAjZGVmaW5lIHNwYW0xbyhPUCxET0MpIHsjT1AsIE9QLCBNRVRIX08sIFB5RG9jX1NUUihET0MpfSwKICNkZWZpbmUgc3BhbTJvKE9QLEFMVE9QLERPQykgeyNPUCwgb3BfIyNPUCwgTUVUSF9PLCBQeURvY19TVFIoRE9DKX0sIFwKLQkJCSAgIHsjQUxUT1AsIG9wXyMjT1AsIE1FVEhfTywgUHlEb2NfU1RSKERPQyl9LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsjQUxUT1AsIG9wXyMjT1AsIE1FVEhfTywgUHlEb2NfU1RSKERPQyl9LAogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG9wZXJhdG9yX21ldGhvZHNbXSA9IHsKIApAQCAtMzE4LDE2ICszMTgsMTYgQEAKIHNwYW0yKGd0LF9fZ3RfXywgImd0KGEsIGIpIC0tIFNhbWUgYXMgYT5iLiIpCiBzcGFtMihnZSxfX2dlX18sICJnZShhLCBiKSAtLSBTYW1lIGFzIGE+PWIuIikKIAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIAogfTsKIAogLyogaXRlbWdldHRlciBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90IG5pdGVtczsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCBuaXRlbXM7CisgICAgUHlPYmplY3QgKml0ZW07CiB9IGl0ZW1nZXR0ZXJvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaXRlbWdldHRlcl90eXBlOwpAQCAtMzM1LDc3ICszMzUsNzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpdGVtZ2V0dGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpdGVtZ2V0dGVyb2JqZWN0ICppZzsKLQlQeU9iamVjdCAqaXRlbTsKLQlQeV9zc2l6ZV90IG5pdGVtczsKKyAgICBpdGVtZ2V0dGVyb2JqZWN0ICppZzsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IG5pdGVtczsKIAotCWlmICghX1B5QXJnX05vS2V5d29yZHMoIml0ZW1nZXR0ZXIoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJpdGVtZ2V0dGVyKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluaXRlbXMgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCWlmIChuaXRlbXMgPD0gMSkgewotCQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpdGVtZ2V0dGVyIiwgMSwgMSwgJml0ZW0pKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIAotCQlpdGVtID0gYXJnczsKKyAgICBuaXRlbXMgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIGlmIChuaXRlbXMgPD0gMSkgeworICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpdGVtZ2V0dGVyIiwgMSwgMSwgJml0ZW0pKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlCisgICAgICAgIGl0ZW0gPSBhcmdzOwogCi0JLyogY3JlYXRlIGl0ZW1nZXR0ZXJvYmplY3Qgc3RydWN0dXJlICovCi0JaWcgPSBQeU9iamVjdF9HQ19OZXcoaXRlbWdldHRlcm9iamVjdCwgJml0ZW1nZXR0ZXJfdHlwZSk7Ci0JaWYgKGlnID09IE5VTEwpIAotCQlyZXR1cm4gTlVMTDsJCi0JCi0JUHlfSU5DUkVGKGl0ZW0pOwotCWlnLT5pdGVtID0gaXRlbTsKLQlpZy0+bml0ZW1zID0gbml0ZW1zOworICAgIC8qIGNyZWF0ZSBpdGVtZ2V0dGVyb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGlnID0gUHlPYmplY3RfR0NfTmV3KGl0ZW1nZXR0ZXJvYmplY3QsICZpdGVtZ2V0dGVyX3R5cGUpOworICAgIGlmIChpZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5T2JqZWN0X0dDX1RyYWNrKGlnKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaWc7CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIGlnLT5pdGVtID0gaXRlbTsKKyAgICBpZy0+bml0ZW1zID0gbml0ZW1zOworCisgICAgUHlPYmplY3RfR0NfVHJhY2soaWcpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpZzsKIH0KIAogc3RhdGljIHZvaWQKIGl0ZW1nZXR0ZXJfZGVhbGxvYyhpdGVtZ2V0dGVyb2JqZWN0ICppZykKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGlnKTsKLQlQeV9YREVDUkVGKGlnLT5pdGVtKTsKLQlQeU9iamVjdF9HQ19EZWwoaWcpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soaWcpOworICAgIFB5X1hERUNSRUYoaWctPml0ZW0pOworICAgIFB5T2JqZWN0X0dDX0RlbChpZyk7CiB9CiAKIHN0YXRpYyBpbnQKIGl0ZW1nZXR0ZXJfdHJhdmVyc2UoaXRlbWdldHRlcm9iamVjdCAqaWcsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGlnLT5pdGVtKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpZy0+aXRlbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpdGVtZ2V0dGVyX2NhbGwoaXRlbWdldHRlcm9iamVjdCAqaWcsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKm9iaiwgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IGksIG5pdGVtcz1pZy0+bml0ZW1zOworICAgIFB5T2JqZWN0ICpvYmosICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBpLCBuaXRlbXM9aWctPm5pdGVtczsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIml0ZW1nZXR0ZXIiLCAxLCAxLCAmb2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG5pdGVtcyA9PSAxKQotCQlyZXR1cm4gUHlPYmplY3RfR2V0SXRlbShvYmosIGlnLT5pdGVtKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpdGVtZ2V0dGVyIiwgMSwgMSwgJm9iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuaXRlbXMgPT0gMSkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0dldEl0ZW0ob2JqLCBpZy0+aXRlbSk7CiAKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhpZy0+aXRlbSkpOwotCWFzc2VydChQeVR1cGxlX0dFVF9TSVpFKGlnLT5pdGVtKSA9PSBuaXRlbXMpOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGlnLT5pdGVtKSk7CisgICAgYXNzZXJ0KFB5VHVwbGVfR0VUX1NJWkUoaWctPml0ZW0pID09IG5pdGVtcyk7CiAKLQlyZXN1bHQgPSBQeVR1cGxlX05ldyhuaXRlbXMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobml0ZW1zKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpPTAgOyBpIDwgbml0ZW1zIDsgaSsrKSB7Ci0JCVB5T2JqZWN0ICppdGVtLCAqdmFsOwotCQlpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShpZy0+aXRlbSwgaSk7Ci0JCXZhbCA9IFB5T2JqZWN0X0dldEl0ZW0ob2JqLCBpdGVtKTsKLQkJaWYgKHZhbCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCB2YWwpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGZvciAoaT0wIDsgaSA8IG5pdGVtcyA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqaXRlbSwgKnZhbDsKKyAgICAgICAgaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oaWctPml0ZW0sIGkpOworICAgICAgICB2YWwgPSBQeU9iamVjdF9HZXRJdGVtKG9iaiwgaXRlbSk7CisgICAgICAgIGlmICh2YWwgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgdmFsKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGl0ZW1nZXR0ZXJfZG9jLApAQCAtNDE2LDU1ICs0MTYsNTUgQEAKIEFmdGVyLCBnPWl0ZW1nZXR0ZXIoMiw1LDMpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHJbMl0sIHJbNV0sIHJbM10pIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaXRlbWdldHRlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJvcGVyYXRvci5pdGVtZ2V0dGVyIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoaXRlbWdldHRlcm9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWl0ZW1nZXR0ZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkodGVybmFyeWZ1bmMpaXRlbWdldHRlcl9jYWxsLAkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCS8qIHRwX2ZsYWdzICovCi0JaXRlbWdldHRlcl9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpdGVtZ2V0dGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JaXRlbWdldHRlcl9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJvcGVyYXRvci5pdGVtZ2V0dGVyIiwgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoaXRlbWdldHRlcm9iamVjdCksICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpdGVtZ2V0dGVyX2RlYWxsb2MsICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYylpdGVtZ2V0dGVyX2NhbGwsICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgaXRlbWdldHRlcl9kb2MsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylpdGVtZ2V0dGVyX3RyYXZlcnNlLCAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaXRlbWdldHRlcl9uZXcsICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBhdHRyZ2V0dGVyIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3QgbmF0dHJzOwotCVB5T2JqZWN0ICphdHRyOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IG5hdHRyczsKKyAgICBQeU9iamVjdCAqYXR0cjsKIH0gYXR0cmdldHRlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBhdHRyZ2V0dGVyX3R5cGU7CkBAIC00NzIsMTIwICs0NzIsMTIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXR0cmdldHRlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JYXR0cmdldHRlcm9iamVjdCAqYWc7Ci0JUHlPYmplY3QgKmF0dHI7Ci0JUHlfc3NpemVfdCBuYXR0cnM7CisgICAgYXR0cmdldHRlcm9iamVjdCAqYWc7CisgICAgUHlPYmplY3QgKmF0dHI7CisgICAgUHlfc3NpemVfdCBuYXR0cnM7CiAKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJhdHRyZ2V0dGVyKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiYXR0cmdldHRlcigpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbmF0dHJzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQlpZiAobmF0dHJzIDw9IDEpIHsKLQkJaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiYXR0cmdldHRlciIsIDEsIDEsICZhdHRyKSkKLQkJCXJldHVybiBOVUxMOwotCX0gZWxzZSAKLQkJYXR0ciA9IGFyZ3M7CisgICAgbmF0dHJzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBpZiAobmF0dHJzIDw9IDEpIHsKKyAgICAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiYXR0cmdldHRlciIsIDEsIDEsICZhdHRyKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZQorICAgICAgICBhdHRyID0gYXJnczsKIAotCS8qIGNyZWF0ZSBhdHRyZ2V0dGVyb2JqZWN0IHN0cnVjdHVyZSAqLwotCWFnID0gUHlPYmplY3RfR0NfTmV3KGF0dHJnZXR0ZXJvYmplY3QsICZhdHRyZ2V0dGVyX3R5cGUpOwotCWlmIChhZyA9PSBOVUxMKSAKLQkJcmV0dXJuIE5VTEw7CQotCQotCVB5X0lOQ1JFRihhdHRyKTsKLQlhZy0+YXR0ciA9IGF0dHI7Ci0JYWctPm5hdHRycyA9IG5hdHRyczsKKyAgICAvKiBjcmVhdGUgYXR0cmdldHRlcm9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBhZyA9IFB5T2JqZWN0X0dDX05ldyhhdHRyZ2V0dGVyb2JqZWN0LCAmYXR0cmdldHRlcl90eXBlKTsKKyAgICBpZiAoYWcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeU9iamVjdF9HQ19UcmFjayhhZyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWFnOworICAgIFB5X0lOQ1JFRihhdHRyKTsKKyAgICBhZy0+YXR0ciA9IGF0dHI7CisgICAgYWctPm5hdHRycyA9IG5hdHRyczsKKworICAgIFB5T2JqZWN0X0dDX1RyYWNrKGFnKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopYWc7CiB9CiAKIHN0YXRpYyB2b2lkCiBhdHRyZ2V0dGVyX2RlYWxsb2MoYXR0cmdldHRlcm9iamVjdCAqYWcpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhhZyk7Ci0JUHlfWERFQ1JFRihhZy0+YXR0cik7Ci0JUHlPYmplY3RfR0NfRGVsKGFnKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGFnKTsKKyAgICBQeV9YREVDUkVGKGFnLT5hdHRyKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoYWcpOwogfQogCiBzdGF0aWMgaW50CiBhdHRyZ2V0dGVyX3RyYXZlcnNlKGF0dHJnZXR0ZXJvYmplY3QgKmFnLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChhZy0+YXR0cik7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoYWctPmF0dHIpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG90dGVkX2dldGF0dHIoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmF0dHIpCiB7Ci0JY2hhciAqcywgKnA7CisgICAgY2hhciAqcywgKnA7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhhdHRyKSkgewotCQlhdHRyID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKGF0dHIsIE5VTEwpOwotCQlpZiAoYXR0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soYXR0cikpIHsKKyAgICAgICAgYXR0ciA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhhdHRyLCBOVUxMKTsKKyAgICAgICAgaWYgKGF0dHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCQotCWlmICghUHlTdHJpbmdfQ2hlY2soYXR0cikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CiAKLQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKGF0dHIpOwotCVB5X0lOQ1JFRihvYmopOwotCWZvciAoOzspIHsKLQkJUHlPYmplY3QgKm5ld29iaiwgKnN0cjsKLQkJcCA9IHN0cmNocihzLCAnLicpOwotCQlzdHIgPSBwID8gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgKHAtcykpIDogCi0JCQkgIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7Ci0JCWlmIChzdHIgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKG9iaik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQluZXdvYmogPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgc3RyKTsKLQkJUHlfREVDUkVGKHN0cik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlpZiAobmV3b2JqID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJb2JqID0gbmV3b2JqOwotCQlpZiAocCA9PSBOVUxMKSBicmVhazsKLQkJcyA9IHArMTsKLQl9CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhhdHRyKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG9iajsKKyAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKGF0dHIpOworICAgIFB5X0lOQ1JFRihvYmopOworICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlPYmplY3QgKm5ld29iaiwgKnN0cjsKKyAgICAgICAgcCA9IHN0cmNocihzLCAnLicpOworICAgICAgICBzdHIgPSBwID8gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgKHAtcykpIDoKKyAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKKyAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG5ld29iaiA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBzdHIpOworICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgIGlmIChuZXdvYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBvYmogPSBuZXdvYmo7CisgICAgICAgIGlmIChwID09IE5VTEwpIGJyZWFrOworICAgICAgICBzID0gcCsxOworICAgIH0KKworICAgIHJldHVybiBvYmo7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdHRyZ2V0dGVyX2NhbGwoYXR0cmdldHRlcm9iamVjdCAqYWcsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKm9iaiwgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IGksIG5hdHRycz1hZy0+bmF0dHJzOworICAgIFB5T2JqZWN0ICpvYmosICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBpLCBuYXR0cnM9YWctPm5hdHRyczsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImF0dHJnZXR0ZXIiLCAxLCAxLCAmb2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFnLT5uYXR0cnMgPT0gMSkKLQkJcmV0dXJuIGRvdHRlZF9nZXRhdHRyKG9iaiwgYWctPmF0dHIpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImF0dHJnZXR0ZXIiLCAxLCAxLCAmb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFnLT5uYXR0cnMgPT0gMSkKKyAgICAgICAgcmV0dXJuIGRvdHRlZF9nZXRhdHRyKG9iaiwgYWctPmF0dHIpOwogCi0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYWctPmF0dHIpKTsKLQlhc3NlcnQoUHlUdXBsZV9HRVRfU0laRShhZy0+YXR0cikgPT0gbmF0dHJzKTsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhZy0+YXR0cikpOworICAgIGFzc2VydChQeVR1cGxlX0dFVF9TSVpFKGFnLT5hdHRyKSA9PSBuYXR0cnMpOwogCi0JcmVzdWx0ID0gUHlUdXBsZV9OZXcobmF0dHJzKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KG5hdHRycyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaT0wIDsgaSA8IG5hdHRycyA7IGkrKykgewotCQlQeU9iamVjdCAqYXR0ciwgKnZhbDsKLQkJYXR0ciA9IFB5VHVwbGVfR0VUX0lURU0oYWctPmF0dHIsIGkpOwotCQl2YWwgPSBkb3R0ZWRfZ2V0YXR0cihvYmosIGF0dHIpOwotCQlpZiAodmFsID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIHZhbCk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgZm9yIChpPTAgOyBpIDwgbmF0dHJzIDsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICphdHRyLCAqdmFsOworICAgICAgICBhdHRyID0gUHlUdXBsZV9HRVRfSVRFTShhZy0+YXR0ciwgaSk7CisgICAgICAgIHZhbCA9IGRvdHRlZF9nZXRhdHRyKG9iaiwgYXR0cik7CisgICAgICAgIGlmICh2YWwgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgdmFsKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGF0dHJnZXR0ZXJfZG9jLApAQCAtNTk4LDU2ICs1OTgsNTYgQEAKIChyLm5hbWUuZmlyc3QsIHIubmFtZS5sYXN0KS4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBhdHRyZ2V0dGVyX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIm9wZXJhdG9yLmF0dHJnZXR0ZXIiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihhdHRyZ2V0dGVyb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpYXR0cmdldHRlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYylhdHRyZ2V0dGVyX2NhbGwsCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywJLyogdHBfZmxhZ3MgKi8KLQlhdHRyZ2V0dGVyX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWF0dHJnZXR0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlhdHRyZ2V0dGVyX25ldywJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIm9wZXJhdG9yLmF0dHJnZXR0ZXIiLCAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihhdHRyZ2V0dGVyb2JqZWN0KSwgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWF0dHJnZXR0ZXJfZGVhbGxvYywgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKWF0dHJnZXR0ZXJfY2FsbCwgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBhdHRyZ2V0dGVyX2RvYywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWF0dHJnZXR0ZXJfdHJhdmVyc2UsICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBhdHRyZ2V0dGVyX25ldywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIG1ldGhvZGNhbGxlciBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqbmFtZTsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqa3dkczsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKm5hbWU7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmt3ZHM7CiB9IG1ldGhvZGNhbGxlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBtZXRob2RjYWxsZXJfdHlwZTsKQEAgLTY1NSw2OSArNjU1LDY5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aG9kY2FsbGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQltZXRob2RjYWxsZXJvYmplY3QgKm1jOwotCVB5T2JqZWN0ICpuYW1lLCAqbmV3YXJnczsKKyAgICBtZXRob2RjYWxsZXJvYmplY3QgKm1jOworICAgIFB5T2JqZWN0ICpuYW1lLCAqbmV3YXJnczsKIAotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDwgMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWV0aG9kY2FsbGVyIG5lZWRzIGF0IGxlYXN0ICIKLQkJCQkib25lIGFyZ3VtZW50LCB0aGUgbWV0aG9kIG5hbWUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDwgMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWV0aG9kY2FsbGVyIG5lZWRzIGF0IGxlYXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvbmUgYXJndW1lbnQsIHRoZSBtZXRob2QgbmFtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBjcmVhdGUgbWV0aG9kY2FsbGVyb2JqZWN0IHN0cnVjdHVyZSAqLwotCW1jID0gUHlPYmplY3RfR0NfTmV3KG1ldGhvZGNhbGxlcm9iamVjdCwgJm1ldGhvZGNhbGxlcl90eXBlKTsKLQlpZiAobWMgPT0gTlVMTCkgCi0JCXJldHVybiBOVUxMOwkKKyAgICAvKiBjcmVhdGUgbWV0aG9kY2FsbGVyb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIG1jID0gUHlPYmplY3RfR0NfTmV3KG1ldGhvZGNhbGxlcm9iamVjdCwgJm1ldGhvZGNhbGxlcl90eXBlKTsKKyAgICBpZiAobWMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluZXdhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKTsKLQlpZiAobmV3YXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihtYyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltYy0+YXJncyA9IG5ld2FyZ3M7CisgICAgbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgUHlUdXBsZV9HRVRfU0laRShhcmdzKSk7CisgICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobWMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWMtPmFyZ3MgPSBuZXdhcmdzOwogCi0JbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JUHlfSU5DUkVGKG5hbWUpOwotCW1jLT5uYW1lID0gbmFtZTsKKyAgICBuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgbWMtPm5hbWUgPSBuYW1lOwogCi0JUHlfWElOQ1JFRihrd2RzKTsKLQltYy0+a3dkcyA9IGt3ZHM7CisgICAgUHlfWElOQ1JFRihrd2RzKTsKKyAgICBtYy0+a3dkcyA9IGt3ZHM7CiAKLQlQeU9iamVjdF9HQ19UcmFjayhtYyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW1jOworICAgIFB5T2JqZWN0X0dDX1RyYWNrKG1jKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbWM7CiB9CiAKIHN0YXRpYyB2b2lkCiBtZXRob2RjYWxsZXJfZGVhbGxvYyhtZXRob2RjYWxsZXJvYmplY3QgKm1jKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobWMpOwotCVB5X1hERUNSRUYobWMtPm5hbWUpOwotCVB5X1hERUNSRUYobWMtPmFyZ3MpOwotCVB5X1hERUNSRUYobWMtPmt3ZHMpOwotCVB5T2JqZWN0X0dDX0RlbChtYyk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhtYyk7CisgICAgUHlfWERFQ1JFRihtYy0+bmFtZSk7CisgICAgUHlfWERFQ1JFRihtYy0+YXJncyk7CisgICAgUHlfWERFQ1JFRihtYy0+a3dkcyk7CisgICAgUHlPYmplY3RfR0NfRGVsKG1jKTsKIH0KIAogc3RhdGljIGludAogbWV0aG9kY2FsbGVyX3RyYXZlcnNlKG1ldGhvZGNhbGxlcm9iamVjdCAqbWMsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKG1jLT5hcmdzKTsKLQlQeV9WSVNJVChtYy0+a3dkcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobWMtPmFyZ3MpOworICAgIFB5X1ZJU0lUKG1jLT5rd2RzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ldGhvZGNhbGxlcl9jYWxsKG1ldGhvZGNhbGxlcm9iamVjdCAqbWMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKm1ldGhvZCwgKm9iaiwgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqbWV0aG9kLCAqb2JqLCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAibWV0aG9kY2FsbGVyIiwgMSwgMSwgJm9iaikpCi0JCXJldHVybiBOVUxMOwotCW1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBtYy0+bmFtZSk7Ci0JaWYgKG1ldGhvZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKG1ldGhvZCwgbWMtPmFyZ3MsIG1jLT5rd2RzKTsKLQlQeV9ERUNSRUYobWV0aG9kKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIm1ldGhvZGNhbGxlciIsIDEsIDEsICZvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgbWMtPm5hbWUpOworICAgIGlmIChtZXRob2QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChtZXRob2QsIG1jLT5hcmdzLCBtYy0+a3dkcyk7CisgICAgUHlfREVDUkVGKG1ldGhvZCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKG1ldGhvZGNhbGxlcl9kb2MsCkBAIC03MjksNDYgKzcyOSw0NiBAQAogci5uYW1lKCdkYXRlJywgZm9vPTEpLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IG1ldGhvZGNhbGxlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJvcGVyYXRvci5tZXRob2RjYWxsZXIiLAkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKG1ldGhvZGNhbGxlcm9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKW1ldGhvZGNhbGxlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYyltZXRob2RjYWxsZXJfY2FsbCwJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JbWV0aG9kY2FsbGVyX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKW1ldGhvZGNhbGxlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCW1ldGhvZGNhbGxlcl9uZXcsCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIm9wZXJhdG9yLm1ldGhvZGNhbGxlciIsICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihtZXRob2RjYWxsZXJvYmplY3QpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKW1ldGhvZGNhbGxlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYyltZXRob2RjYWxsZXJfY2FsbCwgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgbWV0aG9kY2FsbGVyX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKW1ldGhvZGNhbGxlcl90cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBtZXRob2RjYWxsZXJfbmV3LCAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKQEAgLTc3NywyNiArNzc3LDI2IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdG9wZXJhdG9yKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0gICAgICAgIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotICAgICAgICBtID0gUHlfSW5pdE1vZHVsZTQoIm9wZXJhdG9yIiwgb3BlcmF0b3JfbWV0aG9kcywgb3BlcmF0b3JfZG9jLAotCQkgICAgICAgKFB5T2JqZWN0KilOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBQeU9iamVjdCAqbTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJml0ZW1nZXR0ZXJfdHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKCZpdGVtZ2V0dGVyX3R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiaXRlbWdldHRlciIsIChQeU9iamVjdCAqKSZpdGVtZ2V0dGVyX3R5cGUpOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgib3BlcmF0b3IiLCBvcGVyYXRvcl9tZXRob2RzLCBvcGVyYXRvcl9kb2MsCisgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0KilOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWlmIChQeVR5cGVfUmVhZHkoJmF0dHJnZXR0ZXJfdHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKCZhdHRyZ2V0dGVyX3R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiYXR0cmdldHRlciIsIChQeU9iamVjdCAqKSZhdHRyZ2V0dGVyX3R5cGUpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJml0ZW1nZXR0ZXJfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZpdGVtZ2V0dGVyX3R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiaXRlbWdldHRlciIsIChQeU9iamVjdCAqKSZpdGVtZ2V0dGVyX3R5cGUpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmbWV0aG9kY2FsbGVyX3R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRigmbWV0aG9kY2FsbGVyX3R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAibWV0aG9kY2FsbGVyIiwgKFB5T2JqZWN0ICopJm1ldGhvZGNhbGxlcl90eXBlKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZhdHRyZ2V0dGVyX3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmYXR0cmdldHRlcl90eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImF0dHJnZXR0ZXIiLCAoUHlPYmplY3QgKikmYXR0cmdldHRlcl90eXBlKTsKKworICAgIGlmIChQeVR5cGVfUmVhZHkoJm1ldGhvZGNhbGxlcl90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJm1ldGhvZGNhbGxlcl90eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIm1ldGhvZGNhbGxlciIsIChQeU9iamVjdCAqKSZtZXRob2RjYWxsZXJfdHlwZSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jIGIvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYwppbmRleCBhZjMzMWVlLi5jMzZmY2IwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCisrKyBiL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKQEAgLTU1NSw4ICs1NTUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmFsX2lucHV0IDogZmlsZV9pbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnIsICZmbGFncyk7CiAKLQlpZiAobikgewotCSAgICByZXMgPSBwYXJzZXJfbmV3c3RvYmplY3QobiwgdHlwZSk7CisgICAgICAgIGlmIChuKSB7CisgICAgICAgICAgICByZXMgPSBwYXJzZXJfbmV3c3RvYmplY3QobiwgdHlwZSk7CiAgICAgICAgICAgICBpZiAocmVzKQogICAgICAgICAgICAgICAgICgoUHlTVF9PYmplY3QgKilyZXMpLT5zdF9mbGFncy5jZl9mbGFncyA9IGZsYWdzICYgUHlDRl9NQVNLOwogICAgICAgICB9CkBAIC03NjcsNyArNzY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXJkIGl0ZW0gaW4gdGVybWluYWwgbm9kZSBtdXN0IGJlIGFuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW50ZWdlciwgZm91bmQgJXMiLAotCQkJCSAgICAgUHlfVFlQRSh0ZW1wKS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh0ZW1wKS0+dHBfbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTk0MSw4ICs5NDEsOCBAQAogVkFMSURBVEVSKHRlc3RsaXN0MSk7ICAgICAgICAgICBWQUxJREFURVIoY29tcF9mb3IpOwogVkFMSURBVEVSKGNvbXBfaXRlcik7ICAgICAgICAgICBWQUxJREFURVIoY29tcF9pZik7CiBWQUxJREFURVIodGVzdGxpc3RfY29tcCk7ICAgICAgIFZBTElEQVRFUih5aWVsZF9leHByKTsKLVZBTElEQVRFUih5aWVsZF9vcl90ZXN0bGlzdCk7CVZBTElEQVRFUihvcl90ZXN0KTsKLVZBTElEQVRFUihvbGRfdGVzdCk7IAkJVkFMSURBVEVSKG9sZF9sYW1iZGVmKTsKK1ZBTElEQVRFUih5aWVsZF9vcl90ZXN0bGlzdCk7ICAgVkFMSURBVEVSKG9yX3Rlc3QpOworVkFMSURBVEVSKG9sZF90ZXN0KTsgICAgICAgICAgICBWQUxJREFURVIob2xkX2xhbWJkZWYpOwogCiAjdW5kZWYgVkFMSURBVEVSCiAKQEAgLTEwMzEsNyArMTAzMSw3IEBACiB7CiAgICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKICAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGNsYXNzZGVmKSAmJgotCSAgICAgICAJKChuY2ggPT0gNCkgfHwgKG5jaCA9PSA2KSB8fCAobmNoID09IDcpKSk7CisgICAgICAgICAgICAgICAgKChuY2ggPT0gNCkgfHwgKG5jaCA9PSA2KSB8fCAobmNoID09IDcpKSk7CiAKICAgICBpZiAocmVzKSB7CiAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiY2xhc3MiKQpAQCAtMTA0MiwxNyArMTA0MiwxNyBAQAogICAgIGVsc2UgewogICAgICAgICAodm9pZCkgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgNCwgImNsYXNzIik7CiAgICAgfQotCQorCiAgICAgaWYgKHJlcykgewotCWlmIChuY2ggPT0gNykgewotCQlyZXMgPSAoKHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLCAyKSkgJiYKLQkJCXZhbGlkYXRlX3Rlc3RsaXN0KENISUxEKHRyZWUsIDMpKSAmJgotCQkJdmFsaWRhdGVfcnBhcmVuKENISUxEKHRyZWUsIDQpKSkpOwotCX0KLQllbHNlIGlmIChuY2ggPT0gNikgewotCQlyZXMgPSAodmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsMikpICYmCi0JCQl2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwzKSkpOwotCX0KKyAgICAgICAgaWYgKG5jaCA9PSA3KSB7CisgICAgICAgICAgICAgICAgcmVzID0gKCh2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwgMikpICYmCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV90ZXN0bGlzdChDSElMRCh0cmVlLCAzKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLCA0KSkpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChuY2ggPT0gNikgeworICAgICAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwyKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLDMpKSk7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIChyZXMpOwogfQpAQCAtMTQzMyw3ICsxNDMzLDcgQEAKICAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tcF9pdGVyKENISUxEKHRyZWUsIDIpKTsKICAgICBlbHNlCiAgICAgICAgIHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJjb21wX2lmIik7Ci0gICAgCisKICAgICBpZiAocmVzKQogICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImlmIikKICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX29sZF90ZXN0KENISUxEKHRyZWUsIDEpKSk7CkBAIC0xNTkzLDEwICsxNTkzLDEwIEBACiBzdGF0aWMgaW50CiB2YWxpZGF0ZV95aWVsZF9vcl90ZXN0bGlzdChub2RlICp0cmVlKQogewotCWlmIChUWVBFKHRyZWUpID09IHlpZWxkX2V4cHIpIAotCQlyZXR1cm4gdmFsaWRhdGVfeWllbGRfZXhwcih0cmVlKTsKLQllbHNlCi0JCXJldHVybiB2YWxpZGF0ZV90ZXN0bGlzdCh0cmVlKTsKKyAgICAgICAgaWYgKFRZUEUodHJlZSkgPT0geWllbGRfZXhwcikKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVfeWllbGRfZXhwcih0cmVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV90ZXN0bGlzdCh0cmVlKTsKIH0KIAogc3RhdGljIGludApAQCAtMTYxMSw3ICsxNjExLDcgQEAKICAgICBpZiAocmVzICYmIG5jaCA9PSAzCiAgICAgICAgICYmIFRZUEUoQ0hJTEQodHJlZSwgMSkpID09IGF1Z2Fzc2lnbikgewogICAgICAgICByZXMgPSB2YWxpZGF0ZV9udW1ub2RlcyhDSElMRCh0cmVlLCAxKSwgMSwgImF1Z2Fzc2lnbiIpCi0JCSYmIHZhbGlkYXRlX3lpZWxkX29yX3Rlc3RsaXN0KENISUxEKHRyZWUsIDIpKTsKKyAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV95aWVsZF9vcl90ZXN0bGlzdChDSElMRCh0cmVlLCAyKSk7CiAKICAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgICAgY2hhciAqcyA9IFNUUihDSElMRChDSElMRCh0cmVlLCAxKSwgMCkpOwpAQCAtMTgzNywxNCArMTgzNywxNCBAQAogc3RhdGljIGludAogdmFsaWRhdGVfZG90dGVkX2FzX25hbWVzKG5vZGUgKnRyZWUpCiB7Ci0JaW50IG5jaCA9IE5DSCh0cmVlKTsKLQlpbnQgcmVzID0gaXNfb2RkKG5jaCkgJiYgdmFsaWRhdGVfZG90dGVkX2FzX25hbWUoQ0hJTEQodHJlZSwgMCkpOwotCWludCBpOworICAgICAgICBpbnQgbmNoID0gTkNIKHRyZWUpOworICAgICAgICBpbnQgcmVzID0gaXNfb2RkKG5jaCkgJiYgdmFsaWRhdGVfZG90dGVkX2FzX25hbWUoQ0hJTEQodHJlZSwgMCkpOworICAgICAgICBpbnQgaTsKIAotCWZvciAoaSA9IDE7IHJlcyAmJiAoaSA8IG5jaCk7IGkgKz0gMikKLQkgICAgcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIGkpKQotCQkgICAmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZShDSElMRCh0cmVlLCBpICsgMSkpKTsKLQlyZXR1cm4gKHJlcyk7CisgICAgICAgIGZvciAoaSA9IDE7IHJlcyAmJiAoaSA8IG5jaCk7IGkgKz0gMikKKyAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBpKSkKKyAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZShDSElMRCh0cmVlLCBpICsgMSkpKTsKKyAgICAgICAgcmV0dXJuIChyZXMpOwogfQogCiAKQEAgLTE4NTcsOCArMTg1Nyw4IEBACiAgICAgaW50IGk7CiAKICAgICBmb3IgKGkgPSAxOyByZXMgJiYgKGkgKyAxIDwgbmNoKTsgaSArPSAyKQotCXJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBpKSkKLQkgICAgICAgJiYgdmFsaWRhdGVfaW1wb3J0X2FzX25hbWUoQ0hJTEQodHJlZSwgaSArIDEpKSk7CisgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBpKSkKKyAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2ltcG9ydF9hc19uYW1lKENISUxEKHRyZWUsIGkgKyAxKSkpOwogICAgIHJldHVybiAocmVzKTsKIH0KIApAQCAtMTg2NywxMyArMTg2NywxMyBAQAogc3RhdGljIGludAogdmFsaWRhdGVfaW1wb3J0X25hbWUobm9kZSAqdHJlZSkKIHsKLQlyZXR1cm4gKHZhbGlkYXRlX250eXBlKHRyZWUsIGltcG9ydF9uYW1lKQotCQkmJiB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAiaW1wb3J0X25hbWUiKQotCQkmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiaW1wb3J0IikKLQkJJiYgdmFsaWRhdGVfZG90dGVkX2FzX25hbWVzKENISUxEKHRyZWUsIDEpKSk7CisgICAgICAgIHJldHVybiAodmFsaWRhdGVfbnR5cGUodHJlZSwgaW1wb3J0X25hbWUpCisgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgImltcG9ydF9uYW1lIikKKyAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiaW1wb3J0IikKKyAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZXMoQ0hJTEQodHJlZSwgMSkpKTsKIH0KIAotLyogSGVscGVyIGZ1bmN0aW9uIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgbGVhZGluZyBkb3RzIGluIAorLyogSGVscGVyIGZ1bmN0aW9uIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgbGVhZGluZyBkb3RzIGluCiAgKiAnZnJvbSAuLi5tb2R1bGUgaW1wb3J0IG5hbWUnCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTE4ODEsOCArMTg4MSw4IEBACiB7CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTkNIKHRyZWUpOyBpKyspCi0JCWlmIChUWVBFKENISUxEKHRyZWUsIGkpKSAhPSBET1QpCi0JCQlicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCBpKSkgIT0gRE9UKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIHJldHVybiBpLTE7CiB9CiAKQEAgLTE4OTIsMjQgKzE4OTIsMjQgQEAKIHN0YXRpYyBpbnQKIHZhbGlkYXRlX2ltcG9ydF9mcm9tKG5vZGUgKnRyZWUpCiB7Ci0JaW50IG5jaCA9IE5DSCh0cmVlKTsKLQlpbnQgbmRvdHMgPSBjb3VudF9mcm9tX2RvdHModHJlZSk7Ci0JaW50IGhhdmVuYW1lID0gKFRZUEUoQ0hJTEQodHJlZSwgbmRvdHMgKyAxKSkgPT0gZG90dGVkX25hbWUpOwotCWludCBvZmZzZXQgPSBuZG90cyArIGhhdmVuYW1lOwotCWludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBpbXBvcnRfZnJvbSkKLQkJJiYgKG5jaCA+PSA0ICsgbmRvdHMpCi0JCSYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJmcm9tIikKLQkJJiYgKCFoYXZlbmFtZSB8fCB2YWxpZGF0ZV9kb3R0ZWRfbmFtZShDSElMRCh0cmVlLCBuZG90cyArIDEpKSkKLQkJJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCBvZmZzZXQgKyAxKSwgImltcG9ydCIpOworICAgICAgICBpbnQgbmNoID0gTkNIKHRyZWUpOworICAgICAgICBpbnQgbmRvdHMgPSBjb3VudF9mcm9tX2RvdHModHJlZSk7CisgICAgICAgIGludCBoYXZlbmFtZSA9IChUWVBFKENISUxEKHRyZWUsIG5kb3RzICsgMSkpID09IGRvdHRlZF9uYW1lKTsKKyAgICAgICAgaW50IG9mZnNldCA9IG5kb3RzICsgaGF2ZW5hbWU7CisgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBpbXBvcnRfZnJvbSkKKyAgICAgICAgICAgICAgICAmJiAobmNoID49IDQgKyBuZG90cykKKyAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiZnJvbSIpCisgICAgICAgICAgICAgICAgJiYgKCFoYXZlbmFtZSB8fCB2YWxpZGF0ZV9kb3R0ZWRfbmFtZShDSElMRCh0cmVlLCBuZG90cyArIDEpKSkKKyAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIG9mZnNldCArIDEpLCAiaW1wb3J0Iik7CiAKLQlpZiAocmVzICYmIFRZUEUoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpID09IExQQVIpCi0JICAgIHJlcyA9ICgobmNoID09IG9mZnNldCArIDUpCi0JCSAgICYmIHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSkKLQkJICAgJiYgdmFsaWRhdGVfaW1wb3J0X2FzX25hbWVzKENISUxEKHRyZWUsIG9mZnNldCArIDMpKQotCQkgICAmJiB2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgb2Zmc2V0ICsgNCkpKTsKLQllbHNlIGlmIChyZXMgJiYgVFlQRShDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSkgIT0gU1RBUikKLQkgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X2FzX25hbWVzKENISUxEKHRyZWUsIG9mZnNldCArIDIpKTsKLQlyZXR1cm4gKHJlcyk7CisgICAgICAgIGlmIChyZXMgJiYgVFlQRShDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSkgPT0gTFBBUikKKyAgICAgICAgICAgIHJlcyA9ICgobmNoID09IG9mZnNldCArIDUpCisgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsIG9mZnNldCArIDIpKQorICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2ltcG9ydF9hc19uYW1lcyhDSElMRCh0cmVlLCBvZmZzZXQgKyAzKSkKKyAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgb2Zmc2V0ICsgNCkpKTsKKyAgICAgICAgZWxzZSBpZiAocmVzICYmIFRZUEUoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpICE9IFNUQVIpCisgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfYXNfbmFtZXMoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpOworICAgICAgICByZXR1cm4gKHJlcyk7CiB9CiAKIApAQCAtMTkyMSw5ICsxOTIxLDkgQEAKICAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgImltcG9ydF9zdG10Iik7CiAKICAgICBpZiAocmVzKSB7Ci0JaW50IG50eXBlID0gVFlQRShDSElMRCh0cmVlLCAwKSk7CisgICAgICAgIGludCBudHlwZSA9IFRZUEUoQ0hJTEQodHJlZSwgMCkpOwogCi0JaWYgKG50eXBlID09IGltcG9ydF9uYW1lIHx8IG50eXBlID09IGltcG9ydF9mcm9tKQorICAgICAgICBpZiAobnR5cGUgPT0gaW1wb3J0X25hbWUgfHwgbnR5cGUgPT0gaW1wb3J0X2Zyb20pCiAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9ub2RlKENISUxEKHRyZWUsIDApKTsKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICByZXMgPSAwOwpAQCAtMjQ1NiwxMSArMjQ1NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICYmICh2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgbmNoIC0gMSkpKSk7CiAKICAgICAgICAgICAgIGlmIChyZXMgJiYgKG5jaCA9PSAzKSkgewotCQlpZiAoVFlQRShDSElMRCh0cmVlLCAxKSk9PXlpZWxkX2V4cHIpCi0JCQlyZXMgPSB2YWxpZGF0ZV95aWVsZF9leHByKENISUxEKHRyZWUsIDEpKTsKLQkJZWxzZQotICAgICAgICAgICAgICAgIAlyZXMgPSB2YWxpZGF0ZV90ZXN0bGlzdF9jb21wKENISUxEKHRyZWUsIDEpKTsKLQkgICAgfQorICAgICAgICAgICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIDEpKT09eWllbGRfZXhwcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3lpZWxkX2V4cHIoQ0hJTEQodHJlZSwgMSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3RsaXN0X2NvbXAoQ0hJTEQodHJlZSwgMSkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSBMU1FCOgogICAgICAgICAgICAgaWYgKG5jaCA9PSAyKQpAQCAtMjU4NiwxNyArMjU4NiwxNyBAQAogICAgIGludCBvazsKICAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwogICAgIG9rID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGRlY29yYXRvcikgJiYKLQkgIChuY2ggPT0gMyB8fCBuY2ggPT0gNSB8fCBuY2ggPT0gNikgJiYKLQkgIHZhbGlkYXRlX2F0KENISUxEKHRyZWUsIDApKSAmJgotCSAgdmFsaWRhdGVfZG90dGVkX25hbWUoQ0hJTEQodHJlZSwgMSkpICYmCi0JICB2YWxpZGF0ZV9uZXdsaW5lKFJDSElMRCh0cmVlLCAtMSkpKTsKKyAgICAgICAgICAobmNoID09IDMgfHwgbmNoID09IDUgfHwgbmNoID09IDYpICYmCisgICAgICAgICAgdmFsaWRhdGVfYXQoQ0hJTEQodHJlZSwgMCkpICYmCisgICAgICAgICAgdmFsaWRhdGVfZG90dGVkX25hbWUoQ0hJTEQodHJlZSwgMSkpICYmCisgICAgICAgICAgdmFsaWRhdGVfbmV3bGluZShSQ0hJTEQodHJlZSwgLTEpKSk7CiAKICAgICBpZiAob2sgJiYgbmNoICE9IDMpIHsKLQlvayA9ICh2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwgMikpICYmCi0JICAgICAgdmFsaWRhdGVfcnBhcmVuKFJDSElMRCh0cmVlLCAtMikpKTsKKyAgICAgICAgb2sgPSAodmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsIDIpKSAmJgorICAgICAgICAgICAgICB2YWxpZGF0ZV9ycGFyZW4oUkNISUxEKHRyZWUsIC0yKSkpOwogCi0JaWYgKG9rICYmIG5jaCA9PSA2KQotCSAgICBvayA9IHZhbGlkYXRlX2FyZ2xpc3QoQ0hJTEQodHJlZSwgMykpOworICAgICAgICBpZiAob2sgJiYgbmNoID09IDYpCisgICAgICAgICAgICBvayA9IHZhbGlkYXRlX2FyZ2xpc3QoQ0hJTEQodHJlZSwgMykpOwogICAgIH0KIAogICAgIHJldHVybiBvazsKQEAgLTI2MDgsMTIgKzI2MDgsMTIgQEAKIHN0YXRpYyBpbnQKIHZhbGlkYXRlX2RlY29yYXRvcnMobm9kZSAqdHJlZSkKIHsKLSAgICBpbnQgaSwgbmNoLCBvazsgCisgICAgaW50IGksIG5jaCwgb2s7CiAgICAgbmNoID0gTkNIKHRyZWUpOwogICAgIG9rID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgZGVjb3JhdG9ycykgJiYgbmNoID49IDE7CiAKICAgICBmb3IgKGkgPSAwOyBvayAmJiBpIDwgbmNoOyArK2kpCi0Jb2sgPSB2YWxpZGF0ZV9kZWNvcmF0b3IoQ0hJTEQodHJlZSwgaSkpOworICAgICAgICBvayA9IHZhbGlkYXRlX2RlY29yYXRvcihDSElMRCh0cmVlLCBpKSk7CiAKICAgICByZXR1cm4gb2s7CiB9CkBAIC0yNjI4LDcgKzI2MjgsNyBAQAogICAgIGludCBvayA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCB3aXRoX2l0ZW0pCiAgICAgICAgICAgICAgICYmIChuY2ggPT0gMSB8fCBuY2ggPT0gMykKICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAwKSkpOwotICAgIGlmIChvayAmJiBuY2ggPT0gMykgCisgICAgaWYgKG9rICYmIG5jaCA9PSAzKQogICAgICAgICBvayA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDEpLCAiYXMiKQogICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9leHByKENISUxEKHRyZWUsIDIpKSk7CiAgICAgcmV0dXJuIG9rOwpAQCAtMjY1NCw3ICsyNjU0LDcgQEAKIH0KIAogLyogIGZ1bmNkZWY6Ci0gKiAgICAgIAorICoKICAqICAgICAtNSAgIC00ICAgICAgICAgLTMgIC0yICAgIC0xCiAgKiAgJ2RlZicgTkFNRSBwYXJhbWV0ZXJzICc6JyBzdWl0ZQogICovCkBAIC0yNjYzLDEyICsyNjYzLDEyIEBACiB7CiAgICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKICAgICBpbnQgb2sgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZnVuY2RlZikKLQkgICAgICAgJiYgKG5jaCA9PSA1KQotCSAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKFJDSElMRCh0cmVlLCAtNSksICJkZWYiKQotCSAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShSQ0hJTEQodHJlZSwgLTQpLCBOQU1FKQotCSAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihSQ0hJTEQodHJlZSwgLTIpKQotCSAgICAgICAmJiB2YWxpZGF0ZV9wYXJhbWV0ZXJzKFJDSElMRCh0cmVlLCAtMykpCi0JICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKFJDSElMRCh0cmVlLCAtMSkpKTsKKyAgICAgICAgICAgICAgICYmIChuY2ggPT0gNSkKKyAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoUkNISUxEKHRyZWUsIC01KSwgImRlZiIpCisgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShSQ0hJTEQodHJlZSwgLTQpLCBOQU1FKQorICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oUkNISUxEKHRyZWUsIC0yKSkKKyAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3BhcmFtZXRlcnMoUkNISUxEKHRyZWUsIC0zKSkKKyAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKFJDSElMRCh0cmVlLCAtMSkpKTsKICAgICByZXR1cm4gb2s7CiB9CiAKQEAgLTI2ODEsMTEgKzI2ODEsMTEgQEAKIHsKICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKICAgaW50IG9rID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGRlY29yYXRlZCkKLQkgICAgJiYgKG5jaCA9PSAyKQotCSAgICAmJiB2YWxpZGF0ZV9kZWNvcmF0b3JzKFJDSElMRCh0cmVlLCAtMikpCi0JICAgICYmICh2YWxpZGF0ZV9mdW5jZGVmKFJDSElMRCh0cmVlLCAtMSkpCi0JCXx8IHZhbGlkYXRlX2NsYXNzKFJDSElMRCh0cmVlLCAtMSkpKQotCSAgICApOworICAgICAgICAgICAgJiYgKG5jaCA9PSAyKQorICAgICAgICAgICAgJiYgdmFsaWRhdGVfZGVjb3JhdG9ycyhSQ0hJTEQodHJlZSwgLTIpKQorICAgICAgICAgICAgJiYgKHZhbGlkYXRlX2Z1bmNkZWYoUkNISUxEKHRyZWUsIC0xKSkKKyAgICAgICAgICAgICAgICB8fCB2YWxpZGF0ZV9jbGFzcyhSQ0hJTEQodHJlZSwgLTEpKSkKKyAgICAgICAgICAgICk7CiAgIHJldHVybiBvazsKIH0KIApAQCAtMjk2NSw4ICsyOTY1LDggQEAKIH0KIAogCi0vKiAKLSAqIGRpY3RvcnNldG1ha2VyOiAKKy8qCisgKiBkaWN0b3JzZXRtYWtlcjoKICAqCiAgKiAodGVzdCAnOicgdGVzdCAoY29tcF9mb3IgfCAoJywnIHRlc3QgJzonIHRlc3QpKiBbJywnXSkpIHwKICAqICh0ZXN0IChjb21wX2ZvciB8ICgnLCcgdGVzdCkqIFsnLCddKSkKQEAgLTI5ODMsNyArMjk4Myw3IEBACiAKICAgICBpZiAob2sgJiYgKG5jaCA9PSAxIHx8IFRZUEUoQ0hJTEQodHJlZSwgMSkpID09IENPTU1BKSkgewogICAgICAgICAvKiBXZSBnb3QgYSBzZXQ6Ci0gICAgICAgICAqICAgICB0ZXN0ICgnLCcgdGVzdCkqIFsnLCddIAorICAgICAgICAgKiAgICAgdGVzdCAoJywnIHRlc3QpKiBbJywnXQogICAgICAgICAgKi8KICAgICAgICAgb2sgPSB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIGkrKykpOwogICAgICAgICB3aGlsZSAob2sgJiYgbmNoIC0gaSA+PSAyKSB7CkBAIC0zMDg2LDkgKzMwODYsOSBAQAogICAgICAgICAgIGNhc2UgY2xhc3NkZWY6CiAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jbGFzcyh0cmVlKTsKICAgICAgICAgICAgIGJyZWFrOwotCSAgY2FzZSBkZWNvcmF0ZWQ6Ci0JICAgIHJlcyA9IHZhbGlkYXRlX2RlY29yYXRlZCh0cmVlKTsKLQkgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBkZWNvcmF0ZWQ6CisgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9kZWNvcmF0ZWQodHJlZSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiAgIlRyaXZpYWwiIHBhcnNlIHRyZWUgbm9kZXMuCiAgICAgICAgICAgICAgKiAgKFdoeSBkaWQgSSBjYWxsIHRoZXNlIHRyaXZpYWw/KQpAQCAtMzE2MCwxMiArMzE2MCwxMiBAQAogICAgICAgICAgIGNhc2UgaW1wb3J0X3N0bXQ6CiAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfc3RtdCh0cmVlKTsKICAgICAgICAgICAgIGJyZWFrOwotCSAgY2FzZSBpbXBvcnRfbmFtZToKLQkgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X25hbWUodHJlZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBpbXBvcnRfZnJvbToKLQkgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X2Zyb20odHJlZSk7Ci0JICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgaW1wb3J0X25hbWU6CisgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfbmFtZSh0cmVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgaW1wb3J0X2Zyb206CisgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfZnJvbSh0cmVlKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgZ2xvYmFsX3N0bXQ6CiAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9nbG9iYWxfc3RtdCh0cmVlKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzQwMSw3ICszNDAxLDcgQEAKICAgICBQeV9UWVBFKCZQeVNUX1R5cGUpID0gJlB5VHlwZV9UeXBlOwogICAgIG1vZHVsZSA9IFB5X0luaXRNb2R1bGUoInBhcnNlciIsIHBhcnNlcl9mdW5jdGlvbnMpOwogICAgIGlmIChtb2R1bGUgPT0gTlVMTCkKLSAgICAJcmV0dXJuOworICAgICAgICByZXR1cm47CiAKICAgICBpZiAocGFyc2VyX2Vycm9yID09IDApCiAgICAgICAgIHBhcnNlcl9lcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigicGFyc2VyLlBhcnNlckVycm9yIiwgTlVMTCwgTlVMTCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3B1cmVtb2R1bGUuYyBiL01vZHVsZXMvcHVyZW1vZHVsZS5jCmluZGV4IGVkZTYzYWIuLmI4OWYxNzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcHVyZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvcHVyZW1vZHVsZS5jCkBAIC01OCwxMDcgKzU4LDEwNyBAQAogdHlwZWRlZiBpbnQgKCpTdHJpbmdJbnRBcmdGdW5jKShjb25zdCBjaGFyKiwgaW50KTsKIAogCi0MCisKIHN0YXRpYyBQeU9iamVjdCoKIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihWb2lkQXJnRnVuYyBmdW5jLCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN0YXR1czsKKyAgICBpbnQgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGF0dXMgPSBmdW5jKCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIHN0YXR1cyA9IGZ1bmMoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGNhbGxfc3RyaW5nYXJnX2Z1bmN0aW9uKFN0cmluZ0FyZ0Z1bmMgZnVuYywgUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzdGF0dXM7Ci0JY2hhciogc3RyaW5nYXJnOworICAgIGludCBzdGF0dXM7CisgICAgY2hhciogc3RyaW5nYXJnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnN0cmluZ2FyZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHJpbmdhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IGZ1bmMoc3RyaW5nYXJnKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CisgICAgc3RhdHVzID0gZnVuYyhzdHJpbmdhcmcpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogY2FsbF9zdHJpbmdvcmludF9mdW5jdGlvbihTdHJpbmdBcmdGdW5jIGZ1bmMsIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc3RhdHVzOwotCWludCBpbnRhcmc7Ci0JY2hhciogc3RyaW5nYXJnOworICAgIGludCBzdGF0dXM7CisgICAgaW50IGludGFyZzsKKyAgICBjaGFyKiBzdHJpbmdhcmc7CiAKLSAgICAgICAgLyogYWNjb3JkaW5nIHRvIHRoZSBxdWFudGlmeS5oIGZpbGUsIHRoZSBhcmd1bWVudCB0bwotICAgICAgICAgKiBxdWFudGlmeV8qX3JlY29yZGluZ19zeXN0ZW1fY2FsbCBjYW4gYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywKLQkgKiBidXQgdGhlIGZ1bmN0aW9ucyBhcmUgcHJvdG90eXBlZCBhcyB0YWtpbmcgYSBzaW5nbGUgY2hhcioKLQkgKiBhcmd1bWVudC4gWWlrZXMhCisgICAgLyogYWNjb3JkaW5nIHRvIHRoZSBxdWFudGlmeS5oIGZpbGUsIHRoZSBhcmd1bWVudCB0bworICAgICAqIHF1YW50aWZ5XypfcmVjb3JkaW5nX3N5c3RlbV9jYWxsIGNhbiBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLAorICAgICAqIGJ1dCB0aGUgZnVuY3Rpb25zIGFyZSBwcm90b3R5cGVkIGFzIHRha2luZyBhIHNpbmdsZSBjaGFyKgorICAgICAqIGFyZ3VtZW50LiBZaWtlcyEKKyAgICAgKi8KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZpbnRhcmcpKQorICAgICAgICAvKiBmdW5jIGlzIHByb3RvdHlwZWQgYXMgaW50KCopKGNoYXIqKQorICAgICAgICAgKiBiZXR0ZXIgc2h1dCB1cCB0aGUgY29tcGlsZXIKICAgICAgICAgICovCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmaW50YXJnKSkKLQkJLyogZnVuYyBpcyBwcm90b3R5cGVkIGFzIGludCgqKShjaGFyKikKLQkJICogYmV0dGVyIHNodXQgdXAgdGhlIGNvbXBpbGVyCi0JCSAqLwotCQlzdGF0dXMgPSBmdW5jKChjaGFyKilpbnRhcmcpOworICAgICAgICBzdGF0dXMgPSBmdW5jKChjaGFyKilpbnRhcmcpOwogCi0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHJpbmdhcmcpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UKLQkJCXN0YXR1cyA9IGZ1bmMoc3RyaW5nYXJnKTsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc3RyaW5nYXJnKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0dXMgPSBmdW5jKHN0cmluZ2FyZyk7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogY2FsbF9wcmludGZpc2hfZnVuY3Rpb24oUHJpbnRmaXNoRnVuYyBmdW5jLCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JLyogd2Ugc3VwcG9ydCB0aGUgcHJpbnRmKCkgc3R5bGUgdmFyYXJnIGZ1bmN0aW9ucyBieSByZXF1aXJpbmcgdGhlCi0gICAgICAgICAqIGZvcm1hdHRpbmcgYmUgZG9uZSBpbiBQeXRob24uICBBdCB0aGUgQyBsZXZlbCB3ZSBwYXNzIGp1c3QgYSBzdHJpbmcKLSAgICAgICAgICogdG8gdGhlIHByaW50ZigpIHN0eWxlIGZ1bmN0aW9uLgotICAgICAgICAgKi8KLQlpbnQgc3RhdHVzOwotCWNoYXIqIGFyZ3N0cmluZzsKKyAgICAvKiB3ZSBzdXBwb3J0IHRoZSBwcmludGYoKSBzdHlsZSB2YXJhcmcgZnVuY3Rpb25zIGJ5IHJlcXVpcmluZyB0aGUKKyAgICAgKiBmb3JtYXR0aW5nIGJlIGRvbmUgaW4gUHl0aG9uLiAgQXQgdGhlIEMgbGV2ZWwgd2UgcGFzcyBqdXN0IGEgc3RyaW5nCisgICAgICogdG8gdGhlIHByaW50ZigpIHN0eWxlIGZ1bmN0aW9uLgorICAgICAqLworICAgIGludCBzdGF0dXM7CisgICAgY2hhciogYXJnc3RyaW5nOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJmFyZ3N0cmluZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZhcmdzdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IGZ1bmMoIiVzIiwgYXJnc3RyaW5nKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CisgICAgc3RhdHVzID0gZnVuYygiJXMiLCBhcmdzdHJpbmcpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24oU3RyaW5nQXJnRnVuYyBmdW5jLCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBtZW1yZXA7Ci0JaW50IGlkOworICAgIGxvbmcgbWVtcmVwOworICAgIGludCBpZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZtZW1yZXApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmbWVtcmVwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZCA9IGZ1bmMoKGNoYXIqKW1lbXJlcCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBpZCk7CisgICAgaWQgPSBmdW5jKChjaGFyKiltZW1yZXApOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgaWQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBjYWxsX3N0cmluZ2FuZGludF9mdW5jdGlvbihTdHJpbmdJbnRBcmdGdW5jIGZ1bmMsIFB5T2JqZWN0ICpzZWxmLAotCQkJICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHNyY3JlcDsKLQlpbnQgc2l6ZTsKLQlpbnQgc3RhdHVzOworICAgIGxvbmcgc3JjcmVwOworICAgIGludCBzaXplOworICAgIGludCBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpIiwgJnNyY3JlcCwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpIiwgJnNyY3JlcCwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IGZ1bmMoKGNoYXIqKXNyY3JlcCwgc2l6ZSk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIHN0YXR1cyA9IGZ1bmMoKGNoYXIqKXNyY3JlcCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOwogfQogCiAKLQwKKwogLyogZnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgcHJvZHVjdHMKICAqCiAgKiBOLkIuIFRoZXNlIHByaW50ZigpIHN0eWxlIGZ1bmN0aW9ucyBhcmUgYSBiaXQgb2YgYSBrbHVkZ2UuICBTaW5jZSB0aGUKQEAgLTE3NCwyNiArMTc0LDI2IEBACiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmVfbG9nZmlsZV9wcmludGYoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCXJldHVybiBjYWxsX3ByaW50ZmlzaF9mdW5jdGlvbihwdXJlX2xvZ2ZpbGVfcHJpbnRmLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9wcmludGZpc2hfZnVuY3Rpb24ocHVyZV9sb2dmaWxlX3ByaW50Ziwgc2VsZiwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyZV9wcmludGYoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCXJldHVybiBjYWxsX3ByaW50ZmlzaF9mdW5jdGlvbihwdXJlX3ByaW50Ziwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfcHJpbnRmaXNoX2Z1bmN0aW9uKHB1cmVfcHJpbnRmLCBzZWxmLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJlX3ByaW50Zl93aXRoX2Jhbm5lcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfcHJpbnRmaXNoX2Z1bmN0aW9uKHB1cmVfcHJpbnRmX3dpdGhfYmFubmVyLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9wcmludGZpc2hfZnVuY3Rpb24ocHVyZV9wcmludGZfd2l0aF9iYW5uZXIsIHNlbGYsIGFyZ3MpOwogfQogCiAKICNlbmRpZiAvKiBDT01NT05fUFVSRV9GVU5DVElPTlMgKi8KIAogCi0MCisKIC8qIFB1cmlmeSBmdW5jdGlvbnMKICAqCiAgKiBOLkIuIFRoZXJlIGFyZSBzb21lIGludGVyZmFjZXMgZGVzY3JpYmVkIGluIHRoZSBwdXJpZnkuaCBmaWxlIHRoYXQgYXJlCkBAIC0yMzUsOTcgKzIzNSw5NyBAQAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfYWxsX2ludXNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9hbGxfaW51c2UsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2FsbF9pbnVzZSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9hbGxfbGVha3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2FsbF9sZWFrcywgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfYWxsX2xlYWtzLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X25ld19pbnVzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfbmV3X2ludXNlLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9uZXdfaW51c2UsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfbmV3X2xlYWtzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9uZXdfbGVha3MsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X25ld19sZWFrcywgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9jbGVhcl9pbnVzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfY2xlYXJfaW51c2UsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2NsZWFyX2ludXNlLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2NsZWFyX2xlYWtzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9jbGVhcl9sZWFrcywgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfY2xlYXJfbGVha3MsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfYWxsX2Zkc19pbnVzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfYWxsX2Zkc19pbnVzZSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfYWxsX2Zkc19pbnVzZSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9uZXdfZmRzX2ludXNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9uZXdfZmRzX2ludXNlLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9uZXdfZmRzX2ludXNlLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3ByaW50Zl93aXRoX2NhbGxfY2hhaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ByaW50ZmlzaF9mdW5jdGlvbihwdXJpZnlfcHJpbnRmX3dpdGhfY2FsbF9jaGFpbiwKLQkJCQkgICAgICAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfcHJpbnRmaXNoX2Z1bmN0aW9uKHB1cmlmeV9wcmludGZfd2l0aF9jYWxsX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3NldF9wb29sX2lkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIG1lbXJlcDsKLQlpbnQgaWQ7CisgICAgbG9uZyBtZW1yZXA7CisgICAgaW50IGlkOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaTpwdXJpZnlfc2V0X3Bvb2xfaWQiLCAmbWVtcmVwLCAmaWQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpOnB1cmlmeV9zZXRfcG9vbF9pZCIsICZtZW1yZXAsICZpZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcHVyaWZ5X3NldF9wb29sX2lkKChjaGFyKiltZW1yZXAsIGlkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcHVyaWZ5X3NldF9wb29sX2lkKChjaGFyKiltZW1yZXAsIGlkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9nZXRfcG9vbF9pZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV9nZXRfcG9vbF9pZCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV9nZXRfcG9vbF9pZCwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9zZXRfdXNlcl9kYXRhKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIG1lbXJlcDsKLQlsb25nIGRhdGFyZXA7CisgICAgbG9uZyBtZW1yZXA7CisgICAgbG9uZyBkYXRhcmVwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsbDpwdXJpZnlfc2V0X3VzZXJfZGF0YSIsICZtZW1yZXAsICZkYXRhcmVwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsbDpwdXJpZnlfc2V0X3VzZXJfZGF0YSIsICZtZW1yZXAsICZkYXRhcmVwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlwdXJpZnlfc2V0X3VzZXJfZGF0YSgoY2hhciopbWVtcmVwLCAodm9pZCopZGF0YXJlcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHB1cmlmeV9zZXRfdXNlcl9kYXRhKChjaGFyKiltZW1yZXAsICh2b2lkKilkYXRhcmVwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9nZXRfdXNlcl9kYXRhKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgLyogY2FuJ3QgdXNlIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKCkgc2luY2UgcHVyaWZ5X2dldF91c2VyX2RhdGEoKQotICAgICAgICAgKiByZXR1cm5zIGEgdm9pZCoKLSAgICAgICAgICovCi0JbG9uZyBtZW1yZXA7Ci0Jdm9pZCogZGF0YTsKKyAgICAvKiBjYW4ndCB1c2UgY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24oKSBzaW5jZSBwdXJpZnlfZ2V0X3VzZXJfZGF0YSgpCisgICAgICogcmV0dXJucyBhIHZvaWQqCisgICAgICovCisgICAgbG9uZyBtZW1yZXA7CisgICAgdm9pZCogZGF0YTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpwdXJpZnlfZ2V0X3VzZXJfZGF0YSIsICZtZW1yZXApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6cHVyaWZ5X2dldF91c2VyX2RhdGEiLCAmbWVtcmVwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlkYXRhID0gcHVyaWZ5X2dldF91c2VyX2RhdGEoKGNoYXIqKW1lbXJlcCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylkYXRhKTsKKyAgICBkYXRhID0gcHVyaWZ5X2dldF91c2VyX2RhdGEoKGNoYXIqKW1lbXJlcCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylkYXRhKTsKIH0KIAotDAorCiAvKiB0aGlzIGdsb2JhbCB2YXJpYWJsZSBpcyBzaGFyZWQgYnkgYm90aCBtYXBwaW5nIGZ1bmN0aW9uczoKICAqIHB1cmVfcHVyaWZ5X21hcF9wb29sKCkgYW5kIHB1cmVfcHVyaWZ5X21hcF9wb29sX2lkKCkuICBTaW5jZSB0aGV5IGNhY2hlCiAgKiB0aGlzIHZhcmlhYmxlIGl0IHNob3VsZCBiZSBzYWZlIGluIHRoZSBmYWNlIG9mIHJlY3Vyc2lvbiBvciBjcm9zcwpAQCAtMzQxLDMwMyArMzQxLDMwMyBAQAogc3RhdGljIHZvaWQKIG1hcF9wb29sX2NhbGxiYWNrKGNoYXIqIG1lbSwgaW50IHVzZXJfc2l6ZSwgdm9pZCAqdXNlcl9hdXhfZGF0YSkKIHsKLQlsb25nIG1lbXJlcCA9IChsb25nKW1lbTsKLQlsb25nIHVzZXJfYXV4X2RhdGFfcmVwID0gKGxvbmcpdXNlcl9hdXhfZGF0YTsKLQlQeU9iamVjdCogcmVzdWx0OwotCVB5T2JqZWN0KiBtZW1vYmogPSBQeV9CdWlsZFZhbHVlKCJsaWwiLCBtZW1yZXAsIHVzZXJfc2l6ZSwKLQkJCQkJIHVzZXJfYXV4X2RhdGFfcmVwKTsKKyAgICBsb25nIG1lbXJlcCA9IChsb25nKW1lbTsKKyAgICBsb25nIHVzZXJfYXV4X2RhdGFfcmVwID0gKGxvbmcpdXNlcl9hdXhfZGF0YTsKKyAgICBQeU9iamVjdCogcmVzdWx0OworICAgIFB5T2JqZWN0KiBtZW1vYmogPSBQeV9CdWlsZFZhbHVlKCJsaWwiLCBtZW1yZXAsIHVzZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2F1eF9kYXRhX3JlcCk7CiAKLQlpZiAobWVtb2JqID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBpZiAobWVtb2JqID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KE1hcENhbGxhYmxlLCBtZW1vYmopOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5X0RFQ1JFRihtZW1vYmopOworICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KE1hcENhbGxhYmxlLCBtZW1vYmopOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRihtZW1vYmopOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9tYXBfcG9vbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIC8qIGNhY2hlIGdsb2JhbCB2YXJpYWJsZSBpbiBjYXNlIG9mIHJlY3Vyc2lvbiAqLwotCVB5T2JqZWN0KiBzYXZlZF9jYWxsYWJsZSA9IE1hcENhbGxhYmxlOwotCVB5T2JqZWN0KiBhcmdfY2FsbGFibGU7Ci0JaW50IGlkOworICAgIC8qIGNhY2hlIGdsb2JhbCB2YXJpYWJsZSBpbiBjYXNlIG9mIHJlY3Vyc2lvbiAqLworICAgIFB5T2JqZWN0KiBzYXZlZF9jYWxsYWJsZSA9IE1hcENhbGxhYmxlOworICAgIFB5T2JqZWN0KiBhcmdfY2FsbGFibGU7CisgICAgaW50IGlkOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpwdXJpZnlfbWFwX3Bvb2wiLCAmaWQsICZhcmdfY2FsbGFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOnB1cmlmeV9tYXBfcG9vbCIsICZpZCwgJmFyZ19jYWxsYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGFyZ19jYWxsYWJsZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCU1hcENhbGxhYmxlID0gYXJnX2NhbGxhYmxlOwotCXB1cmlmeV9tYXBfcG9vbChpZCwgbWFwX3Bvb2xfY2FsbGJhY2spOwotCU1hcENhbGxhYmxlID0gc2F2ZWRfY2FsbGFibGU7CisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGFyZ19jYWxsYWJsZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgTWFwQ2FsbGFibGUgPSBhcmdfY2FsbGFibGU7CisgICAgcHVyaWZ5X21hcF9wb29sKGlkLCBtYXBfcG9vbF9jYWxsYmFjayk7CisgICAgTWFwQ2FsbGFibGUgPSBzYXZlZF9jYWxsYWJsZTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyB2b2lkCiBQdXJpZnlNYXBQb29sSWRDYWxsYmFjayhpbnQgaWQpCiB7Ci0JUHlPYmplY3QqIHJlc3VsdDsKLQlQeU9iamVjdCogaW50b2JqID0gUHlfQnVpbGRWYWx1ZSgiaSIsIGlkKTsKKyAgICBQeU9iamVjdCogcmVzdWx0OworICAgIFB5T2JqZWN0KiBpbnRvYmogPSBQeV9CdWlsZFZhbHVlKCJpIiwgaWQpOwogCi0JaWYgKGludG9iaiA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgaWYgKGludG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChNYXBDYWxsYWJsZSwgaW50b2JqKTsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9ERUNSRUYoaW50b2JqKTsKKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChNYXBDYWxsYWJsZSwgaW50b2JqKTsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBQeV9ERUNSRUYoaW50b2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfbWFwX3Bvb2xfaWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICAvKiBjYWNoZSBnbG9iYWwgdmFyaWFibGUgaW4gY2FzZSBvZiByZWN1cnNpb24gKi8KLQlQeU9iamVjdCogc2F2ZWRfY2FsbGFibGUgPSBNYXBDYWxsYWJsZTsKLQlQeU9iamVjdCogYXJnX2NhbGxhYmxlOworICAgIC8qIGNhY2hlIGdsb2JhbCB2YXJpYWJsZSBpbiBjYXNlIG9mIHJlY3Vyc2lvbiAqLworICAgIFB5T2JqZWN0KiBzYXZlZF9jYWxsYWJsZSA9IE1hcENhbGxhYmxlOworICAgIFB5T2JqZWN0KiBhcmdfY2FsbGFibGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86cHVyaWZ5X21hcF9wb29sX2lkIiwgJmFyZ19jYWxsYWJsZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpwdXJpZnlfbWFwX3Bvb2xfaWQiLCAmYXJnX2NhbGxhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soYXJnX2NhbGxhYmxlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZS4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhhcmdfY2FsbGFibGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJBcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlNYXBDYWxsYWJsZSA9IGFyZ19jYWxsYWJsZTsKLQlwdXJpZnlfbWFwX3Bvb2xfaWQoUHVyaWZ5TWFwUG9vbElkQ2FsbGJhY2spOwotCU1hcENhbGxhYmxlID0gc2F2ZWRfY2FsbGFibGU7CisgICAgTWFwQ2FsbGFibGUgPSBhcmdfY2FsbGFibGU7CisgICAgcHVyaWZ5X21hcF9wb29sX2lkKFB1cmlmeU1hcFBvb2xJZENhbGxiYWNrKTsKKyAgICBNYXBDYWxsYWJsZSA9IHNhdmVkX2NhbGxhYmxlOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCi0MCisKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X25ld19tZXNzYWdlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfbmV3X21lc3NhZ2VzLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9uZXdfbWVzc2FnZXMsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfYWxsX21lc3NhZ2VzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9hbGxfbWVzc2FnZXMsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2FsbF9tZXNzYWdlcywgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9jbGVhcl9tZXNzYWdlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfY2xlYXJfbWVzc2FnZXMsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2NsZWFyX21lc3NhZ2VzLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2NsZWFyX25ld19tZXNzYWdlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfY2xlYXJfbmV3X21lc3NhZ2VzLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9jbGVhcl9uZXdfbWVzc2FnZXMsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfc3RhcnRfYmF0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X3N0YXJ0X2JhdGNoLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9zdGFydF9iYXRjaCwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9zdGFydF9iYXRjaF9zaG93X2ZpcnN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9zdGFydF9iYXRjaF9zaG93X2ZpcnN0LAotCQkJCSAgICAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfc3RhcnRfYmF0Y2hfc2hvd19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfc3RvcF9iYXRjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfc3RvcF9iYXRjaCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfc3RvcF9iYXRjaCwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9uYW1lX3RocmVhZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIC8qIGNhbid0IHN0cmljdGx5IHVzZSBjYWxsX3N0cmluZ2FyZ19mdW5jdGlvbiBzaW5jZQotICAgICAgICAgKiBwdXJpZnlfbmFtZV90aHJlYWQgdGFrZXMgYSBjb25zdCBjaGFyKiwgbm90IGEgY2hhcioKLSAgICAgICAgICovCi0JaW50IHN0YXR1czsKLQljaGFyKiBzdHJpbmdhcmc7CisgICAgLyogY2FuJ3Qgc3RyaWN0bHkgdXNlIGNhbGxfc3RyaW5nYXJnX2Z1bmN0aW9uIHNpbmNlCisgICAgICogcHVyaWZ5X25hbWVfdGhyZWFkIHRha2VzIGEgY29uc3QgY2hhciosIG5vdCBhIGNoYXIqCisgICAgICovCisgICAgaW50IHN0YXR1czsKKyAgICBjaGFyKiBzdHJpbmdhcmc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6cHVyaWZ5X25hbWVfdGhyZWFkIiwgJnN0cmluZ2FyZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpwdXJpZnlfbmFtZV90aHJlYWQiLCAmc3RyaW5nYXJnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGF0dXMgPSBwdXJpZnlfbmFtZV90aHJlYWQoc3RyaW5nYXJnKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CisgICAgc3RhdHVzID0gcHVyaWZ5X25hbWVfdGhyZWFkKHN0cmluZ2FyZyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2gsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2gsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfMShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF8xLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoXzEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF8yLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoXzIsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfNChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF80LCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoXzQsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfOChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF84LCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoXzgsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfd18xKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3dfMSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfd18yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3dfMiwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzIsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfd180KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3dfNCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzQsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfd184KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3dfOCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzgsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcl8xKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3JfMSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcl8yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3JfMiwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzIsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcl80KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3JfNCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzQsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcl84KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3JfOCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzgsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcndfMShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd18xLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3J3XzEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcndfMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd18yLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3J3XzIsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcndfNChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd180LCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3J3XzQsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcndfOChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd184LCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3J3XzgsIHNlbGYsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV93YXRjaF9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFkZHJyZXA7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0JY2hhciogdHlwZTsKLQlpbnQgc3RhdHVzOworICAgIGxvbmcgYWRkcnJlcDsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICBjaGFyKiB0eXBlOworICAgIGludCBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpczpwdXJpZnlfd2F0Y2hfbiIsICZhZGRycmVwLCAmc2l6ZSwgJnR5cGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpczpwdXJpZnlfd2F0Y2hfbiIsICZhZGRycmVwLCAmc2l6ZSwgJnR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IHB1cmlmeV93YXRjaF9uKChjaGFyKilhZGRycmVwLCBzaXplLCB0eXBlKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CisgICAgc3RhdHVzID0gcHVyaWZ5X3dhdGNoX24oKGNoYXIqKWFkZHJyZXAsIHNpemUsIHR5cGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfaW5mbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfd2F0Y2hfaW5mbywgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfd2F0Y2hfaW5mbywgc2VsZiwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3JlbW92ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHdhdGNobm87Ci0JaW50IHN0YXR1czsKKyAgICBpbnQgd2F0Y2hubzsKKyAgICBpbnQgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnB1cmlmeV93YXRjaF9yZW1vdmUiLCAmd2F0Y2hubykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpwdXJpZnlfd2F0Y2hfcmVtb3ZlIiwgJndhdGNobm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IHB1cmlmeV93YXRjaF9yZW1vdmUod2F0Y2hubyk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIHN0YXR1cyA9IHB1cmlmeV93YXRjaF9yZW1vdmUod2F0Y2hubyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV93YXRjaF9yZW1vdmVfYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yZW1vdmVfYWxsLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yZW1vdmVfYWxsLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2Rlc2NyaWJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFkZHJyZXA7Ci0JY2hhciogcnRuOworICAgIGxvbmcgYWRkcnJlcDsKKyAgICBjaGFyKiBydG47CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6cHVyaWZ5X2Rlc2NyaWJlIiwgJmFkZHJyZXApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6cHVyaWZ5X2Rlc2NyaWJlIiwgJmFkZHJyZXApKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJ0biA9IHB1cmlmeV9kZXNjcmliZSgoY2hhciopYWRkcnJlcCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylydG4pOworICAgIHJ0biA9IHB1cmlmeV9kZXNjcmliZSgoY2hhciopYWRkcnJlcCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylydG4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV93aGF0X2NvbG9ycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhZGRycmVwOwotCXVuc2lnbmVkIGludCBzaXplOwotCWludCBzdGF0dXM7Ci0gICAgCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaTpwdXJpZnlfd2hhdF9jb2xvcnMiLCAmYWRkcnJlcCwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBsb25nIGFkZHJyZXA7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgaW50IHN0YXR1czsKIAotCXN0YXR1cyA9IHB1cmlmeV93aGF0X2NvbG9ycygoY2hhciopYWRkcnJlcCwgc2l6ZSk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGk6cHVyaWZ5X3doYXRfY29sb3JzIiwgJmFkZHJyZXAsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzdGF0dXMgPSBwdXJpZnlfd2hhdF9jb2xvcnMoKGNoYXIqKWFkZHJyZXAsIHNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfaXNfcnVubmluZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfaXNfcnVubmluZywgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfaXNfcnVubmluZywgc2VsZiwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2Fzc2VydF9pc19yZWFkYWJsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfc3RyaW5nYW5kaW50X2Z1bmN0aW9uKHB1cmlmeV9hc3NlcnRfaXNfcmVhZGFibGUsCi0JCQkJCSAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfc3RyaW5nYW5kaW50X2Z1bmN0aW9uKHB1cmlmeV9hc3NlcnRfaXNfcmVhZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfYXNzZXJ0X2lzX3dyaXRhYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9zdHJpbmdhbmRpbnRfZnVuY3Rpb24ocHVyaWZ5X2Fzc2VydF9pc193cml0YWJsZSwKLQkJCQkJICBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9zdHJpbmdhbmRpbnRfZnVuY3Rpb24ocHVyaWZ5X2Fzc2VydF9pc193cml0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncyk7CiB9CiAKICNpZiBIQVNfUFVSSUZZX0VYSVQKQEAgLTY0OSwyMiArNjQ5LDIyIEBACiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9leGl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc3RhdHVzOworICAgIGludCBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cHVyaWZ5X2V4aXQiLCAmc3RhdHVzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnB1cmlmeV9leGl0IiwgJnN0YXR1cykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIC8qIHB1cmlmeV9leGl0IGRvZXNuJ3QgYWx3YXlzIGFjdCBsaWtlIGV4aXQoKS4gU2VlIHRoZSBtYW51YWwgKi8KLQlwdXJpZnlfZXhpdChzdGF0dXMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAvKiBwdXJpZnlfZXhpdCBkb2Vzbid0IGFsd2F5cyBhY3QgbGlrZSBleGl0KCkuIFNlZSB0aGUgbWFudWFsICovCisgICAgcHVyaWZ5X2V4aXQoc3RhdHVzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYgLyogSEFTX1BVUklGWV9FWElUICovCiAKICNlbmRpZiAvKiBQVVJJRllfSCAqLwogCiAKLQwKKwogLyogUXVhbnRpZnkgZnVuY3Rpb25zCiAgKgogICogTi5CLiBTb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBkZXNjcmliZWQgaW4gdGhlIHF1YW50aWZ5LmggZmlsZSwKQEAgLTY4MCwxNDQgKzY4MCwxNDQgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfaXNfcnVubmluZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9pc19ydW5uaW5nLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2lzX3J1bm5pbmcsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9oZWxwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2hlbHAsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfaGVscCwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3ByaW50X3JlY29yZGluZ19zdGF0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9wcmludF9yZWNvcmRpbmdfc3RhdGUsCi0JCQkJICAgICBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3ByaW50X3JlY29yZGluZ19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfZGF0YSwKLQkJCQkgICAgIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9zdG9wX3JlY29yZGluZ19kYXRhLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX2RhdGEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9pc19yZWNvcmRpbmdfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9pc19yZWNvcmRpbmdfZGF0YSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9pc19yZWNvcmRpbmdfZGF0YSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3N0YXJ0X3JlY29yZGluZ19zeXN0ZW1fY2FsbHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX3N5c3RlbV9jYWxscywKLQkJCQkgICAgIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX3N5c3RlbV9jYWxscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zdG9wX3JlY29yZGluZ19zeXN0ZW1fY2FsbHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfc3lzdGVtX2NhbGxzLAotCQkJCSAgICAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9zdG9wX3JlY29yZGluZ19zeXN0ZW1fY2FsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfaXNfcmVjb3JkaW5nX3N5c3RlbV9jYWxscyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9pc19yZWNvcmRpbmdfc3lzdGVtX2NhbGxzLAotCQkJCSAgICAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9pc19yZWNvcmRpbmdfc3lzdGVtX2NhbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3N0YXJ0X3JlY29yZGluZ19zeXN0ZW1fY2FsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfc3RyaW5nb3JpbnRfZnVuY3Rpb24ocXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX3N5c3RlbV9jYWxsLAotCQkJCQkgICBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9zdHJpbmdvcmludF9mdW5jdGlvbihxdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfc3lzdGVtX2NhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfc3lzdGVtX2NhbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3N0cmluZ29yaW50X2Z1bmN0aW9uKHF1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX3N5c3RlbV9jYWxsLAotCQkJCQkgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfc3RyaW5nb3JpbnRfZnVuY3Rpb24ocXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfc3lzdGVtX2NhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X2lzX3JlY29yZGluZ19zeXN0ZW1fY2FsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfc3RyaW5nb3JpbnRfZnVuY3Rpb24ocXVhbnRpZnlfaXNfcmVjb3JkaW5nX3N5c3RlbV9jYWxsLAotCQkJCQkgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfc3RyaW5nb3JpbnRfZnVuY3Rpb24ocXVhbnRpZnlfaXNfcmVjb3JkaW5nX3N5c3RlbV9jYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfZHluYW1pY19saWJyYXJ5X2RhdGEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCi0JCXF1YW50aWZ5X3N0YXJ0X3JlY29yZGluZ19keW5hbWljX2xpYnJhcnlfZGF0YSwKLQkJc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbigKKyAgICAgICAgcXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX2R5bmFtaWNfbGlicmFyeV9kYXRhLAorICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfZHluYW1pY19saWJyYXJ5X2RhdGEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCi0JCXF1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX2R5bmFtaWNfbGlicmFyeV9kYXRhLAotCQlzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAorICAgICAgICBxdWFudGlmeV9zdG9wX3JlY29yZGluZ19keW5hbWljX2xpYnJhcnlfZGF0YSwKKyAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X2lzX3JlY29yZGluZ19keW5hbWljX2xpYnJhcnlfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbigKLQkJcXVhbnRpZnlfaXNfcmVjb3JkaW5nX2R5bmFtaWNfbGlicmFyeV9kYXRhLAotCQlzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAorICAgICAgICBxdWFudGlmeV9pc19yZWNvcmRpbmdfZHluYW1pY19saWJyYXJ5X2RhdGEsCisgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAotCQlxdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzLAotCQlzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAorICAgICAgICBxdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzLAorICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAotCQlxdWFudGlmeV9zdG9wX3JlY29yZGluZ19yZWdpc3Rlcl93aW5kb3dfdHJhcHMsCi0JCXNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCisgICAgICAgIHF1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX3JlZ2lzdGVyX3dpbmRvd190cmFwcywKKyAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X2lzX3JlY29yZGluZ19yZWdpc3Rlcl93aW5kb3dfdHJhcHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCi0JCXF1YW50aWZ5X2lzX3JlY29yZGluZ19yZWdpc3Rlcl93aW5kb3dfdHJhcHMsCi0JCXNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCisgICAgICAgIHF1YW50aWZ5X2lzX3JlY29yZGluZ19yZWdpc3Rlcl93aW5kb3dfdHJhcHMsCisgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9kaXNhYmxlX3JlY29yZGluZ19kYXRhKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2Rpc2FibGVfcmVjb3JkaW5nX2RhdGEsCi0JCQkJICAgICBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2Rpc2FibGVfcmVjb3JkaW5nX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfY2xlYXJfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9jbGVhcl9kYXRhLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2NsZWFyX2RhdGEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zYXZlX2RhdGEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc2F2ZV9kYXRhLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3NhdmVfZGF0YSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3NhdmVfZGF0YV90b19maWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9zdHJpbmdhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc2F2ZV9kYXRhX3RvX2ZpbGUsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3N0cmluZ2FyZ19mdW5jdGlvbihxdWFudGlmeV9zYXZlX2RhdGFfdG9fZmlsZSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X2FkZF9hbm5vdGF0aW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9zdHJpbmdhcmdfZnVuY3Rpb24ocXVhbnRpZnlfYWRkX2Fubm90YXRpb24sIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3N0cmluZ2FyZ19mdW5jdGlvbihxdWFudGlmeV9hZGRfYW5ub3RhdGlvbiwgc2VsZiwgYXJncyk7CiB9CiAKICNlbmRpZiAvKiBRVUFOVElGWV9IICovCiAKIAotDAorCiAvKiBleHRlcm5hbCBpbnRlcmZhY2UKICAqLwogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZgpAQCAtOTI3LDY2ICs5MjcsNjYgQEAKICAgICB7InF1YW50aWZ5X3NhdmVfZGF0YV90b19maWxlIiwgcHVyZV9xdWFudGlmeV9zYXZlX2RhdGFfdG9fZmlsZSwgTUVUSF9WQVJBUkdTfSwKICAgICB7InF1YW50aWZ5X2FkZF9hbm5vdGF0aW9uIiwgICAgcHVyZV9xdWFudGlmeV9hZGRfYW5ub3RhdGlvbiwgICAgTUVUSF9WQVJBUkdTfSwKICNlbmRpZiAvKiBRVUFOVElGWV9IICovCi0gICAge05VTEwsICBOVUxMfQkJCSAgICAgLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgIE5VTEx9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKLQwKKwogc3RhdGljIHZvaWQKIGlucyhkLCBuYW1lLCB2YWwpCi0JUHlPYmplY3QgKmQ7Ci0JY2hhciogbmFtZTsKLQlsb25nIHZhbDsKKyAgICBQeU9iamVjdCAqZDsKKyAgICBjaGFyKiBuYW1lOworICAgIGxvbmcgdmFsOwogewotCVB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcodmFsKTsKLQlpZiAodikgewotCQkodm9pZClQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCX0KKyAgICBQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgaWYgKHYpIHsKKyAgICAgICAgKHZvaWQpUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiB9CiAKIAogdm9pZAogaW5pdHB1cmUoKQogewotCVB5T2JqZWN0ICptLCAqZDsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CiAKLQlpZiAoUHlFcnJfV2FyblB5M2soInRoZSBwdXJlIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKLQkgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCi0JICAgIHJldHVybjsJCisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgcHVyZSBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQorICAgICAgICByZXR1cm47CiAKLQltID0gUHlfSW5pdE1vZHVsZSgicHVyZSIsIHB1cmVfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLSAgICAJCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgicHVyZSIsIHB1cmVfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogCi0gICAgICAgIC8qIHRoaXMgaXMgYm9ndXMgYmVjYXVzZSB3ZSBzaG91bGQgYmUgYWJsZSB0byBmaW5kIHRoaXMgaW5mb3JtYXRpb24KLSAgICAgICAgICogb3V0IGZyb20gdGhlIGhlYWRlciBmaWxlcy4gIFB1cmUncyBjdXJyZW50IHZlcnNpb25zIGRvbid0Ci0gICAgICAgICAqIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiEKLSAgICAgICAgICovCisgICAgLyogdGhpcyBpcyBib2d1cyBiZWNhdXNlIHdlIHNob3VsZCBiZSBhYmxlIHRvIGZpbmQgdGhpcyBpbmZvcm1hdGlvbgorICAgICAqIG91dCBmcm9tIHRoZSBoZWFkZXIgZmlsZXMuICBQdXJlJ3MgY3VycmVudCB2ZXJzaW9ucyBkb24ndAorICAgICAqIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiEKKyAgICAgKi8KICNpZmRlZiBQVVJFX1BVUklGWV9WRVJTSU9OCi0JaW5zKGQsICJQVVJJRllfVkVSU0lPTiIsIFBVUkVfUFVSSUZZX1ZFUlNJT04pOworICAgIGlucyhkLCAiUFVSSUZZX1ZFUlNJT04iLCBQVVJFX1BVUklGWV9WRVJTSU9OKTsKICNlbHNlCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBVUklGWV9WRVJTSU9OIiwgUHlfTm9uZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBVUklGWV9WRVJTSU9OIiwgUHlfTm9uZSk7CiAjZW5kaWYKIAotICAgICAgICAvKiB0aGVzZSBhcmVuJ3QgdGVycmlibHkgdXNlZnVsIGJlY2F1c2UgcHVyaWZ5X2V4aXQoKSBpc24ndAotICAgICAgICAgKiBleHBvcnRlZCBjb3JyZWN0bHkuICBTZWUgdGhlIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4KLSAgICAgICAgICovCisgICAgLyogdGhlc2UgYXJlbid0IHRlcnJpYmx5IHVzZWZ1bCBiZWNhdXNlIHB1cmlmeV9leGl0KCkgaXNuJ3QKKyAgICAgKiBleHBvcnRlZCBjb3JyZWN0bHkuICBTZWUgdGhlIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4KKyAgICAgKi8KICNpZmRlZiBQVVJJRllfRVhJVF9FUlJPUlMKLQlpbnMoZCwgIlBVUklGWV9FWElUX0VSUk9SUyIsIFBVUklGWV9FWElUX0VSUk9SUyk7CisgICAgaW5zKGQsICJQVVJJRllfRVhJVF9FUlJPUlMiLCBQVVJJRllfRVhJVF9FUlJPUlMpOwogI2VuZGlmCiAjaWZkZWYgUFVSSUZZX0VYSVRfTEVBS1MKLQlpbnMoZCwgIlBVUklGWV9FWElUX0xFQUtTIiwgIFBVUklGWV9FWElUX0xFQUtTKTsKKyAgICBpbnMoZCwgIlBVUklGWV9FWElUX0xFQUtTIiwgIFBVUklGWV9FWElUX0xFQUtTKTsKICNlbmRpZgogI2lmZGVmIFBVUklGWV9FWElUX1BMRUFLUwotCWlucyhkLCAiUFVSSUZZX0VYSVRfUExFQUtTIiwgUFVSSUZZX0VYSVRfUExFQUtTKTsKKyAgICBpbnMoZCwgIlBVUklGWV9FWElUX1BMRUFLUyIsIFBVUklGWV9FWElUX1BMRUFLUyk7CiAjZW5kaWYKIAogCiAjaWZkZWYgUFVSRV9RVUFOVElGWV9WRVJTSU9OCi0JaW5zKGQsICJRVUFOVElGWV9WRVJTSU9OIiwgUFVSRV9RVUFOVElGWV9WRVJTSU9OKTsKKyAgICBpbnMoZCwgIlFVQU5USUZZX1ZFUlNJT04iLCBQVVJFX1FVQU5USUZZX1ZFUlNJT04pOwogI2Vsc2UKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTlRJRllfVkVSU0lPTiIsIFB5X05vbmUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJRVUFOVElGWV9WRVJTSU9OIiwgUHlfTm9uZSk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcHdkbW9kdWxlLmMgYi9Nb2R1bGVzL3B3ZG1vZHVsZS5jCmluZGV4IGQxY2UzOTQuLmFlMzU4ZTAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcHdkbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wd2Rtb2R1bGUuYwpAQCAtOCwxNCArOCwxNCBAQAogI2luY2x1ZGUgPHB3ZC5oPgogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCBzdHJ1Y3RfcHdkX3R5cGVfZmllbGRzW10gPSB7Ci0JeyJwd19uYW1lIiwgInVzZXIgbmFtZSJ9LAotCXsicHdfcGFzc3dkIiwgInBhc3N3b3JkIn0sCi0JeyJwd191aWQiLCAidXNlciBpZCJ9LAotCXsicHdfZ2lkIiwgImdyb3VwIGlkIn0sIAotCXsicHdfZ2Vjb3MiLCAicmVhbCBuYW1lIn0sIAotCXsicHdfZGlyIiwgImhvbWUgZGlyZWN0b3J5In0sCi0JeyJwd19zaGVsbCIsICJzaGVsbCBwcm9ncmFtIn0sCi0JezB9CisgICAgeyJwd19uYW1lIiwgInVzZXIgbmFtZSJ9LAorICAgIHsicHdfcGFzc3dkIiwgInBhc3N3b3JkIn0sCisgICAgeyJwd191aWQiLCAidXNlciBpZCJ9LAorICAgIHsicHdfZ2lkIiwgImdyb3VwIGlkIn0sCisgICAgeyJwd19nZWNvcyIsICJyZWFsIG5hbWUifSwKKyAgICB7InB3X2RpciIsICJob21lIGRpcmVjdG9yeSJ9LAorICAgIHsicHdfc2hlbGwiLCAic2hlbGwgcHJvZ3JhbSJ9LAorICAgIHswfQogfTsKIAogUHlEb2NfU1RSVkFSKHN0cnVjdF9wYXNzd2RfX2RvY19fLApAQCAtMjUsMTAgKzI1LDEwIEBACiBvciB2aWEgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIGFzIG5hbWVkIGluIHRoZSBhYm92ZSB0dXBsZS4iKTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyBzdHJ1Y3RfcHdkX3R5cGVfZGVzYyA9IHsKLQkicHdkLnN0cnVjdF9wYXNzd2QiLAotCXN0cnVjdF9wYXNzd2RfX2RvY19fLAotCXN0cnVjdF9wd2RfdHlwZV9maWVsZHMsCi0JNywKKyAgICAicHdkLnN0cnVjdF9wYXNzd2QiLAorICAgIHN0cnVjdF9wYXNzd2RfX2RvY19fLAorICAgIHN0cnVjdF9wd2RfdHlwZV9maWVsZHMsCisgICAgNywKIH07CiAKIFB5RG9jX1NUUlZBUihwd2RfX2RvY19fLApAQCAtNDEsNyArNDEsNyBAQAogVGhlIHVpZCBhbmQgZ2lkIGl0ZW1zIGFyZSBpbnRlZ2VycywgYWxsIG90aGVycyBhcmUgc3RyaW5ncy4gQW5cblwKIGV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgdGhlIGVudHJ5IGFza2VkIGZvciBjYW5ub3QgYmUgZm91bmQuIik7CiAKLSAgICAgIAorCiBzdGF0aWMgaW50IGluaXRpYWxpemVkOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJ1Y3RQd2RUeXBlOwogCkBAIC00OSw0OSArNDksNDkgQEAKIHNldHMoUHlPYmplY3QgKnYsIGludCBpLCBjaGFyKiB2YWwpCiB7CiAgIGlmICh2YWwpCi0JICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsKSk7CisgICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsKSk7CiAgIGVsc2UgewotCSAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeV9Ob25lKTsKLQkgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgaSwgUHlfTm9uZSk7CisgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1rcHdlbnQoc3RydWN0IHBhc3N3ZCAqcCkKIHsKLQlpbnQgc2V0SW5kZXggPSAwOwotCVB5T2JqZWN0ICp2ID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJlN0cnVjdFB3ZFR5cGUpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGludCBzZXRJbmRleCA9IDA7CisgICAgUHlPYmplY3QgKnYgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RydWN0UHdkVHlwZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNkZWZpbmUgU0VUSShpLHZhbCkgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsKSkKICNkZWZpbmUgU0VUUyhpLHZhbCkgc2V0cyh2LCBpLCB2YWwpCiAKLQlTRVRTKHNldEluZGV4KyssIHAtPnB3X25hbWUpOworICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfbmFtZSk7CiAjaWZkZWYgX19WTVMKLQlTRVRTKHNldEluZGV4KyssICIiKTsKKyAgICBTRVRTKHNldEluZGV4KyssICIiKTsKICNlbHNlCi0JU0VUUyhzZXRJbmRleCsrLCBwLT5wd19wYXNzd2QpOworICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfcGFzc3dkKTsKICNlbmRpZgotCVNFVEkoc2V0SW5kZXgrKywgcC0+cHdfdWlkKTsKLQlTRVRJKHNldEluZGV4KyssIHAtPnB3X2dpZCk7CisgICAgU0VUSShzZXRJbmRleCsrLCBwLT5wd191aWQpOworICAgIFNFVEkoc2V0SW5kZXgrKywgcC0+cHdfZ2lkKTsKICNpZmRlZiBfX1ZNUwotCVNFVFMoc2V0SW5kZXgrKywgIiIpOworICAgIFNFVFMoc2V0SW5kZXgrKywgIiIpOwogI2Vsc2UKLQlTRVRTKHNldEluZGV4KyssIHAtPnB3X2dlY29zKTsKKyAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X2dlY29zKTsKICNlbmRpZgotCVNFVFMoc2V0SW5kZXgrKywgcC0+cHdfZGlyKTsKLQlTRVRTKHNldEluZGV4KyssIHAtPnB3X3NoZWxsKTsKKyAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X2Rpcik7CisgICAgU0VUUyhzZXRJbmRleCsrLCBwLT5wd19zaGVsbCk7CiAKICN1bmRlZiBTRVRTCiAjdW5kZWYgU0VUSQogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfWERFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiB2OworICAgIHJldHVybiB2OwogfQogCiBQeURvY19TVFJWQVIocHdkX2dldHB3dWlkX19kb2NfXywKQEAgLTEwMywxNiArMTAzLDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHdkX2dldHB3dWlkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBpbnQgdWlkOwotCXN0cnVjdCBwYXNzd2QgKnA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJOmdldHB3dWlkIiwgJnVpZCkpCi0JCXJldHVybiBOVUxMOwotCWlmICgocCA9IGdldHB3dWlkKHVpZCkpID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLAotCQkJICAgICAiZ2V0cHd1aWQoKTogdWlkIG5vdCBmb3VuZDogJWQiLCB1aWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIG1rcHdlbnQocCk7CisgICAgdW5zaWduZWQgaW50IHVpZDsKKyAgICBzdHJ1Y3QgcGFzc3dkICpwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSTpnZXRwd3VpZCIsICZ1aWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHAgPSBnZXRwd3VpZCh1aWQpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJnZXRwd3VpZCgpOiB1aWQgbm90IGZvdW5kOiAlZCIsIHVpZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbWtwd2VudChwKTsKIH0KIAogUHlEb2NfU1RSVkFSKHB3ZF9nZXRwd25hbV9fZG9jX18sCkBAIC0xMjQsMTYgKzEyNCwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB3ZF9nZXRwd25hbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3QgcGFzc3dkICpwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRwd25hbSIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChwID0gZ2V0cHduYW0obmFtZSkpID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLAotCQkJICAgICAiZ2V0cHduYW0oKTogbmFtZSBub3QgZm91bmQ6ICVzIiwgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbWtwd2VudChwKTsKKyAgICBjaGFyICpuYW1lOworICAgIHN0cnVjdCBwYXNzd2QgKnA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldHB3bmFtIiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHAgPSBnZXRwd25hbShuYW1lKSkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZ2V0cHduYW0oKTogbmFtZSBub3QgZm91bmQ6ICVzIiwgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbWtwd2VudChwKTsKIH0KIAogI2lmZGVmIEhBVkVfR0VUUFdFTlQKQEAgLTE0Niw1NSArMTQ2LDU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHdkX2dldHB3YWxsKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpkOwotCXN0cnVjdCBwYXNzd2QgKnA7Ci0JaWYgKChkID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKmQ7CisgICAgc3RydWN0IHBhc3N3ZCAqcDsKKyAgICBpZiAoKGQgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKQotCWlmICgocCA9IGdldHB3dWlkKDApKSAhPSBOVUxMKSB7CisgICAgaWYgKChwID0gZ2V0cHd1aWQoMCkpICE9IE5VTEwpIHsKICNlbHNlCi0Jc2V0cHdlbnQoKTsKLQl3aGlsZSAoKHAgPSBnZXRwd2VudCgpKSAhPSBOVUxMKSB7CisgICAgc2V0cHdlbnQoKTsKKyAgICB3aGlsZSAoKHAgPSBnZXRwd2VudCgpKSAhPSBOVUxMKSB7CiAjZW5kaWYKLQkJUHlPYmplY3QgKnYgPSBta3B3ZW50KHApOwotCQlpZiAodiA9PSBOVUxMIHx8IFB5TGlzdF9BcHBlbmQoZCwgdikgIT0gMCkgewotCQkJUHlfWERFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRihkKTsKLQkJCWVuZHB3ZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYodik7Ci0JfQotCWVuZHB3ZW50KCk7Ci0JcmV0dXJuIGQ7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gbWtwd2VudChwKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCB8fCBQeUxpc3RfQXBwZW5kKGQsIHYpICE9IDApIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZCk7CisgICAgICAgICAgICBlbmRwd2VudCgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICBlbmRwd2VudCgpOworICAgIHJldHVybiBkOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBwd2RfbWV0aG9kc1tdID0gewotCXsiZ2V0cHd1aWQiLAlwd2RfZ2V0cHd1aWQsIE1FVEhfVkFSQVJHUywgcHdkX2dldHB3dWlkX19kb2NfX30sCi0JeyJnZXRwd25hbSIsCXB3ZF9nZXRwd25hbSwgTUVUSF9WQVJBUkdTLCBwd2RfZ2V0cHduYW1fX2RvY19ffSwKKyAgICB7ImdldHB3dWlkIiwgICAgICAgIHB3ZF9nZXRwd3VpZCwgTUVUSF9WQVJBUkdTLCBwd2RfZ2V0cHd1aWRfX2RvY19ffSwKKyAgICB7ImdldHB3bmFtIiwgICAgICAgIHB3ZF9nZXRwd25hbSwgTUVUSF9WQVJBUkdTLCBwd2RfZ2V0cHduYW1fX2RvY19ffSwKICNpZmRlZiBIQVZFX0dFVFBXRU5UCi0JeyJnZXRwd2FsbCIsCShQeUNGdW5jdGlvbilwd2RfZ2V0cHdhbGwsCi0JCU1FVEhfTk9BUkdTLCAgcHdkX2dldHB3YWxsX19kb2NfX30sCisgICAgeyJnZXRwd2FsbCIsICAgICAgICAoUHlDRnVuY3Rpb24pcHdkX2dldHB3YWxsLAorICAgICAgICBNRVRIX05PQVJHUywgIHB3ZF9nZXRwd2FsbF9fZG9jX199LAogI2VuZGlmCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRwd2Qodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQltID0gUHlfSW5pdE1vZHVsZTMoInB3ZCIsIHB3ZF9tZXRob2RzLCBwd2RfX2RvY19fKTsKLQlpZiAobSA9PSBOVUxMKQotICAgIAkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygicHdkIiwgcHdkX21ldGhvZHMsIHB3ZF9fZG9jX18pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFB3ZFR5cGUsIAotCQkJCQkgICZzdHJ1Y3RfcHdkX3R5cGVfZGVzYyk7Ci0JUHlfSU5DUkVGKChQeU9iamVjdCAqKSAmU3RydWN0UHdkVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcGFzc3dkIiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKLQkvKiBBbmQgZm9yIGIvdyBjb21wYXRpYmlsaXR5ICh0aGlzIHdhcyBkZWZpbmVkIGJ5IG1pc3Rha2UpOiAqLwotCVB5X0lOQ1JFRigoUHlPYmplY3QgKikgJlN0cnVjdFB3ZFR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3B3ZW50IiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKLQlpbml0aWFsaXplZCA9IDE7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0UHdkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RydWN0X3B3ZF90eXBlX2Rlc2MpOworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikgJlN0cnVjdFB3ZFR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3Bhc3N3ZCIsIChQeU9iamVjdCAqKSAmU3RydWN0UHdkVHlwZSk7CisgICAgLyogQW5kIGZvciBiL3cgY29tcGF0aWJpbGl0eSAodGhpcyB3YXMgZGVmaW5lZCBieSBtaXN0YWtlKTogKi8KKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInN0cnVjdF9wd2VudCIsIChQeU9iamVjdCAqKSAmU3RydWN0UHdkVHlwZSk7CisgICAgaW5pdGlhbGl6ZWQgPSAxOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9weWV4cGF0LmMgYi9Nb2R1bGVzL3B5ZXhwYXQuYwppbmRleCAzYjRjY2ZkLi5lMDViM2FkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3B5ZXhwYXQuYworKysgYi9Nb2R1bGVzL3B5ZXhwYXQuYwpAQCAtMjQ1LDcgKzI0NSw3IEBACiAgICB1c2VkIG9ubHkgZnJvbSB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciB0cmFtcG9saW5lLCBhbmQgbXVzdCBiZQogICAgdXNlZCByaWdodCBhZnRlciBgZmxhZ19lcnJvcigpYCBpcyBjYWxsZWQuICovCiBzdGF0aWMgdm9pZAotbm9vcF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqZGF0YSwgaW50IGxlbikgCitub29wX2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXIodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpkYXRhLCBpbnQgbGVuKQogewogICAgIC8qIERvIG5vdGhpbmcuICovCiB9CkBAIC0yNzQsMjUgKzI3NCwyNSBAQAogewogICAgIGludCByZXN1bHQgPSAwOwogICAgIGlmICghdHN0YXRlLT51c2VfdHJhY2luZyB8fCB0c3RhdGUtPnRyYWNpbmcpCi0JcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAwOwogICAgIGlmICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkgewotCXRzdGF0ZS0+dHJhY2luZysrOwotCXJlc3VsdCA9IHRzdGF0ZS0+Y19wcm9maWxlZnVuYyh0c3RhdGUtPmNfcHJvZmlsZW9iaiwKLQkJCQkgICAgICAgZiwgY29kZSAsIHZhbCk7Ci0JdHN0YXRlLT51c2VfdHJhY2luZyA9ICgodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQotCQkJICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOwotCXRzdGF0ZS0+dHJhY2luZy0tOwotCWlmIChyZXN1bHQpCi0JICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHRzdGF0ZS0+dHJhY2luZysrOworICAgICAgICByZXN1bHQgPSB0c3RhdGUtPmNfcHJvZmlsZWZ1bmModHN0YXRlLT5jX3Byb2ZpbGVvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLCBjb2RlICwgdmFsKTsKKyAgICAgICAgdHN0YXRlLT51c2VfdHJhY2luZyA9ICgodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOworICAgICAgICB0c3RhdGUtPnRyYWNpbmctLTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIGlmICh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpIHsKLQl0c3RhdGUtPnRyYWNpbmcrKzsKLQlyZXN1bHQgPSB0c3RhdGUtPmNfdHJhY2VmdW5jKHRzdGF0ZS0+Y190cmFjZW9iaiwKLQkJCQkgICAgIGYsIGNvZGUgLCB2YWwpOwotCXRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAoKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCkKLQkJCSAgICAgICB8fCAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpKTsKLQl0c3RhdGUtPnRyYWNpbmctLTsKLSAgICB9CQorICAgICAgICB0c3RhdGUtPnRyYWNpbmcrKzsKKyAgICAgICAgcmVzdWx0ID0gdHN0YXRlLT5jX3RyYWNlZnVuYyh0c3RhdGUtPmNfdHJhY2VvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgY29kZSAsIHZhbCk7CisgICAgICAgIHRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAoKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpKTsKKyAgICAgICAgdHN0YXRlLT50cmFjaW5nLS07CisgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTMwMywxMiArMzAzLDEyIEBACiAgICAgaW50IGVycjsKIAogICAgIGlmICh0c3RhdGUtPmNfdHJhY2VmdW5jID09IE5VTEwpCi0JcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAwOwogCiAgICAgUHlFcnJfRmV0Y2goJnR5cGUsICZ2YWx1ZSwgJnRyYWNlYmFjayk7CiAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKLQl2YWx1ZSA9IFB5X05vbmU7Ci0JUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwogICAgIH0KICNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNDAwMDAKICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIoT09PKSIsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOwpAQCAtMzE2LDE3ICszMTYsMTcgQEAKICAgICBhcmcgPSBQeVR1cGxlX1BhY2soMywgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk7CiAjZW5kaWYKICAgICBpZiAoYXJnID09IE5VTEwpIHsKLQlQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOwotCXJldHVybiAwOworICAgICAgICBQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgZXJyID0gdHJhY2VfZnJhbWUodHN0YXRlLCBmLCBQeVRyYWNlX0VYQ0VQVElPTiwgYXJnKTsKICAgICBQeV9ERUNSRUYoYXJnKTsKICAgICBpZiAoZXJyID09IDApCi0JUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKKyAgICAgICAgUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKICAgICBlbHNlIHsKLQlQeV9YREVDUkVGKHR5cGUpOwotCVB5X1hERUNSRUYodmFsdWUpOwotCVB5X1hERUNSRUYodHJhY2ViYWNrKTsKKyAgICAgICAgUHlfWERFQ1JFRih0eXBlKTsKKyAgICAgICAgUHlfWERFQ1JFRih2YWx1ZSk7CisgICAgICAgIFB5X1hERUNSRUYodHJhY2ViYWNrKTsKICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTM0MiwzMSArMzQyLDMxIEBACiAKICAgICBpZiAoYyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAKKwogICAgIGYgPSBQeUZyYW1lX05ldyh0c3RhdGUsIGMsIFB5RXZhbF9HZXRHbG9iYWxzKCksIE5VTEwpOwogICAgIGlmIChmID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHRzdGF0ZS0+ZnJhbWUgPSBmOwogI2lmZGVmIEZJWF9UUkFDRQogICAgIGlmICh0cmFjZV9mcmFtZSh0c3RhdGUsIGYsIFB5VHJhY2VfQ0FMTCwgUHlfTm9uZSkgPCAwKSB7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICNlbmRpZgogICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOwogICAgIGlmIChyZXMgPT0gTlVMTCkgewotCWlmICh0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPT0gTlVMTCkKLQkgICAgUHlUcmFjZUJhY2tfSGVyZShmKTsKKyAgICAgICAgaWYgKHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjayA9PSBOVUxMKQorICAgICAgICAgICAgUHlUcmFjZUJhY2tfSGVyZShmKTsKICAgICAgICAgWE1MX1N0b3BQYXJzZXIoc2VsZi0+aXRzZWxmLCBYTUxfRkFMU0UpOwogI2lmZGVmIEZJWF9UUkFDRQotCWlmICh0cmFjZV9mcmFtZV9leGModHN0YXRlLCBmKSA8IDApIHsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBpZiAodHJhY2VfZnJhbWVfZXhjKHRzdGF0ZSwgZikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKLQlpZiAodHJhY2VfZnJhbWUodHN0YXRlLCBmLCBQeVRyYWNlX1JFVFVSTiwgcmVzKSA8IDApIHsKLQkgICAgUHlfWERFQ1JFRihyZXMpOwotCSAgICByZXMgPSBOVUxMOwotCX0KKyAgICAgICAgaWYgKHRyYWNlX2ZyYW1lKHRzdGF0ZSwgZiwgUHlUcmFjZV9SRVRVUk4sIHJlcykgPCAwKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXMgPSBOVUxMOworICAgICAgICB9CiAgICAgfQogI2Vsc2UKICAgICB9CkBAIC0zOTEsMTIgKzM5MSwxMiBAQAogICAgIFB5T2JqZWN0ICp2YWx1ZTsKICAgICAvKiByZXN1bHQgY2FuIGJlIE5VTEwgaWYgdGhlIHVuaWNvZGUgY29udmVyc2lvbiBmYWlsZWQuICovCiAgICAgaWYgKCFyZXN1bHQpCi0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICBpZiAoIXNlbGYtPmludGVybikKLQlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+aW50ZXJuLCByZXN1bHQpOwogICAgIGlmICghdmFsdWUpIHsKLQlpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+aW50ZXJuLCByZXN1bHQsIHJlc3VsdCkgPT0gMCkKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmludGVybiwgcmVzdWx0LCByZXN1bHQpID09IDApCiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICBlbHNlCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQxOSw4ICs0MTksOCBAQAogICAgIGlmIChhcmdzID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0gICAgdGVtcCA9IChzZWxmLT5yZXR1cm5zX3VuaWNvZGUgCi0gICAgICAgICAgICA/IGNvbnZfc3RyaW5nX2xlbl90b191bmljb2RlKGJ1ZmZlciwgbGVuKSAKKyAgICB0ZW1wID0gKHNlbGYtPnJldHVybnNfdW5pY29kZQorICAgICAgICAgICAgPyBjb252X3N0cmluZ19sZW5fdG9fdW5pY29kZShidWZmZXIsIGxlbikKICAgICAgICAgICAgIDogY29udl9zdHJpbmdfbGVuX3RvX3V0ZjgoYnVmZmVyLCBsZW4pKTsKICNlbHNlCiAgICAgdGVtcCA9IGNvbnZfc3RyaW5nX2xlbl90b191dGY4KGJ1ZmZlciwgbGVuKTsKQEAgLTQ2Miw3ICs0NjIsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbXlfQ2hhcmFjdGVyRGF0YUhhbmRsZXIodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpkYXRhLCBpbnQgbGVuKSAKK215X0NoYXJhY3RlckRhdGFIYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqZGF0YSwgaW50IGxlbikKIHsKICAgICB4bWxwYXJzZW9iamVjdCAqc2VsZiA9ICh4bWxwYXJzZW9iamVjdCAqKSB1c2VyRGF0YTsKICAgICBpZiAoc2VsZi0+YnVmZmVyID09IE5VTEwpCkBAIC02MDIsMTMgKzYwMiwxMyBAQAogfQogCiAjZGVmaW5lIFZPSURfSEFORExFUihOQU1FLCBQQVJBTVMsIFBBUkFNX0ZPUk1BVCkgXAotCVJDX0hBTkRMRVIodm9pZCwgTkFNRSwgUEFSQU1TLCA7LCBQQVJBTV9GT1JNQVQsIDssIDssXAotCSh4bWxwYXJzZW9iamVjdCAqKXVzZXJEYXRhKQorICAgICAgICBSQ19IQU5ETEVSKHZvaWQsIE5BTUUsIFBBUkFNUywgOywgUEFSQU1fRk9STUFULCA7LCA7LFwKKyAgICAgICAgKHhtbHBhcnNlb2JqZWN0ICopdXNlckRhdGEpCiAKICNkZWZpbmUgSU5UX0hBTkRMRVIoTkFNRSwgUEFSQU1TLCBQQVJBTV9GT1JNQVQpXAotCVJDX0hBTkRMRVIoaW50LCBOQU1FLCBQQVJBTVMsIGludCByYz0wOywgUEFSQU1fRk9STUFULCBcCi0JCQlyYyA9IFB5SW50X0FzTG9uZyhydik7LCByYywgXAotCSh4bWxwYXJzZW9iamVjdCAqKXVzZXJEYXRhKQorICAgICAgICBSQ19IQU5ETEVSKGludCwgTkFNRSwgUEFSQU1TLCBpbnQgcmM9MDssIFBBUkFNX0ZPUk1BVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBQeUludF9Bc0xvbmcocnYpOywgcmMsIFwKKyAgICAgICAgKHhtbHBhcnNlb2JqZWN0ICopdXNlckRhdGEpCiAKIFZPSURfSEFORExFUihFbmRFbGVtZW50LAogICAgICAgICAgICAgICh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUpLApAQCAtNzgxLDI1ICs3ODEsMjUgQEAKICNlbmRpZgogCiBWT0lEX0hBTkRMRVIoTm90YXRpb25EZWNsLAotCQkodm9pZCAqdXNlckRhdGEsCi0JCQljb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lLAotCQkJY29uc3QgWE1MX0NoYXIgKmJhc2UsCi0JCQljb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCi0JCQljb25zdCBYTUxfQ2hhciAqcHVibGljSWQpLAorICAgICAgICAgICAgICAgICh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCksCiAgICAgICAgICAgICAgICAgKCIoTk5OTikiLAotCQkgc3RyaW5nX2ludGVybihzZWxmLCBub3RhdGlvbk5hbWUpLCBzdHJpbmdfaW50ZXJuKHNlbGYsIGJhc2UpLAotCQkgc3RyaW5nX2ludGVybihzZWxmLCBzeXN0ZW1JZCksIHN0cmluZ19pbnRlcm4oc2VsZiwgcHVibGljSWQpKSkKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2ludGVybihzZWxmLCBub3RhdGlvbk5hbWUpLCBzdHJpbmdfaW50ZXJuKHNlbGYsIGJhc2UpLAorICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ZXJuKHNlbGYsIHN5c3RlbUlkKSwgc3RyaW5nX2ludGVybihzZWxmLCBwdWJsaWNJZCkpKQogCiBWT0lEX0hBTkRMRVIoU3RhcnROYW1lc3BhY2VEZWNsLAotCQkodm9pZCAqdXNlckRhdGEsCi0JCSAgICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXgsCi0JCSAgICAgIGNvbnN0IFhNTF9DaGFyICp1cmkpLAorICAgICAgICAgICAgICAgICh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp1cmkpLAogICAgICAgICAgICAgICAgICgiKE5OKSIsCiAgICAgICAgICAgICAgICAgIHN0cmluZ19pbnRlcm4oc2VsZiwgcHJlZml4KSwgc3RyaW5nX2ludGVybihzZWxmLCB1cmkpKSkKIAogVk9JRF9IQU5ETEVSKEVuZE5hbWVzcGFjZURlY2wsCi0JCSh2b2lkICp1c2VyRGF0YSwKLQkJICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXgpLAorICAgICAgICAgICAgICAgICh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnByZWZpeCksCiAgICAgICAgICAgICAgICAgKCIoTikiLCBzdHJpbmdfaW50ZXJuKHNlbGYsIHByZWZpeCkpKQogCiBWT0lEX0hBTkRMRVIoQ29tbWVudCwKQEAgLTgwOCw1MCArODA4LDUwIEBACiAKIFZPSURfSEFORExFUihTdGFydENkYXRhU2VjdGlvbiwKICAgICAgICAgICAgICAgICh2b2lkICp1c2VyRGF0YSksCi0JCSgiKCkiKSkKKyAgICAgICAgICAgICAgICAoIigpIikpCiAKIFZPSURfSEFORExFUihFbmRDZGF0YVNlY3Rpb24sCiAgICAgICAgICAgICAgICAodm9pZCAqdXNlckRhdGEpLAotCQkoIigpIikpCisgICAgICAgICAgICAgICAgKCIoKSIpKQogCiAjaWZuZGVmIFB5X1VTSU5HX1VOSUNPREUKIFZPSURfSEFORExFUihEZWZhdWx0LAotCSAgICAgICh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pLAotCSAgICAgICgiKE4pIiwgY29udl9zdHJpbmdfbGVuX3RvX3V0ZjgocyxsZW4pKSkKKyAgICAgICAgICAgICAgKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbiksCisgICAgICAgICAgICAgICgiKE4pIiwgY29udl9zdHJpbmdfbGVuX3RvX3V0ZjgocyxsZW4pKSkKIAogVk9JRF9IQU5ETEVSKERlZmF1bHRIYW5kbGVyRXhwYW5kLAotCSAgICAgICh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pLAotCSAgICAgICgiKE4pIiwgY29udl9zdHJpbmdfbGVuX3RvX3V0ZjgocyxsZW4pKSkKKyAgICAgICAgICAgICAgKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbiksCisgICAgICAgICAgICAgICgiKE4pIiwgY29udl9zdHJpbmdfbGVuX3RvX3V0ZjgocyxsZW4pKSkKICNlbHNlCiBWT0lEX0hBTkRMRVIoRGVmYXVsdCwKLQkgICAgICAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKSwKLQkgICAgICAoIihOKSIsIChzZWxmLT5yZXR1cm5zX3VuaWNvZGUKLQkJICAgICAgID8gY29udl9zdHJpbmdfbGVuX3RvX3VuaWNvZGUocyxsZW4pCi0JCSAgICAgICA6IGNvbnZfc3RyaW5nX2xlbl90b191dGY4KHMsbGVuKSkpKQorICAgICAgICAgICAgICAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKSwKKyAgICAgICAgICAgICAgKCIoTikiLCAoc2VsZi0+cmV0dXJuc191bmljb2RlCisgICAgICAgICAgICAgICAgICAgICAgID8gY29udl9zdHJpbmdfbGVuX3RvX3VuaWNvZGUocyxsZW4pCisgICAgICAgICAgICAgICAgICAgICAgIDogY29udl9zdHJpbmdfbGVuX3RvX3V0ZjgocyxsZW4pKSkpCiAKIFZPSURfSEFORExFUihEZWZhdWx0SGFuZGxlckV4cGFuZCwKLQkgICAgICAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKSwKLQkgICAgICAoIihOKSIsIChzZWxmLT5yZXR1cm5zX3VuaWNvZGUKLQkJICAgICAgID8gY29udl9zdHJpbmdfbGVuX3RvX3VuaWNvZGUocyxsZW4pCi0JCSAgICAgICA6IGNvbnZfc3RyaW5nX2xlbl90b191dGY4KHMsbGVuKSkpKQorICAgICAgICAgICAgICAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKSwKKyAgICAgICAgICAgICAgKCIoTikiLCAoc2VsZi0+cmV0dXJuc191bmljb2RlCisgICAgICAgICAgICAgICAgICAgICAgID8gY29udl9zdHJpbmdfbGVuX3RvX3VuaWNvZGUocyxsZW4pCisgICAgICAgICAgICAgICAgICAgICAgIDogY29udl9zdHJpbmdfbGVuX3RvX3V0ZjgocyxsZW4pKSkpCiAjZW5kaWYKIAogSU5UX0hBTkRMRVIoTm90U3RhbmRhbG9uZSwKLQkJKHZvaWQgKnVzZXJEYXRhKSwKLQkJKCIoKSIpKQorICAgICAgICAgICAgICAgICh2b2lkICp1c2VyRGF0YSksCisgICAgICAgICAgICAgICAgKCIoKSIpKQogCiBSQ19IQU5ETEVSKGludCwgRXh0ZXJuYWxFbnRpdHlSZWYsCi0JCShYTUxfUGFyc2VyIHBhcnNlciwKLQkJICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAotCQkgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCi0JCSAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCi0JCSAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpLAotCQlpbnQgcmM9MDssCisgICAgICAgICAgICAgICAgKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKSwKKyAgICAgICAgICAgICAgICBpbnQgcmM9MDssCiAgICAgICAgICAgICAgICAgKCIoTyZOTk4pIiwKLQkJIFNUUklOR19DT05WX0ZVTkMsY29udGV4dCwgc3RyaW5nX2ludGVybihzZWxmLCBiYXNlKSwKLQkJIHN0cmluZ19pbnRlcm4oc2VsZiwgc3lzdGVtSWQpLCBzdHJpbmdfaW50ZXJuKHNlbGYsIHB1YmxpY0lkKSksCi0JCXJjID0gUHlJbnRfQXNMb25nKHJ2KTssIHJjLAotCQlYTUxfR2V0VXNlckRhdGEocGFyc2VyKSkKKyAgICAgICAgICAgICAgICAgU1RSSU5HX0NPTlZfRlVOQyxjb250ZXh0LCBzdHJpbmdfaW50ZXJuKHNlbGYsIGJhc2UpLAorICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ZXJuKHNlbGYsIHN5c3RlbUlkKSwgc3RyaW5nX2ludGVybihzZWxmLCBwdWJsaWNJZCkpLAorICAgICAgICAgICAgICAgIHJjID0gUHlJbnRfQXNMb25nKHJ2KTssIHJjLAorICAgICAgICAgICAgICAgIFhNTF9HZXRVc2VyRGF0YShwYXJzZXIpKQogCiAvKiBYWFggVW5rbm93bkVuY29kaW5nSGFuZGxlciAqLwogCkBAIC0xMDIyLDcgKzEwMjIsNyBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpTZXRCYXNlIiwgJmJhc2UpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoIVhNTF9TZXRCYXNlKHNlbGYtPml0c2VsZiwgYmFzZSkpIHsKLQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgfQogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTExMTMsNyArMTExMyw3IEBACiAgICAgbmV3X3BhcnNlci0+aW5fY2FsbGJhY2sgPSAwOwogICAgIG5ld19wYXJzZXItPm5zX3ByZWZpeGVzID0gc2VsZi0+bnNfcHJlZml4ZXM7CiAgICAgbmV3X3BhcnNlci0+aXRzZWxmID0gWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKHNlbGYtPml0c2VsZiwgY29udGV4dCwKLQkJCQkJCQllbmNvZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKICAgICBuZXdfcGFyc2VyLT5oYW5kbGVycyA9IDA7CiAgICAgbmV3X3BhcnNlci0+aW50ZXJuID0gc2VsZi0+aW50ZXJuOwogICAgIFB5X1hJTkNSRUYobmV3X3BhcnNlci0+aW50ZXJuKTsKQEAgLTEyMDIsMjUgKzEyMDIsMjUgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHhtbHBhcnNlX21ldGhvZHNbXSA9IHsKLSAgICB7IlBhcnNlIiwJICAoUHlDRnVuY3Rpb24peG1scGFyc2VfUGFyc2UsCi0JCSAgTUVUSF9WQVJBUkdTLAl4bWxwYXJzZV9QYXJzZV9fZG9jX199LAorICAgIHsiUGFyc2UiLCAgICAgKFB5Q0Z1bmN0aW9uKXhtbHBhcnNlX1BhcnNlLAorICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLCB4bWxwYXJzZV9QYXJzZV9fZG9jX199LAogICAgIHsiUGFyc2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKXhtbHBhcnNlX1BhcnNlRmlsZSwKLQkJICBNRVRIX08sCXhtbHBhcnNlX1BhcnNlRmlsZV9fZG9jX199LAorICAgICAgICAgICAgICAgICAgTUVUSF9PLCAgICAgICB4bWxwYXJzZV9QYXJzZUZpbGVfX2RvY19ffSwKICAgICB7IlNldEJhc2UiLCAgIChQeUNGdW5jdGlvbil4bWxwYXJzZV9TZXRCYXNlLAotCQkgIE1FVEhfVkFSQVJHUywgeG1scGFyc2VfU2V0QmFzZV9fZG9jX199LAorICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLCB4bWxwYXJzZV9TZXRCYXNlX19kb2NfX30sCiAgICAgeyJHZXRCYXNlIiwgICAoUHlDRnVuY3Rpb24peG1scGFyc2VfR2V0QmFzZSwKLQkJICBNRVRIX05PQVJHUywgeG1scGFyc2VfR2V0QmFzZV9fZG9jX199LAorICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIHhtbHBhcnNlX0dldEJhc2VfX2RvY19ffSwKICAgICB7IkV4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKXhtbHBhcnNlX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlLAotCSAJICBNRVRIX1ZBUkFSR1MsIHhtbHBhcnNlX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlX19kb2NfX30sCisgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsIHhtbHBhcnNlX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlX19kb2NfX30sCiAgICAgeyJTZXRQYXJhbUVudGl0eVBhcnNpbmciLCAoUHlDRnVuY3Rpb24peG1scGFyc2VfU2V0UGFyYW1FbnRpdHlQYXJzaW5nLAotCQkgIE1FVEhfVkFSQVJHUywgeG1scGFyc2VfU2V0UGFyYW1FbnRpdHlQYXJzaW5nX19kb2NfX30sCisgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsIHhtbHBhcnNlX1NldFBhcmFtRW50aXR5UGFyc2luZ19fZG9jX199LAogICAgIHsiR2V0SW5wdXRDb250ZXh0IiwgKFB5Q0Z1bmN0aW9uKXhtbHBhcnNlX0dldElucHV0Q29udGV4dCwKLQkJICBNRVRIX05PQVJHUywgeG1scGFyc2VfR2V0SW5wdXRDb250ZXh0X19kb2NfX30sCisgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgeG1scGFyc2VfR2V0SW5wdXRDb250ZXh0X19kb2NfX30sCiAjaWYgWE1MX0NPTUJJTkVEX1ZFUlNJT04gPj0gMTk1MDUKICAgICB7IlVzZUZvcmVpZ25EVEQiLCAoUHlDRnVuY3Rpb24peG1scGFyc2VfVXNlRm9yZWlnbkRURCwKLQkJICBNRVRIX1ZBUkFSR1MsIHhtbHBhcnNlX1VzZUZvcmVpZ25EVERfX2RvY19ffSwKKyAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywgeG1scGFyc2VfVXNlRm9yZWlnbkRURF9fZG9jX199LAogI2VuZGlmCi0gICAge05VTEwsCSAgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICBOVUxMfSAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiAtLS0tLS0tLS0tICovCkBAIC0xMjQwLDcgKzEyNDAsNyBAQAogewogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCXRlbXBsYXRlX2J1ZmZlcltpXSA9IGk7CisgICAgICAgIHRlbXBsYXRlX2J1ZmZlcltpXSA9IGk7CiAgICAgfQogICAgIHRlbXBsYXRlX2J1ZmZlclsyNTZdID0gMDsKIH0KQEAgLTEyNTksMTUgKzEyNTksMTUgQEAKICAgICAgICAgUHlVbmljb2RlX0RlY29kZSh0ZW1wbGF0ZV9idWZmZXIsIDI1NiwgbmFtZSwgInJlcGxhY2UiKTsKIAogICAgIGlmIChfdV9zdHJpbmcgPT0gTlVMTCkKLQlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OwogCiAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JLyogU3R1cGlkIHRvIGFjY2VzcyBkaXJlY3RseSwgYnV0IGZhc3QgKi8KLQlQeV9VTklDT0RFIGMgPSBfdV9zdHJpbmctPnN0cltpXTsKLQlpZiAoYyA9PSBQeV9VTklDT0RFX1JFUExBQ0VNRU5UX0NIQVJBQ1RFUikKLQkgICAgaW5mby0+bWFwW2ldID0gLTE7Ci0JZWxzZQotCSAgICBpbmZvLT5tYXBbaV0gPSBjOworICAgICAgICAvKiBTdHVwaWQgdG8gYWNjZXNzIGRpcmVjdGx5LCBidXQgZmFzdCAqLworICAgICAgICBQeV9VTklDT0RFIGMgPSBfdV9zdHJpbmctPnN0cltpXTsKKyAgICAgICAgaWYgKGMgPT0gUHlfVU5JQ09ERV9SRVBMQUNFTUVOVF9DSEFSQUNURVIpCisgICAgICAgICAgICBpbmZvLT5tYXBbaV0gPSAtMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mby0+bWFwW2ldID0gYzsKICAgICB9CiAgICAgaW5mby0+ZGF0YSA9IE5VTEw7CiAgICAgaW5mby0+Y29udmVydCA9IE5VTEw7CkBAIC0xNDY4LDE5ICsxNDY4LDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSNkZWZpbmUgQVBQRU5EKGxpc3QsIHN0cikJCQkJXAotICAgICAgICBkbyB7CQkJCQkJXAotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOwlcCi0gICAgICAgICAgICAgICAgaWYgKG8gIT0gTlVMTCkJCQkJXAotICAgICAgICAJICAgICAgICBQeUxpc3RfQXBwZW5kKGxpc3QsIG8pOwkJXAotICAgICAgICAgICAgICAgIFB5X1hERUNSRUYobyk7CQkJCVwKKyNkZWZpbmUgQVBQRU5EKGxpc3QsIHN0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHN0cik7IFwKKyAgICAgICAgICAgICAgICBpZiAobyAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgUHlMaXN0X0FwcGVuZChsaXN0LCBvKTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihvKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSB3aGlsZSAoMCkKIAogICAgIGlmIChzdHJjbXAobmFtZSwgIl9fbWVtYmVyc19fIikgPT0gMCkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgUHlPYmplY3QgKnJjID0gUHlMaXN0X05ldygwKTsKLQlpZiAoIXJjKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFyYykKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgZm9yIChpID0gMDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqbyA9IGdldF9oYW5kbGVyX25hbWUoJmhhbmRsZXJfaW5mb1tpXSk7CiAgICAgICAgICAgICBpZiAobyAhPSBOVUxMKQpAQCAtMTYxMiw0MiArMTYxMiw0MiBAQAogICAgIGlmIChzdHJjbXAobmFtZSwgImJ1ZmZlcl9zaXplIikgPT0gMCkgewogICAgICAgbG9uZyBuZXdfYnVmZmVyX3NpemU7CiAgICAgICBpZiAoIVB5SW50X0NoZWNrKHYpKSB7Ci0gICAgICAJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlcl9zaXplIG11c3QgYmUgYW4gaW50ZWdlciIpOwotICAgICAgCXJldHVybiAtMTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlcl9zaXplIG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgICB9CiAKICAgICAgIG5ld19idWZmZXJfc2l6ZT1QeUludF9BU19MT05HKHYpOwogICAgICAgLyogdHJpdmlhbCBjYXNlIC0tIG5vIGNoYW5nZSAqLwogICAgICAgaWYgKG5ld19idWZmZXJfc2l6ZSA9PSBzZWxmLT5idWZmZXJfc2l6ZSkgewotCXJldHVybiAwOworICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KIAogICAgICAgaWYgKG5ld19idWZmZXJfc2l6ZSA8PSAwKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJidWZmZXJfc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIik7Ci0JcmV0dXJuIC0xOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJ1ZmZlcl9zaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgICAgfQogCiAgICAgICAvKiBjaGVjayBtYXhpbXVtICovCiAgICAgICBpZiAobmV3X2J1ZmZlcl9zaXplID4gSU5UX01BWCkgewotCWNoYXIgZXJybXNnWzEwMF07Ci0Jc3ByaW50ZihlcnJtc2csICJidWZmZXJfc2l6ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gJWkiLCBJTlRfTUFYKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgZXJybXNnKTsKLQlyZXR1cm4gLTE7CQorICAgICAgICBjaGFyIGVycm1zZ1sxMDBdOworICAgICAgICBzcHJpbnRmKGVycm1zZywgImJ1ZmZlcl9zaXplIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiAlaSIsIElOVF9NQVgpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgZXJybXNnKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgICAgfQogCiAgICAgICBpZiAoc2VsZi0+YnVmZmVyICE9IE5VTEwpIHsKLQkvKiB0aGVyZSBpcyBhbHJlYWR5IGEgYnVmZmVyICovCi0JaWYgKHNlbGYtPmJ1ZmZlcl91c2VkICE9IDApIHsKLQkgIGZsdXNoX2NoYXJhY3Rlcl9idWZmZXIoc2VsZik7Ci0JfQotCS8qIGZyZWUgZXhpc3RpbmcgYnVmZmVyICovCi0JZnJlZShzZWxmLT5idWZmZXIpOworICAgICAgICAvKiB0aGVyZSBpcyBhbHJlYWR5IGEgYnVmZmVyICovCisgICAgICAgIGlmIChzZWxmLT5idWZmZXJfdXNlZCAhPSAwKSB7CisgICAgICAgICAgZmx1c2hfY2hhcmFjdGVyX2J1ZmZlcihzZWxmKTsKKyAgICAgICAgfQorICAgICAgICAvKiBmcmVlIGV4aXN0aW5nIGJ1ZmZlciAqLworICAgICAgICBmcmVlKHNlbGYtPmJ1ZmZlcik7CiAgICAgICB9CiAgICAgICBzZWxmLT5idWZmZXIgPSBtYWxsb2MobmV3X2J1ZmZlcl9zaXplKTsKICAgICAgIGlmIChzZWxmLT5idWZmZXIgPT0gTlVMTCkgewotCVB5RXJyX05vTWVtb3J5KCk7Ci0JcmV0dXJuIC0xOwotICAgICAgfQkgIAorICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CiAgICAgICBzZWxmLT5idWZmZXJfc2l6ZSA9IG5ld19idWZmZXJfc2l6ZTsKICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTE2OTAsMzcgKzE2OTAsMzcgQEAKIFB5RG9jX1NUUlZBUihYbWxwYXJzZXR5cGVfX2RvY19fLCAiWE1MIHBhcnNlciIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFhtbHBhcnNldHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkicHlleHBhdC54bWxwYXJzZXIiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YoeG1scGFyc2VvYmplY3QpICsgUHlHQ19IRUFEX1NJWkUsLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcil4bWxwYXJzZV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYyl4bWxwYXJzZV9nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYyl4bWxwYXJzZV9zZXRhdHRyLAkvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKTAsCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykwLAkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCS8qdHBfYXNfbWFwcGluZyovCi0JKGhhc2hmdW5jKTAsCQkvKnRwX2hhc2gqLwotCSh0ZXJuYXJ5ZnVuYykwLAkJLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfc3RyKi8KLQkwLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICAgICAicHlleHBhdC54bWxwYXJzZXIiLCAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgICAgIHNpemVvZih4bWxwYXJzZW9iamVjdCkgKyBQeUdDX0hFQURfU0laRSwvKnRwX2Jhc2ljc2l6ZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgICAgIC8qIG1ldGhvZHMgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpeG1scGFyc2VfZGVhbGxvYywgICAvKnRwX2RlYWxsb2MqLworICAgICAgICAocHJpbnRmdW5jKTAsICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAgICAgKGdldGF0dHJmdW5jKXhtbHBhcnNlX2dldGF0dHIsICAvKnRwX2dldGF0dHIqLworICAgICAgICAoc2V0YXR0cmZ1bmMpeG1scGFyc2Vfc2V0YXR0ciwgIC8qdHBfc2V0YXR0ciovCisgICAgICAgIChjbXBmdW5jKTAsICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgICAgIChyZXByZnVuYykwLCAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgICAgICAwLCAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAgICAgKGhhc2hmdW5jKTAsICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAgICAgKHRlcm5hcnlmdW5jKTAsICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAgICAgKHJlcHJmdW5jKTAsICAgICAgICAgICAgLyp0cF9zdHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICNpZmRlZiBQeV9UUEZMQUdTX0hBVkVfR0MKLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qdHBfZmxhZ3MqLworICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qdHBfZmxhZ3MqLwogI2Vsc2UKLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0dDLCAvKnRwX2ZsYWdzKi8KKyAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19HQywgLyp0cF9mbGFncyovCiAjZW5kaWYKLQlYbWxwYXJzZXR5cGVfX2RvY19fLCAvKiB0cF9kb2MgLSBEb2N1bWVudGF0aW9uIHN0cmluZyAqLworICAgICAgICBYbWxwYXJzZXR5cGVfX2RvY19fLCAvKiB0cF9kb2MgLSBEb2N1bWVudGF0aW9uIHN0cmluZyAqLwogI2lmZGVmIFdJVEhfQ1lDTEVfR0MKLQkodHJhdmVyc2Vwcm9jKXhtbHBhcnNlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KXhtbHBhcnNlX2NsZWFyCQkvKiB0cF9jbGVhciAqLworICAgICAgICAodHJhdmVyc2Vwcm9jKXhtbHBhcnNlX3RyYXZlcnNlLCAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAgICAgKGlucXVpcnkpeG1scGFyc2VfY2xlYXIgICAgICAgICAvKiB0cF9jbGVhciAqLwogI2Vsc2UKLQkwLCAwCisgICAgICAgIDAsIDAKICNlbmRpZgogfTsKIApAQCAtMTc1NSwyMSArMTc1NSwyMSBAQAogICAgIC8qIEV4cGxpY2l0bHkgcGFzc2luZyBOb25lIG1lYW5zIG5vIGludGVybmluZyBpcyBkZXNpcmVkLgogICAgICAgIE5vdCBwYXNzaW5nIGFueXRoaW5nIG1lYW5zIHRoYXQgYSBuZXcgZGljdGlvbmFyeSBpcyB1c2VkLiAqLwogICAgIGlmIChpbnRlcm4gPT0gUHlfTm9uZSkKLQlpbnRlcm4gPSBOVUxMOworICAgICAgICBpbnRlcm4gPSBOVUxMOwogICAgIGVsc2UgaWYgKGludGVybiA9PSBOVUxMKSB7Ci0JaW50ZXJuID0gUHlEaWN0X05ldygpOwotCWlmICghaW50ZXJuKQotCSAgICByZXR1cm4gTlVMTDsKLQlpbnRlcm5fZGVjcmVmID0gMTsKKyAgICAgICAgaW50ZXJuID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoIWludGVybikKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpbnRlcm5fZGVjcmVmID0gMTsKICAgICB9CiAgICAgZWxzZSBpZiAoIVB5RGljdF9DaGVjayhpbnRlcm4pKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImludGVybiBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaW50ZXJuIG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHJlc3VsdCA9IG5ld3htbHBhcnNlb2JqZWN0KGVuY29kaW5nLCBuYW1lc3BhY2Vfc2VwYXJhdG9yLCBpbnRlcm4pOwogICAgIGlmIChpbnRlcm5fZGVjcmVmKSB7Ci0JUHlfREVDUkVGKGludGVybik7CisgICAgICAgIFB5X0RFQ1JFRihpbnRlcm4pOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMTc5MSwxMiArMTc5MSwxMiBAQAogLyogTGlzdCBvZiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHB5ZXhwYXRfbWV0aG9kc1tdID0gewotICAgIHsiUGFyc2VyQ3JlYXRlIiwJKFB5Q0Z1bmN0aW9uKXB5ZXhwYXRfUGFyc2VyQ3JlYXRlLAorICAgIHsiUGFyc2VyQ3JlYXRlIiwgICAgKFB5Q0Z1bmN0aW9uKXB5ZXhwYXRfUGFyc2VyQ3JlYXRlLAogICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgcHlleHBhdF9QYXJzZXJDcmVhdGVfX2RvY19ffSwKLSAgICB7IkVycm9yU3RyaW5nIiwJKFB5Q0Z1bmN0aW9uKXB5ZXhwYXRfRXJyb3JTdHJpbmcsCi0gICAgIE1FVEhfVkFSQVJHUywJcHlleHBhdF9FcnJvclN0cmluZ19fZG9jX199LAorICAgIHsiRXJyb3JTdHJpbmciLCAgICAgKFB5Q0Z1bmN0aW9uKXB5ZXhwYXRfRXJyb3JTdHJpbmcsCisgICAgIE1FVEhfVkFSQVJHUywgICAgICBweWV4cGF0X0Vycm9yU3RyaW5nX19kb2NfX30sCiAKLSAgICB7TlVMTCwJIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgKFB5Q0Z1bmN0aW9uKU5VTEwsIDAsIE5VTEx9ICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIE1vZHVsZSBkb2NzdHJpbmcgKi8KQEAgLTE4NjgsNyArMTg2OCw3IEBACiAgICAgbSA9IFB5X0luaXRNb2R1bGUzKE1PRFVMRV9OQU1FLCBweWV4cGF0X21ldGhvZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHB5ZXhwYXRfbW9kdWxlX2RvY3VtZW50YXRpb24pOwogICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAKICAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwogICAgIGlmIChFcnJvck9iamVjdCA9PSBOVUxMKSB7CkBAIC0xOTI3LDcgKzE5MjcsNyBAQAogICAgIGlmIChlcnJvcnNfbW9kdWxlID09IE5VTEwgfHwgbW9kZWxfbW9kdWxlID09IE5VTEwpCiAgICAgICAgIC8qIERvbid0IGNvcmUgZHVtcCBsYXRlciEgKi8KICAgICAgICAgcmV0dXJuOwotICAgIAorCiAjaWYgWE1MX0NPTUJJTkVEX1ZFUlNJT04gPiAxOTUwNQogICAgIHsKICAgICAgICAgY29uc3QgWE1MX0ZlYXR1cmUgKmZlYXR1cmVzID0gWE1MX0dldEZlYXR1cmVMaXN0KCk7CkBAIC0yMDUyLDcgKzIwNTIsNyBAQAogICAgIGNhcGkuU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciA9IFhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyOwogICAgIGNhcGkuU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlciA9IFhNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyOwogICAgIGNhcGkuU2V0VXNlckRhdGEgPSBYTUxfU2V0VXNlckRhdGE7Ci0gICAgCisKICAgICAvKiBleHBvcnQgdXNpbmcgY2Fwc3VsZSAqLwogICAgIGNhcGlfb2JqZWN0ID0gUHlDYXBzdWxlX05ldygmY2FwaSwgUHlFeHBhdF9DQVBTVUxFX05BTUUsIE5VTEwpOwogICAgIGlmIChjYXBpX29iamVjdCkKQEAgLTIwNjcsMTIgKzIwNjcsMTIgQEAKIAogICAgIGZvciAoOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKICAgICAgICAgaWYgKGluaXRpYWwpCi0JICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKLQllbHNlIHsKKyAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICB0ZW1wID0gc2VsZi0+aGFuZGxlcnNbaV07CiAgICAgICAgICAgICBzZWxmLT5oYW5kbGVyc1tpXSA9IE5VTEw7CiAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotCSAgICBoYW5kbGVyX2luZm9baV0uc2V0dGVyKHNlbGYtPml0c2VsZiwgTlVMTCk7CisgICAgICAgICAgICBoYW5kbGVyX2luZm9baV0uc2V0dGVyKHNlbGYtPml0c2VsZiwgTlVMTCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3JlYWRsaW5lLmMgYi9Nb2R1bGVzL3JlYWRsaW5lLmMKaW5kZXggMDY1NzcxMy4uNGE1ZDA4OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yZWFkbGluZS5jCisrKyBiL01vZHVsZXMvcmVhZGxpbmUuYwpAQCAtMzMsNyArMzMsNyBAQAogCiAjaWZkZWYgSEFWRV9STF9DT01QTEVUSU9OX01BVENIRVMKICNkZWZpbmUgY29tcGxldGlvbl9tYXRjaGVzKHgsIHkpIFwKLQlybF9jb21wbGV0aW9uX21hdGNoZXMoKHgpLCAoKHJsX2NvbXBlbnRyeV9mdW5jX3QgKikoeSkpKQorICAgIHJsX2NvbXBsZXRpb25fbWF0Y2hlcygoeCksICgocmxfY29tcGVudHJ5X2Z1bmNfdCAqKSh5KSkpCiAjZWxzZQogI2lmIGRlZmluZWQoX1JMX0ZVTkNUSU9OX1RZUEVERUYpCiBleHRlcm4gY2hhciAqKmNvbXBsZXRpb25fbWF0Y2hlcyhjaGFyICosIHJsX2NvbXBlbnRyeV9mdW5jX3QgKik7CkBAIC02Niw3ICs2Niw3IEBACiAKIHN0YXRpYyB2b2lkCiBvbl9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rKGNoYXIgKiptYXRjaGVzLAotCQkJCSAgIGludCBudW1fbWF0Y2hlcywgaW50IG1heF9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX21hdGNoZXMsIGludCBtYXhfbGVuZ3RoKTsKIAogCiAvKiBFeHBvcnRlZCBmdW5jdGlvbiB0byBzZW5kIG9uZSBsaW5lIHRvIHJlYWRsaW5lJ3MgaW5pdCBmaWxlIHBhcnNlciAqLwpAQCAtNzQsMTggKzc0LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcGFyc2VfYW5kX2JpbmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICpjb3B5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpwYXJzZV9hbmRfYmluZCIsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogTWFrZSBhIGNvcHkgLS0gcmxfcGFyc2VfYW5kX2JpbmQoKSBtb2RpZmllcyBpdHMgYXJndW1lbnQgKi8KLQkvKiBCZXJuYXJkIEhlcnpvZyAqLwotCWNvcHkgPSBtYWxsb2MoMSArIHN0cmxlbihzKSk7Ci0JaWYgKGNvcHkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0Jc3RyY3B5KGNvcHksIHMpOwotCXJsX3BhcnNlX2FuZF9iaW5kKGNvcHkpOwotCWZyZWUoY29weSk7IC8qIEZyZWUgdGhlIGNvcHkgKi8KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBjaGFyICpzLCAqY29weTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6cGFyc2VfYW5kX2JpbmQiLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIE1ha2UgYSBjb3B5IC0tIHJsX3BhcnNlX2FuZF9iaW5kKCkgbW9kaWZpZXMgaXRzIGFyZ3VtZW50ICovCisgICAgLyogQmVybmFyZCBIZXJ6b2cgKi8KKyAgICBjb3B5ID0gbWFsbG9jKDEgKyBzdHJsZW4ocykpOworICAgIGlmIChjb3B5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIHN0cmNweShjb3B5LCBzKTsKKyAgICBybF9wYXJzZV9hbmRfYmluZChjb3B5KTsKKyAgICBmcmVlKGNvcHkpOyAvKiBGcmVlIHRoZSBjb3B5ICovCisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfcGFyc2VfYW5kX2JpbmQsCkBAIC05OCwxMyArOTgsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByZWFkX2luaXRfZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8ejpyZWFkX2luaXRfZmlsZSIsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJybm8gPSBybF9yZWFkX2luaXRfZmlsZShzKTsKLQlpZiAoZXJybm8pCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgY2hhciAqcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8ejpyZWFkX2luaXRfZmlsZSIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJybm8gPSBybF9yZWFkX2luaXRfZmlsZShzKTsKKyAgICBpZiAoZXJybm8pCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfcmVhZF9pbml0X2ZpbGUsCkBAIC0xMTgsMTMgKzExOCwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJlYWRfaGlzdG9yeV9maWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInx6OnJlYWRfaGlzdG9yeV9maWxlIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQllcnJubyA9IHJlYWRfaGlzdG9yeShzKTsKLQlpZiAoZXJybm8pCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgY2hhciAqcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8ejpyZWFkX2hpc3RvcnlfZmlsZSIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJybm8gPSByZWFkX2hpc3Rvcnkocyk7CisgICAgaWYgKGVycm5vKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgaW50IF9oaXN0b3J5X2xlbmd0aCA9IC0xOyAvKiBkbyBub3QgdHJ1bmNhdGUgaGlzdG9yeSBieSBkZWZhdWx0ICovCkBAIC0xMzksMTUgKzEzOSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdyaXRlX2hpc3RvcnlfZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8ejp3cml0ZV9oaXN0b3J5X2ZpbGUiLCAmcykpCi0JCXJldHVybiBOVUxMOwotCWVycm5vID0gd3JpdGVfaGlzdG9yeShzKTsKLQlpZiAoIWVycm5vICYmIF9oaXN0b3J5X2xlbmd0aCA+PSAwKQotCQloaXN0b3J5X3RydW5jYXRlX2ZpbGUocywgX2hpc3RvcnlfbGVuZ3RoKTsKLQlpZiAoZXJybm8pCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgY2hhciAqcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8ejp3cml0ZV9oaXN0b3J5X2ZpbGUiLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVycm5vID0gd3JpdGVfaGlzdG9yeShzKTsKKyAgICBpZiAoIWVycm5vICYmIF9oaXN0b3J5X2xlbmd0aCA+PSAwKQorICAgICAgICBoaXN0b3J5X3RydW5jYXRlX2ZpbGUocywgX2hpc3RvcnlfbGVuZ3RoKTsKKyAgICBpZiAoZXJybm8pCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2Nfd3JpdGVfaGlzdG9yeV9maWxlLApAQCAtMTYxLDExICsxNjEsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHNldF9oaXN0b3J5X2xlbmd0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGxlbmd0aCA9IF9oaXN0b3J5X2xlbmd0aDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0X2hpc3RvcnlfbGVuZ3RoIiwgJmxlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCV9oaXN0b3J5X2xlbmd0aCA9IGxlbmd0aDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpbnQgbGVuZ3RoID0gX2hpc3RvcnlfbGVuZ3RoOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRfaGlzdG9yeV9sZW5ndGgiLCAmbGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2hpc3RvcnlfbGVuZ3RoID0gbGVuZ3RoOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoc2V0X2hpc3RvcnlfbGVuZ3RoX2RvYywKQEAgLTE4MCw3ICsxODAsNyBAQAogc3RhdGljIFB5T2JqZWN0KgogZ2V0X2hpc3RvcnlfbGVuZ3RoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmcpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKF9oaXN0b3J5X2xlbmd0aCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKF9oaXN0b3J5X2xlbmd0aCk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRfaGlzdG9yeV9sZW5ndGhfZG9jLApAQCAtMTk0LDI5ICsxOTQsMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaG9vayhjb25zdCBjaGFyICpmdW5jbmFtZSwgUHlPYmplY3QgKipob29rX3ZhciwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZ1bmN0aW9uID0gUHlfTm9uZTsKLQljaGFyIGJ1Zls4MF07Ci0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAifE86c2V0XyUuNTBzIiwgZnVuY25hbWUpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBidWYsICZmdW5jdGlvbikpCi0JCXJldHVybiBOVUxMOwotCWlmIChmdW5jdGlvbiA9PSBQeV9Ob25lKSB7Ci0JCVB5X1hERUNSRUYoKmhvb2tfdmFyKTsKLQkJKmhvb2tfdmFyID0gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoUHlDYWxsYWJsZV9DaGVjayhmdW5jdGlvbikpIHsKLQkJUHlPYmplY3QgKnRtcCA9ICpob29rX3ZhcjsKLQkJUHlfSU5DUkVGKGZ1bmN0aW9uKTsKLQkJKmhvb2tfdmFyID0gZnVuY3Rpb247Ci0JCVB5X1hERUNSRUYodG1wKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAgICJzZXRfJS41MHMoZnVuYyk6IGFyZ3VtZW50IG5vdCBjYWxsYWJsZSIsCi0JCQkgICAgICBmdW5jbmFtZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGJ1Zik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeU9iamVjdCAqZnVuY3Rpb24gPSBQeV9Ob25lOworICAgIGNoYXIgYnVmWzgwXTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ8TzpzZXRfJS41MHMiLCBmdW5jbmFtZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIGJ1ZiwgJmZ1bmN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGZ1bmN0aW9uID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfWERFQ1JFRigqaG9va192YXIpOworICAgICAgICAqaG9va192YXIgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChQeUNhbGxhYmxlX0NoZWNrKGZ1bmN0aW9uKSkgeworICAgICAgICBQeU9iamVjdCAqdG1wID0gKmhvb2tfdmFyOworICAgICAgICBQeV9JTkNSRUYoZnVuY3Rpb24pOworICAgICAgICAqaG9va192YXIgPSBmdW5jdGlvbjsKKyAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXRfJS41MHMoZnVuYyk6IGFyZ3VtZW50IG5vdCBjYWxsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgZnVuY25hbWUpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIApAQCAtMjMyLDIwICsyMzIsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IHNldF9ob29rKCJjb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rIiwKLQkJCSZjb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rLCBhcmdzKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gc2V0X2hvb2soImNvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2siLAorICAgICAgICAgICAgICAgICAgICAmY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vaywgYXJncyk7CiAjaWZkZWYgSEFWRV9STF9DT01QTEVUSU9OX0RJU1BMQVlfTUFUQ0hFU19IT09LCi0JLyogV2UgY2Fubm90IHNldCB0aGlzIGhvb2sgZ2xvYmFsbHksIHNpbmNlIGl0IHJlcGxhY2VzIHRoZQotCSAgIGRlZmF1bHQgY29tcGxldGlvbiBkaXNwbGF5LiAqLwotCXJsX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sgPQotCQljb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rID8KKyAgICAvKiBXZSBjYW5ub3Qgc2V0IHRoaXMgaG9vayBnbG9iYWxseSwgc2luY2UgaXQgcmVwbGFjZXMgdGhlCisgICAgICAgZGVmYXVsdCBjb21wbGV0aW9uIGRpc3BsYXkuICovCisgICAgcmxfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayA9CisgICAgICAgIGNvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sgPwogI2lmIGRlZmluZWQoX1JMX0ZVTkNUSU9OX1RZUEVERUYpCi0JCShybF9jb21wZGlzcF9mdW5jX3QgKilvbl9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rIDogMDsKKyAgICAgICAgKHJsX2NvbXBkaXNwX2Z1bmNfdCAqKW9uX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sgOiAwOwogI2Vsc2UKLQkJKFZGdW5jdGlvbiAqKW9uX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sgOiAwOworICAgICAgICAoVkZ1bmN0aW9uICopb25fY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayA6IDA7CiAjZW5kaWYKICNlbmRpZgotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogfQogCkBAIC0yNTksNyArMjU5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfc3RhcnR1cF9ob29rKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc2V0X2hvb2soInN0YXJ0dXBfaG9vayIsICZzdGFydHVwX2hvb2ssIGFyZ3MpOworICAgIHJldHVybiBzZXRfaG9vaygic3RhcnR1cF9ob29rIiwgJnN0YXJ0dXBfaG9vaywgYXJncyk7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2Nfc2V0X3N0YXJ0dXBfaG9vaywKQEAgLTI3Niw3ICsyNzYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9wcmVfaW5wdXRfaG9vayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHNldF9ob29rKCJwcmVfaW5wdXRfaG9vayIsICZwcmVfaW5wdXRfaG9vaywgYXJncyk7CisgICAgcmV0dXJuIHNldF9ob29rKCJwcmVfaW5wdXRfaG9vayIsICZwcmVfaW5wdXRfaG9vaywgYXJncyk7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2Nfc2V0X3ByZV9pbnB1dF9ob29rLApAQCAtMzE0LDggKzMxNCw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2JlZ2lkeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJnKQogewotCVB5X0lOQ1JFRihiZWdpZHgpOwotCXJldHVybiBiZWdpZHg7CisgICAgUHlfSU5DUkVGKGJlZ2lkeCk7CisgICAgcmV0dXJuIGJlZ2lkeDsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19nZXRfYmVnaWR4LApAQCAtMzI4LDggKzMyOCw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2VuZGlkeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJnKQogewotCVB5X0lOQ1JFRihlbmRpZHgpOwotCXJldHVybiBlbmRpZHg7CisgICAgUHlfSU5DUkVGKGVuZGlkeCk7CisgICAgcmV0dXJuIGVuZGlkeDsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19nZXRfZW5kaWR4LApAQCAtMzQyLDE0ICszNDIsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY29tcGxldGVyX2RlbGltcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqYnJlYWtfY2hhcnM7CisgICAgY2hhciAqYnJlYWtfY2hhcnM7CiAKLQlpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzZXRfY29tcGxldGVyX2RlbGltcyIsICZicmVha19jaGFycykpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZyZWUoKHZvaWQqKXJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMpOwotCXJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPSBzdHJkdXAoYnJlYWtfY2hhcnMpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnNldF9jb21wbGV0ZXJfZGVsaW1zIiwgJmJyZWFrX2NoYXJzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnJlZSgodm9pZCopcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyk7CisgICAgcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyA9IHN0cmR1cChicmVha19jaGFycyk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2Nfc2V0X2NvbXBsZXRlcl9kZWxpbXMsCkBAIC0zNTksMzEgKzM1OSwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB5X3JlbW92ZV9oaXN0b3J5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZW50cnlfbnVtYmVyOwotCUhJU1RfRU5UUlkgKmVudHJ5OworICAgIGludCBlbnRyeV9udW1iZXI7CisgICAgSElTVF9FTlRSWSAqZW50cnk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVtb3ZlX2hpc3RvcnkiLCAmZW50cnlfbnVtYmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGVudHJ5X251bWJlciA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIkhpc3RvcnkgaW5kZXggY2Fubm90IGJlIG5lZ2F0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbnRyeSA9IHJlbW92ZV9oaXN0b3J5KGVudHJ5X251bWJlcik7Ci0JaWYgKCFlbnRyeSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIk5vIGhpc3RvcnkgaXRlbSBhdCBwb3NpdGlvbiAlZCIsCi0JCQkgICAgICBlbnRyeV9udW1iZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgaGlzdG9yeSBlbnRyeSAqLwotCWlmIChlbnRyeS0+bGluZSkKLQkJZnJlZSgodm9pZCAqKWVudHJ5LT5saW5lKTsKLQlpZiAoZW50cnktPmRhdGEpCi0JCWZyZWUoZW50cnktPmRhdGEpOwotCWZyZWUoZW50cnkpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpyZW1vdmVfaGlzdG9yeSIsICZlbnRyeV9udW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZW50cnlfbnVtYmVyIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJIaXN0b3J5IGluZGV4IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZW50cnkgPSByZW1vdmVfaGlzdG9yeShlbnRyeV9udW1iZXIpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTm8gaGlzdG9yeSBpdGVtIGF0IHBvc2l0aW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBlbnRyeV9udW1iZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgaGlzdG9yeSBlbnRyeSAqLworICAgIGlmIChlbnRyeS0+bGluZSkKKyAgICAgICAgZnJlZSgodm9pZCAqKWVudHJ5LT5saW5lKTsKKyAgICBpZiAoZW50cnktPmRhdGEpCisgICAgICAgIGZyZWUoZW50cnktPmRhdGEpOworICAgIGZyZWUoZW50cnkpOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfcmVtb3ZlX2hpc3RvcnksCkBAIC0zOTMsMzQgKzM5MywzNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB5X3JlcGxhY2VfaGlzdG9yeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGVudHJ5X251bWJlcjsKLQljaGFyICpsaW5lOwotCUhJU1RfRU5UUlkgKm9sZF9lbnRyeTsKKyAgICBpbnQgZW50cnlfbnVtYmVyOworICAgIGNoYXIgKmxpbmU7CisgICAgSElTVF9FTlRSWSAqb2xkX2VudHJ5OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpczpyZXBsYWNlX2hpc3RvcnkiLCAmZW50cnlfbnVtYmVyLAotCSAgICAgIAkJICAgICAgJmxpbmUpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZW50cnlfbnVtYmVyIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiSGlzdG9yeSBpbmRleCBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9sZF9lbnRyeSA9IHJlcGxhY2VfaGlzdG9yeV9lbnRyeShlbnRyeV9udW1iZXIsIGxpbmUsICh2b2lkICopTlVMTCk7Ci0JaWYgKCFvbGRfZW50cnkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJObyBoaXN0b3J5IGl0ZW0gYXQgcG9zaXRpb24gJWQiLAotCQkJICAgICBlbnRyeV9udW1iZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb2xkIGhpc3RvcnkgZW50cnkgKi8KLQlpZiAob2xkX2VudHJ5LT5saW5lKQotCSAgICBmcmVlKCh2b2lkICopb2xkX2VudHJ5LT5saW5lKTsKLQlpZiAob2xkX2VudHJ5LT5kYXRhKQotCSAgICBmcmVlKG9sZF9lbnRyeS0+ZGF0YSk7Ci0JZnJlZShvbGRfZW50cnkpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXM6cmVwbGFjZV9oaXN0b3J5IiwgJmVudHJ5X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbmUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZW50cnlfbnVtYmVyIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJIaXN0b3J5IGluZGV4IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb2xkX2VudHJ5ID0gcmVwbGFjZV9oaXN0b3J5X2VudHJ5KGVudHJ5X251bWJlciwgbGluZSwgKHZvaWQgKilOVUxMKTsKKyAgICBpZiAoIW9sZF9lbnRyeSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJObyBoaXN0b3J5IGl0ZW0gYXQgcG9zaXRpb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgZW50cnlfbnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9sZCBoaXN0b3J5IGVudHJ5ICovCisgICAgaWYgKG9sZF9lbnRyeS0+bGluZSkKKyAgICAgICAgZnJlZSgodm9pZCAqKW9sZF9lbnRyeS0+bGluZSk7CisgICAgaWYgKG9sZF9lbnRyeS0+ZGF0YSkKKyAgICAgICAgZnJlZShvbGRfZW50cnktPmRhdGEpOworICAgIGZyZWUob2xkX2VudHJ5KTsKIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3JlcGxhY2VfaGlzdG9yeSwKQEAgLTQzMiwxMyArNDMyLDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHlfYWRkX2hpc3RvcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmxpbmU7CisgICAgY2hhciAqbGluZTsKIAotCWlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmFkZF9oaXN0b3J5IiwgJmxpbmUpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhZGRfaGlzdG9yeShsaW5lKTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczphZGRfaGlzdG9yeSIsICZsaW5lKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYWRkX2hpc3RvcnkobGluZSk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfYWRkX2hpc3RvcnksCkBAIC00NTEsNyArNDUxLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY29tcGxldGVyX2RlbGltcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJnKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMpOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2dldF9jb21wbGV0ZXJfZGVsaW1zLApAQCAtNDY0LDcgKzQ2NCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NvbXBsZXRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHNldF9ob29rKCJjb21wbGV0ZXIiLCAmY29tcGxldGVyLCBhcmdzKTsKKyAgICByZXR1cm4gc2V0X2hvb2soImNvbXBsZXRlciIsICZjb21wbGV0ZXIsIGFyZ3MpOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3NldF9jb21wbGV0ZXIsCkBAIC00NzgsMTEgKzQ3OCwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9jb21wbGV0ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JaWYgKGNvbXBsZXRlciA9PSBOVUxMKSB7Ci0JCVB5X1JFVFVSTl9OT05FOwotCX0KLQlQeV9JTkNSRUYoY29tcGxldGVyKTsKLQlyZXR1cm4gY29tcGxldGVyOworICAgIGlmIChjb21wbGV0ZXIgPT0gTlVMTCkgeworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGNvbXBsZXRlcik7CisgICAgcmV0dXJuIGNvbXBsZXRlcjsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19nZXRfY29tcGxldGVyLApAQCAtNDk1LDM5ICs0OTUsMzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfaGlzdG9yeV9pdGVtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaWR4ID0gMDsKLQlISVNUX0VOVFJZICpoaXN0X2VudDsKKyAgICBpbnQgaWR4ID0gMDsKKyAgICBISVNUX0VOVFJZICpoaXN0X2VudDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTppbmRleCIsICZpZHgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6aW5kZXgiLCAmaWR4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgIF9fQVBQTEVfXwotCWlmICh1c2luZ19saWJlZGl0X2VtdWxhdGlvbikgewotCQkvKiBMaWJlZGl0IGVtdWxhdGlvbiB1c2VzIDAtYmFzZWQgaW5kZXhlcywKLQkJICogdGhlIHJlYWwgb25lIHVzZXMgMS1iYXNlZCBpbmRleGVzLAotCQkgKiBhZGp1c3QgdGhlIGluZGV4IHRvIGVuc3VyZSB0aGF0IFB5dGhvbgotCQkgKiBjb2RlIGRvZXNuJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUKLQkJICogZGlmZmVyZW5jZS4KLQkJICovCi0JCUhJU1RPUllfU1RBVEUgKmhpc3Rfc3Q7Ci0JCWhpc3Rfc3QgPSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlKCk7CisgICAgaWYgKHVzaW5nX2xpYmVkaXRfZW11bGF0aW9uKSB7CisgICAgICAgIC8qIExpYmVkaXQgZW11bGF0aW9uIHVzZXMgMC1iYXNlZCBpbmRleGVzLAorICAgICAgICAgKiB0aGUgcmVhbCBvbmUgdXNlcyAxLWJhc2VkIGluZGV4ZXMsCisgICAgICAgICAqIGFkanVzdCB0aGUgaW5kZXggdG8gZW5zdXJlIHRoYXQgUHl0aG9uCisgICAgICAgICAqIGNvZGUgZG9lc24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZQorICAgICAgICAgKiBkaWZmZXJlbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgSElTVE9SWV9TVEFURSAqaGlzdF9zdDsKKyAgICAgICAgaGlzdF9zdCA9IGhpc3RvcnlfZ2V0X2hpc3Rvcnlfc3RhdGUoKTsKIAotCQlpZHggLS07CisgICAgICAgIGlkeCAtLTsKIAotCQkvKgotCQkgKiBBcHBsZSdzIHJlYWRsaW5lIGVtdWxhdGlvbiBjcmFzaGVzIHdoZW4KLQkJICogdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSwgdGhlcmVmb3JlCi0JCSAqIHRlc3QgZm9yIHRoYXQgYW5kIGZhaWwgZ3JhY2VmdWxseS4KLQkJICovCi0JCWlmIChpZHggPCAwIHx8IGlkeCA+PSBoaXN0X3N0LT5sZW5ndGgpIHsKLQkJCVB5X1JFVFVSTl9OT05FOwotCQl9Ci0JfQorICAgICAgICAvKgorICAgICAgICAgKiBBcHBsZSdzIHJlYWRsaW5lIGVtdWxhdGlvbiBjcmFzaGVzIHdoZW4KKyAgICAgICAgICogdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSwgdGhlcmVmb3JlCisgICAgICAgICAqIHRlc3QgZm9yIHRoYXQgYW5kIGZhaWwgZ3JhY2VmdWxseS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBoaXN0X3N0LT5sZW5ndGgpIHsKKyAgICAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgICAgICB9CisgICAgfQogI2VuZGlmIC8qIF9fQVBQTEVfXyAqLwotCWlmICgoaGlzdF9lbnQgPSBoaXN0b3J5X2dldChpZHgpKSkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoaGlzdF9lbnQtPmxpbmUpOwotCWVsc2UgewotCQlQeV9SRVRVUk5fTk9ORTsKLQl9CisgICAgaWYgKChoaXN0X2VudCA9IGhpc3RvcnlfZ2V0KGlkeCkpKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhoaXN0X2VudC0+bGluZSk7CisgICAgZWxzZSB7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KIH0KIAogUHlEb2NfU1RSVkFSKGRvY19nZXRfaGlzdG9yeV9pdGVtLApAQCAtNTQwLDEwICs1NDAsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJnKQogewotCUhJU1RPUllfU1RBVEUgKmhpc3Rfc3Q7CisgICAgSElTVE9SWV9TVEFURSAqaGlzdF9zdDsKIAotCWhpc3Rfc3QgPSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlKCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGhpc3Rfc3QgPyAobG9uZykgaGlzdF9zdC0+bGVuZ3RoIDogKGxvbmcpIDApOworICAgIGhpc3Rfc3QgPSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlKCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGhpc3Rfc3QgPyAobG9uZykgaGlzdF9zdC0+bGVuZ3RoIDogKGxvbmcpIDApOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2dldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoLApAQCAtNTU2LDcgKzU1Niw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2xpbmVfYnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmcpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmxfbGluZV9idWZmZXIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHJsX2xpbmVfYnVmZmVyKTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19nZXRfbGluZV9idWZmZXIsCkBAIC01NzEsOCArNTcxLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBweV9jbGVhcl9oaXN0b3J5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmcpCiB7Ci0JY2xlYXJfaGlzdG9yeSgpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGNsZWFyX2hpc3RvcnkoKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19jbGVhcl9oaXN0b3J5LApAQCAtNTg2LDExICs1ODYsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnNlcnRfdGV4dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aW5zZXJ0X3RleHQiLCAmcykpCi0JCXJldHVybiBOVUxMOwotCXJsX2luc2VydF90ZXh0KHMpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGNoYXIgKnM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmluc2VydF90ZXh0IiwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybF9pbnNlcnRfdGV4dChzKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19pbnNlcnRfdGV4dCwKQEAgLTYwMyw4ICs2MDMsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJlZGlzcGxheShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJnKQogewotCXJsX3JlZGlzcGxheSgpOwotCVB5X1JFVFVSTl9OT05FOworICAgIHJsX3JlZGlzcGxheSgpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3JlZGlzcGxheSwKQEAgLTYxNyw1MCArNjE3LDUwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgcmVhZGxpbmVfbWV0aG9kc1tdID0KIHsKLQl7InBhcnNlX2FuZF9iaW5kIiwgcGFyc2VfYW5kX2JpbmQsIE1FVEhfVkFSQVJHUywgZG9jX3BhcnNlX2FuZF9iaW5kfSwKLQl7ImdldF9saW5lX2J1ZmZlciIsIGdldF9saW5lX2J1ZmZlciwgTUVUSF9OT0FSR1MsIGRvY19nZXRfbGluZV9idWZmZXJ9LAotCXsiaW5zZXJ0X3RleHQiLCBpbnNlcnRfdGV4dCwgTUVUSF9WQVJBUkdTLCBkb2NfaW5zZXJ0X3RleHR9LAotCXsicmVkaXNwbGF5IiwgcmVkaXNwbGF5LCBNRVRIX05PQVJHUywgZG9jX3JlZGlzcGxheX0sCi0JeyJyZWFkX2luaXRfZmlsZSIsIHJlYWRfaW5pdF9maWxlLCBNRVRIX1ZBUkFSR1MsIGRvY19yZWFkX2luaXRfZmlsZX0sCi0JeyJyZWFkX2hpc3RvcnlfZmlsZSIsIHJlYWRfaGlzdG9yeV9maWxlLAotCSBNRVRIX1ZBUkFSR1MsIGRvY19yZWFkX2hpc3RvcnlfZmlsZX0sCi0JeyJ3cml0ZV9oaXN0b3J5X2ZpbGUiLCB3cml0ZV9oaXN0b3J5X2ZpbGUsCi0JIE1FVEhfVkFSQVJHUywgZG9jX3dyaXRlX2hpc3RvcnlfZmlsZX0sCi0JeyJnZXRfaGlzdG9yeV9pdGVtIiwgZ2V0X2hpc3RvcnlfaXRlbSwKLQkgTUVUSF9WQVJBUkdTLCBkb2NfZ2V0X2hpc3RvcnlfaXRlbX0sCi0JeyJnZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aCIsIChQeUNGdW5jdGlvbilnZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aCwKLQkgTUVUSF9OT0FSR1MsIGRvY19nZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aH0sCi0JeyJzZXRfaGlzdG9yeV9sZW5ndGgiLCBzZXRfaGlzdG9yeV9sZW5ndGgsCi0JIE1FVEhfVkFSQVJHUywgc2V0X2hpc3RvcnlfbGVuZ3RoX2RvY30sCi0JeyJnZXRfaGlzdG9yeV9sZW5ndGgiLCBnZXRfaGlzdG9yeV9sZW5ndGgsCi0JIE1FVEhfTk9BUkdTLCBnZXRfaGlzdG9yeV9sZW5ndGhfZG9jfSwKLQl7InNldF9jb21wbGV0ZXIiLCBzZXRfY29tcGxldGVyLCBNRVRIX1ZBUkFSR1MsIGRvY19zZXRfY29tcGxldGVyfSwKLQl7ImdldF9jb21wbGV0ZXIiLCBnZXRfY29tcGxldGVyLCBNRVRIX05PQVJHUywgZG9jX2dldF9jb21wbGV0ZXJ9LAotCXsiZ2V0X2NvbXBsZXRpb25fdHlwZSIsIGdldF9jb21wbGV0aW9uX3R5cGUsCi0JIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2NvbXBsZXRpb25fdHlwZX0sCi0JeyJnZXRfYmVnaWR4IiwgZ2V0X2JlZ2lkeCwgTUVUSF9OT0FSR1MsIGRvY19nZXRfYmVnaWR4fSwKLQl7ImdldF9lbmRpZHgiLCBnZXRfZW5kaWR4LCBNRVRIX05PQVJHUywgZG9jX2dldF9lbmRpZHh9LAorICAgIHsicGFyc2VfYW5kX2JpbmQiLCBwYXJzZV9hbmRfYmluZCwgTUVUSF9WQVJBUkdTLCBkb2NfcGFyc2VfYW5kX2JpbmR9LAorICAgIHsiZ2V0X2xpbmVfYnVmZmVyIiwgZ2V0X2xpbmVfYnVmZmVyLCBNRVRIX05PQVJHUywgZG9jX2dldF9saW5lX2J1ZmZlcn0sCisgICAgeyJpbnNlcnRfdGV4dCIsIGluc2VydF90ZXh0LCBNRVRIX1ZBUkFSR1MsIGRvY19pbnNlcnRfdGV4dH0sCisgICAgeyJyZWRpc3BsYXkiLCByZWRpc3BsYXksIE1FVEhfTk9BUkdTLCBkb2NfcmVkaXNwbGF5fSwKKyAgICB7InJlYWRfaW5pdF9maWxlIiwgcmVhZF9pbml0X2ZpbGUsIE1FVEhfVkFSQVJHUywgZG9jX3JlYWRfaW5pdF9maWxlfSwKKyAgICB7InJlYWRfaGlzdG9yeV9maWxlIiwgcmVhZF9oaXN0b3J5X2ZpbGUsCisgICAgIE1FVEhfVkFSQVJHUywgZG9jX3JlYWRfaGlzdG9yeV9maWxlfSwKKyAgICB7IndyaXRlX2hpc3RvcnlfZmlsZSIsIHdyaXRlX2hpc3RvcnlfZmlsZSwKKyAgICAgTUVUSF9WQVJBUkdTLCBkb2Nfd3JpdGVfaGlzdG9yeV9maWxlfSwKKyAgICB7ImdldF9oaXN0b3J5X2l0ZW0iLCBnZXRfaGlzdG9yeV9pdGVtLAorICAgICBNRVRIX1ZBUkFSR1MsIGRvY19nZXRfaGlzdG9yeV9pdGVtfSwKKyAgICB7ImdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKWdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoLAorICAgICBNRVRIX05PQVJHUywgZG9jX2dldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RofSwKKyAgICB7InNldF9oaXN0b3J5X2xlbmd0aCIsIHNldF9oaXN0b3J5X2xlbmd0aCwKKyAgICAgTUVUSF9WQVJBUkdTLCBzZXRfaGlzdG9yeV9sZW5ndGhfZG9jfSwKKyAgICB7ImdldF9oaXN0b3J5X2xlbmd0aCIsIGdldF9oaXN0b3J5X2xlbmd0aCwKKyAgICAgTUVUSF9OT0FSR1MsIGdldF9oaXN0b3J5X2xlbmd0aF9kb2N9LAorICAgIHsic2V0X2NvbXBsZXRlciIsIHNldF9jb21wbGV0ZXIsIE1FVEhfVkFSQVJHUywgZG9jX3NldF9jb21wbGV0ZXJ9LAorICAgIHsiZ2V0X2NvbXBsZXRlciIsIGdldF9jb21wbGV0ZXIsIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2NvbXBsZXRlcn0sCisgICAgeyJnZXRfY29tcGxldGlvbl90eXBlIiwgZ2V0X2NvbXBsZXRpb25fdHlwZSwKKyAgICAgTUVUSF9OT0FSR1MsIGRvY19nZXRfY29tcGxldGlvbl90eXBlfSwKKyAgICB7ImdldF9iZWdpZHgiLCBnZXRfYmVnaWR4LCBNRVRIX05PQVJHUywgZG9jX2dldF9iZWdpZHh9LAorICAgIHsiZ2V0X2VuZGlkeCIsIGdldF9lbmRpZHgsIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2VuZGlkeH0sCiAKLQl7InNldF9jb21wbGV0ZXJfZGVsaW1zIiwgc2V0X2NvbXBsZXRlcl9kZWxpbXMsCi0JIE1FVEhfVkFSQVJHUywgZG9jX3NldF9jb21wbGV0ZXJfZGVsaW1zfSwKLQl7ImFkZF9oaXN0b3J5IiwgcHlfYWRkX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX2FkZF9oaXN0b3J5fSwKLQl7InJlbW92ZV9oaXN0b3J5X2l0ZW0iLCBweV9yZW1vdmVfaGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2NfcmVtb3ZlX2hpc3Rvcnl9LAotCXsicmVwbGFjZV9oaXN0b3J5X2l0ZW0iLCBweV9yZXBsYWNlX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX3JlcGxhY2VfaGlzdG9yeX0sCi0JeyJnZXRfY29tcGxldGVyX2RlbGltcyIsIGdldF9jb21wbGV0ZXJfZGVsaW1zLAotCSBNRVRIX05PQVJHUywgZG9jX2dldF9jb21wbGV0ZXJfZGVsaW1zfSwKKyAgICB7InNldF9jb21wbGV0ZXJfZGVsaW1zIiwgc2V0X2NvbXBsZXRlcl9kZWxpbXMsCisgICAgIE1FVEhfVkFSQVJHUywgZG9jX3NldF9jb21wbGV0ZXJfZGVsaW1zfSwKKyAgICB7ImFkZF9oaXN0b3J5IiwgcHlfYWRkX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX2FkZF9oaXN0b3J5fSwKKyAgICB7InJlbW92ZV9oaXN0b3J5X2l0ZW0iLCBweV9yZW1vdmVfaGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2NfcmVtb3ZlX2hpc3Rvcnl9LAorICAgIHsicmVwbGFjZV9oaXN0b3J5X2l0ZW0iLCBweV9yZXBsYWNlX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX3JlcGxhY2VfaGlzdG9yeX0sCisgICAgeyJnZXRfY29tcGxldGVyX2RlbGltcyIsIGdldF9jb21wbGV0ZXJfZGVsaW1zLAorICAgICBNRVRIX05PQVJHUywgZG9jX2dldF9jb21wbGV0ZXJfZGVsaW1zfSwKIAotCXsic2V0X2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2siLCBzZXRfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vaywKLQkgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2t9LAotCXsic2V0X3N0YXJ0dXBfaG9vayIsIHNldF9zdGFydHVwX2hvb2ssCi0JIE1FVEhfVkFSQVJHUywgZG9jX3NldF9zdGFydHVwX2hvb2t9LAorICAgIHsic2V0X2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2siLCBzZXRfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vaywKKyAgICAgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2t9LAorICAgIHsic2V0X3N0YXJ0dXBfaG9vayIsIHNldF9zdGFydHVwX2hvb2ssCisgICAgIE1FVEhfVkFSQVJHUywgZG9jX3NldF9zdGFydHVwX2hvb2t9LAogI2lmZGVmIEhBVkVfUkxfUFJFX0lOUFVUX0hPT0sKLQl7InNldF9wcmVfaW5wdXRfaG9vayIsIHNldF9wcmVfaW5wdXRfaG9vaywKLQkgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X3ByZV9pbnB1dF9ob29rfSwKKyAgICB7InNldF9wcmVfaW5wdXRfaG9vayIsIHNldF9wcmVfaW5wdXRfaG9vaywKKyAgICAgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X3ByZV9pbnB1dF9ob29rfSwKICNlbmRpZgogI2lmZGVmIEhBVkVfUkxfQ09NUExFVElPTl9BUFBFTkRfQ0hBUkFDVEVSCi0JeyJjbGVhcl9oaXN0b3J5IiwgcHlfY2xlYXJfaGlzdG9yeSwgTUVUSF9OT0FSR1MsIGRvY19jbGVhcl9oaXN0b3J5fSwKKyAgICB7ImNsZWFyX2hpc3RvcnkiLCBweV9jbGVhcl9oaXN0b3J5LCBNRVRIX05PQVJHUywgZG9jX2NsZWFyX2hpc3Rvcnl9LAogI2VuZGlmCi0JezAsIDB9CisgICAgezAsIDB9CiB9OwogCiAKQEAgLTY2OSw0NyArNjY5LDQ3IEBACiBzdGF0aWMgaW50CiBvbl9ob29rKFB5T2JqZWN0ICpmdW5jKQogewotCWludCByZXN1bHQgPSAwOwotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnI7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaWYgKGZ1bmMgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqcjsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyAgICAgICAgUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiAjZW5kaWYKLQkJciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCBOVUxMKTsKLQkJaWYgKHIgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmIChyID09IFB5X05vbmUpCi0JCQlyZXN1bHQgPSAwOwotCQllbHNlIHsKLQkJCXJlc3VsdCA9IFB5SW50X0FzTG9uZyhyKTsKLQkJCWlmIChyZXN1bHQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIGVycm9yOwotCQl9Ci0JCVB5X0RFQ1JFRihyKTsKLQkJZ290byBkb25lOwotCSAgZXJyb3I6Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X1hERUNSRUYocik7Ci0JICBkb25lOgorICAgICAgICByID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsIE5VTEwpOworICAgICAgICBpZiAociA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKHIgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlJbnRfQXNMb25nKHIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICBlcnJvcjoKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfWERFQ1JFRihyKTsKKyAgICAgIGRvbmU6CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKKyAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKICNlbmRpZgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBvbl9zdGFydHVwX2hvb2sodm9pZCkKIHsKLQlyZXR1cm4gb25faG9vayhzdGFydHVwX2hvb2spOworICAgIHJldHVybiBvbl9ob29rKHN0YXJ0dXBfaG9vayk7CiB9CiAKICNpZmRlZiBIQVZFX1JMX1BSRV9JTlBVVF9IT09LCiBzdGF0aWMgaW50CiBvbl9wcmVfaW5wdXRfaG9vayh2b2lkKQogewotCXJldHVybiBvbl9ob29rKHByZV9pbnB1dF9ob29rKTsKKyAgICByZXR1cm4gb25faG9vayhwcmVfaW5wdXRfaG9vayk7CiB9CiAjZW5kaWYKIApAQCAtNzE4LDQzICs3MTgsNDMgQEAKIAogc3RhdGljIHZvaWQKIG9uX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2soY2hhciAqKm1hdGNoZXMsCi0JCQkJICAgaW50IG51bV9tYXRjaGVzLCBpbnQgbWF4X2xlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9tYXRjaGVzLCBpbnQgbWF4X2xlbmd0aCkKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqbT1OVUxMLCAqcz1OVUxMLCAqcj1OVUxMOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICptPU5VTEwsICpzPU5VTEwsICpyPU5VTEw7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKICNlbmRpZgotCW0gPSBQeUxpc3RfTmV3KG51bV9tYXRjaGVzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCWZvciAoaSA9IDA7IGkgPCBudW1fbWF0Y2hlczsgaSsrKSB7Ci0JCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG1hdGNoZXNbaSsxXSk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQlpZiAoUHlMaXN0X1NldEl0ZW0obSwgaSwgcykgPT0gLTEpCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICBtID0gUHlMaXN0X05ldyhudW1fbWF0Y2hlcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hdGNoZXM7IGkrKykgeworICAgICAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhtYXRjaGVzW2krMV0pOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKFB5TGlzdF9TZXRJdGVtKG0sIGksIHMpID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2ssCi0JCQkJICAic09pIiwgbWF0Y2hlc1swXSwgbSwgbWF4X2xlbmd0aCk7CisgICAgciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNPaSIsIG1hdGNoZXNbMF0sIG0sIG1heF9sZW5ndGgpOwogCi0JUHlfREVDUkVGKG0pOyBtPU5VTEw7CisgICAgUHlfREVDUkVGKG0pOyBtPU5VTEw7CiAKLQlpZiAociA9PSBOVUxMIHx8Ci0JICAgIChyICE9IFB5X05vbmUgJiYgUHlJbnRfQXNMb25nKHIpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpKSB7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCVB5X1hERUNSRUYocik7IHI9TlVMTDsKKyAgICBpZiAociA9PSBOVUxMIHx8CisgICAgICAgIChyICE9IFB5X05vbmUgJiYgUHlJbnRfQXNMb25nKHIpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5X1hERUNSRUYocik7IHI9TlVMTDsKIAotCWlmICgwKSB7Ci0JZXJyb3I6Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X1hERUNSRUYobSk7Ci0JCVB5X1hERUNSRUYocik7Ci0JfQorICAgIGlmICgwKSB7CisgICAgZXJyb3I6CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X1hERUNSRUYobSk7CisgICAgICAgIFB5X1hERUNSRUYocik7CisgICAgfQogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsc3RhdGUpOwogI2VuZGlmCiB9CiAKQEAgLTc2NCwzNyArNzY0LDM3IEBACiBzdGF0aWMgY2hhciAqCiBvbl9jb21wbGV0aW9uKGNvbnN0IGNoYXIgKnRleHQsIGludCBzdGF0ZSkKIHsKLQljaGFyICpyZXN1bHQgPSBOVUxMOwotCWlmIChjb21wbGV0ZXIgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcjsKKyAgICBjaGFyICpyZXN1bHQgPSBOVUxMOworICAgIGlmIChjb21wbGV0ZXIgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqcjsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyAgICAgICAgUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiAjZW5kaWYKLQkJcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fb3ZlciA9IDE7Ci0JCXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29tcGxldGVyLCAic2kiLCB0ZXh0LCBzdGF0ZSk7Ci0JCWlmIChyID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQlpZiAociA9PSBQeV9Ob25lKSB7Ci0JCQlyZXN1bHQgPSBOVUxMOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhciAqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHIpOwotCQkJaWYgKHMgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQkJcmVzdWx0ID0gc3RyZHVwKHMpOwotCQl9Ci0JCVB5X0RFQ1JFRihyKTsKLQkJZ290byBkb25lOwotCSAgZXJyb3I6Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X1hERUNSRUYocik7Ci0JICBkb25lOgorICAgICAgICBybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9vdmVyID0gMTsKKyAgICAgICAgciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjb21wbGV0ZXIsICJzaSIsIHRleHQsIHN0YXRlKTsKKyAgICAgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChyID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICpzID0gUHlTdHJpbmdfQXNTdHJpbmcocik7CisgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICByZXN1bHQgPSBzdHJkdXAocyk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICBlcnJvcjoKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfWERFQ1JFRihyKTsKKyAgICAgIGRvbmU6CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKKyAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKICNlbmRpZgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTgwNSwxNiArODA1LDE2IEBACiBmbGV4X2NvbXBsZXRlKGNoYXIgKnRleHQsIGludCBzdGFydCwgaW50IGVuZCkKIHsKICNpZmRlZiBIQVZFX1JMX0NPTVBMRVRJT05fQVBQRU5EX0NIQVJBQ1RFUgotCXJsX2NvbXBsZXRpb25fYXBwZW5kX2NoYXJhY3RlciA9J1wwJzsKKyAgICBybF9jb21wbGV0aW9uX2FwcGVuZF9jaGFyYWN0ZXIgPSdcMCc7CiAjZW5kaWYKICNpZmRlZiBIQVZFX1JMX0NPTVBMRVRJT05fU1VQUFJFU1NfQVBQRU5ECi0JcmxfY29tcGxldGlvbl9zdXBwcmVzc19hcHBlbmQgPSAwOworICAgIHJsX2NvbXBsZXRpb25fc3VwcHJlc3NfYXBwZW5kID0gMDsKICNlbmRpZgotCVB5X1hERUNSRUYoYmVnaWR4KTsKLQlQeV9YREVDUkVGKGVuZGlkeCk7Ci0JYmVnaWR4ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHN0YXJ0KTsKLQllbmRpZHggPSBQeUludF9Gcm9tTG9uZygobG9uZykgZW5kKTsKLQlyZXR1cm4gY29tcGxldGlvbl9tYXRjaGVzKHRleHQsICpvbl9jb21wbGV0aW9uKTsKKyAgICBQeV9YREVDUkVGKGJlZ2lkeCk7CisgICAgUHlfWERFQ1JFRihlbmRpZHgpOworICAgIGJlZ2lkeCA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBzdGFydCk7CisgICAgZW5kaWR4ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGVuZCk7CisgICAgcmV0dXJuIGNvbXBsZXRpb25fbWF0Y2hlcyh0ZXh0LCAqb25fY29tcGxldGlvbik7CiB9CiAKIApAQCAtODI0LDQ1ICs4MjQsNDUgQEAKIHNldHVwX3JlYWRsaW5lKHZvaWQpCiB7CiAjaWZkZWYgU0FWRV9MT0NBTEUKLQljaGFyICpzYXZlZF9sb2NhbGUgPSBzdHJkdXAoc2V0bG9jYWxlKExDX0NUWVBFLCBOVUxMKSk7Ci0JaWYgKCFzYXZlZF9sb2NhbGUpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vdCBlbm91Z2ggbWVtb3J5IHRvIHNhdmUgbG9jYWxlIik7CisgICAgY2hhciAqc2F2ZWRfbG9jYWxlID0gc3RyZHVwKHNldGxvY2FsZShMQ19DVFlQRSwgTlVMTCkpOworICAgIGlmICghc2F2ZWRfbG9jYWxlKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJub3QgZW5vdWdoIG1lbW9yeSB0byBzYXZlIGxvY2FsZSIpOwogI2VuZGlmCiAKLQl1c2luZ19oaXN0b3J5KCk7CisgICAgdXNpbmdfaGlzdG9yeSgpOwogCi0JcmxfcmVhZGxpbmVfbmFtZSA9ICJweXRob24iOworICAgIHJsX3JlYWRsaW5lX25hbWUgPSAicHl0aG9uIjsKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKQotCS8qIEFsbG93ICRpZiB0ZXJtPSBpbiAuaW5wdXRyYyB0byB3b3JrICovCi0JcmxfdGVybWluYWxfbmFtZSA9IGdldGVudigiVEVSTSIpOworICAgIC8qIEFsbG93ICRpZiB0ZXJtPSBpbiAuaW5wdXRyYyB0byB3b3JrICovCisgICAgcmxfdGVybWluYWxfbmFtZSA9IGdldGVudigiVEVSTSIpOwogI2VuZGlmCi0JLyogRm9yY2UgcmViaW5kIG9mIFRBQiB0byBpbnNlcnQtdGFiICovCi0JcmxfYmluZF9rZXkoJ1x0JywgcmxfaW5zZXJ0KTsKLQkvKiBCaW5kIGJvdGggRVNDLVRBQiBhbmQgRVNDLUVTQyB0byB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiAqLwotCXJsX2JpbmRfa2V5X2luX21hcCAoJ1x0JywgcmxfY29tcGxldGUsIGVtYWNzX21ldGFfa2V5bWFwKTsKLQlybF9iaW5kX2tleV9pbl9tYXAgKCdcMDMzJywgcmxfY29tcGxldGUsIGVtYWNzX21ldGFfa2V5bWFwKTsKLQkvKiBTZXQgb3VyIGhvb2sgZnVuY3Rpb25zICovCi0Jcmxfc3RhcnR1cF9ob29rID0gKEZ1bmN0aW9uICopb25fc3RhcnR1cF9ob29rOworICAgIC8qIEZvcmNlIHJlYmluZCBvZiBUQUIgdG8gaW5zZXJ0LXRhYiAqLworICAgIHJsX2JpbmRfa2V5KCdcdCcsIHJsX2luc2VydCk7CisgICAgLyogQmluZCBib3RoIEVTQy1UQUIgYW5kIEVTQy1FU0MgdG8gdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KKyAgICBybF9iaW5kX2tleV9pbl9tYXAgKCdcdCcsIHJsX2NvbXBsZXRlLCBlbWFjc19tZXRhX2tleW1hcCk7CisgICAgcmxfYmluZF9rZXlfaW5fbWFwICgnXDAzMycsIHJsX2NvbXBsZXRlLCBlbWFjc19tZXRhX2tleW1hcCk7CisgICAgLyogU2V0IG91ciBob29rIGZ1bmN0aW9ucyAqLworICAgIHJsX3N0YXJ0dXBfaG9vayA9IChGdW5jdGlvbiAqKW9uX3N0YXJ0dXBfaG9vazsKICNpZmRlZiBIQVZFX1JMX1BSRV9JTlBVVF9IT09LCi0JcmxfcHJlX2lucHV0X2hvb2sgPSAoRnVuY3Rpb24gKilvbl9wcmVfaW5wdXRfaG9vazsKKyAgICBybF9wcmVfaW5wdXRfaG9vayA9IChGdW5jdGlvbiAqKW9uX3ByZV9pbnB1dF9ob29rOwogI2VuZGlmCi0JLyogU2V0IG91ciBjb21wbGV0aW9uIGZ1bmN0aW9uICovCi0JcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fZnVuY3Rpb24gPSAoQ1BQRnVuY3Rpb24gKilmbGV4X2NvbXBsZXRlOwotCS8qIFNldCBQeXRob24gd29yZCBicmVhayBjaGFyYWN0ZXJzICovCi0JcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyA9Ci0JCXN0cmR1cCgiIFx0XG5gfiFAIyQlXiYqKCktPStbe119XFx8OzonXCIsPD4vPyIpOwotCQkvKiBBbGwgbm9uYWxwaGFudW1zIGV4Y2VwdCAnLicgKi8KKyAgICAvKiBTZXQgb3VyIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KKyAgICBybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9mdW5jdGlvbiA9IChDUFBGdW5jdGlvbiAqKWZsZXhfY29tcGxldGU7CisgICAgLyogU2V0IFB5dGhvbiB3b3JkIGJyZWFrIGNoYXJhY3RlcnMgKi8KKyAgICBybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzID0KKyAgICAgICAgc3RyZHVwKCIgXHRcbmB+IUAjJCVeJiooKS09K1t7XX1cXHw7OidcIiw8Pi8/Iik7CisgICAgICAgIC8qIEFsbCBub25hbHBoYW51bXMgZXhjZXB0ICcuJyAqLwogCi0JYmVnaWR4ID0gUHlJbnRfRnJvbUxvbmcoMEwpOwotCWVuZGlkeCA9IFB5SW50X0Zyb21Mb25nKDBMKTsKLQkvKiBJbml0aWFsaXplIChhbGxvd3MgLmlucHV0cmMgdG8gb3ZlcnJpZGUpCi0JICoKLQkgKiBYWFg6IEEgYnVnIGluIHRoZSByZWFkbGluZS0yLjIgbGlicmFyeSBjYXVzZXMgYSBtZW1vcnkgbGVhawotCSAqIGluc2lkZSB0aGlzIGZ1bmN0aW9uLiAgTm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgaXQuCi0JICovCi0JcmxfaW5pdGlhbGl6ZSgpOworICAgIGJlZ2lkeCA9IFB5SW50X0Zyb21Mb25nKDBMKTsKKyAgICBlbmRpZHggPSBQeUludF9Gcm9tTG9uZygwTCk7CisgICAgLyogSW5pdGlhbGl6ZSAoYWxsb3dzIC5pbnB1dHJjIHRvIG92ZXJyaWRlKQorICAgICAqCisgICAgICogWFhYOiBBIGJ1ZyBpbiB0aGUgcmVhZGxpbmUtMi4yIGxpYnJhcnkgY2F1c2VzIGEgbWVtb3J5IGxlYWsKKyAgICAgKiBpbnNpZGUgdGhpcyBmdW5jdGlvbi4gIE5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0LgorICAgICAqLworICAgIHJsX2luaXRpYWxpemUoKTsKIAotCVJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKKyAgICBSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCiB9CiAKIC8qIFdyYXBwZXIgYXJvdW5kIEdOVSByZWFkbGluZSB0aGF0IGhhbmRsZXMgc2lnbmFscyBkaWZmZXJlbnRseS4gKi8KQEAgLTg3MCwxMiArODcwLDEyIEBACiAKICNpZiBkZWZpbmVkKEhBVkVfUkxfQ0FMTEJBQ0spICYmIGRlZmluZWQoSEFWRV9TRUxFQ1QpCiAKLXN0YXRpYwljaGFyICpjb21wbGV0ZWRfaW5wdXRfc3RyaW5nOworc3RhdGljICBjaGFyICpjb21wbGV0ZWRfaW5wdXRfc3RyaW5nOwogc3RhdGljIHZvaWQKIHJsaGFuZGxlcihjaGFyICp0ZXh0KQogewotCWNvbXBsZXRlZF9pbnB1dF9zdHJpbmcgPSB0ZXh0OwotCXJsX2NhbGxiYWNrX2hhbmRsZXJfcmVtb3ZlKCk7CisgICAgY29tcGxldGVkX2lucHV0X3N0cmluZyA9IHRleHQ7CisgICAgcmxfY2FsbGJhY2tfaGFuZGxlcl9yZW1vdmUoKTsKIH0KIAogZXh0ZXJuIFB5VGhyZWFkU3RhdGUqIF9QeU9TX1JlYWRsaW5lVFN0YXRlOwpAQCAtODgzLDYwICs4ODMsNjAgQEAKIHN0YXRpYyBjaGFyICoKIHJlYWRsaW5lX3VudGlsX2VudGVyX29yX3NpZ25hbChjaGFyICpwcm9tcHQsIGludCAqc2lnbmFsKQogewotCWNoYXIgKiBub3RfZG9uZV9yZWFkaW5nID0gIiI7Ci0JZmRfc2V0IHNlbGVjdHNldDsKKyAgICBjaGFyICogbm90X2RvbmVfcmVhZGluZyA9ICIiOworICAgIGZkX3NldCBzZWxlY3RzZXQ7CiAKLQkqc2lnbmFsID0gMDsKKyAgICAqc2lnbmFsID0gMDsKICNpZmRlZiBIQVZFX1JMX0NBVENIX1NJR05BTAotCXJsX2NhdGNoX3NpZ25hbHMgPSAwOworICAgIHJsX2NhdGNoX3NpZ25hbHMgPSAwOwogI2VuZGlmCiAKLQlybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwgKHByb21wdCwgcmxoYW5kbGVyKTsKLQlGRF9aRVJPKCZzZWxlY3RzZXQpOworICAgIHJsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCAocHJvbXB0LCBybGhhbmRsZXIpOworICAgIEZEX1pFUk8oJnNlbGVjdHNldCk7CiAKLQljb21wbGV0ZWRfaW5wdXRfc3RyaW5nID0gbm90X2RvbmVfcmVhZGluZzsKKyAgICBjb21wbGV0ZWRfaW5wdXRfc3RyaW5nID0gbm90X2RvbmVfcmVhZGluZzsKIAotCXdoaWxlIChjb21wbGV0ZWRfaW5wdXRfc3RyaW5nID09IG5vdF9kb25lX3JlYWRpbmcpIHsKLQkJaW50IGhhc19pbnB1dCA9IDA7CisgICAgd2hpbGUgKGNvbXBsZXRlZF9pbnB1dF9zdHJpbmcgPT0gbm90X2RvbmVfcmVhZGluZykgeworICAgICAgICBpbnQgaGFzX2lucHV0ID0gMDsKIAotCQl3aGlsZSAoIWhhc19pbnB1dCkKLQkJewlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0ID0gezAsIDEwMDAwMH07IC8qIDAuMSBzZWNvbmRzICovCisgICAgICAgIHdoaWxlICghaGFzX2lucHV0KQorICAgICAgICB7ICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dCA9IHswLCAxMDAwMDB9OyAvKiAwLjEgc2Vjb25kcyAqLwogCi0JCQkvKiBbQnVnICMxNTUyNzI2XSBPbmx5IGxpbWl0IHRoZSBwYXVzZSBpZiBhbiBpbnB1dCBob29rIGhhcyBiZWVuCi0JCQkgICBkZWZpbmVkLiAgKi8KLQkJIAlzdHJ1Y3QgdGltZXZhbCAqdGltZW91dHAgPSBOVUxMOwotCQkJaWYgKFB5T1NfSW5wdXRIb29rKQotCQkJCXRpbWVvdXRwID0gJnRpbWVvdXQ7Ci0JCQlGRF9TRVQoZmlsZW5vKHJsX2luc3RyZWFtKSwgJnNlbGVjdHNldCk7Ci0JCQkvKiBzZWxlY3QgcmVzZXRzIHNlbGVjdHNldCBpZiBubyBpbnB1dCB3YXMgYXZhaWxhYmxlICovCi0JCQloYXNfaW5wdXQgPSBzZWxlY3QoZmlsZW5vKHJsX2luc3RyZWFtKSArIDEsICZzZWxlY3RzZXQsCi0JCQkJCSAgIE5VTEwsIE5VTEwsIHRpbWVvdXRwKTsKLQkJCWlmKFB5T1NfSW5wdXRIb29rKSBQeU9TX0lucHV0SG9vaygpOwotCQl9CisgICAgICAgICAgICAvKiBbQnVnICMxNTUyNzI2XSBPbmx5IGxpbWl0IHRoZSBwYXVzZSBpZiBhbiBpbnB1dCBob29rIGhhcyBiZWVuCisgICAgICAgICAgICAgICBkZWZpbmVkLiAgKi8KKyAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0cCA9IE5VTEw7CisgICAgICAgICAgICBpZiAoUHlPU19JbnB1dEhvb2spCisgICAgICAgICAgICAgICAgdGltZW91dHAgPSAmdGltZW91dDsKKyAgICAgICAgICAgIEZEX1NFVChmaWxlbm8ocmxfaW5zdHJlYW0pLCAmc2VsZWN0c2V0KTsKKyAgICAgICAgICAgIC8qIHNlbGVjdCByZXNldHMgc2VsZWN0c2V0IGlmIG5vIGlucHV0IHdhcyBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgIGhhc19pbnB1dCA9IHNlbGVjdChmaWxlbm8ocmxfaW5zdHJlYW0pICsgMSwgJnNlbGVjdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCB0aW1lb3V0cCk7CisgICAgICAgICAgICBpZihQeU9TX0lucHV0SG9vaykgUHlPU19JbnB1dEhvb2soKTsKKyAgICAgICAgfQogCi0JCWlmKGhhc19pbnB1dCA+IDApIHsKLQkJCXJsX2NhbGxiYWNrX3JlYWRfY2hhcigpOwotCQl9Ci0JCWVsc2UgaWYgKGVycm5vID09IEVJTlRSKSB7Ci0JCQlpbnQgczsKKyAgICAgICAgaWYoaGFzX2lucHV0ID4gMCkgeworICAgICAgICAgICAgcmxfY2FsbGJhY2tfcmVhZF9jaGFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgIGludCBzOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCQlQeUV2YWxfUmVzdG9yZVRocmVhZChfUHlPU19SZWFkbGluZVRTdGF0ZSk7CisgICAgICAgICAgICBQeUV2YWxfUmVzdG9yZVRocmVhZChfUHlPU19SZWFkbGluZVRTdGF0ZSk7CiAjZW5kaWYKLQkJCXMgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKKyAgICAgICAgICAgIHMgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQkJUHlFdmFsX1NhdmVUaHJlYWQoKTsKKyAgICAgICAgICAgIFB5RXZhbF9TYXZlVGhyZWFkKCk7CiAjZW5kaWYKLQkJCWlmIChzIDwgMCkgewotCQkJCXJsX2ZyZWVfbGluZV9zdGF0ZSgpOwotCQkJCXJsX2NsZWFudXBfYWZ0ZXJfc2lnbmFsKCk7Ci0JCQkJcmxfY2FsbGJhY2tfaGFuZGxlcl9yZW1vdmUoKTsKLQkJCQkqc2lnbmFsID0gMTsKLQkJCQljb21wbGV0ZWRfaW5wdXRfc3RyaW5nID0gTlVMTDsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIGlmIChzIDwgMCkgeworICAgICAgICAgICAgICAgIHJsX2ZyZWVfbGluZV9zdGF0ZSgpOworICAgICAgICAgICAgICAgIHJsX2NsZWFudXBfYWZ0ZXJfc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgcmxfY2FsbGJhY2tfaGFuZGxlcl9yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAqc2lnbmFsID0gMTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRfaW5wdXRfc3RyaW5nID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBjb21wbGV0ZWRfaW5wdXRfc3RyaW5nOworICAgIHJldHVybiBjb21wbGV0ZWRfaW5wdXRfc3RyaW5nOwogfQogCiAKQEAgLTk1MCwzMSArOTUwLDMxIEBACiBzdGF0aWMgdm9pZAogb25pbnRyKGludCBzaWcpCiB7Ci0JbG9uZ2ptcChqYnVmLCAxKTsKKyAgICBsb25nam1wKGpidWYsIDEpOwogfQogCiAKIHN0YXRpYyBjaGFyICoKIHJlYWRsaW5lX3VudGlsX2VudGVyX29yX3NpZ25hbChjaGFyICpwcm9tcHQsIGludCAqc2lnbmFsKQogewotCVB5T1Nfc2lnaGFuZGxlcl90IG9sZF9pbnRoYW5kbGVyOwotCWNoYXIgKnA7CisgICAgUHlPU19zaWdoYW5kbGVyX3Qgb2xkX2ludGhhbmRsZXI7CisgICAgY2hhciAqcDsKIAotCSpzaWduYWwgPSAwOworICAgICpzaWduYWwgPSAwOwogCi0Jb2xkX2ludGhhbmRsZXIgPSBQeU9TX3NldHNpZyhTSUdJTlQsIG9uaW50cik7Ci0JaWYgKHNldGptcChqYnVmKSkgeworICAgIG9sZF9pbnRoYW5kbGVyID0gUHlPU19zZXRzaWcoU0lHSU5ULCBvbmludHIpOworICAgIGlmIChzZXRqbXAoamJ1ZikpIHsKICNpZmRlZiBIQVZFX1NJR1JFTFNFCi0JCS8qIFRoaXMgc2VlbXMgbmVjZXNzYXJ5IG9uIFN1bk9TIDQuMSAoUmFzbXVzIEhhaG4pICovCi0JCXNpZ3JlbHNlKFNJR0lOVCk7CisgICAgICAgIC8qIFRoaXMgc2VlbXMgbmVjZXNzYXJ5IG9uIFN1bk9TIDQuMSAoUmFzbXVzIEhhaG4pICovCisgICAgICAgIHNpZ3JlbHNlKFNJR0lOVCk7CiAjZW5kaWYKLQkJUHlPU19zZXRzaWcoU0lHSU5ULCBvbGRfaW50aGFuZGxlcik7Ci0JCSpzaWduYWwgPSAxOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmxfZXZlbnRfaG9vayA9IFB5T1NfSW5wdXRIb29rOwotCXAgPSByZWFkbGluZShwcm9tcHQpOwotCVB5T1Nfc2V0c2lnKFNJR0lOVCwgb2xkX2ludGhhbmRsZXIpOworICAgICAgICBQeU9TX3NldHNpZyhTSUdJTlQsIG9sZF9pbnRoYW5kbGVyKTsKKyAgICAgICAgKnNpZ25hbCA9IDE7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBybF9ldmVudF9ob29rID0gUHlPU19JbnB1dEhvb2s7CisgICAgcCA9IHJlYWRsaW5lKHByb21wdCk7CisgICAgUHlPU19zZXRzaWcoU0lHSU5ULCBvbGRfaW50aGFuZGxlcik7CiAKICAgICByZXR1cm4gcDsKIH0KQEAgLTk4NCw4MiArOTg0LDgyIEBACiBzdGF0aWMgY2hhciAqCiBjYWxsX3JlYWRsaW5lKEZJTEUgKnN5c19zdGRpbiwgRklMRSAqc3lzX3N0ZG91dCwgY2hhciAqcHJvbXB0KQogewotCXNpemVfdCBuOwotCWNoYXIgKnAsICpxOwotCWludCBzaWduYWw7CisgICAgc2l6ZV90IG47CisgICAgY2hhciAqcCwgKnE7CisgICAgaW50IHNpZ25hbDsKIAogI2lmZGVmIFNBVkVfTE9DQUxFCi0JY2hhciAqc2F2ZWRfbG9jYWxlID0gc3RyZHVwKHNldGxvY2FsZShMQ19DVFlQRSwgTlVMTCkpOwotCWlmICghc2F2ZWRfbG9jYWxlKQotCQlQeV9GYXRhbEVycm9yKCJub3QgZW5vdWdoIG1lbW9yeSB0byBzYXZlIGxvY2FsZSIpOwotCXNldGxvY2FsZShMQ19DVFlQRSwgIiIpOworICAgIGNoYXIgKnNhdmVkX2xvY2FsZSA9IHN0cmR1cChzZXRsb2NhbGUoTENfQ1RZUEUsIE5VTEwpKTsKKyAgICBpZiAoIXNhdmVkX2xvY2FsZSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm90IGVub3VnaCBtZW1vcnkgdG8gc2F2ZSBsb2NhbGUiKTsKKyAgICBzZXRsb2NhbGUoTENfQ1RZUEUsICIiKTsKICNlbmRpZgogCi0JaWYgKHN5c19zdGRpbiAhPSBybF9pbnN0cmVhbSB8fCBzeXNfc3Rkb3V0ICE9IHJsX291dHN0cmVhbSkgewotCQlybF9pbnN0cmVhbSA9IHN5c19zdGRpbjsKLQkJcmxfb3V0c3RyZWFtID0gc3lzX3N0ZG91dDsKKyAgICBpZiAoc3lzX3N0ZGluICE9IHJsX2luc3RyZWFtIHx8IHN5c19zdGRvdXQgIT0gcmxfb3V0c3RyZWFtKSB7CisgICAgICAgIHJsX2luc3RyZWFtID0gc3lzX3N0ZGluOworICAgICAgICBybF9vdXRzdHJlYW0gPSBzeXNfc3Rkb3V0OwogI2lmZGVmIEhBVkVfUkxfQ09NUExFVElPTl9BUFBFTkRfQ0hBUkFDVEVSCi0JCXJsX3ByZXBfdGVybWluYWwgKDEpOworICAgICAgICBybF9wcmVwX3Rlcm1pbmFsICgxKTsKICNlbmRpZgotCX0KKyAgICB9CiAKLQlwID0gcmVhZGxpbmVfdW50aWxfZW50ZXJfb3Jfc2lnbmFsKHByb21wdCwgJnNpZ25hbCk7CisgICAgcCA9IHJlYWRsaW5lX3VudGlsX2VudGVyX29yX3NpZ25hbChwcm9tcHQsICZzaWduYWwpOwogCi0JLyogd2UgZ290IGFuIGludGVycnVwdCBzaWduYWwgKi8KLQlpZiAoc2lnbmFsKSB7Ci0JCVJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIHdlIGdvdCBhbiBpbnRlcnJ1cHQgc2lnbmFsICovCisgICAgaWYgKHNpZ25hbCkgeworICAgICAgICBSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFdlIGdvdCBhbiBFT0YsIHJldHVybiBhIGVtcHR5IHN0cmluZy4gKi8KLQlpZiAocCA9PSBOVUxMKSB7Ci0JCXAgPSBQeU1lbV9NYWxsb2MoMSk7Ci0JCWlmIChwICE9IE5VTEwpCi0JCQkqcCA9ICdcMCc7Ci0JCVJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKLQkJcmV0dXJuIHA7Ci0JfQorICAgIC8qIFdlIGdvdCBhbiBFT0YsIHJldHVybiBhIGVtcHR5IHN0cmluZy4gKi8KKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIHAgPSBQeU1lbV9NYWxsb2MoMSk7CisgICAgICAgIGlmIChwICE9IE5VTEwpCisgICAgICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgIFJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQogCi0JLyogd2UgaGF2ZSBhIHZhbGlkIGxpbmUgKi8KLQluID0gc3RybGVuKHApOwotCWlmIChuID4gMCkgewotCQljb25zdCBjaGFyICpsaW5lOwotCQlISVNUT1JZX1NUQVRFICpzdGF0ZSA9IGhpc3RvcnlfZ2V0X2hpc3Rvcnlfc3RhdGUoKTsKLQkJaWYgKHN0YXRlLT5sZW5ndGggPiAwKQorICAgIC8qIHdlIGhhdmUgYSB2YWxpZCBsaW5lICovCisgICAgbiA9IHN0cmxlbihwKTsKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgY29uc3QgY2hhciAqbGluZTsKKyAgICAgICAgSElTVE9SWV9TVEFURSAqc3RhdGUgPSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlKCk7CisgICAgICAgIGlmIChzdGF0ZS0+bGVuZ3RoID4gMCkKICNpZmRlZiBfX0FQUExFX18KLQkJCWlmICh1c2luZ19saWJlZGl0X2VtdWxhdGlvbikgewotCQkJCS8qCi0JCQkJICogTGliZWRpdCdzIGVtdWxhdGlvbiB1c2VzIDAtYmFzZWQgaW5kZXhlcywKLQkJCQkgKiB0aGUgcmVhbCByZWFkbGluZSB1c2VzIDEtYmFzZWQgaW5kZXhlcy4KLQkJCQkgKi8KLQkJCQlsaW5lID0gaGlzdG9yeV9nZXQoc3RhdGUtPmxlbmd0aCAtIDEpLT5saW5lOwotCQkJfSBlbHNlCisgICAgICAgICAgICBpZiAodXNpbmdfbGliZWRpdF9lbXVsYXRpb24pIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIExpYmVkaXQncyBlbXVsYXRpb24gdXNlcyAwLWJhc2VkIGluZGV4ZXMsCisgICAgICAgICAgICAgICAgICogdGhlIHJlYWwgcmVhZGxpbmUgdXNlcyAxLWJhc2VkIGluZGV4ZXMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbGluZSA9IGhpc3RvcnlfZ2V0KHN0YXRlLT5sZW5ndGggLSAxKS0+bGluZTsKKyAgICAgICAgICAgIH0gZWxzZQogI2VuZGlmIC8qIF9fQVBQTEVfXyAqLwotCQkJbGluZSA9IGhpc3RvcnlfZ2V0KHN0YXRlLT5sZW5ndGgpLT5saW5lOwotCQllbHNlCi0JCQlsaW5lID0gIiI7Ci0JCWlmIChzdHJjbXAocCwgbGluZSkpCi0JCQlhZGRfaGlzdG9yeShwKTsKLQkJLyogdGhlIGhpc3RvcnkgZG9jcyBkb24ndCBzYXkgc28sIGJ1dCB0aGUgYWRkcmVzcyBvZiBzdGF0ZQotCQkgICBjaGFuZ2VzIGVhY2ggdGltZSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlIGlzIGNhbGxlZAotCQkgICB3aGljaCBtYWtlcyBtZSB0aGluayBpdCdzIGZyZXNobHkgbWFsbG9jJ2QgbWVtb3J5Li4uCi0JCSAgIG9uIHRoZSBvdGhlciBoYW5kLCB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBsaW5lIHN0YXlzIHRoZQotCQkgICBzYW1lIGFzIGxvbmcgYXMgaGlzdG9yeSBpc24ndCBleHRlbmRlZCwgc28gaXQgYXBwZWFycyB0bwotCQkgICBiZSBtYWxsb2MnZCBidXQgbWFuYWdlZCBieSB0aGUgaGlzdG9yeSBwYWNrYWdlLi4uICovCi0JCWZyZWUoc3RhdGUpOwotCX0KLQkvKiBDb3B5IHRoZSBtYWxsb2MnZWQgYnVmZmVyIGludG8gYSBQeU1lbV9NYWxsb2MnZWQgb25lIGFuZAotCSAgIHJlbGVhc2UgdGhlIG9yaWdpbmFsLiAqLwotCXEgPSBwOwotCXAgPSBQeU1lbV9NYWxsb2MobisyKTsKLQlpZiAocCAhPSBOVUxMKSB7Ci0JCXN0cm5jcHkocCwgcSwgbik7Ci0JCXBbbl0gPSAnXG4nOwotCQlwW24rMV0gPSAnXDAnOwotCX0KLQlmcmVlKHEpOwotCVJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKLQlyZXR1cm4gcDsKKyAgICAgICAgICAgIGxpbmUgPSBoaXN0b3J5X2dldChzdGF0ZS0+bGVuZ3RoKS0+bGluZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGluZSA9ICIiOworICAgICAgICBpZiAoc3RyY21wKHAsIGxpbmUpKQorICAgICAgICAgICAgYWRkX2hpc3RvcnkocCk7CisgICAgICAgIC8qIHRoZSBoaXN0b3J5IGRvY3MgZG9uJ3Qgc2F5IHNvLCBidXQgdGhlIGFkZHJlc3Mgb2Ygc3RhdGUKKyAgICAgICAgICAgY2hhbmdlcyBlYWNoIHRpbWUgaGlzdG9yeV9nZXRfaGlzdG9yeV9zdGF0ZSBpcyBjYWxsZWQKKyAgICAgICAgICAgd2hpY2ggbWFrZXMgbWUgdGhpbmsgaXQncyBmcmVzaGx5IG1hbGxvYydkIG1lbW9yeS4uLgorICAgICAgICAgICBvbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgbGluZSBzdGF5cyB0aGUKKyAgICAgICAgICAgc2FtZSBhcyBsb25nIGFzIGhpc3RvcnkgaXNuJ3QgZXh0ZW5kZWQsIHNvIGl0IGFwcGVhcnMgdG8KKyAgICAgICAgICAgYmUgbWFsbG9jJ2QgYnV0IG1hbmFnZWQgYnkgdGhlIGhpc3RvcnkgcGFja2FnZS4uLiAqLworICAgICAgICBmcmVlKHN0YXRlKTsKKyAgICB9CisgICAgLyogQ29weSB0aGUgbWFsbG9jJ2VkIGJ1ZmZlciBpbnRvIGEgUHlNZW1fTWFsbG9jJ2VkIG9uZSBhbmQKKyAgICAgICByZWxlYXNlIHRoZSBvcmlnaW5hbC4gKi8KKyAgICBxID0gcDsKKyAgICBwID0gUHlNZW1fTWFsbG9jKG4rMik7CisgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICBzdHJuY3B5KHAsIHEsIG4pOworICAgICAgICBwW25dID0gJ1xuJzsKKyAgICAgICAgcFtuKzFdID0gJ1wwJzsKKyAgICB9CisgICAgZnJlZShxKTsKKyAgICBSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCisgICAgcmV0dXJuIHA7CiB9CiAKIApAQCAtMTA3NiwyNyArMTA3NiwyNyBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRyZWFkbGluZSh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCiAjaWZkZWYgX19BUFBMRV9fCi0JaWYgKHN0cm5jbXAocmxfbGlicmFyeV92ZXJzaW9uLCBsaWJlZGl0X3ZlcnNpb25fdGFnLCBzdHJsZW4obGliZWRpdF92ZXJzaW9uX3RhZykpID09IDApIHsKLQkJdXNpbmdfbGliZWRpdF9lbXVsYXRpb24gPSAxOwotCX0KKyAgICBpZiAoc3RybmNtcChybF9saWJyYXJ5X3ZlcnNpb24sIGxpYmVkaXRfdmVyc2lvbl90YWcsIHN0cmxlbihsaWJlZGl0X3ZlcnNpb25fdGFnKSkgPT0gMCkgeworICAgICAgICB1c2luZ19saWJlZGl0X2VtdWxhdGlvbiA9IDE7CisgICAgfQogCi0JaWYgKHVzaW5nX2xpYmVkaXRfZW11bGF0aW9uKQotCQltID0gUHlfSW5pdE1vZHVsZTQoInJlYWRsaW5lIiwgcmVhZGxpbmVfbWV0aG9kcywgZG9jX21vZHVsZV9sZSwKLQkJCSAgIChQeU9iamVjdCAqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JZWxzZQorICAgIGlmICh1c2luZ19saWJlZGl0X2VtdWxhdGlvbikKKyAgICAgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJyZWFkbGluZSIsIHJlYWRsaW5lX21ldGhvZHMsIGRvY19tb2R1bGVfbGUsCisgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBlbHNlCiAKICNlbmRpZiAvKiBfX0FQUExFX18gKi8KIAotCW0gPSBQeV9Jbml0TW9kdWxlNCgicmVhZGxpbmUiLCByZWFkbGluZV9tZXRob2RzLCBkb2NfbW9kdWxlLAotCQkJICAgKFB5T2JqZWN0ICopTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJyZWFkbGluZSIsIHJlYWRsaW5lX21ldGhvZHMsIGRvY19tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCiAKIAotCVB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgPSBjYWxsX3JlYWRsaW5lOwotCXNldHVwX3JlYWRsaW5lKCk7CisgICAgUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciA9IGNhbGxfcmVhZGxpbmU7CisgICAgc2V0dXBfcmVhZGxpbmUoKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVzb3VyY2UuYyBiL01vZHVsZXMvcmVzb3VyY2UuYwppbmRleCAzODk3NGY5Li45OTkzYjkzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Jlc291cmNlLmMKKysrIGIvTW9kdWxlcy9yZXNvdXJjZS5jCkBAIC0yOSwzMCArMjksMzAgQEAKICJvciB2aWEgdGhlIGF0dHJpYnV0ZXMgcnVfdXRpbWUsIHJ1X3N0aW1lLCBydV9tYXhyc3MsIGFuZCBzbyBvbi4iKTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgc3RydWN0X3J1c2FnZV9maWVsZHNbXSA9IHsKLQl7InJ1X3V0aW1lIiwJInVzZXIgdGltZSB1c2VkIn0sCi0JeyJydV9zdGltZSIsCSJzeXN0ZW0gdGltZSB1c2VkIn0sCi0JeyJydV9tYXhyc3MiLAkibWF4LiByZXNpZGVudCBzZXQgc2l6ZSJ9LAotCXsicnVfaXhyc3MiLAkic2hhcmVkIG1lbW9yeSBzaXplIn0sCi0JeyJydV9pZHJzcyIsCSJ1bnNoYXJlZCBkYXRhIHNpemUifSwKLQl7InJ1X2lzcnNzIiwJInVuc2hhcmVkIHN0YWNrIHNpemUifSwKLQl7InJ1X21pbmZsdCIsCSJwYWdlIGZhdWx0cyBub3QgcmVxdWlyaW5nIEkvTyJ9LAotCXsicnVfbWFqZmx0IiwJInBhZ2UgZmF1bHRzIHJlcXVpcmluZyBJL08ifSwKLQl7InJ1X25zd2FwIiwJIm51bWJlciBvZiBzd2FwIG91dHMifSwKLQl7InJ1X2luYmxvY2siLAkiYmxvY2sgaW5wdXQgb3BlcmF0aW9ucyJ9LAotCXsicnVfb3VibG9jayIsCSJibG9jayBvdXRwdXQgb3BlcmF0aW9ucyJ9LAotCXsicnVfbXNnc25kIiwJIklQQyBtZXNzYWdlcyBzZW50In0sCi0JeyJydV9tc2dyY3YiLAkiSVBDIG1lc3NhZ2VzIHJlY2VpdmVkIn0sCi0JeyJydV9uc2lnbmFscyIsCSJzaWduYWxzIHJlY2VpdmVkIn0sCi0JeyJydV9udmNzdyIsCSJ2b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyJ9LAotCXsicnVfbml2Y3N3IiwJImludm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMifSwKLQl7MH0KKyAgICB7InJ1X3V0aW1lIiwgICAgICAgICJ1c2VyIHRpbWUgdXNlZCJ9LAorICAgIHsicnVfc3RpbWUiLCAgICAgICAgInN5c3RlbSB0aW1lIHVzZWQifSwKKyAgICB7InJ1X21heHJzcyIsICAgICAgICJtYXguIHJlc2lkZW50IHNldCBzaXplIn0sCisgICAgeyJydV9peHJzcyIsICAgICAgICAic2hhcmVkIG1lbW9yeSBzaXplIn0sCisgICAgeyJydV9pZHJzcyIsICAgICAgICAidW5zaGFyZWQgZGF0YSBzaXplIn0sCisgICAgeyJydV9pc3JzcyIsICAgICAgICAidW5zaGFyZWQgc3RhY2sgc2l6ZSJ9LAorICAgIHsicnVfbWluZmx0IiwgICAgICAgInBhZ2UgZmF1bHRzIG5vdCByZXF1aXJpbmcgSS9PIn0sCisgICAgeyJydV9tYWpmbHQiLCAgICAgICAicGFnZSBmYXVsdHMgcmVxdWlyaW5nIEkvTyJ9LAorICAgIHsicnVfbnN3YXAiLCAgICAgICAgIm51bWJlciBvZiBzd2FwIG91dHMifSwKKyAgICB7InJ1X2luYmxvY2siLCAgICAgICJibG9jayBpbnB1dCBvcGVyYXRpb25zIn0sCisgICAgeyJydV9vdWJsb2NrIiwgICAgICAiYmxvY2sgb3V0cHV0IG9wZXJhdGlvbnMifSwKKyAgICB7InJ1X21zZ3NuZCIsICAgICAgICJJUEMgbWVzc2FnZXMgc2VudCJ9LAorICAgIHsicnVfbXNncmN2IiwgICAgICAgIklQQyBtZXNzYWdlcyByZWNlaXZlZCJ9LAorICAgIHsicnVfbnNpZ25hbHMiLCAgICAgInNpZ25hbHMgcmVjZWl2ZWQifSwKKyAgICB7InJ1X252Y3N3IiwgICAgICAgICJ2b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyJ9LAorICAgIHsicnVfbml2Y3N3IiwgICAgICAgImludm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMifSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2Mgc3RydWN0X3J1c2FnZV9kZXNjID0gewotCSJyZXNvdXJjZS5zdHJ1Y3RfcnVzYWdlIiwJLyogbmFtZSAqLwotCXN0cnVjdF9ydXNhZ2VfX2RvY19fLAkvKiBkb2MgKi8KLQlzdHJ1Y3RfcnVzYWdlX2ZpZWxkcywJLyogZmllbGRzICovCi0JMTYJLyogbl9pbl9zZXF1ZW5jZSAqLworICAgICJyZXNvdXJjZS5zdHJ1Y3RfcnVzYWdlIiwgICAgICAgICAgIC8qIG5hbWUgKi8KKyAgICBzdHJ1Y3RfcnVzYWdlX19kb2NfXywgICAgICAgLyogZG9jICovCisgICAgc3RydWN0X3J1c2FnZV9maWVsZHMsICAgICAgIC8qIGZpZWxkcyAqLworICAgIDE2ICAgICAgICAgIC8qIG5faW5fc2VxdWVuY2UgKi8KIH07CiAKIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CkBAIC02MSwxNTMgKzYxLDE1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJlc291cmNlX2dldHJ1c2FnZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHdobzsKLQlzdHJ1Y3QgcnVzYWdlIHJ1OwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IHdobzsKKyAgICBzdHJ1Y3QgcnVzYWdlIHJ1OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0cnVzYWdlIiwgJndobykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRydXNhZ2UiLCAmd2hvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZ2V0cnVzYWdlKHdobywgJnJ1KSA9PSAtMSkgewotCQlpZiAoZXJybm8gPT0gRUlOVkFMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJImludmFsaWQgd2hvIHBhcmFtZXRlciIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0gCi0JCVB5RXJyX1NldEZyb21FcnJubyhSZXNvdXJjZUVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChnZXRydXNhZ2Uod2hvLCAmcnUpID09IC0xKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHdobyBwYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhSZXNvdXJjZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmVzdWx0ID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJlN0cnVjdFJVc2FnZVR5cGUpOwotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RydWN0UlVzYWdlVHlwZSk7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDAsCi0JCQlQeUZsb2F0X0Zyb21Eb3VibGUoZG91YmxldGltZShydS5ydV91dGltZSkpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMSwKLQkJCVB5RmxvYXRfRnJvbURvdWJsZShkb3VibGV0aW1lKHJ1LnJ1X3N0aW1lKSkpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAyLCBQeUludF9Gcm9tTG9uZyhydS5ydV9tYXhyc3MpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMywgUHlJbnRfRnJvbUxvbmcocnUucnVfaXhyc3MpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNCwgUHlJbnRfRnJvbUxvbmcocnUucnVfaWRyc3MpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNSwgUHlJbnRfRnJvbUxvbmcocnUucnVfaXNyc3MpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNiwgUHlJbnRfRnJvbUxvbmcocnUucnVfbWluZmx0KSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDcsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X21hamZsdCkpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCA4LCBQeUludF9Gcm9tTG9uZyhydS5ydV9uc3dhcCkpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCA5LCBQeUludF9Gcm9tTG9uZyhydS5ydV9pbmJsb2NrKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDEwLCBQeUludF9Gcm9tTG9uZyhydS5ydV9vdWJsb2NrKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDExLCBQeUludF9Gcm9tTG9uZyhydS5ydV9tc2dzbmQpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMTIsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X21zZ3JjdikpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxMywgUHlJbnRfRnJvbUxvbmcocnUucnVfbnNpZ25hbHMpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMTQsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X252Y3N3KSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDE1LCBQeUludF9Gcm9tTG9uZyhydS5ydV9uaXZjc3cpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMCwKKyAgICAgICAgICAgICAgICAgICAgUHlGbG9hdF9Gcm9tRG91YmxlKGRvdWJsZXRpbWUocnUucnVfdXRpbWUpKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDEsCisgICAgICAgICAgICAgICAgICAgIFB5RmxvYXRfRnJvbURvdWJsZShkb3VibGV0aW1lKHJ1LnJ1X3N0aW1lKSkpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAyLCBQeUludF9Gcm9tTG9uZyhydS5ydV9tYXhyc3MpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMywgUHlJbnRfRnJvbUxvbmcocnUucnVfaXhyc3MpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNCwgUHlJbnRfRnJvbUxvbmcocnUucnVfaWRyc3MpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNSwgUHlJbnRfRnJvbUxvbmcocnUucnVfaXNyc3MpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNiwgUHlJbnRfRnJvbUxvbmcocnUucnVfbWluZmx0KSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDcsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X21hamZsdCkpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCA4LCBQeUludF9Gcm9tTG9uZyhydS5ydV9uc3dhcCkpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCA5LCBQeUludF9Gcm9tTG9uZyhydS5ydV9pbmJsb2NrKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDEwLCBQeUludF9Gcm9tTG9uZyhydS5ydV9vdWJsb2NrKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDExLCBQeUludF9Gcm9tTG9uZyhydS5ydV9tc2dzbmQpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMTIsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X21zZ3JjdikpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxMywgUHlJbnRfRnJvbUxvbmcocnUucnVfbnNpZ25hbHMpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMTQsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X252Y3N3KSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDE1LCBQeUludF9Gcm9tTG9uZyhydS5ydV9uaXZjc3cpKTsKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVzb3VyY2VfZ2V0cmxpbWl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJ1Y3QgcmxpbWl0IHJsOwotCWludCByZXNvdXJjZTsKKyAgICBzdHJ1Y3QgcmxpbWl0IHJsOworICAgIGludCByZXNvdXJjZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRybGltaXQiLCAmcmVzb3VyY2UpKSAKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmdldHJsaW1pdCIsICZyZXNvdXJjZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlc291cmNlIDwgMCB8fCByZXNvdXJjZSA+PSBSTElNX05MSU1JVFMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImludmFsaWQgcmVzb3VyY2Ugc3BlY2lmaWVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocmVzb3VyY2UgPCAwIHx8IHJlc291cmNlID49IFJMSU1fTkxJTUlUUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHJlc291cmNlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZ2V0cmxpbWl0KHJlc291cmNlLCAmcmwpID09IC0xKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhSZXNvdXJjZUVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChnZXRybGltaXQocmVzb3VyY2UsICZybCkgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFJlc291cmNlRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKQotCWlmIChzaXplb2YocmwucmxpbV9jdXIpID4gc2l6ZW9mKGxvbmcpKSB7Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJMTCIsCi0JCQkJICAgICAoUFlfTE9OR19MT05HKSBybC5ybGltX2N1ciwKLQkJCQkgICAgIChQWV9MT05HX0xPTkcpIHJsLnJsaW1fbWF4KTsKLQl9CisgICAgaWYgKHNpemVvZihybC5ybGltX2N1cikgPiBzaXplb2YobG9uZykpIHsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIkxMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBZX0xPTkdfTE9ORykgcmwucmxpbV9jdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQWV9MT05HX0xPTkcpIHJsLnJsaW1fbWF4KTsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCAobG9uZykgcmwucmxpbV9jdXIsIChsb25nKSBybC5ybGltX21heCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgKGxvbmcpIHJsLnJsaW1fY3VyLCAobG9uZykgcmwucmxpbV9tYXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVzb3VyY2Vfc2V0cmxpbWl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJ1Y3QgcmxpbWl0IHJsOwotCWludCByZXNvdXJjZTsKLQlQeU9iamVjdCAqY3Vyb2JqLCAqbWF4b2JqOworICAgIHN0cnVjdCBybGltaXQgcmw7CisgICAgaW50IHJlc291cmNlOworICAgIFB5T2JqZWN0ICpjdXJvYmosICptYXhvYmo7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkoT08pOnNldHJsaW1pdCIsCi0JCQkgICAgICAmcmVzb3VyY2UsICZjdXJvYmosICZtYXhvYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkoT08pOnNldHJsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZSwgJmN1cm9iaiwgJm1heG9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlc291cmNlIDwgMCB8fCByZXNvdXJjZSA+PSBSTElNX05MSU1JVFMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImludmFsaWQgcmVzb3VyY2Ugc3BlY2lmaWVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocmVzb3VyY2UgPCAwIHx8IHJlc291cmNlID49IFJMSU1fTkxJTUlUUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHJlc291cmNlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZiAhZGVmaW5lZChIQVZFX0xBUkdFRklMRV9TVVBQT1JUKQotCXJsLnJsaW1fY3VyID0gUHlJbnRfQXNMb25nKGN1cm9iaik7Ci0JaWYgKHJsLnJsaW1fY3VyID09IChybGltX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JcmwucmxpbV9tYXggPSBQeUludF9Bc0xvbmcobWF4b2JqKTsKLQlpZiAocmwucmxpbV9tYXggPT0gKHJsaW1fdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICBybC5ybGltX2N1ciA9IFB5SW50X0FzTG9uZyhjdXJvYmopOworICAgIGlmIChybC5ybGltX2N1ciA9PSAocmxpbV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJsLnJsaW1fbWF4ID0gUHlJbnRfQXNMb25nKG1heG9iaik7CisgICAgaWYgKHJsLnJsaW1fbWF4ID09IChybGltX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZWxzZQotCS8qIFRoZSBsaW1pdHMgYXJlIHByb2JhYmx5IGJpZ2dlciB0aGFuIGEgbG9uZyAqLwotCXJsLnJsaW1fY3VyID0gUHlMb25nX0NoZWNrKGN1cm9iaikgPwotCQlQeUxvbmdfQXNMb25nTG9uZyhjdXJvYmopIDogUHlJbnRfQXNMb25nKGN1cm9iaik7Ci0JaWYgKHJsLnJsaW1fY3VyID09IChybGltX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JcmwucmxpbV9tYXggPSBQeUxvbmdfQ2hlY2sobWF4b2JqKSA/Ci0JCVB5TG9uZ19Bc0xvbmdMb25nKG1heG9iaikgOiBQeUludF9Bc0xvbmcobWF4b2JqKTsKLQlpZiAocmwucmxpbV9tYXggPT0gKHJsaW1fdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBUaGUgbGltaXRzIGFyZSBwcm9iYWJseSBiaWdnZXIgdGhhbiBhIGxvbmcgKi8KKyAgICBybC5ybGltX2N1ciA9IFB5TG9uZ19DaGVjayhjdXJvYmopID8KKyAgICAgICAgUHlMb25nX0FzTG9uZ0xvbmcoY3Vyb2JqKSA6IFB5SW50X0FzTG9uZyhjdXJvYmopOworICAgIGlmIChybC5ybGltX2N1ciA9PSAocmxpbV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJsLnJsaW1fbWF4ID0gUHlMb25nX0NoZWNrKG1heG9iaikgPworICAgICAgICBQeUxvbmdfQXNMb25nTG9uZyhtYXhvYmopIDogUHlJbnRfQXNMb25nKG1heG9iaik7CisgICAgaWYgKHJsLnJsaW1fbWF4ID09IChybGltX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKIAotCXJsLnJsaW1fY3VyID0gcmwucmxpbV9jdXIgJiBSTElNX0lORklOSVRZOwotCXJsLnJsaW1fbWF4ID0gcmwucmxpbV9tYXggJiBSTElNX0lORklOSVRZOwotCWlmIChzZXRybGltaXQocmVzb3VyY2UsICZybCkgPT0gLTEpIHsKLQkJaWYgKGVycm5vID09IEVJTlZBTCkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiY3VycmVudCBsaW1pdCBleGNlZWRzIG1heGltdW0gbGltaXQiKTsKLQkJZWxzZSBpZiAoZXJybm8gPT0gRVBFUk0pCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIm5vdCBhbGxvd2VkIHRvIHJhaXNlIG1heGltdW0gbGltaXQiKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFJlc291cmNlRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHJsLnJsaW1fY3VyID0gcmwucmxpbV9jdXIgJiBSTElNX0lORklOSVRZOworICAgIHJsLnJsaW1fbWF4ID0gcmwucmxpbV9tYXggJiBSTElNX0lORklOSVRZOworICAgIGlmIChzZXRybGltaXQocmVzb3VyY2UsICZybCkgPT0gLTEpIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVJTlZBTCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50IGxpbWl0IGV4Y2VlZHMgbWF4aW11bSBsaW1pdCIpOworICAgICAgICBlbHNlIGlmIChlcnJubyA9PSBFUEVSTSkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYWxsb3dlZCB0byByYWlzZSBtYXhpbXVtIGxpbWl0Iik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhSZXNvdXJjZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlc291cmNlX2dldHBhZ2VzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCWxvbmcgcGFnZXNpemUgPSAwOworICAgIGxvbmcgcGFnZXNpemUgPSAwOwogI2lmIGRlZmluZWQoSEFWRV9HRVRQQUdFU0laRSkKLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwogI2VsaWYgZGVmaW5lZChIQVZFX1NZU0NPTkYpCiAjaWYgZGVmaW5lZChfU0NfUEFHRV9TSVpFKQotCXBhZ2VzaXplID0gc3lzY29uZihfU0NfUEFHRV9TSVpFKTsKKyAgICBwYWdlc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CiAjZWxzZQotCS8qIElyaXggNS4zIGhhcyBfU0NfUEFHRVNJWkUsIGJ1dCBub3QgX1NDX1BBR0VfU0laRSAqLwotCXBhZ2VzaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworICAgIC8qIElyaXggNS4zIGhhcyBfU0NfUEFHRVNJWkUsIGJ1dCBub3QgX1NDX1BBR0VfU0laRSAqLworICAgIHBhZ2VzaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwogI2VuZGlmCiAjZW5kaWYKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHBhZ2VzaXplKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHBhZ2VzaXplKTsKIAogfQogCkBAIC0yMTUsMTEgKzIxNSwxMSBAQAogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmCiByZXNvdXJjZV9tZXRob2RzW10gPSB7Ci0JeyJnZXRydXNhZ2UiLCAgICByZXNvdXJjZV9nZXRydXNhZ2UsICAgTUVUSF9WQVJBUkdTfSwKLQl7ImdldHJsaW1pdCIsICAgIHJlc291cmNlX2dldHJsaW1pdCwgICBNRVRIX1ZBUkFSR1N9LAotCXsic2V0cmxpbWl0IiwgICAgcmVzb3VyY2Vfc2V0cmxpbWl0LCAgIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRwYWdlc2l6ZSIsICByZXNvdXJjZV9nZXRwYWdlc2l6ZSwgTUVUSF9OT0FSR1N9LAotCXtOVUxMLCBOVUxMfQkJCSAgICAgLyogc2VudGluZWwgKi8KKyAgICB7ImdldHJ1c2FnZSIsICAgIHJlc291cmNlX2dldHJ1c2FnZSwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0cmxpbWl0IiwgICAgcmVzb3VyY2VfZ2V0cmxpbWl0LCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRybGltaXQiLCAgICByZXNvdXJjZV9zZXRybGltaXQsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHBhZ2VzaXplIiwgIHJlc291cmNlX2dldHBhZ2VzaXplLCBNRVRIX05PQVJHU30sCisgICAge05VTEwsIE5VTEx9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0yMjgsMTAyICsyMjgsMTAyIEBACiBQeU1PRElOSVRfRlVOQwogaW5pdHJlc291cmNlKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICp2OworICAgIFB5T2JqZWN0ICptLCAqdjsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlKCJyZXNvdXJjZSIsIHJlc291cmNlX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZSgicmVzb3VyY2UiLCByZXNvdXJjZV9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWlmIChSZXNvdXJjZUVycm9yID09IE5VTEwpIHsKLQkJUmVzb3VyY2VFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigicmVzb3VyY2UuZXJyb3IiLAotCQkJCQkJICAgTlVMTCwgTlVMTCk7Ci0JfQotCVB5X0lOQ1JFRihSZXNvdXJjZUVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgUmVzb3VyY2VFcnJvcik7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0UlVzYWdlVHlwZSwgCi0JCQkJCSAgJnN0cnVjdF9ydXNhZ2VfZGVzYyk7Ci0JUHlfSU5DUkVGKCZTdHJ1Y3RSVXNhZ2VUeXBlKTsKLSAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcnVzYWdlIiwgCi0JCQkgICAoUHlPYmplY3QqKSAmU3RydWN0UlVzYWdlVHlwZSk7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBpZiAoUmVzb3VyY2VFcnJvciA9PSBOVUxMKSB7CisgICAgICAgIFJlc291cmNlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInJlc291cmNlLmVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFJlc291cmNlRXJyb3IpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBSZXNvdXJjZUVycm9yKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RSVXNhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ1Y3RfcnVzYWdlX2Rlc2MpOworICAgIFB5X0lOQ1JFRigmU3RydWN0UlVzYWdlVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcnVzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0KikgJlN0cnVjdFJVc2FnZVR5cGUpOwogCi0JLyogaW5zZXJ0IGNvbnN0YW50cyAqLworICAgIC8qIGluc2VydCBjb25zdGFudHMgKi8KICNpZmRlZiBSTElNSVRfQ1BVCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9DUFUiLCBSTElNSVRfQ1BVKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0NQVSIsIFJMSU1JVF9DUFUpOwogI2VuZGlmCiAKICNpZmRlZiBSTElNSVRfRlNJWkUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0ZTSVpFIiwgUkxJTUlUX0ZTSVpFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0ZTSVpFIiwgUkxJTUlUX0ZTSVpFKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX0RBVEEKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0RBVEEiLCBSTElNSVRfREFUQSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9EQVRBIiwgUkxJTUlUX0RBVEEpOwogI2VuZGlmCiAKICNpZmRlZiBSTElNSVRfU1RBQ0sKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX1NUQUNLIiwgUkxJTUlUX1NUQUNLKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX1NUQUNLIiwgUkxJTUlUX1NUQUNLKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX0NPUkUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0NPUkUiLCBSTElNSVRfQ09SRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9DT1JFIiwgUkxJTUlUX0NPUkUpOwogI2VuZGlmCiAKICNpZmRlZiBSTElNSVRfTk9GSUxFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9OT0ZJTEUiLCBSTElNSVRfTk9GSUxFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX05PRklMRSIsIFJMSU1JVF9OT0ZJTEUpOwogI2VuZGlmCiAKICNpZmRlZiBSTElNSVRfT0ZJTEUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX09GSUxFIiwgUkxJTUlUX09GSUxFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX09GSUxFIiwgUkxJTUlUX09GSUxFKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX1ZNRU0KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX1ZNRU0iLCBSTElNSVRfVk1FTSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9WTUVNIiwgUkxJTUlUX1ZNRU0pOwogI2VuZGlmCiAKICNpZmRlZiBSTElNSVRfQVMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0FTIiwgUkxJTUlUX0FTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0FTIiwgUkxJTUlUX0FTKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX1JTUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfUlNTIiwgUkxJTUlUX1JTUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9SU1MiLCBSTElNSVRfUlNTKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX05QUk9DCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9OUFJPQyIsIFJMSU1JVF9OUFJPQyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9OUFJPQyIsIFJMSU1JVF9OUFJPQyk7CiAjZW5kaWYKIAogI2lmZGVmIFJMSU1JVF9NRU1MT0NLCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9NRU1MT0NLIiwgUkxJTUlUX01FTUxPQ0spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfTUVNTE9DSyIsIFJMSU1JVF9NRU1MT0NLKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX1NCU0laRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfU0JTSVpFIiwgUkxJTUlUX1NCU0laRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9TQlNJWkUiLCBSTElNSVRfU0JTSVpFKTsKICNlbmRpZgogCiAjaWZkZWYgUlVTQUdFX1NFTEYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUlVTQUdFX1NFTEYiLCBSVVNBR0VfU0VMRik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJVU0FHRV9TRUxGIiwgUlVTQUdFX1NFTEYpOwogI2VuZGlmCiAKICNpZmRlZiBSVVNBR0VfQ0hJTERSRU4KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUlVTQUdFX0NISUxEUkVOIiwgUlVTQUdFX0NISUxEUkVOKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUlVTQUdFX0NISUxEUkVOIiwgUlVTQUdFX0NISUxEUkVOKTsKICNlbmRpZgogCiAjaWZkZWYgUlVTQUdFX0JPVEgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUlVTQUdFX0JPVEgiLCBSVVNBR0VfQk9USCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJVU0FHRV9CT1RIIiwgUlVTQUdFX0JPVEgpOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKQotCWlmIChzaXplb2YoUkxJTV9JTkZJTklUWSkgPiBzaXplb2YobG9uZykpIHsKLQkJdiA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORykgUkxJTV9JTkZJTklUWSk7Ci0JfSBlbHNlIAorICAgIGlmIChzaXplb2YoUkxJTV9JTkZJTklUWSkgPiBzaXplb2YobG9uZykpIHsKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORykgUkxJTV9JTkZJTklUWSk7CisgICAgfSBlbHNlCiAjZW5kaWYKLQl7Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgUkxJTV9JTkZJTklUWSk7Ci0JfQotCWlmICh2KSB7Ci0JCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUkxJTV9JTkZJTklUWSIsIHYpOwotCX0KLQlpbml0aWFsaXplZCA9IDE7CisgICAgeworICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIFJMSU1fSU5GSU5JVFkpOworICAgIH0KKyAgICBpZiAodikgeworICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJMSU1fSU5GSU5JVFkiLCB2KTsKKyAgICB9CisgICAgaW5pdGlhbGl6ZWQgPSAxOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9yb3RhdGluZ3RyZWUuYyBiL01vZHVsZXMvcm90YXRpbmd0cmVlLmMKaW5kZXggMzljNmRkNS4uMDdlMDhiYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yb3RhdGluZ3RyZWUuYworKysgYi9Nb2R1bGVzL3JvdGF0aW5ndHJlZS5jCkBAIC0xNCwxNCArMTQsMTQgQEAKIHN0YXRpYyBpbnQKIHJhbmRvbWJpdHMoaW50IGJpdHMpCiB7Ci0JaW50IHJlc3VsdDsKLQlpZiAocmFuZG9tX3N0cmVhbSA8ICgxVSA8PCBiaXRzKSkgewotCQlyYW5kb21fdmFsdWUgKj0gMTA4MjUyNzsKLQkJcmFuZG9tX3N0cmVhbSA9IHJhbmRvbV92YWx1ZTsKLQl9Ci0JcmVzdWx0ID0gcmFuZG9tX3N0cmVhbSAmICgoMTw8Yml0cyktMSk7Ci0JcmFuZG9tX3N0cmVhbSA+Pj0gYml0czsKLQlyZXR1cm4gcmVzdWx0OworICAgIGludCByZXN1bHQ7CisgICAgaWYgKHJhbmRvbV9zdHJlYW0gPCAoMVUgPDwgYml0cykpIHsKKyAgICAgICAgcmFuZG9tX3ZhbHVlICo9IDEwODI1Mjc7CisgICAgICAgIHJhbmRvbV9zdHJlYW0gPSByYW5kb21fdmFsdWU7CisgICAgfQorICAgIHJlc3VsdCA9IHJhbmRvbV9zdHJlYW0gJiAoKDE8PGJpdHMpLTEpOworICAgIHJhbmRvbV9zdHJlYW0gPj49IGJpdHM7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCkBAIC0zMCwxNSArMzAsMTUgQEAKIHZvaWQKIFJvdGF0aW5nVHJlZV9BZGQocm90YXRpbmdfbm9kZV90ICoqcm9vdCwgcm90YXRpbmdfbm9kZV90ICpub2RlKQogewotCXdoaWxlICgqcm9vdCAhPSBOVUxMKSB7Ci0JCWlmIChLRVlfTE9XRVJfVEhBTihub2RlLT5rZXksICgqcm9vdCktPmtleSkpCi0JCQlyb290ID0gJigoKnJvb3QpLT5sZWZ0KTsKLQkJZWxzZQotCQkJcm9vdCA9ICYoKCpyb290KS0+cmlnaHQpOwotCX0KLQlub2RlLT5sZWZ0ID0gTlVMTDsKLQlub2RlLT5yaWdodCA9IE5VTEw7Ci0JKnJvb3QgPSBub2RlOworICAgIHdoaWxlICgqcm9vdCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChLRVlfTE9XRVJfVEhBTihub2RlLT5rZXksICgqcm9vdCktPmtleSkpCisgICAgICAgICAgICByb290ID0gJigoKnJvb3QpLT5sZWZ0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcm9vdCA9ICYoKCpyb290KS0+cmlnaHQpOworICAgIH0KKyAgICBub2RlLT5sZWZ0ID0gTlVMTDsKKyAgICBub2RlLT5yaWdodCA9IE5VTEw7CisgICAgKnJvb3QgPSBub2RlOwogfQogCiAvKiBMb2NhdGUgdGhlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4ga2V5LiAgVGhpcyBpcyB0aGUgbW9zdCBjb21wbGljYXRlZApAQCAtNDcsNTcgKzQ3LDU3IEBACiByb3RhdGluZ19ub2RlX3QgKgogUm90YXRpbmdUcmVlX0dldChyb3RhdGluZ19ub2RlX3QgKipyb290LCB2b2lkICprZXkpCiB7Ci0JaWYgKHJhbmRvbWJpdHMoMykgIT0gNCkgewotCQkvKiBGYXN0IHBhdGgsIG5vIHJlYmFsYW5jaW5nICovCi0JCXJvdGF0aW5nX25vZGVfdCAqbm9kZSA9ICpyb290OwotCQl3aGlsZSAobm9kZSAhPSBOVUxMKSB7Ci0JCQlpZiAobm9kZS0+a2V5ID09IGtleSkKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCWlmIChLRVlfTE9XRVJfVEhBTihrZXksIG5vZGUtPmtleSkpCi0JCQkJbm9kZSA9IG5vZGUtPmxlZnQ7Ci0JCQllbHNlCi0JCQkJbm9kZSA9IG5vZGUtPnJpZ2h0OwotCQl9Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJcm90YXRpbmdfbm9kZV90ICoqcG5vZGUgPSByb290OwotCQlyb3RhdGluZ19ub2RlX3QgKm5vZGUgPSAqcG5vZGU7Ci0JCXJvdGF0aW5nX25vZGVfdCAqbmV4dDsKLQkJaW50IHJvdGF0ZTsKLQkJaWYgKG5vZGUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQl3aGlsZSAoMSkgewotCQkJaWYgKG5vZGUtPmtleSA9PSBrZXkpCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCQlyb3RhdGUgPSAhcmFuZG9tYml0cygxKTsKLQkJCWlmIChLRVlfTE9XRVJfVEhBTihrZXksIG5vZGUtPmtleSkpIHsKLQkJCQluZXh0ID0gbm9kZS0+bGVmdDsKLQkJCQlpZiAobmV4dCA9PSBOVUxMKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQlpZiAocm90YXRlKSB7Ci0JCQkJCW5vZGUtPmxlZnQgPSBuZXh0LT5yaWdodDsKLQkJCQkJbmV4dC0+cmlnaHQgPSBub2RlOwotCQkJCQkqcG5vZGUgPSBuZXh0OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXBub2RlID0gJihub2RlLT5sZWZ0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5leHQgPSBub2RlLT5yaWdodDsKLQkJCQlpZiAobmV4dCA9PSBOVUxMKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQlpZiAocm90YXRlKSB7Ci0JCQkJCW5vZGUtPnJpZ2h0ID0gbmV4dC0+bGVmdDsKLQkJCQkJbmV4dC0+bGVmdCA9IG5vZGU7Ci0JCQkJCSpwbm9kZSA9IG5leHQ7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJcG5vZGUgPSAmKG5vZGUtPnJpZ2h0KTsKLQkJCX0KLQkJCW5vZGUgPSBuZXh0OwotCQl9Ci0JfQorICAgIGlmIChyYW5kb21iaXRzKDMpICE9IDQpIHsKKyAgICAgICAgLyogRmFzdCBwYXRoLCBubyByZWJhbGFuY2luZyAqLworICAgICAgICByb3RhdGluZ19ub2RlX3QgKm5vZGUgPSAqcm9vdDsKKyAgICAgICAgd2hpbGUgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG5vZGUtPmtleSA9PSBrZXkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICBpZiAoS0VZX0xPV0VSX1RIQU4oa2V5LCBub2RlLT5rZXkpKQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLT5sZWZ0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLT5yaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJvdGF0aW5nX25vZGVfdCAqKnBub2RlID0gcm9vdDsKKyAgICAgICAgcm90YXRpbmdfbm9kZV90ICpub2RlID0gKnBub2RlOworICAgICAgICByb3RhdGluZ19ub2RlX3QgKm5leHQ7CisgICAgICAgIGludCByb3RhdGU7CisgICAgICAgIGlmIChub2RlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGlmIChub2RlLT5rZXkgPT0ga2V5KQorICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgcm90YXRlID0gIXJhbmRvbWJpdHMoMSk7CisgICAgICAgICAgICBpZiAoS0VZX0xPV0VSX1RIQU4oa2V5LCBub2RlLT5rZXkpKSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IG5vZGUtPmxlZnQ7CisgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKHJvdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBub2RlLT5sZWZ0ID0gbmV4dC0+cmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIG5leHQtPnJpZ2h0ID0gbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgKnBub2RlID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwbm9kZSA9ICYobm9kZS0+bGVmdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gbm9kZS0+cmlnaHQ7CisgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKHJvdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBub2RlLT5yaWdodCA9IG5leHQtPmxlZnQ7CisgICAgICAgICAgICAgICAgICAgIG5leHQtPmxlZnQgPSBub2RlOworICAgICAgICAgICAgICAgICAgICAqcG5vZGUgPSBuZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBub2RlID0gJihub2RlLT5yaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbmV4dDsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLyogRW51bWVyYXRlIGFsbCBub2RlcyBpbiB0aGUgdHJlZS4gIFRoZSBjYWxsYmFjayBlbnVtZm4oKSBzaG91bGQgcmV0dXJuCkBAIC0xMDUsMTcgKzEwNSwxNyBAQAogICAgQSBub24temVybyB2YWx1ZSBpcyBkaXJlY3RseSByZXR1cm5lZCBieSBSb3RhdGluZ1RyZWVfRW51bSgpLiAqLwogaW50CiBSb3RhdGluZ1RyZWVfRW51bShyb3RhdGluZ19ub2RlX3QgKnJvb3QsIHJvdGF0aW5nX3RyZWVfZW51bV9mbiBlbnVtZm4sCi0JCSAgdm9pZCAqYXJnKQorICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKQogewotCWludCByZXN1bHQ7Ci0Jcm90YXRpbmdfbm9kZV90ICpub2RlOwotCXdoaWxlIChyb290ICE9IE5VTEwpIHsKLQkJcmVzdWx0ID0gUm90YXRpbmdUcmVlX0VudW0ocm9vdC0+bGVmdCwgZW51bWZuLCBhcmcpOwotCQlpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7Ci0JCW5vZGUgPSByb290LT5yaWdodDsKLQkJcmVzdWx0ID0gZW51bWZuKHJvb3QsIGFyZyk7Ci0JCWlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsKLQkJcm9vdCA9IG5vZGU7Ci0JfQotCXJldHVybiAwOworICAgIGludCByZXN1bHQ7CisgICAgcm90YXRpbmdfbm9kZV90ICpub2RlOworICAgIHdoaWxlIChyb290ICE9IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gUm90YXRpbmdUcmVlX0VudW0ocm9vdC0+bGVmdCwgZW51bWZuLCBhcmcpOworICAgICAgICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7CisgICAgICAgIG5vZGUgPSByb290LT5yaWdodDsKKyAgICAgICAgcmVzdWx0ID0gZW51bWZuKHJvb3QsIGFyZyk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcm9vdCA9IG5vZGU7CisgICAgfQorICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYyBiL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKaW5kZXggNTk2MDU0NC4uYzQ5YzdiNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCkBAIC0yNCw3ICsyNCw3IEBACiAqLwogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgJiYgIWRlZmluZWQoRkRfU0VUU0laRSkKICNkZWZpbmUgRkRfU0VUU0laRSA1MTIKLSNlbmRpZiAKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChIQVZFX1BPTExfSCkKICNpbmNsdWRlIDxwb2xsLmg+CkBAIC02MSwyMCArNjEsMjAgQEAKIAogLyogbGlzdCBvZiBQeXRob24gb2JqZWN0cyBhbmQgdGhlaXIgZmlsZSBkZXNjcmlwdG9yICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3QgKm9iajsJCQkgICAgIC8qIG93bmVkIHJlZmVyZW5jZSAqLwotCVNPQ0tFVCBmZDsKLQlpbnQgc2VudGluZWw7CQkJICAgICAvKiAtMSA9PSBzZW50aW5lbCAqLworICAgIFB5T2JqZWN0ICpvYmo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3duZWQgcmVmZXJlbmNlICovCisgICAgU09DS0VUIGZkOworICAgIGludCBzZW50aW5lbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLTEgPT0gc2VudGluZWwgKi8KIH0gcHlsaXN0OwogCiBzdGF0aWMgdm9pZAogcmVhcF9vYmoocHlsaXN0IGZkMm9ialtGRF9TRVRTSVpFICsgMV0pCiB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IEZEX1NFVFNJWkUgKyAxICYmIGZkMm9ialtpXS5zZW50aW5lbCA+PSAwOyBpKyspIHsKLQkJUHlfWERFQ1JFRihmZDJvYmpbaV0ub2JqKTsKLQkJZmQyb2JqW2ldLm9iaiA9IE5VTEw7Ci0JfQotCWZkMm9ialswXS5zZW50aW5lbCA9IC0xOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRF9TRVRTSVpFICsgMSAmJiBmZDJvYmpbaV0uc2VudGluZWwgPj0gMDsgaSsrKSB7CisgICAgICAgIFB5X1hERUNSRUYoZmQyb2JqW2ldLm9iaik7CisgICAgICAgIGZkMm9ialtpXS5vYmogPSBOVUxMOworICAgIH0KKyAgICBmZDJvYmpbMF0uc2VudGluZWwgPSAtMTsKIH0KIAogCkBAIC04NCwxMDYgKzg0LDEwNiBAQAogc3RhdGljIGludAogc2VxMnNldChQeU9iamVjdCAqc2VxLCBmZF9zZXQgKnNldCwgcHlsaXN0IGZkMm9ialtGRF9TRVRTSVpFICsgMV0pCiB7Ci0JaW50IGk7Ci0JaW50IG1heCA9IC0xOwotCWludCBpbmRleCA9IDA7Ci0gICAgICAgIGludCBsZW4gPSAtMTsKLSAgICAgICAgUHlPYmplY3QqIGZhc3Rfc2VxID0gTlVMTDsKLQlQeU9iamVjdCogbyA9IE5VTEw7CisgICAgaW50IGk7CisgICAgaW50IG1heCA9IC0xOworICAgIGludCBpbmRleCA9IDA7CisgICAgaW50IGxlbiA9IC0xOworICAgIFB5T2JqZWN0KiBmYXN0X3NlcSA9IE5VTEw7CisgICAgUHlPYmplY3QqIG8gPSBOVUxMOwogCi0JZmQyb2JqWzBdLm9iaiA9IChQeU9iamVjdCopMDsJICAgICAvKiBzZXQgbGlzdCB0byB6ZXJvIHNpemUgKi8KLQlGRF9aRVJPKHNldCk7CisgICAgZmQyb2JqWzBdLm9iaiA9IChQeU9iamVjdCopMDsgICAgICAgICAgICAvKiBzZXQgbGlzdCB0byB6ZXJvIHNpemUgKi8KKyAgICBGRF9aRVJPKHNldCk7CiAKLSAgICAgICAgZmFzdF9zZXEgPSBQeVNlcXVlbmNlX0Zhc3Qoc2VxLCAiYXJndW1lbnRzIDEtMyBtdXN0IGJlIHNlcXVlbmNlcyIpOwotICAgICAgICBpZiAoIWZhc3Rfc2VxKQorICAgIGZhc3Rfc2VxID0gUHlTZXF1ZW5jZV9GYXN0KHNlcSwgImFyZ3VtZW50cyAxLTMgbXVzdCBiZSBzZXF1ZW5jZXMiKTsKKyAgICBpZiAoIWZhc3Rfc2VxKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBsZW4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmFzdF9zZXEpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSAgeworICAgICAgICBTT0NLRVQgdjsKKworICAgICAgICAvKiBhbnkgaW50ZXJ2ZW5pbmcgZmlsZW5vKCkgY2FsbHMgY291bGQgZGVjciB0aGlzIHJlZmNudCAqLworICAgICAgICBpZiAoIShvID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZhc3Rfc2VxLCBpKSkpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgbGVuID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKGZhc3Rfc2VxKTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgIHsKLQkJU09DS0VUIHY7Ci0KLQkJLyogYW55IGludGVydmVuaW5nIGZpbGVubygpIGNhbGxzIGNvdWxkIGRlY3IgdGhpcyByZWZjbnQgKi8KLQkJaWYgKCEobyA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShmYXN0X3NlcSwgaSkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLQkJUHlfSU5DUkVGKG8pOwotCQl2ID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvciggbyApOwotCQlpZiAodiA9PSAtMSkgZ290byBmaW5hbGx5OworICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgIHYgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKCBvICk7CisgICAgICAgIGlmICh2ID09IC0xKSBnb3RvIGZpbmFsbHk7CiAKICNpZiBkZWZpbmVkKF9NU0NfVkVSKQotCQltYXggPSAwOwkJICAgICAvKiBub3QgdXNlZCBmb3IgV2luMzIgKi8KKyAgICAgICAgbWF4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCB1c2VkIGZvciBXaW4zMiAqLwogI2Vsc2UgIC8qICFfTVNDX1ZFUiAqLwotCQlpZiAodiA8IDAgfHwgdiA+PSBGRF9TRVRTSVpFKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgImZpbGVkZXNjcmlwdG9yIG91dCBvZiByYW5nZSBpbiBzZWxlY3QoKSIpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWlmICh2ID4gbWF4KQotCQkJbWF4ID0gdjsKKyAgICAgICAgaWYgKHYgPCAwIHx8IHYgPj0gRkRfU0VUU0laRSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZWRlc2NyaXB0b3Igb3V0IG9mIHJhbmdlIGluIHNlbGVjdCgpIik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHYgPiBtYXgpCisgICAgICAgICAgICBtYXggPSB2OwogI2VuZGlmIC8qIF9NU0NfVkVSICovCi0JCUZEX1NFVCh2LCBzZXQpOworICAgICAgICBGRF9TRVQodiwgc2V0KTsKIAotCQkvKiBhZGQgb2JqZWN0IGFuZCBpdHMgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBsaXN0ICovCi0JCWlmIChpbmRleCA+PSBGRF9TRVRTSVpFKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICAidG9vIG1hbnkgZmlsZSBkZXNjcmlwdG9ycyBpbiBzZWxlY3QoKSIpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWZkMm9ialtpbmRleF0ub2JqID0gbzsKLQkJZmQyb2JqW2luZGV4XS5mZCA9IHY7Ci0JCWZkMm9ialtpbmRleF0uc2VudGluZWwgPSAwOwotCQlmZDJvYmpbKytpbmRleF0uc2VudGluZWwgPSAtMTsKLQl9Ci0gICAgICAgIFB5X0RFQ1JFRihmYXN0X3NlcSk7Ci0JcmV0dXJuIG1heCsxOworICAgICAgICAvKiBhZGQgb2JqZWN0IGFuZCBpdHMgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBsaXN0ICovCisgICAgICAgIGlmIChpbmRleCA+PSBGRF9TRVRTSVpFKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRvbyBtYW55IGZpbGUgZGVzY3JpcHRvcnMgaW4gc2VsZWN0KCkiKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBmZDJvYmpbaW5kZXhdLm9iaiA9IG87CisgICAgICAgIGZkMm9ialtpbmRleF0uZmQgPSB2OworICAgICAgICBmZDJvYmpbaW5kZXhdLnNlbnRpbmVsID0gMDsKKyAgICAgICAgZmQyb2JqWysraW5kZXhdLnNlbnRpbmVsID0gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihmYXN0X3NlcSk7CisgICAgcmV0dXJuIG1heCsxOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihvKTsKLSAgICAgICAgUHlfREVDUkVGKGZhc3Rfc2VxKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfWERFQ1JFRihvKTsKKyAgICBQeV9ERUNSRUYoZmFzdF9zZXEpOworICAgIHJldHVybiAtMTsKIH0KIAogLyogcmV0dXJucyBOVUxMIGFuZCBzZXRzIHRoZSBQeXRob24gZXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkICovCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0Mmxpc3QoZmRfc2V0ICpzZXQsIHB5bGlzdCBmZDJvYmpbRkRfU0VUU0laRSArIDFdKQogewotCWludCBpLCBqLCBjb3VudD0wOwotCVB5T2JqZWN0ICpsaXN0LCAqbzsKLQlTT0NLRVQgZmQ7CisgICAgaW50IGksIGosIGNvdW50PTA7CisgICAgUHlPYmplY3QgKmxpc3QsICpvOworICAgIFNPQ0tFVCBmZDsKIAotCWZvciAoaiA9IDA7IGZkMm9ialtqXS5zZW50aW5lbCA+PSAwOyBqKyspIHsKLQkJaWYgKEZEX0lTU0VUKGZkMm9ialtqXS5mZCwgc2V0KSkKLQkJCWNvdW50Kys7Ci0JfQotCWxpc3QgPSBQeUxpc3RfTmV3KGNvdW50KTsKLQlpZiAoIWxpc3QpCi0JCXJldHVybiBOVUxMOworICAgIGZvciAoaiA9IDA7IGZkMm9ialtqXS5zZW50aW5lbCA+PSAwOyBqKyspIHsKKyAgICAgICAgaWYgKEZEX0lTU0VUKGZkMm9ialtqXS5mZCwgc2V0KSkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgfQorICAgIGxpc3QgPSBQeUxpc3RfTmV3KGNvdW50KTsKKyAgICBpZiAoIWxpc3QpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaSA9IDA7Ci0JZm9yIChqID0gMDsgZmQyb2JqW2pdLnNlbnRpbmVsID49IDA7IGorKykgewotCQlmZCA9IGZkMm9ialtqXS5mZDsKLQkJaWYgKEZEX0lTU0VUKGZkLCBzZXQpKSB7CisgICAgaSA9IDA7CisgICAgZm9yIChqID0gMDsgZmQyb2JqW2pdLnNlbnRpbmVsID49IDA7IGorKykgeworICAgICAgICBmZCA9IGZkMm9ialtqXS5mZDsKKyAgICAgICAgaWYgKEZEX0lTU0VUKGZkLCBzZXQpKSB7CiAjaWZuZGVmIF9NU0NfVkVSCi0JCQlpZiAoZmQgPiBGRF9TRVRTSVpFKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJICAgImZpbGVkZXNjcmlwdG9yIG91dCBvZiByYW5nZSByZXR1cm5lZCBpbiBzZWxlY3QoKSIpOwotCQkJCWdvdG8gZmluYWxseTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChmZCA+IEZEX1NFVFNJWkUpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAiZmlsZWRlc2NyaXB0b3Igb3V0IG9mIHJhbmdlIHJldHVybmVkIGluIHNlbGVjdCgpIik7CisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgfQogI2VuZGlmCi0JCQlvID0gZmQyb2JqW2pdLm9iajsKLQkJCWZkMm9ialtqXS5vYmogPSBOVUxMOwotCQkJLyogdHJhbnNmZXIgb3duZXJzaGlwICovCi0JCQlpZiAoUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgbykgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIG8gPSBmZDJvYmpbal0ub2JqOworICAgICAgICAgICAgZmQyb2JqW2pdLm9iaiA9IE5VTEw7CisgICAgICAgICAgICAvKiB0cmFuc2ZlciBvd25lcnNoaXAgKi8KKyAgICAgICAgICAgIGlmIChQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBvKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQlpKys7Ci0JCX0KLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7CiAgIGZpbmFsbHk6Ci0JUHlfREVDUkVGKGxpc3QpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI3VuZGVmIFNFTEVDVF9VU0VTX0hFQVAKQEAgLTE5NSwxNzAgKzE5NSwxNzAgQEAKIHNlbGVjdF9zZWxlY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogI2lmZGVmIFNFTEVDVF9VU0VTX0hFQVAKLQlweWxpc3QgKnJmZDJvYmosICp3ZmQyb2JqLCAqZWZkMm9iajsKKyAgICBweWxpc3QgKnJmZDJvYmosICp3ZmQyb2JqLCAqZWZkMm9iajsKICNlbHNlICAvKiAhU0VMRUNUX1VTRVNfSEVBUCAqLwotCS8qIFhYWDogQWxsIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGltcGxlbWVudGVkIGFzIGZvbGxvd3M6Ci0JICogLSBmaW5kIHRoZSBoaWdoZXN0IGRlc2NyaXB0b3Igd2UncmUgaW50ZXJlc3RlZCBpbgotCSAqIC0gYWRkIG9uZQotCSAqIC0gdGhhdCdzIHRoZSBzaXplCi0JICogU2VlOiBTdGV2ZW5zLCBBUGl0VUUsICQxMi41LjEKLQkgKi8KLQlweWxpc3QgcmZkMm9ialtGRF9TRVRTSVpFICsgMV07Ci0JcHlsaXN0IHdmZDJvYmpbRkRfU0VUU0laRSArIDFdOwotCXB5bGlzdCBlZmQyb2JqW0ZEX1NFVFNJWkUgKyAxXTsKKyAgICAvKiBYWFg6IEFsbCB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBpbXBsZW1lbnRlZCBhcyBmb2xsb3dzOgorICAgICAqIC0gZmluZCB0aGUgaGlnaGVzdCBkZXNjcmlwdG9yIHdlJ3JlIGludGVyZXN0ZWQgaW4KKyAgICAgKiAtIGFkZCBvbmUKKyAgICAgKiAtIHRoYXQncyB0aGUgc2l6ZQorICAgICAqIFNlZTogU3RldmVucywgQVBpdFVFLCAkMTIuNS4xCisgICAgICovCisgICAgcHlsaXN0IHJmZDJvYmpbRkRfU0VUU0laRSArIDFdOworICAgIHB5bGlzdCB3ZmQyb2JqW0ZEX1NFVFNJWkUgKyAxXTsKKyAgICBweWxpc3QgZWZkMm9ialtGRF9TRVRTSVpFICsgMV07CiAjZW5kaWYgLyogU0VMRUNUX1VTRVNfSEVBUCAqLwotCVB5T2JqZWN0ICppZmRsaXN0LCAqb2ZkbGlzdCwgKmVmZGxpc3Q7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JUHlPYmplY3QgKnRvdXQgPSBQeV9Ob25lOwotCWZkX3NldCBpZmRzZXQsIG9mZHNldCwgZWZkc2V0OwotCWRvdWJsZSB0aW1lb3V0OwotCXN0cnVjdCB0aW1ldmFsIHR2LCAqdHZwOwotCWxvbmcgc2Vjb25kczsKLQlpbnQgaW1heCwgb21heCwgZW1heCwgbWF4OwotCWludCBuOworICAgIFB5T2JqZWN0ICppZmRsaXN0LCAqb2ZkbGlzdCwgKmVmZGxpc3Q7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRvdXQgPSBQeV9Ob25lOworICAgIGZkX3NldCBpZmRzZXQsIG9mZHNldCwgZWZkc2V0OworICAgIGRvdWJsZSB0aW1lb3V0OworICAgIHN0cnVjdCB0aW1ldmFsIHR2LCAqdHZwOworICAgIGxvbmcgc2Vjb25kczsKKyAgICBpbnQgaW1heCwgb21heCwgZW1heCwgbWF4OworICAgIGludCBuOwogCi0JLyogY29udmVydCBhcmd1bWVudHMgKi8KLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZWxlY3QiLCAzLCA0LAotCQkJICAgICAgJmlmZGxpc3QsICZvZmRsaXN0LCAmZWZkbGlzdCwgJnRvdXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBjb252ZXJ0IGFyZ3VtZW50cyAqLworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNlbGVjdCIsIDMsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZmRsaXN0LCAmb2ZkbGlzdCwgJmVmZGxpc3QsICZ0b3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodG91dCA9PSBQeV9Ob25lKQotCQl0dnAgPSAoc3RydWN0IHRpbWV2YWwgKikwOwotCWVsc2UgaWYgKCFQeU51bWJlcl9DaGVjayh0b3V0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0aW1lb3V0IG11c3QgYmUgYSBmbG9hdCBvciBOb25lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUodG91dCk7Ci0JCWlmICh0aW1lb3V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKHRpbWVvdXQgPiAoZG91YmxlKUxPTkdfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJInRpbWVvdXQgcGVyaW9kIHRvbyBsb25nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzZWNvbmRzID0gKGxvbmcpdGltZW91dDsKLQkJdGltZW91dCA9IHRpbWVvdXQgLSAoZG91YmxlKXNlY29uZHM7Ci0JCXR2LnR2X3NlYyA9IHNlY29uZHM7Ci0JCXR2LnR2X3VzZWMgPSAobG9uZykodGltZW91dCAqIDFFNik7Ci0JCXR2cCA9ICZ0djsKLQl9CisgICAgaWYgKHRvdXQgPT0gUHlfTm9uZSkKKyAgICAgICAgdHZwID0gKHN0cnVjdCB0aW1ldmFsICopMDsKKyAgICBlbHNlIGlmICghUHlOdW1iZXJfQ2hlY2sodG91dCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IG11c3QgYmUgYSBmbG9hdCBvciBOb25lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUodG91dCk7CisgICAgICAgIGlmICh0aW1lb3V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHRpbWVvdXQgPiAoZG91YmxlKUxPTkdfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCBwZXJpb2QgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNlY29uZHMgPSAobG9uZyl0aW1lb3V0OworICAgICAgICB0aW1lb3V0ID0gdGltZW91dCAtIChkb3VibGUpc2Vjb25kczsKKyAgICAgICAgdHYudHZfc2VjID0gc2Vjb25kczsKKyAgICAgICAgdHYudHZfdXNlYyA9IChsb25nKSh0aW1lb3V0ICogMUU2KTsKKyAgICAgICAgdHZwID0gJnR2OworICAgIH0KIAogCiAjaWZkZWYgU0VMRUNUX1VTRVNfSEVBUAotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGxpc3RzICovCi0JcmZkMm9iaiA9IFB5TWVtX05FVyhweWxpc3QsIEZEX1NFVFNJWkUgKyAxKTsKLQl3ZmQyb2JqID0gUHlNZW1fTkVXKHB5bGlzdCwgRkRfU0VUU0laRSArIDEpOwotCWVmZDJvYmogPSBQeU1lbV9ORVcocHlsaXN0LCBGRF9TRVRTSVpFICsgMSk7Ci0JaWYgKHJmZDJvYmogPT0gTlVMTCB8fCB3ZmQyb2JqID09IE5VTEwgfHwgZWZkMm9iaiA9PSBOVUxMKSB7Ci0JCWlmIChyZmQyb2JqKSBQeU1lbV9ERUwocmZkMm9iaik7Ci0JCWlmICh3ZmQyb2JqKSBQeU1lbV9ERUwod2ZkMm9iaik7Ci0JCWlmIChlZmQyb2JqKSBQeU1lbV9ERUwoZWZkMm9iaik7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBsaXN0cyAqLworICAgIHJmZDJvYmogPSBQeU1lbV9ORVcocHlsaXN0LCBGRF9TRVRTSVpFICsgMSk7CisgICAgd2ZkMm9iaiA9IFB5TWVtX05FVyhweWxpc3QsIEZEX1NFVFNJWkUgKyAxKTsKKyAgICBlZmQyb2JqID0gUHlNZW1fTkVXKHB5bGlzdCwgRkRfU0VUU0laRSArIDEpOworICAgIGlmIChyZmQyb2JqID09IE5VTEwgfHwgd2ZkMm9iaiA9PSBOVUxMIHx8IGVmZDJvYmogPT0gTlVMTCkgeworICAgICAgICBpZiAocmZkMm9iaikgUHlNZW1fREVMKHJmZDJvYmopOworICAgICAgICBpZiAod2ZkMm9iaikgUHlNZW1fREVMKHdmZDJvYmopOworICAgICAgICBpZiAoZWZkMm9iaikgUHlNZW1fREVMKGVmZDJvYmopOworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CiAjZW5kaWYgLyogU0VMRUNUX1VTRVNfSEVBUCAqLwotCS8qIENvbnZlcnQgc2VxdWVuY2VzIHRvIGZkX3NldHMsIGFuZCBnZXQgbWF4aW11bSBmZCBudW1iZXIKLQkgKiBwcm9wYWdhdGVzIHRoZSBQeXRob24gZXhjZXB0aW9uIHNldCBpbiBzZXEyc2V0KCkKLQkgKi8KLQlyZmQyb2JqWzBdLnNlbnRpbmVsID0gLTE7Ci0Jd2ZkMm9ialswXS5zZW50aW5lbCA9IC0xOwotCWVmZDJvYmpbMF0uc2VudGluZWwgPSAtMTsKLQlpZiAoKGltYXg9c2VxMnNldChpZmRsaXN0LCAmaWZkc2V0LCByZmQyb2JqKSkgPCAwKSAKLQkJZ290byBmaW5hbGx5OwotCWlmICgob21heD1zZXEyc2V0KG9mZGxpc3QsICZvZmRzZXQsIHdmZDJvYmopKSA8IDApIAotCQlnb3RvIGZpbmFsbHk7Ci0JaWYgKChlbWF4PXNlcTJzZXQoZWZkbGlzdCwgJmVmZHNldCwgZWZkMm9iaikpIDwgMCkgCi0JCWdvdG8gZmluYWxseTsKLQltYXggPSBpbWF4OwotCWlmIChvbWF4ID4gbWF4KSBtYXggPSBvbWF4OwotCWlmIChlbWF4ID4gbWF4KSBtYXggPSBlbWF4OworICAgIC8qIENvbnZlcnQgc2VxdWVuY2VzIHRvIGZkX3NldHMsIGFuZCBnZXQgbWF4aW11bSBmZCBudW1iZXIKKyAgICAgKiBwcm9wYWdhdGVzIHRoZSBQeXRob24gZXhjZXB0aW9uIHNldCBpbiBzZXEyc2V0KCkKKyAgICAgKi8KKyAgICByZmQyb2JqWzBdLnNlbnRpbmVsID0gLTE7CisgICAgd2ZkMm9ialswXS5zZW50aW5lbCA9IC0xOworICAgIGVmZDJvYmpbMF0uc2VudGluZWwgPSAtMTsKKyAgICBpZiAoKGltYXg9c2VxMnNldChpZmRsaXN0LCAmaWZkc2V0LCByZmQyb2JqKSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKChvbWF4PXNlcTJzZXQob2ZkbGlzdCwgJm9mZHNldCwgd2ZkMm9iaikpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIGlmICgoZW1heD1zZXEyc2V0KGVmZGxpc3QsICZlZmRzZXQsIGVmZDJvYmopKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBtYXggPSBpbWF4OworICAgIGlmIChvbWF4ID4gbWF4KSBtYXggPSBvbWF4OworICAgIGlmIChlbWF4ID4gbWF4KSBtYXggPSBlbWF4OwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCW4gPSBzZWxlY3QobWF4LCAmaWZkc2V0LCAmb2Zkc2V0LCAmZWZkc2V0LCB0dnApOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIG4gPSBzZWxlY3QobWF4LCAmaWZkc2V0LCAmb2Zkc2V0LCAmZWZkc2V0LCB0dnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKICNpZmRlZiBNU19XSU5ET1dTCi0JaWYgKG4gPT0gU09DS0VUX0VSUk9SKSB7Ci0JCVB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKFNlbGVjdEVycm9yLCBXU0FHZXRMYXN0RXJyb3IoKSk7Ci0JfQorICAgIGlmIChuID09IFNPQ0tFVF9FUlJPUikgeworICAgICAgICBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycihTZWxlY3RFcnJvciwgV1NBR2V0TGFzdEVycm9yKCkpOworICAgIH0KICNlbHNlCi0JaWYgKG4gPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhTZWxlY3RFcnJvcik7Ci0JfQorICAgIGlmIChuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU2VsZWN0RXJyb3IpOworICAgIH0KICNlbmRpZgotCWVsc2UgewotCQkvKiBhbnkgb2YgdGhlc2UgdGhyZWUgY2FsbHMgY2FuIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIGl0J3MgbW9yZQotCQkgICBjb252ZW5pZW50IHRvIHRlc3QgZm9yIHRoaXMgYWZ0ZXIgYWxsIHRocmVlIGNhbGxzLi4uIGJ1dAotCQkgICBpcyB0aGF0IGFjY2VwdGFibGU/Ci0JCSovCi0JCWlmZGxpc3QgPSBzZXQybGlzdCgmaWZkc2V0LCByZmQyb2JqKTsKLQkJb2ZkbGlzdCA9IHNldDJsaXN0KCZvZmRzZXQsIHdmZDJvYmopOwotCQllZmRsaXN0ID0gc2V0Mmxpc3QoJmVmZHNldCwgZWZkMm9iaik7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0ID0gTlVMTDsKLQkJZWxzZQotCQkJcmV0ID0gUHlUdXBsZV9QYWNrKDMsIGlmZGxpc3QsIG9mZGxpc3QsIGVmZGxpc3QpOworICAgIGVsc2UgeworICAgICAgICAvKiBhbnkgb2YgdGhlc2UgdGhyZWUgY2FsbHMgY2FuIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIGl0J3MgbW9yZQorICAgICAgICAgICBjb252ZW5pZW50IHRvIHRlc3QgZm9yIHRoaXMgYWZ0ZXIgYWxsIHRocmVlIGNhbGxzLi4uIGJ1dAorICAgICAgICAgICBpcyB0aGF0IGFjY2VwdGFibGU/CisgICAgICAgICovCisgICAgICAgIGlmZGxpc3QgPSBzZXQybGlzdCgmaWZkc2V0LCByZmQyb2JqKTsKKyAgICAgICAgb2ZkbGlzdCA9IHNldDJsaXN0KCZvZmRzZXQsIHdmZDJvYmopOworICAgICAgICBlZmRsaXN0ID0gc2V0Mmxpc3QoJmVmZHNldCwgZWZkMm9iaik7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0ID0gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gUHlUdXBsZV9QYWNrKDMsIGlmZGxpc3QsIG9mZGxpc3QsIGVmZGxpc3QpOwogCi0JCVB5X0RFQ1JFRihpZmRsaXN0KTsKLQkJUHlfREVDUkVGKG9mZGxpc3QpOwotCQlQeV9ERUNSRUYoZWZkbGlzdCk7Ci0JfQotCQorICAgICAgICBQeV9ERUNSRUYoaWZkbGlzdCk7CisgICAgICAgIFB5X0RFQ1JFRihvZmRsaXN0KTsKKyAgICAgICAgUHlfREVDUkVGKGVmZGxpc3QpOworICAgIH0KKwogICBmaW5hbGx5OgotCXJlYXBfb2JqKHJmZDJvYmopOwotCXJlYXBfb2JqKHdmZDJvYmopOwotCXJlYXBfb2JqKGVmZDJvYmopOworICAgIHJlYXBfb2JqKHJmZDJvYmopOworICAgIHJlYXBfb2JqKHdmZDJvYmopOworICAgIHJlYXBfb2JqKGVmZDJvYmopOwogI2lmZGVmIFNFTEVDVF9VU0VTX0hFQVAKLQlQeU1lbV9ERUwocmZkMm9iaik7Ci0JUHlNZW1fREVMKHdmZDJvYmopOwotCVB5TWVtX0RFTChlZmQyb2JqKTsKKyAgICBQeU1lbV9ERUwocmZkMm9iaik7CisgICAgUHlNZW1fREVMKHdmZDJvYmopOworICAgIFB5TWVtX0RFTChlZmQyb2JqKTsKICNlbmRpZiAvKiBTRUxFQ1RfVVNFU19IRUFQICovCi0JcmV0dXJuIHJldDsKKyAgICByZXR1cm4gcmV0OwogfQogCiAjaWYgZGVmaW5lZChIQVZFX1BPTEwpICYmICFkZWZpbmVkKEhBVkVfQlJPS0VOX1BPTEwpCi0vKiAKKy8qCiAgKiBwb2xsKCkgc3VwcG9ydAogICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmRpY3Q7Ci0JaW50IHVmZF91cHRvZGF0ZTsgCi0JaW50IHVmZF9sZW47Ci0gICAgICAgIHN0cnVjdCBwb2xsZmQgKnVmZHM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpkaWN0OworICAgIGludCB1ZmRfdXB0b2RhdGU7CisgICAgaW50IHVmZF9sZW47CisgICAgc3RydWN0IHBvbGxmZCAqdWZkczsKIH0gcG9sbE9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwb2xsX1R5cGU7CiAKLS8qIFVwZGF0ZSB0aGUgbWFsbG9jJ2VkIGFycmF5IG9mIHBvbGxmZHMgdG8gbWF0Y2ggdGhlIGRpY3Rpb25hcnkgCisvKiBVcGRhdGUgdGhlIG1hbGxvYydlZCBhcnJheSBvZiBwb2xsZmRzIHRvIG1hdGNoIHRoZSBkaWN0aW9uYXJ5CiAgICBjb250YWluZWQgd2l0aGluIGEgcG9sbE9iamVjdC4gIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gYW4gZXJyb3IuCiAqLwogCiBzdGF0aWMgaW50CiB1cGRhdGVfdWZkX2FycmF5KHBvbGxPYmplY3QgKnNlbGYpCiB7Ci0JUHlfc3NpemVfdCBpLCBwb3M7Ci0JUHlPYmplY3QgKmtleSwgKnZhbHVlOwotICAgICAgICBzdHJ1Y3QgcG9sbGZkICpvbGRfdWZkcyA9IHNlbGYtPnVmZHM7CisgICAgUHlfc3NpemVfdCBpLCBwb3M7CisgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgIHN0cnVjdCBwb2xsZmQgKm9sZF91ZmRzID0gc2VsZi0+dWZkczsKIAotCXNlbGYtPnVmZF9sZW4gPSBQeURpY3RfU2l6ZShzZWxmLT5kaWN0KTsKLQlQeU1lbV9SRVNJWkUoc2VsZi0+dWZkcywgc3RydWN0IHBvbGxmZCwgc2VsZi0+dWZkX2xlbik7Ci0JaWYgKHNlbGYtPnVmZHMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNlbGYtPnVmZHMgPSBvbGRfdWZkczsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIHNlbGYtPnVmZF9sZW4gPSBQeURpY3RfU2l6ZShzZWxmLT5kaWN0KTsKKyAgICBQeU1lbV9SRVNJWkUoc2VsZi0+dWZkcywgc3RydWN0IHBvbGxmZCwgc2VsZi0+dWZkX2xlbik7CisgICAgaWYgKHNlbGYtPnVmZHMgPT0gTlVMTCkgeworICAgICAgICBzZWxmLT51ZmRzID0gb2xkX3VmZHM7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWkgPSBwb3MgPSAwOwotCXdoaWxlIChQeURpY3RfTmV4dChzZWxmLT5kaWN0LCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCXNlbGYtPnVmZHNbaV0uZmQgPSBQeUludF9Bc0xvbmcoa2V5KTsKLQkJc2VsZi0+dWZkc1tpXS5ldmVudHMgPSAoc2hvcnQpUHlJbnRfQXNMb25nKHZhbHVlKTsKLQkJaSsrOwotCX0KLQlzZWxmLT51ZmRfdXB0b2RhdGUgPSAxOwotCXJldHVybiAxOworICAgIGkgPSBwb3MgPSAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChzZWxmLT5kaWN0LCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgIHNlbGYtPnVmZHNbaV0uZmQgPSBQeUludF9Bc0xvbmcoa2V5KTsKKyAgICAgICAgc2VsZi0+dWZkc1tpXS5ldmVudHMgPSAoc2hvcnQpUHlJbnRfQXNMb25nKHZhbHVlKTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICBzZWxmLT51ZmRfdXB0b2RhdGUgPSAxOworICAgIHJldHVybiAxOwogfQogCiBQeURvY19TVFJWQVIocG9sbF9yZWdpc3Rlcl9kb2MsCkBAIC0zNjksMzkgKzM2OSwzOSBAQAogZXZlbnRzIC0tIGFuIG9wdGlvbmFsIGJpdG1hc2sgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiBldmVudHMgdG8gY2hlY2sgZm9yIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1wb2xsX3JlZ2lzdGVyKHBvbGxPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSAKK3BvbGxfcmVnaXN0ZXIocG9sbE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKm8sICprZXksICp2YWx1ZTsKLQlpbnQgZmQsIGV2ZW50cyA9IFBPTExJTiB8IFBPTExQUkkgfCBQT0xMT1VUOwotCWludCBlcnI7CisgICAgUHlPYmplY3QgKm8sICprZXksICp2YWx1ZTsKKyAgICBpbnQgZmQsIGV2ZW50cyA9IFBPTExJTiB8IFBPTExQUkkgfCBQT0xMT1VUOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpyZWdpc3RlciIsICZvLCAmZXZlbnRzKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0gIAotCWZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihvKTsKLQlpZiAoZmQgPT0gLTEpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnJlZ2lzdGVyIiwgJm8sICZldmVudHMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEFkZCBlbnRyeSB0byB0aGUgaW50ZXJuYWwgZGljdGlvbmFyeTogdGhlIGtleSBpcyB0aGUgCi0JICAgZmlsZSBkZXNjcmlwdG9yLCBhbmQgdGhlIHZhbHVlIGlzIHRoZSBldmVudCBtYXNrLiAqLwotCWtleSA9IFB5SW50X0Zyb21Mb25nKGZkKTsKLQlpZiAoa2V5ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXZhbHVlID0gUHlJbnRfRnJvbUxvbmcoZXZlbnRzKTsKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoa2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVyciA9IFB5RGljdF9TZXRJdGVtKHNlbGYtPmRpY3QsIGtleSwgdmFsdWUpOwotCVB5X0RFQ1JFRihrZXkpOwotCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihvKTsKKyAgICBpZiAoZmQgPT0gLTEpIHJldHVybiBOVUxMOwogCi0Jc2VsZi0+dWZkX3VwdG9kYXRlID0gMDsKKyAgICAvKiBBZGQgZW50cnkgdG8gdGhlIGludGVybmFsIGRpY3Rpb25hcnk6IHRoZSBrZXkgaXMgdGhlCisgICAgICAgZmlsZSBkZXNjcmlwdG9yLCBhbmQgdGhlIHZhbHVlIGlzIHRoZSBldmVudCBtYXNrLiAqLworICAgIGtleSA9IFB5SW50X0Zyb21Mb25nKGZkKTsKKyAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHZhbHVlID0gUHlJbnRfRnJvbUxvbmcoZXZlbnRzKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKHNlbGYtPmRpY3QsIGtleSwgdmFsdWUpOworICAgIFB5X0RFQ1JFRihrZXkpOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNlbGYtPnVmZF91cHRvZGF0ZSA9IDA7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihwb2xsX21vZGlmeV9kb2MsCkBAIC00MTQsNDEgKzQxNCw0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvbGxfbW9kaWZ5KHBvbGxPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpvLCAqa2V5LCAqdmFsdWU7Ci0JaW50IGZkLCBldmVudHM7Ci0JaW50IGVycjsKKyAgICBQeU9iamVjdCAqbywgKmtleSwgKnZhbHVlOworICAgIGludCBmZCwgZXZlbnRzOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pOm1vZGlmeSIsICZvLCAmZXZlbnRzKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0gIAotCWZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihvKTsKLQlpZiAoZmQgPT0gLTEpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6bW9kaWZ5IiwgJm8sICZldmVudHMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIE1vZGlmeSByZWdpc3RlcmVkIGZkICovCi0Ja2V5ID0gUHlJbnRfRnJvbUxvbmcoZmQpOwotCWlmIChrZXkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5RGljdF9HZXRJdGVtKHNlbGYtPmRpY3QsIGtleSkgPT0gTlVMTCkgewotCQllcnJubyA9IEVOT0VOVDsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdmFsdWUgPSBQeUludF9Gcm9tTG9uZyhldmVudHMpOwotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXJyID0gUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZGljdCwga2V5LCB2YWx1ZSk7Ci0JUHlfREVDUkVGKGtleSk7Ci0JUHlfREVDUkVGKHZhbHVlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKG8pOworICAgIGlmIChmZCA9PSAtMSkgcmV0dXJuIE5VTEw7CiAKLQlzZWxmLT51ZmRfdXB0b2RhdGUgPSAwOworICAgIC8qIE1vZGlmeSByZWdpc3RlcmVkIGZkICovCisgICAga2V5ID0gUHlJbnRfRnJvbUxvbmcoZmQpOworICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RGljdF9HZXRJdGVtKHNlbGYtPmRpY3QsIGtleSkgPT0gTlVMTCkgeworICAgICAgICBlcnJubyA9IEVOT0VOVDsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdmFsdWUgPSBQeUludF9Gcm9tTG9uZyhldmVudHMpOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZGljdCwga2V5LCB2YWx1ZSk7CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2VsZi0+dWZkX3VwdG9kYXRlID0gMDsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC00NTcsMzIgKzQ1NywzMiBAQAogUmVtb3ZlIGEgZmlsZSBkZXNjcmlwdG9yIGJlaW5nIHRyYWNrZWQgYnkgdGhlIHBvbGxpbmcgb2JqZWN0LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotcG9sbF91bnJlZ2lzdGVyKHBvbGxPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvKSAKK3BvbGxfdW5yZWdpc3Rlcihwb2xsT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbykKIHsKLQlQeU9iamVjdCAqa2V5OwotCWludCBmZDsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIGludCBmZDsKIAotCWZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvciggbyApOwotCWlmIChmZCA9PSAtMSkgCi0JCXJldHVybiBOVUxMOworICAgIGZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvciggbyApOworICAgIGlmIChmZCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBDaGVjayB3aGV0aGVyIHRoZSBmZCBpcyBhbHJlYWR5IGluIHRoZSBhcnJheSAqLwotCWtleSA9IFB5SW50X0Zyb21Mb25nKGZkKTsKLQlpZiAoa2V5ID09IE5VTEwpIAotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBmZCBpcyBhbHJlYWR5IGluIHRoZSBhcnJheSAqLworICAgIGtleSA9IFB5SW50X0Zyb21Mb25nKGZkKTsKKyAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5RGljdF9EZWxJdGVtKHNlbGYtPmRpY3QsIGtleSkgPT0gLTEpIHsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCS8qIFRoaXMgd2lsbCBzaW1wbHkgcmFpc2UgdGhlIEtleUVycm9yIHNldCBieSBQeURpY3RfRGVsSXRlbQotCQkgICBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzbid0IHJlZ2lzdGVyZWQuICovCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oc2VsZi0+ZGljdCwga2V5KSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgLyogVGhpcyB3aWxsIHNpbXBseSByYWlzZSB0aGUgS2V5RXJyb3Igc2V0IGJ5IFB5RGljdF9EZWxJdGVtCisgICAgICAgICAgIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXNuJ3QgcmVnaXN0ZXJlZC4gKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfREVDUkVGKGtleSk7Ci0Jc2VsZi0+dWZkX3VwdG9kYXRlID0gMDsKKyAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICBzZWxmLT51ZmRfdXB0b2RhdGUgPSAwOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHBvbGxfcG9sbF9kb2MsCkBAIC00OTEsMTYxICs0OTEsMTYxIEBACiBhbnkgZGVzY3JpcHRvcnMgdGhhdCBoYXZlIGV2ZW50cyBvciBlcnJvcnMgdG8gcmVwb3J0LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotcG9sbF9wb2xsKHBvbGxPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSAKK3BvbGxfcG9sbChwb2xsT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmVzdWx0X2xpc3QgPSBOVUxMLCAqdG91dCA9IE5VTEw7Ci0JaW50IHRpbWVvdXQgPSAwLCBwb2xsX3Jlc3VsdCwgaSwgajsKLQlQeU9iamVjdCAqdmFsdWUgPSBOVUxMLCAqbnVtID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0X2xpc3QgPSBOVUxMLCAqdG91dCA9IE5VTEw7CisgICAgaW50IHRpbWVvdXQgPSAwLCBwb2xsX3Jlc3VsdCwgaSwgajsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSBOVUxMLCAqbnVtID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvbGwiLCAwLCAxLCAmdG91dCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvbGwiLCAwLCAxLCAmdG91dCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ2hlY2sgdmFsdWVzIGZvciB0aW1lb3V0ICovCi0JaWYgKHRvdXQgPT0gTlVMTCB8fCB0b3V0ID09IFB5X05vbmUpCi0JCXRpbWVvdXQgPSAtMTsKLQllbHNlIGlmICghUHlOdW1iZXJfQ2hlY2sodG91dCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidGltZW91dCBtdXN0IGJlIGFuIGludGVnZXIgb3IgTm9uZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCXRvdXQgPSBQeU51bWJlcl9JbnQodG91dCk7Ci0JCWlmICghdG91dCkKLQkJCXJldHVybiBOVUxMOwotCQl0aW1lb3V0ID0gUHlJbnRfQXNMb25nKHRvdXQpOwotCQlQeV9ERUNSRUYodG91dCk7Ci0JCWlmICh0aW1lb3V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2hlY2sgdmFsdWVzIGZvciB0aW1lb3V0ICovCisgICAgaWYgKHRvdXQgPT0gTlVMTCB8fCB0b3V0ID09IFB5X05vbmUpCisgICAgICAgIHRpbWVvdXQgPSAtMTsKKyAgICBlbHNlIGlmICghUHlOdW1iZXJfQ2hlY2sodG91dCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IG11c3QgYmUgYW4gaW50ZWdlciBvciBOb25lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdG91dCA9IFB5TnVtYmVyX0ludCh0b3V0KTsKKyAgICAgICAgaWYgKCF0b3V0KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHRpbWVvdXQgPSBQeUludF9Bc0xvbmcodG91dCk7CisgICAgICAgIFB5X0RFQ1JFRih0b3V0KTsKKyAgICAgICAgaWYgKHRpbWVvdXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEVuc3VyZSB0aGUgdWZkIGFycmF5IGlzIHVwIHRvIGRhdGUgKi8KLQlpZiAoIXNlbGYtPnVmZF91cHRvZGF0ZSkgCi0JCWlmICh1cGRhdGVfdWZkX2FycmF5KHNlbGYpID09IDApCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBFbnN1cmUgdGhlIHVmZCBhcnJheSBpcyB1cCB0byBkYXRlICovCisgICAgaWYgKCFzZWxmLT51ZmRfdXB0b2RhdGUpCisgICAgICAgIGlmICh1cGRhdGVfdWZkX2FycmF5KHNlbGYpID09IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGNhbGwgcG9sbCgpICovCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXBvbGxfcmVzdWx0ID0gcG9sbChzZWxmLT51ZmRzLCBzZWxmLT51ZmRfbGVuLCB0aW1lb3V0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotIAotCWlmIChwb2xsX3Jlc3VsdCA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFNlbGVjdEVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSAKLSAgICAgICAKLQkvKiBidWlsZCB0aGUgcmVzdWx0IGxpc3QgKi8KLSAgCi0JcmVzdWx0X2xpc3QgPSBQeUxpc3RfTmV3KHBvbGxfcmVzdWx0KTsKLQlpZiAoIXJlc3VsdF9saXN0KSAKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZSB7Ci0JCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgcG9sbF9yZXN1bHQ7IGorKykgewotIAkJCS8qIHNraXAgdG8gdGhlIG5leHQgZmlyZWQgZGVzY3JpcHRvciAqLwotIAkJCXdoaWxlICghc2VsZi0+dWZkc1tpXS5yZXZlbnRzKSB7Ci0gCQkJCWkrKzsKLSAJCQl9Ci0JCQkvKiBpZiB3ZSBoaXQgYSBOVUxMIHJldHVybiwgc2V0IHZhbHVlIHRvIE5VTEwKLQkJCSAgIGFuZCBicmVhayBvdXQgb2YgbG9vcDsgY29kZSBhdCBlbmQgd2lsbAotCQkJICAgY2xlYW4gdXAgcmVzdWx0X2xpc3QgKi8KLQkJCXZhbHVlID0gUHlUdXBsZV9OZXcoMik7Ci0JCQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQkJbnVtID0gUHlJbnRfRnJvbUxvbmcoc2VsZi0+dWZkc1tpXS5mZCk7Ci0JCQlpZiAobnVtID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHZhbHVlLCAwLCBudW0pOworICAgIC8qIGNhbGwgcG9sbCgpICovCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHBvbGxfcmVzdWx0ID0gcG9sbChzZWxmLT51ZmRzLCBzZWxmLT51ZmRfbGVuLCB0aW1lb3V0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JCQkvKiBUaGUgJjB4ZmZmZiBpcyBhIHdvcmthcm91bmQgZm9yIEFJWC4gICdyZXZlbnRzJwotCQkJICAgaXMgYSAxNi1iaXQgc2hvcnQsIGFuZCBJQk0gYXNzaWduZWQgUE9MTE5WQUwKLQkJCSAgIHRvIGJlIDB4ODAwMCwgc28gdGhlIGNvbnZlcnNpb24gdG8gaW50IHJlc3VsdHMKLQkJCSAgIGluIGEgbmVnYXRpdmUgbnVtYmVyLiBTZWUgU0YgYnVnICM5MjMzMTUuICovCi0JCQludW0gPSBQeUludF9Gcm9tTG9uZyhzZWxmLT51ZmRzW2ldLnJldmVudHMgJiAweGZmZmYpOwotCQkJaWYgKG51bSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJUHlUdXBsZV9TRVRfSVRFTSh2YWx1ZSwgMSwgbnVtKTsKLSAJCQlpZiAoKFB5TGlzdF9TZXRJdGVtKHJlc3VsdF9saXN0LCBqLCB2YWx1ZSkpID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCQlnb3RvIGVycm9yOwotIAkJCX0KLSAJCQlpKys7Ci0gCQl9Ci0gCX0KLSAJcmV0dXJuIHJlc3VsdF9saXN0OworICAgIGlmIChwb2xsX3Jlc3VsdCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFNlbGVjdEVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogYnVpbGQgdGhlIHJlc3VsdCBsaXN0ICovCisKKyAgICByZXN1bHRfbGlzdCA9IFB5TGlzdF9OZXcocG9sbF9yZXN1bHQpOworICAgIGlmICghcmVzdWx0X2xpc3QpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaiA8IHBvbGxfcmVzdWx0OyBqKyspIHsKKyAgICAgICAgICAgIC8qIHNraXAgdG8gdGhlIG5leHQgZmlyZWQgZGVzY3JpcHRvciAqLworICAgICAgICAgICAgd2hpbGUgKCFzZWxmLT51ZmRzW2ldLnJldmVudHMpIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBpZiB3ZSBoaXQgYSBOVUxMIHJldHVybiwgc2V0IHZhbHVlIHRvIE5VTEwKKyAgICAgICAgICAgICAgIGFuZCBicmVhayBvdXQgb2YgbG9vcDsgY29kZSBhdCBlbmQgd2lsbAorICAgICAgICAgICAgICAgY2xlYW4gdXAgcmVzdWx0X2xpc3QgKi8KKyAgICAgICAgICAgIHZhbHVlID0gUHlUdXBsZV9OZXcoMik7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgbnVtID0gUHlJbnRfRnJvbUxvbmcoc2VsZi0+dWZkc1tpXS5mZCk7CisgICAgICAgICAgICBpZiAobnVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHZhbHVlLCAwLCBudW0pOworCisgICAgICAgICAgICAvKiBUaGUgJjB4ZmZmZiBpcyBhIHdvcmthcm91bmQgZm9yIEFJWC4gICdyZXZlbnRzJworICAgICAgICAgICAgICAgaXMgYSAxNi1iaXQgc2hvcnQsIGFuZCBJQk0gYXNzaWduZWQgUE9MTE5WQUwKKyAgICAgICAgICAgICAgIHRvIGJlIDB4ODAwMCwgc28gdGhlIGNvbnZlcnNpb24gdG8gaW50IHJlc3VsdHMKKyAgICAgICAgICAgICAgIGluIGEgbmVnYXRpdmUgbnVtYmVyLiBTZWUgU0YgYnVnICM5MjMzMTUuICovCisgICAgICAgICAgICBudW0gPSBQeUludF9Gcm9tTG9uZyhzZWxmLT51ZmRzW2ldLnJldmVudHMgJiAweGZmZmYpOworICAgICAgICAgICAgaWYgKG51bSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2YWx1ZSwgMSwgbnVtKTsKKyAgICAgICAgICAgIGlmICgoUHlMaXN0X1NldEl0ZW0ocmVzdWx0X2xpc3QsIGosIHZhbHVlKSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdF9saXN0OwogCiAgIGVycm9yOgotCVB5X0RFQ1JFRihyZXN1bHRfbGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJlc3VsdF9saXN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHBvbGxfbWV0aG9kc1tdID0gewotCXsicmVnaXN0ZXIiLAkoUHlDRnVuY3Rpb24pcG9sbF9yZWdpc3RlciwJCi0JIE1FVEhfVkFSQVJHUywgIHBvbGxfcmVnaXN0ZXJfZG9jfSwKLQl7Im1vZGlmeSIsCShQeUNGdW5jdGlvbilwb2xsX21vZGlmeSwKLQkgTUVUSF9WQVJBUkdTLCAgcG9sbF9tb2RpZnlfZG9jfSwKLQl7InVucmVnaXN0ZXIiLAkoUHlDRnVuY3Rpb24pcG9sbF91bnJlZ2lzdGVyLAotCSBNRVRIX08sICAgICAgICBwb2xsX3VucmVnaXN0ZXJfZG9jfSwKLQl7InBvbGwiLAkoUHlDRnVuY3Rpb24pcG9sbF9wb2xsLAkKLQkgTUVUSF9WQVJBUkdTLCAgcG9sbF9wb2xsX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InJlZ2lzdGVyIiwgICAgICAgIChQeUNGdW5jdGlvbilwb2xsX3JlZ2lzdGVyLAorICAgICBNRVRIX1ZBUkFSR1MsICBwb2xsX3JlZ2lzdGVyX2RvY30sCisgICAgeyJtb2RpZnkiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pcG9sbF9tb2RpZnksCisgICAgIE1FVEhfVkFSQVJHUywgIHBvbGxfbW9kaWZ5X2RvY30sCisgICAgeyJ1bnJlZ2lzdGVyIiwgICAgICAoUHlDRnVuY3Rpb24pcG9sbF91bnJlZ2lzdGVyLAorICAgICBNRVRIX08sICAgICAgICBwb2xsX3VucmVnaXN0ZXJfZG9jfSwKKyAgICB7InBvbGwiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilwb2xsX3BvbGwsCisgICAgIE1FVEhfVkFSQVJHUywgIHBvbGxfcG9sbF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgcG9sbE9iamVjdCAqCiBuZXdQb2xsT2JqZWN0KHZvaWQpCiB7Ci0gICAgICAgIHBvbGxPYmplY3QgKnNlbGY7Ci0Jc2VsZiA9IFB5T2JqZWN0X05ldyhwb2xsT2JqZWN0LCAmcG9sbF9UeXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkvKiB1ZmRfdXB0b2RhdGUgaXMgYSBCb29sZWFuLCBkZW5vdGluZyB3aGV0aGVyIHRoZSAKLQkgICBhcnJheSBwb2ludGVkIHRvIGJ5IHVmZHMgbWF0Y2hlcyB0aGUgY29udGVudHMgb2YgdGhlIGRpY3Rpb25hcnkuICovCi0Jc2VsZi0+dWZkX3VwdG9kYXRlID0gMDsKLQlzZWxmLT51ZmRzID0gTlVMTDsKLQlzZWxmLT5kaWN0ID0gUHlEaWN0X05ldygpOwotCWlmIChzZWxmLT5kaWN0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHNlbGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgcG9sbE9iamVjdCAqc2VsZjsKKyAgICBzZWxmID0gUHlPYmplY3RfTmV3KHBvbGxPYmplY3QsICZwb2xsX1R5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIHVmZF91cHRvZGF0ZSBpcyBhIEJvb2xlYW4sIGRlbm90aW5nIHdoZXRoZXIgdGhlCisgICAgICAgYXJyYXkgcG9pbnRlZCB0byBieSB1ZmRzIG1hdGNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaWN0aW9uYXJ5LiAqLworICAgIHNlbGYtPnVmZF91cHRvZGF0ZSA9IDA7CisgICAgc2VsZi0+dWZkcyA9IE5VTEw7CisgICAgc2VsZi0+ZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoc2VsZi0+ZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiBzdGF0aWMgdm9pZAogcG9sbF9kZWFsbG9jKHBvbGxPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPnVmZHMgIT0gTlVMTCkKLQkJUHlNZW1fREVMKHNlbGYtPnVmZHMpOwotCVB5X1hERUNSRUYoc2VsZi0+ZGljdCk7Ci0gIAlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgaWYgKHNlbGYtPnVmZHMgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fREVMKHNlbGYtPnVmZHMpOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZGljdCk7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcG9sbF9nZXRhdHRyKHBvbGxPYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QocG9sbF9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChwb2xsX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHBvbGxfVHlwZSA9IHsKLQkvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgotCSAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCi0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInNlbGVjdC5wb2xsIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKHBvbGxPYmplY3QpLAkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpcG9sbF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKXBvbGxfZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLworICAgIC8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCisgICAgICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAic2VsZWN0LnBvbGwiLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YocG9sbE9iamVjdCksICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpcG9sbF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpcG9sbF9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCiB9OwogCiBQeURvY19TVFJWQVIocG9sbF9kb2MsCkBAIC02NTUsMzYgKzY1NSwzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbGVjdF9wb2xsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCXJldHVybiAoUHlPYmplY3QgKiluZXdQb2xsT2JqZWN0KCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld1BvbGxPYmplY3QoKTsKIH0KIAogI2lmZGVmIF9fQVBQTEVfXwotLyogCisvKgogICogT24gc29tZSBzeXN0ZW1zIHBvbGwoKSBzZXRzIGVycm5vIG9uIGludmFsaWQgZmlsZSBkZXNjcmlwdG9ycy4gV2UgdGVzdAogICogZm9yIHRoaXMgYXQgcnVudGltZSBiZWNhdXNlIHRoaXMgYnVnIG1heSBiZSBmaXhlZCBvciBpbnRyb2R1Y2VkIGJldHdlZW4KICAqIE9TIHJlbGVhc2VzLgogICovCiBzdGF0aWMgaW50IHNlbGVjdF9oYXZlX2Jyb2tlbl9wb2xsKHZvaWQpCiB7Ci0JaW50IHBvbGxfdGVzdDsKLQlpbnQgZmlsZWRlc1syXTsKKyAgICBpbnQgcG9sbF90ZXN0OworICAgIGludCBmaWxlZGVzWzJdOwogCi0Jc3RydWN0IHBvbGxmZCBwb2xsX3N0cnVjdCA9IHsgMCwgUE9MTElOfFBPTExQUkl8UE9MTE9VVCwgMCB9OworICAgIHN0cnVjdCBwb2xsZmQgcG9sbF9zdHJ1Y3QgPSB7IDAsIFBPTExJTnxQT0xMUFJJfFBPTExPVVQsIDAgfTsKIAotCS8qIENyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciB0byBtYWtlIGludmFsaWQgKi8KLQlpZiAocGlwZShmaWxlZGVzKSA8IDApIHsKLQkJcmV0dXJuIDE7Ci0JfQotCXBvbGxfc3RydWN0LmZkID0gZmlsZWRlc1swXTsKLQljbG9zZShmaWxlZGVzWzBdKTsKLQljbG9zZShmaWxlZGVzWzFdKTsKLQlwb2xsX3Rlc3QgPSBwb2xsKCZwb2xsX3N0cnVjdCwgMSwgMCk7Ci0JaWYgKHBvbGxfdGVzdCA8IDApIHsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIGlmIChwb2xsX3Rlc3QgPT0gMCAmJiBwb2xsX3N0cnVjdC5yZXZlbnRzICE9IFBPTExOVkFMKSB7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICAvKiBDcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3IgdG8gbWFrZSBpbnZhbGlkICovCisgICAgaWYgKHBpcGUoZmlsZWRlcykgPCAwKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBwb2xsX3N0cnVjdC5mZCA9IGZpbGVkZXNbMF07CisgICAgY2xvc2UoZmlsZWRlc1swXSk7CisgICAgY2xvc2UoZmlsZWRlc1sxXSk7CisgICAgcG9sbF90ZXN0ID0gcG9sbCgmcG9sbF9zdHJ1Y3QsIDEsIDApOworICAgIGlmIChwb2xsX3Rlc3QgPCAwKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAocG9sbF90ZXN0ID09IDAgJiYgcG9sbF9zdHJ1Y3QucmV2ZW50cyAhPSBQT0xMTlZBTCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogX19BUFBMRV9fICovCiAKQEAgLTcwMyw4ICs3MDMsOCBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JU09DS0VUIGVwZmQ7CQkJLyogZXBvbGwgY29udHJvbCBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgU09DS0VUIGVwZmQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZXBvbGwgY29udHJvbCBmaWxlIGRlc2NyaXB0b3IgKi8KIH0gcHlFcG9sbF9PYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcHlFcG9sbF9UeXBlOwpAQCAtNzEzLDkyICs3MTMsOTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBweWVwb2xsX2Vycl9jbG9zZWQodm9pZCkKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGVwb2xsIGZkIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBlcG9sbCBmZCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBweWVwb2xsX2ludGVybmFsX2Nsb3NlKHB5RXBvbGxfT2JqZWN0ICpzZWxmKQogewotCWludCBzYXZlX2Vycm5vID0gMDsKLQlpZiAoc2VsZi0+ZXBmZCA+PSAwKSB7Ci0JCWludCBlcGZkID0gc2VsZi0+ZXBmZDsKLQkJc2VsZi0+ZXBmZCA9IC0xOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWlmIChjbG9zZShlcGZkKSA8IDApCi0JCQlzYXZlX2Vycm5vID0gZXJybm87Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCXJldHVybiBzYXZlX2Vycm5vOworICAgIGludCBzYXZlX2Vycm5vID0gMDsKKyAgICBpZiAoc2VsZi0+ZXBmZCA+PSAwKSB7CisgICAgICAgIGludCBlcGZkID0gc2VsZi0+ZXBmZDsKKyAgICAgICAgc2VsZi0+ZXBmZCA9IC0xOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGlmIChjbG9zZShlcGZkKSA8IDApCisgICAgICAgICAgICBzYXZlX2Vycm5vID0gZXJybm87CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIHJldHVybiBzYXZlX2Vycm5vOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3UHlFcG9sbF9PYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBpbnQgc2l6ZWhpbnQsIFNPQ0tFVCBmZCkKIHsKLQlweUVwb2xsX09iamVjdCAqc2VsZjsKLQkKLQlpZiAoc2l6ZWhpbnQgPT0gLTEpIHsKLQkJc2l6ZWhpbnQgPSBGRF9TRVRTSVpFLTE7Ci0JfQotCWVsc2UgaWYgKHNpemVoaW50IDwgMSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgInNpemVoaW50IG11c3QgYmUgZ3JlYXRlciB6ZXJvLCBnb3QgJWQiLAotCQkJICAgICBzaXplaGludCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBweUVwb2xsX09iamVjdCAqc2VsZjsKIAotCWFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7Ci0Jc2VsZiA9IChweUVwb2xsX09iamVjdCAqKSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoc2l6ZWhpbnQgPT0gLTEpIHsKKyAgICAgICAgc2l6ZWhpbnQgPSBGRF9TRVRTSVpFLTE7CisgICAgfQorICAgIGVsc2UgaWYgKHNpemVoaW50IDwgMSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJzaXplaGludCBtdXN0IGJlIGdyZWF0ZXIgemVybywgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVoaW50KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGZkID09IC0xKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJc2VsZi0+ZXBmZCA9IGVwb2xsX2NyZWF0ZShzaXplaGludCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCWVsc2UgewotCQlzZWxmLT5lcGZkID0gZmQ7Ci0JfQotCWlmIChzZWxmLT5lcGZkIDwgMCkgewotCQlQeV9ERUNSRUYoc2VsZik7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIGFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7CisgICAgc2VsZiA9IChweUVwb2xsX09iamVjdCAqKSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChmZCA9PSAtMSkgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHNlbGYtPmVwZmQgPSBlcG9sbF9jcmVhdGUoc2l6ZWhpbnQpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2VsZi0+ZXBmZCA9IGZkOworICAgIH0KKyAgICBpZiAoc2VsZi0+ZXBmZCA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogcHllcG9sbF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaW50IHNpemVoaW50ID0gLTE7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzaXplaGludCIsIE5VTEx9OworICAgIGludCBzaXplaGludCA9IC0xOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2l6ZWhpbnQiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aTplcG9sbCIsIGt3bGlzdCwKLQkJCQkJICZzaXplaGludCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aTplcG9sbCIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZWhpbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBuZXdQeUVwb2xsX09iamVjdCh0eXBlLCBzaXplaGludCwgLTEpOworICAgIHJldHVybiBuZXdQeUVwb2xsX09iamVjdCh0eXBlLCBzaXplaGludCwgLTEpOwogfQogCiAKIHN0YXRpYyB2b2lkCiBweWVwb2xsX2RlYWxsb2MocHlFcG9sbF9PYmplY3QgKnNlbGYpCiB7Ci0JKHZvaWQpcHllcG9sbF9pbnRlcm5hbF9jbG9zZShzZWxmKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOworICAgICh2b2lkKXB5ZXBvbGxfaW50ZXJuYWxfY2xvc2Uoc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHllcG9sbF9jbG9zZShweUVwb2xsX09iamVjdCAqc2VsZikKIHsKLQllcnJubyA9IHB5ZXBvbGxfaW50ZXJuYWxfY2xvc2Uoc2VsZik7Ci0JaWYgKGVycm5vIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBlcnJubyA9IHB5ZXBvbGxfaW50ZXJuYWxfY2xvc2Uoc2VsZik7CisgICAgaWYgKGVycm5vIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHB5ZXBvbGxfY2xvc2VfZG9jLApAQCAtODEwLDE4ICs4MTAsMTggQEAKIHN0YXRpYyBQeU9iamVjdCoKIHB5ZXBvbGxfZ2V0X2Nsb3NlZChweUVwb2xsX09iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+ZXBmZCA8IDApCi0JCVB5X1JFVFVSTl9UUlVFOwotCWVsc2UKLQkJUHlfUkVUVVJOX0ZBTFNFOworICAgIGlmIChzZWxmLT5lcGZkIDwgMCkKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgZWxzZQorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB5ZXBvbGxfZmlsZW5vKHB5RXBvbGxfT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5lcGZkIDwgMCkKLQkJcmV0dXJuIHB5ZXBvbGxfZXJyX2Nsb3NlZCgpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5lcGZkKTsKKyAgICBpZiAoc2VsZi0+ZXBmZCA8IDApCisgICAgICAgIHJldHVybiBweWVwb2xsX2Vycl9jbG9zZWQoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+ZXBmZCk7CiB9CiAKIFB5RG9jX1NUUlZBUihweWVwb2xsX2ZpbGVub19kb2MsCkBAIC04MzIsMTIgKzgzMiwxMiBAQAogc3RhdGljIFB5T2JqZWN0KgogcHllcG9sbF9mcm9tZmQoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JU09DS0VUIGZkOworICAgIFNPQ0tFVCBmZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpmcm9tZmQiLCAmZmQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6ZnJvbWZkIiwgJmZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gbmV3UHlFcG9sbF9PYmplY3QoKFB5VHlwZU9iamVjdCopY2xzLCAtMSwgZmQpOworICAgIHJldHVybiBuZXdQeUVwb2xsX09iamVjdCgoUHlUeXBlT2JqZWN0KiljbHMsIC0xLCBmZCk7CiB9CiAKIFB5RG9jX1NUUlZBUihweWVwb2xsX2Zyb21mZF9kb2MsCkBAIC04NDgsNjUgKzg0OCw2NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKGludCBlcGZkLCBpbnQgb3AsIFB5T2JqZWN0ICpwZmQsIHVuc2lnbmVkIGludCBldmVudHMpCiB7Ci0Jc3RydWN0IGVwb2xsX2V2ZW50IGV2OwotCWludCByZXN1bHQ7Ci0JaW50IGZkOworICAgIHN0cnVjdCBlcG9sbF9ldmVudCBldjsKKyAgICBpbnQgcmVzdWx0OworICAgIGludCBmZDsKIAotCWlmIChlcGZkIDwgMCkKLQkJcmV0dXJuIHB5ZXBvbGxfZXJyX2Nsb3NlZCgpOworICAgIGlmIChlcGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIHB5ZXBvbGxfZXJyX2Nsb3NlZCgpOwogCi0JZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKHBmZCk7Ci0JaWYgKGZkID09IC0xKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBmZCA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IocGZkKTsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3dpdGNoKG9wKSB7Ci0JICAgIGNhc2UgRVBPTExfQ1RMX0FERDoKLQkgICAgY2FzZSBFUE9MTF9DVExfTU9EOgotCQlldi5ldmVudHMgPSBldmVudHM7Ci0JCWV2LmRhdGEuZmQgPSBmZDsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXN1bHQgPSBlcG9sbF9jdGwoZXBmZCwgb3AsIGZkLCAmZXYpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlicmVhazsKLQkgICAgY2FzZSBFUE9MTF9DVExfREVMOgotCQkvKiBJbiBrZXJuZWwgdmVyc2lvbnMgYmVmb3JlIDIuNi45LCB0aGUgRVBPTExfQ1RMX0RFTAotCQkgKiBvcGVyYXRpb24gcmVxdWlyZWQgYSBub24tTlVMTCBwb2ludGVyIGluIGV2ZW50LCBldmVuCi0JCSAqIHRob3VnaCB0aGlzIGFyZ3VtZW50IGlzIGlnbm9yZWQuICovCi0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJcmVzdWx0ID0gZXBvbGxfY3RsKGVwZmQsIG9wLCBmZCwgJmV2KTsKLQkJaWYgKGVycm5vID09IEVCQURGKSB7Ci0JCQkvKiBmZCBhbHJlYWR5IGNsb3NlZCAqLwotCQkJcmVzdWx0ID0gMDsKLQkJCWVycm5vID0gMDsKLQkJfQotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJcmVzdWx0ID0gLTE7Ci0JCWVycm5vID0gRUlOVkFMOwotCX0KKyAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgY2FzZSBFUE9MTF9DVExfQUREOgorICAgICAgICBjYXNlIEVQT0xMX0NUTF9NT0Q6CisgICAgICAgIGV2LmV2ZW50cyA9IGV2ZW50czsKKyAgICAgICAgZXYuZGF0YS5mZCA9IGZkOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJlc3VsdCA9IGVwb2xsX2N0bChlcGZkLCBvcCwgZmQsICZldik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVQT0xMX0NUTF9ERUw6CisgICAgICAgIC8qIEluIGtlcm5lbCB2ZXJzaW9ucyBiZWZvcmUgMi42LjksIHRoZSBFUE9MTF9DVExfREVMCisgICAgICAgICAqIG9wZXJhdGlvbiByZXF1aXJlZCBhIG5vbi1OVUxMIHBvaW50ZXIgaW4gZXZlbnQsIGV2ZW4KKyAgICAgICAgICogdGhvdWdoIHRoaXMgYXJndW1lbnQgaXMgaWdub3JlZC4gKi8KKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByZXN1bHQgPSBlcG9sbF9jdGwoZXBmZCwgb3AsIGZkLCAmZXYpOworICAgICAgICBpZiAoZXJybm8gPT0gRUJBREYpIHsKKyAgICAgICAgICAgIC8qIGZkIGFscmVhZHkgY2xvc2VkICovCisgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICB9CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgfQogCi0JaWYgKHJlc3VsdCA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBweWVwb2xsX3JlZ2lzdGVyKHB5RXBvbGxfT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnBmZDsKLQl1bnNpZ25lZCBpbnQgZXZlbnRzID0gRVBPTExJTiB8IEVQT0xMT1VUIHwgRVBPTExQUkk7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmZCIsICJldmVudG1hc2siLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqcGZkOworICAgIHVuc2lnbmVkIGludCBldmVudHMgPSBFUE9MTElOIHwgRVBPTExPVVQgfCBFUE9MTFBSSTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZkIiwgImV2ZW50bWFzayIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98STpyZWdpc3RlciIsIGt3bGlzdCwKLQkJCQkJICZwZmQsICZldmVudHMpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xJOnJlZ2lzdGVyIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZmQsICZldmVudHMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBweWVwb2xsX2ludGVybmFsX2N0bChzZWxmLT5lcGZkLCBFUE9MTF9DVExfQURELCBwZmQsIGV2ZW50cyk7CisgICAgcmV0dXJuIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9BREQsIHBmZCwgZXZlbnRzKTsKIH0KIAogUHlEb2NfU1RSVkFSKHB5ZXBvbGxfcmVnaXN0ZXJfZG9jLApAQCAtOTIzLDE2ICs5MjMsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBweWVwb2xsX21vZGlmeShweUVwb2xsX09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpwZmQ7Ci0JdW5zaWduZWQgaW50IGV2ZW50czsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZkIiwgImV2ZW50bWFzayIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpwZmQ7CisgICAgdW5zaWduZWQgaW50IGV2ZW50czsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZkIiwgImV2ZW50bWFzayIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9JOm1vZGlmeSIsIGt3bGlzdCwKLQkJCQkJICZwZmQsICZldmVudHMpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT0k6bW9kaWZ5Iiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZmQsICZldmVudHMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBweWVwb2xsX2ludGVybmFsX2N0bChzZWxmLT5lcGZkLCBFUE9MTF9DVExfTU9ELCBwZmQsIGV2ZW50cyk7CisgICAgcmV0dXJuIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9NT0QsIHBmZCwgZXZlbnRzKTsKIH0KIAogUHlEb2NfU1RSVkFSKHB5ZXBvbGxfbW9kaWZ5X2RvYywKQEAgLTk0NCwxNSArOTQ0LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHllcG9sbF91bnJlZ2lzdGVyKHB5RXBvbGxfT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnBmZDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZkIiwgTlVMTH07CisgICAgUHlPYmplY3QgKnBmZDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZkIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiTzp1bnJlZ2lzdGVyIiwga3dsaXN0LAotCQkJCQkgJnBmZCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPOnVucmVnaXN0ZXIiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBmZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9ERUwsIHBmZCwgMCk7CisgICAgcmV0dXJuIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9ERUwsIHBmZCwgMCk7CiB9CiAKIFB5RG9jX1NUUlZBUihweWVwb2xsX3VucmVnaXN0ZXJfZG9jLApAQCAtOTYzLDc2ICs5NjMsNzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBweWVwb2xsX3BvbGwocHlFcG9sbF9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlkb3VibGUgZHRpbWVvdXQgPSAtMS47Ci0JaW50IHRpbWVvdXQ7Ci0JaW50IG1heGV2ZW50cyA9IC0xOwotCWludCBuZmRzLCBpOwotCVB5T2JqZWN0ICplbGlzdCA9IE5VTEwsICpldHVwbGUgPSBOVUxMOwotCXN0cnVjdCBlcG9sbF9ldmVudCAqZXZzID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InRpbWVvdXQiLCAibWF4ZXZlbnRzIiwgTlVMTH07CisgICAgZG91YmxlIGR0aW1lb3V0ID0gLTEuOworICAgIGludCB0aW1lb3V0OworICAgIGludCBtYXhldmVudHMgPSAtMTsKKyAgICBpbnQgbmZkcywgaTsKKyAgICBQeU9iamVjdCAqZWxpc3QgPSBOVUxMLCAqZXR1cGxlID0gTlVMTDsKKyAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgKmV2cyA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJ0aW1lb3V0IiwgIm1heGV2ZW50cyIsIE5VTEx9OwogCi0JaWYgKHNlbGYtPmVwZmQgPCAwKQotCQlyZXR1cm4gcHllcG9sbF9lcnJfY2xvc2VkKCk7CisgICAgaWYgKHNlbGYtPmVwZmQgPCAwKQorICAgICAgICByZXR1cm4gcHllcG9sbF9lcnJfY2xvc2VkKCk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGRpOnBvbGwiLCBrd2xpc3QsCi0JCQkJCSAmZHRpbWVvdXQsICZtYXhldmVudHMpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGRpOnBvbGwiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR0aW1lb3V0LCAmbWF4ZXZlbnRzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZHRpbWVvdXQgPCAwKSB7Ci0JCXRpbWVvdXQgPSAtMTsKLQl9Ci0JZWxzZSBpZiAoZHRpbWVvdXQgKiAxMDAwLjAgPiBJTlRfTUFYKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJ0aW1lb3V0IGlzIHRvbyBsYXJnZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCXRpbWVvdXQgPSAoaW50KShkdGltZW91dCAqIDEwMDAuMCk7Ci0JfQorICAgIGlmIChkdGltZW91dCA8IDApIHsKKyAgICAgICAgdGltZW91dCA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmIChkdGltZW91dCAqIDEwMDAuMCA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCBpcyB0b28gbGFyZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0aW1lb3V0ID0gKGludCkoZHRpbWVvdXQgKiAxMDAwLjApOworICAgIH0KIAotCWlmIChtYXhldmVudHMgPT0gLTEpIHsKLQkJbWF4ZXZlbnRzID0gRkRfU0VUU0laRS0xOwotCX0KLQllbHNlIGlmIChtYXhldmVudHMgPCAxKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAibWF4ZXZlbnRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAsIGdvdCAlZCIsCi0JCQkgICAgIG1heGV2ZW50cyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAobWF4ZXZlbnRzID09IC0xKSB7CisgICAgICAgIG1heGV2ZW50cyA9IEZEX1NFVFNJWkUtMTsKKyAgICB9CisgICAgZWxzZSBpZiAobWF4ZXZlbnRzIDwgMSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJtYXhldmVudHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCwgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIG1heGV2ZW50cyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWV2cyA9IFB5TWVtX05ldyhzdHJ1Y3QgZXBvbGxfZXZlbnQsIG1heGV2ZW50cyk7Ci0JaWYgKGV2cyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihzZWxmKTsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGV2cyA9IFB5TWVtX05ldyhzdHJ1Y3QgZXBvbGxfZXZlbnQsIG1heGV2ZW50cyk7CisgICAgaWYgKGV2cyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCW5mZHMgPSBlcG9sbF93YWl0KHNlbGYtPmVwZmQsIGV2cywgbWF4ZXZlbnRzLCB0aW1lb3V0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChuZmRzIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBuZmRzID0gZXBvbGxfd2FpdChzZWxmLT5lcGZkLCBldnMsIG1heGV2ZW50cywgdGltZW91dCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAobmZkcyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWVsaXN0ID0gUHlMaXN0X05ldyhuZmRzKTsKLQlpZiAoZWxpc3QgPT0gTlVMTCkgewotCQlnb3RvIGVycm9yOwotCX0KKyAgICBlbGlzdCA9IFB5TGlzdF9OZXcobmZkcyk7CisgICAgaWYgKGVsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7Ci0JCWV0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlJIiwgZXZzW2ldLmRhdGEuZmQsIGV2c1tpXS5ldmVudHMpOwotCQlpZiAoZXR1cGxlID09IE5VTEwpIHsKLQkJCVB5X0NMRUFSKGVsaXN0KTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJUHlMaXN0X1NFVF9JVEVNKGVsaXN0LCBpLCBldHVwbGUpOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7CisgICAgICAgIGV0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlJIiwgZXZzW2ldLmRhdGEuZmQsIGV2c1tpXS5ldmVudHMpOworICAgICAgICBpZiAoZXR1cGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0NMRUFSKGVsaXN0KTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGVsaXN0LCBpLCBldHVwbGUpOworICAgIH0KIAogICAgIGVycm9yOgotCVB5TWVtX0ZyZWUoZXZzKTsKLQlyZXR1cm4gZWxpc3Q7CisgICAgUHlNZW1fRnJlZShldnMpOworICAgIHJldHVybiBlbGlzdDsKIH0KIAogUHlEb2NfU1RSVkFSKHB5ZXBvbGxfcG9sbF9kb2MsCkBAIC0xMDQzLDI3ICsxMDQzLDI3IEBACiBVcCB0byBtYXhldmVudHMgYXJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBweWVwb2xsX21ldGhvZHNbXSA9IHsKLQl7ImZyb21mZCIsCShQeUNGdW5jdGlvbilweWVwb2xsX2Zyb21mZCwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9DTEFTUywgcHllcG9sbF9mcm9tZmRfZG9jfSwKLQl7ImNsb3NlIiwJKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfY2xvc2UsCU1FVEhfTk9BUkdTLAotCSBweWVwb2xsX2Nsb3NlX2RvY30sCi0JeyJmaWxlbm8iLAkoUHlDRnVuY3Rpb24pcHllcG9sbF9maWxlbm8sCU1FVEhfTk9BUkdTLAotCSBweWVwb2xsX2ZpbGVub19kb2N9LAotCXsibW9kaWZ5IiwJKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfbW9kaWZ5LAotCSBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAlweWVwb2xsX21vZGlmeV9kb2N9LAotCXsicmVnaXN0ZXIiLAkoUHlDRnVuY3Rpb24pcHllcG9sbF9yZWdpc3RlciwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywJcHllcG9sbF9yZWdpc3Rlcl9kb2N9LAotCXsidW5yZWdpc3RlciIsCShQeUNGdW5jdGlvbilweWVwb2xsX3VucmVnaXN0ZXIsCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCXB5ZXBvbGxfdW5yZWdpc3Rlcl9kb2N9LAotCXsicG9sbCIsCShQeUNGdW5jdGlvbilweWVwb2xsX3BvbGwsCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCXB5ZXBvbGxfcG9sbF9kb2N9LAotCXtOVUxMLAlOVUxMfSwKKyAgICB7ImZyb21mZCIsICAgICAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX2Zyb21mZCwKKyAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9DTEFTUywgcHllcG9sbF9mcm9tZmRfZG9jfSwKKyAgICB7ImNsb3NlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX2Nsb3NlLCAgICAgTUVUSF9OT0FSR1MsCisgICAgIHB5ZXBvbGxfY2xvc2VfZG9jfSwKKyAgICB7ImZpbGVubyIsICAgICAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX2ZpbGVubywgICAgTUVUSF9OT0FSR1MsCisgICAgIHB5ZXBvbGxfZmlsZW5vX2RvY30sCisgICAgeyJtb2RpZnkiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pcHllcG9sbF9tb2RpZnksCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsICAgICAgcHllcG9sbF9tb2RpZnlfZG9jfSwKKyAgICB7InJlZ2lzdGVyIiwgICAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX3JlZ2lzdGVyLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCAgICAgIHB5ZXBvbGxfcmVnaXN0ZXJfZG9jfSwKKyAgICB7InVucmVnaXN0ZXIiLCAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX3VucmVnaXN0ZXIsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsICAgICAgcHllcG9sbF91bnJlZ2lzdGVyX2RvY30sCisgICAgeyJwb2xsIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pcHllcG9sbF9wb2xsLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCAgICAgIHB5ZXBvbGxfcG9sbF9kb2N9LAorICAgIHtOVUxMLCAgICAgIE5VTEx9LAogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIHB5ZXBvbGxfZ2V0c2V0bGlzdFtdID0gewotCXsiY2xvc2VkIiwgKGdldHRlcilweWVwb2xsX2dldF9jbG9zZWQsIE5VTEwsCi0JICJUcnVlIGlmIHRoZSBlcG9sbCBoYW5kbGVyIGlzIGNsb3NlZCJ9LAotCXswfSwKKyAgICB7ImNsb3NlZCIsIChnZXR0ZXIpcHllcG9sbF9nZXRfY2xvc2VkLCBOVUxMLAorICAgICAiVHJ1ZSBpZiB0aGUgZXBvbGwgaGFuZGxlciBpcyBjbG9zZWQifSwKKyAgICB7MH0sCiB9OwogCiBQeURvY19TVFJWQVIocHllcG9sbF9kb2MsCkBAIC0xMDc2LDQ1ICsxMDc2LDQ1IEBACiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbW9uaXRvcmVkIGV2ZW50cy4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBweUVwb2xsX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInNlbGVjdC5lcG9sbCIsCQkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHB5RXBvbGxfT2JqZWN0KSwJCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKXB5ZXBvbGxfZGVhbGxvYywJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkJCS8qIHRwX2ZsYWdzICovCi0JcHllcG9sbF9kb2MsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXB5ZXBvbGxfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkJLyogdHBfbWVtYmVycyAqLwotCXB5ZXBvbGxfZ2V0c2V0bGlzdCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkJLyogdHBfYWxsb2MgKi8KLQlweWVwb2xsX25ldywJCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJzZWxlY3QuZXBvbGwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHB5RXBvbGxfT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIChkZXN0cnVjdG9yKXB5ZXBvbGxfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBweWVwb2xsX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBweWVwb2xsX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgcHllcG9sbF9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBweWVwb2xsX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKICNlbmRpZiAvKiBIQVZFX0VQT0xMICovCkBAIC0xMTY5LDggKzExNjksOCBAQAogdWRhdGEtPm9iamVjdCBtYXBwaW5nLiIpOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCXN0cnVjdCBrZXZlbnQgZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgc3RydWN0IGtldmVudCBlOwogfSBrcXVldWVfZXZlbnRfT2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGtxdWV1ZV9ldmVudF9UeXBlOwpAQCAtMTE3OCw4ICsxMTc4LDggQEAKICNkZWZpbmUga3F1ZXVlX2V2ZW50X0NoZWNrKG9wKSAoUHlPYmplY3RfVHlwZUNoZWNrKChvcCksICZrcXVldWVfZXZlbnRfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JU09DS0VUIGtxZmQ7CQkvKiBrcXVldWUgY29udHJvbCBmZCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBTT0NLRVQga3FmZDsgICAgICAgICAgICAgICAgLyoga3F1ZXVlIGNvbnRyb2wgZmQgKi8KIH0ga3F1ZXVlX3F1ZXVlX09iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBrcXVldWVfcXVldWVfVHlwZTsKQEAgLTEyMTcsMTMgKzEyMTcsMTMgQEAKIAogI2RlZmluZSBLUV9PRkYoeCkgb2Zmc2V0b2Yoa3F1ZXVlX2V2ZW50X09iamVjdCwgeCkKIHN0YXRpYyBzdHJ1Y3QgUHlNZW1iZXJEZWYga3F1ZXVlX2V2ZW50X21lbWJlcnNbXSA9IHsKLQl7ImlkZW50IiwJVF9VSU5UUFRSVCwJS1FfT0ZGKGUuaWRlbnQpfSwKLQl7ImZpbHRlciIsCVRfU0hPUlQsCUtRX09GRihlLmZpbHRlcil9LAotCXsiZmxhZ3MiLAlUX1VTSE9SVCwJS1FfT0ZGKGUuZmxhZ3MpfSwKLQl7ImZmbGFncyIsCVRfVUlOVCwJCUtRX09GRihlLmZmbGFncyl9LAotCXsiZGF0YSIsCVRfSU5UUFRSVCwJS1FfT0ZGKGUuZGF0YSl9LAotCXsidWRhdGEiLAlUX1VJTlRQVFJULAlLUV9PRkYoZS51ZGF0YSl9LAotCXtOVUxMfSAvKiBTZW50aW5lbCAqLworICAgIHsiaWRlbnQiLCAgICAgICAgICAgVF9VSU5UUFRSVCwgICAgIEtRX09GRihlLmlkZW50KX0sCisgICAgeyJmaWx0ZXIiLCAgICAgICAgICBUX1NIT1JULCAgICAgICAgS1FfT0ZGKGUuZmlsdGVyKX0sCisgICAgeyJmbGFncyIsICAgICAgICAgICBUX1VTSE9SVCwgICAgICAgS1FfT0ZGKGUuZmxhZ3MpfSwKKyAgICB7ImZmbGFncyIsICAgICAgICAgIFRfVUlOVCwgICAgICAgICBLUV9PRkYoZS5mZmxhZ3MpfSwKKyAgICB7ImRhdGEiLCAgICAgICAgICAgIFRfSU5UUFRSVCwgICAgICBLUV9PRkYoZS5kYXRhKX0sCisgICAgeyJ1ZGF0YSIsICAgICAgICAgICBUX1VJTlRQVFJULCAgICAgS1FfT0ZGKGUudWRhdGEpfSwKKyAgICB7TlVMTH0gLyogU2VudGluZWwgKi8KIH07CiAjdW5kZWYgS1FfT0ZGCiAKQEAgLTEyMzEsMjE0ICsxMjMxLDIxNCBAQAogCiBrcXVldWVfZXZlbnRfcmVwcihrcXVldWVfZXZlbnRfT2JqZWN0ICpzKQogewotCWNoYXIgYnVmWzEwMjRdOwotCVB5T1Nfc25wcmludGYoCi0JCWJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSI8c2VsZWN0LmtldmVudCBpZGVudD0lenUgZmlsdGVyPSVkIGZsYWdzPTB4JXggZmZsYWdzPTB4JXggIgotCQkiZGF0YT0weCV6ZCB1ZGF0YT0lcD4iLAotCQkoc2l6ZV90KShzLT5lLmlkZW50KSwgcy0+ZS5maWx0ZXIsIHMtPmUuZmxhZ3MsCi0JCXMtPmUuZmZsYWdzLCAoUHlfc3NpemVfdCkocy0+ZS5kYXRhKSwgcy0+ZS51ZGF0YSk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgICBQeU9TX3NucHJpbnRmKAorICAgICAgICBidWYsIHNpemVvZihidWYpLAorICAgICAgICAiPHNlbGVjdC5rZXZlbnQgaWRlbnQ9JXp1IGZpbHRlcj0lZCBmbGFncz0weCV4IGZmbGFncz0weCV4ICIKKyAgICAgICAgImRhdGE9MHglemQgdWRhdGE9JXA+IiwKKyAgICAgICAgKHNpemVfdCkocy0+ZS5pZGVudCksIHMtPmUuZmlsdGVyLCBzLT5lLmZsYWdzLAorICAgICAgICBzLT5lLmZmbGFncywgKFB5X3NzaXplX3QpKHMtPmUuZGF0YSksIHMtPmUudWRhdGEpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQKIGtxdWV1ZV9ldmVudF9pbml0KGtxdWV1ZV9ldmVudF9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqcGZkOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiaWRlbnQiLCAiZmlsdGVyIiwgImZsYWdzIiwgImZmbGFncyIsCi0JCQkJICJkYXRhIiwgInVkYXRhIiwgTlVMTH07Ci0Jc3RhdGljIGNoYXIgKmZtdCA9ICJPfGhoaSIgSU5UUFRSVF9GTVRfVU5JVCBVSU5UUFRSVF9GTVRfVU5JVCAiOmtldmVudCI7CisgICAgUHlPYmplY3QgKnBmZDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImlkZW50IiwgImZpbHRlciIsICJmbGFncyIsICJmZmxhZ3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSIsICJ1ZGF0YSIsIE5VTEx9OworICAgIHN0YXRpYyBjaGFyICpmbXQgPSAiT3xoaGkiIElOVFBUUlRfRk1UX1VOSVQgVUlOVFBUUlRfRk1UX1VOSVQgIjprZXZlbnQiOwogCi0JRVZfU0VUKCYoc2VsZi0+ZSksIDAsIEVWRklMVF9SRUFELCBFVl9BREQsIDAsIDAsIDApOyAvKiBkZWZhdWx0cyAqLwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIGZtdCwga3dsaXN0LAotCQkmcGZkLCAmKHNlbGYtPmUuZmlsdGVyKSwgJihzZWxmLT5lLmZsYWdzKSwKLQkJJihzZWxmLT5lLmZmbGFncyksICYoc2VsZi0+ZS5kYXRhKSwgJihzZWxmLT5lLnVkYXRhKSkpIHsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBFVl9TRVQoJihzZWxmLT5lKSwgMCwgRVZGSUxUX1JFQUQsIEVWX0FERCwgMCwgMCwgMCk7IC8qIGRlZmF1bHRzICovCiAKLQlpZiAoUHlMb25nX0NoZWNrKHBmZCkpIHsKLQkJc2VsZi0+ZS5pZGVudCA9IFB5TG9uZ19Bc1VpbnRwdHJfdChwZmQpOwotCX0KLQllbHNlIHsKLQkJc2VsZi0+ZS5pZGVudCA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IocGZkKTsKLQl9Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBmbXQsIGt3bGlzdCwKKyAgICAgICAgJnBmZCwgJihzZWxmLT5lLmZpbHRlciksICYoc2VsZi0+ZS5mbGFncyksCisgICAgICAgICYoc2VsZi0+ZS5mZmxhZ3MpLCAmKHNlbGYtPmUuZGF0YSksICYoc2VsZi0+ZS51ZGF0YSkpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoUHlMb25nX0NoZWNrKHBmZCkpIHsKKyAgICAgICAgc2VsZi0+ZS5pZGVudCA9IFB5TG9uZ19Bc1VpbnRwdHJfdChwZmQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2VsZi0+ZS5pZGVudCA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IocGZkKTsKKyAgICB9CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGtxdWV1ZV9ldmVudF9yaWNoY29tcGFyZShrcXVldWVfZXZlbnRfT2JqZWN0ICpzLCBrcXVldWVfZXZlbnRfT2JqZWN0ICpvLAotCQkJIGludCBvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ApCiB7Ci0JUHlfaW50cHRyX3QgcmVzdWx0ID0gMDsKKyAgICBQeV9pbnRwdHJfdCByZXN1bHQgPSAwOwogCi0JaWYgKCFrcXVldWVfZXZlbnRfQ2hlY2sobykpIHsKLQkJaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSB7Ci0gICAgICAgICAgICAgICAgCVB5T2JqZWN0ICpyZXMgPSBvcCA9PSBQeV9FUSA/IFB5X0ZhbHNlIDogUHlfVHJ1ZTsKLQkJCVB5X0lOQ1JFRihyZXMpOwotCQkJcmV0dXJuIHJlczsKLQkJfQotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJImNhbid0IGNvbXBhcmUgJS4yMDBzIHRvICUuMjAwcyIsCi0JCQlQeV9UWVBFKHMpLT50cF9uYW1lLCBQeV9UWVBFKG8pLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgoKHJlc3VsdCA9IHMtPmUuaWRlbnQgLSBvLT5lLmlkZW50KSA9PSAwKSAmJgotCSAgICAoKHJlc3VsdCA9IHMtPmUuZmlsdGVyIC0gby0+ZS5maWx0ZXIpID09IDApICYmCi0JICAgICgocmVzdWx0ID0gcy0+ZS5mbGFncyAtIG8tPmUuZmxhZ3MpID09IDApICYmCi0JICAgICgocmVzdWx0ID0gcy0+ZS5mZmxhZ3MgLSBvLT5lLmZmbGFncykgPT0gMCkgJiYKLQkgICAgKChyZXN1bHQgPSBzLT5lLmRhdGEgLSBvLT5lLmRhdGEpID09IDApICYmCi0JICAgICgocmVzdWx0ID0gcy0+ZS51ZGF0YSAtIG8tPmUudWRhdGEpID09IDApCi0JICAgKSB7Ci0JCXJlc3VsdCA9IDA7Ci0JfQorICAgIGlmICgha3F1ZXVlX2V2ZW50X0NoZWNrKG8pKSB7CisgICAgICAgIGlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnJlcyA9IG9wID09IFB5X0VRID8gUHlfRmFsc2UgOiBQeV9UcnVlOworICAgICAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiY2FuJ3QgY29tcGFyZSAlLjIwMHMgdG8gJS4yMDBzIiwKKyAgICAgICAgICAgIFB5X1RZUEUocyktPnRwX25hbWUsIFB5X1RZUEUobyktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCgocmVzdWx0ID0gcy0+ZS5pZGVudCAtIG8tPmUuaWRlbnQpID09IDApICYmCisgICAgICAgICgocmVzdWx0ID0gcy0+ZS5maWx0ZXIgLSBvLT5lLmZpbHRlcikgPT0gMCkgJiYKKyAgICAgICAgKChyZXN1bHQgPSBzLT5lLmZsYWdzIC0gby0+ZS5mbGFncykgPT0gMCkgJiYKKyAgICAgICAgKChyZXN1bHQgPSBzLT5lLmZmbGFncyAtIG8tPmUuZmZsYWdzKSA9PSAwKSAmJgorICAgICAgICAoKHJlc3VsdCA9IHMtPmUuZGF0YSAtIG8tPmUuZGF0YSkgPT0gMCkgJiYKKyAgICAgICAgKChyZXN1bHQgPSBzLT5lLnVkYXRhIC0gby0+ZS51ZGF0YSkgPT0gMCkKKyAgICAgICApIHsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CiAKLQlzd2l0Y2ggKG9wKSB7Ci0JICAgIGNhc2UgUHlfRVE6Ci0JCXJlc3VsdCA9IChyZXN1bHQgPT0gMCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFB5X05FOgotCQlyZXN1bHQgPSAocmVzdWx0ICE9IDApOwotCQlicmVhazsKLQkgICAgY2FzZSBQeV9MRToKLQkJcmVzdWx0ID0gKHJlc3VsdCA8PSAwKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUHlfR0U6Ci0JCXJlc3VsdCA9IChyZXN1bHQgPj0gMCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFB5X0xUOgotCQlyZXN1bHQgPSAocmVzdWx0IDwgMCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFB5X0dUOgotCQlyZXN1bHQgPSAocmVzdWx0ID4gMCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKXJlc3VsdCk7CisgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIFB5X0VROgorICAgICAgICByZXN1bHQgPSAocmVzdWx0ID09IDApOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQeV9ORToKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCAhPSAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTEU6CisgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPD0gMCk7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFB5X0dFOgorICAgICAgICByZXN1bHQgPSAocmVzdWx0ID49IDApOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQeV9MVDoKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8IDApOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQeV9HVDoKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+IDApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylyZXN1bHQpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGtxdWV1ZV9ldmVudF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJzZWxlY3Qua2V2ZW50IiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihrcXVldWVfZXZlbnRfT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylrcXVldWVfZXZlbnRfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCQkvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgIAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJCQkvKiB0cF9mbGFncyAqLwotCWtxdWV1ZV9ldmVudF9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKWtxdWV1ZV9ldmVudF9yaWNoY29tcGFyZSwJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlrcXVldWVfZXZlbnRfbWVtYmVycywJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylrcXVldWVfZXZlbnRfaW5pdCwJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgInNlbGVjdC5rZXZlbnQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2Yoa3F1ZXVlX2V2ZW50X09iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpa3F1ZXVlX2V2ZW50X3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGtxdWV1ZV9ldmVudF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAocmljaGNtcGZ1bmMpa3F1ZXVlX2V2ZW50X3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAga3F1ZXVlX2V2ZW50X21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2Mpa3F1ZXVlX2V2ZW50X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGtxdWV1ZV9xdWV1ZV9lcnJfY2xvc2VkKHZvaWQpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBrcXVldWUgZmQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGtxdWV1ZSBmZCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBrcXVldWVfcXVldWVfaW50ZXJuYWxfY2xvc2Uoa3F1ZXVlX3F1ZXVlX09iamVjdCAqc2VsZikKIHsKLQlpbnQgc2F2ZV9lcnJubyA9IDA7Ci0JaWYgKHNlbGYtPmtxZmQgPj0gMCkgewotCQlpbnQga3FmZCA9IHNlbGYtPmtxZmQ7Ci0JCXNlbGYtPmtxZmQgPSAtMTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlpZiAoY2xvc2Uoa3FmZCkgPCAwKQotCQkJc2F2ZV9lcnJubyA9IGVycm5vOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KLQlyZXR1cm4gc2F2ZV9lcnJubzsKKyAgICBpbnQgc2F2ZV9lcnJubyA9IDA7CisgICAgaWYgKHNlbGYtPmtxZmQgPj0gMCkgeworICAgICAgICBpbnQga3FmZCA9IHNlbGYtPmtxZmQ7CisgICAgICAgIHNlbGYtPmtxZmQgPSAtMTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAoY2xvc2Uoa3FmZCkgPCAwKQorICAgICAgICAgICAgc2F2ZV9lcnJubyA9IGVycm5vOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICByZXR1cm4gc2F2ZV9lcnJubzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld0txdWV1ZV9PYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBTT0NLRVQgZmQpCiB7Ci0Ja3F1ZXVlX3F1ZXVlX09iamVjdCAqc2VsZjsKLQlhc3NlcnQodHlwZSAhPSBOVUxMICYmIHR5cGUtPnRwX2FsbG9jICE9IE5VTEwpOwotCXNlbGYgPSAoa3F1ZXVlX3F1ZXVlX09iamVjdCAqKSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlpZiAoZmQgPT0gLTEpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlzZWxmLT5rcWZkID0ga3F1ZXVlKCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCWVsc2UgewotCQlzZWxmLT5rcWZkID0gZmQ7Ci0JfQotCWlmIChzZWxmLT5rcWZkIDwgMCkgewotCQlQeV9ERUNSRUYoc2VsZik7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIGtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGY7CisgICAgYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKKyAgICBzZWxmID0gKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKikgdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBzZWxmLT5rcWZkID0ga3F1ZXVlKCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzZWxmLT5rcWZkID0gZmQ7CisgICAgfQorICAgIGlmIChzZWxmLT5rcWZkIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgoga3F1ZXVlX3F1ZXVlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKIAotCWlmICgoYXJncyAhPSBOVUxMICYmIFB5T2JqZWN0X1NpemUoYXJncykpIHx8Ci0JCQkoa3dkcyAhPSBOVUxMICYmIFB5T2JqZWN0X1NpemUoa3dkcykpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzZWxlY3Qua3F1ZXVlIGRvZXNuJ3QgYWNjZXB0IGFyZ3VtZW50cyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChhcmdzICE9IE5VTEwgJiYgUHlPYmplY3RfU2l6ZShhcmdzKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGt3ZHMgIT0gTlVMTCAmJiBQeU9iamVjdF9TaXplKGt3ZHMpKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Qua3F1ZXVlIGRvZXNuJ3QgYWNjZXB0IGFyZ3VtZW50cyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gbmV3S3F1ZXVlX09iamVjdCh0eXBlLCAtMSk7CisgICAgcmV0dXJuIG5ld0txdWV1ZV9PYmplY3QodHlwZSwgLTEpOwogfQogCiBzdGF0aWMgdm9pZAoga3F1ZXVlX3F1ZXVlX2RlYWxsb2Moa3F1ZXVlX3F1ZXVlX09iamVjdCAqc2VsZikKIHsKLQlrcXVldWVfcXVldWVfaW50ZXJuYWxfY2xvc2Uoc2VsZik7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKKyAgICBrcXVldWVfcXVldWVfaW50ZXJuYWxfY2xvc2Uoc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgoga3F1ZXVlX3F1ZXVlX2Nsb3NlKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGYpCiB7Ci0JZXJybm8gPSBrcXVldWVfcXVldWVfaW50ZXJuYWxfY2xvc2Uoc2VsZik7Ci0JaWYgKGVycm5vIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBlcnJubyA9IGtxdWV1ZV9xdWV1ZV9pbnRlcm5hbF9jbG9zZShzZWxmKTsKKyAgICBpZiAoZXJybm8gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoa3F1ZXVlX3F1ZXVlX2Nsb3NlX2RvYywKQEAgLTE0NTAsMTggKzE0NTAsMTggQEAKIHN0YXRpYyBQeU9iamVjdCoKIGtxdWV1ZV9xdWV1ZV9nZXRfY2xvc2VkKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmtxZmQgPCAwKQotCQlQeV9SRVRVUk5fVFJVRTsKLQllbHNlCi0JCVB5X1JFVFVSTl9GQUxTRTsKKyAgICBpZiAoc2VsZi0+a3FmZCA8IDApCisgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgIGVsc2UKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBrcXVldWVfcXVldWVfZmlsZW5vKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmtxZmQgPCAwKQotCQlyZXR1cm4ga3F1ZXVlX3F1ZXVlX2Vycl9jbG9zZWQoKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+a3FmZCk7CisgICAgaWYgKHNlbGYtPmtxZmQgPCAwKQorICAgICAgICByZXR1cm4ga3F1ZXVlX3F1ZXVlX2Vycl9jbG9zZWQoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+a3FmZCk7CiB9CiAKIFB5RG9jX1NUUlZBUihrcXVldWVfcXVldWVfZmlsZW5vX2RvYywKQEAgLTE0NzIsMTIgKzE0NzIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGtxdWV1ZV9xdWV1ZV9mcm9tZmQoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JU09DS0VUIGZkOworICAgIFNPQ0tFVCBmZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpmcm9tZmQiLCAmZmQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6ZnJvbWZkIiwgJmZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gbmV3S3F1ZXVlX09iamVjdCgoUHlUeXBlT2JqZWN0KiljbHMsIGZkKTsKKyAgICByZXR1cm4gbmV3S3F1ZXVlX09iamVjdCgoUHlUeXBlT2JqZWN0KiljbHMsIGZkKTsKIH0KIAogUHlEb2NfU1RSVkFSKGtxdWV1ZV9xdWV1ZV9mcm9tZmRfZG9jLApAQCAtMTQ4OCwxNDQgKzE0ODgsMTQ0IEBACiBzdGF0aWMgUHlPYmplY3QgKgoga3F1ZXVlX3F1ZXVlX2NvbnRyb2woa3F1ZXVlX3F1ZXVlX09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG5ldmVudHMgPSAwOwotCWludCBnb3RldmVudHMgPSAwOwotCWludCBuY2hhbmdlcyA9IDA7Ci0JaW50IGkgPSAwOwotCVB5T2JqZWN0ICpvdGltZW91dCA9IE5VTEw7Ci0JUHlPYmplY3QgKmNoID0gTlVMTDsKLQlQeU9iamVjdCAqaXQgPSBOVUxMLCAqZWkgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCXN0cnVjdCBrZXZlbnQgKmV2bCA9IE5VTEw7Ci0Jc3RydWN0IGtldmVudCAqY2hsID0gTlVMTDsKLQlzdHJ1Y3QgdGltZXNwZWMgdGltZW91dHNwZWM7Ci0Jc3RydWN0IHRpbWVzcGVjICpwdGltZW91dHNwZWM7CisgICAgaW50IG5ldmVudHMgPSAwOworICAgIGludCBnb3RldmVudHMgPSAwOworICAgIGludCBuY2hhbmdlcyA9IDA7CisgICAgaW50IGkgPSAwOworICAgIFB5T2JqZWN0ICpvdGltZW91dCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNoID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaXQgPSBOVUxMLCAqZWkgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIHN0cnVjdCBrZXZlbnQgKmV2bCA9IE5VTEw7CisgICAgc3RydWN0IGtldmVudCAqY2hsID0gTlVMTDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZW91dHNwZWM7CisgICAgc3RydWN0IHRpbWVzcGVjICpwdGltZW91dHNwZWM7CiAKLQlpZiAoc2VsZi0+a3FmZCA8IDApCi0JCXJldHVybiBrcXVldWVfcXVldWVfZXJyX2Nsb3NlZCgpOworICAgIGlmIChzZWxmLT5rcWZkIDwgMCkKKyAgICAgICAgcmV0dXJuIGtxdWV1ZV9xdWV1ZV9lcnJfY2xvc2VkKCk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pfE86Y29udHJvbCIsICZjaCwgJm5ldmVudHMsICZvdGltZW91dCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2l8Tzpjb250cm9sIiwgJmNoLCAmbmV2ZW50cywgJm90aW1lb3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobmV2ZW50cyA8IDApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkiTGVuZ3RoIG9mIGV2ZW50bGlzdCBtdXN0IGJlIDAgb3IgcG9zaXRpdmUsIGdvdCAlZCIsCi0JCQluZXZlbnRzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChuZXZlbnRzIDwgMCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJMZW5ndGggb2YgZXZlbnRsaXN0IG11c3QgYmUgMCBvciBwb3NpdGl2ZSwgZ290ICVkIiwKKyAgICAgICAgICAgIG5ldmVudHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAob3RpbWVvdXQgPT0gUHlfTm9uZSB8fCBvdGltZW91dCA9PSBOVUxMKSB7Ci0JCXB0aW1lb3V0c3BlYyA9IE5VTEw7Ci0JfQotCWVsc2UgaWYgKFB5TnVtYmVyX0NoZWNrKG90aW1lb3V0KSkgewotCQlkb3VibGUgdGltZW91dDsKLQkJbG9uZyBzZWNvbmRzOworICAgIGlmIChvdGltZW91dCA9PSBQeV9Ob25lIHx8IG90aW1lb3V0ID09IE5VTEwpIHsKKyAgICAgICAgcHRpbWVvdXRzcGVjID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlOdW1iZXJfQ2hlY2sob3RpbWVvdXQpKSB7CisgICAgICAgIGRvdWJsZSB0aW1lb3V0OworICAgICAgICBsb25nIHNlY29uZHM7CiAKLQkJdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUob3RpbWVvdXQpOwotCQlpZiAodGltZW91dCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICh0aW1lb3V0ID4gKGRvdWJsZSlMT05HX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCSJ0aW1lb3V0IHBlcmlvZCB0b28gbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKHRpbWVvdXQgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInRpbWVvdXQgbXVzdCBiZSBwb3NpdGl2ZSBvciBOb25lIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICB0aW1lb3V0ID0gUHlGbG9hdF9Bc0RvdWJsZShvdGltZW91dCk7CisgICAgICAgIGlmICh0aW1lb3V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHRpbWVvdXQgPiAoZG91YmxlKUxPTkdfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCBwZXJpb2QgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICh0aW1lb3V0IDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgbXVzdCBiZSBwb3NpdGl2ZSBvciBOb25lIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCXNlY29uZHMgPSAobG9uZyl0aW1lb3V0OwotCQl0aW1lb3V0ID0gdGltZW91dCAtIChkb3VibGUpc2Vjb25kczsKLQkJdGltZW91dHNwZWMudHZfc2VjID0gc2Vjb25kczsKLQkJdGltZW91dHNwZWMudHZfbnNlYyA9IChsb25nKSh0aW1lb3V0ICogMUU5KTsKLQkJcHRpbWVvdXRzcGVjID0gJnRpbWVvdXRzcGVjOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ0aW1lb3V0IGFyZ3VtZW50IG11c3QgYmUgYW4gbnVtYmVyICIKLQkJCSJvciBOb25lLCBnb3QgJS4yMDBzIiwKLQkJCVB5X1RZUEUob3RpbWVvdXQpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBzZWNvbmRzID0gKGxvbmcpdGltZW91dDsKKyAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgLSAoZG91YmxlKXNlY29uZHM7CisgICAgICAgIHRpbWVvdXRzcGVjLnR2X3NlYyA9IHNlY29uZHM7CisgICAgICAgIHRpbWVvdXRzcGVjLnR2X25zZWMgPSAobG9uZykodGltZW91dCAqIDFFOSk7CisgICAgICAgIHB0aW1lb3V0c3BlYyA9ICZ0aW1lb3V0c3BlYzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAidGltZW91dCBhcmd1bWVudCBtdXN0IGJlIGFuIG51bWJlciAiCisgICAgICAgICAgICAib3IgTm9uZSwgZ290ICUuMjAwcyIsCisgICAgICAgICAgICBQeV9UWVBFKG90aW1lb3V0KS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChjaCAhPSBOVUxMICYmIGNoICE9IFB5X05vbmUpIHsKLQkJaXQgPSBQeU9iamVjdF9HZXRJdGVyKGNoKTsKLQkJaWYgKGl0ID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJjaGFuZ2VsaXN0IGlzIG5vdCBpdGVyYWJsZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbmNoYW5nZXMgPSBQeU9iamVjdF9TaXplKGNoKTsKLQkJaWYgKG5jaGFuZ2VzIDwgMCkgewotCQkJZ290byBlcnJvcjsKLQkJfQorICAgIGlmIChjaCAhPSBOVUxMICYmIGNoICE9IFB5X05vbmUpIHsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGNoKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5nZWxpc3QgaXMgbm90IGl0ZXJhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBuY2hhbmdlcyA9IFB5T2JqZWN0X1NpemUoY2gpOworICAgICAgICBpZiAobmNoYW5nZXMgPCAwKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CiAKLQkJY2hsID0gUHlNZW1fTmV3KHN0cnVjdCBrZXZlbnQsIG5jaGFuZ2VzKTsKLQkJaWYgKGNobCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlpID0gMDsKLQkJd2hpbGUgKChlaSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQkJaWYgKCFrcXVldWVfZXZlbnRfQ2hlY2soZWkpKSB7Ci0JCQkJUHlfREVDUkVGKGVpKTsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiY2hhbmdlbGlzdCBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mICIKLQkJCQkgCSJzZWxlY3Qua2V2ZW50IG9iamVjdHMiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfSBlbHNlIHsKLQkJCQljaGxbaSsrXSA9ICgoa3F1ZXVlX2V2ZW50X09iamVjdCAqKWVpKS0+ZTsKLQkJCX0KLQkJCVB5X0RFQ1JFRihlaSk7Ci0JCX0KLQl9Ci0JUHlfQ0xFQVIoaXQpOworICAgICAgICBjaGwgPSBQeU1lbV9OZXcoc3RydWN0IGtldmVudCwgbmNoYW5nZXMpOworICAgICAgICBpZiAoY2hsID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAoKGVpID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIWtxdWV1ZV9ldmVudF9DaGVjayhlaSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWkpOworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjaGFuZ2VsaXN0IG11c3QgYmUgYW4gaXRlcmFibGUgb2YgIgorICAgICAgICAgICAgICAgICAgICAic2VsZWN0LmtldmVudCBvYmplY3RzIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hsW2krK10gPSAoKGtxdWV1ZV9ldmVudF9PYmplY3QgKillaSktPmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoZWkpOworICAgICAgICB9CisgICAgfQorICAgIFB5X0NMRUFSKGl0KTsKIAotCS8qIGV2ZW50IGxpc3QgKi8KLQlpZiAobmV2ZW50cykgewotCQlldmwgPSBQeU1lbV9OZXcoc3RydWN0IGtldmVudCwgbmV2ZW50cyk7Ci0JCWlmIChldmwgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9CisgICAgLyogZXZlbnQgbGlzdCAqLworICAgIGlmIChuZXZlbnRzKSB7CisgICAgICAgIGV2bCA9IFB5TWVtX05ldyhzdHJ1Y3Qga2V2ZW50LCBuZXZlbnRzKTsKKyAgICAgICAgaWYgKGV2bCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlnb3RldmVudHMgPSBrZXZlbnQoc2VsZi0+a3FmZCwgY2hsLCBuY2hhbmdlcywKLQkJCSAgIGV2bCwgbmV2ZW50cywgcHRpbWVvdXRzcGVjKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBnb3RldmVudHMgPSBrZXZlbnQoc2VsZi0+a3FmZCwgY2hsLCBuY2hhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgZXZsLCBuZXZlbnRzLCBwdGltZW91dHNwZWMpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoZ290ZXZlbnRzID09IC0xKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgaWYgKGdvdGV2ZW50cyA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JcmVzdWx0ID0gUHlMaXN0X05ldyhnb3RldmVudHMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlnb3RvIGVycm9yOwotCX0KKyAgICByZXN1bHQgPSBQeUxpc3RfTmV3KGdvdGV2ZW50cyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IGdvdGV2ZW50czsgaSsrKSB7Ci0JCWtxdWV1ZV9ldmVudF9PYmplY3QgKmNoOworICAgIGZvciAoaSA9IDA7IGkgPCBnb3RldmVudHM7IGkrKykgeworICAgICAgICBrcXVldWVfZXZlbnRfT2JqZWN0ICpjaDsKIAotCQljaCA9IFB5T2JqZWN0X05ldyhrcXVldWVfZXZlbnRfT2JqZWN0LCAma3F1ZXVlX2V2ZW50X1R5cGUpOwotCQlpZiAoY2ggPT0gTlVMTCkgewotCQkJZ290byBlcnJvcjsKLQkJfQotCQljaC0+ZSA9IGV2bFtpXTsKLQkJUHlMaXN0X1NFVF9JVEVNKHJlc3VsdCwgaSwgKFB5T2JqZWN0ICopY2gpOwotCX0KLQlQeU1lbV9GcmVlKGNobCk7Ci0JUHlNZW1fRnJlZShldmwpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgIGNoID0gUHlPYmplY3RfTmV3KGtxdWV1ZV9ldmVudF9PYmplY3QsICZrcXVldWVfZXZlbnRfVHlwZSk7CisgICAgICAgIGlmIChjaCA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGNoLT5lID0gZXZsW2ldOworICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmVzdWx0LCBpLCAoUHlPYmplY3QgKiljaCk7CisgICAgfQorICAgIFB5TWVtX0ZyZWUoY2hsKTsKKyAgICBQeU1lbV9GcmVlKGV2bCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogICAgIGVycm9yOgotCVB5TWVtX0ZyZWUoY2hsKTsKLQlQeU1lbV9GcmVlKGV2bCk7Ci0JUHlfWERFQ1JFRihyZXN1bHQpOwotCVB5X1hERUNSRUYoaXQpOwotCXJldHVybiBOVUxMOworICAgIFB5TWVtX0ZyZWUoY2hsKTsKKyAgICBQeU1lbV9GcmVlKGV2bCk7CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIFB5X1hERUNSRUYoaXQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoa3F1ZXVlX3F1ZXVlX2NvbnRyb2xfZG9jLApAQCAtMTY0MSwyMSArMTY0MSwyMSBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBrcXVldWVfcXVldWVfbWV0aG9kc1tdID0gewotCXsiZnJvbWZkIiwJKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9mcm9tZmQsCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsIGtxdWV1ZV9xdWV1ZV9mcm9tZmRfZG9jfSwKLQl7ImNsb3NlIiwJKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9jbG9zZSwJTUVUSF9OT0FSR1MsCi0JIGtxdWV1ZV9xdWV1ZV9jbG9zZV9kb2N9LAotCXsiZmlsZW5vIiwJKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9maWxlbm8sCU1FVEhfTk9BUkdTLAotCSBrcXVldWVfcXVldWVfZmlsZW5vX2RvY30sCi0JeyJjb250cm9sIiwJKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9jb250cm9sLAotCSBNRVRIX1ZBUkFSR1MgLAlrcXVldWVfcXVldWVfY29udHJvbF9kb2N9LAotCXtOVUxMLAlOVUxMfSwKKyAgICB7ImZyb21mZCIsICAgICAgICAgIChQeUNGdW5jdGlvbilrcXVldWVfcXVldWVfZnJvbWZkLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLCBrcXVldWVfcXVldWVfZnJvbWZkX2RvY30sCisgICAgeyJjbG9zZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pa3F1ZXVlX3F1ZXVlX2Nsb3NlLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIGtxdWV1ZV9xdWV1ZV9jbG9zZV9kb2N9LAorICAgIHsiZmlsZW5vIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9maWxlbm8sICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBrcXVldWVfcXVldWVfZmlsZW5vX2RvY30sCisgICAgeyJjb250cm9sIiwgICAgICAgICAoUHlDRnVuY3Rpb24pa3F1ZXVlX3F1ZXVlX2NvbnRyb2wsCisgICAgIE1FVEhfVkFSQVJHUyAsICAgICBrcXVldWVfcXVldWVfY29udHJvbF9kb2N9LAorICAgIHtOVUxMLCAgICAgIE5VTEx9LAogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIGtxdWV1ZV9xdWV1ZV9nZXRzZXRsaXN0W10gPSB7Ci0JeyJjbG9zZWQiLCAoZ2V0dGVyKWtxdWV1ZV9xdWV1ZV9nZXRfY2xvc2VkLCBOVUxMLAotCSAiVHJ1ZSBpZiB0aGUga3F1ZXVlIGhhbmRsZXIgaXMgY2xvc2VkIn0sCi0JezB9LAorICAgIHsiY2xvc2VkIiwgKGdldHRlcilrcXVldWVfcXVldWVfZ2V0X2Nsb3NlZCwgTlVMTCwKKyAgICAgIlRydWUgaWYgdGhlIGtxdWV1ZSBoYW5kbGVyIGlzIGNsb3NlZCJ9LAorICAgIHswfSwKIH07CiAKIFB5RG9jX1NUUlZBUihrcXVldWVfcXVldWVfZG9jLApAQCAtMTY3NCw0NSArMTY3NCw0NSBAQAogPj4+IGtxLmNvbnRyb2woW2tldmVudChzb2NrLCBLUV9GSUxURVJfV1JJVEUsIEtRX0VWX0RFTEVURSldLCAwKSIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGtxdWV1ZV9xdWV1ZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJzZWxlY3Qua3F1ZXVlIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihrcXVldWVfcXVldWVfT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3Ipa3F1ZXVlX3F1ZXVlX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkJLyogdHBfZmxhZ3MgKi8KLQlrcXVldWVfcXVldWVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWtxdWV1ZV9xdWV1ZV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCQkvKiB0cF9tZW1iZXJzICovCi0Ja3F1ZXVlX3F1ZXVlX2dldHNldGxpc3QsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkJLyogdHBfYWxsb2MgKi8KLQlrcXVldWVfcXVldWVfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAic2VsZWN0LmtxdWV1ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihrcXVldWVfcXVldWVfT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAoZGVzdHJ1Y3RvcilrcXVldWVfcXVldWVfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAga3F1ZXVlX3F1ZXVlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAga3F1ZXVlX3F1ZXVlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGtxdWV1ZV9xdWV1ZV9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAga3F1ZXVlX3F1ZXVlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAjZW5kaWYgLyogSEFWRV9LUVVFVUUgKi8KQEAgLTE3NDMsMTEgKzE3NDMsMTEgQEAKIGRlc2NyaXB0b3JzIGNhbiBiZSB1c2VkLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgc2VsZWN0X21ldGhvZHNbXSA9IHsKLQl7InNlbGVjdCIsCXNlbGVjdF9zZWxlY3QsCU1FVEhfVkFSQVJHUywJc2VsZWN0X2RvY30sCisgICAgeyJzZWxlY3QiLCAgICAgICAgICBzZWxlY3Rfc2VsZWN0LCAgTUVUSF9WQVJBUkdTLCAgIHNlbGVjdF9kb2N9LAogI2lmZGVmIEhBVkVfUE9MTAotCXsicG9sbCIsCXNlbGVjdF9wb2xsLAlNRVRIX05PQVJHUywJcG9sbF9kb2N9LAorICAgIHsicG9sbCIsICAgICAgICAgICAgc2VsZWN0X3BvbGwsICAgIE1FVEhfTk9BUkdTLCAgICBwb2xsX2RvY30sCiAjZW5kaWYgLyogSEFWRV9QT0xMICovCi0JezAsICAJMH0sCS8qIHNlbnRpbmVsICovCisgICAgezAsICAgICAgICAgMH0sICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCkBAIC0xNzU5LDE1MCArMTc1OSwxNTAgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0c2VsZWN0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JbSA9IFB5X0luaXRNb2R1bGUzKCJzZWxlY3QiLCBzZWxlY3RfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygic2VsZWN0Iiwgc2VsZWN0X21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVNlbGVjdEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzZWxlY3QuZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlQeV9JTkNSRUYoU2VsZWN0RXJyb3IpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBTZWxlY3RFcnJvcik7CisgICAgU2VsZWN0RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNlbGVjdC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIFB5X0lOQ1JFRihTZWxlY3RFcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFNlbGVjdEVycm9yKTsKIAogI2lmZGVmIFBJUEVfQlVGCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBJUEVfQlVGIiwgUElQRV9CVUYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSVBFX0JVRiIsIFBJUEVfQlVGKTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChIQVZFX1BPTEwpCiAjaWZkZWYgX19BUFBMRV9fCi0JaWYgKHNlbGVjdF9oYXZlX2Jyb2tlbl9wb2xsKCkpIHsKLQkJaWYgKFB5T2JqZWN0X0RlbEF0dHJTdHJpbmcobSwgInBvbGwiKSA9PSAtMSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCX0gZWxzZSB7CisgICAgaWYgKHNlbGVjdF9oYXZlX2Jyb2tlbl9wb2xsKCkpIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0RlbEF0dHJTdHJpbmcobSwgInBvbGwiKSA9PSAtMSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CiAjZWxzZQotCXsKKyAgICB7CiAjZW5kaWYKLQkJUHlfVFlQRSgmcG9sbF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExJTiIsIFBPTExJTik7Ci0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMUFJJIiwgUE9MTFBSSSk7Ci0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMT1VUIiwgUE9MTE9VVCk7Ci0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMRVJSIiwgUE9MTEVSUik7Ci0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMSFVQIiwgUE9MTEhVUCk7Ci0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMTlZBTCIsIFBPTExOVkFMKTsKKyAgICAgICAgUHlfVFlQRSgmcG9sbF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExJTiIsIFBPTExJTik7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMUFJJIiwgUE9MTFBSSSk7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMT1VUIiwgUE9MTE9VVCk7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMRVJSIiwgUE9MTEVSUik7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMSFVQIiwgUE9MTEhVUCk7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMTlZBTCIsIFBPTExOVkFMKTsKIAogI2lmZGVmIFBPTExSRE5PUk0KLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExSRE5PUk0iLCBQT0xMUkROT1JNKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExSRE5PUk0iLCBQT0xMUkROT1JNKTsKICNlbmRpZgogI2lmZGVmIFBPTExSREJBTkQKLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExSREJBTkQiLCBQT0xMUkRCQU5EKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExSREJBTkQiLCBQT0xMUkRCQU5EKTsKICNlbmRpZgogI2lmZGVmIFBPTExXUk5PUk0KLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExXUk5PUk0iLCBQT0xMV1JOT1JNKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExXUk5PUk0iLCBQT0xMV1JOT1JNKTsKICNlbmRpZgogI2lmZGVmIFBPTExXUkJBTkQKLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExXUkJBTkQiLCBQT0xMV1JCQU5EKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExXUkJBTkQiLCBQT0xMV1JCQU5EKTsKICNlbmRpZgogI2lmZGVmIFBPTExNU0cKLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExNU0ciLCBQT0xMTVNHKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExNU0ciLCBQT0xMTVNHKTsKICNlbmRpZgotCX0KKyAgICB9CiAjZW5kaWYgLyogSEFWRV9QT0xMICovCiAKICNpZmRlZiBIQVZFX0VQT0xMCi0JUHlfVFlQRSgmcHlFcG9sbF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZweUVwb2xsX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5X1RZUEUoJnB5RXBvbGxfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmcHlFcG9sbF9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCVB5X0lOQ1JFRigmcHlFcG9sbF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVwb2xsIiwgKFB5T2JqZWN0ICopICZweUVwb2xsX1R5cGUpOworICAgIFB5X0lOQ1JFRigmcHlFcG9sbF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImVwb2xsIiwgKFB5T2JqZWN0ICopICZweUVwb2xsX1R5cGUpOwogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMSU4iLCBFUE9MTElOKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExPVVQiLCBFUE9MTE9VVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMUFJJIiwgRVBPTExQUkkpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTEVSUiIsIEVQT0xMRVJSKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExIVVAiLCBFUE9MTEhVUCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMRVQiLCBFUE9MTEVUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExJTiIsIEVQT0xMSU4pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTE9VVCIsIEVQT0xMT1VUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExQUkkiLCBFUE9MTFBSSSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMRVJSIiwgRVBPTExFUlIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTEhVUCIsIEVQT0xMSFVQKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExFVCIsIEVQT0xMRVQpOwogI2lmZGVmIEVQT0xMT05FU0hPVAotCS8qIEtlcm5lbCAyLjYuMisgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExPTkVTSE9UIiwgRVBPTExPTkVTSE9UKTsKKyAgICAvKiBLZXJuZWwgMi42LjIrICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMT05FU0hPVCIsIEVQT0xMT05FU0hPVCk7CiAjZW5kaWYKLQkvKiBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExfUkRIVVAiLCBFUE9MTFJESFVQKTsgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExSRE5PUk0iLCBFUE9MTFJETk9STSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMUkRCQU5EIiwgRVBPTExSREJBTkQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTFdSTk9STSIsIEVQT0xMV1JOT1JNKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExXUkJBTkQiLCBFUE9MTFdSQkFORCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMTVNHIiwgRVBPTExNU0cpOworICAgIC8qIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTF9SREhVUCIsIEVQT0xMUkRIVVApOyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTFJETk9STSIsIEVQT0xMUkROT1JNKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExSREJBTkQiLCBFUE9MTFJEQkFORCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMV1JOT1JNIiwgRVBPTExXUk5PUk0pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTFdSQkFORCIsIEVQT0xMV1JCQU5EKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExNU0ciLCBFUE9MTE1TRyk7CiAjZW5kaWYgLyogSEFWRV9FUE9MTCAqLwogCiAjaWZkZWYgSEFWRV9LUVVFVUUKLQlrcXVldWVfZXZlbnRfVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKLQlQeV9UWVBFKCZrcXVldWVfZXZlbnRfVHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0JaWYoUHlUeXBlX1JlYWR5KCZrcXVldWVfZXZlbnRfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAga3F1ZXVlX2V2ZW50X1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgUHlfVFlQRSgma3F1ZXVlX2V2ZW50X1R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIGlmKFB5VHlwZV9SZWFkeSgma3F1ZXVlX2V2ZW50X1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfSU5DUkVGKCZrcXVldWVfZXZlbnRfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJrZXZlbnQiLCAoUHlPYmplY3QgKikma3F1ZXVlX2V2ZW50X1R5cGUpOworICAgIFB5X0lOQ1JFRigma3F1ZXVlX2V2ZW50X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAia2V2ZW50IiwgKFB5T2JqZWN0ICopJmtxdWV1ZV9ldmVudF9UeXBlKTsKIAotCVB5X1RZUEUoJmtxdWV1ZV9xdWV1ZV9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKLQlpZihQeVR5cGVfUmVhZHkoJmtxdWV1ZV9xdWV1ZV9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJmtxdWV1ZV9xdWV1ZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImtxdWV1ZSIsIChQeU9iamVjdCAqKSZrcXVldWVfcXVldWVfVHlwZSk7Ci0JCi0JLyogZXZlbnQgZmlsdGVycyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfUkVBRCIsIEVWRklMVF9SRUFEKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1dSSVRFIiwgRVZGSUxUX1dSSVRFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX0FJTyIsIEVWRklMVF9BSU8pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfVk5PREUiLCBFVkZJTFRfVk5PREUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfUFJPQyIsIEVWRklMVF9QUk9DKTsKKyAgICBQeV9UWVBFKCZrcXVldWVfcXVldWVfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYoUHlUeXBlX1JlYWR5KCZrcXVldWVfcXVldWVfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZrcXVldWVfcXVldWVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJrcXVldWUiLCAoUHlPYmplY3QgKikma3F1ZXVlX3F1ZXVlX1R5cGUpOworCisgICAgLyogZXZlbnQgZmlsdGVycyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfUkVBRCIsIEVWRklMVF9SRUFEKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1dSSVRFIiwgRVZGSUxUX1dSSVRFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX0FJTyIsIEVWRklMVF9BSU8pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfVk5PREUiLCBFVkZJTFRfVk5PREUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfUFJPQyIsIEVWRklMVF9QUk9DKTsKICNpZmRlZiBFVkZJTFRfTkVUREVWCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9ORVRERVYiLCBFVkZJTFRfTkVUREVWKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX05FVERFViIsIEVWRklMVF9ORVRERVYpOwogI2VuZGlmCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9TSUdOQUwiLCBFVkZJTFRfU0lHTkFMKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1RJTUVSIiwgRVZGSUxUX1RJTUVSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1NJR05BTCIsIEVWRklMVF9TSUdOQUwpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfVElNRVIiLCBFVkZJTFRfVElNRVIpOwogCi0JLyogZXZlbnQgZmxhZ3MgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfQUREIiwgRVZfQUREKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfREVMRVRFIiwgRVZfREVMRVRFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfRU5BQkxFIiwgRVZfRU5BQkxFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfRElTQUJMRSIsIEVWX0RJU0FCTEUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9PTkVTSE9UIiwgRVZfT05FU0hPVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0NMRUFSIiwgRVZfQ0xFQVIpOworICAgIC8qIGV2ZW50IGZsYWdzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0FERCIsIEVWX0FERCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0RFTEVURSIsIEVWX0RFTEVURSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0VOQUJMRSIsIEVWX0VOQUJMRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0RJU0FCTEUiLCBFVl9ESVNBQkxFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfT05FU0hPVCIsIEVWX09ORVNIT1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9DTEVBUiIsIEVWX0NMRUFSKTsKIAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9TWVNGTEFHUyIsIEVWX1NZU0ZMQUdTKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfRkxBRzEiLCBFVl9GTEFHMSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX1NZU0ZMQUdTIiwgRVZfU1lTRkxBR1MpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9GTEFHMSIsIEVWX0ZMQUcxKTsKIAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9FT0YiLCBFVl9FT0YpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9FUlJPUiIsIEVWX0VSUk9SKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfRU9GIiwgRVZfRU9GKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfRVJST1IiLCBFVl9FUlJPUik7CiAKLQkvKiBSRUFEIFdSSVRFIGZpbHRlciBmbGFnICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfTE9XQVQiLCBOT1RFX0xPV0FUKTsKLQkKLQkvKiBWTk9ERSBmaWx0ZXIgZmxhZ3MgICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfREVMRVRFIiwgTk9URV9ERUxFVEUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1dSSVRFIiwgTk9URV9XUklURSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfRVhURU5EIiwgTk9URV9FWFRFTkQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0FUVFJJQiIsIE5PVEVfQVRUUklCKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9MSU5LIiwgTk9URV9MSU5LKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9SRU5BTUUiLCBOT1RFX1JFTkFNRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfUkVWT0tFIiwgTk9URV9SRVZPS0UpOworICAgIC8qIFJFQUQgV1JJVEUgZmlsdGVyIGZsYWcgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9MT1dBVCIsIE5PVEVfTE9XQVQpOwogCi0JLyogUFJPQyBmaWx0ZXIgZmxhZ3MgICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfRVhJVCIsIE5PVEVfRVhJVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfRk9SSyIsIE5PVEVfRk9SSyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfRVhFQyIsIE5PVEVfRVhFQyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfUENUUkxNQVNLIiwgTk9URV9QQ1RSTE1BU0spOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1BEQVRBTUFTSyIsIE5PVEVfUERBVEFNQVNLKTsKKyAgICAvKiBWTk9ERSBmaWx0ZXIgZmxhZ3MgICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfREVMRVRFIiwgTk9URV9ERUxFVEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1dSSVRFIiwgTk9URV9XUklURSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfRVhURU5EIiwgTk9URV9FWFRFTkQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0FUVFJJQiIsIE5PVEVfQVRUUklCKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9MSU5LIiwgTk9URV9MSU5LKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9SRU5BTUUiLCBOT1RFX1JFTkFNRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfUkVWT0tFIiwgTk9URV9SRVZPS0UpOwogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfVFJBQ0siLCBOT1RFX1RSQUNLKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9DSElMRCIsIE5PVEVfQ0hJTEQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1RSQUNLRVJSIiwgTk9URV9UUkFDS0VSUik7CisgICAgLyogUFJPQyBmaWx0ZXIgZmxhZ3MgICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfRVhJVCIsIE5PVEVfRVhJVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfRk9SSyIsIE5PVEVfRk9SSyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfRVhFQyIsIE5PVEVfRVhFQyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfUENUUkxNQVNLIiwgTk9URV9QQ1RSTE1BU0spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1BEQVRBTUFTSyIsIE5PVEVfUERBVEFNQVNLKTsKIAotCS8qIE5FVERFViBmaWx0ZXIgZmxhZ3MgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9UUkFDSyIsIE5PVEVfVFJBQ0spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0NISUxEIiwgTk9URV9DSElMRCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfVFJBQ0tFUlIiLCBOT1RFX1RSQUNLRVJSKTsKKworICAgIC8qIE5FVERFViBmaWx0ZXIgZmxhZ3MgKi8KICNpZmRlZiBFVkZJTFRfTkVUREVWCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfTElOS1VQIiwgTk9URV9MSU5LVVApOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0xJTktET1dOIiwgTk9URV9MSU5LRE9XTik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfTElOS0lOViIsIE5PVEVfTElOS0lOVik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfTElOS1VQIiwgTk9URV9MSU5LVVApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0xJTktET1dOIiwgTk9URV9MSU5LRE9XTik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfTElOS0lOViIsIE5PVEVfTElOS0lOVik7CiAjZW5kaWYKIAogI2VuZGlmIC8qIEhBVkVfS1FVRVVFICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NnaW1vZHVsZS5jIGIvTW9kdWxlcy9zZ2ltb2R1bGUuYwppbmRleCBmN2UxMjYzLi4wZDEzMjQ4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NnaW1vZHVsZS5jCisrKyBiL01vZHVsZXMvc2dpbW9kdWxlLmMKQEAgLTEwLDE0ICsxMCwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNnaV9uYXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgdGlja3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOm5hcCIsICZ0aWNrcykpCi0JCXJldHVybiBOVUxMOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzZ2luYXAodGlja3MpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgdGlja3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOm5hcCIsICZ0aWNrcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzZ2luYXAodGlja3MpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBleHRlcm4gY2hhciAqX2dldHB0eShpbnQgKiwgaW50LCBtb2RlX3QsIGludCk7CkBAIC0yNSwzMSArMjUsMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZ2lfX2dldHB0eShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG9mbGFnOwotCWludCBtb2RlOwotCWludCBub2Zvcms7Ci0JY2hhciAqbmFtZTsKLQlpbnQgZmlsZGVzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOl9nZXRwdHkiLCAmb2ZsYWcsICZtb2RlLCAmbm9mb3JrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJybm8gPSAwOwotCW5hbWUgPSBfZ2V0cHR5KCZmaWxkZXMsIG9mbGFnLCAobW9kZV90KW1vZGUsIG5vZm9yayk7Ci0JaWYgKG5hbWUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNpKSIsIG5hbWUsIGZpbGRlcyk7CisgICAgaW50IG9mbGFnOworICAgIGludCBtb2RlOworICAgIGludCBub2Zvcms7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgZmlsZGVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOl9nZXRwdHkiLCAmb2ZsYWcsICZtb2RlLCAmbm9mb3JrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJybm8gPSAwOworICAgIG5hbWUgPSBfZ2V0cHR5KCZmaWxkZXMsIG9mbGFnLCAobW9kZV90KW1vZGUsIG5vZm9yayk7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNpKSIsIG5hbWUsIGZpbGRlcyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzZ2lfbWV0aG9kc1tdID0gewotCXsibmFwIiwJCXNnaV9uYXAsCU1FVEhfVkFSQVJHU30sCi0JeyJfZ2V0cHR5IiwJc2dpX19nZXRwdHksCU1FVEhfVkFSQVJHU30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Im5hcCIsICAgICAgICAgICAgIHNnaV9uYXAsICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiX2dldHB0eSIsICAgICAgICAgc2dpX19nZXRwdHksICAgIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIAogdm9pZAogaW5pdHNnaSh2b2lkKQogewotCVB5X0luaXRNb2R1bGUoInNnaSIsIHNnaV9tZXRob2RzKTsKKyAgICBQeV9Jbml0TW9kdWxlKCJzZ2kiLCBzZ2lfbWV0aG9kcyk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NoYTI1Nm1vZHVsZS5jIGIvTW9kdWxlcy9zaGEyNTZtb2R1bGUuYwppbmRleCBiNTNkMmZmLi4yY2U4ZDkyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NoYTI1Nm1vZHVsZS5jCisrKyBiL01vZHVsZXMvc2hhMjU2bW9kdWxlLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogLyogRW5kaWFubmVzcyB0ZXN0aW5nIGFuZCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBUZXN0RW5kaWFubmVzcyh2YXJpYWJsZSkge2ludCBpPTE7IHZhcmlhYmxlPVBDVF9CSUdfRU5ESUFOO1wKLQlpZiAoKigoY2hhciopJmkpPT0xKSB2YXJpYWJsZT1QQ1RfTElUVExFX0VORElBTjt9CisgICAgICAgIGlmICgqKChjaGFyKikmaSk9PTEpIHZhcmlhYmxlPVBDVF9MSVRUTEVfRU5ESUFOO30KIAogI2RlZmluZSBQQ1RfTElUVExFX0VORElBTiAxCiAjZGVmaW5lIFBDVF9CSUdfRU5ESUFOIDAKQEAgLTMyLDcgKzMyLDcgQEAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciBTSEFfQllURTsKIAogI2lmIFNJWkVPRl9JTlQgPT0gNAotdHlwZWRlZiB1bnNpZ25lZCBpbnQgU0hBX0lOVDMyOwkvKiAzMi1iaXQgaW50ZWdlciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgU0hBX0lOVDMyOyAvKiAzMi1iaXQgaW50ZWdlciAqLwogI2Vsc2UKIC8qIG5vdCBkZWZpbmVkLiBjb21waWxhdGlvbiB3aWxsIGRpZS4gKi8KICNlbmRpZgpAQCAtNDYsMTEgKzQ2LDExIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECi0gICAgU0hBX0lOVDMyIGRpZ2VzdFs4XTsJCS8qIE1lc3NhZ2UgZGlnZXN0ICovCi0gICAgU0hBX0lOVDMyIGNvdW50X2xvLCBjb3VudF9oaTsJLyogNjQtYml0IGJpdCBjb3VudCAqLwotICAgIFNIQV9CWVRFIGRhdGFbU0hBX0JMT0NLU0laRV07CS8qIFNIQSBkYXRhIGJ1ZmZlciAqLworICAgIFNIQV9JTlQzMiBkaWdlc3RbOF07ICAgICAgICAgICAgICAgIC8qIE1lc3NhZ2UgZGlnZXN0ICovCisgICAgU0hBX0lOVDMyIGNvdW50X2xvLCBjb3VudF9oaTsgICAgICAgLyogNjQtYml0IGJpdCBjb3VudCAqLworICAgIFNIQV9CWVRFIGRhdGFbU0hBX0JMT0NLU0laRV07ICAgICAgIC8qIFNIQSBkYXRhIGJ1ZmZlciAqLwogICAgIGludCBFbmRpYW5uZXNzOwotICAgIGludCBsb2NhbDsJCQkJLyogdW5wcm9jZXNzZWQgYW1vdW50IGluIGRhdGEgKi8KKyAgICBpbnQgbG9jYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bnByb2Nlc3NlZCBhbW91bnQgaW4gZGF0YSAqLwogICAgIGludCBkaWdlc3RzaXplOwogfSBTSEFvYmplY3Q7CiAKQEAgLTYyLDcgKzYyLDcgQEAKICAgICBTSEFfSU5UMzIgdmFsdWU7CiAKICAgICBpZiAoIEVuZGlhbm5lc3MgPT0gUENUX0JJR19FTkRJQU4gKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgYnl0ZUNvdW50IC89IHNpemVvZigqYnVmZmVyKTsKICAgICB3aGlsZSAoYnl0ZUNvdW50LS0pIHsKQEAgLTExNCw3ICsxMTQsNyBAQAogKCAoKCgodW5zaWduZWQgbG9uZykoeCkmMHhGRkZGRkZGRlVMKT4+KHVuc2lnbmVkIGxvbmcpKCh5KSYzMSkpIHwgXAogKCh1bnNpZ25lZCBsb25nKSh4KTw8KHVuc2lnbmVkIGxvbmcpKDMyLSgoeSkmMzEpKSkpICYgMHhGRkZGRkZGRlVMKQogI2RlZmluZSBDaCh4LHkseikgICAgICAgKHogXiAoeCAmICh5IF4geikpKQotI2RlZmluZSBNYWooeCx5LHopICAgICAgKCgoeCB8IHkpICYgeikgfCAoeCAmIHkpKSAKKyNkZWZpbmUgTWFqKHgseSx6KSAgICAgICgoKHggfCB5KSAmIHopIHwgKHggJiB5KSkKICNkZWZpbmUgUyh4LCBuKSAgICAgICAgIFJPUigoeCksKG4pKQogI2RlZmluZSBSKHgsIG4pICAgICAgICAgKCgoeCkmMHhGRkZGRkZGRlVMKT4+KG4pKQogI2RlZmluZSBTaWdtYTAoeCkgICAgICAgKFMoeCwgMikgXiBTKHgsIDEzKSBeIFMoeCwgMjIpKQpAQCAtMTI3LDEzICsxMjcsMTMgQEAKIHNoYV90cmFuc2Zvcm0oU0hBb2JqZWN0ICpzaGFfaW5mbykKIHsKICAgICBpbnQgaTsKLQlTSEFfSU5UMzIgU1s4XSwgV1s2NF0sIHQwLCB0MTsKKyAgICAgICAgU0hBX0lOVDMyIFNbOF0sIFdbNjRdLCB0MCwgdDE7CiAKICAgICBtZW1jcHkoVywgc2hhX2luZm8tPmRhdGEsIHNpemVvZihzaGFfaW5mby0+ZGF0YSkpOwogICAgIGxvbmdSZXZlcnNlKFcsIChpbnQpc2l6ZW9mKHNoYV9pbmZvLT5kYXRhKSwgc2hhX2luZm8tPkVuZGlhbm5lc3MpOwogCiAgICAgZm9yIChpID0gMTY7IGkgPCA2NDsgKytpKSB7Ci0JCVdbaV0gPSBHYW1tYTEoV1tpIC0gMl0pICsgV1tpIC0gN10gKyBHYW1tYTAoV1tpIC0gMTVdKSArIFdbaSAtIDE2XTsKKyAgICAgICAgICAgICAgICBXW2ldID0gR2FtbWExKFdbaSAtIDJdKSArIFdbaSAtIDddICsgR2FtbWEwKFdbaSAtIDE1XSkgKyBXW2kgLSAxNl07CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKICAgICAgICAgU1tpXSA9IHNoYV9pbmZvLT5kaWdlc3RbaV07CkBAIC0yMTEsOCArMjExLDggQEAKICAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDYyLDB4YmVmOWEzZjcpOwogICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNjMsMHhjNjcxNzhmMik7CiAKLSN1bmRlZiBSTkQgICAgIAotICAgIAorI3VuZGVmIFJORAorCiAgICAgLyogZmVlZGJhY2sgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgICAgIHNoYV9pbmZvLT5kaWdlc3RbaV0gPSBzaGFfaW5mby0+ZGlnZXN0W2ldICsgU1tpXTsKQEAgLTMxNCwxNCArMzE0LDE0IEBACiAgICAgY291bnQgPSAoaW50KSAoKGxvX2JpdF9jb3VudCA+PiAzKSAmIDB4M2YpOwogICAgICgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpW2NvdW50KytdID0gMHg4MDsKICAgICBpZiAoY291bnQgPiBTSEFfQkxPQ0tTSVpFIC0gOCkgewotCW1lbXNldCgoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKSArIGNvdW50LCAwLAotCSAgICAgICBTSEFfQkxPQ0tTSVpFIC0gY291bnQpOwotCXNoYV90cmFuc2Zvcm0oc2hhX2luZm8pOwotCW1lbXNldCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEsIDAsIFNIQV9CTE9DS1NJWkUgLSA4KTsKKyAgICAgICAgbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCisgICAgICAgICAgICAgICBTSEFfQkxPQ0tTSVpFIC0gY291bnQpOworICAgICAgICBzaGFfdHJhbnNmb3JtKHNoYV9pbmZvKTsKKyAgICAgICAgbWVtc2V0KChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSwgMCwgU0hBX0JMT0NLU0laRSAtIDgpOwogICAgIH0KICAgICBlbHNlIHsKLQltZW1zZXQoKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSkgKyBjb3VudCwgMCwKLQkgICAgICAgU0hBX0JMT0NLU0laRSAtIDggLSBjb3VudCk7CisgICAgICAgIG1lbXNldCgoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKSArIGNvdW50LCAwLAorICAgICAgICAgICAgICAgU0hBX0JMT0NLU0laRSAtIDggLSBjb3VudCk7CiAgICAgfQogCiAgICAgLyogR0pTOiBub3RlIHRoYXQgd2UgYWRkIHRoZSBoaS9sbyBpbiBiaWctZW5kaWFuLiBzaGFfdHJhbnNmb3JtIHdpbGwKQEAgLTQ1NCwyMSArNDU0LDIxIEBACiAgICAgLyogQ3JlYXRlIGEgbmV3IHN0cmluZyAqLwogICAgIHJldHZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGYtPmRpZ2VzdHNpemUgKiAyKTsKICAgICBpZiAoIXJldHZhbCkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICBoZXhfZGlnZXN0ID0gUHlTdHJpbmdfQXNTdHJpbmcocmV0dmFsKTsKICAgICBpZiAoIWhleF9kaWdlc3QpIHsKLQkgICAgUHlfREVDUkVGKHJldHZhbCk7Ci0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlfREVDUkVGKHJldHZhbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBNYWtlIGhleCB2ZXJzaW9uIG9mIHRoZSBkaWdlc3QgKi8KICAgICBmb3IoaT1qPTA7IGk8c2VsZi0+ZGlnZXN0c2l6ZTsgaSsrKSB7CiAgICAgICAgIGNoYXIgYzsKICAgICAgICAgYyA9IChkaWdlc3RbaV0gPj4gNCkgJiAweGY7Ci0JYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICBjID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CiAgICAgICAgIGhleF9kaWdlc3RbaisrXSA9IGM7CiAgICAgICAgIGMgPSAoZGlnZXN0W2ldICYgMHhmKTsKLQljID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CisgICAgICAgIGMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKICAgICAgICAgaGV4X2RpZ2VzdFtqKytdID0gYzsKICAgICB9CiAgICAgcmV0dXJuIHJldHZhbDsKQEAgLTQ5MiwxMSArNDkyLDExIEBACiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBTSEFfbWV0aG9kc1tdID0gewotICAgIHsiY29weSIsCSAgKFB5Q0Z1bmN0aW9uKVNIQTI1Nl9jb3B5LCAgICAgIE1FVEhfTk9BUkdTLCAgU0hBMjU2X2NvcHlfX2RvY19ffSwKLSAgICB7ImRpZ2VzdCIsCSAgKFB5Q0Z1bmN0aW9uKVNIQTI1Nl9kaWdlc3QsICAgIE1FVEhfTk9BUkdTLCAgU0hBMjU2X2RpZ2VzdF9fZG9jX199LAorICAgIHsiY29weSIsICAgICAgKFB5Q0Z1bmN0aW9uKVNIQTI1Nl9jb3B5LCAgICAgIE1FVEhfTk9BUkdTLCAgU0hBMjU2X2NvcHlfX2RvY19ffSwKKyAgICB7ImRpZ2VzdCIsICAgIChQeUNGdW5jdGlvbilTSEEyNTZfZGlnZXN0LCAgICBNRVRIX05PQVJHUywgIFNIQTI1Nl9kaWdlc3RfX2RvY19ffSwKICAgICB7ImhleGRpZ2VzdCIsIChQeUNGdW5jdGlvbilTSEEyNTZfaGV4ZGlnZXN0LCBNRVRIX05PQVJHUywgIFNIQTI1Nl9oZXhkaWdlc3RfX2RvY19ffSwKLSAgICB7InVwZGF0ZSIsCSAgKFB5Q0Z1bmN0aW9uKVNIQTI1Nl91cGRhdGUsICAgIE1FVEhfVkFSQVJHUywgU0hBMjU2X3VwZGF0ZV9fZG9jX199LAotICAgIHtOVUxMLAkgIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsidXBkYXRlIiwgICAgKFB5Q0Z1bmN0aW9uKVNIQTI1Nl91cGRhdGUsICAgIE1FVEhfVkFSQVJHUywgU0hBMjU2X3VwZGF0ZV9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAgTlVMTH0gICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTUzNiwxMyArNTM2LDEzIEBACiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU0hBMjI0dHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLSAgICAiX3NoYTI1Ni5zaGEyMjQiLAkvKnRwX25hbWUqLwotICAgIHNpemVvZihTSEFvYmplY3QpLAkvKnRwX3NpemUqLwotICAgIDAsCQkJLyp0cF9pdGVtc2l6ZSovCisgICAgIl9zaGEyNTYuc2hhMjI0IiwgICAvKnRwX25hbWUqLworICAgIHNpemVvZihTSEFvYmplY3QpLCAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwogICAgIC8qIG1ldGhvZHMgKi8KLSAgICBTSEFfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLSAgICAwLAkJCS8qdHBfcHJpbnQqLwotICAgIDAsICAgICAgICAgIAkvKnRwX2dldGF0dHIqLworICAgIFNIQV9kZWFsbG9jLCAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KQEAgLTU1OCwyNSArNTU4LDI1IEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAvKnRwX2ZsYWdzKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwotICAgIDAsCQkJLyp0cF9jbGVhciovCi0gICAgMCwJCQkvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAwLAkJCS8qdHBfd2Vha2xpc3RvZmZzZXQqLwotICAgIDAsCQkJLyp0cF9pdGVyKi8KLSAgICAwLAkJCS8qdHBfaXRlcm5leHQqLwotICAgIFNIQV9tZXRob2RzLAkvKiB0cF9tZXRob2RzICovCi0gICAgU0hBX21lbWJlcnMsCS8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBTSEFfbWV0aG9kcywgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBTSEFfbWVtYmVycywgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICBTSEFfZ2V0c2V0ZXJzLCAgICAgIC8qIHRwX2dldHNldCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBTSEEyNTZ0eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAgICJfc2hhMjU2LnNoYTI1NiIsCS8qdHBfbmFtZSovCi0gICAgc2l6ZW9mKFNIQW9iamVjdCksCS8qdHBfc2l6ZSovCi0gICAgMCwJCQkvKnRwX2l0ZW1zaXplKi8KKyAgICAiX3NoYTI1Ni5zaGEyNTYiLCAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNIQW9iamVjdCksICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIFNIQV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotICAgIDAsCQkJLyp0cF9wcmludCovCi0gICAgMCwgICAgICAgICAgCS8qdHBfZ2V0YXR0ciovCisgICAgU0hBX2RlYWxsb2MsICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwpAQCAtNTkyLDEzICs1OTIsMTMgQEAKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsIC8qdHBfZmxhZ3MqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgMCwJCQkvKnRwX2NsZWFyKi8KLSAgICAwLAkJCS8qdHBfcmljaGNvbXBhcmUqLwotICAgIDAsCQkJLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgMCwJCQkvKnRwX2l0ZXIqLwotICAgIDAsCQkJLyp0cF9pdGVybmV4dCovCi0gICAgU0hBX21ldGhvZHMsCS8qIHRwX21ldGhvZHMgKi8KLSAgICBTSEFfbWVtYmVycywJLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIFNIQV9tZXRob2RzLCAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFNIQV9tZW1iZXJzLCAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIFNIQV9nZXRzZXRlcnMsICAgICAgLyogdHBfZ2V0c2V0ICovCiB9OwogCkBAIC02MjEsNyArNjIxLDcgQEAKICAgICB9CiAKICAgICBpZiAoKG5ldyA9IG5ld1NIQTI1Nm9iamVjdCgpKSA9PSBOVUxMKSB7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC02MjksNyArNjI5LDcgQEAKIAogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIFB5X0RFQ1JFRihuZXcpOwotCVB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoYnVmLmxlbiA+IDApIHsKQEAgLTY1Niw3ICs2NTYsNyBAQAogICAgIH0KIAogICAgIGlmICgobmV3ID0gbmV3U0hBMjI0b2JqZWN0KCkpID09IE5VTEwpIHsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZidWYpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWYpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTY2NCw3ICs2NjQsNyBAQAogCiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgUHlfREVDUkVGKG5ldyk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChidWYubGVuID4gMCkgewpAQCAtNjgxLDcgKzY4MSw3IEBACiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIFNIQV9mdW5jdGlvbnNbXSA9IHsKICAgICB7InNoYTI1NiIsIChQeUNGdW5jdGlvbilTSEEyNTZfbmV3LCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgU0hBMjU2X25ld19fZG9jX199LAogICAgIHsic2hhMjI0IiwgKFB5Q0Z1bmN0aW9uKVNIQTIyNF9uZXcsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBTSEEyMjRfbmV3X19kb2NfX30sCi0gICAge05VTEwsCU5VTEx9CQkgLyogU2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICBOVUxMfSAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAKQEAgLTcwMiw1ICs3MDIsNSBAQAogICAgICAgICByZXR1cm47CiAgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9zaGEyNTYiLCBTSEFfZnVuY3Rpb25zKTsKICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zaGE1MTJtb2R1bGUuYyBiL01vZHVsZXMvc2hhNTEybW9kdWxlLmMKaW5kZXggNGU4MzY4Yi4uZDdiMzY5OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zaGE1MTJtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NoYTUxMm1vZHVsZS5jCkBAIC0yMyw3ICsyMyw3IEBACiAKIC8qIEVuZGlhbm5lc3MgdGVzdGluZyBhbmQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgVGVzdEVuZGlhbm5lc3ModmFyaWFibGUpIHtpbnQgaT0xOyB2YXJpYWJsZT1QQ1RfQklHX0VORElBTjtcCi0JaWYgKCooKGNoYXIqKSZpKT09MSkgdmFyaWFibGU9UENUX0xJVFRMRV9FTkRJQU47fQorICAgICAgICBpZiAoKigoY2hhciopJmkpPT0xKSB2YXJpYWJsZT1QQ1RfTElUVExFX0VORElBTjt9CiAKICNkZWZpbmUgUENUX0xJVFRMRV9FTkRJQU4gMQogI2RlZmluZSBQQ1RfQklHX0VORElBTiAwCkBAIC0zMyw4ICszMyw4IEBACiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgU0hBX0JZVEU7CiAKICNpZiBTSVpFT0ZfSU5UID09IDQKLXR5cGVkZWYgdW5zaWduZWQgaW50IFNIQV9JTlQzMjsJLyogMzItYml0IGludGVnZXIgKi8KLXR5cGVkZWYgdW5zaWduZWQgUFlfTE9OR19MT05HIFNIQV9JTlQ2NDsJLyogNjQtYml0IGludGVnZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IFNIQV9JTlQzMjsgLyogMzItYml0IGludGVnZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgUFlfTE9OR19MT05HIFNIQV9JTlQ2NDsgICAgICAgIC8qIDY0LWJpdCBpbnRlZ2VyICovCiAjZWxzZQogLyogbm90IGRlZmluZWQuIGNvbXBpbGF0aW9uIHdpbGwgZGllLiAqLwogI2VuZGlmCkBAIC00OCwxMSArNDgsMTEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBTSEFfSU5UNjQgZGlnZXN0WzhdOwkJLyogTWVzc2FnZSBkaWdlc3QgKi8KLSAgICBTSEFfSU5UMzIgY291bnRfbG8sIGNvdW50X2hpOwkvKiA2NC1iaXQgYml0IGNvdW50ICovCi0gICAgU0hBX0JZVEUgZGF0YVtTSEFfQkxPQ0tTSVpFXTsJLyogU0hBIGRhdGEgYnVmZmVyICovCisgICAgU0hBX0lOVDY0IGRpZ2VzdFs4XTsgICAgICAgICAgICAgICAgLyogTWVzc2FnZSBkaWdlc3QgKi8KKyAgICBTSEFfSU5UMzIgY291bnRfbG8sIGNvdW50X2hpOyAgICAgICAvKiA2NC1iaXQgYml0IGNvdW50ICovCisgICAgU0hBX0JZVEUgZGF0YVtTSEFfQkxPQ0tTSVpFXTsgICAgICAgLyogU0hBIGRhdGEgYnVmZmVyICovCiAgICAgaW50IEVuZGlhbm5lc3M7Ci0gICAgaW50IGxvY2FsOwkJCQkvKiB1bnByb2Nlc3NlZCBhbW91bnQgaW4gZGF0YSAqLworICAgIGludCBsb2NhbDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVucHJvY2Vzc2VkIGFtb3VudCBpbiBkYXRhICovCiAgICAgaW50IGRpZ2VzdHNpemU7CiB9IFNIQW9iamVjdDsKIApAQCAtNjQsMjIgKzY0LDIyIEBACiAgICAgU0hBX0lOVDY0IHZhbHVlOwogCiAgICAgaWYgKCBFbmRpYW5uZXNzID09IFBDVF9CSUdfRU5ESUFOICkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIGJ5dGVDb3VudCAvPSBzaXplb2YoKmJ1ZmZlcik7CiAgICAgd2hpbGUgKGJ5dGVDb3VudC0tKSB7CiAgICAgICAgIHZhbHVlID0gKmJ1ZmZlcjsKIAotCQkoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbMF0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gNTYpICYgMHhmZjsKLQkJKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzFdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDQ4KSAmIDB4ZmY7Ci0JCSgodW5zaWduZWQgY2hhciopYnVmZmVyKVsyXSA9ICh1bnNpZ25lZCBjaGFyKSh2YWx1ZSA+PiA0MCkgJiAweGZmOwotCQkoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbM10gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gMzIpICYgMHhmZjsKLQkJKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzRdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDI0KSAmIDB4ZmY7Ci0JCSgodW5zaWduZWQgY2hhciopYnVmZmVyKVs1XSA9ICh1bnNpZ25lZCBjaGFyKSh2YWx1ZSA+PiAxNikgJiAweGZmOwotCQkoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbNl0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gIDgpICYgMHhmZjsKLQkJKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzddID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlICAgICAgKSAmIDB4ZmY7Ci0gICAgICAgIAotCQlidWZmZXIrKzsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbMF0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gNTYpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbMV0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gNDgpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbMl0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gNDApICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbM10gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gMzIpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbNF0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gMjQpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbNV0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbNl0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gIDgpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbN10gPSAodW5zaWduZWQgY2hhcikodmFsdWUgICAgICApICYgMHhmZjsKKworICAgICAgICAgICAgICAgIGJ1ZmZlcisrOwogICAgIH0KIH0KIApAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgKCAoKCgoeCkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSk+PigodW5zaWduZWQgUFlfTE9OR19MT05HKSh5KSAmIDYzKSkgfCBcCiAgICAgICAoKHgpPDwoKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoNjQtKCh5KSAmIDYzKSkpKSkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSkKICNkZWZpbmUgQ2goeCx5LHopICAgICAgICh6IF4gKHggJiAoeSBeIHopKSkKLSNkZWZpbmUgTWFqKHgseSx6KSAgICAgICgoKHggfCB5KSAmIHopIHwgKHggJiB5KSkgCisjZGVmaW5lIE1haih4LHkseikgICAgICAoKCh4IHwgeSkgJiB6KSB8ICh4ICYgeSkpCiAjZGVmaW5lIFMoeCwgbikgICAgICAgICBST1I2NCgoeCksKG4pKQogI2RlZmluZSBSKHgsIG4pICAgICAgICAgKCgoeCkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSkgPj4gKCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpbikpCiAjZGVmaW5lIFNpZ21hMCh4KSAgICAgICAoUyh4LCAyOCkgXiBTKHgsIDM0KSBeIFMoeCwgMzkpKQpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgbG9uZ1JldmVyc2UoVywgKGludClzaXplb2Yoc2hhX2luZm8tPmRhdGEpLCBzaGFfaW5mby0+RW5kaWFubmVzcyk7CiAKICAgICBmb3IgKGkgPSAxNjsgaSA8IDgwOyArK2kpIHsKLQkJV1tpXSA9IEdhbW1hMShXW2kgLSAyXSkgKyBXW2kgLSA3XSArIEdhbW1hMChXW2kgLSAxNV0pICsgV1tpIC0gMTZdOworICAgICAgICAgICAgICAgIFdbaV0gPSBHYW1tYTEoV1tpIC0gMl0pICsgV1tpIC0gN10gKyBHYW1tYTAoV1tpIC0gMTVdKSArIFdbaSAtIDE2XTsKICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgewogICAgICAgICBTW2ldID0gc2hhX2luZm8tPmRpZ2VzdFtpXTsKQEAgLTIzNyw4ICsyMzcsOCBAQAogICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNzgsUHlfVUxMKDB4NWZjYjZmYWIzYWQ2ZmFlYykpOwogICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNzksUHlfVUxMKDB4NmM0NDE5OGM0YTQ3NTgxNykpOwogCi0jdW5kZWYgUk5EICAgICAKLSAgICAKKyN1bmRlZiBSTkQKKwogICAgIC8qIGZlZWRiYWNrICovCiAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgICBzaGFfaW5mby0+ZGlnZXN0W2ldID0gc2hhX2luZm8tPmRpZ2VzdFtpXSArIFNbaV07CkBAIC0zNDAsMTQgKzM0MCwxNCBAQAogICAgIGNvdW50ID0gKGludCkgKChsb19iaXRfY291bnQgPj4gMykgJiAweDdmKTsKICAgICAoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKVtjb3VudCsrXSA9IDB4ODA7CiAgICAgaWYgKGNvdW50ID4gU0hBX0JMT0NLU0laRSAtIDE2KSB7Ci0JbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCi0JICAgICAgIFNIQV9CTE9DS1NJWkUgLSBjb3VudCk7Ci0Jc2hhNTEyX3RyYW5zZm9ybShzaGFfaW5mbyk7Ci0JbWVtc2V0KChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSwgMCwgU0hBX0JMT0NLU0laRSAtIDE2KTsKKyAgICAgICAgbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCisgICAgICAgICAgICAgICBTSEFfQkxPQ0tTSVpFIC0gY291bnQpOworICAgICAgICBzaGE1MTJfdHJhbnNmb3JtKHNoYV9pbmZvKTsKKyAgICAgICAgbWVtc2V0KChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSwgMCwgU0hBX0JMT0NLU0laRSAtIDE2KTsKICAgICB9CiAgICAgZWxzZSB7Ci0JbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCi0JICAgICAgIFNIQV9CTE9DS1NJWkUgLSAxNiAtIGNvdW50KTsKKyAgICAgICAgbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCisgICAgICAgICAgICAgICBTSEFfQkxPQ0tTSVpFIC0gMTYgLSBjb3VudCk7CiAgICAgfQogCiAgICAgLyogR0pTOiBub3RlIHRoYXQgd2UgYWRkIHRoZSBoaS9sbyBpbiBiaWctZW5kaWFuLiBzaGE1MTJfdHJhbnNmb3JtIHdpbGwKQEAgLTUyMCwyMSArNTIwLDIxIEBACiAgICAgLyogQ3JlYXRlIGEgbmV3IHN0cmluZyAqLwogICAgIHJldHZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGYtPmRpZ2VzdHNpemUgKiAyKTsKICAgICBpZiAoIXJldHZhbCkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICBoZXhfZGlnZXN0ID0gUHlTdHJpbmdfQXNTdHJpbmcocmV0dmFsKTsKICAgICBpZiAoIWhleF9kaWdlc3QpIHsKLQkgICAgUHlfREVDUkVGKHJldHZhbCk7Ci0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlfREVDUkVGKHJldHZhbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBNYWtlIGhleCB2ZXJzaW9uIG9mIHRoZSBkaWdlc3QgKi8KICAgICBmb3IgKGk9aj0wOyBpPHNlbGYtPmRpZ2VzdHNpemU7IGkrKykgewogICAgICAgICBjaGFyIGM7CiAgICAgICAgIGMgPSAoZGlnZXN0W2ldID4+IDQpICYgMHhmOwotCWMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwogICAgICAgICBoZXhfZGlnZXN0W2orK10gPSBjOwogICAgICAgICBjID0gKGRpZ2VzdFtpXSAmIDB4Zik7Ci0JYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICBjID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CiAgICAgICAgIGhleF9kaWdlc3RbaisrXSA9IGM7CiAgICAgfQogICAgIHJldHVybiByZXR2YWw7CkBAIC01NTgsMTEgKzU1OCwxMSBAQAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU0hBX21ldGhvZHNbXSA9IHsKLSAgICB7ImNvcHkiLAkgIChQeUNGdW5jdGlvbilTSEE1MTJfY29weSwgICAgICBNRVRIX05PQVJHUywgU0hBNTEyX2NvcHlfX2RvY19ffSwKLSAgICB7ImRpZ2VzdCIsCSAgKFB5Q0Z1bmN0aW9uKVNIQTUxMl9kaWdlc3QsICAgIE1FVEhfTk9BUkdTLCBTSEE1MTJfZGlnZXN0X19kb2NfX30sCisgICAgeyJjb3B5IiwgICAgICAoUHlDRnVuY3Rpb24pU0hBNTEyX2NvcHksICAgICAgTUVUSF9OT0FSR1MsIFNIQTUxMl9jb3B5X19kb2NfX30sCisgICAgeyJkaWdlc3QiLCAgICAoUHlDRnVuY3Rpb24pU0hBNTEyX2RpZ2VzdCwgICAgTUVUSF9OT0FSR1MsIFNIQTUxMl9kaWdlc3RfX2RvY19ffSwKICAgICB7ImhleGRpZ2VzdCIsIChQeUNGdW5jdGlvbilTSEE1MTJfaGV4ZGlnZXN0LCBNRVRIX05PQVJHUywgU0hBNTEyX2hleGRpZ2VzdF9fZG9jX199LAotICAgIHsidXBkYXRlIiwJICAoUHlDRnVuY3Rpb24pU0hBNTEyX3VwZGF0ZSwgICAgTUVUSF9WQVJBUkdTLCBTSEE1MTJfdXBkYXRlX19kb2NfX30sCi0gICAge05VTEwsCSAgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJ1cGRhdGUiLCAgICAoUHlDRnVuY3Rpb24pU0hBNTEyX3VwZGF0ZSwgICAgTUVUSF9WQVJBUkdTLCBTSEE1MTJfdXBkYXRlX19kb2NfX30sCisgICAge05VTEwsICAgICAgICBOVUxMfSAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNjAyLDEzICs2MDIsMTMgQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBTSEEzODR0eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAgICJfc2hhNTEyLnNoYTM4NCIsCS8qdHBfbmFtZSovCi0gICAgc2l6ZW9mKFNIQW9iamVjdCksCS8qdHBfc2l6ZSovCi0gICAgMCwJCQkvKnRwX2l0ZW1zaXplKi8KKyAgICAiX3NoYTUxMi5zaGEzODQiLCAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNIQW9iamVjdCksICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIFNIQTUxMl9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotICAgIDAsCQkJLyp0cF9wcmludCovCi0gICAgMCwgICAgICAgICAgCS8qdHBfZ2V0YXR0ciovCisgICAgU0hBNTEyX2RlYWxsb2MsICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwpAQCAtNjI0LDI1ICs2MjQsMjUgQEAKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsIC8qdHBfZmxhZ3MqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgMCwJCQkvKnRwX2NsZWFyKi8KLSAgICAwLAkJCS8qdHBfcmljaGNvbXBhcmUqLwotICAgIDAsCQkJLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgMCwJCQkvKnRwX2l0ZXIqLwotICAgIDAsCQkJLyp0cF9pdGVybmV4dCovCi0gICAgU0hBX21ldGhvZHMsCS8qIHRwX21ldGhvZHMgKi8KLSAgICBTSEFfbWVtYmVycywJLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIFNIQV9tZXRob2RzLCAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFNIQV9tZW1iZXJzLCAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIFNIQV9nZXRzZXRlcnMsICAgICAgLyogdHBfZ2V0c2V0ICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNIQTUxMnR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9zaGE1MTIuc2hhNTEyIiwJLyp0cF9uYW1lKi8KLSAgICBzaXplb2YoU0hBb2JqZWN0KSwJLyp0cF9zaXplKi8KLSAgICAwLAkJCS8qdHBfaXRlbXNpemUqLworICAgICJfc2hhNTEyLnNoYTUxMiIsICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoU0hBb2JqZWN0KSwgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgU0hBNTEyX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0gICAgMCwJCQkvKnRwX3ByaW50Ki8KLSAgICAwLCAgICAgICAgICAJLyp0cF9nZXRhdHRyKi8KKyAgICBTSEE1MTJfZGVhbGxvYywgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCkBAIC02NTgsMTMgKzY1OCwxMyBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyp0cF9mbGFncyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAwLAkJCS8qdHBfY2xlYXIqLwotICAgIDAsCQkJLyp0cF9yaWNoY29tcGFyZSovCi0gICAgMCwJCQkvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAwLAkJCS8qdHBfaXRlciovCi0gICAgMCwJCQkvKnRwX2l0ZXJuZXh0Ki8KLSAgICBTSEFfbWV0aG9kcywJLyogdHBfbWV0aG9kcyAqLwotICAgIFNIQV9tZW1iZXJzLAkvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgU0hBX21ldGhvZHMsICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgU0hBX21lbWJlcnMsICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgU0hBX2dldHNldGVycywgICAgICAvKiB0cF9nZXRzZXQgKi8KIH07CiAKQEAgLTY4Nyw3ICs2ODcsNyBAQAogICAgIH0KIAogICAgIGlmICgobmV3ID0gbmV3U0hBNTEyb2JqZWN0KCkpID09IE5VTEwpIHsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZidWYpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWYpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTY5NSw3ICs2OTUsNyBAQAogCiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgUHlfREVDUkVGKG5ldyk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChidWYubGVuID4gMCkgewpAQCAtNzIyLDcgKzcyMiw3IEBACiAgICAgfQogCiAgICAgaWYgKChuZXcgPSBuZXdTSEEzODRvYmplY3QoKSkgPT0gTlVMTCkgewotCVB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtNzMwLDcgKzczMCw3IEBACiAKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBQeV9ERUNSRUYobmV3KTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZidWYpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWYpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKGJ1Zi5sZW4gPiAwKSB7CkBAIC03NDcsNyArNzQ3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgU0hBX2Z1bmN0aW9uc1tdID0gewogICAgIHsic2hhNTEyIiwgKFB5Q0Z1bmN0aW9uKVNIQTUxMl9uZXcsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBTSEE1MTJfbmV3X19kb2NfX30sCiAgICAgeyJzaGEzODQiLCAoUHlDRnVuY3Rpb24pU0hBMzg0X25ldywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFNIQTM4NF9uZXdfX2RvY19ffSwKLSAgICB7TlVMTCwJTlVMTH0JCSAvKiBTZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgIE5VTEx9ICAgICAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIApAQCAtNzY4LDcgKzc2OCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICBtID0gUHlfSW5pdE1vZHVsZSgiX3NoYTUxMiIsIFNIQV9mdW5jdGlvbnMpOwogICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zaGFtb2R1bGUuYyBiL01vZHVsZXMvc2hhbW9kdWxlLmMKaW5kZXggNmU3YjY5ZS4uYTg2ZTcyMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zaGFtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NoYW1vZHVsZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIC8qIEVuZGlhbm5lc3MgdGVzdGluZyBhbmQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgVGVzdEVuZGlhbm5lc3ModmFyaWFibGUpIHtpbnQgaT0xOyB2YXJpYWJsZT1QQ1RfQklHX0VORElBTjtcCi0JaWYgKCooKGNoYXIqKSZpKT09MSkgdmFyaWFibGU9UENUX0xJVFRMRV9FTkRJQU47fQorICAgICAgICBpZiAoKigoY2hhciopJmkpPT0xKSB2YXJpYWJsZT1QQ1RfTElUVExFX0VORElBTjt9CiAKICNkZWZpbmUgUENUX0xJVFRMRV9FTkRJQU4gMQogI2RlZmluZSBQQ1RfQklHX0VORElBTiAwCkBAIC0zMSw3ICszMSw3IEBACiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgU0hBX0JZVEU7CiAKICNpZiBTSVpFT0ZfSU5UID09IDQKLXR5cGVkZWYgdW5zaWduZWQgaW50IFNIQV9JTlQzMjsJLyogMzItYml0IGludGVnZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IFNIQV9JTlQzMjsgLyogMzItYml0IGludGVnZXIgKi8KICNlbHNlCiAvKiBub3QgZGVmaW5lZC4gY29tcGlsYXRpb24gd2lsbCBkaWUuICovCiAjZW5kaWYKQEAgLTQ1LDExICs0NSwxMSBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIFNIQV9JTlQzMiBkaWdlc3RbNV07CQkvKiBNZXNzYWdlIGRpZ2VzdCAqLwotICAgIFNIQV9JTlQzMiBjb3VudF9sbywgY291bnRfaGk7CS8qIDY0LWJpdCBiaXQgY291bnQgKi8KLSAgICBTSEFfQllURSBkYXRhW1NIQV9CTE9DS1NJWkVdOwkvKiBTSEEgZGF0YSBidWZmZXIgKi8KKyAgICBTSEFfSU5UMzIgZGlnZXN0WzVdOyAgICAgICAgICAgICAgICAvKiBNZXNzYWdlIGRpZ2VzdCAqLworICAgIFNIQV9JTlQzMiBjb3VudF9sbywgY291bnRfaGk7ICAgICAgIC8qIDY0LWJpdCBiaXQgY291bnQgKi8KKyAgICBTSEFfQllURSBkYXRhW1NIQV9CTE9DS1NJWkVdOyAgICAgICAvKiBTSEEgZGF0YSBidWZmZXIgKi8KICAgICBpbnQgRW5kaWFubmVzczsKLSAgICBpbnQgbG9jYWw7CQkJCS8qIHVucHJvY2Vzc2VkIGFtb3VudCBpbiBkYXRhICovCisgICAgaW50IGxvY2FsOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5wcm9jZXNzZWQgYW1vdW50IGluIGRhdGEgKi8KIH0gU0hBb2JqZWN0OwogCiAvKiBXaGVuIHJ1biBvbiBhIGxpdHRsZS1lbmRpYW4gQ1BVIHdlIG5lZWQgdG8gcGVyZm9ybSBieXRlIHJldmVyc2FsIG9uIGFuCkBAIC02MCw3ICs2MCw3IEBACiAgICAgU0hBX0lOVDMyIHZhbHVlOwogCiAgICAgaWYgKCBFbmRpYW5uZXNzID09IFBDVF9CSUdfRU5ESUFOICkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIGJ5dGVDb3VudCAvPSBzaXplb2YoKmJ1ZmZlcik7CiAgICAgd2hpbGUgKGJ5dGVDb3VudC0tKSB7CkBAIC0xMTEsNDggKzExMSw0OCBAQAogICAgc2F2ZSBvbmUgYm9vbGVhbiBvcGVyYXRpb24gZWFjaCAtIHRoYW5rcyB0byBSaWNoIFNjaHJvZXBwZWwsCiAgICByY3NAY3MuYXJpem9uYS5lZHUgZm9yIGRpc2NvdmVyaW5nIHRoaXMgKi8KIAotLyojZGVmaW5lIGYxKHgseSx6KQkoKHggJiB5KSB8ICh+eCAmIHopKQkJLy8gUm91bmRzICAwLTE5ICovCi0jZGVmaW5lIGYxKHgseSx6KQkoeiBeICh4ICYgKHkgXiB6KSkpCQkvKiBSb3VuZHMgIDAtMTkgKi8KLSNkZWZpbmUgZjIoeCx5LHopCSh4IF4geSBeIHopCQkJLyogUm91bmRzIDIwLTM5ICovCi0vKiNkZWZpbmUgZjMoeCx5LHopCSgoeCAmIHkpIHwgKHggJiB6KSB8ICh5ICYgeikpCS8vIFJvdW5kcyA0MC01OSAqLwotI2RlZmluZSBmMyh4LHkseikJKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKQkvKiBSb3VuZHMgNDAtNTkgKi8KLSNkZWZpbmUgZjQoeCx5LHopCSh4IF4geSBeIHopCQkJLyogUm91bmRzIDYwLTc5ICovCisvKiNkZWZpbmUgZjEoeCx5LHopICAgICAoKHggJiB5KSB8ICh+eCAmIHopKSAgICAgICAgICAgIC8vIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBmMSh4LHkseikgICAgICAgKHogXiAoeCAmICh5IF4geikpKSAgICAgICAgICAgICAvKiBSb3VuZHMgIDAtMTkgKi8KKyNkZWZpbmUgZjIoeCx5LHopICAgICAgICh4IF4geSBeIHopICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDIwLTM5ICovCisvKiNkZWZpbmUgZjMoeCx5LHopICAgICAoKHggJiB5KSB8ICh4ICYgeikgfCAoeSAmIHopKSAgIC8vIFJvdW5kcyA0MC01OSAqLworI2RlZmluZSBmMyh4LHkseikgICAgICAgKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKSAgICAgICAvKiBSb3VuZHMgNDAtNTkgKi8KKyNkZWZpbmUgZjQoeCx5LHopICAgICAgICh4IF4geSBeIHopICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDYwLTc5ICovCiAKIC8qIFNIQSBjb25zdGFudHMgKi8KIAotI2RlZmluZSBDT05TVDEJCTB4NWE4Mjc5OTlMCQkJLyogUm91bmRzICAwLTE5ICovCi0jZGVmaW5lIENPTlNUMgkJMHg2ZWQ5ZWJhMUwJCQkvKiBSb3VuZHMgMjAtMzkgKi8KLSNkZWZpbmUgQ09OU1QzCQkweDhmMWJiY2RjTAkJCS8qIFJvdW5kcyA0MC01OSAqLwotI2RlZmluZSBDT05TVDQJCTB4Y2E2MmMxZDZMCQkJLyogUm91bmRzIDYwLTc5ICovCisjZGVmaW5lIENPTlNUMSAgICAgICAgICAweDVhODI3OTk5TCAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBDT05TVDIgICAgICAgICAgMHg2ZWQ5ZWJhMUwgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgMjAtMzkgKi8KKyNkZWZpbmUgQ09OU1QzICAgICAgICAgIDB4OGYxYmJjZGNMICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDQwLTU5ICovCisjZGVmaW5lIENPTlNUNCAgICAgICAgICAweGNhNjJjMWQ2TCAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyA2MC03OSAqLwogCiAvKiAzMi1iaXQgcm90YXRlICovCiAKLSNkZWZpbmUgUjMyKHgsbikJKCh4IDw8IG4pIHwgKHggPj4gKDMyIC0gbikpKQorI2RlZmluZSBSMzIoeCxuKSAgICAgICAgKCh4IDw8IG4pIHwgKHggPj4gKDMyIC0gbikpKQogCiAvKiB0aGUgZ2VuZXJpYyBjYXNlLCBmb3Igd2hlbiB0aGUgb3ZlcmFsbCByb3RhdGlvbiBpcyBub3QgdW5yYXZlbGVkICovCiAKLSNkZWZpbmUgRkcobikJXAotICAgIFQgPSBSMzIoQSw1KSArIGYjI24oQixDLEQpICsgRSArICpXUCsrICsgQ09OU1QjI247CVwKKyNkZWZpbmUgRkcobikgICBcCisgICAgVCA9IFIzMihBLDUpICsgZiMjbihCLEMsRCkgKyBFICsgKldQKysgKyBDT05TVCMjbjsgIFwKICAgICBFID0gRDsgRCA9IEM7IEMgPSBSMzIoQiwzMCk7IEIgPSBBOyBBID0gVAogCiAvKiBzcGVjaWZpYyBjYXNlcywgZm9yIHdoZW4gdGhlIG92ZXJhbGwgcm90YXRpb24gaXMgdW5yYXZlbGVkICovCiAKLSNkZWZpbmUgRkEobikJXAorI2RlZmluZSBGQShuKSAgIFwKICAgICBUID0gUjMyKEEsNSkgKyBmIyNuKEIsQyxEKSArIEUgKyAqV1ArKyArIENPTlNUIyNuOyBCID0gUjMyKEIsMzApCiAKLSNkZWZpbmUgRkIobikJXAorI2RlZmluZSBGQihuKSAgIFwKICAgICBFID0gUjMyKFQsNSkgKyBmIyNuKEEsQixDKSArIEQgKyAqV1ArKyArIENPTlNUIyNuOyBBID0gUjMyKEEsMzApCiAKLSNkZWZpbmUgRkMobikJXAorI2RlZmluZSBGQyhuKSAgIFwKICAgICBEID0gUjMyKEUsNSkgKyBmIyNuKFQsQSxCKSArIEMgKyAqV1ArKyArIENPTlNUIyNuOyBUID0gUjMyKFQsMzApCiAKLSNkZWZpbmUgRkQobikJXAorI2RlZmluZSBGRChuKSAgIFwKICAgICBDID0gUjMyKEQsNSkgKyBmIyNuKEUsVCxBKSArIEIgKyAqV1ArKyArIENPTlNUIyNuOyBFID0gUjMyKEUsMzApCiAKLSNkZWZpbmUgRkUobikJXAorI2RlZmluZSBGRShuKSAgIFwKICAgICBCID0gUjMyKEMsNSkgKyBmIyNuKEQsRSxUKSArIEEgKyAqV1ArKyArIENPTlNUIyNuOyBEID0gUjMyKEQsMzApCiAKLSNkZWZpbmUgRlQobikJXAorI2RlZmluZSBGVChuKSAgIFwKICAgICBBID0gUjMyKEIsNSkgKyBmIyNuKEMsRCxFKSArIFQgKyAqV1ArKyArIENPTlNUIyNuOyBDID0gUjMyKEMsMzApCiAKIC8qIGRvIFNIQSB0cmFuc2Zvcm1hdGlvbiAqLwpAQCAtMTY3LDEwICsxNjcsMTAgQEAKICAgICBsb25nUmV2ZXJzZShXLCAoaW50KXNpemVvZihzaGFfaW5mby0+ZGF0YSksIHNoYV9pbmZvLT5FbmRpYW5uZXNzKTsKIAogICAgIGZvciAoaSA9IDE2OyBpIDwgODA7ICsraSkgewotCVdbaV0gPSBXW2ktM10gXiBXW2ktOF0gXiBXW2ktMTRdIF4gV1tpLTE2XTsKKyAgICAgICAgV1tpXSA9IFdbaS0zXSBeIFdbaS04XSBeIFdbaS0xNF0gXiBXW2ktMTZdOwogCi0JLyogZXh0cmEgcm90YXRpb24gZml4ICovCi0JV1tpXSA9IFIzMihXW2ldLCAxKTsKKyAgICAgICAgLyogZXh0cmEgcm90YXRpb24gZml4ICovCisgICAgICAgIFdbaV0gPSBSMzIoV1tpXSwgMSk7CiAgICAgfQogICAgIEEgPSBzaGFfaW5mby0+ZGlnZXN0WzBdOwogICAgIEIgPSBzaGFfaW5mby0+ZGlnZXN0WzFdOwpAQCAtMjg2LDE0ICsyODYsMTQgQEAKICAgICBjb3VudCA9IChpbnQpICgobG9fYml0X2NvdW50ID4+IDMpICYgMHgzZik7CiAgICAgKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSlbY291bnQrK10gPSAweDgwOwogICAgIGlmIChjb3VudCA+IFNIQV9CTE9DS1NJWkUgLSA4KSB7Ci0JbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCi0JICAgICAgIFNIQV9CTE9DS1NJWkUgLSBjb3VudCk7Ci0Jc2hhX3RyYW5zZm9ybShzaGFfaW5mbyk7Ci0JbWVtc2V0KChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSwgMCwgU0hBX0JMT0NLU0laRSAtIDgpOworICAgICAgICBtZW1zZXQoKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSkgKyBjb3VudCwgMCwKKyAgICAgICAgICAgICAgIFNIQV9CTE9DS1NJWkUgLSBjb3VudCk7CisgICAgICAgIHNoYV90cmFuc2Zvcm0oc2hhX2luZm8pOworICAgICAgICBtZW1zZXQoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhLCAwLCBTSEFfQkxPQ0tTSVpFIC0gOCk7CiAgICAgfQogICAgIGVsc2UgewotCW1lbXNldCgoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKSArIGNvdW50LCAwLAotCSAgICAgICBTSEFfQkxPQ0tTSVpFIC0gOCAtIGNvdW50KTsKKyAgICAgICAgbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCisgICAgICAgICAgICAgICBTSEFfQkxPQ0tTSVpFIC0gOCAtIGNvdW50KTsKICAgICB9CiAKICAgICAvKiBHSlM6IG5vdGUgdGhhdCB3ZSBhZGQgdGhlIGhpL2xvIGluIGJpZy1lbmRpYW4uIHNoYV90cmFuc2Zvcm0gd2lsbApAQCAtNDAyLDIxICs0MDIsMjEgQEAKICAgICAvKiBDcmVhdGUgYSBuZXcgc3RyaW5nICovCiAgICAgcmV0dmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZW9mKGRpZ2VzdCkgKiAyKTsKICAgICBpZiAoIXJldHZhbCkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICBoZXhfZGlnZXN0ID0gUHlTdHJpbmdfQXNTdHJpbmcocmV0dmFsKTsKICAgICBpZiAoIWhleF9kaWdlc3QpIHsKLQkgICAgUHlfREVDUkVGKHJldHZhbCk7Ci0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlfREVDUkVGKHJldHZhbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBNYWtlIGhleCB2ZXJzaW9uIG9mIHRoZSBkaWdlc3QgKi8KICAgICBmb3IoaT1qPTA7IGk8c2l6ZW9mKGRpZ2VzdCk7IGkrKykgewogICAgICAgICBjaGFyIGM7CiAgICAgICAgIGMgPSAoZGlnZXN0W2ldID4+IDQpICYgMHhmOwotCWMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwogICAgICAgICBoZXhfZGlnZXN0W2orK10gPSBjOwogICAgICAgICBjID0gKGRpZ2VzdFtpXSAmIDB4Zik7Ci0JYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICBjID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CiAgICAgICAgIGhleF9kaWdlc3RbaisrXSA9IGM7CiAgICAgfQogICAgIHJldHVybiByZXR2YWw7CkBAIC00NDEsMTEgKzQ0MSwxMSBAQAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU0hBX21ldGhvZHNbXSA9IHsKLSAgICB7ImNvcHkiLAkgIChQeUNGdW5jdGlvbilTSEFfY29weSwgICAgICBNRVRIX05PQVJHUywgIFNIQV9jb3B5X19kb2NfX30sCi0gICAgeyJkaWdlc3QiLAkgIChQeUNGdW5jdGlvbilTSEFfZGlnZXN0LCAgICBNRVRIX05PQVJHUywgIFNIQV9kaWdlc3RfX2RvY19ffSwKKyAgICB7ImNvcHkiLCAgICAgIChQeUNGdW5jdGlvbilTSEFfY29weSwgICAgICBNRVRIX05PQVJHUywgIFNIQV9jb3B5X19kb2NfX30sCisgICAgeyJkaWdlc3QiLCAgICAoUHlDRnVuY3Rpb24pU0hBX2RpZ2VzdCwgICAgTUVUSF9OT0FSR1MsICBTSEFfZGlnZXN0X19kb2NfX30sCiAgICAgeyJoZXhkaWdlc3QiLCAoUHlDRnVuY3Rpb24pU0hBX2hleGRpZ2VzdCwgTUVUSF9OT0FSR1MsICBTSEFfaGV4ZGlnZXN0X19kb2NfX30sCi0gICAgeyJ1cGRhdGUiLAkgIChQeUNGdW5jdGlvbilTSEFfdXBkYXRlLCAgICBNRVRIX1ZBUkFSR1MsIFNIQV91cGRhdGVfX2RvY19ffSwKLSAgICB7TlVMTCwJICBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InVwZGF0ZSIsICAgIChQeUNGdW5jdGlvbilTSEFfdXBkYXRlLCAgICBNRVRIX1ZBUkFSR1MsIFNIQV91cGRhdGVfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgIE5VTEx9ICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00OTAsMTIgKzQ5MCwxMiBAQAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNIQXR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9zaGEuc2hhIiwJCS8qdHBfbmFtZSovCi0gICAgc2l6ZW9mKFNIQW9iamVjdCksCS8qdHBfc2l6ZSovCi0gICAgMCwJCQkvKnRwX2l0ZW1zaXplKi8KKyAgICAiX3NoYS5zaGEiLCAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNIQW9iamVjdCksICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIFNIQV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotICAgIDAsCQkJLyp0cF9wcmludCovCisgICAgU0hBX2RlYWxsb2MsICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCkBAIC01MTIsMTIgKzUxMiwxMiBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyp0cF9mbGFncyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAwLAkJCS8qdHBfY2xlYXIqLwotICAgIDAsCQkJLyp0cF9yaWNoY29tcGFyZSovCi0gICAgMCwJCQkvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAwLAkJCS8qdHBfaXRlciovCi0gICAgMCwJCQkvKnRwX2l0ZXJuZXh0Ki8KLSAgICBTSEFfbWV0aG9kcywJLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIFNIQV9tZXRob2RzLCAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIFNIQV9nZXRzZXRlcnMsICAgICAgLyogdHBfZ2V0c2V0ICovCiB9OwpAQCAtNTQzLDcgKzU0Myw3IEBACiAgICAgfQogCiAgICAgaWYgKChuZXcgPSBuZXdTSEFvYmplY3QoKSkgPT0gTlVMTCkgewotCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC01NTEsNyArNTUxLDcgQEAKIAogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIFB5X0RFQ1JFRihuZXcpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmICh2aWV3LmxlbiA+IDApIHsKQEAgLTU2OCw3ICs1NjgsNyBAQAogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIFNIQV9mdW5jdGlvbnNbXSA9IHsKICAgICB7Im5ldyIsIChQeUNGdW5jdGlvbilTSEFfbmV3LCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgU0hBX25ld19fZG9jX199LAotICAgIHtOVUxMLAlOVUxMfQkJIC8qIFNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgTlVMTH0gICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogCkBAIC01ODYsMTIgKzU4NiwxMiBAQAogICAgICAgICByZXR1cm47CiAgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9zaGEiLCBTSEFfZnVuY3Rpb25zKTsKICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KICAgICBpbnNpbnQoImJsb2Nrc2l6ZSIsIDEpOyAgLyogRm9yIGZ1dHVyZSB1c2UsIGluIGNhc2Ugc29tZSBoYXNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyByZXF1aXJlIGFuIGludGVncmFsIG51bWJlciBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgKi8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAqLwogICAgIGluc2ludCgiZGlnZXN0c2l6ZSIsIDIwKTsKICAgICBpbnNpbnQoImRpZ2VzdF9zaXplIiwgMjApOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zaWduYWxtb2R1bGUuYyBiL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMKaW5kZXggYjFlZTg5MC4uOWRjNzgxZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zaWduYWxtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NpZ25hbG1vZHVsZS5jCkBAIC0zNCwxMyArMzQsMTMgQEAKIAogI2lmbmRlZiBOU0lHCiAjIGlmIGRlZmluZWQoX05TSUcpCi0jICBkZWZpbmUgTlNJRyBfTlNJRwkJLyogRm9yIEJTRC9TeXNWICovCisjICBkZWZpbmUgTlNJRyBfTlNJRyAgICAgICAgICAgIC8qIEZvciBCU0QvU3lzViAqLwogIyBlbGlmIGRlZmluZWQoX1NJR01BWCkKLSMgIGRlZmluZSBOU0lHIChfU0lHTUFYICsgMSkJLyogRm9yIFFOWCAqLworIyAgZGVmaW5lIE5TSUcgKF9TSUdNQVggKyAxKSAgICAvKiBGb3IgUU5YICovCiAjIGVsaWYgZGVmaW5lZChTSUdNQVgpCi0jICBkZWZpbmUgTlNJRyAoU0lHTUFYICsgMSkJLyogRm9yIGRqZ3BwICovCisjICBkZWZpbmUgTlNJRyAoU0lHTUFYICsgMSkgICAgIC8qIEZvciBkamdwcCAqLwogIyBlbHNlCi0jICBkZWZpbmUgTlNJRyA2NAkJLyogVXNlIGEgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlICovCisjICBkZWZpbmUgTlNJRyA2NCAgICAgICAgICAgICAgIC8qIFVzZSBhIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZSAqLwogIyBlbmRpZgogI2VuZGlmCiAKQEAgLTgyLDggKzgyLDggQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHsKLSAgICAgICAgaW50IHRyaXBwZWQ7Ci0gICAgICAgIFB5T2JqZWN0ICpmdW5jOworICAgIGludCB0cmlwcGVkOworICAgIFB5T2JqZWN0ICpmdW5jOwogfSBIYW5kbGVyc1tOU0lHXTsKIAogc3RhdGljIHNpZ19hdG9taWNfdCB3YWtldXBfZmQgPSAtMTsKQEAgLTEyNiwxOCArMTI2LDE4IEBACiAKICAgICByID0gUHlUdXBsZV9OZXcoMik7CiAgICAgaWYgKHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZighKHYgPSBQeUZsb2F0X0Zyb21Eb3VibGUoZG91YmxlX2Zyb21fdGltZXZhbCgmaXYtPml0X3ZhbHVlKSkpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihyKTsgICAKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHIpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIFB5VHVwbGVfU0VUX0lURU0ociwgMCwgdik7CiAKICAgICBpZighKHYgPSBQeUZsb2F0X0Zyb21Eb3VibGUoZG91YmxlX2Zyb21fdGltZXZhbCgmaXYtPml0X2ludGVydmFsKSkpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHIpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIFB5VHVwbGVfU0VUX0lURU0ociwgMSwgdik7CkBAIC0xNDksOCArMTQ5LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzaWduYWxfZGVmYXVsdF9pbnRfaGFuZGxlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlFcnJfU2V0Tm9uZShQeUV4Y19LZXlib2FyZEludGVycnVwdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19LZXlib2FyZEludGVycnVwdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihkZWZhdWx0X2ludF9oYW5kbGVyX2RvYywKQEAgLTE2Myw3ICsxNjMsNyBAQAogc3RhdGljIGludAogY2hlY2tzaWduYWxzX3dpdGhhcmcodm9pZCAqIHVudXNlZCkKIHsKLQlyZXR1cm4gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CisgICAgcmV0dXJuIFB5RXJyX0NoZWNrU2lnbmFscygpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTcxLDM4ICsxNzEsMzggQEAKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAogI2lmZGVmIFdJVEhfUFRICi0JaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkgewotCQlwdGhfcmFpc2UoKihwdGhfdCAqKSBtYWluX3RocmVhZCwgc2lnX251bSk7Ci0JCXJldHVybjsKLQl9CisgICAgaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkgeworICAgICAgICBwdGhfcmFpc2UoKihwdGhfdCAqKSBtYWluX3RocmVhZCwgc2lnX251bSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAjZW5kaWYKLQkvKiBTZWUgTk9URVMgc2VjdGlvbiBhYm92ZSAqLwotCWlmIChnZXRwaWQoKSA9PSBtYWluX3BpZCkgeworICAgIC8qIFNlZSBOT1RFUyBzZWN0aW9uIGFib3ZlICovCisgICAgaWYgKGdldHBpZCgpID09IG1haW5fcGlkKSB7CiAjZW5kaWYKLQkJSGFuZGxlcnNbc2lnX251bV0udHJpcHBlZCA9IDE7Ci0gICAgICAgICAgICAgICAgLyogU2V0IGlzX3RyaXBwZWQgYWZ0ZXIgc2V0dGluZyAudHJpcHBlZCwgYXMgaXQgZ2V0cwotICAgICAgICAgICAgICAgICAgIGNsZWFyZWQgaW4gUHlFcnJfQ2hlY2tTaWduYWxzKCkgYmVmb3JlIC50cmlwcGVkLiAqLwotCQlpc190cmlwcGVkID0gMTsKLQkJUHlfQWRkUGVuZGluZ0NhbGwoY2hlY2tzaWduYWxzX3dpdGhhcmcsIE5VTEwpOwotCQlpZiAod2FrZXVwX2ZkICE9IC0xKQotCQkJd3JpdGUod2FrZXVwX2ZkLCAiXDAiLCAxKTsKKyAgICAgICAgSGFuZGxlcnNbc2lnX251bV0udHJpcHBlZCA9IDE7CisgICAgICAgIC8qIFNldCBpc190cmlwcGVkIGFmdGVyIHNldHRpbmcgLnRyaXBwZWQsIGFzIGl0IGdldHMKKyAgICAgICAgICAgY2xlYXJlZCBpbiBQeUVycl9DaGVja1NpZ25hbHMoKSBiZWZvcmUgLnRyaXBwZWQuICovCisgICAgICAgIGlzX3RyaXBwZWQgPSAxOworICAgICAgICBQeV9BZGRQZW5kaW5nQ2FsbChjaGVja3NpZ25hbHNfd2l0aGFyZywgTlVMTCk7CisgICAgICAgIGlmICh3YWtldXBfZmQgIT0gLTEpCisgICAgICAgICAgICB3cml0ZSh3YWtldXBfZmQsICJcMCIsIDEpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JfQorICAgIH0KICNlbmRpZgogI2lmZGVmIFNJR0NITEQKLQlpZiAoc2lnX251bSA9PSBTSUdDSExEKSB7Ci0JCS8qIFRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiwgdGhpcyBzaWduYWwgcmVtYWlucwotCQkgICByZXNldCB1bnRpbCBleHBsaWNpdCByZS1pbnN0YXRlZC4KLQkJICAgRG9uJ3QgY2xlYXIgdGhlICdmdW5jJyBmaWVsZCBhcyBpdCBpcyBvdXIgcG9pbnRlcgotCQkgICB0byB0aGUgUHl0aG9uIGhhbmRsZXIuLi4gKi8KLQkJcmV0dXJuOwotCX0KKyAgICBpZiAoc2lnX251bSA9PSBTSUdDSExEKSB7CisgICAgICAgIC8qIFRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiwgdGhpcyBzaWduYWwgcmVtYWlucworICAgICAgICAgICByZXNldCB1bnRpbCBleHBsaWNpdCByZS1pbnN0YXRlZC4KKyAgICAgICAgICAgRG9uJ3QgY2xlYXIgdGhlICdmdW5jJyBmaWVsZCBhcyBpdCBpcyBvdXIgcG9pbnRlcgorICAgICAgICAgICB0byB0aGUgUHl0aG9uIGhhbmRsZXIuLi4gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KICNlbmRpZgogI2lmbmRlZiBIQVZFX1NJR0FDVElPTgotCS8qIElmIHRoZSBoYW5kbGVyIHdhcyBub3Qgc2V0IHVwIHdpdGggc2lnYWN0aW9uLCByZWluc3RhbGwgaXQuICBTZWUKLQkgKiBQeXRob24vcHl0aG9ucnVuLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBQeU9TX3NldHNpZyB3aGljaAotCSAqIG1ha2VzIHRoaXMgdHJ1ZS4gIFNlZSBhbHNvIGlzc3VlODM1NC4gKi8KLQlQeU9TX3NldHNpZyhzaWdfbnVtLCBzaWduYWxfaGFuZGxlcik7CisgICAgLyogSWYgdGhlIGhhbmRsZXIgd2FzIG5vdCBzZXQgdXAgd2l0aCBzaWdhY3Rpb24sIHJlaW5zdGFsbCBpdC4gIFNlZQorICAgICAqIFB5dGhvbi9weXRob25ydW4uYyBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIFB5T1Nfc2V0c2lnIHdoaWNoCisgICAgICogbWFrZXMgdGhpcyB0cnVlLiAgU2VlIGFsc28gaXNzdWU4MzU0LiAqLworICAgIFB5T1Nfc2V0c2lnKHNpZ19udW0sIHNpZ25hbF9oYW5kbGVyKTsKICNlbmRpZgogfQogCkBAIC0yMTEsMTEgKzIxMSwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNpZ25hbF9hbGFybShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmFsYXJtIiwgJnQpKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBhbGFybSgpIHJldHVybnMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHJlbWFpbmluZyAqLwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylhbGFybSh0KSk7CisgICAgaW50IHQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmFsYXJtIiwgJnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBhbGFybSgpIHJldHVybnMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHJlbWFpbmluZyAqLworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylhbGFybSh0KSk7CiB9CiAKIFB5RG9jX1NUUlZBUihhbGFybV9kb2MsCkBAIC0yMjgsMTcgKzIyOCwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNpZ25hbF9wYXVzZShQeU9iamVjdCAqc2VsZikKIHsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JKHZvaWQpcGF1c2UoKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCS8qIG1ha2Ugc3VyZSB0aGF0IGFueSBleGNlcHRpb25zIHRoYXQgZ290IHJhaXNlZCBhcmUgcHJvcGFnYXRlZAotCSAqIGJhY2sgaW50byBQeXRob24KLQkgKi8KLQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpCi0JCXJldHVybiBOVUxMOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAodm9pZClwYXVzZSgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgLyogbWFrZSBzdXJlIHRoYXQgYW55IGV4Y2VwdGlvbnMgdGhhdCBnb3QgcmFpc2VkIGFyZSBwcm9wYWdhdGVkCisgICAgICogYmFjayBpbnRvIFB5dGhvbgorICAgICAqLworICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogUHlEb2NfU1RSVkFSKHBhdXNlX2RvYywKICJwYXVzZSgpXG5cCkBAIC0yNTEsNDQgKzI1MSw0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNpZ25hbF9zaWduYWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpvYmo7Ci0JaW50IHNpZ19udW07Ci0JUHlPYmplY3QgKm9sZF9oYW5kbGVyOwotCXZvaWQgKCpmdW5jKShpbnQpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86c2lnbmFsIiwgJnNpZ19udW0sICZvYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIGludCBzaWdfbnVtOworICAgIFB5T2JqZWN0ICpvbGRfaGFuZGxlcjsKKyAgICB2b2lkICgqZnVuYykoaW50KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOnNpZ25hbCIsICZzaWdfbnVtLCAmb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzaWduYWwgb25seSB3b3JrcyBpbiBtYWluIHRocmVhZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaWduYWwgb25seSB3b3JrcyBpbiBtYWluIHRocmVhZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlpZiAoc2lnX251bSA8IDEgfHwgc2lnX251bSA+PSBOU0lHKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzaWduYWwgbnVtYmVyIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG9iaiA9PSBJZ25vcmVIYW5kbGVyKQotCQlmdW5jID0gU0lHX0lHTjsKLQllbHNlIGlmIChvYmogPT0gRGVmYXVsdEhhbmRsZXIpCi0JCWZ1bmMgPSBTSUdfREZMOwotCWVsc2UgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKG9iaikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICBpZiAoc2lnX251bSA8IDEgfHwgc2lnX251bSA+PSBOU0lHKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25hbCBudW1iZXIgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAob2JqID09IElnbm9yZUhhbmRsZXIpCisgICAgICAgIGZ1bmMgPSBTSUdfSUdOOworICAgIGVsc2UgaWYgKG9iaiA9PSBEZWZhdWx0SGFuZGxlcikKKyAgICAgICAgZnVuYyA9IFNJR19ERkw7CisgICAgZWxzZSBpZiAoIVB5Q2FsbGFibGVfQ2hlY2sob2JqKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogInNpZ25hbCBoYW5kbGVyIG11c3QgYmUgc2lnbmFsLlNJR19JR04sIHNpZ25hbC5TSUdfREZMLCBvciBhIGNhbGxhYmxlIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZQotCQlmdW5jID0gc2lnbmFsX2hhbmRsZXI7Ci0JaWYgKFB5T1Nfc2V0c2lnKHNpZ19udW0sIGZ1bmMpID09IFNJR19FUlIpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX1J1bnRpbWVFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvbGRfaGFuZGxlciA9IEhhbmRsZXJzW3NpZ19udW1dLmZ1bmM7Ci0JSGFuZGxlcnNbc2lnX251bV0udHJpcHBlZCA9IDA7Ci0JUHlfSU5DUkVGKG9iaik7Ci0JSGFuZGxlcnNbc2lnX251bV0uZnVuYyA9IG9iajsKLQlyZXR1cm4gb2xkX2hhbmRsZXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZnVuYyA9IHNpZ25hbF9oYW5kbGVyOworICAgIGlmIChQeU9TX3NldHNpZyhzaWdfbnVtLCBmdW5jKSA9PSBTSUdfRVJSKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19SdW50aW1lRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb2xkX2hhbmRsZXIgPSBIYW5kbGVyc1tzaWdfbnVtXS5mdW5jOworICAgIEhhbmRsZXJzW3NpZ19udW1dLnRyaXBwZWQgPSAwOworICAgIFB5X0lOQ1JFRihvYmopOworICAgIEhhbmRsZXJzW3NpZ19udW1dLmZ1bmMgPSBvYmo7CisgICAgcmV0dXJuIG9sZF9oYW5kbGVyOwogfQogCiBQeURvY19TVFJWQVIoc2lnbmFsX2RvYywKQEAgLTMwNiwxOCArMzA2LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2lnbmFsX2dldHNpZ25hbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHNpZ19udW07Ci0JUHlPYmplY3QgKm9sZF9oYW5kbGVyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRzaWduYWwiLCAmc2lnX251bSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChzaWdfbnVtIDwgMSB8fCBzaWdfbnVtID49IE5TSUcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInNpZ25hbCBudW1iZXIgb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvbGRfaGFuZGxlciA9IEhhbmRsZXJzW3NpZ19udW1dLmZ1bmM7Ci0JUHlfSU5DUkVGKG9sZF9oYW5kbGVyKTsKLQlyZXR1cm4gb2xkX2hhbmRsZXI7CisgICAgaW50IHNpZ19udW07CisgICAgUHlPYmplY3QgKm9sZF9oYW5kbGVyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRzaWduYWwiLCAmc2lnX251bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzaWdfbnVtIDwgMSB8fCBzaWdfbnVtID49IE5TSUcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2lnbmFsIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9sZF9oYW5kbGVyID0gSGFuZGxlcnNbc2lnX251bV0uZnVuYzsKKyAgICBQeV9JTkNSRUYob2xkX2hhbmRsZXIpOworICAgIHJldHVybiBvbGRfaGFuZGxlcjsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHNpZ25hbF9kb2MsCkBAIC0zMzksMjMgKzMzOSwyMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNpZ25hbF9zaWdpbnRlcnJ1cHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzaWdfbnVtOwotCWludCBmbGFnOworICAgIGludCBzaWdfbnVtOworICAgIGludCBmbGFnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpzaWdpbnRlcnJ1cHQiLCAmc2lnX251bSwgJmZsYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc2lnX251bSA8IDEgfHwgc2lnX251bSA+PSBOU0lHKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzaWduYWwgbnVtYmVyIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHNpZ2ludGVycnVwdChzaWdfbnVtLCBmbGFnKTwwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19SdW50aW1lRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpzaWdpbnRlcnJ1cHQiLCAmc2lnX251bSwgJmZsYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc2lnX251bSA8IDEgfHwgc2lnX251bSA+PSBOU0lHKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25hbCBudW1iZXIgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2lnaW50ZXJydXB0KHNpZ19udW0sIGZsYWcpPDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX1J1bnRpbWVFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNlbmRpZgpAQCAtMzYzLDI0ICszNjMsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzaWduYWxfc2V0X3dha2V1cF9mZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RydWN0IHN0YXQgYnVmOwotCWludCBmZCwgb2xkX2ZkOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRfd2FrZXVwX2ZkIiwgJmZkKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGludCBmZCwgb2xkX2ZkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRfd2FrZXVwX2ZkIiwgJmZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzZXRfd2FrZXVwX2ZkIG9ubHkgd29ya3MgaW4gbWFpbiB0aHJlYWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgIT0gbWFpbl90aHJlYWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2V0X3dha2V1cF9mZCBvbmx5IHdvcmtzIGluIG1haW4gdGhyZWFkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCWlmIChmZCAhPSAtMSAmJiBmc3RhdChmZCwgJmJ1ZikgIT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgZmQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9sZF9mZCA9IHdha2V1cF9mZDsKLQl3YWtldXBfZmQgPSBmZDsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nKG9sZF9mZCk7CisgICAgaWYgKGZkICE9IC0xICYmIGZzdGF0KGZkLCAmYnVmKSAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBmZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb2xkX2ZkID0gd2FrZXVwX2ZkOworICAgIHdha2V1cF9mZCA9IGZkOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcob2xkX2ZkKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldF93YWtldXBfZmRfZG9jLApAQCAtMzk2LDExICszOTYsMTEgQEAKIGludAogUHlTaWduYWxfU2V0V2FrZXVwRmQoaW50IGZkKQogewotCWludCBvbGRfZmQgPSB3YWtldXBfZmQ7Ci0JaWYgKGZkIDwgMCkKLQkJZmQgPSAtMTsKLQl3YWtldXBfZmQgPSBmZDsKLQlyZXR1cm4gb2xkX2ZkOworICAgIGludCBvbGRfZmQgPSB3YWtldXBfZmQ7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgZmQgPSAtMTsKKyAgICB3YWtldXBfZmQgPSBmZDsKKyAgICByZXR1cm4gb2xkX2ZkOwogfQogCiAKQEAgLTQxNCwxNCArNDE0LDE0IEBACiAgICAgc3RydWN0IGl0aW1lcnZhbCBuZXcsIG9sZDsKIAogICAgIGlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpZHxkOnNldGl0aW1lciIsICZ3aGljaCwgJmZpcnN0LCAmaW50ZXJ2YWwpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIHRpbWV2YWxfZnJvbV9kb3VibGUoZmlyc3QsICZuZXcuaXRfdmFsdWUpOwogICAgIHRpbWV2YWxfZnJvbV9kb3VibGUoaW50ZXJ2YWwsICZuZXcuaXRfaW50ZXJ2YWwpOwogICAgIC8qIExldCBPUyBjaGVjayAid2hpY2giIHZhbHVlICovCiAgICAgaWYgKHNldGl0aW1lcih3aGljaCwgJm5ldywgJm9sZCkgIT0gMCkgewotICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oSXRpbWVyRXJyb3IpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRGcm9tRXJybm8oSXRpbWVyRXJyb3IpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHJldHVybiBpdGltZXJfcmV0dmFsKCZvbGQpOwpAQCAtNDQ3LDExICs0NDcsMTEgQEAKICAgICBzdHJ1Y3QgaXRpbWVydmFsIG9sZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRpdGltZXIiLCAmd2hpY2gpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChnZXRpdGltZXIod2hpY2gsICZvbGQpICE9IDApIHsKLSAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEl0aW1lckVycm9yKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0RnJvbUVycm5vKEl0aW1lckVycm9yKTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICByZXR1cm4gaXRpbWVyX3JldHZhbCgmb2xkKTsKQEAgLTQ2NywyNyArNDY3LDI3IEBACiAvKiBMaXN0IG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIHN0YXRpYyBQeU1ldGhvZERlZiBzaWduYWxfbWV0aG9kc1tdID0gewogI2lmZGVmIEhBVkVfQUxBUk0KLQl7ImFsYXJtIiwJICAgICAgICBzaWduYWxfYWxhcm0sIE1FVEhfVkFSQVJHUywgYWxhcm1fZG9jfSwKKyAgICB7ImFsYXJtIiwgICAgICAgICAgICAgICAgICAgc2lnbmFsX2FsYXJtLCBNRVRIX1ZBUkFSR1MsIGFsYXJtX2RvY30sCiAjZW5kaWYKICNpZmRlZiBIQVZFX1NFVElUSU1FUgogICAgIHsic2V0aXRpbWVyIiwgICAgICAgc2lnbmFsX3NldGl0aW1lciwgTUVUSF9WQVJBUkdTLCBzZXRpdGltZXJfZG9jfSwKICNlbmRpZgogI2lmZGVmIEhBVkVfR0VUSVRJTUVSCi0JeyJnZXRpdGltZXIiLCAgICAgICBzaWduYWxfZ2V0aXRpbWVyLCBNRVRIX1ZBUkFSR1MsIGdldGl0aW1lcl9kb2N9LAorICAgIHsiZ2V0aXRpbWVyIiwgICAgICAgc2lnbmFsX2dldGl0aW1lciwgTUVUSF9WQVJBUkdTLCBnZXRpdGltZXJfZG9jfSwKICNlbmRpZgotCXsic2lnbmFsIiwJICAgICAgICBzaWduYWxfc2lnbmFsLCBNRVRIX1ZBUkFSR1MsIHNpZ25hbF9kb2N9LAotCXsiZ2V0c2lnbmFsIiwJICAgICAgICBzaWduYWxfZ2V0c2lnbmFsLCBNRVRIX1ZBUkFSR1MsIGdldHNpZ25hbF9kb2N9LAotCXsic2V0X3dha2V1cF9mZCIsCXNpZ25hbF9zZXRfd2FrZXVwX2ZkLCBNRVRIX1ZBUkFSR1MsIHNldF93YWtldXBfZmRfZG9jfSwKKyAgICB7InNpZ25hbCIsICAgICAgICAgICAgICAgICAgc2lnbmFsX3NpZ25hbCwgTUVUSF9WQVJBUkdTLCBzaWduYWxfZG9jfSwKKyAgICB7ImdldHNpZ25hbCIsICAgICAgICAgICAgICAgc2lnbmFsX2dldHNpZ25hbCwgTUVUSF9WQVJBUkdTLCBnZXRzaWduYWxfZG9jfSwKKyAgICB7InNldF93YWtldXBfZmQiLCAgICAgICAgICAgc2lnbmFsX3NldF93YWtldXBfZmQsIE1FVEhfVkFSQVJHUywgc2V0X3dha2V1cF9mZF9kb2N9LAogI2lmZGVmIEhBVkVfU0lHSU5URVJSVVBUCi0gCXsic2lnaW50ZXJydXB0IiwJc2lnbmFsX3NpZ2ludGVycnVwdCwgTUVUSF9WQVJBUkdTLCBzaWdpbnRlcnJ1cHRfZG9jfSwKKyAgICB7InNpZ2ludGVycnVwdCIsICAgICAgICAgICAgc2lnbmFsX3NpZ2ludGVycnVwdCwgTUVUSF9WQVJBUkdTLCBzaWdpbnRlcnJ1cHRfZG9jfSwKICNlbmRpZgogI2lmZGVmIEhBVkVfUEFVU0UKLQl7InBhdXNlIiwJICAgICAgICAoUHlDRnVuY3Rpb24pc2lnbmFsX3BhdXNlLAotCSBNRVRIX05PQVJHUyxwYXVzZV9kb2N9LAorICAgIHsicGF1c2UiLCAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2lnbmFsX3BhdXNlLAorICAgICBNRVRIX05PQVJHUyxwYXVzZV9kb2N9LAogI2VuZGlmCi0JeyJkZWZhdWx0X2ludF9oYW5kbGVyIiwgc2lnbmFsX2RlZmF1bHRfaW50X2hhbmRsZXIsCi0JIE1FVEhfVkFSQVJHUywgZGVmYXVsdF9pbnRfaGFuZGxlcl9kb2N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiZGVmYXVsdF9pbnRfaGFuZGxlciIsIHNpZ25hbF9kZWZhdWx0X2ludF9oYW5kbGVyLAorICAgICBNRVRIX1ZBUkFSR1MsIGRlZmF1bHRfaW50X2hhbmRsZXJfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTUzMCwyNTAgKzUzMCwyNTAgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0c2lnbmFsKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqeDsKLQlpbnQgaTsKKyAgICBQeU9iamVjdCAqbSwgKmQsICp4OworICAgIGludCBpOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQltYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQltYWluX3BpZCA9IGdldHBpZCgpOworICAgIG1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIG1haW5fcGlkID0gZ2V0cGlkKCk7CiAjZW5kaWYKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlMygic2lnbmFsIiwgc2lnbmFsX21ldGhvZHMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoInNpZ25hbCIsIHNpZ25hbF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIC8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CiAKLQl4ID0gRGVmYXVsdEhhbmRsZXIgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilTSUdfREZMKTsKLSAgICAgICAgaWYgKCF4IHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdfREZMIiwgeCkgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB4ID0gRGVmYXVsdEhhbmRsZXIgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilTSUdfREZMKTsKKyAgICBpZiAoIXggfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR19ERkwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCXggPSBJZ25vcmVIYW5kbGVyID0gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkICopU0lHX0lHTik7Ci0gICAgICAgIGlmICgheCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHX0lHTiIsIHgpIDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgeCA9IElnbm9yZUhhbmRsZXIgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilTSUdfSUdOKTsKKyAgICBpZiAoIXggfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR19JR04iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotICAgICAgICB4ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpTlNJRyk7Ci0gICAgICAgIGlmICgheCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlNJRyIsIHgpIDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpTlNJRyk7CisgICAgaWYgKCF4IHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOU0lHIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgUHlfREVDUkVGKHgpOwogCi0JeCA9IEludEhhbmRsZXIgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiZGVmYXVsdF9pbnRfaGFuZGxlciIpOwotICAgICAgICBpZiAoIXgpCi0gICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwotCVB5X0lOQ1JFRihJbnRIYW5kbGVyKTsKKyAgICB4ID0gSW50SGFuZGxlciA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJkZWZhdWx0X2ludF9oYW5kbGVyIik7CisgICAgaWYgKCF4KQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgUHlfSU5DUkVGKEludEhhbmRsZXIpOwogCi0JSGFuZGxlcnNbMF0udHJpcHBlZCA9IDA7Ci0JZm9yIChpID0gMTsgaSA8IE5TSUc7IGkrKykgewotCQl2b2lkICgqdCkoaW50KTsKLQkJdCA9IFB5T1NfZ2V0c2lnKGkpOwotCQlIYW5kbGVyc1tpXS50cmlwcGVkID0gMDsKLQkJaWYgKHQgPT0gU0lHX0RGTCkKLQkJCUhhbmRsZXJzW2ldLmZ1bmMgPSBEZWZhdWx0SGFuZGxlcjsKLQkJZWxzZSBpZiAodCA9PSBTSUdfSUdOKQotCQkJSGFuZGxlcnNbaV0uZnVuYyA9IElnbm9yZUhhbmRsZXI7Ci0JCWVsc2UKLQkJCUhhbmRsZXJzW2ldLmZ1bmMgPSBQeV9Ob25lOyAvKiBOb25lIG9mIG91ciBidXNpbmVzcyAqLwotCQlQeV9JTkNSRUYoSGFuZGxlcnNbaV0uZnVuYyk7Ci0JfQotCWlmIChIYW5kbGVyc1tTSUdJTlRdLmZ1bmMgPT0gRGVmYXVsdEhhbmRsZXIpIHsKLQkJLyogSW5zdGFsbCBkZWZhdWx0IGludCBoYW5kbGVyICovCi0JCVB5X0lOQ1JFRihJbnRIYW5kbGVyKTsKLQkJUHlfREVDUkVGKEhhbmRsZXJzW1NJR0lOVF0uZnVuYyk7Ci0JCUhhbmRsZXJzW1NJR0lOVF0uZnVuYyA9IEludEhhbmRsZXI7Ci0JCW9sZF9zaWdpbnRoYW5kbGVyID0gUHlPU19zZXRzaWcoU0lHSU5ULCBzaWduYWxfaGFuZGxlcik7Ci0JfQorICAgIEhhbmRsZXJzWzBdLnRyaXBwZWQgPSAwOworICAgIGZvciAoaSA9IDE7IGkgPCBOU0lHOyBpKyspIHsKKyAgICAgICAgdm9pZCAoKnQpKGludCk7CisgICAgICAgIHQgPSBQeU9TX2dldHNpZyhpKTsKKyAgICAgICAgSGFuZGxlcnNbaV0udHJpcHBlZCA9IDA7CisgICAgICAgIGlmICh0ID09IFNJR19ERkwpCisgICAgICAgICAgICBIYW5kbGVyc1tpXS5mdW5jID0gRGVmYXVsdEhhbmRsZXI7CisgICAgICAgIGVsc2UgaWYgKHQgPT0gU0lHX0lHTikKKyAgICAgICAgICAgIEhhbmRsZXJzW2ldLmZ1bmMgPSBJZ25vcmVIYW5kbGVyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBIYW5kbGVyc1tpXS5mdW5jID0gUHlfTm9uZTsgLyogTm9uZSBvZiBvdXIgYnVzaW5lc3MgKi8KKyAgICAgICAgUHlfSU5DUkVGKEhhbmRsZXJzW2ldLmZ1bmMpOworICAgIH0KKyAgICBpZiAoSGFuZGxlcnNbU0lHSU5UXS5mdW5jID09IERlZmF1bHRIYW5kbGVyKSB7CisgICAgICAgIC8qIEluc3RhbGwgZGVmYXVsdCBpbnQgaGFuZGxlciAqLworICAgICAgICBQeV9JTkNSRUYoSW50SGFuZGxlcik7CisgICAgICAgIFB5X0RFQ1JFRihIYW5kbGVyc1tTSUdJTlRdLmZ1bmMpOworICAgICAgICBIYW5kbGVyc1tTSUdJTlRdLmZ1bmMgPSBJbnRIYW5kbGVyOworICAgICAgICBvbGRfc2lnaW50aGFuZGxlciA9IFB5T1Nfc2V0c2lnKFNJR0lOVCwgc2lnbmFsX2hhbmRsZXIpOworICAgIH0KIAogI2lmZGVmIFNJR0hVUAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdIVVApOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdIVVAiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSFVQKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSFVQIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0lOVAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdJTlQpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJTlQiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSU5UKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSU5UIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0JSRUFLCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0JSRUFLKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQlJFQUsiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQlJFQUspOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdCUkVBSyIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdRVUlUCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1FVSVQpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdRVUlUIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1FVSVQpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdRVUlUIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0lMTAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdJTEwpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJTEwiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSUxMKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSUxMIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1RSQVAKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVFJBUCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RSQVAiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVFJBUCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RSQVAiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHSU9UCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0lPVCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lPVCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdJT1QpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJT1QiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHQUJSVAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdBQlJUKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQUJSVCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdBQlJUKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQUJSVCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdFTVQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHRU1UKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHRU1UIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0VNVCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0VNVCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdGUEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHRlBFKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHRlBFIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0ZQRSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0ZQRSIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdLSUxMCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0tJTEwpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdLSUxMIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0tJTEwpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdLSUxMIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0JVUwotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdCVVMpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdCVVMiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQlVTKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQlVTIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1NFR1YKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHU0VHVik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1NFR1YiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHU0VHVik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1NFR1YiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHU1lTCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1NZUyk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1NZUyIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdTWVMpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdTWVMiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHUElQRQotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdQSVBFKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUElQRSIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdQSVBFKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUElQRSIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdBTFJNCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0FMUk0pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdBTFJNIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0FMUk0pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdBTFJNIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1RFUk0KLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVEVSTSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RFUk0iLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVEVSTSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RFUk0iLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHVVNSMQotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdVU1IxKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVVNSMSIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdVU1IxKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVVNSMSIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdVU1IyCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1VTUjIpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdVU1IyIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1VTUjIpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdVU1IyIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0NMRAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdDTEQpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdDTEQiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQ0xEKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQ0xEIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0NITEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQ0hMRCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0NITEQiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQ0hMRCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0NITEQiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHUFdSCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1BXUik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1BXUiIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdQV1IpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdQV1IiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHSU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSU8pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJTyIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdJTyk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lPIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1VSRwotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdVUkcpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdVUkciLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVVJHKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVVJHIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1dJTkNICi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1dJTkNIKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHV0lOQ0giLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHV0lOQ0gpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdXSU5DSCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdQT0xMCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1BPTEwpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdQT0xMIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1BPTEwpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdQT0xMIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1NUT1AKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHU1RPUCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1NUT1AiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHU1RPUCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1NUT1AiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHVFNUUAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdUU1RQKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVFNUUCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdUU1RQKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVFNUUCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdDT05UCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0NPTlQpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdDT05UIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0NPTlQpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdDT05UIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1RUSU4KLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVFRJTik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RUSU4iLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVFRJTik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RUSU4iLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHVFRPVQotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdUVE9VKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVFRPVSIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdUVE9VKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVFRPVSIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdWVEFMUk0KLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVlRBTFJNKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVlRBTFJNIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1ZUQUxSTSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1ZUQUxSTSIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdQUk9GCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1BST0YpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdQUk9GIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1BST0YpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdQUk9GIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1hDUFUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHWENQVSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1hDUFUiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHWENQVSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1hDUFUiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHWEZTWgotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdYRlNaKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHWEZTWiIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdYRlNaKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHWEZTWiIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdSVE1JTgotICAgICAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUlRNSU4pOwotICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUlRNSU4iLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUlRNSU4pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdSVE1JTiIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdSVE1BWAotICAgICAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUlRNQVgpOwotICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUlRNQVgiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUlRNQVgpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdSVE1BWCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdJTkZPCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0lORk8pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJTkZPIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0lORk8pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJTkZPIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogCiAjaWZkZWYgSVRJTUVSX1JFQUwKQEAgLTc5MywxMCArNzkzLDEwIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQgKEhBVkVfU0VUSVRJTUVSKSB8fCBkZWZpbmVkIChIQVZFX0dFVElUSU1FUikKLSAgICBJdGltZXJFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic2lnbmFsLkl0aW1lckVycm9yIiwgCi0gICAgICAgICBQeUV4Y19JT0Vycm9yLCBOVUxMKTsKKyAgICBJdGltZXJFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic2lnbmFsLkl0aW1lckVycm9yIiwKKyAgICAgUHlFeGNfSU9FcnJvciwgTlVMTCk7CiAgICAgaWYgKEl0aW1lckVycm9yICE9IE5VTEwpCi0gICAgCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJdGltZXJFcnJvciIsIEl0aW1lckVycm9yKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSXRpbWVyRXJyb3IiLCBJdGltZXJFcnJvcik7CiAjZW5kaWYKIAogI2lmZGVmIENUUkxfQ19FVkVOVApAQCAtODExLDM5ICs4MTEsMzkgQEAKICAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKIAotICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JLyogQ2hlY2sgZm9yIGVycm9ycyAqLwotICBmaW5hbGx5OgorICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuOworCisgICAgLyogQ2hlY2sgZm9yIGVycm9ycyAqLworICBmaW5hbGx5OgorICAgIHJldHVybjsKIH0KIAogc3RhdGljIHZvaWQKIGZpbmlzaWduYWwodm9pZCkKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqZnVuYzsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqZnVuYzsKIAotCVB5T1Nfc2V0c2lnKFNJR0lOVCwgb2xkX3NpZ2ludGhhbmRsZXIpOwotCW9sZF9zaWdpbnRoYW5kbGVyID0gU0lHX0RGTDsKKyAgICBQeU9TX3NldHNpZyhTSUdJTlQsIG9sZF9zaWdpbnRoYW5kbGVyKTsKKyAgICBvbGRfc2lnaW50aGFuZGxlciA9IFNJR19ERkw7CiAKLQlmb3IgKGkgPSAxOyBpIDwgTlNJRzsgaSsrKSB7Ci0JCWZ1bmMgPSBIYW5kbGVyc1tpXS5mdW5jOwotCQlIYW5kbGVyc1tpXS50cmlwcGVkID0gMDsKLQkJSGFuZGxlcnNbaV0uZnVuYyA9IE5VTEw7Ci0JCWlmIChpICE9IFNJR0lOVCAmJiBmdW5jICE9IE5VTEwgJiYgZnVuYyAhPSBQeV9Ob25lICYmCi0JCSAgICBmdW5jICE9IERlZmF1bHRIYW5kbGVyICYmIGZ1bmMgIT0gSWdub3JlSGFuZGxlcikKLQkJCVB5T1Nfc2V0c2lnKGksIFNJR19ERkwpOwotCQlQeV9YREVDUkVGKGZ1bmMpOwotCX0KKyAgICBmb3IgKGkgPSAxOyBpIDwgTlNJRzsgaSsrKSB7CisgICAgICAgIGZ1bmMgPSBIYW5kbGVyc1tpXS5mdW5jOworICAgICAgICBIYW5kbGVyc1tpXS50cmlwcGVkID0gMDsKKyAgICAgICAgSGFuZGxlcnNbaV0uZnVuYyA9IE5VTEw7CisgICAgICAgIGlmIChpICE9IFNJR0lOVCAmJiBmdW5jICE9IE5VTEwgJiYgZnVuYyAhPSBQeV9Ob25lICYmCisgICAgICAgICAgICBmdW5jICE9IERlZmF1bHRIYW5kbGVyICYmIGZ1bmMgIT0gSWdub3JlSGFuZGxlcikKKyAgICAgICAgICAgIFB5T1Nfc2V0c2lnKGksIFNJR19ERkwpOworICAgICAgICBQeV9YREVDUkVGKGZ1bmMpOworICAgIH0KIAotCVB5X1hERUNSRUYoSW50SGFuZGxlcik7Ci0JSW50SGFuZGxlciA9IE5VTEw7Ci0JUHlfWERFQ1JFRihEZWZhdWx0SGFuZGxlcik7Ci0JRGVmYXVsdEhhbmRsZXIgPSBOVUxMOwotCVB5X1hERUNSRUYoSWdub3JlSGFuZGxlcik7Ci0JSWdub3JlSGFuZGxlciA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihJbnRIYW5kbGVyKTsKKyAgICBJbnRIYW5kbGVyID0gTlVMTDsKKyAgICBQeV9YREVDUkVGKERlZmF1bHRIYW5kbGVyKTsKKyAgICBEZWZhdWx0SGFuZGxlciA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihJZ25vcmVIYW5kbGVyKTsKKyAgICBJZ25vcmVIYW5kbGVyID0gTlVMTDsKIH0KIAogCkBAIC04NTEsNTUgKzg1MSw1NSBAQAogaW50CiBQeUVycl9DaGVja1NpZ25hbHModm9pZCkKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqZjsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqZjsKIAotCWlmICghaXNfdHJpcHBlZCkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCFpc190cmlwcGVkKQorICAgICAgICByZXR1cm4gMDsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkKLQkJcmV0dXJuIDA7CisgICAgaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkKKyAgICAgICAgcmV0dXJuIDA7CiAjZW5kaWYKIAotCS8qCi0JICogVGhlIGlzX3RyaXBwZWQgdmFyaWFibGUgaXMgbWVhbnQgdG8gc3BlZWQgdXAgdGhlIGNhbGxzIHRvCi0JICogUHlFcnJfQ2hlY2tTaWduYWxzIChib3RoIGRpcmVjdGx5IG9yIHZpYSBwZW5kaW5nIGNhbGxzKSB3aGVuIG5vCi0JICogc2lnbmFsIGhhcyBhcnJpdmVkLiBUaGlzIHZhcmlhYmxlIGlzIHNldCB0byAxIHdoZW4gYSBzaWduYWwgYXJyaXZlcwotCSAqIGFuZCBpdCBpcyBzZXQgdG8gMCBoZXJlLCB3aGVuIHdlIGtub3cgc29tZSBzaWduYWxzIGFycml2ZWQuIFRoaXMgd2F5Ci0JICogd2UgY2FuIHJ1biB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycyB3aXRoIG5vIHNpZ25hbHMgYmxvY2tlZC4KLQkgKgotCSAqIE5PVEU6IHdpdGggdGhpcyBhcHByb2FjaCB3ZSBjYW4gaGF2ZSBhIHNpdHVhdGlvbiB3aGVyZSBpc190cmlwcGVkIGlzCi0JICogICAgICAgMSBidXQgd2UgaGF2ZSBubyBtb3JlIHNpZ25hbHMgdG8gaGFuZGxlIChIYW5kbGVyc1tpXS50cmlwcGVkCi0JICogICAgICAgaXMgMCBmb3IgZXZlcnkgc2lnbmFsIGkpLiBUaGlzIHdvbid0IGRvIHVzIGFueSBoYXJtIChleGNlcHQKLQkgKiAgICAgICB3ZSdyZSBnb25uYSBzcGVudCBzb21lIGN5Y2xlcyBmb3Igbm90aGluZykuIFRoaXMgaGFwcGVucyB3aGVuCi0JICogICAgICAgd2UgcmVjZWl2ZSBhIHNpZ25hbCBpIGFmdGVyIHdlIHplcm8gaXNfdHJpcHBlZCBhbmQgYmVmb3JlIHdlCi0JICogICAgICAgY2hlY2sgSGFuZGxlcnNbaV0udHJpcHBlZC4KLQkgKi8KLQlpc190cmlwcGVkID0gMDsKKyAgICAvKgorICAgICAqIFRoZSBpc190cmlwcGVkIHZhcmlhYmxlIGlzIG1lYW50IHRvIHNwZWVkIHVwIHRoZSBjYWxscyB0bworICAgICAqIFB5RXJyX0NoZWNrU2lnbmFscyAoYm90aCBkaXJlY3RseSBvciB2aWEgcGVuZGluZyBjYWxscykgd2hlbiBubworICAgICAqIHNpZ25hbCBoYXMgYXJyaXZlZC4gVGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gMSB3aGVuIGEgc2lnbmFsIGFycml2ZXMKKyAgICAgKiBhbmQgaXQgaXMgc2V0IHRvIDAgaGVyZSwgd2hlbiB3ZSBrbm93IHNvbWUgc2lnbmFscyBhcnJpdmVkLiBUaGlzIHdheQorICAgICAqIHdlIGNhbiBydW4gdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMgd2l0aCBubyBzaWduYWxzIGJsb2NrZWQuCisgICAgICoKKyAgICAgKiBOT1RFOiB3aXRoIHRoaXMgYXBwcm9hY2ggd2UgY2FuIGhhdmUgYSBzaXR1YXRpb24gd2hlcmUgaXNfdHJpcHBlZCBpcworICAgICAqICAgICAgIDEgYnV0IHdlIGhhdmUgbm8gbW9yZSBzaWduYWxzIHRvIGhhbmRsZSAoSGFuZGxlcnNbaV0udHJpcHBlZAorICAgICAqICAgICAgIGlzIDAgZm9yIGV2ZXJ5IHNpZ25hbCBpKS4gVGhpcyB3b24ndCBkbyB1cyBhbnkgaGFybSAoZXhjZXB0CisgICAgICogICAgICAgd2UncmUgZ29ubmEgc3BlbnQgc29tZSBjeWNsZXMgZm9yIG5vdGhpbmcpLiBUaGlzIGhhcHBlbnMgd2hlbgorICAgICAqICAgICAgIHdlIHJlY2VpdmUgYSBzaWduYWwgaSBhZnRlciB3ZSB6ZXJvIGlzX3RyaXBwZWQgYW5kIGJlZm9yZSB3ZQorICAgICAqICAgICAgIGNoZWNrIEhhbmRsZXJzW2ldLnRyaXBwZWQuCisgICAgICovCisgICAgaXNfdHJpcHBlZCA9IDA7CiAKLQlpZiAoIShmID0gKFB5T2JqZWN0ICopUHlFdmFsX0dldEZyYW1lKCkpKQotCQlmID0gUHlfTm9uZTsKKyAgICBpZiAoIShmID0gKFB5T2JqZWN0ICopUHlFdmFsX0dldEZyYW1lKCkpKQorICAgICAgICBmID0gUHlfTm9uZTsKIAotCWZvciAoaSA9IDE7IGkgPCBOU0lHOyBpKyspIHsKLQkJaWYgKEhhbmRsZXJzW2ldLnRyaXBwZWQpIHsKLQkJCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCQkJUHlPYmplY3QgKmFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCIoaU8pIiwgaSwgZik7Ci0JCQlIYW5kbGVyc1tpXS50cmlwcGVkID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgTlNJRzsgaSsrKSB7CisgICAgICAgIGlmIChIYW5kbGVyc1tpXS50cmlwcGVkKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiKGlPKSIsIGksIGYpOworICAgICAgICAgICAgSGFuZGxlcnNbaV0udHJpcHBlZCA9IDA7CiAKLQkJCWlmIChhcmdsaXN0KSB7Ci0JCQkJcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoSGFuZGxlcnNbaV0uZnVuYywKLQkJCQkJCQkgICBhcmdsaXN0KTsKLQkJCQlQeV9ERUNSRUYoYXJnbGlzdCk7Ci0JCQl9Ci0JCQlpZiAoIXJlc3VsdCkKLQkJCQlyZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoYXJnbGlzdCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KEhhbmRsZXJzW2ldLmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnbGlzdCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ2xpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJfQotCX0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtOTA5LDQ2ICs5MDksNDYgQEAKIHZvaWQKIFB5RXJyX1NldEludGVycnVwdCh2b2lkKQogewotCWlzX3RyaXBwZWQgPSAxOwotCUhhbmRsZXJzW1NJR0lOVF0udHJpcHBlZCA9IDE7Ci0JUHlfQWRkUGVuZGluZ0NhbGwoKGludCAoKikodm9pZCAqKSlQeUVycl9DaGVja1NpZ25hbHMsIE5VTEwpOworICAgIGlzX3RyaXBwZWQgPSAxOworICAgIEhhbmRsZXJzW1NJR0lOVF0udHJpcHBlZCA9IDE7CisgICAgUHlfQWRkUGVuZGluZ0NhbGwoKGludCAoKikodm9pZCAqKSlQeUVycl9DaGVja1NpZ25hbHMsIE5VTEwpOwogfQogCiB2b2lkCiBQeU9TX0luaXRJbnRlcnJ1cHRzKHZvaWQpCiB7Ci0JaW5pdHNpZ25hbCgpOwotCV9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbigic2lnbmFsIiwgInNpZ25hbCIpOworICAgIGluaXRzaWduYWwoKTsKKyAgICBfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oInNpZ25hbCIsICJzaWduYWwiKTsKIH0KIAogdm9pZAogUHlPU19GaW5pSW50ZXJydXB0cyh2b2lkKQogewotCWZpbmlzaWduYWwoKTsKKyAgICBmaW5pc2lnbmFsKCk7CiB9CiAKIGludAogUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCh2b2lkKQogewotCWlmIChIYW5kbGVyc1tTSUdJTlRdLnRyaXBwZWQpIHsKKyAgICBpZiAoSGFuZGxlcnNbU0lHSU5UXS50cmlwcGVkKSB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkKLQkJCXJldHVybiAwOworICAgICAgICBpZiAoUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAjZW5kaWYKLQkJSGFuZGxlcnNbU0lHSU5UXS50cmlwcGVkID0gMDsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgICAgICBIYW5kbGVyc1tTSUdJTlRdLnRyaXBwZWQgPSAwOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQKIFB5T1NfQWZ0ZXJGb3JrKHZvaWQpCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUV2YWxfUmVJbml0VGhyZWFkcygpOwotCW1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCW1haW5fcGlkID0gZ2V0cGlkKCk7Ci0JX1B5SW1wb3J0X1JlSW5pdExvY2soKTsKLQlQeVRocmVhZF9SZUluaXRUTFMoKTsKKyAgICBQeUV2YWxfUmVJbml0VGhyZWFkcygpOworICAgIG1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIG1haW5fcGlkID0gZ2V0cGlkKCk7CisgICAgX1B5SW1wb3J0X1JlSW5pdExvY2soKTsKKyAgICBQeVRocmVhZF9SZUluaXRUTFMoKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKaW5kZXggNmIxNjNmNC4uNWRhNzgwOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCkBAIC0xNywxMSArMTcsMTEgQEAKIAogLSBzb2NrZXQuZXJyb3I6IGV4Y2VwdGlvbiByYWlzZWQgZm9yIHNvY2tldCBzcGVjaWZpYyBlcnJvcnMKIC0gc29ja2V0LmdhaWVycm9yOiBleGNlcHRpb24gcmFpc2VkIGZvciBnZXRhZGRyaW5mby9nZXRuYW1laW5mbyBlcnJvcnMsCi0JYSBzdWJjbGFzcyBvZiBzb2NrZXQuZXJyb3IKKyAgICBhIHN1YmNsYXNzIG9mIHNvY2tldC5lcnJvcgogLSBzb2NrZXQuaGVycm9yOiBleGNlcHRpb24gcmFpc2VkIGZvciBnZXRob3N0YnkqIGVycm9ycywKLQlhIHN1YmNsYXNzIG9mIHNvY2tldC5lcnJvcgorICAgIGEgc3ViY2xhc3Mgb2Ygc29ja2V0LmVycm9yCiAtIHNvY2tldC5mcm9tZmQoZmQsIGZhbWlseSwgdHlwZVssIHByb3RvXSkgLS0+IG5ldyBzb2NrZXQgb2JqZWN0IChjcmVhdGVkCi0gICAgICAgIGZyb20gYW4gZXhpc3RpbmcgZmlsZSBkZXNjcmlwdG9yKQorICAgIGZyb20gYW4gZXhpc3RpbmcgZmlsZSBkZXNjcmlwdG9yKQogLSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSkgLS0+IGhvc3QgSVAgYWRkcmVzcyAoc3RyaW5nOiAnZGQuZGQuZGQuZGQnKQogLSBzb2NrZXQuZ2V0aG9zdGJ5YWRkcihJUCBhZGRyZXNzKSAtLT4gKGhvc3RuYW1lLCBbYWxpYXMsIC4uLl0sIFtJUCBhZGRyLCAuLi5dKQogLSBzb2NrZXQuZ2V0aG9zdG5hbWUoKSAtLT4gaG9zdCBuYW1lIChzdHJpbmc6ICdzcGFtJyBvciAnc3BhbS5kb21haW4uY29tJykKQEAgLTM1LDcgKzM1LDcgQEAKIC0gc29ja2V0Lmh0b25zKDE2IGJpdCB2YWx1ZSkgLS0+IG5ldyBpbnQgb2JqZWN0CiAtIHNvY2tldC5odG9ubCgzMiBiaXQgdmFsdWUpIC0tPiBuZXcgaW50IG9iamVjdAogLSBzb2NrZXQuZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCBbLCBmYW1pbHksIHNvY2t0eXBlLCBwcm90bywgZmxhZ3NdKQotCS0tPiBMaXN0IG9mIChmYW1pbHksIHNvY2t0eXBlLCBwcm90bywgY2Fub25uYW1lLCBzb2NrYWRkcikKKyAgICAtLT4gTGlzdCBvZiAoZmFtaWx5LCBzb2NrdHlwZSwgcHJvdG8sIGNhbm9ubmFtZSwgc29ja2FkZHIpCiAtIHNvY2tldC5nZXRuYW1laW5mbyhzb2NrYWRkciwgZmxhZ3MpIC0tPiAoaG9zdCwgcG9ydCkKIC0gc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSwgZXRjLjogY29uc3RhbnRzIGZyb20gPHNvY2tldC5oPgogLSBzb2NrZXQuaGFzX2lwdjY6IGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiBJUHY2IGlzIHN1cHBvcnRlZApAQCAtNTUsMjIgKzU1LDIyIEBACiAgIHNwZWNpZnkgcGFja2V0LXR5cGUgYW5kIGhhLXR5cGUvYWRkci4KIC0gYW4gQUZfVElQQyBzb2NrZXQgYWRkcmVzcyBpcyBleHByZXNzZWQgYXMKICAoYWRkcl90eXBlLCB2MSwgdjIsIHYzIFssIHNjb3BlXSk7IHdoZXJlIGFkZHJfdHlwZSBjYW4gYmUgb25lIG9mOgotCVRJUENfQUREUl9OQU1FU0VRLCBUSVBDX0FERFJfTkFNRSwgYW5kIFRJUENfQUREUl9JRDsKKyAgICBUSVBDX0FERFJfTkFNRVNFUSwgVElQQ19BRERSX05BTUUsIGFuZCBUSVBDX0FERFJfSUQ7CiAgIGFuZCBzY29wZSBjYW4gYmUgb25lIG9mOgotCVRJUENfWk9ORV9TQ09QRSwgVElQQ19DTFVTVEVSX1NDT1BFLCBhbmQgVElQQ19OT0RFX1NDT1BFLgorICAgIFRJUENfWk9ORV9TQ09QRSwgVElQQ19DTFVTVEVSX1NDT1BFLCBhbmQgVElQQ19OT0RFX1NDT1BFLgogICBUaGUgbWVhbmluZyBvZiB2MSwgdjIgYW5kIHYzIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIGFkZHJfdHlwZToKLQlpZiBhZGRyX3R5cGUgaXMgVElQQ19BRERSX05BTUU6Ci0JCXYxIGlzIHRoZSBzZXJ2ZXIgdHlwZQotCQl2MiBpcyB0aGUgcG9ydCBpZGVudGlmaWVyCi0JCXYzIGlzIGlnbm9yZWQKLQlpZiBhZGRyX3R5cGUgaXMgVElQQ19BRERSX05BTUVTRVE6Ci0JCXYxIGlzIHRoZSBzZXJ2ZXIgdHlwZQotCQl2MiBpcyB0aGUgbG93ZXIgcG9ydCBudW1iZXIKLQkJdjMgaXMgdGhlIHVwcGVyIHBvcnQgbnVtYmVyCi0JaWYgYWRkcl90eXBlIGlzIFRJUENfQUREUl9JRDoKLQkJdjEgaXMgdGhlIG5vZGUKLQkJdjIgaXMgdGhlIHJlZgotCQl2MyBpcyBpZ25vcmVkCisgICAgaWYgYWRkcl90eXBlIGlzIFRJUENfQUREUl9OQU1FOgorICAgICAgICB2MSBpcyB0aGUgc2VydmVyIHR5cGUKKyAgICAgICAgdjIgaXMgdGhlIHBvcnQgaWRlbnRpZmllcgorICAgICAgICB2MyBpcyBpZ25vcmVkCisgICAgaWYgYWRkcl90eXBlIGlzIFRJUENfQUREUl9OQU1FU0VROgorICAgICAgICB2MSBpcyB0aGUgc2VydmVyIHR5cGUKKyAgICAgICAgdjIgaXMgdGhlIGxvd2VyIHBvcnQgbnVtYmVyCisgICAgICAgIHYzIGlzIHRoZSB1cHBlciBwb3J0IG51bWJlcgorICAgIGlmIGFkZHJfdHlwZSBpcyBUSVBDX0FERFJfSUQ6CisgICAgICAgIHYxIGlzIHRoZSBub2RlCisgICAgICAgIHYyIGlzIHRoZSByZWYKKyAgICAgICAgdjMgaXMgaWdub3JlZAogCiAKIExvY2FsIG5hbWluZyBjb252ZW50aW9uczoKQEAgLTI5NSw3ICsyOTUsNyBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogCiAjaWZuZGVmIG9mZnNldG9mCi0jIGRlZmluZSBvZmZzZXRvZih0eXBlLCBtZW1iZXIpCSgoc2l6ZV90KSgmKCh0eXBlICopMCktPm1lbWJlcikpCisjIGRlZmluZSBvZmZzZXRvZih0eXBlLCBtZW1iZXIpICgoc2l6ZV90KSgmKCh0eXBlICopMCktPm1lbWJlcikpCiAjZW5kaWYKIAogI2lmbmRlZiBPX05PTkJMT0NLCkBAIC00MTUsNyArNDE1LDcgQEAKICNkZWZpbmUgU0VHTUVOVF9TSVpFICgzMiAqIDEwMjQgLTEpCiAjZW5kaWYKIAotI2RlZmluZQlTQVMyU0EoeCkJKChzdHJ1Y3Qgc29ja2FkZHIgKikoeCkpCisjZGVmaW5lIFNBUzJTQSh4KSAgICAgICAoKHN0cnVjdCBzb2NrYWRkciAqKSh4KSkKIAogLyoKICAqIENvbnN0YW50cyBmb3IgZ2V0bmFtZWluZm8oKQpAQCAtNDcxLDggKzQ3MSw4IEBACiBzdGF0aWMgUHlPYmplY3QqCiBzZWxlY3RfZXJyb3Iodm9pZCkKIHsKLQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAidW5hYmxlIHRvIHNlbGVjdCBvbiBzb2NrZXQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAidW5hYmxlIHRvIHNlbGVjdCBvbiBzb2NrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gcmFpc2UgYW4gZXJyb3IgYWNjb3JkaW5nIHRvIGVycm5vCkBAIC00ODIsMTA3ICs0ODIsMTA3IEBACiBzZXRfZXJyb3Iodm9pZCkKIHsKICNpZmRlZiBNU19XSU5ET1dTCi0JaW50IGVycl9ubyA9IFdTQUdldExhc3RFcnJvcigpOwotCS8qIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKCkgaW52b2tlcyBGb3JtYXRNZXNzYWdlKCkgd2hpY2gKLQkgICByZWNvZ25pemVzIHRoZSBlcnJvciBjb2RlcyB1c2VkIGJ5IGJvdGggR2V0TGFzdEVycm9yKCkgYW5kCi0JICAgV1NBR2V0TGFzdEVycm9yICovCi0JaWYgKGVycl9ubykKLQkJcmV0dXJuIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKHNvY2tldF9lcnJvciwgZXJyX25vKTsKKyAgICBpbnQgZXJyX25vID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgLyogUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoKSBpbnZva2VzIEZvcm1hdE1lc3NhZ2UoKSB3aGljaAorICAgICAgIHJlY29nbml6ZXMgdGhlIGVycm9yIGNvZGVzIHVzZWQgYnkgYm90aCBHZXRMYXN0RXJyb3IoKSBhbmQKKyAgICAgICBXU0FHZXRMYXN0RXJyb3IgKi8KKyAgICBpZiAoZXJyX25vKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoc29ja2V0X2Vycm9yLCBlcnJfbm8pOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiAhZGVmaW5lZChQWUNDX0dDQykKLQlpZiAoc29ja19lcnJubygpICE9IE5PX0VSUk9SKSB7Ci0JCUFQSVJFVCByYzsKLQkJVUxPTkcgIG1zZ2xlbjsKLQkJY2hhciBvdXRidWZbMTAwXTsKLQkJaW50IG15ZXJyb3Jjb2RlID0gc29ja19lcnJubygpOworICAgIGlmIChzb2NrX2Vycm5vKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQVBJUkVUIHJjOworICAgICAgICBVTE9ORyAgbXNnbGVuOworICAgICAgICBjaGFyIG91dGJ1ZlsxMDBdOworICAgICAgICBpbnQgbXllcnJvcmNvZGUgPSBzb2NrX2Vycm5vKCk7CiAKLQkJLyogUmV0cmlldmUgc29ja2V0LXJlbGF0ZWQgZXJyb3IgbWVzc2FnZSBmcm9tIE1QVE4uTVNHIGZpbGUgKi8KLQkJcmMgPSBEb3NHZXRNZXNzYWdlKE5VTEwsIDAsIG91dGJ1Ziwgc2l6ZW9mKG91dGJ1ZiksCi0JCQkJICAgbXllcnJvcmNvZGUgLSBTT0NCQVNFRVJSICsgMjYsCi0JCQkJICAgIm1wdG4ubXNnIiwKLQkJCQkgICAmbXNnbGVuKTsKLQkJaWYgKHJjID09IE5PX0VSUk9SKSB7Ci0JCQlQeU9iamVjdCAqdjsKKyAgICAgICAgLyogUmV0cmlldmUgc29ja2V0LXJlbGF0ZWQgZXJyb3IgbWVzc2FnZSBmcm9tIE1QVE4uTVNHIGZpbGUgKi8KKyAgICAgICAgcmMgPSBEb3NHZXRNZXNzYWdlKE5VTEwsIDAsIG91dGJ1Ziwgc2l6ZW9mKG91dGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBteWVycm9yY29kZSAtIFNPQ0JBU0VFUlIgKyAyNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcHRuLm1zZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnbGVuKTsKKyAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdjsKIAotCQkJLyogT1MvMiBkb2Vzbid0IGd1YXJhbnRlZSBhIHRlcm1pbmF0b3IgKi8KLQkJCW91dGJ1Zlttc2dsZW5dID0gJ1wwJzsKLQkJCWlmIChzdHJsZW4ob3V0YnVmKSA+IDApIHsKLQkJCQkvKiBJZiBub24tZW1wdHkgbXNnLCB0cmltIENSTEYgKi8KLQkJCQljaGFyICpsYXN0YyA9ICZvdXRidWZbIHN0cmxlbihvdXRidWYpLTEgXTsKLQkJCQl3aGlsZSAobGFzdGMgPiBvdXRidWYgJiYKLQkJCQkgICAgICAgaXNzcGFjZShQeV9DSEFSTUFTSygqbGFzdGMpKSkgewotCQkJCQkvKiBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2UgKENSTEYpICovCi0JCQkJCSpsYXN0Yy0tID0gJ1wwJzsKLQkJCQl9Ci0JCQl9Ci0JCQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIG15ZXJyb3Jjb2RlLCBvdXRidWYpOwotCQkJaWYgKHYgIT0gTlVMTCkgewotCQkJCVB5RXJyX1NldE9iamVjdChzb2NrZXRfZXJyb3IsIHYpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCX0KLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgICAgICAgICAgLyogT1MvMiBkb2Vzbid0IGd1YXJhbnRlZSBhIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgICAgIG91dGJ1Zlttc2dsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIGlmIChzdHJsZW4ob3V0YnVmKSA+IDApIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBub24tZW1wdHkgbXNnLCB0cmltIENSTEYgKi8KKyAgICAgICAgICAgICAgICBjaGFyICpsYXN0YyA9ICZvdXRidWZbIHN0cmxlbihvdXRidWYpLTEgXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobGFzdGMgPiBvdXRidWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgaXNzcGFjZShQeV9DSEFSTUFTSygqbGFzdGMpKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2UgKENSTEYpICovCisgICAgICAgICAgICAgICAgICAgICpsYXN0Yy0tID0gJ1wwJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIG15ZXJyb3Jjb2RlLCBvdXRidWYpOworICAgICAgICAgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChzb2NrZXRfZXJyb3IsIHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKICNpZiBkZWZpbmVkKFJJU0NPUykKLQlpZiAoX2luZXRfZXJyb3IuZXJybnVtICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnY7Ci0JCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJybm8sIF9pbmV0X2VycigpKTsKLQkJaWYgKHYgIT0gTlVMTCkgewotCQkJUHlFcnJfU2V0T2JqZWN0KHNvY2tldF9lcnJvciwgdik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChfaW5ldF9lcnJvci5lcnJudW0gIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnJubywgX2luZXRfZXJyKCkpOworICAgICAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3Qoc29ja2V0X2Vycm9yLCB2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oc29ja2V0X2Vycm9yKTsKKyAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKHNvY2tldF9lcnJvcik7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9oZXJyb3IoaW50IGhfZXJyb3IpCiB7Ci0JUHlPYmplY3QgKnY7CisgICAgUHlPYmplY3QgKnY7CiAKICNpZmRlZiBIQVZFX0hTVFJFUlJPUgotCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgaF9lcnJvciwgKGNoYXIgKiloc3RyZXJyb3IoaF9lcnJvcikpOworICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgaF9lcnJvciwgKGNoYXIgKiloc3RyZXJyb3IoaF9lcnJvcikpOwogI2Vsc2UKLQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGhfZXJyb3IsICJob3N0IG5vdCBmb3VuZCIpOworICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgaF9lcnJvciwgImhvc3Qgbm90IGZvdW5kIik7CiAjZW5kaWYKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCVB5RXJyX1NldE9iamVjdChzb2NrZXRfaGVycm9yLCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCX0KKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldE9iamVjdChzb2NrZXRfaGVycm9yLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfZ2FpZXJyb3IoaW50IGVycm9yKQogewotCVB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICp2OwogCiAjaWZkZWYgRUFJX1NZU1RFTQotCS8qIEVBSV9TWVNURU0gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzIFhQLiAqLwotCWlmIChlcnJvciA9PSBFQUlfU1lTVEVNKQotCQlyZXR1cm4gc2V0X2Vycm9yKCk7CisgICAgLyogRUFJX1NZU1RFTSBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MgWFAuICovCisgICAgaWYgKGVycm9yID09IEVBSV9TWVNURU0pCisgICAgICAgIHJldHVybiBzZXRfZXJyb3IoKTsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9HQUlfU1RSRVJST1IKLQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGVycm9yLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKKyAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGVycm9yLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKICNlbHNlCi0JdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnJvciwgImdldGFkZHJpbmZvIGZhaWxlZCIpOworICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJyb3IsICJnZXRhZGRyaW5mbyBmYWlsZWQiKTsKICNlbmRpZgotCWlmICh2ICE9IE5VTEwpIHsKLQkJUHlFcnJfU2V0T2JqZWN0KHNvY2tldF9nYWllcnJvciwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRPYmplY3Qoc29ja2V0X2dhaWVycm9yLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiAjaWZkZWYgX19WTVMKQEAgLTU5MCwyMiArNTkwLDIyIEBACiBzdGF0aWMgaW50CiBzZW5kc2VnbWVudGVkKGludCBzb2NrX2ZkLCBjaGFyICpidWYsIGludCBsZW4sIGludCBmbGFncykKIHsKLQlpbnQgbiA9IDA7Ci0JaW50IHJlbWFpbmluZyA9IGxlbjsKKyAgICBpbnQgbiA9IDA7CisgICAgaW50IHJlbWFpbmluZyA9IGxlbjsKIAotCXdoaWxlIChyZW1haW5pbmcgPiAwKSB7Ci0JCXVuc2lnbmVkIGludCBzZWdtZW50OworICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBzZWdtZW50OwogCi0JCXNlZ21lbnQgPSAocmVtYWluaW5nID49IFNFR01FTlRfU0laRSA/IFNFR01FTlRfU0laRSA6IHJlbWFpbmluZyk7Ci0JCW4gPSBzZW5kKHNvY2tfZmQsIGJ1Ziwgc2VnbWVudCwgZmxhZ3MpOwotCQlpZiAobiA8IDApIHsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJlbWFpbmluZyAtPSBzZWdtZW50OwotCQlidWYgKz0gc2VnbWVudDsKLQl9IC8qIGVuZCB3aGlsZSAqLworICAgICAgICBzZWdtZW50ID0gKHJlbWFpbmluZyA+PSBTRUdNRU5UX1NJWkUgPyBTRUdNRU5UX1NJWkUgOiByZW1haW5pbmcpOworICAgICAgICBuID0gc2VuZChzb2NrX2ZkLCBidWYsIHNlZ21lbnQsIGZsYWdzKTsKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorICAgICAgICByZW1haW5pbmcgLT0gc2VnbWVudDsKKyAgICAgICAgYnVmICs9IHNlZ21lbnQ7CisgICAgfSAvKiBlbmQgd2hpbGUgKi8KIAotCXJldHVybiBsZW47CisgICAgcmV0dXJuIGxlbjsKIH0KICNlbmRpZgogCkBAIC02MTYsNDUgKzYxNiw0NSBAQAogewogI2lmbmRlZiBSSVNDT1MKICNpZm5kZWYgTVNfV0lORE9XUwotCWludCBkZWxheV9mbGFnOworICAgIGludCBkZWxheV9mbGFnOwogI2VuZGlmCiAjZW5kaWYKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAjaWZkZWYgX19CRU9TX18KLQlibG9jayA9ICFibG9jazsKLQlzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIFNPTF9TT0NLRVQsIFNPX05PTkJMT0NLLAotCQkgICAodm9pZCAqKSgmYmxvY2spLCBzaXplb2YoaW50KSk7CisgICAgYmxvY2sgPSAhYmxvY2s7CisgICAgc2V0c29ja29wdChzLT5zb2NrX2ZkLCBTT0xfU09DS0VULCBTT19OT05CTE9DSywKKyAgICAgICAgICAgICAgICh2b2lkICopKCZibG9jayksIHNpemVvZihpbnQpKTsKICNlbHNlCiAjaWZuZGVmIFJJU0NPUwogI2lmbmRlZiBNU19XSU5ET1dTCiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgIWRlZmluZWQoUFlDQ19HQ0MpCi0JYmxvY2sgPSAhYmxvY2s7Ci0JaW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKGNhZGRyX3QpJmJsb2NrLCBzaXplb2YoYmxvY2spKTsKKyAgICBibG9jayA9ICFibG9jazsKKyAgICBpb2N0bChzLT5zb2NrX2ZkLCBGSU9OQklPLCAoY2FkZHJfdCkmYmxvY2ssIHNpemVvZihibG9jaykpOwogI2VsaWYgZGVmaW5lZChfX1ZNUykKLQlibG9jayA9ICFibG9jazsKLQlpb2N0bChzLT5zb2NrX2ZkLCBGSU9OQklPLCAodW5zaWduZWQgaW50ICopJmJsb2NrKTsKKyAgICBibG9jayA9ICFibG9jazsKKyAgICBpb2N0bChzLT5zb2NrX2ZkLCBGSU9OQklPLCAodW5zaWduZWQgaW50ICopJmJsb2NrKTsKICNlbHNlICAvKiAhUFlPU19PUzIgJiYgIV9fVk1TICovCi0JZGVsYXlfZmxhZyA9IGZjbnRsKHMtPnNvY2tfZmQsIEZfR0VURkwsIDApOwotCWlmIChibG9jaykKLQkJZGVsYXlfZmxhZyAmPSAofk9fTk9OQkxPQ0spOwotCWVsc2UKLQkJZGVsYXlfZmxhZyB8PSBPX05PTkJMT0NLOwotCWZjbnRsKHMtPnNvY2tfZmQsIEZfU0VURkwsIGRlbGF5X2ZsYWcpOworICAgIGRlbGF5X2ZsYWcgPSBmY250bChzLT5zb2NrX2ZkLCBGX0dFVEZMLCAwKTsKKyAgICBpZiAoYmxvY2spCisgICAgICAgIGRlbGF5X2ZsYWcgJj0gKH5PX05PTkJMT0NLKTsKKyAgICBlbHNlCisgICAgICAgIGRlbGF5X2ZsYWcgfD0gT19OT05CTE9DSzsKKyAgICBmY250bChzLT5zb2NrX2ZkLCBGX1NFVEZMLCBkZWxheV9mbGFnKTsKICNlbmRpZiAvKiAhUFlPU19PUzIgKi8KICNlbHNlIC8qIE1TX1dJTkRPV1MgKi8KLQlibG9jayA9ICFibG9jazsKLQlpb2N0bHNvY2tldChzLT5zb2NrX2ZkLCBGSU9OQklPLCAodV9sb25nKikmYmxvY2spOworICAgIGJsb2NrID0gIWJsb2NrOworICAgIGlvY3Rsc29ja2V0KHMtPnNvY2tfZmQsIEZJT05CSU8sICh1X2xvbmcqKSZibG9jayk7CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogI2Vsc2UgLyogUklTQ09TICovCi0JYmxvY2sgPSAhYmxvY2s7Ci0Jc29ja2V0aW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKHVfbG9uZyopJmJsb2NrKTsKKyAgICBibG9jayA9ICFibG9jazsKKyAgICBzb2NrZXRpb2N0bChzLT5zb2NrX2ZkLCBGSU9OQklPLCAodV9sb25nKikmYmxvY2spOwogI2VuZGlmIC8qIFJJU0NPUyAqLwogI2VuZGlmIC8qIF9fQkVPU19fICovCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JLyogU2luY2UgdGhlc2UgZG9uJ3QgcmV0dXJuIGFueXRoaW5nICovCi0JcmV0dXJuIDE7CisgICAgLyogU2luY2UgdGhlc2UgZG9uJ3QgcmV0dXJuIGFueXRoaW5nICovCisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIERvIGEgc2VsZWN0KCkvcG9sbCgpIG9uIHRoZSBzb2NrZXQsIGlmIG5lY2Vzc2FyeSAoc29ja190aW1lb3V0ID4gMCkuCkBAIC02NjUsNTMgKzY2NSw1MyBAQAogc3RhdGljIGludAogaW50ZXJuYWxfc2VsZWN0KFB5U29ja2V0U29ja09iamVjdCAqcywgaW50IHdyaXRpbmcpCiB7Ci0JaW50IG47CisgICAgaW50IG47CiAKLQkvKiBOb3RoaW5nIHRvIGRvIHVubGVzcyB3ZSdyZSBpbiB0aW1lb3V0IG1vZGUgKG5vdCBub24tYmxvY2tpbmcpICovCi0JaWYgKHMtPnNvY2tfdGltZW91dCA8PSAwLjApCi0JCXJldHVybiAwOworICAgIC8qIE5vdGhpbmcgdG8gZG8gdW5sZXNzIHdlJ3JlIGluIHRpbWVvdXQgbW9kZSAobm90IG5vbi1ibG9ja2luZykgKi8KKyAgICBpZiAocy0+c29ja190aW1lb3V0IDw9IDAuMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBHdWFyZCBhZ2FpbnN0IGNsb3NlZCBzb2NrZXQgKi8KLQlpZiAocy0+c29ja19mZCA8IDApCi0JCXJldHVybiAwOworICAgIC8qIEd1YXJkIGFnYWluc3QgY2xvc2VkIHNvY2tldCAqLworICAgIGlmIChzLT5zb2NrX2ZkIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBQcmVmZXIgcG9sbCwgaWYgYXZhaWxhYmxlLCBzaW5jZSB5b3UgY2FuIHBvbGwoKSBhbnkgZmQKLQkgKiB3aGljaCBjYW4ndCBiZSBkb25lIHdpdGggc2VsZWN0KCkuICovCisgICAgLyogUHJlZmVyIHBvbGwsIGlmIGF2YWlsYWJsZSwgc2luY2UgeW91IGNhbiBwb2xsKCkgYW55IGZkCisgICAgICogd2hpY2ggY2FuJ3QgYmUgZG9uZSB3aXRoIHNlbGVjdCgpLiAqLwogI2lmZGVmIEhBVkVfUE9MTAotCXsKLQkJc3RydWN0IHBvbGxmZCBwb2xsZmQ7Ci0JCWludCB0aW1lb3V0OworICAgIHsKKyAgICAgICAgc3RydWN0IHBvbGxmZCBwb2xsZmQ7CisgICAgICAgIGludCB0aW1lb3V0OwogCi0JCXBvbGxmZC5mZCA9IHMtPnNvY2tfZmQ7Ci0JCXBvbGxmZC5ldmVudHMgPSB3cml0aW5nID8gUE9MTE9VVCA6IFBPTExJTjsKKyAgICAgICAgcG9sbGZkLmZkID0gcy0+c29ja19mZDsKKyAgICAgICAgcG9sbGZkLmV2ZW50cyA9IHdyaXRpbmcgPyBQT0xMT1VUIDogUE9MTElOOwogCi0JCS8qIHMtPnNvY2tfdGltZW91dCBpcyBpbiBzZWNvbmRzLCB0aW1lb3V0IGluIG1zICovCi0JCXRpbWVvdXQgPSAoaW50KShzLT5zb2NrX3RpbWVvdXQgKiAxMDAwICsgMC41KTsgCi0JCW4gPSBwb2xsKCZwb2xsZmQsIDEsIHRpbWVvdXQpOwotCX0KKyAgICAgICAgLyogcy0+c29ja190aW1lb3V0IGlzIGluIHNlY29uZHMsIHRpbWVvdXQgaW4gbXMgKi8KKyAgICAgICAgdGltZW91dCA9IChpbnQpKHMtPnNvY2tfdGltZW91dCAqIDEwMDAgKyAwLjUpOworICAgICAgICBuID0gcG9sbCgmcG9sbGZkLCAxLCB0aW1lb3V0KTsKKyAgICB9CiAjZWxzZQotCXsKLQkJLyogQ29uc3RydWN0IHRoZSBhcmd1bWVudHMgdG8gc2VsZWN0ICovCi0JCWZkX3NldCBmZHM7Ci0JCXN0cnVjdCB0aW1ldmFsIHR2OwotCQl0di50dl9zZWMgPSAoaW50KXMtPnNvY2tfdGltZW91dDsKLQkJdHYudHZfdXNlYyA9IChpbnQpKChzLT5zb2NrX3RpbWVvdXQgLSB0di50dl9zZWMpICogMWU2KTsKLQkJRkRfWkVSTygmZmRzKTsKLQkJRkRfU0VUKHMtPnNvY2tfZmQsICZmZHMpOworICAgIHsKKyAgICAgICAgLyogQ29uc3RydWN0IHRoZSBhcmd1bWVudHMgdG8gc2VsZWN0ICovCisgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICB0di50dl9zZWMgPSAoaW50KXMtPnNvY2tfdGltZW91dDsKKyAgICAgICAgdHYudHZfdXNlYyA9IChpbnQpKChzLT5zb2NrX3RpbWVvdXQgLSB0di50dl9zZWMpICogMWU2KTsKKyAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgRkRfU0VUKHMtPnNvY2tfZmQsICZmZHMpOwogCi0JCS8qIFNlZSBpZiB0aGUgc29ja2V0IGlzIHJlYWR5ICovCi0JCWlmICh3cml0aW5nKQotCQkJbiA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsIE5VTEwsICZmZHMsIE5VTEwsICZ0dik7Ci0JCWVsc2UKLQkJCW4gPSBzZWxlY3Qocy0+c29ja19mZCsxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpOwotCX0KKyAgICAgICAgLyogU2VlIGlmIHRoZSBzb2NrZXQgaXMgcmVhZHkgKi8KKyAgICAgICAgaWYgKHdyaXRpbmcpCisgICAgICAgICAgICBuID0gc2VsZWN0KHMtPnNvY2tfZmQrMSwgTlVMTCwgJmZkcywgTlVMTCwgJnR2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbiA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsICZmZHMsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgfQogI2VuZGlmCi0JCi0JaWYgKG4gPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7CisKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogSW5pdGlhbGl6ZSBhIG5ldyBzb2NrZXQgb2JqZWN0LiAqLwpAQCAtNzIwLDI1ICs3MjAsMjUgQEAKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRfc29ja29iamVjdChQeVNvY2tldFNvY2tPYmplY3QgKnMsCi0JCVNPQ0tFVF9UIGZkLCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvKQorICAgICAgICAgICAgICAgIFNPQ0tFVF9UIGZkLCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvKQogewogI2lmZGVmIFJJU0NPUwotCWludCBibG9jayA9IDE7CisgICAgaW50IGJsb2NrID0gMTsKICNlbmRpZgotCXMtPnNvY2tfZmQgPSBmZDsKLQlzLT5zb2NrX2ZhbWlseSA9IGZhbWlseTsKLQlzLT5zb2NrX3R5cGUgPSB0eXBlOwotCXMtPnNvY2tfcHJvdG8gPSBwcm90bzsKLQlzLT5zb2NrX3RpbWVvdXQgPSBkZWZhdWx0dGltZW91dDsKKyAgICBzLT5zb2NrX2ZkID0gZmQ7CisgICAgcy0+c29ja19mYW1pbHkgPSBmYW1pbHk7CisgICAgcy0+c29ja190eXBlID0gdHlwZTsKKyAgICBzLT5zb2NrX3Byb3RvID0gcHJvdG87CisgICAgcy0+c29ja190aW1lb3V0ID0gZGVmYXVsdHRpbWVvdXQ7CiAKLQlzLT5lcnJvcmhhbmRsZXIgPSAmc2V0X2Vycm9yOworICAgIHMtPmVycm9yaGFuZGxlciA9ICZzZXRfZXJyb3I7CiAKLQlpZiAoZGVmYXVsdHRpbWVvdXQgPj0gMC4wKQotCQlpbnRlcm5hbF9zZXRibG9ja2luZyhzLCAwKTsKKyAgICBpZiAoZGVmYXVsdHRpbWVvdXQgPj0gMC4wKQorICAgICAgICBpbnRlcm5hbF9zZXRibG9ja2luZyhzLCAwKTsKIAogI2lmZGVmIFJJU0NPUwotCWlmICh0YXNrd2luZG93KQotCQlzb2NrZXRpb2N0bChzLT5zb2NrX2ZkLCAweDgwMDQ2Njc5LCAodV9sb25nKikmYmxvY2spOworICAgIGlmICh0YXNrd2luZG93KQorICAgICAgICBzb2NrZXRpb2N0bChzLT5zb2NrX2ZkLCAweDgwMDQ2Njc5LCAodV9sb25nKikmYmxvY2spOwogI2VuZGlmCiB9CiAKQEAgLTc1MSwxMiArNzUxLDEyIEBACiBzdGF0aWMgUHlTb2NrZXRTb2NrT2JqZWN0ICoKIG5ld19zb2Nrb2JqZWN0KFNPQ0tFVF9UIGZkLCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvKQogewotCVB5U29ja2V0U29ja09iamVjdCAqczsKLQlzID0gKFB5U29ja2V0U29ja09iamVjdCAqKQotCQlQeVR5cGVfR2VuZXJpY05ldygmc29ja190eXBlLCBOVUxMLCBOVUxMKTsKLQlpZiAocyAhPSBOVUxMKQotCQlpbml0X3NvY2tvYmplY3QocywgZmQsIGZhbWlseSwgdHlwZSwgcHJvdG8pOwotCXJldHVybiBzOworICAgIFB5U29ja2V0U29ja09iamVjdCAqczsKKyAgICBzID0gKFB5U29ja2V0U29ja09iamVjdCAqKQorICAgICAgICBQeVR5cGVfR2VuZXJpY05ldygmc29ja190eXBlLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocyAhPSBOVUxMKQorICAgICAgICBpbml0X3NvY2tvYmplY3QocywgZmQsIGZhbWlseSwgdHlwZSwgcHJvdG8pOworICAgIHJldHVybiBzOwogfQogCiAKQEAgLTc3NiwxMjIgKzc3NiwxMjIgQEAKIHN0YXRpYyBpbnQKIHNldGlwYWRkcihjaGFyICpuYW1lLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJfcmV0LCBzaXplX3QgYWRkcl9yZXRfc2l6ZSwgaW50IGFmKQogewotCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlczsKLQlpbnQgZXJyb3I7Ci0JaW50IGQxLCBkMiwgZDMsIGQ0OwotCWNoYXIgY2g7CisgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzOworICAgIGludCBlcnJvcjsKKyAgICBpbnQgZDEsIGQyLCBkMywgZDQ7CisgICAgY2hhciBjaDsKIAotCW1lbXNldCgodm9pZCAqKSBhZGRyX3JldCwgJ1wwJywgc2l6ZW9mKCphZGRyX3JldCkpOwotCWlmIChuYW1lWzBdID09ICdcMCcpIHsKLQkJaW50IHNpejsKLQkJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JCWhpbnRzLmFpX2ZhbWlseSA9IGFmOwotCQloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CS8qZHVtbXkqLwotCQloaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJQUNRVUlSRV9HRVRBRERSSU5GT19MT0NLCi0JCWVycm9yID0gZ2V0YWRkcmluZm8oTlVMTCwgIjAiLCAmaGludHMsICZyZXMpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkvKiBXZSBhc3N1bWUgdGhhdCB0aG9zZSB0aHJlYWQtdW5zYWZlIGdldGFkZHJpbmZvKCkgdmVyc2lvbnMKLQkJICAgKmFyZSogc2FmZSByZWdhcmRpbmcgdGhlaXIgcmV0dXJuIHZhbHVlLCBpZS4gdGhhdCBhCi0JCSAgIHN1YnNlcXVlbnQgY2FsbCB0byBnZXRhZGRyaW5mbygpIGRvZXMgbm90IGRlc3Ryb3kgdGhlCi0JCSAgIG91dGNvbWUgb2YgdGhlIGZpcnN0IGNhbGwuICovCi0JCVJFTEVBU0VfR0VUQUREUklORk9fTE9DSwotCQlpZiAoZXJyb3IpIHsKLQkJCXNldF9nYWllcnJvcihlcnJvcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc3dpdGNoIChyZXMtPmFpX2ZhbWlseSkgewotCQljYXNlIEFGX0lORVQ6Ci0JCQlzaXogPSA0OwotCQkJYnJlYWs7CisgICAgbWVtc2V0KCh2b2lkICopIGFkZHJfcmV0LCAnXDAnLCBzaXplb2YoKmFkZHJfcmV0KSk7CisgICAgaWYgKG5hbWVbMF0gPT0gJ1wwJykgeworICAgICAgICBpbnQgc2l6OworICAgICAgICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgICAgICAgaGludHMuYWlfZmFtaWx5ID0gYWY7CisgICAgICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsgICAgICAgICAvKmR1bW15Ki8KKyAgICAgICAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIEFDUVVJUkVfR0VUQUREUklORk9fTE9DSworICAgICAgICBlcnJvciA9IGdldGFkZHJpbmZvKE5VTEwsICIwIiwgJmhpbnRzLCAmcmVzKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgLyogV2UgYXNzdW1lIHRoYXQgdGhvc2UgdGhyZWFkLXVuc2FmZSBnZXRhZGRyaW5mbygpIHZlcnNpb25zCisgICAgICAgICAgICphcmUqIHNhZmUgcmVnYXJkaW5nIHRoZWlyIHJldHVybiB2YWx1ZSwgaWUuIHRoYXQgYQorICAgICAgICAgICBzdWJzZXF1ZW50IGNhbGwgdG8gZ2V0YWRkcmluZm8oKSBkb2VzIG5vdCBkZXN0cm95IHRoZQorICAgICAgICAgICBvdXRjb21lIG9mIHRoZSBmaXJzdCBjYWxsLiAqLworICAgICAgICBSRUxFQVNFX0dFVEFERFJJTkZPX0xPQ0sKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBzZXRfZ2FpZXJyb3IoZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAocmVzLT5haV9mYW1pbHkpIHsKKyAgICAgICAgY2FzZSBBRl9JTkVUOgorICAgICAgICAgICAgc2l6ID0gNDsKKyAgICAgICAgICAgIGJyZWFrOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCWNhc2UgQUZfSU5FVDY6Ci0JCQlzaXogPSAxNjsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICAgICAgc2l6ID0gMTY7CisgICAgICAgICAgICBicmVhazsKICNlbmRpZgotCQlkZWZhdWx0OgotCQkJZnJlZWFkZHJpbmZvKHJlcyk7Ci0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJCSJ1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChyZXMtPmFpX25leHQpIHsKLQkJCWZyZWVhZGRyaW5mbyhyZXMpOwotCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkid2lsZGNhcmQgcmVzb2x2ZWQgdG8gbXVsdGlwbGUgYWRkcmVzcyIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChyZXMtPmFpX2FkZHJsZW4gPCBhZGRyX3JldF9zaXplKQotCQkJYWRkcl9yZXRfc2l6ZSA9IHJlcy0+YWlfYWRkcmxlbjsKLQkJbWVtY3B5KGFkZHJfcmV0LCByZXMtPmFpX2FkZHIsIGFkZHJfcmV0X3NpemUpOwotCQlmcmVlYWRkcmluZm8ocmVzKTsKLQkJcmV0dXJuIHNpejsKLQl9Ci0JaWYgKG5hbWVbMF0gPT0gJzwnICYmIHN0cmNtcChuYW1lLCAiPGJyb2FkY2FzdD4iKSA9PSAwKSB7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOwotCQlpZiAoYWYgIT0gQUZfSU5FVCAmJiBhZiAhPSBBRl9VTlNQRUMpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJImFkZHJlc3MgZmFtaWx5IG1pc21hdGNoZWQiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcl9yZXQ7Ci0JCW1lbXNldCgodm9pZCAqKSBzaW4sICdcMCcsIHNpemVvZigqc2luKSk7Ci0JCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcmVlYWRkcmluZm8ocmVzKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcy0+YWlfbmV4dCkgeworICAgICAgICAgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAorICAgICAgICAgICAgICAgICJ3aWxkY2FyZCByZXNvbHZlZCB0byBtdWx0aXBsZSBhZGRyZXNzIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcy0+YWlfYWRkcmxlbiA8IGFkZHJfcmV0X3NpemUpCisgICAgICAgICAgICBhZGRyX3JldF9zaXplID0gcmVzLT5haV9hZGRybGVuOworICAgICAgICBtZW1jcHkoYWRkcl9yZXQsIHJlcy0+YWlfYWRkciwgYWRkcl9yZXRfc2l6ZSk7CisgICAgICAgIGZyZWVhZGRyaW5mbyhyZXMpOworICAgICAgICByZXR1cm4gc2l6OworICAgIH0KKyAgICBpZiAobmFtZVswXSA9PSAnPCcgJiYgc3RyY21wKG5hbWUsICI8YnJvYWRjYXN0PiIpID09IDApIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICpzaW47CisgICAgICAgIGlmIChhZiAhPSBBRl9JTkVUICYmIGFmICE9IEFGX1VOU1BFQykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAiYWRkcmVzcyBmYW1pbHkgbWlzbWF0Y2hlZCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyX3JldDsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopIHNpbiwgJ1wwJywgc2l6ZW9mKCpzaW4pKTsKKyAgICAgICAgc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKICNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCQlzaW4tPnNpbl9sZW4gPSBzaXplb2YoKnNpbik7CisgICAgICAgIHNpbi0+c2luX2xlbiA9IHNpemVvZigqc2luKTsKICNlbmRpZgotCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9CUk9BRENBU1Q7Ci0JCXJldHVybiBzaXplb2Yoc2luLT5zaW5fYWRkcik7Ci0JfQotCWlmIChzc2NhbmYobmFtZSwgIiVkLiVkLiVkLiVkJWMiLCAmZDEsICZkMiwgJmQzLCAmZDQsICZjaCkgPT0gNCAmJgotCSAgICAwIDw9IGQxICYmIGQxIDw9IDI1NSAmJiAwIDw9IGQyICYmIGQyIDw9IDI1NSAmJgotCSAgICAwIDw9IGQzICYmIGQzIDw9IDI1NSAmJiAwIDw9IGQ0ICYmIGQ0IDw9IDI1NSkgewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKLQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHJfcmV0OwotCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKAotCQkJKChsb25nKSBkMSA8PCAyNCkgfCAoKGxvbmcpIGQyIDw8IDE2KSB8Ci0JCQkoKGxvbmcpIGQzIDw8IDgpIHwgKChsb25nKSBkNCA8PCAwKSk7Ci0JCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIHNpbi0+c2luX2FkZHIuc19hZGRyID0gSU5BRERSX0JST0FEQ0FTVDsKKyAgICAgICAgcmV0dXJuIHNpemVvZihzaW4tPnNpbl9hZGRyKTsKKyAgICB9CisgICAgaWYgKHNzY2FuZihuYW1lLCAiJWQuJWQuJWQuJWQlYyIsICZkMSwgJmQyLCAmZDMsICZkNCwgJmNoKSA9PSA0ICYmCisgICAgICAgIDAgPD0gZDEgJiYgZDEgPD0gMjU1ICYmIDAgPD0gZDIgJiYgZDIgPD0gMjU1ICYmCisgICAgICAgIDAgPD0gZDMgJiYgZDMgPD0gMjU1ICYmIDAgPD0gZDQgJiYgZDQgPD0gMjU1KSB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworICAgICAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcl9yZXQ7CisgICAgICAgIHNpbi0+c2luX2FkZHIuc19hZGRyID0gaHRvbmwoCisgICAgICAgICAgICAoKGxvbmcpIGQxIDw8IDI0KSB8ICgobG9uZykgZDIgPDwgMTYpIHwKKyAgICAgICAgICAgICgobG9uZykgZDMgPDwgOCkgfCAoKGxvbmcpIGQ0IDw8IDApKTsKKyAgICAgICAgc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKICNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCQlzaW4tPnNpbl9sZW4gPSBzaXplb2YoKnNpbik7CisgICAgICAgIHNpbi0+c2luX2xlbiA9IHNpemVvZigqc2luKTsKICNlbmRpZgotCQlyZXR1cm4gNDsKLQl9Ci0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JaGludHMuYWlfZmFtaWx5ID0gYWY7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCUFDUVVJUkVfR0VUQUREUklORk9fTE9DSwotCWVycm9yID0gZ2V0YWRkcmluZm8obmFtZSwgTlVMTCwgJmhpbnRzLCAmcmVzKTsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorICAgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICAgIGhpbnRzLmFpX2ZhbWlseSA9IGFmOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBBQ1FVSVJFX0dFVEFERFJJTkZPX0xPQ0sKKyAgICBlcnJvciA9IGdldGFkZHJpbmZvKG5hbWUsIE5VTEwsICZoaW50cywgJnJlcyk7CiAjaWYgZGVmaW5lZChfX2RpZ2l0YWxfXykgJiYgZGVmaW5lZChfX3VuaXhfXykKLQlpZiAoZXJyb3IgPT0gRUFJX05PTkFNRSAmJiBhZiA9PSBBRl9VTlNQRUMpIHsKLQkJLyogT24gVHJ1NjQgVjUuMSwgbnVtZXJpYy10by1hZGRyIGNvbnZlcnNpb24gZmFpbHMKLQkJICAgaWYgbm8gYWRkcmVzcyBmYW1pbHkgaXMgZ2l2ZW4uIEFzc3VtZSBJUHY0IGZvciBub3cuKi8KLQkJaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKLQkJZXJyb3IgPSBnZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmaGludHMsICZyZXMpOwotCX0KKyAgICBpZiAoZXJyb3IgPT0gRUFJX05PTkFNRSAmJiBhZiA9PSBBRl9VTlNQRUMpIHsKKyAgICAgICAgLyogT24gVHJ1NjQgVjUuMSwgbnVtZXJpYy10by1hZGRyIGNvbnZlcnNpb24gZmFpbHMKKyAgICAgICAgICAgaWYgbm8gYWRkcmVzcyBmYW1pbHkgaXMgZ2l2ZW4uIEFzc3VtZSBJUHY0IGZvciBub3cuKi8KKyAgICAgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgZXJyb3IgPSBnZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmaGludHMsICZyZXMpOworICAgIH0KICNlbmRpZgotCVB5X0VORF9BTExPV19USFJFQURTCi0JUkVMRUFTRV9HRVRBRERSSU5GT19MT0NLICAvKiBzZWUgY29tbWVudCBpbiBzZXRpcGFkZHIoKSAqLwotCWlmIChlcnJvcikgewotCQlzZXRfZ2FpZXJyb3IoZXJyb3IpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChyZXMtPmFpX2FkZHJsZW4gPCBhZGRyX3JldF9zaXplKQotCQlhZGRyX3JldF9zaXplID0gcmVzLT5haV9hZGRybGVuOwotCW1lbWNweSgoY2hhciAqKSBhZGRyX3JldCwgcmVzLT5haV9hZGRyLCBhZGRyX3JldF9zaXplKTsKLQlmcmVlYWRkcmluZm8ocmVzKTsKLQlzd2l0Y2ggKGFkZHJfcmV0LT5zYV9mYW1pbHkpIHsKLQljYXNlIEFGX0lORVQ6Ci0JCXJldHVybiA0OworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUkVMRUFTRV9HRVRBRERSSU5GT19MT0NLICAvKiBzZWUgY29tbWVudCBpbiBzZXRpcGFkZHIoKSAqLworICAgIGlmIChlcnJvcikgeworICAgICAgICBzZXRfZ2FpZXJyb3IoZXJyb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyZXMtPmFpX2FkZHJsZW4gPCBhZGRyX3JldF9zaXplKQorICAgICAgICBhZGRyX3JldF9zaXplID0gcmVzLT5haV9hZGRybGVuOworICAgIG1lbWNweSgoY2hhciAqKSBhZGRyX3JldCwgcmVzLT5haV9hZGRyLCBhZGRyX3JldF9zaXplKTsKKyAgICBmcmVlYWRkcmluZm8ocmVzKTsKKyAgICBzd2l0Y2ggKGFkZHJfcmV0LT5zYV9mYW1pbHkpIHsKKyAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgIHJldHVybiA0OwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JY2FzZSBBRl9JTkVUNjoKLQkJcmV0dXJuIDE2OworICAgIGNhc2UgQUZfSU5FVDY6CisgICAgICAgIHJldHVybiAxNjsKICNlbmRpZgotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJ1bmtub3duIGFkZHJlc3MgZmFtaWx5Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInVua25vd24gYWRkcmVzcyBmYW1pbHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogCkBAIC05MDIsMTYgKzkwMiwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1ha2VpcGFkZHIoc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbikKIHsKLQljaGFyIGJ1ZltOSV9NQVhIT1NUXTsKLQlpbnQgZXJyb3I7CisgICAgY2hhciBidWZbTklfTUFYSE9TVF07CisgICAgaW50IGVycm9yOwogCi0JZXJyb3IgPSBnZXRuYW1laW5mbyhhZGRyLCBhZGRybGVuLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwLAotCQlOSV9OVU1FUklDSE9TVCk7Ci0JaWYgKGVycm9yKSB7Ci0JCXNldF9nYWllcnJvcihlcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGVycm9yID0gZ2V0bmFtZWluZm8oYWRkciwgYWRkcmxlbiwgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCwKKyAgICAgICAgTklfTlVNRVJJQ0hPU1QpOworICAgIGlmIChlcnJvcikgeworICAgICAgICBzZXRfZ2FpZXJyb3IoZXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogCkBAIC05MjMsMjQgKzkyMywyNCBAQAogc3RhdGljIGludAogc2V0YmRhZGRyKGNoYXIgKm5hbWUsIGJkYWRkcl90ICpiZGFkZHIpCiB7Ci0JdW5zaWduZWQgaW50IGIwLCBiMSwgYjIsIGIzLCBiNCwgYjU7Ci0JY2hhciBjaDsKLQlpbnQgbjsKKyAgICB1bnNpZ25lZCBpbnQgYjAsIGIxLCBiMiwgYjMsIGI0LCBiNTsKKyAgICBjaGFyIGNoOworICAgIGludCBuOwogCi0JbiA9IHNzY2FuZihuYW1lLCAiJVg6JVg6JVg6JVg6JVg6JVglYyIsCi0JCSAgICZiNSwgJmI0LCAmYjMsICZiMiwgJmIxLCAmYjAsICZjaCk7Ci0JaWYgKG4gPT0gNiAmJiAoYjAgfCBiMSB8IGIyIHwgYjMgfCBiNCB8IGI1KSA8IDI1NikgewotCQliZGFkZHItPmJbMF0gPSBiMDsKLQkJYmRhZGRyLT5iWzFdID0gYjE7Ci0JCWJkYWRkci0+YlsyXSA9IGIyOwotCQliZGFkZHItPmJbM10gPSBiMzsKLQkJYmRhZGRyLT5iWzRdID0gYjQ7Ci0JCWJkYWRkci0+Yls1XSA9IGI1OwotCQlyZXR1cm4gNjsKLQl9IGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiYmFkIGJsdWV0b290aCBhZGRyZXNzIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgbiA9IHNzY2FuZihuYW1lLCAiJVg6JVg6JVg6JVg6JVg6JVglYyIsCisgICAgICAgICAgICAgICAmYjUsICZiNCwgJmIzLCAmYjIsICZiMSwgJmIwLCAmY2gpOworICAgIGlmIChuID09IDYgJiYgKGIwIHwgYjEgfCBiMiB8IGIzIHwgYjQgfCBiNSkgPCAyNTYpIHsKKyAgICAgICAgYmRhZGRyLT5iWzBdID0gYjA7CisgICAgICAgIGJkYWRkci0+YlsxXSA9IGIxOworICAgICAgICBiZGFkZHItPmJbMl0gPSBiMjsKKyAgICAgICAgYmRhZGRyLT5iWzNdID0gYjM7CisgICAgICAgIGJkYWRkci0+Yls0XSA9IGI0OworICAgICAgICBiZGFkZHItPmJbNV0gPSBiNTsKKyAgICAgICAgcmV0dXJuIDY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImJhZCBibHVldG9vdGggYWRkcmVzcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiAvKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJsdWV0b290aCBhZGRyZXNzLiAgVGhpcyBpcyBhbHdheXMgYQpAQCAtOTUwLDEyICs5NTAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlYmRhZGRyKGJkYWRkcl90ICpiZGFkZHIpCiB7Ci0JY2hhciBidWZbKDYgKiAyKSArIDUgKyAxXTsKKyAgICBjaGFyIGJ1ZlsoNiAqIDIpICsgNSArIDFdOwogCi0Jc3ByaW50ZihidWYsICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCi0JCWJkYWRkci0+Yls1XSwgYmRhZGRyLT5iWzRdLCBiZGFkZHItPmJbM10sCi0JCWJkYWRkci0+YlsyXSwgYmRhZGRyLT5iWzFdLCBiZGFkZHItPmJbMF0pOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgc3ByaW50ZihidWYsICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisgICAgICAgIGJkYWRkci0+Yls1XSwgYmRhZGRyLT5iWzRdLCBiZGFkZHItPmJbM10sCisgICAgICAgIGJkYWRkci0+YlsyXSwgYmRhZGRyLT5iWzFdLCBiZGFkZHItPmJbMF0pOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAjZW5kaWYKIApAQCAtOTY5LDE5OSArOTY5LDE5OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1ha2Vzb2NrYWRkcihpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhZGRybGVuLCBpbnQgcHJvdG8pCiB7Ci0JaWYgKGFkZHJsZW4gPT0gMCkgewotCQkvKiBObyBhZGRyZXNzIC0tIG1heSBiZSByZWN2ZnJvbSgpIGZyb20ga25vd24gc29ja2V0ICovCi0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIGlmIChhZGRybGVuID09IDApIHsKKyAgICAgICAgLyogTm8gYWRkcmVzcyAtLSBtYXkgYmUgcmVjdmZyb20oKSBmcm9tIGtub3duIHNvY2tldCAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIAogI2lmZGVmIF9fQkVPU19fCi0JLyogWFhYOiBCZU9TIHZlcnNpb24gb2YgYWNjZXB0KCkgZG9lc24ndCBzZXQgZmFtaWx5IGNvcnJlY3RseSAqLwotCWFkZHItPnNhX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgLyogWFhYOiBCZU9TIHZlcnNpb24gb2YgYWNjZXB0KCkgZG9lc24ndCBzZXQgZmFtaWx5IGNvcnJlY3RseSAqLworICAgIGFkZHItPnNhX2ZhbWlseSA9IEFGX0lORVQ7CiAjZW5kaWYKIAotCXN3aXRjaCAoYWRkci0+c2FfZmFtaWx5KSB7CisgICAgc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKIAotCWNhc2UgQUZfSU5FVDoKLQl7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiAqYTsKLQkJUHlPYmplY3QgKmFkZHJvYmogPSBtYWtlaXBhZGRyKGFkZHIsIHNpemVvZigqYSkpOwotCQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQkJaWYgKGFkZHJvYmopIHsKLQkJCWEgPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcjsKLQkJCXJldCA9IFB5X0J1aWxkVmFsdWUoIk9pIiwgYWRkcm9iaiwgbnRvaHMoYS0+c2luX3BvcnQpKTsKLQkJCVB5X0RFQ1JFRihhZGRyb2JqKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KKyAgICBjYXNlIEFGX0lORVQ6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmE7CisgICAgICAgIFB5T2JqZWN0ICphZGRyb2JqID0gbWFrZWlwYWRkcihhZGRyLCBzaXplb2YoKmEpKTsKKyAgICAgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgICAgIGlmIChhZGRyb2JqKSB7CisgICAgICAgICAgICBhID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHI7CisgICAgICAgICAgICByZXQgPSBQeV9CdWlsZFZhbHVlKCJPaSIsIGFkZHJvYmosIG50b2hzKGEtPnNpbl9wb3J0KSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYWRkcm9iaik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKICNpZiBkZWZpbmVkKEFGX1VOSVgpCi0JY2FzZSBBRl9VTklYOgotCXsKLQkJc3RydWN0IHNvY2thZGRyX3VuICphID0gKHN0cnVjdCBzb2NrYWRkcl91biAqKSBhZGRyOworICAgIGNhc2UgQUZfVU5JWDoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl91biAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4gKikgYWRkcjsKICNpZmRlZiBsaW51eAotCQlpZiAoYS0+c3VuX3BhdGhbMF0gPT0gMCkgeyAgLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlICovCi0JCQlhZGRybGVuIC09IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpOwotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGEtPnN1bl9wYXRoLAotCQkJCQkJCSAgYWRkcmxlbik7Ci0JCX0KLQkJZWxzZQorICAgICAgICBpZiAoYS0+c3VuX3BhdGhbMF0gPT0gMCkgeyAgLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlICovCisgICAgICAgICAgICBhZGRybGVuIC09IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpOworICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGEtPnN1bl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJsZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZiAvKiBsaW51eCAqLwotCQl7Ci0JCQkvKiByZWd1bGFyIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgKi8KLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGEtPnN1bl9wYXRoKTsKLQkJfQotCX0KKyAgICAgICAgeworICAgICAgICAgICAgLyogcmVndWxhciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nICovCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhhLT5zdW5fcGF0aCk7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYgLyogQUZfVU5JWCAqLwogCiAjaWYgZGVmaW5lZChBRl9ORVRMSU5LKQogICAgICAgIGNhc2UgQUZfTkVUTElOSzoKICAgICAgICB7Ci0gICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgKmEgPSAoc3RydWN0IHNvY2thZGRyX25sICopIGFkZHI7Ci0gICAgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSUkiLCBhLT5ubF9waWQsIGEtPm5sX2dyb3Vwcyk7CisgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9ubCAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfbmwgKikgYWRkcjsKKyAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIklJIiwgYS0+bmxfcGlkLCBhLT5ubF9ncm91cHMpOwogICAgICAgIH0KICNlbmRpZiAvKiBBRl9ORVRMSU5LICovCiAKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphOwotCQlQeU9iamVjdCAqYWRkcm9iaiA9IG1ha2VpcGFkZHIoYWRkciwgc2l6ZW9mKCphKSk7Ci0JCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCQlpZiAoYWRkcm9iaikgewotCQkJYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcjsKLQkJCXJldCA9IFB5X0J1aWxkVmFsdWUoIk9paWkiLAotCQkJCQkgICAgYWRkcm9iaiwKLQkJCQkJICAgIG50b2hzKGEtPnNpbjZfcG9ydCksCi0JCQkJCSAgICBhLT5zaW42X2Zsb3dpbmZvLAotCQkJCQkgICAgYS0+c2luNl9zY29wZV9pZCk7Ci0JCQlQeV9ERUNSRUYoYWRkcm9iaik7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9CisgICAgY2FzZSBBRl9JTkVUNjoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKmE7CisgICAgICAgIFB5T2JqZWN0ICphZGRyb2JqID0gbWFrZWlwYWRkcihhZGRyLCBzaXplb2YoKmEpKTsKKyAgICAgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgICAgIGlmIChhZGRyb2JqKSB7CisgICAgICAgICAgICBhID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyOworICAgICAgICAgICAgcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT2lpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKGEtPnNpbjZfcG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnNpbjZfZmxvd2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnNpbjZfc2NvcGVfaWQpOworICAgICAgICAgICAgUHlfREVDUkVGKGFkZHJvYmopOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBVU0VfQkxVRVRPT1RICi0JY2FzZSBBRl9CTFVFVE9PVEg6Ci0JCXN3aXRjaCAocHJvdG8pIHsKKyAgICBjYXNlIEFGX0JMVUVUT09USDoKKyAgICAgICAgc3dpdGNoIChwcm90bykgewogCi0JCWNhc2UgQlRQUk9UT19MMkNBUDoKLQkJewotCQkJc3RydWN0IHNvY2thZGRyX2wyICphID0gKHN0cnVjdCBzb2NrYWRkcl9sMiAqKSBhZGRyOwotCQkJUHlPYmplY3QgKmFkZHJvYmogPSBtYWtlYmRhZGRyKCZfQlRfTDJfTUVNQihhLCBiZGFkZHIpKTsKLQkJCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCQkJaWYgKGFkZHJvYmopIHsKLQkJCQlyZXQgPSBQeV9CdWlsZFZhbHVlKCJPaSIsCi0JCQkJCQkgICAgYWRkcm9iaiwKLQkJCQkJCSAgICBfQlRfTDJfTUVNQihhLCBwc20pKTsKLQkJCQlQeV9ERUNSRUYoYWRkcm9iaik7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9CisgICAgICAgIGNhc2UgQlRQUk9UT19MMkNBUDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2wyICphID0gKHN0cnVjdCBzb2NrYWRkcl9sMiAqKSBhZGRyOworICAgICAgICAgICAgUHlPYmplY3QgKmFkZHJvYmogPSBtYWtlYmRhZGRyKCZfQlRfTDJfTUVNQihhLCBiZGFkZHIpKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgICAgICAgICAgaWYgKGFkZHJvYmopIHsKKyAgICAgICAgICAgICAgICByZXQgPSBQeV9CdWlsZFZhbHVlKCJPaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JUX0wyX01FTUIoYSwgcHNtKSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFkZHJvYmopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogCi0JCWNhc2UgQlRQUk9UT19SRkNPTU06Ci0JCXsKLQkJCXN0cnVjdCBzb2NrYWRkcl9yYyAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfcmMgKikgYWRkcjsKLQkJCVB5T2JqZWN0ICphZGRyb2JqID0gbWFrZWJkYWRkcigmX0JUX1JDX01FTUIoYSwgYmRhZGRyKSk7Ci0JCQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQkJCWlmIChhZGRyb2JqKSB7Ci0JCQkJcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT2kiLAotCQkJCQkJICAgIGFkZHJvYmosCi0JCQkJCQkgICAgX0JUX1JDX01FTUIoYSwgY2hhbm5lbCkpOwotCQkJCVB5X0RFQ1JFRihhZGRyb2JqKTsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KKyAgICAgICAgY2FzZSBCVFBST1RPX1JGQ09NTToKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3JjICphID0gKHN0cnVjdCBzb2NrYWRkcl9yYyAqKSBhZGRyOworICAgICAgICAgICAgUHlPYmplY3QgKmFkZHJvYmogPSBtYWtlYmRhZGRyKCZfQlRfUkNfTUVNQihhLCBiZGFkZHIpKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgICAgICAgICAgaWYgKGFkZHJvYmopIHsKKyAgICAgICAgICAgICAgICByZXQgPSBQeV9CdWlsZFZhbHVlKCJPaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JUX1JDX01FTUIoYSwgY2hhbm5lbCkpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhZGRyb2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KIAotCQljYXNlIEJUUFJPVE9fSENJOgotCQl7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfaGNpICphID0gKHN0cnVjdCBzb2NrYWRkcl9oY2kgKikgYWRkcjsKLQkJCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCQkJcmV0ID0gUHlfQnVpbGRWYWx1ZSgiaSIsIF9CVF9IQ0lfTUVNQihhLCBkZXYpKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KKyAgICAgICAgY2FzZSBCVFBST1RPX0hDSToKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2hjaSAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaGNpICopIGFkZHI7CisgICAgICAgICAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICAgICAgICAgIHJldCA9IFB5X0J1aWxkVmFsdWUoImkiLCBfQlRfSENJX01FTUIoYSwgZGV2KSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAKICNpZiAhZGVmaW5lZChfX0ZyZWVCU0RfXykKLQkJY2FzZSBCVFBST1RPX1NDTzoKLQkJewotCQkJc3RydWN0IHNvY2thZGRyX3NjbyAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfc2NvICopIGFkZHI7Ci0JCQlyZXR1cm4gbWFrZWJkYWRkcigmX0JUX1NDT19NRU1CKGEsIGJkYWRkcikpOwotCQl9CisgICAgICAgIGNhc2UgQlRQUk9UT19TQ086CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zY28gKmEgPSAoc3RydWN0IHNvY2thZGRyX3NjbyAqKSBhZGRyOworICAgICAgICAgICAgcmV0dXJuIG1ha2ViZGFkZHIoJl9CVF9TQ09fTUVNQihhLCBiZGFkZHIpKTsKKyAgICAgICAgfQogI2VuZGlmCiAKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiVW5rbm93biBCbHVldG9vdGggcHJvdG9jb2wiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBCbHVldG9vdGggcHJvdG9jb2wiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9ICi0JY2FzZSBBRl9QQUNLRVQ6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfbGwgKmEgPSAoc3RydWN0IHNvY2thZGRyX2xsICopYWRkcjsKLQkJY2hhciAqaWZuYW1lID0gIiI7Ci0JCXN0cnVjdCBpZnJlcSBpZnI7Ci0JCS8qIG5lZWQgdG8gbG9vayB1cCBpbnRlcmZhY2UgbmFtZSBnaXZlIGluZGV4ICovCi0JCWlmIChhLT5zbGxfaWZpbmRleCkgewotCQkJaWZyLmlmcl9pZmluZGV4ID0gYS0+c2xsX2lmaW5kZXg7Ci0JCQlpZiAoaW9jdGwoc29ja2ZkLCBTSU9DR0lGTkFNRSwgJmlmcikgPT0gMCkKLQkJCQlpZm5hbWUgPSBpZnIuaWZyX25hbWU7Ci0JCX0KLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoInNoYmhzIyIsCi0JCQkJICAgICBpZm5hbWUsCi0JCQkJICAgICBudG9ocyhhLT5zbGxfcHJvdG9jb2wpLAotCQkJCSAgICAgYS0+c2xsX3BrdHR5cGUsCi0JCQkJICAgICBhLT5zbGxfaGF0eXBlLAotCQkJCSAgICAgYS0+c2xsX2FkZHIsCi0JCQkJICAgICBhLT5zbGxfaGFsZW4pOwotCX0KKyAgICBjYXNlIEFGX1BBQ0tFVDoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9sbCAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfbGwgKilhZGRyOworICAgICAgICBjaGFyICppZm5hbWUgPSAiIjsKKyAgICAgICAgc3RydWN0IGlmcmVxIGlmcjsKKyAgICAgICAgLyogbmVlZCB0byBsb29rIHVwIGludGVyZmFjZSBuYW1lIGdpdmUgaW5kZXggKi8KKyAgICAgICAgaWYgKGEtPnNsbF9pZmluZGV4KSB7CisgICAgICAgICAgICBpZnIuaWZyX2lmaW5kZXggPSBhLT5zbGxfaWZpbmRleDsKKyAgICAgICAgICAgIGlmIChpb2N0bChzb2NrZmQsIFNJT0NHSUZOQU1FLCAmaWZyKSA9PSAwKQorICAgICAgICAgICAgICAgIGlmbmFtZSA9IGlmci5pZnJfbmFtZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgic2hiaHMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhhLT5zbGxfcHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5zbGxfcGt0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2xsX2hhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2xsX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnNsbF9oYWxlbik7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0xJTlVYX1RJUENfSAotCWNhc2UgQUZfVElQQzoKLQl7Ci0JCXN0cnVjdCBzb2NrYWRkcl90aXBjICphID0gKHN0cnVjdCBzb2NrYWRkcl90aXBjICopIGFkZHI7Ci0JCWlmIChhLT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTkFNRVNFUSkgewotCQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIklJSUlJIiwKLQkJCQkJYS0+YWRkcnR5cGUsCi0JCQkJCWEtPmFkZHIubmFtZXNlcS50eXBlLAotCQkJCQlhLT5hZGRyLm5hbWVzZXEubG93ZXIsCi0JCQkJCWEtPmFkZHIubmFtZXNlcS51cHBlciwKLQkJCQkJYS0+c2NvcGUpOwotCQl9IGVsc2UgaWYgKGEtPmFkZHJ0eXBlID09IFRJUENfQUREUl9OQU1FKSB7Ci0JCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSUlJSUkiLAotCQkJCQlhLT5hZGRydHlwZSwKLQkJCQkJYS0+YWRkci5uYW1lLm5hbWUudHlwZSwKLQkJCQkJYS0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2UsCi0JCQkJCWEtPmFkZHIubmFtZS5uYW1lLmluc3RhbmNlLAotCQkJCQlhLT5zY29wZSk7Ci0JCX0gZWxzZSBpZiAoYS0+YWRkcnR5cGUgPT0gVElQQ19BRERSX0lEKSB7Ci0JCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSUlJSUkiLAotCQkJCQlhLT5hZGRydHlwZSwKLQkJCQkJYS0+YWRkci5pZC5ub2RlLAotCQkJCQlhLT5hZGRyLmlkLnJlZiwKLQkJCQkJMCwKLQkJCQkJYS0+c2NvcGUpOwotCQl9IGVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJJbnZhbGlkIGFkZHJlc3MgdHlwZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgY2FzZSBBRl9USVBDOgorICAgIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX3RpcGMgKmEgPSAoc3RydWN0IHNvY2thZGRyX3RpcGMgKikgYWRkcjsKKyAgICAgICAgaWYgKGEtPmFkZHJ0eXBlID09IFRJUENfQUREUl9OQU1FU0VRKSB7CisgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSUlJSUkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHIubmFtZXNlcS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHIubmFtZXNlcS5sb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hZGRyLm5hbWVzZXEudXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2NvcGUpOworICAgICAgICB9IGVsc2UgaWYgKGEtPmFkZHJ0eXBlID09IFRJUENfQUREUl9OQU1FKSB7CisgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSUlJSUkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHIubmFtZS5uYW1lLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2NvcGUpOworICAgICAgICB9IGVsc2UgaWYgKGEtPmFkZHJ0eXBlID09IFRJUENfQUREUl9JRCkgeworICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIklJSUlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hZGRydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hZGRyLmlkLm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+YWRkci5pZC5yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5zY29wZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBhZGRyZXNzIHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKLQkvKiBNb3JlIGNhc2VzIGhlcmUuLi4gKi8KKyAgICAvKiBNb3JlIGNhc2VzIGhlcmUuLi4gKi8KIAotCWRlZmF1bHQ6Ci0JCS8qIElmIHdlIGRvbid0IGtub3cgdGhlIGFkZHJlc3MgZmFtaWx5LCBkb24ndCByYWlzZSBhbgotCQkgICBleGNlcHRpb24gLS0gcmV0dXJuIGl0IGFzIGEgdHVwbGUuICovCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpcyMiLAotCQkJCSAgICAgYWRkci0+c2FfZmFtaWx5LAotCQkJCSAgICAgYWRkci0+c2FfZGF0YSwKLQkJCQkgICAgIHNpemVvZihhZGRyLT5zYV9kYXRhKSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogSWYgd2UgZG9uJ3Qga25vdyB0aGUgYWRkcmVzcyBmYW1pbHksIGRvbid0IHJhaXNlIGFuCisgICAgICAgICAgIGV4Y2VwdGlvbiAtLSByZXR1cm4gaXQgYXMgYSB0dXBsZS4gKi8KKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHItPnNhX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkci0+c2FfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFkZHItPnNhX2RhdGEpKTsKIAotCX0KKyAgICB9CiB9CiAKIApAQCAtMTE3MiwzNDYgKzExNzIsMzQ2IEBACiAKIHN0YXRpYyBpbnQKIGdldHNvY2thZGRyYXJnKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MsCi0JICAgICAgIHN0cnVjdCBzb2NrYWRkciAqYWRkcl9yZXQsIGludCAqbGVuX3JldCkKKyAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqYWRkcl9yZXQsIGludCAqbGVuX3JldCkKIHsKLQlzd2l0Y2ggKHMtPnNvY2tfZmFtaWx5KSB7CisgICAgc3dpdGNoIChzLT5zb2NrX2ZhbWlseSkgewogCiAjaWYgZGVmaW5lZChBRl9VTklYKQotCWNhc2UgQUZfVU5JWDoKLQl7Ci0JCXN0cnVjdCBzb2NrYWRkcl91biogYWRkcjsKLQkJY2hhciAqcGF0aDsKLQkJaW50IGxlbjsKLQkJaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAidCMiLCAmcGF0aCwgJmxlbikpCi0JCQlyZXR1cm4gMDsKKyAgICBjYXNlIEFGX1VOSVg6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4qIGFkZHI7CisgICAgICAgIGNoYXIgKnBhdGg7CisgICAgICAgIGludCBsZW47CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgInQjIiwgJnBhdGgsICZsZW4pKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4qKWFkZHJfcmV0OworICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl91biopYWRkcl9yZXQ7CiAjaWZkZWYgbGludXgKLQkJaWYgKGxlbiA+IDAgJiYgcGF0aFswXSA9PSAwKSB7Ci0JCQkvKiBMaW51eCBhYnN0cmFjdCBuYW1lc3BhY2UgZXh0ZW5zaW9uICovCi0JCQlpZiAobGVuID4gc2l6ZW9mIGFkZHItPnN1bl9wYXRoKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkJCSJBRl9VTklYIHBhdGggdG9vIGxvbmciKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCQllbHNlCisgICAgICAgIGlmIChsZW4gPiAwICYmIHBhdGhbMF0gPT0gMCkgeworICAgICAgICAgICAgLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlIGV4dGVuc2lvbiAqLworICAgICAgICAgICAgaWYgKGxlbiA+IHNpemVvZiBhZGRyLT5zdW5fcGF0aCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBRl9VTklYIHBhdGggdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCiAjZW5kaWYgLyogbGludXggKi8KLSAgICAgICAgICAgICAgICB7Ci0JCQkvKiByZWd1bGFyIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgKi8KLQkJCWlmIChsZW4gPj0gc2l6ZW9mIGFkZHItPnN1bl9wYXRoKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkJCSJBRl9VTklYIHBhdGggdG9vIGxvbmciKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWFkZHItPnN1bl9wYXRoW2xlbl0gPSAwOwotCQl9Ci0JCWFkZHItPnN1bl9mYW1pbHkgPSBzLT5zb2NrX2ZhbWlseTsKLQkJbWVtY3B5KGFkZHItPnN1bl9wYXRoLCBwYXRoLCBsZW4pOworICAgICAgICB7CisgICAgICAgICAgICAvKiByZWd1bGFyIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgKi8KKyAgICAgICAgICAgIGlmIChsZW4gPj0gc2l6ZW9mIGFkZHItPnN1bl9wYXRoKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFGX1VOSVggcGF0aCB0b28gbG9uZyIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkci0+c3VuX3BhdGhbbGVuXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYWRkci0+c3VuX2ZhbWlseSA9IHMtPnNvY2tfZmFtaWx5OworICAgICAgICBtZW1jcHkoYWRkci0+c3VuX3BhdGgsIHBhdGgsIGxlbik7CiAjaWYgZGVmaW5lZChQWU9TX09TMikKLQkJKmxlbl9yZXQgPSBzaXplb2YoKmFkZHIpOworICAgICAgICAqbGVuX3JldCA9IHNpemVvZigqYWRkcik7CiAjZWxzZQotCQkqbGVuX3JldCA9IGxlbiArIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpOworICAgICAgICAqbGVuX3JldCA9IGxlbiArIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpOwogI2VuZGlmCi0JCXJldHVybiAxOwotCX0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmIC8qIEFGX1VOSVggKi8KIAogI2lmIGRlZmluZWQoQUZfTkVUTElOSykKLQljYXNlIEFGX05FVExJTks6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfbmwqIGFkZHI7Ci0JCWludCBwaWQsIGdyb3VwczsKLQkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbmwgKilhZGRyX3JldDsKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCSJnZXRzb2NrYWRkcmFyZzogIgotCQkJCSJBRl9ORVRMSU5LIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCi0JCQkJUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIklJOmdldHNvY2thZGRyYXJnIiwgJnBpZCwgJmdyb3VwcykpCi0JCQlyZXR1cm4gMDsKLQkJYWRkci0+bmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKLQkJYWRkci0+bmxfcGlkID0gcGlkOwotCQlhZGRyLT5ubF9ncm91cHMgPSBncm91cHM7Ci0JCSpsZW5fcmV0ID0gc2l6ZW9mKCphZGRyKTsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNhc2UgQUZfTkVUTElOSzoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9ubCogYWRkcjsKKyAgICAgICAgaW50IHBpZCwgZ3JvdXBzOworICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9ubCAqKWFkZHJfcmV0OworICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgIkFGX05FVExJTksgYWRkcmVzcyBtdXN0IGJlIHR1cGxlLCBub3QgJS41MDBzIiwKKyAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZ3MpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSUk6Z2V0c29ja2FkZHJhcmciLCAmcGlkLCAmZ3JvdXBzKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBhZGRyLT5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworICAgICAgICBhZGRyLT5ubF9waWQgPSBwaWQ7CisgICAgICAgIGFkZHItPm5sX2dyb3VwcyA9IGdyb3VwczsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YoKmFkZHIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAjZW5kaWYKIAotCWNhc2UgQUZfSU5FVDoKLQl7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiogYWRkcjsKLQkJY2hhciAqaG9zdDsKLQkJaW50IHBvcnQsIHJlc3VsdDsKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCSJnZXRzb2NrYWRkcmFyZzogIgotCQkJCSJBRl9JTkVUIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCi0JCQkJUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aTpnZXRzb2NrYWRkcmFyZyIsCi0JCQkJICAgICAgImlkbmEiLCAmaG9zdCwgJnBvcnQpKQotCQkJcmV0dXJuIDA7Ci0JCWFkZHI9KHN0cnVjdCBzb2NrYWRkcl9pbiopYWRkcl9yZXQ7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2V0aXBhZGRyKGhvc3QsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmFkZHIpLCAgQUZfSU5FVCk7Ci0gICAgICAgICAgICAgICAgUHlNZW1fRnJlZShob3N0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKLQkJCXJldHVybiAwOwotCQlpZiAocG9ydCA8IDAgfHwgcG9ydCA+IDB4ZmZmZikgewotCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCVB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImdldHNvY2thZGRyYXJnOiBwb3J0IG11c3QgYmUgMC02NTUzNS4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWFkZHItPnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCQlhZGRyLT5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClwb3J0KTsKLQkJKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7Ci0JCXJldHVybiAxOwotCX0KKyAgICBjYXNlIEFGX0lORVQ6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4qIGFkZHI7CisgICAgICAgIGNoYXIgKmhvc3Q7CisgICAgICAgIGludCBwb3J0LCByZXN1bHQ7CisgICAgICAgIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiZ2V0c29ja2FkZHJhcmc6ICIKKyAgICAgICAgICAgICAgICAiQUZfSU5FVCBhZGRyZXNzIG11c3QgYmUgdHVwbGUsIG5vdCAlLjUwMHMiLAorICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJncyktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldGk6Z2V0c29ja2FkZHJhcmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkbmEiLCAmaG9zdCwgJnBvcnQpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGFkZHI9KHN0cnVjdCBzb2NrYWRkcl9pbiopYWRkcl9yZXQ7CisgICAgICAgIHJlc3VsdCA9IHNldGlwYWRkcihob3N0LCAoc3RydWN0IHNvY2thZGRyICopYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqYWRkciksICBBRl9JTkVUKTsKKyAgICAgICAgUHlNZW1fRnJlZShob3N0KTsKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiAweGZmZmYpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgICAgICBQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJnZXRzb2NrYWRkcmFyZzogcG9ydCBtdXN0IGJlIDAtNjU1MzUuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBhZGRyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgYWRkci0+c2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW42KiBhZGRyOwotCQljaGFyICpob3N0OwotCQlpbnQgcG9ydCwgZmxvd2luZm8sIHNjb3BlX2lkLCByZXN1bHQ7Ci0JCWZsb3dpbmZvID0gc2NvcGVfaWQgPSAwOwotCQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJCVB5RXJyX0Zvcm1hdCgKLQkJCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImdldHNvY2thZGRyYXJnOiAiCi0JCQkJIkFGX0lORVQ2IGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCi0JCQkJUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aXxpaSIsCi0JCQkJICAgICAgImlkbmEiLCAmaG9zdCwgJnBvcnQsICZmbG93aW5mbywKLQkJCQkgICAgICAmc2NvcGVfaWQpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYqKWFkZHJfcmV0OwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNldGlwYWRkcihob3N0LCAoc3RydWN0IHNvY2thZGRyICopYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCphZGRyKSwgQUZfSU5FVDYpOwotICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUoaG9zdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCi0JCQlyZXR1cm4gMDsKLQkJaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiAweGZmZmYpIHsKLQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQlQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJnZXRzb2NrYWRkcmFyZzogcG9ydCBtdXN0IGJlIDAtNjU1MzUuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlhZGRyLT5zaW42X2ZhbWlseSA9IHMtPnNvY2tfZmFtaWx5OwotCQlhZGRyLT5zaW42X3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7Ci0JCWFkZHItPnNpbjZfZmxvd2luZm8gPSBmbG93aW5mbzsKLQkJYWRkci0+c2luNl9zY29wZV9pZCA9IHNjb3BlX2lkOwotCQkqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNhc2UgQUZfSU5FVDY6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBhZGRyOworICAgICAgICBjaGFyICpob3N0OworICAgICAgICBpbnQgcG9ydCwgZmxvd2luZm8sIHNjb3BlX2lkLCByZXN1bHQ7CisgICAgICAgIGZsb3dpbmZvID0gc2NvcGVfaWQgPSAwOworICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgIkFGX0lORVQ2IGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCisgICAgICAgICAgICAgICAgUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aXxpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWRuYSIsICZob3N0LCAmcG9ydCwgJmZsb3dpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjb3BlX2lkKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42KilhZGRyX3JldDsKKyAgICAgICAgcmVzdWx0ID0gc2V0aXBhZGRyKGhvc3QsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCphZGRyKSwgQUZfSU5FVDYpOworICAgICAgICBQeU1lbV9GcmVlKGhvc3QpOworICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAocG9ydCA8IDAgfHwgcG9ydCA+IDB4ZmZmZikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImdldHNvY2thZGRyYXJnOiBwb3J0IG11c3QgYmUgMC02NTUzNS4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGFkZHItPnNpbjZfZmFtaWx5ID0gcy0+c29ja19mYW1pbHk7CisgICAgICAgIGFkZHItPnNpbjZfcG9ydCA9IGh0b25zKChzaG9ydClwb3J0KTsKKyAgICAgICAgYWRkci0+c2luNl9mbG93aW5mbyA9IGZsb3dpbmZvOworICAgICAgICBhZGRyLT5zaW42X3Njb3BlX2lkID0gc2NvcGVfaWQ7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIFVTRV9CTFVFVE9PVEgKLQljYXNlIEFGX0JMVUVUT09USDoKLQl7Ci0JCXN3aXRjaCAocy0+c29ja19wcm90bykgewotCQljYXNlIEJUUFJPVE9fTDJDQVA6Ci0JCXsKLQkJCXN0cnVjdCBzb2NrYWRkcl9sMiAqYWRkcjsKLQkJCWNoYXIgKnN0cmFkZHI7CisgICAgY2FzZSBBRl9CTFVFVE9PVEg6CisgICAgeworICAgICAgICBzd2l0Y2ggKHMtPnNvY2tfcHJvdG8pIHsKKyAgICAgICAgY2FzZSBCVFBST1RPX0wyQ0FQOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfbDIgKmFkZHI7CisgICAgICAgICAgICBjaGFyICpzdHJhZGRyOwogCi0JCQlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9sMiAqKWFkZHJfcmV0OwotCQkJbWVtc2V0KGFkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbDIpKTsKLQkJCV9CVF9MMl9NRU1CKGFkZHIsIGZhbWlseSkgPSBBRl9CTFVFVE9PVEg7Ci0JCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpIiwgJnN0cmFkZHIsCi0JCQkJCSAgICAgICZfQlRfTDJfTUVNQihhZGRyLCBwc20pKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmFyZzogIgotCQkJCQkJIndyb25nIGZvcm1hdCIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKHNldGJkYWRkcihzdHJhZGRyLCAmX0JUX0wyX01FTUIoYWRkciwgYmRhZGRyKSkgPCAwKQotCQkJCXJldHVybiAwOworICAgICAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbDIgKilhZGRyX3JldDsKKyAgICAgICAgICAgIG1lbXNldChhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2wyKSk7CisgICAgICAgICAgICBfQlRfTDJfTUVNQihhZGRyLCBmYW1pbHkpID0gQUZfQkxVRVRPT1RIOworICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaSIsICZzdHJhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfQlRfTDJfTUVNQihhZGRyLCBwc20pKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmFyZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgZm9ybWF0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2V0YmRhZGRyKHN0cmFkZHIsICZfQlRfTDJfTUVNQihhZGRyLCBiZGFkZHIpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJCSpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJY2FzZSBCVFBST1RPX1JGQ09NTToKLQkJewotCQkJc3RydWN0IHNvY2thZGRyX3JjICphZGRyOwotCQkJY2hhciAqc3RyYWRkcjsKKyAgICAgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBCVFBST1RPX1JGQ09NTToKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3JjICphZGRyOworICAgICAgICAgICAgY2hhciAqc3RyYWRkcjsKIAotCQkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfcmMgKilhZGRyX3JldDsKLQkJCV9CVF9SQ19NRU1CKGFkZHIsIGZhbWlseSkgPSBBRl9CTFVFVE9PVEg7Ci0JCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpIiwgJnN0cmFkZHIsCi0JCQkJCSAgICAgICZfQlRfUkNfTUVNQihhZGRyLCBjaGFubmVsKSkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6ICIKLQkJCQkJCSJ3cm9uZyBmb3JtYXQiKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChzZXRiZGFkZHIoc3RyYWRkciwgJl9CVF9SQ19NRU1CKGFkZHIsIGJkYWRkcikpIDwgMCkKLQkJCQlyZXR1cm4gMDsKKyAgICAgICAgICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3JjICopYWRkcl9yZXQ7CisgICAgICAgICAgICBfQlRfUkNfTUVNQihhZGRyLCBmYW1pbHkpID0gQUZfQkxVRVRPT1RIOworICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaSIsICZzdHJhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfQlRfUkNfTUVNQihhZGRyLCBjaGFubmVsKSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIGZvcm1hdCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldGJkYWRkcihzdHJhZGRyLCAmX0JUX1JDX01FTUIoYWRkciwgYmRhZGRyKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JCQkqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWNhc2UgQlRQUk9UT19IQ0k6Ci0JCXsKLQkJCXN0cnVjdCBzb2NrYWRkcl9oY2kgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2hjaSAqKWFkZHJfcmV0OwotCQkJX0JUX0hDSV9NRU1CKGFkZHIsIGZhbWlseSkgPSBBRl9CTFVFVE9PVEg7Ci0JCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmX0JUX0hDSV9NRU1CKGFkZHIsIGRldikpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiAiCi0JCQkJCQkid3JvbmcgZm9ybWF0Iik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKLQkJCXJldHVybiAxOwotCQl9CisgICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGNhc2UgQlRQUk9UT19IQ0k6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9oY2kgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2hjaSAqKWFkZHJfcmV0OworICAgICAgICAgICAgX0JUX0hDSV9NRU1CKGFkZHIsIGZhbWlseSkgPSBBRl9CTFVFVE9PVEg7CisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmX0JUX0hDSV9NRU1CKGFkZHIsIGRldikpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBmb3JtYXQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KICNpZiAhZGVmaW5lZChfX0ZyZWVCU0RfXykKLQkJY2FzZSBCVFBST1RPX1NDTzoKLQkJewotCQkJc3RydWN0IHNvY2thZGRyX3NjbyAqYWRkcjsKLQkJCWNoYXIgKnN0cmFkZHI7CisgICAgICAgIGNhc2UgQlRQUk9UT19TQ086CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zY28gKmFkZHI7CisgICAgICAgICAgICBjaGFyICpzdHJhZGRyOwogCi0JCQlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9zY28gKilhZGRyX3JldDsKLQkJCV9CVF9TQ09fTUVNQihhZGRyLCBmYW1pbHkpID0gQUZfQkxVRVRPT1RIOwotCQkJc3RyYWRkciA9IFB5U3RyaW5nX0FzU3RyaW5nKGFyZ3MpOwotCQkJaWYgKHN0cmFkZHIgPT0gTlVMTCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmFyZzogIgotCQkJCQkJIndyb25nIGZvcm1hdCIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKHNldGJkYWRkcihzdHJhZGRyLCAmX0JUX1NDT19NRU1CKGFkZHIsIGJkYWRkcikpIDwgMCkKLQkJCQlyZXR1cm4gMDsKKyAgICAgICAgICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3NjbyAqKWFkZHJfcmV0OworICAgICAgICAgICAgX0JUX1NDT19NRU1CKGFkZHIsIGZhbWlseSkgPSBBRl9CTFVFVE9PVEg7CisgICAgICAgICAgICBzdHJhZGRyID0gUHlTdHJpbmdfQXNTdHJpbmcoYXJncyk7CisgICAgICAgICAgICBpZiAoc3RyYWRkciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBmb3JtYXQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXRiZGFkZHIoc3RyYWRkciwgJl9CVF9TQ09fTUVNQihhZGRyLCBiZGFkZHIpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJCSpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOwotCQkJcmV0dXJuIDE7Ci0JCX0KKyAgICAgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KICNlbmRpZgotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiB1bmtub3duIEJsdWV0b290aCBwcm90b2NvbCIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6IHVua25vd24gQmx1ZXRvb3RoIHByb3RvY29sIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgogCiAjaWZkZWYgSEFWRV9ORVRQQUNLRVRfUEFDS0VUX0gKLQljYXNlIEFGX1BBQ0tFVDoKLQl7Ci0JCXN0cnVjdCBzb2NrYWRkcl9sbCogYWRkcjsKLQkJc3RydWN0IGlmcmVxIGlmcjsKLQkJY2hhciAqaW50ZXJmYWNlTmFtZTsKLQkJaW50IHByb3RvTnVtYmVyOwotCQlpbnQgaGF0eXBlID0gMDsKLQkJaW50IHBrdHR5cGUgPSAwOwotCQljaGFyICpoYWRkciA9IE5VTEw7Ci0JCXVuc2lnbmVkIGludCBoYWxlbiA9IDA7CisgICAgY2FzZSBBRl9QQUNLRVQ6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfbGwqIGFkZHI7CisgICAgICAgIHN0cnVjdCBpZnJlcSBpZnI7CisgICAgICAgIGNoYXIgKmludGVyZmFjZU5hbWU7CisgICAgICAgIGludCBwcm90b051bWJlcjsKKyAgICAgICAgaW50IGhhdHlwZSA9IDA7CisgICAgICAgIGludCBwa3R0eXBlID0gMDsKKyAgICAgICAgY2hhciAqaGFkZHIgPSBOVUxMOworICAgICAgICB1bnNpZ25lZCBpbnQgaGFsZW4gPSAwOwogCi0JCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQkJUHlFcnJfRm9ybWF0KAotCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZ2V0c29ja2FkZHJhcmc6ICIKLQkJCQkiQUZfUEFDS0VUIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCi0JCQkJUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpfGlpcyMiLCAmaW50ZXJmYWNlTmFtZSwKLQkJCQkgICAgICAmcHJvdG9OdW1iZXIsICZwa3R0eXBlLCAmaGF0eXBlLAotCQkJCSAgICAgICZoYWRkciwgJmhhbGVuKSkKLQkJCXJldHVybiAwOwotCQlzdHJuY3B5KGlmci5pZnJfbmFtZSwgaW50ZXJmYWNlTmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwotCQlpZnIuaWZyX25hbWVbKHNpemVvZihpZnIuaWZyX25hbWUpKS0xXSA9ICdcMCc7Ci0JCWlmIChpb2N0bChzLT5zb2NrX2ZkLCBTSU9DR0lGSU5ERVgsICZpZnIpIDwgMCkgewotCQkgICAgICAgIHMtPmVycm9yaGFuZGxlcigpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKGhhbGVuID4gOCkgewotCQkgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgIkhhcmR3YXJlIGFkZHJlc3MgbXVzdCBiZSA4IGJ5dGVzIG9yIGxlc3MiKTsKLQkJICByZXR1cm4gMDsKLQkJfQotCQlpZiAocHJvdG9OdW1iZXIgPCAwIHx8IHByb3RvTnVtYmVyID4gMHhmZmZmKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkiZ2V0c29ja2FkZHJhcmc6IHByb3RvTnVtYmVyIG11c3QgYmUgMC02NTUzNS4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2xsKilhZGRyX3JldDsKLQkJYWRkci0+c2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKLQkJYWRkci0+c2xsX3Byb3RvY29sID0gaHRvbnMoKHNob3J0KXByb3RvTnVtYmVyKTsKLQkJYWRkci0+c2xsX2lmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7Ci0JCWFkZHItPnNsbF9wa3R0eXBlID0gcGt0dHlwZTsKLQkJYWRkci0+c2xsX2hhdHlwZSA9IGhhdHlwZTsKLQkJaWYgKGhhbGVuICE9IDApIHsKLQkJICBtZW1jcHkoJmFkZHItPnNsbF9hZGRyLCBoYWRkciwgaGFsZW4pOwotCQl9Ci0JCWFkZHItPnNsbF9oYWxlbiA9IGhhbGVuOwotCQkqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKLQkJcmV0dXJuIDE7Ci0JfQorICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgIkFGX1BBQ0tFVCBhZGRyZXNzIG11c3QgYmUgdHVwbGUsIG5vdCAlLjUwMHMiLAorICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJncyktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaXxpaXMjIiwgJmludGVyZmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdG9OdW1iZXIsICZwa3R0eXBlLCAmaGF0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhZGRyLCAmaGFsZW4pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHN0cm5jcHkoaWZyLmlmcl9uYW1lLCBpbnRlcmZhY2VOYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisgICAgICAgIGlmci5pZnJfbmFtZVsoc2l6ZW9mKGlmci5pZnJfbmFtZSkpLTFdID0gJ1wwJzsKKyAgICAgICAgaWYgKGlvY3RsKHMtPnNvY2tfZmQsIFNJT0NHSUZJTkRFWCwgJmlmcikgPCAwKSB7CisgICAgICAgICAgICBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChoYWxlbiA+IDgpIHsKKyAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhcmR3YXJlIGFkZHJlc3MgbXVzdCBiZSA4IGJ5dGVzIG9yIGxlc3MiKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvdG9OdW1iZXIgPCAwIHx8IHByb3RvTnVtYmVyID4gMHhmZmZmKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAiZ2V0c29ja2FkZHJhcmc6IHByb3RvTnVtYmVyIG11c3QgYmUgMC02NTUzNS4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2xsKilhZGRyX3JldDsKKyAgICAgICAgYWRkci0+c2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKyAgICAgICAgYWRkci0+c2xsX3Byb3RvY29sID0gaHRvbnMoKHNob3J0KXByb3RvTnVtYmVyKTsKKyAgICAgICAgYWRkci0+c2xsX2lmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7CisgICAgICAgIGFkZHItPnNsbF9wa3R0eXBlID0gcGt0dHlwZTsKKyAgICAgICAgYWRkci0+c2xsX2hhdHlwZSA9IGhhdHlwZTsKKyAgICAgICAgaWYgKGhhbGVuICE9IDApIHsKKyAgICAgICAgICBtZW1jcHkoJmFkZHItPnNsbF9hZGRyLCBoYWRkciwgaGFsZW4pOworICAgICAgICB9CisgICAgICAgIGFkZHItPnNsbF9oYWxlbiA9IGhhbGVuOworICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0xJTlVYX1RJUENfSAotCWNhc2UgQUZfVElQQzoKLQl7Ci0JCXVuc2lnbmVkIGludCBhdHlwZSwgdjEsIHYyLCB2MzsKLQkJdW5zaWduZWQgaW50IHNjb3BlID0gVElQQ19DTFVTVEVSX1NDT1BFOwotCQlzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqYWRkcjsKKyAgICBjYXNlIEFGX1RJUEM6CisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgYXR5cGUsIHYxLCB2MiwgdjM7CisgICAgICAgIHVuc2lnbmVkIGludCBzY29wZSA9IFRJUENfQ0xVU1RFUl9TQ09QRTsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX3RpcGMgKmFkZHI7CiAKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCSJnZXRzb2NrYWRkcmFyZzogIgotCQkJCSJBRl9USVBDIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCi0JCQkJUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQorICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgIkFGX1RJUEMgYWRkcmVzcyBtdXN0IGJlIHR1cGxlLCBub3QgJS41MDBzIiwKKyAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZ3MpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkJCSJJSUlJfEk7SW52YWxpZCBUSVBDIGFkZHJlc3MgZm9ybWF0IiwKLQkJCQkJJmF0eXBlLCAmdjEsICZ2MiwgJnYzLCAmc2NvcGUpKQotCQkJcmV0dXJuIDA7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUlJSXxJO0ludmFsaWQgVElQQyBhZGRyZXNzIGZvcm1hdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHlwZSwgJnYxLCAmdjIsICZ2MywgJnNjb3BlKSkKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3RpcGMgKikgYWRkcl9yZXQ7Ci0JCW1lbXNldChhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3RpcGMpKTsKKyAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqKSBhZGRyX3JldDsKKyAgICAgICAgbWVtc2V0KGFkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdGlwYykpOwogCi0JCWFkZHItPmZhbWlseSA9IEFGX1RJUEM7Ci0JCWFkZHItPnNjb3BlID0gc2NvcGU7Ci0JCWFkZHItPmFkZHJ0eXBlID0gYXR5cGU7CisgICAgICAgIGFkZHItPmZhbWlseSA9IEFGX1RJUEM7CisgICAgICAgIGFkZHItPnNjb3BlID0gc2NvcGU7CisgICAgICAgIGFkZHItPmFkZHJ0eXBlID0gYXR5cGU7CiAKLQkJaWYgKGF0eXBlID09IFRJUENfQUREUl9OQU1FU0VRKSB7Ci0JCQlhZGRyLT5hZGRyLm5hbWVzZXEudHlwZSA9IHYxOwotCQkJYWRkci0+YWRkci5uYW1lc2VxLmxvd2VyID0gdjI7Ci0JCQlhZGRyLT5hZGRyLm5hbWVzZXEudXBwZXIgPSB2MzsKLQkJfSBlbHNlIGlmIChhdHlwZSA9PSBUSVBDX0FERFJfTkFNRSkgewotCQkJYWRkci0+YWRkci5uYW1lLm5hbWUudHlwZSA9IHYxOwotCQkJYWRkci0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2UgPSB2MjsKLQkJfSBlbHNlIGlmIChhdHlwZSA9PSBUSVBDX0FERFJfSUQpIHsKLQkJCWFkZHItPmFkZHIuaWQubm9kZSA9IHYxOwotCQkJYWRkci0+YWRkci5pZC5yZWYgPSB2MjsKLQkJfSBlbHNlIHsKLQkJCS8qIFNob3VsZG4ndCBoYXBwZW4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJbnZhbGlkIGFkZHJlc3MgdHlwZSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KKyAgICAgICAgaWYgKGF0eXBlID09IFRJUENfQUREUl9OQU1FU0VRKSB7CisgICAgICAgICAgICBhZGRyLT5hZGRyLm5hbWVzZXEudHlwZSA9IHYxOworICAgICAgICAgICAgYWRkci0+YWRkci5uYW1lc2VxLmxvd2VyID0gdjI7CisgICAgICAgICAgICBhZGRyLT5hZGRyLm5hbWVzZXEudXBwZXIgPSB2MzsKKyAgICAgICAgfSBlbHNlIGlmIChhdHlwZSA9PSBUSVBDX0FERFJfTkFNRSkgeworICAgICAgICAgICAgYWRkci0+YWRkci5uYW1lLm5hbWUudHlwZSA9IHYxOworICAgICAgICAgICAgYWRkci0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2UgPSB2MjsKKyAgICAgICAgfSBlbHNlIGlmIChhdHlwZSA9PSBUSVBDX0FERFJfSUQpIHsKKyAgICAgICAgICAgIGFkZHItPmFkZHIuaWQubm9kZSA9IHYxOworICAgICAgICAgICAgYWRkci0+YWRkci5pZC5yZWYgPSB2MjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJbnZhbGlkIGFkZHJlc3MgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KIAotCQkqbGVuX3JldCA9IHNpemVvZigqYWRkcik7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mKCphZGRyKTsKIAotCQlyZXR1cm4gMTsKLQl9CisgICAgICAgIHJldHVybiAxOworICAgIH0KICNlbmRpZgogCi0JLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCisgICAgLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCiAKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6IGJhZCBmYW1pbHkiKTsKLQkJcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiBiYWQgZmFtaWx5Iik7CisgICAgICAgIHJldHVybiAwOwogCi0JfQorICAgIH0KIH0KIAogCkBAIC0xNTIyLDg5ICsxNTIyLDg5IEBACiBzdGF0aWMgaW50CiBnZXRzb2NrYWRkcmxlbihQeVNvY2tldFNvY2tPYmplY3QgKnMsIHNvY2tsZW5fdCAqbGVuX3JldCkKIHsKLQlzd2l0Y2ggKHMtPnNvY2tfZmFtaWx5KSB7CisgICAgc3dpdGNoIChzLT5zb2NrX2ZhbWlseSkgewogCiAjaWYgZGVmaW5lZChBRl9VTklYKQotCWNhc2UgQUZfVU5JWDoKLQl7Ci0JCSpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfdW4pOwotCQlyZXR1cm4gMTsKLQl9CisgICAgY2FzZSBBRl9VTklYOgorICAgIHsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl91bik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KICNlbmRpZiAvKiBBRl9VTklYICovCiAjaWYgZGVmaW5lZChBRl9ORVRMSU5LKQogICAgICAgIGNhc2UgQUZfTkVUTElOSzoKICAgICAgICB7Ci0gICAgICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX25sKTsKLSAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX25sKTsKKyAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogI2VuZGlmCiAKLQljYXNlIEFGX0lORVQ6Ci0JewotCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2luKTsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNhc2UgQUZfSU5FVDoKKyAgICB7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JewotCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2luNik7Ci0JCXJldHVybiAxOwotCX0KKyAgICBjYXNlIEFGX0lORVQ2OgorICAgIHsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIFVTRV9CTFVFVE9PVEgKLQljYXNlIEFGX0JMVUVUT09USDoKLQl7Ci0JCXN3aXRjaChzLT5zb2NrX3Byb3RvKQotCQl7CisgICAgY2FzZSBBRl9CTFVFVE9PVEg6CisgICAgeworICAgICAgICBzd2l0Y2gocy0+c29ja19wcm90bykKKyAgICAgICAgewogCi0JCWNhc2UgQlRQUk9UT19MMkNBUDoKLQkJCSpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfbDIpOwotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgQlRQUk9UT19SRkNPTU06Ci0JCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3JjKTsKLQkJCXJldHVybiAxOwotCQljYXNlIEJUUFJPVE9fSENJOgotCQkJKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9oY2kpOwotCQkJcmV0dXJuIDE7CisgICAgICAgIGNhc2UgQlRQUk9UT19MMkNBUDoKKyAgICAgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfbDIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgQlRQUk9UT19SRkNPTU06CisgICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3JjKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEJUUFJPVE9fSENJOgorICAgICAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9oY2kpOworICAgICAgICAgICAgcmV0dXJuIDE7CiAjaWYgIWRlZmluZWQoX19GcmVlQlNEX18pCi0JCWNhc2UgQlRQUk9UT19TQ086Ci0JCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3Njbyk7Ci0JCQlyZXR1cm4gMTsKKyAgICAgICAgY2FzZSBCVFBST1RPX1NDTzoKKyAgICAgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfc2NvKTsKKyAgICAgICAgICAgIHJldHVybiAxOwogI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJsZW46ICIKLQkJCQkJInVua25vd24gQlQgcHJvdG9jb2wiKTsKLQkJCXJldHVybiAwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRybGVuOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gQlQgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCX0KLQl9CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9ICi0JY2FzZSBBRl9QQUNLRVQ6Ci0JewotCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2xsKTsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNhc2UgQUZfUEFDS0VUOgorICAgIHsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9sbCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgSEFWRV9MSU5VWF9USVBDX0gKLQljYXNlIEFGX1RJUEM6Ci0JewotCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3RpcGMpOwotCQlyZXR1cm4gMTsKLQl9CisgICAgY2FzZSBBRl9USVBDOgorICAgIHsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl90aXBjKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmCiAKLQkvKiBNb3JlIGNhc2VzIGhlcmUuLi4gKi8KKyAgICAvKiBNb3JlIGNhc2VzIGhlcmUuLi4gKi8KIAotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmxlbjogYmFkIGZhbWlseSIpOwotCQlyZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJsZW46IGJhZCBmYW1pbHkiKTsKKyAgICAgICAgcmV0dXJuIDA7CiAKLQl9CisgICAgfQogfQogCiAKQEAgLTE2MTMsNjcgKzE2MTMsNjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX2FjY2VwdChQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7Ci0Jc29ja19hZGRyX3QgYWRkcmJ1ZjsKLQlTT0NLRVRfVCBuZXdmZDsKLQlzb2NrbGVuX3QgYWRkcmxlbjsKLQlQeU9iamVjdCAqc29jayA9IE5VTEw7Ci0JUHlPYmplY3QgKmFkZHIgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWludCB0aW1lb3V0OworICAgIHNvY2tfYWRkcl90IGFkZHJidWY7CisgICAgU09DS0VUX1QgbmV3ZmQ7CisgICAgc29ja2xlbl90IGFkZHJsZW47CisgICAgUHlPYmplY3QgKnNvY2sgPSBOVUxMOworICAgIFB5T2JqZWN0ICphZGRyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBpbnQgdGltZW91dDsKIAotCWlmICghZ2V0c29ja2FkZHJsZW4ocywgJmFkZHJsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoJmFkZHJidWYsIDAsIGFkZHJsZW4pOworICAgIGlmICghZ2V0c29ja2FkZHJsZW4ocywgJmFkZHJsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQoJmFkZHJidWYsIDAsIGFkZHJsZW4pOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCW5ld2ZkID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgbmV3ZmQgPSBJTlZBTElEX1NPQ0tFVDsKICNlbHNlCi0JbmV3ZmQgPSAtMTsKKyAgICBuZXdmZCA9IC0xOwogI2VuZGlmCiAKLQlpZiAoIUlTX1NFTEVDVEFCTEUocykpCi0JCXJldHVybiBzZWxlY3RfZXJyb3IoKTsKKyAgICBpZiAoIUlTX1NFTEVDVEFCTEUocykpCisgICAgICAgIHJldHVybiBzZWxlY3RfZXJyb3IoKTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOwotCWlmICghdGltZW91dCkKLQkJbmV3ZmQgPSBhY2NlcHQocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7CisgICAgaWYgKCF0aW1lb3V0KQorICAgICAgICBuZXdmZCA9IGFjY2VwdChzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0ID09IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodGltZW91dCA9PSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZmRlZiBNU19XSU5ET1dTCi0JaWYgKG5ld2ZkID09IElOVkFMSURfU09DS0VUKQorICAgIGlmIChuZXdmZCA9PSBJTlZBTElEX1NPQ0tFVCkKICNlbHNlCi0JaWYgKG5ld2ZkIDwgMCkKKyAgICBpZiAobmV3ZmQgPCAwKQogI2VuZGlmCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwogCi0JLyogQ3JlYXRlIHRoZSBuZXcgb2JqZWN0IHdpdGggdW5zcGVjaWZpZWQgZmFtaWx5LAotCSAgIHRvIGF2b2lkIGNhbGxzIHRvIGJpbmQoKSBldGMuIG9uIGl0LiAqLwotCXNvY2sgPSAoUHlPYmplY3QgKikgbmV3X3NvY2tvYmplY3QobmV3ZmQsCi0JCQkJCSAgIHMtPnNvY2tfZmFtaWx5LAotCQkJCQkgICBzLT5zb2NrX3R5cGUsCi0JCQkJCSAgIHMtPnNvY2tfcHJvdG8pOworICAgIC8qIENyZWF0ZSB0aGUgbmV3IG9iamVjdCB3aXRoIHVuc3BlY2lmaWVkIGZhbWlseSwKKyAgICAgICB0byBhdm9pZCBjYWxscyB0byBiaW5kKCkgZXRjLiBvbiBpdC4gKi8KKyAgICBzb2NrID0gKFB5T2JqZWN0ICopIG5ld19zb2Nrb2JqZWN0KG5ld2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c29ja19mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zb2NrX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zb2NrX3Byb3RvKTsKIAotCWlmIChzb2NrID09IE5VTEwpIHsKLQkJU09DS0VUQ0xPU0UobmV3ZmQpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWFkZHIgPSBtYWtlc29ja2FkZHIocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwKLQkJCSAgICBhZGRybGVuLCBzLT5zb2NrX3Byb3RvKTsKLQlpZiAoYWRkciA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNvY2sgPT0gTlVMTCkgeworICAgICAgICBTT0NLRVRDTE9TRShuZXdmZCk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgYWRkciA9IG1ha2Vzb2NrYWRkcihzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmxlbiwgcy0+c29ja19wcm90byk7CisgICAgaWYgKGFkZHIgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JcmVzID0gUHlUdXBsZV9QYWNrKDIsIHNvY2ssIGFkZHIpOworICAgIHJlcyA9IFB5VHVwbGVfUGFjaygyLCBzb2NrLCBhZGRyKTsKIAogZmluYWxseToKLQlQeV9YREVDUkVGKHNvY2spOwotCVB5X1hERUNSRUYoYWRkcik7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9YREVDUkVGKHNvY2spOworICAgIFB5X1hERUNSRUYoYWRkcik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlEb2NfU1RSVkFSKGFjY2VwdF9kb2MsCkBAIC0xNjkxLDE3ICsxNjkxLDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19zZXRibG9ja2luZyhQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmcpCiB7Ci0JaW50IGJsb2NrOworICAgIGludCBibG9jazsKIAotCWJsb2NrID0gUHlJbnRfQXNMb25nKGFyZyk7Ci0JaWYgKGJsb2NrID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIGJsb2NrID0gUHlJbnRfQXNMb25nKGFyZyk7CisgICAgaWYgKGJsb2NrID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jcy0+c29ja190aW1lb3V0ID0gYmxvY2sgPyAtMS4wIDogMC4wOwotCWludGVybmFsX3NldGJsb2NraW5nKHMsIGJsb2NrKTsKKyAgICBzLT5zb2NrX3RpbWVvdXQgPSBibG9jayA/IC0xLjAgOiAwLjA7CisgICAgaW50ZXJuYWxfc2V0YmxvY2tpbmcocywgYmxvY2spOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldGJsb2NraW5nX2RvYywKQEAgLTE3MjAsMjUgKzE3MjAsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NldHRpbWVvdXQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJnKQogewotCWRvdWJsZSB0aW1lb3V0OworICAgIGRvdWJsZSB0aW1lb3V0OwogCi0JaWYgKGFyZyA9PSBQeV9Ob25lKQotCQl0aW1lb3V0ID0gLTEuMDsKLQllbHNlIHsKLQkJdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQkJaWYgKHRpbWVvdXQgPCAwLjApIHsKLQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJUaW1lb3V0IHZhbHVlIG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgaWYgKGFyZyA9PSBQeV9Ob25lKQorICAgICAgICB0aW1lb3V0ID0gLTEuMDsKKyAgICBlbHNlIHsKKyAgICAgICAgdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICAgICAgaWYgKHRpbWVvdXQgPCAwLjApIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVvdXQgdmFsdWUgb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXMtPnNvY2tfdGltZW91dCA9IHRpbWVvdXQ7Ci0JaW50ZXJuYWxfc2V0YmxvY2tpbmcocywgdGltZW91dCA8IDAuMCk7CisgICAgcy0+c29ja190aW1lb3V0ID0gdGltZW91dDsKKyAgICBpbnRlcm5hbF9zZXRibG9ja2luZyhzLCB0aW1lb3V0IDwgMC4wKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXR0aW1lb3V0X2RvYywKQEAgLTE3NTQsMTIgKzE3NTQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX2dldHRpbWVvdXQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewotCWlmIChzLT5zb2NrX3RpbWVvdXQgPCAwLjApIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHMtPnNvY2tfdGltZW91dCk7CisgICAgaWYgKHMtPnNvY2tfdGltZW91dCA8IDAuMCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocy0+c29ja190aW1lb3V0KTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHRpbWVvdXRfZG9jLApAQCAtMTc3NSwxNiArMTc3NSwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfc2xlZXB0YXNrdyhQeVNvY2tldFNvY2tPYmplY3QgKnMsUHlPYmplY3QgKmFyZykKIHsKLQlpbnQgYmxvY2s7Ci0JYmxvY2sgPSBQeUludF9Bc0xvbmcoYXJnKTsKLQlpZiAoYmxvY2sgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXNvY2tldGlvY3RsKHMtPnNvY2tfZmQsIDB4ODAwNDY2NzksICh1X2xvbmcqKSZibG9jayk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpbnQgYmxvY2s7CisgICAgYmxvY2sgPSBQeUludF9Bc0xvbmcoYXJnKTsKKyAgICBpZiAoYmxvY2sgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHNvY2tldGlvY3RsKHMtPnNvY2tfZmQsIDB4ODAwNDY2NzksICh1X2xvbmcqKSZibG9jayk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiBQeURvY19TVFJWQVIoc2xlZXB0YXNrd19kb2MsCiAic2xlZXB0YXNrdyhmbGFnKVxuXApAQCAtMTgwMSwyOSArMTgwMSwyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfc2V0c29ja29wdChQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBsZXZlbDsKLQlpbnQgb3B0bmFtZTsKLQlpbnQgcmVzOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmbGVuOwotCWludCBmbGFnOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgb3B0bmFtZTsKKyAgICBpbnQgcmVzOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgYnVmbGVuOworICAgIGludCBmbGFnOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTpzZXRzb2Nrb3B0IiwKLQkJCSAgICAgJmxldmVsLCAmb3B0bmFtZSwgJmZsYWcpKSB7Ci0JCWJ1ZiA9IChjaGFyICopICZmbGFnOwotCQlidWZsZW4gPSBzaXplb2YgZmxhZzsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlzIzpzZXRzb2Nrb3B0IiwKLQkJCQkgICAgICAmbGV2ZWwsICZvcHRuYW1lLCAmYnVmLCAmYnVmbGVuKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLCAodm9pZCAqKWJ1ZiwgYnVmbGVuKTsKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOnNldHNvY2tvcHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCwgJm9wdG5hbWUsICZmbGFnKSkgeworICAgICAgICBidWYgPSAoY2hhciAqKSAmZmxhZzsKKyAgICAgICAgYnVmbGVuID0gc2l6ZW9mIGZsYWc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpcyM6c2V0c29ja29wdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwsICZvcHRuYW1lLCAmYnVmLCAmYnVmbGVuKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLCAodm9pZCAqKWJ1ZiwgYnVmbGVuKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldHNvY2tvcHRfZG9jLApAQCAtMTg0MSw1MyArMTg0MSw1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfZ2V0c29ja29wdChQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBsZXZlbDsKLQlpbnQgb3B0bmFtZTsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICpidWY7Ci0Jc29ja2xlbl90IGJ1ZmxlbiA9IDA7CisgICAgaW50IGxldmVsOworICAgIGludCBvcHRuYW1lOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKmJ1ZjsKKyAgICBzb2NrbGVuX3QgYnVmbGVuID0gMDsKIAogI2lmZGVmIF9fQkVPU19fCi0JLyogV2UgaGF2ZSBpbmNvbXBsZXRlIHNvY2tldCBzdXBwb3J0LiAqLwotCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2Nrb3B0IG5vdCBzdXBwb3J0ZWQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAvKiBXZSBoYXZlIGluY29tcGxldGUgc29ja2V0IHN1cHBvcnQuICovCisgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2tvcHQgbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiBOVUxMOwogI2Vsc2UKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWl8aTpnZXRzb2Nrb3B0IiwKLQkJCSAgICAgICZsZXZlbCwgJm9wdG5hbWUsICZidWZsZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpfGk6Z2V0c29ja29wdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCwgJm9wdG5hbWUsICZidWZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChidWZsZW4gPT0gMCkgewotCQlpbnQgZmxhZyA9IDA7Ci0JCXNvY2tsZW5fdCBmbGFnc2l6ZSA9IHNpemVvZiBmbGFnOwotCQlyZXMgPSBnZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLAotCQkJCSAodm9pZCAqKSZmbGFnLCAmZmxhZ3NpemUpOwotCQlpZiAocmVzIDwgMCkKLQkJCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZsYWcpOwotCX0KKyAgICBpZiAoYnVmbGVuID09IDApIHsKKyAgICAgICAgaW50IGZsYWcgPSAwOworICAgICAgICBzb2NrbGVuX3QgZmxhZ3NpemUgPSBzaXplb2YgZmxhZzsKKyAgICAgICAgcmVzID0gZ2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZmbGFnLCAmZmxhZ3NpemUpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZsYWcpOworICAgIH0KICNpZmRlZiBfX1ZNUwotCS8qIHNvY2tsZW5fdCBpcyB1bnNpZ25lZCBzbyBubyBuZWdhdGl2ZSB0ZXN0IGlzIG5lZWRlZCwKLQkgICB0ZXN0IGJ1ZmxlbiA9PSAwIGlzIHByZXZpb3VzbHkgZG9uZSAqLwotCWlmIChidWZsZW4gPiAxMDI0KSB7CisgICAgLyogc29ja2xlbl90IGlzIHVuc2lnbmVkIHNvIG5vIG5lZ2F0aXZlIHRlc3QgaXMgbmVlZGVkLAorICAgICAgIHRlc3QgYnVmbGVuID09IDAgaXMgcHJldmlvdXNseSBkb25lICovCisgICAgaWYgKGJ1ZmxlbiA+IDEwMjQpIHsKICNlbHNlCi0JaWYgKGJ1ZmxlbiA8PSAwIHx8IGJ1ZmxlbiA+IDEwMjQpIHsKKyAgICBpZiAoYnVmbGVuIDw9IDAgfHwgYnVmbGVuID4gMTAyNCkgewogI2VuZGlmCi0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJImdldHNvY2tvcHQgYnVmbGVuIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYnVmID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBidWZsZW4pOwotCWlmIChidWYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gZ2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwKLQkJCSAodm9pZCAqKVB5U3RyaW5nX0FTX1NUUklORyhidWYpLCAmYnVmbGVuKTsKLQlpZiAocmVzIDwgMCkgewotCQlQeV9ERUNSRUYoYnVmKTsKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCX0KLQlfUHlTdHJpbmdfUmVzaXplKCZidWYsIGJ1Zmxlbik7Ci0JcmV0dXJuIGJ1ZjsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJnZXRzb2Nrb3B0IGJ1ZmxlbiBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgYnVmbGVuKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9IGdldHNvY2tvcHQocy0+c29ja19mZCwgbGV2ZWwsIG9wdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKVB5U3RyaW5nX0FTX1NUUklORyhidWYpLCAmYnVmbGVuKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYoYnVmKTsKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIH0KKyAgICBfUHlTdHJpbmdfUmVzaXplKCZidWYsIGJ1Zmxlbik7CisgICAgcmV0dXJuIGJ1ZjsKICNlbmRpZiAvKiBfX0JFT1NfXyAqLwogfQogCkBAIC0xOTA0LDE5ICsxOTA0LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19iaW5kKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFkZHJvKQogewotCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JaW50IGFkZHJsZW47Ci0JaW50IHJlczsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGludCBhZGRybGVuOworICAgIGludCByZXM7CiAKLQlpZiAoIWdldHNvY2thZGRyYXJnKHMsIGFkZHJvLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbikpCi0JCXJldHVybiBOVUxMOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSBiaW5kKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4pOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFnZXRzb2NrYWRkcmFyZyhzLCBhZGRybywgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gYmluZChzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoYmluZF9kb2MsCkBAIC0xOTM0LDE2ICsxOTM0LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19jbG9zZShQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7Ci0JU09DS0VUX1QgZmQ7CisgICAgU09DS0VUX1QgZmQ7CiAKLQlpZiAoKGZkID0gcy0+c29ja19mZCkgIT0gLTEpIHsKLQkJcy0+c29ja19mZCA9IC0xOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCSh2b2lkKSBTT0NLRVRDTE9TRShmZCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoKGZkID0gcy0+c29ja19mZCkgIT0gLTEpIHsKKyAgICAgICAgcy0+c29ja19mZCA9IC0xOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICh2b2lkKSBTT0NLRVRDTE9TRShmZCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGNsb3NlX2RvYywKQEAgLTE5NTMsOTAgKzE5NTMsOTAgQEAKIAogc3RhdGljIGludAogaW50ZXJuYWxfY29ubmVjdChQeVNvY2tldFNvY2tPYmplY3QgKnMsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4sCi0JCSBpbnQgKnRpbWVvdXRwKQorICAgICAgICAgICAgICAgICBpbnQgKnRpbWVvdXRwKQogewotCWludCByZXMsIHRpbWVvdXQ7CisgICAgaW50IHJlcywgdGltZW91dDsKIAotCXRpbWVvdXQgPSAwOwotCXJlcyA9IGNvbm5lY3Qocy0+c29ja19mZCwgYWRkciwgYWRkcmxlbik7CisgICAgdGltZW91dCA9IDA7CisgICAgcmVzID0gY29ubmVjdChzLT5zb2NrX2ZkLCBhZGRyLCBhZGRybGVuKTsKIAogI2lmZGVmIE1TX1dJTkRPV1MKIAotCWlmIChzLT5zb2NrX3RpbWVvdXQgPiAwLjApIHsKLQkJaWYgKHJlcyA8IDAgJiYgV1NBR2V0TGFzdEVycm9yKCkgPT0gV1NBRVdPVUxEQkxPQ0sgJiYKLQkJICAgIElTX1NFTEVDVEFCTEUocykpIHsKLQkJCS8qIFRoaXMgaXMgYSBtZXNzLiAgQmVzdCBzb2x1dGlvbjogdHJ1c3Qgc2VsZWN0ICovCi0JCQlmZF9zZXQgZmRzOwotCQkJZmRfc2V0IGZkc19leGM7Ci0JCQlzdHJ1Y3QgdGltZXZhbCB0djsKLQkJCXR2LnR2X3NlYyA9IChpbnQpcy0+c29ja190aW1lb3V0OwotCQkJdHYudHZfdXNlYyA9IChpbnQpKChzLT5zb2NrX3RpbWVvdXQgLSB0di50dl9zZWMpICogMWU2KTsKLQkJCUZEX1pFUk8oJmZkcyk7Ci0JCQlGRF9TRVQocy0+c29ja19mZCwgJmZkcyk7Ci0JCQlGRF9aRVJPKCZmZHNfZXhjKTsKLQkJCUZEX1NFVChzLT5zb2NrX2ZkLCAmZmRzX2V4Yyk7Ci0JCQlyZXMgPSBzZWxlY3Qocy0+c29ja19mZCsxLCBOVUxMLCAmZmRzLCAmZmRzX2V4YywgJnR2KTsKLQkJCWlmIChyZXMgPT0gMCkgewotCQkJCXJlcyA9IFdTQUVXT1VMREJMT0NLOwotCQkJCXRpbWVvdXQgPSAxOwotCQkJfSBlbHNlIGlmIChyZXMgPiAwKSB7Ci0JCQkJaWYgKEZEX0lTU0VUKHMtPnNvY2tfZmQsICZmZHMpKQotCQkJCQkvKiBUaGUgc29ja2V0IGlzIGluIHRoZSB3cml0ZWFibGUgc2V0IC0gdGhpcwotCQkJCQkgICBtZWFucyBjb25uZWN0ZWQgKi8KLQkJCQkJcmVzID0gMDsKLQkJCQllbHNlIHsKLQkJCQkJLyogQXMgcGVyIE1TIGRvY3MsIHdlIG5lZWQgdG8gY2FsbCBnZXRzb2Nrb3B0KCkKLQkJCQkJICAgdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIGVycm9yICovCi0JCQkJCWludCByZXNfc2l6ZSA9IHNpemVvZiByZXM7Ci0JCQkJCS8qIEl0IG11c3QgYmUgaW4gdGhlIGV4Y2VwdGlvbiBzZXQgKi8KLQkJCQkJYXNzZXJ0KEZEX0lTU0VUKHMtPnNvY2tfZmQsICZmZHNfZXhjKSk7Ci0JCQkJCWlmICgwID09IGdldHNvY2tvcHQocy0+c29ja19mZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsCi0JCQkJCSAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmcmVzLCAmcmVzX3NpemUpKQotCQkJCQkJLyogZ2V0c29ja29wdCBhbHNvIGNsZWFycyBXU0FHZXRMYXN0RXJyb3IsCi0JCQkJCQkgICBzbyByZXNldCBpdCBiYWNrLiAqLwotCQkJCQkJV1NBU2V0TGFzdEVycm9yKHJlcyk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlcyA9IFdTQUdldExhc3RFcnJvcigpOwotCQkJCX0KLQkJCX0KLQkJCS8qIGVsc2UgaWYgKHJlcyA8IDApIGFuIGVycm9yIG9jY3VycmVkICovCi0JCX0KLQl9CisgICAgaWYgKHMtPnNvY2tfdGltZW91dCA+IDAuMCkgeworICAgICAgICBpZiAocmVzIDwgMCAmJiBXU0FHZXRMYXN0RXJyb3IoKSA9PSBXU0FFV09VTERCTE9DSyAmJgorICAgICAgICAgICAgSVNfU0VMRUNUQUJMRShzKSkgeworICAgICAgICAgICAgLyogVGhpcyBpcyBhIG1lc3MuICBCZXN0IHNvbHV0aW9uOiB0cnVzdCBzZWxlY3QgKi8KKyAgICAgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgICAgICBmZF9zZXQgZmRzX2V4YzsKKyAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICAgICAgdHYudHZfc2VjID0gKGludClzLT5zb2NrX3RpbWVvdXQ7CisgICAgICAgICAgICB0di50dl91c2VjID0gKGludCkoKHMtPnNvY2tfdGltZW91dCAtIHR2LnR2X3NlYykgKiAxZTYpOworICAgICAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgICAgIEZEX1NFVChzLT5zb2NrX2ZkLCAmZmRzKTsKKyAgICAgICAgICAgIEZEX1pFUk8oJmZkc19leGMpOworICAgICAgICAgICAgRkRfU0VUKHMtPnNvY2tfZmQsICZmZHNfZXhjKTsKKyAgICAgICAgICAgIHJlcyA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsIE5VTEwsICZmZHMsICZmZHNfZXhjLCAmdHYpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmVzID0gV1NBRVdPVUxEQkxPQ0s7CisgICAgICAgICAgICAgICAgdGltZW91dCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoRkRfSVNTRVQocy0+c29ja19mZCwgJmZkcykpCisgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBzb2NrZXQgaXMgaW4gdGhlIHdyaXRlYWJsZSBzZXQgLSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgIG1lYW5zIGNvbm5lY3RlZCAqLworICAgICAgICAgICAgICAgICAgICByZXMgPSAwOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBBcyBwZXIgTVMgZG9jcywgd2UgbmVlZCB0byBjYWxsIGdldHNvY2tvcHQoKQorICAgICAgICAgICAgICAgICAgICAgICB0byBnZXQgdGhlIHVuZGVybHlpbmcgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgaW50IHJlc19zaXplID0gc2l6ZW9mIHJlczsKKyAgICAgICAgICAgICAgICAgICAgLyogSXQgbXVzdCBiZSBpbiB0aGUgZXhjZXB0aW9uIHNldCAqLworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoRkRfSVNTRVQocy0+c29ja19mZCwgJmZkc19leGMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gZ2V0c29ja29wdChzLT5zb2NrX2ZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZyZXMsICZyZXNfc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXRzb2Nrb3B0IGFsc28gY2xlYXJzIFdTQUdldExhc3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHJlc2V0IGl0IGJhY2suICovCisgICAgICAgICAgICAgICAgICAgICAgICBXU0FTZXRMYXN0RXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZWxzZSBpZiAocmVzIDwgMCkgYW4gZXJyb3Igb2NjdXJyZWQgKi8KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChyZXMgPCAwKQotCQlyZXMgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmVzID0gV1NBR2V0TGFzdEVycm9yKCk7CiAKICNlbHNlCiAKLQlpZiAocy0+c29ja190aW1lb3V0ID4gMC4wKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUlOUFJPR1JFU1MgJiYgSVNfU0VMRUNUQUJMRShzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnVnICMxMDE5ODA4OiBpbiBjYXNlIG9mIGFuIEVJTlBST0dSRVNTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIGdldHNvY2tvcHQoU09fRVJST1IpIHRvIGdldCB0aGUgcmVhbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCByZXNfc2l6ZSA9IHNpemVvZiByZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKWdldHNvY2tvcHQocy0+c29ja19mZCwgU09MX1NPQ0tFVCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09fRVJST1IsICZyZXMsICZyZXNfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gRUlTQ09OTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyA9IHJlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVvdXQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gZXJybm87ICAgICAgICAgICAgLyogaGFkIGVycm9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCQllbHNlCi0JCQkJcmVzID0gRVdPVUxEQkxPQ0s7CS8qIHRpbWVkIG91dCAqLwotCQl9Ci0JfQorICAgIGlmIChzLT5zb2NrX3RpbWVvdXQgPiAwLjApIHsKKyAgICAgICAgaWYgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUlOUFJPR1JFU1MgJiYgSVNfU0VMRUNUQUJMRShzKSkgeworICAgICAgICAgICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBCdWcgIzEwMTk4MDg6IGluIGNhc2Ugb2YgYW4gRUlOUFJPR1JFU1MsCisgICAgICAgICAgICAgICAgICAgdXNlIGdldHNvY2tvcHQoU09fRVJST1IpIHRvIGdldCB0aGUgcmVhbAorICAgICAgICAgICAgICAgICAgIGVycm9yLiAqLworICAgICAgICAgICAgICAgIHNvY2tsZW5fdCByZXNfc2l6ZSA9IHNpemVvZiByZXM7CisgICAgICAgICAgICAgICAgKHZvaWQpZ2V0c29ja29wdChzLT5zb2NrX2ZkLCBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09fRVJST1IsICZyZXMsICZyZXNfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBFSVNDT05OKQorICAgICAgICAgICAgICAgICAgICByZXMgPSAwOworICAgICAgICAgICAgICAgIGVycm5vID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodGltZW91dCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJlcyA9IGVycm5vOyAgICAgICAgICAgIC8qIGhhZCBlcnJvciAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlcyA9IEVXT1VMREJMT0NLOyAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lZCBvdXQgKi8KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChyZXMgPCAwKQotCQlyZXMgPSBlcnJubzsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmVzID0gZXJybm87CiAKICNlbmRpZgotCSp0aW1lb3V0cCA9IHRpbWVvdXQ7CisgICAgKnRpbWVvdXRwID0gdGltZW91dDsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogcy5jb25uZWN0KHNvY2thZGRyKSBtZXRob2QgKi8KQEAgLTIwNDQsMjYgKzIwNDQsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX2Nvbm5lY3QoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYWRkcm8pCiB7Ci0Jc29ja19hZGRyX3QgYWRkcmJ1ZjsKLQlpbnQgYWRkcmxlbjsKLQlpbnQgcmVzOwotCWludCB0aW1lb3V0OworICAgIHNvY2tfYWRkcl90IGFkZHJidWY7CisgICAgaW50IGFkZHJsZW47CisgICAgaW50IHJlczsKKyAgICBpbnQgdGltZW91dDsKIAotCWlmICghZ2V0c29ja2FkZHJhcmcocywgYWRkcm8sIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRzb2NrYWRkcmFyZyhzLCBhZGRybywgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSBpbnRlcm5hbF9jb25uZWN0KHMsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4sICZ0aW1lb3V0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXMgPSBpbnRlcm5hbF9jb25uZWN0KHMsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4sICZ0aW1lb3V0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHRpbWVvdXQgPT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChyZXMgIT0gMCkKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAodGltZW91dCA9PSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHJlcyAhPSAwKQorICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoY29ubmVjdF9kb2MsCkBAIC0yMDc4LDI2ICsyMDc4LDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19jb25uZWN0X2V4KFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFkZHJvKQogewotCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JaW50IGFkZHJsZW47Ci0JaW50IHJlczsKLQlpbnQgdGltZW91dDsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGludCBhZGRybGVuOworICAgIGludCByZXM7CisgICAgaW50IHRpbWVvdXQ7CiAKLQlpZiAoIWdldHNvY2thZGRyYXJnKHMsIGFkZHJvLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghZ2V0c29ja2FkZHJhcmcocywgYWRkcm8sIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gaW50ZXJuYWxfY29ubmVjdChzLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuLCAmdGltZW91dCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gaW50ZXJuYWxfY29ubmVjdChzLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuLCAmdGltZW91dCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCS8qIFNpZ25hbHMgYXJlIG5vdCBlcnJvcnMgKHRob3VnaCB0aGV5IG1heSByYWlzZSBleGNlcHRpb25zKS4gIEFkYXB0ZWQKLQkgICBmcm9tIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdCgpLiAqLworICAgIC8qIFNpZ25hbHMgYXJlIG5vdCBlcnJvcnMgKHRob3VnaCB0aGV5IG1heSByYWlzZSBleGNlcHRpb25zKS4gIEFkYXB0ZWQKKyAgICAgICBmcm9tIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdCgpLiAqLwogI2lmZGVmIEVJTlRSCi0JaWYgKHJlcyA9PSBFSU5UUiAmJiBQeUVycl9DaGVja1NpZ25hbHMoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHJlcyA9PSBFSU5UUiAmJiBQeUVycl9DaGVja1NpZ25hbHMoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcmVzKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHJlcyk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb25uZWN0X2V4X2RvYywKQEAgLTIxMTMsOSArMjExMyw5IEBACiBzb2NrX2ZpbGVubyhQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7CiAjaWYgU0laRU9GX1NPQ0tFVF9UIDw9IFNJWkVPRl9MT05HCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBzLT5zb2NrX2ZkKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHMtPnNvY2tfZmQpOwogI2Vsc2UKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXMtPnNvY2tfZmQpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpcy0+c29ja19mZCk7CiAjZW5kaWYKIH0KIApAQCAtMjEzMSwxOSArMjEzMSwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfZHVwKFB5U29ja2V0U29ja09iamVjdCAqcykKIHsKLQlTT0NLRVRfVCBuZXdmZDsKLQlQeU9iamVjdCAqc29jazsKKyAgICBTT0NLRVRfVCBuZXdmZDsKKyAgICBQeU9iamVjdCAqc29jazsKIAotCW5ld2ZkID0gZHVwKHMtPnNvY2tfZmQpOwotCWlmIChuZXdmZCA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlzb2NrID0gKFB5T2JqZWN0ICopIG5ld19zb2Nrb2JqZWN0KG5ld2ZkLAotCQkJCQkgICBzLT5zb2NrX2ZhbWlseSwKLQkJCQkJICAgcy0+c29ja190eXBlLAotCQkJCQkgICBzLT5zb2NrX3Byb3RvKTsKLQlpZiAoc29jayA9PSBOVUxMKQotCQlTT0NLRVRDTE9TRShuZXdmZCk7Ci0JcmV0dXJuIHNvY2s7CisgICAgbmV3ZmQgPSBkdXAocy0+c29ja19mZCk7CisgICAgaWYgKG5ld2ZkIDwgMCkKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIHNvY2sgPSAoUHlPYmplY3QgKikgbmV3X3NvY2tvYmplY3QobmV3ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zb2NrX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNvY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNvY2tfcHJvdG8pOworICAgIGlmIChzb2NrID09IE5VTEwpCisgICAgICAgIFNPQ0tFVENMT1NFKG5ld2ZkKTsKKyAgICByZXR1cm4gc29jazsKIH0KIAogUHlEb2NfU1RSVkFSKGR1cF9kb2MsCkBAIC0yMTU5LDIwICsyMTU5LDIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19nZXRzb2NrbmFtZShQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7Ci0Jc29ja19hZGRyX3QgYWRkcmJ1ZjsKLQlpbnQgcmVzOwotCXNvY2tsZW5fdCBhZGRybGVuOworICAgIHNvY2tfYWRkcl90IGFkZHJidWY7CisgICAgaW50IHJlczsKKyAgICBzb2NrbGVuX3QgYWRkcmxlbjsKIAotCWlmICghZ2V0c29ja2FkZHJsZW4ocywgJmFkZHJsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoJmFkZHJidWYsIDAsIGFkZHJsZW4pOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSBnZXRzb2NrbmFtZShzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCXJldHVybiBtYWtlc29ja2FkZHIocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgYWRkcmxlbiwKLQkJCSAgICBzLT5zb2NrX3Byb3RvKTsKKyAgICBpZiAoIWdldHNvY2thZGRybGVuKHMsICZhZGRybGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gZ2V0c29ja25hbWUocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICByZXR1cm4gbWFrZXNvY2thZGRyKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zb2NrX3Byb3RvKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHNvY2tuYW1lX2RvYywKQEAgLTIxODIsMjYgKzIxODIsMjYgQEAKIGluZm8gaXMgYSBwYWlyIChob3N0YWRkciwgcG9ydCkuIik7CiAKIAotI2lmZGVmIEhBVkVfR0VUUEVFUk5BTUUJCS8qIENyYXkgQVBQIGRvZXNuJ3QgaGF2ZSB0aGlzIDotKCAqLworI2lmZGVmIEhBVkVfR0VUUEVFUk5BTUUgICAgICAgICAvKiBDcmF5IEFQUCBkb2Vzbid0IGhhdmUgdGhpcyA6LSggKi8KIC8qIHMuZ2V0cGVlcm5hbWUoKSBtZXRob2QgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfZ2V0cGVlcm5hbWUoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewotCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JaW50IHJlczsKLQlzb2NrbGVuX3QgYWRkcmxlbjsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGludCByZXM7CisgICAgc29ja2xlbl90IGFkZHJsZW47CiAKLQlpZiAoIWdldHNvY2thZGRybGVuKHMsICZhZGRybGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gZ2V0cGVlcm5hbWUocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlyZXR1cm4gbWFrZXNvY2thZGRyKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4sCi0JCQkgICAgcy0+c29ja19wcm90byk7CisgICAgaWYgKCFnZXRzb2NrYWRkcmxlbihzLCAmYWRkcmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmYWRkcmJ1ZiwgMCwgYWRkcmxlbik7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlcyA9IGdldHBlZXJuYW1lKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgcmV0dXJuIG1ha2Vzb2NrYWRkcihzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+c29ja19wcm90byk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRwZWVybmFtZV9kb2MsCkBAIC0yMjE4LDIxICsyMjE4LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19saXN0ZW4oUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJnKQogewotCWludCBiYWNrbG9nOwotCWludCByZXM7CisgICAgaW50IGJhY2tsb2c7CisgICAgaW50IHJlczsKIAotCWJhY2tsb2cgPSBQeUludF9Bc0xvbmcoYXJnKTsKLQlpZiAoYmFja2xvZyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JaWYgKGJhY2tsb2cgPCAxKQotCQliYWNrbG9nID0gMTsKLQlyZXMgPSBsaXN0ZW4ocy0+c29ja19mZCwgYmFja2xvZyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBiYWNrbG9nID0gUHlJbnRfQXNMb25nKGFyZyk7CisgICAgaWYgKGJhY2tsb2cgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGlmIChiYWNrbG9nIDwgMSkKKyAgICAgICAgYmFja2xvZyA9IDE7CisgICAgcmVzID0gbGlzdGVuKHMtPnNvY2tfZmQsIGJhY2tsb2cpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihsaXN0ZW5fZG9jLApAQCAtMjI1NCw0OCArMjI1NCw0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfbWFrZWZpbGUoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKLQlleHRlcm4gaW50IGZjbG9zZShGSUxFICopOwotCWNoYXIgKm1vZGUgPSAiciI7Ci0JaW50IGJ1ZnNpemUgPSAtMTsKKyAgICBleHRlcm4gaW50IGZjbG9zZShGSUxFICopOworICAgIGNoYXIgKm1vZGUgPSAiciI7CisgICAgaW50IGJ1ZnNpemUgPSAtMTsKICNpZmRlZiBNU19XSU4zMgotCVB5X2ludHB0cl90IGZkOworICAgIFB5X2ludHB0cl90IGZkOwogI2Vsc2UKLQlpbnQgZmQ7CisgICAgaW50IGZkOwogI2VuZGlmCi0JRklMRSAqZnA7Ci0JUHlPYmplY3QgKmY7CisgICAgRklMRSAqZnA7CisgICAgUHlPYmplY3QgKmY7CiAjaWZkZWYgX19WTVMKLQljaGFyICptb2RlX3IgPSAiciI7Ci0JY2hhciAqbW9kZV93ID0gInciOworICAgIGNoYXIgKm1vZGVfciA9ICJyIjsKKyAgICBjaGFyICptb2RlX3cgPSAidyI7CiAjZW5kaWYKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHNpOm1ha2VmaWxlIiwgJm1vZGUsICZidWZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8c2k6bWFrZWZpbGUiLCAmbW9kZSwgJmJ1ZnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBfX1ZNUwotCWlmIChzdHJjbXAobW9kZSwicmIiKSA9PSAwKSB7Ci0JICAgIG1vZGUgPSBtb2RlX3I7Ci0JfQotCWVsc2UgewotCQlpZiAoc3RyY21wKG1vZGUsIndiIikgPT0gMCkgewotCQkJbW9kZSA9IG1vZGVfdzsKLQkJfQotCX0KKyAgICBpZiAoc3RyY21wKG1vZGUsInJiIikgPT0gMCkgeworICAgICAgICBtb2RlID0gbW9kZV9yOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHN0cmNtcChtb2RlLCJ3YiIpID09IDApIHsKKyAgICAgICAgICAgIG1vZGUgPSBtb2RlX3c7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKICNpZmRlZiBNU19XSU4zMgotCWlmICgoKGZkID0gX29wZW5fb3NmaGFuZGxlKHMtPnNvY2tfZmQsIF9PX0JJTkFSWSkpIDwgMCkgfHwKLQkgICAgKChmZCA9IGR1cChmZCkpIDwgMCkgfHwgKChmcCA9IGZkb3BlbihmZCwgbW9kZSkpID09IE5VTEwpKQorICAgIGlmICgoKGZkID0gX29wZW5fb3NmaGFuZGxlKHMtPnNvY2tfZmQsIF9PX0JJTkFSWSkpIDwgMCkgfHwKKyAgICAgICAgKChmZCA9IGR1cChmZCkpIDwgMCkgfHwgKChmcCA9IGZkb3BlbihmZCwgbW9kZSkpID09IE5VTEwpKQogI2Vsc2UKLQlpZiAoKGZkID0gZHVwKHMtPnNvY2tfZmQpKSA8IDAgfHwgKGZwID0gZmRvcGVuKGZkLCBtb2RlKSkgPT0gTlVMTCkKKyAgICBpZiAoKGZkID0gZHVwKHMtPnNvY2tfZmQpKSA8IDAgfHwgKGZwID0gZmRvcGVuKGZkLCBtb2RlKSkgPT0gTlVMTCkKICNlbmRpZgotCXsKLQkJaWYgKGZkID49IDApCi0JCQlTT0NLRVRDTE9TRShmZCk7Ci0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQl9Ci0JZiA9IFB5RmlsZV9Gcm9tRmlsZShmcCwgIjxzb2NrZXQ+IiwgbW9kZSwgZmNsb3NlKTsKLQlpZiAoZiAhPSBOVUxMKQotCQlQeUZpbGVfU2V0QnVmU2l6ZShmLCBidWZzaXplKTsKLQlyZXR1cm4gZjsKKyAgICB7CisgICAgICAgIGlmIChmZCA+PSAwKQorICAgICAgICAgICAgU09DS0VUQ0xPU0UoZmQpOworICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgfQorICAgIGYgPSBQeUZpbGVfRnJvbUZpbGUoZnAsICI8c29ja2V0PiIsIG1vZGUsIGZjbG9zZSk7CisgICAgaWYgKGYgIT0gTlVMTCkKKyAgICAgICAgUHlGaWxlX1NldEJ1ZlNpemUoZiwgYnVmc2l6ZSk7CisgICAgcmV0dXJuIGY7CiB9CiAKIFB5RG9jX1NUUlZBUihtYWtlZmlsZV9kb2MsCkBAIC0yMzE3LDc2ICsyMzE3LDc2IEBACiBzdGF0aWMgc3NpemVfdAogc29ja19yZWN2X2d1dHMoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBjaGFyKiBjYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MpCiB7Ci0gICAgICAgIHNzaXplX3Qgb3V0bGVuID0gLTE7Ci0gICAgICAgIGludCB0aW1lb3V0OworICAgIHNzaXplX3Qgb3V0bGVuID0gLTE7CisgICAgaW50IHRpbWVvdXQ7CiAjaWZkZWYgX19WTVMKLQlpbnQgcmVtYWluaW5nOwotCWNoYXIgKnJlYWRfYnVmOworICAgIGludCByZW1haW5pbmc7CisgICAgY2hhciAqcmVhZF9idWY7CiAjZW5kaWYKIAotCWlmICghSVNfU0VMRUNUQUJMRShzKSkgewotCQlzZWxlY3RfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKKyAgICAgICAgc2VsZWN0X2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKICNpZm5kZWYgX19WTVMKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKLQlpZiAoIXRpbWVvdXQpCi0JCW91dGxlbiA9IHJlY3Yocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKKyAgICBpZiAoIXRpbWVvdXQpCisgICAgICAgIG91dGxlbiA9IHJlY3Yocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0ID09IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKG91dGxlbiA8IDApIHsKLQkJLyogTm90ZTogdGhlIGNhbGwgdG8gZXJyb3JoYW5kbGVyKCkgQUxXQVlTIGluZGlyZWN0bHkgcmV0dXJuZWQKLQkJICAgTlVMTCwgc28gaWdub3JlIGl0cyByZXR1cm4gdmFsdWUgKi8KLQkJcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHRpbWVvdXQgPT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAob3V0bGVuIDwgMCkgeworICAgICAgICAvKiBOb3RlOiB0aGUgY2FsbCB0byBlcnJvcmhhbmRsZXIoKSBBTFdBWVMgaW5kaXJlY3RseSByZXR1cm5lZAorICAgICAgICAgICBOVUxMLCBzbyBpZ25vcmUgaXRzIHJldHVybiB2YWx1ZSAqLworICAgICAgICBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICNlbHNlCi0JcmVhZF9idWYgPSBjYnVmOwotCXJlbWFpbmluZyA9IGxlbjsKLQl3aGlsZSAocmVtYWluaW5nICE9IDApIHsKLQkJdW5zaWduZWQgaW50IHNlZ21lbnQ7Ci0JCWludCBucmVhZCA9IC0xOworICAgIHJlYWRfYnVmID0gY2J1ZjsKKyAgICByZW1haW5pbmcgPSBsZW47CisgICAgd2hpbGUgKHJlbWFpbmluZyAhPSAwKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBzZWdtZW50OworICAgICAgICBpbnQgbnJlYWQgPSAtMTsKIAotCQlzZWdtZW50ID0gcmVtYWluaW5nIC9TRUdNRU5UX1NJWkU7Ci0JCWlmIChzZWdtZW50ICE9IDApIHsKLQkJCXNlZ21lbnQgPSBTRUdNRU5UX1NJWkU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZWdtZW50ID0gcmVtYWluaW5nOwotCQl9CisgICAgICAgIHNlZ21lbnQgPSByZW1haW5pbmcgL1NFR01FTlRfU0laRTsKKyAgICAgICAgaWYgKHNlZ21lbnQgIT0gMCkgeworICAgICAgICAgICAgc2VnbWVudCA9IFNFR01FTlRfU0laRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlZ21lbnQgPSByZW1haW5pbmc7CisgICAgICAgIH0KIAotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7Ci0JCWlmICghdGltZW91dCkKLQkJCW5yZWFkID0gcmVjdihzLT5zb2NrX2ZkLCByZWFkX2J1Ziwgc2VnbWVudCwgZmxhZ3MpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7CisgICAgICAgIGlmICghdGltZW91dCkKKyAgICAgICAgICAgIG5yZWFkID0gcmVjdihzLT5zb2NrX2ZkLCByZWFkX2J1Ziwgc2VnbWVudCwgZmxhZ3MpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JCWlmICh0aW1lb3V0ID09IDEpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChucmVhZCA8IDApIHsKLQkJCXMtPmVycm9yaGFuZGxlcigpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChucmVhZCAhPSByZW1haW5pbmcpIHsKLQkJCXJlYWRfYnVmICs9IG5yZWFkOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaWYgKHRpbWVvdXQgPT0gMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5yZWFkIDwgMCkgeworICAgICAgICAgICAgcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5yZWFkICE9IHJlbWFpbmluZykgeworICAgICAgICAgICAgcmVhZF9idWYgKz0gbnJlYWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCXJlbWFpbmluZyAtPSBzZWdtZW50OwotCQlyZWFkX2J1ZiArPSBzZWdtZW50OwotCX0KLQlvdXRsZW4gPSByZWFkX2J1ZiAtIGNidWY7CisgICAgICAgIHJlbWFpbmluZyAtPSBzZWdtZW50OworICAgICAgICByZWFkX2J1ZiArPSBzZWdtZW50OworICAgIH0KKyAgICBvdXRsZW4gPSByZWFkX2J1ZiAtIGNidWY7CiAjZW5kaWYgLyogIV9fVk1TICovCiAKLQlyZXR1cm4gb3V0bGVuOworICAgIHJldHVybiBvdXRsZW47CiB9CiAKIApAQCAtMjM5NSw0MSArMjM5NSw0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfcmVjdihQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZWN2bGVuLCBmbGFncyA9IDA7Ci0gICAgICAgIHNzaXplX3Qgb3V0bGVuOwotCVB5T2JqZWN0ICpidWY7CisgICAgaW50IHJlY3ZsZW4sIGZsYWdzID0gMDsKKyAgICBzc2l6ZV90IG91dGxlbjsKKyAgICBQeU9iamVjdCAqYnVmOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfGk6cmVjdiIsICZyZWN2bGVuLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8aTpyZWN2IiwgJnJlY3ZsZW4sICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlY3ZsZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3YiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChyZWN2bGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3YiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nLiAqLwotCWJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIDAsIHJlY3ZsZW4pOwotCWlmIChidWYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nLiAqLworICAgIGJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIDAsIHJlY3ZsZW4pOworICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBDYWxsIHRoZSBndXRzICovCi0Jb3V0bGVuID0gc29ja19yZWN2X2d1dHMocywgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIHJlY3ZsZW4sIGZsYWdzKTsKLQlpZiAob3V0bGVuIDwgMCkgewotCQkvKiBBbiBlcnJvciBvY2N1cnJlZCwgcmVsZWFzZSB0aGUgc3RyaW5nIGFuZCByZXR1cm4gYW4KLQkJICAgZXJyb3IuICovCi0JCVB5X0RFQ1JFRihidWYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG91dGxlbiAhPSByZWN2bGVuKSB7Ci0JCS8qIFdlIGRpZCBub3QgcmVhZCBhcyBtYW55IGJ5dGVzIGFzIHdlIGFudGljaXBhdGVkLCByZXNpemUgdGhlCi0JCSAgIHN0cmluZyBpZiBwb3NzaWJsZSBhbmQgYmUgc3VjY2VzZnVsLiAqLwotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLCBvdXRsZW4pIDwgMCkKLQkJCS8qIE9vcHN5LCBub3Qgc28gc3VjY2VzZnVsIGFmdGVyIGFsbC4gKi8KLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBDYWxsIHRoZSBndXRzICovCisgICAgb3V0bGVuID0gc29ja19yZWN2X2d1dHMocywgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIHJlY3ZsZW4sIGZsYWdzKTsKKyAgICBpZiAob3V0bGVuIDwgMCkgeworICAgICAgICAvKiBBbiBlcnJvciBvY2N1cnJlZCwgcmVsZWFzZSB0aGUgc3RyaW5nIGFuZCByZXR1cm4gYW4KKyAgICAgICAgICAgZXJyb3IuICovCisgICAgICAgIFB5X0RFQ1JFRihidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG91dGxlbiAhPSByZWN2bGVuKSB7CisgICAgICAgIC8qIFdlIGRpZCBub3QgcmVhZCBhcyBtYW55IGJ5dGVzIGFzIHdlIGFudGljaXBhdGVkLCByZXNpemUgdGhlCisgICAgICAgICAgIHN0cmluZyBpZiBwb3NzaWJsZSBhbmQgYmUgc3VjY2VzZnVsLiAqLworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLCBvdXRsZW4pIDwgMCkKKyAgICAgICAgICAgIC8qIE9vcHN5LCBub3Qgc28gc3VjY2VzZnVsIGFmdGVyIGFsbC4gKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBidWY7CisgICAgcmV0dXJuIGJ1ZjsKIH0KIAogUHlEb2NfU1RSVkFSKHJlY3ZfZG9jLApAQCAtMjQ0Niw1MiArMjQ0Niw1MiBAQAogc3RhdGljIFB5T2JqZWN0Kgogc29ja19yZWN2X2ludG8oUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJidWZmZXIiLCAibmJ5dGVzIiwgImZsYWdzIiwgMH07CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJidWZmZXIiLCAibmJ5dGVzIiwgImZsYWdzIiwgMH07CiAKLQlpbnQgcmVjdmxlbiA9IDAsIGZsYWdzID0gMDsKLSAgICAgICAgc3NpemVfdCByZWFkbGVuOwotCVB5X2J1ZmZlciBidWY7Ci0JUHlfc3NpemVfdCBidWZsZW47CisgICAgaW50IHJlY3ZsZW4gPSAwLCBmbGFncyA9IDA7CisgICAgc3NpemVfdCByZWFkbGVuOworICAgIFB5X2J1ZmZlciBidWY7CisgICAgUHlfc3NpemVfdCBidWZsZW47CiAKLQkvKiBHZXQgdGhlIGJ1ZmZlcidzIG1lbW9yeSAqLwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ3KnxpaTpyZWN2X2ludG8iLCBrd2xpc3QsCi0JCQkJCSAmYnVmLCAmcmVjdmxlbiwgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVmbGVuID0gYnVmLmxlbjsKLQlhc3NlcnQoYnVmLmJ1ZiAhPSAwICYmIGJ1ZmxlbiA+IDApOworICAgIC8qIEdldCB0aGUgYnVmZmVyJ3MgbWVtb3J5ICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIncqfGlpOnJlY3ZfaW50byIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCAmcmVjdmxlbiwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnVmbGVuID0gYnVmLmxlbjsKKyAgICBhc3NlcnQoYnVmLmJ1ZiAhPSAwICYmIGJ1ZmxlbiA+IDApOwogCi0JaWYgKHJlY3ZsZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3ZfaW50byIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlpZiAocmVjdmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBJZiBuYnl0ZXMgd2FzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgYnVmZmVyJ3MgbGVuZ3RoICovCi0gICAgICAgICAgICByZWN2bGVuID0gYnVmbGVuOwotCX0KKyAgICBpZiAocmVjdmxlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2X2ludG8iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKHJlY3ZsZW4gPT0gMCkgeworICAgICAgICAvKiBJZiBuYnl0ZXMgd2FzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgYnVmZmVyJ3MgbGVuZ3RoICovCisgICAgICAgIHJlY3ZsZW4gPSBidWZsZW47CisgICAgfQogCi0JLyogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggKi8KLQlpZiAoYnVmbGVuIDwgcmVjdmxlbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiYnVmZmVyIHRvbyBzbWFsbCBmb3IgcmVxdWVzdGVkIGJ5dGVzIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIC8qIENoZWNrIGlmIHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoICovCisgICAgaWYgKGJ1ZmxlbiA8IHJlY3ZsZW4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHRvbyBzbWFsbCBmb3IgcmVxdWVzdGVkIGJ5dGVzIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JLyogQ2FsbCB0aGUgZ3V0cyAqLwotCXJlYWRsZW4gPSBzb2NrX3JlY3ZfZ3V0cyhzLCBidWYuYnVmLCByZWN2bGVuLCBmbGFncyk7Ci0JaWYgKHJlYWRsZW4gPCAwKSB7Ci0JCS8qIFJldHVybiBhbiBlcnJvci4gKi8KLQkJZ290byBlcnJvcjsKLQl9CisgICAgLyogQ2FsbCB0aGUgZ3V0cyAqLworICAgIHJlYWRsZW4gPSBzb2NrX3JlY3ZfZ3V0cyhzLCBidWYuYnVmLCByZWN2bGVuLCBmbGFncyk7CisgICAgaWYgKHJlYWRsZW4gPCAwKSB7CisgICAgICAgIC8qIFJldHVybiBhbiBlcnJvci4gKi8KKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZidWYpOwotCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBOb3RlIHRoYXQgd2UgZG8gbm90IGRvIGFueXRoaW5nCi0JICAgc3BlY2lhbCBoZXJlIGluIHRoZSBjYXNlIHRoYXQgcmVhZGxlbiA8IHJlY3ZsZW4uICovCi0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlYWRsZW4pOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisgICAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIE5vdGUgdGhhdCB3ZSBkbyBub3QgZG8gYW55dGhpbmcKKyAgICAgICBzcGVjaWFsIGhlcmUgaW4gdGhlIGNhc2UgdGhhdCByZWFkbGVuIDwgcmVjdmxlbi4gKi8KKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVhZGxlbik7CiAKIGVycm9yOgotCVB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHJlY3ZfaW50b19kb2MsCkBAIC0yNTE3LDU2ICsyNTE3LDU2IEBACiAgKi8KIHN0YXRpYyBzc2l6ZV90CiBzb2NrX3JlY3Zmcm9tX2d1dHMoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBjaGFyKiBjYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MsCi0JCSAgIFB5T2JqZWN0KiogYWRkcikKKyAgICAgICAgICAgICAgICAgICBQeU9iamVjdCoqIGFkZHIpCiB7Ci0Jc29ja19hZGRyX3QgYWRkcmJ1ZjsKLQlpbnQgdGltZW91dDsKLQlzc2l6ZV90IG4gPSAtMTsKLQlzb2NrbGVuX3QgYWRkcmxlbjsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGludCB0aW1lb3V0OworICAgIHNzaXplX3QgbiA9IC0xOworICAgIHNvY2tsZW5fdCBhZGRybGVuOwogCi0JKmFkZHIgPSBOVUxMOworICAgICphZGRyID0gTlVMTDsKIAotCWlmICghZ2V0c29ja2FkZHJsZW4ocywgJmFkZHJsZW4pKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFnZXRzb2NrYWRkcmxlbihzLCAmYWRkcmxlbikpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghSVNfU0VMRUNUQUJMRShzKSkgewotCQlzZWxlY3RfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKKyAgICAgICAgc2VsZWN0X2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKLQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOwotCWlmICghdGltZW91dCkgeworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBtZW1zZXQoJmFkZHJidWYsIDAsIGFkZHJsZW4pOworICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7CisgICAgaWYgKCF0aW1lb3V0KSB7CiAjaWZuZGVmIE1TX1dJTkRPV1MKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiAhZGVmaW5lZChQWUNDX0dDQykKLQkJbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MsCi0JCQkgICAgIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKTsKKyAgICAgICAgbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbik7CiAjZWxzZQotCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncywKLQkJCSAgICAgKHZvaWQgKikgJmFkZHJidWYsICZhZGRybGVuKTsKKyAgICAgICAgbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmYWRkcmJ1ZiwgJmFkZHJsZW4pOwogI2VuZGlmCiAjZWxzZQotCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncywKLQkJCSAgICAgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pOworICAgICAgICBuID0gcmVjdmZyb20ocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKTsKICNlbmRpZgotCX0KLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHRpbWVvdXQgPT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAobiA8IDApIHsKLQkJcy0+ZXJyb3JoYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodGltZW91dCA9PSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChuIDwgMCkgeworICAgICAgICBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICghKCphZGRyID0gbWFrZXNvY2thZGRyKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksCi0JCQkJICAgYWRkcmxlbiwgcy0+c29ja19wcm90bykpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoKmFkZHIgPSBtYWtlc29ja2FkZHIocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRybGVuLCBzLT5zb2NrX3Byb3RvKSkpCisgICAgICAgIHJldHVybiAtMTsKIAotCXJldHVybiBuOworICAgIHJldHVybiBuOwogfQogCiAvKiBzLnJlY3Zmcm9tKG5ieXRlcyBbLGZsYWdzXSkgbWV0aG9kICovCkBAIC0yNTc0LDQ1ICsyNTc0LDQ1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19yZWN2ZnJvbShQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpidWYgPSBOVUxMOwotCVB5T2JqZWN0ICphZGRyID0gTlVMTDsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlpbnQgcmVjdmxlbiwgZmxhZ3MgPSAwOwotICAgICAgICBzc2l6ZV90IG91dGxlbjsKKyAgICBQeU9iamVjdCAqYnVmID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYWRkciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgaW50IHJlY3ZsZW4sIGZsYWdzID0gMDsKKyAgICBzc2l6ZV90IG91dGxlbjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpOnJlY3Zmcm9tIiwgJnJlY3ZsZW4sICZmbGFncykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpOnJlY3Zmcm9tIiwgJnJlY3ZsZW4sICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlY3ZsZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3Zmcm9tIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocmVjdmxlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2ZnJvbSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlidWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAwLCByZWN2bGVuKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIDAsIHJlY3ZsZW4pOworICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlvdXRsZW4gPSBzb2NrX3JlY3Zmcm9tX2d1dHMocywgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksCi0JCQkJICAgIHJlY3ZsZW4sIGZsYWdzLCAmYWRkcik7Ci0JaWYgKG91dGxlbiA8IDApIHsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBvdXRsZW4gPSBzb2NrX3JlY3Zmcm9tX2d1dHMocywgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ZsZW4sIGZsYWdzLCAmYWRkcik7CisgICAgaWYgKG91dGxlbiA8IDApIHsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmIChvdXRsZW4gIT0gcmVjdmxlbikgewotCQkvKiBXZSBkaWQgbm90IHJlYWQgYXMgbWFueSBieXRlcyBhcyB3ZSBhbnRpY2lwYXRlZCwgcmVzaXplIHRoZQotCQkgICBzdHJpbmcgaWYgcG9zc2libGUgYW5kIGJlIHN1Y2Nlc2Z1bC4gKi8KLQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmJ1Ziwgb3V0bGVuKSA8IDApCi0JCQkvKiBPb3BzeSwgbm90IHNvIHN1Y2Nlc2Z1bCBhZnRlciBhbGwuICovCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmIChvdXRsZW4gIT0gcmVjdmxlbikgeworICAgICAgICAvKiBXZSBkaWQgbm90IHJlYWQgYXMgbWFueSBieXRlcyBhcyB3ZSBhbnRpY2lwYXRlZCwgcmVzaXplIHRoZQorICAgICAgICAgICBzdHJpbmcgaWYgcG9zc2libGUgYW5kIGJlIHN1Y2Nlc2Z1bC4gKi8KKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJmJ1Ziwgb3V0bGVuKSA8IDApCisgICAgICAgICAgICAvKiBPb3BzeSwgbm90IHNvIHN1Y2Nlc2Z1bCBhZnRlciBhbGwuICovCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JcmV0ID0gUHlUdXBsZV9QYWNrKDIsIGJ1ZiwgYWRkcik7CisgICAgcmV0ID0gUHlUdXBsZV9QYWNrKDIsIGJ1ZiwgYWRkcik7CiAKIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihidWYpOwotCVB5X1hERUNSRUYoYWRkcik7Ci0JcmV0dXJuIHJldDsKKyAgICBQeV9YREVDUkVGKGJ1Zik7CisgICAgUHlfWERFQ1JFRihhZGRyKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBQeURvY19TVFJWQVIocmVjdmZyb21fZG9jLApAQCAtMjYyNiw0NyArMjYyNiw0NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfcmVjdmZyb21faW50byhQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCoga3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJ1ZmZlciIsICJuYnl0ZXMiLCAiZmxhZ3MiLCAwfTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJ1ZmZlciIsICJuYnl0ZXMiLCAiZmxhZ3MiLCAwfTsKIAotCWludCByZWN2bGVuID0gMCwgZmxhZ3MgPSAwOwotICAgICAgICBzc2l6ZV90IHJlYWRsZW47Ci0JUHlfYnVmZmVyIGJ1ZjsKLQlpbnQgYnVmbGVuOworICAgIGludCByZWN2bGVuID0gMCwgZmxhZ3MgPSAwOworICAgIHNzaXplX3QgcmVhZGxlbjsKKyAgICBQeV9idWZmZXIgYnVmOworICAgIGludCBidWZsZW47CiAKLQlQeU9iamVjdCAqYWRkciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmFkZHIgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIncqfGlpOnJlY3Zmcm9tX2ludG8iLAotCQkJCQkga3dsaXN0LCAmYnVmLAotCQkJCQkgJnJlY3ZsZW4sICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCWJ1ZmxlbiA9IGJ1Zi5sZW47Ci0JYXNzZXJ0KGJ1Zi5idWYgIT0gMCAmJiBidWZsZW4gPiAwKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAidyp8aWk6cmVjdmZyb21faW50byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN2bGVuLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBidWZsZW4gPSBidWYubGVuOworICAgIGFzc2VydChidWYuYnVmICE9IDAgJiYgYnVmbGVuID4gMCk7CiAKLQlpZiAocmVjdmxlbiA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm5lZ2F0aXZlIGJ1ZmZlcnNpemUgaW4gcmVjdmZyb21faW50byIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlpZiAocmVjdmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBJZiBuYnl0ZXMgd2FzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgYnVmZmVyJ3MgbGVuZ3RoICovCi0gICAgICAgICAgICByZWN2bGVuID0gYnVmbGVuOwotCX0KKyAgICBpZiAocmVjdmxlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2ZnJvbV9pbnRvIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGlmIChyZWN2bGVuID09IDApIHsKKyAgICAgICAgLyogSWYgbmJ5dGVzIHdhcyBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGJ1ZmZlcidzIGxlbmd0aCAqLworICAgICAgICByZWN2bGVuID0gYnVmbGVuOworICAgIH0KIAotCXJlYWRsZW4gPSBzb2NrX3JlY3Zmcm9tX2d1dHMocywgYnVmLmJ1ZiwgcmVjdmxlbiwgZmxhZ3MsICZhZGRyKTsKLQlpZiAocmVhZGxlbiA8IDApIHsKLQkJLyogUmV0dXJuIGFuIGVycm9yICovCi0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIHJlYWRsZW4gPSBzb2NrX3JlY3Zmcm9tX2d1dHMocywgYnVmLmJ1ZiwgcmVjdmxlbiwgZmxhZ3MsICZhZGRyKTsKKyAgICBpZiAocmVhZGxlbiA8IDApIHsKKyAgICAgICAgLyogUmV0dXJuIGFuIGVycm9yICovCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKLQkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGFuZCB0aGUgYWRkcmVzcy4gIE5vdGUgdGhhdCB3ZSBkbwotCSAgIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIGhlcmUgaW4gdGhlIGNhc2UgdGhhdCByZWFkbGVuIDwgcmVjdmxlbi4gKi8KLSAJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxOIiwgcmVhZGxlbiwgYWRkcik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKKyAgICAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGFuZCB0aGUgYWRkcmVzcy4gIE5vdGUgdGhhdCB3ZSBkbworICAgICAgIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIGhlcmUgaW4gdGhlIGNhc2UgdGhhdCByZWFkbGVuIDwgcmVjdmxlbi4gKi8KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibE4iLCByZWFkbGVuLCBhZGRyKTsKIAogZXJyb3I6Ci0JUHlfWERFQ1JFRihhZGRyKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZidWYpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYoYWRkcik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHJlY3Zmcm9tX2ludG9fZG9jLApAQCAtMjY4MCwzOSArMjY4MCwzOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfc2VuZChQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmJ1ZjsKLQlpbnQgbGVuLCBuID0gLTEsIGZsYWdzID0gMCwgdGltZW91dDsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGxlbiwgbiA9IC0xLCBmbGFncyA9IDAsIHRpbWVvdXQ7CisgICAgUHlfYnVmZmVyIHBidWY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfGk6c2VuZCIsICZwYnVmLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfGk6c2VuZCIsICZwYnVmLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghSVNfU0VMRUNUQUJMRShzKSkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQkJcmV0dXJuIHNlbGVjdF9lcnJvcigpOwotCX0KLQlidWYgPSBwYnVmLmJ1ZjsKLQlsZW4gPSBwYnVmLmxlbjsKKyAgICBpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgIHJldHVybiBzZWxlY3RfZXJyb3IoKTsKKyAgICB9CisgICAgYnVmID0gcGJ1Zi5idWY7CisgICAgbGVuID0gcGJ1Zi5sZW47CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKLQlpZiAoIXRpbWVvdXQpCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7CisgICAgaWYgKCF0aW1lb3V0KQogI2lmZGVmIF9fVk1TCi0JCW4gPSBzZW5kc2VnbWVudGVkKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncyk7CisgICAgICAgIG4gPSBzZW5kc2VnbWVudGVkKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncyk7CiAjZWxzZQotCQluID0gc2VuZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOworICAgICAgICBuID0gc2VuZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOwogI2VuZGlmCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAKLQlpZiAodGltZW91dCA9PSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG4gPCAwKQotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKW4pOworICAgIGlmICh0aW1lb3V0ID09IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbik7CiB9CiAKIFB5RG9jX1NUUlZBUihzZW5kX2RvYywKQEAgLTI3MjgsNjEgKzI3MjgsNjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NlbmRhbGwoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpidWY7Ci0JaW50IGxlbiwgbiA9IC0xLCBmbGFncyA9IDAsIHRpbWVvdXQ7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgY2hhciAqYnVmOworICAgIGludCBsZW4sIG4gPSAtMSwgZmxhZ3MgPSAwLCB0aW1lb3V0OworICAgIFB5X2J1ZmZlciBwYnVmOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnxpOnNlbmRhbGwiLCAmcGJ1ZiwgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVmID0gcGJ1Zi5idWY7Ci0JbGVuID0gcGJ1Zi5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnxpOnNlbmRhbGwiLCAmcGJ1ZiwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnVmID0gcGJ1Zi5idWY7CisgICAgbGVuID0gcGJ1Zi5sZW47CiAKLQlpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JCXJldHVybiBzZWxlY3RfZXJyb3IoKTsKLQl9CisgICAgaWYgKCFJU19TRUxFQ1RBQkxFKHMpKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gc2VsZWN0X2Vycm9yKCk7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWRvIHsKLQkJdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKLQkJbiA9IC0xOwotCQlpZiAodGltZW91dCkKLQkJCWJyZWFrOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBkbyB7CisgICAgICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7CisgICAgICAgIG4gPSAtMTsKKyAgICAgICAgaWYgKHRpbWVvdXQpCisgICAgICAgICAgICBicmVhazsKICNpZmRlZiBfX1ZNUwotCQluID0gc2VuZHNlZ21lbnRlZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOworICAgICAgICBuID0gc2VuZHNlZ21lbnRlZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOwogI2Vsc2UKLQkJbiA9IHNlbmQocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzKTsKKyAgICAgICAgbiA9IHNlbmQocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzKTsKICNlbmRpZgotCQlpZiAobiA8IDApIHsKKyAgICAgICAgaWYgKG4gPCAwKSB7CiAjaWZkZWYgRUlOVFIKLQkJCS8qIFdlIG11c3QgaGFuZGxlIEVJTlRSIGhlcmUgYXMgdGhlcmUgaXMgbm8gd2F5IGZvcgotCQkJICogdGhlIGNhbGxlciB0byBrbm93IGhvdyBtdWNoIHdhcyBzZW50IG90aGVyd2lzZS4gICovCi0JCQlpZiAoZXJybm8gPT0gRUlOVFIpIHsKLQkJCQkvKiBSdW4gc2lnbmFsIGhhbmRsZXJzLiAgSWYgYW4gZXhjZXB0aW9uIHdhcwotCQkJCSAqIHJhaXNlZCwgYWJvcnQgYW5kIGxlYXZlIHRoaXMgc29ja2V0IGluCi0JCQkJICogYW4gdW5rbm93biBzdGF0ZS4gKi8KLQkJCQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpCi0JCQkJCXJldHVybiBOVUxMOwotCQkJCWNvbnRpbnVlOwotCQkJfQorICAgICAgICAgICAgLyogV2UgbXVzdCBoYW5kbGUgRUlOVFIgaGVyZSBhcyB0aGVyZSBpcyBubyB3YXkgZm9yCisgICAgICAgICAgICAgKiB0aGUgY2FsbGVyIHRvIGtub3cgaG93IG11Y2ggd2FzIHNlbnQgb3RoZXJ3aXNlLiAgKi8KKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgICAgICAgICAgIC8qIFJ1biBzaWduYWwgaGFuZGxlcnMuICBJZiBhbiBleGNlcHRpb24gd2FzCisgICAgICAgICAgICAgICAgICogcmFpc2VkLCBhYm9ydCBhbmQgbGVhdmUgdGhpcyBzb2NrZXQgaW4KKyAgICAgICAgICAgICAgICAgKiBhbiB1bmtub3duIHN0YXRlLiAqLworICAgICAgICAgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCWJyZWFrOwotCQl9Ci0JCWJ1ZiArPSBuOwotCQlsZW4gLT0gbjsKLQl9IHdoaWxlIChsZW4gPiAwKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmICs9IG47CisgICAgICAgIGxlbiAtPSBuOworICAgIH0gd2hpbGUgKGxlbiA+IDApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAKLQlpZiAodGltZW91dCA9PSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG4gPCAwKQotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgaWYgKHRpbWVvdXQgPT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChuIDwgMCkKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNlbmRhbGxfZG9jLApAQCAtMjc5OSw0NyArMjc5OSw0NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfc2VuZHRvKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7Ci0JUHlPYmplY3QgKmFkZHJvOwotCWNoYXIgKmJ1ZjsKLQlQeV9zc2l6ZV90IGxlbjsKLQlzb2NrX2FkZHJfdCBhZGRyYnVmOwotCWludCBhZGRybGVuLCBuID0gLTEsIGZsYWdzLCB0aW1lb3V0OworICAgIFB5X2J1ZmZlciBwYnVmOworICAgIFB5T2JqZWN0ICphZGRybzsKKyAgICBjaGFyICpidWY7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgc29ja19hZGRyX3QgYWRkcmJ1ZjsKKyAgICBpbnQgYWRkcmxlbiwgbiA9IC0xLCBmbGFncywgdGltZW91dDsKIAotCWZsYWdzID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqTzpzZW5kdG8iLCAmcGJ1ZiwgJmFkZHJvKSkgewotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqaU86c2VuZHRvIiwKLQkJCQkgICAgICAmcGJ1ZiwgJmZsYWdzLCAmYWRkcm8pKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJ1ZiA9IHBidWYuYnVmOwotCWxlbiA9IHBidWYubGVuOworICAgIGZsYWdzID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqTzpzZW5kdG8iLCAmcGJ1ZiwgJmFkZHJvKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqaU86c2VuZHRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZmxhZ3MsICZhZGRybykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYnVmID0gcGJ1Zi5idWY7CisgICAgbGVuID0gcGJ1Zi5sZW47CiAKLQlpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JCXJldHVybiBzZWxlY3RfZXJyb3IoKTsKLQl9CisgICAgaWYgKCFJU19TRUxFQ1RBQkxFKHMpKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gc2VsZWN0X2Vycm9yKCk7CisgICAgfQogCi0JaWYgKCFnZXRzb2NrYWRkcmFyZyhzLCBhZGRybywgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFnZXRzb2NrYWRkcmFyZyhzLCBhZGRybywgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKLQlpZiAoIXRpbWVvdXQpCi0JCW4gPSBzZW5kdG8ocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICB0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDEpOworICAgIGlmICghdGltZW91dCkKKyAgICAgICAgbiA9IHNlbmR0byhzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQlpZiAodGltZW91dCA9PSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG4gPCAwKQotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKW4pOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgIGlmICh0aW1lb3V0ID09IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbik7CiB9CiAKIFB5RG9jX1NUUlZBUihzZW5kdG9fZG9jLApAQCAtMjg1NCwxOSArMjg1NCwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfc2h1dGRvd24oUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJnKQogewotCWludCBob3c7Ci0JaW50IHJlczsKKyAgICBpbnQgaG93OworICAgIGludCByZXM7CiAKLQlob3cgPSBQeUludF9Bc0xvbmcoYXJnKTsKLQlpZiAoaG93ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSBzaHV0ZG93bihzLT5zb2NrX2ZkLCBob3cpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaG93ID0gUHlJbnRfQXNMb25nKGFyZyk7CisgICAgaWYgKGhvdyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gc2h1dGRvd24ocy0+c29ja19mZCwgaG93KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2h1dGRvd25fZG9jLApAQCAtMjg3OSwzNyArMjg3OSwzNyBAQAogc3RhdGljIFB5T2JqZWN0Kgogc29ja19pb2N0bChQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmcpCiB7Ci0JdW5zaWduZWQgbG9uZyBjbWQgPSBTSU9fUkNWQUxMOwotCVB5T2JqZWN0ICphcmdPOwotCURXT1JEIHJlY3Y7CisgICAgdW5zaWduZWQgbG9uZyBjbWQgPSBTSU9fUkNWQUxMOworICAgIFB5T2JqZWN0ICphcmdPOworICAgIERXT1JEIHJlY3Y7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJnLCAia086aW9jdGwiLCAmY21kLCAmYXJnTykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmcsICJrTzppb2N0bCIsICZjbWQsICZhcmdPKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU0lPX1JDVkFMTDogewotCQl1bnNpZ25lZCBpbnQgb3B0aW9uID0gUkNWQUxMX09OOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJnLCAia0k6aW9jdGwiLCAmY21kLCAmb3B0aW9uKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoV1NBSW9jdGwocy0+c29ja19mZCwgY21kLCAmb3B0aW9uLCBzaXplb2Yob3B0aW9uKSwgCi0JCQkJIE5VTEwsIDAsICZyZWN2LCBOVUxMLCBOVUxMKSA9PSBTT0NLRVRfRVJST1IpIHsKLQkJCXJldHVybiBzZXRfZXJyb3IoKTsKLQkJfQotCQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcocmVjdik7IH0KLQljYXNlIFNJT19LRUVQQUxJVkVfVkFMUzogewotCQlzdHJ1Y3QgdGNwX2tlZXBhbGl2ZSBrYTsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZywgImsoa2trKTppb2N0bCIsICZjbWQsCi0JCQkJJmthLm9ub2ZmLCAma2Eua2VlcGFsaXZldGltZSwgJmthLmtlZXBhbGl2ZWludGVydmFsKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoV1NBSW9jdGwocy0+c29ja19mZCwgY21kLCAma2EsIHNpemVvZihrYSksIAotCQkJCSBOVUxMLCAwLCAmcmVjdiwgTlVMTCwgTlVMTCkgPT0gU09DS0VUX0VSUk9SKSB7Ci0JCQlyZXR1cm4gc2V0X2Vycm9yKCk7Ci0JCX0KLQkJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHJlY3YpOyB9Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGlvY3RsIGNvbW1hbmQgJWQiLCBjbWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIFNJT19SQ1ZBTEw6IHsKKyAgICAgICAgdW5zaWduZWQgaW50IG9wdGlvbiA9IFJDVkFMTF9PTjsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZywgImtJOmlvY3RsIiwgJmNtZCwgJm9wdGlvbikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFdTQUlvY3RsKHMtPnNvY2tfZmQsIGNtZCwgJm9wdGlvbiwgc2l6ZW9mKG9wdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgJnJlY3YsIE5VTEwsIE5VTEwpID09IFNPQ0tFVF9FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHNldF9lcnJvcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhyZWN2KTsgfQorICAgIGNhc2UgU0lPX0tFRVBBTElWRV9WQUxTOiB7CisgICAgICAgIHN0cnVjdCB0Y3Bfa2VlcGFsaXZlIGthOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJnLCAiayhra2spOmlvY3RsIiwgJmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZrYS5vbm9mZiwgJmthLmtlZXBhbGl2ZXRpbWUsICZrYS5rZWVwYWxpdmVpbnRlcnZhbCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFdTQUlvY3RsKHMtPnNvY2tfZmQsIGNtZCwgJmthLCBzaXplb2Yoa2EpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsICZyZWN2LCBOVUxMLCBOVUxMKSA9PSBTT0NLRVRfRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRfZXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcocmVjdik7IH0KKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgaW9jdGwgY29tbWFuZCAlZCIsIGNtZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIFB5RG9jX1NUUlZBUihzb2NrX2lvY3RsX2RvYywKICJpb2N0bChjbWQsIG9wdGlvbikgLT4gbG9uZ1xuXApAQCAtMjkyMyw2OSArMjkyMyw2OSBAQAogLyogTGlzdCBvZiBtZXRob2RzIGZvciBzb2NrZXQgb2JqZWN0cyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgc29ja19tZXRob2RzW10gPSB7Ci0JeyJhY2NlcHQiLAkgIChQeUNGdW5jdGlvbilzb2NrX2FjY2VwdCwgTUVUSF9OT0FSR1MsCi0JCQkgIGFjY2VwdF9kb2N9LAotCXsiYmluZCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfYmluZCwgTUVUSF9PLAotCQkJICBiaW5kX2RvY30sCi0JeyJjbG9zZSIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfY2xvc2UsIE1FVEhfTk9BUkdTLAotCQkJICBjbG9zZV9kb2N9LAotCXsiY29ubmVjdCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfY29ubmVjdCwgTUVUSF9PLAotCQkJICBjb25uZWN0X2RvY30sCi0JeyJjb25uZWN0X2V4IiwJICAoUHlDRnVuY3Rpb24pc29ja19jb25uZWN0X2V4LCBNRVRIX08sCi0JCQkgIGNvbm5lY3RfZXhfZG9jfSwKKyAgICB7ImFjY2VwdCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfYWNjZXB0LCBNRVRIX05PQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRfZG9jfSwKKyAgICB7ImJpbmQiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfYmluZCwgTUVUSF9PLAorICAgICAgICAgICAgICAgICAgICAgIGJpbmRfZG9jfSwKKyAgICB7ImNsb3NlIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfY2xvc2UsIE1FVEhfTk9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX2RvY30sCisgICAgeyJjb25uZWN0IiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2Nvbm5lY3QsIE1FVEhfTywKKyAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X2RvY30sCisgICAgeyJjb25uZWN0X2V4IiwgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2Nvbm5lY3RfZXgsIE1FVEhfTywKKyAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X2V4X2RvY30sCiAjaWZuZGVmIE5PX0RVUAotCXsiZHVwIiwJCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfZHVwLCBNRVRIX05PQVJHUywKLQkJCSAgZHVwX2RvY30sCisgICAgeyJkdXAiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2R1cCwgTUVUSF9OT0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgZHVwX2RvY30sCiAjZW5kaWYKLQl7ImZpbGVubyIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfZmlsZW5vLCBNRVRIX05PQVJHUywKLQkJCSAgZmlsZW5vX2RvY30sCisgICAgeyJmaWxlbm8iLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2ZpbGVubywgTUVUSF9OT0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5vX2RvY30sCiAjaWZkZWYgSEFWRV9HRVRQRUVSTkFNRQotCXsiZ2V0cGVlcm5hbWUiLAkgIChQeUNGdW5jdGlvbilzb2NrX2dldHBlZXJuYW1lLAotCQkJICBNRVRIX05PQVJHUywgZ2V0cGVlcm5hbWVfZG9jfSwKKyAgICB7ImdldHBlZXJuYW1lIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0cGVlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIGdldHBlZXJuYW1lX2RvY30sCiAjZW5kaWYKLQl7ImdldHNvY2tuYW1lIiwJICAoUHlDRnVuY3Rpb24pc29ja19nZXRzb2NrbmFtZSwKLQkJCSAgTUVUSF9OT0FSR1MsIGdldHNvY2tuYW1lX2RvY30sCi0JeyJnZXRzb2Nrb3B0IiwJICAoUHlDRnVuY3Rpb24pc29ja19nZXRzb2Nrb3B0LCBNRVRIX1ZBUkFSR1MsCi0JCQkgIGdldHNvY2tvcHRfZG9jfSwKKyAgICB7ImdldHNvY2tuYW1lIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0c29ja25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIGdldHNvY2tuYW1lX2RvY30sCisgICAgeyJnZXRzb2Nrb3B0IiwgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2dldHNvY2tvcHQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBnZXRzb2Nrb3B0X2RvY30sCiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKSAmJiBkZWZpbmVkKFNJT19SQ1ZBTEwpCi0JeyJpb2N0bCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfaW9jdGwsIE1FVEhfVkFSQVJHUywKLQkJCSAgc29ja19pb2N0bF9kb2N9LAorICAgIHsiaW9jdGwiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19pb2N0bCwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIHNvY2tfaW9jdGxfZG9jfSwKICNlbmRpZgotCXsibGlzdGVuIiwJICAoUHlDRnVuY3Rpb24pc29ja19saXN0ZW4sIE1FVEhfTywKLQkJCSAgbGlzdGVuX2RvY30sCisgICAgeyJsaXN0ZW4iLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2xpc3RlbiwgTUVUSF9PLAorICAgICAgICAgICAgICAgICAgICAgIGxpc3Rlbl9kb2N9LAogI2lmbmRlZiBOT19EVVAKLQl7Im1ha2VmaWxlIiwJICAoUHlDRnVuY3Rpb24pc29ja19tYWtlZmlsZSwgTUVUSF9WQVJBUkdTLAotCQkJICBtYWtlZmlsZV9kb2N9LAorICAgIHsibWFrZWZpbGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19tYWtlZmlsZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIG1ha2VmaWxlX2RvY30sCiAjZW5kaWYKLQl7InJlY3YiLAkgIChQeUNGdW5jdGlvbilzb2NrX3JlY3YsIE1FVEhfVkFSQVJHUywKLQkJCSAgcmVjdl9kb2N9LAotCXsicmVjdl9pbnRvIiwJICAoUHlDRnVuY3Rpb24pc29ja19yZWN2X2ludG8sIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQkgIHJlY3ZfaW50b19kb2N9LAotCXsicmVjdmZyb20iLAkgIChQeUNGdW5jdGlvbilzb2NrX3JlY3Zmcm9tLCBNRVRIX1ZBUkFSR1MsCi0JCQkgIHJlY3Zmcm9tX2RvY30sCi0JeyJyZWN2ZnJvbV9pbnRvIiwgIChQeUNGdW5jdGlvbilzb2NrX3JlY3Zmcm9tX2ludG8sIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQkgIHJlY3Zmcm9tX2ludG9fZG9jfSwKLQl7InNlbmQiLAkgIChQeUNGdW5jdGlvbilzb2NrX3NlbmQsIE1FVEhfVkFSQVJHUywKLQkJCSAgc2VuZF9kb2N9LAotCXsic2VuZGFsbCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZGFsbCwgTUVUSF9WQVJBUkdTLAotCQkJICBzZW5kYWxsX2RvY30sCi0JeyJzZW5kdG8iLAkgIChQeUNGdW5jdGlvbilzb2NrX3NlbmR0bywgTUVUSF9WQVJBUkdTLAotCQkJICBzZW5kdG9fZG9jfSwKLQl7InNldGJsb2NraW5nIiwJICAoUHlDRnVuY3Rpb24pc29ja19zZXRibG9ja2luZywgTUVUSF9PLAotCQkJICBzZXRibG9ja2luZ19kb2N9LAotCXsic2V0dGltZW91dCIsICAgIChQeUNGdW5jdGlvbilzb2NrX3NldHRpbWVvdXQsIE1FVEhfTywKLQkJCSAgc2V0dGltZW91dF9kb2N9LAotCXsiZ2V0dGltZW91dCIsICAgIChQeUNGdW5jdGlvbilzb2NrX2dldHRpbWVvdXQsIE1FVEhfTk9BUkdTLAotCQkJICBnZXR0aW1lb3V0X2RvY30sCi0JeyJzZXRzb2Nrb3B0IiwJICAoUHlDRnVuY3Rpb24pc29ja19zZXRzb2Nrb3B0LCBNRVRIX1ZBUkFSR1MsCi0JCQkgIHNldHNvY2tvcHRfZG9jfSwKLQl7InNodXRkb3duIiwJICAoUHlDRnVuY3Rpb24pc29ja19zaHV0ZG93biwgTUVUSF9PLAotCQkJICBzaHV0ZG93bl9kb2N9LAorICAgIHsicmVjdiIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19yZWN2LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgcmVjdl9kb2N9LAorICAgIHsicmVjdl9pbnRvIiwgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19yZWN2X2ludG8sIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgcmVjdl9pbnRvX2RvY30sCisgICAgeyJyZWN2ZnJvbSIsICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX3JlY3Zmcm9tLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgcmVjdmZyb21fZG9jfSwKKyAgICB7InJlY3Zmcm9tX2ludG8iLCAgKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdmZyb21faW50bywgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgICAgICAgICAgICAgICAgICByZWN2ZnJvbV9pbnRvX2RvY30sCisgICAgeyJzZW5kIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX3NlbmQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBzZW5kX2RvY30sCisgICAgeyJzZW5kYWxsIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX3NlbmRhbGwsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBzZW5kYWxsX2RvY30sCisgICAgeyJzZW5kdG8iLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX3NlbmR0bywgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIHNlbmR0b19kb2N9LAorICAgIHsic2V0YmxvY2tpbmciLCAgICAgICAoUHlDRnVuY3Rpb24pc29ja19zZXRibG9ja2luZywgTUVUSF9PLAorICAgICAgICAgICAgICAgICAgICAgIHNldGJsb2NraW5nX2RvY30sCisgICAgeyJzZXR0aW1lb3V0IiwgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2V0dGltZW91dCwgTUVUSF9PLAorICAgICAgICAgICAgICAgICAgICAgIHNldHRpbWVvdXRfZG9jfSwKKyAgICB7ImdldHRpbWVvdXQiLCAgICAoUHlDRnVuY3Rpb24pc29ja19nZXR0aW1lb3V0LCBNRVRIX05PQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBnZXR0aW1lb3V0X2RvY30sCisgICAgeyJzZXRzb2Nrb3B0IiwgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX3NldHNvY2tvcHQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBzZXRzb2Nrb3B0X2RvY30sCisgICAgeyJzaHV0ZG93biIsICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX3NodXRkb3duLCBNRVRIX08sCisgICAgICAgICAgICAgICAgICAgICAgc2h1dGRvd25fZG9jfSwKICNpZmRlZiBSSVNDT1MKLQl7InNsZWVwdGFza3ciLAkgIChQeUNGdW5jdGlvbilzb2NrX3NsZWVwdGFza3csIE1FVEhfTywKLQkgCQkgIHNsZWVwdGFza3dfZG9jfSwKKyAgICB7InNsZWVwdGFza3ciLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2xlZXB0YXNrdywgTUVUSF9PLAorICAgICAgICAgICAgICAgICAgICAgIHNsZWVwdGFza3dfZG9jfSwKICNlbmRpZgotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIFNvY2tPYmplY3QgbWVtYmVycyAqLwpAQCAtMzAwMywzNCArMzAwMywzNCBAQAogc3RhdGljIHZvaWQKIHNvY2tfZGVhbGxvYyhQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7Ci0JaWYgKHMtPnNvY2tfZmQgIT0gLTEpCi0JCSh2b2lkKSBTT0NLRVRDTE9TRShzLT5zb2NrX2ZkKTsKLQlQeV9UWVBFKHMpLT50cF9mcmVlKChQeU9iamVjdCAqKXMpOworICAgIGlmIChzLT5zb2NrX2ZkICE9IC0xKQorICAgICAgICAodm9pZCkgU09DS0VUQ0xPU0Uocy0+c29ja19mZCk7CisgICAgUHlfVFlQRShzKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19yZXByKFB5U29ja2V0U29ja09iamVjdCAqcykKIHsKLQljaGFyIGJ1Zls1MTJdOworICAgIGNoYXIgYnVmWzUxMl07CiAjaWYgU0laRU9GX1NPQ0tFVF9UID4gU0laRU9GX0xPTkcKLQlpZiAocy0+c29ja19mZCA+IExPTkdfTUFYKSB7Ci0JCS8qIHRoaXMgY2FuIG9jY3VyIG9uIFdpbjY0LCBhbmQgYWN0dWFsbHkgdGhlcmUgaXMgYSBzcGVjaWFsCi0JCSAgIHVnbHkgcHJpbnRmIGZvcm1hdHRlciBmb3IgZGVjaW1hbCBwb2ludGVyIGxlbmd0aCBpbnRlZ2VyCi0JCSAgIHByaW50aW5nLCBvbmx5IGJvdGhlciBpZiBuZWNlc3NhcnkqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibm8gcHJpbnRmIGZvcm1hdHRlciB0byBkaXNwbGF5ICIKLQkJCQkidGhlIHNvY2tldCBkZXNjcmlwdG9yIGluIGRlY2ltYWwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzLT5zb2NrX2ZkID4gTE9OR19NQVgpIHsKKyAgICAgICAgLyogdGhpcyBjYW4gb2NjdXIgb24gV2luNjQsIGFuZCBhY3R1YWxseSB0aGVyZSBpcyBhIHNwZWNpYWwKKyAgICAgICAgICAgdWdseSBwcmludGYgZm9ybWF0dGVyIGZvciBkZWNpbWFsIHBvaW50ZXIgbGVuZ3RoIGludGVnZXIKKyAgICAgICAgICAgcHJpbnRpbmcsIG9ubHkgYm90aGVyIGlmIG5lY2Vzc2FyeSovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vIHByaW50ZiBmb3JtYXR0ZXIgdG8gZGlzcGxheSAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHNvY2tldCBkZXNjcmlwdG9yIGluIGRlY2ltYWwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JUHlPU19zbnByaW50ZigKLQkJYnVmLCBzaXplb2YoYnVmKSwKLQkJIjxzb2NrZXQgb2JqZWN0LCBmZD0lbGQsIGZhbWlseT0lZCwgdHlwZT0lZCwgcHJvdG9jb2w9JWQ+IiwKLQkJKGxvbmcpcy0+c29ja19mZCwgcy0+c29ja19mYW1pbHksCi0JCXMtPnNvY2tfdHlwZSwKLQkJcy0+c29ja19wcm90byk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBQeU9TX3NucHJpbnRmKAorICAgICAgICBidWYsIHNpemVvZihidWYpLAorICAgICAgICAiPHNvY2tldCBvYmplY3QsIGZkPSVsZCwgZmFtaWx5PSVkLCB0eXBlPSVkLCBwcm90b2NvbD0lZD4iLAorICAgICAgICAobG9uZylzLT5zb2NrX2ZkLCBzLT5zb2NrX2ZhbWlseSwKKyAgICAgICAgcy0+c29ja190eXBlLAorICAgICAgICBzLT5zb2NrX3Byb3RvKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiAKQEAgLTMwMzksMTUgKzMwMzksMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqbmV3OworICAgIFB5T2JqZWN0ICpuZXc7CiAKLQluZXcgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobmV3ICE9IE5VTEwpIHsKLQkJKChQeVNvY2tldFNvY2tPYmplY3QgKiluZXcpLT5zb2NrX2ZkID0gLTE7Ci0JCSgoUHlTb2NrZXRTb2NrT2JqZWN0ICopbmV3KS0+c29ja190aW1lb3V0ID0gLTEuMDsKLQkJKChQeVNvY2tldFNvY2tPYmplY3QgKiluZXcpLT5lcnJvcmhhbmRsZXIgPSAmc2V0X2Vycm9yOwotCX0KLQlyZXR1cm4gbmV3OworICAgIG5ldyA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChuZXcgIT0gTlVMTCkgeworICAgICAgICAoKFB5U29ja2V0U29ja09iamVjdCAqKW5ldyktPnNvY2tfZmQgPSAtMTsKKyAgICAgICAgKChQeVNvY2tldFNvY2tPYmplY3QgKiluZXcpLT5zb2NrX3RpbWVvdXQgPSAtMS4wOworICAgICAgICAoKFB5U29ja2V0U29ja09iamVjdCAqKW5ldyktPmVycm9yaGFuZGxlciA9ICZzZXRfZXJyb3I7CisgICAgfQorICAgIHJldHVybiBuZXc7CiB9CiAKIApAQCAtMzA1NywzMiArMzA1NywzMiBAQAogc3RhdGljIGludAogc29ja19pbml0b2JqKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlTb2NrZXRTb2NrT2JqZWN0ICpzID0gKFB5U29ja2V0U29ja09iamVjdCAqKXNlbGY7Ci0JU09DS0VUX1QgZmQ7Ci0JaW50IGZhbWlseSA9IEFGX0lORVQsIHR5cGUgPSBTT0NLX1NUUkVBTSwgcHJvdG8gPSAwOwotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJmYW1pbHkiLCAidHlwZSIsICJwcm90byIsIDB9OworICAgIFB5U29ja2V0U29ja09iamVjdCAqcyA9IChQeVNvY2tldFNvY2tPYmplY3QgKilzZWxmOworICAgIFNPQ0tFVF9UIGZkOworICAgIGludCBmYW1pbHkgPSBBRl9JTkVULCB0eXBlID0gU09DS19TVFJFQU0sIHByb3RvID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZmFtaWx5IiwgInR5cGUiLCAicHJvdG8iLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsCi0JCQkJCSAifGlpaTpzb2NrZXQiLCBrZXl3b3JkcywKLQkJCQkJICZmYW1pbHksICZ0eXBlLCAmcHJvdG8pKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifGlpaTpzb2NrZXQiLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFtaWx5LCAmdHlwZSwgJnByb3RvKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZkID0gc29ja2V0KGZhbWlseSwgdHlwZSwgcHJvdG8pOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZkID0gc29ja2V0KGZhbWlseSwgdHlwZSwgcHJvdG8pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKICNpZmRlZiBNU19XSU5ET1dTCi0JaWYgKGZkID09IElOVkFMSURfU09DS0VUKQorICAgIGlmIChmZCA9PSBJTlZBTElEX1NPQ0tFVCkKICNlbHNlCi0JaWYgKGZkIDwgMCkKKyAgICBpZiAoZmQgPCAwKQogI2VuZGlmCi0JewotCQlzZXRfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpbml0X3NvY2tvYmplY3QocywgZmQsIGZhbWlseSwgdHlwZSwgcHJvdG8pOworICAgIHsKKyAgICAgICAgc2V0X2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW5pdF9zb2Nrb2JqZWN0KHMsIGZkLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogCiB9CiAKQEAgLTMwOTAsNDUgKzMwOTAsNDUgQEAKIC8qIFR5cGUgb2JqZWN0IGZvciBzb2NrZXQgb2JqZWN0cy4gKi8KIAogc3RhdGljIFB5VHlwZU9iamVjdCBzb2NrX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKDAsIDApCS8qIE11c3QgZmlsbCBpbiB0eXBlIHZhbHVlIGxhdGVyICovCi0JIl9zb2NrZXQuc29ja2V0IiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5U29ja2V0U29ja09iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkoZGVzdHJ1Y3Rvcilzb2NrX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKXNvY2tfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0Jc29ja19kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0Jc29ja19tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0Jc29ja19tZW1iZXJsaXN0LAkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQlzb2NrX2luaXRvYmosCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0Jc29ja19uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0RlbCwJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKSAgICAgICAgIC8qIE11c3QgZmlsbCBpbiB0eXBlIHZhbHVlIGxhdGVyICovCisgICAgIl9zb2NrZXQuc29ja2V0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5U29ja2V0U29ja09iamVjdCksICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgKGRlc3RydWN0b3Ipc29ja19kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylzb2NrX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgc29ja19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHNvY2tfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHNvY2tfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIHNvY2tfaW5pdG9iaiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBzb2NrX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC0zMTM4LDE1ICszMTM4LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2dldGhvc3RuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCWNoYXIgYnVmWzEwMjRdOwotCWludCByZXM7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlcyA9IGdldGhvc3RuYW1lKGJ1ZiwgKGludCkgc2l6ZW9mIGJ1ZiAtIDEpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBzZXRfZXJyb3IoKTsKLQlidWZbc2l6ZW9mIGJ1ZiAtIDFdID0gJ1wwJzsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMjRdOworICAgIGludCByZXM7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlcyA9IGdldGhvc3RuYW1lKGJ1ZiwgKGludCkgc2l6ZW9mIGJ1ZiAtIDEpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBzZXRfZXJyb3IoKTsKKyAgICBidWZbc2l6ZW9mIGJ1ZiAtIDFdID0gJ1wwJzsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0aG9zdG5hbWVfZG9jLApAQCAtMzE2MSwxNCArMzE2MSwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9nZXRob3N0YnluYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCXNvY2tfYWRkcl90IGFkZHJidWY7CisgICAgY2hhciAqbmFtZTsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGhvc3RieW5hbWUiLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChzZXRpcGFkZHIobmFtZSwgU0FTMlNBKCZhZGRyYnVmKSwgIHNpemVvZihhZGRyYnVmKSwgQUZfSU5FVCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbWFrZWlwYWRkcihTQVMyU0EoJmFkZHJidWYpLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGhvc3RieW5hbWUiLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzZXRpcGFkZHIobmFtZSwgU0FTMlNBKCZhZGRyYnVmKSwgIHNpemVvZihhZGRyYnVmKSwgQUZfSU5FVCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbWFrZWlwYWRkcihTQVMyU0EoJmFkZHJidWYpLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRob3N0YnluYW1lX2RvYywKQEAgLTMxODIsMTMwICszMTgyLDEzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGhvc3RfY29tbW9uKHN0cnVjdCBob3N0ZW50ICpoLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhbGVuLCBpbnQgYWYpCiB7Ci0JY2hhciAqKnBjaDsKLQlQeU9iamVjdCAqcnRuX3R1cGxlID0gKFB5T2JqZWN0ICopTlVMTDsKLQlQeU9iamVjdCAqbmFtZV9saXN0ID0gKFB5T2JqZWN0ICopTlVMTDsKLQlQeU9iamVjdCAqYWRkcl9saXN0ID0gKFB5T2JqZWN0ICopTlVMTDsKLQlQeU9iamVjdCAqdG1wOworICAgIGNoYXIgKipwY2g7CisgICAgUHlPYmplY3QgKnJ0bl90dXBsZSA9IChQeU9iamVjdCAqKU5VTEw7CisgICAgUHlPYmplY3QgKm5hbWVfbGlzdCA9IChQeU9iamVjdCAqKU5VTEw7CisgICAgUHlPYmplY3QgKmFkZHJfbGlzdCA9IChQeU9iamVjdCAqKU5VTEw7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCWlmIChoID09IE5VTEwpIHsKLQkJLyogTGV0J3MgZ2V0IHJlYWwgZXJyb3IgbWVzc2FnZSB0byByZXR1cm4gKi8KKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIC8qIExldCdzIGdldCByZWFsIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuICovCiAjaWZuZGVmIFJJU0NPUwotCQlzZXRfaGVycm9yKGhfZXJybm8pOworICAgICAgICBzZXRfaGVycm9yKGhfZXJybm8pOwogI2Vsc2UKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImhvc3Qgbm90IGZvdW5kIik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJob3N0IG5vdCBmb3VuZCIpOwogI2VuZGlmCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGgtPmhfYWRkcnR5cGUgIT0gYWYpIHsKLQkJLyogTGV0J3MgZ2V0IHJlYWwgZXJyb3IgbWVzc2FnZSB0byByZXR1cm4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkoY2hhciAqKXN0cmVycm9yKEVBRk5PU1VQUE9SVCkpOworICAgIGlmIChoLT5oX2FkZHJ0eXBlICE9IGFmKSB7CisgICAgICAgIC8qIExldCdzIGdldCByZWFsIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXN0cmVycm9yKEVBRk5PU1VQUE9SVCkpOwogCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3dpdGNoIChhZikgeworICAgIHN3aXRjaCAoYWYpIHsKIAotCWNhc2UgQUZfSU5FVDoKLQkJaWYgKGFsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkKLQkJCXJldHVybiBOVUxMOwotCQlicmVhazsKKyAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgIGlmIChhbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYnJlYWs7CiAKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JCWlmIChhbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWJyZWFrOworICAgIGNhc2UgQUZfSU5FVDY6CisgICAgICAgIGlmIChhbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJyZWFrOwogI2VuZGlmCiAKLQl9CisgICAgfQogCi0JaWYgKChuYW1lX2xpc3QgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQotCQlnb3RvIGVycjsKKyAgICBpZiAoKG5hbWVfbGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyOwogCi0JaWYgKChhZGRyX2xpc3QgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQotCQlnb3RvIGVycjsKKyAgICBpZiAoKGFkZHJfbGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyOwogCi0JLyogU0YgIzE1MTEzMTc6IGhfYWxpYXNlcyBjYW4gYmUgTlVMTCAqLwotCWlmIChoLT5oX2FsaWFzZXMpIHsKLQkJZm9yIChwY2ggPSBoLT5oX2FsaWFzZXM7ICpwY2ggIT0gTlVMTDsgcGNoKyspIHsKLQkJCWludCBzdGF0dXM7Ci0JCQl0bXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCpwY2gpOwotCQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJCWdvdG8gZXJyOworICAgIC8qIFNGICMxNTExMzE3OiBoX2FsaWFzZXMgY2FuIGJlIE5VTEwgKi8KKyAgICBpZiAoaC0+aF9hbGlhc2VzKSB7CisgICAgICAgIGZvciAocGNoID0gaC0+aF9hbGlhc2VzOyAqcGNoICE9IE5VTEw7IHBjaCsrKSB7CisgICAgICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICAgICAgdG1wID0gUHlTdHJpbmdfRnJvbVN0cmluZygqcGNoKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKIAotCQkJc3RhdHVzID0gUHlMaXN0X0FwcGVuZChuYW1lX2xpc3QsIHRtcCk7Ci0JCQlQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFB5TGlzdF9BcHBlbmQobmFtZV9saXN0LCB0bXApOworICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CiAKLQkJCWlmIChzdGF0dXMpCi0JCQkJZ290byBlcnI7Ci0JCX0KLQl9CisgICAgICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgfQogCi0JZm9yIChwY2ggPSBoLT5oX2FkZHJfbGlzdDsgKnBjaCAhPSBOVUxMOyBwY2grKykgewotCQlpbnQgc3RhdHVzOworICAgIGZvciAocGNoID0gaC0+aF9hZGRyX2xpc3Q7ICpwY2ggIT0gTlVMTDsgcGNoKyspIHsKKyAgICAgICAgaW50IHN0YXR1czsKIAotCQlzd2l0Y2ggKGFmKSB7CisgICAgICAgIHN3aXRjaCAoYWYpIHsKIAotCQljYXNlIEFGX0lORVQ6Ci0JCSAgICB7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwotCQkJbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKLQkJCXNpbi5zaW5fZmFtaWx5ID0gYWY7CisgICAgICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisgICAgICAgICAgICBtZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworICAgICAgICAgICAgc2luLnNpbl9mYW1pbHkgPSBhZjsKICNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCQkJc2luLnNpbl9sZW4gPSBzaXplb2Yoc2luKTsKKyAgICAgICAgICAgIHNpbi5zaW5fbGVuID0gc2l6ZW9mKHNpbik7CiAjZW5kaWYKLQkJCW1lbWNweSgmc2luLnNpbl9hZGRyLCAqcGNoLCBzaXplb2Yoc2luLnNpbl9hZGRyKSk7Ci0JCQl0bXAgPSBtYWtlaXBhZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Yoc2luKSk7CisgICAgICAgICAgICBtZW1jcHkoJnNpbi5zaW5fYWRkciwgKnBjaCwgc2l6ZW9mKHNpbi5zaW5fYWRkcikpOworICAgICAgICAgICAgdG1wID0gbWFrZWlwYWRkcigoc3RydWN0IHNvY2thZGRyICopJnNpbiwgc2l6ZW9mKHNpbikpOwogCi0JCQlpZiAocGNoID09IGgtPmhfYWRkcl9saXN0ICYmIGFsZW4gPj0gc2l6ZW9mKHNpbikpCi0JCQkJbWVtY3B5KChjaGFyICopIGFkZHIsICZzaW4sIHNpemVvZihzaW4pKTsKLQkJCWJyZWFrOwotCQkgICAgfQorICAgICAgICAgICAgaWYgKHBjaCA9PSBoLT5oX2FkZHJfbGlzdCAmJiBhbGVuID49IHNpemVvZihzaW4pKQorICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBhZGRyLCAmc2luLCBzaXplb2Yoc2luKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCWNhc2UgQUZfSU5FVDY6Ci0JCSAgICB7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjY7Ci0JCQltZW1zZXQoJnNpbjYsIDAsIHNpemVvZihzaW42KSk7Ci0JCQlzaW42LnNpbjZfZmFtaWx5ID0gYWY7CisgICAgICAgIGNhc2UgQUZfSU5FVDY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjY7CisgICAgICAgICAgICBtZW1zZXQoJnNpbjYsIDAsIHNpemVvZihzaW42KSk7CisgICAgICAgICAgICBzaW42LnNpbjZfZmFtaWx5ID0gYWY7CiAjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQkJCXNpbjYuc2luNl9sZW4gPSBzaXplb2Yoc2luNik7CisgICAgICAgICAgICBzaW42LnNpbjZfbGVuID0gc2l6ZW9mKHNpbjYpOwogI2VuZGlmCi0JCQltZW1jcHkoJnNpbjYuc2luNl9hZGRyLCAqcGNoLCBzaXplb2Yoc2luNi5zaW42X2FkZHIpKTsKLQkJCXRtcCA9IG1ha2VpcGFkZHIoKHN0cnVjdCBzb2NrYWRkciAqKSZzaW42LAotCQkJCXNpemVvZihzaW42KSk7CisgICAgICAgICAgICBtZW1jcHkoJnNpbjYuc2luNl9hZGRyLCAqcGNoLCBzaXplb2Yoc2luNi5zaW42X2FkZHIpKTsKKyAgICAgICAgICAgIHRtcCA9IG1ha2VpcGFkZHIoKHN0cnVjdCBzb2NrYWRkciAqKSZzaW42LAorICAgICAgICAgICAgICAgIHNpemVvZihzaW42KSk7CiAKLQkJCWlmIChwY2ggPT0gaC0+aF9hZGRyX2xpc3QgJiYgYWxlbiA+PSBzaXplb2Yoc2luNikpCi0JCQkJbWVtY3B5KChjaGFyICopIGFkZHIsICZzaW42LCBzaXplb2Yoc2luNikpOwotCQkJYnJlYWs7Ci0JCSAgICB9CisgICAgICAgICAgICBpZiAocGNoID09IGgtPmhfYWRkcl9saXN0ICYmIGFsZW4gPj0gc2l6ZW9mKHNpbjYpKQorICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBhZGRyLCAmc2luNiwgc2l6ZW9mKHNpbjYpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogI2VuZGlmCiAKLQkJZGVmYXVsdDoJLyogY2FuJ3QgaGFwcGVuICovCi0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJCQkidW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qIGNhbid0IGhhcHBlbiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJZ290byBlcnI7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyOwogCi0JCXN0YXR1cyA9IFB5TGlzdF9BcHBlbmQoYWRkcl9saXN0LCB0bXApOwotCQlQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgc3RhdHVzID0gUHlMaXN0X0FwcGVuZChhZGRyX2xpc3QsIHRtcCk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOwogCi0JCWlmIChzdGF0dXMpCi0JCQlnb3RvIGVycjsKLQl9CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CiAKLQlydG5fdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJzT08iLCBoLT5oX25hbWUsIG5hbWVfbGlzdCwgYWRkcl9saXN0KTsKKyAgICBydG5fdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJzT08iLCBoLT5oX25hbWUsIG5hbWVfbGlzdCwgYWRkcl9saXN0KTsKIAogIGVycjoKLQlQeV9YREVDUkVGKG5hbWVfbGlzdCk7Ci0JUHlfWERFQ1JFRihhZGRyX2xpc3QpOwotCXJldHVybiBydG5fdHVwbGU7CisgICAgUHlfWERFQ1JFRihuYW1lX2xpc3QpOworICAgIFB5X1hERUNSRUYoYWRkcl9saXN0KTsKKyAgICByZXR1cm4gcnRuX3R1cGxlOwogfQogCiAKQEAgLTMzMTUsNjMgKzMzMTUsNjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfZ2V0aG9zdGJ5bmFtZV9leChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3QgaG9zdGVudCAqaDsKKyAgICBjaGFyICpuYW1lOworICAgIHN0cnVjdCBob3N0ZW50ICpoOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKICNlbHNlCi0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwogI2VuZGlmCi0Jc3RydWN0IHNvY2thZGRyICpzYTsKLQlQeU9iamVjdCAqcmV0OworICAgIHN0cnVjdCBzb2NrYWRkciAqc2E7CisgICAgUHlPYmplY3QgKnJldDsKICNpZmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUgotCXN0cnVjdCBob3N0ZW50IGhwX2FsbG9jYXRlZDsKKyAgICBzdHJ1Y3QgaG9zdGVudCBocF9hbGxvY2F0ZWQ7CiAjaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcKLQlzdHJ1Y3QgaG9zdGVudF9kYXRhIGRhdGE7CisgICAgc3RydWN0IGhvc3RlbnRfZGF0YSBkYXRhOwogI2Vsc2UKLQljaGFyIGJ1ZlsxNjM4NF07Ci0JaW50IGJ1Zl9sZW4gPSAoc2l6ZW9mIGJ1ZikgLSAxOwotCWludCBlcnJub3A7CisgICAgY2hhciBidWZbMTYzODRdOworICAgIGludCBidWZfbGVuID0gKHNpemVvZiBidWYpIC0gMTsKKyAgICBpbnQgZXJybm9wOwogI2VuZGlmCiAjaWYgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX0FSRykgfHwgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUl82X0FSRykKLQlpbnQgcmVzdWx0OworICAgIGludCByZXN1bHQ7CiAjZW5kaWYKICNlbmRpZiAvKiBIQVZFX0dFVEhPU1RCWU5BTUVfUiAqLwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGhvc3RieW5hbWVfZXgiLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChzZXRpcGFkZHIobmFtZSwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkciksIEFGX0lORVQpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRob3N0YnluYW1lX2V4IiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc2V0aXBhZGRyKG5hbWUsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpLCBBRl9JTkVUKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICNpZmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUgogI2lmICAgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUl82X0FSRykKLQlyZXN1bHQgPSBnZXRob3N0YnluYW1lX3IobmFtZSwgJmhwX2FsbG9jYXRlZCwgYnVmLCBidWZfbGVuLAotCQkJCSAmaCwgJmVycm5vcCk7CisgICAgcmVzdWx0ID0gZ2V0aG9zdGJ5bmFtZV9yKG5hbWUsICZocF9hbGxvY2F0ZWQsIGJ1ZiwgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsICZlcnJub3ApOwogI2VsaWYgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUl81X0FSRykKLQloID0gZ2V0aG9zdGJ5bmFtZV9yKG5hbWUsICZocF9hbGxvY2F0ZWQsIGJ1ZiwgYnVmX2xlbiwgJmVycm5vcCk7CisgICAgaCA9IGdldGhvc3RieW5hbWVfcihuYW1lLCAmaHBfYWxsb2NhdGVkLCBidWYsIGJ1Zl9sZW4sICZlcnJub3ApOwogI2Vsc2UgLyogSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcgKi8KLQltZW1zZXQoKHZvaWQgKikgJmRhdGEsICdcMCcsIHNpemVvZihkYXRhKSk7Ci0JcmVzdWx0ID0gZ2V0aG9zdGJ5bmFtZV9yKG5hbWUsICZocF9hbGxvY2F0ZWQsICZkYXRhKTsKLQloID0gKHJlc3VsdCAhPSAwKSA/IE5VTEwgOiAmaHBfYWxsb2NhdGVkOworICAgIG1lbXNldCgodm9pZCAqKSAmZGF0YSwgJ1wwJywgc2l6ZW9mKGRhdGEpKTsKKyAgICByZXN1bHQgPSBnZXRob3N0YnluYW1lX3IobmFtZSwgJmhwX2FsbG9jYXRlZCwgJmRhdGEpOworICAgIGggPSAocmVzdWx0ICE9IDApID8gTlVMTCA6ICZocF9hbGxvY2F0ZWQ7CiAjZW5kaWYKICNlbHNlIC8qIG5vdCBIQVZFX0dFVEhPU1RCWU5BTUVfUiAqLwogI2lmZGVmIFVTRV9HRVRIT1NUQllOQU1FX0xPQ0sKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2sobmV0ZGJfbG9jaywgMSk7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKG5ldGRiX2xvY2ssIDEpOwogI2VuZGlmCi0JaCA9IGdldGhvc3RieW5hbWUobmFtZSk7CisgICAgaCA9IGdldGhvc3RieW5hbWUobmFtZSk7CiAjZW5kaWYgLyogSEFWRV9HRVRIT1NUQllOQU1FX1IgKi8KLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCS8qIFNvbWUgQyBsaWJyYXJpZXMgd291bGQgcmVxdWlyZSBhZGRyLl9fc3NfZmFtaWx5IGluc3RlYWQgb2YKLQkgICBhZGRyLnNzX2ZhbWlseS4KLQkgICBUaGVyZWZvcmUsIHdlIGNhc3QgdGhlIHNvY2thZGRyX3N0b3JhZ2UgaW50byBzb2NrYWRkciB0bwotCSAgIGFjY2VzcyBzYV9mYW1pbHkuICovCi0Jc2EgPSAoc3RydWN0IHNvY2thZGRyKikmYWRkcjsKLQlyZXQgPSBnZXRob3N0X2NvbW1vbihoLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSwKLQkJCSAgICAgc2EtPnNhX2ZhbWlseSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAvKiBTb21lIEMgbGlicmFyaWVzIHdvdWxkIHJlcXVpcmUgYWRkci5fX3NzX2ZhbWlseSBpbnN0ZWFkIG9mCisgICAgICAgYWRkci5zc19mYW1pbHkuCisgICAgICAgVGhlcmVmb3JlLCB3ZSBjYXN0IHRoZSBzb2NrYWRkcl9zdG9yYWdlIGludG8gc29ja2FkZHIgdG8KKyAgICAgICBhY2Nlc3Mgc2FfZmFtaWx5LiAqLworICAgIHNhID0gKHN0cnVjdCBzb2NrYWRkciopJmFkZHI7CisgICAgcmV0ID0gZ2V0aG9zdF9jb21tb24oaCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2EtPnNhX2ZhbWlseSk7CiAjaWZkZWYgVVNFX0dFVEhPU1RCWU5BTUVfTE9DSwotCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhuZXRkYl9sb2NrKTsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2sobmV0ZGJfbG9jayk7CiAjZW5kaWYKLQlyZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihnaGJuX2V4X2RvYywKQEAgLTMzODgsODMgKzMzODgsODMgQEAKIHNvY2tldF9nZXRob3N0YnlhZGRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICNpZmRlZiBFTkFCTEVfSVBWNgotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKICNlbHNlCi0Jc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CiAjZW5kaWYKLQlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyOwotCWNoYXIgKmlwX251bTsKLQlzdHJ1Y3QgaG9zdGVudCAqaDsKLQlQeU9iamVjdCAqcmV0OworICAgIHN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHI7CisgICAgY2hhciAqaXBfbnVtOworICAgIHN0cnVjdCBob3N0ZW50ICpoOworICAgIFB5T2JqZWN0ICpyZXQ7CiAjaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FX1IKLQlzdHJ1Y3QgaG9zdGVudCBocF9hbGxvY2F0ZWQ7CisgICAgc3RydWN0IGhvc3RlbnQgaHBfYWxsb2NhdGVkOwogI2lmZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHCi0Jc3RydWN0IGhvc3RlbnRfZGF0YSBkYXRhOworICAgIHN0cnVjdCBob3N0ZW50X2RhdGEgZGF0YTsKICNlbHNlCi0JLyogZ2xpYmNzIHVwIHRvIDIuMTAgYXNzdW1lIHRoYXQgdGhlIGJ1ZiBhcmd1bWVudCB0bwotCSAgIGdldGhvc3RieWFkZHJfciBpcyA4LWJ5dGUgYWxpZ25lZCwgd2hpY2ggYXQgbGVhc3QgbGx2bS1nY2MKLQkgICBkb2VzIG5vdCBlbnN1cmUuIFRoZSBhdHRyaWJ1dGUgYmVsb3cgaW5zdHJ1Y3RzIHRoZSBjb21waWxlcgotCSAgIHRvIG1haW50YWluIHRoaXMgYWxpZ25tZW50LiAqLwotCWNoYXIgYnVmWzE2Mzg0XSBQeV9BTElHTkVEKDgpOwotCWludCBidWZfbGVuID0gKHNpemVvZiBidWYpIC0gMTsKLQlpbnQgZXJybm9wOworICAgIC8qIGdsaWJjcyB1cCB0byAyLjEwIGFzc3VtZSB0aGF0IHRoZSBidWYgYXJndW1lbnQgdG8KKyAgICAgICBnZXRob3N0YnlhZGRyX3IgaXMgOC1ieXRlIGFsaWduZWQsIHdoaWNoIGF0IGxlYXN0IGxsdm0tZ2NjCisgICAgICAgZG9lcyBub3QgZW5zdXJlLiBUaGUgYXR0cmlidXRlIGJlbG93IGluc3RydWN0cyB0aGUgY29tcGlsZXIKKyAgICAgICB0byBtYWludGFpbiB0aGlzIGFsaWdubWVudC4gKi8KKyAgICBjaGFyIGJ1ZlsxNjM4NF0gUHlfQUxJR05FRCg4KTsKKyAgICBpbnQgYnVmX2xlbiA9IChzaXplb2YgYnVmKSAtIDE7CisgICAgaW50IGVycm5vcDsKICNlbmRpZgogI2lmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcpIHx8IGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9BUkcpCi0JaW50IHJlc3VsdDsKKyAgICBpbnQgcmVzdWx0OwogI2VuZGlmCiAjZW5kaWYgLyogSEFWRV9HRVRIT1NUQllOQU1FX1IgKi8KLQljaGFyICphcDsKLQlpbnQgYWw7Ci0JaW50IGFmOworICAgIGNoYXIgKmFwOworICAgIGludCBhbDsKKyAgICBpbnQgYWY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0aG9zdGJ5YWRkciIsICZpcF9udW0pKQotCQlyZXR1cm4gTlVMTDsKLQlhZiA9IEFGX1VOU1BFQzsKLQlpZiAoc2V0aXBhZGRyKGlwX251bSwgc2EsIHNpemVvZihhZGRyKSwgYWYpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JYWYgPSBzYS0+c2FfZmFtaWx5OwotCWFwID0gTlVMTDsKLQlzd2l0Y2ggKGFmKSB7Ci0JY2FzZSBBRl9JTkVUOgotCQlhcCA9IChjaGFyICopJigoc3RydWN0IHNvY2thZGRyX2luICopc2EpLT5zaW5fYWRkcjsKLQkJYWwgPSBzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9hZGRyKTsKLQkJYnJlYWs7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGhvc3RieWFkZHIiLCAmaXBfbnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYWYgPSBBRl9VTlNQRUM7CisgICAgaWYgKHNldGlwYWRkcihpcF9udW0sIHNhLCBzaXplb2YoYWRkciksIGFmKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFmID0gc2EtPnNhX2ZhbWlseTsKKyAgICBhcCA9IE5VTEw7CisgICAgc3dpdGNoIChhZikgeworICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgYXAgPSAoY2hhciAqKSYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhKS0+c2luX2FkZHI7CisgICAgICAgIGFsID0gc2l6ZW9mKCgoc3RydWN0IHNvY2thZGRyX2luICopc2EpLT5zaW5fYWRkcik7CisgICAgICAgIGJyZWFrOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JY2FzZSBBRl9JTkVUNjoKLQkJYXAgPSAoY2hhciAqKSYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYSktPnNpbjZfYWRkcjsKLQkJYWwgPSBzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EpLT5zaW42X2FkZHIpOwotCQlicmVhazsKKyAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICBhcCA9IChjaGFyICopJigoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhKS0+c2luNl9hZGRyOworICAgICAgICBhbCA9IHNpemVvZigoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYSktPnNpbjZfYWRkcik7CisgICAgICAgIGJyZWFrOwogI2VuZGlmCi0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAjaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FX1IKICNpZiAgIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9BUkcpCi0JcmVzdWx0ID0gZ2V0aG9zdGJ5YWRkcl9yKGFwLCBhbCwgYWYsCi0JCSZocF9hbGxvY2F0ZWQsIGJ1ZiwgYnVmX2xlbiwKLQkJJmgsICZlcnJub3ApOworICAgIHJlc3VsdCA9IGdldGhvc3RieWFkZHJfcihhcCwgYWwsIGFmLAorICAgICAgICAmaHBfYWxsb2NhdGVkLCBidWYsIGJ1Zl9sZW4sCisgICAgICAgICZoLCAmZXJybm9wKTsKICNlbGlmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9BUkcpCi0JaCA9IGdldGhvc3RieWFkZHJfcihhcCwgYWwsIGFmLAotCQkJICAgICZocF9hbGxvY2F0ZWQsIGJ1ZiwgYnVmX2xlbiwgJmVycm5vcCk7CisgICAgaCA9IGdldGhvc3RieWFkZHJfcihhcCwgYWwsIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgJmhwX2FsbG9jYXRlZCwgYnVmLCBidWZfbGVuLCAmZXJybm9wKTsKICNlbHNlIC8qIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHICovCi0JbWVtc2V0KCh2b2lkICopICZkYXRhLCAnXDAnLCBzaXplb2YoZGF0YSkpOwotCXJlc3VsdCA9IGdldGhvc3RieWFkZHJfcihhcCwgYWwsIGFmLCAmaHBfYWxsb2NhdGVkLCAmZGF0YSk7Ci0JaCA9IChyZXN1bHQgIT0gMCkgPyBOVUxMIDogJmhwX2FsbG9jYXRlZDsKKyAgICBtZW1zZXQoKHZvaWQgKikgJmRhdGEsICdcMCcsIHNpemVvZihkYXRhKSk7CisgICAgcmVzdWx0ID0gZ2V0aG9zdGJ5YWRkcl9yKGFwLCBhbCwgYWYsICZocF9hbGxvY2F0ZWQsICZkYXRhKTsKKyAgICBoID0gKHJlc3VsdCAhPSAwKSA/IE5VTEwgOiAmaHBfYWxsb2NhdGVkOwogI2VuZGlmCiAjZWxzZSAvKiBub3QgSEFWRV9HRVRIT1NUQllOQU1FX1IgKi8KICNpZmRlZiBVU0VfR0VUSE9TVEJZTkFNRV9MT0NLCi0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKG5ldGRiX2xvY2ssIDEpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhuZXRkYl9sb2NrLCAxKTsKICNlbmRpZgotCWggPSBnZXRob3N0YnlhZGRyKGFwLCBhbCwgYWYpOworICAgIGggPSBnZXRob3N0YnlhZGRyKGFwLCBhbCwgYWYpOwogI2VuZGlmIC8qIEhBVkVfR0VUSE9TVEJZTkFNRV9SICovCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBnZXRob3N0X2NvbW1vbihoLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSwgYWYpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0ID0gZ2V0aG9zdF9jb21tb24oaCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkciksIGFmKTsKICNpZmRlZiBVU0VfR0VUSE9TVEJZTkFNRV9MT0NLCi0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKG5ldGRiX2xvY2spOworICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhuZXRkYl9sb2NrKTsKICNlbmRpZgotCXJldHVybiByZXQ7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKGdldGhvc3RieWFkZHJfZG9jLApAQCAtMzQ4MiwxOCArMzQ4MiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9nZXRzZXJ2YnluYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lLCAqcHJvdG89TlVMTDsKLQlzdHJ1Y3Qgc2VydmVudCAqc3A7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHM6Z2V0c2VydmJ5bmFtZSIsICZuYW1lLCAmcHJvdG8pKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc3AgPSBnZXRzZXJ2YnluYW1lKG5hbWUsIHByb3RvKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChzcCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJzZXJ2aWNlL3Byb3RvIG5vdCBmb3VuZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBudG9ocyhzcC0+c19wb3J0KSk7CisgICAgY2hhciAqbmFtZSwgKnByb3RvPU5VTEw7CisgICAgc3RydWN0IHNlcnZlbnQgKnNwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzOmdldHNlcnZieW5hbWUiLCAmbmFtZSwgJnByb3RvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHNwID0gZ2V0c2VydmJ5bmFtZShuYW1lLCBwcm90byk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoc3AgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAic2VydmljZS9wcm90byBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgbnRvaHMoc3AtPnNfcG9ydCkpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0c2VydmJ5bmFtZV9kb2MsCkBAIC0zNTEyLDI1ICszNTEyLDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2dldHNlcnZieXBvcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBwb3J0OwotCWNoYXIgKnByb3RvPU5VTEw7Ci0Jc3RydWN0IHNlcnZlbnQgKnNwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxzOmdldHNlcnZieXBvcnQiLCAmcG9ydCwgJnByb3RvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiAweGZmZmYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJnZXRzZXJ2Ynlwb3J0OiBwb3J0IG11c3QgYmUgMC02NTUzNS4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzcCA9IGdldHNlcnZieXBvcnQoaHRvbnMoKHNob3J0KXBvcnQpLCBwcm90byk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAoc3AgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAicG9ydC9wcm90byBub3QgZm91bmQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHNwLT5zX25hbWUpOworICAgIGludCBwb3J0OworICAgIGNoYXIgKnByb3RvPU5VTEw7CisgICAgc3RydWN0IHNlcnZlbnQgKnNwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxzOmdldHNlcnZieXBvcnQiLCAmcG9ydCwgJnByb3RvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiAweGZmZmYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJnZXRzZXJ2Ynlwb3J0OiBwb3J0IG11c3QgYmUgMC02NTUzNS4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzcCA9IGdldHNlcnZieXBvcnQoaHRvbnMoKHNob3J0KXBvcnQpLCBwcm90byk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoc3AgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAicG9ydC9wcm90byBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHNwLT5zX25hbWUpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0c2VydmJ5cG9ydF9kb2MsCkBAIC0zNTQ4LDIzICszNTQ4LDIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2dldHByb3RvYnluYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCXN0cnVjdCBwcm90b2VudCAqc3A7CisgICAgY2hhciAqbmFtZTsKKyAgICBzdHJ1Y3QgcHJvdG9lbnQgKnNwOwogI2lmZGVmIF9fQkVPU19fCiAvKiBOb3QgYXZhaWxhYmxlIGluIEJlT1MgeWV0LiAtIFtjamhdICovCi0JUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHByb3RvYnluYW1lIG5vdCBzdXBwb3J0ZWQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0cHJvdG9ieW5hbWUgbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiBOVUxMOwogI2Vsc2UKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0cHJvdG9ieW5hbWUiLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzcCA9IGdldHByb3RvYnluYW1lKG5hbWUpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHNwID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInByb3RvY29sIG5vdCBmb3VuZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBzcC0+cF9wcm90byk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldHByb3RvYnluYW1lIiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgc3AgPSBnZXRwcm90b2J5bmFtZShuYW1lKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChzcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJwcm90b2NvbCBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgc3AtPnBfcHJvdG8pOwogI2VuZGlmCiB9CiAKQEAgLTM1ODMsNDAgKzM1ODMsNDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfc29ja2V0cGFpcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlTb2NrZXRTb2NrT2JqZWN0ICpzMCA9IE5VTEwsICpzMSA9IE5VTEw7Ci0JU09DS0VUX1Qgc3ZbMl07Ci0JaW50IGZhbWlseSwgdHlwZSA9IFNPQ0tfU1RSRUFNLCBwcm90byA9IDA7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgUHlTb2NrZXRTb2NrT2JqZWN0ICpzMCA9IE5VTEwsICpzMSA9IE5VTEw7CisgICAgU09DS0VUX1Qgc3ZbMl07CisgICAgaW50IGZhbWlseSwgdHlwZSA9IFNPQ0tfU1RSRUFNLCBwcm90byA9IDA7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CiAKICNpZiBkZWZpbmVkKEFGX1VOSVgpCi0JZmFtaWx5ID0gQUZfVU5JWDsKKyAgICBmYW1pbHkgPSBBRl9VTklYOwogI2Vsc2UKLQlmYW1pbHkgPSBBRl9JTkVUOworICAgIGZhbWlseSA9IEFGX0lORVQ7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpaWk6c29ja2V0cGFpciIsCi0JCQkgICAgICAmZmFtaWx5LCAmdHlwZSwgJnByb3RvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogQ3JlYXRlIGEgcGFpciBvZiBzb2NrZXQgZmRzICovCi0JaWYgKHNvY2tldHBhaXIoZmFtaWx5LCB0eXBlLCBwcm90bywgc3YpIDwgMCkKLQkJcmV0dXJuIHNldF9lcnJvcigpOwotCXMwID0gbmV3X3NvY2tvYmplY3Qoc3ZbMF0sIGZhbWlseSwgdHlwZSwgcHJvdG8pOwotCWlmIChzMCA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7Ci0JczEgPSBuZXdfc29ja29iamVjdChzdlsxXSwgZmFtaWx5LCB0eXBlLCBwcm90byk7Ci0JaWYgKHMxID09IE5VTEwpCi0JCWdvdG8gZmluYWxseTsKLQlyZXMgPSBQeVR1cGxlX1BhY2soMiwgczAsIHMxKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpaWk6c29ja2V0cGFpciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmYW1pbHksICZ0eXBlLCAmcHJvdG8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBDcmVhdGUgYSBwYWlyIG9mIHNvY2tldCBmZHMgKi8KKyAgICBpZiAoc29ja2V0cGFpcihmYW1pbHksIHR5cGUsIHByb3RvLCBzdikgPCAwKQorICAgICAgICByZXR1cm4gc2V0X2Vycm9yKCk7CisgICAgczAgPSBuZXdfc29ja29iamVjdChzdlswXSwgZmFtaWx5LCB0eXBlLCBwcm90byk7CisgICAgaWYgKHMwID09IE5VTEwpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBzMSA9IG5ld19zb2Nrb2JqZWN0KHN2WzFdLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKKyAgICBpZiAoczEgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIHJlcyA9IFB5VHVwbGVfUGFjaygyLCBzMCwgczEpOwogCiBmaW5hbGx5OgotCWlmIChyZXMgPT0gTlVMTCkgewotCQlpZiAoczAgPT0gTlVMTCkKLQkJCVNPQ0tFVENMT1NFKHN2WzBdKTsKLQkJaWYgKHMxID09IE5VTEwpCi0JCQlTT0NLRVRDTE9TRShzdlsxXSk7Ci0JfQotCVB5X1hERUNSRUYoczApOwotCVB5X1hERUNSRUYoczEpOwotCXJldHVybiByZXM7CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChzMCA9PSBOVUxMKQorICAgICAgICAgICAgU09DS0VUQ0xPU0Uoc3ZbMF0pOworICAgICAgICBpZiAoczEgPT0gTlVMTCkKKyAgICAgICAgICAgIFNPQ0tFVENMT1NFKHN2WzFdKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihzMCk7CisgICAgUHlfWERFQ1JFRihzMSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlEb2NfU1RSVkFSKHNvY2tldHBhaXJfZG9jLApAQCAtMzYzOSwxOCArMzYzOSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9mcm9tZmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5U29ja2V0U29ja09iamVjdCAqczsKLQlTT0NLRVRfVCBmZDsKLQlpbnQgZmFtaWx5LCB0eXBlLCBwcm90byA9IDA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWl8aTpmcm9tZmQiLAotCQkJICAgICAgJmZkLCAmZmFtaWx5LCAmdHlwZSwgJnByb3RvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogRHVwIHRoZSBmZCBzbyBpdCBhbmQgdGhlIHNvY2tldCBjYW4gYmUgY2xvc2VkIGluZGVwZW5kZW50bHkgKi8KLQlmZCA9IGR1cChmZCk7Ci0JaWYgKGZkIDwgMCkKLQkJcmV0dXJuIHNldF9lcnJvcigpOwotCXMgPSBuZXdfc29ja29iamVjdChmZCwgZmFtaWx5LCB0eXBlLCBwcm90byk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBzOworICAgIFB5U29ja2V0U29ja09iamVjdCAqczsKKyAgICBTT0NLRVRfVCBmZDsKKyAgICBpbnQgZmFtaWx5LCB0eXBlLCBwcm90byA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWl8aTpmcm9tZmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmQsICZmYW1pbHksICZ0eXBlLCAmcHJvdG8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBEdXAgdGhlIGZkIHNvIGl0IGFuZCB0aGUgc29ja2V0IGNhbiBiZSBjbG9zZWQgaW5kZXBlbmRlbnRseSAqLworICAgIGZkID0gZHVwKGZkKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gc2V0X2Vycm9yKCk7CisgICAgcyA9IG5ld19zb2Nrb2JqZWN0KGZkLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHM7CiB9CiAKIFB5RG9jX1NUUlZBUihmcm9tZmRfZG9jLApAQCAtMzY2NiwxOCArMzY2NiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9udG9ocyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgxLCB4MjsKKyAgICBpbnQgeDEsIHgyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOm50b2hzIiwgJngxKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHgxIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIG51bWJlciB0byB1bnNpZ25lZCBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl4MiA9ICh1bnNpZ25lZCBpbnQpbnRvaHMoKHVuc2lnbmVkIHNob3J0KXgxKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeDIpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpudG9ocyIsICZ4MSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh4MSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBudW1iZXIgdG8gdW5zaWduZWQgbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgeDIgPSAodW5zaWduZWQgaW50KW50b2hzKCh1bnNpZ25lZCBzaG9ydCl4MSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgyKTsKIH0KIAogUHlEb2NfU1RSVkFSKG50b2hzX2RvYywKQEAgLTM2ODksNDEgKzM2ODksNDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfbnRvaGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OworICAgIHVuc2lnbmVkIGxvbmcgeDsKIAotCWlmIChQeUludF9DaGVjayhhcmcpKSB7Ci0JCXggPSBQeUludF9BU19MT05HKGFyZyk7Ci0JCWlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICgobG9uZyl4IDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIG51bWJlciB0byB1bnNpZ25lZCBsb25nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQllbHNlIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkgewotCQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKGFyZyk7Ci0JCWlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5SW50X0NoZWNrKGFyZykpIHsKKyAgICAgICAgeCA9IFB5SW50X0FTX0xPTkcoYXJnKTsKKyAgICAgICAgaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKChsb25nKXggPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7CisgICAgICAgIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcoYXJnKTsKKyAgICAgICAgaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNpZiBTSVpFT0ZfTE9ORyA+IDQKLQkJewotCQkJdW5zaWduZWQgbG9uZyB5OwotCQkJLyogb25seSB3YW50IHRoZSB0cmFpbGluZyAzMiBiaXRzICovCi0JCQl5ID0geCAmIDB4RkZGRkZGRkZVTDsKLQkJCWlmICh5IF4geCkKLQkJCQlyZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCSAgICAibG9uZyBpbnQgbGFyZ2VyIHRoYW4gMzIgYml0cyIpOwotCQkJeCA9IHk7Ci0JCX0KKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB5OworICAgICAgICAgICAgLyogb25seSB3YW50IHRoZSB0cmFpbGluZyAzMiBiaXRzICovCisgICAgICAgICAgICB5ID0geCAmIDB4RkZGRkZGRkZVTDsKKyAgICAgICAgICAgIGlmICh5IF4geCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbmcgaW50IGxhcmdlciB0aGFuIDMyIGJpdHMiKTsKKyAgICAgICAgICAgIHggPSB5OworICAgICAgICB9CiAjZW5kaWYKLQl9Ci0JZWxzZQotCQlyZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgImV4cGVjdGVkIGludC9sb25nLCAlcyBmb3VuZCIsCi0JCQkJICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7Ci0JaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhudG9obCh4KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGludC9sb25nLCAlcyBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKKyAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKG50b2hsKHgpKTsKIH0KIAogUHlEb2NfU1RSVkFSKG50b2hsX2RvYywKQEAgLTM3MzUsMTggKzM3MzUsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfaHRvbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4MSwgeDI7CisgICAgaW50IHgxLCB4MjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpodG9ucyIsICZ4MSkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh4MSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBudW1iZXIgdG8gdW5zaWduZWQgbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JeDIgPSAodW5zaWduZWQgaW50KWh0b25zKCh1bnNpZ25lZCBzaG9ydCl4MSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgyKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6aHRvbnMiLCAmeDEpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoeDEgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHgyID0gKHVuc2lnbmVkIGludClodG9ucygodW5zaWduZWQgc2hvcnQpeDEpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4Mik7CiB9CiAKIFB5RG9jX1NUUlZBUihodG9uc19kb2MsCkBAIC0zNzU4LDM5ICszNzU4LDM5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2h0b25sKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCXVuc2lnbmVkIGxvbmcgeDsKKyAgICB1bnNpZ25lZCBsb25nIHg7CiAKLQlpZiAoUHlJbnRfQ2hlY2soYXJnKSkgewotCQl4ID0gUHlJbnRfQVNfTE9ORyhhcmcpOwotCQlpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoKGxvbmcpeCA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJICAiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBudW1iZXIgdG8gdW5zaWduZWQgbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKGFyZykpIHsKLQkJeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhhcmcpOwotCQlpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOworICAgIGlmIChQeUludF9DaGVjayhhcmcpKSB7CisgICAgICAgIHggPSBQeUludF9BU19MT05HKGFyZyk7CisgICAgICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICgobG9uZyl4IDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIG51bWJlciB0byB1bnNpZ25lZCBsb25nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkgeworICAgICAgICB4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKGFyZyk7CisgICAgICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWYgU0laRU9GX0xPTkcgPiA0Ci0JCXsKLQkJCXVuc2lnbmVkIGxvbmcgeTsKLQkJCS8qIG9ubHkgd2FudCB0aGUgdHJhaWxpbmcgMzIgYml0cyAqLwotCQkJeSA9IHggJiAweEZGRkZGRkZGVUw7Ci0JCQlpZiAoeSBeIHgpCi0JCQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkgICAgImxvbmcgaW50IGxhcmdlciB0aGFuIDMyIGJpdHMiKTsKLQkJCXggPSB5OwotCQl9CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgeTsKKyAgICAgICAgICAgIC8qIG9ubHkgd2FudCB0aGUgdHJhaWxpbmcgMzIgYml0cyAqLworICAgICAgICAgICAgeSA9IHggJiAweEZGRkZGRkZGVUw7CisgICAgICAgICAgICBpZiAoeSBeIHgpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nIGludCBsYXJnZXIgdGhhbiAzMiBiaXRzIik7CisgICAgICAgICAgICB4ID0geTsKKyAgICAgICAgfQogI2VuZGlmCi0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICJleHBlY3RlZCBpbnQvbG9uZywgJXMgZm91bmQiLAotCQkJCSAgICBQeV9UWVBFKGFyZyktPnRwX25hbWUpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhodG9ubCgodW5zaWduZWQgbG9uZyl4KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGludC9sb25nLCAlcyBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoaHRvbmwoKHVuc2lnbmVkIGxvbmcpeCkpOwogfQogCiBQeURvY19TVFJWQVIoaHRvbmxfZG9jLApAQCAtMzgxMywyMCArMzgxMywyMCBAQAogI2RlZmluZSBJTkFERFJfTk9ORSAoLTEpCiAjZW5kaWYKICNpZmRlZiBIQVZFX0lORVRfQVRPTgotCXN0cnVjdCBpbl9hZGRyIGJ1ZjsKKyAgICBzdHJ1Y3QgaW5fYWRkciBidWY7CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEhBVkVfSU5FVF9BVE9OKSB8fCBkZWZpbmVkKFVTRV9JTkVUX0FUT05fV0VBS0xJTkspCiAjaWYgKFNJWkVPRl9JTlQgIT0gNCkKICNlcnJvciAiTm90IHN1cmUgaWYgaW5fYWRkcl90IGV4aXN0cyBhbmQgaW50IGlzIG5vdCAzMi1iaXRzLiIKICNlbmRpZgotCS8qIEhhdmUgdG8gdXNlIGluZXRfYWRkcigpIGluc3RlYWQgKi8KLQl1bnNpZ25lZCBpbnQgcGFja2VkX2FkZHI7CisgICAgLyogSGF2ZSB0byB1c2UgaW5ldF9hZGRyKCkgaW5zdGVhZCAqLworICAgIHVuc2lnbmVkIGludCBwYWNrZWRfYWRkcjsKICNlbmRpZgotCWNoYXIgKmlwX2FkZHI7CisgICAgY2hhciAqaXBfYWRkcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbmV0X2F0b24iLCAmaXBfYWRkcikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbmV0X2F0b24iLCAmaXBfYWRkcikpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAKICNpZmRlZiBIQVZFX0lORVRfQVRPTgpAQCAtMzgzNCwxMyArMzgzNCwxMyBAQAogI2lmZGVmIFVTRV9JTkVUX0FUT05fV0VBS0xJTksKICAgICBpZiAoaW5ldF9hdG9uICE9IE5VTEwpIHsKICNlbmRpZgotCWlmIChpbmV0X2F0b24oaXBfYWRkciwgJmJ1ZikpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSgmYnVmKSwKLQkJCQkJCSAgc2l6ZW9mKGJ1ZikpOworICAgIGlmIChpbmV0X2F0b24oaXBfYWRkciwgJmJ1ZikpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSgmYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidWYpKTsKIAotCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkiaWxsZWdhbCBJUCBhZGRyZXNzIHN0cmluZyBwYXNzZWQgdG8gaW5ldF9hdG9uIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgSVAgYWRkcmVzcyBzdHJpbmcgcGFzc2VkIHRvIGluZXRfYXRvbiIpOworICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgVVNFX0lORVRfQVRPTl9XRUFLTElOSwogICAgfSBlbHNlIHsKQEAgLTM4NTAsMjIgKzM4NTAsMjIgQEAKIAogI2lmICFkZWZpbmVkKEhBVkVfSU5FVF9BVE9OKSB8fCBkZWZpbmVkKFVTRV9JTkVUX0FUT05fV0VBS0xJTkspCiAKLQkvKiBzcGVjaWFsLWNhc2UgdGhpcyBhZGRyZXNzIGFzIGluZXRfYWRkciBtaWdodCByZXR1cm4gSU5BRERSX05PTkUKLQkgKiBmb3IgdGhpcyAqLwotCWlmIChzdHJjbXAoaXBfYWRkciwgIjI1NS4yNTUuMjU1LjI1NSIpID09IDApIHsKLQkJcGFja2VkX2FkZHIgPSAweEZGRkZGRkZGOwotCX0gZWxzZSB7CisgICAgLyogc3BlY2lhbC1jYXNlIHRoaXMgYWRkcmVzcyBhcyBpbmV0X2FkZHIgbWlnaHQgcmV0dXJuIElOQUREUl9OT05FCisgICAgICogZm9yIHRoaXMgKi8KKyAgICBpZiAoc3RyY21wKGlwX2FkZHIsICIyNTUuMjU1LjI1NS4yNTUiKSA9PSAwKSB7CisgICAgICAgIHBhY2tlZF9hZGRyID0gMHhGRkZGRkZGRjsKKyAgICB9IGVsc2UgewogCi0JCXBhY2tlZF9hZGRyID0gaW5ldF9hZGRyKGlwX2FkZHIpOworICAgICAgICBwYWNrZWRfYWRkciA9IGluZXRfYWRkcihpcF9hZGRyKTsKIAotCQlpZiAocGFja2VkX2FkZHIgPT0gSU5BRERSX05PTkUpIHsJLyogaW52YWxpZCBhZGRyZXNzICovCi0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJCSJpbGxlZ2FsIElQIGFkZHJlc3Mgc3RyaW5nIHBhc3NlZCB0byBpbmV0X2F0b24iKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAmcGFja2VkX2FkZHIsCi0JCQkJCSAgc2l6ZW9mKHBhY2tlZF9hZGRyKSk7CisgICAgICAgIGlmIChwYWNrZWRfYWRkciA9PSBJTkFERFJfTk9ORSkgeyAgICAgICAgICAgICAgIC8qIGludmFsaWQgYWRkcmVzcyAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAiaWxsZWdhbCBJUCBhZGRyZXNzIHN0cmluZyBwYXNzZWQgdG8gaW5ldF9hdG9uIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikgJnBhY2tlZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFja2VkX2FkZHIpKTsKIAogI2lmZGVmIFVTRV9JTkVUX0FUT05fV0VBS0xJTksKICAgIH0KQEAgLTM4ODIsMjMgKzM4ODIsMjMgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHNvY2tldF9pbmV0X250b2EoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhY2tlZF9zdHI7Ci0JaW50IGFkZHJfbGVuOwotCXN0cnVjdCBpbl9hZGRyIHBhY2tlZF9hZGRyOworICAgIGNoYXIgKnBhY2tlZF9zdHI7CisgICAgaW50IGFkZHJfbGVuOworICAgIHN0cnVjdCBpbl9hZGRyIHBhY2tlZF9hZGRyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzppbmV0X250b2EiLCAmcGFja2VkX3N0ciwgJmFkZHJfbGVuKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzppbmV0X250b2EiLCAmcGFja2VkX3N0ciwgJmFkZHJfbGVuKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoYWRkcl9sZW4gIT0gc2l6ZW9mKHBhY2tlZF9hZGRyKSkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJInBhY2tlZCBJUCB3cm9uZyBsZW5ndGggZm9yIGluZXRfbnRvYSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGFkZHJfbGVuICE9IHNpemVvZihwYWNrZWRfYWRkcikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICJwYWNrZWQgSVAgd3JvbmcgbGVuZ3RoIGZvciBpbmV0X250b2EiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbWVtY3B5KCZwYWNrZWRfYWRkciwgcGFja2VkX3N0ciwgYWRkcl9sZW4pOworICAgIG1lbWNweSgmcGFja2VkX2FkZHIsIHBhY2tlZF9zdHIsIGFkZHJfbGVuKTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGluZXRfbnRvYShwYWNrZWRfYWRkcikpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGluZXRfbnRvYShwYWNrZWRfYWRkcikpOwogfQogCiAjaWZkZWYgSEFWRV9JTkVUX1BUT04KQEAgLTM5MTIsNDYgKzM5MTIsNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfaW5ldF9wdG9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYWY7Ci0JY2hhciogaXA7Ci0JaW50IHJldHZhbDsKKyAgICBpbnQgYWY7CisgICAgY2hhciogaXA7CisgICAgaW50IHJldHZhbDsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNoYXIgcGFja2VkW01BWChzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSldOworICAgIGNoYXIgcGFja2VkW01BWChzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSldOwogI2Vsc2UKLQljaGFyIHBhY2tlZFtzaXplb2Yoc3RydWN0IGluX2FkZHIpXTsKKyAgICBjaGFyIHBhY2tlZFtzaXplb2Yoc3RydWN0IGluX2FkZHIpXTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXM6aW5ldF9wdG9uIiwgJmFmLCAmaXApKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzOmluZXRfcHRvbiIsICZhZiwgJmlwKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZiAhZGVmaW5lZChFTkFCTEVfSVBWNikgJiYgZGVmaW5lZChBRl9JTkVUNikKLQlpZihhZiA9PSBBRl9JTkVUNikgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJCSJjYW4ndCB1c2UgQUZfSU5FVDYsIElQdjYgaXMgZGlzYWJsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmKGFmID09IEFGX0lORVQ2KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgdXNlIEFGX0lORVQ2LCBJUHY2IGlzIGRpc2FibGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JcmV0dmFsID0gaW5ldF9wdG9uKGFmLCBpcCwgcGFja2VkKTsKLQlpZiAocmV0dmFsIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oc29ja2V0X2Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChyZXR2YWwgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJImlsbGVnYWwgSVAgYWRkcmVzcyBzdHJpbmcgcGFzc2VkIHRvIGluZXRfcHRvbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgaWYgKGFmID09IEFGX0lORVQpIHsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHBhY2tlZCwKLQkJCXNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworICAgIHJldHZhbCA9IGluZXRfcHRvbihhZiwgaXAsIHBhY2tlZCk7CisgICAgaWYgKHJldHZhbCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKHNvY2tldF9lcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAocmV0dmFsID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICJpbGxlZ2FsIElQIGFkZHJlc3Mgc3RyaW5nIHBhc3NlZCB0byBpbmV0X3B0b24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmIChhZiA9PSBBRl9JTkVUKSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwYWNrZWQsCisgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKICNpZmRlZiBFTkFCTEVfSVBWNgotCX0gZWxzZSBpZiAoYWYgPT0gQUZfSU5FVDYpIHsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHBhY2tlZCwKLQkJCXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKyAgICB9IGVsc2UgaWYgKGFmID09IEFGX0lORVQ2KSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwYWNrZWQsCisgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CiAjZW5kaWYKLQl9IGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAidW5rbm93biBhZGRyZXNzIGZhbWlseSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInVua25vd24gYWRkcmVzcyBmYW1pbHkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIoaW5ldF9udG9wX2RvYywKQEAgLTM5NjIsNTQgKzM5NjIsNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfaW5ldF9udG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYWY7Ci0JY2hhciogcGFja2VkOwotCWludCBsZW47Ci0JY29uc3QgY2hhciogcmV0dmFsOworICAgIGludCBhZjsKKyAgICBjaGFyKiBwYWNrZWQ7CisgICAgaW50IGxlbjsKKyAgICBjb25zdCBjaGFyKiByZXR2YWw7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQljaGFyIGlwW01BWChJTkVUX0FERFJTVFJMRU4sIElORVQ2X0FERFJTVFJMRU4pICsgMV07CisgICAgY2hhciBpcFtNQVgoSU5FVF9BRERSU1RSTEVOLCBJTkVUNl9BRERSU1RSTEVOKSArIDFdOwogI2Vsc2UKLQljaGFyIGlwW0lORVRfQUREUlNUUkxFTiArIDFdOworICAgIGNoYXIgaXBbSU5FVF9BRERSU1RSTEVOICsgMV07CiAjZW5kaWYKIAotCS8qIEd1YXJhbnRlZSBOVUwtdGVybWluYXRpb24gZm9yIFB5U3RyaW5nX0Zyb21TdHJpbmcoKSBiZWxvdyAqLwotCW1lbXNldCgodm9pZCAqKSAmaXBbMF0sICdcMCcsIHNpemVvZihpcCkpOworICAgIC8qIEd1YXJhbnRlZSBOVUwtdGVybWluYXRpb24gZm9yIFB5U3RyaW5nX0Zyb21TdHJpbmcoKSBiZWxvdyAqLworICAgIG1lbXNldCgodm9pZCAqKSAmaXBbMF0sICdcMCcsIHNpemVvZihpcCkpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcyM6aW5ldF9udG9wIiwgJmFmLCAmcGFja2VkLCAmbGVuKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcyM6aW5ldF9udG9wIiwgJmFmLCAmcGFja2VkLCAmbGVuKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoYWYgPT0gQUZfSU5FVCkgewotCQlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJpbnZhbGlkIGxlbmd0aCBvZiBwYWNrZWQgSVAgYWRkcmVzcyBzdHJpbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgaWYgKGFmID09IEFGX0lORVQpIHsKKyAgICAgICAgaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBsZW5ndGggb2YgcGFja2VkIElQIGFkZHJlc3Mgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JfSBlbHNlIGlmIChhZiA9PSBBRl9JTkVUNikgewotCQlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiaW52YWxpZCBsZW5ndGggb2YgcGFja2VkIElQIGFkZHJlc3Mgc3RyaW5nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIH0gZWxzZSBpZiAoYWYgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImludmFsaWQgbGVuZ3RoIG9mIHBhY2tlZCBJUCBhZGRyZXNzIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICNlbmRpZgotCX0gZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJInVua25vd24gYWRkcmVzcyBmYW1pbHkgJWQiLCBhZik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJ1bmtub3duIGFkZHJlc3MgZmFtaWx5ICVkIiwgYWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR2YWwgPSBpbmV0X250b3AoYWYsIHBhY2tlZCwgaXAsIHNpemVvZihpcCkpOwotCWlmICghcmV0dmFsKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhzb2NrZXRfZXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgewotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXR2YWwpOwotCX0KKyAgICByZXR2YWwgPSBpbmV0X250b3AoYWYsIHBhY2tlZCwgaXAsIHNpemVvZihpcCkpOworICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhzb2NrZXRfZXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXR2YWwpOworICAgIH0KIAotCS8qIE5PVFJFQUNIRUQgKi8KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiaW52YWxpZCBoYW5kbGluZyBvZiBpbmV0X250b3AiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAvKiBOT1RSRUFDSEVEICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImludmFsaWQgaGFuZGxpbmcgb2YgaW5ldF9udG9wIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKICNlbmRpZiAvKiBIQVZFX0lORVRfUFRPTiAqLwpAQCAtNDAyMCw5NSArNDAyMCw5NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9nZXRhZGRyaW5mbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzOwotCXN0cnVjdCBhZGRyaW5mbyAqcmVzMCA9IE5VTEw7Ci0JUHlPYmplY3QgKmhvYmogPSBOVUxMOwotCVB5T2JqZWN0ICpwb2JqID0gKFB5T2JqZWN0ICopTlVMTDsKLQljaGFyIHBidWZbMzBdOwotCWNoYXIgKmhwdHIsICpwcHRyOwotCWludCBmYW1pbHksIHNvY2t0eXBlLCBwcm90b2NvbCwgZmxhZ3M7Ci0JaW50IGVycm9yOwotCVB5T2JqZWN0ICphbGwgPSAoUHlPYmplY3QgKilOVUxMOwotCVB5T2JqZWN0ICpzaW5nbGUgPSAoUHlPYmplY3QgKilOVUxMOwotCVB5T2JqZWN0ICppZG5hID0gTlVMTDsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXM7CisgICAgc3RydWN0IGFkZHJpbmZvICpyZXMwID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaG9iaiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnBvYmogPSAoUHlPYmplY3QgKilOVUxMOworICAgIGNoYXIgcGJ1ZlszMF07CisgICAgY2hhciAqaHB0ciwgKnBwdHI7CisgICAgaW50IGZhbWlseSwgc29ja3R5cGUsIHByb3RvY29sLCBmbGFnczsKKyAgICBpbnQgZXJyb3I7CisgICAgUHlPYmplY3QgKmFsbCA9IChQeU9iamVjdCAqKU5VTEw7CisgICAgUHlPYmplY3QgKnNpbmdsZSA9IChQeU9iamVjdCAqKU5VTEw7CisgICAgUHlPYmplY3QgKmlkbmEgPSBOVUxMOwogCi0JZmFtaWx5ID0gc29ja3R5cGUgPSBwcm90b2NvbCA9IGZsYWdzID0gMDsKLQlmYW1pbHkgPSBBRl9VTlNQRUM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xpaWlpOmdldGFkZHJpbmZvIiwKLQkJCSAgICAgICZob2JqLCAmcG9iaiwgJmZhbWlseSwgJnNvY2t0eXBlLAotCQkJICAgICAgJnByb3RvY29sLCAmZmxhZ3MpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoaG9iaiA9PSBQeV9Ob25lKSB7Ci0JCWhwdHIgPSBOVUxMOwotCX0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGhvYmopKSB7Ci0JCWlkbmEgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGhvYmosICJlbmNvZGUiLCAicyIsICJpZG5hIik7Ci0JCWlmICghaWRuYSkKLQkJCXJldHVybiBOVUxMOwotCQlocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoaWRuYSk7Ci0JfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhob2JqKSkgewotCQlocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoaG9iaik7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZ2V0YWRkcmluZm8oKSBhcmd1bWVudCAxIG11c3QgYmUgc3RyaW5nIG9yIE5vbmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeUludF9DaGVjayhwb2JqKSkgewotCQlQeU9TX3NucHJpbnRmKHBidWYsIHNpemVvZihwYnVmKSwgIiVsZCIsIFB5SW50X0FzTG9uZyhwb2JqKSk7Ci0JCXBwdHIgPSBwYnVmOwotCX0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socG9iaikpIHsKLQkJcHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHBvYmopOwotCX0gZWxzZSBpZiAocG9iaiA9PSBQeV9Ob25lKSB7Ci0JCXBwdHIgPSAoY2hhciAqKU5VTEw7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgIkludCBvciBTdHJpbmcgZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycjsKLQl9Ci0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JaGludHMuYWlfZmFtaWx5ID0gZmFtaWx5OwotCWhpbnRzLmFpX3NvY2t0eXBlID0gc29ja3R5cGU7Ci0JaGludHMuYWlfcHJvdG9jb2wgPSBwcm90b2NvbDsKLQloaW50cy5haV9mbGFncyA9IGZsYWdzOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlBQ1FVSVJFX0dFVEFERFJJTkZPX0xPQ0sKLQllcnJvciA9IGdldGFkZHJpbmZvKGhwdHIsIHBwdHIsICZoaW50cywgJnJlczApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUkVMRUFTRV9HRVRBRERSSU5GT19MT0NLICAvKiBzZWUgY29tbWVudCBpbiBzZXRpcGFkZHIoKSAqLwotCWlmIChlcnJvcikgewotCQlzZXRfZ2FpZXJyb3IoZXJyb3IpOwotCQlnb3RvIGVycjsKLQl9CisgICAgZmFtaWx5ID0gc29ja3R5cGUgPSBwcm90b2NvbCA9IGZsYWdzID0gMDsKKyAgICBmYW1pbHkgPSBBRl9VTlNQRUM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xpaWlpOmdldGFkZHJpbmZvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvYmosICZwb2JqLCAmZmFtaWx5LCAmc29ja3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90b2NvbCwgJmZsYWdzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGhvYmogPT0gUHlfTm9uZSkgeworICAgICAgICBocHRyID0gTlVMTDsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhob2JqKSkgeworICAgICAgICBpZG5hID0gUHlPYmplY3RfQ2FsbE1ldGhvZChob2JqLCAiZW5jb2RlIiwgInMiLCAiaWRuYSIpOworICAgICAgICBpZiAoIWlkbmEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGlkbmEpOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soaG9iaikpIHsKKyAgICAgICAgaHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGhvYmopOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0YWRkcmluZm8oKSBhcmd1bWVudCAxIG11c3QgYmUgc3RyaW5nIG9yIE5vbmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUludF9DaGVjayhwb2JqKSkgeworICAgICAgICBQeU9TX3NucHJpbnRmKHBidWYsIHNpemVvZihwYnVmKSwgIiVsZCIsIFB5SW50X0FzTG9uZyhwb2JqKSk7CisgICAgICAgIHBwdHIgPSBwYnVmOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socG9iaikpIHsKKyAgICAgICAgcHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHBvYmopOworICAgIH0gZWxzZSBpZiAocG9iaiA9PSBQeV9Ob25lKSB7CisgICAgICAgIHBwdHIgPSAoY2hhciAqKU5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgIkludCBvciBTdHJpbmcgZXhwZWN0ZWQiKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICAgIGhpbnRzLmFpX2ZhbWlseSA9IGZhbWlseTsKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IHNvY2t0eXBlOworICAgIGhpbnRzLmFpX3Byb3RvY29sID0gcHJvdG9jb2w7CisgICAgaGludHMuYWlfZmxhZ3MgPSBmbGFnczsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgQUNRVUlSRV9HRVRBRERSSU5GT19MT0NLCisgICAgZXJyb3IgPSBnZXRhZGRyaW5mbyhocHRyLCBwcHRyLCAmaGludHMsICZyZXMwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFJFTEVBU0VfR0VUQUREUklORk9fTE9DSyAgLyogc2VlIGNvbW1lbnQgaW4gc2V0aXBhZGRyKCkgKi8KKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgc2V0X2dhaWVycm9yKGVycm9yKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQogCi0JaWYgKChhbGwgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQotCQlnb3RvIGVycjsKLQlmb3IgKHJlcyA9IHJlczA7IHJlczsgcmVzID0gcmVzLT5haV9uZXh0KSB7Ci0JCVB5T2JqZWN0ICphZGRyID0KLQkJCW1ha2Vzb2NrYWRkcigtMSwgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4sIHByb3RvY29sKTsKLQkJaWYgKGFkZHIgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCQlzaW5nbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWlzTyIsIHJlcy0+YWlfZmFtaWx5LAotCQkJcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCwKLQkJCXJlcy0+YWlfY2Fub25uYW1lID8gcmVzLT5haV9jYW5vbm5hbWUgOiAiIiwKLQkJCWFkZHIpOwotCQlQeV9ERUNSRUYoYWRkcik7Ci0JCWlmIChzaW5nbGUgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOworICAgIGlmICgoYWxsID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnI7CisgICAgZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgeworICAgICAgICBQeU9iamVjdCAqYWRkciA9CisgICAgICAgICAgICBtYWtlc29ja2FkZHIoLTEsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuLCBwcm90b2NvbCk7CisgICAgICAgIGlmIChhZGRyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgc2luZ2xlID0gUHlfQnVpbGRWYWx1ZSgiaWlpc08iLCByZXMtPmFpX2ZhbWlseSwKKyAgICAgICAgICAgIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wsCisgICAgICAgICAgICByZXMtPmFpX2Nhbm9ubmFtZSA/IHJlcy0+YWlfY2Fub25uYW1lIDogIiIsCisgICAgICAgICAgICBhZGRyKTsKKyAgICAgICAgUHlfREVDUkVGKGFkZHIpOworICAgICAgICBpZiAoc2luZ2xlID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKIAotCQlpZiAoUHlMaXN0X0FwcGVuZChhbGwsIHNpbmdsZSkpCi0JCQlnb3RvIGVycjsKLQkJUHlfWERFQ1JFRihzaW5nbGUpOwotCX0KLQlQeV9YREVDUkVGKGlkbmEpOwotCWlmIChyZXMwKQotCQlmcmVlYWRkcmluZm8ocmVzMCk7Ci0JcmV0dXJuIGFsbDsKKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoYWxsLCBzaW5nbGUpKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIFB5X1hERUNSRUYoc2luZ2xlKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihpZG5hKTsKKyAgICBpZiAocmVzMCkKKyAgICAgICAgZnJlZWFkZHJpbmZvKHJlczApOworICAgIHJldHVybiBhbGw7CiAgZXJyOgotCVB5X1hERUNSRUYoc2luZ2xlKTsKLQlQeV9YREVDUkVGKGFsbCk7Ci0JUHlfWERFQ1JFRihpZG5hKTsKLQlpZiAocmVzMCkKLQkJZnJlZWFkZHJpbmZvKHJlczApOwotCXJldHVybiAoUHlPYmplY3QgKilOVUxMOworICAgIFB5X1hERUNSRUYoc2luZ2xlKTsKKyAgICBQeV9YREVDUkVGKGFsbCk7CisgICAgUHlfWERFQ1JFRihpZG5hKTsKKyAgICBpZiAocmVzMCkKKyAgICAgICAgZnJlZWFkZHJpbmZvKHJlczApOworICAgIHJldHVybiAoUHlPYmplY3QgKilOVUxMOwogfQogCiBQeURvY19TVFJWQVIoZ2V0YWRkcmluZm9fZG9jLApAQCAtNDEyMyw3NyArNDEyMyw3NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9nZXRuYW1laW5mbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNhID0gKFB5T2JqZWN0ICopTlVMTDsKLQlpbnQgZmxhZ3M7Ci0JY2hhciAqaG9zdHA7Ci0JaW50IHBvcnQsIGZsb3dpbmZvLCBzY29wZV9pZDsKLQljaGFyIGhidWZbTklfTUFYSE9TVF0sIHBidWZbTklfTUFYU0VSVl07Ci0Jc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzID0gTlVMTDsKLQlpbnQgZXJyb3I7Ci0JUHlPYmplY3QgKnJldCA9IChQeU9iamVjdCAqKU5VTEw7CisgICAgUHlPYmplY3QgKnNhID0gKFB5T2JqZWN0ICopTlVMTDsKKyAgICBpbnQgZmxhZ3M7CisgICAgY2hhciAqaG9zdHA7CisgICAgaW50IHBvcnQsIGZsb3dpbmZvLCBzY29wZV9pZDsKKyAgICBjaGFyIGhidWZbTklfTUFYSE9TVF0sIHBidWZbTklfTUFYU0VSVl07CisgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzID0gTlVMTDsKKyAgICBpbnQgZXJyb3I7CisgICAgUHlPYmplY3QgKnJldCA9IChQeU9iamVjdCAqKU5VTEw7CiAKLQlmbGFncyA9IGZsb3dpbmZvID0gc2NvcGVfaWQgPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6Z2V0bmFtZWluZm8iLCAmc2EsICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlUdXBsZV9DaGVjayhzYSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZ2V0bmFtZWluZm8oKSBhcmd1bWVudCAxIG11c3QgYmUgYSB0dXBsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHNhLCAic2l8aWkiLAotCQkJICAgICAgJmhvc3RwLCAmcG9ydCwgJmZsb3dpbmZvLCAmc2NvcGVfaWQpKQotCQlyZXR1cm4gTlVMTDsKLQlQeU9TX3NucHJpbnRmKHBidWYsIHNpemVvZihwYnVmKSwgIiVkIiwgcG9ydCk7Ci0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOwotCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsJLyogbWFrZSBudW1lcmljIHBvcnQgaGFwcHkgKi8KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JQUNRVUlSRV9HRVRBRERSSU5GT19MT0NLCi0JZXJyb3IgPSBnZXRhZGRyaW5mbyhob3N0cCwgcGJ1ZiwgJmhpbnRzLCAmcmVzKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVJFTEVBU0VfR0VUQUREUklORk9fTE9DSyAgLyogc2VlIGNvbW1lbnQgaW4gc2V0aXBhZGRyKCkgKi8KLQlpZiAoZXJyb3IpIHsKLQkJc2V0X2dhaWVycm9yKGVycm9yKTsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAocmVzLT5haV9uZXh0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkic29ja2FkZHIgcmVzb2x2ZWQgdG8gbXVsdGlwbGUgYWRkcmVzc2VzIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0Jc3dpdGNoIChyZXMtPmFpX2ZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKLQkgICAgewotCQlpZiAoUHlUdXBsZV9HRVRfU0laRShzYSkgIT0gMikgewotCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkiSVB2NCBzb2NrYWRkciBtdXN0IGJlIDIgdHVwbGUiKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlicmVhazsKLQkgICAgfQorICAgIGZsYWdzID0gZmxvd2luZm8gPSBzY29wZV9pZCA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpnZXRuYW1laW5mbyIsICZzYSwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHNhKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImdldG5hbWVpbmZvKCkgYXJndW1lbnQgMSBtdXN0IGJlIGEgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShzYSwgInNpfGlpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvc3RwLCAmcG9ydCwgJmZsb3dpbmZvLCAmc2NvcGVfaWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeU9TX3NucHJpbnRmKHBidWYsIHNpemVvZihwYnVmKSwgIiVkIiwgcG9ydCk7CisgICAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOworICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsgICAgIC8qIG1ha2UgbnVtZXJpYyBwb3J0IGhhcHB5ICovCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIEFDUVVJUkVfR0VUQUREUklORk9fTE9DSworICAgIGVycm9yID0gZ2V0YWRkcmluZm8oaG9zdHAsIHBidWYsICZoaW50cywgJnJlcyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBSRUxFQVNFX0dFVEFERFJJTkZPX0xPQ0sgIC8qIHNlZSBjb21tZW50IGluIHNldGlwYWRkcigpICovCisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIHNldF9nYWllcnJvcihlcnJvcik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKHJlcy0+YWlfbmV4dCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAorICAgICAgICAgICAgInNvY2thZGRyIHJlc29sdmVkIHRvIG11bHRpcGxlIGFkZHJlc3NlcyIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHN3aXRjaCAocmVzLT5haV9mYW1pbHkpIHsKKyAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgIHsKKyAgICAgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoc2EpICE9IDIpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgIklQdjQgc29ja2FkZHIgbXVzdCBiZSAyIHR1cGxlIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JICAgIHsKLQkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKLQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopcmVzLT5haV9hZGRyOwotCQlzaW42LT5zaW42X2Zsb3dpbmZvID0gZmxvd2luZm87Ci0JCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSBzY29wZV9pZDsKLQkJYnJlYWs7Ci0JICAgIH0KKyAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisgICAgICAgIHNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXJlcy0+YWlfYWRkcjsKKyAgICAgICAgc2luNi0+c2luNl9mbG93aW5mbyA9IGZsb3dpbmZvOworICAgICAgICBzaW42LT5zaW42X3Njb3BlX2lkID0gc2NvcGVfaWQ7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CiAjZW5kaWYKLQl9Ci0JZXJyb3IgPSBnZXRuYW1laW5mbyhyZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbiwKLQkJCWhidWYsIHNpemVvZihoYnVmKSwgcGJ1Ziwgc2l6ZW9mKHBidWYpLCBmbGFncyk7Ci0JaWYgKGVycm9yKSB7Ci0JCXNldF9nYWllcnJvcihlcnJvcik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0ID0gUHlfQnVpbGRWYWx1ZSgic3MiLCBoYnVmLCBwYnVmKTsKKyAgICB9CisgICAgZXJyb3IgPSBnZXRuYW1laW5mbyhyZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgaGJ1Ziwgc2l6ZW9mKGhidWYpLCBwYnVmLCBzaXplb2YocGJ1ZiksIGZsYWdzKTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgc2V0X2dhaWVycm9yKGVycm9yKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICByZXQgPSBQeV9CdWlsZFZhbHVlKCJzcyIsIGhidWYsIHBidWYpOwogCiBmYWlsOgotCWlmIChyZXMpCi0JCWZyZWVhZGRyaW5mbyhyZXMpOwotCXJldHVybiByZXQ7CisgICAgaWYgKHJlcykKKyAgICAgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKGdldG5hbWVpbmZvX2RvYywKQEAgLTQyMDcsMTIgKzQyMDcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfZ2V0ZGVmYXVsdHRpbWVvdXQoUHlPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKGRlZmF1bHR0aW1lb3V0IDwgMC4wKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShkZWZhdWx0dGltZW91dCk7CisgICAgaWYgKGRlZmF1bHR0aW1lb3V0IDwgMC4wKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShkZWZhdWx0dGltZW91dCk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRkZWZhdWx0dGltZW91dF9kb2MsCkBAIC00MjI1LDI0ICs0MjI1LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X3NldGRlZmF1bHR0aW1lb3V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCWRvdWJsZSB0aW1lb3V0OworICAgIGRvdWJsZSB0aW1lb3V0OwogCi0JaWYgKGFyZyA9PSBQeV9Ob25lKQotCQl0aW1lb3V0ID0gLTEuMDsKLQllbHNlIHsKLQkJdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQkJaWYgKHRpbWVvdXQgPCAwLjApIHsKLQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJUaW1lb3V0IHZhbHVlIG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgaWYgKGFyZyA9PSBQeV9Ob25lKQorICAgICAgICB0aW1lb3V0ID0gLTEuMDsKKyAgICBlbHNlIHsKKyAgICAgICAgdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICAgICAgaWYgKHRpbWVvdXQgPCAwLjApIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVvdXQgdmFsdWUgb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCWRlZmF1bHR0aW1lb3V0ID0gdGltZW91dDsKKyAgICBkZWZhdWx0dGltZW91dCA9IHRpbWVvdXQ7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2V0ZGVmYXVsdHRpbWVvdXRfZG9jLApAQCAtNDI1Niw1NSArNDI1Niw1NSBAQAogLyogTGlzdCBvZiBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzb2NrZXRfbWV0aG9kc1tdID0gewotCXsiZ2V0aG9zdGJ5bmFtZSIsCXNvY2tldF9nZXRob3N0YnluYW1lLAotCSBNRVRIX1ZBUkFSR1MsIGdldGhvc3RieW5hbWVfZG9jfSwKLQl7ImdldGhvc3RieW5hbWVfZXgiLAlzb2NrZXRfZ2V0aG9zdGJ5bmFtZV9leCwKLQkgTUVUSF9WQVJBUkdTLCBnaGJuX2V4X2RvY30sCi0JeyJnZXRob3N0YnlhZGRyIiwJc29ja2V0X2dldGhvc3RieWFkZHIsCi0JIE1FVEhfVkFSQVJHUywgZ2V0aG9zdGJ5YWRkcl9kb2N9LAotCXsiZ2V0aG9zdG5hbWUiLAkJc29ja2V0X2dldGhvc3RuYW1lLAotCSBNRVRIX05PQVJHUywgIGdldGhvc3RuYW1lX2RvY30sCi0JeyJnZXRzZXJ2YnluYW1lIiwJc29ja2V0X2dldHNlcnZieW5hbWUsCi0JIE1FVEhfVkFSQVJHUywgZ2V0c2VydmJ5bmFtZV9kb2N9LAotCXsiZ2V0c2VydmJ5cG9ydCIsCXNvY2tldF9nZXRzZXJ2Ynlwb3J0LAotCSBNRVRIX1ZBUkFSR1MsIGdldHNlcnZieXBvcnRfZG9jfSwKLQl7ImdldHByb3RvYnluYW1lIiwJc29ja2V0X2dldHByb3RvYnluYW1lLAotCSBNRVRIX1ZBUkFSR1MsIGdldHByb3RvYnluYW1lX2RvY30sCisgICAgeyJnZXRob3N0YnluYW1lIiwgICAgICAgICAgIHNvY2tldF9nZXRob3N0YnluYW1lLAorICAgICBNRVRIX1ZBUkFSR1MsIGdldGhvc3RieW5hbWVfZG9jfSwKKyAgICB7ImdldGhvc3RieW5hbWVfZXgiLCAgICAgICAgc29ja2V0X2dldGhvc3RieW5hbWVfZXgsCisgICAgIE1FVEhfVkFSQVJHUywgZ2hibl9leF9kb2N9LAorICAgIHsiZ2V0aG9zdGJ5YWRkciIsICAgICAgICAgICBzb2NrZXRfZ2V0aG9zdGJ5YWRkciwKKyAgICAgTUVUSF9WQVJBUkdTLCBnZXRob3N0YnlhZGRyX2RvY30sCisgICAgeyJnZXRob3N0bmFtZSIsICAgICAgICAgICAgIHNvY2tldF9nZXRob3N0bmFtZSwKKyAgICAgTUVUSF9OT0FSR1MsICBnZXRob3N0bmFtZV9kb2N9LAorICAgIHsiZ2V0c2VydmJ5bmFtZSIsICAgICAgICAgICBzb2NrZXRfZ2V0c2VydmJ5bmFtZSwKKyAgICAgTUVUSF9WQVJBUkdTLCBnZXRzZXJ2YnluYW1lX2RvY30sCisgICAgeyJnZXRzZXJ2Ynlwb3J0IiwgICAgICAgICAgIHNvY2tldF9nZXRzZXJ2Ynlwb3J0LAorICAgICBNRVRIX1ZBUkFSR1MsIGdldHNlcnZieXBvcnRfZG9jfSwKKyAgICB7ImdldHByb3RvYnluYW1lIiwgICAgICAgICAgc29ja2V0X2dldHByb3RvYnluYW1lLAorICAgICBNRVRIX1ZBUkFSR1MsIGdldHByb3RvYnluYW1lX2RvY30sCiAjaWZuZGVmIE5PX0RVUAotCXsiZnJvbWZkIiwJCXNvY2tldF9mcm9tZmQsCi0JIE1FVEhfVkFSQVJHUywgZnJvbWZkX2RvY30sCisgICAgeyJmcm9tZmQiLCAgICAgICAgICAgICAgICAgIHNvY2tldF9mcm9tZmQsCisgICAgIE1FVEhfVkFSQVJHUywgZnJvbWZkX2RvY30sCiAjZW5kaWYKICNpZmRlZiBIQVZFX1NPQ0tFVFBBSVIKLQl7InNvY2tldHBhaXIiLAkJc29ja2V0X3NvY2tldHBhaXIsCi0JIE1FVEhfVkFSQVJHUywgc29ja2V0cGFpcl9kb2N9LAorICAgIHsic29ja2V0cGFpciIsICAgICAgICAgICAgICBzb2NrZXRfc29ja2V0cGFpciwKKyAgICAgTUVUSF9WQVJBUkdTLCBzb2NrZXRwYWlyX2RvY30sCiAjZW5kaWYKLQl7Im50b2hzIiwJCXNvY2tldF9udG9ocywKLQkgTUVUSF9WQVJBUkdTLCBudG9oc19kb2N9LAotCXsibnRvaGwiLAkJc29ja2V0X250b2hsLAotCSBNRVRIX08sIG50b2hsX2RvY30sCi0JeyJodG9ucyIsCQlzb2NrZXRfaHRvbnMsCi0JIE1FVEhfVkFSQVJHUywgaHRvbnNfZG9jfSwKLQl7Imh0b25sIiwJCXNvY2tldF9odG9ubCwKLQkgTUVUSF9PLCBodG9ubF9kb2N9LAotCXsiaW5ldF9hdG9uIiwJCXNvY2tldF9pbmV0X2F0b24sCi0JIE1FVEhfVkFSQVJHUywgaW5ldF9hdG9uX2RvY30sCi0JeyJpbmV0X250b2EiLAkJc29ja2V0X2luZXRfbnRvYSwKLQkgTUVUSF9WQVJBUkdTLCBpbmV0X250b2FfZG9jfSwKKyAgICB7Im50b2hzIiwgICAgICAgICAgICAgICAgICAgc29ja2V0X250b2hzLAorICAgICBNRVRIX1ZBUkFSR1MsIG50b2hzX2RvY30sCisgICAgeyJudG9obCIsICAgICAgICAgICAgICAgICAgIHNvY2tldF9udG9obCwKKyAgICAgTUVUSF9PLCBudG9obF9kb2N9LAorICAgIHsiaHRvbnMiLCAgICAgICAgICAgICAgICAgICBzb2NrZXRfaHRvbnMsCisgICAgIE1FVEhfVkFSQVJHUywgaHRvbnNfZG9jfSwKKyAgICB7Imh0b25sIiwgICAgICAgICAgICAgICAgICAgc29ja2V0X2h0b25sLAorICAgICBNRVRIX08sIGh0b25sX2RvY30sCisgICAgeyJpbmV0X2F0b24iLCAgICAgICAgICAgICAgIHNvY2tldF9pbmV0X2F0b24sCisgICAgIE1FVEhfVkFSQVJHUywgaW5ldF9hdG9uX2RvY30sCisgICAgeyJpbmV0X250b2EiLCAgICAgICAgICAgICAgIHNvY2tldF9pbmV0X250b2EsCisgICAgIE1FVEhfVkFSQVJHUywgaW5ldF9udG9hX2RvY30sCiAjaWZkZWYgSEFWRV9JTkVUX1BUT04KLQl7ImluZXRfcHRvbiIsCQlzb2NrZXRfaW5ldF9wdG9uLAotCSBNRVRIX1ZBUkFSR1MsIGluZXRfcHRvbl9kb2N9LAotCXsiaW5ldF9udG9wIiwJCXNvY2tldF9pbmV0X250b3AsCi0JIE1FVEhfVkFSQVJHUywgaW5ldF9udG9wX2RvY30sCisgICAgeyJpbmV0X3B0b24iLCAgICAgICAgICAgICAgIHNvY2tldF9pbmV0X3B0b24sCisgICAgIE1FVEhfVkFSQVJHUywgaW5ldF9wdG9uX2RvY30sCisgICAgeyJpbmV0X250b3AiLCAgICAgICAgICAgICAgIHNvY2tldF9pbmV0X250b3AsCisgICAgIE1FVEhfVkFSQVJHUywgaW5ldF9udG9wX2RvY30sCiAjZW5kaWYKLQl7ImdldGFkZHJpbmZvIiwJCXNvY2tldF9nZXRhZGRyaW5mbywKLQkgTUVUSF9WQVJBUkdTLCBnZXRhZGRyaW5mb19kb2N9LAotCXsiZ2V0bmFtZWluZm8iLAkJc29ja2V0X2dldG5hbWVpbmZvLAotCSBNRVRIX1ZBUkFSR1MsIGdldG5hbWVpbmZvX2RvY30sCi0JeyJnZXRkZWZhdWx0dGltZW91dCIsCShQeUNGdW5jdGlvbilzb2NrZXRfZ2V0ZGVmYXVsdHRpbWVvdXQsCi0JIE1FVEhfTk9BUkdTLCBnZXRkZWZhdWx0dGltZW91dF9kb2N9LAotCXsic2V0ZGVmYXVsdHRpbWVvdXQiLAlzb2NrZXRfc2V0ZGVmYXVsdHRpbWVvdXQsCi0JIE1FVEhfTywgc2V0ZGVmYXVsdHRpbWVvdXRfZG9jfSwKLQl7TlVMTCwJCQlOVUxMfQkJIC8qIFNlbnRpbmVsICovCisgICAgeyJnZXRhZGRyaW5mbyIsICAgICAgICAgICAgIHNvY2tldF9nZXRhZGRyaW5mbywKKyAgICAgTUVUSF9WQVJBUkdTLCBnZXRhZGRyaW5mb19kb2N9LAorICAgIHsiZ2V0bmFtZWluZm8iLCAgICAgICAgICAgICBzb2NrZXRfZ2V0bmFtZWluZm8sCisgICAgIE1FVEhfVkFSQVJHUywgZ2V0bmFtZWluZm9fZG9jfSwKKyAgICB7ImdldGRlZmF1bHR0aW1lb3V0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tldF9nZXRkZWZhdWx0dGltZW91dCwKKyAgICAgTUVUSF9OT0FSR1MsIGdldGRlZmF1bHR0aW1lb3V0X2RvY30sCisgICAgeyJzZXRkZWZhdWx0dGltZW91dCIsICAgICAgIHNvY2tldF9zZXRkZWZhdWx0dGltZW91dCwKKyAgICAgTUVUSF9PLCBzZXRkZWZhdWx0dGltZW91dF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAKQEAgLTQzMTQsMTMgKzQzMTQsMTMgQEAKIHN0YXRpYyBpbnQKIG9zX2luaXQodm9pZCkKIHsKLQlfa2VybmVsX3N3aV9yZWdzIHI7CisgICAgX2tlcm5lbF9zd2lfcmVncyByOwogCi0Jci5yWzBdID0gMDsKLQlfa2VybmVsX3N3aSgweDQzMzgwLCAmciwgJnIpOwotCXRhc2t3aW5kb3cgPSByLnJbMF07CisgICAgci5yWzBdID0gMDsKKyAgICBfa2VybmVsX3N3aSgweDQzMzgwLCAmciwgJnIpOworICAgIHRhc2t3aW5kb3cgPSByLnJbMF07CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogI2VuZGlmIC8qIFJJU0NPUyAqLwpAQCAtNDMzNCwzNyArNDMzNCwzNyBAQAogc3RhdGljIHZvaWQKIG9zX2NsZWFudXAodm9pZCkKIHsKLQlXU0FDbGVhbnVwKCk7CisgICAgV1NBQ2xlYW51cCgpOwogfQogCiBzdGF0aWMgaW50CiBvc19pbml0KHZvaWQpCiB7Ci0JV1NBREFUQSBXU0FEYXRhOwotCWludCByZXQ7Ci0JY2hhciBidWZbMTAwXTsKLQlyZXQgPSBXU0FTdGFydHVwKDB4MDEwMSwgJldTQURhdGEpOwotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAwOgkvKiBObyBlcnJvciAqLwotCQlQeV9BdEV4aXQob3NfY2xlYW51cCk7Ci0JCXJldHVybiAxOyAvKiBTdWNjZXNzICovCi0JY2FzZSBXU0FTWVNOT1RSRUFEWToKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSJXU0FTdGFydHVwIGZhaWxlZDogbmV0d29yayBub3QgcmVhZHkiKTsKLQkJYnJlYWs7Ci0JY2FzZSBXU0FWRVJOT1RTVVBQT1JURUQ6Ci0JY2FzZSBXU0FFSU5WQUw6Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVB5RXhjX0ltcG9ydEVycm9yLAotCQkJIldTQVN0YXJ0dXAgZmFpbGVkOiByZXF1ZXN0ZWQgdmVyc2lvbiBub3Qgc3VwcG9ydGVkIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAgICJXU0FTdGFydHVwIGZhaWxlZDogZXJyb3IgY29kZSAlZCIsIHJldCk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgYnVmKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOyAvKiBGYWlsdXJlICovCisgICAgV1NBREFUQSBXU0FEYXRhOworICAgIGludCByZXQ7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICByZXQgPSBXU0FTdGFydHVwKDB4MDEwMSwgJldTQURhdGEpOworICAgIHN3aXRjaCAocmV0KSB7CisgICAgY2FzZSAwOiAgICAgLyogTm8gZXJyb3IgKi8KKyAgICAgICAgUHlfQXRFeGl0KG9zX2NsZWFudXApOworICAgICAgICByZXR1cm4gMTsgLyogU3VjY2VzcyAqLworICAgIGNhc2UgV1NBU1lTTk9UUkVBRFk6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJXU0FTdGFydHVwIGZhaWxlZDogbmV0d29yayBub3QgcmVhZHkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXU0FWRVJOT1RTVVBQT1JURUQ6CisgICAgY2FzZSBXU0FFSU5WQUw6CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgIldTQVN0YXJ0dXAgZmFpbGVkOiByZXF1ZXN0ZWQgdmVyc2lvbiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAiV1NBU3RhcnR1cCBmYWlsZWQ6IGVycm9yIGNvZGUgJWQiLCByZXQpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsgLyogRmFpbHVyZSAqLwogfQogCiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwpAQCAtNDM3OSwyMSArNDM3OSwyMSBAQAogb3NfaW5pdCh2b2lkKQogewogI2lmbmRlZiBQWUNDX0dDQwotCWNoYXIgcmVhc29uWzY0XTsKLQlpbnQgcmMgPSBzb2NrX2luaXQoKTsKKyAgICBjaGFyIHJlYXNvbls2NF07CisgICAgaW50IHJjID0gc29ja19pbml0KCk7CiAKLQlpZiAocmMgPT0gMCkgewotCQlyZXR1cm4gMTsgLyogU3VjY2VzcyAqLwotCX0KKyAgICBpZiAocmMgPT0gMCkgeworICAgICAgICByZXR1cm4gMTsgLyogU3VjY2VzcyAqLworICAgIH0KIAotCVB5T1Nfc25wcmludGYocmVhc29uLCBzaXplb2YocmVhc29uKSwKLQkJICAgICAgIk9TLzIgVENQL0lQIEVycm9yIyAlZCIsIHNvY2tfZXJybm8oKSk7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCByZWFzb24pOworICAgIFB5T1Nfc25wcmludGYocmVhc29uLCBzaXplb2YocmVhc29uKSwKKyAgICAgICAgICAgICAgICAgICJPUy8yIFRDUC9JUCBFcnJvciMgJWQiLCBzb2NrX2Vycm5vKCkpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgcmVhc29uKTsKIAotCXJldHVybiAwOyAgLyogRmFpbHVyZSAqLworICAgIHJldHVybiAwOyAgLyogRmFpbHVyZSAqLwogI2Vsc2UKLQkvKiBObyBuZWVkIHRvIGluaXRpYWxpc2Ugc29ja2V0cyB3aXRoIEdDQy9FTVggKi8KLQlyZXR1cm4gMTsgLyogU3VjY2VzcyAqLworICAgIC8qIE5vIG5lZWQgdG8gaW5pdGlhbGlzZSBzb2NrZXRzIHdpdGggR0NDL0VNWCAqLworICAgIHJldHVybiAxOyAvKiBTdWNjZXNzICovCiAjZW5kaWYKIH0KIApAQCAtNDQwNCw3ICs0NDA0LDcgQEAKIHN0YXRpYyBpbnQKIG9zX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gMTsgLyogU3VjY2VzcyAqLworICAgIHJldHVybiAxOyAvKiBTdWNjZXNzICovCiB9CiAjZW5kaWYKIApAQCAtNDQxNCw4ICs0NDE0LDggQEAKIHN0YXRpYwogUHlTb2NrZXRNb2R1bGVfQVBJT2JqZWN0IFB5U29ja2V0TW9kdWxlQVBJID0KIHsKLQkmc29ja190eXBlLAotICAgICAgICBOVUxMCisgICAgJnNvY2tfdHlwZSwKKyAgICBOVUxMCiB9OwogCiAKQEAgLTQ0NDAsOTE5ICs0NDQwLDkxOSBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRfc29ja2V0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpoYXNfaXB2NjsKKyAgICBQeU9iamVjdCAqbSwgKmhhc19pcHY2OwogCi0JaWYgKCFvc19pbml0KCkpCi0JCXJldHVybjsKKyAgICBpZiAoIW9zX2luaXQoKSkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfVFlQRSgmc29ja190eXBlKSA9ICZQeVR5cGVfVHlwZTsKLQltID0gUHlfSW5pdE1vZHVsZTMoUHlTb2NrZXRfTU9EVUxFX05BTUUsCi0JCQkgICBzb2NrZXRfbWV0aG9kcywKLQkJCSAgIHNvY2tldF9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBQeV9UWVBFKCZzb2NrX3R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMyhQeVNvY2tldF9NT0RVTEVfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X21ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCXNvY2tldF9lcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LmVycm9yIiwKLQkJCQkJICBQeUV4Y19JT0Vycm9yLCBOVUxMKTsKLQlpZiAoc29ja2V0X2Vycm9yID09IE5VTEwpCi0JCXJldHVybjsKLSAgICAgICAgUHlTb2NrZXRNb2R1bGVBUEkuZXJyb3IgPSBzb2NrZXRfZXJyb3I7Ci0JUHlfSU5DUkVGKHNvY2tldF9lcnJvcik7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIHNvY2tldF9lcnJvcik7Ci0Jc29ja2V0X2hlcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LmhlcnJvciIsCi0JCQkJCSAgIHNvY2tldF9lcnJvciwgTlVMTCk7Ci0JaWYgKHNvY2tldF9oZXJyb3IgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRihzb2NrZXRfaGVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImhlcnJvciIsIHNvY2tldF9oZXJyb3IpOwotCXNvY2tldF9nYWllcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LmdhaWVycm9yIiwgc29ja2V0X2Vycm9yLAotCSAgICBOVUxMKTsKLQlpZiAoc29ja2V0X2dhaWVycm9yID09IE5VTEwpCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoc29ja2V0X2dhaWVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImdhaWVycm9yIiwgc29ja2V0X2dhaWVycm9yKTsKLQlzb2NrZXRfdGltZW91dCA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LnRpbWVvdXQiLAotCQkJCQkgICAgc29ja2V0X2Vycm9yLCBOVUxMKTsKLQlpZiAoc29ja2V0X3RpbWVvdXQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRihzb2NrZXRfdGltZW91dCk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0aW1lb3V0Iiwgc29ja2V0X3RpbWVvdXQpOwotCVB5X0lOQ1JFRigoUHlPYmplY3QgKikmc29ja190eXBlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTb2NrZXRUeXBlIiwKLQkJCSAgICAgICAoUHlPYmplY3QgKikmc29ja190eXBlKSAhPSAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKChQeU9iamVjdCAqKSZzb2NrX3R5cGUpOwotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgInNvY2tldCIsCi0JCQkgICAgICAgKFB5T2JqZWN0ICopJnNvY2tfdHlwZSkgIT0gMCkKLQkJcmV0dXJuOworICAgIHNvY2tldF9lcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LmVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfSU9FcnJvciwgTlVMTCk7CisgICAgaWYgKHNvY2tldF9lcnJvciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlTb2NrZXRNb2R1bGVBUEkuZXJyb3IgPSBzb2NrZXRfZXJyb3I7CisgICAgUHlfSU5DUkVGKHNvY2tldF9lcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIHNvY2tldF9lcnJvcik7CisgICAgc29ja2V0X2hlcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LmhlcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfZXJyb3IsIE5VTEwpOworICAgIGlmIChzb2NrZXRfaGVycm9yID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoc29ja2V0X2hlcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJoZXJyb3IiLCBzb2NrZXRfaGVycm9yKTsKKyAgICBzb2NrZXRfZ2FpZXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNvY2tldC5nYWllcnJvciIsIHNvY2tldF9lcnJvciwKKyAgICAgICAgTlVMTCk7CisgICAgaWYgKHNvY2tldF9nYWllcnJvciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKHNvY2tldF9nYWllcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJnYWllcnJvciIsIHNvY2tldF9nYWllcnJvcik7CisgICAgc29ja2V0X3RpbWVvdXQgPSBQeUVycl9OZXdFeGNlcHRpb24oInNvY2tldC50aW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfZXJyb3IsIE5VTEwpOworICAgIGlmIChzb2NrZXRfdGltZW91dCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKHNvY2tldF90aW1lb3V0KTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInRpbWVvdXQiLCBzb2NrZXRfdGltZW91dCk7CisgICAgUHlfSU5DUkVGKChQeU9iamVjdCAqKSZzb2NrX3R5cGUpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNvY2tldFR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopJnNvY2tfdHlwZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikmc29ja190eXBlKTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzb2NrZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopJnNvY2tfdHlwZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogCiAjaWZkZWYgRU5BQkxFX0lQVjYKLQloYXNfaXB2NiA9IFB5X1RydWU7CisgICAgaGFzX2lwdjYgPSBQeV9UcnVlOwogI2Vsc2UKLQloYXNfaXB2NiA9IFB5X0ZhbHNlOworICAgIGhhc19pcHY2ID0gUHlfRmFsc2U7CiAjZW5kaWYKLQlQeV9JTkNSRUYoaGFzX2lwdjYpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiaGFzX2lwdjYiLCBoYXNfaXB2Nik7CisgICAgUHlfSU5DUkVGKGhhc19pcHY2KTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImhhc19pcHY2IiwgaGFzX2lwdjYpOwogCi0JLyogRXhwb3J0IEMgQVBJICovCi0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCBQeVNvY2tldF9DQVBJX05BTUUsCi0JICAgICAgIFB5Q2Fwc3VsZV9OZXcoJlB5U29ja2V0TW9kdWxlQVBJLCBQeVNvY2tldF9DQVBTVUxFX05BTUUsIE5VTEwpCi0JCQkJICkgIT0gMCkKLQkJcmV0dXJuOworICAgIC8qIEV4cG9ydCBDIEFQSSAqLworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgUHlTb2NrZXRfQ0FQSV9OQU1FLAorICAgICAgICAgICBQeUNhcHN1bGVfTmV3KCZQeVNvY2tldE1vZHVsZUFQSSwgUHlTb2NrZXRfQ0FQU1VMRV9OQU1FLCBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICE9IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZHJlc3MgZmFtaWxpZXMgKHdlIG9ubHkgc3VwcG9ydCBBRl9JTkVUIGFuZCBBRl9VTklYKSAqLworICAgIC8qIEFkZHJlc3MgZmFtaWxpZXMgKHdlIG9ubHkgc3VwcG9ydCBBRl9JTkVUIGFuZCBBRl9VTklYKSAqLwogI2lmZGVmIEFGX1VOU1BFQwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9VTlNQRUMiLCBBRl9VTlNQRUMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9VTlNQRUMiLCBBRl9VTlNQRUMpOwogI2VuZGlmCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0lORVQiLCBBRl9JTkVUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfSU5FVCIsIEFGX0lORVQpOwogI2lmZGVmIEFGX0lORVQ2Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0lORVQ2IiwgQUZfSU5FVDYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9JTkVUNiIsIEFGX0lORVQ2KTsKICNlbmRpZiAvKiBBRl9JTkVUNiAqLwogI2lmIGRlZmluZWQoQUZfVU5JWCkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfVU5JWCIsIEFGX1VOSVgpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9VTklYIiwgQUZfVU5JWCk7CiAjZW5kaWYgLyogQUZfVU5JWCAqLwogI2lmZGVmIEFGX0FYMjUKLQkvKiBBbWF0ZXVyIFJhZGlvIEFYLjI1ICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FYMjUiLCBBRl9BWDI1KTsKKyAgICAvKiBBbWF0ZXVyIFJhZGlvIEFYLjI1ICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FYMjUiLCBBRl9BWDI1KTsKICNlbmRpZgogI2lmZGVmIEFGX0lQWAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9JUFgiLCBBRl9JUFgpOyAvKiBOb3ZlbGwgSVBYICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0lQWCIsIEFGX0lQWCk7IC8qIE5vdmVsbCBJUFggKi8KICNlbmRpZgogI2lmZGVmIEFGX0FQUExFVEFMSwotCS8qIEFwcGxldGFsayBERFAgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQVBQTEVUQUxLIiwgQUZfQVBQTEVUQUxLKTsKKyAgICAvKiBBcHBsZXRhbGsgRERQICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FQUExFVEFMSyIsIEFGX0FQUExFVEFMSyk7CiAjZW5kaWYKICNpZmRlZiBBRl9ORVRST00KLQkvKiBBbWF0ZXVyIHJhZGlvIE5ldFJPTSAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ORVRST00iLCBBRl9ORVRST00pOworICAgIC8qIEFtYXRldXIgcmFkaW8gTmV0Uk9NICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX05FVFJPTSIsIEFGX05FVFJPTSk7CiAjZW5kaWYKICNpZmRlZiBBRl9CUklER0UKLQkvKiBNdWx0aXByb3RvY29sIGJyaWRnZSAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9CUklER0UiLCBBRl9CUklER0UpOworICAgIC8qIE11bHRpcHJvdG9jb2wgYnJpZGdlICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0JSSURHRSIsIEFGX0JSSURHRSk7CiAjZW5kaWYKICNpZmRlZiBBRl9BVE1QVkMKLQkvKiBBVE0gUFZDcyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BVE1QVkMiLCBBRl9BVE1QVkMpOworICAgIC8qIEFUTSBQVkNzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FUTVBWQyIsIEFGX0FUTVBWQyk7CiAjZW5kaWYKICNpZmRlZiBBRl9BQUw1Ci0JLyogUmVzZXJ2ZWQgZm9yIFdlcm5lcidzIEFUTSAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BQUw1IiwgQUZfQUFMNSk7CisgICAgLyogUmVzZXJ2ZWQgZm9yIFdlcm5lcidzIEFUTSAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BQUw1IiwgQUZfQUFMNSk7CiAjZW5kaWYKICNpZmRlZiBBRl9YMjUKLQkvKiBSZXNlcnZlZCBmb3IgWC4yNSBwcm9qZWN0ICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1gyNSIsIEFGX1gyNSk7CisgICAgLyogUmVzZXJ2ZWQgZm9yIFguMjUgcHJvamVjdCAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9YMjUiLCBBRl9YMjUpOwogI2VuZGlmCiAjaWZkZWYgQUZfSU5FVDYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfSU5FVDYiLCBBRl9JTkVUNik7IC8qIElQIHZlcnNpb24gNiAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9JTkVUNiIsIEFGX0lORVQ2KTsgLyogSVAgdmVyc2lvbiA2ICovCiAjZW5kaWYKICNpZmRlZiBBRl9ST1NFCi0JLyogQW1hdGV1ciBSYWRpbyBYLjI1IFBMUCAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ST1NFIiwgQUZfUk9TRSk7CisgICAgLyogQW1hdGV1ciBSYWRpbyBYLjI1IFBMUCAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ST1NFIiwgQUZfUk9TRSk7CiAjZW5kaWYKICNpZmRlZiBBRl9ERUNuZXQKLQkvKiBSZXNlcnZlZCBmb3IgREVDbmV0IHByb2plY3QgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfREVDbmV0IiwgQUZfREVDbmV0KTsKKyAgICAvKiBSZXNlcnZlZCBmb3IgREVDbmV0IHByb2plY3QgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfREVDbmV0IiwgQUZfREVDbmV0KTsKICNlbmRpZgogI2lmZGVmIEFGX05FVEJFVUkKLQkvKiBSZXNlcnZlZCBmb3IgODAyLjJMTEMgcHJvamVjdCAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ORVRCRVVJIiwgQUZfTkVUQkVVSSk7CisgICAgLyogUmVzZXJ2ZWQgZm9yIDgwMi4yTExDIHByb2plY3QgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfTkVUQkVVSSIsIEFGX05FVEJFVUkpOwogI2VuZGlmCiAjaWZkZWYgQUZfU0VDVVJJVFkKLQkvKiBTZWN1cml0eSBjYWxsYmFjayBwc2V1ZG8gQUYgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfU0VDVVJJVFkiLCBBRl9TRUNVUklUWSk7CisgICAgLyogU2VjdXJpdHkgY2FsbGJhY2sgcHNldWRvIEFGICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1NFQ1VSSVRZIiwgQUZfU0VDVVJJVFkpOwogI2VuZGlmCiAjaWZkZWYgQUZfS0VZCi0JLyogUEZfS0VZIGtleSBtYW5hZ2VtZW50IEFQSSAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9LRVkiLCBBRl9LRVkpOworICAgIC8qIFBGX0tFWSBrZXkgbWFuYWdlbWVudCBBUEkgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfS0VZIiwgQUZfS0VZKTsKICNlbmRpZgogI2lmZGVmIEFGX05FVExJTksKLQkvKiAgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfTkVUTElOSyIsIEFGX05FVExJTkspOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1JPVVRFIiwgTkVUTElOS19ST1VURSk7CisgICAgLyogICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX05FVExJTksiLCBBRl9ORVRMSU5LKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19ST1VURSIsIE5FVExJTktfUk9VVEUpOwogI2lmZGVmIE5FVExJTktfU0tJUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1NLSVAiLCBORVRMSU5LX1NLSVApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1NLSVAiLCBORVRMSU5LX1NLSVApOwogI2VuZGlmCiAjaWZkZWYgTkVUTElOS19XMQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1cxIiwgTkVUTElOS19XMSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfVzEiLCBORVRMSU5LX1cxKTsKICNlbmRpZgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1VTRVJTT0NLIiwgTkVUTElOS19VU0VSU09DSyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfRklSRVdBTEwiLCBORVRMSU5LX0ZJUkVXQUxMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19VU0VSU09DSyIsIE5FVExJTktfVVNFUlNPQ0spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0ZJUkVXQUxMIiwgTkVUTElOS19GSVJFV0FMTCk7CiAjaWZkZWYgTkVUTElOS19UQ1BESUFHCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfVENQRElBRyIsIE5FVExJTktfVENQRElBRyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfVENQRElBRyIsIE5FVExJTktfVENQRElBRyk7CiAjZW5kaWYKICNpZmRlZiBORVRMSU5LX05GTE9HCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfTkZMT0ciLCBORVRMSU5LX05GTE9HKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19ORkxPRyIsIE5FVExJTktfTkZMT0cpOwogI2VuZGlmCiAjaWZkZWYgTkVUTElOS19YRlJNCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfWEZSTSIsIE5FVExJTktfWEZSTSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfWEZSTSIsIE5FVExJTktfWEZSTSk7CiAjZW5kaWYKICNpZmRlZiBORVRMSU5LX0FSUEQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19BUlBEIiwgTkVUTElOS19BUlBEKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19BUlBEIiwgTkVUTElOS19BUlBEKTsKICNlbmRpZgogI2lmZGVmIE5FVExJTktfUk9VVEU2Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfUk9VVEU2IiwgTkVUTElOS19ST1VURTYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1JPVVRFNiIsIE5FVExJTktfUk9VVEU2KTsKICNlbmRpZgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0lQNl9GVyIsIE5FVExJTktfSVA2X0ZXKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19JUDZfRlciLCBORVRMSU5LX0lQNl9GVyk7CiAjaWZkZWYgTkVUTElOS19ETlJUTVNHCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfRE5SVE1TRyIsIE5FVExJTktfRE5SVE1TRyk7Ci0jZW5kaWYgCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfRE5SVE1TRyIsIE5FVExJTktfRE5SVE1TRyk7CisjZW5kaWYKICNpZmRlZiBORVRMSU5LX1RBUEJBU0UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19UQVBCQVNFIiwgTkVUTElOS19UQVBCQVNFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19UQVBCQVNFIiwgTkVUTElOS19UQVBCQVNFKTsKICNlbmRpZgogI2VuZGlmIC8qIEFGX05FVExJTksgKi8KICNpZmRlZiBBRl9ST1VURQotCS8qIEFsaWFzIHRvIGVtdWxhdGUgNC40QlNEICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1JPVVRFIiwgQUZfUk9VVEUpOworICAgIC8qIEFsaWFzIHRvIGVtdWxhdGUgNC40QlNEICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1JPVVRFIiwgQUZfUk9VVEUpOwogI2VuZGlmCiAjaWZkZWYgQUZfQVNICi0JLyogQXNoICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FTSCIsIEFGX0FTSCk7CisgICAgLyogQXNoICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FTSCIsIEFGX0FTSCk7CiAjZW5kaWYKICNpZmRlZiBBRl9FQ09ORVQKLQkvKiBBY29ybiBFY29uZXQgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfRUNPTkVUIiwgQUZfRUNPTkVUKTsKKyAgICAvKiBBY29ybiBFY29uZXQgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfRUNPTkVUIiwgQUZfRUNPTkVUKTsKICNlbmRpZgogI2lmZGVmIEFGX0FUTVNWQwotCS8qIEFUTSBTVkNzICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FUTVNWQyIsIEFGX0FUTVNWQyk7CisgICAgLyogQVRNIFNWQ3MgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQVRNU1ZDIiwgQUZfQVRNU1ZDKTsKICNlbmRpZgogI2lmZGVmIEFGX1NOQQotCS8qIExpbnV4IFNOQSBQcm9qZWN0IChudXR0ZXJzISkgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfU05BIiwgQUZfU05BKTsKKyAgICAvKiBMaW51eCBTTkEgUHJvamVjdCAobnV0dGVycyEpICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1NOQSIsIEFGX1NOQSk7CiAjZW5kaWYKICNpZmRlZiBBRl9JUkRBCi0JLyogSVJEQSBzb2NrZXRzICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0lSREEiLCBBRl9JUkRBKTsKKyAgICAvKiBJUkRBIHNvY2tldHMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfSVJEQSIsIEFGX0lSREEpOwogI2VuZGlmCiAjaWZkZWYgQUZfUFBQT1gKLQkvKiBQUFBvWCBzb2NrZXRzICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1BQUE9YIiwgQUZfUFBQT1gpOworICAgIC8qIFBQUG9YIHNvY2tldHMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfUFBQT1giLCBBRl9QUFBPWCk7CiAjZW5kaWYKICNpZmRlZiBBRl9XQU5QSVBFCi0JLyogV2FucGlwZSBBUEkgU29ja2V0cyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9XQU5QSVBFIiwgQUZfV0FOUElQRSk7CisgICAgLyogV2FucGlwZSBBUEkgU29ja2V0cyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9XQU5QSVBFIiwgQUZfV0FOUElQRSk7CiAjZW5kaWYKICNpZmRlZiBBRl9MTEMKLQkvKiBMaW51eCBMTEMgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfTExDIiwgQUZfTExDKTsKKyAgICAvKiBMaW51eCBMTEMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfTExDIiwgQUZfTExDKTsKICNlbmRpZgogCiAjaWZkZWYgVVNFX0JMVUVUT09USAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9CTFVFVE9PVEgiLCBBRl9CTFVFVE9PVEgpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCVFBST1RPX0wyQ0FQIiwgQlRQUk9UT19MMkNBUCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJUUFJPVE9fSENJIiwgQlRQUk9UT19IQ0kpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfSENJIiwgU09MX0hDSSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkhDSV9GSUxURVIiLCBIQ0lfRklMVEVSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQkxVRVRPT1RIIiwgQUZfQkxVRVRPT1RIKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQlRQUk9UT19MMkNBUCIsIEJUUFJPVE9fTDJDQVApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCVFBST1RPX0hDSSIsIEJUUFJPVE9fSENJKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0hDSSIsIFNPTF9IQ0kpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJIQ0lfRklMVEVSIiwgSENJX0ZJTFRFUik7CiAjaWYgIWRlZmluZWQoX19GcmVlQlNEX18pCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkhDSV9USU1FX1NUQU1QIiwgSENJX1RJTUVfU1RBTVApOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJIQ0lfREFUQV9ESVIiLCBIQ0lfREFUQV9ESVIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCVFBST1RPX1NDTyIsIEJUUFJPVE9fU0NPKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSENJX1RJTUVfU1RBTVAiLCBIQ0lfVElNRV9TVEFNUCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkhDSV9EQVRBX0RJUiIsIEhDSV9EQVRBX0RJUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJUUFJPVE9fU0NPIiwgQlRQUk9UT19TQ08pOwogI2VuZGlmCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJUUFJPVE9fUkZDT01NIiwgQlRQUk9UT19SRkNPTU0pOwotCVB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJCREFERFJfQU5ZIiwgIjAwOjAwOjAwOjAwOjAwOjAwIik7Ci0JUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIkJEQUREUl9MT0NBTCIsICIwMDowMDowMDpGRjpGRjpGRiIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCVFBST1RPX1JGQ09NTSIsIEJUUFJPVE9fUkZDT01NKTsKKyAgICBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiQkRBRERSX0FOWSIsICIwMDowMDowMDowMDowMDowMCIpOworICAgIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJCREFERFJfTE9DQUwiLCAiMDA6MDA6MDA6RkY6RkY6RkYiKTsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9ORVRQQUNLRVRfUEFDS0VUX0gKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfUEFDS0VUIiwgQUZfUEFDS0VUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEZfUEFDS0VUIiwgUEZfUEFDS0VUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX0hPU1QiLCBQQUNLRVRfSE9TVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9CUk9BRENBU1QiLCBQQUNLRVRfQlJPQURDQVNUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX01VTFRJQ0FTVCIsIFBBQ0tFVF9NVUxUSUNBU1QpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfT1RIRVJIT1NUIiwgUEFDS0VUX09USEVSSE9TVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9PVVRHT0lORyIsIFBBQ0tFVF9PVVRHT0lORyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9MT09QQkFDSyIsIFBBQ0tFVF9MT09QQkFDSyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9GQVNUUk9VVEUiLCBQQUNLRVRfRkFTVFJPVVRFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfUEFDS0VUIiwgQUZfUEFDS0VUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEZfUEFDS0VUIiwgUEZfUEFDS0VUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX0hPU1QiLCBQQUNLRVRfSE9TVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9CUk9BRENBU1QiLCBQQUNLRVRfQlJPQURDQVNUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX01VTFRJQ0FTVCIsIFBBQ0tFVF9NVUxUSUNBU1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfT1RIRVJIT1NUIiwgUEFDS0VUX09USEVSSE9TVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9PVVRHT0lORyIsIFBBQ0tFVF9PVVRHT0lORyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9MT09QQkFDSyIsIFBBQ0tFVF9MT09QQkFDSyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9GQVNUUk9VVEUiLCBQQUNLRVRfRkFTVFJPVVRFKTsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9MSU5VWF9USVBDX0gKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfVElQQyIsIEFGX1RJUEMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9USVBDIiwgQUZfVElQQyk7CiAKLQkvKiBmb3IgYWRkcmVzc2VzICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQUREUl9OQU1FU0VRIiwgVElQQ19BRERSX05BTUVTRVEpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0FERFJfTkFNRSIsIFRJUENfQUREUl9OQU1FKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19BRERSX0lEIiwgVElQQ19BRERSX0lEKTsKKyAgICAvKiBmb3IgYWRkcmVzc2VzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQUREUl9OQU1FU0VRIiwgVElQQ19BRERSX05BTUVTRVEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0FERFJfTkFNRSIsIFRJUENfQUREUl9OQU1FKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19BRERSX0lEIiwgVElQQ19BRERSX0lEKTsKIAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1pPTkVfU0NPUEUiLCBUSVBDX1pPTkVfU0NPUEUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0NMVVNURVJfU0NPUEUiLCBUSVBDX0NMVVNURVJfU0NPUEUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX05PREVfU0NPUEUiLCBUSVBDX05PREVfU0NPUEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1pPTkVfU0NPUEUiLCBUSVBDX1pPTkVfU0NPUEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0NMVVNURVJfU0NPUEUiLCBUSVBDX0NMVVNURVJfU0NPUEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX05PREVfU0NPUEUiLCBUSVBDX05PREVfU0NPUEUpOwogCi0JLyogZm9yIHNldHNvY2tvcHQoKSAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfVElQQyIsIFNPTF9USVBDKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19JTVBPUlRBTkNFIiwgVElQQ19JTVBPUlRBTkNFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19TUkNfRFJPUFBBQkxFIiwgVElQQ19TUkNfRFJPUFBBQkxFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19ERVNUX0RST1BQQUJMRSIsCi0JCQlUSVBDX0RFU1RfRFJPUFBBQkxFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19DT05OX1RJTUVPVVQiLCBUSVBDX0NPTk5fVElNRU9VVCk7CisgICAgLyogZm9yIHNldHNvY2tvcHQoKSAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfVElQQyIsIFNPTF9USVBDKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19JTVBPUlRBTkNFIiwgVElQQ19JTVBPUlRBTkNFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19TUkNfRFJPUFBBQkxFIiwgVElQQ19TUkNfRFJPUFBBQkxFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19ERVNUX0RST1BQQUJMRSIsCisgICAgICAgICAgICAgICAgICAgIFRJUENfREVTVF9EUk9QUEFCTEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0NPTk5fVElNRU9VVCIsIFRJUENfQ09OTl9USU1FT1VUKTsKIAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0xPV19JTVBPUlRBTkNFIiwKLQkJCVRJUENfTE9XX0lNUE9SVEFOQ0UpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX01FRElVTV9JTVBPUlRBTkNFIiwKLQkJCVRJUENfTUVESVVNX0lNUE9SVEFOQ0UpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0hJR0hfSU1QT1JUQU5DRSIsCi0JCQlUSVBDX0hJR0hfSU1QT1JUQU5DRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSIsCi0JCQlUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0xPV19JTVBPUlRBTkNFIiwKKyAgICAgICAgICAgICAgICAgICAgVElQQ19MT1dfSU1QT1JUQU5DRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfTUVESVVNX0lNUE9SVEFOQ0UiLAorICAgICAgICAgICAgICAgICAgICBUSVBDX01FRElVTV9JTVBPUlRBTkNFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19ISUdIX0lNUE9SVEFOQ0UiLAorICAgICAgICAgICAgICAgICAgICBUSVBDX0hJR0hfSU1QT1JUQU5DRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSIsCisgICAgICAgICAgICAgICAgICAgIFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSk7CiAKLQkvKiBmb3Igc3Vic2NyaXB0aW9ucyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1NVQl9QT1JUUyIsIFRJUENfU1VCX1BPUlRTKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19TVUJfU0VSVklDRSIsIFRJUENfU1VCX1NFUlZJQ0UpOworICAgIC8qIGZvciBzdWJzY3JpcHRpb25zICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfU1VCX1BPUlRTIiwgVElQQ19TVUJfUE9SVFMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1NVQl9TRVJWSUNFIiwgVElQQ19TVUJfU0VSVklDRSk7CiAjaWZkZWYgVElQQ19TVUJfQ0FOQ0VMCi0JLyogZG9lc24ndCBzZWVtIHRvIGJlIGF2YWlsYWJsZSBldmVyeXdoZXJlICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfU1VCX0NBTkNFTCIsIFRJUENfU1VCX0NBTkNFTCk7CisgICAgLyogZG9lc24ndCBzZWVtIHRvIGJlIGF2YWlsYWJsZSBldmVyeXdoZXJlICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfU1VCX0NBTkNFTCIsIFRJUENfU1VCX0NBTkNFTCk7CiAjZW5kaWYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19XQUlUX0ZPUkVWRVIiLCBUSVBDX1dBSVRfRk9SRVZFUik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfUFVCTElTSEVEIiwgVElQQ19QVUJMSVNIRUQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1dJVEhEUkFXTiIsIFRJUENfV0lUSERSQVdOKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19TVUJTQ1JfVElNRU9VVCIsIFRJUENfU1VCU0NSX1RJTUVPVVQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0NGR19TUlYiLCBUSVBDX0NGR19TUlYpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1RPUF9TUlYiLCBUSVBDX1RPUF9TUlYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1dBSVRfRk9SRVZFUiIsIFRJUENfV0FJVF9GT1JFVkVSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19QVUJMSVNIRUQiLCBUSVBDX1BVQkxJU0hFRCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfV0lUSERSQVdOIiwgVElQQ19XSVRIRFJBV04pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1NVQlNDUl9USU1FT1VUIiwgVElQQ19TVUJTQ1JfVElNRU9VVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQ0ZHX1NSViIsIFRJUENfQ0ZHX1NSVik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfVE9QX1NSViIsIFRJUENfVE9QX1NSVik7CiAjZW5kaWYKIAotCS8qIFNvY2tldCB0eXBlcyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0NLX1NUUkVBTSIsIFNPQ0tfU1RSRUFNKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09DS19ER1JBTSIsIFNPQ0tfREdSQU0pOworICAgIC8qIFNvY2tldCB0eXBlcyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0NLX1NUUkVBTSIsIFNPQ0tfU1RSRUFNKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09DS19ER1JBTSIsIFNPQ0tfREdSQU0pOwogI2lmbmRlZiBfX0JFT1NfXwogLyogV2UgaGF2ZSBpbmNvbXBsZXRlIHNvY2tldCBzdXBwb3J0LiAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0NLX1JBVyIsIFNPQ0tfUkFXKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09DS19TRVFQQUNLRVQiLCBTT0NLX1NFUVBBQ0tFVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPQ0tfUkFXIiwgU09DS19SQVcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0NLX1NFUVBBQ0tFVCIsIFNPQ0tfU0VRUEFDS0VUKTsKICNpZiBkZWZpbmVkKFNPQ0tfUkRNKQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0NLX1JETSIsIFNPQ0tfUkRNKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09DS19SRE0iLCBTT0NLX1JETSk7CiAjZW5kaWYKICNlbmRpZgogCi0jaWZkZWYJU09fREVCVUcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fREVCVUciLCBTT19ERUJVRyk7CisjaWZkZWYgIFNPX0RFQlVHCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0RFQlVHIiwgU09fREVCVUcpOwogI2VuZGlmCi0jaWZkZWYJU09fQUNDRVBUQ09OTgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19BQ0NFUFRDT05OIiwgU09fQUNDRVBUQ09OTik7CisjaWZkZWYgIFNPX0FDQ0VQVENPTk4KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fQUNDRVBUQ09OTiIsIFNPX0FDQ0VQVENPTk4pOwogI2VuZGlmCi0jaWZkZWYJU09fUkVVU0VBRERSCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1JFVVNFQUREUiIsIFNPX1JFVVNFQUREUik7CisjaWZkZWYgIFNPX1JFVVNFQUREUgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19SRVVTRUFERFIiLCBTT19SRVVTRUFERFIpOwogI2VuZGlmCiAjaWZkZWYgU09fRVhDTFVTSVZFQUREUlVTRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19FWENMVVNJVkVBRERSVVNFIiwgU09fRVhDTFVTSVZFQUREUlVTRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0VYQ0xVU0lWRUFERFJVU0UiLCBTT19FWENMVVNJVkVBRERSVVNFKTsKICNlbmRpZgogCi0jaWZkZWYJU09fS0VFUEFMSVZFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0tFRVBBTElWRSIsIFNPX0tFRVBBTElWRSk7CisjaWZkZWYgIFNPX0tFRVBBTElWRQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19LRUVQQUxJVkUiLCBTT19LRUVQQUxJVkUpOwogI2VuZGlmCi0jaWZkZWYJU09fRE9OVFJPVVRFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0RPTlRST1VURSIsIFNPX0RPTlRST1VURSk7CisjaWZkZWYgIFNPX0RPTlRST1VURQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19ET05UUk9VVEUiLCBTT19ET05UUk9VVEUpOwogI2VuZGlmCi0jaWZkZWYJU09fQlJPQURDQVNUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0JST0FEQ0FTVCIsIFNPX0JST0FEQ0FTVCk7CisjaWZkZWYgIFNPX0JST0FEQ0FTVAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19CUk9BRENBU1QiLCBTT19CUk9BRENBU1QpOwogI2VuZGlmCi0jaWZkZWYJU09fVVNFTE9PUEJBQ0sKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fVVNFTE9PUEJBQ0siLCBTT19VU0VMT09QQkFDSyk7CisjaWZkZWYgIFNPX1VTRUxPT1BCQUNLCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1VTRUxPT1BCQUNLIiwgU09fVVNFTE9PUEJBQ0spOwogI2VuZGlmCi0jaWZkZWYJU09fTElOR0VSCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0xJTkdFUiIsIFNPX0xJTkdFUik7CisjaWZkZWYgIFNPX0xJTkdFUgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19MSU5HRVIiLCBTT19MSU5HRVIpOwogI2VuZGlmCi0jaWZkZWYJU09fT09CSU5MSU5FCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX09PQklOTElORSIsIFNPX09PQklOTElORSk7CisjaWZkZWYgIFNPX09PQklOTElORQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19PT0JJTkxJTkUiLCBTT19PT0JJTkxJTkUpOwogI2VuZGlmCi0jaWZkZWYJU09fUkVVU0VQT1JUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1JFVVNFUE9SVCIsIFNPX1JFVVNFUE9SVCk7CisjaWZkZWYgIFNPX1JFVVNFUE9SVAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19SRVVTRVBPUlQiLCBTT19SRVVTRVBPUlQpOwogI2VuZGlmCi0jaWZkZWYJU09fU05EQlVGCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1NOREJVRiIsIFNPX1NOREJVRik7CisjaWZkZWYgIFNPX1NOREJVRgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19TTkRCVUYiLCBTT19TTkRCVUYpOwogI2VuZGlmCi0jaWZkZWYJU09fUkNWQlVGCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1JDVkJVRiIsIFNPX1JDVkJVRik7CisjaWZkZWYgIFNPX1JDVkJVRgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19SQ1ZCVUYiLCBTT19SQ1ZCVUYpOwogI2VuZGlmCi0jaWZkZWYJU09fU05ETE9XQVQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fU05ETE9XQVQiLCBTT19TTkRMT1dBVCk7CisjaWZkZWYgIFNPX1NORExPV0FUCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1NORExPV0FUIiwgU09fU05ETE9XQVQpOwogI2VuZGlmCi0jaWZkZWYJU09fUkNWTE9XQVQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fUkNWTE9XQVQiLCBTT19SQ1ZMT1dBVCk7CisjaWZkZWYgIFNPX1JDVkxPV0FUCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1JDVkxPV0FUIiwgU09fUkNWTE9XQVQpOwogI2VuZGlmCi0jaWZkZWYJU09fU05EVElNRU8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fU05EVElNRU8iLCBTT19TTkRUSU1FTyk7CisjaWZkZWYgIFNPX1NORFRJTUVPCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1NORFRJTUVPIiwgU09fU05EVElNRU8pOwogI2VuZGlmCi0jaWZkZWYJU09fUkNWVElNRU8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fUkNWVElNRU8iLCBTT19SQ1ZUSU1FTyk7CisjaWZkZWYgIFNPX1JDVlRJTUVPCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1JDVlRJTUVPIiwgU09fUkNWVElNRU8pOwogI2VuZGlmCi0jaWZkZWYJU09fRVJST1IKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fRVJST1IiLCBTT19FUlJPUik7CisjaWZkZWYgIFNPX0VSUk9SCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0VSUk9SIiwgU09fRVJST1IpOwogI2VuZGlmCi0jaWZkZWYJU09fVFlQRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19UWVBFIiwgU09fVFlQRSk7CisjaWZkZWYgIFNPX1RZUEUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fVFlQRSIsIFNPX1RZUEUpOwogI2VuZGlmCiAjaWZkZWYgU09fU0VURklCCiAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1NFVEZJQiIsIFNPX1NFVEZJQik7CiAjZW5kaWYKIAotCS8qIE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGZvciAibGlzdGVuIiAqLwotI2lmZGVmCVNPTUFYQ09OTgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT01BWENPTk4iLCBTT01BWENPTk4pOworICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGZvciAibGlzdGVuIiAqLworI2lmZGVmICBTT01BWENPTk4KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09NQVhDT05OIiwgU09NQVhDT05OKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTUFYQ09OTiIsIDUpOyAvKiBDb21tb24gdmFsdWUgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09NQVhDT05OIiwgNSk7IC8qIENvbW1vbiB2YWx1ZSAqLwogI2VuZGlmCiAKLQkvKiBGbGFncyBmb3Igc2VuZCwgcmVjdiAqLwotI2lmZGVmCU1TR19PT0IKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX09PQiIsIE1TR19PT0IpOworICAgIC8qIEZsYWdzIGZvciBzZW5kLCByZWN2ICovCisjaWZkZWYgIE1TR19PT0IKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX09PQiIsIE1TR19PT0IpOwogI2VuZGlmCi0jaWZkZWYJTVNHX1BFRUsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX1BFRUsiLCBNU0dfUEVFSyk7CisjaWZkZWYgIE1TR19QRUVLCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19QRUVLIiwgTVNHX1BFRUspOwogI2VuZGlmCi0jaWZkZWYJTVNHX0RPTlRST1VURQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfRE9OVFJPVVRFIiwgTVNHX0RPTlRST1VURSk7CisjaWZkZWYgIE1TR19ET05UUk9VVEUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0RPTlRST1VURSIsIE1TR19ET05UUk9VVEUpOwogI2VuZGlmCi0jaWZkZWYJTVNHX0RPTlRXQUlUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19ET05UV0FJVCIsIE1TR19ET05UV0FJVCk7CisjaWZkZWYgIE1TR19ET05UV0FJVAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfRE9OVFdBSVQiLCBNU0dfRE9OVFdBSVQpOwogI2VuZGlmCi0jaWZkZWYJTVNHX0VPUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfRU9SIiwgTVNHX0VPUik7CisjaWZkZWYgIE1TR19FT1IKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0VPUiIsIE1TR19FT1IpOwogI2VuZGlmCi0jaWZkZWYJTVNHX1RSVU5DCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19UUlVOQyIsIE1TR19UUlVOQyk7CisjaWZkZWYgIE1TR19UUlVOQworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfVFJVTkMiLCBNU0dfVFJVTkMpOwogI2VuZGlmCi0jaWZkZWYJTVNHX0NUUlVOQwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfQ1RSVU5DIiwgTVNHX0NUUlVOQyk7CisjaWZkZWYgIE1TR19DVFJVTkMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0NUUlVOQyIsIE1TR19DVFJVTkMpOwogI2VuZGlmCi0jaWZkZWYJTVNHX1dBSVRBTEwKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX1dBSVRBTEwiLCBNU0dfV0FJVEFMTCk7CisjaWZkZWYgIE1TR19XQUlUQUxMCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19XQUlUQUxMIiwgTVNHX1dBSVRBTEwpOwogI2VuZGlmCi0jaWZkZWYJTVNHX0JUQUcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0JUQUciLCBNU0dfQlRBRyk7CisjaWZkZWYgIE1TR19CVEFHCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19CVEFHIiwgTVNHX0JUQUcpOwogI2VuZGlmCi0jaWZkZWYJTVNHX0VUQUcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0VUQUciLCBNU0dfRVRBRyk7CisjaWZkZWYgIE1TR19FVEFHCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19FVEFHIiwgTVNHX0VUQUcpOwogI2VuZGlmCiAKLQkvKiBQcm90b2NvbCBsZXZlbCBhbmQgbnVtYmVycywgdXNhYmxlIGZvciBbZ3NdZXRzb2Nrb3B0ICovCi0jaWZkZWYJU09MX1NPQ0tFVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfU09DS0VUIiwgU09MX1NPQ0tFVCk7CisgICAgLyogUHJvdG9jb2wgbGV2ZWwgYW5kIG51bWJlcnMsIHVzYWJsZSBmb3IgW2dzXWV0c29ja29wdCAqLworI2lmZGVmICBTT0xfU09DS0VUCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9TT0NLRVQiLCBTT0xfU09DS0VUKTsKICNlbmRpZgotI2lmZGVmCVNPTF9JUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfSVAiLCBTT0xfSVApOworI2lmZGVmICBTT0xfSVAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0lQIiwgU09MX0lQKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9JUCIsIDApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfSVAiLCAwKTsKICNlbmRpZgotI2lmZGVmCVNPTF9JUFgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0lQWCIsIFNPTF9JUFgpOworI2lmZGVmICBTT0xfSVBYCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9JUFgiLCBTT0xfSVBYKTsKICNlbmRpZgotI2lmZGVmCVNPTF9BWDI1Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9BWDI1IiwgU09MX0FYMjUpOworI2lmZGVmICBTT0xfQVgyNQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfQVgyNSIsIFNPTF9BWDI1KTsKICNlbmRpZgotI2lmZGVmCVNPTF9BVEFMSwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfQVRBTEsiLCBTT0xfQVRBTEspOworI2lmZGVmICBTT0xfQVRBTEsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0FUQUxLIiwgU09MX0FUQUxLKTsKICNlbmRpZgotI2lmZGVmCVNPTF9ORVRST00KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX05FVFJPTSIsIFNPTF9ORVRST00pOworI2lmZGVmICBTT0xfTkVUUk9NCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9ORVRST00iLCBTT0xfTkVUUk9NKTsKICNlbmRpZgotI2lmZGVmCVNPTF9ST1NFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9ST1NFIiwgU09MX1JPU0UpOworI2lmZGVmICBTT0xfUk9TRQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfUk9TRSIsIFNPTF9ST1NFKTsKICNlbmRpZgotI2lmZGVmCVNPTF9UQ1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1RDUCIsIFNPTF9UQ1ApOworI2lmZGVmICBTT0xfVENQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9UQ1AiLCBTT0xfVENQKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9UQ1AiLCA2KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1RDUCIsIDYpOwogI2VuZGlmCi0jaWZkZWYJU09MX1VEUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfVURQIiwgU09MX1VEUCk7CisjaWZkZWYgIFNPTF9VRFAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1VEUCIsIFNPTF9VRFApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1VEUCIsIDE3KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1VEUCIsIDE3KTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUCIsIElQUFJPVE9fSVApOworI2lmZGVmICBJUFBST1RPX0lQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVAiLCBJUFBST1RPX0lQKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVAiLCAwKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUCIsIDApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19IT1BPUFRTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSE9QT1BUUyIsIElQUFJPVE9fSE9QT1BUUyk7CisjaWZkZWYgIElQUFJPVE9fSE9QT1BUUworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0hPUE9QVFMiLCBJUFBST1RPX0hPUE9QVFMpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JQ01QCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUNNUCIsIElQUFJPVE9fSUNNUCk7CisjaWZkZWYgIElQUFJPVE9fSUNNUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lDTVAiLCBJUFBST1RPX0lDTVApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JQ01QIiwgMSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUNNUCIsIDEpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JR01QCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUdNUCIsIElQUFJPVE9fSUdNUCk7CisjaWZkZWYgIElQUFJPVE9fSUdNUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lHTVAiLCBJUFBST1RPX0lHTVApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19HR1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19HR1AiLCBJUFBST1RPX0dHUCk7CisjaWZkZWYgIElQUFJPVE9fR0dQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fR0dQIiwgSVBQUk9UT19HR1ApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JUFY0Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBWNCIsIElQUFJPVE9fSVBWNCk7CisjaWZkZWYgIElQUFJPVE9fSVBWNAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQVjQiLCBJUFBST1RPX0lQVjQpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JUFY2Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBWNiIsIElQUFJPVE9fSVBWNik7CisjaWZkZWYgIElQUFJPVE9fSVBWNgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQVjYiLCBJUFBST1RPX0lQVjYpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JUElQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBJUCIsIElQUFJPVE9fSVBJUCk7CisjaWZkZWYgIElQUFJPVE9fSVBJUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQSVAiLCBJUFBST1RPX0lQSVApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19UQ1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19UQ1AiLCBJUFBST1RPX1RDUCk7CisjaWZkZWYgIElQUFJPVE9fVENQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fVENQIiwgSVBQUk9UT19UQ1ApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19UQ1AiLCA2KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19UQ1AiLCA2KTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fRUdQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRUdQIiwgSVBQUk9UT19FR1ApOworI2lmZGVmICBJUFBST1RPX0VHUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0VHUCIsIElQUFJPVE9fRUdQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fUFVQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUFVQIiwgSVBQUk9UT19QVVApOworI2lmZGVmICBJUFBST1RPX1BVUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1BVUCIsIElQUFJPVE9fUFVQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fVURQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fVURQIiwgSVBQUk9UT19VRFApOworI2lmZGVmICBJUFBST1RPX1VEUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1VEUCIsIElQUFJPVE9fVURQKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fVURQIiwgMTcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1VEUCIsIDE3KTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSURQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSURQIiwgSVBQUk9UT19JRFApOworI2lmZGVmICBJUFBST1RPX0lEUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lEUCIsIElQUFJPVE9fSURQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSEVMTE8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19IRUxMTyIsIElQUFJPVE9fSEVMTE8pOworI2lmZGVmICBJUFBST1RPX0hFTExPCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSEVMTE8iLCBJUFBST1RPX0hFTExPKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fTkQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19ORCIsIElQUFJPVE9fTkQpOworI2lmZGVmICBJUFBST1RPX05ECisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fTkQiLCBJUFBST1RPX05EKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fVFAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19UUCIsIElQUFJPVE9fVFApOworI2lmZGVmICBJUFBST1RPX1RQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fVFAiLCBJUFBST1RPX1RQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSVBWNgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQVjYiLCBJUFBST1RPX0lQVjYpOworI2lmZGVmICBJUFBST1RPX0lQVjYKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUFY2IiwgSVBQUk9UT19JUFY2KTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fUk9VVElORwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1JPVVRJTkciLCBJUFBST1RPX1JPVVRJTkcpOworI2lmZGVmICBJUFBST1RPX1JPVVRJTkcKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19ST1VUSU5HIiwgSVBQUk9UT19ST1VUSU5HKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fRlJBR01FTlQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19GUkFHTUVOVCIsIElQUFJPVE9fRlJBR01FTlQpOworI2lmZGVmICBJUFBST1RPX0ZSQUdNRU5UCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRlJBR01FTlQiLCBJUFBST1RPX0ZSQUdNRU5UKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fUlNWUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1JTVlAiLCBJUFBST1RPX1JTVlApOworI2lmZGVmICBJUFBST1RPX1JTVlAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19SU1ZQIiwgSVBQUk9UT19SU1ZQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fR1JFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fR1JFIiwgSVBQUk9UT19HUkUpOworI2lmZGVmICBJUFBST1RPX0dSRQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0dSRSIsIElQUFJPVE9fR1JFKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fRVNQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRVNQIiwgSVBQUk9UT19FU1ApOworI2lmZGVmICBJUFBST1RPX0VTUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0VTUCIsIElQUFJPVE9fRVNQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fQUgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19BSCIsIElQUFJPVE9fQUgpOworI2lmZGVmICBJUFBST1RPX0FICisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fQUgiLCBJUFBST1RPX0FIKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fTU9CSUxFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fTU9CSUxFIiwgSVBQUk9UT19NT0JJTEUpOworI2lmZGVmICBJUFBST1RPX01PQklMRQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX01PQklMRSIsIElQUFJPVE9fTU9CSUxFKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSUNNUFY2Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUNNUFY2IiwgSVBQUk9UT19JQ01QVjYpOworI2lmZGVmICBJUFBST1RPX0lDTVBWNgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lDTVBWNiIsIElQUFJPVE9fSUNNUFY2KTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fTk9ORQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX05PTkUiLCBJUFBST1RPX05PTkUpOworI2lmZGVmICBJUFBST1RPX05PTkUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19OT05FIiwgSVBQUk9UT19OT05FKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fRFNUT1BUUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0RTVE9QVFMiLCBJUFBST1RPX0RTVE9QVFMpOworI2lmZGVmICBJUFBST1RPX0RTVE9QVFMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19EU1RPUFRTIiwgSVBQUk9UT19EU1RPUFRTKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fWFRQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fWFRQIiwgSVBQUk9UT19YVFApOworI2lmZGVmICBJUFBST1RPX1hUUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1hUUCIsIElQUFJPVE9fWFRQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fRU9OCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRU9OIiwgSVBQUk9UT19FT04pOworI2lmZGVmICBJUFBST1RPX0VPTgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0VPTiIsIElQUFJPVE9fRU9OKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fUElNCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUElNIiwgSVBQUk9UT19QSU0pOworI2lmZGVmICBJUFBST1RPX1BJTQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1BJTSIsIElQUFJPVE9fUElNKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fSVBDT01QCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBDT01QIiwgSVBQUk9UT19JUENPTVApOworI2lmZGVmICBJUFBST1RPX0lQQ09NUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQQ09NUCIsIElQUFJPVE9fSVBDT01QKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fVlJSUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1ZSUlAiLCBJUFBST1RPX1ZSUlApOworI2lmZGVmICBJUFBST1RPX1ZSUlAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19WUlJQIiwgSVBQUk9UT19WUlJQKTsKICNlbmRpZgotI2lmZGVmCUlQUFJPVE9fQklQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fQklQIiwgSVBQUk9UT19CSVApOworI2lmZGVmICBJUFBST1RPX0JJUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0JJUCIsIElQUFJPVE9fQklQKTsKICNlbmRpZgogLyoqLwotI2lmZGVmCUlQUFJPVE9fUkFXCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUkFXIiwgSVBQUk9UT19SQVcpOworI2lmZGVmICBJUFBST1RPX1JBVworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1JBVyIsIElQUFJPVE9fUkFXKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUkFXIiwgMjU1KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19SQVciLCAyNTUpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19NQVgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19NQVgiLCBJUFBST1RPX01BWCk7CisjaWZkZWYgIElQUFJPVE9fTUFYCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fTUFYIiwgSVBQUk9UT19NQVgpOwogI2VuZGlmCiAKLQkvKiBTb21lIHBvcnQgY29uZmlndXJhdGlvbiAqLwotI2lmZGVmCUlQUE9SVF9SRVNFUlZFRAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfUkVTRVJWRUQiLCBJUFBPUlRfUkVTRVJWRUQpOworICAgIC8qIFNvbWUgcG9ydCBjb25maWd1cmF0aW9uICovCisjaWZkZWYgIElQUE9SVF9SRVNFUlZFRAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfUkVTRVJWRUQiLCBJUFBPUlRfUkVTRVJWRUQpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQT1JUX1JFU0VSVkVEIiwgMTAyNCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUE9SVF9SRVNFUlZFRCIsIDEwMjQpOwogI2VuZGlmCi0jaWZkZWYJSVBQT1JUX1VTRVJSRVNFUlZFRAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfVVNFUlJFU0VSVkVEIiwgSVBQT1JUX1VTRVJSRVNFUlZFRCk7CisjaWZkZWYgIElQUE9SVF9VU0VSUkVTRVJWRUQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQT1JUX1VTRVJSRVNFUlZFRCIsIElQUE9SVF9VU0VSUkVTRVJWRUQpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQT1JUX1VTRVJSRVNFUlZFRCIsIDUwMDApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfVVNFUlJFU0VSVkVEIiwgNTAwMCk7CiAjZW5kaWYKIAotCS8qIFNvbWUgcmVzZXJ2ZWQgSVAgdi40IGFkZHJlc3NlcyAqLwotI2lmZGVmCUlOQUREUl9BTlkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0FOWSIsIElOQUREUl9BTlkpOworICAgIC8qIFNvbWUgcmVzZXJ2ZWQgSVAgdi40IGFkZHJlc3NlcyAqLworI2lmZGVmICBJTkFERFJfQU5ZCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9BTlkiLCBJTkFERFJfQU5ZKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9BTlkiLCAweDAwMDAwMDAwKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0FOWSIsIDB4MDAwMDAwMDApOwogI2VuZGlmCi0jaWZkZWYJSU5BRERSX0JST0FEQ0FTVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQlJPQURDQVNUIiwgSU5BRERSX0JST0FEQ0FTVCk7CisjaWZkZWYgIElOQUREUl9CUk9BRENBU1QKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0JST0FEQ0FTVCIsIElOQUREUl9CUk9BRENBU1QpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0JST0FEQ0FTVCIsIDB4ZmZmZmZmZmYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQlJPQURDQVNUIiwgMHhmZmZmZmZmZik7CiAjZW5kaWYKLSNpZmRlZglJTkFERFJfTE9PUEJBQ0sKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0xPT1BCQUNLIiwgSU5BRERSX0xPT1BCQUNLKTsKKyNpZmRlZiAgSU5BRERSX0xPT1BCQUNLCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9MT09QQkFDSyIsIElOQUREUl9MT09QQkFDSyk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTE9PUEJBQ0siLCAweDdGMDAwMDAxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0xPT1BCQUNLIiwgMHg3RjAwMDAwMSk7CiAjZW5kaWYKLSNpZmRlZglJTkFERFJfVU5TUEVDX0dST1VQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9VTlNQRUNfR1JPVVAiLCBJTkFERFJfVU5TUEVDX0dST1VQKTsKKyNpZmRlZiAgSU5BRERSX1VOU1BFQ19HUk9VUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfVU5TUEVDX0dST1VQIiwgSU5BRERSX1VOU1BFQ19HUk9VUCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfVU5TUEVDX0dST1VQIiwgMHhlMDAwMDAwMCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9VTlNQRUNfR1JPVVAiLCAweGUwMDAwMDAwKTsKICNlbmRpZgotI2lmZGVmCUlOQUREUl9BTExIT1NUU19HUk9VUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQUxMSE9TVFNfR1JPVVAiLAotCQkJCUlOQUREUl9BTExIT1NUU19HUk9VUCk7CisjaWZkZWYgIElOQUREUl9BTExIT1NUU19HUk9VUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQUxMSE9TVFNfR1JPVVAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQUREUl9BTExIT1NUU19HUk9VUCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQUxMSE9TVFNfR1JPVVAiLCAweGUwMDAwMDAxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0FMTEhPU1RTX0dST1VQIiwgMHhlMDAwMDAwMSk7CiAjZW5kaWYKLSNpZmRlZglJTkFERFJfTUFYX0xPQ0FMX0dST1VQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9NQVhfTE9DQUxfR1JPVVAiLAotCQkJCUlOQUREUl9NQVhfTE9DQUxfR1JPVVApOworI2lmZGVmICBJTkFERFJfTUFYX0xPQ0FMX0dST1VQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9NQVhfTE9DQUxfR1JPVVAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQUREUl9NQVhfTE9DQUxfR1JPVVApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX01BWF9MT0NBTF9HUk9VUCIsIDB4ZTAwMDAwZmYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTUFYX0xPQ0FMX0dST1VQIiwgMHhlMDAwMDBmZik7CiAjZW5kaWYKLSNpZmRlZglJTkFERFJfTk9ORQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTk9ORSIsIElOQUREUl9OT05FKTsKKyNpZmRlZiAgSU5BRERSX05PTkUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX05PTkUiLCBJTkFERFJfTk9ORSk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTk9ORSIsIDB4ZmZmZmZmZmYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTk9ORSIsIDB4ZmZmZmZmZmYpOwogI2VuZGlmCiAKLQkvKiBJUHY0IFtnc11ldHNvY2tvcHQgb3B0aW9ucyAqLwotI2lmZGVmCUlQX09QVElPTlMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfT1BUSU9OUyIsIElQX09QVElPTlMpOworICAgIC8qIElQdjQgW2dzXWV0c29ja29wdCBvcHRpb25zICovCisjaWZkZWYgIElQX09QVElPTlMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfT1BUSU9OUyIsIElQX09QVElPTlMpOwogI2VuZGlmCi0jaWZkZWYJSVBfSERSSU5DTAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9IRFJJTkNMIiwgSVBfSERSSU5DTCk7CisjaWZkZWYgIElQX0hEUklOQ0wKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfSERSSU5DTCIsIElQX0hEUklOQ0wpOwogI2VuZGlmCi0jaWZkZWYJSVBfVE9TCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1RPUyIsIElQX1RPUyk7CisjaWZkZWYgIElQX1RPUworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9UT1MiLCBJUF9UT1MpOwogI2VuZGlmCi0jaWZkZWYJSVBfVFRMCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1RUTCIsIElQX1RUTCk7CisjaWZkZWYgIElQX1RUTAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9UVEwiLCBJUF9UVEwpOwogI2VuZGlmCi0jaWZkZWYJSVBfUkVDVk9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVDVk9QVFMiLCBJUF9SRUNWT1BUUyk7CisjaWZkZWYgIElQX1JFQ1ZPUFRTCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1JFQ1ZPUFRTIiwgSVBfUkVDVk9QVFMpOwogI2VuZGlmCi0jaWZkZWYJSVBfUkVDVlJFVE9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVDVlJFVE9QVFMiLCBJUF9SRUNWUkVUT1BUUyk7CisjaWZkZWYgIElQX1JFQ1ZSRVRPUFRTCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1JFQ1ZSRVRPUFRTIiwgSVBfUkVDVlJFVE9QVFMpOwogI2VuZGlmCi0jaWZkZWYJSVBfUkVDVkRTVEFERFIKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVDVkRTVEFERFIiLCBJUF9SRUNWRFNUQUREUik7CisjaWZkZWYgIElQX1JFQ1ZEU1RBRERSCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1JFQ1ZEU1RBRERSIiwgSVBfUkVDVkRTVEFERFIpOwogI2VuZGlmCi0jaWZkZWYJSVBfUkVUT1BUUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9SRVRPUFRTIiwgSVBfUkVUT1BUUyk7CisjaWZkZWYgIElQX1JFVE9QVFMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVUT1BUUyIsIElQX1JFVE9QVFMpOwogI2VuZGlmCi0jaWZkZWYJSVBfTVVMVElDQVNUX0lGCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX01VTFRJQ0FTVF9JRiIsIElQX01VTFRJQ0FTVF9JRik7CisjaWZkZWYgIElQX01VTFRJQ0FTVF9JRgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9NVUxUSUNBU1RfSUYiLCBJUF9NVUxUSUNBU1RfSUYpOwogI2VuZGlmCi0jaWZkZWYJSVBfTVVMVElDQVNUX1RUTAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9NVUxUSUNBU1RfVFRMIiwgSVBfTVVMVElDQVNUX1RUTCk7CisjaWZkZWYgIElQX01VTFRJQ0FTVF9UVEwKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfTVVMVElDQVNUX1RUTCIsIElQX01VTFRJQ0FTVF9UVEwpOwogI2VuZGlmCi0jaWZkZWYJSVBfTVVMVElDQVNUX0xPT1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfTVVMVElDQVNUX0xPT1AiLCBJUF9NVUxUSUNBU1RfTE9PUCk7CisjaWZkZWYgIElQX01VTFRJQ0FTVF9MT09QCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX01VTFRJQ0FTVF9MT09QIiwgSVBfTVVMVElDQVNUX0xPT1ApOwogI2VuZGlmCi0jaWZkZWYJSVBfQUREX01FTUJFUlNISVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfQUREX01FTUJFUlNISVAiLCBJUF9BRERfTUVNQkVSU0hJUCk7CisjaWZkZWYgIElQX0FERF9NRU1CRVJTSElQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX0FERF9NRU1CRVJTSElQIiwgSVBfQUREX01FTUJFUlNISVApOwogI2VuZGlmCi0jaWZkZWYJSVBfRFJPUF9NRU1CRVJTSElQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX0RST1BfTUVNQkVSU0hJUCIsIElQX0RST1BfTUVNQkVSU0hJUCk7CisjaWZkZWYgIElQX0RST1BfTUVNQkVSU0hJUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9EUk9QX01FTUJFUlNISVAiLCBJUF9EUk9QX01FTUJFUlNISVApOwogI2VuZGlmCi0jaWZkZWYJSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX0RFRkFVTFRfTVVMVElDQVNUX1RUTCIsCi0JCQkJSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMKTsKKyNpZmRlZiAgSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX0RFRkFVTFRfTVVMVElDQVNUX1RUTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMKTsKICNlbmRpZgotI2lmZGVmCUlQX0RFRkFVTFRfTVVMVElDQVNUX0xPT1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCIsCi0JCQkJSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCk7CisjaWZkZWYgIElQX0RFRkFVTFRfTVVMVElDQVNUX0xPT1AKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCk7CiAjZW5kaWYKLSNpZmRlZglJUF9NQVhfTUVNQkVSU0hJUFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfTUFYX01FTUJFUlNISVBTIiwgSVBfTUFYX01FTUJFUlNISVBTKTsKKyNpZmRlZiAgSVBfTUFYX01FTUJFUlNISVBTCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX01BWF9NRU1CRVJTSElQUyIsIElQX01BWF9NRU1CRVJTSElQUyk7CiAjZW5kaWYKIAotCS8qIElQdjYgW2dzXWV0c29ja29wdCBvcHRpb25zLCBkZWZpbmVkIGluIFJGQzI1NTMgKi8KLSNpZmRlZglJUFY2X0pPSU5fR1JPVVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9KT0lOX0dST1VQIiwgSVBWNl9KT0lOX0dST1VQKTsKKyAgICAvKiBJUHY2IFtnc11ldHNvY2tvcHQgb3B0aW9ucywgZGVmaW5lZCBpbiBSRkMyNTUzICovCisjaWZkZWYgIElQVjZfSk9JTl9HUk9VUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0pPSU5fR1JPVVAiLCBJUFY2X0pPSU5fR1JPVVApOwogI2VuZGlmCi0jaWZkZWYJSVBWNl9MRUFWRV9HUk9VUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0xFQVZFX0dST1VQIiwgSVBWNl9MRUFWRV9HUk9VUCk7CisjaWZkZWYgIElQVjZfTEVBVkVfR1JPVVAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9MRUFWRV9HUk9VUCIsIElQVjZfTEVBVkVfR1JPVVApOwogI2VuZGlmCi0jaWZkZWYJSVBWNl9NVUxUSUNBU1RfSE9QUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X01VTFRJQ0FTVF9IT1BTIiwgSVBWNl9NVUxUSUNBU1RfSE9QUyk7CisjaWZkZWYgIElQVjZfTVVMVElDQVNUX0hPUFMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9NVUxUSUNBU1RfSE9QUyIsIElQVjZfTVVMVElDQVNUX0hPUFMpOwogI2VuZGlmCi0jaWZkZWYJSVBWNl9NVUxUSUNBU1RfSUYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9NVUxUSUNBU1RfSUYiLCBJUFY2X01VTFRJQ0FTVF9JRik7CisjaWZkZWYgIElQVjZfTVVMVElDQVNUX0lGCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfTVVMVElDQVNUX0lGIiwgSVBWNl9NVUxUSUNBU1RfSUYpOwogI2VuZGlmCi0jaWZkZWYJSVBWNl9NVUxUSUNBU1RfTE9PUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X01VTFRJQ0FTVF9MT09QIiwgSVBWNl9NVUxUSUNBU1RfTE9PUCk7CisjaWZkZWYgIElQVjZfTVVMVElDQVNUX0xPT1AKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9NVUxUSUNBU1RfTE9PUCIsIElQVjZfTVVMVElDQVNUX0xPT1ApOwogI2VuZGlmCi0jaWZkZWYJSVBWNl9VTklDQVNUX0hPUFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9VTklDQVNUX0hPUFMiLCBJUFY2X1VOSUNBU1RfSE9QUyk7CisjaWZkZWYgIElQVjZfVU5JQ0FTVF9IT1BTCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfVU5JQ0FTVF9IT1BTIiwgSVBWNl9VTklDQVNUX0hPUFMpOwogI2VuZGlmCi0gICAgICAgIC8qIEFkZGl0aW9uYWwgSVBWNiBzb2NrZXQgb3B0aW9ucywgZGVmaW5lZCBpbiBSRkMgMzQ5MyAqLworICAgIC8qIEFkZGl0aW9uYWwgSVBWNiBzb2NrZXQgb3B0aW9ucywgZGVmaW5lZCBpbiBSRkMgMzQ5MyAqLwogI2lmZGVmIElQVjZfVjZPTkxZCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfVjZPTkxZIiwgSVBWNl9WNk9OTFkpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1Y2T05MWSIsIElQVjZfVjZPTkxZKTsKICNlbmRpZgotCS8qIEFkdmFuY2VkIElQVjYgc29ja2V0IG9wdGlvbnMsIGZyb20gUkZDIDM1NDIgKi8KKyAgICAvKiBBZHZhbmNlZCBJUFY2IHNvY2tldCBvcHRpb25zLCBmcm9tIFJGQyAzNTQyICovCiAjaWZkZWYgSVBWNl9DSEVDS1NVTQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0NIRUNLU1VNIiwgSVBWNl9DSEVDS1NVTSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfQ0hFQ0tTVU0iLCBJUFY2X0NIRUNLU1VNKTsKICNlbmRpZgogI2lmZGVmIElQVjZfRE9OVEZSQUcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9ET05URlJBRyIsIElQVjZfRE9OVEZSQUcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0RPTlRGUkFHIiwgSVBWNl9ET05URlJBRyk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X0RTVE9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9EU1RPUFRTIiwgSVBWNl9EU1RPUFRTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9EU1RPUFRTIiwgSVBWNl9EU1RPUFRTKTsKICNlbmRpZgogI2lmZGVmIElQVjZfSE9QTElNSVQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9IT1BMSU1JVCIsIElQVjZfSE9QTElNSVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0hPUExJTUlUIiwgSVBWNl9IT1BMSU1JVCk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X0hPUE9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9IT1BPUFRTIiwgSVBWNl9IT1BPUFRTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9IT1BPUFRTIiwgSVBWNl9IT1BPUFRTKTsKICNlbmRpZgogI2lmZGVmIElQVjZfTkVYVEhPUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X05FWFRIT1AiLCBJUFY2X05FWFRIT1ApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X05FWFRIT1AiLCBJUFY2X05FWFRIT1ApOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9QQVRITVRVCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUEFUSE1UVSIsIElQVjZfUEFUSE1UVSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUEFUSE1UVSIsIElQVjZfUEFUSE1UVSk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1BLVElORk8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9QS1RJTkZPIiwgSVBWNl9QS1RJTkZPKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9QS1RJTkZPIiwgSVBWNl9QS1RJTkZPKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUkVDVkRTVE9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SRUNWRFNUT1BUUyIsIElQVjZfUkVDVkRTVE9QVFMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZEU1RPUFRTIiwgSVBWNl9SRUNWRFNUT1BUUyk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1JFQ1ZIT1BMSU1JVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZIT1BMSU1JVCIsIElQVjZfUkVDVkhPUExJTUlUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SRUNWSE9QTElNSVQiLCBJUFY2X1JFQ1ZIT1BMSU1JVCk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1JFQ1ZIT1BPUFRTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVkhPUE9QVFMiLCBJUFY2X1JFQ1ZIT1BPUFRTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SRUNWSE9QT1BUUyIsIElQVjZfUkVDVkhPUE9QVFMpOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9SRUNWUEtUSU5GTwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZQS1RJTkZPIiwgSVBWNl9SRUNWUEtUSU5GTyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVlBLVElORk8iLCBJUFY2X1JFQ1ZQS1RJTkZPKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUkVDVlJUSERSCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVlJUSERSIiwgSVBWNl9SRUNWUlRIRFIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZSVEhEUiIsIElQVjZfUkVDVlJUSERSKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUkVDVlRDTEFTUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZUQ0xBU1MiLCBJUFY2X1JFQ1ZUQ0xBU1MpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZUQ0xBU1MiLCBJUFY2X1JFQ1ZUQ0xBU1MpOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9SVEhEUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JUSERSIiwgSVBWNl9SVEhEUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUlRIRFIiLCBJUFY2X1JUSERSKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUlRIRFJEU1RPUFRTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUlRIRFJEU1RPUFRTIiwgSVBWNl9SVEhEUkRTVE9QVFMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JUSERSRFNUT1BUUyIsIElQVjZfUlRIRFJEU1RPUFRTKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUlRIRFJfVFlQRV8wCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUlRIRFJfVFlQRV8wIiwgSVBWNl9SVEhEUl9UWVBFXzApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JUSERSX1RZUEVfMCIsIElQVjZfUlRIRFJfVFlQRV8wKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUkVDVlBBVEhNVFUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SRUNWUEFUSE1UVSIsIElQVjZfUkVDVlBBVEhNVFUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZQQVRITVRVIiwgSVBWNl9SRUNWUEFUSE1UVSk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1RDTEFTUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1RDTEFTUyIsIElQVjZfVENMQVNTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9UQ0xBU1MiLCBJUFY2X1RDTEFTUyk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1VTRV9NSU5fTVRVCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfVVNFX01JTl9NVFUiLCBJUFY2X1VTRV9NSU5fTVRVKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9VU0VfTUlOX01UVSIsIElQVjZfVVNFX01JTl9NVFUpOwogI2VuZGlmCiAKLQkvKiBUQ1Agb3B0aW9ucyAqLwotI2lmZGVmCVRDUF9OT0RFTEFZCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9OT0RFTEFZIiwgVENQX05PREVMQVkpOworICAgIC8qIFRDUCBvcHRpb25zICovCisjaWZkZWYgIFRDUF9OT0RFTEFZCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9OT0RFTEFZIiwgVENQX05PREVMQVkpOwogI2VuZGlmCi0jaWZkZWYJVENQX01BWFNFRwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfTUFYU0VHIiwgVENQX01BWFNFRyk7CisjaWZkZWYgIFRDUF9NQVhTRUcKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX01BWFNFRyIsIFRDUF9NQVhTRUcpOwogI2VuZGlmCi0jaWZkZWYJVENQX0NPUksKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0NPUksiLCBUQ1BfQ09SSyk7CisjaWZkZWYgIFRDUF9DT1JLCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9DT1JLIiwgVENQX0NPUkspOwogI2VuZGlmCi0jaWZkZWYJVENQX0tFRVBJRExFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9LRUVQSURMRSIsIFRDUF9LRUVQSURMRSk7CisjaWZkZWYgIFRDUF9LRUVQSURMRQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfS0VFUElETEUiLCBUQ1BfS0VFUElETEUpOwogI2VuZGlmCi0jaWZkZWYJVENQX0tFRVBJTlRWTAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfS0VFUElOVFZMIiwgVENQX0tFRVBJTlRWTCk7CisjaWZkZWYgIFRDUF9LRUVQSU5UVkwKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0tFRVBJTlRWTCIsIFRDUF9LRUVQSU5UVkwpOwogI2VuZGlmCi0jaWZkZWYJVENQX0tFRVBDTlQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0tFRVBDTlQiLCBUQ1BfS0VFUENOVCk7CisjaWZkZWYgIFRDUF9LRUVQQ05UCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9LRUVQQ05UIiwgVENQX0tFRVBDTlQpOwogI2VuZGlmCi0jaWZkZWYJVENQX1NZTkNOVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfU1lOQ05UIiwgVENQX1NZTkNOVCk7CisjaWZkZWYgIFRDUF9TWU5DTlQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX1NZTkNOVCIsIFRDUF9TWU5DTlQpOwogI2VuZGlmCi0jaWZkZWYJVENQX0xJTkdFUjIKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0xJTkdFUjIiLCBUQ1BfTElOR0VSMik7CisjaWZkZWYgIFRDUF9MSU5HRVIyCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9MSU5HRVIyIiwgVENQX0xJTkdFUjIpOwogI2VuZGlmCi0jaWZkZWYJVENQX0RFRkVSX0FDQ0VQVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfREVGRVJfQUNDRVBUIiwgVENQX0RFRkVSX0FDQ0VQVCk7CisjaWZkZWYgIFRDUF9ERUZFUl9BQ0NFUFQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0RFRkVSX0FDQ0VQVCIsIFRDUF9ERUZFUl9BQ0NFUFQpOwogI2VuZGlmCi0jaWZkZWYJVENQX1dJTkRPV19DTEFNUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfV0lORE9XX0NMQU1QIiwgVENQX1dJTkRPV19DTEFNUCk7CisjaWZkZWYgIFRDUF9XSU5ET1dfQ0xBTVAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX1dJTkRPV19DTEFNUCIsIFRDUF9XSU5ET1dfQ0xBTVApOwogI2VuZGlmCi0jaWZkZWYJVENQX0lORk8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0lORk8iLCBUQ1BfSU5GTyk7CisjaWZkZWYgIFRDUF9JTkZPCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9JTkZPIiwgVENQX0lORk8pOwogI2VuZGlmCi0jaWZkZWYJVENQX1FVSUNLQUNLCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9RVUlDS0FDSyIsIFRDUF9RVUlDS0FDSyk7CisjaWZkZWYgIFRDUF9RVUlDS0FDSworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfUVVJQ0tBQ0siLCBUQ1BfUVVJQ0tBQ0spOwogI2VuZGlmCiAKIAotCS8qIElQWCBvcHRpb25zICovCi0jaWZkZWYJSVBYX1RZUEUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBYX1RZUEUiLCBJUFhfVFlQRSk7CisgICAgLyogSVBYIG9wdGlvbnMgKi8KKyNpZmRlZiAgSVBYX1RZUEUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBYX1RZUEUiLCBJUFhfVFlQRSk7CiAjZW5kaWYKIAotCS8qIGdldHthZGRyLG5hbWV9aW5mbyBwYXJhbWV0ZXJzICovCisgICAgLyogZ2V0e2FkZHIsbmFtZX1pbmZvIHBhcmFtZXRlcnMgKi8KICNpZmRlZiBFQUlfQUREUkZBTUlMWQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfQUREUkZBTUlMWSIsIEVBSV9BRERSRkFNSUxZKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0FERFJGQU1JTFkiLCBFQUlfQUREUkZBTUlMWSk7CiAjZW5kaWYKICNpZmRlZiBFQUlfQUdBSU4KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0FHQUlOIiwgRUFJX0FHQUlOKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0FHQUlOIiwgRUFJX0FHQUlOKTsKICNlbmRpZgogI2lmZGVmIEVBSV9CQURGTEFHUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfQkFERkxBR1MiLCBFQUlfQkFERkxBR1MpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfQkFERkxBR1MiLCBFQUlfQkFERkxBR1MpOwogI2VuZGlmCiAjaWZkZWYgRUFJX0ZBSUwKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0ZBSUwiLCBFQUlfRkFJTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9GQUlMIiwgRUFJX0ZBSUwpOwogI2VuZGlmCiAjaWZkZWYgRUFJX0ZBTUlMWQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfRkFNSUxZIiwgRUFJX0ZBTUlMWSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9GQU1JTFkiLCBFQUlfRkFNSUxZKTsKICNlbmRpZgogI2lmZGVmIEVBSV9NRU1PUlkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX01FTU9SWSIsIEVBSV9NRU1PUlkpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfTUVNT1JZIiwgRUFJX01FTU9SWSk7CiAjZW5kaWYKICNpZmRlZiBFQUlfTk9EQVRBCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9OT0RBVEEiLCBFQUlfTk9EQVRBKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX05PREFUQSIsIEVBSV9OT0RBVEEpOwogI2VuZGlmCiAjaWZkZWYgRUFJX05PTkFNRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfTk9OQU1FIiwgRUFJX05PTkFNRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9OT05BTUUiLCBFQUlfTk9OQU1FKTsKICNlbmRpZgogI2lmZGVmIEVBSV9PVkVSRkxPVwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfT1ZFUkZMT1ciLCBFQUlfT1ZFUkZMT1cpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfT1ZFUkZMT1ciLCBFQUlfT1ZFUkZMT1cpOwogI2VuZGlmCiAjaWZkZWYgRUFJX1NFUlZJQ0UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1NFUlZJQ0UiLCBFQUlfU0VSVklDRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9TRVJWSUNFIiwgRUFJX1NFUlZJQ0UpOwogI2VuZGlmCiAjaWZkZWYgRUFJX1NPQ0tUWVBFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9TT0NLVFlQRSIsIEVBSV9TT0NLVFlQRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9TT0NLVFlQRSIsIEVBSV9TT0NLVFlQRSk7CiAjZW5kaWYKICNpZmRlZiBFQUlfU1lTVEVNCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9TWVNURU0iLCBFQUlfU1lTVEVNKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1NZU1RFTSIsIEVBSV9TWVNURU0pOwogI2VuZGlmCiAjaWZkZWYgRUFJX0JBREhJTlRTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9CQURISU5UUyIsIEVBSV9CQURISU5UUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9CQURISU5UUyIsIEVBSV9CQURISU5UUyk7CiAjZW5kaWYKICNpZmRlZiBFQUlfUFJPVE9DT0wKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1BST1RPQ09MIiwgRUFJX1BST1RPQ09MKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1BST1RPQ09MIiwgRUFJX1BST1RPQ09MKTsKICNlbmRpZgogI2lmZGVmIEVBSV9NQVgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX01BWCIsIEVBSV9NQVgpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfTUFYIiwgRUFJX01BWCk7CiAjZW5kaWYKICNpZmRlZiBBSV9QQVNTSVZFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX1BBU1NJVkUiLCBBSV9QQVNTSVZFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfUEFTU0lWRSIsIEFJX1BBU1NJVkUpOwogI2VuZGlmCiAjaWZkZWYgQUlfQ0FOT05OQU1FCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX0NBTk9OTkFNRSIsIEFJX0NBTk9OTkFNRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX0NBTk9OTkFNRSIsIEFJX0NBTk9OTkFNRSk7CiAjZW5kaWYKICNpZmRlZiBBSV9OVU1FUklDSE9TVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9OVU1FUklDSE9TVCIsIEFJX05VTUVSSUNIT1NUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfTlVNRVJJQ0hPU1QiLCBBSV9OVU1FUklDSE9TVCk7CiAjZW5kaWYKICNpZmRlZiBBSV9OVU1FUklDU0VSVgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9OVU1FUklDU0VSViIsIEFJX05VTUVSSUNTRVJWKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfTlVNRVJJQ1NFUlYiLCBBSV9OVU1FUklDU0VSVik7CiAjZW5kaWYKICNpZmRlZiBBSV9NQVNLCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX01BU0siLCBBSV9NQVNLKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfTUFTSyIsIEFJX01BU0spOwogI2VuZGlmCiAjaWZkZWYgQUlfQUxMCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX0FMTCIsIEFJX0FMTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX0FMTCIsIEFJX0FMTCk7CiAjZW5kaWYKICNpZmRlZiBBSV9WNE1BUFBFRF9DRkcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfVjRNQVBQRURfQ0ZHIiwgQUlfVjRNQVBQRURfQ0ZHKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfVjRNQVBQRURfQ0ZHIiwgQUlfVjRNQVBQRURfQ0ZHKTsKICNlbmRpZgogI2lmZGVmIEFJX0FERFJDT05GSUcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfQUREUkNPTkZJRyIsIEFJX0FERFJDT05GSUcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9BRERSQ09ORklHIiwgQUlfQUREUkNPTkZJRyk7CiAjZW5kaWYKICNpZmRlZiBBSV9WNE1BUFBFRAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9WNE1BUFBFRCIsIEFJX1Y0TUFQUEVEKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfVjRNQVBQRUQiLCBBSV9WNE1BUFBFRCk7CiAjZW5kaWYKICNpZmRlZiBBSV9ERUZBVUxUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX0RFRkFVTFQiLCBBSV9ERUZBVUxUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfREVGQVVMVCIsIEFJX0RFRkFVTFQpOwogI2VuZGlmCiAjaWZkZWYgTklfTUFYSE9TVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9NQVhIT1NUIiwgTklfTUFYSE9TVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX01BWEhPU1QiLCBOSV9NQVhIT1NUKTsKICNlbmRpZgogI2lmZGVmIE5JX01BWFNFUlYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfTUFYU0VSViIsIE5JX01BWFNFUlYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9NQVhTRVJWIiwgTklfTUFYU0VSVik7CiAjZW5kaWYKICNpZmRlZiBOSV9OT0ZRRE4KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfTk9GUUROIiwgTklfTk9GUUROKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfTk9GUUROIiwgTklfTk9GUUROKTsKICNlbmRpZgogI2lmZGVmIE5JX05VTUVSSUNIT1NUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX05VTUVSSUNIT1NUIiwgTklfTlVNRVJJQ0hPU1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9OVU1FUklDSE9TVCIsIE5JX05VTUVSSUNIT1NUKTsKICNlbmRpZgogI2lmZGVmIE5JX05BTUVSRVFECi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX05BTUVSRVFEIiwgTklfTkFNRVJFUUQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9OQU1FUkVRRCIsIE5JX05BTUVSRVFEKTsKICNlbmRpZgogI2lmZGVmIE5JX05VTUVSSUNTRVJWCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX05VTUVSSUNTRVJWIiwgTklfTlVNRVJJQ1NFUlYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9OVU1FUklDU0VSViIsIE5JX05VTUVSSUNTRVJWKTsKICNlbmRpZgogI2lmZGVmIE5JX0RHUkFNCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX0RHUkFNIiwgTklfREdSQU0pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9ER1JBTSIsIE5JX0RHUkFNKTsKICNlbmRpZgogCi0JLyogc2h1dGRvd24oKSBwYXJhbWV0ZXJzICovCisgICAgLyogc2h1dGRvd24oKSBwYXJhbWV0ZXJzICovCiAjaWZkZWYgU0hVVF9SRAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1JEIiwgU0hVVF9SRCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfUkQiLCBTSFVUX1JEKTsKICNlbGlmIGRlZmluZWQoU0RfUkVDRUlWRSkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRCIsIFNEX1JFQ0VJVkUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1JEIiwgU0RfUkVDRUlWRSk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1JEIiwgMCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfUkQiLCAwKTsKICNlbmRpZgogI2lmZGVmIFNIVVRfV1IKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9XUiIsIFNIVVRfV1IpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1dSIiwgU0hVVF9XUik7CiAjZWxpZiBkZWZpbmVkKFNEX1NFTkQpCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfV1IiLCBTRF9TRU5EKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9XUiIsIFNEX1NFTkQpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9XUiIsIDEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1dSIiwgMSk7CiAjZW5kaWYKICNpZmRlZiBTSFVUX1JEV1IKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRFdSIiwgU0hVVF9SRFdSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRFdSIiwgU0hVVF9SRFdSKTsKICNlbGlmIGRlZmluZWQoU0RfQk9USCkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRFdSIiwgU0RfQk9USCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfUkRXUiIsIFNEX0JPVEgpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRFdSIiwgMik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfUkRXUiIsIDIpOwogI2VuZGlmCiAKICNpZmRlZiBTSU9fUkNWQUxMCi0JewotCQlEV09SRCBjb2Rlc1tdID0ge1NJT19SQ1ZBTEwsIFNJT19LRUVQQUxJVkVfVkFMU307Ci0JCWNvbnN0IGNoYXIgKm5hbWVzW10gPSB7IlNJT19SQ1ZBTEwiLCAiU0lPX0tFRVBBTElWRV9WQUxTIn07Ci0JCWludCBpOwotCQlmb3IoaSA9IDA7IGk8c2l6ZW9mKGNvZGVzKS9zaXplb2YoKmNvZGVzKTsgKytpKSB7Ci0JCQlQeU9iamVjdCAqdG1wOwotCQkJdG1wID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoY29kZXNbaV0pOwotCQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJCXJldHVybjsKLQkJCVB5TW9kdWxlX0FkZE9iamVjdChtLCBuYW1lc1tpXSwgdG1wKTsKLQkJfQotCX0KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkNWQUxMX09GRiIsIFJDVkFMTF9PRkYpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfT04iLCBSQ1ZBTExfT04pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfU09DS0VUTEVWRUxPTkxZIiwgUkNWQUxMX1NPQ0tFVExFVkVMT05MWSk7CisgICAgeworICAgICAgICBEV09SRCBjb2Rlc1tdID0ge1NJT19SQ1ZBTEwsIFNJT19LRUVQQUxJVkVfVkFMU307CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWVzW10gPSB7IlNJT19SQ1ZBTEwiLCAiU0lPX0tFRVBBTElWRV9WQUxTIn07CisgICAgICAgIGludCBpOworICAgICAgICBmb3IoaSA9IDA7IGk8c2l6ZW9mKGNvZGVzKS9zaXplb2YoKmNvZGVzKTsgKytpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdG1wOworICAgICAgICAgICAgdG1wID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoY29kZXNbaV0pOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCBuYW1lc1tpXSwgdG1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkNWQUxMX09GRiIsIFJDVkFMTF9PRkYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfT04iLCBSQ1ZBTExfT04pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfU09DS0VUTEVWRUxPTkxZIiwgUkNWQUxMX1NPQ0tFVExFVkVMT05MWSk7CiAjaWZkZWYgUkNWQUxMX0lQTEVWRUwKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkNWQUxMX0lQTEVWRUwiLCBSQ1ZBTExfSVBMRVZFTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJDVkFMTF9JUExFVkVMIiwgUkNWQUxMX0lQTEVWRUwpOwogI2VuZGlmCiAjaWZkZWYgUkNWQUxMX01BWAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfTUFYIiwgUkNWQUxMX01BWCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJDVkFMTF9NQVgiLCBSQ1ZBTExfTUFYKTsKICNlbmRpZgogI2VuZGlmIC8qIF9NU1RDUElQXyAqLwogCi0JLyogSW5pdGlhbGl6ZSBnZXRob3N0YnluYW1lIGxvY2sgKi8KKyAgICAvKiBJbml0aWFsaXplIGdldGhvc3RieW5hbWUgbG9jayAqLwogI2lmIGRlZmluZWQoVVNFX0dFVEhPU1RCWU5BTUVfTE9DSykgfHwgZGVmaW5lZChVU0VfR0VUQUREUklORk9fTE9DSykKLQluZXRkYl9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIG5ldGRiX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CiAjZW5kaWYKIH0KIApAQCAtNTM2NiwzNCArNTM2NiwzNCBAQAogaW50CiBpbmV0X3B0b24oaW50IGFmLCBjb25zdCBjaGFyICpzcmMsIHZvaWQgKmRzdCkKIHsKLQlpZiAoYWYgPT0gQUZfSU5FVCkgeworICAgIGlmIChhZiA9PSBBRl9JTkVUKSB7CiAjaWYgKFNJWkVPRl9JTlQgIT0gNCkKICNlcnJvciAiTm90IHN1cmUgaWYgaW5fYWRkcl90IGV4aXN0cyBhbmQgaW50IGlzIG5vdCAzMi1iaXRzLiIKICNlbmRpZgotCQl1bnNpZ25lZCBpbnQgcGFja2VkX2FkZHI7Ci0JCXBhY2tlZF9hZGRyID0gaW5ldF9hZGRyKHNyYyk7Ci0JCWlmIChwYWNrZWRfYWRkciA9PSBJTkFERFJfTk9ORSkKLQkJCXJldHVybiAwOwotCQltZW1jcHkoZHN0LCAmcGFja2VkX2FkZHIsIDQpOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogU2hvdWxkIHNldCBlcnJubyB0byBFQUZOT1NVUFBPUlQgKi8KLQlyZXR1cm4gLTE7CisgICAgICAgIHVuc2lnbmVkIGludCBwYWNrZWRfYWRkcjsKKyAgICAgICAgcGFja2VkX2FkZHIgPSBpbmV0X2FkZHIoc3JjKTsKKyAgICAgICAgaWYgKHBhY2tlZF9hZGRyID09IElOQUREUl9OT05FKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG1lbWNweShkc3QsICZwYWNrZWRfYWRkciwgNCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvKiBTaG91bGQgc2V0IGVycm5vIHRvIEVBRk5PU1VQUE9SVCAqLworICAgIHJldHVybiAtMTsKIH0KIAogY29uc3QgY2hhciAqCiBpbmV0X250b3AoaW50IGFmLCBjb25zdCB2b2lkICpzcmMsIGNoYXIgKmRzdCwgc29ja2xlbl90IHNpemUpCiB7Ci0JaWYgKGFmID09IEFGX0lORVQpIHsKLQkJc3RydWN0IGluX2FkZHIgcGFja2VkX2FkZHI7Ci0JCWlmIChzaXplIDwgMTYpCi0JCQkvKiBTaG91bGQgc2V0IGVycm5vIHRvIEVOT1NQQy4gKi8KLQkJCXJldHVybiBOVUxMOwotCQltZW1jcHkoJnBhY2tlZF9hZGRyLCBzcmMsIHNpemVvZihwYWNrZWRfYWRkcikpOwotCQlyZXR1cm4gc3RybmNweShkc3QsIGluZXRfbnRvYShwYWNrZWRfYWRkciksIHNpemUpOwotCX0KLQkvKiBTaG91bGQgc2V0IGVycm5vIHRvIEVBRk5PU1VQUE9SVCAqLwotCXJldHVybiBOVUxMOworICAgIGlmIChhZiA9PSBBRl9JTkVUKSB7CisgICAgICAgIHN0cnVjdCBpbl9hZGRyIHBhY2tlZF9hZGRyOworICAgICAgICBpZiAoc2l6ZSA8IDE2KQorICAgICAgICAgICAgLyogU2hvdWxkIHNldCBlcnJubyB0byBFTk9TUEMuICovCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbWVtY3B5KCZwYWNrZWRfYWRkciwgc3JjLCBzaXplb2YocGFja2VkX2FkZHIpKTsKKyAgICAgICAgcmV0dXJuIHN0cm5jcHkoZHN0LCBpbmV0X250b2EocGFja2VkX2FkZHIpLCBzaXplKTsKKyAgICB9CisgICAgLyogU2hvdWxkIHNldCBlcnJubyB0byBFQUZOT1NVUFBPUlQgKi8KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5oIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuaAppbmRleCA0OGYyMzBlLi44NTE1NDk5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5oCisrKyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmgKQEAgLTE3LDcgKzE3LDcgQEAKICMgaW5jbHVkZSA8d3MydGNwaXAuaD4KIC8qIFZDNiBpcyBzaGlwcGVkIHdpdGggb2xkIHBsYXRmb3JtIGhlYWRlcnMsIGFuZCBkb2VzIG5vdCBoYXZlIE1TVGNwSVAuaAogICogU2VwYXJhdGUgU0RLcyBoYXZlIGFsbCB0aGUgZnVuY3Rpb25zIHdlIHdhbnQsIGJ1dCBvbGRlciBvbmVzIGRvbid0IGhhdmUKLSAqIGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAKKyAqIGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uLgogICogSSB1c2UgU0lPX0dFVF9NVUxUSUNBU1RfRklMVEVSIHRvIGRldGVjdCBhIGRlY2VudCBTREsuCiAgKi8KICMgaWZkZWYgU0lPX0dFVF9NVUxUSUNBU1RfRklMVEVSCkBAIC03Niw0NCArNzYsNDQgQEAKICNlbmRpZgogCiAvKiBQeXRob24gbW9kdWxlIGFuZCBDIEFQSSBuYW1lICovCi0jZGVmaW5lIFB5U29ja2V0X01PRFVMRV9OQU1FCSJfc29ja2V0IgotI2RlZmluZSBQeVNvY2tldF9DQVBJX05BTUUJIkNBUEkiCisjZGVmaW5lIFB5U29ja2V0X01PRFVMRV9OQU1FICAgICJfc29ja2V0IgorI2RlZmluZSBQeVNvY2tldF9DQVBJX05BTUUgICAgICAiQ0FQSSIKICNkZWZpbmUgUHlTb2NrZXRfQ0FQU1VMRV9OQU1FICAoUHlTb2NrZXRfTU9EVUxFX05BTUUgIi4iIFB5U29ja2V0X0NBUElfTkFNRSkKIAogLyogQWJzdHJhY3QgdGhlIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgdHlwZSAqLwogI2lmZGVmIE1TX1dJTkRPV1MKIHR5cGVkZWYgU09DS0VUIFNPQ0tFVF9UOwotIwlpZmRlZiBNU19XSU42NAotIwkJZGVmaW5lIFNJWkVPRl9TT0NLRVRfVCA4Ci0jCWVsc2UKLSMJCWRlZmluZSBTSVpFT0ZfU09DS0VUX1QgNAotIwllbmRpZgorIyAgICAgICBpZmRlZiBNU19XSU42NAorIyAgICAgICAgICAgICAgIGRlZmluZSBTSVpFT0ZfU09DS0VUX1QgOAorIyAgICAgICBlbHNlCisjICAgICAgICAgICAgICAgZGVmaW5lIFNJWkVPRl9TT0NLRVRfVCA0CisjICAgICAgIGVuZGlmCiAjZWxzZQogdHlwZWRlZiBpbnQgU09DS0VUX1Q7Ci0jCWRlZmluZSBTSVpFT0ZfU09DS0VUX1QgU0laRU9GX0lOVAorIyAgICAgICBkZWZpbmUgU0laRU9GX1NPQ0tFVF9UIFNJWkVPRl9JTlQKICNlbmRpZgogCiAvKiBTb2NrZXQgYWRkcmVzcyAqLwogdHlwZWRlZiB1bmlvbiBzb2NrX2FkZHIgewotCXN0cnVjdCBzb2NrYWRkcl9pbiBpbjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gaW47CiAjaWZkZWYgQUZfVU5JWAotCXN0cnVjdCBzb2NrYWRkcl91biB1bjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gdW47CiAjZW5kaWYKICNpZmRlZiBBRl9ORVRMSU5LCi0Jc3RydWN0IHNvY2thZGRyX25sIG5sOworICAgIHN0cnVjdCBzb2NrYWRkcl9ubCBubDsKICNlbmRpZgogI2lmZGVmIEVOQUJMRV9JUFY2Ci0Jc3RydWN0IHNvY2thZGRyX2luNiBpbjY7Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3RvcmFnZTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGluNjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzdG9yYWdlOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9CTFVFVE9PVEhfQkxVRVRPT1RIX0gKLQlzdHJ1Y3Qgc29ja2FkZHJfbDIgYnRfbDI7Ci0Jc3RydWN0IHNvY2thZGRyX3JjIGJ0X3JjOwotCXN0cnVjdCBzb2NrYWRkcl9zY28gYnRfc2NvOwotCXN0cnVjdCBzb2NrYWRkcl9oY2kgYnRfaGNpOworICAgIHN0cnVjdCBzb2NrYWRkcl9sMiBidF9sMjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfcmMgYnRfcmM7CisgICAgc3RydWN0IHNvY2thZGRyX3NjbyBidF9zY287CisgICAgc3RydWN0IHNvY2thZGRyX2hjaSBidF9oY2k7CiAjZW5kaWYKICNpZmRlZiBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSAotCXN0cnVjdCBzb2NrYWRkcl9sbCBsbDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfbGwgbGw7CiAjZW5kaWYKIH0gc29ja19hZGRyX3Q7CiAKQEAgLTEyMiwxNiArMTIyLDE2IEBACiAgICBhcmd1bWVudHMgcHJvcGVybHkuICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JU09DS0VUX1Qgc29ja19mZDsJLyogU29ja2V0IGZpbGUgZGVzY3JpcHRvciAqLwotCWludCBzb2NrX2ZhbWlseTsJLyogQWRkcmVzcyBmYW1pbHksIGUuZy4sIEFGX0lORVQgKi8KLQlpbnQgc29ja190eXBlOwkJLyogU29ja2V0IHR5cGUsIGUuZy4sIFNPQ0tfU1RSRUFNICovCi0JaW50IHNvY2tfcHJvdG87CQkvKiBQcm90b2NvbCB0eXBlLCB1c3VhbGx5IDAgKi8KLQlQeU9iamVjdCAqKCplcnJvcmhhbmRsZXIpKHZvaWQpOyAvKiBFcnJvciBoYW5kbGVyOyBjaGVja3MKLQkJCQkJICAgIGVycm5vLCByZXR1cm5zIE5VTEwgYW5kCi0JCQkJCSAgICBzZXRzIGEgUHl0aG9uIGV4Y2VwdGlvbiAqLwotCWRvdWJsZSBzb2NrX3RpbWVvdXQ7CQkgLyogT3BlcmF0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsKLQkJCQkJICAgIDAuMCBtZWFucyBub24tYmxvY2tpbmcgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgU09DS0VUX1Qgc29ja19mZDsgICAgICAgICAgIC8qIFNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgICBpbnQgc29ja19mYW1pbHk7ICAgICAgICAgICAgLyogQWRkcmVzcyBmYW1pbHksIGUuZy4sIEFGX0lORVQgKi8KKyAgICBpbnQgc29ja190eXBlOyAgICAgICAgICAgICAgLyogU29ja2V0IHR5cGUsIGUuZy4sIFNPQ0tfU1RSRUFNICovCisgICAgaW50IHNvY2tfcHJvdG87ICAgICAgICAgICAgIC8qIFByb3RvY29sIHR5cGUsIHVzdWFsbHkgMCAqLworICAgIFB5T2JqZWN0ICooKmVycm9yaGFuZGxlcikodm9pZCk7IC8qIEVycm9yIGhhbmRsZXI7IGNoZWNrcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vLCByZXR1cm5zIE5VTEwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0cyBhIFB5dGhvbiBleGNlcHRpb24gKi8KKyAgICBkb3VibGUgc29ja190aW1lb3V0OyAgICAgICAgICAgICAgICAgLyogT3BlcmF0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAgbWVhbnMgbm9uLWJsb2NraW5nICovCiB9IFB5U29ja2V0U29ja09iamVjdDsKIAogLyogLS0tIEMgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTM5LDcgKzEzOSw3IEBACiAvKiBTaG9ydCBleHBsYW5hdGlvbiBvZiB3aGF0IHRoaXMgQyBBUEkgZXhwb3J0IG1lY2hhbmlzbSBkb2VzCiAgICBhbmQgaG93IGl0IHdvcmtzOgogCi0gICAgVGhlIF9zc2wgbW9kdWxlIG5lZWRzIGFjY2VzcyB0byB0aGUgdHlwZSBvYmplY3QgZGVmaW5lZCBpbiAKKyAgICBUaGUgX3NzbCBtb2R1bGUgbmVlZHMgYWNjZXNzIHRvIHRoZSB0eXBlIG9iamVjdCBkZWZpbmVkIGluCiAgICAgdGhlIF9zb2NrZXQgbW9kdWxlLiBTaW5jZSBjcm9zcy1ETEwgbGlua2luZyBpbnRyb2R1Y2VzIGEgbG90IG9mCiAgICAgcHJvYmxlbXMgb24gbWFueSBwbGF0Zm9ybXMsIHRoZSAidHJpY2siIGlzIHRvIHdyYXAgdGhlCiAgICAgQyBBUEkgb2YgYSBtb2R1bGUgaW4gYSBzdHJ1Y3Qgd2hpY2ggdGhlbiBnZXRzIGV4cG9ydGVkIHRvCkBAIC0xNjEsMjQgKzE2MSwyNCBAQAogCiAgICAgTG9hZCBfc29ja2V0IG1vZHVsZSBhbmQgaXRzIEMgQVBJOyB0aGlzIHNldHMgdXAgdGhlIGdsb2JhbAogICAgIFB5U29ja2V0TW9kdWxlOgotICAgIAotCWlmIChQeVNvY2tldE1vZHVsZV9JbXBvcnRNb2R1bGVBbmRBUEkoKSkKLQkgICAgcmV0dXJuOworCisgICAgaWYgKFB5U29ja2V0TW9kdWxlX0ltcG9ydE1vZHVsZUFuZEFQSSgpKQorICAgICAgICByZXR1cm47CiAKIAogICAgIE5vdyB1c2UgdGhlIEMgQVBJIGFzIGlmIGl0IHdlcmUgZGVmaW5lZCBpbiB0aGUgdXNpbmcKICAgICBtb2R1bGU6CiAKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXx6ejpzc2wiLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8eno6c3NsIiwKIAotCQkJICAgICAgUHlTb2NrZXRNb2R1bGUuU29ja19UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeVNvY2tldE1vZHVsZS5Tb2NrX1R5cGUsCiAKLQkJCSAgICAgIChQeU9iamVjdCopJlNvY2ssCi0JCQkgICAgICAma2V5X2ZpbGUsICZjZXJ0X2ZpbGUpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0KikmU29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV9maWxlLCAmY2VydF9maWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBTdXBwb3J0IGNvdWxkIGVhc2lseSBiZSBleHRlbmRlZCB0byBleHBvcnQgbW9yZSBDIEFQSXMvc3ltYm9scwotICAgIHRoaXMgd2F5LiBDdXJyZW50bHksIG9ubHkgdGhlIHR5cGUgb2JqZWN0IGlzIGV4cG9ydGVkLCAKKyAgICB0aGlzIHdheS4gQ3VycmVudGx5LCBvbmx5IHRoZSB0eXBlIG9iamVjdCBpcyBleHBvcnRlZCwKICAgICBvdGhlciBjYW5kaWRhdGVzIHdvdWxkIGJlIHNvY2tldCBjb25zdHJ1Y3RvcnMgYW5kIHNvY2tldAogICAgIGFjY2VzcyBmdW5jdGlvbnMuCiAKQEAgLTE4NiwxMyArMTg2LDEzIEBACiAKIC8qIEMgQVBJIGZvciB1c2FnZSBieSBvdGhlciBQeXRob24gbW9kdWxlcyAqLwogdHlwZWRlZiBzdHJ1Y3QgewotCVB5VHlwZU9iamVjdCAqU29ja19UeXBlOwotICAgICAgICBQeU9iamVjdCAqZXJyb3I7CisgICAgUHlUeXBlT2JqZWN0ICpTb2NrX1R5cGU7CisgICAgUHlPYmplY3QgKmVycm9yOwogfSBQeVNvY2tldE1vZHVsZV9BUElPYmplY3Q7CiAKIC8qIFhYWCBUaGUgbmV0IGVmZmVjdCBvZiB0aGUgZm9sbG93aW5nIGFwcGVhcnMgdG8gYmUgdG8gZGVmaW5lIGEgZnVuY3Rpb24KICAgIFhYWCBuYW1lZCBQeVNvY2tldE1vZHVsZV9BUElPYmplY3QgaW4gX3NzbC5jLiAgSXQncyB1bmNsZWFyIHdoeSBpdCBpc24ndAotICAgWFhYIGRlZmluZWQgdGhlcmUgZGlyZWN0bHkuIAorICAgWFhYIGRlZmluZWQgdGhlcmUgZGlyZWN0bHkuCiAKICAgID4+PiBJdCdzIGRlZmluZWQgaGVyZSBiZWNhdXNlIG90aGVyIG1vZHVsZXMgbWlnaHQgYWxzbyB3YW50IHRvIHVzZQogICAgPj4+IHRoZSBDIEFQSS4KQEAgLTIwOCw4ICsyMDgsOCBAQAogCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfHp6OnNzbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5U29ja2V0TW9kdWxlLlNvY2tfVHlwZSwgKFB5T2JqZWN0KikmU29jaywKLQkgCQkgJmtleV9maWxlLCAmY2VydF9maWxlKSkKLSAJIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfZmlsZSwgJmNlcnRfZmlsZSkpCisgICAgIHJldHVybiBOVUxMOwogICAgLi4uCiAqLwogCkBAIC0yMjcsMTkgKzIyNywxOSBAQAogc3RhdGljCiBpbnQgUHlTb2NrZXRNb2R1bGVfSW1wb3J0TW9kdWxlQW5kQVBJKHZvaWQpCiB7Ci0Jdm9pZCAqYXBpOworICAgIHZvaWQgKmFwaTsKIAogICBEUFJJTlRGKCIgTG9hZGluZyBjYXBzdWxlICVzXG4iLCBQeVNvY2tldF9DQVBTVUxFX05BTUUpOwogICBhcGkgPSBQeUNhcHN1bGVfSW1wb3J0KFB5U29ja2V0X0NBUFNVTEVfTkFNRSwgMSk7Ci0JaWYgKGFwaSA9PSBOVUxMKQotCQlnb3RvIG9uRXJyb3I7Ci0JbWVtY3B5KCZQeVNvY2tldE1vZHVsZSwgYXBpLCBzaXplb2YoUHlTb2NrZXRNb2R1bGUpKTsKLQlEUFJJTlRGKCIgQVBJIG9iamVjdCBsb2FkZWQgYW5kIGluaXRpYWxpemVkLlxuIik7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGFwaSA9PSBOVUxMKQorICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgbWVtY3B5KCZQeVNvY2tldE1vZHVsZSwgYXBpLCBzaXplb2YoUHlTb2NrZXRNb2R1bGUpKTsKKyAgICBEUFJJTlRGKCIgQVBJIG9iamVjdCBsb2FkZWQgYW5kIGluaXRpYWxpemVkLlxuIik7CisgICAgcmV0dXJuIDA7CiAKICBvbkVycm9yOgotCURQUklOVEYoIiBub3QgZm91bmQuXG4iKTsKLQlyZXR1cm4gLTE7CisgICAgRFBSSU5URigiIG5vdCBmb3VuZC5cbiIpOworICAgIHJldHVybiAtMTsKIH0KIAogI2VuZGlmIC8qICFQeVNvY2tldF9CVUlMRElOR19TT0NLRVQgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvc3B3ZG1vZHVsZS5jIGIvTW9kdWxlcy9zcHdkbW9kdWxlLmMKaW5kZXggZDNmMzA5YS4uOTU3ZGU1OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zcHdkbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zcHdkbW9kdWxlLmMKQEAgLTI3LDE2ICsyNywxNiBAQAogI2lmIGRlZmluZWQoSEFWRV9HRVRTUE5BTSkgfHwgZGVmaW5lZChIQVZFX0dFVFNQRU5UKQogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCBzdHJ1Y3Rfc3B3ZF90eXBlX2ZpZWxkc1tdID0gewotCXsic3BfbmFtIiwgImxvZ2luIG5hbWUifSwKLQl7InNwX3B3ZCIsICJlbmNyeXB0ZWQgcGFzc3dvcmQifSwKLQl7InNwX2xzdGNoZyIsICJkYXRlIG9mIGxhc3QgY2hhbmdlIn0sCi0JeyJzcF9taW4iLCAibWluICNkYXlzIGJldHdlZW4gY2hhbmdlcyJ9LCAKLQl7InNwX21heCIsICJtYXggI2RheXMgYmV0d2VlbiBjaGFuZ2VzIn0sIAotCXsic3Bfd2FybiIsICIjZGF5cyBiZWZvcmUgcHcgZXhwaXJlcyB0byB3YXJuIHVzZXIgYWJvdXQgaXQifSwgCi0JeyJzcF9pbmFjdCIsICIjZGF5cyBhZnRlciBwdyBleHBpcmVzIHVudGlsIGFjY291bnQgaXMgYmxvY2tlZCJ9LAotCXsic3BfZXhwaXJlIiwgIiNkYXlzIHNpbmNlIDE5NzAtMDEtMDEgdW50aWwgYWNjb3VudCBpcyBkaXNhYmxlZCJ9LAotCXsic3BfZmxhZyIsICJyZXNlcnZlZCJ9LAotCXswfQorICAgIHsic3BfbmFtIiwgImxvZ2luIG5hbWUifSwKKyAgICB7InNwX3B3ZCIsICJlbmNyeXB0ZWQgcGFzc3dvcmQifSwKKyAgICB7InNwX2xzdGNoZyIsICJkYXRlIG9mIGxhc3QgY2hhbmdlIn0sCisgICAgeyJzcF9taW4iLCAibWluICNkYXlzIGJldHdlZW4gY2hhbmdlcyJ9LAorICAgIHsic3BfbWF4IiwgIm1heCAjZGF5cyBiZXR3ZWVuIGNoYW5nZXMifSwKKyAgICB7InNwX3dhcm4iLCAiI2RheXMgYmVmb3JlIHB3IGV4cGlyZXMgdG8gd2FybiB1c2VyIGFib3V0IGl0In0sCisgICAgeyJzcF9pbmFjdCIsICIjZGF5cyBhZnRlciBwdyBleHBpcmVzIHVudGlsIGFjY291bnQgaXMgYmxvY2tlZCJ9LAorICAgIHsic3BfZXhwaXJlIiwgIiNkYXlzIHNpbmNlIDE5NzAtMDEtMDEgdW50aWwgYWNjb3VudCBpcyBkaXNhYmxlZCJ9LAorICAgIHsic3BfZmxhZyIsICJyZXNlcnZlZCJ9LAorICAgIHswfQogfTsKIAogUHlEb2NfU1RSVkFSKHN0cnVjdF9zcHdkX19kb2NfXywKQEAgLTQ2LDEwICs0NiwxMCBAQAogb3IgdmlhIHRoZSBvYmplY3QgYXR0cmlidXRlcyBhcyBuYW1lZCBpbiB0aGUgYWJvdmUgdHVwbGUuIik7CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2Mgc3RydWN0X3Nwd2RfdHlwZV9kZXNjID0gewotCSJzcHdkLnN0cnVjdF9zcHdkIiwKLQlzdHJ1Y3Rfc3B3ZF9fZG9jX18sCi0Jc3RydWN0X3Nwd2RfdHlwZV9maWVsZHMsCi0JOSwKKyAgICAic3B3ZC5zdHJ1Y3Rfc3B3ZCIsCisgICAgc3RydWN0X3Nwd2RfX2RvY19fLAorICAgIHN0cnVjdF9zcHdkX3R5cGVfZmllbGRzLAorICAgIDksCiB9OwogCiBzdGF0aWMgaW50IGluaXRpYWxpemVkOwpAQCAtNjAsNDIgKzYwLDQyIEBACiBzZXRzKFB5T2JqZWN0ICp2LCBpbnQgaSwgY2hhciogdmFsKQogewogICBpZiAodmFsKQotCSAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbCkpOworICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbCkpOwogICBlbHNlIHsKLQkgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgaSwgUHlfTm9uZSk7Ci0JICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIGksIFB5X05vbmUpOworICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqbWtzcGVudChzdHJ1Y3Qgc3B3ZCAqcCkKIHsKLQlpbnQgc2V0SW5kZXggPSAwOwotCVB5T2JqZWN0ICp2ID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJlN0cnVjdFNwd2RUeXBlKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpbnQgc2V0SW5kZXggPSAwOworICAgIFB5T2JqZWN0ICp2ID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJlN0cnVjdFNwd2RUeXBlKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogI2RlZmluZSBTRVRJKGksdmFsKSBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIGksIFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWwpKQogI2RlZmluZSBTRVRTKGksdmFsKSBzZXRzKHYsIGksIHZhbCkKIAotCVNFVFMoc2V0SW5kZXgrKywgcC0+c3BfbmFtcCk7Ci0JU0VUUyhzZXRJbmRleCsrLCBwLT5zcF9wd2RwKTsKLQlTRVRJKHNldEluZGV4KyssIHAtPnNwX2xzdGNoZyk7Ci0JU0VUSShzZXRJbmRleCsrLCBwLT5zcF9taW4pOwotCVNFVEkoc2V0SW5kZXgrKywgcC0+c3BfbWF4KTsKLQlTRVRJKHNldEluZGV4KyssIHAtPnNwX3dhcm4pOwotCVNFVEkoc2V0SW5kZXgrKywgcC0+c3BfaW5hY3QpOwotCVNFVEkoc2V0SW5kZXgrKywgcC0+c3BfZXhwaXJlKTsKLQlTRVRJKHNldEluZGV4KyssIHAtPnNwX2ZsYWcpOworICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+c3BfbmFtcCk7CisgICAgU0VUUyhzZXRJbmRleCsrLCBwLT5zcF9wd2RwKTsKKyAgICBTRVRJKHNldEluZGV4KyssIHAtPnNwX2xzdGNoZyk7CisgICAgU0VUSShzZXRJbmRleCsrLCBwLT5zcF9taW4pOworICAgIFNFVEkoc2V0SW5kZXgrKywgcC0+c3BfbWF4KTsKKyAgICBTRVRJKHNldEluZGV4KyssIHAtPnNwX3dhcm4pOworICAgIFNFVEkoc2V0SW5kZXgrKywgcC0+c3BfaW5hY3QpOworICAgIFNFVEkoc2V0SW5kZXgrKywgcC0+c3BfZXhwaXJlKTsKKyAgICBTRVRJKHNldEluZGV4KyssIHAtPnNwX2ZsYWcpOwogCiAjdW5kZWYgU0VUUwogI3VuZGVmIFNFVEkKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHY7CisgICAgcmV0dXJuIHY7CiB9CiAKICNlbmRpZiAgLyogSEFWRV9HRVRTUE5BTSB8fCBIQVZFX0dFVFNQRU5UICovCkBAIC0xMTEsMTUgKzExMSwxNSBAQAogCiBzdGF0aWMgUHlPYmplY3QqIHNwd2RfZ2V0c3BuYW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0Jc3RydWN0IHNwd2QgKnA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldHNwbmFtIiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHAgPSBnZXRzcG5hbShuYW1lKSkgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJnZXRzcG5hbSgpOiBuYW1lIG5vdCBmb3VuZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIG1rc3BlbnQocCk7CisgICAgY2hhciAqbmFtZTsKKyAgICBzdHJ1Y3Qgc3B3ZCAqcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0c3BuYW0iLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgocCA9IGdldHNwbmFtKG5hbWUpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgImdldHNwbmFtKCk6IG5hbWUgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbWtzcGVudChwKTsKIH0KIAogI2VuZGlmIC8qIEhBVkVfR0VUU1BOQU0gKi8KQEAgLTEzNSw0OSArMTM1LDQ5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3B3ZF9nZXRzcGFsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmQ7Ci0Jc3RydWN0IHNwd2QgKnA7Ci0JaWYgKChkID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0c3BlbnQoKTsKLQl3aGlsZSAoKHAgPSBnZXRzcGVudCgpKSAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp2ID0gbWtzcGVudChwKTsKLQkJaWYgKHYgPT0gTlVMTCB8fCBQeUxpc3RfQXBwZW5kKGQsIHYpICE9IDApIHsKLQkJCVB5X1hERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYoZCk7Ci0JCQllbmRzcGVudCgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfREVDUkVGKHYpOwotCX0KLQllbmRzcGVudCgpOwotCXJldHVybiBkOworICAgIFB5T2JqZWN0ICpkOworICAgIHN0cnVjdCBzcHdkICpwOworICAgIGlmICgoZCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldHNwZW50KCk7CisgICAgd2hpbGUgKChwID0gZ2V0c3BlbnQoKSkgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqdiA9IG1rc3BlbnQocCk7CisgICAgICAgIGlmICh2ID09IE5VTEwgfHwgUHlMaXN0X0FwcGVuZChkLCB2KSAhPSAwKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKGQpOworICAgICAgICAgICAgZW5kc3BlbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CisgICAgZW5kc3BlbnQoKTsKKyAgICByZXR1cm4gZDsKIH0KIAogI2VuZGlmIC8qIEhBVkVfR0VUU1BFTlQgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIHNwd2RfbWV0aG9kc1tdID0gewotI2lmZGVmIEhBVkVfR0VUU1BOQU0JCi0JeyJnZXRzcG5hbSIsCXNwd2RfZ2V0c3BuYW0sIE1FVEhfVkFSQVJHUywgc3B3ZF9nZXRzcG5hbV9fZG9jX199LAorI2lmZGVmIEhBVkVfR0VUU1BOQU0KKyAgICB7ImdldHNwbmFtIiwgICAgICAgIHNwd2RfZ2V0c3BuYW0sIE1FVEhfVkFSQVJHUywgc3B3ZF9nZXRzcG5hbV9fZG9jX199LAogI2VuZGlmCiAjaWZkZWYgSEFWRV9HRVRTUEVOVAotCXsiZ2V0c3BhbGwiLAlzcHdkX2dldHNwYWxsLCBNRVRIX05PQVJHUywgc3B3ZF9nZXRzcGFsbF9fZG9jX199LAorICAgIHsiZ2V0c3BhbGwiLCAgICAgICAgc3B3ZF9nZXRzcGFsbCwgTUVUSF9OT0FSR1MsIHNwd2RfZ2V0c3BhbGxfX2RvY19ffSwKICNlbmRpZgotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRzcHdkKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JbT1QeV9Jbml0TW9kdWxlMygic3B3ZCIsIHNwd2RfbWV0aG9kcywgc3B3ZF9fZG9jX18pOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RTcHdkVHlwZSwgCi0JCQkJCSAgJnN0cnVjdF9zcHdkX3R5cGVfZGVzYyk7Ci0JUHlfSU5DUkVGKChQeU9iamVjdCAqKSAmU3RydWN0U3B3ZFR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3Nwd2QiLCAoUHlPYmplY3QgKikgJlN0cnVjdFNwd2RUeXBlKTsKLQlpbml0aWFsaXplZCA9IDE7CisgICAgUHlPYmplY3QgKm07CisgICAgbT1QeV9Jbml0TW9kdWxlMygic3B3ZCIsIHNwd2RfbWV0aG9kcywgc3B3ZF9fZG9jX18pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RTcHdkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RydWN0X3Nwd2RfdHlwZV9kZXNjKTsKKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopICZTdHJ1Y3RTcHdkVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3Rfc3B3ZCIsIChQeU9iamVjdCAqKSAmU3RydWN0U3B3ZFR5cGUpOworICAgIGluaXRpYWxpemVkID0gMTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc3Ryb3Btb2R1bGUuYyBiL01vZHVsZXMvc3Ryb3Btb2R1bGUuYwppbmRleCA3MzgzMTk0Li40Njg0YmFmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3N0cm9wbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zdHJvcG1vZHVsZS5jCkBAIC0xNCw4ICsxNCw4IEBACiAgICBYWFggYXJlIGRlZmluZWQgZm9yIGFsbCA4LWJpdCBjaGFyYWN0ZXJzISAqLwogCiAjZGVmaW5lIFdBUk4gaWYgKFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCBcCi0JCSAgICAgICAic3Ryb3AgZnVuY3Rpb25zIGFyZSBvYnNvbGV0ZTsgdXNlIHN0cmluZyBtZXRob2RzIikpIFwKLQkgICAgIHJldHVybiBOVUxMCisgICAgICAgICAgICAgICAic3Ryb3AgZnVuY3Rpb25zIGFyZSBvYnNvbGV0ZTsgdXNlIHN0cmluZyBtZXRob2RzIikpIFwKKyAgICAgICAgIHJldHVybiBOVUxMCiAKIC8qIFRoZSBsc3RyaXAoKSwgcnN0cmlwKCkgYW5kIHN0cmlwKCkgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZAogICAgaW4gZG9fc3RyaXAoKSwgd2hpY2ggdXNlcyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB3aGF0CkBAIC0yOSw1NiArMjksNTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcGxpdF93aGl0ZXNwYWNlKGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuLCBQeV9zc2l6ZV90IG1heHNwbGl0KQogewotCVB5X3NzaXplX3QgaSA9IDAsIGo7Ci0JaW50IGVycjsKLQlQeV9zc2l6ZV90IGNvdW50c3BsaXQgPSAwOwotCVB5T2JqZWN0KiBpdGVtOwotCVB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICBQeV9zc2l6ZV90IGkgPSAwLCBqOworICAgIGludCBlcnI7CisgICAgUHlfc3NpemVfdCBjb3VudHNwbGl0ID0gMDsKKyAgICBQeU9iamVjdCogaXRlbTsKKyAgICBQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoMCk7CiAKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXdoaWxlIChpIDwgbGVuKSB7Ci0JCXdoaWxlIChpIDwgbGVuICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7Ci0JCQlpID0gaSsxOwotCQl9Ci0JCWogPSBpOwotCQl3aGlsZSAoaSA8IGxlbiAmJiAhaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpIHsKLQkJCWkgPSBpKzE7Ci0JCX0KLQkJaWYgKGogPCBpKSB7Ci0JCQlpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocytqLCBpLWopOwotCQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCQlnb3RvIGZpbmFsbHk7CisgICAgd2hpbGUgKGkgPCBsZW4pIHsKKyAgICAgICAgd2hpbGUgKGkgPCBsZW4gJiYgaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpIHsKKyAgICAgICAgICAgIGkgPSBpKzE7CisgICAgICAgIH0KKyAgICAgICAgaiA9IGk7CisgICAgICAgIHdoaWxlIChpIDwgbGVuICYmICFpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgeworICAgICAgICAgICAgaSA9IGkrMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaiA8IGkpIHsKKyAgICAgICAgICAgIGl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2osIGktaik7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJCWNvdW50c3BsaXQrKzsKLQkJCXdoaWxlIChpIDwgbGVuICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7Ci0JCQkJaSA9IGkrMTsKLQkJCX0KLQkJCWlmIChtYXhzcGxpdCAmJiAoY291bnRzcGxpdCA+PSBtYXhzcGxpdCkgJiYgaSA8IGxlbikgewotCQkJCWl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzK2ksIGxlbiAtIGkpOwotCQkJCWlmIChpdGVtID09IE5VTEwpCi0JCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIGNvdW50c3BsaXQrKzsKKyAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7CisgICAgICAgICAgICAgICAgaSA9IGkrMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXhzcGxpdCAmJiAoY291bnRzcGxpdCA+PSBtYXhzcGxpdCkgJiYgaSA8IGxlbikgeworICAgICAgICAgICAgICAgIGl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgcytpLCBsZW4gLSBpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJCQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pOwotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlpZiAoZXJyIDwgMCkKLQkJCQkJZ290byBmaW5hbGx5OworICAgICAgICAgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgaXRlbSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJCQlpID0gbGVuOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBsaXN0OworICAgICAgICAgICAgICAgIGkgPSBsZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7CiAgIGZpbmFsbHk6Ci0JUHlfREVDUkVGKGxpc3QpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC05Niw2MCArOTYsNjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9zcGxpdGZpZWxkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBsZW4sIG4sIGksIGosIGVycjsKLQlQeV9zc2l6ZV90IHNwbGl0Y291bnQsIG1heHNwbGl0OwotCWNoYXIgKnMsICpzdWI7Ci0JUHlPYmplY3QgKmxpc3QsICppdGVtOworICAgIFB5X3NzaXplX3QgbGVuLCBuLCBpLCBqLCBlcnI7CisgICAgUHlfc3NpemVfdCBzcGxpdGNvdW50LCBtYXhzcGxpdDsKKyAgICBjaGFyICpzLCAqc3ViOworICAgIFB5T2JqZWN0ICpsaXN0LCAqaXRlbTsKIAotCVdBUk47Ci0Jc3ViID0gTlVMTDsKLQluID0gMDsKLQlzcGxpdGNvdW50ID0gMDsKLQltYXhzcGxpdCA9IDA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3x6I246c3BsaXQiLCAmcywgJmxlbiwgJnN1YiwgJm4sICZtYXhzcGxpdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChzdWIgPT0gTlVMTCkKLQkJcmV0dXJuIHNwbGl0X3doaXRlc3BhY2UocywgbGVuLCBtYXhzcGxpdCk7Ci0JaWYgKG4gPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHNlcGFyYXRvciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgV0FSTjsKKyAgICBzdWIgPSBOVUxMOworICAgIG4gPSAwOworICAgIHNwbGl0Y291bnQgPSAwOworICAgIG1heHNwbGl0ID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjfHojbjpzcGxpdCIsICZzLCAmbGVuLCAmc3ViLCAmbiwgJm1heHNwbGl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHN1YiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gc3BsaXRfd2hpdGVzcGFjZShzLCBsZW4sIG1heHNwbGl0KTsKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc2VwYXJhdG9yIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWxpc3QgPSBQeUxpc3RfTmV3KDApOwotCWlmIChsaXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaSA9IGogPSAwOwotCXdoaWxlIChpK24gPD0gbGVuKSB7Ci0JCWlmIChzW2ldID09IHN1YlswXSAmJiAobiA9PSAxIHx8IG1lbWNtcChzK2ksIHN1YiwgbikgPT0gMCkpIHsKLQkJCWl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2osIGktaik7Ci0JCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJCWdvdG8gZmFpbDsKLQkJCWVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgaXRlbSk7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQlpID0gaiA9IGkgKyBuOwotCQkJc3BsaXRjb3VudCsrOwotCQkJaWYgKG1heHNwbGl0ICYmIChzcGxpdGNvdW50ID49IG1heHNwbGl0KSkKLQkJCQlicmVhazsKLQkJfQotCQllbHNlCi0JCQlpKys7Ci0JfQotCWl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2osIGxlbi1qKTsKLQlpZiAoaXRlbSA9PSBOVUxMKQotCQlnb3RvIGZhaWw7Ci0JZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKLQlQeV9ERUNSRUYoaXRlbSk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZmFpbDsKKyAgICBpID0gaiA9IDA7CisgICAgd2hpbGUgKGkrbiA8PSBsZW4pIHsKKyAgICAgICAgaWYgKHNbaV0gPT0gc3ViWzBdICYmIChuID09IDEgfHwgbWVtY21wKHMraSwgc3ViLCBuKSA9PSAwKSkgeworICAgICAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraiwgaS1qKTsKKyAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGkgPSBqID0gaSArIG47CisgICAgICAgICAgICBzcGxpdGNvdW50Kys7CisgICAgICAgICAgICBpZiAobWF4c3BsaXQgJiYgKHNwbGl0Y291bnQgPj0gbWF4c3BsaXQpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGkrKzsKKyAgICB9CisgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraiwgbGVuLWopOworICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pOworICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOwogCi0JcmV0dXJuIGxpc3Q7CisgICAgcmV0dXJuIGxpc3Q7CiAKICBmYWlsOgotCVB5X0RFQ1JFRihsaXN0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtMTY2LDEyOCArMTY2LDEyOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX2pvaW5maWVsZHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpzZXE7Ci0JY2hhciAqc2VwID0gTlVMTDsKLQlQeV9zc2l6ZV90IHNlcWxlbiwgc2VwbGVuID0gMDsKLQlQeV9zc2l6ZV90IGksIHJlc2xlbiA9IDAsIHNsZW4gPSAwLCBzeiA9IDEwMDsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQljaGFyKiBwID0gTlVMTDsKLQlzc2l6ZWFyZ2Z1bmMgZ2V0aXRlbWZ1bmM7CisgICAgUHlPYmplY3QgKnNlcTsKKyAgICBjaGFyICpzZXAgPSBOVUxMOworICAgIFB5X3NzaXplX3Qgc2VxbGVuLCBzZXBsZW4gPSAwOworICAgIFB5X3NzaXplX3QgaSwgcmVzbGVuID0gMCwgc2xlbiA9IDAsIHN6ID0gMTAwOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGNoYXIqIHAgPSBOVUxMOworICAgIHNzaXplYXJnZnVuYyBnZXRpdGVtZnVuYzsKIAotCVdBUk47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHQjOmpvaW4iLCAmc2VxLCAmc2VwLCAmc2VwbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNlcCA9PSBOVUxMKSB7Ci0JCXNlcCA9ICIgIjsKLQkJc2VwbGVuID0gMTsKLQl9CisgICAgV0FSTjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98dCM6am9pbiIsICZzZXEsICZzZXAsICZzZXBsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc2VwID09IE5VTEwpIHsKKyAgICAgICAgc2VwID0gIiAiOworICAgICAgICBzZXBsZW4gPSAxOworICAgIH0KIAotCXNlcWxlbiA9IFB5U2VxdWVuY2VfU2l6ZShzZXEpOwotCWlmIChzZXFsZW4gPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIHNlcWxlbiA9IFB5U2VxdWVuY2VfU2l6ZShzZXEpOworICAgIGlmIChzZXFsZW4gPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHNlcWxlbiA9PSAxKSB7Ci0JCS8qIE9wdGltaXphdGlvbiBpZiB0aGVyZSdzIG9ubHkgb25lIGl0ZW0gKi8KLQkJUHlPYmplY3QgKml0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oc2VxLCAwKTsKLQkJaWYgKGl0ZW0gJiYgIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIik7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gaXRlbTsKLQl9CisgICAgaWYgKHNlcWxlbiA9PSAxKSB7CisgICAgICAgIC8qIE9wdGltaXphdGlvbiBpZiB0aGVyZSdzIG9ubHkgb25lIGl0ZW0gKi8KKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oc2VxLCAwKTsKKyAgICAgICAgaWYgKGl0ZW0gJiYgIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyIpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQogCi0JaWYgKCEocmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKU5VTEwsIHN6KSkpCi0JCXJldHVybiBOVUxMOwotCXAgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXMpOworICAgIGlmICghKHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKilOVUxMLCBzeikpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKTsKIAotCS8qIG9wdGltaXplIGZvciBsaXN0cywgc2luY2UgaXQncyB0aGUgbW9zdCBjb21tb24gY2FzZS4gIGFsbCBvdGhlcnMKLQkgKiAodHVwbGVzIGFuZCBhcmJpdHJhcnkgc2VxdWVuY2VzKSBqdXN0IHVzZSB0aGUgc2VxdWVuY2UgYWJzdHJhY3QKLQkgKiBpbnRlcmZhY2UuCi0JICovCi0JaWYgKFB5TGlzdF9DaGVjayhzZXEpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBzZXFsZW47IGkrKykgewotCQkJUHlPYmplY3QgKml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oc2VxLCBpKTsKLQkJCWlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIHNlcXVlbmNlIG9mIHN0cmluZ3MiKTsKLQkJCQlQeV9ERUNSRUYocmVzKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXNsZW4gPSBQeVN0cmluZ19HRVRfU0laRShpdGVtKTsKLQkJCWlmIChzbGVuID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4gfHwKLQkJCSAgICBzZXBsZW4gPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbiAtIHNlcGxlbikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkJImlucHV0IHRvbyBsb25nIik7Ci0JCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQl3aGlsZSAocmVzbGVuICsgc2xlbiArIHNlcGxlbiA+PSBzeikgewotCQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXMsIHN6ICogMikgPCAwKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQlzeiAqPSAyOwotCQkJCXAgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXMpICsgcmVzbGVuOwotCQkJfQotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJbWVtY3B5KHAsIHNlcCwgc2VwbGVuKTsKLQkJCQlwICs9IHNlcGxlbjsKLQkJCQlyZXNsZW4gKz0gc2VwbGVuOwotCQkJfQotCQkJbWVtY3B5KHAsIFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKSwgc2xlbik7Ci0JCQlwICs9IHNsZW47Ci0JCQlyZXNsZW4gKz0gc2xlbjsKLQkJfQotCQlfUHlTdHJpbmdfUmVzaXplKCZyZXMsIHJlc2xlbik7Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIC8qIG9wdGltaXplIGZvciBsaXN0cywgc2luY2UgaXQncyB0aGUgbW9zdCBjb21tb24gY2FzZS4gIGFsbCBvdGhlcnMKKyAgICAgKiAodHVwbGVzIGFuZCBhcmJpdHJhcnkgc2VxdWVuY2VzKSBqdXN0IHVzZSB0aGUgc2VxdWVuY2UgYWJzdHJhY3QKKyAgICAgKiBpbnRlcmZhY2UuCisgICAgICovCisgICAgaWYgKFB5TGlzdF9DaGVjayhzZXEpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZXFsZW47IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oc2VxLCBpKTsKKyAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIHNlcXVlbmNlIG9mIHN0cmluZ3MiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZW4gPSBQeVN0cmluZ19HRVRfU0laRShpdGVtKTsKKyAgICAgICAgICAgIGlmIChzbGVuID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4gfHwKKyAgICAgICAgICAgICAgICBzZXBsZW4gPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbiAtIHNlcGxlbikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChyZXNsZW4gKyBzbGVuICsgc2VwbGVuID49IHN6KSB7CisgICAgICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlcywgc3ogKiAyKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHN6ICo9IDI7CisgICAgICAgICAgICAgICAgcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcykgKyByZXNsZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkocCwgc2VwLCBzZXBsZW4pOworICAgICAgICAgICAgICAgIHAgKz0gc2VwbGVuOworICAgICAgICAgICAgICAgIHJlc2xlbiArPSBzZXBsZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkocCwgUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLCBzbGVuKTsKKyAgICAgICAgICAgIHAgKz0gc2xlbjsKKyAgICAgICAgICAgIHJlc2xlbiArPSBzbGVuOworICAgICAgICB9CisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJlcywgcmVzbGVuKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQlpZiAoc2VxLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSA9PSBOVUxMIHx8Ci0JCSAoZ2V0aXRlbWZ1bmMgPSBzZXEtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHNlcXVlbmNlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBUaGlzIGlzIG5vdyB0eXBlIHNhZmUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgc2VxbGVuOyBpKyspIHsKLQkJUHlPYmplY3QgKml0ZW0gPSBnZXRpdGVtZnVuYyhzZXEsIGkpOwotCQlpZiAoIWl0ZW0gfHwgIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIik7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCVB5X1hERUNSRUYoaXRlbSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSk7Ci0JCWlmIChzbGVuID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4gfHwKLQkJICAgIHNlcGxlbiA+IFBZX1NTSVpFX1RfTUFYIC0gcmVzbGVuIC0gc2VwbGVuKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJImlucHV0IHRvbyBsb25nIik7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCVB5X1hERUNSRUYoaXRlbSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQl3aGlsZSAocmVzbGVuICsgc2xlbiArIHNlcGxlbiA+PSBzeikgewotCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlcywgc3ogKiAyKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlzeiAqPSAyOwotCQkJcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcykgKyByZXNsZW47Ci0JCX0KLQkJaWYgKGkgPiAwKSB7Ci0JCQltZW1jcHkocCwgc2VwLCBzZXBsZW4pOwotCQkJcCArPSBzZXBsZW47Ci0JCQlyZXNsZW4gKz0gc2VwbGVuOwotCQl9Ci0JCW1lbWNweShwLCBQeVN0cmluZ19BU19TVFJJTkcoaXRlbSksIHNsZW4pOwotCQlwICs9IHNsZW47Ci0JCXJlc2xlbiArPSBzbGVuOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQotCV9QeVN0cmluZ19SZXNpemUoJnJlcywgcmVzbGVuKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChzZXEtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlID09IE5VTEwgfHwKKyAgICAgICAgICAgICAoZ2V0aXRlbWZ1bmMgPSBzZXEtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc2VxdWVuY2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIFRoaXMgaXMgbm93IHR5cGUgc2FmZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzZXFsZW47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IGdldGl0ZW1mdW5jKHNlcSwgaSk7CisgICAgICAgIGlmICghaXRlbSB8fCAhUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIik7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoaXRlbSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSk7CisgICAgICAgIGlmIChzbGVuID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4gfHwKKyAgICAgICAgICAgIHNlcGxlbiA+IFBZX1NTSVpFX1RfTUFYIC0gcmVzbGVuIC0gc2VwbGVuKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgUHlfWERFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChyZXNsZW4gKyBzbGVuICsgc2VwbGVuID49IHN6KSB7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzLCBzeiAqIDIpIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN6ICo9IDI7CisgICAgICAgICAgICBwID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSArIHJlc2xlbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweShwLCBzZXAsIHNlcGxlbik7CisgICAgICAgICAgICBwICs9IHNlcGxlbjsKKyAgICAgICAgICAgIHJlc2xlbiArPSBzZXBsZW47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHAsIFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKSwgc2xlbik7CisgICAgICAgIHAgKz0gc2xlbjsKKyAgICAgICAgcmVzbGVuICs9IHNsZW47CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzLCByZXNsZW4pOworICAgIHJldHVybiByZXM7CiB9CiAKIApAQCAtMzAzLDM0ICszMDMsMzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9maW5kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzLCAqc3ViOwotCVB5X3NzaXplX3QgbGVuLCBuLCBpID0gMCwgbGFzdCA9IFBZX1NTSVpFX1RfTUFYOworICAgIGNoYXIgKnMsICpzdWI7CisgICAgUHlfc3NpemVfdCBsZW4sIG4sIGkgPSAwLCBsYXN0ID0gUFlfU1NJWkVfVF9NQVg7CiAKLQlXQVJOOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3xubjpmaW5kIiwgJnMsICZsZW4sICZzdWIsICZuLCAmaSwgJmxhc3QpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBXQVJOOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3xubjpmaW5kIiwgJnMsICZsZW4sICZzdWIsICZuLCAmaSwgJmxhc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChsYXN0ID4gbGVuKQotCQlsYXN0ID0gbGVuOwotCWlmIChsYXN0IDwgMCkKLQkJbGFzdCArPSBsZW47Ci0JaWYgKGxhc3QgPCAwKQotCQlsYXN0ID0gMDsKLQlpZiAoaSA8IDApCi0JCWkgKz0gbGVuOwotCWlmIChpIDwgMCkKLQkJaSA9IDA7CisgICAgaWYgKGxhc3QgPiBsZW4pCisgICAgICAgIGxhc3QgPSBsZW47CisgICAgaWYgKGxhc3QgPCAwKQorICAgICAgICBsYXN0ICs9IGxlbjsKKyAgICBpZiAobGFzdCA8IDApCisgICAgICAgIGxhc3QgPSAwOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgaSArPSBsZW47CisgICAgaWYgKGkgPCAwKQorICAgICAgICBpID0gMDsKIAotCWlmIChuID09IDAgJiYgaSA8PSBsYXN0KQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaSk7CisgICAgaWYgKG4gPT0gMCAmJiBpIDw9IGxhc3QpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylpKTsKIAotCWxhc3QgLT0gbjsKLQlmb3IgKDsgaSA8PSBsYXN0OyArK2kpCi0JCWlmIChzW2ldID09IHN1YlswXSAmJgotCQkgICAgKG4gPT0gMSB8fCBtZW1jbXAoJnNbaSsxXSwgJnN1YlsxXSwgbi0xKSA9PSAwKSkKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylpKTsKKyAgICBsYXN0IC09IG47CisgICAgZm9yICg7IGkgPD0gbGFzdDsgKytpKQorICAgICAgICBpZiAoc1tpXSA9PSBzdWJbMF0gJiYKKyAgICAgICAgICAgIChuID09IDEgfHwgbWVtY21wKCZzW2krMV0sICZzdWJbMV0sIG4tMSkgPT0gMCkpCisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoLTFMKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoLTFMKTsKIH0KIAogCkBAIC0zNDYsNjggKzM0Niw2OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX3JmaW5kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzLCAqc3ViOwotCVB5X3NzaXplX3QgbGVuLCBuLCBqOwotCVB5X3NzaXplX3QgaSA9IDAsIGxhc3QgPSBQWV9TU0laRV9UX01BWDsKKyAgICBjaGFyICpzLCAqc3ViOworICAgIFB5X3NzaXplX3QgbGVuLCBuLCBqOworICAgIFB5X3NzaXplX3QgaSA9IDAsIGxhc3QgPSBQWV9TU0laRV9UX01BWDsKIAotCVdBUk47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjfG5uOnJmaW5kIiwgJnMsICZsZW4sICZzdWIsICZuLCAmaSwgJmxhc3QpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBXQVJOOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3xubjpyZmluZCIsICZzLCAmbGVuLCAmc3ViLCAmbiwgJmksICZsYXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobGFzdCA+IGxlbikKLQkJbGFzdCA9IGxlbjsKLQlpZiAobGFzdCA8IDApCi0JCWxhc3QgKz0gbGVuOwotCWlmIChsYXN0IDwgMCkKLQkJbGFzdCA9IDA7Ci0JaWYgKGkgPCAwKQotCQlpICs9IGxlbjsKLQlpZiAoaSA8IDApCi0JCWkgPSAwOworICAgIGlmIChsYXN0ID4gbGVuKQorICAgICAgICBsYXN0ID0gbGVuOworICAgIGlmIChsYXN0IDwgMCkKKyAgICAgICAgbGFzdCArPSBsZW47CisgICAgaWYgKGxhc3QgPCAwKQorICAgICAgICBsYXN0ID0gMDsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIGkgKz0gbGVuOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgaSA9IDA7CiAKLQlpZiAobiA9PSAwICYmIGkgPD0gbGFzdCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWxhc3QpOworICAgIGlmIChuID09IDAgJiYgaSA8PSBsYXN0KQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbGFzdCk7CiAKLQlmb3IgKGogPSBsYXN0LW47IGogPj0gaTsgLS1qKQotCQlpZiAoc1tqXSA9PSBzdWJbMF0gJiYKLQkJICAgIChuID09IDEgfHwgbWVtY21wKCZzW2orMV0sICZzdWJbMV0sIG4tMSkgPT0gMCkpCi0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaik7CisgICAgZm9yIChqID0gbGFzdC1uOyBqID49IGk7IC0taikKKyAgICAgICAgaWYgKHNbal0gPT0gc3ViWzBdICYmCisgICAgICAgICAgICAobiA9PSAxIHx8IG1lbWNtcCgmc1tqKzFdLCAmc3ViWzFdLCBuLTEpID09IDApKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWopOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKC0xTCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKC0xTCk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRvX3N0cmlwKFB5T2JqZWN0ICphcmdzLCBpbnQgc3RyaXB0eXBlKQogewotCWNoYXIgKnM7Ci0JUHlfc3NpemVfdCBsZW4sIGksIGo7CisgICAgY2hhciAqczsKKyAgICBQeV9zc2l6ZV90IGxlbiwgaSwgajsKIAogCi0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJmxlbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWkgPSAwOwotCWlmIChzdHJpcHR5cGUgIT0gUklHSFRTVFJJUCkgewotCQl3aGlsZSAoaSA8IGxlbiAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgewotCQkJaSsrOwotCQl9Ci0JfQorICAgIGkgPSAwOworICAgIGlmIChzdHJpcHR5cGUgIT0gUklHSFRTVFJJUCkgeworICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgeworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQogCi0JaiA9IGxlbjsKLQlpZiAoc3RyaXB0eXBlICE9IExFRlRTVFJJUCkgewotCQlkbyB7Ci0JCQlqLS07Ci0JCX0gd2hpbGUgKGogPj0gaSAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbal0pKSk7Ci0JCWorKzsKLQl9CisgICAgaiA9IGxlbjsKKyAgICBpZiAoc3RyaXB0eXBlICE9IExFRlRTVFJJUCkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBqLS07CisgICAgICAgIH0gd2hpbGUgKGogPj0gaSAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbal0pKSk7CisgICAgICAgIGorKzsKKyAgICB9CiAKLQlpZiAoaSA9PSAwICYmIGogPT0gbGVuKSB7Ci0JCVB5X0lOQ1JFRihhcmdzKTsKLQkJcmV0dXJuIGFyZ3M7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraSwgai1pKTsKKyAgICBpZiAoaSA9PSAwICYmIGogPT0gbGVuKSB7CisgICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraSwgai1pKTsKIH0KIAogCkBAIC00MjAsOCArNDIwLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9zdHJpcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JV0FSTjsKLQlyZXR1cm4gZG9fc3RyaXAoYXJncywgQk9USFNUUklQKTsKKyAgICBXQVJOOworICAgIHJldHVybiBkb19zdHJpcChhcmdzLCBCT1RIU1RSSVApOwogfQogCiAKQEAgLTQzMyw4ICs0MzMsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX2xzdHJpcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JV0FSTjsKLQlyZXR1cm4gZG9fc3RyaXAoYXJncywgTEVGVFNUUklQKTsKKyAgICBXQVJOOworICAgIHJldHVybiBkb19zdHJpcChhcmdzLCBMRUZUU1RSSVApOwogfQogCiAKQEAgLTQ0Niw4ICs0NDYsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX3JzdHJpcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JV0FSTjsKLQlyZXR1cm4gZG9fc3RyaXAoYXJncywgUklHSFRTVFJJUCk7CisgICAgV0FSTjsKKyAgICByZXR1cm4gZG9fc3RyaXAoYXJncywgUklHSFRTVFJJUCk7CiB9CiAKIApAQCAtNDU5LDM0ICs0NTksMzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9sb3dlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcywgKnNfbmV3OwotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqbmV3c3RyOwotCWludCBjaGFuZ2VkOworICAgIGNoYXIgKnMsICpzX25ldzsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKm5ld3N0cjsKKyAgICBpbnQgY2hhbmdlZDsKIAotCVdBUk47Ci0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQluZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3c3RyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKLQljaGFuZ2VkID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc3VwcGVyKGMpKSB7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCSpzX25ldyA9IHRvbG93ZXIoYyk7Ci0JCX0gZWxzZQotCQkJKnNfbmV3ID0gYzsKLQkJc19uZXcrKzsKLQl9Ci0JaWYgKCFjaGFuZ2VkKSB7Ci0JCVB5X0RFQ1JFRihuZXdzdHIpOwotCQlQeV9JTkNSRUYoYXJncyk7Ci0JCXJldHVybiBhcmdzOwotCX0KLQlyZXR1cm4gbmV3c3RyOworICAgIFdBUk47CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAobmV3c3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKKyAgICBjaGFuZ2VkID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgIGlmIChpc3VwcGVyKGMpKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICAgICAgICAgICpzX25ldyA9IHRvbG93ZXIoYyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgKnNfbmV3ID0gYzsKKyAgICAgICAgc19uZXcrKzsKKyAgICB9CisgICAgaWYgKCFjaGFuZ2VkKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdzdHIpOworICAgICAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKyAgICByZXR1cm4gbmV3c3RyOwogfQogCiAKQEAgLTQ5OCwzNCArNDk4LDM0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfdXBwZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICpzX25ldzsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKm5ld3N0cjsKLQlpbnQgY2hhbmdlZDsKKyAgICBjaGFyICpzLCAqc19uZXc7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICpuZXdzdHI7CisgICAgaW50IGNoYW5nZWQ7CiAKLQlXQVJOOwotCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ld3N0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld3N0cik7Ci0JY2hhbmdlZCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoaXNsb3dlcihjKSkgewotCQkJY2hhbmdlZCA9IDE7Ci0JCQkqc19uZXcgPSB0b3VwcGVyKGMpOwotCQl9IGVsc2UKLQkJCSpzX25ldyA9IGM7Ci0JCXNfbmV3Kys7Ci0JfQotCWlmICghY2hhbmdlZCkgewotCQlQeV9ERUNSRUYobmV3c3RyKTsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCQlyZXR1cm4gYXJnczsKLQl9Ci0JcmV0dXJuIG5ld3N0cjsKKyAgICBXQVJOOworICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKG5ld3N0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld3N0cik7CisgICAgY2hhbmdlZCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICBpZiAoaXNsb3dlcihjKSkgeworICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgICAgICAqc19uZXcgPSB0b3VwcGVyKGMpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICpzX25ldyA9IGM7CisgICAgICAgIHNfbmV3Kys7CisgICAgfQorICAgIGlmICghY2hhbmdlZCkgeworICAgICAgICBQeV9ERUNSRUYobmV3c3RyKTsKKyAgICAgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisgICAgcmV0dXJuIG5ld3N0cjsKIH0KIAogCkBAIC01MzgsNDMgKzUzOCw0MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX2NhcGl0YWxpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICpzX25ldzsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKm5ld3N0cjsKLQlpbnQgY2hhbmdlZDsKKyAgICBjaGFyICpzLCAqc19uZXc7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICpuZXdzdHI7CisgICAgaW50IGNoYW5nZWQ7CiAKLQlXQVJOOwotCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ld3N0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld3N0cik7Ci0JY2hhbmdlZCA9IDA7Ci0JaWYgKDAgPCBuKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc2xvd2VyKGMpKSB7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCSpzX25ldyA9IHRvdXBwZXIoYyk7Ci0JCX0gZWxzZQotCQkJKnNfbmV3ID0gYzsKLQkJc19uZXcrKzsKLQl9Ci0JZm9yIChpID0gMTsgaSA8IG47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoaXN1cHBlcihjKSkgewotCQkJY2hhbmdlZCA9IDE7Ci0JCQkqc19uZXcgPSB0b2xvd2VyKGMpOwotCQl9IGVsc2UKLQkJCSpzX25ldyA9IGM7Ci0JCXNfbmV3Kys7Ci0JfQotCWlmICghY2hhbmdlZCkgewotCQlQeV9ERUNSRUYobmV3c3RyKTsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCQlyZXR1cm4gYXJnczsKLQl9Ci0JcmV0dXJuIG5ld3N0cjsKKyAgICBXQVJOOworICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKG5ld3N0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld3N0cik7CisgICAgY2hhbmdlZCA9IDA7CisgICAgaWYgKDAgPCBuKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgIGlmIChpc2xvd2VyKGMpKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICAgICAgICAgICpzX25ldyA9IHRvdXBwZXIoYyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgKnNfbmV3ID0gYzsKKyAgICAgICAgc19uZXcrKzsKKyAgICB9CisgICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICBpZiAoaXN1cHBlcihjKSkgeworICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgICAgICAqc19uZXcgPSB0b2xvd2VyKGMpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICpzX25ldyA9IGM7CisgICAgICAgIHNfbmV3Kys7CisgICAgfQorICAgIGlmICghY2hhbmdlZCkgeworICAgICAgICBQeV9ERUNSRUYobmV3c3RyKTsKKyAgICAgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisgICAgcmV0dXJuIG5ld3N0cjsKIH0KIAogCkBAIC01ODksNzUgKzU4OSw3NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX2V4cGFuZHRhYnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCS8qIE9yaWdpbmFsIGJ5IEZyZWRyaWsgTHVuZGggKi8KLQljaGFyKiBlOwotCWNoYXIqIHA7Ci0JY2hhciogcTsKLQlQeV9zc2l6ZV90IGksIGosIG9sZF9qOwotCVB5T2JqZWN0KiBvdXQ7Ci0JY2hhciogc3RyaW5nOwotCVB5X3NzaXplX3Qgc3RyaW5nbGVuOwotCWludCB0YWJzaXplID0gODsKKyAgICAvKiBPcmlnaW5hbCBieSBGcmVkcmlrIEx1bmRoICovCisgICAgY2hhciogZTsKKyAgICBjaGFyKiBwOworICAgIGNoYXIqIHE7CisgICAgUHlfc3NpemVfdCBpLCBqLCBvbGRfajsKKyAgICBQeU9iamVjdCogb3V0OworICAgIGNoYXIqIHN0cmluZzsKKyAgICBQeV9zc2l6ZV90IHN0cmluZ2xlbjsKKyAgICBpbnQgdGFic2l6ZSA9IDg7CiAKLQlXQVJOOwotCS8qIEdldCBhcmd1bWVudHMgKi8KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfGk6ZXhwYW5kdGFicyIsICZzdHJpbmcsICZzdHJpbmdsZW4sICZ0YWJzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHRhYnNpemUgPCAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJ0YWJzaXplIG11c3QgYmUgYXQgbGVhc3QgMSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgV0FSTjsKKyAgICAvKiBHZXQgYXJndW1lbnRzICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xpOmV4cGFuZHRhYnMiLCAmc3RyaW5nLCAmc3RyaW5nbGVuLCAmdGFic2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh0YWJzaXplIDwgMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0YWJzaXplIG11c3QgYmUgYXQgbGVhc3QgMSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBGaXJzdCBwYXNzOiBkZXRlcm1pbmUgc2l6ZSBvZiBvdXRwdXQgc3RyaW5nICovCi0JaSA9IGogPSBvbGRfaiA9IDA7IC8qIGo6IGN1cnJlbnQgY29sdW1uOyBpOiB0b3RhbCBvZiBwcmV2aW91cyBsaW5lcyAqLwotCWUgPSBzdHJpbmcgKyBzdHJpbmdsZW47Ci0JZm9yIChwID0gc3RyaW5nOyBwIDwgZTsgcCsrKSB7Ci0JCWlmICgqcCA9PSAnXHQnKSB7Ci0JCQlqICs9IHRhYnNpemUgLSAoaiV0YWJzaXplKTsKLQkJCWlmIChvbGRfaiA+IGopIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJCSJuZXcgc3RyaW5nIGlzIHRvbyBsb25nIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlvbGRfaiA9IGo7Ci0JCX0gZWxzZSB7Ci0JCQlqKys7Ci0JCQlpZiAoKnAgPT0gJ1xuJykgewotCQkJCWkgKz0gajsKLQkJCQlqID0gMDsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBGaXJzdCBwYXNzOiBkZXRlcm1pbmUgc2l6ZSBvZiBvdXRwdXQgc3RyaW5nICovCisgICAgaSA9IGogPSBvbGRfaiA9IDA7IC8qIGo6IGN1cnJlbnQgY29sdW1uOyBpOiB0b3RhbCBvZiBwcmV2aW91cyBsaW5lcyAqLworICAgIGUgPSBzdHJpbmcgKyBzdHJpbmdsZW47CisgICAgZm9yIChwID0gc3RyaW5nOyBwIDwgZTsgcCsrKSB7CisgICAgICAgIGlmICgqcCA9PSAnXHQnKSB7CisgICAgICAgICAgICBqICs9IHRhYnNpemUgLSAoaiV0YWJzaXplKTsKKyAgICAgICAgICAgIGlmIChvbGRfaiA+IGopIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldyBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9sZF9qID0gajsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgaSArPSBqOworICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKChpICsgaikgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibmV3IHN0cmluZyBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChpICsgaikgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibmV3IHN0cmluZyBpcyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBTZWNvbmQgcGFzczogY3JlYXRlIG91dHB1dCBzdHJpbmcgYW5kIGZpbGwgaXQgKi8KLQlvdXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBpK2opOwotCWlmIChvdXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogU2Vjb25kIHBhc3M6IGNyZWF0ZSBvdXRwdXQgc3RyaW5nIGFuZCBmaWxsIGl0ICovCisgICAgb3V0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgaStqKTsKKyAgICBpZiAob3V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaSA9IDA7Ci0JcSA9IFB5U3RyaW5nX0FTX1NUUklORyhvdXQpOworICAgIGkgPSAwOworICAgIHEgPSBQeVN0cmluZ19BU19TVFJJTkcob3V0KTsKIAotCWZvciAocCA9IHN0cmluZzsgcCA8IGU7IHArKykgewotCQlpZiAoKnAgPT0gJ1x0JykgewotCQkJaiA9IHRhYnNpemUgLSAoaSV0YWJzaXplKTsKLQkJCWkgKz0gajsKLQkJCXdoaWxlIChqLS0gPiAwKQotCQkJCSpxKysgPSAnICc7Ci0JCX0gZWxzZSB7Ci0JCQkqcSsrID0gKnA7Ci0JCQlpKys7Ci0JCQlpZiAoKnAgPT0gJ1xuJykKLQkJCQlpID0gMDsKLQkJfQotCX0KKyAgICBmb3IgKHAgPSBzdHJpbmc7IHAgPCBlOyBwKyspIHsKKyAgICAgICAgaWYgKCpwID09ICdcdCcpIHsKKyAgICAgICAgICAgIGogPSB0YWJzaXplIC0gKGkldGFic2l6ZSk7CisgICAgICAgICAgICBpICs9IGo7CisgICAgICAgICAgICB3aGlsZSAoai0tID4gMCkKKyAgICAgICAgICAgICAgICAqcSsrID0gJyAnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnErKyA9ICpwOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaWYgKCpwID09ICdcbicpCisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gb3V0OworICAgIHJldHVybiBvdXQ7CiB9CiAKIApAQCAtNjcxLDM4ICs2NzEsMzggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9jb3VudChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcywgKnN1YjsKLQlQeV9zc2l6ZV90IGxlbiwgbjsKLQlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gUFlfU1NJWkVfVF9NQVg7Ci0JUHlfc3NpemVfdCBtLCByOworICAgIGNoYXIgKnMsICpzdWI7CisgICAgUHlfc3NpemVfdCBsZW4sIG47CisgICAgUHlfc3NpemVfdCBpID0gMCwgbGFzdCA9IFBZX1NTSVpFX1RfTUFYOworICAgIFB5X3NzaXplX3QgbSwgcjsKIAotCVdBUk47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjfG5uOmNvdW50IiwgJnMsICZsZW4sICZzdWIsICZuLCAmaSwgJmxhc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobGFzdCA+IGxlbikKLQkJbGFzdCA9IGxlbjsKLQlpZiAobGFzdCA8IDApCi0JCWxhc3QgKz0gbGVuOwotCWlmIChsYXN0IDwgMCkKLQkJbGFzdCA9IDA7Ci0JaWYgKGkgPCAwKQotCQlpICs9IGxlbjsKLQlpZiAoaSA8IDApCi0JCWkgPSAwOwotCW0gPSBsYXN0ICsgMSAtIG47Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAobS1pKSk7CisgICAgV0FSTjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjdCN8bm46Y291bnQiLCAmcywgJmxlbiwgJnN1YiwgJm4sICZpLCAmbGFzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChsYXN0ID4gbGVuKQorICAgICAgICBsYXN0ID0gbGVuOworICAgIGlmIChsYXN0IDwgMCkKKyAgICAgICAgbGFzdCArPSBsZW47CisgICAgaWYgKGxhc3QgPCAwKQorICAgICAgICBsYXN0ID0gMDsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIGkgKz0gbGVuOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgaSA9IDA7CisgICAgbSA9IGxhc3QgKyAxIC0gbjsKKyAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIChtLWkpKTsKIAotCXIgPSAwOwotCXdoaWxlIChpIDwgbSkgewotCQlpZiAoIW1lbWNtcChzK2ksIHN1YiwgbikpIHsKLQkJCXIrKzsKLQkJCWkgKz0gbjsKLQkJfSBlbHNlIHsKLQkJCWkrKzsKLQkJfQotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHIpOworICAgIHIgPSAwOworICAgIHdoaWxlIChpIDwgbSkgeworICAgICAgICBpZiAoIW1lbWNtcChzK2ksIHN1YiwgbikpIHsKKyAgICAgICAgICAgIHIrKzsKKyAgICAgICAgICAgIGkgKz0gbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHIpOwogfQogCiAKQEAgLTcxNSwzOSArNzE1LDM5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3Bfc3dhcGNhc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICpzX25ldzsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKm5ld3N0cjsKLQlpbnQgY2hhbmdlZDsKKyAgICBjaGFyICpzLCAqc19uZXc7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICpuZXdzdHI7CisgICAgaW50IGNoYW5nZWQ7CiAKLQlXQVJOOwotCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ld3N0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld3N0cik7Ci0JY2hhbmdlZCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoaXNsb3dlcihjKSkgewotCQkJY2hhbmdlZCA9IDE7Ci0JCQkqc19uZXcgPSB0b3VwcGVyKGMpOwotCQl9Ci0JCWVsc2UgaWYgKGlzdXBwZXIoYykpIHsKLQkJCWNoYW5nZWQgPSAxOwotCQkJKnNfbmV3ID0gdG9sb3dlcihjKTsKLQkJfQotCQllbHNlCi0JCQkqc19uZXcgPSBjOwotCQlzX25ldysrOwotCX0KLQlpZiAoIWNoYW5nZWQpIHsKLQkJUHlfREVDUkVGKG5ld3N0cik7Ci0JCVB5X0lOQ1JFRihhcmdzKTsKLQkJcmV0dXJuIGFyZ3M7Ci0JfQotCXJldHVybiBuZXdzdHI7CisgICAgV0FSTjsKKyAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworICAgIGlmIChuZXdzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOworICAgIGNoYW5nZWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKKyAgICAgICAgaWYgKGlzbG93ZXIoYykpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgKnNfbmV3ID0gdG91cHBlcihjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpc3VwcGVyKGMpKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICAgICAgICAgICpzX25ldyA9IHRvbG93ZXIoYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnNfbmV3ID0gYzsKKyAgICAgICAgc19uZXcrKzsKKyAgICB9CisgICAgaWYgKCFjaGFuZ2VkKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdzdHIpOworICAgICAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKyAgICByZXR1cm4gbmV3c3RyOwogfQogCiAKQEAgLTc2NCw0NSArNzY0LDQ1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfYXRvaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcywgKmVuZDsKLQlpbnQgYmFzZSA9IDEwOwotCWxvbmcgeDsKLQljaGFyIGJ1ZmZlclsyNTZdOyAvKiBGb3IgZXJyb3JzICovCisgICAgY2hhciAqcywgKmVuZDsKKyAgICBpbnQgYmFzZSA9IDEwOworICAgIGxvbmcgeDsKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOyAvKiBGb3IgZXJyb3JzICovCiAKLQlXQVJOOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xpOmF0b2kiLCAmcywgJmJhc2UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBXQVJOOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xpOmF0b2kiLCAmcywgJmJhc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgoYmFzZSAhPSAwICYmIGJhc2UgPCAyKSB8fCBiYXNlID4gMzYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGJhc2UgZm9yIGF0b2koKSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChiYXNlICE9IDAgJiYgYmFzZSA8IDIpIHx8IGJhc2UgPiAzNikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgYmFzZSBmb3IgYXRvaSgpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCi0JCXMrKzsKLQllcnJubyA9IDA7Ci0JaWYgKGJhc2UgPT0gMCAmJiBzWzBdID09ICcwJykKLQkJeCA9IChsb25nKSBQeU9TX3N0cnRvdWwocywgJmVuZCwgYmFzZSk7Ci0JZWxzZQotCQl4ID0gUHlPU19zdHJ0b2wocywgJmVuZCwgYmFzZSk7Ci0JaWYgKGVuZCA9PSBzIHx8ICFpc2FsbnVtKFB5X0NIQVJNQVNLKGVuZFstMV0pKSkKLQkJZ290byBiYWQ7Ci0Jd2hpbGUgKCplbmQgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqZW5kKSkpCi0JCWVuZCsrOwotCWlmICgqZW5kICE9ICdcMCcpIHsKKyAgICB3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQorICAgICAgICBzKys7CisgICAgZXJybm8gPSAwOworICAgIGlmIChiYXNlID09IDAgJiYgc1swXSA9PSAnMCcpCisgICAgICAgIHggPSAobG9uZykgUHlPU19zdHJ0b3VsKHMsICZlbmQsIGJhc2UpOworICAgIGVsc2UKKyAgICAgICAgeCA9IFB5T1Nfc3RydG9sKHMsICZlbmQsIGJhc2UpOworICAgIGlmIChlbmQgPT0gcyB8fCAhaXNhbG51bShQeV9DSEFSTUFTSyhlbmRbLTFdKSkpCisgICAgICAgIGdvdG8gYmFkOworICAgIHdoaWxlICgqZW5kICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmVuZCkpKQorICAgICAgICBlbmQrKzsKKyAgICBpZiAoKmVuZCAhPSAnXDAnKSB7CiAgIGJhZDoKLQkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgYXRvaSgpOiAlLjIwMHMiLCBzKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIGlmIChlcnJubyAhPSAwKSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgCi0JCQkgICAgICAiYXRvaSgpIGxpdGVyYWwgdG9vIGxhcmdlOiAlLjIwMHMiLCBzKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBhdG9pKCk6ICUuMjAwcyIsIHMpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKGVycm5vICE9IDApIHsKKyAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICJhdG9pKCkgbGl0ZXJhbCB0b28gbGFyZ2U6ICUuMjAwcyIsIHMpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKIH0KIAogCkBAIC04MjAsNDEgKzgyMCw0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX2F0b2woUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICplbmQ7Ci0JaW50IGJhc2UgPSAxMDsKLQlQeU9iamVjdCAqeDsKLQljaGFyIGJ1ZmZlclsyNTZdOyAvKiBGb3IgZXJyb3JzICovCisgICAgY2hhciAqcywgKmVuZDsKKyAgICBpbnQgYmFzZSA9IDEwOworICAgIFB5T2JqZWN0ICp4OworICAgIGNoYXIgYnVmZmVyWzI1Nl07IC8qIEZvciBlcnJvcnMgKi8KIAotCVdBUk47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfGk6YXRvbCIsICZzLCAmYmFzZSkpCi0JCXJldHVybiBOVUxMOworICAgIFdBUk47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfGk6YXRvbCIsICZzLCAmYmFzZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKChiYXNlICE9IDAgJiYgYmFzZSA8IDIpIHx8IGJhc2UgPiAzNikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgYmFzZSBmb3IgYXRvbCgpIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKGJhc2UgIT0gMCAmJiBiYXNlIDwgMikgfHwgYmFzZSA+IDM2KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBiYXNlIGZvciBhdG9sKCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKLQkJcysrOwotCWlmIChzWzBdID09ICdcMCcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBzdHJpbmcgZm9yIGF0b2woKSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JeCA9IFB5TG9uZ19Gcm9tU3RyaW5nKHMsICZlbmQsIGJhc2UpOwotCWlmICh4ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChiYXNlID09IDAgJiYgKCplbmQgPT0gJ2wnIHx8ICplbmQgPT0gJ0wnKSkKLQkJZW5kKys7Ci0Jd2hpbGUgKCplbmQgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqZW5kKSkpCi0JCWVuZCsrOwotCWlmICgqZW5kICE9ICdcMCcpIHsKLQkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgYXRvbCgpOiAlLjIwMHMiLCBzKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7Ci0JCVB5X0RFQ1JFRih4KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB4OworICAgIHdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCisgICAgICAgIHMrKzsKKyAgICBpZiAoc1swXSA9PSAnXDAnKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc3RyaW5nIGZvciBhdG9sKCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHggPSBQeUxvbmdfRnJvbVN0cmluZyhzLCAmZW5kLCBiYXNlKTsKKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYmFzZSA9PSAwICYmICgqZW5kID09ICdsJyB8fCAqZW5kID09ICdMJykpCisgICAgICAgIGVuZCsrOworICAgIHdoaWxlICgqZW5kICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmVuZCkpKQorICAgICAgICBlbmQrKzsKKyAgICBpZiAoKmVuZCAhPSAnXDAnKSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBhdG9sKCk6ICUuMjAwcyIsIHMpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKKyAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHg7CiB9CiAKIApAQCAtODY2LDM0ICs4NjYsMzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9hdG9mKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzLCAqZW5kOwotCWRvdWJsZSB4OwotCWNoYXIgYnVmZmVyWzI1Nl07IC8qIEZvciBlcnJvcnMgKi8KKyAgICBjaGFyICpzLCAqZW5kOworICAgIGRvdWJsZSB4OworICAgIGNoYXIgYnVmZmVyWzI1Nl07IC8qIEZvciBlcnJvcnMgKi8KIAotCVdBUk47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmF0b2YiLCAmcykpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCi0JCXMrKzsKLQlpZiAoc1swXSA9PSAnXDAnKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc3RyaW5nIGZvciBhdG9mKCkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFdBUk47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmF0b2YiLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCisgICAgICAgIHMrKzsKKyAgICBpZiAoc1swXSA9PSAnXDAnKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc3RyaW5nIGZvciBhdG9mKCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlGUEVfU1RBUlRfUFJPVEVDVCgic3Ryb3BfYXRvZiIsIHJldHVybiAwKQotCXggPSBQeU9TX3N0cmluZ190b19kb3VibGUocywgJmVuZCwgUHlFeGNfT3ZlcmZsb3dFcnJvcik7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoeCkKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQl3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKLQkJZW5kKys7Ci0JaWYgKCplbmQgIT0gJ1wwJykgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBhdG9mKCk6ICUuMjAwcyIsIHMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgic3Ryb3BfYXRvZiIsIHJldHVybiAwKQorICAgIHggPSBQeU9TX3N0cmluZ190b19kb3VibGUocywgJmVuZCwgUHlFeGNfT3ZlcmZsb3dFcnJvcik7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoeCkKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKKyAgICAgICAgZW5kKys7CisgICAgaWYgKCplbmQgIT0gJ1wwJykgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgYXRvZigpOiAlLjIwMHMiLCBzKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwogfQogCiAKQEAgLTkwNywyOSArOTA3LDI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfbWFrZXRyYW5zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBjaGFyICpjLCAqZnJvbT1OVUxMLCAqdG89TlVMTDsKLQlQeV9zc2l6ZV90IGksIGZyb21sZW49MCwgdG9sZW49MDsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIHVuc2lnbmVkIGNoYXIgKmMsICpmcm9tPU5VTEwsICp0bz1OVUxMOworICAgIFB5X3NzaXplX3QgaSwgZnJvbWxlbj0wLCB0b2xlbj0wOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjdCM6bWFrZXRyYW5zIiwgJmZyb20sICZmcm9tbGVuLCAmdG8sICZ0b2xlbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0IzptYWtldHJhbnMiLCAmZnJvbSwgJmZyb21sZW4sICZ0bywgJnRvbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZnJvbWxlbiAhPSB0b2xlbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibWFrZXRyYW5zIGFyZ3VtZW50cyBtdXN0IGhhdmUgc2FtZSBsZW5ndGgiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChmcm9tbGVuICE9IHRvbGVuKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1ha2V0cmFucyBhcmd1bWVudHMgbXVzdCBoYXZlIHNhbWUgbGVuZ3RoIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgMjU2KTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWMgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcmVzdWx0KTsKLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCWNbaV09KHVuc2lnbmVkIGNoYXIpaTsKLQlmb3IgKGkgPSAwOyBpIDwgZnJvbWxlbjsgaSsrKQotCQljW2Zyb21baV1dPXRvW2ldOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgMjU2KTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGMgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcmVzdWx0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgIGNbaV09KHVuc2lnbmVkIGNoYXIpaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJvbWxlbjsgaSsrKQorICAgICAgICBjW2Zyb21baV1dPXRvW2ldOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTk0NCw2OSArOTQ0LDY5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfdHJhbnNsYXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZWdpc3RlciBjaGFyICppbnB1dCwgKnRhYmxlLCAqb3V0cHV0OwotCVB5X3NzaXplX3QgaTsgCi0JaW50IGMsIGNoYW5nZWQgPSAwOwotCVB5T2JqZWN0ICppbnB1dF9vYmo7Ci0JY2hhciAqdGFibGUxLCAqb3V0cHV0X3N0YXJ0LCAqZGVsX3RhYmxlPU5VTEw7Ci0JUHlfc3NpemVfdCBpbmxlbiwgdGFibGVuLCBkZWxsZW4gPSAwOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JaW50IHRyYW5zX3RhYmxlWzI1Nl07CisgICAgcmVnaXN0ZXIgY2hhciAqaW5wdXQsICp0YWJsZSwgKm91dHB1dDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IGMsIGNoYW5nZWQgPSAwOworICAgIFB5T2JqZWN0ICppbnB1dF9vYmo7CisgICAgY2hhciAqdGFibGUxLCAqb3V0cHV0X3N0YXJ0LCAqZGVsX3RhYmxlPU5VTEw7CisgICAgUHlfc3NpemVfdCBpbmxlbiwgdGFibGVuLCBkZWxsZW4gPSAwOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IHRyYW5zX3RhYmxlWzI1Nl07CiAKLQlXQVJOOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiU3QjfHQjOnRyYW5zbGF0ZSIsICZpbnB1dF9vYmosCi0JCQkgICAgICAmdGFibGUxLCAmdGFibGVuLCAmZGVsX3RhYmxlLCAmZGVsbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHRhYmxlbiAhPSAyNTYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICAidHJhbnNsYXRpb24gdGFibGUgbXVzdCBiZSAyNTYgY2hhcmFjdGVycyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBXQVJOOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiU3QjfHQjOnRyYW5zbGF0ZSIsICZpbnB1dF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJsZTEsICZ0YWJsZW4sICZkZWxfdGFibGUsICZkZWxsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodGFibGVuICE9IDI1NikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAidHJhbnNsYXRpb24gdGFibGUgbXVzdCBiZSAyNTYgY2hhcmFjdGVycyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXRhYmxlID0gdGFibGUxOwotCWlubGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRfb2JqKTsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGlubGVuKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCk7Ci0JaW5wdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhpbnB1dF9vYmopOworICAgIHRhYmxlID0gdGFibGUxOworICAgIGlubGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRfb2JqKTsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGlubGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCk7CisgICAgaW5wdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhpbnB1dF9vYmopOwogCi0JaWYgKGRlbGxlbiA9PSAwKSB7Ci0JCS8qIElmIG5vIGRlbGV0aW9ucyBhcmUgcmVxdWlyZWQsIHVzZSBmYXN0ZXIgY29kZSAqLwotCQlmb3IgKGkgPSBpbmxlbjsgLS1pID49IDA7ICkgewotCQkJYyA9IFB5X0NIQVJNQVNLKCppbnB1dCsrKTsKLQkJCWlmIChQeV9DSEFSTUFTSygoKm91dHB1dCsrID0gdGFibGVbY10pKSAhPSBjKQotCQkJCWNoYW5nZWQgPSAxOwotCQl9Ci0JCWlmIChjaGFuZ2VkKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0lOQ1JFRihpbnB1dF9vYmopOwotCQlyZXR1cm4gaW5wdXRfb2JqOwotCX0KKyAgICBpZiAoZGVsbGVuID09IDApIHsKKyAgICAgICAgLyogSWYgbm8gZGVsZXRpb25zIGFyZSByZXF1aXJlZCwgdXNlIGZhc3RlciBjb2RlICovCisgICAgICAgIGZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7CisgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKmlucHV0KyspOworICAgICAgICAgICAgaWYgKFB5X0NIQVJNQVNLKCgqb3V0cHV0KysgPSB0YWJsZVtjXSkpICE9IGMpCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYW5nZWQpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfSU5DUkVGKGlucHV0X29iaik7CisgICAgICAgIHJldHVybiBpbnB1dF9vYmo7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotCQl0cmFuc190YWJsZVtpXSA9IFB5X0NIQVJNQVNLKHRhYmxlW2ldKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgIHRyYW5zX3RhYmxlW2ldID0gUHlfQ0hBUk1BU0sodGFibGVbaV0pOwogCi0JZm9yIChpID0gMDsgaSA8IGRlbGxlbjsgaSsrKQotCQl0cmFuc190YWJsZVsoaW50KSBQeV9DSEFSTUFTSyhkZWxfdGFibGVbaV0pXSA9IC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBkZWxsZW47IGkrKykKKyAgICAgICAgdHJhbnNfdGFibGVbKGludCkgUHlfQ0hBUk1BU0soZGVsX3RhYmxlW2ldKV0gPSAtMTsKIAotCWZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7Ci0JCWMgPSBQeV9DSEFSTUFTSygqaW5wdXQrKyk7Ci0JCWlmICh0cmFuc190YWJsZVtjXSAhPSAtMSkKLQkJCWlmIChQeV9DSEFSTUFTSygqb3V0cHV0KysgPSAoY2hhcil0cmFuc190YWJsZVtjXSkgPT0gYykKLQkJCQljb250aW51ZTsKLQkJY2hhbmdlZCA9IDE7Ci0JfQotCWlmICghY2hhbmdlZCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfSU5DUkVGKGlucHV0X29iaik7Ci0JCXJldHVybiBpbnB1dF9vYmo7Ci0JfQotCS8qIEZpeCB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyAqLwotCWlmIChpbmxlbiA+IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgb3V0cHV0IC0gb3V0cHV0X3N0YXJ0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7CisgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqaW5wdXQrKyk7CisgICAgICAgIGlmICh0cmFuc190YWJsZVtjXSAhPSAtMSkKKyAgICAgICAgICAgIGlmIChQeV9DSEFSTUFTSygqb3V0cHV0KysgPSAoY2hhcil0cmFuc190YWJsZVtjXSkgPT0gYykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgfQorICAgIGlmICghY2hhbmdlZCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfSU5DUkVGKGlucHV0X29iaik7CisgICAgICAgIHJldHVybiBpbnB1dF9vYmo7CisgICAgfQorICAgIC8qIEZpeCB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyAqLworICAgIGlmIChpbmxlbiA+IDApCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgb3V0cHV0IC0gb3V0cHV0X3N0YXJ0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTEwMjIsMjIgKzEwMjIsMjIgQEAKICAgZm91bmQsIG9yIC0xIGlmIG5vdCBmb3VuZC4gIElmIGxlbiBvZiBQQVQgaXMgZ3JlYXRlciB0aGFuIGxlbmd0aCBvZgogICBNRU0sIHRoZSBmdW5jdGlvbiByZXR1cm5zIC0xLgogKi8KLXN0YXRpYyBQeV9zc2l6ZV90IAorc3RhdGljIFB5X3NzaXplX3QKIG15bWVtZmluZChjb25zdCBjaGFyICptZW0sIFB5X3NzaXplX3QgbGVuLCBjb25zdCBjaGFyICpwYXQsIFB5X3NzaXplX3QgcGF0X2xlbikKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGlpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaWk7CiAKLQkvKiBwYXR0ZXJuIGNhbiBub3Qgb2NjdXIgaW4gdGhlIGxhc3QgcGF0X2xlbi0xIGNoYXJzICovCi0JbGVuIC09IHBhdF9sZW47CisgICAgLyogcGF0dGVybiBjYW4gbm90IG9jY3VyIGluIHRoZSBsYXN0IHBhdF9sZW4tMSBjaGFycyAqLworICAgIGxlbiAtPSBwYXRfbGVuOwogCi0JZm9yIChpaSA9IDA7IGlpIDw9IGxlbjsgaWkrKykgewotCQlpZiAobWVtW2lpXSA9PSBwYXRbMF0gJiYKLQkJICAgIChwYXRfbGVuID09IDEgfHwKLQkJICAgICBtZW1jbXAoJm1lbVtpaSsxXSwgJnBhdFsxXSwgcGF0X2xlbi0xKSA9PSAwKSkgewotCQkJcmV0dXJuIGlpOwotCQl9Ci0JfQotCXJldHVybiAtMTsKKyAgICBmb3IgKGlpID0gMDsgaWkgPD0gbGVuOyBpaSsrKSB7CisgICAgICAgIGlmIChtZW1baWldID09IHBhdFswXSAmJgorICAgICAgICAgICAgKHBhdF9sZW4gPT0gMSB8fAorICAgICAgICAgICAgIG1lbWNtcCgmbWVtW2lpKzFdLCAmcGF0WzFdLCBwYXRfbGVuLTEpID09IDApKSB7CisgICAgICAgICAgICByZXR1cm4gaWk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAvKgpAQCAtMTA0NSwyMyArMTA0NSwyMyBAQAogCiAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBkaXN0aW5jdCB0aW1lcyBQQVQgaXMgZm91bmQgaW4gTUVNLgogICAgbWVhbmluZyBtZW09MTExMSBhbmQgcGF0PT0xMSByZXR1cm5zIDIuCi0gICAgICAgICAgIG1lbT0xMTExMSBhbmQgcGF0PT0xMSBhbHNvIHJldHVybiAyLgorICAgICAgIG1lbT0xMTExMSBhbmQgcGF0PT0xMSBhbHNvIHJldHVybiAyLgogICovCi1zdGF0aWMgUHlfc3NpemVfdCAKK3N0YXRpYyBQeV9zc2l6ZV90CiBteW1lbWNudChjb25zdCBjaGFyICptZW0sIFB5X3NzaXplX3QgbGVuLCBjb25zdCBjaGFyICpwYXQsIFB5X3NzaXplX3QgcGF0X2xlbikKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IG9mZnNldCA9IDA7Ci0JUHlfc3NpemVfdCBuZm91bmQgPSAwOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBQeV9zc2l6ZV90IG5mb3VuZCA9IDA7CiAKLQl3aGlsZSAobGVuID49IDApIHsKLQkJb2Zmc2V0ID0gbXltZW1maW5kKG1lbSwgbGVuLCBwYXQsIHBhdF9sZW4pOwotCQlpZiAob2Zmc2V0ID09IC0xKQotCQkJYnJlYWs7Ci0JCW1lbSArPSBvZmZzZXQgKyBwYXRfbGVuOwotCQlsZW4gLT0gb2Zmc2V0ICsgcGF0X2xlbjsKLQkJbmZvdW5kKys7Ci0JfQotCXJldHVybiBuZm91bmQ7CisgICAgd2hpbGUgKGxlbiA+PSAwKSB7CisgICAgICAgIG9mZnNldCA9IG15bWVtZmluZChtZW0sIGxlbiwgcGF0LCBwYXRfbGVuKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBtZW0gKz0gb2Zmc2V0ICsgcGF0X2xlbjsKKyAgICAgICAgbGVuIC09IG9mZnNldCArIHBhdF9sZW47CisgICAgICAgIG5mb3VuZCsrOworICAgIH0KKyAgICByZXR1cm4gbmZvdW5kOwogfQogCiAvKgpAQCAtMTA4NCw2OSArMTA4NCw2OSBAQAogICAgICAgIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAqLwogc3RhdGljIGNoYXIgKgotbXltZW1yZXBsYWNlKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sCQkvKiBpbnB1dCBzdHJpbmcgKi8KLSAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXQsIFB5X3NzaXplX3QgcGF0X2xlbiwJLyogcGF0dGVybiBzdHJpbmcgdG8gZmluZCAqLwotICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1YiwgUHlfc3NpemVfdCBzdWJfbGVuLAkvKiBzdWJzdGl0dXRpb24gc3RyaW5nICovCi0gICAgICAgICAgICAgUHlfc3NpemVfdCBjb3VudCwJCQkJLyogbnVtYmVyIG9mIHJlcGxhY2VtZW50cyAqLwotCSAgICAgUHlfc3NpemVfdCAqb3V0X2xlbikKK215bWVtcmVwbGFjZShjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCAgICAgICAgICAgLyogaW5wdXQgc3RyaW5nICovCisgICAgICAgICBjb25zdCBjaGFyICpwYXQsIFB5X3NzaXplX3QgcGF0X2xlbiwgICAgICAgICAgIC8qIHBhdHRlcm4gc3RyaW5nIHRvIGZpbmQgKi8KKyAgICAgICAgIGNvbnN0IGNoYXIgKnN1YiwgUHlfc3NpemVfdCBzdWJfbGVuLCAgICAgICAgICAgLyogc3Vic3RpdHV0aW9uIHN0cmluZyAqLworICAgICAgICAgUHlfc3NpemVfdCBjb3VudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVwbGFjZW1lbnRzICovCisgICAgICAgICBQeV9zc2l6ZV90ICpvdXRfbGVuKQogewotCWNoYXIgKm91dF9zOwotCWNoYXIgKm5ld19zOwotCVB5X3NzaXplX3QgbmZvdW5kLCBvZmZzZXQsIG5ld19sZW47CisgICAgY2hhciAqb3V0X3M7CisgICAgY2hhciAqbmV3X3M7CisgICAgUHlfc3NpemVfdCBuZm91bmQsIG9mZnNldCwgbmV3X2xlbjsKIAotCWlmIChsZW4gPT0gMCB8fCBwYXRfbGVuID4gbGVuKQotCQlnb3RvIHJldHVybl9zYW1lOworICAgIGlmIChsZW4gPT0gMCB8fCBwYXRfbGVuID4gbGVuKQorICAgICAgICBnb3RvIHJldHVybl9zYW1lOwogCi0JLyogZmluZCBsZW5ndGggb2Ygb3V0cHV0IHN0cmluZyAqLwotCW5mb3VuZCA9IG15bWVtY250KHN0ciwgbGVuLCBwYXQsIHBhdF9sZW4pOwotCWlmIChjb3VudCA8IDApCi0JCWNvdW50ID0gUFlfU1NJWkVfVF9NQVg7Ci0JZWxzZSBpZiAobmZvdW5kID4gY291bnQpCi0JCW5mb3VuZCA9IGNvdW50OwotCWlmIChuZm91bmQgPT0gMCkKLQkJZ290byByZXR1cm5fc2FtZTsKKyAgICAvKiBmaW5kIGxlbmd0aCBvZiBvdXRwdXQgc3RyaW5nICovCisgICAgbmZvdW5kID0gbXltZW1jbnQoc3RyLCBsZW4sIHBhdCwgcGF0X2xlbik7CisgICAgaWYgKGNvdW50IDwgMCkKKyAgICAgICAgY291bnQgPSBQWV9TU0laRV9UX01BWDsKKyAgICBlbHNlIGlmIChuZm91bmQgPiBjb3VudCkKKyAgICAgICAgbmZvdW5kID0gY291bnQ7CisgICAgaWYgKG5mb3VuZCA9PSAwKQorICAgICAgICBnb3RvIHJldHVybl9zYW1lOwogCi0JbmV3X2xlbiA9IGxlbiArIG5mb3VuZCooc3ViX2xlbiAtIHBhdF9sZW4pOwotCWlmIChuZXdfbGVuID09IDApIHsKLQkJLyogSGF2ZSB0byBhbGxvY2F0ZSBzb21ldGhpbmcgZm9yIHRoZSBjYWxsZXIgdG8gZnJlZSgpLiAqLwotCQlvdXRfcyA9IChjaGFyICopUHlNZW1fTUFMTE9DKDEpOwotCQlpZiAob3V0X3MgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlvdXRfc1swXSA9ICdcMCc7Ci0JfQotCWVsc2UgewotCQlhc3NlcnQobmV3X2xlbiA+IDApOwotCQluZXdfcyA9IChjaGFyICopUHlNZW1fTUFMTE9DKG5ld19sZW4pOwotCQlpZiAobmV3X3MgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlvdXRfcyA9IG5ld19zOworICAgIG5ld19sZW4gPSBsZW4gKyBuZm91bmQqKHN1Yl9sZW4gLSBwYXRfbGVuKTsKKyAgICBpZiAobmV3X2xlbiA9PSAwKSB7CisgICAgICAgIC8qIEhhdmUgdG8gYWxsb2NhdGUgc29tZXRoaW5nIGZvciB0aGUgY2FsbGVyIHRvIGZyZWUoKS4gKi8KKyAgICAgICAgb3V0X3MgPSAoY2hhciAqKVB5TWVtX01BTExPQygxKTsKKyAgICAgICAgaWYgKG91dF9zID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgb3V0X3NbMF0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KG5ld19sZW4gPiAwKTsKKyAgICAgICAgbmV3X3MgPSAoY2hhciAqKVB5TWVtX01BTExPQyhuZXdfbGVuKTsKKyAgICAgICAgaWYgKG5ld19zID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgb3V0X3MgPSBuZXdfczsKIAotCQlmb3IgKDsgY291bnQgPiAwICYmIGxlbiA+IDA7IC0tY291bnQpIHsKLQkJCS8qIGZpbmQgaW5kZXggb2YgbmV4dCBpbnN0YW5jZSBvZiBwYXR0ZXJuICovCi0JCQlvZmZzZXQgPSBteW1lbWZpbmQoc3RyLCBsZW4sIHBhdCwgcGF0X2xlbik7Ci0JCQlpZiAob2Zmc2V0ID09IC0xKQotCQkJCWJyZWFrOworICAgICAgICBmb3IgKDsgY291bnQgPiAwICYmIGxlbiA+IDA7IC0tY291bnQpIHsKKyAgICAgICAgICAgIC8qIGZpbmQgaW5kZXggb2YgbmV4dCBpbnN0YW5jZSBvZiBwYXR0ZXJuICovCisgICAgICAgICAgICBvZmZzZXQgPSBteW1lbWZpbmQoc3RyLCBsZW4sIHBhdCwgcGF0X2xlbik7CisgICAgICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQkvKiBjb3B5IG5vbiBtYXRjaGluZyBwYXJ0IG9mIGlucHV0IHN0cmluZyAqLwotCQkJbWVtY3B5KG5ld19zLCBzdHIsIG9mZnNldCk7Ci0JCQlzdHIgKz0gb2Zmc2V0ICsgcGF0X2xlbjsKLQkJCWxlbiAtPSBvZmZzZXQgKyBwYXRfbGVuOworICAgICAgICAgICAgLyogY29weSBub24gbWF0Y2hpbmcgcGFydCBvZiBpbnB1dCBzdHJpbmcgKi8KKyAgICAgICAgICAgIG1lbWNweShuZXdfcywgc3RyLCBvZmZzZXQpOworICAgICAgICAgICAgc3RyICs9IG9mZnNldCArIHBhdF9sZW47CisgICAgICAgICAgICBsZW4gLT0gb2Zmc2V0ICsgcGF0X2xlbjsKIAotCQkJLyogY29weSBzdWJzdGl0dXRlIGludG8gdGhlIG91dHB1dCBzdHJpbmcgKi8KLQkJCW5ld19zICs9IG9mZnNldDsKLQkJCW1lbWNweShuZXdfcywgc3ViLCBzdWJfbGVuKTsKLQkJCW5ld19zICs9IHN1Yl9sZW47Ci0JCX0KLQkJLyogY29weSBhbnkgcmVtYWluaW5nIHZhbHVlcyBpbnRvIG91dHB1dCBzdHJpbmcgKi8KLQkJaWYgKGxlbiA+IDApCi0JCQltZW1jcHkobmV3X3MsIHN0ciwgbGVuKTsKLQl9Ci0JKm91dF9sZW4gPSBuZXdfbGVuOwotCXJldHVybiBvdXRfczsKKyAgICAgICAgICAgIC8qIGNvcHkgc3Vic3RpdHV0ZSBpbnRvIHRoZSBvdXRwdXQgc3RyaW5nICovCisgICAgICAgICAgICBuZXdfcyArPSBvZmZzZXQ7CisgICAgICAgICAgICBtZW1jcHkobmV3X3MsIHN1Yiwgc3ViX2xlbik7CisgICAgICAgICAgICBuZXdfcyArPSBzdWJfbGVuOworICAgICAgICB9CisgICAgICAgIC8qIGNvcHkgYW55IHJlbWFpbmluZyB2YWx1ZXMgaW50byBvdXRwdXQgc3RyaW5nICovCisgICAgICAgIGlmIChsZW4gPiAwKQorICAgICAgICAgICAgbWVtY3B5KG5ld19zLCBzdHIsIGxlbik7CisgICAgfQorICAgICpvdXRfbGVuID0gbmV3X2xlbjsKKyAgICByZXR1cm4gb3V0X3M7CiAKICAgcmV0dXJuX3NhbWU6Ci0JKm91dF9sZW4gPSAtMTsKLQlyZXR1cm4gKGNoYXIgKilzdHI7IC8qIGNhc3QgYXdheSBjb25zdCAqLworICAgICpvdXRfbGVuID0gLTE7CisgICAgcmV0dXJuIChjaGFyICopc3RyOyAvKiBjYXN0IGF3YXkgY29uc3QgKi8KIH0KIAogCkBAIC0xMTYwLDQxICsxMTYwLDQxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfcmVwbGFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc3RyLCAqcGF0LCpzdWIsKm5ld19zOwotCVB5X3NzaXplX3QgbGVuLHBhdF9sZW4sc3ViX2xlbixvdXRfbGVuOwotCVB5X3NzaXplX3QgY291bnQgPSAtMTsKLQlQeU9iamVjdCAqbmV3c3RyOworICAgIGNoYXIgKnN0ciwgKnBhdCwqc3ViLCpuZXdfczsKKyAgICBQeV9zc2l6ZV90IGxlbixwYXRfbGVuLHN1Yl9sZW4sb3V0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gLTE7CisgICAgUHlPYmplY3QgKm5ld3N0cjsKIAotCVdBUk47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjdCN8bjpyZXBsYWNlIiwKLQkJCSAgICAgICZzdHIsICZsZW4sICZwYXQsICZwYXRfbGVuLCAmc3ViLCAmc3ViX2xlbiwKLQkJCSAgICAgICZjb3VudCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfbGVuIDw9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBwYXR0ZXJuIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogQ0FVVElPTjogIHN0cm9wIHRyZWF0cyBhIHJlcGxhY2UgY291bnQgb2YgMCBhcyBpbmZpbml0eSwgdW5sa2UKLQkgKiBjdXJyZW50ICgyLjEpIHN0cmluZy5weSBhbmQgc3RyaW5nIG1ldGhvZHMuICBQcmVzZXJ2ZSB0aGlzIGZvcgotCSAqIC4uLiB3ZWxsLCBoYXJkIHRvIHNheSBmb3Igd2hhdCA8d2luaz4uCi0JICovCi0JaWYgKGNvdW50ID09IDApCi0JCWNvdW50ID0gLTE7Ci0JbmV3X3MgPSBteW1lbXJlcGxhY2Uoc3RyLGxlbixwYXQscGF0X2xlbixzdWIsc3ViX2xlbixjb3VudCwmb3V0X2xlbik7Ci0JaWYgKG5ld19zID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChvdXRfbGVuID09IC0xKSB7Ci0JCS8qIHdlJ3JlIHJldHVybmluZyBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgaW5wdXQgc3RyaW5nICovCi0JCW5ld3N0ciA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKLQkJUHlfWElOQ1JFRihuZXdzdHIpOwotCX0KLQllbHNlIHsKLQkJbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobmV3X3MsIG91dF9sZW4pOwotCQlQeU1lbV9GUkVFKG5ld19zKTsKLQl9Ci0JcmV0dXJuIG5ld3N0cjsKKyAgICBXQVJOOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3QjfG46cmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZsZW4sICZwYXQsICZwYXRfbGVuLCAmc3ViLCAmc3ViX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9sZW4gPD0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHBhdHRlcm4gc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBDQVVUSU9OOiAgc3Ryb3AgdHJlYXRzIGEgcmVwbGFjZSBjb3VudCBvZiAwIGFzIGluZmluaXR5LCB1bmxrZQorICAgICAqIGN1cnJlbnQgKDIuMSkgc3RyaW5nLnB5IGFuZCBzdHJpbmcgbWV0aG9kcy4gIFByZXNlcnZlIHRoaXMgZm9yCisgICAgICogLi4uIHdlbGwsIGhhcmQgdG8gc2F5IGZvciB3aGF0IDx3aW5rPi4KKyAgICAgKi8KKyAgICBpZiAoY291bnQgPT0gMCkKKyAgICAgICAgY291bnQgPSAtMTsKKyAgICBuZXdfcyA9IG15bWVtcmVwbGFjZShzdHIsbGVuLHBhdCxwYXRfbGVuLHN1YixzdWJfbGVuLGNvdW50LCZvdXRfbGVuKTsKKyAgICBpZiAobmV3X3MgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG91dF9sZW4gPT0gLTEpIHsKKyAgICAgICAgLyogd2UncmUgcmV0dXJuaW5nIGFub3RoZXIgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBzdHJpbmcgKi8KKyAgICAgICAgbmV3c3RyID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOworICAgICAgICBQeV9YSU5DUkVGKG5ld3N0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuZXdfcywgb3V0X2xlbik7CisgICAgICAgIFB5TWVtX0ZSRUUobmV3X3MpOworICAgIH0KKyAgICByZXR1cm4gbmV3c3RyOwogfQogCiAKQEAgLTEyMDIsNjkgKzEyMDIsNjkgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmCiBzdHJvcF9tZXRob2RzW10gPSB7Ci0JeyJhdG9mIiwJc3Ryb3BfYXRvZiwJICAgTUVUSF9WQVJBUkdTLCBhdG9mX19kb2NfX30sCi0JeyJhdG9pIiwJc3Ryb3BfYXRvaSwJICAgTUVUSF9WQVJBUkdTLCBhdG9pX19kb2NfX30sCi0JeyJhdG9sIiwJc3Ryb3BfYXRvbCwJICAgTUVUSF9WQVJBUkdTLCBhdG9sX19kb2NfX30sCi0JeyJjYXBpdGFsaXplIiwJc3Ryb3BfY2FwaXRhbGl6ZSwgIE1FVEhfTywgICAgICAgY2FwaXRhbGl6ZV9fZG9jX199LAotCXsiY291bnQiLAlzdHJvcF9jb3VudCwJICAgTUVUSF9WQVJBUkdTLCBjb3VudF9fZG9jX199LAotCXsiZXhwYW5kdGFicyIsCXN0cm9wX2V4cGFuZHRhYnMsICBNRVRIX1ZBUkFSR1MsIGV4cGFuZHRhYnNfX2RvY19ffSwKLQl7ImZpbmQiLAlzdHJvcF9maW5kLAkgICBNRVRIX1ZBUkFSR1MsIGZpbmRfX2RvY19ffSwKLQl7ImpvaW4iLAlzdHJvcF9qb2luZmllbGRzLCAgTUVUSF9WQVJBUkdTLCBqb2luZmllbGRzX19kb2NfX30sCi0JeyJqb2luZmllbGRzIiwJc3Ryb3Bfam9pbmZpZWxkcywgIE1FVEhfVkFSQVJHUywgam9pbmZpZWxkc19fZG9jX199LAotCXsibHN0cmlwIiwJc3Ryb3BfbHN0cmlwLAkgICBNRVRIX08sICAgICAgIGxzdHJpcF9fZG9jX199LAotCXsibG93ZXIiLAlzdHJvcF9sb3dlciwJICAgTUVUSF9PLCAgICAgICBsb3dlcl9fZG9jX199LAotCXsibWFrZXRyYW5zIiwJc3Ryb3BfbWFrZXRyYW5zLCAgIE1FVEhfVkFSQVJHUywgbWFrZXRyYW5zX19kb2NfX30sCi0JeyJyZXBsYWNlIiwJc3Ryb3BfcmVwbGFjZSwJICAgTUVUSF9WQVJBUkdTLCByZXBsYWNlX19kb2NfX30sCi0JeyJyZmluZCIsCXN0cm9wX3JmaW5kLAkgICBNRVRIX1ZBUkFSR1MsIHJmaW5kX19kb2NfX30sCi0JeyJyc3RyaXAiLAlzdHJvcF9yc3RyaXAsCSAgIE1FVEhfTywgICAgICAgcnN0cmlwX19kb2NfX30sCi0JeyJzcGxpdCIsCXN0cm9wX3NwbGl0ZmllbGRzLCBNRVRIX1ZBUkFSR1MsIHNwbGl0ZmllbGRzX19kb2NfX30sCi0JeyJzcGxpdGZpZWxkcyIsCXN0cm9wX3NwbGl0ZmllbGRzLCBNRVRIX1ZBUkFSR1MsIHNwbGl0ZmllbGRzX19kb2NfX30sCi0JeyJzdHJpcCIsCXN0cm9wX3N0cmlwLAkgICBNRVRIX08sICAgICAgIHN0cmlwX19kb2NfX30sCi0JeyJzd2FwY2FzZSIsCXN0cm9wX3N3YXBjYXNlLCAgICBNRVRIX08sICAgICAgIHN3YXBjYXNlX19kb2NfX30sCi0JeyJ0cmFuc2xhdGUiLAlzdHJvcF90cmFuc2xhdGUsICAgTUVUSF9WQVJBUkdTLCB0cmFuc2xhdGVfX2RvY19ffSwKLQl7InVwcGVyIiwJc3Ryb3BfdXBwZXIsCSAgIE1FVEhfTywgICAgICAgdXBwZXJfX2RvY19ffSwKLQl7TlVMTCwJCU5VTEx9CS8qIHNlbnRpbmVsICovCisgICAgeyJhdG9mIiwgICAgICAgICAgICBzdHJvcF9hdG9mLCAgICAgICAgTUVUSF9WQVJBUkdTLCBhdG9mX19kb2NfX30sCisgICAgeyJhdG9pIiwgICAgICAgICAgICBzdHJvcF9hdG9pLCAgICAgICAgTUVUSF9WQVJBUkdTLCBhdG9pX19kb2NfX30sCisgICAgeyJhdG9sIiwgICAgICAgICAgICBzdHJvcF9hdG9sLCAgICAgICAgTUVUSF9WQVJBUkdTLCBhdG9sX19kb2NfX30sCisgICAgeyJjYXBpdGFsaXplIiwgICAgICBzdHJvcF9jYXBpdGFsaXplLCAgTUVUSF9PLCAgICAgICBjYXBpdGFsaXplX19kb2NfX30sCisgICAgeyJjb3VudCIsICAgICAgICAgICBzdHJvcF9jb3VudCwgICAgICAgTUVUSF9WQVJBUkdTLCBjb3VudF9fZG9jX199LAorICAgIHsiZXhwYW5kdGFicyIsICAgICAgc3Ryb3BfZXhwYW5kdGFicywgIE1FVEhfVkFSQVJHUywgZXhwYW5kdGFic19fZG9jX199LAorICAgIHsiZmluZCIsICAgICAgICAgICAgc3Ryb3BfZmluZCwgICAgICAgIE1FVEhfVkFSQVJHUywgZmluZF9fZG9jX199LAorICAgIHsiam9pbiIsICAgICAgICAgICAgc3Ryb3Bfam9pbmZpZWxkcywgIE1FVEhfVkFSQVJHUywgam9pbmZpZWxkc19fZG9jX199LAorICAgIHsiam9pbmZpZWxkcyIsICAgICAgc3Ryb3Bfam9pbmZpZWxkcywgIE1FVEhfVkFSQVJHUywgam9pbmZpZWxkc19fZG9jX199LAorICAgIHsibHN0cmlwIiwgICAgICAgICAgc3Ryb3BfbHN0cmlwLCAgICAgIE1FVEhfTywgICAgICAgbHN0cmlwX19kb2NfX30sCisgICAgeyJsb3dlciIsICAgICAgICAgICBzdHJvcF9sb3dlciwgICAgICAgTUVUSF9PLCAgICAgICBsb3dlcl9fZG9jX199LAorICAgIHsibWFrZXRyYW5zIiwgICAgICAgc3Ryb3BfbWFrZXRyYW5zLCAgIE1FVEhfVkFSQVJHUywgbWFrZXRyYW5zX19kb2NfX30sCisgICAgeyJyZXBsYWNlIiwgICAgICAgICBzdHJvcF9yZXBsYWNlLCAgICAgTUVUSF9WQVJBUkdTLCByZXBsYWNlX19kb2NfX30sCisgICAgeyJyZmluZCIsICAgICAgICAgICBzdHJvcF9yZmluZCwgICAgICAgTUVUSF9WQVJBUkdTLCByZmluZF9fZG9jX199LAorICAgIHsicnN0cmlwIiwgICAgICAgICAgc3Ryb3BfcnN0cmlwLCAgICAgIE1FVEhfTywgICAgICAgcnN0cmlwX19kb2NfX30sCisgICAgeyJzcGxpdCIsICAgICAgICAgICBzdHJvcF9zcGxpdGZpZWxkcywgTUVUSF9WQVJBUkdTLCBzcGxpdGZpZWxkc19fZG9jX199LAorICAgIHsic3BsaXRmaWVsZHMiLCAgICAgc3Ryb3Bfc3BsaXRmaWVsZHMsIE1FVEhfVkFSQVJHUywgc3BsaXRmaWVsZHNfX2RvY19ffSwKKyAgICB7InN0cmlwIiwgICAgICAgICAgIHN0cm9wX3N0cmlwLCAgICAgICBNRVRIX08sICAgICAgIHN0cmlwX19kb2NfX30sCisgICAgeyJzd2FwY2FzZSIsICAgICAgICBzdHJvcF9zd2FwY2FzZSwgICAgTUVUSF9PLCAgICAgICBzd2FwY2FzZV9fZG9jX199LAorICAgIHsidHJhbnNsYXRlIiwgICAgICAgc3Ryb3BfdHJhbnNsYXRlLCAgIE1FVEhfVkFSQVJHUywgdHJhbnNsYXRlX19kb2NfX30sCisgICAgeyJ1cHBlciIsICAgICAgICAgICBzdHJvcF91cHBlciwgICAgICAgTUVUSF9PLCAgICAgICB1cHBlcl9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogCiBQeU1PRElOSVRfRlVOQwogaW5pdHN0cm9wKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpzOwotCWNoYXIgYnVmWzI1Nl07Ci0JaW50IGMsIG47Ci0JbSA9IFB5X0luaXRNb2R1bGU0KCJzdHJvcCIsIHN0cm9wX21ldGhvZHMsIHN0cm9wX21vZHVsZV9fZG9jX18sCi0JCQkgICAoUHlPYmplY3QqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqczsKKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIGludCBjLCBuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgic3Ryb3AiLCBzdHJvcF9tZXRob2RzLCBzdHJvcF9tb2R1bGVfX2RvY19fLAorICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQ3JlYXRlICd3aGl0ZXNwYWNlJyBvYmplY3QgKi8KLQluID0gMDsKLQlmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspIHsKLQkJaWYgKGlzc3BhY2UoYykpCi0JCQlidWZbbisrXSA9IGM7Ci0JfQotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIG4pOwotCWlmIChzKQotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIndoaXRlc3BhY2UiLCBzKTsKKyAgICAvKiBDcmVhdGUgJ3doaXRlc3BhY2UnIG9iamVjdCAqLworICAgIG4gPSAwOworICAgIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykgeworICAgICAgICBpZiAoaXNzcGFjZShjKSkKKyAgICAgICAgICAgIGJ1ZltuKytdID0gYzsKKyAgICB9CisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1Ziwgbik7CisgICAgaWYgKHMpCisgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAid2hpdGVzcGFjZSIsIHMpOwogCi0JLyogQ3JlYXRlICdsb3dlcmNhc2UnIG9iamVjdCAqLwotCW4gPSAwOwotCWZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykgewotCQlpZiAoaXNsb3dlcihjKSkKLQkJCWJ1ZltuKytdID0gYzsKLQl9Ci0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1Ziwgbik7Ci0JaWYgKHMpCi0JCVB5TW9kdWxlX0FkZE9iamVjdChtLCAibG93ZXJjYXNlIiwgcyk7CisgICAgLyogQ3JlYXRlICdsb3dlcmNhc2UnIG9iamVjdCAqLworICAgIG4gPSAwOworICAgIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykgeworICAgICAgICBpZiAoaXNsb3dlcihjKSkKKyAgICAgICAgICAgIGJ1ZltuKytdID0gYzsKKyAgICB9CisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1Ziwgbik7CisgICAgaWYgKHMpCisgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAibG93ZXJjYXNlIiwgcyk7CiAKLQkvKiBDcmVhdGUgJ3VwcGVyY2FzZScgb2JqZWN0ICovCi0JbiA9IDA7Ci0JZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKSB7Ci0JCWlmIChpc3VwcGVyKGMpKQotCQkJYnVmW24rK10gPSBjOwotCX0KLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBuKTsKLQlpZiAocykKLQkJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ1cHBlcmNhc2UiLCBzKTsKKyAgICAvKiBDcmVhdGUgJ3VwcGVyY2FzZScgb2JqZWN0ICovCisgICAgbiA9IDA7CisgICAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKSB7CisgICAgICAgIGlmIChpc3VwcGVyKGMpKQorICAgICAgICAgICAgYnVmW24rK10gPSBjOworICAgIH0KKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBuKTsKKyAgICBpZiAocykKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ1cHBlcmNhc2UiLCBzKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc3VuYXVkaW9kZXYuYyBiL01vZHVsZXMvc3VuYXVkaW9kZXYuYwppbmRleCAyODVkYzY2Li4wYzMyZmUzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3N1bmF1ZGlvZGV2LmMKKysrIGIvTW9kdWxlcy9zdW5hdWRpb2Rldi5jCkBAIC0yMyw5OCArMjMsOTggQEAKIC8qICNkZWZpbmUgb2Zmc2V0b2Yoc3RyLG1lbSkgKChpbnQpKCgoc3RyICopMCktPm1lbSkpICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JaW50CXhfZmQ7CQkvKiBUaGUgb3BlbiBmaWxlICovCi0JaW50CXhfaWNvdW50OwkvKiAjIHNhbXBsZXMgcmVhZCAqLwotCWludAl4X29jb3VudDsJLyogIyBzYW1wbGVzIHdyaXR0ZW4gKi8KLQlpbnQJeF9pc2N0bDsJLyogVHJ1ZSBpZiBjb250cm9sIGRldmljZSAqLwotCQorICAgIFB5T2JqZWN0X0hFQUQKKyAgICBpbnQgICAgICAgICB4X2ZkOyAgICAgICAgICAgLyogVGhlIG9wZW4gZmlsZSAqLworICAgIGludCAgICAgICAgIHhfaWNvdW50OyAgICAgICAvKiAjIHNhbXBsZXMgcmVhZCAqLworICAgIGludCAgICAgICAgIHhfb2NvdW50OyAgICAgICAvKiAjIHNhbXBsZXMgd3JpdHRlbiAqLworICAgIGludCAgICAgICAgIHhfaXNjdGw7ICAgICAgICAvKiBUcnVlIGlmIGNvbnRyb2wgZGV2aWNlICovCisKIH0gc2Fkb2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWF1ZGlvX2luZm9fdCBhaTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgYXVkaW9faW5mb190IGFpOwogfSBzYWRzdGF0dXNvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU2FkdHlwZTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgU2Fkc3RhdHVzdHlwZTsKLXN0YXRpYyBzYWRzdGF0dXNvYmplY3QgKnNhZHNfYWxsb2Modm9pZCk7CS8qIEZvcndhcmQgKi8KK3N0YXRpYyBzYWRzdGF0dXNvYmplY3QgKnNhZHNfYWxsb2Modm9pZCk7ICAgICAgIC8qIEZvcndhcmQgKi8KIAogc3RhdGljIFB5T2JqZWN0ICpTdW5BdWRpb0Vycm9yOwogCi0jZGVmaW5lIGlzX3NhZG9iamVjdCh2KQkJKFB5X1RZUEUodikgPT0gJlNhZHR5cGUpCi0jZGVmaW5lIGlzX3NhZHN0YXR1c29iamVjdCh2KQkoUHlfVFlQRSh2KSA9PSAmU2Fkc3RhdHVzdHlwZSkKKyNkZWZpbmUgaXNfc2Fkb2JqZWN0KHYpICAgICAgICAgKFB5X1RZUEUodikgPT0gJlNhZHR5cGUpCisjZGVmaW5lIGlzX3NhZHN0YXR1c29iamVjdCh2KSAgIChQeV9UWVBFKHYpID09ICZTYWRzdGF0dXN0eXBlKQogCiAKIHN0YXRpYyBzYWRvYmplY3QgKgogbmV3c2Fkb2JqZWN0KFB5T2JqZWN0ICphcmdzKQogewotCXNhZG9iamVjdCAqeHA7Ci0JaW50IGZkOwotCWNoYXIgKm1vZGU7Ci0JaW50IGltb2RlOwotCWNoYXIqIGJhc2VkZXY7Ci0JY2hhciogY3RsZGV2OwotCWNoYXIqIG9wZW5kZXY7CisgICAgc2Fkb2JqZWN0ICp4cDsKKyAgICBpbnQgZmQ7CisgICAgY2hhciAqbW9kZTsKKyAgICBpbnQgaW1vZGU7CisgICAgY2hhciogYmFzZWRldjsKKyAgICBjaGFyKiBjdGxkZXY7CisgICAgY2hhciogb3BlbmRldjsKIAotCS8qIENoZWNrIGFyZyBmb3Igci93L3J3ICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc3RyY21wKG1vZGUsICJyIikgPT0gMCkKLQkJaW1vZGUgPSAwOwotCWVsc2UgaWYgKHN0cmNtcChtb2RlLCAidyIpID09IDApCi0JCWltb2RlID0gMTsKLQllbHNlIGlmIChzdHJjbXAobW9kZSwgInJ3IikgPT0gMCkKLQkJaW1vZGUgPSAyOwotCWVsc2UgaWYgKHN0cmNtcChtb2RlLCAiY29udHJvbCIpID09IDApCi0JCWltb2RlID0gLTE7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdW5BdWRpb0Vycm9yLAotCQkJICAiTW9kZSBzaG91bGQgYmUgb25lIG9mICdyJywgJ3cnLCAncncnIG9yICdjb250cm9sJyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JLyogT3BlbiB0aGUgY29ycmVjdCBkZXZpY2UuICBUaGUgYmFzZSBkZXZpY2UgbmFtZSBjb21lcyBmcm9tIHRoZQotCSAqIEFVRElPREVWIGVudmlyb25tZW50IHZhcmlhYmxlIGZpcnN0LCB0aGVuIC9kZXYvYXVkaW8uICBUaGUKLQkgKiBjb250cm9sIGRldmljZSB0YWNrcyAiY3RsIiBvbnRvIHRoZSBiYXNlIGRldmljZSBuYW1lLgotCSAqLwotCWJhc2VkZXYgPSBnZXRlbnYoIkFVRElPREVWIik7Ci0JaWYgKCFiYXNlZGV2KQotCQliYXNlZGV2ID0gIi9kZXYvYXVkaW8iOwotCWN0bGRldiA9IFB5TWVtX05FVyhjaGFyLCBzdHJsZW4oYmFzZWRldikgKyA0KTsKLQlpZiAoIWN0bGRldikgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RyY3B5KGN0bGRldiwgYmFzZWRldik7Ci0Jc3RyY2F0KGN0bGRldiwgImN0bCIpOworICAgIC8qIENoZWNrIGFyZyBmb3Igci93L3J3ICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RyY21wKG1vZGUsICJyIikgPT0gMCkKKyAgICAgICAgaW1vZGUgPSAwOworICAgIGVsc2UgaWYgKHN0cmNtcChtb2RlLCAidyIpID09IDApCisgICAgICAgIGltb2RlID0gMTsKKyAgICBlbHNlIGlmIChzdHJjbXAobW9kZSwgInJ3IikgPT0gMCkKKyAgICAgICAgaW1vZGUgPSAyOworICAgIGVsc2UgaWYgKHN0cmNtcChtb2RlLCAiY29udHJvbCIpID09IDApCisgICAgICAgIGltb2RlID0gLTE7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdW5BdWRpb0Vycm9yLAorICAgICAgICAgICAgICAgICAgIk1vZGUgc2hvdWxkIGJlIG9uZSBvZiAncicsICd3JywgJ3J3JyBvciAnY29udHJvbCciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGltb2RlIDwgMCkgewotCQlvcGVuZGV2ID0gY3RsZGV2OwotCQlmZCA9IG9wZW4oY3RsZGV2LCAyKTsKLQl9Ci0JZWxzZSB7Ci0JCW9wZW5kZXYgPSBiYXNlZGV2OwotCQlmZCA9IG9wZW4oYmFzZWRldiwgaW1vZGUpOwotCX0KLQlpZiAoZmQgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShTdW5BdWRpb0Vycm9yLCBvcGVuZGV2KTsKLQkJUHlNZW1fREVMKGN0bGRldik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeU1lbV9ERUwoY3RsZGV2KTsKKyAgICAvKiBPcGVuIHRoZSBjb3JyZWN0IGRldmljZS4gIFRoZSBiYXNlIGRldmljZSBuYW1lIGNvbWVzIGZyb20gdGhlCisgICAgICogQVVESU9ERVYgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlyc3QsIHRoZW4gL2Rldi9hdWRpby4gIFRoZQorICAgICAqIGNvbnRyb2wgZGV2aWNlIHRhY2tzICJjdGwiIG9udG8gdGhlIGJhc2UgZGV2aWNlIG5hbWUuCisgICAgICovCisgICAgYmFzZWRldiA9IGdldGVudigiQVVESU9ERVYiKTsKKyAgICBpZiAoIWJhc2VkZXYpCisgICAgICAgIGJhc2VkZXYgPSAiL2Rldi9hdWRpbyI7CisgICAgY3RsZGV2ID0gUHlNZW1fTkVXKGNoYXIsIHN0cmxlbihiYXNlZGV2KSArIDQpOworICAgIGlmICghY3RsZGV2KSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJjcHkoY3RsZGV2LCBiYXNlZGV2KTsKKyAgICBzdHJjYXQoY3RsZGV2LCAiY3RsIik7CiAKLQkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIG9iamVjdCAqLwotCXhwID0gUHlPYmplY3RfTmV3KHNhZG9iamVjdCwgJlNhZHR5cGUpOwotCWlmICh4cCA9PSBOVUxMKSB7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXhwLT54X2ZkID0gZmQ7Ci0JeHAtPnhfaWNvdW50ID0geHAtPnhfb2NvdW50ID0gMDsKLQl4cC0+eF9pc2N0bCA9IChpbW9kZSA8IDApOwotCQotCXJldHVybiB4cDsKKyAgICBpZiAoaW1vZGUgPCAwKSB7CisgICAgICAgIG9wZW5kZXYgPSBjdGxkZXY7CisgICAgICAgIGZkID0gb3BlbihjdGxkZXYsIDIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgb3BlbmRldiA9IGJhc2VkZXY7CisgICAgICAgIGZkID0gb3BlbihiYXNlZGV2LCBpbW9kZSk7CisgICAgfQorICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFN1bkF1ZGlvRXJyb3IsIG9wZW5kZXYpOworICAgICAgICBQeU1lbV9ERUwoY3RsZGV2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5TWVtX0RFTChjdGxkZXYpOworCisgICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBvYmplY3QgKi8KKyAgICB4cCA9IFB5T2JqZWN0X05ldyhzYWRvYmplY3QsICZTYWR0eXBlKTsKKyAgICBpZiAoeHAgPT0gTlVMTCkgeworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB4cC0+eF9mZCA9IGZkOworICAgIHhwLT54X2ljb3VudCA9IHhwLT54X29jb3VudCA9IDA7CisgICAgeHAtPnhfaXNjdGwgPSAoaW1vZGUgPCAwKTsKKworICAgIHJldHVybiB4cDsKIH0KIAogLyogU2FkIG1ldGhvZHMgKi8KQEAgLTEyMiwzMjcgKzEyMiwzMjcgQEAKIHN0YXRpYyB2b2lkCiBzYWRfZGVhbGxvYyhzYWRvYmplY3QgKnhwKQogewotICAgICAgICBjbG9zZSh4cC0+eF9mZCk7Ci0JUHlPYmplY3RfRGVsKHhwKTsKKyAgICBjbG9zZSh4cC0+eF9mZCk7CisgICAgUHlPYmplY3RfRGVsKHhwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9yZWFkKHNhZG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIGludCBzaXplLCBjb3VudDsKLQljaGFyICpjcDsKLQlQeU9iamVjdCAqcnY7Ci0JCi0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpyZWFkIiwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpOwotCWlmIChydiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpbnQgc2l6ZSwgY291bnQ7CisgICAgY2hhciAqY3A7CisgICAgUHlPYmplY3QgKnJ2OwogCi0JaWYgKCEoY3AgPSBQeVN0cmluZ19Bc1N0cmluZyhydikpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlYWQiLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7CisgICAgaWYgKHJ2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY291bnQgPSByZWFkKHNlbGYtPnhfZmQsIGNwLCBzaXplKTsKLQlpZiAoY291bnQgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAoIShjcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJ2KSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKKworICAgIGNvdW50ID0gcmVhZChzZWxmLT54X2ZkLCBjcCwgc2l6ZSk7CisgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAjaWYgMAotCS8qIFRCRDogd2h5IHByaW50IHRoaXMgbWVzc2FnZSBpZiB5b3UgY2FuIGhhbmRsZSB0aGUgY29uZGl0aW9uPwotCSAqIGFzc3VtZSBpdCdzIGRlYnVnZ2luZyBpbmZvIHdoaWNoIHdlIGNhbiBqdXN0IGFzIHdlbGwgZ2V0IHJpZAotCSAqIG9mLiAgaW4gYW55IGNhc2UgdGhpcyBtZXNzYWdlIHNob3VsZCAqbm90KiBiZSB1c2luZyBwcmludGYhCi0JICovCi0JaWYgKGNvdW50ICE9IHNpemUpCi0JCXByaW50Zigic3VuYXVkaW86IGZ1bm55IHJlYWQgcnYgJWQgd3RkICVkXG4iLCBjb3VudCwgc2l6ZSk7CisgICAgLyogVEJEOiB3aHkgcHJpbnQgdGhpcyBtZXNzYWdlIGlmIHlvdSBjYW4gaGFuZGxlIHRoZSBjb25kaXRpb24/CisgICAgICogYXNzdW1lIGl0J3MgZGVidWdnaW5nIGluZm8gd2hpY2ggd2UgY2FuIGp1c3QgYXMgd2VsbCBnZXQgcmlkCisgICAgICogb2YuICBpbiBhbnkgY2FzZSB0aGlzIG1lc3NhZ2Ugc2hvdWxkICpub3QqIGJlIHVzaW5nIHByaW50ZiEKKyAgICAgKi8KKyAgICBpZiAoY291bnQgIT0gc2l6ZSkKKyAgICAgICAgcHJpbnRmKCJzdW5hdWRpbzogZnVubnkgcmVhZCBydiAlZCB3dGQgJWRcbiIsIGNvdW50LCBzaXplKTsKICNlbmRpZgotCXNlbGYtPnhfaWNvdW50ICs9IGNvdW50OwotCXJldHVybiBydjsKKyAgICBzZWxmLT54X2ljb3VudCArPSBjb3VudDsKKyAgICByZXR1cm4gcnY7CiAKICAgZmluYWxseToKLQlQeV9ERUNSRUYocnYpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihydik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfd3JpdGUoc2Fkb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgY2hhciAqY3A7Ci0JaW50IGNvdW50LCBzaXplOwotCQotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOndyaXRlIiwgJmNwLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGNoYXIgKmNwOworICAgIGludCBjb3VudCwgc2l6ZTsKIAotCWNvdW50ID0gd3JpdGUoc2VsZi0+eF9mZCwgY3AsIHNpemUpOwotCWlmIChjb3VudCA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp3cml0ZSIsICZjcCwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGNvdW50ID0gd3JpdGUoc2VsZi0+eF9mZCwgY3AsIHNpemUpOworICAgIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjaWYgMAotCWlmIChjb3VudCAhPSBzaXplKQotCQlwcmludGYoInN1bmF1ZGlvOiBmdW5ueSB3cml0ZSBydiAlZCB3YW50ZWQgJWRcbiIsIGNvdW50LCBzaXplKTsKKyAgICBpZiAoY291bnQgIT0gc2l6ZSkKKyAgICAgICAgcHJpbnRmKCJzdW5hdWRpbzogZnVubnkgd3JpdGUgcnYgJWQgd2FudGVkICVkXG4iLCBjb3VudCwgc2l6ZSk7CiAjZW5kaWYKLQlzZWxmLT54X29jb3VudCArPSBjb3VudDsKLQkKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2VsZi0+eF9vY291bnQgKz0gY291bnQ7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfZ2V0aW5mbyhzYWRvYmplY3QgKnNlbGYpCiB7Ci0Jc2Fkc3RhdHVzb2JqZWN0ICpydjsKKyAgICBzYWRzdGF0dXNvYmplY3QgKnJ2OwogCi0JaWYgKCEocnYgPSBzYWRzX2FsbG9jKCkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIShydiA9IHNhZHNfYWxsb2MoKSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0dFVElORk8sICZydi0+YWkpIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7Ci0JCVB5X0RFQ1JFRihydik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcnY7CisgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0dFVElORk8sICZydi0+YWkpIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfc2V0aW5mbyhzYWRvYmplY3QgKnNlbGYsIHNhZHN0YXR1c29iamVjdCAqYXJnKQogewotCWlmICghaXNfc2Fkc3RhdHVzb2JqZWN0KGFyZykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiTXVzdCBiZSBzdW4gYXVkaW8gc3RhdHVzIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX1NFVElORk8sICZhcmctPmFpKSA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghaXNfc2Fkc3RhdHVzb2JqZWN0KGFyZykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IGJlIHN1biBhdWRpbyBzdGF0dXMgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fU0VUSU5GTywgJmFyZy0+YWkpIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfaWJ1ZmNvdW50KHNhZG9iamVjdCAqc2VsZikKIHsKLQlhdWRpb19pbmZvX3QgYWk7Ci0gICAgCi0JaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0dFVElORk8sICZhaSkgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhhaS5yZWNvcmQuc2FtcGxlcyAtIHNlbGYtPnhfaWNvdW50KTsKKyAgICBhdWRpb19pbmZvX3QgYWk7CisKKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fR0VUSU5GTywgJmFpKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGFpLnJlY29yZC5zYW1wbGVzIC0gc2VsZi0+eF9pY291bnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2FkX29idWZjb3VudChzYWRvYmplY3QgKnNlbGYpCiB7Ci0JYXVkaW9faW5mb190IGFpOwotICAgIAotCWlmIChpb2N0bChzZWxmLT54X2ZkLCBBVURJT19HRVRJTkZPLCAmYWkpIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiB4X29jb3VudCBpcyBpbiBieXRlcywgd2hlcmVhcyBwbGF5LnNhbXBsZXMgaXMgaW4gZnJhbWVzICovCi0JLyogd2Ugd2FudCBmcmFtZXMgKi8KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+eF9vY291bnQgLyAoYWkucGxheS5jaGFubmVscyAqCi0JCQkJCQlhaS5wbGF5LnByZWNpc2lvbiAvIDgpIC0KLQkJCSAgICAgIGFpLnBsYXkuc2FtcGxlcyk7CisgICAgYXVkaW9faW5mb190IGFpOworCisgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0dFVElORk8sICZhaSkgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIHhfb2NvdW50IGlzIGluIGJ5dGVzLCB3aGVyZWFzIHBsYXkuc2FtcGxlcyBpcyBpbiBmcmFtZXMgKi8KKyAgICAvKiB3ZSB3YW50IGZyYW1lcyAqLworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT54X29jb3VudCAvIChhaS5wbGF5LmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWkucGxheS5wcmVjaXNpb24gLyA4KSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFpLnBsYXkuc2FtcGxlcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfZHJhaW4oc2Fkb2JqZWN0ICpzZWxmKQogewotCWlmIChpb2N0bChzZWxmLT54X2ZkLCBBVURJT19EUkFJTiwgMCkgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fRFJBSU4sIDApIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNpZmRlZiBTT0xBUklTCiBzdGF0aWMgUHlPYmplY3QgKgogc2FkX2dldGRldihzYWRvYmplY3QgKnNlbGYpCiB7Ci0Jc3RydWN0IGF1ZGlvX2RldmljZSBhZDsKKyAgICBzdHJ1Y3QgYXVkaW9fZGV2aWNlIGFkOwogCi0JaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0dFVERFViwgJmFkKSA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzc3MpIiwgYWQubmFtZSwgYWQudmVyc2lvbiwgYWQuY29uZmlnKTsKKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fR0VUREVWLCAmYWQpIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzcykiLCBhZC5uYW1lLCBhZC52ZXJzaW9uLCBhZC5jb25maWcpOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfZmx1c2goc2Fkb2JqZWN0ICpzZWxmKQogewotCWlmIChpb2N0bChzZWxmLT54X2ZkLCBJX0ZMVVNILCBGTFVTSFcpIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGlvY3RsKHNlbGYtPnhfZmQsIElfRkxVU0gsIEZMVVNIVykgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9jbG9zZShzYWRvYmplY3QgKnNlbGYpCiB7Ci0gICAgCi0JaWYgKHNlbGYtPnhfZmQgPj0gMCkgewotCQljbG9zZShzZWxmLT54X2ZkKTsKLQkJc2VsZi0+eF9mZCA9IC0xOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisKKyAgICBpZiAoc2VsZi0+eF9mZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKHNlbGYtPnhfZmQpOworICAgICAgICBzZWxmLT54X2ZkID0gLTE7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9maWxlbm8oc2Fkb2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT54X2ZkKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+eF9mZCk7CiB9CiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIHNhZF9tZXRob2RzW10gPSB7Ci0gICAgICAgIHsgInJlYWQiLAkoUHlDRnVuY3Rpb24pc2FkX3JlYWQsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJ3cml0ZSIsCShQeUNGdW5jdGlvbilzYWRfd3JpdGUsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJpYnVmY291bnQiLAkoUHlDRnVuY3Rpb24pc2FkX2lidWZjb3VudCwgTUVUSF9OT0FSR1MgfSwKLSAgICAgICAgeyAib2J1ZmNvdW50IiwJKFB5Q0Z1bmN0aW9uKXNhZF9vYnVmY291bnQsIE1FVEhfTk9BUkdTIH0sCisgICAgeyAicmVhZCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2FkX3JlYWQsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgIndyaXRlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF93cml0ZSwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiaWJ1ZmNvdW50IiwgICAgICAoUHlDRnVuY3Rpb24pc2FkX2lidWZjb3VudCwgTUVUSF9OT0FSR1MgfSwKKyAgICB7ICJvYnVmY291bnQiLCAgICAgIChQeUNGdW5jdGlvbilzYWRfb2J1ZmNvdW50LCBNRVRIX05PQVJHUyB9LAogI2RlZmluZSBDVExfTUVUSE9EUyA0Ci0gICAgICAgIHsgImdldGluZm8iLAkoUHlDRnVuY3Rpb24pc2FkX2dldGluZm8sIE1FVEhfTk9BUkdTIH0sCi0gICAgICAgIHsgInNldGluZm8iLAkoUHlDRnVuY3Rpb24pc2FkX3NldGluZm8sIE1FVEhfT30sCi0gICAgICAgIHsgImRyYWluIiwJKFB5Q0Z1bmN0aW9uKXNhZF9kcmFpbiwgTUVUSF9OT0FSR1MgfSwKLSAgICAgICAgeyAiZmx1c2giLAkoUHlDRnVuY3Rpb24pc2FkX2ZsdXNoLCBNRVRIX05PQVJHUyB9LAorICAgIHsgImdldGluZm8iLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9nZXRpbmZvLCBNRVRIX05PQVJHUyB9LAorICAgIHsgInNldGluZm8iLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9zZXRpbmZvLCBNRVRIX099LAorICAgIHsgImRyYWluIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9kcmFpbiwgTUVUSF9OT0FSR1MgfSwKKyAgICB7ICJmbHVzaCIsICAgICAgICAgIChQeUNGdW5jdGlvbilzYWRfZmx1c2gsIE1FVEhfTk9BUkdTIH0sCiAjaWZkZWYgU09MQVJJUwotCXsgImdldGRldiIsCShQeUNGdW5jdGlvbilzYWRfZ2V0ZGV2LCBNRVRIX05PQVJHUyB9LAorICAgIHsgImdldGRldiIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9nZXRkZXYsIE1FVEhfTk9BUkdTIH0sCiAjZW5kaWYKLSAgICAgICAgeyAiY2xvc2UiLAkoUHlDRnVuY3Rpb24pc2FkX2Nsb3NlLCBNRVRIX05PQVJHUyB9LAotCXsgImZpbGVubyIsICAgICAoUHlDRnVuY3Rpb24pc2FkX2ZpbGVubywgTUVUSF9OT0FSR1MgfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsgImNsb3NlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9jbG9zZSwgTUVUSF9OT0FSR1MgfSwKKyAgICB7ICJmaWxlbm8iLCAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9maWxlbm8sIE1FVEhfTk9BUkdTIH0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfZ2V0YXR0cihzYWRvYmplY3QgKnhwLCBjaGFyICpuYW1lKQogewotCWlmICh4cC0+eF9pc2N0bCkKLQkJcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc2FkX21ldGhvZHMrQ1RMX01FVEhPRFMsCi0JCQkJICAgICAoUHlPYmplY3QgKil4cCwgbmFtZSk7Ci0JZWxzZQotCQlyZXR1cm4gUHlfRmluZE1ldGhvZChzYWRfbWV0aG9kcywgKFB5T2JqZWN0ICopeHAsIG5hbWUpOworICAgIGlmICh4cC0+eF9pc2N0bCkKKyAgICAgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc2FkX21ldGhvZHMrQ1RMX01FVEhPRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXhwLCBuYW1lKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKHNhZF9tZXRob2RzLCAoUHlPYmplY3QgKil4cCwgbmFtZSk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBzYWRzdGF0dXNvYmplY3QgKgogc2Fkc19hbGxvYyh2b2lkKSB7Ci0JcmV0dXJuIFB5T2JqZWN0X05ldyhzYWRzdGF0dXNvYmplY3QsICZTYWRzdGF0dXN0eXBlKTsKKyAgICByZXR1cm4gUHlPYmplY3RfTmV3KHNhZHN0YXR1c29iamVjdCwgJlNhZHN0YXR1c3R5cGUpOwogfQogCiBzdGF0aWMgdm9pZAogc2Fkc19kZWFsbG9jKHNhZHN0YXR1c29iamVjdCAqeHApCiB7Ci0JUHlNZW1fREVMKHhwKTsKKyAgICBQeU1lbV9ERUwoeHApOwogfQogCiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihhdWRpb19pbmZvX3QseCkKIHN0YXRpYyBzdHJ1Y3QgbWVtYmVybGlzdCBzYWRzX21sW10gPSB7Ci0JeyAiaV9zYW1wbGVfcmF0ZSIsCVRfVUlOVCwJCU9GRihyZWNvcmQuc2FtcGxlX3JhdGUpIH0sCi0JeyAiaV9jaGFubmVscyIsCQlUX1VJTlQsCQlPRkYocmVjb3JkLmNoYW5uZWxzKSB9LAotCXsgImlfcHJlY2lzaW9uIiwJVF9VSU5ULAkJT0ZGKHJlY29yZC5wcmVjaXNpb24pIH0sCi0JeyAiaV9lbmNvZGluZyIsCQlUX1VJTlQsCQlPRkYocmVjb3JkLmVuY29kaW5nKSB9LAotCXsgImlfZ2FpbiIsCQlUX1VJTlQsCQlPRkYocmVjb3JkLmdhaW4pIH0sCi0JeyAiaV9wb3J0IiwJCVRfVUlOVCwJCU9GRihyZWNvcmQucG9ydCkgfSwKLQl7ICJpX3NhbXBsZXMiLAkJVF9VSU5ULAkJT0ZGKHJlY29yZC5zYW1wbGVzKSB9LAotCXsgImlfZW9mIiwJCVRfVUlOVCwJCU9GRihyZWNvcmQuZW9mKSB9LAotCXsgImlfcGF1c2UiLAkJVF9VQllURSwJT0ZGKHJlY29yZC5wYXVzZSkgfSwKLQl7ICJpX2Vycm9yIiwJCVRfVUJZVEUsCU9GRihyZWNvcmQuZXJyb3IpIH0sCi0JeyAiaV93YWl0aW5nIiwJCVRfVUJZVEUsCU9GRihyZWNvcmQud2FpdGluZykgfSwKLQl7ICJpX29wZW4iLAkJVF9VQllURSwJT0ZGKHJlY29yZC5vcGVuKSAsCSBST30sCi0JeyAiaV9hY3RpdmUiLAkJVF9VQllURSwJT0ZGKHJlY29yZC5hY3RpdmUpICwJIFJPfSwKKyAgICB7ICJpX3NhbXBsZV9yYXRlIiwgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihyZWNvcmQuc2FtcGxlX3JhdGUpIH0sCisgICAgeyAiaV9jaGFubmVscyIsICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocmVjb3JkLmNoYW5uZWxzKSB9LAorICAgIHsgImlfcHJlY2lzaW9uIiwgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5wcmVjaXNpb24pIH0sCisgICAgeyAiaV9lbmNvZGluZyIsICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocmVjb3JkLmVuY29kaW5nKSB9LAorICAgIHsgImlfZ2FpbiIsICAgICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5nYWluKSB9LAorICAgIHsgImlfcG9ydCIsICAgICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5wb3J0KSB9LAorICAgIHsgImlfc2FtcGxlcyIsICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5zYW1wbGVzKSB9LAorICAgIHsgImlfZW9mIiwgICAgICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5lb2YpIH0sCisgICAgeyAiaV9wYXVzZSIsICAgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocmVjb3JkLnBhdXNlKSB9LAorICAgIHsgImlfZXJyb3IiLCAgICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHJlY29yZC5lcnJvcikgfSwKKyAgICB7ICJpX3dhaXRpbmciLCAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihyZWNvcmQud2FpdGluZykgfSwKKyAgICB7ICJpX29wZW4iLCAgICAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihyZWNvcmQub3BlbikgLCAgICAgICBST30sCisgICAgeyAiaV9hY3RpdmUiLCAgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocmVjb3JkLmFjdGl2ZSkgLCAgICAgUk99LAogI2lmZGVmIFNPTEFSSVMKLQl7ICJpX2J1ZmZlcl9zaXplIiwJVF9VSU5ULAkJT0ZGKHJlY29yZC5idWZmZXJfc2l6ZSkgfSwKLQl7ICJpX2JhbGFuY2UiLAkJVF9VQllURSwJT0ZGKHJlY29yZC5iYWxhbmNlKSB9LAotCXsgImlfYXZhaWxfcG9ydHMiLAlUX1VJTlQsCQlPRkYocmVjb3JkLmF2YWlsX3BvcnRzKSB9LAorICAgIHsgImlfYnVmZmVyX3NpemUiLCAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5idWZmZXJfc2l6ZSkgfSwKKyAgICB7ICJpX2JhbGFuY2UiLCAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihyZWNvcmQuYmFsYW5jZSkgfSwKKyAgICB7ICJpX2F2YWlsX3BvcnRzIiwgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihyZWNvcmQuYXZhaWxfcG9ydHMpIH0sCiAjZW5kaWYKIAotCXsgIm9fc2FtcGxlX3JhdGUiLAlUX1VJTlQsCQlPRkYocGxheS5zYW1wbGVfcmF0ZSkgfSwKLQl7ICJvX2NoYW5uZWxzIiwJCVRfVUlOVCwJCU9GRihwbGF5LmNoYW5uZWxzKSB9LAotCXsgIm9fcHJlY2lzaW9uIiwJVF9VSU5ULAkJT0ZGKHBsYXkucHJlY2lzaW9uKSB9LAotCXsgIm9fZW5jb2RpbmciLAkJVF9VSU5ULAkJT0ZGKHBsYXkuZW5jb2RpbmcpIH0sCi0JeyAib19nYWluIiwJCVRfVUlOVCwJCU9GRihwbGF5LmdhaW4pIH0sCi0JeyAib19wb3J0IiwJCVRfVUlOVCwJCU9GRihwbGF5LnBvcnQpIH0sCi0JeyAib19zYW1wbGVzIiwJCVRfVUlOVCwJCU9GRihwbGF5LnNhbXBsZXMpIH0sCi0JeyAib19lb2YiLAkJVF9VSU5ULAkJT0ZGKHBsYXkuZW9mKSB9LAotCXsgIm9fcGF1c2UiLAkJVF9VQllURSwJT0ZGKHBsYXkucGF1c2UpIH0sCi0JeyAib19lcnJvciIsCQlUX1VCWVRFLAlPRkYocGxheS5lcnJvcikgfSwKLQl7ICJvX3dhaXRpbmciLAkJVF9VQllURSwJT0ZGKHBsYXkud2FpdGluZykgfSwKLQl7ICJvX29wZW4iLAkJVF9VQllURSwJT0ZGKHBsYXkub3BlbikgLAkgUk99LAotCXsgIm9fYWN0aXZlIiwJCVRfVUJZVEUsCU9GRihwbGF5LmFjdGl2ZSkgLAkgUk99LAorICAgIHsgIm9fc2FtcGxlX3JhdGUiLCAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHBsYXkuc2FtcGxlX3JhdGUpIH0sCisgICAgeyAib19jaGFubmVscyIsICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocGxheS5jaGFubmVscykgfSwKKyAgICB7ICJvX3ByZWNpc2lvbiIsICAgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LnByZWNpc2lvbikgfSwKKyAgICB7ICJvX2VuY29kaW5nIiwgICAgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LmVuY29kaW5nKSB9LAorICAgIHsgIm9fZ2FpbiIsICAgICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHBsYXkuZ2FpbikgfSwKKyAgICB7ICJvX3BvcnQiLCAgICAgICAgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LnBvcnQpIH0sCisgICAgeyAib19zYW1wbGVzIiwgICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocGxheS5zYW1wbGVzKSB9LAorICAgIHsgIm9fZW9mIiwgICAgICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHBsYXkuZW9mKSB9LAorICAgIHsgIm9fcGF1c2UiLCAgICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHBsYXkucGF1c2UpIH0sCisgICAgeyAib19lcnJvciIsICAgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocGxheS5lcnJvcikgfSwKKyAgICB7ICJvX3dhaXRpbmciLCAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihwbGF5LndhaXRpbmcpIH0sCisgICAgeyAib19vcGVuIiwgICAgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocGxheS5vcGVuKSAsICAgICAgICAgUk99LAorICAgIHsgIm9fYWN0aXZlIiwgICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHBsYXkuYWN0aXZlKSAsICAgICAgIFJPfSwKICNpZmRlZiBTT0xBUklTCi0JeyAib19idWZmZXJfc2l6ZSIsCVRfVUlOVCwJCU9GRihwbGF5LmJ1ZmZlcl9zaXplKSB9LAotCXsgIm9fYmFsYW5jZSIsCQlUX1VCWVRFLAlPRkYocGxheS5iYWxhbmNlKSB9LAotCXsgIm9fYXZhaWxfcG9ydHMiLAlUX1VJTlQsCQlPRkYocGxheS5hdmFpbF9wb3J0cykgfSwKKyAgICB7ICJvX2J1ZmZlcl9zaXplIiwgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LmJ1ZmZlcl9zaXplKSB9LAorICAgIHsgIm9fYmFsYW5jZSIsICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHBsYXkuYmFsYW5jZSkgfSwKKyAgICB7ICJvX2F2YWlsX3BvcnRzIiwgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LmF2YWlsX3BvcnRzKSB9LAogI2VuZGlmCiAKLQl7ICJtb25pdG9yX2dhaW4iLAlUX1VJTlQsCQlPRkYobW9uaXRvcl9nYWluKSB9LAotICAgICAgICB7IE5VTEwsICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgMH0sCisgICAgeyAibW9uaXRvcl9nYWluIiwgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYobW9uaXRvcl9nYWluKSB9LAorICAgIHsgTlVMTCwgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAwfSwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRzX2dldGF0dHIoc2Fkc3RhdHVzb2JqZWN0ICp4cCwgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gUHlNZW1iZXJfR2V0KChjaGFyICopJnhwLT5haSwgc2Fkc19tbCwgbmFtZSk7CisgICAgcmV0dXJuIFB5TWVtYmVyX0dldCgoY2hhciAqKSZ4cC0+YWksIHNhZHNfbWwsIG5hbWUpOwogfQogCiBzdGF0aWMgaW50CiBzYWRzX3NldGF0dHIoc2Fkc3RhdHVzb2JqZWN0ICp4cCwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7CiAKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBzdW4gYXVkaW8gc3RhdHVzIGF0dHJpYnV0ZXMiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gUHlNZW1iZXJfU2V0KChjaGFyICopJnhwLT5haSwgc2Fkc19tbCwgbmFtZSwgdik7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRlbGV0ZSBzdW4gYXVkaW8gc3RhdHVzIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gUHlNZW1iZXJfU2V0KChjaGFyICopJnhwLT5haSwgc2Fkc19tbCwgbmFtZSwgdik7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNhZHR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkic3VuYXVkaW9kZXYuc3VuX2F1ZGlvX2RldmljZSIsCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKHNhZG9iamVjdCksCQkvKnRwX3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilzYWRfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpc2FkX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJCS8qdHBfcmVwciovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAic3VuYXVkaW9kZXYuc3VuX2F1ZGlvX2RldmljZSIsICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihzYWRvYmplY3QpLCAgICAgICAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXNhZF9kZWFsbG9jLCAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKXNhZF9nZXRhdHRyLCAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU2Fkc3RhdHVzdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJzdW5hdWRpb2Rldi5zdW5fYXVkaW9fZGV2aWNlX3N0YXR1cyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKHNhZHN0YXR1c29iamVjdCksCS8qdHBfc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXNhZHNfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpc2Fkc19nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYylzYWRzX3NldGF0dHIsCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCQkvKnRwX3JlcHIqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInN1bmF1ZGlvZGV2LnN1bl9hdWRpb19kZXZpY2Vfc3RhdHVzIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2Yoc2Fkc3RhdHVzb2JqZWN0KSwgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilzYWRzX2RlYWxsb2MsICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylzYWRzX2dldGF0dHIsICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKXNhZHNfc2V0YXR0ciwgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiB9OwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogc2Fkb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld3NhZG9iamVjdChhcmdzKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3c2Fkb2JqZWN0KGFyZ3MpOwogfQotICAgIAorCiBzdGF0aWMgUHlNZXRob2REZWYgc3VuYXVkaW9kZXZfbWV0aG9kc1tdID0gewogICAgIHsgIm9wZW4iLCBzYWRvcGVuLCBNRVRIX1ZBUkFSR1MgfSwKICAgICB7IDAsIDAgfSwKQEAgLTQ1MSwxNyArNDUxLDE3IEBACiB2b2lkCiBpbml0c3VuYXVkaW9kZXYodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgc3VuYXVkaW9kZXYgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgotCSAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKLQkgICAgcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJzdW5hdWRpb2RldiIsIHN1bmF1ZGlvZGV2X21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlTdW5BdWRpb0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzdW5hdWRpb2Rldi5lcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChTdW5BdWRpb0Vycm9yKQotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBTdW5BdWRpb0Vycm9yKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSBzdW5hdWRpb2RldiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgic3VuYXVkaW9kZXYiLCBzdW5hdWRpb2Rldl9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgU3VuQXVkaW9FcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic3VuYXVkaW9kZXYuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoU3VuQXVkaW9FcnJvcikKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgU3VuQXVkaW9FcnJvcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3N2bW9kdWxlLmMgYi9Nb2R1bGVzL3N2bW9kdWxlLmMKaW5kZXggMzg0NWUyMC4uNmU0MTljZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zdm1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3Ztb2R1bGUuYwpAQCAtOSwyMyArOSwyMyBAQAogI2luY2x1ZGUgPHN2aWRlby5oPgogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgImNvbXBpbGUuaCIKLSNpbmNsdWRlICJ5dXYuaCIJCS8qIGZvciBZVVYgY29udmVyc2lvbiBmdW5jdGlvbnMgKi8KKyNpbmNsdWRlICJ5dXYuaCIgICAgICAgICAgICAgICAgLyogZm9yIFlVViBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVNWX25vZGVQIG9iX3N2aWRlbzsKLQlzdkNhcHR1cmVJbmZvIG9iX2luZm87CisgICAgUHlPYmplY3RfSEVBRAorICAgIFNWX25vZGVQIG9iX3N2aWRlbzsKKyAgICBzdkNhcHR1cmVJbmZvIG9iX2luZm87CiB9IHN2b2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCXZvaWQgKm9iX2NhcHR1cmU7Ci0JaW50IG9iX211c3R1bmxvY2s7Ci0Jc3ZDYXB0dXJlSW5mbyBvYl9pbmZvOwotCXN2b2JqZWN0ICpvYl9zdmlkZW87CisgICAgUHlPYmplY3RfSEVBRAorICAgIHZvaWQgKm9iX2NhcHR1cmU7CisgICAgaW50IG9iX211c3R1bmxvY2s7CisgICAgc3ZDYXB0dXJlSW5mbyBvYl9pbmZvOworICAgIHN2b2JqZWN0ICpvYl9zdmlkZW87CiB9IGNhcHR1cmVvYmplY3Q7CiAKLXN0YXRpYyBQeU9iamVjdCAqU3ZFcnJvcjsJCS8qIGV4Y2VwdGlvbiBzdi5lcnJvciAqLworc3RhdGljIFB5T2JqZWN0ICpTdkVycm9yOyAgICAgICAgICAgICAgIC8qIGV4Y2VwdGlvbiBzdi5lcnJvciAqLwogCiBzdGF0aWMgUHlPYmplY3QgKm5ld2NhcHR1cmVvYmplY3Qoc3ZvYmplY3QgKiwgdm9pZCAqLCBpbnQpOwogCkBAIC0zMywzNiArMzMsMzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9lcnJvcih2b2lkKQogewotCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCBzdlN0cmVycm9yKHN2aWRlb19lcnJubykpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCBzdlN0cmVycm9yKHN2aWRlb19lcnJubykpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotc3ZjX2NvbnZlcnNpb24oY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKCpmdW5jdGlvbikoKSwJZmxvYXQgZmFjdG9yKQorc3ZjX2NvbnZlcnNpb24oY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKCpmdW5jdGlvbikoKSwgZmxvYXQgZmFjdG9yKQogewotCVB5T2JqZWN0ICpvdXRwdXQ7Ci0JaW50IGludmVydDsKLQljaGFyKiBvdXRzdHI7CisgICAgUHlPYmplY3QgKm91dHB1dDsKKyAgICBpbnQgaW52ZXJ0OworICAgIGNoYXIqIG91dHN0cjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmaW52ZXJ0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZpbnZlcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghKG91dHB1dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQlOVUxMLAotCQkoaW50KShzZWxmLT5vYl9pbmZvLndpZHRoICogc2VsZi0+b2JfaW5mby5oZWlnaHQgKiBmYWN0b3IpKSkpCi0JewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCEob3V0c3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob3V0cHV0KSkpIHsKLQkJUHlfREVDUkVGKG91dHB1dCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIShvdXRwdXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgTlVMTCwKKyAgICAgICAgKGludCkoc2VsZi0+b2JfaW5mby53aWR0aCAqIHNlbGYtPm9iX2luZm8uaGVpZ2h0ICogZmFjdG9yKSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghKG91dHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG91dHB1dCkpKSB7CisgICAgICAgIFB5X0RFQ1JFRihvdXRwdXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkoKmZ1bmN0aW9uKSgoYm9vbGVhbilpbnZlcnQsIHNlbGYtPm9iX2NhcHR1cmUsCi0JCSAgICBvdXRzdHIsCi0JCSAgICBzZWxmLT5vYl9pbmZvLndpZHRoLCBzZWxmLT5vYl9pbmZvLmhlaWdodCk7CisgICAgKCpmdW5jdGlvbikoKGJvb2xlYW4paW52ZXJ0LCBzZWxmLT5vYl9jYXB0dXJlLAorICAgICAgICAgICAgICAgIG91dHN0ciwKKyAgICAgICAgICAgICAgICBzZWxmLT5vYl9pbmZvLndpZHRoLCBzZWxmLT5vYl9pbmZvLmhlaWdodCk7CiAKLQlyZXR1cm4gb3V0cHV0OworICAgIHJldHVybiBvdXRwdXQ7CiB9CiAKIC8qCkBAIC03MiwxMTcgKzcyLDExNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19ZVVZ0b1lVVjQyMkRDKGNhcHR1cmVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9ZVVY0MTFfRlJBTUVTKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBoYXMgYmFkIGZvcm1hdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHN2Y19jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHl1dl9zdjQxMV90b19jbDQyMmRjLCAyLjApOworICAgIGlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9ZVVY0MTFfRlJBTUVTKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBoYXMgYmFkIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHN2Y19jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHl1dl9zdjQxMV90b19jbDQyMmRjLCAyLjApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZjX1lVVnRvWVVWNDIyRENfcXVhcnRlcihjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfWVVWNDExX0ZSQU1FUykgewotCQlQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLAotCQkJICAgICAgeXV2X3N2NDExX3RvX2NsNDIyZGNfcXVhcnRlcnNpemUsIDAuNSk7CisgICAgaWYgKHNlbGYtPm9iX2luZm8uZm9ybWF0ICE9IFNWX1lVVjQxMV9GUkFNRVMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X3N2NDExX3RvX2NsNDIyZGNfcXVhcnRlcnNpemUsIDAuNSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdmNfWVVWdG9ZVVY0MjJEQ19zaXh0ZWVudGgoY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKHNlbGYtPm9iX2luZm8uZm9ybWF0ICE9IFNWX1lVVjQxMV9GUkFNRVMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywKLQkJCSAgICAgIHl1dl9zdjQxMV90b19jbDQyMmRjX3NpeHRlZW50aHNpemUsIDAuMTI1KTsKKyAgICBpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfWVVWNDExX0ZSQU1FUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfc3Y0MTFfdG9fY2w0MjJkY19zaXh0ZWVudGhzaXplLCAwLjEyNSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdmNfWVVWdG9SR0IoY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3dpdGNoIChzZWxmLT5vYl9pbmZvLmZvcm1hdCkgewotCWNhc2UgU1ZfWVVWNDExX0ZSQU1FUzoKLQljYXNlIFNWX1lVVjQxMV9GUkFNRVNfQU5EX0JMQU5LSU5HX0JVRkZFUjoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhZCBiYWQgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZZVVZ0b1JHQiwgKGZsb2F0KSBzaXplb2YobG9uZykpOworICAgIHN3aXRjaCAoc2VsZi0+b2JfaW5mby5mb3JtYXQpIHsKKyAgICBjYXNlIFNWX1lVVjQxMV9GUkFNRVM6CisgICAgY2FzZSBTVl9ZVVY0MTFfRlJBTUVTX0FORF9CTEFOS0lOR19CVUZGRVI6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBoYWQgYmFkIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHN2Y19jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHN2WVVWdG9SR0IsIChmbG9hdCkgc2l6ZW9mKGxvbmcpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19SR0I4dG9SR0IzMihjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfUkdCOF9GUkFNRVMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZSR0I4dG9SR0IzMiwgKGZsb2F0KSBzaXplb2YobG9uZykpOworICAgIGlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9SR0I4X0ZSQU1FUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdlJHQjh0b1JHQjMyLCAoZmxvYXQpIHNpemVvZihsb25nKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdmNfSW50ZXJsZWF2ZUZpZWxkcyhjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfUkdCOF9GUkFNRVMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZJbnRlcmxlYXZlRmllbGRzLCAxLjApOworICAgIGlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9SR0I4X0ZSQU1FUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdkludGVybGVhdmVGaWVsZHMsIDEuMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdmNfR2V0RmllbGRzKGNhcHR1cmVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpmMSA9IE5VTEw7Ci0JUHlPYmplY3QgKmYyID0gTlVMTDsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlpbnQgZmllbGRzaXplOwotCWNoYXIqIG9iY2FwdHVyZTsKKyAgICBQeU9iamVjdCAqZjEgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmMiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgaW50IGZpZWxkc2l6ZTsKKyAgICBjaGFyKiBvYmNhcHR1cmU7CiAKLQlpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfUkdCOF9GUkFNRVMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfUkdCOF9GUkFNRVMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZpZWxkc2l6ZSA9IHNlbGYtPm9iX2luZm8ud2lkdGggKiBzZWxmLT5vYl9pbmZvLmhlaWdodCAvIDI7Ci0Jb2JjYXB0dXJlID0gKGNoYXIqKXNlbGYtPm9iX2NhcHR1cmU7Ci0JCi0JaWYgKCEoZjEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvYmNhcHR1cmUsIGZpZWxkc2l6ZSkpKQotCQlnb3RvIGZpbmFsbHk7Ci0JaWYgKCEoZjIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvYmNhcHR1cmUgKyBmaWVsZHNpemUsCi0JCQkJCSAgICAgIGZpZWxkc2l6ZSkpKQotCQlnb3RvIGZpbmFsbHk7Ci0JcmV0ID0gUHlUdXBsZV9QYWNrKDIsIGYxLCBmMik7CisgICAgZmllbGRzaXplID0gc2VsZi0+b2JfaW5mby53aWR0aCAqIHNlbGYtPm9iX2luZm8uaGVpZ2h0IC8gMjsKKyAgICBvYmNhcHR1cmUgPSAoY2hhciopc2VsZi0+b2JfY2FwdHVyZTsKKworICAgIGlmICghKGYxID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUob2JjYXB0dXJlLCBmaWVsZHNpemUpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIGlmICghKGYyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUob2JjYXB0dXJlICsgZmllbGRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzaXplKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICByZXQgPSBQeVR1cGxlX1BhY2soMiwgZjEsIGYyKTsKIAogICBmaW5hbGx5OgotCVB5X1hERUNSRUYoZjEpOwotCVB5X1hERUNSRUYoZjIpOwotCXJldHVybiByZXQ7CisgICAgUHlfWERFQ1JFRihmMSk7CisgICAgUHlfWERFQ1JFRihmMik7CisgICAgcmV0dXJuIHJldDsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19VbmxvY2tDYXB0dXJlRGF0YShjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFzZWxmLT5vYl9tdXN0dW5sb2NrKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiYnVmZmVyIHNob3VsZCBub3QgYmUgdW5sb2NrZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghc2VsZi0+b2JfbXVzdHVubG9jaykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImJ1ZmZlciBzaG91bGQgbm90IGJlIHVubG9ja2VkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChzdlVubG9ja0NhcHR1cmVEYXRhKHNlbGYtPm9iX3N2aWRlby0+b2Jfc3ZpZGVvLCBzZWxmLT5vYl9jYXB0dXJlKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2VW5sb2NrQ2FwdHVyZURhdGEoc2VsZi0+b2Jfc3ZpZGVvLT5vYl9zdmlkZW8sIHNlbGYtPm9iX2NhcHR1cmUpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCXNlbGYtPm9iX211c3R1bmxvY2sgPSAwOworICAgIHNlbGYtPm9iX211c3R1bmxvY2sgPSAwOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2lmZGVmIFVTRV9HTApAQCAtMTkxLDc4MCArMTkxLDc4MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19scmVjdHdyaXRlKGNhcHR1cmVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVNjcmVlbmNvb3JkIHgxLCB4MiwgeTEsIHkyOworICAgIFNjcmVlbmNvb3JkIHgxLCB4MiwgeTEsIHkyOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGhoaGgpIiwgJngxLCAmeDIsICZ5MSwgJnkyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGhoaGgpIiwgJngxLCAmeDIsICZ5MSwgJnkyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlscmVjdHdyaXRlKHgxLCB4MiwgeTEsIHkyLCAodW5zaWduZWQgbG9uZyAqKSBzZWxmLT5vYl9jYXB0dXJlKTsKKyAgICBscmVjdHdyaXRlKHgxLCB4MiwgeTEsIHkyLCAodW5zaWduZWQgbG9uZyAqKSBzZWxmLT5vYl9jYXB0dXJlKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y193cml0ZWZpbGUoY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZpbGU7Ci0JaW50IHNpemU7Ci0JRklMRSogZnA7CisgICAgUHlPYmplY3QgKmZpbGU7CisgICAgaW50IHNpemU7CisgICAgRklMRSogZnA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJPIiwgJmZpbGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJPIiwgJmZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlGaWxlX0NoZWNrKGZpbGUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAibm90IGEgZmlsZSBvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlGaWxlX0NoZWNrKGZpbGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAibm90IGEgZmlsZSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCEoZnAgPSBQeUZpbGVfQXNGaWxlKGZpbGUpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEoZnAgPSBQeUZpbGVfQXNGaWxlKGZpbGUpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzaXplID0gc2VsZi0+b2JfaW5mby53aWR0aCAqIHNlbGYtPm9iX2luZm8uaGVpZ2h0OworICAgIHNpemUgPSBzZWxmLT5vYl9pbmZvLndpZHRoICogc2VsZi0+b2JfaW5mby5oZWlnaHQ7CiAKLQlpZiAoZndyaXRlKHNlbGYtPm9iX2NhcHR1cmUsIHNpemVvZihsb25nKSwgc2l6ZSwgZnApICE9IHNpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJ3cml0aW5nIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGZ3cml0ZShzZWxmLT5vYl9jYXB0dXJlLCBzaXplb2YobG9uZyksIHNpemUsIGZwKSAhPSBzaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAid3JpdGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19GaW5kVmlzaWJsZVJlZ2lvbihjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl2b2lkICp2aXNpYmxlOwotCWludCB3aWR0aDsKKyAgICB2b2lkICp2aXNpYmxlOworICAgIGludCB3aWR0aDsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZGaW5kVmlzaWJsZVJlZ2lvbihzZWxmLT5vYl9zdmlkZW8tPm9iX3N2aWRlbywKLQkJCQlzZWxmLT5vYl9jYXB0dXJlLCAmdmlzaWJsZSwKLQkJCQlzZWxmLT5vYl9pbmZvLndpZHRoKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2RmluZFZpc2libGVSZWdpb24oc2VsZi0+b2Jfc3ZpZGVvLT5vYl9zdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfY2FwdHVyZSwgJnZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfaW5mby53aWR0aCkpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JaWYgKHZpc2libGUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaW4gd3JvbmcgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodmlzaWJsZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBpbiB3cm9uZyBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG5ld2NhcHR1cmVvYmplY3Qoc2VsZi0+b2Jfc3ZpZGVvLCB2aXNpYmxlLCAwKTsKKyAgICByZXR1cm4gbmV3Y2FwdHVyZW9iamVjdChzZWxmLT5vYl9zdmlkZW8sIHZpc2libGUsIDApOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY2FwdHVyZV9tZXRob2RzW10gPSB7Ci0JeyJZVVZ0b1JHQiIsCQkoUHlDRnVuY3Rpb24pc3ZjX1lVVnRvUkdCLCBNRVRIX09MREFSR1N9LAotCXsiUkdCOHRvUkdCMzIiLAkJKFB5Q0Z1bmN0aW9uKXN2Y19SR0I4dG9SR0IzMiwgTUVUSF9PTERBUkdTfSwKLQl7IkludGVybGVhdmVGaWVsZHMiLAkoUHlDRnVuY3Rpb24pc3ZjX0ludGVybGVhdmVGaWVsZHMsIE1FVEhfT0xEQVJHU30sCi0JeyJVbmxvY2tDYXB0dXJlRGF0YSIsCShQeUNGdW5jdGlvbilzdmNfVW5sb2NrQ2FwdHVyZURhdGEsIE1FVEhfT0xEQVJHU30sCi0JeyJGaW5kVmlzaWJsZVJlZ2lvbiIsCShQeUNGdW5jdGlvbilzdmNfRmluZFZpc2libGVSZWdpb24sIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRGaWVsZHMiLAkJKFB5Q0Z1bmN0aW9uKXN2Y19HZXRGaWVsZHMsIE1FVEhfT0xEQVJHU30sCi0JeyJZVVZ0b1lVVjQyMkRDIiwJKFB5Q0Z1bmN0aW9uKXN2Y19ZVVZ0b1lVVjQyMkRDLCBNRVRIX09MREFSR1N9LAotCXsiWVVWdG9ZVVY0MjJEQ19xdWFydGVyIiwoUHlDRnVuY3Rpb24pc3ZjX1lVVnRvWVVWNDIyRENfcXVhcnRlciwgTUVUSF9PTERBUkdTfSwKLQl7IllVVnRvWVVWNDIyRENfc2l4dGVlbnRoIiwoUHlDRnVuY3Rpb24pc3ZjX1lVVnRvWVVWNDIyRENfc2l4dGVlbnRoLCBNRVRIX09MREFSR1N9LAorICAgIHsiWVVWdG9SR0IiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZjX1lVVnRvUkdCLCBNRVRIX09MREFSR1N9LAorICAgIHsiUkdCOHRvUkdCMzIiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZjX1JHQjh0b1JHQjMyLCBNRVRIX09MREFSR1N9LAorICAgIHsiSW50ZXJsZWF2ZUZpZWxkcyIsICAgICAgICAoUHlDRnVuY3Rpb24pc3ZjX0ludGVybGVhdmVGaWVsZHMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJVbmxvY2tDYXB0dXJlRGF0YSIsICAgICAgIChQeUNGdW5jdGlvbilzdmNfVW5sb2NrQ2FwdHVyZURhdGEsIE1FVEhfT0xEQVJHU30sCisgICAgeyJGaW5kVmlzaWJsZVJlZ2lvbiIsICAgICAgIChQeUNGdW5jdGlvbilzdmNfRmluZFZpc2libGVSZWdpb24sIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRGaWVsZHMiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdmNfR2V0RmllbGRzLCBNRVRIX09MREFSR1N9LAorICAgIHsiWVVWdG9ZVVY0MjJEQyIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZjX1lVVnRvWVVWNDIyREMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJZVVZ0b1lVVjQyMkRDX3F1YXJ0ZXIiLChQeUNGdW5jdGlvbilzdmNfWVVWdG9ZVVY0MjJEQ19xdWFydGVyLCBNRVRIX09MREFSR1N9LAorICAgIHsiWVVWdG9ZVVY0MjJEQ19zaXh0ZWVudGgiLChQeUNGdW5jdGlvbilzdmNfWVVWdG9ZVVY0MjJEQ19zaXh0ZWVudGgsIE1FVEhfT0xEQVJHU30sCiAjaWZkZWYgVVNFX0dMCi0JeyJscmVjdHdyaXRlIiwJCShQeUNGdW5jdGlvbilzdmNfbHJlY3R3cml0ZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxyZWN0d3JpdGUiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2Y19scmVjdHdyaXRlLCBNRVRIX09MREFSR1N9LAogI2VuZGlmCi0JeyJ3cml0ZWZpbGUiLAkJKFB5Q0Z1bmN0aW9uKXN2Y193cml0ZWZpbGUsIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0gCQkvKiBzZW50aW5lbCAqLworICAgIHsid3JpdGVmaWxlIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZjX3dyaXRlZmlsZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgdm9pZAogY2FwdHVyZV9kZWFsbG9jKGNhcHR1cmVvYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2NhcHR1cmUgIT0gTlVMTCkgewotCQlpZiAoc2VsZi0+b2JfbXVzdHVubG9jaykKLQkJCSh2b2lkKXN2VW5sb2NrQ2FwdHVyZURhdGEoc2VsZi0+b2Jfc3ZpZGVvLT5vYl9zdmlkZW8sCi0JCQkJCQkgIHNlbGYtPm9iX2NhcHR1cmUpOwotCQlzZWxmLT5vYl9jYXB0dXJlID0gTlVMTDsKLQkJUHlfREVDUkVGKHNlbGYtPm9iX3N2aWRlbyk7Ci0JCXNlbGYtPm9iX3N2aWRlbyA9IE5VTEw7Ci0JfQotCVB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfY2FwdHVyZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzZWxmLT5vYl9tdXN0dW5sb2NrKQorICAgICAgICAgICAgKHZvaWQpc3ZVbmxvY2tDYXB0dXJlRGF0YShzZWxmLT5vYl9zdmlkZW8tPm9iX3N2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfY2FwdHVyZSk7CisgICAgICAgIHNlbGYtPm9iX2NhcHR1cmUgPSBOVUxMOworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+b2Jfc3ZpZGVvKTsKKyAgICAgICAgc2VsZi0+b2Jfc3ZpZGVvID0gTlVMTDsKKyAgICB9CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2FwdHVyZV9nZXRhdHRyKHN2b2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKGNhcHR1cmVfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoY2FwdHVyZV9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogUHlUeXBlT2JqZWN0IENhcHR1cmV0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkic3YuY2FwdHVyZSIsCQkJLyp0cF9uYW1lKi8KLQlzaXplb2YoY2FwdHVyZW9iamVjdCksCQkvKnRwX3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciljYXB0dXJlX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JMCwJCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWNhcHR1cmVfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkJLyp0cF9yZXByKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgInN2LmNhcHR1cmUiLCAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoY2FwdHVyZW9iamVjdCksICAgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciljYXB0dXJlX2RlYWxsb2MsICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYyljYXB0dXJlX2dldGF0dHIsICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3Y2FwdHVyZW9iamVjdChzdm9iamVjdCAqc2VsZiwgdm9pZCAqcHRyLCBpbnQgbXVzdHVubG9jaykKIHsKLQljYXB0dXJlb2JqZWN0ICpwOworICAgIGNhcHR1cmVvYmplY3QgKnA7CiAKLQlwID0gUHlPYmplY3RfTmV3KGNhcHR1cmVvYmplY3QsICZDYXB0dXJldHlwZSk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcC0+b2Jfc3ZpZGVvID0gc2VsZjsKLQlQeV9JTkNSRUYoc2VsZik7Ci0JcC0+b2JfY2FwdHVyZSA9IHB0cjsKLQlwLT5vYl9tdXN0dW5sb2NrID0gbXVzdHVubG9jazsKLQlwLT5vYl9pbmZvID0gc2VsZi0+b2JfaW5mbzsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHA7CisgICAgcCA9IFB5T2JqZWN0X05ldyhjYXB0dXJlb2JqZWN0LCAmQ2FwdHVyZXR5cGUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPm9iX3N2aWRlbyA9IHNlbGY7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHAtPm9iX2NhcHR1cmUgPSBwdHI7CisgICAgcC0+b2JfbXVzdHVubG9jayA9IG11c3R1bmxvY2s7CisgICAgcC0+b2JfaW5mbyA9IHNlbGYtPm9iX2luZm87CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfR2V0Q2FwdHVyZURhdGEoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKnB0cjsKLQlsb25nIGZpZWxkSUQ7Ci0JUHlPYmplY3QgKnJlcywgKmM7CisgICAgdm9pZCAqcHRyOworICAgIGxvbmcgZmllbGRJRDsKKyAgICBQeU9iamVjdCAqcmVzLCAqYzsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZHZXRDYXB0dXJlRGF0YShzZWxmLT5vYl9zdmlkZW8sICZwdHIsICZmaWVsZElEKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2R2V0Q2FwdHVyZURhdGEoc2VsZi0+b2Jfc3ZpZGVvLCAmcHRyLCAmZmllbGRJRCkpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JaWYgKHB0ciA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAibm8gZGF0YSBhdmFpbGFibGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChwdHIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgIm5vIGRhdGEgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWMgPSBuZXdjYXB0dXJlb2JqZWN0KHNlbGYsIHB0ciwgMSk7Ci0JaWYgKGMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gUHlfQnVpbGRWYWx1ZSgiKE9pKSIsIGMsIGZpZWxkSUQpOwotCVB5X0RFQ1JFRihjKTsKLQlyZXR1cm4gcmVzOworICAgIGMgPSBuZXdjYXB0dXJlb2JqZWN0KHNlbGYsIHB0ciwgMSk7CisgICAgaWYgKGMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gUHlfQnVpbGRWYWx1ZSgiKE9pKSIsIGMsIGZpZWxkSUQpOworICAgIFB5X0RFQ1JFRihjKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfQmluZEdMV2luZG93KHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHdpZDsKLQlpbnQgbW9kZTsKKyAgICBsb25nIHdpZDsKKyAgICBpbnQgbW9kZTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmd2lkLCAmbW9kZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmd2lkLCAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2QmluZEdMV2luZG93KHNlbGYtPm9iX3N2aWRlbywgd2lkLCBtb2RlKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2QmluZEdMV2luZG93KHNlbGYtPm9iX3N2aWRlbywgd2lkLCBtb2RlKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfRW5kQ29udGludW91c0NhcHR1cmUoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdkVuZENvbnRpbnVvdXNDYXB0dXJlKHNlbGYtPm9iX3N2aWRlbykpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmIChzdkVuZENvbnRpbnVvdXNDYXB0dXJlKHNlbGYtPm9iX3N2aWRlbykpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X0lzVmlkZW9EaXNwbGF5ZWQoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB2OworICAgIGludCB2OwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXYgPSBzdklzVmlkZW9EaXNwbGF5ZWQoc2VsZi0+b2Jfc3ZpZGVvKTsKLQlpZiAodiA9PSAtMSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgdiA9IHN2SXNWaWRlb0Rpc3BsYXllZChzZWxmLT5vYl9zdmlkZW8pOworICAgIGlmICh2ID09IC0xKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgdik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSB2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X091dHB1dE9mZnNldChzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHhfb2Zmc2V0OwotCWludCB5X29mZnNldDsKKyAgICBpbnQgeF9vZmZzZXQ7CisgICAgaW50IHlfb2Zmc2V0OwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZ4X29mZnNldCwgJnlfb2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZ4X29mZnNldCwgJnlfb2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZPdXRwdXRPZmZzZXQoc2VsZi0+b2Jfc3ZpZGVvLCB4X29mZnNldCwgeV9vZmZzZXQpKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZPdXRwdXRPZmZzZXQoc2VsZi0+b2Jfc3ZpZGVvLCB4X29mZnNldCwgeV9vZmZzZXQpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9QdXRGcmFtZShzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqYnVmZmVyOworICAgIGNoYXIgKmJ1ZmZlcjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgInMiLCAmYnVmZmVyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyIsICZidWZmZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdlB1dEZyYW1lKHNlbGYtPm9iX3N2aWRlbywgYnVmZmVyKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2UHV0RnJhbWUoc2VsZi0+b2Jfc3ZpZGVvLCBidWZmZXIpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9RdWVyeVNpemUoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB3OwotCWludCBoOwotCWludCBydzsKLQlpbnQgcmg7CisgICAgaW50IHc7CisgICAgaW50IGg7CisgICAgaW50IHJ3OworICAgIGludCByaDsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmdywgJmgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJncsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZRdWVyeVNpemUoc2VsZi0+b2Jfc3ZpZGVvLCB3LCBoLCAmcncsICZyaCkpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmIChzdlF1ZXJ5U2l6ZShzZWxmLT5vYl9zdmlkZW8sIHcsIGgsICZydywgJnJoKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIChsb25nKSBydywgKGxvbmcpIHJoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIChsb25nKSBydywgKGxvbmcpIHJoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X1NldFNpemUoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB3OwotCWludCBoOworICAgIGludCB3OworICAgIGludCBoOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZ3LCAmaCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmdywgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdlNldFNpemUoc2VsZi0+b2Jfc3ZpZGVvLCB3LCBoKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2U2V0U2l6ZShzZWxmLT5vYl9zdmlkZW8sIHcsIGgpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9TZXRTdGREZWZhdWx0cyhzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2U2V0U3RkRGVmYXVsdHMoc2VsZi0+b2Jfc3ZpZGVvKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2U2V0U3RkRGVmYXVsdHMoc2VsZi0+b2Jfc3ZpZGVvKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfVXNlRXhjbHVzaXZlKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlib29sZWFuIG9ub2ZmOwotCWludCBtb2RlOworICAgIGJvb2xlYW4gb25vZmY7CisgICAgaW50IG1vZGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJm9ub2ZmLCAmbW9kZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmb25vZmYsICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZVc2VFeGNsdXNpdmUoc2VsZi0+b2Jfc3ZpZGVvLCBvbm9mZiwgbW9kZSkpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmIChzdlVzZUV4Y2x1c2l2ZShzZWxmLT5vYl9zdmlkZW8sIG9ub2ZmLCBtb2RlKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfV2luZG93T2Zmc2V0KHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeF9vZmZzZXQ7Ci0JaW50IHlfb2Zmc2V0OworICAgIGludCB4X29mZnNldDsKKyAgICBpbnQgeV9vZmZzZXQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnhfb2Zmc2V0LCAmeV9vZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnhfb2Zmc2V0LCAmeV9vZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdldpbmRvd09mZnNldChzZWxmLT5vYl9zdmlkZW8sIHhfb2Zmc2V0LCB5X29mZnNldCkpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmIChzdldpbmRvd09mZnNldChzZWxmLT5vYl9zdmlkZW8sIHhfb2Zmc2V0LCB5X29mZnNldCkpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X0NhcHR1cmVCdXJzdChzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGJ5dGVzLCBpOwotCXN2Q2FwdHVyZUluZm8gaW5mbzsKLQl2b2lkICpiaXR2ZWN0b3IgPSBOVUxMOwotCVB5T2JqZWN0ICp2aWRlb2RhdGEgPSBOVUxMOwotCVB5T2JqZWN0ICpiaXR2ZWNvYmogPSBOVUxMOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCXN0YXRpYyBQeU9iamVjdCAqZXZlbml0ZW0sICpvZGRpdGVtOworICAgIGludCBieXRlcywgaTsKKyAgICBzdkNhcHR1cmVJbmZvIGluZm87CisgICAgdm9pZCAqYml0dmVjdG9yID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdmlkZW9kYXRhID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYml0dmVjb2JqID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmV2ZW5pdGVtLCAqb2RkaXRlbTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWlpaSkiLCAmaW5mby5mb3JtYXQsCi0JCQkgJmluZm8ud2lkdGgsICZpbmZvLmhlaWdodCwKLQkJCSAmaW5mby5zaXplLCAmaW5mby5zYW1wbGluZ3JhdGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlpaWkpIiwgJmluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgJmluZm8ud2lkdGgsICZpbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICZpbmZvLnNpemUsICZpbmZvLnNhbXBsaW5ncmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3dpdGNoIChpbmZvLmZvcm1hdCkgewotCWNhc2UgU1ZfUkdCOF9GUkFNRVM6Ci0JCWJpdHZlY3RvciA9IG1hbGxvYyhTVl9CSVRWRUNfU0laRShpbmZvLnNpemUpKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVl9ZVVY0MTFfRlJBTUVTX0FORF9CTEFOS0lOR19CVUZGRVI6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiaWxsZWdhbCBmb3JtYXQgc3BlY2lmaWVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBzd2l0Y2ggKGluZm8uZm9ybWF0KSB7CisgICAgY2FzZSBTVl9SR0I4X0ZSQU1FUzoKKyAgICAgICAgYml0dmVjdG9yID0gbWFsbG9jKFNWX0JJVFZFQ19TSVpFKGluZm8uc2l6ZSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNWX1lVVjQxMV9GUkFNRVNfQU5EX0JMQU5LSU5HX0JVRkZFUjoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJpbGxlZ2FsIGZvcm1hdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHN2UXVlcnlDYXB0dXJlQnVmZmVyU2l6ZShzZWxmLT5vYl9zdmlkZW8sICZpbmZvLCAmYnl0ZXMpKSB7Ci0JCXJlcyA9IHN2X2Vycm9yKCk7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKHN2UXVlcnlDYXB0dXJlQnVmZmVyU2l6ZShzZWxmLT5vYl9zdmlkZW8sICZpbmZvLCAmYnl0ZXMpKSB7CisgICAgICAgIHJlcyA9IHN2X2Vycm9yKCk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlpZiAoISh2aWRlb2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBieXRlcykpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEodmlkZW9kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnl0ZXMpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JLyogWFhYIC0tIG5lZWQgdG8gZG8gc29tZXRoaW5nIGFib3V0IHRoZSBiaXR2ZWN0b3IgKi8KLQl7Ci0JCWNoYXIqIHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHZpZGVvZGF0YSk7Ci0JCWlmICghc3RyKQotCQkJZ290byBmaW5hbGx5OwotCQkKLQkJaWYgKHN2Q2FwdHVyZUJ1cnN0KHNlbGYtPm9iX3N2aWRlbywgJmluZm8sIHN0ciwgYml0dmVjdG9yKSkgewotCQkJcmVzID0gc3ZfZXJyb3IoKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICAvKiBYWFggLS0gbmVlZCB0byBkbyBzb21ldGhpbmcgYWJvdXQgdGhlIGJpdHZlY3RvciAqLworICAgIHsKKyAgICAgICAgY2hhciogc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcodmlkZW9kYXRhKTsKKyAgICAgICAgaWYgKCFzdHIpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoYml0dmVjdG9yKSB7Ci0JCWlmIChldmVuaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoIShldmVuaXRlbSA9IFB5SW50X0Zyb21Mb25nKDApKSkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJaWYgKG9kZGl0ZW0gPT0gTlVMTCkgewotCQkJaWYgKCEob2RkaXRlbSA9IFB5SW50X0Zyb21Mb25nKDEpKSkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJaWYgKCEoYml0dmVjb2JqID0gUHlUdXBsZV9OZXcoMiAqIGluZm8uc2l6ZSkpKQotCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoc3ZDYXB0dXJlQnVyc3Qoc2VsZi0+b2Jfc3ZpZGVvLCAmaW5mbywgc3RyLCBiaXR2ZWN0b3IpKSB7CisgICAgICAgICAgICByZXMgPSBzdl9lcnJvcigpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQogCi0JCWZvciAoaSA9IDA7IGkgPCAyICogaW5mby5zaXplOyBpKyspIHsKLQkJCWludCBzdHM7CisgICAgaWYgKGJpdHZlY3RvcikgeworICAgICAgICBpZiAoZXZlbml0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCEoZXZlbml0ZW0gPSBQeUludF9Gcm9tTG9uZygwKSkpCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGlmIChvZGRpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghKG9kZGl0ZW0gPSBQeUludF9Gcm9tTG9uZygxKSkpCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGlmICghKGJpdHZlY29iaiA9IFB5VHVwbGVfTmV3KDIgKiBpbmZvLnNpemUpKSkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJaWYgKFNWX0dFVF9GSUVMRChiaXR2ZWN0b3IsIGkpID09IFNWX0VWRU5fRklFTEQpIHsKLQkJCQlQeV9JTkNSRUYoZXZlbml0ZW0pOwotCQkJCXN0cyA9IFB5VHVwbGVfU2V0SXRlbShiaXR2ZWNvYmosIGksIGV2ZW5pdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUHlfSU5DUkVGKG9kZGl0ZW0pOwotCQkJCXN0cyA9IFB5VHVwbGVfU2V0SXRlbShiaXR2ZWNvYmosIGksIG9kZGl0ZW0pOwotCQkJfQotCQkJaWYgKHN0cyA8IDApCi0JCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfSBlbHNlIHsKLQkJYml0dmVjb2JqID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgKiBpbmZvLnNpemU7IGkrKykgeworICAgICAgICAgICAgaW50IHN0czsKIAotCXJlcyA9IFB5X0J1aWxkVmFsdWUoIigoaWlpaWkpT08pIiwgaW5mby5mb3JtYXQsCi0JCQkgICAgaW5mby53aWR0aCwgaW5mby5oZWlnaHQsCi0JCQkgICAgaW5mby5zaXplLCBpbmZvLnNhbXBsaW5ncmF0ZSwKLQkJCSAgICB2aWRlb2RhdGEsIGJpdHZlY29iaik7CisgICAgICAgICAgICBpZiAoU1ZfR0VUX0ZJRUxEKGJpdHZlY3RvciwgaSkgPT0gU1ZfRVZFTl9GSUVMRCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihldmVuaXRlbSk7CisgICAgICAgICAgICAgICAgc3RzID0gUHlUdXBsZV9TZXRJdGVtKGJpdHZlY29iaiwgaSwgZXZlbml0ZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYob2RkaXRlbSk7CisgICAgICAgICAgICAgICAgc3RzID0gUHlUdXBsZV9TZXRJdGVtKGJpdHZlY29iaiwgaSwgb2RkaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RzIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBiaXR2ZWNvYmogPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgfQorCisgICAgcmVzID0gUHlfQnVpbGRWYWx1ZSgiKChpaWlpaSlPTykiLCBpbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ud2lkdGgsIGluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5zaXplLCBpbmZvLnNhbXBsaW5ncmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvZGF0YSwgYml0dmVjb2JqKTsKIAogICBmaW5hbGx5OgotCWlmIChiaXR2ZWN0b3IpCi0JCWZyZWUoYml0dmVjdG9yKTsKKyAgICBpZiAoYml0dmVjdG9yKQorICAgICAgICBmcmVlKGJpdHZlY3Rvcik7CiAKLQlQeV9YREVDUkVGKHZpZGVvZGF0YSk7Ci0JUHlfWERFQ1JFRihiaXR2ZWNvYmopOwotCXJldHVybiByZXM7CisgICAgUHlfWERFQ1JFRih2aWRlb2RhdGEpOworICAgIFB5X1hERUNSRUYoYml0dmVjb2JqKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfQ2FwdHVyZU9uZUZyYW1lKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdkNhcHR1cmVJbmZvIGluZm87Ci0JaW50IGZvcm1hdCwgd2lkdGgsIGhlaWdodDsKLQlpbnQgYnl0ZXM7Ci0JUHlPYmplY3QgKnZpZGVvZGF0YSA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JY2hhciAqc3RyOwotCQotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWkpIiwgJmZvcm1hdCwgJndpZHRoLCAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgc3ZDYXB0dXJlSW5mbyBpbmZvOworICAgIGludCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGJ5dGVzOworICAgIFB5T2JqZWN0ICp2aWRlb2RhdGEgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGNoYXIgKnN0cjsKIAotCWluZm8uZm9ybWF0ID0gZm9ybWF0OwotCWluZm8ud2lkdGggPSB3aWR0aDsKLQlpbmZvLmhlaWdodCA9IGhlaWdodDsKLQlpbmZvLnNpemUgPSAwOwotCWluZm8uc2FtcGxpbmdyYXRlID0gMDsKLQlpZiAoc3ZRdWVyeUNhcHR1cmVCdWZmZXJTaXplKHNlbGYtPm9iX3N2aWRlbywgJmluZm8sICZieXRlcykpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWkpIiwgJmZvcm1hdCwgJndpZHRoLCAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoISh2aWRlb2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBieXRlcykpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyh2aWRlb2RhdGEpOwotCWlmICghc3RyKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaW5mby5mb3JtYXQgPSBmb3JtYXQ7CisgICAgaW5mby53aWR0aCA9IHdpZHRoOworICAgIGluZm8uaGVpZ2h0ID0gaGVpZ2h0OworICAgIGluZm8uc2l6ZSA9IDA7CisgICAgaW5mby5zYW1wbGluZ3JhdGUgPSAwOworICAgIGlmIChzdlF1ZXJ5Q2FwdHVyZUJ1ZmZlclNpemUoc2VsZi0+b2Jfc3ZpZGVvLCAmaW5mbywgJmJ5dGVzKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlpZiAoc3ZDYXB0dXJlT25lRnJhbWUoc2VsZi0+b2Jfc3ZpZGVvLCBmb3JtYXQsICZ3aWR0aCwgJmhlaWdodCwgc3RyKSkgewotCQlyZXMgPSBzdl9lcnJvcigpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmICghKHZpZGVvZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ5dGVzKSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzID0gUHlfQnVpbGRWYWx1ZSgiKGlpTykiLCB3aWR0aCwgaGVpZ2h0LCB2aWRlb2RhdGEpOworICAgIHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHZpZGVvZGF0YSk7CisgICAgaWYgKCFzdHIpCisgICAgICAgIGdvdG8gZmluYWxseTsKKworICAgIGlmIChzdkNhcHR1cmVPbmVGcmFtZShzZWxmLT5vYl9zdmlkZW8sIGZvcm1hdCwgJndpZHRoLCAmaGVpZ2h0LCBzdHIpKSB7CisgICAgICAgIHJlcyA9IHN2X2Vycm9yKCk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisKKyAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCIoaWlPKSIsIHdpZHRoLCBoZWlnaHQsIHZpZGVvZGF0YSk7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHZpZGVvZGF0YSk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9YREVDUkVGKHZpZGVvZGF0YSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X0luaXRDb250aW51b3VzQ2FwdHVyZShzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3ZDYXB0dXJlSW5mbyBpbmZvOworICAgIHN2Q2FwdHVyZUluZm8gaW5mbzsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWlpaSkiLCAmaW5mby5mb3JtYXQsCi0JCQkgJmluZm8ud2lkdGgsICZpbmZvLmhlaWdodCwKLQkJCSAmaW5mby5zaXplLCAmaW5mby5zYW1wbGluZ3JhdGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlpaWkpIiwgJmluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgJmluZm8ud2lkdGgsICZpbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICZpbmZvLnNpemUsICZpbmZvLnNhbXBsaW5ncmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2SW5pdENvbnRpbnVvdXNDYXB0dXJlKHNlbGYtPm9iX3N2aWRlbywgJmluZm8pKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZJbml0Q29udGludW91c0NhcHR1cmUoc2VsZi0+b2Jfc3ZpZGVvLCAmaW5mbykpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0Jc2VsZi0+b2JfaW5mbyA9IGluZm87CisgICAgc2VsZi0+b2JfaW5mbyA9IGluZm87CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpaWlpKSIsIGluZm8uZm9ybWF0LCBpbmZvLndpZHRoLCBpbmZvLmhlaWdodCwKLQkJCSAgICAgaW5mby5zaXplLCBpbmZvLnNhbXBsaW5ncmF0ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaWlpaSkiLCBpbmZvLmZvcm1hdCwgaW5mby53aWR0aCwgaW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5zaXplLCBpbmZvLnNhbXBsaW5ncmF0ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9Mb2FkTWFwKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmdiOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCXJnYl90dXBsZSAqbWFwcCA9IE5VTEw7Ci0JaW50IG1hcHR5cGU7Ci0JaW50IGksIGo7CQkJICAgICAvKiBpbmRpY2VzICovCisgICAgUHlPYmplY3QgKnJnYjsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICByZ2JfdHVwbGUgKm1hcHAgPSBOVUxMOworICAgIGludCBtYXB0eXBlOworICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kaWNlcyAqLwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlPKSIsICZtYXB0eXBlLCAmcmdiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlPKSIsICZtYXB0eXBlLCAmcmdiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhyZ2IpIHx8IFB5TGlzdF9TaXplKHJnYikgIT0gMjU2KSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5TGlzdF9DaGVjayhyZ2IpIHx8IFB5TGlzdF9TaXplKHJnYikgIT0gMjU2KSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICghKG1hcHAgPSBQeU1lbV9ORVcocmdiX3R1cGxlLCAyNTYpKSkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCEobWFwcCA9IFB5TWVtX05FVyhyZ2JfdHVwbGUsIDI1NikpKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQlQeU9iamVjdCogdiA9IFB5TGlzdF9HZXRJdGVtKHJnYiwgaSk7Ci0JCWlmICghdikKLQkJCWdvdG8gZmluYWxseTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QqIHYgPSBQeUxpc3RfR2V0SXRlbShyZ2IsIGkpOworICAgICAgICBpZiAoIXYpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKHYpIHx8IFB5VHVwbGVfU2l6ZSh2KSAhPSAzKSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKLQkJCVB5T2JqZWN0KiBjZWxsID0gUHlUdXBsZV9HZXRJdGVtKHYsIGopOwotCQkJaWYgKCFjZWxsKQotCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHYpIHx8IFB5VHVwbGVfU2l6ZSh2KSAhPSAzKSB7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0KiBjZWxsID0gUHlUdXBsZV9HZXRJdGVtKHYsIGopOworICAgICAgICAgICAgaWYgKCFjZWxsKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQkJaWYgKCFQeUludF9DaGVjayhjZWxsKSkgewotCQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQotCQkJc3dpdGNoIChqKSB7Ci0JCQljYXNlIDA6IG1hcHBbaV0ucmVkID0gUHlJbnRfQXNMb25nKGNlbGwpOyBicmVhazsKLQkJCWNhc2UgMTogbWFwcFtpXS5ibHVlID0gUHlJbnRfQXNMb25nKGNlbGwpOyBicmVhazsKLQkJCWNhc2UgMjogbWFwcFtpXS5ncmVlbiA9IFB5SW50X0FzTG9uZyhjZWxsKTsgYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9CisgICAgICAgICAgICBpZiAoIVB5SW50X0NoZWNrKGNlbGwpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGopIHsKKyAgICAgICAgICAgIGNhc2UgMDogbWFwcFtpXS5yZWQgPSBQeUludF9Bc0xvbmcoY2VsbCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiBtYXBwW2ldLmJsdWUgPSBQeUludF9Bc0xvbmcoY2VsbCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBtYXBwW2ldLmdyZWVuID0gUHlJbnRfQXNMb25nKGNlbGwpOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChzdkxvYWRNYXAoc2VsZi0+b2Jfc3ZpZGVvLCBtYXB0eXBlLCBtYXBwKSkgewotCQlyZXMgPSBzdl9lcnJvcigpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmIChzdkxvYWRNYXAoc2VsZi0+b2Jfc3ZpZGVvLCBtYXB0eXBlLCBtYXBwKSkgeworICAgICAgICByZXMgPSBzdl9lcnJvcigpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJlcyA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJlcyA9IFB5X05vbmU7CiAKICAgZmluYWxseToKLQlQeU1lbV9ERUwobWFwcCk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeU1lbV9ERUwobWFwcCk7CisgICAgcmV0dXJuIHJlczsKIH0KLQkJCisKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9DbG9zZVZpZGVvKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2Q2xvc2VWaWRlbyhzZWxmLT5vYl9zdmlkZW8pKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZDbG9zZVZpZGVvKHNlbGYtPm9iX3N2aWRlbykpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0Jc2VsZi0+b2Jfc3ZpZGVvID0gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2VsZi0+b2Jfc3ZpZGVvID0gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb1BhcmFtcyhzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsCiAgICAgICAgICBpbnQgKCpmdW5jKShTVl9ub2RlUCwgbG9uZyAqLCBpbnQpLCBpbnQgbW9kaWZpZWQpCiB7Ci0JUHlPYmplY3QgKmxpc3Q7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JbG9uZyAqUFZidWZmZXIgPSBOVUxMOwotCWxvbmcgbGVuZ3RoOwotCWludCBpOwotCQotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIk8iLCAmbGlzdCkpCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICpsaXN0OworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGxvbmcgKlBWYnVmZmVyID0gTlVMTDsKKyAgICBsb25nIGxlbmd0aDsKKyAgICBpbnQgaTsKIAotCWlmICghUHlMaXN0X0NoZWNrKGxpc3QpKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJPIiwgJmxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgobGVuZ3RoID0gUHlMaXN0X1NpemUobGlzdCkpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sobGlzdCkpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUFZidWZmZXIgPSBQeU1lbV9ORVcobG9uZywgbGVuZ3RoKTsKLQlpZiAoUFZidWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKChsZW5ndGggPSBQeUxpc3RfU2l6ZShsaXN0KSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOwotCQlpZiAoIXYpCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgUFZidWZmZXIgPSBQeU1lbV9ORVcobG9uZywgbGVuZ3RoKTsKKyAgICBpZiAoUFZidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQkJaWYgKCFQeUludF9DaGVjayh2KSkgewotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlQVmJ1ZmZlcltpXSA9IFB5SW50X0FzTG9uZyh2KTsKLQkJLyogY2FuJ3QganVzdCB0ZXN0IHRoZSByZXR1cm4gdmFsdWUsIGJlY2F1c2Ugd2hhdCBpZiB0aGUKLQkJICAgdmFsdWUgd2FzIC0xPyEKLQkJKi8KLQkJaWYgKFBWYnVmZmVyW2ldID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOworICAgICAgICBpZiAoIXYpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoKCpmdW5jKShzZWxmLT5vYl9zdmlkZW8sIFBWYnVmZmVyLCBsZW5ndGgpKSB7Ci0JCXJlcyA9IHN2X2Vycm9yKCk7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgICAgIGlmICghUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgUFZidWZmZXJbaV0gPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgIC8qIGNhbid0IGp1c3QgdGVzdCB0aGUgcmV0dXJuIHZhbHVlLCBiZWNhdXNlIHdoYXQgaWYgdGhlCisgICAgICAgICAgIHZhbHVlIHdhcyAtMT8hCisgICAgICAgICovCisgICAgICAgIGlmIChQVmJ1ZmZlcltpXSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmIChtb2RpZmllZCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVB5T2JqZWN0KiB2ID0gUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pOwotCQkJaWYgKCF2IHx8IFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIHYpIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9CisgICAgaWYgKCgqZnVuYykoc2VsZi0+b2Jfc3ZpZGVvLCBQVmJ1ZmZlciwgbGVuZ3RoKSkgeworICAgICAgICByZXMgPSBzdl9lcnJvcigpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJlcyA9IFB5X05vbmU7CisgICAgaWYgKG1vZGlmaWVkKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QqIHYgPSBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSk7CisgICAgICAgICAgICBpZiAoIXYgfHwgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgdikgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXMgPSBQeV9Ob25lOwogCiAgIGZpbmFsbHk6Ci0JUHlNZW1fREVMKFBWYnVmZmVyKTsKLQlyZXR1cm4gcmVzOworICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X0dldFBhcmFtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9QYXJhbXMoc2VsZiwgYXJncywgc3ZHZXRQYXJhbSwgMSk7CisgICAgcmV0dXJuIGRvUGFyYW1zKHNlbGYsIGFyZ3MsIHN2R2V0UGFyYW0sIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfR2V0UGFyYW1SYW5nZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvUGFyYW1zKHNlbGYsIGFyZ3MsIHN2R2V0UGFyYW1SYW5nZSwgMSk7CisgICAgcmV0dXJuIGRvUGFyYW1zKHNlbGYsIGFyZ3MsIHN2R2V0UGFyYW1SYW5nZSwgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9TZXRQYXJhbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvUGFyYW1zKHNlbGYsIGFyZ3MsIHN2U2V0UGFyYW0sIDApOworICAgIHJldHVybiBkb1BhcmFtcyhzZWxmLCBhcmdzLCBzdlNldFBhcmFtLCAwKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHN2aWRlb19tZXRob2RzW10gPSB7Ci0JeyJCaW5kR0xXaW5kb3ciLAkoUHlDRnVuY3Rpb24pc3ZfQmluZEdMV2luZG93LCBNRVRIX09MREFSR1N9LAotCXsiRW5kQ29udGludW91c0NhcHR1cmUiLChQeUNGdW5jdGlvbilzdl9FbmRDb250aW51b3VzQ2FwdHVyZSwgTUVUSF9PTERBUkdTfSwKLQl7IklzVmlkZW9EaXNwbGF5ZWQiLAkoUHlDRnVuY3Rpb24pc3ZfSXNWaWRlb0Rpc3BsYXllZCwgTUVUSF9PTERBUkdTfSwKLQl7Ik91dHB1dE9mZnNldCIsCShQeUNGdW5jdGlvbilzdl9PdXRwdXRPZmZzZXQsIE1FVEhfT0xEQVJHU30sCi0JeyJQdXRGcmFtZSIsCQkoUHlDRnVuY3Rpb24pc3ZfUHV0RnJhbWUsIE1FVEhfT0xEQVJHU30sCi0JeyJRdWVyeVNpemUiLAkJKFB5Q0Z1bmN0aW9uKXN2X1F1ZXJ5U2l6ZSwgTUVUSF9PTERBUkdTfSwKLQl7IlNldFNpemUiLAkJKFB5Q0Z1bmN0aW9uKXN2X1NldFNpemUsIE1FVEhfT0xEQVJHU30sCi0JeyJTZXRTdGREZWZhdWx0cyIsCShQeUNGdW5jdGlvbilzdl9TZXRTdGREZWZhdWx0cywgTUVUSF9PTERBUkdTfSwKLQl7IlVzZUV4Y2x1c2l2ZSIsCShQeUNGdW5jdGlvbilzdl9Vc2VFeGNsdXNpdmUsIE1FVEhfT0xEQVJHU30sCi0JeyJXaW5kb3dPZmZzZXQiLAkoUHlDRnVuY3Rpb24pc3ZfV2luZG93T2Zmc2V0LCBNRVRIX09MREFSR1N9LAotCXsiSW5pdENvbnRpbnVvdXNDYXB0dXJlIiwoUHlDRnVuY3Rpb24pc3ZfSW5pdENvbnRpbnVvdXNDYXB0dXJlLCBNRVRIX09MREFSR1N9LAotCXsiQ2FwdHVyZUJ1cnN0IiwJKFB5Q0Z1bmN0aW9uKXN2X0NhcHR1cmVCdXJzdCwgTUVUSF9PTERBUkdTfSwKLQl7IkNhcHR1cmVPbmVGcmFtZSIsCShQeUNGdW5jdGlvbilzdl9DYXB0dXJlT25lRnJhbWUsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRDYXB0dXJlRGF0YSIsCShQeUNGdW5jdGlvbilzdl9HZXRDYXB0dXJlRGF0YSwgTUVUSF9PTERBUkdTfSwKLQl7IkNsb3NlVmlkZW8iLAkJKFB5Q0Z1bmN0aW9uKXN2X0Nsb3NlVmlkZW8sIE1FVEhfT0xEQVJHU30sCi0JeyJMb2FkTWFwIiwJCShQeUNGdW5jdGlvbilzdl9Mb2FkTWFwLCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW0iLAkJKFB5Q0Z1bmN0aW9uKXN2X0dldFBhcmFtLCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW1SYW5nZSIsCShQeUNGdW5jdGlvbilzdl9HZXRQYXJhbVJhbmdlLCBNRVRIX09MREFSR1N9LAotCXsiU2V0UGFyYW0iLAkJKFB5Q0Z1bmN0aW9uKXN2X1NldFBhcmFtLCBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCU5VTEx9IAkJLyogc2VudGluZWwgKi8KKyAgICB7IkJpbmRHTFdpbmRvdyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0JpbmRHTFdpbmRvdywgTUVUSF9PTERBUkdTfSwKKyAgICB7IkVuZENvbnRpbnVvdXNDYXB0dXJlIiwoUHlDRnVuY3Rpb24pc3ZfRW5kQ29udGludW91c0NhcHR1cmUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJJc1ZpZGVvRGlzcGxheWVkIiwgICAgICAgIChQeUNGdW5jdGlvbilzdl9Jc1ZpZGVvRGlzcGxheWVkLCBNRVRIX09MREFSR1N9LAorICAgIHsiT3V0cHV0T2Zmc2V0IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfT3V0cHV0T2Zmc2V0LCBNRVRIX09MREFSR1N9LAorICAgIHsiUHV0RnJhbWUiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfUHV0RnJhbWUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJRdWVyeVNpemUiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9RdWVyeVNpemUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJTZXRTaXplIiwgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9TZXRTaXplLCBNRVRIX09MREFSR1N9LAorICAgIHsiU2V0U3RkRGVmYXVsdHMiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfU2V0U3RkRGVmYXVsdHMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJVc2VFeGNsdXNpdmUiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9Vc2VFeGNsdXNpdmUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJXaW5kb3dPZmZzZXQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9XaW5kb3dPZmZzZXQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJJbml0Q29udGludW91c0NhcHR1cmUiLChQeUNGdW5jdGlvbilzdl9Jbml0Q29udGludW91c0NhcHR1cmUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJDYXB0dXJlQnVyc3QiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9DYXB0dXJlQnVyc3QsIE1FVEhfT0xEQVJHU30sCisgICAgeyJDYXB0dXJlT25lRnJhbWUiLCAgICAgICAgIChQeUNGdW5jdGlvbilzdl9DYXB0dXJlT25lRnJhbWUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRDYXB0dXJlRGF0YSIsICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9HZXRDYXB0dXJlRGF0YSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkNsb3NlVmlkZW8iLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0Nsb3NlVmlkZW8sIE1FVEhfT0xEQVJHU30sCisgICAgeyJMb2FkTWFwIiwgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9Mb2FkTWFwLCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0UGFyYW0iLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfR2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRQYXJhbVJhbmdlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9HZXRQYXJhbVJhbmdlLCBNRVRIX09MREFSR1N9LAorICAgIHsiU2V0UGFyYW0iLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfU2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X2NvbnZlcnNpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICgqZnVuY3Rpb24pKCksCiAgICAgICAgICAgICAgIGludCBpbnB1dGZhY3RvciwgZmxvYXQgZmFjdG9yKQogewotCWludCBpbnZlcnQsIHdpZHRoLCBoZWlnaHQsIGlucHV0bGVuZ3RoOwotCWNoYXIgKmlucHV0LCAqc3RyOwotCVB5T2JqZWN0ICpvdXRwdXQ7CisgICAgaW50IGludmVydCwgd2lkdGgsIGhlaWdodCwgaW5wdXRsZW5ndGg7CisgICAgY2hhciAqaW5wdXQsICpzdHI7CisgICAgUHlPYmplY3QgKm91dHB1dDsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcyNpaSkiLCAmaW52ZXJ0LAotCQkJICZpbnB1dCwgJmlucHV0bGVuZ3RoLCAmd2lkdGgsICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaXMjaWkpIiwgJmludmVydCwKKyAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwgJmlucHV0bGVuZ3RoLCAmd2lkdGgsICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICh3aWR0aCAqIGhlaWdodCAqIGlucHV0ZmFjdG9yID4gaW5wdXRsZW5ndGgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJpbnB1dCBidWZmZXIgbm90IGxvbmcgZW5vdWdoIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAod2lkdGggKiBoZWlnaHQgKiBpbnB1dGZhY3RvciA+IGlucHV0bGVuZ3RoKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiaW5wdXQgYnVmZmVyIG5vdCBsb25nIGVub3VnaCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoIShvdXRwdXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLAotCQkJCQkgICAgICAoaW50KSh3aWR0aCAqIGhlaWdodCAqIGZhY3RvcikpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEob3V0cHV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHdpZHRoICogaGVpZ2h0ICogZmFjdG9yKSkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG91dHB1dCk7Ci0JaWYgKCFzdHIpIHsKLQkJUHlfREVDUkVGKG91dHB1dCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkoKmZ1bmN0aW9uKShpbnZlcnQsIGlucHV0LCBzdHIsIHdpZHRoLCBoZWlnaHQpOworICAgIHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG91dHB1dCk7CisgICAgaWYgKCFzdHIpIHsKKyAgICAgICAgUHlfREVDUkVGKG91dHB1dCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAoKmZ1bmN0aW9uKShpbnZlcnQsIGlucHV0LCBzdHIsIHdpZHRoLCBoZWlnaHQpOwogCi0JcmV0dXJuIG91dHB1dDsKKyAgICByZXR1cm4gb3V0cHV0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfSW50ZXJsZWF2ZUZpZWxkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHN2X2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZJbnRlcmxlYXZlRmllbGRzLCAxLCAxLjApOworICAgIHJldHVybiBzdl9jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHN2SW50ZXJsZWF2ZUZpZWxkcywgMSwgMS4wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X1JHQjh0b1JHQjMyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc3ZfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdlJHQjh0b1JHQjMyLCAxLCAoZmxvYXQpIHNpemVvZihsb25nKSk7CisgICAgcmV0dXJuIHN2X2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZSR0I4dG9SR0IzMiwgMSwgKGZsb2F0KSBzaXplb2YobG9uZykpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfWVVWdG9SR0IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzdl9jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHN2WVVWdG9SR0IsIDIsIChmbG9hdCkgc2l6ZW9mKGxvbmcpKTsKKyAgICByZXR1cm4gc3ZfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdllVVnRvUkdCLCAyLCAoZmxvYXQpIHNpemVvZihsb25nKSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBzdmlkZW9fZGVhbGxvYyhzdm9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2Jfc3ZpZGVvICE9IE5VTEwpCi0JCSh2b2lkKSBzdkNsb3NlVmlkZW8oc2VsZi0+b2Jfc3ZpZGVvKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX3N2aWRlbyAhPSBOVUxMKQorICAgICAgICAodm9pZCkgc3ZDbG9zZVZpZGVvKHNlbGYtPm9iX3N2aWRlbyk7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZpZGVvX2dldGF0dHIoc3ZvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc3ZpZGVvX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKHN2aWRlb19tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogUHlUeXBlT2JqZWN0IFN2dHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJLypvYl9zaXplKi8KLQkic3Yuc3YiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2Yoc3ZvYmplY3QpLAkvKnRwX3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXN2aWRlb19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKXN2aWRlb19nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgInN2LnN2IiwgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKHN2b2JqZWN0KSwgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilzdmlkZW9fZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKXN2aWRlb19nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld3N2b2JqZWN0KFNWX25vZGVQIHN2cCkKIHsKLQlzdm9iamVjdCAqcDsKKyAgICBzdm9iamVjdCAqcDsKIAotCXAgPSBQeU9iamVjdF9OZXcoc3ZvYmplY3QsICZTdnR5cGUpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXAtPm9iX3N2aWRlbyA9IHN2cDsKLQlwLT5vYl9pbmZvLmZvcm1hdCA9IDA7Ci0JcC0+b2JfaW5mby5zaXplID0gMDsKLQlwLT5vYl9pbmZvLndpZHRoID0gMDsKLQlwLT5vYl9pbmZvLmhlaWdodCA9IDA7Ci0JcC0+b2JfaW5mby5zYW1wbGluZ3JhdGUgPSAwOwotCXJldHVybiAoUHlPYmplY3QgKikgcDsKKyAgICBwID0gUHlPYmplY3RfTmV3KHN2b2JqZWN0LCAmU3Z0eXBlKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT5vYl9zdmlkZW8gPSBzdnA7CisgICAgcC0+b2JfaW5mby5mb3JtYXQgPSAwOworICAgIHAtPm9iX2luZm8uc2l6ZSA9IDA7CisgICAgcC0+b2JfaW5mby53aWR0aCA9IDA7CisgICAgcC0+b2JfaW5mby5oZWlnaHQgPSAwOworICAgIHAtPm9iX2luZm8uc2FtcGxpbmdyYXRlID0gMDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9PcGVuVmlkZW8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVNWX25vZGVQIHN2cDsKKyAgICBTVl9ub2RlUCBzdnA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3ZwID0gc3ZPcGVuVmlkZW8oKTsKLQlpZiAoc3ZwID09IE5VTEwpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIHN2cCA9IHN2T3BlblZpZGVvKCk7CisgICAgaWYgKHN2cCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCXJldHVybiBuZXdzdm9iamVjdChzdnApOworICAgIHJldHVybiBuZXdzdm9iamVjdChzdnApOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc3ZfbWV0aG9kc1tdID0gewotCXsiSW50ZXJsZWF2ZUZpZWxkcyIsCShQeUNGdW5jdGlvbilzdl9JbnRlcmxlYXZlRmllbGRzLCBNRVRIX09MREFSR1N9LAotCXsiUkdCOHRvUkdCMzIiLAkJKFB5Q0Z1bmN0aW9uKXN2X1JHQjh0b1JHQjMyLCBNRVRIX09MREFSR1N9LAotCXsiWVVWdG9SR0IiLAkJKFB5Q0Z1bmN0aW9uKXN2X1lVVnRvUkdCLCBNRVRIX09MREFSR1N9LAotCXsiT3BlblZpZGVvIiwJCShQeUNGdW5jdGlvbilzdl9PcGVuVmlkZW8sIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7IkludGVybGVhdmVGaWVsZHMiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0ludGVybGVhdmVGaWVsZHMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJSR0I4dG9SR0IzMiIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9SR0I4dG9SR0IzMiwgTUVUSF9PTERBUkdTfSwKKyAgICB7IllVVnRvUkdCIiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X1lVVnRvUkdCLCBNRVRIX09MREFSR1N9LAorICAgIHsiT3BlblZpZGVvIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfT3BlblZpZGVvLCBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgIC8qIFNlbnRpbmVsICovCiB9OwogCiB2b2lkCiBpbml0c3Yodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgc3YgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgotCSAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKLQkgICAgcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJzdiIsIHN2X21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSBzdiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlTdkVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzdi5lcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChTdkVycm9yID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgU3ZFcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJzdiIsIHN2X21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKworICAgIFN2RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInN2LmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKFN2RXJyb3IgPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBTdkVycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3N5bXRhYmxlbW9kdWxlLmMgYi9Nb2R1bGVzL3N5bXRhYmxlbW9kdWxlLmMKaW5kZXggMTNhZTMzNy4uNjBmOWJhOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3ltdGFibGVtb2R1bGUuYwpAQCAtOCw3NiArOCw3NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5bXRhYmxlX3N5bXRhYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJ1Y3Qgc3ltdGFibGUgKnN0OwotCVB5T2JqZWN0ICp0OworICAgIHN0cnVjdCBzeW10YWJsZSAqc3Q7CisgICAgUHlPYmplY3QgKnQ7CiAKLQljaGFyICpzdHI7Ci0JY2hhciAqZmlsZW5hbWU7Ci0JY2hhciAqc3RhcnRzdHI7Ci0JaW50IHN0YXJ0OworICAgIGNoYXIgKnN0cjsKKyAgICBjaGFyICpmaWxlbmFtZTsKKyAgICBjaGFyICpzdGFydHN0cjsKKyAgICBpbnQgc3RhcnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzczpzeW10YWJsZSIsICZzdHIsICZmaWxlbmFtZSwgCi0JCQkgICAgICAmc3RhcnRzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc3RyY21wKHN0YXJ0c3RyLCAiZXhlYyIpID09IDApCi0JCXN0YXJ0ID0gUHlfZmlsZV9pbnB1dDsKLQllbHNlIGlmIChzdHJjbXAoc3RhcnRzdHIsICJldmFsIikgPT0gMCkKLQkJc3RhcnQgPSBQeV9ldmFsX2lucHV0OwotCWVsc2UgaWYgKHN0cmNtcChzdGFydHN0ciwgInNpbmdsZSIpID09IDApCi0JCXN0YXJ0ID0gUHlfc2luZ2xlX2lucHV0OwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJICAgInN5bXRhYmxlKCkgYXJnIDMgbXVzdCBiZSAnZXhlYycgb3IgJ2V2YWwnIG9yICdzaW5nbGUnIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzdCA9IFB5X1N5bXRhYmxlU3RyaW5nKHN0ciwgZmlsZW5hbWUsIHN0YXJ0KTsKLQlpZiAoc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdCA9IHN0LT5zdF9zeW1ib2xzOwotCVB5X0lOQ1JFRih0KTsKLQlQeU1lbV9GcmVlKCh2b2lkICopc3QtPnN0X2Z1dHVyZSk7Ci0JUHlTeW10YWJsZV9GcmVlKHN0KTsKLQlyZXR1cm4gdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzczpzeW10YWJsZSIsICZzdHIsICZmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0c3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHN0cmNtcChzdGFydHN0ciwgImV4ZWMiKSA9PSAwKQorICAgICAgICBzdGFydCA9IFB5X2ZpbGVfaW5wdXQ7CisgICAgZWxzZSBpZiAoc3RyY21wKHN0YXJ0c3RyLCAiZXZhbCIpID09IDApCisgICAgICAgIHN0YXJ0ID0gUHlfZXZhbF9pbnB1dDsKKyAgICBlbHNlIGlmIChzdHJjbXAoc3RhcnRzdHIsICJzaW5nbGUiKSA9PSAwKQorICAgICAgICBzdGFydCA9IFB5X3NpbmdsZV9pbnB1dDsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICJzeW10YWJsZSgpIGFyZyAzIG11c3QgYmUgJ2V4ZWMnIG9yICdldmFsJyBvciAnc2luZ2xlJyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3QgPSBQeV9TeW10YWJsZVN0cmluZyhzdHIsIGZpbGVuYW1lLCBzdGFydCk7CisgICAgaWYgKHN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHQgPSBzdC0+c3Rfc3ltYm9sczsKKyAgICBQeV9JTkNSRUYodCk7CisgICAgUHlNZW1fRnJlZSgodm9pZCAqKXN0LT5zdF9mdXR1cmUpOworICAgIFB5U3ltdGFibGVfRnJlZShzdCk7CisgICAgcmV0dXJuIHQ7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzeW10YWJsZV9tZXRob2RzW10gPSB7Ci0JeyJzeW10YWJsZSIsCXN5bXRhYmxlX3N5bXRhYmxlLAlNRVRIX1ZBUkFSR1MsCi0JIFB5RG9jX1NUUigiUmV0dXJuIHN5bWJvbCBhbmQgc2NvcGUgZGljdGlvbmFyaWVzIgotCSAJICAgIiB1c2VkIGludGVybmFsbHkgYnkgY29tcGlsZXIuIil9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzeW10YWJsZSIsICAgICAgICBzeW10YWJsZV9zeW10YWJsZSwgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHN5bWJvbCBhbmQgc2NvcGUgZGljdGlvbmFyaWVzIgorICAgICAgICAgICAgICAgIiB1c2VkIGludGVybmFsbHkgYnkgY29tcGlsZXIuIil9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdF9zeW10YWJsZSh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9zeW10YWJsZSIsIHN5bXRhYmxlX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVVNFIiwgVVNFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0dMT0JBTCIsIERFRl9HTE9CQUwpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfTE9DQUwiLCBERUZfTE9DQUwpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfUEFSQU0iLCBERUZfUEFSQU0pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfRlJFRSIsIERFRl9GUkVFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0ZSRUVfQ0xBU1MiLCBERUZfRlJFRV9DTEFTUyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9JTVBPUlQiLCBERUZfSU1QT1JUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0JPVU5EIiwgREVGX0JPVU5EKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX3N5bXRhYmxlIiwgc3ltdGFibGVfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJVU0UiLCBVU0UpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfR0xPQkFMIiwgREVGX0dMT0JBTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9MT0NBTCIsIERFRl9MT0NBTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9QQVJBTSIsIERFRl9QQVJBTSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9GUkVFIiwgREVGX0ZSRUUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfRlJFRV9DTEFTUyIsIERFRl9GUkVFX0NMQVNTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0lNUE9SVCIsIERFRl9JTVBPUlQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfQk9VTkQiLCBERUZfQk9VTkQpOwogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRZUEVfRlVOQ1RJT04iLCBGdW5jdGlvbkJsb2NrKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVFlQRV9DTEFTUyIsIENsYXNzQmxvY2spOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUWVBFX01PRFVMRSIsIE1vZHVsZUJsb2NrKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVFlQRV9GVU5DVElPTiIsIEZ1bmN0aW9uQmxvY2spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUWVBFX0NMQVNTIiwgQ2xhc3NCbG9jayk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRZUEVfTU9EVUxFIiwgTW9kdWxlQmxvY2spOwogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk9QVF9JTVBPUlRfU1RBUiIsIE9QVF9JTVBPUlRfU1RBUik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk9QVF9FWEVDIiwgT1BUX0VYRUMpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJPUFRfQkFSRV9FWEVDIiwgT1BUX0JBUkVfRVhFQyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk9QVF9JTVBPUlRfU1RBUiIsIE9QVF9JTVBPUlRfU1RBUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk9QVF9FWEVDIiwgT1BUX0VYRUMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJPUFRfQkFSRV9FWEVDIiwgT1BUX0JBUkVfRVhFQyk7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9DQUwiLCBMT0NBTCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkdMT0JBTF9FWFBMSUNJVCIsIEdMT0JBTF9FWFBMSUNJVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkdMT0JBTF9JTVBMSUNJVCIsIEdMT0JBTF9JTVBMSUNJVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkZSRUUiLCBGUkVFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQ0VMTCIsIENFTEwpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0NBTCIsIExPQ0FMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiR0xPQkFMX0VYUExJQ0lUIiwgR0xPQkFMX0VYUExJQ0lUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiR0xPQkFMX0lNUExJQ0lUIiwgR0xPQkFMX0lNUExJQ0lUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRlJFRSIsIEZSRUUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJDRUxMIiwgQ0VMTCk7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0NPUEVfT0ZGIiwgU0NPUEVfT0ZGKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0NPUEVfTUFTSyIsIFNDT1BFX01BU0spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTQ09QRV9PRkYiLCBTQ09QRV9PRkYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTQ09QRV9NQVNLIiwgU0NPUEVfTUFTSyk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3N5c2xvZ21vZHVsZS5jIGIvTW9kdWxlcy9zeXNsb2dtb2R1bGUuYwppbmRleCA5YTQ0ZDQ0Li4zN2VhZWJjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3N5c2xvZ21vZHVsZS5jCisrKyBiL01vZHVsZXMvc3lzbG9nbW9kdWxlLmMKQEAgLTQsMjAgKzQsMjAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAogCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTGFuY2UgRWxsaW5naG91c2UKLW5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiAKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbgogb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KIAogTEFOQ0UgRUxMSU5HSE9VU0UgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi1GSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBMQU5DRSBFTExJTkdIT1VTRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCAKLUlORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyAKLUZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIAotTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gCitGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBMQU5DRSBFTExJTkdIT1VTRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLAorSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HCitGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01NSwxODQgKzU1LDE4NCBAQAogI2luY2x1ZGUgPHN5c2xvZy5oPgogCiAvKiAgb25seSBvbmUgaW5zdGFuY2UsIG9ubHkgb25lIHN5c2xvZywgc28gZ2xvYmFscyBzaG91bGQgYmUgb2sgICovCi1zdGF0aWMgUHlPYmplY3QgKlNfaWRlbnRfbyA9IE5VTEw7CQkJLyogIGlkZW50aWZpZXIsIGhlbGQgYnkgb3BlbmxvZygpICAqLworc3RhdGljIFB5T2JqZWN0ICpTX2lkZW50X28gPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAvKiAgaWRlbnRpZmllciwgaGVsZCBieSBvcGVubG9nKCkgICovCiBzdGF0aWMgY2hhciBTX2xvZ19vcGVuID0gMDsKIAogCiBzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX2dldF9hcmd2KHZvaWQpCiB7Ci0JLyogRmlndXJlIG91dCB3aGF0IHRvIHVzZSBmb3IgYXMgdGhlIHByb2dyYW0gImlkZW50IiBmb3Igb3BlbmxvZygpLgotCSAqIFRoaXMgc3dhbGxvd3MgZXhjZXB0aW9ucyBhbmQgY29udGludWVzIHJhdGhlciB0aGFuIGZhaWxpbmcgb3V0LAotCSAqIGJlY2F1c2UgdGhlIHN5c2xvZyBtb2R1bGUgY2FuIHN0aWxsIGJlIHVzZWQgYmVjYXVzZSBvcGVubG9nKDMpCi0JICogaXMgb3B0aW9uYWwuCi0JICovCisgICAgLyogRmlndXJlIG91dCB3aGF0IHRvIHVzZSBmb3IgYXMgdGhlIHByb2dyYW0gImlkZW50IiBmb3Igb3BlbmxvZygpLgorICAgICAqIFRoaXMgc3dhbGxvd3MgZXhjZXB0aW9ucyBhbmQgY29udGludWVzIHJhdGhlciB0aGFuIGZhaWxpbmcgb3V0LAorICAgICAqIGJlY2F1c2UgdGhlIHN5c2xvZyBtb2R1bGUgY2FuIHN0aWxsIGJlIHVzZWQgYmVjYXVzZSBvcGVubG9nKDMpCisgICAgICogaXMgb3B0aW9uYWwuCisgICAgICovCiAKLQlQeV9zc2l6ZV90IGFyZ3ZfbGVuOwotCVB5T2JqZWN0ICpzY3JpcHRvYmo7Ci0JY2hhciAqYXRzbGFzaDsKLQlQeU9iamVjdCAqYXJndiA9IFB5U3lzX0dldE9iamVjdCgiYXJndiIpOworICAgIFB5X3NzaXplX3QgYXJndl9sZW47CisgICAgUHlPYmplY3QgKnNjcmlwdG9iajsKKyAgICBjaGFyICphdHNsYXNoOworICAgIFB5T2JqZWN0ICphcmd2ID0gUHlTeXNfR2V0T2JqZWN0KCJhcmd2Iik7CiAKLQlpZiAoYXJndiA9PSBOVUxMKSB7Ci0JCXJldHVybihOVUxMKTsKLQl9CisgICAgaWYgKGFyZ3YgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgfQogCi0JYXJndl9sZW4gPSBQeUxpc3RfU2l6ZShhcmd2KTsKLQlpZiAoYXJndl9sZW4gPT0gLTEpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQlpZiAoYXJndl9sZW4gPT0gMCkgewotCQlyZXR1cm4oTlVMTCk7Ci0JfQorICAgIGFyZ3ZfbGVuID0gUHlMaXN0X1NpemUoYXJndik7CisgICAgaWYgKGFyZ3ZfbGVuID09IC0xKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICB9CisgICAgaWYgKGFyZ3ZfbGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KIAotCXNjcmlwdG9iaiA9IFB5TGlzdF9HZXRJdGVtKGFyZ3YsIDApOwotCWlmICghUHlTdHJpbmdfQ2hlY2soc2NyaXB0b2JqKSkgewotCQlyZXR1cm4oTlVMTCk7Ci0JfQotCWlmIChQeVN0cmluZ19HRVRfU0laRShzY3JpcHRvYmopID09IDApIHsKLQkJcmV0dXJuKE5VTEwpOwotCX0KKyAgICBzY3JpcHRvYmogPSBQeUxpc3RfR2V0SXRlbShhcmd2LCAwKTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHNjcmlwdG9iaikpIHsKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIH0KKyAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2NyaXB0b2JqKSA9PSAwKSB7CisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICB9CiAKLQlhdHNsYXNoID0gc3RycmNocihQeVN0cmluZ19Bc1N0cmluZyhzY3JpcHRvYmopLCBTRVApOwotCWlmIChhdHNsYXNoKSB7Ci0JCXJldHVybihQeVN0cmluZ19Gcm9tU3RyaW5nKGF0c2xhc2ggKyAxKSk7Ci0JfSBlbHNlIHsKLQkJUHlfSU5DUkVGKHNjcmlwdG9iaik7Ci0JCXJldHVybihzY3JpcHRvYmopOwotCX0KKyAgICBhdHNsYXNoID0gc3RycmNocihQeVN0cmluZ19Bc1N0cmluZyhzY3JpcHRvYmopLCBTRVApOworICAgIGlmIChhdHNsYXNoKSB7CisgICAgICAgIHJldHVybihQeVN0cmluZ19Gcm9tU3RyaW5nKGF0c2xhc2ggKyAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKHNjcmlwdG9iaik7CisgICAgICAgIHJldHVybihzY3JpcHRvYmopOworICAgIH0KIAotCXJldHVybihOVUxMKTsKKyAgICByZXR1cm4oTlVMTCk7CiB9CiAKIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX29wZW5sb2coUHlPYmplY3QgKiBzZWxmLCBQeU9iamVjdCAqIGFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWxvbmcgbG9nb3B0ID0gMDsKLQlsb25nIGZhY2lsaXR5ID0gTE9HX1VTRVI7Ci0JUHlPYmplY3QgKm5ld19TX2lkZW50X28gPSBOVUxMOwotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJpZGVudCIsICJsb2dvcHRpb24iLCAiZmFjaWxpdHkiLCAwfTsKKyAgICBsb25nIGxvZ29wdCA9IDA7CisgICAgbG9uZyBmYWNpbGl0eSA9IExPR19VU0VSOworICAgIFB5T2JqZWN0ICpuZXdfU19pZGVudF9vID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiaWRlbnQiLCAibG9nb3B0aW9uIiwgImZhY2lsaXR5IiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLAotCQkJICAgICAgInxTbGw6b3BlbmxvZyIsIGtleXdvcmRzLCAmbmV3X1NfaWRlbnRfbywgJmxvZ29wdCwgJmZhY2lsaXR5KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInxTbGw6b3BlbmxvZyIsIGtleXdvcmRzLCAmbmV3X1NfaWRlbnRfbywgJmxvZ29wdCwgJmZhY2lsaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobmV3X1NfaWRlbnRfbykgeyBQeV9JTkNSRUYobmV3X1NfaWRlbnRfbyk7IH0KKyAgICBpZiAobmV3X1NfaWRlbnRfbykgeyBQeV9JTkNSRUYobmV3X1NfaWRlbnRfbyk7IH0KIAotCS8qICBnZXQgc3lzLmFyZ3ZbMF0gb3IgTlVMTCBpZiB3ZSBjYW4ndCBmb3Igc29tZSByZWFzb24gICovCi0JaWYgKCFuZXdfU19pZGVudF9vKSB7Ci0JCW5ld19TX2lkZW50X28gPSBzeXNsb2dfZ2V0X2FyZ3YoKTsKLQkJfQorICAgIC8qICBnZXQgc3lzLmFyZ3ZbMF0gb3IgTlVMTCBpZiB3ZSBjYW4ndCBmb3Igc29tZSByZWFzb24gICovCisgICAgaWYgKCFuZXdfU19pZGVudF9vKSB7CisgICAgICAgIG5ld19TX2lkZW50X28gPSBzeXNsb2dfZ2V0X2FyZ3YoKTsKKyAgICAgICAgfQogCi0JUHlfWERFQ1JFRihTX2lkZW50X28pOwotCVNfaWRlbnRfbyA9IG5ld19TX2lkZW50X287CisgICAgUHlfWERFQ1JFRihTX2lkZW50X28pOworICAgIFNfaWRlbnRfbyA9IG5ld19TX2lkZW50X287CiAKLQkvKiBBdCB0aGlzIHBvaW50LCBTX2lkZW50X28gc2hvdWxkIGJlIElOQ1JFRigpZWQuICBvcGVubG9nKDMpIGRvZXMgbm90Ci0JICogbWFrZSBhIGNvcHksIGFuZCBzeXNsb2coMykgbGF0ZXIgdXNlcyBpdC4gIFdlIGNhbid0IGdhcmJhZ2Vjb2xsZWN0IGl0Ci0JICogSWYgTlVMTCwganVzdCBsZXQgb3BlbmxvZyBmaWd1cmUgaXQgb3V0IChwcm9iYWJseSB1c2luZyBDIGFyZ3ZbMF0pLgotCSAqLworICAgIC8qIEF0IHRoaXMgcG9pbnQsIFNfaWRlbnRfbyBzaG91bGQgYmUgSU5DUkVGKCllZC4gIG9wZW5sb2coMykgZG9lcyBub3QKKyAgICAgKiBtYWtlIGEgY29weSwgYW5kIHN5c2xvZygzKSBsYXRlciB1c2VzIGl0LiAgV2UgY2FuJ3QgZ2FyYmFnZWNvbGxlY3QgaXQKKyAgICAgKiBJZiBOVUxMLCBqdXN0IGxldCBvcGVubG9nIGZpZ3VyZSBpdCBvdXQgKHByb2JhYmx5IHVzaW5nIEMgYXJndlswXSkuCisgICAgICovCiAKLQlvcGVubG9nKFNfaWRlbnRfbyA/IFB5U3RyaW5nX0FzU3RyaW5nKFNfaWRlbnRfbykgOiBOVUxMLCBsb2dvcHQsIGZhY2lsaXR5KTsKLQlTX2xvZ19vcGVuID0gMTsKKyAgICBvcGVubG9nKFNfaWRlbnRfbyA/IFB5U3RyaW5nX0FzU3RyaW5nKFNfaWRlbnRfbykgOiBOVUxMLCBsb2dvcHQsIGZhY2lsaXR5KTsKKyAgICBTX2xvZ19vcGVuID0gMTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX3N5c2xvZyhQeU9iamVjdCAqIHNlbGYsIFB5T2JqZWN0ICogYXJncykKIHsKLQljaGFyICptZXNzYWdlOwotCWludCAgIHByaW9yaXR5ID0gTE9HX0lORk87CisgICAgY2hhciAqbWVzc2FnZTsKKyAgICBpbnQgICBwcmlvcml0eSA9IExPR19JTkZPOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcztbcHJpb3JpdHksXSBtZXNzYWdlIHN0cmluZyIsCi0JCQkgICAgICAmcHJpb3JpdHksICZtZXNzYWdlKSkgewotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM7W3ByaW9yaXR5LF0gbWVzc2FnZSBzdHJpbmciLAotCQkJCSAgICAgICZtZXNzYWdlKSkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzO1twcmlvcml0eSxdIG1lc3NhZ2Ugc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaW9yaXR5LCAmbWVzc2FnZSkpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzO1twcmlvcml0eSxdIG1lc3NhZ2Ugc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qICBpZiBsb2cgaXMgbm90IG9wZW5lZCwgb3BlbiBpdCBub3cgICovCi0JaWYgKCFTX2xvZ19vcGVuKSB7Ci0JCVB5T2JqZWN0ICpvcGVuYXJnczsKKyAgICAvKiAgaWYgbG9nIGlzIG5vdCBvcGVuZWQsIG9wZW4gaXQgbm93ICAqLworICAgIGlmICghU19sb2dfb3BlbikgeworICAgICAgICBQeU9iamVjdCAqb3BlbmFyZ3M7CiAKLQkJLyogQ29udGludWUgZXZlbiBpZiBQeVR1cGxlX05ldyBmYWlscywgYmVjYXVzZSBvcGVubG9nKDMpIGlzIG9wdGlvbmFsLgotCQkgKiBTbywgd2UgY2FuIHN0aWxsIGRvIGxvZ2dpbiBpbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhpbmdzIGFyZSBzbyBob3NlZAotCQkgKiB0aGF0IHdlIGNhbid0IGRvIHRoaXMgdHVwbGUuCi0JCSAqLwotCQlpZiAoKG9wZW5hcmdzID0gUHlUdXBsZV9OZXcoMCkpKSB7Ci0JCQlQeU9iamVjdCAqb3BlbmxvZ19yZXQgPSBzeXNsb2dfb3BlbmxvZyhzZWxmLCBvcGVuYXJncywgTlVMTCk7Ci0JCQlQeV9YREVDUkVGKG9wZW5sb2dfcmV0KTsKLQkJCVB5X0RFQ1JFRihvcGVuYXJncyk7Ci0JCX0KLQl9CisgICAgICAgIC8qIENvbnRpbnVlIGV2ZW4gaWYgUHlUdXBsZV9OZXcgZmFpbHMsIGJlY2F1c2Ugb3BlbmxvZygzKSBpcyBvcHRpb25hbC4KKyAgICAgICAgICogU28sIHdlIGNhbiBzdGlsbCBkbyBsb2dnaW4gaW4gdGhlIHVubGlrZWx5IGV2ZW50IHRoaW5ncyBhcmUgc28gaG9zZWQKKyAgICAgICAgICogdGhhdCB3ZSBjYW4ndCBkbyB0aGlzIHR1cGxlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChvcGVuYXJncyA9IFB5VHVwbGVfTmV3KDApKSkgeworICAgICAgICAgICAgUHlPYmplY3QgKm9wZW5sb2dfcmV0ID0gc3lzbG9nX29wZW5sb2coc2VsZiwgb3BlbmFyZ3MsIE5VTEwpOworICAgICAgICAgICAgUHlfWERFQ1JFRihvcGVubG9nX3JldCk7CisgICAgICAgICAgICBQeV9ERUNSRUYob3BlbmFyZ3MpOworICAgICAgICB9CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUzsKLQlzeXNsb2cocHJpb3JpdHksICIlcyIsIG1lc3NhZ2UpOwotCVB5X0VORF9BTExPV19USFJFQURTOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTOworICAgIHN5c2xvZyhwcmlvcml0eSwgIiVzIiwgbWVzc2FnZSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFM7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKiAKK3N0YXRpYyBQeU9iamVjdCAqCiBzeXNsb2dfY2xvc2Vsb2coUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JaWYgKFNfbG9nX29wZW4pIHsKLQkJY2xvc2Vsb2coKTsKLQkJUHlfWERFQ1JFRihTX2lkZW50X28pOwotCQlTX2lkZW50X28gPSBOVUxMOwotCQlTX2xvZ19vcGVuID0gMDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChTX2xvZ19vcGVuKSB7CisgICAgICAgIGNsb3NlbG9nKCk7CisgICAgICAgIFB5X1hERUNSRUYoU19pZGVudF9vKTsKKyAgICAgICAgU19pZGVudF9vID0gTlVMTDsKKyAgICAgICAgU19sb2dfb3BlbiA9IDA7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX3NldGxvZ21hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgbWFza3ByaSwgb21hc2twcmk7CisgICAgbG9uZyBtYXNrcHJpLCBvbWFza3ByaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDttYXNrIGZvciBwcmlvcml0eSIsICZtYXNrcHJpKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb21hc2twcmkgPSBzZXRsb2dtYXNrKG1hc2twcmkpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhvbWFza3ByaSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsO21hc2sgZm9yIHByaW9yaXR5IiwgJm1hc2twcmkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvbWFza3ByaSA9IHNldGxvZ21hc2sobWFza3ByaSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9tYXNrcHJpKTsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX2xvZ19tYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIG1hc2s7Ci0JbG9uZyBwcmk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOkxPR19NQVNLIiwgJnByaSkpCi0JCXJldHVybiBOVUxMOwotCW1hc2sgPSBMT0dfTUFTSyhwcmkpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhtYXNrKTsKKyAgICBsb25nIG1hc2s7CisgICAgbG9uZyBwcmk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOkxPR19NQVNLIiwgJnByaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1hc2sgPSBMT0dfTUFTSyhwcmkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtYXNrKTsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX2xvZ191cHRvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIG1hc2s7Ci0JbG9uZyBwcmk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOkxPR19VUFRPIiwgJnByaSkpCi0JCXJldHVybiBOVUxMOwotCW1hc2sgPSBMT0dfVVBUTyhwcmkpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhtYXNrKTsKKyAgICBsb25nIG1hc2s7CisgICAgbG9uZyBwcmk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOkxPR19VUFRPIiwgJnByaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1hc2sgPSBMT0dfVVBUTyhwcmkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtYXNrKTsKIH0KIAogLyogTGlzdCBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzeXNsb2dfbWV0aG9kc1tdID0gewotCXsib3BlbmxvZyIsCShQeUNGdW5jdGlvbikgc3lzbG9nX29wZW5sb2csCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTfSwKLQl7ImNsb3NlbG9nIiwJc3lzbG9nX2Nsb3NlbG9nLAlNRVRIX05PQVJHU30sCi0JeyJzeXNsb2ciLAlzeXNsb2dfc3lzbG9nLAkJTUVUSF9WQVJBUkdTfSwKLQl7InNldGxvZ21hc2siLAlzeXNsb2dfc2V0bG9nbWFzaywJTUVUSF9WQVJBUkdTfSwKLQl7IkxPR19NQVNLIiwJc3lzbG9nX2xvZ19tYXNrLAlNRVRIX1ZBUkFSR1N9LAotCXsiTE9HX1VQVE8iLAlzeXNsb2dfbG9nX3VwdG8sCU1FVEhfVkFSQVJHU30sCi0Je05VTEwsCQlOVUxMLAkJCTB9CisgICAgeyJvcGVubG9nIiwgICAgICAgICAoUHlDRnVuY3Rpb24pIHN5c2xvZ19vcGVubG9nLCAgICAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEU30sCisgICAgeyJjbG9zZWxvZyIsICAgICAgICBzeXNsb2dfY2xvc2Vsb2csICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJzeXNsb2ciLCAgICAgICAgICBzeXNsb2dfc3lzbG9nLCAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0bG9nbWFzayIsICAgICAgc3lzbG9nX3NldGxvZ21hc2ssICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkxPR19NQVNLIiwgICAgICAgIHN5c2xvZ19sb2dfbWFzaywgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJMT0dfVVBUTyIsICAgICAgICBzeXNsb2dfbG9nX3VwdG8sICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgMH0KIH07CiAKIC8qIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlICovCkBAIC0yNDAsNjcgKzI0MCw2NyBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRzeXNsb2codm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlKCJzeXNsb2ciLCBzeXNsb2dfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJzeXNsb2ciLCBzeXNsb2dfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwogCi0JLyogUHJpb3JpdGllcyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfRU1FUkciLAkgIExPR19FTUVSRyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19BTEVSVCIsCSAgTE9HX0FMRVJUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0NSSVQiLAkgIExPR19DUklUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0VSUiIsCSAgTE9HX0VSUik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19XQVJOSU5HIiwgTE9HX1dBUk5JTkcpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTk9USUNFIiwgIExPR19OT1RJQ0UpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfSU5GTyIsCSAgTE9HX0lORk8pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfREVCVUciLAkgIExPR19ERUJVRyk7CisgICAgLyogUHJpb3JpdGllcyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfRU1FUkciLCAgICAgICBMT0dfRU1FUkcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfQUxFUlQiLCAgICAgICBMT0dfQUxFUlQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfQ1JJVCIsICAgICAgICBMT0dfQ1JJVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19FUlIiLCAgICAgICAgIExPR19FUlIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfV0FSTklORyIsIExPR19XQVJOSU5HKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX05PVElDRSIsICBMT0dfTk9USUNFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0lORk8iLCAgICAgICAgTE9HX0lORk8pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfREVCVUciLCAgICAgICBMT0dfREVCVUcpOwogCi0JLyogb3BlbmxvZygpIG9wdGlvbiBmbGFncyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfUElEIiwJICBMT0dfUElEKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0NPTlMiLAkgIExPR19DT05TKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX05ERUxBWSIsICBMT0dfTkRFTEFZKTsKKyAgICAvKiBvcGVubG9nKCkgb3B0aW9uIGZsYWdzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19QSUQiLCAgICAgICAgIExPR19QSUQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfQ09OUyIsICAgICAgICBMT0dfQ09OUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19OREVMQVkiLCAgTE9HX05ERUxBWSk7CiAjaWZkZWYgTE9HX05PV0FJVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTk9XQUlUIiwgIExPR19OT1dBSVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTk9XQUlUIiwgIExPR19OT1dBSVQpOwogI2VuZGlmCiAjaWZkZWYgTE9HX1BFUlJPUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfUEVSUk9SIiwgIExPR19QRVJST1IpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfUEVSUk9SIiwgIExPR19QRVJST1IpOwogI2VuZGlmCiAKLQkvKiBGYWNpbGl0aWVzICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19LRVJOIiwJICBMT0dfS0VSTik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19VU0VSIiwJICBMT0dfVVNFUik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19NQUlMIiwJICBMT0dfTUFJTCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19EQUVNT04iLCAgTE9HX0RBRU1PTik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19BVVRIIiwJICBMT0dfQVVUSCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19MUFIiLAkgIExPR19MUFIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUwwIiwgIExPR19MT0NBTDApOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUwxIiwgIExPR19MT0NBTDEpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUwyIiwgIExPR19MT0NBTDIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUwzIiwgIExPR19MT0NBTDMpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUw0IiwgIExPR19MT0NBTDQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUw1IiwgIExPR19MT0NBTDUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUw2IiwgIExPR19MT0NBTDYpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUw3IiwgIExPR19MT0NBTDcpOworICAgIC8qIEZhY2lsaXRpZXMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0tFUk4iLCAgICAgICAgTE9HX0tFUk4pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfVVNFUiIsICAgICAgICBMT0dfVVNFUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19NQUlMIiwgICAgICAgIExPR19NQUlMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0RBRU1PTiIsICBMT0dfREFFTU9OKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0FVVEgiLCAgICAgICAgTE9HX0FVVEgpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTFBSIiwgICAgICAgICBMT0dfTFBSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMCIsICBMT0dfTE9DQUwwKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMSIsICBMT0dfTE9DQUwxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMiIsICBMT0dfTE9DQUwyKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMyIsICBMT0dfTE9DQUwzKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNCIsICBMT0dfTE9DQUw0KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNSIsICBMT0dfTE9DQUw1KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNiIsICBMT0dfTE9DQUw2KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNyIsICBMT0dfTE9DQUw3KTsKIAogI2lmbmRlZiBMT0dfU1lTTE9HCi0jZGVmaW5lIExPR19TWVNMT0cJCUxPR19EQUVNT04KKyNkZWZpbmUgTE9HX1NZU0xPRyAgICAgICAgICAgICAgTE9HX0RBRU1PTgogI2VuZGlmCiAjaWZuZGVmIExPR19ORVdTCi0jZGVmaW5lIExPR19ORVdTCQlMT0dfTUFJTAorI2RlZmluZSBMT0dfTkVXUyAgICAgICAgICAgICAgICBMT0dfTUFJTAogI2VuZGlmCiAjaWZuZGVmIExPR19VVUNQCi0jZGVmaW5lIExPR19VVUNQCQlMT0dfTUFJTAorI2RlZmluZSBMT0dfVVVDUCAgICAgICAgICAgICAgICBMT0dfTUFJTAogI2VuZGlmCiAjaWZuZGVmIExPR19DUk9OCi0jZGVmaW5lIExPR19DUk9OCQlMT0dfREFFTU9OCisjZGVmaW5lIExPR19DUk9OICAgICAgICAgICAgICAgIExPR19EQUVNT04KICNlbmRpZgogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19TWVNMT0ciLCAgTE9HX1NZU0xPRyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19DUk9OIiwJICBMT0dfQ1JPTik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19VVUNQIiwJICBMT0dfVVVDUCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19ORVdTIiwJICBMT0dfTkVXUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19TWVNMT0ciLCAgTE9HX1NZU0xPRyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19DUk9OIiwgICAgICAgIExPR19DUk9OKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX1VVQ1AiLCAgICAgICAgTE9HX1VVQ1ApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTkVXUyIsICAgICAgICBMT0dfTkVXUyk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Rlcm1pb3MuYyBiL01vZHVsZXMvdGVybWlvcy5jCmluZGV4IGUyODcyZmIuLjU3ZjMwZGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGVybWlvcy5jCisrKyBiL01vZHVsZXMvdGVybWlvcy5jCkBAIC00NCwxNCArNDQsMTQgQEAKIAogc3RhdGljIGludCBmZGNvbnYoUHlPYmplY3QqIG9iaiwgdm9pZCogcCkKIHsKLQlpbnQgZmQ7CisgICAgaW50IGZkOwogCi0JZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKG9iaik7Ci0JaWYgKGZkID49IDApIHsKLQkJKihpbnQqKXAgPSBmZDsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgIGZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihvYmopOworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgICooaW50KilwID0gZmQ7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKHRlcm1pb3NfdGNnZXRhdHRyX19kb2NfXywKQEAgLTY4LDY3ICs2OCw2NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlcm1pb3NfdGNnZXRhdHRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQ7Ci0Jc3RydWN0IHRlcm1pb3MgbW9kZTsKLQlQeU9iamVjdCAqY2M7Ci0Jc3BlZWRfdCBpc3BlZWQsIG9zcGVlZDsKLQlQeU9iamVjdCAqdjsKLQlpbnQgaTsKLQljaGFyIGNoOworICAgIGludCBmZDsKKyAgICBzdHJ1Y3QgdGVybWlvcyBtb2RlOworICAgIFB5T2JqZWN0ICpjYzsKKyAgICBzcGVlZF90IGlzcGVlZCwgb3NwZWVkOworICAgIFB5T2JqZWN0ICp2OworICAgIGludCBpOworICAgIGNoYXIgY2g7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOnRjZ2V0YXR0ciIsIAotCQkJICAgICAgZmRjb252LCAodm9pZCopJmZkKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjp0Y2dldGF0dHIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZGNvbnYsICh2b2lkKikmZmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICh0Y2dldGF0dHIoZmQsICZtb2RlKSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIGlmICh0Y2dldGF0dHIoZmQsICZtb2RlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOwogCi0JaXNwZWVkID0gY2ZnZXRpc3BlZWQoJm1vZGUpOwotCW9zcGVlZCA9IGNmZ2V0b3NwZWVkKCZtb2RlKTsKKyAgICBpc3BlZWQgPSBjZmdldGlzcGVlZCgmbW9kZSk7CisgICAgb3NwZWVkID0gY2ZnZXRvc3BlZWQoJm1vZGUpOwogCi0JY2MgPSBQeUxpc3RfTmV3KE5DQ1MpOwotCWlmIChjYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgTkNDUzsgaSsrKSB7Ci0JCWNoID0gKGNoYXIpbW9kZS5jX2NjW2ldOwotCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoJmNoLCAxKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCQlQeUxpc3RfU2V0SXRlbShjYywgaSwgdik7Ci0JfQorICAgIGNjID0gUHlMaXN0X05ldyhOQ0NTKTsKKyAgICBpZiAoY2MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IE5DQ1M7IGkrKykgeworICAgICAgICBjaCA9IChjaGFyKW1vZGUuY19jY1tpXTsKKyAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCZjaCwgMSk7CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0oY2MsIGksIHYpOworICAgIH0KIAotCS8qIENvbnZlcnQgdGhlIE1JTiBhbmQgVElNRSBzbG90cyB0byBpbnRlZ2VyLiAgT24gc29tZSBzeXN0ZW1zLCB0aGUKLQkgICBNSU4gYW5kIFRJTUUgc2xvdHMgYXJlIHRoZSBzYW1lIGFzIHRoZSBFT0YgYW5kIEVPTCBzbG90cy4gIFNvIHdlCi0JICAgb25seSBkbyB0aGlzIGluIG5vbmNhbm9uaWNhbCBpbnB1dCBtb2RlLiAgKi8KLQlpZiAoKG1vZGUuY19sZmxhZyAmIElDQU5PTikgPT0gMCkgewotCQl2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX2NjW1ZNSU5dKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCQlQeUxpc3RfU2V0SXRlbShjYywgVk1JTiwgdik7Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfY2NbVlRJTUVdKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCQlQeUxpc3RfU2V0SXRlbShjYywgVlRJTUUsIHYpOwotCX0KKyAgICAvKiBDb252ZXJ0IHRoZSBNSU4gYW5kIFRJTUUgc2xvdHMgdG8gaW50ZWdlci4gIE9uIHNvbWUgc3lzdGVtcywgdGhlCisgICAgICAgTUlOIGFuZCBUSU1FIHNsb3RzIGFyZSB0aGUgc2FtZSBhcyB0aGUgRU9GIGFuZCBFT0wgc2xvdHMuICBTbyB3ZQorICAgICAgIG9ubHkgZG8gdGhpcyBpbiBub25jYW5vbmljYWwgaW5wdXQgbW9kZS4gICovCisgICAgaWYgKChtb2RlLmNfbGZsYWcgJiBJQ0FOT04pID09IDApIHsKKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKW1vZGUuY19jY1tWTUlOXSk7CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0oY2MsIFZNSU4sIHYpOworICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX2NjW1ZUSU1FXSk7CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0oY2MsIFZUSU1FLCB2KTsKKyAgICB9CiAKLQlpZiAoISh2ID0gUHlMaXN0X05ldyg3KSkpCi0JCWdvdG8gZXJyOworICAgIGlmICghKHYgPSBQeUxpc3RfTmV3KDcpKSkKKyAgICAgICAgZ290byBlcnI7CiAKLQlQeUxpc3RfU2V0SXRlbSh2LCAwLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfaWZsYWcpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCAxLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfb2ZsYWcpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCAyLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfY2ZsYWcpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCAzLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfbGZsYWcpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCA0LCBQeUludF9Gcm9tTG9uZygobG9uZylpc3BlZWQpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCA1LCBQeUludF9Gcm9tTG9uZygobG9uZylvc3BlZWQpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCA2LCBjYyk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpewotCQlQeV9ERUNSRUYodik7Ci0JCWdvdG8gZXJyOwotCX0KLQlyZXR1cm4gdjsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCAwLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfaWZsYWcpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCAxLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfb2ZsYWcpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCAyLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfY2ZsYWcpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCAzLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfbGZsYWcpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCA0LCBQeUludF9Gcm9tTG9uZygobG9uZylpc3BlZWQpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCA1LCBQeUludF9Gcm9tTG9uZygobG9uZylvc3BlZWQpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCA2LCBjYyk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICByZXR1cm4gdjsKICAgZXJyOgotCVB5X0RFQ1JFRihjYyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGNjKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHRlcm1pb3NfdGNzZXRhdHRyX19kb2NfXywKQEAgLTE0NSw2NCArMTQ1LDY0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVybWlvc190Y3NldGF0dHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZCwgd2hlbjsKLQlzdHJ1Y3QgdGVybWlvcyBtb2RlOwotCXNwZWVkX3QgaXNwZWVkLCBvc3BlZWQ7Ci0JUHlPYmplY3QgKnRlcm0sICpjYywgKnY7Ci0JaW50IGk7CisgICAgaW50IGZkLCB3aGVuOworICAgIHN0cnVjdCB0ZXJtaW9zIG1vZGU7CisgICAgc3BlZWRfdCBpc3BlZWQsIG9zcGVlZDsKKyAgICBQeU9iamVjdCAqdGVybSwgKmNjLCAqdjsKKyAgICBpbnQgaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpTzp0Y3NldGF0dHIiLCAKLQkJCSAgICAgIGZkY29udiwgJmZkLCAmd2hlbiwgJnRlcm0pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5TGlzdF9DaGVjayh0ZXJtKSB8fCBQeUxpc3RfU2l6ZSh0ZXJtKSAhPSA3KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotCQkJICAgICAidGNzZXRhdHRyLCBhcmcgMzogbXVzdCBiZSA3IGVsZW1lbnQgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmlPOnRjc2V0YXR0ciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZkY29udiwgJmZkLCAmd2hlbiwgJnRlcm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayh0ZXJtKSB8fCBQeUxpc3RfU2l6ZSh0ZXJtKSAhPSA3KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAidGNzZXRhdHRyLCBhcmcgMzogbXVzdCBiZSA3IGVsZW1lbnQgbGlzdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBHZXQgdGhlIG9sZCBtb2RlLCBpbiBjYXNlIHRoZXJlIGFyZSBhbnkgaGlkZGVuIGZpZWxkcy4uLiAqLwotCWlmICh0Y2dldGF0dHIoZmQsICZtb2RlKSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOwotCW1vZGUuY19pZmxhZyA9ICh0Y2ZsYWdfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDApKTsKLQltb2RlLmNfb2ZsYWcgPSAodGNmbGFnX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCAxKSk7Ci0JbW9kZS5jX2NmbGFnID0gKHRjZmxhZ190KSBQeUludF9Bc0xvbmcoUHlMaXN0X0dldEl0ZW0odGVybSwgMikpOwotCW1vZGUuY19sZmxhZyA9ICh0Y2ZsYWdfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDMpKTsKLQlpc3BlZWQgPSAoc3BlZWRfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDQpKTsKLQlvc3BlZWQgPSAoc3BlZWRfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDUpKTsKLQljYyA9IFB5TGlzdF9HZXRJdGVtKHRlcm0sIDYpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBHZXQgdGhlIG9sZCBtb2RlLCBpbiBjYXNlIHRoZXJlIGFyZSBhbnkgaGlkZGVuIGZpZWxkcy4uLiAqLworICAgIGlmICh0Y2dldGF0dHIoZmQsICZtb2RlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIG1vZGUuY19pZmxhZyA9ICh0Y2ZsYWdfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDApKTsKKyAgICBtb2RlLmNfb2ZsYWcgPSAodGNmbGFnX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCAxKSk7CisgICAgbW9kZS5jX2NmbGFnID0gKHRjZmxhZ190KSBQeUludF9Bc0xvbmcoUHlMaXN0X0dldEl0ZW0odGVybSwgMikpOworICAgIG1vZGUuY19sZmxhZyA9ICh0Y2ZsYWdfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDMpKTsKKyAgICBpc3BlZWQgPSAoc3BlZWRfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDQpKTsKKyAgICBvc3BlZWQgPSAoc3BlZWRfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDUpKTsKKyAgICBjYyA9IFB5TGlzdF9HZXRJdGVtKHRlcm0sIDYpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlMaXN0X0NoZWNrKGNjKSB8fCBQeUxpc3RfU2l6ZShjYykgIT0gTkNDUykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCSJ0Y3NldGF0dHI6IGF0dHJpYnV0ZXNbNl0gbXVzdCBiZSAlZCBlbGVtZW50IGxpc3QiLAotCQkJICAgICBOQ0NTKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlMaXN0X0NoZWNrKGNjKSB8fCBQeUxpc3RfU2l6ZShjYykgIT0gTkNDUykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgInRjc2V0YXR0cjogYXR0cmlidXRlc1s2XSBtdXN0IGJlICVkIGVsZW1lbnQgbGlzdCIsCisgICAgICAgICAgICAgICAgIE5DQ1MpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTkNDUzsgaSsrKSB7Ci0JCXYgPSBQeUxpc3RfR2V0SXRlbShjYywgaSk7CisgICAgZm9yIChpID0gMDsgaSA8IE5DQ1M7IGkrKykgeworICAgICAgICB2ID0gUHlMaXN0X0dldEl0ZW0oY2MsIGkpOwogCi0JCWlmIChQeVN0cmluZ19DaGVjayh2KSAmJiBQeVN0cmluZ19TaXplKHYpID09IDEpCi0JCQltb2RlLmNfY2NbaV0gPSAoY2NfdCkgKiBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQkJZWxzZSBpZiAoUHlJbnRfQ2hlY2sodikpCi0JCQltb2RlLmNfY2NbaV0gPSAoY2NfdCkgUHlJbnRfQXNMb25nKHYpOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAorICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodikgJiYgUHlTdHJpbmdfU2l6ZSh2KSA9PSAxKQorICAgICAgICAgICAgbW9kZS5jX2NjW2ldID0gKGNjX3QpICogUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKQorICAgICAgICAgICAgbW9kZS5jX2NjW2ldID0gKGNjX3QpIFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAidGNzZXRhdHRyOiBlbGVtZW50cyBvZiBhdHRyaWJ1dGVzIG11c3QgYmUgY2hhcmFjdGVycyBvciBpbnRlZ2VycyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgfQogCi0JaWYgKGNmc2V0aXNwZWVkKCZtb2RlLCAoc3BlZWRfdCkgaXNwZWVkKSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOwotCWlmIChjZnNldG9zcGVlZCgmbW9kZSwgKHNwZWVkX3QpIG9zcGVlZCkgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKLQlpZiAodGNzZXRhdHRyKGZkLCB3aGVuLCAmbW9kZSkgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKKyAgICBpZiAoY2ZzZXRpc3BlZWQoJm1vZGUsIChzcGVlZF90KSBpc3BlZWQpID09IC0xKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CisgICAgaWYgKGNmc2V0b3NwZWVkKCZtb2RlLCAoc3BlZWRfdCkgb3NwZWVkKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIGlmICh0Y3NldGF0dHIoZmQsIHdoZW4sICZtb2RlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHRlcm1pb3NfdGNzZW5kYnJlYWtfX2RvY19fLApAQCAtMjE1LDE2ICsyMTUsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXJtaW9zX3Rjc2VuZGJyZWFrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQsIGR1cmF0aW9uOworICAgIGludCBmZCwgZHVyYXRpb247CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTp0Y3NlbmRicmVhayIsIAotCQkJICAgICAgZmRjb252LCAmZmQsICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCWlmICh0Y3NlbmRicmVhayhmZCwgZHVyYXRpb24pID09IC0xKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6dGNzZW5kYnJlYWsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZGNvbnYsICZmZCwgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHRjc2VuZGJyZWFrKGZkLCBkdXJhdGlvbikgPT0gLTEpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZXJtaW9zX3RjZHJhaW5fX2RvY19fLApAQCAtMjM1LDE2ICsyMzUsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXJtaW9zX3RjZHJhaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZDsKKyAgICBpbnQgZmQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOnRjZHJhaW4iLCAKLQkJCSAgICAgIGZkY29udiwgJmZkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHRjZHJhaW4oZmQpID09IC0xKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjp0Y2RyYWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmRjb252LCAmZmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodGNkcmFpbihmZCkgPT0gLTEpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZXJtaW9zX3RjZmx1c2hfX2RvY19fLApAQCAtMjU4LDE2ICsyNTgsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXJtaW9zX3RjZmx1c2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZCwgcXVldWU7CisgICAgaW50IGZkLCBxdWV1ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpOnRjZmx1c2giLCAKLQkJCSAgICAgIGZkY29udiwgJmZkLCAmcXVldWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodGNmbHVzaChmZCwgcXVldWUpID09IC0xKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6dGNmbHVzaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZkY29udiwgJmZkLCAmcXVldWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodGNmbHVzaChmZCwgcXVldWUpID09IC0xKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIodGVybWlvc190Y2Zsb3dfX2RvY19fLApAQCAtMjgxLDMzICsyODEsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXJtaW9zX3RjZmxvdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkLCBhY3Rpb247CisgICAgaW50IGZkLCBhY3Rpb247CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTp0Y2Zsb3ciLCAKLQkJCSAgICAgIGZkY29udiwgJmZkLCAmYWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHRjZmxvdyhmZCwgYWN0aW9uKSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpOnRjZmxvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZkY29udiwgJmZkLCAmYWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHRjZmxvdyhmZCwgYWN0aW9uKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHRlcm1pb3NfbWV0aG9kc1tdID0KIHsKLQl7InRjZ2V0YXR0ciIsIHRlcm1pb3NfdGNnZXRhdHRyLCAKLQkgTUVUSF9WQVJBUkdTLCB0ZXJtaW9zX3RjZ2V0YXR0cl9fZG9jX199LAotCXsidGNzZXRhdHRyIiwgdGVybWlvc190Y3NldGF0dHIsIAotCSBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNzZXRhdHRyX19kb2NfX30sCi0JeyJ0Y3NlbmRicmVhayIsIHRlcm1pb3NfdGNzZW5kYnJlYWssIAotCSBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNzZW5kYnJlYWtfX2RvY19ffSwKLQl7InRjZHJhaW4iLCB0ZXJtaW9zX3RjZHJhaW4sIAotCSBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNkcmFpbl9fZG9jX199LAotCXsidGNmbHVzaCIsIHRlcm1pb3NfdGNmbHVzaCwgCi0JIE1FVEhfVkFSQVJHUywgdGVybWlvc190Y2ZsdXNoX19kb2NfX30sCi0JeyJ0Y2Zsb3ciLCB0ZXJtaW9zX3RjZmxvdywgCi0JIE1FVEhfVkFSQVJHUywgdGVybWlvc190Y2Zsb3dfX2RvY19ffSwKLQl7TlVMTCwgTlVMTH0KKyAgICB7InRjZ2V0YXR0ciIsIHRlcm1pb3NfdGNnZXRhdHRyLAorICAgICBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNnZXRhdHRyX19kb2NfX30sCisgICAgeyJ0Y3NldGF0dHIiLCB0ZXJtaW9zX3Rjc2V0YXR0ciwKKyAgICAgTUVUSF9WQVJBUkdTLCB0ZXJtaW9zX3Rjc2V0YXR0cl9fZG9jX199LAorICAgIHsidGNzZW5kYnJlYWsiLCB0ZXJtaW9zX3Rjc2VuZGJyZWFrLAorICAgICBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNzZW5kYnJlYWtfX2RvY19ffSwKKyAgICB7InRjZHJhaW4iLCB0ZXJtaW9zX3RjZHJhaW4sCisgICAgIE1FVEhfVkFSQVJHUywgdGVybWlvc190Y2RyYWluX19kb2NfX30sCisgICAgeyJ0Y2ZsdXNoIiwgdGVybWlvc190Y2ZsdXNoLAorICAgICBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNmbHVzaF9fZG9jX199LAorICAgIHsidGNmbG93IiwgdGVybWlvc190Y2Zsb3csCisgICAgIE1FVEhfVkFSQVJHUywgdGVybWlvc190Y2Zsb3dfX2RvY19ffSwKKyAgICB7TlVMTCwgTlVMTH0KIH07CiAKIApAQCAtMzIwLDYxMCArMzIwLDYxMCBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY29uc3RhbnQgewotCWNoYXIgKm5hbWU7Ci0JbG9uZyB2YWx1ZTsKKyAgICBjaGFyICpuYW1lOworICAgIGxvbmcgdmFsdWU7CiB9IHRlcm1pb3NfY29uc3RhbnRzW10gPSB7Ci0JLyogY2ZnZXRvc3BlZWQoKSwgY2ZzZXRvc3BlZWQoKSBjb25zdGFudHMgKi8KLQl7IkIwIiwgQjB9LAotCXsiQjUwIiwgQjUwfSwKLQl7IkI3NSIsIEI3NX0sCi0JeyJCMTEwIiwgQjExMH0sCi0JeyJCMTM0IiwgQjEzNH0sCi0JeyJCMTUwIiwgQjE1MH0sCi0JeyJCMjAwIiwgQjIwMH0sCi0JeyJCMzAwIiwgQjMwMH0sCi0JeyJCNjAwIiwgQjYwMH0sCi0JeyJCMTIwMCIsIEIxMjAwfSwKLQl7IkIxODAwIiwgQjE4MDB9LAotCXsiQjI0MDAiLCBCMjQwMH0sCi0JeyJCNDgwMCIsIEI0ODAwfSwKLQl7IkI5NjAwIiwgQjk2MDB9LAotCXsiQjE5MjAwIiwgQjE5MjAwfSwKLQl7IkIzODQwMCIsIEIzODQwMH0sCisgICAgLyogY2ZnZXRvc3BlZWQoKSwgY2ZzZXRvc3BlZWQoKSBjb25zdGFudHMgKi8KKyAgICB7IkIwIiwgQjB9LAorICAgIHsiQjUwIiwgQjUwfSwKKyAgICB7IkI3NSIsIEI3NX0sCisgICAgeyJCMTEwIiwgQjExMH0sCisgICAgeyJCMTM0IiwgQjEzNH0sCisgICAgeyJCMTUwIiwgQjE1MH0sCisgICAgeyJCMjAwIiwgQjIwMH0sCisgICAgeyJCMzAwIiwgQjMwMH0sCisgICAgeyJCNjAwIiwgQjYwMH0sCisgICAgeyJCMTIwMCIsIEIxMjAwfSwKKyAgICB7IkIxODAwIiwgQjE4MDB9LAorICAgIHsiQjI0MDAiLCBCMjQwMH0sCisgICAgeyJCNDgwMCIsIEI0ODAwfSwKKyAgICB7IkI5NjAwIiwgQjk2MDB9LAorICAgIHsiQjE5MjAwIiwgQjE5MjAwfSwKKyAgICB7IkIzODQwMCIsIEIzODQwMH0sCiAjaWZkZWYgQjU3NjAwCi0JeyJCNTc2MDAiLCBCNTc2MDB9LAorICAgIHsiQjU3NjAwIiwgQjU3NjAwfSwKICNlbmRpZgogI2lmZGVmIEIxMTUyMDAKLQl7IkIxMTUyMDAiLCBCMTE1MjAwfSwKKyAgICB7IkIxMTUyMDAiLCBCMTE1MjAwfSwKICNlbmRpZgogI2lmZGVmIEIyMzA0MDAKLQl7IkIyMzA0MDAiLCBCMjMwNDAwfSwKKyAgICB7IkIyMzA0MDAiLCBCMjMwNDAwfSwKICNlbmRpZgogI2lmZGVmIENCQVVERVgKLQl7IkNCQVVERVgiLCBDQkFVREVYfSwKKyAgICB7IkNCQVVERVgiLCBDQkFVREVYfSwKICNlbmRpZgogCi0JLyogdGNzZXRhdHRyKCkgY29uc3RhbnRzICovCi0JeyJUQ1NBTk9XIiwgVENTQU5PV30sCi0JeyJUQ1NBRFJBSU4iLCBUQ1NBRFJBSU59LAotCXsiVENTQUZMVVNIIiwgVENTQUZMVVNIfSwKKyAgICAvKiB0Y3NldGF0dHIoKSBjb25zdGFudHMgKi8KKyAgICB7IlRDU0FOT1ciLCBUQ1NBTk9XfSwKKyAgICB7IlRDU0FEUkFJTiIsIFRDU0FEUkFJTn0sCisgICAgeyJUQ1NBRkxVU0giLCBUQ1NBRkxVU0h9LAogI2lmZGVmIFRDU0FTT0ZUCi0JeyJUQ1NBU09GVCIsIFRDU0FTT0ZUfSwKKyAgICB7IlRDU0FTT0ZUIiwgVENTQVNPRlR9LAogI2VuZGlmCiAKLQkvKiB0Y2ZsdXNoKCkgY29uc3RhbnRzICovCi0JeyJUQ0lGTFVTSCIsIFRDSUZMVVNIfSwKLQl7IlRDT0ZMVVNIIiwgVENPRkxVU0h9LAotCXsiVENJT0ZMVVNIIiwgVENJT0ZMVVNIfSwKKyAgICAvKiB0Y2ZsdXNoKCkgY29uc3RhbnRzICovCisgICAgeyJUQ0lGTFVTSCIsIFRDSUZMVVNIfSwKKyAgICB7IlRDT0ZMVVNIIiwgVENPRkxVU0h9LAorICAgIHsiVENJT0ZMVVNIIiwgVENJT0ZMVVNIfSwKIAotCS8qIHRjZmxvdygpIGNvbnN0YW50cyAqLwotCXsiVENPT0ZGIiwgVENPT0ZGfSwKLQl7IlRDT09OIiwgVENPT059LAotCXsiVENJT0ZGIiwgVENJT0ZGfSwKLQl7IlRDSU9OIiwgVENJT059LAorICAgIC8qIHRjZmxvdygpIGNvbnN0YW50cyAqLworICAgIHsiVENPT0ZGIiwgVENPT0ZGfSwKKyAgICB7IlRDT09OIiwgVENPT059LAorICAgIHsiVENJT0ZGIiwgVENJT0ZGfSwKKyAgICB7IlRDSU9OIiwgVENJT059LAogCi0JLyogc3RydWN0IHRlcm1pb3MuY19pZmxhZyBjb25zdGFudHMgKi8KLQl7IklHTkJSSyIsIElHTkJSS30sCi0JeyJCUktJTlQiLCBCUktJTlR9LAotCXsiSUdOUEFSIiwgSUdOUEFSfSwKLQl7IlBBUk1SSyIsIFBBUk1SS30sCi0JeyJJTlBDSyIsIElOUENLfSwKLQl7IklTVFJJUCIsIElTVFJJUH0sCi0JeyJJTkxDUiIsIElOTENSfSwKLQl7IklHTkNSIiwgSUdOQ1J9LAotCXsiSUNSTkwiLCBJQ1JOTH0sCisgICAgLyogc3RydWN0IHRlcm1pb3MuY19pZmxhZyBjb25zdGFudHMgKi8KKyAgICB7IklHTkJSSyIsIElHTkJSS30sCisgICAgeyJCUktJTlQiLCBCUktJTlR9LAorICAgIHsiSUdOUEFSIiwgSUdOUEFSfSwKKyAgICB7IlBBUk1SSyIsIFBBUk1SS30sCisgICAgeyJJTlBDSyIsIElOUENLfSwKKyAgICB7IklTVFJJUCIsIElTVFJJUH0sCisgICAgeyJJTkxDUiIsIElOTENSfSwKKyAgICB7IklHTkNSIiwgSUdOQ1J9LAorICAgIHsiSUNSTkwiLCBJQ1JOTH0sCiAjaWZkZWYgSVVDTEMKLQl7IklVQ0xDIiwgSVVDTEN9LAorICAgIHsiSVVDTEMiLCBJVUNMQ30sCiAjZW5kaWYKLQl7IklYT04iLCBJWE9OfSwKLQl7IklYQU5ZIiwgSVhBTll9LAotCXsiSVhPRkYiLCBJWE9GRn0sCisgICAgeyJJWE9OIiwgSVhPTn0sCisgICAgeyJJWEFOWSIsIElYQU5ZfSwKKyAgICB7IklYT0ZGIiwgSVhPRkZ9LAogI2lmZGVmIElNQVhCRUwKLQl7IklNQVhCRUwiLCBJTUFYQkVMfSwKKyAgICB7IklNQVhCRUwiLCBJTUFYQkVMfSwKICNlbmRpZgogCi0JLyogc3RydWN0IHRlcm1pb3MuY19vZmxhZyBjb25zdGFudHMgKi8KLQl7Ik9QT1NUIiwgT1BPU1R9LAorICAgIC8qIHN0cnVjdCB0ZXJtaW9zLmNfb2ZsYWcgY29uc3RhbnRzICovCisgICAgeyJPUE9TVCIsIE9QT1NUfSwKICNpZmRlZiBPTENVQwotCXsiT0xDVUMiLCBPTENVQ30sCisgICAgeyJPTENVQyIsIE9MQ1VDfSwKICNlbmRpZgogI2lmZGVmIE9OTENSCi0JeyJPTkxDUiIsIE9OTENSfSwKKyAgICB7Ik9OTENSIiwgT05MQ1J9LAogI2VuZGlmCiAjaWZkZWYgT0NSTkwKLQl7Ik9DUk5MIiwgT0NSTkx9LAorICAgIHsiT0NSTkwiLCBPQ1JOTH0sCiAjZW5kaWYKICNpZmRlZiBPTk9DUgotCXsiT05PQ1IiLCBPTk9DUn0sCisgICAgeyJPTk9DUiIsIE9OT0NSfSwKICNlbmRpZgogI2lmZGVmIE9OTFJFVAotCXsiT05MUkVUIiwgT05MUkVUfSwKKyAgICB7Ik9OTFJFVCIsIE9OTFJFVH0sCiAjZW5kaWYKICNpZmRlZiBPRklMTAotCXsiT0ZJTEwiLCBPRklMTH0sCisgICAgeyJPRklMTCIsIE9GSUxMfSwKICNlbmRpZgogI2lmZGVmIE9GREVMCi0JeyJPRkRFTCIsIE9GREVMfSwKKyAgICB7Ik9GREVMIiwgT0ZERUx9LAogI2VuZGlmCiAjaWZkZWYgTkxETFkKLQl7Ik5MRExZIiwgTkxETFl9LAorICAgIHsiTkxETFkiLCBOTERMWX0sCiAjZW5kaWYKICNpZmRlZiBDUkRMWQotCXsiQ1JETFkiLCBDUkRMWX0sCisgICAgeyJDUkRMWSIsIENSRExZfSwKICNlbmRpZgogI2lmZGVmIFRBQkRMWQotCXsiVEFCRExZIiwgVEFCRExZfSwKKyAgICB7IlRBQkRMWSIsIFRBQkRMWX0sCiAjZW5kaWYKICNpZmRlZiBCU0RMWQotCXsiQlNETFkiLCBCU0RMWX0sCisgICAgeyJCU0RMWSIsIEJTRExZfSwKICNlbmRpZgogI2lmZGVmIFZURExZCi0JeyJWVERMWSIsIFZURExZfSwKKyAgICB7IlZURExZIiwgVlRETFl9LAogI2VuZGlmCiAjaWZkZWYgRkZETFkKLQl7IkZGRExZIiwgRkZETFl9LAorICAgIHsiRkZETFkiLCBGRkRMWX0sCiAjZW5kaWYKIAotCS8qIHN0cnVjdCB0ZXJtaW9zLmNfb2ZsYWctcmVsYXRlZCB2YWx1ZXMgKGRlbGF5IG1hc2spICovCisgICAgLyogc3RydWN0IHRlcm1pb3MuY19vZmxhZy1yZWxhdGVkIHZhbHVlcyAoZGVsYXkgbWFzaykgKi8KICNpZmRlZiBOTDAKLQl7Ik5MMCIsIE5MMH0sCisgICAgeyJOTDAiLCBOTDB9LAogI2VuZGlmCiAjaWZkZWYgTkwxCi0JeyJOTDEiLCBOTDF9LAorICAgIHsiTkwxIiwgTkwxfSwKICNlbmRpZgogI2lmZGVmIENSMAotCXsiQ1IwIiwgQ1IwfSwKKyAgICB7IkNSMCIsIENSMH0sCiAjZW5kaWYKICNpZmRlZiBDUjEKLQl7IkNSMSIsIENSMX0sCisgICAgeyJDUjEiLCBDUjF9LAogI2VuZGlmCiAjaWZkZWYgQ1IyCi0JeyJDUjIiLCBDUjJ9LAorICAgIHsiQ1IyIiwgQ1IyfSwKICNlbmRpZgogI2lmZGVmIENSMwotCXsiQ1IzIiwgQ1IzfSwKKyAgICB7IkNSMyIsIENSM30sCiAjZW5kaWYKICNpZmRlZiBUQUIwCi0JeyJUQUIwIiwgVEFCMH0sCisgICAgeyJUQUIwIiwgVEFCMH0sCiAjZW5kaWYKICNpZmRlZiBUQUIxCi0JeyJUQUIxIiwgVEFCMX0sCisgICAgeyJUQUIxIiwgVEFCMX0sCiAjZW5kaWYKICNpZmRlZiBUQUIyCi0JeyJUQUIyIiwgVEFCMn0sCisgICAgeyJUQUIyIiwgVEFCMn0sCiAjZW5kaWYKICNpZmRlZiBUQUIzCi0JeyJUQUIzIiwgVEFCM30sCisgICAgeyJUQUIzIiwgVEFCM30sCiAjZW5kaWYKICNpZmRlZiBYVEFCUwotCXsiWFRBQlMiLCBYVEFCU30sCisgICAgeyJYVEFCUyIsIFhUQUJTfSwKICNlbmRpZgogI2lmZGVmIEJTMAotCXsiQlMwIiwgQlMwfSwKKyAgICB7IkJTMCIsIEJTMH0sCiAjZW5kaWYKICNpZmRlZiBCUzEKLQl7IkJTMSIsIEJTMX0sCisgICAgeyJCUzEiLCBCUzF9LAogI2VuZGlmCiAjaWZkZWYgVlQwCi0JeyJWVDAiLCBWVDB9LAorICAgIHsiVlQwIiwgVlQwfSwKICNlbmRpZgogI2lmZGVmIFZUMQotCXsiVlQxIiwgVlQxfSwKKyAgICB7IlZUMSIsIFZUMX0sCiAjZW5kaWYKICNpZmRlZiBGRjAKLQl7IkZGMCIsIEZGMH0sCisgICAgeyJGRjAiLCBGRjB9LAogI2VuZGlmCiAjaWZkZWYgRkYxCi0JeyJGRjEiLCBGRjF9LAorICAgIHsiRkYxIiwgRkYxfSwKICNlbmRpZgogCi0JLyogc3RydWN0IHRlcm1pb3MuY19jZmxhZyBjb25zdGFudHMgKi8KLQl7IkNTSVpFIiwgQ1NJWkV9LAotCXsiQ1NUT1BCIiwgQ1NUT1BCfSwKLQl7IkNSRUFEIiwgQ1JFQUR9LAotCXsiUEFSRU5CIiwgUEFSRU5CfSwKLQl7IlBBUk9ERCIsIFBBUk9ERH0sCi0JeyJIVVBDTCIsIEhVUENMfSwKLQl7IkNMT0NBTCIsIENMT0NBTH0sCisgICAgLyogc3RydWN0IHRlcm1pb3MuY19jZmxhZyBjb25zdGFudHMgKi8KKyAgICB7IkNTSVpFIiwgQ1NJWkV9LAorICAgIHsiQ1NUT1BCIiwgQ1NUT1BCfSwKKyAgICB7IkNSRUFEIiwgQ1JFQUR9LAorICAgIHsiUEFSRU5CIiwgUEFSRU5CfSwKKyAgICB7IlBBUk9ERCIsIFBBUk9ERH0sCisgICAgeyJIVVBDTCIsIEhVUENMfSwKKyAgICB7IkNMT0NBTCIsIENMT0NBTH0sCiAjaWZkZWYgQ0lCQVVECi0JeyJDSUJBVUQiLCBDSUJBVUR9LAorICAgIHsiQ0lCQVVEIiwgQ0lCQVVEfSwKICNlbmRpZgogI2lmZGVmIENSVFNDVFMKLQl7IkNSVFNDVFMiLCAobG9uZylDUlRTQ1RTfSwKKyAgICB7IkNSVFNDVFMiLCAobG9uZylDUlRTQ1RTfSwKICNlbmRpZgogCi0JLyogc3RydWN0IHRlcm1pb3MuY19jZmxhZy1yZWxhdGVkIHZhbHVlcyAoY2hhcmFjdGVyIHNpemUpICovCi0JeyJDUzUiLCBDUzV9LAotCXsiQ1M2IiwgQ1M2fSwKLQl7IkNTNyIsIENTN30sCi0JeyJDUzgiLCBDUzh9LAorICAgIC8qIHN0cnVjdCB0ZXJtaW9zLmNfY2ZsYWctcmVsYXRlZCB2YWx1ZXMgKGNoYXJhY3RlciBzaXplKSAqLworICAgIHsiQ1M1IiwgQ1M1fSwKKyAgICB7IkNTNiIsIENTNn0sCisgICAgeyJDUzciLCBDUzd9LAorICAgIHsiQ1M4IiwgQ1M4fSwKIAotCS8qIHN0cnVjdCB0ZXJtaW9zLmNfbGZsYWcgY29uc3RhbnRzICovCi0JeyJJU0lHIiwgSVNJR30sCi0JeyJJQ0FOT04iLCBJQ0FOT059LAorICAgIC8qIHN0cnVjdCB0ZXJtaW9zLmNfbGZsYWcgY29uc3RhbnRzICovCisgICAgeyJJU0lHIiwgSVNJR30sCisgICAgeyJJQ0FOT04iLCBJQ0FOT059LAogI2lmZGVmIFhDQVNFCi0JeyJYQ0FTRSIsIFhDQVNFfSwKKyAgICB7IlhDQVNFIiwgWENBU0V9LAogI2VuZGlmCi0JeyJFQ0hPIiwgRUNIT30sCi0JeyJFQ0hPRSIsIEVDSE9FfSwKLQl7IkVDSE9LIiwgRUNIT0t9LAotCXsiRUNIT05MIiwgRUNIT05MfSwKKyAgICB7IkVDSE8iLCBFQ0hPfSwKKyAgICB7IkVDSE9FIiwgRUNIT0V9LAorICAgIHsiRUNIT0siLCBFQ0hPS30sCisgICAgeyJFQ0hPTkwiLCBFQ0hPTkx9LAogI2lmZGVmIEVDSE9DVEwKLQl7IkVDSE9DVEwiLCBFQ0hPQ1RMfSwKKyAgICB7IkVDSE9DVEwiLCBFQ0hPQ1RMfSwKICNlbmRpZgogI2lmZGVmIEVDSE9QUlQKLQl7IkVDSE9QUlQiLCBFQ0hPUFJUfSwKKyAgICB7IkVDSE9QUlQiLCBFQ0hPUFJUfSwKICNlbmRpZgogI2lmZGVmIEVDSE9LRQotCXsiRUNIT0tFIiwgRUNIT0tFfSwKKyAgICB7IkVDSE9LRSIsIEVDSE9LRX0sCiAjZW5kaWYKICNpZmRlZiBGTFVTSE8KLQl7IkZMVVNITyIsIEZMVVNIT30sCisgICAgeyJGTFVTSE8iLCBGTFVTSE99LAogI2VuZGlmCi0JeyJOT0ZMU0giLCBOT0ZMU0h9LAotCXsiVE9TVE9QIiwgVE9TVE9QfSwKKyAgICB7Ik5PRkxTSCIsIE5PRkxTSH0sCisgICAgeyJUT1NUT1AiLCBUT1NUT1B9LAogI2lmZGVmIFBFTkRJTgotCXsiUEVORElOIiwgUEVORElOfSwKKyAgICB7IlBFTkRJTiIsIFBFTkRJTn0sCiAjZW5kaWYKLQl7IklFWFRFTiIsIElFWFRFTn0sCisgICAgeyJJRVhURU4iLCBJRVhURU59LAogCi0JLyogaW5kZXhlcyBpbnRvIHRoZSBjb250cm9sIGNoYXJzIGFycmF5IHJldHVybmVkIGJ5IHRjZ2V0YXR0cigpICovCi0JeyJWSU5UUiIsIFZJTlRSfSwKLQl7IlZRVUlUIiwgVlFVSVR9LAotCXsiVkVSQVNFIiwgVkVSQVNFfSwKLQl7IlZLSUxMIiwgVktJTEx9LAotCXsiVkVPRiIsIFZFT0Z9LAotCXsiVlRJTUUiLCBWVElNRX0sCi0JeyJWTUlOIiwgVk1JTn0sCisgICAgLyogaW5kZXhlcyBpbnRvIHRoZSBjb250cm9sIGNoYXJzIGFycmF5IHJldHVybmVkIGJ5IHRjZ2V0YXR0cigpICovCisgICAgeyJWSU5UUiIsIFZJTlRSfSwKKyAgICB7IlZRVUlUIiwgVlFVSVR9LAorICAgIHsiVkVSQVNFIiwgVkVSQVNFfSwKKyAgICB7IlZLSUxMIiwgVktJTEx9LAorICAgIHsiVkVPRiIsIFZFT0Z9LAorICAgIHsiVlRJTUUiLCBWVElNRX0sCisgICAgeyJWTUlOIiwgVk1JTn0sCiAjaWZkZWYgVlNXVEMKLQkvKiBUaGUgI2RlZmluZXMgYWJvdmUgZW5zdXJlIHRoYXQgaWYgZWl0aGVyIGlzIGRlZmluZWQsIGJvdGggYXJlLAotICAgICAgICAgKiBidXQgYm90aCBtYXkgYmUgb21pdHRlZCBieSB0aGUgc3lzdGVtIGhlYWRlcnMuICA7LSggICovCi0JeyJWU1dUQyIsIFZTV1RDfSwKLQl7IlZTV1RDSCIsIFZTV1RDSH0sCisgICAgLyogVGhlICNkZWZpbmVzIGFib3ZlIGVuc3VyZSB0aGF0IGlmIGVpdGhlciBpcyBkZWZpbmVkLCBib3RoIGFyZSwKKyAgICAgKiBidXQgYm90aCBtYXkgYmUgb21pdHRlZCBieSB0aGUgc3lzdGVtIGhlYWRlcnMuICA7LSggICovCisgICAgeyJWU1dUQyIsIFZTV1RDfSwKKyAgICB7IlZTV1RDSCIsIFZTV1RDSH0sCiAjZW5kaWYKLQl7IlZTVEFSVCIsIFZTVEFSVH0sCi0JeyJWU1RPUCIsIFZTVE9QfSwKLQl7IlZTVVNQIiwgVlNVU1B9LAotCXsiVkVPTCIsIFZFT0x9LAorICAgIHsiVlNUQVJUIiwgVlNUQVJUfSwKKyAgICB7IlZTVE9QIiwgVlNUT1B9LAorICAgIHsiVlNVU1AiLCBWU1VTUH0sCisgICAgeyJWRU9MIiwgVkVPTH0sCiAjaWZkZWYgVlJFUFJJTlQKLQl7IlZSRVBSSU5UIiwgVlJFUFJJTlR9LAorICAgIHsiVlJFUFJJTlQiLCBWUkVQUklOVH0sCiAjZW5kaWYKICNpZmRlZiBWRElTQ0FSRAotCXsiVkRJU0NBUkQiLCBWRElTQ0FSRH0sCisgICAgeyJWRElTQ0FSRCIsIFZESVNDQVJEfSwKICNlbmRpZgogI2lmZGVmIFZXRVJBU0UKLQl7IlZXRVJBU0UiLCBWV0VSQVNFfSwKKyAgICB7IlZXRVJBU0UiLCBWV0VSQVNFfSwKICNlbmRpZgogI2lmZGVmIFZMTkVYVAotCXsiVkxORVhUIiwgVkxORVhUfSwKKyAgICB7IlZMTkVYVCIsIFZMTkVYVH0sCiAjZW5kaWYKICNpZmRlZiBWRU9MMgotCXsiVkVPTDIiLCBWRU9MMn0sCisgICAgeyJWRU9MMiIsIFZFT0wyfSwKICNlbmRpZgogCiAKICNpZmRlZiBCNDYwODAwCi0JeyJCNDYwODAwIiwgQjQ2MDgwMH0sCisgICAgeyJCNDYwODAwIiwgQjQ2MDgwMH0sCiAjZW5kaWYKICNpZmRlZiBDQkFVRAotCXsiQ0JBVUQiLCBDQkFVRH0sCisgICAgeyJDQkFVRCIsIENCQVVEfSwKICNlbmRpZgogI2lmZGVmIENERUwKLQl7IkNERUwiLCBDREVMfSwKKyAgICB7IkNERUwiLCBDREVMfSwKICNlbmRpZgogI2lmZGVmIENEU1VTUAotCXsiQ0RTVVNQIiwgQ0RTVVNQfSwKKyAgICB7IkNEU1VTUCIsIENEU1VTUH0sCiAjZW5kaWYKICNpZmRlZiBDRU9GCi0JeyJDRU9GIiwgQ0VPRn0sCisgICAgeyJDRU9GIiwgQ0VPRn0sCiAjZW5kaWYKICNpZmRlZiBDRU9MCi0JeyJDRU9MIiwgQ0VPTH0sCisgICAgeyJDRU9MIiwgQ0VPTH0sCiAjZW5kaWYKICNpZmRlZiBDRU9MMgotCXsiQ0VPTDIiLCBDRU9MMn0sCisgICAgeyJDRU9MMiIsIENFT0wyfSwKICNlbmRpZgogI2lmZGVmIENFT1QKLQl7IkNFT1QiLCBDRU9UfSwKKyAgICB7IkNFT1QiLCBDRU9UfSwKICNlbmRpZgogI2lmZGVmIENFUkFTRQotCXsiQ0VSQVNFIiwgQ0VSQVNFfSwKKyAgICB7IkNFUkFTRSIsIENFUkFTRX0sCiAjZW5kaWYKICNpZmRlZiBDRVNDCi0JeyJDRVNDIiwgQ0VTQ30sCisgICAgeyJDRVNDIiwgQ0VTQ30sCiAjZW5kaWYKICNpZmRlZiBDRkxVU0gKLQl7IkNGTFVTSCIsIENGTFVTSH0sCisgICAgeyJDRkxVU0giLCBDRkxVU0h9LAogI2VuZGlmCiAjaWZkZWYgQ0lOVFIKLQl7IkNJTlRSIiwgQ0lOVFJ9LAorICAgIHsiQ0lOVFIiLCBDSU5UUn0sCiAjZW5kaWYKICNpZmRlZiBDS0lMTAotCXsiQ0tJTEwiLCBDS0lMTH0sCisgICAgeyJDS0lMTCIsIENLSUxMfSwKICNlbmRpZgogI2lmZGVmIENMTkVYVAotCXsiQ0xORVhUIiwgQ0xORVhUfSwKKyAgICB7IkNMTkVYVCIsIENMTkVYVH0sCiAjZW5kaWYKICNpZmRlZiBDTlVMCi0JeyJDTlVMIiwgQ05VTH0sCisgICAgeyJDTlVMIiwgQ05VTH0sCiAjZW5kaWYKICNpZmRlZiBDT01NT04KLQl7IkNPTU1PTiIsIENPTU1PTn0sCisgICAgeyJDT01NT04iLCBDT01NT059LAogI2VuZGlmCiAjaWZkZWYgQ1FVSVQKLQl7IkNRVUlUIiwgQ1FVSVR9LAorICAgIHsiQ1FVSVQiLCBDUVVJVH0sCiAjZW5kaWYKICNpZmRlZiBDUlBSTlQKLQl7IkNSUFJOVCIsIENSUFJOVH0sCisgICAgeyJDUlBSTlQiLCBDUlBSTlR9LAogI2VuZGlmCiAjaWZkZWYgQ1NUQVJUCi0JeyJDU1RBUlQiLCBDU1RBUlR9LAorICAgIHsiQ1NUQVJUIiwgQ1NUQVJUfSwKICNlbmRpZgogI2lmZGVmIENTVE9QCi0JeyJDU1RPUCIsIENTVE9QfSwKKyAgICB7IkNTVE9QIiwgQ1NUT1B9LAogI2VuZGlmCiAjaWZkZWYgQ1NVU1AKLQl7IkNTVVNQIiwgQ1NVU1B9LAorICAgIHsiQ1NVU1AiLCBDU1VTUH0sCiAjZW5kaWYKICNpZmRlZiBDU1dUQ0gKLQl7IkNTV1RDSCIsIENTV1RDSH0sCisgICAgeyJDU1dUQ0giLCBDU1dUQ0h9LAogI2VuZGlmCiAjaWZkZWYgQ1dFUkFTRQotCXsiQ1dFUkFTRSIsIENXRVJBU0V9LAorICAgIHsiQ1dFUkFTRSIsIENXRVJBU0V9LAogI2VuZGlmCiAjaWZkZWYgRVhUQQotCXsiRVhUQSIsIEVYVEF9LAorICAgIHsiRVhUQSIsIEVYVEF9LAogI2VuZGlmCiAjaWZkZWYgRVhUQgotCXsiRVhUQiIsIEVYVEJ9LAorICAgIHsiRVhUQiIsIEVYVEJ9LAogI2VuZGlmCiAjaWZkZWYgRklPQVNZTkMKLQl7IkZJT0FTWU5DIiwgRklPQVNZTkN9LAorICAgIHsiRklPQVNZTkMiLCBGSU9BU1lOQ30sCiAjZW5kaWYKICNpZmRlZiBGSU9DTEVYCi0JeyJGSU9DTEVYIiwgRklPQ0xFWH0sCisgICAgeyJGSU9DTEVYIiwgRklPQ0xFWH0sCiAjZW5kaWYKICNpZmRlZiBGSU9OQklPCi0JeyJGSU9OQklPIiwgRklPTkJJT30sCisgICAgeyJGSU9OQklPIiwgRklPTkJJT30sCiAjZW5kaWYKICNpZmRlZiBGSU9OQ0xFWAotCXsiRklPTkNMRVgiLCBGSU9OQ0xFWH0sCisgICAgeyJGSU9OQ0xFWCIsIEZJT05DTEVYfSwKICNlbmRpZgogI2lmZGVmIEZJT05SRUFECi0JeyJGSU9OUkVBRCIsIEZJT05SRUFEfSwKKyAgICB7IkZJT05SRUFEIiwgRklPTlJFQUR9LAogI2VuZGlmCiAjaWZkZWYgSUJTSElGVAotCXsiSUJTSElGVCIsIElCU0hJRlR9LAorICAgIHsiSUJTSElGVCIsIElCU0hJRlR9LAogI2VuZGlmCiAjaWZkZWYgSU5JVF9DX0NDCi0JeyJJTklUX0NfQ0MiLCBJTklUX0NfQ0N9LAorICAgIHsiSU5JVF9DX0NDIiwgSU5JVF9DX0NDfSwKICNlbmRpZgogI2lmZGVmIElPQ1NJWkVfTUFTSwotCXsiSU9DU0laRV9NQVNLIiwgSU9DU0laRV9NQVNLfSwKKyAgICB7IklPQ1NJWkVfTUFTSyIsIElPQ1NJWkVfTUFTS30sCiAjZW5kaWYKICNpZmRlZiBJT0NTSVpFX1NISUZUCi0JeyJJT0NTSVpFX1NISUZUIiwgSU9DU0laRV9TSElGVH0sCisgICAgeyJJT0NTSVpFX1NISUZUIiwgSU9DU0laRV9TSElGVH0sCiAjZW5kaWYKICNpZmRlZiBOQ0MKLQl7Ik5DQyIsIE5DQ30sCisgICAgeyJOQ0MiLCBOQ0N9LAogI2VuZGlmCiAjaWZkZWYgTkNDUwotCXsiTkNDUyIsIE5DQ1N9LAorICAgIHsiTkNDUyIsIE5DQ1N9LAogI2VuZGlmCiAjaWZkZWYgTlNXVENICi0JeyJOU1dUQ0giLCBOU1dUQ0h9LAorICAgIHsiTlNXVENIIiwgTlNXVENIfSwKICNlbmRpZgogI2lmZGVmIE5fTU9VU0UKLQl7Ik5fTU9VU0UiLCBOX01PVVNFfSwKKyAgICB7Ik5fTU9VU0UiLCBOX01PVVNFfSwKICNlbmRpZgogI2lmZGVmIE5fUFBQCi0JeyJOX1BQUCIsIE5fUFBQfSwKKyAgICB7Ik5fUFBQIiwgTl9QUFB9LAogI2VuZGlmCiAjaWZkZWYgTl9TTElQCi0JeyJOX1NMSVAiLCBOX1NMSVB9LAorICAgIHsiTl9TTElQIiwgTl9TTElQfSwKICNlbmRpZgogI2lmZGVmIE5fU1RSSVAKLQl7Ik5fU1RSSVAiLCBOX1NUUklQfSwKKyAgICB7Ik5fU1RSSVAiLCBOX1NUUklQfSwKICNlbmRpZgogI2lmZGVmIE5fVFRZCi0JeyJOX1RUWSIsIE5fVFRZfSwKKyAgICB7Ik5fVFRZIiwgTl9UVFl9LAogI2VuZGlmCiAjaWZkZWYgVENGTFNICi0JeyJUQ0ZMU0giLCBUQ0ZMU0h9LAorICAgIHsiVENGTFNIIiwgVENGTFNIfSwKICNlbmRpZgogI2lmZGVmIFRDR0VUQQotCXsiVENHRVRBIiwgVENHRVRBfSwKKyAgICB7IlRDR0VUQSIsIFRDR0VUQX0sCiAjZW5kaWYKICNpZmRlZiBUQ0dFVFMKLQl7IlRDR0VUUyIsIFRDR0VUU30sCisgICAgeyJUQ0dFVFMiLCBUQ0dFVFN9LAogI2VuZGlmCiAjaWZkZWYgVENTQlJLCi0JeyJUQ1NCUksiLCBUQ1NCUkt9LAorICAgIHsiVENTQlJLIiwgVENTQlJLfSwKICNlbmRpZgogI2lmZGVmIFRDU0JSS1AKLQl7IlRDU0JSS1AiLCBUQ1NCUktQfSwKKyAgICB7IlRDU0JSS1AiLCBUQ1NCUktQfSwKICNlbmRpZgogI2lmZGVmIFRDU0VUQQotCXsiVENTRVRBIiwgVENTRVRBfSwKKyAgICB7IlRDU0VUQSIsIFRDU0VUQX0sCiAjZW5kaWYKICNpZmRlZiBUQ1NFVEFGCi0JeyJUQ1NFVEFGIiwgVENTRVRBRn0sCisgICAgeyJUQ1NFVEFGIiwgVENTRVRBRn0sCiAjZW5kaWYKICNpZmRlZiBUQ1NFVEFXCi0JeyJUQ1NFVEFXIiwgVENTRVRBV30sCisgICAgeyJUQ1NFVEFXIiwgVENTRVRBV30sCiAjZW5kaWYKICNpZmRlZiBUQ1NFVFMKLQl7IlRDU0VUUyIsIFRDU0VUU30sCisgICAgeyJUQ1NFVFMiLCBUQ1NFVFN9LAogI2VuZGlmCiAjaWZkZWYgVENTRVRTRgotCXsiVENTRVRTRiIsIFRDU0VUU0Z9LAorICAgIHsiVENTRVRTRiIsIFRDU0VUU0Z9LAogI2VuZGlmCiAjaWZkZWYgVENTRVRTVwotCXsiVENTRVRTVyIsIFRDU0VUU1d9LAorICAgIHsiVENTRVRTVyIsIFRDU0VUU1d9LAogI2VuZGlmCiAjaWZkZWYgVENYT05DCi0JeyJUQ1hPTkMiLCBUQ1hPTkN9LAorICAgIHsiVENYT05DIiwgVENYT05DfSwKICNlbmRpZgogI2lmZGVmIFRJT0NDT05TCi0JeyJUSU9DQ09OUyIsIFRJT0NDT05TfSwKKyAgICB7IlRJT0NDT05TIiwgVElPQ0NPTlN9LAogI2VuZGlmCiAjaWZkZWYgVElPQ0VYQ0wKLQl7IlRJT0NFWENMIiwgVElPQ0VYQ0x9LAorICAgIHsiVElPQ0VYQ0wiLCBUSU9DRVhDTH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DR0VURAotCXsiVElPQ0dFVEQiLCBUSU9DR0VURH0sCisgICAgeyJUSU9DR0VURCIsIFRJT0NHRVREfSwKICNlbmRpZgogI2lmZGVmIFRJT0NHSUNPVU5UCi0JeyJUSU9DR0lDT1VOVCIsIFRJT0NHSUNPVU5UfSwKKyAgICB7IlRJT0NHSUNPVU5UIiwgVElPQ0dJQ09VTlR9LAogI2VuZGlmCiAjaWZkZWYgVElPQ0dMQ0tUUk1JT1MKLQl7IlRJT0NHTENLVFJNSU9TIiwgVElPQ0dMQ0tUUk1JT1N9LAorICAgIHsiVElPQ0dMQ0tUUk1JT1MiLCBUSU9DR0xDS1RSTUlPU30sCiAjZW5kaWYKICNpZmRlZiBUSU9DR1BHUlAKLQl7IlRJT0NHUEdSUCIsIFRJT0NHUEdSUH0sCisgICAgeyJUSU9DR1BHUlAiLCBUSU9DR1BHUlB9LAogI2VuZGlmCiAjaWZkZWYgVElPQ0dTRVJJQUwKLQl7IlRJT0NHU0VSSUFMIiwgVElPQ0dTRVJJQUx9LAorICAgIHsiVElPQ0dTRVJJQUwiLCBUSU9DR1NFUklBTH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DR1NPRlRDQVIKLQl7IlRJT0NHU09GVENBUiIsIFRJT0NHU09GVENBUn0sCisgICAgeyJUSU9DR1NPRlRDQVIiLCBUSU9DR1NPRlRDQVJ9LAogI2VuZGlmCiAjaWZkZWYgVElPQ0dXSU5TWgotCXsiVElPQ0dXSU5TWiIsIFRJT0NHV0lOU1p9LAorICAgIHsiVElPQ0dXSU5TWiIsIFRJT0NHV0lOU1p9LAogI2VuZGlmCiAjaWZkZWYgVElPQ0lOUQotCXsiVElPQ0lOUSIsIFRJT0NJTlF9LAorICAgIHsiVElPQ0lOUSIsIFRJT0NJTlF9LAogI2VuZGlmCiAjaWZkZWYgVElPQ0xJTlVYCi0JeyJUSU9DTElOVVgiLCBUSU9DTElOVVh9LAorICAgIHsiVElPQ0xJTlVYIiwgVElPQ0xJTlVYfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNQklDCi0JeyJUSU9DTUJJQyIsIFRJT0NNQklDfSwKKyAgICB7IlRJT0NNQklDIiwgVElPQ01CSUN9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01CSVMKLQl7IlRJT0NNQklTIiwgVElPQ01CSVN9LAorICAgIHsiVElPQ01CSVMiLCBUSU9DTUJJU30sCiAjZW5kaWYKICNpZmRlZiBUSU9DTUdFVAotCXsiVElPQ01HRVQiLCBUSU9DTUdFVH0sCisgICAgeyJUSU9DTUdFVCIsIFRJT0NNR0VUfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNSVdBSVQKLQl7IlRJT0NNSVdBSVQiLCBUSU9DTUlXQUlUfSwKKyAgICB7IlRJT0NNSVdBSVQiLCBUSU9DTUlXQUlUfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNU0VUCi0JeyJUSU9DTVNFVCIsIFRJT0NNU0VUfSwKKyAgICB7IlRJT0NNU0VUIiwgVElPQ01TRVR9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01fQ0FSCi0JeyJUSU9DTV9DQVIiLCBUSU9DTV9DQVJ9LAorICAgIHsiVElPQ01fQ0FSIiwgVElPQ01fQ0FSfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNX0NECi0JeyJUSU9DTV9DRCIsIFRJT0NNX0NEfSwKKyAgICB7IlRJT0NNX0NEIiwgVElPQ01fQ0R9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01fQ1RTCi0JeyJUSU9DTV9DVFMiLCBUSU9DTV9DVFN9LAorICAgIHsiVElPQ01fQ1RTIiwgVElPQ01fQ1RTfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNX0RTUgotCXsiVElPQ01fRFNSIiwgVElPQ01fRFNSfSwKKyAgICB7IlRJT0NNX0RTUiIsIFRJT0NNX0RTUn0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTV9EVFIKLQl7IlRJT0NNX0RUUiIsIFRJT0NNX0RUUn0sCisgICAgeyJUSU9DTV9EVFIiLCBUSU9DTV9EVFJ9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01fTEUKLQl7IlRJT0NNX0xFIiwgVElPQ01fTEV9LAorICAgIHsiVElPQ01fTEUiLCBUSU9DTV9MRX0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTV9SSQotCXsiVElPQ01fUkkiLCBUSU9DTV9SSX0sCisgICAgeyJUSU9DTV9SSSIsIFRJT0NNX1JJfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNX1JORwotCXsiVElPQ01fUk5HIiwgVElPQ01fUk5HfSwKKyAgICB7IlRJT0NNX1JORyIsIFRJT0NNX1JOR30sCiAjZW5kaWYKICNpZmRlZiBUSU9DTV9SVFMKLQl7IlRJT0NNX1JUUyIsIFRJT0NNX1JUU30sCisgICAgeyJUSU9DTV9SVFMiLCBUSU9DTV9SVFN9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01fU1IKLQl7IlRJT0NNX1NSIiwgVElPQ01fU1J9LAorICAgIHsiVElPQ01fU1IiLCBUSU9DTV9TUn0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTV9TVAotCXsiVElPQ01fU1QiLCBUSU9DTV9TVH0sCisgICAgeyJUSU9DTV9TVCIsIFRJT0NNX1NUfSwKICNlbmRpZgogI2lmZGVmIFRJT0NOT1RUWQotCXsiVElPQ05PVFRZIiwgVElPQ05PVFRZfSwKKyAgICB7IlRJT0NOT1RUWSIsIFRJT0NOT1RUWX0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTlhDTAotCXsiVElPQ05YQ0wiLCBUSU9DTlhDTH0sCisgICAgeyJUSU9DTlhDTCIsIFRJT0NOWENMfSwKICNlbmRpZgogI2lmZGVmIFRJT0NPVVRRCi0JeyJUSU9DT1VUUSIsIFRJT0NPVVRRfSwKKyAgICB7IlRJT0NPVVRRIiwgVElPQ09VVFF9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1BLVAotCXsiVElPQ1BLVCIsIFRJT0NQS1R9LAorICAgIHsiVElPQ1BLVCIsIFRJT0NQS1R9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1BLVF9EQVRBCi0JeyJUSU9DUEtUX0RBVEEiLCBUSU9DUEtUX0RBVEF9LAorICAgIHsiVElPQ1BLVF9EQVRBIiwgVElPQ1BLVF9EQVRBfSwKICNlbmRpZgogI2lmZGVmIFRJT0NQS1RfRE9TVE9QCi0JeyJUSU9DUEtUX0RPU1RPUCIsIFRJT0NQS1RfRE9TVE9QfSwKKyAgICB7IlRJT0NQS1RfRE9TVE9QIiwgVElPQ1BLVF9ET1NUT1B9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1BLVF9GTFVTSFJFQUQKLQl7IlRJT0NQS1RfRkxVU0hSRUFEIiwgVElPQ1BLVF9GTFVTSFJFQUR9LAorICAgIHsiVElPQ1BLVF9GTFVTSFJFQUQiLCBUSU9DUEtUX0ZMVVNIUkVBRH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DUEtUX0ZMVVNIV1JJVEUKLQl7IlRJT0NQS1RfRkxVU0hXUklURSIsIFRJT0NQS1RfRkxVU0hXUklURX0sCisgICAgeyJUSU9DUEtUX0ZMVVNIV1JJVEUiLCBUSU9DUEtUX0ZMVVNIV1JJVEV9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1BLVF9OT1NUT1AKLQl7IlRJT0NQS1RfTk9TVE9QIiwgVElPQ1BLVF9OT1NUT1B9LAorICAgIHsiVElPQ1BLVF9OT1NUT1AiLCBUSU9DUEtUX05PU1RPUH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DUEtUX1NUQVJUCi0JeyJUSU9DUEtUX1NUQVJUIiwgVElPQ1BLVF9TVEFSVH0sCisgICAgeyJUSU9DUEtUX1NUQVJUIiwgVElPQ1BLVF9TVEFSVH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DUEtUX1NUT1AKLQl7IlRJT0NQS1RfU1RPUCIsIFRJT0NQS1RfU1RPUH0sCisgICAgeyJUSU9DUEtUX1NUT1AiLCBUSU9DUEtUX1NUT1B9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NDVFRZCi0JeyJUSU9DU0NUVFkiLCBUSU9DU0NUVFl9LAorICAgIHsiVElPQ1NDVFRZIiwgVElPQ1NDVFRZfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTRVJDT05GSUcKLQl7IlRJT0NTRVJDT05GSUciLCBUSU9DU0VSQ09ORklHfSwKKyAgICB7IlRJT0NTRVJDT05GSUciLCBUSU9DU0VSQ09ORklHfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTRVJHRVRMU1IKLQl7IlRJT0NTRVJHRVRMU1IiLCBUSU9DU0VSR0VUTFNSfSwKKyAgICB7IlRJT0NTRVJHRVRMU1IiLCBUSU9DU0VSR0VUTFNSfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTRVJHRVRNVUxUSQotCXsiVElPQ1NFUkdFVE1VTFRJIiwgVElPQ1NFUkdFVE1VTFRJfSwKKyAgICB7IlRJT0NTRVJHRVRNVUxUSSIsIFRJT0NTRVJHRVRNVUxUSX0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU0VSR1NUUlVDVAotCXsiVElPQ1NFUkdTVFJVQ1QiLCBUSU9DU0VSR1NUUlVDVH0sCisgICAgeyJUSU9DU0VSR1NUUlVDVCIsIFRJT0NTRVJHU1RSVUNUfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTRVJHV0lMRAotCXsiVElPQ1NFUkdXSUxEIiwgVElPQ1NFUkdXSUxEfSwKKyAgICB7IlRJT0NTRVJHV0lMRCIsIFRJT0NTRVJHV0lMRH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU0VSU0VUTVVMVEkKLQl7IlRJT0NTRVJTRVRNVUxUSSIsIFRJT0NTRVJTRVRNVUxUSX0sCisgICAgeyJUSU9DU0VSU0VUTVVMVEkiLCBUSU9DU0VSU0VUTVVMVEl9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NFUlNXSUxECi0JeyJUSU9DU0VSU1dJTEQiLCBUSU9DU0VSU1dJTER9LAorICAgIHsiVElPQ1NFUlNXSUxEIiwgVElPQ1NFUlNXSUxEfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTRVJfVEVNVAotCXsiVElPQ1NFUl9URU1UIiwgVElPQ1NFUl9URU1UfSwKKyAgICB7IlRJT0NTRVJfVEVNVCIsIFRJT0NTRVJfVEVNVH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU0VURAotCXsiVElPQ1NFVEQiLCBUSU9DU0VURH0sCisgICAgeyJUSU9DU0VURCIsIFRJT0NTRVREfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTTENLVFJNSU9TCi0JeyJUSU9DU0xDS1RSTUlPUyIsIFRJT0NTTENLVFJNSU9TfSwKKyAgICB7IlRJT0NTTENLVFJNSU9TIiwgVElPQ1NMQ0tUUk1JT1N9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NQR1JQCi0JeyJUSU9DU1BHUlAiLCBUSU9DU1BHUlB9LAorICAgIHsiVElPQ1NQR1JQIiwgVElPQ1NQR1JQfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTU0VSSUFMCi0JeyJUSU9DU1NFUklBTCIsIFRJT0NTU0VSSUFMfSwKKyAgICB7IlRJT0NTU0VSSUFMIiwgVElPQ1NTRVJJQUx9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NTT0ZUQ0FSCi0JeyJUSU9DU1NPRlRDQVIiLCBUSU9DU1NPRlRDQVJ9LAorICAgIHsiVElPQ1NTT0ZUQ0FSIiwgVElPQ1NTT0ZUQ0FSfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTVEkKLQl7IlRJT0NTVEkiLCBUSU9DU1RJfSwKKyAgICB7IlRJT0NTVEkiLCBUSU9DU1RJfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTV0lOU1oKLQl7IlRJT0NTV0lOU1oiLCBUSU9DU1dJTlNafSwKKyAgICB7IlRJT0NTV0lOU1oiLCBUSU9DU1dJTlNafSwKICNlbmRpZgogI2lmZGVmIFRJT0NUVFlHU1RSVUNUCi0JeyJUSU9DVFRZR1NUUlVDVCIsIFRJT0NUVFlHU1RSVUNUfSwKKyAgICB7IlRJT0NUVFlHU1RSVUNUIiwgVElPQ1RUWUdTVFJVQ1R9LAogI2VuZGlmCiAKLQkvKiBzZW50aW5lbCAqLwotCXtOVUxMLCAwfQorICAgIC8qIHNlbnRpbmVsICovCisgICAge05VTEwsIDB9CiB9OwogCiAKIFB5TU9ESU5JVF9GVU5DCiBQeUluaXRfdGVybWlvcyh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCXN0cnVjdCBjb25zdGFudCAqY29uc3RhbnQgPSB0ZXJtaW9zX2NvbnN0YW50czsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBzdHJ1Y3QgY29uc3RhbnQgKmNvbnN0YW50ID0gdGVybWlvc19jb25zdGFudHM7CiAKLQltID0gUHlfSW5pdE1vZHVsZTQoInRlcm1pb3MiLCB0ZXJtaW9zX21ldGhvZHMsIHRlcm1pb3NfX2RvY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJ0ZXJtaW9zIiwgdGVybWlvc19tZXRob2RzLCB0ZXJtaW9zX19kb2NfXywKKyAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoVGVybWlvc0Vycm9yID09IE5VTEwpIHsKLQkJVGVybWlvc0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJ0ZXJtaW9zLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JfQotCVB5X0lOQ1JFRihUZXJtaW9zRXJyb3IpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBUZXJtaW9zRXJyb3IpOworICAgIGlmIChUZXJtaW9zRXJyb3IgPT0gTlVMTCkgeworICAgICAgICBUZXJtaW9zRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInRlcm1pb3MuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFRlcm1pb3NFcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFRlcm1pb3NFcnJvcik7CiAKLQl3aGlsZSAoY29uc3RhbnQtPm5hbWUgIT0gTlVMTCkgewotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCBjb25zdGFudC0+bmFtZSwgY29uc3RhbnQtPnZhbHVlKTsKLQkJKytjb25zdGFudDsKLQl9CisgICAgd2hpbGUgKGNvbnN0YW50LT5uYW1lICE9IE5VTEwpIHsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgY29uc3RhbnQtPm5hbWUsIGNvbnN0YW50LT52YWx1ZSk7CisgICAgICAgICsrY29uc3RhbnQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90ZXN0Y2FwaV9sb25nLmggYi9Nb2R1bGVzL3Rlc3RjYXBpX2xvbmcuaAppbmRleCA2MGNhMzI2Li5mYTk0ZmQ2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Rlc3RjYXBpX2xvbmcuaAorKysgYi9Nb2R1bGVzL3Rlc3RjYXBpX2xvbmcuaApAQCAtMSwxODIgKzEsMTgyIEBACiAvKiBQb29yLW1hbidzIHRlbXBsYXRlLiAgTWFjcm9zIHVzZWQ6Ci0gICBURVNUTkFNRQluYW1lIG9mIHRoZSB0ZXN0IChsaWtlIHRlc3RfbG9uZ19hcGlfaW5uZXIpCi0gICBUWVBFTkFNRQl0aGUgc2lnbmVkIHR5cGUgKGxpa2UgbG9uZykKLSAgIEZfU19UT19QWQljb252ZXJ0IHNpZ25lZCB0byBweWxvbmc7IFRZUEVOQU1FIC0+IFB5T2JqZWN0KgotICAgRl9QWV9UT19TCWNvbnZlcnQgcHlsb25nIHRvIHNpZ25lZDsgUHlPYmplY3QqIC0+IFRZUEVOQU1FCi0gICBGX1VfVE9fUFkJY29udmVydCB1bnNpZ25lZCB0byBweWxvbmc7IHVuc2lnbmVkIFRZUEVOQU1FIC0+IFB5T2JqZWN0KgorICAgVEVTVE5BTUUgICAgIG5hbWUgb2YgdGhlIHRlc3QgKGxpa2UgdGVzdF9sb25nX2FwaV9pbm5lcikKKyAgIFRZUEVOQU1FICAgICB0aGUgc2lnbmVkIHR5cGUgKGxpa2UgbG9uZykKKyAgIEZfU19UT19QWSAgICBjb252ZXJ0IHNpZ25lZCB0byBweWxvbmc7IFRZUEVOQU1FIC0+IFB5T2JqZWN0KgorICAgRl9QWV9UT19TICAgIGNvbnZlcnQgcHlsb25nIHRvIHNpZ25lZDsgUHlPYmplY3QqIC0+IFRZUEVOQU1FCisgICBGX1VfVE9fUFkgICAgY29udmVydCB1bnNpZ25lZCB0byBweWxvbmc7IHVuc2lnbmVkIFRZUEVOQU1FIC0+IFB5T2JqZWN0KgogICAgRl9QWV9UT19VICAgIGNvbnZlcnQgcHlsb25nIHRvIHVuc2lnbmVkOyBQeU9iamVjdCogLT4gdW5zaWduZWQgVFlQRU5BTUUKICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBURVNUTkFNRShQeU9iamVjdCAqZXJyb3IoY29uc3QgY2hhciopKQogewotCWNvbnN0IGludCBOQklUUyA9IHNpemVvZihUWVBFTkFNRSkgKiA4OwotCXVuc2lnbmVkIFRZUEVOQU1FIGJhc2U7Ci0JUHlPYmplY3QgKnB5cmVzdWx0OwotCWludCBpOworICAgIGNvbnN0IGludCBOQklUUyA9IHNpemVvZihUWVBFTkFNRSkgKiA4OworICAgIHVuc2lnbmVkIFRZUEVOQU1FIGJhc2U7CisgICAgUHlPYmplY3QgKnB5cmVzdWx0OworICAgIGludCBpOwogCi0JLyogTm90ZTogIFRoaXMgdGVzdCBsZXRzIFB5T2JqZWN0cyBsZWFrIGlmIGFuIGVycm9yIGlzIHJhaXNlZC4gIFNpbmNlCi0JICAgYW4gZXJyb3Igc2hvdWxkIG5ldmVyIGJlIHJhaXNlZCwgbGVha3MgYXJlIGltcG9zc2libGUgPHdpbms+LiAqLworICAgIC8qIE5vdGU6ICBUaGlzIHRlc3QgbGV0cyBQeU9iamVjdHMgbGVhayBpZiBhbiBlcnJvciBpcyByYWlzZWQuICBTaW5jZQorICAgICAgIGFuIGVycm9yIHNob3VsZCBuZXZlciBiZSByYWlzZWQsIGxlYWtzIGFyZSBpbXBvc3NpYmxlIDx3aW5rPi4gKi8KIAotCS8qIFRlc3QgbmF0aXZlIC0+IFB5TG9uZyAtPiBuYXRpdmUgcm91bmR0cmlwIGlkZW50aXR5LgotCSAqIEdlbmVyYXRlIGFsbCBwb3dlcnMgb2YgMiwgYW5kIHRlc3QgdGhlbSBhbmQgdGhlaXIgbmVnYXRpb25zLAotCSAqIHBsdXMgdGhlIG51bWJlcnMgKy0xIG9mZiBmcm9tIHRoZW0uCi0JICovCi0JYmFzZSA9IDE7Ci0JZm9yIChpID0gMDsKLQkgICAgIGkgPCBOQklUUyArIDE7ICAvKiBvbiBsYXN0LCBiYXNlIG92ZXJmbG93cyB0byAwICovCi0JICAgICArK2ksIGJhc2UgPDw9IDEpCi0JewotCQlpbnQgajsKLQkJZm9yIChqID0gMDsgaiA8IDY7ICsraikgewotCQkJVFlQRU5BTUUgaW4sIG91dDsKLQkJCXVuc2lnbmVkIFRZUEVOQU1FIHVpbiwgdW91dDsKKyAgICAvKiBUZXN0IG5hdGl2ZSAtPiBQeUxvbmcgLT4gbmF0aXZlIHJvdW5kdHJpcCBpZGVudGl0eS4KKyAgICAgKiBHZW5lcmF0ZSBhbGwgcG93ZXJzIG9mIDIsIGFuZCB0ZXN0IHRoZW0gYW5kIHRoZWlyIG5lZ2F0aW9ucywKKyAgICAgKiBwbHVzIHRoZSBudW1iZXJzICstMSBvZmYgZnJvbSB0aGVtLgorICAgICAqLworICAgIGJhc2UgPSAxOworICAgIGZvciAoaSA9IDA7CisgICAgICAgICBpIDwgTkJJVFMgKyAxOyAgLyogb24gbGFzdCwgYmFzZSBvdmVyZmxvd3MgdG8gMCAqLworICAgICAgICAgKytpLCBiYXNlIDw8PSAxKQorICAgIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA2OyArK2opIHsKKyAgICAgICAgICAgIFRZUEVOQU1FIGluLCBvdXQ7CisgICAgICAgICAgICB1bnNpZ25lZCBUWVBFTkFNRSB1aW4sIHVvdXQ7CiAKLQkJCS8qIEZvciAwLCAxLCAyIHVzZSBiYXNlOyBmb3IgMywgNCwgNSB1c2UgLWJhc2UgKi8KLQkJCXVpbiA9IGogPCAzID8gYmFzZQotCQkJCSAgICA6ICh1bnNpZ25lZCBUWVBFTkFNRSkoLShUWVBFTkFNRSliYXNlKTsKKyAgICAgICAgICAgIC8qIEZvciAwLCAxLCAyIHVzZSBiYXNlOyBmb3IgMywgNCwgNSB1c2UgLWJhc2UgKi8KKyAgICAgICAgICAgIHVpbiA9IGogPCAzID8gYmFzZQorICAgICAgICAgICAgICAgICAgICAgICAgOiAodW5zaWduZWQgVFlQRU5BTUUpKC0oVFlQRU5BTUUpYmFzZSk7CiAKLQkJCS8qIEZvciAwICYgMywgc3VidHJhY3QgMS4KLQkJCSAqIEZvciAxICYgNCwgbGVhdmUgYWxvbmUuCi0JCQkgKiBGb3IgMiAmIDUsIGFkZCAxLgotCQkJICovCi0JCQl1aW4gKz0gKHVuc2lnbmVkIFRZUEVOQU1FKShUWVBFTkFNRSkoaiAlIDMgLSAxKTsKKyAgICAgICAgICAgIC8qIEZvciAwICYgMywgc3VidHJhY3QgMS4KKyAgICAgICAgICAgICAqIEZvciAxICYgNCwgbGVhdmUgYWxvbmUuCisgICAgICAgICAgICAgKiBGb3IgMiAmIDUsIGFkZCAxLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB1aW4gKz0gKHVuc2lnbmVkIFRZUEVOQU1FKShUWVBFTkFNRSkoaiAlIDMgLSAxKTsKIAotCQkJcHlyZXN1bHQgPSBGX1VfVE9fUFkodWluKTsKLQkJCWlmIChweXJlc3VsdCA9PSBOVUxMKQotCQkJCXJldHVybiBlcnJvcigKLQkJCQkgInVuc2lnbmVkIHVuZXhwZWN0ZWQgbnVsbCByZXN1bHQiKTsKKyAgICAgICAgICAgIHB5cmVzdWx0ID0gRl9VX1RPX1BZKHVpbik7CisgICAgICAgICAgICBpZiAocHlyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgICJ1bnNpZ25lZCB1bmV4cGVjdGVkIG51bGwgcmVzdWx0Iik7CiAKLQkJCXVvdXQgPSBGX1BZX1RPX1UocHlyZXN1bHQpOwotCQkJaWYgKHVvdXQgPT0gKHVuc2lnbmVkIFRZUEVOQU1FKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIGVycm9yKAotCQkJCQkidW5zaWduZWQgdW5leHBlY3RlZCAtMSByZXN1bHQiKTsKLQkJCWlmICh1b3V0ICE9IHVpbikKLQkJCQlyZXR1cm4gZXJyb3IoCi0JCQkJCSJ1bnNpZ25lZCBvdXRwdXQgIT0gaW5wdXQiKTsKLQkJCVVOQklORChweXJlc3VsdCk7CisgICAgICAgICAgICB1b3V0ID0gRl9QWV9UT19VKHB5cmVzdWx0KTsKKyAgICAgICAgICAgIGlmICh1b3V0ID09ICh1bnNpZ25lZCBUWVBFTkFNRSktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAgICAgInVuc2lnbmVkIHVuZXhwZWN0ZWQgLTEgcmVzdWx0Iik7CisgICAgICAgICAgICBpZiAodW91dCAhPSB1aW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICAgICAidW5zaWduZWQgb3V0cHV0ICE9IGlucHV0Iik7CisgICAgICAgICAgICBVTkJJTkQocHlyZXN1bHQpOwogCi0JCQlpbiA9IChUWVBFTkFNRSl1aW47Ci0JCQlweXJlc3VsdCA9IEZfU19UT19QWShpbik7Ci0JCQlpZiAocHlyZXN1bHQgPT0gTlVMTCkKLQkJCQlyZXR1cm4gZXJyb3IoCi0JCQkJCSJzaWduZWQgdW5leHBlY3RlZCBudWxsIHJlc3VsdCIpOworICAgICAgICAgICAgaW4gPSAoVFlQRU5BTUUpdWluOworICAgICAgICAgICAgcHlyZXN1bHQgPSBGX1NfVE9fUFkoaW4pOworICAgICAgICAgICAgaWYgKHB5cmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICAgICAic2lnbmVkIHVuZXhwZWN0ZWQgbnVsbCByZXN1bHQiKTsKIAotCQkJb3V0ID0gRl9QWV9UT19TKHB5cmVzdWx0KTsKLQkJCWlmIChvdXQgPT0gKFRZUEVOQU1FKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIGVycm9yKAotCQkJCQkic2lnbmVkIHVuZXhwZWN0ZWQgLTEgcmVzdWx0Iik7Ci0JCQlpZiAob3V0ICE9IGluKQotCQkJCXJldHVybiBlcnJvcigKLQkJCQkJInNpZ25lZCBvdXRwdXQgIT0gaW5wdXQiKTsKLQkJCVVOQklORChweXJlc3VsdCk7Ci0JCX0KLQl9CisgICAgICAgICAgICBvdXQgPSBGX1BZX1RPX1MocHlyZXN1bHQpOworICAgICAgICAgICAgaWYgKG91dCA9PSAoVFlQRU5BTUUpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJzaWduZWQgdW5leHBlY3RlZCAtMSByZXN1bHQiKTsKKyAgICAgICAgICAgIGlmIChvdXQgIT0gaW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICAgICAic2lnbmVkIG91dHB1dCAhPSBpbnB1dCIpOworICAgICAgICAgICAgVU5CSU5EKHB5cmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIE92ZXJmbG93IHRlc3RzLiAgVGhlIGxvb3AgYWJvdmUgZW5zdXJlZCB0aGF0IGFsbCBsaW1pdCBjYXNlcyB0aGF0Ci0JICogc2hvdWxkIG5vdCBvdmVyZmxvdyBkb24ndCBvdmVyZmxvdywgc28gYWxsIHdlIG5lZWQgdG8gZG8gaGVyZSBpcwotCSAqIHByb3Zva2Ugb25lLW92ZXItdGhlLWxpbWl0IGNhc2VzIChub3QgZXhoYXVzdGl2ZSwgYnV0IHNoYXJwKS4KLQkgKi8KLQl7Ci0JCVB5T2JqZWN0ICpvbmUsICp4LCAqeTsKLQkJVFlQRU5BTUUgb3V0OwotCQl1bnNpZ25lZCBUWVBFTkFNRSB1b3V0OworICAgIC8qIE92ZXJmbG93IHRlc3RzLiAgVGhlIGxvb3AgYWJvdmUgZW5zdXJlZCB0aGF0IGFsbCBsaW1pdCBjYXNlcyB0aGF0CisgICAgICogc2hvdWxkIG5vdCBvdmVyZmxvdyBkb24ndCBvdmVyZmxvdywgc28gYWxsIHdlIG5lZWQgdG8gZG8gaGVyZSBpcworICAgICAqIHByb3Zva2Ugb25lLW92ZXItdGhlLWxpbWl0IGNhc2VzIChub3QgZXhoYXVzdGl2ZSwgYnV0IHNoYXJwKS4KKyAgICAgKi8KKyAgICB7CisgICAgICAgIFB5T2JqZWN0ICpvbmUsICp4LCAqeTsKKyAgICAgICAgVFlQRU5BTUUgb3V0OworICAgICAgICB1bnNpZ25lZCBUWVBFTkFNRSB1b3V0OwogCi0JCW9uZSA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKLQkJaWYgKG9uZSA9PSBOVUxMKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeUxvbmdfRnJvbUxvbmciKTsKKyAgICAgICAgb25lID0gUHlMb25nX0Zyb21Mb25nKDEpOworICAgICAgICBpZiAob25lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TG9uZ19Gcm9tTG9uZyIpOwogCi0JCS8qIFVuc2lnbmVkIGNvbXBsYWlucyBhYm91dCAtMT8gKi8KLQkJeCA9IFB5TnVtYmVyX05lZ2F0aXZlKG9uZSk7Ci0JCWlmICh4ID09IE5VTEwpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TnVtYmVyX05lZ2F0aXZlIik7CisgICAgICAgIC8qIFVuc2lnbmVkIGNvbXBsYWlucyBhYm91dCAtMT8gKi8KKyAgICAgICAgeCA9IFB5TnVtYmVyX05lZ2F0aXZlKG9uZSk7CisgICAgICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TnVtYmVyX05lZ2F0aXZlIik7CiAKLQkJdW91dCA9IEZfUFlfVE9fVSh4KTsKLQkJaWYgKHVvdXQgIT0gKHVuc2lnbmVkIFRZUEVOQU1FKS0xIHx8ICFQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJQeUxvbmdfQXNVbnNpZ25lZFhYWCgtMSkgZGlkbid0IGNvbXBsYWluIik7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkiUHlMb25nX0FzVW5zaWduZWRYWFgoLTEpIHJhaXNlZCAiCi0JCQkJInNvbWV0aGluZyBvdGhlciB0aGFuIE92ZXJmbG93RXJyb3IiKTsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJVU5CSU5EKHgpOworICAgICAgICB1b3V0ID0gRl9QWV9UT19VKHgpOworICAgICAgICBpZiAodW91dCAhPSAodW5zaWduZWQgVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgIlB5TG9uZ19Bc1Vuc2lnbmVkWFhYKC0xKSBkaWRuJ3QgY29tcGxhaW4iKTsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICJQeUxvbmdfQXNVbnNpZ25lZFhYWCgtMSkgcmFpc2VkICIKKyAgICAgICAgICAgICAgICAic29tZXRoaW5nIG90aGVyIHRoYW4gT3ZlcmZsb3dFcnJvciIpOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBVTkJJTkQoeCk7CiAKLQkJLyogVW5zaWduZWQgY29tcGxhaW5zIGFib3V0IDIqKk5CSVRTPyAqLwotCQl5ID0gUHlMb25nX0Zyb21Mb25nKChsb25nKU5CSVRTKTsKLQkJaWYgKHkgPT0gTlVMTCkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkidW5leHBlY3RlZCBOVUxMIGZyb20gUHlMb25nX0Zyb21Mb25nIik7CisgICAgICAgIC8qIFVuc2lnbmVkIGNvbXBsYWlucyBhYm91dCAyKipOQklUUz8gKi8KKyAgICAgICAgeSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylOQklUUyk7CisgICAgICAgIGlmICh5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TG9uZ19Gcm9tTG9uZyIpOwogCi0JCXggPSBQeU51bWJlcl9Mc2hpZnQob25lLCB5KTsgLyogMUwgPDwgTkJJVFMsID09IDIqKk5CSVRTICovCi0JCVVOQklORCh5KTsKLQkJaWYgKHggPT0gTlVMTCkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkidW5leHBlY3RlZCBOVUxMIGZyb20gUHlOdW1iZXJfTHNoaWZ0Iik7CisgICAgICAgIHggPSBQeU51bWJlcl9Mc2hpZnQob25lLCB5KTsgLyogMUwgPDwgTkJJVFMsID09IDIqKk5CSVRTICovCisgICAgICAgIFVOQklORCh5KTsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIGZyb20gUHlOdW1iZXJfTHNoaWZ0Iik7CiAKLQkJdW91dCA9IEZfUFlfVE9fVSh4KTsKLQkJaWYgKHVvdXQgIT0gKHVuc2lnbmVkIFRZUEVOQU1FKS0xIHx8ICFQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJQeUxvbmdfQXNVbnNpZ25lZFhYWCgyKipOQklUUykgZGlkbid0ICIKLQkJCQkiY29tcGxhaW4iKTsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJQeUxvbmdfQXNVbnNpZ25lZFhYWCgyKipOQklUUykgcmFpc2VkICIKLQkJCQkic29tZXRoaW5nIG90aGVyIHRoYW4gT3ZlcmZsb3dFcnJvciIpOwotCQlQeUVycl9DbGVhcigpOworICAgICAgICB1b3V0ID0gRl9QWV9UT19VKHgpOworICAgICAgICBpZiAodW91dCAhPSAodW5zaWduZWQgVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgIlB5TG9uZ19Bc1Vuc2lnbmVkWFhYKDIqKk5CSVRTKSBkaWRuJ3QgIgorICAgICAgICAgICAgICAgICJjb21wbGFpbiIpOworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgIlB5TG9uZ19Bc1Vuc2lnbmVkWFhYKDIqKk5CSVRTKSByYWlzZWQgIgorICAgICAgICAgICAgICAgICJzb21ldGhpbmcgb3RoZXIgdGhhbiBPdmVyZmxvd0Vycm9yIik7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAKLQkJLyogU2lnbmVkIGNvbXBsYWlucyBhYm91dCAyKiooTkJJVFMtMSk/Ci0JCSAgIHggc3RpbGwgaGFzIDIqKk5CSVRTLiAqLwotCQl5ID0gUHlOdW1iZXJfUnNoaWZ0KHgsIG9uZSk7IC8qIDIqKihOQklUUy0xKSAqLwotCQlVTkJJTkQoeCk7Ci0JCWlmICh5ID09IE5VTEwpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TnVtYmVyX1JzaGlmdCIpOworICAgICAgICAvKiBTaWduZWQgY29tcGxhaW5zIGFib3V0IDIqKihOQklUUy0xKT8KKyAgICAgICAgICAgeCBzdGlsbCBoYXMgMioqTkJJVFMuICovCisgICAgICAgIHkgPSBQeU51bWJlcl9Sc2hpZnQoeCwgb25lKTsgLyogMioqKE5CSVRTLTEpICovCisgICAgICAgIFVOQklORCh4KTsKKyAgICAgICAgaWYgKHkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIGZyb20gUHlOdW1iZXJfUnNoaWZ0Iik7CiAKLQkJb3V0ID0gRl9QWV9UT19TKHkpOwotCQlpZiAob3V0ICE9IChUWVBFTkFNRSktMSB8fCAhUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkiUHlMb25nX0FzWFhYKDIqKihOQklUUy0xKSkgZGlkbid0ICIKLQkJCQkiY29tcGxhaW4iKTsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJQeUxvbmdfQXNYWFgoMioqKE5CSVRTLTEpKSByYWlzZWQgIgotCQkJCSJzb21ldGhpbmcgb3RoZXIgdGhhbiBPdmVyZmxvd0Vycm9yIik7Ci0JCVB5RXJyX0NsZWFyKCk7CisgICAgICAgIG91dCA9IEZfUFlfVE9fUyh5KTsKKyAgICAgICAgaWYgKG91dCAhPSAoVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgIlB5TG9uZ19Bc1hYWCgyKiooTkJJVFMtMSkpIGRpZG4ndCAiCisgICAgICAgICAgICAgICAgImNvbXBsYWluIik7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAiUHlMb25nX0FzWFhYKDIqKihOQklUUy0xKSkgcmFpc2VkICIKKyAgICAgICAgICAgICAgICAic29tZXRoaW5nIG90aGVyIHRoYW4gT3ZlcmZsb3dFcnJvciIpOworICAgICAgICBQeUVycl9DbGVhcigpOwogCi0JCS8qIFNpZ25lZCBjb21wbGFpbnMgYWJvdXQgLTIqKihOQklUUy0xKS0xPzsKLQkJICAgeSBzdGlsbCBoYXMgMioqKE5CSVRTLTEpLiAqLwotCQl4ID0gUHlOdW1iZXJfTmVnYXRpdmUoeSk7ICAvKiAtKDIqKihOQklUUy0xKSkgKi8KLQkJVU5CSU5EKHkpOwotCQlpZiAoeCA9PSBOVUxMKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeU51bWJlcl9OZWdhdGl2ZSIpOworICAgICAgICAvKiBTaWduZWQgY29tcGxhaW5zIGFib3V0IC0yKiooTkJJVFMtMSktMT87CisgICAgICAgICAgIHkgc3RpbGwgaGFzIDIqKihOQklUUy0xKS4gKi8KKyAgICAgICAgeCA9IFB5TnVtYmVyX05lZ2F0aXZlKHkpOyAgLyogLSgyKiooTkJJVFMtMSkpICovCisgICAgICAgIFVOQklORCh5KTsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIGZyb20gUHlOdW1iZXJfTmVnYXRpdmUiKTsKIAotCQl5ID0gUHlOdW1iZXJfU3VidHJhY3QoeCwgb25lKTsgLyogLSgyKiooTkJJVFMtMSkpLTEgKi8KLQkJVU5CSU5EKHgpOwotCQlpZiAoeSA9PSBOVUxMKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeU51bWJlcl9TdWJ0cmFjdCIpOworICAgICAgICB5ID0gUHlOdW1iZXJfU3VidHJhY3QoeCwgb25lKTsgLyogLSgyKiooTkJJVFMtMSkpLTEgKi8KKyAgICAgICAgVU5CSU5EKHgpOworICAgICAgICBpZiAoeSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeU51bWJlcl9TdWJ0cmFjdCIpOwogCi0JCW91dCA9IEZfUFlfVE9fUyh5KTsKLQkJaWYgKG91dCAhPSAoVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJIlB5TG9uZ19Bc1hYWCgtMioqKE5CSVRTLTEpLTEpIGRpZG4ndCAiCi0JCQkJImNvbXBsYWluIik7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkiUHlMb25nX0FzWFhYKC0yKiooTkJJVFMtMSktMSkgcmFpc2VkICIKLQkJCQkic29tZXRoaW5nIG90aGVyIHRoYW4gT3ZlcmZsb3dFcnJvciIpOwotCQlQeUVycl9DbGVhcigpOwotCQlVTkJJTkQoeSk7CisgICAgICAgIG91dCA9IEZfUFlfVE9fUyh5KTsKKyAgICAgICAgaWYgKG91dCAhPSAoVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgIlB5TG9uZ19Bc1hYWCgtMioqKE5CSVRTLTEpLTEpIGRpZG4ndCAiCisgICAgICAgICAgICAgICAgImNvbXBsYWluIik7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAiUHlMb25nX0FzWFhYKC0yKiooTkJJVFMtMSktMSkgcmFpc2VkICIKKyAgICAgICAgICAgICAgICAic29tZXRoaW5nIG90aGVyIHRoYW4gT3ZlcmZsb3dFcnJvciIpOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBVTkJJTkQoeSk7CiAKLQkJUHlfWERFQ1JFRih4KTsKLQkJUHlfWERFQ1JFRih5KTsKLQkJUHlfREVDUkVGKG9uZSk7Ci0JfQorICAgICAgICBQeV9YREVDUkVGKHgpOworICAgICAgICBQeV9YREVDUkVGKHkpOworICAgICAgICBQeV9ERUNSRUYob25lKTsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aHJlYWRtb2R1bGUuYyBiL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMKaW5kZXggNjQ5NGY0OS4uMDE2ZDVhMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy90aHJlYWRtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jCkBAIC0xOSwzOSArMTksMzkgQEAKIC8qIExvY2sgb2JqZWN0cyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5VGhyZWFkX3R5cGVfbG9jayBsb2NrX2xvY2s7Ci0JUHlPYmplY3QgKmluX3dlYWtyZWZsaXN0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeVRocmVhZF90eXBlX2xvY2sgbG9ja19sb2NrOworICAgIFB5T2JqZWN0ICppbl93ZWFrcmVmbGlzdDsKIH0gbG9ja29iamVjdDsKIAogc3RhdGljIHZvaWQKIGxvY2tfZGVhbGxvYyhsb2Nrb2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5pbl93ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBzZWxmKTsKLQlpZiAoc2VsZi0+bG9ja19sb2NrICE9IE5VTEwpIHsKLQkJLyogVW5sb2NrIHRoZSBsb2NrIHNvIGl0J3Mgc2FmZSB0byBmcmVlIGl0ICovCi0JCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrX2xvY2ssIDApOwotCQlQeVRocmVhZF9yZWxlYXNlX2xvY2soc2VsZi0+bG9ja19sb2NrKTsKLQkJCi0JCVB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrX2xvY2spOwotCX0KLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgaWYgKHNlbGYtPmluX3dlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIHNlbGYpOworICAgIGlmIChzZWxmLT5sb2NrX2xvY2sgIT0gTlVMTCkgeworICAgICAgICAvKiBVbmxvY2sgdGhlIGxvY2sgc28gaXQncyBzYWZlIHRvIGZyZWUgaXQgKi8KKyAgICAgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHNlbGYtPmxvY2tfbG9jaywgMCk7CisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrX2xvY2spOworCisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrX2xvY2spOworICAgIH0KKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jayhsb2Nrb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgaSA9IDE7CisgICAgaW50IGkgPSAxOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTphY3F1aXJlIiwgJmkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmFjcXVpcmUiLCAmaSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWkgPSBQeVRocmVhZF9hY3F1aXJlX2xvY2soc2VsZi0+bG9ja19sb2NrLCBpKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBpID0gUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHNlbGYtPmxvY2tfbG9jaywgaSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpaSk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFjcXVpcmVfZG9jLApAQCAtNjgsMTYgKzY4LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbG9ja19QeVRocmVhZF9yZWxlYXNlX2xvY2sobG9ja29iamVjdCAqc2VsZikKIHsKLQkvKiBTYW5pdHkgY2hlY2s6IHRoZSBsb2NrIG11c3QgYmUgbG9ja2VkICovCi0JaWYgKFB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrX2xvY2ssIDApKSB7Ci0JCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrX2xvY2spOwotCQlQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJyZWxlYXNlIHVubG9ja2VkIGxvY2siKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFNhbml0eSBjaGVjazogdGhlIGxvY2sgbXVzdCBiZSBsb2NrZWQgKi8KKyAgICBpZiAoUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHNlbGYtPmxvY2tfbG9jaywgMCkpIHsKKyAgICAgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHNlbGYtPmxvY2tfbG9jayk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhUaHJlYWRFcnJvciwgInJlbGVhc2UgdW5sb2NrZWQgbG9jayIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soc2VsZi0+bG9ja19sb2NrKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHNlbGYtPmxvY2tfbG9jayk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIocmVsZWFzZV9kb2MsCkBAIC05MSwxMSArOTEsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NrX2xvY2tlZF9sb2NrKGxvY2tvYmplY3QgKnNlbGYpCiB7Ci0JaWYgKFB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrX2xvY2ssIDApKSB7Ci0JCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrX2xvY2spOwotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDBMKTsKLQl9Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxTCk7CisgICAgaWYgKFB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrX2xvY2ssIDApKSB7CisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrX2xvY2spOworICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDBMKTsKKyAgICB9CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxTCk7CiB9CiAKIFB5RG9jX1NUUlZBUihsb2NrZWRfZG9jLApAQCAtMTA1LDcyICsxMDUsNzIgQEAKIFJldHVybiB3aGV0aGVyIHRoZSBsb2NrIGlzIGluIHRoZSBsb2NrZWQgc3RhdGUuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBsb2NrX21ldGhvZHNbXSA9IHsKLQl7ImFjcXVpcmVfbG9jayIsIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jaywgCi0JIE1FVEhfVkFSQVJHUywgYWNxdWlyZV9kb2N9LAotCXsiYWNxdWlyZSIsICAgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfYWNxdWlyZV9sb2NrLCAKLQkgTUVUSF9WQVJBUkdTLCBhY3F1aXJlX2RvY30sCi0JeyJyZWxlYXNlX2xvY2siLCAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9yZWxlYXNlX2xvY2ssIAotCSBNRVRIX05PQVJHUywgcmVsZWFzZV9kb2N9LAotCXsicmVsZWFzZSIsICAgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfcmVsZWFzZV9sb2NrLCAKLQkgTUVUSF9OT0FSR1MsIHJlbGVhc2VfZG9jfSwKLQl7ImxvY2tlZF9sb2NrIiwgIChQeUNGdW5jdGlvbilsb2NrX2xvY2tlZF9sb2NrLCAgCi0JIE1FVEhfTk9BUkdTLCBsb2NrZWRfZG9jfSwKLQl7ImxvY2tlZCIsICAgICAgIChQeUNGdW5jdGlvbilsb2NrX2xvY2tlZF9sb2NrLCAgCi0JIE1FVEhfTk9BUkdTLCBsb2NrZWRfZG9jfSwKLQl7Il9fZW50ZXJfXyIsICAgIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jaywKLQkgTUVUSF9WQVJBUkdTLCBhY3F1aXJlX2RvY30sCi0JeyJfX2V4aXRfXyIsICAgIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX3JlbGVhc2VfbG9jaywKLQkgTUVUSF9WQVJBUkdTLCByZWxlYXNlX2RvY30sCi0Je05VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiYWNxdWlyZV9sb2NrIiwgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfYWNxdWlyZV9sb2NrLAorICAgICBNRVRIX1ZBUkFSR1MsIGFjcXVpcmVfZG9jfSwKKyAgICB7ImFjcXVpcmUiLCAgICAgIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jaywKKyAgICAgTUVUSF9WQVJBUkdTLCBhY3F1aXJlX2RvY30sCisgICAgeyJyZWxlYXNlX2xvY2siLCAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9yZWxlYXNlX2xvY2ssCisgICAgIE1FVEhfTk9BUkdTLCByZWxlYXNlX2RvY30sCisgICAgeyJyZWxlYXNlIiwgICAgICAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9yZWxlYXNlX2xvY2ssCisgICAgIE1FVEhfTk9BUkdTLCByZWxlYXNlX2RvY30sCisgICAgeyJsb2NrZWRfbG9jayIsICAoUHlDRnVuY3Rpb24pbG9ja19sb2NrZWRfbG9jaywKKyAgICAgTUVUSF9OT0FSR1MsIGxvY2tlZF9kb2N9LAorICAgIHsibG9ja2VkIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfbG9ja2VkX2xvY2ssCisgICAgIE1FVEhfTk9BUkdTLCBsb2NrZWRfZG9jfSwKKyAgICB7Il9fZW50ZXJfXyIsICAgIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jaywKKyAgICAgTUVUSF9WQVJBUkdTLCBhY3F1aXJlX2RvY30sCisgICAgeyJfX2V4aXRfXyIsICAgIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX3JlbGVhc2VfbG9jaywKKyAgICAgTUVUSF9WQVJBUkdTLCByZWxlYXNlX2RvY30sCisgICAge05VTEx9ICAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBMb2NrdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJ0aHJlYWQubG9jayIsCQkJLyp0cF9uYW1lKi8KLQlzaXplb2YobG9ja29iamVjdCksCQkvKnRwX3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcilsb2NrX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JMCwJCQkJLyp0cF9wcmludCovCi0JMCwJICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkwLAkJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkJLyp0cF9yZXByKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KLQkwLAkJCSAgICAgICAgLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgICAgICAvKiB0cF9mbGFncyAqLwotCTAsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCSAgICAgICAgLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCW9mZnNldG9mKGxvY2tvYmplY3QsIGluX3dlYWtyZWZsaXN0KSwJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlsb2NrX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInRocmVhZC5sb2NrIiwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YobG9ja29iamVjdCksICAgICAgICAgICAgICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcilsb2NrX2RlYWxsb2MsICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKGxvY2tvYmplY3QsIGluX3dlYWtyZWZsaXN0KSwgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBsb2NrX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiB9OwogCiBzdGF0aWMgbG9ja29iamVjdCAqCiBuZXdsb2Nrb2JqZWN0KHZvaWQpCiB7Ci0JbG9ja29iamVjdCAqc2VsZjsKLQlzZWxmID0gUHlPYmplY3RfTmV3KGxvY2tvYmplY3QsICZMb2NrdHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+bG9ja19sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCXNlbGYtPmluX3dlYWtyZWZsaXN0ID0gTlVMTDsKLQlpZiAoc2VsZi0+bG9ja19sb2NrID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHNlbGYpOwotCQlQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICBsb2Nrb2JqZWN0ICpzZWxmOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcobG9ja29iamVjdCwgJkxvY2t0eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5sb2NrX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgc2VsZi0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOworICAgIGlmIChzZWxmLT5sb2NrX2xvY2sgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhUaHJlYWRFcnJvciwgImNhbid0IGFsbG9jYXRlIGxvY2siKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiAvKiBUaHJlYWQtbG9jYWwgb2JqZWN0cyAqLwpAQCAtMTc4LDM1MyArMTc4LDM1MyBAQAogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICprZXk7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKmt3OwotCVB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICprdzsKKyAgICBQeU9iamVjdCAqZGljdDsKIH0gbG9jYWxvYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NhbF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCWxvY2Fsb2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICp0ZGljdDsKKyAgICBsb2NhbG9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqdGRpY3Q7CiAKLQlpZiAodHlwZS0+dHBfaW5pdCA9PSBQeUJhc2VPYmplY3RfVHlwZS50cF9pbml0Ci0JICAgICYmICgoYXJncyAmJiBQeU9iamVjdF9Jc1RydWUoYXJncykpCi0JCXx8IChrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgIkluaXRpYWxpemF0aW9uIGFyZ3VtZW50cyBhcmUgbm90IHN1cHBvcnRlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2luaXQgPT0gUHlCYXNlT2JqZWN0X1R5cGUudHBfaW5pdAorICAgICAgICAmJiAoKGFyZ3MgJiYgUHlPYmplY3RfSXNUcnVlKGFyZ3MpKQorICAgICAgICB8fCAoa3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSkpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAiSW5pdGlhbGl6YXRpb24gYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNlbGYgPSAobG9jYWxvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZWxmID0gKGxvY2Fsb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9YSU5DUkVGKGFyZ3MpOwotCXNlbGYtPmFyZ3MgPSBhcmdzOwotCVB5X1hJTkNSRUYoa3cpOwotCXNlbGYtPmt3ID0ga3c7Ci0Jc2VsZi0+ZGljdCA9IE5VTEw7CS8qIG1ha2luZyBzdXJlICovCi0Jc2VsZi0+a2V5ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgidGhyZWFkLmxvY2FsLiVwIiwgc2VsZik7Ci0JaWYgKHNlbGYtPmtleSA9PSBOVUxMKSAKLQkJZ290byBlcnI7CisgICAgUHlfWElOQ1JFRihhcmdzKTsKKyAgICBzZWxmLT5hcmdzID0gYXJnczsKKyAgICBQeV9YSU5DUkVGKGt3KTsKKyAgICBzZWxmLT5rdyA9IGt3OworICAgIHNlbGYtPmRpY3QgPSBOVUxMOyAgICAgICAgICAvKiBtYWtpbmcgc3VyZSAqLworICAgIHNlbGYtPmtleSA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInRocmVhZC5sb2NhbC4lcCIsIHNlbGYpOworICAgIGlmIChzZWxmLT5rZXkgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnI7CiAKLQlzZWxmLT5kaWN0ID0gUHlEaWN0X05ldygpOwotCWlmIChzZWxmLT5kaWN0ID09IE5VTEwpCi0JCWdvdG8gZXJyOworICAgIHNlbGYtPmRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKHNlbGYtPmRpY3QgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnI7CiAKLQl0ZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOwotCWlmICh0ZGljdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiQ291bGRuJ3QgZ2V0IHRocmVhZC1zdGF0ZSBkaWN0aW9uYXJ5Iik7Ci0JCWdvdG8gZXJyOwotCX0KKyAgICB0ZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOworICAgIGlmICh0ZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBnZXQgdGhyZWFkLXN0YXRlIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQogCi0JaWYgKFB5RGljdF9TZXRJdGVtKHRkaWN0LCBzZWxmLT5rZXksIHNlbGYtPmRpY3QpIDwgMCkKLQkJZ290byBlcnI7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtKHRkaWN0LCBzZWxmLT5rZXksIHNlbGYtPmRpY3QpIDwgMCkKKyAgICAgICAgZ290byBlcnI7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIAogICBlcnI6Ci0JUHlfREVDUkVGKHNlbGYpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogbG9jYWxfdHJhdmVyc2UobG9jYWxvYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNlbGYtPmFyZ3MpOwotCVB5X1ZJU0lUKHNlbGYtPmt3KTsKLQlQeV9WSVNJVChzZWxmLT5kaWN0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChzZWxmLT5hcmdzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5rdyk7CisgICAgUHlfVklTSVQoc2VsZi0+ZGljdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGxvY2FsX2NsZWFyKGxvY2Fsb2JqZWN0ICpzZWxmKQogewotCVB5X0NMRUFSKHNlbGYtPmFyZ3MpOwotCVB5X0NMRUFSKHNlbGYtPmt3KTsKLQlQeV9DTEVBUihzZWxmLT5kaWN0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihzZWxmLT5hcmdzKTsKKyAgICBQeV9DTEVBUihzZWxmLT5rdyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZGljdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBsb2NhbF9kZWFsbG9jKGxvY2Fsb2JqZWN0ICpzZWxmKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKLQlpZiAoc2VsZi0+a2V5Ci0JICAgICYmICh0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpKQotCSAgICAmJiB0c3RhdGUtPmludGVycCkgewotCQlmb3IodHN0YXRlID0gUHlJbnRlcnByZXRlclN0YXRlX1RocmVhZEhlYWQodHN0YXRlLT5pbnRlcnApOwotCQkgICAgdHN0YXRlOwotCQkgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9OZXh0KHRzdGF0ZSkpIAotCQkJaWYgKHRzdGF0ZS0+ZGljdCAmJgotCQkJICAgIFB5RGljdF9HZXRJdGVtKHRzdGF0ZS0+ZGljdCwgc2VsZi0+a2V5KSkKLQkJCQlQeURpY3RfRGVsSXRlbSh0c3RhdGUtPmRpY3QsIHNlbGYtPmtleSk7Ci0JfQorICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBpZiAoc2VsZi0+a2V5CisgICAgICAgICYmICh0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpKQorICAgICAgICAmJiB0c3RhdGUtPmludGVycCkgeworICAgICAgICBmb3IodHN0YXRlID0gUHlJbnRlcnByZXRlclN0YXRlX1RocmVhZEhlYWQodHN0YXRlLT5pbnRlcnApOworICAgICAgICAgICAgdHN0YXRlOworICAgICAgICAgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9OZXh0KHRzdGF0ZSkpCisgICAgICAgICAgICBpZiAodHN0YXRlLT5kaWN0ICYmCisgICAgICAgICAgICAgICAgUHlEaWN0X0dldEl0ZW0odHN0YXRlLT5kaWN0LCBzZWxmLT5rZXkpKQorICAgICAgICAgICAgICAgIFB5RGljdF9EZWxJdGVtKHRzdGF0ZS0+ZGljdCwgc2VsZi0+a2V5KTsKKyAgICB9CiAKLQlQeV9YREVDUkVGKHNlbGYtPmtleSk7Ci0JbG9jYWxfY2xlYXIoc2VsZik7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+a2V5KTsKKyAgICBsb2NhbF9jbGVhcihzZWxmKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfbGRpY3QobG9jYWxvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnRkaWN0LCAqbGRpY3Q7CisgICAgUHlPYmplY3QgKnRkaWN0LCAqbGRpY3Q7CiAKLQl0ZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOwotCWlmICh0ZGljdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiQ291bGRuJ3QgZ2V0IHRocmVhZC1zdGF0ZSBkaWN0aW9uYXJ5Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB0ZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOworICAgIGlmICh0ZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBnZXQgdGhyZWFkLXN0YXRlIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbGRpY3QgPSBQeURpY3RfR2V0SXRlbSh0ZGljdCwgc2VsZi0+a2V5KTsKLQlpZiAobGRpY3QgPT0gTlVMTCkgewotCQlsZGljdCA9IFB5RGljdF9OZXcoKTsgLyogd2Ugb3duIGxkaWN0ICovCisgICAgbGRpY3QgPSBQeURpY3RfR2V0SXRlbSh0ZGljdCwgc2VsZi0+a2V5KTsKKyAgICBpZiAobGRpY3QgPT0gTlVMTCkgeworICAgICAgICBsZGljdCA9IFB5RGljdF9OZXcoKTsgLyogd2Ugb3duIGxkaWN0ICovCiAKLQkJaWYgKGxkaWN0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZWxzZSB7Ci0JCQlpbnQgaSA9IFB5RGljdF9TZXRJdGVtKHRkaWN0LCBzZWxmLT5rZXksIGxkaWN0KTsKLQkJCVB5X0RFQ1JFRihsZGljdCk7IC8qIG5vdyBsZGljdCBpcyBib3Jyb3dlZCAqLwotCQkJaWYgKGkgPCAwKSAKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBpZiAobGRpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBpID0gUHlEaWN0X1NldEl0ZW0odGRpY3QsIHNlbGYtPmtleSwgbGRpY3QpOworICAgICAgICAgICAgUHlfREVDUkVGKGxkaWN0KTsgLyogbm93IGxkaWN0IGlzIGJvcnJvd2VkICovCisgICAgICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlQeV9DTEVBUihzZWxmLT5kaWN0KTsKLQkJUHlfSU5DUkVGKGxkaWN0KTsKLQkJc2VsZi0+ZGljdCA9IGxkaWN0OyAvKiBzdGlsbCBib3Jyb3dlZCAqLworICAgICAgICBQeV9DTEVBUihzZWxmLT5kaWN0KTsKKyAgICAgICAgUHlfSU5DUkVGKGxkaWN0KTsKKyAgICAgICAgc2VsZi0+ZGljdCA9IGxkaWN0OyAvKiBzdGlsbCBib3Jyb3dlZCAqLwogCi0JCWlmIChQeV9UWVBFKHNlbGYpLT50cF9pbml0ICE9IFB5QmFzZU9iamVjdF9UeXBlLnRwX2luaXQgJiYKLQkJICAgIFB5X1RZUEUoc2VsZiktPnRwX2luaXQoKFB5T2JqZWN0KilzZWxmLCAKLQkJCQkJICAgc2VsZi0+YXJncywgc2VsZi0+a3cpIDwgMCkgewotCQkJLyogd2UgbmVlZCB0byBnZXQgcmlkIG9mIGxkaWN0IGZyb20gdGhyZWFkIHNvCi0JCQkgICB3ZSBjcmVhdGUgYSBuZXcgb25lIHRoZSBuZXh0IHRpbWUgd2UgZG8gYW4gYXR0cgotCQkJICAgYWNjZXMgKi8KLQkJCVB5RGljdF9EZWxJdGVtKHRkaWN0LCBzZWxmLT5rZXkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJCi0JfQorICAgICAgICBpZiAoUHlfVFlQRShzZWxmKS0+dHBfaW5pdCAhPSBQeUJhc2VPYmplY3RfVHlwZS50cF9pbml0ICYmCisgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9pbml0KChQeU9iamVjdCopc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+YXJncywgc2VsZi0+a3cpIDwgMCkgeworICAgICAgICAgICAgLyogd2UgbmVlZCB0byBnZXQgcmlkIG9mIGxkaWN0IGZyb20gdGhyZWFkIHNvCisgICAgICAgICAgICAgICB3ZSBjcmVhdGUgYSBuZXcgb25lIHRoZSBuZXh0IHRpbWUgd2UgZG8gYW4gYXR0cgorICAgICAgICAgICAgICAgYWNjZXMgKi8KKyAgICAgICAgICAgIFB5RGljdF9EZWxJdGVtKHRkaWN0LCBzZWxmLT5rZXkpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCS8qIFRoZSBjYWxsIHRvIHRwX2luaXQgYWJvdmUgbWF5IGhhdmUgY2F1c2VkIGFub3RoZXIgdGhyZWFkIHRvIHJ1bi4KLQkgICBJbnN0YWxsIG91ciBsZGljdCBhZ2Fpbi4gKi8KLQlpZiAoc2VsZi0+ZGljdCAhPSBsZGljdCkgewotCQlQeV9DTEVBUihzZWxmLT5kaWN0KTsKLQkJUHlfSU5DUkVGKGxkaWN0KTsKLQkJc2VsZi0+ZGljdCA9IGxkaWN0OwotCX0KKyAgICB9CiAKLQlyZXR1cm4gbGRpY3Q7CisgICAgLyogVGhlIGNhbGwgdG8gdHBfaW5pdCBhYm92ZSBtYXkgaGF2ZSBjYXVzZWQgYW5vdGhlciB0aHJlYWQgdG8gcnVuLgorICAgICAgIEluc3RhbGwgb3VyIGxkaWN0IGFnYWluLiAqLworICAgIGlmIChzZWxmLT5kaWN0ICE9IGxkaWN0KSB7CisgICAgICAgIFB5X0NMRUFSKHNlbGYtPmRpY3QpOworICAgICAgICBQeV9JTkNSRUYobGRpY3QpOworICAgICAgICBzZWxmLT5kaWN0ID0gbGRpY3Q7CisgICAgfQorCisgICAgcmV0dXJuIGxkaWN0OwogfQogCiBzdGF0aWMgaW50CiBsb2NhbF9zZXRhdHRybyhsb2NhbG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICpsZGljdDsKLQkKLQlsZGljdCA9IF9sZGljdChzZWxmKTsKLQlpZiAobGRpY3QgPT0gTlVMTCkgCi0JCXJldHVybiAtMTsKKyAgICBQeU9iamVjdCAqbGRpY3Q7CiAKLQlyZXR1cm4gUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSwgdik7CisgICAgbGRpY3QgPSBfbGRpY3Qoc2VsZik7CisgICAgaWYgKGxkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiBQeU9iamVjdF9HZW5lcmljU2V0QXR0cigoUHlPYmplY3QgKilzZWxmLCBuYW1lLCB2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvY2FsX2dldGRpY3QobG9jYWxvYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JaWYgKHNlbGYtPmRpY3QgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJfX2RpY3RfXyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNlbGYtPmRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJfX2RpY3RfXyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoc2VsZi0+ZGljdCk7Ci0JcmV0dXJuIHNlbGYtPmRpY3Q7CisgICAgUHlfSU5DUkVGKHNlbGYtPmRpY3QpOworICAgIHJldHVybiBzZWxmLT5kaWN0OwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgbG9jYWxfZ2V0c2V0W10gPSB7Ci0JeyJfX2RpY3RfXyIsIChnZXR0ZXIpbG9jYWxfZ2V0ZGljdCwgKHNldHRlcilOVUxMLAotCSAiTG9jYWwtZGF0YSBkaWN0aW9uYXJ5IiwgTlVMTH0sCi0Je05VTEx9ICAvKiBTZW50aW5lbCAqLworICAgIHsiX19kaWN0X18iLCAoZ2V0dGVyKWxvY2FsX2dldGRpY3QsIChzZXR0ZXIpTlVMTCwKKyAgICAgIkxvY2FsLWRhdGEgZGljdGlvbmFyeSIsIE5VTEx9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqbG9jYWxfZ2V0YXR0cm8obG9jYWxvYmplY3QgKiwgUHlPYmplY3QgKik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgbG9jYWx0eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCS8qIHRwX25hbWUgICAgICAgICAgICovICJ0aHJlYWQuX2xvY2FsIiwKLQkvKiB0cF9iYXNpY3NpemUgICAgICAqLyBzaXplb2YobG9jYWxvYmplY3QpLAotCS8qIHRwX2l0ZW1zaXplICAgICAgICovIDAsCi0JLyogdHBfZGVhbGxvYyAgICAgICAgKi8gKGRlc3RydWN0b3IpbG9jYWxfZGVhbGxvYywKLQkvKiB0cF9wcmludCAgICAgICAgICAqLyAwLAotCS8qIHRwX2dldGF0dHIgICAgICAgICovIDAsCi0JLyogdHBfc2V0YXR0ciAgICAgICAgKi8gMCwKLQkvKiB0cF9jb21wYXJlICAgICAgICAqLyAwLAotCS8qIHRwX3JlcHIgICAgICAgICAgICovIDAsCi0JLyogdHBfYXNfbnVtYmVyICAgICAgKi8gMCwKLQkvKiB0cF9hc19zZXF1ZW5jZSAgICAqLyAwLAotCS8qIHRwX2FzX21hcHBpbmcgICAgICovIDAsCi0JLyogdHBfaGFzaCAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9jYWxsICAgICAgICAgICAqLyAwLAotCS8qIHRwX3N0ciAgICAgICAgICAgICovIDAsCi0JLyogdHBfZ2V0YXR0cm8gICAgICAgKi8gKGdldGF0dHJvZnVuYylsb2NhbF9nZXRhdHRybywKLQkvKiB0cF9zZXRhdHRybyAgICAgICAqLyAoc2V0YXR0cm9mdW5jKWxvY2FsX3NldGF0dHJvLAotCS8qIHRwX2FzX2J1ZmZlciAgICAgICovIDAsCi0JLyogdHBfZmxhZ3MgICAgICAgICAgKi8gUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwKLQkvKiB0cF9kb2MgICAgICAgICAgICAqLyAiVGhyZWFkLWxvY2FsIGRhdGEiLAotCS8qIHRwX3RyYXZlcnNlICAgICAgICovICh0cmF2ZXJzZXByb2MpbG9jYWxfdHJhdmVyc2UsCi0JLyogdHBfY2xlYXIgICAgICAgICAgKi8gKGlucXVpcnkpbG9jYWxfY2xlYXIsCi0JLyogdHBfcmljaGNvbXBhcmUgICAgKi8gMCwKLQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLyAwLAotCS8qIHRwX2l0ZXIgICAgICAgICAgICovIDAsCi0JLyogdHBfaXRlcm5leHQgICAgICAgKi8gMCwKLQkvKiB0cF9tZXRob2RzICAgICAgICAqLyAwLAotCS8qIHRwX21lbWJlcnMgICAgICAgICovIDAsCi0JLyogdHBfZ2V0c2V0ICAgICAgICAgKi8gbG9jYWxfZ2V0c2V0LAotCS8qIHRwX2Jhc2UgICAgICAgICAgICovIDAsCi0JLyogdHBfZGljdCAgICAgICAgICAgKi8gMCwgLyogaW50ZXJuYWwgdXNlICovCi0JLyogdHBfZGVzY3JfZ2V0ICAgICAgKi8gMCwKLQkvKiB0cF9kZXNjcl9zZXQgICAgICAqLyAwLAotCS8qIHRwX2RpY3RvZmZzZXQgICAgICovIG9mZnNldG9mKGxvY2Fsb2JqZWN0LCBkaWN0KSwKLQkvKiB0cF9pbml0ICAgICAgICAgICAqLyAwLAotCS8qIHRwX2FsbG9jICAgICAgICAgICovIDAsCi0JLyogdHBfbmV3ICAgICAgICAgICAgKi8gbG9jYWxfbmV3LAotCS8qIHRwX2ZyZWUgICAgICAgICAgICovIDAsIC8qIExvdy1sZXZlbCBmcmVlLW1lbSByb3V0aW5lICovCi0JLyogdHBfaXNfZ2MgICAgICAgICAgKi8gMCwgLyogRm9yIFB5T2JqZWN0X0lTX0dDICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgLyogdHBfbmFtZSAgICAgICAgICAgKi8gInRocmVhZC5fbG9jYWwiLAorICAgIC8qIHRwX2Jhc2ljc2l6ZSAgICAgICovIHNpemVvZihsb2NhbG9iamVjdCksCisgICAgLyogdHBfaXRlbXNpemUgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kZWFsbG9jICAgICAgICAqLyAoZGVzdHJ1Y3Rvcilsb2NhbF9kZWFsbG9jLAorICAgIC8qIHRwX3ByaW50ICAgICAgICAgICovIDAsCisgICAgLyogdHBfZ2V0YXR0ciAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9zZXRhdHRyICAgICAgICAqLyAwLAorICAgIC8qIHRwX2NvbXBhcmUgICAgICAgICovIDAsCisgICAgLyogdHBfcmVwciAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9hc19udW1iZXIgICAgICAqLyAwLAorICAgIC8qIHRwX2FzX3NlcXVlbmNlICAgICovIDAsCisgICAgLyogdHBfYXNfbWFwcGluZyAgICAgKi8gMCwKKyAgICAvKiB0cF9oYXNoICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2NhbGwgICAgICAgICAgICovIDAsCisgICAgLyogdHBfc3RyICAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9nZXRhdHRybyAgICAgICAqLyAoZ2V0YXR0cm9mdW5jKWxvY2FsX2dldGF0dHJvLAorICAgIC8qIHRwX3NldGF0dHJvICAgICAgICovIChzZXRhdHRyb2Z1bmMpbG9jYWxfc2V0YXR0cm8sCisgICAgLyogdHBfYXNfYnVmZmVyICAgICAgKi8gMCwKKyAgICAvKiB0cF9mbGFncyAgICAgICAgICAqLyBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAorICAgIC8qIHRwX2RvYyAgICAgICAgICAgICovICJUaHJlYWQtbG9jYWwgZGF0YSIsCisgICAgLyogdHBfdHJhdmVyc2UgICAgICAgKi8gKHRyYXZlcnNlcHJvYylsb2NhbF90cmF2ZXJzZSwKKyAgICAvKiB0cF9jbGVhciAgICAgICAgICAqLyAoaW5xdWlyeSlsb2NhbF9jbGVhciwKKyAgICAvKiB0cF9yaWNoY29tcGFyZSAgICAqLyAwLAorICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovIDAsCisgICAgLyogdHBfaXRlciAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9pdGVybmV4dCAgICAgICAqLyAwLAorICAgIC8qIHRwX21ldGhvZHMgICAgICAgICovIDAsCisgICAgLyogdHBfbWVtYmVycyAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9nZXRzZXQgICAgICAgICAqLyBsb2NhbF9nZXRzZXQsCisgICAgLyogdHBfYmFzZSAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kaWN0ICAgICAgICAgICAqLyAwLCAvKiBpbnRlcm5hbCB1c2UgKi8KKyAgICAvKiB0cF9kZXNjcl9nZXQgICAgICAqLyAwLAorICAgIC8qIHRwX2Rlc2NyX3NldCAgICAgICovIDAsCisgICAgLyogdHBfZGljdG9mZnNldCAgICAgKi8gb2Zmc2V0b2YobG9jYWxvYmplY3QsIGRpY3QpLAorICAgIC8qIHRwX2luaXQgICAgICAgICAgICovIDAsCisgICAgLyogdHBfYWxsb2MgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9uZXcgICAgICAgICAgICAqLyBsb2NhbF9uZXcsCisgICAgLyogdHBfZnJlZSAgICAgICAgICAgKi8gMCwgLyogTG93LWxldmVsIGZyZWUtbWVtIHJvdXRpbmUgKi8KKyAgICAvKiB0cF9pc19nYyAgICAgICAgICAqLyAwLCAvKiBGb3IgUHlPYmplY3RfSVNfR0MgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NhbF9nZXRhdHRybyhsb2NhbG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKmxkaWN0LCAqdmFsdWU7CisgICAgUHlPYmplY3QgKmxkaWN0LCAqdmFsdWU7CiAKLQlsZGljdCA9IF9sZGljdChzZWxmKTsKLQlpZiAobGRpY3QgPT0gTlVMTCkgCi0JCXJldHVybiBOVUxMOworICAgIGxkaWN0ID0gX2xkaWN0KHNlbGYpOworICAgIGlmIChsZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeV9UWVBFKHNlbGYpICE9ICZsb2NhbHR5cGUpCi0JCS8qIHVzZSBnZW5lcmljIGxvb2t1cCBmb3Igc3VidHlwZXMgKi8KLQkJcmV0dXJuIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIGlmIChQeV9UWVBFKHNlbGYpICE9ICZsb2NhbHR5cGUpCisgICAgICAgIC8qIHVzZSBnZW5lcmljIGxvb2t1cCBmb3Igc3VidHlwZXMgKi8KKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogCi0JLyogT3B0aW1pemF0aW9uOiBqdXN0IGxvb2sgaW4gZGljdCBvdXJzZWx2ZXMgKi8KLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKGxkaWN0LCBuYW1lKTsKLQlpZiAodmFsdWUgPT0gTlVMTCkgCi0JCS8qIEZhbGwgYmFjayBvbiBnZW5lcmljIHRvIGdldCBfX2NsYXNzX18gYW5kIF9fZGljdF9fICovCi0JCXJldHVybiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICAvKiBPcHRpbWl6YXRpb246IGp1c3QgbG9vayBpbiBkaWN0IG91cnNlbHZlcyAqLworICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW0obGRpY3QsIG5hbWUpOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAvKiBGYWxsIGJhY2sgb24gZ2VuZXJpYyB0byBnZXQgX19jbGFzc19fIGFuZCBfX2RpY3RfXyAqLworICAgICAgICByZXR1cm4gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiAKLQlQeV9JTkNSRUYodmFsdWUpOwotCXJldHVybiB2YWx1ZTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKIH0KIAogLyogTW9kdWxlIGZ1bmN0aW9ucyAqLwogCiBzdHJ1Y3QgYm9vdHN0YXRlIHsKLQlQeUludGVycHJldGVyU3RhdGUgKmludGVycDsKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqa2V5dzsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGU7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnA7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmtleXc7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwogfTsKIAogc3RhdGljIHZvaWQKIHRfYm9vdHN0cmFwKHZvaWQgKmJvb3RfcmF3KQogewotCXN0cnVjdCBib290c3RhdGUgKmJvb3QgPSAoc3RydWN0IGJvb3RzdGF0ZSAqKSBib290X3JhdzsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGU7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBzdHJ1Y3QgYm9vdHN0YXRlICpib290ID0gKHN0cnVjdCBib290c3RhdGUgKikgYm9vdF9yYXc7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQl0c3RhdGUgPSBib290LT50c3RhdGU7Ci0JdHN0YXRlLT50aHJlYWRfaWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7Ci0JX1B5VGhyZWFkU3RhdGVfSW5pdCh0c3RhdGUpOwotCVB5RXZhbF9BY3F1aXJlVGhyZWFkKHRzdGF0ZSk7Ci0JbmJfdGhyZWFkcysrOwotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKAotCQlib290LT5mdW5jLCBib290LT5hcmdzLCBib290LT5rZXl3KTsKLQlpZiAocmVzID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3lzdGVtRXhpdCkpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlIHsKLQkJCVB5T2JqZWN0ICpmaWxlOwotCQkJUHlTeXNfV3JpdGVTdGRlcnIoCi0JCQkJIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gdGhyZWFkIHN0YXJ0ZWQgYnkgIik7Ci0JCQlmaWxlID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKLQkJCWlmIChmaWxlKQotCQkJCVB5RmlsZV9Xcml0ZU9iamVjdChib290LT5mdW5jLCBmaWxlLCAwKTsKLQkJCWVsc2UKLQkJCQlQeU9iamVjdF9QcmludChib290LT5mdW5jLCBzdGRlcnIsIDApOwotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIlxuIik7Ci0JCQlQeUVycl9QcmludEV4KDApOwotCQl9Ci0JfQotCWVsc2UKLQkJUHlfREVDUkVGKHJlcyk7Ci0JUHlfREVDUkVGKGJvb3QtPmZ1bmMpOwotCVB5X0RFQ1JFRihib290LT5hcmdzKTsKLQlQeV9YREVDUkVGKGJvb3QtPmtleXcpOwotCVB5TWVtX0RFTChib290X3Jhdyk7Ci0JbmJfdGhyZWFkcy0tOwotCVB5VGhyZWFkU3RhdGVfQ2xlYXIodHN0YXRlKTsKLQlQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQoKTsKLQlQeVRocmVhZF9leGl0X3RocmVhZCgpOworICAgIHRzdGF0ZSA9IGJvb3QtPnRzdGF0ZTsKKyAgICB0c3RhdGUtPnRocmVhZF9pZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBfUHlUaHJlYWRTdGF0ZV9Jbml0KHRzdGF0ZSk7CisgICAgUHlFdmFsX0FjcXVpcmVUaHJlYWQodHN0YXRlKTsKKyAgICBuYl90aHJlYWRzKys7CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoCisgICAgICAgIGJvb3QtPmZ1bmMsIGJvb3QtPmFyZ3MsIGJvb3QtPmtleXcpOworICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKmZpbGU7CisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigKKyAgICAgICAgICAgICAgICAiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiB0aHJlYWQgc3RhcnRlZCBieSAiKTsKKyAgICAgICAgICAgIGZpbGUgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOworICAgICAgICAgICAgaWYgKGZpbGUpCisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlT2JqZWN0KGJvb3QtPmZ1bmMsIGZpbGUsIDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5T2JqZWN0X1ByaW50KGJvb3QtPmZ1bmMsIHN0ZGVyciwgMCk7CisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiXG4iKTsKKyAgICAgICAgICAgIFB5RXJyX1ByaW50RXgoMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICBQeV9ERUNSRUYoYm9vdC0+ZnVuYyk7CisgICAgUHlfREVDUkVGKGJvb3QtPmFyZ3MpOworICAgIFB5X1hERUNSRUYoYm9vdC0+a2V5dyk7CisgICAgUHlNZW1fREVMKGJvb3RfcmF3KTsKKyAgICBuYl90aHJlYWRzLS07CisgICAgUHlUaHJlYWRTdGF0ZV9DbGVhcih0c3RhdGUpOworICAgIFB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudCgpOworICAgIFB5VGhyZWFkX2V4aXRfdGhyZWFkKCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aHJlYWRfUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmZhcmdzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqYXJncywgKmtleXcgPSBOVUxMOwotCXN0cnVjdCBib290c3RhdGUgKmJvb3Q7Ci0JbG9uZyBpZGVudDsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3MsICprZXl3ID0gTlVMTDsKKyAgICBzdHJ1Y3QgYm9vdHN0YXRlICpib290OworICAgIGxvbmcgaWRlbnQ7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGZhcmdzLCAic3RhcnRfbmV3X3RocmVhZCIsIDIsIDMsCi0JCSAgICAgICAgICAgICAgICZmdW5jLCAmYXJncywgJmtleXcpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZmlyc3QgYXJnIG11c3QgYmUgY2FsbGFibGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSIybmQgYXJnIG11c3QgYmUgYSB0dXBsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGtleXcgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXcpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm9wdGlvbmFsIDNyZCBhcmcgbXVzdCBiZSBhIGRpY3Rpb25hcnkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJvb3QgPSBQeU1lbV9ORVcoc3RydWN0IGJvb3RzdGF0ZSwgMSk7Ci0JaWYgKGJvb3QgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JYm9vdC0+aW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOwotCWJvb3QtPmZ1bmMgPSBmdW5jOwotCWJvb3QtPmFyZ3MgPSBhcmdzOwotCWJvb3QtPmtleXcgPSBrZXl3OwotCWJvb3QtPnRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1ByZWFsbG9jKGJvb3QtPmludGVycCk7Ci0JaWYgKGJvb3QtPnRzdGF0ZSA9PSBOVUxMKSB7Ci0JCVB5TWVtX0RFTChib290KTsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCVB5X0lOQ1JFRihmdW5jKTsKLQlQeV9JTkNSRUYoYXJncyk7Ci0JUHlfWElOQ1JFRihrZXl3KTsKLQlQeUV2YWxfSW5pdFRocmVhZHMoKTsgLyogU3RhcnQgdGhlIGludGVycHJldGVyJ3MgdGhyZWFkLWF3YXJlbmVzcyAqLwotCWlkZW50ID0gUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh0X2Jvb3RzdHJhcCwgKHZvaWQqKSBib290KTsKLQlpZiAoaWRlbnQgPT0gLTEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLCAiY2FuJ3Qgc3RhcnQgbmV3IHRocmVhZCIpOwotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQkJUHlfWERFQ1JFRihrZXl3KTsKLQkJUHlUaHJlYWRTdGF0ZV9DbGVhcihib290LT50c3RhdGUpOwotCQlQeU1lbV9ERUwoYm9vdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoaWRlbnQpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoZmFyZ3MsICJzdGFydF9uZXdfdGhyZWFkIiwgMiwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZmdW5jLCAmYXJncywgJmtleXcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmaXJzdCBhcmcgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiMm5kIGFyZyBtdXN0IGJlIGEgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChrZXl3ICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrZXl3KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsIDNyZCBhcmcgbXVzdCBiZSBhIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGJvb3QgPSBQeU1lbV9ORVcoc3RydWN0IGJvb3RzdGF0ZSwgMSk7CisgICAgaWYgKGJvb3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgYm9vdC0+aW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOworICAgIGJvb3QtPmZ1bmMgPSBmdW5jOworICAgIGJvb3QtPmFyZ3MgPSBhcmdzOworICAgIGJvb3QtPmtleXcgPSBrZXl3OworICAgIGJvb3QtPnRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1ByZWFsbG9jKGJvb3QtPmludGVycCk7CisgICAgaWYgKGJvb3QtPnRzdGF0ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0RFTChib290KTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgUHlfWElOQ1JFRihrZXl3KTsKKyAgICBQeUV2YWxfSW5pdFRocmVhZHMoKTsgLyogU3RhcnQgdGhlIGludGVycHJldGVyJ3MgdGhyZWFkLWF3YXJlbmVzcyAqLworICAgIGlkZW50ID0gUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh0X2Jvb3RzdHJhcCwgKHZvaWQqKSBib290KTsKKyAgICBpZiAoaWRlbnQgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLCAiY2FuJ3Qgc3RhcnQgbmV3IHRocmVhZCIpOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgUHlfWERFQ1JFRihrZXl3KTsKKyAgICAgICAgUHlUaHJlYWRTdGF0ZV9DbGVhcihib290LT50c3RhdGUpOworICAgICAgICBQeU1lbV9ERUwoYm9vdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoaWRlbnQpOwogfQogCiBQeURvY19TVFJWQVIoc3RhcnRfbmV3X2RvYywKQEAgLTU0MSw4ICs1NDEsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRocmVhZF9QeVRocmVhZF9leGl0X3RocmVhZChQeU9iamVjdCAqc2VsZikKIHsKLQlQeUVycl9TZXROb25lKFB5RXhjX1N5c3RlbUV4aXQpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3lzdGVtRXhpdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihleGl0X2RvYywKQEAgLTU1NSw5ICs1NTUsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRocmVhZF9QeVRocmVhZF9pbnRlcnJ1cHRfbWFpbihQeU9iamVjdCAqIHNlbGYpCiB7Ci0JUHlFcnJfU2V0SW50ZXJydXB0KCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5RXJyX1NldEludGVycnVwdCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGludGVycnVwdF9kb2MsCkBAIC01NzIsNyArNTcyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aHJlYWRfUHlUaHJlYWRfYWxsb2NhdGVfbG9jayhQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIG5ld2xvY2tvYmplY3QoKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG5ld2xvY2tvYmplY3QoKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFsbG9jYXRlX2RvYywKQEAgLTU4NCwxMyArNTg0LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGhyZWFkX2dldF9pZGVudChQeU9iamVjdCAqc2VsZikKIHsKLQlsb25nIGlkZW50OwotCWlkZW50ID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCWlmIChpZGVudCA9PSAtMSkgewotCQlQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJubyBjdXJyZW50IHRocmVhZCBpZGVudCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGlkZW50KTsKKyAgICBsb25nIGlkZW50OworICAgIGlkZW50ID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIGlmIChpZGVudCA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJubyBjdXJyZW50IHRocmVhZCBpZGVudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGlkZW50KTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldF9pZGVudF9kb2MsCkBAIC02MDcsNyArNjA3LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aHJlYWRfX2NvdW50KFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhuYl90aHJlYWRzKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobmJfdGhyZWFkcyk7CiB9CiAKIFB5RG9jX1NUUlZBUihfY291bnRfZG9jLApAQCAtNjI1LDM1ICs2MjUsMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aHJlYWRfc3RhY2tfc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2l6ZV90IG9sZF9zaXplOwotCVB5X3NzaXplX3QgbmV3X3NpemUgPSAwOwotCWludCByYzsKKyAgICBzaXplX3Qgb2xkX3NpemU7CisgICAgUHlfc3NpemVfdCBuZXdfc2l6ZSA9IDA7CisgICAgaW50IHJjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpzdGFja19zaXplIiwgJm5ld19zaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpzdGFja19zaXplIiwgJm5ld19zaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobmV3X3NpemUgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzaXplIG11c3QgYmUgMCBvciBhIHBvc2l0aXZlIHZhbHVlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAobmV3X3NpemUgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgbXVzdCBiZSAwIG9yIGEgcG9zaXRpdmUgdmFsdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jb2xkX3NpemUgPSBQeVRocmVhZF9nZXRfc3RhY2tzaXplKCk7CisgICAgb2xkX3NpemUgPSBQeVRocmVhZF9nZXRfc3RhY2tzaXplKCk7CiAKLQlyYyA9IFB5VGhyZWFkX3NldF9zdGFja3NpemUoKHNpemVfdCkgbmV3X3NpemUpOwotCWlmIChyYyA9PSAtMSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgInNpemUgbm90IHZhbGlkOiAlemQgYnl0ZXMiLAotCQkJICAgICBuZXdfc2l6ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocmMgPT0gLTIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLAotCQkJCSJzZXR0aW5nIHN0YWNrIHNpemUgbm90IHN1cHBvcnRlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcmMgPSBQeVRocmVhZF9zZXRfc3RhY2tzaXplKChzaXplX3QpIG5ld19zaXplKTsKKyAgICBpZiAocmMgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAic2l6ZSBub3QgdmFsaWQ6ICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICBuZXdfc2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocmMgPT0gLTIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNldHRpbmcgc3RhY2sgc2l6ZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoUHlfc3NpemVfdCkgb2xkX3NpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoUHlfc3NpemVfdCkgb2xkX3NpemUpOwogfQogCiBQeURvY19TVFJWQVIoc3RhY2tfc2l6ZV9kb2MsCkBAIC02NzcsMzAgKzY3NywzMCBAQAogdGhlIHN1Z2dlc3RlZCBhcHByb2FjaCBpbiB0aGUgYWJzZW5jZSBvZiBtb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHRocmVhZF9tZXRob2RzW10gPSB7Ci0JeyJzdGFydF9uZXdfdGhyZWFkIiwJKFB5Q0Z1bmN0aW9uKXRocmVhZF9QeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkLAotCSAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKLQkJCQlzdGFydF9uZXdfZG9jfSwKLQl7InN0YXJ0X25ldyIsCQkoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQsIAotCSAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKLQkJCQlzdGFydF9uZXdfZG9jfSwKLQl7ImFsbG9jYXRlX2xvY2siLAkoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2FsbG9jYXRlX2xvY2ssIAotCSBNRVRIX05PQVJHUywgYWxsb2NhdGVfZG9jfSwKLQl7ImFsbG9jYXRlIiwJCShQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfYWxsb2NhdGVfbG9jaywgCi0JIE1FVEhfTk9BUkdTLCBhbGxvY2F0ZV9kb2N9LAotCXsiZXhpdF90aHJlYWQiLAkJKFB5Q0Z1bmN0aW9uKXRocmVhZF9QeVRocmVhZF9leGl0X3RocmVhZCwgCi0JIE1FVEhfTk9BUkdTLCBleGl0X2RvY30sCi0JeyJleGl0IiwJCShQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfZXhpdF90aHJlYWQsIAotCSBNRVRIX05PQVJHUywgZXhpdF9kb2N9LAotCXsiaW50ZXJydXB0X21haW4iLAkoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2ludGVycnVwdF9tYWluLAotCSBNRVRIX05PQVJHUywgaW50ZXJydXB0X2RvY30sCi0JeyJnZXRfaWRlbnQiLAkJKFB5Q0Z1bmN0aW9uKXRocmVhZF9nZXRfaWRlbnQsIAotCSBNRVRIX05PQVJHUywgZ2V0X2lkZW50X2RvY30sCi0JeyJfY291bnQiLAkJKFB5Q0Z1bmN0aW9uKXRocmVhZF9fY291bnQsIAotCSBNRVRIX05PQVJHUywgX2NvdW50X2RvY30sCi0JeyJzdGFja19zaXplIiwJCShQeUNGdW5jdGlvbil0aHJlYWRfc3RhY2tfc2l6ZSwKLQkJCQlNRVRIX1ZBUkFSR1MsCi0JCQkJc3RhY2tfc2l6ZV9kb2N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsic3RhcnRfbmV3X3RocmVhZCIsICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X25ld19kb2N9LAorICAgIHsic3RhcnRfbmV3IiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X25ld19kb2N9LAorICAgIHsiYWxsb2NhdGVfbG9jayIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2FsbG9jYXRlX2xvY2ssCisgICAgIE1FVEhfTk9BUkdTLCBhbGxvY2F0ZV9kb2N9LAorICAgIHsiYWxsb2NhdGUiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2FsbG9jYXRlX2xvY2ssCisgICAgIE1FVEhfTk9BUkdTLCBhbGxvY2F0ZV9kb2N9LAorICAgIHsiZXhpdF90aHJlYWQiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2V4aXRfdGhyZWFkLAorICAgICBNRVRIX05PQVJHUywgZXhpdF9kb2N9LAorICAgIHsiZXhpdCIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2V4aXRfdGhyZWFkLAorICAgICBNRVRIX05PQVJHUywgZXhpdF9kb2N9LAorICAgIHsiaW50ZXJydXB0X21haW4iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2ludGVycnVwdF9tYWluLAorICAgICBNRVRIX05PQVJHUywgaW50ZXJydXB0X2RvY30sCisgICAgeyJnZXRfaWRlbnQiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfZ2V0X2lkZW50LAorICAgICBNRVRIX05PQVJHUywgZ2V0X2lkZW50X2RvY30sCisgICAgeyJfY291bnQiLCAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfX2NvdW50LAorICAgICBNRVRIX05PQVJHUywgX2NvdW50X2RvY30sCisgICAgeyJzdGFja19zaXplIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfc3RhY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfc2l6ZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtNzI1LDMzICs3MjUsMzMgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0dGhyZWFkKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCQotCS8qIEluaXRpYWxpemUgdHlwZXM6ICovCi0JaWYgKFB5VHlwZV9SZWFkeSgmbG9jYWx0eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CiAKLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KLQltID0gUHlfSW5pdE1vZHVsZTMoInRocmVhZCIsIHRocmVhZF9tZXRob2RzLCB0aHJlYWRfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgLyogSW5pdGlhbGl6ZSB0eXBlczogKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZsb2NhbHR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIGEgc3ltYm9saWMgY29uc3RhbnQgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlUaHJlYWRFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigidGhyZWFkLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgVGhyZWFkRXJyb3IpOwotCUxvY2t0eXBlLnRwX2RvYyA9IGxvY2tfZG9jOwotCWlmIChQeVR5cGVfUmVhZHkoJkxvY2t0eXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJkxvY2t0eXBlKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTG9ja1R5cGUiLCAoUHlPYmplY3QgKikmTG9ja3R5cGUpOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygidGhyZWFkIiwgdGhyZWFkX21ldGhvZHMsIHRocmVhZF9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVB5X0lOQ1JFRigmbG9jYWx0eXBlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfbG9jYWwiLCAoUHlPYmplY3QgKikmbG9jYWx0eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICAvKiBBZGQgYSBzeW1ib2xpYyBjb25zdGFudCAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFRocmVhZEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJ0aHJlYWQuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBUaHJlYWRFcnJvcik7CisgICAgTG9ja3R5cGUudHBfZG9jID0gbG9ja19kb2M7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmTG9ja3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmTG9ja3R5cGUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMb2NrVHlwZSIsIChQeU9iamVjdCAqKSZMb2NrdHlwZSk7CiAKLQluYl90aHJlYWRzID0gMDsKKyAgICBQeV9JTkNSRUYoJmxvY2FsdHlwZSk7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCAiX2xvY2FsIiwgKFB5T2JqZWN0ICopJmxvY2FsdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQkvKiBJbml0aWFsaXplIHRoZSBDIHRocmVhZCBsaWJyYXJ5ICovCi0JUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBuYl90aHJlYWRzID0gMDsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIEMgdGhyZWFkIGxpYnJhcnkgKi8KKyAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwppbmRleCA0NGNiOWM4Li43OGRlYzdjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwpAQCAtNDYsMTIgKzQ2LDEyIEBACiBzdGF0aWMgSEFORExFIGhJbnRlcnJ1cHRFdmVudCA9IE5VTEw7CiBzdGF0aWMgQk9PTCBXSU5BUEkgUHlDdHJsSGFuZGxlcihEV09SRCBkd0N0cmxUeXBlKQogewotCVNldEV2ZW50KGhJbnRlcnJ1cHRFdmVudCk7Ci0JLyogYWxsb3cgb3RoZXIgZGVmYXVsdCBoYW5kbGVycyB0byBiZSBjYWxsZWQuCi0JICAgRGVmYXVsdCBQeXRob24gaGFuZGxlciB3aWxsIHNldHVwIHRoZQotCSAgIEtleWJvYXJkSW50ZXJydXB0IGV4Y2VwdGlvbi4KLQkqLwotCXJldHVybiBGQUxTRTsKKyAgICBTZXRFdmVudChoSW50ZXJydXB0RXZlbnQpOworICAgIC8qIGFsbG93IG90aGVyIGRlZmF1bHQgaGFuZGxlcnMgdG8gYmUgY2FsbGVkLgorICAgICAgIERlZmF1bHQgUHl0aG9uIGhhbmRsZXIgd2lsbCBzZXR1cCB0aGUKKyAgICAgICBLZXlib2FyZEludGVycnVwdCBleGNlcHRpb24uCisgICAgKi8KKyAgICByZXR1cm4gRkFMU0U7CiB9CiBzdGF0aWMgbG9uZyBtYWluX3RocmVhZDsKIApAQCAtMTAyLDM4ICsxMDIsMzggQEAKIHRpbWVfdAogX1B5VGltZV9Eb3VibGVUb1RpbWV0KGRvdWJsZSB4KQogewotCXRpbWVfdCByZXN1bHQ7Ci0JZG91YmxlIGRpZmY7CisgICAgdGltZV90IHJlc3VsdDsKKyAgICBkb3VibGUgZGlmZjsKIAotCXJlc3VsdCA9ICh0aW1lX3QpeDsKLQkvKiBIb3cgbXVjaCBpbmZvIGRpZCB3ZSBsb3NlPyAgdGltZV90IG1heSBiZSBhbiBpbnRlZ3JhbCBvcgotCSAqIGZsb2F0aW5nIHR5cGUsIGFuZCB3ZSBkb24ndCBrbm93IHdoaWNoLiAgSWYgaXQncyBpbnRlZ3JhbCwKLQkgKiB3ZSBkb24ndCBrbm93IHdoZXRoZXIgQyB0cnVuY2F0ZXMsIHJvdW5kcywgcmV0dXJucyB0aGUgZmxvb3IsCi0JICogZXRjLiAgSWYgd2UgbG9zdCBhIHNlY29uZCBvciBtb3JlLCB0aGUgQyByb3VuZGluZyBpcwotCSAqIHVucmVhc29uYWJsZSwgb3IgdGhlIGlucHV0IGp1c3QgZG9lc24ndCBmaXQgaW4gYSB0aW1lX3Q7Ci0JICogY2FsbCBpdCBhbiBlcnJvciByZWdhcmRsZXNzLiAgTm90ZSB0aGF0IHRoZSBvcmlnaW5hbCBjYXN0IHRvCi0JICogdGltZV90IGNhbiBjYXVzZSBhIEMgZXJyb3IgdG9vLCBidXQgbm90aGluZyB3ZSBjYW4gZG8gdG8KLQkgKiB3b3JtIGFyb3VuZCB0aGF0LgotCSAqLwotCWRpZmYgPSB4IC0gKGRvdWJsZSlyZXN1bHQ7Ci0JaWYgKGRpZmYgPD0gLTEuMCB8fCBkaWZmID49IDEuMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgb3V0IG9mIHJhbmdlIGZvciBwbGF0Zm9ybSB0aW1lX3QiKTsKLQkJcmVzdWx0ID0gKHRpbWVfdCktMTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSAodGltZV90KXg7CisgICAgLyogSG93IG11Y2ggaW5mbyBkaWQgd2UgbG9zZT8gIHRpbWVfdCBtYXkgYmUgYW4gaW50ZWdyYWwgb3IKKyAgICAgKiBmbG9hdGluZyB0eXBlLCBhbmQgd2UgZG9uJ3Qga25vdyB3aGljaC4gIElmIGl0J3MgaW50ZWdyYWwsCisgICAgICogd2UgZG9uJ3Qga25vdyB3aGV0aGVyIEMgdHJ1bmNhdGVzLCByb3VuZHMsIHJldHVybnMgdGhlIGZsb29yLAorICAgICAqIGV0Yy4gIElmIHdlIGxvc3QgYSBzZWNvbmQgb3IgbW9yZSwgdGhlIEMgcm91bmRpbmcgaXMKKyAgICAgKiB1bnJlYXNvbmFibGUsIG9yIHRoZSBpbnB1dCBqdXN0IGRvZXNuJ3QgZml0IGluIGEgdGltZV90OworICAgICAqIGNhbGwgaXQgYW4gZXJyb3IgcmVnYXJkbGVzcy4gIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgY2FzdCB0bworICAgICAqIHRpbWVfdCBjYW4gY2F1c2UgYSBDIGVycm9yIHRvbywgYnV0IG5vdGhpbmcgd2UgY2FuIGRvIHRvCisgICAgICogd29ybSBhcm91bmQgdGhhdC4KKyAgICAgKi8KKyAgICBkaWZmID0geCAtIChkb3VibGUpcmVzdWx0OworICAgIGlmIChkaWZmIDw9IC0xLjAgfHwgZGlmZiA+PSAxLjApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIG91dCBvZiByYW5nZSBmb3IgcGxhdGZvcm0gdGltZV90Iik7CisgICAgICAgIHJlc3VsdCA9ICh0aW1lX3QpLTE7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3RpbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JZG91YmxlIHNlY3M7Ci0Jc2VjcyA9IGZsb2F0dGltZSgpOwotCWlmIChzZWNzID09IDAuMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHNlY3MpOworICAgIGRvdWJsZSBzZWNzOworICAgIHNlY3MgPSBmbG9hdHRpbWUoKTsKKyAgICBpZiAoc2VjcyA9PSAwLjApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShzZWNzKTsKIH0KIAogUHlEb2NfU1RSVkFSKHRpbWVfZG9jLApAQCAtMTU1LDcgKzE1NSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9jbG9jayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKCgoZG91YmxlKWNsb2NrKCkpIC8gQ0xPQ0tTX1BFUl9TRUMpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKChkb3VibGUpY2xvY2soKSkgLyBDTE9DS1NfUEVSX1NFQyk7CiB9CiAjZW5kaWYgLyogSEFWRV9DTE9DSyAqLwogCkBAIC0xNjQsMjUgKzE2NCwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfY2xvY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0Jc3RhdGljIExBUkdFX0lOVEVHRVIgY3RyU3RhcnQ7Ci0Jc3RhdGljIGRvdWJsZSBkaXZpc29yID0gMC4wOwotCUxBUkdFX0lOVEVHRVIgbm93OwotCWRvdWJsZSBkaWZmOworICAgIHN0YXRpYyBMQVJHRV9JTlRFR0VSIGN0clN0YXJ0OworICAgIHN0YXRpYyBkb3VibGUgZGl2aXNvciA9IDAuMDsKKyAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgICBkb3VibGUgZGlmZjsKIAotCWlmIChkaXZpc29yID09IDAuMCkgewotCQlMQVJHRV9JTlRFR0VSIGZyZXE7Ci0JCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZjdHJTdGFydCk7Ci0JCWlmICghUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcSkgfHwgZnJlcS5RdWFkUGFydCA9PSAwKSB7Ci0JCQkvKiBVbmxpa2VseSB0byBoYXBwZW4gLSB0aGlzIHdvcmtzIG9uIGFsbCBpbnRlbAotCQkJICAgbWFjaGluZXMgYXQgbGVhc3QhICBSZXZlcnQgdG8gY2xvY2soKSAqLwotCQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoKGRvdWJsZSljbG9jaygpKSAvCi0JCQkJCQkgIENMT0NLU19QRVJfU0VDKTsKLQkJfQotCQlkaXZpc29yID0gKGRvdWJsZSlmcmVxLlF1YWRQYXJ0OwotCX0KLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbm93KTsKLQlkaWZmID0gKGRvdWJsZSkobm93LlF1YWRQYXJ0IC0gY3RyU3RhcnQuUXVhZFBhcnQpOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZGlmZiAvIGRpdmlzb3IpOworICAgIGlmIChkaXZpc29yID09IDAuMCkgeworICAgICAgICBMQVJHRV9JTlRFR0VSIGZyZXE7CisgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZjdHJTdGFydCk7CisgICAgICAgIGlmICghUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcSkgfHwgZnJlcS5RdWFkUGFydCA9PSAwKSB7CisgICAgICAgICAgICAvKiBVbmxpa2VseSB0byBoYXBwZW4gLSB0aGlzIHdvcmtzIG9uIGFsbCBpbnRlbAorICAgICAgICAgICAgICAgbWFjaGluZXMgYXQgbGVhc3QhICBSZXZlcnQgdG8gY2xvY2soKSAqLworICAgICAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoKGRvdWJsZSljbG9jaygpKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT0NLU19QRVJfU0VDKTsKKyAgICAgICAgfQorICAgICAgICBkaXZpc29yID0gKGRvdWJsZSlmcmVxLlF1YWRQYXJ0OworICAgIH0KKyAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbm93KTsKKyAgICBkaWZmID0gKGRvdWJsZSkobm93LlF1YWRQYXJ0IC0gY3RyU3RhcnQuUXVhZFBhcnQpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZGlmZiAvIGRpdmlzb3IpOwogfQogCiAjZGVmaW5lIEhBVkVfQ0xPQ0sgLyogU28gaXQgZ2V0cyBpbmNsdWRlZCBpbiB0aGUgbWV0aG9kcyAqLwpAQCAtMjAwLDEzICsyMDAsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3NsZWVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGUgc2VjczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6c2xlZXAiLCAmc2VjcykpCi0JCXJldHVybiBOVUxMOwotCWlmIChmbG9hdHNsZWVwKHNlY3MpICE9IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBkb3VibGUgc2VjczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6c2xlZXAiLCAmc2VjcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChmbG9hdHNsZWVwKHNlY3MpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNsZWVwX2RvYywKQEAgLTIxNiwyMyArMjE2LDIzIEBACiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBmb3Igc3Vic2Vjb25kIHByZWNpc2lvbi4iKTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgc3RydWN0X3RpbWVfdHlwZV9maWVsZHNbXSA9IHsKLQl7InRtX3llYXIiLCBOVUxMfSwKLQl7InRtX21vbiIsIE5VTEx9LAotCXsidG1fbWRheSIsIE5VTEx9LAotCXsidG1faG91ciIsIE5VTEx9LAotCXsidG1fbWluIiwgTlVMTH0sCi0JeyJ0bV9zZWMiLCBOVUxMfSwKLQl7InRtX3dkYXkiLCBOVUxMfSwKLQl7InRtX3lkYXkiLCBOVUxMfSwKLQl7InRtX2lzZHN0IiwgTlVMTH0sCi0JezB9CisgICAgeyJ0bV95ZWFyIiwgTlVMTH0sCisgICAgeyJ0bV9tb24iLCBOVUxMfSwKKyAgICB7InRtX21kYXkiLCBOVUxMfSwKKyAgICB7InRtX2hvdXIiLCBOVUxMfSwKKyAgICB7InRtX21pbiIsIE5VTEx9LAorICAgIHsidG1fc2VjIiwgTlVMTH0sCisgICAgeyJ0bV93ZGF5IiwgTlVMTH0sCisgICAgeyJ0bV95ZGF5IiwgTlVMTH0sCisgICAgeyJ0bV9pc2RzdCIsIE5VTEx9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyBzdHJ1Y3RfdGltZV90eXBlX2Rlc2MgPSB7Ci0JInRpbWUuc3RydWN0X3RpbWUiLAotCU5VTEwsCi0Jc3RydWN0X3RpbWVfdHlwZV9maWVsZHMsCi0JOSwKKyAgICAidGltZS5zdHJ1Y3RfdGltZSIsCisgICAgTlVMTCwKKyAgICBzdHJ1Y3RfdGltZV90eXBlX2ZpZWxkcywKKyAgICA5LAogfTsKIAogc3RhdGljIGludCBpbml0aWFsaXplZDsKQEAgLTI0MSw0OCArMjQxLDQ4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdG10b3R1cGxlKHN0cnVjdCB0bSAqcCkKIHsKLQlQeU9iamVjdCAqdiA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZTdHJ1Y3RUaW1lVHlwZSk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKnYgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RydWN0VGltZVR5cGUpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjZGVmaW5lIFNFVChpLHZhbCkgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsKSkKIAotCVNFVCgwLCBwLT50bV95ZWFyICsgMTkwMCk7Ci0JU0VUKDEsIHAtPnRtX21vbiArIDEpOwkgICAvKiBXYW50IEphbnVhcnkgPT0gMSAqLwotCVNFVCgyLCBwLT50bV9tZGF5KTsKLQlTRVQoMywgcC0+dG1faG91cik7Ci0JU0VUKDQsIHAtPnRtX21pbik7Ci0JU0VUKDUsIHAtPnRtX3NlYyk7Ci0JU0VUKDYsIChwLT50bV93ZGF5ICsgNikgJSA3KTsgLyogV2FudCBNb25kYXkgPT0gMCAqLwotCVNFVCg3LCBwLT50bV95ZGF5ICsgMSk7CSAgIC8qIFdhbnQgSmFudWFyeSwgMSA9PSAxICovCi0JU0VUKDgsIHAtPnRtX2lzZHN0KTsKKyAgICBTRVQoMCwgcC0+dG1feWVhciArIDE5MDApOworICAgIFNFVCgxLCBwLT50bV9tb24gKyAxKTsgICAgICAgICAvKiBXYW50IEphbnVhcnkgPT0gMSAqLworICAgIFNFVCgyLCBwLT50bV9tZGF5KTsKKyAgICBTRVQoMywgcC0+dG1faG91cik7CisgICAgU0VUKDQsIHAtPnRtX21pbik7CisgICAgU0VUKDUsIHAtPnRtX3NlYyk7CisgICAgU0VUKDYsIChwLT50bV93ZGF5ICsgNikgJSA3KTsgLyogV2FudCBNb25kYXkgPT0gMCAqLworICAgIFNFVCg3LCBwLT50bV95ZGF5ICsgMSk7ICAgICAgICAvKiBXYW50IEphbnVhcnksIDEgPT0gMSAqLworICAgIFNFVCg4LCBwLT50bV9pc2RzdCk7CiAjdW5kZWYgU0VUCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfWERFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiB2OworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9jb252ZXJ0KGRvdWJsZSB3aGVuLCBzdHJ1Y3QgdG0gKiAoKmZ1bmN0aW9uKShjb25zdCB0aW1lX3QgKikpCiB7Ci0Jc3RydWN0IHRtICpwOwotCXRpbWVfdCB3aGVudCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldCh3aGVuKTsKKyAgICBzdHJ1Y3QgdG0gKnA7CisgICAgdGltZV90IHdoZW50ID0gX1B5VGltZV9Eb3VibGVUb1RpbWV0KHdoZW4pOwogCi0JaWYgKHdoZW50ID09ICh0aW1lX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJybm8gPSAwOwotCXAgPSBmdW5jdGlvbigmd2hlbnQpOwotCWlmIChwID09IE5VTEwpIHsKKyAgICBpZiAod2hlbnQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnJubyA9IDA7CisgICAgcCA9IGZ1bmN0aW9uKCZ3aGVudCk7CisgICAgaWYgKHAgPT0gTlVMTCkgewogI2lmZGVmIEVJTlZBTAotCQlpZiAoZXJybm8gPT0gMCkKLQkJCWVycm5vID0gRUlOVkFMOworICAgICAgICBpZiAoZXJybm8gPT0gMCkKKyAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOwogI2VuZGlmCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfVmFsdWVFcnJvcik7Ci0JfQotCXJldHVybiB0bXRvdHVwbGUocCk7CisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfVmFsdWVFcnJvcik7CisgICAgfQorICAgIHJldHVybiB0bXRvdHVwbGUocCk7CiB9CiAKIC8qIFBhcnNlIGFyZyB0dXBsZSB0aGF0IGNhbiBjb250YWluIGFuIG9wdGlvbmFsIGZsb2F0LW9yLU5vbmUgdmFsdWU7CkBAIC0yOTIsMjggKzI5MiwyOCBAQAogc3RhdGljIGludAogcGFyc2VfdGltZV9kb3VibGVfYXJncyhQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCBkb3VibGUgKnB3aGVuKQogewotCVB5T2JqZWN0ICpvdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm90ID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBmb3JtYXQsICZvdCkpCi0JCXJldHVybiAwOwotCWlmIChvdCA9PSBOVUxMIHx8IG90ID09IFB5X05vbmUpCi0JCSpwd2hlbiA9IGZsb2F0dGltZSgpOwotCWVsc2UgewotCQlkb3VibGUgd2hlbiA9IFB5RmxvYXRfQXNEb3VibGUob3QpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAwOwotCQkqcHdoZW4gPSB3aGVuOwotCX0KLQlyZXR1cm4gMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgZm9ybWF0LCAmb3QpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAob3QgPT0gTlVMTCB8fCBvdCA9PSBQeV9Ob25lKQorICAgICAgICAqcHdoZW4gPSBmbG9hdHRpbWUoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgZG91YmxlIHdoZW4gPSBQeUZsb2F0X0FzRG91YmxlKG90KTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKnB3aGVuID0gd2hlbjsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2dtdGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIHdoZW47Ci0JaWYgKCFwYXJzZV90aW1lX2RvdWJsZV9hcmdzKGFyZ3MsICJ8TzpnbXRpbWUiLCAmd2hlbikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiB0aW1lX2NvbnZlcnQod2hlbiwgZ210aW1lKTsKKyAgICBkb3VibGUgd2hlbjsKKyAgICBpZiAoIXBhcnNlX3RpbWVfZG91YmxlX2FyZ3MoYXJncywgInxPOmdtdGltZSIsICZ3aGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHRpbWVfY29udmVydCh3aGVuLCBnbXRpbWUpOwogfQogCiBQeURvY19TVFJWQVIoZ210aW1lX2RvYywKQEAgLTMyNiwxNSArMzI2LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9sb2NhbHRpbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSB3aGVuOwotCWlmICghcGFyc2VfdGltZV9kb3VibGVfYXJncyhhcmdzLCAifE86bG9jYWx0aW1lIiwgJndoZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdGltZV9jb252ZXJ0KHdoZW4sIGxvY2FsdGltZSk7CisgICAgZG91YmxlIHdoZW47CisgICAgaWYgKCFwYXJzZV90aW1lX2RvdWJsZV9hcmdzKGFyZ3MsICJ8Tzpsb2NhbHRpbWUiLCAmd2hlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiB0aW1lX2NvbnZlcnQod2hlbiwgbG9jYWx0aW1lKTsKIH0KIAogUHlEb2NfU1RSVkFSKGxvY2FsdGltZV9kb2MsCiAibG9jYWx0aW1lKFtzZWNvbmRzXSkgLT4gKHRtX3llYXIsdG1fbW9uLHRtX21kYXksdG1faG91cix0bV9taW4sXG5cCi0JCQkgIHRtX3NlYyx0bV93ZGF5LHRtX3lkYXksdG1faXNkc3QpXG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRtX3NlYyx0bV93ZGF5LHRtX3lkYXksdG1faXNkc3QpXG5cCiBcblwKIENvbnZlcnQgc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2ggdG8gYSB0aW1lIHR1cGxlIGV4cHJlc3NpbmcgbG9jYWwgdGltZS5cblwKIFdoZW4gJ3NlY29uZHMnIGlzIG5vdCBwYXNzZWQgaW4sIGNvbnZlcnQgdGhlIGN1cnJlbnQgdGltZSBpbnN0ZWFkLiIpOwpAQCAtMzQyLDE4NSArMzQyLDE4NSBAQAogc3RhdGljIGludAogZ2V0dG1hcmcoUHlPYmplY3QgKmFyZ3MsIHN0cnVjdCB0bSAqcCkKIHsKLQlpbnQgeTsKLQltZW1zZXQoKHZvaWQgKikgcCwgJ1wwJywgc2l6ZW9mKHN0cnVjdCB0bSkpOworICAgIGludCB5OworICAgIG1lbXNldCgodm9pZCAqKSBwLCAnXDAnLCBzaXplb2Yoc3RydWN0IHRtKSk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlpaWlpaWlpKSIsCi0JCQkgJnksCi0JCQkgJnAtPnRtX21vbiwKLQkJCSAmcC0+dG1fbWRheSwKLQkJCSAmcC0+dG1faG91ciwKLQkJCSAmcC0+dG1fbWluLAotCQkJICZwLT50bV9zZWMsCi0JCQkgJnAtPnRtX3dkYXksCi0JCQkgJnAtPnRtX3lkYXksCi0JCQkgJnAtPnRtX2lzZHN0KSkKLQkJcmV0dXJuIDA7Ci0JaWYgKHkgPCAxOTAwKSB7Ci0JCVB5T2JqZWN0ICphY2NlcHQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2RkaWN0LAotCQkJCQkJCSJhY2NlcHQyZHllYXIiKTsKLQkJaWYgKGFjY2VwdCA9PSBOVUxMIHx8ICFQeUludF9DaGVjayhhY2NlcHQpIHx8Ci0JCSAgICBQeUludF9Bc0xvbmcoYWNjZXB0KSA9PSAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInllYXIgPj0gMTkwMCByZXF1aXJlZCIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKDY5IDw9IHkgJiYgeSA8PSA5OSkKLQkJCXkgKz0gMTkwMDsKLQkJZWxzZSBpZiAoMCA8PSB5ICYmIHkgPD0gNjgpCi0JCQl5ICs9IDIwMDA7Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJ5ZWFyIG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcC0+dG1feWVhciA9IHkgLSAxOTAwOwotCXAtPnRtX21vbi0tOwotCXAtPnRtX3dkYXkgPSAocC0+dG1fd2RheSArIDEpICUgNzsKLQlwLT50bV95ZGF5LS07Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpaWlpaWlpaSkiLAorICAgICAgICAgICAgICAgICAgICAgJnksCisgICAgICAgICAgICAgICAgICAgICAmcC0+dG1fbW9uLAorICAgICAgICAgICAgICAgICAgICAgJnAtPnRtX21kYXksCisgICAgICAgICAgICAgICAgICAgICAmcC0+dG1faG91ciwKKyAgICAgICAgICAgICAgICAgICAgICZwLT50bV9taW4sCisgICAgICAgICAgICAgICAgICAgICAmcC0+dG1fc2VjLAorICAgICAgICAgICAgICAgICAgICAgJnAtPnRtX3dkYXksCisgICAgICAgICAgICAgICAgICAgICAmcC0+dG1feWRheSwKKyAgICAgICAgICAgICAgICAgICAgICZwLT50bV9pc2RzdCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh5IDwgMTkwMCkgeworICAgICAgICBQeU9iamVjdCAqYWNjZXB0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2NlcHQyZHllYXIiKTsKKyAgICAgICAgaWYgKGFjY2VwdCA9PSBOVUxMIHx8ICFQeUludF9DaGVjayhhY2NlcHQpIHx8CisgICAgICAgICAgICBQeUludF9Bc0xvbmcoYWNjZXB0KSA9PSAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVhciA+PSAxOTAwIHJlcXVpcmVkIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoNjkgPD0geSAmJiB5IDw9IDk5KQorICAgICAgICAgICAgeSArPSAxOTAwOworICAgICAgICBlbHNlIGlmICgwIDw9IHkgJiYgeSA8PSA2OCkKKyAgICAgICAgICAgIHkgKz0gMjAwMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVhciBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHAtPnRtX3llYXIgPSB5IC0gMTkwMDsKKyAgICBwLT50bV9tb24tLTsKKyAgICBwLT50bV93ZGF5ID0gKHAtPnRtX3dkYXkgKyAxKSAlIDc7CisgICAgcC0+dG1feWRheS0tOworICAgIHJldHVybiAxOwogfQogCiAjaWZkZWYgSEFWRV9TVFJGVElNRQogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfc3RyZnRpbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp0dXAgPSBOVUxMOwotCXN0cnVjdCB0bSBidWY7Ci0JY29uc3QgY2hhciAqZm10OwotCXNpemVfdCBmbXRsZW4sIGJ1ZmxlbjsKLQljaGFyICpvdXRidWYgPSAwOwotCXNpemVfdCBpOworICAgIFB5T2JqZWN0ICp0dXAgPSBOVUxMOworICAgIHN0cnVjdCB0bSBidWY7CisgICAgY29uc3QgY2hhciAqZm10OworICAgIHNpemVfdCBmbXRsZW4sIGJ1ZmxlbjsKKyAgICBjaGFyICpvdXRidWYgPSAwOworICAgIHNpemVfdCBpOwogCi0JbWVtc2V0KCh2b2lkICopICZidWYsICdcMCcsIHNpemVvZihidWYpKTsKKyAgICBtZW1zZXQoKHZvaWQgKikgJmJ1ZiwgJ1wwJywgc2l6ZW9mKGJ1ZikpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfE86c3RyZnRpbWUiLCAmZm10LCAmdHVwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfE86c3RyZnRpbWUiLCAmZm10LCAmdHVwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodHVwID09IE5VTEwpIHsKLQkJdGltZV90IHR0ID0gdGltZShOVUxMKTsKLQkJYnVmID0gKmxvY2FsdGltZSgmdHQpOwotCX0gZWxzZSBpZiAoIWdldHRtYXJnKHR1cCwgJmJ1ZikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0dXAgPT0gTlVMTCkgeworICAgICAgICB0aW1lX3QgdHQgPSB0aW1lKE5VTEwpOworICAgICAgICBidWYgPSAqbG9jYWx0aW1lKCZ0dCk7CisgICAgfSBlbHNlIGlmICghZ2V0dG1hcmcodHVwLCAmYnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBDaGVja3MgYWRkZWQgdG8gbWFrZSBzdXJlIHN0cmZ0aW1lKCkgZG9lcyBub3QgY3Jhc2ggUHl0aG9uIGJ5Ci0JICAgaW5kZXhpbmcgYmxpbmRseSBpbnRvIHNvbWUgYXJyYXkgZm9yIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbgotCSAgIGJ5IHNvbWUgYmFkIGluZGV4IChmaXhlcyBidWcgIzg5NzYyNSkuCisgICAgLyogQ2hlY2tzIGFkZGVkIHRvIG1ha2Ugc3VyZSBzdHJmdGltZSgpIGRvZXMgbm90IGNyYXNoIFB5dGhvbiBieQorICAgICAgIGluZGV4aW5nIGJsaW5kbHkgaW50byBzb21lIGFycmF5IGZvciBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24KKyAgICAgICBieSBzb21lIGJhZCBpbmRleCAoZml4ZXMgYnVnICM4OTc2MjUpLgogCi0JICAgIEFsc28gc3VwcG9ydCB2YWx1ZXMgb2YgemVybyBmcm9tIFB5dGhvbiBjb2RlIGZvciBhcmd1bWVudHMgaW4gd2hpY2gKLQkgICAgdGhhdCBpcyBvdXQgb2YgcmFuZ2UgYnkgZm9yY2luZyB0aGF0IHZhbHVlIHRvIHRoZSBsb3dlc3QgdmFsdWUgdGhhdAotCSAgICBpcyB2YWxpZCAoZml4ZWQgYnVnICMxNTIwOTE0KS4KKyAgICAgICAgQWxzbyBzdXBwb3J0IHZhbHVlcyBvZiB6ZXJvIGZyb20gUHl0aG9uIGNvZGUgZm9yIGFyZ3VtZW50cyBpbiB3aGljaAorICAgICAgICB0aGF0IGlzIG91dCBvZiByYW5nZSBieSBmb3JjaW5nIHRoYXQgdmFsdWUgdG8gdGhlIGxvd2VzdCB2YWx1ZSB0aGF0CisgICAgICAgIGlzIHZhbGlkIChmaXhlZCBidWcgIzE1MjA5MTQpLgogCi0JICAgIFZhbGlkIHJhbmdlcyBiYXNlZCBvbiB3aGF0IGlzIGFsbG93ZWQgaW4gc3RydWN0IHRtOgorICAgICAgICBWYWxpZCByYW5nZXMgYmFzZWQgb24gd2hhdCBpcyBhbGxvd2VkIGluIHN0cnVjdCB0bToKIAotCSAgICAtIHRtX3llYXI6IFswLCBtYXgoaW50KV0gKDEpCi0JICAgIC0gdG1fbW9uOiBbMCwgMTFdICgyKQotCSAgICAtIHRtX21kYXk6IFsxLCAzMV0KLQkgICAgLSB0bV9ob3VyOiBbMCwgMjNdCi0JICAgIC0gdG1fbWluOiBbMCwgNTldCi0JICAgIC0gdG1fc2VjOiBbMCwgNjBdCi0JICAgIC0gdG1fd2RheTogWzAsIDZdICgxKQotCSAgICAtIHRtX3lkYXk6IFswLCAzNjVdICgyKQotCSAgICAtIHRtX2lzZHN0OiBbLW1heChpbnQpLCBtYXgoaW50KV0KKyAgICAgICAgLSB0bV95ZWFyOiBbMCwgbWF4KGludCldICgxKQorICAgICAgICAtIHRtX21vbjogWzAsIDExXSAoMikKKyAgICAgICAgLSB0bV9tZGF5OiBbMSwgMzFdCisgICAgICAgIC0gdG1faG91cjogWzAsIDIzXQorICAgICAgICAtIHRtX21pbjogWzAsIDU5XQorICAgICAgICAtIHRtX3NlYzogWzAsIDYwXQorICAgICAgICAtIHRtX3dkYXk6IFswLCA2XSAoMSkKKyAgICAgICAgLSB0bV95ZGF5OiBbMCwgMzY1XSAoMikKKyAgICAgICAgLSB0bV9pc2RzdDogWy1tYXgoaW50KSwgbWF4KGludCldCiAKLQkgICAgKDEpIGdldHRtYXJnKCkgaGFuZGxlcyBib3VuZHMtY2hlY2tpbmcuCi0JICAgICgyKSBQeXRob24ncyBhY2NlcHRhYmxlIHJhbmdlIGlzIG9uZSBncmVhdGVyIHRoYW4gdGhlIHJhbmdlIGluIEMsCi0JICAgICAgICB0aHVzIG5lZWQgdG8gY2hlY2sgYWdhaW5zdCBhdXRvbWF0aWMgZGVjcmVtZW50IGJ5IGdldHRtYXJnKCkuCi0JKi8KLQlpZiAoYnVmLnRtX21vbiA9PSAtMSkKLQkgICAgYnVmLnRtX21vbiA9IDA7Ci0JZWxzZSBpZiAoYnVmLnRtX21vbiA8IDAgfHwgYnVmLnRtX21vbiA+IDExKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibW9udGggb3V0IG9mIHJhbmdlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGJ1Zi50bV9tZGF5ID09IDApCi0JICAgIGJ1Zi50bV9tZGF5ID0gMTsKLQllbHNlIGlmIChidWYudG1fbWRheSA8IDAgfHwgYnVmLnRtX21kYXkgPiAzMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRheSBvZiBtb250aCBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoYnVmLnRtX2hvdXIgPCAwIHx8IGJ1Zi50bV9ob3VyID4gMjMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJob3VyIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGJ1Zi50bV9taW4gPCAwIHx8IGJ1Zi50bV9taW4gPiA1OSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1pbnV0ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChidWYudG1fc2VjIDwgMCB8fCBidWYudG1fc2VjID4gNjEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzZWNvbmRzIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogdG1fd2RheSBkb2VzIG5vdCBuZWVkIGNoZWNraW5nIG9mIGl0cyB1cHBlci1ib3VuZCBzaW5jZSB0YWtpbmcKLQlgYCUgN2BgIGluIGdldHRtYXJnKCkgYXV0b21hdGljYWxseSByZXN0cmljdHMgdGhlIHJhbmdlLiAqLwotCWlmIChidWYudG1fd2RheSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXkgb2Ygd2VlayBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChidWYudG1feWRheSA9PSAtMSkKLQkgICAgYnVmLnRtX3lkYXkgPSAwOwotCWVsc2UgaWYgKGJ1Zi50bV95ZGF5IDwgMCB8fCBidWYudG1feWRheSA+IDM2NSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRheSBvZiB5ZWFyIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogTm9ybWFsaXplIHRtX2lzZHN0IGp1c3QgaW4gY2FzZSBzb21lb25lIGZvb2xpc2hseSBpbXBsZW1lbnRzICVaCi0JICAgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCB0bV9pc2RzdCBmYWxscyB3aXRoaW4gdGhlIHJhbmdlIG9mCi0JICAgWy0xLCAxXSAqLwotCWlmIChidWYudG1faXNkc3QgPCAtMSkKLQkJYnVmLnRtX2lzZHN0ID0gLTE7Ci0JZWxzZSBpZiAoYnVmLnRtX2lzZHN0ID4gMSkKLQkJYnVmLnRtX2lzZHN0ID0gMTsKKyAgICAgICAgKDEpIGdldHRtYXJnKCkgaGFuZGxlcyBib3VuZHMtY2hlY2tpbmcuCisgICAgICAgICgyKSBQeXRob24ncyBhY2NlcHRhYmxlIHJhbmdlIGlzIG9uZSBncmVhdGVyIHRoYW4gdGhlIHJhbmdlIGluIEMsCisgICAgICAgIHRodXMgbmVlZCB0byBjaGVjayBhZ2FpbnN0IGF1dG9tYXRpYyBkZWNyZW1lbnQgYnkgZ2V0dG1hcmcoKS4KKyAgICAqLworICAgIGlmIChidWYudG1fbW9uID09IC0xKQorICAgICAgICBidWYudG1fbW9uID0gMDsKKyAgICBlbHNlIGlmIChidWYudG1fbW9uIDwgMCB8fCBidWYudG1fbW9uID4gMTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtb250aCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoYnVmLnRtX21kYXkgPT0gMCkKKyAgICAgICAgYnVmLnRtX21kYXkgPSAxOworICAgIGVsc2UgaWYgKGJ1Zi50bV9tZGF5IDwgMCB8fCBidWYudG1fbWRheSA+IDMxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGF5IG9mIG1vbnRoIG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChidWYudG1faG91ciA8IDAgfHwgYnVmLnRtX2hvdXIgPiAyMykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImhvdXIgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoYnVmLnRtX21pbiA8IDAgfHwgYnVmLnRtX21pbiA+IDU5KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWludXRlIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGJ1Zi50bV9zZWMgPCAwIHx8IGJ1Zi50bV9zZWMgPiA2MSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNlY29uZHMgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiB0bV93ZGF5IGRvZXMgbm90IG5lZWQgY2hlY2tpbmcgb2YgaXRzIHVwcGVyLWJvdW5kIHNpbmNlIHRha2luZworICAgIGBgJSA3YGAgaW4gZ2V0dG1hcmcoKSBhdXRvbWF0aWNhbGx5IHJlc3RyaWN0cyB0aGUgcmFuZ2UuICovCisgICAgaWYgKGJ1Zi50bV93ZGF5IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRheSBvZiB3ZWVrIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGJ1Zi50bV95ZGF5ID09IC0xKQorICAgICAgICBidWYudG1feWRheSA9IDA7CisgICAgZWxzZSBpZiAoYnVmLnRtX3lkYXkgPCAwIHx8IGJ1Zi50bV95ZGF5ID4gMzY1KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGF5IG9mIHllYXIgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBOb3JtYWxpemUgdG1faXNkc3QganVzdCBpbiBjYXNlIHNvbWVvbmUgZm9vbGlzaGx5IGltcGxlbWVudHMgJVoKKyAgICAgICBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRtX2lzZHN0IGZhbGxzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YKKyAgICAgICBbLTEsIDFdICovCisgICAgaWYgKGJ1Zi50bV9pc2RzdCA8IC0xKQorICAgICAgICBidWYudG1faXNkc3QgPSAtMTsKKyAgICBlbHNlIGlmIChidWYudG1faXNkc3QgPiAxKQorICAgICAgICBidWYudG1faXNkc3QgPSAxOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCS8qIGNoZWNrIHRoYXQgdGhlIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgb25seSB2YWxpZCBkaXJlY3RpdmVzICovCi0JZm9yKG91dGJ1ZiA9IHN0cmNocihmbXQsICclJyk7Ci0JCW91dGJ1ZiAhPSBOVUxMOwotCQlvdXRidWYgPSBzdHJjaHIob3V0YnVmKzIsICclJykpCi0JewotCQlpZiAob3V0YnVmWzFdPT0nIycpCi0JCQkrK291dGJ1ZjsgLyogbm90IGRvY3VtZW50ZWQgYnkgcHl0aG9uLCAqLwotCQlpZiAob3V0YnVmWzFdPT0nXDAnIHx8Ci0JCQkhc3RyY2hyKCJhQWJCY2RmSElqbU1wU1V3V3hYeVl6WiUiLCBvdXRidWZbMV0pKQotCQl7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkludmFsaWQgZm9ybWF0IHN0cmluZyIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9CisgICAgLyogY2hlY2sgdGhhdCB0aGUgZm9ybWF0IHN0cmluZyBjb250YWlucyBvbmx5IHZhbGlkIGRpcmVjdGl2ZXMgKi8KKyAgICBmb3Iob3V0YnVmID0gc3RyY2hyKGZtdCwgJyUnKTsKKyAgICAgICAgb3V0YnVmICE9IE5VTEw7CisgICAgICAgIG91dGJ1ZiA9IHN0cmNocihvdXRidWYrMiwgJyUnKSkKKyAgICB7CisgICAgICAgIGlmIChvdXRidWZbMV09PScjJykKKyAgICAgICAgICAgICsrb3V0YnVmOyAvKiBub3QgZG9jdW1lbnRlZCBieSBweXRob24sICovCisgICAgICAgIGlmIChvdXRidWZbMV09PSdcMCcgfHwKKyAgICAgICAgICAgICFzdHJjaHIoImFBYkJjZGZISWptTXBTVXdXeFh5WXpaJSIsIG91dGJ1ZlsxXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSW52YWxpZCBmb3JtYXQgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgogCi0JZm10bGVuID0gc3RybGVuKGZtdCk7CisgICAgZm10bGVuID0gc3RybGVuKGZtdCk7CiAKLQkvKiBJIGhhdGUgdGhlc2UgZnVuY3Rpb25zIHRoYXQgcHJlc3VtZSB5b3Uga25vdyBob3cgYmlnIHRoZSBvdXRwdXQKLQkgKiB3aWxsIGJlIGFoZWFkIG9mIHRpbWUuLi4KLQkgKi8KLQlmb3IgKGkgPSAxMDI0OyA7IGkgKz0gaSkgewotCQlvdXRidWYgPSAoY2hhciAqKW1hbGxvYyhpKTsKLQkJaWYgKG91dGJ1ZiA9PSBOVUxMKSB7Ci0JCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJfQotCQlidWZsZW4gPSBzdHJmdGltZShvdXRidWYsIGksIGZtdCwgJmJ1Zik7Ci0JCWlmIChidWZsZW4gPiAwIHx8IGkgPj0gMjU2ICogZm10bGVuKSB7Ci0JCQkvKiBJZiB0aGUgYnVmZmVyIGlzIDI1NiB0aW1lcyBhcyBsb25nIGFzIHRoZSBmb3JtYXQsCi0JCQkgICBpdCdzIHByb2JhYmx5IG5vdCBmYWlsaW5nIGZvciBsYWNrIG9mIHJvb20hCi0JCQkgICBNb3JlIGxpa2VseSwgdGhlIGZvcm1hdCB5aWVsZHMgYW4gZW1wdHkgcmVzdWx0LAotCQkJICAgZS5nLiBhbiBlbXB0eSBmb3JtYXQsIG9yICVaIHdoZW4gdGhlIHRpbWV6b25lCi0JCQkgICBpcyB1bmtub3duLiAqLwotCQkJUHlPYmplY3QgKnJldDsKLQkJCXJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG91dGJ1ZiwgYnVmbGVuKTsKLQkJCWZyZWUob3V0YnVmKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJZnJlZShvdXRidWYpOworICAgIC8qIEkgaGF0ZSB0aGVzZSBmdW5jdGlvbnMgdGhhdCBwcmVzdW1lIHlvdSBrbm93IGhvdyBiaWcgdGhlIG91dHB1dAorICAgICAqIHdpbGwgYmUgYWhlYWQgb2YgdGltZS4uLgorICAgICAqLworICAgIGZvciAoaSA9IDEwMjQ7IDsgaSArPSBpKSB7CisgICAgICAgIG91dGJ1ZiA9IChjaGFyICopbWFsbG9jKGkpOworICAgICAgICBpZiAob3V0YnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICB9CisgICAgICAgIGJ1ZmxlbiA9IHN0cmZ0aW1lKG91dGJ1ZiwgaSwgZm10LCAmYnVmKTsKKyAgICAgICAgaWYgKGJ1ZmxlbiA+IDAgfHwgaSA+PSAyNTYgKiBmbXRsZW4pIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBidWZmZXIgaXMgMjU2IHRpbWVzIGFzIGxvbmcgYXMgdGhlIGZvcm1hdCwKKyAgICAgICAgICAgICAgIGl0J3MgcHJvYmFibHkgbm90IGZhaWxpbmcgZm9yIGxhY2sgb2Ygcm9vbSEKKyAgICAgICAgICAgICAgIE1vcmUgbGlrZWx5LCB0aGUgZm9ybWF0IHlpZWxkcyBhbiBlbXB0eSByZXN1bHQsCisgICAgICAgICAgICAgICBlLmcuIGFuIGVtcHR5IGZvcm1hdCwgb3IgJVogd2hlbiB0aGUgdGltZXpvbmUKKyAgICAgICAgICAgICAgIGlzIHVua25vd24uICovCisgICAgICAgICAgICBQeU9iamVjdCAqcmV0OworICAgICAgICAgICAgcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUob3V0YnVmLCBidWZsZW4pOworICAgICAgICAgICAgZnJlZShvdXRidWYpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBmcmVlKG91dGJ1Zik7CiAjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNDAwICYmIGRlZmluZWQoX19TVERDX1NFQ1VSRV9MSUJfXykKLQkJLyogVmlzdWFsU3R1ZGlvIC5ORVQgMjAwNSBkb2VzIHRoaXMgcHJvcGVybHkgKi8KLQkJaWYgKGJ1ZmxlbiA9PSAwICYmIGVycm5vID09IEVJTlZBTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJbnZhbGlkIGZvcm1hdCBzdHJpbmciKTsKLQkJCXJldHVybiAwOwotCQl9CisgICAgICAgIC8qIFZpc3VhbFN0dWRpbyAuTkVUIDIwMDUgZG9lcyB0aGlzIHByb3Blcmx5ICovCisgICAgICAgIGlmIChidWZsZW4gPT0gMCAmJiBlcnJubyA9PSBFSU5WQUwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSW52YWxpZCBmb3JtYXQgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogI2VuZGlmCi0JCQotCX0KKworICAgIH0KIH0KIAogUHlEb2NfU1RSVkFSKHN0cmZ0aW1lX2RvYywKQEAgLTUzNCwxNSArNTM0LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9zdHJwdGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnN0cnB0aW1lX21vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIl9zdHJwdGltZSIpOwotCVB5T2JqZWN0ICpzdHJwdGltZV9yZXN1bHQ7CisgICAgUHlPYmplY3QgKnN0cnB0aW1lX21vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIl9zdHJwdGltZSIpOworICAgIFB5T2JqZWN0ICpzdHJwdGltZV9yZXN1bHQ7CiAKLQlpZiAoIXN0cnB0aW1lX21vZHVsZSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3RycHRpbWVfcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzdHJwdGltZV9tb2R1bGUsCi0JCQkJCQkiX3N0cnB0aW1lX3RpbWUiLCAiTyIsIGFyZ3MpOwotCVB5X0RFQ1JFRihzdHJwdGltZV9tb2R1bGUpOwotCXJldHVybiBzdHJwdGltZV9yZXN1bHQ7CisgICAgaWYgKCFzdHJwdGltZV9tb2R1bGUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0cnB0aW1lX3Jlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3RycHRpbWVfbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3N0cnB0aW1lX3RpbWUiLCAiTyIsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihzdHJwdGltZV9tb2R1bGUpOworICAgIHJldHVybiBzdHJwdGltZV9yZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihzdHJwdGltZV9kb2MsCkBAIC01NTUsMjAgKzU1NSwyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfYXNjdGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnR1cCA9IE5VTEw7Ci0Jc3RydWN0IHRtIGJ1ZjsKLQljaGFyICpwOwotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImFzY3RpbWUiLCAwLCAxLCAmdHVwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHR1cCA9PSBOVUxMKSB7Ci0JCXRpbWVfdCB0dCA9IHRpbWUoTlVMTCk7Ci0JCWJ1ZiA9ICpsb2NhbHRpbWUoJnR0KTsKLQl9IGVsc2UgaWYgKCFnZXR0bWFyZyh0dXAsICZidWYpKQotCQlyZXR1cm4gTlVMTDsKLQlwID0gYXNjdGltZSgmYnVmKTsKLQlpZiAocFsyNF0gPT0gJ1xuJykKLQkJcFsyNF0gPSAnXDAnOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHApOworICAgIFB5T2JqZWN0ICp0dXAgPSBOVUxMOworICAgIHN0cnVjdCB0bSBidWY7CisgICAgY2hhciAqcDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJhc2N0aW1lIiwgMCwgMSwgJnR1cCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh0dXAgPT0gTlVMTCkgeworICAgICAgICB0aW1lX3QgdHQgPSB0aW1lKE5VTEwpOworICAgICAgICBidWYgPSAqbG9jYWx0aW1lKCZ0dCk7CisgICAgfSBlbHNlIGlmICghZ2V0dG1hcmcodHVwLCAmYnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IGFzY3RpbWUoJmJ1Zik7CisgICAgaWYgKHBbMjRdID09ICdcbicpCisgICAgICAgIHBbMjRdID0gJ1wwJzsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhwKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFzY3RpbWVfZG9jLApAQCAtNTgxLDMwICs1ODEsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2N0aW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb3QgPSBOVUxMOwotCXRpbWVfdCB0dDsKLQljaGFyICpwOworICAgIFB5T2JqZWN0ICpvdCA9IE5VTEw7CisgICAgdGltZV90IHR0OworICAgIGNoYXIgKnA7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjdGltZSIsIDAsIDEsICZvdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChvdCA9PSBOVUxMIHx8IG90ID09IFB5X05vbmUpCi0JCXR0ID0gdGltZShOVUxMKTsKLQllbHNlIHsKLQkJZG91YmxlIGR0ID0gUHlGbG9hdF9Bc0RvdWJsZShvdCk7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXR0ID0gX1B5VGltZV9Eb3VibGVUb1RpbWV0KGR0KTsKLQkJaWYgKHR0ID09ICh0aW1lX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlwID0gY3RpbWUoJnR0KTsKLQlpZiAocCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidW5jb252ZXJ0aWJsZSB0aW1lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocFsyNF0gPT0gJ1xuJykKLQkJcFsyNF0gPSAnXDAnOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHApOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImN0aW1lIiwgMCwgMSwgJm90KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG90ID09IE5VTEwgfHwgb3QgPT0gUHlfTm9uZSkKKyAgICAgICAgdHQgPSB0aW1lKE5VTEwpOworICAgIGVsc2UgeworICAgICAgICBkb3VibGUgZHQgPSBQeUZsb2F0X0FzRG91YmxlKG90KTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdHQgPSBfUHlUaW1lX0RvdWJsZVRvVGltZXQoZHQpOworICAgICAgICBpZiAodHQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHAgPSBjdGltZSgmdHQpOworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ1bmNvbnZlcnRpYmxlIHRpbWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwWzI0XSA9PSAnXG4nKQorICAgICAgICBwWzI0XSA9ICdcMCc7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjdGltZV9kb2MsCkBAIC02MTgsMTcgKzYxOCwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfbWt0aW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdHVwKQogewotCXN0cnVjdCB0bSBidWY7Ci0JdGltZV90IHR0OwotCWlmICghZ2V0dG1hcmcodHVwLCAmYnVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdHQgPSBta3RpbWUoJmJ1Zik7Ci0JaWYgKHR0ID09ICh0aW1lX3QpKC0xKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibWt0aW1lIGFyZ3VtZW50IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKXR0KTsKKyAgICBzdHJ1Y3QgdG0gYnVmOworICAgIHRpbWVfdCB0dDsKKyAgICBpZiAoIWdldHRtYXJnKHR1cCwgJmJ1ZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHR0ID0gbWt0aW1lKCZidWYpOworICAgIGlmICh0dCA9PSAodGltZV90KSgtMSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWt0aW1lIGFyZ3VtZW50IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKXR0KTsKIH0KIAogUHlEb2NfU1RSVkFSKG1rdGltZV9kb2MsCkBAIC02NDMsMjEgKzY0MywyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfdHpzZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JUHlPYmplY3QqIG07CisgICAgUHlPYmplY3QqIG07CiAKLQltID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOwotCWlmIChtID09IE5VTEwpIHsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQorICAgIG0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ0aW1lIik7CisgICAgaWYgKG0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl0enNldCgpOworICAgIHR6c2V0KCk7CiAKLQkvKiBSZXNldCB0aW1lem9uZSwgYWx0em9uZSwgZGF5bGlnaHQgYW5kIHR6bmFtZSAqLwotCWluaXR0aW1lem9uZShtKTsKLQlQeV9ERUNSRUYobSk7CisgICAgLyogUmVzZXQgdGltZXpvbmUsIGFsdHpvbmUsIGRheWxpZ2h0IGFuZCB0em5hbWUgKi8KKyAgICBpbml0dGltZXpvbmUobSk7CisgICAgUHlfREVDUkVGKG0pOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHR6c2V0X2RvYywKQEAgLTY3NywxMTMgKzY3NywxMTMgQEAKIHN0YXRpYyB2b2lkCiBpbml0dGltZXpvbmUoUHlPYmplY3QgKm0pIHsKICAgICAvKiBUaGlzIGNvZGUgbW92ZWQgZnJvbSBpbml0dGltZSB3aG9sZXNhbGUgdG8gYWxsb3cgY2FsbGluZyBpdCBmcm9tCi0JdGltZV90enNldC4gSW4gdGhlIGZ1dHVyZSwgc29tZSBwYXJ0cyBvZiBpdCBjYW4gYmUgbW92ZWQgYmFjawotCShmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3QgSEFWRV9XT1JLSU5HX1RaU0VULCB3aGVuIHdlIGtub3cgd2hhdCB0aGV5Ci0JYXJlKSwgYW5kIHRoZSBleHRyYW5lb3VzIGNhbGxzIHRvIHR6c2V0KDMpIHNob3VsZCBiZSByZW1vdmVkLgotCUkgaGF2ZW4ndCBkb25lIHRoaXMgeWV0LCBhcyBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoaXMgY29kZSBhcwotCWxpdHRsZSBhcyBwb3NzaWJsZSB3aGVuIGludHJvZHVjaW5nIHRoZSB0aW1lLnR6c2V0IGFuZCB0aW1lLnR6c2V0d2FsbAotCW1ldGhvZHMuIFRoaXMgc2hvdWxkIHNpbXBseSBiZSBhIG1ldGhvZCBvZiBkb2luZyB0aGUgZm9sbG93aW5nIG9uY2UsCi0JYXQgdGhlIHRvcCBvZiB0aGlzIGZ1bmN0aW9uIGFuZCByZW1vdmluZyB0aGUgY2FsbCB0byB0enNldCgpIGZyb20KLQl0aW1lX3R6c2V0KCk6CisgICAgdGltZV90enNldC4gSW4gdGhlIGZ1dHVyZSwgc29tZSBwYXJ0cyBvZiBpdCBjYW4gYmUgbW92ZWQgYmFjaworICAgIChmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3QgSEFWRV9XT1JLSU5HX1RaU0VULCB3aGVuIHdlIGtub3cgd2hhdCB0aGV5CisgICAgYXJlKSwgYW5kIHRoZSBleHRyYW5lb3VzIGNhbGxzIHRvIHR6c2V0KDMpIHNob3VsZCBiZSByZW1vdmVkLgorICAgIEkgaGF2ZW4ndCBkb25lIHRoaXMgeWV0LCBhcyBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoaXMgY29kZSBhcworICAgIGxpdHRsZSBhcyBwb3NzaWJsZSB3aGVuIGludHJvZHVjaW5nIHRoZSB0aW1lLnR6c2V0IGFuZCB0aW1lLnR6c2V0d2FsbAorICAgIG1ldGhvZHMuIFRoaXMgc2hvdWxkIHNpbXBseSBiZSBhIG1ldGhvZCBvZiBkb2luZyB0aGUgZm9sbG93aW5nIG9uY2UsCisgICAgYXQgdGhlIHRvcCBvZiB0aGlzIGZ1bmN0aW9uIGFuZCByZW1vdmluZyB0aGUgY2FsbCB0byB0enNldCgpIGZyb20KKyAgICB0aW1lX3R6c2V0KCk6CiAKLQkgICAgI2lmZGVmIEhBVkVfVFpTRVQKLQkgICAgdHpzZXQoKQotCSAgICAjZW5kaWYKKyAgICAgICAgI2lmZGVmIEhBVkVfVFpTRVQKKyAgICAgICAgdHpzZXQoKQorICAgICAgICAjZW5kaWYKIAotCUFuZCBJJ20gbGF6eSBhbmQgaGF0ZSBDIHNvIG55ZXIuCisgICAgQW5kIEknbSBsYXp5IGFuZCBoYXRlIEMgc28gbnllci4KICAgICAgKi8KICNpZiBkZWZpbmVkKEhBVkVfVFpOQU1FKSAmJiAhZGVmaW5lZChfX0dMSUJDX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0JdHpzZXQoKTsKKyAgICB0enNldCgpOwogI2lmZGVmIFBZT1NfT1MyCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgInRpbWV6b25lIiwgX3RpbWV6b25lKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCBfdGltZXpvbmUpOwogI2Vsc2UgLyogIVBZT1NfT1MyICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgInRpbWV6b25lIiwgdGltZXpvbmUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJ0aW1lem9uZSIsIHRpbWV6b25lKTsKICNlbmRpZiAvKiBQWU9TX09TMiAqLwogI2lmZGVmIEhBVkVfQUxUWk9ORQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwgYWx0em9uZSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBhbHR6b25lKTsKICNlbHNlCiAjaWZkZWYgUFlPU19PUzIKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIF90aW1lem9uZS0zNjAwKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIF90aW1lem9uZS0zNjAwKTsKICNlbHNlIC8qICFQWU9TX09TMiAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwgdGltZXpvbmUtMzYwMCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCB0aW1lem9uZS0zNjAwKTsKICNlbmRpZiAvKiBQWU9TX09TMiAqLwogI2VuZGlmCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImRheWxpZ2h0IiwgZGF5bGlnaHQpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAidHpuYW1lIiwKLQkJCSAgIFB5X0J1aWxkVmFsdWUoIih6eikiLCB0em5hbWVbMF0sIHR6bmFtZVsxXSkpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJkYXlsaWdodCIsIGRheWxpZ2h0KTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInR6bmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIih6eikiLCB0em5hbWVbMF0sIHR6bmFtZVsxXSkpOwogI2Vsc2UgLyogIUhBVkVfVFpOQU1FIHx8IF9fR0xJQkNfXyB8fCBfX0NZR1dJTl9fKi8KICNpZmRlZiBIQVZFX1NUUlVDVF9UTV9UTV9aT05FCi0JeworICAgIHsKICNkZWZpbmUgWUVBUiAoKHRpbWVfdCkoKDM2NSAqIDI0ICsgNikgKiAzNjAwKSkKLQkJdGltZV90IHQ7Ci0JCXN0cnVjdCB0bSAqcDsKLQkJbG9uZyBqYW56b25lLCBqdWx5em9uZTsKLQkJY2hhciBqYW5uYW1lWzEwXSwganVseW5hbWVbMTBdOwotCQl0ID0gKHRpbWUoKHRpbWVfdCAqKTApIC8gWUVBUikgKiBZRUFSOwotCQlwID0gbG9jYWx0aW1lKCZ0KTsKLQkJamFuem9uZSA9IC1wLT50bV9nbXRvZmY7Ci0JCXN0cm5jcHkoamFubmFtZSwgcC0+dG1fem9uZSA/IHAtPnRtX3pvbmUgOiAiICAgIiwgOSk7Ci0JCWphbm5hbWVbOV0gPSAnXDAnOwotCQl0ICs9IFlFQVIvMjsKLQkJcCA9IGxvY2FsdGltZSgmdCk7Ci0JCWp1bHl6b25lID0gLXAtPnRtX2dtdG9mZjsKLQkJc3RybmNweShqdWx5bmFtZSwgcC0+dG1fem9uZSA/IHAtPnRtX3pvbmUgOiAiICAgIiwgOSk7Ci0JCWp1bHluYW1lWzldID0gJ1wwJzsKKyAgICAgICAgdGltZV90IHQ7CisgICAgICAgIHN0cnVjdCB0bSAqcDsKKyAgICAgICAgbG9uZyBqYW56b25lLCBqdWx5em9uZTsKKyAgICAgICAgY2hhciBqYW5uYW1lWzEwXSwganVseW5hbWVbMTBdOworICAgICAgICB0ID0gKHRpbWUoKHRpbWVfdCAqKTApIC8gWUVBUikgKiBZRUFSOworICAgICAgICBwID0gbG9jYWx0aW1lKCZ0KTsKKyAgICAgICAgamFuem9uZSA9IC1wLT50bV9nbXRvZmY7CisgICAgICAgIHN0cm5jcHkoamFubmFtZSwgcC0+dG1fem9uZSA/IHAtPnRtX3pvbmUgOiAiICAgIiwgOSk7CisgICAgICAgIGphbm5hbWVbOV0gPSAnXDAnOworICAgICAgICB0ICs9IFlFQVIvMjsKKyAgICAgICAgcCA9IGxvY2FsdGltZSgmdCk7CisgICAgICAgIGp1bHl6b25lID0gLXAtPnRtX2dtdG9mZjsKKyAgICAgICAgc3RybmNweShqdWx5bmFtZSwgcC0+dG1fem9uZSA/IHAtPnRtX3pvbmUgOiAiICAgIiwgOSk7CisgICAgICAgIGp1bHluYW1lWzldID0gJ1wwJzsKIAotCQlpZiggamFuem9uZSA8IGp1bHl6b25lICkgewotCQkJLyogRFNUIGlzIHJldmVyc2VkIGluIHRoZSBzb3V0aGVybiBoZW1pc3BoZXJlICovCi0JCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCBqdWx5em9uZSk7Ci0JCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIGphbnpvbmUpOwotCQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImRheWxpZ2h0IiwKLQkJCQkJCWphbnpvbmUgIT0ganVseXpvbmUpOwotCQkJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0em5hbWUiLAotCQkJCQkgICBQeV9CdWlsZFZhbHVlKCIoenopIiwKLQkJCQkJCQkganVseW5hbWUsIGphbm5hbWUpKTsKLQkJfSBlbHNlIHsKLQkJCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJ0aW1lem9uZSIsIGphbnpvbmUpOwotCQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBqdWx5em9uZSk7Ci0JCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiZGF5bGlnaHQiLAotCQkJCQkJamFuem9uZSAhPSBqdWx5em9uZSk7Ci0JCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgInR6bmFtZSIsCi0JCQkJCSAgIFB5X0J1aWxkVmFsdWUoIih6eikiLAotCQkJCQkJCSBqYW5uYW1lLCBqdWx5bmFtZSkpOwotCQl9Ci0JfQorICAgICAgICBpZiggamFuem9uZSA8IGp1bHl6b25lICkgeworICAgICAgICAgICAgLyogRFNUIGlzIHJldmVyc2VkIGluIHRoZSBzb3V0aGVybiBoZW1pc3BoZXJlICovCisgICAgICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCBqdWx5em9uZSk7CisgICAgICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIGphbnpvbmUpOworICAgICAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImRheWxpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphbnpvbmUgIT0ganVseXpvbmUpOworICAgICAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0em5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIih6eikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVseW5hbWUsIGphbm5hbWUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJ0aW1lem9uZSIsIGphbnpvbmUpOworICAgICAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBqdWx5em9uZSk7CisgICAgICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiZGF5bGlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFuem9uZSAhPSBqdWx5em9uZSk7CisgICAgICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInR6bmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgiKHp6KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYW5uYW1lLCBqdWx5bmFtZSkpOworICAgICAgICB9CisgICAgfQogI2Vsc2UKICNlbmRpZiAvKiBIQVZFX1NUUlVDVF9UTV9UTV9aT05FICovCiAjaWZkZWYgX19DWUdXSU5fXwotCXR6c2V0KCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgInRpbWV6b25lIiwgX3RpbWV6b25lKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIF90aW1lem9uZS0zNjAwKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiZGF5bGlnaHQiLCBfZGF5bGlnaHQpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAidHpuYW1lIiwKLQkJCSAgIFB5X0J1aWxkVmFsdWUoIih6eikiLCBfdHpuYW1lWzBdLCBfdHpuYW1lWzFdKSk7CisgICAgdHpzZXQoKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCBfdGltZXpvbmUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwgX3RpbWV6b25lLTM2MDApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJkYXlsaWdodCIsIF9kYXlsaWdodCk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0em5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCIoenopIiwgX3R6bmFtZVswXSwgX3R6bmFtZVsxXSkpOwogI2VuZGlmIC8qIF9fQ1lHV0lOX18gKi8KICNlbmRpZiAvKiAhSEFWRV9UWk5BTUUgfHwgX19HTElCQ19fIHx8IF9fQ1lHV0lOX18qLwogfQogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0aW1lX21ldGhvZHNbXSA9IHsKLQl7InRpbWUiLAl0aW1lX3RpbWUsIE1FVEhfTk9BUkdTLCB0aW1lX2RvY30sCisgICAgeyJ0aW1lIiwgICAgICAgICAgICB0aW1lX3RpbWUsIE1FVEhfTk9BUkdTLCB0aW1lX2RvY30sCiAjaWZkZWYgSEFWRV9DTE9DSwotCXsiY2xvY2siLAl0aW1lX2Nsb2NrLCBNRVRIX05PQVJHUywgY2xvY2tfZG9jfSwKKyAgICB7ImNsb2NrIiwgICAgICAgICAgIHRpbWVfY2xvY2ssIE1FVEhfTk9BUkdTLCBjbG9ja19kb2N9LAogI2VuZGlmCi0JeyJzbGVlcCIsCXRpbWVfc2xlZXAsIE1FVEhfVkFSQVJHUywgc2xlZXBfZG9jfSwKLQl7ImdtdGltZSIsCXRpbWVfZ210aW1lLCBNRVRIX1ZBUkFSR1MsIGdtdGltZV9kb2N9LAotCXsibG9jYWx0aW1lIiwJdGltZV9sb2NhbHRpbWUsIE1FVEhfVkFSQVJHUywgbG9jYWx0aW1lX2RvY30sCi0JeyJhc2N0aW1lIiwJdGltZV9hc2N0aW1lLCBNRVRIX1ZBUkFSR1MsIGFzY3RpbWVfZG9jfSwKLQl7ImN0aW1lIiwJdGltZV9jdGltZSwgTUVUSF9WQVJBUkdTLCBjdGltZV9kb2N9LAorICAgIHsic2xlZXAiLCAgICAgICAgICAgdGltZV9zbGVlcCwgTUVUSF9WQVJBUkdTLCBzbGVlcF9kb2N9LAorICAgIHsiZ210aW1lIiwgICAgICAgICAgdGltZV9nbXRpbWUsIE1FVEhfVkFSQVJHUywgZ210aW1lX2RvY30sCisgICAgeyJsb2NhbHRpbWUiLCAgICAgICB0aW1lX2xvY2FsdGltZSwgTUVUSF9WQVJBUkdTLCBsb2NhbHRpbWVfZG9jfSwKKyAgICB7ImFzY3RpbWUiLCAgICAgICAgIHRpbWVfYXNjdGltZSwgTUVUSF9WQVJBUkdTLCBhc2N0aW1lX2RvY30sCisgICAgeyJjdGltZSIsICAgICAgICAgICB0aW1lX2N0aW1lLCBNRVRIX1ZBUkFSR1MsIGN0aW1lX2RvY30sCiAjaWZkZWYgSEFWRV9NS1RJTUUKLQl7Im1rdGltZSIsCXRpbWVfbWt0aW1lLCBNRVRIX08sIG1rdGltZV9kb2N9LAorICAgIHsibWt0aW1lIiwgICAgICAgICAgdGltZV9ta3RpbWUsIE1FVEhfTywgbWt0aW1lX2RvY30sCiAjZW5kaWYKICNpZmRlZiBIQVZFX1NUUkZUSU1FCi0JeyJzdHJmdGltZSIsCXRpbWVfc3RyZnRpbWUsIE1FVEhfVkFSQVJHUywgc3RyZnRpbWVfZG9jfSwKKyAgICB7InN0cmZ0aW1lIiwgICAgICAgIHRpbWVfc3RyZnRpbWUsIE1FVEhfVkFSQVJHUywgc3RyZnRpbWVfZG9jfSwKICNlbmRpZgotCXsic3RycHRpbWUiLAl0aW1lX3N0cnB0aW1lLCBNRVRIX1ZBUkFSR1MsIHN0cnB0aW1lX2RvY30sCisgICAgeyJzdHJwdGltZSIsICAgICAgICB0aW1lX3N0cnB0aW1lLCBNRVRIX1ZBUkFSR1MsIHN0cnB0aW1lX2RvY30sCiAjaWZkZWYgSEFWRV9XT1JLSU5HX1RaU0VUCi0JeyJ0enNldCIsCXRpbWVfdHpzZXQsIE1FVEhfTk9BUkdTLCB0enNldF9kb2N9LAorICAgIHsidHpzZXQiLCAgICAgICAgICAgdGltZV90enNldCwgTUVUSF9OT0FSR1MsIHR6c2V0X2RvY30sCiAjZW5kaWYKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTgzNiwzOCArODM2LDM4IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdHRpbWUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQljaGFyICpwOwotCW0gPSBQeV9Jbml0TW9kdWxlMygidGltZSIsIHRpbWVfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptOworICAgIGNoYXIgKnA7CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJ0aW1lIiwgdGltZV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBY2NlcHQgMi1kaWdpdCBkYXRlcyB1bmxlc3MgUFlUSE9OWTJLIGlzIHNldCBhbmQgbm9uLWVtcHR5ICovCi0JcCA9IFB5X0dFVEVOVigiUFlUSE9OWTJLIik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFjY2VwdDJkeWVhciIsIChsb25nKSAoIXAgfHwgISpwKSk7Ci0JLyogU3F1aXJyZWwgYXdheSB0aGUgbW9kdWxlJ3MgZGljdGlvbmFyeSBmb3IgdGhlIHkyayBjaGVjayAqLwotCW1vZGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVB5X0lOQ1JFRihtb2RkaWN0KTsKKyAgICAvKiBBY2NlcHQgMi1kaWdpdCBkYXRlcyB1bmxlc3MgUFlUSE9OWTJLIGlzIHNldCBhbmQgbm9uLWVtcHR5ICovCisgICAgcCA9IFB5X0dFVEVOVigiUFlUSE9OWTJLIik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFjY2VwdDJkeWVhciIsIChsb25nKSAoIXAgfHwgISpwKSk7CisgICAgLyogU3F1aXJyZWwgYXdheSB0aGUgbW9kdWxlJ3MgZGljdGlvbmFyeSBmb3IgdGhlIHkyayBjaGVjayAqLworICAgIG1vZGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFB5X0lOQ1JFRihtb2RkaWN0KTsKIAotCS8qIFNldCwgb3IgcmVzZXQsIG1vZHVsZSB2YXJpYWJsZXMgbGlrZSB0aW1lLnRpbWV6b25lICovCi0JaW5pdHRpbWV6b25lKG0pOworICAgIC8qIFNldCwgb3IgcmVzZXQsIG1vZHVsZSB2YXJpYWJsZXMgbGlrZSB0aW1lLnRpbWV6b25lICovCisgICAgaW5pdHRpbWV6b25lKG0pOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCS8qIEhlbHBlciB0byBhbGxvdyBpbnRlcnJ1cHRzIGZvciBXaW5kb3dzLgotCSAgIElmIEN0cmwrQyBldmVudCBkZWxpdmVyZWQgd2hpbGUgbm90IHNsZWVwaW5nCi0JICAgaXQgd2lsbCBiZSBpZ25vcmVkLgotCSovCi0JbWFpbl90aHJlYWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7Ci0JaEludGVycnVwdEV2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOwotCVNldENvbnNvbGVDdHJsSGFuZGxlciggUHlDdHJsSGFuZGxlciwgVFJVRSk7CisgICAgLyogSGVscGVyIHRvIGFsbG93IGludGVycnVwdHMgZm9yIFdpbmRvd3MuCisgICAgICAgSWYgQ3RybCtDIGV2ZW50IGRlbGl2ZXJlZCB3aGlsZSBub3Qgc2xlZXBpbmcKKyAgICAgICBpdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgKi8KKyAgICBtYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBoSW50ZXJydXB0RXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7CisgICAgU2V0Q29uc29sZUN0cmxIYW5kbGVyKCBQeUN0cmxIYW5kbGVyLCBUUlVFKTsKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCi0JaWYgKCFpbml0aWFsaXplZCkgewotCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RUaW1lVHlwZSwKLQkJCQkJICAmc3RydWN0X3RpbWVfdHlwZV9kZXNjKTsKLQl9Ci0JUHlfSU5DUkVGKCZTdHJ1Y3RUaW1lVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfdGltZSIsIChQeU9iamVjdCopICZTdHJ1Y3RUaW1lVHlwZSk7Ci0JaW5pdGlhbGl6ZWQgPSAxOworICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0VGltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cnVjdF90aW1lX3R5cGVfZGVzYyk7CisgICAgfQorICAgIFB5X0lOQ1JFRigmU3RydWN0VGltZVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3RpbWUiLCAoUHlPYmplY3QqKSAmU3RydWN0VGltZVR5cGUpOworICAgIGluaXRpYWxpemVkID0gMTsKIH0KIAogCkBAIC04NzYsMzggKzg3NiwzOCBAQAogc3RhdGljIGRvdWJsZQogZmxvYXR0aW1lKHZvaWQpCiB7Ci0JLyogVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gZ2V0IHRoZSB0aW1lOgotCSAgKDEpIGdldHRpbWVvZmRheSgpIC0tIHJlc29sdXRpb24gaW4gbWljcm9zZWNvbmRzCi0JICAoMikgZnRpbWUoKSAtLSByZXNvbHV0aW9uIGluIG1pbGxpc2Vjb25kcwotCSAgKDMpIHRpbWUoKSAtLSByZXNvbHV0aW9uIGluIHNlY29uZHMKLQkgIEluIGFsbCBjYXNlcyB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgZmxvYXQgaW4gc2Vjb25kcy4KLQkgIFNpbmNlIG9uIHNvbWUgc3lzdGVtcyAoZS5nLiBTQ08gT0RUIDMuMCkgZ2V0dGltZW9mZGF5KCkgbWF5Ci0JICBmYWlsLCBzbyB3ZSBmYWxsIGJhY2sgb24gZnRpbWUoKSBvciB0aW1lKCkuCi0JICBOb3RlOiBjbG9jayByZXNvbHV0aW9uIGRvZXMgbm90IGltcGx5IGNsb2NrIGFjY3VyYWN5ISAqLworICAgIC8qIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGdldCB0aGUgdGltZToKKyAgICAgICgxKSBnZXR0aW1lb2ZkYXkoKSAtLSByZXNvbHV0aW9uIGluIG1pY3Jvc2Vjb25kcworICAgICAgKDIpIGZ0aW1lKCkgLS0gcmVzb2x1dGlvbiBpbiBtaWxsaXNlY29uZHMKKyAgICAgICgzKSB0aW1lKCkgLS0gcmVzb2x1dGlvbiBpbiBzZWNvbmRzCisgICAgICBJbiBhbGwgY2FzZXMgdGhlIHJldHVybiB2YWx1ZSBpcyBhIGZsb2F0IGluIHNlY29uZHMuCisgICAgICBTaW5jZSBvbiBzb21lIHN5c3RlbXMgKGUuZy4gU0NPIE9EVCAzLjApIGdldHRpbWVvZmRheSgpIG1heQorICAgICAgZmFpbCwgc28gd2UgZmFsbCBiYWNrIG9uIGZ0aW1lKCkgb3IgdGltZSgpLgorICAgICAgTm90ZTogY2xvY2sgcmVzb2x1dGlvbiBkb2VzIG5vdCBpbXBseSBjbG9jayBhY2N1cmFjeSEgKi8KICNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotCXsKLQkJc3RydWN0IHRpbWV2YWwgdDsKKyAgICB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHQ7CiAjaWZkZWYgR0VUVElNRU9GREFZX05PX1RaCi0JCWlmIChnZXR0aW1lb2ZkYXkoJnQpID09IDApCi0JCQlyZXR1cm4gKGRvdWJsZSl0LnR2X3NlYyArIHQudHZfdXNlYyowLjAwMDAwMTsKKyAgICAgICAgaWYgKGdldHRpbWVvZmRheSgmdCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAoZG91YmxlKXQudHZfc2VjICsgdC50dl91c2VjKjAuMDAwMDAxOwogI2Vsc2UgLyogIUdFVFRJTUVPRkRBWV9OT19UWiAqLwotCQlpZiAoZ2V0dGltZW9mZGF5KCZ0LCAoc3RydWN0IHRpbWV6b25lICopTlVMTCkgPT0gMCkKLQkJCXJldHVybiAoZG91YmxlKXQudHZfc2VjICsgdC50dl91c2VjKjAuMDAwMDAxOworICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZ0LCAoc3RydWN0IHRpbWV6b25lICopTlVMTCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAoZG91YmxlKXQudHZfc2VjICsgdC50dl91c2VjKjAuMDAwMDAxOwogI2VuZGlmIC8qICFHRVRUSU1FT0ZEQVlfTk9fVFogKi8KLQl9CisgICAgfQogCiAjZW5kaWYgLyogIUhBVkVfR0VUVElNRU9GREFZICovCi0JeworICAgIHsKICNpZiBkZWZpbmVkKEhBVkVfRlRJTUUpCi0JCXN0cnVjdCB0aW1lYiB0OwotCQlmdGltZSgmdCk7Ci0JCXJldHVybiAoZG91YmxlKXQudGltZSArIChkb3VibGUpdC5taWxsaXRtICogKGRvdWJsZSkwLjAwMTsKKyAgICAgICAgc3RydWN0IHRpbWViIHQ7CisgICAgICAgIGZ0aW1lKCZ0KTsKKyAgICAgICAgcmV0dXJuIChkb3VibGUpdC50aW1lICsgKGRvdWJsZSl0Lm1pbGxpdG0gKiAoZG91YmxlKTAuMDAxOwogI2Vsc2UgLyogIUhBVkVfRlRJTUUgKi8KLQkJdGltZV90IHNlY3M7Ci0JCXRpbWUoJnNlY3MpOwotCQlyZXR1cm4gKGRvdWJsZSlzZWNzOworICAgICAgICB0aW1lX3Qgc2VjczsKKyAgICAgICAgdGltZSgmc2Vjcyk7CisgICAgICAgIHJldHVybiAoZG91YmxlKXNlY3M7CiAjZW5kaWYgLyogIUhBVkVfRlRJTUUgKi8KLQl9CisgICAgfQogfQogCiAKQEAgLTkyMCwxMjIgKzkyMCwxMjIgQEAKIHsKIC8qIFhYWCBTaG91bGQgdGVzdCBmb3IgTVNfV0lORE9XUyBmaXJzdCEgKi8KICNpZiBkZWZpbmVkKEhBVkVfU0VMRUNUKSAmJiAhZGVmaW5lZChfX0JFT1NfXykgJiYgIWRlZmluZWQoX19FTVhfXykKLQlzdHJ1Y3QgdGltZXZhbCB0OwotCWRvdWJsZSBmcmFjOwotCWZyYWMgPSBmbW9kKHNlY3MsIDEuMCk7Ci0Jc2VjcyA9IGZsb29yKHNlY3MpOwotCXQudHZfc2VjID0gKGxvbmcpc2VjczsKLQl0LnR2X3VzZWMgPSAobG9uZykoZnJhYyoxMDAwMDAwLjApOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlpZiAoc2VsZWN0KDAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsICZ0KSAhPSAwKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdDsKKyAgICBkb3VibGUgZnJhYzsKKyAgICBmcmFjID0gZm1vZChzZWNzLCAxLjApOworICAgIHNlY3MgPSBmbG9vcihzZWNzKTsKKyAgICB0LnR2X3NlYyA9IChsb25nKXNlY3M7CisgICAgdC50dl91c2VjID0gKGxvbmcpKGZyYWMqMTAwMDAwMC4wKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgaWYgKHNlbGVjdCgwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdCkgIT0gMCkgewogI2lmZGVmIEVJTlRSCi0JCWlmIChlcnJubyAhPSBFSU5UUikgeworICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKICNlbHNlCi0JCWlmICgxKSB7CisgICAgICAgIGlmICgxKSB7CiAjZW5kaWYKLQkJCVB5X0JMT0NLX1RIUkVBRFMKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIFB5X0VORF9BTExPV19USFJFQURTCiAjZWxpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKSAmJiAhZGVmaW5lZChfX1FOWF9fKQotCS8qIFhYWCBDYW4ndCBpbnRlcnJ1cHQgdGhpcyBzbGVlcCAqLwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlkZWxheSgoaW50KShzZWNzICogMTAwMCArIDAuNSkpOyAgLyogZGVsYXkoKSB1c2VzIG1pbGxpc2Vjb25kcyAqLwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgLyogWFhYIENhbid0IGludGVycnVwdCB0aGlzIHNsZWVwICovCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGRlbGF5KChpbnQpKHNlY3MgKiAxMDAwICsgMC41KSk7ICAvKiBkZWxheSgpIHVzZXMgbWlsbGlzZWNvbmRzICovCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICNlbGlmIGRlZmluZWQoTVNfV0lORE9XUykKLQl7Ci0JCWRvdWJsZSBtaWxsaXNlY3MgPSBzZWNzICogMTAwMC4wOwotCQl1bnNpZ25lZCBsb25nIHVsX21pbGxpczsKKyAgICB7CisgICAgICAgIGRvdWJsZSBtaWxsaXNlY3MgPSBzZWNzICogMTAwMC4wOworICAgICAgICB1bnNpZ25lZCBsb25nIHVsX21pbGxpczsKIAotCQlpZiAobWlsbGlzZWNzID4gKGRvdWJsZSlVTE9OR19NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkic2xlZXAgbGVuZ3RoIGlzIHRvbyBsYXJnZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJLyogQWxsb3cgc2xlZXAoMCkgdG8gbWFpbnRhaW4gd2luMzIgc2VtYW50aWNzLCBhbmQgYXMgZGVjcmVlZAotCQkgKiBieSBHdWlkbywgb25seSB0aGUgbWFpbiB0aHJlYWQgY2FuIGJlIGludGVycnVwdGVkLgotCQkgKi8KLQkJdWxfbWlsbGlzID0gKHVuc2lnbmVkIGxvbmcpbWlsbGlzZWNzOwotCQlpZiAodWxfbWlsbGlzID09IDAgfHwKLQkJICAgIG1haW5fdGhyZWFkICE9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkKLQkJCVNsZWVwKHVsX21pbGxpcyk7Ci0JCWVsc2UgewotCQkJRFdPUkQgcmM7Ci0JCQlSZXNldEV2ZW50KGhJbnRlcnJ1cHRFdmVudCk7Ci0JCQlyYyA9IFdhaXRGb3JTaW5nbGVPYmplY3QoaEludGVycnVwdEV2ZW50LCB1bF9taWxsaXMpOwotCQkJaWYgKHJjID09IFdBSVRfT0JKRUNUXzApIHsKLQkJCQkvKiBZaWVsZCB0byBtYWtlIHN1cmUgcmVhbCBQeXRob24gc2lnbmFsCi0JCQkJICogaGFuZGxlciBjYWxsZWQuCi0JCQkJICovCi0JCQkJU2xlZXAoMSk7Ci0JCQkJUHlfQkxPQ0tfVEhSRUFEUwotCQkJCWVycm5vID0gRUlOVFI7Ci0JCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KKyAgICAgICAgaWYgKG1pbGxpc2VjcyA+IChkb3VibGUpVUxPTkdfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2xlZXAgbGVuZ3RoIGlzIHRvbyBsYXJnZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgLyogQWxsb3cgc2xlZXAoMCkgdG8gbWFpbnRhaW4gd2luMzIgc2VtYW50aWNzLCBhbmQgYXMgZGVjcmVlZAorICAgICAgICAgKiBieSBHdWlkbywgb25seSB0aGUgbWFpbiB0aHJlYWQgY2FuIGJlIGludGVycnVwdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdWxfbWlsbGlzID0gKHVuc2lnbmVkIGxvbmcpbWlsbGlzZWNzOworICAgICAgICBpZiAodWxfbWlsbGlzID09IDAgfHwKKyAgICAgICAgICAgIG1haW5fdGhyZWFkICE9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkKKyAgICAgICAgICAgIFNsZWVwKHVsX21pbGxpcyk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgRFdPUkQgcmM7CisgICAgICAgICAgICBSZXNldEV2ZW50KGhJbnRlcnJ1cHRFdmVudCk7CisgICAgICAgICAgICByYyA9IFdhaXRGb3JTaW5nbGVPYmplY3QoaEludGVycnVwdEV2ZW50LCB1bF9taWxsaXMpOworICAgICAgICAgICAgaWYgKHJjID09IFdBSVRfT0JKRUNUXzApIHsKKyAgICAgICAgICAgICAgICAvKiBZaWVsZCB0byBtYWtlIHN1cmUgcmVhbCBQeXRob24gc2lnbmFsCisgICAgICAgICAgICAgICAgICogaGFuZGxlciBjYWxsZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgU2xlZXAoMSk7CisgICAgICAgICAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICAgICAgICAgIGVycm5vID0gRUlOVFI7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KICNlbGlmIGRlZmluZWQoUFlPU19PUzIpCi0JLyogVGhpcyBTbGVlcCAqSVMqIEludGVycnVwdGFibGUgYnkgRXhjZXB0aW9ucyAqLwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlpZiAoRG9zU2xlZXAoc2VjcyAqIDEwMDApICE9IE5PX0VSUk9SKSB7Ci0JCVB5X0JMT0NLX1RIUkVBRFMKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgLyogVGhpcyBTbGVlcCAqSVMqIEludGVycnVwdGFibGUgYnkgRXhjZXB0aW9ucyAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoRG9zU2xlZXAoc2VjcyAqIDEwMDApICE9IE5PX0VSUk9SKSB7CisgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0VORF9BTExPV19USFJFQURTCiAjZWxpZiBkZWZpbmVkKF9fQkVPU19fKQotCS8qIFRoaXMgc2xlZXAgKkNBTiBCRSogaW50ZXJydXB0ZWQuICovCi0JewotCQlpZiggc2VjcyA8PSAwLjAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KKyAgICAvKiBUaGlzIHNsZWVwICpDQU4gQkUqIGludGVycnVwdGVkLiAqLworICAgIHsKKyAgICAgICAgaWYoIHNlY3MgPD0gMC4wICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkvKiBCZU9TIHNub296ZSgpIGlzIGluIG1pY3Jvc2Vjb25kcy4uLiAqLwotCQlpZiggc25vb3plKCAoYmlndGltZV90KSggc2VjcyAqIDEwMDAuMCAqIDEwMDAuMCApICkgPT0gQl9JTlRFUlJVUFRFRCApIHsKLQkJCVB5X0JMT0NLX1RIUkVBRFMKLQkJCVB5RXJyX1NldEZyb21FcnJubyggUHlFeGNfSU9FcnJvciApOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQorICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIC8qIEJlT1Mgc25vb3plKCkgaXMgaW4gbWljcm9zZWNvbmRzLi4uICovCisgICAgICAgIGlmKCBzbm9vemUoIChiaWd0aW1lX3QpKCBzZWNzICogMTAwMC4wICogMTAwMC4wICkgKSA9PSBCX0lOVEVSUlVQVEVEICkgeworICAgICAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKCBQeUV4Y19JT0Vycm9yICk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CiAjZWxpZiBkZWZpbmVkKFJJU0NPUykKLQlpZiAoc2VjcyA8PSAwLjApCi0JCXJldHVybiAwOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkvKiBUaGlzIHNsZWVwICpDQU4gQkUqIGludGVycnVwdGVkLiAqLwotCWlmICggcmlzY29zX3NsZWVwKHNlY3MpICkKLQkJcmV0dXJuIC0xOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHNlY3MgPD0gMC4wKQorICAgICAgICByZXR1cm4gMDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgLyogVGhpcyBzbGVlcCAqQ0FOIEJFKiBpbnRlcnJ1cHRlZC4gKi8KKyAgICBpZiAoIHJpc2Nvc19zbGVlcChzZWNzKSApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogI2VsaWYgZGVmaW5lZChQTEFOOSkKLQl7Ci0JCWRvdWJsZSBtaWxsaXNlY3MgPSBzZWNzICogMTAwMC4wOwotCQlpZiAobWlsbGlzZWNzID4gKGRvdWJsZSlMT05HX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzbGVlcCBsZW5ndGggaXMgdG9vIGxhcmdlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJLyogVGhpcyBzbGVlcCAqQ0FOIEJFKiBpbnRlcnJ1cHRlZC4gKi8KLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlpZihzbGVlcCgobG9uZyltaWxsaXNlY3MpIDwgMCl7Ci0JCQlQeV9CTE9DS19USFJFQURTCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9CisgICAgeworICAgICAgICBkb3VibGUgbWlsbGlzZWNzID0gc2VjcyAqIDEwMDAuMDsKKyAgICAgICAgaWYgKG1pbGxpc2VjcyA+IChkb3VibGUpTE9OR19NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic2xlZXAgbGVuZ3RoIGlzIHRvbyBsYXJnZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIC8qIFRoaXMgc2xlZXAgKkNBTiBCRSogaW50ZXJydXB0ZWQuICovCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYoc2xlZXAoKGxvbmcpbWlsbGlzZWNzKSA8IDApeworICAgICAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQogI2Vsc2UKLQkvKiBYWFggQ2FuJ3QgaW50ZXJydXB0IHRoaXMgc2xlZXAgKi8KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc2xlZXAoKGludClzZWNzKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIC8qIFhYWCBDYW4ndCBpbnRlcnJ1cHQgdGhpcyBzbGVlcCAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzbGVlcCgoaW50KXNlY3MpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAjZW5kaWYKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvdGltaW5nbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWluZ21vZHVsZS5jCmluZGV4IDBkYTVjNmIuLmE0ZTJjN2UgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGltaW5nbW9kdWxlLmMKKysrIGIvTW9kdWxlcy90aW1pbmdtb2R1bGUuYwpAQCAtMTAsNDUgKzEwLDQ1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RhcnRfdGltaW5nKFB5T2JqZWN0ICpzZWxmKQogewotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlCRUdJTlRJTUlORzsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgQkVHSU5USU1JTkc7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaW5pc2hfdGltaW5nKFB5T2JqZWN0ICpzZWxmKQogewotCUVORFRJTUlORyAgICAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgRU5EVElNSU5HCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2Vjb25kcyhQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNSU5HUyk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUlOR1MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWlsbGkoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUlOR01TKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNSU5HTVMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWljcm8oUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUlOR1VTKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNSU5HVVMpOwogfQogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0aW1pbmdfbWV0aG9kc1tdID0gewotCXsic3RhcnQiLCAgIChQeUNGdW5jdGlvbilzdGFydF90aW1pbmcsIE1FVEhfTk9BUkdTfSwKLQl7ImZpbmlzaCIsICAoUHlDRnVuY3Rpb24pZmluaXNoX3RpbWluZywgTUVUSF9OT0FSR1N9LAotCXsic2Vjb25kcyIsIChQeUNGdW5jdGlvbilzZWNvbmRzLCBNRVRIX05PQVJHU30sCi0JeyJtaWxsaSIsICAgKFB5Q0Z1bmN0aW9uKW1pbGxpLCBNRVRIX05PQVJHU30sCi0JeyJtaWNybyIsICAgKFB5Q0Z1bmN0aW9uKW1pY3JvLCBNRVRIX05PQVJHU30sCi0Je05VTEwsICAgICAgTlVMTH0KKyAgICB7InN0YXJ0IiwgICAoUHlDRnVuY3Rpb24pc3RhcnRfdGltaW5nLCBNRVRIX05PQVJHU30sCisgICAgeyJmaW5pc2giLCAgKFB5Q0Z1bmN0aW9uKWZpbmlzaF90aW1pbmcsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNlY29uZHMiLCAoUHlDRnVuY3Rpb24pc2Vjb25kcywgTUVUSF9OT0FSR1N9LAorICAgIHsibWlsbGkiLCAgIChQeUNGdW5jdGlvbiltaWxsaSwgTUVUSF9OT0FSR1N9LAorICAgIHsibWljcm8iLCAgIChQeUNGdW5jdGlvbiltaWNybywgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgIE5VTEx9CiB9OwogCiAKQEAgLTU2LDcgKzU2LDcgQEAKIHsKICAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSB0aW1pbmcgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjA7IHVzZSB0aW1lLmNsb2NrKCkgaW5zdGVhZCIsIDIpIDwgMCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotCSh2b2lkKVB5X0luaXRNb2R1bGUoInRpbWluZyIsIHRpbWluZ19tZXRob2RzKTsKKyAgICByZXR1cm47CisKKyAgICAodm9pZClQeV9Jbml0TW9kdWxlKCJ0aW1pbmciLCB0aW1pbmdfbWV0aG9kcyk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3RrYXBwaW5pdC5jIGIvTW9kdWxlcy90a2FwcGluaXQuYwppbmRleCAzNTNhYmNjLi5jMWY5N2IwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RrYXBwaW5pdC5jCisrKyBiL01vZHVsZXMvdGthcHBpbml0LmMKQEAgLTI2LDE1NCArMjYsMTU0IEBACiBpbnQKIFRjbF9BcHBJbml0KFRjbF9JbnRlcnAgKmludGVycCkKIHsKLQlUa19XaW5kb3cgbWFpbl93aW5kb3c7Ci0JY29uc3QgY2hhciAqX3RraW50ZXJfc2tpcF90a19pbml0OworICAgIFRrX1dpbmRvdyBtYWluX3dpbmRvdzsKKyAgICBjb25zdCBjaGFyICpfdGtpbnRlcl9za2lwX3RrX2luaXQ7CiAjaWZkZWYgVEtJTlRFUl9QUk9URUNUX0xPQURUSwotCWNvbnN0IGNoYXIgKl90a2ludGVyX3RrX2ZhaWxlZDsKKyAgICBjb25zdCBjaGFyICpfdGtpbnRlcl90a19mYWlsZWQ7CiAjZW5kaWYKIAogI2lmZGVmIFRLX0FRVUEKICNpZm5kZWYgTUFYX1BBVEhfTEVOCiAjZGVmaW5lIE1BWF9QQVRIX0xFTiAxMDI0CiAjZW5kaWYKLQljaGFyIHRjbExpYlBhdGhbTUFYX1BBVEhfTEVOXSwgdGtMaWJQYXRoW01BWF9QQVRIX0xFTl07Ci0JVGNsX09iaioJcGF0aFB0cjsKKyAgICBjaGFyIHRjbExpYlBhdGhbTUFYX1BBVEhfTEVOXSwgdGtMaWJQYXRoW01BWF9QQVRIX0xFTl07CisgICAgVGNsX09iaiogICAgICAgICAgICBwYXRoUHRyOwogCi0gICAgICAgIC8qIHByZS0gVGNsX0luaXQgY29kZSBjb3BpZWQgZnJvbSB0a01hY09TWEFwcEluaXQuYyAqLwotCVRrX01hY09TWE9wZW5CdW5kbGVSZXNvdXJjZXMgKGludGVycCwgImNvbS50Y2x0ay50Y2xsaWJyYXJ5IiwKLSAgICAgICAJdGNsTGliUGF0aCwgTUFYX1BBVEhfTEVOLCAwKTsKKyAgICAvKiBwcmUtIFRjbF9Jbml0IGNvZGUgY29waWVkIGZyb20gdGtNYWNPU1hBcHBJbml0LmMgKi8KKyAgICBUa19NYWNPU1hPcGVuQnVuZGxlUmVzb3VyY2VzIChpbnRlcnAsICJjb20udGNsdGsudGNsbGlicmFyeSIsCisgICAgdGNsTGliUGF0aCwgTUFYX1BBVEhfTEVOLCAwKTsKIAotCWlmICh0Y2xMaWJQYXRoWzBdICE9ICdcMCcpIHsKLSAgICAgICAJVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xfbGlicmFyeSIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7Ci0JCVRjbF9TZXRWYXIoaW50ZXJwLCAidGNsRGVmYXVsdExpYnJhcnkiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOwotCQlUY2xfU2V0VmFyKGludGVycCwgInRjbF9wa2dQYXRoIiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKLQl9CisgICAgaWYgKHRjbExpYlBhdGhbMF0gIT0gJ1wwJykgeworICAgIFRjbF9TZXRWYXIoaW50ZXJwLCAidGNsX2xpYnJhcnkiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOworICAgICAgICBUY2xfU2V0VmFyKGludGVycCwgInRjbERlZmF1bHRMaWJyYXJ5IiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICAgICAgVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xfcGtnUGF0aCIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgfQogCi0gICAJaWYgKHRjbExpYlBhdGhbMF0gIT0gJ1wwJykgewotCQlUY2xfU2V0VmFyKGludGVycCwgInRjbF9saWJyYXJ5IiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKLQkJVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xEZWZhdWx0TGlicmFyeSIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7Ci0JCVRjbF9TZXRWYXIoaW50ZXJwLCAidGNsX3BrZ1BhdGgiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOwotCX0KKyAgICBpZiAodGNsTGliUGF0aFswXSAhPSAnXDAnKSB7CisgICAgICAgIFRjbF9TZXRWYXIoaW50ZXJwLCAidGNsX2xpYnJhcnkiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOworICAgICAgICBUY2xfU2V0VmFyKGludGVycCwgInRjbERlZmF1bHRMaWJyYXJ5IiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICAgICAgVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xfcGtnUGF0aCIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgfQogI2VuZGlmCi0JaWYgKFRjbF9Jbml0IChpbnRlcnApID09IFRDTF9FUlJPUikKLQkJcmV0dXJuIFRDTF9FUlJPUjsKKyAgICBpZiAoVGNsX0luaXQgKGludGVycCkgPT0gVENMX0VSUk9SKQorICAgICAgICByZXR1cm4gVENMX0VSUk9SOwogCiAjaWZkZWYgVEtfQVFVQQotICAgICAgICAvKiBwcmUtIFRrX0luaXQgY29kZSBjb3BpZWQgZnJvbSB0a01hY09TWEFwcEluaXQuYyAqLwotCVRrX01hY09TWE9wZW5CdW5kbGVSZXNvdXJjZXMgKGludGVycCwgImNvbS50Y2x0ay50a2xpYnJhcnkiLAotICAgICAgICAgICAgdGtMaWJQYXRoLCBNQVhfUEFUSF9MRU4sIDEpOworICAgIC8qIHByZS0gVGtfSW5pdCBjb2RlIGNvcGllZCBmcm9tIHRrTWFjT1NYQXBwSW5pdC5jICovCisgICAgVGtfTWFjT1NYT3BlbkJ1bmRsZVJlc291cmNlcyAoaW50ZXJwLCAiY29tLnRjbHRrLnRrbGlicmFyeSIsCisgICAgICAgIHRrTGliUGF0aCwgTUFYX1BBVEhfTEVOLCAxKTsKIAotCWlmICh0Y2xMaWJQYXRoWzBdICE9ICdcMCcpIHsKLQkJcGF0aFB0ciA9IFRjbF9OZXdTdHJpbmdPYmoodGNsTGliUGF0aCwgLTEpOwotCX0gZWxzZSB7Ci0JCVRjbF9PYmogKnBhdGhQdHIgPSBUY2xHZXRMaWJyYXJ5UGF0aCgpOwotCX0KKyAgICBpZiAodGNsTGliUGF0aFswXSAhPSAnXDAnKSB7CisgICAgICAgIHBhdGhQdHIgPSBUY2xfTmV3U3RyaW5nT2JqKHRjbExpYlBhdGgsIC0xKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUY2xfT2JqICpwYXRoUHRyID0gVGNsR2V0TGlicmFyeVBhdGgoKTsKKyAgICB9CiAKLQlpZiAodGtMaWJQYXRoWzBdICE9ICdcMCcpIHsKLQkJVGNsX09iaiAqb2JqUHRyOworICAgIGlmICh0a0xpYlBhdGhbMF0gIT0gJ1wwJykgeworICAgICAgICBUY2xfT2JqICpvYmpQdHI7CiAKLQkJVGNsX1NldFZhcihpbnRlcnAsICJ0a19saWJyYXJ5IiwgdGtMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOwotCQlvYmpQdHIgPSBUY2xfTmV3U3RyaW5nT2JqKHRrTGliUGF0aCwgLTEpOwotCQlUY2xfTGlzdE9iakFwcGVuZEVsZW1lbnQoTlVMTCwgcGF0aFB0ciwgb2JqUHRyKTsKLQl9CisgICAgICAgIFRjbF9TZXRWYXIoaW50ZXJwLCAidGtfbGlicmFyeSIsIHRrTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICAgICAgb2JqUHRyID0gVGNsX05ld1N0cmluZ09iaih0a0xpYlBhdGgsIC0xKTsKKyAgICAgICAgVGNsX0xpc3RPYmpBcHBlbmRFbGVtZW50KE5VTEwsIHBhdGhQdHIsIG9ialB0cik7CisgICAgfQogCi0JVGNsU2V0TGlicmFyeVBhdGgocGF0aFB0cik7CisgICAgVGNsU2V0TGlicmFyeVBhdGgocGF0aFB0cik7CiAjZW5kaWYKIAogI2lmZGVmIFdJVEhfWFhYCi0JCS8qIEluaXRpYWxpemUgbW9kdWxlcyB0aGF0IGRvbid0IHJlcXVpcmUgVGsgKi8KKyAgICAgICAgLyogSW5pdGlhbGl6ZSBtb2R1bGVzIHRoYXQgZG9uJ3QgcmVxdWlyZSBUayAqLwogI2VuZGlmCiAKLQlfdGtpbnRlcl9za2lwX3RrX2luaXQgPQlUY2xfR2V0VmFyKGludGVycCwKLQkJCSJfdGtpbnRlcl9za2lwX3RrX2luaXQiLCBUQ0xfR0xPQkFMX09OTFkpOwotCWlmIChfdGtpbnRlcl9za2lwX3RrX2luaXQgIT0gTlVMTCAmJgotCQkJc3RyY21wKF90a2ludGVyX3NraXBfdGtfaW5pdCwgIjEiKSA9PSAwKSB7Ci0JCXJldHVybiBUQ0xfT0s7Ci0JfQorICAgIF90a2ludGVyX3NraXBfdGtfaW5pdCA9ICAgICBUY2xfR2V0VmFyKGludGVycCwKKyAgICAgICAgICAgICAgICAgICAgIl90a2ludGVyX3NraXBfdGtfaW5pdCIsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgaWYgKF90a2ludGVyX3NraXBfdGtfaW5pdCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgIHN0cmNtcChfdGtpbnRlcl9za2lwX3RrX2luaXQsICIxIikgPT0gMCkgeworICAgICAgICByZXR1cm4gVENMX09LOworICAgIH0KIAogI2lmZGVmIFRLSU5URVJfUFJPVEVDVF9MT0FEVEsKLQlfdGtpbnRlcl90a19mYWlsZWQgPSBUY2xfR2V0VmFyKGludGVycCwKLQkJCSJfdGtpbnRlcl90a19mYWlsZWQiLCBUQ0xfR0xPQkFMX09OTFkpOworICAgIF90a2ludGVyX3RrX2ZhaWxlZCA9IFRjbF9HZXRWYXIoaW50ZXJwLAorICAgICAgICAgICAgICAgICAgICAiX3RraW50ZXJfdGtfZmFpbGVkIiwgVENMX0dMT0JBTF9PTkxZKTsKIAotCWlmICh0a19sb2FkX2ZhaWxlZCB8fCAoCi0JCQkJX3RraW50ZXJfdGtfZmFpbGVkICE9IE5VTEwgJiYKLQkJCQlzdHJjbXAoX3RraW50ZXJfdGtfZmFpbGVkLCAiMSIpID09IDApKSB7Ci0JCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCBUS0lOVEVSX0xPQURUS19FUlJNU0csIFRDTF9TVEFUSUMpOwotCQlyZXR1cm4gVENMX0VSUk9SOwotCX0KKyAgICBpZiAodGtfbG9hZF9mYWlsZWQgfHwgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90a2ludGVyX3RrX2ZhaWxlZCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKF90a2ludGVyX3RrX2ZhaWxlZCwgIjEiKSA9PSAwKSkgeworICAgICAgICBUY2xfU2V0UmVzdWx0KGludGVycCwgVEtJTlRFUl9MT0FEVEtfRVJSTVNHLCBUQ0xfU1RBVElDKTsKKyAgICAgICAgcmV0dXJuIFRDTF9FUlJPUjsKKyAgICB9CiAjZW5kaWYKIAotCWlmIChUa19Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7CisgICAgaWYgKFRrX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKICNpZmRlZiBUS0lOVEVSX1BST1RFQ1RfTE9BRFRLCi0JCXRrX2xvYWRfZmFpbGVkID0gMTsKLQkJVGNsX1NldFZhcihpbnRlcnAsICJfdGtpbnRlcl90a19mYWlsZWQiLCAiMSIsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgICAgIHRrX2xvYWRfZmFpbGVkID0gMTsKKyAgICAgICAgVGNsX1NldFZhcihpbnRlcnAsICJfdGtpbnRlcl90a19mYWlsZWQiLCAiMSIsIFRDTF9HTE9CQUxfT05MWSk7CiAjZW5kaWYKLQkJcmV0dXJuIFRDTF9FUlJPUjsKLQl9CisgICAgICAgIHJldHVybiBUQ0xfRVJST1I7CisgICAgfQogCi0JbWFpbl93aW5kb3cgPSBUa19NYWluV2luZG93KGludGVycCk7CisgICAgbWFpbl93aW5kb3cgPSBUa19NYWluV2luZG93KGludGVycCk7CiAKICNpZmRlZiBUS19BUVVBCi0JVGtNYWNPU1hJbml0QXBwbGVFdmVudHMoaW50ZXJwKTsKLQlUa01hY09TWEluaXRNZW51cyhpbnRlcnApOworICAgIFRrTWFjT1NYSW5pdEFwcGxlRXZlbnRzKGludGVycCk7CisgICAgVGtNYWNPU1hJbml0TWVudXMoaW50ZXJwKTsKICNlbmRpZgogCiAjaWZkZWYgV0lUSF9NT1JFQlVUVE9OUwotCXsKLQkJZXh0ZXJuIFRjbF9DbWRQcm9jIHN0dWRCdXR0b25DbWQ7Ci0JCWV4dGVybiBUY2xfQ21kUHJvYyB0cmlCdXR0b25DbWQ7CisgICAgeworICAgICAgICBleHRlcm4gVGNsX0NtZFByb2Mgc3R1ZEJ1dHRvbkNtZDsKKyAgICAgICAgZXh0ZXJuIFRjbF9DbWRQcm9jIHRyaUJ1dHRvbkNtZDsKIAotCQlUY2xfQ3JlYXRlQ29tbWFuZChpbnRlcnAsICJzdHVkYnV0dG9uIiwgc3R1ZEJ1dHRvbkNtZCwKLQkJCQkgIChDbGllbnREYXRhKSBtYWluX3dpbmRvdywgTlVMTCk7Ci0JCVRjbF9DcmVhdGVDb21tYW5kKGludGVycCwgInRyaWJ1dHRvbiIsIHRyaUJ1dHRvbkNtZCwKLQkJCQkgIChDbGllbnREYXRhKSBtYWluX3dpbmRvdywgTlVMTCk7Ci0JfQorICAgICAgICBUY2xfQ3JlYXRlQ29tbWFuZChpbnRlcnAsICJzdHVkYnV0dG9uIiwgc3R1ZEJ1dHRvbkNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKENsaWVudERhdGEpIG1haW5fd2luZG93LCBOVUxMKTsKKyAgICAgICAgVGNsX0NyZWF0ZUNvbW1hbmQoaW50ZXJwLCAidHJpYnV0dG9uIiwgdHJpQnV0dG9uQ21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2xpZW50RGF0YSkgbWFpbl93aW5kb3csIE5VTEwpOworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgV0lUSF9QSUwgLyogMC4yYjUgYW5kIGxhdGVyIC0tIG5vdCB5ZXQgcmVsZWFzZWQgYXMgb2YgTWF5IDE0ICovCi0JewotCQlleHRlcm4gdm9pZCBUa0ltYWdpbmdfSW5pdChUY2xfSW50ZXJwICopOwotCQlUa0ltYWdpbmdfSW5pdChpbnRlcnApOwotCQkvKiBYWFggVGtJbWFnaW5nX0luaXQoKSBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IHJldHVybiB0eXBlICovCi0JCS8qVGNsX1N0YXRpY1BhY2thZ2UoaW50ZXJwLCAiSW1hZ2luZyIsIFRrSW1hZ2luZ19Jbml0LCBOVUxMKTsqLwotCX0KKyAgICB7CisgICAgICAgIGV4dGVybiB2b2lkIFRrSW1hZ2luZ19Jbml0KFRjbF9JbnRlcnAgKik7CisgICAgICAgIFRrSW1hZ2luZ19Jbml0KGludGVycCk7CisgICAgICAgIC8qIFhYWCBUa0ltYWdpbmdfSW5pdCgpIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgcmV0dXJuIHR5cGUgKi8KKyAgICAgICAgLypUY2xfU3RhdGljUGFja2FnZShpbnRlcnAsICJJbWFnaW5nIiwgVGtJbWFnaW5nX0luaXQsIE5VTEwpOyovCisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBXSVRIX1BJTF9PTEQgLyogMC4yYjQgYW5kIGVhcmxpZXIgKi8KLQl7Ci0JCWV4dGVybiB2b2lkIFRrSW1hZ2luZ19Jbml0KHZvaWQpOwotCQkvKiBYWFggVGtJbWFnaW5nX0luaXQoKSBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IHByb3RvdHlwZSAqLwotCQkvKlRjbF9TdGF0aWNQYWNrYWdlKGludGVycCwgIkltYWdpbmciLCBUa0ltYWdpbmdfSW5pdCwgTlVMTCk7Ki8KLQl9CisgICAgeworICAgICAgICBleHRlcm4gdm9pZCBUa0ltYWdpbmdfSW5pdCh2b2lkKTsKKyAgICAgICAgLyogWFhYIFRrSW1hZ2luZ19Jbml0KCkgZG9lc24ndCBoYXZlIHRoZSByaWdodCBwcm90b3R5cGUgKi8KKyAgICAgICAgLypUY2xfU3RhdGljUGFja2FnZShpbnRlcnAsICJJbWFnaW5nIiwgVGtJbWFnaW5nX0luaXQsIE5VTEwpOyovCisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBXSVRIX1RJWAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXh0ZXJuIGludCBUaXhfSW5pdChUY2xfSW50ZXJwICppbnRlcnApOwotICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgVGl4X1NhZmVJbml0KFRjbF9JbnRlcnAgKmludGVycCk7Ci0gICAgICAgICAgICAgICAgVGNsX1N0YXRpY1BhY2thZ2UoTlVMTCwgIlRpeCIsIFRpeF9Jbml0LCBUaXhfU2FmZUluaXQpOwotICAgICAgICB9CisgICAgeworICAgICAgICBleHRlcm4gaW50IFRpeF9Jbml0KFRjbF9JbnRlcnAgKmludGVycCk7CisgICAgICAgIGV4dGVybiBpbnQgVGl4X1NhZmVJbml0KFRjbF9JbnRlcnAgKmludGVycCk7CisgICAgICAgIFRjbF9TdGF0aWNQYWNrYWdlKE5VTEwsICJUaXgiLCBUaXhfSW5pdCwgVGl4X1NhZmVJbml0KTsKKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIFdJVEhfQkxUCi0JewotCQlleHRlcm4gaW50IEJsdF9Jbml0KFRjbF9JbnRlcnAgKik7Ci0JCWV4dGVybiBpbnQgQmx0X1NhZmVJbml0KFRjbF9JbnRlcnAgKik7Ci0JCVRjbF9TdGF0aWNQYWNrYWdlKE5VTEwsICJCbHQiLCBCbHRfSW5pdCwgQmx0X1NhZmVJbml0KTsKLQl9CisgICAgeworICAgICAgICBleHRlcm4gaW50IEJsdF9Jbml0KFRjbF9JbnRlcnAgKik7CisgICAgICAgIGV4dGVybiBpbnQgQmx0X1NhZmVJbml0KFRjbF9JbnRlcnAgKik7CisgICAgICAgIFRjbF9TdGF0aWNQYWNrYWdlKE5VTEwsICJCbHQiLCBCbHRfSW5pdCwgQmx0X1NhZmVJbml0KTsKKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIFdJVEhfVE9HTAotCXsKLQkJLyogWFhYIEkndmUgaGVhcmQgcnVtb3JzIHRoYXQgdGhpcyBkb2Vzbid0IHdvcmsgKi8KLQkJZXh0ZXJuIGludCBUb2dsX0luaXQoVGNsX0ludGVycCAqKTsKLQkJLyogWFhYIElzIHRoZXJlIG5vIFRvZ2xfU2FmZUluaXQ/ICovCi0JCVRjbF9TdGF0aWNQYWNrYWdlKE5VTEwsICJUb2dsIiwgVG9nbF9Jbml0LCBOVUxMKTsKLQl9CisgICAgeworICAgICAgICAvKiBYWFggSSd2ZSBoZWFyZCBydW1vcnMgdGhhdCB0aGlzIGRvZXNuJ3Qgd29yayAqLworICAgICAgICBleHRlcm4gaW50IFRvZ2xfSW5pdChUY2xfSW50ZXJwICopOworICAgICAgICAvKiBYWFggSXMgdGhlcmUgbm8gVG9nbF9TYWZlSW5pdD8gKi8KKyAgICAgICAgVGNsX1N0YXRpY1BhY2thZ2UoTlVMTCwgIlRvZ2wiLCBUb2dsX0luaXQsIE5VTEwpOworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgV0lUSF9YWFgKIAogI2VuZGlmCi0JcmV0dXJuIFRDTF9PSzsKKyAgICByZXR1cm4gVENMX09LOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy91bmljb2RlZGF0YS5jIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCmluZGV4IGVkZTU3Y2IuLjc3ZjM2MzcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdW5pY29kZWRhdGEuYworKysgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKQEAgLTE5LDE0ICsxOSwxNCBAQAogLyogY2hhcmFjdGVyIHByb3BlcnRpZXMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2F0ZWdvcnk7CS8qIGluZGV4IGludG8KLQkJCQkJICAgX1B5VW5pY29kZV9DYXRlZ29yeU5hbWVzICovCi0gICAgY29uc3QgdW5zaWduZWQgY2hhcgljb21iaW5pbmc7IAkvKiBjb21iaW5pbmcgY2xhc3MgdmFsdWUgMCAtIDI1NSAqLwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIJYmlkaXJlY3Rpb25hbDsgCS8qIGluZGV4IGludG8KLQkJCQkJICAgX1B5VW5pY29kZV9CaWRpcmVjdGlvbmFsTmFtZXMgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG1pcnJvcmVkOwkvKiB0cnVlIGlmIG1pcnJvcmVkIGluIGJpZGlyIG1vZGUgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGVhc3RfYXNpYW5fd2lkdGg7CS8qIGluZGV4IGludG8KLQkJCQkJCSAgIF9QeVVuaWNvZGVfRWFzdEFzaWFuV2lkdGggKi8KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5OyAgICAgICAvKiBpbmRleCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VW5pY29kZV9DYXRlZ29yeU5hbWVzICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciBjb21iaW5pbmc7ICAgICAgLyogY29tYmluaW5nIGNsYXNzIHZhbHVlIDAgLSAyNTUgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGJpZGlyZWN0aW9uYWw7ICAvKiBpbmRleCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VW5pY29kZV9CaWRpcmVjdGlvbmFsTmFtZXMgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG1pcnJvcmVkOyAgICAgICAvKiB0cnVlIGlmIG1pcnJvcmVkIGluIGJpZGlyIG1vZGUgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGVhc3RfYXNpYW5fd2lkdGg7ICAgICAgIC8qIGluZGV4IGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVVuaWNvZGVfRWFzdEFzaWFuV2lkdGggKi8KICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG5vcm1hbGl6YXRpb25fcXVpY2tfY2hlY2s7IC8qIHNlZSBpc19ub3JtYWxpemVkKCkgKi8KIH0gX1B5VW5pY29kZV9EYXRhYmFzZVJlY29yZDsKIApAQCAtNjcsNyArNjcsNyBAQAogI2RlZmluZSBnZXRfb2xkX3JlY29yZChzZWxmLCB2KSAgICAoKCgoUHJldmlvdXNEQlZlcnNpb24qKXNlbGYpLT5nZXRyZWNvcmQpKHYpKQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgREJfbWVtYmVyc1tdID0gewotCXsidW5pZGF0YV92ZXJzaW9uIiwgVF9TVFJJTkcsIG9mZnNldG9mKFByZXZpb3VzREJWZXJzaW9uLCBuYW1lKSwgUkVBRE9OTFl9LAorICAgICAgICB7InVuaWRhdGFfdmVyc2lvbiIsIFRfU1RSSU5HLCBvZmZzZXRvZihQcmV2aW91c0RCVmVyc2lvbiwgbmFtZSksIFJFQURPTkxZfSwKICAgICAgICAge05VTEx9CiB9OwogCkBAIC03OCwxNCArNzgsMTQgQEAKIG5ld19wcmV2aW91c192ZXJzaW9uKGNvbnN0IGNoYXIqbmFtZSwgY29uc3QgY2hhbmdlX3JlY29yZCogKCpnZXRyZWNvcmQpKFB5X1VDUzQpLAogICAgICAgICAgICAgICAgICAgICAgUHlfVUNTNCAoKm5vcm1hbGl6YXRpb24pKFB5X1VDUzQpKQogewotCVByZXZpb3VzREJWZXJzaW9uICpzZWxmOwotCXNlbGYgPSBQeU9iamVjdF9OZXcoUHJldmlvdXNEQlZlcnNpb24sICZVQ0RfVHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+bmFtZSA9IG5hbWU7Ci0Jc2VsZi0+Z2V0cmVjb3JkID0gZ2V0cmVjb3JkOworICAgICAgICBQcmV2aW91c0RCVmVyc2lvbiAqc2VsZjsKKyAgICAgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhQcmV2aW91c0RCVmVyc2lvbiwgJlVDRF9UeXBlKTsKKyAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc2VsZi0+bmFtZSA9IG5hbWU7CisgICAgICAgIHNlbGYtPmdldHJlY29yZCA9IGdldHJlY29yZDsKICAgICAgICAgc2VsZi0+bm9ybWFsaXphdGlvbiA9IG5vcm1hbGl6YXRpb247Ci0JcmV0dXJuIChQeU9iamVjdCopc2VsZjsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKIH0KIAogCkBAIC05NCwxMiArOTQsMTIgQEAKICAgICBQeV9VTklDT0RFICp2ID0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKTsKIAogICAgIGlmIChQeVVuaWNvZGVfR0VUX1NJWkUob2JqKSA9PSAxKQotCXJldHVybiAqdjsKKyAgICAgICAgcmV0dXJuICp2OwogI2lmbmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBlbHNlIGlmICgoUHlVbmljb2RlX0dFVF9TSVpFKG9iaikgPT0gMikgJiYKICAgICAgICAgICAgICAoMHhEODAwIDw9IHZbMF0gJiYgdlswXSA8PSAweERCRkYpICYmCiAgICAgICAgICAgICAgKDB4REMwMCA8PSB2WzFdICYmIHZbMV0gPD0gMHhERkZGKSkKLQlyZXR1cm4gKCgodlswXSAmIDB4M0ZGKTw8MTApIHwgKHZbMV0gJiAweDNGRikpICsgMHgxMDAwMDsKKyAgICAgICAgcmV0dXJuICgoKHZbMF0gJiAweDNGRik8PDEwKSB8ICh2WzFdICYgMHgzRkYpKSArIDB4MTAwMDA7CiAjZW5kaWYKICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAibmVlZCBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlciBhcyBwYXJhbWV0ZXIiKTsKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICAgICAgICAgLyogdW5hc3NpZ25lZCAqLwogICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICAgcmMgPSAtMTsKLSAgICAgICAgfSAKKyAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChvbGQtPmRlY2ltYWxfY2hhbmdlZCAhPSAweEZGKSB7CiAgICAgICAgICAgICBoYXZlX29sZCA9IDE7CiAgICAgICAgICAgICByYyA9IG9sZC0+ZGVjaW1hbF9jaGFuZ2VkOwpAQCAtMTQ2LDE1ICsxNDYsMTUgQEAKICAgICBpZiAoIWhhdmVfb2xkKQogICAgICAgICByYyA9IFB5X1VOSUNPREVfVE9ERUNJTUFMKGMpOwogICAgIGlmIChyYyA8IDApIHsKLQlpZiAoZGVmb2JqID09IE5VTEwpIHsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgIm5vdCBhIGRlY2ltYWwiKTsKKyAgICAgICAgaWYgKGRlZm9iaiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGEgZGVjaW1hbCIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCSAgICBQeV9JTkNSRUYoZGVmb2JqKTsKLQkgICAgcmV0dXJuIGRlZm9iajsKLQl9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGVmb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZvYmo7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJjKTsKIH0KQEAgLTE4MSwxNCArMTgxLDE0IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJjID0gUHlfVU5JQ09ERV9UT0RJR0lUKGMpOwogICAgIGlmIChyYyA8IDApIHsKLQlpZiAoZGVmb2JqID09IE5VTEwpIHsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJub3QgYSBkaWdpdCIpOworICAgICAgICBpZiAoZGVmb2JqID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm90IGEgZGlnaXQiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkgICAgUHlfSU5DUkVGKGRlZm9iaik7Ci0JICAgIHJldHVybiBkZWZvYmo7Ci0JfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKGRlZm9iaik7CisgICAgICAgICAgICByZXR1cm4gZGVmb2JqOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyYyk7CiB9CkBAIC0yMjEsNyArMjIxLDcgQEAKICAgICAgICAgICAgIC8qIHVuYXNzaWduZWQgKi8KICAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKICAgICAgICAgICAgIHJjID0gLTEuMDsKLSAgICAgICAgfSAKKyAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChvbGQtPmRlY2ltYWxfY2hhbmdlZCAhPSAweEZGKSB7CiAgICAgICAgICAgICBoYXZlX29sZCA9IDE7CiAgICAgICAgICAgICByYyA9IG9sZC0+ZGVjaW1hbF9jaGFuZ2VkOwpAQCAtMjMxLDE0ICsyMzEsMTQgQEAKICAgICBpZiAoIWhhdmVfb2xkKQogICAgICAgICByYyA9IFB5X1VOSUNPREVfVE9OVU1FUklDKGMpOwogICAgIGlmIChyYyA9PSAtMS4wKSB7Ci0JaWYgKGRlZm9iaiA9PSBOVUxMKSB7Ci0JICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm90IGEgbnVtZXJpYyBjaGFyYWN0ZXIiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCSAgICBQeV9JTkNSRUYoZGVmb2JqKTsKLQkgICAgcmV0dXJuIGRlZm9iajsKLQl9CisgICAgICAgIGlmIChkZWZvYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJub3QgYSBudW1lcmljIGNoYXJhY3RlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGVmb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZvYmo7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyYyk7CiB9CkBAIC0yNTcsOCArMjU3LDggQEAKICAgICBQeV9VQ1M0IGM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmNhdGVnb3J5IiwKLQkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjID0gZ2V0dWNoYXIodik7CiAgICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjg2LDggKzI4Niw4IEBACiAgICAgUHlfVUNTNCBjOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpiaWRpcmVjdGlvbmFsIiwKLQkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjID0gZ2V0dWNoYXIodik7CiAgICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzE3LDggKzMxNyw4IEBACiAgICAgUHlfVUNTNCBjOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpjb21iaW5pbmciLAotCQkJICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VW5pY29kZV9UeXBlLCAmdikpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNDYsOCArMzQ2LDggQEAKICAgICBQeV9VQ1M0IGM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOm1pcnJvcmVkIiwKLQkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjID0gZ2V0dWNoYXIodik7CiAgICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzc2LDggKzM3Niw4IEBACiAgICAgUHlfVUNTNCBjOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITplYXN0X2FzaWFuX3dpZHRoIiwKLQkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjID0gZ2V0dWNoYXIodik7CiAgICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDA3LDggKzQwNyw4IEBACiAgICAgUHlfVUNTNCBjOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpkZWNvbXBvc2l0aW9uIiwKLQkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjID0gZ2V0dWNoYXIodik7CiAgICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDU0LDcgKzQ1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wX2RhdGFbKytpbmRleF0pOwogICAgICAgICBpICs9IHN0cmxlbihkZWNvbXAgKyBpKTsKICAgICB9Ci0gICAgCisKICAgICBkZWNvbXBbaV0gPSAnXDAnOwogCiAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGVjb21wKTsKQEAgLTQ3NCw3ICs0NzQsNyBAQAogICAgICAgICAqaW5kZXggPSBkZWNvbXBfaW5kZXgyWygqaW5kZXg8PERFQ09NUF9TSElGVCkrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUmKCgxPDxERUNPTVBfU0hJRlQpLTEpKV07CiAgICAgfQotCQorCiAgICAgLyogaGlnaCBieXRlIGlzIG51bWJlciBvZiBoZXggYnl0ZXMgKHVzdWFsbHkgb25lIG9yIHR3byksIGxvdyBieXRlCiAgICAgICAgaXMgcHJlZml4IGNvZGUgKGZyb20qLwogICAgICpjb3VudCA9IGRlY29tcF9kYXRhWyppbmRleF0gPj4gODsKQEAgLTQ5OSwxMSArNDk5LDExIEBACiAgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBQeV9VTklDT0RFICppLCAqZW5kLCAqbzsKICAgICAvKiBMb25nZXN0IGRlY29tcG9zaXRpb24gaW4gVW5pY29kZSAzLjI6IFUrRkRGQSAqLwotICAgIFB5X1VOSUNPREUgc3RhY2tbMjBdOyAKKyAgICBQeV9VTklDT0RFIHN0YWNrWzIwXTsKICAgICBQeV9zc2l6ZV90IHNwYWNlLCBpc2l6ZTsKICAgICBpbnQgaW5kZXgsIHByZWZpeCwgY291bnQsIHN0YWNrcHRyOwogICAgIHVuc2lnbmVkIGNoYXIgcHJldiwgY3VyOwotCQorCiAgICAgc3RhY2twdHIgPSAwOwogICAgIGlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKGlucHV0KTsKICAgICAvKiBPdmVyYWxsb2NhdGUgYXRtb3N0IDEwIGNoYXJhY3RlcnMuICovCkBAIC02NDAsMTIgKzY0MCwxMiBAQAogICAgIGkgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOwogICAgIGVuZCA9IGkgKyBQeVVuaWNvZGVfR0VUX1NJWkUocmVzdWx0KTsKICAgICBvID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKLQkKKwogICBhZ2FpbjoKICAgICB3aGlsZSAoaSA8IGVuZCkgewogICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY3NraXBwZWQ7IGluZGV4KyspIHsKICAgICAgICAgICBpZiAoc2tpcHBlZFtpbmRleF0gPT0gaSkgewotICAgICAgICAgICAgICAvKiAqaSBjaGFyYWN0ZXIgaXMgc2tpcHBlZC4gCisgICAgICAgICAgICAgIC8qICppIGNoYXJhY3RlciBpcyBza2lwcGVkLgogICAgICAgICAgICAgICAgICBSZW1vdmUgZnJvbSBsaXN0LiAqLwogICAgICAgICAgICAgICBza2lwcGVkW2luZGV4XSA9IHNraXBwZWRbY3NraXBwZWQtMV07CiAgICAgICAgICAgICAgIGNza2lwcGVkLS07CkBAIC02NTYsNyArNjU2LDcgQEAKICAgICAgIC8qIEhhbmd1bCBDb21wb3NpdGlvbi4gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgPExWLFQ+CiAgICAgICAgICBwYWlycywgc2luY2Ugd2UgYWx3YXlzIGhhdmUgZGVjb21wb3NlZCBkYXRhLiAqLwogICAgICAgaWYgKExCYXNlIDw9ICppICYmICppIDwgKExCYXNlK0xDb3VudCkgJiYKLSAgICAgICAgICBpICsgMSA8IGVuZCAmJiAKKyAgICAgICAgICBpICsgMSA8IGVuZCAmJgogICAgICAgICAgIFZCYXNlIDw9IGlbMV0gJiYgaVsxXSA8PSAoVkJhc2UrVkNvdW50KSkgewogICAgICAgICAgIGludCBMSW5kZXgsIFZJbmRleDsKICAgICAgICAgICBMSW5kZXggPSBpWzBdIC0gTEJhc2U7CkBAIC03MDUsNyArNzA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleCYoKDE8PENPTVBfU0hJRlQpLTEpKV07CiAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKICAgICAgICAgICAgICAgZ290byBub3RfY29tYmluYWJsZTsKLQkJCQorCiAgICAgICAgICAgLyogUmVwbGFjZSB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyLiAqLwogICAgICAgICAgICppID0gY29kZTsKICAgICAgICAgICAvKiBNYXJrIHRoZSBzZWNvbmQgY2hhcmFjdGVyIHVudXNlZC4gKi8KQEAgLTg4OSwyOSArODg5LDI5IEBACiAgICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkgewogICAgICAgICAgICAgLyogdW5hc3NpZ25lZCAqLwogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gCisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoU0Jhc2UgPD0gY29kZSAmJiBjb2RlIDwgU0Jhc2UrU0NvdW50KSB7Ci0JLyogSGFuZ3VsIHN5bGxhYmxlLiAqLwotCWludCBTSW5kZXggPSBjb2RlIC0gU0Jhc2U7Ci0JaW50IEwgPSBTSW5kZXggLyBOQ291bnQ7Ci0JaW50IFYgPSAoU0luZGV4ICUgTkNvdW50KSAvIFRDb3VudDsKLQlpbnQgVCA9IFNJbmRleCAlIFRDb3VudDsKKyAgICAgICAgLyogSGFuZ3VsIHN5bGxhYmxlLiAqLworICAgICAgICBpbnQgU0luZGV4ID0gY29kZSAtIFNCYXNlOworICAgICAgICBpbnQgTCA9IFNJbmRleCAvIE5Db3VudDsKKyAgICAgICAgaW50IFYgPSAoU0luZGV4ICUgTkNvdW50KSAvIFRDb3VudDsKKyAgICAgICAgaW50IFQgPSBTSW5kZXggJSBUQ291bnQ7CiAKLQlpZiAoYnVmbGVuIDwgMjcpCi0JICAgIC8qIFdvcnN0IGNhc2U6IEhBTkdVTCBTWUxMQUJMRSA8MTBjaGFycz4uICovCi0JICAgIHJldHVybiAwOwotCXN0cmNweShidWZmZXIsICJIQU5HVUwgU1lMTEFCTEUgIik7Ci0JYnVmZmVyICs9IDE2OwotCXN0cmNweShidWZmZXIsIGhhbmd1bF9zeWxsYWJsZXNbTF1bMF0pOwotCWJ1ZmZlciArPSBzdHJsZW4oaGFuZ3VsX3N5bGxhYmxlc1tMXVswXSk7Ci0Jc3RyY3B5KGJ1ZmZlciwgaGFuZ3VsX3N5bGxhYmxlc1tWXVsxXSk7Ci0JYnVmZmVyICs9IHN0cmxlbihoYW5ndWxfc3lsbGFibGVzW1ZdWzFdKTsKLQlzdHJjcHkoYnVmZmVyLCBoYW5ndWxfc3lsbGFibGVzW1RdWzJdKTsKLQlidWZmZXIgKz0gc3RybGVuKGhhbmd1bF9zeWxsYWJsZXNbVF1bMl0pOwotCSpidWZmZXIgPSAnXDAnOwotCXJldHVybiAxOworICAgICAgICBpZiAoYnVmbGVuIDwgMjcpCisgICAgICAgICAgICAvKiBXb3JzdCBjYXNlOiBIQU5HVUwgU1lMTEFCTEUgPDEwY2hhcnM+LiAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHN0cmNweShidWZmZXIsICJIQU5HVUwgU1lMTEFCTEUgIik7CisgICAgICAgIGJ1ZmZlciArPSAxNjsKKyAgICAgICAgc3RyY3B5KGJ1ZmZlciwgaGFuZ3VsX3N5bGxhYmxlc1tMXVswXSk7CisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oaGFuZ3VsX3N5bGxhYmxlc1tMXVswXSk7CisgICAgICAgIHN0cmNweShidWZmZXIsIGhhbmd1bF9zeWxsYWJsZXNbVl1bMV0pOworICAgICAgICBidWZmZXIgKz0gc3RybGVuKGhhbmd1bF9zeWxsYWJsZXNbVl1bMV0pOworICAgICAgICBzdHJjcHkoYnVmZmVyLCBoYW5ndWxfc3lsbGFibGVzW1RdWzJdKTsKKyAgICAgICAgYnVmZmVyICs9IHN0cmxlbihoYW5ndWxfc3lsbGFibGVzW1RdWzJdKTsKKyAgICAgICAgKmJ1ZmZlciA9ICdcMCc7CisgICAgICAgIHJldHVybiAxOwogICAgIH0KIAogICAgIGlmIChpc191bmlmaWVkX2lkZW9ncmFwaChjb2RlKSkgewpAQCAtOTc4LDIzICs5NzgsMjMgQEAKICAgICByZXR1cm4gYnVmZmVyW25hbWVsZW5dID09ICdcMCc7CiB9CiAKLXN0YXRpYyB2b2lkIAorc3RhdGljIHZvaWQKIGZpbmRfc3lsbGFibGUoY29uc3QgY2hhciAqc3RyLCBpbnQgKmxlbiwgaW50ICpwb3MsIGludCBjb3VudCwgaW50IGNvbHVtbikKIHsKICAgICBpbnQgaSwgbGVuMTsKICAgICAqbGVuID0gLTE7CiAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQljaGFyICpzID0gaGFuZ3VsX3N5bGxhYmxlc1tpXVtjb2x1bW5dOwotCWxlbjEgPSBzdHJsZW4ocyk7Ci0JaWYgKGxlbjEgPD0gKmxlbikKLQkgICAgY29udGludWU7Ci0JaWYgKHN0cm5jbXAoc3RyLCBzLCBsZW4xKSA9PSAwKSB7Ci0JICAgICpsZW4gPSBsZW4xOwotCSAgICAqcG9zID0gaTsKLQl9CisgICAgICAgIGNoYXIgKnMgPSBoYW5ndWxfc3lsbGFibGVzW2ldW2NvbHVtbl07CisgICAgICAgIGxlbjEgPSBzdHJsZW4ocyk7CisgICAgICAgIGlmIChsZW4xIDw9ICpsZW4pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHN0cm5jbXAoc3RyLCBzLCBsZW4xKSA9PSAwKSB7CisgICAgICAgICAgICAqbGVuID0gbGVuMTsKKyAgICAgICAgICAgICpwb3MgPSBpOworICAgICAgICB9CiAgICAgfQogICAgIGlmICgqbGVuID09IC0xKSB7Ci0JKmxlbiA9IDA7CisgICAgICAgICpsZW4gPSAwOwogICAgIH0KIH0KIApAQCAtMTAwNywxOCArMTAwNywxOCBAQAogCiAgICAgLyogQ2hlY2sgZm9yIGhhbmd1bCBzeWxsYWJsZXMuICovCiAgICAgaWYgKHN0cm5jbXAobmFtZSwgIkhBTkdVTCBTWUxMQUJMRSAiLCAxNikgPT0gMCkgewotCWludCBsZW4sIEwgPSAtMSwgViA9IC0xLCBUID0gLTE7Ci0JY29uc3QgY2hhciAqcG9zID0gbmFtZSArIDE2OwotCWZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmTCwgTENvdW50LCAwKTsKLQlwb3MgKz0gbGVuOwotCWZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmViwgVkNvdW50LCAxKTsKLQlwb3MgKz0gbGVuOwotCWZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmVCwgVENvdW50LCAyKTsKLQlwb3MgKz0gbGVuOwotCWlmIChMICE9IC0xICYmIFYgIT0gLTEgJiYgVCAhPSAtMSAmJiBwb3MtbmFtZSA9PSBuYW1lbGVuKSB7Ci0JICAgICpjb2RlID0gU0Jhc2UgKyAoTCpWQ291bnQrVikqVENvdW50ICsgVDsKLQkgICAgcmV0dXJuIDE7Ci0JfQorICAgICAgICBpbnQgbGVuLCBMID0gLTEsIFYgPSAtMSwgVCA9IC0xOworICAgICAgICBjb25zdCBjaGFyICpwb3MgPSBuYW1lICsgMTY7CisgICAgICAgIGZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmTCwgTENvdW50LCAwKTsKKyAgICAgICAgcG9zICs9IGxlbjsKKyAgICAgICAgZmluZF9zeWxsYWJsZShwb3MsICZsZW4sICZWLCBWQ291bnQsIDEpOworICAgICAgICBwb3MgKz0gbGVuOworICAgICAgICBmaW5kX3N5bGxhYmxlKHBvcywgJmxlbiwgJlQsIFRDb3VudCwgMik7CisgICAgICAgIHBvcyArPSBsZW47CisgICAgICAgIGlmIChMICE9IC0xICYmIFYgIT0gLTEgJiYgVCAhPSAtMSAmJiBwb3MtbmFtZSA9PSBuYW1lbGVuKSB7CisgICAgICAgICAgICAqY29kZSA9IFNCYXNlICsgKEwqVkNvdW50K1YpKlRDb3VudCArIFQ7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQogICAgICAgICAvKiBPdGhlcndpc2UsIGl0J3MgYW4gaWxsZWdhbCBzeWxsYWJsZSBuYW1lLiAqLwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xMDc4LDcgKzEwNzgsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIGNvbnN0IF9QeVVuaWNvZGVfTmFtZV9DQVBJIGhhc2hBUEkgPSAKK3N0YXRpYyBjb25zdCBfUHlVbmljb2RlX05hbWVfQ0FQSSBoYXNoQVBJID0KIHsKICAgICBzaXplb2YoX1B5VW5pY29kZV9OYW1lX0NBUEkpLAogICAgIF9nZXR1Y25hbWUsCkBAIC0xMTEwLDE0ICsxMTEwLDE0IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKCFfZ2V0dWNuYW1lKHNlbGYsIGMsIG5hbWUsIHNpemVvZihuYW1lKSkpIHsKLQlpZiAoZGVmb2JqID09IE5VTEwpIHsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBzdWNoIG5hbWUiKTsKKyAgICAgICAgaWYgKGRlZm9iaiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIHN1Y2ggbmFtZSIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCSAgICBQeV9JTkNSRUYoZGVmb2JqKTsKLQkgICAgcmV0dXJuIGRlZm9iajsKLQl9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGVmb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZvYmo7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIG5hbWUpOwpAQCAtMTE1NSw3ICsxMTU1LDcgQEAKICAgICB9CiAjZW5kaWYKICAgICBzdHJbMF0gPSAoUHlfVU5JQ09ERSkgY29kZTsKLSAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHN0ciwgMSk7ICAgIAorICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoc3RyLCAxKTsKIH0KIAogLyogWFhYIEFkZCBkb2Mgc3RyaW5ncy4gKi8KQEAgLTExODAsMjcgKzExODAsMjcgQEAKICAgICB7Imxvb2t1cCIsIHVuaWNvZGVkYXRhX2xvb2t1cCwgTUVUSF9WQVJBUkdTLCB1bmljb2RlZGF0YV9sb29rdXBfX2RvY19ffSwKICAgICB7Im5vcm1hbGl6ZSIsIHVuaWNvZGVkYXRhX25vcm1hbGl6ZSwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgICAgdW5pY29kZWRhdGFfbm9ybWFsaXplX19kb2NfX30sCi0gICAge05VTEwsIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCBOVUxMfSAgICAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBVQ0RfVHlwZSA9IHsKLQkvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgotCSAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCi0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInVuaWNvZGVkYXRhLlVDRCIsCQkvKnRwX25hbWUqLwotCXNpemVvZihQcmV2aW91c0RCVmVyc2lvbiksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KKyAgICAgICAgLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KKyAgICAgICAgICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KKyAgICAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgICAgICJ1bmljb2RlZGF0YS5VQ0QiLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICAgICAgc2l6ZW9mKFByZXZpb3VzREJWZXJzaW9uKSwgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgICAgICAvKiBtZXRob2RzICovCisgICAgICAgIChkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwgLyp0cF9kZWFsbG9jKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KICAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCkBAIC0xMjY2LDcgKzEyNjYsNyBAQAogICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInVjbmhhc2hfQ0FQSSIsIHYpOwogfQogCi0vKiAKKy8qCiBMb2NhbCB2YXJpYWJsZXM6CiBjLWJhc2ljLW9mZnNldDogNAogaW5kZW50LXRhYnMtbW9kZTogbmlsCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3h4bW9kdWxlLmMgYi9Nb2R1bGVzL3h4bW9kdWxlLmMKaW5kZXggNmI0OThkZC4uMWQ5YjA4YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eG1vZHVsZS5jCisrKyBiL01vZHVsZXMveHhtb2R1bGUuYwpAQCAtMTksMjMgKzE5LDIzIEBACiBzdGF0aWMgUHlPYmplY3QgKkVycm9yT2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0CSp4X2F0dHI7CS8qIEF0dHJpYnV0ZXMgZGljdGlvbmFyeSAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAgICAgICAgICAgICp4X2F0dHI7ICAgICAgICAvKiBBdHRyaWJ1dGVzIGRpY3Rpb25hcnkgKi8KIH0gWHhvT2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFh4b19UeXBlOwogCi0jZGVmaW5lIFh4b09iamVjdF9DaGVjayh2KQkoUHlfVFlQRSh2KSA9PSAmWHhvX1R5cGUpCisjZGVmaW5lIFh4b09iamVjdF9DaGVjayh2KSAgICAgIChQeV9UWVBFKHYpID09ICZYeG9fVHlwZSkKIAogc3RhdGljIFh4b09iamVjdCAqCiBuZXdYeG9PYmplY3QoUHlPYmplY3QgKmFyZykKIHsKLQlYeG9PYmplY3QgKnNlbGY7Ci0Jc2VsZiA9IFB5T2JqZWN0X05ldyhYeG9PYmplY3QsICZYeG9fVHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+eF9hdHRyID0gTlVMTDsKLQlyZXR1cm4gc2VsZjsKKyAgICBYeG9PYmplY3QgKnNlbGY7CisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhYeG9PYmplY3QsICZYeG9fVHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+eF9hdHRyID0gTlVMTDsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogLyogWHhvIG1ldGhvZHMgKi8KQEAgLTQzLDEwMSArNDMsMTAxIEBACiBzdGF0aWMgdm9pZAogWHhvX2RlYWxsb2MoWHhvT2JqZWN0ICpzZWxmKQogewotCVB5X1hERUNSRUYoc2VsZi0+eF9hdHRyKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT54X2F0dHIpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFh4b19kZW1vKFh4b09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZGVtbyIpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZGVtbyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBYeG9fbWV0aG9kc1tdID0gewotCXsiZGVtbyIsCShQeUNGdW5jdGlvbilYeG9fZGVtbywJTUVUSF9WQVJBUkdTLAotCQlQeURvY19TVFIoImRlbW8oKSAtPiBOb25lIil9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJkZW1vIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pWHhvX2RlbW8sICBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiZGVtbygpIC0+IE5vbmUiKX0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBYeG9fZ2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JaWYgKHNlbGYtPnhfYXR0ciAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+eF9hdHRyLCBuYW1lKTsKLQkJaWYgKHYgIT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKHYpOwotCQkJcmV0dXJuIHY7Ci0JCX0KLQl9Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoWHhvX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIGlmIChzZWxmLT54X2F0dHIgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPnhfYXR0ciwgbmFtZSk7CisgICAgICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKFh4b19tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogc3RhdGljIGludAogWHhvX3NldGF0dHIoWHhvT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpIHsKLQkJc2VsZi0+eF9hdHRyID0gUHlEaWN0X05ldygpOwotCQlpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWlmICh2ID09IE5VTEwpIHsKLQkJaW50IHJ2ID0gUHlEaWN0X0RlbEl0ZW1TdHJpbmcoc2VsZi0+eF9hdHRyLCBuYW1lKTsKLQkJaWYgKHJ2IDwgMCkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgICAgImRlbGV0ZSBub24tZXhpc3RpbmcgWHhvIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gcnY7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKHNlbGYtPnhfYXR0ciwgbmFtZSwgdik7CisgICAgaWYgKHNlbGYtPnhfYXR0ciA9PSBOVUxMKSB7CisgICAgICAgIHNlbGYtPnhfYXR0ciA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKHNlbGYtPnhfYXR0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIGludCBydiA9IFB5RGljdF9EZWxJdGVtU3RyaW5nKHNlbGYtPnhfYXR0ciwgbmFtZSk7CisgICAgICAgIGlmIChydiA8IDApCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgImRlbGV0ZSBub24tZXhpc3RpbmcgWHhvIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gcnY7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKHNlbGYtPnhfYXR0ciwgbmFtZSwgdik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgWHhvX1R5cGUgPSB7Ci0JLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KLQkgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLwotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJ4eG1vZHVsZS5YeG8iLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YoWHhvT2JqZWN0KSwJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKVh4b19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKVh4b19nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYylYeG9fc2V0YXR0ciwgLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KLSAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KKyAgICAvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgorICAgICAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgInh4bW9kdWxlLlh4byIsICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFh4b09iamVjdCksICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKVh4b19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpWHhvX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKVh4b19zZXRhdHRyLCAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAvKnRwX2ZsYWdzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMTUxLDEyICsxNTEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB4eF9mb28oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgaSwgajsKLQlsb25nIHJlczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsOmZvbyIsICZpLCAmaikpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9IGkrajsgLyogWFhYIERvIHNvbWV0aGluZyBoZXJlICovCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlcyk7CisgICAgbG9uZyBpLCBqOworICAgIGxvbmcgcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGw6Zm9vIiwgJmksICZqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gaStqOyAvKiBYWFggRG8gc29tZXRoaW5nIGhlcmUgKi8KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzKTsKIH0KIAogCkBAIC0xNjUsMTQgKzE2NSwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHh4X25ldyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JWHhvT2JqZWN0ICpydjsKKyAgICBYeG9PYmplY3QgKnJ2OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6bmV3IikpCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gbmV3WHhvT2JqZWN0KGFyZ3MpOwotCWlmIChydiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6bmV3IikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gbmV3WHhvT2JqZWN0KGFyZ3MpOworICAgIGlmIChydiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcnY7CiB9CiAKIC8qIEV4YW1wbGUgd2l0aCBzdWJ0bGUgYnVnIGZyb20gZXh0ZW5zaW9ucyBtYW51YWwgKCJUaGluIEljZSIpLiAqLwpAQCAtMTgwLDIwICsxODAsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB4eF9idWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpsaXN0LCAqaXRlbTsKKyAgICBQeU9iamVjdCAqbGlzdCwgKml0ZW07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86YnVnIiwgJmxpc3QpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86YnVnIiwgJmxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWl0ZW0gPSBQeUxpc3RfR2V0SXRlbShsaXN0LCAwKTsKLQkvKiBQeV9JTkNSRUYoaXRlbSk7ICovCi0JUHlMaXN0X1NldEl0ZW0obGlzdCwgMSwgUHlJbnRfRnJvbUxvbmcoMEwpKTsKLQlQeU9iamVjdF9QcmludChpdGVtLCBzdGRvdXQsIDApOwotCXByaW50ZigiXG4iKTsKLQkvKiBQeV9ERUNSRUYoaXRlbSk7ICovCisgICAgaXRlbSA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIDApOworICAgIC8qIFB5X0lOQ1JFRihpdGVtKTsgKi8KKyAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCAxLCBQeUludF9Gcm9tTG9uZygwTCkpOworICAgIFB5T2JqZWN0X1ByaW50KGl0ZW0sIHN0ZG91dCwgMCk7CisgICAgcHJpbnRmKCJcbiIpOworICAgIC8qIFB5X0RFQ1JFRihpdGVtKTsgKi8KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIFRlc3QgYmFkIGZvcm1hdCBjaGFyYWN0ZXIgKi8KQEAgLTIwMSw2MSArMjAxLDYxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogeHhfcm9qKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqYTsKLQlsb25nIGI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIzpyb2oiLCAmYSwgJmIpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlPYmplY3QgKmE7CisgICAgbG9uZyBiOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyM6cm9qIiwgJmEsICZiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKIC8qIC0tLS0tLS0tLS0gKi8KIAogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJfVHlwZSA9IHsKLQkvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgotCSAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCi0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInh4bW9kdWxlLlN0ciIsCQkvKnRwX25hbWUqLwotCTAsCQkJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCTAsCQkJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCTAsCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCi0JMCwJCQkvKnRwX2NhbGwqLwotCTAsCQkJLyp0cF9zdHIqLwotCTAsCQkJLyp0cF9nZXRhdHRybyovCi0JMCwJCQkvKnRwX3NldGF0dHJvKi8KLQkwLAkJCS8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKnRwX2ZsYWdzKi8KLQkwLAkJCS8qdHBfZG9jKi8KLQkwLAkJCS8qdHBfdHJhdmVyc2UqLwotCTAsCQkJLyp0cF9jbGVhciovCi0JMCwJCQkvKnRwX3JpY2hjb21wYXJlKi8KLQkwLAkJCS8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsCQkJLyp0cF9pdGVyKi8KLQkwLAkJCS8qdHBfaXRlcm5leHQqLwotCTAsCQkJLyp0cF9tZXRob2RzKi8KLQkwLAkJCS8qdHBfbWVtYmVycyovCi0JMCwJCQkvKnRwX2dldHNldCovCi0JMCwgLyogc2VlIGluaXR4eCAqLwkvKnRwX2Jhc2UqLwotCTAsCQkJLyp0cF9kaWN0Ki8KLQkwLAkJCS8qdHBfZGVzY3JfZ2V0Ki8KLQkwLAkJCS8qdHBfZGVzY3Jfc2V0Ki8KLQkwLAkJCS8qdHBfZGljdG9mZnNldCovCi0JMCwJCQkvKnRwX2luaXQqLwotCTAsCQkJLyp0cF9hbGxvYyovCi0JMCwJCQkvKnRwX25ldyovCi0JMCwJCQkvKnRwX2ZyZWUqLwotCTAsCQkJLyp0cF9pc19nYyovCisgICAgLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KKyAgICAgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJ4eG1vZHVsZS5TdHIiLCAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgLyogc2VlIGluaXR4eCAqLyAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0gKi8KQEAgLTI2Myw1NCArMjYzLDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbnVsbF9yaWNoY29tcGFyZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyLCBpbnQgb3ApCiB7Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTnVsbF9UeXBlID0gewotCS8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCi0JICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkieHhtb2R1bGUuTnVsbCIsCS8qdHBfbmFtZSovCi0JMCwJCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JMCwJCQkvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JMCwJCQkvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KLQkwLAkJCS8qdHBfY2FsbCovCi0JMCwJCQkvKnRwX3N0ciovCi0JMCwJCQkvKnRwX2dldGF0dHJvKi8KLQkwLAkJCS8qdHBfc2V0YXR0cm8qLwotCTAsCQkJLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLwotCTAsCQkJLyp0cF9kb2MqLwotCTAsCQkJLyp0cF90cmF2ZXJzZSovCi0JMCwJCQkvKnRwX2NsZWFyKi8KLQludWxsX3JpY2hjb21wYXJlLAkvKnRwX3JpY2hjb21wYXJlKi8KLQkwLAkJCS8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsCQkJLyp0cF9pdGVyKi8KLQkwLAkJCS8qdHBfaXRlcm5leHQqLwotCTAsCQkJLyp0cF9tZXRob2RzKi8KLQkwLAkJCS8qdHBfbWVtYmVycyovCi0JMCwJCQkvKnRwX2dldHNldCovCi0JMCwgLyogc2VlIGluaXR4eCAqLwkvKnRwX2Jhc2UqLwotCTAsCQkJLyp0cF9kaWN0Ki8KLQkwLAkJCS8qdHBfZGVzY3JfZ2V0Ki8KLQkwLAkJCS8qdHBfZGVzY3Jfc2V0Ki8KLQkwLAkJCS8qdHBfZGljdG9mZnNldCovCi0JMCwJCQkvKnRwX2luaXQqLwotCTAsCQkJLyp0cF9hbGxvYyovCi0JMCwgLyogc2VlIGluaXR4eCAqLwkvKnRwX25ldyovCi0JMCwJCQkvKnRwX2ZyZWUqLwotCTAsCQkJLyp0cF9pc19nYyovCisgICAgLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KKyAgICAgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJ4eG1vZHVsZS5OdWxsIiwgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIG51bGxfcmljaGNvbXBhcmUsICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgLyogc2VlIGluaXR4eCAqLyAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KKyAgICAwLCAvKiBzZWUgaW5pdHh4ICovICAgICAgICAgLyp0cF9uZXcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAKIApAQCAtMzIwLDE1ICszMjAsMTUgQEAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgeHhfbWV0aG9kc1tdID0gewotCXsicm9qIiwJCXh4X3JvaiwJCU1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJyb2ooYSxiKSAtPiBOb25lIil9LAotCXsiZm9vIiwJCXh4X2ZvbywJCU1FVEhfVkFSQVJHUywKLQkgCXh4X2Zvb19kb2N9LAotCXsibmV3IiwJCXh4X25ldywJCU1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJuZXcoKSAtPiBuZXcgWHggb2JqZWN0Iil9LAotCXsiYnVnIiwJCXh4X2J1ZywJCU1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJidWcobykgLT4gTm9uZSIpfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsicm9qIiwgICAgICAgICAgICAgeHhfcm9qLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJyb2ooYSxiKSAtPiBOb25lIil9LAorICAgIHsiZm9vIiwgICAgICAgICAgICAgeHhfZm9vLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgeHhfZm9vX2RvY30sCisgICAgeyJuZXciLCAgICAgICAgICAgICB4eF9uZXcsICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIm5ldygpIC0+IG5ldyBYeCBvYmplY3QiKX0sCisgICAgeyJidWciLCAgICAgICAgICAgICB4eF9idWcsICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoImJ1ZyhvKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIobW9kdWxlX2RvYywKQEAgLTMzOSw0MSArMzM5LDQxIEBACiBQeU1PRElOSVRfRlVOQwogaW5pdHh4KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQkvKiBEdWUgdG8gY3Jvc3MgcGxhdGZvcm0gY29tcGlsZXIgaXNzdWVzIHRoZSBzbG90cyBtdXN0IGJlIGZpbGxlZAotCSAqIGhlcmUuIEl0J3MgcmVxdWlyZWQgZm9yIHBvcnRhYmlsaXR5IHRvIFdpbmRvd3Mgd2l0aG91dCByZXF1aXJpbmcKLQkgKiBDKysuICovCi0JTnVsbF9UeXBlLnRwX2Jhc2UgPSAmUHlCYXNlT2JqZWN0X1R5cGU7Ci0JTnVsbF9UeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OwotCVN0cl9UeXBlLnRwX2Jhc2UgPSAmUHlVbmljb2RlX1R5cGU7CisgICAgLyogRHVlIHRvIGNyb3NzIHBsYXRmb3JtIGNvbXBpbGVyIGlzc3VlcyB0aGUgc2xvdHMgbXVzdCBiZSBmaWxsZWQKKyAgICAgKiBoZXJlLiBJdCdzIHJlcXVpcmVkIGZvciBwb3J0YWJpbGl0eSB0byBXaW5kb3dzIHdpdGhvdXQgcmVxdWlyaW5nCisgICAgICogQysrLiAqLworICAgIE51bGxfVHlwZS50cF9iYXNlID0gJlB5QmFzZU9iamVjdF9UeXBlOworICAgIE51bGxfVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICBTdHJfVHlwZS50cF9iYXNlID0gJlB5VW5pY29kZV9UeXBlOwogCi0JLyogRmluYWxpemUgdGhlIHR5cGUgb2JqZWN0IGluY2x1ZGluZyBzZXR0aW5nIHR5cGUgb2YgdGhlIG5ldyB0eXBlCi0JICogb2JqZWN0OyBkb2luZyBpdCBoZXJlIGlzIHJlcXVpcmVkIGZvciBwb3J0YWJpbGl0eSwgdG9vLiAqLwotCWlmIChQeVR5cGVfUmVhZHkoJlh4b19UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICAvKiBGaW5hbGl6ZSB0aGUgdHlwZSBvYmplY3QgaW5jbHVkaW5nIHNldHRpbmcgdHlwZSBvZiB0aGUgbmV3IHR5cGUKKyAgICAgKiBvYmplY3Q7IGRvaW5nIGl0IGhlcmUgaXMgcmVxdWlyZWQgZm9yIHBvcnRhYmlsaXR5LCB0b28uICovCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmWHhvX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJ4eCIsIHh4X21ldGhvZHMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoInh4IiwgeHhfbWV0aG9kcywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlpZiAoRXJyb3JPYmplY3QgPT0gTlVMTCkgewotCQlFcnJvck9iamVjdCA9IFB5RXJyX05ld0V4Y2VwdGlvbigieHguZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQkJaWYgKEVycm9yT2JqZWN0ID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JfQotCVB5X0lOQ1JFRihFcnJvck9iamVjdCk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIEVycm9yT2JqZWN0KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGlmIChFcnJvck9iamVjdCA9PSBOVUxMKSB7CisgICAgICAgIEVycm9yT2JqZWN0ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJ4eC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoRXJyb3JPYmplY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUHlfSU5DUkVGKEVycm9yT2JqZWN0KTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgRXJyb3JPYmplY3QpOwogCi0JLyogQWRkIFN0ciAqLwotCWlmIChQeVR5cGVfUmVhZHkoJlN0cl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlN0ciIsIChQeU9iamVjdCAqKSZTdHJfVHlwZSk7CisgICAgLyogQWRkIFN0ciAqLworICAgIGlmIChQeVR5cGVfUmVhZHkoJlN0cl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlN0ciIsIChQeU9iamVjdCAqKSZTdHJfVHlwZSk7CiAKLQkvKiBBZGQgTnVsbCAqLwotCWlmIChQeVR5cGVfUmVhZHkoJk51bGxfVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJOdWxsIiwgKFB5T2JqZWN0ICopJk51bGxfVHlwZSk7CisgICAgLyogQWRkIE51bGwgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZOdWxsX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTnVsbCIsIChQeU9iamVjdCAqKSZOdWxsX1R5cGUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy94eHN1YnR5cGUuYyBiL01vZHVsZXMveHhzdWJ0eXBlLmMKaW5kZXggMGNmMGI4MS4uZDQzMTZlNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eHN1YnR5cGUuYworKysgYi9Nb2R1bGVzL3h4c3VidHlwZS5jCkBAIC0xOSwyNzkgKzE5LDI3OSBAQAogLyogc3BhbWxpc3QgLS0gYSBsaXN0IHN1YnR5cGUgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5TGlzdE9iamVjdCBsaXN0OwotCWludCBzdGF0ZTsKKyAgICBQeUxpc3RPYmplY3QgbGlzdDsKKyAgICBpbnQgc3RhdGU7CiB9IHNwYW1saXN0b2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKgogc3BhbWxpc3RfZ2V0c3RhdGUoc3BhbWxpc3RvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldHN0YXRlIikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5zdGF0ZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0c3RhdGUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNlbGYtPnN0YXRlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNwYW1saXN0X3NldHN0YXRlKHNwYW1saXN0b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc3RhdGU7CisgICAgaW50IHN0YXRlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldHN0YXRlIiwgJnN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+c3RhdGUgPSBzdGF0ZTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldHN0YXRlIiwgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+c3RhdGUgPSBzdGF0ZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcGFtbGlzdF9zcGVjaWFsbWV0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlUdXBsZV9OZXcoMyk7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5VHVwbGVfTmV3KDMpOwogCi0JaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JCWlmIChzZWxmID09IE5VTEwpCi0JCQlzZWxmID0gUHlfTm9uZTsKLQkJaWYgKGt3ID09IE5VTEwpCi0JCQlrdyA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIHNlbGYpOwotCQlQeV9JTkNSRUYoYXJncyk7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAxLCBhcmdzKTsKLQkJUHlfSU5DUkVGKGt3KTsKLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDIsIGt3KTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgICAgIHNlbGYgPSBQeV9Ob25lOworICAgICAgICBpZiAoa3cgPT0gTlVMTCkKKyAgICAgICAgICAgIGt3ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMCwgc2VsZik7CisgICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDEsIGFyZ3MpOworICAgICAgICBQeV9JTkNSRUYoa3cpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMiwga3cpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc3BhbWxpc3RfbWV0aG9kc1tdID0gewotCXsiZ2V0c3RhdGUiLCAoUHlDRnVuY3Rpb24pc3BhbWxpc3RfZ2V0c3RhdGUsIE1FVEhfVkFSQVJHUywKLQkgCVB5RG9jX1NUUigiZ2V0c3RhdGUoKSAtPiBzdGF0ZSIpfSwKLQl7InNldHN0YXRlIiwgKFB5Q0Z1bmN0aW9uKXNwYW1saXN0X3NldHN0YXRlLCBNRVRIX1ZBUkFSR1MsCi0JIAlQeURvY19TVFIoInNldHN0YXRlKHN0YXRlKSIpfSwKLQkvKiBUaGVzZSBlbnRyaWVzIGRpZmZlciBvbmx5IGluIHRoZSBmbGFnczsgdGhleSBhcmUgdXNlZCBieSB0aGUgdGVzdHMKLQkgICBpbiB0ZXN0LnRlc3RfZGVzY3IuICovCi0JeyJjbGFzc21ldGgiLCAoUHlDRnVuY3Rpb24pc3BhbWxpc3Rfc3BlY2lhbG1ldGgsCi0JCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX0NMQVNTLAotCSAJUHlEb2NfU1RSKCJjbGFzc21ldGgoKmFyZ3MsICoqa3cpIil9LAotCXsic3RhdGljbWV0aCIsIChQeUNGdW5jdGlvbilzcGFtbGlzdF9zcGVjaWFsbWV0aCwKLQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUyB8IE1FVEhfU1RBVElDLAotCSAJUHlEb2NfU1RSKCJzdGF0aWNtZXRoKCphcmdzLCAqKmt3KSIpfSwKLQl7TlVMTCwJTlVMTH0sCisgICAgeyJnZXRzdGF0ZSIsIChQeUNGdW5jdGlvbilzcGFtbGlzdF9nZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoImdldHN0YXRlKCkgLT4gc3RhdGUiKX0sCisgICAgeyJzZXRzdGF0ZSIsIChQeUNGdW5jdGlvbilzcGFtbGlzdF9zZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoInNldHN0YXRlKHN0YXRlKSIpfSwKKyAgICAvKiBUaGVzZSBlbnRyaWVzIGRpZmZlciBvbmx5IGluIHRoZSBmbGFnczsgdGhleSBhcmUgdXNlZCBieSB0aGUgdGVzdHMKKyAgICAgICBpbiB0ZXN0LnRlc3RfZGVzY3IuICovCisgICAgeyJjbGFzc21ldGgiLCAoUHlDRnVuY3Rpb24pc3BhbWxpc3Rfc3BlY2lhbG1ldGgsCisgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX0NMQVNTLAorICAgICAgICBQeURvY19TVFIoImNsYXNzbWV0aCgqYXJncywgKiprdykiKX0sCisgICAgeyJzdGF0aWNtZXRoIiwgKFB5Q0Z1bmN0aW9uKXNwYW1saXN0X3NwZWNpYWxtZXRoLAorICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTIHwgTUVUSF9TVEFUSUMsCisgICAgICAgIFB5RG9jX1NUUigic3RhdGljbWV0aCgqYXJncywgKiprdykiKX0sCisgICAge05VTEwsICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgaW50CiBzcGFtbGlzdF9pbml0KHNwYW1saXN0b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaWYgKFB5TGlzdF9UeXBlLnRwX2luaXQoKFB5T2JqZWN0ICopc2VsZiwgYXJncywga3dkcykgPCAwKQotCQlyZXR1cm4gLTE7Ci0Jc2VsZi0+c3RhdGUgPSAwOwotCXJldHVybiAwOworICAgIGlmIChQeUxpc3RfVHlwZS50cF9pbml0KChQeU9iamVjdCAqKXNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNlbGYtPnN0YXRlID0gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNwYW1saXN0X3N0YXRlX2dldChzcGFtbGlzdG9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+c3RhdGUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5zdGF0ZSk7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBzcGFtbGlzdF9nZXRzZXRzW10gPSB7Ci0JeyJzdGF0ZSIsIChnZXR0ZXIpc3BhbWxpc3Rfc3RhdGVfZ2V0LCBOVUxMLAotCSBQeURvY19TVFIoImFuIGludCB2YXJpYWJsZSBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3NlcyIpfSwKLQl7MH0KKyAgICB7InN0YXRlIiwgKGdldHRlcilzcGFtbGlzdF9zdGF0ZV9nZXQsIE5VTEwsCisgICAgIFB5RG9jX1NUUigiYW4gaW50IHZhcmlhYmxlIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIil9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBzcGFtbGlzdF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCi0JInh4c3VidHlwZS5zcGFtbGlzdCIsCi0Jc2l6ZW9mKHNwYW1saXN0b2JqZWN0KSwKLQkwLAotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXNwYW1saXN0X21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0Jc3BhbWxpc3RfZ2V0c2V0cywJCQkvKiB0cF9nZXRzZXQgKi8KLQlERUZFUlJFRF9BRERSRVNTKCZQeUxpc3RfVHlwZSksCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JKGluaXRwcm9jKXNwYW1saXN0X2luaXQsCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JMCwJCQkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCisgICAgInh4c3VidHlwZS5zcGFtbGlzdCIsCisgICAgc2l6ZW9mKHNwYW1saXN0b2JqZWN0KSwKKyAgICAwLAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzcGFtbGlzdF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBzcGFtbGlzdF9nZXRzZXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIERFRkVSUkVEX0FERFJFU1MoJlB5TGlzdF9UeXBlKSwgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2Mpc3BhbWxpc3RfaW5pdCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIC8qIHNwYW1kaWN0IC0tIGEgZGljdCBzdWJ0eXBlICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeURpY3RPYmplY3QgZGljdDsKLQlpbnQgc3RhdGU7CisgICAgUHlEaWN0T2JqZWN0IGRpY3Q7CisgICAgaW50IHN0YXRlOwogfSBzcGFtZGljdG9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNwYW1kaWN0X2dldHN0YXRlKHNwYW1kaWN0b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRzdGF0ZSIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+c3RhdGUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldHN0YXRlIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5zdGF0ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcGFtZGljdF9zZXRzdGF0ZShzcGFtZGljdG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN0YXRlOworICAgIGludCBzdGF0ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRzdGF0ZSIsICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnN0YXRlID0gc3RhdGU7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRzdGF0ZSIsICZzdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnN0YXRlID0gc3RhdGU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc3BhbWRpY3RfbWV0aG9kc1tdID0gewotCXsiZ2V0c3RhdGUiLCAoUHlDRnVuY3Rpb24pc3BhbWRpY3RfZ2V0c3RhdGUsIE1FVEhfVkFSQVJHUywKLQkgCVB5RG9jX1NUUigiZ2V0c3RhdGUoKSAtPiBzdGF0ZSIpfSwKLQl7InNldHN0YXRlIiwgKFB5Q0Z1bmN0aW9uKXNwYW1kaWN0X3NldHN0YXRlLCBNRVRIX1ZBUkFSR1MsCi0JIAlQeURvY19TVFIoInNldHN0YXRlKHN0YXRlKSIpfSwKLQl7TlVMTCwJTlVMTH0sCisgICAgeyJnZXRzdGF0ZSIsIChQeUNGdW5jdGlvbilzcGFtZGljdF9nZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoImdldHN0YXRlKCkgLT4gc3RhdGUiKX0sCisgICAgeyJzZXRzdGF0ZSIsIChQeUNGdW5jdGlvbilzcGFtZGljdF9zZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoInNldHN0YXRlKHN0YXRlKSIpfSwKKyAgICB7TlVMTCwgICAgICBOVUxMfSwKIH07CiAKIHN0YXRpYyBpbnQKIHNwYW1kaWN0X2luaXQoc3BhbWRpY3RvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpZiAoUHlEaWN0X1R5cGUudHBfaW5pdCgoUHlPYmplY3QgKilzZWxmLCBhcmdzLCBrd2RzKSA8IDApCi0JCXJldHVybiAtMTsKLQlzZWxmLT5zdGF0ZSA9IDA7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5RGljdF9UeXBlLnRwX2luaXQoKFB5T2JqZWN0ICopc2VsZiwgYXJncywga3dkcykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc2VsZi0+c3RhdGUgPSAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgc3BhbWRpY3RfbWVtYmVyc1tdID0gewotCXsic3RhdGUiLCBUX0lOVCwgb2Zmc2V0b2Yoc3BhbWRpY3RvYmplY3QsIHN0YXRlKSwgUkVBRE9OTFksCi0JIFB5RG9jX1NUUigiYW4gaW50IHZhcmlhYmxlIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIil9LAotCXswfQorICAgIHsic3RhdGUiLCBUX0lOVCwgb2Zmc2V0b2Yoc3BhbWRpY3RvYmplY3QsIHN0YXRlKSwgUkVBRE9OTFksCisgICAgIFB5RG9jX1NUUigiYW4gaW50IHZhcmlhYmxlIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIil9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBzcGFtZGljdF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCi0JInh4c3VidHlwZS5zcGFtZGljdCIsCi0Jc2l6ZW9mKHNwYW1kaWN0b2JqZWN0KSwKLQkwLAotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXNwYW1kaWN0X21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCXNwYW1kaWN0X21lbWJlcnMsCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQlERUZFUlJFRF9BRERSRVNTKCZQeURpY3RfVHlwZSksCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JKGluaXRwcm9jKXNwYW1kaWN0X2luaXQsCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JMCwJCQkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCisgICAgInh4c3VidHlwZS5zcGFtZGljdCIsCisgICAgc2l6ZW9mKHNwYW1kaWN0b2JqZWN0KSwKKyAgICAwLAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzcGFtZGljdF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBzcGFtZGljdF9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIERFRkVSUkVEX0FERFJFU1MoJlB5RGljdF9UeXBlKSwgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2Mpc3BhbWRpY3RfaW5pdCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcGFtX2JlbmNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb2JqLCAqbmFtZSwgKnJlczsKLQlpbnQgbiA9IDEwMDA7Ci0JdGltZV90IHQwLCB0MTsKKyAgICBQeU9iamVjdCAqb2JqLCAqbmFtZSwgKnJlczsKKyAgICBpbnQgbiA9IDEwMDA7CisgICAgdGltZV90IHQwLCB0MTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT1N8aSIsICZvYmosICZuYW1lLCAmbikpCi0JCXJldHVybiBOVUxMOwotCXQwID0gY2xvY2soKTsKLQl3aGlsZSAoLS1uID49IDApIHsKLQkJcmVzID0gUHlPYmplY3RfR2V0QXR0cihvYmosIG5hbWUpOwotCQlpZiAocmVzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JfQotCXQxID0gY2xvY2soKTsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpKHQxLXQwKSAvIENMT0NLU19QRVJfU0VDKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9TfGkiLCAmb2JqLCAmbmFtZSwgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0MCA9IGNsb2NrKCk7CisgICAgd2hpbGUgKC0tbiA+PSAwKSB7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBuYW1lKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgIH0KKyAgICB0MSA9IGNsb2NrKCk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKSh0MS10MCkgLyBDTE9DS1NfUEVSX1NFQyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB4eHN1YnR5cGVfZnVuY3Rpb25zW10gPSB7Ci0JeyJiZW5jaCIsCXNwYW1fYmVuY2gsIAlNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJiZW5jaCIsICAgICAgICAgICBzcGFtX2JlbmNoLCAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXR4eHN1YnR5cGUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCS8qIEZpbGwgaW4gZGVmZXJyZWQgZGF0YSBhZGRyZXNzZXMuICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKLQkgICBQeVR5cGVfUmVhZHkoKSBpcyBjYWxsZWQuICBOb3RlIHRoYXQgUHlUeXBlX1JlYWR5KCkgYXV0b21hdGljYWxseQotCSAgIGluaXRpYWxpemVzIHRoZSBvYi5vYl90eXBlIGZpZWxkIHRvICZQeVR5cGVfVHlwZSBpZiBpdCdzIE5VTEwsCi0JICAgc28gaXQncyBub3QgbmVjZXNzYXJ5IHRvIGZpbGwgaW4gb2JfdHlwZSBmaXJzdC4gKi8KLQlzcGFtZGljdF90eXBlLnRwX2Jhc2UgPSAmUHlEaWN0X1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWRpY3RfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgLyogRmlsbCBpbiBkZWZlcnJlZCBkYXRhIGFkZHJlc3Nlcy4gIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZQorICAgICAgIFB5VHlwZV9SZWFkeSgpIGlzIGNhbGxlZC4gIE5vdGUgdGhhdCBQeVR5cGVfUmVhZHkoKSBhdXRvbWF0aWNhbGx5CisgICAgICAgaW5pdGlhbGl6ZXMgdGhlIG9iLm9iX3R5cGUgZmllbGQgdG8gJlB5VHlwZV9UeXBlIGlmIGl0J3MgTlVMTCwKKyAgICAgICBzbyBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gZmlsbCBpbiBvYl90eXBlIGZpcnN0LiAqLworICAgIHNwYW1kaWN0X3R5cGUudHBfYmFzZSA9ICZQeURpY3RfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZzcGFtZGljdF90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCXNwYW1saXN0X3R5cGUudHBfYmFzZSA9ICZQeUxpc3RfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZzcGFtbGlzdF90eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBzcGFtbGlzdF90eXBlLnRwX2Jhc2UgPSAmUHlMaXN0X1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWxpc3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQltID0gUHlfSW5pdE1vZHVsZTMoInh4c3VidHlwZSIsCi0JCQkgICB4eHN1YnR5cGVfZnVuY3Rpb25zLAotCQkJICAgeHhzdWJ0eXBlX19kb2NfXyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygieHhzdWJ0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdWJ0eXBlX2Z1bmN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdWJ0eXBlX19kb2NfXyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWxpc3RfdHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWRpY3RfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWxpc3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWRpY3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlQeV9JTkNSRUYoJnNwYW1saXN0X3R5cGUpOwotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgInNwYW1saXN0IiwKLQkJCSAgICAgICAoUHlPYmplY3QgKikgJnNwYW1saXN0X3R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5X0lOQ1JFRigmc3BhbWxpc3RfdHlwZSk7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCAic3BhbWxpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopICZzcGFtbGlzdF90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCVB5X0lOQ1JFRigmc3BhbWRpY3RfdHlwZSk7Ci0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCAic3BhbWRpY3QiLAotCQkJICAgICAgIChQeU9iamVjdCAqKSAmc3BhbWRpY3RfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgUHlfSU5DUkVGKCZzcGFtZGljdF90eXBlKTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzcGFtZGljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKikgJnNwYW1kaWN0X3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy95dXYuaCBiL01vZHVsZXMveXV2LmgKaW5kZXggNzM4YzRlNS4uMWU1ZmQyOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy95dXYuaAorKysgYi9Nb2R1bGVzL3l1di5oCkBAIC0xOSw0MSArMTksNDEgQEAKICAqICstLS0tLS0tLS0tLS0tLS0tLS0tKwogICovCiBzdHJ1Y3QgeXV2NDExIHsKLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBpbnQgZHVtbXk6ODsKLQkJdW5zaWduZWQgaW50IHkwOjg7Ci0JCXVuc2lnbmVkIGludCB1MDoyOwotCQl1bnNpZ25lZCBpbnQgdjA6MjsKLQkJdW5zaWduZWQgaW50IHkxOjg7Ci0JCXVuc2lnbmVkIGludCB1MToyOwotCQl1bnNpZ25lZCBpbnQgdjE6MjsKLQl9IHZbNF07CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQgaW50IGR1bW15Ojg7CisgICAgICAgIHVuc2lnbmVkIGludCB5MDo4OworICAgICAgICB1bnNpZ25lZCBpbnQgdTA6MjsKKyAgICAgICAgdW5zaWduZWQgaW50IHYwOjI7CisgICAgICAgIHVuc2lnbmVkIGludCB5MTo4OworICAgICAgICB1bnNpZ25lZCBpbnQgdTE6MjsKKyAgICAgICAgdW5zaWduZWQgaW50IHYxOjI7CisgICAgfSB2WzRdOwogfTsKIAotI2RlZmluZSBZVVY0MTFfWTAwKHkpCSh5KS52WzBdLnkwCi0jZGVmaW5lIFlVVjQxMV9ZMDEoeSkJKHkpLnZbMV0ueTAKLSNkZWZpbmUgWVVWNDExX1kwMih5KQkoeSkudlsyXS55MAotI2RlZmluZSBZVVY0MTFfWTAzKHkpCSh5KS52WzNdLnkwCi0jZGVmaW5lIFlVVjQxMV9ZMTAoeSkJKHkpLnZbMF0ueTEKLSNkZWZpbmUgWVVWNDExX1kxMSh5KQkoeSkudlsxXS55MQotI2RlZmluZSBZVVY0MTFfWTEyKHkpCSh5KS52WzJdLnkxCi0jZGVmaW5lIFlVVjQxMV9ZMTMoeSkJKHkpLnZbM10ueTEKLSNkZWZpbmUgWVVWNDExX1UwMCh5KQkoKHkpLnZbMF0udTA8PDZ8KHkpLnZbMV0udTA8PDR8KHkpLnZbMl0udTA8PDJ8KHkpLnZbM10udTApCi0jZGVmaW5lIFlVVjQxMV9VMDEoeSkJWVVWNDExX1UwMCh5KQotI2RlZmluZSBZVVY0MTFfVTAyKHkpCVlVVjQxMV9VMDAoeSkKLSNkZWZpbmUgWVVWNDExX1UwMyh5KQlZVVY0MTFfVTAwKHkpCi0jZGVmaW5lIFlVVjQxMV9VMTAoeSkJKCh5KS52WzBdLnUxPDw2fCh5KS52WzFdLnUxPDw0fCh5KS52WzJdLnUxPDwyfCh5KS52WzNdLnUxKQotI2RlZmluZSBZVVY0MTFfVTExKHkpCVlVVjQxMV9VMTAoeSkKLSNkZWZpbmUgWVVWNDExX1UxMih5KQlZVVY0MTFfVTEwKHkpCi0jZGVmaW5lIFlVVjQxMV9VMTMoeSkJWVVWNDExX1UxMCh5KQotI2RlZmluZSBZVVY0MTFfVjAwKHkpCSgoeSkudlswXS52MDw8NnwoeSkudlsxXS52MDw8NHwoeSkudlsyXS52MDw8MnwoeSkudlszXS52MCkKLSNkZWZpbmUgWVVWNDExX1YwMSh5KQlZVVY0MTFfVjAwKHkpCi0jZGVmaW5lIFlVVjQxMV9WMDIoeSkJWVVWNDExX1YwMCh5KQotI2RlZmluZSBZVVY0MTFfVjAzKHkpCVlVVjQxMV9WMDAoeSkKLSNkZWZpbmUgWVVWNDExX1YxMCh5KQkoKHkpLnZbMF0udjE8PDZ8KHkpLnZbMV0udjE8PDR8KHkpLnZbMl0udjE8PDJ8KHkpLnZbM10udjEpCi0jZGVmaW5lIFlVVjQxMV9WMTEoeSkJWVVWNDExX1YxMCh5KQotI2RlZmluZSBZVVY0MTFfVjEyKHkpCVlVVjQxMV9WMTAoeSkKLSNkZWZpbmUgWVVWNDExX1YxMyh5KQlZVVY0MTFfVjEwKHkpCisjZGVmaW5lIFlVVjQxMV9ZMDAoeSkgICAoeSkudlswXS55MAorI2RlZmluZSBZVVY0MTFfWTAxKHkpICAgKHkpLnZbMV0ueTAKKyNkZWZpbmUgWVVWNDExX1kwMih5KSAgICh5KS52WzJdLnkwCisjZGVmaW5lIFlVVjQxMV9ZMDMoeSkgICAoeSkudlszXS55MAorI2RlZmluZSBZVVY0MTFfWTEwKHkpICAgKHkpLnZbMF0ueTEKKyNkZWZpbmUgWVVWNDExX1kxMSh5KSAgICh5KS52WzFdLnkxCisjZGVmaW5lIFlVVjQxMV9ZMTIoeSkgICAoeSkudlsyXS55MQorI2RlZmluZSBZVVY0MTFfWTEzKHkpICAgKHkpLnZbM10ueTEKKyNkZWZpbmUgWVVWNDExX1UwMCh5KSAgICgoeSkudlswXS51MDw8NnwoeSkudlsxXS51MDw8NHwoeSkudlsyXS51MDw8MnwoeSkudlszXS51MCkKKyNkZWZpbmUgWVVWNDExX1UwMSh5KSAgIFlVVjQxMV9VMDAoeSkKKyNkZWZpbmUgWVVWNDExX1UwMih5KSAgIFlVVjQxMV9VMDAoeSkKKyNkZWZpbmUgWVVWNDExX1UwMyh5KSAgIFlVVjQxMV9VMDAoeSkKKyNkZWZpbmUgWVVWNDExX1UxMCh5KSAgICgoeSkudlswXS51MTw8NnwoeSkudlsxXS51MTw8NHwoeSkudlsyXS51MTw8MnwoeSkudlszXS51MSkKKyNkZWZpbmUgWVVWNDExX1UxMSh5KSAgIFlVVjQxMV9VMTAoeSkKKyNkZWZpbmUgWVVWNDExX1UxMih5KSAgIFlVVjQxMV9VMTAoeSkKKyNkZWZpbmUgWVVWNDExX1UxMyh5KSAgIFlVVjQxMV9VMTAoeSkKKyNkZWZpbmUgWVVWNDExX1YwMCh5KSAgICgoeSkudlswXS52MDw8NnwoeSkudlsxXS52MDw8NHwoeSkudlsyXS52MDw8MnwoeSkudlszXS52MCkKKyNkZWZpbmUgWVVWNDExX1YwMSh5KSAgIFlVVjQxMV9WMDAoeSkKKyNkZWZpbmUgWVVWNDExX1YwMih5KSAgIFlVVjQxMV9WMDAoeSkKKyNkZWZpbmUgWVVWNDExX1YwMyh5KSAgIFlVVjQxMV9WMDAoeSkKKyNkZWZpbmUgWVVWNDExX1YxMCh5KSAgICgoeSkudlswXS52MTw8NnwoeSkudlsxXS52MTw8NHwoeSkudlsyXS52MTw8MnwoeSkudlszXS52MSkKKyNkZWZpbmUgWVVWNDExX1YxMSh5KSAgIFlVVjQxMV9WMTAoeSkKKyNkZWZpbmUgWVVWNDExX1YxMih5KSAgIFlVVjQxMV9WMTAoeSkKKyNkZWZpbmUgWVVWNDExX1YxMyh5KSAgIFlVVjQxMV9WMTAoeSkKIAogLyoKICAqIENvbXByZXNzaW9uIExpYnJhcnkgWVVWIDQ6MjoyIGZvcm1hdC4KQEAgLTY1LDE3ICs2NSwxNyBAQAogICogKy0tLS0tLS0rCiAgKi8KIHN0cnVjdCB5dXY0MjIgewotCXVuc2lnbmVkIGludCB1Ojg7Ci0JdW5zaWduZWQgaW50IHkwOjg7Ci0JdW5zaWduZWQgaW50IHY6ODsKLQl1bnNpZ25lZCBpbnQgeTE6ODsKKyAgICB1bnNpZ25lZCBpbnQgdTo4OworICAgIHVuc2lnbmVkIGludCB5MDo4OworICAgIHVuc2lnbmVkIGludCB2Ojg7CisgICAgdW5zaWduZWQgaW50IHkxOjg7CiB9OwotI2RlZmluZSBZVVY0MjJfWTAoeSkJKHkpLnkwCi0jZGVmaW5lIFlVVjQyMl9ZMSh5KQkoeSkueTEKLSNkZWZpbmUgWVVWNDIyX1UwKHkpCSh5KS51Ci0jZGVmaW5lIFlVVjQyMl9VMSh5KQkoeSkudQotI2RlZmluZSBZVVY0MjJfVjAoeSkJKHkpLnYKLSNkZWZpbmUgWVVWNDIyX1YxKHkpCSh5KS52CisjZGVmaW5lIFlVVjQyMl9ZMCh5KSAgICAoeSkueTAKKyNkZWZpbmUgWVVWNDIyX1kxKHkpICAgICh5KS55MQorI2RlZmluZSBZVVY0MjJfVTAoeSkgICAgKHkpLnUKKyNkZWZpbmUgWVVWNDIyX1UxKHkpICAgICh5KS51CisjZGVmaW5lIFlVVjQyMl9WMCh5KSAgICAoeSkudgorI2RlZmluZSBZVVY0MjJfVjEoeSkgICAgKHkpLnYKIAogLyoKICAqIENvbXByZXNzaW9uIGxpYnJhcnkgWVVWIDQ6MjoyIER1cGxpY2F0ZSBDaHJvbWEgZm9ybWF0LgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy95dXZjb252ZXJ0LmMgYi9Nb2R1bGVzL3l1dmNvbnZlcnQuYwppbmRleCBlNTMzM2Q5Li5hMGZhNjM5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3l1dmNvbnZlcnQuYworKysgYi9Nb2R1bGVzL3l1dmNvbnZlcnQuYwpAQCAtNCwxMTUgKzQsMTE1IEBACiB2b2lkCiB5dXZfc3Y0MTFfdG9fY2w0MjJkYyhpbnQgaW52ZXJ0LCB2b2lkICpkYXRhLCB2b2lkICp5dXYsIGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKLQlzdHJ1Y3QgeXV2NDExICppbiA9IGRhdGE7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X2V2ZW4gPSB5dXY7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X29kZCA9IG91dF9ldmVuICsgd2lkdGggLyAyOwotCWludCBpLCBqOwkJLyogY291bnRlcnMgKi8KKyAgICBzdHJ1Y3QgeXV2NDExICppbiA9IGRhdGE7CisgICAgc3RydWN0IHl1djQyMiAqb3V0X2V2ZW4gPSB5dXY7CisgICAgc3RydWN0IHl1djQyMiAqb3V0X29kZCA9IG91dF9ldmVuICsgd2lkdGggLyAyOworICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAvKiBjb3VudGVycyAqLwogCi0JZm9yIChpID0gaGVpZ2h0IC8gMjsgaS0tOyApIHsKLQkJZm9yIChqID0gd2lkdGggLyA0OyBqLS07ICkgewotCQkJWVVWNDIyX1kwKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKCppbik7Ci0JCQlZVVY0MjJfVTAoKm91dF9ldmVuKSA9IFlVVjQxMV9VMDAoKmluKTsKLQkJCVlVVjQyMl9WMCgqb3V0X2V2ZW4pID0gWVVWNDExX1YwMCgqaW4pOwotCQkJWVVWNDIyX1kxKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAxKCppbik7Ci0JCQlvdXRfZXZlbisrOwotCQkJWVVWNDIyX1kwKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAyKCppbik7Ci0JCQlZVVY0MjJfVTAoKm91dF9ldmVuKSA9IFlVVjQxMV9VMDIoKmluKTsKLQkJCVlVVjQyMl9WMCgqb3V0X2V2ZW4pID0gWVVWNDExX1YwMigqaW4pOwotCQkJWVVWNDIyX1kxKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAzKCppbik7Ci0JCQlvdXRfZXZlbisrOwotCQkJWVVWNDIyX1kwKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMTAoKmluKTsKLQkJCVlVVjQyMl9VMCgqb3V0X29kZCkgPSBZVVY0MTFfVTEwKCppbik7Ci0JCQlZVVY0MjJfVjAoKm91dF9vZGQpID0gWVVWNDExX1YxMCgqaW4pOwotCQkJWVVWNDIyX1kxKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMTEoKmluKTsKLQkJCW91dF9vZGQrKzsKLQkJCVlVVjQyMl9ZMCgqb3V0X29kZCkgPSBZVVY0MTFfWTEyKCppbik7Ci0JCQlZVVY0MjJfVTAoKm91dF9vZGQpID0gWVVWNDExX1UxMigqaW4pOwotCQkJWVVWNDIyX1YwKCpvdXRfb2RkKSA9IFlVVjQxMV9WMTIoKmluKTsKLQkJCVlVVjQyMl9ZMSgqb3V0X29kZCkgPSBZVVY0MTFfWTEzKCppbik7Ci0JCQlvdXRfb2RkKys7Ci0JCQlpbisrOwotCQl9Ci0JCW91dF9ldmVuICs9IHdpZHRoIC8gMjsKLQkJb3V0X29kZCArPSB3aWR0aCAvIDI7Ci0JfQorICAgIGZvciAoaSA9IGhlaWdodCAvIDI7IGktLTsgKSB7CisgICAgICAgIGZvciAoaiA9IHdpZHRoIC8gNDsgai0tOyApIHsKKyAgICAgICAgICAgIFlVVjQyMl9ZMCgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMCgqaW4pOworICAgICAgICAgICAgWVVWNDIyX1UwKCpvdXRfZXZlbikgPSBZVVY0MTFfVTAwKCppbik7CisgICAgICAgICAgICBZVVY0MjJfVjAoKm91dF9ldmVuKSA9IFlVVjQxMV9WMDAoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9ZMSgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMSgqaW4pOworICAgICAgICAgICAgb3V0X2V2ZW4rKzsKKyAgICAgICAgICAgIFlVVjQyMl9ZMCgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMigqaW4pOworICAgICAgICAgICAgWVVWNDIyX1UwKCpvdXRfZXZlbikgPSBZVVY0MTFfVTAyKCppbik7CisgICAgICAgICAgICBZVVY0MjJfVjAoKm91dF9ldmVuKSA9IFlVVjQxMV9WMDIoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9ZMSgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMygqaW4pOworICAgICAgICAgICAgb3V0X2V2ZW4rKzsKKyAgICAgICAgICAgIFlVVjQyMl9ZMCgqb3V0X29kZCkgPSBZVVY0MTFfWTEwKCppbik7CisgICAgICAgICAgICBZVVY0MjJfVTAoKm91dF9vZGQpID0gWVVWNDExX1UxMCgqaW4pOworICAgICAgICAgICAgWVVWNDIyX1YwKCpvdXRfb2RkKSA9IFlVVjQxMV9WMTAoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9ZMSgqb3V0X29kZCkgPSBZVVY0MTFfWTExKCppbik7CisgICAgICAgICAgICBvdXRfb2RkKys7CisgICAgICAgICAgICBZVVY0MjJfWTAoKm91dF9vZGQpID0gWVVWNDExX1kxMigqaW4pOworICAgICAgICAgICAgWVVWNDIyX1UwKCpvdXRfb2RkKSA9IFlVVjQxMV9VMTIoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9WMCgqb3V0X29kZCkgPSBZVVY0MTFfVjEyKCppbik7CisgICAgICAgICAgICBZVVY0MjJfWTEoKm91dF9vZGQpID0gWVVWNDExX1kxMygqaW4pOworICAgICAgICAgICAgb3V0X29kZCsrOworICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgfQorICAgICAgICBvdXRfZXZlbiArPSB3aWR0aCAvIDI7CisgICAgICAgIG91dF9vZGQgKz0gd2lkdGggLyAyOworICAgIH0KIH0KIAogdm9pZAogeXV2X3N2NDExX3RvX2NsNDIyZGNfcXVhcnRlcnNpemUoaW50IGludmVydCwgdm9pZCAqZGF0YSwgdm9pZCAqeXV2LAotCQkJCSBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7Ci0JaW50IHc0ID0gd2lkdGggLyA0OwkvKiBxdWFydGVyIG9mIHdpZHRoIGlzIHVzZWQgb2Z0ZW4gKi8KLQlzdHJ1Y3QgeXV2NDExICppbl9ldmVuID0gZGF0YTsKLQlzdHJ1Y3QgeXV2NDExICppbl9vZGQgPSBpbl9ldmVuICsgdzQ7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X2V2ZW4gPSB5dXY7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X29kZCA9IG91dF9ldmVuICsgdzQ7Ci0JaW50IGksIGo7CQkvKiBjb3VudGVycyAqLwotCWludCB1LCB2OwkJLyogVSBhbmQgViB2YWx1ZXMgKi8KKyAgICBpbnQgdzQgPSB3aWR0aCAvIDQ7ICAgICAgICAgLyogcXVhcnRlciBvZiB3aWR0aCBpcyB1c2VkIG9mdGVuICovCisgICAgc3RydWN0IHl1djQxMSAqaW5fZXZlbiA9IGRhdGE7CisgICAgc3RydWN0IHl1djQxMSAqaW5fb2RkID0gaW5fZXZlbiArIHc0OworICAgIHN0cnVjdCB5dXY0MjIgKm91dF9ldmVuID0geXV2OworICAgIHN0cnVjdCB5dXY0MjIgKm91dF9vZGQgPSBvdXRfZXZlbiArIHc0OworICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAvKiBjb3VudGVycyAqLworICAgIGludCB1LCB2OyAgICAgICAgICAgICAgICAgICAvKiBVIGFuZCBWIHZhbHVlcyAqLwogCi0JZm9yIChpID0gaGVpZ2h0IC8gNDsgaS0tOyApIHsKLQkJZm9yIChqID0gdzQ7IGotLTsgKSB7Ci0JCQl1ID0gWVVWNDExX1UwMCgqaW5fZXZlbik7Ci0JCQl2ID0gWVVWNDExX1YwMCgqaW5fZXZlbik7CisgICAgZm9yIChpID0gaGVpZ2h0IC8gNDsgaS0tOyApIHsKKyAgICAgICAgZm9yIChqID0gdzQ7IGotLTsgKSB7CisgICAgICAgICAgICB1ID0gWVVWNDExX1UwMCgqaW5fZXZlbik7CisgICAgICAgICAgICB2ID0gWVVWNDExX1YwMCgqaW5fZXZlbik7CiAKLQkJCVlVVjQyMl9ZMCgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMCgqaW5fZXZlbik7Ci0JCQlZVVY0MjJfVTAoKm91dF9ldmVuKSA9IHU7Ci0JCQlZVVY0MjJfVjAoKm91dF9ldmVuKSA9IHY7Ci0JCQlZVVY0MjJfWTEoKm91dF9ldmVuKSA9IFlVVjQxMV9ZMDIoKmluX2V2ZW4pOworICAgICAgICAgICAgWVVWNDIyX1kwKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKCppbl9ldmVuKTsKKyAgICAgICAgICAgIFlVVjQyMl9VMCgqb3V0X2V2ZW4pID0gdTsKKyAgICAgICAgICAgIFlVVjQyMl9WMCgqb3V0X2V2ZW4pID0gdjsKKyAgICAgICAgICAgIFlVVjQyMl9ZMSgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMigqaW5fZXZlbik7CiAKLQkJCVlVVjQyMl9ZMCgqb3V0X29kZCkgPSBZVVY0MTFfWTEwKCppbl9vZGQpOwotCQkJWVVWNDIyX1UwKCpvdXRfb2RkKSA9IHU7Ci0JCQlZVVY0MjJfVjAoKm91dF9vZGQpID0gdjsKLQkJCVlVVjQyMl9ZMSgqb3V0X29kZCkgPSBZVVY0MTFfWTEyKCppbl9vZGQpOworICAgICAgICAgICAgWVVWNDIyX1kwKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMTAoKmluX29kZCk7CisgICAgICAgICAgICBZVVY0MjJfVTAoKm91dF9vZGQpID0gdTsKKyAgICAgICAgICAgIFlVVjQyMl9WMCgqb3V0X29kZCkgPSB2OworICAgICAgICAgICAgWVVWNDIyX1kxKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMTIoKmluX29kZCk7CiAKLQkJCWluX2V2ZW4rKzsKLQkJCWluX29kZCsrOwotCQkJb3V0X2V2ZW4rKzsKLQkJCW91dF9vZGQrKzsKLQkJfQotCQlpbl9ldmVuICs9IHc0OwotCQlpbl9vZGQgKz0gdzQ7Ci0JCW91dF9ldmVuICs9IHc0OwotCQlvdXRfb2RkICs9IHc0OwotCX0KKyAgICAgICAgICAgIGluX2V2ZW4rKzsKKyAgICAgICAgICAgIGluX29kZCsrOworICAgICAgICAgICAgb3V0X2V2ZW4rKzsKKyAgICAgICAgICAgIG91dF9vZGQrKzsKKyAgICAgICAgfQorICAgICAgICBpbl9ldmVuICs9IHc0OworICAgICAgICBpbl9vZGQgKz0gdzQ7CisgICAgICAgIG91dF9ldmVuICs9IHc0OworICAgICAgICBvdXRfb2RkICs9IHc0OworICAgIH0KIH0KIAogdm9pZAogeXV2X3N2NDExX3RvX2NsNDIyZGNfc2l4dGVlbnRoc2l6ZShpbnQgaW52ZXJ0LCB2b2lkICpkYXRhLCB2b2lkICp5dXYsCi0JCQkJICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7Ci0JaW50IHc0XzMgPSAzICogd2lkdGggLyA0OyAvKiB0aHJlZSBxdWFydGVycyBvZiB3aWR0aCBpcyB1c2VkIG9mdGVuICovCi0JaW50IHc4ID0gd2lkdGggLyA4OwkvKiBhbmQgc28gaXMgb25lIGVpZ2h0aCAqLwotCXN0cnVjdCB5dXY0MTEgKmluX2V2ZW4gPSBkYXRhOwotCXN0cnVjdCB5dXY0MTEgKmluX29kZCA9IGluX2V2ZW4gKyB3aWR0aCAvIDI7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X2V2ZW4gPSB5dXY7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X29kZCA9IG91dF9ldmVuICsgdzg7Ci0JaW50IGksIGo7CQkvKiBjb3VudGVycyAqLwotCWludCB1LCB2OwkJLyogVSBhbmQgViB2YWx1ZXMgKi8KKyAgICBpbnQgdzRfMyA9IDMgKiB3aWR0aCAvIDQ7IC8qIHRocmVlIHF1YXJ0ZXJzIG9mIHdpZHRoIGlzIHVzZWQgb2Z0ZW4gKi8KKyAgICBpbnQgdzggPSB3aWR0aCAvIDg7ICAgICAgICAgLyogYW5kIHNvIGlzIG9uZSBlaWdodGggKi8KKyAgICBzdHJ1Y3QgeXV2NDExICppbl9ldmVuID0gZGF0YTsKKyAgICBzdHJ1Y3QgeXV2NDExICppbl9vZGQgPSBpbl9ldmVuICsgd2lkdGggLyAyOworICAgIHN0cnVjdCB5dXY0MjIgKm91dF9ldmVuID0geXV2OworICAgIHN0cnVjdCB5dXY0MjIgKm91dF9vZGQgPSBvdXRfZXZlbiArIHc4OworICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAvKiBjb3VudGVycyAqLworICAgIGludCB1LCB2OyAgICAgICAgICAgICAgICAgICAvKiBVIGFuZCBWIHZhbHVlcyAqLwogCi0JZm9yIChpID0gaGVpZ2h0IC8gODsgaS0tOyApIHsKLQkJZm9yIChqID0gdzg7IGotLTsgKSB7Ci0JCQl1ID0gWVVWNDExX1UwMChpbl9ldmVuWzBdKTsKLQkJCXYgPSBZVVY0MTFfVjAwKGluX2V2ZW5bMF0pOworICAgIGZvciAoaSA9IGhlaWdodCAvIDg7IGktLTsgKSB7CisgICAgICAgIGZvciAoaiA9IHc4OyBqLS07ICkgeworICAgICAgICAgICAgdSA9IFlVVjQxMV9VMDAoaW5fZXZlblswXSk7CisgICAgICAgICAgICB2ID0gWVVWNDExX1YwMChpbl9ldmVuWzBdKTsKIAotCQkJWVVWNDIyX1kwKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKGluX2V2ZW5bMF0pOwotCQkJWVVWNDIyX1UwKCpvdXRfZXZlbikgPSB1OwotCQkJWVVWNDIyX1YwKCpvdXRfZXZlbikgPSB2OwotCQkJWVVWNDIyX1kxKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKGluX2V2ZW5bMV0pOworICAgICAgICAgICAgWVVWNDIyX1kwKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKGluX2V2ZW5bMF0pOworICAgICAgICAgICAgWVVWNDIyX1UwKCpvdXRfZXZlbikgPSB1OworICAgICAgICAgICAgWVVWNDIyX1YwKCpvdXRfZXZlbikgPSB2OworICAgICAgICAgICAgWVVWNDIyX1kxKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKGluX2V2ZW5bMV0pOwogCi0JCQlZVVY0MjJfWTAoKm91dF9vZGQpID0gWVVWNDExX1kwMChpbl9vZGRbMF0pOwotCQkJWVVWNDIyX1UwKCpvdXRfb2RkKSA9IHU7Ci0JCQlZVVY0MjJfVjAoKm91dF9vZGQpID0gdjsKLQkJCVlVVjQyMl9ZMSgqb3V0X29kZCkgPSBZVVY0MTFfWTAwKGluX2V2ZW5bMV0pOworICAgICAgICAgICAgWVVWNDIyX1kwKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMDAoaW5fb2RkWzBdKTsKKyAgICAgICAgICAgIFlVVjQyMl9VMCgqb3V0X29kZCkgPSB1OworICAgICAgICAgICAgWVVWNDIyX1YwKCpvdXRfb2RkKSA9IHY7CisgICAgICAgICAgICBZVVY0MjJfWTEoKm91dF9vZGQpID0gWVVWNDExX1kwMChpbl9ldmVuWzFdKTsKIAotCQkJaW5fZXZlbiArPSAyOwotCQkJaW5fb2RkICs9IDI7Ci0JCQlvdXRfZXZlbisrOwotCQkJb3V0X29kZCsrOwotCQl9Ci0JCWluX2V2ZW4gKz0gdzRfMzsKLQkJaW5fb2RkICs9IHc0XzM7Ci0JCW91dF9ldmVuICs9IHc4OwotCQlvdXRfb2RkICs9IHc4OwotCX0KKyAgICAgICAgICAgIGluX2V2ZW4gKz0gMjsKKyAgICAgICAgICAgIGluX29kZCArPSAyOworICAgICAgICAgICAgb3V0X2V2ZW4rKzsKKyAgICAgICAgICAgIG91dF9vZGQrKzsKKyAgICAgICAgfQorICAgICAgICBpbl9ldmVuICs9IHc0XzM7CisgICAgICAgIGluX29kZCArPSB3NF8zOworICAgICAgICBvdXRfZXZlbiArPSB3ODsKKyAgICAgICAgb3V0X29kZCArPSB3ODsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3ppcGltcG9ydC5jIGIvTW9kdWxlcy96aXBpbXBvcnQuYwppbmRleCBiMDVkZTI0Li4zY2NlOWJmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3ppcGltcG9ydC5jCisrKyBiL01vZHVsZXMvemlwaW1wb3J0LmMKQEAgLTEwLDggKzEwLDggQEAKICNkZWZpbmUgSVNfUEFDS0FHRSAgMHgyCiAKIHN0cnVjdCBzdF96aXBfc2VhcmNob3JkZXIgewotCWNoYXIgc3VmZml4WzE0XTsKLQlpbnQgdHlwZTsKKyAgICBjaGFyIHN1ZmZpeFsxNF07CisgICAgaW50IHR5cGU7CiB9OwogCiAvKiB6aXBfc2VhcmNob3JkZXIgZGVmaW5lcyBob3cgd2Ugc2VhcmNoIGZvciBhIG1vZHVsZSBpbiB0aGUgWmlwCkBAIC0yMCwxMyArMjAsMTMgQEAKICAgIGFyZSBzd2FwcGVkIGJ5IGluaXR6aXBpbXBvcnQoKSBpZiB3ZSBydW4gaW4gb3B0aW1pemVkIG1vZGUuIEFsc28sCiAgICAnLycgaXMgcmVwbGFjZWQgYnkgU0VQIHRoZXJlLiAqLwogc3RhdGljIHN0cnVjdCBzdF96aXBfc2VhcmNob3JkZXIgemlwX3NlYXJjaG9yZGVyW10gPSB7Ci0JeyIvX19pbml0X18ucHljIiwgSVNfUEFDS0FHRSB8IElTX0JZVEVDT0RFfSwKLQl7Ii9fX2luaXRfXy5weW8iLCBJU19QQUNLQUdFIHwgSVNfQllURUNPREV9LAotCXsiL19faW5pdF9fLnB5IiwgSVNfUEFDS0FHRSB8IElTX1NPVVJDRX0sCi0JeyIucHljIiwgSVNfQllURUNPREV9LAotCXsiLnB5byIsIElTX0JZVEVDT0RFfSwKLQl7Ii5weSIsIElTX1NPVVJDRX0sCi0JeyIiLCAwfQorICAgIHsiL19faW5pdF9fLnB5YyIsIElTX1BBQ0tBR0UgfCBJU19CWVRFQ09ERX0sCisgICAgeyIvX19pbml0X18ucHlvIiwgSVNfUEFDS0FHRSB8IElTX0JZVEVDT0RFfSwKKyAgICB7Ii9fX2luaXRfXy5weSIsIElTX1BBQ0tBR0UgfCBJU19TT1VSQ0V9LAorICAgIHsiLnB5YyIsIElTX0JZVEVDT0RFfSwKKyAgICB7Ii5weW8iLCBJU19CWVRFQ09ERX0sCisgICAgeyIucHkiLCBJU19TT1VSQ0V9LAorICAgIHsiIiwgMH0KIH07CiAKIC8qIHppcGltcG9ydGVyIG9iamVjdCBkZWZpbml0aW9uIGFuZCBzdXBwb3J0ICovCkBAIC0zNCwxMCArMzQsMTAgQEAKIHR5cGVkZWYgc3RydWN0IF96aXBpbXBvcnRlciBaaXBJbXBvcnRlcjsKIAogc3RydWN0IF96aXBpbXBvcnRlciB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICphcmNoaXZlOyAgLyogcGF0aG5hbWUgb2YgdGhlIFppcCBhcmNoaXZlICovCi0JUHlPYmplY3QgKnByZWZpeDsgICAvKiBmaWxlIHByZWZpeDogImEvc3ViL2RpcmVjdG9yeS8iICovCi0JUHlPYmplY3QgKmZpbGVzOyAgICAvKiBkaWN0IHdpdGggZmlsZSBpbmZvIHtwYXRoOiB0b2NfZW50cnl9ICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICphcmNoaXZlOyAgLyogcGF0aG5hbWUgb2YgdGhlIFppcCBhcmNoaXZlICovCisgICAgUHlPYmplY3QgKnByZWZpeDsgICAvKiBmaWxlIHByZWZpeDogImEvc3ViL2RpcmVjdG9yeS8iICovCisgICAgUHlPYmplY3QgKmZpbGVzOyAgICAvKiBkaWN0IHdpdGggZmlsZSBpbmZvIHtwYXRoOiB0b2NfZW50cnl9ICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKlppcEltcG9ydEVycm9yOwpAQCAtNDcsNyArNDcsNyBAQAogc3RhdGljIFB5T2JqZWN0ICpyZWFkX2RpcmVjdG9yeShjaGFyICphcmNoaXZlKTsKIHN0YXRpYyBQeU9iamVjdCAqZ2V0X2RhdGEoY2hhciAqYXJjaGl2ZSwgUHlPYmplY3QgKnRvY19lbnRyeSk7CiBzdGF0aWMgUHlPYmplY3QgKmdldF9tb2R1bGVfY29kZShaaXBJbXBvcnRlciAqc2VsZiwgY2hhciAqZnVsbG5hbWUsCi0JCQkJIGludCAqcF9pc3BhY2thZ2UsIGNoYXIgKipwX21vZHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwX2lzcGFja2FnZSwgY2hhciAqKnBfbW9kcGF0aCk7CiAKIAogI2RlZmluZSBaaXBJbXBvcnRlcl9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmWmlwSW1wb3J0ZXJfVHlwZSkKQEAgLTYwLDE2MiArNjAsMTYyIEBACiBzdGF0aWMgaW50CiB6aXBpbXBvcnRlcl9pbml0KFppcEltcG9ydGVyICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JY2hhciAqcGF0aCwgKnAsICpwcmVmaXgsIGJ1ZltNQVhQQVRITEVOKzJdOwotCXNpemVfdCBsZW47CisgICAgY2hhciAqcGF0aCwgKnAsICpwcmVmaXgsIGJ1ZltNQVhQQVRITEVOKzJdOworICAgIHNpemVfdCBsZW47CiAKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJ6aXBpbXBvcnRlcigpIiwga3dkcykpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJ6aXBpbXBvcnRlcigpIiwga3dkcykpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp6aXBpbXBvcnRlciIsCi0JCQkgICAgICAmcGF0aCkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCkpCisgICAgICAgIHJldHVybiAtMTsKIAotCWxlbiA9IHN0cmxlbihwYXRoKTsKLQlpZiAobGVuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLCAiYXJjaGl2ZSBwYXRoIGlzIGVtcHR5Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGxlbiA+PSBNQVhQQVRITEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwKLQkJCQkiYXJjaGl2ZSBwYXRoIHRvbyBsb25nIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc3RyY3B5KGJ1ZiwgcGF0aCk7CisgICAgbGVuID0gc3RybGVuKHBhdGgpOworICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsICJhcmNoaXZlIHBhdGggaXMgZW1wdHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGVuID49IE1BWFBBVEhMRU4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyY2hpdmUgcGF0aCB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHN0cmNweShidWYsIHBhdGgpOwogCiAjaWZkZWYgQUxUU0VQCi0JZm9yIChwID0gYnVmOyAqcDsgcCsrKSB7Ci0JCWlmICgqcCA9PSBBTFRTRVApCi0JCQkqcCA9IFNFUDsKLQl9CisgICAgZm9yIChwID0gYnVmOyAqcDsgcCsrKSB7CisgICAgICAgIGlmICgqcCA9PSBBTFRTRVApCisgICAgICAgICAgICAqcCA9IFNFUDsKKyAgICB9CiAjZW5kaWYKIAotCXBhdGggPSBOVUxMOwotCXByZWZpeCA9IE5VTEw7Ci0JZm9yICg7OykgeworICAgIHBhdGggPSBOVUxMOworICAgIHByZWZpeCA9IE5VTEw7CisgICAgZm9yICg7OykgewogI2lmbmRlZiBSSVNDT1MKLQkJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQkJaW50IHJ2OworICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgICAgICBpbnQgcnY7CiAKLQkJcnYgPSBzdGF0KGJ1ZiwgJnN0YXRidWYpOwotCQlpZiAocnYgPT0gMCkgewotCQkJLyogaXQgZXhpc3RzICovCi0JCQlpZiAoU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpKQotCQkJCS8qIGl0J3MgYSBmaWxlICovCi0JCQkJcGF0aCA9IGJ1ZjsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIHJ2ID0gc3RhdChidWYsICZzdGF0YnVmKTsKKyAgICAgICAgaWYgKHJ2ID09IDApIHsKKyAgICAgICAgICAgIC8qIGl0IGV4aXN0cyAqLworICAgICAgICAgICAgaWYgKFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkKKyAgICAgICAgICAgICAgICAvKiBpdCdzIGEgZmlsZSAqLworICAgICAgICAgICAgICAgIHBhdGggPSBidWY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogI2Vsc2UKLQkJaWYgKG9iamVjdF9leGlzdHMoYnVmKSkgewotCQkJLyogaXQgZXhpc3RzICovCi0JCQlpZiAoaXNmaWxlKGJ1ZikpCi0JCQkJLyogaXQncyBhIGZpbGUgKi8KLQkJCQlwYXRoID0gYnVmOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaWYgKG9iamVjdF9leGlzdHMoYnVmKSkgeworICAgICAgICAgICAgLyogaXQgZXhpc3RzICovCisgICAgICAgICAgICBpZiAoaXNmaWxlKGJ1ZikpCisgICAgICAgICAgICAgICAgLyogaXQncyBhIGZpbGUgKi8KKyAgICAgICAgICAgICAgICBwYXRoID0gYnVmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICNlbmRpZgotCQkvKiBiYWNrIHVwIG9uZSBwYXRoIGVsZW1lbnQgKi8KLQkJcCA9IHN0cnJjaHIoYnVmLCBTRVApOwotCQlpZiAocHJlZml4ICE9IE5VTEwpCi0JCQkqcHJlZml4ID0gU0VQOwotCQlpZiAocCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCSpwID0gJ1wwJzsKLQkJcHJlZml4ID0gcDsKLQl9Ci0JaWYgKHBhdGggIT0gTlVMTCkgewotCQlQeU9iamVjdCAqZmlsZXM7Ci0JCWZpbGVzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoemlwX2RpcmVjdG9yeV9jYWNoZSwgcGF0aCk7Ci0JCWlmIChmaWxlcyA9PSBOVUxMKSB7Ci0JCQlmaWxlcyA9IHJlYWRfZGlyZWN0b3J5KGJ1Zik7Ci0JCQlpZiAoZmlsZXMgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoemlwX2RpcmVjdG9yeV9jYWNoZSwgcGF0aCwKLQkJCQkJCSBmaWxlcykgIT0gMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQotCQkJUHlfSU5DUkVGKGZpbGVzKTsKLQkJc2VsZi0+ZmlsZXMgPSBmaWxlczsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwgIm5vdCBhIFppcCBmaWxlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgIC8qIGJhY2sgdXAgb25lIHBhdGggZWxlbWVudCAqLworICAgICAgICBwID0gc3RycmNocihidWYsIFNFUCk7CisgICAgICAgIGlmIChwcmVmaXggIT0gTlVMTCkKKyAgICAgICAgICAgICpwcmVmaXggPSBTRVA7CisgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKnAgPSAnXDAnOworICAgICAgICBwcmVmaXggPSBwOworICAgIH0KKyAgICBpZiAocGF0aCAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpmaWxlczsKKyAgICAgICAgZmlsZXMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyh6aXBfZGlyZWN0b3J5X2NhY2hlLCBwYXRoKTsKKyAgICAgICAgaWYgKGZpbGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZpbGVzID0gcmVhZF9kaXJlY3RvcnkoYnVmKTsKKyAgICAgICAgICAgIGlmIChmaWxlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh6aXBfZGlyZWN0b3J5X2NhY2hlLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzKSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9JTkNSRUYoZmlsZXMpOworICAgICAgICBzZWxmLT5maWxlcyA9IGZpbGVzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLCAibm90IGEgWmlwIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChwcmVmaXggPT0gTlVMTCkKLQkJcHJlZml4ID0gIiI7Ci0JZWxzZSB7Ci0JCXByZWZpeCsrOwotCQlsZW4gPSBzdHJsZW4ocHJlZml4KTsKLQkJaWYgKHByZWZpeFtsZW4tMV0gIT0gU0VQKSB7Ci0JCQkvKiBhZGQgdHJhaWxpbmcgU0VQICovCi0JCQlwcmVmaXhbbGVuXSA9IFNFUDsKLQkJCXByZWZpeFtsZW4gKyAxXSA9ICdcMCc7Ci0JCX0KLQl9CisgICAgaWYgKHByZWZpeCA9PSBOVUxMKQorICAgICAgICBwcmVmaXggPSAiIjsKKyAgICBlbHNlIHsKKyAgICAgICAgcHJlZml4Kys7CisgICAgICAgIGxlbiA9IHN0cmxlbihwcmVmaXgpOworICAgICAgICBpZiAocHJlZml4W2xlbi0xXSAhPSBTRVApIHsKKyAgICAgICAgICAgIC8qIGFkZCB0cmFpbGluZyBTRVAgKi8KKyAgICAgICAgICAgIHByZWZpeFtsZW5dID0gU0VQOworICAgICAgICAgICAgcHJlZml4W2xlbiArIDFdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0KIAotCXNlbGYtPmFyY2hpdmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7Ci0JaWYgKHNlbGYtPmFyY2hpdmUgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIHNlbGYtPmFyY2hpdmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgaWYgKHNlbGYtPmFyY2hpdmUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0Jc2VsZi0+cHJlZml4ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwcmVmaXgpOwotCWlmIChzZWxmLT5wcmVmaXggPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIHNlbGYtPnByZWZpeCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocHJlZml4KTsKKyAgICBpZiAoc2VsZi0+cHJlZml4ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAvKiBHQyBzdXBwb3J0LiAqLwogc3RhdGljIGludAogemlwaW1wb3J0ZXJfdHJhdmVyc2UoUHlPYmplY3QgKm9iaiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7Ci0JUHlfVklTSVQoc2VsZi0+ZmlsZXMpOwotCXJldHVybiAwOworICAgIFppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOworICAgIFB5X1ZJU0lUKHNlbGYtPmZpbGVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIHppcGltcG9ydGVyX2RlYWxsb2MoWmlwSW1wb3J0ZXIgKnNlbGYpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKLQlQeV9YREVDUkVGKHNlbGYtPmFyY2hpdmUpOwotCVB5X1hERUNSRUYoc2VsZi0+cHJlZml4KTsKLQlQeV9YREVDUkVGKHNlbGYtPmZpbGVzKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5hcmNoaXZlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnByZWZpeCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5maWxlcyk7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHppcGltcG9ydGVyX3JlcHIoWmlwSW1wb3J0ZXIgKnNlbGYpCiB7Ci0JY2hhciBidWZbNTAwXTsKLQljaGFyICphcmNoaXZlID0gIj8/PyI7Ci0JY2hhciAqcHJlZml4ID0gIiI7CisgICAgY2hhciBidWZbNTAwXTsKKyAgICBjaGFyICphcmNoaXZlID0gIj8/PyI7CisgICAgY2hhciAqcHJlZml4ID0gIiI7CiAKLQlpZiAoc2VsZi0+YXJjaGl2ZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHNlbGYtPmFyY2hpdmUpKQotCQlhcmNoaXZlID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSk7Ci0JaWYgKHNlbGYtPnByZWZpeCAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHNlbGYtPnByZWZpeCkpCi0JCXByZWZpeCA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCk7Ci0JaWYgKHByZWZpeCAhPSBOVUxMICYmICpwcmVmaXgpCi0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAgICI8emlwaW1wb3J0ZXIgb2JqZWN0IFwiJS4zMDBzJWMlLjE1MHNcIj4iLAotCQkJICAgICAgYXJjaGl2ZSwgU0VQLCBwcmVmaXgpOwotCWVsc2UKLQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJICAgICAgIjx6aXBpbXBvcnRlciBvYmplY3QgXCIlLjMwMHNcIj4iLAotCQkJICAgICAgYXJjaGl2ZSk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBpZiAoc2VsZi0+YXJjaGl2ZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHNlbGYtPmFyY2hpdmUpKQorICAgICAgICBhcmNoaXZlID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSk7CisgICAgaWYgKHNlbGYtPnByZWZpeCAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHNlbGYtPnByZWZpeCkpCisgICAgICAgIHByZWZpeCA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCk7CisgICAgaWYgKHByZWZpeCAhPSBOVUxMICYmICpwcmVmaXgpCisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAiPHppcGltcG9ydGVyIG9iamVjdCBcIiUuMzAwcyVjJS4xNTBzXCI+IiwKKyAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlLCBTRVAsIHByZWZpeCk7CisgICAgZWxzZQorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgIjx6aXBpbXBvcnRlciBvYmplY3QgXCIlLjMwMHNcIj4iLAorICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIC8qIHJldHVybiBmdWxsbmFtZS5zcGxpdCgiLiIpWy0xXSAqLwogc3RhdGljIGNoYXIgKgogZ2V0X3N1Ym5hbWUoY2hhciAqZnVsbG5hbWUpCiB7Ci0JY2hhciAqc3VibmFtZSA9IHN0cnJjaHIoZnVsbG5hbWUsICcuJyk7Ci0JaWYgKHN1Ym5hbWUgPT0gTlVMTCkKLQkJc3VibmFtZSA9IGZ1bGxuYW1lOwotCWVsc2UKLQkJc3VibmFtZSsrOwotCXJldHVybiBzdWJuYW1lOworICAgIGNoYXIgKnN1Ym5hbWUgPSBzdHJyY2hyKGZ1bGxuYW1lLCAnLicpOworICAgIGlmIChzdWJuYW1lID09IE5VTEwpCisgICAgICAgIHN1Ym5hbWUgPSBmdWxsbmFtZTsKKyAgICBlbHNlCisgICAgICAgIHN1Ym5hbWUrKzsKKyAgICByZXR1cm4gc3VibmFtZTsKIH0KIAogLyogR2l2ZW4gYSAoc3ViKW1vZHVsZW5hbWUsIHdyaXRlIHRoZSBwb3RlbnRpYWwgZmlsZSBwYXRoIGluIHRoZQpAQCAtMjI0LDU5ICsyMjQsNTkgQEAKIHN0YXRpYyBpbnQKIG1ha2VfZmlsZW5hbWUoY2hhciAqcHJlZml4LCBjaGFyICpuYW1lLCBjaGFyICpwYXRoKQogewotCXNpemVfdCBsZW47Ci0JY2hhciAqcDsKKyAgICBzaXplX3QgbGVuOworICAgIGNoYXIgKnA7CiAKLQlsZW4gPSBzdHJsZW4ocHJlZml4KTsKKyAgICBsZW4gPSBzdHJsZW4ocHJlZml4KTsKIAotCS8qIHNlbGYucHJlZml4ICsgbmFtZSBbKyBTRVAgKyAiX19pbml0X18iXSArICIucHlbY29dIiAqLwotCWlmIChsZW4gKyBzdHJsZW4obmFtZSkgKyAxMyA+PSBNQVhQQVRITEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwgInBhdGggdG9vIGxvbmciKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBzZWxmLnByZWZpeCArIG5hbWUgWysgU0VQICsgIl9faW5pdF9fIl0gKyAiLnB5W2NvXSIgKi8KKyAgICBpZiAobGVuICsgc3RybGVuKG5hbWUpICsgMTMgPj0gTUFYUEFUSExFTikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsICJwYXRoIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlzdHJjcHkocGF0aCwgcHJlZml4KTsKLQlzdHJjcHkocGF0aCArIGxlbiwgbmFtZSk7Ci0JZm9yIChwID0gcGF0aCArIGxlbjsgKnA7IHArKykgewotCQlpZiAoKnAgPT0gJy4nKQotCQkJKnAgPSBTRVA7Ci0JfQotCWxlbiArPSBzdHJsZW4obmFtZSk7Ci0JYXNzZXJ0KGxlbiA8IElOVF9NQVgpOwotCXJldHVybiAoaW50KWxlbjsKKyAgICBzdHJjcHkocGF0aCwgcHJlZml4KTsKKyAgICBzdHJjcHkocGF0aCArIGxlbiwgbmFtZSk7CisgICAgZm9yIChwID0gcGF0aCArIGxlbjsgKnA7IHArKykgeworICAgICAgICBpZiAoKnAgPT0gJy4nKQorICAgICAgICAgICAgKnAgPSBTRVA7CisgICAgfQorICAgIGxlbiArPSBzdHJsZW4obmFtZSk7CisgICAgYXNzZXJ0KGxlbiA8IElOVF9NQVgpOworICAgIHJldHVybiAoaW50KWxlbjsKIH0KIAogZW51bSB6aV9tb2R1bGVfaW5mbyB7Ci0JTUlfRVJST1IsCi0JTUlfTk9UX0ZPVU5ELAotCU1JX01PRFVMRSwKLQlNSV9QQUNLQUdFCisgICAgTUlfRVJST1IsCisgICAgTUlfTk9UX0ZPVU5ELAorICAgIE1JX01PRFVMRSwKKyAgICBNSV9QQUNLQUdFCiB9OwogCiAvKiBSZXR1cm4gc29tZSBpbmZvcm1hdGlvbiBhYm91dCBhIG1vZHVsZS4gKi8KIHN0YXRpYyBlbnVtIHppX21vZHVsZV9pbmZvCiBnZXRfbW9kdWxlX2luZm8oWmlwSW1wb3J0ZXIgKnNlbGYsIGNoYXIgKmZ1bGxuYW1lKQogewotCWNoYXIgKnN1Ym5hbWUsIHBhdGhbTUFYUEFUSExFTiArIDFdOwotCWludCBsZW47Ci0Jc3RydWN0IHN0X3ppcF9zZWFyY2hvcmRlciAqenNvOworICAgIGNoYXIgKnN1Ym5hbWUsIHBhdGhbTUFYUEFUSExFTiArIDFdOworICAgIGludCBsZW47CisgICAgc3RydWN0IHN0X3ppcF9zZWFyY2hvcmRlciAqenNvOwogCi0Jc3VibmFtZSA9IGdldF9zdWJuYW1lKGZ1bGxuYW1lKTsKKyAgICBzdWJuYW1lID0gZ2V0X3N1Ym5hbWUoZnVsbG5hbWUpOwogCi0JbGVuID0gbWFrZV9maWxlbmFtZShQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5wcmVmaXgpLCBzdWJuYW1lLCBwYXRoKTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIE1JX0VSUk9SOworICAgIGxlbiA9IG1ha2VfZmlsZW5hbWUoUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+cHJlZml4KSwgc3VibmFtZSwgcGF0aCk7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIHJldHVybiBNSV9FUlJPUjsKIAotCWZvciAoenNvID0gemlwX3NlYXJjaG9yZGVyOyAqenNvLT5zdWZmaXg7IHpzbysrKSB7Ci0JCXN0cmNweShwYXRoICsgbGVuLCB6c28tPnN1ZmZpeCk7Ci0JCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5maWxlcywgcGF0aCkgIT0gTlVMTCkgewotCQkJaWYgKHpzby0+dHlwZSAmIElTX1BBQ0tBR0UpCi0JCQkJcmV0dXJuIE1JX1BBQ0tBR0U7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE1JX01PRFVMRTsKLQkJfQotCX0KLQlyZXR1cm4gTUlfTk9UX0ZPVU5EOworICAgIGZvciAoenNvID0gemlwX3NlYXJjaG9yZGVyOyAqenNvLT5zdWZmaXg7IHpzbysrKSB7CisgICAgICAgIHN0cmNweShwYXRoICsgbGVuLCB6c28tPnN1ZmZpeCk7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5maWxlcywgcGF0aCkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHpzby0+dHlwZSAmIElTX1BBQ0tBR0UpCisgICAgICAgICAgICAgICAgcmV0dXJuIE1JX1BBQ0tBR0U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIE1JX01PRFVMRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTUlfTk9UX0ZPVU5EOwogfQogCiAvKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBzYXRpc2Z5IHRoZSBpbXBvcnQgb2YgdGhlIG1vZHVsZSBuYW1lZCBieQpAQCAtMjg0LDg5ICsyODQsODkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB6aXBpbXBvcnRlcl9maW5kX21vZHVsZShQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKLQlQeU9iamVjdCAqcGF0aCA9IE5VTEw7Ci0JY2hhciAqZnVsbG5hbWU7Ci0JZW51bSB6aV9tb2R1bGVfaW5mbyBtaTsKKyAgICBaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKKyAgICBQeU9iamVjdCAqcGF0aCA9IE5VTEw7CisgICAgY2hhciAqZnVsbG5hbWU7CisgICAgZW51bSB6aV9tb2R1bGVfaW5mbyBtaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xPOnppcGltcG9ydGVyLmZpbmRfbW9kdWxlIiwKLQkJCSAgICAgICZmdWxsbmFtZSwgJnBhdGgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8Tzp6aXBpbXBvcnRlci5maW5kX21vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsbmFtZSwgJnBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1pID0gZ2V0X21vZHVsZV9pbmZvKHNlbGYsIGZ1bGxuYW1lKTsKLQlpZiAobWkgPT0gTUlfRVJST1IpCi0JCXJldHVybiBOVUxMOwotCWlmIChtaSA9PSBNSV9OT1RfRk9VTkQpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIG1pID0gZ2V0X21vZHVsZV9pbmZvKHNlbGYsIGZ1bGxuYW1lKTsKKyAgICBpZiAobWkgPT0gTUlfRVJST1IpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtaSA9PSBNSV9OT1RfRk9VTkQpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiAvKiBMb2FkIGFuZCByZXR1cm4gdGhlIG1vZHVsZSBuYW1lZCBieSAnZnVsbG5hbWUnLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHppcGltcG9ydGVyX2xvYWRfbW9kdWxlKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCVppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOwotCVB5T2JqZWN0ICpjb2RlLCAqbW9kLCAqZGljdDsKLQljaGFyICpmdWxsbmFtZSwgKm1vZHBhdGg7Ci0JaW50IGlzcGFja2FnZTsKKyAgICBaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKKyAgICBQeU9iamVjdCAqY29kZSwgKm1vZCwgKmRpY3Q7CisgICAgY2hhciAqZnVsbG5hbWUsICptb2RwYXRoOworICAgIGludCBpc3BhY2thZ2U7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIubG9hZF9tb2R1bGUiLAotCQkJICAgICAgJmZ1bGxuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLmxvYWRfbW9kdWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljb2RlID0gZ2V0X21vZHVsZV9jb2RlKHNlbGYsIGZ1bGxuYW1lLCAmaXNwYWNrYWdlLCAmbW9kcGF0aCk7Ci0JaWYgKGNvZGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY29kZSA9IGdldF9tb2R1bGVfY29kZShzZWxmLCBmdWxsbmFtZSwgJmlzcGFja2FnZSwgJm1vZHBhdGgpOworICAgIGlmIChjb2RlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbW9kID0gUHlJbXBvcnRfQWRkTW9kdWxlKGZ1bGxuYW1lKTsKLQlpZiAobW9kID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGNvZGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKKyAgICBtb2QgPSBQeUltcG9ydF9BZGRNb2R1bGUoZnVsbG5hbWUpOworICAgIGlmIChtb2QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoY29kZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2QpOwogCi0JLyogbW9kLl9fbG9hZGVyX18gPSBzZWxmICovCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2xvYWRlcl9fIiwgKFB5T2JqZWN0ICopc2VsZikgIT0gMCkKLQkJZ290byBlcnJvcjsKKyAgICAvKiBtb2QuX19sb2FkZXJfXyA9IHNlbGYgKi8KKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fbG9hZGVyX18iLCAoUHlPYmplY3QgKilzZWxmKSAhPSAwKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JaWYgKGlzcGFja2FnZSkgewotCQkvKiBhZGQgX19wYXRoX18gdG8gdGhlIG1vZHVsZSAqYmVmb3JlKiB0aGUgY29kZSBnZXRzCi0JCSAgIGV4ZWN1dGVkICovCi0JCVB5T2JqZWN0ICpwa2dwYXRoLCAqZnVsbHBhdGg7Ci0JCWNoYXIgKnByZWZpeCA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCk7Ci0JCWNoYXIgKnN1Ym5hbWUgPSBnZXRfc3VibmFtZShmdWxsbmFtZSk7Ci0JCWludCBlcnI7CisgICAgaWYgKGlzcGFja2FnZSkgeworICAgICAgICAvKiBhZGQgX19wYXRoX18gdG8gdGhlIG1vZHVsZSAqYmVmb3JlKiB0aGUgY29kZSBnZXRzCisgICAgICAgICAgIGV4ZWN1dGVkICovCisgICAgICAgIFB5T2JqZWN0ICpwa2dwYXRoLCAqZnVsbHBhdGg7CisgICAgICAgIGNoYXIgKnByZWZpeCA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCk7CisgICAgICAgIGNoYXIgKnN1Ym5hbWUgPSBnZXRfc3VibmFtZShmdWxsbmFtZSk7CisgICAgICAgIGludCBlcnI7CiAKLQkJZnVsbHBhdGggPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCIlcyVjJXMlcyIsCi0JCQkJCVB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLAotCQkJCQlTRVAsCi0JCQkJCSpwcmVmaXggPyBwcmVmaXggOiAiIiwKLQkJCQkJc3VibmFtZSk7Ci0JCWlmIChmdWxscGF0aCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKKyAgICAgICAgZnVsbHBhdGggPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCIlcyVjJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcmVmaXggPyBwcmVmaXggOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibmFtZSk7CisgICAgICAgIGlmIChmdWxscGF0aCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKIAotCQlwa2dwYXRoID0gUHlfQnVpbGRWYWx1ZSgiW09dIiwgZnVsbHBhdGgpOwotCQlQeV9ERUNSRUYoZnVsbHBhdGgpOwotCQlpZiAocGtncGF0aCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fcGF0aF9fIiwgcGtncGF0aCk7Ci0JCVB5X0RFQ1JFRihwa2dwYXRoKTsKLQkJaWYgKGVyciAhPSAwKQotCQkJZ290byBlcnJvcjsKLQl9Ci0JbW9kID0gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChmdWxsbmFtZSwgY29kZSwgbW9kcGF0aCk7Ci0JUHlfREVDUkVGKGNvZGUpOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGxvYWRlZCBmcm9tIFppcCAlc1xuIiwKLQkJCQkgIGZ1bGxuYW1lLCBtb2RwYXRoKTsKLQlyZXR1cm4gbW9kOworICAgICAgICBwa2dwYXRoID0gUHlfQnVpbGRWYWx1ZSgiW09dIiwgZnVsbHBhdGgpOworICAgICAgICBQeV9ERUNSRUYoZnVsbHBhdGgpOworICAgICAgICBpZiAocGtncGF0aCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fcGF0aF9fIiwgcGtncGF0aCk7CisgICAgICAgIFB5X0RFQ1JFRihwa2dwYXRoKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgbW9kID0gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChmdWxsbmFtZSwgY29kZSwgbW9kcGF0aCk7CisgICAgUHlfREVDUkVGKGNvZGUpOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGxvYWRlZCBmcm9tIFppcCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWUsIG1vZHBhdGgpOworICAgIHJldHVybiBtb2Q7CiBlcnJvcjoKLQlQeV9ERUNSRUYoY29kZSk7Ci0JUHlfREVDUkVGKG1vZCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGNvZGUpOworICAgIFB5X0RFQ1JFRihtb2QpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBSZXR1cm4gYSBzdHJpbmcgbWF0Y2hpbmcgX19maWxlX18gZm9yIHRoZSBuYW1lZCBtb2R1bGUgKi8KQEAgLTM4MCwxMyArMzgwLDEzIEBACiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIuZ2V0X2ZpbGVuYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVsbG5hbWUpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIERlY2lkaW5nIHRoZSBmaWxlbmFtZSByZXF1aXJlcyB3b3JraW5nIG91dCB3aGVyZSB0aGUgY29kZQogICAgICAgIHdvdWxkIGNvbWUgZnJvbSBpZiB0aGUgbW9kdWxlIHdhcyBhY3R1YWxseSBsb2FkZWQgKi8KICAgICBjb2RlID0gZ2V0X21vZHVsZV9jb2RlKHNlbGYsIGZ1bGxuYW1lLCAmaXNwYWNrYWdlLCAmbW9kcGF0aCk7CiAgICAgaWYgKGNvZGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfREVDUkVGKGNvZGUpOyAvKiBPbmx5IG5lZWQgdGhlIHBhdGggaW5mbyAqLwogCiAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobW9kcGF0aCk7CkBAIC0zOTYsMTE4ICszOTYsMTE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogemlwaW1wb3J0ZXJfaXNfcGFja2FnZShQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKLQljaGFyICpmdWxsbmFtZTsKLQllbnVtIHppX21vZHVsZV9pbmZvIG1pOworICAgIFppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOworICAgIGNoYXIgKmZ1bGxuYW1lOworICAgIGVudW0gemlfbW9kdWxlX2luZm8gbWk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIuaXNfcGFja2FnZSIsCi0JCQkgICAgICAmZnVsbG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIuaXNfcGFja2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbWkgPSBnZXRfbW9kdWxlX2luZm8oc2VsZiwgZnVsbG5hbWUpOwotCWlmIChtaSA9PSBNSV9FUlJPUikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG1pID09IE1JX05PVF9GT1VORCkgewotCQlQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsICJjYW4ndCBmaW5kIG1vZHVsZSAnJS4yMDBzJyIsCi0JCQkgICAgIGZ1bGxuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcobWkgPT0gTUlfUEFDS0FHRSk7CisgICAgbWkgPSBnZXRfbW9kdWxlX2luZm8oc2VsZiwgZnVsbG5hbWUpOworICAgIGlmIChtaSA9PSBNSV9FUlJPUikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG1pID09IE1JX05PVF9GT1VORCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsICJjYW4ndCBmaW5kIG1vZHVsZSAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKG1pID09IE1JX1BBQ0tBR0UpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogemlwaW1wb3J0ZXJfZ2V0X2RhdGEoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7Ci0JY2hhciAqcGF0aDsKKyAgICBaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKKyAgICBjaGFyICpwYXRoOwogI2lmZGVmIEFMVFNFUAotCWNoYXIgKnAsIGJ1ZltNQVhQQVRITEVOICsgMV07CisgICAgY2hhciAqcCwgYnVmW01BWFBBVEhMRU4gKyAxXTsKICNlbmRpZgotCVB5T2JqZWN0ICp0b2NfZW50cnk7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlPYmplY3QgKnRvY19lbnRyeTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp6aXBpbXBvcnRlci5nZXRfZGF0YSIsICZwYXRoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLmdldF9kYXRhIiwgJnBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogI2lmZGVmIEFMVFNFUAotCWlmIChzdHJsZW4ocGF0aCkgPj0gTUFYUEFUSExFTikgewotCQlQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsICJwYXRoIHRvbyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzdHJjcHkoYnVmLCBwYXRoKTsKLQlmb3IgKHAgPSBidWY7ICpwOyBwKyspIHsKLQkJaWYgKCpwID09IEFMVFNFUCkKLQkJCSpwID0gU0VQOwotCX0KLQlwYXRoID0gYnVmOworICAgIGlmIChzdHJsZW4ocGF0aCkgPj0gTUFYUEFUSExFTikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsICJwYXRoIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJjcHkoYnVmLCBwYXRoKTsKKyAgICBmb3IgKHAgPSBidWY7ICpwOyBwKyspIHsKKyAgICAgICAgaWYgKCpwID09IEFMVFNFUCkKKyAgICAgICAgICAgICpwID0gU0VQOworICAgIH0KKyAgICBwYXRoID0gYnVmOwogI2VuZGlmCi0JbGVuID0gUHlTdHJpbmdfU2l6ZShzZWxmLT5hcmNoaXZlKTsKLQlpZiAoKHNpemVfdClsZW4gPCBzdHJsZW4ocGF0aCkgJiYKLQkgICAgc3RybmNtcChwYXRoLCBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5hcmNoaXZlKSwgbGVuKSA9PSAwICYmCi0JICAgIHBhdGhbbGVuXSA9PSBTRVApIHsKLQkJcGF0aCA9IHBhdGggKyBsZW4gKyAxOwotCX0KKyAgICBsZW4gPSBQeVN0cmluZ19TaXplKHNlbGYtPmFyY2hpdmUpOworICAgIGlmICgoc2l6ZV90KWxlbiA8IHN0cmxlbihwYXRoKSAmJgorICAgICAgICBzdHJuY21wKHBhdGgsIFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLCBsZW4pID09IDAgJiYKKyAgICAgICAgcGF0aFtsZW5dID09IFNFUCkgeworICAgICAgICBwYXRoID0gcGF0aCArIGxlbiArIDE7CisgICAgfQogCi0JdG9jX2VudHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpOwotCWlmICh0b2NfZW50cnkgPT0gTlVMTCkgewotCQlQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUoUHlFeGNfSU9FcnJvciwgcGF0aCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gZ2V0X2RhdGEoUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSksIHRvY19lbnRyeSk7CisgICAgdG9jX2VudHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpOworICAgIGlmICh0b2NfZW50cnkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUoUHlFeGNfSU9FcnJvciwgcGF0aCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZ2V0X2RhdGEoUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSksIHRvY19lbnRyeSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB6aXBpbXBvcnRlcl9nZXRfY29kZShQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKLQljaGFyICpmdWxsbmFtZTsKKyAgICBaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKKyAgICBjaGFyICpmdWxsbmFtZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp6aXBpbXBvcnRlci5nZXRfY29kZSIsICZmdWxsbmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp6aXBpbXBvcnRlci5nZXRfY29kZSIsICZmdWxsbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIGdldF9tb2R1bGVfY29kZShzZWxmLCBmdWxsbmFtZSwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIGdldF9tb2R1bGVfY29kZShzZWxmLCBmdWxsbmFtZSwgTlVMTCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB6aXBpbXBvcnRlcl9nZXRfc291cmNlKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCVppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOwotCVB5T2JqZWN0ICp0b2NfZW50cnk7Ci0JY2hhciAqZnVsbG5hbWUsICpzdWJuYW1lLCBwYXRoW01BWFBBVEhMRU4rMV07Ci0JaW50IGxlbjsKLQllbnVtIHppX21vZHVsZV9pbmZvIG1pOworICAgIFppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOworICAgIFB5T2JqZWN0ICp0b2NfZW50cnk7CisgICAgY2hhciAqZnVsbG5hbWUsICpzdWJuYW1lLCBwYXRoW01BWFBBVEhMRU4rMV07CisgICAgaW50IGxlbjsKKyAgICBlbnVtIHppX21vZHVsZV9pbmZvIG1pOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLmdldF9zb3VyY2UiLCAmZnVsbG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIuZ2V0X3NvdXJjZSIsICZmdWxsbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbWkgPSBnZXRfbW9kdWxlX2luZm8oc2VsZiwgZnVsbG5hbWUpOwotCWlmIChtaSA9PSBNSV9FUlJPUikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG1pID09IE1JX05PVF9GT1VORCkgewotCQlQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsICJjYW4ndCBmaW5kIG1vZHVsZSAnJS4yMDBzJyIsCi0JCQkgICAgIGZ1bGxuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN1Ym5hbWUgPSBnZXRfc3VibmFtZShmdWxsbmFtZSk7CisgICAgbWkgPSBnZXRfbW9kdWxlX2luZm8oc2VsZiwgZnVsbG5hbWUpOworICAgIGlmIChtaSA9PSBNSV9FUlJPUikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG1pID09IE1JX05PVF9GT1VORCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsICJjYW4ndCBmaW5kIG1vZHVsZSAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdWJuYW1lID0gZ2V0X3N1Ym5hbWUoZnVsbG5hbWUpOwogCi0JbGVuID0gbWFrZV9maWxlbmFtZShQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5wcmVmaXgpLCBzdWJuYW1lLCBwYXRoKTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbGVuID0gbWFrZV9maWxlbmFtZShQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5wcmVmaXgpLCBzdWJuYW1lLCBwYXRoKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobWkgPT0gTUlfUEFDS0FHRSkgewotCQlwYXRoW2xlbl0gPSBTRVA7Ci0JCXN0cmNweShwYXRoICsgbGVuICsgMSwgIl9faW5pdF9fLnB5Iik7Ci0JfQotCWVsc2UKLQkJc3RyY3B5KHBhdGggKyBsZW4sICIucHkiKTsKKyAgICBpZiAobWkgPT0gTUlfUEFDS0FHRSkgeworICAgICAgICBwYXRoW2xlbl0gPSBTRVA7CisgICAgICAgIHN0cmNweShwYXRoICsgbGVuICsgMSwgIl9faW5pdF9fLnB5Iik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3RyY3B5KHBhdGggKyBsZW4sICIucHkiKTsKIAotCXRvY19lbnRyeSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPmZpbGVzLCBwYXRoKTsKLQlpZiAodG9jX2VudHJ5ICE9IE5VTEwpCi0JCXJldHVybiBnZXRfZGF0YShQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5hcmNoaXZlKSwgdG9jX2VudHJ5KTsKKyAgICB0b2NfZW50cnkgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5maWxlcywgcGF0aCk7CisgICAgaWYgKHRvY19lbnRyeSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gZ2V0X2RhdGEoUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSksIHRvY19lbnRyeSk7CiAKLQkvKiB3ZSBoYXZlIHRoZSBtb2R1bGUsIGJ1dCBubyBzb3VyY2UgKi8KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgLyogd2UgaGF2ZSB0aGUgbW9kdWxlLCBidXQgbm8gc291cmNlICovCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2ZpbmRfbW9kdWxlLApAQCAtNTU4LDI4ICs1NTgsMjggQEAKIFJldHVybiB0aGUgZmlsZW5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgemlwaW1wb3J0ZXJfbWV0aG9kc1tdID0gewotCXsiZmluZF9tb2R1bGUiLCB6aXBpbXBvcnRlcl9maW5kX21vZHVsZSwgTUVUSF9WQVJBUkdTLAotCSBkb2NfZmluZF9tb2R1bGV9LAotCXsibG9hZF9tb2R1bGUiLCB6aXBpbXBvcnRlcl9sb2FkX21vZHVsZSwgTUVUSF9WQVJBUkdTLAotCSBkb2NfbG9hZF9tb2R1bGV9LAotCXsiZ2V0X2RhdGEiLCB6aXBpbXBvcnRlcl9nZXRfZGF0YSwgTUVUSF9WQVJBUkdTLAotCSBkb2NfZ2V0X2RhdGF9LAotCXsiZ2V0X2NvZGUiLCB6aXBpbXBvcnRlcl9nZXRfY29kZSwgTUVUSF9WQVJBUkdTLAotCSBkb2NfZ2V0X2NvZGV9LAotCXsiZ2V0X3NvdXJjZSIsIHppcGltcG9ydGVyX2dldF9zb3VyY2UsIE1FVEhfVkFSQVJHUywKLQkgZG9jX2dldF9zb3VyY2V9LAotCXsiZ2V0X2ZpbGVuYW1lIiwgemlwaW1wb3J0ZXJfZ2V0X2ZpbGVuYW1lLCBNRVRIX1ZBUkFSR1MsCi0JIGRvY19nZXRfZmlsZW5hbWV9LAotCXsiaXNfcGFja2FnZSIsIHppcGltcG9ydGVyX2lzX3BhY2thZ2UsIE1FVEhfVkFSQVJHUywKLQkgZG9jX2lzX3BhY2thZ2V9LAotCXtOVUxMLAkJTlVMTH0JLyogc2VudGluZWwgKi8KKyAgICB7ImZpbmRfbW9kdWxlIiwgemlwaW1wb3J0ZXJfZmluZF9tb2R1bGUsIE1FVEhfVkFSQVJHUywKKyAgICAgZG9jX2ZpbmRfbW9kdWxlfSwKKyAgICB7ImxvYWRfbW9kdWxlIiwgemlwaW1wb3J0ZXJfbG9hZF9tb2R1bGUsIE1FVEhfVkFSQVJHUywKKyAgICAgZG9jX2xvYWRfbW9kdWxlfSwKKyAgICB7ImdldF9kYXRhIiwgemlwaW1wb3J0ZXJfZ2V0X2RhdGEsIE1FVEhfVkFSQVJHUywKKyAgICAgZG9jX2dldF9kYXRhfSwKKyAgICB7ImdldF9jb2RlIiwgemlwaW1wb3J0ZXJfZ2V0X2NvZGUsIE1FVEhfVkFSQVJHUywKKyAgICAgZG9jX2dldF9jb2RlfSwKKyAgICB7ImdldF9zb3VyY2UiLCB6aXBpbXBvcnRlcl9nZXRfc291cmNlLCBNRVRIX1ZBUkFSR1MsCisgICAgIGRvY19nZXRfc291cmNlfSwKKyAgICB7ImdldF9maWxlbmFtZSIsIHppcGltcG9ydGVyX2dldF9maWxlbmFtZSwgTUVUSF9WQVJBUkdTLAorICAgICBkb2NfZ2V0X2ZpbGVuYW1lfSwKKyAgICB7ImlzX3BhY2thZ2UiLCB6aXBpbXBvcnRlcl9pc19wYWNrYWdlLCBNRVRIX1ZBUkFSR1MsCisgICAgIGRvY19pc19wYWNrYWdlfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU1lbWJlckRlZiB6aXBpbXBvcnRlcl9tZW1iZXJzW10gPSB7Ci0JeyJhcmNoaXZlIiwgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgYXJjaGl2ZSksICBSRUFET05MWX0sCi0JeyJwcmVmaXgiLCAgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgcHJlZml4KSwgICBSRUFET05MWX0sCi0JeyJfZmlsZXMiLCAgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgZmlsZXMpLCAgICBSRUFET05MWX0sCi0Je05VTEx9CisgICAgeyJhcmNoaXZlIiwgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgYXJjaGl2ZSksICBSRUFET05MWX0sCisgICAgeyJwcmVmaXgiLCAgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgcHJlZml4KSwgICBSRUFET05MWX0sCisgICAgeyJfZmlsZXMiLCAgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgZmlsZXMpLCAgICBSRUFET05MWX0sCisgICAge05VTEx9CiB9OwogCiBQeURvY19TVFJWQVIoemlwaW1wb3J0ZXJfZG9jLApAQCAtNTk5LDQ2ICs1OTksNDYgQEAKICNkZWZpbmUgREVGRVJSRURfQUREUkVTUyhBRERSKSAwCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgWmlwSW1wb3J0ZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoREVGRVJSRURfQUREUkVTUygmUHlUeXBlX1R5cGUpLCAwKQotCSJ6aXBpbXBvcnQuemlwaW1wb3J0ZXIiLAotCXNpemVvZihaaXBJbXBvcnRlciksCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3IpemlwaW1wb3J0ZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyl6aXBpbXBvcnRlcl9yZXByLAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwKLQkJUHlfVFBGTEFHU19IQVZFX0dDLAkJLyogdHBfZmxhZ3MgKi8KLQl6aXBpbXBvcnRlcl9kb2MsCQkJLyogdHBfZG9jICovCi0JemlwaW1wb3J0ZXJfdHJhdmVyc2UsCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXppcGltcG9ydGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCXppcGltcG9ydGVyX21lbWJlcnMsCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYyl6aXBpbXBvcnRlcl9pbml0LAkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkJLyogdHBfYWxsb2MgKi8KLQlQeVR5cGVfR2VuZXJpY05ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCisgICAgInppcGltcG9ydC56aXBpbXBvcnRlciIsCisgICAgc2l6ZW9mKFppcEltcG9ydGVyKSwKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgKGRlc3RydWN0b3IpemlwaW1wb3J0ZXJfZGVhbGxvYywgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyl6aXBpbXBvcnRlcl9yZXByLCAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfAorICAgICAgICBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICB6aXBpbXBvcnRlcl9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIHppcGltcG9ydGVyX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgemlwaW1wb3J0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgemlwaW1wb3J0ZXJfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKXppcGltcG9ydGVyX2luaXQsICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKQEAgLTY0OSwxNiArNjQ5LDE2IEBACiAgICBtYXJzaGFsLmM6cl9sb25nKCkgKi8KIHN0YXRpYyBsb25nCiBnZXRfbG9uZyh1bnNpZ25lZCBjaGFyICpidWYpIHsKLQlsb25nIHg7Ci0JeCA9ICBidWZbMF07Ci0JeCB8PSAobG9uZylidWZbMV0gPDwgIDg7Ci0JeCB8PSAobG9uZylidWZbMl0gPDwgMTY7Ci0JeCB8PSAobG9uZylidWZbM10gPDwgMjQ7CisgICAgbG9uZyB4OworICAgIHggPSAgYnVmWzBdOworICAgIHggfD0gKGxvbmcpYnVmWzFdIDw8ICA4OworICAgIHggfD0gKGxvbmcpYnVmWzJdIDw8IDE2OworICAgIHggfD0gKGxvbmcpYnVmWzNdIDw8IDI0OwogI2lmIFNJWkVPRl9MT05HID4gNAotCS8qIFNpZ24gZXh0ZW5zaW9uIGZvciA2NC1iaXQgbWFjaGluZXMgKi8KLQl4IHw9IC0oeCAmIDB4ODAwMDAwMDBMKTsKKyAgICAvKiBTaWduIGV4dGVuc2lvbiBmb3IgNjQtYml0IG1hY2hpbmVzICovCisgICAgeCB8PSAtKHggJiAweDgwMDAwMDAwTCk7CiAjZW5kaWYKLQlyZXR1cm4geDsKKyAgICByZXR1cm4geDsKIH0KIAogLyoKQEAgLTY3MCwxMyArNjcwLDEzIEBACiAgICBBIHRvY19lbnRyeSBpcyBhIHR1cGxlOgogCiAgICAgICAgKF9fZmlsZV9fLCAgICAgICMgdmFsdWUgdG8gdXNlIGZvciBfX2ZpbGVfXywgYXZhaWxhYmxlIGZvciBhbGwgZmlsZXMKLSAgICAgICAgY29tcHJlc3MsICAgICAgIyBjb21wcmVzc2lvbiBraW5kOyAwIGZvciB1bmNvbXByZXNzZWQKLSAgICAgICAgZGF0YV9zaXplLCAgICAgIyBzaXplIG9mIGNvbXByZXNzZWQgZGF0YSBvbiBkaXNrCi0gICAgICAgIGZpbGVfc2l6ZSwgICAgICMgc2l6ZSBvZiBkZWNvbXByZXNzZWQgZGF0YQotICAgICAgICBmaWxlX29mZnNldCwgICAjIG9mZnNldCBvZiBmaWxlIGhlYWRlciBmcm9tIHN0YXJ0IG9mIGFyY2hpdmUKLSAgICAgICAgdGltZSwgICAgICAgICAgIyBtb2QgdGltZSBvZiBmaWxlIChpbiBkb3MgZm9ybWF0KQotICAgICAgICBkYXRlLCAgICAgICAgICAjIG1vZCBkYXRhIG9mIGZpbGUgKGluIGRvcyBmb3JtYXQpCi0gICAgICAgIGNyYywgICAgICAgICAgICMgY3JjIGNoZWNrc3VtIG9mIHRoZSBkYXRhCisgICAgY29tcHJlc3MsICAgICAgIyBjb21wcmVzc2lvbiBraW5kOyAwIGZvciB1bmNvbXByZXNzZWQKKyAgICBkYXRhX3NpemUsICAgICAjIHNpemUgb2YgY29tcHJlc3NlZCBkYXRhIG9uIGRpc2sKKyAgICBmaWxlX3NpemUsICAgICAjIHNpemUgb2YgZGVjb21wcmVzc2VkIGRhdGEKKyAgICBmaWxlX29mZnNldCwgICAjIG9mZnNldCBvZiBmaWxlIGhlYWRlciBmcm9tIHN0YXJ0IG9mIGFyY2hpdmUKKyAgICB0aW1lLCAgICAgICAgICAjIG1vZCB0aW1lIG9mIGZpbGUgKGluIGRvcyBmb3JtYXQpCisgICAgZGF0ZSwgICAgICAgICAgIyBtb2QgZGF0YSBvZiBmaWxlIChpbiBkb3MgZm9ybWF0KQorICAgIGNyYywgICAgICAgICAgICMgY3JjIGNoZWNrc3VtIG9mIHRoZSBkYXRhCiAgICAgICAgKQogCiAgICBEaXJlY3RvcmllcyBjYW4gYmUgcmVjb2duaXplZCBieSB0aGUgdHJhaWxpbmcgU0VQIGluIHRoZSBuYW1lLApAQCAtNjg1LDExNSArNjg1LDExNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJlYWRfZGlyZWN0b3J5KGNoYXIgKmFyY2hpdmUpCiB7Ci0JUHlPYmplY3QgKmZpbGVzID0gTlVMTDsKLQlGSUxFICpmcDsKLQlsb25nIGNvbXByZXNzLCBjcmMsIGRhdGFfc2l6ZSwgZmlsZV9zaXplLCBmaWxlX29mZnNldCwgZGF0ZSwgdGltZTsKLQlsb25nIGhlYWRlcl9vZmZzZXQsIG5hbWVfc2l6ZSwgaGVhZGVyX3NpemUsIGhlYWRlcl9wb3NpdGlvbjsKLQlsb25nIGksIGwsIGNvdW50OwotCXNpemVfdCBsZW5ndGg7Ci0JY2hhciBwYXRoW01BWFBBVEhMRU4gKyA1XTsKLQljaGFyIG5hbWVbTUFYUEFUSExFTiArIDVdOwotCWNoYXIgKnAsIGVuZG9mX2NlbnRyYWxfZGlyWzIyXTsKLQlsb25nIGFyY19vZmZzZXQ7IC8qIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBmaWxlIHRvIHN0YXJ0IG9mIHppcC1hcmNoaXZlICovCisgICAgUHlPYmplY3QgKmZpbGVzID0gTlVMTDsKKyAgICBGSUxFICpmcDsKKyAgICBsb25nIGNvbXByZXNzLCBjcmMsIGRhdGFfc2l6ZSwgZmlsZV9zaXplLCBmaWxlX29mZnNldCwgZGF0ZSwgdGltZTsKKyAgICBsb25nIGhlYWRlcl9vZmZzZXQsIG5hbWVfc2l6ZSwgaGVhZGVyX3NpemUsIGhlYWRlcl9wb3NpdGlvbjsKKyAgICBsb25nIGksIGwsIGNvdW50OworICAgIHNpemVfdCBsZW5ndGg7CisgICAgY2hhciBwYXRoW01BWFBBVEhMRU4gKyA1XTsKKyAgICBjaGFyIG5hbWVbTUFYUEFUSExFTiArIDVdOworICAgIGNoYXIgKnAsIGVuZG9mX2NlbnRyYWxfZGlyWzIyXTsKKyAgICBsb25nIGFyY19vZmZzZXQ7IC8qIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBmaWxlIHRvIHN0YXJ0IG9mIHppcC1hcmNoaXZlICovCiAKLQlpZiAoc3RybGVuKGFyY2hpdmUpID4gTUFYUEFUSExFTikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkiWmlwIHBhdGggbmFtZSBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RyY3B5KHBhdGgsIGFyY2hpdmUpOworICAgIGlmIChzdHJsZW4oYXJjaGl2ZSkgPiBNQVhQQVRITEVOKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlppcCBwYXRoIG5hbWUgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cmNweShwYXRoLCBhcmNoaXZlKTsKIAotCWZwID0gZm9wZW4oYXJjaGl2ZSwgInJiIik7Ci0JaWYgKGZwID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3Qgb3BlbiBaaXAgZmlsZTogIgotCQkJICAgICAiJyUuMjAwcyciLCBhcmNoaXZlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZzZWVrKGZwLCAtMjIsIFNFRUtfRU5EKTsKLQloZWFkZXJfcG9zaXRpb24gPSBmdGVsbChmcCk7Ci0JaWYgKGZyZWFkKGVuZG9mX2NlbnRyYWxfZGlyLCAxLCAyMiwgZnApICE9IDIyKSB7Ci0JCWZjbG9zZShmcCk7Ci0JCVB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgImNhbid0IHJlYWQgWmlwIGZpbGU6ICIKLQkJCSAgICAgIiclLjIwMHMnIiwgYXJjaGl2ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZ2V0X2xvbmcoKHVuc2lnbmVkIGNoYXIgKillbmRvZl9jZW50cmFsX2RpcikgIT0gMHgwNjA1NEI1MCkgewotCQkvKiBCYWQ6IEVuZCBvZiBDZW50cmFsIERpciBzaWduYXR1cmUgKi8KLQkJZmNsb3NlKGZwKTsKLQkJUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAibm90IGEgWmlwIGZpbGU6ICIKLQkJCSAgICAgIiclLjIwMHMnIiwgYXJjaGl2ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBmcCA9IGZvcGVuKGFyY2hpdmUsICJyYiIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgImNhbid0IG9wZW4gWmlwIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICInJS4yMDBzJyIsIGFyY2hpdmUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnNlZWsoZnAsIC0yMiwgU0VFS19FTkQpOworICAgIGhlYWRlcl9wb3NpdGlvbiA9IGZ0ZWxsKGZwKTsKKyAgICBpZiAoZnJlYWQoZW5kb2ZfY2VudHJhbF9kaXIsIDEsIDIyLCBmcCkgIT0gMjIpIHsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgcmVhZCBaaXAgZmlsZTogIgorICAgICAgICAgICAgICAgICAgICAgIiclLjIwMHMnIiwgYXJjaGl2ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZ2V0X2xvbmcoKHVuc2lnbmVkIGNoYXIgKillbmRvZl9jZW50cmFsX2RpcikgIT0gMHgwNjA1NEI1MCkgeworICAgICAgICAvKiBCYWQ6IEVuZCBvZiBDZW50cmFsIERpciBzaWduYXR1cmUgKi8KKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAibm90IGEgWmlwIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICInJS4yMDBzJyIsIGFyY2hpdmUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQloZWFkZXJfc2l6ZSA9IGdldF9sb25nKCh1bnNpZ25lZCBjaGFyICopZW5kb2ZfY2VudHJhbF9kaXIgKyAxMik7Ci0JaGVhZGVyX29mZnNldCA9IGdldF9sb25nKCh1bnNpZ25lZCBjaGFyICopZW5kb2ZfY2VudHJhbF9kaXIgKyAxNik7Ci0JYXJjX29mZnNldCA9IGhlYWRlcl9wb3NpdGlvbiAtIGhlYWRlcl9vZmZzZXQgLSBoZWFkZXJfc2l6ZTsKLQloZWFkZXJfb2Zmc2V0ICs9IGFyY19vZmZzZXQ7CisgICAgaGVhZGVyX3NpemUgPSBnZXRfbG9uZygodW5zaWduZWQgY2hhciAqKWVuZG9mX2NlbnRyYWxfZGlyICsgMTIpOworICAgIGhlYWRlcl9vZmZzZXQgPSBnZXRfbG9uZygodW5zaWduZWQgY2hhciAqKWVuZG9mX2NlbnRyYWxfZGlyICsgMTYpOworICAgIGFyY19vZmZzZXQgPSBoZWFkZXJfcG9zaXRpb24gLSBoZWFkZXJfb2Zmc2V0IC0gaGVhZGVyX3NpemU7CisgICAgaGVhZGVyX29mZnNldCArPSBhcmNfb2Zmc2V0OwogCi0JZmlsZXMgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKGZpbGVzID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7CisgICAgZmlsZXMgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKGZpbGVzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlsZW5ndGggPSAobG9uZylzdHJsZW4ocGF0aCk7Ci0JcGF0aFtsZW5ndGhdID0gU0VQOworICAgIGxlbmd0aCA9IChsb25nKXN0cmxlbihwYXRoKTsKKyAgICBwYXRoW2xlbmd0aF0gPSBTRVA7CiAKLQkvKiBTdGFydCBvZiBDZW50cmFsIERpcmVjdG9yeSAqLwotCWNvdW50ID0gMDsKLQlmb3IgKDs7KSB7Ci0JCVB5T2JqZWN0ICp0OwotCQlpbnQgZXJyOworICAgIC8qIFN0YXJ0IG9mIENlbnRyYWwgRGlyZWN0b3J5ICovCisgICAgY291bnQgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlPYmplY3QgKnQ7CisgICAgICAgIGludCBlcnI7CiAKLQkJZnNlZWsoZnAsIGhlYWRlcl9vZmZzZXQsIDApOyAgLyogU3RhcnQgb2YgZmlsZSBoZWFkZXIgKi8KLQkJbCA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQkJaWYgKGwgIT0gMHgwMjAxNEI1MCkKLQkJCWJyZWFrOwkvKiBCYWQ6IENlbnRyYWwgRGlyIEZpbGUgSGVhZGVyICovCi0JCWZzZWVrKGZwLCBoZWFkZXJfb2Zmc2V0ICsgMTAsIDApOwotCQljb21wcmVzcyA9IFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7Ci0JCXRpbWUgPSBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOwotCQlkYXRlID0gUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsKLQkJY3JjID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOwotCQlkYXRhX3NpemUgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7Ci0JCWZpbGVfc2l6ZSA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQkJbmFtZV9zaXplID0gUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsKLQkJaGVhZGVyX3NpemUgPSA0NiArIG5hbWVfc2l6ZSArCi0JCSAgIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCkgKwotCQkgICBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOwotCQlmc2VlayhmcCwgaGVhZGVyX29mZnNldCArIDQyLCAwKTsKLQkJZmlsZV9vZmZzZXQgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCkgKyBhcmNfb2Zmc2V0OwotCQlpZiAobmFtZV9zaXplID4gTUFYUEFUSExFTikKLQkJCW5hbWVfc2l6ZSA9IE1BWFBBVEhMRU47CisgICAgICAgIGZzZWVrKGZwLCBoZWFkZXJfb2Zmc2V0LCAwKTsgIC8qIFN0YXJ0IG9mIGZpbGUgaGVhZGVyICovCisgICAgICAgIGwgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7CisgICAgICAgIGlmIChsICE9IDB4MDIwMTRCNTApCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgIC8qIEJhZDogQ2VudHJhbCBEaXIgRmlsZSBIZWFkZXIgKi8KKyAgICAgICAgZnNlZWsoZnAsIGhlYWRlcl9vZmZzZXQgKyAxMCwgMCk7CisgICAgICAgIGNvbXByZXNzID0gUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsKKyAgICAgICAgdGltZSA9IFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7CisgICAgICAgIGRhdGUgPSBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOworICAgICAgICBjcmMgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7CisgICAgICAgIGRhdGFfc2l6ZSA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKKyAgICAgICAgZmlsZV9zaXplID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOworICAgICAgICBuYW1lX3NpemUgPSBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOworICAgICAgICBoZWFkZXJfc2l6ZSA9IDQ2ICsgbmFtZV9zaXplICsKKyAgICAgICAgICAgUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKSArCisgICAgICAgICAgIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7CisgICAgICAgIGZzZWVrKGZwLCBoZWFkZXJfb2Zmc2V0ICsgNDIsIDApOworICAgICAgICBmaWxlX29mZnNldCA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKSArIGFyY19vZmZzZXQ7CisgICAgICAgIGlmIChuYW1lX3NpemUgPiBNQVhQQVRITEVOKQorICAgICAgICAgICAgbmFtZV9zaXplID0gTUFYUEFUSExFTjsKIAotCQlwID0gbmFtZTsKLQkJZm9yIChpID0gMDsgaSA8IG5hbWVfc2l6ZTsgaSsrKSB7Ci0JCQkqcCA9IChjaGFyKWdldGMoZnApOwotCQkJaWYgKCpwID09ICcvJykKLQkJCQkqcCA9IFNFUDsKLQkJCXArKzsKLQkJfQotCQkqcCA9IDA7CS8qIEFkZCB0ZXJtaW5hdGluZyBudWxsIGJ5dGUgKi8KLQkJaGVhZGVyX29mZnNldCArPSBoZWFkZXJfc2l6ZTsKKyAgICAgICAgcCA9IG5hbWU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lX3NpemU7IGkrKykgeworICAgICAgICAgICAgKnAgPSAoY2hhcilnZXRjKGZwKTsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnLycpCisgICAgICAgICAgICAgICAgKnAgPSBTRVA7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgKnAgPSAwOyAgICAgICAgIC8qIEFkZCB0ZXJtaW5hdGluZyBudWxsIGJ5dGUgKi8KKyAgICAgICAgaGVhZGVyX29mZnNldCArPSBoZWFkZXJfc2l6ZTsKIAotCQlzdHJuY3B5KHBhdGggKyBsZW5ndGggKyAxLCBuYW1lLCBNQVhQQVRITEVOIC0gbGVuZ3RoIC0gMSk7CisgICAgICAgIHN0cm5jcHkocGF0aCArIGxlbmd0aCArIDEsIG5hbWUsIE1BWFBBVEhMRU4gLSBsZW5ndGggLSAxKTsKIAotCQl0ID0gUHlfQnVpbGRWYWx1ZSgic2lpaWlpaWkiLCBwYXRoLCBjb21wcmVzcywgZGF0YV9zaXplLAotCQkJCSAgZmlsZV9zaXplLCBmaWxlX29mZnNldCwgdGltZSwgZGF0ZSwgY3JjKTsKLQkJaWYgKHQgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGZpbGVzLCBuYW1lLCB0KTsKLQkJUHlfREVDUkVGKHQpOwotCQlpZiAoZXJyICE9IDApCi0JCQlnb3RvIGVycm9yOwotCQljb3VudCsrOwotCX0KLQlmY2xvc2UoZnApOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgemlwaW1wb3J0OiBmb3VuZCAlbGQgbmFtZXMgaW4gJXNcbiIsCi0JCQljb3VudCwgYXJjaGl2ZSk7Ci0JcmV0dXJuIGZpbGVzOworICAgICAgICB0ID0gUHlfQnVpbGRWYWx1ZSgic2lpaWlpaWkiLCBwYXRoLCBjb21wcmVzcywgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemUsIGZpbGVfb2Zmc2V0LCB0aW1lLCBkYXRlLCBjcmMpOworICAgICAgICBpZiAodCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZmlsZXMsIG5hbWUsIHQpOworICAgICAgICBQeV9ERUNSRUYodCk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGNvdW50Kys7CisgICAgfQorICAgIGZjbG9zZShmcCk7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyB6aXBpbXBvcnQ6IGZvdW5kICVsZCBuYW1lcyBpbiAlc1xuIiwKKyAgICAgICAgICAgIGNvdW50LCBhcmNoaXZlKTsKKyAgICByZXR1cm4gZmlsZXM7CiBlcnJvcjoKLQlmY2xvc2UoZnApOwotCVB5X1hERUNSRUYoZmlsZXMpOwotCXJldHVybiBOVUxMOworICAgIGZjbG9zZShmcCk7CisgICAgUHlfWERFQ1JFRihmaWxlcyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFJldHVybiB0aGUgemxpYi5kZWNvbXByZXNzIGZ1bmN0aW9uIG9iamVjdCwgb3IgTlVMTCBpZiB6bGliIGNvdWxkbid0CkBAIC04MDMsMzEgKzgwMywzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9kZWNvbXByZXNzX2Z1bmModm9pZCkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmRlY29tcHJlc3MgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVjb21wcmVzcyA9IE5VTEw7CiAKLQlpZiAoZGVjb21wcmVzcyA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp6bGliOwotCQlzdGF0aWMgaW50IGltcG9ydGluZ196bGliID0gMDsKKyAgICBpZiAoZGVjb21wcmVzcyA9PSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICp6bGliOworICAgICAgICBzdGF0aWMgaW50IGltcG9ydGluZ196bGliID0gMDsKIAotCQlpZiAoaW1wb3J0aW5nX3psaWIgIT0gMCkKLQkJCS8qIFNvbWVvbmUgaGFzIGEgemxpYi5weVtjb10gaW4gdGhlaXIgWmlwIGZpbGU7Ci0JCQkgICBsZXQncyBhdm9pZCBhIHN0YWNrIG92ZXJmbG93LiAqLwotCQkJcmV0dXJuIE5VTEw7Ci0JCWltcG9ydGluZ196bGliID0gMTsKLQkJemxpYiA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInpsaWIiKTsKLQkJaW1wb3J0aW5nX3psaWIgPSAwOwotCQlpZiAoemxpYiAhPSBOVUxMKSB7Ci0JCQlkZWNvbXByZXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh6bGliLAotCQkJCQkJCSAgICAiZGVjb21wcmVzcyIpOwotCQkJUHlfREVDUkVGKHpsaWIpOwotCQl9Ci0JCWVsc2UKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIHppcGltcG9ydDogemxpYiAlc1xuIiwKLQkJCQl6bGliICE9IE5VTEwgPyAiYXZhaWxhYmxlIjogIlVOQVZBSUxBQkxFIik7Ci0JfQotCXJldHVybiBkZWNvbXByZXNzOworICAgICAgICBpZiAoaW1wb3J0aW5nX3psaWIgIT0gMCkKKyAgICAgICAgICAgIC8qIFNvbWVvbmUgaGFzIGEgemxpYi5weVtjb10gaW4gdGhlaXIgWmlwIGZpbGU7CisgICAgICAgICAgICAgICBsZXQncyBhdm9pZCBhIHN0YWNrIG92ZXJmbG93LiAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGltcG9ydGluZ196bGliID0gMTsKKyAgICAgICAgemxpYiA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInpsaWIiKTsKKyAgICAgICAgaW1wb3J0aW5nX3psaWIgPSAwOworICAgICAgICBpZiAoemxpYiAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWNvbXByZXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh6bGliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlY29tcHJlc3MiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih6bGliKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyB6aXBpbXBvcnQ6IHpsaWIgJXNcbiIsCisgICAgICAgICAgICAgICAgemxpYiAhPSBOVUxMID8gImF2YWlsYWJsZSI6ICJVTkFWQUlMQUJMRSIpOworICAgIH0KKyAgICByZXR1cm4gZGVjb21wcmVzczsKIH0KIAogLyogR2l2ZW4gYSBwYXRoIHRvIGEgWmlwIGZpbGUgYW5kIGEgdG9jX2VudHJ5LCByZXR1cm4gdGhlICh1bmNvbXByZXNzZWQpCkBAIC04MzUsODUgKzgzNSw4NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9kYXRhKGNoYXIgKmFyY2hpdmUsIFB5T2JqZWN0ICp0b2NfZW50cnkpCiB7Ci0JUHlPYmplY3QgKnJhd19kYXRhLCAqZGF0YSA9IE5VTEwsICpkZWNvbXByZXNzOwotCWNoYXIgKmJ1ZjsKLQlGSUxFICpmcDsKLQlpbnQgZXJyOwotCVB5X3NzaXplX3QgYnl0ZXNfcmVhZCA9IDA7Ci0JbG9uZyBsOwotCWNoYXIgKmRhdGFwYXRoOwotCWxvbmcgY29tcHJlc3MsIGRhdGFfc2l6ZSwgZmlsZV9zaXplLCBmaWxlX29mZnNldDsKLQlsb25nIHRpbWUsIGRhdGUsIGNyYzsKKyAgICBQeU9iamVjdCAqcmF3X2RhdGEsICpkYXRhID0gTlVMTCwgKmRlY29tcHJlc3M7CisgICAgY2hhciAqYnVmOworICAgIEZJTEUgKmZwOworICAgIGludCBlcnI7CisgICAgUHlfc3NpemVfdCBieXRlc19yZWFkID0gMDsKKyAgICBsb25nIGw7CisgICAgY2hhciAqZGF0YXBhdGg7CisgICAgbG9uZyBjb21wcmVzcywgZGF0YV9zaXplLCBmaWxlX3NpemUsIGZpbGVfb2Zmc2V0OworICAgIGxvbmcgdGltZSwgZGF0ZSwgY3JjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHRvY19lbnRyeSwgInNsbGxsbGxsIiwgJmRhdGFwYXRoLCAmY29tcHJlc3MsCi0JCQkgICAgICAmZGF0YV9zaXplLCAmZmlsZV9zaXplLCAmZmlsZV9vZmZzZXQsICZ0aW1lLAotCQkJICAgICAgJmRhdGUsICZjcmMpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUodG9jX2VudHJ5LCAic2xsbGxsbGwiLCAmZGF0YXBhdGgsICZjb21wcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFfc2l6ZSwgJmZpbGVfc2l6ZSwgJmZpbGVfb2Zmc2V0LCAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGUsICZjcmMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZwID0gZm9wZW4oYXJjaGl2ZSwgInJiIik7Ci0JaWYgKCFmcCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSU9FcnJvciwKLQkJICAgInppcGltcG9ydDogY2FuIG5vdCBvcGVuIGZpbGUgJXMiLCBhcmNoaXZlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGZwID0gZm9wZW4oYXJjaGl2ZSwgInJiIik7CisgICAgaWYgKCFmcCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSU9FcnJvciwKKyAgICAgICAgICAgInppcGltcG9ydDogY2FuIG5vdCBvcGVuIGZpbGUgJXMiLCBhcmNoaXZlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBsb2NhbCBmaWxlIGhlYWRlciBpcyBjb3JyZWN0ICovCi0JZnNlZWsoZnAsIGZpbGVfb2Zmc2V0LCAwKTsKLQlsID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOwotCWlmIChsICE9IDB4MDQwMzRCNTApIHsKLQkJLyogQmFkOiBMb2NhbCBGaWxlIEhlYWRlciAqLwotCQlQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsCi0JCQkgICAgICJiYWQgbG9jYWwgZmlsZSBoZWFkZXIgaW4gJXMiLAotCQkJICAgICBhcmNoaXZlKTsKLQkJZmNsb3NlKGZwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZzZWVrKGZwLCBmaWxlX29mZnNldCArIDI2LCAwKTsKLQlsID0gMzAgKyBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApICsKLQkgICAgUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsJLyogbG9jYWwgaGVhZGVyIHNpemUgKi8KLQlmaWxlX29mZnNldCArPSBsOwkvKiBTdGFydCBvZiBmaWxlIGRhdGEgKi8KKyAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGxvY2FsIGZpbGUgaGVhZGVyIGlzIGNvcnJlY3QgKi8KKyAgICBmc2VlayhmcCwgZmlsZV9vZmZzZXQsIDApOworICAgIGwgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7CisgICAgaWYgKGwgIT0gMHgwNDAzNEI1MCkgeworICAgICAgICAvKiBCYWQ6IExvY2FsIEZpbGUgSGVhZGVyICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJiYWQgbG9jYWwgZmlsZSBoZWFkZXIgaW4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZSk7CisgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmc2VlayhmcCwgZmlsZV9vZmZzZXQgKyAyNiwgMCk7CisgICAgbCA9IDMwICsgUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKSArCisgICAgICAgIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7ICAgICAgICAvKiBsb2NhbCBoZWFkZXIgc2l6ZSAqLworICAgIGZpbGVfb2Zmc2V0ICs9IGw7ICAgICAgICAgICAvKiBTdGFydCBvZiBmaWxlIGRhdGEgKi8KIAotCXJhd19kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBjb21wcmVzcyA9PSAwID8KLQkJCQkJICAgICAgZGF0YV9zaXplIDogZGF0YV9zaXplICsgMSk7Ci0JaWYgKHJhd19kYXRhID09IE5VTEwpIHsKLQkJZmNsb3NlKGZwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHJhd19kYXRhKTsKKyAgICByYXdfZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgY29tcHJlc3MgPT0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUgOiBkYXRhX3NpemUgKyAxKTsKKyAgICBpZiAocmF3X2RhdGEgPT0gTlVMTCkgeworICAgICAgICBmY2xvc2UoZnApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcocmF3X2RhdGEpOwogCi0JZXJyID0gZnNlZWsoZnAsIGZpbGVfb2Zmc2V0LCAwKTsKLQlpZiAoZXJyID09IDApCi0JCWJ5dGVzX3JlYWQgPSBmcmVhZChidWYsIDEsIGRhdGFfc2l6ZSwgZnApOwotCWZjbG9zZShmcCk7Ci0JaWYgKGVyciB8fCBieXRlc19yZWFkICE9IGRhdGFfc2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKLQkJCQkiemlwaW1wb3J0OiBjYW4ndCByZWFkIGRhdGEiKTsKLQkJUHlfREVDUkVGKHJhd19kYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVyciA9IGZzZWVrKGZwLCBmaWxlX29mZnNldCwgMCk7CisgICAgaWYgKGVyciA9PSAwKQorICAgICAgICBieXRlc19yZWFkID0gZnJlYWQoYnVmLCAxLCBkYXRhX3NpemUsIGZwKTsKKyAgICBmY2xvc2UoZnApOworICAgIGlmIChlcnIgfHwgYnl0ZXNfcmVhZCAhPSBkYXRhX3NpemUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiemlwaW1wb3J0OiBjYW4ndCByZWFkIGRhdGEiKTsKKyAgICAgICAgUHlfREVDUkVGKHJhd19kYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGNvbXByZXNzICE9IDApIHsKLQkJYnVmW2RhdGFfc2l6ZV0gPSAnWic7ICAvKiBzYXcgdGhpcyBpbiB6aXBmaWxlLnB5ICovCi0JCWRhdGFfc2l6ZSsrOwotCX0KLQlidWZbZGF0YV9zaXplXSA9ICdcMCc7CisgICAgaWYgKGNvbXByZXNzICE9IDApIHsKKyAgICAgICAgYnVmW2RhdGFfc2l6ZV0gPSAnWic7ICAvKiBzYXcgdGhpcyBpbiB6aXBmaWxlLnB5ICovCisgICAgICAgIGRhdGFfc2l6ZSsrOworICAgIH0KKyAgICBidWZbZGF0YV9zaXplXSA9ICdcMCc7CiAKLQlpZiAoY29tcHJlc3MgPT0gMCkgIC8qIGRhdGEgaXMgbm90IGNvbXByZXNzZWQgKi8KLQkJcmV0dXJuIHJhd19kYXRhOworICAgIGlmIChjb21wcmVzcyA9PSAwKSAgLyogZGF0YSBpcyBub3QgY29tcHJlc3NlZCAqLworICAgICAgICByZXR1cm4gcmF3X2RhdGE7CiAKLQkvKiBEZWNvbXByZXNzIHdpdGggemxpYiAqLwotCWRlY29tcHJlc3MgPSBnZXRfZGVjb21wcmVzc19mdW5jKCk7Ci0JaWYgKGRlY29tcHJlc3MgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsCi0JCQkJImNhbid0IGRlY29tcHJlc3MgZGF0YTsgIgotCQkJCSJ6bGliIG5vdCBhdmFpbGFibGUiKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JZGF0YSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihkZWNvbXByZXNzLCAiT2kiLCByYXdfZGF0YSwgLTE1KTsKKyAgICAvKiBEZWNvbXByZXNzIHdpdGggemxpYiAqLworICAgIGRlY29tcHJlc3MgPSBnZXRfZGVjb21wcmVzc19mdW5jKCk7CisgICAgaWYgKGRlY29tcHJlc3MgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVjb21wcmVzcyBkYXRhOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiemxpYiBub3QgYXZhaWxhYmxlIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGRhdGEgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZGVjb21wcmVzcywgIk9pIiwgcmF3X2RhdGEsIC0xNSk7CiBlcnJvcjoKLQlQeV9ERUNSRUYocmF3X2RhdGEpOwotCXJldHVybiBkYXRhOworICAgIFB5X0RFQ1JFRihyYXdfZGF0YSk7CisgICAgcmV0dXJuIGRhdGE7CiB9CiAKIC8qIExlbmllbnQgZGF0ZS90aW1lIGNvbXBhcmlzb24gZnVuY3Rpb24uIFRoZSBwcmVjaXNpb24gb2YgdGhlIG10aW1lCkBAIC05MjIsMTEgKzkyMiwxMSBAQAogc3RhdGljIGludAogZXFfbXRpbWUodGltZV90IHQxLCB0aW1lX3QgdDIpCiB7Ci0JdGltZV90IGQgPSB0MSAtIHQyOwotCWlmIChkIDwgMCkKLQkJZCA9IC1kOwotCS8qIGRvc3RpbWUgb25seSBzdG9yZXMgZXZlbiBzZWNvbmRzLCBzbyBiZSBsZW5pZW50ICovCi0JcmV0dXJuIGQgPD0gMTsKKyAgICB0aW1lX3QgZCA9IHQxIC0gdDI7CisgICAgaWYgKGQgPCAwKQorICAgICAgICBkID0gLWQ7CisgICAgLyogZG9zdGltZSBvbmx5IHN0b3JlcyBldmVuIHNlY29uZHMsIHNvIGJlIGxlbmllbnQgKi8KKyAgICByZXR1cm4gZCA8PSAxOwogfQogCiAvKiBHaXZlbiB0aGUgY29udGVudHMgb2YgYSAucHlbY29dIGZpbGUgaW4gYSBidWZmZXIsIHVubWFyc2hhbCB0aGUgZGF0YQpAQCAtOTM3LDQ0ICs5MzcsNDQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bm1hcnNoYWxfY29kZShjaGFyICpwYXRobmFtZSwgUHlPYmplY3QgKmRhdGEsIHRpbWVfdCBtdGltZSkKIHsKLQlQeU9iamVjdCAqY29kZTsKLQljaGFyICpidWYgPSBQeVN0cmluZ19Bc1N0cmluZyhkYXRhKTsKLQlQeV9zc2l6ZV90IHNpemUgPSBQeVN0cmluZ19TaXplKGRhdGEpOworICAgIFB5T2JqZWN0ICpjb2RlOworICAgIGNoYXIgKmJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKGRhdGEpOworICAgIFB5X3NzaXplX3Qgc2l6ZSA9IFB5U3RyaW5nX1NpemUoZGF0YSk7CiAKLQlpZiAoc2l6ZSA8PSA5KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwKLQkJCQkiYmFkIHB5YyBkYXRhIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2l6ZSA8PSA5KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgcHljIGRhdGEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGdldF9sb25nKCh1bnNpZ25lZCBjaGFyICopYnVmKSAhPSBQeUltcG9ydF9HZXRNYWdpY051bWJlcigpKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIGhhcyBiYWQgbWFnaWNcbiIsCi0JCQkJCSAgcGF0aG5hbWUpOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOyAgLyogc2lnbmFsIGNhbGxlciB0byB0cnkgYWx0ZXJuYXRpdmUgKi8KLQl9CisgICAgaWYgKGdldF9sb25nKCh1bnNpZ25lZCBjaGFyICopYnVmKSAhPSBQeUltcG9ydF9HZXRNYWdpY051bWJlcigpKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIGhhcyBiYWQgbWFnaWNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSk7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7ICAvKiBzaWduYWwgY2FsbGVyIHRvIHRyeSBhbHRlcm5hdGl2ZSAqLworICAgIH0KIAotCWlmIChtdGltZSAhPSAwICYmICFlcV9tdGltZShnZXRfbG9uZygodW5zaWduZWQgY2hhciAqKWJ1ZiArIDQpLAotCQkJCSAgICBtdGltZSkpIHsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgJXMgaGFzIGJhZCBtdGltZVxuIiwKLQkJCQkJICBwYXRobmFtZSk7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7ICAvKiBzaWduYWwgY2FsbGVyIHRvIHRyeSBhbHRlcm5hdGl2ZSAqLwotCX0KKyAgICBpZiAobXRpbWUgIT0gMCAmJiAhZXFfbXRpbWUoZ2V0X2xvbmcoKHVuc2lnbmVkIGNoYXIgKilidWYgKyA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRpbWUpKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIGhhcyBiYWQgbXRpbWVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSk7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7ICAvKiBzaWduYWwgY2FsbGVyIHRvIHRyeSBhbHRlcm5hdGl2ZSAqLworICAgIH0KIAotCWNvZGUgPSBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcoYnVmICsgOCwgc2l6ZSAtIDgpOwotCWlmIChjb2RlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlDb2RlX0NoZWNrKGNvZGUpKSB7Ci0JCVB5X0RFQ1JFRihjb2RlKTsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiY29tcGlsZWQgbW9kdWxlICUuMjAwcyBpcyBub3QgYSBjb2RlIG9iamVjdCIsCi0JCSAgICAgcGF0aG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGNvZGU7CisgICAgY29kZSA9IFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZyhidWYgKyA4LCBzaXplIC0gOCk7CisgICAgaWYgKGNvZGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUNvZGVfQ2hlY2soY29kZSkpIHsKKyAgICAgICAgUHlfREVDUkVGKGNvZGUpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICJjb21waWxlZCBtb2R1bGUgJS4yMDBzIGlzIG5vdCBhIGNvZGUgb2JqZWN0IiwKKyAgICAgICAgICAgICBwYXRobmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gY29kZTsKIH0KIAogLyogUmVwbGFjZSBhbnkgb2NjdXJhbmNlcyBvZiAiXHJcbj8iIGluIHRoZSBpbnB1dCBzdHJpbmcgd2l0aCAiXG4iLgpAQCAtOTg0LDM1ICs5ODQsMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBub3JtYWxpemVfbGluZV9lbmRpbmdzKFB5T2JqZWN0ICpzb3VyY2UpCiB7Ci0JY2hhciAqYnVmLCAqcSwgKnAgPSBQeVN0cmluZ19Bc1N0cmluZyhzb3VyY2UpOwotCVB5T2JqZWN0ICpmaXhlZF9zb3VyY2U7CisgICAgY2hhciAqYnVmLCAqcSwgKnAgPSBQeVN0cmluZ19Bc1N0cmluZyhzb3VyY2UpOworICAgIFB5T2JqZWN0ICpmaXhlZF9zb3VyY2U7CiAKLQlpZiAoIXApCi0JCXJldHVybiBOVUxMOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBvbmUgY2hhciBleHRyYSBmb3IgdHJhaWxpbmcgXG4gYW5kIG9uZSBmb3IgdGVybWluYXRpbmcgXDAgKi8KLQlidWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhQeVN0cmluZ19TaXplKHNvdXJjZSkgKyAyKTsKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJCSJ6aXBpbXBvcnQ6IG5vIG1lbW9yeSB0byBhbGxvY2F0ZSAiCi0JCQkJInNvdXJjZSBidWZmZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIHJlcGxhY2UgIlxyXG4/IiBieSAiXG4iICovCi0JZm9yIChxID0gYnVmOyAqcCAhPSAnXDAnOyBwKyspIHsKLQkJaWYgKCpwID09ICdccicpIHsKLQkJCSpxKysgPSAnXG4nOwotCQkJaWYgKCoocCArIDEpID09ICdcbicpCi0JCQkJcCsrOwotCQl9Ci0JCWVsc2UKLQkJCSpxKysgPSAqcDsKLQl9Ci0JKnErKyA9ICdcbic7ICAvKiBhZGQgdHJhaWxpbmcgXG4gKi8KLQkqcSA9ICdcMCc7Ci0JZml4ZWRfc291cmNlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotCVB5TWVtX0ZyZWUoYnVmKTsKLQlyZXR1cm4gZml4ZWRfc291cmNlOworICAgIC8qIG9uZSBjaGFyIGV4dHJhIGZvciB0cmFpbGluZyBcbiBhbmQgb25lIGZvciB0ZXJtaW5hdGluZyBcMCAqLworICAgIGJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKFB5U3RyaW5nX1NpemUoc291cmNlKSArIDIpOworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiemlwaW1wb3J0OiBubyBtZW1vcnkgdG8gYWxsb2NhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIHJlcGxhY2UgIlxyXG4/IiBieSAiXG4iICovCisgICAgZm9yIChxID0gYnVmOyAqcCAhPSAnXDAnOyBwKyspIHsKKyAgICAgICAgaWYgKCpwID09ICdccicpIHsKKyAgICAgICAgICAgICpxKysgPSAnXG4nOworICAgICAgICAgICAgaWYgKCoocCArIDEpID09ICdcbicpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpxKysgPSAqcDsKKyAgICB9CisgICAgKnErKyA9ICdcbic7ICAvKiBhZGQgdHJhaWxpbmcgXG4gKi8KKyAgICAqcSA9ICdcMCc7CisgICAgZml4ZWRfc291cmNlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICByZXR1cm4gZml4ZWRfc291cmNlOwogfQogCiAvKiBHaXZlbiBhIHN0cmluZyBidWZmZXIgY29udGFpbmluZyBQeXRob24gc291cmNlIGNvZGUsIGNvbXBpbGUgaXQKQEAgLTEwMjAsMTYgKzEwMjAsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21waWxlX3NvdXJjZShjaGFyICpwYXRobmFtZSwgUHlPYmplY3QgKnNvdXJjZSkKIHsKLQlQeU9iamVjdCAqY29kZSwgKmZpeGVkX3NvdXJjZTsKKyAgICBQeU9iamVjdCAqY29kZSwgKmZpeGVkX3NvdXJjZTsKIAotCWZpeGVkX3NvdXJjZSA9IG5vcm1hbGl6ZV9saW5lX2VuZGluZ3Moc291cmNlKTsKLQlpZiAoZml4ZWRfc291cmNlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGZpeGVkX3NvdXJjZSA9IG5vcm1hbGl6ZV9saW5lX2VuZGluZ3Moc291cmNlKTsKKyAgICBpZiAoZml4ZWRfc291cmNlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY29kZSA9IFB5X0NvbXBpbGVTdHJpbmcoUHlTdHJpbmdfQXNTdHJpbmcoZml4ZWRfc291cmNlKSwgcGF0aG5hbWUsCi0JCQkJUHlfZmlsZV9pbnB1dCk7Ci0JUHlfREVDUkVGKGZpeGVkX3NvdXJjZSk7Ci0JcmV0dXJuIGNvZGU7CisgICAgY29kZSA9IFB5X0NvbXBpbGVTdHJpbmcoUHlTdHJpbmdfQXNTdHJpbmcoZml4ZWRfc291cmNlKSwgcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfZmlsZV9pbnB1dCk7CisgICAgUHlfREVDUkVGKGZpeGVkX3NvdXJjZSk7CisgICAgcmV0dXJuIGNvZGU7CiB9CiAKIC8qIENvbnZlcnQgdGhlIGRhdGUvdGltZSB2YWx1ZXMgZm91bmQgaW4gdGhlIFppcCBhcmNoaXZlIHRvIGEgdmFsdWUKQEAgLTEwMzcsMTkgKzEwMzcsMTkgQEAKIHN0YXRpYyB0aW1lX3QKIHBhcnNlX2Rvc3RpbWUoaW50IGRvc3RpbWUsIGludCBkb3NkYXRlKQogewotCXN0cnVjdCB0bSBzdG07CisgICAgc3RydWN0IHRtIHN0bTsKIAotCW1lbXNldCgodm9pZCAqKSAmc3RtLCAnXDAnLCBzaXplb2Yoc3RtKSk7CisgICAgbWVtc2V0KCh2b2lkICopICZzdG0sICdcMCcsIHNpemVvZihzdG0pKTsKIAotCXN0bS50bV9zZWMgICA9ICAoZG9zdGltZSAgICAgICAgJiAweDFmKSAqIDI7Ci0Jc3RtLnRtX21pbiAgID0gIChkb3N0aW1lID4+IDUpICAmIDB4M2Y7Ci0Jc3RtLnRtX2hvdXIgID0gIChkb3N0aW1lID4+IDExKSAmIDB4MWY7Ci0Jc3RtLnRtX21kYXkgID0gICBkb3NkYXRlICAgICAgICAmIDB4MWY7Ci0Jc3RtLnRtX21vbiAgID0gKChkb3NkYXRlID4+IDUpICAmIDB4MGYpIC0gMTsKLQlzdG0udG1feWVhciAgPSAoKGRvc2RhdGUgPj4gOSkgICYgMHg3ZikgKyA4MDsKLQlzdG0udG1faXNkc3QgPSAgIC0xOyAvKiB3ZGF5L3lkYXkgaXMgaWdub3JlZCAqLworICAgIHN0bS50bV9zZWMgICA9ICAoZG9zdGltZSAgICAgICAgJiAweDFmKSAqIDI7CisgICAgc3RtLnRtX21pbiAgID0gIChkb3N0aW1lID4+IDUpICAmIDB4M2Y7CisgICAgc3RtLnRtX2hvdXIgID0gIChkb3N0aW1lID4+IDExKSAmIDB4MWY7CisgICAgc3RtLnRtX21kYXkgID0gICBkb3NkYXRlICAgICAgICAmIDB4MWY7CisgICAgc3RtLnRtX21vbiAgID0gKChkb3NkYXRlID4+IDUpICAmIDB4MGYpIC0gMTsKKyAgICBzdG0udG1feWVhciAgPSAoKGRvc2RhdGUgPj4gOSkgICYgMHg3ZikgKyA4MDsKKyAgICBzdG0udG1faXNkc3QgPSAgIC0xOyAvKiB3ZGF5L3lkYXkgaXMgaWdub3JlZCAqLwogCi0JcmV0dXJuIG1rdGltZSgmc3RtKTsKKyAgICByZXR1cm4gbWt0aW1lKCZzdG0pOwogfQogCiAvKiBHaXZlbiBhIHBhdGggdG8gYSAucHljIG9yIC5weW8gZmlsZSBpbiB0aGUgYXJjaGl2ZSwgcmV0dXJuIHRoZQpAQCAtMTA1OCwxMDYgKzEwNTgsMTA2IEBACiBzdGF0aWMgdGltZV90CiBnZXRfbXRpbWVfb2Zfc291cmNlKFppcEltcG9ydGVyICpzZWxmLCBjaGFyICpwYXRoKQogewotCVB5T2JqZWN0ICp0b2NfZW50cnk7Ci0JdGltZV90IG10aW1lID0gMDsKLQlQeV9zc2l6ZV90IGxhc3RjaGFyID0gc3RybGVuKHBhdGgpIC0gMTsKLQljaGFyIHNhdmVjaGFyID0gcGF0aFtsYXN0Y2hhcl07Ci0JcGF0aFtsYXN0Y2hhcl0gPSAnXDAnOyAgLyogc3RyaXAgJ2MnIG9yICdvJyBmcm9tICoucHlbY29dICovCi0JdG9jX2VudHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpOwotCWlmICh0b2NfZW50cnkgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKHRvY19lbnRyeSkgJiYKLQkgICAgUHlUdXBsZV9TaXplKHRvY19lbnRyeSkgPT0gOCkgewotCQkvKiBmZXRjaCB0aGUgdGltZSBzdGFtcCBvZiB0aGUgLnB5IGZpbGUgZm9yIGNvbXBhcmlzb24KLQkJICAgd2l0aCBhbiBlbWJlZGRlZCBweWMgdGltZSBzdGFtcCAqLwotCQlpbnQgdGltZSwgZGF0ZTsKLQkJdGltZSA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dldEl0ZW0odG9jX2VudHJ5LCA1KSk7Ci0JCWRhdGUgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HZXRJdGVtKHRvY19lbnRyeSwgNikpOwotCQltdGltZSA9IHBhcnNlX2Rvc3RpbWUodGltZSwgZGF0ZSk7Ci0JfQotCXBhdGhbbGFzdGNoYXJdID0gc2F2ZWNoYXI7Ci0JcmV0dXJuIG10aW1lOworICAgIFB5T2JqZWN0ICp0b2NfZW50cnk7CisgICAgdGltZV90IG10aW1lID0gMDsKKyAgICBQeV9zc2l6ZV90IGxhc3RjaGFyID0gc3RybGVuKHBhdGgpIC0gMTsKKyAgICBjaGFyIHNhdmVjaGFyID0gcGF0aFtsYXN0Y2hhcl07CisgICAgcGF0aFtsYXN0Y2hhcl0gPSAnXDAnOyAgLyogc3RyaXAgJ2MnIG9yICdvJyBmcm9tICoucHlbY29dICovCisgICAgdG9jX2VudHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpOworICAgIGlmICh0b2NfZW50cnkgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKHRvY19lbnRyeSkgJiYKKyAgICAgICAgUHlUdXBsZV9TaXplKHRvY19lbnRyeSkgPT0gOCkgeworICAgICAgICAvKiBmZXRjaCB0aGUgdGltZSBzdGFtcCBvZiB0aGUgLnB5IGZpbGUgZm9yIGNvbXBhcmlzb24KKyAgICAgICAgICAgd2l0aCBhbiBlbWJlZGRlZCBweWMgdGltZSBzdGFtcCAqLworICAgICAgICBpbnQgdGltZSwgZGF0ZTsKKyAgICAgICAgdGltZSA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dldEl0ZW0odG9jX2VudHJ5LCA1KSk7CisgICAgICAgIGRhdGUgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HZXRJdGVtKHRvY19lbnRyeSwgNikpOworICAgICAgICBtdGltZSA9IHBhcnNlX2Rvc3RpbWUodGltZSwgZGF0ZSk7CisgICAgfQorICAgIHBhdGhbbGFzdGNoYXJdID0gc2F2ZWNoYXI7CisgICAgcmV0dXJuIG10aW1lOwogfQogCiAvKiBSZXR1cm4gdGhlIGNvZGUgb2JqZWN0IGZvciB0aGUgbW9kdWxlIG5hbWVkIGJ5ICdmdWxsbmFtZScgZnJvbSB0aGUKICAgIFppcCBhcmNoaXZlIGFzIGEgbmV3IHJlZmVyZW5jZS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY29kZV9mcm9tX2RhdGEoWmlwSW1wb3J0ZXIgKnNlbGYsIGludCBpc3BhY2thZ2UsIGludCBpc2J5dGVjb2RlLAotCQkgICB0aW1lX3QgbXRpbWUsIFB5T2JqZWN0ICp0b2NfZW50cnkpCisgICAgICAgICAgICAgICAgICAgdGltZV90IG10aW1lLCBQeU9iamVjdCAqdG9jX2VudHJ5KQogewotCVB5T2JqZWN0ICpkYXRhLCAqY29kZTsKLQljaGFyICptb2RwYXRoOwotCWNoYXIgKmFyY2hpdmUgPSBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5hcmNoaXZlKTsKKyAgICBQeU9iamVjdCAqZGF0YSwgKmNvZGU7CisgICAgY2hhciAqbW9kcGF0aDsKKyAgICBjaGFyICphcmNoaXZlID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSk7CiAKLQlpZiAoYXJjaGl2ZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYXJjaGl2ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWRhdGEgPSBnZXRfZGF0YShhcmNoaXZlLCB0b2NfZW50cnkpOwotCWlmIChkYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGRhdGEgPSBnZXRfZGF0YShhcmNoaXZlLCB0b2NfZW50cnkpOworICAgIGlmIChkYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbW9kcGF0aCA9IFB5U3RyaW5nX0FzU3RyaW5nKFB5VHVwbGVfR2V0SXRlbSh0b2NfZW50cnksIDApKTsKKyAgICBtb2RwYXRoID0gUHlTdHJpbmdfQXNTdHJpbmcoUHlUdXBsZV9HZXRJdGVtKHRvY19lbnRyeSwgMCkpOwogCi0JaWYgKGlzYnl0ZWNvZGUpIHsKLQkJY29kZSA9IHVubWFyc2hhbF9jb2RlKG1vZHBhdGgsIGRhdGEsIG10aW1lKTsKLQl9Ci0JZWxzZSB7Ci0JCWNvZGUgPSBjb21waWxlX3NvdXJjZShtb2RwYXRoLCBkYXRhKTsKLQl9Ci0JUHlfREVDUkVGKGRhdGEpOwotCXJldHVybiBjb2RlOworICAgIGlmIChpc2J5dGVjb2RlKSB7CisgICAgICAgIGNvZGUgPSB1bm1hcnNoYWxfY29kZShtb2RwYXRoLCBkYXRhLCBtdGltZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjb2RlID0gY29tcGlsZV9zb3VyY2UobW9kcGF0aCwgZGF0YSk7CisgICAgfQorICAgIFB5X0RFQ1JFRihkYXRhKTsKKyAgICByZXR1cm4gY29kZTsKIH0KIAogLyogR2V0IHRoZSBjb2RlIG9iamVjdCBhc3NvaWNpYXRlZCB3aXRoIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGJ5CiAgICAnZnVsbG5hbWUnLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9tb2R1bGVfY29kZShaaXBJbXBvcnRlciAqc2VsZiwgY2hhciAqZnVsbG5hbWUsCi0JCWludCAqcF9pc3BhY2thZ2UsIGNoYXIgKipwX21vZHBhdGgpCisgICAgICAgICAgICAgICAgaW50ICpwX2lzcGFja2FnZSwgY2hhciAqKnBfbW9kcGF0aCkKIHsKLQlQeU9iamVjdCAqdG9jX2VudHJ5OwotCWNoYXIgKnN1Ym5hbWUsIHBhdGhbTUFYUEFUSExFTiArIDFdOwotCWludCBsZW47Ci0Jc3RydWN0IHN0X3ppcF9zZWFyY2hvcmRlciAqenNvOworICAgIFB5T2JqZWN0ICp0b2NfZW50cnk7CisgICAgY2hhciAqc3VibmFtZSwgcGF0aFtNQVhQQVRITEVOICsgMV07CisgICAgaW50IGxlbjsKKyAgICBzdHJ1Y3Qgc3RfemlwX3NlYXJjaG9yZGVyICp6c287CiAKLQlzdWJuYW1lID0gZ2V0X3N1Ym5hbWUoZnVsbG5hbWUpOworICAgIHN1Ym5hbWUgPSBnZXRfc3VibmFtZShmdWxsbmFtZSk7CiAKLQlsZW4gPSBtYWtlX2ZpbGVuYW1lKFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCksIHN1Ym5hbWUsIHBhdGgpOwotCWlmIChsZW4gPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBsZW4gPSBtYWtlX2ZpbGVuYW1lKFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCksIHN1Ym5hbWUsIHBhdGgpOworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoenNvID0gemlwX3NlYXJjaG9yZGVyOyAqenNvLT5zdWZmaXg7IHpzbysrKSB7Ci0JCVB5T2JqZWN0ICpjb2RlID0gTlVMTDsKKyAgICBmb3IgKHpzbyA9IHppcF9zZWFyY2hvcmRlcjsgKnpzby0+c3VmZml4OyB6c28rKykgeworICAgICAgICBQeU9iamVjdCAqY29kZSA9IE5VTEw7CiAKLQkJc3RyY3B5KHBhdGggKyBsZW4sIHpzby0+c3VmZml4KTsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIHRyeWluZyAlcyVjJXNcbiIsCi0JCQkJCSAgUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSksCi0JCQkJCSAgU0VQLCBwYXRoKTsKLQkJdG9jX2VudHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpOwotCQlpZiAodG9jX2VudHJ5ICE9IE5VTEwpIHsKLQkJCXRpbWVfdCBtdGltZSA9IDA7Ci0JCQlpbnQgaXNwYWNrYWdlID0genNvLT50eXBlICYgSVNfUEFDS0FHRTsKLQkJCWludCBpc2J5dGVjb2RlID0genNvLT50eXBlICYgSVNfQllURUNPREU7CisgICAgICAgIHN0cmNweShwYXRoICsgbGVuLCB6c28tPnN1ZmZpeCk7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZyA+IDEpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyB0cnlpbmcgJXMlYyVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVAsIHBhdGgpOworICAgICAgICB0b2NfZW50cnkgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5maWxlcywgcGF0aCk7CisgICAgICAgIGlmICh0b2NfZW50cnkgIT0gTlVMTCkgeworICAgICAgICAgICAgdGltZV90IG10aW1lID0gMDsKKyAgICAgICAgICAgIGludCBpc3BhY2thZ2UgPSB6c28tPnR5cGUgJiBJU19QQUNLQUdFOworICAgICAgICAgICAgaW50IGlzYnl0ZWNvZGUgPSB6c28tPnR5cGUgJiBJU19CWVRFQ09ERTsKIAotCQkJaWYgKGlzYnl0ZWNvZGUpCi0JCQkJbXRpbWUgPSBnZXRfbXRpbWVfb2Zfc291cmNlKHNlbGYsIHBhdGgpOwotCQkJaWYgKHBfaXNwYWNrYWdlICE9IE5VTEwpCi0JCQkJKnBfaXNwYWNrYWdlID0gaXNwYWNrYWdlOwotCQkJY29kZSA9IGdldF9jb2RlX2Zyb21fZGF0YShzZWxmLCBpc3BhY2thZ2UsCi0JCQkJCQkgIGlzYnl0ZWNvZGUsIG10aW1lLAotCQkJCQkJICB0b2NfZW50cnkpOwotCQkJaWYgKGNvZGUgPT0gUHlfTm9uZSkgewotCQkJCS8qIGJhZCBtYWdpYyBudW1iZXIgb3Igbm9uLW1hdGNoaW5nIG10aW1lCi0JCQkJICAgaW4gYnl0ZSBjb2RlLCB0cnkgbmV4dCAqLwotCQkJCVB5X0RFQ1JFRihjb2RlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjb2RlICE9IE5VTEwgJiYgcF9tb2RwYXRoICE9IE5VTEwpCi0JCQkJKnBfbW9kcGF0aCA9IFB5U3RyaW5nX0FzU3RyaW5nKAotCQkJCQlQeVR1cGxlX0dldEl0ZW0odG9jX2VudHJ5LCAwKSk7Ci0JCQlyZXR1cm4gY29kZTsKLQkJfQotCX0KLQlQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsICJjYW4ndCBmaW5kIG1vZHVsZSAnJS4yMDBzJyIsIGZ1bGxuYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmIChpc2J5dGVjb2RlKQorICAgICAgICAgICAgICAgIG10aW1lID0gZ2V0X210aW1lX29mX3NvdXJjZShzZWxmLCBwYXRoKTsKKyAgICAgICAgICAgIGlmIChwX2lzcGFja2FnZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICpwX2lzcGFja2FnZSA9IGlzcGFja2FnZTsKKyAgICAgICAgICAgIGNvZGUgPSBnZXRfY29kZV9mcm9tX2RhdGEoc2VsZiwgaXNwYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2J5dGVjb2RlLCBtdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9jX2VudHJ5KTsKKyAgICAgICAgICAgIGlmIChjb2RlID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICAvKiBiYWQgbWFnaWMgbnVtYmVyIG9yIG5vbi1tYXRjaGluZyBtdGltZQorICAgICAgICAgICAgICAgICAgIGluIGJ5dGUgY29kZSwgdHJ5IG5leHQgKi8KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY29kZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29kZSAhPSBOVUxMICYmIHBfbW9kcGF0aCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICpwX21vZHBhdGggPSBQeVN0cmluZ19Bc1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HZXRJdGVtKHRvY19lbnRyeSwgMCkpOworICAgICAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgZmluZCBtb2R1bGUgJyUuMjAwcyciLCBmdWxsbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtMTE4MCw1MSArMTE4MCw1MSBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXR6aXBpbXBvcnQodm9pZCkKIHsKLQlQeU9iamVjdCAqbW9kOworICAgIFB5T2JqZWN0ICptb2Q7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZaaXBJbXBvcnRlcl9UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZaaXBJbXBvcnRlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIENvcnJlY3QgZGlyZWN0b3J5IHNlcGFyYXRvciAqLwotCXppcF9zZWFyY2hvcmRlclswXS5zdWZmaXhbMF0gPSBTRVA7Ci0JemlwX3NlYXJjaG9yZGVyWzFdLnN1ZmZpeFswXSA9IFNFUDsKLQl6aXBfc2VhcmNob3JkZXJbMl0uc3VmZml4WzBdID0gU0VQOwotCWlmIChQeV9PcHRpbWl6ZUZsYWcpIHsKLQkJLyogUmV2ZXJzZSAqLnB5YyBhbmQgKi5weW8gKi8KLQkJc3RydWN0IHN0X3ppcF9zZWFyY2hvcmRlciB0bXA7Ci0JCXRtcCA9IHppcF9zZWFyY2hvcmRlclswXTsKLQkJemlwX3NlYXJjaG9yZGVyWzBdID0gemlwX3NlYXJjaG9yZGVyWzFdOwotCQl6aXBfc2VhcmNob3JkZXJbMV0gPSB0bXA7Ci0JCXRtcCA9IHppcF9zZWFyY2hvcmRlclszXTsKLQkJemlwX3NlYXJjaG9yZGVyWzNdID0gemlwX3NlYXJjaG9yZGVyWzRdOwotCQl6aXBfc2VhcmNob3JkZXJbNF0gPSB0bXA7Ci0JfQorICAgIC8qIENvcnJlY3QgZGlyZWN0b3J5IHNlcGFyYXRvciAqLworICAgIHppcF9zZWFyY2hvcmRlclswXS5zdWZmaXhbMF0gPSBTRVA7CisgICAgemlwX3NlYXJjaG9yZGVyWzFdLnN1ZmZpeFswXSA9IFNFUDsKKyAgICB6aXBfc2VhcmNob3JkZXJbMl0uc3VmZml4WzBdID0gU0VQOworICAgIGlmIChQeV9PcHRpbWl6ZUZsYWcpIHsKKyAgICAgICAgLyogUmV2ZXJzZSAqLnB5YyBhbmQgKi5weW8gKi8KKyAgICAgICAgc3RydWN0IHN0X3ppcF9zZWFyY2hvcmRlciB0bXA7CisgICAgICAgIHRtcCA9IHppcF9zZWFyY2hvcmRlclswXTsKKyAgICAgICAgemlwX3NlYXJjaG9yZGVyWzBdID0gemlwX3NlYXJjaG9yZGVyWzFdOworICAgICAgICB6aXBfc2VhcmNob3JkZXJbMV0gPSB0bXA7CisgICAgICAgIHRtcCA9IHppcF9zZWFyY2hvcmRlclszXTsKKyAgICAgICAgemlwX3NlYXJjaG9yZGVyWzNdID0gemlwX3NlYXJjaG9yZGVyWzRdOworICAgICAgICB6aXBfc2VhcmNob3JkZXJbNF0gPSB0bXA7CisgICAgfQogCi0JbW9kID0gUHlfSW5pdE1vZHVsZTQoInppcGltcG9ydCIsIE5VTEwsIHppcGltcG9ydF9kb2MsCi0JCQkgICAgIE5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG1vZCA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbW9kID0gUHlfSW5pdE1vZHVsZTQoInppcGltcG9ydCIsIE5VTEwsIHppcGltcG9ydF9kb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAobW9kID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVppcEltcG9ydEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJ6aXBpbXBvcnQuWmlwSW1wb3J0RXJyb3IiLAotCQkJCQkgICAgUHlFeGNfSW1wb3J0RXJyb3IsIE5VTEwpOwotCWlmIChaaXBJbXBvcnRFcnJvciA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgWmlwSW1wb3J0RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInppcGltcG9ydC5aaXBJbXBvcnRFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfSW1wb3J0RXJyb3IsIE5VTEwpOworICAgIGlmIChaaXBJbXBvcnRFcnJvciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlQeV9JTkNSRUYoWmlwSW1wb3J0RXJyb3IpOwotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kLCAiWmlwSW1wb3J0RXJyb3IiLAotCQkJICAgICAgIFppcEltcG9ydEVycm9yKSA8IDApCi0JCXJldHVybjsKKyAgICBQeV9JTkNSRUYoWmlwSW1wb3J0RXJyb3IpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kLCAiWmlwSW1wb3J0RXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWmlwSW1wb3J0RXJyb3IpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfSU5DUkVGKCZaaXBJbXBvcnRlcl9UeXBlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZCwgInppcGltcG9ydGVyIiwKLQkJCSAgICAgICAoUHlPYmplY3QgKikmWmlwSW1wb3J0ZXJfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgUHlfSU5DUkVGKCZaaXBJbXBvcnRlcl9UeXBlKTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZCwgInppcGltcG9ydGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSZaaXBJbXBvcnRlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCXppcF9kaXJlY3RvcnlfY2FjaGUgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKHppcF9kaXJlY3RvcnlfY2FjaGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRih6aXBfZGlyZWN0b3J5X2NhY2hlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZCwgIl96aXBfZGlyZWN0b3J5X2NhY2hlIiwKLQkJCSAgICAgICB6aXBfZGlyZWN0b3J5X2NhY2hlKSA8IDApCi0JCXJldHVybjsKKyAgICB6aXBfZGlyZWN0b3J5X2NhY2hlID0gUHlEaWN0X05ldygpOworICAgIGlmICh6aXBfZGlyZWN0b3J5X2NhY2hlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoemlwX2RpcmVjdG9yeV9jYWNoZSk7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2QsICJfemlwX2RpcmVjdG9yeV9jYWNoZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBfZGlyZWN0b3J5X2NhY2hlKSA8IDApCisgICAgICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYm1vZHVsZS5jIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKaW5kZXggMGNiMWU2NC4uYmI1MmZkYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGlibW9kdWxlLmMKKysrIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKQEAgLTI4LDEyICsyOCwxMiBAQAogc3RhdGljIFB5VGhyZWFkX3R5cGVfbG9jayB6bGliX2xvY2sgPSBOVUxMOyAvKiBpbml0aWFsaXplZCBvbiBtb2R1bGUgbG9hZCAqLwogCiAjZGVmaW5lIEVOVEVSX1pMSUIgXAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgXAotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayh6bGliX2xvY2ssIDEpOyBcCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyBcCisgICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayh6bGliX2xvY2ssIDEpOyBcCisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKICNkZWZpbmUgTEVBVkVfWkxJQiBcCi0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHpsaWJfbG9jayk7CisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayh6bGliX2xvY2spOwogCiAjZWxzZQogCkBAIC03Myw5ICs3Myw5IEBACiB6bGliX2Vycm9yKHpfc3RyZWFtIHpzdCwgaW50IGVyciwgY2hhciAqbXNnKQogewogICAgIGlmICh6c3QubXNnID09IFpfTlVMTCkKLQlQeUVycl9Gb3JtYXQoWmxpYkVycm9yLCAiRXJyb3IgJWQgJXMiLCBlcnIsIG1zZyk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChabGliRXJyb3IsICJFcnJvciAlZCAlcyIsIGVyciwgbXNnKTsKICAgICBlbHNlCi0JUHlFcnJfRm9ybWF0KFpsaWJFcnJvciwgIkVycm9yICVkICVzOiAlLjIwMHMiLCBlcnIsIG1zZywgenN0Lm1zZyk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChabGliRXJyb3IsICJFcnJvciAlZCAlczogJS4yMDBzIiwgZXJyLCBtc2csIHpzdC5tc2cpOwogfQogCiBQeURvY19TVFJWQVIoY29tcHJlc3NvYmpfX2RvY19fLApAQCAtOTQsMTcgKzk0LDE3IEBACiAgICAgY29tcG9iamVjdCAqc2VsZjsKICAgICBzZWxmID0gUHlPYmplY3RfTmV3KGNvbXBvYmplY3QsIHR5cGUpOwogICAgIGlmIChzZWxmID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHNlbGYtPmlzX2luaXRpYWxpc2VkID0gMDsKICAgICBzZWxmLT51bnVzZWRfZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwogICAgIGlmIChzZWxmLT51bnVzZWRfZGF0YSA9PSBOVUxMKSB7Ci0JUHlfREVDUkVGKHNlbGYpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBzZWxmLT51bmNvbnN1bWVkX3RhaWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKICAgICBpZiAoc2VsZi0+dW5jb25zdW1lZF90YWlsID09IE5VTEwpIHsKLQlQeV9ERUNSRUYoc2VsZik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBzZWxmOwogfQpAQCAtMTI0LDE1ICsxMjQsMTUgQEAKIAogICAgIC8qIHJlcXVpcmUgUHl0aG9uIHN0cmluZyBvYmplY3QsIG9wdGlvbmFsICdsZXZlbCcgYXJnICovCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xpOmNvbXByZXNzIiwgJmlucHV0LCAmbGVuZ3RoLCAmbGV2ZWwpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHpzdC5hdmFpbF9vdXQgPSBsZW5ndGggKyBsZW5ndGgvMTAwMCArIDEyICsgMTsKIAogICAgIG91dHB1dCA9IChCeXRlKiltYWxsb2MoenN0LmF2YWlsX291dCk7CiAgICAgaWYgKG91dHB1dCA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJIkNhbid0IGFsbG9jYXRlIG1lbW9yeSB0byBjb21wcmVzcyBkYXRhIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgdG8gY29tcHJlc3MgZGF0YSIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBQYXN0IHRoZSBwb2ludCBvZiBubyByZXR1cm4uICBGcm9tIGhlcmUgb24gb3V0LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQpAQCAtMTQ3LDE5ICsxNDcsMTkgQEAKIAogICAgIHN3aXRjaChlcnIpIHsKICAgICBjYXNlKFpfT0spOgotCWJyZWFrOworICAgICAgICBicmVhazsKICAgICBjYXNlKFpfTUVNX0VSUk9SKToKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0JCQkiT3V0IG9mIG1lbW9yeSB3aGlsZSBjb21wcmVzc2luZyBkYXRhIik7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk91dCBvZiBtZW1vcnkgd2hpbGUgY29tcHJlc3NpbmcgZGF0YSIpOworICAgICAgICBnb3RvIGVycm9yOwogICAgIGNhc2UoWl9TVFJFQU1fRVJST1IpOgotCVB5RXJyX1NldFN0cmluZyhabGliRXJyb3IsCi0JCQkiQmFkIGNvbXByZXNzaW9uIGxldmVsIik7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFpsaWJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgY29tcHJlc3Npb24gbGV2ZWwiKTsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICBkZWZhdWx0OgogICAgICAgICBkZWZsYXRlRW5kKCZ6c3QpOwotCXpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBjb21wcmVzc2luZyBkYXRhIik7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGNvbXByZXNzaW5nIGRhdGEiKTsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTOwpAQCAtMTY3LDE3ICsxNjcsMTcgQEAKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUzsKIAogICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7Ci0JemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGNvbXByZXNzaW5nIGRhdGEiKTsKLQlkZWZsYXRlRW5kKCZ6c3QpOwotCWdvdG8gZXJyb3I7CisgICAgICAgIHpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBjb21wcmVzc2luZyBkYXRhIik7CisgICAgICAgIGRlZmxhdGVFbmQoJnpzdCk7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgZXJyPWRlZmxhdGVFbmQoJnpzdCk7CiAgICAgaWYgKGVyciA9PSBaX09LKQotCVJldHVyblZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopb3V0cHV0LAotCQkJCQkgICAgICAgenN0LnRvdGFsX291dCk7CisgICAgICAgIFJldHVyblZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6c3QudG90YWxfb3V0KTsKICAgICBlbHNlCi0JemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGZpbmlzaGluZyBjb21wcmVzc2lvbiIpOworICAgICAgICB6bGliX2Vycm9yKHpzdCwgZXJyLCAid2hpbGUgZmluaXNoaW5nIGNvbXByZXNzaW9uIik7CiAKICBlcnJvcjoKICAgICBmcmVlKG91dHB1dCk7CkBAIC0yMDIsMTcgKzIwMiwxNyBAQAogICAgIHpfc3RyZWFtIHpzdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8aW46ZGVjb21wcmVzcyIsCi0JCQkgICZpbnB1dCwgJmxlbmd0aCwgJndzaXplLCAmcl9zdHJsZW4pKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsICZsZW5ndGgsICZ3c2l6ZSwgJnJfc3RybGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAocl9zdHJsZW4gPD0gMCkKLQlyX3N0cmxlbiA9IDE7CisgICAgICAgIHJfc3RybGVuID0gMTsKIAogICAgIHpzdC5hdmFpbF9pbiA9IGxlbmd0aDsKICAgICB6c3QuYXZhaWxfb3V0ID0gcl9zdHJsZW47CiAKICAgICBpZiAoIShyZXN1bHRfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcl9zdHJsZW4pKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICB6c3QuemFsbG9jID0gKGFsbG9jX2Z1bmMpTlVMTDsKICAgICB6c3QuemZyZWUgPSAoZnJlZV9mdW5jKVpfTlVMTDsKQEAgLTIyMiw2MCArMjIyLDYwIEBACiAKICAgICBzd2l0Y2goZXJyKSB7CiAgICAgY2FzZShaX09LKToKLQlicmVhazsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZShaX01FTV9FUlJPUik6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJIk91dCBvZiBtZW1vcnkgd2hpbGUgZGVjb21wcmVzc2luZyBkYXRhIik7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk91dCBvZiBtZW1vcnkgd2hpbGUgZGVjb21wcmVzc2luZyBkYXRhIik7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgZGVmYXVsdDoKICAgICAgICAgaW5mbGF0ZUVuZCgmenN0KTsKLQl6bGliX2Vycm9yKHpzdCwgZXJyLCAid2hpbGUgcHJlcGFyaW5nIHRvIGRlY29tcHJlc3MgZGF0YSIpOwotCWdvdG8gZXJyb3I7CisgICAgICAgIHpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBwcmVwYXJpbmcgdG8gZGVjb21wcmVzcyBkYXRhIik7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgZG8gewotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQllcnI9aW5mbGF0ZSgmenN0LCBaX0ZJTklTSCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBlcnI9aW5mbGF0ZSgmenN0LCBaX0ZJTklTSCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlzd2l0Y2goZXJyKSB7Ci0JY2FzZShaX1NUUkVBTV9FTkQpOgotCSAgICBicmVhazsKLQljYXNlKFpfQlVGX0VSUk9SKToKLQkgICAgLyoKLQkgICAgICogSWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBieXRlIG9mIHJvb20gYWNjb3JkaW5nIHRvIHpzdC5hdmFpbF9vdXQKLQkgICAgICogYW5kIHdlIGdldCB0aGlzIGVycm9yLCBhc3N1bWUgdGhhdCBpdCBtZWFucyB6bGliIGNhbm5vdAotCSAgICAgKiBwcm9jZXNzIHRoZSBpbmZsYXRlIGNhbGwoKSBkdWUgdG8gYW4gZXJyb3IgaW4gdGhlIGRhdGEuCi0JICAgICAqLwotCSAgICBpZiAoenN0LmF2YWlsX291dCA+IDApIHsKLQkJUHlFcnJfRm9ybWF0KFpsaWJFcnJvciwgIkVycm9yICVpIHdoaWxlIGRlY29tcHJlc3NpbmcgZGF0YSIsCi0JCQkgICAgIGVycik7Ci0JCWluZmxhdGVFbmQoJnpzdCk7Ci0JCWdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgICAgLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZShaX09LKToKLQkgICAgLyogbmVlZCBtb3JlIG1lbW9yeSAqLwotCSAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0X3N0ciwgcl9zdHJsZW4gPDwgMSkgPCAwKSB7Ci0JCWluZmxhdGVFbmQoJnpzdCk7Ci0JCWdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgICAgenN0Lm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0X3N0cikgXAotCQkrIHJfc3RybGVuOwotCSAgICB6c3QuYXZhaWxfb3V0ID0gcl9zdHJsZW47Ci0JICAgIHJfc3RybGVuID0gcl9zdHJsZW4gPDwgMTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgaW5mbGF0ZUVuZCgmenN0KTsKLQkgICAgemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGRlY29tcHJlc3NpbmcgZGF0YSIpOwotCSAgICBnb3RvIGVycm9yOwotCX0KKyAgICAgICAgc3dpdGNoKGVycikgeworICAgICAgICBjYXNlKFpfU1RSRUFNX0VORCk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZShaX0JVRl9FUlJPUik6CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBieXRlIG9mIHJvb20gYWNjb3JkaW5nIHRvIHpzdC5hdmFpbF9vdXQKKyAgICAgICAgICAgICAqIGFuZCB3ZSBnZXQgdGhpcyBlcnJvciwgYXNzdW1lIHRoYXQgaXQgbWVhbnMgemxpYiBjYW5ub3QKKyAgICAgICAgICAgICAqIHByb2Nlc3MgdGhlIGluZmxhdGUgY2FsbCgpIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgZGF0YS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHpzdC5hdmFpbF9vdXQgPiAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFpsaWJFcnJvciwgIkVycm9yICVpIHdoaWxlIGRlY29tcHJlc3NpbmcgZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICAgICAgaW5mbGF0ZUVuZCgmenN0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UoWl9PSyk6CisgICAgICAgICAgICAvKiBuZWVkIG1vcmUgbWVtb3J5ICovCisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0X3N0ciwgcl9zdHJsZW4gPDwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaW5mbGF0ZUVuZCgmenN0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgenN0Lm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0X3N0cikgXAorICAgICAgICAgICAgICAgICsgcl9zdHJsZW47CisgICAgICAgICAgICB6c3QuYXZhaWxfb3V0ID0gcl9zdHJsZW47CisgICAgICAgICAgICByX3N0cmxlbiA9IHJfc3RybGVuIDw8IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGluZmxhdGVFbmQoJnpzdCk7CisgICAgICAgICAgICB6bGliX2Vycm9yKHpzdCwgZXJyLCAid2hpbGUgZGVjb21wcmVzc2luZyBkYXRhIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CiAgICAgfSB3aGlsZSAoZXJyICE9IFpfU1RSRUFNX0VORCk7CiAKICAgICBlcnIgPSBpbmZsYXRlRW5kKCZ6c3QpOwogICAgIGlmIChlcnIgIT0gWl9PSykgewotCXpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBmaW5pc2hpbmcgZGF0YSBkZWNvbXByZXNzaW9uIik7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGZpbmlzaGluZyBkYXRhIGRlY29tcHJlc3Npb24iKTsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHRfc3RyLCB6c3QudG90YWxfb3V0KTsKQEAgLTI5NCwxMiArMjk0LDEyIEBACiAgICAgaW50IHdiaXRzPU1BWF9XQklUUywgbWVtTGV2ZWw9REVGX01FTV9MRVZFTCwgc3RyYXRlZ3k9MCwgZXJyOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aWlpaWk6Y29tcHJlc3NvYmoiLCAmbGV2ZWwsICZtZXRob2QsICZ3Yml0cywKLQkJCSAgJm1lbUxldmVsLCAmc3RyYXRlZ3kpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVtTGV2ZWwsICZzdHJhdGVneSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgc2VsZiA9IG5ld2NvbXBvYmplY3QoJkNvbXB0eXBlKTsKICAgICBpZiAoc2VsZj09TlVMTCkKLQlyZXR1cm4oTlVMTCk7CisgICAgICAgIHJldHVybihOVUxMKTsKICAgICBzZWxmLT56c3QuemFsbG9jID0gKGFsbG9jX2Z1bmMpTlVMTDsKICAgICBzZWxmLT56c3QuemZyZWUgPSAoZnJlZV9mdW5jKVpfTlVMTDsKICAgICBzZWxmLT56c3QubmV4dF9pbiA9IE5VTEw7CkBAIC0zMDcsMjEgKzMwNywyMSBAQAogICAgIGVyciA9IGRlZmxhdGVJbml0Migmc2VsZi0+enN0LCBsZXZlbCwgbWV0aG9kLCB3Yml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KTsKICAgICBzd2l0Y2goZXJyKSB7CiAgICAgY2FzZSAoWl9PSyk6Ci0Jc2VsZi0+aXNfaW5pdGlhbGlzZWQgPSAxOwotCXJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgICAgIHNlbGYtPmlzX2luaXRpYWxpc2VkID0gMTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKICAgICBjYXNlIChaX01FTV9FUlJPUik6Ci0JUHlfREVDUkVGKHNlbGYpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLQkJCSJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbXByZXNzaW9uIG9iamVjdCIpOwotCXJldHVybiBOVUxMOwotICAgIGNhc2UoWl9TVFJFQU1fRVJST1IpOgotCVB5X0RFQ1JFRihzZWxmKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkludmFsaWQgaW5pdGlhbGl6YXRpb24gb3B0aW9uIik7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgZGVmYXVsdDoKLQl6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAid2hpbGUgY3JlYXRpbmcgY29tcHJlc3Npb24gb2JqZWN0Iik7CiAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tcHJlc3Npb24gb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UoWl9TVFJFQU1fRVJST1IpOgorICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSW52YWxpZCBpbml0aWFsaXphdGlvbiBvcHRpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVmYXVsdDoKKyAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGNyZWF0aW5nIGNvbXByZXNzaW9uIG9iamVjdCIpOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIH0KIApAQCAtMzMxLDExICszMzEsMTEgQEAKICAgICBpbnQgd2JpdHM9REVGX1dCSVRTLCBlcnI7CiAgICAgY29tcG9iamVjdCAqc2VsZjsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmRlY29tcHJlc3NvYmoiLCAmd2JpdHMpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHNlbGYgPSBuZXdjb21wb2JqZWN0KCZEZWNvbXB0eXBlKTsKICAgICBpZiAoc2VsZiA9PSBOVUxMKQotCXJldHVybihOVUxMKTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgIHNlbGYtPnpzdC56YWxsb2MgPSAoYWxsb2NfZnVuYylOVUxMOwogICAgIHNlbGYtPnpzdC56ZnJlZSA9IChmcmVlX2Z1bmMpWl9OVUxMOwogICAgIHNlbGYtPnpzdC5uZXh0X2luID0gTlVMTDsKQEAgLTM0MywyMSArMzQzLDIxIEBACiAgICAgZXJyID0gaW5mbGF0ZUluaXQyKCZzZWxmLT56c3QsIHdiaXRzKTsKICAgICBzd2l0Y2goZXJyKSB7CiAgICAgY2FzZSAoWl9PSyk6Ci0Jc2VsZi0+aXNfaW5pdGlhbGlzZWQgPSAxOwotCXJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgICAgIHNlbGYtPmlzX2luaXRpYWxpc2VkID0gMTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKICAgICBjYXNlKFpfU1RSRUFNX0VSUk9SKToKLQlQeV9ERUNSRUYoc2VsZik7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJbnZhbGlkIGluaXRpYWxpemF0aW9uIG9wdGlvbiIpOwotCXJldHVybiBOVUxMOwotICAgIGNhc2UgKFpfTUVNX0VSUk9SKToKLQlQeV9ERUNSRUYoc2VsZik7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGVjb21wcmVzc2lvbiBvYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKLSAgICBkZWZhdWx0OgotCXpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJ3aGlsZSBjcmVhdGluZyBkZWNvbXByZXNzaW9uIG9iamVjdCIpOwogICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSW52YWxpZCBpbml0aWFsaXphdGlvbiBvcHRpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSAoWl9NRU1fRVJST1IpOgorICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRlY29tcHJlc3Npb24gb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRlZmF1bHQ6CisgICAgICAgIHpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJ3aGlsZSBjcmVhdGluZyBkZWNvbXByZXNzaW9uIG9iamVjdCIpOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIH0KIApAQCAtMzY1LDcgKzM2NSw3IEBACiBDb21wX2RlYWxsb2MoY29tcG9iamVjdCAqc2VsZikKIHsKICAgICBpZiAoc2VsZi0+aXNfaW5pdGlhbGlzZWQpCi0JZGVmbGF0ZUVuZCgmc2VsZi0+enN0KTsKKyAgICAgICAgZGVmbGF0ZUVuZCgmc2VsZi0+enN0KTsKICAgICBQeV9YREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKICAgICBQeV9YREVDUkVGKHNlbGYtPnVuY29uc3VtZWRfdGFpbCk7CiAgICAgUHlPYmplY3RfRGVsKHNlbGYpOwpAQCAtMzc1LDcgKzM3NSw3IEBACiBEZWNvbXBfZGVhbGxvYyhjb21wb2JqZWN0ICpzZWxmKQogewogICAgIGlmIChzZWxmLT5pc19pbml0aWFsaXNlZCkKLQlpbmZsYXRlRW5kKCZzZWxmLT56c3QpOworICAgICAgICBpbmZsYXRlRW5kKCZzZWxmLT56c3QpOwogICAgIFB5X1hERUNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOwogICAgIFB5X1hERUNSRUYoc2VsZi0+dW5jb25zdW1lZF90YWlsKTsKICAgICBQeU9iamVjdF9EZWwoc2VsZik7CkBAIC0zOTksMTAgKzM5OSwxMCBAQAogICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfdG90YWxfb3V0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpjb21wcmVzcyIsICZpbnB1dCwgJmlucGxlbikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKCEoUmV0VmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuZ3RoKSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgRU5URVJfWkxJQgogCkBAIC00MTksMTYgKzQxOSwxNiBAQAogICAgIC8qIHdoaWxlIFpfT0sgYW5kIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwsIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0LAogICAgICAgIHNvIGV4dGVuZCB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdHJ5IGFnYWluICovCiAgICAgd2hpbGUgKGVyciA9PSBaX09LICYmIHNlbGYtPnpzdC5hdmFpbF9vdXQgPT0gMCkgewotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZSZXRWYWwsIGxlbmd0aCA8PCAxKSA8IDApCi0JICAgIGdvdG8gZXJyb3I7Ci0Jc2VsZi0+enN0Lm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoUmV0VmFsKSBcCi0JICAgICsgbGVuZ3RoOwotCXNlbGYtPnpzdC5hdmFpbF9vdXQgPSBsZW5ndGg7Ci0JbGVuZ3RoID0gbGVuZ3RoIDw8IDE7CisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZSZXRWYWwsIGxlbmd0aCA8PCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBzZWxmLT56c3QubmV4dF9vdXQgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhSZXRWYWwpIFwKKyAgICAgICAgICAgICsgbGVuZ3RoOworICAgICAgICBzZWxmLT56c3QuYXZhaWxfb3V0ID0gbGVuZ3RoOworICAgICAgICBsZW5ndGggPSBsZW5ndGggPDwgMTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQllcnIgPSBkZWZsYXRlKCYoc2VsZi0+enN0KSwgWl9OT19GTFVTSCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBlcnIgPSBkZWZsYXRlKCYoc2VsZi0+enN0KSwgWl9OT19GTFVTSCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgfQogICAgIC8qIFdlIHdpbGwgb25seSBnZXQgWl9CVUZfRVJST1IgaWYgdGhlIG91dHB1dCBidWZmZXIgd2FzIGZ1bGwgYnV0CiAgICAgICAgdGhlcmUgd2Fzbid0IG1vcmUgb3V0cHV0IHdoZW4gd2UgdHJpZWQgYWdhaW4sIHNvIGl0IGlzIG5vdCBhbiBlcnJvcgpAQCAtNDM2LDEwICs0MzYsMTAgQEAKICAgICAqLwogCiAgICAgaWYgKGVyciAhPSBaX09LICYmIGVyciAhPSBaX0JVRl9FUlJPUikgewotCXpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJ3aGlsZSBjb21wcmVzc2luZyIpOwotCVB5X0RFQ1JFRihSZXRWYWwpOwotCVJldFZhbCA9IE5VTEw7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGNvbXByZXNzaW5nIik7CisgICAgICAgIFB5X0RFQ1JFRihSZXRWYWwpOworICAgICAgICBSZXRWYWwgPSBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KICAgICBfUHlTdHJpbmdfUmVzaXplKCZSZXRWYWwsIHNlbGYtPnpzdC50b3RhbF9vdXQgLSBzdGFydF90b3RhbF9vdXQpOwogCkBAIC00NjksMTkgKzQ2OSwxOSBAQAogICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfdG90YWxfb3V0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xpOmRlY29tcHJlc3MiLCAmaW5wdXQsCi0JCQkgICZpbnBsZW4sICZtYXhfbGVuZ3RoKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucGxlbiwgJm1heF9sZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAobWF4X2xlbmd0aCA8IDApIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJtYXhfbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4X2xlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIC8qIGxpbWl0IGFtb3VudCBvZiBkYXRhIGFsbG9jYXRlZCB0byBtYXhfbGVuZ3RoICovCiAgICAgaWYgKG1heF9sZW5ndGggJiYgbGVuZ3RoID4gbWF4X2xlbmd0aCkKLQlsZW5ndGggPSBtYXhfbGVuZ3RoOworICAgICAgICBsZW5ndGggPSBtYXhfbGVuZ3RoOwogICAgIGlmICghKFJldFZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbmd0aCkpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIEVOVEVSX1pMSUIKIApAQCAtNDk5LDQwICs0OTksNDAgQEAKICAgICAgICBTbyBleHRlbmQgdGhlIG91dHB1dCBidWZmZXIgYW5kIHRyeSBhZ2Fpbi4KICAgICAqLwogICAgIHdoaWxlIChlcnIgPT0gWl9PSyAmJiBzZWxmLT56c3QuYXZhaWxfb3V0ID09IDApIHsKLQkvKiBJZiBtYXhfbGVuZ3RoIHNldCwgZG9uJ3QgY29udGludWUgZGVjb21wcmVzc2luZyBpZiB3ZSd2ZSBhbHJlYWR5Ci0JICAgcmVhY2hlZCB0aGUgbGltaXQuCi0JKi8KLQlpZiAobWF4X2xlbmd0aCAmJiBsZW5ndGggPj0gbWF4X2xlbmd0aCkKLQkgICAgYnJlYWs7CisgICAgICAgIC8qIElmIG1heF9sZW5ndGggc2V0LCBkb24ndCBjb250aW51ZSBkZWNvbXByZXNzaW5nIGlmIHdlJ3ZlIGFscmVhZHkKKyAgICAgICAgICAgcmVhY2hlZCB0aGUgbGltaXQuCisgICAgICAgICovCisgICAgICAgIGlmIChtYXhfbGVuZ3RoICYmIGxlbmd0aCA+PSBtYXhfbGVuZ3RoKQorICAgICAgICAgICAgYnJlYWs7CiAKLQkvKiBvdGhlcndpc2UsIC4uLiAqLwotCW9sZF9sZW5ndGggPSBsZW5ndGg7Ci0JbGVuZ3RoID0gbGVuZ3RoIDw8IDE7Ci0JaWYgKG1heF9sZW5ndGggJiYgbGVuZ3RoID4gbWF4X2xlbmd0aCkKLQkgICAgbGVuZ3RoID0gbWF4X2xlbmd0aDsKKyAgICAgICAgLyogb3RoZXJ3aXNlLCAuLi4gKi8KKyAgICAgICAgb2xkX2xlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIDw8IDE7CisgICAgICAgIGlmIChtYXhfbGVuZ3RoICYmIGxlbmd0aCA+IG1heF9sZW5ndGgpCisgICAgICAgICAgICBsZW5ndGggPSBtYXhfbGVuZ3RoOwogCi0JaWYgKF9QeVN0cmluZ19SZXNpemUoJlJldFZhbCwgbGVuZ3RoKSA8IDApCi0JICAgIGdvdG8gZXJyb3I7Ci0Jc2VsZi0+enN0Lm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoUmV0VmFsKSBcCi0JICAgICsgb2xkX2xlbmd0aDsKLQlzZWxmLT56c3QuYXZhaWxfb3V0ID0gbGVuZ3RoIC0gb2xkX2xlbmd0aDsKKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJlJldFZhbCwgbGVuZ3RoKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBzZWxmLT56c3QubmV4dF9vdXQgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhSZXRWYWwpIFwKKyAgICAgICAgICAgICsgb2xkX2xlbmd0aDsKKyAgICAgICAgc2VsZi0+enN0LmF2YWlsX291dCA9IGxlbmd0aCAtIG9sZF9sZW5ndGg7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZXJyID0gaW5mbGF0ZSgmKHNlbGYtPnpzdCksIFpfU1lOQ19GTFVTSCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBlcnIgPSBpbmZsYXRlKCYoc2VsZi0+enN0KSwgWl9TWU5DX0ZMVVNIKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICB9CiAKICAgICAvKiBOb3QgYWxsIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgY291bGQgYmUgYWNjb21tb2RhdGVkIGluIHRoZSBvdXRwdXQgYnVmZmVyCiAgICAgICAgb2Ygc3BlY2lmaWVkIHNpemUuIFJldHVybiB0aGUgdW5jb25zdW1lZCB0YWlsIGluIGFuIGF0dHJpYnV0ZS4qLwogICAgIGlmKG1heF9sZW5ndGgpIHsKLQlQeV9ERUNSRUYoc2VsZi0+dW5jb25zdW1lZF90YWlsKTsKLQlzZWxmLT51bmNvbnN1bWVkX3RhaWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPnpzdC5uZXh0X2luLAotCQkJCQkJCSAgIHNlbGYtPnpzdC5hdmFpbF9pbik7Ci0JaWYoIXNlbGYtPnVuY29uc3VtZWRfdGFpbCkgewotCSAgICBQeV9ERUNSRUYoUmV0VmFsKTsKLQkgICAgUmV0VmFsID0gTlVMTDsKLQkgICAgZ290byBlcnJvcjsKLQl9CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT51bmNvbnN1bWVkX3RhaWwpOworICAgICAgICBzZWxmLT51bmNvbnN1bWVkX3RhaWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPnpzdC5uZXh0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT56c3QuYXZhaWxfaW4pOworICAgICAgICBpZighc2VsZi0+dW5jb25zdW1lZF90YWlsKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoUmV0VmFsKTsKKyAgICAgICAgICAgIFJldFZhbCA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyogVGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIHJlYWNoZWQsIHNvIHNldCB0aGUKQEAgLTU0MiwyMiArNTQyLDIyIEBACiAgICAgICAgcHJlc2VydmVkLgogICAgICovCiAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIHsKLQlQeV9YREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsgIC8qIEZyZWUgb3JpZ2luYWwgZW1wdHkgc3RyaW5nICovCi0Jc2VsZi0+dW51c2VkX2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkgICAgKGNoYXIgKilzZWxmLT56c3QubmV4dF9pbiwgc2VsZi0+enN0LmF2YWlsX2luKTsKLQlpZiAoc2VsZi0+dW51c2VkX2RhdGEgPT0gTlVMTCkgewotCSAgICBQeV9ERUNSRUYoUmV0VmFsKTsKLQkgICAgZ290byBlcnJvcjsKLQl9Ci0JLyogV2Ugd2lsbCBvbmx5IGdldCBaX0JVRl9FUlJPUiBpZiB0aGUgb3V0cHV0IGJ1ZmZlciB3YXMgZnVsbAotCSAgIGJ1dCB0aGVyZSB3YXNuJ3QgbW9yZSBvdXRwdXQgd2hlbiB3ZSB0cmllZCBhZ2Fpbiwgc28gaXQgaXMKLQkgICBub3QgYW4gZXJyb3IgY29uZGl0aW9uLgotCSovCisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOyAgLyogRnJlZSBvcmlnaW5hbCBlbXB0eSBzdHJpbmcgKi8KKyAgICAgICAgc2VsZi0+dW51c2VkX2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgICAgIChjaGFyICopc2VsZi0+enN0Lm5leHRfaW4sIHNlbGYtPnpzdC5hdmFpbF9pbik7CisgICAgICAgIGlmIChzZWxmLT51bnVzZWRfZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoUmV0VmFsKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgLyogV2Ugd2lsbCBvbmx5IGdldCBaX0JVRl9FUlJPUiBpZiB0aGUgb3V0cHV0IGJ1ZmZlciB3YXMgZnVsbAorICAgICAgICAgICBidXQgdGhlcmUgd2Fzbid0IG1vcmUgb3V0cHV0IHdoZW4gd2UgdHJpZWQgYWdhaW4sIHNvIGl0IGlzCisgICAgICAgICAgIG5vdCBhbiBlcnJvciBjb25kaXRpb24uCisgICAgICAgICovCiAgICAgfSBlbHNlIGlmIChlcnIgIT0gWl9PSyAmJiBlcnIgIT0gWl9CVUZfRVJST1IpIHsKLQl6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAid2hpbGUgZGVjb21wcmVzc2luZyIpOwotCVB5X0RFQ1JFRihSZXRWYWwpOwotCVJldFZhbCA9IE5VTEw7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGRlY29tcHJlc3NpbmciKTsKKyAgICAgICAgUHlfREVDUkVGKFJldFZhbCk7CisgICAgICAgIFJldFZhbCA9IE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmUmV0VmFsLCBzZWxmLT56c3QudG90YWxfb3V0IC0gc3RhcnRfdG90YWxfb3V0KTsKQEAgLTU4NSwxNiArNTg1LDE2IEBACiAgICAgdW5zaWduZWQgbG9uZyBzdGFydF90b3RhbF9vdXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmZsdXNoIiwgJmZsdXNobW9kZSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogRmx1c2hpbmcgd2l0aCBaX05PX0ZMVVNIIGlzIGEgbm8tb3AsIHNvIHRoZXJlJ3Mgbm8gcG9pbnQgaW4KICAgICAgICBkb2luZyBhbnkgd29yayBhdCBhbGw7IGp1c3QgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4gKi8KICAgICBpZiAoZmx1c2htb2RlID09IFpfTk9fRkxVU0gpIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKICAgICB9CiAKICAgICBpZiAoIShSZXRWYWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW5ndGgpKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBFTlRFUl9aTElCCiAKQEAgLTYxMCw0MSArNjEwLDQxIEBACiAgICAgLyogd2hpbGUgWl9PSyBhbmQgdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCwgdGhlcmUgbWlnaHQgYmUgbW9yZSBvdXRwdXQsCiAgICAgICAgc28gZXh0ZW5kIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB0cnkgYWdhaW4gKi8KICAgICB3aGlsZSAoZXJyID09IFpfT0sgJiYgc2VsZi0+enN0LmF2YWlsX291dCA9PSAwKSB7Ci0JaWYgKF9QeVN0cmluZ19SZXNpemUoJlJldFZhbCwgbGVuZ3RoIDw8IDEpIDwgMCkKLQkgICAgZ290byBlcnJvcjsKLQlzZWxmLT56c3QubmV4dF9vdXQgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhSZXRWYWwpIFwKLQkgICAgKyBsZW5ndGg7Ci0Jc2VsZi0+enN0LmF2YWlsX291dCA9IGxlbmd0aDsKLQlsZW5ndGggPSBsZW5ndGggPDwgMTsKKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJlJldFZhbCwgbGVuZ3RoIDw8IDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHNlbGYtPnpzdC5uZXh0X291dCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKFJldFZhbCkgXAorICAgICAgICAgICAgKyBsZW5ndGg7CisgICAgICAgIHNlbGYtPnpzdC5hdmFpbF9vdXQgPSBsZW5ndGg7CisgICAgICAgIGxlbmd0aCA9IGxlbmd0aCA8PCAxOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWVyciA9IGRlZmxhdGUoJihzZWxmLT56c3QpLCBmbHVzaG1vZGUpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZXJyID0gZGVmbGF0ZSgmKHNlbGYtPnpzdCksIGZsdXNobW9kZSk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgfQogCiAgICAgLyogSWYgZmx1c2htb2RlIGlzIFpfRklOSVNILCB3ZSBhbHNvIGhhdmUgdG8gY2FsbCBkZWZsYXRlRW5kKCkgdG8gZnJlZQogICAgICAgIHZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzLiBOb3RlIHdlIHNob3VsZCBvbmx5IGdldCBaX1NUUkVBTV9FTkQgd2hlbgogICAgICAgIGZsdXNobW9kZSBpcyBaX0ZJTklTSCwgYnV0IGNoZWNraW5nIGJvdGggZm9yIHNhZmV0eSovCiAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQgJiYgZmx1c2htb2RlID09IFpfRklOSVNIKSB7Ci0JZXJyID0gZGVmbGF0ZUVuZCgmKHNlbGYtPnpzdCkpOwotCWlmIChlcnIgIT0gWl9PSykgewotCSAgICB6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAiZnJvbSBkZWZsYXRlRW5kKCkiKTsKLQkgICAgUHlfREVDUkVGKFJldFZhbCk7Ci0JICAgIFJldFZhbCA9IE5VTEw7Ci0JICAgIGdvdG8gZXJyb3I7Ci0JfQotCWVsc2UKLQkgICAgc2VsZi0+aXNfaW5pdGlhbGlzZWQgPSAwOworICAgICAgICBlcnIgPSBkZWZsYXRlRW5kKCYoc2VsZi0+enN0KSk7CisgICAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgImZyb20gZGVmbGF0ZUVuZCgpIik7CisgICAgICAgICAgICBQeV9ERUNSRUYoUmV0VmFsKTsKKyAgICAgICAgICAgIFJldFZhbCA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlbGYtPmlzX2luaXRpYWxpc2VkID0gMDsKIAotCS8qIFdlIHdpbGwgb25seSBnZXQgWl9CVUZfRVJST1IgaWYgdGhlIG91dHB1dCBidWZmZXIgd2FzIGZ1bGwKLQkgICBidXQgdGhlcmUgd2Fzbid0IG1vcmUgb3V0cHV0IHdoZW4gd2UgdHJpZWQgYWdhaW4sIHNvIGl0IGlzCi0JICAgbm90IGFuIGVycm9yIGNvbmRpdGlvbi4KLQkqLworICAgICAgICAvKiBXZSB3aWxsIG9ubHkgZ2V0IFpfQlVGX0VSUk9SIGlmIHRoZSBvdXRwdXQgYnVmZmVyIHdhcyBmdWxsCisgICAgICAgICAgIGJ1dCB0aGVyZSB3YXNuJ3QgbW9yZSBvdXRwdXQgd2hlbiB3ZSB0cmllZCBhZ2Fpbiwgc28gaXQgaXMKKyAgICAgICAgICAgbm90IGFuIGVycm9yIGNvbmRpdGlvbi4KKyAgICAgICAgKi8KICAgICB9IGVsc2UgaWYgKGVyciE9Wl9PSyAmJiBlcnIhPVpfQlVGX0VSUk9SKSB7Ci0JemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGZsdXNoaW5nIik7Ci0JUHlfREVDUkVGKFJldFZhbCk7Ci0JUmV0VmFsID0gTlVMTDsKLQlnb3RvIGVycm9yOworICAgICAgICB6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAid2hpbGUgZmx1c2hpbmciKTsKKyAgICAgICAgUHlfREVDUkVGKFJldFZhbCk7CisgICAgICAgIFJldFZhbCA9IE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmUmV0VmFsLCBzZWxmLT56c3QudG90YWxfb3V0IC0gc3RhcnRfdG90YWxfb3V0KTsKQEAgLTc3NCwxMyArNzc0LDEzIEBACiAgICAgdW5zaWduZWQgbG9uZyBzdGFydF90b3RhbF9vdXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmZsdXNoIiwgJmxlbmd0aCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChsZW5ndGggPD0gMCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKCEocmV0dmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuZ3RoKSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAKICAgICBFTlRFUl9aTElCCkBAIC03OTYsMjkgKzc5NiwyOSBAQAogICAgIC8qIHdoaWxlIFpfT0sgYW5kIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwsIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0LAogICAgICAgIHNvIGV4dGVuZCB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdHJ5IGFnYWluICovCiAgICAgd2hpbGUgKChlcnIgPT0gWl9PSyB8fCBlcnIgPT0gWl9CVUZfRVJST1IpICYmIHNlbGYtPnpzdC5hdmFpbF9vdXQgPT0gMCkgewotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXR2YWwsIGxlbmd0aCA8PCAxKSA8IDApCi0JICAgIGdvdG8gZXJyb3I7Ci0Jc2VsZi0+enN0Lm5leHRfb3V0ID0gKEJ5dGUgKilQeVN0cmluZ19BU19TVFJJTkcocmV0dmFsKSArIGxlbmd0aDsKLQlzZWxmLT56c3QuYXZhaWxfb3V0ID0gbGVuZ3RoOwotCWxlbmd0aCA9IGxlbmd0aCA8PCAxOworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0dmFsLCBsZW5ndGggPDwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgc2VsZi0+enN0Lm5leHRfb3V0ID0gKEJ5dGUgKilQeVN0cmluZ19BU19TVFJJTkcocmV0dmFsKSArIGxlbmd0aDsKKyAgICAgICAgc2VsZi0+enN0LmF2YWlsX291dCA9IGxlbmd0aDsKKyAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIDw8IDE7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZXJyID0gaW5mbGF0ZSgmKHNlbGYtPnpzdCksIFpfRklOSVNIKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGVyciA9IGluZmxhdGUoJihzZWxmLT56c3QpLCBaX0ZJTklTSCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgfQogCiAgICAgLyogSWYgZmx1c2htb2RlIGlzIFpfRklOSVNILCB3ZSBhbHNvIGhhdmUgdG8gY2FsbCBkZWZsYXRlRW5kKCkgdG8gZnJlZQogICAgICAgIHZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzLiBOb3RlIHdlIHNob3VsZCBvbmx5IGdldCBaX1NUUkVBTV9FTkQgd2hlbgogICAgICAgIGZsdXNobW9kZSBpcyBaX0ZJTklTSCAqLwogICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSB7Ci0JZXJyID0gaW5mbGF0ZUVuZCgmKHNlbGYtPnpzdCkpOworICAgICAgICBlcnIgPSBpbmZsYXRlRW5kKCYoc2VsZi0+enN0KSk7CiAgICAgICAgIHNlbGYtPmlzX2luaXRpYWxpc2VkID0gMDsKLQlpZiAoZXJyICE9IFpfT0spIHsKLQkgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgImZyb20gaW5mbGF0ZUVuZCgpIik7Ci0JICAgIFB5X0RFQ1JFRihyZXR2YWwpOwotCSAgICByZXR2YWwgPSBOVUxMOwotCSAgICBnb3RvIGVycm9yOwotCX0KKyAgICAgICAgaWYgKGVyciAhPSBaX09LKSB7CisgICAgICAgICAgICB6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAiZnJvbSBpbmZsYXRlRW5kKCkiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KICAgICB9CiAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0dmFsLCBzZWxmLT56c3QudG90YWxfb3V0IC0gc3RhcnRfdG90YWxfb3V0KTsKIApAQCAtODcyLDEzICs4NzIsMTMgQEAKICAgICBFTlRFUl9aTElCCiAKICAgICBpZiAoc3RyY21wKG5hbWUsICJ1bnVzZWRfZGF0YSIpID09IDApIHsKLQlQeV9JTkNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOwotCXJldHZhbCA9IHNlbGYtPnVudXNlZF9kYXRhOworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOworICAgICAgICByZXR2YWwgPSBzZWxmLT51bnVzZWRfZGF0YTsKICAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAidW5jb25zdW1lZF90YWlsIikgPT0gMCkgewotCVB5X0lOQ1JFRihzZWxmLT51bmNvbnN1bWVkX3RhaWwpOwotCXJldHZhbCA9IHNlbGYtPnVuY29uc3VtZWRfdGFpbDsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnVuY29uc3VtZWRfdGFpbCk7CisgICAgICAgIHJldHZhbCA9IHNlbGYtPnVuY29uc3VtZWRfdGFpbDsKICAgICB9IGVsc2UKLQlyZXR2YWwgPSBQeV9GaW5kTWV0aG9kKERlY29tcF9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICAgICAgcmV0dmFsID0gUHlfRmluZE1ldGhvZChEZWNvbXBfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiAKICAgICBMRUFWRV9aTElCCiAKQEAgLTg5OSw3ICs4OTksNyBAQAogICAgIGludCBsZW4sIHNpZ25lZF92YWw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfEk6YWRsZXIzMiIsICZidWYsICZsZW4sICZhZGxlcjMydmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgLyogSW4gUHl0aG9uIDIueCB3ZSByZXR1cm4gYSBzaWduZWQgaW50ZWdlciByZWdhcmRsZXNzIG9mIG5hdGl2ZSBwbGF0Zm9ybQogICAgICAqIGxvbmcgc2l6ZSAodGhlIDMyYml0IHVuc2lnbmVkIGxvbmcgaXMgdHJlYXRlZCBhcyAzMi1iaXQgc2lnbmVkIGFuZCBzaWduCiAgICAgICogZXh0ZW5kZWQgaW50byBhIDY0LWJpdCBsb25nIGluc2lkZSB0aGUgaW50ZWdlciBvYmplY3QpLiAgMy4wIGRvZXMgdGhlCkBAIC05MjIsNyArOTIyLDcgQEAKICAgICBpbnQgbGVuLCBzaWduZWRfdmFsOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xJOmNyYzMyIiwgJmJ1ZiwgJmxlbiwgJmNyYzMydmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgLyogSW4gUHl0aG9uIDIueCB3ZSByZXR1cm4gYSBzaWduZWQgaW50ZWdlciByZWdhcmRsZXNzIG9mIG5hdGl2ZSBwbGF0Zm9ybQogICAgICAqIGxvbmcgc2l6ZSAodGhlIDMyYml0IHVuc2lnbmVkIGxvbmcgaXMgdHJlYXRlZCBhcyAzMi1iaXQgc2lnbmVkIGFuZCBzaWduCiAgICAgICogZXh0ZW5kZWQgaW50byBhIDY0LWJpdCBsb25nIGluc2lkZSB0aGUgaW50ZWdlciBvYmplY3QpLiAgMy4wIGRvZXMgdGhlCkBAIC0xMDAzLDE1ICsxMDAzLDE1IEBACiAgICAgUHlfVFlQRSgmQ29tcHR5cGUpID0gJlB5VHlwZV9UeXBlOwogICAgIFB5X1RZUEUoJkRlY29tcHR5cGUpID0gJlB5VHlwZV9UeXBlOwogICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgiemxpYiIsIHpsaWJfbWV0aG9kcywKLQkJICAgICAgIHpsaWJfbW9kdWxlX2RvY3VtZW50YXRpb24sCi0JCSAgICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgemxpYl9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CiAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIFpsaWJFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiemxpYi5lcnJvciIsIE5VTEwsIE5VTEwpOwogICAgIGlmIChabGliRXJyb3IgIT0gTlVMTCkgewogICAgICAgICBQeV9JTkNSRUYoWmxpYkVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgWmxpYkVycm9yKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFpsaWJFcnJvcik7CiAgICAgfQogICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNQVhfV0JJVFMiLCBNQVhfV0JJVFMpOwogICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZMQVRFRCIsIERFRkxBVEVEKTsKQEAgLTEwMzAsNyArMTAzMCw3IEBACiAKICAgICB2ZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFpMSUJfVkVSU0lPTik7CiAgICAgaWYgKHZlciAhPSBOVUxMKQotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiWkxJQl9WRVJTSU9OIiwgdmVyKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJaTElCX1ZFUlNJT04iLCB2ZXIpOwogCiAgICAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fdmVyc2lvbl9fIiwgIjEuMCIpOwogCmRpZmYgLS1naXQgYS9PYmplY3RzL2Fic3RyYWN0LmMgYi9PYmplY3RzL2Fic3RyYWN0LmMKaW5kZXggZmRkYWVkOC4uNzYxZTAzNSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9hYnN0cmFjdC5jCisrKyBiL09iamVjdHMvYWJzdHJhY3QuYwpAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlICJsb25naW50cmVwci5oIgogCiAjZGVmaW5lIE5FV19TVFlMRV9OVU1CRVIobykgUHlUeXBlX0hhc0ZlYXR1cmUoKG8pLT5vYl90eXBlLCBcCi0JCQkJUHlfVFBGTEFHU19DSEVDS1RZUEVTKQorICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykKIAogCiAvKiBTaG9ydGhhbmRzIHRvIHJldHVybiBjZXJ0YWluIGVycm9ycyAqLwpAQCAtMTQsMTcgKzE0LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9lcnJvcihjb25zdCBjaGFyICptc2csIFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgbXNnLCBvYmotPm9iX3R5cGUtPnRwX25hbWUpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIG1zZywgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51bGxfZXJyb3Iodm9pZCkKIHsKLQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkibnVsbCBhcmd1bWVudCB0byBpbnRlcm5hbCByb3V0aW5lIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBhcmd1bWVudCB0byBpbnRlcm5hbCByb3V0aW5lIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIE9wZXJhdGlvbnMgb24gYW55IG9iamVjdCAqLwpAQCAtMzIsNTMgKzMyLDUzIEBACiBpbnQKIFB5T2JqZWN0X0NtcChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMiwgaW50ICpyZXN1bHQpCiB7Ci0JaW50IHI7CisgICAgaW50IHI7CiAKLQlpZiAobzEgPT0gTlVMTCB8fCBvMiA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyID0gUHlPYmplY3RfQ29tcGFyZShvMSwgbzIpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnJlc3VsdCA9IHI7Ci0JcmV0dXJuIDA7CisgICAgaWYgKG8xID09IE5VTEwgfHwgbzIgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgciA9IFB5T2JqZWN0X0NvbXBhcmUobzEsIG8yKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpyZXN1bHQgPSByOworICAgIHJldHVybiAwOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9UeXBlKFB5T2JqZWN0ICpvKQogewotCVB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKLQl2ID0gKFB5T2JqZWN0ICopby0+b2JfdHlwZTsKLQlQeV9JTkNSRUYodik7Ci0JcmV0dXJuIHY7CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB2ID0gKFB5T2JqZWN0ICopby0+b2JfdHlwZTsKKyAgICBQeV9JTkNSRUYodik7CisgICAgcmV0dXJuIHY7CiB9CiAKIFB5X3NzaXplX3QKIFB5T2JqZWN0X1NpemUoUHlPYmplY3QgKm8pCiB7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKm07CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAobyA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW0gPSBvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBtLT5zcV9sZW5ndGgpCi0JCXJldHVybiBtLT5zcV9sZW5ndGgobyk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIG0tPnNxX2xlbmd0aCkKKyAgICAgICAgcmV0dXJuIG0tPnNxX2xlbmd0aChvKTsKIAotCXJldHVybiBQeU1hcHBpbmdfU2l6ZShvKTsKKyAgICByZXR1cm4gUHlNYXBwaW5nX1NpemUobyk7CiB9CiAKICN1bmRlZiBQeU9iamVjdF9MZW5ndGgKIFB5X3NzaXplX3QKIFB5T2JqZWN0X0xlbmd0aChQeU9iamVjdCAqbykKIHsKLQlyZXR1cm4gUHlPYmplY3RfU2l6ZShvKTsKKyAgICByZXR1cm4gUHlPYmplY3RfU2l6ZShvKTsKIH0KICNkZWZpbmUgUHlPYmplY3RfTGVuZ3RoIFB5T2JqZWN0X1NpemUKIApAQCAtOTIsMjY2ICs5MiwyNjYgQEAKIFB5X3NzaXplX3QKIF9QeU9iamVjdF9MZW5ndGhIaW50KFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGRlZmF1bHR2YWx1ZSkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmhpbnRzdHJvYmogPSBOVUxMOwotCVB5T2JqZWN0ICpybywgKmhpbnRtZXRoOwotCVB5X3NzaXplX3QgcnY7CisgICAgc3RhdGljIFB5T2JqZWN0ICpoaW50c3Ryb2JqID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcm8sICpoaW50bWV0aDsKKyAgICBQeV9zc2l6ZV90IHJ2OwogCi0JLyogdHJ5IG8uX19sZW5fXygpICovCi0JcnYgPSBQeU9iamVjdF9TaXplKG8pOwotCWlmIChydiA+PSAwKQotCQlyZXR1cm4gcnY7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikgJiYKLQkJCSFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQorICAgIC8qIHRyeSBvLl9fbGVuX18oKSAqLworICAgIHJ2ID0gUHlPYmplY3RfU2l6ZShvKTsKKyAgICBpZiAocnYgPj0gMCkKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpICYmCisgICAgICAgICAgICAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KIAotCWlmIChQeUluc3RhbmNlX0NoZWNrKG8pKQotCQlyZXR1cm4gZGVmYXVsdHZhbHVlOwotCS8qIHRyeSBvLl9fbGVuZ3RoX2hpbnRfXygpICovCi0gICAgICAgIGhpbnRtZXRoID0gX1B5T2JqZWN0X0xvb2t1cFNwZWNpYWwobywgIl9fbGVuZ3RoX2hpbnRfXyIsICZoaW50c3Ryb2JqKTsKLQlpZiAoaGludG1ldGggPT0gTlVMTCkgewotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJZWxzZQotCQkJcmV0dXJuIGRlZmF1bHR2YWx1ZTsKLQl9Ci0Jcm8gPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGhpbnRtZXRoLCBOVUxMKTsKLQlQeV9ERUNSRUYoaGludG1ldGgpOwotCWlmIChybyA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpICYmCi0JCSAgICAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiBkZWZhdWx0dmFsdWU7Ci0JfQotCXJ2ID0gUHlMb25nX0NoZWNrKHJvKSA/IFB5TG9uZ19Bc1NzaXplX3Qocm8pIDogZGVmYXVsdHZhbHVlOwotCVB5X0RFQ1JFRihybyk7Ci0JcmV0dXJuIHJ2OworICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKG8pKQorICAgICAgICByZXR1cm4gZGVmYXVsdHZhbHVlOworICAgIC8qIHRyeSBvLl9fbGVuZ3RoX2hpbnRfXygpICovCisgICAgaGludG1ldGggPSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbChvLCAiX19sZW5ndGhfaGludF9fIiwgJmhpbnRzdHJvYmopOworICAgIGlmIChoaW50bWV0aCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdHZhbHVlOworICAgIH0KKyAgICBybyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoaGludG1ldGgsIE5VTEwpOworICAgIFB5X0RFQ1JFRihoaW50bWV0aCk7CisgICAgaWYgKHJvID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikgJiYKKyAgICAgICAgICAgICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHR2YWx1ZTsKKyAgICB9CisgICAgcnYgPSBQeUxvbmdfQ2hlY2socm8pID8gUHlMb25nX0FzU3NpemVfdChybykgOiBkZWZhdWx0dmFsdWU7CisgICAgUHlfREVDUkVGKHJvKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0dldEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlNYXBwaW5nTWV0aG9kcyAqbTsKKyAgICBQeU1hcHBpbmdNZXRob2RzICptOwogCi0JaWYgKG8gPT0gTlVMTCB8fCBrZXkgPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAobyA9PSBOVUxMIHx8IGtleSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmc7Ci0JaWYgKG0gJiYgbS0+bXBfc3Vic2NyaXB0KQotCQlyZXR1cm4gbS0+bXBfc3Vic2NyaXB0KG8sIGtleSk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmc7CisgICAgaWYgKG0gJiYgbS0+bXBfc3Vic2NyaXB0KQorICAgICAgICByZXR1cm4gbS0+bXBfc3Vic2NyaXB0KG8sIGtleSk7CiAKLQlpZiAoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UpIHsKLQkJaWYgKFB5SW5kZXhfQ2hlY2soa2V5KSkgewotCQkJUHlfc3NpemVfdCBrZXlfdmFsdWU7Ci0JCQlrZXlfdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3Qoa2V5LCBQeUV4Y19JbmRleEVycm9yKTsKLQkJCWlmIChrZXlfdmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCXJldHVybiBQeVNlcXVlbmNlX0dldEl0ZW0obywga2V5X3ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSkKLQkJCXJldHVybiB0eXBlX2Vycm9yKCJzZXF1ZW5jZSBpbmRleCBtdXN0ICIKLQkJCQkJICAiYmUgaW50ZWdlciwgbm90ICclLjIwMHMnIiwga2V5KTsKLQl9CisgICAgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlKSB7CisgICAgICAgIGlmIChQeUluZGV4X0NoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qga2V5X3ZhbHVlOworICAgICAgICAgICAga2V5X3ZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGtleSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgICAgICBpZiAoa2V5X3ZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gUHlTZXF1ZW5jZV9HZXRJdGVtKG8sIGtleV92YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2l0ZW0pCisgICAgICAgICAgICByZXR1cm4gdHlwZV9lcnJvcigic2VxdWVuY2UgaW5kZXggbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgaW50ZWdlciwgbm90ICclLjIwMHMnIiwga2V5KTsKKyAgICB9CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBzdWJzY3JpcHRhYmxlIiwgbyk7CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBpcyBub3Qgc3Vic2NyaXB0YWJsZSIsIG8pOwogfQogCiBpbnQKIFB5T2JqZWN0X1NldEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU1hcHBpbmdNZXRob2RzICptOworICAgIFB5TWFwcGluZ01ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMIHx8IGtleSA9PSBOVUxMIHx8IHZhbHVlID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOwotCWlmIChtICYmIG0tPm1wX2Fzc19zdWJzY3JpcHQpCi0JCXJldHVybiBtLT5tcF9hc3Nfc3Vic2NyaXB0KG8sIGtleSwgdmFsdWUpOworICAgIGlmIChvID09IE5VTEwgfHwga2V5ID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmc7CisgICAgaWYgKG0gJiYgbS0+bXBfYXNzX3N1YnNjcmlwdCkKKyAgICAgICAgcmV0dXJuIG0tPm1wX2Fzc19zdWJzY3JpcHQobywga2V5LCB2YWx1ZSk7CiAKLQlpZiAoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UpIHsKLQkJaWYgKFB5SW5kZXhfQ2hlY2soa2V5KSkgewotCQkJUHlfc3NpemVfdCBrZXlfdmFsdWU7Ci0JCQlrZXlfdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3Qoa2V5LCBQeUV4Y19JbmRleEVycm9yKTsKLQkJCWlmIChrZXlfdmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXR1cm4gUHlTZXF1ZW5jZV9TZXRJdGVtKG8sIGtleV92YWx1ZSwgdmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9hc3NfaXRlbSkgewotCQkJdHlwZV9lcnJvcigic2VxdWVuY2UgaW5kZXggbXVzdCBiZSAiCi0JCQkJICAgImludGVnZXIsIG5vdCAnJS4yMDBzJyIsIGtleSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlKSB7CisgICAgICAgIGlmIChQeUluZGV4X0NoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qga2V5X3ZhbHVlOworICAgICAgICAgICAga2V5X3ZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGtleSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgICAgICBpZiAoa2V5X3ZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIFB5U2VxdWVuY2VfU2V0SXRlbShvLCBrZXlfdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfYXNzX2l0ZW0pIHsKKyAgICAgICAgICAgIHR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciwgbm90ICclLjIwMHMnIiwga2V5KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCXR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudCIsIG8pOwotCXJldHVybiAtMTsKKyAgICB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQiLCBvKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIGludAogUHlPYmplY3RfRGVsSXRlbShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSkKIHsKLQlQeU1hcHBpbmdNZXRob2RzICptOworICAgIFB5TWFwcGluZ01ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMIHx8IGtleSA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltID0gby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZzsKLQlpZiAobSAmJiBtLT5tcF9hc3Nfc3Vic2NyaXB0KQotCQlyZXR1cm4gbS0+bXBfYXNzX3N1YnNjcmlwdChvLCBrZXksIChQeU9iamVjdCopTlVMTCk7CisgICAgaWYgKG8gPT0gTlVMTCB8fCBrZXkgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmc7CisgICAgaWYgKG0gJiYgbS0+bXBfYXNzX3N1YnNjcmlwdCkKKyAgICAgICAgcmV0dXJuIG0tPm1wX2Fzc19zdWJzY3JpcHQobywga2V5LCAoUHlPYmplY3QqKU5VTEwpOwogCi0JaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlKSB7Ci0JCWlmIChQeUluZGV4X0NoZWNrKGtleSkpIHsKLQkJCVB5X3NzaXplX3Qga2V5X3ZhbHVlOwotCQkJa2V5X3ZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGtleSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCQlpZiAoa2V5X3ZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0dXJuIFB5U2VxdWVuY2VfRGVsSXRlbShvLCBrZXlfdmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9hc3NfaXRlbSkgewotCQkJdHlwZV9lcnJvcigic2VxdWVuY2UgaW5kZXggbXVzdCBiZSAiCi0JCQkJICAgImludGVnZXIsIG5vdCAnJS4yMDBzJyIsIGtleSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlKSB7CisgICAgICAgIGlmIChQeUluZGV4X0NoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qga2V5X3ZhbHVlOworICAgICAgICAgICAga2V5X3ZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGtleSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgICAgICBpZiAoa2V5X3ZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIFB5U2VxdWVuY2VfRGVsSXRlbShvLCBrZXlfdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9hc3NfaXRlbSkgeworICAgICAgICAgICAgdHlwZV9lcnJvcigic2VxdWVuY2UgaW5kZXggbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyLCBub3QgJyUuMjAwcyciLCBrZXkpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIsIG8pOwotCXJldHVybiAtMTsKKyAgICB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIiwgbyk7CisgICAgcmV0dXJuIC0xOwogfQogCiBpbnQKIFB5T2JqZWN0X0RlbEl0ZW1TdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSkKIHsKLQlQeU9iamVjdCAqb2tleTsKLQlpbnQgcmV0OworICAgIFB5T2JqZWN0ICpva2V5OworICAgIGludCByZXQ7CiAKLQlpZiAobyA9PSBOVUxMIHx8IGtleSA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlva2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOwotCWlmIChva2V5ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXQgPSBQeU9iamVjdF9EZWxJdGVtKG8sIG9rZXkpOwotCVB5X0RFQ1JFRihva2V5KTsKLQlyZXR1cm4gcmV0OworICAgIGlmIChvID09IE5VTEwgfHwga2V5ID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG9rZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7CisgICAgaWYgKG9rZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldCA9IFB5T2JqZWN0X0RlbEl0ZW0obywgb2tleSk7CisgICAgUHlfREVDUkVGKG9rZXkpOworICAgIHJldHVybiByZXQ7CiB9CiAKIGludAogUHlPYmplY3RfQXNDaGFyQnVmZmVyKFB5T2JqZWN0ICpvYmosCi0JCQkgIGNvbnN0IGNoYXIgKipidWZmZXIsCi0JCQkgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGI7Ci0JY2hhciAqcHA7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlCdWZmZXJQcm9jcyAqcGI7CisgICAgY2hhciAqcHA7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlpZiAob2JqID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyX2xlbiA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwYiA9IG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCWlmIChwYiA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0Y2hhcmJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJleHBlY3RlZCBhIGNoYXJhY3RlciBidWZmZXIgb2JqZWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCgqcGItPmJmX2dldHNlZ2NvdW50KShvYmosTlVMTCkgIT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJleHBlY3RlZCBhIHNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlsZW4gPSAoKnBiLT5iZl9nZXRjaGFyYnVmZmVyKShvYmosIDAsICZwcCk7Ci0JaWYgKGxlbiA8IDApCi0JCXJldHVybiAtMTsKLQkqYnVmZmVyID0gcHA7Ci0JKmJ1ZmZlcl9sZW4gPSBsZW47Ci0JcmV0dXJuIDA7CisgICAgaWYgKG9iaiA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlcl9sZW4gPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcGIgPSBvYmotPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICBpZiAocGIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldGNoYXJidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIGNoYXJhY3RlciBidWZmZXIgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCgqcGItPmJmX2dldHNlZ2NvdW50KShvYmosTlVMTCkgIT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgc2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGxlbiA9ICgqcGItPmJmX2dldGNoYXJidWZmZXIpKG9iaiwgMCwgJnBwKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpidWZmZXIgPSBwcDsKKyAgICAqYnVmZmVyX2xlbiA9IGxlbjsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaikKIHsKLQlQeUJ1ZmZlclByb2NzICpwYiA9IG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gb2JqLT5vYl90eXBlLT50cF9hc19idWZmZXI7CiAKLQlpZiAocGIgPT0gTlVMTCB8fAotCSAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMIHx8Ci0JICAgICgqcGItPmJmX2dldHNlZ2NvdW50KShvYmosIE5VTEwpICE9IDEpCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgIGlmIChwYiA9PSBOVUxMIHx8CisgICAgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgfHwKKyAgICAgICAgKCpwYi0+YmZfZ2V0c2VnY291bnQpKG9iaiwgTlVMTCkgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIGludCBQeU9iamVjdF9Bc1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaiwKLQkJCSAgY29uc3Qgdm9pZCAqKmJ1ZmZlciwKLQkJCSAgUHlfc3NpemVfdCAqYnVmZmVyX2xlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqYnVmZmVyX2xlbikKIHsKLQlQeUJ1ZmZlclByb2NzICpwYjsKLQl2b2lkICpwcDsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeUJ1ZmZlclByb2NzICpwYjsKKyAgICB2b2lkICpwcDsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmIChvYmogPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCB8fCBidWZmZXJfbGVuID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBiID0gb2JqLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JaWYgKHBiID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImV4cGVjdGVkIGEgcmVhZGFibGUgYnVmZmVyIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoKnBiLT5iZl9nZXRzZWdjb3VudCkob2JqLCBOVUxMKSAhPSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImV4cGVjdGVkIGEgc2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWxlbiA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKG9iaiwgMCwgJnBwKTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIC0xOwotCSpidWZmZXIgPSBwcDsKLQkqYnVmZmVyX2xlbiA9IGxlbjsKLQlyZXR1cm4gMDsKKyAgICBpZiAob2JqID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyX2xlbiA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBwYiA9IG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgIGlmIChwYiA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgcmVhZGFibGUgYnVmZmVyIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoKnBiLT5iZl9nZXRzZWdjb3VudCkob2JqLCBOVUxMKSAhPSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbGVuID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikob2JqLCAwLCAmcHApOworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKmJ1ZmZlciA9IHBwOworICAgICpidWZmZXJfbGVuID0gbGVuOworICAgIHJldHVybiAwOwogfQogCiBpbnQgUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihQeU9iamVjdCAqb2JqLAotCQkJICAgdm9pZCAqKmJ1ZmZlciwKLQkJCSAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqYnVmZmVyX2xlbikKIHsKLQlQeUJ1ZmZlclByb2NzICpwYjsKLQl2b2lkKnBwOwotCVB5X3NzaXplX3QgbGVuOworICAgIFB5QnVmZmVyUHJvY3MgKnBiOworICAgIHZvaWQqcHA7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlpZiAob2JqID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyX2xlbiA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwYiA9IG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCWlmIChwYiA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0d3JpdGVidWZmZXIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZXhwZWN0ZWQgYSB3cml0ZWFibGUgYnVmZmVyIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoKnBiLT5iZl9nZXRzZWdjb3VudCkob2JqLCBOVUxMKSAhPSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImV4cGVjdGVkIGEgc2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWxlbiA9ICgqcGItPmJmX2dldHdyaXRlYnVmZmVyKShvYmosMCwmcHApOwotCWlmIChsZW4gPCAwKQotCQlyZXR1cm4gLTE7Ci0JKmJ1ZmZlciA9IHBwOwotCSpidWZmZXJfbGVuID0gbGVuOwotCXJldHVybiAwOworICAgIGlmIChvYmogPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCB8fCBidWZmZXJfbGVuID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHBiID0gb2JqLT5vYl90eXBlLT50cF9hc19idWZmZXI7CisgICAgaWYgKHBiID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXR3cml0ZWJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgd3JpdGVhYmxlIGJ1ZmZlciBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKCpwYi0+YmZfZ2V0c2VnY291bnQpKG9iaiwgTlVMTCkgIT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgc2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGxlbiA9ICgqcGItPmJmX2dldHdyaXRlYnVmZmVyKShvYmosMCwmcHApOworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKmJ1ZmZlciA9IHBwOworICAgICpidWZmZXJfbGVuID0gbGVuOworICAgIHJldHVybiAwOwogfQogCiAvKiBCdWZmZXIgQy1BUEkgZm9yIFB5dGhvbiAzLjAgKi8KQEAgLTM1OSwxMTkgKzM1OSwxMTkgQEAKIGludAogUHlPYmplY3RfR2V0QnVmZmVyKFB5T2JqZWN0ICpvYmosIFB5X2J1ZmZlciAqdmlldywgaW50IGZsYWdzKQogewotCWlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyUxMDBzJyBkb2VzIG5vdCBoYXZlIHRoZSBidWZmZXIgaW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gKCoob2JqLT5vYl90eXBlLT50cF9hc19idWZmZXItPmJmX2dldGJ1ZmZlcikpKG9iaiwgdmlldywgZmxhZ3MpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclMTAwcycgZG9lcyBub3QgaGF2ZSB0aGUgYnVmZmVyIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iaiktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAoKihvYmotPm9iX3R5cGUtPnRwX2FzX2J1ZmZlci0+YmZfZ2V0YnVmZmVyKSkob2JqLCB2aWV3LCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIF9Jc0ZvcnRyYW5Db250aWd1b3VzKFB5X2J1ZmZlciAqdmlldykKIHsKLQlQeV9zc2l6ZV90IHNkLCBkaW07Ci0JaW50IGk7CisgICAgUHlfc3NpemVfdCBzZCwgZGltOworICAgIGludCBpOwogCi0JaWYgKHZpZXctPm5kaW0gPT0gMCkgcmV0dXJuIDE7Ci0JaWYgKHZpZXctPnN0cmlkZXMgPT0gTlVMTCkgcmV0dXJuICh2aWV3LT5uZGltID09IDEpOworICAgIGlmICh2aWV3LT5uZGltID09IDApIHJldHVybiAxOworICAgIGlmICh2aWV3LT5zdHJpZGVzID09IE5VTEwpIHJldHVybiAodmlldy0+bmRpbSA9PSAxKTsKIAotCXNkID0gdmlldy0+aXRlbXNpemU7Ci0JaWYgKHZpZXctPm5kaW0gPT0gMSkgcmV0dXJuICh2aWV3LT5zaGFwZVswXSA9PSAxIHx8Ci0JCQkJICAgc2QgPT0gdmlldy0+c3RyaWRlc1swXSk7Ci0JZm9yIChpPTA7IGk8dmlldy0+bmRpbTsgaSsrKSB7Ci0JCWRpbSA9IHZpZXctPnNoYXBlW2ldOwotCQlpZiAoZGltID09IDApIHJldHVybiAxOwotCQlpZiAodmlldy0+c3RyaWRlc1tpXSAhPSBzZCkgcmV0dXJuIDA7Ci0JCXNkICo9IGRpbTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgc2QgPSB2aWV3LT5pdGVtc2l6ZTsKKyAgICBpZiAodmlldy0+bmRpbSA9PSAxKSByZXR1cm4gKHZpZXctPnNoYXBlWzBdID09IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9PSB2aWV3LT5zdHJpZGVzWzBdKTsKKyAgICBmb3IgKGk9MDsgaTx2aWV3LT5uZGltOyBpKyspIHsKKyAgICAgICAgZGltID0gdmlldy0+c2hhcGVbaV07CisgICAgICAgIGlmIChkaW0gPT0gMCkgcmV0dXJuIDE7CisgICAgICAgIGlmICh2aWV3LT5zdHJpZGVzW2ldICE9IHNkKSByZXR1cm4gMDsKKyAgICAgICAgc2QgKj0gZGltOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogX0lzQ0NvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3KQogewotCVB5X3NzaXplX3Qgc2QsIGRpbTsKLQlpbnQgaTsKKyAgICBQeV9zc2l6ZV90IHNkLCBkaW07CisgICAgaW50IGk7CiAKLQlpZiAodmlldy0+bmRpbSA9PSAwKSByZXR1cm4gMTsKLQlpZiAodmlldy0+c3RyaWRlcyA9PSBOVUxMKSByZXR1cm4gMTsKKyAgICBpZiAodmlldy0+bmRpbSA9PSAwKSByZXR1cm4gMTsKKyAgICBpZiAodmlldy0+c3RyaWRlcyA9PSBOVUxMKSByZXR1cm4gMTsKIAotCXNkID0gdmlldy0+aXRlbXNpemU7Ci0JaWYgKHZpZXctPm5kaW0gPT0gMSkgcmV0dXJuICh2aWV3LT5zaGFwZVswXSA9PSAxIHx8Ci0JCQkJICAgc2QgPT0gdmlldy0+c3RyaWRlc1swXSk7Ci0JZm9yIChpPXZpZXctPm5kaW0tMTsgaT49MDsgaS0tKSB7Ci0JCWRpbSA9IHZpZXctPnNoYXBlW2ldOwotCQlpZiAoZGltID09IDApIHJldHVybiAxOwotCQlpZiAodmlldy0+c3RyaWRlc1tpXSAhPSBzZCkgcmV0dXJuIDA7Ci0JCXNkICo9IGRpbTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgc2QgPSB2aWV3LT5pdGVtc2l6ZTsKKyAgICBpZiAodmlldy0+bmRpbSA9PSAxKSByZXR1cm4gKHZpZXctPnNoYXBlWzBdID09IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9PSB2aWV3LT5zdHJpZGVzWzBdKTsKKyAgICBmb3IgKGk9dmlldy0+bmRpbS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgZGltID0gdmlldy0+c2hhcGVbaV07CisgICAgICAgIGlmIChkaW0gPT0gMCkgcmV0dXJuIDE7CisgICAgICAgIGlmICh2aWV3LT5zdHJpZGVzW2ldICE9IHNkKSByZXR1cm4gMDsKKyAgICAgICAgc2QgKj0gZGltOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogaW50CiBQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3LCBjaGFyIGZvcnQpCiB7CiAKLQlpZiAodmlldy0+c3Vib2Zmc2V0cyAhPSBOVUxMKSByZXR1cm4gMDsKKyAgICBpZiAodmlldy0+c3Vib2Zmc2V0cyAhPSBOVUxMKSByZXR1cm4gMDsKIAotCWlmIChmb3J0ID09ICdDJykKLQkJcmV0dXJuIF9Jc0NDb250aWd1b3VzKHZpZXcpOwotCWVsc2UgaWYgKGZvcnQgPT0gJ0YnKQotCQlyZXR1cm4gX0lzRm9ydHJhbkNvbnRpZ3VvdXModmlldyk7Ci0JZWxzZSBpZiAoZm9ydCA9PSAnQScpCi0JCXJldHVybiAoX0lzQ0NvbnRpZ3VvdXModmlldykgfHwgX0lzRm9ydHJhbkNvbnRpZ3VvdXModmlldykpOwotCXJldHVybiAwOworICAgIGlmIChmb3J0ID09ICdDJykKKyAgICAgICAgcmV0dXJuIF9Jc0NDb250aWd1b3VzKHZpZXcpOworICAgIGVsc2UgaWYgKGZvcnQgPT0gJ0YnKQorICAgICAgICByZXR1cm4gX0lzRm9ydHJhbkNvbnRpZ3VvdXModmlldyk7CisgICAgZWxzZSBpZiAoZm9ydCA9PSAnQScpCisgICAgICAgIHJldHVybiAoX0lzQ0NvbnRpZ3VvdXModmlldykgfHwgX0lzRm9ydHJhbkNvbnRpZ3VvdXModmlldykpOworICAgIHJldHVybiAwOwogfQogCiAKIHZvaWQqCiBQeUJ1ZmZlcl9HZXRQb2ludGVyKFB5X2J1ZmZlciAqdmlldywgUHlfc3NpemVfdCAqaW5kaWNlcykKIHsKLQljaGFyKiBwb2ludGVyOwotCWludCBpOwotCXBvaW50ZXIgPSAoY2hhciAqKXZpZXctPmJ1ZjsKLQlmb3IgKGkgPSAwOyBpIDwgdmlldy0+bmRpbTsgaSsrKSB7Ci0JCXBvaW50ZXIgKz0gdmlldy0+c3RyaWRlc1tpXSppbmRpY2VzW2ldOwotCQlpZiAoKHZpZXctPnN1Ym9mZnNldHMgIT0gTlVMTCkgJiYgKHZpZXctPnN1Ym9mZnNldHNbaV0gPj0gMCkpIHsKLQkJCXBvaW50ZXIgPSAqKChjaGFyKiopcG9pbnRlcikgKyB2aWV3LT5zdWJvZmZzZXRzW2ldOwotCQl9Ci0JfQotCXJldHVybiAodm9pZCopcG9pbnRlcjsKKyAgICBjaGFyKiBwb2ludGVyOworICAgIGludCBpOworICAgIHBvaW50ZXIgPSAoY2hhciAqKXZpZXctPmJ1ZjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmlldy0+bmRpbTsgaSsrKSB7CisgICAgICAgIHBvaW50ZXIgKz0gdmlldy0+c3RyaWRlc1tpXSppbmRpY2VzW2ldOworICAgICAgICBpZiAoKHZpZXctPnN1Ym9mZnNldHMgIT0gTlVMTCkgJiYgKHZpZXctPnN1Ym9mZnNldHNbaV0gPj0gMCkpIHsKKyAgICAgICAgICAgIHBvaW50ZXIgPSAqKChjaGFyKiopcG9pbnRlcikgKyB2aWV3LT5zdWJvZmZzZXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAodm9pZCopcG9pbnRlcjsKIH0KIAogCiB2b2lkCiBfYWRkX29uZV90b19pbmRleF9GKGludCBuZCwgUHlfc3NpemVfdCAqaW5kZXgsIFB5X3NzaXplX3QgKnNoYXBlKQogewotCWludCBrOworICAgIGludCBrOwogCi0JZm9yIChrPTA7IGs8bmQ7IGsrKykgewotCQlpZiAoaW5kZXhba10gPCBzaGFwZVtrXS0xKSB7Ci0JCQlpbmRleFtrXSsrOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbmRleFtrXSA9IDA7Ci0JCX0KLQl9CisgICAgZm9yIChrPTA7IGs8bmQ7IGsrKykgeworICAgICAgICBpZiAoaW5kZXhba10gPCBzaGFwZVtrXS0xKSB7CisgICAgICAgICAgICBpbmRleFtrXSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbmRleFtrXSA9IDA7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHZvaWQKIF9hZGRfb25lX3RvX2luZGV4X0MoaW50IG5kLCBQeV9zc2l6ZV90ICppbmRleCwgUHlfc3NpemVfdCAqc2hhcGUpCiB7Ci0JaW50IGs7CisgICAgaW50IGs7CiAKLQlmb3IgKGs9bmQtMTsgaz49MDsgay0tKSB7Ci0JCWlmIChpbmRleFtrXSA8IHNoYXBlW2tdLTEpIHsKLQkJCWluZGV4W2tdKys7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIHsKLQkJCWluZGV4W2tdID0gMDsKLQkJfQotCX0KKyAgICBmb3IgKGs9bmQtMTsgaz49MDsgay0tKSB7CisgICAgICAgIGlmIChpbmRleFtrXSA8IHNoYXBlW2tdLTEpIHsKKyAgICAgICAgICAgIGluZGV4W2tdKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGluZGV4W2tdID0gMDsKKyAgICAgICAgfQorICAgIH0KIH0KIAogICAvKiB2aWV3IGlzIG5vdCBjaGVja2VkIGZvciBjb25zaXN0ZW5jeSBpbiBlaXRoZXIgb2YgdGhlc2UuICBJdCBpcwpAQCAtNDgyLDQxMyArNDgyLDQxMyBAQAogaW50CiBQeUJ1ZmZlcl9Ub0NvbnRpZ3VvdXModm9pZCAqYnVmLCBQeV9idWZmZXIgKnZpZXcsIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpCiB7Ci0JaW50IGs7Ci0Jdm9pZCAoKmFkZG9uZSkoaW50LCBQeV9zc2l6ZV90ICosIFB5X3NzaXplX3QgKik7Ci0JUHlfc3NpemVfdCAqaW5kaWNlcywgZWxlbWVudHM7Ci0JY2hhciAqZGVzdCwgKnB0cjsKKyAgICBpbnQgazsKKyAgICB2b2lkICgqYWRkb25lKShpbnQsIFB5X3NzaXplX3QgKiwgUHlfc3NpemVfdCAqKTsKKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzLCBlbGVtZW50czsKKyAgICBjaGFyICpkZXN0LCAqcHRyOwogCi0JaWYgKGxlbiA+IHZpZXctPmxlbikgewotCQlsZW4gPSB2aWV3LT5sZW47Ci0JfQorICAgIGlmIChsZW4gPiB2aWV3LT5sZW4pIHsKKyAgICAgICAgbGVuID0gdmlldy0+bGVuOworICAgIH0KIAotCWlmIChQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXModmlldywgZm9ydCkpIHsKLQkJLyogc2ltcGxlc3QgY29weSBpcyBhbGwgdGhhdCBpcyBuZWVkZWQgKi8KLQkJbWVtY3B5KGJ1Ziwgdmlldy0+YnVmLCBsZW4pOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QnVmZmVyX0lzQ29udGlndW91cyh2aWV3LCBmb3J0KSkgeworICAgICAgICAvKiBzaW1wbGVzdCBjb3B5IGlzIGFsbCB0aGF0IGlzIG5lZWRlZCAqLworICAgICAgICBtZW1jcHkoYnVmLCB2aWV3LT5idWYsIGxlbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIE90aGVyd2lzZSBhIG1vcmUgZWxhYm9yYXRlIHNjaGVtZSBpcyBuZWVkZWQgKi8KKyAgICAvKiBPdGhlcndpc2UgYSBtb3JlIGVsYWJvcmF0ZSBzY2hlbWUgaXMgbmVlZGVkICovCiAKLQkvKiBYWFgobm5vcndpdHopOiBuZWVkIHRvIGNoZWNrIGZvciBvdmVyZmxvdyEgKi8KLQlpbmRpY2VzID0gKFB5X3NzaXplX3QgKilQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5X3NzaXplX3QpKih2aWV3LT5uZGltKSk7Ci0JaWYgKGluZGljZXMgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoaz0wOyBrPHZpZXctPm5kaW07aysrKSB7Ci0JCWluZGljZXNba10gPSAwOwotCX0KKyAgICAvKiBYWFgobm5vcndpdHopOiBuZWVkIHRvIGNoZWNrIGZvciBvdmVyZmxvdyEgKi8KKyAgICBpbmRpY2VzID0gKFB5X3NzaXplX3QgKilQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5X3NzaXplX3QpKih2aWV3LT5uZGltKSk7CisgICAgaWYgKGluZGljZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZvciAoaz0wOyBrPHZpZXctPm5kaW07aysrKSB7CisgICAgICAgIGluZGljZXNba10gPSAwOworICAgIH0KIAotCWlmIChmb3J0ID09ICdGJykgewotCQlhZGRvbmUgPSBfYWRkX29uZV90b19pbmRleF9GOwotCX0KLQllbHNlIHsKLQkJYWRkb25lID0gX2FkZF9vbmVfdG9faW5kZXhfQzsKLQl9Ci0JZGVzdCA9IGJ1ZjsKLQkvKiBYWFggOiBUaGlzIGlzIG5vdCBnb2luZyB0byBiZSB0aGUgZmFzdGVzdCBjb2RlIGluIHRoZSB3b3JsZAotCQkgc2V2ZXJhbCBvcHRpbWl6YXRpb25zIGFyZSBwb3NzaWJsZS4KLQkgKi8KLQllbGVtZW50cyA9IGxlbiAvIHZpZXctPml0ZW1zaXplOwotCXdoaWxlIChlbGVtZW50cy0tKSB7Ci0JCWFkZG9uZSh2aWV3LT5uZGltLCBpbmRpY2VzLCB2aWV3LT5zaGFwZSk7Ci0JCXB0ciA9IFB5QnVmZmVyX0dldFBvaW50ZXIodmlldywgaW5kaWNlcyk7Ci0JCW1lbWNweShkZXN0LCBwdHIsIHZpZXctPml0ZW1zaXplKTsKLQkJZGVzdCArPSB2aWV3LT5pdGVtc2l6ZTsKLQl9Ci0JUHlNZW1fRnJlZShpbmRpY2VzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoZm9ydCA9PSAnRicpIHsKKyAgICAgICAgYWRkb25lID0gX2FkZF9vbmVfdG9faW5kZXhfRjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFkZG9uZSA9IF9hZGRfb25lX3RvX2luZGV4X0M7CisgICAgfQorICAgIGRlc3QgPSBidWY7CisgICAgLyogWFhYIDogVGhpcyBpcyBub3QgZ29pbmcgdG8gYmUgdGhlIGZhc3Rlc3QgY29kZSBpbiB0aGUgd29ybGQKKyAgICAgICAgICAgICBzZXZlcmFsIG9wdGltaXphdGlvbnMgYXJlIHBvc3NpYmxlLgorICAgICAqLworICAgIGVsZW1lbnRzID0gbGVuIC8gdmlldy0+aXRlbXNpemU7CisgICAgd2hpbGUgKGVsZW1lbnRzLS0pIHsKKyAgICAgICAgYWRkb25lKHZpZXctPm5kaW0sIGluZGljZXMsIHZpZXctPnNoYXBlKTsKKyAgICAgICAgcHRyID0gUHlCdWZmZXJfR2V0UG9pbnRlcih2aWV3LCBpbmRpY2VzKTsKKyAgICAgICAgbWVtY3B5KGRlc3QsIHB0ciwgdmlldy0+aXRlbXNpemUpOworICAgICAgICBkZXN0ICs9IHZpZXctPml0ZW1zaXplOworICAgIH0KKyAgICBQeU1lbV9GcmVlKGluZGljZXMpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5QnVmZmVyX0Zyb21Db250aWd1b3VzKFB5X2J1ZmZlciAqdmlldywgdm9pZCAqYnVmLCBQeV9zc2l6ZV90IGxlbiwgY2hhciBmb3J0KQogewotCWludCBrOwotCXZvaWQgKCphZGRvbmUpKGludCwgUHlfc3NpemVfdCAqLCBQeV9zc2l6ZV90ICopOwotCVB5X3NzaXplX3QgKmluZGljZXMsIGVsZW1lbnRzOwotCWNoYXIgKnNyYywgKnB0cjsKKyAgICBpbnQgazsKKyAgICB2b2lkICgqYWRkb25lKShpbnQsIFB5X3NzaXplX3QgKiwgUHlfc3NpemVfdCAqKTsKKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzLCBlbGVtZW50czsKKyAgICBjaGFyICpzcmMsICpwdHI7CiAKLQlpZiAobGVuID4gdmlldy0+bGVuKSB7Ci0JCWxlbiA9IHZpZXctPmxlbjsKLQl9CisgICAgaWYgKGxlbiA+IHZpZXctPmxlbikgeworICAgICAgICBsZW4gPSB2aWV3LT5sZW47CisgICAgfQogCi0JaWYgKFB5QnVmZmVyX0lzQ29udGlndW91cyh2aWV3LCBmb3J0KSkgewotCQkvKiBzaW1wbGVzdCBjb3B5IGlzIGFsbCB0aGF0IGlzIG5lZWRlZCAqLwotCQltZW1jcHkodmlldy0+YnVmLCBidWYsIGxlbik7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlCdWZmZXJfSXNDb250aWd1b3VzKHZpZXcsIGZvcnQpKSB7CisgICAgICAgIC8qIHNpbXBsZXN0IGNvcHkgaXMgYWxsIHRoYXQgaXMgbmVlZGVkICovCisgICAgICAgIG1lbWNweSh2aWV3LT5idWYsIGJ1ZiwgbGVuKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogT3RoZXJ3aXNlIGEgbW9yZSBlbGFib3JhdGUgc2NoZW1lIGlzIG5lZWRlZCAqLworICAgIC8qIE90aGVyd2lzZSBhIG1vcmUgZWxhYm9yYXRlIHNjaGVtZSBpcyBuZWVkZWQgKi8KIAotCS8qIFhYWChubm9yd2l0eik6IG5lZWQgdG8gY2hlY2sgZm9yIG92ZXJmbG93ISAqLwotCWluZGljZXMgPSAoUHlfc3NpemVfdCAqKVB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkqKHZpZXctPm5kaW0pKTsKLQlpZiAoaW5kaWNlcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZm9yIChrPTA7IGs8dmlldy0+bmRpbTtrKyspIHsKLQkJaW5kaWNlc1trXSA9IDA7Ci0JfQorICAgIC8qIFhYWChubm9yd2l0eik6IG5lZWQgdG8gY2hlY2sgZm9yIG92ZXJmbG93ISAqLworICAgIGluZGljZXMgPSAoUHlfc3NpemVfdCAqKVB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkqKHZpZXctPm5kaW0pKTsKKyAgICBpZiAoaW5kaWNlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChrPTA7IGs8dmlldy0+bmRpbTtrKyspIHsKKyAgICAgICAgaW5kaWNlc1trXSA9IDA7CisgICAgfQogCi0JaWYgKGZvcnQgPT0gJ0YnKSB7Ci0JCWFkZG9uZSA9IF9hZGRfb25lX3RvX2luZGV4X0Y7Ci0JfQotCWVsc2UgewotCQlhZGRvbmUgPSBfYWRkX29uZV90b19pbmRleF9DOwotCX0KLQlzcmMgPSBidWY7Ci0JLyogWFhYIDogVGhpcyBpcyBub3QgZ29pbmcgdG8gYmUgdGhlIGZhc3Rlc3QgY29kZSBpbiB0aGUgd29ybGQKLQkJIHNldmVyYWwgb3B0aW1pemF0aW9ucyBhcmUgcG9zc2libGUuCi0JICovCi0JZWxlbWVudHMgPSBsZW4gLyB2aWV3LT5pdGVtc2l6ZTsKLQl3aGlsZSAoZWxlbWVudHMtLSkgewotCQlhZGRvbmUodmlldy0+bmRpbSwgaW5kaWNlcywgdmlldy0+c2hhcGUpOwotCQlwdHIgPSBQeUJ1ZmZlcl9HZXRQb2ludGVyKHZpZXcsIGluZGljZXMpOwotCQltZW1jcHkocHRyLCBzcmMsIHZpZXctPml0ZW1zaXplKTsKLQkJc3JjICs9IHZpZXctPml0ZW1zaXplOwotCX0KKyAgICBpZiAoZm9ydCA9PSAnRicpIHsKKyAgICAgICAgYWRkb25lID0gX2FkZF9vbmVfdG9faW5kZXhfRjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFkZG9uZSA9IF9hZGRfb25lX3RvX2luZGV4X0M7CisgICAgfQorICAgIHNyYyA9IGJ1ZjsKKyAgICAvKiBYWFggOiBUaGlzIGlzIG5vdCBnb2luZyB0byBiZSB0aGUgZmFzdGVzdCBjb2RlIGluIHRoZSB3b3JsZAorICAgICAgICAgICAgIHNldmVyYWwgb3B0aW1pemF0aW9ucyBhcmUgcG9zc2libGUuCisgICAgICovCisgICAgZWxlbWVudHMgPSBsZW4gLyB2aWV3LT5pdGVtc2l6ZTsKKyAgICB3aGlsZSAoZWxlbWVudHMtLSkgeworICAgICAgICBhZGRvbmUodmlldy0+bmRpbSwgaW5kaWNlcywgdmlldy0+c2hhcGUpOworICAgICAgICBwdHIgPSBQeUJ1ZmZlcl9HZXRQb2ludGVyKHZpZXcsIGluZGljZXMpOworICAgICAgICBtZW1jcHkocHRyLCBzcmMsIHZpZXctPml0ZW1zaXplKTsKKyAgICAgICAgc3JjICs9IHZpZXctPml0ZW1zaXplOworICAgIH0KIAotCVB5TWVtX0ZyZWUoaW5kaWNlcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlNZW1fRnJlZShpbmRpY2VzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50IFB5T2JqZWN0X0NvcHlEYXRhKFB5T2JqZWN0ICpkZXN0LCBQeU9iamVjdCAqc3JjKQogewotCVB5X2J1ZmZlciB2aWV3X2Rlc3QsIHZpZXdfc3JjOwotCWludCBrOwotCVB5X3NzaXplX3QgKmluZGljZXMsIGVsZW1lbnRzOwotCWNoYXIgKmRwdHIsICpzcHRyOworICAgIFB5X2J1ZmZlciB2aWV3X2Rlc3QsIHZpZXdfc3JjOworICAgIGludCBrOworICAgIFB5X3NzaXplX3QgKmluZGljZXMsIGVsZW1lbnRzOworICAgIGNoYXIgKmRwdHIsICpzcHRyOwogCi0JaWYgKCFQeU9iamVjdF9DaGVja0J1ZmZlcihkZXN0KSB8fAotCSAgICAhUHlPYmplY3RfQ2hlY2tCdWZmZXIoc3JjKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJib3RoIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2UgbXVzdCBoYXZlIHRoZSAiXAotCQkJCSJidWZmZXIgaW50ZXJmYWNlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCFQeU9iamVjdF9DaGVja0J1ZmZlcihkZXN0KSB8fAorICAgICAgICAhUHlPYmplY3RfQ2hlY2tCdWZmZXIoc3JjKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJvdGggZGVzdGluYXRpb24gYW5kIHNvdXJjZSBtdXN0IGhhdmUgdGhlICJcCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIGludGVyZmFjZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihkZXN0LCAmdmlld19kZXN0LCBQeUJVRl9GVUxMKSAhPSAwKSByZXR1cm4gLTE7Ci0JaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzcmMsICZ2aWV3X3NyYywgUHlCVUZfRlVMTF9STykgIT0gMCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoZGVzdCwgJnZpZXdfZGVzdCwgUHlCVUZfRlVMTCkgIT0gMCkgcmV0dXJuIC0xOworICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc3JjLCAmdmlld19zcmMsIFB5QlVGX0ZVTExfUk8pICE9IDApIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlld19kZXN0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICh2aWV3X2Rlc3QubGVuIDwgdmlld19zcmMubGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19CdWZmZXJFcnJvciwKLQkJCQkiZGVzdGluYXRpb24gaXMgdG9vIHNtYWxsIHRvIHJlY2VpdmUgZGF0YSBmcm9tIHNvdXJjZSIpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X3NyYyk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHZpZXdfZGVzdC5sZW4gPCB2aWV3X3NyYy5sZW4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0J1ZmZlckVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uIGlzIHRvbyBzbWFsbCB0byByZWNlaXZlIGRhdGEgZnJvbSBzb3VyY2UiKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlld19kZXN0KTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlld19zcmMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKChQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoJnZpZXdfZGVzdCwgJ0MnKSAmJgotCSAgICAgUHlCdWZmZXJfSXNDb250aWd1b3VzKCZ2aWV3X3NyYywgJ0MnKSkgfHwKLQkgICAgKFB5QnVmZmVyX0lzQ29udGlndW91cygmdmlld19kZXN0LCAnRicpICYmCi0JICAgICBQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoJnZpZXdfc3JjLCAnRicpKSkgewotCQkvKiBzaW1wbGVzdCBjb3B5IGlzIGFsbCB0aGF0IGlzIG5lZWRlZCAqLwotCQltZW1jcHkodmlld19kZXN0LmJ1Ziwgdmlld19zcmMuYnVmLCB2aWV3X3NyYy5sZW4pOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X3NyYyk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoKFB5QnVmZmVyX0lzQ29udGlndW91cygmdmlld19kZXN0LCAnQycpICYmCisgICAgICAgICBQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoJnZpZXdfc3JjLCAnQycpKSB8fAorICAgICAgICAoUHlCdWZmZXJfSXNDb250aWd1b3VzKCZ2aWV3X2Rlc3QsICdGJykgJiYKKyAgICAgICAgIFB5QnVmZmVyX0lzQ29udGlndW91cygmdmlld19zcmMsICdGJykpKSB7CisgICAgICAgIC8qIHNpbXBsZXN0IGNvcHkgaXMgYWxsIHRoYXQgaXMgbmVlZGVkICovCisgICAgICAgIG1lbWNweSh2aWV3X2Rlc3QuYnVmLCB2aWV3X3NyYy5idWYsIHZpZXdfc3JjLmxlbik7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfZGVzdCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfc3JjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogT3RoZXJ3aXNlIGEgbW9yZSBlbGFib3JhdGUgY29weSBzY2hlbWUgaXMgbmVlZGVkICovCisgICAgLyogT3RoZXJ3aXNlIGEgbW9yZSBlbGFib3JhdGUgY29weSBzY2hlbWUgaXMgbmVlZGVkICovCiAKLQkvKiBYWFgobm5vcndpdHopOiBuZWVkIHRvIGNoZWNrIGZvciBvdmVyZmxvdyEgKi8KLQlpbmRpY2VzID0gKFB5X3NzaXplX3QgKilQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5X3NzaXplX3QpKnZpZXdfc3JjLm5kaW0pOwotCWlmIChpbmRpY2VzID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmdmlld19kZXN0KTsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmdmlld19zcmMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoaz0wOyBrPHZpZXdfc3JjLm5kaW07aysrKSB7Ci0JCWluZGljZXNba10gPSAwOwotCX0KLQllbGVtZW50cyA9IDE7Ci0JZm9yIChrPTA7IGs8dmlld19zcmMubmRpbTsgaysrKSB7Ci0JCS8qIFhYWChubm9yd2l0eik6IGNhbiB0aGlzIG92ZXJmbG93PyAqLwotCQllbGVtZW50cyAqPSB2aWV3X3NyYy5zaGFwZVtrXTsKLQl9Ci0Jd2hpbGUgKGVsZW1lbnRzLS0pIHsKLQkJX2FkZF9vbmVfdG9faW5kZXhfQyh2aWV3X3NyYy5uZGltLCBpbmRpY2VzLCB2aWV3X3NyYy5zaGFwZSk7Ci0JCWRwdHIgPSBQeUJ1ZmZlcl9HZXRQb2ludGVyKCZ2aWV3X2Rlc3QsIGluZGljZXMpOwotCQlzcHRyID0gUHlCdWZmZXJfR2V0UG9pbnRlcigmdmlld19zcmMsIGluZGljZXMpOwotCQltZW1jcHkoZHB0ciwgc3B0ciwgdmlld19zcmMuaXRlbXNpemUpOwotCX0KLQlQeU1lbV9GcmVlKGluZGljZXMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfZGVzdCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmdmlld19zcmMpOwotCXJldHVybiAwOworICAgIC8qIFhYWChubm9yd2l0eik6IG5lZWQgdG8gY2hlY2sgZm9yIG92ZXJmbG93ISAqLworICAgIGluZGljZXMgPSAoUHlfc3NpemVfdCAqKVB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkqdmlld19zcmMubmRpbSk7CisgICAgaWYgKGluZGljZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X3NyYyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChrPTA7IGs8dmlld19zcmMubmRpbTtrKyspIHsKKyAgICAgICAgaW5kaWNlc1trXSA9IDA7CisgICAgfQorICAgIGVsZW1lbnRzID0gMTsKKyAgICBmb3IgKGs9MDsgazx2aWV3X3NyYy5uZGltOyBrKyspIHsKKyAgICAgICAgLyogWFhYKG5ub3J3aXR6KTogY2FuIHRoaXMgb3ZlcmZsb3c/ICovCisgICAgICAgIGVsZW1lbnRzICo9IHZpZXdfc3JjLnNoYXBlW2tdOworICAgIH0KKyAgICB3aGlsZSAoZWxlbWVudHMtLSkgeworICAgICAgICBfYWRkX29uZV90b19pbmRleF9DKHZpZXdfc3JjLm5kaW0sIGluZGljZXMsIHZpZXdfc3JjLnNoYXBlKTsKKyAgICAgICAgZHB0ciA9IFB5QnVmZmVyX0dldFBvaW50ZXIoJnZpZXdfZGVzdCwgaW5kaWNlcyk7CisgICAgICAgIHNwdHIgPSBQeUJ1ZmZlcl9HZXRQb2ludGVyKCZ2aWV3X3NyYywgaW5kaWNlcyk7CisgICAgICAgIG1lbWNweShkcHRyLCBzcHRyLCB2aWV3X3NyYy5pdGVtc2l6ZSk7CisgICAgfQorICAgIFB5TWVtX0ZyZWUoaW5kaWNlcyk7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlld19kZXN0KTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X3NyYyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQKIFB5QnVmZmVyX0ZpbGxDb250aWd1b3VzU3RyaWRlcyhpbnQgbmQsIFB5X3NzaXplX3QgKnNoYXBlLAotCQkJICAgICAgIFB5X3NzaXplX3QgKnN0cmlkZXMsIGludCBpdGVtc2l6ZSwKLQkJCSAgICAgICBjaGFyIGZvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RyaWRlcywgaW50IGl0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZm9ydCkKIHsKLQlpbnQgazsKLQlQeV9zc2l6ZV90IHNkOworICAgIGludCBrOworICAgIFB5X3NzaXplX3Qgc2Q7CiAKLQlzZCA9IGl0ZW1zaXplOwotCWlmIChmb3J0ID09ICdGJykgewotCQlmb3IgKGs9MDsgazxuZDsgaysrKSB7Ci0JCQlzdHJpZGVzW2tdID0gc2Q7Ci0JCQlzZCAqPSBzaGFwZVtrXTsKLQkJfQotCX0KLQllbHNlIHsKLQkJZm9yIChrPW5kLTE7IGs+PTA7IGstLSkgewotCQkJc3RyaWRlc1trXSA9IHNkOwotCQkJc2QgKj0gc2hhcGVba107Ci0JCX0KLQl9Ci0JcmV0dXJuOworICAgIHNkID0gaXRlbXNpemU7CisgICAgaWYgKGZvcnQgPT0gJ0YnKSB7CisgICAgICAgIGZvciAoaz0wOyBrPG5kOyBrKyspIHsKKyAgICAgICAgICAgIHN0cmlkZXNba10gPSBzZDsKKyAgICAgICAgICAgIHNkICo9IHNoYXBlW2tdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGs9bmQtMTsgaz49MDsgay0tKSB7CisgICAgICAgICAgICBzdHJpZGVzW2tdID0gc2Q7CisgICAgICAgICAgICBzZCAqPSBzaGFwZVtrXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CiB9CiAKIGludAogUHlCdWZmZXJfRmlsbEluZm8oUHlfYnVmZmVyICp2aWV3LCBQeU9iamVjdCAqb2JqLCB2b2lkICpidWYsIFB5X3NzaXplX3QgbGVuLAotCSAgICAgIGludCByZWFkb25seSwgaW50IGZsYWdzKQorICAgICAgICAgICAgICBpbnQgcmVhZG9ubHksIGludCBmbGFncykKIHsKLQlpZiAodmlldyA9PSBOVUxMKSByZXR1cm4gMDsKLQlpZiAoKChmbGFncyAmIFB5QlVGX1dSSVRBQkxFKSA9PSBQeUJVRl9XUklUQUJMRSkgJiYKLQkgICAgKHJlYWRvbmx5ID09IDEpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19CdWZmZXJFcnJvciwKLQkJCQkiT2JqZWN0IGlzIG5vdCB3cml0YWJsZS4iKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodmlldyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICBpZiAoKChmbGFncyAmIFB5QlVGX1dSSVRBQkxFKSA9PSBQeUJVRl9XUklUQUJMRSkgJiYKKyAgICAgICAgKHJlYWRvbmx5ID09IDEpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19CdWZmZXJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3QgaXMgbm90IHdyaXRhYmxlLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0Jdmlldy0+b2JqID0gb2JqOwotCWlmIChvYmopCi0JCVB5X0lOQ1JFRihvYmopOwotCXZpZXctPmJ1ZiA9IGJ1ZjsKLQl2aWV3LT5sZW4gPSBsZW47Ci0Jdmlldy0+cmVhZG9ubHkgPSByZWFkb25seTsKLQl2aWV3LT5pdGVtc2l6ZSA9IDE7Ci0Jdmlldy0+Zm9ybWF0ID0gTlVMTDsKLQlpZiAoKGZsYWdzICYgUHlCVUZfRk9STUFUKSA9PSBQeUJVRl9GT1JNQVQpCi0JCXZpZXctPmZvcm1hdCA9ICJCIjsKLQl2aWV3LT5uZGltID0gMTsKLQl2aWV3LT5zaGFwZSA9IE5VTEw7Ci0JaWYgKChmbGFncyAmIFB5QlVGX05EKSA9PSBQeUJVRl9ORCkKLQkJdmlldy0+c2hhcGUgPSAmKHZpZXctPmxlbik7Ci0Jdmlldy0+c3RyaWRlcyA9IE5VTEw7Ci0JaWYgKChmbGFncyAmIFB5QlVGX1NUUklERVMpID09IFB5QlVGX1NUUklERVMpCi0JCXZpZXctPnN0cmlkZXMgPSAmKHZpZXctPml0ZW1zaXplKTsKLQl2aWV3LT5zdWJvZmZzZXRzID0gTlVMTDsKLQl2aWV3LT5pbnRlcm5hbCA9IE5VTEw7Ci0JcmV0dXJuIDA7CisgICAgdmlldy0+b2JqID0gb2JqOworICAgIGlmIChvYmopCisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgIHZpZXctPmJ1ZiA9IGJ1ZjsKKyAgICB2aWV3LT5sZW4gPSBsZW47CisgICAgdmlldy0+cmVhZG9ubHkgPSByZWFkb25seTsKKyAgICB2aWV3LT5pdGVtc2l6ZSA9IDE7CisgICAgdmlldy0+Zm9ybWF0ID0gTlVMTDsKKyAgICBpZiAoKGZsYWdzICYgUHlCVUZfRk9STUFUKSA9PSBQeUJVRl9GT1JNQVQpCisgICAgICAgIHZpZXctPmZvcm1hdCA9ICJCIjsKKyAgICB2aWV3LT5uZGltID0gMTsKKyAgICB2aWV3LT5zaGFwZSA9IE5VTEw7CisgICAgaWYgKChmbGFncyAmIFB5QlVGX05EKSA9PSBQeUJVRl9ORCkKKyAgICAgICAgdmlldy0+c2hhcGUgPSAmKHZpZXctPmxlbik7CisgICAgdmlldy0+c3RyaWRlcyA9IE5VTEw7CisgICAgaWYgKChmbGFncyAmIFB5QlVGX1NUUklERVMpID09IFB5QlVGX1NUUklERVMpCisgICAgICAgIHZpZXctPnN0cmlkZXMgPSAmKHZpZXctPml0ZW1zaXplKTsKKyAgICB2aWV3LT5zdWJvZmZzZXRzID0gTlVMTDsKKyAgICB2aWV3LT5pbnRlcm5hbCA9IE5VTEw7CisgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQKIFB5QnVmZmVyX1JlbGVhc2UoUHlfYnVmZmVyICp2aWV3KQogewotCVB5T2JqZWN0ICpvYmogPSB2aWV3LT5vYmo7Ci0JaWYgKG9iaiAmJiBQeV9UWVBFKG9iaiktPnRwX2FzX2J1ZmZlciAmJiBQeV9UWVBFKG9iaiktPnRwX2FzX2J1ZmZlci0+YmZfcmVsZWFzZWJ1ZmZlcikKLQkJUHlfVFlQRShvYmopLT50cF9hc19idWZmZXItPmJmX3JlbGVhc2VidWZmZXIob2JqLCB2aWV3KTsKLQlQeV9YREVDUkVGKG9iaik7Ci0Jdmlldy0+b2JqID0gTlVMTDsKKyAgICBQeU9iamVjdCAqb2JqID0gdmlldy0+b2JqOworICAgIGlmIChvYmogJiYgUHlfVFlQRShvYmopLT50cF9hc19idWZmZXIgJiYgUHlfVFlQRShvYmopLT50cF9hc19idWZmZXItPmJmX3JlbGVhc2VidWZmZXIpCisgICAgICAgIFB5X1RZUEUob2JqKS0+dHBfYXNfYnVmZmVyLT5iZl9yZWxlYXNlYnVmZmVyKG9iaiwgdmlldyk7CisgICAgUHlfWERFQ1JFRihvYmopOworICAgIHZpZXctPm9iaiA9IE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0Zvcm1hdChQeU9iamVjdCogb2JqLCBQeU9iamVjdCAqZm9ybWF0X3NwZWMpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICogc3RyX19mb3JtYXRfXyA9IE5VTEw7Ci0JUHlPYmplY3QgKmVtcHR5ID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKiBzdHJfX2Zvcm1hdF9fID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZW1wdHkgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpbnQgc3BlY19pc191bmljb2RlOwotCWludCByZXN1bHRfaXNfdW5pY29kZTsKKyAgICBpbnQgc3BlY19pc191bmljb2RlOworICAgIGludCByZXN1bHRfaXNfdW5pY29kZTsKICNlbmRpZgogCi0JLyogSW5pdGlhbGl6ZSBjYWNoZWQgdmFsdWUgKi8KLQlpZiAoc3RyX19mb3JtYXRfXyA9PSBOVUxMKSB7Ci0JCS8qIEluaXRpYWxpemUgc3RhdGljIHZhcmlhYmxlIG5lZWRlZCBieSBfUHlUeXBlX0xvb2t1cCAqLwotCQlzdHJfX2Zvcm1hdF9fID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19mb3JtYXRfXyIpOwotCQlpZiAoc3RyX19mb3JtYXRfXyA9PSBOVUxMKQotCQkJZ290byBkb25lOwotCX0KKyAgICAvKiBJbml0aWFsaXplIGNhY2hlZCB2YWx1ZSAqLworICAgIGlmIChzdHJfX2Zvcm1hdF9fID09IE5VTEwpIHsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBzdGF0aWMgdmFyaWFibGUgbmVlZGVkIGJ5IF9QeVR5cGVfTG9va3VwICovCisgICAgICAgIHN0cl9fZm9ybWF0X18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2Zvcm1hdF9fIik7CisgICAgICAgIGlmIChzdHJfX2Zvcm1hdF9fID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JLyogSWYgbm8gZm9ybWF0X3NwZWMgaXMgcHJvdmlkZWQsIHVzZSBhbiBlbXB0eSBzdHJpbmcgKi8KLQlpZiAoZm9ybWF0X3NwZWMgPT0gTlVMTCkgewotCQllbXB0eSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOwotCQlmb3JtYXRfc3BlYyA9IGVtcHR5OwotCX0KKyAgICAvKiBJZiBubyBmb3JtYXRfc3BlYyBpcyBwcm92aWRlZCwgdXNlIGFuIGVtcHR5IHN0cmluZyAqLworICAgIGlmIChmb3JtYXRfc3BlYyA9PSBOVUxMKSB7CisgICAgICAgIGVtcHR5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7CisgICAgICAgIGZvcm1hdF9zcGVjID0gZW1wdHk7CisgICAgfQogCi0JLyogQ2hlY2sgdGhlIGZvcm1hdF9zcGVjIHR5cGUsIGFuZCBtYWtlIHN1cmUgaXQncyBzdHIgb3IgdW5pY29kZSAqLworICAgIC8qIENoZWNrIHRoZSBmb3JtYXRfc3BlYyB0eXBlLCBhbmQgbWFrZSBzdXJlIGl0J3Mgc3RyIG9yIHVuaWNvZGUgKi8KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhmb3JtYXRfc3BlYykpCi0JCXNwZWNfaXNfdW5pY29kZSA9IDE7Ci0JZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soZm9ybWF0X3NwZWMpKQotCQlzcGVjX2lzX3VuaWNvZGUgPSAwOwotCWVsc2UgeworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKQorICAgICAgICBzcGVjX2lzX3VuaWNvZGUgPSAxOworICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGZvcm1hdF9zcGVjKSkKKyAgICAgICAgc3BlY19pc191bmljb2RlID0gMDsKKyAgICBlbHNlIHsKICNlbHNlCi0gICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2soZm9ybWF0X3NwZWMpKSB7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhmb3JtYXRfc3BlYykpIHsKICNlbmRpZgotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZm9ybWF0IGV4cGVjdHMgYXJnIDIgdG8gYmUgc3RyaW5nICIKLQkJCSAgICAgIm9yIHVuaWNvZGUsIG5vdCAlLjEwMHMiLCBQeV9UWVBFKGZvcm1hdF9zcGVjKS0+dHBfbmFtZSk7Ci0JCWdvdG8gZG9uZTsKLQl9CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IGV4cGVjdHMgYXJnIDIgdG8gYmUgc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICJvciB1bmljb2RlLCBub3QgJS4xMDBzIiwgUHlfVFlQRShmb3JtYXRfc3BlYyktPnRwX25hbWUpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JLyogTWFrZSBzdXJlIHRoZSB0eXBlIGlzIGluaXRpYWxpemVkLiAgZmxvYXQgZ2V0cyBpbml0aWFsaXplZCBsYXRlICovCi0JaWYgKFB5X1RZUEUob2JqKS0+dHBfZGljdCA9PSBOVUxMKQotCQlpZiAoUHlUeXBlX1JlYWR5KFB5X1RZUEUob2JqKSkgPCAwKQotCQkJZ290byBkb25lOworICAgIC8qIE1ha2Ugc3VyZSB0aGUgdHlwZSBpcyBpbml0aWFsaXplZC4gIGZsb2F0IGdldHMgaW5pdGlhbGl6ZWQgbGF0ZSAqLworICAgIGlmIChQeV9UWVBFKG9iaiktPnRwX2RpY3QgPT0gTlVMTCkKKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeShQeV9UWVBFKG9iaikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKIAotCS8qIENoZWNrIGZvciBhIF9fZm9ybWF0X18gbWV0aG9kIGFuZCBjYWxsIGl0LiAqLwotCWlmIChQeUluc3RhbmNlX0NoZWNrKG9iaikpIHsKLQkJLyogV2UncmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzc2ljIGNsYXNzICovCi0JCVB5T2JqZWN0ICpib3VuZF9tZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwKLQkJCQkJCQkgIHN0cl9fZm9ybWF0X18pOwotCQlpZiAoYm91bmRfbWV0aG9kICE9IE5VTEwpIHsKLQkJCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoYm91bmRfbWV0aG9kLAotCQkJCQkJCSAgICAgIGZvcm1hdF9zcGVjLAotCQkJCQkJCSAgICAgIE5VTEwpOwotCQkJUHlfREVDUkVGKGJvdW5kX21ldGhvZCk7Ci0JCX0gZWxzZSB7Ci0JCQlQeU9iamVjdCAqc2VsZl9hc19zdHIgPSBOVUxMOwotCQkJUHlPYmplY3QgKmZvcm1hdF9tZXRob2QgPSBOVUxMOwotCQkJUHlfc3NpemVfdCBmb3JtYXRfbGVuOworICAgIC8qIENoZWNrIGZvciBhIF9fZm9ybWF0X18gbWV0aG9kIGFuZCBjYWxsIGl0LiAqLworICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgLyogV2UncmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzc2ljIGNsYXNzICovCisgICAgICAgIFB5T2JqZWN0ICpib3VuZF9tZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX19mb3JtYXRfXyk7CisgICAgICAgIGlmIChib3VuZF9tZXRob2QgIT0gTlVMTCkgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhib3VuZF9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihib3VuZF9tZXRob2QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKnNlbGZfYXNfc3RyID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmb3JtYXRfbWV0aG9kID0gTlVMTDsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgZm9ybWF0X2xlbjsKIAotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCS8qIFBlciB0aGUgUEVQLCBjb252ZXJ0IHRvIHN0ciAob3IgdW5pY29kZSwKLQkJCSAgIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgZm9ybWF0Ci0JCQkgICBzcGVjaWZpZXIpLiAgRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCB0aGlzCi0JCQkgICBsb2dpYyBpcyBkb25lIGJ5IG9iamVjdC5fX2Zvcm1hdF9fKCkuICovCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgLyogUGVyIHRoZSBQRVAsIGNvbnZlcnQgdG8gc3RyIChvciB1bmljb2RlLAorICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZSBmb3JtYXQKKyAgICAgICAgICAgICAgIHNwZWNpZmllcikuICBGb3IgbmV3LXN0eWxlIGNsYXNzZXMsIHRoaXMKKyAgICAgICAgICAgICAgIGxvZ2ljIGlzIGRvbmUgYnkgb2JqZWN0Ll9fZm9ybWF0X18oKS4gKi8KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQlpZiAoc3BlY19pc191bmljb2RlKSB7Ci0JCQkJZm9ybWF0X2xlbiA9IFB5VW5pY29kZV9HRVRfU0laRShmb3JtYXRfc3BlYyk7Ci0JCQkJc2VsZl9hc19zdHIgPSBQeU9iamVjdF9Vbmljb2RlKG9iaik7Ci0JCQl9IGVsc2UKKyAgICAgICAgICAgIGlmIChzcGVjX2lzX3VuaWNvZGUpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRfbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKGZvcm1hdF9zcGVjKTsKKyAgICAgICAgICAgICAgICBzZWxmX2FzX3N0ciA9IFB5T2JqZWN0X1VuaWNvZGUob2JqKTsKKyAgICAgICAgICAgIH0gZWxzZQogI2VuZGlmCi0JCQl7Ci0JCQkJZm9ybWF0X2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGZvcm1hdF9zcGVjKTsKLQkJCQlzZWxmX2FzX3N0ciA9IFB5T2JqZWN0X1N0cihvYmopOwotCQkJfQotCQkJaWYgKHNlbGZfYXNfc3RyID09IE5VTEwpCi0JCQkJZ290byBkb25lMTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZm9ybWF0X3NwZWMpOworICAgICAgICAgICAgICAgIHNlbGZfYXNfc3RyID0gUHlPYmplY3RfU3RyKG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VsZl9hc19zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmUxOwogCi0JCQlpZiAoZm9ybWF0X2xlbiA+IDApIHsKLQkJCQkvKiBTZWUgdGhlIGFsbW9zdCBpZGVudGljYWwgY29kZSBpbgotCQkJCSAgIHR5cGVvYmplY3QuYyBmb3IgbmV3LXN0eWxlCi0JCQkJICAgY2xhc3Nlcy4gKi8KLQkJCQlpZiAoUHlFcnJfV2FybkV4KAotCQkJCQlQeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCQkib2JqZWN0Ll9fZm9ybWF0X18gd2l0aCBhIG5vbi1lbXB0eSAiCi0JCQkJCSJmb3JtYXQgc3RyaW5nIGlzIGRlcHJlY2F0ZWQiLCAxKQotCQkJCSAgICAgPCAwKSB7Ci0JCQkJCWdvdG8gZG9uZTE7Ci0JCQkJfQotCQkJCS8qIEV2ZW50dWFsbHkgdGhpcyB3aWxsIGJlY29tZSBhbgotCQkJCSAgIGVycm9yOgotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgIm5vbi1lbXB0eSBmb3JtYXQgc3RyaW5nIHBhc3NlZCB0byAiCi0JCQkJICAgIm9iamVjdC5fX2Zvcm1hdF9fIik7Ci0JCQkJZ290byBkb25lMTsKLQkJCQkqLwotCQkJfQorICAgICAgICAgICAgaWYgKGZvcm1hdF9sZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgLyogU2VlIHRoZSBhbG1vc3QgaWRlbnRpY2FsIGNvZGUgaW4KKyAgICAgICAgICAgICAgICAgICB0eXBlb2JqZWN0LmMgZm9yIG5ldy1zdHlsZQorICAgICAgICAgICAgICAgICAgIGNsYXNzZXMuICovCisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeCgKKyAgICAgICAgICAgICAgICAgICAgUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgIm9iamVjdC5fX2Zvcm1hdF9fIHdpdGggYSBub24tZW1wdHkgIgorICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IHN0cmluZyBpcyBkZXByZWNhdGVkIiwgMSkKKyAgICAgICAgICAgICAgICAgICAgIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmUxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBFdmVudHVhbGx5IHRoaXMgd2lsbCBiZWNvbWUgYW4KKyAgICAgICAgICAgICAgICAgICBlcnJvcjoKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJub24tZW1wdHkgZm9ybWF0IHN0cmluZyBwYXNzZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICJvYmplY3QuX19mb3JtYXRfXyIpOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTE7CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KIAotCQkJLyogVGhlbiBjYWxsIHN0ci5fX2Zvcm1hdF9fIG9uIHRoYXQgcmVzdWx0ICovCi0JCQlmb3JtYXRfbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0cihzZWxmX2FzX3N0ciwKLQkJCQkJCQkgc3RyX19mb3JtYXRfXyk7Ci0JCQlpZiAoZm9ybWF0X21ldGhvZCA9PSBOVUxMKSB7Ci0JCQkJZ290byBkb25lMTsKLQkJCX0KLQkJCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZm9ybWF0X21ldGhvZCwKLQkJCQkJCQkgICAgICBmb3JtYXRfc3BlYywKLQkJCQkJCQkgICAgICBOVUxMKTsKKyAgICAgICAgICAgIC8qIFRoZW4gY2FsbCBzdHIuX19mb3JtYXRfXyBvbiB0aGF0IHJlc3VsdCAqLworICAgICAgICAgICAgZm9ybWF0X21ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIoc2VsZl9hc19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfX2Zvcm1hdF9fKTsKKyAgICAgICAgICAgIGlmIChmb3JtYXRfbWV0aG9kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmUxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmb3JtYXRfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiBkb25lMToKLQkJCVB5X1hERUNSRUYoc2VsZl9hc19zdHIpOwotCQkJUHlfWERFQ1JFRihmb3JtYXRfbWV0aG9kKTsKLQkJCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCQlnb3RvIGRvbmU7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBOb3QgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzc2ljIGNsYXNzLCB1c2UgdGhlIGNvZGUKLQkJICAgZnJvbSBweTNrICovCisgICAgICAgICAgICBQeV9YREVDUkVGKHNlbGZfYXNfc3RyKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoZm9ybWF0X21ldGhvZCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTm90IGFuIGluc3RhbmNlIG9mIGEgY2xhc3NpYyBjbGFzcywgdXNlIHRoZSBjb2RlCisgICAgICAgICAgIGZyb20gcHkzayAqLwogCi0JCS8qIEZpbmQgdGhlICh1bmJvdW5kISkgX19mb3JtYXRfXyBtZXRob2QgKGEgYm9ycm93ZWQKLQkJICAgcmVmZXJlbmNlKSAqLwotCQlQeU9iamVjdCAqbWV0aG9kID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShvYmopLAotCQkJCQkJICBzdHJfX2Zvcm1hdF9fKTsKLQkJaWYgKG1ldGhvZCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIlR5cGUgJS4xMDBzIGRvZXNuJ3QgZGVmaW5lIF9fZm9ybWF0X18iLAotCQkJCSAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQkvKiBBbmQgY2FsbCBpdCwgYmluZGluZyBpdCB0byB0aGUgdmFsdWUgKi8KLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtZXRob2QsIG9iaiwKLQkJCQkJCSAgICAgIGZvcm1hdF9zcGVjLCBOVUxMKTsKLQl9CisgICAgICAgIC8qIEZpbmQgdGhlICh1bmJvdW5kISkgX19mb3JtYXRfXyBtZXRob2QgKGEgYm9ycm93ZWQKKyAgICAgICAgICAgcmVmZXJlbmNlKSAqLworICAgICAgICBQeU9iamVjdCAqbWV0aG9kID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShvYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX19mb3JtYXRfXyk7CisgICAgICAgIGlmIChtZXRob2QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVHlwZSAlLjEwMHMgZG9lc24ndCBkZWZpbmUgX19mb3JtYXRfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgICAvKiBBbmQgY2FsbCBpdCwgYmluZGluZyBpdCB0byB0aGUgdmFsdWUgKi8KKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtZXRob2QsIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3BlYywgTlVMTCk7CisgICAgfQogCi0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlnb3RvIGRvbmU7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICBnb3RvIGRvbmU7CiAKLQkvKiBDaGVjayB0aGUgcmVzdWx0IHR5cGUsIGFuZCBtYWtlIHN1cmUgaXQncyBzdHIgb3IgdW5pY29kZSAqLworICAgIC8qIENoZWNrIHRoZSByZXN1bHQgdHlwZSwgYW5kIG1ha2Ugc3VyZSBpdCdzIHN0ciBvciB1bmljb2RlICovCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2socmVzdWx0KSkKLQkJcmVzdWx0X2lzX3VuaWNvZGUgPSAxOwotCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHJlc3VsdCkpCi0JCXJlc3VsdF9pc191bmljb2RlID0gMDsKLQllbHNlIHsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHJlc3VsdCkpCisgICAgICAgIHJlc3VsdF9pc191bmljb2RlID0gMTsKKyAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhyZXN1bHQpKQorICAgICAgICByZXN1bHRfaXNfdW5pY29kZSA9IDA7CisgICAgZWxzZSB7CiAjZWxzZQotCWlmICghUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkgeworICAgIGlmICghUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkgewogI2VuZGlmCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIlLjEwMHMuX19mb3JtYXRfXyBtdXN0IHJldHVybiBzdHJpbmcgb3IgIgotCQkJICAgICAidW5pY29kZSwgbm90ICUuMTAwcyIsIFB5X1RZUEUob2JqKS0+dHBfbmFtZSwKLQkJCSAgICAgUHlfVFlQRShyZXN1bHQpLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJlc3VsdCA9IE5VTEw7Ci0JCWdvdG8gZG9uZTsKLQl9CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJS4xMDBzLl9fZm9ybWF0X18gbXVzdCByZXR1cm4gc3RyaW5nIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICJ1bmljb2RlLCBub3QgJS4xMDBzIiwgUHlfVFlQRShvYmopLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShyZXN1bHQpLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQkvKiBDb252ZXJ0IHRvIHVuaWNvZGUsIGlmIG5lZWRlZC4gIFJlcXVpcmVkIGlmIHNwZWMgaXMgdW5pY29kZQotCSAgIGFuZCByZXN1bHQgaXMgc3RyICovCisgICAgLyogQ29udmVydCB0byB1bmljb2RlLCBpZiBuZWVkZWQuICBSZXF1aXJlZCBpZiBzcGVjIGlzIHVuaWNvZGUKKyAgICAgICBhbmQgcmVzdWx0IGlzIHN0ciAqLwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoc3BlY19pc191bmljb2RlICYmICFyZXN1bHRfaXNfdW5pY29kZSkgewotCQlQeU9iamVjdCAqdG1wID0gUHlPYmplY3RfVW5pY29kZShyZXN1bHQpOwotCQkvKiBUaGlzIGxvZ2ljIHdvcmtzIHdoZXRoZXIgb3Igbm90IHRtcCBpcyBOVUxMICovCi0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSB0bXA7Ci0JfQorICAgIGlmIChzcGVjX2lzX3VuaWNvZGUgJiYgIXJlc3VsdF9pc191bmljb2RlKSB7CisgICAgICAgIFB5T2JqZWN0ICp0bXAgPSBQeU9iamVjdF9Vbmljb2RlKHJlc3VsdCk7CisgICAgICAgIC8qIFRoaXMgbG9naWMgd29ya3Mgd2hldGhlciBvciBub3QgdG1wIGlzIE5VTEwgKi8KKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IHRtcDsKKyAgICB9CiAjZW5kaWYKIAogZG9uZToKLQlQeV9YREVDUkVGKGVtcHR5KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYoZW1wdHkpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIE9wZXJhdGlvbnMgb24gbnVtYmVycyAqLwpAQCAtODk2LDkgKzg5Niw5IEBACiBpbnQKIFB5TnVtYmVyX0NoZWNrKFB5T2JqZWN0ICpvKQogewotCXJldHVybiBvICYmIG8tPm9iX3R5cGUtPnRwX2FzX251bWJlciAmJgotCSAgICAgICAoby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9pbnQgfHwKLQkJby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9mbG9hdCk7CisgICAgcmV0dXJuIG8gJiYgby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICYmCisgICAgICAgICAgIChvLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2ludCB8fAorICAgICAgICBvLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2Zsb2F0KTsKIH0KIAogLyogQmluYXJ5IG9wZXJhdG9ycyAqLwpAQCAtOTA3LDE5ICs5MDcsMTkgQEAKIAogI2RlZmluZSBOQl9TTE9UKHgpIG9mZnNldG9mKFB5TnVtYmVyTWV0aG9kcywgeCkKICNkZWZpbmUgTkJfQklOT1AobmJfbWV0aG9kcywgc2xvdCkgXAotCQkoKihiaW5hcnlmdW5jKikoJiAoKGNoYXIqKW5iX21ldGhvZHMpW3Nsb3RdKSkKKyAgICAgICAgKCooYmluYXJ5ZnVuYyopKCYgKChjaGFyKiluYl9tZXRob2RzKVtzbG90XSkpCiAjZGVmaW5lIE5CX1RFUk5PUChuYl9tZXRob2RzLCBzbG90KSBcCi0JCSgqKHRlcm5hcnlmdW5jKikoJiAoKGNoYXIqKW5iX21ldGhvZHMpW3Nsb3RdKSkKKyAgICAgICAgKCoodGVybmFyeWZ1bmMqKSgmICgoY2hhciopbmJfbWV0aG9kcylbc2xvdF0pKQogCiAvKgogICBDYWxsaW5nIHNjaGVtZSB1c2VkIGZvciBiaW5hcnkgb3BlcmF0aW9uczoKIAotICB2CXcJQWN0aW9uCisgIHYgICAgIHcgICAgICAgQWN0aW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgbmV3CW5ldwl3Lm9wKHYsdylbKl0sIHYub3Aodix3KSwgdy5vcCh2LHcpCi0gIG5ldwlvbGQJdi5vcCh2LHcpLCBjb2VyY2Uodix3KSwgdi5vcCh2LHcpCi0gIG9sZAluZXcJdy5vcCh2LHcpLCBjb2VyY2Uodix3KSwgdi5vcCh2LHcpCi0gIG9sZAlvbGQJY29lcmNlKHYsdyksIHYub3Aodix3KQorICBuZXcgICBuZXcgICAgIHcub3Aodix3KVsqXSwgdi5vcCh2LHcpLCB3Lm9wKHYsdykKKyAgbmV3ICAgb2xkICAgICB2Lm9wKHYsdyksIGNvZXJjZSh2LHcpLCB2Lm9wKHYsdykKKyAgb2xkICAgbmV3ICAgICB3Lm9wKHYsdyksIGNvZXJjZSh2LHcpLCB2Lm9wKHYsdykKKyAgb2xkICAgb2xkICAgICBjb2VyY2Uodix3KSwgdi5vcCh2LHcpCiAKICAgWypdIG9ubHkgd2hlbiB2LT5vYl90eXBlICE9IHctPm9iX3R5cGUgJiYgdy0+b2JfdHlwZSBpcyBhIHN1YmNsYXNzIG9mCiAgICAgICB2LT5vYl90eXBlCkBAIC05MzYsODQgKzkzNiw4NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFyeV9vcDEoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjb25zdCBpbnQgb3Bfc2xvdCkKIHsKLQlQeU9iamVjdCAqeDsKLQliaW5hcnlmdW5jIHNsb3R2ID0gTlVMTDsKLQliaW5hcnlmdW5jIHNsb3R3ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqeDsKKyAgICBiaW5hcnlmdW5jIHNsb3R2ID0gTlVMTDsKKyAgICBiaW5hcnlmdW5jIHNsb3R3ID0gTlVMTDsKIAotCWlmICh2LT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJiBORVdfU1RZTEVfTlVNQkVSKHYpKQotCQlzbG90diA9IE5CX0JJTk9QKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciwgb3Bfc2xvdCk7Ci0JaWYgKHctPm9iX3R5cGUgIT0gdi0+b2JfdHlwZSAmJgotCSAgICB3LT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJiBORVdfU1RZTEVfTlVNQkVSKHcpKSB7Ci0JCXNsb3R3ID0gTkJfQklOT1Aody0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLCBvcF9zbG90KTsKLQkJaWYgKHNsb3R3ID09IHNsb3R2KQotCQkJc2xvdHcgPSBOVUxMOwotCX0KLQlpZiAoc2xvdHYpIHsKLQkJaWYgKHNsb3R3ICYmIFB5VHlwZV9Jc1N1YnR5cGUody0+b2JfdHlwZSwgdi0+b2JfdHlwZSkpIHsKLQkJCXggPSBzbG90dyh2LCB3KTsKLQkJCWlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJCXJldHVybiB4OwotCQkJUHlfREVDUkVGKHgpOyAvKiBjYW4ndCBkbyBpdCAqLwotCQkJc2xvdHcgPSBOVUxMOwotCQl9Ci0JCXggPSBzbG90dih2LCB3KTsKLQkJaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4geDsKLQkJUHlfREVDUkVGKHgpOyAvKiBjYW4ndCBkbyBpdCAqLwotCX0KLQlpZiAoc2xvdHcpIHsKLQkJeCA9IHNsb3R3KHYsIHcpOwotCQlpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiB4OwotCQlQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCi0JfQotCWlmICghTkVXX1NUWUxFX05VTUJFUih2KSB8fCAhTkVXX1NUWUxFX05VTUJFUih3KSkgewotCQlpbnQgZXJyID0gUHlOdW1iZXJfQ29lcmNlRXgoJnYsICZ3KTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChlcnIgPT0gMCkgewotCQkJUHlOdW1iZXJNZXRob2RzICptdiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQkJCWlmIChtdikgewotCQkJCWJpbmFyeWZ1bmMgc2xvdDsKLQkJCQlzbG90ID0gTkJfQklOT1AobXYsIG9wX3Nsb3QpOwotCQkJCWlmIChzbG90KSB7Ci0JCQkJCXggPSBzbG90KHYsIHcpOwotCQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJCVB5X0RFQ1JFRih3KTsKLQkJCQkJcmV0dXJuIHg7Ci0JCQkJfQotCQkJfQotCQkJLyogQ29lcmNlRXggaW5jcmVtZW50ZWQgdGhlIHJlZmVyZW5jZSBjb3VudHMgKi8KLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJfQotCX0KLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBpZiAodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYgTkVXX1NUWUxFX05VTUJFUih2KSkKKyAgICAgICAgc2xvdHYgPSBOQl9CSU5PUCh2LT5vYl90eXBlLT50cF9hc19udW1iZXIsIG9wX3Nsb3QpOworICAgIGlmICh3LT5vYl90eXBlICE9IHYtPm9iX3R5cGUgJiYKKyAgICAgICAgdy0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYgTkVXX1NUWUxFX05VTUJFUih3KSkgeworICAgICAgICBzbG90dyA9IE5CX0JJTk9QKHctPm9iX3R5cGUtPnRwX2FzX251bWJlciwgb3Bfc2xvdCk7CisgICAgICAgIGlmIChzbG90dyA9PSBzbG90dikKKyAgICAgICAgICAgIHNsb3R3ID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHNsb3R2KSB7CisgICAgICAgIGlmIChzbG90dyAmJiBQeVR5cGVfSXNTdWJ0eXBlKHctPm9iX3R5cGUsIHYtPm9iX3R5cGUpKSB7CisgICAgICAgICAgICB4ID0gc2xvdHcodiwgdyk7CisgICAgICAgICAgICBpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KKyAgICAgICAgICAgIHNsb3R3ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB4ID0gc2xvdHYodiwgdyk7CisgICAgICAgIGlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIFB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KKyAgICB9CisgICAgaWYgKHNsb3R3KSB7CisgICAgICAgIHggPSBzbG90dyh2LCB3KTsKKyAgICAgICAgaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgUHlfREVDUkVGKHgpOyAvKiBjYW4ndCBkbyBpdCAqLworICAgIH0KKyAgICBpZiAoIU5FV19TVFlMRV9OVU1CRVIodikgfHwgIU5FV19TVFlMRV9OVU1CRVIodykpIHsKKyAgICAgICAgaW50IGVyciA9IFB5TnVtYmVyX0NvZXJjZUV4KCZ2LCAmdyk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgIFB5TnVtYmVyTWV0aG9kcyAqbXYgPSB2LT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgICAgICAgICBpZiAobXYpIHsKKyAgICAgICAgICAgICAgICBiaW5hcnlmdW5jIHNsb3Q7CisgICAgICAgICAgICAgICAgc2xvdCA9IE5CX0JJTk9QKG12LCBvcF9zbG90KTsKKyAgICAgICAgICAgICAgICBpZiAoc2xvdCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gc2xvdCh2LCB3KTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIENvZXJjZUV4IGluY3JlbWVudGVkIHRoZSByZWZlcmVuY2UgY291bnRzICovCisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5vcF90eXBlX2Vycm9yKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgY29uc3QgY2hhciAqb3BfbmFtZSkKIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICUuMTAwczogIgotCQkgICAgICInJS4xMDBzJyBhbmQgJyUuMTAwcyciLAotCQkgICAgIG9wX25hbWUsCi0JCSAgICAgdi0+b2JfdHlwZS0+dHBfbmFtZSwKLQkJICAgICB3LT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAlLjEwMHM6ICIKKyAgICAgICAgICAgICAgICAgIiclLjEwMHMnIGFuZCAnJS4xMDBzJyIsCisgICAgICAgICAgICAgICAgIG9wX25hbWUsCisgICAgICAgICAgICAgICAgIHYtPm9iX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgIHctPm9iX3R5cGUtPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXJ5X29wKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgY29uc3QgaW50IG9wX3Nsb3QsIGNvbnN0IGNoYXIgKm9wX25hbWUpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9vcDEodiwgdywgb3Bfc2xvdCk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIGJpbm9wX3R5cGVfZXJyb3Iodiwgdywgb3BfbmFtZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9vcDEodiwgdywgb3Bfc2xvdCk7CisgICAgaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIGJpbm9wX3R5cGVfZXJyb3Iodiwgdywgb3BfbmFtZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIApAQCAtMTAyMiwxNiArMTAyMiwxNiBAQAogCiAgICoqKiBJbiBzb21lIGNhc2VzLCB3Lm9wIGlzIGNhbGxlZCBiZWZvcmUgdi5vcDsgc2VlIGJpbmFyeV9vcDEuICoqKgogCi0gIHYJdwl6CUFjdGlvbgorICB2ICAgICB3ICAgICAgIHogICAgICAgQWN0aW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgbmV3CW5ldwluZXcJdi5vcCh2LHcseiksIHcub3Aodix3LHopLCB6Lm9wKHYsdyx6KQotICBuZXcJb2xkCW5ldwl2Lm9wKHYsdyx6KSwgei5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCi0gIG9sZAluZXcJbmV3CXcub3Aodix3LHopLCB6Lm9wKHYsdyx6KSwgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKLSAgb2xkCW9sZAluZXcJei5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCi0gIG5ldwluZXcJb2xkCXYub3Aodix3LHopLCB3Lm9wKHYsdyx6KSwgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKLSAgbmV3CW9sZAlvbGQJdi5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCi0gIG9sZAluZXcJb2xkCXcub3Aodix3LHopLCBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQotICBvbGQJb2xkCW9sZAljb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQorICBuZXcgICBuZXcgICAgIG5ldyAgICAgdi5vcCh2LHcseiksIHcub3Aodix3LHopLCB6Lm9wKHYsdyx6KQorICBuZXcgICBvbGQgICAgIG5ldyAgICAgdi5vcCh2LHcseiksIHoub3Aodix3LHopLCBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQorICBvbGQgICBuZXcgICAgIG5ldyAgICAgdy5vcCh2LHcseiksIHoub3Aodix3LHopLCBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQorICBvbGQgICBvbGQgICAgIG5ldyAgICAgei5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCisgIG5ldyAgIG5ldyAgICAgb2xkICAgICB2Lm9wKHYsdyx6KSwgdy5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCisgIG5ldyAgIG9sZCAgICAgb2xkICAgICB2Lm9wKHYsdyx6KSwgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKKyAgb2xkICAgbmV3ICAgICBvbGQgICAgIHcub3Aodix3LHopLCBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQorICBvbGQgICBvbGQgICAgIG9sZCAgICAgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKIAogICBMZWdlbmQ6CiAgIC0tLS0tLS0KQEAgLTEwNDcsMTQxICsxMDQ3LDE0MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVybmFyeV9vcChQeU9iamVjdCAqdiwKLQkgICBQeU9iamVjdCAqdywKLQkgICBQeU9iamVjdCAqeiwKLQkgICBjb25zdCBpbnQgb3Bfc2xvdCwKLQkgICBjb25zdCBjaGFyICpvcF9uYW1lKQorICAgICAgICAgICBQeU9iamVjdCAqdywKKyAgICAgICAgICAgUHlPYmplY3QgKnosCisgICAgICAgICAgIGNvbnN0IGludCBvcF9zbG90LAorICAgICAgICAgICBjb25zdCBjaGFyICpvcF9uYW1lKQogewotCVB5TnVtYmVyTWV0aG9kcyAqbXYsICptdywgKm16OwotCVB5T2JqZWN0ICp4ID0gTlVMTDsKLQl0ZXJuYXJ5ZnVuYyBzbG90diA9IE5VTEw7Ci0JdGVybmFyeWZ1bmMgc2xvdHcgPSBOVUxMOwotCXRlcm5hcnlmdW5jIHNsb3R6ID0gTlVMTDsKKyAgICBQeU51bWJlck1ldGhvZHMgKm12LCAqbXcsICptejsKKyAgICBQeU9iamVjdCAqeCA9IE5VTEw7CisgICAgdGVybmFyeWZ1bmMgc2xvdHYgPSBOVUxMOworICAgIHRlcm5hcnlmdW5jIHNsb3R3ID0gTlVMTDsKKyAgICB0ZXJuYXJ5ZnVuYyBzbG90eiA9IE5VTEw7CiAKLQltdiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQltdyA9IHctPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobXYgIT0gTlVMTCAmJiBORVdfU1RZTEVfTlVNQkVSKHYpKQotCQlzbG90diA9IE5CX1RFUk5PUChtdiwgb3Bfc2xvdCk7Ci0JaWYgKHctPm9iX3R5cGUgIT0gdi0+b2JfdHlwZSAmJgotCSAgICBtdyAhPSBOVUxMICYmIE5FV19TVFlMRV9OVU1CRVIodykpIHsKLQkJc2xvdHcgPSBOQl9URVJOT1AobXcsIG9wX3Nsb3QpOwotCQlpZiAoc2xvdHcgPT0gc2xvdHYpCi0JCQlzbG90dyA9IE5VTEw7Ci0JfQotCWlmIChzbG90dikgewotCQlpZiAoc2xvdHcgJiYgUHlUeXBlX0lzU3VidHlwZSh3LT5vYl90eXBlLCB2LT5vYl90eXBlKSkgewotCQkJeCA9IHNsb3R3KHYsIHcsIHopOwotCQkJaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQkJcmV0dXJuIHg7Ci0JCQlQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCi0JCQlzbG90dyA9IE5VTEw7Ci0JCX0KLQkJeCA9IHNsb3R2KHYsIHcsIHopOwotCQlpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiB4OwotCQlQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCi0JfQotCWlmIChzbG90dykgewotCQl4ID0gc2xvdHcodiwgdywgeik7Ci0JCWlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHg7Ci0JCVB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KLQl9Ci0JbXogPSB6LT5vYl90eXBlLT50cF9hc19udW1iZXI7Ci0JaWYgKG16ICE9IE5VTEwgJiYgTkVXX1NUWUxFX05VTUJFUih6KSkgewotCQlzbG90eiA9IE5CX1RFUk5PUChteiwgb3Bfc2xvdCk7Ci0JCWlmIChzbG90eiA9PSBzbG90diB8fCBzbG90eiA9PSBzbG90dykKLQkJCXNsb3R6ID0gTlVMTDsKLQkJaWYgKHNsb3R6KSB7Ci0JCQl4ID0gc2xvdHoodiwgdywgeik7Ci0JCQlpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCQlyZXR1cm4geDsKLQkJCVB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KLQkJfQotCX0KKyAgICBtdiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBtdyA9IHctPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobXYgIT0gTlVMTCAmJiBORVdfU1RZTEVfTlVNQkVSKHYpKQorICAgICAgICBzbG90diA9IE5CX1RFUk5PUChtdiwgb3Bfc2xvdCk7CisgICAgaWYgKHctPm9iX3R5cGUgIT0gdi0+b2JfdHlwZSAmJgorICAgICAgICBtdyAhPSBOVUxMICYmIE5FV19TVFlMRV9OVU1CRVIodykpIHsKKyAgICAgICAgc2xvdHcgPSBOQl9URVJOT1AobXcsIG9wX3Nsb3QpOworICAgICAgICBpZiAoc2xvdHcgPT0gc2xvdHYpCisgICAgICAgICAgICBzbG90dyA9IE5VTEw7CisgICAgfQorICAgIGlmIChzbG90dikgeworICAgICAgICBpZiAoc2xvdHcgJiYgUHlUeXBlX0lzU3VidHlwZSh3LT5vYl90eXBlLCB2LT5vYl90eXBlKSkgeworICAgICAgICAgICAgeCA9IHNsb3R3KHYsIHcsIHopOworICAgICAgICAgICAgaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgICAgICBQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCisgICAgICAgICAgICBzbG90dyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgeCA9IHNsb3R2KHYsIHcsIHopOworICAgICAgICBpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICBQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCisgICAgfQorICAgIGlmIChzbG90dykgeworICAgICAgICB4ID0gc2xvdHcodiwgdywgeik7CisgICAgICAgIGlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIFB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KKyAgICB9CisgICAgbXogPSB6LT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgaWYgKG16ICE9IE5VTEwgJiYgTkVXX1NUWUxFX05VTUJFUih6KSkgeworICAgICAgICBzbG90eiA9IE5CX1RFUk5PUChteiwgb3Bfc2xvdCk7CisgICAgICAgIGlmIChzbG90eiA9PSBzbG90diB8fCBzbG90eiA9PSBzbG90dykKKyAgICAgICAgICAgIHNsb3R6ID0gTlVMTDsKKyAgICAgICAgaWYgKHNsb3R6KSB7CisgICAgICAgICAgICB4ID0gc2xvdHoodiwgdywgeik7CisgICAgICAgICAgICBpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KKyAgICAgICAgfQorICAgIH0KIAotCWlmICghTkVXX1NUWUxFX05VTUJFUih2KSB8fCAhTkVXX1NUWUxFX05VTUJFUih3KSB8fAotCQkJKHogIT0gUHlfTm9uZSAmJiAhTkVXX1NUWUxFX05VTUJFUih6KSkpIHsKLQkJLyogd2UgaGF2ZSBhbiBvbGQgc3R5bGUgb3BlcmFuZCwgY29lcmNlICovCi0JCVB5T2JqZWN0ICp2MSwgKnoxLCAqdzIsICp6MjsKLQkJaW50IGM7CisgICAgaWYgKCFORVdfU1RZTEVfTlVNQkVSKHYpIHx8ICFORVdfU1RZTEVfTlVNQkVSKHcpIHx8CisgICAgICAgICAgICAgICAgICAgICh6ICE9IFB5X05vbmUgJiYgIU5FV19TVFlMRV9OVU1CRVIoeikpKSB7CisgICAgICAgIC8qIHdlIGhhdmUgYW4gb2xkIHN0eWxlIG9wZXJhbmQsIGNvZXJjZSAqLworICAgICAgICBQeU9iamVjdCAqdjEsICp6MSwgKncyLCAqejI7CisgICAgICAgIGludCBjOwogCi0JCWMgPSBQeU51bWJlcl9Db2VyY2UoJnYsICZ3KTsKLQkJaWYgKGMgIT0gMCkKLQkJCWdvdG8gZXJyb3IzOworICAgICAgICBjID0gUHlOdW1iZXJfQ29lcmNlKCZ2LCAmdyk7CisgICAgICAgIGlmIChjICE9IDApCisgICAgICAgICAgICBnb3RvIGVycm9yMzsKIAotCQkvKiBTcGVjaWFsIGNhc2U6IGlmIHRoZSB0aGlyZCBhcmd1bWVudCBpcyBOb25lLCBpdCBpcwotCQkgICB0cmVhdGVkIGFzIGFic2VudCBhcmd1bWVudCBhbmQgbm90IGNvZXJjZWQuICovCi0JCWlmICh6ID09IFB5X05vbmUpIHsKLQkJCWlmICh2LT5vYl90eXBlLT50cF9hc19udW1iZXIpIHsKLQkJCQlzbG90eiA9IE5CX1RFUk5PUCh2LT5vYl90eXBlLT50cF9hc19udW1iZXIsCi0JCQkJCQkgIG9wX3Nsb3QpOwotCQkJCWlmIChzbG90eikKLQkJCQkJeCA9IHNsb3R6KHYsIHcsIHopOwotCQkJCWVsc2UKLQkJCQkJYyA9IC0xOwotCQkJfQotCQkJZWxzZQotCQkJCWMgPSAtMTsKLQkJCWdvdG8gZXJyb3IyOwotCQl9Ci0JCXYxID0gdjsKLQkJejEgPSB6OwotCQljID0gUHlOdW1iZXJfQ29lcmNlKCZ2MSwgJnoxKTsKLQkJaWYgKGMgIT0gMCkKLQkJCWdvdG8gZXJyb3IyOwotCQl3MiA9IHc7Ci0JCXoyID0gejE7Ci0JCWMgPSBQeU51bWJlcl9Db2VyY2UoJncyLCAmejIpOwotCQlpZiAoYyAhPSAwKQotCQkJZ290byBlcnJvcjE7CisgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogaWYgdGhlIHRoaXJkIGFyZ3VtZW50IGlzIE5vbmUsIGl0IGlzCisgICAgICAgICAgIHRyZWF0ZWQgYXMgYWJzZW50IGFyZ3VtZW50IGFuZCBub3QgY29lcmNlZC4gKi8KKyAgICAgICAgaWYgKHogPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgaWYgKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcikgeworICAgICAgICAgICAgICAgIHNsb3R6ID0gTkJfVEVSTk9QKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9zbG90KTsKKyAgICAgICAgICAgICAgICBpZiAoc2xvdHopCisgICAgICAgICAgICAgICAgICAgIHggPSBzbG90eih2LCB3LCB6KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGMgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjID0gLTE7CisgICAgICAgICAgICBnb3RvIGVycm9yMjsKKyAgICAgICAgfQorICAgICAgICB2MSA9IHY7CisgICAgICAgIHoxID0gejsKKyAgICAgICAgYyA9IFB5TnVtYmVyX0NvZXJjZSgmdjEsICZ6MSk7CisgICAgICAgIGlmIChjICE9IDApCisgICAgICAgICAgICBnb3RvIGVycm9yMjsKKyAgICAgICAgdzIgPSB3OworICAgICAgICB6MiA9IHoxOworICAgICAgICBjID0gUHlOdW1iZXJfQ29lcmNlKCZ3MiwgJnoyKTsKKyAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3IxOwogCi0JCWlmICh2MS0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwpIHsKLQkJCXNsb3R2ID0gTkJfVEVSTk9QKHYxLT5vYl90eXBlLT50cF9hc19udW1iZXIsCi0JCQkJCSAgb3Bfc2xvdCk7Ci0JCQlpZiAoc2xvdHYpCi0JCQkJeCA9IHNsb3R2KHYxLCB3MiwgejIpOwotCQkJZWxzZQotCQkJCWMgPSAtMTsKLQkJfQotCQllbHNlCi0JCQljID0gLTE7CisgICAgICAgIGlmICh2MS0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNsb3R2ID0gTkJfVEVSTk9QKHYxLT5vYl90eXBlLT50cF9hc19udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9zbG90KTsKKyAgICAgICAgICAgIGlmIChzbG90dikKKyAgICAgICAgICAgICAgICB4ID0gc2xvdHYodjEsIHcyLCB6Mik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYyA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGMgPSAtMTsKIAotCQlQeV9ERUNSRUYodzIpOwotCQlQeV9ERUNSRUYoejIpOwotCWVycm9yMToKLQkJUHlfREVDUkVGKHYxKTsKLQkJUHlfREVDUkVGKHoxKTsKLQllcnJvcjI6Ci0JCVB5X0RFQ1JFRih2KTsKLQkJUHlfREVDUkVGKHcpOwotCWVycm9yMzoKLQkJaWYgKGMgPj0gMCkKLQkJCXJldHVybiB4OwotCX0KKyAgICAgICAgUHlfREVDUkVGKHcyKTsKKyAgICAgICAgUHlfREVDUkVGKHoyKTsKKyAgICBlcnJvcjE6CisgICAgICAgIFB5X0RFQ1JFRih2MSk7CisgICAgICAgIFB5X0RFQ1JFRih6MSk7CisgICAgZXJyb3IyOgorICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICBlcnJvcjM6CisgICAgICAgIGlmIChjID49IDApCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICB9CiAKLQlpZiAoeiA9PSBQeV9Ob25lKQotCQlQeUVycl9Gb3JtYXQoCi0JCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAqKiBvciBwb3coKTogIgotCQkJIiclLjEwMHMnIGFuZCAnJS4xMDBzJyIsCi0JCQl2LT5vYl90eXBlLT50cF9uYW1lLAotCQkJdy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JZWxzZQotCQlQeUVycl9Gb3JtYXQoCi0JCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciBwb3coKTogIgotCQkJIiclLjEwMHMnLCAnJS4xMDBzJywgJyUuMTAwcyciLAotCQkJdi0+b2JfdHlwZS0+dHBfbmFtZSwKLQkJCXctPm9iX3R5cGUtPnRwX25hbWUsCi0JCQl6LT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoeiA9PSBQeV9Ob25lKQorICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAqKiBvciBwb3coKTogIgorICAgICAgICAgICAgIiclLjEwMHMnIGFuZCAnJS4xMDBzJyIsCisgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgdy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgZWxzZQorICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciBwb3coKTogIgorICAgICAgICAgICAgIiclLjEwMHMnLCAnJS4xMDBzJywgJyUuMTAwcyciLAorICAgICAgICAgICAgdi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgIHctPm9iX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICB6LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2RlZmluZSBCSU5BUllfRlVOQyhmdW5jLCBvcCwgb3BfbmFtZSkgXAogICAgIFB5T2JqZWN0ICogXAogICAgIGZ1bmMoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KSB7IFwKLQkgICAgcmV0dXJuIGJpbmFyeV9vcCh2LCB3LCBOQl9TTE9UKG9wKSwgb3BfbmFtZSk7IFwKKyAgICAgICAgcmV0dXJuIGJpbmFyeV9vcCh2LCB3LCBOQl9TTE9UKG9wKSwgb3BfbmFtZSk7IFwKICAgICB9CiAKIEJJTkFSWV9GVU5DKFB5TnVtYmVyX09yLCBuYl9vciwgInwiKQpAQCAtMTE5Niw3NyArMTE5Niw3NyBAQAogUHlPYmplY3QgKgogUHlOdW1iZXJfQWRkKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X29wMSh2LCB3LCBOQl9TTE9UKG5iX2FkZCkpOwotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJUHlTZXF1ZW5jZU1ldGhvZHMgKm0gPSB2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCWlmIChtICYmIG0tPnNxX2NvbmNhdCkgewotCQkJcmV0dXJuICgqbS0+c3FfY29uY2F0KSh2LCB3KTsKLQkJfQotCQlyZXN1bHQgPSBiaW5vcF90eXBlX2Vycm9yKHYsIHcsICIrIik7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9vcDEodiwgdywgTkJfU0xPVChuYl9hZGQpKTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5U2VxdWVuY2VNZXRob2RzICptID0gdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBpZiAobSAmJiBtLT5zcV9jb25jYXQpIHsKKyAgICAgICAgICAgIHJldHVybiAoKm0tPnNxX2NvbmNhdCkodiwgdyk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gYmlub3BfdHlwZV9lcnJvcih2LCB3LCAiKyIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VxdWVuY2VfcmVwZWF0KHNzaXplYXJnZnVuYyByZXBlYXRmdW5jLCBQeU9iamVjdCAqc2VxLCBQeU9iamVjdCAqbikKIHsKLQlQeV9zc2l6ZV90IGNvdW50OwotCWlmIChQeUluZGV4X0NoZWNrKG4pKSB7Ci0JCWNvdW50ID0gUHlOdW1iZXJfQXNTc2l6ZV90KG4sIFB5RXhjX092ZXJmbG93RXJyb3IpOwotCQlpZiAoY291bnQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIHR5cGVfZXJyb3IoImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5ICIKLQkJCQkgICJub24taW50IG9mIHR5cGUgJyUuMjAwcyciLCBuKTsKLQl9Ci0JcmV0dXJuICgqcmVwZWF0ZnVuYykoc2VxLCBjb3VudCk7CisgICAgUHlfc3NpemVfdCBjb3VudDsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhuKSkgeworICAgICAgICBjb3VudCA9IFB5TnVtYmVyX0FzU3NpemVfdChuLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKKyAgICAgICAgaWYgKGNvdW50ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiB0eXBlX2Vycm9yKCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJub24taW50IG9mIHR5cGUgJyUuMjAwcyciLCBuKTsKKyAgICB9CisgICAgcmV0dXJuICgqcmVwZWF0ZnVuYykoc2VxLCBjb3VudCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX011bHRpcGx5KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X29wMSh2LCB3LCBOQl9TTE9UKG5iX211bHRpcGx5KSk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeVNlcXVlbmNlTWV0aG9kcyAqbXYgPSB2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkJUHlTZXF1ZW5jZU1ldGhvZHMgKm13ID0gdy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlpZiAgKG12ICYmIG12LT5zcV9yZXBlYXQpIHsKLQkJCXJldHVybiBzZXF1ZW5jZV9yZXBlYXQobXYtPnNxX3JlcGVhdCwgdiwgdyk7Ci0JCX0KLQkJZWxzZSBpZiAobXcgJiYgbXctPnNxX3JlcGVhdCkgewotCQkJcmV0dXJuIHNlcXVlbmNlX3JlcGVhdChtdy0+c3FfcmVwZWF0LCB3LCB2KTsKLQkJfQotCQlyZXN1bHQgPSBiaW5vcF90eXBlX2Vycm9yKHYsIHcsICIqIik7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9vcDEodiwgdywgTkJfU0xPVChuYl9tdWx0aXBseSkpOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm12ID0gdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIFB5U2VxdWVuY2VNZXRob2RzICptdyA9IHctPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgaWYgIChtdiAmJiBtdi0+c3FfcmVwZWF0KSB7CisgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2VfcmVwZWF0KG12LT5zcV9yZXBlYXQsIHYsIHcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG13ICYmIG13LT5zcV9yZXBlYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZV9yZXBlYXQobXctPnNxX3JlcGVhdCwgdywgdik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gYmlub3BfdHlwZV9lcnJvcih2LCB3LCAiKiIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9GbG9vckRpdmlkZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JLyogWFhYIHRwX2ZsYWdzIHRlc3QgKi8KLQlyZXR1cm4gYmluYXJ5X29wKHYsIHcsIE5CX1NMT1QobmJfZmxvb3JfZGl2aWRlKSwgIi8vIik7CisgICAgLyogWFhYIHRwX2ZsYWdzIHRlc3QgKi8KKyAgICByZXR1cm4gYmluYXJ5X29wKHYsIHcsIE5CX1NMT1QobmJfZmxvb3JfZGl2aWRlKSwgIi8vIik7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX1RydWVEaXZpZGUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCS8qIFhYWCB0cF9mbGFncyB0ZXN0ICovCi0JcmV0dXJuIGJpbmFyeV9vcCh2LCB3LCBOQl9TTE9UKG5iX3RydWVfZGl2aWRlKSwgIi8iKTsKKyAgICAvKiBYWFggdHBfZmxhZ3MgdGVzdCAqLworICAgIHJldHVybiBiaW5hcnlfb3AodiwgdywgTkJfU0xPVChuYl90cnVlX2RpdmlkZSksICIvIik7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX1JlbWFpbmRlcihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JcmV0dXJuIGJpbmFyeV9vcCh2LCB3LCBOQl9TTE9UKG5iX3JlbWFpbmRlciksICIlIik7CisgICAgcmV0dXJuIGJpbmFyeV9vcCh2LCB3LCBOQl9TTE9UKG5iX3JlbWFpbmRlciksICIlIik7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX1Bvd2VyKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgUHlPYmplY3QgKnopCiB7Ci0JcmV0dXJuIHRlcm5hcnlfb3AodiwgdywgeiwgTkJfU0xPVChuYl9wb3dlciksICIqKiBvciBwb3coKSIpOworICAgIHJldHVybiB0ZXJuYXJ5X29wKHYsIHcsIHosIE5CX1NMT1QobmJfcG93ZXIpLCAiKiogb3IgcG93KCkiKTsKIH0KIAogLyogQmluYXJ5IGluLXBsYWNlIG9wZXJhdG9ycyAqLwpAQCAtMTI4Niw0MiArMTI4Niw0MiBAQAogICAgKi8KIAogI2RlZmluZSBIQVNJTlBMQUNFKHQpIFwKLQlQeVR5cGVfSGFzRmVhdHVyZSgodCktPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTKQorICAgIFB5VHlwZV9IYXNGZWF0dXJlKCh0KS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFMpCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hcnlfaW9wMShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGNvbnN0IGludCBpb3Bfc2xvdCwgY29uc3QgaW50IG9wX3Nsb3QpCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptdiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobXYgIT0gTlVMTCAmJiBIQVNJTlBMQUNFKHYpKSB7Ci0JCWJpbmFyeWZ1bmMgc2xvdCA9IE5CX0JJTk9QKG12LCBpb3Bfc2xvdCk7Ci0JCWlmIChzbG90KSB7Ci0JCQlQeU9iamVjdCAqeCA9IChzbG90KSh2LCB3KTsKLQkJCWlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCQkJcmV0dXJuIHg7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoeCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJpbmFyeV9vcDEodiwgdywgb3Bfc2xvdCk7CisgICAgUHlOdW1iZXJNZXRob2RzICptdiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobXYgIT0gTlVMTCAmJiBIQVNJTlBMQUNFKHYpKSB7CisgICAgICAgIGJpbmFyeWZ1bmMgc2xvdCA9IE5CX0JJTk9QKG12LCBpb3Bfc2xvdCk7CisgICAgICAgIGlmIChzbG90KSB7CisgICAgICAgICAgICBQeU9iamVjdCAqeCA9IChzbG90KSh2LCB3KTsKKyAgICAgICAgICAgIGlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJpbmFyeV9vcDEodiwgdywgb3Bfc2xvdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hcnlfaW9wKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgY29uc3QgaW50IGlvcF9zbG90LCBjb25zdCBpbnQgb3Bfc2xvdCwKLQkJY29uc3QgY2hhciAqb3BfbmFtZSkKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvcF9uYW1lKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfaW9wMSh2LCB3LCBpb3Bfc2xvdCwgb3Bfc2xvdCk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIGJpbm9wX3R5cGVfZXJyb3Iodiwgdywgb3BfbmFtZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9pb3AxKHYsIHcsIGlvcF9zbG90LCBvcF9zbG90KTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gYmlub3BfdHlwZV9lcnJvcih2LCB3LCBvcF9uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogI2RlZmluZSBJTlBMQUNFX0JJTk9QKGZ1bmMsIGlvcCwgb3AsIG9wX25hbWUpIFwKLQlQeU9iamVjdCAqIFwKLQlmdW5jKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykgeyBcCi0JCXJldHVybiBiaW5hcnlfaW9wKHYsIHcsIE5CX1NMT1QoaW9wKSwgTkJfU0xPVChvcCksIG9wX25hbWUpOyBcCi0JfQorICAgIFB5T2JqZWN0ICogXAorICAgIGZ1bmMoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KSB7IFwKKyAgICAgICAgcmV0dXJuIGJpbmFyeV9pb3AodiwgdywgTkJfU0xPVChpb3ApLCBOQl9TTE9UKG9wKSwgb3BfbmFtZSk7IFwKKyAgICB9CiAKIElOUExBQ0VfQklOT1AoUHlOdW1iZXJfSW5QbGFjZU9yLCBuYl9pbnBsYWNlX29yLCBuYl9vciwgInw9IikKIElOUExBQ0VfQklOT1AoUHlOdW1iZXJfSW5QbGFjZVhvciwgbmJfaW5wbGFjZV94b3IsIG5iX3hvciwgIl49IikKQEAgLTEzMzQsODggKzEzMzQsODggQEAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JLyogWFhYIHRwX2ZsYWdzIHRlc3QgKi8KLQlyZXR1cm4gYmluYXJ5X2lvcCh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlKSwKLQkJCSAgTkJfU0xPVChuYl9mbG9vcl9kaXZpZGUpLCAiLy89Iik7CisgICAgLyogWFhYIHRwX2ZsYWdzIHRlc3QgKi8KKyAgICByZXR1cm4gYmluYXJ5X2lvcCh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlKSwKKyAgICAgICAgICAgICAgICAgICAgICBOQl9TTE9UKG5iX2Zsb29yX2RpdmlkZSksICIvLz0iKTsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCS8qIFhYWCB0cF9mbGFncyB0ZXN0ICovCi0JcmV0dXJuIGJpbmFyeV9pb3AodiwgdywgTkJfU0xPVChuYl9pbnBsYWNlX3RydWVfZGl2aWRlKSwKLQkJCSAgTkJfU0xPVChuYl90cnVlX2RpdmlkZSksICIvPSIpOworICAgIC8qIFhYWCB0cF9mbGFncyB0ZXN0ICovCisgICAgcmV0dXJuIGJpbmFyeV9pb3AodiwgdywgTkJfU0xPVChuYl9pbnBsYWNlX3RydWVfZGl2aWRlKSwKKyAgICAgICAgICAgICAgICAgICAgICBOQl9TTE9UKG5iX3RydWVfZGl2aWRlKSwgIi89Iik7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX0luUGxhY2VBZGQoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfaW9wMSh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfYWRkKSwKLQkJCQkgICAgICAgTkJfU0xPVChuYl9hZGQpKTsKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCVB5U2VxdWVuY2VNZXRob2RzICptID0gdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlpZiAobSAhPSBOVUxMKSB7Ci0JCQliaW5hcnlmdW5jIGYgPSBOVUxMOwotCQkJaWYgKEhBU0lOUExBQ0UodikpCi0JCQkJZiA9IG0tPnNxX2lucGxhY2VfY29uY2F0OwotCQkJaWYgKGYgPT0gTlVMTCkKLQkJCQlmID0gbS0+c3FfY29uY2F0OwotCQkJaWYgKGYgIT0gTlVMTCkKLQkJCQlyZXR1cm4gKCpmKSh2LCB3KTsKLQkJfQotCQlyZXN1bHQgPSBiaW5vcF90eXBlX2Vycm9yKHYsIHcsICIrPSIpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfaW9wMSh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfYWRkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJfU0xPVChuYl9hZGQpKTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5U2VxdWVuY2VNZXRob2RzICptID0gdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBpZiAobSAhPSBOVUxMKSB7CisgICAgICAgICAgICBiaW5hcnlmdW5jIGYgPSBOVUxMOworICAgICAgICAgICAgaWYgKEhBU0lOUExBQ0UodikpCisgICAgICAgICAgICAgICAgZiA9IG0tPnNxX2lucGxhY2VfY29uY2F0OworICAgICAgICAgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBmID0gbS0+c3FfY29uY2F0OworICAgICAgICAgICAgaWYgKGYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKCpmKSh2LCB3KTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBiaW5vcF90eXBlX2Vycm9yKHYsIHcsICIrPSIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9JblBsYWNlTXVsdGlwbHkoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfaW9wMSh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfbXVsdGlwbHkpLAotCQkJCSAgICAgICBOQl9TTE9UKG5iX211bHRpcGx5KSk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlzc2l6ZWFyZ2Z1bmMgZiA9IE5VTEw7Ci0JCVB5U2VxdWVuY2VNZXRob2RzICptdiA9IHYtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwotCQlQeVNlcXVlbmNlTWV0aG9kcyAqbXcgPSB3LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCWlmIChtdiAhPSBOVUxMKSB7Ci0JCQlpZiAoSEFTSU5QTEFDRSh2KSkKLQkJCQlmID0gbXYtPnNxX2lucGxhY2VfcmVwZWF0OwotCQkJaWYgKGYgPT0gTlVMTCkKLQkJCQlmID0gbXYtPnNxX3JlcGVhdDsKLQkJCWlmIChmICE9IE5VTEwpCi0JCQkJcmV0dXJuIHNlcXVlbmNlX3JlcGVhdChmLCB2LCB3KTsKLQkJfQotCQllbHNlIGlmIChtdyAhPSBOVUxMKSB7Ci0JCQkvKiBOb3RlIHRoYXQgdGhlIHJpZ2h0IGhhbmQgb3BlcmFuZCBzaG91bGQgbm90IGJlCi0JCQkgKiBtdXRhdGVkIGluIHRoaXMgY2FzZSBzbyBzcV9pbnBsYWNlX3JlcGVhdCBpcyBub3QKLQkJCSAqIHVzZWQuICovCi0JCQlpZiAobXctPnNxX3JlcGVhdCkKLQkJCQlyZXR1cm4gc2VxdWVuY2VfcmVwZWF0KG13LT5zcV9yZXBlYXQsIHcsIHYpOwotCQl9Ci0JCXJlc3VsdCA9IGJpbm9wX3R5cGVfZXJyb3IodiwgdywgIio9Iik7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9pb3AxKHYsIHcsIE5CX1NMT1QobmJfaW5wbGFjZV9tdWx0aXBseSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CX1NMT1QobmJfbXVsdGlwbHkpKTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIHNzaXplYXJnZnVuYyBmID0gTlVMTDsKKyAgICAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm12ID0gdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIFB5U2VxdWVuY2VNZXRob2RzICptdyA9IHctPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgaWYgKG12ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChIQVNJTlBMQUNFKHYpKQorICAgICAgICAgICAgICAgIGYgPSBtdi0+c3FfaW5wbGFjZV9yZXBlYXQ7CisgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGYgPSBtdi0+c3FfcmVwZWF0OworICAgICAgICAgICAgaWYgKGYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2VfcmVwZWF0KGYsIHYsIHcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG13ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIE5vdGUgdGhhdCB0aGUgcmlnaHQgaGFuZCBvcGVyYW5kIHNob3VsZCBub3QgYmUKKyAgICAgICAgICAgICAqIG11dGF0ZWQgaW4gdGhpcyBjYXNlIHNvIHNxX2lucGxhY2VfcmVwZWF0IGlzIG5vdAorICAgICAgICAgICAgICogdXNlZC4gKi8KKyAgICAgICAgICAgIGlmIChtdy0+c3FfcmVwZWF0KQorICAgICAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZV9yZXBlYXQobXctPnNxX3JlcGVhdCwgdywgdik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gYmlub3BfdHlwZV9lcnJvcih2LCB3LCAiKj0iKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JcmV0dXJuIGJpbmFyeV9pb3AodiwgdywgTkJfU0xPVChuYl9pbnBsYWNlX3JlbWFpbmRlciksCi0JCQkJTkJfU0xPVChuYl9yZW1haW5kZXIpLCAiJT0iKTsKKyAgICByZXR1cm4gYmluYXJ5X2lvcCh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfcmVtYWluZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9TTE9UKG5iX3JlbWFpbmRlciksICIlPSIpOwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9JblBsYWNlUG93ZXIoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBQeU9iamVjdCAqeikKIHsKLQlpZiAoSEFTSU5QTEFDRSh2KSAmJiB2LT5vYl90eXBlLT50cF9hc19udW1iZXIgJiYKLQkgICAgdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9pbnBsYWNlX3Bvd2VyICE9IE5VTEwpIHsKLQkJcmV0dXJuIHRlcm5hcnlfb3AodiwgdywgeiwgTkJfU0xPVChuYl9pbnBsYWNlX3Bvd2VyKSwgIioqPSIpOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIHRlcm5hcnlfb3AodiwgdywgeiwgTkJfU0xPVChuYl9wb3dlciksICIqKj0iKTsKLQl9CisgICAgaWYgKEhBU0lOUExBQ0UodikgJiYgdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICYmCisgICAgICAgIHYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfaW5wbGFjZV9wb3dlciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiB0ZXJuYXJ5X29wKHYsIHcsIHosIE5CX1NMT1QobmJfaW5wbGFjZV9wb3dlciksICIqKj0iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiB0ZXJuYXJ5X29wKHYsIHcsIHosIE5CX1NMT1QobmJfcG93ZXIpLCAiKio9Iik7CisgICAgfQogfQogCiAKQEAgLTE0MjQsMTEwICsxNDI0LDExMCBAQAogUHlPYmplY3QgKgogUHlOdW1iZXJfTmVnYXRpdmUoUHlPYmplY3QgKm8pCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7Ci0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobSAmJiBtLT5uYl9uZWdhdGl2ZSkKLQkJcmV0dXJuICgqbS0+bmJfbmVnYXRpdmUpKG8pOworICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobSAmJiBtLT5uYl9uZWdhdGl2ZSkKKyAgICAgICAgcmV0dXJuICgqbS0+bmJfbmVnYXRpdmUpKG8pOwogCi0JcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IC06ICclLjIwMHMnIiwgbyk7CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IC06ICclLjIwMHMnIiwgbyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX1Bvc2l0aXZlKFB5T2JqZWN0ICpvKQogewotCVB5TnVtYmVyTWV0aG9kcyAqbTsKKyAgICBQeU51bWJlck1ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOwotCW0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7Ci0JaWYgKG0gJiYgbS0+bmJfcG9zaXRpdmUpCi0JCXJldHVybiAoKm0tPm5iX3Bvc2l0aXZlKShvKTsKKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgaWYgKG0gJiYgbS0+bmJfcG9zaXRpdmUpCisgICAgICAgIHJldHVybiAoKm0tPm5iX3Bvc2l0aXZlKShvKTsKIAotCXJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSArOiAnJS4yMDBzJyIsIG8pOworICAgIHJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSArOiAnJS4yMDBzJyIsIG8pOwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9JbnZlcnQoUHlPYmplY3QgKm8pCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7Ci0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobSAmJiBtLT5uYl9pbnZlcnQpCi0JCXJldHVybiAoKm0tPm5iX2ludmVydCkobyk7CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgIGlmIChtICYmIG0tPm5iX2ludmVydCkKKyAgICAgICAgcmV0dXJuICgqbS0+bmJfaW52ZXJ0KShvKTsKIAotCXJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSB+OiAnJS4yMDBzJyIsIG8pOworICAgIHJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSB+OiAnJS4yMDBzJyIsIG8pOwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9BYnNvbHV0ZShQeU9iamVjdCAqbykKIHsKLQlQeU51bWJlck1ldGhvZHMgKm07CisgICAgUHlOdW1iZXJNZXRob2RzICptOwogCi0JaWYgKG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKLQltID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChtICYmIG0tPm5iX2Fic29sdXRlKQotCQlyZXR1cm4gbS0+bmJfYWJzb2x1dGUobyk7CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgIGlmIChtICYmIG0tPm5iX2Fic29sdXRlKQorICAgICAgICByZXR1cm4gbS0+bmJfYWJzb2x1dGUobyk7CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigiYmFkIG9wZXJhbmQgdHlwZSBmb3IgYWJzKCk6ICclLjIwMHMnIiwgbyk7CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIGFicygpOiAnJS4yMDBzJyIsIG8pOwogfQogCiAvKiBBZGQgYSBjaGVjayBmb3IgZW1iZWRkZWQgTlVMTC1ieXRlcyBpbiB0aGUgYXJndW1lbnQuICovCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewotCWNoYXIgKmVuZDsKLQlQeU9iamVjdCAqeDsKKyAgICBjaGFyICplbmQ7CisgICAgUHlPYmplY3QgKng7CiAKLQl4ID0gUHlJbnRfRnJvbVN0cmluZygoY2hhciopcywgJmVuZCwgMTApOwotCWlmICh4ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChlbmQgIT0gcyArIGxlbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibnVsbCBieXRlIGluIGFyZ3VtZW50IGZvciBpbnQoKSIpOwotCQlQeV9ERUNSRUYoeCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4geDsKKyAgICB4ID0gUHlJbnRfRnJvbVN0cmluZygoY2hhciopcywgJmVuZCwgMTApOworICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChlbmQgIT0gcyArIGxlbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJudWxsIGJ5dGUgaW4gYXJndW1lbnQgZm9yIGludCgpIik7CisgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB4OwogfQogCi0vKiBSZXR1cm4gYSBQeXRob24gSW50IG9yIExvbmcgZnJvbSB0aGUgb2JqZWN0IGl0ZW0gCisvKiBSZXR1cm4gYSBQeXRob24gSW50IG9yIExvbmcgZnJvbSB0aGUgb2JqZWN0IGl0ZW0KICAgIFJhaXNlIFR5cGVFcnJvciBpZiB0aGUgcmVzdWx0IGlzIG5vdCBhbiBpbnQtb3ItbG9uZwotICAgb3IgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXguIAorICAgb3IgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXguCiAqLwogUHlPYmplY3QgKgogUHlOdW1iZXJfSW5kZXgoUHlPYmplY3QgKml0ZW0pCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JaWYgKGl0ZW0gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKLQlpZiAoUHlJbnRfQ2hlY2soaXRlbSkgfHwgUHlMb25nX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCXJlc3VsdCA9IGl0ZW0tPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfaW5kZXgoaXRlbSk7Ci0JCWlmIChyZXN1bHQgJiYKLQkJICAgICFQeUludF9DaGVjayhyZXN1bHQpICYmICFQeUxvbmdfQ2hlY2socmVzdWx0KSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJfX2luZGV4X18gcmV0dXJuZWQgbm9uLShpbnQsbG9uZykgIiBcCi0JCQkJICAgICAiKHR5cGUgJS4yMDBzKSIsCi0JCQkJICAgICByZXN1bHQtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiclLjIwMHMnIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgIgotCQkJICAgICAiYXMgYW4gaW5kZXgiLCBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChQeUludF9DaGVjayhpdGVtKSB8fCBQeUxvbmdfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgcmVzdWx0ID0gaXRlbS0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9pbmRleChpdGVtKTsKKyAgICAgICAgaWYgKHJlc3VsdCAmJgorICAgICAgICAgICAgIVB5SW50X0NoZWNrKHJlc3VsdCkgJiYgIVB5TG9uZ19DaGVjayhyZXN1bHQpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJfX2luZGV4X18gcmV0dXJuZWQgbm9uLShpbnQsbG9uZykgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIih0eXBlICUuMjAwcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclLjIwMHMnIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgImFzIGFuIGluZGV4IiwgaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFJldHVybiBhbiBlcnJvciBvbiBPdmVyZmxvdyBvbmx5IGlmIGVyciBpcyBub3QgTlVMTCovCkBAIC0xNTM1LDI5NiArMTUzNSwyOTYgQEAKIFB5X3NzaXplX3QKIFB5TnVtYmVyX0FzU3NpemVfdChQeU9iamVjdCAqaXRlbSwgUHlPYmplY3QgKmVycikKIHsKLQlQeV9zc2l6ZV90IHJlc3VsdDsKLQlQeU9iamVjdCAqcnVuZXJyOwotCVB5T2JqZWN0ICp2YWx1ZSA9IFB5TnVtYmVyX0luZGV4KGl0ZW0pOwotCWlmICh2YWx1ZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgUHlfc3NpemVfdCByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJ1bmVycjsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSBQeU51bWJlcl9JbmRleChpdGVtKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JLyogV2UncmUgZG9uZSBpZiBQeUludF9Bc1NzaXplX3QoKSByZXR1cm5zIHdpdGhvdXQgZXJyb3IuICovCi0JcmVzdWx0ID0gUHlJbnRfQXNTc2l6ZV90KHZhbHVlKTsKLQlpZiAocmVzdWx0ICE9IC0xIHx8ICEocnVuZXJyID0gUHlFcnJfT2NjdXJyZWQoKSkpCi0JCWdvdG8gZmluaXNoOworICAgIC8qIFdlJ3JlIGRvbmUgaWYgUHlJbnRfQXNTc2l6ZV90KCkgcmV0dXJucyB3aXRob3V0IGVycm9yLiAqLworICAgIHJlc3VsdCA9IFB5SW50X0FzU3NpemVfdCh2YWx1ZSk7CisgICAgaWYgKHJlc3VsdCAhPSAtMSB8fCAhKHJ1bmVyciA9IFB5RXJyX09jY3VycmVkKCkpKQorICAgICAgICBnb3RvIGZpbmlzaDsKIAotCS8qIEVycm9yIGhhbmRsaW5nIGNvZGUgLS0gb25seSBtYW5hZ2UgT3ZlcmZsb3dFcnJvciBkaWZmZXJlbnRseSAqLwotCWlmICghUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKHJ1bmVyciwgUHlFeGNfT3ZlcmZsb3dFcnJvcikpIAotCQlnb3RvIGZpbmlzaDsKKyAgICAvKiBFcnJvciBoYW5kbGluZyBjb2RlIC0tIG9ubHkgbWFuYWdlIE92ZXJmbG93RXJyb3IgZGlmZmVyZW50bHkgKi8KKyAgICBpZiAoIVB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhydW5lcnIsIFB5RXhjX092ZXJmbG93RXJyb3IpKQorICAgICAgICBnb3RvIGZpbmlzaDsKIAotCVB5RXJyX0NsZWFyKCk7Ci0JLyogSWYgbm8gZXJyb3ItaGFuZGxpbmcgZGVzaXJlZCB0aGVuIHRoZSBkZWZhdWx0IGNsaXBwaW5nIAotCSAgIGlzIHN1ZmZpY2llbnQuCi0JICovCi0JaWYgKCFlcnIpIHsKLQkJYXNzZXJ0KFB5TG9uZ19DaGVjayh2YWx1ZSkpOwotCQkvKiBXaGV0aGVyIG9yIG5vdCBpdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gCi0JCSAgIHplcm8gaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2lnbiBvZiBvYl9zaXplCi0JCSovCi0JCWlmIChfUHlMb25nX1NpZ24odmFsdWUpIDwgMCkgCi0JCQlyZXN1bHQgPSBQWV9TU0laRV9UX01JTjsKLQkJZWxzZQotCQkJcmVzdWx0ID0gUFlfU1NJWkVfVF9NQVg7Ci0JfQotCWVsc2UgewotCQkvKiBPdGhlcndpc2UgcmVwbGFjZSB0aGUgZXJyb3Igd2l0aCBjYWxsZXIncyBlcnJvciBvYmplY3QuICovCi0JCVB5RXJyX0Zvcm1hdChlcnIsCi0JCQkgICAgICJjYW5ub3QgZml0ICclLjIwMHMnIGludG8gYW4gaW5kZXgtc2l6ZWQgaW50ZWdlciIsIAotCQkJICAgICBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsgCi0JfQotCQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgLyogSWYgbm8gZXJyb3ItaGFuZGxpbmcgZGVzaXJlZCB0aGVuIHRoZSBkZWZhdWx0IGNsaXBwaW5nCisgICAgICAgaXMgc3VmZmljaWVudC4KKyAgICAgKi8KKyAgICBpZiAoIWVycikgeworICAgICAgICBhc3NlcnQoUHlMb25nX0NoZWNrKHZhbHVlKSk7CisgICAgICAgIC8qIFdoZXRoZXIgb3Igbm90IGl0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgICAgICAgICB6ZXJvIGlzIGRldGVybWluZWQgYnkgdGhlIHNpZ24gb2Ygb2Jfc2l6ZQorICAgICAgICAqLworICAgICAgICBpZiAoX1B5TG9uZ19TaWduKHZhbHVlKSA8IDApCisgICAgICAgICAgICByZXN1bHQgPSBQWV9TU0laRV9UX01JTjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gUFlfU1NJWkVfVF9NQVg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBPdGhlcndpc2UgcmVwbGFjZSB0aGUgZXJyb3Igd2l0aCBjYWxsZXIncyBlcnJvciBvYmplY3QuICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChlcnIsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGZpdCAnJS4yMDBzJyBpbnRvIGFuIGluZGV4LXNpemVkIGludGVnZXIiLAorICAgICAgICAgICAgICAgICAgICAgaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgfQorCiAgZmluaXNoOgotCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9ERUNSRUYodmFsdWUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIAogUHlPYmplY3QgKgogX1B5TnVtYmVyX0NvbnZlcnRJbnRlZ3JhbFRvSW50KFB5T2JqZWN0ICppbnRlZ3JhbCwgY29uc3QgY2hhciogZXJyb3JfZm9ybWF0KQogewotCWNvbnN0IGNoYXIgKnR5cGVfbmFtZTsKLQlzdGF0aWMgUHlPYmplY3QgKmludF9uYW1lID0gTlVMTDsKLQlpZiAoaW50X25hbWUgPT0gTlVMTCkgewotCQlpbnRfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faW50X18iKTsKLQkJaWYgKGludF9uYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgY29uc3QgY2hhciAqdHlwZV9uYW1lOworICAgIHN0YXRpYyBQeU9iamVjdCAqaW50X25hbWUgPSBOVUxMOworICAgIGlmIChpbnRfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGludF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbnRfXyIpOworICAgICAgICBpZiAoaW50X25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChpbnRlZ3JhbCAmJiAoIVB5SW50X0NoZWNrKGludGVncmFsKSAmJgotCQkJICFQeUxvbmdfQ2hlY2soaW50ZWdyYWwpKSkgewotCQkvKiBEb24ndCBnbyB0aHJvdWdoIHRwX2FzX251bWJlci0+bmJfaW50IHRvIGF2b2lkCi0JCSAgIGhpdHRpbmcgdGhlIGNsYXNzaWMgY2xhc3MgZmFsbGJhY2sgdG8gX190cnVuY19fLiAqLwotCQlQeU9iamVjdCAqaW50X2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyKGludGVncmFsLCBpbnRfbmFtZSk7Ci0JCWlmIChpbnRfZnVuYyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOyAvKiBSYWlzZSBhIGRpZmZlcmVudCBlcnJvci4gKi8KLQkJCWdvdG8gbm9uX2ludGVncmFsX2Vycm9yOwotCQl9Ci0JCVB5X0RFQ1JFRihpbnRlZ3JhbCk7Ci0JCWludGVncmFsID0gUHlFdmFsX0NhbGxPYmplY3QoaW50X2Z1bmMsIE5VTEwpOwotCQlQeV9ERUNSRUYoaW50X2Z1bmMpOwotCQlpZiAoaW50ZWdyYWwgJiYgKCFQeUludF9DaGVjayhpbnRlZ3JhbCkgJiYKLQkJCQkgICFQeUxvbmdfQ2hlY2soaW50ZWdyYWwpKSkgewotCQkJZ290byBub25faW50ZWdyYWxfZXJyb3I7Ci0JCX0KLQl9Ci0JcmV0dXJuIGludGVncmFsOworICAgIGlmIChpbnRlZ3JhbCAmJiAoIVB5SW50X0NoZWNrKGludGVncmFsKSAmJgorICAgICAgICAgICAgICAgICAgICAgIVB5TG9uZ19DaGVjayhpbnRlZ3JhbCkpKSB7CisgICAgICAgIC8qIERvbid0IGdvIHRocm91Z2ggdHBfYXNfbnVtYmVyLT5uYl9pbnQgdG8gYXZvaWQKKyAgICAgICAgICAgaGl0dGluZyB0aGUgY2xhc3NpYyBjbGFzcyBmYWxsYmFjayB0byBfX3RydW5jX18uICovCisgICAgICAgIFB5T2JqZWN0ICppbnRfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIoaW50ZWdyYWwsIGludF9uYW1lKTsKKyAgICAgICAgaWYgKGludF9mdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIFJhaXNlIGEgZGlmZmVyZW50IGVycm9yLiAqLworICAgICAgICAgICAgZ290byBub25faW50ZWdyYWxfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGludGVncmFsKTsKKyAgICAgICAgaW50ZWdyYWwgPSBQeUV2YWxfQ2FsbE9iamVjdChpbnRfZnVuYywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihpbnRfZnVuYyk7CisgICAgICAgIGlmIChpbnRlZ3JhbCAmJiAoIVB5SW50X0NoZWNrKGludGVncmFsKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAhUHlMb25nX0NoZWNrKGludGVncmFsKSkpIHsKKyAgICAgICAgICAgIGdvdG8gbm9uX2ludGVncmFsX2Vycm9yOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnRlZ3JhbDsKIAogbm9uX2ludGVncmFsX2Vycm9yOgotCWlmIChQeUluc3RhbmNlX0NoZWNrKGludGVncmFsKSkgewotCQl0eXBlX25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoKChQeUluc3RhbmNlT2JqZWN0ICopaW50ZWdyYWwpCi0JCQkJCSAgICAgICAtPmluX2NsYXNzLT5jbF9uYW1lKTsKLQl9Ci0JZWxzZSB7Ci0JCXR5cGVfbmFtZSA9IGludGVncmFsLT5vYl90eXBlLT50cF9uYW1lOwotCX0KLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCBlcnJvcl9mb3JtYXQsIHR5cGVfbmFtZSk7Ci0JUHlfREVDUkVGKGludGVncmFsKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayhpbnRlZ3JhbCkpIHsKKyAgICAgICAgdHlwZV9uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlJbnN0YW5jZU9iamVjdCAqKWludGVncmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5pbl9jbGFzcy0+Y2xfbmFtZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0eXBlX25hbWUgPSBpbnRlZ3JhbC0+b2JfdHlwZS0+dHBfbmFtZTsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgZXJyb3JfZm9ybWF0LCB0eXBlX25hbWUpOworICAgIFB5X0RFQ1JFRihpbnRlZ3JhbCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIAogUHlPYmplY3QgKgogUHlOdW1iZXJfSW50KFB5T2JqZWN0ICpvKQogewotCVB5TnVtYmVyTWV0aG9kcyAqbTsKLQlzdGF0aWMgUHlPYmplY3QgKnRydW5jX25hbWUgPSBOVUxMOwotCVB5T2JqZWN0ICp0cnVuY19mdW5jOwotCWNvbnN0IGNoYXIgKmJ1ZmZlcjsKLQlQeV9zc2l6ZV90IGJ1ZmZlcl9sZW47CisgICAgUHlOdW1iZXJNZXRob2RzICptOworICAgIHN0YXRpYyBQeU9iamVjdCAqdHJ1bmNfbmFtZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRydW5jX2Z1bmM7CisgICAgY29uc3QgY2hhciAqYnVmZmVyOworICAgIFB5X3NzaXplX3QgYnVmZmVyX2xlbjsKIAotCWlmICh0cnVuY19uYW1lID09IE5VTEwpIHsKLQkJdHJ1bmNfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fdHJ1bmNfXyIpOwotCQlpZiAodHJ1bmNfbmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh0cnVuY19uYW1lID09IE5VTEwpIHsKKyAgICAgICAgdHJ1bmNfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fdHJ1bmNfXyIpOworICAgICAgICBpZiAodHJ1bmNfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKLQlpZiAoUHlJbnRfQ2hlY2tFeGFjdChvKSkgewotCQlQeV9JTkNSRUYobyk7Ci0JCXJldHVybiBvOwotCX0KLQltID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChtICYmIG0tPm5iX2ludCkgeyAvKiBUaGlzIHNob3VsZCBpbmNsdWRlIHN1YmNsYXNzZXMgb2YgaW50ICovCi0JCS8qIENsYXNzaWMgY2xhc3NlcyBhbHdheXMgdGFrZSB0aGlzIGJyYW5jaC4gKi8KLQkJUHlPYmplY3QgKnJlcyA9IG0tPm5iX2ludChvKTsKLQkJaWYgKHJlcyAmJiAoIVB5SW50X0NoZWNrKHJlcykgJiYgIVB5TG9uZ19DaGVjayhyZXMpKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJfX2ludF9fIHJldHVybmVkIG5vbi1pbnQgKHR5cGUgJS4yMDBzKSIsCi0JCQkJICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQlpZiAoUHlJbnRfQ2hlY2sobykpIHsgLyogQSBpbnQgc3ViY2xhc3Mgd2l0aG91dCBuYl9pbnQgKi8KLQkJUHlJbnRPYmplY3QgKmlvID0gKFB5SW50T2JqZWN0KilvOwotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoaW8tPm9iX2l2YWwpOwotCX0KLQl0cnVuY19mdW5jID0gUHlPYmplY3RfR2V0QXR0cihvLCB0cnVuY19uYW1lKTsKLQlpZiAodHJ1bmNfZnVuYykgewotCQlQeU9iamVjdCAqdHJ1bmNhdGVkID0gUHlFdmFsX0NhbGxPYmplY3QodHJ1bmNfZnVuYywgTlVMTCk7Ci0JCVB5X0RFQ1JFRih0cnVuY19mdW5jKTsKLQkJLyogX190cnVuY19fIGlzIHNwZWNpZmllZCB0byByZXR1cm4gYW4gSW50ZWdyYWwgdHlwZSwgYnV0Ci0JCSAgIGludCgpIG5lZWRzIHRvIHJldHVybiBhbiBpbnQuICovCi0JCXJldHVybiBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCi0JCQl0cnVuY2F0ZWQsCi0JCQkiX190cnVuY19fIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSAlLjIwMHMpIik7Ci0JfQotCVB5RXJyX0NsZWFyKCk7ICAvKiBJdCdzIG5vdCBhbiBlcnJvciBpZiAgby5fX3RydW5jX18gZG9lc24ndCBleGlzdC4gKi8KKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChQeUludF9DaGVja0V4YWN0KG8pKSB7CisgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgcmV0dXJuIG87CisgICAgfQorICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgaWYgKG0gJiYgbS0+bmJfaW50KSB7IC8qIFRoaXMgc2hvdWxkIGluY2x1ZGUgc3ViY2xhc3NlcyBvZiBpbnQgKi8KKyAgICAgICAgLyogQ2xhc3NpYyBjbGFzc2VzIGFsd2F5cyB0YWtlIHRoaXMgYnJhbmNoLiAqLworICAgICAgICBQeU9iamVjdCAqcmVzID0gbS0+bmJfaW50KG8pOworICAgICAgICBpZiAocmVzICYmICghUHlJbnRfQ2hlY2socmVzKSAmJiAhUHlMb25nX0NoZWNrKHJlcykpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ludF9fIHJldHVybmVkIG5vbi1pbnQgKHR5cGUgJS4yMDBzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKFB5SW50X0NoZWNrKG8pKSB7IC8qIEEgaW50IHN1YmNsYXNzIHdpdGhvdXQgbmJfaW50ICovCisgICAgICAgIFB5SW50T2JqZWN0ICppbyA9IChQeUludE9iamVjdCopbzsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGlvLT5vYl9pdmFsKTsKKyAgICB9CisgICAgdHJ1bmNfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIobywgdHJ1bmNfbmFtZSk7CisgICAgaWYgKHRydW5jX2Z1bmMpIHsKKyAgICAgICAgUHlPYmplY3QgKnRydW5jYXRlZCA9IFB5RXZhbF9DYWxsT2JqZWN0KHRydW5jX2Z1bmMsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYodHJ1bmNfZnVuYyk7CisgICAgICAgIC8qIF9fdHJ1bmNfXyBpcyBzcGVjaWZpZWQgdG8gcmV0dXJuIGFuIEludGVncmFsIHR5cGUsIGJ1dAorICAgICAgICAgICBpbnQoKSBuZWVkcyB0byByZXR1cm4gYW4gaW50LiAqLworICAgICAgICByZXR1cm4gX1B5TnVtYmVyX0NvbnZlcnRJbnRlZ3JhbFRvSW50KAorICAgICAgICAgICAgdHJ1bmNhdGVkLAorICAgICAgICAgICAgIl9fdHJ1bmNfXyByZXR1cm5lZCBub24tSW50ZWdyYWwgKHR5cGUgJS4yMDBzKSIpOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOyAgLyogSXQncyBub3QgYW4gZXJyb3IgaWYgIG8uX190cnVuY19fIGRvZXNuJ3QgZXhpc3QuICovCiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sobykpCi0JCXJldHVybiBpbnRfZnJvbV9zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKG8pLAotCQkJCSAgICAgICBQeVN0cmluZ19HRVRfU0laRShvKSk7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG8pKQorICAgICAgICByZXR1cm4gaW50X2Zyb21fc3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyhvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShvKSk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2sobykpCi0JCXJldHVybiBQeUludF9Gcm9tVW5pY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERShvKSwKLQkJCQkJIFB5VW5pY29kZV9HRVRfU0laRShvKSwKLQkJCQkJIDEwKTsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG8pKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUobyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUobyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCk7CiAjZW5kaWYKLQlpZiAoIVB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihvLCAmYnVmZmVyLCAmYnVmZmVyX2xlbikpCi0JCXJldHVybiBpbnRfZnJvbV9zdHJpbmcoKGNoYXIqKWJ1ZmZlciwgYnVmZmVyX2xlbik7CisgICAgaWYgKCFQeU9iamVjdF9Bc0NoYXJCdWZmZXIobywgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pKQorICAgICAgICByZXR1cm4gaW50X2Zyb21fc3RyaW5nKChjaGFyKilidWZmZXIsIGJ1ZmZlcl9sZW4pOwogCi0JcmV0dXJuIHR5cGVfZXJyb3IoImludCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSAiCi0JCQkgICJudW1iZXIsIG5vdCAnJS4yMDBzJyIsIG8pOworICAgIHJldHVybiB0eXBlX2Vycm9yKCJpbnQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgIgorICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIsIG5vdCAnJS4yMDBzJyIsIG8pOwogfQogCiAvKiBBZGQgYSBjaGVjayBmb3IgZW1iZWRkZWQgTlVMTC1ieXRlcyBpbiB0aGUgYXJndW1lbnQuICovCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19mcm9tX3N0cmluZyhjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKLQljaGFyICplbmQ7Ci0JUHlPYmplY3QgKng7CisgICAgY2hhciAqZW5kOworICAgIFB5T2JqZWN0ICp4OwogCi0JeCA9IFB5TG9uZ19Gcm9tU3RyaW5nKChjaGFyKilzLCAmZW5kLCAxMCk7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGVuZCAhPSBzICsgbGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJudWxsIGJ5dGUgaW4gYXJndW1lbnQgZm9yIGxvbmcoKSIpOwotCQlQeV9ERUNSRUYoeCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4geDsKKyAgICB4ID0gUHlMb25nX0Zyb21TdHJpbmcoKGNoYXIqKXMsICZlbmQsIDEwKTsKKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZW5kICE9IHMgKyBsZW4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBieXRlIGluIGFyZ3VtZW50IGZvciBsb25nKCkiKTsKKyAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHg7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX0xvbmcoUHlPYmplY3QgKm8pCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptOwotCXN0YXRpYyBQeU9iamVjdCAqdHJ1bmNfbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKnRydW5jX2Z1bmM7Ci0JY29uc3QgY2hhciAqYnVmZmVyOwotCVB5X3NzaXplX3QgYnVmZmVyX2xlbjsKKyAgICBQeU51bWJlck1ldGhvZHMgKm07CisgICAgc3RhdGljIFB5T2JqZWN0ICp0cnVuY19uYW1lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdHJ1bmNfZnVuYzsKKyAgICBjb25zdCBjaGFyICpidWZmZXI7CisgICAgUHlfc3NpemVfdCBidWZmZXJfbGVuOwogCi0JaWYgKHRydW5jX25hbWUgPT0gTlVMTCkgewotCQl0cnVuY19uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX190cnVuY19fIik7Ci0JCWlmICh0cnVuY19uYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHRydW5jX25hbWUgPT0gTlVMTCkgeworICAgICAgICB0cnVuY19uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX190cnVuY19fIik7CisgICAgICAgIGlmICh0cnVuY19uYW1lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAobyA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOwotCW0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7Ci0JaWYgKG0gJiYgbS0+bmJfbG9uZykgeyAvKiBUaGlzIHNob3VsZCBpbmNsdWRlIHN1YmNsYXNzZXMgb2YgbG9uZyAqLwotCQkvKiBDbGFzc2ljIGNsYXNzZXMgYWx3YXlzIHRha2UgdGhpcyBicmFuY2guICovCi0JCVB5T2JqZWN0ICpyZXMgPSBtLT5uYl9sb25nKG8pOwotCQlpZiAocmVzICYmICghUHlJbnRfQ2hlY2socmVzKSAmJiAhUHlMb25nX0NoZWNrKHJlcykpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIl9fbG9uZ19fIHJldHVybmVkIG5vbi1sb25nICh0eXBlICUuMjAwcykiLAotCQkJCSAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JaWYgKFB5TG9uZ19DaGVjayhvKSkgLyogQSBsb25nIHN1YmNsYXNzIHdpdGhvdXQgbmJfbG9uZyAqLwotCQlyZXR1cm4gX1B5TG9uZ19Db3B5KChQeUxvbmdPYmplY3QgKilvKTsKLQl0cnVuY19mdW5jID0gUHlPYmplY3RfR2V0QXR0cihvLCB0cnVuY19uYW1lKTsKLQlpZiAodHJ1bmNfZnVuYykgewotCQlQeU9iamVjdCAqdHJ1bmNhdGVkID0gUHlFdmFsX0NhbGxPYmplY3QodHJ1bmNfZnVuYywgTlVMTCk7Ci0JCVB5T2JqZWN0ICppbnRfaW5zdGFuY2U7Ci0JCVB5X0RFQ1JFRih0cnVuY19mdW5jKTsKLQkJLyogX190cnVuY19fIGlzIHNwZWNpZmllZCB0byByZXR1cm4gYW4gSW50ZWdyYWwgdHlwZSwKLQkJICAgYnV0IGxvbmcoKSBuZWVkcyB0byByZXR1cm4gYSBsb25nLiAqLwotCQlpbnRfaW5zdGFuY2UgPSBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCi0JCQl0cnVuY2F0ZWQsCi0JCQkiX190cnVuY19fIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSAlLjIwMHMpIik7Ci0JCWlmIChpbnRfaW5zdGFuY2UgJiYgUHlJbnRfQ2hlY2soaW50X2luc3RhbmNlKSkgewotCQkJLyogTWFrZSBzdXJlIHRoYXQgbG9uZygpIHJldHVybnMgYSBsb25nIGluc3RhbmNlLiAqLwotCQkJbG9uZyB2YWx1ZSA9IFB5SW50X0FTX0xPTkcoaW50X2luc3RhbmNlKTsKLQkJCVB5X0RFQ1JFRihpbnRfaW5zdGFuY2UpOwotCQkJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGludF9pbnN0YW5jZTsKLQl9Ci0JUHlFcnJfQ2xlYXIoKTsgIC8qIEl0J3Mgbm90IGFuIGVycm9yIGlmICBvLl9fdHJ1bmNfXyBkb2Vzbid0IGV4aXN0LiAqLworICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobSAmJiBtLT5uYl9sb25nKSB7IC8qIFRoaXMgc2hvdWxkIGluY2x1ZGUgc3ViY2xhc3NlcyBvZiBsb25nICovCisgICAgICAgIC8qIENsYXNzaWMgY2xhc3NlcyBhbHdheXMgdGFrZSB0aGlzIGJyYW5jaC4gKi8KKyAgICAgICAgUHlPYmplY3QgKnJlcyA9IG0tPm5iX2xvbmcobyk7CisgICAgICAgIGlmIChyZXMgJiYgKCFQeUludF9DaGVjayhyZXMpICYmICFQeUxvbmdfQ2hlY2socmVzKSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9fbG9uZ19fIHJldHVybmVkIG5vbi1sb25nICh0eXBlICUuMjAwcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlmIChQeUxvbmdfQ2hlY2sobykpIC8qIEEgbG9uZyBzdWJjbGFzcyB3aXRob3V0IG5iX2xvbmcgKi8KKyAgICAgICAgcmV0dXJuIF9QeUxvbmdfQ29weSgoUHlMb25nT2JqZWN0ICopbyk7CisgICAgdHJ1bmNfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIobywgdHJ1bmNfbmFtZSk7CisgICAgaWYgKHRydW5jX2Z1bmMpIHsKKyAgICAgICAgUHlPYmplY3QgKnRydW5jYXRlZCA9IFB5RXZhbF9DYWxsT2JqZWN0KHRydW5jX2Z1bmMsIE5VTEwpOworICAgICAgICBQeU9iamVjdCAqaW50X2luc3RhbmNlOworICAgICAgICBQeV9ERUNSRUYodHJ1bmNfZnVuYyk7CisgICAgICAgIC8qIF9fdHJ1bmNfXyBpcyBzcGVjaWZpZWQgdG8gcmV0dXJuIGFuIEludGVncmFsIHR5cGUsCisgICAgICAgICAgIGJ1dCBsb25nKCkgbmVlZHMgdG8gcmV0dXJuIGEgbG9uZy4gKi8KKyAgICAgICAgaW50X2luc3RhbmNlID0gX1B5TnVtYmVyX0NvbnZlcnRJbnRlZ3JhbFRvSW50KAorICAgICAgICAgICAgdHJ1bmNhdGVkLAorICAgICAgICAgICAgIl9fdHJ1bmNfXyByZXR1cm5lZCBub24tSW50ZWdyYWwgKHR5cGUgJS4yMDBzKSIpOworICAgICAgICBpZiAoaW50X2luc3RhbmNlICYmIFB5SW50X0NoZWNrKGludF9pbnN0YW5jZSkpIHsKKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IGxvbmcoKSByZXR1cm5zIGEgbG9uZyBpbnN0YW5jZS4gKi8KKyAgICAgICAgICAgIGxvbmcgdmFsdWUgPSBQeUludF9BU19MT05HKGludF9pbnN0YW5jZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW50X2luc3RhbmNlKTsKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRfaW5zdGFuY2U7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7ICAvKiBJdCdzIG5vdCBhbiBlcnJvciBpZiAgby5fX3RydW5jX18gZG9lc24ndCBleGlzdC4gKi8KIAotCWlmIChQeVN0cmluZ19DaGVjayhvKSkKLQkJLyogbmVlZCB0byBkbyBleHRyYSBlcnJvciBjaGVja2luZyB0aGF0IFB5TG9uZ19Gcm9tU3RyaW5nKCkKLQkJICogZG9lc24ndCBkby4gIEluIHBhcnRpY3VsYXIgbG9uZygnOS41JykgbXVzdCByYWlzZSBhbgotCQkgKiBleGNlcHRpb24sIG5vdCB0cnVuY2F0ZSB0aGUgZmxvYXQuCi0JCSAqLwotCQlyZXR1cm4gbG9uZ19mcm9tX3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcobyksCi0JCQkJCVB5U3RyaW5nX0dFVF9TSVpFKG8pKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sobykpCisgICAgICAgIC8qIG5lZWQgdG8gZG8gZXh0cmEgZXJyb3IgY2hlY2tpbmcgdGhhdCBQeUxvbmdfRnJvbVN0cmluZygpCisgICAgICAgICAqIGRvZXNuJ3QgZG8uICBJbiBwYXJ0aWN1bGFyIGxvbmcoJzkuNScpIG11c3QgcmFpc2UgYW4KKyAgICAgICAgICogZXhjZXB0aW9uLCBub3QgdHJ1bmNhdGUgdGhlIGZsb2F0LgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIGxvbmdfZnJvbV9zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShvKSk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2sobykpCi0JCS8qIFRoZSBhYm92ZSBjaGVjayBpcyBkb25lIGluIFB5TG9uZ19Gcm9tVW5pY29kZSgpLiAqLwotCQlyZXR1cm4gUHlMb25nX0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKG8pLAotCQkJCQkgIFB5VW5pY29kZV9HRVRfU0laRShvKSwKLQkJCQkJICAxMCk7CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhvKSkKKyAgICAgICAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIGRvbmUgaW4gUHlMb25nX0Zyb21Vbmljb2RlKCkuICovCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUobyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwKTsKICNlbmRpZgotCWlmICghUHlPYmplY3RfQXNDaGFyQnVmZmVyKG8sICZidWZmZXIsICZidWZmZXJfbGVuKSkKLQkJcmV0dXJuIGxvbmdfZnJvbV9zdHJpbmcoYnVmZmVyLCBidWZmZXJfbGVuKTsKKyAgICBpZiAoIVB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihvLCAmYnVmZmVyLCAmYnVmZmVyX2xlbikpCisgICAgICAgIHJldHVybiBsb25nX2Zyb21fc3RyaW5nKGJ1ZmZlciwgYnVmZmVyX2xlbik7CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigibG9uZygpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSAiCi0JCQkgICJudW1iZXIsIG5vdCAnJS4yMDBzJyIsIG8pOworICAgIHJldHVybiB0eXBlX2Vycm9yKCJsb25nKCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhICIKKyAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyLCBub3QgJyUuMjAwcyciLCBvKTsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfRmxvYXQoUHlPYmplY3QgKm8pCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7Ci0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobSAmJiBtLT5uYl9mbG9hdCkgeyAvKiBUaGlzIHNob3VsZCBpbmNsdWRlIHN1YmNsYXNzZXMgb2YgZmxvYXQgKi8KLQkJUHlPYmplY3QgKnJlcyA9IG0tPm5iX2Zsb2F0KG8pOwotCQlpZiAocmVzICYmICFQeUZsb2F0X0NoZWNrKHJlcykpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgICAgICAiX19mbG9hdF9fIHJldHVybmVkIG5vbi1mbG9hdCAodHlwZSAlLjIwMHMpIiwKLQkJICAgICAgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCWlmIChQeUZsb2F0X0NoZWNrKG8pKSB7IC8qIEEgZmxvYXQgc3ViY2xhc3Mgd2l0aCBuYl9mbG9hdCA9PSBOVUxMICovCi0JCVB5RmxvYXRPYmplY3QgKnBvID0gKFB5RmxvYXRPYmplY3QgKilvOwotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHBvLT5vYl9mdmFsKTsKLQl9Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbVN0cmluZyhvLCBOVUxMKTsKKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgaWYgKG0gJiYgbS0+bmJfZmxvYXQpIHsgLyogVGhpcyBzaG91bGQgaW5jbHVkZSBzdWJjbGFzc2VzIG9mIGZsb2F0ICovCisgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBtLT5uYl9mbG9hdChvKTsKKyAgICAgICAgaWYgKHJlcyAmJiAhUHlGbG9hdF9DaGVjayhyZXMpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAiX19mbG9hdF9fIHJldHVybmVkIG5vbi1mbG9hdCAodHlwZSAlLjIwMHMpIiwKKyAgICAgICAgICAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKFB5RmxvYXRfQ2hlY2sobykpIHsgLyogQSBmbG9hdCBzdWJjbGFzcyB3aXRoIG5iX2Zsb2F0ID09IE5VTEwgKi8KKyAgICAgICAgUHlGbG9hdE9iamVjdCAqcG8gPSAoUHlGbG9hdE9iamVjdCAqKW87CisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocG8tPm9iX2Z2YWwpOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tU3RyaW5nKG8sIE5VTEwpOwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9Ub0Jhc2UoUHlPYmplY3QgKm4sIGludCBiYXNlKQogewotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCVB5T2JqZWN0ICppbmRleCA9IFB5TnVtYmVyX0luZGV4KG4pOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICppbmRleCA9IFB5TnVtYmVyX0luZGV4KG4pOwogCi0JaWYgKCFpbmRleCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5TG9uZ19DaGVjayhpbmRleCkpCi0JCXJlcyA9IF9QeUxvbmdfRm9ybWF0KGluZGV4LCBiYXNlLCAwLCAxKTsKLQllbHNlIGlmIChQeUludF9DaGVjayhpbmRleCkpCi0JICAJcmVzID0gX1B5SW50X0Zvcm1hdCgoUHlJbnRPYmplY3QqKWluZGV4LCBiYXNlLCAxKTsKLQllbHNlCi0JCS8qIEl0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gZ2V0IGhlcmUsIGFzCi0JCSAgIFB5TnVtYmVyX0luZGV4IGFscmVhZHkgaGFzIGEgY2hlY2sgZm9yIHRoZSBzYW1lCi0JCSAgIGNvbmRpdGlvbiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIlB5TnVtYmVyX1RvQmFzZTogaW5kZXggbm90ICIKLQkJCQkiaW50IG9yIGxvbmciKTsKLQlQeV9ERUNSRUYoaW5kZXgpOwotCXJldHVybiByZXM7CisgICAgaWYgKCFpbmRleCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TG9uZ19DaGVjayhpbmRleCkpCisgICAgICAgIHJlcyA9IF9QeUxvbmdfRm9ybWF0KGluZGV4LCBiYXNlLCAwLCAxKTsKKyAgICBlbHNlIGlmIChQeUludF9DaGVjayhpbmRleCkpCisgICAgICAgIHJlcyA9IF9QeUludF9Gb3JtYXQoKFB5SW50T2JqZWN0KilpbmRleCwgYmFzZSwgMSk7CisgICAgZWxzZQorICAgICAgICAvKiBJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIGdldCBoZXJlLCBhcworICAgICAgICAgICBQeU51bWJlcl9JbmRleCBhbHJlYWR5IGhhcyBhIGNoZWNrIGZvciB0aGUgc2FtZQorICAgICAgICAgICBjb25kaXRpb24gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJQeU51bWJlcl9Ub0Jhc2U6IGluZGV4IG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50IG9yIGxvbmciKTsKKyAgICBQeV9ERUNSRUYoaW5kZXgpOworICAgIHJldHVybiByZXM7CiB9CiAKIApAQCAtMTgzMyw1NDQgKzE4MzMsNTQ0IEBACiBpbnQKIFB5U2VxdWVuY2VfQ2hlY2soUHlPYmplY3QgKnMpCiB7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKFB5SW5zdGFuY2VfQ2hlY2socykpCi0JCXJldHVybiBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHMsICJfX2dldGl0ZW1fXyIpOwotCWlmIChQeURpY3RfQ2hlY2socykpCi0JCXJldHVybiAwOwotCXJldHVybiAgcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYKLQkJcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2l0ZW0gIT0gTlVMTDsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayhzKSkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcocywgIl9fZ2V0aXRlbV9fIik7CisgICAgaWYgKFB5RGljdF9DaGVjayhzKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuICBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSAmJgorICAgICAgICBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSAhPSBOVUxMOwogfQogCiBQeV9zc2l6ZV90CiBQeVNlcXVlbmNlX1NpemUoUHlPYmplY3QgKnMpCiB7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKm07CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLQlpZiAocyA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBtLT5zcV9sZW5ndGgpCi0JCXJldHVybiBtLT5zcV9sZW5ndGgocyk7CisgICAgbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIG0tPnNxX2xlbmd0aCkKKyAgICAgICAgcmV0dXJuIG0tPnNxX2xlbmd0aChzKTsKIAotCXR5cGVfZXJyb3IoIm9iamVjdCBvZiB0eXBlICclLjIwMHMnIGhhcyBubyBsZW4oKSIsIHMpOwotCXJldHVybiAtMTsKKyAgICB0eXBlX2Vycm9yKCJvYmplY3Qgb2YgdHlwZSAnJS4yMDBzJyBoYXMgbm8gbGVuKCkiLCBzKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKICN1bmRlZiBQeVNlcXVlbmNlX0xlbmd0aAogUHlfc3NpemVfdAogUHlTZXF1ZW5jZV9MZW5ndGgoUHlPYmplY3QgKnMpCiB7Ci0JcmV0dXJuIFB5U2VxdWVuY2VfU2l6ZShzKTsKKyAgICByZXR1cm4gUHlTZXF1ZW5jZV9TaXplKHMpOwogfQogI2RlZmluZSBQeVNlcXVlbmNlX0xlbmd0aCBQeVNlcXVlbmNlX1NpemUKIAogUHlPYmplY3QgKgogUHlTZXF1ZW5jZV9Db25jYXQoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICpvKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKHMgPT0gTlVMTCB8fCBvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKHMgPT0gTlVMTCB8fCBvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfY29uY2F0KQotCQlyZXR1cm4gbS0+c3FfY29uY2F0KHMsIG8pOworICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9jb25jYXQpCisgICAgICAgIHJldHVybiBtLT5zcV9jb25jYXQocywgbyk7CiAKLQkvKiBJbnN0YW5jZXMgb2YgdXNlciBjbGFzc2VzIGRlZmluaW5nIGFuIF9fYWRkX18oKSBtZXRob2Qgb25seQotCSAgIGhhdmUgYW4gbmJfYWRkIHNsb3QsIG5vdCBhbiBzcV9jb25jYXQgc2xvdC4gIFNvIHdlIGZhbGwgYmFjawotCSAgIHRvIG5iX2FkZCBpZiBib3RoIGFyZ3VtZW50cyBhcHBlYXIgdG8gYmUgc2VxdWVuY2VzLiAqLwotCWlmIChQeVNlcXVlbmNlX0NoZWNrKHMpICYmIFB5U2VxdWVuY2VfQ2hlY2sobykpIHsKLQkJUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9vcDEocywgbywgTkJfU0xPVChuYl9hZGQpKTsKLQkJaWYgKHJlc3VsdCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZCIsIHMpOworICAgIC8qIEluc3RhbmNlcyBvZiB1c2VyIGNsYXNzZXMgZGVmaW5pbmcgYW4gX19hZGRfXygpIG1ldGhvZCBvbmx5CisgICAgICAgaGF2ZSBhbiBuYl9hZGQgc2xvdCwgbm90IGFuIHNxX2NvbmNhdCBzbG90LiAgU28gd2UgZmFsbCBiYWNrCisgICAgICAgdG8gbmJfYWRkIGlmIGJvdGggYXJndW1lbnRzIGFwcGVhciB0byBiZSBzZXF1ZW5jZXMuICovCisgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2socykgJiYgUHlTZXF1ZW5jZV9DaGVjayhvKSkgeworICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X29wMShzLCBvLCBOQl9TTE9UKG5iX2FkZCkpOworICAgICAgICBpZiAocmVzdWx0ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgY2FuJ3QgYmUgY29uY2F0ZW5hdGVkIiwgcyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfUmVwZWF0KFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGNvdW50KQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwotCWlmIChtICYmIG0tPnNxX3JlcGVhdCkKLQkJcmV0dXJuIG0tPnNxX3JlcGVhdChvLCBjb3VudCk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIG0tPnNxX3JlcGVhdCkKKyAgICAgICAgcmV0dXJuIG0tPnNxX3JlcGVhdChvLCBjb3VudCk7CiAKLQkvKiBJbnN0YW5jZXMgb2YgdXNlciBjbGFzc2VzIGRlZmluaW5nIGEgX19tdWxfXygpIG1ldGhvZCBvbmx5Ci0JICAgaGF2ZSBhbiBuYl9tdWx0aXBseSBzbG90LCBub3QgYW4gc3FfcmVwZWF0IHNsb3QuIHNvIHdlIGZhbGwgYmFjawotCSAgIHRvIG5iX211bHRpcGx5IGlmIG8gYXBwZWFycyB0byBiZSBhIHNlcXVlbmNlLiAqLwotCWlmIChQeVNlcXVlbmNlX0NoZWNrKG8pKSB7Ci0JCVB5T2JqZWN0ICpuLCAqcmVzdWx0OwotCQluID0gUHlJbnRfRnJvbVNzaXplX3QoY291bnQpOwotCQlpZiAobiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlc3VsdCA9IGJpbmFyeV9vcDEobywgbiwgTkJfU0xPVChuYl9tdWx0aXBseSkpOwotCQlQeV9ERUNSRUYobik7Ci0JCWlmIChyZXN1bHQgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQl9Ci0JcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBjYW4ndCBiZSByZXBlYXRlZCIsIG8pOworICAgIC8qIEluc3RhbmNlcyBvZiB1c2VyIGNsYXNzZXMgZGVmaW5pbmcgYSBfX211bF9fKCkgbWV0aG9kIG9ubHkKKyAgICAgICBoYXZlIGFuIG5iX211bHRpcGx5IHNsb3QsIG5vdCBhbiBzcV9yZXBlYXQgc2xvdC4gc28gd2UgZmFsbCBiYWNrCisgICAgICAgdG8gbmJfbXVsdGlwbHkgaWYgbyBhcHBlYXJzIHRvIGJlIGEgc2VxdWVuY2UuICovCisgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2sobykpIHsKKyAgICAgICAgUHlPYmplY3QgKm4sICpyZXN1bHQ7CisgICAgICAgIG4gPSBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CisgICAgICAgIGlmIChuID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzdWx0ID0gYmluYXJ5X29wMShvLCBuLCBOQl9TTE9UKG5iX211bHRpcGx5KSk7CisgICAgICAgIFB5X0RFQ1JFRihuKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIHJlcGVhdGVkIiwgbyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdChQeU9iamVjdCAqcywgUHlPYmplY3QgKm8pCiB7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKm07CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLQlpZiAocyA9PSBOVUxMIHx8IG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAocyA9PSBOVUxMIHx8IG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBIQVNJTlBMQUNFKHMpICYmIG0tPnNxX2lucGxhY2VfY29uY2F0KQotCQlyZXR1cm4gbS0+c3FfaW5wbGFjZV9jb25jYXQocywgbyk7Ci0JaWYgKG0gJiYgbS0+c3FfY29uY2F0KQotCQlyZXR1cm4gbS0+c3FfY29uY2F0KHMsIG8pOworICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBIQVNJTlBMQUNFKHMpICYmIG0tPnNxX2lucGxhY2VfY29uY2F0KQorICAgICAgICByZXR1cm4gbS0+c3FfaW5wbGFjZV9jb25jYXQocywgbyk7CisgICAgaWYgKG0gJiYgbS0+c3FfY29uY2F0KQorICAgICAgICByZXR1cm4gbS0+c3FfY29uY2F0KHMsIG8pOwogCi0JaWYgKFB5U2VxdWVuY2VfQ2hlY2socykgJiYgUHlTZXF1ZW5jZV9DaGVjayhvKSkgewotCQlQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X2lvcDEocywgbywgTkJfU0xPVChuYl9pbnBsYWNlX2FkZCksCi0JCQkJCSAgICAgICBOQl9TTE9UKG5iX2FkZCkpOwotCQlpZiAocmVzdWx0ICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JfQotCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgY2FuJ3QgYmUgY29uY2F0ZW5hdGVkIiwgcyk7CisgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2socykgJiYgUHlTZXF1ZW5jZV9DaGVjayhvKSkgeworICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X2lvcDEocywgbywgTkJfU0xPVChuYl9pbnBsYWNlX2FkZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9TTE9UKG5iX2FkZCkpOworICAgICAgICBpZiAocmVzdWx0ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgY2FuJ3QgYmUgY29uY2F0ZW5hdGVkIiwgcyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdChQeU9iamVjdCAqbywgUHlfc3NpemVfdCBjb3VudCkKIHsKLQlQeVNlcXVlbmNlTWV0aG9kcyAqbTsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW0gPSBvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBIQVNJTlBMQUNFKG8pICYmIG0tPnNxX2lucGxhY2VfcmVwZWF0KQotCQlyZXR1cm4gbS0+c3FfaW5wbGFjZV9yZXBlYXQobywgY291bnQpOwotCWlmIChtICYmIG0tPnNxX3JlcGVhdCkKLQkJcmV0dXJuIG0tPnNxX3JlcGVhdChvLCBjb3VudCk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIEhBU0lOUExBQ0UobykgJiYgbS0+c3FfaW5wbGFjZV9yZXBlYXQpCisgICAgICAgIHJldHVybiBtLT5zcV9pbnBsYWNlX3JlcGVhdChvLCBjb3VudCk7CisgICAgaWYgKG0gJiYgbS0+c3FfcmVwZWF0KQorICAgICAgICByZXR1cm4gbS0+c3FfcmVwZWF0KG8sIGNvdW50KTsKIAotCWlmIChQeVNlcXVlbmNlX0NoZWNrKG8pKSB7Ci0JCVB5T2JqZWN0ICpuLCAqcmVzdWx0OwotCQluID0gUHlJbnRfRnJvbVNzaXplX3QoY291bnQpOwotCQlpZiAobiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlc3VsdCA9IGJpbmFyeV9pb3AxKG8sIG4sIE5CX1NMT1QobmJfaW5wbGFjZV9tdWx0aXBseSksCi0JCQkJICAgICBOQl9TTE9UKG5iX211bHRpcGx5KSk7Ci0JCVB5X0RFQ1JFRihuKTsKLQkJaWYgKHJlc3VsdCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIHJlcGVhdGVkIiwgbyk7CisgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2sobykpIHsKKyAgICAgICAgUHlPYmplY3QgKm4sICpyZXN1bHQ7CisgICAgICAgIG4gPSBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CisgICAgICAgIGlmIChuID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzdWx0ID0gYmluYXJ5X2lvcDEobywgbiwgTkJfU0xPVChuYl9pbnBsYWNlX211bHRpcGx5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJfU0xPVChuYl9tdWx0aXBseSkpOworICAgICAgICBQeV9ERUNSRUYobik7CisgICAgICAgIGlmIChyZXN1bHQgIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBjYW4ndCBiZSByZXBlYXRlZCIsIG8pOwogfQogCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX0dldEl0ZW0oUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgaSkKIHsKLQlQeVNlcXVlbmNlTWV0aG9kcyAqbTsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbTsKIAotCWlmIChzID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBtLT5zcV9pdGVtKSB7Ci0JCWlmIChpIDwgMCkgewotCQkJaWYgKG0tPnNxX2xlbmd0aCkgewotCQkJCVB5X3NzaXplX3QgbCA9ICgqbS0+c3FfbGVuZ3RoKShzKTsKLQkJCQlpZiAobCA8IDApCi0JCQkJCXJldHVybiBOVUxMOwotCQkJCWkgKz0gbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbS0+c3FfaXRlbShzLCBpKTsKLQl9CisgICAgbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIG0tPnNxX2l0ZW0pIHsKKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOworICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgaSArPSBsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtLT5zcV9pdGVtKHMsIGkpOworICAgIH0KIAotCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGluZyIsIHMpOworICAgIHJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGluZyIsIHMpOwogfQogCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX0dldFNsaWNlKFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOwotCVB5TWFwcGluZ01ldGhvZHMgKm1wOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5TWFwcGluZ01ldGhvZHMgKm1wOwogCi0JaWYgKCFzKSByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmICghcykgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBtLT5zcV9zbGljZSkgewotCQlpZiAoaTEgPCAwIHx8IGkyIDwgMCkgewotCQkJaWYgKG0tPnNxX2xlbmd0aCkgewotCQkJCVB5X3NzaXplX3QgbCA9ICgqbS0+c3FfbGVuZ3RoKShzKTsKLQkJCQlpZiAobCA8IDApCi0JCQkJCXJldHVybiBOVUxMOwotCQkJCWlmIChpMSA8IDApCi0JCQkJCWkxICs9IGw7Ci0JCQkJaWYgKGkyIDwgMCkKLQkJCQkJaTIgKz0gbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbS0+c3Ffc2xpY2UocywgaTEsIGkyKTsKLQl9IGVsc2UgaWYgKChtcCA9IHMtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcpICYmIG1wLT5tcF9zdWJzY3JpcHQpIHsKLQkJUHlPYmplY3QgKnJlczsKLQkJUHlPYmplY3QgKnNsaWNlID0gX1B5U2xpY2VfRnJvbUluZGljZXMoaTEsIGkyKTsKLQkJaWYgKCFzbGljZSkKLQkJCXJldHVybiBOVUxMOwotCQlyZXMgPSBtcC0+bXBfc3Vic2NyaXB0KHMsIHNsaWNlKTsKLQkJUHlfREVDUkVGKHNsaWNlKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIG0tPnNxX3NsaWNlKSB7CisgICAgICAgIGlmIChpMSA8IDAgfHwgaTIgPCAwKSB7CisgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOworICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKGkxIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaTEgKz0gbDsKKyAgICAgICAgICAgICAgICBpZiAoaTIgPCAwKQorICAgICAgICAgICAgICAgICAgICBpMiArPSBsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtLT5zcV9zbGljZShzLCBpMSwgaTIpOworICAgIH0gZWxzZSBpZiAoKG1wID0gcy0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZykgJiYgbXAtPm1wX3N1YnNjcmlwdCkgeworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBQeU9iamVjdCAqc2xpY2UgPSBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpMSwgaTIpOworICAgICAgICBpZiAoIXNsaWNlKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlcyA9IG1wLT5tcF9zdWJzY3JpcHQocywgc2xpY2UpOworICAgICAgICBQeV9ERUNSRUYoc2xpY2UpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgaXMgdW5zbGljZWFibGUiLCBzKTsKKyAgICByZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGlzIHVuc2xpY2VhYmxlIiwgcyk7CiB9CiAKIGludAogUHlTZXF1ZW5jZV9TZXRJdGVtKFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICpvKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKHMgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfYXNzX2l0ZW0pIHsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlpZiAobS0+c3FfbGVuZ3RoKSB7Ci0JCQkJUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOwotCQkJCWlmIChsIDwgMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWkgKz0gbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbS0+c3FfYXNzX2l0ZW0ocywgaSwgbyk7Ci0JfQorICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9hc3NfaXRlbSkgeworICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgIGlmIChtLT5zcV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7CisgICAgICAgICAgICAgICAgaWYgKGwgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgaSArPSBsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtLT5zcV9hc3NfaXRlbShzLCBpLCBvKTsKKyAgICB9CiAKLQl0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQiLCBzKTsKLQlyZXR1cm4gLTE7CisgICAgdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Iiwgcyk7CisgICAgcmV0dXJuIC0xOwogfQogCiBpbnQKIFB5U2VxdWVuY2VfRGVsSXRlbShQeU9iamVjdCAqcywgUHlfc3NpemVfdCBpKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKHMgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfYXNzX2l0ZW0pIHsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlpZiAobS0+c3FfbGVuZ3RoKSB7Ci0JCQkJUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOwotCQkJCWlmIChsIDwgMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWkgKz0gbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbS0+c3FfYXNzX2l0ZW0ocywgaSwgKFB5T2JqZWN0ICopTlVMTCk7Ci0JfQorICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9hc3NfaXRlbSkgeworICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgIGlmIChtLT5zcV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7CisgICAgICAgICAgICAgICAgaWYgKGwgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgaSArPSBsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtLT5zcV9hc3NfaXRlbShzLCBpLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICB9CiAKLQl0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lc24ndCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iLCBzKTsKLQlyZXR1cm4gLTE7CisgICAgdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIiwgcyk7CisgICAgcmV0dXJuIC0xOwogfQogCiBpbnQKIFB5U2VxdWVuY2VfU2V0U2xpY2UoUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIsIFB5T2JqZWN0ICpvKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOwotCVB5TWFwcGluZ01ldGhvZHMgKm1wOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5TWFwcGluZ01ldGhvZHMgKm1wOwogCi0JaWYgKHMgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfYXNzX3NsaWNlKSB7Ci0JCWlmIChpMSA8IDAgfHwgaTIgPCAwKSB7Ci0JCQlpZiAobS0+c3FfbGVuZ3RoKSB7Ci0JCQkJUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOwotCQkJCWlmIChsIDwgMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWlmIChpMSA8IDApCi0JCQkJCWkxICs9IGw7Ci0JCQkJaWYgKGkyIDwgMCkKLQkJCQkJaTIgKz0gbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbS0+c3FfYXNzX3NsaWNlKHMsIGkxLCBpMiwgbyk7Ci0JfSBlbHNlIGlmICgobXAgPSBzLT5vYl90eXBlLT50cF9hc19tYXBwaW5nKSAmJiBtcC0+bXBfYXNzX3N1YnNjcmlwdCkgewotCQlpbnQgcmVzOwotCQlQeU9iamVjdCAqc2xpY2UgPSBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpMSwgaTIpOwotCQlpZiAoIXNsaWNlKQotCQkJcmV0dXJuIC0xOwotCQlyZXMgPSBtcC0+bXBfYXNzX3N1YnNjcmlwdChzLCBzbGljZSwgbyk7Ci0JCVB5X0RFQ1JFRihzbGljZSk7Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9hc3Nfc2xpY2UpIHsKKyAgICAgICAgaWYgKGkxIDwgMCB8fCBpMiA8IDApIHsKKyAgICAgICAgICAgIGlmIChtLT5zcV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7CisgICAgICAgICAgICAgICAgaWYgKGwgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgaWYgKGkxIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaTEgKz0gbDsKKyAgICAgICAgICAgICAgICBpZiAoaTIgPCAwKQorICAgICAgICAgICAgICAgICAgICBpMiArPSBsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtLT5zcV9hc3Nfc2xpY2UocywgaTEsIGkyLCBvKTsKKyAgICB9IGVsc2UgaWYgKChtcCA9IHMtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcpICYmIG1wLT5tcF9hc3Nfc3Vic2NyaXB0KSB7CisgICAgICAgIGludCByZXM7CisgICAgICAgIFB5T2JqZWN0ICpzbGljZSA9IF9QeVNsaWNlX0Zyb21JbmRpY2VzKGkxLCBpMik7CisgICAgICAgIGlmICghc2xpY2UpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlcyA9IG1wLT5tcF9hc3Nfc3Vic2NyaXB0KHMsIHNsaWNlLCBvKTsKKyAgICAgICAgUHlfREVDUkVGKHNsaWNlKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQl0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lc24ndCBzdXBwb3J0IHNsaWNlIGFzc2lnbm1lbnQiLCBzKTsKLQlyZXR1cm4gLTE7CisgICAgdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBhc3NpZ25tZW50Iiwgcyk7CisgICAgcmV0dXJuIC0xOwogfQogCiBpbnQKIFB5U2VxdWVuY2VfRGVsU2xpY2UoUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIpCiB7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKm07CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLQlpZiAocyA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBtLT5zcV9hc3Nfc2xpY2UpIHsKLQkJaWYgKGkxIDwgMCB8fCBpMiA8IDApIHsKLQkJCWlmIChtLT5zcV9sZW5ndGgpIHsKLQkJCQlQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7Ci0JCQkJaWYgKGwgPCAwKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJaWYgKGkxIDwgMCkKLQkJCQkJaTEgKz0gbDsKLQkJCQlpZiAoaTIgPCAwKQotCQkJCQlpMiArPSBsOwotCQkJfQotCQl9Ci0JCXJldHVybiBtLT5zcV9hc3Nfc2xpY2UocywgaTEsIGkyLCAoUHlPYmplY3QgKilOVUxMKTsKLQl9Ci0JdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBkZWxldGlvbiIsIHMpOwotCXJldHVybiAtMTsKKyAgICBtID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgaWYgKG0gJiYgbS0+c3FfYXNzX3NsaWNlKSB7CisgICAgICAgIGlmIChpMSA8IDAgfHwgaTIgPCAwKSB7CisgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOworICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGlmIChpMSA8IDApCisgICAgICAgICAgICAgICAgICAgIGkxICs9IGw7CisgICAgICAgICAgICAgICAgaWYgKGkyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaTIgKz0gbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbS0+c3FfYXNzX3NsaWNlKHMsIGkxLCBpMiwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgfQorICAgIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgZGVsZXRpb24iLCBzKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfVHVwbGUoUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKml0OyAgLyogaXRlcih2KSAqLwotCVB5X3NzaXplX3QgbjsgICAgICAgICAvKiBndWVzcyBmb3IgcmVzdWx0IHR1cGxlIHNpemUgKi8KLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlQeV9zc2l6ZV90IGo7CisgICAgUHlPYmplY3QgKml0OyAgLyogaXRlcih2KSAqLworICAgIFB5X3NzaXplX3QgbjsgICAgICAgICAvKiBndWVzcyBmb3IgcmVzdWx0IHR1cGxlIHNpemUgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGo7CiAKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQkvKiBTcGVjaWFsLWNhc2UgdGhlIGNvbW1vbiB0dXBsZSBhbmQgbGlzdCBjYXNlcywgZm9yIGVmZmljaWVuY3kuICovCi0JaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh2KSkgewotCQkvKiBOb3RlIHRoYXQgd2UgY2FuJ3Qga25vdyB3aGV0aGVyIGl0J3Mgc2FmZSB0byByZXR1cm4KLQkJICAgYSB0dXBsZSAqc3ViY2xhc3MqIGluc3RhbmNlIGFzLWlzLCBoZW5jZSB0aGUgcmVzdHJpY3Rpb24KLQkJICAgdG8gZXhhY3QgdHVwbGVzIGhlcmUuICBJbiBjb250cmFzdCwgbGlzdHMgYWx3YXlzIG1ha2UKLQkJICAgYSBjb3B5LCBzbyB0aGVyZSdzIG5vIG5lZWQgZm9yIGV4YWN0bmVzcyBiZWxvdy4gKi8KLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gdjsKLQl9Ci0JaWYgKFB5TGlzdF9DaGVjayh2KSkKLQkJcmV0dXJuIFB5TGlzdF9Bc1R1cGxlKHYpOworICAgIC8qIFNwZWNpYWwtY2FzZSB0aGUgY29tbW9uIHR1cGxlIGFuZCBsaXN0IGNhc2VzLCBmb3IgZWZmaWNpZW5jeS4gKi8KKyAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIC8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBrbm93IHdoZXRoZXIgaXQncyBzYWZlIHRvIHJldHVybgorICAgICAgICAgICBhIHR1cGxlICpzdWJjbGFzcyogaW5zdGFuY2UgYXMtaXMsIGhlbmNlIHRoZSByZXN0cmljdGlvbgorICAgICAgICAgICB0byBleGFjdCB0dXBsZXMgaGVyZS4gIEluIGNvbnRyYXN0LCBsaXN0cyBhbHdheXMgbWFrZQorICAgICAgICAgICBhIGNvcHksIHNvIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgZXhhY3RuZXNzIGJlbG93LiAqLworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICBpZiAoUHlMaXN0X0NoZWNrKHYpKQorICAgICAgICByZXR1cm4gUHlMaXN0X0FzVHVwbGUodik7CiAKLQkvKiBHZXQgaXRlcmF0b3IuICovCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEd1ZXNzIHJlc3VsdCBzaXplIGFuZCBhbGxvY2F0ZSBzcGFjZS4gKi8KLQluID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQodiwgMTApOwotCWlmIChuID09IC0xKQotCQlnb3RvIEZhaWw7Ci0JcmVzdWx0ID0gUHlUdXBsZV9OZXcobik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgLyogR3Vlc3MgcmVzdWx0IHNpemUgYW5kIGFsbG9jYXRlIHNwYWNlLiAqLworICAgIG4gPSBfUHlPYmplY3RfTGVuZ3RoSGludCh2LCAxMCk7CisgICAgaWYgKG4gPT0gLTEpCisgICAgICAgIGdvdG8gRmFpbDsKKyAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCS8qIEZpbGwgdGhlIHR1cGxlLiAqLwotCWZvciAoaiA9IDA7IDsgKytqKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlJdGVyX05leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIEZhaWw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoaiA+PSBuKSB7Ci0JCQlQeV9zc2l6ZV90IG9sZG4gPSBuOwotCQkJLyogVGhlIG92ZXItYWxsb2NhdGlvbiBzdHJhdGVneSBjYW4gZ3JvdyBhIGJpdCBmYXN0ZXIKLQkJCSAgIHRoYW4gZm9yIGxpc3RzIGJlY2F1c2UgdW5saWtlIGxpc3RzIHRoZSAKLQkJCSAgIG92ZXItYWxsb2NhdGlvbiBpc24ndCBwZXJtYW5lbnQgLS0gd2UgcmVjbGFpbQotCQkJICAgdGhlIGV4Y2VzcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUuCi0JCQkgICBTbywgZ3JvdyBieSB0ZW4gYW5kIHRoZW4gYWRkIDI1JS4KLQkJCSovCi0JCQluICs9IDEwOwotCQkJbiArPSBuID4+IDI7Ci0JCQlpZiAobiA8IG9sZG4pIHsKLQkJCQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlnb3RvIEZhaWw7IAotCQkJfQotCQkJaWYgKF9QeVR1cGxlX1Jlc2l6ZSgmcmVzdWx0LCBuKSAhPSAwKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbDsKLQkJCX0KLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaiwgaXRlbSk7Ci0JfQorICAgIC8qIEZpbGwgdGhlIHR1cGxlLiAqLworICAgIGZvciAoaiA9IDA7IDsgKytqKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaiA+PSBuKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG9sZG4gPSBuOworICAgICAgICAgICAgLyogVGhlIG92ZXItYWxsb2NhdGlvbiBzdHJhdGVneSBjYW4gZ3JvdyBhIGJpdCBmYXN0ZXIKKyAgICAgICAgICAgICAgIHRoYW4gZm9yIGxpc3RzIGJlY2F1c2UgdW5saWtlIGxpc3RzIHRoZQorICAgICAgICAgICAgICAgb3Zlci1hbGxvY2F0aW9uIGlzbid0IHBlcm1hbmVudCAtLSB3ZSByZWNsYWltCisgICAgICAgICAgICAgICB0aGUgZXhjZXNzIGJlZm9yZSB0aGUgZW5kIG9mIHRoaXMgcm91dGluZS4KKyAgICAgICAgICAgICAgIFNvLCBncm93IGJ5IHRlbiBhbmQgdGhlbiBhZGQgMjUlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG4gKz0gMTA7CisgICAgICAgICAgICBuICs9IG4gPj4gMjsKKyAgICAgICAgICAgIGlmIChuIDwgb2xkbikgeworICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfUHlUdXBsZV9SZXNpemUoJnJlc3VsdCwgbikgIT0gMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGosIGl0ZW0pOworICAgIH0KIAotCS8qIEN1dCB0dXBsZSBiYWNrIGlmIGd1ZXNzIHdhcyB0b28gbGFyZ2UuICovCi0JaWYgKGogPCBuICYmCi0JICAgIF9QeVR1cGxlX1Jlc2l6ZSgmcmVzdWx0LCBqKSAhPSAwKQotCQlnb3RvIEZhaWw7CisgICAgLyogQ3V0IHR1cGxlIGJhY2sgaWYgZ3Vlc3Mgd2FzIHRvbyBsYXJnZS4gKi8KKyAgICBpZiAoaiA8IG4gJiYKKyAgICAgICAgX1B5VHVwbGVfUmVzaXplKCZyZXN1bHQsIGopICE9IDApCisgICAgICAgIGdvdG8gRmFpbDsKIAotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9ERUNSRUYoaXQpOworICAgIHJldHVybiByZXN1bHQ7CiAKIEZhaWw6Ci0JUHlfWERFQ1JFRihyZXN1bHQpOwotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfTGlzdChQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OyAgLyogcmVzdWx0IGxpc3QgKi8KLQlQeU9iamVjdCAqcnY7ICAgICAgLyogcmV0dXJuIHZhbHVlIGZyb20gUHlMaXN0X0V4dGVuZCAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAvKiByZXN1bHQgbGlzdCAqLworICAgIFB5T2JqZWN0ICpydjsgICAgICAvKiByZXR1cm4gdmFsdWUgZnJvbSBQeUxpc3RfRXh0ZW5kICovCiAKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQlyZXN1bHQgPSBQeUxpc3RfTmV3KDApOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcnYgPSBfUHlMaXN0X0V4dGVuZCgoUHlMaXN0T2JqZWN0ICopcmVzdWx0LCB2KTsKLQlpZiAocnYgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihydik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBydiA9IF9QeUxpc3RfRXh0ZW5kKChQeUxpc3RPYmplY3QgKilyZXN1bHQsIHYpOworICAgIGlmIChydiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX0Zhc3QoUHlPYmplY3QgKnYsIGNvbnN0IGNoYXIgKm0pCiB7Ci0JUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdDsKIAotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCWlmIChQeUxpc3RfQ2hlY2tFeGFjdCh2KSB8fCBQeVR1cGxlX0NoZWNrRXhhY3QodikpIHsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gdjsKLQl9CisgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHYpIHx8IFB5VHVwbGVfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KIAotIAlpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7Ci0JaWYgKGl0ID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG0pOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOworICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JdiA9IFB5U2VxdWVuY2VfTGlzdChpdCk7Ci0JUHlfREVDUkVGKGl0KTsKKyAgICB2ID0gUHlTZXF1ZW5jZV9MaXN0KGl0KTsKKyAgICBQeV9ERUNSRUYoaXQpOwogCi0JcmV0dXJuIHY7CisgICAgcmV0dXJuIHY7CiB9CiAKIC8qIEl0ZXJhdGUgb3ZlciBzZXEuICBSZXN1bHQgZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW9uOgogICAgUFlfSVRFUlNFQVJDSF9DT1VOVDogIC0xIGlmIGVycm9yLCBlbHNlICMgb2YgdGltZXMgb2JqIGFwcGVhcnMgaW4gc2VxLgogICAgUFlfSVRFUlNFQVJDSF9JTkRFWDogIDAtYmFzZWQgaW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZSBvZiBvYmogaW4gc2VxOwotICAgCXNldCBWYWx1ZUVycm9yIGFuZCByZXR1cm4gLTEgaWYgbm9uZSBmb3VuZDsgYWxzbyByZXR1cm4gLTEgb24gZXJyb3IuCisgICAgc2V0IFZhbHVlRXJyb3IgYW5kIHJldHVybiAtMSBpZiBub25lIGZvdW5kOyBhbHNvIHJldHVybiAtMSBvbiBlcnJvci4KICAgIFB5X0lURVJTRUFSQ0hfQ09OVEFJTlM6ICByZXR1cm4gMSBpZiBvYmogaW4gc2VxLCBlbHNlIDA7IC0xIG9uIGVycm9yLgogKi8KIFB5X3NzaXplX3QKIF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goUHlPYmplY3QgKnNlcSwgUHlPYmplY3QgKm9iaiwgaW50IG9wZXJhdGlvbikKIHsKLQlQeV9zc2l6ZV90IG47Ci0JaW50IHdyYXBwZWQ7ICAvKiBmb3IgUFlfSVRFUlNFQVJDSF9JTkRFWCwgdHJ1ZSBpZmYgbiB3cmFwcGVkIGFyb3VuZCAqLwotCVB5T2JqZWN0ICppdDsgIC8qIGl0ZXIoc2VxKSAqLworICAgIFB5X3NzaXplX3QgbjsKKyAgICBpbnQgd3JhcHBlZDsgIC8qIGZvciBQWV9JVEVSU0VBUkNIX0lOREVYLCB0cnVlIGlmZiBuIHdyYXBwZWQgYXJvdW5kICovCisgICAgUHlPYmplY3QgKml0OyAgLyogaXRlcihzZXEpICovCiAKLQlpZiAoc2VxID09IE5VTEwgfHwgb2JqID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChzZXEgPT0gTlVMTCB8fCBvYmogPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXQgPT0gTlVMTCkgewotCQl0eXBlX2Vycm9yKCJhcmd1bWVudCBvZiB0eXBlICclLjIwMHMnIGlzIG5vdCBpdGVyYWJsZSIsIHNlcSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgdHlwZV9lcnJvcigiYXJndW1lbnQgb2YgdHlwZSAnJS4yMDBzJyBpcyBub3QgaXRlcmFibGUiLCBzZXEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbiA9IHdyYXBwZWQgPSAwOwotCWZvciAoOzspIHsKLQkJaW50IGNtcDsKLQkJUHlPYmplY3QgKml0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gRmFpbDsKLQkJCWJyZWFrOwotCQl9CisgICAgbiA9IHdyYXBwZWQgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGNtcDsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKG9iaiwgaXRlbSwgUHlfRVEpOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCWlmIChjbXAgPCAwKQotCQkJZ290byBGYWlsOwotCQlpZiAoY21wID4gMCkgewotCQkJc3dpdGNoIChvcGVyYXRpb24pIHsKLQkJCWNhc2UgUFlfSVRFUlNFQVJDSF9DT1VOVDoKLQkJCQlpZiAobiA9PSBQWV9TU0laRV9UX01BWCkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJICAgICAgICJjb3VudCBleGNlZWRzIEMgaW50ZWdlciBzaXplIik7Ci0JCQkJCWdvdG8gRmFpbDsKLQkJCQl9Ci0JCQkJKytuOwotCQkJCWJyZWFrOworICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wob2JqLCBpdGVtLCBQeV9FUSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIGlmIChjbXAgPiAwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdGlvbikgeworICAgICAgICAgICAgY2FzZSBQWV9JVEVSU0VBUkNIX0NPVU5UOgorICAgICAgICAgICAgICAgIGlmIChuID09IFBZX1NTSVpFX1RfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50IGV4Y2VlZHMgQyBpbnRlZ2VyIHNpemUiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK247CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCWNhc2UgUFlfSVRFUlNFQVJDSF9JTkRFWDoKLQkJCQlpZiAod3JhcHBlZCkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJICAgICAgICJpbmRleCBleGNlZWRzIEMgaW50ZWdlciBzaXplIik7Ci0JCQkJCWdvdG8gRmFpbDsKLQkJCQl9Ci0JCQkJZ290byBEb25lOworICAgICAgICAgICAgY2FzZSBQWV9JVEVSU0VBUkNIX0lOREVYOgorICAgICAgICAgICAgICAgIGlmICh3cmFwcGVkKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4IGV4Y2VlZHMgQyBpbnRlZ2VyIHNpemUiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CiAKLQkJCWNhc2UgUFlfSVRFUlNFQVJDSF9DT05UQUlOUzoKLQkJCQluID0gMTsKLQkJCQlnb3RvIERvbmU7CisgICAgICAgICAgICBjYXNlIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlM6CisgICAgICAgICAgICAgICAgbiA9IDE7CisgICAgICAgICAgICAgICAgZ290byBEb25lOwogCi0JCQlkZWZhdWx0OgotCQkJCWFzc2VydCghInVua25vd24gb3BlcmF0aW9uIik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KCEidW5rbm93biBvcGVyYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWlmIChvcGVyYXRpb24gPT0gUFlfSVRFUlNFQVJDSF9JTkRFWCkgewotCQkJaWYgKG4gPT0gUFlfU1NJWkVfVF9NQVgpCi0JCQkJd3JhcHBlZCA9IDE7Ci0JCQkrK247Ci0JCX0KLQl9CisgICAgICAgIGlmIChvcGVyYXRpb24gPT0gUFlfSVRFUlNFQVJDSF9JTkRFWCkgeworICAgICAgICAgICAgaWYgKG4gPT0gUFlfU1NJWkVfVF9NQVgpCisgICAgICAgICAgICAgICAgd3JhcHBlZCA9IDE7CisgICAgICAgICAgICArK247CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAob3BlcmF0aW9uICE9IFBZX0lURVJTRUFSQ0hfSU5ERVgpCi0JCWdvdG8gRG9uZTsKKyAgICBpZiAob3BlcmF0aW9uICE9IFBZX0lURVJTRUFSQ0hfSU5ERVgpCisgICAgICAgIGdvdG8gRG9uZTsKIAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkgICAgICAgICJzZXF1ZW5jZS5pbmRleCh4KTogeCBub3QgaW4gc2VxdWVuY2UiKTsKLQkvKiBmYWxsIGludG8gZmFpbHVyZSBjb2RlICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZS5pbmRleCh4KTogeCBub3QgaW4gc2VxdWVuY2UiKTsKKyAgICAvKiBmYWxsIGludG8gZmFpbHVyZSBjb2RlICovCiBGYWlsOgotCW4gPSAtMTsKLQkvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBuID0gLTE7CisgICAgLyogZmFsbCB0aHJvdWdoICovCiBEb25lOgotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIG47CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gbjsKIAogfQogCkBAIC0yMzc4LDcgKzIzNzgsNyBAQAogUHlfc3NpemVfdAogUHlTZXF1ZW5jZV9Db3VudChQeU9iamVjdCAqcywgUHlPYmplY3QgKm8pCiB7Ci0JcmV0dXJuIF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2gocywgbywgUFlfSVRFUlNFQVJDSF9DT1VOVCk7CisgICAgcmV0dXJuIF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2gocywgbywgUFlfSVRFUlNFQVJDSF9DT1VOVCk7CiB9CiAKIC8qIFJldHVybiAtMSBpZiBlcnJvcjsgMSBpZiBvYiBpbiBzZXE7IDAgaWYgb2Igbm90IGluIHNlcS4KQEAgLTIzODcsMTQgKzIzODcsMTQgQEAKIGludAogUHlTZXF1ZW5jZV9Db250YWlucyhQeU9iamVjdCAqc2VxLCBQeU9iamVjdCAqb2IpCiB7Ci0JUHlfc3NpemVfdCByZXN1bHQ7Ci0JaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHNlcS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOKSkgewotCQlQeVNlcXVlbmNlTWV0aG9kcyAqc3FtID0gc2VxLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkgICAgICAgIGlmIChzcW0gIT0gTlVMTCAmJiBzcW0tPnNxX2NvbnRhaW5zICE9IE5VTEwpCi0JCQlyZXR1cm4gKCpzcW0tPnNxX2NvbnRhaW5zKShzZXEsIG9iKTsKLQl9Ci0JcmVzdWx0ID0gX1B5U2VxdWVuY2VfSXRlclNlYXJjaChzZXEsIG9iLCBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TKTsKLQlyZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChyZXN1bHQsIFB5X3NzaXplX3QsIGludCk7CisgICAgUHlfc3NpemVfdCByZXN1bHQ7CisgICAgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHNlcS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOKSkgeworICAgICAgICBQeVNlcXVlbmNlTWV0aG9kcyAqc3FtID0gc2VxLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICAgICAgaWYgKHNxbSAhPSBOVUxMICYmIHNxbS0+c3FfY29udGFpbnMgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAoKnNxbS0+c3FfY29udGFpbnMpKHNlcSwgb2IpOworICAgIH0KKyAgICByZXN1bHQgPSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKHNlcSwgb2IsIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMpOworICAgIHJldHVybiBQeV9TQUZFX0RPV05DQVNUKHJlc3VsdCwgUHlfc3NpemVfdCwgaW50KTsKIH0KIAogLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KQEAgLTI0MDIsMTMgKzI0MDIsMTMgQEAKIGludAogUHlTZXF1ZW5jZV9JbihQeU9iamVjdCAqdywgUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5U2VxdWVuY2VfQ29udGFpbnModywgdik7CisgICAgcmV0dXJuIFB5U2VxdWVuY2VfQ29udGFpbnModywgdik7CiB9CiAKIFB5X3NzaXplX3QKIFB5U2VxdWVuY2VfSW5kZXgoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICpvKQogewotCXJldHVybiBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKHMsIG8sIFBZX0lURVJTRUFSQ0hfSU5ERVgpOworICAgIHJldHVybiBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKHMsIG8sIFBZX0lURVJTRUFSQ0hfSU5ERVgpOwogfQogCiAvKiBPcGVyYXRpb25zIG9uIG1hcHBpbmdzICovCkBAIC0yNDE2LDEwMiArMjQxNiwxMDIgQEAKIGludAogUHlNYXBwaW5nX0NoZWNrKFB5T2JqZWN0ICpvKQogewotCWlmIChvICYmIFB5SW5zdGFuY2VfQ2hlY2sobykpCi0JCXJldHVybiBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG8sICJfX2dldGl0ZW1fXyIpOworICAgIGlmIChvICYmIFB5SW5zdGFuY2VfQ2hlY2sobykpCisgICAgICAgIHJldHVybiBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG8sICJfX2dldGl0ZW1fXyIpOwogCi0JcmV0dXJuICBvICYmIG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcgJiYKLQkJby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZy0+bXBfc3Vic2NyaXB0ICYmCi0JCSEoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYgCi0JCSAgby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX3NsaWNlKTsKKyAgICByZXR1cm4gIG8gJiYgby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZyAmJgorICAgICAgICBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nLT5tcF9zdWJzY3JpcHQgJiYKKyAgICAgICAgIShvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSAmJgorICAgICAgICAgIG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9zbGljZSk7CiB9CiAKIFB5X3NzaXplX3QKIFB5TWFwcGluZ19TaXplKFB5T2JqZWN0ICpvKQogewotCVB5TWFwcGluZ01ldGhvZHMgKm07CisgICAgUHlNYXBwaW5nTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChvID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmc7Ci0JaWYgKG0gJiYgbS0+bXBfbGVuZ3RoKQotCQlyZXR1cm4gbS0+bXBfbGVuZ3RoKG8pOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOworICAgIGlmIChtICYmIG0tPm1wX2xlbmd0aCkKKyAgICAgICAgcmV0dXJuIG0tPm1wX2xlbmd0aChvKTsKIAotCXR5cGVfZXJyb3IoIm9iamVjdCBvZiB0eXBlICclLjIwMHMnIGhhcyBubyBsZW4oKSIsIG8pOwotCXJldHVybiAtMTsKKyAgICB0eXBlX2Vycm9yKCJvYmplY3Qgb2YgdHlwZSAnJS4yMDBzJyBoYXMgbm8gbGVuKCkiLCBvKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKICN1bmRlZiBQeU1hcHBpbmdfTGVuZ3RoCiBQeV9zc2l6ZV90CiBQeU1hcHBpbmdfTGVuZ3RoKFB5T2JqZWN0ICpvKQogewotCXJldHVybiBQeU1hcHBpbmdfU2l6ZShvKTsKKyAgICByZXR1cm4gUHlNYXBwaW5nX1NpemUobyk7CiB9CiAjZGVmaW5lIFB5TWFwcGluZ19MZW5ndGggUHlNYXBwaW5nX1NpemUKIAogUHlPYmplY3QgKgogUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSkKIHsKLQlQeU9iamVjdCAqb2tleSwgKnI7CisgICAgUHlPYmplY3QgKm9rZXksICpyOwogCi0JaWYgKGtleSA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW9rZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7Ci0JaWYgKG9rZXkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JciA9IFB5T2JqZWN0X0dldEl0ZW0obywgb2tleSk7Ci0JUHlfREVDUkVGKG9rZXkpOwotCXJldHVybiByOworICAgIG9rZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7CisgICAgaWYgKG9rZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgciA9IFB5T2JqZWN0X0dldEl0ZW0obywgb2tleSk7CisgICAgUHlfREVDUkVGKG9rZXkpOworICAgIHJldHVybiByOwogfQogCiBpbnQKIFB5TWFwcGluZ19TZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqb2tleTsKLQlpbnQgcjsKKyAgICBQeU9iamVjdCAqb2tleTsKKyAgICBpbnQgcjsKIAotCWlmIChrZXkgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKGtleSA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW9rZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7Ci0JaWYgKG9rZXkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXIgPSBQeU9iamVjdF9TZXRJdGVtKG8sIG9rZXksIHZhbHVlKTsKLQlQeV9ERUNSRUYob2tleSk7Ci0JcmV0dXJuIHI7CisgICAgb2tleSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoa2V5KTsKKyAgICBpZiAob2tleSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgciA9IFB5T2JqZWN0X1NldEl0ZW0obywgb2tleSwgdmFsdWUpOworICAgIFB5X0RFQ1JFRihva2V5KTsKKyAgICByZXR1cm4gcjsKIH0KIAogaW50CiBQeU1hcHBpbmdfSGFzS2V5U3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpCiB7Ci0JUHlPYmplY3QgKnY7CisgICAgUHlPYmplY3QgKnY7CiAKLQl2ID0gUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcobywga2V5KTsKLQlpZiAodikgewotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiAxOwotCX0KLQlQeUVycl9DbGVhcigpOwotCXJldHVybiAwOworICAgIHYgPSBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZyhvLCBrZXkpOworICAgIGlmICh2KSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlNYXBwaW5nX0hhc0tleShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSkKIHsKLQlQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqdjsKIAotCXYgPSBQeU9iamVjdF9HZXRJdGVtKG8sIGtleSk7Ci0JaWYgKHYpIHsKLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gMDsKKyAgICB2ID0gUHlPYmplY3RfR2V0SXRlbShvLCBrZXkpOworICAgIGlmICh2KSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIE9wZXJhdGlvbnMgb24gY2FsbGFibGUgb2JqZWN0cyAqLwpAQCAtMjUyMSwyNTMgKzI1MjEsMjUzIEBACiBQeU9iamVjdCAqCiBQeU9iamVjdF9DYWxsT2JqZWN0KFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYSkKIHsKLQlyZXR1cm4gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMobywgYSwgTlVMTCk7CisgICAgcmV0dXJuIFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKG8sIGEsIE5VTEwpOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9DYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCiB7Ci0gICAgICAgIHRlcm5hcnlmdW5jIGNhbGw7CisgICAgdGVybmFyeWZ1bmMgY2FsbDsKIAotCWlmICgoY2FsbCA9IGZ1bmMtPm9iX3R5cGUtPnRwX2NhbGwpICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIGNhbGxpbmcgYSBQeXRob24gb2JqZWN0IikpCi0JCSAgICByZXR1cm4gTlVMTDsKLQkJcmVzdWx0ID0gKCpjYWxsKShmdW5jLCBhcmcsIGt3KTsKLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQlQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiTlVMTCByZXN1bHQgd2l0aG91dCBlcnJvciBpbiBQeU9iamVjdF9DYWxsIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICInJS4yMDBzJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlIiwKLQkJICAgICBmdW5jLT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKGNhbGwgPSBmdW5jLT5vYl90eXBlLT50cF9jYWxsKSAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBjYWxsaW5nIGEgUHl0aG9uIG9iamVjdCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlc3VsdCA9ICgqY2FsbCkoZnVuYywgYXJnLCBrdyk7CisgICAgICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwgJiYgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgIk5VTEwgcmVzdWx0IHdpdGhvdXQgZXJyb3IgaW4gUHlPYmplY3RfQ2FsbCIpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZSIsCisgICAgICAgICAgICAgICAgIGZ1bmMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBjYWxsX2Z1bmN0aW9uX3RhaWwoUHlPYmplY3QgKmNhbGxhYmxlLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmV0dmFsOworICAgIFB5T2JqZWN0ICpyZXR2YWw7CiAKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlQeU9iamVjdCAqYTsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgUHlPYmplY3QgKmE7CiAKLQkJYSA9IFB5VHVwbGVfTmV3KDEpOwotCQlpZiAoYSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYXJncyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKGEsIDAsIGFyZ3MpOwotCQlhcmdzID0gYTsKLQl9Ci0JcmV0dmFsID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7CisgICAgICAgIGEgPSBQeVR1cGxlX05ldygxKTsKKyAgICAgICAgaWYgKGEgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhLCAwLCBhcmdzKTsKKyAgICAgICAgYXJncyA9IGE7CisgICAgfQorICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIGFyZ3MsIE5VTEwpOwogCi0JUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKIAotCXJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5T2JqZWN0ICpjYWxsYWJsZSwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YTsKLQlQeU9iamVjdCAqYXJnczsKKyAgICB2YV9saXN0IHZhOworICAgIFB5T2JqZWN0ICphcmdzOwogCi0JaWYgKGNhbGxhYmxlID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQlpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKLQkJdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JCWFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7Ci0JCXZhX2VuZCh2YSk7Ci0JfQotCWVsc2UKLQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkgeworICAgICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICAgICAgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKyAgICAgICAgdmFfZW5kKHZhKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CiAKLQlyZXR1cm4gY2FsbF9mdW5jdGlvbl90YWlsKGNhbGxhYmxlLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mdW5jdGlvbl90YWlsKGNhbGxhYmxlLCBhcmdzKTsKIH0KIAogUHlPYmplY3QgKgogX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVChQeU9iamVjdCAqY2FsbGFibGUsIGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7Ci0JUHlPYmplY3QgKmFyZ3M7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCAqYXJnczsKIAotCWlmIChjYWxsYWJsZSA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7Ci0JCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCQlhcmdzID0gX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVChmb3JtYXQsIHZhKTsKLQkJdmFfZW5kKHZhKTsKLQl9Ci0JZWxzZQotCQlhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7CisgICAgICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgICAgICBhcmdzID0gX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVChmb3JtYXQsIHZhKTsKKyAgICAgICAgdmFfZW5kKHZhKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CiAKLQlyZXR1cm4gY2FsbF9mdW5jdGlvbl90YWlsKGNhbGxhYmxlLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mdW5jdGlvbl90YWlsKGNhbGxhYmxlLCBhcmdzKTsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfQ2FsbE1ldGhvZChQeU9iamVjdCAqbywgY2hhciAqbmFtZSwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YTsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqZnVuYyA9IE5VTEw7Ci0JUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqZnVuYyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CiAKLQlpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sIG5hbWUpOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sIG5hbWUpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7Ci0JCXR5cGVfZXJyb3IoImF0dHJpYnV0ZSBvZiB0eXBlICclLjIwMHMnIGlzIG5vdCBjYWxsYWJsZSIsIGZ1bmMpOyAKLQkJZ290byBleGl0OwotCX0KKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgdHlwZV9lcnJvcigiYXR0cmlidXRlIG9mIHR5cGUgJyUuMjAwcycgaXMgbm90IGNhbGxhYmxlIiwgZnVuYyk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAKLQlpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKLQkJdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JCWFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7Ci0JCXZhX2VuZCh2YSk7Ci0JfQotCWVsc2UKLQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkgeworICAgICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICAgICAgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKyAgICAgICAgdmFfZW5kKHZhKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CiAKLQlyZXR2YWwgPSBjYWxsX2Z1bmN0aW9uX3RhaWwoZnVuYywgYXJncyk7CisgICAgcmV0dmFsID0gY2FsbF9mdW5jdGlvbl90YWlsKGZ1bmMsIGFyZ3MpOwogCiAgIGV4aXQ6Ci0JLyogYXJncyBnZXRzIGNvbnN1bWVkIGluIGNhbGxfZnVuY3Rpb25fdGFpbCAqLwotCVB5X1hERUNSRUYoZnVuYyk7CisgICAgLyogYXJncyBnZXRzIGNvbnN1bWVkIGluIGNhbGxfZnVuY3Rpb25fdGFpbCAqLworICAgIFB5X1hERUNSRUYoZnVuYyk7CiAKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUKFB5T2JqZWN0ICpvLCBjaGFyICpuYW1lLCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpmdW5jID0gTlVMTDsKLQlQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKKyAgICB2YV9saXN0IHZhOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpmdW5jID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKIAotCWlmIChvID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChvID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgbmFtZSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgbmFtZSk7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKLQkJdHlwZV9lcnJvcigiYXR0cmlidXRlIG9mIHR5cGUgJyUuMjAwcycgaXMgbm90IGNhbGxhYmxlIiwgZnVuYyk7IAotCQlnb3RvIGV4aXQ7Ci0JfQorICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgeworICAgICAgICB0eXBlX2Vycm9yKCJhdHRyaWJ1dGUgb2YgdHlwZSAnJS4yMDBzJyBpcyBub3QgY2FsbGFibGUiLCBmdW5jKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KIAotCWlmIChmb3JtYXQgJiYgKmZvcm1hdCkgewotCQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQkJYXJncyA9IF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoZm9ybWF0LCB2YSk7Ci0JCXZhX2VuZCh2YSk7Ci0JfQotCWVsc2UKLQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkgeworICAgICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICAgICAgYXJncyA9IF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoZm9ybWF0LCB2YSk7CisgICAgICAgIHZhX2VuZCh2YSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwogCi0JcmV0dmFsID0gY2FsbF9mdW5jdGlvbl90YWlsKGZ1bmMsIGFyZ3MpOworICAgIHJldHZhbCA9IGNhbGxfZnVuY3Rpb25fdGFpbChmdW5jLCBhcmdzKTsKIAogICBleGl0OgotCS8qIGFyZ3MgZ2V0cyBjb25zdW1lZCBpbiBjYWxsX2Z1bmN0aW9uX3RhaWwgKi8KLQlQeV9YREVDUkVGKGZ1bmMpOworICAgIC8qIGFyZ3MgZ2V0cyBjb25zdW1lZCBpbiBjYWxsX2Z1bmN0aW9uX3RhaWwgKi8KKyAgICBQeV9YREVDUkVGKGZ1bmMpOwogCi0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvYmphcmdzX21rdHVwbGUodmFfbGlzdCB2YSkKIHsKLQlpbnQgaSwgbiA9IDA7Ci0JdmFfbGlzdCBjb3VudHZhOwotCVB5T2JqZWN0ICpyZXN1bHQsICp0bXA7CisgICAgaW50IGksIG4gPSAwOworICAgIHZhX2xpc3QgY291bnR2YTsKKyAgICBQeU9iamVjdCAqcmVzdWx0LCAqdG1wOwogCiAjaWZkZWYgVkFfTElTVF9JU19BUlJBWQotCW1lbWNweShjb3VudHZhLCB2YSwgc2l6ZW9mKHZhX2xpc3QpKTsKKyAgICBtZW1jcHkoY291bnR2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CiAjZWxzZQogI2lmZGVmIF9fdmFfY29weQotCV9fdmFfY29weShjb3VudHZhLCB2YSk7CisgICAgX192YV9jb3B5KGNvdW50dmEsIHZhKTsKICNlbHNlCi0JY291bnR2YSA9IHZhOworICAgIGNvdW50dmEgPSB2YTsKICNlbmRpZgogI2VuZGlmCiAKLQl3aGlsZSAoKChQeU9iamVjdCAqKXZhX2FyZyhjb3VudHZhLCBQeU9iamVjdCAqKSkgIT0gTlVMTCkKLQkJKytuOwotCXJlc3VsdCA9IFB5VHVwbGVfTmV3KG4pOwotCWlmIChyZXN1bHQgIT0gTlVMTCAmJiBuID4gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCQl0bXAgPSAoUHlPYmplY3QgKil2YV9hcmcodmEsIFB5T2JqZWN0ICopOwotCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIHRtcCk7Ci0JCQlQeV9JTkNSRUYodG1wKTsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIHdoaWxlICgoKFB5T2JqZWN0ICopdmFfYXJnKGNvdW50dmEsIFB5T2JqZWN0ICopKSAhPSBOVUxMKQorICAgICAgICArK247CisgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobik7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIG4gPiAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIHRtcCA9IChQeU9iamVjdCAqKXZhX2FyZyh2YSwgUHlPYmplY3QgKik7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgdG1wKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0bXApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKFB5T2JqZWN0ICpjYWxsYWJsZSwgUHlPYmplY3QgKm5hbWUsIC4uLikKIHsKLQlQeU9iamVjdCAqYXJncywgKnRtcDsKLQl2YV9saXN0IHZhcmdzOworICAgIFB5T2JqZWN0ICphcmdzLCAqdG1wOworICAgIHZhX2xpc3QgdmFyZ3M7CiAKLQlpZiAoY2FsbGFibGUgPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKGNhbGxhYmxlLCBuYW1lKTsKLQlpZiAoY2FsbGFibGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKGNhbGxhYmxlLCBuYW1lKTsKKyAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBjb3VudCB0aGUgYXJncyAqLwotCXZhX3N0YXJ0KHZhcmdzLCBuYW1lKTsKLQlhcmdzID0gb2JqYXJnc19ta3R1cGxlKHZhcmdzKTsKLQl2YV9lbmQodmFyZ3MpOwotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGNhbGxhYmxlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXRtcCA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIGFyZ3MsIE5VTEwpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoY2FsbGFibGUpOworICAgIC8qIGNvdW50IHRoZSBhcmdzICovCisgICAgdmFfc3RhcnQodmFyZ3MsIG5hbWUpOworICAgIGFyZ3MgPSBvYmphcmdzX21rdHVwbGUodmFyZ3MpOworICAgIHZhX2VuZCh2YXJncyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdG1wID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CiAKLQlyZXR1cm4gdG1wOworICAgIHJldHVybiB0bXA7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoUHlPYmplY3QgKmNhbGxhYmxlLCAuLi4pCiB7Ci0JUHlPYmplY3QgKmFyZ3MsICp0bXA7Ci0JdmFfbGlzdCB2YXJnczsKKyAgICBQeU9iamVjdCAqYXJncywgKnRtcDsKKyAgICB2YV9saXN0IHZhcmdzOwogCi0JaWYgKGNhbGxhYmxlID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQkvKiBjb3VudCB0aGUgYXJncyAqLwotCXZhX3N0YXJ0KHZhcmdzLCBjYWxsYWJsZSk7Ci0JYXJncyA9IG9iamFyZ3NfbWt0dXBsZSh2YXJncyk7Ci0JdmFfZW5kKHZhcmdzKTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl0bXAgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBhcmdzLCBOVUxMKTsKLQlQeV9ERUNSRUYoYXJncyk7CisgICAgLyogY291bnQgdGhlIGFyZ3MgKi8KKyAgICB2YV9zdGFydCh2YXJncywgY2FsbGFibGUpOworICAgIGFyZ3MgPSBvYmphcmdzX21rdHVwbGUodmFyZ3MpOworICAgIHZhX2VuZCh2YXJncyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdG1wID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7CisgICAgUHlfREVDUkVGKGFyZ3MpOwogCi0JcmV0dXJuIHRtcDsKKyAgICByZXR1cm4gdG1wOwogfQogCiAKQEAgLTI4MDIsMzAyICsyODAyLDMwMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFic3RyYWN0X2dldF9iYXNlcyhQeU9iamVjdCAqY2xzKQogewotCXN0YXRpYyBQeU9iamVjdCAqX19iYXNlc19fID0gTlVMTDsKLQlQeU9iamVjdCAqYmFzZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpfX2Jhc2VzX18gPSBOVUxMOworICAgIFB5T2JqZWN0ICpiYXNlczsKIAotCWlmIChfX2Jhc2VzX18gPT0gTlVMTCkgewotCQlfX2Jhc2VzX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2Jhc2VzX18iKTsKLQkJaWYgKF9fYmFzZXNfXyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJhc2VzID0gUHlPYmplY3RfR2V0QXR0cihjbHMsIF9fYmFzZXNfXyk7Ci0JaWYgKGJhc2VzID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlUdXBsZV9DaGVjayhiYXNlcykpIHsKLQkgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gYmFzZXM7CisgICAgaWYgKF9fYmFzZXNfXyA9PSBOVUxMKSB7CisgICAgICAgIF9fYmFzZXNfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fYmFzZXNfXyIpOworICAgICAgICBpZiAoX19iYXNlc19fID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYmFzZXMgPSBQeU9iamVjdF9HZXRBdHRyKGNscywgX19iYXNlc19fKTsKKyAgICBpZiAoYmFzZXMgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGJhc2VzKSkgeworICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGJhc2VzOwogfQogCiAKIHN0YXRpYyBpbnQKIGFic3RyYWN0X2lzc3ViY2xhc3MoUHlPYmplY3QgKmRlcml2ZWQsIFB5T2JqZWN0ICpjbHMpCiB7Ci0JUHlPYmplY3QgKmJhc2VzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGksIG47Ci0JaW50IHIgPSAwOworICAgIFB5T2JqZWN0ICpiYXNlcyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIGludCByID0gMDsKIAotCXdoaWxlICgxKSB7Ci0JCWlmIChkZXJpdmVkID09IGNscykKLQkJCXJldHVybiAxOwotCQliYXNlcyA9IGFic3RyYWN0X2dldF9iYXNlcyhkZXJpdmVkKTsKLQkJaWYgKGJhc2VzID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKLQkJaWYgKG4gPT0gMCkgewotCQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCS8qIEF2b2lkIHJlY3Vyc2l2aXR5IGluIHRoZSBzaW5nbGUgaW5oZXJpdGFuY2UgY2FzZSAqLwotCQlpZiAobiA9PSAxKSB7Ci0JCQlkZXJpdmVkID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgMCk7Ci0JCQlQeV9ERUNSRUYoYmFzZXMpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJciA9IGFic3RyYWN0X2lzc3ViY2xhc3MoUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSksIGNscyk7Ci0JCQlpZiAociAhPSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCXJldHVybiByOwotCX0KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZGVyaXZlZCA9PSBjbHMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgYmFzZXMgPSBhYnN0cmFjdF9nZXRfYmFzZXMoZGVyaXZlZCk7CisgICAgICAgIGlmIChiYXNlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBuID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7CisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBBdm9pZCByZWN1cnNpdml0eSBpbiB0aGUgc2luZ2xlIGluaGVyaXRhbmNlIGNhc2UgKi8KKyAgICAgICAgaWYgKG4gPT0gMSkgeworICAgICAgICAgICAgZGVyaXZlZCA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIDApOworICAgICAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHIgPSBhYnN0cmFjdF9pc3N1YmNsYXNzKFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpLCBjbHMpOworICAgICAgICAgICAgaWYgKHIgIT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGNoZWNrX2NsYXNzKFB5T2JqZWN0ICpjbHMsIGNvbnN0IGNoYXIgKmVycm9yKQogewotCVB5T2JqZWN0ICpiYXNlcyA9IGFic3RyYWN0X2dldF9iYXNlcyhjbHMpOwotCWlmIChiYXNlcyA9PSBOVUxMKSB7Ci0JCS8qIERvIG5vdCBtYXNrIGVycm9ycy4gKi8KLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZXJyb3IpOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlfREVDUkVGKGJhc2VzKTsKLQlyZXR1cm4gLTE7CisgICAgUHlPYmplY3QgKmJhc2VzID0gYWJzdHJhY3RfZ2V0X2Jhc2VzKGNscyk7CisgICAgaWYgKGJhc2VzID09IE5VTEwpIHsKKyAgICAgICAgLyogRG8gbm90IG1hc2sgZXJyb3JzLiAqLworICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBlcnJvcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIGludAogcmVjdXJzaXZlX2lzaW5zdGFuY2UoUHlPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpjbHMpCiB7Ci0JUHlPYmplY3QgKmljbHM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpfX2NsYXNzX18gPSBOVUxMOwotCWludCByZXR2YWwgPSAwOworICAgIFB5T2JqZWN0ICppY2xzOworICAgIHN0YXRpYyBQeU9iamVjdCAqX19jbGFzc19fID0gTlVMTDsKKyAgICBpbnQgcmV0dmFsID0gMDsKIAotCWlmIChfX2NsYXNzX18gPT0gTlVMTCkgewotCQlfX2NsYXNzX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NsYXNzX18iKTsKLQkJaWYgKF9fY2xhc3NfXyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoX19jbGFzc19fID09IE5VTEwpIHsKKyAgICAgICAgX19jbGFzc19fID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jbGFzc19fIik7CisgICAgICAgIGlmIChfX2NsYXNzX18gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoUHlDbGFzc19DaGVjayhjbHMpICYmIFB5SW5zdGFuY2VfQ2hlY2soaW5zdCkpIHsKLQkJUHlPYmplY3QgKmluY2xhc3MgPQotCQkJKFB5T2JqZWN0KikoKFB5SW5zdGFuY2VPYmplY3QqKWluc3QpLT5pbl9jbGFzczsKLQkJcmV0dmFsID0gUHlDbGFzc19Jc1N1YmNsYXNzKGluY2xhc3MsIGNscyk7Ci0JfQotCWVsc2UgaWYgKFB5VHlwZV9DaGVjayhjbHMpKSB7Ci0JCXJldHZhbCA9IFB5T2JqZWN0X1R5cGVDaGVjayhpbnN0LCAoUHlUeXBlT2JqZWN0ICopY2xzKTsKLQkJaWYgKHJldHZhbCA9PSAwKSB7Ci0JCQlQeU9iamVjdCAqYyA9IFB5T2JqZWN0X0dldEF0dHIoaW5zdCwgX19jbGFzc19fKTsKLQkJCWlmIChjID09IE5VTEwpIHsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGMgIT0gKFB5T2JqZWN0ICopKGluc3QtPm9iX3R5cGUpICYmCi0JCQkJICAgIFB5VHlwZV9DaGVjayhjKSkKLQkJCQkJcmV0dmFsID0gUHlUeXBlX0lzU3VidHlwZSgKLQkJCQkJCShQeVR5cGVPYmplY3QgKiljLAotCQkJCQkJKFB5VHlwZU9iamVjdCAqKWNscyk7Ci0JCQkJUHlfREVDUkVGKGMpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQlpZiAoIWNoZWNrX2NsYXNzKGNscywKLQkJCSJpc2luc3RhbmNlKCkgYXJnIDIgbXVzdCBiZSBhIGNsYXNzLCB0eXBlLCIKLQkJCSIgb3IgdHVwbGUgb2YgY2xhc3NlcyBhbmQgdHlwZXMiKSkKLQkJCXJldHVybiAtMTsKLQkJaWNscyA9IFB5T2JqZWN0X0dldEF0dHIoaW5zdCwgX19jbGFzc19fKTsKLQkJaWYgKGljbHMgPT0gTlVMTCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHZhbCA9IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR2YWwgPSBhYnN0cmFjdF9pc3N1YmNsYXNzKGljbHMsIGNscyk7Ci0JCQlQeV9ERUNSRUYoaWNscyk7Ci0JCX0KLQl9CisgICAgaWYgKFB5Q2xhc3NfQ2hlY2soY2xzKSAmJiBQeUluc3RhbmNlX0NoZWNrKGluc3QpKSB7CisgICAgICAgIFB5T2JqZWN0ICppbmNsYXNzID0KKyAgICAgICAgICAgIChQeU9iamVjdCopKChQeUluc3RhbmNlT2JqZWN0KilpbnN0KS0+aW5fY2xhc3M7CisgICAgICAgIHJldHZhbCA9IFB5Q2xhc3NfSXNTdWJjbGFzcyhpbmNsYXNzLCBjbHMpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVR5cGVfQ2hlY2soY2xzKSkgeworICAgICAgICByZXR2YWwgPSBQeU9iamVjdF9UeXBlQ2hlY2soaW5zdCwgKFB5VHlwZU9iamVjdCAqKWNscyk7CisgICAgICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICAgICAgUHlPYmplY3QgKmMgPSBQeU9iamVjdF9HZXRBdHRyKGluc3QsIF9fY2xhc3NfXyk7CisgICAgICAgICAgICBpZiAoYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjICE9IChQeU9iamVjdCAqKShpbnN0LT5vYl90eXBlKSAmJgorICAgICAgICAgICAgICAgICAgICBQeVR5cGVfQ2hlY2soYykpCisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFB5VHlwZV9Jc1N1YnR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAoUHlUeXBlT2JqZWN0ICopYywKKyAgICAgICAgICAgICAgICAgICAgICAgIChQeVR5cGVPYmplY3QgKiljbHMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFjaGVja19jbGFzcyhjbHMsCisgICAgICAgICAgICAiaXNpbnN0YW5jZSgpIGFyZyAyIG11c3QgYmUgYSBjbGFzcywgdHlwZSwiCisgICAgICAgICAgICAiIG9yIHR1cGxlIG9mIGNsYXNzZXMgYW5kIHR5cGVzIikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGljbHMgPSBQeU9iamVjdF9HZXRBdHRyKGluc3QsIF9fY2xhc3NfXyk7CisgICAgICAgIGlmIChpY2xzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR2YWwgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dmFsID0gYWJzdHJhY3RfaXNzdWJjbGFzcyhpY2xzLCBjbHMpOworICAgICAgICAgICAgUHlfREVDUkVGKGljbHMpOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBpbnQKIFB5T2JqZWN0X0lzSW5zdGFuY2UoUHlPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpjbHMpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpuYW1lID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm5hbWUgPSBOVUxMOwogCi0JLyogUXVpY2sgdGVzdCBmb3IgYW4gZXhhY3QgbWF0Y2ggKi8KLQlpZiAoUHlfVFlQRShpbnN0KSA9PSAoUHlUeXBlT2JqZWN0ICopY2xzKQotCQlyZXR1cm4gMTsKKyAgICAvKiBRdWljayB0ZXN0IGZvciBhbiBleGFjdCBtYXRjaCAqLworICAgIGlmIChQeV9UWVBFKGluc3QpID09IChQeVR5cGVPYmplY3QgKiljbHMpCisgICAgICAgIHJldHVybiAxOwogCi0JaWYgKFB5VHVwbGVfQ2hlY2soY2xzKSkgewotCQlQeV9zc2l6ZV90IGk7Ci0JCVB5X3NzaXplX3QgbjsKLQkJaW50IHIgPSAwOworICAgIGlmIChQeVR1cGxlX0NoZWNrKGNscykpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBQeV9zc2l6ZV90IG47CisgICAgICAgIGludCByID0gMDsKIAotCQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19pbnN0YW5jZWNoZWNrX18iKSkKLQkJCXJldHVybiAtMTsKLQkJbiA9IFB5VHVwbGVfR0VUX1NJWkUoY2xzKTsKLQkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQkJUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGNscywgaSk7Ci0JCQlyID0gUHlPYmplY3RfSXNJbnN0YW5jZShpbnN0LCBpdGVtKTsKLQkJCWlmIChyICE9IDApCi0JCQkJLyogZWl0aGVyIGZvdW5kIGl0LCBvciBnb3QgYW4gZXJyb3IgKi8KLQkJCQlicmVhazsKLQkJfQotCQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQkJcmV0dXJuIHI7Ci0JfQorICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19pbnN0YW5jZWNoZWNrX18iKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoY2xzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGNscywgaSk7CisgICAgICAgICAgICByID0gUHlPYmplY3RfSXNJbnN0YW5jZShpbnN0LCBpdGVtKTsKKyAgICAgICAgICAgIGlmIChyICE9IDApCisgICAgICAgICAgICAgICAgLyogZWl0aGVyIGZvdW5kIGl0LCBvciBnb3QgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQogCi0JaWYgKCEoUHlDbGFzc19DaGVjayhjbHMpIHx8IFB5SW5zdGFuY2VfQ2hlY2soY2xzKSkpIHsKLQkJUHlPYmplY3QgKmNoZWNrZXI7Ci0JCWNoZWNrZXIgPSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbChjbHMsICJfX2luc3RhbmNlY2hlY2tfXyIsICZuYW1lKTsKLQkJaWYgKGNoZWNrZXIgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKnJlczsKLQkJCWludCBvayA9IC0xOwotCQkJaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIF9faW5zdGFuY2VjaGVja19fIikpIHsKLQkJCQlQeV9ERUNSRUYoY2hlY2tlcik7Ci0JCQkJcmV0dXJuIG9rOwotCQkJfQotCQkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjaGVja2VyLCBpbnN0LCBOVUxMKTsKLQkJCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCQkJUHlfREVDUkVGKGNoZWNrZXIpOwotCQkJaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCQkJb2sgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKLQkJCQlQeV9ERUNSRUYocmVzKTsKLQkJCX0KLQkJCXJldHVybiBvazsKLQkJfQotCQllbHNlIGlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gcmVjdXJzaXZlX2lzaW5zdGFuY2UoaW5zdCwgY2xzKTsKKyAgICBpZiAoIShQeUNsYXNzX0NoZWNrKGNscykgfHwgUHlJbnN0YW5jZV9DaGVjayhjbHMpKSkgeworICAgICAgICBQeU9iamVjdCAqY2hlY2tlcjsKKyAgICAgICAgY2hlY2tlciA9IF9QeU9iamVjdF9Mb29rdXBTcGVjaWFsKGNscywgIl9faW5zdGFuY2VjaGVja19fIiwgJm5hbWUpOworICAgICAgICBpZiAoY2hlY2tlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICAgICAgaW50IG9rID0gLTE7CisgICAgICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19pbnN0YW5jZWNoZWNrX18iKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjaGVja2VyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNoZWNrZXIsIGluc3QsIE5VTEwpOworICAgICAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2hlY2tlcik7CisgICAgICAgICAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG9rOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiByZWN1cnNpdmVfaXNpbnN0YW5jZShpbnN0LCBjbHMpOwogfQogCiBzdGF0aWMgIGludAogcmVjdXJzaXZlX2lzc3ViY2xhc3MoUHlPYmplY3QgKmRlcml2ZWQsIFB5T2JqZWN0ICpjbHMpCiB7Ci0JaW50IHJldHZhbDsKKyAgICBpbnQgcmV0dmFsOwogCi0gCWlmIChQeVR5cGVfQ2hlY2soY2xzKSAmJiBQeVR5cGVfQ2hlY2soZGVyaXZlZCkpIHsKLSAJCS8qIEZhc3QgcGF0aCAobm9uLXJlY3Vyc2l2ZSkgKi8KLSAJCXJldHVybiBQeVR5cGVfSXNTdWJ0eXBlKAotCQkJKFB5VHlwZU9iamVjdCAqKWRlcml2ZWQsIChQeVR5cGVPYmplY3QgKiljbHMpOwotIAl9Ci0JaWYgKCFQeUNsYXNzX0NoZWNrKGRlcml2ZWQpIHx8ICFQeUNsYXNzX0NoZWNrKGNscykpIHsKLQkJaWYgKCFjaGVja19jbGFzcyhkZXJpdmVkLAotCQkJCSAiaXNzdWJjbGFzcygpIGFyZyAxIG11c3QgYmUgYSBjbGFzcyIpKQotCQkJcmV0dXJuIC0xOworICAgIGlmIChQeVR5cGVfQ2hlY2soY2xzKSAmJiBQeVR5cGVfQ2hlY2soZGVyaXZlZCkpIHsKKyAgICAgICAgLyogRmFzdCBwYXRoIChub24tcmVjdXJzaXZlKSAqLworICAgICAgICByZXR1cm4gUHlUeXBlX0lzU3VidHlwZSgKKyAgICAgICAgICAgIChQeVR5cGVPYmplY3QgKilkZXJpdmVkLCAoUHlUeXBlT2JqZWN0ICopY2xzKTsKKyAgICB9CisgICAgaWYgKCFQeUNsYXNzX0NoZWNrKGRlcml2ZWQpIHx8ICFQeUNsYXNzX0NoZWNrKGNscykpIHsKKyAgICAgICAgaWYgKCFjaGVja19jbGFzcyhkZXJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpc3N1YmNsYXNzKCkgYXJnIDEgbXVzdCBiZSBhIGNsYXNzIikpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJaWYgKCFjaGVja19jbGFzcyhjbHMsCi0JCQkJImlzc3ViY2xhc3MoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3MiCi0JCQkJIiBvciB0dXBsZSBvZiBjbGFzc2VzIikpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHZhbCA9IGFic3RyYWN0X2lzc3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIHNob3J0Y3V0ICovCi0JICAJaWYgKCEocmV0dmFsID0gKGRlcml2ZWQgPT0gY2xzKSkpCi0JCQlyZXR2YWwgPSBQeUNsYXNzX0lzU3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKLQl9CisgICAgICAgIGlmICghY2hlY2tfY2xhc3MoY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgImlzc3ViY2xhc3MoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3MiCisgICAgICAgICAgICAgICAgICAgICAgICAiIG9yIHR1cGxlIG9mIGNsYXNzZXMiKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dmFsID0gYWJzdHJhY3RfaXNzdWJjbGFzcyhkZXJpdmVkLCBjbHMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogc2hvcnRjdXQgKi8KKyAgICAgICAgaWYgKCEocmV0dmFsID0gKGRlcml2ZWQgPT0gY2xzKSkpCisgICAgICAgICAgICByZXR2YWwgPSBQeUNsYXNzX0lzU3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKKyAgICB9CiAKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIGludAogUHlPYmplY3RfSXNTdWJjbGFzcyhQeU9iamVjdCAqZGVyaXZlZCwgUHlPYmplY3QgKmNscykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKm5hbWUgPSBOVUxMOwotCQotIAlpZiAoUHlUdXBsZV9DaGVjayhjbHMpKSB7Ci0gCQlQeV9zc2l6ZV90IGk7Ci0gCQlQeV9zc2l6ZV90IG47Ci0gCQlpbnQgciA9IDA7Ci0gCi0gCQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19zdWJjbGFzc2NoZWNrX18iKSkKLSAJCQlyZXR1cm4gLTE7Ci0gCQluID0gUHlUdXBsZV9HRVRfU0laRShjbHMpOwotIAkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotIAkJCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShjbHMsIGkpOwotIAkJCXIgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGRlcml2ZWQsIGl0ZW0pOwotIAkJCWlmIChyICE9IDApCi0gCQkJCS8qIGVpdGhlciBmb3VuZCBpdCwgb3IgZ290IGFuIGVycm9yICovCi0gCQkJCWJyZWFrOwotIAkJfQotIAkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0gCQlyZXR1cm4gcjsKLSAJfQotCWlmICghKFB5Q2xhc3NfQ2hlY2soY2xzKSB8fCBQeUluc3RhbmNlX0NoZWNrKGNscykpKSB7Ci0JCVB5T2JqZWN0ICpjaGVja2VyOwotCQljaGVja2VyID0gX1B5T2JqZWN0X0xvb2t1cFNwZWNpYWwoY2xzLCAiX19zdWJjbGFzc2NoZWNrX18iLCAmbmFtZSk7Ci0JCWlmIChjaGVja2VyICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICpyZXM7Ci0JCQlpbnQgb2sgPSAtMTsKLQkJCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBpbiBfX3N1YmNsYXNzY2hlY2tfXyIpKSB7Ci0JCQkJUHlfREVDUkVGKGNoZWNrZXIpOwotCQkJCXJldHVybiBvazsKLQkJCX0KLQkJCXJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2hlY2tlciwgZGVyaXZlZCwgTlVMTCk7Ci0JCQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQkJCVB5X0RFQ1JFRihjaGVja2VyKTsKLQkJCWlmIChyZXMgIT0gTlVMTCkgewotCQkJCW9rID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7Ci0JCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gb2s7Ci0JCX0KLQkJZWxzZSBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCXJldHVybiByZWN1cnNpdmVfaXNzdWJjbGFzcyhkZXJpdmVkLCBjbHMpOworICAgIHN0YXRpYyBQeU9iamVjdCAqbmFtZSA9IE5VTEw7CisKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhjbHMpKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgUHlfc3NpemVfdCBuOworICAgICAgICBpbnQgciA9IDA7CisKKyAgICAgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIF9fc3ViY2xhc3NjaGVja19fIikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGNscyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShjbHMsIGkpOworICAgICAgICAgICAgciA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoZGVyaXZlZCwgaXRlbSk7CisgICAgICAgICAgICBpZiAociAhPSAwKQorICAgICAgICAgICAgICAgIC8qIGVpdGhlciBmb3VuZCBpdCwgb3IgZ290IGFuIGVycm9yICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBpZiAoIShQeUNsYXNzX0NoZWNrKGNscykgfHwgUHlJbnN0YW5jZV9DaGVjayhjbHMpKSkgeworICAgICAgICBQeU9iamVjdCAqY2hlY2tlcjsKKyAgICAgICAgY2hlY2tlciA9IF9QeU9iamVjdF9Mb29rdXBTcGVjaWFsKGNscywgIl9fc3ViY2xhc3NjaGVja19fIiwgJm5hbWUpOworICAgICAgICBpZiAoY2hlY2tlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICAgICAgaW50IG9rID0gLTE7CisgICAgICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19zdWJjbGFzc2NoZWNrX18iKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjaGVja2VyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNoZWNrZXIsIGRlcml2ZWQsIE5VTEwpOworICAgICAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2hlY2tlcik7CisgICAgICAgICAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG9rOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVjdXJzaXZlX2lzc3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKIH0KIAogaW50CiBfUHlPYmplY3RfUmVhbElzSW5zdGFuY2UoUHlPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpjbHMpCiB7Ci0JcmV0dXJuIHJlY3Vyc2l2ZV9pc2luc3RhbmNlKGluc3QsIGNscyk7CisgICAgcmV0dXJuIHJlY3Vyc2l2ZV9pc2luc3RhbmNlKGluc3QsIGNscyk7CiB9CiAKIGludAogX1B5T2JqZWN0X1JlYWxJc1N1YmNsYXNzKFB5T2JqZWN0ICpkZXJpdmVkLCBQeU9iamVjdCAqY2xzKQogewotCXJldHVybiByZWN1cnNpdmVfaXNzdWJjbGFzcyhkZXJpdmVkLCBjbHMpOworICAgIHJldHVybiByZWN1cnNpdmVfaXNzdWJjbGFzcyhkZXJpdmVkLCBjbHMpOwogfQogCiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0dldEl0ZXIoUHlPYmplY3QgKm8pCiB7Ci0JUHlUeXBlT2JqZWN0ICp0ID0gby0+b2JfdHlwZTsKLQlnZXRpdGVyZnVuYyBmID0gTlVMTDsKLQlpZiAoUHlUeXBlX0hhc0ZlYXR1cmUodCwgUHlfVFBGTEFHU19IQVZFX0lURVIpKQotCQlmID0gdC0+dHBfaXRlcjsKLQlpZiAoZiA9PSBOVUxMKSB7Ci0JCWlmIChQeVNlcXVlbmNlX0NoZWNrKG8pKQotCQkJcmV0dXJuIFB5U2VxSXRlcl9OZXcobyk7Ci0JCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlIiwgbyk7Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqcmVzID0gKCpmKShvKTsKLQkJaWYgKHJlcyAhPSBOVUxMICYmICFQeUl0ZXJfQ2hlY2socmVzKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJpdGVyKCkgcmV0dXJuZWQgbm9uLWl0ZXJhdG9yICIKLQkJCQkgICAgICJvZiB0eXBlICclLjEwMHMnIiwKLQkJCQkgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCXJlcyA9IE5VTEw7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9CisgICAgUHlUeXBlT2JqZWN0ICp0ID0gby0+b2JfdHlwZTsKKyAgICBnZXRpdGVyZnVuYyBmID0gTlVMTDsKKyAgICBpZiAoUHlUeXBlX0hhc0ZlYXR1cmUodCwgUHlfVFBGTEFHU19IQVZFX0lURVIpKQorICAgICAgICBmID0gdC0+dHBfaXRlcjsKKyAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeVNlcXVlbmNlX0NoZWNrKG8pKQorICAgICAgICAgICAgcmV0dXJuIFB5U2VxSXRlcl9OZXcobyk7CisgICAgICAgIHJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlIiwgbyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqcmVzID0gKCpmKShvKTsKKyAgICAgICAgaWYgKHJlcyAhPSBOVUxMICYmICFQeUl0ZXJfQ2hlY2socmVzKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcigpIHJldHVybmVkIG5vbi1pdGVyYXRvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIHR5cGUgJyUuMTAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiB9CiAKIC8qIFJldHVybiBuZXh0IGl0ZW0uCkBAIC0zMTEwLDExICszMTEwLDExIEBACiBQeU9iamVjdCAqCiBQeUl0ZXJfTmV4dChQeU9iamVjdCAqaXRlcikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCXJlc3VsdCA9ICgqaXRlci0+b2JfdHlwZS0+dHBfaXRlcm5leHQpKGl0ZXIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCAmJgotCSAgICBQeUVycl9PY2N1cnJlZCgpICYmCi0JICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIHJlc3VsdCA9ICgqaXRlci0+b2JfdHlwZS0+dHBfaXRlcm5leHQpKGl0ZXIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCAmJgorICAgICAgICBQeUVycl9PY2N1cnJlZCgpICYmCisgICAgICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvYm9vbG9iamVjdC5jIGIvT2JqZWN0cy9ib29sb2JqZWN0LmMKaW5kZXggZmQ3M2QyOC4uNTk1ODMyYSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9ib29sb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9ib29sb2JqZWN0LmMKQEAgLTcsMTAgKzcsMTAgQEAKIHN0YXRpYyBpbnQKIGJvb2xfcHJpbnQoUHlCb29sT2JqZWN0ICpzZWxmLCBGSUxFICpmcCwgaW50IGZsYWdzKQogewotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHV0cyhzZWxmLT5vYl9pdmFsID09IDAgPyAiRmFsc2UiIDogIlRydWUiLCBmcCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXR1cm4gMDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnB1dHMoc2VsZi0+b2JfaXZhbCA9PSAwID8gIkZhbHNlIiA6ICJUcnVlIiwgZnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFdlIGRlZmluZSBib29sX3JlcHIgdG8gcmV0dXJuICJGYWxzZSIgb3IgIlRydWUiICovCkBAIC0yMSwzMCArMjEsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBib29sX3JlcHIoUHlCb29sT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpzOworICAgIFB5T2JqZWN0ICpzOwogCi0JaWYgKHNlbGYtPm9iX2l2YWwpCi0JCXMgPSB0cnVlX3N0ciA/IHRydWVfc3RyIDoKLQkJCSh0cnVlX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIlRydWUiKSk7Ci0JZWxzZQotCQlzID0gZmFsc2Vfc3RyID8gZmFsc2Vfc3RyIDoKLQkJCShmYWxzZV9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJGYWxzZSIpKTsKLQlQeV9YSU5DUkVGKHMpOwotCXJldHVybiBzOworICAgIGlmIChzZWxmLT5vYl9pdmFsKQorICAgICAgICBzID0gdHJ1ZV9zdHIgPyB0cnVlX3N0ciA6CisgICAgICAgICAgICAodHJ1ZV9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJUcnVlIikpOworICAgIGVsc2UKKyAgICAgICAgcyA9IGZhbHNlX3N0ciA/IGZhbHNlX3N0ciA6CisgICAgICAgICAgICAoZmFsc2Vfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiRmFsc2UiKSk7CisgICAgUHlfWElOQ1JFRihzKTsKKyAgICByZXR1cm4gczsKIH0KIAogLyogRnVuY3Rpb24gdG8gcmV0dXJuIGEgYm9vbCBmcm9tIGEgQyBsb25nICovCiAKIFB5T2JqZWN0ICpQeUJvb2xfRnJvbUxvbmcobG9uZyBvaykKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAob2spCi0JCXJlc3VsdCA9IFB5X1RydWU7Ci0JZWxzZQotCQlyZXN1bHQgPSBQeV9GYWxzZTsKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChvaykKKyAgICAgICAgcmVzdWx0ID0gUHlfVHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFB5X0ZhbHNlOworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFdlIGRlZmluZSBib29sX25ldyB0byBhbHdheXMgcmV0dXJuIGVpdGhlciBQeV9UcnVlIG9yIFB5X0ZhbHNlICovCkBAIC01MiwxNiArNTIsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBib29sX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7IngiLCAwfTsKLQlQeU9iamVjdCAqeCA9IFB5X0ZhbHNlOwotCWxvbmcgb2s7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJ4IiwgMH07CisgICAgUHlPYmplY3QgKnggPSBQeV9GYWxzZTsKKyAgICBsb25nIG9rOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPOmJvb2wiLCBrd2xpc3QsICZ4KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb2sgPSBQeU9iamVjdF9Jc1RydWUoeCk7Ci0JaWYgKG9rIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhvayk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPOmJvb2wiLCBrd2xpc3QsICZ4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoeCk7CisgICAgaWYgKG9rIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhvayk7CiB9CiAKIC8qIEFyaXRobWV0aWMgb3BlcmF0aW9ucyByZWRlZmluZWQgdG8gcmV0dXJuIGJvb2wgaWYgYm90aCBhcmdzIGFyZSBib29sLiAqLwpAQCAtNjksMjggKzY5LDI4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYm9vbF9hbmQoUHlPYmplY3QgKmEsIFB5T2JqZWN0ICpiKQogewotCWlmICghUHlCb29sX0NoZWNrKGEpIHx8ICFQeUJvb2xfQ2hlY2soYikpCi0JCXJldHVybiBQeUludF9UeXBlLnRwX2FzX251bWJlci0+bmJfYW5kKGEsIGIpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoCi0JCSgoUHlCb29sT2JqZWN0ICopYSktPm9iX2l2YWwgJiAoKFB5Qm9vbE9iamVjdCAqKWIpLT5vYl9pdmFsKTsKKyAgICBpZiAoIVB5Qm9vbF9DaGVjayhhKSB8fCAhUHlCb29sX0NoZWNrKGIpKQorICAgICAgICByZXR1cm4gUHlJbnRfVHlwZS50cF9hc19udW1iZXItPm5iX2FuZChhLCBiKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKAorICAgICAgICAoKFB5Qm9vbE9iamVjdCAqKWEpLT5vYl9pdmFsICYgKChQeUJvb2xPYmplY3QgKiliKS0+b2JfaXZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBib29sX29yKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqYikKIHsKLQlpZiAoIVB5Qm9vbF9DaGVjayhhKSB8fCAhUHlCb29sX0NoZWNrKGIpKQotCQlyZXR1cm4gUHlJbnRfVHlwZS50cF9hc19udW1iZXItPm5iX29yKGEsIGIpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoCi0JCSgoUHlCb29sT2JqZWN0ICopYSktPm9iX2l2YWwgfCAoKFB5Qm9vbE9iamVjdCAqKWIpLT5vYl9pdmFsKTsKKyAgICBpZiAoIVB5Qm9vbF9DaGVjayhhKSB8fCAhUHlCb29sX0NoZWNrKGIpKQorICAgICAgICByZXR1cm4gUHlJbnRfVHlwZS50cF9hc19udW1iZXItPm5iX29yKGEsIGIpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoCisgICAgICAgICgoUHlCb29sT2JqZWN0ICopYSktPm9iX2l2YWwgfCAoKFB5Qm9vbE9iamVjdCAqKWIpLT5vYl9pdmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJvb2xfeG9yKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqYikKIHsKLQlpZiAoIVB5Qm9vbF9DaGVjayhhKSB8fCAhUHlCb29sX0NoZWNrKGIpKQotCQlyZXR1cm4gUHlJbnRfVHlwZS50cF9hc19udW1iZXItPm5iX3hvcihhLCBiKTsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKAotCQkoKFB5Qm9vbE9iamVjdCAqKWEpLT5vYl9pdmFsIF4gKChQeUJvb2xPYmplY3QgKiliKS0+b2JfaXZhbCk7CisgICAgaWYgKCFQeUJvb2xfQ2hlY2soYSkgfHwgIVB5Qm9vbF9DaGVjayhiKSkKKyAgICAgICAgcmV0dXJuIFB5SW50X1R5cGUudHBfYXNfbnVtYmVyLT5uYl94b3IoYSwgYik7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygKKyAgICAgICAgKChQeUJvb2xPYmplY3QgKilhKS0+b2JfaXZhbCBeICgoUHlCb29sT2JqZWN0ICopYiktPm9iX2l2YWwpOwogfQogCiAvKiBEb2Mgc3RyaW5nICovCkBAIC0xMDUsOTggKzEwNSw5OCBAQAogLyogQXJpdGhtZXRpYyBtZXRob2RzIC0tIG9ubHkgc28gd2UgY2FuIG92ZXJyaWRlICYsIHwsIF4uICovCiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgYm9vbF9hc19udW1iZXIgPSB7Ci0JMCwJCQkvKiBuYl9hZGQgKi8KLQkwLAkJCS8qIG5iX3N1YnRyYWN0ICovCi0JMCwJCQkvKiBuYl9tdWx0aXBseSAqLwotCTAsCQkJLyogbmJfZGl2aWRlICovCi0JMCwJCQkvKiBuYl9yZW1haW5kZXIgKi8KLQkwLAkJCS8qIG5iX2Rpdm1vZCAqLwotCTAsCQkJLyogbmJfcG93ZXIgKi8KLQkwLAkJCS8qIG5iX25lZ2F0aXZlICovCi0JMCwJCQkvKiBuYl9wb3NpdGl2ZSAqLwotCTAsCQkJLyogbmJfYWJzb2x1dGUgKi8KLQkwLAkJCS8qIG5iX25vbnplcm8gKi8KLQkwLAkJCS8qIG5iX2ludmVydCAqLwotCTAsCQkJLyogbmJfbHNoaWZ0ICovCi0JMCwJCQkvKiBuYl9yc2hpZnQgKi8KLQlib29sX2FuZCwJCS8qIG5iX2FuZCAqLwotCWJvb2xfeG9yLAkJLyogbmJfeG9yICovCi0JYm9vbF9vciwJCS8qIG5iX29yICovCi0JMCwJCQkvKiBuYl9jb2VyY2UgKi8KLQkwLAkJCS8qIG5iX2ludCAqLwotCTAsCQkJLyogbmJfbG9uZyAqLwotCTAsCQkJLyogbmJfZmxvYXQgKi8KLQkwLAkJCS8qIG5iX29jdCAqLwotCTAsCQkgCS8qIG5iX2hleCAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9hZGQgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfbXVsdGlwbHkgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfZGl2aWRlICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9wb3dlciAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9sc2hpZnQgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX2FuZCAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV94b3IgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2Vfb3IgKi8KLQkwLAkJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLwotCTAsCQkJLyogbmJfdHJ1ZV9kaXZpZGUgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2FkZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9zdWJ0cmFjdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcmVtYWluZGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3dlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9uZWdhdGl2ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hYnNvbHV0ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9ub256ZXJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2ludmVydCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9sc2hpZnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcnNoaWZ0ICovCisgICAgYm9vbF9hbmQsICAgICAgICAgICAgICAgICAgIC8qIG5iX2FuZCAqLworICAgIGJvb2xfeG9yLCAgICAgICAgICAgICAgICAgICAvKiBuYl94b3IgKi8KKyAgICBib29sX29yLCAgICAgICAgICAgICAgICAgICAgLyogbmJfb3IgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfY29lcmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2ludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9sb25nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Zsb2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX29jdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9oZXggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hZGQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9zdWJ0cmFjdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcmVtYWluZGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9sc2hpZnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9yc2hpZnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hbmQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV94b3IgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9vciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9mbG9vcl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfdHJ1ZV9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLwogfTsKIAogLyogVGhlIHR5cGUgb2JqZWN0IGZvciBib29sLiAgTm90ZSB0aGF0IHRoaXMgY2Fubm90IGJlIHN1YmNsYXNzZWQhICovCiAKIFB5VHlwZU9iamVjdCBQeUJvb2xfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJib29sIiwKLQlzaXplb2YoUHlJbnRPYmplY3QpLAotCTAsCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKWJvb2xfcHJpbnQsCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpYm9vbF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkmYm9vbF9hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotICAgICAgICAwLAkJCQkJLyogdHBfY2FsbCAqLwotICAgICAgICAocmVwcmZ1bmMpYm9vbF9yZXByLAkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMsIC8qIHRwX2ZsYWdzICovCi0JYm9vbF9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkmUHlJbnRfVHlwZSwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JYm9vbF9uZXcsCQkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImJvb2wiLAorICAgIHNpemVvZihQeUludE9iamVjdCksCisgICAgMCwKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAocHJpbnRmdW5jKWJvb2xfcHJpbnQsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWJvb2xfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmJvb2xfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKWJvb2xfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTLCAvKiB0cF9mbGFncyAqLworICAgIGJvb2xfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICZQeUludF9UeXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgYm9vbF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIC8qIFRoZSBvYmplY3RzIHJlcHJlc2VudGluZyBib29sIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZSAqLwogCiAvKiBOYW1lZCBaZXJvIGZvciBsaW5rLWxldmVsIGNvbXBhdGliaWxpdHkgKi8KIFB5SW50T2JqZWN0IF9QeV9aZXJvU3RydWN0ID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlCb29sX1R5cGUpCi0JMAorICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlCb29sX1R5cGUpCisgICAgMAogfTsKIAogUHlJbnRPYmplY3QgX1B5X1RydWVTdHJ1Y3QgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeUJvb2xfVHlwZSkKLQkxCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeUJvb2xfVHlwZSkKKyAgICAxCiB9OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9idWZmZXJvYmplY3QuYyBiL09iamVjdHMvYnVmZmVyb2JqZWN0LmMKaW5kZXggNWIwOGUxZS4uMGY3ZTc2MyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9idWZmZXJvYmplY3QuYworKysgYi9PYmplY3RzL2J1ZmZlcm9iamVjdC5jCkBAIC01LDEzICs1LDEzIEBACiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqYl9iYXNlOwotCXZvaWQgKmJfcHRyOwotCVB5X3NzaXplX3QgYl9zaXplOwotCVB5X3NzaXplX3QgYl9vZmZzZXQ7Ci0JaW50IGJfcmVhZG9ubHk7Ci0JbG9uZyBiX2hhc2g7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpiX2Jhc2U7CisgICAgdm9pZCAqYl9wdHI7CisgICAgUHlfc3NpemVfdCBiX3NpemU7CisgICAgUHlfc3NpemVfdCBiX29mZnNldDsKKyAgICBpbnQgYl9yZWFkb25seTsKKyAgICBsb25nIGJfaGFzaDsKIH0gUHlCdWZmZXJPYmplY3Q7CiAKIApAQCAtMjQsMjA3ICsyNCwyMDcgQEAKIAogc3RhdGljIGludAogZ2V0X2J1ZihQeUJ1ZmZlck9iamVjdCAqc2VsZiwgdm9pZCAqKnB0ciwgUHlfc3NpemVfdCAqc2l6ZSwKLQllbnVtIGJ1ZmZlcl90IGJ1ZmZlcl90eXBlKQorICAgIGVudW0gYnVmZmVyX3QgYnVmZmVyX3R5cGUpCiB7Ci0JaWYgKHNlbGYtPmJfYmFzZSA9PSBOVUxMKSB7Ci0JCWFzc2VydCAocHRyICE9IE5VTEwpOwotCQkqcHRyID0gc2VsZi0+Yl9wdHI7Ci0JCSpzaXplID0gc2VsZi0+Yl9zaXplOwotCX0KLQllbHNlIHsKLQkJUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OwotCQlyZWFkYnVmZmVycHJvYyBwcm9jID0gMDsKLQkJUHlCdWZmZXJQcm9jcyAqYnAgPSBzZWxmLT5iX2Jhc2UtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKLQkJaWYgKCgqYnAtPmJmX2dldHNlZ2NvdW50KShzZWxmLT5iX2Jhc2UsIE5VTEwpICE9IDEpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmICgoYnVmZmVyX3R5cGUgPT0gUkVBRF9CVUZGRVIpIHx8Ci0JCQkoKGJ1ZmZlcl90eXBlID09IEFOWV9CVUZGRVIpICYmIHNlbGYtPmJfcmVhZG9ubHkpKQotCQkgICAgcHJvYyA9IGJwLT5iZl9nZXRyZWFkYnVmZmVyOwotCQllbHNlIGlmICgoYnVmZmVyX3R5cGUgPT0gV1JJVEVfQlVGRkVSKSB8fAotCQkJKGJ1ZmZlcl90eXBlID09IEFOWV9CVUZGRVIpKQotICAgIAkJICAgIHByb2MgPSAocmVhZGJ1ZmZlcnByb2MpYnAtPmJmX2dldHdyaXRlYnVmZmVyOwotCQllbHNlIGlmIChidWZmZXJfdHlwZSA9PSBDSEFSX0JVRkZFUikgewotCQkgICAgaWYgKCFQeVR5cGVfSGFzRmVhdHVyZShzZWxmLT5vYl90eXBlLAotCQkJCVB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVIgbmVlZGVkIik7Ci0JCQlyZXR1cm4gMDsKLQkJICAgIH0KLQkJICAgIHByb2MgPSAocmVhZGJ1ZmZlcnByb2MpYnAtPmJmX2dldGNoYXJidWZmZXI7Ci0JCX0KLQkJaWYgKCFwcm9jKSB7Ci0JCSAgICBjaGFyICpidWZmZXJfdHlwZV9uYW1lOwotCQkgICAgc3dpdGNoIChidWZmZXJfdHlwZSkgewotCQkJY2FzZSBSRUFEX0JVRkZFUjoKLQkJCSAgICBidWZmZXJfdHlwZV9uYW1lID0gInJlYWQiOwotCQkJICAgIGJyZWFrOwotCQkJY2FzZSBXUklURV9CVUZGRVI6Ci0JCQkgICAgYnVmZmVyX3R5cGVfbmFtZSA9ICJ3cml0ZSI7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIENIQVJfQlVGRkVSOgotCQkJICAgIGJ1ZmZlcl90eXBlX25hbWUgPSAiY2hhciI7Ci0JCQkgICAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICAgIGJ1ZmZlcl90eXBlX25hbWUgPSAibm8iOwotCQkJICAgIGJyZWFrOwotCQkgICAgfQotCQkgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAiJXMgYnVmZmVyIHR5cGUgbm90IGF2YWlsYWJsZSIsCi0JCQkgICAgYnVmZmVyX3R5cGVfbmFtZSk7Ci0JCSAgICByZXR1cm4gMDsKLQkJfQotCQlpZiAoKGNvdW50ID0gKCpwcm9jKShzZWxmLT5iX2Jhc2UsIDAsIHB0cikpIDwgMCkKLQkJCXJldHVybiAwOwotCQkvKiBhcHBseSBjb25zdHJhaW50cyB0byB0aGUgc3RhcnQvZW5kICovCi0JCWlmIChzZWxmLT5iX29mZnNldCA+IGNvdW50KQotCQkJb2Zmc2V0ID0gY291bnQ7Ci0JCWVsc2UKLQkJCW9mZnNldCA9IHNlbGYtPmJfb2Zmc2V0OwotCQkqKGNoYXIgKiopcHRyID0gKihjaGFyICoqKXB0ciArIG9mZnNldDsKLQkJaWYgKHNlbGYtPmJfc2l6ZSA9PSBQeV9FTkRfT0ZfQlVGRkVSKQotCQkJKnNpemUgPSBjb3VudDsKLQkJZWxzZQotCQkJKnNpemUgPSBzZWxmLT5iX3NpemU7Ci0JCWlmIChvZmZzZXQgKyAqc2l6ZSA+IGNvdW50KQotCQkJKnNpemUgPSBjb3VudCAtIG9mZnNldDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKHNlbGYtPmJfYmFzZSA9PSBOVUxMKSB7CisgICAgICAgIGFzc2VydCAocHRyICE9IE5VTEwpOworICAgICAgICAqcHRyID0gc2VsZi0+Yl9wdHI7CisgICAgICAgICpzaXplID0gc2VsZi0+Yl9zaXplOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OworICAgICAgICByZWFkYnVmZmVycHJvYyBwcm9jID0gMDsKKyAgICAgICAgUHlCdWZmZXJQcm9jcyAqYnAgPSBzZWxmLT5iX2Jhc2UtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICAgICAgaWYgKCgqYnAtPmJmX2dldHNlZ2NvdW50KShzZWxmLT5iX2Jhc2UsIE5VTEwpICE9IDEpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICgoYnVmZmVyX3R5cGUgPT0gUkVBRF9CVUZGRVIpIHx8CisgICAgICAgICAgICAoKGJ1ZmZlcl90eXBlID09IEFOWV9CVUZGRVIpICYmIHNlbGYtPmJfcmVhZG9ubHkpKQorICAgICAgICAgICAgcHJvYyA9IGJwLT5iZl9nZXRyZWFkYnVmZmVyOworICAgICAgICBlbHNlIGlmICgoYnVmZmVyX3R5cGUgPT0gV1JJVEVfQlVGRkVSKSB8fAorICAgICAgICAgICAgKGJ1ZmZlcl90eXBlID09IEFOWV9CVUZGRVIpKQorICAgICAgICAgICAgcHJvYyA9IChyZWFkYnVmZmVycHJvYylicC0+YmZfZ2V0d3JpdGVidWZmZXI7CisgICAgICAgIGVsc2UgaWYgKGJ1ZmZlcl90eXBlID09IENIQVJfQlVGRkVSKSB7CisgICAgICAgICAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHNlbGYtPm9iX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIlB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSIG5lZWRlZCIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9jID0gKHJlYWRidWZmZXJwcm9jKWJwLT5iZl9nZXRjaGFyYnVmZmVyOworICAgICAgICB9CisgICAgICAgIGlmICghcHJvYykgeworICAgICAgICAgICAgY2hhciAqYnVmZmVyX3R5cGVfbmFtZTsKKyAgICAgICAgICAgIHN3aXRjaCAoYnVmZmVyX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUkVBRF9CVUZGRVI6CisgICAgICAgICAgICAgICAgYnVmZmVyX3R5cGVfbmFtZSA9ICJyZWFkIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV1JJVEVfQlVGRkVSOgorICAgICAgICAgICAgICAgIGJ1ZmZlcl90eXBlX25hbWUgPSAid3JpdGUiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDSEFSX0JVRkZFUjoKKyAgICAgICAgICAgICAgICBidWZmZXJfdHlwZV9uYW1lID0gImNoYXIiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBidWZmZXJfdHlwZV9uYW1lID0gIm5vIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIiVzIGJ1ZmZlciB0eXBlIG5vdCBhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgIGJ1ZmZlcl90eXBlX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjb3VudCA9ICgqcHJvYykoc2VsZi0+Yl9iYXNlLCAwLCBwdHIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgLyogYXBwbHkgY29uc3RyYWludHMgdG8gdGhlIHN0YXJ0L2VuZCAqLworICAgICAgICBpZiAoc2VsZi0+Yl9vZmZzZXQgPiBjb3VudCkKKyAgICAgICAgICAgIG9mZnNldCA9IGNvdW50OworICAgICAgICBlbHNlCisgICAgICAgICAgICBvZmZzZXQgPSBzZWxmLT5iX29mZnNldDsKKyAgICAgICAgKihjaGFyICoqKXB0ciA9ICooY2hhciAqKilwdHIgKyBvZmZzZXQ7CisgICAgICAgIGlmIChzZWxmLT5iX3NpemUgPT0gUHlfRU5EX09GX0JVRkZFUikKKyAgICAgICAgICAgICpzaXplID0gY291bnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpzaXplID0gc2VsZi0+Yl9zaXplOworICAgICAgICBpZiAob2Zmc2V0ICsgKnNpemUgPiBjb3VudCkKKyAgICAgICAgICAgICpzaXplID0gY291bnQgLSBvZmZzZXQ7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfZnJvbV9tZW1vcnkoUHlPYmplY3QgKmJhc2UsIFB5X3NzaXplX3Qgc2l6ZSwgUHlfc3NpemVfdCBvZmZzZXQsIHZvaWQgKnB0ciwKLQkJICAgaW50IHJlYWRvbmx5KQorICAgICAgICAgICAgICAgICAgIGludCByZWFkb25seSkKIHsKLQlQeUJ1ZmZlck9iamVjdCAqIGI7CisgICAgUHlCdWZmZXJPYmplY3QgKiBiOwogCi0JaWYgKHNpemUgPCAwICYmIHNpemUgIT0gUHlfRU5EX09GX0JVRkZFUikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic2l6ZSBtdXN0IGJlIHplcm8gb3IgcG9zaXRpdmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChvZmZzZXQgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJvZmZzZXQgbXVzdCBiZSB6ZXJvIG9yIHBvc2l0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2l6ZSA8IDAgJiYgc2l6ZSAhPSBQeV9FTkRfT0ZfQlVGRkVSKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgbXVzdCBiZSB6ZXJvIG9yIHBvc2l0aXZlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgbXVzdCBiZSB6ZXJvIG9yIHBvc2l0aXZlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWIgPSBQeU9iamVjdF9ORVcoUHlCdWZmZXJPYmplY3QsICZQeUJ1ZmZlcl9UeXBlKTsKLQlpZiAoIGIgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOworICAgIGIgPSBQeU9iamVjdF9ORVcoUHlCdWZmZXJPYmplY3QsICZQeUJ1ZmZlcl9UeXBlKTsKKyAgICBpZiAoIGIgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfWElOQ1JFRihiYXNlKTsKLQliLT5iX2Jhc2UgPSBiYXNlOwotCWItPmJfcHRyID0gcHRyOwotCWItPmJfc2l6ZSA9IHNpemU7Ci0JYi0+Yl9vZmZzZXQgPSBvZmZzZXQ7Ci0JYi0+Yl9yZWFkb25seSA9IHJlYWRvbmx5OwotCWItPmJfaGFzaCA9IC0xOworICAgIFB5X1hJTkNSRUYoYmFzZSk7CisgICAgYi0+Yl9iYXNlID0gYmFzZTsKKyAgICBiLT5iX3B0ciA9IHB0cjsKKyAgICBiLT5iX3NpemUgPSBzaXplOworICAgIGItPmJfb2Zmc2V0ID0gb2Zmc2V0OworICAgIGItPmJfcmVhZG9ubHkgPSByZWFkb25seTsKKyAgICBiLT5iX2hhc2ggPSAtMTsKIAotCXJldHVybiAoUHlPYmplY3QgKikgYjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIGI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfZnJvbV9vYmplY3QoUHlPYmplY3QgKmJhc2UsIFB5X3NzaXplX3Qgc2l6ZSwgUHlfc3NpemVfdCBvZmZzZXQsIGludCByZWFkb25seSkKIHsKLQlpZiAob2Zmc2V0IDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkib2Zmc2V0IG11c3QgYmUgemVybyBvciBwb3NpdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCBQeUJ1ZmZlcl9DaGVjayhiYXNlKSAmJiAoKChQeUJ1ZmZlck9iamVjdCAqKWJhc2UpLT5iX2Jhc2UpICkgewotCQkvKiBhbm90aGVyIGJ1ZmZlciwgcmVmZXIgdG8gdGhlIGJhc2Ugb2JqZWN0ICovCi0JCVB5QnVmZmVyT2JqZWN0ICpiID0gKFB5QnVmZmVyT2JqZWN0ICopYmFzZTsKLQkJaWYgKGItPmJfc2l6ZSAhPSBQeV9FTkRfT0ZfQlVGRkVSKSB7Ci0JCQlQeV9zc2l6ZV90IGJhc2Vfc2l6ZSA9IGItPmJfc2l6ZSAtIG9mZnNldDsKLQkJCWlmIChiYXNlX3NpemUgPCAwKQotCQkJCWJhc2Vfc2l6ZSA9IDA7Ci0JCQlpZiAoc2l6ZSA9PSBQeV9FTkRfT0ZfQlVGRkVSIHx8IHNpemUgPiBiYXNlX3NpemUpCi0JCQkJc2l6ZSA9IGJhc2Vfc2l6ZTsKLQkJfQotCQlvZmZzZXQgKz0gYi0+Yl9vZmZzZXQ7Ci0JCWJhc2UgPSBiLT5iX2Jhc2U7Ci0JfQotCXJldHVybiBidWZmZXJfZnJvbV9tZW1vcnkoYmFzZSwgc2l6ZSwgb2Zmc2V0LCBOVUxMLCByZWFkb25seSk7CisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0IG11c3QgYmUgemVybyBvciBwb3NpdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCBQeUJ1ZmZlcl9DaGVjayhiYXNlKSAmJiAoKChQeUJ1ZmZlck9iamVjdCAqKWJhc2UpLT5iX2Jhc2UpICkgeworICAgICAgICAvKiBhbm90aGVyIGJ1ZmZlciwgcmVmZXIgdG8gdGhlIGJhc2Ugb2JqZWN0ICovCisgICAgICAgIFB5QnVmZmVyT2JqZWN0ICpiID0gKFB5QnVmZmVyT2JqZWN0ICopYmFzZTsKKyAgICAgICAgaWYgKGItPmJfc2l6ZSAhPSBQeV9FTkRfT0ZfQlVGRkVSKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGJhc2Vfc2l6ZSA9IGItPmJfc2l6ZSAtIG9mZnNldDsKKyAgICAgICAgICAgIGlmIChiYXNlX3NpemUgPCAwKQorICAgICAgICAgICAgICAgIGJhc2Vfc2l6ZSA9IDA7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSBQeV9FTkRfT0ZfQlVGRkVSIHx8IHNpemUgPiBiYXNlX3NpemUpCisgICAgICAgICAgICAgICAgc2l6ZSA9IGJhc2Vfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gYi0+Yl9vZmZzZXQ7CisgICAgICAgIGJhc2UgPSBiLT5iX2Jhc2U7CisgICAgfQorICAgIHJldHVybiBidWZmZXJfZnJvbV9tZW1vcnkoYmFzZSwgc2l6ZSwgb2Zmc2V0LCBOVUxMLCByZWFkb25seSk7CiB9CiAKIAogUHlPYmplY3QgKgogUHlCdWZmZXJfRnJvbU9iamVjdChQeU9iamVjdCAqYmFzZSwgUHlfc3NpemVfdCBvZmZzZXQsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQeUJ1ZmZlclByb2NzICpwYiA9IGJhc2UtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICBQeUJ1ZmZlclByb2NzICpwYiA9IGJhc2UtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKIAotCWlmICggcGIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICggcGIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIGJ1ZmZlcl9mcm9tX29iamVjdChiYXNlLCBzaXplLCBvZmZzZXQsIDEpOworICAgIHJldHVybiBidWZmZXJfZnJvbV9vYmplY3QoYmFzZSwgc2l6ZSwgb2Zmc2V0LCAxKTsKIH0KIAogUHlPYmplY3QgKgogUHlCdWZmZXJfRnJvbVJlYWRXcml0ZU9iamVjdChQeU9iamVjdCAqYmFzZSwgUHlfc3NpemVfdCBvZmZzZXQsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQeUJ1ZmZlclByb2NzICpwYiA9IGJhc2UtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICBQeUJ1ZmZlclByb2NzICpwYiA9IGJhc2UtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKIAotCWlmICggcGIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHdyaXRlYnVmZmVyID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIHBiID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXR3cml0ZWJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gYnVmZmVyX2Zyb21fb2JqZWN0KGJhc2UsIHNpemUsICBvZmZzZXQsIDApOworICAgIHJldHVybiBidWZmZXJfZnJvbV9vYmplY3QoYmFzZSwgc2l6ZSwgIG9mZnNldCwgMCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5QnVmZmVyX0Zyb21NZW1vcnkodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIGJ1ZmZlcl9mcm9tX21lbW9yeShOVUxMLCBzaXplLCAwLCBwdHIsIDEpOworICAgIHJldHVybiBidWZmZXJfZnJvbV9tZW1vcnkoTlVMTCwgc2l6ZSwgMCwgcHRyLCAxKTsKIH0KIAogUHlPYmplY3QgKgogUHlCdWZmZXJfRnJvbVJlYWRXcml0ZU1lbW9yeSh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlyZXR1cm4gYnVmZmVyX2Zyb21fbWVtb3J5KE5VTEwsIHNpemUsIDAsIHB0ciwgMCk7CisgICAgcmV0dXJuIGJ1ZmZlcl9mcm9tX21lbW9yeShOVUxMLCBzaXplLCAwLCBwdHIsIDApOwogfQogCiBQeU9iamVjdCAqCiBQeUJ1ZmZlcl9OZXcoUHlfc3NpemVfdCBzaXplKQogewotCVB5T2JqZWN0ICpvOwotCVB5QnVmZmVyT2JqZWN0ICogYjsKKyAgICBQeU9iamVjdCAqbzsKKyAgICBQeUJ1ZmZlck9iamVjdCAqIGI7CiAKLQlpZiAoc2l6ZSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInNpemUgbXVzdCBiZSB6ZXJvIG9yIHBvc2l0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc2l6ZW9mKCpiKSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZSkgewotCQkvKiB1bmxpa2VseSAqLwotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLwotCW8gPSAoUHlPYmplY3QgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKCpiKSArIHNpemUpOwotCWlmICggbyA9PSBOVUxMICkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JYiA9IChQeUJ1ZmZlck9iamVjdCAqKSBQeU9iamVjdF9JTklUKG8sICZQeUJ1ZmZlcl9UeXBlKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSBtdXN0IGJlIHplcm8gb3IgcG9zaXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzaXplb2YoKmIpID4gUFlfU1NJWkVfVF9NQVggLSBzaXplKSB7CisgICAgICAgIC8qIHVubGlrZWx5ICovCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICAvKiBJbmxpbmUgUHlPYmplY3RfTmV3ICovCisgICAgbyA9IChQeU9iamVjdCAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoKmIpICsgc2l6ZSk7CisgICAgaWYgKCBvID09IE5VTEwgKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBiID0gKFB5QnVmZmVyT2JqZWN0ICopIFB5T2JqZWN0X0lOSVQobywgJlB5QnVmZmVyX1R5cGUpOwogCi0JYi0+Yl9iYXNlID0gTlVMTDsKLQliLT5iX3B0ciA9ICh2b2lkICopKGIgKyAxKTsKLQliLT5iX3NpemUgPSBzaXplOwotCWItPmJfb2Zmc2V0ID0gMDsKLQliLT5iX3JlYWRvbmx5ID0gMDsKLQliLT5iX2hhc2ggPSAtMTsKKyAgICBiLT5iX2Jhc2UgPSBOVUxMOworICAgIGItPmJfcHRyID0gKHZvaWQgKikoYiArIDEpOworICAgIGItPmJfc2l6ZSA9IHNpemU7CisgICAgYi0+Yl9vZmZzZXQgPSAwOworICAgIGItPmJfcmVhZG9ubHkgPSAwOworICAgIGItPmJfaGFzaCA9IC0xOwogCi0JcmV0dXJuIG87CisgICAgcmV0dXJuIG87CiB9CiAKIC8qIE1ldGhvZHMgKi8KQEAgLTIzMiwxOSArMjMyLDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVmZmVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKm9iOwotCVB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKLQlQeV9zc2l6ZV90IHNpemUgPSBQeV9FTkRfT0ZfQlVGRkVSOworICAgIFB5T2JqZWN0ICpvYjsKKyAgICBQeV9zc2l6ZV90IG9mZnNldCA9IDA7CisgICAgUHlfc3NpemVfdCBzaXplID0gUHlfRU5EX09GX0JVRkZFUjsKIAotCWlmIChQeUVycl9XYXJuUHkzaygiYnVmZmVyKCkgbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCQotCWlmICghX1B5QXJnX05vS2V5d29yZHMoImJ1ZmZlcigpIiwga3cpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImJ1ZmZlcigpIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xubjpidWZmZXIiLCAmb2IsICZvZmZzZXQsICZzaXplKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5QnVmZmVyX0Zyb21PYmplY3Qob2IsIG9mZnNldCwgc2l6ZSk7CisgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiYnVmZmVyKCkiLCBrdykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfG5uOmJ1ZmZlciIsICZvYiwgJm9mZnNldCwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCdWZmZXJfRnJvbU9iamVjdChvYiwgb2Zmc2V0LCBzaXplKTsKIH0KIAogUHlEb2NfU1RSVkFSKGJ1ZmZlcl9kb2MsCkBAIC0yNTksOTkgKzI1OSw5OSBAQAogc3RhdGljIHZvaWQKIGJ1ZmZlcl9kZWFsbG9jKFB5QnVmZmVyT2JqZWN0ICpzZWxmKQogewotCVB5X1hERUNSRUYoc2VsZi0+Yl9iYXNlKTsKLQlQeU9iamVjdF9ERUwoc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5iX2Jhc2UpOworICAgIFB5T2JqZWN0X0RFTChzZWxmKTsKIH0KIAogc3RhdGljIGludAogYnVmZmVyX2NvbXBhcmUoUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5QnVmZmVyT2JqZWN0ICpvdGhlcikKIHsKLQl2b2lkICpwMSwgKnAyOwotCVB5X3NzaXplX3QgbGVuX3NlbGYsIGxlbl9vdGhlciwgbWluX2xlbjsKLQlpbnQgY21wOworICAgIHZvaWQgKnAxLCAqcDI7CisgICAgUHlfc3NpemVfdCBsZW5fc2VsZiwgbGVuX290aGVyLCBtaW5fbGVuOworICAgIGludCBjbXA7CiAKLQlpZiAoIWdldF9idWYoc2VsZiwgJnAxLCAmbGVuX3NlbGYsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFnZXRfYnVmKG90aGVyLCAmcDIsICZsZW5fb3RoZXIsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gLTE7Ci0JbWluX2xlbiA9IChsZW5fc2VsZiA8IGxlbl9vdGhlcikgPyBsZW5fc2VsZiA6IGxlbl9vdGhlcjsKLQlpZiAobWluX2xlbiA+IDApIHsKLQkJY21wID0gbWVtY21wKHAxLCBwMiwgbWluX2xlbik7Ci0JCWlmIChjbXAgIT0gMCkKLQkJCXJldHVybiBjbXAgPCAwID8gLTEgOiAxOwotCX0KLQlyZXR1cm4gKGxlbl9zZWxmIDwgbGVuX290aGVyKSA/IC0xIDogKGxlbl9zZWxmID4gbGVuX290aGVyKSA/IDEgOiAwOworICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcDEsICZsZW5fc2VsZiwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIWdldF9idWYob3RoZXIsICZwMiwgJmxlbl9vdGhlciwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBtaW5fbGVuID0gKGxlbl9zZWxmIDwgbGVuX290aGVyKSA/IGxlbl9zZWxmIDogbGVuX290aGVyOworICAgIGlmIChtaW5fbGVuID4gMCkgeworICAgICAgICBjbXAgPSBtZW1jbXAocDEsIHAyLCBtaW5fbGVuKTsKKyAgICAgICAgaWYgKGNtcCAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIGNtcCA8IDAgPyAtMSA6IDE7CisgICAgfQorICAgIHJldHVybiAobGVuX3NlbGYgPCBsZW5fb3RoZXIpID8gLTEgOiAobGVuX3NlbGYgPiBsZW5fb3RoZXIpID8gMSA6IDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfcmVwcihQeUJ1ZmZlck9iamVjdCAqc2VsZikKIHsKLQljb25zdCBjaGFyICpzdGF0dXMgPSBzZWxmLT5iX3JlYWRvbmx5ID8gInJlYWQtb25seSIgOiAicmVhZC13cml0ZSI7CisgICAgY29uc3QgY2hhciAqc3RhdHVzID0gc2VsZi0+Yl9yZWFkb25seSA/ICJyZWFkLW9ubHkiIDogInJlYWQtd3JpdGUiOwogCi0JaWYgKCBzZWxmLT5iX2Jhc2UgPT0gTlVMTCApCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgYnVmZmVyIHB0ciAlcCwgc2l6ZSAlemQgYXQgJXA+IiwKLQkJCQkJICAgc3RhdHVzLAotCQkJCQkgICBzZWxmLT5iX3B0ciwKLQkJCQkJICAgc2VsZi0+Yl9zaXplLAotCQkJCQkgICBzZWxmKTsKLQllbHNlCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KAotCQkJIjwlcyBidWZmZXIgZm9yICVwLCBzaXplICV6ZCwgb2Zmc2V0ICV6ZCBhdCAlcD4iLAotCQkJc3RhdHVzLAotCQkJc2VsZi0+Yl9iYXNlLAotCQkJc2VsZi0+Yl9zaXplLAotCQkJc2VsZi0+Yl9vZmZzZXQsCi0JCQlzZWxmKTsKKyAgICBpZiAoIHNlbGYtPmJfYmFzZSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBidWZmZXIgcHRyICVwLCBzaXplICV6ZCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5iX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoCisgICAgICAgICAgICAiPCVzIGJ1ZmZlciBmb3IgJXAsIHNpemUgJXpkLCBvZmZzZXQgJXpkIGF0ICVwPiIsCisgICAgICAgICAgICBzdGF0dXMsCisgICAgICAgICAgICBzZWxmLT5iX2Jhc2UsCisgICAgICAgICAgICBzZWxmLT5iX3NpemUsCisgICAgICAgICAgICBzZWxmLT5iX29mZnNldCwKKyAgICAgICAgICAgIHNlbGYpOwogfQogCiBzdGF0aWMgbG9uZwogYnVmZmVyX2hhc2goUHlCdWZmZXJPYmplY3QgKnNlbGYpCiB7Ci0Jdm9pZCAqcHRyOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGxlbjsKLQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOwotCXJlZ2lzdGVyIGxvbmcgeDsKKyAgICB2b2lkICpwdHI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgbGVuOworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgcmVnaXN0ZXIgbG9uZyB4OwogCi0JaWYgKCBzZWxmLT5iX2hhc2ggIT0gLTEgKQotCQlyZXR1cm4gc2VsZi0+Yl9oYXNoOworICAgIGlmICggc2VsZi0+Yl9oYXNoICE9IC0xICkKKyAgICAgICAgcmV0dXJuIHNlbGYtPmJfaGFzaDsKIAotCS8qIFhYWCBwb3RlbnRpYWwgYnVncyBoZXJlLCBhIHJlYWRvbmx5IGJ1ZmZlciBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZQotCSAqIHVuZGVybHlpbmcgbWVtb3J5IGlzIGltbXV0YWJsZS4gIGJfcmVhZG9ubHkgaXMgYSBuZWNlc3NhcnkgYnV0IG5vdAotCSAqIHN1ZmZpY2llbnQgY29uZGl0aW9uIGZvciBhIGJ1ZmZlciB0byBiZSBoYXNoYWJsZS4gIFBlcmhhcHMgaXQgd291bGQKLQkgKiBiZSBiZXR0ZXIgdG8gb25seSBhbGxvdyBoYXNoaW5nIGlmIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBpcyBrbm93biB0bwotCSAqIGJlIGltbXV0YWJsZSAoZS5nLiBQeVN0cmluZ19DaGVjaygpIGlzIHRydWUpLiAgQW5vdGhlciBpZGVhIHdvdWxkCi0JICogYmUgdG8gY2FsbCB0cF9oYXNoIG9uIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBhbmQgc2VlIGlmIGl0IHJhaXNlcwotCSAqIGFuIGVycm9yLiAqLwotCWlmICggIXNlbGYtPmJfcmVhZG9ubHkgKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkid3JpdGFibGUgYnVmZmVycyBhcmUgbm90IGhhc2hhYmxlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogWFhYIHBvdGVudGlhbCBidWdzIGhlcmUsIGEgcmVhZG9ubHkgYnVmZmVyIGRvZXMgbm90IGltcGx5IHRoYXQgdGhlCisgICAgICogdW5kZXJseWluZyBtZW1vcnkgaXMgaW1tdXRhYmxlLiAgYl9yZWFkb25seSBpcyBhIG5lY2Vzc2FyeSBidXQgbm90CisgICAgICogc3VmZmljaWVudCBjb25kaXRpb24gZm9yIGEgYnVmZmVyIHRvIGJlIGhhc2hhYmxlLiAgUGVyaGFwcyBpdCB3b3VsZAorICAgICAqIGJlIGJldHRlciB0byBvbmx5IGFsbG93IGhhc2hpbmcgaWYgdGhlIHVuZGVybHlpbmcgb2JqZWN0IGlzIGtub3duIHRvCisgICAgICogYmUgaW1tdXRhYmxlIChlLmcuIFB5U3RyaW5nX0NoZWNrKCkgaXMgdHJ1ZSkuICBBbm90aGVyIGlkZWEgd291bGQKKyAgICAgKiBiZSB0byBjYWxsIHRwX2hhc2ggb24gdGhlIHVuZGVybHlpbmcgb2JqZWN0IGFuZCBzZWUgaWYgaXQgcmFpc2VzCisgICAgICogYW4gZXJyb3IuICovCisgICAgaWYgKCAhc2VsZi0+Yl9yZWFkb25seSApCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRhYmxlIGJ1ZmZlcnMgYXJlIG5vdCBoYXNoYWJsZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIC0xOwotCXAgPSAodW5zaWduZWQgY2hhciAqKSBwdHI7Ci0JbGVuID0gc2l6ZTsKLQl4ID0gKnAgPDwgNzsKLQl3aGlsZSAoLS1sZW4gPj0gMCkKLQkJeCA9ICgxMDAwMDAzKngpIF4gKnArKzsKLQl4IF49IHNpemU7Ci0JaWYgKHggPT0gLTEpCi0JCXggPSAtMjsKLQlzZWxmLT5iX2hhc2ggPSB4OwotCXJldHVybiB4OworICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOworICAgIGxlbiA9IHNpemU7CisgICAgeCA9ICpwIDw8IDc7CisgICAgd2hpbGUgKC0tbGVuID49IDApCisgICAgICAgIHggPSAoMTAwMDAwMyp4KSBeICpwKys7CisgICAgeCBePSBzaXplOworICAgIGlmICh4ID09IC0xKQorICAgICAgICB4ID0gLTI7CisgICAgc2VsZi0+Yl9oYXNoID0geDsKKyAgICByZXR1cm4geDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcl9zdHIoUHlCdWZmZXJPYmplY3QgKnNlbGYpCiB7Ci0Jdm9pZCAqcHRyOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIgKilwdHIsIHNpemUpOworICAgIHZvaWQgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjb25zdCBjaGFyICopcHRyLCBzaXplKTsKIH0KIAogLyogU2VxdWVuY2UgbWV0aG9kcyAqLwpAQCAtMzU5LDM3MiArMzU5LDM3MiBAQAogc3RhdGljIFB5X3NzaXplX3QKIGJ1ZmZlcl9sZW5ndGgoUHlCdWZmZXJPYmplY3QgKnNlbGYpCiB7Ci0Jdm9pZCAqcHRyOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIHNpemU7CisgICAgdm9pZCAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHNpemU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfY29uY2F0KFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGIgPSBvdGhlci0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCXZvaWQgKnB0cjEsICpwdHIyOwotCWNoYXIgKnA7Ci0JUHlPYmplY3QgKm9iOwotCVB5X3NzaXplX3Qgc2l6ZSwgY291bnQ7CisgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSBvdGhlci0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgIHZvaWQgKnB0cjEsICpwdHIyOworICAgIGNoYXIgKnA7CisgICAgUHlPYmplY3QgKm9iOworICAgIFB5X3NzaXplX3Qgc2l6ZSwgY291bnQ7CiAKLQlpZiAoIHBiID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKLQl7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoICgqcGItPmJmX2dldHNlZ2NvdW50KShvdGhlciwgTlVMTCkgIT0gMSApCi0JewotCQkvKiAjIyMgdXNlIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiB0eXBlL21lc3NhZ2U/ICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICggcGIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggKCpwYi0+YmZfZ2V0c2VnY291bnQpKG90aGVyLCBOVUxMKSAhPSAxICkKKyAgICB7CisgICAgICAgIC8qICMjIyB1c2UgYSBkaWZmZXJlbnQgZXhjZXB0aW9uIHR5cGUvbWVzc2FnZT8gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotIAlpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzaXplLCBBTllfQlVGRkVSKSkKLSAJCXJldHVybiBOVUxMOwotIAotCS8qIG9wdGltaXplIHNwZWNpYWwgY2FzZSAqLwotCWlmICggc2l6ZSA9PSAwICkKLQl7Ci0JICAgIFB5X0lOQ1JFRihvdGhlcik7Ci0JICAgIHJldHVybiBvdGhlcjsKLQl9CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIxLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCAoY291bnQgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKShvdGhlciwgMCwgJnB0cjIpKSA8IDAgKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBvcHRpbWl6ZSBzcGVjaWFsIGNhc2UgKi8KKyAgICBpZiAoIHNpemUgPT0gMCApCisgICAgeworICAgICAgICBQeV9JTkNSRUYob3RoZXIpOworICAgICAgICByZXR1cm4gb3RoZXI7CisgICAgfQogCi0JYXNzZXJ0KGNvdW50IDw9IFBZX1NJWkVfTUFYIC0gc2l6ZSk7CisgICAgaWYgKCAoY291bnQgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKShvdGhlciwgMCwgJnB0cjIpKSA8IDAgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotIAlvYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUgKyBjb3VudCk7Ci0JaWYgKCBvYiA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0gCXAgPSBQeVN0cmluZ19BU19TVFJJTkcob2IpOwotIAltZW1jcHkocCwgcHRyMSwgc2l6ZSk7Ci0gCW1lbWNweShwICsgc2l6ZSwgcHRyMiwgY291bnQpOworICAgIGFzc2VydChjb3VudCA8PSBQWV9TSVpFX01BWCAtIHNpemUpOwogCi0JLyogdGhlcmUgaXMgYW4gZXh0cmEgYnl0ZSBpbiB0aGUgc3RyaW5nIG9iamVjdCwgc28gdGhpcyBpcyBzYWZlICovCi0JcFtzaXplICsgY291bnRdID0gJ1wwJzsKKyAgICBvYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUgKyBjb3VudCk7CisgICAgaWYgKCBvYiA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IFB5U3RyaW5nX0FTX1NUUklORyhvYik7CisgICAgbWVtY3B5KHAsIHB0cjEsIHNpemUpOworICAgIG1lbWNweShwICsgc2l6ZSwgcHRyMiwgY291bnQpOwogCi0JcmV0dXJuIG9iOworICAgIC8qIHRoZXJlIGlzIGFuIGV4dHJhIGJ5dGUgaW4gdGhlIHN0cmluZyBvYmplY3QsIHNvIHRoaXMgaXMgc2FmZSAqLworICAgIHBbc2l6ZSArIGNvdW50XSA9ICdcMCc7CisKKyAgICByZXR1cm4gb2I7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfcmVwZWF0KFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGNvdW50KQogewotCVB5T2JqZWN0ICpvYjsKLQlyZWdpc3RlciBjaGFyICpwOwotCXZvaWQgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgUHlPYmplY3QgKm9iOworICAgIHJlZ2lzdGVyIGNoYXIgKnA7CisgICAgdm9pZCAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAotCWlmICggY291bnQgPCAwICkKLQkJY291bnQgPSAwOwotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiBOVUxMOwotCWlmIChjb3VudCA+IFBZX1NTSVpFX1RfTUFYIC8gc2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJyZXN1bHQgdG9vIGxhcmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUgKiBjb3VudCk7Ci0JaWYgKCBvYiA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCBjb3VudCA8IDAgKQorICAgICAgICBjb3VudCA9IDA7CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGNvdW50ID4gUFlfU1NJWkVfVF9NQVggLyBzaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgInJlc3VsdCB0b28gbGFyZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9iID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSAqIGNvdW50KTsKKyAgICBpZiAoIG9iID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXAgPSBQeVN0cmluZ19BU19TVFJJTkcob2IpOwotCXdoaWxlICggY291bnQtLSApCi0JewotCSAgICBtZW1jcHkocCwgcHRyLCBzaXplKTsKLQkgICAgcCArPSBzaXplOwotCX0KKyAgICBwID0gUHlTdHJpbmdfQVNfU1RSSU5HKG9iKTsKKyAgICB3aGlsZSAoIGNvdW50LS0gKQorICAgIHsKKyAgICAgICAgbWVtY3B5KHAsIHB0ciwgc2l6ZSk7CisgICAgICAgIHAgKz0gc2l6ZTsKKyAgICB9CiAKLQkvKiB0aGVyZSBpcyBhbiBleHRyYSBieXRlIGluIHRoZSBzdHJpbmcgb2JqZWN0LCBzbyB0aGlzIGlzIHNhZmUgKi8KLQkqcCA9ICdcMCc7CisgICAgLyogdGhlcmUgaXMgYW4gZXh0cmEgYnl0ZSBpbiB0aGUgc3RyaW5nIG9iamVjdCwgc28gdGhpcyBpcyBzYWZlICovCisgICAgKnAgPSAnXDAnOwogCi0JcmV0dXJuIG9iOworICAgIHJldHVybiBvYjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcl9pdGVtKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlkeCkKIHsKLQl2b2lkICpwdHI7Ci0JUHlfc3NpemVfdCBzaXplOwotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiBOVUxMOwotCWlmICggaWR4IDwgMCB8fCBpZHggPj0gc2l6ZSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJidWZmZXIgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilwdHIgKyBpZHgsIDEpOworICAgIHZvaWQgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCBpZHggPCAwIHx8IGlkeCA+PSBzaXplICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImJ1ZmZlciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXB0ciArIGlkeCwgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfc2xpY2UoUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgbGVmdCwgUHlfc3NpemVfdCByaWdodCkKIHsKLQl2b2lkICpwdHI7Ci0JUHlfc3NpemVfdCBzaXplOwotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiBOVUxMOwotCWlmICggbGVmdCA8IDAgKQotCQlsZWZ0ID0gMDsKLQlpZiAoIHJpZ2h0IDwgMCApCi0JCXJpZ2h0ID0gMDsKLQlpZiAoIHJpZ2h0ID4gc2l6ZSApCi0JCXJpZ2h0ID0gc2l6ZTsKLQlpZiAoIHJpZ2h0IDwgbGVmdCApCi0JCXJpZ2h0ID0gbGVmdDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilwdHIgKyBsZWZ0LAotCQkJCQkgIHJpZ2h0IC0gbGVmdCk7CisgICAgdm9pZCAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIGxlZnQgPCAwICkKKyAgICAgICAgbGVmdCA9IDA7CisgICAgaWYgKCByaWdodCA8IDAgKQorICAgICAgICByaWdodCA9IDA7CisgICAgaWYgKCByaWdodCA+IHNpemUgKQorICAgICAgICByaWdodCA9IHNpemU7CisgICAgaWYgKCByaWdodCA8IGxlZnQgKQorICAgICAgICByaWdodCA9IGxlZnQ7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopcHRyICsgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgLSBsZWZ0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcl9zdWJzY3JpcHQoUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppdGVtKQogewotCXZvaWQgKnA7Ci0JUHlfc3NpemVfdCBzaXplOwotCQotCWlmICghZ2V0X2J1ZihzZWxmLCAmcCwgJnNpemUsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBzaXplOwotCQlyZXR1cm4gYnVmZmVyX2l0ZW0oc2VsZiwgaSk7Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIGN1ciwgaTsKKyAgICB2b2lkICpwOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAotCQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIHNpemUsCi0JCQkJICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnAsICZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gc2l6ZTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcl9pdGVtKHNlbGYsIGkpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoLCBjdXIsIGk7CiAKLQkJaWYgKHNsaWNlbGVuZ3RoIDw9IDApCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOwotCQllbHNlIGlmIChzdGVwID09IDEpCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilwICsgc3RhcnQsCi0JCQkJCQkJICBzdG9wIC0gc3RhcnQpOwotCQllbHNlIHsKLQkJCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCQljaGFyICpzb3VyY2VfYnVmID0gKGNoYXIgKilwOwotCQkJY2hhciAqcmVzdWx0X2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKHNsaWNlbGVuZ3RoKTsKKyAgICAgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0KilpdGVtLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQkJaWYgKHJlc3VsdF9idWYgPT0gTlVMTCkKLQkJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgaWYgKHNsaWNlbGVuZ3RoIDw9IDApCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOworICAgICAgICBlbHNlIGlmIChzdGVwID09IDEpCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilwICsgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCAtIHN0YXJ0KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgICAgICAgICAgY2hhciAqc291cmNlX2J1ZiA9IChjaGFyICopcDsKKyAgICAgICAgICAgIGNoYXIgKnJlc3VsdF9idWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhzbGljZWxlbmd0aCk7CiAKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7Ci0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlyZXN1bHRfYnVmW2ldID0gc291cmNlX2J1ZltjdXJdOwotCQkJfQorICAgICAgICAgICAgaWYgKHJlc3VsdF9idWYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzdWx0X2J1ZiwKLQkJCQkJCQkgICAgc2xpY2VsZW5ndGgpOwotCQkJUHlNZW1fRnJlZShyZXN1bHRfYnVmKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInNlcXVlbmNlIGluZGV4IG11c3QgYmUgaW50ZWdlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOworICAgICAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0X2J1ZltpXSA9IHNvdXJjZV9idWZbY3VyXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzdWx0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlbGVuZ3RoKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUocmVzdWx0X2J1Zik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNlcXVlbmNlIGluZGV4IG11c3QgYmUgaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGJ1ZmZlcl9hc3NfaXRlbShQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpZHgsIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeUJ1ZmZlclByb2NzICpwYjsKLQl2b2lkICpwdHIxLCAqcHRyMjsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JUHlfc3NpemVfdCBjb3VudDsKKyAgICBQeUJ1ZmZlclByb2NzICpwYjsKKyAgICB2b2lkICpwdHIxLCAqcHRyMjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBjb3VudDsKIAotCWlmICggc2VsZi0+Yl9yZWFkb25seSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYnVmZmVyIGlzIHJlYWQtb25seSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICggc2VsZi0+Yl9yZWFkb25seSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgaXMgcmVhZC1vbmx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzaXplLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkiYnVmZmVyIGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlwYiA9IG90aGVyID8gb3RoZXItPm9iX3R5cGUtPnRwX2FzX2J1ZmZlciA6IE5VTEw7Ci0JaWYgKCBwYiA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCi0JewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICggKCpwYi0+YmZfZ2V0c2VnY291bnQpKG90aGVyLCBOVUxMKSAhPSAxICkKLQl7Ci0JCS8qICMjIyB1c2UgYSBkaWZmZXJlbnQgZXhjZXB0aW9uIHR5cGUvbWVzc2FnZT8gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkic2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIHBiID0gb3RoZXIgPyBvdGhlci0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyIDogTlVMTDsKKyAgICBpZiAoIHBiID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCAoKnBiLT5iZl9nZXRzZWdjb3VudCkob3RoZXIsIE5VTEwpICE9IDEgKQorICAgIHsKKyAgICAgICAgLyogIyMjIHVzZSBhIGRpZmZlcmVudCBleGNlcHRpb24gdHlwZS9tZXNzYWdlPyAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICggKGNvdW50ID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikob3RoZXIsIDAsICZwdHIyKSkgPCAwICkKLQkJcmV0dXJuIC0xOwotCWlmICggY291bnQgIT0gMSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkicmlnaHQgb3BlcmFuZCBtdXN0IGJlIGEgc2luZ2xlIGJ5dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIChjb3VudCA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKG90aGVyLCAwLCAmcHRyMikpIDwgMCApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIGNvdW50ICE9IDEgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmlnaHQgb3BlcmFuZCBtdXN0IGJlIGEgc2luZ2xlIGJ5dGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCSgoY2hhciAqKXB0cjEpW2lkeF0gPSAqKGNoYXIgKilwdHIyOwotCXJldHVybiAwOworICAgICgoY2hhciAqKXB0cjEpW2lkeF0gPSAqKGNoYXIgKilwdHIyOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBidWZmZXJfYXNzX3NsaWNlKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGxlZnQsIFB5X3NzaXplX3QgcmlnaHQsIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeUJ1ZmZlclByb2NzICpwYjsKLQl2b2lkICpwdHIxLCAqcHRyMjsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JUHlfc3NpemVfdCBzbGljZV9sZW47Ci0JUHlfc3NpemVfdCBjb3VudDsKKyAgICBQeUJ1ZmZlclByb2NzICpwYjsKKyAgICB2b2lkICpwdHIxLCAqcHRyMjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBzbGljZV9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudDsKIAotCWlmICggc2VsZi0+Yl9yZWFkb25seSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYnVmZmVyIGlzIHJlYWQtb25seSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICggc2VsZi0+Yl9yZWFkb25seSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgaXMgcmVhZC1vbmx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlwYiA9IG90aGVyID8gb3RoZXItPm9iX3R5cGUtPnRwX2FzX2J1ZmZlciA6IE5VTEw7Ci0JaWYgKCBwYiA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCi0JewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICggKCpwYi0+YmZfZ2V0c2VnY291bnQpKG90aGVyLCBOVUxMKSAhPSAxICkKLQl7Ci0JCS8qICMjIyB1c2UgYSBkaWZmZXJlbnQgZXhjZXB0aW9uIHR5cGUvbWVzc2FnZT8gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkic2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNpemUsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCAoY291bnQgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKShvdGhlciwgMCwgJnB0cjIpKSA8IDAgKQotCQlyZXR1cm4gLTE7CisgICAgcGIgPSBvdGhlciA/IG90aGVyLT5vYl90eXBlLT50cF9hc19idWZmZXIgOiBOVUxMOworICAgIGlmICggcGIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoICgqcGItPmJmX2dldHNlZ2NvdW50KShvdGhlciwgTlVMTCkgIT0gMSApCisgICAgeworICAgICAgICAvKiAjIyMgdXNlIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiB0eXBlL21lc3NhZ2U/ICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCAoY291bnQgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKShvdGhlciwgMCwgJnB0cjIpKSA8IDAgKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoIGxlZnQgPCAwICkKLQkJbGVmdCA9IDA7Ci0JZWxzZSBpZiAoIGxlZnQgPiBzaXplICkKLQkJbGVmdCA9IHNpemU7Ci0JaWYgKCByaWdodCA8IGxlZnQgKQotCQlyaWdodCA9IGxlZnQ7Ci0JZWxzZSBpZiAoIHJpZ2h0ID4gc2l6ZSApCi0JCXJpZ2h0ID0gc2l6ZTsKLQlzbGljZV9sZW4gPSByaWdodCAtIGxlZnQ7CisgICAgaWYgKCBsZWZ0IDwgMCApCisgICAgICAgIGxlZnQgPSAwOworICAgIGVsc2UgaWYgKCBsZWZ0ID4gc2l6ZSApCisgICAgICAgIGxlZnQgPSBzaXplOworICAgIGlmICggcmlnaHQgPCBsZWZ0ICkKKyAgICAgICAgcmlnaHQgPSBsZWZ0OworICAgIGVsc2UgaWYgKCByaWdodCA+IHNpemUgKQorICAgICAgICByaWdodCA9IHNpemU7CisgICAgc2xpY2VfbGVuID0gcmlnaHQgLSBsZWZ0OwogCi0JaWYgKCBjb3VudCAhPSBzbGljZV9sZW4gKSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCSJyaWdodCBvcGVyYW5kIGxlbmd0aCBtdXN0IG1hdGNoIHNsaWNlIGxlbmd0aCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICggY291bnQgIT0gc2xpY2VfbGVuICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAicmlnaHQgb3BlcmFuZCBsZW5ndGggbXVzdCBtYXRjaCBzbGljZSBsZW5ndGgiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICggc2xpY2VfbGVuICkKLQkgICAgbWVtY3B5KChjaGFyICopcHRyMSArIGxlZnQsIHB0cjIsIHNsaWNlX2xlbik7CisgICAgaWYgKCBzbGljZV9sZW4gKQorICAgICAgICBtZW1jcHkoKGNoYXIgKilwdHIxICsgbGVmdCwgcHRyMiwgc2xpY2VfbGVuKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBidWZmZXJfYXNzX3N1YnNjcmlwdChQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKml0ZW0sIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeUJ1ZmZlclByb2NzICpwYjsKLQl2b2lkICpwdHIxLCAqcHRyMjsKLQlQeV9zc2l6ZV90IHNlbGZzaXplOwotCVB5X3NzaXplX3Qgb3RoZXJzaXplOworICAgIFB5QnVmZmVyUHJvY3MgKnBiOworICAgIHZvaWQgKnB0cjEsICpwdHIyOworICAgIFB5X3NzaXplX3Qgc2VsZnNpemU7CisgICAgUHlfc3NpemVfdCBvdGhlcnNpemU7CiAKLQlpZiAoIHNlbGYtPmJfcmVhZG9ubHkgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImJ1ZmZlciBpcyByZWFkLW9ubHkiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIHNlbGYtPmJfcmVhZG9ubHkgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIGlzIHJlYWQtb25seSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcGIgPSB2YWx1ZSA/IHZhbHVlLT5vYl90eXBlLT50cF9hc19idWZmZXIgOiBOVUxMOwotCWlmICggcGIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQotCXsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoICgqcGItPmJmX2dldHNlZ2NvdW50KSh2YWx1ZSwgTlVMTCkgIT0gMSApCi0JewotCQkvKiAjIyMgdXNlIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiB0eXBlL21lc3NhZ2U/ICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzZWxmc2l6ZSwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiAtMTsKLQlpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gc2VsZnNpemU7Ci0JCXJldHVybiBidWZmZXJfYXNzX2l0ZW0oc2VsZiwgaSwgdmFsdWUpOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoOwotCQkKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwgc2VsZnNpemUsCi0JCQkJJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKQotCQkJcmV0dXJuIC0xOworICAgIHBiID0gdmFsdWUgPyB2YWx1ZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyIDogTlVMTDsKKyAgICBpZiAoIHBiID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCAoKnBiLT5iZl9nZXRzZWdjb3VudCkodmFsdWUsIE5VTEwpICE9IDEgKQorICAgIHsKKyAgICAgICAgLyogIyMjIHVzZSBhIGRpZmZlcmVudCBleGNlcHRpb24gdHlwZS9tZXNzYWdlPyAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzZWxmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gc2VsZnNpemU7CisgICAgICAgIHJldHVybiBidWZmZXJfYXNzX2l0ZW0oc2VsZiwgaSwgdmFsdWUpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoOwogCi0JCWlmICgob3RoZXJzaXplID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikodmFsdWUsIDAsICZwdHIyKSkgPCAwKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QgKilpdGVtLCBzZWxmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpZiAob3RoZXJzaXplICE9IHNsaWNlbGVuZ3RoKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCSJyaWdodCBvcGVyYW5kIGxlbmd0aCBtdXN0IG1hdGNoIHNsaWNlIGxlbmd0aCIpOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIGlmICgob3RoZXJzaXplID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikodmFsdWUsIDAsICZwdHIyKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWlmIChzbGljZWxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKHN0ZXAgPT0gMSkgewotCQkJbWVtY3B5KChjaGFyICopcHRyMSArIHN0YXJ0LCBwdHIyLCBzbGljZWxlbmd0aCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQllbHNlIHsKLQkJCVB5X3NzaXplX3QgY3VyLCBpOwotCQkJCi0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOwotCQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQkJKChjaGFyICopcHRyMSlbY3VyXSA9ICgoY2hhciAqKXB0cjIpW2ldOwotCQkJfQorICAgICAgICBpZiAob3RoZXJzaXplICE9IHNsaWNlbGVuZ3RoKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJyaWdodCBvcGVyYW5kIGxlbmd0aCBtdXN0IG1hdGNoIHNsaWNlIGxlbmd0aCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJCXJldHVybiAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYnVmZmVyIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICBpZiAoc2xpY2VsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKXB0cjEgKyBzdGFydCwgcHRyMiwgc2xpY2VsZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGN1ciwgaTsKKworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKKyAgICAgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgICgoY2hhciAqKXB0cjEpW2N1cl0gPSAoKGNoYXIgKilwdHIyKVtpXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogLyogQnVmZmVyIG1ldGhvZHMgKi8KQEAgLTczMiwxMjYgKzczMiwxMjYgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBidWZmZXJfZ2V0cmVhZGJ1ZihQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpZHgsIHZvaWQgKipwcCkKIHsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCBpZHggIT0gMCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGJ1ZmZlciBzZWdtZW50Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFnZXRfYnVmKHNlbGYsIHBwLCAmc2l6ZSwgUkVBRF9CVUZGRVIpKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIHNpemU7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGlmICggaWR4ICE9IDAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGJ1ZmZlciBzZWdtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsIHBwLCAmc2l6ZSwgUkVBRF9CVUZGRVIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBidWZmZXJfZ2V0d3JpdGVidWYoUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaWR4LCB2b2lkICoqcHApCiB7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAotCWlmICggc2VsZi0+Yl9yZWFkb25seSApCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGlzIHJlYWQtb25seSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICggc2VsZi0+Yl9yZWFkb25seSApCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGlzIHJlYWQtb25seSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCBpZHggIT0gMCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGJ1ZmZlciBzZWdtZW50Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFnZXRfYnVmKHNlbGYsIHBwLCAmc2l6ZSwgV1JJVEVfQlVGRkVSKSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBzaXplOworICAgIGlmICggaWR4ICE9IDAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGJ1ZmZlciBzZWdtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsIHBwLCAmc2l6ZSwgV1JJVEVfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBzaXplOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogYnVmZmVyX2dldHNlZ2NvdW50KFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90ICpsZW5wKQogewotCXZvaWQgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIC0xOwotCWlmIChsZW5wKQotCQkqbGVucCA9IHNpemU7Ci0JcmV0dXJuIDE7CisgICAgdm9pZCAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGxlbnApCisgICAgICAgICpsZW5wID0gc2l6ZTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGJ1ZmZlcl9nZXRjaGFyYnVmKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlkeCwgY29uc3QgY2hhciAqKnBwKQogewotCXZvaWQgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCBpZHggIT0gMCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGJ1ZmZlciBzZWdtZW50Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBDSEFSX0JVRkZFUikpCi0JCXJldHVybiAtMTsKLQkqcHAgPSAoY29uc3QgY2hhciAqKXB0cjsKLQlyZXR1cm4gc2l6ZTsKKyAgICB2b2lkICpwdHI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGlmICggaWR4ICE9IDAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGJ1ZmZlciBzZWdtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBDSEFSX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAqcHAgPSAoY29uc3QgY2hhciAqKXB0cjsKKyAgICByZXR1cm4gc2l6ZTsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGJ1ZmZlcl9hc19zZXF1ZW5jZSA9IHsKLQkobGVuZnVuYylidWZmZXJfbGVuZ3RoLCAvKnNxX2xlbmd0aCovCi0JKGJpbmFyeWZ1bmMpYnVmZmVyX2NvbmNhdCwgLypzcV9jb25jYXQqLwotCShzc2l6ZWFyZ2Z1bmMpYnVmZmVyX3JlcGVhdCwgLypzcV9yZXBlYXQqLwotCShzc2l6ZWFyZ2Z1bmMpYnVmZmVyX2l0ZW0sIC8qc3FfaXRlbSovCi0JKHNzaXplc3NpemVhcmdmdW5jKWJ1ZmZlcl9zbGljZSwgLypzcV9zbGljZSovCi0JKHNzaXplb2JqYXJncHJvYylidWZmZXJfYXNzX2l0ZW0sIC8qc3FfYXNzX2l0ZW0qLwotCShzc2l6ZXNzaXplb2JqYXJncHJvYylidWZmZXJfYXNzX3NsaWNlLCAvKnNxX2Fzc19zbGljZSovCisgICAgKGxlbmZ1bmMpYnVmZmVyX2xlbmd0aCwgLypzcV9sZW5ndGgqLworICAgIChiaW5hcnlmdW5jKWJ1ZmZlcl9jb25jYXQsIC8qc3FfY29uY2F0Ki8KKyAgICAoc3NpemVhcmdmdW5jKWJ1ZmZlcl9yZXBlYXQsIC8qc3FfcmVwZWF0Ki8KKyAgICAoc3NpemVhcmdmdW5jKWJ1ZmZlcl9pdGVtLCAvKnNxX2l0ZW0qLworICAgIChzc2l6ZXNzaXplYXJnZnVuYylidWZmZXJfc2xpY2UsIC8qc3Ffc2xpY2UqLworICAgIChzc2l6ZW9iamFyZ3Byb2MpYnVmZmVyX2Fzc19pdGVtLCAvKnNxX2Fzc19pdGVtKi8KKyAgICAoc3NpemVzc2l6ZW9iamFyZ3Byb2MpYnVmZmVyX2Fzc19zbGljZSwgLypzcV9hc3Nfc2xpY2UqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgYnVmZmVyX2FzX21hcHBpbmcgPSB7Ci0JKGxlbmZ1bmMpYnVmZmVyX2xlbmd0aCwKLQkoYmluYXJ5ZnVuYylidWZmZXJfc3Vic2NyaXB0LAotCShvYmpvYmphcmdwcm9jKWJ1ZmZlcl9hc3Nfc3Vic2NyaXB0LAorICAgIChsZW5mdW5jKWJ1ZmZlcl9sZW5ndGgsCisgICAgKGJpbmFyeWZ1bmMpYnVmZmVyX3N1YnNjcmlwdCwKKyAgICAob2Jqb2JqYXJncHJvYylidWZmZXJfYXNzX3N1YnNjcmlwdCwKIH07CiAKIHN0YXRpYyBQeUJ1ZmZlclByb2NzIGJ1ZmZlcl9hc19idWZmZXIgPSB7Ci0JKHJlYWRidWZmZXJwcm9jKWJ1ZmZlcl9nZXRyZWFkYnVmLAotCSh3cml0ZWJ1ZmZlcnByb2MpYnVmZmVyX2dldHdyaXRlYnVmLAotCShzZWdjb3VudHByb2MpYnVmZmVyX2dldHNlZ2NvdW50LAotCShjaGFyYnVmZmVycHJvYylidWZmZXJfZ2V0Y2hhcmJ1ZiwKKyAgICAocmVhZGJ1ZmZlcnByb2MpYnVmZmVyX2dldHJlYWRidWYsCisgICAgKHdyaXRlYnVmZmVycHJvYylidWZmZXJfZ2V0d3JpdGVidWYsCisgICAgKHNlZ2NvdW50cHJvYylidWZmZXJfZ2V0c2VnY291bnQsCisgICAgKGNoYXJidWZmZXJwcm9jKWJ1ZmZlcl9nZXRjaGFyYnVmLAogfTsKIAogUHlUeXBlT2JqZWN0IFB5QnVmZmVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiYnVmZmVyIiwKLQlzaXplb2YoUHlCdWZmZXJPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpYnVmZmVyX2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkoY21wZnVuYylidWZmZXJfY29tcGFyZSwJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpYnVmZmVyX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmYnVmZmVyX2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JJmJ1ZmZlcl9hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpYnVmZmVyX2hhc2gsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JKHJlcHJmdW5jKWJ1ZmZlcl9zdHIsCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCSZidWZmZXJfYXNfYnVmZmVyLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSLCAvKiB0cF9mbGFncyAqLwotCWJ1ZmZlcl9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8JCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWJ1ZmZlcl9uZXcsCQkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImJ1ZmZlciIsCisgICAgc2l6ZW9mKFB5QnVmZmVyT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWJ1ZmZlcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYylidWZmZXJfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpYnVmZmVyX3JlcHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZidWZmZXJfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmYnVmZmVyX2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpYnVmZmVyX2hhc2gsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpYnVmZmVyX3N0ciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgJmJ1ZmZlcl9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUiwgLyogdHBfZmxhZ3MgKi8KKyAgICBidWZmZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGJ1ZmZlcl9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMgYi9PYmplY3RzL2J5dGVzX21ldGhvZHMuYwppbmRleCA0ZDI1NTIwLi5hNWQwYzViIDEwMDY0NAotLS0gYS9PYmplY3RzL2J5dGVzX21ldGhvZHMuYworKysgYi9PYmplY3RzL2J5dGVzX21ldGhvZHMuYwpAQCAtMjQsNyArMjQsNyBAQAogCiAgICAgZSA9IHAgKyBsZW47CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlpZiAoIVB5X0lTU1BBQ0UoKnApKQorICAgICAgICBpZiAoIVB5X0lTU1BBQ0UoKnApKQogICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogICAgIH0KICAgICBQeV9SRVRVUk5fVFJVRTsKQEAgLTQ2LDE2ICs0NiwxNiBAQAogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMSAmJiBQeV9JU0FMUEhBKCpwKSkKLQlQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDApCi0JUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAKICAgICBlID0gcCArIGxlbjsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmICghUHlfSVNBTFBIQSgqcCkpCi0JICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgaWYgKCFQeV9JU0FMUEhBKCpwKSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKICAgICB9CiAgICAgUHlfUkVUVVJOX1RSVUU7CiB9CkBAIC03NiwxNiArNzYsMTYgQEAKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDEgJiYgUHlfSVNBTE5VTSgqcCkpCi0JUHlfUkVUVVJOX1RSVUU7CisgICAgICAgIFB5X1JFVFVSTl9UUlVFOwogCiAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKGxlbiA9PSAwKQotCVB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogCiAgICAgZSA9IHAgKyBsZW47CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlpZiAoIVB5X0lTQUxOVU0oKnApKQotCSAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIGlmICghUHlfSVNBTE5VTSgqcCkpCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAgICAgfQogICAgIFB5X1JFVFVSTl9UUlVFOwogfQpAQCAtMTA2LDE2ICsxMDYsMTYgQEAKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDEgJiYgUHlfSVNESUdJVCgqcCkpCi0JUHlfUkVUVVJOX1RSVUU7CisgICAgICAgIFB5X1JFVFVSTl9UUlVFOwogCiAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKGxlbiA9PSAwKQotCVB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogCiAgICAgZSA9IHAgKyBsZW47CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlpZiAoIVB5X0lTRElHSVQoKnApKQotCSAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIGlmICghUHlfSVNESUdJVCgqcCkpCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAgICAgfQogICAgIFB5X1JFVFVSTl9UUlVFOwogfQpAQCAtMTM3LDE5ICsxMzcsMTkgQEAKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDEpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhQeV9JU0xPV0VSKCpwKSk7CisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoUHlfSVNMT1dFUigqcCkpOwogCiAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKGxlbiA9PSAwKQotCVB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogCiAgICAgZSA9IHAgKyBsZW47CiAgICAgY2FzZWQgPSAwOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JaWYgKFB5X0lTVVBQRVIoKnApKQotCSAgICBQeV9SRVRVUk5fRkFMU0U7Ci0JZWxzZSBpZiAoIWNhc2VkICYmIFB5X0lTTE9XRVIoKnApKQotCSAgICBjYXNlZCA9IDE7CisgICAgICAgIGlmIChQeV9JU1VQUEVSKCpwKSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgZWxzZSBpZiAoIWNhc2VkICYmIFB5X0lTTE9XRVIoKnApKQorICAgICAgICAgICAgY2FzZWQgPSAxOwogICAgIH0KICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGNhc2VkKTsKIH0KQEAgLTE3MSwxOSArMTcxLDE5IEBACiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKGxlbiA9PSAxKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoUHlfSVNVUFBFUigqcCkpOworICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKFB5X0lTVVBQRVIoKnApKTsKIAogICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMCkKLQlQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKIAogICAgIGUgPSBwICsgbGVuOwogICAgIGNhc2VkID0gMDsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmIChQeV9JU0xPV0VSKCpwKSkKLQkgICAgUHlfUkVUVVJOX0ZBTFNFOwotCWVsc2UgaWYgKCFjYXNlZCAmJiBQeV9JU1VQUEVSKCpwKSkKLQkgICAgY2FzZWQgPSAxOworICAgICAgICBpZiAoUHlfSVNMT1dFUigqcCkpCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIGVsc2UgaWYgKCFjYXNlZCAmJiBQeV9JU1VQUEVSKCpwKSkKKyAgICAgICAgICAgIGNhc2VkID0gMTsKICAgICB9CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhjYXNlZCk7CiB9CkBAIC0yMDcsMzIgKzIwNywzMiBAQAogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFB5X0lTVVBQRVIoKnApKTsKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhQeV9JU1VQUEVSKCpwKSk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDApCi0JUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAKICAgICBlID0gcCArIGxlbjsKICAgICBjYXNlZCA9IDA7CiAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAwOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciBjaCA9ICpwOworICAgICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyIGNoID0gKnA7CiAKLQlpZiAoUHlfSVNVUFBFUihjaCkpIHsKLQkgICAgaWYgKHByZXZpb3VzX2lzX2Nhc2VkKQotCQlQeV9SRVRVUk5fRkFMU0U7Ci0JICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKLQkgICAgY2FzZWQgPSAxOwotCX0KLQllbHNlIGlmIChQeV9JU0xPV0VSKGNoKSkgewotCSAgICBpZiAoIXByZXZpb3VzX2lzX2Nhc2VkKQotCQlQeV9SRVRVUk5fRkFMU0U7Ci0JICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKLQkgICAgY2FzZWQgPSAxOwotCX0KLQllbHNlCi0JICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKKyAgICAgICAgaWYgKFB5X0lTVVBQRVIoY2gpKSB7CisgICAgICAgICAgICBpZiAocHJldmlvdXNfaXNfY2FzZWQpCisgICAgICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOworICAgICAgICAgICAgY2FzZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5X0lTTE9XRVIoY2gpKSB7CisgICAgICAgICAgICBpZiAoIXByZXZpb3VzX2lzX2Nhc2VkKQorICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKKyAgICAgICAgICAgIGNhc2VkID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDA7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoY2FzZWQpOwogfQpAQCAtMjQ2LDIzICsyNDYsMjMgQEAKIHZvaWQKIF9QeV9ieXRlc19sb3dlcihjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKQogewotCVB5X3NzaXplX3QgaTsKKyAgICAgICAgUHlfc3NpemVfdCBpOwogCiAgICAgICAgIC8qCi0JbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKLQlpZiAoIW5ld29iaikKLQkJcmV0dXJuIE5VTEw7CisgICAgICAgIG5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgICAgIGlmICghbmV3b2JqKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOworICAgICAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5ld29iaik7CiAgICAgICAgICovCiAKLQlQeV9NRU1DUFkocmVzdWx0LCBjcHRyLCBsZW4pOworICAgICAgICBQeV9NRU1DUFkocmVzdWx0LCBjcHRyLCBsZW4pOwogCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0socmVzdWx0W2ldKTsKLQkJaWYgKFB5X0lTVVBQRVIoYykpCi0JCQlyZXN1bHRbaV0gPSBQeV9UT0xPV0VSKGMpOwotCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSyhyZXN1bHRbaV0pOworICAgICAgICAgICAgICAgIGlmIChQeV9JU1VQUEVSKGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gUHlfVE9MT1dFUihjKTsKKyAgICAgICAgfQogfQogCiAKQEAgLTI3NCwyMyArMjc0LDIzIEBACiB2b2lkCiBfUHlfYnl0ZXNfdXBwZXIoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpjcHRyLCBQeV9zc2l6ZV90IGxlbikKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgICAgIFB5X3NzaXplX3QgaTsKIAogICAgICAgICAvKgotCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0JaWYgKCFuZXdvYmopCi0JCXJldHVybiBOVUxMOworICAgICAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgICAgICBpZiAoIW5ld29iaikKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCXMgPSBQeVN0cmluZ19BU19TVFJJTkcobmV3b2JqKTsKKyAgICAgICAgcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOwogICAgICAgICAqLwogCi0JUHlfTUVNQ1BZKHJlc3VsdCwgY3B0ciwgbGVuKTsKKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdCwgY3B0ciwgbGVuKTsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKHJlc3VsdFtpXSk7Ci0JCWlmIChQeV9JU0xPV0VSKGMpKQotCQkJcmVzdWx0W2ldID0gUHlfVE9VUFBFUihjKTsKLQl9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0socmVzdWx0W2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlfSVNMT1dFUihjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IFB5X1RPVVBQRVIoYyk7CisgICAgICAgIH0KIH0KIAogCkBAIC0zMDMsMjkgKzMwMywyOSBAQAogdm9pZAogX1B5X2J5dGVzX3RpdGxlKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCiB7Ci0JUHlfc3NpemVfdCBpOwotCWludCBwcmV2aW91c19pc19jYXNlZCA9IDA7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgaW50IHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKIAogICAgICAgICAvKgotCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CisgICAgICAgIG5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgICAgIGlmIChuZXdvYmogPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOwogICAgICAgICAqLwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoUHlfSVNMT1dFUihjKSkgewotCQkJaWYgKCFwcmV2aW91c19pc19jYXNlZCkKLQkJCSAgICBjID0gUHlfVE9VUFBFUihjKTsKLQkJCXByZXZpb3VzX2lzX2Nhc2VkID0gMTsKLQkJfSBlbHNlIGlmIChQeV9JU1VQUEVSKGMpKSB7Ci0JCQlpZiAocHJldmlvdXNfaXNfY2FzZWQpCi0JCQkgICAgYyA9IFB5X1RPTE9XRVIoYyk7Ci0JCQlwcmV2aW91c19pc19jYXNlZCA9IDE7Ci0JCX0gZWxzZQotCQkJcHJldmlvdXNfaXNfY2FzZWQgPSAwOwotCQkqcmVzdWx0KysgPSBjOwotCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlfSVNMT1dFUihjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c19pc19jYXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gUHlfVE9VUFBFUihjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFB5X0lTVVBQRVIoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c19pc19jYXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gUHlfVE9MT1dFUihjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKKyAgICAgICAgICAgICAgICAqcmVzdWx0KysgPSBjOworICAgICAgICB9CiB9CiAKIApAQCAtMzM3LDMwICszMzcsMzAgQEAKIHZvaWQKIF9QeV9ieXRlc19jYXBpdGFsaXplKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCiB7Ci0JUHlfc3NpemVfdCBpOworICAgICAgICBQeV9zc2l6ZV90IGk7CiAKICAgICAgICAgLyoKLQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotCWlmIChuZXdvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOworICAgICAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgICAgICBpZiAobmV3b2JqID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKICAgICAgICAgKi8KLQlpZiAoMCA8IGxlbikgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoUHlfSVNMT1dFUihjKSkKLQkJCSpyZXN1bHQgPSBQeV9UT1VQUEVSKGMpOwotCQllbHNlCi0JCQkqcmVzdWx0ID0gYzsKLQkJcmVzdWx0Kys7Ci0JfQotCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoUHlfSVNVUFBFUihjKSkKLQkJCSpyZXN1bHQgPSBQeV9UT0xPV0VSKGMpOwotCQllbHNlCi0JCQkqcmVzdWx0ID0gYzsKLQkJcmVzdWx0Kys7Ci0JfQorICAgICAgICBpZiAoMCA8IGxlbikgeworICAgICAgICAgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgICAgICAgICAgaWYgKFB5X0lTTE9XRVIoYykpCisgICAgICAgICAgICAgICAgICAgICAgICAqcmVzdWx0ID0gUHlfVE9VUFBFUihjKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAqcmVzdWx0ID0gYzsKKyAgICAgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICAgICAgICAgIGlmIChQeV9JU1VQUEVSKGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgKnJlc3VsdCA9IFB5X1RPTE9XRVIoYyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKnJlc3VsdCA9IGM7CisgICAgICAgICAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIH0KIH0KIAogCkBAIC0zNzMsMjUgKzM3MywyNSBAQAogdm9pZAogX1B5X2J5dGVzX3N3YXBjYXNlKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCiB7Ci0JUHlfc3NpemVfdCBpOworICAgICAgICBQeV9zc2l6ZV90IGk7CiAKICAgICAgICAgLyoKLQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotCWlmIChuZXdvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOworICAgICAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgICAgICBpZiAobmV3b2JqID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKICAgICAgICAgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKLQkJaWYgKFB5X0lTTE9XRVIoYykpIHsKLQkJCSpyZXN1bHQgPSBQeV9UT1VQUEVSKGMpOwotCQl9Ci0JCWVsc2UgaWYgKFB5X0lTVVBQRVIoYykpIHsKLQkJCSpyZXN1bHQgPSBQeV9UT0xPV0VSKGMpOwotCQl9Ci0JCWVsc2UKLQkJCSpyZXN1bHQgPSBjOwotCQlyZXN1bHQrKzsKLQl9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgICAgICAgICAgaWYgKFB5X0lTTE9XRVIoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBQeV9UT1VQUEVSKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQeV9JU1VQUEVSKGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcmVzdWx0ID0gUHlfVE9MT1dFUihjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKnJlc3VsdCA9IGM7CisgICAgICAgICAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jZWxsb2JqZWN0LmMgYi9PYmplY3RzL2NlbGxvYmplY3QuYwppbmRleCA0ZTBiY2Y4Li5kMGY2Y2RhIDEwMDY0NAotLS0gYS9PYmplY3RzL2NlbGxvYmplY3QuYworKysgYi9PYmplY3RzL2NlbGxvYmplY3QuYwpAQCAtNSwxNDEgKzUsMTQxIEBACiBQeU9iamVjdCAqCiBQeUNlbGxfTmV3KFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlDZWxsT2JqZWN0ICpvcDsKKyAgICBQeUNlbGxPYmplY3QgKm9wOwogCi0Jb3AgPSAoUHlDZWxsT2JqZWN0ICopUHlPYmplY3RfR0NfTmV3KFB5Q2VsbE9iamVjdCwgJlB5Q2VsbF9UeXBlKTsKLQlpZiAob3AgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3AtPm9iX3JlZiA9IG9iajsKLQlQeV9YSU5DUkVGKG9iaik7CisgICAgb3AgPSAoUHlDZWxsT2JqZWN0ICopUHlPYmplY3RfR0NfTmV3KFB5Q2VsbE9iamVjdCwgJlB5Q2VsbF9UeXBlKTsKKyAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3AtPm9iX3JlZiA9IG9iajsKKyAgICBQeV9YSU5DUkVGKG9iaik7CiAKLQlfUHlPYmplY3RfR0NfVFJBQ0sob3ApOwotCXJldHVybiAoUHlPYmplY3QgKilvcDsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0sob3ApOworICAgIHJldHVybiAoUHlPYmplY3QgKilvcDsKIH0KIAogUHlPYmplY3QgKgogUHlDZWxsX0dldChQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeUNlbGxfQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfWElOQ1JFRigoKFB5Q2VsbE9iamVjdCopb3ApLT5vYl9yZWYpOwotCXJldHVybiBQeUNlbGxfR0VUKG9wKTsKKyAgICBpZiAoIVB5Q2VsbF9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9YSU5DUkVGKCgoUHlDZWxsT2JqZWN0KilvcCktPm9iX3JlZik7CisgICAgcmV0dXJuIFB5Q2VsbF9HRVQob3ApOwogfQogCiBpbnQKIFB5Q2VsbF9TZXQoUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0KiBvbGRvYmo7Ci0JaWYgKCFQeUNlbGxfQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW9sZG9iaiA9IFB5Q2VsbF9HRVQob3ApOwotCVB5X1hJTkNSRUYob2JqKTsKLQlQeUNlbGxfU0VUKG9wLCBvYmopOwotCVB5X1hERUNSRUYob2xkb2JqKTsKLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCogb2xkb2JqOworICAgIGlmICghUHlDZWxsX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBvbGRvYmogPSBQeUNlbGxfR0VUKG9wKTsKKyAgICBQeV9YSU5DUkVGKG9iaik7CisgICAgUHlDZWxsX1NFVChvcCwgb2JqKTsKKyAgICBQeV9YREVDUkVGKG9sZG9iaik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBjZWxsX2RlYWxsb2MoUHlDZWxsT2JqZWN0ICpvcCkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhvcCk7Ci0JUHlfWERFQ1JFRihvcC0+b2JfcmVmKTsKLQlQeU9iamVjdF9HQ19EZWwob3ApOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKG9wKTsKKyAgICBQeV9YREVDUkVGKG9wLT5vYl9yZWYpOworICAgIFB5T2JqZWN0X0dDX0RlbChvcCk7CiB9CiAKIHN0YXRpYyBpbnQKIGNlbGxfY29tcGFyZShQeUNlbGxPYmplY3QgKmEsIFB5Q2VsbE9iamVjdCAqYikKIHsKLQkvKiBQeTNLIHdhcm5pbmcgZm9yIGNvbXBhcmlzb25zICAqLwotCWlmIChQeUVycl9XYXJuUHkzaygiY2VsbCBjb21wYXJpc29ucyBub3Qgc3VwcG9ydGVkIGluIDMueCIsCi0JCQkgICAxKSA8IDApIHsKLQkJcmV0dXJuIC0yOwotCX0KKyAgICAvKiBQeTNLIHdhcm5pbmcgZm9yIGNvbXBhcmlzb25zICAqLworICAgIGlmIChQeUVycl9XYXJuUHkzaygiY2VsbCBjb21wYXJpc29ucyBub3Qgc3VwcG9ydGVkIGluIDMueCIsCisgICAgICAgICAgICAgICAgICAgICAgIDEpIDwgMCkgeworICAgICAgICByZXR1cm4gLTI7CisgICAgfQogCi0JaWYgKGEtPm9iX3JlZiA9PSBOVUxMKSB7Ci0JCWlmIChiLT5vYl9yZWYgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIGlmIChiLT5vYl9yZWYgPT0gTlVMTCkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIFB5T2JqZWN0X0NvbXBhcmUoYS0+b2JfcmVmLCBiLT5vYl9yZWYpOworICAgIGlmIChhLT5vYl9yZWYgPT0gTlVMTCkgeworICAgICAgICBpZiAoYi0+b2JfcmVmID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoYi0+b2JfcmVmID09IE5VTEwpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiBQeU9iamVjdF9Db21wYXJlKGEtPm9iX3JlZiwgYi0+b2JfcmVmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNlbGxfcmVwcihQeUNlbGxPYmplY3QgKm9wKQogewotCWlmIChvcC0+b2JfcmVmID09IE5VTEwpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Y2VsbCBhdCAlcDogZW1wdHk+Iiwgb3ApOworICAgIGlmIChvcC0+b2JfcmVmID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Y2VsbCBhdCAlcDogZW1wdHk+Iiwgb3ApOwogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxjZWxsIGF0ICVwOiAlLjgwcyBvYmplY3QgYXQgJXA+IiwKLQkJCQkgICBvcCwgb3AtPm9iX3JlZi0+b2JfdHlwZS0+dHBfbmFtZSwKLQkJCQkgICBvcC0+b2JfcmVmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGNlbGwgYXQgJXA6ICUuODBzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLCBvcC0+b2JfcmVmLT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5vYl9yZWYpOwogfQogCiBzdGF0aWMgaW50CiBjZWxsX3RyYXZlcnNlKFB5Q2VsbE9iamVjdCAqb3AsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKG9wLT5vYl9yZWYpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKG9wLT5vYl9yZWYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBjZWxsX2NsZWFyKFB5Q2VsbE9iamVjdCAqb3ApCiB7Ci0JUHlfQ0xFQVIob3AtPm9iX3JlZik7Ci0JcmV0dXJuIDA7CisgICAgUHlfQ0xFQVIob3AtPm9iX3JlZik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjZWxsX2dldF9jb250ZW50cyhQeUNlbGxPYmplY3QgKm9wLCB2b2lkICpjbG9zdXJlKQogewotCWlmIChvcC0+b2JfcmVmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkNlbGwgaXMgZW1wdHkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihvcC0+b2JfcmVmKTsKLQlyZXR1cm4gb3AtPm9iX3JlZjsKKyAgICBpZiAob3AtPm9iX3JlZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJDZWxsIGlzIGVtcHR5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYob3AtPm9iX3JlZik7CisgICAgcmV0dXJuIG9wLT5vYl9yZWY7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBjZWxsX2dldHNldGxpc3RbXSA9IHsKLQl7ImNlbGxfY29udGVudHMiLCAoZ2V0dGVyKWNlbGxfZ2V0X2NvbnRlbnRzLCBOVUxMfSwKLQl7TlVMTH0gLyogc2VudGluZWwgKi8KKyAgICB7ImNlbGxfY29udGVudHMiLCAoZ2V0dGVyKWNlbGxfZ2V0X2NvbnRlbnRzLCBOVUxMfSwKKyAgICB7TlVMTH0gLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUNlbGxfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJjZWxsIiwKLQlzaXplb2YoUHlDZWxsT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWNlbGxfZGVhbGxvYywgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0JMCwJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkoY21wZnVuYyljZWxsX2NvbXBhcmUsCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyljZWxsX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCSAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotIAkwLAkJCQkJLyogdHBfZG9jICovCi0gCSh0cmF2ZXJzZXByb2MpY2VsbF90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0gCShpbnF1aXJ5KWNlbGxfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLCAJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JY2VsbF9nZXRzZXRsaXN0LAkJCS8qIHRwX2dldHNldCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImNlbGwiLAorICAgIHNpemVvZihQeUNlbGxPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpY2VsbF9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYyljZWxsX2NvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpY2VsbF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpY2VsbF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSljZWxsX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgY2VsbF9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL2NsYXNzb2JqZWN0LmMgYi9PYmplY3RzL2NsYXNzb2JqZWN0LmMKaW5kZXggMDMyZDM1NC4uMDgzMjUzMSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jbGFzc29iamVjdC5jCisrKyBiL09iamVjdHMvY2xhc3NvYmplY3QuYwpAQCAtMTgsNyArMTgsNyBAQAogCiAvKiBGb3J3YXJkICovCiBzdGF0aWMgUHlPYmplY3QgKmNsYXNzX2xvb2t1cChQeUNsYXNzT2JqZWN0ICosIFB5T2JqZWN0ICosCi0JCQkgICAgICBQeUNsYXNzT2JqZWN0ICoqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q2xhc3NPYmplY3QgKiopOwogc3RhdGljIFB5T2JqZWN0ICppbnN0YW5jZV9nZXRhdHRyMShQeUluc3RhbmNlT2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIFB5T2JqZWN0ICppbnN0YW5jZV9nZXRhdHRyMihQeUluc3RhbmNlT2JqZWN0ICosIFB5T2JqZWN0ICopOwogCkBAIC0yOSwxNDAgKzI5LDE0MCBAQAogUHlDbGFzc19OZXcoUHlPYmplY3QgKmJhc2VzLCBQeU9iamVjdCAqZGljdCwgUHlPYmplY3QgKm5hbWUpCiAgICAgIC8qIGJhc2VzIGlzIE5VTEwgb3IgdHVwbGUgb2YgY2xhc3NvYmplY3RzISAqLwogewotCVB5Q2xhc3NPYmplY3QgKm9wLCAqZHVtbXk7Ci0Jc3RhdGljIFB5T2JqZWN0ICpkb2NzdHIsICptb2RzdHIsICpuYW1lc3RyOwotCWlmIChkb2NzdHIgPT0gTlVMTCkgewotCQlkb2NzdHI9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZG9jX18iKTsKLQkJaWYgKGRvY3N0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChtb2RzdHIgPT0gTlVMTCkgewotCQltb2RzdHI9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbW9kdWxlX18iKTsKLQkJaWYgKG1vZHN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuYW1lc3RyID09IE5VTEwpIHsKLQkJbmFtZXN0cj0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uYW1lX18iKTsKLQkJaWYgKG5hbWVzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAobmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhuYW1lKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJQeUNsYXNzX05ldzogbmFtZSBtdXN0IGJlIGEgc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZGljdCA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2soZGljdCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiUHlDbGFzc19OZXc6IGRpY3QgbXVzdCBiZSBhIGRpY3Rpb25hcnkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeURpY3RfR2V0SXRlbShkaWN0LCBkb2NzdHIpID09IE5VTEwpIHsKLQkJaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIGRvY3N0ciwgUHlfTm9uZSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeURpY3RfR2V0SXRlbShkaWN0LCBtb2RzdHIpID09IE5VTEwpIHsKLQkJUHlPYmplY3QgKmdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOwotCQlpZiAoZ2xvYmFscyAhPSBOVUxMKSB7Ci0JCQlQeU9iamVjdCAqbW9kbmFtZSA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIG5hbWVzdHIpOwotCQkJaWYgKG1vZG5hbWUgIT0gTlVMTCkgewotCQkJCWlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBtb2RzdHIsIG1vZG5hbWUpIDwgMCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGJhc2VzID09IE5VTEwpIHsKLQkJYmFzZXMgPSBQeVR1cGxlX05ldygwKTsKLQkJaWYgKGJhc2VzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCVB5X3NzaXplX3QgaSwgbjsKLQkJUHlPYmplY3QgKmJhc2U7Ci0JCWlmICghUHlUdXBsZV9DaGVjayhiYXNlcykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJQeUNsYXNzX05ldzogYmFzZXMgbXVzdCBiZSBhIHR1cGxlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQluID0gUHlUdXBsZV9TaXplKGJhc2VzKTsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOwotCQkJaWYgKCFQeUNsYXNzX0NoZWNrKGJhc2UpKSB7Ci0JCQkJaWYgKFB5Q2FsbGFibGVfQ2hlY2soCi0JCQkJCShQeU9iamVjdCAqKSBiYXNlLT5vYl90eXBlKSkKLQkJCQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCi0JCQkJCQkoUHlPYmplY3QgKikgYmFzZS0+b2JfdHlwZSwKLQkJCQkJCW5hbWUsIGJhc2VzLCBkaWN0LCBOVUxMKTsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiUHlDbGFzc19OZXc6IGJhc2UgbXVzdCBiZSBhIGNsYXNzIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJUHlfSU5DUkVGKGJhc2VzKTsKLQl9CisgICAgUHlDbGFzc09iamVjdCAqb3AsICpkdW1teTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmRvY3N0ciwgKm1vZHN0ciwgKm5hbWVzdHI7CisgICAgaWYgKGRvY3N0ciA9PSBOVUxMKSB7CisgICAgICAgIGRvY3N0cj0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kb2NfXyIpOworICAgICAgICBpZiAoZG9jc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG1vZHN0ciA9PSBOVUxMKSB7CisgICAgICAgIG1vZHN0cj0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19tb2R1bGVfXyIpOworICAgICAgICBpZiAobW9kc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG5hbWVzdHIgPT0gTlVMTCkgeworICAgICAgICBuYW1lc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX25hbWVfXyIpOworICAgICAgICBpZiAobmFtZXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChuYW1lID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiUHlDbGFzc19OZXc6IG5hbWUgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGRpY3QgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKGRpY3QpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiUHlDbGFzc19OZXc6IGRpY3QgbXVzdCBiZSBhIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeURpY3RfR2V0SXRlbShkaWN0LCBkb2NzdHIpID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIGRvY3N0ciwgUHlfTm9uZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeURpY3RfR2V0SXRlbShkaWN0LCBtb2RzdHIpID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOworICAgICAgICBpZiAoZ2xvYmFscyAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqbW9kbmFtZSA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIG5hbWVzdHIpOworICAgICAgICAgICAgaWYgKG1vZG5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBtb2RzdHIsIG1vZG5hbWUpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJhc2VzID09IE5VTEwpIHsKKyAgICAgICAgYmFzZXMgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgaWYgKGJhc2VzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICAgICAgUHlPYmplY3QgKmJhc2U7CisgICAgICAgIGlmICghUHlUdXBsZV9DaGVjayhiYXNlcykpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB5Q2xhc3NfTmV3OiBiYXNlcyBtdXN0IGJlIGEgdHVwbGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG4gPSBQeVR1cGxlX1NpemUoYmFzZXMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBiYXNlID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7CisgICAgICAgICAgICBpZiAoIVB5Q2xhc3NfQ2hlY2soYmFzZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlDYWxsYWJsZV9DaGVjaygKKyAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopIGJhc2UtPm9iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygKKyAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSBiYXNlLT5vYl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgYmFzZXMsIGRpY3QsIE5VTEwpOworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJQeUNsYXNzX05ldzogYmFzZSBtdXN0IGJlIGEgY2xhc3MiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoYmFzZXMpOworICAgIH0KIAotCWlmIChnZXRhdHRyc3RyID09IE5VTEwpIHsKLQkJZ2V0YXR0cnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0YXR0cl9fIik7Ci0JCWlmIChnZXRhdHRyc3RyID09IE5VTEwpCi0JCQlnb3RvIGFsbG9jX2Vycm9yOwotCQlzZXRhdHRyc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zZXRhdHRyX18iKTsKLQkJaWYgKHNldGF0dHJzdHIgPT0gTlVMTCkKLQkJCWdvdG8gYWxsb2NfZXJyb3I7Ci0JCWRlbGF0dHJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbGF0dHJfXyIpOwotCQlpZiAoZGVsYXR0cnN0ciA9PSBOVUxMKQotCQkJZ290byBhbGxvY19lcnJvcjsKLQl9CisgICAgaWYgKGdldGF0dHJzdHIgPT0gTlVMTCkgeworICAgICAgICBnZXRhdHRyc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRhdHRyX18iKTsKKyAgICAgICAgaWYgKGdldGF0dHJzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gYWxsb2NfZXJyb3I7CisgICAgICAgIHNldGF0dHJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldGF0dHJfXyIpOworICAgICAgICBpZiAoc2V0YXR0cnN0ciA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBhbGxvY19lcnJvcjsKKyAgICAgICAgZGVsYXR0cnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsYXR0cl9fIik7CisgICAgICAgIGlmIChkZWxhdHRyc3RyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGFsbG9jX2Vycm9yOworICAgIH0KIAotCW9wID0gUHlPYmplY3RfR0NfTmV3KFB5Q2xhc3NPYmplY3QsICZQeUNsYXNzX1R5cGUpOwotCWlmIChvcCA9PSBOVUxMKSB7CisgICAgb3AgPSBQeU9iamVjdF9HQ19OZXcoUHlDbGFzc09iamVjdCwgJlB5Q2xhc3NfVHlwZSk7CisgICAgaWYgKG9wID09IE5VTEwpIHsKIGFsbG9jX2Vycm9yOgotCQlQeV9ERUNSRUYoYmFzZXMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb3AtPmNsX2Jhc2VzID0gYmFzZXM7Ci0JUHlfSU5DUkVGKGRpY3QpOwotCW9wLT5jbF9kaWN0ID0gZGljdDsKLQlQeV9YSU5DUkVGKG5hbWUpOwotCW9wLT5jbF9uYW1lID0gbmFtZTsKLQlvcC0+Y2xfd2Vha3JlZmxpc3QgPSBOVUxMOworICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb3AtPmNsX2Jhc2VzID0gYmFzZXM7CisgICAgUHlfSU5DUkVGKGRpY3QpOworICAgIG9wLT5jbF9kaWN0ID0gZGljdDsKKyAgICBQeV9YSU5DUkVGKG5hbWUpOworICAgIG9wLT5jbF9uYW1lID0gbmFtZTsKKyAgICBvcC0+Y2xfd2Vha3JlZmxpc3QgPSBOVUxMOwogCi0Jb3AtPmNsX2dldGF0dHIgPSBjbGFzc19sb29rdXAob3AsIGdldGF0dHJzdHIsICZkdW1teSk7Ci0Jb3AtPmNsX3NldGF0dHIgPSBjbGFzc19sb29rdXAob3AsIHNldGF0dHJzdHIsICZkdW1teSk7Ci0Jb3AtPmNsX2RlbGF0dHIgPSBjbGFzc19sb29rdXAob3AsIGRlbGF0dHJzdHIsICZkdW1teSk7Ci0JUHlfWElOQ1JFRihvcC0+Y2xfZ2V0YXR0cik7Ci0JUHlfWElOQ1JFRihvcC0+Y2xfc2V0YXR0cik7Ci0JUHlfWElOQ1JFRihvcC0+Y2xfZGVsYXR0cik7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKG9wKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIG9wLT5jbF9nZXRhdHRyID0gY2xhc3NfbG9va3VwKG9wLCBnZXRhdHRyc3RyLCAmZHVtbXkpOworICAgIG9wLT5jbF9zZXRhdHRyID0gY2xhc3NfbG9va3VwKG9wLCBzZXRhdHRyc3RyLCAmZHVtbXkpOworICAgIG9wLT5jbF9kZWxhdHRyID0gY2xhc3NfbG9va3VwKG9wLCBkZWxhdHRyc3RyLCAmZHVtbXkpOworICAgIFB5X1hJTkNSRUYob3AtPmNsX2dldGF0dHIpOworICAgIFB5X1hJTkNSRUYob3AtPmNsX3NldGF0dHIpOworICAgIFB5X1hJTkNSRUYob3AtPmNsX2RlbGF0dHIpOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKIH0KIAogUHlPYmplY3QgKgogUHlNZXRob2RfRnVuY3Rpb24oUHlPYmplY3QgKmltKQogewotCWlmICghUHlNZXRob2RfQ2hlY2soaW0pKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlNZXRob2RPYmplY3QgKilpbSktPmltX2Z1bmM7CisgICAgaWYgKCFQeU1ldGhvZF9DaGVjayhpbSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeU1ldGhvZE9iamVjdCAqKWltKS0+aW1fZnVuYzsKIH0KIAogUHlPYmplY3QgKgogUHlNZXRob2RfU2VsZihQeU9iamVjdCAqaW0pCiB7Ci0JaWYgKCFQeU1ldGhvZF9DaGVjayhpbSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeU1ldGhvZE9iamVjdCAqKWltKS0+aW1fc2VsZjsKKyAgICBpZiAoIVB5TWV0aG9kX0NoZWNrKGltKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5TWV0aG9kT2JqZWN0ICopaW0pLT5pbV9zZWxmOwogfQogCiBQeU9iamVjdCAqCiBQeU1ldGhvZF9DbGFzcyhQeU9iamVjdCAqaW0pCiB7Ci0JaWYgKCFQeU1ldGhvZF9DaGVjayhpbSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeU1ldGhvZE9iamVjdCAqKWltKS0+aW1fY2xhc3M7CisgICAgaWYgKCFQeU1ldGhvZF9DaGVjayhpbSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeU1ldGhvZE9iamVjdCAqKWltKS0+aW1fY2xhc3M7CiB9CiAKIFB5RG9jX1NUUlZBUihjbGFzc19kb2MsCkBAIC0xNzQsMTMgKzE3NCwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNsYXNzX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqbmFtZSwgKmJhc2VzLCAqZGljdDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAiYmFzZXMiLCAiZGljdCIsIDB9OworICAgIFB5T2JqZWN0ICpuYW1lLCAqYmFzZXMsICpkaWN0OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJiYXNlcyIsICJkaWN0IiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiU09PIiwga3dsaXN0LAotCQkJCQkgJm5hbWUsICZiYXNlcywgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlDbGFzc19OZXcoYmFzZXMsIGRpY3QsIG5hbWUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJTT08iLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsICZiYXNlcywgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlDbGFzc19OZXcoYmFzZXMsIGRpY3QsIG5hbWUpOwogfQogCiAvKiBDbGFzcyBtZXRob2RzICovCkBAIC0xODgsMzE1ICsxODgsMzE1IEBACiBzdGF0aWMgdm9pZAogY2xhc3NfZGVhbGxvYyhQeUNsYXNzT2JqZWN0ICpvcCkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhvcCk7Ci0JaWYgKG9wLT5jbF93ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBvcCk7Ci0JUHlfREVDUkVGKG9wLT5jbF9iYXNlcyk7Ci0JUHlfREVDUkVGKG9wLT5jbF9kaWN0KTsKLQlQeV9YREVDUkVGKG9wLT5jbF9uYW1lKTsKLQlQeV9YREVDUkVGKG9wLT5jbF9nZXRhdHRyKTsKLQlQeV9YREVDUkVGKG9wLT5jbF9zZXRhdHRyKTsKLQlQeV9YREVDUkVGKG9wLT5jbF9kZWxhdHRyKTsKLQlQeU9iamVjdF9HQ19EZWwob3ApOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKG9wKTsKKyAgICBpZiAob3AtPmNsX3dlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIG9wKTsKKyAgICBQeV9ERUNSRUYob3AtPmNsX2Jhc2VzKTsKKyAgICBQeV9ERUNSRUYob3AtPmNsX2RpY3QpOworICAgIFB5X1hERUNSRUYob3AtPmNsX25hbWUpOworICAgIFB5X1hERUNSRUYob3AtPmNsX2dldGF0dHIpOworICAgIFB5X1hERUNSRUYob3AtPmNsX3NldGF0dHIpOworICAgIFB5X1hERUNSRUYob3AtPmNsX2RlbGF0dHIpOworICAgIFB5T2JqZWN0X0dDX0RlbChvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGFzc19sb29rdXAoUHlDbGFzc09iamVjdCAqY3AsIFB5T2JqZWN0ICpuYW1lLCBQeUNsYXNzT2JqZWN0ICoqcGNsYXNzKQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqdmFsdWUgPSBQeURpY3RfR2V0SXRlbShjcC0+Y2xfZGljdCwgbmFtZSk7Ci0JaWYgKHZhbHVlICE9IE5VTEwpIHsKLQkJKnBjbGFzcyA9IGNwOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCW4gPSBQeVR1cGxlX1NpemUoY3AtPmNsX2Jhc2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCS8qIFhYWCBXaGF0IGlmIG9uZSBvZiB0aGUgYmFzZXMgaXMgbm90IGEgY2xhc3M/ICovCi0JCVB5T2JqZWN0ICp2ID0gY2xhc3NfbG9va3VwKAotCQkJKFB5Q2xhc3NPYmplY3QgKikKLQkJCVB5VHVwbGVfR2V0SXRlbShjcC0+Y2xfYmFzZXMsIGkpLCBuYW1lLCBwY2xhc3MpOwotCQlpZiAodiAhPSBOVUxMKQotCQkJcmV0dXJuIHY7Ci0JfQotCXJldHVybiBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSBQeURpY3RfR2V0SXRlbShjcC0+Y2xfZGljdCwgbmFtZSk7CisgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgKnBjbGFzcyA9IGNwOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIG4gPSBQeVR1cGxlX1NpemUoY3AtPmNsX2Jhc2VzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIC8qIFhYWCBXaGF0IGlmIG9uZSBvZiB0aGUgYmFzZXMgaXMgbm90IGEgY2xhc3M/ICovCisgICAgICAgIFB5T2JqZWN0ICp2ID0gY2xhc3NfbG9va3VwKAorICAgICAgICAgICAgKFB5Q2xhc3NPYmplY3QgKikKKyAgICAgICAgICAgIFB5VHVwbGVfR2V0SXRlbShjcC0+Y2xfYmFzZXMsIGkpLCBuYW1lLCBwY2xhc3MpOworICAgICAgICBpZiAodiAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xhc3NfZ2V0YXR0cihyZWdpc3RlciBQeUNsYXNzT2JqZWN0ICpvcCwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKnY7Ci0JcmVnaXN0ZXIgY2hhciAqc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKLQlQeUNsYXNzT2JqZWN0ICprbGFzczsKLQlkZXNjcmdldGZ1bmMgZjsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqdjsKKyAgICByZWdpc3RlciBjaGFyICpzbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOworICAgIFB5Q2xhc3NPYmplY3QgKmtsYXNzOworICAgIGRlc2NyZ2V0ZnVuYyBmOwogCi0JaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKLQkJaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkgewotCQkJaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgImNsYXNzLl9fZGljdF9fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJUHlfSU5DUkVGKG9wLT5jbF9kaWN0KTsKLQkJCXJldHVybiBvcC0+Y2xfZGljdDsKLQkJfQotCQlpZiAoc3RyY21wKHNuYW1lLCAiX19iYXNlc19fIikgPT0gMCkgewotCQkJUHlfSU5DUkVGKG9wLT5jbF9iYXNlcyk7Ci0JCQlyZXR1cm4gb3AtPmNsX2Jhc2VzOwotCQl9Ci0JCWlmIChzdHJjbXAoc25hbWUsICJfX25hbWVfXyIpID09IDApIHsKLQkJCWlmIChvcC0+Y2xfbmFtZSA9PSBOVUxMKQotCQkJCXYgPSBQeV9Ob25lOwotCQkJZWxzZQotCQkJCXYgPSBvcC0+Y2xfbmFtZTsKLQkJCVB5X0lOQ1JFRih2KTsKLQkJCXJldHVybiB2OwotCQl9Ci0JfQotCXYgPSBjbGFzc19sb29rdXAob3AsIG5hbWUsICZrbGFzcyk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkgICAgICJjbGFzcyAlLjUwcyBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKLQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG9wLT5jbF9uYW1lKSwgc25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZiA9IFRQX0RFU0NSX0dFVCh2LT5vYl90eXBlKTsKLQlpZiAoZiA9PSBOVUxMKQotCQlQeV9JTkNSRUYodik7Ci0JZWxzZQotCQl2ID0gZih2LCAoUHlPYmplY3QgKilOVUxMLCAoUHlPYmplY3QgKilvcCk7Ci0JcmV0dXJuIHY7CisgICAgaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKKyAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkgeworICAgICAgICAgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgImNsYXNzLl9fZGljdF9fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfSU5DUkVGKG9wLT5jbF9kaWN0KTsKKyAgICAgICAgICAgIHJldHVybiBvcC0+Y2xfZGljdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKHNuYW1lLCAiX19iYXNlc19fIikgPT0gMCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKG9wLT5jbF9iYXNlcyk7CisgICAgICAgICAgICByZXR1cm4gb3AtPmNsX2Jhc2VzOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAoc25hbWUsICJfX25hbWVfXyIpID09IDApIHsKKyAgICAgICAgICAgIGlmIChvcC0+Y2xfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHYgPSBQeV9Ob25lOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYgPSBvcC0+Y2xfbmFtZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorICAgIHYgPSBjbGFzc19sb29rdXAob3AsIG5hbWUsICZrbGFzcyk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2xhc3MgJS41MHMgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcob3AtPmNsX25hbWUpLCBzbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmID0gVFBfREVTQ1JfR0VUKHYtPm9iX3R5cGUpOworICAgIGlmIChmID09IE5VTEwpCisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICBlbHNlCisgICAgICAgIHYgPSBmKHYsIChQeU9iamVjdCAqKU5VTEwsIChQeU9iamVjdCAqKW9wKTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIHZvaWQKIHNldF9zbG90KFB5T2JqZWN0ICoqc2xvdCwgUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKnRlbXAgPSAqc2xvdDsKLQlQeV9YSU5DUkVGKHYpOwotCSpzbG90ID0gdjsKLQlQeV9YREVDUkVGKHRlbXApOworICAgIFB5T2JqZWN0ICp0ZW1wID0gKnNsb3Q7CisgICAgUHlfWElOQ1JFRih2KTsKKyAgICAqc2xvdCA9IHY7CisgICAgUHlfWERFQ1JFRih0ZW1wKTsKIH0KIAogc3RhdGljIHZvaWQKIHNldF9hdHRyX3Nsb3RzKFB5Q2xhc3NPYmplY3QgKmMpCiB7Ci0JUHlDbGFzc09iamVjdCAqZHVtbXk7CisgICAgUHlDbGFzc09iamVjdCAqZHVtbXk7CiAKLQlzZXRfc2xvdCgmYy0+Y2xfZ2V0YXR0ciwgY2xhc3NfbG9va3VwKGMsIGdldGF0dHJzdHIsICZkdW1teSkpOwotCXNldF9zbG90KCZjLT5jbF9zZXRhdHRyLCBjbGFzc19sb29rdXAoYywgc2V0YXR0cnN0ciwgJmR1bW15KSk7Ci0Jc2V0X3Nsb3QoJmMtPmNsX2RlbGF0dHIsIGNsYXNzX2xvb2t1cChjLCBkZWxhdHRyc3RyLCAmZHVtbXkpKTsKKyAgICBzZXRfc2xvdCgmYy0+Y2xfZ2V0YXR0ciwgY2xhc3NfbG9va3VwKGMsIGdldGF0dHJzdHIsICZkdW1teSkpOworICAgIHNldF9zbG90KCZjLT5jbF9zZXRhdHRyLCBjbGFzc19sb29rdXAoYywgc2V0YXR0cnN0ciwgJmR1bW15KSk7CisgICAgc2V0X3Nsb3QoJmMtPmNsX2RlbGF0dHIsIGNsYXNzX2xvb2t1cChjLCBkZWxhdHRyc3RyLCAmZHVtbXkpKTsKIH0KIAogc3RhdGljIGNoYXIgKgogc2V0X2RpY3QoUHlDbGFzc09iamVjdCAqYywgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKHYgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKHYpKQotCQlyZXR1cm4gIl9fZGljdF9fIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9iamVjdCI7Ci0Jc2V0X3Nsb3QoJmMtPmNsX2RpY3QsIHYpOwotCXNldF9hdHRyX3Nsb3RzKGMpOwotCXJldHVybiAiIjsKKyAgICBpZiAodiA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2sodikpCisgICAgICAgIHJldHVybiAiX19kaWN0X18gbXVzdCBiZSBhIGRpY3Rpb25hcnkgb2JqZWN0IjsKKyAgICBzZXRfc2xvdCgmYy0+Y2xfZGljdCwgdik7CisgICAgc2V0X2F0dHJfc2xvdHMoYyk7CisgICAgcmV0dXJuICIiOwogfQogCiBzdGF0aWMgY2hhciAqCiBzZXRfYmFzZXMoUHlDbGFzc09iamVjdCAqYywgUHlPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWlmICh2ID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2sodikpCi0JCXJldHVybiAiX19iYXNlc19fIG11c3QgYmUgYSB0dXBsZSBvYmplY3QiOwotCW4gPSBQeVR1cGxlX1NpemUodik7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqeCA9IFB5VHVwbGVfR0VUX0lURU0odiwgaSk7Ci0JCWlmICghUHlDbGFzc19DaGVjayh4KSkKLQkJCXJldHVybiAiX19iYXNlc19fIGl0ZW1zIG11c3QgYmUgY2xhc3NlcyI7Ci0JCWlmIChQeUNsYXNzX0lzU3ViY2xhc3MoeCwgKFB5T2JqZWN0ICopYykpCi0JCQlyZXR1cm4gImEgX19iYXNlc19fIGl0ZW0gY2F1c2VzIGFuIGluaGVyaXRhbmNlIGN5Y2xlIjsKLQl9Ci0Jc2V0X3Nsb3QoJmMtPmNsX2Jhc2VzLCB2KTsKLQlzZXRfYXR0cl9zbG90cyhjKTsKLQlyZXR1cm4gIiI7CisgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayh2KSkKKyAgICAgICAgcmV0dXJuICJfX2Jhc2VzX18gbXVzdCBiZSBhIHR1cGxlIG9iamVjdCI7CisgICAgbiA9IFB5VHVwbGVfU2l6ZSh2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp4ID0gUHlUdXBsZV9HRVRfSVRFTSh2LCBpKTsKKyAgICAgICAgaWYgKCFQeUNsYXNzX0NoZWNrKHgpKQorICAgICAgICAgICAgcmV0dXJuICJfX2Jhc2VzX18gaXRlbXMgbXVzdCBiZSBjbGFzc2VzIjsKKyAgICAgICAgaWYgKFB5Q2xhc3NfSXNTdWJjbGFzcyh4LCAoUHlPYmplY3QgKiljKSkKKyAgICAgICAgICAgIHJldHVybiAiYSBfX2Jhc2VzX18gaXRlbSBjYXVzZXMgYW4gaW5oZXJpdGFuY2UgY3ljbGUiOworICAgIH0KKyAgICBzZXRfc2xvdCgmYy0+Y2xfYmFzZXMsIHYpOworICAgIHNldF9hdHRyX3Nsb3RzKGMpOworICAgIHJldHVybiAiIjsKIH0KIAogc3RhdGljIGNoYXIgKgogc2V0X25hbWUoUHlDbGFzc09iamVjdCAqYywgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKHYgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sodikpCi0JCXJldHVybiAiX19uYW1lX18gbXVzdCBiZSBhIHN0cmluZyBvYmplY3QiOwotCWlmIChzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHYpKSAhPSAoc2l6ZV90KVB5U3RyaW5nX0dFVF9TSVpFKHYpKQotCQlyZXR1cm4gIl9fbmFtZV9fIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyI7Ci0Jc2V0X3Nsb3QoJmMtPmNsX25hbWUsIHYpOwotCXJldHVybiAiIjsKKyAgICBpZiAodiA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayh2KSkKKyAgICAgICAgcmV0dXJuICJfX25hbWVfXyBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdCI7CisgICAgaWYgKHN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcodikpICE9IChzaXplX3QpUHlTdHJpbmdfR0VUX1NJWkUodikpCisgICAgICAgIHJldHVybiAiX19uYW1lX18gbXVzdCBub3QgY29udGFpbiBudWxsIGJ5dGVzIjsKKyAgICBzZXRfc2xvdCgmYy0+Y2xfbmFtZSwgdik7CisgICAgcmV0dXJuICIiOwogfQogCiBzdGF0aWMgaW50CiBjbGFzc19zZXRhdHRyKFB5Q2xhc3NPYmplY3QgKm9wLCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0JY2hhciAqc25hbWU7Ci0JaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJjbGFzc2VzIGFyZSByZWFkLW9ubHkgaW4gcmVzdHJpY3RlZCBtb2RlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKLQlpZiAoc25hbWVbMF0gPT0gJ18nICYmIHNuYW1lWzFdID09ICdfJykgewotCQlQeV9zc2l6ZV90IG4gPSBQeVN0cmluZ19TaXplKG5hbWUpOwotCQlpZiAoc25hbWVbbi0xXSA9PSAnXycgJiYgc25hbWVbbi0yXSA9PSAnXycpIHsKLQkJCWNoYXIgKmVyciA9IE5VTEw7Ci0JCQlpZiAoc3RyY21wKHNuYW1lLCAiX19kaWN0X18iKSA9PSAwKQotCQkJCWVyciA9IHNldF9kaWN0KG9wLCB2KTsKLQkJCWVsc2UgaWYgKHN0cmNtcChzbmFtZSwgIl9fYmFzZXNfXyIpID09IDApCi0JCQkJZXJyID0gc2V0X2Jhc2VzKG9wLCB2KTsKLQkJCWVsc2UgaWYgKHN0cmNtcChzbmFtZSwgIl9fbmFtZV9fIikgPT0gMCkKLQkJCQllcnIgPSBzZXRfbmFtZShvcCwgdik7Ci0JCQllbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX2dldGF0dHJfXyIpID09IDApCi0JCQkJc2V0X3Nsb3QoJm9wLT5jbF9nZXRhdHRyLCB2KTsKLQkJCWVsc2UgaWYgKHN0cmNtcChzbmFtZSwgIl9fc2V0YXR0cl9fIikgPT0gMCkKLQkJCQlzZXRfc2xvdCgmb3AtPmNsX3NldGF0dHIsIHYpOwotCQkJZWxzZSBpZiAoc3RyY21wKHNuYW1lLCAiX19kZWxhdHRyX18iKSA9PSAwKQotCQkJCXNldF9zbG90KCZvcC0+Y2xfZGVsYXR0ciwgdik7Ci0JCQkvKiBGb3IgdGhlIGxhc3QgdGhyZWUsIHdlIGZhbGwgdGhyb3VnaCB0byB1cGRhdGUgdGhlCi0JCQkgICBkaWN0aW9uYXJ5IGFzIHdlbGwuICovCi0JCQlpZiAoZXJyICE9IE5VTEwpIHsKLQkJCQlpZiAoKmVyciA9PSAnXDAnKQotCQkJCQlyZXR1cm4gMDsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBlcnIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCX0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCWludCBydiA9IFB5RGljdF9EZWxJdGVtKG9wLT5jbF9kaWN0LCBuYW1lKTsKLQkJaWYgKHJ2IDwgMCkKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkgICAgICJjbGFzcyAlLjUwcyBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKLQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhvcC0+Y2xfbmFtZSksIHNuYW1lKTsKLQkJcmV0dXJuIHJ2OwotCX0KLQllbHNlCi0JCXJldHVybiBQeURpY3RfU2V0SXRlbShvcC0+Y2xfZGljdCwgbmFtZSwgdik7CisgICAgY2hhciAqc25hbWU7CisgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiY2xhc3NlcyBhcmUgcmVhZC1vbmx5IGluIHJlc3RyaWN0ZWQgbW9kZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7CisgICAgaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKKyAgICAgICAgUHlfc3NpemVfdCBuID0gUHlTdHJpbmdfU2l6ZShuYW1lKTsKKyAgICAgICAgaWYgKHNuYW1lW24tMV0gPT0gJ18nICYmIHNuYW1lW24tMl0gPT0gJ18nKSB7CisgICAgICAgICAgICBjaGFyICplcnIgPSBOVUxMOworICAgICAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkKKyAgICAgICAgICAgICAgICBlcnIgPSBzZXRfZGljdChvcCwgdik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX2Jhc2VzX18iKSA9PSAwKQorICAgICAgICAgICAgICAgIGVyciA9IHNldF9iYXNlcyhvcCwgdik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX25hbWVfXyIpID09IDApCisgICAgICAgICAgICAgICAgZXJyID0gc2V0X25hbWUob3AsIHYpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKHNuYW1lLCAiX19nZXRhdHRyX18iKSA9PSAwKQorICAgICAgICAgICAgICAgIHNldF9zbG90KCZvcC0+Y2xfZ2V0YXR0ciwgdik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX3NldGF0dHJfXyIpID09IDApCisgICAgICAgICAgICAgICAgc2V0X3Nsb3QoJm9wLT5jbF9zZXRhdHRyLCB2KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChzbmFtZSwgIl9fZGVsYXR0cl9fIikgPT0gMCkKKyAgICAgICAgICAgICAgICBzZXRfc2xvdCgmb3AtPmNsX2RlbGF0dHIsIHYpOworICAgICAgICAgICAgLyogRm9yIHRoZSBsYXN0IHRocmVlLCB3ZSBmYWxsIHRocm91Z2ggdG8gdXBkYXRlIHRoZQorICAgICAgICAgICAgICAgZGljdGlvbmFyeSBhcyB3ZWxsLiAqLworICAgICAgICAgICAgaWYgKGVyciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKCplcnIgPT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBpbnQgcnYgPSBQeURpY3RfRGVsSXRlbShvcC0+Y2xfZGljdCwgbmFtZSk7CisgICAgICAgIGlmIChydiA8IDApCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzICUuNTBzIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhvcC0+Y2xfbmFtZSksIHNuYW1lKTsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeURpY3RfU2V0SXRlbShvcC0+Y2xfZGljdCwgbmFtZSwgdik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGFzc19yZXByKFB5Q2xhc3NPYmplY3QgKm9wKQogewotCVB5T2JqZWN0ICptb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhvcC0+Y2xfZGljdCwgIl9fbW9kdWxlX18iKTsKLQljaGFyICpuYW1lOwotCWlmIChvcC0+Y2xfbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhvcC0+Y2xfbmFtZSkpCi0JCW5hbWUgPSAiPyI7Ci0JZWxzZQotCQluYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcob3AtPmNsX25hbWUpOwotCWlmIChtb2QgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobW9kKSkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxjbGFzcyA/LiVzIGF0ICVwPiIsIG5hbWUsIG9wKTsKLQllbHNlCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Y2xhc3MgJXMuJXMgYXQgJXA+IiwKLQkJCQkJICAgUHlTdHJpbmdfQXNTdHJpbmcobW9kKSwKLQkJCQkJICAgbmFtZSwgb3ApOworICAgIFB5T2JqZWN0ICptb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhvcC0+Y2xfZGljdCwgIl9fbW9kdWxlX18iKTsKKyAgICBjaGFyICpuYW1lOworICAgIGlmIChvcC0+Y2xfbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhvcC0+Y2xfbmFtZSkpCisgICAgICAgIG5hbWUgPSAiPyI7CisgICAgZWxzZQorICAgICAgICBuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcob3AtPmNsX25hbWUpOworICAgIGlmIChtb2QgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobW9kKSkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxjbGFzcyA/LiVzIGF0ICVwPiIsIG5hbWUsIG9wKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Y2xhc3MgJXMuJXMgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcobW9kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgb3ApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xhc3Nfc3RyKFB5Q2xhc3NPYmplY3QgKm9wKQogewotCVB5T2JqZWN0ICptb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhvcC0+Y2xfZGljdCwgIl9fbW9kdWxlX18iKTsKLQlQeU9iamVjdCAqbmFtZSA9IG9wLT5jbF9uYW1lOwotCVB5T2JqZWN0ICpyZXM7Ci0JUHlfc3NpemVfdCBtLCBuOworICAgIFB5T2JqZWN0ICptb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhvcC0+Y2xfZGljdCwgIl9fbW9kdWxlX18iKTsKKyAgICBQeU9iamVjdCAqbmFtZSA9IG9wLT5jbF9uYW1lOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgUHlfc3NpemVfdCBtLCBuOwogCi0JaWYgKG5hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobmFtZSkpCi0JCXJldHVybiBjbGFzc19yZXByKG9wKTsKLQlpZiAobW9kID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG1vZCkpIHsKLQkJUHlfSU5DUkVGKG5hbWUpOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JbSA9IFB5U3RyaW5nX0dFVF9TSVpFKG1vZCk7Ci0JbiA9IFB5U3RyaW5nX0dFVF9TSVpFKG5hbWUpOwotCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbSsxK24pOwotCWlmIChyZXMgIT0gTlVMTCkgewotCQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlcyk7Ci0JCW1lbWNweShzLCBQeVN0cmluZ19BU19TVFJJTkcobW9kKSwgbSk7Ci0JCXMgKz0gbTsKLQkJKnMrKyA9ICcuJzsKLQkJbWVtY3B5KHMsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgbik7Ci0JfQotCXJldHVybiByZXM7CisgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobmFtZSkpCisgICAgICAgIHJldHVybiBjbGFzc19yZXByKG9wKTsKKyAgICBpZiAobW9kID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG1vZCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKG5hbWUpOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisgICAgbSA9IFB5U3RyaW5nX0dFVF9TSVpFKG1vZCk7CisgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKG5hbWUpOworICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbSsxK24pOworICAgIGlmIChyZXMgIT0gTlVMTCkgeworICAgICAgICBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlcyk7CisgICAgICAgIG1lbWNweShzLCBQeVN0cmluZ19BU19TVFJJTkcobW9kKSwgbSk7CisgICAgICAgIHMgKz0gbTsKKyAgICAgICAgKnMrKyA9ICcuJzsKKyAgICAgICAgbWVtY3B5KHMsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgbik7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIGNsYXNzX3RyYXZlcnNlKFB5Q2xhc3NPYmplY3QgKm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKG8tPmNsX2Jhc2VzKTsKLQlQeV9WSVNJVChvLT5jbF9kaWN0KTsKLQlQeV9WSVNJVChvLT5jbF9uYW1lKTsKLQlQeV9WSVNJVChvLT5jbF9nZXRhdHRyKTsKLQlQeV9WSVNJVChvLT5jbF9zZXRhdHRyKTsKLQlQeV9WSVNJVChvLT5jbF9kZWxhdHRyKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChvLT5jbF9iYXNlcyk7CisgICAgUHlfVklTSVQoby0+Y2xfZGljdCk7CisgICAgUHlfVklTSVQoby0+Y2xfbmFtZSk7CisgICAgUHlfVklTSVQoby0+Y2xfZ2V0YXR0cik7CisgICAgUHlfVklTSVQoby0+Y2xfc2V0YXR0cik7CisgICAgUHlfVklTSVQoby0+Y2xfZGVsYXR0cik7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5VHlwZU9iamVjdCBQeUNsYXNzX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAotCSJjbGFzc29iaiIsCi0Jc2l6ZW9mKFB5Q2xhc3NPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpY2xhc3NfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpY2xhc3NfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQlQeUluc3RhbmNlX05ldywJCQkJLyogdHBfY2FsbCAqLwotCShyZXByZnVuYyljbGFzc19zdHIsCQkJLyogdHBfc3RyICovCi0JKGdldGF0dHJvZnVuYyljbGFzc19nZXRhdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkoc2V0YXR0cm9mdW5jKWNsYXNzX3NldGF0dHIsCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQljbGFzc19kb2MsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY2xhc3NfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihQeUNsYXNzT2JqZWN0LCBjbF93ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQljbGFzc19uZXcsCQkJCS8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwKKyAgICAiY2xhc3NvYmoiLAorICAgIHNpemVvZihQeUNsYXNzT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWNsYXNzX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpY2xhc3NfcmVwciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICBQeUluc3RhbmNlX05ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpY2xhc3Nfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIChnZXRhdHRyb2Z1bmMpY2xhc3NfZ2V0YXR0ciwgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAoc2V0YXR0cm9mdW5jKWNsYXNzX3NldGF0dHIsICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICBjbGFzc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpY2xhc3NfdHJhdmVyc2UsICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKFB5Q2xhc3NPYmplY3QsIGNsX3dlYWtyZWZsaXN0KSwgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNsYXNzX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiBpbnQKIFB5Q2xhc3NfSXNTdWJjbGFzcyhQeU9iamVjdCAqa2xhc3MsIFB5T2JqZWN0ICpiYXNlKQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlQeUNsYXNzT2JqZWN0ICpjcDsKLQlpZiAoa2xhc3MgPT0gYmFzZSkKLQkJcmV0dXJuIDE7Ci0JaWYgKFB5VHVwbGVfQ2hlY2soYmFzZSkpIHsKLQkJbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWlmIChQeUNsYXNzX0lzU3ViY2xhc3Moa2xhc3MsIFB5VHVwbGVfR0VUX0lURU0oYmFzZSwgaSkpKQotCQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoa2xhc3MgPT0gTlVMTCB8fCAhUHlDbGFzc19DaGVjayhrbGFzcykpCi0JCXJldHVybiAwOwotCWNwID0gKFB5Q2xhc3NPYmplY3QgKilrbGFzczsKLQluID0gUHlUdXBsZV9TaXplKGNwLT5jbF9iYXNlcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpZiAoUHlDbGFzc19Jc1N1YmNsYXNzKFB5VHVwbGVfR2V0SXRlbShjcC0+Y2xfYmFzZXMsIGkpLCBiYXNlKSkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlDbGFzc09iamVjdCAqY3A7CisgICAgaWYgKGtsYXNzID09IGJhc2UpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChQeVR1cGxlX0NoZWNrKGJhc2UpKSB7CisgICAgICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2UpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoUHlDbGFzc19Jc1N1YmNsYXNzKGtsYXNzLCBQeVR1cGxlX0dFVF9JVEVNKGJhc2UsIGkpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGtsYXNzID09IE5VTEwgfHwgIVB5Q2xhc3NfQ2hlY2soa2xhc3MpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBjcCA9IChQeUNsYXNzT2JqZWN0ICopa2xhc3M7CisgICAgbiA9IFB5VHVwbGVfU2l6ZShjcC0+Y2xfYmFzZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKFB5Q2xhc3NfSXNTdWJjbGFzcyhQeVR1cGxlX0dldEl0ZW0oY3AtPmNsX2Jhc2VzLCBpKSwgYmFzZSkpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtNTA1LDg2ICs1MDUsODYgQEAKIFB5T2JqZWN0ICoKIFB5SW5zdGFuY2VfTmV3UmF3KFB5T2JqZWN0ICprbGFzcywgUHlPYmplY3QgKmRpY3QpCiB7Ci0JUHlJbnN0YW5jZU9iamVjdCAqaW5zdDsKKyAgICBQeUluc3RhbmNlT2JqZWN0ICppbnN0OwogCi0JaWYgKCFQeUNsYXNzX0NoZWNrKGtsYXNzKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJZGljdCA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJaWYgKCFQeURpY3RfQ2hlY2soZGljdCkpIHsKLQkJCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfSU5DUkVGKGRpY3QpOwotCX0KLQlpbnN0ID0gUHlPYmplY3RfR0NfTmV3KFB5SW5zdGFuY2VPYmplY3QsICZQeUluc3RhbmNlX1R5cGUpOwotCWlmIChpbnN0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGRpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaW5zdC0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOwotCVB5X0lOQ1JFRihrbGFzcyk7Ci0JaW5zdC0+aW5fY2xhc3MgPSAoUHlDbGFzc09iamVjdCAqKWtsYXNzOwotCWluc3QtPmluX2RpY3QgPSBkaWN0OwotCV9QeU9iamVjdF9HQ19UUkFDSyhpbnN0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaW5zdDsKKyAgICBpZiAoIVB5Q2xhc3NfQ2hlY2soa2xhc3MpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBkaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5RGljdF9DaGVjayhkaWN0KSkgeworICAgICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgfQorICAgIGluc3QgPSBQeU9iamVjdF9HQ19OZXcoUHlJbnN0YW5jZU9iamVjdCwgJlB5SW5zdGFuY2VfVHlwZSk7CisgICAgaWYgKGluc3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpbnN0LT5pbl93ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgUHlfSU5DUkVGKGtsYXNzKTsKKyAgICBpbnN0LT5pbl9jbGFzcyA9IChQeUNsYXNzT2JqZWN0ICopa2xhc3M7CisgICAgaW5zdC0+aW5fZGljdCA9IGRpY3Q7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGluc3QpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpbnN0OwogfQogCiBQeU9iamVjdCAqCiBQeUluc3RhbmNlX05ldyhQeU9iamVjdCAqa2xhc3MsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKIHsKLQlyZWdpc3RlciBQeUluc3RhbmNlT2JqZWN0ICppbnN0OwotCVB5T2JqZWN0ICppbml0OwotCXN0YXRpYyBQeU9iamVjdCAqaW5pdHN0cjsKKyAgICByZWdpc3RlciBQeUluc3RhbmNlT2JqZWN0ICppbnN0OworICAgIFB5T2JqZWN0ICppbml0OworICAgIHN0YXRpYyBQeU9iamVjdCAqaW5pdHN0cjsKIAotCWlmIChpbml0c3RyID09IE5VTEwpIHsKLQkJaW5pdHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faW5pdF9fIik7Ci0JCWlmIChpbml0c3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaW5zdCA9IChQeUluc3RhbmNlT2JqZWN0ICopIFB5SW5zdGFuY2VfTmV3UmF3KGtsYXNzLCBOVUxMKTsKLQlpZiAoaW5zdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpbml0ID0gaW5zdGFuY2VfZ2V0YXR0cjIoaW5zdCwgaW5pdHN0cik7Ci0JaWYgKGluaXQgPT0gTlVMTCkgewotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlfREVDUkVGKGluc3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKChhcmcgIT0gTlVMTCAmJiAoIVB5VHVwbGVfQ2hlY2soYXJnKSB8fAotCQkJCSAgICAgUHlUdXBsZV9TaXplKGFyZykgIT0gMCkpCi0JCSAgICB8fCAoa3cgIT0gTlVMTCAmJiAoIVB5RGljdF9DaGVjayhrdykgfHwKLQkJCQkgICAgICBQeURpY3RfU2l6ZShrdykgIT0gMCkpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICJ0aGlzIGNvbnN0cnVjdG9yIHRha2VzIG5vIGFyZ3VtZW50cyIpOwotCQkJUHlfREVDUkVGKGluc3QpOwotCQkJaW5zdCA9IE5VTEw7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3Jkcyhpbml0LCBhcmcsIGt3KTsKLQkJUHlfREVDUkVGKGluaXQpOwotCQlpZiAocmVzID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihpbnN0KTsKLQkJCWluc3QgPSBOVUxMOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHJlcyAhPSBQeV9Ob25lKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICAgIl9faW5pdF9fKCkgc2hvdWxkIHJldHVybiBOb25lIik7Ci0JCQkJUHlfREVDUkVGKGluc3QpOwotCQkJCWluc3QgPSBOVUxMOwotCQkJfQotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKWluc3Q7CisgICAgaWYgKGluaXRzdHIgPT0gTlVMTCkgeworICAgICAgICBpbml0c3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbml0X18iKTsKKyAgICAgICAgaWYgKGluaXRzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpbnN0ID0gKFB5SW5zdGFuY2VPYmplY3QgKikgUHlJbnN0YW5jZV9OZXdSYXcoa2xhc3MsIE5VTEwpOworICAgIGlmIChpbnN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGluaXQgPSBpbnN0YW5jZV9nZXRhdHRyMihpbnN0LCBpbml0c3RyKTsKKyAgICBpZiAoaW5pdCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW5zdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFyZyAhPSBOVUxMICYmICghUHlUdXBsZV9DaGVjayhhcmcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2l6ZShhcmcpICE9IDApKQorICAgICAgICAgICAgfHwgKGt3ICE9IE5VTEwgJiYgKCFQeURpY3RfQ2hlY2soa3cpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeURpY3RfU2l6ZShrdykgIT0gMCkpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBjb25zdHJ1Y3RvciB0YWtlcyBubyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbnN0KTsKKyAgICAgICAgICAgIGluc3QgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqcmVzID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoaW5pdCwgYXJnLCBrdyk7CisgICAgICAgIFB5X0RFQ1JFRihpbml0KTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW5zdCk7CisgICAgICAgICAgICBpbnN0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19pbml0X18oKSBzaG91bGQgcmV0dXJuIE5vbmUiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW5zdCk7CisgICAgICAgICAgICAgICAgaW5zdCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaW5zdDsKIH0KIAogLyogSW5zdGFuY2UgbWV0aG9kcyAqLwpAQCAtNTk5LDE3NCArNTk5LDE3NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX25ldyhQeVR5cGVPYmplY3QqIHR5cGUsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmtsYXNzOwotCVB5T2JqZWN0ICpkaWN0ID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqa2xhc3M7CisgICAgUHlPYmplY3QgKmRpY3QgPSBQeV9Ob25lOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOmluc3RhbmNlIiwKLQkJCSAgICAgICZQeUNsYXNzX1R5cGUsICZrbGFzcywgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86aW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlDbGFzc19UeXBlLCAma2xhc3MsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZGljdCA9PSBQeV9Ob25lKQotCQlkaWN0ID0gTlVMTDsKLQllbHNlIGlmICghUHlEaWN0X0NoZWNrKGRpY3QpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgICJpbnN0YW5jZSgpIHNlY29uZCBhcmcgbXVzdCBiZSBkaWN0aW9uYXJ5IG9yIE5vbmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUluc3RhbmNlX05ld1JhdyhrbGFzcywgZGljdCk7CisgICAgaWYgKGRpY3QgPT0gUHlfTm9uZSkKKyAgICAgICAgZGljdCA9IE5VTEw7CisgICAgZWxzZSBpZiAoIVB5RGljdF9DaGVjayhkaWN0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAiaW5zdGFuY2UoKSBzZWNvbmQgYXJnIG11c3QgYmUgZGljdGlvbmFyeSBvciBOb25lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnN0YW5jZV9OZXdSYXcoa2xhc3MsIGRpY3QpOwogfQogCiAKIHN0YXRpYyB2b2lkCiBpbnN0YW5jZV9kZWFsbG9jKHJlZ2lzdGVyIFB5SW5zdGFuY2VPYmplY3QgKmluc3QpCiB7Ci0JUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKLQlQeU9iamVjdCAqZGVsOwotCXN0YXRpYyBQeU9iamVjdCAqZGVsc3RyOworICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisgICAgUHlPYmplY3QgKmRlbDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmRlbHN0cjsKIAotCV9QeU9iamVjdF9HQ19VTlRSQUNLKGluc3QpOwotCWlmIChpbnN0LT5pbl93ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBpbnN0KTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhpbnN0KTsKKyAgICBpZiAoaW5zdC0+aW5fd2Vha3JlZmxpc3QgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgaW5zdCk7CiAKLQkvKiBUZW1wb3JhcmlseSByZXN1cnJlY3QgdGhlIG9iamVjdC4gKi8KLQlhc3NlcnQoaW5zdC0+b2JfdHlwZSA9PSAmUHlJbnN0YW5jZV9UeXBlKTsKLQlhc3NlcnQoaW5zdC0+b2JfcmVmY250ID09IDApOwotCWluc3QtPm9iX3JlZmNudCA9IDE7CisgICAgLyogVGVtcG9yYXJpbHkgcmVzdXJyZWN0IHRoZSBvYmplY3QuICovCisgICAgYXNzZXJ0KGluc3QtPm9iX3R5cGUgPT0gJlB5SW5zdGFuY2VfVHlwZSk7CisgICAgYXNzZXJ0KGluc3QtPm9iX3JlZmNudCA9PSAwKTsKKyAgICBpbnN0LT5vYl9yZWZjbnQgPSAxOwogCi0JLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KLQlQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKLQkvKiBFeGVjdXRlIF9fZGVsX18gbWV0aG9kLCBpZiBhbnkuICovCi0JaWYgKGRlbHN0ciA9PSBOVUxMKSB7Ci0JCWRlbHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsX18iKTsKLQkJaWYgKGRlbHN0ciA9PSBOVUxMKQotCQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKChQeU9iamVjdCopaW5zdCk7Ci0JfQotCWlmIChkZWxzdHIgJiYgKGRlbCA9IGluc3RhbmNlX2dldGF0dHIyKGluc3QsIGRlbHN0cikpICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGRlbCwgKFB5T2JqZWN0ICopTlVMTCk7Ci0JCWlmIChyZXMgPT0gTlVMTCkKLQkJCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShkZWwpOwotCQllbHNlCi0JCQlQeV9ERUNSRUYocmVzKTsKLQkJUHlfREVDUkVGKGRlbCk7Ci0JfQotCS8qIFJlc3RvcmUgdGhlIHNhdmVkIGV4Y2VwdGlvbi4gKi8KLQlQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOworICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgZXhjZXB0aW9uLCBpZiBhbnkuICovCisgICAgUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisgICAgLyogRXhlY3V0ZSBfX2RlbF9fIG1ldGhvZCwgaWYgYW55LiAqLworICAgIGlmIChkZWxzdHIgPT0gTlVMTCkgeworICAgICAgICBkZWxzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbF9fIik7CisgICAgICAgIGlmIChkZWxzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QqKWluc3QpOworICAgIH0KKyAgICBpZiAoZGVsc3RyICYmIChkZWwgPSBpbnN0YW5jZV9nZXRhdHRyMihpbnN0LCBkZWxzdHIpKSAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChkZWwsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoZGVsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIFB5X0RFQ1JFRihkZWwpOworICAgIH0KKyAgICAvKiBSZXN0b3JlIHRoZSBzYXZlZCBleGNlcHRpb24uICovCisgICAgUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKIAotCS8qIFVuZG8gdGhlIHRlbXBvcmFyeSByZXN1cnJlY3Rpb247IGNhbid0IHVzZSBERUNSRUYgaGVyZSwgaXQgd291bGQKLQkgKiBjYXVzZSBhIHJlY3Vyc2l2ZSBjYWxsLgotCSAqLwotCWFzc2VydChpbnN0LT5vYl9yZWZjbnQgPiAwKTsKLQlpZiAoLS1pbnN0LT5vYl9yZWZjbnQgPT0gMCkgeworICAgIC8qIFVuZG8gdGhlIHRlbXBvcmFyeSByZXN1cnJlY3Rpb247IGNhbid0IHVzZSBERUNSRUYgaGVyZSwgaXQgd291bGQKKyAgICAgKiBjYXVzZSBhIHJlY3Vyc2l2ZSBjYWxsLgorICAgICAqLworICAgIGFzc2VydChpbnN0LT5vYl9yZWZjbnQgPiAwKTsKKyAgICBpZiAoLS1pbnN0LT5vYl9yZWZjbnQgPT0gMCkgewogCi0JCS8qIE5ldyB3ZWFrcmVmcyBjb3VsZCBiZSBjcmVhdGVkIGR1cmluZyB0aGUgZmluYWxpemVyIGNhbGwuCi0JCSAgICBJZiB0aGlzIG9jY3VycywgY2xlYXIgdGhlbSBvdXQgd2l0aG91dCBjYWxsaW5nIHRoZWlyCi0JCSAgICBmaW5hbGl6ZXJzIHNpbmNlIHRoZXkgbWlnaHQgcmVseSBvbiBwYXJ0IG9mIHRoZSBvYmplY3QKLQkJICAgIGJlaW5nIGZpbmFsaXplZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLiAqLwotCQl3aGlsZSAoaW5zdC0+aW5fd2Vha3JlZmxpc3QgIT0gTlVMTCkgewotCQkJX1B5V2Vha3JlZl9DbGVhclJlZigoUHlXZWFrUmVmZXJlbmNlICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0LT5pbl93ZWFrcmVmbGlzdCkpOwotCQl9CisgICAgICAgIC8qIE5ldyB3ZWFrcmVmcyBjb3VsZCBiZSBjcmVhdGVkIGR1cmluZyB0aGUgZmluYWxpemVyIGNhbGwuCisgICAgICAgICAgICBJZiB0aGlzIG9jY3VycywgY2xlYXIgdGhlbSBvdXQgd2l0aG91dCBjYWxsaW5nIHRoZWlyCisgICAgICAgICAgICBmaW5hbGl6ZXJzIHNpbmNlIHRoZXkgbWlnaHQgcmVseSBvbiBwYXJ0IG9mIHRoZSBvYmplY3QKKyAgICAgICAgICAgIGJlaW5nIGZpbmFsaXplZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLiAqLworICAgICAgICB3aGlsZSAoaW5zdC0+aW5fd2Vha3JlZmxpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgX1B5V2Vha3JlZl9DbGVhclJlZigoUHlXZWFrUmVmZXJlbmNlICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0LT5pbl93ZWFrcmVmbGlzdCkpOworICAgICAgICB9CiAKLQkJUHlfREVDUkVGKGluc3QtPmluX2NsYXNzKTsKLQkJUHlfWERFQ1JFRihpbnN0LT5pbl9kaWN0KTsKLQkJUHlPYmplY3RfR0NfRGVsKGluc3QpOwotCX0KLQllbHNlIHsKLQkJUHlfc3NpemVfdCByZWZjbnQgPSBpbnN0LT5vYl9yZWZjbnQ7Ci0JCS8qIF9fZGVsX18gcmVzdXJyZWN0ZWQgaXQhICBNYWtlIGl0IGxvb2sgbGlrZSB0aGUgb3JpZ2luYWwKLQkJICogUHlfREVDUkVGIG5ldmVyIGhhcHBlbmVkLgotCQkgKi8KLQkJX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilpbnN0KTsKLQkJaW5zdC0+b2JfcmVmY250ID0gcmVmY250OwotCQlfUHlPYmplY3RfR0NfVFJBQ0soaW5zdCk7Ci0JCS8qIElmIFB5X1JFRl9ERUJVRywgX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgX1B5X1JlZlRvdGFsLCBzbwotCQkgKiB3ZSBuZWVkIHRvIHVuZG8gdGhhdC4gKi8KLQkJX1B5X0RFQ19SRUZUT1RBTDsKLQkJLyogSWYgUHlfVFJBQ0VfUkVGUywgX1B5X05ld1JlZmVyZW5jZSByZS1hZGRlZCBzZWxmIHRvIHRoZQotCQkgKiBvYmplY3QgY2hhaW4sIHNvIG5vIG1vcmUgdG8gZG8gdGhlcmUuCi0JCSAqIElmIENPVU5UX0FMTE9DUywgdGhlIG9yaWdpbmFsIGRlY3JlZiBidW1wZWQgdHBfZnJlZXMsIGFuZAotCQkgKiBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCB0cF9hbGxvY3M6IGJvdGggb2YgdGhvc2UgbmVlZCB0byBiZQotCQkgKiB1bmRvbmUuCi0JCSAqLworICAgICAgICBQeV9ERUNSRUYoaW5zdC0+aW5fY2xhc3MpOworICAgICAgICBQeV9YREVDUkVGKGluc3QtPmluX2RpY3QpOworICAgICAgICBQeU9iamVjdF9HQ19EZWwoaW5zdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9zc2l6ZV90IHJlZmNudCA9IGluc3QtPm9iX3JlZmNudDsKKyAgICAgICAgLyogX19kZWxfXyByZXN1cnJlY3RlZCBpdCEgIE1ha2UgaXQgbG9vayBsaWtlIHRoZSBvcmlnaW5hbAorICAgICAgICAgKiBQeV9ERUNSRUYgbmV2ZXIgaGFwcGVuZWQuCisgICAgICAgICAqLworICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKWluc3QpOworICAgICAgICBpbnN0LT5vYl9yZWZjbnQgPSByZWZjbnQ7CisgICAgICAgIF9QeU9iamVjdF9HQ19UUkFDSyhpbnN0KTsKKyAgICAgICAgLyogSWYgUHlfUkVGX0RFQlVHLCBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCBfUHlfUmVmVG90YWwsIHNvCisgICAgICAgICAqIHdlIG5lZWQgdG8gdW5kbyB0aGF0LiAqLworICAgICAgICBfUHlfREVDX1JFRlRPVEFMOworICAgICAgICAvKiBJZiBQeV9UUkFDRV9SRUZTLCBfUHlfTmV3UmVmZXJlbmNlIHJlLWFkZGVkIHNlbGYgdG8gdGhlCisgICAgICAgICAqIG9iamVjdCBjaGFpbiwgc28gbm8gbW9yZSB0byBkbyB0aGVyZS4KKyAgICAgICAgICogSWYgQ09VTlRfQUxMT0NTLCB0aGUgb3JpZ2luYWwgZGVjcmVmIGJ1bXBlZCB0cF9mcmVlcywgYW5kCisgICAgICAgICAqIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIHRwX2FsbG9jczogYm90aCBvZiB0aG9zZSBuZWVkIHRvIGJlCisgICAgICAgICAqIHVuZG9uZS4KKyAgICAgICAgICovCiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JCS0taW5zdC0+b2JfdHlwZS0+dHBfZnJlZXM7Ci0JCS0taW5zdC0+b2JfdHlwZS0+dHBfYWxsb2NzOworICAgICAgICAtLWluc3QtPm9iX3R5cGUtPnRwX2ZyZWVzOworICAgICAgICAtLWluc3QtPm9iX3R5cGUtPnRwX2FsbG9jczsKICNlbmRpZgotCX0KKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9nZXRhdHRyMShyZWdpc3RlciBQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeU9iamVjdCAqbmFtZSkKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqdjsKLQlyZWdpc3RlciBjaGFyICpzbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOwotCWlmIChzbmFtZVswXSA9PSAnXycgJiYgc25hbWVbMV0gPT0gJ18nKSB7Ci0JCWlmIChzdHJjbXAoc25hbWUsICJfX2RpY3RfXyIpID09IDApIHsKLQkJCWlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJpbnN0YW5jZS5fX2RpY3RfXyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCVB5X0lOQ1JFRihpbnN0LT5pbl9kaWN0KTsKLQkJCXJldHVybiBpbnN0LT5pbl9kaWN0OwotCQl9Ci0JCWlmIChzdHJjbXAoc25hbWUsICJfX2NsYXNzX18iKSA9PSAwKSB7Ci0JCQlQeV9JTkNSRUYoaW5zdC0+aW5fY2xhc3MpOwotCQkJcmV0dXJuIChQeU9iamVjdCAqKWluc3QtPmluX2NsYXNzOwotCQl9Ci0JfQotCXYgPSBpbnN0YW5jZV9nZXRhdHRyMihpbnN0LCBuYW1lKTsKLQlpZiAodiA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgIiUuNTBzIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAotCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcoaW5zdC0+aW5fY2xhc3MtPmNsX25hbWUpLCBzbmFtZSk7Ci0JfQotCXJldHVybiB2OworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OworICAgIHJlZ2lzdGVyIGNoYXIgKnNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7CisgICAgaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKKyAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkgeworICAgICAgICAgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgImluc3RhbmNlLl9fZGljdF9fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfSU5DUkVGKGluc3QtPmluX2RpY3QpOworICAgICAgICAgICAgcmV0dXJuIGluc3QtPmluX2RpY3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fY2xhc3NfXyIpID09IDApIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihpbnN0LT5pbl9jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopaW5zdC0+aW5fY2xhc3M7CisgICAgICAgIH0KKyAgICB9CisgICAgdiA9IGluc3RhbmNlX2dldGF0dHIyKGluc3QsIG5hbWUpOworICAgIGlmICh2ID09IE5VTEwgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiUuNTBzIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGluc3QtPmluX2NsYXNzLT5jbF9uYW1lKSwgc25hbWUpOworICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2dldGF0dHIyKHJlZ2lzdGVyIFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpuYW1lKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotCVB5Q2xhc3NPYmplY3QgKmtsYXNzOwotCWRlc2NyZ2V0ZnVuYyBmOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OworICAgIFB5Q2xhc3NPYmplY3QgKmtsYXNzOworICAgIGRlc2NyZ2V0ZnVuYyBmOwogCi0JdiA9IFB5RGljdF9HZXRJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUpOwotCWlmICh2ICE9IE5VTEwpIHsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gdjsKLQl9Ci0JdiA9IGNsYXNzX2xvb2t1cChpbnN0LT5pbl9jbGFzcywgbmFtZSwgJmtsYXNzKTsKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJZiA9IFRQX0RFU0NSX0dFVCh2LT5vYl90eXBlKTsKLQkJaWYgKGYgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKncgPSBmKHYsIChQeU9iamVjdCAqKWluc3QsCi0JCQkJCShQeU9iamVjdCAqKShpbnN0LT5pbl9jbGFzcykpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJdiA9IHc7Ci0JCX0KLQl9Ci0JcmV0dXJuIHY7CisgICAgdiA9IFB5RGljdF9HZXRJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUpOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisgICAgdiA9IGNsYXNzX2xvb2t1cChpbnN0LT5pbl9jbGFzcywgbmFtZSwgJmtsYXNzKTsKKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgZiA9IFRQX0RFU0NSX0dFVCh2LT5vYl90eXBlKTsKKyAgICAgICAgaWYgKGYgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKncgPSBmKHYsIChQeU9iamVjdCAqKWluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopKGluc3QtPmluX2NsYXNzKSk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICB2ID0gdzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2dldGF0dHIocmVnaXN0ZXIgUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKmZ1bmMsICpyZXM7Ci0JcmVzID0gaW5zdGFuY2VfZ2V0YXR0cjEoaW5zdCwgbmFtZSk7Ci0JaWYgKHJlcyA9PSBOVUxMICYmIChmdW5jID0gaW5zdC0+aW5fY2xhc3MtPmNsX2dldGF0dHIpICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKmFyZ3M7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJYXJncyA9IFB5VHVwbGVfUGFjaygyLCBpbnN0LCBuYW1lKTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCX0KLQlyZXR1cm4gcmVzOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpmdW5jLCAqcmVzOworICAgIHJlcyA9IGluc3RhbmNlX2dldGF0dHIxKGluc3QsIG5hbWUpOworICAgIGlmIChyZXMgPT0gTlVMTCAmJiAoZnVuYyA9IGluc3QtPmluX2NsYXNzLT5jbF9nZXRhdHRyKSAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICphcmdzOworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMiwgaW5zdCwgbmFtZSk7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogU2VlIGNsYXNzb2JqZWN0LmggY29tbWVudHM6ICB0aGlzIG9ubHkgZG9lcyBkaWN0IGxvb2t1cHMsIGFuZCBpcyBhbHdheXMKQEAgLTc3NSwyMzUgKzc3NSwyMzUgQEAKIFB5T2JqZWN0ICoKIF9QeUluc3RhbmNlX0xvb2t1cChQeU9iamVjdCAqcGluc3QsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5T2JqZWN0ICp2OwotCVB5Q2xhc3NPYmplY3QgKmtsYXNzOwotCVB5SW5zdGFuY2VPYmplY3QgKmluc3Q7CS8qIHBpbnN0IGNhc3QgdG8gdGhlIHJpZ2h0IHR5cGUgKi8KKyAgICBQeU9iamVjdCAqdjsKKyAgICBQeUNsYXNzT2JqZWN0ICprbGFzczsKKyAgICBQeUluc3RhbmNlT2JqZWN0ICppbnN0OyAgICAgLyogcGluc3QgY2FzdCB0byB0aGUgcmlnaHQgdHlwZSAqLwogCi0JYXNzZXJ0KFB5SW5zdGFuY2VfQ2hlY2socGluc3QpKTsKLQlpbnN0ID0gKFB5SW5zdGFuY2VPYmplY3QgKilwaW5zdDsKKyAgICBhc3NlcnQoUHlJbnN0YW5jZV9DaGVjayhwaW5zdCkpOworICAgIGluc3QgPSAoUHlJbnN0YW5jZU9iamVjdCAqKXBpbnN0OwogCi0JYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKG5hbWUpKTsKKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2sobmFtZSkpOwogCi0gCXYgPSBQeURpY3RfR2V0SXRlbShpbnN0LT5pbl9kaWN0LCBuYW1lKTsKLQlpZiAodiA9PSBOVUxMKQotCQl2ID0gY2xhc3NfbG9va3VwKGluc3QtPmluX2NsYXNzLCBuYW1lLCAma2xhc3MpOwotCXJldHVybiB2OworICAgIHYgPSBQeURpY3RfR2V0SXRlbShpbnN0LT5pbl9kaWN0LCBuYW1lKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICB2ID0gY2xhc3NfbG9va3VwKGluc3QtPmluX2NsYXNzLCBuYW1lLCAma2xhc3MpOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZV9zZXRhdHRyMShQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlpbnQgcnYgPSBQeURpY3RfRGVsSXRlbShpbnN0LT5pbl9kaWN0LCBuYW1lKTsKLQkJaWYgKHJ2IDwgMCkKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkgICAgICIlLjUwcyBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKLQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhpbnN0LT5pbl9jbGFzcy0+Y2xfbmFtZSksCi0JCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwotCQlyZXR1cm4gcnY7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RGljdF9TZXRJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUsIHYpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgaW50IHJ2ID0gUHlEaWN0X0RlbEl0ZW0oaW5zdC0+aW5fZGljdCwgbmFtZSk7CisgICAgICAgIGlmIChydiA8IDApCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiUuNTBzIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhpbnN0LT5pbl9jbGFzcy0+Y2xfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeURpY3RfU2V0SXRlbShpbnN0LT5pbl9kaWN0LCBuYW1lLCB2KTsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2Vfc2V0YXR0cihQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmdzLCAqcmVzLCAqdG1wOwotCWNoYXIgKnNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7Ci0JaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKLQkJUHlfc3NpemVfdCBuID0gUHlTdHJpbmdfU2l6ZShuYW1lKTsKLQkJaWYgKHNuYW1lW24tMV0gPT0gJ18nICYmIHNuYW1lW24tMl0gPT0gJ18nKSB7Ci0JCQlpZiAoc3RyY21wKHNuYW1lLCAiX19kaWN0X18iKSA9PSAwKSB7Ci0JCQkJaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkgIl9fZGljdF9fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWlmICh2ID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayh2KSkgewotCQkJCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgICAiX19kaWN0X18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0aW9uYXJ5Iik7Ci0JCQkJICAgIHJldHVybiAtMTsKLQkJCQl9Ci0JCQkJdG1wID0gaW5zdC0+aW5fZGljdDsKLQkJCQlQeV9JTkNSRUYodik7Ci0JCQkJaW5zdC0+aW5fZGljdCA9IHY7Ci0JCQkJUHlfREVDUkVGKHRtcCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKHNuYW1lLCAiX19jbGFzc19fIikgPT0gMCkgewotCQkJCWlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJIl9fY2xhc3NfXyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlpZiAodiA9PSBOVUxMIHx8ICFQeUNsYXNzX0NoZWNrKHYpKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSAgICJfX2NsYXNzX18gbXVzdCBiZSBzZXQgdG8gYSBjbGFzcyIpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXRtcCA9IChQeU9iamVjdCAqKShpbnN0LT5pbl9jbGFzcyk7Ci0JCQkJUHlfSU5DUkVGKHYpOwotCQkJCWluc3QtPmluX2NsYXNzID0gKFB5Q2xhc3NPYmplY3QgKil2OwotCQkJCVB5X0RFQ1JFRih0bXApOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JfQotCWlmICh2ID09IE5VTEwpCi0JCWZ1bmMgPSBpbnN0LT5pbl9jbGFzcy0+Y2xfZGVsYXR0cjsKLQllbHNlCi0JCWZ1bmMgPSBpbnN0LT5pbl9jbGFzcy0+Y2xfc2V0YXR0cjsKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gaW5zdGFuY2Vfc2V0YXR0cjEoaW5zdCwgbmFtZSwgdik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJYXJncyA9IFB5VHVwbGVfUGFjaygyLCBpbnN0LCBuYW1lKTsKLQllbHNlCi0JCWFyZ3MgPSBQeVR1cGxlX1BhY2soMywgaW5zdCwgbmFtZSwgdik7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3MsICpyZXMsICp0bXA7CisgICAgY2hhciAqc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKKyAgICBpZiAoc25hbWVbMF0gPT0gJ18nICYmIHNuYW1lWzFdID09ICdfJykgeworICAgICAgICBQeV9zc2l6ZV90IG4gPSBQeVN0cmluZ19TaXplKG5hbWUpOworICAgICAgICBpZiAoc25hbWVbbi0xXSA9PSAnXycgJiYgc25hbWVbbi0yXSA9PSAnXycpIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoc25hbWUsICJfX2RpY3RfXyIpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAiX19kaWN0X18gbm90IGFjY2Vzc2libGUgaW4gcmVzdHJpY3RlZCBtb2RlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJfX2RpY3RfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bXAgPSBpbnN0LT5pbl9kaWN0OworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgICAgICBpbnN0LT5pbl9kaWN0ID0gdjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJjbXAoc25hbWUsICJfX2NsYXNzX18iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAiX19jbGFzc19fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwgfHwgIVB5Q2xhc3NfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIl9fY2xhc3NfXyBtdXN0IGJlIHNldCB0byBhIGNsYXNzIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wID0gKFB5T2JqZWN0ICopKGluc3QtPmluX2NsYXNzKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICAgICAgaW5zdC0+aW5fY2xhc3MgPSAoUHlDbGFzc09iamVjdCAqKXY7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgZnVuYyA9IGluc3QtPmluX2NsYXNzLT5jbF9kZWxhdHRyOworICAgIGVsc2UKKyAgICAgICAgZnVuYyA9IGluc3QtPmluX2NsYXNzLT5jbF9zZXRhdHRyOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBpbnN0YW5jZV9zZXRhdHRyMShpbnN0LCBuYW1lLCB2KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDIsIGluc3QsIG5hbWUpOworICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygzLCBpbnN0LCBuYW1lLCB2KTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfcmVwcihQeUluc3RhbmNlT2JqZWN0ICppbnN0KQogewotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpyZXByc3RyOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpyZXByc3RyOwogCi0JaWYgKHJlcHJzdHIgPT0gTlVMTCkgewotCQlyZXByc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19yZXByX18iKTsKLQkJaWYgKHJlcHJzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCByZXByc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpjbGFzc25hbWUsICptb2Q7Ci0JCWNoYXIgKmNuYW1lOwotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWNsYXNzbmFtZSA9IGluc3QtPmluX2NsYXNzLT5jbF9uYW1lOwotCQltb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhpbnN0LT5pbl9jbGFzcy0+Y2xfZGljdCwKLQkJCQkJICAgIl9fbW9kdWxlX18iKTsKLQkJaWYgKGNsYXNzbmFtZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGNsYXNzbmFtZSkpCi0JCQljbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGNsYXNzbmFtZSk7Ci0JCWVsc2UKLQkJCWNuYW1lID0gIj8iOwotCQlpZiAobW9kID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG1vZCkpCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPD8uJXMgaW5zdGFuY2UgYXQgJXA+IiwKLQkJCQkJCSAgIGNuYW1lLCBpbnN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcy4lcyBpbnN0YW5jZSBhdCAlcD4iLAotCQkJCQkJICAgUHlTdHJpbmdfQXNTdHJpbmcobW9kKSwKLQkJCQkJCSAgIGNuYW1lLCBpbnN0KTsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCXJldHVybiByZXM7CisgICAgaWYgKHJlcHJzdHIgPT0gTlVMTCkgeworICAgICAgICByZXByc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19yZXByX18iKTsKKyAgICAgICAgaWYgKHJlcHJzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCByZXByc3RyKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpjbGFzc25hbWUsICptb2Q7CisgICAgICAgIGNoYXIgKmNuYW1lOworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGNsYXNzbmFtZSA9IGluc3QtPmluX2NsYXNzLT5jbF9uYW1lOworICAgICAgICBtb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhpbnN0LT5pbl9jbGFzcy0+Y2xfZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fbW9kdWxlX18iKTsKKyAgICAgICAgaWYgKGNsYXNzbmFtZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGNsYXNzbmFtZSkpCisgICAgICAgICAgICBjbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGNsYXNzbmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNuYW1lID0gIj8iOworICAgICAgICBpZiAobW9kID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG1vZCkpCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPD8uJXMgaW5zdGFuY2UgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lLCBpbnN0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcy4lcyBpbnN0YW5jZSBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcobW9kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lLCBpbnN0KTsKKyAgICB9CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9zdHIoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCkKIHsKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqc3Ryc3RyOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpzdHJzdHI7CiAKLQlpZiAoc3Ryc3RyID09IE5VTEwpIHsKLQkJc3Ryc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zdHJfXyIpOwotCQlpZiAoc3Ryc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgc3Ryc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlX3JlcHIoaW5zdCk7Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChzdHJzdHIgPT0gTlVMTCkgeworICAgICAgICBzdHJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3N0cl9fIik7CisgICAgICAgIGlmIChzdHJzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBzdHJzdHIpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gaW5zdGFuY2VfcmVwcihpbnN0KTsKKyAgICB9CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBsb25nCiBpbnN0YW5jZV9oYXNoKFB5SW5zdGFuY2VPYmplY3QgKmluc3QpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKnJlczsKLQlsb25nIG91dGNvbWU7Ci0Jc3RhdGljIFB5T2JqZWN0ICpoYXNoc3RyLCAqZXFzdHIsICpjbXBzdHI7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBsb25nIG91dGNvbWU7CisgICAgc3RhdGljIFB5T2JqZWN0ICpoYXNoc3RyLCAqZXFzdHIsICpjbXBzdHI7CiAKLQlpZiAoaGFzaHN0ciA9PSBOVUxMKSB7Ci0JCWhhc2hzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2hhc2hfXyIpOwotCQlpZiAoaGFzaHN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBoYXNoc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCS8qIElmIHRoZXJlIGlzIG5vIF9fZXFfXyBhbmQgbm8gX19jbXBfXyBtZXRob2QsIHdlIGhhc2ggb24gdGhlCi0JCSAgIGFkZHJlc3MuICBJZiBhbiBfX2VxX18gb3IgX19jbXBfXyBtZXRob2QgZXhpc3RzLCB0aGVyZSBtdXN0Ci0JCSAgIGJlIGEgX19oYXNoX18uICovCi0JCWlmIChlcXN0ciA9PSBOVUxMKSB7Ci0JCQllcXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZXFfXyIpOwotCQkJaWYgKGVxc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGVxc3RyKTsKLQkJaWYgKGZ1bmMgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJaWYgKGNtcHN0ciA9PSBOVUxMKSB7Ci0JCQkJY21wc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jbXBfXyIpOwotCQkJCWlmIChjbXBzdHIgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgY21wc3RyKTsKLQkJCWlmIChmdW5jID09IE5VTEwpIHsKLQkJCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoCi0JCQkJCVB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJcmV0dXJuIF9QeV9IYXNoUG9pbnRlcihpbnN0KTsKLQkJCX0KLQkJfQotCQlQeV9YREVDUkVGKGZ1bmMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5oYXNoYWJsZSBpbnN0YW5jZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoUHlJbnRfQ2hlY2socmVzKSB8fCBQeUxvbmdfQ2hlY2socmVzKSkKLQkJLyogVGhpcyBhbHJlYWR5IGNvbnZlcnRzIGEgLTEgcmVzdWx0IHRvIC0yLiAqLwotCQlvdXRjb21lID0gcmVzLT5vYl90eXBlLT50cF9oYXNoKHJlcyk7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl9faGFzaF9fKCkgc2hvdWxkIHJldHVybiBhbiBpbnQiKTsKLQkJb3V0Y29tZSA9IC0xOwotCX0KLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gb3V0Y29tZTsKKyAgICBpZiAoaGFzaHN0ciA9PSBOVUxMKSB7CisgICAgICAgIGhhc2hzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2hhc2hfXyIpOworICAgICAgICBpZiAoaGFzaHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBoYXNoc3RyKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIC8qIElmIHRoZXJlIGlzIG5vIF9fZXFfXyBhbmQgbm8gX19jbXBfXyBtZXRob2QsIHdlIGhhc2ggb24gdGhlCisgICAgICAgICAgIGFkZHJlc3MuICBJZiBhbiBfX2VxX18gb3IgX19jbXBfXyBtZXRob2QgZXhpc3RzLCB0aGVyZSBtdXN0CisgICAgICAgICAgIGJlIGEgX19oYXNoX18uICovCisgICAgICAgIGlmIChlcXN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBlcXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZXFfXyIpOworICAgICAgICAgICAgaWYgKGVxc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGVxc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaWYgKGNtcHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY21wc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jbXBfXyIpOworICAgICAgICAgICAgICAgIGlmIChjbXBzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgY21wc3RyKTsKKyAgICAgICAgICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoCisgICAgICAgICAgICAgICAgICAgIFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9QeV9IYXNoUG9pbnRlcihpbnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKGZ1bmMpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5oYXNoYWJsZSBpbnN0YW5jZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoUHlJbnRfQ2hlY2socmVzKSB8fCBQeUxvbmdfQ2hlY2socmVzKSkKKyAgICAgICAgLyogVGhpcyBhbHJlYWR5IGNvbnZlcnRzIGEgLTEgcmVzdWx0IHRvIC0yLiAqLworICAgICAgICBvdXRjb21lID0gcmVzLT5vYl90eXBlLT50cF9oYXNoKHJlcyk7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19oYXNoX18oKSBzaG91bGQgcmV0dXJuIGFuIGludCIpOworICAgICAgICBvdXRjb21lID0gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiBvdXRjb21lOwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZV90cmF2ZXJzZShQeUluc3RhbmNlT2JqZWN0ICpvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChvLT5pbl9jbGFzcyk7Ci0JUHlfVklTSVQoby0+aW5fZGljdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoby0+aW5fY2xhc3MpOworICAgIFB5X1ZJU0lUKG8tPmluX2RpY3QpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKmdldGl0ZW1zdHIsICpzZXRpdGVtc3RyLCAqZGVsaXRlbXN0ciwgKmxlbnN0cjsKQEAgLTEwMTIsNDEzICsxMDEyLDQxMyBAQAogc3RhdGljIFB5X3NzaXplX3QKIGluc3RhbmNlX2xlbmd0aChQeUluc3RhbmNlT2JqZWN0ICppbnN0KQogewotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICpyZXM7Ci0JUHlfc3NpemVfdCBvdXRjb21lOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgUHlfc3NpemVfdCBvdXRjb21lOwogCi0JaWYgKGxlbnN0ciA9PSBOVUxMKSB7Ci0JCWxlbnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbGVuX18iKTsKLQkJaWYgKGxlbnN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBsZW5zdHIpOwotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKFB5SW50X0NoZWNrKHJlcykpIHsKLQkJb3V0Y29tZSA9IFB5SW50X0FzU3NpemVfdChyZXMpOwotCQlpZiAob3V0Y29tZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgIGlmIChsZW5zdHIgPT0gTlVMTCkgeworICAgICAgICBsZW5zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2xlbl9fIik7CisgICAgICAgIGlmIChsZW5zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgbGVuc3RyKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChQeUludF9DaGVjayhyZXMpKSB7CisgICAgICAgIG91dGNvbWUgPSBQeUludF9Bc1NzaXplX3QocmVzKTsKKyAgICAgICAgaWYgKG91dGNvbWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICNpZiBTSVpFT0ZfU0laRV9UIDwgU0laRU9GX0lOVAotCQkvKiBPdmVyZmxvdyBjaGVjayAtLSByYW5nZSBvZiBQeUludCBpcyBtb3JlIHRoYW4gQyBpbnQgKi8KLQkJaWYgKG91dGNvbWUgIT0gKGludClvdXRjb21lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSAiX19sZW5fXygpIHNob3VsZCByZXR1cm4gMCA8PSBvdXRjb21lIDwgMioqMzEiKTsKLQkJCW91dGNvbWUgPSAtMTsKLQkJfQotCQllbHNlCisgICAgICAgIC8qIE92ZXJmbG93IGNoZWNrIC0tIHJhbmdlIG9mIFB5SW50IGlzIG1vcmUgdGhhbiBDIGludCAqLworICAgICAgICBpZiAob3V0Y29tZSAhPSAoaW50KW91dGNvbWUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICJfX2xlbl9fKCkgc2hvdWxkIHJldHVybiAwIDw9IG91dGNvbWUgPCAyKiozMSIpOworICAgICAgICAgICAgb3V0Y29tZSA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZgotCQlpZiAob3V0Y29tZSA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiX19sZW5fXygpIHNob3VsZCByZXR1cm4gPj0gMCIpOwotCQkJb3V0Y29tZSA9IC0xOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2xlbl9fKCkgc2hvdWxkIHJldHVybiBhbiBpbnQiKTsKLQkJb3V0Y29tZSA9IC0xOwotCX0KLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gb3V0Y29tZTsKKyAgICAgICAgaWYgKG91dGNvbWUgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19sZW5fXygpIHNob3VsZCByZXR1cm4gPj0gMCIpOworICAgICAgICAgICAgb3V0Y29tZSA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fbGVuX18oKSBzaG91bGQgcmV0dXJuIGFuIGludCIpOworICAgICAgICBvdXRjb21lID0gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiBvdXRjb21lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2Vfc3Vic2NyaXB0KFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKmFyZzsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICphcmc7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChnZXRpdGVtc3RyID09IE5VTEwpIHsKLQkJZ2V0aXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0aXRlbV9fIik7Ci0JCWlmIChnZXRpdGVtc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZ2V0aXRlbXN0cik7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnID0gUHlUdXBsZV9QYWNrKDEsIGtleSk7Ci0JaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCVB5X0RFQ1JFRihhcmcpOwotCXJldHVybiByZXM7CisgICAgaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkgeworICAgICAgICBnZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRpdGVtX18iKTsKKyAgICAgICAgaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBnZXRpdGVtc3RyKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcgPSBQeVR1cGxlX1BhY2soMSwga2V5KTsKKyAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgUHlfREVDUkVGKGFyZyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2VfYXNzX3N1YnNjcmlwdChQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKmFyZzsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICphcmc7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCWlmIChkZWxpdGVtc3RyID09IE5VTEwpIHsKLQkJCWRlbGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbGl0ZW1fXyIpOwotCQkJaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsaXRlbXN0cik7Ci0JfQotCWVsc2UgewotCQlpZiAoc2V0aXRlbXN0ciA9PSBOVUxMKSB7Ci0JCQlzZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zZXRpdGVtX18iKTsKLQkJCWlmIChzZXRpdGVtc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldGl0ZW1zdHIpOwotCX0KLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHZhbHVlID09IE5VTEwpCi0JCWFyZyA9IFB5VHVwbGVfUGFjaygxLCBrZXkpOwotCWVsc2UKLQkJYXJnID0gUHlUdXBsZV9QYWNrKDIsIGtleSwgdmFsdWUpOwotCWlmIChhcmcgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JUHlfREVDUkVGKGFyZyk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgZGVsaXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsaXRlbV9fIik7CisgICAgICAgICAgICBpZiAoZGVsaXRlbXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBkZWxpdGVtc3RyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzZXRpdGVtc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldGl0ZW1fXyIpOworICAgICAgICAgICAgaWYgKHNldGl0ZW1zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgc2V0aXRlbXN0cik7CisgICAgfQorICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgYXJnID0gUHlUdXBsZV9QYWNrKDEsIGtleSk7CisgICAgZWxzZQorICAgICAgICBhcmcgPSBQeVR1cGxlX1BhY2soMiwga2V5LCB2YWx1ZSk7CisgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgaW5zdGFuY2VfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYylpbnN0YW5jZV9sZW5ndGgsCQkvKiBtcF9sZW5ndGggKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9zdWJzY3JpcHQsCQkvKiBtcF9zdWJzY3JpcHQgKi8KLQkob2Jqb2JqYXJncHJvYylpbnN0YW5jZV9hc3Nfc3Vic2NyaXB0LAkvKiBtcF9hc3Nfc3Vic2NyaXB0ICovCisgICAgKGxlbmZ1bmMpaW5zdGFuY2VfbGVuZ3RoLCAgICAgICAgICAgICAgICAgICAvKiBtcF9sZW5ndGggKi8KKyAgICAoYmluYXJ5ZnVuYylpbnN0YW5jZV9zdWJzY3JpcHQsICAgICAgICAgICAgIC8qIG1wX3N1YnNjcmlwdCAqLworICAgIChvYmpvYmphcmdwcm9jKWluc3RhbmNlX2Fzc19zdWJzY3JpcHQsICAgICAgLyogbXBfYXNzX3N1YnNjcmlwdCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2l0ZW0oUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlfc3NpemVfdCBpKQogewotCVB5T2JqZWN0ICpmdW5jLCAqcmVzOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzOwogCi0JaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkgewotCQlnZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRpdGVtX18iKTsKLQkJaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBnZXRpdGVtc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuYywgIm4iLCBpKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKSB7CisgICAgICAgIGdldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOworICAgICAgICBpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGdldGl0ZW1zdHIpOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCAibiIsIGkpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2Vfc2xpY2UoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlfc3NpemVfdCBpLCBQeV9zc2l6ZV90IGopCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpnZXRzbGljZXN0cjsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZywgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmdldHNsaWNlc3RyOwogCi0JaWYgKGdldHNsaWNlc3RyID09IE5VTEwpIHsKLQkJZ2V0c2xpY2VzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldHNsaWNlX18iKTsKLQkJaWYgKGdldHNsaWNlc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZ2V0c2xpY2VzdHIpOworICAgIGlmIChnZXRzbGljZXN0ciA9PSBOVUxMKSB7CisgICAgICAgIGdldHNsaWNlc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRzbGljZV9fIik7CisgICAgICAgIGlmIChnZXRzbGljZXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGdldHNsaWNlc3RyKTsKIAotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiBOVUxMOwotCQlQeUVycl9DbGVhcigpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOwogCi0JCWlmIChnZXRpdGVtc3RyID09IE5VTEwpIHsKLQkJCWdldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOwotCQkJaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBnZXRpdGVtc3RyKTsKLQkJaWYgKGZ1bmMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIoTikiLCBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpLCBqKSk7Ci0JfQotCWVsc2UgewotCQlpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19nZXRzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQ7ICIKLQkJCQkgICAidXNlIF9fZ2V0aXRlbV9fIiwgMSkgPCAwKSB7Ci0JCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIobm4pIiwgaSwgaik7Ci0JfQorICAgICAgICBpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRpdGVtX18iKTsKKyAgICAgICAgICAgIGlmIChnZXRpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZ2V0aXRlbXN0cik7CisgICAgICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKE4pIiwgX1B5U2xpY2VfRnJvbUluZGljZXMoaSwgaikpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJpbiAzLngsIF9fZ2V0c2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIF9fZ2V0aXRlbV9fIiwgMSkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIobm4pIiwgaSwgaik7CisgICAgfQogCi0JaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCVB5X0RFQ1JFRihhcmcpOwotCXJldHVybiByZXM7CisgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIFB5X0RFQ1JFRihhcmcpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIGluc3RhbmNlX2Fzc19pdGVtKFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7CisgICAgUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7CiAKLQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCWlmIChkZWxpdGVtc3RyID09IE5VTEwpIHsKLQkJCWRlbGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbGl0ZW1fXyIpOwotCQkJaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsaXRlbXN0cik7Ci0JfQotCWVsc2UgewotCQlpZiAoc2V0aXRlbXN0ciA9PSBOVUxMKSB7Ci0JCQlzZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zZXRpdGVtX18iKTsKLQkJCWlmIChzZXRpdGVtc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldGl0ZW1zdHIpOwotCX0KLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGl0ZW0gPT0gTlVMTCkKLQkJYXJnID0gUHlJbnRfRnJvbVNzaXplX3QoaSk7Ci0JZWxzZQotCQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIobk8pIiwgaSwgaXRlbSk7Ci0JaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlQeV9ERUNSRUYoYXJnKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChkZWxpdGVtc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbGl0ZW1fXyIpOworICAgICAgICAgICAgaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsaXRlbXN0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoc2V0aXRlbXN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBzZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zZXRpdGVtX18iKTsKKyAgICAgICAgICAgIGlmIChzZXRpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldGl0ZW1zdHIpOworICAgIH0KKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgYXJnID0gUHlJbnRfRnJvbVNzaXplX3QoaSk7CisgICAgZWxzZQorICAgICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIobk8pIiwgaSwgaXRlbSk7CisgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2VfYXNzX3NsaWNlKFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBqLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpzZXRzbGljZXN0ciwgKmRlbHNsaWNlc3RyOworICAgIFB5T2JqZWN0ICpmdW5jLCAqYXJnLCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqc2V0c2xpY2VzdHIsICpkZWxzbGljZXN0cjsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCWlmIChkZWxzbGljZXN0ciA9PSBOVUxMKSB7Ci0JCQlkZWxzbGljZXN0ciA9Ci0JCQkJUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxzbGljZV9fIik7Ci0JCQlpZiAoZGVsc2xpY2VzdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsc2xpY2VzdHIpOwotCQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCXJldHVybiAtMTsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlpZiAoZGVsaXRlbXN0ciA9PSBOVUxMKSB7Ci0JCQkJZGVsaXRlbXN0ciA9Ci0JCQkJICAgIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsaXRlbV9fIik7Ci0JCQkJaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsaXRlbXN0cik7Ci0JCQlpZiAoZnVuYyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBpZiAoZGVsc2xpY2VzdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgZGVsc2xpY2VzdHIgPQorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsc2xpY2VfXyIpOworICAgICAgICAgICAgaWYgKGRlbHNsaWNlc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGRlbHNsaWNlc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGRlbGl0ZW1zdHIgPQorICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbGl0ZW1fXyIpOworICAgICAgICAgICAgICAgIGlmIChkZWxpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGRlbGl0ZW1zdHIpOworICAgICAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihOKSIsCi0JCQkJCSAgICBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpLCBqKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19kZWxzbGljZV9fIGhhcyBiZWVuICIKLQkJCQkgICAgICAgICAgICAicmVtb3ZlZDsgdXNlIF9fZGVsaXRlbV9fIiwgMSkgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihubikiLCBpLCBqKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJaWYgKHNldHNsaWNlc3RyID09IE5VTEwpIHsKLQkJCXNldHNsaWNlc3RyID0KLQkJCQlQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldHNsaWNlX18iKTsKLQkJCWlmIChzZXRzbGljZXN0ciA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBzZXRzbGljZXN0cik7Ci0JCWlmIChmdW5jID09IE5VTEwpIHsKLQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJcmV0dXJuIC0xOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWlmIChzZXRpdGVtc3RyID09IE5VTEwpIHsKLQkJCQlzZXRpdGVtc3RyID0KLQkJCQkgICAgUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zZXRpdGVtX18iKTsKLQkJCQlpZiAoc2V0aXRlbXN0ciA9PSBOVUxMKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBzZXRpdGVtc3RyKTsKLQkJCWlmIChmdW5jID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOworICAgICAgICAgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKE4pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5U2xpY2VfRnJvbUluZGljZXMoaSwgaikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJpbiAzLngsIF9fZGVsc2xpY2VfXyBoYXMgYmVlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVkOyB1c2UgX19kZWxpdGVtX18iLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKG5uKSIsIGksIGopOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoc2V0c2xpY2VzdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgc2V0c2xpY2VzdHIgPQorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fc2V0c2xpY2VfXyIpOworICAgICAgICAgICAgaWYgKHNldHNsaWNlc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldHNsaWNlc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaWYgKHNldGl0ZW1zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNldGl0ZW1zdHIgPQorICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldGl0ZW1fXyIpOworICAgICAgICAgICAgICAgIGlmIChzZXRpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldGl0ZW1zdHIpOworICAgICAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihOTykiLAotCQkJCQkgICAgX1B5U2xpY2VfRnJvbUluZGljZXMoaSwgaiksIHZhbHVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX3NldHNsaWNlX18gaGFzIGJlZW4gIgotCQkJCQkgICAicmVtb3ZlZDsgdXNlIF9fc2V0aXRlbV9fIiwgMSkgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihubk8pIiwgaSwgaiwgdmFsdWUpOwotCQl9Ci0JfQotCWlmIChhcmcgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JUHlfREVDUkVGKGFyZyk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIDA7CisgICAgICAgICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIoTk8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5U2xpY2VfRnJvbUluZGljZXMoaSwgaiksIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX3NldHNsaWNlX18gaGFzIGJlZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVkOyB1c2UgX19zZXRpdGVtX18iLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKG5uTykiLCBpLCBqLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2VfY29udGFpbnMoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKm1lbWJlcikKIHsKLQlzdGF0aWMgUHlPYmplY3QgKl9fY29udGFpbnNfXzsKLQlQeU9iamVjdCAqZnVuYzsKKyAgICBzdGF0aWMgUHlPYmplY3QgKl9fY29udGFpbnNfXzsKKyAgICBQeU9iamVjdCAqZnVuYzsKIAotCS8qIFRyeSBfX2NvbnRhaW5zX18gZmlyc3QuCi0JICogSWYgdGhhdCBjYW4ndCBiZSBkb25lLCB0cnkgaXRlcmF0b3ItYmFzZWQgc2VhcmNoaW5nLgotCSAqLworICAgIC8qIFRyeSBfX2NvbnRhaW5zX18gZmlyc3QuCisgICAgICogSWYgdGhhdCBjYW4ndCBiZSBkb25lLCB0cnkgaXRlcmF0b3ItYmFzZWQgc2VhcmNoaW5nLgorICAgICAqLwogCi0JaWYoX19jb250YWluc19fID09IE5VTEwpIHsKLQkJX19jb250YWluc19fID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jb250YWluc19fIik7Ci0JCWlmKF9fY29udGFpbnNfXyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBfX2NvbnRhaW5zX18pOwotCWlmIChmdW5jKSB7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCWludCByZXQ7Ci0JCVB5T2JqZWN0ICphcmcgPSBQeVR1cGxlX1BhY2soMSwgbWVtYmVyKTsKLQkJaWYoYXJnID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmdW5jKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCVB5X0RFQ1JFRihhcmcpOwotCQlpZihyZXMgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcmV0ID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlyZXR1cm4gcmV0OwotCX0KKyAgICBpZihfX2NvbnRhaW5zX18gPT0gTlVMTCkgeworICAgICAgICBfX2NvbnRhaW5zX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NvbnRhaW5zX18iKTsKKyAgICAgICAgaWYoX19jb250YWluc19fID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIF9fY29udGFpbnNfXyk7CisgICAgaWYgKGZ1bmMpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgUHlPYmplY3QgKmFyZyA9IFB5VHVwbGVfUGFjaygxLCBtZW1iZXIpOworICAgICAgICBpZihhcmcgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgIGlmKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXQgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogCi0JLyogQ291bGRuJ3QgZmluZCBfX2NvbnRhaW5zX18uICovCi0JaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7Ci0JCVB5X3NzaXplX3QgcmM7Ci0JCS8qIEFzc3VtZSB0aGUgZmFpbHVyZSB3YXMgc2ltcGx5IGR1ZSB0byB0aGF0IHRoZXJlIGlzIG5vCi0JCSAqIF9fY29udGFpbnNfXyBhdHRyaWJ1dGUsIGFuZCB0cnkgaXRlcmF0aW5nIGluc3RlYWQuCi0JCSAqLwotCQlQeUVycl9DbGVhcigpOwotCQlyYyA9IF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goKFB5T2JqZWN0ICopaW5zdCwgbWVtYmVyLAotCQkJCQkgICAgUFlfSVRFUlNFQVJDSF9DT05UQUlOUyk7Ci0JCWlmIChyYyA+PSAwKQotCQkJcmV0dXJuIHJjID4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIENvdWxkbid0IGZpbmQgX19jb250YWluc19fLiAqLworICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgeworICAgICAgICBQeV9zc2l6ZV90IHJjOworICAgICAgICAvKiBBc3N1bWUgdGhlIGZhaWx1cmUgd2FzIHNpbXBseSBkdWUgdG8gdGhhdCB0aGVyZSBpcyBubworICAgICAgICAgKiBfX2NvbnRhaW5zX18gYXR0cmlidXRlLCBhbmQgdHJ5IGl0ZXJhdGluZyBpbnN0ZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmMgPSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKChQeU9iamVjdCAqKWluc3QsIG1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMpOworICAgICAgICBpZiAocmMgPj0gMCkKKyAgICAgICAgICAgIHJldHVybiByYyA+IDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzCiBpbnN0YW5jZV9hc19zZXF1ZW5jZSA9IHsKLQkobGVuZnVuYylpbnN0YW5jZV9sZW5ndGgsCQkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCQkJLyogc3FfY29uY2F0ICovCi0JMCwJCQkJCS8qIHNxX3JlcGVhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpaW5zdGFuY2VfaXRlbSwJCS8qIHNxX2l0ZW0gKi8KLQkoc3NpemVzc2l6ZWFyZ2Z1bmMpaW5zdGFuY2Vfc2xpY2UsCS8qIHNxX3NsaWNlICovCi0JKHNzaXplb2JqYXJncHJvYylpbnN0YW5jZV9hc3NfaXRlbSwJLyogc3FfYXNzX2l0ZW0gKi8KLQkoc3NpemVzc2l6ZW9iamFyZ3Byb2MpaW5zdGFuY2VfYXNzX3NsaWNlLC8qIHNxX2Fzc19zbGljZSAqLwotCShvYmpvYmpwcm9jKWluc3RhbmNlX2NvbnRhaW5zLAkJLyogc3FfY29udGFpbnMgKi8KKyAgICAobGVuZnVuYylpbnN0YW5jZV9sZW5ndGgsICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKWluc3RhbmNlX2l0ZW0sICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAoc3NpemVzc2l6ZWFyZ2Z1bmMpaW5zdGFuY2Vfc2xpY2UsICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgKHNzaXplb2JqYXJncHJvYylpbnN0YW5jZV9hc3NfaXRlbSwgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIChzc2l6ZXNzaXplb2JqYXJncHJvYylpbnN0YW5jZV9hc3Nfc2xpY2UsLyogc3FfYXNzX3NsaWNlICovCisgICAgKG9iam9ianByb2MpaW5zdGFuY2VfY29udGFpbnMsICAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfdW5hcnlfb3AoUHlJbnN0YW5jZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm1ldGhvZG5hbWUpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXM7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXM7CiAKLQlpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIG1ldGhvZG5hbWUpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIG1ldGhvZG5hbWUpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfYmluYXJ5X29wKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgY2hhciAqb3BuYW1lKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKmZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsIG9wbmFtZSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCBvcG5hbWUpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIApAQCAtMTQyNyw3MCArMTQyNyw3MCBAQAogLyogVHJ5IG9uZSBoYWxmIG9mIGEgYmluYXJ5IG9wZXJhdG9yIGludm9sdmluZyBhIGNsYXNzIGluc3RhbmNlLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGhhbGZfYmlub3AoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjaGFyICpvcG5hbWUsIGJpbmFyeWZ1bmMgdGhpc2Z1bmMsCi0JCWludCBzd2FwcGVkKQorICAgICAgICAgICAgICAgIGludCBzd2FwcGVkKQogewotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpjb2VyY2VmdW5jOwotCVB5T2JqZWN0ICpjb2VyY2VkID0gTlVMTDsKLQlQeU9iamVjdCAqdjE7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqY29lcmNlZnVuYzsKKyAgICBQeU9iamVjdCAqY29lcmNlZCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnYxOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5SW5zdGFuY2VfQ2hlY2sodikpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KKyAgICBpZiAoIVB5SW5zdGFuY2VfQ2hlY2sodikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KIAotCWlmIChjb2VyY2Vfb2JqID09IE5VTEwpIHsKLQkJY29lcmNlX29iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29lcmNlX18iKTsKLQkJaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQljb2VyY2VmdW5jID0gUHlPYmplY3RfR2V0QXR0cih2LCBjb2VyY2Vfb2JqKTsKLQlpZiAoY29lcmNlZnVuYyA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIGdlbmVyaWNfYmluYXJ5X29wKHYsIHcsIG9wbmFtZSk7Ci0JfQorICAgIGlmIChjb2VyY2Vfb2JqID09IE5VTEwpIHsKKyAgICAgICAgY29lcmNlX29iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29lcmNlX18iKTsKKyAgICAgICAgaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjb2VyY2VmdW5jID0gUHlPYmplY3RfR2V0QXR0cih2LCBjb2VyY2Vfb2JqKTsKKyAgICBpZiAoY29lcmNlZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNfYmluYXJ5X29wKHYsIHcsIG9wbmFtZSk7CisgICAgfQogCi0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihjb2VyY2VmdW5jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNvZXJjZWQgPSBQeUV2YWxfQ2FsbE9iamVjdChjb2VyY2VmdW5jLCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKGNvZXJjZWZ1bmMpOwotCWlmIChjb2VyY2VkID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChjb2VyY2VkID09IFB5X05vbmUgfHwgY29lcmNlZCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeV9ERUNSRUYoY29lcmNlZCk7Ci0JCXJldHVybiBnZW5lcmljX2JpbmFyeV9vcCh2LCB3LCBvcG5hbWUpOwotCX0KLQlpZiAoIVB5VHVwbGVfQ2hlY2soY29lcmNlZCkgfHwgUHlUdXBsZV9TaXplKGNvZXJjZWQpICE9IDIpIHsKLQkJUHlfREVDUkVGKGNvZXJjZWQpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjb2VyY2lvbiBzaG91bGQgcmV0dXJuIE5vbmUgb3IgMi10dXBsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdjEgPSBQeVR1cGxlX0dldEl0ZW0oY29lcmNlZCwgMCk7Ci0JdyA9IFB5VHVwbGVfR2V0SXRlbShjb2VyY2VkLCAxKTsKLQlpZiAodjEtPm9iX3R5cGUgPT0gdi0+b2JfdHlwZSAmJiBQeUluc3RhbmNlX0NoZWNrKHYpKSB7Ci0JCS8qIHByZXZlbnQgcmVjdXJzaW9uIGlmIF9fY29lcmNlX18gcmV0dXJucyBzZWxmIGFzIHRoZSBmaXJzdAotCQkgKiBhcmd1bWVudCAqLwotCQlyZXN1bHQgPSBnZW5lcmljX2JpbmFyeV9vcCh2MSwgdywgb3BuYW1lKTsKLQl9IGVsc2UgewotCQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgYWZ0ZXIgY29lcmNpb24iKSkKLQkJICAgIHJldHVybiBOVUxMOwotCQlpZiAoc3dhcHBlZCkKLQkJCXJlc3VsdCA9ICh0aGlzZnVuYykodywgdjEpOwotCQllbHNlCi0JCQlyZXN1bHQgPSAodGhpc2Z1bmMpKHYxLCB3KTsKLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JfQotCVB5X0RFQ1JFRihjb2VyY2VkKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoY29lcmNlZnVuYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjb2VyY2VkID0gUHlFdmFsX0NhbGxPYmplY3QoY29lcmNlZnVuYywgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihjb2VyY2VmdW5jKTsKKyAgICBpZiAoY29lcmNlZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoY29lcmNlZCA9PSBQeV9Ob25lIHx8IGNvZXJjZWQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKGNvZXJjZWQpOworICAgICAgICByZXR1cm4gZ2VuZXJpY19iaW5hcnlfb3Aodiwgdywgb3BuYW1lKTsKKyAgICB9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGNvZXJjZWQpIHx8IFB5VHVwbGVfU2l6ZShjb2VyY2VkKSAhPSAyKSB7CisgICAgICAgIFB5X0RFQ1JFRihjb2VyY2VkKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb2VyY2lvbiBzaG91bGQgcmV0dXJuIE5vbmUgb3IgMi10dXBsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdjEgPSBQeVR1cGxlX0dldEl0ZW0oY29lcmNlZCwgMCk7CisgICAgdyA9IFB5VHVwbGVfR2V0SXRlbShjb2VyY2VkLCAxKTsKKyAgICBpZiAodjEtPm9iX3R5cGUgPT0gdi0+b2JfdHlwZSAmJiBQeUluc3RhbmNlX0NoZWNrKHYpKSB7CisgICAgICAgIC8qIHByZXZlbnQgcmVjdXJzaW9uIGlmIF9fY29lcmNlX18gcmV0dXJucyBzZWxmIGFzIHRoZSBmaXJzdAorICAgICAgICAgKiBhcmd1bWVudCAqLworICAgICAgICByZXN1bHQgPSBnZW5lcmljX2JpbmFyeV9vcCh2MSwgdywgb3BuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgYWZ0ZXIgY29lcmNpb24iKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoc3dhcHBlZCkKKyAgICAgICAgICAgIHJlc3VsdCA9ICh0aGlzZnVuYykodywgdjEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSAodGhpc2Z1bmMpKHYxLCB3KTsKKyAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgfQorICAgIFB5X0RFQ1JFRihjb2VyY2VkKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBJbXBsZW1lbnQgYSBiaW5hcnkgb3BlcmF0b3IgaW52b2x2aW5nIGF0IGxlYXN0IG9uZSBjbGFzcyBpbnN0YW5jZS4gKi8KQEAgLTE0OTgsMTEwICsxNDk4LDExMCBAQAogZG9fYmlub3AoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjaGFyICpvcG5hbWUsIGNoYXIgKnJvcG5hbWUsCiAgICAgICAgICAgICAgICAgICAgYmluYXJ5ZnVuYyB0aGlzZnVuYykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gaGFsZl9iaW5vcCh2LCB3LCBvcG5hbWUsIHRoaXNmdW5jLCAwKTsKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBoYWxmX2Jpbm9wKHcsIHYsIHJvcG5hbWUsIHRoaXNmdW5jLCAxKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gaGFsZl9iaW5vcCh2LCB3LCBvcG5hbWUsIHRoaXNmdW5jLCAwKTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSBoYWxmX2Jpbm9wKHcsIHYsIHJvcG5hbWUsIHRoaXNmdW5jLCAxKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRvX2Jpbm9wX2lucGxhY2UoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjaGFyICppb3BuYW1lLCBjaGFyICpvcG5hbWUsCi0JCQljaGFyICpyb3BuYW1lLCBiaW5hcnlmdW5jIHRoaXNmdW5jKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcm9wbmFtZSwgYmluYXJ5ZnVuYyB0aGlzZnVuYykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gaGFsZl9iaW5vcCh2LCB3LCBpb3BuYW1lLCB0aGlzZnVuYywgMCk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmVzdWx0ID0gZG9fYmlub3Aodiwgdywgb3BuYW1lLCByb3BuYW1lLCB0aGlzZnVuYyk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGhhbGZfYmlub3AodiwgdywgaW9wbmFtZSwgdGhpc2Z1bmMsIDApOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IGRvX2Jpbm9wKHYsIHcsIG9wbmFtZSwgcm9wbmFtZSwgdGhpc2Z1bmMpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZV9jb2VyY2UoUHlPYmplY3QgKipwdiwgUHlPYmplY3QgKipwdykKIHsKLQlQeU9iamVjdCAqdiA9ICpwdjsKLQlQeU9iamVjdCAqdyA9ICpwdzsKLQlQeU9iamVjdCAqY29lcmNlZnVuYzsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqY29lcmNlZDsKKyAgICBQeU9iamVjdCAqdiA9ICpwdjsKKyAgICBQeU9iamVjdCAqdyA9ICpwdzsKKyAgICBQeU9iamVjdCAqY29lcmNlZnVuYzsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqY29lcmNlZDsKIAotCWlmIChjb2VyY2Vfb2JqID09IE5VTEwpIHsKLQkJY29lcmNlX29iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29lcmNlX18iKTsKLQkJaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JY29lcmNlZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIodiwgY29lcmNlX29iaik7Ci0JaWYgKGNvZXJjZWZ1bmMgPT0gTlVMTCkgewotCQkvKiBObyBfX2NvZXJjZV9fIG1ldGhvZCAqLwotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIC0xOwotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogSGFzIF9fY29lcmNlX18gbWV0aG9kOiBjYWxsIGl0ICovCi0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0JY29lcmNlZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNvZXJjZWZ1bmMsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoY29lcmNlZnVuYyk7Ci0JaWYgKGNvZXJjZWQgPT0gTlVMTCkgewotCQkvKiBfX2NvZXJjZV9fIGNhbGwgcmFpc2VkIGFuIGV4Y2VwdGlvbiAqLwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChjb2VyY2VkID09IFB5X05vbmUgfHwgY29lcmNlZCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQkvKiBfX2NvZXJjZV9fIHNheXMgIkkgY2FuJ3QgZG8gaXQiICovCi0JCVB5X0RFQ1JFRihjb2VyY2VkKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghUHlUdXBsZV9DaGVjayhjb2VyY2VkKSB8fCBQeVR1cGxlX1NpemUoY29lcmNlZCkgIT0gMikgewotCQkvKiBfX2NvZXJjZV9fIHJldHVybiB2YWx1ZSBpcyBtYWxmb3JtZWQgKi8KLQkJUHlfREVDUkVGKGNvZXJjZWQpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgImNvZXJjaW9uIHNob3VsZCByZXR1cm4gTm9uZSBvciAyLXR1cGxlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogX19jb2VyY2VfXyByZXR1cm5lZCB0d28gbmV3IHZhbHVlcyAqLwotCSpwdiA9IFB5VHVwbGVfR2V0SXRlbShjb2VyY2VkLCAwKTsKLQkqcHcgPSBQeVR1cGxlX0dldEl0ZW0oY29lcmNlZCwgMSk7Ci0JUHlfSU5DUkVGKCpwdik7Ci0JUHlfSU5DUkVGKCpwdyk7Ci0JUHlfREVDUkVGKGNvZXJjZWQpOwotCXJldHVybiAwOworICAgIGlmIChjb2VyY2Vfb2JqID09IE5VTEwpIHsKKyAgICAgICAgY29lcmNlX29iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29lcmNlX18iKTsKKyAgICAgICAgaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY29lcmNlZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIodiwgY29lcmNlX29iaik7CisgICAgaWYgKGNvZXJjZWZ1bmMgPT0gTlVMTCkgeworICAgICAgICAvKiBObyBfX2NvZXJjZV9fIG1ldGhvZCAqLworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogSGFzIF9fY29lcmNlX18gbWV0aG9kOiBjYWxsIGl0ICovCisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY29lcmNlZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNvZXJjZWZ1bmMsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoY29lcmNlZnVuYyk7CisgICAgaWYgKGNvZXJjZWQgPT0gTlVMTCkgeworICAgICAgICAvKiBfX2NvZXJjZV9fIGNhbGwgcmFpc2VkIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChjb2VyY2VkID09IFB5X05vbmUgfHwgY29lcmNlZCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgeworICAgICAgICAvKiBfX2NvZXJjZV9fIHNheXMgIkkgY2FuJ3QgZG8gaXQiICovCisgICAgICAgIFB5X0RFQ1JFRihjb2VyY2VkKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghUHlUdXBsZV9DaGVjayhjb2VyY2VkKSB8fCBQeVR1cGxlX1NpemUoY29lcmNlZCkgIT0gMikgeworICAgICAgICAvKiBfX2NvZXJjZV9fIHJldHVybiB2YWx1ZSBpcyBtYWxmb3JtZWQgKi8KKyAgICAgICAgUHlfREVDUkVGKGNvZXJjZWQpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJjb2VyY2lvbiBzaG91bGQgcmV0dXJuIE5vbmUgb3IgMi10dXBsZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIF9fY29lcmNlX18gcmV0dXJuZWQgdHdvIG5ldyB2YWx1ZXMgKi8KKyAgICAqcHYgPSBQeVR1cGxlX0dldEl0ZW0oY29lcmNlZCwgMCk7CisgICAgKnB3ID0gUHlUdXBsZV9HZXRJdGVtKGNvZXJjZWQsIDEpOworICAgIFB5X0lOQ1JFRigqcHYpOworICAgIFB5X0lOQ1JFRigqcHcpOworICAgIFB5X0RFQ1JFRihjb2VyY2VkKTsKKyAgICByZXR1cm4gMDsKIH0KIAogI2RlZmluZSBVTkFSWShmdW5jbmFtZSwgbWV0aG9kbmFtZSkgXAogc3RhdGljIFB5T2JqZWN0ICpmdW5jbmFtZShQeUluc3RhbmNlT2JqZWN0ICpzZWxmKSB7IFwKLQlzdGF0aWMgUHlPYmplY3QgKm87IFwKLQlpZiAobyA9PSBOVUxMKSB7IG8gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKG1ldGhvZG5hbWUpOyBcCi0JCQkgaWYgKG8gPT0gTlVMTCkgcmV0dXJuIE5VTEw7IH0gXAotCXJldHVybiBnZW5lcmljX3VuYXJ5X29wKHNlbGYsIG8pOyBcCisgICAgc3RhdGljIFB5T2JqZWN0ICpvOyBcCisgICAgaWYgKG8gPT0gTlVMTCkgeyBvID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhtZXRob2RuYW1lKTsgXAorICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPT0gTlVMTCkgcmV0dXJuIE5VTEw7IH0gXAorICAgIHJldHVybiBnZW5lcmljX3VuYXJ5X29wKHNlbGYsIG8pOyBcCiB9CiAKIC8qIHVuYXJ5IGZ1bmN0aW9uIHdpdGggYSBmYWxsYmFjayAqLwogI2RlZmluZSBVTkFSWV9GQihmdW5jbmFtZSwgbWV0aG9kbmFtZSwgZnVuY25hbWVfZmIpIFwKIHN0YXRpYyBQeU9iamVjdCAqZnVuY25hbWUoUHlJbnN0YW5jZU9iamVjdCAqc2VsZikgeyBcCi0Jc3RhdGljIFB5T2JqZWN0ICpvOyBcCi0JaWYgKG8gPT0gTlVMTCkgeyBvID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhtZXRob2RuYW1lKTsgXAotCQkJIGlmIChvID09IE5VTEwpIHJldHVybiBOVUxMOyB9IFwKLQlpZiAoUHlPYmplY3RfSGFzQXR0cigoUHlPYmplY3QqKXNlbGYsIG8pKSBcCi0JCXJldHVybiBnZW5lcmljX3VuYXJ5X29wKHNlbGYsIG8pOyBcCi0JZWxzZSBcCi0JCXJldHVybiBmdW5jbmFtZV9mYihzZWxmKTsgXAorICAgIHN0YXRpYyBQeU9iamVjdCAqbzsgXAorICAgIGlmIChvID09IE5VTEwpIHsgbyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobWV0aG9kbmFtZSk7IFwKKyAgICAgICAgICAgICAgICAgICAgIGlmIChvID09IE5VTEwpIHJldHVybiBOVUxMOyB9IFwKKyAgICBpZiAoUHlPYmplY3RfSGFzQXR0cigoUHlPYmplY3QqKXNlbGYsIG8pKSBcCisgICAgICAgIHJldHVybiBnZW5lcmljX3VuYXJ5X29wKHNlbGYsIG8pOyBcCisgICAgZWxzZSBcCisgICAgICAgIHJldHVybiBmdW5jbmFtZV9mYihzZWxmKTsgXAogfQogCiAjZGVmaW5lIEJJTkFSWShmLCBtLCBuKSBcCiBzdGF0aWMgUHlPYmplY3QgKmYoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KSB7IFwKLQlyZXR1cm4gZG9fYmlub3AodiwgdywgIl9fIiBtICJfXyIsICJfX3IiIG0gIl9fIiwgbik7IFwKKyAgICByZXR1cm4gZG9fYmlub3AodiwgdywgIl9fIiBtICJfXyIsICJfX3IiIG0gIl9fIiwgbik7IFwKIH0KIAogI2RlZmluZSBCSU5BUllfSU5QTEFDRShmLCBtLCBuKSBcCiBzdGF0aWMgUHlPYmplY3QgKmYoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KSB7IFwKLQlyZXR1cm4gZG9fYmlub3BfaW5wbGFjZSh2LCB3LCAiX19pIiBtICJfXyIsICJfXyIgbSAiX18iLCBcCi0JCQkiX19yIiBtICJfXyIsIG4pOyBcCisgICAgcmV0dXJuIGRvX2Jpbm9wX2lucGxhY2UodiwgdywgIl9faSIgbSAiX18iLCAiX18iIG0gIl9fIiwgXAorICAgICAgICAgICAgICAgICAgICAiX19yIiBtICJfXyIsIG4pOyBcCiB9CiAKIFVOQVJZKGluc3RhbmNlX25lZywgIl9fbmVnX18iKQpAQCAtMTY0NSw1NSArMTY0NSw1NSBAQAogc3RhdGljIGludAogaGFsZl9jbXAoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCXN0YXRpYyBQeU9iamVjdCAqY21wX29iajsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqY21wX2Z1bmM7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlsb25nIGw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjbXBfb2JqOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpjbXBfZnVuYzsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGxvbmcgbDsKIAotCWFzc2VydChQeUluc3RhbmNlX0NoZWNrKHYpKTsKKyAgICBhc3NlcnQoUHlJbnN0YW5jZV9DaGVjayh2KSk7CiAKLQlpZiAoY21wX29iaiA9PSBOVUxMKSB7Ci0JCWNtcF9vYmogPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NtcF9fIik7Ci0JCWlmIChjbXBfb2JqID09IE5VTEwpCi0JCQlyZXR1cm4gLTI7Ci0JfQorICAgIGlmIChjbXBfb2JqID09IE5VTEwpIHsKKyAgICAgICAgY21wX29iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY21wX18iKTsKKyAgICAgICAgaWYgKGNtcF9vYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICB9CiAKLQljbXBfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIodiwgY21wX29iaik7Ci0JaWYgKGNtcF9mdW5jID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiAtMjsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIDI7Ci0JfQorICAgIGNtcF9mdW5jID0gUHlPYmplY3RfR2V0QXR0cih2LCBjbXBfb2JqKTsKKyAgICBpZiAoY21wX2Z1bmMgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CiAKLQlhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHcpOwotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGNtcF9mdW5jKTsKLQkJcmV0dXJuIC0yOwotCX0KKyAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHcpOworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGNtcF9mdW5jKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KIAotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNtcF9mdW5jLCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKGNtcF9mdW5jKTsKKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChjbXBfZnVuYywgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihjbXBfZnVuYyk7CiAKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiAtMjsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMjsKIAotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiAyOwotCX0KKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CiAKLQlsID0gUHlJbnRfQXNMb25nKHJlc3VsdCk7Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JaWYgKGwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY29tcGFyaXNvbiBkaWQgbm90IHJldHVybiBhbiBpbnQiKTsKLQkJcmV0dXJuIC0yOwotCX0KKyAgICBsID0gUHlJbnRfQXNMb25nKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgaWYgKGwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50Iik7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CiAKLQlyZXR1cm4gbCA8IDAgPyAtMSA6IGwgPiAwID8gMSA6IDA7CisgICAgcmV0dXJuIGwgPCAwID8gLTEgOiBsID4gMCA/IDEgOiAwOwogfQogCiAvKiBUcnkgYSAzLXdheSBjb21wYXJpc29uLCByZXR1cm5pbmcgYW4gaW50OyBlaXRoZXIgdiBvciB3IGlzIGFuIGluc3RhbmNlLgpAQCAtMTcwOCwxMjQgKzE3MDgsMTI0IEBACiBzdGF0aWMgaW50CiBpbnN0YW5jZV9jb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpbnQgYzsKKyAgICBpbnQgYzsKIAotCWMgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOwotCWlmIChjIDwgMCkKLQkJcmV0dXJuIC0yOwotCWlmIChjID09IDApIHsKLQkJLyogSWYgbmVpdGhlciBpcyBub3cgYW4gaW5zdGFuY2UsIHVzZSByZWd1bGFyIGNvbXBhcmlzb24gKi8KLQkJaWYgKCFQeUluc3RhbmNlX0NoZWNrKHYpICYmICFQeUluc3RhbmNlX0NoZWNrKHcpKSB7Ci0JCQljID0gUHlPYmplY3RfQ29tcGFyZSh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMjsKLQkJCXJldHVybiBjIDwgMCA/IC0xIDogYyA+IDAgPyAxIDogMDsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogVGhlIGNvZXJjaW9uIGRpZG4ndCBkbyBhbnl0aGluZy4KLQkJICAgVHJlYXQgdGhpcyB0aGUgc2FtZSBhcyByZXR1cm5pbmcgdiBhbmQgdyB1bmNoYW5nZWQuICovCi0JCVB5X0lOQ1JFRih2KTsKLQkJUHlfSU5DUkVGKHcpOwotCX0KKyAgICBjID0gUHlOdW1iZXJfQ29lcmNlRXgoJnYsICZ3KTsKKyAgICBpZiAoYyA8IDApCisgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAoYyA9PSAwKSB7CisgICAgICAgIC8qIElmIG5laXRoZXIgaXMgbm93IGFuIGluc3RhbmNlLCB1c2UgcmVndWxhciBjb21wYXJpc29uICovCisgICAgICAgIGlmICghUHlJbnN0YW5jZV9DaGVjayh2KSAmJiAhUHlJbnN0YW5jZV9DaGVjayh3KSkgeworICAgICAgICAgICAgYyA9IFB5T2JqZWN0X0NvbXBhcmUodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgICAgICByZXR1cm4gYyA8IDAgPyAtMSA6IGMgPiAwID8gMSA6IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFRoZSBjb2VyY2lvbiBkaWRuJ3QgZG8gYW55dGhpbmcuCisgICAgICAgICAgIFRyZWF0IHRoaXMgdGhlIHNhbWUgYXMgcmV0dXJuaW5nIHYgYW5kIHcgdW5jaGFuZ2VkLiAqLworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIFB5X0lOQ1JFRih3KTsKKyAgICB9CiAKLQlpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgewotCQljID0gaGFsZl9jbXAodiwgdyk7Ci0JCWlmIChjIDw9IDEpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCXJldHVybiBjOwotCQl9Ci0JfQotCWlmIChQeUluc3RhbmNlX0NoZWNrKHcpKSB7Ci0JCWMgPSBoYWxmX2NtcCh3LCB2KTsKLQkJaWYgKGMgPD0gMSkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJaWYgKGMgPj0gLTEpCi0JCQkJYyA9IC1jOwotCQkJcmV0dXJuIGM7Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKHYpOwotCVB5X0RFQ1JFRih3KTsKLQlyZXR1cm4gMjsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgeworICAgICAgICBjID0gaGFsZl9jbXAodiwgdyk7CisgICAgICAgIGlmIChjIDw9IDEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgfQorICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHcpKSB7CisgICAgICAgIGMgPSBoYWxmX2NtcCh3LCB2KTsKKyAgICAgICAgaWYgKGMgPD0gMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgaWYgKGMgPj0gLTEpCisgICAgICAgICAgICAgICAgYyA9IC1jOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIFB5X0RFQ1JFRih3KTsKKyAgICByZXR1cm4gMjsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2Vfbm9uemVybyhQeUluc3RhbmNlT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jLCAqcmVzOwotCWxvbmcgb3V0Y29tZTsKLQlzdGF0aWMgUHlPYmplY3QgKm5vbnplcm9zdHI7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXM7CisgICAgbG9uZyBvdXRjb21lOworICAgIHN0YXRpYyBQeU9iamVjdCAqbm9uemVyb3N0cjsKIAotCWlmIChub256ZXJvc3RyID09IE5VTEwpIHsKLQkJbm9uemVyb3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbm9uemVyb19fIik7Ci0JCWlmIChub256ZXJvc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgbm9uemVyb3N0cikpID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiAtMTsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKGxlbnN0ciA9PSBOVUxMKSB7Ci0JCQlsZW5zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2xlbl9fIik7Ci0JCQlpZiAobGVuc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgbGVuc3RyKSkgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJLyogRmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yOgotCQkJICAgYWxsIGluc3RhbmNlcyBhcmUgbm9uemVybyAqLwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmICghUHlJbnRfQ2hlY2socmVzKSkgewotCQlQeV9ERUNSRUYocmVzKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19ub256ZXJvX18gc2hvdWxkIHJldHVybiBhbiBpbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlvdXRjb21lID0gUHlJbnRfQXNMb25nKHJlcyk7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JaWYgKG91dGNvbWUgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJfX25vbnplcm9fXyBzaG91bGQgcmV0dXJuID49IDAiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gb3V0Y29tZSA+IDA7CisgICAgaWYgKG5vbnplcm9zdHIgPT0gTlVMTCkgeworICAgICAgICBub256ZXJvc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19ub256ZXJvX18iKTsKKyAgICAgICAgaWYgKG5vbnplcm9zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBub256ZXJvc3RyKSkgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAobGVuc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGxlbnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbGVuX18iKTsKKyAgICAgICAgICAgIGlmIChsZW5zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBsZW5zdHIpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAvKiBGYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3I6CisgICAgICAgICAgICAgICBhbGwgaW5zdGFuY2VzIGFyZSBub256ZXJvICovCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFQeUludF9DaGVjayhyZXMpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fbm9uemVyb19fIHNob3VsZCByZXR1cm4gYW4gaW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb3V0Y29tZSA9IFB5SW50X0FzTG9uZyhyZXMpOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIGlmIChvdXRjb21lIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX25vbnplcm9fXyBzaG91bGQgcmV0dXJuID49IDAiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gb3V0Y29tZSA+IDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9pbmRleChQeUluc3RhbmNlT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jLCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqaW5kZXhzdHIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqaW5kZXhzdHIgPSBOVUxMOwogCi0JaWYgKGluZGV4c3RyID09IE5VTEwpIHsKLQkJaW5kZXhzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2luZGV4X18iKTsKLQkJaWYgKGluZGV4c3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CQotCWlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgaW5kZXhzdHIpKSA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJIm9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXgiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChpbmRleHN0ciA9PSBOVUxMKSB7CisgICAgICAgIGluZGV4c3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbmRleF9fIik7CisgICAgICAgIGlmIChpbmRleHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgaW5kZXhzdHIpKSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCkBAIC0xODM1LDIyICsxODM1LDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfaW50KFB5SW5zdGFuY2VPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnRydW5jYXRlZDsKLQlzdGF0aWMgUHlPYmplY3QgKmludF9uYW1lOwotCWlmIChpbnRfbmFtZSA9PSBOVUxMKSB7Ci0JCWludF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbnRfXyIpOwotCQlpZiAoaW50X25hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlPYmplY3RfSGFzQXR0cigoUHlPYmplY3QqKXNlbGYsIGludF9uYW1lKSkKLQkJcmV0dXJuIGdlbmVyaWNfdW5hcnlfb3Aoc2VsZiwgaW50X25hbWUpOworICAgIFB5T2JqZWN0ICp0cnVuY2F0ZWQ7CisgICAgc3RhdGljIFB5T2JqZWN0ICppbnRfbmFtZTsKKyAgICBpZiAoaW50X25hbWUgPT0gTlVMTCkgeworICAgICAgICBpbnRfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faW50X18iKTsKKyAgICAgICAgaWYgKGludF9uYW1lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHIoKFB5T2JqZWN0KilzZWxmLCBpbnRfbmFtZSkpCisgICAgICAgIHJldHVybiBnZW5lcmljX3VuYXJ5X29wKHNlbGYsIGludF9uYW1lKTsKIAotCXRydW5jYXRlZCA9IF9pbnN0YW5jZV90cnVuYyhzZWxmKTsKLQkvKiBfX3RydW5jX18gaXMgc3BlY2lmaWVkIHRvIHJldHVybiBhbiBJbnRlZ3JhbCB0eXBlLCBidXQKLQkgICBpbnQoKSBuZWVkcyB0byByZXR1cm4gYW4gaW50LiAqLwotCXJldHVybiBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCi0JCXRydW5jYXRlZCwKLQkJIl9fdHJ1bmNfXyByZXR1cm5lZCBub24tSW50ZWdyYWwgKHR5cGUgJS4yMDBzKSIpOworICAgIHRydW5jYXRlZCA9IF9pbnN0YW5jZV90cnVuYyhzZWxmKTsKKyAgICAvKiBfX3RydW5jX18gaXMgc3BlY2lmaWVkIHRvIHJldHVybiBhbiBJbnRlZ3JhbCB0eXBlLCBidXQKKyAgICAgICBpbnQoKSBuZWVkcyB0byByZXR1cm4gYW4gaW50LiAqLworICAgIHJldHVybiBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCisgICAgICAgIHRydW5jYXRlZCwKKyAgICAgICAgIl9fdHJ1bmNfXyByZXR1cm5lZCBub24tSW50ZWdyYWwgKHR5cGUgJS4yMDBzKSIpOwogfQogCiBVTkFSWV9GQihpbnN0YW5jZV9sb25nLCAiX19sb25nX18iLCBpbnN0YW5jZV9pbnQpCkBAIC0xODYxLDc0ICsxODYxLDc0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluX3Bvd2VyKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlyZXR1cm4gUHlOdW1iZXJfUG93ZXIodiwgdywgUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5TnVtYmVyX1Bvd2VyKHYsIHcsIFB5X05vbmUpOwogfQogCiAvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHRlcm5hcnkgY2FsbHMgb25seSAoeiAhPSBOb25lKSAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX3BvdyhQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5T2JqZWN0ICp6KQogewotCWlmICh6ID09IFB5X05vbmUpIHsKLQkJcmV0dXJuIGRvX2Jpbm9wKHYsIHcsICJfX3Bvd19fIiwgIl9fcnBvd19fIiwgYmluX3Bvd2VyKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpmdW5jOwotCQlQeU9iamVjdCAqYXJnczsKLQkJUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpZiAoeiA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJldHVybiBkb19iaW5vcCh2LCB3LCAiX19wb3dfXyIsICJfX3Jwb3dfXyIsIGJpbl9wb3dlcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqZnVuYzsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQkJLyogWFhYIERvZXNuJ3QgZG8gY29lcmNpb25zLi4uICovCi0JCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsICJfX3Bvd19fIik7Ci0JCWlmIChmdW5jID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJYXJncyA9IFB5VHVwbGVfUGFjaygyLCB3LCB6KTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICAgICAgLyogWFhYIERvZXNuJ3QgZG8gY29lcmNpb25zLi4uICovCisgICAgICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsICJfX3Bvd19fIik7CisgICAgICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygyLCB3LCB6KTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbl9pbnBsYWNlX3Bvd2VyKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlyZXR1cm4gUHlOdW1iZXJfSW5QbGFjZVBvd2VyKHYsIHcsIFB5X05vbmUpOworICAgIHJldHVybiBQeU51bWJlcl9JblBsYWNlUG93ZXIodiwgdywgUHlfTm9uZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2lwb3coUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBQeU9iamVjdCAqeikKIHsKLQlpZiAoeiA9PSBQeV9Ob25lKSB7Ci0JCXJldHVybiBkb19iaW5vcF9pbnBsYWNlKHYsIHcsICJfX2lwb3dfXyIsICJfX3Bvd19fIiwKLQkJCSJfX3Jwb3dfXyIsIGJpbl9pbnBsYWNlX3Bvd2VyKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIFhYWCBEb2Vzbid0IGRvIGNvZXJjaW9ucy4uLiAqLwotCQlQeU9iamVjdCAqZnVuYzsKLQkJUHlPYmplY3QgKmFyZ3M7Ci0JCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaWYgKHogPT0gUHlfTm9uZSkgeworICAgICAgICByZXR1cm4gZG9fYmlub3BfaW5wbGFjZSh2LCB3LCAiX19pcG93X18iLCAiX19wb3dfXyIsCisgICAgICAgICAgICAiX19ycG93X18iLCBiaW5faW5wbGFjZV9wb3dlcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBYWFggRG9lc24ndCBkbyBjb2VyY2lvbnMuLi4gKi8KKyAgICAgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgICAgIFB5T2JqZWN0ICphcmdzOworICAgICAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsICJfX2lwb3dfXyIpOwotCQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCXJldHVybiBOVUxMOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHVybiBpbnN0YW5jZV9wb3codiwgdywgeik7Ci0JCX0KLQkJYXJncyA9IFB5VHVwbGVfUGFjaygyLCB3LCB6KTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICAgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgIl9faXBvd19fIik7CisgICAgICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlX3Bvdyh2LCB3LCB6KTsKKyAgICAgICAgfQorICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDIsIHcsIHopOworICAgICAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQogCiAKQEAgLTE5MzksOTMgKzE5MzksOTMgQEAKIHN0YXRpYyBpbnQKIGluaXRfbmFtZV9vcCh2b2lkKQogewotCWludCBpOwotCWNoYXIgKl9uYW1lX29wW10gPSB7Ci0JCSJfX2x0X18iLAotCQkiX19sZV9fIiwKLQkJIl9fZXFfXyIsCi0JCSJfX25lX18iLAotCQkiX19ndF9fIiwKLQkJIl9fZ2VfXyIsCi0JfTsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpfbmFtZV9vcFtdID0geworICAgICAgICAiX19sdF9fIiwKKyAgICAgICAgIl9fbGVfXyIsCisgICAgICAgICJfX2VxX18iLAorICAgICAgICAiX19uZV9fIiwKKyAgICAgICAgIl9fZ3RfXyIsCisgICAgICAgICJfX2dlX18iLAorICAgIH07CiAKLQluYW1lX29wID0gKFB5T2JqZWN0ICoqKW1hbGxvYyhzaXplb2YoUHlPYmplY3QgKikgKiBOQU1FX09QUyk7Ci0JaWYgKG5hbWVfb3AgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWZvciAoaSA9IDA7IGkgPCBOQU1FX09QUzsgKytpKSB7Ci0JCW5hbWVfb3BbaV0gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKF9uYW1lX29wW2ldKTsKLQkJaWYgKG5hbWVfb3BbaV0gPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgbmFtZV9vcCA9IChQeU9iamVjdCAqKiltYWxsb2Moc2l6ZW9mKFB5T2JqZWN0ICopICogTkFNRV9PUFMpOworICAgIGlmIChuYW1lX29wID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkFNRV9PUFM7ICsraSkgeworICAgICAgICBuYW1lX29wW2ldID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhfbmFtZV9vcFtpXSk7CisgICAgICAgIGlmIChuYW1lX29wW2ldID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaGFsZl9yaWNoY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqbWV0aG9kOwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKm1ldGhvZDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JYXNzZXJ0KFB5SW5zdGFuY2VfQ2hlY2sodikpOworICAgIGFzc2VydChQeUluc3RhbmNlX0NoZWNrKHYpKTsKIAotCWlmIChuYW1lX29wID09IE5VTEwpIHsKLQkJaWYgKGluaXRfbmFtZV9vcCgpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQkvKiBJZiB0aGUgaW5zdGFuY2UgZG9lc24ndCBkZWZpbmUgYW4gX19nZXRhdHRyX18gbWV0aG9kLCB1c2UKLQkgICBpbnN0YW5jZV9nZXRhdHRyMiBkaXJlY3RseSBiZWNhdXNlIGl0IHdpbGwgbm90IHNldCBhbgotCSAgIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLiAqLwotCWlmICgoKFB5SW5zdGFuY2VPYmplY3QgKil2KS0+aW5fY2xhc3MtPmNsX2dldGF0dHIgPT0gTlVMTCkKLQkJbWV0aG9kID0gaW5zdGFuY2VfZ2V0YXR0cjIoKFB5SW5zdGFuY2VPYmplY3QgKil2LAotCQkJCQkgICBuYW1lX29wW29wXSk7Ci0JZWxzZQotCQltZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWVfb3Bbb3BdKTsKLQlpZiAobWV0aG9kID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlQeUVycl9DbGVhcigpOwotCQl9Ci0JCXJlcyA9IFB5X05vdEltcGxlbWVudGVkOwotCQlQeV9JTkNSRUYocmVzKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgaWYgKG5hbWVfb3AgPT0gTlVMTCkgeworICAgICAgICBpZiAoaW5pdF9uYW1lX29wKCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIElmIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGRlZmluZSBhbiBfX2dldGF0dHJfXyBtZXRob2QsIHVzZQorICAgICAgIGluc3RhbmNlX2dldGF0dHIyIGRpcmVjdGx5IGJlY2F1c2UgaXQgd2lsbCBub3Qgc2V0IGFuCisgICAgICAgZXhjZXB0aW9uIG9uIGZhaWx1cmUuICovCisgICAgaWYgKCgoUHlJbnN0YW5jZU9iamVjdCAqKXYpLT5pbl9jbGFzcy0+Y2xfZ2V0YXR0ciA9PSBOVUxMKQorICAgICAgICBtZXRob2QgPSBpbnN0YW5jZV9nZXRhdHRyMigoUHlJbnN0YW5jZU9iamVjdCAqKXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfb3Bbb3BdKTsKKyAgICBlbHNlCisgICAgICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZV9vcFtvcF0pOworICAgIGlmIChtZXRob2QgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdyk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobWV0aG9kKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobWV0aG9kKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QobWV0aG9kLCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKG1ldGhvZCk7CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QobWV0aG9kLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKG1ldGhvZCk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9yaWNoY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgewotCQlyZXMgPSBoYWxmX3JpY2hjb21wYXJlKHYsIHcsIG9wKTsKLQkJaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiByZXM7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCX0KKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgeworICAgICAgICByZXMgPSBoYWxmX3JpY2hjb21wYXJlKHYsIHcsIG9wKTsKKyAgICAgICAgaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgIH0KIAotCWlmIChQeUluc3RhbmNlX0NoZWNrKHcpKSB7Ci0JCXJlcyA9IGhhbGZfcmljaGNvbXBhcmUodywgdiwgX1B5X1N3YXBwZWRPcFtvcF0pOwotCQlpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHJlczsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JfQorICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHcpKSB7CisgICAgICAgIHJlcyA9IGhhbGZfcmljaGNvbXBhcmUodywgdiwgX1B5X1N3YXBwZWRPcFtvcF0pOworICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIApAQCAtMjAzMyw0MiArMjAzMyw0MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2dldGl0ZXIoUHlJbnN0YW5jZU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqZnVuYzsKIAotCWlmIChpdGVyc3RyID09IE5VTEwpIHsKLQkJaXRlcnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faXRlcl9fIik7Ci0JCWlmIChpdGVyc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkgewotCQlnZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRpdGVtX18iKTsKLQkJaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoaXRlcnN0ciA9PSBOVUxMKSB7CisgICAgICAgIGl0ZXJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2l0ZXJfXyIpOworICAgICAgICBpZiAoaXRlcnN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChnZXRpdGVtc3RyID09IE5VTEwpIHsKKyAgICAgICAgZ2V0aXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0aXRlbV9fIik7CisgICAgICAgIGlmIChnZXRpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIGl0ZXJzdHIpKSAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlpZiAocmVzICE9IE5VTEwgJiYgIVB5SXRlcl9DaGVjayhyZXMpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIl9faXRlcl9fIHJldHVybmVkIG5vbi1pdGVyYXRvciAiCi0JCQkJICAgICAib2YgdHlwZSAnJS4xMDBzJyIsCi0JCQkJICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlyZXMgPSBOVUxMOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCXJldHVybiBOVUxMOwotCVB5RXJyX0NsZWFyKCk7Ci0JaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBnZXRpdGVtc3RyKSkgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpdGVyYXRpb24gb3ZlciBub24tc2VxdWVuY2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gUHlTZXFJdGVyX05ldygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIGl0ZXJzdHIpKSAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBpZiAocmVzICE9IE5VTEwgJiYgIVB5SXRlcl9DaGVjayhyZXMpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJfX2l0ZXJfXyByZXR1cm5lZCBub24taXRlcmF0b3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJvZiB0eXBlICclLjEwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBnZXRpdGVtc3RyKSkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdGlvbiBvdmVyIG5vbi1zZXF1ZW5jZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiBQeVNlcUl0ZXJfTmV3KChQeU9iamVjdCAqKXNlbGYpOwogfQogCiAKQEAgLTIwNzYsMTQ2ICsyMDc2LDE0NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2l0ZXJuZXh0KFB5SW5zdGFuY2VPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKmZ1bmM7CiAKLQlpZiAobmV4dHN0ciA9PSBOVUxMKSB7Ci0JCW5leHRzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJuZXh0Iik7Ci0JCWlmIChuZXh0c3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG5leHRzdHIgPT0gTlVMTCkgeworICAgICAgICBuZXh0c3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygibmV4dCIpOworICAgICAgICBpZiAobmV4dHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBuZXh0c3RyKSkgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnN0YW5jZSBoYXMgbm8gbmV4dCgpIG1ldGhvZCIpOwotCXJldHVybiBOVUxMOworICAgIGlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgbmV4dHN0cikpICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIGlmIChyZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaW5zdGFuY2UgaGFzIG5vIG5leHQoKSBtZXRob2QiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2NhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmVzLCAqY2FsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuYywgIl9fY2FsbF9fIik7Ci0JaWYgKGNhbGwgPT0gTlVMTCkgewotCQlQeUluc3RhbmNlT2JqZWN0ICppbnN0ID0gKFB5SW5zdGFuY2VPYmplY3QqKSBmdW5jOwotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgIiUuMjAwcyBpbnN0YW5jZSBoYXMgbm8gX19jYWxsX18gbWV0aG9kIiwKLQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcoaW5zdC0+aW5fY2xhc3MtPmNsX25hbWUpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFdlIG11c3QgY2hlY2sgYW5kIGluY3JlbWVudCB0aGUgcmVjdXJzaW9uIGRlcHRoIGhlcmUuIFNjZW5hcmlvOgotCSAgICAgICBjbGFzcyBBOgotCSAgICAgICAgICAgcGFzcwotCSAgICAgICBBLl9fY2FsbF9fID0gQSgpICMgdGhhdCdzIHJpZ2h0Ci0JICAgICAgIGEgPSBBKCkgIyBvawotCSAgICAgICBhKCkgIyBpbmZpbml0ZSByZWN1cnNpb24KLQkgICBUaGlzIGJvdW5jZXMgYmV0d2VlbiBpbnN0YW5jZV9jYWxsKCkgYW5kIFB5T2JqZWN0X0NhbGwoKSB3aXRob3V0Ci0JICAgZXZlciBoaXR0aW5nIGV2YWxfZnJhbWUoKSAod2hpY2ggaGFzIHRoZSBtYWluIHJlY3Vyc2lvbiBjaGVjaykuICovCi0JaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIF9fY2FsbF9fIikpIHsKLQkJcmVzID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCXJlcyA9IFB5T2JqZWN0X0NhbGwoY2FsbCwgYXJnLCBrdyk7Ci0JCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCX0KLQlQeV9ERUNSRUYoY2FsbCk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeU9iamVjdCAqcmVzLCAqY2FsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuYywgIl9fY2FsbF9fIik7CisgICAgaWYgKGNhbGwgPT0gTlVMTCkgeworICAgICAgICBQeUluc3RhbmNlT2JqZWN0ICppbnN0ID0gKFB5SW5zdGFuY2VPYmplY3QqKSBmdW5jOworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMgaW5zdGFuY2UgaGFzIG5vIF9fY2FsbF9fIG1ldGhvZCIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhpbnN0LT5pbl9jbGFzcy0+Y2xfbmFtZSkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogV2UgbXVzdCBjaGVjayBhbmQgaW5jcmVtZW50IHRoZSByZWN1cnNpb24gZGVwdGggaGVyZS4gU2NlbmFyaW86CisgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgQS5fX2NhbGxfXyA9IEEoKSAjIHRoYXQncyByaWdodAorICAgICAgICAgICBhID0gQSgpICMgb2sKKyAgICAgICAgICAgYSgpICMgaW5maW5pdGUgcmVjdXJzaW9uCisgICAgICAgVGhpcyBib3VuY2VzIGJldHdlZW4gaW5zdGFuY2VfY2FsbCgpIGFuZCBQeU9iamVjdF9DYWxsKCkgd2l0aG91dAorICAgICAgIGV2ZXIgaGl0dGluZyBldmFsX2ZyYW1lKCkgKHdoaWNoIGhhcyB0aGUgbWFpbiByZWN1cnNpb24gY2hlY2spLiAqLworICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBpbiBfX2NhbGxfXyIpKSB7CisgICAgICAgIHJlcyA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsKGNhbGwsIGFyZywga3cpOworICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGNhbGwpOworICAgIHJldHVybiByZXM7CiB9CiAKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBpbnN0YW5jZV9hc19udW1iZXIgPSB7Ci0JaW5zdGFuY2VfYWRkLAkJCS8qIG5iX2FkZCAqLwotCWluc3RhbmNlX3N1YiwJCQkvKiBuYl9zdWJ0cmFjdCAqLwotCWluc3RhbmNlX211bCwJCQkvKiBuYl9tdWx0aXBseSAqLwotCWluc3RhbmNlX2RpdiwJCQkvKiBuYl9kaXZpZGUgKi8KLQlpbnN0YW5jZV9tb2QsCQkJLyogbmJfcmVtYWluZGVyICovCi0JaW5zdGFuY2VfZGl2bW9kLAkJLyogbmJfZGl2bW9kICovCi0JaW5zdGFuY2VfcG93LAkJCS8qIG5iX3Bvd2VyICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9uZWcsCS8qIG5iX25lZ2F0aXZlICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9wb3MsCS8qIG5iX3Bvc2l0aXZlICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9hYnMsCS8qIG5iX2Fic29sdXRlICovCi0JKGlucXVpcnkpaW5zdGFuY2Vfbm9uemVybywJLyogbmJfbm9uemVybyAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfaW52ZXJ0LAkvKiBuYl9pbnZlcnQgKi8KLQlpbnN0YW5jZV9sc2hpZnQsCQkvKiBuYl9sc2hpZnQgKi8KLQlpbnN0YW5jZV9yc2hpZnQsCQkvKiBuYl9yc2hpZnQgKi8KLQlpbnN0YW5jZV9hbmQsCQkJLyogbmJfYW5kICovCi0JaW5zdGFuY2VfeG9yLAkJCS8qIG5iX3hvciAqLwotCWluc3RhbmNlX29yLAkJCS8qIG5iX29yICovCi0JaW5zdGFuY2VfY29lcmNlLAkJLyogbmJfY29lcmNlICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9pbnQsCS8qIG5iX2ludCAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfbG9uZywJLyogbmJfbG9uZyAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfZmxvYXQsCS8qIG5iX2Zsb2F0ICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9vY3QsCS8qIG5iX29jdCAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfaGV4LAkvKiBuYl9oZXggKi8KLQlpbnN0YW5jZV9pYWRkLAkJCS8qIG5iX2lucGxhY2VfYWRkICovCi0JaW5zdGFuY2VfaXN1YiwJCQkvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCi0JaW5zdGFuY2VfaW11bCwJCQkvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCi0JaW5zdGFuY2VfaWRpdiwJCQkvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLwotCWluc3RhbmNlX2ltb2QsCQkJLyogbmJfaW5wbGFjZV9yZW1haW5kZXIgKi8KLQlpbnN0YW5jZV9pcG93LAkJCS8qIG5iX2lucGxhY2VfcG93ZXIgKi8KLQlpbnN0YW5jZV9pbHNoaWZ0LAkJLyogbmJfaW5wbGFjZV9sc2hpZnQgKi8KLQlpbnN0YW5jZV9pcnNoaWZ0LAkJLyogbmJfaW5wbGFjZV9yc2hpZnQgKi8KLQlpbnN0YW5jZV9pYW5kLAkJCS8qIG5iX2lucGxhY2VfYW5kICovCi0JaW5zdGFuY2VfaXhvciwJCQkvKiBuYl9pbnBsYWNlX3hvciAqLwotCWluc3RhbmNlX2lvciwJCQkvKiBuYl9pbnBsYWNlX29yICovCi0JaW5zdGFuY2VfZmxvb3JkaXYsCQkvKiBuYl9mbG9vcl9kaXZpZGUgKi8KLQlpbnN0YW5jZV90cnVlZGl2LAkJLyogbmJfdHJ1ZV9kaXZpZGUgKi8KLQlpbnN0YW5jZV9pZmxvb3JkaXYsCQkvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLwotCWluc3RhbmNlX2l0cnVlZGl2LAkJLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfaW5kZXgsCS8qIG5iX2luZGV4ICovCisgICAgaW5zdGFuY2VfYWRkLCAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWRkICovCisgICAgaW5zdGFuY2Vfc3ViLCAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfc3VidHJhY3QgKi8KKyAgICBpbnN0YW5jZV9tdWwsICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIGluc3RhbmNlX2RpdiwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2RpdmlkZSAqLworICAgIGluc3RhbmNlX21vZCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3JlbWFpbmRlciAqLworICAgIGluc3RhbmNlX2Rpdm1vZCwgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIGluc3RhbmNlX3BvdywgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3Bvd2VyICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9uZWcsICAgICAgICAgICAgLyogbmJfbmVnYXRpdmUgKi8KKyAgICAodW5hcnlmdW5jKWluc3RhbmNlX3BvcywgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgICh1bmFyeWZ1bmMpaW5zdGFuY2VfYWJzLCAgICAgICAgICAgIC8qIG5iX2Fic29sdXRlICovCisgICAgKGlucXVpcnkpaW5zdGFuY2Vfbm9uemVybywgICAgICAgICAgLyogbmJfbm9uemVybyAqLworICAgICh1bmFyeWZ1bmMpaW5zdGFuY2VfaW52ZXJ0LCAgICAgICAgIC8qIG5iX2ludmVydCAqLworICAgIGluc3RhbmNlX2xzaGlmdCwgICAgICAgICAgICAgICAgICAgIC8qIG5iX2xzaGlmdCAqLworICAgIGluc3RhbmNlX3JzaGlmdCwgICAgICAgICAgICAgICAgICAgIC8qIG5iX3JzaGlmdCAqLworICAgIGluc3RhbmNlX2FuZCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2FuZCAqLworICAgIGluc3RhbmNlX3hvciwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3hvciAqLworICAgIGluc3RhbmNlX29yLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX29yICovCisgICAgaW5zdGFuY2VfY29lcmNlLCAgICAgICAgICAgICAgICAgICAgLyogbmJfY29lcmNlICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9pbnQsICAgICAgICAgICAgLyogbmJfaW50ICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9sb25nLCAgICAgICAgICAgLyogbmJfbG9uZyAqLworICAgICh1bmFyeWZ1bmMpaW5zdGFuY2VfZmxvYXQsICAgICAgICAgIC8qIG5iX2Zsb2F0ICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9vY3QsICAgICAgICAgICAgLyogbmJfb2N0ICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9oZXgsICAgICAgICAgICAgLyogbmJfaGV4ICovCisgICAgaW5zdGFuY2VfaWFkZCwgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hZGQgKi8KKyAgICBpbnN0YW5jZV9pc3ViLCAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCisgICAgaW5zdGFuY2VfaW11bCwgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9tdWx0aXBseSAqLworICAgIGluc3RhbmNlX2lkaXYsICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfZGl2aWRlICovCisgICAgaW5zdGFuY2VfaW1vZCwgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9yZW1haW5kZXIgKi8KKyAgICBpbnN0YW5jZV9pcG93LCAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3Bvd2VyICovCisgICAgaW5zdGFuY2VfaWxzaGlmdCwgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9sc2hpZnQgKi8KKyAgICBpbnN0YW5jZV9pcnNoaWZ0LCAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLworICAgIGluc3RhbmNlX2lhbmQsICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfYW5kICovCisgICAgaW5zdGFuY2VfaXhvciwgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV94b3IgKi8KKyAgICBpbnN0YW5jZV9pb3IsICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX29yICovCisgICAgaW5zdGFuY2VfZmxvb3JkaXYsICAgICAgICAgICAgICAgICAgLyogbmJfZmxvb3JfZGl2aWRlICovCisgICAgaW5zdGFuY2VfdHJ1ZWRpdiwgICAgICAgICAgICAgICAgICAgLyogbmJfdHJ1ZV9kaXZpZGUgKi8KKyAgICBpbnN0YW5jZV9pZmxvb3JkaXYsICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLworICAgIGluc3RhbmNlX2l0cnVlZGl2LCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KKyAgICAodW5hcnlmdW5jKWluc3RhbmNlX2luZGV4LCAgICAgICAgICAvKiBuYl9pbmRleCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5SW5zdGFuY2VfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCi0JImluc3RhbmNlIiwKLQlzaXplb2YoUHlJbnN0YW5jZU9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilpbnN0YW5jZV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQlpbnN0YW5jZV9jb21wYXJlLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpaW5zdGFuY2VfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkmaW5zdGFuY2VfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCSZpbnN0YW5jZV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZpbnN0YW5jZV9hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpaW5zdGFuY2VfaGFzaCwJCS8qIHRwX2hhc2ggKi8KLQlpbnN0YW5jZV9jYWxsLAkJCQkvKiB0cF9jYWxsICovCi0JKHJlcHJmdW5jKWluc3RhbmNlX3N0ciwJCQkvKiB0cF9zdHIgKi8KLQkoZ2V0YXR0cm9mdW5jKWluc3RhbmNlX2dldGF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCShzZXRhdHRyb2Z1bmMpaW5zdGFuY2Vfc2V0YXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUywvKnRwX2ZsYWdzKi8KLQlpbnN0YW5jZV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpaW5zdGFuY2VfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JaW5zdGFuY2VfcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLSAJb2Zmc2V0b2YoUHlJbnN0YW5jZU9iamVjdCwgaW5fd2Vha3JlZmxpc3QpLCAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCShnZXRpdGVyZnVuYylpbnN0YW5jZV9nZXRpdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpaW5zdGFuY2VfaXRlcm5leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JaW5zdGFuY2VfbmV3LAkJCQkvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsCisgICAgImluc3RhbmNlIiwKKyAgICBzaXplb2YoUHlJbnN0YW5jZU9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilpbnN0YW5jZV9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgaW5zdGFuY2VfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWluc3RhbmNlX3JlcHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmluc3RhbmNlX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmaW5zdGFuY2VfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJmluc3RhbmNlX2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWluc3RhbmNlX2hhc2gsICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgaW5zdGFuY2VfY2FsbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKWluc3RhbmNlX3N0ciwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAoZ2V0YXR0cm9mdW5jKWluc3RhbmNlX2dldGF0dHIsICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgKHNldGF0dHJvZnVuYylpbnN0YW5jZV9zZXRhdHRyLCAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTLC8qdHBfZmxhZ3MqLworICAgIGluc3RhbmNlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylpbnN0YW5jZV90cmF2ZXJzZSwgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICBpbnN0YW5jZV9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlJbnN0YW5jZU9iamVjdCwgaW5fd2Vha3JlZmxpc3QpLCAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIChnZXRpdGVyZnVuYylpbnN0YW5jZV9nZXRpdGVyLCAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpaW5zdGFuY2VfaXRlcm5leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaW5zdGFuY2VfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIApAQCAtMjIyOCwyNyArMjIyOCwyNyBAQAogUHlPYmplY3QgKgogUHlNZXRob2RfTmV3KFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmtsYXNzKQogewotCXJlZ2lzdGVyIFB5TWV0aG9kT2JqZWN0ICppbTsKLQlpbSA9IGZyZWVfbGlzdDsKLQlpZiAoaW0gIT0gTlVMTCkgewotCQlmcmVlX2xpc3QgPSAoUHlNZXRob2RPYmplY3QgKikoaW0tPmltX3NlbGYpOwotCQlQeU9iamVjdF9JTklUKGltLCAmUHlNZXRob2RfVHlwZSk7Ci0JCW51bWZyZWUtLTsKLQl9Ci0JZWxzZSB7Ci0JCWltID0gUHlPYmplY3RfR0NfTmV3KFB5TWV0aG9kT2JqZWN0LCAmUHlNZXRob2RfVHlwZSk7Ci0JCWlmIChpbSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWltLT5pbV93ZWFrcmVmbGlzdCA9IE5VTEw7Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCWltLT5pbV9mdW5jID0gZnVuYzsKLQlQeV9YSU5DUkVGKHNlbGYpOwotCWltLT5pbV9zZWxmID0gc2VsZjsKLQlQeV9YSU5DUkVGKGtsYXNzKTsKLQlpbS0+aW1fY2xhc3MgPSBrbGFzczsKLQlfUHlPYmplY3RfR0NfVFJBQ0soaW0pOwotCXJldHVybiAoUHlPYmplY3QgKilpbTsKKyAgICByZWdpc3RlciBQeU1ldGhvZE9iamVjdCAqaW07CisgICAgaW0gPSBmcmVlX2xpc3Q7CisgICAgaWYgKGltICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZV9saXN0ID0gKFB5TWV0aG9kT2JqZWN0ICopKGltLT5pbV9zZWxmKTsKKyAgICAgICAgUHlPYmplY3RfSU5JVChpbSwgJlB5TWV0aG9kX1R5cGUpOworICAgICAgICBudW1mcmVlLS07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbSA9IFB5T2JqZWN0X0dDX05ldyhQeU1ldGhvZE9iamVjdCwgJlB5TWV0aG9kX1R5cGUpOworICAgICAgICBpZiAoaW0gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpbS0+aW1fd2Vha3JlZmxpc3QgPSBOVUxMOworICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICBpbS0+aW1fZnVuYyA9IGZ1bmM7CisgICAgUHlfWElOQ1JFRihzZWxmKTsKKyAgICBpbS0+aW1fc2VsZiA9IHNlbGY7CisgICAgUHlfWElOQ1JFRihrbGFzcyk7CisgICAgaW0tPmltX2NsYXNzID0ga2xhc3M7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGltKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaW07CiB9CiAKIC8qIERlc2NyaXB0b3JzIGZvciBQeU1ldGhvZCBhdHRyaWJ1dGVzICovCkBAIC0yMjU4LDE3ICsyMjU4LDE3IEBACiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeU1ldGhvZE9iamVjdCwgeCkKIAogc3RhdGljIFB5TWVtYmVyRGVmIGluc3RhbmNlbWV0aG9kX21lbWJlcmxpc3RbXSA9IHsKLQl7ImltX2NsYXNzIiwJVF9PQkpFQ1QsCU9GRihpbV9jbGFzcyksCVJFQURPTkxZfFJFU1RSSUNURUQsCi0JICJ0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kIn0sCi0JeyJpbV9mdW5jIiwJVF9PQkpFQ1QsCU9GRihpbV9mdW5jKSwJUkVBRE9OTFl8UkVTVFJJQ1RFRCwKLQkgInRoZSBmdW5jdGlvbiAob3Igb3RoZXIgY2FsbGFibGUpIGltcGxlbWVudGluZyBhIG1ldGhvZCJ9LAotCXsiX19mdW5jX18iLAlUX09CSkVDVCwJT0ZGKGltX2Z1bmMpLAlSRUFET05MWXxSRVNUUklDVEVELAotCSAidGhlIGZ1bmN0aW9uIChvciBvdGhlciBjYWxsYWJsZSkgaW1wbGVtZW50aW5nIGEgbWV0aG9kIn0sCi0JeyJpbV9zZWxmIiwJVF9PQkpFQ1QsCU9GRihpbV9zZWxmKSwJUkVBRE9OTFl8UkVTVFJJQ1RFRCwKLQkgInRoZSBpbnN0YW5jZSB0byB3aGljaCBhIG1ldGhvZCBpcyBib3VuZDsgTm9uZSBmb3IgdW5ib3VuZCBtZXRob2RzIn0sCi0JeyJfX3NlbGZfXyIsCVRfT0JKRUNULAlPRkYoaW1fc2VsZiksCVJFQURPTkxZfFJFU1RSSUNURUQsCi0JICJ0aGUgaW5zdGFuY2UgdG8gd2hpY2ggYSBtZXRob2QgaXMgYm91bmQ7IE5vbmUgZm9yIHVuYm91bmQgbWV0aG9kcyJ9LAotCXtOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsiaW1fY2xhc3MiLCAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihpbV9jbGFzcyksICBSRUFET05MWXxSRVNUUklDVEVELAorICAgICAidGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCJ9LAorICAgIHsiaW1fZnVuYyIsICAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihpbV9mdW5jKSwgICBSRUFET05MWXxSRVNUUklDVEVELAorICAgICAidGhlIGZ1bmN0aW9uIChvciBvdGhlciBjYWxsYWJsZSkgaW1wbGVtZW50aW5nIGEgbWV0aG9kIn0sCisgICAgeyJfX2Z1bmNfXyIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGltX2Z1bmMpLCAgIFJFQURPTkxZfFJFU1RSSUNURUQsCisgICAgICJ0aGUgZnVuY3Rpb24gKG9yIG90aGVyIGNhbGxhYmxlKSBpbXBsZW1lbnRpbmcgYSBtZXRob2QifSwKKyAgICB7ImltX3NlbGYiLCAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoaW1fc2VsZiksICAgUkVBRE9OTFl8UkVTVFJJQ1RFRCwKKyAgICAgInRoZSBpbnN0YW5jZSB0byB3aGljaCBhIG1ldGhvZCBpcyBib3VuZDsgTm9uZSBmb3IgdW5ib3VuZCBtZXRob2RzIn0sCisgICAgeyJfX3NlbGZfXyIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGltX3NlbGYpLCAgIFJFQURPTkxZfFJFU1RSSUNURUQsCisgICAgICJ0aGUgaW5zdGFuY2UgdG8gd2hpY2ggYSBtZXRob2QgaXMgYm91bmQ7IE5vbmUgZm9yIHVuYm91bmQgbWV0aG9kcyJ9LAorICAgIHtOVUxMfSAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAvKiBDaHJpc3RpYW4gVGlzbWVyIGFyZ3VlZCBjb252aW5jaW5nbHkgdGhhdCBtZXRob2QgYXR0cmlidXRlcyBzaG91bGQKQEAgLTIyNzksNDYgKzIyNzksNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZW1ldGhvZF9nZXRfZG9jKFB5TWV0aG9kT2JqZWN0ICppbSwgdm9pZCAqY29udGV4dCkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmRvY3N0cjsKLQlpZiAoZG9jc3RyID09IE5VTEwpIHsKLQkJZG9jc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RvY19fIik7Ci0JCWlmIChkb2NzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlPYmplY3RfR2V0QXR0cihpbS0+aW1fZnVuYywgZG9jc3RyKTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmRvY3N0cjsKKyAgICBpZiAoZG9jc3RyID09IE5VTEwpIHsKKyAgICAgICAgZG9jc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RvY19fIik7CisgICAgICAgIGlmIChkb2NzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlPYmplY3RfR2V0QXR0cihpbS0+aW1fZnVuYywgZG9jc3RyKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGluc3RhbmNlbWV0aG9kX2dldHNldFtdID0gewotCXsiX19kb2NfXyIsIChnZXR0ZXIpaW5zdGFuY2VtZXRob2RfZ2V0X2RvYywgTlVMTCwgTlVMTH0sCi0JezB9CisgICAgeyJfX2RvY19fIiwgKGdldHRlcilpbnN0YW5jZW1ldGhvZF9nZXRfZG9jLCBOVUxMLCBOVUxMfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZW1ldGhvZF9nZXRhdHRybyhQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeU1ldGhvZE9iamVjdCAqaW0gPSAoUHlNZXRob2RPYmplY3QgKilvYmo7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IG9iai0+b2JfdHlwZTsKLQlQeU9iamVjdCAqZGVzY3IgPSBOVUxMOworICAgIFB5TWV0aG9kT2JqZWN0ICppbSA9IChQeU1ldGhvZE9iamVjdCAqKW9iajsKKyAgICBQeVR5cGVPYmplY3QgKnRwID0gb2JqLT5vYl90eXBlOworICAgIFB5T2JqZWN0ICpkZXNjciA9IE5VTEw7CiAKLQlpZiAoUHlUeXBlX0hhc0ZlYXR1cmUodHAsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpIHsKLQkJaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJCWlmIChQeVR5cGVfUmVhZHkodHApIDwgMCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlkZXNjciA9IF9QeVR5cGVfTG9va3VwKHRwLCBuYW1lKTsKLQl9CisgICAgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHRwLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKSB7CisgICAgICAgIGlmICh0cC0+dHBfZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHRwKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZGVzY3IgPSBfUHlUeXBlX0xvb2t1cCh0cCwgbmFtZSk7CisgICAgfQogCi0JaWYgKGRlc2NyICE9IE5VTEwpIHsKLQkJZGVzY3JnZXRmdW5jIGYgPSBUUF9ERVNDUl9HRVQoZGVzY3ItPm9iX3R5cGUpOwotCQlpZiAoZiAhPSBOVUxMKQotCQkJcmV0dXJuIGYoZGVzY3IsIG9iaiwgKFB5T2JqZWN0ICopb2JqLT5vYl90eXBlKTsKLQkJZWxzZSB7Ci0JCQlQeV9JTkNSRUYoZGVzY3IpOwotCQkJcmV0dXJuIGRlc2NyOwotCQl9Ci0JfQorICAgIGlmIChkZXNjciAhPSBOVUxMKSB7CisgICAgICAgIGRlc2NyZ2V0ZnVuYyBmID0gVFBfREVTQ1JfR0VUKGRlc2NyLT5vYl90eXBlKTsKKyAgICAgICAgaWYgKGYgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBmKGRlc2NyLCBvYmosIChQeU9iamVjdCAqKW9iai0+b2JfdHlwZSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKGRlc2NyKTsKKyAgICAgICAgICAgIHJldHVybiBkZXNjcjsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBQeU9iamVjdF9HZXRBdHRyKGltLT5pbV9mdW5jLCBuYW1lKTsKKyAgICByZXR1cm4gUHlPYmplY3RfR2V0QXR0cihpbS0+aW1fZnVuYywgbmFtZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihpbnN0YW5jZW1ldGhvZF9kb2MsCkBAIC0yMzI5LDMyMyArMjMyOSwzMjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZW1ldGhvZF9uZXcoUHlUeXBlT2JqZWN0KiB0eXBlLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICpjbGFzc09iaiA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKmNsYXNzT2JqID0gTlVMTDsKIAotCWlmICghX1B5QXJnX05vS2V5d29yZHMoImluc3RhbmNlbWV0aG9kIiwga3cpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpbnN0YW5jZW1ldGhvZCIsIDIsIDMsCi0JCQkgICAgICAmZnVuYywgJnNlbGYsICZjbGFzc09iaikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc2VsZiA9PSBQeV9Ob25lKQotCQlzZWxmID0gTlVMTDsKLQlpZiAoc2VsZiA9PSBOVUxMICYmIGNsYXNzT2JqID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ1bmJvdW5kIG1ldGhvZHMgbXVzdCBoYXZlIG5vbi1OVUxMIGltX2NsYXNzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJpbnN0YW5jZW1ldGhvZCIsIGt3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaW5zdGFuY2VtZXRob2QiLCAyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVuYywgJnNlbGYsICZjbGFzc09iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzZWxmID09IFB5X05vbmUpCisgICAgICAgIHNlbGYgPSBOVUxMOworICAgIGlmIChzZWxmID09IE5VTEwgJiYgY2xhc3NPYmogPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgInVuYm91bmQgbWV0aG9kcyBtdXN0IGhhdmUgbm9uLU5VTEwgaW1fY2xhc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5TWV0aG9kX05ldyhmdW5jLCBzZWxmLCBjbGFzc09iaik7CisgICAgcmV0dXJuIFB5TWV0aG9kX05ldyhmdW5jLCBzZWxmLCBjbGFzc09iaik7CiB9CiAKIHN0YXRpYyB2b2lkCiBpbnN0YW5jZW1ldGhvZF9kZWFsbG9jKHJlZ2lzdGVyIFB5TWV0aG9kT2JqZWN0ICppbSkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhpbSk7Ci0JaWYgKGltLT5pbV93ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKWltKTsKLQlQeV9ERUNSRUYoaW0tPmltX2Z1bmMpOwotCVB5X1hERUNSRUYoaW0tPmltX3NlbGYpOwotCVB5X1hERUNSRUYoaW0tPmltX2NsYXNzKTsKLQlpZiAobnVtZnJlZSA8IFB5TWV0aG9kX01BWEZSRUVMSVNUKSB7Ci0JCWltLT5pbV9zZWxmID0gKFB5T2JqZWN0ICopZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSBpbTsKLQkJbnVtZnJlZSsrOwotCX0KLQllbHNlIHsKLQkJUHlPYmplY3RfR0NfRGVsKGltKTsKLQl9CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soaW0pOworICAgIGlmIChpbS0+aW1fd2Vha3JlZmxpc3QgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKilpbSk7CisgICAgUHlfREVDUkVGKGltLT5pbV9mdW5jKTsKKyAgICBQeV9YREVDUkVGKGltLT5pbV9zZWxmKTsKKyAgICBQeV9YREVDUkVGKGltLT5pbV9jbGFzcyk7CisgICAgaWYgKG51bWZyZWUgPCBQeU1ldGhvZF9NQVhGUkVFTElTVCkgeworICAgICAgICBpbS0+aW1fc2VsZiA9IChQeU9iamVjdCAqKWZyZWVfbGlzdDsKKyAgICAgICAgZnJlZV9saXN0ID0gaW07CisgICAgICAgIG51bWZyZWUrKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChpbSk7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZW1ldGhvZF9jb21wYXJlKFB5TWV0aG9kT2JqZWN0ICphLCBQeU1ldGhvZE9iamVjdCAqYikKIHsKLQlpbnQgY21wOwotCWNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoYS0+aW1fZnVuYywgYi0+aW1fZnVuYyk7Ci0JaWYgKGNtcCkKLQkJcmV0dXJuIGNtcDsKKyAgICBpbnQgY21wOworICAgIGNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoYS0+aW1fZnVuYywgYi0+aW1fZnVuYyk7CisgICAgaWYgKGNtcCkKKyAgICAgICAgcmV0dXJuIGNtcDsKIAotCWlmIChhLT5pbV9zZWxmID09IGItPmltX3NlbGYpCi0JCXJldHVybiAwOwotCWlmIChhLT5pbV9zZWxmID09IE5VTEwgfHwgYi0+aW1fc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gKGEtPmltX3NlbGYgPCBiLT5pbV9zZWxmKSA/IC0xIDogMTsKLQllbHNlCi0JCXJldHVybiBQeU9iamVjdF9Db21wYXJlKGEtPmltX3NlbGYsIGItPmltX3NlbGYpOworICAgIGlmIChhLT5pbV9zZWxmID09IGItPmltX3NlbGYpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhLT5pbV9zZWxmID09IE5VTEwgfHwgYi0+aW1fc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKGEtPmltX3NlbGYgPCBiLT5pbV9zZWxmKSA/IC0xIDogMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeU9iamVjdF9Db21wYXJlKGEtPmltX3NlbGYsIGItPmltX3NlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VtZXRob2RfcmVwcihQeU1ldGhvZE9iamVjdCAqYSkKIHsKLQlQeU9iamVjdCAqc2VsZiA9IGEtPmltX3NlbGY7Ci0JUHlPYmplY3QgKmZ1bmMgPSBhLT5pbV9mdW5jOwotCVB5T2JqZWN0ICprbGFzcyA9IGEtPmltX2NsYXNzOwotCVB5T2JqZWN0ICpmdW5jbmFtZSA9IE5VTEwsICprbGFzc25hbWUgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKLQljaGFyICpzZnVuY25hbWUgPSAiPyIsICpza2xhc3NuYW1lID0gIj8iOworICAgIFB5T2JqZWN0ICpzZWxmID0gYS0+aW1fc2VsZjsKKyAgICBQeU9iamVjdCAqZnVuYyA9IGEtPmltX2Z1bmM7CisgICAgUHlPYmplY3QgKmtsYXNzID0gYS0+aW1fY2xhc3M7CisgICAgUHlPYmplY3QgKmZ1bmNuYW1lID0gTlVMTCwgKmtsYXNzbmFtZSA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOworICAgIGNoYXIgKnNmdW5jbmFtZSA9ICI/IiwgKnNrbGFzc25hbWUgPSAiPyI7CiAKLQlmdW5jbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuYywgIl9fbmFtZV9fIik7Ci0JaWYgKGZ1bmNuYW1lID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiBOVUxMOwotCQlQeUVycl9DbGVhcigpOwotCX0KLQllbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soZnVuY25hbWUpKSB7Ci0JCVB5X0RFQ1JFRihmdW5jbmFtZSk7Ci0JCWZ1bmNuYW1lID0gTlVMTDsKLQl9Ci0JZWxzZQotCQlzZnVuY25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoZnVuY25hbWUpOwotCWlmIChrbGFzcyA9PSBOVUxMKQotCQlrbGFzc25hbWUgPSBOVUxMOwotCWVsc2UgewotCQlrbGFzc25hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGtsYXNzLCAiX19uYW1lX18iKTsKLQkJaWYgKGtsYXNzbmFtZSA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCXJldHVybiBOVUxMOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCQllbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soa2xhc3NuYW1lKSkgewotCQkJUHlfREVDUkVGKGtsYXNzbmFtZSk7Ci0JCQlrbGFzc25hbWUgPSBOVUxMOwotCQl9Ci0JCWVsc2UKLQkJCXNrbGFzc25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoa2xhc3NuYW1lKTsKLQl9Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPHVuYm91bmQgbWV0aG9kICVzLiVzPiIsCi0JCQkJCSAgICAgc2tsYXNzbmFtZSwgc2Z1bmNuYW1lKTsKLQllbHNlIHsKLQkJLyogWFhYIFNob3VsZG4ndCB1c2UgcmVwcigpIGhlcmUhICovCi0JCVB5T2JqZWN0ICpzZWxmcmVwciA9IFB5T2JqZWN0X1JlcHIoc2VsZik7Ci0JCWlmIChzZWxmcmVwciA9PSBOVUxMKQotCQkJZ290byBmYWlsOwotCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHNlbGZyZXByKSkgewotCQkJUHlfREVDUkVGKHNlbGZyZXByKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Ym91bmQgbWV0aG9kICVzLiVzIG9mICVzPiIsCi0JCQkJCSAgICAgc2tsYXNzbmFtZSwgc2Z1bmNuYW1lLAotCQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmcmVwcikpOwotCQlQeV9ERUNSRUYoc2VsZnJlcHIpOwotCX0KKyAgICBmdW5jbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuYywgIl9fbmFtZV9fIik7CisgICAgaWYgKGZ1bmNuYW1lID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soZnVuY25hbWUpKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jbmFtZSk7CisgICAgICAgIGZ1bmNuYW1lID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzZnVuY25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoZnVuY25hbWUpOworICAgIGlmIChrbGFzcyA9PSBOVUxMKQorICAgICAgICBrbGFzc25hbWUgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBrbGFzc25hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGtsYXNzLCAiX19uYW1lX18iKTsKKyAgICAgICAgaWYgKGtsYXNzbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soa2xhc3NuYW1lKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGtsYXNzbmFtZSk7CisgICAgICAgICAgICBrbGFzc25hbWUgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNrbGFzc25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoa2xhc3NuYW1lKTsKKyAgICB9CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPHVuYm91bmQgbWV0aG9kICVzLiVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tsYXNzbmFtZSwgc2Z1bmNuYW1lKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogWFhYIFNob3VsZG4ndCB1c2UgcmVwcigpIGhlcmUhICovCisgICAgICAgIFB5T2JqZWN0ICpzZWxmcmVwciA9IFB5T2JqZWN0X1JlcHIoc2VsZik7CisgICAgICAgIGlmIChzZWxmcmVwciA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHNlbGZyZXByKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGZyZXByKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Ym91bmQgbWV0aG9kICVzLiVzIG9mICVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tsYXNzbmFtZSwgc2Z1bmNuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmcmVwcikpOworICAgICAgICBQeV9ERUNSRUYoc2VsZnJlcHIpOworICAgIH0KICAgZmFpbDoKLQlQeV9YREVDUkVGKGZ1bmNuYW1lKTsKLQlQeV9YREVDUkVGKGtsYXNzbmFtZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGZ1bmNuYW1lKTsKKyAgICBQeV9YREVDUkVGKGtsYXNzbmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGxvbmcKIGluc3RhbmNlbWV0aG9kX2hhc2goUHlNZXRob2RPYmplY3QgKmEpCiB7Ci0JbG9uZyB4LCB5OwotCWlmIChhLT5pbV9zZWxmID09IE5VTEwpCi0JCXggPSBQeU9iamVjdF9IYXNoKFB5X05vbmUpOwotCWVsc2UKLQkJeCA9IFB5T2JqZWN0X0hhc2goYS0+aW1fc2VsZik7Ci0JaWYgKHggPT0gLTEpCi0JCXJldHVybiAtMTsKLQl5ID0gUHlPYmplY3RfSGFzaChhLT5pbV9mdW5jKTsKLQlpZiAoeSA9PSAtMSkKLQkJcmV0dXJuIC0xOwotCXggPSB4IF4geTsKLQlpZiAoeCA9PSAtMSkKLQkJeCA9IC0yOwotCXJldHVybiB4OworICAgIGxvbmcgeCwgeTsKKyAgICBpZiAoYS0+aW1fc2VsZiA9PSBOVUxMKQorICAgICAgICB4ID0gUHlPYmplY3RfSGFzaChQeV9Ob25lKTsKKyAgICBlbHNlCisgICAgICAgIHggPSBQeU9iamVjdF9IYXNoKGEtPmltX3NlbGYpOworICAgIGlmICh4ID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgeSA9IFB5T2JqZWN0X0hhc2goYS0+aW1fZnVuYyk7CisgICAgaWYgKHkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB4ID0geCBeIHk7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHggPSAtMjsKKyAgICByZXR1cm4geDsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2VtZXRob2RfdHJhdmVyc2UoUHlNZXRob2RPYmplY3QgKmltLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpbS0+aW1fZnVuYyk7Ci0JUHlfVklTSVQoaW0tPmltX3NlbGYpOwotCVB5X1ZJU0lUKGltLT5pbV9jbGFzcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoaW0tPmltX2Z1bmMpOworICAgIFB5X1ZJU0lUKGltLT5pbV9zZWxmKTsKKyAgICBQeV9WSVNJVChpbS0+aW1fY2xhc3MpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogZ2V0Y2xhc3NuYW1lKFB5T2JqZWN0ICprbGFzcywgY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSkKIHsKLQlQeU9iamVjdCAqbmFtZTsKKyAgICBQeU9iamVjdCAqbmFtZTsKIAotCWFzc2VydChidWZzaXplID4gMSk7Ci0Jc3RyY3B5KGJ1ZiwgIj8iKTsgLyogRGVmYXVsdCBvdXRjb21lICovCi0JaWYgKGtsYXNzID09IE5VTEwpCi0JCXJldHVybjsKLQluYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhrbGFzcywgIl9fbmFtZV9fIik7Ci0JaWYgKG5hbWUgPT0gTlVMTCkgewotCQkvKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYW4gZXhjZXB0aW9uICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7Ci0JCXN0cm5jcHkoYnVmLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksIGJ1ZnNpemUpOwotCQlidWZbYnVmc2l6ZS0xXSA9ICdcMCc7Ci0JfQotCVB5X0RFQ1JFRihuYW1lKTsKKyAgICBhc3NlcnQoYnVmc2l6ZSA+IDEpOworICAgIHN0cmNweShidWYsICI/Iik7IC8qIERlZmF1bHQgb3V0Y29tZSAqLworICAgIGlmIChrbGFzcyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoa2xhc3MsICJfX25hbWVfXyIpOworICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgLyogVGhpcyBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgICAgICBzdHJuY3B5KGJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLCBidWZzaXplKTsKKyAgICAgICAgYnVmW2J1ZnNpemUtMV0gPSAnXDAnOworICAgIH0KKyAgICBQeV9ERUNSRUYobmFtZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBnZXRpbnN0Y2xhc3NuYW1lKFB5T2JqZWN0ICppbnN0LCBjaGFyICpidWYsIGludCBidWZzaXplKQogewotCVB5T2JqZWN0ICprbGFzczsKKyAgICBQeU9iamVjdCAqa2xhc3M7CiAKLQlpZiAoaW5zdCA9PSBOVUxMKSB7Ci0JCWFzc2VydChidWZzaXplID4gMCAmJiAoc2l6ZV90KWJ1ZnNpemUgPiBzdHJsZW4oIm5vdGhpbmciKSk7Ci0JCXN0cmNweShidWYsICJub3RoaW5nIik7Ci0JCXJldHVybjsKLQl9CisgICAgaWYgKGluc3QgPT0gTlVMTCkgeworICAgICAgICBhc3NlcnQoYnVmc2l6ZSA+IDAgJiYgKHNpemVfdClidWZzaXplID4gc3RybGVuKCJub3RoaW5nIikpOworICAgICAgICBzdHJjcHkoYnVmLCAibm90aGluZyIpOworICAgICAgICByZXR1cm47CisgICAgfQogCi0Ja2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGluc3QsICJfX2NsYXNzX18iKTsKLQlpZiAoa2xhc3MgPT0gTlVMTCkgewotCQkvKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYW4gZXhjZXB0aW9uICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCWtsYXNzID0gKFB5T2JqZWN0ICopKGluc3QtPm9iX3R5cGUpOwotCQlQeV9JTkNSRUYoa2xhc3MpOwotCX0KLQlnZXRjbGFzc25hbWUoa2xhc3MsIGJ1ZiwgYnVmc2l6ZSk7Ci0JUHlfWERFQ1JFRihrbGFzcyk7CisgICAga2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGluc3QsICJfX2NsYXNzX18iKTsKKyAgICBpZiAoa2xhc3MgPT0gTlVMTCkgeworICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYW4gZXhjZXB0aW9uICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGtsYXNzID0gKFB5T2JqZWN0ICopKGluc3QtPm9iX3R5cGUpOworICAgICAgICBQeV9JTkNSRUYoa2xhc3MpOworICAgIH0KKyAgICBnZXRjbGFzc25hbWUoa2xhc3MsIGJ1ZiwgYnVmc2l6ZSk7CisgICAgUHlfWERFQ1JFRihrbGFzcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZW1ldGhvZF9jYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnNlbGYgPSBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKTsKLQlQeU9iamVjdCAqa2xhc3MgPSBQeU1ldGhvZF9HRVRfQ0xBU1MoZnVuYyk7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqc2VsZiA9IFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpOworICAgIFB5T2JqZWN0ICprbGFzcyA9IFB5TWV0aG9kX0dFVF9DTEFTUyhmdW5jKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JZnVuYyA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKTsKLQlpZiAoc2VsZiA9PSBOVUxMKSB7Ci0JCS8qIFVuYm91bmQgbWV0aG9kcyBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGluc3RhbmNlIG9mCi0JCSAgIHRoZSBjbGFzcyAob3IgYSBkZXJpdmVkIGNsYXNzKSBhcyBmaXJzdCBhcmd1bWVudCAqLwotCQlpbnQgb2s7Ci0JCWlmIChQeVR1cGxlX1NpemUoYXJnKSA+PSAxKQotCQkJc2VsZiA9IFB5VHVwbGVfR0VUX0lURU0oYXJnLCAwKTsKLQkJaWYgKHNlbGYgPT0gTlVMTCkKLQkJCW9rID0gMDsKLQkJZWxzZSB7Ci0JCQlvayA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uoc2VsZiwga2xhc3MpOwotCQkJaWYgKG9rIDwgMCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIW9rKSB7Ci0JCQljaGFyIGNsc2J1ZlsyNTZdOwotCQkJY2hhciBpbnN0YnVmWzI1Nl07Ci0JCQlnZXRjbGFzc25hbWUoa2xhc3MsIGNsc2J1Ziwgc2l6ZW9mKGNsc2J1ZikpOwotCQkJZ2V0aW5zdGNsYXNzbmFtZShzZWxmLCBpbnN0YnVmLCBzaXplb2YoaW5zdGJ1ZikpOwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJ1bmJvdW5kIG1ldGhvZCAlcyVzIG11c3QgYmUgY2FsbGVkIHdpdGggIgotCQkJCSAgICAgIiVzIGluc3RhbmNlIGFzIGZpcnN0IGFyZ3VtZW50ICIKLQkJCQkgICAgICIoZ290ICVzJXMgaW5zdGVhZCkiLAotCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAotCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAotCQkJCSAgICAgY2xzYnVmLAotCQkJCSAgICAgaW5zdGJ1ZiwKLQkJCQkgICAgIHNlbGYgPT0gTlVMTCA/ICIiIDogIiBpbnN0YW5jZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfSU5DUkVGKGFyZyk7Ci0JfQotCWVsc2UgewotCQlQeV9zc2l6ZV90IGFyZ2NvdW50ID0gUHlUdXBsZV9TaXplKGFyZyk7Ci0JCVB5T2JqZWN0ICpuZXdhcmcgPSBQeVR1cGxlX05ldyhhcmdjb3VudCArIDEpOwotCQlpbnQgaTsKLQkJaWYgKG5ld2FyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShuZXdhcmcsIDAsIHNlbGYpOwotCQlmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZywgaSk7Ci0JCQlQeV9YSU5DUkVGKHYpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShuZXdhcmcsIGkrMSwgdik7Ci0JCX0KLQkJYXJnID0gbmV3YXJnOwotCX0KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKChQeU9iamVjdCAqKWZ1bmMsIGFyZywga3cpOwotCVB5X0RFQ1JFRihhcmcpOwotCXJldHVybiByZXN1bHQ7CisgICAgZnVuYyA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgIC8qIFVuYm91bmQgbWV0aG9kcyBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGluc3RhbmNlIG9mCisgICAgICAgICAgIHRoZSBjbGFzcyAob3IgYSBkZXJpdmVkIGNsYXNzKSBhcyBmaXJzdCBhcmd1bWVudCAqLworICAgICAgICBpbnQgb2s7CisgICAgICAgIGlmIChQeVR1cGxlX1NpemUoYXJnKSA+PSAxKQorICAgICAgICAgICAgc2VsZiA9IFB5VHVwbGVfR0VUX0lURU0oYXJnLCAwKTsKKyAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgICAgIG9rID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uoc2VsZiwga2xhc3MpOworICAgICAgICAgICAgaWYgKG9rIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICBjaGFyIGNsc2J1ZlsyNTZdOworICAgICAgICAgICAgY2hhciBpbnN0YnVmWzI1Nl07CisgICAgICAgICAgICBnZXRjbGFzc25hbWUoa2xhc3MsIGNsc2J1Ziwgc2l6ZW9mKGNsc2J1ZikpOworICAgICAgICAgICAgZ2V0aW5zdGNsYXNzbmFtZShzZWxmLCBpbnN0YnVmLCBzaXplb2YoaW5zdGJ1ZikpOworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidW5ib3VuZCBtZXRob2QgJXMlcyBtdXN0IGJlIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaW5zdGFuY2UgYXMgZmlyc3QgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIoZ290ICVzJXMgaW5zdGVhZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRGdW5jTmFtZShmdW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0RnVuY0Rlc2MoZnVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xzYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiA9PSBOVUxMID8gIiIgOiAiIGluc3RhbmNlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoYXJnKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgYXJnY291bnQgPSBQeVR1cGxlX1NpemUoYXJnKTsKKyAgICAgICAgUHlPYmplY3QgKm5ld2FyZyA9IFB5VHVwbGVfTmV3KGFyZ2NvdW50ICsgMSk7CisgICAgICAgIGludCBpOworICAgICAgICBpZiAobmV3YXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZywgMCwgc2VsZik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJnLCBpKTsKKyAgICAgICAgICAgIFB5X1hJTkNSRUYodik7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZywgaSsxLCB2KTsKKyAgICAgICAgfQorICAgICAgICBhcmcgPSBuZXdhcmc7CisgICAgfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0ICopZnVuYywgYXJnLCBrdyk7CisgICAgUHlfREVDUkVGKGFyZyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlbWV0aG9kX2Rlc2NyX2dldChQeU9iamVjdCAqbWV0aCwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmNscykKIHsKLQkvKiBEb24ndCByZWJpbmQgYW4gYWxyZWFkeSBib3VuZCBtZXRob2QsIG9yIGFuIHVuYm91bmQgbWV0aG9kCi0JICAgb2YgYSBjbGFzcyB0aGF0J3Mgbm90IGEgYmFzZSBjbGFzcyBvZiBjbHMuICovCisgICAgLyogRG9uJ3QgcmViaW5kIGFuIGFscmVhZHkgYm91bmQgbWV0aG9kLCBvciBhbiB1bmJvdW5kIG1ldGhvZAorICAgICAgIG9mIGEgY2xhc3MgdGhhdCdzIG5vdCBhIGJhc2UgY2xhc3Mgb2YgY2xzLiAqLwogCi0JaWYgKFB5TWV0aG9kX0dFVF9TRUxGKG1ldGgpICE9IE5VTEwpIHsKLQkJLyogQWxyZWFkeSBib3VuZCAqLwotCQlQeV9JTkNSRUYobWV0aCk7Ci0JCXJldHVybiBtZXRoOwotCX0KLQkvKiBObywgaXQgaXMgYW4gdW5ib3VuZCBtZXRob2QgKi8KLQlpZiAoUHlNZXRob2RfR0VUX0NMQVNTKG1ldGgpICE9IE5VTEwgJiYgY2xzICE9IE5VTEwpIHsKLQkJLyogRG8gc3ViY2xhc3MgdGVzdC4gIElmIGl0IGZhaWxzLCByZXR1cm4gbWV0aCB1bmNoYW5nZWQuICovCi0JCWludCBvayA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoY2xzLCBQeU1ldGhvZF9HRVRfQ0xBU1MobWV0aCkpOwotCQlpZiAob2sgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICghb2spIHsKLQkJCVB5X0lOQ1JFRihtZXRoKTsKLQkJCXJldHVybiBtZXRoOwotCQl9Ci0JfQotCS8qIEJpbmQgaXQgdG8gb2JqICovCi0JcmV0dXJuIFB5TWV0aG9kX05ldyhQeU1ldGhvZF9HRVRfRlVOQ1RJT04obWV0aCksIG9iaiwgY2xzKTsKKyAgICBpZiAoUHlNZXRob2RfR0VUX1NFTEYobWV0aCkgIT0gTlVMTCkgeworICAgICAgICAvKiBBbHJlYWR5IGJvdW5kICovCisgICAgICAgIFB5X0lOQ1JFRihtZXRoKTsKKyAgICAgICAgcmV0dXJuIG1ldGg7CisgICAgfQorICAgIC8qIE5vLCBpdCBpcyBhbiB1bmJvdW5kIG1ldGhvZCAqLworICAgIGlmIChQeU1ldGhvZF9HRVRfQ0xBU1MobWV0aCkgIT0gTlVMTCAmJiBjbHMgIT0gTlVMTCkgeworICAgICAgICAvKiBEbyBzdWJjbGFzcyB0ZXN0LiAgSWYgaXQgZmFpbHMsIHJldHVybiBtZXRoIHVuY2hhbmdlZC4gKi8KKyAgICAgICAgaW50IG9rID0gUHlPYmplY3RfSXNTdWJjbGFzcyhjbHMsIFB5TWV0aG9kX0dFVF9DTEFTUyhtZXRoKSk7CisgICAgICAgIGlmIChvayA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgUHlfSU5DUkVGKG1ldGgpOworICAgICAgICAgICAgcmV0dXJuIG1ldGg7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQmluZCBpdCB0byBvYmogKi8KKyAgICByZXR1cm4gUHlNZXRob2RfTmV3KFB5TWV0aG9kX0dFVF9GVU5DVElPTihtZXRoKSwgb2JqLCBjbHMpOwogfQogCiBQeVR5cGVPYmplY3QgUHlNZXRob2RfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCi0JImluc3RhbmNlbWV0aG9kIiwKLQlzaXplb2YoUHlNZXRob2RPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpaW5zdGFuY2VtZXRob2RfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkoY21wZnVuYylpbnN0YW5jZW1ldGhvZF9jb21wYXJlLAkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWluc3RhbmNlbWV0aG9kX3JlcHIsCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWluc3RhbmNlbWV0aG9kX2hhc2gsCQkvKiB0cF9oYXNoICovCi0JaW5zdGFuY2VtZXRob2RfY2FsbCwJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCWluc3RhbmNlbWV0aG9kX2dldGF0dHJvLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyAgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsIC8qIHRwX2ZsYWdzICovCi0JaW5zdGFuY2VtZXRob2RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpaW5zdGFuY2VtZXRob2RfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0gCW9mZnNldG9mKFB5TWV0aG9kT2JqZWN0LCBpbV93ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCWluc3RhbmNlbWV0aG9kX21lbWJlcmxpc3QsCQkvKiB0cF9tZW1iZXJzICovCi0JaW5zdGFuY2VtZXRob2RfZ2V0c2V0LAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQlpbnN0YW5jZW1ldGhvZF9kZXNjcl9nZXQsCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWluc3RhbmNlbWV0aG9kX25ldywJCQkvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsCisgICAgImluc3RhbmNlbWV0aG9kIiwKKyAgICBzaXplb2YoUHlNZXRob2RPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpaW5zdGFuY2VtZXRob2RfZGVhbGxvYywgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIChjbXBmdW5jKWluc3RhbmNlbWV0aG9kX2NvbXBhcmUsICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylpbnN0YW5jZW1ldGhvZF9yZXByLCAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylpbnN0YW5jZW1ldGhvZF9oYXNoLCAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIGluc3RhbmNlbWV0aG9kX2NhbGwsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgaW5zdGFuY2VtZXRob2RfZ2V0YXR0cm8sICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyAgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsIC8qIHRwX2ZsYWdzICovCisgICAgaW5zdGFuY2VtZXRob2RfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWluc3RhbmNlbWV0aG9kX3RyYXZlcnNlLCAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeU1ldGhvZE9iamVjdCwgaW1fd2Vha3JlZmxpc3QpLCAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBpbnN0YW5jZW1ldGhvZF9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBpbnN0YW5jZW1ldGhvZF9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIGluc3RhbmNlbWV0aG9kX2Rlc2NyX2dldCwgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaW5zdGFuY2VtZXRob2RfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIC8qIENsZWFyIG91dCB0aGUgZnJlZSBsaXN0ICovCkBAIC0yNjUzLDIwICsyNjUzLDIwIEBACiBpbnQKIFB5TWV0aG9kX0NsZWFyRnJlZUxpc3Qodm9pZCkKIHsKLQlpbnQgZnJlZWxpc3Rfc2l6ZSA9IG51bWZyZWU7Ci0JCi0Jd2hpbGUgKGZyZWVfbGlzdCkgewotCQlQeU1ldGhvZE9iamVjdCAqaW0gPSBmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IChQeU1ldGhvZE9iamVjdCAqKShpbS0+aW1fc2VsZik7Ci0JCVB5T2JqZWN0X0dDX0RlbChpbSk7Ci0JCW51bWZyZWUtLTsKLQl9Ci0JYXNzZXJ0KG51bWZyZWUgPT0gMCk7Ci0JcmV0dXJuIGZyZWVsaXN0X3NpemU7CisgICAgaW50IGZyZWVsaXN0X3NpemUgPSBudW1mcmVlOworCisgICAgd2hpbGUgKGZyZWVfbGlzdCkgeworICAgICAgICBQeU1ldGhvZE9iamVjdCAqaW0gPSBmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IChQeU1ldGhvZE9iamVjdCAqKShpbS0+aW1fc2VsZik7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChpbSk7CisgICAgICAgIG51bWZyZWUtLTsKKyAgICB9CisgICAgYXNzZXJ0KG51bWZyZWUgPT0gMCk7CisgICAgcmV0dXJuIGZyZWVsaXN0X3NpemU7CiB9CiAKIHZvaWQKIFB5TWV0aG9kX0Zpbmkodm9pZCkKIHsKLQkodm9pZClQeU1ldGhvZF9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlNZXRob2RfQ2xlYXJGcmVlTGlzdCgpOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jb2Rlb2JqZWN0LmMgYi9PYmplY3RzL2NvZGVvYmplY3QuYwppbmRleCAzNDBjZWYwLi45ODc5ZGY1IDEwMDY0NAotLS0gYS9PYmplY3RzL2NvZGVvYmplY3QuYworKysgYi9PYmplY3RzL2NvZGVvYmplY3QuYwpAQCAtMywxNzYgKzMsMTc2IEBACiAjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCiAKICNkZWZpbmUgTkFNRV9DSEFSUyBcCi0JIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKKyAgICAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgogCiAvKiBhbGxfbmFtZV9jaGFycyhzKTogdHJ1ZSBpZmYgYWxsIGNoYXJzIGluIHMgYXJlIHZhbGlkIE5BTUVfQ0hBUlMgKi8KIAogc3RhdGljIGludAogYWxsX25hbWVfY2hhcnModW5zaWduZWQgY2hhciAqcykKIHsKLQlzdGF0aWMgY2hhciBva19uYW1lX2NoYXJbMjU2XTsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciAqbmFtZV9jaGFycyA9ICh1bnNpZ25lZCBjaGFyICopTkFNRV9DSEFSUzsKKyAgICBzdGF0aWMgY2hhciBva19uYW1lX2NoYXJbMjU2XTsKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciAqbmFtZV9jaGFycyA9ICh1bnNpZ25lZCBjaGFyICopTkFNRV9DSEFSUzsKIAotCWlmIChva19uYW1lX2NoYXJbKm5hbWVfY2hhcnNdID09IDApIHsKLQkJdW5zaWduZWQgY2hhciAqcDsKLQkJZm9yIChwID0gbmFtZV9jaGFyczsgKnA7IHArKykKLQkJCW9rX25hbWVfY2hhclsqcF0gPSAxOwotCX0KLQl3aGlsZSAoKnMpIHsKLQkJaWYgKG9rX25hbWVfY2hhclsqcysrXSA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChva19uYW1lX2NoYXJbKm5hbWVfY2hhcnNdID09IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgZm9yIChwID0gbmFtZV9jaGFyczsgKnA7IHArKykKKyAgICAgICAgICAgIG9rX25hbWVfY2hhclsqcF0gPSAxOworICAgIH0KKyAgICB3aGlsZSAoKnMpIHsKKyAgICAgICAgaWYgKG9rX25hbWVfY2hhclsqcysrXSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogaW50ZXJuX3N0cmluZ3MoUHlPYmplY3QgKnR1cGxlKQogewotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlmb3IgKGkgPSBQeVR1cGxlX0dFVF9TSVpFKHR1cGxlKTsgLS1pID49IDA7ICkgewotCQlQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0odHVwbGUsIGkpOwotCQlpZiAodiA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVja0V4YWN0KHYpKSB7Ci0JCQlQeV9GYXRhbEVycm9yKCJub24tc3RyaW5nIGZvdW5kIGluIGNvZGUgc2xvdCIpOwotCQl9Ci0JCVB5U3RyaW5nX0ludGVybkluUGxhY2UoJlB5VHVwbGVfR0VUX0lURU0odHVwbGUsIGkpKTsKLQl9CisgICAgZm9yIChpID0gUHlUdXBsZV9HRVRfU0laRSh0dXBsZSk7IC0taSA+PSAwOyApIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dFVF9JVEVNKHR1cGxlLCBpKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigibm9uLXN0cmluZyBmb3VuZCBpbiBjb2RlIHNsb3QiKTsKKyAgICAgICAgfQorICAgICAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZQeVR1cGxlX0dFVF9JVEVNKHR1cGxlLCBpKSk7CisgICAgfQogfQogCiAKIFB5Q29kZU9iamVjdCAqCiBQeUNvZGVfTmV3KGludCBhcmdjb3VudCwgaW50IG5sb2NhbHMsIGludCBzdGFja3NpemUsIGludCBmbGFncywKLQkgICBQeU9iamVjdCAqY29kZSwgUHlPYmplY3QgKmNvbnN0cywgUHlPYmplY3QgKm5hbWVzLAotCSAgIFB5T2JqZWN0ICp2YXJuYW1lcywgUHlPYmplY3QgKmZyZWV2YXJzLCBQeU9iamVjdCAqY2VsbHZhcnMsCi0JICAgUHlPYmplY3QgKmZpbGVuYW1lLCBQeU9iamVjdCAqbmFtZSwgaW50IGZpcnN0bGluZW5vLAotCSAgIFB5T2JqZWN0ICpsbm90YWIpCisgICAgICAgICAgIFB5T2JqZWN0ICpjb2RlLCBQeU9iamVjdCAqY29uc3RzLCBQeU9iamVjdCAqbmFtZXMsCisgICAgICAgICAgIFB5T2JqZWN0ICp2YXJuYW1lcywgUHlPYmplY3QgKmZyZWV2YXJzLCBQeU9iamVjdCAqY2VsbHZhcnMsCisgICAgICAgICAgIFB5T2JqZWN0ICpmaWxlbmFtZSwgUHlPYmplY3QgKm5hbWUsIGludCBmaXJzdGxpbmVubywKKyAgICAgICAgICAgUHlPYmplY3QgKmxub3RhYikKIHsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5X3NzaXplX3QgaTsKLQkvKiBDaGVjayBhcmd1bWVudCB0eXBlcyAqLwotCWlmIChhcmdjb3VudCA8IDAgfHwgbmxvY2FscyA8IDAgfHwKLQkgICAgY29kZSA9PSBOVUxMIHx8Ci0JICAgIGNvbnN0cyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGNvbnN0cykgfHwKLQkgICAgbmFtZXMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhuYW1lcykgfHwKLQkgICAgdmFybmFtZXMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayh2YXJuYW1lcykgfHwKLQkgICAgZnJlZXZhcnMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhmcmVldmFycykgfHwKLQkgICAgY2VsbHZhcnMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhjZWxsdmFycykgfHwKLQkgICAgbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhuYW1lKSB8fAotCSAgICBmaWxlbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhmaWxlbmFtZSkgfHwKLQkgICAgbG5vdGFiID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKGxub3RhYikgfHwKLQkgICAgIVB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcihjb2RlKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWludGVybl9zdHJpbmdzKG5hbWVzKTsKLQlpbnRlcm5fc3RyaW5ncyh2YXJuYW1lcyk7Ci0JaW50ZXJuX3N0cmluZ3MoZnJlZXZhcnMpOwotCWludGVybl9zdHJpbmdzKGNlbGx2YXJzKTsKLQkvKiBJbnRlcm4gc2VsZWN0ZWQgc3RyaW5nIGNvbnN0YW50cyAqLwotCWZvciAoaSA9IFB5VHVwbGVfU2l6ZShjb25zdHMpOyAtLWkgPj0gMDsgKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HZXRJdGVtKGNvbnN0cywgaSk7Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2sodikpCi0JCQljb250aW51ZTsKLQkJaWYgKCFhbGxfbmFtZV9jaGFycygodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyh2KSkpCi0JCQljb250aW51ZTsKLQkJUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmUHlUdXBsZV9HRVRfSVRFTShjb25zdHMsIGkpKTsKLQl9Ci0JY28gPSBQeU9iamVjdF9ORVcoUHlDb2RlT2JqZWN0LCAmUHlDb2RlX1R5cGUpOwotCWlmIChjbyAhPSBOVUxMKSB7Ci0JCWNvLT5jb19hcmdjb3VudCA9IGFyZ2NvdW50OwotCQljby0+Y29fbmxvY2FscyA9IG5sb2NhbHM7Ci0JCWNvLT5jb19zdGFja3NpemUgPSBzdGFja3NpemU7Ci0JCWNvLT5jb19mbGFncyA9IGZsYWdzOwotCQlQeV9JTkNSRUYoY29kZSk7Ci0JCWNvLT5jb19jb2RlID0gY29kZTsKLQkJUHlfSU5DUkVGKGNvbnN0cyk7Ci0JCWNvLT5jb19jb25zdHMgPSBjb25zdHM7Ci0JCVB5X0lOQ1JFRihuYW1lcyk7Ci0JCWNvLT5jb19uYW1lcyA9IG5hbWVzOwotCQlQeV9JTkNSRUYodmFybmFtZXMpOwotCQljby0+Y29fdmFybmFtZXMgPSB2YXJuYW1lczsKLQkJUHlfSU5DUkVGKGZyZWV2YXJzKTsKLQkJY28tPmNvX2ZyZWV2YXJzID0gZnJlZXZhcnM7Ci0JCVB5X0lOQ1JFRihjZWxsdmFycyk7Ci0JCWNvLT5jb19jZWxsdmFycyA9IGNlbGx2YXJzOwotCQlQeV9JTkNSRUYoZmlsZW5hbWUpOwotCQljby0+Y29fZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJUHlfSU5DUkVGKG5hbWUpOwotCQljby0+Y29fbmFtZSA9IG5hbWU7Ci0JCWNvLT5jb19maXJzdGxpbmVubyA9IGZpcnN0bGluZW5vOwotCQlQeV9JTkNSRUYobG5vdGFiKTsKLQkJY28tPmNvX2xub3RhYiA9IGxub3RhYjsKLSAgICAgICAgICAgICAgICBjby0+Y29fem9tYmllZnJhbWUgPSBOVUxMOwotCQljby0+Y29fd2Vha3JlZmxpc3QgPSBOVUxMOwotCX0KLQlyZXR1cm4gY287CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgLyogQ2hlY2sgYXJndW1lbnQgdHlwZXMgKi8KKyAgICBpZiAoYXJnY291bnQgPCAwIHx8IG5sb2NhbHMgPCAwIHx8CisgICAgICAgIGNvZGUgPT0gTlVMTCB8fAorICAgICAgICBjb25zdHMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhjb25zdHMpIHx8CisgICAgICAgIG5hbWVzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2sobmFtZXMpIHx8CisgICAgICAgIHZhcm5hbWVzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2sodmFybmFtZXMpIHx8CisgICAgICAgIGZyZWV2YXJzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soZnJlZXZhcnMpIHx8CisgICAgICAgIGNlbGx2YXJzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soY2VsbHZhcnMpIHx8CisgICAgICAgIG5hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobmFtZSkgfHwKKyAgICAgICAgZmlsZW5hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2soZmlsZW5hbWUpIHx8CisgICAgICAgIGxub3RhYiA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhsbm90YWIpIHx8CisgICAgICAgICFQeU9iamVjdF9DaGVja1JlYWRCdWZmZXIoY29kZSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpbnRlcm5fc3RyaW5ncyhuYW1lcyk7CisgICAgaW50ZXJuX3N0cmluZ3ModmFybmFtZXMpOworICAgIGludGVybl9zdHJpbmdzKGZyZWV2YXJzKTsKKyAgICBpbnRlcm5fc3RyaW5ncyhjZWxsdmFycyk7CisgICAgLyogSW50ZXJuIHNlbGVjdGVkIHN0cmluZyBjb25zdGFudHMgKi8KKyAgICBmb3IgKGkgPSBQeVR1cGxlX1NpemUoY29uc3RzKTsgLS1pID49IDA7ICkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5VHVwbGVfR2V0SXRlbShjb25zdHMsIGkpOworICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICghYWxsX25hbWVfY2hhcnMoKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcodikpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJlB5VHVwbGVfR0VUX0lURU0oY29uc3RzLCBpKSk7CisgICAgfQorICAgIGNvID0gUHlPYmplY3RfTkVXKFB5Q29kZU9iamVjdCwgJlB5Q29kZV9UeXBlKTsKKyAgICBpZiAoY28gIT0gTlVMTCkgeworICAgICAgICBjby0+Y29fYXJnY291bnQgPSBhcmdjb3VudDsKKyAgICAgICAgY28tPmNvX25sb2NhbHMgPSBubG9jYWxzOworICAgICAgICBjby0+Y29fc3RhY2tzaXplID0gc3RhY2tzaXplOworICAgICAgICBjby0+Y29fZmxhZ3MgPSBmbGFnczsKKyAgICAgICAgUHlfSU5DUkVGKGNvZGUpOworICAgICAgICBjby0+Y29fY29kZSA9IGNvZGU7CisgICAgICAgIFB5X0lOQ1JFRihjb25zdHMpOworICAgICAgICBjby0+Y29fY29uc3RzID0gY29uc3RzOworICAgICAgICBQeV9JTkNSRUYobmFtZXMpOworICAgICAgICBjby0+Y29fbmFtZXMgPSBuYW1lczsKKyAgICAgICAgUHlfSU5DUkVGKHZhcm5hbWVzKTsKKyAgICAgICAgY28tPmNvX3Zhcm5hbWVzID0gdmFybmFtZXM7CisgICAgICAgIFB5X0lOQ1JFRihmcmVldmFycyk7CisgICAgICAgIGNvLT5jb19mcmVldmFycyA9IGZyZWV2YXJzOworICAgICAgICBQeV9JTkNSRUYoY2VsbHZhcnMpOworICAgICAgICBjby0+Y29fY2VsbHZhcnMgPSBjZWxsdmFyczsKKyAgICAgICAgUHlfSU5DUkVGKGZpbGVuYW1lKTsKKyAgICAgICAgY28tPmNvX2ZpbGVuYW1lID0gZmlsZW5hbWU7CisgICAgICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICAgICAgY28tPmNvX25hbWUgPSBuYW1lOworICAgICAgICBjby0+Y29fZmlyc3RsaW5lbm8gPSBmaXJzdGxpbmVubzsKKyAgICAgICAgUHlfSU5DUkVGKGxub3RhYik7CisgICAgICAgIGNvLT5jb19sbm90YWIgPSBsbm90YWI7CisgICAgICAgIGNvLT5jb196b21iaWVmcmFtZSA9IE5VTEw7CisgICAgICAgIGNvLT5jb193ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBjbzsKIH0KIAogUHlDb2RlT2JqZWN0ICoKIFB5Q29kZV9OZXdFbXB0eShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZnVuY25hbWUsIGludCBmaXJzdGxpbmVubykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmVtcHR5c3RyaW5nID0gTlVMTDsKLQlzdGF0aWMgUHlPYmplY3QgKm51bGx0dXBsZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmZpbGVuYW1lX29iID0gTlVMTDsKLQlQeU9iamVjdCAqZnVuY25hbWVfb2IgPSBOVUxMOwotCVB5Q29kZU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlpZiAoZW1wdHlzdHJpbmcgPT0gTlVMTCkgewotCQllbXB0eXN0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCQlpZiAoZW1wdHlzdHJpbmcgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbGVkOwotCX0KLQlpZiAobnVsbHR1cGxlID09IE5VTEwpIHsKLQkJbnVsbHR1cGxlID0gUHlUdXBsZV9OZXcoMCk7Ci0JCWlmIChudWxsdHVwbGUgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbGVkOwotCX0KLQlmdW5jbmFtZV9vYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZnVuY25hbWUpOwotCWlmIChmdW5jbmFtZV9vYiA9PSBOVUxMKQotCQlnb3RvIGZhaWxlZDsKLQlmaWxlbmFtZV9vYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOwotCWlmIChmaWxlbmFtZV9vYiA9PSBOVUxMKQotCQlnb3RvIGZhaWxlZDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmVtcHR5c3RyaW5nID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm51bGx0dXBsZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZpbGVuYW1lX29iID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZnVuY25hbWVfb2IgPSBOVUxMOworICAgIFB5Q29kZU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBpZiAoZW1wdHlzdHJpbmcgPT0gTlVMTCkgeworICAgICAgICBlbXB0eXN0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoZW1wdHlzdHJpbmcgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgICBpZiAobnVsbHR1cGxlID09IE5VTEwpIHsKKyAgICAgICAgbnVsbHR1cGxlID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGlmIChudWxsdHVwbGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgICBmdW5jbmFtZV9vYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZnVuY25hbWUpOworICAgIGlmIChmdW5jbmFtZV9vYiA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICBmaWxlbmFtZV9vYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOworICAgIGlmIChmaWxlbmFtZV9vYiA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWxlZDsKIAotCXJlc3VsdCA9IFB5Q29kZV9OZXcoMCwJCQkvKiBhcmdjb3VudCAqLwotCQkJICAgIDAsCQkJLyogbmxvY2FscyAqLwotCQkJICAgIDAsCQkJLyogc3RhY2tzaXplICovCi0JCQkgICAgMCwJCQkvKiBmbGFncyAqLwotCQkJICAgIGVtcHR5c3RyaW5nLAkvKiBjb2RlICovCi0JCQkgICAgbnVsbHR1cGxlLAkJLyogY29uc3RzICovCi0JCQkgICAgbnVsbHR1cGxlLAkJLyogbmFtZXMgKi8KLQkJCSAgICBudWxsdHVwbGUsCQkvKiB2YXJuYW1lcyAqLwotCQkJICAgIG51bGx0dXBsZSwJCS8qIGZyZWV2YXJzICovCi0JCQkgICAgbnVsbHR1cGxlLAkJLyogY2VsbHZhcnMgKi8KLQkJCSAgICBmaWxlbmFtZV9vYiwJLyogZmlsZW5hbWUgKi8KLQkJCSAgICBmdW5jbmFtZV9vYiwJLyogbmFtZSAqLwotCQkJICAgIGZpcnN0bGluZW5vLAkvKiBmaXJzdGxpbmVubyAqLwotCQkJICAgIGVtcHR5c3RyaW5nCQkvKiBsbm90YWIgKi8KLQkJCSAgICApOworICAgIHJlc3VsdCA9IFB5Q29kZV9OZXcoMCwgICAgICAgICAgICAgICAgICAgICAgLyogYXJnY291bnQgKi8KKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5sb2NhbHMgKi8KKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YWNrc2l6ZSAqLworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBlbXB0eXN0cmluZywgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgKi8KKyAgICAgICAgICAgICAgICBudWxsdHVwbGUsICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0cyAqLworICAgICAgICAgICAgICAgIG51bGx0dXBsZSwgICAgICAgICAgICAgICAgICAgICAgLyogbmFtZXMgKi8KKyAgICAgICAgICAgICAgICBudWxsdHVwbGUsICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcm5hbWVzICovCisgICAgICAgICAgICAgICAgbnVsbHR1cGxlLCAgICAgICAgICAgICAgICAgICAgICAvKiBmcmVldmFycyAqLworICAgICAgICAgICAgICAgIG51bGx0dXBsZSwgICAgICAgICAgICAgICAgICAgICAgLyogY2VsbHZhcnMgKi8KKyAgICAgICAgICAgICAgICBmaWxlbmFtZV9vYiwgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lICovCisgICAgICAgICAgICAgICAgZnVuY25hbWVfb2IsICAgICAgICAgICAgICAgICAgICAvKiBuYW1lICovCisgICAgICAgICAgICAgICAgZmlyc3RsaW5lbm8sICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdGxpbmVubyAqLworICAgICAgICAgICAgICAgIGVtcHR5c3RyaW5nICAgICAgICAgICAgICAgICAgICAgLyogbG5vdGFiICovCisgICAgICAgICAgICAgICAgKTsKIAogZmFpbGVkOgotCVB5X1hERUNSRUYoZnVuY25hbWVfb2IpOwotCVB5X1hERUNSRUYoZmlsZW5hbWVfb2IpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihmdW5jbmFtZV9vYik7CisgICAgUHlfWERFQ1JFRihmaWxlbmFtZV9vYik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoUHlDb2RlT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgY29kZV9tZW1iZXJsaXN0W10gPSB7Ci0JeyJjb19hcmdjb3VudCIsCVRfSU5ULAkJT0ZGKGNvX2FyZ2NvdW50KSwJUkVBRE9OTFl9LAotCXsiY29fbmxvY2FscyIsCVRfSU5ULAkJT0ZGKGNvX25sb2NhbHMpLAlSRUFET05MWX0sCi0JeyJjb19zdGFja3NpemUiLFRfSU5ULAkJT0ZGKGNvX3N0YWNrc2l6ZSksCVJFQURPTkxZfSwKLQl7ImNvX2ZsYWdzIiwJVF9JTlQsCQlPRkYoY29fZmxhZ3MpLAkJUkVBRE9OTFl9LAotCXsiY29fY29kZSIsCVRfT0JKRUNULAlPRkYoY29fY29kZSksCQlSRUFET05MWX0sCi0JeyJjb19jb25zdHMiLAlUX09CSkVDVCwJT0ZGKGNvX2NvbnN0cyksCQlSRUFET05MWX0sCi0JeyJjb19uYW1lcyIsCVRfT0JKRUNULAlPRkYoY29fbmFtZXMpLAkJUkVBRE9OTFl9LAotCXsiY29fdmFybmFtZXMiLAlUX09CSkVDVCwJT0ZGKGNvX3Zhcm5hbWVzKSwJUkVBRE9OTFl9LAotCXsiY29fZnJlZXZhcnMiLAlUX09CSkVDVCwJT0ZGKGNvX2ZyZWV2YXJzKSwJUkVBRE9OTFl9LAotCXsiY29fY2VsbHZhcnMiLAlUX09CSkVDVCwJT0ZGKGNvX2NlbGx2YXJzKSwJUkVBRE9OTFl9LAotCXsiY29fZmlsZW5hbWUiLAlUX09CSkVDVCwJT0ZGKGNvX2ZpbGVuYW1lKSwJUkVBRE9OTFl9LAotCXsiY29fbmFtZSIsCVRfT0JKRUNULAlPRkYoY29fbmFtZSksCQlSRUFET05MWX0sCi0JeyJjb19maXJzdGxpbmVubyIsIFRfSU5ULAlPRkYoY29fZmlyc3RsaW5lbm8pLAlSRUFET05MWX0sCi0JeyJjb19sbm90YWIiLAlUX09CSkVDVCwJT0ZGKGNvX2xub3RhYiksCQlSRUFET05MWX0sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJjb19hcmdjb3VudCIsICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGNvX2FyZ2NvdW50KSwgICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fbmxvY2FscyIsICAgICAgVF9JTlQsICAgICAgICAgIE9GRihjb19ubG9jYWxzKSwgICAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX3N0YWNrc2l6ZSIsVF9JTlQsICAgICAgICAgICAgICBPRkYoY29fc3RhY2tzaXplKSwgICAgICBSRUFET05MWX0sCisgICAgeyJjb19mbGFncyIsICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGNvX2ZsYWdzKSwgICAgICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fY29kZSIsICAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihjb19jb2RlKSwgICAgICAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX2NvbnN0cyIsICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoY29fY29uc3RzKSwgICAgICAgICBSRUFET05MWX0sCisgICAgeyJjb19uYW1lcyIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGNvX25hbWVzKSwgICAgICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fdmFybmFtZXMiLCAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihjb192YXJuYW1lcyksICAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX2ZyZWV2YXJzIiwgICAgIFRfT0JKRUNULCAgICAgICBPRkYoY29fZnJlZXZhcnMpLCAgICAgICBSRUFET05MWX0sCisgICAgeyJjb19jZWxsdmFycyIsICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGNvX2NlbGx2YXJzKSwgICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fZmlsZW5hbWUiLCAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihjb19maWxlbmFtZSksICAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX25hbWUiLCAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoY29fbmFtZSksICAgICAgICAgICBSRUFET05MWX0sCisgICAgeyJjb19maXJzdGxpbmVubyIsIFRfSU5ULCAgICAgICAgICAgT0ZGKGNvX2ZpcnN0bGluZW5vKSwgICAgUkVBRE9OTFl9LAorICAgIHsiY29fbG5vdGFiIiwgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihjb19sbm90YWIpLCAgICAgICAgIFJFQURPTkxZfSwKKyAgICB7TlVMTH0gICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogLyogSGVscGVyIGZvciBjb2RlX25ldzogcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgdHVwbGUgdGhhdCBpcwpAQCAtMTgxLDQyICsxODEsNDIgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHZhbGlkYXRlX2FuZF9jb3B5X3R1cGxlKFB5T2JqZWN0ICp0dXApCiB7Ci0JUHlPYmplY3QgKm5ld3R1cGxlOwotCVB5T2JqZWN0ICppdGVtOwotCVB5X3NzaXplX3QgaSwgbGVuOworICAgIFB5T2JqZWN0ICpuZXd0dXBsZTsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IGksIGxlbjsKIAotCWxlbiA9IFB5VHVwbGVfR0VUX1NJWkUodHVwKTsKLQluZXd0dXBsZSA9IFB5VHVwbGVfTmV3KGxlbik7Ci0JaWYgKG5ld3R1cGxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGxlbiA9IFB5VHVwbGVfR0VUX1NJWkUodHVwKTsKKyAgICBuZXd0dXBsZSA9IFB5VHVwbGVfTmV3KGxlbik7CisgICAgaWYgKG5ld3R1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWl0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHR1cCwgaSk7Ci0JCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KGl0ZW0pKSB7Ci0JCQlQeV9JTkNSRUYoaXRlbSk7Ci0JCX0KLQkJZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7Ci0JCQlQeUVycl9Gb3JtYXQoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCSJuYW1lIHR1cGxlcyBtdXN0IGNvbnRhaW4gb25seSAiCi0JCQkJInN0cmluZ3MsIG5vdCAnJS41MDBzJyIsCi0JCQkJaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQlQeV9ERUNSRUYobmV3dHVwbGUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0JCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLAotCQkJCVB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pKTsKLQkJCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYobmV3dHVwbGUpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCVB5VHVwbGVfU0VUX0lURU0obmV3dHVwbGUsIGksIGl0ZW0pOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0odHVwLCBpKTsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QoaXRlbSkpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIm5hbWUgdHVwbGVzIG11c3QgY29udGFpbiBvbmx5ICIKKyAgICAgICAgICAgICAgICAic3RyaW5ncywgbm90ICclLjUwMHMnIiwKKyAgICAgICAgICAgICAgICBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXd0dXBsZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoaXRlbSksCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSkpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXd0dXBsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXd0dXBsZSwgaSwgaXRlbSk7CisgICAgfQogCi0JcmV0dXJuIG5ld3R1cGxlOworICAgIHJldHVybiBuZXd0dXBsZTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvZGVfZG9jLApAQCAtMjI4LDI4NiArMjI4LDI4NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvZGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlpbnQgYXJnY291bnQ7Ci0JaW50IG5sb2NhbHM7Ci0JaW50IHN0YWNrc2l6ZTsKLQlpbnQgZmxhZ3M7Ci0JUHlPYmplY3QgKmNvID0gTlVMTDsKLQlQeU9iamVjdCAqY29kZTsKLQlQeU9iamVjdCAqY29uc3RzOwotCVB5T2JqZWN0ICpuYW1lcywgKm91cm5hbWVzID0gTlVMTDsKLQlQeU9iamVjdCAqdmFybmFtZXMsICpvdXJ2YXJuYW1lcyA9IE5VTEw7Ci0JUHlPYmplY3QgKmZyZWV2YXJzID0gTlVMTCwgKm91cmZyZWV2YXJzID0gTlVMTDsKLQlQeU9iamVjdCAqY2VsbHZhcnMgPSBOVUxMLCAqb3VyY2VsbHZhcnMgPSBOVUxMOwotCVB5T2JqZWN0ICpmaWxlbmFtZTsKLQlQeU9iamVjdCAqbmFtZTsKLQlpbnQgZmlyc3RsaW5lbm87Ci0JUHlPYmplY3QgKmxub3RhYjsKKyAgICBpbnQgYXJnY291bnQ7CisgICAgaW50IG5sb2NhbHM7CisgICAgaW50IHN0YWNrc2l6ZTsKKyAgICBpbnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKmNvID0gTlVMTDsKKyAgICBQeU9iamVjdCAqY29kZTsKKyAgICBQeU9iamVjdCAqY29uc3RzOworICAgIFB5T2JqZWN0ICpuYW1lcywgKm91cm5hbWVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdmFybmFtZXMsICpvdXJ2YXJuYW1lcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZyZWV2YXJzID0gTlVMTCwgKm91cmZyZWV2YXJzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqY2VsbHZhcnMgPSBOVUxMLCAqb3VyY2VsbHZhcnMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmaWxlbmFtZTsKKyAgICBQeU9iamVjdCAqbmFtZTsKKyAgICBpbnQgZmlyc3RsaW5lbm87CisgICAgUHlPYmplY3QgKmxub3RhYjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaVNPIU8hTyFTU2lTfE8hTyE6Y29kZSIsCi0JCQkgICAgICAmYXJnY291bnQsICZubG9jYWxzLCAmc3RhY2tzaXplLCAmZmxhZ3MsCi0JCQkgICAgICAmY29kZSwKLQkJCSAgICAgICZQeVR1cGxlX1R5cGUsICZjb25zdHMsCi0JCQkgICAgICAmUHlUdXBsZV9UeXBlLCAmbmFtZXMsCi0JCQkgICAgICAmUHlUdXBsZV9UeXBlLCAmdmFybmFtZXMsCi0JCQkgICAgICAmZmlsZW5hbWUsICZuYW1lLAotCQkJICAgICAgJmZpcnN0bGluZW5vLCAmbG5vdGFiLAotCQkJICAgICAgJlB5VHVwbGVfVHlwZSwgJmZyZWV2YXJzLAotCQkJICAgICAgJlB5VHVwbGVfVHlwZSwgJmNlbGx2YXJzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWlpU08hTyFPIVNTaVN8TyFPITpjb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ2NvdW50LCAmbmxvY2FscywgJnN0YWNrc2l6ZSwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmNvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJm5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlUdXBsZV9UeXBlLCAmdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlbmFtZSwgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdGxpbmVubywgJmxub3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmZyZWV2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlUdXBsZV9UeXBlLCAmY2VsbHZhcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChhcmdjb3VudCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJjb2RlOiBhcmdjb3VudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQorICAgIGlmIChhcmdjb3VudCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJjb2RlOiBhcmdjb3VudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCi0JaWYgKG5sb2NhbHMgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkiY29kZTogbmxvY2FscyBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQorICAgIGlmIChubG9jYWxzIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgImNvZGU6IG5sb2NhbHMgbXVzdCBub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAotCW91cm5hbWVzID0gdmFsaWRhdGVfYW5kX2NvcHlfdHVwbGUobmFtZXMpOwotCWlmIChvdXJuYW1lcyA9PSBOVUxMKQotCQlnb3RvIGNsZWFudXA7Ci0Jb3VydmFybmFtZXMgPSB2YWxpZGF0ZV9hbmRfY29weV90dXBsZSh2YXJuYW1lcyk7Ci0JaWYgKG91cnZhcm5hbWVzID09IE5VTEwpCi0JCWdvdG8gY2xlYW51cDsKLQlpZiAoZnJlZXZhcnMpCi0JCW91cmZyZWV2YXJzID0gdmFsaWRhdGVfYW5kX2NvcHlfdHVwbGUoZnJlZXZhcnMpOwotCWVsc2UKLQkJb3VyZnJlZXZhcnMgPSBQeVR1cGxlX05ldygwKTsKLQlpZiAob3VyZnJlZXZhcnMgPT0gTlVMTCkKLQkJZ290byBjbGVhbnVwOwotCWlmIChjZWxsdmFycykKLQkJb3VyY2VsbHZhcnMgPSB2YWxpZGF0ZV9hbmRfY29weV90dXBsZShjZWxsdmFycyk7Ci0JZWxzZQotCQlvdXJjZWxsdmFycyA9IFB5VHVwbGVfTmV3KDApOwotCWlmIChvdXJjZWxsdmFycyA9PSBOVUxMKQotCQlnb3RvIGNsZWFudXA7CisgICAgb3VybmFtZXMgPSB2YWxpZGF0ZV9hbmRfY29weV90dXBsZShuYW1lcyk7CisgICAgaWYgKG91cm5hbWVzID09IE5VTEwpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBvdXJ2YXJuYW1lcyA9IHZhbGlkYXRlX2FuZF9jb3B5X3R1cGxlKHZhcm5hbWVzKTsKKyAgICBpZiAob3VydmFybmFtZXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGlmIChmcmVldmFycykKKyAgICAgICAgb3VyZnJlZXZhcnMgPSB2YWxpZGF0ZV9hbmRfY29weV90dXBsZShmcmVldmFycyk7CisgICAgZWxzZQorICAgICAgICBvdXJmcmVldmFycyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmIChvdXJmcmVldmFycyA9PSBOVUxMKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgaWYgKGNlbGx2YXJzKQorICAgICAgICBvdXJjZWxsdmFycyA9IHZhbGlkYXRlX2FuZF9jb3B5X3R1cGxlKGNlbGx2YXJzKTsKKyAgICBlbHNlCisgICAgICAgIG91cmNlbGx2YXJzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgaWYgKG91cmNlbGx2YXJzID09IE5VTEwpCisgICAgICAgIGdvdG8gY2xlYW51cDsKIAotCWNvID0gKFB5T2JqZWN0ICopUHlDb2RlX05ldyhhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywKLQkJCQkgICAgY29kZSwgY29uc3RzLCBvdXJuYW1lcywgb3VydmFybmFtZXMsCi0JCQkJICAgIG91cmZyZWV2YXJzLCBvdXJjZWxsdmFycywgZmlsZW5hbWUsCi0JCQkJICAgIG5hbWUsIGZpcnN0bGluZW5vLCBsbm90YWIpOworICAgIGNvID0gKFB5T2JqZWN0ICopUHlDb2RlX05ldyhhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSwgY29uc3RzLCBvdXJuYW1lcywgb3VydmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91cmZyZWV2YXJzLCBvdXJjZWxsdmFycywgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGZpcnN0bGluZW5vLCBsbm90YWIpOwogICBjbGVhbnVwOgotCVB5X1hERUNSRUYob3VybmFtZXMpOwotCVB5X1hERUNSRUYob3VydmFybmFtZXMpOwotCVB5X1hERUNSRUYob3VyZnJlZXZhcnMpOwotCVB5X1hERUNSRUYob3VyY2VsbHZhcnMpOwotCXJldHVybiBjbzsKKyAgICBQeV9YREVDUkVGKG91cm5hbWVzKTsKKyAgICBQeV9YREVDUkVGKG91cnZhcm5hbWVzKTsKKyAgICBQeV9YREVDUkVGKG91cmZyZWV2YXJzKTsKKyAgICBQeV9YREVDUkVGKG91cmNlbGx2YXJzKTsKKyAgICByZXR1cm4gY287CiB9CiAKIHN0YXRpYyB2b2lkCiBjb2RlX2RlYWxsb2MoUHlDb2RlT2JqZWN0ICpjbykKIHsKLQlQeV9YREVDUkVGKGNvLT5jb19jb2RlKTsKLQlQeV9YREVDUkVGKGNvLT5jb19jb25zdHMpOwotCVB5X1hERUNSRUYoY28tPmNvX25hbWVzKTsKLQlQeV9YREVDUkVGKGNvLT5jb192YXJuYW1lcyk7Ci0JUHlfWERFQ1JFRihjby0+Y29fZnJlZXZhcnMpOwotCVB5X1hERUNSRUYoY28tPmNvX2NlbGx2YXJzKTsKLQlQeV9YREVDUkVGKGNvLT5jb19maWxlbmFtZSk7Ci0JUHlfWERFQ1JFRihjby0+Y29fbmFtZSk7Ci0JUHlfWERFQ1JFRihjby0+Y29fbG5vdGFiKTsKLSAgICAgICAgaWYgKGNvLT5jb196b21iaWVmcmFtZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgIFB5T2JqZWN0X0dDX0RlbChjby0+Y29fem9tYmllZnJhbWUpOwotCWlmIChjby0+Y29fd2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QqKWNvKTsKLQlQeU9iamVjdF9ERUwoY28pOworICAgIFB5X1hERUNSRUYoY28tPmNvX2NvZGUpOworICAgIFB5X1hERUNSRUYoY28tPmNvX2NvbnN0cyk7CisgICAgUHlfWERFQ1JFRihjby0+Y29fbmFtZXMpOworICAgIFB5X1hERUNSRUYoY28tPmNvX3Zhcm5hbWVzKTsKKyAgICBQeV9YREVDUkVGKGNvLT5jb19mcmVldmFycyk7CisgICAgUHlfWERFQ1JFRihjby0+Y29fY2VsbHZhcnMpOworICAgIFB5X1hERUNSRUYoY28tPmNvX2ZpbGVuYW1lKTsKKyAgICBQeV9YREVDUkVGKGNvLT5jb19uYW1lKTsKKyAgICBQeV9YREVDUkVGKGNvLT5jb19sbm90YWIpOworICAgIGlmIChjby0+Y29fem9tYmllZnJhbWUgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfR0NfRGVsKGNvLT5jb196b21iaWVmcmFtZSk7CisgICAgaWYgKGNvLT5jb193ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCopY28pOworICAgIFB5T2JqZWN0X0RFTChjbyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb2RlX3JlcHIoUHlDb2RlT2JqZWN0ICpjbykKIHsKLQljaGFyIGJ1Zls1MDBdOwotCWludCBsaW5lbm8gPSAtMTsKLQljaGFyICpmaWxlbmFtZSA9ICI/Pz8iOwotCWNoYXIgKm5hbWUgPSAiPz8/IjsKKyAgICBjaGFyIGJ1Zls1MDBdOworICAgIGludCBsaW5lbm8gPSAtMTsKKyAgICBjaGFyICpmaWxlbmFtZSA9ICI/Pz8iOworICAgIGNoYXIgKm5hbWUgPSAiPz8/IjsKIAotCWlmIChjby0+Y29fZmlyc3RsaW5lbm8gIT0gMCkKLQkJbGluZW5vID0gY28tPmNvX2ZpcnN0bGluZW5vOwotCWlmIChjby0+Y29fZmlsZW5hbWUgJiYgUHlTdHJpbmdfQ2hlY2soY28tPmNvX2ZpbGVuYW1lKSkKLQkJZmlsZW5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoY28tPmNvX2ZpbGVuYW1lKTsKLQlpZiAoY28tPmNvX25hbWUgJiYgUHlTdHJpbmdfQ2hlY2soY28tPmNvX25hbWUpKQotCQluYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19uYW1lKTsKLQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSAgICAgICI8Y29kZSBvYmplY3QgJS4xMDBzIGF0ICVwLCBmaWxlIFwiJS4zMDBzXCIsIGxpbmUgJWQ+IiwKLQkJICAgICAgbmFtZSwgY28sIGZpbGVuYW1lLCBsaW5lbm8pOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgaWYgKGNvLT5jb19maXJzdGxpbmVubyAhPSAwKQorICAgICAgICBsaW5lbm8gPSBjby0+Y29fZmlyc3RsaW5lbm87CisgICAgaWYgKGNvLT5jb19maWxlbmFtZSAmJiBQeVN0cmluZ19DaGVjayhjby0+Y29fZmlsZW5hbWUpKQorICAgICAgICBmaWxlbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fZmlsZW5hbWUpOworICAgIGlmIChjby0+Y29fbmFtZSAmJiBQeVN0cmluZ19DaGVjayhjby0+Y29fbmFtZSkpCisgICAgICAgIG5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoY28tPmNvX25hbWUpOworICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICI8Y29kZSBvYmplY3QgJS4xMDBzIGF0ICVwLCBmaWxlIFwiJS4zMDBzXCIsIGxpbmUgJWQ+IiwKKyAgICAgICAgICAgICAgICAgIG5hbWUsIGNvLCBmaWxlbmFtZSwgbGluZW5vKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50CiBjb2RlX2NvbXBhcmUoUHlDb2RlT2JqZWN0ICpjbywgUHlDb2RlT2JqZWN0ICpjcCkKIHsKLQlpbnQgY21wOwotCWNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX25hbWUsIGNwLT5jb19uYW1lKTsKLQlpZiAoY21wKSByZXR1cm4gY21wOwotCWNtcCA9IGNvLT5jb19hcmdjb3VudCAtIGNwLT5jb19hcmdjb3VudDsKLQlpZiAoY21wKSBnb3RvIG5vcm1hbGl6ZTsKLQljbXAgPSBjby0+Y29fbmxvY2FscyAtIGNwLT5jb19ubG9jYWxzOwotCWlmIChjbXApIGdvdG8gbm9ybWFsaXplOwotCWNtcCA9IGNvLT5jb19mbGFncyAtIGNwLT5jb19mbGFnczsKLQlpZiAoY21wKSBnb3RvIG5vcm1hbGl6ZTsKLQljbXAgPSBjby0+Y29fZmlyc3RsaW5lbm8gLSBjcC0+Y29fZmlyc3RsaW5lbm87Ci0JaWYgKGNtcCkgZ290byBub3JtYWxpemU7Ci0JY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fY29kZSwgY3AtPmNvX2NvZGUpOwotCWlmIChjbXApIHJldHVybiBjbXA7Ci0JY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fY29uc3RzLCBjcC0+Y29fY29uc3RzKTsKLQlpZiAoY21wKSByZXR1cm4gY21wOwotCWNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX25hbWVzLCBjcC0+Y29fbmFtZXMpOwotCWlmIChjbXApIHJldHVybiBjbXA7Ci0JY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fdmFybmFtZXMsIGNwLT5jb192YXJuYW1lcyk7Ci0JaWYgKGNtcCkgcmV0dXJuIGNtcDsKLQljbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb19mcmVldmFycywgY3AtPmNvX2ZyZWV2YXJzKTsKLQlpZiAoY21wKSByZXR1cm4gY21wOwotCWNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX2NlbGx2YXJzLCBjcC0+Y29fY2VsbHZhcnMpOwotCXJldHVybiBjbXA7CisgICAgaW50IGNtcDsKKyAgICBjbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb19uYW1lLCBjcC0+Y29fbmFtZSk7CisgICAgaWYgKGNtcCkgcmV0dXJuIGNtcDsKKyAgICBjbXAgPSBjby0+Y29fYXJnY291bnQgLSBjcC0+Y29fYXJnY291bnQ7CisgICAgaWYgKGNtcCkgZ290byBub3JtYWxpemU7CisgICAgY21wID0gY28tPmNvX25sb2NhbHMgLSBjcC0+Y29fbmxvY2FsczsKKyAgICBpZiAoY21wKSBnb3RvIG5vcm1hbGl6ZTsKKyAgICBjbXAgPSBjby0+Y29fZmxhZ3MgLSBjcC0+Y29fZmxhZ3M7CisgICAgaWYgKGNtcCkgZ290byBub3JtYWxpemU7CisgICAgY21wID0gY28tPmNvX2ZpcnN0bGluZW5vIC0gY3AtPmNvX2ZpcnN0bGluZW5vOworICAgIGlmIChjbXApIGdvdG8gbm9ybWFsaXplOworICAgIGNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX2NvZGUsIGNwLT5jb19jb2RlKTsKKyAgICBpZiAoY21wKSByZXR1cm4gY21wOworICAgIGNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX2NvbnN0cywgY3AtPmNvX2NvbnN0cyk7CisgICAgaWYgKGNtcCkgcmV0dXJuIGNtcDsKKyAgICBjbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb19uYW1lcywgY3AtPmNvX25hbWVzKTsKKyAgICBpZiAoY21wKSByZXR1cm4gY21wOworICAgIGNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX3Zhcm5hbWVzLCBjcC0+Y29fdmFybmFtZXMpOworICAgIGlmIChjbXApIHJldHVybiBjbXA7CisgICAgY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fZnJlZXZhcnMsIGNwLT5jb19mcmVldmFycyk7CisgICAgaWYgKGNtcCkgcmV0dXJuIGNtcDsKKyAgICBjbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb19jZWxsdmFycywgY3AtPmNvX2NlbGx2YXJzKTsKKyAgICByZXR1cm4gY21wOwogCiAgbm9ybWFsaXplOgotCWlmIChjbXAgPiAwKQotCQlyZXR1cm4gMTsKLQllbHNlIGlmIChjbXAgPCAwKQotCQlyZXR1cm4gLTE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKKyAgICBpZiAoY21wID4gMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb2RlX3JpY2hjb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlQeUNvZGVPYmplY3QgKmNvLCAqY3A7Ci0JaW50IGVxOwotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlDb2RlT2JqZWN0ICpjbywgKmNwOworICAgIGludCBlcTsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKChvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSkgfHwKLQkgICAgIVB5Q29kZV9DaGVjayhzZWxmKSB8fAotCSAgICAhUHlDb2RlX0NoZWNrKG90aGVyKSkgeworICAgIGlmICgob3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUpIHx8CisgICAgICAgICFQeUNvZGVfQ2hlY2soc2VsZikgfHwKKyAgICAgICAgIVB5Q29kZV9DaGVjayhvdGhlcikpIHsKIAotCQkvKiBQeTNLIHdhcm5pbmcgaWYgdHlwZXMgYXJlIG5vdCBlcXVhbCBhbmQgY29tcGFyaXNvbgotCQlpc24ndCA9PSBvciAhPSAgKi8KLQkJaWYgKFB5RXJyX1dhcm5QeTNrKCJjb2RlIGluZXF1YWxpdHkgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCAiCi0JCQkJICAgImluIDMueCIsIDEpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgLyogUHkzSyB3YXJuaW5nIGlmIHR5cGVzIGFyZSBub3QgZXF1YWwgYW5kIGNvbXBhcmlzb24KKyAgICAgICAgaXNuJ3QgPT0gb3IgIT0gICovCisgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygiY29kZSBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIDMueCIsIDEpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JY28gPSAoUHlDb2RlT2JqZWN0ICopc2VsZjsKLQljcCA9IChQeUNvZGVPYmplY3QgKilvdGhlcjsKKyAgICBjbyA9IChQeUNvZGVPYmplY3QgKilzZWxmOworICAgIGNwID0gKFB5Q29kZU9iamVjdCAqKW90aGVyOwogCi0JZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX25hbWUsIGNwLT5jb19uYW1lLCBQeV9FUSk7Ci0JaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKLQllcSA9IGNvLT5jb19hcmdjb3VudCA9PSBjcC0+Y29fYXJnY291bnQ7Ci0JaWYgKCFlcSkgZ290byB1bmVxdWFsOwotCWVxID0gY28tPmNvX25sb2NhbHMgPT0gY3AtPmNvX25sb2NhbHM7Ci0JaWYgKCFlcSkgZ290byB1bmVxdWFsOwotCWVxID0gY28tPmNvX2ZsYWdzID09IGNwLT5jb19mbGFnczsKLQlpZiAoIWVxKSBnb3RvIHVuZXF1YWw7Ci0JZXEgPSBjby0+Y29fZmlyc3RsaW5lbm8gPT0gY3AtPmNvX2ZpcnN0bGluZW5vOwotCWlmICghZXEpIGdvdG8gdW5lcXVhbDsKLQllcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fY29kZSwgY3AtPmNvX2NvZGUsIFB5X0VRKTsKLQlpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOwotCWVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb19jb25zdHMsIGNwLT5jb19jb25zdHMsIFB5X0VRKTsKLQlpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOwotCWVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb19uYW1lcywgY3AtPmNvX25hbWVzLCBQeV9FUSk7Ci0JaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKLQllcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fdmFybmFtZXMsIGNwLT5jb192YXJuYW1lcywgUHlfRVEpOwotCWlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7Ci0JZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX2ZyZWV2YXJzLCBjcC0+Y29fZnJlZXZhcnMsIFB5X0VRKTsKLQlpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOwotCWVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb19jZWxsdmFycywgY3AtPmNvX2NlbGx2YXJzLCBQeV9FUSk7Ci0JaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKKyAgICBlcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fbmFtZSwgY3AtPmNvX25hbWUsIFB5X0VRKTsKKyAgICBpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOworICAgIGVxID0gY28tPmNvX2FyZ2NvdW50ID09IGNwLT5jb19hcmdjb3VudDsKKyAgICBpZiAoIWVxKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBjby0+Y29fbmxvY2FscyA9PSBjcC0+Y29fbmxvY2FsczsKKyAgICBpZiAoIWVxKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBjby0+Y29fZmxhZ3MgPT0gY3AtPmNvX2ZsYWdzOworICAgIGlmICghZXEpIGdvdG8gdW5lcXVhbDsKKyAgICBlcSA9IGNvLT5jb19maXJzdGxpbmVubyA9PSBjcC0+Y29fZmlyc3RsaW5lbm87CisgICAgaWYgKCFlcSkgZ290byB1bmVxdWFsOworICAgIGVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb19jb2RlLCBjcC0+Y29fY29kZSwgUHlfRVEpOworICAgIGlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX2NvbnN0cywgY3AtPmNvX2NvbnN0cywgUHlfRVEpOworICAgIGlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX25hbWVzLCBjcC0+Y29fbmFtZXMsIFB5X0VRKTsKKyAgICBpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOworICAgIGVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb192YXJuYW1lcywgY3AtPmNvX3Zhcm5hbWVzLCBQeV9FUSk7CisgICAgaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKKyAgICBlcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fZnJlZXZhcnMsIGNwLT5jb19mcmVldmFycywgUHlfRVEpOworICAgIGlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX2NlbGx2YXJzLCBjcC0+Y29fY2VsbHZhcnMsIFB5X0VRKTsKKyAgICBpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOwogCi0JaWYgKG9wID09IFB5X0VRKQotCQlyZXMgPSBQeV9UcnVlOwotCWVsc2UKLQkJcmVzID0gUHlfRmFsc2U7Ci0JZ290byBkb25lOworICAgIGlmIChvcCA9PSBQeV9FUSkKKyAgICAgICAgcmVzID0gUHlfVHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5X0ZhbHNlOworICAgIGdvdG8gZG9uZTsKIAogICB1bmVxdWFsOgotCWlmIChlcSA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChvcCA9PSBQeV9ORSkKLQkJcmVzID0gUHlfVHJ1ZTsKLQllbHNlCi0JCXJlcyA9IFB5X0ZhbHNlOworICAgIGlmIChlcSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChvcCA9PSBQeV9ORSkKKyAgICAgICAgcmVzID0gUHlfVHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5X0ZhbHNlOwogCiAgIGRvbmU6Ci0JUHlfSU5DUkVGKHJlcyk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9JTkNSRUYocmVzKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgbG9uZwogY29kZV9oYXNoKFB5Q29kZU9iamVjdCAqY28pCiB7Ci0JbG9uZyBoLCBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNjsKLQloMCA9IFB5T2JqZWN0X0hhc2goY28tPmNvX25hbWUpOwotCWlmIChoMCA9PSAtMSkgcmV0dXJuIC0xOwotCWgxID0gUHlPYmplY3RfSGFzaChjby0+Y29fY29kZSk7Ci0JaWYgKGgxID09IC0xKSByZXR1cm4gLTE7Ci0JaDIgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19jb25zdHMpOwotCWlmIChoMiA9PSAtMSkgcmV0dXJuIC0xOwotCWgzID0gUHlPYmplY3RfSGFzaChjby0+Y29fbmFtZXMpOwotCWlmIChoMyA9PSAtMSkgcmV0dXJuIC0xOwotCWg0ID0gUHlPYmplY3RfSGFzaChjby0+Y29fdmFybmFtZXMpOwotCWlmIChoNCA9PSAtMSkgcmV0dXJuIC0xOwotCWg1ID0gUHlPYmplY3RfSGFzaChjby0+Y29fZnJlZXZhcnMpOwotCWlmIChoNSA9PSAtMSkgcmV0dXJuIC0xOwotCWg2ID0gUHlPYmplY3RfSGFzaChjby0+Y29fY2VsbHZhcnMpOwotCWlmIChoNiA9PSAtMSkgcmV0dXJuIC0xOwotCWggPSBoMCBeIGgxIF4gaDIgXiBoMyBeIGg0IF4gaDUgXiBoNiBeCi0JCWNvLT5jb19hcmdjb3VudCBeIGNvLT5jb19ubG9jYWxzIF4gY28tPmNvX2ZsYWdzOwotCWlmIChoID09IC0xKSBoID0gLTI7Ci0JcmV0dXJuIGg7CisgICAgbG9uZyBoLCBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNjsKKyAgICBoMCA9IFB5T2JqZWN0X0hhc2goY28tPmNvX25hbWUpOworICAgIGlmIChoMCA9PSAtMSkgcmV0dXJuIC0xOworICAgIGgxID0gUHlPYmplY3RfSGFzaChjby0+Y29fY29kZSk7CisgICAgaWYgKGgxID09IC0xKSByZXR1cm4gLTE7CisgICAgaDIgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19jb25zdHMpOworICAgIGlmIChoMiA9PSAtMSkgcmV0dXJuIC0xOworICAgIGgzID0gUHlPYmplY3RfSGFzaChjby0+Y29fbmFtZXMpOworICAgIGlmIChoMyA9PSAtMSkgcmV0dXJuIC0xOworICAgIGg0ID0gUHlPYmplY3RfSGFzaChjby0+Y29fdmFybmFtZXMpOworICAgIGlmIChoNCA9PSAtMSkgcmV0dXJuIC0xOworICAgIGg1ID0gUHlPYmplY3RfSGFzaChjby0+Y29fZnJlZXZhcnMpOworICAgIGlmIChoNSA9PSAtMSkgcmV0dXJuIC0xOworICAgIGg2ID0gUHlPYmplY3RfSGFzaChjby0+Y29fY2VsbHZhcnMpOworICAgIGlmIChoNiA9PSAtMSkgcmV0dXJuIC0xOworICAgIGggPSBoMCBeIGgxIF4gaDIgXiBoMyBeIGg0IF4gaDUgXiBoNiBeCisgICAgICAgIGNvLT5jb19hcmdjb3VudCBeIGNvLT5jb19ubG9jYWxzIF4gY28tPmNvX2ZsYWdzOworICAgIGlmIChoID09IC0xKSBoID0gLTI7CisgICAgcmV0dXJuIGg7CiB9CiAKIC8qIFhYWCBjb2RlIG9iamVjdHMgbmVlZCB0byBwYXJ0aWNpcGF0ZSBpbiBHQz8gKi8KIAogUHlUeXBlT2JqZWN0IFB5Q29kZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImNvZGUiLAotCXNpemVvZihQeUNvZGVPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpY29kZV9kZWFsbG9jLCAJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwgCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpY29kZV9jb21wYXJlLCAJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpY29kZV9yZXByLAkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYyljb2RlX2hhc2gsIAkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCi0JY29kZV9kb2MsCQkJLyogdHBfZG9jICovCi0JMCwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCWNvZGVfcmljaGNvbXBhcmUsCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCW9mZnNldG9mKFB5Q29kZU9iamVjdCwgY29fd2Vha3JlZmxpc3QpLCAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQljb2RlX21lbWJlcmxpc3QsCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JY29kZV9uZXcsCQkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiY29kZSIsCisgICAgc2l6ZW9mKFB5Q29kZU9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3Rvciljb2RlX2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIChjbXBmdW5jKWNvZGVfY29tcGFyZSwgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpY29kZV9yZXByLCAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWNvZGVfaGFzaCwgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjb2RlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgY29kZV9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeUNvZGVPYmplY3QsIGNvX3dlYWtyZWZsaXN0KSwgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgY29kZV9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvZGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogLyogVXNlIGNvX2xub3RhYiB0byBjb21wdXRlIHRoZSBsaW5lIG51bWJlciBmcm9tIGEgYnl0ZWNvZGUgaW5kZXgsIGFkZHJxLiAgU2VlCkBAIC01MTcsMTcgKzUxNywxNyBAQAogaW50CiBQeUNvZGVfQWRkcjJMaW5lKFB5Q29kZU9iamVjdCAqY28sIGludCBhZGRycSkKIHsKLQlpbnQgc2l6ZSA9IFB5U3RyaW5nX1NpemUoY28tPmNvX2xub3RhYikgLyAyOwotCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX2xub3RhYik7Ci0JaW50IGxpbmUgPSBjby0+Y29fZmlyc3RsaW5lbm87Ci0JaW50IGFkZHIgPSAwOwotCXdoaWxlICgtLXNpemUgPj0gMCkgewotCQlhZGRyICs9ICpwKys7Ci0JCWlmIChhZGRyID4gYWRkcnEpCi0JCQlicmVhazsKLQkJbGluZSArPSAqcCsrOwotCX0KLQlyZXR1cm4gbGluZTsKKyAgICBpbnQgc2l6ZSA9IFB5U3RyaW5nX1NpemUoY28tPmNvX2xub3RhYikgLyAyOworICAgIHVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX2xub3RhYik7CisgICAgaW50IGxpbmUgPSBjby0+Y29fZmlyc3RsaW5lbm87CisgICAgaW50IGFkZHIgPSAwOworICAgIHdoaWxlICgtLXNpemUgPj0gMCkgeworICAgICAgICBhZGRyICs9ICpwKys7CisgICAgICAgIGlmIChhZGRyID4gYWRkcnEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGluZSArPSAqcCsrOworICAgIH0KKyAgICByZXR1cm4gbGluZTsKIH0KIAogLyogVXBkYXRlICpib3VuZHMgdG8gZGVzY3JpYmUgdGhlIGZpcnN0IGFuZCBvbmUtcGFzdC10aGUtbGFzdCBpbnN0cnVjdGlvbnMgaW4KQEAgLTUzNSw0NyArNTM1LDQ3IEBACiBpbnQKIF9QeUNvZGVfQ2hlY2tMaW5lTnVtYmVyKFB5Q29kZU9iamVjdCogY28sIGludCBsYXN0aSwgUHlBZGRyUGFpciAqYm91bmRzKQogewotICAgICAgICBpbnQgc2l6ZSwgYWRkciwgbGluZTsKLSAgICAgICAgdW5zaWduZWQgY2hhciogcDsKKyAgICBpbnQgc2l6ZSwgYWRkciwgbGluZTsKKyAgICB1bnNpZ25lZCBjaGFyKiBwOwogCi0gICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19sbm90YWIpOwotICAgICAgICBzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoY28tPmNvX2xub3RhYikgLyAyOworICAgIHAgPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19sbm90YWIpOworICAgIHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShjby0+Y29fbG5vdGFiKSAvIDI7CiAKLSAgICAgICAgYWRkciA9IDA7Ci0gICAgICAgIGxpbmUgPSBjby0+Y29fZmlyc3RsaW5lbm87Ci0gICAgICAgIGFzc2VydChsaW5lID4gMCk7CisgICAgYWRkciA9IDA7CisgICAgbGluZSA9IGNvLT5jb19maXJzdGxpbmVubzsKKyAgICBhc3NlcnQobGluZSA+IDApOwogCi0gICAgICAgIC8qIHBvc3NpYmxlIG9wdGltaXphdGlvbjogaWYgZi0+Zl9sYXN0aSA9PSBpbnN0cl91YgotICAgICAgICAgICAobGlrZWx5IHRvIGJlIGEgY29tbW9uIGNhc2UpIHRoZW4gd2UgYWxyZWFkeSBrbm93Ci0gICAgICAgICAgIGluc3RyX2xiIC0tIGlmIHdlIHN0b3JlZCB0aGUgbWF0Y2hpbmcgdmFsdWUgb2YgcAotICAgICAgICAgICBzb213aGVyZSB3ZSBjb3VsZCBza2lwIHRoZSBmaXJzdCB3aGlsZSBsb29wLiAqLworICAgIC8qIHBvc3NpYmxlIG9wdGltaXphdGlvbjogaWYgZi0+Zl9sYXN0aSA9PSBpbnN0cl91YgorICAgICAgIChsaWtlbHkgdG8gYmUgYSBjb21tb24gY2FzZSkgdGhlbiB3ZSBhbHJlYWR5IGtub3cKKyAgICAgICBpbnN0cl9sYiAtLSBpZiB3ZSBzdG9yZWQgdGhlIG1hdGNoaW5nIHZhbHVlIG9mIHAKKyAgICAgICBzb213aGVyZSB3ZSBjb3VsZCBza2lwIHRoZSBmaXJzdCB3aGlsZSBsb29wLiAqLwogCi0gICAgICAgIC8qIFNlZSBsbm90YWJfbm90ZXMudHh0IGZvciB0aGUgZGVzY3JpcHRpb24gb2YKLSAgICAgICAgICAgY29fbG5vdGFiLiAgQSBwb2ludCB0byByZW1lbWJlcjogaW5jcmVtZW50cyB0byBwCi0gICAgICAgICAgIGNvbWUgaW4gKGFkZHIsIGxpbmUpIHBhaXJzLiAqLworICAgIC8qIFNlZSBsbm90YWJfbm90ZXMudHh0IGZvciB0aGUgZGVzY3JpcHRpb24gb2YKKyAgICAgICBjb19sbm90YWIuICBBIHBvaW50IHRvIHJlbWVtYmVyOiBpbmNyZW1lbnRzIHRvIHAKKyAgICAgICBjb21lIGluIChhZGRyLCBsaW5lKSBwYWlycy4gKi8KIAotICAgICAgICBib3VuZHMtPmFwX2xvd2VyID0gMDsKLSAgICAgICAgd2hpbGUgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHIgKyAqcCA+IGxhc3RpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgYWRkciArPSAqcCsrOwotICAgICAgICAgICAgICAgIGlmICgqcCkgCi0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMtPmFwX2xvd2VyID0gYWRkcjsKLSAgICAgICAgICAgICAgICBsaW5lICs9ICpwKys7Ci0gICAgICAgICAgICAgICAgLS1zaXplOworICAgIGJvdW5kcy0+YXBfbG93ZXIgPSAwOworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBpZiAoYWRkciArICpwID4gbGFzdGkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYWRkciArPSAqcCsrOworICAgICAgICBpZiAoKnApCisgICAgICAgICAgICBib3VuZHMtPmFwX2xvd2VyID0gYWRkcjsKKyAgICAgICAgbGluZSArPSAqcCsrOworICAgICAgICAtLXNpemU7CisgICAgfQorCisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIHdoaWxlICgtLXNpemUgPj0gMCkgeworICAgICAgICAgICAgYWRkciArPSAqcCsrOworICAgICAgICAgICAgaWYgKCpwKyspCisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKyAgICAgICAgYm91bmRzLT5hcF91cHBlciA9IGFkZHI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBib3VuZHMtPmFwX3VwcGVyID0gSU5UX01BWDsKKyAgICB9CiAKLSAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKC0tc2l6ZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyICs9ICpwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnArKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvdW5kcy0+YXBfdXBwZXIgPSBhZGRyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJvdW5kcy0+YXBfdXBwZXIgPSBJTlRfTUFYOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgcmV0dXJuIGxpbmU7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2NvbXBsZXhvYmplY3QuYyBiL09iamVjdHMvY29tcGxleG9iamVjdC5jCmluZGV4IDQyZTQ0N2QuLjVmMjZhNmEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY29tcGxleG9iamVjdC5jCisrKyBiL09iamVjdHMvY29tcGxleG9iamVjdC5jCkBAIC0yMyw4ICsyMyw4IEBACiAgICBwcmVjaXNpb24gZm9yIHByYWN0aWNhbCB1c2UuCiAqLwogCi0jZGVmaW5lIFBSRUNfUkVQUgkxNwotI2RlZmluZSBQUkVDX1NUUgkxMgorI2RlZmluZSBQUkVDX1JFUFIgICAgICAgMTcKKyNkZWZpbmUgUFJFQ19TVFIgICAgICAgIDEyCiAKIC8qIGVsZW1lbnRhcnkgb3BlcmF0aW9ucyBvbiBjb21wbGV4IG51bWJlcnMgKi8KIApAQCAtMzMsNDE0ICszMyw0MTQgQEAKIFB5X2NvbXBsZXgKIGNfc3VtKFB5X2NvbXBsZXggYSwgUHlfY29tcGxleCBiKQogewotCVB5X2NvbXBsZXggcjsKLQlyLnJlYWwgPSBhLnJlYWwgKyBiLnJlYWw7Ci0Jci5pbWFnID0gYS5pbWFnICsgYi5pbWFnOwotCXJldHVybiByOworICAgIFB5X2NvbXBsZXggcjsKKyAgICByLnJlYWwgPSBhLnJlYWwgKyBiLnJlYWw7CisgICAgci5pbWFnID0gYS5pbWFnICsgYi5pbWFnOworICAgIHJldHVybiByOwogfQogCiBQeV9jb21wbGV4CiBjX2RpZmYoUHlfY29tcGxleCBhLCBQeV9jb21wbGV4IGIpCiB7Ci0JUHlfY29tcGxleCByOwotCXIucmVhbCA9IGEucmVhbCAtIGIucmVhbDsKLQlyLmltYWcgPSBhLmltYWcgLSBiLmltYWc7Ci0JcmV0dXJuIHI7CisgICAgUHlfY29tcGxleCByOworICAgIHIucmVhbCA9IGEucmVhbCAtIGIucmVhbDsKKyAgICByLmltYWcgPSBhLmltYWcgLSBiLmltYWc7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5X2NvbXBsZXgKIGNfbmVnKFB5X2NvbXBsZXggYSkKIHsKLQlQeV9jb21wbGV4IHI7Ci0Jci5yZWFsID0gLWEucmVhbDsKLQlyLmltYWcgPSAtYS5pbWFnOwotCXJldHVybiByOworICAgIFB5X2NvbXBsZXggcjsKKyAgICByLnJlYWwgPSAtYS5yZWFsOworICAgIHIuaW1hZyA9IC1hLmltYWc7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5X2NvbXBsZXgKIGNfcHJvZChQeV9jb21wbGV4IGEsIFB5X2NvbXBsZXggYikKIHsKLQlQeV9jb21wbGV4IHI7Ci0Jci5yZWFsID0gYS5yZWFsKmIucmVhbCAtIGEuaW1hZypiLmltYWc7Ci0Jci5pbWFnID0gYS5yZWFsKmIuaW1hZyArIGEuaW1hZypiLnJlYWw7Ci0JcmV0dXJuIHI7CisgICAgUHlfY29tcGxleCByOworICAgIHIucmVhbCA9IGEucmVhbCpiLnJlYWwgLSBhLmltYWcqYi5pbWFnOworICAgIHIuaW1hZyA9IGEucmVhbCpiLmltYWcgKyBhLmltYWcqYi5yZWFsOworICAgIHJldHVybiByOwogfQogCiBQeV9jb21wbGV4CiBjX3F1b3QoUHlfY29tcGxleCBhLCBQeV9jb21wbGV4IGIpCiB7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCVRoaXMgd2FzIHRoZSBvcmlnaW5hbCBhbGdvcml0aG0uICBJdCdzIGdyb3NzbHkgcHJvbmUgdG8gc3B1cmlvdXMKLQlvdmVyZmxvdyBhbmQgdW5kZXJmbG93IGVycm9ycy4gIEl0IGFsc28gbWVycmlseSBkaXZpZGVzIGJ5IDAgZGVzcGl0ZQotCWNoZWNraW5nIGZvciB0aGF0KCEpLiAgVGhlIGNvZGUgc3RpbGwgc2VydmVzIGEgZG9jIHB1cnBvc2UgaGVyZSwgYXMKLQl0aGUgYWxnb3JpdGhtIGZvbGxvd2luZyBpcyBhIHNpbXBsZSBieS1jYXNlcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGlzCi0Jb25lOgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBUaGlzIHdhcyB0aGUgb3JpZ2luYWwgYWxnb3JpdGhtLiAgSXQncyBncm9zc2x5IHByb25lIHRvIHNwdXJpb3VzCisgICAgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyBlcnJvcnMuICBJdCBhbHNvIG1lcnJpbHkgZGl2aWRlcyBieSAwIGRlc3BpdGUKKyAgICBjaGVja2luZyBmb3IgdGhhdCghKS4gIFRoZSBjb2RlIHN0aWxsIHNlcnZlcyBhIGRvYyBwdXJwb3NlIGhlcmUsIGFzCisgICAgdGhlIGFsZ29yaXRobSBmb2xsb3dpbmcgaXMgYSBzaW1wbGUgYnktY2FzZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhpcworICAgIG9uZToKIAotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgZCA9IGIucmVhbCpiLnJlYWwgKyBiLmltYWcqYi5pbWFnOwotCWlmIChkID09IDAuKQotCQllcnJubyA9IEVET007Ci0Jci5yZWFsID0gKGEucmVhbCpiLnJlYWwgKyBhLmltYWcqYi5pbWFnKS9kOwotCXIuaW1hZyA9IChhLmltYWcqYi5yZWFsIC0gYS5yZWFsKmIuaW1hZykvZDsKLQlyZXR1cm4gcjsKLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgUHlfY29tcGxleCByOworICAgIGRvdWJsZSBkID0gYi5yZWFsKmIucmVhbCArIGIuaW1hZypiLmltYWc7CisgICAgaWYgKGQgPT0gMC4pCisgICAgICAgIGVycm5vID0gRURPTTsKKyAgICByLnJlYWwgPSAoYS5yZWFsKmIucmVhbCArIGEuaW1hZypiLmltYWcpL2Q7CisgICAgci5pbWFnID0gKGEuaW1hZypiLnJlYWwgLSBhLnJlYWwqYi5pbWFnKS9kOworICAgIHJldHVybiByOworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCS8qIFRoaXMgYWxnb3JpdGhtIGlzIGJldHRlciwgYW5kIGlzIHByZXR0eSBvYnZpb3VzOiAgZmlyc3QgZGl2aWRlIHRoZQotCSAqIG51bWVyYXRvcnMgYW5kIGRlbm9taW5hdG9yIGJ5IHdoaWNoZXZlciBvZiB7Yi5yZWFsLCBiLmltYWd9IGhhcwotCSAqIGxhcmdlciBtYWduaXR1ZGUuICBUaGUgZWFybGllc3QgcmVmZXJlbmNlIEkgZm91bmQgd2FzIHRvIENBQ00KLQkgKiBBbGdvcml0aG0gMTE2IChDb21wbGV4IERpdmlzaW9uLCBSb2JlcnQgTC4gU21pdGgsIFN0YW5mb3JkCi0JICogVW5pdmVyc2l0eSkuICBBcyB1c3VhbCwgdGhvdWdoLCB3ZSdyZSBzdGlsbCBpZ25vcmluZyBhbGwgSUVFRQotCSAqIGVuZGNhc2VzLgotCSAqLwotCSBQeV9jb21wbGV4IHI7CS8qIHRoZSByZXN1bHQgKi8KLSAJIGNvbnN0IGRvdWJsZSBhYnNfYnJlYWwgPSBiLnJlYWwgPCAwID8gLWIucmVhbCA6IGIucmVhbDsKLQkgY29uc3QgZG91YmxlIGFic19iaW1hZyA9IGIuaW1hZyA8IDAgPyAtYi5pbWFnIDogYi5pbWFnOworICAgIC8qIFRoaXMgYWxnb3JpdGhtIGlzIGJldHRlciwgYW5kIGlzIHByZXR0eSBvYnZpb3VzOiAgZmlyc3QgZGl2aWRlIHRoZQorICAgICAqIG51bWVyYXRvcnMgYW5kIGRlbm9taW5hdG9yIGJ5IHdoaWNoZXZlciBvZiB7Yi5yZWFsLCBiLmltYWd9IGhhcworICAgICAqIGxhcmdlciBtYWduaXR1ZGUuICBUaGUgZWFybGllc3QgcmVmZXJlbmNlIEkgZm91bmQgd2FzIHRvIENBQ00KKyAgICAgKiBBbGdvcml0aG0gMTE2IChDb21wbGV4IERpdmlzaW9uLCBSb2JlcnQgTC4gU21pdGgsIFN0YW5mb3JkCisgICAgICogVW5pdmVyc2l0eSkuICBBcyB1c3VhbCwgdGhvdWdoLCB3ZSdyZSBzdGlsbCBpZ25vcmluZyBhbGwgSUVFRQorICAgICAqIGVuZGNhc2VzLgorICAgICAqLworICAgICBQeV9jb21wbGV4IHI7ICAgICAgLyogdGhlIHJlc3VsdCAqLworICAgICBjb25zdCBkb3VibGUgYWJzX2JyZWFsID0gYi5yZWFsIDwgMCA/IC1iLnJlYWwgOiBiLnJlYWw7CisgICAgIGNvbnN0IGRvdWJsZSBhYnNfYmltYWcgPSBiLmltYWcgPCAwID8gLWIuaW1hZyA6IGIuaW1hZzsKIAotCSBpZiAoYWJzX2JyZWFsID49IGFic19iaW1hZykgewotIAkJLyogZGl2aWRlIHRvcHMgYW5kIGJvdHRvbSBieSBiLnJlYWwgKi8KLQkgCWlmIChhYnNfYnJlYWwgPT0gMC4wKSB7Ci0JIAkJZXJybm8gPSBFRE9NOwotCSAJCXIucmVhbCA9IHIuaW1hZyA9IDAuMDsKLQkgCX0KLQkgCWVsc2UgewotCSAJCWNvbnN0IGRvdWJsZSByYXRpbyA9IGIuaW1hZyAvIGIucmVhbDsKLQkgCQljb25zdCBkb3VibGUgZGVub20gPSBiLnJlYWwgKyBiLmltYWcgKiByYXRpbzsKLQkgCQlyLnJlYWwgPSAoYS5yZWFsICsgYS5pbWFnICogcmF0aW8pIC8gZGVub207Ci0JIAkJci5pbWFnID0gKGEuaW1hZyAtIGEucmVhbCAqIHJhdGlvKSAvIGRlbm9tOwotCSAJfQotCX0KLQllbHNlIHsKLQkJLyogZGl2aWRlIHRvcHMgYW5kIGJvdHRvbSBieSBiLmltYWcgKi8KLQkJY29uc3QgZG91YmxlIHJhdGlvID0gYi5yZWFsIC8gYi5pbWFnOwotCQljb25zdCBkb3VibGUgZGVub20gPSBiLnJlYWwgKiByYXRpbyArIGIuaW1hZzsKLQkJYXNzZXJ0KGIuaW1hZyAhPSAwLjApOwotCQlyLnJlYWwgPSAoYS5yZWFsICogcmF0aW8gKyBhLmltYWcpIC8gZGVub207Ci0JCXIuaW1hZyA9IChhLmltYWcgKiByYXRpbyAtIGEucmVhbCkgLyBkZW5vbTsKLQl9Ci0JcmV0dXJuIHI7CisgICAgIGlmIChhYnNfYnJlYWwgPj0gYWJzX2JpbWFnKSB7CisgICAgICAgIC8qIGRpdmlkZSB0b3BzIGFuZCBib3R0b20gYnkgYi5yZWFsICovCisgICAgICAgIGlmIChhYnNfYnJlYWwgPT0gMC4wKSB7CisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgICAgICByLnJlYWwgPSByLmltYWcgPSAwLjA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcmF0aW8gPSBiLmltYWcgLyBiLnJlYWw7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgZGVub20gPSBiLnJlYWwgKyBiLmltYWcgKiByYXRpbzsKKyAgICAgICAgICAgIHIucmVhbCA9IChhLnJlYWwgKyBhLmltYWcgKiByYXRpbykgLyBkZW5vbTsKKyAgICAgICAgICAgIHIuaW1hZyA9IChhLmltYWcgLSBhLnJlYWwgKiByYXRpbykgLyBkZW5vbTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogZGl2aWRlIHRvcHMgYW5kIGJvdHRvbSBieSBiLmltYWcgKi8KKyAgICAgICAgY29uc3QgZG91YmxlIHJhdGlvID0gYi5yZWFsIC8gYi5pbWFnOworICAgICAgICBjb25zdCBkb3VibGUgZGVub20gPSBiLnJlYWwgKiByYXRpbyArIGIuaW1hZzsKKyAgICAgICAgYXNzZXJ0KGIuaW1hZyAhPSAwLjApOworICAgICAgICByLnJlYWwgPSAoYS5yZWFsICogcmF0aW8gKyBhLmltYWcpIC8gZGVub207CisgICAgICAgIHIuaW1hZyA9IChhLmltYWcgKiByYXRpbyAtIGEucmVhbCkgLyBkZW5vbTsKKyAgICB9CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5X2NvbXBsZXgKIGNfcG93KFB5X2NvbXBsZXggYSwgUHlfY29tcGxleCBiKQogewotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgdmFicyxsZW4sYXQscGhhc2U7Ci0JaWYgKGIucmVhbCA9PSAwLiAmJiBiLmltYWcgPT0gMC4pIHsKLQkJci5yZWFsID0gMS47Ci0JCXIuaW1hZyA9IDAuOwotCX0KLQllbHNlIGlmIChhLnJlYWwgPT0gMC4gJiYgYS5pbWFnID09IDAuKSB7Ci0JCWlmIChiLmltYWcgIT0gMC4gfHwgYi5yZWFsIDwgMC4pCi0JCQllcnJubyA9IEVET007Ci0JCXIucmVhbCA9IDAuOwotCQlyLmltYWcgPSAwLjsKLQl9Ci0JZWxzZSB7Ci0JCXZhYnMgPSBoeXBvdChhLnJlYWwsYS5pbWFnKTsKLQkJbGVuID0gcG93KHZhYnMsYi5yZWFsKTsKLQkJYXQgPSBhdGFuMihhLmltYWcsIGEucmVhbCk7Ci0JCXBoYXNlID0gYXQqYi5yZWFsOwotCQlpZiAoYi5pbWFnICE9IDAuMCkgewotCQkJbGVuIC89IGV4cChhdCpiLmltYWcpOwotCQkJcGhhc2UgKz0gYi5pbWFnKmxvZyh2YWJzKTsKLQkJfQotCQlyLnJlYWwgPSBsZW4qY29zKHBoYXNlKTsKLQkJci5pbWFnID0gbGVuKnNpbihwaGFzZSk7Ci0JfQotCXJldHVybiByOworICAgIFB5X2NvbXBsZXggcjsKKyAgICBkb3VibGUgdmFicyxsZW4sYXQscGhhc2U7CisgICAgaWYgKGIucmVhbCA9PSAwLiAmJiBiLmltYWcgPT0gMC4pIHsKKyAgICAgICAgci5yZWFsID0gMS47CisgICAgICAgIHIuaW1hZyA9IDAuOworICAgIH0KKyAgICBlbHNlIGlmIChhLnJlYWwgPT0gMC4gJiYgYS5pbWFnID09IDAuKSB7CisgICAgICAgIGlmIChiLmltYWcgIT0gMC4gfHwgYi5yZWFsIDwgMC4pCisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIHIucmVhbCA9IDAuOworICAgICAgICByLmltYWcgPSAwLjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHZhYnMgPSBoeXBvdChhLnJlYWwsYS5pbWFnKTsKKyAgICAgICAgbGVuID0gcG93KHZhYnMsYi5yZWFsKTsKKyAgICAgICAgYXQgPSBhdGFuMihhLmltYWcsIGEucmVhbCk7CisgICAgICAgIHBoYXNlID0gYXQqYi5yZWFsOworICAgICAgICBpZiAoYi5pbWFnICE9IDAuMCkgeworICAgICAgICAgICAgbGVuIC89IGV4cChhdCpiLmltYWcpOworICAgICAgICAgICAgcGhhc2UgKz0gYi5pbWFnKmxvZyh2YWJzKTsKKyAgICAgICAgfQorICAgICAgICByLnJlYWwgPSBsZW4qY29zKHBoYXNlKTsKKyAgICAgICAgci5pbWFnID0gbGVuKnNpbihwaGFzZSk7CisgICAgfQorICAgIHJldHVybiByOwogfQogCiBzdGF0aWMgUHlfY29tcGxleAogY19wb3d1KFB5X2NvbXBsZXggeCwgbG9uZyBuKQogewotCVB5X2NvbXBsZXggciwgcDsKLQlsb25nIG1hc2sgPSAxOwotCXIgPSBjXzE7Ci0JcCA9IHg7Ci0Jd2hpbGUgKG1hc2sgPiAwICYmIG4gPj0gbWFzaykgewotCQlpZiAobiAmIG1hc2spCi0JCQlyID0gY19wcm9kKHIscCk7Ci0JCW1hc2sgPDw9IDE7Ci0JCXAgPSBjX3Byb2QocCxwKTsKLQl9Ci0JcmV0dXJuIHI7CisgICAgUHlfY29tcGxleCByLCBwOworICAgIGxvbmcgbWFzayA9IDE7CisgICAgciA9IGNfMTsKKyAgICBwID0geDsKKyAgICB3aGlsZSAobWFzayA+IDAgJiYgbiA+PSBtYXNrKSB7CisgICAgICAgIGlmIChuICYgbWFzaykKKyAgICAgICAgICAgIHIgPSBjX3Byb2QocixwKTsKKyAgICAgICAgbWFzayA8PD0gMTsKKyAgICAgICAgcCA9IGNfcHJvZChwLHApOworICAgIH0KKyAgICByZXR1cm4gcjsKIH0KIAogc3RhdGljIFB5X2NvbXBsZXgKIGNfcG93aShQeV9jb21wbGV4IHgsIGxvbmcgbikKIHsKLQlQeV9jb21wbGV4IGNuOworICAgIFB5X2NvbXBsZXggY247CiAKLQlpZiAobiA+IDEwMCB8fCBuIDwgLTEwMCkgewotCQljbi5yZWFsID0gKGRvdWJsZSkgbjsKLQkJY24uaW1hZyA9IDAuOwotCQlyZXR1cm4gY19wb3coeCxjbik7Ci0JfQotCWVsc2UgaWYgKG4gPiAwKQotCQlyZXR1cm4gY19wb3d1KHgsbik7Ci0JZWxzZQotCQlyZXR1cm4gY19xdW90KGNfMSxjX3Bvd3UoeCwtbikpOworICAgIGlmIChuID4gMTAwIHx8IG4gPCAtMTAwKSB7CisgICAgICAgIGNuLnJlYWwgPSAoZG91YmxlKSBuOworICAgICAgICBjbi5pbWFnID0gMC47CisgICAgICAgIHJldHVybiBjX3Bvdyh4LGNuKTsKKyAgICB9CisgICAgZWxzZSBpZiAobiA+IDApCisgICAgICAgIHJldHVybiBjX3Bvd3UoeCxuKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBjX3F1b3QoY18xLGNfcG93dSh4LC1uKSk7CiAKIH0KIAogZG91YmxlCiBjX2FicyhQeV9jb21wbGV4IHopCiB7Ci0JLyogc2V0cyBlcnJubyA9IEVSQU5HRSBvbiBvdmVyZmxvdzsgIG90aGVyd2lzZSBlcnJubyA9IDAgKi8KLQlkb3VibGUgcmVzdWx0OworICAgIC8qIHNldHMgZXJybm8gPSBFUkFOR0Ugb24gb3ZlcmZsb3c7ICBvdGhlcndpc2UgZXJybm8gPSAwICovCisgICAgZG91YmxlIHJlc3VsdDsKIAotCWlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7Ci0JCS8qIEM5OSBydWxlczogaWYgZWl0aGVyIHRoZSByZWFsIG9yIHRoZSBpbWFnaW5hcnkgcGFydCBpcyBhbgotCQkgICBpbmZpbml0eSwgcmV0dXJuIGluZmluaXR5LCBldmVuIGlmIHRoZSBvdGhlciBwYXJ0IGlzIGEKLQkJICAgTmFOLiAqLwotCQlpZiAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSkgewotCQkJcmVzdWx0ID0gZmFicyh6LnJlYWwpOwotCQkJZXJybm8gPSAwOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAoUHlfSVNfSU5GSU5JVFkoei5pbWFnKSkgewotCQkJcmVzdWx0ID0gZmFicyh6LmltYWcpOwotCQkJZXJybm8gPSAwOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkvKiBlaXRoZXIgdGhlIHJlYWwgb3IgaW1hZ2luYXJ5IHBhcnQgaXMgYSBOYU4sCi0JCSAgIGFuZCBuZWl0aGVyIGlzIGluZmluaXRlLiBSZXN1bHQgc2hvdWxkIGJlIE5hTi4gKi8KLQkJcmV0dXJuIFB5X05BTjsKLQl9Ci0JcmVzdWx0ID0gaHlwb3Qoei5yZWFsLCB6LmltYWcpOwotCWlmICghUHlfSVNfRklOSVRFKHJlc3VsdCkpCi0JCWVycm5vID0gRVJBTkdFOwotCWVsc2UKLQkJZXJybm8gPSAwOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKCFQeV9JU19GSU5JVEUoei5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKHouaW1hZykpIHsKKyAgICAgICAgLyogQzk5IHJ1bGVzOiBpZiBlaXRoZXIgdGhlIHJlYWwgb3IgdGhlIGltYWdpbmFyeSBwYXJ0IGlzIGFuCisgICAgICAgICAgIGluZmluaXR5LCByZXR1cm4gaW5maW5pdHksIGV2ZW4gaWYgdGhlIG90aGVyIHBhcnQgaXMgYQorICAgICAgICAgICBOYU4uICovCisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBmYWJzKHoucmVhbCk7CisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBmYWJzKHouaW1hZyk7CisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIC8qIGVpdGhlciB0aGUgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBpcyBhIE5hTiwKKyAgICAgICAgICAgYW5kIG5laXRoZXIgaXMgaW5maW5pdGUuIFJlc3VsdCBzaG91bGQgYmUgTmFOLiAqLworICAgICAgICByZXR1cm4gUHlfTkFOOworICAgIH0KKyAgICByZXN1bHQgPSBoeXBvdCh6LnJlYWwsIHouaW1hZyk7CisgICAgaWYgKCFQeV9JU19GSU5JVEUocmVzdWx0KSkKKyAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgZWxzZQorICAgICAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfc3VidHlwZV9mcm9tX2NfY29tcGxleChQeVR5cGVPYmplY3QgKnR5cGUsIFB5X2NvbXBsZXggY3ZhbCkKIHsKLQlQeU9iamVjdCAqb3A7CisgICAgUHlPYmplY3QgKm9wOwogCi0Jb3AgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAob3AgIT0gTlVMTCkKLQkJKChQeUNvbXBsZXhPYmplY3QgKilvcCktPmN2YWwgPSBjdmFsOwotCXJldHVybiBvcDsKKyAgICBvcCA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChvcCAhPSBOVUxMKQorICAgICAgICAoKFB5Q29tcGxleE9iamVjdCAqKW9wKS0+Y3ZhbCA9IGN2YWw7CisgICAgcmV0dXJuIG9wOwogfQogCiBQeU9iamVjdCAqCiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KFB5X2NvbXBsZXggY3ZhbCkKIHsKLQlyZWdpc3RlciBQeUNvbXBsZXhPYmplY3QgKm9wOworICAgIHJlZ2lzdGVyIFB5Q29tcGxleE9iamVjdCAqb3A7CiAKLQkvKiBJbmxpbmUgUHlPYmplY3RfTmV3ICovCi0Jb3AgPSAoUHlDb21wbGV4T2JqZWN0ICopIFB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlDb21wbGV4T2JqZWN0KSk7Ci0JaWYgKG9wID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCVB5T2JqZWN0X0lOSVQob3AsICZQeUNvbXBsZXhfVHlwZSk7Ci0Jb3AtPmN2YWwgPSBjdmFsOwotCXJldHVybiAoUHlPYmplY3QgKikgb3A7CisgICAgLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLworICAgIG9wID0gKFB5Q29tcGxleE9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5Q29tcGxleE9iamVjdCkpOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeU9iamVjdF9JTklUKG9wLCAmUHlDb21wbGV4X1R5cGUpOworICAgIG9wLT5jdmFsID0gY3ZhbDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9wOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9zdWJ0eXBlX2Zyb21fZG91YmxlcyhQeVR5cGVPYmplY3QgKnR5cGUsIGRvdWJsZSByZWFsLCBkb3VibGUgaW1hZykKIHsKLQlQeV9jb21wbGV4IGM7Ci0JYy5yZWFsID0gcmVhbDsKLQljLmltYWcgPSBpbWFnOwotCXJldHVybiBjb21wbGV4X3N1YnR5cGVfZnJvbV9jX2NvbXBsZXgodHlwZSwgYyk7CisgICAgUHlfY29tcGxleCBjOworICAgIGMucmVhbCA9IHJlYWw7CisgICAgYy5pbWFnID0gaW1hZzsKKyAgICByZXR1cm4gY29tcGxleF9zdWJ0eXBlX2Zyb21fY19jb21wbGV4KHR5cGUsIGMpOwogfQogCiBQeU9iamVjdCAqCiBQeUNvbXBsZXhfRnJvbURvdWJsZXMoZG91YmxlIHJlYWwsIGRvdWJsZSBpbWFnKQogewotCVB5X2NvbXBsZXggYzsKLQljLnJlYWwgPSByZWFsOwotCWMuaW1hZyA9IGltYWc7Ci0JcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7CisgICAgUHlfY29tcGxleCBjOworICAgIGMucmVhbCA9IHJlYWw7CisgICAgYy5pbWFnID0gaW1hZzsKKyAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChjKTsKIH0KIAogZG91YmxlCiBQeUNvbXBsZXhfUmVhbEFzRG91YmxlKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoUHlDb21wbGV4X0NoZWNrKG9wKSkgewotCQlyZXR1cm4gKChQeUNvbXBsZXhPYmplY3QgKilvcCktPmN2YWwucmVhbDsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiBQeUZsb2F0X0FzRG91YmxlKG9wKTsKLQl9CisgICAgaWYgKFB5Q29tcGxleF9DaGVjayhvcCkpIHsKKyAgICAgICAgcmV0dXJuICgoUHlDb21wbGV4T2JqZWN0ICopb3ApLT5jdmFsLnJlYWw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gUHlGbG9hdF9Bc0RvdWJsZShvcCk7CisgICAgfQogfQogCiBkb3VibGUKIFB5Q29tcGxleF9JbWFnQXNEb3VibGUoUHlPYmplY3QgKm9wKQogewotCWlmIChQeUNvbXBsZXhfQ2hlY2sob3ApKSB7Ci0JCXJldHVybiAoKFB5Q29tcGxleE9iamVjdCAqKW9wKS0+Y3ZhbC5pbWFnOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIDAuMDsKLQl9CisgICAgaWYgKFB5Q29tcGxleF9DaGVjayhvcCkpIHsKKyAgICAgICAgcmV0dXJuICgoUHlDb21wbGV4T2JqZWN0ICopb3ApLT5jdmFsLmltYWc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gMC4wOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRyeV9jb21wbGV4X3NwZWNpYWxfbWV0aG9kKFB5T2JqZWN0ICpvcCkgewotCVB5T2JqZWN0ICpmOwotCXN0YXRpYyBQeU9iamVjdCAqY29tcGxleHN0cjsKKyAgICBQeU9iamVjdCAqZjsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmNvbXBsZXhzdHI7CiAKLQlpZiAoY29tcGxleHN0ciA9PSBOVUxMKSB7Ci0JCWNvbXBsZXhzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NvbXBsZXhfXyIpOwotCQlpZiAoY29tcGxleHN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeUluc3RhbmNlX0NoZWNrKG9wKSkgewotCQlmID0gUHlPYmplY3RfR2V0QXR0cihvcCwgY29tcGxleHN0cik7Ci0JCWlmIChmID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJZWxzZQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UgewotCQlmID0gX1B5T2JqZWN0X0xvb2t1cFNwZWNpYWwob3AsICJfX2NvbXBsZXhfXyIsICZjb21wbGV4c3RyKTsKLQkJaWYgKGYgPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChmICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZiwgTlVMTCk7Ci0JCVB5X0RFQ1JFRihmKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGNvbXBsZXhzdHIgPT0gTlVMTCkgeworICAgICAgICBjb21wbGV4c3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jb21wbGV4X18iKTsKKyAgICAgICAgaWYgKGNvbXBsZXhzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayhvcCkpIHsKKyAgICAgICAgZiA9IFB5T2JqZWN0X0dldEF0dHIob3AsIGNvbXBsZXhzdHIpOworICAgICAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZiA9IF9QeU9iamVjdF9Mb29rdXBTcGVjaWFsKG9wLCAiX19jb21wbGV4X18iLCAmY29tcGxleHN0cik7CisgICAgICAgIGlmIChmID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZiAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGYsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiBQeV9jb21wbGV4CiBQeUNvbXBsZXhfQXNDQ29tcGxleChQeU9iamVjdCAqb3ApCiB7Ci0JUHlfY29tcGxleCBjdjsKLQlQeU9iamVjdCAqbmV3b3AgPSBOVUxMOworICAgIFB5X2NvbXBsZXggY3Y7CisgICAgUHlPYmplY3QgKm5ld29wID0gTlVMTDsKIAotCWFzc2VydChvcCk7Ci0JLyogSWYgb3AgaXMgYWxyZWFkeSBvZiB0eXBlIFB5Q29tcGxleF9UeXBlLCByZXR1cm4gaXRzIHZhbHVlICovCi0JaWYgKFB5Q29tcGxleF9DaGVjayhvcCkpIHsKLQkJcmV0dXJuICgoUHlDb21wbGV4T2JqZWN0ICopb3ApLT5jdmFsOwotCX0KLQkvKiBJZiBub3QsIHVzZSBvcCdzIF9fY29tcGxleF9fICBtZXRob2QsIGlmIGl0IGV4aXN0cyAqLworICAgIGFzc2VydChvcCk7CisgICAgLyogSWYgb3AgaXMgYWxyZWFkeSBvZiB0eXBlIFB5Q29tcGxleF9UeXBlLCByZXR1cm4gaXRzIHZhbHVlICovCisgICAgaWYgKFB5Q29tcGxleF9DaGVjayhvcCkpIHsKKyAgICAgICAgcmV0dXJuICgoUHlDb21wbGV4T2JqZWN0ICopb3ApLT5jdmFsOworICAgIH0KKyAgICAvKiBJZiBub3QsIHVzZSBvcCdzIF9fY29tcGxleF9fICBtZXRob2QsIGlmIGl0IGV4aXN0cyAqLwogCi0JLyogcmV0dXJuIC0xIG9uIGZhaWx1cmUgKi8KLQljdi5yZWFsID0gLTEuOwotCWN2LmltYWcgPSAwLjsKKyAgICAvKiByZXR1cm4gLTEgb24gZmFpbHVyZSAqLworICAgIGN2LnJlYWwgPSAtMS47CisgICAgY3YuaW1hZyA9IDAuOwogCi0JbmV3b3AgPSB0cnlfY29tcGxleF9zcGVjaWFsX21ldGhvZChvcCk7Ci0JCi0JaWYgKG5ld29wKSB7Ci0JCWlmICghUHlDb21wbGV4X0NoZWNrKG5ld29wKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19jb21wbGV4X18gc2hvdWxkIHJldHVybiBhIGNvbXBsZXggb2JqZWN0Iik7Ci0JCQlQeV9ERUNSRUYobmV3b3ApOwotCQkJcmV0dXJuIGN2OwotCQl9Ci0JCWN2ID0gKChQeUNvbXBsZXhPYmplY3QgKiluZXdvcCktPmN2YWw7Ci0JCVB5X0RFQ1JFRihuZXdvcCk7Ci0JCXJldHVybiBjdjsKLQl9Ci0JZWxzZSBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlyZXR1cm4gY3Y7Ci0JfQotCS8qIElmIG5laXRoZXIgb2YgdGhlIGFib3ZlIHdvcmtzLCBpbnRlcnByZXQgb3AgYXMgYSBmbG9hdCBnaXZpbmcgdGhlCi0JICAgcmVhbCBwYXJ0IG9mIHRoZSByZXN1bHQsIGFuZCBmaWxsIGluIHRoZSBpbWFnaW5hcnkgcGFydCBhcyAwLiAqLwotCWVsc2UgewotCQkvKiBQeUZsb2F0X0FzRG91YmxlIHdpbGwgcmV0dXJuIC0xIG9uIGZhaWx1cmUgKi8KLQkJY3YucmVhbCA9IFB5RmxvYXRfQXNEb3VibGUob3ApOwotCQlyZXR1cm4gY3Y7Ci0JfQorICAgIG5ld29wID0gdHJ5X2NvbXBsZXhfc3BlY2lhbF9tZXRob2Qob3ApOworCisgICAgaWYgKG5ld29wKSB7CisgICAgICAgIGlmICghUHlDb21wbGV4X0NoZWNrKG5ld29wKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiX19jb21wbGV4X18gc2hvdWxkIHJldHVybiBhIGNvbXBsZXggb2JqZWN0Iik7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3b3ApOworICAgICAgICAgICAgcmV0dXJuIGN2OworICAgICAgICB9CisgICAgICAgIGN2ID0gKChQeUNvbXBsZXhPYmplY3QgKiluZXdvcCktPmN2YWw7CisgICAgICAgIFB5X0RFQ1JFRihuZXdvcCk7CisgICAgICAgIHJldHVybiBjdjsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICByZXR1cm4gY3Y7CisgICAgfQorICAgIC8qIElmIG5laXRoZXIgb2YgdGhlIGFib3ZlIHdvcmtzLCBpbnRlcnByZXQgb3AgYXMgYSBmbG9hdCBnaXZpbmcgdGhlCisgICAgICAgcmVhbCBwYXJ0IG9mIHRoZSByZXN1bHQsIGFuZCBmaWxsIGluIHRoZSBpbWFnaW5hcnkgcGFydCBhcyAwLiAqLworICAgIGVsc2UgeworICAgICAgICAvKiBQeUZsb2F0X0FzRG91YmxlIHdpbGwgcmV0dXJuIC0xIG9uIGZhaWx1cmUgKi8KKyAgICAgICAgY3YucmVhbCA9IFB5RmxvYXRfQXNEb3VibGUob3ApOworICAgICAgICByZXR1cm4gY3Y7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogY29tcGxleF9kZWFsbG9jKFB5T2JqZWN0ICpvcCkKIHsKLQlvcC0+b2JfdHlwZS0+dHBfZnJlZShvcCk7CisgICAgb3AtPm9iX3R5cGUtPnRwX2ZyZWUob3ApOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X2Zvcm1hdChQeUNvbXBsZXhPYmplY3QgKnYsIGludCBwcmVjaXNpb24sIGNoYXIgZm9ybWF0X2NvZGUpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQkvKiBJZiB0aGVzZSBhcmUgbm9uLU5VTEwsIHRoZXknbGwgbmVlZCB0byBiZSBmcmVlZC4gKi8KLQljaGFyICpwcmUgPSBOVUxMOwotCWNoYXIgKmltID0gTlVMTDsKLQljaGFyICpidWYgPSBOVUxMOworICAgIC8qIElmIHRoZXNlIGFyZSBub24tTlVMTCwgdGhleSdsbCBuZWVkIHRvIGJlIGZyZWVkLiAqLworICAgIGNoYXIgKnByZSA9IE5VTEw7CisgICAgY2hhciAqaW0gPSBOVUxMOworICAgIGNoYXIgKmJ1ZiA9IE5VTEw7CiAKLQkvKiBUaGVzZSBkbyBub3QgbmVlZCB0byBiZSBmcmVlZC4gcmUgaXMgZWl0aGVyIGFuIGFsaWFzCi0JICAgZm9yIHByZSBvciBhIHBvaW50ZXIgdG8gYSBjb25zdGFudC4gIGxlYWQgYW5kIHRhaWwKLQkgICBhcmUgcG9pbnRlcnMgdG8gY29uc3RhbnRzLiAqLwotCWNoYXIgKnJlID0gTlVMTDsKLQljaGFyICpsZWFkID0gIiI7Ci0JY2hhciAqdGFpbCA9ICIiOworICAgIC8qIFRoZXNlIGRvIG5vdCBuZWVkIHRvIGJlIGZyZWVkLiByZSBpcyBlaXRoZXIgYW4gYWxpYXMKKyAgICAgICBmb3IgcHJlIG9yIGEgcG9pbnRlciB0byBhIGNvbnN0YW50LiAgbGVhZCBhbmQgdGFpbAorICAgICAgIGFyZSBwb2ludGVycyB0byBjb25zdGFudHMuICovCisgICAgY2hhciAqcmUgPSBOVUxMOworICAgIGNoYXIgKmxlYWQgPSAiIjsKKyAgICBjaGFyICp0YWlsID0gIiI7CiAKLQlpZiAodi0+Y3ZhbC5yZWFsID09IDAuICYmIGNvcHlzaWduKDEuMCwgdi0+Y3ZhbC5yZWFsKT09MS4wKSB7Ci0JCXJlID0gIiI7Ci0JCWltID0gUHlPU19kb3VibGVfdG9fc3RyaW5nKHYtPmN2YWwuaW1hZywgZm9ybWF0X2NvZGUsCi0JCQkJCSAgIHByZWNpc2lvbiwgMCwgTlVMTCk7Ci0JCWlmICghaW0pIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBGb3JtYXQgaW1hZ2luYXJ5IHBhcnQgd2l0aCBzaWduLCByZWFsIHBhcnQgd2l0aG91dCAqLwotCQlwcmUgPSBQeU9TX2RvdWJsZV90b19zdHJpbmcodi0+Y3ZhbC5yZWFsLCBmb3JtYXRfY29kZSwKLQkJCQkJICAgIHByZWNpc2lvbiwgMCwgTlVMTCk7Ci0JCWlmICghcHJlKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCXJlID0gcHJlOworICAgIGlmICh2LT5jdmFsLnJlYWwgPT0gMC4gJiYgY29weXNpZ24oMS4wLCB2LT5jdmFsLnJlYWwpPT0xLjApIHsKKyAgICAgICAgcmUgPSAiIjsKKyAgICAgICAgaW0gPSBQeU9TX2RvdWJsZV90b19zdHJpbmcodi0+Y3ZhbC5pbWFnLCBmb3JtYXRfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLCAwLCBOVUxMKTsKKyAgICAgICAgaWYgKCFpbSkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEZvcm1hdCBpbWFnaW5hcnkgcGFydCB3aXRoIHNpZ24sIHJlYWwgcGFydCB3aXRob3V0ICovCisgICAgICAgIHByZSA9IFB5T1NfZG91YmxlX3RvX3N0cmluZyh2LT5jdmFsLnJlYWwsIGZvcm1hdF9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLCAwLCBOVUxMKTsKKyAgICAgICAgaWYgKCFwcmUpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgICAgcmUgPSBwcmU7CiAKLQkJaW0gPSBQeU9TX2RvdWJsZV90b19zdHJpbmcodi0+Y3ZhbC5pbWFnLCBmb3JtYXRfY29kZSwKLQkJCQkJICAgcHJlY2lzaW9uLCBQeV9EVFNGX1NJR04sIE5VTEwpOwotCQlpZiAoIWltKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWxlYWQgPSAiKCI7Ci0JCXRhaWwgPSAiKSI7Ci0JfQotCS8qIEFsbG9jIHRoZSBmaW5hbCBidWZmZXIuIEFkZCBvbmUgZm9yIHRoZSAiaiIgaW4gdGhlIGZvcm1hdCBzdHJpbmcsCi0JICAgYW5kIG9uZSBmb3IgdGhlIHRyYWlsaW5nIHplcm8uICovCi0JbGVuID0gc3RybGVuKGxlYWQpICsgc3RybGVuKHJlKSArIHN0cmxlbihpbSkgKyBzdHJsZW4odGFpbCkgKyAyOwotCWJ1ZiA9IFB5TWVtX01hbGxvYyhsZW4pOwotCWlmICghYnVmKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JUHlPU19zbnByaW50ZihidWYsIGxlbiwgIiVzJXMlc2olcyIsIGxlYWQsIHJlLCBpbSwgdGFpbCk7Ci0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgICAgICBpbSA9IFB5T1NfZG91YmxlX3RvX3N0cmluZyh2LT5jdmFsLmltYWcsIGZvcm1hdF9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24sIFB5X0RUU0ZfU0lHTiwgTlVMTCk7CisgICAgICAgIGlmICghaW0pIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgICAgbGVhZCA9ICIoIjsKKyAgICAgICAgdGFpbCA9ICIpIjsKKyAgICB9CisgICAgLyogQWxsb2MgdGhlIGZpbmFsIGJ1ZmZlci4gQWRkIG9uZSBmb3IgdGhlICJqIiBpbiB0aGUgZm9ybWF0IHN0cmluZywKKyAgICAgICBhbmQgb25lIGZvciB0aGUgdHJhaWxpbmcgemVyby4gKi8KKyAgICBsZW4gPSBzdHJsZW4obGVhZCkgKyBzdHJsZW4ocmUpICsgc3RybGVuKGltKSArIHN0cmxlbih0YWlsKSArIDI7CisgICAgYnVmID0gUHlNZW1fTWFsbG9jKGxlbik7CisgICAgaWYgKCFidWYpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBQeU9TX3NucHJpbnRmKGJ1ZiwgbGVuLCAiJXMlcyVzaiVzIiwgbGVhZCwgcmUsIGltLCB0YWlsKTsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiAgIGRvbmU6Ci0JUHlNZW1fRnJlZShpbSk7Ci0JUHlNZW1fRnJlZShwcmUpOwotCVB5TWVtX0ZyZWUoYnVmKTsKKyAgICBQeU1lbV9GcmVlKGltKTsKKyAgICBQeU1lbV9GcmVlKHByZSk7CisgICAgUHlNZW1fRnJlZShidWYpOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBjb21wbGV4X3ByaW50KFB5Q29tcGxleE9iamVjdCAqdiwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQlQeU9iamVjdCAqZm9ybWF0djsKLQljaGFyICpidWY7Ci0gICAgICAgIGlmIChmbGFncyAmIFB5X1BSSU5UX1JBVykKLSAgICAgICAgICAgIGZvcm1hdHYgPSBjb21wbGV4X2Zvcm1hdCh2LCBQeUZsb2F0X1NUUl9QUkVDSVNJT04sICdnJyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZvcm1hdHYgPSBjb21wbGV4X2Zvcm1hdCh2LCAwLCAncicpOwotCWlmIChmb3JtYXR2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlidWYgPSBQeVN0cmluZ19BU19TVFJJTkcoZm9ybWF0dik7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwdXRzKGJ1ZiwgZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlfREVDUkVGKGZvcm1hdHYpOwotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICpmb3JtYXR2OworICAgIGNoYXIgKmJ1ZjsKKyAgICBpZiAoZmxhZ3MgJiBQeV9QUklOVF9SQVcpCisgICAgICAgIGZvcm1hdHYgPSBjb21wbGV4X2Zvcm1hdCh2LCBQeUZsb2F0X1NUUl9QUkVDSVNJT04sICdnJyk7CisgICAgZWxzZQorICAgICAgICBmb3JtYXR2ID0gY29tcGxleF9mb3JtYXQodiwgMCwgJ3InKTsKKyAgICBpZiAoZm9ybWF0diA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZvcm1hdHYpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmcHV0cyhidWYsIGZwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0RFQ1JFRihmb3JtYXR2KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQ1OCwzMSArNDU4LDMxIEBACiBzdGF0aWMgbG9uZwogY29tcGxleF9oYXNoKFB5Q29tcGxleE9iamVjdCAqdikKIHsKLQlsb25nIGhhc2hyZWFsLCBoYXNoaW1hZywgY29tYmluZWQ7Ci0JaGFzaHJlYWwgPSBfUHlfSGFzaERvdWJsZSh2LT5jdmFsLnJlYWwpOwotCWlmIChoYXNocmVhbCA9PSAtMSkKLQkJcmV0dXJuIC0xOwotCWhhc2hpbWFnID0gX1B5X0hhc2hEb3VibGUodi0+Y3ZhbC5pbWFnKTsKLQlpZiAoaGFzaGltYWcgPT0gLTEpCi0JCXJldHVybiAtMTsKLQkvKiBOb3RlOiAgaWYgdGhlIGltYWdpbmFyeSBwYXJ0IGlzIDAsIGhhc2hpbWFnIGlzIDAgbm93LAotCSAqIHNvIHRoZSBmb2xsb3dpbmcgcmV0dXJucyBoYXNocmVhbCB1bmNoYW5nZWQuICBUaGlzIGlzCi0JICogaW1wb3J0YW50IGJlY2F1c2UgbnVtYmVycyBvZiBkaWZmZXJlbnQgdHlwZXMgdGhhdAotCSAqIGNvbXBhcmUgZXF1YWwgbXVzdCBoYXZlIHRoZSBzYW1lIGhhc2ggdmFsdWUsIHNvIHRoYXQKLQkgKiBoYXNoKHggKyAwKmopIG11c3QgZXF1YWwgaGFzaCh4KS4KLQkgKi8KLQljb21iaW5lZCA9IGhhc2hyZWFsICsgMTAwMDAwMyAqIGhhc2hpbWFnOwotCWlmIChjb21iaW5lZCA9PSAtMSkKLQkJY29tYmluZWQgPSAtMjsKLQlyZXR1cm4gY29tYmluZWQ7CisgICAgbG9uZyBoYXNocmVhbCwgaGFzaGltYWcsIGNvbWJpbmVkOworICAgIGhhc2hyZWFsID0gX1B5X0hhc2hEb3VibGUodi0+Y3ZhbC5yZWFsKTsKKyAgICBpZiAoaGFzaHJlYWwgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBoYXNoaW1hZyA9IF9QeV9IYXNoRG91YmxlKHYtPmN2YWwuaW1hZyk7CisgICAgaWYgKGhhc2hpbWFnID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogTm90ZTogIGlmIHRoZSBpbWFnaW5hcnkgcGFydCBpcyAwLCBoYXNoaW1hZyBpcyAwIG5vdywKKyAgICAgKiBzbyB0aGUgZm9sbG93aW5nIHJldHVybnMgaGFzaHJlYWwgdW5jaGFuZ2VkLiAgVGhpcyBpcworICAgICAqIGltcG9ydGFudCBiZWNhdXNlIG51bWJlcnMgb2YgZGlmZmVyZW50IHR5cGVzIHRoYXQKKyAgICAgKiBjb21wYXJlIGVxdWFsIG11c3QgaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLCBzbyB0aGF0CisgICAgICogaGFzaCh4ICsgMCpqKSBtdXN0IGVxdWFsIGhhc2goeCkuCisgICAgICovCisgICAgY29tYmluZWQgPSBoYXNocmVhbCArIDEwMDAwMDMgKiBoYXNoaW1hZzsKKyAgICBpZiAoY29tYmluZWQgPT0gLTEpCisgICAgICAgIGNvbWJpbmVkID0gLTI7CisgICAgcmV0dXJuIGNvbWJpbmVkOwogfQogCiAvKiBUaGlzIG1hY3JvIG1heSByZXR1cm4hICovCiAjZGVmaW5lIFRPX0NPTVBMRVgob2JqLCBjKSBcCi0JaWYgKFB5Q29tcGxleF9DaGVjayhvYmopKSBcCi0JCWMgPSAoKFB5Q29tcGxleE9iamVjdCAqKShvYmopKS0+Y3ZhbDsgXAotCWVsc2UgaWYgKHRvX2NvbXBsZXgoJihvYmopLCAmKGMpKSA8IDApIFwKLQkJcmV0dXJuIChvYmopCisgICAgaWYgKFB5Q29tcGxleF9DaGVjayhvYmopKSBcCisgICAgICAgIGMgPSAoKFB5Q29tcGxleE9iamVjdCAqKShvYmopKS0+Y3ZhbDsgXAorICAgIGVsc2UgaWYgKHRvX2NvbXBsZXgoJihvYmopLCAmKGMpKSA8IDApIFwKKyAgICAgICAgcmV0dXJuIChvYmopCiAKIHN0YXRpYyBpbnQKIHRvX2NvbXBsZXgoUHlPYmplY3QgKipwb2JqLCBQeV9jb21wbGV4ICpwYykKQEAgLTQ5MSwzNjggKzQ5MSwzNjggQEAKIAogICAgIHBjLT5yZWFsID0gcGMtPmltYWcgPSAwLjA7CiAgICAgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKLSAgICAgICAgcGMtPnJlYWwgPSBQeUludF9BU19MT05HKG9iaik7Ci0gICAgICAgIHJldHVybiAwOworICAgIHBjLT5yZWFsID0gUHlJbnRfQVNfTE9ORyhvYmopOworICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKLSAgICAgICAgcGMtPnJlYWwgPSBQeUxvbmdfQXNEb3VibGUob2JqKTsKLSAgICAgICAgaWYgKHBjLT5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgKnBvYmogPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIHBjLT5yZWFsID0gUHlMb25nX0FzRG91YmxlKG9iaik7CisgICAgaWYgKHBjLT5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAqcG9iaiA9IE5VTEw7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKLSAgICAgICAgcGMtPnJlYWwgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7Ci0gICAgICAgIHJldHVybiAwOworICAgIHBjLT5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOworICAgIHJldHVybiAwOwogICAgIH0KICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwogICAgICpwb2JqID0gUHlfTm90SW1wbGVtZW50ZWQ7CiAgICAgcmV0dXJuIC0xOwogfQotCQkKKwogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9hZGQoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5X2NvbXBsZXggcmVzdWx0OwotCVB5X2NvbXBsZXggYSwgYjsKLQlUT19DT01QTEVYKHYsIGEpOwotCVRPX0NPTVBMRVgodywgYik7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9hZGQiLCByZXR1cm4gMCkKLQlyZXN1bHQgPSBjX3N1bShhLCBiKTsKLQlQeUZQRV9FTkRfUFJPVEVDVChyZXN1bHQpCi0JcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocmVzdWx0KTsKKyAgICBQeV9jb21wbGV4IHJlc3VsdDsKKyAgICBQeV9jb21wbGV4IGEsIGI7CisgICAgVE9fQ09NUExFWCh2LCBhKTsKKyAgICBUT19DT01QTEVYKHcsIGIpOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfYWRkIiwgcmV0dXJuIDApCisgICAgcmVzdWx0ID0gY19zdW0oYSwgYik7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QocmVzdWx0KQorICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X3N1YihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0gICAgICAgIFB5X2NvbXBsZXggcmVzdWx0OwotCVB5X2NvbXBsZXggYSwgYjsKLQlUT19DT01QTEVYKHYsIGEpOwotCVRPX0NPTVBMRVgodywgYik7OwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfc3ViIiwgcmV0dXJuIDApCi0JcmVzdWx0ID0gY19kaWZmKGEsIGIpOwotCVB5RlBFX0VORF9QUk9URUNUKHJlc3VsdCkKLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChyZXN1bHQpOworICAgIFB5X2NvbXBsZXggcmVzdWx0OworICAgIFB5X2NvbXBsZXggYSwgYjsKKyAgICBUT19DT01QTEVYKHYsIGEpOworICAgIFRPX0NPTVBMRVgodywgYik7OworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfc3ViIiwgcmV0dXJuIDApCisgICAgcmVzdWx0ID0gY19kaWZmKGEsIGIpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHJlc3VsdCkKKyAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChyZXN1bHQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9tdWwoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5X2NvbXBsZXggcmVzdWx0OwotCVB5X2NvbXBsZXggYSwgYjsKLQlUT19DT01QTEVYKHYsIGEpOwotCVRPX0NPTVBMRVgodywgYik7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9tdWwiLCByZXR1cm4gMCkKLQlyZXN1bHQgPSBjX3Byb2QoYSwgYik7Ci0JUHlGUEVfRU5EX1BST1RFQ1QocmVzdWx0KQotCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHJlc3VsdCk7CisgICAgUHlfY29tcGxleCByZXN1bHQ7CisgICAgUHlfY29tcGxleCBhLCBiOworICAgIFRPX0NPTVBMRVgodiwgYSk7CisgICAgVE9fQ09NUExFWCh3LCBiKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X211bCIsIHJldHVybiAwKQorICAgIHJlc3VsdCA9IGNfcHJvZChhLCBiKTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChyZXN1bHQpCisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocmVzdWx0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfZGl2KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeV9jb21wbGV4IHF1b3Q7Ci0JUHlfY29tcGxleCBhLCBiOwotCVRPX0NPTVBMRVgodiwgYSk7Ci0JVE9fQ09NUExFWCh3LCBiKTsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X2RpdiIsIHJldHVybiAwKQotCWVycm5vID0gMDsKLQlxdW90ID0gY19xdW90KGEsIGIpOwotCVB5RlBFX0VORF9QUk9URUNUKHF1b3QpCi0JaWYgKGVycm5vID09IEVET00pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLCAiY29tcGxleCBkaXZpc2lvbiBieSB6ZXJvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChxdW90KTsKKyAgICBQeV9jb21wbGV4IHF1b3Q7CisgICAgUHlfY29tcGxleCBhLCBiOworICAgIFRPX0NPTVBMRVgodiwgYSk7CisgICAgVE9fQ09NUExFWCh3LCBiKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X2RpdiIsIHJldHVybiAwKQorICAgIGVycm5vID0gMDsKKyAgICBxdW90ID0gY19xdW90KGEsIGIpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHF1b3QpCisgICAgaWYgKGVycm5vID09IEVET00pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLCAiY29tcGxleCBkaXZpc2lvbiBieSB6ZXJvIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChxdW90KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfY2xhc3NpY19kaXYoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5X2NvbXBsZXggcXVvdDsKLQlQeV9jb21wbGV4IGEsIGI7Ci0JVE9fQ09NUExFWCh2LCBhKTsKLQlUT19DT01QTEVYKHcsIGIpOwotCWlmIChQeV9EaXZpc2lvbldhcm5pbmdGbGFnID49IDIgJiYKLQkgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCSAgICAgICAiY2xhc3NpYyBjb21wbGV4IGRpdmlzaW9uIikgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeV9jb21wbGV4IHF1b3Q7CisgICAgUHlfY29tcGxleCBhLCBiOworICAgIFRPX0NPTVBMRVgodiwgYSk7CisgICAgVE9fQ09NUExFWCh3LCBiKTsKKyAgICBpZiAoUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA+PSAyICYmCisgICAgICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICJjbGFzc2ljIGNvbXBsZXggZGl2aXNpb24iKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9jbGFzc2ljX2RpdiIsIHJldHVybiAwKQotCWVycm5vID0gMDsKLQlxdW90ID0gY19xdW90KGEsIGIpOwotCVB5RlBFX0VORF9QUk9URUNUKHF1b3QpCi0JaWYgKGVycm5vID09IEVET00pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLCAiY29tcGxleCBkaXZpc2lvbiBieSB6ZXJvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChxdW90KTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X2NsYXNzaWNfZGl2IiwgcmV0dXJuIDApCisgICAgZXJybm8gPSAwOworICAgIHF1b3QgPSBjX3F1b3QoYSwgYik7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QocXVvdCkKKyAgICBpZiAoZXJybm8gPT0gRURPTSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IGRpdmlzaW9uIGJ5IHplcm8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHF1b3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9yZW1haW5kZXIoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5X2NvbXBsZXggZGl2LCBtb2Q7Ci0JUHlfY29tcGxleCBhLCBiOwotCVRPX0NPTVBMRVgodiwgYSk7Ci0JVE9fQ09NUExFWCh3LCBiKTsKLQlpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCSAgICAgICAiY29tcGxleCBkaXZtb2QoKSwgLy8gYW5kICUgYXJlIGRlcHJlY2F0ZWQiKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIFB5X2NvbXBsZXggZGl2LCBtb2Q7CisgICAgUHlfY29tcGxleCBhLCBiOworICAgIFRPX0NPTVBMRVgodiwgYSk7CisgICAgVE9fQ09NUExFWCh3LCBiKTsKKyAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgImNvbXBsZXggZGl2bW9kKCksIC8vIGFuZCAlIGFyZSBkZXByZWNhdGVkIikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVycm5vID0gMDsKLQlkaXYgPSBjX3F1b3QoYSwgYik7IC8qIFRoZSByYXcgZGl2aXNvciB2YWx1ZS4gKi8KLQlpZiAoZXJybm8gPT0gRURPTSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IHJlbWFpbmRlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGl2LnJlYWwgPSBmbG9vcihkaXYucmVhbCk7IC8qIFVzZSB0aGUgZmxvb3Igb2YgdGhlIHJlYWwgcGFydC4gKi8KLQlkaXYuaW1hZyA9IDAuMDsKLQltb2QgPSBjX2RpZmYoYSwgY19wcm9kKGIsIGRpdikpOworICAgIGVycm5vID0gMDsKKyAgICBkaXYgPSBjX3F1b3QoYSwgYik7IC8qIFRoZSByYXcgZGl2aXNvciB2YWx1ZS4gKi8KKyAgICBpZiAoZXJybm8gPT0gRURPTSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IHJlbWFpbmRlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGl2LnJlYWwgPSBmbG9vcihkaXYucmVhbCk7IC8qIFVzZSB0aGUgZmxvb3Igb2YgdGhlIHJlYWwgcGFydC4gKi8KKyAgICBkaXYuaW1hZyA9IDAuMDsKKyAgICBtb2QgPSBjX2RpZmYoYSwgY19wcm9kKGIsIGRpdikpOwogCi0JcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgobW9kKTsKKyAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChtb2QpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X2Rpdm1vZChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlfY29tcGxleCBkaXYsIG1vZDsKLQlQeU9iamVjdCAqZCwgKm0sICp6OwotCVB5X2NvbXBsZXggYSwgYjsKLQlUT19DT01QTEVYKHYsIGEpOwotCVRPX0NPTVBMRVgodywgYik7Ci0JaWYgKFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkgICAgICAgImNvbXBsZXggZGl2bW9kKCksIC8vIGFuZCAlIGFyZSBkZXByZWNhdGVkIikgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeV9jb21wbGV4IGRpdiwgbW9kOworICAgIFB5T2JqZWN0ICpkLCAqbSwgKno7CisgICAgUHlfY29tcGxleCBhLCBiOworICAgIFRPX0NPTVBMRVgodiwgYSk7CisgICAgVE9fQ09NUExFWCh3LCBiKTsKKyAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgImNvbXBsZXggZGl2bW9kKCksIC8vIGFuZCAlIGFyZSBkZXByZWNhdGVkIikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVycm5vID0gMDsKLQlkaXYgPSBjX3F1b3QoYSwgYik7IC8qIFRoZSByYXcgZGl2aXNvciB2YWx1ZS4gKi8KLQlpZiAoZXJybm8gPT0gRURPTSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IGRpdm1vZCgpIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkaXYucmVhbCA9IGZsb29yKGRpdi5yZWFsKTsgLyogVXNlIHRoZSBmbG9vciBvZiB0aGUgcmVhbCBwYXJ0LiAqLwotCWRpdi5pbWFnID0gMC4wOwotCW1vZCA9IGNfZGlmZihhLCBjX3Byb2QoYiwgZGl2KSk7Ci0JZCA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoZGl2KTsKLQltID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChtb2QpOwotCXogPSBQeVR1cGxlX1BhY2soMiwgZCwgbSk7Ci0JUHlfWERFQ1JFRihkKTsKLQlQeV9YREVDUkVGKG0pOwotCXJldHVybiB6OworICAgIGVycm5vID0gMDsKKyAgICBkaXYgPSBjX3F1b3QoYSwgYik7IC8qIFRoZSByYXcgZGl2aXNvciB2YWx1ZS4gKi8KKyAgICBpZiAoZXJybm8gPT0gRURPTSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IGRpdm1vZCgpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaXYucmVhbCA9IGZsb29yKGRpdi5yZWFsKTsgLyogVXNlIHRoZSBmbG9vciBvZiB0aGUgcmVhbCBwYXJ0LiAqLworICAgIGRpdi5pbWFnID0gMC4wOworICAgIG1vZCA9IGNfZGlmZihhLCBjX3Byb2QoYiwgZGl2KSk7CisgICAgZCA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoZGl2KTsKKyAgICBtID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChtb2QpOworICAgIHogPSBQeVR1cGxlX1BhY2soMiwgZCwgbSk7CisgICAgUHlfWERFQ1JFRihkKTsKKyAgICBQeV9YREVDUkVGKG0pOworICAgIHJldHVybiB6OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9wb3coUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBQeU9iamVjdCAqeikKIHsKLQlQeV9jb21wbGV4IHA7Ci0JUHlfY29tcGxleCBleHBvbmVudDsKLQlsb25nIGludF9leHBvbmVudDsKLQlQeV9jb21wbGV4IGEsIGI7Ci0JVE9fQ09NUExFWCh2LCBhKTsKLQlUT19DT01QTEVYKHcsIGIpOwotCWlmICh6IT1QeV9Ob25lKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY29tcGxleCBtb2R1bG8iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfcG93IiwgcmV0dXJuIDApCi0JZXJybm8gPSAwOwotCWV4cG9uZW50ID0gYjsKLQlpbnRfZXhwb25lbnQgPSAobG9uZylleHBvbmVudC5yZWFsOwotCWlmIChleHBvbmVudC5pbWFnID09IDAuICYmIGV4cG9uZW50LnJlYWwgPT0gaW50X2V4cG9uZW50KQotCQlwID0gY19wb3dpKGEsaW50X2V4cG9uZW50KTsKLQllbHNlCi0JCXAgPSBjX3BvdyhhLGV4cG9uZW50KTsKKyAgICBQeV9jb21wbGV4IHA7CisgICAgUHlfY29tcGxleCBleHBvbmVudDsKKyAgICBsb25nIGludF9leHBvbmVudDsKKyAgICBQeV9jb21wbGV4IGEsIGI7CisgICAgVE9fQ09NUExFWCh2LCBhKTsKKyAgICBUT19DT01QTEVYKHcsIGIpOworICAgIGlmICh6IT1QeV9Ob25lKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY29tcGxleCBtb2R1bG8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfcG93IiwgcmV0dXJuIDApCisgICAgZXJybm8gPSAwOworICAgIGV4cG9uZW50ID0gYjsKKyAgICBpbnRfZXhwb25lbnQgPSAobG9uZylleHBvbmVudC5yZWFsOworICAgIGlmIChleHBvbmVudC5pbWFnID09IDAuICYmIGV4cG9uZW50LnJlYWwgPT0gaW50X2V4cG9uZW50KQorICAgICAgICBwID0gY19wb3dpKGEsaW50X2V4cG9uZW50KTsKKyAgICBlbHNlCisgICAgICAgIHAgPSBjX3BvdyhhLGV4cG9uZW50KTsKIAotCVB5RlBFX0VORF9QUk9URUNUKHApCi0JUHlfQURKVVNUX0VSQU5HRTIocC5yZWFsLCBwLmltYWcpOwotCWlmIChlcnJubyA9PSBFRE9NKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkiMC4wIHRvIGEgbmVnYXRpdmUgb3IgY29tcGxleCBwb3dlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJjb21wbGV4IGV4cG9uZW50aWF0aW9uIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChwKTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChwKQorICAgIFB5X0FESlVTVF9FUkFOR0UyKHAucmVhbCwgcC5pbWFnKTsKKyAgICBpZiAoZXJybm8gPT0gRURPTSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiMC4wIHRvIGEgbmVnYXRpdmUgb3IgY29tcGxleCBwb3dlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXggZXhwb25lbnRpYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9pbnRfZGl2KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeU9iamVjdCAqdCwgKnI7Ci0JUHlfY29tcGxleCBhLCBiOwotCVRPX0NPTVBMRVgodiwgYSk7Ci0JVE9fQ09NUExFWCh3LCBiKTsKLQlpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCSAgICAgICAiY29tcGxleCBkaXZtb2QoKSwgLy8gYW5kICUgYXJlIGRlcHJlY2F0ZWQiKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICp0LCAqcjsKKyAgICBQeV9jb21wbGV4IGEsIGI7CisgICAgVE9fQ09NUExFWCh2LCBhKTsKKyAgICBUT19DT01QTEVYKHcsIGIpOworICAgIGlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAiY29tcGxleCBkaXZtb2QoKSwgLy8gYW5kICUgYXJlIGRlcHJlY2F0ZWQiKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdCA9IGNvbXBsZXhfZGl2bW9kKHYsIHcpOwotCWlmICh0ICE9IE5VTEwpIHsKLQkJciA9IFB5VHVwbGVfR0VUX0lURU0odCwgMCk7Ci0JCVB5X0lOQ1JFRihyKTsKLQkJUHlfREVDUkVGKHQpOwotCQlyZXR1cm4gcjsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgdCA9IGNvbXBsZXhfZGl2bW9kKHYsIHcpOworICAgIGlmICh0ICE9IE5VTEwpIHsKKyAgICAgICAgciA9IFB5VHVwbGVfR0VUX0lURU0odCwgMCk7CisgICAgICAgIFB5X0lOQ1JFRihyKTsKKyAgICAgICAgUHlfREVDUkVGKHQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X25lZyhQeUNvbXBsZXhPYmplY3QgKnYpCiB7Ci0JUHlfY29tcGxleCBuZWc7Ci0JbmVnLnJlYWwgPSAtdi0+Y3ZhbC5yZWFsOwotCW5lZy5pbWFnID0gLXYtPmN2YWwuaW1hZzsKLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChuZWcpOworICAgIFB5X2NvbXBsZXggbmVnOworICAgIG5lZy5yZWFsID0gLXYtPmN2YWwucmVhbDsKKyAgICBuZWcuaW1hZyA9IC12LT5jdmFsLmltYWc7CisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgobmVnKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfcG9zKFB5Q29tcGxleE9iamVjdCAqdikKIHsKLQlpZiAoUHlDb21wbGV4X0NoZWNrRXhhY3QodikpIHsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopdjsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleCh2LT5jdmFsKTsKKyAgICBpZiAoUHlDb21wbGV4X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopdjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleCh2LT5jdmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfYWJzKFB5Q29tcGxleE9iamVjdCAqdikKIHsKLQlkb3VibGUgcmVzdWx0OworICAgIGRvdWJsZSByZXN1bHQ7CiAKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X2FicyIsIHJldHVybiAwKQotCXJlc3VsdCA9IGNfYWJzKHYtPmN2YWwpOwotCVB5RlBFX0VORF9QUk9URUNUKHJlc3VsdCkKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X2FicyIsIHJldHVybiAwKQorICAgIHJlc3VsdCA9IGNfYWJzKHYtPmN2YWwpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHJlc3VsdCkKIAotCWlmIChlcnJubyA9PSBFUkFOR0UpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImFic29sdXRlIHZhbHVlIHRvbyBsYXJnZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyZXN1bHQpOworICAgIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWJzb2x1dGUgdmFsdWUgdG9vIGxhcmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBsZXhfbm9uemVybyhQeUNvbXBsZXhPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIHYtPmN2YWwucmVhbCAhPSAwLjAgfHwgdi0+Y3ZhbC5pbWFnICE9IDAuMDsKKyAgICByZXR1cm4gdi0+Y3ZhbC5yZWFsICE9IDAuMCB8fCB2LT5jdmFsLmltYWcgIT0gMC4wOwogfQogCiBzdGF0aWMgaW50CiBjb21wbGV4X2NvZXJjZShQeU9iamVjdCAqKnB2LCBQeU9iamVjdCAqKnB3KQogewotCVB5X2NvbXBsZXggY3ZhbDsKLQljdmFsLmltYWcgPSAwLjsKLQlpZiAoUHlJbnRfQ2hlY2soKnB3KSkgewotCQljdmFsLnJlYWwgPSAoZG91YmxlKVB5SW50X0FzTG9uZygqcHcpOwotCQkqcHcgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGN2YWwpOwotCQlQeV9JTkNSRUYoKnB2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjaygqcHcpKSB7Ci0JCWN2YWwucmVhbCA9IFB5TG9uZ19Bc0RvdWJsZSgqcHcpOwotCQlpZiAoY3ZhbC5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJKnB3ID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChjdmFsKTsKLQkJUHlfSU5DUkVGKCpwdik7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIGlmIChQeUZsb2F0X0NoZWNrKCpwdykpIHsKLQkJY3ZhbC5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZSgqcHcpOwotCQkqcHcgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGN2YWwpOwotCQlQeV9JTkNSRUYoKnB2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKFB5Q29tcGxleF9DaGVjaygqcHcpKSB7Ci0JCVB5X0lOQ1JFRigqcHYpOwotCQlQeV9JTkNSRUYoKnB3KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOyAvKiBDYW4ndCBkbyBpdCAqLworICAgIFB5X2NvbXBsZXggY3ZhbDsKKyAgICBjdmFsLmltYWcgPSAwLjsKKyAgICBpZiAoUHlJbnRfQ2hlY2soKnB3KSkgeworICAgICAgICBjdmFsLnJlYWwgPSAoZG91YmxlKVB5SW50X0FzTG9uZygqcHcpOworICAgICAgICAqcHcgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGN2YWwpOworICAgICAgICBQeV9JTkNSRUYoKnB2KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjaygqcHcpKSB7CisgICAgICAgIGN2YWwucmVhbCA9IFB5TG9uZ19Bc0RvdWJsZSgqcHcpOworICAgICAgICBpZiAoY3ZhbC5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKnB3ID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChjdmFsKTsKKyAgICAgICAgUHlfSU5DUkVGKCpwdik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKCpwdykpIHsKKyAgICAgICAgY3ZhbC5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZSgqcHcpOworICAgICAgICAqcHcgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGN2YWwpOworICAgICAgICBQeV9JTkNSRUYoKnB2KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYgKFB5Q29tcGxleF9DaGVjaygqcHcpKSB7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICBQeV9JTkNSRUYoKnB3KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOyAvKiBDYW4ndCBkbyBpdCAqLwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9yaWNoY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlpbnQgYzsKLQlQeV9jb21wbGV4IGksIGo7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBpbnQgYzsKKyAgICBQeV9jb21wbGV4IGksIGo7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWMgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOwotCWlmIChjIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGMgPiAwKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JLyogTWFrZSBzdXJlIGJvdGggYXJndW1lbnRzIGFyZSBjb21wbGV4LiAqLwotCWlmICghKFB5Q29tcGxleF9DaGVjayh2KSAmJiBQeUNvbXBsZXhfQ2hlY2sodykpKSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJUHlfREVDUkVGKHcpOwotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGMgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOworICAgIGlmIChjIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGMgPiAwKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgLyogTWFrZSBzdXJlIGJvdGggYXJndW1lbnRzIGFyZSBjb21wbGV4LiAqLworICAgIGlmICghKFB5Q29tcGxleF9DaGVjayh2KSAmJiBQeUNvbXBsZXhfQ2hlY2sodykpKSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JaSA9ICgoUHlDb21wbGV4T2JqZWN0ICopdiktPmN2YWw7Ci0JaiA9ICgoUHlDb21wbGV4T2JqZWN0ICopdyktPmN2YWw7Ci0JUHlfREVDUkVGKHYpOwotCVB5X0RFQ1JFRih3KTsKKyAgICBpID0gKChQeUNvbXBsZXhPYmplY3QgKil2KS0+Y3ZhbDsKKyAgICBqID0gKChQeUNvbXBsZXhPYmplY3QgKil3KS0+Y3ZhbDsKKyAgICBQeV9ERUNSRUYodik7CisgICAgUHlfREVDUkVGKHcpOwogCi0JaWYgKG9wICE9IFB5X0VRICYmIG9wICE9IFB5X05FKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkibm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAob3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJubyBvcmRlcmluZyByZWxhdGlvbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKChpLnJlYWwgPT0gai5yZWFsICYmIGkuaW1hZyA9PSBqLmltYWcpID09IChvcCA9PSBQeV9FUSkpCi0JCXJlcyA9IFB5X1RydWU7Ci0JZWxzZQotCQlyZXMgPSBQeV9GYWxzZTsKKyAgICBpZiAoKGkucmVhbCA9PSBqLnJlYWwgJiYgaS5pbWFnID09IGouaW1hZykgPT0gKG9wID09IFB5X0VRKSkKKyAgICAgICAgcmVzID0gUHlfVHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5X0ZhbHNlOwogCi0JUHlfSU5DUkVGKHJlcyk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9JTkNSRUYocmVzKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9pbnQoUHlPYmplY3QgKnYpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBpbnQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBpbnQiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfbG9uZyhQeU9iamVjdCAqdikKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkgICAiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGxvbmciKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBsb25nIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X2Zsb2F0KFB5T2JqZWN0ICp2KQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gZmxvYXQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBmbG9hdCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9jb25qdWdhdGUoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlfY29tcGxleCBjOwotCWMgPSAoKFB5Q29tcGxleE9iamVjdCAqKXNlbGYpLT5jdmFsOwotCWMuaW1hZyA9IC1jLmltYWc7Ci0JcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7CisgICAgUHlfY29tcGxleCBjOworICAgIGMgPSAoKFB5Q29tcGxleE9iamVjdCAqKXNlbGYpLT5jdmFsOworICAgIGMuaW1hZyA9IC1jLmltYWc7CisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb21wbGV4X2Nvbmp1Z2F0ZV9kb2MsCkBAIC04NjMsOCArODYzLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X2dldG5ld2FyZ3MoUHlDb21wbGV4T2JqZWN0ICp2KQogewotCVB5X2NvbXBsZXggYyA9IHYtPmN2YWw7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkZCkiLCBjLnJlYWwsIGMuaW1hZyk7CisgICAgUHlfY29tcGxleCBjID0gdi0+Y3ZhbDsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRkKSIsIGMucmVhbCwgYy5pbWFnKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvbXBsZXhfX2Zvcm1hdF9fZG9jLApAQCAtODc4LDI1ICs4NzgsMjUgQEAKICAgICBQeU9iamVjdCAqZm9ybWF0X3NwZWM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19mb3JtYXRfXyIsICZmb3JtYXRfc3BlYykpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIGlmIChQeUJ5dGVzX0NoZWNrKGZvcm1hdF9zcGVjKSkKLSAgICAgICAgcmV0dXJuIF9QeUNvbXBsZXhfRm9ybWF0QWR2YW5jZWQoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKGZvcm1hdF9zcGVjKSk7CisgICAgcmV0dXJuIF9QeUNvbXBsZXhfRm9ybWF0QWR2YW5jZWQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhmb3JtYXRfc3BlYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShmb3JtYXRfc3BlYykpOwogICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSB7Ci0gICAgICAgIC8qIENvbnZlcnQgZm9ybWF0X3NwZWMgdG8gYSBzdHIgKi8KLSAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKLSAgICAgICAgUHlPYmplY3QgKnN0cl9zcGVjID0gUHlPYmplY3RfU3RyKGZvcm1hdF9zcGVjKTsKKyAgICAvKiBDb252ZXJ0IGZvcm1hdF9zcGVjIHRvIGEgc3RyICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqc3RyX3NwZWMgPSBQeU9iamVjdF9TdHIoZm9ybWF0X3NwZWMpOwogCi0gICAgICAgIGlmIChzdHJfc3BlYyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHN0cl9zcGVjID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIHJlc3VsdCA9IF9QeUNvbXBsZXhfRm9ybWF0QWR2YW5jZWQoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzdHJfc3BlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShzdHJfc3BlYykpOworICAgIHJlc3VsdCA9IF9QeUNvbXBsZXhfRm9ybWF0QWR2YW5jZWQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHN0cl9zcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoc3RyX3NwZWMpKTsKIAotICAgICAgICBQeV9ERUNSRUYoc3RyX3NwZWMpOwotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIFB5X0RFQ1JFRihzdHJfc3BlYyk7CisgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fZm9ybWF0X18gcmVxdWlyZXMgc3RyIG9yIHVuaWNvZGUiKTsKICAgICByZXR1cm4gTlVMTDsKQEAgLTkwNiwxMCArOTA2LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9pc19maW5pdGUoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlfY29tcGxleCBjOwotCWMgPSAoKFB5Q29tcGxleE9iamVjdCAqKXNlbGYpLT5jdmFsOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKFB5X0lTX0ZJTklURShjLnJlYWwpICYmCi0JCQkJICAgICAgUHlfSVNfRklOSVRFKGMuaW1hZykpKTsKKyAgICBQeV9jb21wbGV4IGM7CisgICAgYyA9ICgoUHlDb21wbGV4T2JqZWN0ICopc2VsZiktPmN2YWw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykoUHlfSVNfRklOSVRFKGMucmVhbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9JU19GSU5JVEUoYy5pbWFnKSkpOwogfQogCiBQeURvY19TVFJWQVIoY29tcGxleF9pc19maW5pdGVfZG9jLApAQCAtOTE5LDMxOCArOTE5LDMxOCBAQAogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjb21wbGV4X21ldGhvZHNbXSA9IHsKLQl7ImNvbmp1Z2F0ZSIsCShQeUNGdW5jdGlvbiljb21wbGV4X2Nvbmp1Z2F0ZSwJTUVUSF9OT0FSR1MsCi0JIGNvbXBsZXhfY29uanVnYXRlX2RvY30sCisgICAgeyJjb25qdWdhdGUiLCAgICAgICAoUHlDRnVuY3Rpb24pY29tcGxleF9jb25qdWdhdGUsIE1FVEhfTk9BUkdTLAorICAgICBjb21wbGV4X2Nvbmp1Z2F0ZV9kb2N9LAogI2lmIDAKLQl7ImlzX2Zpbml0ZSIsCShQeUNGdW5jdGlvbiljb21wbGV4X2lzX2Zpbml0ZSwJTUVUSF9OT0FSR1MsCi0JIGNvbXBsZXhfaXNfZmluaXRlX2RvY30sCisgICAgeyJpc19maW5pdGUiLCAgICAgICAoUHlDRnVuY3Rpb24pY29tcGxleF9pc19maW5pdGUsIE1FVEhfTk9BUkdTLAorICAgICBjb21wbGV4X2lzX2Zpbml0ZV9kb2N9LAogI2VuZGlmCi0JeyJfX2dldG5ld2FyZ3NfXyIsCShQeUNGdW5jdGlvbiljb21wbGV4X2dldG5ld2FyZ3MsCU1FVEhfTk9BUkdTfSwKLQl7Il9fZm9ybWF0X18iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pY29tcGxleF9fZm9ybWF0X18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLCBjb21wbGV4X19mb3JtYXRfX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fZ2V0bmV3YXJnc19fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWNvbXBsZXhfZ2V0bmV3YXJncywgICAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7Il9fZm9ybWF0X18iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pY29tcGxleF9fZm9ybWF0X18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsIGNvbXBsZXhfX2Zvcm1hdF9fZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5TWVtYmVyRGVmIGNvbXBsZXhfbWVtYmVyc1tdID0gewotCXsicmVhbCIsIFRfRE9VQkxFLCBvZmZzZXRvZihQeUNvbXBsZXhPYmplY3QsIGN2YWwucmVhbCksIFJFQURPTkxZLAotCSAidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyIn0sCi0JeyJpbWFnIiwgVF9ET1VCTEUsIG9mZnNldG9mKFB5Q29tcGxleE9iamVjdCwgY3ZhbC5pbWFnKSwgUkVBRE9OTFksCi0JICJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciJ9LAotCXswfSwKKyAgICB7InJlYWwiLCBUX0RPVUJMRSwgb2Zmc2V0b2YoUHlDb21wbGV4T2JqZWN0LCBjdmFsLnJlYWwpLCBSRUFET05MWSwKKyAgICAgInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciJ9LAorICAgIHsiaW1hZyIsIFRfRE9VQkxFLCBvZmZzZXRvZihQeUNvbXBsZXhPYmplY3QsIGN2YWwuaW1hZyksIFJFQURPTkxZLAorICAgICAidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIifSwKKyAgICB7MH0sCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9zdWJ0eXBlX2Zyb21fc3RyaW5nKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnYpCiB7Ci0JY29uc3QgY2hhciAqcywgKnN0YXJ0OwotCWNoYXIgKmVuZDsKLQlkb3VibGUgeD0wLjAsIHk9MC4wLCB6OwotCWludCBnb3RfYnJhY2tldD0wOworICAgIGNvbnN0IGNoYXIgKnMsICpzdGFydDsKKyAgICBjaGFyICplbmQ7CisgICAgZG91YmxlIHg9MC4wLCB5PTAuMCwgejsKKyAgICBpbnQgZ290X2JyYWNrZXQ9MDsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JY2hhciAqc19idWZmZXIgPSBOVUxMOworICAgIGNoYXIgKnNfYnVmZmVyID0gTlVMTDsKICNlbmRpZgotCVB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCXMgPSBQeVN0cmluZ19BU19TVFJJTkcodik7Ci0JCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgcyA9IFB5U3RyaW5nX0FTX1NUUklORyh2KTsKKyAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKLQkJc19idWZmZXIgPSAoY2hhciAqKVB5TWVtX01BTExPQyhQeVVuaWNvZGVfR0VUX1NJWkUodikrMSk7Ci0JCWlmIChzX2J1ZmZlciA9PSBOVUxMKQotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCWlmIChQeVVuaWNvZGVfRW5jb2RlRGVjaW1hbChQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSwKLQkJCQkJICAgIFB5VW5pY29kZV9HRVRfU0laRSh2KSwKLQkJCQkJICAgIHNfYnVmZmVyLAotCQkJCQkgICAgTlVMTCkpCi0JCQlnb3RvIGVycm9yOwotCQlzID0gc19idWZmZXI7Ci0JCWxlbiA9IHN0cmxlbihzKTsKLQl9CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgIHNfYnVmZmVyID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoUHlVbmljb2RlX0dFVF9TSVpFKHYpKzEpOworICAgICAgICBpZiAoc19idWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBpZiAoUHlVbmljb2RlX0VuY29kZURlY2ltYWwoUHlVbmljb2RlX0FTX1VOSUNPREUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgcyA9IHNfYnVmZmVyOworICAgICAgICBsZW4gPSBzdHJsZW4ocyk7CisgICAgfQogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHYsICZzLCAmbGVuKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjb21wbGV4KCkgYXJnIGlzIG5vdCBhIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHYsICZzLCAmbGVuKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXgoKSBhcmcgaXMgbm90IGEgc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIHBvc2l0aW9uIG9uIGZpcnN0IG5vbmJsYW5rICovCi0Jc3RhcnQgPSBzOwotCXdoaWxlIChQeV9JU1NQQUNFKCpzKSkKLQkJcysrOwotCWlmICgqcyA9PSAnKCcpIHsKLQkJLyogU2tpcCBvdmVyIHBvc3NpYmxlIGJyYWNrZXQgZnJvbSByZXByKCkuICovCi0JCWdvdF9icmFja2V0ID0gMTsKLQkJcysrOwotCQl3aGlsZSAoUHlfSVNTUEFDRSgqcykpCi0JCQlzKys7Ci0JfQorICAgIC8qIHBvc2l0aW9uIG9uIGZpcnN0IG5vbmJsYW5rICovCisgICAgc3RhcnQgPSBzOworICAgIHdoaWxlIChQeV9JU1NQQUNFKCpzKSkKKyAgICAgICAgcysrOworICAgIGlmICgqcyA9PSAnKCcpIHsKKyAgICAgICAgLyogU2tpcCBvdmVyIHBvc3NpYmxlIGJyYWNrZXQgZnJvbSByZXByKCkuICovCisgICAgICAgIGdvdF9icmFja2V0ID0gMTsKKyAgICAgICAgcysrOworICAgICAgICB3aGlsZSAoUHlfSVNTUEFDRSgqcykpCisgICAgICAgICAgICBzKys7CisgICAgfQogCi0JLyogYSB2YWxpZCBjb21wbGV4IHN0cmluZyB1c3VhbGx5IHRha2VzIG9uZSBvZiB0aGUgdGhyZWUgZm9ybXM6CisgICAgLyogYSB2YWxpZCBjb21wbGV4IHN0cmluZyB1c3VhbGx5IHRha2VzIG9uZSBvZiB0aGUgdGhyZWUgZm9ybXM6CiAKLQkgICAgIDxmbG9hdD4gICAgICAgICAgICAgICAgICAtIHJlYWwgcGFydCBvbmx5Ci0JICAgICA8ZmxvYXQ+aiAgICAgICAgICAgICAgICAgLSBpbWFnaW5hcnkgcGFydCBvbmx5Ci0JICAgICA8ZmxvYXQ+PHNpZ25lZC1mbG9hdD5qICAgLSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMKKyAgICAgICAgIDxmbG9hdD4gICAgICAgICAgICAgICAgICAtIHJlYWwgcGFydCBvbmx5CisgICAgICAgICA8ZmxvYXQ+aiAgICAgICAgICAgICAgICAgLSBpbWFnaW5hcnkgcGFydCBvbmx5CisgICAgICAgICA8ZmxvYXQ+PHNpZ25lZC1mbG9hdD5qICAgLSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMKIAotCSAgIHdoZXJlIDxmbG9hdD4gcmVwcmVzZW50cyBhbnkgbnVtZXJpYyBzdHJpbmcgdGhhdCdzIGFjY2VwdGVkIGJ5IHRoZQotCSAgIGZsb2F0IGNvbnN0cnVjdG9yIChpbmNsdWRpbmcgJ25hbicsICdpbmYnLCAnaW5maW5pdHknLCBldGMuKSwgYW5kCi0JICAgPHNpZ25lZC1mbG9hdD4gaXMgYW55IHN0cmluZyBvZiB0aGUgZm9ybSA8ZmxvYXQ+IHdob3NlIGZpcnN0Ci0JICAgY2hhcmFjdGVyIGlzICcrJyBvciAnLScuCisgICAgICAgd2hlcmUgPGZsb2F0PiByZXByZXNlbnRzIGFueSBudW1lcmljIHN0cmluZyB0aGF0J3MgYWNjZXB0ZWQgYnkgdGhlCisgICAgICAgZmxvYXQgY29uc3RydWN0b3IgKGluY2x1ZGluZyAnbmFuJywgJ2luZicsICdpbmZpbml0eScsIGV0Yy4pLCBhbmQKKyAgICAgICA8c2lnbmVkLWZsb2F0PiBpcyBhbnkgc3RyaW5nIG9mIHRoZSBmb3JtIDxmbG9hdD4gd2hvc2UgZmlyc3QKKyAgICAgICBjaGFyYWN0ZXIgaXMgJysnIG9yICctJy4KIAotCSAgIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIGV4dHJhIGZvcm1zCisgICAgICAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGUgZXh0cmEgZm9ybXMKIAotCSAgICAgPGZsb2F0PjxzaWduPmoKLQkgICAgIDxzaWduPmoKLQkgICAgIGoKKyAgICAgICAgIDxmbG9hdD48c2lnbj5qCisgICAgICAgICA8c2lnbj5qCisgICAgICAgICBqCiAKLQkgICBhcmUgYWxzbyBhY2NlcHRlZCwgdGhvdWdoIHN1cHBvcnQgZm9yIHRoZXNlIGZvcm1zIG1heSBiZSByZW1vdmVkIGZyb20KLQkgICBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFB5dGhvbi4KLQkqLworICAgICAgIGFyZSBhbHNvIGFjY2VwdGVkLCB0aG91Z2ggc3VwcG9ydCBmb3IgdGhlc2UgZm9ybXMgbWF5IGJlIHJlbW92ZWQgZnJvbQorICAgICAgIGEgZnV0dXJlIHZlcnNpb24gb2YgUHl0aG9uLgorICAgICovCiAKLQkvKiBmaXJzdCBsb29rIGZvciBmb3JtcyBzdGFydGluZyB3aXRoIDxmbG9hdD4gKi8KLQl6ID0gUHlPU19zdHJpbmdfdG9fZG91YmxlKHMsICZlbmQsIE5VTEwpOwotCWlmICh6ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19WYWx1ZUVycm9yKSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCWlmIChlbmQgIT0gcykgewotCQkvKiBhbGwgNCBmb3JtcyBzdGFydGluZyB3aXRoIDxmbG9hdD4gbGFuZCBoZXJlICovCi0JCXMgPSBlbmQ7Ci0JCWlmICgqcyA9PSAnKycgfHwgKnMgPT0gJy0nKSB7Ci0JCQkvKiA8ZmxvYXQ+PHNpZ25lZC1mbG9hdD5qIHwgPGZsb2F0PjxzaWduPmogKi8KLQkJCXggPSB6OwotCQkJeSA9IFB5T1Nfc3RyaW5nX3RvX2RvdWJsZShzLCAmZW5kLCBOVUxMKTsKLQkJCWlmICh5ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1ZhbHVlRXJyb3IpKQotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJCWVsc2UKLQkJCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmIChlbmQgIT0gcykKLQkJCQkvKiA8ZmxvYXQ+PHNpZ25lZC1mbG9hdD5qICovCi0JCQkJcyA9IGVuZDsKLQkJCWVsc2UgewotCQkJCS8qIDxmbG9hdD48c2lnbj5qICovCi0JCQkJeSA9ICpzID09ICcrJyA/IDEuMCA6IC0xLjA7Ci0JCQkJcysrOwotCQkJfQotCQkJaWYgKCEoKnMgPT0gJ2onIHx8ICpzID09ICdKJykpCi0JCQkJZ290byBwYXJzZV9lcnJvcjsKLQkJCXMrKzsKLQkJfQotCQllbHNlIGlmICgqcyA9PSAnaicgfHwgKnMgPT0gJ0onKSB7Ci0JCQkvKiA8ZmxvYXQ+aiAqLwotCQkJcysrOwotCQkJeSA9IHo7Ci0JCX0KLQkJZWxzZQotCQkJLyogPGZsb2F0PiAqLwotCQkJeCA9IHo7Ci0JfQotCWVsc2UgewotCQkvKiBub3Qgc3RhcnRpbmcgd2l0aCA8ZmxvYXQ+OyBtdXN0IGJlIDxzaWduPmogb3IgaiAqLwotCQlpZiAoKnMgPT0gJysnIHx8ICpzID09ICctJykgewotCQkJLyogPHNpZ24+aiAqLwotCQkJeSA9ICpzID09ICcrJyA/IDEuMCA6IC0xLjA7Ci0JCQlzKys7Ci0JCX0KLQkJZWxzZQotCQkJLyogaiAqLwotCQkJeSA9IDEuMDsKLQkJaWYgKCEoKnMgPT0gJ2onIHx8ICpzID09ICdKJykpCi0JCQlnb3RvIHBhcnNlX2Vycm9yOwotCQlzKys7Ci0JfQorICAgIC8qIGZpcnN0IGxvb2sgZm9yIGZvcm1zIHN0YXJ0aW5nIHdpdGggPGZsb2F0PiAqLworICAgIHogPSBQeU9TX3N0cmluZ190b19kb3VibGUocywgJmVuZCwgTlVMTCk7CisgICAgaWYgKHogPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1ZhbHVlRXJyb3IpKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKGVuZCAhPSBzKSB7CisgICAgICAgIC8qIGFsbCA0IGZvcm1zIHN0YXJ0aW5nIHdpdGggPGZsb2F0PiBsYW5kIGhlcmUgKi8KKyAgICAgICAgcyA9IGVuZDsKKyAgICAgICAgaWYgKCpzID09ICcrJyB8fCAqcyA9PSAnLScpIHsKKyAgICAgICAgICAgIC8qIDxmbG9hdD48c2lnbmVkLWZsb2F0PmogfCA8ZmxvYXQ+PHNpZ24+aiAqLworICAgICAgICAgICAgeCA9IHo7CisgICAgICAgICAgICB5ID0gUHlPU19zdHJpbmdfdG9fZG91YmxlKHMsICZlbmQsIE5VTEwpOworICAgICAgICAgICAgaWYgKHkgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVmFsdWVFcnJvcikpCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVuZCAhPSBzKQorICAgICAgICAgICAgICAgIC8qIDxmbG9hdD48c2lnbmVkLWZsb2F0PmogKi8KKyAgICAgICAgICAgICAgICBzID0gZW5kOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogPGZsb2F0PjxzaWduPmogKi8KKyAgICAgICAgICAgICAgICB5ID0gKnMgPT0gJysnID8gMS4wIDogLTEuMDsKKyAgICAgICAgICAgICAgICBzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoISgqcyA9PSAnaicgfHwgKnMgPT0gJ0onKSkKKyAgICAgICAgICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworICAgICAgICAgICAgcysrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCpzID09ICdqJyB8fCAqcyA9PSAnSicpIHsKKyAgICAgICAgICAgIC8qIDxmbG9hdD5qICovCisgICAgICAgICAgICBzKys7CisgICAgICAgICAgICB5ID0gejsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiA8ZmxvYXQ+ICovCisgICAgICAgICAgICB4ID0gejsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIG5vdCBzdGFydGluZyB3aXRoIDxmbG9hdD47IG11c3QgYmUgPHNpZ24+aiBvciBqICovCisgICAgICAgIGlmICgqcyA9PSAnKycgfHwgKnMgPT0gJy0nKSB7CisgICAgICAgICAgICAvKiA8c2lnbj5qICovCisgICAgICAgICAgICB5ID0gKnMgPT0gJysnID8gMS4wIDogLTEuMDsKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiBqICovCisgICAgICAgICAgICB5ID0gMS4wOworICAgICAgICBpZiAoISgqcyA9PSAnaicgfHwgKnMgPT0gJ0onKSkKKyAgICAgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisgICAgICAgIHMrKzsKKyAgICB9CiAKLQkvKiB0cmFpbGluZyB3aGl0ZXNwYWNlIGFuZCBjbG9zaW5nIGJyYWNrZXQgKi8KLQl3aGlsZSAoUHlfSVNTUEFDRSgqcykpCi0JCXMrKzsKLQlpZiAoZ290X2JyYWNrZXQpIHsKLQkJLyogaWYgdGhlcmUgd2FzIGFuIG9wZW5pbmcgcGFyZW50aGVzaXMsIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcKLQkJICAgY2xvc2luZyBwYXJlbnRoZXNpcyBzaG91bGQgYmUgcmlnaHQgaGVyZSAqLwotCQlpZiAoKnMgIT0gJyknKQotCQkJZ290byBwYXJzZV9lcnJvcjsKLQkJcysrOwotCQl3aGlsZSAoUHlfSVNTUEFDRSgqcykpCi0JCQlzKys7Ci0JfQorICAgIC8qIHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIGNsb3NpbmcgYnJhY2tldCAqLworICAgIHdoaWxlIChQeV9JU1NQQUNFKCpzKSkKKyAgICAgICAgcysrOworICAgIGlmIChnb3RfYnJhY2tldCkgeworICAgICAgICAvKiBpZiB0aGVyZSB3YXMgYW4gb3BlbmluZyBwYXJlbnRoZXNpcywgdGhlbiB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICBjbG9zaW5nIHBhcmVudGhlc2lzIHNob3VsZCBiZSByaWdodCBoZXJlICovCisgICAgICAgIGlmICgqcyAhPSAnKScpCisgICAgICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworICAgICAgICBzKys7CisgICAgICAgIHdoaWxlIChQeV9JU1NQQUNFKCpzKSkKKyAgICAgICAgICAgIHMrKzsKKyAgICB9CiAKLQkvKiB3ZSBzaG91bGQgbm93IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLwotCWlmIChzLXN0YXJ0ICE9IGxlbikKLQkJZ290byBwYXJzZV9lcnJvcjsKKyAgICAvKiB3ZSBzaG91bGQgbm93IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLworICAgIGlmIChzLXN0YXJ0ICE9IGxlbikKKyAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKIAogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChzX2J1ZmZlcikKLQkJUHlNZW1fRlJFRShzX2J1ZmZlcik7CisgICAgaWYgKHNfYnVmZmVyKQorICAgICAgICBQeU1lbV9GUkVFKHNfYnVmZmVyKTsKICNlbmRpZgotCXJldHVybiBjb21wbGV4X3N1YnR5cGVfZnJvbV9kb3VibGVzKHR5cGUsIHgsIHkpOworICAgIHJldHVybiBjb21wbGV4X3N1YnR5cGVfZnJvbV9kb3VibGVzKHR5cGUsIHgsIHkpOwogCiAgIHBhcnNlX2Vycm9yOgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJImNvbXBsZXgoKSBhcmcgaXMgYSBtYWxmb3JtZWQgc3RyaW5nIik7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjb21wbGV4KCkgYXJnIGlzIGEgbWFsZm9ybWVkIHN0cmluZyIpOwogICBlcnJvcjoKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKHNfYnVmZmVyKQotCQlQeU1lbV9GUkVFKHNfYnVmZmVyKTsKKyAgICBpZiAoc19idWZmZXIpCisgICAgICAgIFB5TWVtX0ZSRUUoc19idWZmZXIpOwogI2VuZGlmCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqciwgKmksICp0bXA7Ci0JUHlOdW1iZXJNZXRob2RzICpuYnIsICpuYmkgPSBOVUxMOwotCVB5X2NvbXBsZXggY3IsIGNpOwotCWludCBvd25fciA9IDA7Ci0JaW50IGNyX2lzX2NvbXBsZXggPSAwOwotCWludCBjaV9pc19jb21wbGV4ID0gMDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InJlYWwiLCAiaW1hZyIsIDB9OworICAgIFB5T2JqZWN0ICpyLCAqaSwgKnRtcDsKKyAgICBQeU51bWJlck1ldGhvZHMgKm5iciwgKm5iaSA9IE5VTEw7CisgICAgUHlfY29tcGxleCBjciwgY2k7CisgICAgaW50IG93bl9yID0gMDsKKyAgICBpbnQgY3JfaXNfY29tcGxleCA9IDA7CisgICAgaW50IGNpX2lzX2NvbXBsZXggPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsicmVhbCIsICJpbWFnIiwgMH07CiAKLQlyID0gUHlfRmFsc2U7Ci0JaSA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPTzpjb21wbGV4Iiwga3dsaXN0LAotCQkJCQkgJnIsICZpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgciA9IFB5X0ZhbHNlOworICAgIGkgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T086Y29tcGxleCIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmciwgJmkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFNwZWNpYWwtY2FzZSBmb3IgYSBzaW5nbGUgYXJndW1lbnQgd2hlbiB0eXBlKGFyZykgaXMgY29tcGxleC4gKi8KLQlpZiAoUHlDb21wbGV4X0NoZWNrRXhhY3QocikgJiYgaSA9PSBOVUxMICYmCi0JICAgIHR5cGUgPT0gJlB5Q29tcGxleF9UeXBlKSB7Ci0JCS8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBrbm93IHdoZXRoZXIgaXQncyBzYWZlIHRvIHJldHVybgotCQkgICBhIGNvbXBsZXggKnN1YmNsYXNzKiBpbnN0YW5jZSBhcy1pcywgaGVuY2UgdGhlIHJlc3RyaWN0aW9uCi0JCSAgIHRvIGV4YWN0IGNvbXBsZXhlcyBoZXJlLiAgSWYgZWl0aGVyIHRoZSBpbnB1dCBvciB0aGUKLQkJICAgb3V0cHV0IGlzIGEgY29tcGxleCBzdWJjbGFzcywgaXQgd2lsbCBiZSBoYW5kbGVkIGJlbG93IAotCQkgICBhcyBhIG5vbi1vcnRob2dvbmFsIHZlY3Rvci4gICovCi0JCVB5X0lOQ1JFRihyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCWlmIChQeVN0cmluZ19DaGVjayhyKSB8fCBQeVVuaWNvZGVfQ2hlY2socikpIHsKLQkJaWYgKGkgIT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImNvbXBsZXgoKSBjYW4ndCB0YWtlIHNlY29uZCBhcmciCi0JCQkJCSIgaWYgZmlyc3QgaXMgYSBzdHJpbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBjb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcodHlwZSwgcik7Ci0JfQotCWlmIChpICE9IE5VTEwgJiYgKFB5U3RyaW5nX0NoZWNrKGkpIHx8IFB5VW5pY29kZV9DaGVjayhpKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY29tcGxleCgpIHNlY29uZCBhcmcgY2FuJ3QgYmUgYSBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFNwZWNpYWwtY2FzZSBmb3IgYSBzaW5nbGUgYXJndW1lbnQgd2hlbiB0eXBlKGFyZykgaXMgY29tcGxleC4gKi8KKyAgICBpZiAoUHlDb21wbGV4X0NoZWNrRXhhY3QocikgJiYgaSA9PSBOVUxMICYmCisgICAgICAgIHR5cGUgPT0gJlB5Q29tcGxleF9UeXBlKSB7CisgICAgICAgIC8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBrbm93IHdoZXRoZXIgaXQncyBzYWZlIHRvIHJldHVybgorICAgICAgICAgICBhIGNvbXBsZXggKnN1YmNsYXNzKiBpbnN0YW5jZSBhcy1pcywgaGVuY2UgdGhlIHJlc3RyaWN0aW9uCisgICAgICAgICAgIHRvIGV4YWN0IGNvbXBsZXhlcyBoZXJlLiAgSWYgZWl0aGVyIHRoZSBpbnB1dCBvciB0aGUKKyAgICAgICAgICAgb3V0cHV0IGlzIGEgY29tcGxleCBzdWJjbGFzcywgaXQgd2lsbCBiZSBoYW5kbGVkIGJlbG93CisgICAgICAgICAgIGFzIGEgbm9uLW9ydGhvZ29uYWwgdmVjdG9yLiAgKi8KKyAgICAgICAgUHlfSU5DUkVGKHIpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHIpIHx8IFB5VW5pY29kZV9DaGVjayhyKSkgeworICAgICAgICBpZiAoaSAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4KCkgY2FuJ3QgdGFrZSBzZWNvbmQgYXJnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaWYgZmlyc3QgaXMgYSBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcodHlwZSwgcik7CisgICAgfQorICAgIGlmIChpICE9IE5VTEwgJiYgKFB5U3RyaW5nX0NoZWNrKGkpIHx8IFB5VW5pY29kZV9DaGVjayhpKSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4KCkgc2Vjb25kIGFyZyBjYW4ndCBiZSBhIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl0bXAgPSB0cnlfY29tcGxleF9zcGVjaWFsX21ldGhvZChyKTsKLQlpZiAodG1wKSB7Ci0JCXIgPSB0bXA7Ci0JCW93bl9yID0gMTsKLQl9Ci0JZWxzZSBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgdG1wID0gdHJ5X2NvbXBsZXhfc3BlY2lhbF9tZXRob2Qocik7CisgICAgaWYgKHRtcCkgeworICAgICAgICByID0gdG1wOworICAgICAgICBvd25fciA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbmJyID0gci0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChpICE9IE5VTEwpCi0JCW5iaSA9IGktPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobmJyID09IE5VTEwgfHwgbmJyLT5uYl9mbG9hdCA9PSBOVUxMIHx8Ci0JICAgICgoaSAhPSBOVUxMKSAmJiAobmJpID09IE5VTEwgfHwgbmJpLT5uYl9mbG9hdCA9PSBOVUxMKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICJjb21wbGV4KCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhIG51bWJlciIpOwotCQlpZiAob3duX3IpIHsKLQkJCVB5X0RFQ1JFRihyKTsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbmJyID0gci0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgIGlmIChpICE9IE5VTEwpCisgICAgICAgIG5iaSA9IGktPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobmJyID09IE5VTEwgfHwgbmJyLT5uYl9mbG9hdCA9PSBOVUxMIHx8CisgICAgICAgICgoaSAhPSBOVUxMKSAmJiAobmJpID09IE5VTEwgfHwgbmJpLT5uYl9mbG9hdCA9PSBOVUxMKSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiY29tcGxleCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIiKTsKKyAgICAgICAgaWYgKG93bl9yKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogSWYgd2UgZ2V0IHRoaXMgZmFyLCB0aGVuIHRoZSAicmVhbCIgYW5kICJpbWFnIiBwYXJ0cyBzaG91bGQKLQkgICBib3RoIGJlIHRyZWF0ZWQgYXMgbnVtYmVycywgYW5kIHRoZSBjb25zdHJ1Y3RvciBzaG91bGQgcmV0dXJuIGEKLQkgICBjb21wbGV4IG51bWJlciBlcXVhbCB0byAocmVhbCArIGltYWcqMWopLgorICAgIC8qIElmIHdlIGdldCB0aGlzIGZhciwgdGhlbiB0aGUgInJlYWwiIGFuZCAiaW1hZyIgcGFydHMgc2hvdWxkCisgICAgICAgYm90aCBiZSB0cmVhdGVkIGFzIG51bWJlcnMsIGFuZCB0aGUgY29uc3RydWN0b3Igc2hvdWxkIHJldHVybiBhCisgICAgICAgY29tcGxleCBudW1iZXIgZXF1YWwgdG8gKHJlYWwgKyBpbWFnKjFqKS4KIAotIAkgICBOb3RlIHRoYXQgd2UgZG8gTk9UIGFzc3VtZSB0aGUgaW5wdXQgdG8gYWxyZWFkeSBiZSBpbiBjYW5vbmljYWwKLQkgICBmb3JtOyB0aGUgInJlYWwiIGFuZCAiaW1hZyIgcGFydHMgbWlnaHQgdGhlbXNlbHZlcyBiZSBjb21wbGV4Ci0JICAgbnVtYmVycywgd2hpY2ggc2xpZ2h0bHkgY29tcGxpY2F0ZXMgdGhlIGNvZGUgYmVsb3cuICovCi0JaWYgKFB5Q29tcGxleF9DaGVjayhyKSkgewotCQkvKiBOb3RlIHRoYXQgaWYgciBpcyBvZiBhIGNvbXBsZXggc3VidHlwZSwgd2UncmUgb25seQotCQkgICByZXRhaW5pbmcgaXRzIHJlYWwgJiBpbWFnIHBhcnRzIGhlcmUsIGFuZCB0aGUgcmV0dXJuCi0JCSAgIHZhbHVlIGlzIChwcm9wZXJseSkgb2YgdGhlIGJ1aWx0aW4gY29tcGxleCB0eXBlLiAqLwotCQljciA9ICgoUHlDb21wbGV4T2JqZWN0KilyKS0+Y3ZhbDsKLQkJY3JfaXNfY29tcGxleCA9IDE7Ci0JCWlmIChvd25fcikgewotCQkJUHlfREVDUkVGKHIpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBUaGUgInJlYWwiIHBhcnQgcmVhbGx5IGlzIGVudGlyZWx5IHJlYWwsIGFuZCBjb250cmlidXRlcwotCQkgICBub3RoaW5nIGluIHRoZSBpbWFnaW5hcnkgZGlyZWN0aW9uLiAgCi0JCSAgIEp1c3QgdHJlYXQgaXQgYXMgYSBkb3VibGUuICovCi0JCXRtcCA9IFB5TnVtYmVyX0Zsb2F0KHIpOwotCQlpZiAob3duX3IpIHsKLQkJCS8qIHIgd2FzIGEgbmV3bHkgY3JlYXRlZCBjb21wbGV4IG51bWJlciwgcmF0aGVyCi0JCQkgICB0aGFuIHRoZSBvcmlnaW5hbCAicmVhbCIgYXJndW1lbnQuICovCi0JCQlQeV9ERUNSRUYocik7Ci0JCX0KLQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICghUHlGbG9hdF9DaGVjayh0bXApKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiZmxvYXQocikgZGlkbid0IHJldHVybiBhIGZsb2F0Iik7Ci0JCQlQeV9ERUNSRUYodG1wKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWNyLnJlYWwgPSBQeUZsb2F0X0FzRG91YmxlKHRtcCk7Ci0JCWNyLmltYWcgPSAwLjA7IC8qIFNodXQgdXAgY29tcGlsZXIgd2FybmluZyAqLwotCQlQeV9ERUNSRUYodG1wKTsKLQl9Ci0JaWYgKGkgPT0gTlVMTCkgewotCQljaS5yZWFsID0gMC4wOwotCX0KLQllbHNlIGlmIChQeUNvbXBsZXhfQ2hlY2soaSkpIHsKLQkJY2kgPSAoKFB5Q29tcGxleE9iamVjdCopaSktPmN2YWw7Ci0JCWNpX2lzX2NvbXBsZXggPSAxOwotCX0gZWxzZSB7Ci0JCS8qIFRoZSAiaW1hZyIgcGFydCByZWFsbHkgaXMgZW50aXJlbHkgaW1hZ2luYXJ5LCBhbmQKLQkJICAgY29udHJpYnV0ZXMgbm90aGluZyBpbiB0aGUgcmVhbCBkaXJlY3Rpb24uCi0JCSAgIEp1c3QgdHJlYXQgaXQgYXMgYSBkb3VibGUuICovCi0JCXRtcCA9ICgqbmJpLT5uYl9mbG9hdCkoaSk7Ci0JCWlmICh0bXAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQljaS5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZSh0bXApOwotCQlQeV9ERUNSRUYodG1wKTsKLQl9Ci0JLyogIElmIHRoZSBpbnB1dCB3YXMgaW4gY2Fub25pY2FsIGZvcm0sIHRoZW4gdGhlICJyZWFsIiBhbmQgImltYWciCi0JICAgIHBhcnRzIGFyZSByZWFsIG51bWJlcnMsIHNvIHRoYXQgY2kuaW1hZyBhbmQgY3IuaW1hZyBhcmUgemVyby4KLQkgICAgV2UgbmVlZCB0aGlzIGNvcnJlY3Rpb24gaW4gY2FzZSB0aGV5IHdlcmUgbm90IHJlYWwgbnVtYmVycy4gKi8KKyAgICAgICBOb3RlIHRoYXQgd2UgZG8gTk9UIGFzc3VtZSB0aGUgaW5wdXQgdG8gYWxyZWFkeSBiZSBpbiBjYW5vbmljYWwKKyAgICAgICBmb3JtOyB0aGUgInJlYWwiIGFuZCAiaW1hZyIgcGFydHMgbWlnaHQgdGhlbXNlbHZlcyBiZSBjb21wbGV4CisgICAgICAgbnVtYmVycywgd2hpY2ggc2xpZ2h0bHkgY29tcGxpY2F0ZXMgdGhlIGNvZGUgYmVsb3cuICovCisgICAgaWYgKFB5Q29tcGxleF9DaGVjayhyKSkgeworICAgICAgICAvKiBOb3RlIHRoYXQgaWYgciBpcyBvZiBhIGNvbXBsZXggc3VidHlwZSwgd2UncmUgb25seQorICAgICAgICAgICByZXRhaW5pbmcgaXRzIHJlYWwgJiBpbWFnIHBhcnRzIGhlcmUsIGFuZCB0aGUgcmV0dXJuCisgICAgICAgICAgIHZhbHVlIGlzIChwcm9wZXJseSkgb2YgdGhlIGJ1aWx0aW4gY29tcGxleCB0eXBlLiAqLworICAgICAgICBjciA9ICgoUHlDb21wbGV4T2JqZWN0KilyKS0+Y3ZhbDsKKyAgICAgICAgY3JfaXNfY29tcGxleCA9IDE7CisgICAgICAgIGlmIChvd25fcikgeworICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBUaGUgInJlYWwiIHBhcnQgcmVhbGx5IGlzIGVudGlyZWx5IHJlYWwsIGFuZCBjb250cmlidXRlcworICAgICAgICAgICBub3RoaW5nIGluIHRoZSBpbWFnaW5hcnkgZGlyZWN0aW9uLgorICAgICAgICAgICBKdXN0IHRyZWF0IGl0IGFzIGEgZG91YmxlLiAqLworICAgICAgICB0bXAgPSBQeU51bWJlcl9GbG9hdChyKTsKKyAgICAgICAgaWYgKG93bl9yKSB7CisgICAgICAgICAgICAvKiByIHdhcyBhIG5ld2x5IGNyZWF0ZWQgY29tcGxleCBudW1iZXIsIHJhdGhlcgorICAgICAgICAgICAgICAgdGhhbiB0aGUgb3JpZ2luYWwgInJlYWwiIGFyZ3VtZW50LiAqLworICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICB9CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5RmxvYXRfQ2hlY2sodG1wKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQocikgZGlkbid0IHJldHVybiBhIGZsb2F0Iik7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGNyLnJlYWwgPSBQeUZsb2F0X0FzRG91YmxlKHRtcCk7CisgICAgICAgIGNyLmltYWcgPSAwLjA7IC8qIFNodXQgdXAgY29tcGlsZXIgd2FybmluZyAqLworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICB9CisgICAgaWYgKGkgPT0gTlVMTCkgeworICAgICAgICBjaS5yZWFsID0gMC4wOworICAgIH0KKyAgICBlbHNlIGlmIChQeUNvbXBsZXhfQ2hlY2soaSkpIHsKKyAgICAgICAgY2kgPSAoKFB5Q29tcGxleE9iamVjdCopaSktPmN2YWw7CisgICAgICAgIGNpX2lzX2NvbXBsZXggPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoZSAiaW1hZyIgcGFydCByZWFsbHkgaXMgZW50aXJlbHkgaW1hZ2luYXJ5LCBhbmQKKyAgICAgICAgICAgY29udHJpYnV0ZXMgbm90aGluZyBpbiB0aGUgcmVhbCBkaXJlY3Rpb24uCisgICAgICAgICAgIEp1c3QgdHJlYXQgaXQgYXMgYSBkb3VibGUuICovCisgICAgICAgIHRtcCA9ICgqbmJpLT5uYl9mbG9hdCkoaSk7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjaS5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZSh0bXApOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICB9CisgICAgLyogIElmIHRoZSBpbnB1dCB3YXMgaW4gY2Fub25pY2FsIGZvcm0sIHRoZW4gdGhlICJyZWFsIiBhbmQgImltYWciCisgICAgICAgIHBhcnRzIGFyZSByZWFsIG51bWJlcnMsIHNvIHRoYXQgY2kuaW1hZyBhbmQgY3IuaW1hZyBhcmUgemVyby4KKyAgICAgICAgV2UgbmVlZCB0aGlzIGNvcnJlY3Rpb24gaW4gY2FzZSB0aGV5IHdlcmUgbm90IHJlYWwgbnVtYmVycy4gKi8KIAotCWlmIChjaV9pc19jb21wbGV4KSB7Ci0JCWNyLnJlYWwgLT0gY2kuaW1hZzsKLQl9Ci0JaWYgKGNyX2lzX2NvbXBsZXgpIHsKLQkJY2kucmVhbCArPSBjci5pbWFnOwotCX0KLQlyZXR1cm4gY29tcGxleF9zdWJ0eXBlX2Zyb21fZG91Ymxlcyh0eXBlLCBjci5yZWFsLCBjaS5yZWFsKTsKKyAgICBpZiAoY2lfaXNfY29tcGxleCkgeworICAgICAgICBjci5yZWFsIC09IGNpLmltYWc7CisgICAgfQorICAgIGlmIChjcl9pc19jb21wbGV4KSB7CisgICAgICAgIGNpLnJlYWwgKz0gY3IuaW1hZzsKKyAgICB9CisgICAgcmV0dXJuIGNvbXBsZXhfc3VidHlwZV9mcm9tX2RvdWJsZXModHlwZSwgY3IucmVhbCwgY2kucmVhbCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb21wbGV4X2RvYywKQEAgLTEyNDAsODcgKzEyNDAsODcgQEAKICJUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKHJlYWwgKyBpbWFnKjFqKSB3aGVyZSBpbWFnIGRlZmF1bHRzIHRvIDAuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgY29tcGxleF9hc19udW1iZXIgPSB7Ci0JKGJpbmFyeWZ1bmMpY29tcGxleF9hZGQsIAkJLyogbmJfYWRkICovCi0JKGJpbmFyeWZ1bmMpY29tcGxleF9zdWIsIAkJLyogbmJfc3VidHJhY3QgKi8KLQkoYmluYXJ5ZnVuYyljb21wbGV4X211bCwgCQkvKiBuYl9tdWx0aXBseSAqLwotCShiaW5hcnlmdW5jKWNvbXBsZXhfY2xhc3NpY19kaXYsCS8qIG5iX2RpdmlkZSAqLwotCShiaW5hcnlmdW5jKWNvbXBsZXhfcmVtYWluZGVyLAkJLyogbmJfcmVtYWluZGVyICovCi0JKGJpbmFyeWZ1bmMpY29tcGxleF9kaXZtb2QsCQkvKiBuYl9kaXZtb2QgKi8KLQkodGVybmFyeWZ1bmMpY29tcGxleF9wb3csCQkvKiBuYl9wb3dlciAqLwotCSh1bmFyeWZ1bmMpY29tcGxleF9uZWcsCQkJLyogbmJfbmVnYXRpdmUgKi8KLQkodW5hcnlmdW5jKWNvbXBsZXhfcG9zLAkJCS8qIG5iX3Bvc2l0aXZlICovCi0JKHVuYXJ5ZnVuYyljb21wbGV4X2FicywJCQkvKiBuYl9hYnNvbHV0ZSAqLwotCShpbnF1aXJ5KWNvbXBsZXhfbm9uemVybywJCS8qIG5iX25vbnplcm8gKi8KLQkwLAkJCQkJLyogbmJfaW52ZXJ0ICovCi0JMCwJCQkJCS8qIG5iX2xzaGlmdCAqLwotCTAsCQkJCQkvKiBuYl9yc2hpZnQgKi8KLQkwLAkJCQkJLyogbmJfYW5kICovCi0JMCwJCQkJCS8qIG5iX3hvciAqLwotCTAsCQkJCQkvKiBuYl9vciAqLwotCWNvbXBsZXhfY29lcmNlLAkJCQkvKiBuYl9jb2VyY2UgKi8KLQljb21wbGV4X2ludCwJCQkJLyogbmJfaW50ICovCi0JY29tcGxleF9sb25nLAkJCQkvKiBuYl9sb25nICovCi0JY29tcGxleF9mbG9hdCwJCQkJLyogbmJfZmxvYXQgKi8KLQkwLAkJCQkJLyogbmJfb2N0ICovCi0JMCwJCQkJCS8qIG5iX2hleCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2FkZCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfbXVsdGlwbHkqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLwotCTAsIAkJCQkJLyogbmJfaW5wbGFjZV9wb3dlciAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2FuZCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3hvciAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX29yICovCi0JKGJpbmFyeWZ1bmMpY29tcGxleF9pbnRfZGl2LAkJLyogbmJfZmxvb3JfZGl2aWRlICovCi0JKGJpbmFyeWZ1bmMpY29tcGxleF9kaXYsCQkvKiBuYl90cnVlX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCisgICAgKGJpbmFyeWZ1bmMpY29tcGxleF9hZGQsICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICAoYmluYXJ5ZnVuYyljb21wbGV4X3N1YiwgICAgICAgICAgICAgICAgICAgIC8qIG5iX3N1YnRyYWN0ICovCisgICAgKGJpbmFyeWZ1bmMpY29tcGxleF9tdWwsICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIChiaW5hcnlmdW5jKWNvbXBsZXhfY2xhc3NpY19kaXYsICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgKGJpbmFyeWZ1bmMpY29tcGxleF9yZW1haW5kZXIsICAgICAgICAgICAgICAvKiBuYl9yZW1haW5kZXIgKi8KKyAgICAoYmluYXJ5ZnVuYyljb21wbGV4X2Rpdm1vZCwgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgICh0ZXJuYXJ5ZnVuYyljb21wbGV4X3BvdywgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAodW5hcnlmdW5jKWNvbXBsZXhfbmVnLCAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25lZ2F0aXZlICovCisgICAgKHVuYXJ5ZnVuYyljb21wbGV4X3BvcywgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgICh1bmFyeWZ1bmMpY29tcGxleF9hYnMsICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSljb21wbGV4X25vbnplcm8sICAgICAgICAgICAgICAgICAgIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2ludmVydCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbHNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9yc2hpZnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2FuZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfeG9yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9vciAqLworICAgIGNvbXBsZXhfY29lcmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfY29lcmNlICovCisgICAgY29tcGxleF9pbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnQgKi8KKyAgICBjb21wbGV4X2xvbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2xvbmcgKi8KKyAgICBjb21wbGV4X2Zsb2F0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Zsb2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9vY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2hleCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hZGQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfbXVsdGlwbHkqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcmVtYWluZGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3Bvd2VyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9yc2hpZnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfYW5kICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3hvciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9vciAqLworICAgIChiaW5hcnlmdW5jKWNvbXBsZXhfaW50X2RpdiwgICAgICAgICAgICAgICAgLyogbmJfZmxvb3JfZGl2aWRlICovCisgICAgKGJpbmFyeWZ1bmMpY29tcGxleF9kaXYsICAgICAgICAgICAgICAgICAgICAvKiBuYl90cnVlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUNvbXBsZXhfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJjb21wbGV4IiwKLQlzaXplb2YoUHlDb21wbGV4T2JqZWN0KSwKLQkwLAotCWNvbXBsZXhfZGVhbGxvYywJCQkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYyljb21wbGV4X3ByaW50LAkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpY29tcGxleF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkmY29tcGxleF9hc19udW1iZXIsICAgIAkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWNvbXBsZXhfaGFzaCwgCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpY29tcGxleF9zdHIsCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkJLyogdHBfZmxhZ3MgKi8KLQljb21wbGV4X2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JY29tcGxleF9yaWNoY29tcGFyZSwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JY29tcGxleF9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQljb21wbGV4X21lbWJlcnMsCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCWNvbXBsZXhfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsICAgICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJjb21wbGV4IiwKKyAgICBzaXplb2YoUHlDb21wbGV4T2JqZWN0KSwKKyAgICAwLAorICAgIGNvbXBsZXhfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpY29tcGxleF9wcmludCwgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpY29tcGxleF9yZXByLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmY29tcGxleF9hc19udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpY29tcGxleF9oYXNoLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpY29tcGxleF9zdHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjb21wbGV4X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgY29tcGxleF9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgY29tcGxleF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgY29tcGxleF9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvbXBsZXhfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL09iamVjdHMvZGVzY3JvYmplY3QuYyBiL09iamVjdHMvZGVzY3JvYmplY3QuYwppbmRleCAxNjhiYTc0Li4wYjgzMjMzIDEwMDY0NAotLS0gYS9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9kZXNjcm9iamVjdC5jCkBAIC02LDY0NSArNiw2NDUgQEAKIHN0YXRpYyB2b2lkCiBkZXNjcl9kZWFsbG9jKFB5RGVzY3JPYmplY3QgKmRlc2NyKQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKGRlc2NyKTsKLQlQeV9YREVDUkVGKGRlc2NyLT5kX3R5cGUpOwotCVB5X1hERUNSRUYoZGVzY3ItPmRfbmFtZSk7Ci0JUHlPYmplY3RfR0NfRGVsKGRlc2NyKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhkZXNjcik7CisgICAgUHlfWERFQ1JFRihkZXNjci0+ZF90eXBlKTsKKyAgICBQeV9YREVDUkVGKGRlc2NyLT5kX25hbWUpOworICAgIFB5T2JqZWN0X0dDX0RlbChkZXNjcik7CiB9CiAKIHN0YXRpYyBjaGFyICoKIGRlc2NyX25hbWUoUHlEZXNjck9iamVjdCAqZGVzY3IpCiB7Ci0JaWYgKGRlc2NyLT5kX25hbWUgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhkZXNjci0+ZF9uYW1lKSkKLQkJcmV0dXJuIFB5U3RyaW5nX0FTX1NUUklORyhkZXNjci0+ZF9uYW1lKTsKLQllbHNlCi0JCXJldHVybiAiPyI7CisgICAgaWYgKGRlc2NyLT5kX25hbWUgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhkZXNjci0+ZF9uYW1lKSkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0FTX1NUUklORyhkZXNjci0+ZF9uYW1lKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAiPyI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXNjcl9yZXByKFB5RGVzY3JPYmplY3QgKmRlc2NyLCBjaGFyICpmb3JtYXQpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoZm9ybWF0LCBkZXNjcl9uYW1lKGRlc2NyKSwKLQkJCQkgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdChmb3JtYXQsIGRlc2NyX25hbWUoZGVzY3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aG9kX3JlcHIoUHlNZXRob2REZXNjck9iamVjdCAqZGVzY3IpCiB7Ci0JcmV0dXJuIGRlc2NyX3JlcHIoKFB5RGVzY3JPYmplY3QgKilkZXNjciwgCi0JCQkgICI8bWV0aG9kICclcycgb2YgJyVzJyBvYmplY3RzPiIpOworICAgIHJldHVybiBkZXNjcl9yZXByKChQeURlc2NyT2JqZWN0ICopZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgIjxtZXRob2QgJyVzJyBvZiAnJXMnIG9iamVjdHM+Iik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZW1iZXJfcmVwcihQeU1lbWJlckRlc2NyT2JqZWN0ICpkZXNjcikKIHsKLQlyZXR1cm4gZGVzY3JfcmVwcigoUHlEZXNjck9iamVjdCAqKWRlc2NyLCAKLQkJCSAgIjxtZW1iZXIgJyVzJyBvZiAnJXMnIG9iamVjdHM+Iik7CisgICAgcmV0dXJuIGRlc2NyX3JlcHIoKFB5RGVzY3JPYmplY3QgKilkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAiPG1lbWJlciAnJXMnIG9mICclcycgb2JqZWN0cz4iKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldHNldF9yZXByKFB5R2V0U2V0RGVzY3JPYmplY3QgKmRlc2NyKQogewotCXJldHVybiBkZXNjcl9yZXByKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIAotCQkJICAiPGF0dHJpYnV0ZSAnJXMnIG9mICclcycgb2JqZWN0cz4iKTsKKyAgICByZXR1cm4gZGVzY3JfcmVwcigoUHlEZXNjck9iamVjdCAqKWRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICI8YXR0cmlidXRlICclcycgb2YgJyVzJyBvYmplY3RzPiIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcHBlcmRlc2NyX3JlcHIoUHlXcmFwcGVyRGVzY3JPYmplY3QgKmRlc2NyKQogewotCXJldHVybiBkZXNjcl9yZXByKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIAotCQkJICAiPHNsb3Qgd3JhcHBlciAnJXMnIG9mICclcycgb2JqZWN0cz4iKTsKKyAgICByZXR1cm4gZGVzY3JfcmVwcigoUHlEZXNjck9iamVjdCAqKWRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICI8c2xvdCB3cmFwcGVyICclcycgb2YgJyVzJyBvYmplY3RzPiIpOwogfQogCiBzdGF0aWMgaW50CiBkZXNjcl9jaGVjayhQeURlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKipwcmVzKQogewotCWlmIChvYmogPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoZGVzY3IpOwotCQkqcHJlcyA9IChQeU9iamVjdCAqKWRlc2NyOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2sob2JqLCBkZXNjci0+ZF90eXBlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZGVzY3JpcHRvciAnJXMnIGZvciAnJXMnIG9iamVjdHMgIgotCQkJICAgICAiZG9lc24ndCBhcHBseSB0byAnJXMnIG9iamVjdCIsCi0JCQkgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCi0JCQkgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCi0JCQkgICAgIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCSpwcmVzID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoZGVzY3IpOworICAgICAgICAqcHJlcyA9IChQeU9iamVjdCAqKWRlc2NyOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2sob2JqLCBkZXNjci0+ZF90eXBlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3IgJyVzJyBmb3IgJyVzJyBvYmplY3RzICIKKyAgICAgICAgICAgICAgICAgICAgICJkb2Vzbid0IGFwcGx5IHRvICclcycgb2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCisgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgKnByZXMgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGFzc21ldGhvZF9nZXQoUHlNZXRob2REZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp0eXBlKQogewotCS8qIEVuc3VyZSBhIHZhbGlkIHR5cGUuICBDbGFzcyBtZXRob2RzIGlnbm9yZSBvYmouICovCi0JaWYgKHR5cGUgPT0gTlVMTCkgewotCQlpZiAob2JqICE9IE5VTEwpCi0JCQl0eXBlID0gKFB5T2JqZWN0ICopb2JqLT5vYl90eXBlOwotCQllbHNlIHsKLQkJCS8qIFdvdCAtIG5vIHR5cGU/ISAqLwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJkZXNjcmlwdG9yICclcycgZm9yIHR5cGUgJyVzJyAiCi0JCQkJICAgICAibmVlZHMgZWl0aGVyIGFuIG9iamVjdCBvciBhIHR5cGUiLAotCQkJCSAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKLQkJCQkgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKCFQeVR5cGVfQ2hlY2sodHlwZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImRlc2NyaXB0b3IgJyVzJyBmb3IgdHlwZSAnJXMnICIKLQkJCSAgICAgIm5lZWRzIGEgdHlwZSwgbm90IGEgJyVzJyBhcyBhcmcgMiIsCi0JCQkgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCi0JCQkgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCi0JCQkgICAgIHR5cGUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeVR5cGVfSXNTdWJ0eXBlKChQeVR5cGVPYmplY3QgKil0eXBlLCBkZXNjci0+ZF90eXBlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZGVzY3JpcHRvciAnJXMnIGZvciB0eXBlICclcycgIgotCQkJICAgICAiZG9lc24ndCBhcHBseSB0byB0eXBlICclcyciLAotCQkJICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAotCQkJICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAotCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUNGdW5jdGlvbl9OZXcoZGVzY3ItPmRfbWV0aG9kLCB0eXBlKTsKKyAgICAvKiBFbnN1cmUgYSB2YWxpZCB0eXBlLiAgQ2xhc3MgbWV0aG9kcyBpZ25vcmUgb2JqLiAqLworICAgIGlmICh0eXBlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKG9iaiAhPSBOVUxMKQorICAgICAgICAgICAgdHlwZSA9IChQeU9iamVjdCAqKW9iai0+b2JfdHlwZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBXb3QgLSBubyB0eXBlPyEgKi8KKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3IgJyVzJyBmb3IgdHlwZSAnJXMnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibmVlZHMgZWl0aGVyIGFuIG9iamVjdCBvciBhIHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVB5VHlwZV9DaGVjayh0eXBlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3IgJyVzJyBmb3IgdHlwZSAnJXMnICIKKyAgICAgICAgICAgICAgICAgICAgICJuZWVkcyBhIHR5cGUsIG5vdCBhICclcycgYXMgYXJnIDIiLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlUeXBlX0lzU3VidHlwZSgoUHlUeXBlT2JqZWN0ICopdHlwZSwgZGVzY3ItPmRfdHlwZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yICclcycgZm9yIHR5cGUgJyVzJyAiCisgICAgICAgICAgICAgICAgICAgICAiZG9lc24ndCBhcHBseSB0byB0eXBlICclcyciLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUNGdW5jdGlvbl9OZXcoZGVzY3ItPmRfbWV0aG9kLCB0eXBlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ldGhvZF9nZXQoUHlNZXRob2REZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp0eXBlKQogewotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChkZXNjcl9jaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosICZyZXMpKQotCQlyZXR1cm4gcmVzOwotCXJldHVybiBQeUNGdW5jdGlvbl9OZXcoZGVzY3ItPmRfbWV0aG9kLCBvYmopOworICAgIGlmIChkZXNjcl9jaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosICZyZXMpKQorICAgICAgICByZXR1cm4gcmVzOworICAgIHJldHVybiBQeUNGdW5jdGlvbl9OZXcoZGVzY3ItPmRfbWV0aG9kLCBvYmopOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWVtYmVyX2dldChQeU1lbWJlckRlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKGRlc2NyX2NoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgJnJlcykpCi0JCXJldHVybiByZXM7Ci0JcmV0dXJuIFB5TWVtYmVyX0dldE9uZSgoY2hhciAqKW9iaiwgZGVzY3ItPmRfbWVtYmVyKTsKKyAgICBpZiAoZGVzY3JfY2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCAmcmVzKSkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICByZXR1cm4gUHlNZW1iZXJfR2V0T25lKChjaGFyICopb2JqLCBkZXNjci0+ZF9tZW1iZXIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0c2V0X2dldChQeUdldFNldERlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKGRlc2NyX2NoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgJnJlcykpCi0JCXJldHVybiByZXM7Ci0JaWYgKGRlc2NyLT5kX2dldHNldC0+Z2V0ICE9IE5VTEwpCi0JCXJldHVybiBkZXNjci0+ZF9nZXRzZXQtPmdldChvYmosIGRlc2NyLT5kX2dldHNldC0+Y2xvc3VyZSk7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkgICAgICJhdHRyaWJ1dGUgJyUuMzAwcycgb2YgJyUuMTAwcycgb2JqZWN0cyBpcyBub3QgcmVhZGFibGUiLAotCQkgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCi0JCSAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGRlc2NyX2NoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgJnJlcykpCisgICAgICAgIHJldHVybiByZXM7CisgICAgaWYgKGRlc2NyLT5kX2dldHNldC0+Z2V0ICE9IE5VTEwpCisgICAgICAgIHJldHVybiBkZXNjci0+ZF9nZXRzZXQtPmdldChvYmosIGRlc2NyLT5kX2dldHNldC0+Y2xvc3VyZSk7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAiYXR0cmlidXRlICclLjMwMHMnIG9mICclLjEwMHMnIG9iamVjdHMgaXMgbm90IHJlYWRhYmxlIiwKKyAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKKyAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwcGVyZGVzY3JfZ2V0KFB5V3JhcHBlckRlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKGRlc2NyX2NoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgJnJlcykpCi0JCXJldHVybiByZXM7Ci0JcmV0dXJuIFB5V3JhcHBlcl9OZXcoKFB5T2JqZWN0ICopZGVzY3IsIG9iaik7CisgICAgaWYgKGRlc2NyX2NoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgJnJlcykpCisgICAgICAgIHJldHVybiByZXM7CisgICAgcmV0dXJuIFB5V3JhcHBlcl9OZXcoKFB5T2JqZWN0ICopZGVzY3IsIG9iaik7CiB9CiAKIHN0YXRpYyBpbnQKIGRlc2NyX3NldGNoZWNrKFB5RGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdmFsdWUsCi0JICAgICAgIGludCAqcHJlcykKKyAgICAgICAgICAgICAgIGludCAqcHJlcykKIHsKLQlhc3NlcnQob2JqICE9IE5VTEwpOwotCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKG9iaiwgZGVzY3ItPmRfdHlwZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImRlc2NyaXB0b3IgJyUuMjAwcycgZm9yICclLjEwMHMnIG9iamVjdHMgIgotCQkJICAgICAiZG9lc24ndCBhcHBseSB0byAnJS4xMDBzJyBvYmplY3QiLAotCQkJICAgICBkZXNjcl9uYW1lKGRlc2NyKSwKLQkJCSAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJKnByZXMgPSAtMTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChvYmogIT0gTlVMTCk7CisgICAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2sob2JqLCBkZXNjci0+ZF90eXBlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3IgJyUuMjAwcycgZm9yICclLjEwMHMnIG9iamVjdHMgIgorICAgICAgICAgICAgICAgICAgICAgImRvZXNuJ3QgYXBwbHkgdG8gJyUuMTAwcycgb2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoZGVzY3IpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICpwcmVzID0gLTE7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbWVtYmVyX3NldChQeU1lbWJlckRlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnZhbHVlKQogewotCWludCByZXM7CisgICAgaW50IHJlczsKIAotCWlmIChkZXNjcl9zZXRjaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosIHZhbHVlLCAmcmVzKSkKLQkJcmV0dXJuIHJlczsKLQlyZXR1cm4gUHlNZW1iZXJfU2V0T25lKChjaGFyICopb2JqLCBkZXNjci0+ZF9tZW1iZXIsIHZhbHVlKTsKKyAgICBpZiAoZGVzY3Jfc2V0Y2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCB2YWx1ZSwgJnJlcykpCisgICAgICAgIHJldHVybiByZXM7CisgICAgcmV0dXJuIFB5TWVtYmVyX1NldE9uZSgoY2hhciAqKW9iaiwgZGVzY3ItPmRfbWVtYmVyLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGdldHNldF9zZXQoUHlHZXRTZXREZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlpbnQgcmVzOworICAgIGludCByZXM7CiAKLQlpZiAoZGVzY3Jfc2V0Y2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCB2YWx1ZSwgJnJlcykpCi0JCXJldHVybiByZXM7Ci0JaWYgKGRlc2NyLT5kX2dldHNldC0+c2V0ICE9IE5VTEwpCi0JCXJldHVybiBkZXNjci0+ZF9nZXRzZXQtPnNldChvYmosIHZhbHVlLAotCQkJCQkgICAgZGVzY3ItPmRfZ2V0c2V0LT5jbG9zdXJlKTsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCSAgICAgImF0dHJpYnV0ZSAnJS4zMDBzJyBvZiAnJS4xMDBzJyBvYmplY3RzIGlzIG5vdCB3cml0YWJsZSIsCi0JCSAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKLQkJICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gLTE7CisgICAgaWYgKGRlc2NyX3NldGNoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgdmFsdWUsICZyZXMpKQorICAgICAgICByZXR1cm4gcmVzOworICAgIGlmIChkZXNjci0+ZF9nZXRzZXQtPnNldCAhPSBOVUxMKQorICAgICAgICByZXR1cm4gZGVzY3ItPmRfZ2V0c2V0LT5zZXQob2JqLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX2dldHNldC0+Y2xvc3VyZSk7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAiYXR0cmlidXRlICclLjMwMHMnIG9mICclLjEwMHMnIG9iamVjdHMgaXMgbm90IHdyaXRhYmxlIiwKKyAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKKyAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aG9kZGVzY3JfY2FsbChQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5X3NzaXplX3QgYXJnYzsKLQlQeU9iamVjdCAqc2VsZiwgKmZ1bmMsICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBhcmdjOworICAgIFB5T2JqZWN0ICpzZWxmLCAqZnVuYywgKnJlc3VsdDsKIAotCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhY2NlcHRhYmxlIGFzICdzZWxmJyAqLwotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLQlhcmdjID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQlpZiAoYXJnYyA8IDEpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImRlc2NyaXB0b3IgJyUuMzAwcycgb2YgJyUuMTAwcycgIgotCQkJICAgICAib2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50IiwKLQkJCSAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKLQkJCSAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzZWxmID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlpZiAoIVB5T2JqZWN0X0lzSW5zdGFuY2Uoc2VsZiwgKFB5T2JqZWN0ICopKGRlc2NyLT5kX3R5cGUpKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZGVzY3JpcHRvciAnJS4yMDBzJyAiCi0JCQkgICAgICJyZXF1aXJlcyBhICclLjEwMHMnIG9iamVjdCAiCi0JCQkgICAgICJidXQgcmVjZWl2ZWQgYSAnJS4xMDBzJyIsCi0JCQkgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCi0JCQkgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCi0JCQkgICAgIHNlbGYtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFjY2VwdGFibGUgYXMgJ3NlbGYnICovCisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOworICAgIGFyZ2MgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3IgJyUuMzAwcycgb2YgJyUuMTAwcycgIgorICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCBuZWVkcyBhbiBhcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBpZiAoIVB5T2JqZWN0X0lzSW5zdGFuY2Uoc2VsZiwgKFB5T2JqZWN0ICopKGRlc2NyLT5kX3R5cGUpKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3IgJyUuMjAwcycgIgorICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVzIGEgJyUuMTAwcycgb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICJidXQgcmVjZWl2ZWQgYSAnJS4xMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlmdW5jID0gUHlDRnVuY3Rpb25fTmV3KGRlc2NyLT5kX21ldGhvZCwgc2VsZik7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgYXJnYyk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCXJldHVybiByZXN1bHQ7CisgICAgZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyhkZXNjci0+ZF9tZXRob2QsIHNlbGYpOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIGFyZ2MpOworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xhc3NtZXRob2RkZXNjcl9jYWxsKFB5TWV0aG9kRGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqYXJncywKLQkJICAgICAgUHlPYmplY3QgKmt3ZHMpCisgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXN1bHQ7CiAKLQlmdW5jID0gUHlDRnVuY3Rpb25fTmV3KGRlc2NyLT5kX21ldGhvZCwgKFB5T2JqZWN0ICopZGVzY3ItPmRfdHlwZSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyhkZXNjci0+ZF9tZXRob2QsIChQeU9iamVjdCAqKWRlc2NyLT5kX3R5cGUpOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJncywga3dkcyk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwcGVyZGVzY3JfY2FsbChQeVdyYXBwZXJEZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeV9zc2l6ZV90IGFyZ2M7Ci0JUHlPYmplY3QgKnNlbGYsICpmdW5jLCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgYXJnYzsKKyAgICBQeU9iamVjdCAqc2VsZiwgKmZ1bmMsICpyZXN1bHQ7CiAKLQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYWNjZXB0YWJsZSBhcyAnc2VsZicgKi8KLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0JYXJnYyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JaWYgKGFyZ2MgPCAxKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJkZXNjcmlwdG9yICclLjMwMHMnIG9mICclLjEwMHMnICIKLQkJCSAgICAgIm9iamVjdCBuZWVkcyBhbiBhcmd1bWVudCIsCi0JCQkgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCi0JCQkgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaWYgKCFQeU9iamVjdF9Jc0luc3RhbmNlKHNlbGYsIChQeU9iamVjdCAqKShkZXNjci0+ZF90eXBlKSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImRlc2NyaXB0b3IgJyUuMjAwcycgIgotCQkJICAgICAicmVxdWlyZXMgYSAnJS4xMDBzJyBvYmplY3QgIgotCQkJICAgICAiYnV0IHJlY2VpdmVkIGEgJyUuMTAwcyciLAotCQkJICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAotCQkJICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAotCQkJICAgICBzZWxmLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhY2NlcHRhYmxlIGFzICdzZWxmJyAqLworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICBhcmdjID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yICclLjMwMHMnIG9mICclLjEwMHMnICIKKyAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgbmVlZHMgYW4gYXJndW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2VsZiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgaWYgKCFQeU9iamVjdF9Jc0luc3RhbmNlKHNlbGYsIChQeU9iamVjdCAqKShkZXNjci0+ZF90eXBlKSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yICclLjIwMHMnICIKKyAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlcyBhICclLjEwMHMnIG9iamVjdCAiCisgICAgICAgICAgICAgICAgICAgICAiYnV0IHJlY2VpdmVkIGEgJyUuMTAwcyciLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZnVuYyA9IFB5V3JhcHBlcl9OZXcoKFB5T2JqZWN0ICopZGVzY3IsIHNlbGYpOwotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIGFyZ2MpOwotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJncywga3dkcyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGZ1bmMgPSBQeVdyYXBwZXJfTmV3KChQeU9iamVjdCAqKWRlc2NyLCBzZWxmKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBhcmdjKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFyZ3MsIGt3ZHMpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ldGhvZF9nZXRfZG9jKFB5TWV0aG9kRGVzY3JPYmplY3QgKmRlc2NyLCB2b2lkICpjbG9zdXJlKQogewotCWlmIChkZXNjci0+ZF9tZXRob2QtPm1sX2RvYyA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRlc2NyLT5kX21ldGhvZC0+bWxfZG9jKTsKKyAgICBpZiAoZGVzY3ItPmRfbWV0aG9kLT5tbF9kb2MgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZXNjci0+ZF9tZXRob2QtPm1sX2RvYyk7CiB9CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBkZXNjcl9tZW1iZXJzW10gPSB7Ci0JeyJfX29iamNsYXNzX18iLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlEZXNjck9iamVjdCwgZF90eXBlKSwgUkVBRE9OTFl9LAotCXsiX19uYW1lX18iLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlEZXNjck9iamVjdCwgZF9uYW1lKSwgUkVBRE9OTFl9LAotCXswfQorICAgIHsiX19vYmpjbGFzc19fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5RGVzY3JPYmplY3QsIGRfdHlwZSksIFJFQURPTkxZfSwKKyAgICB7Il9fbmFtZV9fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5RGVzY3JPYmplY3QsIGRfbmFtZSksIFJFQURPTkxZfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeUdldFNldERlZiBtZXRob2RfZ2V0c2V0W10gPSB7Ci0JeyJfX2RvY19fIiwgKGdldHRlciltZXRob2RfZ2V0X2RvY30sCi0JezB9CisgICAgeyJfX2RvY19fIiwgKGdldHRlciltZXRob2RfZ2V0X2RvY30sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbWVtYmVyX2dldF9kb2MoUHlNZW1iZXJEZXNjck9iamVjdCAqZGVzY3IsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JaWYgKGRlc2NyLT5kX21lbWJlci0+ZG9jID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGVzY3ItPmRfbWVtYmVyLT5kb2MpOworICAgIGlmIChkZXNjci0+ZF9tZW1iZXItPmRvYyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRlc2NyLT5kX21lbWJlci0+ZG9jKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIG1lbWJlcl9nZXRzZXRbXSA9IHsKLQl7Il9fZG9jX18iLCAoZ2V0dGVyKW1lbWJlcl9nZXRfZG9jfSwKLQl7MH0KKyAgICB7Il9fZG9jX18iLCAoZ2V0dGVyKW1lbWJlcl9nZXRfZG9jfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRzZXRfZ2V0X2RvYyhQeUdldFNldERlc2NyT2JqZWN0ICpkZXNjciwgdm9pZCAqY2xvc3VyZSkKIHsKLQlpZiAoZGVzY3ItPmRfZ2V0c2V0LT5kb2MgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZXNjci0+ZF9nZXRzZXQtPmRvYyk7CisgICAgaWYgKGRlc2NyLT5kX2dldHNldC0+ZG9jID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGVzY3ItPmRfZ2V0c2V0LT5kb2MpOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgZ2V0c2V0X2dldHNldFtdID0gewotCXsiX19kb2NfXyIsIChnZXR0ZXIpZ2V0c2V0X2dldF9kb2N9LAotCXswfQorICAgIHsiX19kb2NfXyIsIChnZXR0ZXIpZ2V0c2V0X2dldF9kb2N9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBwZXJkZXNjcl9nZXRfZG9jKFB5V3JhcHBlckRlc2NyT2JqZWN0ICpkZXNjciwgdm9pZCAqY2xvc3VyZSkKIHsKLQlpZiAoZGVzY3ItPmRfYmFzZS0+ZG9jID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGVzY3ItPmRfYmFzZS0+ZG9jKTsKKyAgICBpZiAoZGVzY3ItPmRfYmFzZS0+ZG9jID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGVzY3ItPmRfYmFzZS0+ZG9jKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIHdyYXBwZXJkZXNjcl9nZXRzZXRbXSA9IHsKLQl7Il9fZG9jX18iLCAoZ2V0dGVyKXdyYXBwZXJkZXNjcl9nZXRfZG9jfSwKLQl7MH0KKyAgICB7Il9fZG9jX18iLCAoZ2V0dGVyKXdyYXBwZXJkZXNjcl9nZXRfZG9jfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBpbnQKIGRlc2NyX3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeURlc2NyT2JqZWN0ICpkZXNjciA9IChQeURlc2NyT2JqZWN0ICopc2VsZjsKLQlQeV9WSVNJVChkZXNjci0+ZF90eXBlKTsKLQlyZXR1cm4gMDsKKyAgICBQeURlc2NyT2JqZWN0ICpkZXNjciA9IChQeURlc2NyT2JqZWN0ICopc2VsZjsKKyAgICBQeV9WSVNJVChkZXNjci0+ZF90eXBlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeU1ldGhvZERlc2NyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkibWV0aG9kX2Rlc2NyaXB0b3IiLAotCXNpemVvZihQeU1ldGhvZERlc2NyT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWRlc2NyX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKW1ldGhvZF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYyltZXRob2RkZXNjcl9jYWxsLAkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JZGVzY3JfdHJhdmVyc2UsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCWRlc2NyX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQltZXRob2RfZ2V0c2V0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JKGRlc2NyZ2V0ZnVuYyltZXRob2RfZ2V0LAkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgIm1ldGhvZF9kZXNjcmlwdG9yIiwKKyAgICBzaXplb2YoUHlNZXRob2REZXNjck9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilkZXNjcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKW1ldGhvZF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKW1ldGhvZGRlc2NyX2NhbGwsICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgZGVzY3JfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBkZXNjcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBtZXRob2RfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIChkZXNjcmdldGZ1bmMpbWV0aG9kX2dldCwgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KIH07CiAKIC8qIFRoaXMgaXMgZm9yIE1FVEhfQ0xBU1MgaW4gQywgbm90IGZvciAiZiA9IGNsYXNzbWV0aG9kKGYpIiBpbiBQeXRob24hICovCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5Q2xhc3NNZXRob2REZXNjcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImNsYXNzbWV0aG9kX2Rlc2NyaXB0b3IiLAotCXNpemVvZihQeU1ldGhvZERlc2NyT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWRlc2NyX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKW1ldGhvZF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYyljbGFzc21ldGhvZGRlc2NyX2NhbGwsCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCWRlc2NyX3RyYXZlcnNlLAkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlkZXNjcl9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JbWV0aG9kX2dldHNldCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCShkZXNjcmdldGZ1bmMpY2xhc3NtZXRob2RfZ2V0LAkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImNsYXNzbWV0aG9kX2Rlc2NyaXB0b3IiLAorICAgIHNpemVvZihQeU1ldGhvZERlc2NyT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWRlc2NyX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpbWV0aG9kX3JlcHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAodGVybmFyeWZ1bmMpY2xhc3NtZXRob2RkZXNjcl9jYWxsLCAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICBkZXNjcl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGRlc2NyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIG1ldGhvZF9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgKGRlc2NyZ2V0ZnVuYyljbGFzc21ldGhvZF9nZXQsICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5TWVtYmVyRGVzY3JfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJtZW1iZXJfZGVzY3JpcHRvciIsCi0Jc2l6ZW9mKFB5TWVtYmVyRGVzY3JPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpZGVzY3JfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpbWVtYmVyX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCWRlc2NyX3RyYXZlcnNlLAkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlkZXNjcl9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JbWVtYmVyX2dldHNldCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCShkZXNjcmdldGZ1bmMpbWVtYmVyX2dldCwJCS8qIHRwX2Rlc2NyX2dldCAqLwotCShkZXNjcnNldGZ1bmMpbWVtYmVyX3NldCwJCS8qIHRwX2Rlc2NyX3NldCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgIm1lbWJlcl9kZXNjcmlwdG9yIiwKKyAgICBzaXplb2YoUHlNZW1iZXJEZXNjck9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilkZXNjcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKW1lbWJlcl9yZXByLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgZGVzY3JfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBkZXNjcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBtZW1iZXJfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIChkZXNjcmdldGZ1bmMpbWVtYmVyX2dldCwgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgKGRlc2Nyc2V0ZnVuYyltZW1iZXJfc2V0LCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUdldFNldERlc2NyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZ2V0c2V0X2Rlc2NyaXB0b3IiLAotCXNpemVvZihQeUdldFNldERlc2NyT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWRlc2NyX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWdldHNldF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQlkZXNjcl90cmF2ZXJzZSwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JZGVzY3JfbWVtYmVycywJCQkJLyogdHBfbWVtYmVycyAqLwotCWdldHNldF9nZXRzZXQsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkoZGVzY3JnZXRmdW5jKWdldHNldF9nZXQsCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkoZGVzY3JzZXRmdW5jKWdldHNldF9zZXQsCQkvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJnZXRzZXRfZGVzY3JpcHRvciIsCisgICAgc2l6ZW9mKFB5R2V0U2V0RGVzY3JPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpZGVzY3JfZGVhbGxvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylnZXRzZXRfcmVwciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIGRlc2NyX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgZGVzY3JfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgZ2V0c2V0X2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAoZGVzY3JnZXRmdW5jKWdldHNldF9nZXQsICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIChkZXNjcnNldGZ1bmMpZ2V0c2V0X3NldCwgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlXcmFwcGVyRGVzY3JfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJ3cmFwcGVyX2Rlc2NyaXB0b3IiLAotCXNpemVvZihQeVdyYXBwZXJEZXNjck9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilkZXNjcl9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyl3cmFwcGVyZGVzY3JfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYyl3cmFwcGVyZGVzY3JfY2FsbCwJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCWRlc2NyX3RyYXZlcnNlLAkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlkZXNjcl9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0Jd3JhcHBlcmRlc2NyX2dldHNldCwJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JKGRlc2NyZ2V0ZnVuYyl3cmFwcGVyZGVzY3JfZ2V0LAkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgIndyYXBwZXJfZGVzY3JpcHRvciIsCisgICAgc2l6ZW9mKFB5V3JhcHBlckRlc2NyT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWRlc2NyX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpd3JhcHBlcmRlc2NyX3JlcHIsICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAodGVybmFyeWZ1bmMpd3JhcHBlcmRlc2NyX2NhbGwsICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICBkZXNjcl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGRlc2NyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIHdyYXBwZXJkZXNjcl9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgKGRlc2NyZ2V0ZnVuYyl3cmFwcGVyZGVzY3JfZ2V0LCAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogfTsKIAogc3RhdGljIFB5RGVzY3JPYmplY3QgKgogZGVzY3JfbmV3KFB5VHlwZU9iamVjdCAqZGVzY3J0eXBlLCBQeVR5cGVPYmplY3QgKnR5cGUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JUHlEZXNjck9iamVjdCAqZGVzY3I7CisgICAgUHlEZXNjck9iamVjdCAqZGVzY3I7CiAKLQlkZXNjciA9IChQeURlc2NyT2JqZWN0ICopUHlUeXBlX0dlbmVyaWNBbGxvYyhkZXNjcnR5cGUsIDApOwotCWlmIChkZXNjciAhPSBOVUxMKSB7Ci0JCVB5X1hJTkNSRUYodHlwZSk7Ci0JCWRlc2NyLT5kX3R5cGUgPSB0eXBlOwotCQlkZXNjci0+ZF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhuYW1lKTsKLQkJaWYgKGRlc2NyLT5kX25hbWUgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGRlc2NyKTsKLQkJCWRlc2NyID0gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gZGVzY3I7CisgICAgZGVzY3IgPSAoUHlEZXNjck9iamVjdCAqKVB5VHlwZV9HZW5lcmljQWxsb2MoZGVzY3J0eXBlLCAwKTsKKyAgICBpZiAoZGVzY3IgIT0gTlVMTCkgeworICAgICAgICBQeV9YSU5DUkVGKHR5cGUpOworICAgICAgICBkZXNjci0+ZF90eXBlID0gdHlwZTsKKyAgICAgICAgZGVzY3ItPmRfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobmFtZSk7CisgICAgICAgIGlmIChkZXNjci0+ZF9uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgICAgICAgICBkZXNjciA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRlc2NyOwogfQogCiBQeU9iamVjdCAqCiBQeURlc2NyX05ld01ldGhvZChQeVR5cGVPYmplY3QgKnR5cGUsIFB5TWV0aG9kRGVmICptZXRob2QpCiB7Ci0JUHlNZXRob2REZXNjck9iamVjdCAqZGVzY3I7CisgICAgUHlNZXRob2REZXNjck9iamVjdCAqZGVzY3I7CiAKLQlkZXNjciA9IChQeU1ldGhvZERlc2NyT2JqZWN0ICopZGVzY3JfbmV3KCZQeU1ldGhvZERlc2NyX1R5cGUsCi0JCQkJCQkgdHlwZSwgbWV0aG9kLT5tbF9uYW1lKTsKLQlpZiAoZGVzY3IgIT0gTlVMTCkKLQkJZGVzY3ItPmRfbWV0aG9kID0gbWV0aG9kOwotCXJldHVybiAoUHlPYmplY3QgKilkZXNjcjsKKyAgICBkZXNjciA9IChQeU1ldGhvZERlc2NyT2JqZWN0ICopZGVzY3JfbmV3KCZQeU1ldGhvZERlc2NyX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBtZXRob2QtPm1sX25hbWUpOworICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICBkZXNjci0+ZF9tZXRob2QgPSBtZXRob2Q7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlc2NyOwogfQogCiBQeU9iamVjdCAqCiBQeURlc2NyX05ld0NsYXNzTWV0aG9kKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlNZXRob2REZWYgKm1ldGhvZCkKIHsKLQlQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjcjsKKyAgICBQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjcjsKIAotCWRlc2NyID0gKFB5TWV0aG9kRGVzY3JPYmplY3QgKilkZXNjcl9uZXcoJlB5Q2xhc3NNZXRob2REZXNjcl9UeXBlLAotCQkJCQkJIHR5cGUsIG1ldGhvZC0+bWxfbmFtZSk7Ci0JaWYgKGRlc2NyICE9IE5VTEwpCi0JCWRlc2NyLT5kX21ldGhvZCA9IG1ldGhvZDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopZGVzY3I7CisgICAgZGVzY3IgPSAoUHlNZXRob2REZXNjck9iamVjdCAqKWRlc2NyX25ldygmUHlDbGFzc01ldGhvZERlc2NyX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBtZXRob2QtPm1sX25hbWUpOworICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICBkZXNjci0+ZF9tZXRob2QgPSBtZXRob2Q7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlc2NyOwogfQogCiBQeU9iamVjdCAqCiBQeURlc2NyX05ld01lbWJlcihQeVR5cGVPYmplY3QgKnR5cGUsIFB5TWVtYmVyRGVmICptZW1iZXIpCiB7Ci0JUHlNZW1iZXJEZXNjck9iamVjdCAqZGVzY3I7CisgICAgUHlNZW1iZXJEZXNjck9iamVjdCAqZGVzY3I7CiAKLQlkZXNjciA9IChQeU1lbWJlckRlc2NyT2JqZWN0ICopZGVzY3JfbmV3KCZQeU1lbWJlckRlc2NyX1R5cGUsCi0JCQkJCQkgdHlwZSwgbWVtYmVyLT5uYW1lKTsKLQlpZiAoZGVzY3IgIT0gTlVMTCkKLQkJZGVzY3ItPmRfbWVtYmVyID0gbWVtYmVyOwotCXJldHVybiAoUHlPYmplY3QgKilkZXNjcjsKKyAgICBkZXNjciA9IChQeU1lbWJlckRlc2NyT2JqZWN0ICopZGVzY3JfbmV3KCZQeU1lbWJlckRlc2NyX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBtZW1iZXItPm5hbWUpOworICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICBkZXNjci0+ZF9tZW1iZXIgPSBtZW1iZXI7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlc2NyOwogfQogCiBQeU9iamVjdCAqCiBQeURlc2NyX05ld0dldFNldChQeVR5cGVPYmplY3QgKnR5cGUsIFB5R2V0U2V0RGVmICpnZXRzZXQpCiB7Ci0JUHlHZXRTZXREZXNjck9iamVjdCAqZGVzY3I7CisgICAgUHlHZXRTZXREZXNjck9iamVjdCAqZGVzY3I7CiAKLQlkZXNjciA9IChQeUdldFNldERlc2NyT2JqZWN0ICopZGVzY3JfbmV3KCZQeUdldFNldERlc2NyX1R5cGUsCi0JCQkJCQkgdHlwZSwgZ2V0c2V0LT5uYW1lKTsKLQlpZiAoZGVzY3IgIT0gTlVMTCkKLQkJZGVzY3ItPmRfZ2V0c2V0ID0gZ2V0c2V0OwotCXJldHVybiAoUHlPYmplY3QgKilkZXNjcjsKKyAgICBkZXNjciA9IChQeUdldFNldERlc2NyT2JqZWN0ICopZGVzY3JfbmV3KCZQeUdldFNldERlc2NyX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBnZXRzZXQtPm5hbWUpOworICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICBkZXNjci0+ZF9nZXRzZXQgPSBnZXRzZXQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlc2NyOwogfQogCiBQeU9iamVjdCAqCiBQeURlc2NyX05ld1dyYXBwZXIoUHlUeXBlT2JqZWN0ICp0eXBlLCBzdHJ1Y3Qgd3JhcHBlcmJhc2UgKmJhc2UsIHZvaWQgKndyYXBwZWQpCiB7Ci0JUHlXcmFwcGVyRGVzY3JPYmplY3QgKmRlc2NyOworICAgIFB5V3JhcHBlckRlc2NyT2JqZWN0ICpkZXNjcjsKIAotCWRlc2NyID0gKFB5V3JhcHBlckRlc2NyT2JqZWN0ICopZGVzY3JfbmV3KCZQeVdyYXBwZXJEZXNjcl9UeXBlLAotCQkJCQkJIHR5cGUsIGJhc2UtPm5hbWUpOwotCWlmIChkZXNjciAhPSBOVUxMKSB7Ci0JCWRlc2NyLT5kX2Jhc2UgPSBiYXNlOwotCQlkZXNjci0+ZF93cmFwcGVkID0gd3JhcHBlZDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKWRlc2NyOworICAgIGRlc2NyID0gKFB5V3JhcHBlckRlc2NyT2JqZWN0ICopZGVzY3JfbmV3KCZQeVdyYXBwZXJEZXNjcl9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgYmFzZS0+bmFtZSk7CisgICAgaWYgKGRlc2NyICE9IE5VTEwpIHsKKyAgICAgICAgZGVzY3ItPmRfYmFzZSA9IGJhc2U7CisgICAgICAgIGRlc2NyLT5kX3dyYXBwZWQgPSB3cmFwcGVkOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVzY3I7CiB9CiAKIApAQCAtNjU0LDIyMSArNjU0LDIyMSBAQAogICAgYml0IG9mIGEgcGFpbiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZGljdDsKIH0gcHJveHlvYmplY3Q7CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBwcm94eV9sZW4ocHJveHlvYmplY3QgKnBwKQogewotCXJldHVybiBQeU9iamVjdF9TaXplKHBwLT5kaWN0KTsKKyAgICByZXR1cm4gUHlPYmplY3RfU2l6ZShwcC0+ZGljdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9nZXRpdGVtKHByb3h5b2JqZWN0ICpwcCwgUHlPYmplY3QgKmtleSkKIHsKLQlyZXR1cm4gUHlPYmplY3RfR2V0SXRlbShwcC0+ZGljdCwga2V5KTsKKyAgICByZXR1cm4gUHlPYmplY3RfR2V0SXRlbShwcC0+ZGljdCwga2V5KTsKIH0KIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgcHJveHlfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYylwcm94eV9sZW4sCQkJLyogbXBfbGVuZ3RoICovCi0JKGJpbmFyeWZ1bmMpcHJveHlfZ2V0aXRlbSwJCS8qIG1wX3N1YnNjcmlwdCAqLwotCTAsCQkJCQkvKiBtcF9hc3Nfc3Vic2NyaXB0ICovCisgICAgKGxlbmZ1bmMpcHJveHlfbGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtcF9sZW5ndGggKi8KKyAgICAoYmluYXJ5ZnVuYylwcm94eV9nZXRpdGVtLCAgICAgICAgICAgICAgICAgIC8qIG1wX3N1YnNjcmlwdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXBfYXNzX3N1YnNjcmlwdCAqLwogfTsKIAogc3RhdGljIGludAogcHJveHlfY29udGFpbnMocHJveHlvYmplY3QgKnBwLCBQeU9iamVjdCAqa2V5KQogewotCXJldHVybiBQeURpY3RfQ29udGFpbnMocHAtPmRpY3QsIGtleSk7CisgICAgcmV0dXJuIFB5RGljdF9Db250YWlucyhwcC0+ZGljdCwga2V5KTsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIHByb3h5X2FzX3NlcXVlbmNlID0gewotCTAsCQkJCQkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCQkJLyogc3FfY29uY2F0ICovCi0JMCwJCQkJCS8qIHNxX3JlcGVhdCAqLwotCTAsCQkJCQkvKiBzcV9pdGVtICovCi0JMCwJCQkJCS8qIHNxX3NsaWNlICovCi0JMCwJCQkJCS8qIHNxX2Fzc19pdGVtICovCi0JMCwJCQkJCS8qIHNxX2Fzc19zbGljZSAqLwotCShvYmpvYmpwcm9jKXByb3h5X2NvbnRhaW5zLAkJLyogc3FfY29udGFpbnMgKi8KLQkwLAkJCQkJLyogc3FfaW5wbGFjZV9jb25jYXQgKi8KLQkwLAkJCQkJLyogc3FfaW5wbGFjZV9yZXBlYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX3NsaWNlICovCisgICAgKG9iam9ianByb2MpcHJveHlfY29udGFpbnMsICAgICAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9jb25jYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfcmVwZWF0ICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfaGFzX2tleShwcm94eW9iamVjdCAqcHAsIFB5T2JqZWN0ICprZXkpCiB7Ci0JaW50IHJlcyA9IFB5RGljdF9Db250YWlucyhwcC0+ZGljdCwga2V5KTsKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXMpOworICAgIGludCByZXMgPSBQeURpY3RfQ29udGFpbnMocHAtPmRpY3QsIGtleSk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X2dldChwcm94eW9iamVjdCAqcHAsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICprZXksICpkZWYgPSBQeV9Ob25lOworICAgIFB5T2JqZWN0ICprZXksICpkZWYgPSBQeV9Ob25lOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZ2V0IiwgMSwgMiwgJmtleSwgJmRlZikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHBwLT5kaWN0LCAiZ2V0IiwgIihPTykiLCBrZXksIGRlZik7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZ2V0IiwgMSwgMiwgJmtleSwgJmRlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHBwLT5kaWN0LCAiZ2V0IiwgIihPTykiLCBrZXksIGRlZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9rZXlzKHByb3h5b2JqZWN0ICpwcCkKIHsKLQlyZXR1cm4gUHlNYXBwaW5nX0tleXMocHAtPmRpY3QpOworICAgIHJldHVybiBQeU1hcHBpbmdfS2V5cyhwcC0+ZGljdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV92YWx1ZXMocHJveHlvYmplY3QgKnBwKQogewotCXJldHVybiBQeU1hcHBpbmdfVmFsdWVzKHBwLT5kaWN0KTsKKyAgICByZXR1cm4gUHlNYXBwaW5nX1ZhbHVlcyhwcC0+ZGljdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9pdGVtcyhwcm94eW9iamVjdCAqcHApCiB7Ci0JcmV0dXJuIFB5TWFwcGluZ19JdGVtcyhwcC0+ZGljdCk7CisgICAgcmV0dXJuIFB5TWFwcGluZ19JdGVtcyhwcC0+ZGljdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9pdGVya2V5cyhwcm94eW9iamVjdCAqcHApCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHAtPmRpY3QsICJpdGVya2V5cyIsIE5VTEwpOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHBwLT5kaWN0LCAiaXRlcmtleXMiLCBOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X2l0ZXJ2YWx1ZXMocHJveHlvYmplY3QgKnBwKQogewotCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHBwLT5kaWN0LCAiaXRlcnZhbHVlcyIsIE5VTEwpOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHBwLT5kaWN0LCAiaXRlcnZhbHVlcyIsIE5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfaXRlcml0ZW1zKHByb3h5b2JqZWN0ICpwcCkKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChwcC0+ZGljdCwgIml0ZXJpdGVtcyIsIE5VTEwpOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHBwLT5kaWN0LCAiaXRlcml0ZW1zIiwgTlVMTCk7CiB9CiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfY29weShwcm94eW9iamVjdCAqcHApCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHAtPmRpY3QsICJjb3B5IiwgTlVMTCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHAtPmRpY3QsICJjb3B5IiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBwcm94eV9tZXRob2RzW10gPSB7Ci0JeyJoYXNfa2V5IiwgICAoUHlDRnVuY3Rpb24pcHJveHlfaGFzX2tleSwgICAgTUVUSF9PLAotCSBQeURvY19TVFIoIkQuaGFzX2tleShrKSAtPiBUcnVlIGlmIEQgaGFzIGEga2V5IGssIGVsc2UgRmFsc2UiKX0sCi0JeyJnZXQiLCAgICAgICAoUHlDRnVuY3Rpb24pcHJveHlfZ2V0LCAgICAgICAgTUVUSF9WQVJBUkdTLAotCSBQeURvY19TVFIoIkQuZ2V0KGtbLGRdKSAtPiBEW2tdIGlmIEQuaGFzX2tleShrKSwgZWxzZSBkLiIKLQkgCQkJCSIgIGQgZGVmYXVsdHMgdG8gTm9uZS4iKX0sCi0JeyJrZXlzIiwgICAgICAoUHlDRnVuY3Rpb24pcHJveHlfa2V5cywgICAgICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiRC5rZXlzKCkgLT4gbGlzdCBvZiBEJ3Mga2V5cyIpfSwKLQl7InZhbHVlcyIsICAgIChQeUNGdW5jdGlvbilwcm94eV92YWx1ZXMsICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJELnZhbHVlcygpIC0+IGxpc3Qgb2YgRCdzIHZhbHVlcyIpfSwKLQl7Iml0ZW1zIiwgICAgIChQeUNGdW5jdGlvbilwcm94eV9pdGVtcywgICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJELml0ZW1zKCkgLT4gbGlzdCBvZiBEJ3MgKGtleSwgdmFsdWUpIHBhaXJzLCBhcyAyLXR1cGxlcyIpfSwKLQl7Iml0ZXJrZXlzIiwgIChQeUNGdW5jdGlvbilwcm94eV9pdGVya2V5cywgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJELml0ZXJrZXlzKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBEIil9LAotCXsiaXRlcnZhbHVlcyIsKFB5Q0Z1bmN0aW9uKXByb3h5X2l0ZXJ2YWx1ZXMsIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIkQuaXRlcnZhbHVlcygpIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBEIil9LAotCXsiaXRlcml0ZW1zIiwgKFB5Q0Z1bmN0aW9uKXByb3h5X2l0ZXJpdGVtcywgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIkQuaXRlcml0ZW1zKCkgLT4iCi0JIAkgICAiIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBpdGVtcyBvZiBEIil9LAotCXsiY29weSIsICAgICAgKFB5Q0Z1bmN0aW9uKXByb3h5X2NvcHksICAgICAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIEQiKX0sCi0JezB9CisgICAgeyJoYXNfa2V5IiwgICAoUHlDRnVuY3Rpb24pcHJveHlfaGFzX2tleSwgICAgTUVUSF9PLAorICAgICBQeURvY19TVFIoIkQuaGFzX2tleShrKSAtPiBUcnVlIGlmIEQgaGFzIGEga2V5IGssIGVsc2UgRmFsc2UiKX0sCisgICAgeyJnZXQiLCAgICAgICAoUHlDRnVuY3Rpb24pcHJveHlfZ2V0LCAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBQeURvY19TVFIoIkQuZ2V0KGtbLGRdKSAtPiBEW2tdIGlmIEQuaGFzX2tleShrKSwgZWxzZSBkLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGQgZGVmYXVsdHMgdG8gTm9uZS4iKX0sCisgICAgeyJrZXlzIiwgICAgICAoUHlDRnVuY3Rpb24pcHJveHlfa2V5cywgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiRC5rZXlzKCkgLT4gbGlzdCBvZiBEJ3Mga2V5cyIpfSwKKyAgICB7InZhbHVlcyIsICAgIChQeUNGdW5jdGlvbilwcm94eV92YWx1ZXMsICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJELnZhbHVlcygpIC0+IGxpc3Qgb2YgRCdzIHZhbHVlcyIpfSwKKyAgICB7Iml0ZW1zIiwgICAgIChQeUNGdW5jdGlvbilwcm94eV9pdGVtcywgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJELml0ZW1zKCkgLT4gbGlzdCBvZiBEJ3MgKGtleSwgdmFsdWUpIHBhaXJzLCBhcyAyLXR1cGxlcyIpfSwKKyAgICB7Iml0ZXJrZXlzIiwgIChQeUNGdW5jdGlvbilwcm94eV9pdGVya2V5cywgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJELml0ZXJrZXlzKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBEIil9LAorICAgIHsiaXRlcnZhbHVlcyIsKFB5Q0Z1bmN0aW9uKXByb3h5X2l0ZXJ2YWx1ZXMsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIkQuaXRlcnZhbHVlcygpIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBEIil9LAorICAgIHsiaXRlcml0ZW1zIiwgKFB5Q0Z1bmN0aW9uKXByb3h5X2l0ZXJpdGVtcywgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIkQuaXRlcml0ZW1zKCkgLT4iCisgICAgICAgICAgICAgICAiIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBpdGVtcyBvZiBEIil9LAorICAgIHsiY29weSIsICAgICAgKFB5Q0Z1bmN0aW9uKXByb3h5X2NvcHksICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIEQiKX0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgdm9pZAogcHJveHlfZGVhbGxvYyhwcm94eW9iamVjdCAqcHApCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0socHApOwotCVB5X0RFQ1JFRihwcC0+ZGljdCk7Ci0JUHlPYmplY3RfR0NfRGVsKHBwKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhwcCk7CisgICAgUHlfREVDUkVGKHBwLT5kaWN0KTsKKyAgICBQeU9iamVjdF9HQ19EZWwocHApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfZ2V0aXRlcihwcm94eW9iamVjdCAqcHApCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0dldEl0ZXIocHAtPmRpY3QpOworICAgIHJldHVybiBQeU9iamVjdF9HZXRJdGVyKHBwLT5kaWN0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X3N0cihwcm94eW9iamVjdCAqcHApCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X1N0cihwcC0+ZGljdCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X1N0cihwcC0+ZGljdCk7CiB9CiAKIHN0YXRpYyBpbnQKIHByb3h5X3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlwcm94eW9iamVjdCAqcHAgPSAocHJveHlvYmplY3QgKilzZWxmOwotCVB5X1ZJU0lUKHBwLT5kaWN0KTsKLQlyZXR1cm4gMDsKKyAgICBwcm94eW9iamVjdCAqcHAgPSAocHJveHlvYmplY3QgKilzZWxmOworICAgIFB5X1ZJU0lUKHBwLT5kaWN0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogcHJveHlfY29tcGFyZShwcm94eW9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0NvbXBhcmUodi0+ZGljdCwgdyk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NvbXBhcmUodi0+ZGljdCwgdyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9yaWNoY29tcGFyZShwcm94eW9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlyZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUodi0+ZGljdCwgdywgb3ApOworICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZSh2LT5kaWN0LCB3LCBvcCk7CiB9CiAKIFB5VHlwZU9iamVjdCBQeURpY3RQcm94eV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImRpY3Rwcm94eSIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YocHJveHlvYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcilwcm94eV9kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpcHJveHlfY29tcGFyZSwJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJnByb3h5X2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JJnByb3h5X2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpcHJveHlfc3RyLAkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotIAkwLAkJCQkJLyogdHBfZG9jICovCi0JcHJveHlfdHJhdmVyc2UsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0gCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylwcm94eV9yaWNoY29tcGFyZSwJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JKGdldGl0ZXJmdW5jKXByb3h5X2dldGl0ZXIsCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JcHJveHlfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImRpY3Rwcm94eSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHByb3h5b2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXByb3h5X2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYylwcm94eV9jb21wYXJlLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZwcm94eV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmcHJveHlfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpcHJveHlfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICBwcm94eV90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIChyaWNoY21wZnVuYylwcm94eV9yaWNoY29tcGFyZSwgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgKGdldGl0ZXJmdW5jKXByb3h5X2dldGl0ZXIsICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHByb3h5X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogfTsKIAogUHlPYmplY3QgKgogUHlEaWN0UHJveHlfTmV3KFB5T2JqZWN0ICpkaWN0KQogewotCXByb3h5b2JqZWN0ICpwcDsKKyAgICBwcm94eW9iamVjdCAqcHA7CiAKLQlwcCA9IFB5T2JqZWN0X0dDX05ldyhwcm94eW9iamVjdCwgJlB5RGljdFByb3h5X1R5cGUpOwotCWlmIChwcCAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihkaWN0KTsKLQkJcHAtPmRpY3QgPSBkaWN0OwotCQlfUHlPYmplY3RfR0NfVFJBQ0socHApOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcHA7CisgICAgcHAgPSBQeU9iamVjdF9HQ19OZXcocHJveHlvYmplY3QsICZQeURpY3RQcm94eV9UeXBlKTsKKyAgICBpZiAocHAgIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgICAgIHBwLT5kaWN0ID0gZGljdDsKKyAgICAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKHBwKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXBwOwogfQogCiAKQEAgLTg3OCwxODUgKzg3OCwxODUgQEAKICAgIGJpdCBvZiBhIHBhaW4gKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeVdyYXBwZXJEZXNjck9iamVjdCAqZGVzY3I7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5V3JhcHBlckRlc2NyT2JqZWN0ICpkZXNjcjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIH0gd3JhcHBlcm9iamVjdDsKIAogc3RhdGljIHZvaWQKIHdyYXBwZXJfZGVhbGxvYyh3cmFwcGVyb2JqZWN0ICp3cCkKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHdwKTsKLQlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHdwKQotCVB5X1hERUNSRUYod3AtPmRlc2NyKTsKLQlQeV9YREVDUkVGKHdwLT5zZWxmKTsKLQlQeU9iamVjdF9HQ19EZWwod3ApOwotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKHdwKQorICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sod3ApOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4od3ApCisgICAgUHlfWERFQ1JFRih3cC0+ZGVzY3IpOworICAgIFB5X1hERUNSRUYod3AtPnNlbGYpOworICAgIFB5T2JqZWN0X0dDX0RlbCh3cCk7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQod3ApCiB9CiAKIHN0YXRpYyBpbnQKIHdyYXBwZXJfY29tcGFyZSh3cmFwcGVyb2JqZWN0ICphLCB3cmFwcGVyb2JqZWN0ICpiKQogewotCWlmIChhLT5kZXNjciA9PSBiLT5kZXNjcikKLQkJcmV0dXJuIFB5T2JqZWN0X0NvbXBhcmUoYS0+c2VsZiwgYi0+c2VsZik7Ci0JZWxzZQotCQlyZXR1cm4gKGEtPmRlc2NyIDwgYi0+ZGVzY3IpID8gLTEgOiAxOworICAgIGlmIChhLT5kZXNjciA9PSBiLT5kZXNjcikKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NvbXBhcmUoYS0+c2VsZiwgYi0+c2VsZik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gKGEtPmRlc2NyIDwgYi0+ZGVzY3IpID8gLTEgOiAxOwogfQogCiBzdGF0aWMgbG9uZwogd3JhcHBlcl9oYXNoKHdyYXBwZXJvYmplY3QgKndwKQogewotCWludCB4LCB5OwotCXggPSBfUHlfSGFzaFBvaW50ZXIod3AtPmRlc2NyKTsKLQlpZiAoeCA9PSAtMSkKLQkJcmV0dXJuIC0xOwotCXkgPSBQeU9iamVjdF9IYXNoKHdwLT5zZWxmKTsKLQlpZiAoeSA9PSAtMSkKLQkJcmV0dXJuIC0xOwotCXggPSB4IF4geTsKLQlpZiAoeCA9PSAtMSkKLQkJeCA9IC0yOwotCXJldHVybiB4OworICAgIGludCB4LCB5OworICAgIHggPSBfUHlfSGFzaFBvaW50ZXIod3AtPmRlc2NyKTsKKyAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHkgPSBQeU9iamVjdF9IYXNoKHdwLT5zZWxmKTsKKyAgICBpZiAoeSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHggPSB4IF4geTsKKyAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgeCA9IC0yOworICAgIHJldHVybiB4OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcHBlcl9yZXByKHdyYXBwZXJvYmplY3QgKndwKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8bWV0aG9kLXdyYXBwZXIgJyVzJyBvZiAlcyBvYmplY3QgYXQgJXA+IiwKLQkJCQkgICB3cC0+ZGVzY3ItPmRfYmFzZS0+bmFtZSwKLQkJCQkgICB3cC0+c2VsZi0+b2JfdHlwZS0+dHBfbmFtZSwKLQkJCQkgICB3cC0+c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxtZXRob2Qtd3JhcHBlciAnJXMnIG9mICVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwLT5kZXNjci0+ZF9iYXNlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwLT5zZWxmLT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwLT5zZWxmKTsKIH0KIAogc3RhdGljIFB5TWVtYmVyRGVmIHdyYXBwZXJfbWVtYmVyc1tdID0gewotCXsiX19zZWxmX18iLCBUX09CSkVDVCwgb2Zmc2V0b2Yod3JhcHBlcm9iamVjdCwgc2VsZiksIFJFQURPTkxZfSwKLQl7MH0KKyAgICB7Il9fc2VsZl9fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHdyYXBwZXJvYmplY3QsIHNlbGYpLCBSRUFET05MWX0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcHBlcl9vYmpjbGFzcyh3cmFwcGVyb2JqZWN0ICp3cCkKIHsKLQlQeU9iamVjdCAqYyA9IChQeU9iamVjdCAqKXdwLT5kZXNjci0+ZF90eXBlOworICAgIFB5T2JqZWN0ICpjID0gKFB5T2JqZWN0ICopd3AtPmRlc2NyLT5kX3R5cGU7CiAKLQlQeV9JTkNSRUYoYyk7Ci0JcmV0dXJuIGM7CisgICAgUHlfSU5DUkVGKGMpOworICAgIHJldHVybiBjOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcHBlcl9uYW1lKHdyYXBwZXJvYmplY3QgKndwKQogewotCWNoYXIgKnMgPSB3cC0+ZGVzY3ItPmRfYmFzZS0+bmFtZTsKKyAgICBjaGFyICpzID0gd3AtPmRlc2NyLT5kX2Jhc2UtPm5hbWU7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBwZXJfZG9jKHdyYXBwZXJvYmplY3QgKndwKQogewotCWNoYXIgKnMgPSB3cC0+ZGVzY3ItPmRfYmFzZS0+ZG9jOworICAgIGNoYXIgKnMgPSB3cC0+ZGVzY3ItPmRfYmFzZS0+ZG9jOwogCi0JaWYgKHMgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7Ci0JfQorICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOworICAgIH0KIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIHdyYXBwZXJfZ2V0c2V0c1tdID0gewotCXsiX19vYmpjbGFzc19fIiwgKGdldHRlcil3cmFwcGVyX29iamNsYXNzfSwKLQl7Il9fbmFtZV9fIiwgKGdldHRlcil3cmFwcGVyX25hbWV9LAotCXsiX19kb2NfXyIsIChnZXR0ZXIpd3JhcHBlcl9kb2N9LAotCXswfQorICAgIHsiX19vYmpjbGFzc19fIiwgKGdldHRlcil3cmFwcGVyX29iamNsYXNzfSwKKyAgICB7Il9fbmFtZV9fIiwgKGdldHRlcil3cmFwcGVyX25hbWV9LAorICAgIHsiX19kb2NfXyIsIChnZXR0ZXIpd3JhcHBlcl9kb2N9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBwZXJfY2FsbCh3cmFwcGVyb2JqZWN0ICp3cCwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXdyYXBwZXJmdW5jIHdyYXBwZXIgPSB3cC0+ZGVzY3ItPmRfYmFzZS0+d3JhcHBlcjsKLQlQeU9iamVjdCAqc2VsZiA9IHdwLT5zZWxmOworICAgIHdyYXBwZXJmdW5jIHdyYXBwZXIgPSB3cC0+ZGVzY3ItPmRfYmFzZS0+d3JhcHBlcjsKKyAgICBQeU9iamVjdCAqc2VsZiA9IHdwLT5zZWxmOwogCi0JaWYgKHdwLT5kZXNjci0+ZF9iYXNlLT5mbGFncyAmIFB5V3JhcHBlckZsYWdfS0VZV09SRFMpIHsKLQkJd3JhcHBlcmZ1bmNfa3dkcyB3ayA9ICh3cmFwcGVyZnVuY19rd2RzKXdyYXBwZXI7Ci0JCXJldHVybiAoKndrKShzZWxmLCBhcmdzLCB3cC0+ZGVzY3ItPmRfd3JhcHBlZCwga3dkcyk7Ci0JfQorICAgIGlmICh3cC0+ZGVzY3ItPmRfYmFzZS0+ZmxhZ3MgJiBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSB7CisgICAgICAgIHdyYXBwZXJmdW5jX2t3ZHMgd2sgPSAod3JhcHBlcmZ1bmNfa3dkcyl3cmFwcGVyOworICAgICAgICByZXR1cm4gKCp3aykoc2VsZiwgYXJncywgd3AtPmRlc2NyLT5kX3dyYXBwZWQsIGt3ZHMpOworICAgIH0KIAotCWlmIChrd2RzICE9IE5VTEwgJiYgKCFQeURpY3RfQ2hlY2soa3dkcykgfHwgUHlEaWN0X1NpemUoa3dkcykgIT0gMCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIndyYXBwZXIgJXMgZG9lc24ndCB0YWtlIGtleXdvcmQgYXJndW1lbnRzIiwKLQkJCSAgICAgd3AtPmRlc2NyLT5kX2Jhc2UtPm5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgqd3JhcHBlcikoc2VsZiwgYXJncywgd3AtPmRlc2NyLT5kX3dyYXBwZWQpOworICAgIGlmIChrd2RzICE9IE5VTEwgJiYgKCFQeURpY3RfQ2hlY2soa3dkcykgfHwgUHlEaWN0X1NpemUoa3dkcykgIT0gMCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ3cmFwcGVyICVzIGRvZXNuJ3QgdGFrZSBrZXl3b3JkIGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICB3cC0+ZGVzY3ItPmRfYmFzZS0+bmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKCp3cmFwcGVyKShzZWxmLCBhcmdzLCB3cC0+ZGVzY3ItPmRfd3JhcHBlZCk7CiB9CiAKIHN0YXRpYyBpbnQKIHdyYXBwZXJfdHJhdmVyc2UoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCXdyYXBwZXJvYmplY3QgKndwID0gKHdyYXBwZXJvYmplY3QgKilzZWxmOwotCVB5X1ZJU0lUKHdwLT5kZXNjcik7Ci0JUHlfVklTSVQod3AtPnNlbGYpOwotCXJldHVybiAwOworICAgIHdyYXBwZXJvYmplY3QgKndwID0gKHdyYXBwZXJvYmplY3QgKilzZWxmOworICAgIFB5X1ZJU0lUKHdwLT5kZXNjcik7CisgICAgUHlfVklTSVQod3AtPnNlbGYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHdyYXBwZXJ0eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JIm1ldGhvZC13cmFwcGVyIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHdyYXBwZXJvYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcil3cmFwcGVyX2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkoY21wZnVuYyl3cmFwcGVyX2NvbXBhcmUsCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKXdyYXBwZXJfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkgICAgICAgCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYyl3cmFwcGVyX2hhc2gsCQkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYyl3cmFwcGVyX2NhbGwsCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotIAkwLAkJCQkJLyogdHBfZG9jICovCi0Jd3JhcHBlcl90cmF2ZXJzZSwJCQkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0Jd3JhcHBlcl9tZW1iZXJzLAkJCS8qIHRwX21lbWJlcnMgKi8KLQl3cmFwcGVyX2dldHNldHMsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAibWV0aG9kLXdyYXBwZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2Yod3JhcHBlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3Ipd3JhcHBlcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIChjbXBmdW5jKXdyYXBwZXJfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyl3cmFwcGVyX3JlcHIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYyl3cmFwcGVyX2hhc2gsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYyl3cmFwcGVyX2NhbGwsICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIHdyYXBwZXJfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgd3JhcHBlcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgd3JhcHBlcl9nZXRzZXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCiB9OwogCiBQeU9iamVjdCAqCiBQeVdyYXBwZXJfTmV3KFB5T2JqZWN0ICpkLCBQeU9iamVjdCAqc2VsZikKIHsKLQl3cmFwcGVyb2JqZWN0ICp3cDsKLQlQeVdyYXBwZXJEZXNjck9iamVjdCAqZGVzY3I7CisgICAgd3JhcHBlcm9iamVjdCAqd3A7CisgICAgUHlXcmFwcGVyRGVzY3JPYmplY3QgKmRlc2NyOwogCi0JYXNzZXJ0KFB5T2JqZWN0X1R5cGVDaGVjayhkLCAmUHlXcmFwcGVyRGVzY3JfVHlwZSkpOwotCWRlc2NyID0gKFB5V3JhcHBlckRlc2NyT2JqZWN0ICopZDsKLQlhc3NlcnQoUHlPYmplY3RfSXNJbnN0YW5jZShzZWxmLCAoUHlPYmplY3QgKikoZGVzY3ItPmRfdHlwZSkpKTsKKyAgICBhc3NlcnQoUHlPYmplY3RfVHlwZUNoZWNrKGQsICZQeVdyYXBwZXJEZXNjcl9UeXBlKSk7CisgICAgZGVzY3IgPSAoUHlXcmFwcGVyRGVzY3JPYmplY3QgKilkOworICAgIGFzc2VydChQeU9iamVjdF9Jc0luc3RhbmNlKHNlbGYsIChQeU9iamVjdCAqKShkZXNjci0+ZF90eXBlKSkpOwogCi0Jd3AgPSBQeU9iamVjdF9HQ19OZXcod3JhcHBlcm9iamVjdCwgJndyYXBwZXJ0eXBlKTsKLQlpZiAod3AgIT0gTlVMTCkgewotCQlQeV9JTkNSRUYoZGVzY3IpOwotCQl3cC0+ZGVzY3IgPSBkZXNjcjsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQl3cC0+c2VsZiA9IHNlbGY7Ci0JCV9QeU9iamVjdF9HQ19UUkFDSyh3cCk7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKil3cDsKKyAgICB3cCA9IFB5T2JqZWN0X0dDX05ldyh3cmFwcGVyb2JqZWN0LCAmd3JhcHBlcnR5cGUpOworICAgIGlmICh3cCAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihkZXNjcik7CisgICAgICAgIHdwLT5kZXNjciA9IGRlc2NyOworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHdwLT5zZWxmID0gc2VsZjsKKyAgICAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKHdwKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXdwOwogfQogCiAKQEAgLTEwNjUsMjQ3ICsxMDY1LDI0NyBAQAogLyoKICAgICBjbGFzcyBwcm9wZXJ0eShvYmplY3QpOgogCi0gICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmZ2V0PU5vbmUsIGZzZXQ9Tm9uZSwgZmRlbD1Ob25lLCBkb2M9Tm9uZSk6Ci0gICAgICAgICAgICBpZiBkb2MgaXMgTm9uZSBhbmQgZmdldCBpcyBub3QgTm9uZSBhbmQgaGFzYXR0cihmZ2V0LCAiX19kb2NfXyIpOgotICAgICAgICAgICAgICAgIGRvYyA9IGZnZXQuX19kb2NfXwotICAgICAgICAgICAgc2VsZi5fX2dldCA9IGZnZXQKLSAgICAgICAgICAgIHNlbGYuX19zZXQgPSBmc2V0Ci0gICAgICAgICAgICBzZWxmLl9fZGVsID0gZmRlbAotICAgICAgICAgICAgc2VsZi5fX2RvY19fID0gZG9jCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZnZXQ9Tm9uZSwgZnNldD1Ob25lLCBmZGVsPU5vbmUsIGRvYz1Ob25lKToKKyAgICAgICAgaWYgZG9jIGlzIE5vbmUgYW5kIGZnZXQgaXMgbm90IE5vbmUgYW5kIGhhc2F0dHIoZmdldCwgIl9fZG9jX18iKToKKyAgICAgICAgZG9jID0gZmdldC5fX2RvY19fCisgICAgICAgIHNlbGYuX19nZXQgPSBmZ2V0CisgICAgICAgIHNlbGYuX19zZXQgPSBmc2V0CisgICAgICAgIHNlbGYuX19kZWwgPSBmZGVsCisgICAgICAgIHNlbGYuX19kb2NfXyA9IGRvYwogCi0gICAgICAgIGRlZiBfX2dldF9fKHNlbGYsIGluc3QsIHR5cGU9Tm9uZSk6Ci0gICAgICAgICAgICBpZiBpbnN0IGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKLSAgICAgICAgICAgIGlmIHNlbGYuX19nZXQgaXMgTm9uZToKLSAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgInVucmVhZGFibGUgYXR0cmlidXRlIgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19nZXQoaW5zdCkKKyAgICBkZWYgX19nZXRfXyhzZWxmLCBpbnN0LCB0eXBlPU5vbmUpOgorICAgICAgICBpZiBpbnN0IGlzIE5vbmU6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGlmIHNlbGYuX19nZXQgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICJ1bnJlYWRhYmxlIGF0dHJpYnV0ZSIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19nZXQoaW5zdCkKIAotICAgICAgICBkZWYgX19zZXRfXyhzZWxmLCBpbnN0LCB2YWx1ZSk6Ci0gICAgICAgICAgICBpZiBzZWxmLl9fc2V0IGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICJjYW4ndCBzZXQgYXR0cmlidXRlIgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19zZXQoaW5zdCwgdmFsdWUpCisgICAgZGVmIF9fc2V0X18oc2VsZiwgaW5zdCwgdmFsdWUpOgorICAgICAgICBpZiBzZWxmLl9fc2V0IGlzIE5vbmU6CisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCAiY2FuJ3Qgc2V0IGF0dHJpYnV0ZSIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19zZXQoaW5zdCwgdmFsdWUpCiAKLSAgICAgICAgZGVmIF9fZGVsZXRlX18oc2VsZiwgaW5zdCk6Ci0gICAgICAgICAgICBpZiBzZWxmLl9fZGVsIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZWwoaW5zdCkKKyAgICBkZWYgX19kZWxldGVfXyhzZWxmLCBpbnN0KToKKyAgICAgICAgaWYgc2VsZi5fX2RlbCBpcyBOb25lOgorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiCisgICAgICAgIHJldHVybiBzZWxmLl9fZGVsKGluc3QpCiAKICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKnByb3BfZ2V0OwotCVB5T2JqZWN0ICpwcm9wX3NldDsKLQlQeU9iamVjdCAqcHJvcF9kZWw7Ci0JUHlPYmplY3QgKnByb3BfZG9jOwotCWludCBnZXR0ZXJfZG9jOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqcHJvcF9nZXQ7CisgICAgUHlPYmplY3QgKnByb3Bfc2V0OworICAgIFB5T2JqZWN0ICpwcm9wX2RlbDsKKyAgICBQeU9iamVjdCAqcHJvcF9kb2M7CisgICAgaW50IGdldHRlcl9kb2M7CiB9IHByb3BlcnR5b2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKiBwcm9wZXJ0eV9jb3B5KFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCi0JCQkJICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIAogc3RhdGljIFB5TWVtYmVyRGVmIHByb3BlcnR5X21lbWJlcnNbXSA9IHsKLQl7ImZnZXQiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHJvcGVydHlvYmplY3QsIHByb3BfZ2V0KSwgUkVBRE9OTFl9LAotCXsiZnNldCIsIFRfT0JKRUNULCBvZmZzZXRvZihwcm9wZXJ0eW9iamVjdCwgcHJvcF9zZXQpLCBSRUFET05MWX0sCi0JeyJmZGVsIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHByb3BlcnR5b2JqZWN0LCBwcm9wX2RlbCksIFJFQURPTkxZfSwKLQl7Il9fZG9jX18iLCAgVF9PQkpFQ1QsIG9mZnNldG9mKHByb3BlcnR5b2JqZWN0LCBwcm9wX2RvYyksIFJFQURPTkxZfSwKLQl7MH0KKyAgICB7ImZnZXQiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHJvcGVydHlvYmplY3QsIHByb3BfZ2V0KSwgUkVBRE9OTFl9LAorICAgIHsiZnNldCIsIFRfT0JKRUNULCBvZmZzZXRvZihwcm9wZXJ0eW9iamVjdCwgcHJvcF9zZXQpLCBSRUFET05MWX0sCisgICAgeyJmZGVsIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHByb3BlcnR5b2JqZWN0LCBwcm9wX2RlbCksIFJFQURPTkxZfSwKKyAgICB7Il9fZG9jX18iLCAgVF9PQkpFQ1QsIG9mZnNldG9mKHByb3BlcnR5b2JqZWN0LCBwcm9wX2RvYyksIFJFQURPTkxZfSwKKyAgICB7MH0KIH07CiAKIAogUHlEb2NfU1RSVkFSKGdldHRlcl9kb2MsCi0JICAgICAiRGVzY3JpcHRvciB0byBjaGFuZ2UgdGhlIGdldHRlciBvbiBhIHByb3BlcnR5LiIpOworICAgICAgICAgICAgICJEZXNjcmlwdG9yIHRvIGNoYW5nZSB0aGUgZ2V0dGVyIG9uIGEgcHJvcGVydHkuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm9wZXJ0eV9nZXR0ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpnZXR0ZXIpCiB7Ci0JcmV0dXJuIHByb3BlcnR5X2NvcHkoc2VsZiwgZ2V0dGVyLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICByZXR1cm4gcHJvcGVydHlfY29weShzZWxmLCBnZXR0ZXIsIE5VTEwsIE5VTEwsIE5VTEwpOwogfQogCiAKIFB5RG9jX1NUUlZBUihzZXR0ZXJfZG9jLAotCSAgICAgIkRlc2NyaXB0b3IgdG8gY2hhbmdlIHRoZSBzZXR0ZXIgb24gYSBwcm9wZXJ0eS4iKTsKKyAgICAgICAgICAgICAiRGVzY3JpcHRvciB0byBjaGFuZ2UgdGhlIHNldHRlciBvbiBhIHByb3BlcnR5LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJvcGVydHlfc2V0dGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2V0dGVyKQogewotCXJldHVybiBwcm9wZXJ0eV9jb3B5KHNlbGYsIE5VTEwsIHNldHRlciwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIHByb3BlcnR5X2NvcHkoc2VsZiwgTlVMTCwgc2V0dGVyLCBOVUxMLCBOVUxMKTsKIH0KIAogCiBQeURvY19TVFJWQVIoZGVsZXRlcl9kb2MsCi0JICAgICAiRGVzY3JpcHRvciB0byBjaGFuZ2UgdGhlIGRlbGV0ZXIgb24gYSBwcm9wZXJ0eS4iKTsKKyAgICAgICAgICAgICAiRGVzY3JpcHRvciB0byBjaGFuZ2UgdGhlIGRlbGV0ZXIgb24gYSBwcm9wZXJ0eS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3BlcnR5X2RlbGV0ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpkZWxldGVyKQogewotCXJldHVybiBwcm9wZXJ0eV9jb3B5KHNlbGYsIE5VTEwsIE5VTEwsIGRlbGV0ZXIsIE5VTEwpOworICAgIHJldHVybiBwcm9wZXJ0eV9jb3B5KHNlbGYsIE5VTEwsIE5VTEwsIGRlbGV0ZXIsIE5VTEwpOwogfQogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBwcm9wZXJ0eV9tZXRob2RzW10gPSB7Ci0JeyJnZXR0ZXIiLCBwcm9wZXJ0eV9nZXR0ZXIsIE1FVEhfTywgZ2V0dGVyX2RvY30sCi0JeyJzZXR0ZXIiLCBwcm9wZXJ0eV9zZXR0ZXIsIE1FVEhfTywgc2V0dGVyX2RvY30sCi0JeyJkZWxldGVyIiwgcHJvcGVydHlfZGVsZXRlciwgTUVUSF9PLCBkZWxldGVyX2RvY30sCi0JezB9CisgICAgeyJnZXR0ZXIiLCBwcm9wZXJ0eV9nZXR0ZXIsIE1FVEhfTywgZ2V0dGVyX2RvY30sCisgICAgeyJzZXR0ZXIiLCBwcm9wZXJ0eV9zZXR0ZXIsIE1FVEhfTywgc2V0dGVyX2RvY30sCisgICAgeyJkZWxldGVyIiwgcHJvcGVydHlfZGVsZXRlciwgTUVUSF9PLCBkZWxldGVyX2RvY30sCisgICAgezB9CiB9OwogCiAKIHN0YXRpYyB2b2lkCiBwcm9wZXJ0eV9kZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCXByb3BlcnR5b2JqZWN0ICpncyA9IChwcm9wZXJ0eW9iamVjdCAqKXNlbGY7CisgICAgcHJvcGVydHlvYmplY3QgKmdzID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKIAotCV9QeU9iamVjdF9HQ19VTlRSQUNLKHNlbGYpOwotCVB5X1hERUNSRUYoZ3MtPnByb3BfZ2V0KTsKLQlQeV9YREVDUkVGKGdzLT5wcm9wX3NldCk7Ci0JUHlfWERFQ1JFRihncy0+cHJvcF9kZWwpOwotCVB5X1hERUNSRUYoZ3MtPnByb3BfZG9jKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKHNlbGYpOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKHNlbGYpOworICAgIFB5X1hERUNSRUYoZ3MtPnByb3BfZ2V0KTsKKyAgICBQeV9YREVDUkVGKGdzLT5wcm9wX3NldCk7CisgICAgUHlfWERFQ1JFRihncy0+cHJvcF9kZWwpOworICAgIFB5X1hERUNSRUYoZ3MtPnByb3BfZG9jKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJvcGVydHlfZGVzY3JfZ2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdHlwZSkKIHsKLQlwcm9wZXJ0eW9iamVjdCAqZ3MgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOworICAgIHByb3BlcnR5b2JqZWN0ICpncyA9IChwcm9wZXJ0eW9iamVjdCAqKXNlbGY7CiAKLQlpZiAob2JqID09IE5VTEwgfHwgb2JqID09IFB5X05vbmUpIHsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gc2VsZjsKLQl9Ci0JaWYgKGdzLT5wcm9wX2dldCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgInVucmVhZGFibGUgYXR0cmlidXRlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGdzLT5wcm9wX2dldCwgIihPKSIsIG9iaik7CisgICAgaWYgKG9iaiA9PSBOVUxMIHx8IG9iaiA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorICAgIGlmIChncy0+cHJvcF9nZXQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJ1bnJlYWRhYmxlIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihncy0+cHJvcF9nZXQsICIoTykiLCBvYmopOwogfQogCiBzdGF0aWMgaW50CiBwcm9wZXJ0eV9kZXNjcl9zZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlwcm9wZXJ0eW9iamVjdCAqZ3MgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOwotCVB5T2JqZWN0ICpmdW5jLCAqcmVzOworICAgIHByb3BlcnR5b2JqZWN0ICpncyA9IChwcm9wZXJ0eW9iamVjdCAqKXNlbGY7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXM7CiAKLQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJZnVuYyA9IGdzLT5wcm9wX2RlbDsKLQllbHNlCi0JCWZ1bmMgPSBncy0+cHJvcF9zZXQ7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJdmFsdWUgPT0gTlVMTCA/Ci0JCQkJImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiIDoKLQkJCQkiY2FuJ3Qgc2V0IGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICh2YWx1ZSA9PSBOVUxMKQotCQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuYywgIihPKSIsIG9iaik7Ci0JZWxzZQotCQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuYywgIihPTykiLCBvYmosIHZhbHVlKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZnVuYyA9IGdzLT5wcm9wX2RlbDsKKyAgICBlbHNlCisgICAgICAgIGZ1bmMgPSBncy0+cHJvcF9zZXQ7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9PSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIiA6CisgICAgICAgICAgICAgICAgImNhbid0IHNldCBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsICIoTykiLCBvYmopOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsICIoT08pIiwgb2JqLCB2YWx1ZSk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm9wZXJ0eV9jb3B5KFB5T2JqZWN0ICpvbGQsIFB5T2JqZWN0ICpnZXQsIFB5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICpkZWwsCi0JCVB5T2JqZWN0ICpkb2MpCisgICAgICAgICAgICAgICAgUHlPYmplY3QgKmRvYykKIHsKLQlwcm9wZXJ0eW9iamVjdCAqcG9sZCA9IChwcm9wZXJ0eW9iamVjdCAqKW9sZDsKLQlQeU9iamVjdCAqbmV3LCAqdHlwZTsKKyAgICBwcm9wZXJ0eW9iamVjdCAqcG9sZCA9IChwcm9wZXJ0eW9iamVjdCAqKW9sZDsKKyAgICBQeU9iamVjdCAqbmV3LCAqdHlwZTsKIAotCXR5cGUgPSBQeU9iamVjdF9UeXBlKG9sZCk7Ci0JaWYgKHR5cGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgdHlwZSA9IFB5T2JqZWN0X1R5cGUob2xkKTsKKyAgICBpZiAodHlwZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChnZXQgPT0gTlVMTCB8fCBnZXQgPT0gUHlfTm9uZSkgewotCQlQeV9YREVDUkVGKGdldCk7Ci0JCWdldCA9IHBvbGQtPnByb3BfZ2V0ID8gcG9sZC0+cHJvcF9nZXQgOiBQeV9Ob25lOwotCX0KLQlpZiAoc2V0ID09IE5VTEwgfHwgc2V0ID09IFB5X05vbmUpIHsKLQkJUHlfWERFQ1JFRihzZXQpOwotCQlzZXQgPSBwb2xkLT5wcm9wX3NldCA/IHBvbGQtPnByb3Bfc2V0IDogUHlfTm9uZTsKLQl9Ci0JaWYgKGRlbCA9PSBOVUxMIHx8IGRlbCA9PSBQeV9Ob25lKSB7Ci0JCVB5X1hERUNSRUYoZGVsKTsKLQkJZGVsID0gcG9sZC0+cHJvcF9kZWwgPyBwb2xkLT5wcm9wX2RlbCA6IFB5X05vbmU7Ci0JfQotCWlmIChkb2MgPT0gTlVMTCB8fCBkb2MgPT0gUHlfTm9uZSkgewotCQlQeV9YREVDUkVGKGRvYyk7Ci0JCWlmIChwb2xkLT5nZXR0ZXJfZG9jICYmIGdldCAhPSBQeV9Ob25lKSB7Ci0JCQkvKiBtYWtlIF9pbml0IHVzZSBfX2RvY19fIGZyb20gZ2V0dGVyICovCi0JCQlkb2MgPSBQeV9Ob25lOwotCQl9Ci0JCWVsc2UgewotCQkJZG9jID0gcG9sZC0+cHJvcF9kb2MgPyBwb2xkLT5wcm9wX2RvYyA6IFB5X05vbmU7Ci0JCX0KLQl9CisgICAgaWYgKGdldCA9PSBOVUxMIHx8IGdldCA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X1hERUNSRUYoZ2V0KTsKKyAgICAgICAgZ2V0ID0gcG9sZC0+cHJvcF9nZXQgPyBwb2xkLT5wcm9wX2dldCA6IFB5X05vbmU7CisgICAgfQorICAgIGlmIChzZXQgPT0gTlVMTCB8fCBzZXQgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9YREVDUkVGKHNldCk7CisgICAgICAgIHNldCA9IHBvbGQtPnByb3Bfc2V0ID8gcG9sZC0+cHJvcF9zZXQgOiBQeV9Ob25lOworICAgIH0KKyAgICBpZiAoZGVsID09IE5VTEwgfHwgZGVsID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfWERFQ1JFRihkZWwpOworICAgICAgICBkZWwgPSBwb2xkLT5wcm9wX2RlbCA/IHBvbGQtPnByb3BfZGVsIDogUHlfTm9uZTsKKyAgICB9CisgICAgaWYgKGRvYyA9PSBOVUxMIHx8IGRvYyA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X1hERUNSRUYoZG9jKTsKKyAgICAgICAgaWYgKHBvbGQtPmdldHRlcl9kb2MgJiYgZ2V0ICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIC8qIG1ha2UgX2luaXQgdXNlIF9fZG9jX18gZnJvbSBnZXR0ZXIgKi8KKyAgICAgICAgICAgIGRvYyA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkb2MgPSBwb2xkLT5wcm9wX2RvYyA/IHBvbGQtPnByb3BfZG9jIDogUHlfTm9uZTsKKyAgICAgICAgfQorICAgIH0KIAotCW5ldyA9ICBQeU9iamVjdF9DYWxsRnVuY3Rpb24odHlwZSwgIk9PT08iLCBnZXQsIHNldCwgZGVsLCBkb2MpOwotCVB5X0RFQ1JFRih0eXBlKTsKLQlpZiAobmV3ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBuZXc7CisgICAgbmV3ID0gIFB5T2JqZWN0X0NhbGxGdW5jdGlvbih0eXBlLCAiT09PTyIsIGdldCwgc2V0LCBkZWwsIGRvYyk7CisgICAgUHlfREVDUkVGKHR5cGUpOworICAgIGlmIChuZXcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG5ldzsKIH0KIAogc3RhdGljIGludAogcHJvcGVydHlfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpnZXQgPSBOVUxMLCAqc2V0ID0gTlVMTCwgKmRlbCA9IE5VTEwsICpkb2MgPSBOVUxMOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmdldCIsICJmc2V0IiwgImZkZWwiLCAiZG9jIiwgMH07Ci0JcHJvcGVydHlvYmplY3QgKnByb3AgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T09PTzpwcm9wZXJ0eSIsCi0JCQkJCSBrd2xpc3QsICZnZXQsICZzZXQsICZkZWwsICZkb2MpKQotCQlyZXR1cm4gLTE7CisgICAgUHlPYmplY3QgKmdldCA9IE5VTEwsICpzZXQgPSBOVUxMLCAqZGVsID0gTlVMTCwgKmRvYyA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmZ2V0IiwgImZzZXQiLCAiZmRlbCIsICJkb2MiLCAwfTsKKyAgICBwcm9wZXJ0eW9iamVjdCAqcHJvcCA9IChwcm9wZXJ0eW9iamVjdCAqKXNlbGY7CiAKLQlpZiAoZ2V0ID09IFB5X05vbmUpCi0JCWdldCA9IE5VTEw7Ci0JaWYgKHNldCA9PSBQeV9Ob25lKQotCQlzZXQgPSBOVUxMOwotCWlmIChkZWwgPT0gUHlfTm9uZSkKLQkJZGVsID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9PT086cHJvcGVydHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmdldCwgJnNldCwgJmRlbCwgJmRvYykpCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X1hJTkNSRUYoZ2V0KTsKLQlQeV9YSU5DUkVGKHNldCk7Ci0JUHlfWElOQ1JFRihkZWwpOwotCVB5X1hJTkNSRUYoZG9jKTsKKyAgICBpZiAoZ2V0ID09IFB5X05vbmUpCisgICAgICAgIGdldCA9IE5VTEw7CisgICAgaWYgKHNldCA9PSBQeV9Ob25lKQorICAgICAgICBzZXQgPSBOVUxMOworICAgIGlmIChkZWwgPT0gUHlfTm9uZSkKKyAgICAgICAgZGVsID0gTlVMTDsKIAotCXByb3AtPnByb3BfZ2V0ID0gZ2V0OwotCXByb3AtPnByb3Bfc2V0ID0gc2V0OwotCXByb3AtPnByb3BfZGVsID0gZGVsOwotCXByb3AtPnByb3BfZG9jID0gZG9jOwotCXByb3AtPmdldHRlcl9kb2MgPSAwOworICAgIFB5X1hJTkNSRUYoZ2V0KTsKKyAgICBQeV9YSU5DUkVGKHNldCk7CisgICAgUHlfWElOQ1JFRihkZWwpOworICAgIFB5X1hJTkNSRUYoZG9jKTsKIAotCS8qIGlmIG5vIGRvY3N0cmluZyBnaXZlbiBhbmQgdGhlIGdldHRlciBoYXMgb25lLCB1c2UgdGhhdCBvbmUgKi8KLQlpZiAoKGRvYyA9PSBOVUxMIHx8IGRvYyA9PSBQeV9Ob25lKSAmJiBnZXQgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqZ2V0X2RvYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZ2V0LCAiX19kb2NfXyIpOwotCQlpZiAoZ2V0X2RvYykgewotCQkJaWYgKFB5X1RZUEUoc2VsZikgPT0gJlB5UHJvcGVydHlfVHlwZSkgewotCQkJCVB5X1hERUNSRUYocHJvcC0+cHJvcF9kb2MpOwotCQkJCXByb3AtPnByb3BfZG9jID0gZ2V0X2RvYzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIElmIHRoaXMgaXMgYSBwcm9wZXJ0eSBzdWJjbGFzcywgcHV0IF9fZG9jX18KLQkJCQlpbiBkaWN0IG9mIHRoZSBzdWJjbGFzcyBpbnN0YW5jZSBpbnN0ZWFkLAotCQkJCW90aGVyd2lzZSBpdCBnZXRzIHNoYWRvd2VkIGJ5IF9fZG9jX18gaW4gdGhlCi0JCQkJY2xhc3MncyBkaWN0LiAqLwotCQkJCWludCBlcnIgPSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJfX2RvY19fIiwgZ2V0X2RvYyk7Ci0JCQkJUHlfREVDUkVGKGdldF9kb2MpOwotCQkJCWlmIChlcnIgPCAwKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlwcm9wLT5nZXR0ZXJfZG9jID0gMTsKLQkJfQotCQllbHNlIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0V4Y2VwdGlvbikpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgcHJvcC0+cHJvcF9nZXQgPSBnZXQ7CisgICAgcHJvcC0+cHJvcF9zZXQgPSBzZXQ7CisgICAgcHJvcC0+cHJvcF9kZWwgPSBkZWw7CisgICAgcHJvcC0+cHJvcF9kb2MgPSBkb2M7CisgICAgcHJvcC0+Z2V0dGVyX2RvYyA9IDA7CiAKLQlyZXR1cm4gMDsKKyAgICAvKiBpZiBubyBkb2NzdHJpbmcgZ2l2ZW4gYW5kIHRoZSBnZXR0ZXIgaGFzIG9uZSwgdXNlIHRoYXQgb25lICovCisgICAgaWYgKChkb2MgPT0gTlVMTCB8fCBkb2MgPT0gUHlfTm9uZSkgJiYgZ2V0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmdldF9kb2MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGdldCwgIl9fZG9jX18iKTsKKyAgICAgICAgaWYgKGdldF9kb2MpIHsKKyAgICAgICAgICAgIGlmIChQeV9UWVBFKHNlbGYpID09ICZQeVByb3BlcnR5X1R5cGUpIHsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHByb3AtPnByb3BfZG9jKTsKKyAgICAgICAgICAgICAgICBwcm9wLT5wcm9wX2RvYyA9IGdldF9kb2M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGlzIGlzIGEgcHJvcGVydHkgc3ViY2xhc3MsIHB1dCBfX2RvY19fCisgICAgICAgICAgICAgICAgaW4gZGljdCBvZiB0aGUgc3ViY2xhc3MgaW5zdGFuY2UgaW5zdGVhZCwKKyAgICAgICAgICAgICAgICBvdGhlcndpc2UgaXQgZ2V0cyBzaGFkb3dlZCBieSBfX2RvY19fIGluIHRoZQorICAgICAgICAgICAgICAgIGNsYXNzJ3MgZGljdC4gKi8KKyAgICAgICAgICAgICAgICBpbnQgZXJyID0gUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiX19kb2NfXyIsIGdldF9kb2MpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihnZXRfZG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvcC0+Z2V0dGVyX2RvYyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19FeGNlcHRpb24pKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7CiB9CiAKIFB5RG9jX1NUUlZBUihwcm9wZXJ0eV9kb2MsCkBAIC0xMzMzLDU0ICsxMzMzLDU0IEBACiBzdGF0aWMgaW50CiBwcm9wZXJ0eV90cmF2ZXJzZShQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JcHJvcGVydHlvYmplY3QgKnBwID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKLQlQeV9WSVNJVChwcC0+cHJvcF9nZXQpOwotCVB5X1ZJU0lUKHBwLT5wcm9wX3NldCk7Ci0JUHlfVklTSVQocHAtPnByb3BfZGVsKTsKLQlQeV9WSVNJVChwcC0+cHJvcF9kb2MpOwotCXJldHVybiAwOworICAgIHByb3BlcnR5b2JqZWN0ICpwcCA9IChwcm9wZXJ0eW9iamVjdCAqKXNlbGY7CisgICAgUHlfVklTSVQocHAtPnByb3BfZ2V0KTsKKyAgICBQeV9WSVNJVChwcC0+cHJvcF9zZXQpOworICAgIFB5X1ZJU0lUKHBwLT5wcm9wX2RlbCk7CisgICAgUHlfVklTSVQocHAtPnByb3BfZG9jKTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlUeXBlT2JqZWN0IFB5UHJvcGVydHlfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJwcm9wZXJ0eSIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YocHJvcGVydHlvYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQlwcm9wZXJ0eV9kZWFsbG9jLAkgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCSAgICAgICAJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCQkvKiB0cF9mbGFncyAqLwotIAlwcm9wZXJ0eV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCXByb3BlcnR5X3RyYXZlcnNlLAkJCS8qIHRwX3RyYXZlcnNlICovCi0gCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JcHJvcGVydHlfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JcHJvcGVydHlfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQlwcm9wZXJ0eV9kZXNjcl9nZXQsCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JcHJvcGVydHlfZGVzY3Jfc2V0LAkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JcHJvcGVydHlfaW5pdCwJCQkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkJLyogdHBfYWxsb2MgKi8KLQlQeVR5cGVfR2VuZXJpY05ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAicHJvcGVydHkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YocHJvcGVydHlvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgcHJvcGVydHlfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHByb3BlcnR5X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgcHJvcGVydHlfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBwcm9wZXJ0eV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBwcm9wZXJ0eV9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIHByb3BlcnR5X2Rlc2NyX2dldCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgcHJvcGVydHlfZGVzY3Jfc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICBwcm9wZXJ0eV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL2RpY3RvYmplY3QuYyBiL09iamVjdHMvZGljdG9iamVjdC5jCmluZGV4IDJhYjE1MjAuLmRlZjNkYTkgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGljdG9iamVjdC5jCisrKyBiL09iamVjdHMvZGljdG9iamVjdC5jCkBAIC0xNiwxMiArMTYsMTIgQEAKIHN0YXRpYyB2b2lkCiBzZXRfa2V5X2Vycm9yKFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlPYmplY3QgKnR1cDsKLQl0dXAgPSBQeVR1cGxlX1BhY2soMSwgYXJnKTsKLQlpZiAoIXR1cCkKLQkJcmV0dXJuOyAvKiBjYWxsZXIgd2lsbCBleHBlY3QgZXJyb3IgdG8gYmUgc2V0IGFueXdheSAqLwotCVB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwgdHVwKTsKLQlQeV9ERUNSRUYodHVwKTsKKyAgICBQeU9iamVjdCAqdHVwOworICAgIHR1cCA9IFB5VHVwbGVfUGFjaygxLCBhcmcpOworICAgIGlmICghdHVwKQorICAgICAgICByZXR1cm47IC8qIGNhbGxlciB3aWxsIGV4cGVjdCBlcnJvciB0byBiZSBzZXQgYW55d2F5ICovCisgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCB0dXApOworICAgIFB5X0RFQ1JFRih0dXApOwogfQogCiAvKiBEZWZpbmUgdGhpcyBvdXQgaWYgeW91IGRvbid0IHdhbnQgY29udmVyc2lvbiBzdGF0aXN0aWNzIG9uIGV4aXQuICovCkBAIC0xNDEsNyArMTQxLDcgQEAKIFB5T2JqZWN0ICoKIF9QeURpY3RfRHVtbXkodm9pZCkKIHsKLQlyZXR1cm4gZHVtbXk7CisgICAgcmV0dXJuIGR1bW15OwogfQogI2VuZGlmCiAKQEAgLTE1Niw5ICsxNTYsOSBAQAogc3RhdGljIHZvaWQKIHNob3dfY291bnRzKHZvaWQpCiB7Ci0JZnByaW50ZihzdGRlcnIsICJjcmVhdGVkICVsZCBzdHJpbmcgZGljdHNcbiIsIGNyZWF0ZWQpOwotCWZwcmludGYoc3RkZXJyLCAiY29udmVydGVkICVsZCB0byBub3JtYWwgZGljdHNcbiIsIGNvbnZlcnRlZCk7Ci0JZnByaW50ZihzdGRlcnIsICIlLjJmJSUgY29udmVyc2lvbiByYXRlXG4iLCAoMTAwLjAqY29udmVydGVkKS9jcmVhdGVkKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNyZWF0ZWQgJWxkIHN0cmluZyBkaWN0c1xuIiwgY3JlYXRlZCk7CisgICAgZnByaW50ZihzdGRlcnIsICJjb252ZXJ0ZWQgJWxkIHRvIG5vcm1hbCBkaWN0c1xuIiwgY29udmVydGVkKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiUuMmYlJSBjb252ZXJzaW9uIHJhdGVcbiIsICgxMDAuMCpjb252ZXJ0ZWQpL2NyZWF0ZWQpOwogfQogI2VuZGlmCiAKQEAgLTE3MSwxMiArMTcxLDEyIEBACiBzdGF0aWMgdm9pZAogc2hvd19hbGxvYyh2b2lkKQogewotCWZwcmludGYoc3RkZXJyLCAiRGljdCBhbGxvY2F0aW9uczogJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwKLQkJY291bnRfYWxsb2MpOwotCWZwcmludGYoc3RkZXJyLCAiRGljdCByZXVzZSB0aHJvdWdoIGZyZWVsaXN0OiAlIiBQWV9GT1JNQVRfU0laRV9UCi0JCSJkXG4iLCBjb3VudF9yZXVzZSk7Ci0JZnByaW50ZihzdGRlcnIsICIlLjJmJSUgcmV1c2UgcmF0ZVxuXG4iLAotCQkoMTAwLjAqY291bnRfcmV1c2UvKGNvdW50X2FsbG9jK2NvdW50X3JldXNlKSkpOworICAgIGZwcmludGYoc3RkZXJyLCAiRGljdCBhbGxvY2F0aW9uczogJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwKKyAgICAgICAgY291bnRfYWxsb2MpOworICAgIGZwcmludGYoc3RkZXJyLCAiRGljdCByZXVzZSB0aHJvdWdoIGZyZWVsaXN0OiAlIiBQWV9GT1JNQVRfU0laRV9UCisgICAgICAgICJkXG4iLCBjb3VudF9yZXVzZSk7CisgICAgZnByaW50ZihzdGRlcnIsICIlLjJmJSUgcmV1c2UgcmF0ZVxuXG4iLAorICAgICAgICAoMTAwLjAqY291bnRfcmV1c2UvKGNvdW50X2FsbG9jK2NvdW50X3JldXNlKSkpOwogfQogI2VuZGlmCiAKQEAgLTE4OCwxMiArMTg4LDEyIEBACiBzdGF0aWMgdm9pZAogc2hvd190cmFjayh2b2lkKQogewotCWZwcmludGYoc3RkZXJyLCAiRGljdHMgY3JlYXRlZDogJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwKLQkJY291bnRfdHJhY2tlZCArIGNvdW50X3VudHJhY2tlZCk7Ci0JZnByaW50ZihzdGRlcnIsICJEaWN0cyB0cmFja2VkIGJ5IHRoZSBHQzogJSIgUFlfRk9STUFUX1NJWkVfVAotCQkiZFxuIiwgY291bnRfdHJhY2tlZCk7Ci0JZnByaW50ZihzdGRlcnIsICIlLjJmJSUgZGljdCB0cmFja2luZyByYXRlXG5cbiIsCi0JCSgxMDAuMCpjb3VudF90cmFja2VkLyhjb3VudF91bnRyYWNrZWQrY291bnRfdHJhY2tlZCkpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRpY3RzIGNyZWF0ZWQ6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCisgICAgICAgIGNvdW50X3RyYWNrZWQgKyBjb3VudF91bnRyYWNrZWQpOworICAgIGZwcmludGYoc3RkZXJyLCAiRGljdHMgdHJhY2tlZCBieSB0aGUgR0M6ICUiIFBZX0ZPUk1BVF9TSVpFX1QKKyAgICAgICAgImRcbiIsIGNvdW50X3RyYWNrZWQpOworICAgIGZwcmludGYoc3RkZXJyLCAiJS4yZiUlIGRpY3QgdHJhY2tpbmcgcmF0ZVxuXG4iLAorICAgICAgICAoMTAwLjAqY291bnRfdHJhY2tlZC8oY291bnRfdW50cmFja2VkK2NvdW50X3RyYWNrZWQpKSk7CiB9CiAjZW5kaWYKIApAQCAtMjA3LDE1ICsyMDcsMTUgQEAKICAgIGFuIGV4Y2VsbGVudCByZWFzb24gbm90IHRvKS4KICovCiAKLSNkZWZpbmUgSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMobXApIGRvIHsJCQkJXAotCShtcCktPm1hX3RhYmxlID0gKG1wKS0+bWFfc21hbGx0YWJsZTsJCQkJXAotCShtcCktPm1hX21hc2sgPSBQeURpY3RfTUlOU0laRSAtIDE7CQkJCVwKKyNkZWZpbmUgSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMobXApIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobXApLT5tYV90YWJsZSA9IChtcCktPm1hX3NtYWxsdGFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobXApLT5tYV9tYXNrID0gUHlEaWN0X01JTlNJWkUgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlKDApCiAKLSNkZWZpbmUgRU1QVFlfVE9fTUlOU0laRShtcCkgZG8gewkJCQkJXAotCW1lbXNldCgobXApLT5tYV9zbWFsbHRhYmxlLCAwLCBzaXplb2YoKG1wKS0+bWFfc21hbGx0YWJsZSkpOwlcCi0JKG1wKS0+bWFfdXNlZCA9IChtcCktPm1hX2ZpbGwgPSAwOwkJCQlcCi0JSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMobXApOwkJCQkJXAorI2RlZmluZSBFTVBUWV9UT19NSU5TSVpFKG1wKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbXNldCgobXApLT5tYV9zbWFsbHRhYmxlLCAwLCBzaXplb2YoKG1wKS0+bWFfc21hbGx0YWJsZSkpOyAgICAgICAgXAorICAgIChtcCktPm1hX3VzZWQgPSAobXApLT5tYV9maWxsID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOSVRfTk9OWkVST19ESUNUX1NMT1RTKG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUoMCkKIAogLyogRGljdGlvbmFyeSByZXVzZSBzY2hlbWUgdG8gc2F2ZSBjYWxscyB0byBtYWxsb2MsIGZyZWUsIGFuZCBtZW1zZXQgKi8KQEAgLTIyOCw2OCArMjI4LDY4IEBACiB2b2lkCiBQeURpY3RfRmluaSh2b2lkKQogewotCVB5RGljdE9iamVjdCAqb3A7CisgICAgUHlEaWN0T2JqZWN0ICpvcDsKIAotCXdoaWxlIChudW1mcmVlKSB7Ci0JCW9wID0gZnJlZV9saXN0Wy0tbnVtZnJlZV07Ci0JCWFzc2VydChQeURpY3RfQ2hlY2tFeGFjdChvcCkpOwotCQlQeU9iamVjdF9HQ19EZWwob3ApOwotCX0KKyAgICB3aGlsZSAobnVtZnJlZSkgeworICAgICAgICBvcCA9IGZyZWVfbGlzdFstLW51bWZyZWVdOworICAgICAgICBhc3NlcnQoUHlEaWN0X0NoZWNrRXhhY3Qob3ApKTsKKyAgICAgICAgUHlPYmplY3RfR0NfRGVsKG9wKTsKKyAgICB9CiB9CiAKIFB5T2JqZWN0ICoKIFB5RGljdF9OZXcodm9pZCkKIHsKLQlyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wOwotCWlmIChkdW1teSA9PSBOVUxMKSB7IC8qIEF1dG8taW5pdGlhbGl6ZSBkdW1teSAqLwotCQlkdW1teSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxkdW1teSBrZXk+Iik7Ci0JCWlmIChkdW1teSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgcmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcDsKKyAgICBpZiAoZHVtbXkgPT0gTlVMTCkgeyAvKiBBdXRvLWluaXRpYWxpemUgZHVtbXkgKi8KKyAgICAgICAgZHVtbXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8ZHVtbXkga2V5PiIpOworICAgICAgICBpZiAoZHVtbXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFNIT1dfQ09OVkVSU0lPTl9DT1VOVFMKLQkJUHlfQXRFeGl0KHNob3dfY291bnRzKTsKKyAgICAgICAgUHlfQXRFeGl0KHNob3dfY291bnRzKTsKICNlbmRpZgogI2lmZGVmIFNIT1dfQUxMT0NfQ09VTlQKLQkJUHlfQXRFeGl0KHNob3dfYWxsb2MpOworICAgICAgICBQeV9BdEV4aXQoc2hvd19hbGxvYyk7CiAjZW5kaWYKICNpZmRlZiBTSE9XX1RSQUNLX0NPVU5UCi0JCVB5X0F0RXhpdChzaG93X3RyYWNrKTsKKyAgICAgICAgUHlfQXRFeGl0KHNob3dfdHJhY2spOwogI2VuZGlmCi0JfQotCWlmIChudW1mcmVlKSB7Ci0JCW1wID0gZnJlZV9saXN0Wy0tbnVtZnJlZV07Ci0JCWFzc2VydCAobXAgIT0gTlVMTCk7Ci0JCWFzc2VydCAoUHlfVFlQRShtcCkgPT0gJlB5RGljdF9UeXBlKTsKLQkJX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKiltcCk7Ci0JCWlmIChtcC0+bWFfZmlsbCkgewotCQkJRU1QVFlfVE9fTUlOU0laRShtcCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBBdCBsZWFzdCBzZXQgbWFfdGFibGUgYW5kIG1hX21hc2s7IHRoZXNlIGFyZSB3cm9uZwotCQkJICAgaWYgYW4gZW1wdHkgYnV0IHByZXNpemVkIGRpY3QgaXMgYWRkZWQgdG8gZnJlZWxpc3QgKi8KLQkJCUlOSVRfTk9OWkVST19ESUNUX1NMT1RTKG1wKTsKLQkJfQotCQlhc3NlcnQgKG1wLT5tYV91c2VkID09IDApOwotCQlhc3NlcnQgKG1wLT5tYV90YWJsZSA9PSBtcC0+bWFfc21hbGx0YWJsZSk7Ci0JCWFzc2VydCAobXAtPm1hX21hc2sgPT0gUHlEaWN0X01JTlNJWkUgLSAxKTsKKyAgICB9CisgICAgaWYgKG51bWZyZWUpIHsKKyAgICAgICAgbXAgPSBmcmVlX2xpc3RbLS1udW1mcmVlXTsKKyAgICAgICAgYXNzZXJ0IChtcCAhPSBOVUxMKTsKKyAgICAgICAgYXNzZXJ0IChQeV9UWVBFKG1wKSA9PSAmUHlEaWN0X1R5cGUpOworICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKW1wKTsKKyAgICAgICAgaWYgKG1wLT5tYV9maWxsKSB7CisgICAgICAgICAgICBFTVBUWV9UT19NSU5TSVpFKG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEF0IGxlYXN0IHNldCBtYV90YWJsZSBhbmQgbWFfbWFzazsgdGhlc2UgYXJlIHdyb25nCisgICAgICAgICAgICAgICBpZiBhbiBlbXB0eSBidXQgcHJlc2l6ZWQgZGljdCBpcyBhZGRlZCB0byBmcmVlbGlzdCAqLworICAgICAgICAgICAgSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMobXApOworICAgICAgICB9CisgICAgICAgIGFzc2VydCAobXAtPm1hX3VzZWQgPT0gMCk7CisgICAgICAgIGFzc2VydCAobXAtPm1hX3RhYmxlID09IG1wLT5tYV9zbWFsbHRhYmxlKTsKKyAgICAgICAgYXNzZXJ0IChtcC0+bWFfbWFzayA9PSBQeURpY3RfTUlOU0laRSAtIDEpOwogI2lmZGVmIFNIT1dfQUxMT0NfQ09VTlQKLQkJY291bnRfcmV1c2UrKzsKKyAgICAgICAgY291bnRfcmV1c2UrKzsKICNlbmRpZgotCX0gZWxzZSB7Ci0JCW1wID0gUHlPYmplY3RfR0NfTmV3KFB5RGljdE9iamVjdCwgJlB5RGljdF9UeXBlKTsKLQkJaWYgKG1wID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJRU1QVFlfVE9fTUlOU0laRShtcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXAgPSBQeU9iamVjdF9HQ19OZXcoUHlEaWN0T2JqZWN0LCAmUHlEaWN0X1R5cGUpOworICAgICAgICBpZiAobXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBFTVBUWV9UT19NSU5TSVpFKG1wKTsKICNpZmRlZiBTSE9XX0FMTE9DX0NPVU5UCi0JCWNvdW50X2FsbG9jKys7CisgICAgICAgIGNvdW50X2FsbG9jKys7CiAjZW5kaWYKLQl9Ci0JbXAtPm1hX2xvb2t1cCA9IGxvb2tkaWN0X3N0cmluZzsKKyAgICB9CisgICAgbXAtPm1hX2xvb2t1cCA9IGxvb2tkaWN0X3N0cmluZzsKICNpZmRlZiBTSE9XX1RSQUNLX0NPVU5UCi0JY291bnRfdW50cmFja2VkKys7CisgICAgY291bnRfdW50cmFja2VkKys7CiAjZW5kaWYKICNpZmRlZiBTSE9XX0NPTlZFUlNJT05fQ09VTlRTCi0JKytjcmVhdGVkOworICAgICsrY3JlYXRlZDsKICNlbmRpZgotCXJldHVybiAoUHlPYmplY3QgKiltcDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbXA7CiB9CiAKIC8qCkBAIC0zMTksODAgKzMxOSw4MCBAQAogc3RhdGljIFB5RGljdEVudHJ5ICoKIGxvb2tkaWN0KFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXksIHJlZ2lzdGVyIGxvbmcgaGFzaCkKIHsKLQlyZWdpc3RlciBzaXplX3QgaTsKLQlyZWdpc3RlciBzaXplX3QgcGVydHVyYjsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZnJlZXNsb3Q7Ci0JcmVnaXN0ZXIgc2l6ZV90IG1hc2sgPSAoc2l6ZV90KW1wLT5tYV9tYXNrOwotCVB5RGljdEVudHJ5ICplcDAgPSBtcC0+bWFfdGFibGU7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwotCXJlZ2lzdGVyIGludCBjbXA7Ci0JUHlPYmplY3QgKnN0YXJ0a2V5OworICAgIHJlZ2lzdGVyIHNpemVfdCBpOworICAgIHJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICpmcmVlc2xvdDsKKyAgICByZWdpc3RlciBzaXplX3QgbWFzayA9IChzaXplX3QpbXAtPm1hX21hc2s7CisgICAgUHlEaWN0RW50cnkgKmVwMCA9IG1wLT5tYV90YWJsZTsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgcmVnaXN0ZXIgaW50IGNtcDsKKyAgICBQeU9iamVjdCAqc3RhcnRrZXk7CiAKLQlpID0gKHNpemVfdCloYXNoICYgbWFzazsKLQllcCA9ICZlcDBbaV07Ci0JaWYgKGVwLT5tZV9rZXkgPT0gTlVMTCB8fCBlcC0+bWVfa2V5ID09IGtleSkKLQkJcmV0dXJuIGVwOworICAgIGkgPSAoc2l6ZV90KWhhc2ggJiBtYXNrOworICAgIGVwID0gJmVwMFtpXTsKKyAgICBpZiAoZXAtPm1lX2tleSA9PSBOVUxMIHx8IGVwLT5tZV9rZXkgPT0ga2V5KQorICAgICAgICByZXR1cm4gZXA7CiAKLQlpZiAoZXAtPm1lX2tleSA9PSBkdW1teSkKLQkJZnJlZXNsb3QgPSBlcDsKLQllbHNlIHsKLQkJaWYgKGVwLT5tZV9oYXNoID09IGhhc2gpIHsKLQkJCXN0YXJ0a2V5ID0gZXAtPm1lX2tleTsKLQkJCVB5X0lOQ1JFRihzdGFydGtleSk7Ci0JCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOwotCQkJUHlfREVDUkVGKHN0YXJ0a2V5KTsKLQkJCWlmIChjbXAgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJaWYgKGVwMCA9PSBtcC0+bWFfdGFibGUgJiYgZXAtPm1lX2tleSA9PSBzdGFydGtleSkgewotCQkJCWlmIChjbXAgPiAwKQotCQkJCQlyZXR1cm4gZXA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCi0JCQkJICogZGljdDogIHN0YXJ0IG92ZXIuCi0JCQkJICogWFhYIEEgY2xldmVyIGFkdmVyc2FyeSBjb3VsZCBwcmV2ZW50IHRoaXMKLQkJCQkgKiBYWFggZnJvbSB0ZXJtaW5hdGluZy4KLSAJCQkJICovCi0gCQkJCXJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoKTsKLSAJCQl9Ci0JCX0KLQkJZnJlZXNsb3QgPSBOVUxMOwotCX0KKyAgICBpZiAoZXAtPm1lX2tleSA9PSBkdW1teSkKKyAgICAgICAgZnJlZXNsb3QgPSBlcDsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGVwLT5tZV9oYXNoID09IGhhc2gpIHsKKyAgICAgICAgICAgIHN0YXJ0a2V5ID0gZXAtPm1lX2tleTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOworICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKGVwMCA9PSBtcC0+bWFfdGFibGUgJiYgZXAtPm1lX2tleSA9PSBzdGFydGtleSkgeworICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCisgICAgICAgICAgICAgICAgICogZGljdDogIHN0YXJ0IG92ZXIuCisgICAgICAgICAgICAgICAgICogWFhYIEEgY2xldmVyIGFkdmVyc2FyeSBjb3VsZCBwcmV2ZW50IHRoaXMKKyAgICAgICAgICAgICAgICAgKiBYWFggZnJvbSB0ZXJtaW5hdGluZy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gbG9va2RpY3QobXAsIGtleSwgaGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJlZXNsb3QgPSBOVUxMOworICAgIH0KIAotCS8qIEluIHRoZSBsb29wLCBtZV9rZXkgPT0gZHVtbXkgaXMgYnkgZmFyIChmYWN0b3Igb2YgMTAwcykgdGhlCi0JICAgbGVhc3QgbGlrZWx5IG91dGNvbWUsIHNvIHRlc3QgZm9yIHRoYXQgbGFzdC4gKi8KLQlmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKLQkJaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOwotCQllcCA9ICZlcDBbaSAmIG1hc2tdOwotCQlpZiAoZXAtPm1lX2tleSA9PSBOVUxMKQotCQkJcmV0dXJuIGZyZWVzbG90ID09IE5VTEwgPyBlcCA6IGZyZWVzbG90OwotCQlpZiAoZXAtPm1lX2tleSA9PSBrZXkpCi0JCQlyZXR1cm4gZXA7Ci0JCWlmIChlcC0+bWVfaGFzaCA9PSBoYXNoICYmIGVwLT5tZV9rZXkgIT0gZHVtbXkpIHsKLQkJCXN0YXJ0a2V5ID0gZXAtPm1lX2tleTsKLQkJCVB5X0lOQ1JFRihzdGFydGtleSk7Ci0JCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOwotCQkJUHlfREVDUkVGKHN0YXJ0a2V5KTsKLQkJCWlmIChjbXAgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJaWYgKGVwMCA9PSBtcC0+bWFfdGFibGUgJiYgZXAtPm1lX2tleSA9PSBzdGFydGtleSkgewotCQkJCWlmIChjbXAgPiAwKQotCQkJCQlyZXR1cm4gZXA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCi0JCQkJICogZGljdDogIHN0YXJ0IG92ZXIuCi0JCQkJICogWFhYIEEgY2xldmVyIGFkdmVyc2FyeSBjb3VsZCBwcmV2ZW50IHRoaXMKLQkJCQkgKiBYWFggZnJvbSB0ZXJtaW5hdGluZy4KLSAJCQkJICovCi0gCQkJCXJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoKTsKLSAJCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXAtPm1lX2tleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQotCQkJZnJlZXNsb3QgPSBlcDsKLQl9Ci0JYXNzZXJ0KDApOwkvKiBOT1QgUkVBQ0hFRCAqLwotCXJldHVybiAwOworICAgIC8qIEluIHRoZSBsb29wLCBtZV9rZXkgPT0gZHVtbXkgaXMgYnkgZmFyIChmYWN0b3Igb2YgMTAwcykgdGhlCisgICAgICAgbGVhc3QgbGlrZWx5IG91dGNvbWUsIHNvIHRlc3QgZm9yIHRoYXQgbGFzdC4gKi8KKyAgICBmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKKyAgICAgICAgaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOworICAgICAgICBlcCA9ICZlcDBbaSAmIG1hc2tdOworICAgICAgICBpZiAoZXAtPm1lX2tleSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGZyZWVzbG90ID09IE5VTEwgPyBlcCA6IGZyZWVzbG90OworICAgICAgICBpZiAoZXAtPm1lX2tleSA9PSBrZXkpCisgICAgICAgICAgICByZXR1cm4gZXA7CisgICAgICAgIGlmIChlcC0+bWVfaGFzaCA9PSBoYXNoICYmIGVwLT5tZV9rZXkgIT0gZHVtbXkpIHsKKyAgICAgICAgICAgIHN0YXJ0a2V5ID0gZXAtPm1lX2tleTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOworICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKGVwMCA9PSBtcC0+bWFfdGFibGUgJiYgZXAtPm1lX2tleSA9PSBzdGFydGtleSkgeworICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCisgICAgICAgICAgICAgICAgICogZGljdDogIHN0YXJ0IG92ZXIuCisgICAgICAgICAgICAgICAgICogWFhYIEEgY2xldmVyIGFkdmVyc2FyeSBjb3VsZCBwcmV2ZW50IHRoaXMKKyAgICAgICAgICAgICAgICAgKiBYWFggZnJvbSB0ZXJtaW5hdGluZy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gbG9va2RpY3QobXAsIGtleSwgaGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXAtPm1lX2tleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgZnJlZXNsb3QgPSBlcDsKKyAgICB9CisgICAgYXNzZXJ0KDApOyAgICAgICAgICAvKiBOT1QgUkVBQ0hFRCAqLworICAgIHJldHVybiAwOwogfQogCiAvKgpAQCAtNDA3LDk5ICs0MDcsOTkgQEAKIHN0YXRpYyBQeURpY3RFbnRyeSAqCiBsb29rZGljdF9zdHJpbmcoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgcmVnaXN0ZXIgbG9uZyBoYXNoKQogewotCXJlZ2lzdGVyIHNpemVfdCBpOwotCXJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOwotCXJlZ2lzdGVyIFB5RGljdEVudHJ5ICpmcmVlc2xvdDsKLQlyZWdpc3RlciBzaXplX3QgbWFzayA9IChzaXplX3QpbXAtPm1hX21hc2s7Ci0JUHlEaWN0RW50cnkgKmVwMCA9IG1wLT5tYV90YWJsZTsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmZyZWVzbG90OworICAgIHJlZ2lzdGVyIHNpemVfdCBtYXNrID0gKHNpemVfdCltcC0+bWFfbWFzazsKKyAgICBQeURpY3RFbnRyeSAqZXAwID0gbXAtPm1hX3RhYmxlOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKIAotCS8qIE1ha2Ugc3VyZSB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSB0byBoYW5kbGUgbm9uLXN0cmluZyBrZXlzLAotCSAgIGluY2x1ZGluZyBzdWJjbGFzc2VzIG9mIHN0cjsgZS5nLiwgb25lIHJlYXNvbiB0byBzdWJjbGFzcwotCSAgIHN0cmluZ3MgaXMgdG8gb3ZlcnJpZGUgX19lcV9fLCBhbmQgZm9yIHNwZWVkIHdlIGRvbid0IGNhdGVyIHRvCi0JICAgdGhhdCBoZXJlLiAqLwotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpKSB7CisgICAgLyogTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBoYXZlIHRvIGhhbmRsZSBub24tc3RyaW5nIGtleXMsCisgICAgICAgaW5jbHVkaW5nIHN1YmNsYXNzZXMgb2Ygc3RyOyBlLmcuLCBvbmUgcmVhc29uIHRvIHN1YmNsYXNzCisgICAgICAgc3RyaW5ncyBpcyB0byBvdmVycmlkZSBfX2VxX18sIGFuZCBmb3Igc3BlZWQgd2UgZG9uJ3QgY2F0ZXIgdG8KKyAgICAgICB0aGF0IGhlcmUuICovCisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkpIHsKICNpZmRlZiBTSE9XX0NPTlZFUlNJT05fQ09VTlRTCi0JCSsrY29udmVydGVkOworICAgICAgICArK2NvbnZlcnRlZDsKICNlbmRpZgotCQltcC0+bWFfbG9va3VwID0gbG9va2RpY3Q7Ci0JCXJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoKTsKLQl9Ci0JaSA9IGhhc2ggJiBtYXNrOwotCWVwID0gJmVwMFtpXTsKLQlpZiAoZXAtPm1lX2tleSA9PSBOVUxMIHx8IGVwLT5tZV9rZXkgPT0ga2V5KQotCQlyZXR1cm4gZXA7Ci0JaWYgKGVwLT5tZV9rZXkgPT0gZHVtbXkpCi0JCWZyZWVzbG90ID0gZXA7Ci0JZWxzZSB7Ci0JCWlmIChlcC0+bWVfaGFzaCA9PSBoYXNoICYmIF9QeVN0cmluZ19FcShlcC0+bWVfa2V5LCBrZXkpKQotCQkJcmV0dXJuIGVwOwotCQlmcmVlc2xvdCA9IE5VTEw7Ci0JfQorICAgICAgICBtcC0+bWFfbG9va3VwID0gbG9va2RpY3Q7CisgICAgICAgIHJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoKTsKKyAgICB9CisgICAgaSA9IGhhc2ggJiBtYXNrOworICAgIGVwID0gJmVwMFtpXTsKKyAgICBpZiAoZXAtPm1lX2tleSA9PSBOVUxMIHx8IGVwLT5tZV9rZXkgPT0ga2V5KQorICAgICAgICByZXR1cm4gZXA7CisgICAgaWYgKGVwLT5tZV9rZXkgPT0gZHVtbXkpCisgICAgICAgIGZyZWVzbG90ID0gZXA7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChlcC0+bWVfaGFzaCA9PSBoYXNoICYmIF9QeVN0cmluZ19FcShlcC0+bWVfa2V5LCBrZXkpKQorICAgICAgICAgICAgcmV0dXJuIGVwOworICAgICAgICBmcmVlc2xvdCA9IE5VTEw7CisgICAgfQogCi0JLyogSW4gdGhlIGxvb3AsIG1lX2tleSA9PSBkdW1teSBpcyBieSBmYXIgKGZhY3RvciBvZiAxMDBzKSB0aGUKLQkgICBsZWFzdCBsaWtlbHkgb3V0Y29tZSwgc28gdGVzdCBmb3IgdGhhdCBsYXN0LiAqLwotCWZvciAocGVydHVyYiA9IGhhc2g7IDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgewotCQlpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7Ci0JCWVwID0gJmVwMFtpICYgbWFza107Ci0JCWlmIChlcC0+bWVfa2V5ID09IE5VTEwpCi0JCQlyZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVwIDogZnJlZXNsb3Q7Ci0JCWlmIChlcC0+bWVfa2V5ID09IGtleQotCQkgICAgfHwgKGVwLT5tZV9oYXNoID09IGhhc2gKLQkJICAgICAgICAmJiBlcC0+bWVfa2V5ICE9IGR1bW15Ci0JCQkmJiBfUHlTdHJpbmdfRXEoZXAtPm1lX2tleSwga2V5KSkpCi0JCQlyZXR1cm4gZXA7Ci0JCWlmIChlcC0+bWVfa2V5ID09IGR1bW15ICYmIGZyZWVzbG90ID09IE5VTEwpCi0JCQlmcmVlc2xvdCA9IGVwOwotCX0KLQlhc3NlcnQoMCk7CS8qIE5PVCBSRUFDSEVEICovCi0JcmV0dXJuIDA7CisgICAgLyogSW4gdGhlIGxvb3AsIG1lX2tleSA9PSBkdW1teSBpcyBieSBmYXIgKGZhY3RvciBvZiAxMDBzKSB0aGUKKyAgICAgICBsZWFzdCBsaWtlbHkgb3V0Y29tZSwgc28gdGVzdCBmb3IgdGhhdCBsYXN0LiAqLworICAgIGZvciAocGVydHVyYiA9IGhhc2g7IDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgeworICAgICAgICBpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7CisgICAgICAgIGVwID0gJmVwMFtpICYgbWFza107CisgICAgICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVwIDogZnJlZXNsb3Q7CisgICAgICAgIGlmIChlcC0+bWVfa2V5ID09IGtleQorICAgICAgICAgICAgfHwgKGVwLT5tZV9oYXNoID09IGhhc2gKKyAgICAgICAgICAgICYmIGVwLT5tZV9rZXkgIT0gZHVtbXkKKyAgICAgICAgICAgICYmIF9QeVN0cmluZ19FcShlcC0+bWVfa2V5LCBrZXkpKSkKKyAgICAgICAgICAgIHJldHVybiBlcDsKKyAgICAgICAgaWYgKGVwLT5tZV9rZXkgPT0gZHVtbXkgJiYgZnJlZXNsb3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGZyZWVzbG90ID0gZXA7CisgICAgfQorICAgIGFzc2VydCgwKTsgICAgICAgICAgLyogTk9UIFJFQUNIRUQgKi8KKyAgICByZXR1cm4gMDsKIH0KIAogI2lmZGVmIFNIT1dfVFJBQ0tfQ09VTlQKICNkZWZpbmUgSU5DUkVBU0VfVFJBQ0tfQ09VTlQgXAotCShjb3VudF90cmFja2VkKyssIGNvdW50X3VudHJhY2tlZC0tKTsKKyAgICAoY291bnRfdHJhY2tlZCsrLCBjb3VudF91bnRyYWNrZWQtLSk7CiAjZGVmaW5lIERFQ1JFQVNFX1RSQUNLX0NPVU5UIFwKLQkoY291bnRfdHJhY2tlZC0tLCBjb3VudF91bnRyYWNrZWQrKyk7CisgICAgKGNvdW50X3RyYWNrZWQtLSwgY291bnRfdW50cmFja2VkKyspOwogI2Vsc2UKICNkZWZpbmUgSU5DUkVBU0VfVFJBQ0tfQ09VTlQKICNkZWZpbmUgREVDUkVBU0VfVFJBQ0tfQ09VTlQKICNlbmRpZgogCiAjZGVmaW5lIE1BSU5UQUlOX1RSQUNLSU5HKG1wLCBrZXksIHZhbHVlKSBcCi0JZG8geyBcCi0JCWlmICghX1B5T2JqZWN0X0dDX0lTX1RSQUNLRUQobXApKSB7IFwKLQkJCWlmIChfUHlPYmplY3RfR0NfTUFZX0JFX1RSQUNLRUQoa2V5KSB8fCBcCi0JCQkJX1B5T2JqZWN0X0dDX01BWV9CRV9UUkFDS0VEKHZhbHVlKSkgeyBcCi0JCQkJX1B5T2JqZWN0X0dDX1RSQUNLKG1wKTsgXAotCQkJCUlOQ1JFQVNFX1RSQUNLX0NPVU5UIFwKLQkJCX0gXAotCQl9IFwKLQl9IHdoaWxlKDApCisgICAgZG8geyBcCisgICAgICAgIGlmICghX1B5T2JqZWN0X0dDX0lTX1RSQUNLRUQobXApKSB7IFwKKyAgICAgICAgICAgIGlmIChfUHlPYmplY3RfR0NfTUFZX0JFX1RSQUNLRUQoa2V5KSB8fCBcCisgICAgICAgICAgICAgICAgX1B5T2JqZWN0X0dDX01BWV9CRV9UUkFDS0VEKHZhbHVlKSkgeyBcCisgICAgICAgICAgICAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKG1wKTsgXAorICAgICAgICAgICAgICAgIElOQ1JFQVNFX1RSQUNLX0NPVU5UIFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlKDApCiAKIHZvaWQKIF9QeURpY3RfTWF5YmVVbnRyYWNrKFB5T2JqZWN0ICpvcCkKIHsKLQlQeURpY3RPYmplY3QgKm1wOwotCVB5T2JqZWN0ICp2YWx1ZTsKLQlQeV9zc2l6ZV90IG1hc2ssIGk7Ci0JUHlEaWN0RW50cnkgKmVwOworICAgIFB5RGljdE9iamVjdCAqbXA7CisgICAgUHlPYmplY3QgKnZhbHVlOworICAgIFB5X3NzaXplX3QgbWFzaywgaTsKKyAgICBQeURpY3RFbnRyeSAqZXA7CiAKLQlpZiAoIVB5RGljdF9DaGVja0V4YWN0KG9wKSB8fCAhX1B5T2JqZWN0X0dDX0lTX1RSQUNLRUQob3ApKQotCQlyZXR1cm47Ci0JCi0JbXAgPSAoUHlEaWN0T2JqZWN0ICopIG9wOwotCWVwID0gbXAtPm1hX3RhYmxlOwotCW1hc2sgPSBtcC0+bWFfbWFzazsKLQlmb3IgKGkgPSAwOyBpIDw9IG1hc2s7IGkrKykgewotCQlpZiAoKHZhbHVlID0gZXBbaV0ubWVfdmFsdWUpID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJaWYgKF9QeU9iamVjdF9HQ19NQVlfQkVfVFJBQ0tFRCh2YWx1ZSkgfHwKLQkJCV9QeU9iamVjdF9HQ19NQVlfQkVfVFJBQ0tFRChlcFtpXS5tZV9rZXkpKQotCQkJcmV0dXJuOwotCX0KLQlERUNSRUFTRV9UUkFDS19DT1VOVAotCV9QeU9iamVjdF9HQ19VTlRSQUNLKG9wKTsKKyAgICBpZiAoIVB5RGljdF9DaGVja0V4YWN0KG9wKSB8fCAhX1B5T2JqZWN0X0dDX0lTX1RSQUNLRUQob3ApKQorICAgICAgICByZXR1cm47CisKKyAgICBtcCA9IChQeURpY3RPYmplY3QgKikgb3A7CisgICAgZXAgPSBtcC0+bWFfdGFibGU7CisgICAgbWFzayA9IG1wLT5tYV9tYXNrOworICAgIGZvciAoaSA9IDA7IGkgPD0gbWFzazsgaSsrKSB7CisgICAgICAgIGlmICgodmFsdWUgPSBlcFtpXS5tZV92YWx1ZSkgPT0gTlVMTCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoX1B5T2JqZWN0X0dDX01BWV9CRV9UUkFDS0VEKHZhbHVlKSB8fAorICAgICAgICAgICAgX1B5T2JqZWN0X0dDX01BWV9CRV9UUkFDS0VEKGVwW2ldLm1lX2tleSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIERFQ1JFQVNFX1RSQUNLX0NPVU5UCisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0sob3ApOwogfQogCiAKQEAgLTUxMiwzNyArNTEyLDM3IEBACiBzdGF0aWMgaW50CiBpbnNlcnRkaWN0KHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICpvbGRfdmFsdWU7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwotCXR5cGVkZWYgUHlEaWN0RW50cnkgKigqbG9va3VwZnVuYykoUHlEaWN0T2JqZWN0ICosIFB5T2JqZWN0ICosIGxvbmcpOworICAgIFB5T2JqZWN0ICpvbGRfdmFsdWU7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOworICAgIHR5cGVkZWYgUHlEaWN0RW50cnkgKigqbG9va3VwZnVuYykoUHlEaWN0T2JqZWN0ICosIFB5T2JqZWN0ICosIGxvbmcpOwogCi0JYXNzZXJ0KG1wLT5tYV9sb29rdXAgIT0gTlVMTCk7Ci0JZXAgPSBtcC0+bWFfbG9va3VwKG1wLCBrZXksIGhhc2gpOwotCWlmIChlcCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlQeV9ERUNSRUYodmFsdWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCU1BSU5UQUlOX1RSQUNLSU5HKG1wLCBrZXksIHZhbHVlKTsKLQlpZiAoZXAtPm1lX3ZhbHVlICE9IE5VTEwpIHsKLQkJb2xkX3ZhbHVlID0gZXAtPm1lX3ZhbHVlOwotCQllcC0+bWVfdmFsdWUgPSB2YWx1ZTsKLQkJUHlfREVDUkVGKG9sZF92YWx1ZSk7IC8qIHdoaWNoICoqQ0FOKiogcmUtZW50ZXIgKi8KLQkJUHlfREVDUkVGKGtleSk7Ci0JfQotCWVsc2UgewotCQlpZiAoZXAtPm1lX2tleSA9PSBOVUxMKQotCQkJbXAtPm1hX2ZpbGwrKzsKLQkJZWxzZSB7Ci0JCQlhc3NlcnQoZXAtPm1lX2tleSA9PSBkdW1teSk7Ci0JCQlQeV9ERUNSRUYoZHVtbXkpOwotCQl9Ci0JCWVwLT5tZV9rZXkgPSBrZXk7Ci0JCWVwLT5tZV9oYXNoID0gKFB5X3NzaXplX3QpaGFzaDsKLQkJZXAtPm1lX3ZhbHVlID0gdmFsdWU7Ci0JCW1wLT5tYV91c2VkKys7Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChtcC0+bWFfbG9va3VwICE9IE5VTEwpOworICAgIGVwID0gbXAtPm1hX2xvb2t1cChtcCwga2V5LCBoYXNoKTsKKyAgICBpZiAoZXAgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBNQUlOVEFJTl9UUkFDS0lORyhtcCwga2V5LCB2YWx1ZSk7CisgICAgaWYgKGVwLT5tZV92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIG9sZF92YWx1ZSA9IGVwLT5tZV92YWx1ZTsKKyAgICAgICAgZXAtPm1lX3ZhbHVlID0gdmFsdWU7CisgICAgICAgIFB5X0RFQ1JFRihvbGRfdmFsdWUpOyAvKiB3aGljaCAqKkNBTioqIHJlLWVudGVyICovCisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGVwLT5tZV9rZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIG1wLT5tYV9maWxsKys7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGVwLT5tZV9rZXkgPT0gZHVtbXkpOworICAgICAgICAgICAgUHlfREVDUkVGKGR1bW15KTsKKyAgICAgICAgfQorICAgICAgICBlcC0+bWVfa2V5ID0ga2V5OworICAgICAgICBlcC0+bWVfaGFzaCA9IChQeV9zc2l6ZV90KWhhc2g7CisgICAgICAgIGVwLT5tZV92YWx1ZSA9IHZhbHVlOworICAgICAgICBtcC0+bWFfdXNlZCsrOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTU1NSwyNyArNTU1LDI3IEBACiAqLwogc3RhdGljIHZvaWQKIGluc2VydGRpY3RfY2xlYW4ocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoLAotCQkgUHlPYmplY3QgKnZhbHVlKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JcmVnaXN0ZXIgc2l6ZV90IGk7Ci0JcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7Ci0JcmVnaXN0ZXIgc2l6ZV90IG1hc2sgPSAoc2l6ZV90KW1wLT5tYV9tYXNrOwotCVB5RGljdEVudHJ5ICplcDAgPSBtcC0+bWFfdGFibGU7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOworICAgIHJlZ2lzdGVyIHNpemVfdCBpOworICAgIHJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOworICAgIHJlZ2lzdGVyIHNpemVfdCBtYXNrID0gKHNpemVfdCltcC0+bWFfbWFzazsKKyAgICBQeURpY3RFbnRyeSAqZXAwID0gbXAtPm1hX3RhYmxlOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKIAotCU1BSU5UQUlOX1RSQUNLSU5HKG1wLCBrZXksIHZhbHVlKTsKLQlpID0gaGFzaCAmIG1hc2s7Ci0JZXAgPSAmZXAwW2ldOwotCWZvciAocGVydHVyYiA9IGhhc2g7IGVwLT5tZV9rZXkgIT0gTlVMTDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgewotCQlpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7Ci0JCWVwID0gJmVwMFtpICYgbWFza107Ci0JfQotCWFzc2VydChlcC0+bWVfdmFsdWUgPT0gTlVMTCk7Ci0JbXAtPm1hX2ZpbGwrKzsKLQllcC0+bWVfa2V5ID0ga2V5OwotCWVwLT5tZV9oYXNoID0gKFB5X3NzaXplX3QpaGFzaDsKLQllcC0+bWVfdmFsdWUgPSB2YWx1ZTsKLQltcC0+bWFfdXNlZCsrOworICAgIE1BSU5UQUlOX1RSQUNLSU5HKG1wLCBrZXksIHZhbHVlKTsKKyAgICBpID0gaGFzaCAmIG1hc2s7CisgICAgZXAgPSAmZXAwW2ldOworICAgIGZvciAocGVydHVyYiA9IGhhc2g7IGVwLT5tZV9rZXkgIT0gTlVMTDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgeworICAgICAgICBpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7CisgICAgICAgIGVwID0gJmVwMFtpICYgbWFza107CisgICAgfQorICAgIGFzc2VydChlcC0+bWVfdmFsdWUgPT0gTlVMTCk7CisgICAgbXAtPm1hX2ZpbGwrKzsKKyAgICBlcC0+bWVfa2V5ID0ga2V5OworICAgIGVwLT5tZV9oYXNoID0gKFB5X3NzaXplX3QpaGFzaDsKKyAgICBlcC0+bWVfdmFsdWUgPSB2YWx1ZTsKKyAgICBtcC0+bWFfdXNlZCsrOwogfQogCiAvKgpAQCAtNTg2LDg0ICs1ODYsODQgQEAKIHN0YXRpYyBpbnQKIGRpY3RyZXNpemUoUHlEaWN0T2JqZWN0ICptcCwgUHlfc3NpemVfdCBtaW51c2VkKQogewotCVB5X3NzaXplX3QgbmV3c2l6ZTsKLQlQeURpY3RFbnRyeSAqb2xkdGFibGUsICpuZXd0YWJsZSwgKmVwOwotCVB5X3NzaXplX3QgaTsKLQlpbnQgaXNfb2xkdGFibGVfbWFsbG9jZWQ7Ci0JUHlEaWN0RW50cnkgc21hbGxfY29weVtQeURpY3RfTUlOU0laRV07CisgICAgUHlfc3NpemVfdCBuZXdzaXplOworICAgIFB5RGljdEVudHJ5ICpvbGR0YWJsZSwgKm5ld3RhYmxlLCAqZXA7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBpc19vbGR0YWJsZV9tYWxsb2NlZDsKKyAgICBQeURpY3RFbnRyeSBzbWFsbF9jb3B5W1B5RGljdF9NSU5TSVpFXTsKIAotCWFzc2VydChtaW51c2VkID49IDApOworICAgIGFzc2VydChtaW51c2VkID49IDApOwogCi0JLyogRmluZCB0aGUgc21hbGxlc3QgdGFibGUgc2l6ZSA+IG1pbnVzZWQuICovCi0JZm9yIChuZXdzaXplID0gUHlEaWN0X01JTlNJWkU7Ci0JICAgICBuZXdzaXplIDw9IG1pbnVzZWQgJiYgbmV3c2l6ZSA+IDA7Ci0JICAgICBuZXdzaXplIDw8PSAxKQotCQk7Ci0JaWYgKG5ld3NpemUgPD0gMCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIEZpbmQgdGhlIHNtYWxsZXN0IHRhYmxlIHNpemUgPiBtaW51c2VkLiAqLworICAgIGZvciAobmV3c2l6ZSA9IFB5RGljdF9NSU5TSVpFOworICAgICAgICAgbmV3c2l6ZSA8PSBtaW51c2VkICYmIG5ld3NpemUgPiAwOworICAgICAgICAgbmV3c2l6ZSA8PD0gMSkKKyAgICAgICAgOworICAgIGlmIChuZXdzaXplIDw9IDApIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIEdldCBzcGFjZSBmb3IgYSBuZXcgdGFibGUuICovCi0Jb2xkdGFibGUgPSBtcC0+bWFfdGFibGU7Ci0JYXNzZXJ0KG9sZHRhYmxlICE9IE5VTEwpOwotCWlzX29sZHRhYmxlX21hbGxvY2VkID0gb2xkdGFibGUgIT0gbXAtPm1hX3NtYWxsdGFibGU7CisgICAgLyogR2V0IHNwYWNlIGZvciBhIG5ldyB0YWJsZS4gKi8KKyAgICBvbGR0YWJsZSA9IG1wLT5tYV90YWJsZTsKKyAgICBhc3NlcnQob2xkdGFibGUgIT0gTlVMTCk7CisgICAgaXNfb2xkdGFibGVfbWFsbG9jZWQgPSBvbGR0YWJsZSAhPSBtcC0+bWFfc21hbGx0YWJsZTsKIAotCWlmIChuZXdzaXplID09IFB5RGljdF9NSU5TSVpFKSB7Ci0JCS8qIEEgbGFyZ2UgdGFibGUgaXMgc2hyaW5raW5nLCBvciB3ZSBjYW4ndCBnZXQgYW55IHNtYWxsZXIuICovCi0JCW5ld3RhYmxlID0gbXAtPm1hX3NtYWxsdGFibGU7Ci0JCWlmIChuZXd0YWJsZSA9PSBvbGR0YWJsZSkgewotCQkJaWYgKG1wLT5tYV9maWxsID09IG1wLT5tYV91c2VkKSB7Ci0JCQkJLyogTm8gZHVtbWllcywgc28gbm8gcG9pbnQgZG9pbmcgYW55dGhpbmcuICovCi0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkvKiBXZSdyZSBub3QgZ29pbmcgdG8gcmVzaXplIGl0LCBidXQgcmVidWlsZCB0aGUKLQkJCSAgIHRhYmxlIGFueXdheSB0byBwdXJnZSBvbGQgZHVtbXkgZW50cmllcy4KLQkJCSAgIFN1YnRsZTogIFRoaXMgaXMgKm5lY2Vzc2FyeSogaWYgZmlsbD09c2l6ZSwKLQkJCSAgIGFzIGxvb2tkaWN0IG5lZWRzIGF0IGxlYXN0IG9uZSB2aXJnaW4gc2xvdCB0bwotCQkJICAgdGVybWluYXRlIGZhaWxpbmcgc2VhcmNoZXMuICBJZiBmaWxsIDwgc2l6ZSwgaXQncwotCQkJICAgbWVyZWx5IGRlc2lyYWJsZSwgYXMgZHVtbWllcyBzbG93IHNlYXJjaGVzLiAqLwotCQkJYXNzZXJ0KG1wLT5tYV9maWxsID4gbXAtPm1hX3VzZWQpOwotCQkJbWVtY3B5KHNtYWxsX2NvcHksIG9sZHRhYmxlLCBzaXplb2Yoc21hbGxfY29weSkpOwotCQkJb2xkdGFibGUgPSBzbWFsbF9jb3B5OwotCQl9Ci0JfQotCWVsc2UgewotCQluZXd0YWJsZSA9IFB5TWVtX05FVyhQeURpY3RFbnRyeSwgbmV3c2l6ZSk7Ci0JCWlmIChuZXd0YWJsZSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgIGlmIChuZXdzaXplID09IFB5RGljdF9NSU5TSVpFKSB7CisgICAgICAgIC8qIEEgbGFyZ2UgdGFibGUgaXMgc2hyaW5raW5nLCBvciB3ZSBjYW4ndCBnZXQgYW55IHNtYWxsZXIuICovCisgICAgICAgIG5ld3RhYmxlID0gbXAtPm1hX3NtYWxsdGFibGU7CisgICAgICAgIGlmIChuZXd0YWJsZSA9PSBvbGR0YWJsZSkgeworICAgICAgICAgICAgaWYgKG1wLT5tYV9maWxsID09IG1wLT5tYV91c2VkKSB7CisgICAgICAgICAgICAgICAgLyogTm8gZHVtbWllcywgc28gbm8gcG9pbnQgZG9pbmcgYW55dGhpbmcuICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBXZSdyZSBub3QgZ29pbmcgdG8gcmVzaXplIGl0LCBidXQgcmVidWlsZCB0aGUKKyAgICAgICAgICAgICAgIHRhYmxlIGFueXdheSB0byBwdXJnZSBvbGQgZHVtbXkgZW50cmllcy4KKyAgICAgICAgICAgICAgIFN1YnRsZTogIFRoaXMgaXMgKm5lY2Vzc2FyeSogaWYgZmlsbD09c2l6ZSwKKyAgICAgICAgICAgICAgIGFzIGxvb2tkaWN0IG5lZWRzIGF0IGxlYXN0IG9uZSB2aXJnaW4gc2xvdCB0bworICAgICAgICAgICAgICAgdGVybWluYXRlIGZhaWxpbmcgc2VhcmNoZXMuICBJZiBmaWxsIDwgc2l6ZSwgaXQncworICAgICAgICAgICAgICAgbWVyZWx5IGRlc2lyYWJsZSwgYXMgZHVtbWllcyBzbG93IHNlYXJjaGVzLiAqLworICAgICAgICAgICAgYXNzZXJ0KG1wLT5tYV9maWxsID4gbXAtPm1hX3VzZWQpOworICAgICAgICAgICAgbWVtY3B5KHNtYWxsX2NvcHksIG9sZHRhYmxlLCBzaXplb2Yoc21hbGxfY29weSkpOworICAgICAgICAgICAgb2xkdGFibGUgPSBzbWFsbF9jb3B5OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuZXd0YWJsZSA9IFB5TWVtX05FVyhQeURpY3RFbnRyeSwgbmV3c2l6ZSk7CisgICAgICAgIGlmIChuZXd0YWJsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JLyogTWFrZSB0aGUgZGljdCBlbXB0eSwgdXNpbmcgdGhlIG5ldyB0YWJsZS4gKi8KLQlhc3NlcnQobmV3dGFibGUgIT0gb2xkdGFibGUpOwotCW1wLT5tYV90YWJsZSA9IG5ld3RhYmxlOwotCW1wLT5tYV9tYXNrID0gbmV3c2l6ZSAtIDE7Ci0JbWVtc2V0KG5ld3RhYmxlLCAwLCBzaXplb2YoUHlEaWN0RW50cnkpICogbmV3c2l6ZSk7Ci0JbXAtPm1hX3VzZWQgPSAwOwotCWkgPSBtcC0+bWFfZmlsbDsKLQltcC0+bWFfZmlsbCA9IDA7CisgICAgLyogTWFrZSB0aGUgZGljdCBlbXB0eSwgdXNpbmcgdGhlIG5ldyB0YWJsZS4gKi8KKyAgICBhc3NlcnQobmV3dGFibGUgIT0gb2xkdGFibGUpOworICAgIG1wLT5tYV90YWJsZSA9IG5ld3RhYmxlOworICAgIG1wLT5tYV9tYXNrID0gbmV3c2l6ZSAtIDE7CisgICAgbWVtc2V0KG5ld3RhYmxlLCAwLCBzaXplb2YoUHlEaWN0RW50cnkpICogbmV3c2l6ZSk7CisgICAgbXAtPm1hX3VzZWQgPSAwOworICAgIGkgPSBtcC0+bWFfZmlsbDsKKyAgICBtcC0+bWFfZmlsbCA9IDA7CiAKLQkvKiBDb3B5IHRoZSBkYXRhIG92ZXI7IHRoaXMgaXMgcmVmY291bnQtbmV1dHJhbCBmb3IgYWN0aXZlIGVudHJpZXM7Ci0JICAgZHVtbXkgZW50cmllcyBhcmVuJ3QgY29waWVkIG92ZXIsIG9mIGNvdXJzZSAqLwotCWZvciAoZXAgPSBvbGR0YWJsZTsgaSA+IDA7IGVwKyspIHsKLQkJaWYgKGVwLT5tZV92YWx1ZSAhPSBOVUxMKSB7CS8qIGFjdGl2ZSBlbnRyeSAqLwotCQkJLS1pOwotCQkJaW5zZXJ0ZGljdF9jbGVhbihtcCwgZXAtPm1lX2tleSwgKGxvbmcpZXAtPm1lX2hhc2gsCi0JCQkJCSBlcC0+bWVfdmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVwLT5tZV9rZXkgIT0gTlVMTCkgewkvKiBkdW1teSBlbnRyeSAqLwotCQkJLS1pOwotCQkJYXNzZXJ0KGVwLT5tZV9rZXkgPT0gZHVtbXkpOwotCQkJUHlfREVDUkVGKGVwLT5tZV9rZXkpOwotCQl9Ci0JCS8qIGVsc2Uga2V5ID09IHZhbHVlID09IE5VTEw6ICBub3RoaW5nIHRvIGRvICovCi0JfQorICAgIC8qIENvcHkgdGhlIGRhdGEgb3ZlcjsgdGhpcyBpcyByZWZjb3VudC1uZXV0cmFsIGZvciBhY3RpdmUgZW50cmllczsKKyAgICAgICBkdW1teSBlbnRyaWVzIGFyZW4ndCBjb3BpZWQgb3Zlciwgb2YgY291cnNlICovCisgICAgZm9yIChlcCA9IG9sZHRhYmxlOyBpID4gMDsgZXArKykgeworICAgICAgICBpZiAoZXAtPm1lX3ZhbHVlICE9IE5VTEwpIHsgICAgICAgICAgICAgLyogYWN0aXZlIGVudHJ5ICovCisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBpbnNlcnRkaWN0X2NsZWFuKG1wLCBlcC0+bWVfa2V5LCAobG9uZyllcC0+bWVfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXAtPm1lX3ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlcC0+bWVfa2V5ICE9IE5VTEwpIHsgICAgICAgICAgLyogZHVtbXkgZW50cnkgKi8KKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgIGFzc2VydChlcC0+bWVfa2V5ID09IGR1bW15KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlcC0+bWVfa2V5KTsKKyAgICAgICAgfQorICAgICAgICAvKiBlbHNlIGtleSA9PSB2YWx1ZSA9PSBOVUxMOiAgbm90aGluZyB0byBkbyAqLworICAgIH0KIAotCWlmIChpc19vbGR0YWJsZV9tYWxsb2NlZCkKLQkJUHlNZW1fREVMKG9sZHRhYmxlKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoaXNfb2xkdGFibGVfbWFsbG9jZWQpCisgICAgICAgIFB5TWVtX0RFTChvbGR0YWJsZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBkaWN0aW9uYXJ5IHByZS1zaXplZCB0byBob2xkIGFuIGVzdGltYXRlZCBudW1iZXIgb2YgZWxlbWVudHMuCkBAIC02NzQsMTMgKzY3NCwxMyBAQAogUHlPYmplY3QgKgogX1B5RGljdF9OZXdQcmVzaXplZChQeV9zc2l6ZV90IG1pbnVzZWQpCiB7Ci0JUHlPYmplY3QgKm9wID0gUHlEaWN0X05ldygpOworICAgIFB5T2JqZWN0ICpvcCA9IFB5RGljdF9OZXcoKTsKIAotCWlmIChtaW51c2VkPjUgJiYgb3AgIT0gTlVMTCAmJiBkaWN0cmVzaXplKChQeURpY3RPYmplY3QgKilvcCwgbWludXNlZCkgPT0gLTEpIHsKLQkJUHlfREVDUkVGKG9wKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBvcDsKKyAgICBpZiAobWludXNlZD41ICYmIG9wICE9IE5VTEwgJiYgZGljdHJlc2l6ZSgoUHlEaWN0T2JqZWN0ICopb3AsIG1pbnVzZWQpID09IC0xKSB7CisgICAgICAgIFB5X0RFQ1JFRihvcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gb3A7CiB9CiAKIC8qIE5vdGUgdGhhdCwgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgUHlEaWN0X0dldEl0ZW0oKSBzdXBwcmVzc2VzIGFsbCBlcnJvcnMKQEAgLTY5Niw0NiArNjk2LDQ2IEBACiBQeU9iamVjdCAqCiBQeURpY3RfR2V0SXRlbShQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICprZXkpCiB7Ci0JbG9uZyBoYXNoOwotCVB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7Ci0JUHlEaWN0RW50cnkgKmVwOwotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKLQlpZiAoIVB5RGljdF9DaGVjayhvcCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8Ci0JICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpCi0JewotCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCQlpZiAoaGFzaCA9PSAtMSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGxvbmcgaGFzaDsKKyAgICBQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKW9wOworICAgIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKQorICAgIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIFdlIGNhbiBhcnJpdmUgaGVyZSB3aXRoIGEgTlVMTCB0c3RhdGUgZHVyaW5nIGluaXRpYWxpemF0aW9uOiB0cnkKLQkgICBydW5uaW5nICJweXRob24gLVdpIiBmb3IgYW4gZXhhbXBsZSByZWxhdGVkIHRvIHN0cmluZyBpbnRlcm5pbmcuCi0JICAgTGV0J3MganVzdCBob3BlIHRoYXQgbm8gZXhjZXB0aW9uIG9jY3VycyB0aGVuLi4uICBUaGlzIG11c3QgYmUKLQkgICBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50IGFuZCBub3QgUHlUaHJlYWRTdGF0ZV9HRVQoKSBiZWNhdXNlIGluIGRlYnVnCi0JICAgbW9kZSwgdGhlIGxhdHRlciBjb21wbGFpbnMgaWYgdHN0YXRlIGlzIE5VTEwuICovCi0JdHN0YXRlID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKLQlpZiAodHN0YXRlICE9IE5VTEwgJiYgdHN0YXRlLT5jdXJleGNfdHlwZSAhPSBOVUxMKSB7Ci0JCS8qIHByZXNlcnZlIHRoZSBleGlzdGluZyBleGNlcHRpb24gKi8KLQkJUHlPYmplY3QgKmVycl90eXBlLCAqZXJyX3ZhbHVlLCAqZXJyX3RiOwotCQlQeUVycl9GZXRjaCgmZXJyX3R5cGUsICZlcnJfdmFsdWUsICZlcnJfdGIpOwotCQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQkJLyogaWdub3JlIGVycm9ycyAqLwotCQlQeUVycl9SZXN0b3JlKGVycl90eXBlLCBlcnJfdmFsdWUsIGVycl90Yik7Ci0JCWlmIChlcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQkJaWYgKGVwID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gZXAtPm1lX3ZhbHVlOworICAgIC8qIFdlIGNhbiBhcnJpdmUgaGVyZSB3aXRoIGEgTlVMTCB0c3RhdGUgZHVyaW5nIGluaXRpYWxpemF0aW9uOiB0cnkKKyAgICAgICBydW5uaW5nICJweXRob24gLVdpIiBmb3IgYW4gZXhhbXBsZSByZWxhdGVkIHRvIHN0cmluZyBpbnRlcm5pbmcuCisgICAgICAgTGV0J3MganVzdCBob3BlIHRoYXQgbm8gZXhjZXB0aW9uIG9jY3VycyB0aGVuLi4uICBUaGlzIG11c3QgYmUKKyAgICAgICBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50IGFuZCBub3QgUHlUaHJlYWRTdGF0ZV9HRVQoKSBiZWNhdXNlIGluIGRlYnVnCisgICAgICAgbW9kZSwgdGhlIGxhdHRlciBjb21wbGFpbnMgaWYgdHN0YXRlIGlzIE5VTEwuICovCisgICAgdHN0YXRlID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKKyAgICBpZiAodHN0YXRlICE9IE5VTEwgJiYgdHN0YXRlLT5jdXJleGNfdHlwZSAhPSBOVUxMKSB7CisgICAgICAgIC8qIHByZXNlcnZlIHRoZSBleGlzdGluZyBleGNlcHRpb24gKi8KKyAgICAgICAgUHlPYmplY3QgKmVycl90eXBlLCAqZXJyX3ZhbHVlLCAqZXJyX3RiOworICAgICAgICBQeUVycl9GZXRjaCgmZXJyX3R5cGUsICZlcnJfdmFsdWUsICZlcnJfdGIpOworICAgICAgICBlcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKKyAgICAgICAgLyogaWdub3JlIGVycm9ycyAqLworICAgICAgICBQeUVycl9SZXN0b3JlKGVycl90eXBlLCBlcnJfdmFsdWUsIGVycl90Yik7CisgICAgICAgIGlmIChlcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKKyAgICAgICAgaWYgKGVwID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXAtPm1lX3ZhbHVlOwogfQogCiAvKiBDQVVUSU9OOiBQeURpY3RfU2V0SXRlbSgpIG11c3QgZ3VhcmFudGVlIHRoYXQgaXQgd29uJ3QgcmVzaXplIHRoZQpAQCAtNzQ3LDE1NyArNzQ3LDE1NyBAQAogaW50CiBQeURpY3RfU2V0SXRlbShyZWdpc3RlciBQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wOwotCXJlZ2lzdGVyIGxvbmcgaGFzaDsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IG5fdXNlZDsKKyAgICByZWdpc3RlciBQeURpY3RPYmplY3QgKm1wOworICAgIHJlZ2lzdGVyIGxvbmcgaGFzaDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IG5fdXNlZDsKIAotCWlmICghUHlEaWN0X0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlhc3NlcnQoa2V5KTsKLQlhc3NlcnQodmFsdWUpOwotCW1wID0gKFB5RGljdE9iamVjdCAqKW9wOwotCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KGtleSkpIHsKLQkJaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKilrZXkpLT5vYl9zaGFzaDsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCX0KLQllbHNlIHsKLQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWFzc2VydChtcC0+bWFfZmlsbCA8PSBtcC0+bWFfbWFzayk7ICAvKiBhdCBsZWFzdCBvbmUgZW1wdHkgc2xvdCAqLwotCW5fdXNlZCA9IG1wLT5tYV91c2VkOwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JUHlfSU5DUkVGKGtleSk7Ci0JaWYgKGluc2VydGRpY3QobXAsIGtleSwgaGFzaCwgdmFsdWUpICE9IDApCi0JCXJldHVybiAtMTsKLQkvKiBJZiB3ZSBhZGRlZCBhIGtleSwgd2UgY2FuIHNhZmVseSByZXNpemUuICBPdGhlcndpc2UganVzdCByZXR1cm4hCi0JICogSWYgZmlsbCA+PSAyLzMgc2l6ZSwgYWRqdXN0IHNpemUuICBOb3JtYWxseSwgdGhpcyBkb3VibGVzIG9yCi0JICogcXVhZHVwbGVzIHRoZSBzaXplLCBidXQgaXQncyBhbHNvIHBvc3NpYmxlIGZvciB0aGUgZGljdCB0byBzaHJpbmsKLQkgKiAoaWYgbWFfZmlsbCBpcyBtdWNoIGxhcmdlciB0aGFuIG1hX3VzZWQsIG1lYW5pbmcgYSBsb3Qgb2YgZGljdAotCSAqIGtleXMgaGF2ZSBiZWVuICogZGVsZXRlZCkuCi0JICoKLQkgKiBRdWFkcnVwbGluZyB0aGUgc2l6ZSBpbXByb3ZlcyBhdmVyYWdlIGRpY3Rpb25hcnkgc3BhcnNlbmVzcwotCSAqIChyZWR1Y2luZyBjb2xsaXNpb25zKSBhdCB0aGUgY29zdCBvZiBzb21lIG1lbW9yeSBhbmQgaXRlcmF0aW9uCi0JICogc3BlZWQgKHdoaWNoIGxvb3BzIG92ZXIgZXZlcnkgcG9zc2libGUgZW50cnkpLiAgSXQgYWxzbyBoYWx2ZXMKLQkgKiB0aGUgbnVtYmVyIG9mIGV4cGVuc2l2ZSByZXNpemUgb3BlcmF0aW9ucyBpbiBhIGdyb3dpbmcgZGljdGlvbmFyeS4KLQkgKgotCSAqIFZlcnkgbGFyZ2UgZGljdGlvbmFyaWVzIChvdmVyIDUwSyBpdGVtcykgdXNlIGRvdWJsaW5nIGluc3RlYWQuCi0JICogVGhpcyBtYXkgaGVscCBhcHBsaWNhdGlvbnMgd2l0aCBzZXZlcmUgbWVtb3J5IGNvbnN0cmFpbnRzLgotCSAqLwotCWlmICghKG1wLT5tYV91c2VkID4gbl91c2VkICYmIG1wLT5tYV9maWxsKjMgPj0gKG1wLT5tYV9tYXNrKzEpKjIpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gZGljdHJlc2l6ZShtcCwgKG1wLT5tYV91c2VkID4gNTAwMDAgPyAyIDogNCkgKiBtcC0+bWFfdXNlZCk7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGFzc2VydChrZXkpOworICAgIGFzc2VydCh2YWx1ZSk7CisgICAgbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSkgeworICAgICAgICBoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKWtleSktPm9iX3NoYXNoOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXNzZXJ0KG1wLT5tYV9maWxsIDw9IG1wLT5tYV9tYXNrKTsgIC8qIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90ICovCisgICAgbl91c2VkID0gbXAtPm1hX3VzZWQ7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICBpZiAoaW5zZXJ0ZGljdChtcCwga2V5LCBoYXNoLCB2YWx1ZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIElmIHdlIGFkZGVkIGEga2V5LCB3ZSBjYW4gc2FmZWx5IHJlc2l6ZS4gIE90aGVyd2lzZSBqdXN0IHJldHVybiEKKyAgICAgKiBJZiBmaWxsID49IDIvMyBzaXplLCBhZGp1c3Qgc2l6ZS4gIE5vcm1hbGx5LCB0aGlzIGRvdWJsZXMgb3IKKyAgICAgKiBxdWFkdXBsZXMgdGhlIHNpemUsIGJ1dCBpdCdzIGFsc28gcG9zc2libGUgZm9yIHRoZSBkaWN0IHRvIHNocmluaworICAgICAqIChpZiBtYV9maWxsIGlzIG11Y2ggbGFyZ2VyIHRoYW4gbWFfdXNlZCwgbWVhbmluZyBhIGxvdCBvZiBkaWN0CisgICAgICoga2V5cyBoYXZlIGJlZW4gKiBkZWxldGVkKS4KKyAgICAgKgorICAgICAqIFF1YWRydXBsaW5nIHRoZSBzaXplIGltcHJvdmVzIGF2ZXJhZ2UgZGljdGlvbmFyeSBzcGFyc2VuZXNzCisgICAgICogKHJlZHVjaW5nIGNvbGxpc2lvbnMpIGF0IHRoZSBjb3N0IG9mIHNvbWUgbWVtb3J5IGFuZCBpdGVyYXRpb24KKyAgICAgKiBzcGVlZCAod2hpY2ggbG9vcHMgb3ZlciBldmVyeSBwb3NzaWJsZSBlbnRyeSkuICBJdCBhbHNvIGhhbHZlcworICAgICAqIHRoZSBudW1iZXIgb2YgZXhwZW5zaXZlIHJlc2l6ZSBvcGVyYXRpb25zIGluIGEgZ3Jvd2luZyBkaWN0aW9uYXJ5LgorICAgICAqCisgICAgICogVmVyeSBsYXJnZSBkaWN0aW9uYXJpZXMgKG92ZXIgNTBLIGl0ZW1zKSB1c2UgZG91YmxpbmcgaW5zdGVhZC4KKyAgICAgKiBUaGlzIG1heSBoZWxwIGFwcGxpY2F0aW9ucyB3aXRoIHNldmVyZSBtZW1vcnkgY29uc3RyYWludHMuCisgICAgICovCisgICAgaWYgKCEobXAtPm1hX3VzZWQgPiBuX3VzZWQgJiYgbXAtPm1hX2ZpbGwqMyA+PSAobXAtPm1hX21hc2srMSkqMikpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBkaWN0cmVzaXplKG1wLCAobXAtPm1hX3VzZWQgPiA1MDAwMCA/IDIgOiA0KSAqIG1wLT5tYV91c2VkKTsKIH0KIAogaW50CiBQeURpY3RfRGVsSXRlbShQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICprZXkpCiB7Ci0JcmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcDsKLQlyZWdpc3RlciBsb25nIGhhc2g7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwotCVB5T2JqZWN0ICpvbGRfdmFsdWUsICpvbGRfa2V5OworICAgIHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXA7CisgICAgcmVnaXN0ZXIgbG9uZyBoYXNoOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeU9iamVjdCAqb2xkX3ZhbHVlLCAqb2xkX2tleTsKIAotCWlmICghUHlEaWN0X0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlhc3NlcnQoa2V5KTsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQltcCA9IChQeURpY3RPYmplY3QgKilvcDsKLQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQlpZiAoZXAgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChlcC0+bWVfdmFsdWUgPT0gTlVMTCkgewotCQlzZXRfa2V5X2Vycm9yKGtleSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jb2xkX2tleSA9IGVwLT5tZV9rZXk7Ci0JUHlfSU5DUkVGKGR1bW15KTsKLQllcC0+bWVfa2V5ID0gZHVtbXk7Ci0Jb2xkX3ZhbHVlID0gZXAtPm1lX3ZhbHVlOwotCWVwLT5tZV92YWx1ZSA9IE5VTEw7Ci0JbXAtPm1hX3VzZWQtLTsKLQlQeV9ERUNSRUYob2xkX3ZhbHVlKTsKLQlQeV9ERUNSRUYob2xkX2tleSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGFzc2VydChrZXkpOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1wID0gKFB5RGljdE9iamVjdCAqKW9wOworICAgIGVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOworICAgIGlmIChlcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGVwLT5tZV92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHNldF9rZXlfZXJyb3Ioa2V5KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBvbGRfa2V5ID0gZXAtPm1lX2tleTsKKyAgICBQeV9JTkNSRUYoZHVtbXkpOworICAgIGVwLT5tZV9rZXkgPSBkdW1teTsKKyAgICBvbGRfdmFsdWUgPSBlcC0+bWVfdmFsdWU7CisgICAgZXAtPm1lX3ZhbHVlID0gTlVMTDsKKyAgICBtcC0+bWFfdXNlZC0tOworICAgIFB5X0RFQ1JFRihvbGRfdmFsdWUpOworICAgIFB5X0RFQ1JFRihvbGRfa2V5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogdm9pZAogUHlEaWN0X0NsZWFyKFB5T2JqZWN0ICpvcCkKIHsKLQlQeURpY3RPYmplY3QgKm1wOwotCVB5RGljdEVudHJ5ICplcCwgKnRhYmxlOwotCWludCB0YWJsZV9pc19tYWxsb2NlZDsKLQlQeV9zc2l6ZV90IGZpbGw7Ci0JUHlEaWN0RW50cnkgc21hbGxfY29weVtQeURpY3RfTUlOU0laRV07CisgICAgUHlEaWN0T2JqZWN0ICptcDsKKyAgICBQeURpY3RFbnRyeSAqZXAsICp0YWJsZTsKKyAgICBpbnQgdGFibGVfaXNfbWFsbG9jZWQ7CisgICAgUHlfc3NpemVfdCBmaWxsOworICAgIFB5RGljdEVudHJ5IHNtYWxsX2NvcHlbUHlEaWN0X01JTlNJWkVdOwogI2lmZGVmIFB5X0RFQlVHCi0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5X3NzaXplX3QgaSwgbjsKICNlbmRpZgogCi0JaWYgKCFQeURpY3RfQ2hlY2sob3ApKQotCQlyZXR1cm47Ci0JbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm47CisgICAgbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7CiAjaWZkZWYgUHlfREVCVUcKLQluID0gbXAtPm1hX21hc2sgKyAxOwotCWkgPSAwOworICAgIG4gPSBtcC0+bWFfbWFzayArIDE7CisgICAgaSA9IDA7CiAjZW5kaWYKIAotCXRhYmxlID0gbXAtPm1hX3RhYmxlOwotCWFzc2VydCh0YWJsZSAhPSBOVUxMKTsKLQl0YWJsZV9pc19tYWxsb2NlZCA9IHRhYmxlICE9IG1wLT5tYV9zbWFsbHRhYmxlOworICAgIHRhYmxlID0gbXAtPm1hX3RhYmxlOworICAgIGFzc2VydCh0YWJsZSAhPSBOVUxMKTsKKyAgICB0YWJsZV9pc19tYWxsb2NlZCA9IHRhYmxlICE9IG1wLT5tYV9zbWFsbHRhYmxlOwogCi0JLyogVGhpcyBpcyBkZWxpY2F0ZS4gIER1cmluZyB0aGUgcHJvY2VzcyBvZiBjbGVhcmluZyB0aGUgZGljdCwKLQkgKiBkZWNyZWZzIGNhbiBjYXVzZSB0aGUgZGljdCB0byBtdXRhdGUuICBUbyBhdm9pZCBmYXRhbCBjb25mdXNpb24KLQkgKiAodm9pY2Ugb2YgZXhwZXJpZW5jZSksIHdlIGhhdmUgdG8gbWFrZSB0aGUgZGljdCBlbXB0eSBiZWZvcmUKLQkgKiBjbGVhcmluZyB0aGUgc2xvdHMsIGFuZCBuZXZlciByZWZlciB0byBhbnl0aGluZyB2aWEgbXAtPnh4eCB3aGlsZQotCSAqIGNsZWFyaW5nLgotCSAqLwotCWZpbGwgPSBtcC0+bWFfZmlsbDsKLQlpZiAodGFibGVfaXNfbWFsbG9jZWQpCi0JCUVNUFRZX1RPX01JTlNJWkUobXApOworICAgIC8qIFRoaXMgaXMgZGVsaWNhdGUuICBEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgY2xlYXJpbmcgdGhlIGRpY3QsCisgICAgICogZGVjcmVmcyBjYW4gY2F1c2UgdGhlIGRpY3QgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uCisgICAgICogKHZvaWNlIG9mIGV4cGVyaWVuY2UpLCB3ZSBoYXZlIHRvIG1ha2UgdGhlIGRpY3QgZW1wdHkgYmVmb3JlCisgICAgICogY2xlYXJpbmcgdGhlIHNsb3RzLCBhbmQgbmV2ZXIgcmVmZXIgdG8gYW55dGhpbmcgdmlhIG1wLT54eHggd2hpbGUKKyAgICAgKiBjbGVhcmluZy4KKyAgICAgKi8KKyAgICBmaWxsID0gbXAtPm1hX2ZpbGw7CisgICAgaWYgKHRhYmxlX2lzX21hbGxvY2VkKQorICAgICAgICBFTVBUWV9UT19NSU5TSVpFKG1wKTsKIAotCWVsc2UgaWYgKGZpbGwgPiAwKSB7Ci0JCS8qIEl0J3MgYSBzbWFsbCB0YWJsZSB3aXRoIHNvbWV0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGNsZWFyZWQuCi0JCSAqIEFmcmFpZCB0aGUgb25seSBzYWZlIHdheSBpcyB0byBjb3B5IHRoZSBkaWN0IGVudHJpZXMgaW50bwotCQkgKiBhbm90aGVyIHNtYWxsIHRhYmxlIGZpcnN0LgotCQkgKi8KLQkJbWVtY3B5KHNtYWxsX2NvcHksIHRhYmxlLCBzaXplb2Yoc21hbGxfY29weSkpOwotCQl0YWJsZSA9IHNtYWxsX2NvcHk7Ci0JCUVNUFRZX1RPX01JTlNJWkUobXApOwotCX0KLQkvKiBlbHNlIGl0J3MgYSBzbWFsbCB0YWJsZSB0aGF0J3MgYWxyZWFkeSBlbXB0eSAqLworICAgIGVsc2UgaWYgKGZpbGwgPiAwKSB7CisgICAgICAgIC8qIEl0J3MgYSBzbWFsbCB0YWJsZSB3aXRoIHNvbWV0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGNsZWFyZWQuCisgICAgICAgICAqIEFmcmFpZCB0aGUgb25seSBzYWZlIHdheSBpcyB0byBjb3B5IHRoZSBkaWN0IGVudHJpZXMgaW50bworICAgICAgICAgKiBhbm90aGVyIHNtYWxsIHRhYmxlIGZpcnN0LgorICAgICAgICAgKi8KKyAgICAgICAgbWVtY3B5KHNtYWxsX2NvcHksIHRhYmxlLCBzaXplb2Yoc21hbGxfY29weSkpOworICAgICAgICB0YWJsZSA9IHNtYWxsX2NvcHk7CisgICAgICAgIEVNUFRZX1RPX01JTlNJWkUobXApOworICAgIH0KKyAgICAvKiBlbHNlIGl0J3MgYSBzbWFsbCB0YWJsZSB0aGF0J3MgYWxyZWFkeSBlbXB0eSAqLwogCi0JLyogTm93IHdlIGNhbiBmaW5hbGx5IGNsZWFyIHRoaW5ncy4gIElmIEMgaGFkIHJlZmNvdW50cywgd2UgY291bGQKLQkgKiBhc3NlcnQgdGhhdCB0aGUgcmVmY291bnQgb24gdGFibGUgaXMgMSBub3csIGkuZS4gdGhhdCB0aGlzIGZ1bmN0aW9uCi0JICogaGFzIHVuaXF1ZSBhY2Nlc3MgdG8gaXQsIHNvIGRlY3JlZiBzaWRlLWVmZmVjdHMgY2FuJ3QgYWx0ZXIgaXQuCi0JICovCi0JZm9yIChlcCA9IHRhYmxlOyBmaWxsID4gMDsgKytlcCkgeworICAgIC8qIE5vdyB3ZSBjYW4gZmluYWxseSBjbGVhciB0aGluZ3MuICBJZiBDIGhhZCByZWZjb3VudHMsIHdlIGNvdWxkCisgICAgICogYXNzZXJ0IHRoYXQgdGhlIHJlZmNvdW50IG9uIHRhYmxlIGlzIDEgbm93LCBpLmUuIHRoYXQgdGhpcyBmdW5jdGlvbgorICAgICAqIGhhcyB1bmlxdWUgYWNjZXNzIHRvIGl0LCBzbyBkZWNyZWYgc2lkZS1lZmZlY3RzIGNhbid0IGFsdGVyIGl0LgorICAgICAqLworICAgIGZvciAoZXAgPSB0YWJsZTsgZmlsbCA+IDA7ICsrZXApIHsKICNpZmRlZiBQeV9ERUJVRwotCQlhc3NlcnQoaSA8IG4pOwotCQkrK2k7CisgICAgICAgIGFzc2VydChpIDwgbik7CisgICAgICAgICsraTsKICNlbmRpZgotCQlpZiAoZXAtPm1lX2tleSkgewotCQkJLS1maWxsOwotCQkJUHlfREVDUkVGKGVwLT5tZV9rZXkpOwotCQkJUHlfWERFQ1JFRihlcC0+bWVfdmFsdWUpOwotCQl9CisgICAgICAgIGlmIChlcC0+bWVfa2V5KSB7CisgICAgICAgICAgICAtLWZpbGw7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXAtPm1lX2tleSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGVwLT5tZV92YWx1ZSk7CisgICAgICAgIH0KICNpZmRlZiBQeV9ERUJVRwotCQllbHNlCi0JCQlhc3NlcnQoZXAtPm1lX3ZhbHVlID09IE5VTEwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoZXAtPm1lX3ZhbHVlID09IE5VTEwpOwogI2VuZGlmCi0JfQorICAgIH0KIAotCWlmICh0YWJsZV9pc19tYWxsb2NlZCkKLQkJUHlNZW1fREVMKHRhYmxlKTsKKyAgICBpZiAodGFibGVfaXNfbWFsbG9jZWQpCisgICAgICAgIFB5TWVtX0RFTCh0YWJsZSk7CiB9CiAKIC8qCkBAIC05MTgsNTUgKzkxOCw1NSBAQAogaW50CiBQeURpY3RfTmV4dChQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgKnBwb3MsIFB5T2JqZWN0ICoqcGtleSwgUHlPYmplY3QgKipwdmFsdWUpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgbWFzazsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgbWFzazsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CiAKLQlpZiAoIVB5RGljdF9DaGVjayhvcCkpCi0JCXJldHVybiAwOwotCWkgPSAqcHBvczsKLQlpZiAoaSA8IDApCi0JCXJldHVybiAwOwotCWVwID0gKChQeURpY3RPYmplY3QgKilvcCktPm1hX3RhYmxlOwotCW1hc2sgPSAoKFB5RGljdE9iamVjdCAqKW9wKS0+bWFfbWFzazsKLQl3aGlsZSAoaSA8PSBtYXNrICYmIGVwW2ldLm1lX3ZhbHVlID09IE5VTEwpCi0JCWkrKzsKLQkqcHBvcyA9IGkrMTsKLQlpZiAoaSA+IG1hc2spCi0JCXJldHVybiAwOwotCWlmIChwa2V5KQotCQkqcGtleSA9IGVwW2ldLm1lX2tleTsKLQlpZiAocHZhbHVlKQotCQkqcHZhbHVlID0gZXBbaV0ubWVfdmFsdWU7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpID0gKnBwb3M7CisgICAgaWYgKGkgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlcCA9ICgoUHlEaWN0T2JqZWN0ICopb3ApLT5tYV90YWJsZTsKKyAgICBtYXNrID0gKChQeURpY3RPYmplY3QgKilvcCktPm1hX21hc2s7CisgICAgd2hpbGUgKGkgPD0gbWFzayAmJiBlcFtpXS5tZV92YWx1ZSA9PSBOVUxMKQorICAgICAgICBpKys7CisgICAgKnBwb3MgPSBpKzE7CisgICAgaWYgKGkgPiBtYXNrKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocGtleSkKKyAgICAgICAgKnBrZXkgPSBlcFtpXS5tZV9rZXk7CisgICAgaWYgKHB2YWx1ZSkKKyAgICAgICAgKnB2YWx1ZSA9IGVwW2ldLm1lX3ZhbHVlOworICAgIHJldHVybiAxOwogfQogCiAvKiBJbnRlcm5hbCB2ZXJzaW9uIG9mIFB5RGljdF9OZXh0IHRoYXQgcmV0dXJucyBhIGhhc2ggdmFsdWUgaW4gYWRkaXRpb24gdG8gdGhlIGtleSBhbmQgdmFsdWUuKi8KIGludAogX1B5RGljdF9OZXh0KFB5T2JqZWN0ICpvcCwgUHlfc3NpemVfdCAqcHBvcywgUHlPYmplY3QgKipwa2V5LCBQeU9iamVjdCAqKnB2YWx1ZSwgbG9uZyAqcGhhc2gpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgbWFzazsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgbWFzazsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CiAKLQlpZiAoIVB5RGljdF9DaGVjayhvcCkpCi0JCXJldHVybiAwOwotCWkgPSAqcHBvczsKLQlpZiAoaSA8IDApCi0JCXJldHVybiAwOwotCWVwID0gKChQeURpY3RPYmplY3QgKilvcCktPm1hX3RhYmxlOwotCW1hc2sgPSAoKFB5RGljdE9iamVjdCAqKW9wKS0+bWFfbWFzazsKLQl3aGlsZSAoaSA8PSBtYXNrICYmIGVwW2ldLm1lX3ZhbHVlID09IE5VTEwpCi0JCWkrKzsKLQkqcHBvcyA9IGkrMTsKLQlpZiAoaSA+IG1hc2spCi0JCXJldHVybiAwOwotICAgICAgICAqcGhhc2ggPSAobG9uZykoZXBbaV0ubWVfaGFzaCk7Ci0JaWYgKHBrZXkpCi0JCSpwa2V5ID0gZXBbaV0ubWVfa2V5OwotCWlmIChwdmFsdWUpCi0JCSpwdmFsdWUgPSBlcFtpXS5tZV92YWx1ZTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIVB5RGljdF9DaGVjayhvcCkpCisgICAgICAgIHJldHVybiAwOworICAgIGkgPSAqcHBvczsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIGVwID0gKChQeURpY3RPYmplY3QgKilvcCktPm1hX3RhYmxlOworICAgIG1hc2sgPSAoKFB5RGljdE9iamVjdCAqKW9wKS0+bWFfbWFzazsKKyAgICB3aGlsZSAoaSA8PSBtYXNrICYmIGVwW2ldLm1lX3ZhbHVlID09IE5VTEwpCisgICAgICAgIGkrKzsKKyAgICAqcHBvcyA9IGkrMTsKKyAgICBpZiAoaSA+IG1hc2spCisgICAgICAgIHJldHVybiAwOworICAgICpwaGFzaCA9IChsb25nKShlcFtpXS5tZV9oYXNoKTsKKyAgICBpZiAocGtleSkKKyAgICAgICAgKnBrZXkgPSBlcFtpXS5tZV9rZXk7CisgICAgaWYgKHB2YWx1ZSkKKyAgICAgICAgKnB2YWx1ZSA9IGVwW2ldLm1lX3ZhbHVlOworICAgIHJldHVybiAxOwogfQogCiAvKiBNZXRob2RzICovCkBAIC05NzQsNDU2ICs5NzQsNDU2IEBACiBzdGF0aWMgdm9pZAogZGljdF9kZWFsbG9jKHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXApCiB7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwotCVB5X3NzaXplX3QgZmlsbCA9IG1wLT5tYV9maWxsOwotIAlQeU9iamVjdF9HQ19VblRyYWNrKG1wKTsKLQlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG1wKQotCWZvciAoZXAgPSBtcC0+bWFfdGFibGU7IGZpbGwgPiAwOyBlcCsrKSB7Ci0JCWlmIChlcC0+bWVfa2V5KSB7Ci0JCQktLWZpbGw7Ci0JCQlQeV9ERUNSRUYoZXAtPm1lX2tleSk7Ci0JCQlQeV9YREVDUkVGKGVwLT5tZV92YWx1ZSk7Ci0JCX0KLQl9Ci0JaWYgKG1wLT5tYV90YWJsZSAhPSBtcC0+bWFfc21hbGx0YWJsZSkKLQkJUHlNZW1fREVMKG1wLT5tYV90YWJsZSk7Ci0JaWYgKG51bWZyZWUgPCBQeURpY3RfTUFYRlJFRUxJU1QgJiYgUHlfVFlQRShtcCkgPT0gJlB5RGljdF9UeXBlKQotCQlmcmVlX2xpc3RbbnVtZnJlZSsrXSA9IG1wOwotCWVsc2UKLQkJUHlfVFlQRShtcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopbXApOwotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKG1wKQorICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeV9zc2l6ZV90IGZpbGwgPSBtcC0+bWFfZmlsbDsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKG1wKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG1wKQorICAgIGZvciAoZXAgPSBtcC0+bWFfdGFibGU7IGZpbGwgPiAwOyBlcCsrKSB7CisgICAgICAgIGlmIChlcC0+bWVfa2V5KSB7CisgICAgICAgICAgICAtLWZpbGw7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXAtPm1lX2tleSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGVwLT5tZV92YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1wLT5tYV90YWJsZSAhPSBtcC0+bWFfc21hbGx0YWJsZSkKKyAgICAgICAgUHlNZW1fREVMKG1wLT5tYV90YWJsZSk7CisgICAgaWYgKG51bWZyZWUgPCBQeURpY3RfTUFYRlJFRUxJU1QgJiYgUHlfVFlQRShtcCkgPT0gJlB5RGljdF9UeXBlKQorICAgICAgICBmcmVlX2xpc3RbbnVtZnJlZSsrXSA9IG1wOworICAgIGVsc2UKKyAgICAgICAgUHlfVFlQRShtcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopbXApOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKG1wKQogfQogCiBzdGF0aWMgaW50CiBkaWN0X3ByaW50KHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsIHJlZ2lzdGVyIEZJTEUgKmZwLCByZWdpc3RlciBpbnQgZmxhZ3MpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgYW55OwotCWludCBzdGF0dXM7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgYW55OworICAgIGludCBzdGF0dXM7CiAKLQlzdGF0dXMgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0KiltcCk7Ci0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlmcHJpbnRmKGZwLCAiey4uLn0iKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJcmV0dXJuIDA7Ci0JfQorICAgIHN0YXR1cyA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKW1wKTsKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGZwcmludGYoZnAsICJ7Li4ufSIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnByaW50ZihmcCwgInsiKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWFueSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8PSBtcC0+bWFfbWFzazsgaSsrKSB7Ci0JCVB5RGljdEVudHJ5ICplcCA9IG1wLT5tYV90YWJsZSArIGk7Ci0JCVB5T2JqZWN0ICpwdmFsdWUgPSBlcC0+bWVfdmFsdWU7Ci0JCWlmIChwdmFsdWUgIT0gTlVMTCkgewotCQkJLyogUHJldmVudCBQeU9iamVjdF9SZXByIGZyb20gZGVsZXRpbmcgdmFsdWUgZHVyaW5nCi0JCQkgICBrZXkgZm9ybWF0ICovCi0JCQlQeV9JTkNSRUYocHZhbHVlKTsKLQkJCWlmIChhbnkrKyA+IDApIHsKLQkJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQkJZnByaW50ZihmcCwgIiwgIik7Ci0JCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJCX0KLQkJCWlmIChQeU9iamVjdF9QcmludCgoUHlPYmplY3QgKillcC0+bWVfa2V5LCBmcCwgMCkhPTApIHsKLQkJCQlQeV9ERUNSRUYocHZhbHVlKTsKLQkJCQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0KiltcCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkJZnByaW50ZihmcCwgIjogIik7Ci0JCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkJaWYgKFB5T2JqZWN0X1ByaW50KHB2YWx1ZSwgZnAsIDApICE9IDApIHsKLQkJCQlQeV9ERUNSRUYocHZhbHVlKTsKLQkJCQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0KiltcCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJUHlfREVDUkVGKHB2YWx1ZSk7Ci0JCX0KLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICJ9Iik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0KiltcCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICJ7Iik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBhbnkgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPD0gbXAtPm1hX21hc2s7IGkrKykgeworICAgICAgICBQeURpY3RFbnRyeSAqZXAgPSBtcC0+bWFfdGFibGUgKyBpOworICAgICAgICBQeU9iamVjdCAqcHZhbHVlID0gZXAtPm1lX3ZhbHVlOworICAgICAgICBpZiAocHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIFByZXZlbnQgUHlPYmplY3RfUmVwciBmcm9tIGRlbGV0aW5nIHZhbHVlIGR1cmluZworICAgICAgICAgICAgICAga2V5IGZvcm1hdCAqLworICAgICAgICAgICAgUHlfSU5DUkVGKHB2YWx1ZSk7CisgICAgICAgICAgICBpZiAoYW55KysgPiAwKSB7CisgICAgICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIsICIpOworICAgICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlPYmplY3RfUHJpbnQoKFB5T2JqZWN0ICopZXAtPm1lX2tleSwgZnAsIDApIT0wKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHB2YWx1ZSk7CisgICAgICAgICAgICAgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCopbXApOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGZwcmludGYoZnAsICI6ICIpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9QcmludChwdmFsdWUsIGZwLCAwKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHB2YWx1ZSk7CisgICAgICAgICAgICAgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCopbXApOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihwdmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmcHJpbnRmKGZwLCAifSIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCopbXApOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9yZXByKFB5RGljdE9iamVjdCAqbXApCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICpzLCAqdGVtcCwgKmNvbG9uID0gTlVMTDsKLQlQeU9iamVjdCAqcGllY2VzID0gTlVMTCwgKnJlc3VsdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcywgKnRlbXAsICpjb2xvbiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnBpZWNlcyA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZTsKIAotCWkgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0ICopbXApOwotCWlmIChpICE9IDApIHsKLQkJcmV0dXJuIGkgPiAwID8gUHlTdHJpbmdfRnJvbVN0cmluZygiey4uLn0iKSA6IE5VTEw7Ci0JfQorICAgIGkgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0ICopbXApOworICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGkgPiAwID8gUHlTdHJpbmdfRnJvbVN0cmluZygiey4uLn0iKSA6IE5VTEw7CisgICAgfQogCi0JaWYgKG1wLT5tYV91c2VkID09IDApIHsKLQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygie30iKTsKLQkJZ290byBEb25lOwotCX0KKyAgICBpZiAobXAtPm1hX3VzZWQgPT0gMCkgeworICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJ7fSIpOworICAgICAgICBnb3RvIERvbmU7CisgICAgfQogCi0JcGllY2VzID0gUHlMaXN0X05ldygwKTsKLQlpZiAocGllY2VzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICBwaWVjZXMgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChwaWVjZXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JY29sb24gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI6ICIpOwotCWlmIChjb2xvbiA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgY29sb24gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI6ICIpOworICAgIGlmIChjb2xvbiA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQkvKiBEbyByZXByKCkgb24gZWFjaCBrZXkrdmFsdWUgcGFpciwgYW5kIGluc2VydCAiOiAiIGJldHdlZW4gdGhlbS4KLQkgICBOb3RlIHRoYXQgcmVwciBtYXkgbXV0YXRlIHRoZSBkaWN0LiAqLwotCWkgPSAwOwotCXdoaWxlIChQeURpY3RfTmV4dCgoUHlPYmplY3QgKiltcCwgJmksICZrZXksICZ2YWx1ZSkpIHsKLQkJaW50IHN0YXR1czsKLQkJLyogUHJldmVudCByZXByIGZyb20gZGVsZXRpbmcgdmFsdWUgZHVyaW5nIGtleSBmb3JtYXQuICovCi0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCXMgPSBQeU9iamVjdF9SZXByKGtleSk7Ci0JCVB5U3RyaW5nX0NvbmNhdCgmcywgY29sb24pOwotCQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5T2JqZWN0X1JlcHIodmFsdWUpKTsKLQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJCWdvdG8gRG9uZTsKLQkJc3RhdHVzID0gUHlMaXN0X0FwcGVuZChwaWVjZXMsIHMpOwotCQlQeV9ERUNSRUYocyk7ICAvKiBhcHBlbmQgY3JlYXRlZCBhIG5ldyByZWYgKi8KLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlnb3RvIERvbmU7Ci0JfQorICAgIC8qIERvIHJlcHIoKSBvbiBlYWNoIGtleSt2YWx1ZSBwYWlyLCBhbmQgaW5zZXJ0ICI6ICIgYmV0d2VlbiB0aGVtLgorICAgICAgIE5vdGUgdGhhdCByZXByIG1heSBtdXRhdGUgdGhlIGRpY3QuICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KChQeU9iamVjdCAqKW1wLCAmaSwgJmtleSwgJnZhbHVlKSkgeworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICAvKiBQcmV2ZW50IHJlcHIgZnJvbSBkZWxldGluZyB2YWx1ZSBkdXJpbmcga2V5IGZvcm1hdC4gKi8KKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcyA9IFB5T2JqZWN0X1JlcHIoa2V5KTsKKyAgICAgICAgUHlTdHJpbmdfQ29uY2F0KCZzLCBjb2xvbik7CisgICAgICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlPYmplY3RfUmVwcih2YWx1ZSkpOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICBzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKHBpZWNlcywgcyk7CisgICAgICAgIFB5X0RFQ1JFRihzKTsgIC8qIGFwcGVuZCBjcmVhdGVkIGEgbmV3IHJlZiAqLworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CiAKLQkvKiBBZGQgInt9IiBkZWNvcmF0aW9ucyB0byB0aGUgZmlyc3QgYW5kIGxhc3QgaXRlbXMuICovCi0JYXNzZXJ0KFB5TGlzdF9HRVRfU0laRShwaWVjZXMpID4gMCk7Ci0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoInsiKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JdGVtcCA9IFB5TGlzdF9HRVRfSVRFTShwaWVjZXMsIDApOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgdGVtcCk7Ci0JUHlMaXN0X1NFVF9JVEVNKHBpZWNlcywgMCwgcyk7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIC8qIEFkZCAie30iIGRlY29yYXRpb25zIHRvIHRoZSBmaXJzdCBhbmQgbGFzdCBpdGVtcy4gKi8KKyAgICBhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgPiAwKTsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZygieyIpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB0ZW1wID0gUHlMaXN0X0dFVF9JVEVNKHBpZWNlcywgMCk7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCB0ZW1wKTsKKyAgICBQeUxpc3RfU0VUX0lURU0ocGllY2VzLCAwLCBzKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZygifSIpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl0ZW1wID0gUHlMaXN0X0dFVF9JVEVNKHBpZWNlcywgUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgLSAxKTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnRlbXAsIHMpOwotCVB5TGlzdF9TRVRfSVRFTShwaWVjZXMsIFB5TGlzdF9HRVRfU0laRShwaWVjZXMpIC0gMSwgdGVtcCk7Ci0JaWYgKHRlbXAgPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJ9Iik7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHRlbXAgPSBQeUxpc3RfR0VUX0lURU0ocGllY2VzLCBQeUxpc3RfR0VUX1NJWkUocGllY2VzKSAtIDEpOworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmdGVtcCwgcyk7CisgICAgUHlMaXN0X1NFVF9JVEVNKHBpZWNlcywgUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgLSAxLCB0ZW1wKTsKKyAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQkvKiBQYXN0ZSB0aGVtIGFsbCB0b2dldGhlciB3aXRoICIsICIgYmV0d2Vlbi4gKi8KLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLCAiKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JcmVzdWx0ID0gX1B5U3RyaW5nX0pvaW4ocywgcGllY2VzKTsKLQlQeV9ERUNSRUYocyk7CisgICAgLyogUGFzdGUgdGhlbSBhbGwgdG9nZXRoZXIgd2l0aCAiLCAiIGJldHdlZW4uICovCisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwgIik7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHJlc3VsdCA9IF9QeVN0cmluZ19Kb2luKHMsIHBpZWNlcyk7CisgICAgUHlfREVDUkVGKHMpOwogCiBEb25lOgotCVB5X1hERUNSRUYocGllY2VzKTsKLQlQeV9YREVDUkVGKGNvbG9uKTsKLQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopbXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihwaWVjZXMpOworICAgIFB5X1hERUNSRUYoY29sb24pOworICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QgKiltcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGRpY3RfbGVuZ3RoKFB5RGljdE9iamVjdCAqbXApCiB7Ci0JcmV0dXJuIG1wLT5tYV91c2VkOworICAgIHJldHVybiBtcC0+bWFfdXNlZDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3Rfc3Vic2NyaXB0KFB5RGljdE9iamVjdCAqbXAsIHJlZ2lzdGVyIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JbG9uZyBoYXNoOwotCVB5RGljdEVudHJ5ICplcDsKLQlhc3NlcnQobXAtPm1hX3RhYmxlICE9IE5VTEwpOwotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8Ci0JICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKLQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7Ci0JaWYgKGVwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXYgPSBlcC0+bWVfdmFsdWU7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlpZiAoIVB5RGljdF9DaGVja0V4YWN0KG1wKSkgewotCQkJLyogTG9vayB1cCBfX21pc3NpbmdfXyBtZXRob2QgaWYgd2UncmUgYSBzdWJjbGFzcy4gKi8KLQkJICAgIAlQeU9iamVjdCAqbWlzc2luZywgKnJlczsKLQkJCXN0YXRpYyBQeU9iamVjdCAqbWlzc2luZ19zdHIgPSBOVUxMOwotCQkJbWlzc2luZyA9IF9QeU9iamVjdF9Mb29rdXBTcGVjaWFsKChQeU9iamVjdCAqKW1wLAotCQkJCQkJCSAgIl9fbWlzc2luZ19fIiwKLQkJCQkJCQkgICZtaXNzaW5nX3N0cik7Ci0JCQlpZiAobWlzc2luZyAhPSBOVUxMKSB7Ci0JCQkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtaXNzaW5nLAotCQkJCQkJCQkgICBrZXksIE5VTEwpOwotCQkJCVB5X0RFQ1JFRihtaXNzaW5nKTsKLQkJCQlyZXR1cm4gcmVzOwotCQkJfQotCQkJZWxzZSBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzZXRfa2V5X2Vycm9yKGtleSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRih2KTsKLQlyZXR1cm4gdjsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBsb25nIGhhc2g7CisgICAgUHlEaWN0RW50cnkgKmVwOworICAgIGFzc2VydChtcC0+bWFfdGFibGUgIT0gTlVMTCk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKKyAgICAgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKKyAgICBpZiAoZXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdiA9IGVwLT5tZV92YWx1ZTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlEaWN0X0NoZWNrRXhhY3QobXApKSB7CisgICAgICAgICAgICAvKiBMb29rIHVwIF9fbWlzc2luZ19fIG1ldGhvZCBpZiB3ZSdyZSBhIHN1YmNsYXNzLiAqLworICAgICAgICAgICAgUHlPYmplY3QgKm1pc3NpbmcsICpyZXM7CisgICAgICAgICAgICBzdGF0aWMgUHlPYmplY3QgKm1pc3Npbmdfc3RyID0gTlVMTDsKKyAgICAgICAgICAgIG1pc3NpbmcgPSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbCgoUHlPYmplY3QgKiltcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19taXNzaW5nX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaXNzaW5nX3N0cik7CisgICAgICAgICAgICBpZiAobWlzc2luZyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtaXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCBOVUxMKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWlzc2luZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2V0X2tleV9lcnJvcihrZXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYodik7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBpbnQKIGRpY3RfYXNzX3N1YihQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JaWYgKHcgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RGljdF9EZWxJdGVtKChQeU9iamVjdCAqKW1wLCB2KTsKLQllbHNlCi0JCXJldHVybiBQeURpY3RfU2V0SXRlbSgoUHlPYmplY3QgKiltcCwgdiwgdyk7CisgICAgaWYgKHcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RGljdF9EZWxJdGVtKChQeU9iamVjdCAqKW1wLCB2KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeURpY3RfU2V0SXRlbSgoUHlPYmplY3QgKiltcCwgdiwgdyk7CiB9CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIGRpY3RfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYylkaWN0X2xlbmd0aCwgLyptcF9sZW5ndGgqLwotCShiaW5hcnlmdW5jKWRpY3Rfc3Vic2NyaXB0LCAvKm1wX3N1YnNjcmlwdCovCi0JKG9iam9iamFyZ3Byb2MpZGljdF9hc3Nfc3ViLCAvKm1wX2Fzc19zdWJzY3JpcHQqLworICAgIChsZW5mdW5jKWRpY3RfbGVuZ3RoLCAvKm1wX2xlbmd0aCovCisgICAgKGJpbmFyeWZ1bmMpZGljdF9zdWJzY3JpcHQsIC8qbXBfc3Vic2NyaXB0Ki8KKyAgICAob2Jqb2JqYXJncHJvYylkaWN0X2Fzc19zdWIsIC8qbXBfYXNzX3N1YnNjcmlwdCovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9rZXlzKHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXApCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKnY7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqOwotCVB5RGljdEVudHJ5ICplcDsKLQlQeV9zc2l6ZV90IG1hc2ssIG47CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnY7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqOworICAgIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeV9zc2l6ZV90IG1hc2ssIG47CiAKICAgYWdhaW46Ci0JbiA9IG1wLT5tYV91c2VkOwotCXYgPSBQeUxpc3RfTmV3KG4pOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChuICE9IG1wLT5tYV91c2VkKSB7Ci0JCS8qIER1cm5pdC4gIFRoZSBhbGxvY2F0aW9ucyBjYXVzZWQgdGhlIGRpY3QgdG8gcmVzaXplLgotCQkgKiBKdXN0IHN0YXJ0IG92ZXIsIHRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi4KLQkJICovCi0JCVB5X0RFQ1JFRih2KTsKLQkJZ290byBhZ2FpbjsKLQl9Ci0JZXAgPSBtcC0+bWFfdGFibGU7Ci0JbWFzayA9IG1wLT5tYV9tYXNrOwotCWZvciAoaSA9IDAsIGogPSAwOyBpIDw9IG1hc2s7IGkrKykgewotCQlpZiAoZXBbaV0ubWVfdmFsdWUgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKmtleSA9IGVwW2ldLm1lX2tleTsKLQkJCVB5X0lOQ1JFRihrZXkpOwotCQkJUHlMaXN0X1NFVF9JVEVNKHYsIGosIGtleSk7Ci0JCQlqKys7Ci0JCX0KLQl9Ci0JYXNzZXJ0KGogPT0gbik7Ci0JcmV0dXJuIHY7CisgICAgbiA9IG1wLT5tYV91c2VkOworICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuICE9IG1wLT5tYV91c2VkKSB7CisgICAgICAgIC8qIER1cm5pdC4gIFRoZSBhbGxvY2F0aW9ucyBjYXVzZWQgdGhlIGRpY3QgdG8gcmVzaXplLgorICAgICAgICAgKiBKdXN0IHN0YXJ0IG92ZXIsIHRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi4KKyAgICAgICAgICovCisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisgICAgZXAgPSBtcC0+bWFfdGFibGU7CisgICAgbWFzayA9IG1wLT5tYV9tYXNrOworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDw9IG1hc2s7IGkrKykgeworICAgICAgICBpZiAoZXBbaV0ubWVfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKmtleSA9IGVwW2ldLm1lX2tleTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOworICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHYsIGosIGtleSk7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KGogPT0gbik7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X3ZhbHVlcyhyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgajsKLQlQeURpY3RFbnRyeSAqZXA7Ci0JUHlfc3NpemVfdCBtYXNrLCBuOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgajsKKyAgICBQeURpY3RFbnRyeSAqZXA7CisgICAgUHlfc3NpemVfdCBtYXNrLCBuOwogCiAgIGFnYWluOgotCW4gPSBtcC0+bWFfdXNlZDsKLQl2ID0gUHlMaXN0X05ldyhuKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobiAhPSBtcC0+bWFfdXNlZCkgewotCQkvKiBEdXJuaXQuICBUaGUgYWxsb2NhdGlvbnMgY2F1c2VkIHRoZSBkaWN0IHRvIHJlc2l6ZS4KLQkJICogSnVzdCBzdGFydCBvdmVyLCB0aGlzIHNob3VsZG4ndCBub3JtYWxseSBoYXBwZW4uCi0JCSAqLwotCQlQeV9ERUNSRUYodik7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCWVwID0gbXAtPm1hX3RhYmxlOwotCW1hc2sgPSBtcC0+bWFfbWFzazsKLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8PSBtYXNrOyBpKyspIHsKLQkJaWYgKGVwW2ldLm1lX3ZhbHVlICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICp2YWx1ZSA9IGVwW2ldLm1lX3ZhbHVlOwotCQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJCVB5TGlzdF9TRVRfSVRFTSh2LCBqLCB2YWx1ZSk7Ci0JCQlqKys7Ci0JCX0KLQl9Ci0JYXNzZXJ0KGogPT0gbik7Ci0JcmV0dXJuIHY7CisgICAgbiA9IG1wLT5tYV91c2VkOworICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuICE9IG1wLT5tYV91c2VkKSB7CisgICAgICAgIC8qIER1cm5pdC4gIFRoZSBhbGxvY2F0aW9ucyBjYXVzZWQgdGhlIGRpY3QgdG8gcmVzaXplLgorICAgICAgICAgKiBKdXN0IHN0YXJ0IG92ZXIsIHRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi4KKyAgICAgICAgICovCisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisgICAgZXAgPSBtcC0+bWFfdGFibGU7CisgICAgbWFzayA9IG1wLT5tYV9tYXNrOworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDw9IG1hc2s7IGkrKykgeworICAgICAgICBpZiAoZXBbaV0ubWVfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKnZhbHVlID0gZXBbaV0ubWVfdmFsdWU7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHYsIGosIHZhbHVlKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoaiA9PSBuKTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfaXRlbXMocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCkKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqdjsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGksIGosIG47Ci0JUHlfc3NpemVfdCBtYXNrOwotCVB5T2JqZWN0ICppdGVtLCAqa2V5LCAqdmFsdWU7Ci0JUHlEaWN0RW50cnkgKmVwOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgaiwgbjsKKyAgICBQeV9zc2l6ZV90IG1hc2s7CisgICAgUHlPYmplY3QgKml0ZW0sICprZXksICp2YWx1ZTsKKyAgICBQeURpY3RFbnRyeSAqZXA7CiAKLQkvKiBQcmVhbGxvY2F0ZSB0aGUgbGlzdCBvZiB0dXBsZXMsIHRvIGF2b2lkIGFsbG9jYXRpb25zIGR1cmluZwotCSAqIHRoZSBsb29wIG92ZXIgdGhlIGl0ZW1zLCB3aGljaCBjb3VsZCB0cmlnZ2VyIEdDLCB3aGljaAotCSAqIGNvdWxkIHJlc2l6ZSB0aGUgZGljdC4gOi0oCi0JICovCisgICAgLyogUHJlYWxsb2NhdGUgdGhlIGxpc3Qgb2YgdHVwbGVzLCB0byBhdm9pZCBhbGxvY2F0aW9ucyBkdXJpbmcKKyAgICAgKiB0aGUgbG9vcCBvdmVyIHRoZSBpdGVtcywgd2hpY2ggY291bGQgdHJpZ2dlciBHQywgd2hpY2gKKyAgICAgKiBjb3VsZCByZXNpemUgdGhlIGRpY3QuIDotKAorICAgICAqLwogICBhZ2FpbjoKLQluID0gbXAtPm1hX3VzZWQ7Ci0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpdGVtID0gUHlUdXBsZV9OZXcoMik7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TRVRfSVRFTSh2LCBpLCBpdGVtKTsKLQl9Ci0JaWYgKG4gIT0gbXAtPm1hX3VzZWQpIHsKLQkJLyogRHVybml0LiAgVGhlIGFsbG9jYXRpb25zIGNhdXNlZCB0aGUgZGljdCB0byByZXNpemUuCi0JCSAqIEp1c3Qgc3RhcnQgb3ZlciwgdGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgaGFwcGVuLgotCQkgKi8KLQkJUHlfREVDUkVGKHYpOwotCQlnb3RvIGFnYWluOwotCX0KLQkvKiBOb3RoaW5nIHdlIGRvIGJlbG93IG1ha2VzIGFueSBmdW5jdGlvbiBjYWxscy4gKi8KLQllcCA9IG1wLT5tYV90YWJsZTsKLQltYXNrID0gbXAtPm1hX21hc2s7Ci0JZm9yIChpID0gMCwgaiA9IDA7IGkgPD0gbWFzazsgaSsrKSB7Ci0JCWlmICgodmFsdWU9ZXBbaV0ubWVfdmFsdWUpICE9IE5VTEwpIHsKLQkJCWtleSA9IGVwW2ldLm1lX2tleTsKLQkJCWl0ZW0gPSBQeUxpc3RfR0VUX0lURU0odiwgaik7Ci0JCQlQeV9JTkNSRUYoa2V5KTsKLQkJCVB5VHVwbGVfU0VUX0lURU0oaXRlbSwgMCwga2V5KTsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKGl0ZW0sIDEsIHZhbHVlKTsKLQkJCWorKzsKLQkJfQotCX0KLQlhc3NlcnQoaiA9PSBuKTsKLQlyZXR1cm4gdjsKKyAgICBuID0gbXAtPm1hX3VzZWQ7CisgICAgdiA9IFB5TGlzdF9OZXcobik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpdGVtID0gUHlUdXBsZV9OZXcoMik7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5TGlzdF9TRVRfSVRFTSh2LCBpLCBpdGVtKTsKKyAgICB9CisgICAgaWYgKG4gIT0gbXAtPm1hX3VzZWQpIHsKKyAgICAgICAgLyogRHVybml0LiAgVGhlIGFsbG9jYXRpb25zIGNhdXNlZCB0aGUgZGljdCB0byByZXNpemUuCisgICAgICAgICAqIEp1c3Qgc3RhcnQgb3ZlciwgdGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgaGFwcGVuLgorICAgICAgICAgKi8KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICBnb3RvIGFnYWluOworICAgIH0KKyAgICAvKiBOb3RoaW5nIHdlIGRvIGJlbG93IG1ha2VzIGFueSBmdW5jdGlvbiBjYWxscy4gKi8KKyAgICBlcCA9IG1wLT5tYV90YWJsZTsKKyAgICBtYXNrID0gbXAtPm1hX21hc2s7CisgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPD0gbWFzazsgaSsrKSB7CisgICAgICAgIGlmICgodmFsdWU9ZXBbaV0ubWVfdmFsdWUpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGtleSA9IGVwW2ldLm1lX2tleTsKKyAgICAgICAgICAgIGl0ZW0gPSBQeUxpc3RfR0VUX0lURU0odiwgaik7CisgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oaXRlbSwgMCwga2V5KTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGl0ZW0sIDEsIHZhbHVlKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoaiA9PSBuKTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfZnJvbWtleXMoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNlcTsKLQlQeU9iamVjdCAqdmFsdWUgPSBQeV9Ob25lOwotCVB5T2JqZWN0ICppdDsJLyogaXRlcihzZXEpICovCi0JUHlPYmplY3QgKmtleTsKLQlQeU9iamVjdCAqZDsKLQlpbnQgc3RhdHVzOworICAgIFB5T2JqZWN0ICpzZXE7CisgICAgUHlPYmplY3QgKnZhbHVlID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqaXQ7ICAgICAgIC8qIGl0ZXIoc2VxKSAqLworICAgIFB5T2JqZWN0ICprZXk7CisgICAgUHlPYmplY3QgKmQ7CisgICAgaW50IHN0YXR1czsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZyb21rZXlzIiwgMSwgMiwgJnNlcSwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZnJvbWtleXMiLCAxLCAyLCAmc2VxLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNscywgTlVMTCk7Ci0JaWYgKGQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2xzLCBOVUxMKTsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeURpY3RfQ2hlY2tFeGFjdChkKSAmJiBQeURpY3RfQ2hlY2tFeGFjdChzZXEpKSB7Ci0JCVB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopZDsKLQkJUHlPYmplY3QgKm9sZHZhbHVlOwotCQlQeV9zc2l6ZV90IHBvcyA9IDA7Ci0JCVB5T2JqZWN0ICprZXk7Ci0JCWxvbmcgaGFzaDsKKyAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QoZCkgJiYgUHlEaWN0X0NoZWNrRXhhY3Qoc2VxKSkgeworICAgICAgICBQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKWQ7CisgICAgICAgIFB5T2JqZWN0ICpvbGR2YWx1ZTsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgICAgICBQeU9iamVjdCAqa2V5OworICAgICAgICBsb25nIGhhc2g7CiAKLQkJaWYgKGRpY3RyZXNpemUobXAsIFB5X1NJWkUoc2VxKSkpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGRpY3RyZXNpemUobXAsIFB5X1NJWkUoc2VxKSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQl3aGlsZSAoX1B5RGljdF9OZXh0KHNlcSwgJnBvcywgJmtleSwgJm9sZHZhbHVlLCAmaGFzaCkpIHsKLQkJCVB5X0lOQ1JFRihrZXkpOwotCQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJCWlmIChpbnNlcnRkaWN0KG1wLCBrZXksIGhhc2gsIHZhbHVlKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gZDsKLQl9CisgICAgICAgIHdoaWxlIChfUHlEaWN0X05leHQoc2VxLCAmcG9zLCAma2V5LCAmb2xkdmFsdWUsICZoYXNoKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgaWYgKGluc2VydGRpY3QobXAsIGtleSwgaGFzaCwgdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkOworICAgIH0KIAotCWlmIChQeURpY3RfQ2hlY2tFeGFjdChkKSAmJiBQeUFueVNldF9DaGVja0V4YWN0KHNlcSkpIHsKLQkJUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilkOwotCQlQeV9zc2l6ZV90IHBvcyA9IDA7Ci0JCVB5T2JqZWN0ICprZXk7Ci0JCWxvbmcgaGFzaDsKKyAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QoZCkgJiYgUHlBbnlTZXRfQ2hlY2tFeGFjdChzZXEpKSB7CisgICAgICAgIFB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopZDsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgICAgICBQeU9iamVjdCAqa2V5OworICAgICAgICBsb25nIGhhc2g7CiAKLQkJaWYgKGRpY3RyZXNpemUobXAsIFB5U2V0X0dFVF9TSVpFKHNlcSkpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChkaWN0cmVzaXplKG1wLCBQeVNldF9HRVRfU0laRShzZXEpKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXdoaWxlIChfUHlTZXRfTmV4dEVudHJ5KHNlcSwgJnBvcywgJmtleSwgJmhhc2gpKSB7Ci0JCQlQeV9JTkNSRUYoa2V5KTsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlpZiAoaW5zZXJ0ZGljdChtcCwga2V5LCBoYXNoLCB2YWx1ZSkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIGQ7Ci0JfQorICAgICAgICB3aGlsZSAoX1B5U2V0X05leHRFbnRyeShzZXEsICZwb3MsICZrZXksICZoYXNoKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgaWYgKGluc2VydGRpY3QobXAsIGtleSwgaGFzaCwgdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkOworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCWlmIChpdCA9PSBOVUxMKXsKLQkJUHlfREVDUkVGKGQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ID09IE5VTEwpeworICAgICAgICBQeV9ERUNSRUYoZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeURpY3RfQ2hlY2tFeGFjdChkKSkgewotCQl3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQkJc3RhdHVzID0gUHlEaWN0X1NldEl0ZW0oZCwga2V5LCB2YWx1ZSk7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCWdvdG8gRmFpbDsKLQkJfQotCX0gZWxzZSB7Ci0JCXdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCQlzdGF0dXMgPSBQeU9iamVjdF9TZXRJdGVtKGQsIGtleSwgdmFsdWUpOwotCQkJUHlfREVDUkVGKGtleSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQlnb3RvIEZhaWw7Ci0JCX0KLQl9CisgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KGQpKSB7CisgICAgICAgIHdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBQeURpY3RfU2V0SXRlbShkLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFB5T2JqZWN0X1NldEl0ZW0oZCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlnb3RvIEZhaWw7Ci0JUHlfREVDUkVGKGl0KTsKLQlyZXR1cm4gZDsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBGYWlsOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIGQ7CiAKIEZhaWw6Ci0JUHlfREVDUkVGKGl0KTsKLQlQeV9ERUNSRUYoZCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9ERUNSRUYoZCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIGRpY3RfdXBkYXRlX2NvbW1vbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLCBjaGFyICptZXRobmFtZSkKIHsKLQlQeU9iamVjdCAqYXJnID0gTlVMTDsKLQlpbnQgcmVzdWx0ID0gMDsKKyAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgbWV0aG5hbWUsIDAsIDEsICZhcmcpKQotCQlyZXN1bHQgPSAtMTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIG1ldGhuYW1lLCAwLCAxLCAmYXJnKSkKKyAgICAgICAgcmVzdWx0ID0gLTE7CiAKLQllbHNlIGlmIChhcmcgIT0gTlVMTCkgewotCQlpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhhcmcsICJrZXlzIikpCi0JCQlyZXN1bHQgPSBQeURpY3RfTWVyZ2Uoc2VsZiwgYXJnLCAxKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gUHlEaWN0X01lcmdlRnJvbVNlcTIoc2VsZiwgYXJnLCAxKTsKLQl9Ci0JaWYgKHJlc3VsdCA9PSAwICYmIGt3ZHMgIT0gTlVMTCkKLQkJcmVzdWx0ID0gUHlEaWN0X01lcmdlKHNlbGYsIGt3ZHMsIDEpOwotCXJldHVybiByZXN1bHQ7CisgICAgZWxzZSBpZiAoYXJnICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoYXJnLCAia2V5cyIpKQorICAgICAgICAgICAgcmVzdWx0ID0gUHlEaWN0X01lcmdlKHNlbGYsIGFyZywgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5RGljdF9NZXJnZUZyb21TZXEyKHNlbGYsIGFyZywgMSk7CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gMCAmJiBrd2RzICE9IE5VTEwpCisgICAgICAgIHJlc3VsdCA9IFB5RGljdF9NZXJnZShzZWxmLCBrd2RzLCAxKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF91cGRhdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpZiAoZGljdF91cGRhdGVfY29tbW9uKHNlbGYsIGFyZ3MsIGt3ZHMsICJ1cGRhdGUiKSAhPSAtMSkKLQkJUHlfUkVUVVJOX05PTkU7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGRpY3RfdXBkYXRlX2NvbW1vbihzZWxmLCBhcmdzLCBrd2RzLCAidXBkYXRlIikgIT0gLTEpCisgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBVcGRhdGUgdW5jb25kaXRpb25hbGx5IHJlcGxhY2VzIGV4aXN0aW5nIGl0ZW1zLgpAQCAtMTQzOSwyMzggKzE0MzksMjM4IEBACiBpbnQKIFB5RGljdF9NZXJnZUZyb21TZXEyKFB5T2JqZWN0ICpkLCBQeU9iamVjdCAqc2VxMiwgaW50IG92ZXJyaWRlKQogewotCVB5T2JqZWN0ICppdDsJLyogaXRlcihzZXEyKSAqLwotCVB5X3NzaXplX3QgaTsJLyogaW5kZXggaW50byBzZXEyIG9mIGN1cnJlbnQgZWxlbWVudCAqLwotCVB5T2JqZWN0ICppdGVtOwkvKiBzZXEyW2ldICovCi0JUHlPYmplY3QgKmZhc3Q7CS8qIGl0ZW0gYXMgYSAyLXR1cGxlIG9yIDItbGlzdCAqLworICAgIFB5T2JqZWN0ICppdDsgICAgICAgLyogaXRlcihzZXEyKSAqLworICAgIFB5X3NzaXplX3QgaTsgICAgICAgLyogaW5kZXggaW50byBzZXEyIG9mIGN1cnJlbnQgZWxlbWVudCAqLworICAgIFB5T2JqZWN0ICppdGVtOyAgICAgLyogc2VxMltpXSAqLworICAgIFB5T2JqZWN0ICpmYXN0OyAgICAgLyogaXRlbSBhcyBhIDItdHVwbGUgb3IgMi1saXN0ICovCiAKLQlhc3NlcnQoZCAhPSBOVUxMKTsKLQlhc3NlcnQoUHlEaWN0X0NoZWNrKGQpKTsKLQlhc3NlcnQoc2VxMiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoZCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoUHlEaWN0X0NoZWNrKGQpKTsKKyAgICBhc3NlcnQoc2VxMiAhPSBOVUxMKTsKIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEyKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEyKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JZm9yIChpID0gMDsgOyArK2kpIHsKLQkJUHlPYmplY3QgKmtleSwgKnZhbHVlOwotCQlQeV9zc2l6ZV90IG47CisgICAgZm9yIChpID0gMDsgOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgICAgICBQeV9zc2l6ZV90IG47CiAKLQkJZmFzdCA9IE5VTEw7Ci0JCWl0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gRmFpbDsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGZhc3QgPSBOVUxMOworICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCS8qIENvbnZlcnQgaXRlbSB0byBzZXF1ZW5jZSwgYW5kIHZlcmlmeSBsZW5ndGggMi4gKi8KLQkJZmFzdCA9IFB5U2VxdWVuY2VfRmFzdChpdGVtLCAiIik7Ci0JCWlmIChmYXN0ID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImNhbm5vdCBjb252ZXJ0IGRpY3Rpb25hcnkgdXBkYXRlICIKLQkJCQkJInNlcXVlbmNlIGVsZW1lbnQgIyV6ZCB0byBhIHNlcXVlbmNlIiwKLQkJCQkJaSk7Ci0JCQlnb3RvIEZhaWw7Ci0JCX0KLQkJbiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShmYXN0KTsKLQkJaWYgKG4gIT0gMikgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgICAiZGljdGlvbmFyeSB1cGRhdGUgc2VxdWVuY2UgZWxlbWVudCAjJXpkICIKLQkJCQkgICAgICJoYXMgbGVuZ3RoICV6ZDsgMiBpcyByZXF1aXJlZCIsCi0JCQkJICAgICBpLCBuKTsKLQkJCWdvdG8gRmFpbDsKLQkJfQorICAgICAgICAvKiBDb252ZXJ0IGl0ZW0gdG8gc2VxdWVuY2UsIGFuZCB2ZXJpZnkgbGVuZ3RoIDIuICovCisgICAgICAgIGZhc3QgPSBQeVNlcXVlbmNlX0Zhc3QoaXRlbSwgIiIpOworICAgICAgICBpZiAoZmFzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBkaWN0aW9uYXJ5IHVwZGF0ZSAiCisgICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSBlbGVtZW50ICMlemQgdG8gYSBzZXF1ZW5jZSIsCisgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgICAgIG4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmFzdCk7CisgICAgICAgIGlmIChuICE9IDIpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5IHVwZGF0ZSBzZXF1ZW5jZSBlbGVtZW50ICMlemQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJoYXMgbGVuZ3RoICV6ZDsgMiBpcyByZXF1aXJlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbik7CisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KIAotCQkvKiBVcGRhdGUvbWVyZ2Ugd2l0aCB0aGlzIChrZXksIHZhbHVlKSBwYWlyLiAqLwotCQlrZXkgPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oZmFzdCwgMCk7Ci0JCXZhbHVlID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZhc3QsIDEpOwotCQlpZiAob3ZlcnJpZGUgfHwgUHlEaWN0X0dldEl0ZW0oZCwga2V5KSA9PSBOVUxMKSB7Ci0JCQlpbnQgc3RhdHVzID0gUHlEaWN0X1NldEl0ZW0oZCwga2V5LCB2YWx1ZSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQlnb3RvIEZhaWw7Ci0JCX0KLQkJUHlfREVDUkVGKGZhc3QpOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQorICAgICAgICAvKiBVcGRhdGUvbWVyZ2Ugd2l0aCB0aGlzIChrZXksIHZhbHVlKSBwYWlyLiAqLworICAgICAgICBrZXkgPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oZmFzdCwgMCk7CisgICAgICAgIHZhbHVlID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZhc3QsIDEpOworICAgICAgICBpZiAob3ZlcnJpZGUgfHwgUHlEaWN0X0dldEl0ZW0oZCwga2V5KSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gUHlEaWN0X1NldEl0ZW0oZCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGZhc3QpOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQogCi0JaSA9IDA7Ci0JZ290byBSZXR1cm47CisgICAgaSA9IDA7CisgICAgZ290byBSZXR1cm47CiBGYWlsOgotCVB5X1hERUNSRUYoaXRlbSk7Ci0JUHlfWERFQ1JFRihmYXN0KTsKLQlpID0gLTE7CisgICAgUHlfWERFQ1JFRihpdGVtKTsKKyAgICBQeV9YREVDUkVGKGZhc3QpOworICAgIGkgPSAtMTsKIFJldHVybjoKLQlQeV9ERUNSRUYoaXQpOwotCXJldHVybiBQeV9TQUZFX0RPV05DQVNUKGksIFB5X3NzaXplX3QsIGludCk7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChpLCBQeV9zc2l6ZV90LCBpbnQpOwogfQogCiBpbnQKIFB5RGljdF9VcGRhdGUoUHlPYmplY3QgKmEsIFB5T2JqZWN0ICpiKQogewotCXJldHVybiBQeURpY3RfTWVyZ2UoYSwgYiwgMSk7CisgICAgcmV0dXJuIFB5RGljdF9NZXJnZShhLCBiLCAxKTsKIH0KIAogaW50CiBQeURpY3RfTWVyZ2UoUHlPYmplY3QgKmEsIFB5T2JqZWN0ICpiLCBpbnQgb3ZlcnJpZGUpCiB7Ci0JcmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgKm90aGVyOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQlQeURpY3RFbnRyeSAqZW50cnk7CisgICAgcmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgKm90aGVyOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKKyAgICBQeURpY3RFbnRyeSAqZW50cnk7CiAKLQkvKiBXZSBhY2NlcHQgZm9yIHRoZSBhcmd1bWVudCBlaXRoZXIgYSBjb25jcmV0ZSBkaWN0aW9uYXJ5IG9iamVjdCwKLQkgKiBvciBhbiBhYnN0cmFjdCAibWFwcGluZyIgb2JqZWN0LiAgRm9yIHRoZSBmb3JtZXIsIHdlIGNhbiBkbwotCSAqIHRoaW5ncyBxdWl0ZSBlZmZpY2llbnRseS4gIEZvciB0aGUgbGF0dGVyLCB3ZSBvbmx5IHJlcXVpcmUgdGhhdAotCSAqIFB5TWFwcGluZ19LZXlzKCkgYW5kIFB5T2JqZWN0X0dldEl0ZW0oKSBiZSBzdXBwb3J0ZWQuCi0JICovCi0JaWYgKGEgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKGEpIHx8IGIgPT0gTlVMTCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltcCA9IChQeURpY3RPYmplY3QqKWE7Ci0JaWYgKFB5RGljdF9DaGVjayhiKSkgewotCQlvdGhlciA9IChQeURpY3RPYmplY3QqKWI7Ci0JCWlmIChvdGhlciA9PSBtcCB8fCBvdGhlci0+bWFfdXNlZCA9PSAwKQotCQkJLyogYS51cGRhdGUoYSkgb3IgYS51cGRhdGUoe30pOyBub3RoaW5nIHRvIGRvICovCi0JCQlyZXR1cm4gMDsKLQkJaWYgKG1wLT5tYV91c2VkID09IDApCi0JCQkvKiBTaW5jZSB0aGUgdGFyZ2V0IGRpY3QgaXMgZW1wdHksIFB5RGljdF9HZXRJdGVtKCkKLQkJCSAqIGFsd2F5cyByZXR1cm5zIE5VTEwuICBTZXR0aW5nIG92ZXJyaWRlIHRvIDEKLQkJCSAqIHNraXBzIHRoZSB1bm5lY2Vzc2FyeSB0ZXN0LgotCQkJICovCi0JCQlvdmVycmlkZSA9IDE7Ci0JCS8qIERvIG9uZSBiaWcgcmVzaXplIGF0IHRoZSBzdGFydCwgcmF0aGVyIHRoYW4KLQkJICogaW5jcmVtZW50YWxseSByZXNpemluZyBhcyB3ZSBpbnNlcnQgbmV3IGl0ZW1zLiAgRXhwZWN0Ci0JCSAqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgotCQkgKi8KLQkJaWYgKChtcC0+bWFfZmlsbCArIG90aGVyLT5tYV91c2VkKSozID49IChtcC0+bWFfbWFzaysxKSoyKSB7Ci0JCSAgIGlmIChkaWN0cmVzaXplKG1wLCAobXAtPm1hX3VzZWQgKyBvdGhlci0+bWFfdXNlZCkqMikgIT0gMCkKLQkJCSAgIHJldHVybiAtMTsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDw9IG90aGVyLT5tYV9tYXNrOyBpKyspIHsKLQkJCWVudHJ5ID0gJm90aGVyLT5tYV90YWJsZVtpXTsKLQkJCWlmIChlbnRyeS0+bWVfdmFsdWUgIT0gTlVMTCAmJgotCQkJICAgIChvdmVycmlkZSB8fAotCQkJICAgICBQeURpY3RfR2V0SXRlbShhLCBlbnRyeS0+bWVfa2V5KSA9PSBOVUxMKSkgewotCQkJCVB5X0lOQ1JFRihlbnRyeS0+bWVfa2V5KTsKLQkJCQlQeV9JTkNSRUYoZW50cnktPm1lX3ZhbHVlKTsKLQkJCQlpZiAoaW5zZXJ0ZGljdChtcCwgZW50cnktPm1lX2tleSwKLQkJCQkJICAgICAgIChsb25nKWVudHJ5LT5tZV9oYXNoLAotCQkJCQkgICAgICAgZW50cnktPm1lX3ZhbHVlKSAhPSAwKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8qIERvIGl0IHRoZSBnZW5lcmljLCBzbG93ZXIgd2F5ICovCi0JCVB5T2JqZWN0ICprZXlzID0gUHlNYXBwaW5nX0tleXMoYik7Ci0JCVB5T2JqZWN0ICppdGVyOwotCQlQeU9iamVjdCAqa2V5LCAqdmFsdWU7Ci0JCWludCBzdGF0dXM7CisgICAgLyogV2UgYWNjZXB0IGZvciB0aGUgYXJndW1lbnQgZWl0aGVyIGEgY29uY3JldGUgZGljdGlvbmFyeSBvYmplY3QsCisgICAgICogb3IgYW4gYWJzdHJhY3QgIm1hcHBpbmciIG9iamVjdC4gIEZvciB0aGUgZm9ybWVyLCB3ZSBjYW4gZG8KKyAgICAgKiB0aGluZ3MgcXVpdGUgZWZmaWNpZW50bHkuICBGb3IgdGhlIGxhdHRlciwgd2Ugb25seSByZXF1aXJlIHRoYXQKKyAgICAgKiBQeU1hcHBpbmdfS2V5cygpIGFuZCBQeU9iamVjdF9HZXRJdGVtKCkgYmUgc3VwcG9ydGVkLgorICAgICAqLworICAgIGlmIChhID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhhKSB8fCBiID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbXAgPSAoUHlEaWN0T2JqZWN0KilhOworICAgIGlmIChQeURpY3RfQ2hlY2soYikpIHsKKyAgICAgICAgb3RoZXIgPSAoUHlEaWN0T2JqZWN0KiliOworICAgICAgICBpZiAob3RoZXIgPT0gbXAgfHwgb3RoZXItPm1hX3VzZWQgPT0gMCkKKyAgICAgICAgICAgIC8qIGEudXBkYXRlKGEpIG9yIGEudXBkYXRlKHt9KTsgbm90aGluZyB0byBkbyAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChtcC0+bWFfdXNlZCA9PSAwKQorICAgICAgICAgICAgLyogU2luY2UgdGhlIHRhcmdldCBkaWN0IGlzIGVtcHR5LCBQeURpY3RfR2V0SXRlbSgpCisgICAgICAgICAgICAgKiBhbHdheXMgcmV0dXJucyBOVUxMLiAgU2V0dGluZyBvdmVycmlkZSB0byAxCisgICAgICAgICAgICAgKiBza2lwcyB0aGUgdW5uZWNlc3NhcnkgdGVzdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgb3ZlcnJpZGUgPSAxOworICAgICAgICAvKiBEbyBvbmUgYmlnIHJlc2l6ZSBhdCB0aGUgc3RhcnQsIHJhdGhlciB0aGFuCisgICAgICAgICAqIGluY3JlbWVudGFsbHkgcmVzaXppbmcgYXMgd2UgaW5zZXJ0IG5ldyBpdGVtcy4gIEV4cGVjdAorICAgICAgICAgKiB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gKG9yIGZldykgb3ZlcmxhcHBpbmcga2V5cy4KKyAgICAgICAgICovCisgICAgICAgIGlmICgobXAtPm1hX2ZpbGwgKyBvdGhlci0+bWFfdXNlZCkqMyA+PSAobXAtPm1hX21hc2srMSkqMikgeworICAgICAgICAgICBpZiAoZGljdHJlc2l6ZShtcCwgKG1wLT5tYV91c2VkICsgb3RoZXItPm1hX3VzZWQpKjIpICE9IDApCisgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBvdGhlci0+bWFfbWFzazsgaSsrKSB7CisgICAgICAgICAgICBlbnRyeSA9ICZvdGhlci0+bWFfdGFibGVbaV07CisgICAgICAgICAgICBpZiAoZW50cnktPm1lX3ZhbHVlICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAob3ZlcnJpZGUgfHwKKyAgICAgICAgICAgICAgICAgUHlEaWN0X0dldEl0ZW0oYSwgZW50cnktPm1lX2tleSkgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZW50cnktPm1lX2tleSk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVudHJ5LT5tZV92YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGluc2VydGRpY3QobXAsIGVudHJ5LT5tZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpZW50cnktPm1lX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPm1lX3ZhbHVlKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIERvIGl0IHRoZSBnZW5lcmljLCBzbG93ZXIgd2F5ICovCisgICAgICAgIFB5T2JqZWN0ICprZXlzID0gUHlNYXBwaW5nX0tleXMoYik7CisgICAgICAgIFB5T2JqZWN0ICppdGVyOworICAgICAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgICAgIGludCBzdGF0dXM7CiAKLQkJaWYgKGtleXMgPT0gTlVMTCkKLQkJCS8qIERvY3N0cmluZyBzYXlzIHRoaXMgaXMgZXF1aXZhbGVudCB0byBFLmtleXMoKSBzbwotCQkJICogaWYgRSBkb2Vzbid0IGhhdmUgYSAua2V5cygpIG1ldGhvZCB3ZSB3YW50Ci0JCQkgKiBBdHRyaWJ1dGVFcnJvciB0byBwZXJjb2xhdGUgdXAuICBNaWdodCBhcyB3ZWxsCi0JCQkgKiBkbyB0aGUgc2FtZSBmb3IgYW55IG90aGVyIGVycm9yLgotCQkJICovCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGlmIChrZXlzID09IE5VTEwpCisgICAgICAgICAgICAvKiBEb2NzdHJpbmcgc2F5cyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gRS5rZXlzKCkgc28KKyAgICAgICAgICAgICAqIGlmIEUgZG9lc24ndCBoYXZlIGEgLmtleXMoKSBtZXRob2Qgd2Ugd2FudAorICAgICAgICAgICAgICogQXR0cmlidXRlRXJyb3IgdG8gcGVyY29sYXRlIHVwLiAgTWlnaHQgYXMgd2VsbAorICAgICAgICAgICAgICogZG8gdGhlIHNhbWUgZm9yIGFueSBvdGhlciBlcnJvci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKGtleXMpOwotCQlQeV9ERUNSRUYoa2V5cyk7Ci0JCWlmIChpdGVyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKGtleXMpOworICAgICAgICBQeV9ERUNSRUYoa2V5cyk7CisgICAgICAgIGlmIChpdGVyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJZm9yIChrZXkgPSBQeUl0ZXJfTmV4dChpdGVyKTsga2V5OyBrZXkgPSBQeUl0ZXJfTmV4dChpdGVyKSkgewotCQkJaWYgKCFvdmVycmlkZSAmJiBQeURpY3RfR2V0SXRlbShhLCBrZXkpICE9IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoa2V5KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXZhbHVlID0gUHlPYmplY3RfR2V0SXRlbShiLCBrZXkpOwotCQkJaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlcik7Ci0JCQkJUHlfREVDUkVGKGtleSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJc3RhdHVzID0gUHlEaWN0X1NldEl0ZW0oYSwga2V5LCB2YWx1ZSk7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCVB5X0RFQ1JFRihpdGVyKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJUHlfREVDUkVGKGl0ZXIpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCS8qIEl0ZXJhdG9yIGNvbXBsZXRlZCwgdmlhIGVycm9yICovCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgICAgICBmb3IgKGtleSA9IFB5SXRlcl9OZXh0KGl0ZXIpOyBrZXk7IGtleSA9IFB5SXRlcl9OZXh0KGl0ZXIpKSB7CisgICAgICAgICAgICBpZiAoIW92ZXJyaWRlICYmIFB5RGljdF9HZXRJdGVtKGEsIGtleSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBQeU9iamVjdF9HZXRJdGVtKGIsIGtleSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBQeURpY3RfU2V0SXRlbShhLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZXIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgLyogSXRlcmF0b3IgY29tcGxldGVkLCB2aWEgZXJyb3IgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2NvcHkocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCkKIHsKLQlyZXR1cm4gUHlEaWN0X0NvcHkoKFB5T2JqZWN0KiltcCk7CisgICAgcmV0dXJuIFB5RGljdF9Db3B5KChQeU9iamVjdCopbXApOwogfQogCiBQeU9iamVjdCAqCiBQeURpY3RfQ29weShQeU9iamVjdCAqbykKIHsKLQlQeU9iamVjdCAqY29weTsKKyAgICBQeU9iamVjdCAqY29weTsKIAotCWlmIChvID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhvKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNvcHkgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKGNvcHkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5RGljdF9NZXJnZShjb3B5LCBvLCAxKSA9PSAwKQotCQlyZXR1cm4gY29weTsKLQlQeV9ERUNSRUYoY29weSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKG8gPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG8pKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY29weSA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoY29weSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X01lcmdlKGNvcHksIG8sIDEpID09IDApCisgICAgICAgIHJldHVybiBjb3B5OworICAgIFB5X0RFQ1JFRihjb3B5KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlfc3NpemVfdAogUHlEaWN0X1NpemUoUHlPYmplY3QgKm1wKQogewotCWlmIChtcCA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2sobXApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAoKFB5RGljdE9iamVjdCAqKW1wKS0+bWFfdXNlZDsKKyAgICBpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gKChQeURpY3RPYmplY3QgKiltcCktPm1hX3VzZWQ7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RGljdF9LZXlzKFB5T2JqZWN0ICptcCkKIHsKLQlpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBkaWN0X2tleXMoKFB5RGljdE9iamVjdCAqKW1wKTsKKyAgICBpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkaWN0X2tleXMoKFB5RGljdE9iamVjdCAqKW1wKTsKIH0KIAogUHlPYmplY3QgKgogUHlEaWN0X1ZhbHVlcyhQeU9iamVjdCAqbXApCiB7Ci0JaWYgKG1wID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhtcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gZGljdF92YWx1ZXMoKFB5RGljdE9iamVjdCAqKW1wKTsKKyAgICBpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkaWN0X3ZhbHVlcygoUHlEaWN0T2JqZWN0ICopbXApOwogfQogCiBQeU9iamVjdCAqCiBQeURpY3RfSXRlbXMoUHlPYmplY3QgKm1wKQogewotCWlmIChtcCA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2sobXApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGRpY3RfaXRlbXMoKFB5RGljdE9iamVjdCAqKW1wKTsKKyAgICBpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkaWN0X2l0ZW1zKChQeURpY3RPYmplY3QgKiltcCk7CiB9CiAKIC8qIFN1YnJvdXRpbmUgd2hpY2ggcmV0dXJucyB0aGUgc21hbGxlc3Qga2V5IGluIGEgZm9yIHdoaWNoIGIncyB2YWx1ZQpAQCAtMTY4NCwxMjMgKzE2ODQsMTIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2hhcmFjdGVyaXplKFB5RGljdE9iamVjdCAqYSwgUHlEaWN0T2JqZWN0ICpiLCBQeU9iamVjdCAqKnB2YWwpCiB7Ci0JUHlPYmplY3QgKmFrZXkgPSBOVUxMOyAvKiBzbWFsbGVzdCBrZXkgaW4gYSBzLnQuIGFbYWtleV0gIT0gYltha2V5XSAqLwotCVB5T2JqZWN0ICphdmFsID0gTlVMTDsgLyogYVtha2V5XSAqLwotCVB5X3NzaXplX3QgaTsKLQlpbnQgY21wOworICAgIFB5T2JqZWN0ICpha2V5ID0gTlVMTDsgLyogc21hbGxlc3Qga2V5IGluIGEgcy50LiBhW2FrZXldICE9IGJbYWtleV0gKi8KKyAgICBQeU9iamVjdCAqYXZhbCA9IE5VTEw7IC8qIGFbYWtleV0gKi8KKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IGNtcDsKIAotCWZvciAoaSA9IDA7IGkgPD0gYS0+bWFfbWFzazsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp0aGlza2V5LCAqdGhpc2F2YWwsICp0aGlzYnZhbDsKLQkJaWYgKGEtPm1hX3RhYmxlW2ldLm1lX3ZhbHVlID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJdGhpc2tleSA9IGEtPm1hX3RhYmxlW2ldLm1lX2tleTsKLQkJUHlfSU5DUkVGKHRoaXNrZXkpOyAgLyoga2VlcCBhbGl2ZSBhY3Jvc3MgY29tcGFyZXMgKi8KLQkJaWYgKGFrZXkgIT0gTlVMTCkgewotCQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGFrZXksIHRoaXNrZXksIFB5X0xUKTsKLQkJCWlmIChjbXAgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKHRoaXNrZXkpOwotCQkJCWdvdG8gRmFpbDsKLQkJCX0KLQkJCWlmIChjbXAgPiAwIHx8Ci0JCQkgICAgaSA+IGEtPm1hX21hc2sgfHwKLQkJCSAgICBhLT5tYV90YWJsZVtpXS5tZV92YWx1ZSA9PSBOVUxMKQotCQkJewotCQkJCS8qIE5vdCB0aGUgKnNtYWxsZXN0KiBhIGtleTsgb3IgbWF5YmUgaXQgaXMKLQkJCQkgKiBidXQgdGhlIGNvbXBhcmUgc2hydW5rIHRoZSBkaWN0IHNvIHdlIGNhbid0Ci0JCQkJICogZmluZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSBhbnltb3JlOyBvcgotCQkJCSAqIG1heWJlIGl0IGlzIGJ1dCB0aGUgY29tcGFyZSBkZWxldGVkIHRoZQotCQkJCSAqIGFbdGhpc2tleV0gZW50cnkuCi0JCQkJICovCi0JCQkJUHlfREVDUkVGKHRoaXNrZXkpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9CisgICAgZm9yIChpID0gMDsgaSA8PSBhLT5tYV9tYXNrOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnRoaXNrZXksICp0aGlzYXZhbCwgKnRoaXNidmFsOworICAgICAgICBpZiAoYS0+bWFfdGFibGVbaV0ubWVfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB0aGlza2V5ID0gYS0+bWFfdGFibGVbaV0ubWVfa2V5OworICAgICAgICBQeV9JTkNSRUYodGhpc2tleSk7ICAvKiBrZWVwIGFsaXZlIGFjcm9zcyBjb21wYXJlcyAqLworICAgICAgICBpZiAoYWtleSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woYWtleSwgdGhpc2tleSwgUHlfTFQpOworICAgICAgICAgICAgaWYgKGNtcCA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGhpc2tleSk7CisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNtcCA+IDAgfHwKKyAgICAgICAgICAgICAgICBpID4gYS0+bWFfbWFzayB8fAorICAgICAgICAgICAgICAgIGEtPm1hX3RhYmxlW2ldLm1lX3ZhbHVlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTm90IHRoZSAqc21hbGxlc3QqIGEga2V5OyBvciBtYXliZSBpdCBpcworICAgICAgICAgICAgICAgICAqIGJ1dCB0aGUgY29tcGFyZSBzaHJ1bmsgdGhlIGRpY3Qgc28gd2UgY2FuJ3QKKyAgICAgICAgICAgICAgICAgKiBmaW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlIGFueW1vcmU7IG9yCisgICAgICAgICAgICAgICAgICogbWF5YmUgaXQgaXMgYnV0IHRoZSBjb21wYXJlIGRlbGV0ZWQgdGhlCisgICAgICAgICAgICAgICAgICogYVt0aGlza2V5XSBlbnRyeS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGhpc2tleSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiBDb21wYXJlIGFbdGhpc2tleV0gdG8gYlt0aGlza2V5XTsgY21wIDwtIHRydWUgaWZmIGVxdWFsLiAqLwotCQl0aGlzYXZhbCA9IGEtPm1hX3RhYmxlW2ldLm1lX3ZhbHVlOwotCQlhc3NlcnQodGhpc2F2YWwpOwotCQlQeV9JTkNSRUYodGhpc2F2YWwpOyAgIC8qIGtlZXAgYWxpdmUgKi8KLQkJdGhpc2J2YWwgPSBQeURpY3RfR2V0SXRlbSgoUHlPYmplY3QgKiliLCB0aGlza2V5KTsKLQkJaWYgKHRoaXNidmFsID09IE5VTEwpCi0JCQljbXAgPSAwOwotCQllbHNlIHsKLQkJCS8qIGJvdGggZGljdHMgaGF2ZSB0aGlza2V5OiAgc2FtZSB2YWx1ZXM/ICovCi0JCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woCi0JCQkJCQl0aGlzYXZhbCwgdGhpc2J2YWwsIFB5X0VRKTsKLQkJCWlmIChjbXAgPCAwKSB7Ci0JCSAgICAJCVB5X0RFQ1JFRih0aGlza2V5KTsKLQkJICAgIAkJUHlfREVDUkVGKHRoaXNhdmFsKTsKLQkJICAgIAkJZ290byBGYWlsOwotCQkJfQotCQl9Ci0JCWlmIChjbXAgPT0gMCkgewotCQkJLyogTmV3IHdpbm5lci4gKi8KLQkJCVB5X1hERUNSRUYoYWtleSk7Ci0JCQlQeV9YREVDUkVGKGF2YWwpOwotCQkJYWtleSA9IHRoaXNrZXk7Ci0JCQlhdmFsID0gdGhpc2F2YWw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeV9ERUNSRUYodGhpc2tleSk7Ci0JCQlQeV9ERUNSRUYodGhpc2F2YWwpOwotCQl9Ci0JfQotCSpwdmFsID0gYXZhbDsKLQlyZXR1cm4gYWtleTsKKyAgICAgICAgLyogQ29tcGFyZSBhW3RoaXNrZXldIHRvIGJbdGhpc2tleV07IGNtcCA8LSB0cnVlIGlmZiBlcXVhbC4gKi8KKyAgICAgICAgdGhpc2F2YWwgPSBhLT5tYV90YWJsZVtpXS5tZV92YWx1ZTsKKyAgICAgICAgYXNzZXJ0KHRoaXNhdmFsKTsKKyAgICAgICAgUHlfSU5DUkVGKHRoaXNhdmFsKTsgICAvKiBrZWVwIGFsaXZlICovCisgICAgICAgIHRoaXNidmFsID0gUHlEaWN0X0dldEl0ZW0oKFB5T2JqZWN0ICopYiwgdGhpc2tleSk7CisgICAgICAgIGlmICh0aGlzYnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgY21wID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBib3RoIGRpY3RzIGhhdmUgdGhpc2tleTogIHNhbWUgdmFsdWVzPyAqLworICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc2F2YWwsIHRoaXNidmFsLCBQeV9FUSk7CisgICAgICAgICAgICBpZiAoY21wIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0aGlza2V5KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGhpc2F2YWwpOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY21wID09IDApIHsKKyAgICAgICAgICAgIC8qIE5ldyB3aW5uZXIuICovCisgICAgICAgICAgICBQeV9YREVDUkVGKGFrZXkpOworICAgICAgICAgICAgUHlfWERFQ1JFRihhdmFsKTsKKyAgICAgICAgICAgIGFrZXkgPSB0aGlza2V5OworICAgICAgICAgICAgYXZhbCA9IHRoaXNhdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfREVDUkVGKHRoaXNrZXkpOworICAgICAgICAgICAgUHlfREVDUkVGKHRoaXNhdmFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqcHZhbCA9IGF2YWw7CisgICAgcmV0dXJuIGFrZXk7CiAKIEZhaWw6Ci0JUHlfWERFQ1JFRihha2V5KTsKLQlQeV9YREVDUkVGKGF2YWwpOwotCSpwdmFsID0gTlVMTDsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGFrZXkpOworICAgIFB5X1hERUNSRUYoYXZhbCk7CisgICAgKnB2YWwgPSBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBkaWN0X2NvbXBhcmUoUHlEaWN0T2JqZWN0ICphLCBQeURpY3RPYmplY3QgKmIpCiB7Ci0JUHlPYmplY3QgKmFkaWZmLCAqYmRpZmYsICphdmFsLCAqYnZhbDsKLQlpbnQgcmVzOworICAgIFB5T2JqZWN0ICphZGlmZiwgKmJkaWZmLCAqYXZhbCwgKmJ2YWw7CisgICAgaW50IHJlczsKIAotCS8qIENvbXBhcmUgbGVuZ3RocyBmaXJzdCAqLwotCWlmIChhLT5tYV91c2VkIDwgYi0+bWFfdXNlZCkKLQkJcmV0dXJuIC0xOwkvKiBhIGlzIHNob3J0ZXIgKi8KLQllbHNlIGlmIChhLT5tYV91c2VkID4gYi0+bWFfdXNlZCkKLQkJcmV0dXJuIDE7CS8qIGIgaXMgc2hvcnRlciAqLworICAgIC8qIENvbXBhcmUgbGVuZ3RocyBmaXJzdCAqLworICAgIGlmIChhLT5tYV91c2VkIDwgYi0+bWFfdXNlZCkKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgLyogYSBpcyBzaG9ydGVyICovCisgICAgZWxzZSBpZiAoYS0+bWFfdXNlZCA+IGItPm1hX3VzZWQpCisgICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgIC8qIGIgaXMgc2hvcnRlciAqLwogCi0JLyogU2FtZSBsZW5ndGggLS0gY2hlY2sgYWxsIGtleXMgKi8KLQliZGlmZiA9IGJ2YWwgPSBOVUxMOwotCWFkaWZmID0gY2hhcmFjdGVyaXplKGEsIGIsICZhdmFsKTsKLQlpZiAoYWRpZmYgPT0gTlVMTCkgewotCQlhc3NlcnQoIWF2YWwpOwotCQkvKiBFaXRoZXIgYW4gZXJyb3IsIG9yIGEgaXMgYSBzdWJzZXQgd2l0aCB0aGUgc2FtZSBsZW5ndGggc28KLQkJICogbXVzdCBiZSBlcXVhbC4KLQkJICovCi0JCXJlcyA9IFB5RXJyX09jY3VycmVkKCkgPyAtMSA6IDA7Ci0JCWdvdG8gRmluaXNoZWQ7Ci0JfQotCWJkaWZmID0gY2hhcmFjdGVyaXplKGIsIGEsICZidmFsKTsKLQlpZiAoYmRpZmYgPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWFzc2VydCghYnZhbCk7Ci0JCXJlcyA9IC0xOwotCQlnb3RvIEZpbmlzaGVkOwotCX0KLQlyZXMgPSAwOwotCWlmIChiZGlmZikgewotCQkvKiBiZGlmZiA9PSBOVUxMICJzaG91bGQgYmUiIGltcG9zc2libGUgbm93LCBidXQgcGVyaGFwcwotCQkgKiB0aGUgbGFzdCBjb21wYXJpc29uIGRvbmUgYnkgdGhlIGNoYXJhY3Rlcml6ZSgpIG9uIGEgaGFkCi0JCSAqIHRoZSBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgdGhlIGRpY3RzIGVxdWFsIQotCQkgKi8KLQkJcmVzID0gUHlPYmplY3RfQ29tcGFyZShhZGlmZiwgYmRpZmYpOwotCX0KLQlpZiAocmVzID09IDAgJiYgYnZhbCAhPSBOVUxMKQotCQlyZXMgPSBQeU9iamVjdF9Db21wYXJlKGF2YWwsIGJ2YWwpOworICAgIC8qIFNhbWUgbGVuZ3RoIC0tIGNoZWNrIGFsbCBrZXlzICovCisgICAgYmRpZmYgPSBidmFsID0gTlVMTDsKKyAgICBhZGlmZiA9IGNoYXJhY3Rlcml6ZShhLCBiLCAmYXZhbCk7CisgICAgaWYgKGFkaWZmID09IE5VTEwpIHsKKyAgICAgICAgYXNzZXJ0KCFhdmFsKTsKKyAgICAgICAgLyogRWl0aGVyIGFuIGVycm9yLCBvciBhIGlzIGEgc3Vic2V0IHdpdGggdGhlIHNhbWUgbGVuZ3RoIHNvCisgICAgICAgICAqIG11c3QgYmUgZXF1YWwuCisgICAgICAgICAqLworICAgICAgICByZXMgPSBQeUVycl9PY2N1cnJlZCgpID8gLTEgOiAwOworICAgICAgICBnb3RvIEZpbmlzaGVkOworICAgIH0KKyAgICBiZGlmZiA9IGNoYXJhY3Rlcml6ZShiLCBhLCAmYnZhbCk7CisgICAgaWYgKGJkaWZmID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBhc3NlcnQoIWJ2YWwpOworICAgICAgICByZXMgPSAtMTsKKyAgICAgICAgZ290byBGaW5pc2hlZDsKKyAgICB9CisgICAgcmVzID0gMDsKKyAgICBpZiAoYmRpZmYpIHsKKyAgICAgICAgLyogYmRpZmYgPT0gTlVMTCAic2hvdWxkIGJlIiBpbXBvc3NpYmxlIG5vdywgYnV0IHBlcmhhcHMKKyAgICAgICAgICogdGhlIGxhc3QgY29tcGFyaXNvbiBkb25lIGJ5IHRoZSBjaGFyYWN0ZXJpemUoKSBvbiBhIGhhZAorICAgICAgICAgKiB0aGUgc2lkZSBlZmZlY3Qgb2YgbWFraW5nIHRoZSBkaWN0cyBlcXVhbCEKKyAgICAgICAgICovCisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NvbXBhcmUoYWRpZmYsIGJkaWZmKTsKKyAgICB9CisgICAgaWYgKHJlcyA9PSAwICYmIGJ2YWwgIT0gTlVMTCkKKyAgICAgICAgcmVzID0gUHlPYmplY3RfQ29tcGFyZShhdmFsLCBidmFsKTsKIAogRmluaXNoZWQ6Ci0JUHlfWERFQ1JFRihhZGlmZik7Ci0JUHlfWERFQ1JFRihiZGlmZik7Ci0JUHlfWERFQ1JFRihhdmFsKTsKLQlQeV9YREVDUkVGKGJ2YWwpOwotCXJldHVybiByZXM7CisgICAgUHlfWERFQ1JFRihhZGlmZik7CisgICAgUHlfWERFQ1JFRihiZGlmZik7CisgICAgUHlfWERFQ1JFRihhdmFsKTsKKyAgICBQeV9YREVDUkVGKGJ2YWwpOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qIFJldHVybiAxIGlmIGRpY3RzIGVxdWFsLCAwIGlmIG5vdCwgLTEgaWYgZXJyb3IuCkBAIC0xODEwLDI4NCArMTgxMCwyODQgQEAKIHN0YXRpYyBpbnQKIGRpY3RfZXF1YWwoUHlEaWN0T2JqZWN0ICphLCBQeURpY3RPYmplY3QgKmIpCiB7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmIChhLT5tYV91c2VkICE9IGItPm1hX3VzZWQpCi0JCS8qIGNhbid0IGJlIGVxdWFsIGlmICMgb2YgZW50cmllcyBkaWZmZXIgKi8KLQkJcmV0dXJuIDA7CisgICAgaWYgKGEtPm1hX3VzZWQgIT0gYi0+bWFfdXNlZCkKKyAgICAgICAgLyogY2FuJ3QgYmUgZXF1YWwgaWYgIyBvZiBlbnRyaWVzIGRpZmZlciAqLworICAgICAgICByZXR1cm4gMDsKIAotCS8qIFNhbWUgIyBvZiBlbnRyaWVzIC0tIGNoZWNrIGFsbCBvZiAnZW0uICBFeGl0IGVhcmx5IG9uIGFueSBkaWZmLiAqLwotCWZvciAoaSA9IDA7IGkgPD0gYS0+bWFfbWFzazsgaSsrKSB7Ci0JCVB5T2JqZWN0ICphdmFsID0gYS0+bWFfdGFibGVbaV0ubWVfdmFsdWU7Ci0JCWlmIChhdmFsICE9IE5VTEwpIHsKLQkJCWludCBjbXA7Ci0JCQlQeU9iamVjdCAqYnZhbDsKLQkJCVB5T2JqZWN0ICprZXkgPSBhLT5tYV90YWJsZVtpXS5tZV9rZXk7Ci0JCQkvKiB0ZW1wb3JhcmlseSBidW1wIGF2YWwncyByZWZjb3VudCB0byBlbnN1cmUgaXQgc3RheXMKLQkJCSAgIGFsaXZlIHVudGlsIHdlJ3JlIGRvbmUgd2l0aCBpdCAqLwotCQkJUHlfSU5DUkVGKGF2YWwpOwotCQkJLyogZGl0dG8gZm9yIGtleSAqLwotCQkJUHlfSU5DUkVGKGtleSk7Ci0JCQlidmFsID0gUHlEaWN0X0dldEl0ZW0oKFB5T2JqZWN0ICopYiwga2V5KTsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJaWYgKGJ2YWwgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihhdmFsKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChhdmFsLCBidmFsLCBQeV9FUSk7Ci0JCQlQeV9ERUNSRUYoYXZhbCk7Ci0JCQlpZiAoY21wIDw9IDApICAvKiBlcnJvciBvciBub3QgZXF1YWwgKi8KLQkJCQlyZXR1cm4gY21wOwotIAkJfQotCX0KLQlyZXR1cm4gMTsKKyAgICAvKiBTYW1lICMgb2YgZW50cmllcyAtLSBjaGVjayBhbGwgb2YgJ2VtLiAgRXhpdCBlYXJseSBvbiBhbnkgZGlmZi4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IGEtPm1hX21hc2s7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqYXZhbCA9IGEtPm1hX3RhYmxlW2ldLm1lX3ZhbHVlOworICAgICAgICBpZiAoYXZhbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgY21wOworICAgICAgICAgICAgUHlPYmplY3QgKmJ2YWw7CisgICAgICAgICAgICBQeU9iamVjdCAqa2V5ID0gYS0+bWFfdGFibGVbaV0ubWVfa2V5OworICAgICAgICAgICAgLyogdGVtcG9yYXJpbHkgYnVtcCBhdmFsJ3MgcmVmY291bnQgdG8gZW5zdXJlIGl0IHN0YXlzCisgICAgICAgICAgICAgICBhbGl2ZSB1bnRpbCB3ZSdyZSBkb25lIHdpdGggaXQgKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihhdmFsKTsKKyAgICAgICAgICAgIC8qIGRpdHRvIGZvciBrZXkgKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOworICAgICAgICAgICAgYnZhbCA9IFB5RGljdF9HZXRJdGVtKChQeU9iamVjdCAqKWIsIGtleSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgIGlmIChidmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXZhbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woYXZhbCwgYnZhbCwgUHlfRVEpOworICAgICAgICAgICAgUHlfREVDUkVGKGF2YWwpOworICAgICAgICAgICAgaWYgKGNtcCA8PSAwKSAgLyogZXJyb3Igb3Igbm90IGVxdWFsICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKICB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X3JpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCWludCBjbXA7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBpbnQgY21wOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoIVB5RGljdF9DaGVjayh2KSB8fCAhUHlEaWN0X0NoZWNrKHcpKSB7Ci0JCXJlcyA9IFB5X05vdEltcGxlbWVudGVkOwotCX0KLQllbHNlIGlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkgewotCQljbXAgPSBkaWN0X2VxdWFsKChQeURpY3RPYmplY3QgKil2LCAoUHlEaWN0T2JqZWN0ICopdyk7Ci0JCWlmIChjbXAgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlcyA9IChjbXAgPT0gKG9wID09IFB5X0VRKSkgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0JfQotCWVsc2UgewotCQkvKiBQeTNLIHdhcm5pbmcgaWYgY29tcGFyaXNvbiBpc24ndCA9PSBvciAhPSAgKi8KLQkJaWYgKFB5RXJyX1dhcm5QeTNrKCJkaWN0IGluZXF1YWxpdHkgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCAiCi0JCQkJICAgImluIDMueCIsIDEpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmVzID0gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCVB5X0lOQ1JFRihyZXMpOwotCXJldHVybiByZXM7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sodikgfHwgIVB5RGljdF9DaGVjayh3KSkgeworICAgICAgICByZXMgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgZWxzZSBpZiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpIHsKKyAgICAgICAgY21wID0gZGljdF9lcXVhbCgoUHlEaWN0T2JqZWN0ICopdiwgKFB5RGljdE9iamVjdCAqKXcpOworICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXMgPSAoY21wID09IChvcCA9PSBQeV9FUSkpID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogUHkzSyB3YXJuaW5nIGlmIGNvbXBhcmlzb24gaXNuJ3QgPT0gb3IgIT0gICovCisgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygiZGljdCBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIDMueCIsIDEpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIFB5X0lOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7CiAgfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9jb250YWlucyhyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5KQogewotCWxvbmcgaGFzaDsKLQlQeURpY3RFbnRyeSAqZXA7CisgICAgbG9uZyBoYXNoOworICAgIFB5RGljdEVudHJ5ICplcDsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8Ci0JICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKLQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7Ci0JaWYgKGVwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoZXAtPm1lX3ZhbHVlICE9IE5VTEwpOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7CisgICAgaWYgKGVwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoZXAtPm1lX3ZhbHVlICE9IE5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9oYXNfa2V5KHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXkpCiB7Ci0JaWYgKFB5RXJyX1dhcm5QeTNrKCJkaWN0Lmhhc19rZXkoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgotCQkJICAgInVzZSB0aGUgaW4gb3BlcmF0b3IiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBkaWN0X2NvbnRhaW5zKG1wLCBrZXkpOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiZGljdC5oYXNfa2V5KCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInVzZSB0aGUgaW4gb3BlcmF0b3IiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBkaWN0X2NvbnRhaW5zKG1wLCBrZXkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9nZXQocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmtleTsKLQlQeU9iamVjdCAqZmFpbG9iaiA9IFB5X05vbmU7Ci0JUHlPYmplY3QgKnZhbCA9IE5VTEw7Ci0JbG9uZyBoYXNoOwotCVB5RGljdEVudHJ5ICplcDsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5T2JqZWN0ICpmYWlsb2JqID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqdmFsID0gTlVMTDsKKyAgICBsb25nIGhhc2g7CisgICAgUHlEaWN0RW50cnkgKmVwOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZ2V0IiwgMSwgMiwgJmtleSwgJmZhaWxvYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJnZXQiLCAxLCAyLCAma2V5LCAmZmFpbG9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKLQkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewotCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQlpZiAoZXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdmFsID0gZXAtPm1lX3ZhbHVlOwotCWlmICh2YWwgPT0gTlVMTCkKLQkJdmFsID0gZmFpbG9iajsKLQlQeV9JTkNSRUYodmFsKTsKLQlyZXR1cm4gdmFsOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7CisgICAgaWYgKGVwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHZhbCA9IGVwLT5tZV92YWx1ZTsKKyAgICBpZiAodmFsID09IE5VTEwpCisgICAgICAgIHZhbCA9IGZhaWxvYmo7CisgICAgUHlfSU5DUkVGKHZhbCk7CisgICAgcmV0dXJuIHZhbDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9zZXRkZWZhdWx0KHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICprZXk7Ci0JUHlPYmplY3QgKmZhaWxvYmogPSBQeV9Ob25lOwotCVB5T2JqZWN0ICp2YWwgPSBOVUxMOwotCWxvbmcgaGFzaDsKLQlQeURpY3RFbnRyeSAqZXA7CisgICAgUHlPYmplY3QgKmtleTsKKyAgICBQeU9iamVjdCAqZmFpbG9iaiA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKnZhbCA9IE5VTEw7CisgICAgbG9uZyBoYXNoOworICAgIFB5RGljdEVudHJ5ICplcDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNldGRlZmF1bHQiLCAxLCAyLCAma2V5LCAmZmFpbG9iaikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNldGRlZmF1bHQiLCAxLCAyLCAma2V5LCAmZmFpbG9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKLQkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewotCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQlpZiAoZXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdmFsID0gZXAtPm1lX3ZhbHVlOwotCWlmICh2YWwgPT0gTlVMTCkgewotCQl2YWwgPSBmYWlsb2JqOwotCQlpZiAoUHlEaWN0X1NldEl0ZW0oKFB5T2JqZWN0KiltcCwga2V5LCBmYWlsb2JqKSkKLQkJCXZhbCA9IE5VTEw7Ci0JfQotCVB5X1hJTkNSRUYodmFsKTsKLQlyZXR1cm4gdmFsOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7CisgICAgaWYgKGVwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHZhbCA9IGVwLT5tZV92YWx1ZTsKKyAgICBpZiAodmFsID09IE5VTEwpIHsKKyAgICAgICAgdmFsID0gZmFpbG9iajsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKChQeU9iamVjdCopbXAsIGtleSwgZmFpbG9iaikpCisgICAgICAgICAgICB2YWwgPSBOVUxMOworICAgIH0KKyAgICBQeV9YSU5DUkVGKHZhbCk7CisgICAgcmV0dXJuIHZhbDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9jbGVhcihyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wKQogewotCVB5RGljdF9DbGVhcigoUHlPYmplY3QgKiltcCk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlEaWN0X0NsZWFyKChQeU9iamVjdCAqKW1wKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfcG9wKFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgaGFzaDsKLQlQeURpY3RFbnRyeSAqZXA7Ci0JUHlPYmplY3QgKm9sZF92YWx1ZSwgKm9sZF9rZXk7Ci0JUHlPYmplY3QgKmtleSwgKmRlZmx0ID0gTlVMTDsKKyAgICBsb25nIGhhc2g7CisgICAgUHlEaWN0RW50cnkgKmVwOworICAgIFB5T2JqZWN0ICpvbGRfdmFsdWUsICpvbGRfa2V5OworICAgIFB5T2JqZWN0ICprZXksICpkZWZsdCA9IE5VTEw7CiAKLQlpZighUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvcCIsIDEsIDIsICZrZXksICZkZWZsdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChtcC0+bWFfdXNlZCA9PSAwKSB7Ci0JCWlmIChkZWZsdCkgewotCQkJUHlfSU5DUkVGKGRlZmx0KTsKLQkJCXJldHVybiBkZWZsdDsKLQkJfQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCi0JCQkJInBvcCgpOiBkaWN0aW9uYXJ5IGlzIGVtcHR5Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOwotCWlmIChlcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZXAtPm1lX3ZhbHVlID09IE5VTEwpIHsKLQkJaWYgKGRlZmx0KSB7Ci0JCQlQeV9JTkNSRUYoZGVmbHQpOwotCQkJcmV0dXJuIGRlZmx0OwotCQl9Ci0JCXNldF9rZXlfZXJyb3Ioa2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9sZF9rZXkgPSBlcC0+bWVfa2V5OwotCVB5X0lOQ1JFRihkdW1teSk7Ci0JZXAtPm1lX2tleSA9IGR1bW15OwotCW9sZF92YWx1ZSA9IGVwLT5tZV92YWx1ZTsKLQllcC0+bWVfdmFsdWUgPSBOVUxMOwotCW1wLT5tYV91c2VkLS07Ci0JUHlfREVDUkVGKG9sZF9rZXkpOwotCXJldHVybiBvbGRfdmFsdWU7CisgICAgaWYoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJwb3AiLCAxLCAyLCAma2V5LCAmZGVmbHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobXAtPm1hX3VzZWQgPT0gMCkgeworICAgICAgICBpZiAoZGVmbHQpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihkZWZsdCk7CisgICAgICAgICAgICByZXR1cm4gZGVmbHQ7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInBvcCgpOiBkaWN0aW9uYXJ5IGlzIGVtcHR5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOworICAgIGlmIChlcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZXAtPm1lX3ZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlZmx0KSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGVmbHQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmx0OworICAgICAgICB9CisgICAgICAgIHNldF9rZXlfZXJyb3Ioa2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9sZF9rZXkgPSBlcC0+bWVfa2V5OworICAgIFB5X0lOQ1JFRihkdW1teSk7CisgICAgZXAtPm1lX2tleSA9IGR1bW15OworICAgIG9sZF92YWx1ZSA9IGVwLT5tZV92YWx1ZTsKKyAgICBlcC0+bWVfdmFsdWUgPSBOVUxMOworICAgIG1wLT5tYV91c2VkLS07CisgICAgUHlfREVDUkVGKG9sZF9rZXkpOworICAgIHJldHVybiBvbGRfdmFsdWU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X3BvcGl0ZW0oUHlEaWN0T2JqZWN0ICptcCkKIHsKLQlQeV9zc2l6ZV90IGkgPSAwOwotCVB5RGljdEVudHJ5ICplcDsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5X3NzaXplX3QgaSA9IDA7CisgICAgUHlEaWN0RW50cnkgKmVwOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQkvKiBBbGxvY2F0ZSB0aGUgcmVzdWx0IHR1cGxlIGJlZm9yZSBjaGVja2luZyB0aGUgc2l6ZS4gIEJlbGlldmUgaXQKLQkgKiBvciBub3QsIHRoaXMgYWxsb2NhdGlvbiBjb3VsZCB0cmlnZ2VyIGEgZ2FyYmFnZSBjb2xsZWN0aW9uIHdoaWNoCi0JICogY291bGQgZW1wdHkgdGhlIGRpY3QsIHNvIGlmIHdlIGNoZWNrZWQgdGhlIHNpemUgZmlyc3QgYW5kIHRoYXQKLQkgKiBoYXBwZW5lZCwgdGhlIHJlc3VsdCB3b3VsZCBiZSBhbiBpbmZpbml0ZSBsb29wIChzZWFyY2hpbmcgZm9yIGFuCi0JICogZW50cnkgdGhhdCBubyBsb25nZXIgZXhpc3RzKS4gIE5vdGUgdGhhdCB0aGUgdXN1YWwgcG9waXRlbSgpCi0JICogaWRpb20gaXMgIndoaWxlIGQ6IGssIHYgPSBkLnBvcGl0ZW0oKSIuIHNvIG5lZWRpbmcgdG8gdGhyb3cgdGhlCi0JICogdHVwbGUgYXdheSBpZiB0aGUgZGljdCAqaXMqIGVtcHR5IGlzbid0IGEgc2lnbmlmaWNhbnQKLQkgKiBpbmVmZmljaWVuY3kgLS0gcG9zc2libGUsIGJ1dCB1bmxpa2VseSBpbiBwcmFjdGljZS4KLQkgKi8KLQlyZXMgPSBQeVR1cGxlX05ldygyKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChtcC0+bWFfdXNlZCA9PSAwKSB7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCi0JCQkJInBvcGl0ZW0oKTogZGljdGlvbmFyeSBpcyBlbXB0eSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogU2V0IGVwIHRvICJ0aGUgZmlyc3QiIGRpY3QgZW50cnkgd2l0aCBhIHZhbHVlLiAgV2UgYWJ1c2UgdGhlIGhhc2gKLQkgKiBmaWVsZCBvZiBzbG90IDAgdG8gaG9sZCBhIHNlYXJjaCBmaW5nZXI6Ci0JICogSWYgc2xvdCAwIGhhcyBhIHZhbHVlLCB1c2Ugc2xvdCAwLgotCSAqIEVsc2Ugc2xvdCAwIGlzIGJlaW5nIHVzZWQgdG8gaG9sZCBhIHNlYXJjaCBmaW5nZXIsCi0JICogYW5kIHdlIHVzZSBpdHMgaGFzaCB2YWx1ZSBhcyB0aGUgZmlyc3QgaW5kZXggdG8gbG9vay4KLQkgKi8KLQllcCA9ICZtcC0+bWFfdGFibGVbMF07Ci0JaWYgKGVwLT5tZV92YWx1ZSA9PSBOVUxMKSB7Ci0JCWkgPSBlcC0+bWVfaGFzaDsKLQkJLyogVGhlIGhhc2ggZmllbGQgbWF5IGJlIGEgcmVhbCBoYXNoIHZhbHVlLCBvciBpdCBtYXkgYmUgYQotCQkgKiBsZWdpdCBzZWFyY2ggZmluZ2VyLCBvciBpdCBtYXkgYmUgYSBvbmNlLWxlZ2l0IHNlYXJjaAotCQkgKiBmaW5nZXIgdGhhdCdzIG91dCBvZiBib3VuZHMgbm93IGJlY2F1c2UgaXQgd3JhcHBlZCBhcm91bmQKLQkJICogb3IgdGhlIHRhYmxlIHNocnVuayAtLSBzaW1wbHkgbWFrZSBzdXJlIGl0J3MgaW4gYm91bmRzIG5vdy4KLQkJICovCi0JCWlmIChpID4gbXAtPm1hX21hc2sgfHwgaSA8IDEpCi0JCQlpID0gMTsJLyogc2tpcCBzbG90IDAgKi8KLQkJd2hpbGUgKChlcCA9ICZtcC0+bWFfdGFibGVbaV0pLT5tZV92YWx1ZSA9PSBOVUxMKSB7Ci0JCQlpKys7Ci0JCQlpZiAoaSA+IG1wLT5tYV9tYXNrKQotCQkJCWkgPSAxOwotCQl9Ci0JfQotCVB5VHVwbGVfU0VUX0lURU0ocmVzLCAwLCBlcC0+bWVfa2V5KTsKLQlQeVR1cGxlX1NFVF9JVEVNKHJlcywgMSwgZXAtPm1lX3ZhbHVlKTsKLQlQeV9JTkNSRUYoZHVtbXkpOwotCWVwLT5tZV9rZXkgPSBkdW1teTsKLQllcC0+bWVfdmFsdWUgPSBOVUxMOwotCW1wLT5tYV91c2VkLS07Ci0JYXNzZXJ0KG1wLT5tYV90YWJsZVswXS5tZV92YWx1ZSA9PSBOVUxMKTsKLQltcC0+bWFfdGFibGVbMF0ubWVfaGFzaCA9IGkgKyAxOyAgLyogbmV4dCBwbGFjZSB0byBzdGFydCAqLwotCXJldHVybiByZXM7CisgICAgLyogQWxsb2NhdGUgdGhlIHJlc3VsdCB0dXBsZSBiZWZvcmUgY2hlY2tpbmcgdGhlIHNpemUuICBCZWxpZXZlIGl0CisgICAgICogb3Igbm90LCB0aGlzIGFsbG9jYXRpb24gY291bGQgdHJpZ2dlciBhIGdhcmJhZ2UgY29sbGVjdGlvbiB3aGljaAorICAgICAqIGNvdWxkIGVtcHR5IHRoZSBkaWN0LCBzbyBpZiB3ZSBjaGVja2VkIHRoZSBzaXplIGZpcnN0IGFuZCB0aGF0CisgICAgICogaGFwcGVuZWQsIHRoZSByZXN1bHQgd291bGQgYmUgYW4gaW5maW5pdGUgbG9vcCAoc2VhcmNoaW5nIGZvciBhbgorICAgICAqIGVudHJ5IHRoYXQgbm8gbG9uZ2VyIGV4aXN0cykuICBOb3RlIHRoYXQgdGhlIHVzdWFsIHBvcGl0ZW0oKQorICAgICAqIGlkaW9tIGlzICJ3aGlsZSBkOiBrLCB2ID0gZC5wb3BpdGVtKCkiLiBzbyBuZWVkaW5nIHRvIHRocm93IHRoZQorICAgICAqIHR1cGxlIGF3YXkgaWYgdGhlIGRpY3QgKmlzKiBlbXB0eSBpc24ndCBhIHNpZ25pZmljYW50CisgICAgICogaW5lZmZpY2llbmN5IC0tIHBvc3NpYmxlLCBidXQgdW5saWtlbHkgaW4gcHJhY3RpY2UuCisgICAgICovCisgICAgcmVzID0gUHlUdXBsZV9OZXcoMik7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobXAtPm1hX3VzZWQgPT0gMCkgeworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInBvcGl0ZW0oKTogZGljdGlvbmFyeSBpcyBlbXB0eSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogU2V0IGVwIHRvICJ0aGUgZmlyc3QiIGRpY3QgZW50cnkgd2l0aCBhIHZhbHVlLiAgV2UgYWJ1c2UgdGhlIGhhc2gKKyAgICAgKiBmaWVsZCBvZiBzbG90IDAgdG8gaG9sZCBhIHNlYXJjaCBmaW5nZXI6CisgICAgICogSWYgc2xvdCAwIGhhcyBhIHZhbHVlLCB1c2Ugc2xvdCAwLgorICAgICAqIEVsc2Ugc2xvdCAwIGlzIGJlaW5nIHVzZWQgdG8gaG9sZCBhIHNlYXJjaCBmaW5nZXIsCisgICAgICogYW5kIHdlIHVzZSBpdHMgaGFzaCB2YWx1ZSBhcyB0aGUgZmlyc3QgaW5kZXggdG8gbG9vay4KKyAgICAgKi8KKyAgICBlcCA9ICZtcC0+bWFfdGFibGVbMF07CisgICAgaWYgKGVwLT5tZV92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIGkgPSBlcC0+bWVfaGFzaDsKKyAgICAgICAgLyogVGhlIGhhc2ggZmllbGQgbWF5IGJlIGEgcmVhbCBoYXNoIHZhbHVlLCBvciBpdCBtYXkgYmUgYQorICAgICAgICAgKiBsZWdpdCBzZWFyY2ggZmluZ2VyLCBvciBpdCBtYXkgYmUgYSBvbmNlLWxlZ2l0IHNlYXJjaAorICAgICAgICAgKiBmaW5nZXIgdGhhdCdzIG91dCBvZiBib3VuZHMgbm93IGJlY2F1c2UgaXQgd3JhcHBlZCBhcm91bmQKKyAgICAgICAgICogb3IgdGhlIHRhYmxlIHNocnVuayAtLSBzaW1wbHkgbWFrZSBzdXJlIGl0J3MgaW4gYm91bmRzIG5vdy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChpID4gbXAtPm1hX21hc2sgfHwgaSA8IDEpCisgICAgICAgICAgICBpID0gMTsgICAgICAgICAgICAgIC8qIHNraXAgc2xvdCAwICovCisgICAgICAgIHdoaWxlICgoZXAgPSAmbXAtPm1hX3RhYmxlW2ldKS0+bWVfdmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaWYgKGkgPiBtcC0+bWFfbWFzaykKKyAgICAgICAgICAgICAgICBpID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKHJlcywgMCwgZXAtPm1lX2tleSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXMsIDEsIGVwLT5tZV92YWx1ZSk7CisgICAgUHlfSU5DUkVGKGR1bW15KTsKKyAgICBlcC0+bWVfa2V5ID0gZHVtbXk7CisgICAgZXAtPm1lX3ZhbHVlID0gTlVMTDsKKyAgICBtcC0+bWFfdXNlZC0tOworICAgIGFzc2VydChtcC0+bWFfdGFibGVbMF0ubWVfdmFsdWUgPT0gTlVMTCk7CisgICAgbXAtPm1hX3RhYmxlWzBdLm1lX2hhc2ggPSBpICsgMTsgIC8qIG5leHQgcGxhY2UgdG8gc3RhcnQgKi8KKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBkaWN0X3RyYXZlcnNlKFB5T2JqZWN0ICpvcCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfc3NpemVfdCBpID0gMDsKLQlQeU9iamVjdCAqcGs7Ci0JUHlPYmplY3QgKnB2OworICAgIFB5X3NzaXplX3QgaSA9IDA7CisgICAgUHlPYmplY3QgKnBrOworICAgIFB5T2JqZWN0ICpwdjsKIAotCXdoaWxlIChQeURpY3RfTmV4dChvcCwgJmksICZwaywgJnB2KSkgewotCQlQeV9WSVNJVChwayk7Ci0JCVB5X1ZJU0lUKHB2KTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KG9wLCAmaSwgJnBrLCAmcHYpKSB7CisgICAgICAgIFB5X1ZJU0lUKHBrKTsKKyAgICAgICAgUHlfVklTSVQocHYpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogZGljdF90cF9jbGVhcihQeU9iamVjdCAqb3ApCiB7Ci0JUHlEaWN0X0NsZWFyKG9wKTsKLQlyZXR1cm4gMDsKKyAgICBQeURpY3RfQ2xlYXIob3ApOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTIwOTksMzAgKzIwOTksMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2l0ZXJrZXlzKFB5RGljdE9iamVjdCAqZGljdCkKIHsKLQlyZXR1cm4gZGljdGl0ZXJfbmV3KGRpY3QsICZQeURpY3RJdGVyS2V5X1R5cGUpOworICAgIHJldHVybiBkaWN0aXRlcl9uZXcoZGljdCwgJlB5RGljdEl0ZXJLZXlfVHlwZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2l0ZXJ2YWx1ZXMoUHlEaWN0T2JqZWN0ICpkaWN0KQogewotCXJldHVybiBkaWN0aXRlcl9uZXcoZGljdCwgJlB5RGljdEl0ZXJWYWx1ZV9UeXBlKTsKKyAgICByZXR1cm4gZGljdGl0ZXJfbmV3KGRpY3QsICZQeURpY3RJdGVyVmFsdWVfVHlwZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2l0ZXJpdGVtcyhQeURpY3RPYmplY3QgKmRpY3QpCiB7Ci0JcmV0dXJuIGRpY3RpdGVyX25ldyhkaWN0LCAmUHlEaWN0SXRlckl0ZW1fVHlwZSk7CisgICAgcmV0dXJuIGRpY3RpdGVyX25ldyhkaWN0LCAmUHlEaWN0SXRlckl0ZW1fVHlwZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X3NpemVvZihQeURpY3RPYmplY3QgKm1wKQogewotCVB5X3NzaXplX3QgcmVzOworICAgIFB5X3NzaXplX3QgcmVzOwogCi0JcmVzID0gc2l6ZW9mKFB5RGljdE9iamVjdCk7Ci0JaWYgKG1wLT5tYV90YWJsZSAhPSBtcC0+bWFfc21hbGx0YWJsZSkKLQkJcmVzID0gcmVzICsgKG1wLT5tYV9tYXNrICsgMSkgKiBzaXplb2YoUHlEaWN0RW50cnkpOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOworICAgIHJlcyA9IHNpemVvZihQeURpY3RPYmplY3QpOworICAgIGlmIChtcC0+bWFfdGFibGUgIT0gbXAtPm1hX3NtYWxsdGFibGUpCisgICAgICAgIHJlcyA9IHJlcyArIChtcC0+bWFfbWFzayArIDEpICogc2l6ZW9mKFB5RGljdEVudHJ5KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogUHlEb2NfU1RSVkFSKGhhc19rZXlfX2RvY19fLApAQCAtMjE5MCwxNDAgKzIxOTAsMTQwIEBACiBzdGF0aWMgUHlPYmplY3QgKmRpY3R2YWx1ZXNfbmV3KFB5T2JqZWN0ICopOwogCiBQeURvY19TVFJWQVIodmlld2tleXNfX2RvY19fLAotCSAgICAgIkQudmlld2tleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzIik7CisgICAgICAgICAgICAgIkQudmlld2tleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzIik7CiBQeURvY19TVFJWQVIodmlld2l0ZW1zX19kb2NfXywKLQkgICAgICJELnZpZXdpdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zIik7CisgICAgICAgICAgICAgIkQudmlld2l0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3MgaXRlbXMiKTsKIFB5RG9jX1NUUlZBUih2aWV3dmFsdWVzX19kb2NfXywKLQkgICAgICJELnZpZXd2YWx1ZXMoKSAtPiBhbiBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3MgdmFsdWVzIik7CisgICAgICAgICAgICAgIkQudmlld3ZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXMiKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1hcHBfbWV0aG9kc1tdID0gewotCXsiX19jb250YWluc19fIiwoUHlDRnVuY3Rpb24pZGljdF9jb250YWlucywJTUVUSF9PIHwgTUVUSF9DT0VYSVNULAotCSBjb250YWluc19fZG9jX199LAotCXsiX19nZXRpdGVtX18iLCAoUHlDRnVuY3Rpb24pZGljdF9zdWJzY3JpcHQsCU1FVEhfTyB8IE1FVEhfQ09FWElTVCwKLQkgZ2V0aXRlbV9fZG9jX199LAotCXsiX19zaXplb2ZfXyIsCShQeUNGdW5jdGlvbilkaWN0X3NpemVvZiwJTUVUSF9OT0FSR1MsCi0JIHNpemVvZl9fZG9jX199LAotCXsiaGFzX2tleSIsCShQeUNGdW5jdGlvbilkaWN0X2hhc19rZXksICAgICAgTUVUSF9PLAotCSBoYXNfa2V5X19kb2NfX30sCi0JeyJnZXQiLCAgICAgICAgIChQeUNGdW5jdGlvbilkaWN0X2dldCwgICAgICAgICAgTUVUSF9WQVJBUkdTLAotCSBnZXRfX2RvY19ffSwKLQl7InNldGRlZmF1bHQiLCAgKFB5Q0Z1bmN0aW9uKWRpY3Rfc2V0ZGVmYXVsdCwgICBNRVRIX1ZBUkFSR1MsCi0JIHNldGRlZmF1bHRfZG9jX199LAotCXsicG9wIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9wb3AsICAgICAgICAgIE1FVEhfVkFSQVJHUywKLQkgcG9wX19kb2NfX30sCi0JeyJwb3BpdGVtIiwJKFB5Q0Z1bmN0aW9uKWRpY3RfcG9waXRlbSwJTUVUSF9OT0FSR1MsCi0JIHBvcGl0ZW1fX2RvY19ffSwKLQl7ImtleXMiLAkoUHlDRnVuY3Rpb24pZGljdF9rZXlzLAkJTUVUSF9OT0FSR1MsCi0Ja2V5c19fZG9jX199LAotCXsiaXRlbXMiLAkoUHlDRnVuY3Rpb24pZGljdF9pdGVtcywJTUVUSF9OT0FSR1MsCi0JIGl0ZW1zX19kb2NfX30sCi0JeyJ2YWx1ZXMiLAkoUHlDRnVuY3Rpb24pZGljdF92YWx1ZXMsCU1FVEhfTk9BUkdTLAotCSB2YWx1ZXNfX2RvY19ffSwKLQl7InZpZXdrZXlzIiwJKFB5Q0Z1bmN0aW9uKWRpY3RrZXlzX25ldywJTUVUSF9OT0FSR1MsCi0JIHZpZXdrZXlzX19kb2NfX30sCi0JeyJ2aWV3aXRlbXMiLAkoUHlDRnVuY3Rpb24pZGljdGl0ZW1zX25ldywJTUVUSF9OT0FSR1MsCi0JIHZpZXdpdGVtc19fZG9jX199LAotCXsidmlld3ZhbHVlcyIsCShQeUNGdW5jdGlvbilkaWN0dmFsdWVzX25ldywJTUVUSF9OT0FSR1MsCi0JIHZpZXd2YWx1ZXNfX2RvY19ffSwKLQl7InVwZGF0ZSIsCShQeUNGdW5jdGlvbilkaWN0X3VwZGF0ZSwJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkgdXBkYXRlX19kb2NfX30sCi0JeyJmcm9ta2V5cyIsCShQeUNGdW5jdGlvbilkaWN0X2Zyb21rZXlzLAlNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLAotCSBmcm9ta2V5c19fZG9jX199LAotCXsiY2xlYXIiLAkoUHlDRnVuY3Rpb24pZGljdF9jbGVhciwJTUVUSF9OT0FSR1MsCi0JIGNsZWFyX19kb2NfX30sCi0JeyJjb3B5IiwJKFB5Q0Z1bmN0aW9uKWRpY3RfY29weSwJCU1FVEhfTk9BUkdTLAotCSBjb3B5X19kb2NfX30sCi0JeyJpdGVya2V5cyIsCShQeUNGdW5jdGlvbilkaWN0X2l0ZXJrZXlzLAlNRVRIX05PQVJHUywKLQkgaXRlcmtleXNfX2RvY19ffSwKLQl7Iml0ZXJ2YWx1ZXMiLAkoUHlDRnVuY3Rpb24pZGljdF9pdGVydmFsdWVzLAlNRVRIX05PQVJHUywKLQkgaXRlcnZhbHVlc19fZG9jX199LAotCXsiaXRlcml0ZW1zIiwJKFB5Q0Z1bmN0aW9uKWRpY3RfaXRlcml0ZW1zLAlNRVRIX05PQVJHUywKLQkgaXRlcml0ZW1zX19kb2NfX30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiX19jb250YWluc19fIiwoUHlDRnVuY3Rpb24pZGljdF9jb250YWlucywgICAgICAgICBNRVRIX08gfCBNRVRIX0NPRVhJU1QsCisgICAgIGNvbnRhaW5zX19kb2NfX30sCisgICAgeyJfX2dldGl0ZW1fXyIsIChQeUNGdW5jdGlvbilkaWN0X3N1YnNjcmlwdCwgICAgICAgIE1FVEhfTyB8IE1FVEhfQ09FWElTVCwKKyAgICAgZ2V0aXRlbV9fZG9jX199LAorICAgIHsiX19zaXplb2ZfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3Rfc2l6ZW9mLCAgICAgICBNRVRIX05PQVJHUywKKyAgICAgc2l6ZW9mX19kb2NfX30sCisgICAgeyJoYXNfa2V5IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9oYXNfa2V5LCAgICAgIE1FVEhfTywKKyAgICAgaGFzX2tleV9fZG9jX199LAorICAgIHsiZ2V0IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9nZXQsICAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgZ2V0X19kb2NfX30sCisgICAgeyJzZXRkZWZhdWx0IiwgIChQeUNGdW5jdGlvbilkaWN0X3NldGRlZmF1bHQsICAgTUVUSF9WQVJBUkdTLAorICAgICBzZXRkZWZhdWx0X2RvY19ffSwKKyAgICB7InBvcCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfcG9wLCAgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIHBvcF9fZG9jX199LAorICAgIHsicG9waXRlbSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfcG9waXRlbSwgICAgICBNRVRIX05PQVJHUywKKyAgICAgcG9waXRlbV9fZG9jX199LAorICAgIHsia2V5cyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3Rfa2V5cywgICAgICAgICBNRVRIX05PQVJHUywKKyAgICBrZXlzX19kb2NfX30sCisgICAgeyJpdGVtcyIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9pdGVtcywgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBpdGVtc19fZG9jX199LAorICAgIHsidmFsdWVzIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfdmFsdWVzLCAgICAgICBNRVRIX05PQVJHUywKKyAgICAgdmFsdWVzX19kb2NfX30sCisgICAgeyJ2aWV3a2V5cyIsICAgICAgICAoUHlDRnVuY3Rpb24pZGljdGtleXNfbmV3LCAgICAgIE1FVEhfTk9BUkdTLAorICAgICB2aWV3a2V5c19fZG9jX199LAorICAgIHsidmlld2l0ZW1zIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RpdGVtc19uZXcsICAgICBNRVRIX05PQVJHUywKKyAgICAgdmlld2l0ZW1zX19kb2NfX30sCisgICAgeyJ2aWV3dmFsdWVzIiwgICAgICAoUHlDRnVuY3Rpb24pZGljdHZhbHVlc19uZXcsICAgIE1FVEhfTk9BUkdTLAorICAgICB2aWV3dmFsdWVzX19kb2NfX30sCisgICAgeyJ1cGRhdGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF91cGRhdGUsICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgIHVwZGF0ZV9fZG9jX199LAorICAgIHsiZnJvbWtleXMiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfZnJvbWtleXMsICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLAorICAgICBmcm9ta2V5c19fZG9jX199LAorICAgIHsiY2xlYXIiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfY2xlYXIsICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgY2xlYXJfX2RvY19ffSwKKyAgICB7ImNvcHkiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilkaWN0X2NvcHksICAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIGNvcHlfX2RvY19ffSwKKyAgICB7Iml0ZXJrZXlzIiwgICAgICAgIChQeUNGdW5jdGlvbilkaWN0X2l0ZXJrZXlzLCAgICAgTUVUSF9OT0FSR1MsCisgICAgIGl0ZXJrZXlzX19kb2NfX30sCisgICAgeyJpdGVydmFsdWVzIiwgICAgICAoUHlDRnVuY3Rpb24pZGljdF9pdGVydmFsdWVzLCAgIE1FVEhfTk9BUkdTLAorICAgICBpdGVydmFsdWVzX19kb2NfX30sCisgICAgeyJpdGVyaXRlbXMiLCAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9pdGVyaXRlbXMsICAgIE1FVEhfTk9BUkdTLAorICAgICBpdGVyaXRlbXNfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIFJldHVybiAxIGlmIGBrZXlgIGlzIGluIGRpY3QgYG9wYCwgMCBpZiBub3QsIGFuZCAtMSBvbiBlcnJvci4gKi8KIGludAogUHlEaWN0X0NvbnRhaW5zKFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKmtleSkKIHsKLQlsb25nIGhhc2g7Ci0JUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilvcDsKLQlQeURpY3RFbnRyeSAqZXA7CisgICAgbG9uZyBoYXNoOworICAgIFB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7CisgICAgUHlEaWN0RW50cnkgKmVwOwogCi0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKLQkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewotCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7Ci0JcmV0dXJuIGVwID09IE5VTEwgPyAtMSA6IChlcC0+bWVfdmFsdWUgIT0gTlVMTCk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKKyAgICAgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7CisgICAgcmV0dXJuIGVwID09IE5VTEwgPyAtMSA6IChlcC0+bWVfdmFsdWUgIT0gTlVMTCk7CiB9CiAKIC8qIEludGVybmFsIHZlcnNpb24gb2YgUHlEaWN0X0NvbnRhaW5zIHVzZWQgd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBhbHJlYWR5IGtub3duICovCiBpbnQKIF9QeURpY3RfQ29udGFpbnMoUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpCiB7Ci0JUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilvcDsKLQlQeURpY3RFbnRyeSAqZXA7CisgICAgUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilvcDsKKyAgICBQeURpY3RFbnRyeSAqZXA7CiAKLQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQlyZXR1cm4gZXAgPT0gTlVMTCA/IC0xIDogKGVwLT5tZV92YWx1ZSAhPSBOVUxMKTsKKyAgICBlcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKKyAgICByZXR1cm4gZXAgPT0gTlVMTCA/IC0xIDogKGVwLT5tZV92YWx1ZSAhPSBOVUxMKTsKIH0KIAogLyogSGFjayB0byBpbXBsZW1lbnQgImtleSBpbiBkaWN0IiAqLwogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGRpY3RfYXNfc2VxdWVuY2UgPSB7Ci0JMCwJCQkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCS8qIHNxX2NvbmNhdCAqLwotCTAsCQkJLyogc3FfcmVwZWF0ICovCi0JMCwJCQkvKiBzcV9pdGVtICovCi0JMCwJCQkvKiBzcV9zbGljZSAqLwotCTAsCQkJLyogc3FfYXNzX2l0ZW0gKi8KLQkwLAkJCS8qIHNxX2Fzc19zbGljZSAqLwotCVB5RGljdF9Db250YWlucywJLyogc3FfY29udGFpbnMgKi8KLQkwLAkJCS8qIHNxX2lucGxhY2VfY29uY2F0ICovCi0JMCwJCQkvKiBzcV9pbnBsYWNlX3JlcGVhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9sZW5ndGggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIFB5RGljdF9Db250YWlucywgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pbnBsYWNlX3JlcGVhdCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOwogCi0JYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKLQlzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgIT0gTlVMTCkgewotCQlQeURpY3RPYmplY3QgKmQgPSAoUHlEaWN0T2JqZWN0ICopc2VsZjsKLQkJLyogSXQncyBndWFyYW50ZWVkIHRoYXQgdHAtPmFsbG9jIHplcm9lZCBvdXQgdGhlIHN0cnVjdC4gKi8KLQkJYXNzZXJ0KGQtPm1hX3RhYmxlID09IE5VTEwgJiYgZC0+bWFfZmlsbCA9PSAwICYmIGQtPm1hX3VzZWQgPT0gMCk7Ci0JCUlOSVRfTk9OWkVST19ESUNUX1NMT1RTKGQpOwotCQlkLT5tYV9sb29rdXAgPSBsb29rZGljdF9zdHJpbmc7Ci0JCS8qIFRoZSBvYmplY3QgaGFzIGJlZW4gaW1wbGljaXRlbHkgdHJhY2tlZCBieSB0cF9hbGxvYyAqLwotCQlpZiAodHlwZSA9PSAmUHlEaWN0X1R5cGUpCi0JCQlfUHlPYmplY3RfR0NfVU5UUkFDSyhkKTsKKyAgICBhc3NlcnQodHlwZSAhPSBOVUxMICYmIHR5cGUtPnRwX2FsbG9jICE9IE5VTEwpOworICAgIHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIFB5RGljdE9iamVjdCAqZCA9IChQeURpY3RPYmplY3QgKilzZWxmOworICAgICAgICAvKiBJdCdzIGd1YXJhbnRlZWQgdGhhdCB0cC0+YWxsb2MgemVyb2VkIG91dCB0aGUgc3RydWN0LiAqLworICAgICAgICBhc3NlcnQoZC0+bWFfdGFibGUgPT0gTlVMTCAmJiBkLT5tYV9maWxsID09IDAgJiYgZC0+bWFfdXNlZCA9PSAwKTsKKyAgICAgICAgSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMoZCk7CisgICAgICAgIGQtPm1hX2xvb2t1cCA9IGxvb2tkaWN0X3N0cmluZzsKKyAgICAgICAgLyogVGhlIG9iamVjdCBoYXMgYmVlbiBpbXBsaWNpdGVseSB0cmFja2VkIGJ5IHRwX2FsbG9jICovCisgICAgICAgIGlmICh0eXBlID09ICZQeURpY3RfVHlwZSkKKyAgICAgICAgICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKGQpOwogI2lmZGVmIFNIT1dfQ09OVkVSU0lPTl9DT1VOVFMKLQkJKytjcmVhdGVkOworICAgICAgICArK2NyZWF0ZWQ7CiAjZW5kaWYKICNpZmRlZiBTSE9XX1RSQUNLX0NPVU5UCi0JCWlmIChfUHlPYmplY3RfR0NfSVNfVFJBQ0tFRChkKSkKLQkJCWNvdW50X3RyYWNrZWQrKzsKLQkJZWxzZQotCQkJY291bnRfdW50cmFja2VkKys7CisgICAgICAgIGlmIChfUHlPYmplY3RfR0NfSVNfVFJBQ0tFRChkKSkKKyAgICAgICAgICAgIGNvdW50X3RyYWNrZWQrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY291bnRfdW50cmFja2VkKys7CiAjZW5kaWYKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiBzdGF0aWMgaW50CiBkaWN0X2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gZGljdF91cGRhdGVfY29tbW9uKHNlbGYsIGFyZ3MsIGt3ZHMsICJkaWN0Iik7CisgICAgcmV0dXJuIGRpY3RfdXBkYXRlX2NvbW1vbihzZWxmLCBhcmdzLCBrd2RzLCAiZGljdCIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9pdGVyKFB5RGljdE9iamVjdCAqZGljdCkKIHsKLQlyZXR1cm4gZGljdGl0ZXJfbmV3KGRpY3QsICZQeURpY3RJdGVyS2V5X1R5cGUpOworICAgIHJldHVybiBkaWN0aXRlcl9uZXcoZGljdCwgJlB5RGljdEl0ZXJLZXlfVHlwZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihkaWN0aW9uYXJ5X2RvYywKQEAgLTIzMzgsNDYgKzIzMzgsNDYgQEAKICIgICAgaW4gdGhlIGtleXdvcmQgYXJndW1lbnQgbGlzdC4gIEZvciBleGFtcGxlOiAgZGljdChvbmU9MSwgdHdvPTIpIik7CiAKIFB5VHlwZU9iamVjdCBQeURpY3RfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJkaWN0IiwKLQlzaXplb2YoUHlEaWN0T2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWRpY3RfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKWRpY3RfcHJpbnQsCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpZGljdF9jb21wYXJlLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZGljdF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJmRpY3RfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkmZGljdF9hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkLAkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19ESUNUX1NVQkNMQVNTLAkvKiB0cF9mbGFncyAqLwotCWRpY3Rpb25hcnlfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQlkaWN0X3RyYXZlcnNlLAkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCWRpY3RfdHBfY2xlYXIsCQkJCS8qIHRwX2NsZWFyICovCi0JZGljdF9yaWNoY29tcGFyZSwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCShnZXRpdGVyZnVuYylkaWN0X2l0ZXIsCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCW1hcHBfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JZGljdF9pbml0LAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCWRpY3RfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJkaWN0IiwKKyAgICBzaXplb2YoUHlEaWN0T2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWRpY3RfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpZGljdF9wcmludCwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYylkaWN0X2NvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpZGljdF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZkaWN0X2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmZGljdF9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkLCAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19ESUNUX1NVQkNMQVNTLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZGljdGlvbmFyeV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICBkaWN0X3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgZGljdF90cF9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIGRpY3RfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgKGdldGl0ZXJmdW5jKWRpY3RfaXRlciwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIG1hcHBfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIGRpY3RfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBkaWN0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZGljdGlvbmFyeSBpbnRlcmZhY2UgKi8KQEAgLTIzODUsMzM4ICsyMzg1LDMzOCBAQAogUHlPYmplY3QgKgogUHlEaWN0X0dldEl0ZW1TdHJpbmcoUHlPYmplY3QgKnYsIGNvbnN0IGNoYXIgKmtleSkKIHsKLQlQeU9iamVjdCAqa3YsICpydjsKLQlrdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoa2V5KTsKLQlpZiAoa3YgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcnYgPSBQeURpY3RfR2V0SXRlbSh2LCBrdik7Ci0JUHlfREVDUkVGKGt2KTsKLQlyZXR1cm4gcnY7CisgICAgUHlPYmplY3QgKmt2LCAqcnY7CisgICAga3YgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7CisgICAgaWYgKGt2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gUHlEaWN0X0dldEl0ZW0odiwga3YpOworICAgIFB5X0RFQ1JFRihrdik7CisgICAgcmV0dXJuIHJ2OwogfQogCiBpbnQKIFB5RGljdF9TZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICp2LCBjb25zdCBjaGFyICprZXksIFB5T2JqZWN0ICppdGVtKQogewotCVB5T2JqZWN0ICprdjsKLQlpbnQgZXJyOwotCWt2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOwotCWlmIChrdiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgma3YpOyAvKiBYWFggU2hvdWxkIHdlIHJlYWxseT8gKi8KLQllcnIgPSBQeURpY3RfU2V0SXRlbSh2LCBrdiwgaXRlbSk7Ci0JUHlfREVDUkVGKGt2KTsKLQlyZXR1cm4gZXJyOworICAgIFB5T2JqZWN0ICprdjsKKyAgICBpbnQgZXJyOworICAgIGt2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOworICAgIGlmIChrdiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgma3YpOyAvKiBYWFggU2hvdWxkIHdlIHJlYWxseT8gKi8KKyAgICBlcnIgPSBQeURpY3RfU2V0SXRlbSh2LCBrdiwgaXRlbSk7CisgICAgUHlfREVDUkVGKGt2KTsKKyAgICByZXR1cm4gZXJyOwogfQogCiBpbnQKIFB5RGljdF9EZWxJdGVtU3RyaW5nKFB5T2JqZWN0ICp2LCBjb25zdCBjaGFyICprZXkpCiB7Ci0JUHlPYmplY3QgKmt2OwotCWludCBlcnI7Ci0Ja3YgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7Ci0JaWYgKGt2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQllcnIgPSBQeURpY3RfRGVsSXRlbSh2LCBrdik7Ci0JUHlfREVDUkVGKGt2KTsKLQlyZXR1cm4gZXJyOworICAgIFB5T2JqZWN0ICprdjsKKyAgICBpbnQgZXJyOworICAgIGt2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOworICAgIGlmIChrdiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZXJyID0gUHlEaWN0X0RlbEl0ZW0odiwga3YpOworICAgIFB5X0RFQ1JFRihrdik7CisgICAgcmV0dXJuIGVycjsKIH0KIAogLyogRGljdGlvbmFyeSBpdGVyYXRvciB0eXBlcyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5RGljdE9iamVjdCAqZGlfZGljdDsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KLQlQeV9zc2l6ZV90IGRpX3VzZWQ7Ci0JUHlfc3NpemVfdCBkaV9wb3M7Ci0JUHlPYmplY3QqIGRpX3Jlc3VsdDsgLyogcmV1c2FibGUgcmVzdWx0IHR1cGxlIGZvciBpdGVyaXRlbXMgKi8KLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlEaWN0T2JqZWN0ICpkaV9kaWN0OyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5X3NzaXplX3QgZGlfdXNlZDsKKyAgICBQeV9zc2l6ZV90IGRpX3BvczsKKyAgICBQeU9iamVjdCogZGlfcmVzdWx0OyAvKiByZXVzYWJsZSByZXN1bHQgdHVwbGUgZm9yIGl0ZXJpdGVtcyAqLworICAgIFB5X3NzaXplX3QgbGVuOwogfSBkaWN0aXRlcm9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RpdGVyX25ldyhQeURpY3RPYmplY3QgKmRpY3QsIFB5VHlwZU9iamVjdCAqaXRlcnR5cGUpCiB7Ci0JZGljdGl0ZXJvYmplY3QgKmRpOwotCWRpID0gUHlPYmplY3RfR0NfTmV3KGRpY3RpdGVyb2JqZWN0LCBpdGVydHlwZSk7Ci0JaWYgKGRpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihkaWN0KTsKLQlkaS0+ZGlfZGljdCA9IGRpY3Q7Ci0JZGktPmRpX3VzZWQgPSBkaWN0LT5tYV91c2VkOwotCWRpLT5kaV9wb3MgPSAwOwotCWRpLT5sZW4gPSBkaWN0LT5tYV91c2VkOwotCWlmIChpdGVydHlwZSA9PSAmUHlEaWN0SXRlckl0ZW1fVHlwZSkgewotCQlkaS0+ZGlfcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDIsIFB5X05vbmUsIFB5X05vbmUpOwotCQlpZiAoZGktPmRpX3Jlc3VsdCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZGkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JZWxzZQotCQlkaS0+ZGlfcmVzdWx0ID0gTlVMTDsKLQlfUHlPYmplY3RfR0NfVFJBQ0soZGkpOwotCXJldHVybiAoUHlPYmplY3QgKilkaTsKKyAgICBkaWN0aXRlcm9iamVjdCAqZGk7CisgICAgZGkgPSBQeU9iamVjdF9HQ19OZXcoZGljdGl0ZXJvYmplY3QsIGl0ZXJ0eXBlKTsKKyAgICBpZiAoZGkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKGRpY3QpOworICAgIGRpLT5kaV9kaWN0ID0gZGljdDsKKyAgICBkaS0+ZGlfdXNlZCA9IGRpY3QtPm1hX3VzZWQ7CisgICAgZGktPmRpX3BvcyA9IDA7CisgICAgZGktPmxlbiA9IGRpY3QtPm1hX3VzZWQ7CisgICAgaWYgKGl0ZXJ0eXBlID09ICZQeURpY3RJdGVySXRlbV9UeXBlKSB7CisgICAgICAgIGRpLT5kaV9yZXN1bHQgPSBQeVR1cGxlX1BhY2soMiwgUHlfTm9uZSwgUHlfTm9uZSk7CisgICAgICAgIGlmIChkaS0+ZGlfcmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkaSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIGRpLT5kaV9yZXN1bHQgPSBOVUxMOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhkaSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRpOwogfQogCiBzdGF0aWMgdm9pZAogZGljdGl0ZXJfZGVhbGxvYyhkaWN0aXRlcm9iamVjdCAqZGkpCiB7Ci0JUHlfWERFQ1JFRihkaS0+ZGlfZGljdCk7Ci0JUHlfWERFQ1JFRihkaS0+ZGlfcmVzdWx0KTsKLQlQeU9iamVjdF9HQ19EZWwoZGkpOworICAgIFB5X1hERUNSRUYoZGktPmRpX2RpY3QpOworICAgIFB5X1hERUNSRUYoZGktPmRpX3Jlc3VsdCk7CisgICAgUHlPYmplY3RfR0NfRGVsKGRpKTsKIH0KIAogc3RhdGljIGludAogZGljdGl0ZXJfdHJhdmVyc2UoZGljdGl0ZXJvYmplY3QgKmRpLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChkaS0+ZGlfZGljdCk7Ci0JUHlfVklTSVQoZGktPmRpX3Jlc3VsdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoZGktPmRpX2RpY3QpOworICAgIFB5X1ZJU0lUKGRpLT5kaV9yZXN1bHQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdGl0ZXJfbGVuKGRpY3RpdGVyb2JqZWN0ICpkaSkKIHsKLQlQeV9zc2l6ZV90IGxlbiA9IDA7Ci0JaWYgKGRpLT5kaV9kaWN0ICE9IE5VTEwgJiYgZGktPmRpX3VzZWQgPT0gZGktPmRpX2RpY3QtPm1hX3VzZWQpCi0JCWxlbiA9IGRpLT5sZW47Ci0JcmV0dXJuIFB5SW50X0Zyb21TaXplX3QobGVuKTsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IDA7CisgICAgaWYgKGRpLT5kaV9kaWN0ICE9IE5VTEwgJiYgZGktPmRpX3VzZWQgPT0gZGktPmRpX2RpY3QtPm1hX3VzZWQpCisgICAgICAgIGxlbiA9IGRpLT5sZW47CisgICAgcmV0dXJuIFB5SW50X0Zyb21TaXplX3QobGVuKTsKIH0KIAogUHlEb2NfU1RSVkFSKGxlbmd0aF9oaW50X2RvYywgIlByaXZhdGUgbWV0aG9kIHJldHVybmluZyBhbiBlc3RpbWF0ZSBvZiBsZW4obGlzdChpdCkpLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgZGljdGl0ZXJfbWV0aG9kc1tdID0gewotCXsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKWRpY3RpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pZGljdGl0ZXJfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpkaWN0aXRlcl9pdGVybmV4dGtleShkaWN0aXRlcm9iamVjdCAqZGkpCiB7Ci0JUHlPYmplY3QgKmtleTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGksIG1hc2s7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwotCVB5RGljdE9iamVjdCAqZCA9IGRpLT5kaV9kaWN0OworICAgIFB5T2JqZWN0ICprZXk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBtYXNrOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeURpY3RPYmplY3QgKmQgPSBkaS0+ZGlfZGljdDsKIAotCWlmIChkID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydCAoUHlEaWN0X0NoZWNrKGQpKTsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQgKFB5RGljdF9DaGVjayhkKSk7CiAKLQlpZiAoZGktPmRpX3VzZWQgIT0gZC0+bWFfdXNlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJkaWN0aW9uYXJ5IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7Ci0JCWRpLT5kaV91c2VkID0gLTE7IC8qIE1ha2UgdGhpcyBzdGF0ZSBzdGlja3kgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChkaS0+ZGlfdXNlZCAhPSBkLT5tYV91c2VkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGljdGlvbmFyeSBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICBkaS0+ZGlfdXNlZCA9IC0xOyAvKiBNYWtlIHRoaXMgc3RhdGUgc3RpY2t5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWkgPSBkaS0+ZGlfcG9zOwotCWlmIChpIDwgMCkKLQkJZ290byBmYWlsOwotCWVwID0gZC0+bWFfdGFibGU7Ci0JbWFzayA9IGQtPm1hX21hc2s7Ci0Jd2hpbGUgKGkgPD0gbWFzayAmJiBlcFtpXS5tZV92YWx1ZSA9PSBOVUxMKQotCQlpKys7Ci0JZGktPmRpX3BvcyA9IGkrMTsKLQlpZiAoaSA+IG1hc2spCi0JCWdvdG8gZmFpbDsKLQlkaS0+bGVuLS07Ci0Ja2V5ID0gZXBbaV0ubWVfa2V5OwotCVB5X0lOQ1JFRihrZXkpOwotCXJldHVybiBrZXk7CisgICAgaSA9IGRpLT5kaV9wb3M7CisgICAgaWYgKGkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZXAgPSBkLT5tYV90YWJsZTsKKyAgICBtYXNrID0gZC0+bWFfbWFzazsKKyAgICB3aGlsZSAoaSA8PSBtYXNrICYmIGVwW2ldLm1lX3ZhbHVlID09IE5VTEwpCisgICAgICAgIGkrKzsKKyAgICBkaS0+ZGlfcG9zID0gaSsxOworICAgIGlmIChpID4gbWFzaykKKyAgICAgICAgZ290byBmYWlsOworICAgIGRpLT5sZW4tLTsKKyAgICBrZXkgPSBlcFtpXS5tZV9rZXk7CisgICAgUHlfSU5DUkVGKGtleSk7CisgICAgcmV0dXJuIGtleTsKIAogZmFpbDoKLQlQeV9ERUNSRUYoZCk7Ci0JZGktPmRpX2RpY3QgPSBOVUxMOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihkKTsKKyAgICBkaS0+ZGlfZGljdCA9IE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5VHlwZU9iamVjdCBQeURpY3RJdGVyS2V5X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZGljdGlvbmFyeS1rZXlpdGVyYXRvciIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGRpY3RpdGVyb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGljdGl0ZXJfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYylkaWN0aXRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLSAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZGljdGl0ZXJfaXRlcm5leHRrZXksCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGljdGl0ZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJkaWN0aW9uYXJ5LWtleWl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihkaWN0aXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilkaWN0aXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWRpY3RpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylkaWN0aXRlcl9pdGVybmV4dGtleSwgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGRpY3RpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKmRpY3RpdGVyX2l0ZXJuZXh0dmFsdWUoZGljdGl0ZXJvYmplY3QgKmRpKQogewotCVB5T2JqZWN0ICp2YWx1ZTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGksIG1hc2s7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwotCVB5RGljdE9iamVjdCAqZCA9IGRpLT5kaV9kaWN0OworICAgIFB5T2JqZWN0ICp2YWx1ZTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIG1hc2s7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOworICAgIFB5RGljdE9iamVjdCAqZCA9IGRpLT5kaV9kaWN0OwogCi0JaWYgKGQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0IChQeURpY3RfQ2hlY2soZCkpOworICAgIGlmIChkID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydCAoUHlEaWN0X0NoZWNrKGQpKTsKIAotCWlmIChkaS0+ZGlfdXNlZCAhPSBkLT5tYV91c2VkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKLQkJZGktPmRpX3VzZWQgPSAtMTsgLyogTWFrZSB0aGlzIHN0YXRlIHN0aWNreSAqLwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGRpLT5kaV91c2VkICE9IGQtPm1hX3VzZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CisgICAgICAgIGRpLT5kaV91c2VkID0gLTE7IC8qIE1ha2UgdGhpcyBzdGF0ZSBzdGlja3kgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaSA9IGRpLT5kaV9wb3M7Ci0JbWFzayA9IGQtPm1hX21hc2s7Ci0JaWYgKGkgPCAwIHx8IGkgPiBtYXNrKQotCQlnb3RvIGZhaWw7Ci0JZXAgPSBkLT5tYV90YWJsZTsKLQl3aGlsZSAoKHZhbHVlPWVwW2ldLm1lX3ZhbHVlKSA9PSBOVUxMKSB7Ci0JCWkrKzsKLQkJaWYgKGkgPiBtYXNrKQotCQkJZ290byBmYWlsOwotCX0KLQlkaS0+ZGlfcG9zID0gaSsxOwotCWRpLT5sZW4tLTsKLQlQeV9JTkNSRUYodmFsdWUpOwotCXJldHVybiB2YWx1ZTsKKyAgICBpID0gZGktPmRpX3BvczsKKyAgICBtYXNrID0gZC0+bWFfbWFzazsKKyAgICBpZiAoaSA8IDAgfHwgaSA+IG1hc2spCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBlcCA9IGQtPm1hX3RhYmxlOworICAgIHdoaWxlICgodmFsdWU9ZXBbaV0ubWVfdmFsdWUpID09IE5VTEwpIHsKKyAgICAgICAgaSsrOworICAgICAgICBpZiAoaSA+IG1hc2spCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGRpLT5kaV9wb3MgPSBpKzE7CisgICAgZGktPmxlbi0tOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgcmV0dXJuIHZhbHVlOwogCiBmYWlsOgotCVB5X0RFQ1JFRihkKTsKLQlkaS0+ZGlfZGljdCA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGQpOworICAgIGRpLT5kaV9kaWN0ID0gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlUeXBlT2JqZWN0IFB5RGljdEl0ZXJWYWx1ZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImRpY3Rpb25hcnktdmFsdWVpdGVyYXRvciIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGRpY3RpdGVyb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGljdGl0ZXJfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYylkaWN0aXRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLSAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZGljdGl0ZXJfaXRlcm5leHR2YWx1ZSwJLyogdHBfaXRlcm5leHQgKi8KLQlkaWN0aXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAorICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImRpY3Rpb25hcnktdmFsdWVpdGVyYXRvciIsICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGRpY3RpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWRpY3RpdGVyX2RlYWxsb2MsICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZGljdGl0ZXJfdHJhdmVyc2UsICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWRpY3RpdGVyX2l0ZXJuZXh0dmFsdWUsICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZGljdGl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqZGljdGl0ZXJfaXRlcm5leHRpdGVtKGRpY3RpdGVyb2JqZWN0ICpkaSkKIHsKLQlQeU9iamVjdCAqa2V5LCAqdmFsdWUsICpyZXN1bHQgPSBkaS0+ZGlfcmVzdWx0OwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgbWFzazsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7Ci0JUHlEaWN0T2JqZWN0ICpkID0gZGktPmRpX2RpY3Q7CisgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlLCAqcmVzdWx0ID0gZGktPmRpX3Jlc3VsdDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIG1hc2s7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOworICAgIFB5RGljdE9iamVjdCAqZCA9IGRpLT5kaV9kaWN0OwogCi0JaWYgKGQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0IChQeURpY3RfQ2hlY2soZCkpOworICAgIGlmIChkID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydCAoUHlEaWN0X0NoZWNrKGQpKTsKIAotCWlmIChkaS0+ZGlfdXNlZCAhPSBkLT5tYV91c2VkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKLQkJZGktPmRpX3VzZWQgPSAtMTsgLyogTWFrZSB0aGlzIHN0YXRlIHN0aWNreSAqLwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGRpLT5kaV91c2VkICE9IGQtPm1hX3VzZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CisgICAgICAgIGRpLT5kaV91c2VkID0gLTE7IC8qIE1ha2UgdGhpcyBzdGF0ZSBzdGlja3kgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaSA9IGRpLT5kaV9wb3M7Ci0JaWYgKGkgPCAwKQotCQlnb3RvIGZhaWw7Ci0JZXAgPSBkLT5tYV90YWJsZTsKLQltYXNrID0gZC0+bWFfbWFzazsKLQl3aGlsZSAoaSA8PSBtYXNrICYmIGVwW2ldLm1lX3ZhbHVlID09IE5VTEwpCi0JCWkrKzsKLQlkaS0+ZGlfcG9zID0gaSsxOwotCWlmIChpID4gbWFzaykKLQkJZ290byBmYWlsOworICAgIGkgPSBkaS0+ZGlfcG9zOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGVwID0gZC0+bWFfdGFibGU7CisgICAgbWFzayA9IGQtPm1hX21hc2s7CisgICAgd2hpbGUgKGkgPD0gbWFzayAmJiBlcFtpXS5tZV92YWx1ZSA9PSBOVUxMKQorICAgICAgICBpKys7CisgICAgZGktPmRpX3BvcyA9IGkrMTsKKyAgICBpZiAoaSA+IG1hc2spCisgICAgICAgIGdvdG8gZmFpbDsKIAotCWlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKSB7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDApKTsKLQkJUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAxKSk7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcoMik7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlkaS0+bGVuLS07Ci0Ja2V5ID0gZXBbaV0ubWVfa2V5OwotCXZhbHVlID0gZXBbaV0ubWVfdmFsdWU7Ci0JUHlfSU5DUkVGKGtleSk7Ci0JUHlfSU5DUkVGKHZhbHVlKTsKLQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMCwga2V5KTsKLQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMSwgdmFsdWUpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpIHsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X0RFQ1JFRihQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgMCkpOworICAgICAgICBQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldygyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRpLT5sZW4tLTsKKyAgICBrZXkgPSBlcFtpXS5tZV9rZXk7CisgICAgdmFsdWUgPSBlcFtpXS5tZV92YWx1ZTsKKyAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAwLCBrZXkpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAxLCB2YWx1ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogZmFpbDoKLQlQeV9ERUNSRUYoZCk7Ci0JZGktPmRpX2RpY3QgPSBOVUxMOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihkKTsKKyAgICBkaS0+ZGlfZGljdCA9IE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5VHlwZU9iamVjdCBQeURpY3RJdGVySXRlbV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImRpY3Rpb25hcnktaXRlbWl0ZXJhdG9yIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZGljdGl0ZXJvYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilkaWN0aXRlcl9kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKWRpY3RpdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylkaWN0aXRlcl9pdGVybmV4dGl0ZW0sCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGljdGl0ZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJkaWN0aW9uYXJ5LWl0ZW1pdGVyYXRvciIsICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihkaWN0aXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilkaWN0aXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWRpY3RpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylkaWN0aXRlcl9pdGVybmV4dGl0ZW0sICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGRpY3RpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNzI2LDU2ICsyNzI2LDU2IEBACiAvKiBUaGUgaW5zdGFuY2UgbGF5LW91dCBpcyB0aGUgc2FtZSBmb3IgYWxsIHRocmVlOyBidXQgdGhlIHR5cGUgZGlmZmVycy4gKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeURpY3RPYmplY3QgKmR2X2RpY3Q7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5RGljdE9iamVjdCAqZHZfZGljdDsKIH0gZGljdHZpZXdvYmplY3Q7CiAKIAogc3RhdGljIHZvaWQKIGRpY3R2aWV3X2RlYWxsb2MoZGljdHZpZXdvYmplY3QgKmR2KQogewotCVB5X1hERUNSRUYoZHYtPmR2X2RpY3QpOwotCVB5T2JqZWN0X0dDX0RlbChkdik7CisgICAgUHlfWERFQ1JFRihkdi0+ZHZfZGljdCk7CisgICAgUHlPYmplY3RfR0NfRGVsKGR2KTsKIH0KIAogc3RhdGljIGludAogZGljdHZpZXdfdHJhdmVyc2UoZGljdHZpZXdvYmplY3QgKmR2LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChkdi0+ZHZfZGljdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoZHYtPmR2X2RpY3QpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogZGljdHZpZXdfbGVuKGRpY3R2aWV3b2JqZWN0ICpkdikKIHsKLQlQeV9zc2l6ZV90IGxlbiA9IDA7Ci0JaWYgKGR2LT5kdl9kaWN0ICE9IE5VTEwpCi0JCWxlbiA9IGR2LT5kdl9kaWN0LT5tYV91c2VkOwotCXJldHVybiBsZW47CisgICAgUHlfc3NpemVfdCBsZW4gPSAwOworICAgIGlmIChkdi0+ZHZfZGljdCAhPSBOVUxMKQorICAgICAgICBsZW4gPSBkdi0+ZHZfZGljdC0+bWFfdXNlZDsKKyAgICByZXR1cm4gbGVuOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdHZpZXdfbmV3KFB5T2JqZWN0ICpkaWN0LCBQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JZGljdHZpZXdvYmplY3QgKmR2OwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5RGljdF9DaGVjayhkaWN0KSkgewotCQkvKiBYWFggR2V0IHJpZCBvZiB0aGlzIHJlc3RyaWN0aW9uIGxhdGVyICovCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIlcygpIHJlcXVpcmVzIGEgZGljdCBhcmd1bWVudCwgbm90ICclcyciLAotCQkJICAgICB0eXBlLT50cF9uYW1lLCBkaWN0LT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWR2ID0gUHlPYmplY3RfR0NfTmV3KGRpY3R2aWV3b2JqZWN0LCB0eXBlKTsKLQlpZiAoZHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKGRpY3QpOwotCWR2LT5kdl9kaWN0ID0gKFB5RGljdE9iamVjdCAqKWRpY3Q7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGR2KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopZHY7CisgICAgZGljdHZpZXdvYmplY3QgKmR2OworICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5RGljdF9DaGVjayhkaWN0KSkgeworICAgICAgICAvKiBYWFggR2V0IHJpZCBvZiB0aGlzIHJlc3RyaWN0aW9uIGxhdGVyICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMoKSByZXF1aXJlcyBhIGRpY3QgYXJndW1lbnQsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsIGRpY3QtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZHYgPSBQeU9iamVjdF9HQ19OZXcoZGljdHZpZXdvYmplY3QsIHR5cGUpOworICAgIGlmIChkdiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgZHYtPmR2X2RpY3QgPSAoUHlEaWN0T2JqZWN0ICopZGljdDsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soZHYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilkdjsKIH0KIAogLyogVE9ETyhndWlkbyk6IFRoZSB2aWV3cyBvYmplY3RzIGFyZSBub3QgY29tcGxldGU6CkBAIC0yNzkxLDEwNiArMjc5MSwxMDYgQEAKIHN0YXRpYyBpbnQKIGFsbF9jb250YWluZWRfaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2VsZik7Ci0JaW50IG9rID0gMTsKKyAgICBQeU9iamVjdCAqaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2VsZik7CisgICAgaW50IG9rID0gMTsKIAotCWlmIChpdGVyID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlmb3IgKDs7KSB7Ci0JCVB5T2JqZWN0ICpuZXh0ID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCWlmIChuZXh0ID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCW9rID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCQlvayA9IFB5U2VxdWVuY2VfQ29udGFpbnMob3RoZXIsIG5leHQpOwotCQlQeV9ERUNSRUYobmV4dCk7Ci0JCWlmIChvayA8PSAwKQotCQkJYnJlYWs7Ci0JfQotCVB5X0RFQ1JFRihpdGVyKTsKLQlyZXR1cm4gb2s7CisgICAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlPYmplY3QgKm5leHQgPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgb2sgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG9rID0gUHlTZXF1ZW5jZV9Db250YWlucyhvdGhlciwgbmV4dCk7CisgICAgICAgIFB5X0RFQ1JFRihuZXh0KTsKKyAgICAgICAgaWYgKG9rIDw9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0ZXIpOworICAgIHJldHVybiBvazsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3R2aWV3X3JpY2hjb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlQeV9zc2l6ZV90IGxlbl9zZWxmLCBsZW5fb3RoZXI7Ci0JaW50IG9rOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBsZW5fc2VsZiwgbGVuX290aGVyOworICAgIGludCBvazsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JYXNzZXJ0KHNlbGYgIT0gTlVMTCk7Ci0JYXNzZXJ0KFB5RGljdFZpZXdTZXRfQ2hlY2soc2VsZikpOwotCWFzc2VydChvdGhlciAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc2VsZiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoUHlEaWN0Vmlld1NldF9DaGVjayhzZWxmKSk7CisgICAgYXNzZXJ0KG90aGVyICE9IE5VTEwpOwogCi0JaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikgJiYgIVB5RGljdFZpZXdTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9CisgICAgaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikgJiYgIVB5RGljdFZpZXdTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CiAKLQlsZW5fc2VsZiA9IFB5T2JqZWN0X1NpemUoc2VsZik7Ci0JaWYgKGxlbl9zZWxmIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbGVuX290aGVyID0gUHlPYmplY3RfU2l6ZShvdGhlcik7Ci0JaWYgKGxlbl9vdGhlciA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGxlbl9zZWxmID0gUHlPYmplY3RfU2l6ZShzZWxmKTsKKyAgICBpZiAobGVuX3NlbGYgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsZW5fb3RoZXIgPSBQeU9iamVjdF9TaXplKG90aGVyKTsKKyAgICBpZiAobGVuX290aGVyIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlvayA9IDA7Ci0Jc3dpdGNoKG9wKSB7CisgICAgb2sgPSAwOworICAgIHN3aXRjaChvcCkgewogCi0JY2FzZSBQeV9ORToKLQljYXNlIFB5X0VROgotCQlpZiAobGVuX3NlbGYgPT0gbGVuX290aGVyKQotCQkJb2sgPSBhbGxfY29udGFpbmVkX2luKHNlbGYsIG90aGVyKTsKLQkJaWYgKG9wID09IFB5X05FICYmIG9rID49IDApCi0JCQlvayA9ICFvazsKLQkJYnJlYWs7CisgICAgY2FzZSBQeV9ORToKKyAgICBjYXNlIFB5X0VROgorICAgICAgICBpZiAobGVuX3NlbGYgPT0gbGVuX290aGVyKQorICAgICAgICAgICAgb2sgPSBhbGxfY29udGFpbmVkX2luKHNlbGYsIG90aGVyKTsKKyAgICAgICAgaWYgKG9wID09IFB5X05FICYmIG9rID49IDApCisgICAgICAgICAgICBvayA9ICFvazsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFB5X0xUOgotCQlpZiAobGVuX3NlbGYgPCBsZW5fb3RoZXIpCi0JCQlvayA9IGFsbF9jb250YWluZWRfaW4oc2VsZiwgb3RoZXIpOwotCQlicmVhazsKKyAgICBjYXNlIFB5X0xUOgorICAgICAgICBpZiAobGVuX3NlbGYgPCBsZW5fb3RoZXIpCisgICAgICAgICAgICBvayA9IGFsbF9jb250YWluZWRfaW4oc2VsZiwgb3RoZXIpOworICAgICAgICBicmVhazsKIAotCSAgY2FzZSBQeV9MRToKLQkJICBpZiAobGVuX3NlbGYgPD0gbGVuX290aGVyKQotCQkJICBvayA9IGFsbF9jb250YWluZWRfaW4oc2VsZiwgb3RoZXIpOwotCQkgIGJyZWFrOworICAgICAgY2FzZSBQeV9MRToKKyAgICAgICAgICBpZiAobGVuX3NlbGYgPD0gbGVuX290aGVyKQorICAgICAgICAgICAgICBvayA9IGFsbF9jb250YWluZWRfaW4oc2VsZiwgb3RoZXIpOworICAgICAgICAgIGJyZWFrOwogCi0JY2FzZSBQeV9HVDoKLQkJaWYgKGxlbl9zZWxmID4gbGVuX290aGVyKQotCQkJb2sgPSBhbGxfY29udGFpbmVkX2luKG90aGVyLCBzZWxmKTsKLQkJYnJlYWs7CisgICAgY2FzZSBQeV9HVDoKKyAgICAgICAgaWYgKGxlbl9zZWxmID4gbGVuX290aGVyKQorICAgICAgICAgICAgb2sgPSBhbGxfY29udGFpbmVkX2luKG90aGVyLCBzZWxmKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFB5X0dFOgotCQlpZiAobGVuX3NlbGYgPj0gbGVuX290aGVyKQotCQkJb2sgPSBhbGxfY29udGFpbmVkX2luKG90aGVyLCBzZWxmKTsKLQkJYnJlYWs7CisgICAgY2FzZSBQeV9HRToKKyAgICAgICAgaWYgKGxlbl9zZWxmID49IGxlbl9vdGhlcikKKyAgICAgICAgICAgIG9rID0gYWxsX2NvbnRhaW5lZF9pbihvdGhlciwgc2VsZik7CisgICAgICAgIGJyZWFrOwogCi0JfQotCWlmIChvayA8IDApCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IG9rID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGlmIChvayA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IG9rID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0dmlld19yZXByKGRpY3R2aWV3b2JqZWN0ICpkdikKIHsKLQlQeU9iamVjdCAqc2VxOwotCVB5T2JqZWN0ICpzZXFfc3RyOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCi0Jc2VxID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKWR2KTsKLQlpZiAoc2VxID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICpzZXE7CisgICAgUHlPYmplY3QgKnNlcV9zdHI7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCXNlcV9zdHIgPSBQeU9iamVjdF9SZXByKHNlcSk7Ci0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJXMpIiwgUHlfVFlQRShkdiktPnRwX25hbWUsCi0JCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VxX3N0cikpOwotCVB5X0RFQ1JFRihzZXFfc3RyKTsKLQlQeV9ERUNSRUYoc2VxKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHNlcSA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilkdik7CisgICAgaWYgKHNlcSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHNlcV9zdHIgPSBQeU9iamVjdF9SZXByKHNlcSk7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJXMpIiwgUHlfVFlQRShkdiktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VxX3N0cikpOworICAgIFB5X0RFQ1JFRihzZXFfc3RyKTsKKyAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioqIGRpY3Rfa2V5cyAqKiovCkBAIC0yODk4LDE2NiArMjg5OCwxNjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0a2V5c19pdGVyKGRpY3R2aWV3b2JqZWN0ICpkdikKIHsKLQlpZiAoZHYtPmR2X2RpY3QgPT0gTlVMTCkgewotCQlQeV9SRVRVUk5fTk9ORTsKLQl9Ci0JcmV0dXJuIGRpY3RpdGVyX25ldyhkdi0+ZHZfZGljdCwgJlB5RGljdEl0ZXJLZXlfVHlwZSk7CisgICAgaWYgKGR2LT5kdl9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQorICAgIHJldHVybiBkaWN0aXRlcl9uZXcoZHYtPmR2X2RpY3QsICZQeURpY3RJdGVyS2V5X1R5cGUpOwogfQogCiBzdGF0aWMgaW50CiBkaWN0a2V5c19jb250YWlucyhkaWN0dmlld29iamVjdCAqZHYsIFB5T2JqZWN0ICpvYmopCiB7Ci0JaWYgKGR2LT5kdl9kaWN0ID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiBQeURpY3RfQ29udGFpbnMoKFB5T2JqZWN0ICopZHYtPmR2X2RpY3QsIG9iaik7CisgICAgaWYgKGR2LT5kdl9kaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBQeURpY3RfQ29udGFpbnMoKFB5T2JqZWN0ICopZHYtPmR2X2RpY3QsIG9iaik7CiB9CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBkaWN0a2V5c19hc19zZXF1ZW5jZSA9IHsKLQkobGVuZnVuYylkaWN0dmlld19sZW4sCQkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCQkvKiBzcV9jb25jYXQgKi8KLQkwLAkJCQkvKiBzcV9yZXBlYXQgKi8KLQkwLAkJCQkvKiBzcV9pdGVtICovCi0JMCwJCQkJLyogc3Ffc2xpY2UgKi8KLQkwLAkJCQkvKiBzcV9hc3NfaXRlbSAqLwotCTAsCQkJCS8qIHNxX2Fzc19zbGljZSAqLwotCShvYmpvYmpwcm9jKWRpY3RrZXlzX2NvbnRhaW5zLAkvKiBzcV9jb250YWlucyAqLworICAgIChsZW5mdW5jKWRpY3R2aWV3X2xlbiwgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbmNhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9zbGljZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX3NsaWNlICovCisgICAgKG9iam9ianByb2MpZGljdGtleXNfY29udGFpbnMsICAgICAgLyogc3FfY29udGFpbnMgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCoKIGRpY3R2aWV3c19zdWIoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlTZXRfTmV3KHNlbGYpOwotCVB5T2JqZWN0ICp0bXA7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlTZXRfTmV3KHNlbGYpOworICAgIFB5T2JqZWN0ICp0bXA7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXRtcCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocmVzdWx0LCAiZGlmZmVyZW5jZV91cGRhdGUiLCAiTyIsIG90aGVyKTsKLQlpZiAodG1wID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB0bXAgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHJlc3VsdCwgImRpZmZlcmVuY2VfdXBkYXRlIiwgIk8iLCBvdGhlcik7CisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGRpY3R2aWV3c19hbmQoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlTZXRfTmV3KHNlbGYpOwotCVB5T2JqZWN0ICp0bXA7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlTZXRfTmV3KHNlbGYpOworICAgIFB5T2JqZWN0ICp0bXA7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXRtcCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocmVzdWx0LCAiaW50ZXJzZWN0aW9uX3VwZGF0ZSIsICJPIiwgb3RoZXIpOwotCWlmICh0bXAgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHRtcCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocmVzdWx0LCAiaW50ZXJzZWN0aW9uX3VwZGF0ZSIsICJPIiwgb3RoZXIpOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBkaWN0dmlld3Nfb3IoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlTZXRfTmV3KHNlbGYpOwotCVB5T2JqZWN0ICp0bXA7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlTZXRfTmV3KHNlbGYpOworICAgIFB5T2JqZWN0ICp0bXA7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXRtcCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocmVzdWx0LCAidXBkYXRlIiwgIk8iLCBvdGhlcik7Ci0JaWYgKHRtcCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgdG1wID0gUHlPYmplY3RfQ2FsbE1ldGhvZChyZXN1bHQsICJ1cGRhdGUiLCAiTyIsIG90aGVyKTsKKyAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogZGljdHZpZXdzX3hvcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeVNldF9OZXcoc2VsZik7Ci0JUHlPYmplY3QgKnRtcDsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeVNldF9OZXcoc2VsZik7CisgICAgUHlPYmplY3QgKnRtcDsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdG1wID0gUHlPYmplY3RfQ2FsbE1ldGhvZChyZXN1bHQsICJzeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUiLCAiTyIsCi0JCQkJICBvdGhlcik7Ci0JaWYgKHRtcCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgdG1wID0gUHlPYmplY3RfQ2FsbE1ldGhvZChyZXN1bHQsICJzeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUiLCAiTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcik7CisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgZGljdHZpZXdzX2FzX251bWJlciA9IHsKLQkwLAkJCQkvKm5iX2FkZCovCi0JKGJpbmFyeWZ1bmMpZGljdHZpZXdzX3N1YiwJLypuYl9zdWJ0cmFjdCovCi0JMCwJCQkJLypuYl9tdWx0aXBseSovCi0JMCwJCQkJLypuYl9kaXZpZGUqLwotCTAsCQkJCS8qbmJfcmVtYWluZGVyKi8KLQkwLAkJCQkvKm5iX2Rpdm1vZCovCi0JMCwJCQkJLypuYl9wb3dlciovCi0JMCwJCQkJLypuYl9uZWdhdGl2ZSovCi0JMCwJCQkJLypuYl9wb3NpdGl2ZSovCi0JMCwJCQkJLypuYl9hYnNvbHV0ZSovCi0JMCwJCQkJLypuYl9ub256ZXJvKi8KLQkwLAkJCQkvKm5iX2ludmVydCovCi0JMCwJCQkJLypuYl9sc2hpZnQqLwotCTAsCQkJCS8qbmJfcnNoaWZ0Ki8KLQkoYmluYXJ5ZnVuYylkaWN0dmlld3NfYW5kLAkvKm5iX2FuZCovCi0JKGJpbmFyeWZ1bmMpZGljdHZpZXdzX3hvciwJLypuYl94b3IqLwotCShiaW5hcnlmdW5jKWRpY3R2aWV3c19vciwJLypuYl9vciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9hZGQqLworICAgIChiaW5hcnlmdW5jKWRpY3R2aWV3c19zdWIsICAgICAgICAgIC8qbmJfc3VidHJhY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbXVsdGlwbHkqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfZGl2aWRlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3JlbWFpbmRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9kaXZtb2QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfcG93ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbmVnYXRpdmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfcG9zaXRpdmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfYWJzb2x1dGUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbm9uemVybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnZlcnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbHNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3JzaGlmdCovCisgICAgKGJpbmFyeWZ1bmMpZGljdHZpZXdzX2FuZCwgICAgICAgICAgLypuYl9hbmQqLworICAgIChiaW5hcnlmdW5jKWRpY3R2aWV3c194b3IsICAgICAgICAgIC8qbmJfeG9yKi8KKyAgICAoYmluYXJ5ZnVuYylkaWN0dmlld3Nfb3IsICAgICAgICAgICAvKm5iX29yKi8KIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkaWN0a2V5c19tZXRob2RzW10gPSB7Ci0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeURpY3RLZXlzX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZGljdF9rZXlzIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihkaWN0dmlld29iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWRpY3R2aWV3X2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfcmVzZXJ2ZWQgKi8KLQkocmVwcmZ1bmMpZGljdHZpZXdfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkmZGljdHZpZXdzX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmZGljdGtleXNfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0NIRUNLVFlQRVMsCQkvKiB0cF9mbGFncyAqLwotIAkwLAkJCQkJLyogdHBfZG9jICovCi0gCSh0cmF2ZXJzZXByb2MpZGljdHZpZXdfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0gCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCWRpY3R2aWV3X3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JKGdldGl0ZXJmdW5jKWRpY3RrZXlzX2l0ZXIsCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGljdGtleXNfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJkaWN0X2tleXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihkaWN0dmlld29iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilkaWN0dmlld19kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXNlcnZlZCAqLworICAgIChyZXByZnVuYylkaWN0dmlld19yZXByLCAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZkaWN0dmlld3NfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJmRpY3RrZXlzX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUywgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylkaWN0dmlld190cmF2ZXJzZSwgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICBkaWN0dmlld19yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIChnZXRpdGVyZnVuYylkaWN0a2V5c19pdGVyLCAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkaWN0a2V5c19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RrZXlzX25ldyhQeU9iamVjdCAqZGljdCkKIHsKLQlyZXR1cm4gZGljdHZpZXdfbmV3KGRpY3QsICZQeURpY3RLZXlzX1R5cGUpOworICAgIHJldHVybiBkaWN0dmlld19uZXcoZGljdCwgJlB5RGljdEtleXNfVHlwZSk7CiB9CiAKIC8qKiogZGljdF9pdGVtcyAqKiovCkBAIC0zMDY1LDg0ICszMDY1LDg0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGljdGl0ZW1zX2l0ZXIoZGljdHZpZXdvYmplY3QgKmR2KQogewotCWlmIChkdi0+ZHZfZGljdCA9PSBOVUxMKSB7Ci0JCVB5X1JFVFVSTl9OT05FOwotCX0KLQlyZXR1cm4gZGljdGl0ZXJfbmV3KGR2LT5kdl9kaWN0LCAmUHlEaWN0SXRlckl0ZW1fVHlwZSk7CisgICAgaWYgKGR2LT5kdl9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQorICAgIHJldHVybiBkaWN0aXRlcl9uZXcoZHYtPmR2X2RpY3QsICZQeURpY3RJdGVySXRlbV9UeXBlKTsKIH0KIAogc3RhdGljIGludAogZGljdGl0ZW1zX2NvbnRhaW5zKGRpY3R2aWV3b2JqZWN0ICpkdiwgUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCAqa2V5LCAqdmFsdWUsICpmb3VuZDsKLQlpZiAoZHYtPmR2X2RpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKG9iaikgfHwgUHlUdXBsZV9HRVRfU0laRShvYmopICE9IDIpCi0JCXJldHVybiAwOwotCWtleSA9IFB5VHVwbGVfR0VUX0lURU0ob2JqLCAwKTsKLQl2YWx1ZSA9IFB5VHVwbGVfR0VUX0lURU0ob2JqLCAxKTsKLQlmb3VuZCA9IFB5RGljdF9HZXRJdGVtKChQeU9iamVjdCAqKWR2LT5kdl9kaWN0LCBrZXkpOwotCWlmIChmb3VuZCA9PSBOVUxMKSB7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2YWx1ZSwgZm91bmQsIFB5X0VRKTsKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWUsICpmb3VuZDsKKyAgICBpZiAoZHYtPmR2X2RpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKG9iaikgfHwgUHlUdXBsZV9HRVRfU0laRShvYmopICE9IDIpCisgICAgICAgIHJldHVybiAwOworICAgIGtleSA9IFB5VHVwbGVfR0VUX0lURU0ob2JqLCAwKTsKKyAgICB2YWx1ZSA9IFB5VHVwbGVfR0VUX0lURU0ob2JqLCAxKTsKKyAgICBmb3VuZCA9IFB5RGljdF9HZXRJdGVtKChQeU9iamVjdCAqKWR2LT5kdl9kaWN0LCBrZXkpOworICAgIGlmIChmb3VuZCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2YWx1ZSwgZm91bmQsIFB5X0VRKTsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGRpY3RpdGVtc19hc19zZXF1ZW5jZSA9IHsKLQkobGVuZnVuYylkaWN0dmlld19sZW4sCQkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCQkvKiBzcV9jb25jYXQgKi8KLQkwLAkJCQkvKiBzcV9yZXBlYXQgKi8KLQkwLAkJCQkvKiBzcV9pdGVtICovCi0JMCwJCQkJLyogc3Ffc2xpY2UgKi8KLQkwLAkJCQkvKiBzcV9hc3NfaXRlbSAqLwotCTAsCQkJCS8qIHNxX2Fzc19zbGljZSAqLwotCShvYmpvYmpwcm9jKWRpY3RpdGVtc19jb250YWlucywJLyogc3FfY29udGFpbnMgKi8KKyAgICAobGVuZnVuYylkaWN0dmlld19sZW4sICAgICAgICAgICAgICAvKiBzcV9sZW5ndGggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb25jYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3Ffc2xpY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIChvYmpvYmpwcm9jKWRpY3RpdGVtc19jb250YWlucywgICAgIC8qIHNxX2NvbnRhaW5zICovCiB9OwogCiBzdGF0aWMgUHlNZXRob2REZWYgZGljdGl0ZW1zX21ldGhvZHNbXSA9IHsKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5RGljdEl0ZW1zX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZGljdF9pdGVtcyIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZGljdHZpZXdvYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilkaWN0dmlld19kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3Jlc2VydmVkICovCi0JKHJlcHJmdW5jKWRpY3R2aWV3X3JlcHIsCQkvKiB0cF9yZXByICovCi0JJmRpY3R2aWV3c19hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJmRpY3RpdGVtc19hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQ0hFQ0tUWVBFUywJCS8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYylkaWN0dmlld190cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLSAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JZGljdHZpZXdfcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkoZ2V0aXRlcmZ1bmMpZGljdGl0ZW1zX2l0ZXIsCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGljdGl0ZW1zX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZGljdF9pdGVtcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZGljdHZpZXdvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZGljdHZpZXdfZGVhbGxvYywgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVzZXJ2ZWQgKi8KKyAgICAocmVwcmZ1bmMpZGljdHZpZXdfcmVwciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmZGljdHZpZXdzX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZkaWN0aXRlbXNfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0NIRUNLVFlQRVMsICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZGljdHZpZXdfdHJhdmVyc2UsICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgZGljdHZpZXdfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAoZ2V0aXRlcmZ1bmMpZGljdGl0ZW1zX2l0ZXIsICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZGljdGl0ZW1zX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0aXRlbXNfbmV3KFB5T2JqZWN0ICpkaWN0KQogewotCXJldHVybiBkaWN0dmlld19uZXcoZGljdCwgJlB5RGljdEl0ZW1zX1R5cGUpOworICAgIHJldHVybiBkaWN0dmlld19uZXcoZGljdCwgJlB5RGljdEl0ZW1zX1R5cGUpOwogfQogCiAvKioqIGRpY3RfdmFsdWVzICoqKi8KQEAgLTMxNTAsNjIgKzMxNTAsNjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0dmFsdWVzX2l0ZXIoZGljdHZpZXdvYmplY3QgKmR2KQogewotCWlmIChkdi0+ZHZfZGljdCA9PSBOVUxMKSB7Ci0JCVB5X1JFVFVSTl9OT05FOwotCX0KLQlyZXR1cm4gZGljdGl0ZXJfbmV3KGR2LT5kdl9kaWN0LCAmUHlEaWN0SXRlclZhbHVlX1R5cGUpOworICAgIGlmIChkdi0+ZHZfZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KKyAgICByZXR1cm4gZGljdGl0ZXJfbmV3KGR2LT5kdl9kaWN0LCAmUHlEaWN0SXRlclZhbHVlX1R5cGUpOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgZGljdHZhbHVlc19hc19zZXF1ZW5jZSA9IHsKLQkobGVuZnVuYylkaWN0dmlld19sZW4sCQkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCQkvKiBzcV9jb25jYXQgKi8KLQkwLAkJCQkvKiBzcV9yZXBlYXQgKi8KLQkwLAkJCQkvKiBzcV9pdGVtICovCi0JMCwJCQkJLyogc3Ffc2xpY2UgKi8KLQkwLAkJCQkvKiBzcV9hc3NfaXRlbSAqLwotCTAsCQkJCS8qIHNxX2Fzc19zbGljZSAqLwotCShvYmpvYmpwcm9jKTAsCQkJLyogc3FfY29udGFpbnMgKi8KKyAgICAobGVuZnVuYylkaWN0dmlld19sZW4sICAgICAgICAgICAgICAvKiBzcV9sZW5ndGggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb25jYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3Ffc2xpY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIChvYmpvYmpwcm9jKTAsICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbnRhaW5zICovCiB9OwogCiBzdGF0aWMgUHlNZXRob2REZWYgZGljdHZhbHVlc19tZXRob2RzW10gPSB7Ci0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeURpY3RWYWx1ZXNfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJkaWN0X3ZhbHVlcyIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZGljdHZpZXdvYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilkaWN0dmlld19kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3Jlc2VydmVkICovCi0JKHJlcHJmdW5jKWRpY3R2aWV3X3JlcHIsCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZkaWN0dmFsdWVzX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKWRpY3R2aWV3X3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkoZ2V0aXRlcmZ1bmMpZGljdHZhbHVlc19pdGVyLAkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWRpY3R2YWx1ZXNfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJkaWN0X3ZhbHVlcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihkaWN0dmlld29iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilkaWN0dmlld19kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXNlcnZlZCAqLworICAgIChyZXByZnVuYylkaWN0dmlld19yZXByLCAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJmRpY3R2YWx1ZXNfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylkaWN0dmlld190cmF2ZXJzZSwgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIChnZXRpdGVyZnVuYylkaWN0dmFsdWVzX2l0ZXIsICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkaWN0dmFsdWVzX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3R2YWx1ZXNfbmV3KFB5T2JqZWN0ICpkaWN0KQogewotCXJldHVybiBkaWN0dmlld19uZXcoZGljdCwgJlB5RGljdFZhbHVlc19UeXBlKTsKKyAgICByZXR1cm4gZGljdHZpZXdfbmV3KGRpY3QsICZQeURpY3RWYWx1ZXNfVHlwZSk7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2VudW1vYmplY3QuYyBiL09iamVjdHMvZW51bW9iamVjdC5jCmluZGV4IDJjMWMzZjguLmE4M2ZjN2MgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZW51bW9iamVjdC5jCisrKyBiL09iamVjdHMvZW51bW9iamVjdC5jCkBAIC0zLDE1OSArMywxNTkgQEAKICNpbmNsdWRlICJQeXRob24uaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90IGVuX2luZGV4OwkgICAvKiBjdXJyZW50IGluZGV4IG9mIGVudW1lcmF0aW9uICovCi0JUHlPYmplY3QqIGVuX3NpdDsgICAgICAgICAgLyogc2Vjb25kYXJ5IGl0ZXJhdG9yIG9mIGVudW1lcmF0aW9uICovCi0JUHlPYmplY3QqIGVuX3Jlc3VsdDsJICAgLyogcmVzdWx0IHR1cGxlICAqLwotCVB5T2JqZWN0KiBlbl9sb25naW5kZXg7CSAgIC8qIGluZGV4IGZvciBzZXF1ZW5jZXMgPj0gUFlfU1NJWkVfVF9NQVggKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCBlbl9pbmRleDsgICAgICAgICAgIC8qIGN1cnJlbnQgaW5kZXggb2YgZW51bWVyYXRpb24gKi8KKyAgICBQeU9iamVjdCogZW5fc2l0OyAgICAgICAgICAvKiBzZWNvbmRhcnkgaXRlcmF0b3Igb2YgZW51bWVyYXRpb24gKi8KKyAgICBQeU9iamVjdCogZW5fcmVzdWx0OyAgICAgICAgICAgLyogcmVzdWx0IHR1cGxlICAqLworICAgIFB5T2JqZWN0KiBlbl9sb25naW5kZXg7ICAgICAgICAvKiBpbmRleCBmb3Igc2VxdWVuY2VzID49IFBZX1NTSVpFX1RfTUFYICovCiB9IGVudW1vYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBlbnVtX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQllbnVtb2JqZWN0ICplbjsKLQlQeU9iamVjdCAqc2VxID0gTlVMTDsKLQlQeU9iamVjdCAqc3RhcnQgPSBOVUxMOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2VxdWVuY2UiLCAic3RhcnQiLCAwfTsKKyAgICBlbnVtb2JqZWN0ICplbjsKKyAgICBQeU9iamVjdCAqc2VxID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RhcnQgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2VxdWVuY2UiLCAic3RhcnQiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86ZW51bWVyYXRlIiwga3dsaXN0LAotCQkJCQkgJnNlcSwgJnN0YXJ0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98TzplbnVtZXJhdGUiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcSwgJnN0YXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllbiA9IChlbnVtb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGVuID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChzdGFydCAhPSBOVUxMKSB7Ci0JCXN0YXJ0ID0gUHlOdW1iZXJfSW5kZXgoc3RhcnQpOwotCQlpZiAoc3RhcnQgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGVuKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWFzc2VydChQeUludF9DaGVjayhzdGFydCkgfHwgUHlMb25nX0NoZWNrKHN0YXJ0KSk7Ci0JCWVuLT5lbl9pbmRleCA9IFB5SW50X0FzU3NpemVfdChzdGFydCk7Ci0JCWlmIChlbi0+ZW5faW5kZXggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVuLT5lbl9pbmRleCA9IFBZX1NTSVpFX1RfTUFYOwotCQkJZW4tPmVuX2xvbmdpbmRleCA9IHN0YXJ0OwotCQl9IGVsc2UgewotCQkJZW4tPmVuX2xvbmdpbmRleCA9IE5VTEw7Ci0JCQlQeV9ERUNSRUYoc3RhcnQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZW4tPmVuX2luZGV4ID0gMDsKLQkJZW4tPmVuX2xvbmdpbmRleCA9IE5VTEw7Ci0JfQotCWVuLT5lbl9zaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGVuLT5lbl9zaXQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZW4pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZW4tPmVuX3Jlc3VsdCA9IFB5VHVwbGVfUGFjaygyLCBQeV9Ob25lLCBQeV9Ob25lKTsKLQlpZiAoZW4tPmVuX3Jlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihlbik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopZW47CisgICAgZW4gPSAoZW51bW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChlbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RhcnQgIT0gTlVMTCkgeworICAgICAgICBzdGFydCA9IFB5TnVtYmVyX0luZGV4KHN0YXJ0KTsKKyAgICAgICAgaWYgKHN0YXJ0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoUHlJbnRfQ2hlY2soc3RhcnQpIHx8IFB5TG9uZ19DaGVjayhzdGFydCkpOworICAgICAgICBlbi0+ZW5faW5kZXggPSBQeUludF9Bc1NzaXplX3Qoc3RhcnQpOworICAgICAgICBpZiAoZW4tPmVuX2luZGV4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBlbi0+ZW5faW5kZXggPSBQWV9TU0laRV9UX01BWDsKKyAgICAgICAgICAgIGVuLT5lbl9sb25naW5kZXggPSBzdGFydDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVuLT5lbl9sb25naW5kZXggPSBOVUxMOworICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVuLT5lbl9pbmRleCA9IDA7CisgICAgICAgIGVuLT5lbl9sb25naW5kZXggPSBOVUxMOworICAgIH0KKyAgICBlbi0+ZW5fc2l0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChlbi0+ZW5fc2l0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGVuKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVuLT5lbl9yZXN1bHQgPSBQeVR1cGxlX1BhY2soMiwgUHlfTm9uZSwgUHlfTm9uZSk7CisgICAgaWYgKGVuLT5lbl9yZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZW4pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWVuOwogfQogCiBzdGF0aWMgdm9pZAogZW51bV9kZWFsbG9jKGVudW1vYmplY3QgKmVuKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soZW4pOwotCVB5X1hERUNSRUYoZW4tPmVuX3NpdCk7Ci0JUHlfWERFQ1JFRihlbi0+ZW5fcmVzdWx0KTsKLQlQeV9YREVDUkVGKGVuLT5lbl9sb25naW5kZXgpOwotCVB5X1RZUEUoZW4pLT50cF9mcmVlKGVuKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGVuKTsKKyAgICBQeV9YREVDUkVGKGVuLT5lbl9zaXQpOworICAgIFB5X1hERUNSRUYoZW4tPmVuX3Jlc3VsdCk7CisgICAgUHlfWERFQ1JFRihlbi0+ZW5fbG9uZ2luZGV4KTsKKyAgICBQeV9UWVBFKGVuKS0+dHBfZnJlZShlbik7CiB9CiAKIHN0YXRpYyBpbnQKIGVudW1fdHJhdmVyc2UoZW51bW9iamVjdCAqZW4sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGVuLT5lbl9zaXQpOwotCVB5X1ZJU0lUKGVuLT5lbl9yZXN1bHQpOwotCVB5X1ZJU0lUKGVuLT5lbl9sb25naW5kZXgpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGVuLT5lbl9zaXQpOworICAgIFB5X1ZJU0lUKGVuLT5lbl9yZXN1bHQpOworICAgIFB5X1ZJU0lUKGVuLT5lbl9sb25naW5kZXgpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZW51bV9uZXh0X2xvbmcoZW51bW9iamVjdCAqZW4sIFB5T2JqZWN0KiBuZXh0X2l0ZW0pCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpvbmUgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBlbi0+ZW5fcmVzdWx0OwotCVB5T2JqZWN0ICpuZXh0X2luZGV4OwotCVB5T2JqZWN0ICpzdGVwcGVkX3VwOworICAgIHN0YXRpYyBQeU9iamVjdCAqb25lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gZW4tPmVuX3Jlc3VsdDsKKyAgICBQeU9iamVjdCAqbmV4dF9pbmRleDsKKyAgICBQeU9iamVjdCAqc3RlcHBlZF91cDsKIAotCWlmIChlbi0+ZW5fbG9uZ2luZGV4ID09IE5VTEwpIHsKLQkJZW4tPmVuX2xvbmdpbmRleCA9IFB5SW50X0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUFYKTsKLQkJaWYgKGVuLT5lbl9sb25naW5kZXggPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAob25lID09IE5VTEwpIHsKLQkJb25lID0gUHlJbnRfRnJvbUxvbmcoMSk7Ci0JCWlmIChvbmUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQluZXh0X2luZGV4ID0gZW4tPmVuX2xvbmdpbmRleDsKLQlhc3NlcnQobmV4dF9pbmRleCAhPSBOVUxMKTsKLQlzdGVwcGVkX3VwID0gUHlOdW1iZXJfQWRkKG5leHRfaW5kZXgsIG9uZSk7Ci0JaWYgKHN0ZXBwZWRfdXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZW4tPmVuX2xvbmdpbmRleCA9IHN0ZXBwZWRfdXA7CisgICAgaWYgKGVuLT5lbl9sb25naW5kZXggPT0gTlVMTCkgeworICAgICAgICBlbi0+ZW5fbG9uZ2luZGV4ID0gUHlJbnRfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpOworICAgICAgICBpZiAoZW4tPmVuX2xvbmdpbmRleCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChvbmUgPT0gTlVMTCkgeworICAgICAgICBvbmUgPSBQeUludF9Gcm9tTG9uZygxKTsKKyAgICAgICAgaWYgKG9uZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5leHRfaW5kZXggPSBlbi0+ZW5fbG9uZ2luZGV4OworICAgIGFzc2VydChuZXh0X2luZGV4ICE9IE5VTEwpOworICAgIHN0ZXBwZWRfdXAgPSBQeU51bWJlcl9BZGQobmV4dF9pbmRleCwgb25lKTsKKyAgICBpZiAoc3RlcHBlZF91cCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbi0+ZW5fbG9uZ2luZGV4ID0gc3RlcHBlZF91cDsKIAotCWlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKSB7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDApKTsKLQkJUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAxKSk7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcoMik7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKG5leHRfaW5kZXgpOwotCQkJUHlfREVDUkVGKG5leHRfaXRlbSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMCwgbmV4dF9pbmRleCk7Ci0JUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDEsIG5leHRfaXRlbSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAwKSk7CisgICAgICAgIFB5X0RFQ1JFRihQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KDIpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0X2luZGV4KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0X2l0ZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIG5leHRfaW5kZXgpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAxLCBuZXh0X2l0ZW0pOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBlbnVtX25leHQoZW51bW9iamVjdCAqZW4pCiB7Ci0JUHlPYmplY3QgKm5leHRfaW5kZXg7Ci0JUHlPYmplY3QgKm5leHRfaXRlbTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gZW4tPmVuX3Jlc3VsdDsKLQlQeU9iamVjdCAqaXQgPSBlbi0+ZW5fc2l0OworICAgIFB5T2JqZWN0ICpuZXh0X2luZGV4OworICAgIFB5T2JqZWN0ICpuZXh0X2l0ZW07CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGVuLT5lbl9yZXN1bHQ7CisgICAgUHlPYmplY3QgKml0ID0gZW4tPmVuX3NpdDsKIAotCW5leHRfaXRlbSA9ICgqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KShpdCk7Ci0JaWYgKG5leHRfaXRlbSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuZXh0X2l0ZW0gPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOworICAgIGlmIChuZXh0X2l0ZW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZW4tPmVuX2luZGV4ID09IFBZX1NTSVpFX1RfTUFYKQotCQlyZXR1cm4gZW51bV9uZXh0X2xvbmcoZW4sIG5leHRfaXRlbSk7CisgICAgaWYgKGVuLT5lbl9pbmRleCA9PSBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgcmV0dXJuIGVudW1fbmV4dF9sb25nKGVuLCBuZXh0X2l0ZW0pOwogCi0JbmV4dF9pbmRleCA9IFB5SW50X0Zyb21Tc2l6ZV90KGVuLT5lbl9pbmRleCk7Ci0JaWYgKG5leHRfaW5kZXggPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobmV4dF9pdGVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVuLT5lbl9pbmRleCsrOworICAgIG5leHRfaW5kZXggPSBQeUludF9Gcm9tU3NpemVfdChlbi0+ZW5faW5kZXgpOworICAgIGlmIChuZXh0X2luZGV4ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG5leHRfaXRlbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbi0+ZW5faW5kZXgrKzsKIAotCWlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKSB7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDApKTsKLQkJUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAxKSk7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcoMik7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKG5leHRfaW5kZXgpOwotCQkJUHlfREVDUkVGKG5leHRfaXRlbSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMCwgbmV4dF9pbmRleCk7Ci0JUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDEsIG5leHRfaXRlbSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAwKSk7CisgICAgICAgIFB5X0RFQ1JFRihQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KDIpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0X2luZGV4KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0X2l0ZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIG5leHRfaW5kZXgpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAxLCBuZXh0X2l0ZW0pOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihlbnVtX2RvYywKQEAgLTE2NywxNDYgKzE2NywxNDYgQEAKICJmb3Igb2J0YWluaW5nIGFuIGluZGV4ZWQgbGlzdDogKDAsIHNlcVswXSksICgxLCBzZXFbMV0pLCAoMiwgc2VxWzJdKSwgLi4uIik7CiAKIFB5VHlwZU9iamVjdCBQeUVudW1fVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJlbnVtZXJhdGUiLCAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwotCXNpemVvZihlbnVtb2JqZWN0KSwgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcillbnVtX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgIC8qIHRwX2dldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgLyogdHBfZmxhZ3MgKi8KLQllbnVtX2RvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpZW51bV90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWVudW1fbmV4dCwgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotCWVudW1fbmV3LCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZW51bWVyYXRlIiwgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZW51bW9iamVjdCksICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZW51bV9kZWFsbG9jLCAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgIC8qIHRwX2ZsYWdzICovCisgICAgZW51bV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWVudW1fdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZW51bV9uZXh0LCAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgZW51bV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIFJldmVyc2VkIE9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdCAgICAgIGluZGV4OwotCVB5T2JqZWN0KiBzZXE7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgICAgICBpbmRleDsKKyAgICBQeU9iamVjdCogc2VxOwogfSByZXZlcnNlZG9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJldmVyc2VkX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeV9zc2l6ZV90IG47Ci0JUHlPYmplY3QgKnNlcSwgKnJldmVyc2VkX21ldGg7Ci0Jc3RhdGljIFB5T2JqZWN0ICpyZXZlcnNlZF9jYWNoZSA9IE5VTEw7Ci0JcmV2ZXJzZWRvYmplY3QgKnJvOworICAgIFB5X3NzaXplX3QgbjsKKyAgICBQeU9iamVjdCAqc2VxLCAqcmV2ZXJzZWRfbWV0aDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnJldmVyc2VkX2NhY2hlID0gTlVMTDsKKyAgICByZXZlcnNlZG9iamVjdCAqcm87CiAKLQlpZiAodHlwZSA9PSAmUHlSZXZlcnNlZF9UeXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygicmV2ZXJzZWQoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmUHlSZXZlcnNlZF9UeXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygicmV2ZXJzZWQoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJldmVyc2VkIiwgMSwgMSwgJnNlcSkgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZXZlcnNlZCIsIDEsIDEsICZzZXEpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlJbnN0YW5jZV9DaGVjayhzZXEpKSB7Ci0JCXJldmVyc2VkX21ldGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlcSwgIl9fcmV2ZXJzZWRfXyIpOwotCQlpZiAocmV2ZXJzZWRfbWV0aCA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQllbHNlIHsKLQkJcmV2ZXJzZWRfbWV0aCA9IF9QeU9iamVjdF9Mb29rdXBTcGVjaWFsKHNlcSwgIl9fcmV2ZXJzZWRfXyIsCi0JCQkJCQkJJnJldmVyc2VkX2NhY2hlKTsKLQkJaWYgKHJldmVyc2VkX21ldGggPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChyZXZlcnNlZF9tZXRoICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MocmV2ZXJzZWRfbWV0aCwgTlVMTCk7Ci0JCVB5X0RFQ1JFRihyZXZlcnNlZF9tZXRoKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgaWYgKFB5SW5zdGFuY2VfQ2hlY2soc2VxKSkgeworICAgICAgICByZXZlcnNlZF9tZXRoID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZXEsICJfX3JldmVyc2VkX18iKTsKKyAgICAgICAgaWYgKHJldmVyc2VkX21ldGggPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldmVyc2VkX21ldGggPSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbChzZXEsICJfX3JldmVyc2VkX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldmVyc2VkX2NhY2hlKTsKKyAgICAgICAgaWYgKHJldmVyc2VkX21ldGggPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChyZXZlcnNlZF9tZXRoICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MocmV2ZXJzZWRfbWV0aCwgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihyZXZlcnNlZF9tZXRoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQlpZiAoIVB5U2VxdWVuY2VfQ2hlY2soc2VxKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhcmd1bWVudCB0byByZXZlcnNlZCgpIG11c3QgYmUgYSBzZXF1ZW5jZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeVNlcXVlbmNlX0NoZWNrKHNlcSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCB0byByZXZlcnNlZCgpIG11c3QgYmUgYSBzZXF1ZW5jZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQluID0gUHlTZXF1ZW5jZV9TaXplKHNlcSk7Ci0JaWYgKG4gPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIG4gPSBQeVNlcXVlbmNlX1NpemUoc2VxKTsKKyAgICBpZiAobiA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlybyA9IChyZXZlcnNlZG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChybyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBybyA9IChyZXZlcnNlZG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChybyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJvLT5pbmRleCA9IG4tMTsKLQlQeV9JTkNSRUYoc2VxKTsKLQlyby0+c2VxID0gc2VxOwotCXJldHVybiAoUHlPYmplY3QgKilybzsKKyAgICByby0+aW5kZXggPSBuLTE7CisgICAgUHlfSU5DUkVGKHNlcSk7CisgICAgcm8tPnNlcSA9IHNlcTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcm87CiB9CiAKIHN0YXRpYyB2b2lkCiByZXZlcnNlZF9kZWFsbG9jKHJldmVyc2Vkb2JqZWN0ICpybykKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHJvKTsKLQlQeV9YREVDUkVGKHJvLT5zZXEpOwotCVB5X1RZUEUocm8pLT50cF9mcmVlKHJvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHJvKTsKKyAgICBQeV9YREVDUkVGKHJvLT5zZXEpOworICAgIFB5X1RZUEUocm8pLT50cF9mcmVlKHJvKTsKIH0KIAogc3RhdGljIGludAogcmV2ZXJzZWRfdHJhdmVyc2UocmV2ZXJzZWRvYmplY3QgKnJvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChyby0+c2VxKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChyby0+c2VxKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJldmVyc2VkX25leHQocmV2ZXJzZWRvYmplY3QgKnJvKQogewotCVB5T2JqZWN0ICppdGVtOwotCVB5X3NzaXplX3QgaW5kZXggPSByby0+aW5kZXg7CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgUHlfc3NpemVfdCBpbmRleCA9IHJvLT5pbmRleDsKIAotCWlmIChpbmRleCA+PSAwKSB7Ci0JCWl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0ocm8tPnNlcSwgaW5kZXgpOwotCQlpZiAoaXRlbSAhPSBOVUxMKSB7Ci0JCQlyby0+aW5kZXgtLTsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0luZGV4RXJyb3IpIHx8Ci0JCSAgICBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0Jcm8tPmluZGV4ID0gLTE7Ci0JUHlfQ0xFQVIocm8tPnNlcSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShyby0+c2VxLCBpbmRleCk7CisgICAgICAgIGlmIChpdGVtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJvLT5pbmRleC0tOworICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW5kZXhFcnJvcikgfHwKKyAgICAgICAgICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICByby0+aW5kZXggPSAtMTsKKyAgICBQeV9DTEVBUihyby0+c2VxKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHJldmVyc2VkX2RvYywKQEAgLTMxNyw2NCArMzE3LDY0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmV2ZXJzZWRfbGVuKHJldmVyc2Vkb2JqZWN0ICpybykKIHsKLQlQeV9zc2l6ZV90IHBvc2l0aW9uLCBzZXFzaXplOworICAgIFB5X3NzaXplX3QgcG9zaXRpb24sIHNlcXNpemU7CiAKLQlpZiAocm8tPnNlcSA9PSBOVUxMKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7Ci0Jc2Vxc2l6ZSA9IFB5U2VxdWVuY2VfU2l6ZShyby0+c2VxKTsKLQlpZiAoc2Vxc2l6ZSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9zaXRpb24gPSByby0+aW5kZXggKyAxOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoc2Vxc2l6ZSA8IHBvc2l0aW9uKSAgPyAgMCAgOiAgcG9zaXRpb24pOworICAgIGlmIChyby0+c2VxID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKKyAgICBzZXFzaXplID0gUHlTZXF1ZW5jZV9TaXplKHJvLT5zZXEpOworICAgIGlmIChzZXFzaXplID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb3NpdGlvbiA9IHJvLT5pbmRleCArIDE7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KChzZXFzaXplIDwgcG9zaXRpb24pICA/ICAwICA6ICBwb3NpdGlvbik7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHJldmVyc2VkaXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pcmV2ZXJzZWRfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilyZXZlcnNlZF9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlSZXZlcnNlZF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInJldmVyc2VkIiwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHJldmVyc2Vkb2JqZWN0KSwgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXJldmVyc2VkX2RlYWxsb2MsICAgLyogdHBfZGVhbGxvYyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgIC8qIHRwX2dldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgLyogdHBfZmxhZ3MgKi8KLQlyZXZlcnNlZF9kb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpcmV2ZXJzZWRfdHJhdmVyc2UsLyogdHBfdHJhdmVyc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKXJldmVyc2VkX25leHQsICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0JcmV2ZXJzZWRpdGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotCXJldmVyc2VkX25ldywgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAicmV2ZXJzZWQiLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YocmV2ZXJzZWRvYmplY3QpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpcmV2ZXJzZWRfZGVhbGxvYywgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAvKiB0cF9mbGFncyAqLworICAgIHJldmVyc2VkX2RvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylyZXZlcnNlZF90cmF2ZXJzZSwvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXJldmVyc2VkX25leHQsICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgcmV2ZXJzZWRpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICByZXZlcnNlZF9uZXcsICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvZXhjZXB0aW9ucy5jIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKaW5kZXggYTk2MTE0My4uMmU5ODI4MyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9leGNlcHRpb25zLmMKKysrIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogc3RhdGljIFB5TWV0aG9kRGVmIEJhc2VFeGNlcHRpb25fbWV0aG9kc1tdID0gewogICAgeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKUJhc2VFeGNlcHRpb25fcmVkdWNlLCBNRVRIX05PQVJHUyB9LAogICAgeyJfX3NldHN0YXRlX18iLCAoUHlDRnVuY3Rpb24pQmFzZUV4Y2VwdGlvbl9zZXRzdGF0ZSwgTUVUSF9PIH0sCi0jaWZkZWYgUHlfVVNJTkdfVU5JQ09ERSAgIAorI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKICAgIHsiX191bmljb2RlX18iLCAoUHlDRnVuY3Rpb24pQmFzZUV4Y2VwdGlvbl91bmljb2RlLCBNRVRIX05PQVJHUyB9LAogI2VuZGlmCiAgICB7TlVMTCwgTlVMTCwgMCwgTlVMTH0sCkBAIC0yMzYsNyArMjM2LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIEJhc2VFeGNlcHRpb25fZ2V0c2xpY2UoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICpzZWxmLAotCQkJUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBzdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBzdG9wKQogewogICAgIGlmIChQeUVycl9XYXJuUHkzaygiX19nZXRzbGljZV9fIG5vdCBzdXBwb3J0ZWQgZm9yIGV4Y2VwdGlvbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc2VzIGluIDMueDsgdXNlIGFyZ3MgYXR0cmlidXRlIiwgMSkgPCAwKQpAQCAtMzE2LDcgKzMxNiw3IEBACiBCYXNlRXhjZXB0aW9uX2dldF9tZXNzYWdlKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqbXNnOwotICAgIAorCiAgICAgLyogaWYgIm1lc3NhZ2UiIGlzIGluIHNlbGYtPmRpY3QsIGFjY2Vzc2luZyBhIHVzZXItc2V0IG1lc3NhZ2UgYXR0cmlidXRlICovCiAgICAgaWYgKHNlbGYtPmRpY3QgJiYKICAgICAgICAgKG1zZyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPmRpY3QsICJtZXNzYWdlIikpKSB7CkBAIC0zNTIsNyArMzUyLDcgQEAKICAgICAgICAgc2VsZi0+bWVzc2FnZSA9IE5VTEw7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICAKKwogICAgIC8qIGVsc2Ugc2V0IGl0IGluIF9fZGljdF9fLCBidXQgbWF5IG5lZWQgdG8gY3JlYXRlIHRoZSBkaWN0IGZpcnN0ICovCiAgICAgaWYgKHNlbGYtPmRpY3QgPT0gTlVMTCkgewogICAgICAgICBzZWxmLT5kaWN0ID0gUHlEaWN0X05ldygpOwpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgeyJfX2RpY3RfXyIsIChnZXR0ZXIpQmFzZUV4Y2VwdGlvbl9nZXRfZGljdCwgKHNldHRlcilCYXNlRXhjZXB0aW9uX3NldF9kaWN0fSwKICAgICB7ImFyZ3MiLCAoZ2V0dGVyKUJhc2VFeGNlcHRpb25fZ2V0X2FyZ3MsIChzZXR0ZXIpQmFzZUV4Y2VwdGlvbl9zZXRfYXJnc30sCiAgICAgeyJtZXNzYWdlIiwgKGdldHRlcilCYXNlRXhjZXB0aW9uX2dldF9tZXNzYWdlLAotCSAgICAoc2V0dGVyKUJhc2VFeGNlcHRpb25fc2V0X21lc3NhZ2V9LAorICAgICAgICAgICAgKHNldHRlcilCYXNlRXhjZXB0aW9uX3NldF9tZXNzYWdlfSwKICAgICB7TlVMTH0sCiB9OwogCkBAIC0zOTMsNyArMzkzLDcgQEAKICAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgLyp0cF9zZXRhdHRybyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLSAgICAJUHlfVFBGTEFHU19CQVNFX0VYQ19TVUJDTEFTUywgIC8qdHBfZmxhZ3MqLworICAgICAgICBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTLCAgLyp0cF9mbGFncyovCiAgICAgUHlEb2NfU1RSKCJDb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIGV4Y2VwdGlvbnMiKSwgLyogdHBfZG9jICovCiAgICAgKHRyYXZlcnNlcHJvYylCYXNlRXhjZXB0aW9uX3RyYXZlcnNlLCAvKiB0cF90cmF2ZXJzZSAqLwogICAgIChpbnF1aXJ5KUJhc2VFeGNlcHRpb25fY2xlYXIsIC8qIHRwX2NsZWFyICovCkBAIC0yMTg2LDI1ICsyMTg2LDI1IEBACiAKICAgICBQeUV4Y19SZWN1cnNpb25FcnJvckluc3QgPSBCYXNlRXhjZXB0aW9uX25ldygmX1B5RXhjX1J1bnRpbWVFcnJvciwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKCFQeUV4Y19SZWN1cnNpb25FcnJvckluc3QpCi0JUHlfRmF0YWxFcnJvcigiQ2Fubm90IHByZS1hbGxvY2F0ZSBSdW50aW1lRXJyb3IgaW5zdGFuY2UgZm9yICIKLQkJCSJyZWN1cnNpb24gZXJyb3JzIik7CisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbm5vdCBwcmUtYWxsb2NhdGUgUnVudGltZUVycm9yIGluc3RhbmNlIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAicmVjdXJzaW9uIGVycm9ycyIpOwogICAgIGVsc2UgewotCVB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqZXJyX2luc3QgPQotCSAgICAoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0OwotCVB5T2JqZWN0ICphcmdzX3R1cGxlOwotCVB5T2JqZWN0ICpleGNfbWVzc2FnZTsKLQlleGNfbWVzc2FnZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIm1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkIik7Ci0JaWYgKCFleGNfbWVzc2FnZSkKLQkgICAgUHlfRmF0YWxFcnJvcigiY2Fubm90IGFsbG9jYXRlIGFyZ3VtZW50IGZvciBSdW50aW1lRXJyb3IgIgotCQkJICAgICJwcmUtYWxsb2NhdGlvbiIpOwotCWFyZ3NfdHVwbGUgPSBQeVR1cGxlX1BhY2soMSwgZXhjX21lc3NhZ2UpOwotCWlmICghYXJnc190dXBsZSkKLQkgICAgUHlfRmF0YWxFcnJvcigiY2Fubm90IGFsbG9jYXRlIHR1cGxlIGZvciBSdW50aW1lRXJyb3IgIgotCQkJICAgICJwcmUtYWxsb2NhdGlvbiIpOwotCVB5X0RFQ1JFRihleGNfbWVzc2FnZSk7Ci0JaWYgKEJhc2VFeGNlcHRpb25faW5pdChlcnJfaW5zdCwgYXJnc190dXBsZSwgTlVMTCkpCi0JICAgIFB5X0ZhdGFsRXJyb3IoImluaXQgb2YgcHJlLWFsbG9jYXRlZCBSdW50aW1lRXJyb3IgZmFpbGVkIik7Ci0JUHlfREVDUkVGKGFyZ3NfdHVwbGUpOworICAgICAgICBQeUJhc2VFeGNlcHRpb25PYmplY3QgKmVycl9pbnN0ID0KKyAgICAgICAgICAgIChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilQeUV4Y19SZWN1cnNpb25FcnJvckluc3Q7CisgICAgICAgIFB5T2JqZWN0ICphcmdzX3R1cGxlOworICAgICAgICBQeU9iamVjdCAqZXhjX21lc3NhZ2U7CisgICAgICAgIGV4Y19tZXNzYWdlID0gUHlTdHJpbmdfRnJvbVN0cmluZygibWF4aW11bSByZWN1cnNpb24gZGVwdGggZXhjZWVkZWQiKTsKKyAgICAgICAgaWYgKCFleGNfbWVzc2FnZSkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbm5vdCBhbGxvY2F0ZSBhcmd1bWVudCBmb3IgUnVudGltZUVycm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlLWFsbG9jYXRpb24iKTsKKyAgICAgICAgYXJnc190dXBsZSA9IFB5VHVwbGVfUGFjaygxLCBleGNfbWVzc2FnZSk7CisgICAgICAgIGlmICghYXJnc190dXBsZSkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbm5vdCBhbGxvY2F0ZSB0dXBsZSBmb3IgUnVudGltZUVycm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlLWFsbG9jYXRpb24iKTsKKyAgICAgICAgUHlfREVDUkVGKGV4Y19tZXNzYWdlKTsKKyAgICAgICAgaWYgKEJhc2VFeGNlcHRpb25faW5pdChlcnJfaW5zdCwgYXJnc190dXBsZSwgTlVMTCkpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJpbml0IG9mIHByZS1hbGxvY2F0ZWQgUnVudGltZUVycm9yIGZhaWxlZCIpOworICAgICAgICBQeV9ERUNSRUYoYXJnc190dXBsZSk7CiAgICAgfQogCiAgICAgUHlfREVDUkVGKGJsdGlubW9kKTsKZGlmZiAtLWdpdCBhL09iamVjdHMvZmlsZW9iamVjdC5jIGIvT2JqZWN0cy9maWxlb2JqZWN0LmMKaW5kZXggZjQ3OTUwMS4uNmI5NWEwYyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9maWxlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9maWxlb2JqZWN0LmMKQEAgLTM3LDEwICszNywxMCBAQAogI2VuZGlmCiAKIC8qIEJpdHMgaW4gZl9uZXdsaW5ldHlwZXMgKi8KLSNkZWZpbmUgTkVXTElORV9VTktOT1dOCTAJLyogTm8gbmV3bGluZSBzZWVuLCB5ZXQgKi8KLSNkZWZpbmUgTkVXTElORV9DUiAxCQkvKiBcciBuZXdsaW5lIHNlZW4gKi8KLSNkZWZpbmUgTkVXTElORV9MRiAyCQkvKiBcbiBuZXdsaW5lIHNlZW4gKi8KLSNkZWZpbmUgTkVXTElORV9DUkxGIDQJCS8qIFxyXG4gbmV3bGluZSBzZWVuICovCisjZGVmaW5lIE5FV0xJTkVfVU5LTk9XTiAwICAgICAgIC8qIE5vIG5ld2xpbmUgc2VlbiwgeWV0ICovCisjZGVmaW5lIE5FV0xJTkVfQ1IgMSAgICAgICAgICAgIC8qIFxyIG5ld2xpbmUgc2VlbiAqLworI2RlZmluZSBORVdMSU5FX0xGIDIgICAgICAgICAgICAvKiBcbiBuZXdsaW5lIHNlZW4gKi8KKyNkZWZpbmUgTkVXTElORV9DUkxGIDQgICAgICAgICAgLyogXHJcbiBuZXdsaW5lIHNlZW4gKi8KIAogLyoKICAqIFRoZXNlIG1hY3JvcyByZWxlYXNlIHRoZSBHSUwgd2hpbGUgcHJldmVudGluZyB0aGUgZl9jbG9zZSgpIGZ1bmN0aW9uIGJlaW5nCkBAIC01MiwxOSArNTIsMTkgQEAKIAogI2RlZmluZSBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZm9iaikgXAogeyBcCi0JZm9iai0+dW5sb2NrZWRfY291bnQrKzsgXAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmb2JqLT51bmxvY2tlZF9jb3VudCsrOyBcCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCiAjZGVmaW5lIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZm9iaikgXAotCVB5X0VORF9BTExPV19USFJFQURTIFwKLQlmb2JqLT51bmxvY2tlZF9jb3VudC0tOyBcCi0JYXNzZXJ0KGZvYmotPnVubG9ja2VkX2NvdW50ID49IDApOyBcCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMgXAorICAgIGZvYmotPnVubG9ja2VkX2NvdW50LS07IFwKKyAgICBhc3NlcnQoZm9iai0+dW5sb2NrZWRfY291bnQgPj0gMCk7IFwKIH0KIAogI2RlZmluZSBGSUxFX0FCT1JUX0FMTE9XX1RIUkVBRFMoZm9iaikgXAotCVB5X0JMT0NLX1RIUkVBRFMgXAotCWZvYmotPnVubG9ja2VkX2NvdW50LS07IFwKLQlhc3NlcnQoZm9iai0+dW5sb2NrZWRfY291bnQgPj0gMCk7CisgICAgUHlfQkxPQ0tfVEhSRUFEUyBcCisgICAgZm9iai0+dW5sb2NrZWRfY291bnQtLTsgXAorICAgIGFzc2VydChmb2JqLT51bmxvY2tlZF9jb3VudCA+PSAwKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKQEAgLTczLDMwICs3MywzMCBAQAogRklMRSAqCiBQeUZpbGVfQXNGaWxlKFB5T2JqZWN0ICpmKQogewotCWlmIChmID09IE5VTEwgfHwgIVB5RmlsZV9DaGVjayhmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gKChQeUZpbGVPYmplY3QgKilmKS0+Zl9mcDsKKyAgICBpZiAoZiA9PSBOVUxMIHx8ICFQeUZpbGVfQ2hlY2soZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICgoUHlGaWxlT2JqZWN0ICopZiktPmZfZnA7CiB9CiAKIHZvaWQgUHlGaWxlX0luY1VzZUNvdW50KFB5RmlsZU9iamVjdCAqZm9iaikKIHsKLQlmb2JqLT51bmxvY2tlZF9jb3VudCsrOworICAgIGZvYmotPnVubG9ja2VkX2NvdW50Kys7CiB9CiAKIHZvaWQgUHlGaWxlX0RlY1VzZUNvdW50KFB5RmlsZU9iamVjdCAqZm9iaikKIHsKLQlmb2JqLT51bmxvY2tlZF9jb3VudC0tOwotCWFzc2VydChmb2JqLT51bmxvY2tlZF9jb3VudCA+PSAwKTsKKyAgICBmb2JqLT51bmxvY2tlZF9jb3VudC0tOworICAgIGFzc2VydChmb2JqLT51bmxvY2tlZF9jb3VudCA+PSAwKTsKIH0KIAogUHlPYmplY3QgKgogUHlGaWxlX05hbWUoUHlPYmplY3QgKmYpCiB7Ci0JaWYgKGYgPT0gTlVMTCB8fCAhUHlGaWxlX0NoZWNrKGYpKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiAoKFB5RmlsZU9iamVjdCAqKWYpLT5mX25hbWU7CisgICAgaWYgKGYgPT0gTlVMTCB8fCAhUHlGaWxlX0NoZWNrKGYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAoKFB5RmlsZU9iamVjdCAqKWYpLT5mX25hbWU7CiB9CiAKIC8qIFRoaXMgaXMgYSBzYWZlIHdyYXBwZXIgYXJvdW5kIFB5T2JqZWN0X1ByaW50IHRvIHByaW50IHRvIHRoZSBGSUxFCkBAIC0xMDUsMTEgKzEwNSwxMSBAQAogc3RhdGljIGludAogZmlsZV9QeU9iamVjdF9QcmludChQeU9iamVjdCAqb3AsIFB5RmlsZU9iamVjdCAqZiwgaW50IGZsYWdzKQogewotCWludCByZXN1bHQ7Ci0JUHlGaWxlX0luY1VzZUNvdW50KGYpOwotCXJlc3VsdCA9IFB5T2JqZWN0X1ByaW50KG9wLCBmLT5mX2ZwLCBmbGFncyk7Ci0JUHlGaWxlX0RlY1VzZUNvdW50KGYpOwotCXJldHVybiByZXN1bHQ7CisgICAgaW50IHJlc3VsdDsKKyAgICBQeUZpbGVfSW5jVXNlQ291bnQoZik7CisgICAgcmVzdWx0ID0gUHlPYmplY3RfUHJpbnQob3AsIGYtPmZfZnAsIGZsYWdzKTsKKyAgICBQeUZpbGVfRGVjVXNlQ291bnQoZik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogT24gVW5peCwgZm9wZW4gd2lsbCBzdWNjZWVkIGZvciBkaXJlY3Rvcmllcy4KQEAgLTEyMCw2NiArMTIwLDY2IEBACiBkaXJjaGVjayhQeUZpbGVPYmplY3QqIGYpCiB7CiAjaWYgZGVmaW5lZChIQVZFX0ZTVEFUKSAmJiBkZWZpbmVkKFNfSUZESVIpICYmIGRlZmluZWQoRUlTRElSKQotCXN0cnVjdCBzdGF0IGJ1ZjsKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZjsKLQlpZiAoZnN0YXQoZmlsZW5vKGYtPmZfZnApLCAmYnVmKSA9PSAwICYmCi0JICAgIFNfSVNESVIoYnVmLnN0X21vZGUpKSB7Ci0JCWNoYXIgKm1zZyA9IHN0cmVycm9yKEVJU0RJUik7Ci0JCVB5T2JqZWN0ICpleGMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oUHlFeGNfSU9FcnJvciwgIihpc08pIiwKLQkJCQkJCSAgICAgIEVJU0RJUiwgbXNnLCBmLT5mX25hbWUpOwotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfSU9FcnJvciwgZXhjKTsKLQkJUHlfWERFQ1JFRihleGMpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBmOworICAgIGlmIChmc3RhdChmaWxlbm8oZi0+Zl9mcCksICZidWYpID09IDAgJiYKKyAgICAgICAgU19JU0RJUihidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgY2hhciAqbXNnID0gc3RyZXJyb3IoRUlTRElSKTsKKyAgICAgICAgUHlPYmplY3QgKmV4YyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihQeUV4Y19JT0Vycm9yLCAiKGlzTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJU0RJUiwgbXNnLCBmLT5mX25hbWUpOworICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfSU9FcnJvciwgZXhjKTsKKyAgICAgICAgUHlfWERFQ1JFRihleGMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gZjsKKyAgICByZXR1cm4gZjsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsbF9maWxlX2ZpZWxkcyhQeUZpbGVPYmplY3QgKmYsIEZJTEUgKmZwLCBQeU9iamVjdCAqbmFtZSwgY2hhciAqbW9kZSwKLQkJIGludCAoKmNsb3NlKShGSUxFICopKQorICAgICAgICAgICAgICAgICBpbnQgKCpjbG9zZSkoRklMRSAqKSkKIHsKLQlhc3NlcnQobmFtZSAhPSBOVUxMKTsKLQlhc3NlcnQoZiAhPSBOVUxMKTsKLQlhc3NlcnQoUHlGaWxlX0NoZWNrKGYpKTsKLQlhc3NlcnQoZi0+Zl9mcCA9PSBOVUxMKTsKKyAgICBhc3NlcnQobmFtZSAhPSBOVUxMKTsKKyAgICBhc3NlcnQoZiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoUHlGaWxlX0NoZWNrKGYpKTsKKyAgICBhc3NlcnQoZi0+Zl9mcCA9PSBOVUxMKTsKIAotCVB5X0RFQ1JFRihmLT5mX25hbWUpOwotCVB5X0RFQ1JFRihmLT5mX21vZGUpOwotCVB5X0RFQ1JFRihmLT5mX2VuY29kaW5nKTsKLQlQeV9ERUNSRUYoZi0+Zl9lcnJvcnMpOworICAgIFB5X0RFQ1JFRihmLT5mX25hbWUpOworICAgIFB5X0RFQ1JFRihmLT5mX21vZGUpOworICAgIFB5X0RFQ1JFRihmLT5mX2VuY29kaW5nKTsKKyAgICBQeV9ERUNSRUYoZi0+Zl9lcnJvcnMpOwogCi0gICAgICAgIFB5X0lOQ1JFRihuYW1lKTsKLSAgICAgICAgZi0+Zl9uYW1lID0gbmFtZTsKKyAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgZi0+Zl9uYW1lID0gbmFtZTsKIAotCWYtPmZfbW9kZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobW9kZSk7CisgICAgZi0+Zl9tb2RlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhtb2RlKTsKIAotCWYtPmZfY2xvc2UgPSBjbG9zZTsKLQlmLT5mX3NvZnRzcGFjZSA9IDA7Ci0JZi0+Zl9iaW5hcnkgPSBzdHJjaHIobW9kZSwnYicpICE9IE5VTEw7Ci0JZi0+Zl9idWYgPSBOVUxMOwotCWYtPmZfdW5pdl9uZXdsaW5lID0gKHN0cmNocihtb2RlLCAnVScpICE9IE5VTEwpOwotCWYtPmZfbmV3bGluZXR5cGVzID0gTkVXTElORV9VTktOT1dOOwotCWYtPmZfc2tpcG5leHRsZiA9IDA7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCWYtPmZfZW5jb2RpbmcgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlmLT5mX2Vycm9ycyA9IFB5X05vbmU7Ci0JZi0+cmVhZGFibGUgPSBmLT53cml0YWJsZSA9IDA7Ci0JaWYgKHN0cmNocihtb2RlLCAncicpICE9IE5VTEwgfHwgZi0+Zl91bml2X25ld2xpbmUpCi0JCWYtPnJlYWRhYmxlID0gMTsKLQlpZiAoc3RyY2hyKG1vZGUsICd3JykgIT0gTlVMTCB8fCBzdHJjaHIobW9kZSwgJ2EnKSAhPSBOVUxMKQotCQlmLT53cml0YWJsZSA9IDE7Ci0JaWYgKHN0cmNocihtb2RlLCAnKycpICE9IE5VTEwpCi0JCWYtPnJlYWRhYmxlID0gZi0+d3JpdGFibGUgPSAxOworICAgIGYtPmZfY2xvc2UgPSBjbG9zZTsKKyAgICBmLT5mX3NvZnRzcGFjZSA9IDA7CisgICAgZi0+Zl9iaW5hcnkgPSBzdHJjaHIobW9kZSwnYicpICE9IE5VTEw7CisgICAgZi0+Zl9idWYgPSBOVUxMOworICAgIGYtPmZfdW5pdl9uZXdsaW5lID0gKHN0cmNocihtb2RlLCAnVScpICE9IE5VTEwpOworICAgIGYtPmZfbmV3bGluZXR5cGVzID0gTkVXTElORV9VTktOT1dOOworICAgIGYtPmZfc2tpcG5leHRsZiA9IDA7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIGYtPmZfZW5jb2RpbmcgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBmLT5mX2Vycm9ycyA9IFB5X05vbmU7CisgICAgZi0+cmVhZGFibGUgPSBmLT53cml0YWJsZSA9IDA7CisgICAgaWYgKHN0cmNocihtb2RlLCAncicpICE9IE5VTEwgfHwgZi0+Zl91bml2X25ld2xpbmUpCisgICAgICAgIGYtPnJlYWRhYmxlID0gMTsKKyAgICBpZiAoc3RyY2hyKG1vZGUsICd3JykgIT0gTlVMTCB8fCBzdHJjaHIobW9kZSwgJ2EnKSAhPSBOVUxMKQorICAgICAgICBmLT53cml0YWJsZSA9IDE7CisgICAgaWYgKHN0cmNocihtb2RlLCAnKycpICE9IE5VTEwpCisgICAgICAgIGYtPnJlYWRhYmxlID0gZi0+d3JpdGFibGUgPSAxOwogCi0JaWYgKGYtPmZfbW9kZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmLT5mX2ZwID0gZnA7Ci0gICAgICAgIGYgPSBkaXJjaGVjayhmKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIGY7CisgICAgaWYgKGYtPmZfbW9kZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmLT5mX2ZwID0gZnA7CisgICAgZiA9IGRpcmNoZWNrKGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKikgZjsKIH0KIAogI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTQwMCAmJiBkZWZpbmVkKF9fU1REQ19TRUNVUkVfTElCX18pCkBAIC0xOTIsNzQgKzE5Miw3NCBAQAogICovCiBzdGF0aWMgaW50IF9QeVZlcmlmeV9Nb2RlX1dJTk5UKGNvbnN0IGNoYXIgKm1vZGUpCiB7Ci0JLyogU2VlIGlmIG1vZGUgc3RyaW5nIGlzIHZhbGlkIG9uIFdpbmRvd3MgdG8gYXZvaWQgaGFyZCBhc3NlcnRpb25zICovCi0JLyogcmVtb3ZlIGxlYWRpbmcgc3BhY2VzZSAqLwotCWludCBzaW5nbGVzID0gMDsKLQlpbnQgcGFpcnMgPSAwOwotCWludCBlbmNvZGluZyA9IDA7Ci0JY29uc3QgY2hhciAqcywgKmM7CisgICAgLyogU2VlIGlmIG1vZGUgc3RyaW5nIGlzIHZhbGlkIG9uIFdpbmRvd3MgdG8gYXZvaWQgaGFyZCBhc3NlcnRpb25zICovCisgICAgLyogcmVtb3ZlIGxlYWRpbmcgc3BhY2VzZSAqLworICAgIGludCBzaW5nbGVzID0gMDsKKyAgICBpbnQgcGFpcnMgPSAwOworICAgIGludCBlbmNvZGluZyA9IDA7CisgICAgY29uc3QgY2hhciAqcywgKmM7CiAKLQl3aGlsZSgqbW9kZSA9PSAnICcpIC8qIHN0cmlwIGluaXRpYWwgc3BhY2VzICovCi0JCSsrbW9kZTsKLQlpZiAoIXN0cmNocigicndhIiwgKm1vZGUpKSAvKiBtdXN0IHN0YXJ0IHdpdGggb25lIG9mIHRoZXNlICovCi0JCXJldHVybiAwOwotCXdoaWxlICgqKyttb2RlKSB7Ci0JCWlmICgqbW9kZSA9PSAnICcgfHwgKm1vZGUgPT0gJ04nKSAvKiBpZ25vcmUgc3BhY2VzIGFuZCBOICovCi0JCQljb250aW51ZTsKLQkJcyA9ICIrVEQiOyAvKiBlYWNoIG9mIHRoaXMgY2FuIGFwcGVhciBvbmx5IG9uY2UgKi8KLQkJYyA9IHN0cmNocihzLCAqbW9kZSk7Ci0JCWlmIChjKSB7Ci0JCQlwdHJkaWZmX3QgaWR4ID0gcy1jOwotCQkJaWYgKHNpbmdsZXMgJiAoMTw8aWR4KSkKLQkJCQlyZXR1cm4gMDsKLQkJCXNpbmdsZXMgfD0gKDE8PGlkeCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlzID0gImJ0Y25TUiI7IC8qIG9ubHkgb25lIG9mIGVhY2ggbGV0dGVyIGluIHRoZSBwYWlycyBhbGxvd2VkICovCi0JCWMgPSBzdHJjaHIocywgKm1vZGUpOwotCQlpZiAoYykgewotCQkJcHRyZGlmZl90IGlkeCA9IChzLWMpLzI7Ci0JCQlpZiAocGFpcnMgJiAoMTw8aWR4KSkKLQkJCQlyZXR1cm4gMDsKLQkJCXBhaXJzIHw9ICgxPDxpZHgpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCptb2RlID09ICcsJykgewotCQkJZW5jb2RpbmcgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIDA7IC8qIGZvdW5kIGFuIGludmFsaWQgY2hhciAqLwotCX0KKyAgICB3aGlsZSgqbW9kZSA9PSAnICcpIC8qIHN0cmlwIGluaXRpYWwgc3BhY2VzICovCisgICAgICAgICsrbW9kZTsKKyAgICBpZiAoIXN0cmNocigicndhIiwgKm1vZGUpKSAvKiBtdXN0IHN0YXJ0IHdpdGggb25lIG9mIHRoZXNlICovCisgICAgICAgIHJldHVybiAwOworICAgIHdoaWxlICgqKyttb2RlKSB7CisgICAgICAgIGlmICgqbW9kZSA9PSAnICcgfHwgKm1vZGUgPT0gJ04nKSAvKiBpZ25vcmUgc3BhY2VzIGFuZCBOICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcyA9ICIrVEQiOyAvKiBlYWNoIG9mIHRoaXMgY2FuIGFwcGVhciBvbmx5IG9uY2UgKi8KKyAgICAgICAgYyA9IHN0cmNocihzLCAqbW9kZSk7CisgICAgICAgIGlmIChjKSB7CisgICAgICAgICAgICBwdHJkaWZmX3QgaWR4ID0gcy1jOworICAgICAgICAgICAgaWYgKHNpbmdsZXMgJiAoMTw8aWR4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHNpbmdsZXMgfD0gKDE8PGlkeCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzID0gImJ0Y25TUiI7IC8qIG9ubHkgb25lIG9mIGVhY2ggbGV0dGVyIGluIHRoZSBwYWlycyBhbGxvd2VkICovCisgICAgICAgIGMgPSBzdHJjaHIocywgKm1vZGUpOworICAgICAgICBpZiAoYykgeworICAgICAgICAgICAgcHRyZGlmZl90IGlkeCA9IChzLWMpLzI7CisgICAgICAgICAgICBpZiAocGFpcnMgJiAoMTw8aWR4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHBhaXJzIHw9ICgxPDxpZHgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCptb2RlID09ICcsJykgeworICAgICAgICAgICAgZW5jb2RpbmcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7IC8qIGZvdW5kIGFuIGludmFsaWQgY2hhciAqLworICAgIH0KIAotCWlmIChlbmNvZGluZykgewotCQljaGFyICplW10gPSB7IlVURi04IiwgIlVURi0xNkxFIiwgIlVOSUNPREUifTsKLQkJd2hpbGUgKCptb2RlID09ICcgJykKLQkJCSsrbW9kZTsKLQkJLyogZmluZCAnY2NzID0nICovCi0JCWlmIChzdHJuY21wKG1vZGUsICJjY3MiLCAzKSkKLQkJCXJldHVybiAwOwotCQltb2RlICs9IDM7Ci0JCXdoaWxlICgqbW9kZSA9PSAnICcpCi0JCQkrK21vZGU7Ci0JCWlmICgqbW9kZSAhPSAnPScpCi0JCQlyZXR1cm4gMDsKLQkJd2hpbGUgKCptb2RlID09ICcgJykKLQkJCSsrbW9kZTsKLQkJZm9yKGVuY29kaW5nID0gMDsgZW5jb2Rpbmc8X2NvdW50b2YoZSk7ICsrZW5jb2RpbmcpIHsKLQkJCXNpemVfdCBsID0gc3RybGVuKGVbZW5jb2RpbmddKTsKLQkJCWlmICghc3RybmNtcChtb2RlLCBlW2VuY29kaW5nXSwgbCkpIHsKLQkJCQltb2RlICs9IGw7IC8qIGZvdW5kIGEgdmFsaWQgZW5jb2RpbmcgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZW5jb2RpbmcgPT0gX2NvdW50b2YoZSkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JLyogc2tpcCB0cmFpbGluZyBzcGFjZXMgKi8KLQl3aGlsZSAoKm1vZGUgPT0gJyAnKQotCQkrK21vZGU7CisgICAgaWYgKGVuY29kaW5nKSB7CisgICAgICAgIGNoYXIgKmVbXSA9IHsiVVRGLTgiLCAiVVRGLTE2TEUiLCAiVU5JQ09ERSJ9OworICAgICAgICB3aGlsZSAoKm1vZGUgPT0gJyAnKQorICAgICAgICAgICAgKyttb2RlOworICAgICAgICAvKiBmaW5kICdjY3MgPScgKi8KKyAgICAgICAgaWYgKHN0cm5jbXAobW9kZSwgImNjcyIsIDMpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG1vZGUgKz0gMzsKKyAgICAgICAgd2hpbGUgKCptb2RlID09ICcgJykKKyAgICAgICAgICAgICsrbW9kZTsKKyAgICAgICAgaWYgKCptb2RlICE9ICc9JykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB3aGlsZSAoKm1vZGUgPT0gJyAnKQorICAgICAgICAgICAgKyttb2RlOworICAgICAgICBmb3IoZW5jb2RpbmcgPSAwOyBlbmNvZGluZzxfY291bnRvZihlKTsgKytlbmNvZGluZykgeworICAgICAgICAgICAgc2l6ZV90IGwgPSBzdHJsZW4oZVtlbmNvZGluZ10pOworICAgICAgICAgICAgaWYgKCFzdHJuY21wKG1vZGUsIGVbZW5jb2RpbmddLCBsKSkgeworICAgICAgICAgICAgICAgIG1vZGUgKz0gbDsgLyogZm91bmQgYSB2YWxpZCBlbmNvZGluZyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBfY291bnRvZihlKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBza2lwIHRyYWlsaW5nIHNwYWNlcyAqLworICAgIHdoaWxlICgqbW9kZSA9PSAnICcpCisgICAgICAgICsrbW9kZTsKIAotCXJldHVybiAqbW9kZSA9PSAnXDAnOyAvKiBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLworICAgIHJldHVybiAqbW9kZSA9PSAnXDAnOyAvKiBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLwogfQogI2VuZGlmCiAKQEAgLTI3MiwyNjQgKzI3MiwyNjQgQEAKIGludAogX1B5RmlsZV9TYW5pdGl6ZU1vZGUoY2hhciAqbW9kZSkKIHsKLQljaGFyICp1cG9zOwotCXNpemVfdCBsZW4gPSBzdHJsZW4obW9kZSk7CisgICAgY2hhciAqdXBvczsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKG1vZGUpOwogCi0JaWYgKCFsZW4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBtb2RlIHN0cmluZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICghbGVuKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgbW9kZSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXVwb3MgPSBzdHJjaHIobW9kZSwgJ1UnKTsKLQlpZiAodXBvcykgewotCQltZW1tb3ZlKHVwb3MsIHVwb3MrMSwgbGVuLSh1cG9zLW1vZGUpKTsgLyogaW5jbCBudWxsIGNoYXIgKi8KKyAgICB1cG9zID0gc3RyY2hyKG1vZGUsICdVJyk7CisgICAgaWYgKHVwb3MpIHsKKyAgICAgICAgbWVtbW92ZSh1cG9zLCB1cG9zKzEsIGxlbi0odXBvcy1tb2RlKSk7IC8qIGluY2wgbnVsbCBjaGFyICovCiAKLQkJaWYgKG1vZGVbMF0gPT0gJ3cnIHx8IG1vZGVbMF0gPT0gJ2EnKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgInVuaXZlcnNhbCBuZXdsaW5lICIKLQkJCSAgICAgICAgICAgICAibW9kZSBjYW4gb25seSBiZSB1c2VkIHdpdGggbW9kZXMgIgotCQkJCSAgICAgInN0YXJ0aW5nIHdpdGggJ3InIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgaWYgKG1vZGVbMF0gPT0gJ3cnIHx8IG1vZGVbMF0gPT0gJ2EnKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgInVuaXZlcnNhbCBuZXdsaW5lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibW9kZSBjYW4gb25seSBiZSB1c2VkIHdpdGggbW9kZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFydGluZyB3aXRoICdyJyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJaWYgKG1vZGVbMF0gIT0gJ3InKSB7Ci0JCQltZW1tb3ZlKG1vZGUrMSwgbW9kZSwgc3RybGVuKG1vZGUpKzEpOwotCQkJbW9kZVswXSA9ICdyJzsKLQkJfQorICAgICAgICBpZiAobW9kZVswXSAhPSAncicpIHsKKyAgICAgICAgICAgIG1lbW1vdmUobW9kZSsxLCBtb2RlLCBzdHJsZW4obW9kZSkrMSk7CisgICAgICAgICAgICBtb2RlWzBdID0gJ3InOworICAgICAgICB9CiAKLQkJaWYgKCFzdHJjaHIobW9kZSwgJ2InKSkgewotCQkJbWVtbW92ZShtb2RlKzIsIG1vZGUrMSwgc3RybGVuKG1vZGUpKTsKLQkJCW1vZGVbMV0gPSAnYic7Ci0JCX0KLQl9IGVsc2UgaWYgKG1vZGVbMF0gIT0gJ3InICYmIG1vZGVbMF0gIT0gJ3cnICYmIG1vZGVbMF0gIT0gJ2EnKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAibW9kZSBzdHJpbmcgbXVzdCBiZWdpbiB3aXRoICIKLQkgICAgICAgIAkgICAgIm9uZSBvZiAncicsICd3JywgJ2EnIG9yICdVJywgbm90ICclLjIwMHMnIiwgbW9kZSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgIGlmICghc3RyY2hyKG1vZGUsICdiJykpIHsKKyAgICAgICAgICAgIG1lbW1vdmUobW9kZSsyLCBtb2RlKzEsIHN0cmxlbihtb2RlKSk7CisgICAgICAgICAgICBtb2RlWzFdID0gJ2InOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtb2RlWzBdICE9ICdyJyAmJiBtb2RlWzBdICE9ICd3JyAmJiBtb2RlWzBdICE9ICdhJykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIm1vZGUgc3RyaW5nIG11c3QgYmVnaW4gd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICJvbmUgb2YgJ3InLCAndycsICdhJyBvciAnVScsIG5vdCAnJS4yMDBzJyIsIG1vZGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogI2lmZGVmIFB5X1ZFUklGWV9XSU5OVAotCS8qIGFkZGl0aW9uYWwgY2hlY2tzIG9uIE5UIHdpdGggdmlzdWFsIHN0dWRpbyAyMDA1IGFuZCBoaWdoZXIgKi8KLQlpZiAoIV9QeVZlcmlmeV9Nb2RlX1dJTk5UKG1vZGUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiSW52YWxpZCBtb2RlICgnJS41MHMnKSIsIG1vZGUpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIGFkZGl0aW9uYWwgY2hlY2tzIG9uIE5UIHdpdGggdmlzdWFsIHN0dWRpbyAyMDA1IGFuZCBoaWdoZXIgKi8KKyAgICBpZiAoIV9QeVZlcmlmeV9Nb2RlX1dJTk5UKG1vZGUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiSW52YWxpZCBtb2RlICgnJS41MHMnKSIsIG1vZGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogI2VuZGlmCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvcGVuX3RoZV9maWxlKFB5RmlsZU9iamVjdCAqZiwgY2hhciAqbmFtZSwgY2hhciAqbW9kZSkKIHsKLQljaGFyICpuZXdtb2RlOwotCWFzc2VydChmICE9IE5VTEwpOwotCWFzc2VydChQeUZpbGVfQ2hlY2soZikpOworICAgIGNoYXIgKm5ld21vZGU7CisgICAgYXNzZXJ0KGYgIT0gTlVMTCk7CisgICAgYXNzZXJ0KFB5RmlsZV9DaGVjayhmKSk7CiAjaWZkZWYgTVNfV0lORE9XUwotCS8qIHdpbmRvd3MgaWdub3JlcyB0aGUgcGFzc2VkIG5hbWUgaW4gb3JkZXIgdG8gc3VwcG9ydCBVbmljb2RlICovCi0JYXNzZXJ0KGYtPmZfbmFtZSAhPSBOVUxMKTsKKyAgICAvKiB3aW5kb3dzIGlnbm9yZXMgdGhlIHBhc3NlZCBuYW1lIGluIG9yZGVyIHRvIHN1cHBvcnQgVW5pY29kZSAqLworICAgIGFzc2VydChmLT5mX25hbWUgIT0gTlVMTCk7CiAjZWxzZQotCWFzc2VydChuYW1lICE9IE5VTEwpOworICAgIGFzc2VydChuYW1lICE9IE5VTEwpOwogI2VuZGlmCi0JYXNzZXJ0KG1vZGUgIT0gTlVMTCk7Ci0JYXNzZXJ0KGYtPmZfZnAgPT0gTlVMTCk7CisgICAgYXNzZXJ0KG1vZGUgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGYtPmZfZnAgPT0gTlVMTCk7CiAKLQkvKiBwcm9iYWJseSBuZWVkIHRvIHJlcGxhY2UgJ1UnIGJ5ICdyYicgKi8KLQluZXdtb2RlID0gUHlNZW1fTUFMTE9DKHN0cmxlbihtb2RlKSArIDMpOwotCWlmICghbmV3bW9kZSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RyY3B5KG5ld21vZGUsIG1vZGUpOworICAgIC8qIHByb2JhYmx5IG5lZWQgdG8gcmVwbGFjZSAnVScgYnkgJ3JiJyAqLworICAgIG5ld21vZGUgPSBQeU1lbV9NQUxMT0Moc3RybGVuKG1vZGUpICsgMyk7CisgICAgaWYgKCFuZXdtb2RlKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJjcHkobmV3bW9kZSwgbW9kZSk7CiAKLQlpZiAoX1B5RmlsZV9TYW5pdGl6ZU1vZGUobmV3bW9kZSkpIHsKLQkJZiA9IE5VTEw7Ci0JCWdvdG8gY2xlYW51cDsKLQl9CisgICAgaWYgKF9QeUZpbGVfU2FuaXRpemVNb2RlKG5ld21vZGUpKSB7CisgICAgICAgIGYgPSBOVUxMOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCi0JLyogcmV4ZWMucHkgY2FuJ3Qgc3RvcCBhIHVzZXIgZnJvbSBnZXR0aW5nIHRoZSBmaWxlKCkgY29uc3RydWN0b3IgLS0KLQkgICBhbGwgdGhleSBoYXZlIHRvIGRvIGlzIGdldCAqYW55KiBmaWxlIG9iamVjdCBmLCBhbmQgdGhlbiBkbwotCSAgIHR5cGUoZikuICBIZXJlIHdlIHByZXZlbnQgdGhlbSBmcm9tIGRvaW5nIGRhbWFnZSB3aXRoIGl0LiAqLwotCWlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAotCQkiZmlsZSgpIGNvbnN0cnVjdG9yIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOwotCQlmID0gTlVMTDsKLQkJZ290byBjbGVhbnVwOwotCX0KLQllcnJubyA9IDA7CisgICAgLyogcmV4ZWMucHkgY2FuJ3Qgc3RvcCBhIHVzZXIgZnJvbSBnZXR0aW5nIHRoZSBmaWxlKCkgY29uc3RydWN0b3IgLS0KKyAgICAgICBhbGwgdGhleSBoYXZlIHRvIGRvIGlzIGdldCAqYW55KiBmaWxlIG9iamVjdCBmLCBhbmQgdGhlbiBkbworICAgICAgIHR5cGUoZikuICBIZXJlIHdlIHByZXZlbnQgdGhlbSBmcm9tIGRvaW5nIGRhbWFnZSB3aXRoIGl0LiAqLworICAgIGlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAorICAgICAgICAiZmlsZSgpIGNvbnN0cnVjdG9yIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOworICAgICAgICBmID0gTlVMTDsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyAgICBlcnJubyA9IDA7CiAKICNpZmRlZiBNU19XSU5ET1dTCi0JaWYgKFB5VW5pY29kZV9DaGVjayhmLT5mX25hbWUpKSB7Ci0JCVB5T2JqZWN0ICp3bW9kZTsKLQkJd21vZGUgPSBQeVVuaWNvZGVfRGVjb2RlQVNDSUkobmV3bW9kZSwgc3RybGVuKG5ld21vZGUpLCBOVUxMKTsKLQkJaWYgKGYtPmZfbmFtZSAmJiB3bW9kZSkgewotCQkJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JCQkvKiBQeVVuaWNvZGVfQVNfVU5JQ09ERSBPSyB3aXRob3V0IHRocmVhZAotCQkJICAgbG9jayBhcyBpdCBpcyBhIHNpbXBsZSBkZXJlZmVyZW5jZS4gKi8KLQkJCWYtPmZfZnAgPSBfd2ZvcGVuKFB5VW5pY29kZV9BU19VTklDT0RFKGYtPmZfbmFtZSksCi0JCQkJCSAgUHlVbmljb2RlX0FTX1VOSUNPREUod21vZGUpKTsKLQkJCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQkJfQotCQlQeV9YREVDUkVGKHdtb2RlKTsKLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhmLT5mX25hbWUpKSB7CisgICAgICAgIFB5T2JqZWN0ICp3bW9kZTsKKyAgICAgICAgd21vZGUgPSBQeVVuaWNvZGVfRGVjb2RlQVNDSUkobmV3bW9kZSwgc3RybGVuKG5ld21vZGUpLCBOVUxMKTsKKyAgICAgICAgaWYgKGYtPmZfbmFtZSAmJiB3bW9kZSkgeworICAgICAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgICAgICAgICAvKiBQeVVuaWNvZGVfQVNfVU5JQ09ERSBPSyB3aXRob3V0IHRocmVhZAorICAgICAgICAgICAgICAgbG9jayBhcyBpdCBpcyBhIHNpbXBsZSBkZXJlZmVyZW5jZS4gKi8KKyAgICAgICAgICAgIGYtPmZfZnAgPSBfd2ZvcGVuKFB5VW5pY29kZV9BU19VTklDT0RFKGYtPmZfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERSh3bW9kZSkpOworICAgICAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYod21vZGUpOworICAgIH0KICNlbmRpZgotCWlmIChOVUxMID09IGYtPmZfZnAgJiYgTlVMTCAhPSBuYW1lKSB7Ci0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCQlmLT5mX2ZwID0gZm9wZW4obmFtZSwgbmV3bW9kZSk7Ci0JCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQl9CisgICAgaWYgKE5VTEwgPT0gZi0+Zl9mcCAmJiBOVUxMICE9IG5hbWUpIHsKKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgICAgIGYtPmZfZnAgPSBmb3BlbihuYW1lLCBuZXdtb2RlKTsKKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIH0KIAotCWlmIChmLT5mX2ZwID09IE5VTEwpIHsKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKSB7CiAjaWYgZGVmaW5lZCAgX01TQ19WRVIgJiYgKF9NU0NfVkVSIDwgMTQwMCB8fCAhZGVmaW5lZChfX1NURENfU0VDVVJFX0xJQl9fKSkKLQkJLyogTVNWQyA2IChNaWNyb3NvZnQpIGxlYXZlcyBlcnJubyBhdCAwIGZvciBiYWQgbW9kZSBzdHJpbmdzLAotCQkgKiBhY3Jvc3MgYWxsIFdpbmRvd3MgZmxhdm9ycy4gIFdoZW4gaXQgc2V0cyBFSU5WQUwgdmFyaWVzCi0JCSAqIGFjcm9zcyBXaW5kb3dzIGZsYXZvcnMsIHRoZSBleGFjdCBjb25kaXRpb25zIGFyZW4ndAotCQkgKiBkb2N1bWVudGVkLCBhbmQgdGhlIGFuc3dlciBsaWVzIGluIHRoZSBPUydzIGltcGxlbWVudGF0aW9uCi0JCSAqIG9mIFdpbjMyJ3MgQ3JlYXRlRmlsZSBmdW5jdGlvbiAod2hvc2Ugc291cmNlIGlzIHNlY3JldCkuCi0JCSAqIFNlZW1zIHRoZSBiZXN0IHdlIGNhbiBkbyBpcyBtYXAgRUlOVkFMIHRvIEVOT0VOVC4KLQkJICogU3RhcnRpbmcgd2l0aCBWaXN1YWwgU3R1ZGlvIC5ORVQgMjAwNSwgRUlOVkFMIGlzIGNvcnJlY3RseQotCQkgKiBzZXQgYnkgb3VyIENSVCBlcnJvciBoYW5kbGVyIChzZXQgaW4gZXhjZXB0aW9ucy5jLikKLQkJICovCi0JCWlmIChlcnJubyA9PSAwKQkvKiBiYWQgbW9kZSBzdHJpbmcgKi8KLQkJCWVycm5vID0gRUlOVkFMOwotCQllbHNlIGlmIChlcnJubyA9PSBFSU5WQUwpIC8qIHVua25vd24sIGJ1dCBub3QgYSBtb2RlIHN0cmluZyAqLwotCQkJZXJybm8gPSBFTk9FTlQ7CisgICAgICAgIC8qIE1TVkMgNiAoTWljcm9zb2Z0KSBsZWF2ZXMgZXJybm8gYXQgMCBmb3IgYmFkIG1vZGUgc3RyaW5ncywKKyAgICAgICAgICogYWNyb3NzIGFsbCBXaW5kb3dzIGZsYXZvcnMuICBXaGVuIGl0IHNldHMgRUlOVkFMIHZhcmllcworICAgICAgICAgKiBhY3Jvc3MgV2luZG93cyBmbGF2b3JzLCB0aGUgZXhhY3QgY29uZGl0aW9ucyBhcmVuJ3QKKyAgICAgICAgICogZG9jdW1lbnRlZCwgYW5kIHRoZSBhbnN3ZXIgbGllcyBpbiB0aGUgT1MncyBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgKiBvZiBXaW4zMidzIENyZWF0ZUZpbGUgZnVuY3Rpb24gKHdob3NlIHNvdXJjZSBpcyBzZWNyZXQpLgorICAgICAgICAgKiBTZWVtcyB0aGUgYmVzdCB3ZSBjYW4gZG8gaXMgbWFwIEVJTlZBTCB0byBFTk9FTlQuCisgICAgICAgICAqIFN0YXJ0aW5nIHdpdGggVmlzdWFsIFN0dWRpbyAuTkVUIDIwMDUsIEVJTlZBTCBpcyBjb3JyZWN0bHkKKyAgICAgICAgICogc2V0IGJ5IG91ciBDUlQgZXJyb3IgaGFuZGxlciAoc2V0IGluIGV4Y2VwdGlvbnMuYy4pCisgICAgICAgICAqLworICAgICAgICBpZiAoZXJybm8gPT0gMCkgICAgICAgICAvKiBiYWQgbW9kZSBzdHJpbmcgKi8KKyAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICBlbHNlIGlmIChlcnJubyA9PSBFSU5WQUwpIC8qIHVua25vd24sIGJ1dCBub3QgYSBtb2RlIHN0cmluZyAqLworICAgICAgICAgICAgZXJybm8gPSBFTk9FTlQ7CiAjZW5kaWYKLSAgICAgICAgICAgICAgICAvKiBFSU5WQUwgaXMgcmV0dXJuZWQgd2hlbiBhbiBpbnZhbGlkIGZpbGVuYW1lIG9yCi0gICAgICAgICAgICAgICAgICogYW4gaW52YWxpZCBtb2RlIGlzIHN1cHBsaWVkLiAqLwotCQlpZiAoZXJybm8gPT0gRUlOVkFMKSB7Ci0JCQlQeU9iamVjdCAqdjsKLQkJCWNoYXIgbWVzc2FnZVsxMDBdOwotCQkJUHlPU19zbnByaW50ZihtZXNzYWdlLCAxMDAsIAotCQkJICAgICJpbnZhbGlkIG1vZGUgKCclLjUwcycpIG9yIGZpbGVuYW1lIiwgbW9kZSk7Ci0JCQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzTykiLCBlcnJubywgbWVzc2FnZSwgZi0+Zl9uYW1lKTsKLQkJCWlmICh2ICE9IE5VTEwpIHsKLQkJCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfSU9FcnJvciwgdik7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCVB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChQeUV4Y19JT0Vycm9yLCBmLT5mX25hbWUpOwotCQlmID0gTlVMTDsKLQl9Ci0JaWYgKGYgIT0gTlVMTCkKLQkJZiA9IGRpcmNoZWNrKGYpOworICAgICAgICAvKiBFSU5WQUwgaXMgcmV0dXJuZWQgd2hlbiBhbiBpbnZhbGlkIGZpbGVuYW1lIG9yCisgICAgICAgICAqIGFuIGludmFsaWQgbW9kZSBpcyBzdXBwbGllZC4gKi8KKyAgICAgICAgaWYgKGVycm5vID09IEVJTlZBTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgICAgICBjaGFyIG1lc3NhZ2VbMTAwXTsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYobWVzc2FnZSwgMTAwLAorICAgICAgICAgICAgICAgICJpbnZhbGlkIG1vZGUgKCclLjUwcycpIG9yIGZpbGVuYW1lIiwgbW9kZSk7CisgICAgICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzTykiLCBlcnJubywgbWVzc2FnZSwgZi0+Zl9uYW1lKTsKKyAgICAgICAgICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfSU9FcnJvciwgdik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChQeUV4Y19JT0Vycm9yLCBmLT5mX25hbWUpOworICAgICAgICBmID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGYgIT0gTlVMTCkKKyAgICAgICAgZiA9IGRpcmNoZWNrKGYpOwogCiBjbGVhbnVwOgotCVB5TWVtX0ZSRUUobmV3bW9kZSk7CisgICAgUHlNZW1fRlJFRShuZXdtb2RlKTsKIAotCXJldHVybiAoUHlPYmplY3QgKilmOworICAgIHJldHVybiAoUHlPYmplY3QgKilmOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xvc2VfdGhlX2ZpbGUoUHlGaWxlT2JqZWN0ICpmKQogewotCWludCBzdHMgPSAwOwotCWludCAoKmxvY2FsX2Nsb3NlKShGSUxFICopOwotCUZJTEUgKmxvY2FsX2ZwID0gZi0+Zl9mcDsKLQlpZiAobG9jYWxfZnAgIT0gTlVMTCkgewotCQlsb2NhbF9jbG9zZSA9IGYtPmZfY2xvc2U7Ci0JCWlmIChsb2NhbF9jbG9zZSAhPSBOVUxMICYmIGYtPnVubG9ja2VkX2NvdW50ID4gMCkgewotCQkJaWYgKGYtPm9iX3JlZmNudCA+IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKLQkJCQkJImNsb3NlKCkgY2FsbGVkIGR1cmluZyBjb25jdXJyZW50ICIKLQkJCQkJIm9wZXJhdGlvbiBvbiB0aGUgc2FtZSBmaWxlIG9iamVjdC4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiB1bmxlc3Mgc29tZW9uZSBpcwotCQkJCSAqIGNhcmVsZXNzbHkgcGxheWluZyB3aXRoIHRoZSBQeUZpbGVPYmplY3QKLQkJCQkgKiBzdHJ1Y3QgZmllbGRzIGFuZC9vciBpdHMgYXNzb2NpYXRlZCBGSUxFCi0JCQkJICogcG9pbnRlci4gKi8KLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJQeUZpbGVPYmplY3QgbG9ja2luZyBlcnJvciBpbiAiCi0JCQkJCSJkZXN0cnVjdG9yIChyZWZjbnQgPD0gMCBhdCBjbG9zZSkuIik7Ci0JCQl9Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiBOVUxMIG91dCB0aGUgRklMRSBwb2ludGVyIGJlZm9yZSByZWxlYXNpbmcgdGhlIEdJTCwgYmVjYXVzZQotCQkgKiBpdCB3aWxsIG5vdCBiZSB2YWxpZCBhbnltb3JlIGFmdGVyIHRoZSBjbG9zZSgpIGZ1bmN0aW9uIGlzCi0JCSAqIGNhbGxlZC4gKi8KLQkJZi0+Zl9mcCA9IE5VTEw7Ci0JCWlmIChsb2NhbF9jbG9zZSAhPSBOVUxMKSB7Ci0JCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQllcnJubyA9IDA7Ci0JCQlzdHMgPSAoKmxvY2FsX2Nsb3NlKShsb2NhbF9mcCk7Ci0JCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkJaWYgKHN0cyA9PSBFT0YpCi0JCQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCWlmIChzdHMgIT0gMCkKLQkJCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc3RzKTsKLQkJfQotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpbnQgc3RzID0gMDsKKyAgICBpbnQgKCpsb2NhbF9jbG9zZSkoRklMRSAqKTsKKyAgICBGSUxFICpsb2NhbF9mcCA9IGYtPmZfZnA7CisgICAgaWYgKGxvY2FsX2ZwICE9IE5VTEwpIHsKKyAgICAgICAgbG9jYWxfY2xvc2UgPSBmLT5mX2Nsb3NlOworICAgICAgICBpZiAobG9jYWxfY2xvc2UgIT0gTlVMTCAmJiBmLT51bmxvY2tlZF9jb3VudCA+IDApIHsKKyAgICAgICAgICAgIGlmIChmLT5vYl9yZWZjbnQgPiAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjbG9zZSgpIGNhbGxlZCBkdXJpbmcgY29uY3VycmVudCAiCisgICAgICAgICAgICAgICAgICAgICJvcGVyYXRpb24gb24gdGhlIHNhbWUgZmlsZSBvYmplY3QuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIHNvbWVvbmUgaXMKKyAgICAgICAgICAgICAgICAgKiBjYXJlbGVzc2x5IHBsYXlpbmcgd2l0aCB0aGUgUHlGaWxlT2JqZWN0CisgICAgICAgICAgICAgICAgICogc3RydWN0IGZpZWxkcyBhbmQvb3IgaXRzIGFzc29jaWF0ZWQgRklMRQorICAgICAgICAgICAgICAgICAqIHBvaW50ZXIuICovCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiUHlGaWxlT2JqZWN0IGxvY2tpbmcgZXJyb3IgaW4gIgorICAgICAgICAgICAgICAgICAgICAiZGVzdHJ1Y3RvciAocmVmY250IDw9IDAgYXQgY2xvc2UpLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyogTlVMTCBvdXQgdGhlIEZJTEUgcG9pbnRlciBiZWZvcmUgcmVsZWFzaW5nIHRoZSBHSUwsIGJlY2F1c2UKKyAgICAgICAgICogaXQgd2lsbCBub3QgYmUgdmFsaWQgYW55bW9yZSBhZnRlciB0aGUgY2xvc2UoKSBmdW5jdGlvbiBpcworICAgICAgICAgKiBjYWxsZWQuICovCisgICAgICAgIGYtPmZfZnAgPSBOVUxMOworICAgICAgICBpZiAobG9jYWxfY2xvc2UgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgc3RzID0gKCpsb2NhbF9jbG9zZSkobG9jYWxfZnApOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGlmIChzdHMgPT0gRU9GKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICBpZiAoc3RzICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXN0cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RmlsZV9Gcm9tRmlsZShGSUxFICpmcCwgY2hhciAqbmFtZSwgY2hhciAqbW9kZSwgaW50ICgqY2xvc2UpKEZJTEUgKikpCiB7Ci0JUHlGaWxlT2JqZWN0ICpmID0gKFB5RmlsZU9iamVjdCAqKVB5RmlsZV9UeXBlLnRwX25ldygmUHlGaWxlX1R5cGUsCi0JCQkJCQkJICAgICBOVUxMLCBOVUxMKTsKLQlpZiAoZiAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpvX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOwotCQlpZiAob19uYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKGZpbGxfZmlsZV9maWVsZHMoZiwgZnAsIG9fbmFtZSwgbW9kZSwgY2xvc2UpID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmKTsKLQkJCWYgPSBOVUxMOwotCQl9Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG9fbmFtZSk7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKikgZjsKKyAgICBQeUZpbGVPYmplY3QgKmYgPSAoUHlGaWxlT2JqZWN0ICopUHlGaWxlX1R5cGUudHBfbmV3KCZQeUZpbGVfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgIGlmIChmICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKm9fbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7CisgICAgICAgIGlmIChvX25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoZmlsbF9maWxlX2ZpZWxkcyhmLCBmcCwgb19uYW1lLCBtb2RlLCBjbG9zZSkgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGYpOworICAgICAgICAgICAgZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKG9fbmFtZSk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgZjsKIH0KIAogUHlPYmplY3QgKgogUHlGaWxlX0Zyb21TdHJpbmcoY2hhciAqbmFtZSwgY2hhciAqbW9kZSkKIHsKLQlleHRlcm4gaW50IGZjbG9zZShGSUxFICopOwotCVB5RmlsZU9iamVjdCAqZjsKKyAgICBleHRlcm4gaW50IGZjbG9zZShGSUxFICopOworICAgIFB5RmlsZU9iamVjdCAqZjsKIAotCWYgPSAoUHlGaWxlT2JqZWN0ICopUHlGaWxlX0Zyb21GaWxlKChGSUxFICopTlVMTCwgbmFtZSwgbW9kZSwgZmNsb3NlKTsKLQlpZiAoZiAhPSBOVUxMKSB7Ci0JCWlmIChvcGVuX3RoZV9maWxlKGYsIG5hbWUsIG1vZGUpID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmKTsKLQkJCWYgPSBOVUxMOwotCQl9Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilmOworICAgIGYgPSAoUHlGaWxlT2JqZWN0ICopUHlGaWxlX0Zyb21GaWxlKChGSUxFICopTlVMTCwgbmFtZSwgbW9kZSwgZmNsb3NlKTsKKyAgICBpZiAoZiAhPSBOVUxMKSB7CisgICAgICAgIGlmIChvcGVuX3RoZV9maWxlKGYsIG5hbWUsIG1vZGUpID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmKTsKKyAgICAgICAgICAgIGYgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilmOwogfQogCiB2b2lkCiBQeUZpbGVfU2V0QnVmU2l6ZShQeU9iamVjdCAqZiwgaW50IGJ1ZnNpemUpCiB7Ci0JUHlGaWxlT2JqZWN0ICpmaWxlID0gKFB5RmlsZU9iamVjdCAqKWY7Ci0JaWYgKGJ1ZnNpemUgPj0gMCkgewotCQlpbnQgdHlwZTsKLQkJc3dpdGNoIChidWZzaXplKSB7Ci0JCWNhc2UgMDoKLQkJCXR5cGUgPSBfSU9OQkY7Ci0JCQlicmVhazsKKyAgICBQeUZpbGVPYmplY3QgKmZpbGUgPSAoUHlGaWxlT2JqZWN0ICopZjsKKyAgICBpZiAoYnVmc2l6ZSA+PSAwKSB7CisgICAgICAgIGludCB0eXBlOworICAgICAgICBzd2l0Y2ggKGJ1ZnNpemUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgdHlwZSA9IF9JT05CRjsKKyAgICAgICAgICAgIGJyZWFrOwogI2lmZGVmIEhBVkVfU0VUVkJVRgotCQljYXNlIDE6Ci0JCQl0eXBlID0gX0lPTEJGOwotCQkJYnVmc2l6ZSA9IEJVRlNJWjsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB0eXBlID0gX0lPTEJGOworICAgICAgICAgICAgYnVmc2l6ZSA9IEJVRlNJWjsKKyAgICAgICAgICAgIGJyZWFrOwogI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQl0eXBlID0gX0lPRkJGOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdHlwZSA9IF9JT0ZCRjsKICNpZm5kZWYgSEFWRV9TRVRWQlVGCi0JCQlidWZzaXplID0gQlVGU0laOworICAgICAgICAgICAgYnVmc2l6ZSA9IEJVRlNJWjsKICNlbmRpZgotCQkJYnJlYWs7Ci0JCX0KLQkJZmZsdXNoKGZpbGUtPmZfZnApOwotCQlpZiAodHlwZSA9PSBfSU9OQkYpIHsKLQkJCVB5TWVtX0ZyZWUoZmlsZS0+Zl9zZXRidWYpOwotCQkJZmlsZS0+Zl9zZXRidWYgPSBOVUxMOwotCQl9IGVsc2UgewotCQkJZmlsZS0+Zl9zZXRidWYgPSAoY2hhciAqKVB5TWVtX1JlYWxsb2MoZmlsZS0+Zl9zZXRidWYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUpOwotCQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmZmx1c2goZmlsZS0+Zl9mcCk7CisgICAgICAgIGlmICh0eXBlID09IF9JT05CRikgeworICAgICAgICAgICAgUHlNZW1fRnJlZShmaWxlLT5mX3NldGJ1Zik7CisgICAgICAgICAgICBmaWxlLT5mX3NldGJ1ZiA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxlLT5mX3NldGJ1ZiA9IChjaGFyICopUHlNZW1fUmVhbGxvYyhmaWxlLT5mX3NldGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplKTsKKyAgICAgICAgfQogI2lmZGVmIEhBVkVfU0VUVkJVRgotCQlzZXR2YnVmKGZpbGUtPmZfZnAsIGZpbGUtPmZfc2V0YnVmLCB0eXBlLCBidWZzaXplKTsKKyAgICAgICAgc2V0dmJ1ZihmaWxlLT5mX2ZwLCBmaWxlLT5mX3NldGJ1ZiwgdHlwZSwgYnVmc2l6ZSk7CiAjZWxzZSAvKiAhSEFWRV9TRVRWQlVGICovCi0JCXNldGJ1ZihmaWxlLT5mX2ZwLCBmaWxlLT5mX3NldGJ1Zik7CisgICAgICAgIHNldGJ1ZihmaWxlLT5mX2ZwLCBmaWxlLT5mX3NldGJ1Zik7CiAjZW5kaWYgLyogIUhBVkVfU0VUVkJVRiAqLwotCX0KKyAgICB9CiB9CiAKIC8qIFNldCB0aGUgZW5jb2RpbmcgdXNlZCB0byBvdXRwdXQgVW5pY29kZSBzdHJpbmdzLgpAQCAtNTM4LDQ4ICs1MzgsNDggQEAKIGludAogUHlGaWxlX1NldEVuY29kaW5nKFB5T2JqZWN0ICpmLCBjb25zdCBjaGFyICplbmMpCiB7Ci0JcmV0dXJuIFB5RmlsZV9TZXRFbmNvZGluZ0FuZEVycm9ycyhmLCBlbmMsIE5VTEwpOworICAgIHJldHVybiBQeUZpbGVfU2V0RW5jb2RpbmdBbmRFcnJvcnMoZiwgZW5jLCBOVUxMKTsKIH0KIAogaW50CiBQeUZpbGVfU2V0RW5jb2RpbmdBbmRFcnJvcnMoUHlPYmplY3QgKmYsIGNvbnN0IGNoYXIgKmVuYywgY2hhciogZXJyb3JzKQogewotCVB5RmlsZU9iamVjdCAqZmlsZSA9IChQeUZpbGVPYmplY3QqKWY7Ci0JUHlPYmplY3QgKnN0ciwgKm9lcnJvcnM7CisgICAgUHlGaWxlT2JqZWN0ICpmaWxlID0gKFB5RmlsZU9iamVjdCopZjsKKyAgICBQeU9iamVjdCAqc3RyLCAqb2Vycm9yczsKIAotCWFzc2VydChQeUZpbGVfQ2hlY2soZikpOwotCXN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZW5jKTsKLQlpZiAoIXN0cikKLQkJcmV0dXJuIDA7Ci0JaWYgKGVycm9ycykgewotCQlvZXJyb3JzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhlcnJvcnMpOwotCQlpZiAoIW9lcnJvcnMpIHsKLQkJCVB5X0RFQ1JFRihzdHIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgewotCQlvZXJyb3JzID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCX0KLQlQeV9ERUNSRUYoZmlsZS0+Zl9lbmNvZGluZyk7Ci0JZmlsZS0+Zl9lbmNvZGluZyA9IHN0cjsKLQlQeV9ERUNSRUYoZmlsZS0+Zl9lcnJvcnMpOwotCWZpbGUtPmZfZXJyb3JzID0gb2Vycm9yczsKLQlyZXR1cm4gMTsKKyAgICBhc3NlcnQoUHlGaWxlX0NoZWNrKGYpKTsKKyAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGVuYyk7CisgICAgaWYgKCFzdHIpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChlcnJvcnMpIHsKKyAgICAgICAgb2Vycm9ycyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZXJyb3JzKTsKKyAgICAgICAgaWYgKCFvZXJyb3JzKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgb2Vycm9ycyA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGZpbGUtPmZfZW5jb2RpbmcpOworICAgIGZpbGUtPmZfZW5jb2RpbmcgPSBzdHI7CisgICAgUHlfREVDUkVGKGZpbGUtPmZfZXJyb3JzKTsKKyAgICBmaWxlLT5mX2Vycm9ycyA9IG9lcnJvcnM7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBlcnJfY2xvc2VkKHZvaWQpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBlcnJfbW9kZShjaGFyICphY3Rpb24pCiB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JT0Vycm9yLCAiRmlsZSBub3Qgb3BlbiBmb3IgJXMiLCBhY3Rpb24pOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSU9FcnJvciwgIkZpbGUgbm90IG9wZW4gZm9yICVzIiwgYWN0aW9uKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogUmVmdXNlIHJlZ3VsYXIgZmlsZSBJL08gaWYgdGhlcmUncyBkYXRhIGluIHRoZSBpdGVyYXRpb24tYnVmZmVyLgpAQCAtNTg4LDkgKzU4OCw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZXJyX2l0ZXJidWZmZXJlZCh2b2lkKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkiTWl4aW5nIGl0ZXJhdGlvbiBhbmQgcmVhZCBtZXRob2RzIHdvdWxkIGxvc2UgZGF0YSIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAiTWl4aW5nIGl0ZXJhdGlvbiBhbmQgcmVhZCBtZXRob2RzIHdvdWxkIGxvc2UgZGF0YSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBkcm9wX3JlYWRhaGVhZChQeUZpbGVPYmplY3QgKik7CkBAIC02MDAsNTggKzYwMCw1OCBAQAogc3RhdGljIHZvaWQKIGZpbGVfZGVhbGxvYyhQeUZpbGVPYmplY3QgKmYpCiB7Ci0JUHlPYmplY3QgKnJldDsKLQlpZiAoZi0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgZik7Ci0JcmV0ID0gY2xvc2VfdGhlX2ZpbGUoZik7Ci0JaWYgKCFyZXQpIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImNsb3NlIGZhaWxlZCBpbiBmaWxlIG9iamVjdCBkZXN0cnVjdG9yOlxuIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfQotCWVsc2UgewotCQlQeV9ERUNSRUYocmV0KTsKLQl9Ci0JUHlNZW1fRnJlZShmLT5mX3NldGJ1Zik7Ci0JUHlfWERFQ1JFRihmLT5mX25hbWUpOwotCVB5X1hERUNSRUYoZi0+Zl9tb2RlKTsKLQlQeV9YREVDUkVGKGYtPmZfZW5jb2RpbmcpOwotCVB5X1hERUNSRUYoZi0+Zl9lcnJvcnMpOwotCWRyb3BfcmVhZGFoZWFkKGYpOwotCVB5X1RZUEUoZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopZik7CisgICAgUHlPYmplY3QgKnJldDsKKyAgICBpZiAoZi0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgZik7CisgICAgcmV0ID0gY2xvc2VfdGhlX2ZpbGUoZik7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImNsb3NlIGZhaWxlZCBpbiBmaWxlIG9iamVjdCBkZXN0cnVjdG9yOlxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9ERUNSRUYocmV0KTsKKyAgICB9CisgICAgUHlNZW1fRnJlZShmLT5mX3NldGJ1Zik7CisgICAgUHlfWERFQ1JFRihmLT5mX25hbWUpOworICAgIFB5X1hERUNSRUYoZi0+Zl9tb2RlKTsKKyAgICBQeV9YREVDUkVGKGYtPmZfZW5jb2RpbmcpOworICAgIFB5X1hERUNSRUYoZi0+Zl9lcnJvcnMpOworICAgIGRyb3BfcmVhZGFoZWFkKGYpOworICAgIFB5X1RZUEUoZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX3JlcHIoUHlGaWxlT2JqZWN0ICpmKQogewotCWlmIChQeVVuaWNvZGVfQ2hlY2soZi0+Zl9uYW1lKSkgeworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZi0+Zl9uYW1lKSkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JCVB5T2JqZWN0ICpuYW1lID0gUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhmLT5mX25hbWUpOwotCQljb25zdCBjaGFyICpuYW1lX3N0ciA9IG5hbWUgPyBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSA6ICI/IjsKLQkJcmV0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIGZpbGUgdSclcycsIG1vZGUgJyVzJyBhdCAlcD4iLAotCQkJCSAgIGYtPmZfZnAgPT0gTlVMTCA/ICJjbG9zZWQiIDogIm9wZW4iLAotCQkJCSAgIG5hbWVfc3RyLAotCQkJCSAgIFB5U3RyaW5nX0FzU3RyaW5nKGYtPmZfbW9kZSksCi0JCQkJICAgZik7Ci0JCVB5X1hERUNSRUYobmFtZSk7Ci0JCXJldHVybiByZXQ7CisgICAgICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqbmFtZSA9IFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcoZi0+Zl9uYW1lKTsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZV9zdHIgPSBuYW1lID8gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSkgOiAiPyI7CisgICAgICAgIHJldCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBmaWxlIHUnJXMnLCBtb2RlICclcycgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfZnAgPT0gTlVMTCA/ICJjbG9zZWQiIDogIm9wZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhmLT5mX21vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZik7CisgICAgICAgIFB5X1hERUNSRUYobmFtZSk7CisgICAgICAgIHJldHVybiByZXQ7CiAjZW5kaWYKLQl9IGVsc2UgewotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIGZpbGUgJyVzJywgbW9kZSAnJXMnIGF0ICVwPiIsCi0JCQkJICAgZi0+Zl9mcCA9PSBOVUxMID8gImNsb3NlZCIgOiAib3BlbiIsCi0JCQkJICAgUHlTdHJpbmdfQXNTdHJpbmcoZi0+Zl9uYW1lKSwKLQkJCQkgICBQeVN0cmluZ19Bc1N0cmluZyhmLT5mX21vZGUpLAotCQkJCSAgIGYpOwotCX0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIGZpbGUgJyVzJywgbW9kZSAnJXMnIGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2ZwID09IE5VTEwgPyAiY2xvc2VkIiA6ICJvcGVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGYtPmZfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhmLT5mX21vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZik7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9jbG9zZShQeUZpbGVPYmplY3QgKmYpCiB7Ci0JUHlPYmplY3QgKnN0cyA9IGNsb3NlX3RoZV9maWxlKGYpOwotCVB5TWVtX0ZyZWUoZi0+Zl9zZXRidWYpOwotCWYtPmZfc2V0YnVmID0gTlVMTDsKLQlyZXR1cm4gc3RzOworICAgIFB5T2JqZWN0ICpzdHMgPSBjbG9zZV90aGVfZmlsZShmKTsKKyAgICBQeU1lbV9GcmVlKGYtPmZfc2V0YnVmKTsKKyAgICBmLT5mX3NldGJ1ZiA9IE5VTEw7CisgICAgcmV0dXJuIHN0czsKIH0KIAogCkBAIC02NzMsMzYgKzY3MywzNiBAQAogX3BvcnRhYmxlX2ZzZWVrKEZJTEUgKmZwLCBQeV9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpCiB7CiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQlyZXR1cm4gZnNlZWsoZnAsIG9mZnNldCwgd2hlbmNlKTsKKyAgICByZXR1cm4gZnNlZWsoZnAsIG9mZnNldCwgd2hlbmNlKTsKICNlbGlmIGRlZmluZWQoSEFWRV9GU0VFS08pICYmIFNJWkVPRl9PRkZfVCA+PSA4Ci0JcmV0dXJuIGZzZWVrbyhmcCwgb2Zmc2V0LCB3aGVuY2UpOworICAgIHJldHVybiBmc2Vla28oZnAsIG9mZnNldCwgd2hlbmNlKTsKICNlbGlmIGRlZmluZWQoSEFWRV9GU0VFSzY0KQotCXJldHVybiBmc2VlazY0KGZwLCBvZmZzZXQsIHdoZW5jZSk7CisgICAgcmV0dXJuIGZzZWVrNjQoZnAsIG9mZnNldCwgd2hlbmNlKTsKICNlbGlmIGRlZmluZWQoX19CRU9TX18pCi0JcmV0dXJuIF9mc2VlayhmcCwgb2Zmc2V0LCB3aGVuY2UpOworICAgIHJldHVybiBfZnNlZWsoZnAsIG9mZnNldCwgd2hlbmNlKTsKICNlbGlmIFNJWkVPRl9GUE9TX1QgPj0gOAotCS8qIGxhY2tpbmcgYSA2NC1iaXQgY2FwYWJsZSBmc2VlaygpLCB1c2UgYSA2NC1iaXQgY2FwYWJsZSBmc2V0cG9zKCkKLQkgICBhbmQgZmdldHBvcygpIHRvIGltcGxlbWVudCBmc2VlaygpKi8KLQlmcG9zX3QgcG9zOwotCXN3aXRjaCAod2hlbmNlKSB7Ci0JY2FzZSBTRUVLX0VORDoKKyAgICAvKiBsYWNraW5nIGEgNjQtYml0IGNhcGFibGUgZnNlZWsoKSwgdXNlIGEgNjQtYml0IGNhcGFibGUgZnNldHBvcygpCisgICAgICAgYW5kIGZnZXRwb3MoKSB0byBpbXBsZW1lbnQgZnNlZWsoKSovCisgICAgZnBvc190IHBvczsKKyAgICBzd2l0Y2ggKHdoZW5jZSkgeworICAgIGNhc2UgU0VFS19FTkQ6CiAjaWZkZWYgTVNfV0lORE9XUwotCQlmZmx1c2goZnApOwotCQlpZiAoX2xzZWVraTY0KGZpbGVubyhmcCksIDAsIDIpID09IC0xKQotCQkJcmV0dXJuIC0xOworICAgICAgICBmZmx1c2goZnApOworICAgICAgICBpZiAoX2xzZWVraTY0KGZpbGVubyhmcCksIDAsIDIpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogI2Vsc2UKLQkJaWYgKGZzZWVrKGZwLCAwLCBTRUVLX0VORCkgIT0gMCkKLQkJCXJldHVybiAtMTsKKyAgICAgICAgaWYgKGZzZWVrKGZwLCAwLCBTRUVLX0VORCkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKICNlbmRpZgotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIFNFRUtfQ1VSOgotCQlpZiAoZmdldHBvcyhmcCwgJnBvcykgIT0gMCkKLQkJCXJldHVybiAtMTsKLQkJb2Zmc2V0ICs9IHBvczsKLQkJYnJlYWs7Ci0JLyogY2FzZSBTRUVLX1NFVDogYnJlYWs7ICovCi0JfQotCXJldHVybiBmc2V0cG9zKGZwLCAmb2Zmc2V0KTsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBTRUVLX0NVUjoKKyAgICAgICAgaWYgKGZnZXRwb3MoZnAsICZwb3MpICE9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG9mZnNldCArPSBwb3M7CisgICAgICAgIGJyZWFrOworICAgIC8qIGNhc2UgU0VFS19TRVQ6IGJyZWFrOyAqLworICAgIH0KKyAgICByZXR1cm4gZnNldHBvcyhmcCwgJm9mZnNldCk7CiAjZWxzZQogI2Vycm9yICJMYXJnZSBmaWxlIHN1cHBvcnQsIGJ1dCBubyB3YXkgdG8gZnNlZWsuIgogI2VuZGlmCkBAIC03MTYsMTYgKzcxNiwxNiBAQAogX3BvcnRhYmxlX2Z0ZWxsKEZJTEUqIGZwKQogewogI2lmICFkZWZpbmVkKEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQpCi0JcmV0dXJuIGZ0ZWxsKGZwKTsKKyAgICByZXR1cm4gZnRlbGwoZnApOwogI2VsaWYgZGVmaW5lZChIQVZFX0ZURUxMTykgJiYgU0laRU9GX09GRl9UID49IDgKLQlyZXR1cm4gZnRlbGxvKGZwKTsKKyAgICByZXR1cm4gZnRlbGxvKGZwKTsKICNlbGlmIGRlZmluZWQoSEFWRV9GVEVMTDY0KQotCXJldHVybiBmdGVsbDY0KGZwKTsKKyAgICByZXR1cm4gZnRlbGw2NChmcCk7CiAjZWxpZiBTSVpFT0ZfRlBPU19UID49IDgKLQlmcG9zX3QgcG9zOwotCWlmIChmZ2V0cG9zKGZwLCAmcG9zKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIHBvczsKKyAgICBmcG9zX3QgcG9zOworICAgIGlmIChmZ2V0cG9zKGZwLCAmcG9zKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHBvczsKICNlbHNlCiAjZXJyb3IgIkxhcmdlIGZpbGUgc3VwcG9ydCwgYnV0IG5vIHdheSB0byBmdGVsbC4iCiAjZW5kaWYKQEAgLTczNSw1MyArNzM1LDUzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9zZWVrKFB5RmlsZU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHdoZW5jZTsKLQlpbnQgcmV0OwotCVB5X29mZl90IG9mZnNldDsKLQlQeU9iamVjdCAqb2Zmb2JqLCAqb2ZmX2luZGV4OworICAgIGludCB3aGVuY2U7CisgICAgaW50IHJldDsKKyAgICBQeV9vZmZfdCBvZmZzZXQ7CisgICAgUHlPYmplY3QgKm9mZm9iaiwgKm9mZl9pbmRleDsKIAotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JZHJvcF9yZWFkYWhlYWQoZik7Ci0Jd2hlbmNlID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpzZWVrIiwgJm9mZm9iaiwgJndoZW5jZSkpCi0JCXJldHVybiBOVUxMOwotCW9mZl9pbmRleCA9IFB5TnVtYmVyX0luZGV4KG9mZm9iaik7Ci0JaWYgKCFvZmZfaW5kZXgpIHsKLQkJaWYgKCFQeUZsb2F0X0NoZWNrKG9mZm9iaikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJLyogRGVwcmVjYXRlZCBpbiAyLjYgKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkJICJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQiLAotCQkJCSAxKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJb2ZmX2luZGV4ID0gb2Zmb2JqOwotCQlQeV9JTkNSRUYob2Zmb2JqKTsKLQl9CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBkcm9wX3JlYWRhaGVhZChmKTsKKyAgICB3aGVuY2UgPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnNlZWsiLCAmb2Zmb2JqLCAmd2hlbmNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb2ZmX2luZGV4ID0gUHlOdW1iZXJfSW5kZXgob2Zmb2JqKTsKKyAgICBpZiAoIW9mZl9pbmRleCkgeworICAgICAgICBpZiAoIVB5RmxvYXRfQ2hlY2sob2Zmb2JqKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAvKiBEZXByZWNhdGVkIGluIDIuNiAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IGZsb2F0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAxKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgb2ZmX2luZGV4ID0gb2Zmb2JqOworICAgICAgICBQeV9JTkNSRUYob2Zmb2JqKTsKKyAgICB9CiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQlvZmZzZXQgPSBQeUludF9Bc0xvbmcob2ZmX2luZGV4KTsKKyAgICBvZmZzZXQgPSBQeUludF9Bc0xvbmcob2ZmX2luZGV4KTsKICNlbHNlCi0Jb2Zmc2V0ID0gUHlMb25nX0NoZWNrKG9mZl9pbmRleCkgPwotCQlQeUxvbmdfQXNMb25nTG9uZyhvZmZfaW5kZXgpIDogUHlJbnRfQXNMb25nKG9mZl9pbmRleCk7CisgICAgb2Zmc2V0ID0gUHlMb25nX0NoZWNrKG9mZl9pbmRleCkgPworICAgICAgICBQeUxvbmdfQXNMb25nTG9uZyhvZmZfaW5kZXgpIDogUHlJbnRfQXNMb25nKG9mZl9pbmRleCk7CiAjZW5kaWYKLQlQeV9ERUNSRUYob2ZmX2luZGV4KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKG9mZl9pbmRleCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCWVycm5vID0gMDsKLQlyZXQgPSBfcG9ydGFibGVfZnNlZWsoZi0+Zl9mcCwgb2Zmc2V0LCB3aGVuY2UpOwotCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICBlcnJubyA9IDA7CisgICAgcmV0ID0gX3BvcnRhYmxlX2ZzZWVrKGYtPmZfZnAsIG9mZnNldCwgd2hlbmNlKTsKKyAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCiAKLQlpZiAocmV0ICE9IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWYtPmZfc2tpcG5leHRsZiA9IDA7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZi0+Zl9za2lwbmV4dGxmID0gMDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtNzg5LDE4NiArNzg5LDE4NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfdHJ1bmNhdGUoUHlGaWxlT2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9vZmZfdCBuZXdzaXplOwotCVB5T2JqZWN0ICpuZXdzaXplb2JqID0gTlVMTDsKLQlQeV9vZmZfdCBpbml0aWFscG9zOwotCWludCByZXQ7CisgICAgUHlfb2ZmX3QgbmV3c2l6ZTsKKyAgICBQeU9iamVjdCAqbmV3c2l6ZW9iaiA9IE5VTEw7CisgICAgUHlfb2ZmX3QgaW5pdGlhbHBvczsKKyAgICBpbnQgcmV0OwogCi0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlpZiAoIWYtPndyaXRhYmxlKQotCQlyZXR1cm4gZXJyX21vZGUoIndyaXRpbmciKTsKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0cnVuY2F0ZSIsIDAsIDEsICZuZXdzaXplb2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBpZiAoIWYtPndyaXRhYmxlKQorICAgICAgICByZXR1cm4gZXJyX21vZGUoIndyaXRpbmciKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0cnVuY2F0ZSIsIDAsIDEsICZuZXdzaXplb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBHZXQgY3VycmVudCBmaWxlIHBvc2l0aW9uLiAgSWYgdGhlIGZpbGUgaGFwcGVucyB0byBiZSBvcGVuIGZvcgotCSAqIHVwZGF0ZSBhbmQgdGhlIGxhc3Qgb3BlcmF0aW9uIHdhcyBhbiBpbnB1dCBvcGVyYXRpb24sIEMgZG9lc24ndAotCSAqIGRlZmluZSB3aGF0IHRoZSBsYXRlciBmZmx1c2goKSB3aWxsIGRvLCBidXQgd2UgcHJvbWlzZSB0cnVuY2F0ZSgpCi0JICogd29uJ3QgY2hhbmdlIHRoZSBjdXJyZW50IHBvc2l0aW9uIChhbmQgZmZsdXNoKCkgKmRvZXMqIGNoYW5nZSBpdAotCSAqIHRoZW4gYXQgbGVhc3Qgb24gV2luZG93cykuICBUaGUgZWFzaWVzdCB0aGluZyBpcyB0byBjYXB0dXJlCi0JICogY3VycmVudCBwb3Mgbm93IGFuZCBzZWVrIGJhY2sgdG8gaXQgYXQgdGhlIGVuZC4KLQkgKi8KLQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQllcnJubyA9IDA7Ci0JaW5pdGlhbHBvcyA9IF9wb3J0YWJsZV9mdGVsbChmLT5mX2ZwKTsKLQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JaWYgKGluaXRpYWxwb3MgPT0gLTEpCi0JCWdvdG8gb25pb2Vycm9yOworICAgIC8qIEdldCBjdXJyZW50IGZpbGUgcG9zaXRpb24uICBJZiB0aGUgZmlsZSBoYXBwZW5zIHRvIGJlIG9wZW4gZm9yCisgICAgICogdXBkYXRlIGFuZCB0aGUgbGFzdCBvcGVyYXRpb24gd2FzIGFuIGlucHV0IG9wZXJhdGlvbiwgQyBkb2Vzbid0CisgICAgICogZGVmaW5lIHdoYXQgdGhlIGxhdGVyIGZmbHVzaCgpIHdpbGwgZG8sIGJ1dCB3ZSBwcm9taXNlIHRydW5jYXRlKCkKKyAgICAgKiB3b24ndCBjaGFuZ2UgdGhlIGN1cnJlbnQgcG9zaXRpb24gKGFuZCBmZmx1c2goKSAqZG9lcyogY2hhbmdlIGl0CisgICAgICogdGhlbiBhdCBsZWFzdCBvbiBXaW5kb3dzKS4gIFRoZSBlYXNpZXN0IHRoaW5nIGlzIHRvIGNhcHR1cmUKKyAgICAgKiBjdXJyZW50IHBvcyBub3cgYW5kIHNlZWsgYmFjayB0byBpdCBhdCB0aGUgZW5kLgorICAgICAqLworICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgIGVycm5vID0gMDsKKyAgICBpbml0aWFscG9zID0gX3BvcnRhYmxlX2Z0ZWxsKGYtPmZfZnApOworICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICBpZiAoaW5pdGlhbHBvcyA9PSAtMSkKKyAgICAgICAgZ290byBvbmlvZXJyb3I7CiAKLQkvKiBTZXQgbmV3c2l6ZSB0byBjdXJyZW50IHBvc3Rpb24gaWYgbmV3c2l6ZW9iaiBOVUxMLCBlbHNlIHRvIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlpZiAobmV3c2l6ZW9iaiAhPSBOVUxMKSB7CisgICAgLyogU2V0IG5ld3NpemUgdG8gY3VycmVudCBwb3N0aW9uIGlmIG5ld3NpemVvYmogTlVMTCwgZWxzZSB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgdmFsdWUuCisgICAgICovCisgICAgaWYgKG5ld3NpemVvYmogIT0gTlVMTCkgewogI2lmICFkZWZpbmVkKEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQpCi0JCW5ld3NpemUgPSBQeUludF9Bc0xvbmcobmV3c2l6ZW9iaik7CisgICAgICAgIG5ld3NpemUgPSBQeUludF9Bc0xvbmcobmV3c2l6ZW9iaik7CiAjZWxzZQotCQluZXdzaXplID0gUHlMb25nX0NoZWNrKG5ld3NpemVvYmopID8KLQkJCQlQeUxvbmdfQXNMb25nTG9uZyhuZXdzaXplb2JqKSA6Ci0JCQkJUHlJbnRfQXNMb25nKG5ld3NpemVvYmopOworICAgICAgICBuZXdzaXplID0gUHlMb25nX0NoZWNrKG5ld3NpemVvYmopID8KKyAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Bc0xvbmdMb25nKG5ld3NpemVvYmopIDoKKyAgICAgICAgICAgICAgICBQeUludF9Bc0xvbmcobmV3c2l6ZW9iaik7CiAjZW5kaWYKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSAvKiBkZWZhdWx0IHRvIGN1cnJlbnQgcG9zaXRpb24gKi8KLQkJbmV3c2l6ZSA9IGluaXRpYWxwb3M7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgLyogZGVmYXVsdCB0byBjdXJyZW50IHBvc2l0aW9uICovCisgICAgICAgIG5ld3NpemUgPSBpbml0aWFscG9zOwogCi0JLyogRmx1c2ggdGhlIHN0cmVhbS4gIFdlJ3JlIG1peGluZyBzdHJlYW0tbGV2ZWwgSS9PIHdpdGggbG93ZXItbGV2ZWwKLQkgKiBJL08sIGFuZCBhIGZsdXNoIG1heSBiZSBuZWNlc3NhcnkgdG8gc3luY2ggYm90aCBwbGF0Zm9ybSB2aWV3cwotCSAqIG9mIHRoZSBjdXJyZW50IGZpbGUgc3RhdGUuCi0JICovCi0JRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JZXJybm8gPSAwOwotCXJldCA9IGZmbHVzaChmLT5mX2ZwKTsKLQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JaWYgKHJldCAhPSAwKQotCQlnb3RvIG9uaW9lcnJvcjsKKyAgICAvKiBGbHVzaCB0aGUgc3RyZWFtLiAgV2UncmUgbWl4aW5nIHN0cmVhbS1sZXZlbCBJL08gd2l0aCBsb3dlci1sZXZlbAorICAgICAqIEkvTywgYW5kIGEgZmx1c2ggbWF5IGJlIG5lY2Vzc2FyeSB0byBzeW5jaCBib3RoIHBsYXRmb3JtIHZpZXdzCisgICAgICogb2YgdGhlIGN1cnJlbnQgZmlsZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICBlcnJubyA9IDA7CisgICAgcmV0ID0gZmZsdXNoKGYtPmZfZnApOworICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICBpZiAocmV0ICE9IDApCisgICAgICAgIGdvdG8gb25pb2Vycm9yOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCS8qIE1TIF9jaHNpemUgZG9lc24ndCB3b3JrIGlmIG5ld3NpemUgZG9lc24ndCBmaXQgaW4gMzIgYml0cywKLQkgICBzbyBkb24ndCBldmVuIHRyeSB1c2luZyBpdC4gKi8KLQl7Ci0JCUhBTkRMRSBoRmlsZTsKKyAgICAvKiBNUyBfY2hzaXplIGRvZXNuJ3Qgd29yayBpZiBuZXdzaXplIGRvZXNuJ3QgZml0IGluIDMyIGJpdHMsCisgICAgICAgc28gZG9uJ3QgZXZlbiB0cnkgdXNpbmcgaXQuICovCisgICAgeworICAgICAgICBIQU5ETEUgaEZpbGU7CiAKLQkJLyogSGF2ZSB0byBtb3ZlIGN1cnJlbnQgcG9zIHRvIGRlc2lyZWQgZW5kcG9pbnQgb24gV2luZG93cy4gKi8KLQkJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JCWVycm5vID0gMDsKLQkJcmV0ID0gX3BvcnRhYmxlX2ZzZWVrKGYtPmZfZnAsIG5ld3NpemUsIFNFRUtfU0VUKSAhPSAwOwotCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JCWlmIChyZXQpCi0JCQlnb3RvIG9uaW9lcnJvcjsKKyAgICAgICAgLyogSGF2ZSB0byBtb3ZlIGN1cnJlbnQgcG9zIHRvIGRlc2lyZWQgZW5kcG9pbnQgb24gV2luZG93cy4gKi8KKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgcmV0ID0gX3BvcnRhYmxlX2ZzZWVrKGYtPmZfZnAsIG5ld3NpemUsIFNFRUtfU0VUKSAhPSAwOworICAgICAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICBnb3RvIG9uaW9lcnJvcjsKIAotCQkvKiBUcnVuY2F0ZS4gIE5vdGUgdGhhdCB0aGlzIG1heSBncm93IHRoZSBmaWxlISAqLwotCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQkJZXJybm8gPSAwOwotCQloRmlsZSA9IChIQU5ETEUpX2dldF9vc2ZoYW5kbGUoZmlsZW5vKGYtPmZfZnApKTsKLQkJcmV0ID0gaEZpbGUgPT0gKEhBTkRMRSktMTsKLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlyZXQgPSBTZXRFbmRPZkZpbGUoaEZpbGUpID09IDA7Ci0JCQlpZiAocmV0KQotCQkJCWVycm5vID0gRUFDQ0VTOwotCQl9Ci0JCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQkJaWYgKHJldCkKLQkJCWdvdG8gb25pb2Vycm9yOwotCX0KKyAgICAgICAgLyogVHJ1bmNhdGUuICBOb3RlIHRoYXQgdGhpcyBtYXkgZ3JvdyB0aGUgZmlsZSEgKi8KKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgaEZpbGUgPSAoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZpbGVubyhmLT5mX2ZwKSk7CisgICAgICAgIHJldCA9IGhGaWxlID09IChIQU5ETEUpLTE7CisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgcmV0ID0gU2V0RW5kT2ZGaWxlKGhGaWxlKSA9PSAwOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVBQ0NFUzsKKyAgICAgICAgfQorICAgICAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICBnb3RvIG9uaW9lcnJvcjsKKyAgICB9CiAjZWxzZQotCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCWVycm5vID0gMDsKLQlyZXQgPSBmdHJ1bmNhdGUoZmlsZW5vKGYtPmZfZnApLCBuZXdzaXplKTsKLQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JaWYgKHJldCAhPSAwKQotCQlnb3RvIG9uaW9lcnJvcjsKKyAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICBlcnJubyA9IDA7CisgICAgcmV0ID0gZnRydW5jYXRlKGZpbGVubyhmLT5mX2ZwKSwgbmV3c2l6ZSk7CisgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgZ290byBvbmlvZXJyb3I7CiAjZW5kaWYgLyogIU1TX1dJTkRPV1MgKi8KIAotCS8qIFJlc3RvcmUgb3JpZ2luYWwgZmlsZSBwb3NpdGlvbi4gKi8KLQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQllcnJubyA9IDA7Ci0JcmV0ID0gX3BvcnRhYmxlX2ZzZWVrKGYtPmZfZnAsIGluaXRpYWxwb3MsIFNFRUtfU0VUKSAhPSAwOwotCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQlpZiAocmV0KQotCQlnb3RvIG9uaW9lcnJvcjsKKyAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb24uICovCisgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgZXJybm8gPSAwOworICAgIHJldCA9IF9wb3J0YWJsZV9mc2VlayhmLT5mX2ZwLCBpbml0aWFscG9zLCBTRUVLX1NFVCkgIT0gMDsKKyAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgaWYgKHJldCkKKyAgICAgICAgZ290byBvbmlvZXJyb3I7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogCiBvbmlvZXJyb3I6Ci0JUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCWNsZWFyZXJyKGYtPmZfZnApOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KICNlbmRpZiAvKiBIQVZFX0ZUUlVOQ0FURSAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV90ZWxsKFB5RmlsZU9iamVjdCAqZikKIHsKLQlQeV9vZmZfdCBwb3M7CisgICAgUHlfb2ZmX3QgcG9zOwogCi0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQllcnJubyA9IDA7Ci0JcG9zID0gX3BvcnRhYmxlX2Z0ZWxsKGYtPmZfZnApOwotCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgIGVycm5vID0gMDsKKyAgICBwb3MgPSBfcG9ydGFibGVfZnRlbGwoZi0+Zl9mcCk7CisgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQogCi0JaWYgKHBvcyA9PSAtMSkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCWNsZWFyZXJyKGYtPmZfZnApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGYtPmZfc2tpcG5leHRsZikgewotCQlpbnQgYzsKLQkJYyA9IEdFVEMoZi0+Zl9mcCk7Ci0JCWlmIChjID09ICdcbicpIHsKLQkJCWYtPmZfbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1JMRjsKLQkJCXBvcysrOwotCQkJZi0+Zl9za2lwbmV4dGxmID0gMDsKLQkJfSBlbHNlIGlmIChjICE9IEVPRikgdW5nZXRjKGMsIGYtPmZfZnApOwotCX0KKyAgICBpZiAocG9zID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZi0+Zl9za2lwbmV4dGxmKSB7CisgICAgICAgIGludCBjOworICAgICAgICBjID0gR0VUQyhmLT5mX2ZwKTsKKyAgICAgICAgaWYgKGMgPT0gJ1xuJykgeworICAgICAgICAgICAgZi0+Zl9uZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOworICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICBmLT5mX3NraXBuZXh0bGYgPSAwOworICAgICAgICB9IGVsc2UgaWYgKGMgIT0gRU9GKSB1bmdldGMoYywgZi0+Zl9mcCk7CisgICAgfQogI2lmICFkZWZpbmVkKEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQpCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHBvcyk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHBvcyk7CiAjZWxzZQotCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHBvcyk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcocG9zKTsKICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9maWxlbm8oUHlGaWxlT2JqZWN0ICpmKQogewotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmaWxlbm8oZi0+Zl9mcCkpOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmaWxlbm8oZi0+Zl9mcCkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9mbHVzaChQeUZpbGVPYmplY3QgKmYpCiB7Ci0JaW50IHJlczsKKyAgICBpbnQgcmVzOwogCi0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQllcnJubyA9IDA7Ci0JcmVzID0gZmZsdXNoKGYtPmZfZnApOwotCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQlpZiAocmVzICE9IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgIGVycm5vID0gMDsKKyAgICByZXMgPSBmZmx1c2goZi0+Zl9mcCk7CisgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9pc2F0dHkoUHlGaWxlT2JqZWN0ICpmKQogewotCWxvbmcgcmVzOwotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JcmVzID0gaXNhdHR5KChpbnQpZmlsZW5vKGYtPmZfZnApKTsKLQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXMpOworICAgIGxvbmcgcmVzOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgcmVzID0gaXNhdHR5KChpbnQpZmlsZW5vKGYtPmZfZnApKTsKKyAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXMpOwogfQogCiAKQEAgLTk4OCwzOSArOTg4LDM5IEBACiBuZXdfYnVmZmVyc2l6ZShQeUZpbGVPYmplY3QgKmYsIHNpemVfdCBjdXJyZW50c2l6ZSkKIHsKICNpZmRlZiBIQVZFX0ZTVEFUCi0Jb2ZmX3QgcG9zLCBlbmQ7Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0JaWYgKGZzdGF0KGZpbGVubyhmLT5mX2ZwKSwgJnN0KSA9PSAwKSB7Ci0JCWVuZCA9IHN0LnN0X3NpemU7Ci0JCS8qIFRoZSBmb2xsb3dpbmcgaXMgbm90IGEgYnVnOiB3ZSByZWFsbHkgbmVlZCB0byBjYWxsIGxzZWVrKCkKLQkJICAgKmFuZCogZnRlbGwoKS4gIFRoZSByZWFzb24gaXMgdGhhdCBzb21lIHN0ZGlvIGxpYnJhcmllcwotCQkgICBtaXN0YWtlbmx5IGZsdXNoIHRoZWlyIGJ1ZmZlciB3aGVuIGZ0ZWxsKCkgaXMgY2FsbGVkIGFuZAotCQkgICB0aGUgbHNlZWsoKSBjYWxsIGl0IG1ha2VzIGZhaWxzLCB0aGVyZWJ5IHRocm93aW5nIGF3YXkKLQkJICAgZGF0YSB0aGF0IGNhbm5vdCBiZSByZWNvdmVyZWQgaW4gYW55IHdheS4gIFRvIGF2b2lkIHRoaXMsCi0JCSAgIHdlIGZpcnN0IHRlc3QgbHNlZWsoKSwgYW5kIG9ubHkgY2FsbCBmdGVsbCgpIGlmIGxzZWVrKCkKLQkJICAgd29ya3MuICBXZSBjYW4ndCB1c2UgdGhlIGxzZWVrKCkgdmFsdWUgZWl0aGVyLCBiZWNhdXNlIHdlCi0JCSAgIG5lZWQgdG8gdGFrZSB0aGUgYW1vdW50IG9mIGJ1ZmZlcmVkIGRhdGEgaW50byBhY2NvdW50LgotCQkgICAoWWV0IGFub3RoZXIgcmVhc29uIHdoeSBzdGRpbyBzdGlua3MuIDotKSAqLwotCQlwb3MgPSBsc2VlayhmaWxlbm8oZi0+Zl9mcCksIDBMLCBTRUVLX0NVUik7Ci0JCWlmIChwb3MgPj0gMCkgewotCQkJcG9zID0gZnRlbGwoZi0+Zl9mcCk7Ci0JCX0KLQkJaWYgKHBvcyA8IDApCi0JCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJaWYgKGVuZCA+IHBvcyAmJiBwb3MgPj0gMCkKLQkJCXJldHVybiBjdXJyZW50c2l6ZSArIGVuZCAtIHBvcyArIDE7Ci0JCS8qIEFkZCAxIHNvIGlmIHRoZSBmaWxlIHdlcmUgdG8gZ3JvdyB3ZSdkIG5vdGljZS4gKi8KLQl9CisgICAgb2ZmX3QgcG9zLCBlbmQ7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgaWYgKGZzdGF0KGZpbGVubyhmLT5mX2ZwKSwgJnN0KSA9PSAwKSB7CisgICAgICAgIGVuZCA9IHN0LnN0X3NpemU7CisgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgbm90IGEgYnVnOiB3ZSByZWFsbHkgbmVlZCB0byBjYWxsIGxzZWVrKCkKKyAgICAgICAgICAgKmFuZCogZnRlbGwoKS4gIFRoZSByZWFzb24gaXMgdGhhdCBzb21lIHN0ZGlvIGxpYnJhcmllcworICAgICAgICAgICBtaXN0YWtlbmx5IGZsdXNoIHRoZWlyIGJ1ZmZlciB3aGVuIGZ0ZWxsKCkgaXMgY2FsbGVkIGFuZAorICAgICAgICAgICB0aGUgbHNlZWsoKSBjYWxsIGl0IG1ha2VzIGZhaWxzLCB0aGVyZWJ5IHRocm93aW5nIGF3YXkKKyAgICAgICAgICAgZGF0YSB0aGF0IGNhbm5vdCBiZSByZWNvdmVyZWQgaW4gYW55IHdheS4gIFRvIGF2b2lkIHRoaXMsCisgICAgICAgICAgIHdlIGZpcnN0IHRlc3QgbHNlZWsoKSwgYW5kIG9ubHkgY2FsbCBmdGVsbCgpIGlmIGxzZWVrKCkKKyAgICAgICAgICAgd29ya3MuICBXZSBjYW4ndCB1c2UgdGhlIGxzZWVrKCkgdmFsdWUgZWl0aGVyLCBiZWNhdXNlIHdlCisgICAgICAgICAgIG5lZWQgdG8gdGFrZSB0aGUgYW1vdW50IG9mIGJ1ZmZlcmVkIGRhdGEgaW50byBhY2NvdW50LgorICAgICAgICAgICAoWWV0IGFub3RoZXIgcmVhc29uIHdoeSBzdGRpbyBzdGlua3MuIDotKSAqLworICAgICAgICBwb3MgPSBsc2VlayhmaWxlbm8oZi0+Zl9mcCksIDBMLCBTRUVLX0NVUik7CisgICAgICAgIGlmIChwb3MgPj0gMCkgeworICAgICAgICAgICAgcG9zID0gZnRlbGwoZi0+Zl9mcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBvcyA8IDApCisgICAgICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgaWYgKGVuZCA+IHBvcyAmJiBwb3MgPj0gMCkKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50c2l6ZSArIGVuZCAtIHBvcyArIDE7CisgICAgICAgIC8qIEFkZCAxIHNvIGlmIHRoZSBmaWxlIHdlcmUgdG8gZ3JvdyB3ZSdkIG5vdGljZS4gKi8KKyAgICB9CiAjZW5kaWYKLQlpZiAoY3VycmVudHNpemUgPiBTTUFMTENIVU5LKSB7Ci0JCS8qIEtlZXAgZG91YmxpbmcgdW50aWwgd2UgcmVhY2ggQklHQ0hVTks7Ci0JCSAgIHRoZW4ga2VlcCBhZGRpbmcgQklHQ0hVTksuICovCi0JCWlmIChjdXJyZW50c2l6ZSA8PSBCSUdDSFVOSykKLQkJCXJldHVybiBjdXJyZW50c2l6ZSArIGN1cnJlbnRzaXplOwotCQllbHNlCi0JCQlyZXR1cm4gY3VycmVudHNpemUgKyBCSUdDSFVOSzsKLQl9Ci0JcmV0dXJuIGN1cnJlbnRzaXplICsgU01BTExDSFVOSzsKKyAgICBpZiAoY3VycmVudHNpemUgPiBTTUFMTENIVU5LKSB7CisgICAgICAgIC8qIEtlZXAgZG91YmxpbmcgdW50aWwgd2UgcmVhY2ggQklHQ0hVTks7CisgICAgICAgICAgIHRoZW4ga2VlcCBhZGRpbmcgQklHQ0hVTksuICovCisgICAgICAgIGlmIChjdXJyZW50c2l6ZSA8PSBCSUdDSFVOSykKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50c2l6ZSArIGN1cnJlbnRzaXplOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY3VycmVudHNpemUgKyBCSUdDSFVOSzsKKyAgICB9CisgICAgcmV0dXJuIGN1cnJlbnRzaXplICsgU01BTExDSFVOSzsKIH0KIAogI2lmIGRlZmluZWQoRVdPVUxEQkxPQ0spICYmIGRlZmluZWQoRUFHQUlOKSAmJiBFV09VTERCTE9DSyAhPSBFQUdBSU4KQEAgLTEwNDAsMTE0ICsxMDQwLDExNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfcmVhZChQeUZpbGVPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYnl0ZXNyZXF1ZXN0ZWQgPSAtMTsKLQlzaXplX3QgYnl0ZXNyZWFkLCBidWZmZXJzaXplLCBjaHVua3NpemU7Ci0JUHlPYmplY3QgKnY7CisgICAgbG9uZyBieXRlc3JlcXVlc3RlZCA9IC0xOworICAgIHNpemVfdCBieXRlc3JlYWQsIGJ1ZmZlcnNpemUsIGNodW5rc2l6ZTsKKyAgICBQeU9iamVjdCAqdjsKIAotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JaWYgKCFmLT5yZWFkYWJsZSkKLQkJcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7Ci0JLyogcmVmdXNlIHRvIG1peCB3aXRoIGYubmV4dCgpICovCi0JaWYgKGYtPmZfYnVmICE9IE5VTEwgJiYKLQkgICAgKGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHIpID4gMCAmJgotCSAgICBmLT5mX2J1ZlswXSAhPSAnXDAnKQotCQlyZXR1cm4gZXJyX2l0ZXJidWZmZXJlZCgpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZCIsICZieXRlc3JlcXVlc3RlZCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChieXRlc3JlcXVlc3RlZCA8IDApCi0JCWJ1ZmZlcnNpemUgPSBuZXdfYnVmZmVyc2l6ZShmLCAoc2l6ZV90KTApOwotCWVsc2UKLQkJYnVmZmVyc2l6ZSA9IGJ5dGVzcmVxdWVzdGVkOwotCWlmIChidWZmZXJzaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JInJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMgaXMgbW9yZSB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgYnVmZmVyc2l6ZSk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYnl0ZXNyZWFkID0gMDsKLQlmb3IgKDs7KSB7Ci0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCQllcnJubyA9IDA7Ci0JCWNodW5rc2l6ZSA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZChCVUYodikgKyBieXRlc3JlYWQsCi0JCQkgIGJ1ZmZlcnNpemUgLSBieXRlc3JlYWQsIGYtPmZfZnAsIChQeU9iamVjdCAqKWYpOwotCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JCWlmIChjaHVua3NpemUgPT0gMCkgewotCQkJaWYgKCFmZXJyb3IoZi0+Zl9mcCkpCi0JCQkJYnJlYWs7Ci0JCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJCS8qIFdoZW4gaW4gbm9uLWJsb2NraW5nIG1vZGUsIGRhdGEgc2hvdWxkbid0Ci0JCQkgKiBiZSBkaXNjYXJkZWQgaWYgYSBibG9ja2luZyBzaWduYWwgd2FzCi0JCQkgKiByZWNlaXZlZC4gVGhhdCB3aWxsIGFsc28gaGFwcGVuIGlmCi0JCQkgKiBjaHVua3NpemUgIT0gMCwgYnV0IGJ5dGVzcmVhZCA8IGJ1ZmZlcnNpemUuICovCi0JCQlpZiAoYnl0ZXNyZWFkID4gMCAmJiBCTE9DS0VEX0VSUk5PKGVycm5vKSkKLQkJCQlicmVhazsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWJ5dGVzcmVhZCArPSBjaHVua3NpemU7Ci0JCWlmIChieXRlc3JlYWQgPCBidWZmZXJzaXplKSB7Ci0JCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChieXRlc3JlcXVlc3RlZCA8IDApIHsKLQkJCWJ1ZmZlcnNpemUgPSBuZXdfYnVmZmVyc2l6ZShmLCBidWZmZXJzaXplKTsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZ2LCBidWZmZXJzaXplKSA8IDApCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBHb3Qgd2hhdCB3YXMgcmVxdWVzdGVkLiAqLwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGJ5dGVzcmVhZCAhPSBidWZmZXJzaXplICYmIF9QeVN0cmluZ19SZXNpemUoJnYsIGJ5dGVzcmVhZCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiB2OworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgaWYgKCFmLT5yZWFkYWJsZSkKKyAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7CisgICAgLyogcmVmdXNlIHRvIG1peCB3aXRoIGYubmV4dCgpICovCisgICAgaWYgKGYtPmZfYnVmICE9IE5VTEwgJiYKKyAgICAgICAgKGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHIpID4gMCAmJgorICAgICAgICBmLT5mX2J1ZlswXSAhPSAnXDAnKQorICAgICAgICByZXR1cm4gZXJyX2l0ZXJidWZmZXJlZCgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZCIsICZieXRlc3JlcXVlc3RlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChieXRlc3JlcXVlc3RlZCA8IDApCisgICAgICAgIGJ1ZmZlcnNpemUgPSBuZXdfYnVmZmVyc2l6ZShmLCAoc2l6ZV90KTApOworICAgIGVsc2UKKyAgICAgICAgYnVmZmVyc2l6ZSA9IGJ5dGVzcmVxdWVzdGVkOworICAgIGlmIChidWZmZXJzaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgInJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMgaXMgbW9yZSB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgYnVmZmVyc2l6ZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnl0ZXNyZWFkID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGNodW5rc2l6ZSA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZChCVUYodikgKyBieXRlc3JlYWQsCisgICAgICAgICAgICAgICAgICBidWZmZXJzaXplIC0gYnl0ZXNyZWFkLCBmLT5mX2ZwLCAoUHlPYmplY3QgKilmKTsKKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBpZiAoY2h1bmtzaXplID09IDApIHsKKyAgICAgICAgICAgIGlmICghZmVycm9yKGYtPmZfZnApKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgICAgICAgICAvKiBXaGVuIGluIG5vbi1ibG9ja2luZyBtb2RlLCBkYXRhIHNob3VsZG4ndAorICAgICAgICAgICAgICogYmUgZGlzY2FyZGVkIGlmIGEgYmxvY2tpbmcgc2lnbmFsIHdhcworICAgICAgICAgICAgICogcmVjZWl2ZWQuIFRoYXQgd2lsbCBhbHNvIGhhcHBlbiBpZgorICAgICAgICAgICAgICogY2h1bmtzaXplICE9IDAsIGJ1dCBieXRlc3JlYWQgPCBidWZmZXJzaXplLiAqLworICAgICAgICAgICAgaWYgKGJ5dGVzcmVhZCA+IDAgJiYgQkxPQ0tFRF9FUlJOTyhlcnJubykpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBieXRlc3JlYWQgKz0gY2h1bmtzaXplOworICAgICAgICBpZiAoYnl0ZXNyZWFkIDwgYnVmZmVyc2l6ZSkgeworICAgICAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXNyZXF1ZXN0ZWQgPCAwKSB7CisgICAgICAgICAgICBidWZmZXJzaXplID0gbmV3X2J1ZmZlcnNpemUoZiwgYnVmZmVyc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgYnVmZmVyc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogR290IHdoYXQgd2FzIHJlcXVlc3RlZC4gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChieXRlc3JlYWQgIT0gYnVmZmVyc2l6ZSAmJiBfUHlTdHJpbmdfUmVzaXplKCZ2LCBieXRlc3JlYWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfcmVhZGludG8oUHlGaWxlT2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwdHI7Ci0JUHlfc3NpemVfdCBudG9kbzsKLQlQeV9zc2l6ZV90IG5kb25lLCBubm93OwotCVB5X2J1ZmZlciBwYnVmOworICAgIGNoYXIgKnB0cjsKKyAgICBQeV9zc2l6ZV90IG50b2RvOworICAgIFB5X3NzaXplX3QgbmRvbmUsIG5ub3c7CisgICAgUHlfYnVmZmVyIHBidWY7CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCWlmICghZi0+cmVhZGFibGUpCi0JCXJldHVybiBlcnJfbW9kZSgicmVhZGluZyIpOwotCS8qIHJlZnVzZSB0byBtaXggd2l0aCBmLm5leHQoKSAqLwotCWlmIChmLT5mX2J1ZiAhPSBOVUxMICYmCi0JICAgIChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+IDAgJiYKLQkgICAgZi0+Zl9idWZbMF0gIT0gJ1wwJykKLQkJcmV0dXJuIGVycl9pdGVyYnVmZmVyZWQoKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIncqIiwgJnBidWYpKQotCQlyZXR1cm4gTlVMTDsKLQlwdHIgPSBwYnVmLmJ1ZjsKLQludG9kbyA9IHBidWYubGVuOwotCW5kb25lID0gMDsKLQl3aGlsZSAobnRvZG8gPiAwKSB7Ci0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCQllcnJubyA9IDA7Ci0JCW5ub3cgPSBQeV9Vbml2ZXJzYWxOZXdsaW5lRnJlYWQocHRyK25kb25lLCBudG9kbywgZi0+Zl9mcCwKLQkJCQkJCShQeU9iamVjdCAqKWYpOwotCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JCWlmIChubm93ID09IDApIHsKLQkJCWlmICghZmVycm9yKGYtPmZfZnApKQotCQkJCWJyZWFrOwotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJY2xlYXJlcnIoZi0+Zl9mcCk7Ci0JCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW5kb25lICs9IG5ub3c7Ci0JCW50b2RvIC09IG5ub3c7Ci0JfQotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChuZG9uZSk7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBpZiAoIWYtPnJlYWRhYmxlKQorICAgICAgICByZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKKyAgICAvKiByZWZ1c2UgdG8gbWl4IHdpdGggZi5uZXh0KCkgKi8KKyAgICBpZiAoZi0+Zl9idWYgIT0gTlVMTCAmJgorICAgICAgICAoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPiAwICYmCisgICAgICAgIGYtPmZfYnVmWzBdICE9ICdcMCcpCisgICAgICAgIHJldHVybiBlcnJfaXRlcmJ1ZmZlcmVkKCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ3KiIsICZwYnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHRyID0gcGJ1Zi5idWY7CisgICAgbnRvZG8gPSBwYnVmLmxlbjsKKyAgICBuZG9uZSA9IDA7CisgICAgd2hpbGUgKG50b2RvID4gMCkgeworICAgICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBubm93ID0gUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKHB0cituZG9uZSwgbnRvZG8sIGYtPmZfZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopZik7CisgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgaWYgKG5ub3cgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFmZXJyb3IoZi0+Zl9mcCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbmRvbmUgKz0gbm5vdzsKKyAgICAgICAgbnRvZG8gLT0gbm5vdzsKKyAgICB9CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KG5kb25lKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTY5LDkgKzExNjksOSBAQAogCiBSZXBvcnRzIGZyb20gb3RoZXIgcGxhdGZvcm1zIG9uIHRoaXMgbWV0aG9kIHZzIGdldGNfdW5sb2NrZWQgKHdoaWNoIE1TIGRvZXNuJ3QKIGhhdmUpOgotCUxpbnV4CQlhIHdhc2gKLQlTb2xhcmlzCQlhIHdhc2gKLQlUcnU2NCBVbml4CWdldGxpbmVfdmlhX2ZnZXRzIHNpZ25pZmljYW50bHkgZmFzdGVyCisgICAgTGludXggICAgICAgICAgICAgICBhIHdhc2gKKyAgICBTb2xhcmlzICAgICAgICAgICAgIGEgd2FzaAorICAgIFRydTY0IFVuaXggICAgICAgICAgZ2V0bGluZV92aWFfZmdldHMgc2lnbmlmaWNhbnRseSBmYXN0ZXIKIAogQ0FVVElPTjogIFRoZSBDIHN0ZCBpc24ndCBjbGVhciBhYm91dCB0aGlzOiAgaW4gdGhvc2UgY2FzZXMgd2hlcmUgZmdldHMKIHdyaXRlcyBzb21ldGhpbmcgaW50byB0aGUgYnVmZmVyLCBjYW4gaXQgd3JpdGUgaW50byBhbnkgcG9zaXRpb24gYmV5b25kIHRoZQpAQCAtMTIxOCwxNTEgKzEyMTgsMTUxIEBACiAgKi8KICNkZWZpbmUgSU5JVEJVRlNJWkUgMTAwCiAjZGVmaW5lIE1BWEJVRlNJWkUgMzAwCi0JY2hhciogcDsJLyogdGVtcCAqLwotCWNoYXIgYnVmW01BWEJVRlNJWkVdOwotCVB5T2JqZWN0KiB2OwkvKiB0aGUgc3RyaW5nIG9iamVjdCByZXN1bHQgKi8KLQljaGFyKiBwdmZyZWU7CS8qIGFkZHJlc3Mgb2YgbmV4dCBmcmVlIHNsb3QgKi8KLQljaGFyKiBwdmVuZDsgICAgLyogYWRkcmVzcyBvbmUgYmV5b25kIGxhc3QgZnJlZSBzbG90ICovCi0Jc2l6ZV90IG5mcmVlOwkvKiAjIG9mIGZyZWUgYnVmZmVyIHNsb3RzOyBwdmVuZC1wdmZyZWUgKi8KLQlzaXplX3QgdG90YWxfdl9zaXplOyAgLyogdG90YWwgIyBvZiBzbG90cyBpbiBidWZmZXIgKi8KLQlzaXplX3QgaW5jcmVtZW50OwkvKiBhbW91bnQgdG8gaW5jcmVtZW50IHRoZSBidWZmZXIgKi8KLQlzaXplX3QgcHJldl92X3NpemU7CisgICAgY2hhciogcDsgICAgICAgICAgICAvKiB0ZW1wICovCisgICAgY2hhciBidWZbTUFYQlVGU0laRV07CisgICAgUHlPYmplY3QqIHY7ICAgICAgICAvKiB0aGUgc3RyaW5nIG9iamVjdCByZXN1bHQgKi8KKyAgICBjaGFyKiBwdmZyZWU7ICAgICAgIC8qIGFkZHJlc3Mgb2YgbmV4dCBmcmVlIHNsb3QgKi8KKyAgICBjaGFyKiBwdmVuZDsgICAgLyogYWRkcmVzcyBvbmUgYmV5b25kIGxhc3QgZnJlZSBzbG90ICovCisgICAgc2l6ZV90IG5mcmVlOyAgICAgICAvKiAjIG9mIGZyZWUgYnVmZmVyIHNsb3RzOyBwdmVuZC1wdmZyZWUgKi8KKyAgICBzaXplX3QgdG90YWxfdl9zaXplOyAgLyogdG90YWwgIyBvZiBzbG90cyBpbiBidWZmZXIgKi8KKyAgICBzaXplX3QgaW5jcmVtZW50OyAgICAgICAgICAgLyogYW1vdW50IHRvIGluY3JlbWVudCB0aGUgYnVmZmVyICovCisgICAgc2l6ZV90IHByZXZfdl9zaXplOwogCi0JLyogT3B0aW1pemUgZm9yIG5vcm1hbCBjYXNlOiAgYXZvaWQgX1B5U3RyaW5nX1Jlc2l6ZSBpZiBhdCBhbGwKLQkgKiBwb3NzaWJsZSB2aWEgZmlyc3QgcmVhZGluZyBpbnRvIHN0YWNrIGJ1ZmZlciAiYnVmIi4KLQkgKi8KLQl0b3RhbF92X3NpemUgPSBJTklUQlVGU0laRTsJLyogc3RhcnQgc21hbGwgYW5kIHByYXkgKi8KLQlwdmZyZWUgPSBidWY7Ci0JZm9yICg7OykgewotCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQkJcHZlbmQgPSBidWYgKyB0b3RhbF92X3NpemU7Ci0JCW5mcmVlID0gcHZlbmQgLSBwdmZyZWU7Ci0JCW1lbXNldChwdmZyZWUsICdcbicsIG5mcmVlKTsKLQkJYXNzZXJ0KG5mcmVlIDwgSU5UX01BWCk7IC8qIFNob3VsZCBiZSBhdG1vc3QgTUFYQlVGU0laRSAqLwotCQlwID0gZmdldHMocHZmcmVlLCAoaW50KW5mcmVlLCBmcCk7Ci0JCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICAvKiBPcHRpbWl6ZSBmb3Igbm9ybWFsIGNhc2U6ICBhdm9pZCBfUHlTdHJpbmdfUmVzaXplIGlmIGF0IGFsbAorICAgICAqIHBvc3NpYmxlIHZpYSBmaXJzdCByZWFkaW5nIGludG8gc3RhY2sgYnVmZmVyICJidWYiLgorICAgICAqLworICAgIHRvdGFsX3Zfc2l6ZSA9IElOSVRCVUZTSVpFOyAgICAgICAgIC8qIHN0YXJ0IHNtYWxsIGFuZCBwcmF5ICovCisgICAgcHZmcmVlID0gYnVmOworICAgIGZvciAoOzspIHsKKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgICAgIHB2ZW5kID0gYnVmICsgdG90YWxfdl9zaXplOworICAgICAgICBuZnJlZSA9IHB2ZW5kIC0gcHZmcmVlOworICAgICAgICBtZW1zZXQocHZmcmVlLCAnXG4nLCBuZnJlZSk7CisgICAgICAgIGFzc2VydChuZnJlZSA8IElOVF9NQVgpOyAvKiBTaG91bGQgYmUgYXRtb3N0IE1BWEJVRlNJWkUgKi8KKyAgICAgICAgcCA9IGZnZXRzKHB2ZnJlZSwgKGludCluZnJlZSwgZnApOworICAgICAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCiAKLQkJaWYgKHAgPT0gTlVMTCkgewotCQkJY2xlYXJlcnIoZnApOwotCQkJaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQotCQkJCXJldHVybiBOVUxMOwotCQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgcHZmcmVlIC0gYnVmKTsKLQkJCXJldHVybiB2OwotCQl9Ci0JCS8qIGZnZXRzIHJlYWQgKnNvbWV0aGluZyogKi8KLQkJcCA9IG1lbWNocihwdmZyZWUsICdcbicsIG5mcmVlKTsKLQkJaWYgKHAgIT0gTlVMTCkgewotCQkJLyogRGlkIHRoZSBcbiBjb21lIGZyb20gZmdldHMgb3IgZnJvbSB1cz8KLQkJCSAqIFNpbmNlIGZnZXRzIHN0b3BzIGF0IHRoZSBmaXJzdCBcbiwgYW5kIHRoZW4gd3JpdGVzCi0JCQkgKiBcMCwgaWYgaXQncyBmcm9tIGZnZXRzIGEgXDAgbXVzdCBiZSBuZXh0LiAgQnV0IGlmCi0JCQkgKiB0aGF0J3Mgc28sIGl0IGNvdWxkIG5vdCBoYXZlIGNvbWUgZnJvbSB1cywgc2luY2UKLQkJCSAqIHRoZSBcbidzIHdlIGZpbGxlZCB0aGUgYnVmZmVyIHdpdGggaGF2ZSBvbmx5IG1vcmUKLQkJCSAqIFxuJ3MgdG8gdGhlIHJpZ2h0LgotCQkJICovCi0JCQlpZiAocCsxIDwgcHZlbmQgJiYgKihwKzEpID09ICdcMCcpIHsKLQkJCQkvKiBJdCdzIGZyb20gZmdldHM6ICB3ZSB3aW4hICBJbiBwYXJ0aWN1bGFyLAotCQkJCSAqIHdlIGhhdmVuJ3QgZG9uZSBhbnkgbWFsbG9jcyB5ZXQsIGFuZCBjYW4KLQkJCQkgKiBidWlsZCB0aGUgZmluYWwgcmVzdWx0IG9uIHRoZSBmaXJzdCB0cnkuCi0JCQkJICovCi0JCQkJKytwOwkvKiBpbmNsdWRlIFxuIGZyb20gZmdldHMgKi8KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIE11c3QgYmUgZnJvbSB1czogIGZnZXRzIGRpZG4ndCBmaWxsIHRoZQotCQkJCSAqIGJ1ZmZlciBhbmQgZGlkbid0IGZpbmQgYSBuZXdsaW5lLCBzbyBpdAotCQkJCSAqIG11c3QgYmUgdGhlIGxhc3QgYW5kIG5ld2xpbmUtZnJlZSBsaW5lIG9mCi0JCQkJICogdGhlIGZpbGUuCi0JCQkJICovCi0JCQkJYXNzZXJ0KHAgPiBwdmZyZWUgJiYgKihwLTEpID09ICdcMCcpOwotCQkJCS0tcDsJLyogZG9uJ3QgaW5jbHVkZSBcMCBmcm9tIGZnZXRzICovCi0JCQl9Ci0JCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBwIC0gYnVmKTsKLQkJCXJldHVybiB2OwotCQl9Ci0JCS8qIHl1Y2s6ICBmZ2V0cyBvdmVyd3JvdGUgYWxsIHRoZSBuZXdsaW5lcywgaS5lLiB0aGUgZW50aXJlCi0JCSAqIGJ1ZmZlci4gIFNvIHRoaXMgbGluZSBpc24ndCBvdmVyIHlldCwgb3IgbWF5YmUgaXQgaXMgYnV0Ci0JCSAqIHdlJ3JlIGV4YWN0bHkgYXQgRU9GLiAgSWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCB0cnkgdXNpbmcgdGhlCi0JCSAqIHJlc3Qgb2YgdGhlIHN0YWNrIGJ1ZmZlci4KLQkJICovCi0JCWFzc2VydCgqKHB2ZW5kLTEpID09ICdcMCcpOwotCQlpZiAocHZmcmVlID09IGJ1ZikgewotCQkJcHZmcmVlID0gcHZlbmQgLSAxOwkvKiBvdmVyd3JpdGUgdHJhaWxpbmcgbnVsbCAqLwotCQkJdG90YWxfdl9zaXplID0gTUFYQlVGU0laRTsKLQkJfQotCQllbHNlCi0JCQlicmVhazsKLQl9CisgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNsZWFyZXJyKGZwKTsKKyAgICAgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIHB2ZnJlZSAtIGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgICAgICAvKiBmZ2V0cyByZWFkICpzb21ldGhpbmcqICovCisgICAgICAgIHAgPSBtZW1jaHIocHZmcmVlLCAnXG4nLCBuZnJlZSk7CisgICAgICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIERpZCB0aGUgXG4gY29tZSBmcm9tIGZnZXRzIG9yIGZyb20gdXM/CisgICAgICAgICAgICAgKiBTaW5jZSBmZ2V0cyBzdG9wcyBhdCB0aGUgZmlyc3QgXG4sIGFuZCB0aGVuIHdyaXRlcworICAgICAgICAgICAgICogXDAsIGlmIGl0J3MgZnJvbSBmZ2V0cyBhIFwwIG11c3QgYmUgbmV4dC4gIEJ1dCBpZgorICAgICAgICAgICAgICogdGhhdCdzIHNvLCBpdCBjb3VsZCBub3QgaGF2ZSBjb21lIGZyb20gdXMsIHNpbmNlCisgICAgICAgICAgICAgKiB0aGUgXG4ncyB3ZSBmaWxsZWQgdGhlIGJ1ZmZlciB3aXRoIGhhdmUgb25seSBtb3JlCisgICAgICAgICAgICAgKiBcbidzIHRvIHRoZSByaWdodC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHArMSA8IHB2ZW5kICYmICoocCsxKSA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgLyogSXQncyBmcm9tIGZnZXRzOiAgd2Ugd2luISAgSW4gcGFydGljdWxhciwKKyAgICAgICAgICAgICAgICAgKiB3ZSBoYXZlbid0IGRvbmUgYW55IG1hbGxvY3MgeWV0LCBhbmQgY2FuCisgICAgICAgICAgICAgICAgICogYnVpbGQgdGhlIGZpbmFsIHJlc3VsdCBvbiB0aGUgZmlyc3QgdHJ5LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICsrcDsgICAgICAgICAgICAgICAgICAgIC8qIGluY2x1ZGUgXG4gZnJvbSBmZ2V0cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogTXVzdCBiZSBmcm9tIHVzOiAgZmdldHMgZGlkbid0IGZpbGwgdGhlCisgICAgICAgICAgICAgICAgICogYnVmZmVyIGFuZCBkaWRuJ3QgZmluZCBhIG5ld2xpbmUsIHNvIGl0CisgICAgICAgICAgICAgICAgICogbXVzdCBiZSB0aGUgbGFzdCBhbmQgbmV3bGluZS1mcmVlIGxpbmUgb2YKKyAgICAgICAgICAgICAgICAgKiB0aGUgZmlsZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQocCA+IHB2ZnJlZSAmJiAqKHAtMSkgPT0gJ1wwJyk7CisgICAgICAgICAgICAgICAgLS1wOyAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgaW5jbHVkZSBcMCBmcm9tIGZnZXRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBwIC0gYnVmKTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgICAgIC8qIHl1Y2s6ICBmZ2V0cyBvdmVyd3JvdGUgYWxsIHRoZSBuZXdsaW5lcywgaS5lLiB0aGUgZW50aXJlCisgICAgICAgICAqIGJ1ZmZlci4gIFNvIHRoaXMgbGluZSBpc24ndCBvdmVyIHlldCwgb3IgbWF5YmUgaXQgaXMgYnV0CisgICAgICAgICAqIHdlJ3JlIGV4YWN0bHkgYXQgRU9GLiAgSWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCB0cnkgdXNpbmcgdGhlCisgICAgICAgICAqIHJlc3Qgb2YgdGhlIHN0YWNrIGJ1ZmZlci4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydCgqKHB2ZW5kLTEpID09ICdcMCcpOworICAgICAgICBpZiAocHZmcmVlID09IGJ1ZikgeworICAgICAgICAgICAgcHZmcmVlID0gcHZlbmQgLSAxOyAgICAgICAgICAgICAgICAgLyogb3ZlcndyaXRlIHRyYWlsaW5nIG51bGwgKi8KKyAgICAgICAgICAgIHRvdGFsX3Zfc2l6ZSA9IE1BWEJVRlNJWkU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogCi0JLyogVGhlIHN0YWNrIGJ1ZmZlciBpc24ndCBiaWcgZW5vdWdoOyBtYWxsb2MgYSBzdHJpbmcgb2JqZWN0IGFuZCByZWFkCi0JICogaW50byBpdHMgYnVmZmVyLgotCSAqLwotCXRvdGFsX3Zfc2l6ZSA9IE1BWEJVRlNJWkUgPDwgMTsKLQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKU5VTEwsIChpbnQpdG90YWxfdl9zaXplKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gdjsKLQkvKiBjb3B5IG92ZXIgZXZlcnl0aGluZyBleGNlcHQgdGhlIGxhc3QgbnVsbCBieXRlICovCi0JbWVtY3B5KEJVRih2KSwgYnVmLCBNQVhCVUZTSVpFLTEpOwotCXB2ZnJlZSA9IEJVRih2KSArIE1BWEJVRlNJWkUgLSAxOworICAgIC8qIFRoZSBzdGFjayBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaDsgbWFsbG9jIGEgc3RyaW5nIG9iamVjdCBhbmQgcmVhZAorICAgICAqIGludG8gaXRzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB0b3RhbF92X3NpemUgPSBNQVhCVUZTSVpFIDw8IDE7CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKilOVUxMLCAoaW50KXRvdGFsX3Zfc2l6ZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHY7CisgICAgLyogY29weSBvdmVyIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBsYXN0IG51bGwgYnl0ZSAqLworICAgIG1lbWNweShCVUYodiksIGJ1ZiwgTUFYQlVGU0laRS0xKTsKKyAgICBwdmZyZWUgPSBCVUYodikgKyBNQVhCVUZTSVpFIC0gMTsKIAotCS8qIEtlZXAgcmVhZGluZyBzdHVmZiBpbnRvIHY7IGlmIGl0IGV2ZXIgZW5kcyBzdWNjZXNzZnVsbHksIGJyZWFrCi0JICogYWZ0ZXIgc2V0dGluZyBwIG9uZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbGluZS4gIFRoZSBjb2RlIGhlcmUgaXMKLQkgKiB2ZXJ5IG11Y2ggbGlrZSB0aGUgY29kZSBhYm92ZSwgZXhjZXB0IHJlYWRzIGludG8gdidzIGJ1ZmZlcjsgc2VlCi0JICogdGhlIGNvZGUgYWJvdmUgZm9yIGRldGFpbGVkIGNvbW1lbnRzIGFib3V0IHRoZSBsb2dpYy4KLQkgKi8KLQlmb3IgKDs7KSB7Ci0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCQlwdmVuZCA9IEJVRih2KSArIHRvdGFsX3Zfc2l6ZTsKLQkJbmZyZWUgPSBwdmVuZCAtIHB2ZnJlZTsKLQkJbWVtc2V0KHB2ZnJlZSwgJ1xuJywgbmZyZWUpOwotCQlhc3NlcnQobmZyZWUgPCBJTlRfTUFYKTsKLQkJcCA9IGZnZXRzKHB2ZnJlZSwgKGludCluZnJlZSwgZnApOwotCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgLyogS2VlcCByZWFkaW5nIHN0dWZmIGludG8gdjsgaWYgaXQgZXZlciBlbmRzIHN1Y2Nlc3NmdWxseSwgYnJlYWsKKyAgICAgKiBhZnRlciBzZXR0aW5nIHAgb25lIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgVGhlIGNvZGUgaGVyZSBpcworICAgICAqIHZlcnkgbXVjaCBsaWtlIHRoZSBjb2RlIGFib3ZlLCBleGNlcHQgcmVhZHMgaW50byB2J3MgYnVmZmVyOyBzZWUKKyAgICAgKiB0aGUgY29kZSBhYm92ZSBmb3IgZGV0YWlsZWQgY29tbWVudHMgYWJvdXQgdGhlIGxvZ2ljLgorICAgICAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgICAgIHB2ZW5kID0gQlVGKHYpICsgdG90YWxfdl9zaXplOworICAgICAgICBuZnJlZSA9IHB2ZW5kIC0gcHZmcmVlOworICAgICAgICBtZW1zZXQocHZmcmVlLCAnXG4nLCBuZnJlZSk7CisgICAgICAgIGFzc2VydChuZnJlZSA8IElOVF9NQVgpOworICAgICAgICBwID0gZmdldHMocHZmcmVlLCAoaW50KW5mcmVlLCBmcCk7CisgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKIAotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQljbGVhcmVycihmcCk7Ci0JCQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlwID0gcHZmcmVlOwotCQkJYnJlYWs7Ci0JCX0KLQkJcCA9IG1lbWNocihwdmZyZWUsICdcbicsIG5mcmVlKTsKLQkJaWYgKHAgIT0gTlVMTCkgewotCQkJaWYgKHArMSA8IHB2ZW5kICYmICoocCsxKSA9PSAnXDAnKSB7Ci0JCQkJLyogXG4gY2FtZSBmcm9tIGZnZXRzICovCi0JCQkJKytwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogXG4gY2FtZSBmcm9tIHVzOyBsYXN0IGxpbmUgb2YgZmlsZSwgbm8gbmV3bGluZSAqLwotCQkJYXNzZXJ0KHAgPiBwdmZyZWUgJiYgKihwLTEpID09ICdcMCcpOwotCQkJLS1wOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogZXhwYW5kIGJ1ZmZlciBhbmQgdHJ5IGFnYWluICovCi0JCWFzc2VydCgqKHB2ZW5kLTEpID09ICdcMCcpOwotCQlpbmNyZW1lbnQgPSB0b3RhbF92X3NpemUgPj4gMjsJLyogbWlsZCBleHBvbmVudGlhbCBncm93dGggKi8KLQkJcHJldl92X3NpemUgPSB0b3RhbF92X3NpemU7Ci0JCXRvdGFsX3Zfc2l6ZSArPSBpbmNyZW1lbnQ7Ci0JCS8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLwotCQlpZiAodG90YWxfdl9zaXplIDw9IHByZXZfdl9zaXplIHx8Ci0JCSAgICB0b3RhbF92X3NpemUgPiBQWV9TU0laRV9UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgKGludCl0b3RhbF92X3NpemUpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQkvKiBvdmVyd3JpdGUgdGhlIHRyYWlsaW5nIG51bGwgYnl0ZSAqLwotCQlwdmZyZWUgPSBCVUYodikgKyAocHJldl92X3NpemUgLSAxKTsKLQl9Ci0JaWYgKEJVRih2KSArIHRvdGFsX3Zfc2l6ZSAhPSBwICYmIF9QeVN0cmluZ19SZXNpemUoJnYsIHAgLSBCVUYodikpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdjsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgY2xlYXJlcnIoZnApOworICAgICAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCA9IHB2ZnJlZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHAgPSBtZW1jaHIocHZmcmVlLCAnXG4nLCBuZnJlZSk7CisgICAgICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChwKzEgPCBwdmVuZCAmJiAqKHArMSkgPT0gJ1wwJykgeworICAgICAgICAgICAgICAgIC8qIFxuIGNhbWUgZnJvbSBmZ2V0cyAqLworICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFxuIGNhbWUgZnJvbSB1czsgbGFzdCBsaW5lIG9mIGZpbGUsIG5vIG5ld2xpbmUgKi8KKyAgICAgICAgICAgIGFzc2VydChwID4gcHZmcmVlICYmICoocC0xKSA9PSAnXDAnKTsKKyAgICAgICAgICAgIC0tcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIGV4cGFuZCBidWZmZXIgYW5kIHRyeSBhZ2FpbiAqLworICAgICAgICBhc3NlcnQoKihwdmVuZC0xKSA9PSAnXDAnKTsKKyAgICAgICAgaW5jcmVtZW50ID0gdG90YWxfdl9zaXplID4+IDI7ICAgICAgICAgIC8qIG1pbGQgZXhwb25lbnRpYWwgZ3Jvd3RoICovCisgICAgICAgIHByZXZfdl9zaXplID0gdG90YWxfdl9zaXplOworICAgICAgICB0b3RhbF92X3NpemUgKz0gaW5jcmVtZW50OworICAgICAgICAvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICAgICAgaWYgKHRvdGFsX3Zfc2l6ZSA8PSBwcmV2X3Zfc2l6ZSB8fAorICAgICAgICAgICAgdG90YWxfdl9zaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIChpbnQpdG90YWxfdl9zaXplKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgLyogb3ZlcndyaXRlIHRoZSB0cmFpbGluZyBudWxsIGJ5dGUgKi8KKyAgICAgICAgcHZmcmVlID0gQlVGKHYpICsgKHByZXZfdl9zaXplIC0gMSk7CisgICAgfQorICAgIGlmIChCVUYodikgKyB0b3RhbF92X3NpemUgIT0gcCAmJiBfUHlTdHJpbmdfUmVzaXplKCZ2LCBwIC0gQlVGKHYpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHY7CiAjdW5kZWYgSU5JVEJVRlNJWkUKICN1bmRlZiBNQVhCVUZTSVpFCiB9Ci0jZW5kaWYJLyogaWZkZWYgVVNFX0ZHRVRTX0lOX0dFVExJTkUgKi8KKyNlbmRpZiAgLyogaWZkZWYgVVNFX0ZHRVRTX0lOX0dFVExJTkUgKi8KIAogLyogSW50ZXJuYWwgcm91dGluZSB0byBnZXQgYSBsaW5lLgogICAgU2l6ZSBhcmd1bWVudCBpbnRlcnByZXRhdGlvbjoKQEAgLTEzNzMsMTA1ICsxMzczLDEwNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9saW5lKFB5RmlsZU9iamVjdCAqZiwgaW50IG4pCiB7Ci0JRklMRSAqZnAgPSBmLT5mX2ZwOwotCWludCBjOwotCWNoYXIgKmJ1ZiwgKmVuZDsKLQlzaXplX3QgdG90YWxfdl9zaXplOwkvKiB0b3RhbCAjIG9mIHNsb3RzIGluIGJ1ZmZlciAqLwotCXNpemVfdCB1c2VkX3Zfc2l6ZTsJLyogIyB1c2VkIHNsb3RzIGluIGJ1ZmZlciAqLwotCXNpemVfdCBpbmNyZW1lbnQ7ICAgICAgIC8qIGFtb3VudCB0byBpbmNyZW1lbnQgdGhlIGJ1ZmZlciAqLwotCVB5T2JqZWN0ICp2OwotCWludCBuZXdsaW5ldHlwZXMgPSBmLT5mX25ld2xpbmV0eXBlczsKLQlpbnQgc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKLQlpbnQgdW5pdl9uZXdsaW5lID0gZi0+Zl91bml2X25ld2xpbmU7CisgICAgRklMRSAqZnAgPSBmLT5mX2ZwOworICAgIGludCBjOworICAgIGNoYXIgKmJ1ZiwgKmVuZDsKKyAgICBzaXplX3QgdG90YWxfdl9zaXplOyAgICAgICAgLyogdG90YWwgIyBvZiBzbG90cyBpbiBidWZmZXIgKi8KKyAgICBzaXplX3QgdXNlZF92X3NpemU7ICAgICAgICAgLyogIyB1c2VkIHNsb3RzIGluIGJ1ZmZlciAqLworICAgIHNpemVfdCBpbmNyZW1lbnQ7ICAgICAgIC8qIGFtb3VudCB0byBpbmNyZW1lbnQgdGhlIGJ1ZmZlciAqLworICAgIFB5T2JqZWN0ICp2OworICAgIGludCBuZXdsaW5ldHlwZXMgPSBmLT5mX25ld2xpbmV0eXBlczsKKyAgICBpbnQgc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKKyAgICBpbnQgdW5pdl9uZXdsaW5lID0gZi0+Zl91bml2X25ld2xpbmU7CiAKICNpZiBkZWZpbmVkKFVTRV9GR0VUU19JTl9HRVRMSU5FKQotCWlmIChuIDw9IDAgJiYgIXVuaXZfbmV3bGluZSApCi0JCXJldHVybiBnZXRsaW5lX3ZpYV9mZ2V0cyhmLCBmcCk7CisgICAgaWYgKG4gPD0gMCAmJiAhdW5pdl9uZXdsaW5lICkKKyAgICAgICAgcmV0dXJuIGdldGxpbmVfdmlhX2ZnZXRzKGYsIGZwKTsKICNlbmRpZgotCXRvdGFsX3Zfc2l6ZSA9IG4gPiAwID8gbiA6IDEwMDsKLQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCB0b3RhbF92X3NpemUpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWJ1ZiA9IEJVRih2KTsKLQllbmQgPSBidWYgKyB0b3RhbF92X3NpemU7CisgICAgdG90YWxfdl9zaXplID0gbiA+IDAgPyBuIDogMTAwOworICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHRvdGFsX3Zfc2l6ZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnVmID0gQlVGKHYpOworICAgIGVuZCA9IGJ1ZiArIHRvdGFsX3Zfc2l6ZTsKIAotCWZvciAoOzspIHsKLQkJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JCUZMT0NLRklMRShmcCk7Ci0JCWlmICh1bml2X25ld2xpbmUpIHsKLQkJCWMgPSAneCc7IC8qIFNodXQgdXAgZ2NjIHdhcm5pbmcgKi8KLQkJCXdoaWxlICggYnVmICE9IGVuZCAmJiAoYyA9IEdFVEMoZnApKSAhPSBFT0YgKSB7Ci0JCQkJaWYgKHNraXBuZXh0bGYgKSB7Ci0JCQkJCXNraXBuZXh0bGYgPSAwOwotCQkJCQlpZiAoYyA9PSAnXG4nKSB7Ci0JCQkJCQkvKiBTZWVpbmcgYSBcbiBoZXJlIHdpdGgKLQkJCQkJCSAqIHNraXBuZXh0bGYgdHJ1ZSBtZWFucyB3ZQotCQkJCQkJICogc2F3IGEgXHIgYmVmb3JlLgotCQkJCQkJICovCi0JCQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOwotCQkJCQkJYyA9IEdFVEMoZnApOwotCQkJCQkJaWYgKGMgPT0gRU9GKSBicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjID09ICdccicpIHsKLQkJCQkJc2tpcG5leHRsZiA9IDE7Ci0JCQkJCWMgPSAnXG4nOwotCQkJCX0gZWxzZSBpZiAoIGMgPT0gJ1xuJykKLQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7Ci0JCQkJKmJ1ZisrID0gYzsKLQkJCQlpZiAoYyA9PSAnXG4nKSBicmVhazsKLQkJCX0KLQkJCWlmICggYyA9PSBFT0YgJiYgc2tpcG5leHRsZiApCi0JCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCX0gZWxzZSAvKiBJZiBub3QgdW5pdmVyc2FsIG5ld2xpbmVzIHVzZSB0aGUgbm9ybWFsIGxvb3AgKi8KLQkJd2hpbGUgKChjID0gR0VUQyhmcCkpICE9IEVPRiAmJgotCQkgICAgICAgKCpidWYrKyA9IGMpICE9ICdcbicgJiYKLQkJCWJ1ZiAhPSBlbmQpCi0JCQk7Ci0JCUZVTkxPQ0tGSUxFKGZwKTsKLQkJRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCQlmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKLQkJZi0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKLQkJaWYgKGMgPT0gJ1xuJykKLQkJCWJyZWFrOwotCQlpZiAoYyA9PSBFT0YpIHsKLQkJCWlmIChmZXJyb3IoZnApKSB7Ci0JCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJCWNsZWFyZXJyKGZwKTsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQljbGVhcmVycihmcCk7Ci0JCQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQkvKiBNdXN0IGJlIGJlY2F1c2UgYnVmID09IGVuZCAqLwotCQlpZiAobiA+IDApCi0JCQlicmVhazsKLQkJdXNlZF92X3NpemUgPSB0b3RhbF92X3NpemU7Ci0JCWluY3JlbWVudCA9IHRvdGFsX3Zfc2l6ZSA+PiAyOyAvKiBtaWxkIGV4cG9uZW50aWFsIGdyb3d0aCAqLwotCQl0b3RhbF92X3NpemUgKz0gaW5jcmVtZW50OwotCQlpZiAodG90YWxfdl9zaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIHRvdGFsX3Zfc2l6ZSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWJ1ZiA9IEJVRih2KSArIHVzZWRfdl9zaXplOwotCQllbmQgPSBCVUYodikgKyB0b3RhbF92X3NpemU7Ci0JfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgICAgIEZMT0NLRklMRShmcCk7CisgICAgICAgIGlmICh1bml2X25ld2xpbmUpIHsKKyAgICAgICAgICAgIGMgPSAneCc7IC8qIFNodXQgdXAgZ2NjIHdhcm5pbmcgKi8KKyAgICAgICAgICAgIHdoaWxlICggYnVmICE9IGVuZCAmJiAoYyA9IEdFVEMoZnApKSAhPSBFT0YgKSB7CisgICAgICAgICAgICAgICAgaWYgKHNraXBuZXh0bGYgKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBuZXh0bGYgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVpbmcgYSBcbiBoZXJlIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNraXBuZXh0bGYgdHJ1ZSBtZWFucyB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogc2F3IGEgXHIgYmVmb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IEdFVEMoZnApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gRU9GKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjID09ICdccicpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGMgPSAnXG4nOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGMgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gYzsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggYyA9PSBFT0YgJiYgc2tpcG5leHRsZiApCisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgICAgIH0gZWxzZSAvKiBJZiBub3QgdW5pdmVyc2FsIG5ld2xpbmVzIHVzZSB0aGUgbm9ybWFsIGxvb3AgKi8KKyAgICAgICAgd2hpbGUgKChjID0gR0VUQyhmcCkpICE9IEVPRiAmJgorICAgICAgICAgICAgICAgKCpidWYrKyA9IGMpICE9ICdcbicgJiYKKyAgICAgICAgICAgIGJ1ZiAhPSBlbmQpCisgICAgICAgICAgICA7CisgICAgICAgIEZVTkxPQ0tGSUxFKGZwKTsKKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKKyAgICAgICAgZi0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKKyAgICAgICAgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoYyA9PSBFT0YpIHsKKyAgICAgICAgICAgIGlmIChmZXJyb3IoZnApKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgICAgIGNsZWFyZXJyKGZwKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGVhcmVycihmcCk7CisgICAgICAgICAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBNdXN0IGJlIGJlY2F1c2UgYnVmID09IGVuZCAqLworICAgICAgICBpZiAobiA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdXNlZF92X3NpemUgPSB0b3RhbF92X3NpemU7CisgICAgICAgIGluY3JlbWVudCA9IHRvdGFsX3Zfc2l6ZSA+PiAyOyAvKiBtaWxkIGV4cG9uZW50aWFsIGdyb3d0aCAqLworICAgICAgICB0b3RhbF92X3NpemUgKz0gaW5jcmVtZW50OworICAgICAgICBpZiAodG90YWxfdl9zaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIHRvdGFsX3Zfc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJ1ZiA9IEJVRih2KSArIHVzZWRfdl9zaXplOworICAgICAgICBlbmQgPSBCVUYodikgKyB0b3RhbF92X3NpemU7CisgICAgfQogCi0JdXNlZF92X3NpemUgPSBidWYgLSBCVUYodik7Ci0JaWYgKHVzZWRfdl9zaXplICE9IHRvdGFsX3Zfc2l6ZSAmJiBfUHlTdHJpbmdfUmVzaXplKCZ2LCB1c2VkX3Zfc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiB2OworICAgIHVzZWRfdl9zaXplID0gYnVmIC0gQlVGKHYpOworICAgIGlmICh1c2VkX3Zfc2l6ZSAhPSB0b3RhbF92X3NpemUgJiYgX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdXNlZF92X3NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gdjsKIH0KIAogLyogRXh0ZXJuYWwgQyBpbnRlcmZhY2UgKi8KQEAgLTE0NzksOTggKzE0NzksOTggQEAKIFB5T2JqZWN0ICoKIFB5RmlsZV9HZXRMaW5lKFB5T2JqZWN0ICpmLCBpbnQgbikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoZiA9PSBOVUxMKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKFB5RmlsZV9DaGVjayhmKSkgewotCQlQeUZpbGVPYmplY3QgKmZvID0gKFB5RmlsZU9iamVjdCAqKWY7Ci0JCWlmIChmby0+Zl9mcCA9PSBOVUxMKQotCQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQkJaWYgKCFmby0+cmVhZGFibGUpCi0JCQlyZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKLQkJLyogcmVmdXNlIHRvIG1peCB3aXRoIGYubmV4dCgpICovCi0JCWlmIChmby0+Zl9idWYgIT0gTlVMTCAmJgotCQkgICAgKGZvLT5mX2J1ZmVuZCAtIGZvLT5mX2J1ZnB0cikgPiAwICYmCi0JCSAgICBmby0+Zl9idWZbMF0gIT0gJ1wwJykKLQkJCXJldHVybiBlcnJfaXRlcmJ1ZmZlcmVkKCk7Ci0JCXJlc3VsdCA9IGdldF9saW5lKGZvLCBuKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpyZWFkZXI7Ci0JCVB5T2JqZWN0ICphcmdzOworICAgIGlmIChQeUZpbGVfQ2hlY2soZikpIHsKKyAgICAgICAgUHlGaWxlT2JqZWN0ICpmbyA9IChQeUZpbGVPYmplY3QgKilmOworICAgICAgICBpZiAoZm8tPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgICAgIGlmICghZm8tPnJlYWRhYmxlKQorICAgICAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7CisgICAgICAgIC8qIHJlZnVzZSB0byBtaXggd2l0aCBmLm5leHQoKSAqLworICAgICAgICBpZiAoZm8tPmZfYnVmICE9IE5VTEwgJiYKKyAgICAgICAgICAgIChmby0+Zl9idWZlbmQgLSBmby0+Zl9idWZwdHIpID4gMCAmJgorICAgICAgICAgICAgZm8tPmZfYnVmWzBdICE9ICdcMCcpCisgICAgICAgICAgICByZXR1cm4gZXJyX2l0ZXJidWZmZXJlZCgpOworICAgICAgICByZXN1bHQgPSBnZXRfbGluZShmbywgbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqcmVhZGVyOworICAgICAgICBQeU9iamVjdCAqYXJnczsKIAotCQlyZWFkZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGYsICJyZWFkbGluZSIpOwotCQlpZiAocmVhZGVyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKG4gPD0gMCkKLQkJCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQkJZWxzZQotCQkJYXJncyA9IFB5X0J1aWxkVmFsdWUoIihpKSIsIG4pOwotCQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVhZGVyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHJlYWRlciwgYXJncyk7Ci0JCVB5X0RFQ1JFRihyZWFkZXIpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JCWlmIChyZXN1bHQgIT0gTlVMTCAmJiAhUHlTdHJpbmdfQ2hlY2socmVzdWx0KSAmJgotCQkgICAgIVB5VW5pY29kZV9DaGVjayhyZXN1bHQpKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJlc3VsdCA9IE5VTEw7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICJvYmplY3QucmVhZGxpbmUoKSByZXR1cm5lZCBub24tc3RyaW5nIik7Ci0JCX0KLQl9CisgICAgICAgIHJlYWRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZiwgInJlYWRsaW5lIik7CisgICAgICAgIGlmIChyZWFkZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAobiA8PSAwKQorICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKGkpIiwgbik7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QocmVhZGVyLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKHJlYWRlcik7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmICFQeVN0cmluZ19DaGVjayhyZXN1bHQpICYmCisgICAgICAgICAgICAhUHlVbmljb2RlX0NoZWNrKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QucmVhZGxpbmUoKSByZXR1cm5lZCBub24tc3RyaW5nIik7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAobiA8IDAgJiYgcmVzdWx0ICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkgewotCQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7Ci0JCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUocmVzdWx0KTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJlc3VsdCA9IE5VTEw7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCi0JCQkJCSJFT0Ygd2hlbiByZWFkaW5nIGEgbGluZSIpOwotCQl9Ci0JCWVsc2UgaWYgKHNbbGVuLTFdID09ICdcbicpIHsKLQkJCWlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKSB7Ci0JCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgbGVuLTEpKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVB5T2JqZWN0ICp2OwotCQkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4tMSk7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmVzdWx0ID0gdjsKLQkJCX0KLQkJfQotCX0KKyAgICBpZiAobiA8IDAgJiYgcmVzdWx0ICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkgeworICAgICAgICBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisgICAgICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUocmVzdWx0KTsKKyAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVPRiB3aGVuIHJlYWRpbmcgYSBsaW5lIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc1tsZW4tMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBsZW4tMSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgICAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbi0xKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAobiA8IDAgJiYgcmVzdWx0ICE9IE5VTEwgJiYgUHlVbmljb2RlX0NoZWNrKHJlc3VsdCkpIHsKLQkJUHlfVU5JQ09ERSAqcyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7Ci0JCVB5X3NzaXplX3QgbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKHJlc3VsdCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXN1bHQgPSBOVUxMOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHdoZW4gcmVhZGluZyBhIGxpbmUiKTsKLQkJfQotCQllbHNlIGlmIChzW2xlbi0xXSA9PSAnXG4nKSB7Ci0JCQlpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkKLQkJCQlQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIGxlbi0xKTsKLQkJCWVsc2UgewotCQkJCVB5T2JqZWN0ICp2OwotCQkJCXYgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUocywgbGVuLTEpOwotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJlc3VsdCA9IHY7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKG4gPCAwICYmIHJlc3VsdCAhPSBOVUxMICYmIFB5VW5pY29kZV9DaGVjayhyZXN1bHQpKSB7CisgICAgICAgIFB5X1VOSUNPREUgKnMgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOworICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5VW5pY29kZV9HRVRfU0laRShyZXN1bHQpOworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRU9GIHdoZW4gcmVhZGluZyBhIGxpbmUiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzW2xlbi0xXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIGxlbi0xKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICAgICAgICAgIHYgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUocywgbGVuLTEpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFB5dGhvbiBtZXRob2QgKi8KQEAgLTE1NzgsMzQxICsxNTc4LDM0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfcmVhZGxpbmUoUHlGaWxlT2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbiA9IC0xOworICAgIGludCBuID0gLTE7CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCWlmICghZi0+cmVhZGFibGUpCi0JCXJldHVybiBlcnJfbW9kZSgicmVhZGluZyIpOwotCS8qIHJlZnVzZSB0byBtaXggd2l0aCBmLm5leHQoKSAqLwotCWlmIChmLT5mX2J1ZiAhPSBOVUxMICYmCi0JICAgIChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+IDAgJiYKLQkgICAgZi0+Zl9idWZbMF0gIT0gJ1wwJykKLQkJcmV0dXJuIGVycl9pdGVyYnVmZmVyZWQoKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnJlYWRsaW5lIiwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobiA9PSAwKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JaWYgKG4gPCAwKQotCQluID0gMDsKLQlyZXR1cm4gZ2V0X2xpbmUoZiwgbik7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBpZiAoIWYtPnJlYWRhYmxlKQorICAgICAgICByZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKKyAgICAvKiByZWZ1c2UgdG8gbWl4IHdpdGggZi5uZXh0KCkgKi8KKyAgICBpZiAoZi0+Zl9idWYgIT0gTlVMTCAmJgorICAgICAgICAoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPiAwICYmCisgICAgICAgIGYtPmZfYnVmWzBdICE9ICdcMCcpCisgICAgICAgIHJldHVybiBlcnJfaXRlcmJ1ZmZlcmVkKCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpyZWFkbGluZSIsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgbiA9IDA7CisgICAgcmV0dXJuIGdldF9saW5lKGYsIG4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9yZWFkbGluZXMoUHlGaWxlT2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHNpemVoaW50ID0gMDsKLQlQeU9iamVjdCAqbGlzdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmxpbmU7Ci0JY2hhciBzbWFsbF9idWZmZXJbU01BTExDSFVOS107Ci0JY2hhciAqYnVmZmVyID0gc21hbGxfYnVmZmVyOwotCXNpemVfdCBidWZmZXJzaXplID0gU01BTExDSFVOSzsKLQlQeU9iamVjdCAqYmlnX2J1ZmZlciA9IE5VTEw7Ci0Jc2l6ZV90IG5maWxsZWQgPSAwOwotCXNpemVfdCBucmVhZDsKLQlzaXplX3QgdG90YWxyZWFkID0gMDsKLQljaGFyICpwLCAqcSwgKmVuZDsKLQlpbnQgZXJyOwotCWludCBzaG9ydHJlYWQgPSAwOworICAgIGxvbmcgc2l6ZWhpbnQgPSAwOworICAgIFB5T2JqZWN0ICpsaXN0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbGluZTsKKyAgICBjaGFyIHNtYWxsX2J1ZmZlcltTTUFMTENIVU5LXTsKKyAgICBjaGFyICpidWZmZXIgPSBzbWFsbF9idWZmZXI7CisgICAgc2l6ZV90IGJ1ZmZlcnNpemUgPSBTTUFMTENIVU5LOworICAgIFB5T2JqZWN0ICpiaWdfYnVmZmVyID0gTlVMTDsKKyAgICBzaXplX3QgbmZpbGxlZCA9IDA7CisgICAgc2l6ZV90IG5yZWFkOworICAgIHNpemVfdCB0b3RhbHJlYWQgPSAwOworICAgIGNoYXIgKnAsICpxLCAqZW5kOworICAgIGludCBlcnI7CisgICAgaW50IHNob3J0cmVhZCA9IDA7CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCWlmICghZi0+cmVhZGFibGUpCi0JCXJldHVybiBlcnJfbW9kZSgicmVhZGluZyIpOwotCS8qIHJlZnVzZSB0byBtaXggd2l0aCBmLm5leHQoKSAqLwotCWlmIChmLT5mX2J1ZiAhPSBOVUxMICYmCi0JICAgIChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+IDAgJiYKLQkgICAgZi0+Zl9idWZbMF0gIT0gJ1wwJykKLQkJcmV0dXJuIGVycl9pdGVyYnVmZmVyZWQoKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxsOnJlYWRsaW5lcyIsICZzaXplaGludCkpCi0JCXJldHVybiBOVUxMOwotCWlmICgobGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoOzspIHsKLQkJaWYgKHNob3J0cmVhZCkKLQkJCW5yZWFkID0gMDsKLQkJZWxzZSB7Ci0JCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQkJCWVycm5vID0gMDsKLQkJCW5yZWFkID0gUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKGJ1ZmZlcituZmlsbGVkLAotCQkJCWJ1ZmZlcnNpemUtbmZpbGxlZCwgZi0+Zl9mcCwgKFB5T2JqZWN0ICopZik7Ci0JCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JCQlzaG9ydHJlYWQgPSAobnJlYWQgPCBidWZmZXJzaXplLW5maWxsZWQpOwotCQl9Ci0JCWlmIChucmVhZCA9PSAwKSB7Ci0JCQlzaXplaGludCA9IDA7Ci0JCQlpZiAoIWZlcnJvcihmLT5mX2ZwKSkKLQkJCQlicmVhazsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCWNsZWFyZXJyKGYtPmZfZnApOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQl0b3RhbHJlYWQgKz0gbnJlYWQ7Ci0JCXAgPSAoY2hhciAqKW1lbWNocihidWZmZXIrbmZpbGxlZCwgJ1xuJywgbnJlYWQpOwotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQkvKiBOZWVkIGEgbGFyZ2VyIGJ1ZmZlciB0byBmaXQgdGhpcyBsaW5lICovCi0JCQluZmlsbGVkICs9IG5yZWFkOwotCQkJYnVmZmVyc2l6ZSAqPSAyOwotCQkJaWYgKGJ1ZmZlcnNpemUgPiBQWV9TU0laRV9UX01BWCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJLyogQ3JlYXRlIHRoZSBiaWcgYnVmZmVyICovCi0JCQkJYmlnX2J1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQkJCQlOVUxMLCBidWZmZXJzaXplKTsKLQkJCQlpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCWJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhiaWdfYnVmZmVyKTsKLQkJCQltZW1jcHkoYnVmZmVyLCBzbWFsbF9idWZmZXIsIG5maWxsZWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogR3JvdyB0aGUgYmlnIGJ1ZmZlciAqLwotCQkJCWlmICggX1B5U3RyaW5nX1Jlc2l6ZSgmYmlnX2J1ZmZlciwgYnVmZmVyc2l6ZSkgPCAwICkKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoYmlnX2J1ZmZlcik7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQllbmQgPSBidWZmZXIrbmZpbGxlZCtucmVhZDsKLQkJcSA9IGJ1ZmZlcjsKLQkJZG8gewotCQkJLyogUHJvY2VzcyBjb21wbGV0ZSBsaW5lcyAqLwotCQkJcCsrOwotCQkJbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHEsIHAtcSk7Ci0JCQlpZiAobGluZSA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGxpbmUpOwotCQkJUHlfREVDUkVGKGxpbmUpOwotCQkJaWYgKGVyciAhPSAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQlxID0gcDsKLQkJCXAgPSAoY2hhciAqKW1lbWNocihxLCAnXG4nLCBlbmQtcSk7Ci0JCX0gd2hpbGUgKHAgIT0gTlVMTCk7Ci0JCS8qIE1vdmUgdGhlIHJlbWFpbmluZyBpbmNvbXBsZXRlIGxpbmUgdG8gdGhlIHN0YXJ0ICovCi0JCW5maWxsZWQgPSBlbmQtcTsKLQkJbWVtbW92ZShidWZmZXIsIHEsIG5maWxsZWQpOwotCQlpZiAoc2l6ZWhpbnQgPiAwKQotCQkJaWYgKHRvdGFscmVhZCA+PSAoc2l6ZV90KXNpemVoaW50KQotCQkJCWJyZWFrOwotCX0KLQlpZiAobmZpbGxlZCAhPSAwKSB7Ci0JCS8qIFBhcnRpYWwgbGFzdCBsaW5lICovCi0JCWxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsIG5maWxsZWQpOwotCQlpZiAobGluZSA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKHNpemVoaW50ID4gMCkgewotCQkJLyogTmVlZCB0byBjb21wbGV0ZSB0aGUgbGFzdCBsaW5lICovCi0JCQlQeU9iamVjdCAqcmVzdCA9IGdldF9saW5lKGYsIDApOwotCQkJaWYgKHJlc3QgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihsaW5lKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJUHlTdHJpbmdfQ29uY2F0KCZsaW5lLCByZXN0KTsKLQkJCVB5X0RFQ1JFRihyZXN0KTsKLQkJCWlmIChsaW5lID09IE5VTEwpCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGxpbmUpOwotCQlQeV9ERUNSRUYobGluZSk7Ci0JCWlmIChlcnIgIT0gMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgaWYgKCFmLT5yZWFkYWJsZSkKKyAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7CisgICAgLyogcmVmdXNlIHRvIG1peCB3aXRoIGYubmV4dCgpICovCisgICAgaWYgKGYtPmZfYnVmICE9IE5VTEwgJiYKKyAgICAgICAgKGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHIpID4gMCAmJgorICAgICAgICBmLT5mX2J1ZlswXSAhPSAnXDAnKQorICAgICAgICByZXR1cm4gZXJyX2l0ZXJidWZmZXJlZCgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZGxpbmVzIiwgJnNpemVoaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChsaXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoc2hvcnRyZWFkKQorICAgICAgICAgICAgbnJlYWQgPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgbnJlYWQgPSBQeV9Vbml2ZXJzYWxOZXdsaW5lRnJlYWQoYnVmZmVyK25maWxsZWQsCisgICAgICAgICAgICAgICAgYnVmZmVyc2l6ZS1uZmlsbGVkLCBmLT5mX2ZwLCAoUHlPYmplY3QgKilmKTsKKyAgICAgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgICAgIHNob3J0cmVhZCA9IChucmVhZCA8IGJ1ZmZlcnNpemUtbmZpbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5yZWFkID09IDApIHsKKyAgICAgICAgICAgIHNpemVoaW50ID0gMDsKKyAgICAgICAgICAgIGlmICghZmVycm9yKGYtPmZfZnApKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHRvdGFscmVhZCArPSBucmVhZDsKKyAgICAgICAgcCA9IChjaGFyICopbWVtY2hyKGJ1ZmZlcituZmlsbGVkLCAnXG4nLCBucmVhZCk7CisgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIE5lZWQgYSBsYXJnZXIgYnVmZmVyIHRvIGZpdCB0aGlzIGxpbmUgKi8KKyAgICAgICAgICAgIG5maWxsZWQgKz0gbnJlYWQ7CisgICAgICAgICAgICBidWZmZXJzaXplICo9IDI7CisgICAgICAgICAgICBpZiAoYnVmZmVyc2l6ZSA+IFBZX1NTSVpFX1RfTUFYKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaWdfYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgdGhlIGJpZyBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBiaWdfYnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIGJ1ZmZlcnNpemUpOworICAgICAgICAgICAgICAgIGlmIChiaWdfYnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gUHlTdHJpbmdfQVNfU1RSSU5HKGJpZ19idWZmZXIpOworICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXIsIHNtYWxsX2J1ZmZlciwgbmZpbGxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBHcm93IHRoZSBiaWcgYnVmZmVyICovCisgICAgICAgICAgICAgICAgaWYgKCBfUHlTdHJpbmdfUmVzaXplKCZiaWdfYnVmZmVyLCBidWZmZXJzaXplKSA8IDAgKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhiaWdfYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVuZCA9IGJ1ZmZlcituZmlsbGVkK25yZWFkOworICAgICAgICBxID0gYnVmZmVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICAvKiBQcm9jZXNzIGNvbXBsZXRlIGxpbmVzICovCisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocSwgcC1xKTsKKyAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbGluZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYobGluZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIHEgPSBwOworICAgICAgICAgICAgcCA9IChjaGFyICopbWVtY2hyKHEsICdcbicsIGVuZC1xKTsKKyAgICAgICAgfSB3aGlsZSAocCAhPSBOVUxMKTsKKyAgICAgICAgLyogTW92ZSB0aGUgcmVtYWluaW5nIGluY29tcGxldGUgbGluZSB0byB0aGUgc3RhcnQgKi8KKyAgICAgICAgbmZpbGxlZCA9IGVuZC1xOworICAgICAgICBtZW1tb3ZlKGJ1ZmZlciwgcSwgbmZpbGxlZCk7CisgICAgICAgIGlmIChzaXplaGludCA+IDApCisgICAgICAgICAgICBpZiAodG90YWxyZWFkID49IChzaXplX3Qpc2l6ZWhpbnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChuZmlsbGVkICE9IDApIHsKKyAgICAgICAgLyogUGFydGlhbCBsYXN0IGxpbmUgKi8KKyAgICAgICAgbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZmZlciwgbmZpbGxlZCk7CisgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAoc2l6ZWhpbnQgPiAwKSB7CisgICAgICAgICAgICAvKiBOZWVkIHRvIGNvbXBsZXRlIHRoZSBsYXN0IGxpbmUgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN0ID0gZ2V0X2xpbmUoZiwgMCk7CisgICAgICAgICAgICBpZiAocmVzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxpbmUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVN0cmluZ19Db25jYXQoJmxpbmUsIHJlc3QpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3QpOworICAgICAgICAgICAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbGluZSk7CisgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKIGNsZWFudXA6Ci0JUHlfWERFQ1JFRihiaWdfYnVmZmVyKTsKLQlyZXR1cm4gbGlzdDsKKyAgICBQeV9YREVDUkVGKGJpZ19idWZmZXIpOworICAgIHJldHVybiBsaXN0OwogCiBlcnJvcjoKLQlQeV9DTEVBUihsaXN0KTsKLQlnb3RvIGNsZWFudXA7CisgICAgUHlfQ0xFQVIobGlzdCk7CisgICAgZ290byBjbGVhbnVwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV93cml0ZShQeUZpbGVPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOwotCWNoYXIgKnM7Ci0JUHlfc3NpemVfdCBuLCBuMjsKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCWlmICghZi0+d3JpdGFibGUpCi0JCXJldHVybiBlcnJfbW9kZSgid3JpdGluZyIpOwotCWlmIChmLT5mX2JpbmFyeSkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqIiwgJnBidWYpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXMgPSBwYnVmLmJ1ZjsKLQkJbiA9IHBidWYubGVuOwotCX0gZWxzZQotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjIiwgJnMsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZi0+Zl9zb2Z0c3BhY2UgPSAwOwotCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCWVycm5vID0gMDsKLQluMiA9IGZ3cml0ZShzLCAxLCBuLCBmLT5mX2ZwKTsKLQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JaWYgKGYtPmZfYmluYXJ5KQotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQlpZiAobjIgIT0gbikgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCWNsZWFyZXJyKGYtPmZfZnApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X2J1ZmZlciBwYnVmOworICAgIGNoYXIgKnM7CisgICAgUHlfc3NpemVfdCBuLCBuMjsKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIGlmICghZi0+d3JpdGFibGUpCisgICAgICAgIHJldHVybiBlcnJfbW9kZSgid3JpdGluZyIpOworICAgIGlmIChmLT5mX2JpbmFyeSkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqIiwgJnBidWYpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHMgPSBwYnVmLmJ1ZjsKKyAgICAgICAgbiA9IHBidWYubGVuOworICAgIH0gZWxzZQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjIiwgJnMsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZi0+Zl9zb2Z0c3BhY2UgPSAwOworICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgIGVycm5vID0gMDsKKyAgICBuMiA9IGZ3cml0ZShzLCAxLCBuLCBmLT5mX2ZwKTsKKyAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgaWYgKGYtPmZfYmluYXJ5KQorICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICBpZiAobjIgIT0gbikgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV93cml0ZWxpbmVzKFB5RmlsZU9iamVjdCAqZiwgUHlPYmplY3QgKnNlcSkKIHsKICNkZWZpbmUgQ0hVTktTSVpFIDEwMDAKLQlQeU9iamVjdCAqbGlzdCwgKmxpbmU7Ci0JUHlPYmplY3QgKml0OwkvKiBpdGVyKHNlcSkgKi8KLQlQeU9iamVjdCAqcmVzdWx0OwotCWludCBpbmRleCwgaXNsaXN0OwotCVB5X3NzaXplX3QgaSwgaiwgbndyaXR0ZW4sIGxlbjsKKyAgICBQeU9iamVjdCAqbGlzdCwgKmxpbmU7CisgICAgUHlPYmplY3QgKml0OyAgICAgICAvKiBpdGVyKHNlcSkgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBpbmRleCwgaXNsaXN0OworICAgIFB5X3NzaXplX3QgaSwgaiwgbndyaXR0ZW4sIGxlbjsKIAotCWFzc2VydChzZXEgIT0gTlVMTCk7Ci0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlpZiAoIWYtPndyaXRhYmxlKQotCQlyZXR1cm4gZXJyX21vZGUoIndyaXRpbmciKTsKKyAgICBhc3NlcnQoc2VxICE9IE5VTEwpOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgaWYgKCFmLT53cml0YWJsZSkKKyAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJ3cml0aW5nIik7CiAKLQlyZXN1bHQgPSBOVUxMOwotCWxpc3QgPSBOVUxMOwotCWlzbGlzdCA9IFB5TGlzdF9DaGVjayhzZXEpOwotCWlmICAoaXNsaXN0KQotCQlpdCA9IE5VTEw7Ci0JZWxzZSB7Ci0JCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCQlpZiAoaXQgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkid3JpdGVsaW5lcygpIHJlcXVpcmVzIGFuIGl0ZXJhYmxlIGFyZ3VtZW50Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiBGcm9tIGhlcmUgb24sIGZhaWwgYnkgZ29pbmcgdG8gZXJyb3IsIHRvIHJlY2xhaW0gIml0Ii4gKi8KLQkJbGlzdCA9IFB5TGlzdF9OZXcoQ0hVTktTSVpFKTsKLQkJaWYgKGxpc3QgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIHJlc3VsdCA9IE5VTEw7CisgICAgbGlzdCA9IE5VTEw7CisgICAgaXNsaXN0ID0gUHlMaXN0X0NoZWNrKHNlcSk7CisgICAgaWYgIChpc2xpc3QpCisgICAgICAgIGl0ID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJ3cml0ZWxpbmVzKCkgcmVxdWlyZXMgYW4gaXRlcmFibGUgYXJndW1lbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIEZyb20gaGVyZSBvbiwgZmFpbCBieSBnb2luZyB0byBlcnJvciwgdG8gcmVjbGFpbSAiaXQiLiAqLworICAgICAgICBsaXN0ID0gUHlMaXN0X05ldyhDSFVOS1NJWkUpOworICAgICAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBTdHJhdGVneTogc2x1cnAgQ0hVTktTSVpFIGxpbmVzIGludG8gYSBwcml2YXRlIGxpc3QsCi0JICAgY2hlY2tpbmcgdGhhdCB0aGV5IGFyZSBhbGwgc3RyaW5ncywgdGhlbiB3cml0ZSB0aGF0IGxpc3QKLQkgICB3aXRob3V0IGhvbGRpbmcgdGhlIGludGVycHJldGVyIGxvY2ssIHRoZW4gY29tZSBiYWNrIGZvciBtb3JlLiAqLwotCWZvciAoaW5kZXggPSAwOyA7IGluZGV4ICs9IENIVU5LU0laRSkgewotCQlpZiAoaXNsaXN0KSB7Ci0JCQlQeV9YREVDUkVGKGxpc3QpOwotCQkJbGlzdCA9IFB5TGlzdF9HZXRTbGljZShzZXEsIGluZGV4LCBpbmRleCtDSFVOS1NJWkUpOwotCQkJaWYgKGxpc3QgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQkJaiA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaiA9IDA7IGogPCBDSFVOS1NJWkU7IGorKykgewotCQkJCWxpbmUgPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCQkJaWYgKGxpbmUgPT0gTlVMTCkgewotCQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJCWdvdG8gZXJyb3I7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlQeUxpc3RfU2V0SXRlbShsaXN0LCBqLCBsaW5lKTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSAwKQotCQkJYnJlYWs7CisgICAgLyogU3RyYXRlZ3k6IHNsdXJwIENIVU5LU0laRSBsaW5lcyBpbnRvIGEgcHJpdmF0ZSBsaXN0LAorICAgICAgIGNoZWNraW5nIHRoYXQgdGhleSBhcmUgYWxsIHN0cmluZ3MsIHRoZW4gd3JpdGUgdGhhdCBsaXN0CisgICAgICAgd2l0aG91dCBob2xkaW5nIHRoZSBpbnRlcnByZXRlciBsb2NrLCB0aGVuIGNvbWUgYmFjayBmb3IgbW9yZS4gKi8KKyAgICBmb3IgKGluZGV4ID0gMDsgOyBpbmRleCArPSBDSFVOS1NJWkUpIHsKKyAgICAgICAgaWYgKGlzbGlzdCkgeworICAgICAgICAgICAgUHlfWERFQ1JFRihsaXN0KTsKKyAgICAgICAgICAgIGxpc3QgPSBQeUxpc3RfR2V0U2xpY2Uoc2VxLCBpbmRleCwgaW5kZXgrQ0hVTktTSVpFKTsKKyAgICAgICAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGogPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgQ0hVTktTSVpFOyBqKyspIHsKKyAgICAgICAgICAgICAgICBsaW5lID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaiwgbGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCS8qIENoZWNrIHRoYXQgYWxsIGVudHJpZXMgYXJlIGluZGVlZCBzdHJpbmdzLiBJZiBub3QsCi0JCSAgIGFwcGx5IHRoZSBzYW1lIHJ1bGVzIGFzIGZvciBmaWxlLndyaXRlKCkgYW5kCi0JCSAgIGNvbnZlcnQgdGhlIHJlc3VsdHMgdG8gc3RyaW5ncy4gVGhpcyBpcyBzbG93LCBidXQKLQkJICAgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHNpbmNlIGFsbCBjb252ZXJzaW9uIEFQSXMKLQkJICAgY291bGQgcG90ZW50aWFsbHkgZXhlY3V0ZSBQeXRob24gY29kZS4gKi8KLQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCQkgICAgCWNvbnN0IGNoYXIgKmJ1ZmZlcjsKLQkJCQlpZiAoKChmLT5mX2JpbmFyeSAmJgotCQkJCSAgICAgIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcih2LAotCQkJCQkgICAgICAoY29uc3Qgdm9pZCoqKSZidWZmZXIsCi0JCQkJCQkJICAgICZsZW4pKSB8fAotCQkJCSAgICAgUHlPYmplY3RfQXNDaGFyQnVmZmVyKHYsCi0JCQkJCQkJICAgJmJ1ZmZlciwKLQkJCQkJCQkgICAmbGVuKSkpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ3cml0ZWxpbmVzKCkgYXJndW1lbnQgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3MiKTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQkJbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZmZlciwKLQkJCQkJCQkJICBsZW4pOwotCQkJCWlmIChsaW5lID09IE5VTEwpCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCVB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCBsaW5lKTsKLQkJCX0KLQkJfQorICAgICAgICAvKiBDaGVjayB0aGF0IGFsbCBlbnRyaWVzIGFyZSBpbmRlZWQgc3RyaW5ncy4gSWYgbm90LAorICAgICAgICAgICBhcHBseSB0aGUgc2FtZSBydWxlcyBhcyBmb3IgZmlsZS53cml0ZSgpIGFuZAorICAgICAgICAgICBjb252ZXJ0IHRoZSByZXN1bHRzIHRvIHN0cmluZ3MuIFRoaXMgaXMgc2xvdywgYnV0CisgICAgICAgICAgIHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSBzaW5jZSBhbGwgY29udmVyc2lvbiBBUElzCisgICAgICAgICAgIGNvdWxkIHBvdGVudGlhbGx5IGV4ZWN1dGUgUHl0aG9uIGNvZGUuICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOworICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAoKChmLT5mX2JpbmFyeSAmJgorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcih2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCoqKSZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbikpIHx8CisgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdF9Bc0NoYXJCdWZmZXIodiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIndyaXRlbGluZXMoKSBhcmd1bWVudCBtdXN0IGJlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGxpc3QsIGksIGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLyogU2luY2Ugd2UgYXJlIHJlbGVhc2luZyB0aGUgZ2xvYmFsIGxvY2ssIHRoZQotCQkgICBmb2xsb3dpbmcgY29kZSBtYXkgKm5vdCogZXhlY3V0ZSBQeXRob24gY29kZS4gKi8KLQkJZi0+Zl9zb2Z0c3BhY2UgPSAwOwotCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQkJZXJybm8gPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0JCSAgICAJbGluZSA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKLQkJCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGxpbmUpOwotCQkJbndyaXR0ZW4gPSBmd3JpdGUoUHlTdHJpbmdfQVNfU1RSSU5HKGxpbmUpLAotCQkJCQkgIDEsIGxlbiwgZi0+Zl9mcCk7Ci0JCQlpZiAobndyaXR0ZW4gIT0gbGVuKSB7Ci0JCQkJRklMRV9BQk9SVF9BTExPV19USFJFQURTKGYpCi0JCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJCWNsZWFyZXJyKGYtPmZfZnApOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCX0KLQkJRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICAvKiBTaW5jZSB3ZSBhcmUgcmVsZWFzaW5nIHRoZSBnbG9iYWwgbG9jaywgdGhlCisgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIG1heSAqbm90KiBleGVjdXRlIFB5dGhvbiBjb2RlLiAqLworICAgICAgICBmLT5mX3NvZnRzcGFjZSA9IDA7CisgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgICAgIGxpbmUgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CisgICAgICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShsaW5lKTsKKyAgICAgICAgICAgIG53cml0dGVuID0gZndyaXRlKFB5U3RyaW5nX0FTX1NUUklORyhsaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIGxlbiwgZi0+Zl9mcCk7CisgICAgICAgICAgICBpZiAobndyaXR0ZW4gIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgRklMRV9BQk9SVF9BTExPV19USFJFQURTKGYpCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQogCi0JCWlmIChqIDwgQ0hVTktTSVpFKQotCQkJYnJlYWs7Ci0JfQorICAgICAgICBpZiAoaiA8IENIVU5LU0laRSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXN1bHQgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXN1bHQgPSBQeV9Ob25lOwogICBlcnJvcjoKLQlQeV9YREVDUkVGKGxpc3QpOwotICAJUHlfWERFQ1JFRihpdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGxpc3QpOworICAgIFB5X1hERUNSRUYoaXQpOworICAgIHJldHVybiByZXN1bHQ7CiAjdW5kZWYgQ0hVTktTSVpFCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX3NlbGYoUHlGaWxlT2JqZWN0ICpmKQogewotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JUHlfSU5DUkVGKGYpOwotCXJldHVybiAoUHlPYmplY3QgKilmOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgUHlfSU5DUkVGKGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilmOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV94cmVhZGxpbmVzKFB5RmlsZU9iamVjdCAqZikKIHsKLQlpZiAoUHlFcnJfV2FyblB5M2soImYueHJlYWRsaW5lcygpIG5vdCBzdXBwb3J0ZWQgaW4gMy54LCAiCi0JCQkgICAidHJ5ICdmb3IgbGluZSBpbiBmJyBpbnN0ZWFkIiwgMSkgPCAwKQotCSAgICAgICByZXR1cm4gTlVMTDsKLQlyZXR1cm4gZmlsZV9zZWxmKGYpOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiZi54cmVhZGxpbmVzKCkgbm90IHN1cHBvcnRlZCBpbiAzLngsICIKKyAgICAgICAgICAgICAgICAgICAgICAgInRyeSAnZm9yIGxpbmUgaW4gZicgaW5zdGVhZCIsIDEpIDwgMCkKKyAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGZpbGVfc2VsZihmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfZXhpdChQeU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoZiwgImNsb3NlIiwgTlVMTCk7Ci0JaWYgKCFyZXQpCi0JCS8qIElmIGVycm9yIG9jY3VycmVkLCBwYXNzIHRocm91Z2ggKi8KLQkJcmV0dXJuIE5VTEw7Ci0JUHlfREVDUkVGKHJldCk7Ci0JLyogV2UgY2Fubm90IHJldHVybiB0aGUgcmVzdWx0IG9mIGNsb3NlIHNpbmNlIGEgdHJ1ZQotCSAqIHZhbHVlIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgInllcywgc3dhbGxvdyB0aGUKLQkgKiBleGNlcHRpb24gaWYgb25lIHdhcyByYWlzZWQgaW5zaWRlIHRoZSB3aXRoIGJsb2NrIi4gKi8KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeU9iamVjdCAqcmV0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChmLCAiY2xvc2UiLCBOVUxMKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgLyogSWYgZXJyb3Igb2NjdXJyZWQsIHBhc3MgdGhyb3VnaCAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmV0KTsKKyAgICAvKiBXZSBjYW5ub3QgcmV0dXJuIHRoZSByZXN1bHQgb2YgY2xvc2Ugc2luY2UgYSB0cnVlCisgICAgICogdmFsdWUgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyAieWVzLCBzd2FsbG93IHRoZQorICAgICAqIGV4Y2VwdGlvbiBpZiBvbmUgd2FzIHJhaXNlZCBpbnNpZGUgdGhlIHdpdGggYmxvY2siLiAqLworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIocmVhZGxpbmVfZG9jLApAQCAtMjAwMCwxMjYgKzIwMDAsMTI2IEBACiAiaXNhdHR5KCkgLT4gdHJ1ZSBvciBmYWxzZS4gIFRydWUgaWYgdGhlIGZpbGUgaXMgY29ubmVjdGVkIHRvIGEgdHR5IGRldmljZS4iKTsKIAogUHlEb2NfU1RSVkFSKGVudGVyX2RvYywKLQkgICAgICJfX2VudGVyX18oKSAtPiBzZWxmLiIpOworICAgICAgICAgICAgICJfX2VudGVyX18oKSAtPiBzZWxmLiIpOwogCiBQeURvY19TVFJWQVIoZXhpdF9kb2MsCi0JICAgICAiX19leGl0X18oKmV4Y2luZm8pIC0+IE5vbmUuICBDbG9zZXMgdGhlIGZpbGUuIik7CisgICAgICAgICAgICAgIl9fZXhpdF9fKCpleGNpbmZvKSAtPiBOb25lLiAgQ2xvc2VzIHRoZSBmaWxlLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgZmlsZV9tZXRob2RzW10gPSB7Ci0JeyJyZWFkbGluZSIsICAoUHlDRnVuY3Rpb24pZmlsZV9yZWFkbGluZSwgTUVUSF9WQVJBUkdTLCByZWFkbGluZV9kb2N9LAotCXsicmVhZCIsICAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfcmVhZCwgICAgIE1FVEhfVkFSQVJHUywgcmVhZF9kb2N9LAotCXsid3JpdGUiLCAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfd3JpdGUsICAgIE1FVEhfVkFSQVJHUywgd3JpdGVfZG9jfSwKLQl7ImZpbGVubyIsICAgIChQeUNGdW5jdGlvbilmaWxlX2ZpbGVubywgICBNRVRIX05PQVJHUywgIGZpbGVub19kb2N9LAotCXsic2VlayIsICAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfc2VlaywgICAgIE1FVEhfVkFSQVJHUywgc2Vla19kb2N9LAorICAgIHsicmVhZGxpbmUiLCAgKFB5Q0Z1bmN0aW9uKWZpbGVfcmVhZGxpbmUsIE1FVEhfVkFSQVJHUywgcmVhZGxpbmVfZG9jfSwKKyAgICB7InJlYWQiLCAgICAgIChQeUNGdW5jdGlvbilmaWxlX3JlYWQsICAgICBNRVRIX1ZBUkFSR1MsIHJlYWRfZG9jfSwKKyAgICB7IndyaXRlIiwgICAgIChQeUNGdW5jdGlvbilmaWxlX3dyaXRlLCAgICBNRVRIX1ZBUkFSR1MsIHdyaXRlX2RvY30sCisgICAgeyJmaWxlbm8iLCAgICAoUHlDRnVuY3Rpb24pZmlsZV9maWxlbm8sICAgTUVUSF9OT0FSR1MsICBmaWxlbm9fZG9jfSwKKyAgICB7InNlZWsiLCAgICAgIChQeUNGdW5jdGlvbilmaWxlX3NlZWssICAgICBNRVRIX1ZBUkFSR1MsIHNlZWtfZG9jfSwKICNpZmRlZiBIQVZFX0ZUUlVOQ0FURQotCXsidHJ1bmNhdGUiLCAgKFB5Q0Z1bmN0aW9uKWZpbGVfdHJ1bmNhdGUsIE1FVEhfVkFSQVJHUywgdHJ1bmNhdGVfZG9jfSwKKyAgICB7InRydW5jYXRlIiwgIChQeUNGdW5jdGlvbilmaWxlX3RydW5jYXRlLCBNRVRIX1ZBUkFSR1MsIHRydW5jYXRlX2RvY30sCiAjZW5kaWYKLQl7InRlbGwiLCAgICAgIChQeUNGdW5jdGlvbilmaWxlX3RlbGwsICAgICBNRVRIX05PQVJHUywgIHRlbGxfZG9jfSwKLQl7InJlYWRpbnRvIiwgIChQeUNGdW5jdGlvbilmaWxlX3JlYWRpbnRvLCBNRVRIX1ZBUkFSR1MsIHJlYWRpbnRvX2RvY30sCi0JeyJyZWFkbGluZXMiLCAoUHlDRnVuY3Rpb24pZmlsZV9yZWFkbGluZXMsIE1FVEhfVkFSQVJHUywgcmVhZGxpbmVzX2RvY30sCi0JeyJ4cmVhZGxpbmVzIiwoUHlDRnVuY3Rpb24pZmlsZV94cmVhZGxpbmVzLCBNRVRIX05PQVJHUywgeHJlYWRsaW5lc19kb2N9LAotCXsid3JpdGVsaW5lcyIsKFB5Q0Z1bmN0aW9uKWZpbGVfd3JpdGVsaW5lcywgTUVUSF9PLCAgICAgd3JpdGVsaW5lc19kb2N9LAotCXsiZmx1c2giLCAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfZmx1c2gsICAgIE1FVEhfTk9BUkdTLCAgZmx1c2hfZG9jfSwKLQl7ImNsb3NlIiwgICAgIChQeUNGdW5jdGlvbilmaWxlX2Nsb3NlLCAgICBNRVRIX05PQVJHUywgIGNsb3NlX2RvY30sCi0JeyJpc2F0dHkiLCAgICAoUHlDRnVuY3Rpb24pZmlsZV9pc2F0dHksICAgTUVUSF9OT0FSR1MsICBpc2F0dHlfZG9jfSwKLQl7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilmaWxlX3NlbGYsICAgICBNRVRIX05PQVJHUywgIGVudGVyX2RvY30sCi0JeyJfX2V4aXRfXyIsICAoUHlDRnVuY3Rpb24pZmlsZV9leGl0LCAgICAgTUVUSF9WQVJBUkdTLCBleGl0X2RvY30sCi0Je05VTEwsCSAgICAgIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsidGVsbCIsICAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfdGVsbCwgICAgIE1FVEhfTk9BUkdTLCAgdGVsbF9kb2N9LAorICAgIHsicmVhZGludG8iLCAgKFB5Q0Z1bmN0aW9uKWZpbGVfcmVhZGludG8sIE1FVEhfVkFSQVJHUywgcmVhZGludG9fZG9jfSwKKyAgICB7InJlYWRsaW5lcyIsIChQeUNGdW5jdGlvbilmaWxlX3JlYWRsaW5lcywgTUVUSF9WQVJBUkdTLCByZWFkbGluZXNfZG9jfSwKKyAgICB7InhyZWFkbGluZXMiLChQeUNGdW5jdGlvbilmaWxlX3hyZWFkbGluZXMsIE1FVEhfTk9BUkdTLCB4cmVhZGxpbmVzX2RvY30sCisgICAgeyJ3cml0ZWxpbmVzIiwoUHlDRnVuY3Rpb24pZmlsZV93cml0ZWxpbmVzLCBNRVRIX08sICAgICB3cml0ZWxpbmVzX2RvY30sCisgICAgeyJmbHVzaCIsICAgICAoUHlDRnVuY3Rpb24pZmlsZV9mbHVzaCwgICAgTUVUSF9OT0FSR1MsICBmbHVzaF9kb2N9LAorICAgIHsiY2xvc2UiLCAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfY2xvc2UsICAgIE1FVEhfTk9BUkdTLCAgY2xvc2VfZG9jfSwKKyAgICB7ImlzYXR0eSIsICAgIChQeUNGdW5jdGlvbilmaWxlX2lzYXR0eSwgICBNRVRIX05PQVJHUywgIGlzYXR0eV9kb2N9LAorICAgIHsiX19lbnRlcl9fIiwgKFB5Q0Z1bmN0aW9uKWZpbGVfc2VsZiwgICAgIE1FVEhfTk9BUkdTLCAgZW50ZXJfZG9jfSwKKyAgICB7Il9fZXhpdF9fIiwgIChQeUNGdW5jdGlvbilmaWxlX2V4aXQsICAgICBNRVRIX1ZBUkFSR1MsIGV4aXRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoUHlGaWxlT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZmlsZV9tZW1iZXJsaXN0W10gPSB7Ci0JeyJtb2RlIiwJVF9PQkpFQ1QsCU9GRihmX21vZGUpLAlSTywKLQkgImZpbGUgbW9kZSAoJ3InLCAnVScsICd3JywgJ2EnLCBwb3NzaWJseSB3aXRoICdiJyBvciAnKycgYWRkZWQpIn0sCi0JeyJuYW1lIiwJVF9PQkpFQ1QsCU9GRihmX25hbWUpLAlSTywKLQkgImZpbGUgbmFtZSJ9LAotCXsiZW5jb2RpbmciLAlUX09CSkVDVCwJT0ZGKGZfZW5jb2RpbmcpLAlSTywKLQkgImZpbGUgZW5jb2RpbmcifSwKLQl7ImVycm9ycyIsCVRfT0JKRUNULAlPRkYoZl9lcnJvcnMpLAlSTywKLQkgIlVuaWNvZGUgZXJyb3IgaGFuZGxlciJ9LAotCS8qIGdldGF0dHIoZiwgImNsb3NlZCIpIGlzIGltcGxlbWVudGVkIHdpdGhvdXQgdGhpcyB0YWJsZSAqLwotCXtOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsibW9kZSIsICAgICAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihmX21vZGUpLCAgICBSTywKKyAgICAgImZpbGUgbW9kZSAoJ3InLCAnVScsICd3JywgJ2EnLCBwb3NzaWJseSB3aXRoICdiJyBvciAnKycgYWRkZWQpIn0sCisgICAgeyJuYW1lIiwgICAgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfbmFtZSksICAgIFJPLAorICAgICAiZmlsZSBuYW1lIn0sCisgICAgeyJlbmNvZGluZyIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfZW5jb2RpbmcpLCAgICAgICAgUk8sCisgICAgICJmaWxlIGVuY29kaW5nIn0sCisgICAgeyJlcnJvcnMiLCAgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfZXJyb3JzKSwgIFJPLAorICAgICAiVW5pY29kZSBlcnJvciBoYW5kbGVyIn0sCisgICAgLyogZ2V0YXR0cihmLCAiY2xvc2VkIikgaXMgaW1wbGVtZW50ZWQgd2l0aG91dCB0aGlzIHRhYmxlICovCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY2xvc2VkKFB5RmlsZU9iamVjdCAqZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShmLT5mX2ZwID09IDApKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShmLT5mX2ZwID09IDApKTsKIH0KIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfbmV3bGluZXMoUHlGaWxlT2JqZWN0ICpmLCB2b2lkICpjbG9zdXJlKQogewotCXN3aXRjaCAoZi0+Zl9uZXdsaW5ldHlwZXMpIHsKLQljYXNlIE5FV0xJTkVfVU5LTk9XTjoKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQljYXNlIE5FV0xJTkVfQ1I6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcciIpOwotCWNhc2UgTkVXTElORV9MRjoKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIlxuIik7Ci0JY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxyIiwgIlxuIik7Ci0JY2FzZSBORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcclxuIik7Ci0JY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfQ1JMRjoKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzcykiLCAiXHIiLCAiXHJcbiIpOwotCWNhc2UgTkVXTElORV9MRnxORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxuIiwgIlxyXG4iKTsKLQljYXNlIE5FV0xJTkVfQ1J8TkVXTElORV9MRnxORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3NzKSIsICJcciIsICJcbiIsICJcclxuIik7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJICAgICAiVW5rbm93biBuZXdsaW5lcyB2YWx1ZSAweCV4XG4iLAotCQkJICAgICBmLT5mX25ld2xpbmV0eXBlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBzd2l0Y2ggKGYtPmZfbmV3bGluZXR5cGVzKSB7CisgICAgY2FzZSBORVdMSU5FX1VOS05PV046CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgY2FzZSBORVdMSU5FX0NSOgorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiXHIiKTsKKyAgICBjYXNlIE5FV0xJTkVfTEY6CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcbiIpOworICAgIGNhc2UgTkVXTElORV9DUnxORVdMSU5FX0xGOgorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsICJcciIsICJcbiIpOworICAgIGNhc2UgTkVXTElORV9DUkxGOgorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiXHJcbiIpOworICAgIGNhc2UgTkVXTElORV9DUnxORVdMSU5FX0NSTEY6CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxyIiwgIlxyXG4iKTsKKyAgICBjYXNlIE5FV0xJTkVfTEZ8TkVXTElORV9DUkxGOgorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsICJcbiIsICJcclxuIik7CisgICAgY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfTEZ8TkVXTElORV9DUkxGOgorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzcykiLCAiXHIiLCAiXG4iLCAiXHJcbiIpOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIG5ld2xpbmVzIHZhbHVlIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICBmLT5mX25ld2xpbmV0eXBlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9zb2Z0c3BhY2UoUHlGaWxlT2JqZWN0ICpmLCB2b2lkICpjbG9zdXJlKQogewotCWlmIChQeUVycl9XYXJuUHkzaygiZmlsZS5zb2Z0c3BhY2Ugbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhmLT5mX3NvZnRzcGFjZSk7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJmaWxlLnNvZnRzcGFjZSBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGYtPmZfc29mdHNwYWNlKTsKIH0KIAogc3RhdGljIGludAogc2V0X3NvZnRzcGFjZShQeUZpbGVPYmplY3QgKmYsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlpbnQgbmV3OwotCWlmIChQeUVycl9XYXJuUHkzaygiZmlsZS5zb2Z0c3BhY2Ugbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpbnQgbmV3OworICAgIGlmIChQeUVycl9XYXJuUHkzaygiZmlsZS5zb2Z0c3BhY2Ugbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBzb2Z0c3BhY2UgYXR0cmlidXRlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgc29mdHNwYWNlIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbmV3ID0gUHlJbnRfQXNMb25nKHZhbHVlKTsKLQlpZiAobmV3ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQlmLT5mX3NvZnRzcGFjZSA9IG5ldzsKLQlyZXR1cm4gMDsKKyAgICBuZXcgPSBQeUludF9Bc0xvbmcodmFsdWUpOworICAgIGlmIChuZXcgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGYtPmZfc29mdHNwYWNlID0gbmV3OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgZmlsZV9nZXRzZXRsaXN0W10gPSB7Ci0JeyJjbG9zZWQiLCAoZ2V0dGVyKWdldF9jbG9zZWQsIE5VTEwsICJUcnVlIGlmIHRoZSBmaWxlIGlzIGNsb3NlZCJ9LAotCXsibmV3bGluZXMiLCAoZ2V0dGVyKWdldF9uZXdsaW5lcywgTlVMTCwKLQkgImVuZC1vZi1saW5lIGNvbnZlbnRpb24gdXNlZCBpbiB0aGlzIGZpbGUifSwKLQl7InNvZnRzcGFjZSIsIChnZXR0ZXIpZ2V0X3NvZnRzcGFjZSwgKHNldHRlcilzZXRfc29mdHNwYWNlLAotCSAiZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSBzcGFjZSBuZWVkcyB0byBiZSBwcmludGVkOyB1c2VkIGJ5IHByaW50In0sCi0JezB9LAorICAgIHsiY2xvc2VkIiwgKGdldHRlcilnZXRfY2xvc2VkLCBOVUxMLCAiVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjbG9zZWQifSwKKyAgICB7Im5ld2xpbmVzIiwgKGdldHRlcilnZXRfbmV3bGluZXMsIE5VTEwsCisgICAgICJlbmQtb2YtbGluZSBjb252ZW50aW9uIHVzZWQgaW4gdGhpcyBmaWxlIn0sCisgICAgeyJzb2Z0c3BhY2UiLCAoZ2V0dGVyKWdldF9zb2Z0c3BhY2UsIChzZXR0ZXIpc2V0X3NvZnRzcGFjZSwKKyAgICAgImZsYWcgaW5kaWNhdGluZyB0aGF0IGEgc3BhY2UgbmVlZHMgdG8gYmUgcHJpbnRlZDsgdXNlZCBieSBwcmludCJ9LAorICAgIHswfSwKIH07CiAKIHN0YXRpYyB2b2lkCiBkcm9wX3JlYWRhaGVhZChQeUZpbGVPYmplY3QgKmYpCiB7Ci0JaWYgKGYtPmZfYnVmICE9IE5VTEwpIHsKLQkJUHlNZW1fRnJlZShmLT5mX2J1Zik7Ci0JCWYtPmZfYnVmID0gTlVMTDsKLQl9CisgICAgaWYgKGYtPmZfYnVmICE9IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fRnJlZShmLT5mX2J1Zik7CisgICAgICAgIGYtPmZfYnVmID0gTlVMTDsKKyAgICB9CiB9CiAKIC8qIE1ha2Ugc3VyZSB0aGF0IGZpbGUgaGFzIGEgcmVhZGFoZWFkIGJ1ZmZlciB3aXRoIGF0IGxlYXN0IG9uZSBieXRlCkBAIC0yMTI4LDM0ICsyMTI4LDM0IEBACiBzdGF0aWMgaW50CiByZWFkYWhlYWQoUHlGaWxlT2JqZWN0ICpmLCBpbnQgYnVmc2l6ZSkKIHsKLQlQeV9zc2l6ZV90IGNodW5rc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGNodW5rc2l6ZTsKIAotCWlmIChmLT5mX2J1ZiAhPSBOVUxMKSB7Ci0JCWlmKCAoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPj0gMSkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlkcm9wX3JlYWRhaGVhZChmKTsKLQl9Ci0JaWYgKChmLT5mX2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JZXJybm8gPSAwOwotCWNodW5rc2l6ZSA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZCgKLQkJZi0+Zl9idWYsIGJ1ZnNpemUsIGYtPmZfZnAsIChQeU9iamVjdCAqKWYpOwotCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQlpZiAoY2h1bmtzaXplID09IDApIHsKLQkJaWYgKGZlcnJvcihmLT5mX2ZwKSkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJY2xlYXJlcnIoZi0+Zl9mcCk7Ci0JCQlkcm9wX3JlYWRhaGVhZChmKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlmLT5mX2J1ZnB0ciA9IGYtPmZfYnVmOwotCWYtPmZfYnVmZW5kID0gZi0+Zl9idWYgKyBjaHVua3NpemU7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGYtPmZfYnVmICE9IE5VTEwpIHsKKyAgICAgICAgaWYoIChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+PSAxKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRyb3BfcmVhZGFoZWFkKGYpOworICAgIH0KKyAgICBpZiAoKGYtPmZfYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2MoYnVmc2l6ZSkpID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICBlcnJubyA9IDA7CisgICAgY2h1bmtzaXplID0gUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKAorICAgICAgICBmLT5mX2J1ZiwgYnVmc2l6ZSwgZi0+Zl9mcCwgKFB5T2JqZWN0ICopZik7CisgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIGlmIChjaHVua3NpemUgPT0gMCkgeworICAgICAgICBpZiAoZmVycm9yKGYtPmZfZnApKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgICAgIGRyb3BfcmVhZGFoZWFkKGYpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGYtPmZfYnVmcHRyID0gZi0+Zl9idWY7CisgICAgZi0+Zl9idWZlbmQgPSBmLT5mX2J1ZiArIGNodW5rc2l6ZTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogVXNlZCBieSBmaWxlX2l0ZXJuZXh0LiAgVGhlIHJldHVybmVkIHN0cmluZyB3aWxsIHN0YXJ0IHdpdGggJ3NraXAnCkBAIC0yMTY2LDQ2ICsyMTY2LDQ2IEBACiBzdGF0aWMgUHlTdHJpbmdPYmplY3QgKgogcmVhZGFoZWFkX2dldF9saW5lX3NraXAoUHlGaWxlT2JqZWN0ICpmLCBpbnQgc2tpcCwgaW50IGJ1ZnNpemUpCiB7Ci0JUHlTdHJpbmdPYmplY3QqIHM7Ci0JY2hhciAqYnVmcHRyOwotCWNoYXIgKmJ1ZjsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeVN0cmluZ09iamVjdCogczsKKyAgICBjaGFyICpidWZwdHI7CisgICAgY2hhciAqYnVmOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKGYtPmZfYnVmID09IE5VTEwpCi0JCWlmIChyZWFkYWhlYWQoZiwgYnVmc2l6ZSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGYtPmZfYnVmID09IE5VTEwpCisgICAgICAgIGlmIChyZWFkYWhlYWQoZiwgYnVmc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlsZW4gPSBmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyOwotCWlmIChsZW4gPT0gMCkKLQkJcmV0dXJuIChQeVN0cmluZ09iamVjdCAqKQotCQkJUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2tpcCk7Ci0JYnVmcHRyID0gKGNoYXIgKiltZW1jaHIoZi0+Zl9idWZwdHIsICdcbicsIGxlbik7Ci0JaWYgKGJ1ZnB0ciAhPSBOVUxMKSB7Ci0JCWJ1ZnB0cisrOwkJCS8qIENvdW50IHRoZSAnXG4nICovCi0JCWxlbiA9IGJ1ZnB0ciAtIGYtPmZfYnVmcHRyOwotCQlzID0gKFB5U3RyaW5nT2JqZWN0ICopCi0JCQlQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwK2xlbik7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyhzKStza2lwLCBmLT5mX2J1ZnB0ciwgbGVuKTsKLQkJZi0+Zl9idWZwdHIgPSBidWZwdHI7Ci0JCWlmIChidWZwdHIgPT0gZi0+Zl9idWZlbmQpCi0JCQlkcm9wX3JlYWRhaGVhZChmKTsKLQl9IGVsc2UgewotCQlidWZwdHIgPSBmLT5mX2J1ZnB0cjsKLQkJYnVmID0gZi0+Zl9idWY7Ci0JCWYtPmZfYnVmID0gTlVMTDsgCS8qIEZvcmNlIG5ldyByZWFkYWhlYWQgYnVmZmVyICovCi0JCWFzc2VydChza2lwK2xlbiA8IElOVF9NQVgpOwotICAgICAgICAgICAgICAgIHMgPSByZWFkYWhlYWRfZ2V0X2xpbmVfc2tpcCgKLQkJCWYsIChpbnQpKHNraXArbGVuKSwgYnVmc2l6ZSArIChidWZzaXplPj4yKSApOwotCQlpZiAocyA9PSBOVUxMKSB7Ci0JCSAgICAgICAgUHlNZW1fRnJlZShidWYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyhzKStza2lwLCBidWZwdHIsIGxlbik7Ci0JCVB5TWVtX0ZyZWUoYnVmKTsKLQl9Ci0JcmV0dXJuIHM7CisgICAgbGVuID0gZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cjsKKyAgICBpZiAobGVuID09IDApCisgICAgICAgIHJldHVybiAoUHlTdHJpbmdPYmplY3QgKikKKyAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNraXApOworICAgIGJ1ZnB0ciA9IChjaGFyICopbWVtY2hyKGYtPmZfYnVmcHRyLCAnXG4nLCBsZW4pOworICAgIGlmIChidWZwdHIgIT0gTlVMTCkgeworICAgICAgICBidWZwdHIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgdGhlICdcbicgKi8KKyAgICAgICAgbGVuID0gYnVmcHRyIC0gZi0+Zl9idWZwdHI7CisgICAgICAgIHMgPSAoUHlTdHJpbmdPYmplY3QgKikKKyAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNraXArbGVuKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBtZW1jcHkoUHlTdHJpbmdfQVNfU1RSSU5HKHMpK3NraXAsIGYtPmZfYnVmcHRyLCBsZW4pOworICAgICAgICBmLT5mX2J1ZnB0ciA9IGJ1ZnB0cjsKKyAgICAgICAgaWYgKGJ1ZnB0ciA9PSBmLT5mX2J1ZmVuZCkKKyAgICAgICAgICAgIGRyb3BfcmVhZGFoZWFkKGYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZnB0ciA9IGYtPmZfYnVmcHRyOworICAgICAgICBidWYgPSBmLT5mX2J1ZjsKKyAgICAgICAgZi0+Zl9idWYgPSBOVUxMOyAgICAgICAgICAgICAgICAvKiBGb3JjZSBuZXcgcmVhZGFoZWFkIGJ1ZmZlciAqLworICAgICAgICBhc3NlcnQoc2tpcCtsZW4gPCBJTlRfTUFYKTsKKyAgICAgICAgcyA9IHJlYWRhaGVhZF9nZXRfbGluZV9za2lwKAorICAgICAgICAgICAgZiwgKGludCkoc2tpcCtsZW4pLCBidWZzaXplICsgKGJ1ZnNpemU+PjIpICk7CisgICAgICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG1lbWNweShQeVN0cmluZ19BU19TVFJJTkcocykrc2tpcCwgYnVmcHRyLCBsZW4pOworICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgfQorICAgIHJldHVybiBzOwogfQogCiAvKiBBIGxhcmdlciBidWZmZXIgc2l6ZSBtYXkgYWN0dWFsbHkgZGVjcmVhc2UgcGVyZm9ybWFuY2UuICovCkBAIC0yMjE0LDEyMiArMjIxNCwxMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX2l0ZXJuZXh0KFB5RmlsZU9iamVjdCAqZikKIHsKLQlQeVN0cmluZ09iamVjdCogbDsKKyAgICBQeVN0cmluZ09iamVjdCogbDsKIAotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JaWYgKCFmLT5yZWFkYWJsZSkKLQkJcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBpZiAoIWYtPnJlYWRhYmxlKQorICAgICAgICByZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKIAotCWwgPSByZWFkYWhlYWRfZ2V0X2xpbmVfc2tpcChmLCAwLCBSRUFEQUhFQURfQlVGU0laRSk7Ci0JaWYgKGwgPT0gTlVMTCB8fCBQeVN0cmluZ19HRVRfU0laRShsKSA9PSAwKSB7Ci0JCVB5X1hERUNSRUYobCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbDsKKyAgICBsID0gcmVhZGFoZWFkX2dldF9saW5lX3NraXAoZiwgMCwgUkVBREFIRUFEX0JVRlNJWkUpOworICAgIGlmIChsID09IE5VTEwgfHwgUHlTdHJpbmdfR0VUX1NJWkUobCkgPT0gMCkgeworICAgICAgICBQeV9YREVDUkVGKGwpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWw7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCXN0YXRpYyBQeU9iamVjdCAqbm90X3lldF9zdHJpbmc7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgc3RhdGljIFB5T2JqZWN0ICpub3RfeWV0X3N0cmluZzsKIAotCWFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKIAotCWlmIChub3RfeWV0X3N0cmluZyA9PSBOVUxMKSB7Ci0JCW5vdF95ZXRfc3RyaW5nID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiPHVuaW5pdGlhbGl6ZWQgZmlsZT4iKTsKLQkJaWYgKG5vdF95ZXRfc3RyaW5nID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG5vdF95ZXRfc3RyaW5nID09IE5VTEwpIHsKKyAgICAgICAgbm90X3lldF9zdHJpbmcgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCI8dW5pbml0aWFsaXplZCBmaWxlPiIpOworICAgICAgICBpZiAobm90X3lldF9zdHJpbmcgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiAhPSBOVUxMKSB7Ci0JCS8qIEFsd2F5cyBmaWxsIGluIHRoZSBuYW1lIGFuZCBtb2RlLCBzbyB0aGF0IG5vYm9keSBlbHNlCi0JCSAgIG5lZWRzIHRvIHNwZWNpYWwtY2FzZSBOVUxMcyB0aGVyZS4gKi8KLQkJUHlfSU5DUkVGKG5vdF95ZXRfc3RyaW5nKTsKLQkJKChQeUZpbGVPYmplY3QgKilzZWxmKS0+Zl9uYW1lID0gbm90X3lldF9zdHJpbmc7Ci0JCVB5X0lOQ1JFRihub3RfeWV0X3N0cmluZyk7Ci0JCSgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfbW9kZSA9IG5vdF95ZXRfc3RyaW5nOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCSgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfZW5jb2RpbmcgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCSgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfZXJyb3JzID0gUHlfTm9uZTsKLQkJKChQeUZpbGVPYmplY3QgKilzZWxmKS0+d2Vha3JlZmxpc3QgPSBOVUxMOwotCQkoKFB5RmlsZU9iamVjdCAqKXNlbGYpLT51bmxvY2tlZF9jb3VudCA9IDA7Ci0JfQotCXJldHVybiBzZWxmOworICAgIHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIC8qIEFsd2F5cyBmaWxsIGluIHRoZSBuYW1lIGFuZCBtb2RlLCBzbyB0aGF0IG5vYm9keSBlbHNlCisgICAgICAgICAgIG5lZWRzIHRvIHNwZWNpYWwtY2FzZSBOVUxMcyB0aGVyZS4gKi8KKyAgICAgICAgUHlfSU5DUkVGKG5vdF95ZXRfc3RyaW5nKTsKKyAgICAgICAgKChQeUZpbGVPYmplY3QgKilzZWxmKS0+Zl9uYW1lID0gbm90X3lldF9zdHJpbmc7CisgICAgICAgIFB5X0lOQ1JFRihub3RfeWV0X3N0cmluZyk7CisgICAgICAgICgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfbW9kZSA9IG5vdF95ZXRfc3RyaW5nOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfZW5jb2RpbmcgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfZXJyb3JzID0gUHlfTm9uZTsKKyAgICAgICAgKChQeUZpbGVPYmplY3QgKilzZWxmKS0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgICAgICAoKFB5RmlsZU9iamVjdCAqKXNlbGYpLT51bmxvY2tlZF9jb3VudCA9IDA7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiBzdGF0aWMgaW50CiBmaWxlX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeUZpbGVPYmplY3QgKmZvc2VsZiA9IChQeUZpbGVPYmplY3QgKilzZWxmOwotCWludCByZXQgPSAwOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJtb2RlIiwgImJ1ZmZlcmluZyIsIDB9OwotCWNoYXIgKm5hbWUgPSBOVUxMOwotCWNoYXIgKm1vZGUgPSAiciI7Ci0JaW50IGJ1ZnNpemUgPSAtMTsKLQlpbnQgd2lkZWFyZ3VtZW50ID0gMDsKKyAgICBQeUZpbGVPYmplY3QgKmZvc2VsZiA9IChQeUZpbGVPYmplY3QgKilzZWxmOworICAgIGludCByZXQgPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJtb2RlIiwgImJ1ZmZlcmluZyIsIDB9OworICAgIGNoYXIgKm5hbWUgPSBOVUxMOworICAgIGNoYXIgKm1vZGUgPSAiciI7CisgICAgaW50IGJ1ZnNpemUgPSAtMTsKKyAgICBpbnQgd2lkZWFyZ3VtZW50ID0gMDsKICNpZmRlZiBNU19XSU5ET1dTCi0JUHlPYmplY3QgKnBvOworICAgIFB5T2JqZWN0ICpwbzsKICNlbmRpZgogCi0JYXNzZXJ0KFB5RmlsZV9DaGVjayhzZWxmKSk7Ci0JaWYgKGZvc2VsZi0+Zl9mcCAhPSBOVUxMKSB7Ci0JCS8qIEhhdmUgdG8gY2xvc2UgdGhlIGV4aXN0aW5nIGZpbGUgZmlyc3QuICovCi0JCVB5T2JqZWN0ICpjbG9zZXJlc3VsdCA9IGZpbGVfY2xvc2UoZm9zZWxmKTsKLQkJaWYgKGNsb3NlcmVzdWx0ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0RFQ1JFRihjbG9zZXJlc3VsdCk7Ci0JfQorICAgIGFzc2VydChQeUZpbGVfQ2hlY2soc2VsZikpOworICAgIGlmIChmb3NlbGYtPmZfZnAgIT0gTlVMTCkgeworICAgICAgICAvKiBIYXZlIHRvIGNsb3NlIHRoZSBleGlzdGluZyBmaWxlIGZpcnN0LiAqLworICAgICAgICBQeU9iamVjdCAqY2xvc2VyZXN1bHQgPSBmaWxlX2Nsb3NlKGZvc2VsZik7CisgICAgICAgIGlmIChjbG9zZXJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYoY2xvc2VyZXN1bHQpOworICAgIH0KIAogI2lmZGVmIE1TX1dJTkRPV1MKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJVfHNpOmZpbGUiLAotCQkJCQlrd2xpc3QsICZwbywgJm1vZGUsICZidWZzaXplKSkgewotCQl3aWRlYXJndW1lbnQgPSAxOwotCQlpZiAoZmlsbF9maWxlX2ZpZWxkcyhmb3NlbGYsIE5VTEwsIHBvLCBtb2RlLAotCQkJCSAgICAgZmNsb3NlKSA9PSBOVUxMKQotCQkJZ290byBFcnJvcjsKLQl9IGVsc2UgewotCQkvKiBEcm9wIHRoZSBhcmd1bWVudCBwYXJzaW5nIGVycm9yIGFzIG5hcnJvdwotCQkgICBzdHJpbmdzIGFyZSBhbHNvIHZhbGlkLiAqLwotCQlQeUVycl9DbGVhcigpOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJVfHNpOmZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmcG8sICZtb2RlLCAmYnVmc2l6ZSkpIHsKKyAgICAgICAgd2lkZWFyZ3VtZW50ID0gMTsKKyAgICAgICAgaWYgKGZpbGxfZmlsZV9maWVsZHMoZm9zZWxmLCBOVUxMLCBwbywgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBEcm9wIHRoZSBhcmd1bWVudCBwYXJzaW5nIGVycm9yIGFzIG5hcnJvdworICAgICAgICAgICBzdHJpbmdzIGFyZSBhbHNvIHZhbGlkLiAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KICNlbmRpZgogCi0JaWYgKCF3aWRlYXJndW1lbnQpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqb19uYW1lOworICAgIGlmICghd2lkZWFyZ3VtZW50KSB7CisgICAgICAgIFB5T2JqZWN0ICpvX25hbWU7CiAKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgImV0fHNpOmZpbGUiLCBrd2xpc3QsCi0JCQkJCQkgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywKLQkJCQkJCSAmbmFtZSwKLQkJCQkJCSAmbW9kZSwgJmJ1ZnNpemUpKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiZXR8c2k6ZmlsZSIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLCAmYnVmc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhZ2FpbiB0byBnZXQgdGhlIG5hbWUgYXMgYSBQeU9iamVjdCAqLwotICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfHNpOmZpbGUiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZvX25hbWUsICZtb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmc2l6ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICAvKiBXZSBwYXJzZSBhZ2FpbiB0byBnZXQgdGhlIG5hbWUgYXMgYSBQeU9iamVjdCAqLworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xzaTpmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmb19uYW1lLCAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZnNpemUpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKIAotCQlpZiAoZmlsbF9maWxlX2ZpZWxkcyhmb3NlbGYsIE5VTEwsIG9fbmFtZSwgbW9kZSwKLQkJCQkgICAgIGZjbG9zZSkgPT0gTlVMTCkKLQkJCWdvdG8gRXJyb3I7Ci0JfQotCWlmIChvcGVuX3RoZV9maWxlKGZvc2VsZiwgbmFtZSwgbW9kZSkgPT0gTlVMTCkKLQkJZ290byBFcnJvcjsKLQlmb3NlbGYtPmZfc2V0YnVmID0gTlVMTDsKLQlQeUZpbGVfU2V0QnVmU2l6ZShzZWxmLCBidWZzaXplKTsKLQlnb3RvIERvbmU7CisgICAgICAgIGlmIChmaWxsX2ZpbGVfZmllbGRzKGZvc2VsZiwgTlVMTCwgb19uYW1lLCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UpID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBpZiAob3Blbl90aGVfZmlsZShmb3NlbGYsIG5hbWUsIG1vZGUpID09IE5VTEwpCisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgZm9zZWxmLT5mX3NldGJ1ZiA9IE5VTEw7CisgICAgUHlGaWxlX1NldEJ1ZlNpemUoc2VsZiwgYnVmc2l6ZSk7CisgICAgZ290byBEb25lOwogCiBFcnJvcjoKLQlyZXQgPSAtMTsKLQkvKiBmYWxsIHRocm91Z2ggKi8KKyAgICByZXQgPSAtMTsKKyAgICAvKiBmYWxsIHRocm91Z2ggKi8KIERvbmU6Ci0JUHlNZW1fRnJlZShuYW1lKTsgLyogZnJlZSB0aGUgZW5jb2RlZCBzdHJpbmcgKi8KLQlyZXR1cm4gcmV0OworICAgIFB5TWVtX0ZyZWUobmFtZSk7IC8qIGZyZWUgdGhlIGVuY29kZWQgc3RyaW5nICovCisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfVkFSKGZpbGVfZG9jKSA9CkBAIC0yMzU2LDQ2ICsyMzU2LDQ2IEBACiApOwogCiBQeVR5cGVPYmplY3QgUHlGaWxlX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZmlsZSIsCi0Jc2l6ZW9mKFB5RmlsZU9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilmaWxlX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkgCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkgCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZmlsZV9yZXByLCAJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JLyogc29mdHNwYWNlIGlzIHdyaXRhYmxlOiAgd2UgbXVzdCBzdXBwbHkgdHBfc2V0YXR0cm8gKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsIC8qIHRwX2ZsYWdzICovCi0JZmlsZV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCW9mZnNldG9mKFB5RmlsZU9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCShnZXRpdGVyZnVuYylmaWxlX3NlbGYsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZmlsZV9pdGVybmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZmlsZV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JZmlsZV9tZW1iZXJsaXN0LAkJCS8qIHRwX21lbWJlcnMgKi8KLQlmaWxlX2dldHNldGxpc3QsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQlmaWxlX2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JZmlsZV9uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZmlsZSIsCisgICAgc2l6ZW9mKFB5RmlsZU9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilmaWxlX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWZpbGVfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgLyogc29mdHNwYWNlIGlzIHdyaXRhYmxlOiAgd2UgbXVzdCBzdXBwbHkgdHBfc2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAvKiB0cF9mbGFncyAqLworICAgIGZpbGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlGaWxlT2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIChnZXRpdGVyZnVuYylmaWxlX3NlbGYsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZmlsZV9pdGVybmV4dCwgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBmaWxlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBmaWxlX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBmaWxlX2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICBmaWxlX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgZmlsZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogSW50ZXJmYWNlIGZvciB0aGUgJ3NvZnQgc3BhY2UnIGJldHdlZW4gcHJpbnQgaXRlbXMuICovCkBAIC0yNDAzLDM1ICsyNDAzLDM1IEBACiBpbnQKIFB5RmlsZV9Tb2Z0U3BhY2UoUHlPYmplY3QgKmYsIGludCBuZXdmbGFnKQogewotCWxvbmcgb2xkZmxhZyA9IDA7Ci0JaWYgKGYgPT0gTlVMTCkgewotCQkvKiBEbyBub3RoaW5nICovCi0JfQotCWVsc2UgaWYgKFB5RmlsZV9DaGVjayhmKSkgewotCQlvbGRmbGFnID0gKChQeUZpbGVPYmplY3QgKilmKS0+Zl9zb2Z0c3BhY2U7Ci0JCSgoUHlGaWxlT2JqZWN0ICopZiktPmZfc29mdHNwYWNlID0gbmV3ZmxhZzsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICp2OwotCQl2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhmLCAic29mdHNwYWNlIik7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlIHsKLQkJCWlmIChQeUludF9DaGVjayh2KSkKLQkJCQlvbGRmbGFnID0gUHlJbnRfQXNMb25nKHYpOwotCQkJYXNzZXJ0KG9sZGZsYWcgPCBJTlRfTUFYKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJfQotCQl2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbmV3ZmxhZyk7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlIHsKLQkJCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKGYsICJzb2Z0c3BhY2UiLCB2KSAhPSAwKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCX0KLQl9Ci0JcmV0dXJuIChpbnQpb2xkZmxhZzsKKyAgICBsb25nIG9sZGZsYWcgPSAwOworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgLyogRG8gbm90aGluZyAqLworICAgIH0KKyAgICBlbHNlIGlmIChQeUZpbGVfQ2hlY2soZikpIHsKKyAgICAgICAgb2xkZmxhZyA9ICgoUHlGaWxlT2JqZWN0ICopZiktPmZfc29mdHNwYWNlOworICAgICAgICAoKFB5RmlsZU9iamVjdCAqKWYpLT5mX3NvZnRzcGFjZSA9IG5ld2ZsYWc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgdiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZiwgInNvZnRzcGFjZSIpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikpCisgICAgICAgICAgICAgICAgb2xkZmxhZyA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgICAgIGFzc2VydChvbGRmbGFnIDwgSU5UX01BWCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIH0KKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKW5ld2ZsYWcpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhmLCAic29mdHNwYWNlIiwgdikgIT0gMCkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoaW50KW9sZGZsYWc7CiB9CiAKIC8qIEludGVyZmFjZXMgdG8gd3JpdGUgb2JqZWN0cy9zdHJpbmdzIHRvIGZpbGUtbGlrZSBvYmplY3RzICovCkBAIC0yNDM5LDEwNyArMjQzOSwxMDcgQEAKIGludAogUHlGaWxlX1dyaXRlT2JqZWN0KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqZiwgaW50IGZsYWdzKQogewotCVB5T2JqZWN0ICp3cml0ZXIsICp2YWx1ZSwgKmFyZ3MsICpyZXN1bHQ7Ci0JaWYgKGYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAid3JpdGVvYmplY3Qgd2l0aCBOVUxMIGZpbGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIGlmIChQeUZpbGVfQ2hlY2soZikpIHsKLQkJUHlGaWxlT2JqZWN0ICpmb2JqID0gKFB5RmlsZU9iamVjdCAqKSBmOworICAgIFB5T2JqZWN0ICp3cml0ZXIsICp2YWx1ZSwgKmFyZ3MsICpyZXN1bHQ7CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAid3JpdGVvYmplY3Qgd2l0aCBOVUxMIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIGlmIChQeUZpbGVfQ2hlY2soZikpIHsKKyAgICAgICAgUHlGaWxlT2JqZWN0ICpmb2JqID0gKFB5RmlsZU9iamVjdCAqKSBmOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJUHlPYmplY3QgKmVuYyA9IGZvYmotPmZfZW5jb2Rpbmc7Ci0JCWludCByZXN1bHQ7CisgICAgICAgIFB5T2JqZWN0ICplbmMgPSBmb2JqLT5mX2VuY29kaW5nOworICAgICAgICBpbnQgcmVzdWx0OwogI2VuZGlmCi0JCWlmIChmb2JqLT5mX2ZwID09IE5VTEwpIHsKLQkJCWVycl9jbG9zZWQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICBpZiAoZm9iai0+Zl9mcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBlcnJfY2xvc2VkKCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0gICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIFB5X1BSSU5UX1JBVykgJiYKLQkJICAgIFB5VW5pY29kZV9DaGVjayh2KSAmJiBlbmMgIT0gUHlfTm9uZSkgewotCQkJY2hhciAqY2VuYyA9IFB5U3RyaW5nX0FTX1NUUklORyhlbmMpOwotCQkJY2hhciAqZXJyb3JzID0gZm9iai0+Zl9lcnJvcnMgPT0gUHlfTm9uZSA/IAotCQkJICAic3RyaWN0IiA6IFB5U3RyaW5nX0FTX1NUUklORyhmb2JqLT5mX2Vycm9ycyk7Ci0JCQl2YWx1ZSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodiwgY2VuYywgZXJyb3JzKTsKLQkJCWlmICh2YWx1ZSA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJfSBlbHNlIHsKLQkJCXZhbHVlID0gdjsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCX0KLQkJcmVzdWx0ID0gZmlsZV9QeU9iamVjdF9QcmludCh2YWx1ZSwgZm9iaiwgZmxhZ3MpOwotCQlQeV9ERUNSRUYodmFsdWUpOwotCQlyZXR1cm4gcmVzdWx0OworICAgICAgICBpZiAoKGZsYWdzICYgUHlfUFJJTlRfUkFXKSAmJgorICAgICAgICAgICAgUHlVbmljb2RlX0NoZWNrKHYpICYmIGVuYyAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICBjaGFyICpjZW5jID0gUHlTdHJpbmdfQVNfU1RSSU5HKGVuYyk7CisgICAgICAgICAgICBjaGFyICplcnJvcnMgPSBmb2JqLT5mX2Vycm9ycyA9PSBQeV9Ob25lID8KKyAgICAgICAgICAgICAgInN0cmljdCIgOiBQeVN0cmluZ19BU19TVFJJTkcoZm9iai0+Zl9lcnJvcnMpOworICAgICAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHYsIGNlbmMsIGVycm9ycyk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZSA9IHY7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IGZpbGVfUHlPYmplY3RfUHJpbnQodmFsdWUsIGZvYmosIGZsYWdzKTsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICNlbHNlCi0JCXJldHVybiBmaWxlX1B5T2JqZWN0X1ByaW50KHYsIGZvYmosIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIGZpbGVfUHlPYmplY3RfUHJpbnQodiwgZm9iaiwgZmxhZ3MpOwogI2VuZGlmCi0JfQotCXdyaXRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZiwgIndyaXRlIik7Ci0JaWYgKHdyaXRlciA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGZsYWdzICYgUHlfUFJJTlRfUkFXKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2OwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gUHlPYmplY3RfU3RyKHYpOwotCX0KLSAgICAgICAgZWxzZQotCQl2YWx1ZSA9IFB5T2JqZWN0X1JlcHIodik7Ci0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHdyaXRlcik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCB2YWx1ZSk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodmFsdWUpOwotCQlQeV9ERUNSRUYod3JpdGVyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdCh3cml0ZXIsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYodmFsdWUpOwotCVB5X0RFQ1JFRih3cml0ZXIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJldHVybiAwOworICAgIH0KKyAgICB3cml0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGYsICJ3cml0ZSIpOworICAgIGlmICh3cml0ZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChmbGFncyAmIFB5X1BSSU5UX1JBVykgeworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHY7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHZhbHVlID0gUHlPYmplY3RfU3RyKHYpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHZhbHVlID0gUHlPYmplY3RfUmVwcih2KTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYod3JpdGVyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHZhbHVlKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIFB5X0RFQ1JFRih3cml0ZXIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHdyaXRlciwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgUHlfREVDUkVGKHdyaXRlcik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlGaWxlX1dyaXRlU3RyaW5nKGNvbnN0IGNoYXIgKnMsIFB5T2JqZWN0ICpmKQogewogCi0JaWYgKGYgPT0gTlVMTCkgewotCQkvKiBTaG91bGQgYmUgY2F1c2VkIGJ5IGEgcHJlLWV4aXN0aW5nIGVycm9yICovCi0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJIm51bGwgZmlsZSBmb3IgUHlGaWxlX1dyaXRlU3RyaW5nIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZSBpZiAoUHlGaWxlX0NoZWNrKGYpKSB7Ci0JCVB5RmlsZU9iamVjdCAqZm9iaiA9IChQeUZpbGVPYmplY3QgKikgZjsKLQkJRklMRSAqZnAgPSBQeUZpbGVfQXNGaWxlKGYpOwotCQlpZiAoZnAgPT0gTlVMTCkgewotCQkJZXJyX2Nsb3NlZCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmb2JqKQotCQlmcHV0cyhzLCBmcCk7Ci0JCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZm9iaikKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKLQkJaW50IGVycjsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHYsIGYsIFB5X1BSSU5UX1JBVyk7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gLTE7CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICAvKiBTaG91bGQgYmUgY2F1c2VkIGJ5IGEgcHJlLWV4aXN0aW5nIGVycm9yICovCisgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBmaWxlIGZvciBQeUZpbGVfV3JpdGVTdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIGlmIChQeUZpbGVfQ2hlY2soZikpIHsKKyAgICAgICAgUHlGaWxlT2JqZWN0ICpmb2JqID0gKFB5RmlsZU9iamVjdCAqKSBmOworICAgICAgICBGSUxFICpmcCA9IFB5RmlsZV9Bc0ZpbGUoZik7CisgICAgICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBlcnJfY2xvc2VkKCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGZvYmopCisgICAgICAgIGZwdXRzKHMsIGZwKTsKKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmb2JqKQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOworICAgICAgICBpbnQgZXJyOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QodiwgZiwgUHlfUFJJTlRfUkFXKTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKIH0KIAogLyogVHJ5IHRvIGdldCBhIGZpbGUtZGVzY3JpcHRvciBmcm9tIGEgUHl0aG9uIG9iamVjdC4gIElmIHRoZSBvYmplY3QKQEAgLTI1NTEsNTAgKzI1NTEsNTAgQEAKIAogaW50IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IoUHlPYmplY3QgKm8pCiB7Ci0JaW50IGZkOwotCVB5T2JqZWN0ICptZXRoOworICAgIGludCBmZDsKKyAgICBQeU9iamVjdCAqbWV0aDsKIAotCWlmIChQeUludF9DaGVjayhvKSkgewotCQlmZCA9IFB5SW50X0FzTG9uZyhvKTsKLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKG8pKSB7Ci0JCWZkID0gUHlMb25nX0FzTG9uZyhvKTsKLQl9Ci0JZWxzZSBpZiAoKG1ldGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sICJmaWxlbm8iKSkgIT0gTlVMTCkKLQl7Ci0JCVB5T2JqZWN0ICpmbm8gPSBQeUV2YWxfQ2FsbE9iamVjdChtZXRoLCBOVUxMKTsKLQkJUHlfREVDUkVGKG1ldGgpOwotCQlpZiAoZm5vID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5SW50X0NoZWNrKG8pKSB7CisgICAgICAgIGZkID0gUHlJbnRfQXNMb25nKG8pOworICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2sobykpIHsKKyAgICAgICAgZmQgPSBQeUxvbmdfQXNMb25nKG8pOworICAgIH0KKyAgICBlbHNlIGlmICgobWV0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgImZpbGVubyIpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKmZubyA9IFB5RXZhbF9DYWxsT2JqZWN0KG1ldGgsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgICAgIGlmIChmbm8gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpZiAoUHlJbnRfQ2hlY2soZm5vKSkgewotCQkJZmQgPSBQeUludF9Bc0xvbmcoZm5vKTsKLQkJCVB5X0RFQ1JFRihmbm8pOwotCQl9Ci0JCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhmbm8pKSB7Ci0JCQlmZCA9IFB5TG9uZ19Bc0xvbmcoZm5vKTsKLQkJCVB5X0RFQ1JFRihmbm8pOwotCQl9Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImZpbGVubygpIHJldHVybmVkIGEgbm9uLWludGVnZXIiKTsKLQkJCVB5X0RFQ1JFRihmbm8pOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhcmd1bWVudCBtdXN0IGJlIGFuIGludCwgb3IgaGF2ZSBhIGZpbGVubygpIG1ldGhvZC4iKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKGZubykpIHsKKyAgICAgICAgICAgIGZkID0gUHlJbnRfQXNMb25nKGZubyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZm5vKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soZm5vKSkgeworICAgICAgICAgICAgZmQgPSBQeUxvbmdfQXNMb25nKGZubyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZm5vKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGVubygpIHJldHVybmVkIGEgbm9uLWludGVnZXIiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmbm8pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IG11c3QgYmUgYW4gaW50LCBvciBoYXZlIGEgZmlsZW5vKCkgbWV0aG9kLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKGZkIDwgMCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgImZpbGUgZGVzY3JpcHRvciBjYW5ub3QgYmUgYSBuZWdhdGl2ZSBpbnRlZ2VyICglaSkiLAotCQkJICAgICBmZCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIGZkOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZmlsZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSBhIG5lZ2F0aXZlIGludGVnZXIgKCVpKSIsCisgICAgICAgICAgICAgICAgICAgICBmZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGZkOwogfQogCiAvKiBGcm9tIGhlcmUgb24gd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIHJlYWwgZmdldHMgYW5kIGZyZWFkICovCkBAIC0yNjE4LDc5ICsyNjE4LDc5IEBACiBjaGFyICoKIFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhjaGFyICpidWYsIGludCBuLCBGSUxFICpzdHJlYW0sIFB5T2JqZWN0ICpmb2JqKQogewotCWNoYXIgKnAgPSBidWY7Ci0JaW50IGM7Ci0JaW50IG5ld2xpbmV0eXBlcyA9IDA7Ci0JaW50IHNraXBuZXh0bGYgPSAwOwotCWludCB1bml2X25ld2xpbmUgPSAxOworICAgIGNoYXIgKnAgPSBidWY7CisgICAgaW50IGM7CisgICAgaW50IG5ld2xpbmV0eXBlcyA9IDA7CisgICAgaW50IHNraXBuZXh0bGYgPSAwOworICAgIGludCB1bml2X25ld2xpbmUgPSAxOwogCi0JaWYgKGZvYmopIHsKLQkJaWYgKCFQeUZpbGVfQ2hlY2soZm9iaikpIHsKLQkJCWVycm5vID0gRU5YSU87CS8qIFdoYXQgY2FuIHlvdSBkby4uLiAqLwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJdW5pdl9uZXdsaW5lID0gKChQeUZpbGVPYmplY3QgKilmb2JqKS0+Zl91bml2X25ld2xpbmU7Ci0JCWlmICggIXVuaXZfbmV3bGluZSApCi0JCQlyZXR1cm4gZmdldHMoYnVmLCBuLCBzdHJlYW0pOwotCQluZXdsaW5ldHlwZXMgPSAoKFB5RmlsZU9iamVjdCAqKWZvYmopLT5mX25ld2xpbmV0eXBlczsKLQkJc2tpcG5leHRsZiA9ICgoUHlGaWxlT2JqZWN0ICopZm9iaiktPmZfc2tpcG5leHRsZjsKLQl9Ci0JRkxPQ0tGSUxFKHN0cmVhbSk7Ci0JYyA9ICd4JzsgLyogU2h1dCB1cCBnY2Mgd2FybmluZyAqLwotCXdoaWxlICgtLW4gPiAwICYmIChjID0gR0VUQyhzdHJlYW0pKSAhPSBFT0YgKSB7Ci0JCWlmIChza2lwbmV4dGxmICkgewotCQkJc2tpcG5leHRsZiA9IDA7Ci0JCQlpZiAoYyA9PSAnXG4nKSB7Ci0JCQkJLyogU2VlaW5nIGEgXG4gaGVyZSB3aXRoIHNraXBuZXh0bGYgdHJ1ZQotCQkJCSoqIG1lYW5zIHdlIHNhdyBhIFxyIGJlZm9yZS4KLQkJCQkqLwotCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7Ci0JCQkJYyA9IEdFVEMoc3RyZWFtKTsKLQkJCQlpZiAoYyA9PSBFT0YpIGJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSoqIE5vdGUgdGhhdCBjID09IEVPRiBhbHNvIGJyaW5ncyB1cyBoZXJlLAotCQkJCSoqIHNvIHdlJ3JlIG9rYXkgaWYgdGhlIGxhc3QgY2hhciBpbiB0aGUgZmlsZQotCQkJCSoqIGlzIGEgQ1IuCi0JCQkJKi8KLQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKLQkJCX0KLQkJfQotCQlpZiAoYyA9PSAnXHInKSB7Ci0JCQkvKiBBIFxyIGlzIHRyYW5zbGF0ZWQgaW50byBhIFxuLCBhbmQgd2Ugc2tpcAotCQkJKiogYW4gYWRqYWNlbnQgXG4sIGlmIGFueS4gV2UgZG9uJ3Qgc2V0IHRoZQotCQkJKiogbmV3bGluZXR5cGVzIGZsYWcgdW50aWwgd2UndmUgc2VlbiB0aGUgbmV4dCBjaGFyLgotCQkJKi8KLQkJCXNraXBuZXh0bGYgPSAxOwotCQkJYyA9ICdcbic7Ci0JCX0gZWxzZSBpZiAoIGMgPT0gJ1xuJykgewotCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7Ci0JCX0KLQkJKnArKyA9IGM7Ci0JCWlmIChjID09ICdcbicpIGJyZWFrOwotCX0KLQlpZiAoIGMgPT0gRU9GICYmIHNraXBuZXh0bGYgKQotCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKLQlGVU5MT0NLRklMRShzdHJlYW0pOwotCSpwID0gJ1wwJzsKLQlpZiAoZm9iaikgewotCQkoKFB5RmlsZU9iamVjdCAqKWZvYmopLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKLQkJKChQeUZpbGVPYmplY3QgKilmb2JqKS0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKLQl9IGVsc2UgaWYgKCBza2lwbmV4dGxmICkgewotCQkvKiBJZiB3ZSBoYXZlIG5vIGZpbGUgb2JqZWN0IHdlIGNhbm5vdCBzYXZlIHRoZQotCQkqKiBza2lwbmV4dGxmIGZsYWcuIFdlIGhhdmUgdG8gcmVhZGFoZWFkLCB3aGljaAotCQkqKiB3aWxsIGNhdXNlIGEgcGF1c2UgaWYgd2UncmUgcmVhZGluZyBmcm9tIGFuCi0JCSoqIGludGVyYWN0aXZlIHN0cmVhbSwgYnV0IHRoYXQgaXMgdmVyeSB1bmxpa2VseQotCQkqKiB1bmxlc3Mgd2UncmUgZG9pbmcgc29tZXRoaW5nIHNpbGx5IGxpa2UKLQkJKiogZXhlY2ZpbGUoIi9kZXYvdHR5IikuCi0JCSovCi0JCWMgPSBHRVRDKHN0cmVhbSk7Ci0JCWlmICggYyAhPSAnXG4nICkKLQkJCXVuZ2V0YyhjLCBzdHJlYW0pOwotCX0KLQlpZiAocCA9PSBidWYpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBidWY7CisgICAgaWYgKGZvYmopIHsKKyAgICAgICAgaWYgKCFQeUZpbGVfQ2hlY2soZm9iaikpIHsKKyAgICAgICAgICAgIGVycm5vID0gRU5YSU87ICAgICAgICAgICAgICAvKiBXaGF0IGNhbiB5b3UgZG8uLi4gKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHVuaXZfbmV3bGluZSA9ICgoUHlGaWxlT2JqZWN0ICopZm9iaiktPmZfdW5pdl9uZXdsaW5lOworICAgICAgICBpZiAoICF1bml2X25ld2xpbmUgKQorICAgICAgICAgICAgcmV0dXJuIGZnZXRzKGJ1Ziwgbiwgc3RyZWFtKTsKKyAgICAgICAgbmV3bGluZXR5cGVzID0gKChQeUZpbGVPYmplY3QgKilmb2JqKS0+Zl9uZXdsaW5ldHlwZXM7CisgICAgICAgIHNraXBuZXh0bGYgPSAoKFB5RmlsZU9iamVjdCAqKWZvYmopLT5mX3NraXBuZXh0bGY7CisgICAgfQorICAgIEZMT0NLRklMRShzdHJlYW0pOworICAgIGMgPSAneCc7IC8qIFNodXQgdXAgZ2NjIHdhcm5pbmcgKi8KKyAgICB3aGlsZSAoLS1uID4gMCAmJiAoYyA9IEdFVEMoc3RyZWFtKSkgIT0gRU9GICkgeworICAgICAgICBpZiAoc2tpcG5leHRsZiApIHsKKyAgICAgICAgICAgIHNraXBuZXh0bGYgPSAwOworICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIC8qIFNlZWluZyBhIFxuIGhlcmUgd2l0aCBza2lwbmV4dGxmIHRydWUKKyAgICAgICAgICAgICAgICAqKiBtZWFucyB3ZSBzYXcgYSBcciBiZWZvcmUuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOworICAgICAgICAgICAgICAgIGMgPSBHRVRDKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gRU9GKSBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqKiBOb3RlIHRoYXQgYyA9PSBFT0YgYWxzbyBicmluZ3MgdXMgaGVyZSwKKyAgICAgICAgICAgICAgICAqKiBzbyB3ZSdyZSBva2F5IGlmIHRoZSBsYXN0IGNoYXIgaW4gdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAqKiBpcyBhIENSLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gJ1xyJykgeworICAgICAgICAgICAgLyogQSBcciBpcyB0cmFuc2xhdGVkIGludG8gYSBcbiwgYW5kIHdlIHNraXAKKyAgICAgICAgICAgICoqIGFuIGFkamFjZW50IFxuLCBpZiBhbnkuIFdlIGRvbid0IHNldCB0aGUKKyAgICAgICAgICAgICoqIG5ld2xpbmV0eXBlcyBmbGFnIHVudGlsIHdlJ3ZlIHNlZW4gdGhlIG5leHQgY2hhci4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBza2lwbmV4dGxmID0gMTsKKyAgICAgICAgICAgIGMgPSAnXG4nOworICAgICAgICB9IGVsc2UgaWYgKCBjID09ICdcbicpIHsKKyAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0xGOworICAgICAgICB9CisgICAgICAgICpwKysgPSBjOworICAgICAgICBpZiAoYyA9PSAnXG4nKSBicmVhazsKKyAgICB9CisgICAgaWYgKCBjID09IEVPRiAmJiBza2lwbmV4dGxmICkKKyAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgRlVOTE9DS0ZJTEUoc3RyZWFtKTsKKyAgICAqcCA9ICdcMCc7CisgICAgaWYgKGZvYmopIHsKKyAgICAgICAgKChQeUZpbGVPYmplY3QgKilmb2JqKS0+Zl9uZXdsaW5ldHlwZXMgPSBuZXdsaW5ldHlwZXM7CisgICAgICAgICgoUHlGaWxlT2JqZWN0ICopZm9iaiktPmZfc2tpcG5leHRsZiA9IHNraXBuZXh0bGY7CisgICAgfSBlbHNlIGlmICggc2tpcG5leHRsZiApIHsKKyAgICAgICAgLyogSWYgd2UgaGF2ZSBubyBmaWxlIG9iamVjdCB3ZSBjYW5ub3Qgc2F2ZSB0aGUKKyAgICAgICAgKiogc2tpcG5leHRsZiBmbGFnLiBXZSBoYXZlIHRvIHJlYWRhaGVhZCwgd2hpY2gKKyAgICAgICAgKiogd2lsbCBjYXVzZSBhIHBhdXNlIGlmIHdlJ3JlIHJlYWRpbmcgZnJvbSBhbgorICAgICAgICAqKiBpbnRlcmFjdGl2ZSBzdHJlYW0sIGJ1dCB0aGF0IGlzIHZlcnkgdW5saWtlbHkKKyAgICAgICAgKiogdW5sZXNzIHdlJ3JlIGRvaW5nIHNvbWV0aGluZyBzaWxseSBsaWtlCisgICAgICAgICoqIGV4ZWNmaWxlKCIvZGV2L3R0eSIpLgorICAgICAgICAqLworICAgICAgICBjID0gR0VUQyhzdHJlYW0pOworICAgICAgICBpZiAoIGMgIT0gJ1xuJyApCisgICAgICAgICAgICB1bmdldGMoYywgc3RyZWFtKTsKKyAgICB9CisgICAgaWYgKHAgPT0gYnVmKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gYnVmOwogfQogCiAvKgpAQCAtMjcwNSw3NCArMjcwNSw3NCBAQAogKi8KIHNpemVfdAogUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKGNoYXIgKmJ1Ziwgc2l6ZV90IG4sCi0JCQkgRklMRSAqc3RyZWFtLCBQeU9iamVjdCAqZm9iaikKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpzdHJlYW0sIFB5T2JqZWN0ICpmb2JqKQogewotCWNoYXIgKmRzdCA9IGJ1ZjsKLQlQeUZpbGVPYmplY3QgKmYgPSAoUHlGaWxlT2JqZWN0ICopZm9iajsKLQlpbnQgbmV3bGluZXR5cGVzLCBza2lwbmV4dGxmOworICAgIGNoYXIgKmRzdCA9IGJ1ZjsKKyAgICBQeUZpbGVPYmplY3QgKmYgPSAoUHlGaWxlT2JqZWN0ICopZm9iajsKKyAgICBpbnQgbmV3bGluZXR5cGVzLCBza2lwbmV4dGxmOwogCi0JYXNzZXJ0KGJ1ZiAhPSBOVUxMKTsKLQlhc3NlcnQoc3RyZWFtICE9IE5VTEwpOworICAgIGFzc2VydChidWYgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0cmVhbSAhPSBOVUxMKTsKIAotCWlmICghZm9iaiB8fCAhUHlGaWxlX0NoZWNrKGZvYmopKSB7Ci0JCWVycm5vID0gRU5YSU87CS8qIFdoYXQgY2FuIHlvdSBkby4uLiAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFmLT5mX3VuaXZfbmV3bGluZSkKLQkJcmV0dXJuIGZyZWFkKGJ1ZiwgMSwgbiwgc3RyZWFtKTsKLQluZXdsaW5ldHlwZXMgPSBmLT5mX25ld2xpbmV0eXBlczsKLQlza2lwbmV4dGxmID0gZi0+Zl9za2lwbmV4dGxmOwotCS8qIEludmFyaWFudDogIG4gaXMgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgdG8gYmUgZmlsbGVkCi0JICogaW4gdGhlIGJ1ZmZlci4KLQkgKi8KLQl3aGlsZSAobikgewotCQlzaXplX3QgbnJlYWQ7Ci0JCWludCBzaG9ydHJlYWQ7Ci0JCWNoYXIgKnNyYyA9IGRzdDsKKyAgICBpZiAoIWZvYmogfHwgIVB5RmlsZV9DaGVjayhmb2JqKSkgeworICAgICAgICBlcnJubyA9IEVOWElPOyAgICAgICAgICAvKiBXaGF0IGNhbiB5b3UgZG8uLi4gKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghZi0+Zl91bml2X25ld2xpbmUpCisgICAgICAgIHJldHVybiBmcmVhZChidWYsIDEsIG4sIHN0cmVhbSk7CisgICAgbmV3bGluZXR5cGVzID0gZi0+Zl9uZXdsaW5ldHlwZXM7CisgICAgc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKKyAgICAvKiBJbnZhcmlhbnQ6ICBuIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIGZpbGxlZAorICAgICAqIGluIHRoZSBidWZmZXIuCisgICAgICovCisgICAgd2hpbGUgKG4pIHsKKyAgICAgICAgc2l6ZV90IG5yZWFkOworICAgICAgICBpbnQgc2hvcnRyZWFkOworICAgICAgICBjaGFyICpzcmMgPSBkc3Q7CiAKLQkJbnJlYWQgPSBmcmVhZChkc3QsIDEsIG4sIHN0cmVhbSk7Ci0JCWFzc2VydChucmVhZCA8PSBuKTsKLQkJaWYgKG5yZWFkID09IDApCi0JCQlicmVhazsKKyAgICAgICAgbnJlYWQgPSBmcmVhZChkc3QsIDEsIG4sIHN0cmVhbSk7CisgICAgICAgIGFzc2VydChucmVhZCA8PSBuKTsKKyAgICAgICAgaWYgKG5yZWFkID09IDApCisgICAgICAgICAgICBicmVhazsKIAotCQluIC09IG5yZWFkOyAvKiBhc3N1bWluZyAxIGJ5dGUgb3V0IGZvciBlYWNoIGluOyB3aWxsIGFkanVzdCAqLwotCQlzaG9ydHJlYWQgPSBuICE9IDA7CS8qIHRydWUgaWZmIEVPRiBvciBlcnJvciAqLwotCQl3aGlsZSAobnJlYWQtLSkgewotCQkJY2hhciBjID0gKnNyYysrOwotCQkJaWYgKGMgPT0gJ1xyJykgewotCQkJCS8qIFNhdmUgYXMgTEYgYW5kIHNldCBmbGFnIHRvIHNraXAgbmV4dCBMRi4gKi8KLQkJCQkqZHN0KysgPSAnXG4nOwotCQkJCXNraXBuZXh0bGYgPSAxOwotCQkJfQotCQkJZWxzZSBpZiAoc2tpcG5leHRsZiAmJiBjID09ICdcbicpIHsKLQkJCQkvKiBTa2lwIExGLCBhbmQgcmVtZW1iZXIgd2Ugc2F3IENSIExGLiAqLwotCQkJCXNraXBuZXh0bGYgPSAwOwotCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7Ci0JCQkJKytuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogTm9ybWFsIGNoYXIgdG8gYmUgc3RvcmVkIGluIGJ1ZmZlci4gIEFsc28KLQkJCQkgKiB1cGRhdGUgdGhlIG5ld2xpbmV0eXBlcyBmbGFnIGlmIGVpdGhlciB0aGlzCi0JCQkJICogaXMgYW4gTEYgb3IgdGhlIHByZXZpb3VzIGNoYXIgd2FzIGEgQ1IuCi0JCQkJICovCi0JCQkJaWYgKGMgPT0gJ1xuJykKLQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7Ci0JCQkJZWxzZSBpZiAoc2tpcG5leHRsZikKLQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCQkJKmRzdCsrID0gYzsKLQkJCQlza2lwbmV4dGxmID0gMDsKLQkJCX0KLQkJfQotCQlpZiAoc2hvcnRyZWFkKSB7Ci0JCQkvKiBJZiB0aGlzIGlzIEVPRiwgdXBkYXRlIHR5cGUgZmxhZ3MuICovCi0JCQlpZiAoc2tpcG5leHRsZiAmJiBmZW9mKHN0cmVhbSkpCi0JCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKLQlmLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOwotCXJldHVybiBkc3QgLSBidWY7CisgICAgICAgIG4gLT0gbnJlYWQ7IC8qIGFzc3VtaW5nIDEgYnl0ZSBvdXQgZm9yIGVhY2ggaW47IHdpbGwgYWRqdXN0ICovCisgICAgICAgIHNob3J0cmVhZCA9IG4gIT0gMDsgICAgICAgICAgICAgLyogdHJ1ZSBpZmYgRU9GIG9yIGVycm9yICovCisgICAgICAgIHdoaWxlIChucmVhZC0tKSB7CisgICAgICAgICAgICBjaGFyIGMgPSAqc3JjKys7CisgICAgICAgICAgICBpZiAoYyA9PSAnXHInKSB7CisgICAgICAgICAgICAgICAgLyogU2F2ZSBhcyBMRiBhbmQgc2V0IGZsYWcgdG8gc2tpcCBuZXh0IExGLiAqLworICAgICAgICAgICAgICAgICpkc3QrKyA9ICdcbic7CisgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChza2lwbmV4dGxmICYmIGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIC8qIFNraXAgTEYsIGFuZCByZW1lbWJlciB3ZSBzYXcgQ1IgTEYuICovCisgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDA7CisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1JMRjsKKyAgICAgICAgICAgICAgICArK247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBOb3JtYWwgY2hhciB0byBiZSBzdG9yZWQgaW4gYnVmZmVyLiAgQWxzbworICAgICAgICAgICAgICAgICAqIHVwZGF0ZSB0aGUgbmV3bGluZXR5cGVzIGZsYWcgaWYgZWl0aGVyIHRoaXMKKyAgICAgICAgICAgICAgICAgKiBpcyBhbiBMRiBvciB0aGUgcHJldmlvdXMgY2hhciB3YXMgYSBDUi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9MRjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChza2lwbmV4dGxmKQorICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBjOworICAgICAgICAgICAgICAgIHNraXBuZXh0bGYgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzaG9ydHJlYWQpIHsKKyAgICAgICAgICAgIC8qIElmIHRoaXMgaXMgRU9GLCB1cGRhdGUgdHlwZSBmbGFncy4gKi8KKyAgICAgICAgICAgIGlmIChza2lwbmV4dGxmICYmIGZlb2Yoc3RyZWFtKSkKKyAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGYtPmZfbmV3bGluZXR5cGVzID0gbmV3bGluZXR5cGVzOworICAgIGYtPmZfc2tpcG5leHRsZiA9IHNraXBuZXh0bGY7CisgICAgcmV0dXJuIGRzdCAtIGJ1ZjsKIH0KIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMgYi9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKaW5kZXggZDZhNWEzNS4uNjgyYmFmYiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mbG9hdG9iamVjdC5jCisrKyBiL09iamVjdHMvZmxvYXRvYmplY3QuYwpAQCAtMjEsMTMgKzIxLDEzIEBACiAjZW5kaWYKIAogLyogU3BlY2lhbCBmcmVlIGxpc3QgLS0gc2VlIGNvbW1lbnRzIGZvciBzYW1lIGNvZGUgaW4gaW50b2JqZWN0LmMuICovCi0jZGVmaW5lIEJMT0NLX1NJWkUJMTAwMAkvKiAxSyBsZXNzIHR5cGljYWwgbWFsbG9jIG92ZXJoZWFkICovCi0jZGVmaW5lIEJIRUFEX1NJWkUJOAkvKiBFbm91Z2ggZm9yIGEgNjQtYml0IHBvaW50ZXIgKi8KLSNkZWZpbmUgTl9GTE9BVE9CSkVDVFMJKChCTE9DS19TSVpFIC0gQkhFQURfU0laRSkgLyBzaXplb2YoUHlGbG9hdE9iamVjdCkpCisjZGVmaW5lIEJMT0NLX1NJWkUgICAgICAxMDAwICAgIC8qIDFLIGxlc3MgdHlwaWNhbCBtYWxsb2Mgb3ZlcmhlYWQgKi8KKyNkZWZpbmUgQkhFQURfU0laRSAgICAgIDggICAgICAgLyogRW5vdWdoIGZvciBhIDY0LWJpdCBwb2ludGVyICovCisjZGVmaW5lIE5fRkxPQVRPQkpFQ1RTICAoKEJMT0NLX1NJWkUgLSBCSEVBRF9TSVpFKSAvIHNpemVvZihQeUZsb2F0T2JqZWN0KSkKIAogc3RydWN0IF9mbG9hdGJsb2NrIHsKLQlzdHJ1Y3QgX2Zsb2F0YmxvY2sgKm5leHQ7Ci0JUHlGbG9hdE9iamVjdCBvYmplY3RzW05fRkxPQVRPQkpFQ1RTXTsKKyAgICBzdHJ1Y3QgX2Zsb2F0YmxvY2sgKm5leHQ7CisgICAgUHlGbG9hdE9iamVjdCBvYmplY3RzW05fRkxPQVRPQkpFQ1RTXTsKIH07CiAKIHR5cGVkZWYgc3RydWN0IF9mbG9hdGJsb2NrIFB5RmxvYXRCbG9jazsKQEAgLTM4LDMxICszOCwzMSBAQAogc3RhdGljIFB5RmxvYXRPYmplY3QgKgogZmlsbF9mcmVlX2xpc3Qodm9pZCkKIHsKLQlQeUZsb2F0T2JqZWN0ICpwLCAqcTsKLQkvKiBYWFggRmxvYXQgYmxvY2tzIGVzY2FwZSB0aGUgb2JqZWN0IGhlYXAuIFVzZSBQeU9iamVjdF9NQUxMT0MgPz8/ICovCi0JcCA9IChQeUZsb2F0T2JqZWN0ICopIFB5TWVtX01BTExPQyhzaXplb2YoUHlGbG9hdEJsb2NrKSk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIChQeUZsb2F0T2JqZWN0ICopIFB5RXJyX05vTWVtb3J5KCk7Ci0JKChQeUZsb2F0QmxvY2sgKilwKS0+bmV4dCA9IGJsb2NrX2xpc3Q7Ci0JYmxvY2tfbGlzdCA9IChQeUZsb2F0QmxvY2sgKilwOwotCXAgPSAmKChQeUZsb2F0QmxvY2sgKilwKS0+b2JqZWN0c1swXTsKLQlxID0gcCArIE5fRkxPQVRPQkpFQ1RTOwotCXdoaWxlICgtLXEgPiBwKQotCQlQeV9UWVBFKHEpID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKShxLTEpOwotCVB5X1RZUEUocSkgPSBOVUxMOwotCXJldHVybiBwICsgTl9GTE9BVE9CSkVDVFMgLSAxOworICAgIFB5RmxvYXRPYmplY3QgKnAsICpxOworICAgIC8qIFhYWCBGbG9hdCBibG9ja3MgZXNjYXBlIHRoZSBvYmplY3QgaGVhcC4gVXNlIFB5T2JqZWN0X01BTExPQyA/Pz8gKi8KKyAgICBwID0gKFB5RmxvYXRPYmplY3QgKikgUHlNZW1fTUFMTE9DKHNpemVvZihQeUZsb2F0QmxvY2spKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKFB5RmxvYXRPYmplY3QgKikgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAoKFB5RmxvYXRCbG9jayAqKXApLT5uZXh0ID0gYmxvY2tfbGlzdDsKKyAgICBibG9ja19saXN0ID0gKFB5RmxvYXRCbG9jayAqKXA7CisgICAgcCA9ICYoKFB5RmxvYXRCbG9jayAqKXApLT5vYmplY3RzWzBdOworICAgIHEgPSBwICsgTl9GTE9BVE9CSkVDVFM7CisgICAgd2hpbGUgKC0tcSA+IHApCisgICAgICAgIFB5X1RZUEUocSkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopKHEtMSk7CisgICAgUHlfVFlQRShxKSA9IE5VTEw7CisgICAgcmV0dXJuIHAgKyBOX0ZMT0FUT0JKRUNUUyAtIDE7CiB9CiAKIGRvdWJsZQogUHlGbG9hdF9HZXRNYXgodm9pZCkKIHsKLQlyZXR1cm4gREJMX01BWDsKKyAgICByZXR1cm4gREJMX01BWDsKIH0KIAogZG91YmxlCiBQeUZsb2F0X0dldE1pbih2b2lkKQogewotCXJldHVybiBEQkxfTUlOOworICAgIHJldHVybiBEQkxfTUlOOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZsb2F0SW5mb1R5cGUgPSB7MCwgMCwgMCwgMCwgMCwgMH07CkBAIC03NSw4MyArNzUsODMgQEAKIHlvdXIgc3lzdGVtJ3MgOmZpbGU6YGZsb2F0LmhgIGZvciBtb3JlIGluZm9ybWF0aW9uLiIpOwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCBmbG9hdGluZm9fZmllbGRzW10gPSB7Ci0JeyJtYXgiLAkJIkRCTF9NQVggLS0gbWF4aW11bSByZXByZXNlbnRhYmxlIGZpbml0ZSBmbG9hdCJ9LAotCXsibWF4X2V4cCIsCSJEQkxfTUFYX0VYUCAtLSBtYXhpbXVtIGludCBlIHN1Y2ggdGhhdCByYWRpeCoqKGUtMSkgIgotCQkJImlzIHJlcHJlc2VudGFibGUifSwKLQl7Im1heF8xMF9leHAiLAkiREJMX01BWF8xMF9FWFAgLS0gbWF4aW11bSBpbnQgZSBzdWNoIHRoYXQgMTAqKmUgIgotCQkJImlzIHJlcHJlc2VudGFibGUifSwKLQl7Im1pbiIsCQkiREJMX01JTiAtLSBNaW5pbXVtIHBvc2l0aXZlIG5vcm1hbGl6ZXIgZmxvYXQifSwKLQl7Im1pbl9leHAiLAkiREJMX01JTl9FWFAgLS0gbWluaW11bSBpbnQgZSBzdWNoIHRoYXQgcmFkaXgqKihlLTEpICIKLQkJCSJpcyBhIG5vcm1hbGl6ZWQgZmxvYXQifSwKLQl7Im1pbl8xMF9leHAiLAkiREJMX01JTl8xMF9FWFAgLS0gbWluaW11bSBpbnQgZSBzdWNoIHRoYXQgMTAqKmUgaXMgIgotCQkJImEgbm9ybWFsaXplZCJ9LAotCXsiZGlnIiwJCSJEQkxfRElHIC0tIGRpZ2l0cyJ9LAotCXsibWFudF9kaWciLAkiREJMX01BTlRfRElHIC0tIG1hbnRpc3NhIGRpZ2l0cyJ9LAotCXsiZXBzaWxvbiIsCSJEQkxfRVBTSUxPTiAtLSBEaWZmZXJlbmNlIGJldHdlZW4gMSBhbmQgdGhlIG5leHQgIgotCQkJInJlcHJlc2VudGFibGUgZmxvYXQifSwKLQl7InJhZGl4IiwJIkZMVF9SQURJWCAtLSByYWRpeCBvZiBleHBvbmVudCJ9LAotCXsicm91bmRzIiwJIkZMVF9ST1VORFMgLS0gYWRkaXRpb24gcm91bmRzIn0sCi0JezB9CisgICAgeyJtYXgiLCAgICAgICAgICAgICAiREJMX01BWCAtLSBtYXhpbXVtIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0In0sCisgICAgeyJtYXhfZXhwIiwgICAgICAgICAiREJMX01BWF9FWFAgLS0gbWF4aW11bSBpbnQgZSBzdWNoIHRoYXQgcmFkaXgqKihlLTEpICIKKyAgICAgICAgICAgICAgICAgICAgImlzIHJlcHJlc2VudGFibGUifSwKKyAgICB7Im1heF8xMF9leHAiLCAgICAgICJEQkxfTUFYXzEwX0VYUCAtLSBtYXhpbXVtIGludCBlIHN1Y2ggdGhhdCAxMCoqZSAiCisgICAgICAgICAgICAgICAgICAgICJpcyByZXByZXNlbnRhYmxlIn0sCisgICAgeyJtaW4iLCAgICAgICAgICAgICAiREJMX01JTiAtLSBNaW5pbXVtIHBvc2l0aXZlIG5vcm1hbGl6ZXIgZmxvYXQifSwKKyAgICB7Im1pbl9leHAiLCAgICAgICAgICJEQkxfTUlOX0VYUCAtLSBtaW5pbXVtIGludCBlIHN1Y2ggdGhhdCByYWRpeCoqKGUtMSkgIgorICAgICAgICAgICAgICAgICAgICAiaXMgYSBub3JtYWxpemVkIGZsb2F0In0sCisgICAgeyJtaW5fMTBfZXhwIiwgICAgICAiREJMX01JTl8xMF9FWFAgLS0gbWluaW11bSBpbnQgZSBzdWNoIHRoYXQgMTAqKmUgaXMgIgorICAgICAgICAgICAgICAgICAgICAiYSBub3JtYWxpemVkIn0sCisgICAgeyJkaWciLCAgICAgICAgICAgICAiREJMX0RJRyAtLSBkaWdpdHMifSwKKyAgICB7Im1hbnRfZGlnIiwgICAgICAgICJEQkxfTUFOVF9ESUcgLS0gbWFudGlzc2EgZGlnaXRzIn0sCisgICAgeyJlcHNpbG9uIiwgICAgICAgICAiREJMX0VQU0lMT04gLS0gRGlmZmVyZW5jZSBiZXR3ZWVuIDEgYW5kIHRoZSBuZXh0ICIKKyAgICAgICAgICAgICAgICAgICAgInJlcHJlc2VudGFibGUgZmxvYXQifSwKKyAgICB7InJhZGl4IiwgICAgICAgICAgICJGTFRfUkFESVggLS0gcmFkaXggb2YgZXhwb25lbnQifSwKKyAgICB7InJvdW5kcyIsICAgICAgICAgICJGTFRfUk9VTkRTIC0tIGFkZGl0aW9uIHJvdW5kcyJ9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyBmbG9hdGluZm9fZGVzYyA9IHsKLQkic3lzLmZsb2F0X2luZm8iLAkvKiBuYW1lICovCi0JZmxvYXRpbmZvX19kb2NfXywJLyogZG9jICovCi0JZmxvYXRpbmZvX2ZpZWxkcywJLyogZmllbGRzICovCi0JMTEKKyAgICAic3lzLmZsb2F0X2luZm8iLCAgICAgICAgICAgLyogbmFtZSAqLworICAgIGZsb2F0aW5mb19fZG9jX18sICAgICAgICAgICAvKiBkb2MgKi8KKyAgICBmbG9hdGluZm9fZmllbGRzLCAgICAgICAgICAgLyogZmllbGRzICovCisgICAgMTEKIH07CiAKIFB5T2JqZWN0ICoKIFB5RmxvYXRfR2V0SW5mbyh2b2lkKQogewotCVB5T2JqZWN0KiBmbG9hdGluZm87Ci0JaW50IHBvcyA9IDA7CisgICAgUHlPYmplY3QqIGZsb2F0aW5mbzsKKyAgICBpbnQgcG9zID0gMDsKIAotCWZsb2F0aW5mbyA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZGbG9hdEluZm9UeXBlKTsKLQlpZiAoZmxvYXRpbmZvID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGZsb2F0aW5mbyA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZGbG9hdEluZm9UeXBlKTsKKyAgICBpZiAoZmxvYXRpbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjZGVmaW5lIFNldEludEZsYWcoZmxhZykgXAotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0oZmxvYXRpbmZvLCBwb3MrKywgUHlJbnRfRnJvbUxvbmcoZmxhZykpCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShmbG9hdGluZm8sIHBvcysrLCBQeUludF9Gcm9tTG9uZyhmbGFnKSkKICNkZWZpbmUgU2V0RGJsRmxhZyhmbGFnKSBcCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShmbG9hdGluZm8sIHBvcysrLCBQeUZsb2F0X0Zyb21Eb3VibGUoZmxhZykpCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShmbG9hdGluZm8sIHBvcysrLCBQeUZsb2F0X0Zyb21Eb3VibGUoZmxhZykpCiAKLQlTZXREYmxGbGFnKERCTF9NQVgpOwotCVNldEludEZsYWcoREJMX01BWF9FWFApOwotCVNldEludEZsYWcoREJMX01BWF8xMF9FWFApOwotCVNldERibEZsYWcoREJMX01JTik7Ci0JU2V0SW50RmxhZyhEQkxfTUlOX0VYUCk7Ci0JU2V0SW50RmxhZyhEQkxfTUlOXzEwX0VYUCk7Ci0JU2V0SW50RmxhZyhEQkxfRElHKTsKLQlTZXRJbnRGbGFnKERCTF9NQU5UX0RJRyk7Ci0JU2V0RGJsRmxhZyhEQkxfRVBTSUxPTik7Ci0JU2V0SW50RmxhZyhGTFRfUkFESVgpOwotCVNldEludEZsYWcoRkxUX1JPVU5EUyk7CisgICAgU2V0RGJsRmxhZyhEQkxfTUFYKTsKKyAgICBTZXRJbnRGbGFnKERCTF9NQVhfRVhQKTsKKyAgICBTZXRJbnRGbGFnKERCTF9NQVhfMTBfRVhQKTsKKyAgICBTZXREYmxGbGFnKERCTF9NSU4pOworICAgIFNldEludEZsYWcoREJMX01JTl9FWFApOworICAgIFNldEludEZsYWcoREJMX01JTl8xMF9FWFApOworICAgIFNldEludEZsYWcoREJMX0RJRyk7CisgICAgU2V0SW50RmxhZyhEQkxfTUFOVF9ESUcpOworICAgIFNldERibEZsYWcoREJMX0VQU0lMT04pOworICAgIFNldEludEZsYWcoRkxUX1JBRElYKTsKKyAgICBTZXRJbnRGbGFnKEZMVF9ST1VORFMpOwogI3VuZGVmIFNldEludEZsYWcKICN1bmRlZiBTZXREYmxGbGFnCi0JCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfQ0xFQVIoZmxvYXRpbmZvKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBmbG9hdGluZm87CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9DTEVBUihmbG9hdGluZm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGZsb2F0aW5mbzsKIH0KIAogUHlPYmplY3QgKgogUHlGbG9hdF9Gcm9tRG91YmxlKGRvdWJsZSBmdmFsKQogewotCXJlZ2lzdGVyIFB5RmxvYXRPYmplY3QgKm9wOwotCWlmIChmcmVlX2xpc3QgPT0gTlVMTCkgewotCQlpZiAoKGZyZWVfbGlzdCA9IGZpbGxfZnJlZV9saXN0KCkpID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLwotCW9wID0gZnJlZV9saXN0OwotCWZyZWVfbGlzdCA9IChQeUZsb2F0T2JqZWN0ICopUHlfVFlQRShvcCk7Ci0JUHlPYmplY3RfSU5JVChvcCwgJlB5RmxvYXRfVHlwZSk7Ci0Jb3AtPm9iX2Z2YWwgPSBmdmFsOwotCXJldHVybiAoUHlPYmplY3QgKikgb3A7CisgICAgcmVnaXN0ZXIgUHlGbG9hdE9iamVjdCAqb3A7CisgICAgaWYgKGZyZWVfbGlzdCA9PSBOVUxMKSB7CisgICAgICAgIGlmICgoZnJlZV9saXN0ID0gZmlsbF9mcmVlX2xpc3QoKSkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBJbmxpbmUgUHlPYmplY3RfTmV3ICovCisgICAgb3AgPSBmcmVlX2xpc3Q7CisgICAgZnJlZV9saXN0ID0gKFB5RmxvYXRPYmplY3QgKilQeV9UWVBFKG9wKTsKKyAgICBQeU9iamVjdF9JTklUKG9wLCAmUHlGbG9hdF9UeXBlKTsKKyAgICBvcC0+b2JfZnZhbCA9IGZ2YWw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNzMsMTEzICsxNzMsMTEzIEBACiBQeU9iamVjdCAqCiBQeUZsb2F0X0Zyb21TdHJpbmcoUHlPYmplY3QgKnYsIGNoYXIgKipwZW5kKQogewotCWNvbnN0IGNoYXIgKnMsICpsYXN0LCAqZW5kOwotCWRvdWJsZSB4OwotCWNoYXIgYnVmZmVyWzI1Nl07IC8qIGZvciBlcnJvcnMgKi8KKyAgICBjb25zdCBjaGFyICpzLCAqbGFzdCwgKmVuZDsKKyAgICBkb3VibGUgeDsKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOyAvKiBmb3IgZXJyb3JzICovCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWNoYXIgKnNfYnVmZmVyID0gTlVMTDsKKyAgICBjaGFyICpzX2J1ZmZlciA9IE5VTEw7CiAjZW5kaWYKLQlQeV9zc2l6ZV90IGxlbjsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCWlmIChwZW5kKQotCQkqcGVuZCA9IE5VTEw7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCXMgPSBQeVN0cmluZ19BU19TVFJJTkcodik7Ci0JCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCX0KKyAgICBpZiAocGVuZCkKKyAgICAgICAgKnBlbmQgPSBOVUxMOworICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpOworICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQlzX2J1ZmZlciA9IChjaGFyICopUHlNZW1fTUFMTE9DKFB5VW5pY29kZV9HRVRfU0laRSh2KSsxKTsKLQkJaWYgKHNfYnVmZmVyID09IE5VTEwpCi0JCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJaWYgKFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsKFB5VW5pY29kZV9BU19VTklDT0RFKHYpLAotCQkJCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHYpLAotCQkJCQkgICAgc19idWZmZXIsCi0JCQkJCSAgICBOVUxMKSkKLQkJCWdvdG8gZXJyb3I7Ci0JCXMgPSBzX2J1ZmZlcjsKLQkJbGVuID0gc3RybGVuKHMpOwotCX0KKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgc19idWZmZXIgPSAoY2hhciAqKVB5TWVtX01BTExPQyhQeVVuaWNvZGVfR0VUX1NJWkUodikrMSk7CisgICAgICAgIGlmIChzX2J1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGlmIChQeVVuaWNvZGVfRW5jb2RlRGVjaW1hbChQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRSh2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBzID0gc19idWZmZXI7CisgICAgICAgIGxlbiA9IHN0cmxlbihzKTsKKyAgICB9CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodiwgJnMsICZsZW4pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiZmxvYXQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlsYXN0ID0gcyArIGxlbjsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodiwgJnMsICZsZW4pKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiZmxvYXQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsYXN0ID0gcyArIGxlbjsKIAotCXdoaWxlIChQeV9JU1NQQUNFKCpzKSkKLQkJcysrOwotCS8qIFdlIGRvbid0IGNhcmUgYWJvdXQgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LiAgSWYgdGhlIHBsYXRmb3JtCi0JICogc3VwcG9ydHMgdGhlbSwgaW5maW5pdGllcyBhbmQgc2lnbmVkIHplcm9lcyAob24gdW5kZXJmbG93KSBhcmUKLQkgKiBmaW5lLiAqLwotCXggPSBQeU9TX3N0cmluZ190b19kb3VibGUocywgKGNoYXIgKiopJmVuZCwgTlVMTCk7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlnb3RvIGVycm9yOwotCXdoaWxlIChQeV9JU1NQQUNFKCplbmQpKQotCQllbmQrKzsKLQlpZiAoZW5kID09IGxhc3QpCi0JCXJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKLQllbHNlIHsKLQkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgZmxvYXQoKTogJS4yMDBzIiwgcyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOwotCQlyZXN1bHQgPSBOVUxMOwotCX0KKyAgICB3aGlsZSAoUHlfSVNTUEFDRSgqcykpCisgICAgICAgIHMrKzsKKyAgICAvKiBXZSBkb24ndCBjYXJlIGFib3V0IG92ZXJmbG93IG9yIHVuZGVyZmxvdy4gIElmIHRoZSBwbGF0Zm9ybQorICAgICAqIHN1cHBvcnRzIHRoZW0sIGluZmluaXRpZXMgYW5kIHNpZ25lZCB6ZXJvZXMgKG9uIHVuZGVyZmxvdykgYXJlCisgICAgICogZmluZS4gKi8KKyAgICB4ID0gUHlPU19zdHJpbmdfdG9fZG91YmxlKHMsIChjaGFyICoqKSZlbmQsIE5VTEwpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB3aGlsZSAoUHlfSVNTUEFDRSgqZW5kKSkKKyAgICAgICAgZW5kKys7CisgICAgaWYgKGVuZCA9PSBsYXN0KQorICAgICAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgZWxzZSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBmbG9hdCgpOiAlLjIwMHMiLCBzKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgfQogCiAgIGVycm9yOgogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoc19idWZmZXIpCi0JCVB5TWVtX0ZSRUUoc19idWZmZXIpOworICAgIGlmIChzX2J1ZmZlcikKKyAgICAgICAgUHlNZW1fRlJFRShzX2J1ZmZlcik7CiAjZW5kaWYKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyB2b2lkCiBmbG9hdF9kZWFsbG9jKFB5RmxvYXRPYmplY3QgKm9wKQogewotCWlmIChQeUZsb2F0X0NoZWNrRXhhY3Qob3ApKSB7Ci0JCVB5X1RZUEUob3ApID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKWZyZWVfbGlzdDsKLQkJZnJlZV9saXN0ID0gb3A7Ci0JfQotCWVsc2UKLQkJUHlfVFlQRShvcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopb3ApOworICAgIGlmIChQeUZsb2F0X0NoZWNrRXhhY3Qob3ApKSB7CisgICAgICAgIFB5X1RZUEUob3ApID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKWZyZWVfbGlzdDsKKyAgICAgICAgZnJlZV9saXN0ID0gb3A7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfVFlQRShvcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopb3ApOwogfQogCiBkb3VibGUKIFB5RmxvYXRfQXNEb3VibGUoUHlPYmplY3QgKm9wKQogewotCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JUHlGbG9hdE9iamVjdCAqZm87Ci0JZG91YmxlIHZhbDsKKyAgICBQeU51bWJlck1ldGhvZHMgKm5iOworICAgIFB5RmxvYXRPYmplY3QgKmZvOworICAgIGRvdWJsZSB2YWw7CiAKLQlpZiAob3AgJiYgUHlGbG9hdF9DaGVjayhvcCkpCi0JCXJldHVybiBQeUZsb2F0X0FTX0RPVUJMRSgoUHlGbG9hdE9iamVjdCopIG9wKTsKKyAgICBpZiAob3AgJiYgUHlGbG9hdF9DaGVjayhvcCkpCisgICAgICAgIHJldHVybiBQeUZsb2F0X0FTX0RPVUJMRSgoUHlGbG9hdE9iamVjdCopIG9wKTsKIAotCWlmIChvcCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKG9wID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICgobmIgPSBQeV9UWVBFKG9wKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8IG5iLT5uYl9mbG9hdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhIGZsb2F0IGlzIHJlcXVpcmVkIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKChuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwgbmItPm5iX2Zsb2F0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImEgZmxvYXQgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWZvID0gKFB5RmxvYXRPYmplY3QqKSAoKm5iLT5uYl9mbG9hdCkgKG9wKTsKLQlpZiAoZm8gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmICghUHlGbG9hdF9DaGVjayhmbykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibmJfZmxvYXQgc2hvdWxkIHJldHVybiBmbG9hdCBvYmplY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBmbyA9IChQeUZsb2F0T2JqZWN0KikgKCpuYi0+bmJfZmxvYXQpIChvcCk7CisgICAgaWYgKGZvID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIVB5RmxvYXRfQ2hlY2soZm8pKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibmJfZmxvYXQgc2hvdWxkIHJldHVybiBmbG9hdCBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXZhbCA9IFB5RmxvYXRfQVNfRE9VQkxFKGZvKTsKLQlQeV9ERUNSRUYoZm8pOworICAgIHZhbCA9IFB5RmxvYXRfQVNfRE9VQkxFKGZvKTsKKyAgICBQeV9ERUNSRUYoZm8pOwogCi0JcmV0dXJuIHZhbDsKKyAgICByZXR1cm4gdmFsOwogfQogCiAvKiBNZXRob2RzICovCkBAIC0yOTEsMzMgKzI5MSwzMyBAQAogICAgb2JqIGlzIG5vdCBvZiBmbG9hdCwgaW50IG9yIGxvbmcgdHlwZSwgUHlfTm90SW1wbGVtZW50ZWQgaXMgaW5jcmVmJ2VkLAogICAgc3RvcmVkIGluIG9iaiwgYW5kIHJldHVybmVkIGZyb20gdGhlIGZ1bmN0aW9uIGludm9raW5nIHRoaXMgbWFjcm8uCiAqLwotI2RlZmluZSBDT05WRVJUX1RPX0RPVUJMRShvYmosIGRibCkJCQlcCi0JaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkJCQkJXAotCQlkYmwgPSBQeUZsb2F0X0FTX0RPVUJMRShvYmopOwkJXAotCWVsc2UgaWYgKGNvbnZlcnRfdG9fZG91YmxlKCYob2JqKSwgJihkYmwpKSA8IDApCVwKLQkJcmV0dXJuIG9iajsKKyNkZWZpbmUgQ09OVkVSVF9UT19ET1VCTEUob2JqLCBkYmwpICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRibCA9IFB5RmxvYXRfQVNfRE9VQkxFKG9iaik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmIChjb252ZXJ0X3RvX2RvdWJsZSgmKG9iaiksICYoZGJsKSkgPCAwKSAgICAgXAorICAgICAgICByZXR1cm4gb2JqOwogCiBzdGF0aWMgaW50CiBjb252ZXJ0X3RvX2RvdWJsZShQeU9iamVjdCAqKnYsIGRvdWJsZSAqZGJsKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICpvYmogPSAqdjsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqb2JqID0gKnY7CiAKLQlpZiAoUHlJbnRfQ2hlY2sob2JqKSkgewotCQkqZGJsID0gKGRvdWJsZSlQeUludF9BU19MT05HKG9iaik7Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhvYmopKSB7Ci0JCSpkYmwgPSBQeUxvbmdfQXNEb3VibGUob2JqKTsKLQkJaWYgKCpkYmwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkqdiA9IE5VTEw7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCSp2ID0gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKKyAgICAgICAgKmRibCA9IChkb3VibGUpUHlJbnRfQVNfTE9ORyhvYmopOworICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2sob2JqKSkgeworICAgICAgICAqZGJsID0gUHlMb25nX0FzRG91YmxlKG9iaik7CisgICAgICAgIGlmICgqZGJsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgKnYgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICAqdiA9IFB5X05vdEltcGxlbWVudGVkOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBYWFggUHlGbG9hdF9Bc1N0cmluZyBhbmQgUHlGbG9hdF9Bc1JlcHJTdHJpbmcgYXJlIGRlcHJlY2F0ZWQ6CkBAIC0zMjYsNjYgKzMyNiw2NiBAQAogdm9pZAogUHlGbG9hdF9Bc1N0cmluZyhjaGFyICpidWYsIFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JY2hhciAqdG1wID0gUHlPU19kb3VibGVfdG9fc3RyaW5nKHYtPm9iX2Z2YWwsICdnJywKLQkJCVB5RmxvYXRfU1RSX1BSRUNJU0lPTiwKLQkJCVB5X0RUU0ZfQUREX0RPVF8wLCBOVUxMKTsKLQlzdHJjcHkoYnVmLCB0bXApOwotCVB5TWVtX0ZyZWUodG1wKTsKKyAgICBjaGFyICp0bXAgPSBQeU9TX2RvdWJsZV90b19zdHJpbmcodi0+b2JfZnZhbCwgJ2cnLAorICAgICAgICAgICAgICAgICAgICBQeUZsb2F0X1NUUl9QUkVDSVNJT04sCisgICAgICAgICAgICAgICAgICAgIFB5X0RUU0ZfQUREX0RPVF8wLCBOVUxMKTsKKyAgICBzdHJjcHkoYnVmLCB0bXApOworICAgIFB5TWVtX0ZyZWUodG1wKTsKIH0KIAogdm9pZAogUHlGbG9hdF9Bc1JlcHJTdHJpbmcoY2hhciAqYnVmLCBQeUZsb2F0T2JqZWN0ICp2KQogewotCWNoYXIgKiB0bXAgPSBQeU9TX2RvdWJsZV90b19zdHJpbmcodi0+b2JfZnZhbCwgJ3InLCAwLAotCQkJUHlfRFRTRl9BRERfRE9UXzAsIE5VTEwpOwotCXN0cmNweShidWYsIHRtcCk7Ci0JUHlNZW1fRnJlZSh0bXApOworICAgIGNoYXIgKiB0bXAgPSBQeU9TX2RvdWJsZV90b19zdHJpbmcodi0+b2JfZnZhbCwgJ3InLCAwLAorICAgICAgICAgICAgICAgICAgICBQeV9EVFNGX0FERF9ET1RfMCwgTlVMTCk7CisgICAgc3RyY3B5KGJ1ZiwgdG1wKTsKKyAgICBQeU1lbV9GcmVlKHRtcCk7CiB9CiAKIC8qIEFSR1NVU0VEICovCiBzdGF0aWMgaW50CiBmbG9hdF9wcmludChQeUZsb2F0T2JqZWN0ICp2LCBGSUxFICpmcCwgaW50IGZsYWdzKQogewotCWNoYXIgKmJ1ZjsKLQlpZiAoZmxhZ3MgJiBQeV9QUklOVF9SQVcpCi0JCWJ1ZiA9IFB5T1NfZG91YmxlX3RvX3N0cmluZyh2LT5vYl9mdmFsLAotCQkJCQkgICAgJ2cnLCBQeUZsb2F0X1NUUl9QUkVDSVNJT04sCi0JCQkJCSAgICBQeV9EVFNGX0FERF9ET1RfMCwgTlVMTCk7Ci0JZWxzZQotCQlidWYgPSBQeU9TX2RvdWJsZV90b19zdHJpbmcodi0+b2JfZnZhbCwKLQkJCQkgICAgJ3InLCAwLCBQeV9EVFNGX0FERF9ET1RfMCwgTlVMTCk7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwdXRzKGJ1ZiwgZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlNZW1fRnJlZShidWYpOwotCXJldHVybiAwOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpZiAoZmxhZ3MgJiBQeV9QUklOVF9SQVcpCisgICAgICAgIGJ1ZiA9IFB5T1NfZG91YmxlX3RvX3N0cmluZyh2LT5vYl9mdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnLCBQeUZsb2F0X1NUUl9QUkVDSVNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9EVFNGX0FERF9ET1RfMCwgTlVMTCk7CisgICAgZWxzZQorICAgICAgICBidWYgPSBQeU9TX2RvdWJsZV90b19zdHJpbmcodi0+b2JfZnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicsIDAsIFB5X0RUU0ZfQUREX0RPVF8wLCBOVUxMKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnB1dHMoYnVmLCBmcCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9zdHJfb3JfcmVwcihQeUZsb2F0T2JqZWN0ICp2LCBpbnQgcHJlY2lzaW9uLCBjaGFyIGZvcm1hdF9jb2RlKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JY2hhciAqYnVmID0gUHlPU19kb3VibGVfdG9fc3RyaW5nKFB5RmxvYXRfQVNfRE9VQkxFKHYpLAotCQkJCSAgICAgIGZvcm1hdF9jb2RlLCBwcmVjaXNpb24sCi0JCQkJICAgICAgUHlfRFRTRl9BRERfRE9UXzAsCi0JCQkJICAgICAgTlVMTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKLQlQeU1lbV9GcmVlKGJ1Zik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKmJ1ZiA9IFB5T1NfZG91YmxlX3RvX3N0cmluZyhQeUZsb2F0X0FTX0RPVUJMRSh2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfY29kZSwgcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RUU0ZfQUREX0RPVF8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmICghYnVmKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgUHlNZW1fRnJlZShidWYpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9yZXByKFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIGZsb2F0X3N0cl9vcl9yZXByKHYsIDAsICdyJyk7CisgICAgcmV0dXJuIGZsb2F0X3N0cl9vcl9yZXByKHYsIDAsICdyJyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9zdHIoUHlGbG9hdE9iamVjdCAqdikKIHsKLQlyZXR1cm4gZmxvYXRfc3RyX29yX3JlcHIodiwgUHlGbG9hdF9TVFJfUFJFQ0lTSU9OLCAnZycpOworICAgIHJldHVybiBmbG9hdF9zdHJfb3JfcmVwcih2LCBQeUZsb2F0X1NUUl9QUkVDSVNJT04sICdnJyk7CiB9CiAKIC8qIENvbXBhcmlzb24gaXMgcHJldHR5IG11Y2ggYSBuaWdodG1hcmUuICBXaGVuIGNvbXBhcmluZyBmbG9hdCB0byBmbG9hdCwKQEAgLTQwNiwzODkgKzQwNiwzODkgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGZsb2F0X3JpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCWRvdWJsZSBpLCBqOwotCWludCByID0gMDsKKyAgICBkb3VibGUgaSwgajsKKyAgICBpbnQgciA9IDA7CiAKLQlhc3NlcnQoUHlGbG9hdF9DaGVjayh2KSk7Ci0JaSA9IFB5RmxvYXRfQVNfRE9VQkxFKHYpOworICAgIGFzc2VydChQeUZsb2F0X0NoZWNrKHYpKTsKKyAgICBpID0gUHlGbG9hdF9BU19ET1VCTEUodik7CiAKLQkvKiBTd2l0Y2ggb24gdGhlIHR5cGUgb2Ygdy4gIFNldCBpIGFuZCBqIHRvIGRvdWJsZXMgdG8gYmUgY29tcGFyZWQsCi0JICogYW5kIG9wIHRvIHRoZSByaWNoY29tcCB0byB1c2UuCi0JICovCi0JaWYgKFB5RmxvYXRfQ2hlY2sodykpCi0JCWogPSBQeUZsb2F0X0FTX0RPVUJMRSh3KTsKKyAgICAvKiBTd2l0Y2ggb24gdGhlIHR5cGUgb2Ygdy4gIFNldCBpIGFuZCBqIHRvIGRvdWJsZXMgdG8gYmUgY29tcGFyZWQsCisgICAgICogYW5kIG9wIHRvIHRoZSByaWNoY29tcCB0byB1c2UuCisgICAgICovCisgICAgaWYgKFB5RmxvYXRfQ2hlY2sodykpCisgICAgICAgIGogPSBQeUZsb2F0X0FTX0RPVUJMRSh3KTsKIAotCWVsc2UgaWYgKCFQeV9JU19GSU5JVEUoaSkpIHsKLQkJaWYgKFB5SW50X0NoZWNrKHcpIHx8IFB5TG9uZ19DaGVjayh3KSkKLQkJCS8qIElmIGkgaXMgYW4gaW5maW5pdHksIGl0cyBtYWduaXR1ZGUgZXhjZWVkcyBhbnkKLQkJCSAqIGZpbml0ZSBpbnRlZ2VyLCBzbyBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCBpbnQgd2UKLQkJCSAqIGNvbXBhcmUgaSB3aXRoLiAgSWYgaSBpcyBhIE5hTiwgc2ltaWxhcmx5LgotCQkJICovCi0JCQlqID0gMC4wOwotCQllbHNlCi0JCQlnb3RvIFVuaW1wbGVtZW50ZWQ7Ci0JfQorICAgIGVsc2UgaWYgKCFQeV9JU19GSU5JVEUoaSkpIHsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHcpIHx8IFB5TG9uZ19DaGVjayh3KSkKKyAgICAgICAgICAgIC8qIElmIGkgaXMgYW4gaW5maW5pdHksIGl0cyBtYWduaXR1ZGUgZXhjZWVkcyBhbnkKKyAgICAgICAgICAgICAqIGZpbml0ZSBpbnRlZ2VyLCBzbyBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCBpbnQgd2UKKyAgICAgICAgICAgICAqIGNvbXBhcmUgaSB3aXRoLiAgSWYgaSBpcyBhIE5hTiwgc2ltaWxhcmx5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBqID0gMC4wOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIFVuaW1wbGVtZW50ZWQ7CisgICAgfQogCi0JZWxzZSBpZiAoUHlJbnRfQ2hlY2sodykpIHsKLQkJbG9uZyBqaiA9IFB5SW50X0FTX0xPTkcodyk7Ci0JCS8qIEluIHRoZSB3b3JzdCByZWFsaXN0aWMgY2FzZSBJIGNhbiBpbWFnaW5lLCBDIGRvdWJsZSBpcyBhCi0JCSAqIENyYXkgc2luZ2xlIHdpdGggNDggYml0cyBvZiBwcmVjaXNpb24sIGFuZCBsb25nIGhhcyA2NAotCQkgKiBiaXRzLgotCQkgKi8KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayh3KSkgeworICAgICAgICBsb25nIGpqID0gUHlJbnRfQVNfTE9ORyh3KTsKKyAgICAgICAgLyogSW4gdGhlIHdvcnN0IHJlYWxpc3RpYyBjYXNlIEkgY2FuIGltYWdpbmUsIEMgZG91YmxlIGlzIGEKKyAgICAgICAgICogQ3JheSBzaW5nbGUgd2l0aCA0OCBiaXRzIG9mIHByZWNpc2lvbiwgYW5kIGxvbmcgaGFzIDY0CisgICAgICAgICAqIGJpdHMuCisgICAgICAgICAqLwogI2lmIFNJWkVPRl9MT05HID4gNgotCQl1bnNpZ25lZCBsb25nIGFicyA9ICh1bnNpZ25lZCBsb25nKShqaiA8IDAgPyAtamogOiBqaik7Ci0JCWlmIChhYnMgPj4gNDgpIHsKLQkJCS8qIE5lZWRzIG1vcmUgdGhhbiA0OCBiaXRzLiAgTWFrZSBpdCB0YWtlIHRoZQotCQkJICogUHlMb25nIHBhdGguCi0JCQkgKi8KLQkJCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCQlQeU9iamVjdCAqd3cgPSBQeUxvbmdfRnJvbUxvbmcoamopOworICAgICAgICB1bnNpZ25lZCBsb25nIGFicyA9ICh1bnNpZ25lZCBsb25nKShqaiA8IDAgPyAtamogOiBqaik7CisgICAgICAgIGlmIChhYnMgPj4gNDgpIHsKKyAgICAgICAgICAgIC8qIE5lZWRzIG1vcmUgdGhhbiA0OCBiaXRzLiAgTWFrZSBpdCB0YWtlIHRoZQorICAgICAgICAgICAgICogUHlMb25nIHBhdGguCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgICAgICBQeU9iamVjdCAqd3cgPSBQeUxvbmdfRnJvbUxvbmcoamopOwogCi0JCQlpZiAod3cgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCXJlc3VsdCA9IGZsb2F0X3JpY2hjb21wYXJlKHYsIHd3LCBvcCk7Ci0JCQlQeV9ERUNSRUYod3cpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQorICAgICAgICAgICAgaWYgKHd3ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXN1bHQgPSBmbG9hdF9yaWNoY29tcGFyZSh2LCB3dywgb3ApOworICAgICAgICAgICAgUHlfREVDUkVGKHd3KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KICNlbmRpZgotCQlqID0gKGRvdWJsZSlqajsKLQkJYXNzZXJ0KChsb25nKWogPT0gamopOwotCX0KKyAgICAgICAgaiA9IChkb3VibGUpamo7CisgICAgICAgIGFzc2VydCgobG9uZylqID09IGpqKTsKKyAgICB9CiAKLQllbHNlIGlmIChQeUxvbmdfQ2hlY2sodykpIHsKLQkJaW50IHZzaWduID0gaSA9PSAwLjAgPyAwIDogaSA8IDAuMCA/IC0xIDogMTsKLQkJaW50IHdzaWduID0gX1B5TG9uZ19TaWduKHcpOwotCQlzaXplX3QgbmJpdHM7Ci0JCWludCBleHBvbmVudDsKKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2sodykpIHsKKyAgICAgICAgaW50IHZzaWduID0gaSA9PSAwLjAgPyAwIDogaSA8IDAuMCA/IC0xIDogMTsKKyAgICAgICAgaW50IHdzaWduID0gX1B5TG9uZ19TaWduKHcpOworICAgICAgICBzaXplX3QgbmJpdHM7CisgICAgICAgIGludCBleHBvbmVudDsKIAotCQlpZiAodnNpZ24gIT0gd3NpZ24pIHsKLQkJCS8qIE1hZ25pdHVkZXMgYXJlIGlycmVsZXZhbnQgLS0gdGhlIHNpZ25zIGFsb25lCi0JCQkgKiBkZXRlcm1pbmUgdGhlIG91dGNvbWUuCi0JCQkgKi8KLQkJCWkgPSAoZG91YmxlKXZzaWduOwotCQkJaiA9IChkb3VibGUpd3NpZ247Ci0JCQlnb3RvIENvbXBhcmU7Ci0JCX0KLQkJLyogVGhlIHNpZ25zIGFyZSB0aGUgc2FtZS4gKi8KLQkJLyogQ29udmVydCB3IHRvIGEgZG91YmxlIGlmIGl0IGZpdHMuICBJbiBwYXJ0aWN1bGFyLCAwIGZpdHMuICovCi0JCW5iaXRzID0gX1B5TG9uZ19OdW1CaXRzKHcpOwotCQlpZiAobmJpdHMgPT0gKHNpemVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkvKiBUaGlzIGxvbmcgaXMgc28gbGFyZ2UgdGhhdCBzaXplX3QgaXNuJ3QgYmlnIGVub3VnaAotCQkJICogdG8gaG9sZCB0aGUgIyBvZiBiaXRzLiAgUmVwbGFjZSB3aXRoIGxpdHRsZSBkb3VibGVzCi0JCQkgKiB0aGF0IGdpdmUgdGhlIHNhbWUgb3V0Y29tZSAtLSB3IGlzIHNvIGxhcmdlIHRoYXQKLQkJCSAqIGl0cyBtYWduaXR1ZGUgbXVzdCBleGNlZWQgdGhlIG1hZ25pdHVkZSBvZiBhbnkKLQkJCSAqIGZpbml0ZSBmbG9hdC4KLQkJCSAqLwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWkgPSAoZG91YmxlKXZzaWduOwotCQkJYXNzZXJ0KHdzaWduICE9IDApOwotCQkJaiA9IHdzaWduICogMi4wOwotCQkJZ290byBDb21wYXJlOwotCQl9Ci0JCWlmIChuYml0cyA8PSA0OCkgewotCQkJaiA9IFB5TG9uZ19Bc0RvdWJsZSh3KTsKLQkJCS8qIEl0J3MgaW1wb3NzaWJsZSB0aGF0IDw9IDQ4IGJpdHMgb3ZlcmZsb3dlZC4gKi8KLQkJCWFzc2VydChqICE9IC0xLjAgfHwgISBQeUVycl9PY2N1cnJlZCgpKTsKLQkJCWdvdG8gQ29tcGFyZTsKLQkJfQotCQlhc3NlcnQod3NpZ24gIT0gMCk7IC8qIGVsc2UgbmJpdHMgd2FzIDAgKi8KLQkJYXNzZXJ0KHZzaWduICE9IDApOyAvKiBpZiB2c2lnbiB3ZXJlIDAsIHRoZW4gc2luY2Ugd3NpZ24gaXMKLQkJICAgICAgICAgICAgICAgICAgICAgKiBub3QgMCwgd2Ugd291bGQgaGF2ZSB0YWtlbiB0aGUKLQkJICAgICAgICAgICAgICAgICAgICAgKiB2c2lnbiAhPSB3c2lnbiBicmFuY2ggYXQgdGhlIHN0YXJ0ICovCi0JCS8qIFdlIHdhbnQgdG8gd29yayB3aXRoIG5vbi1uZWdhdGl2ZSBudW1iZXJzLiAqLwotCQlpZiAodnNpZ24gPCAwKSB7Ci0JCQkvKiAiTXVsdGlwbHkgYm90aCBzaWRlcyIgYnkgLTE7IHRoaXMgYWxzbyBzd2FwcyB0aGUKLQkJCSAqIGNvbXBhcmF0b3IuCi0JCQkgKi8KLQkJCWkgPSAtaTsKLQkJCW9wID0gX1B5X1N3YXBwZWRPcFtvcF07Ci0JCX0KLQkJYXNzZXJ0KGkgPiAwLjApOwotCQkodm9pZCkgZnJleHAoaSwgJmV4cG9uZW50KTsKLQkJLyogZXhwb25lbnQgaXMgdGhlICMgb2YgYml0cyBpbiB2IGJlZm9yZSB0aGUgcmFkaXggcG9pbnQ7Ci0JCSAqIHdlIGtub3cgdGhhdCBuYml0cyAodGhlICMgb2YgYml0cyBpbiB3KSA+IDQ4IGF0IHRoaXMgcG9pbnQKLQkJICovCi0JCWlmIChleHBvbmVudCA8IDAgfHwgKHNpemVfdClleHBvbmVudCA8IG5iaXRzKSB7Ci0JCQlpID0gMS4wOwotCQkJaiA9IDIuMDsKLQkJCWdvdG8gQ29tcGFyZTsKLQkJfQotCQlpZiAoKHNpemVfdClleHBvbmVudCA+IG5iaXRzKSB7Ci0JCQlpID0gMi4wOwotCQkJaiA9IDEuMDsKLQkJCWdvdG8gQ29tcGFyZTsKLQkJfQotCQkvKiB2IGFuZCB3IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGJpdHMgYmVmb3JlIHRoZSByYWRpeAotCQkgKiBwb2ludC4gIENvbnN0cnVjdCB0d28gbG9uZ3MgdGhhdCBoYXZlIHRoZSBzYW1lIGNvbXBhcmlzb24KLQkJICogb3V0Y29tZS4KLQkJICovCi0JCXsKLQkJCWRvdWJsZSBmcmFjcGFydDsKLQkJCWRvdWJsZSBpbnRwYXJ0OwotCQkJUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqb25lID0gTlVMTDsKLQkJCVB5T2JqZWN0ICp2diA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqd3cgPSB3OworICAgICAgICBpZiAodnNpZ24gIT0gd3NpZ24pIHsKKyAgICAgICAgICAgIC8qIE1hZ25pdHVkZXMgYXJlIGlycmVsZXZhbnQgLS0gdGhlIHNpZ25zIGFsb25lCisgICAgICAgICAgICAgKiBkZXRlcm1pbmUgdGhlIG91dGNvbWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGkgPSAoZG91YmxlKXZzaWduOworICAgICAgICAgICAgaiA9IChkb3VibGUpd3NpZ247CisgICAgICAgICAgICBnb3RvIENvbXBhcmU7CisgICAgICAgIH0KKyAgICAgICAgLyogVGhlIHNpZ25zIGFyZSB0aGUgc2FtZS4gKi8KKyAgICAgICAgLyogQ29udmVydCB3IHRvIGEgZG91YmxlIGlmIGl0IGZpdHMuICBJbiBwYXJ0aWN1bGFyLCAwIGZpdHMuICovCisgICAgICAgIG5iaXRzID0gX1B5TG9uZ19OdW1CaXRzKHcpOworICAgICAgICBpZiAobmJpdHMgPT0gKHNpemVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAvKiBUaGlzIGxvbmcgaXMgc28gbGFyZ2UgdGhhdCBzaXplX3QgaXNuJ3QgYmlnIGVub3VnaAorICAgICAgICAgICAgICogdG8gaG9sZCB0aGUgIyBvZiBiaXRzLiAgUmVwbGFjZSB3aXRoIGxpdHRsZSBkb3VibGVzCisgICAgICAgICAgICAgKiB0aGF0IGdpdmUgdGhlIHNhbWUgb3V0Y29tZSAtLSB3IGlzIHNvIGxhcmdlIHRoYXQKKyAgICAgICAgICAgICAqIGl0cyBtYWduaXR1ZGUgbXVzdCBleGNlZWQgdGhlIG1hZ25pdHVkZSBvZiBhbnkKKyAgICAgICAgICAgICAqIGZpbml0ZSBmbG9hdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGkgPSAoZG91YmxlKXZzaWduOworICAgICAgICAgICAgYXNzZXJ0KHdzaWduICE9IDApOworICAgICAgICAgICAgaiA9IHdzaWduICogMi4wOworICAgICAgICAgICAgZ290byBDb21wYXJlOworICAgICAgICB9CisgICAgICAgIGlmIChuYml0cyA8PSA0OCkgeworICAgICAgICAgICAgaiA9IFB5TG9uZ19Bc0RvdWJsZSh3KTsKKyAgICAgICAgICAgIC8qIEl0J3MgaW1wb3NzaWJsZSB0aGF0IDw9IDQ4IGJpdHMgb3ZlcmZsb3dlZC4gKi8KKyAgICAgICAgICAgIGFzc2VydChqICE9IC0xLjAgfHwgISBQeUVycl9PY2N1cnJlZCgpKTsKKyAgICAgICAgICAgIGdvdG8gQ29tcGFyZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQod3NpZ24gIT0gMCk7IC8qIGVsc2UgbmJpdHMgd2FzIDAgKi8KKyAgICAgICAgYXNzZXJ0KHZzaWduICE9IDApOyAvKiBpZiB2c2lnbiB3ZXJlIDAsIHRoZW4gc2luY2Ugd3NpZ24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBub3QgMCwgd2Ugd291bGQgaGF2ZSB0YWtlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2c2lnbiAhPSB3c2lnbiBicmFuY2ggYXQgdGhlIHN0YXJ0ICovCisgICAgICAgIC8qIFdlIHdhbnQgdG8gd29yayB3aXRoIG5vbi1uZWdhdGl2ZSBudW1iZXJzLiAqLworICAgICAgICBpZiAodnNpZ24gPCAwKSB7CisgICAgICAgICAgICAvKiAiTXVsdGlwbHkgYm90aCBzaWRlcyIgYnkgLTE7IHRoaXMgYWxzbyBzd2FwcyB0aGUKKyAgICAgICAgICAgICAqIGNvbXBhcmF0b3IuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGkgPSAtaTsKKyAgICAgICAgICAgIG9wID0gX1B5X1N3YXBwZWRPcFtvcF07CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGkgPiAwLjApOworICAgICAgICAodm9pZCkgZnJleHAoaSwgJmV4cG9uZW50KTsKKyAgICAgICAgLyogZXhwb25lbnQgaXMgdGhlICMgb2YgYml0cyBpbiB2IGJlZm9yZSB0aGUgcmFkaXggcG9pbnQ7CisgICAgICAgICAqIHdlIGtub3cgdGhhdCBuYml0cyAodGhlICMgb2YgYml0cyBpbiB3KSA+IDQ4IGF0IHRoaXMgcG9pbnQKKyAgICAgICAgICovCisgICAgICAgIGlmIChleHBvbmVudCA8IDAgfHwgKHNpemVfdClleHBvbmVudCA8IG5iaXRzKSB7CisgICAgICAgICAgICBpID0gMS4wOworICAgICAgICAgICAgaiA9IDIuMDsKKyAgICAgICAgICAgIGdvdG8gQ29tcGFyZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHNpemVfdClleHBvbmVudCA+IG5iaXRzKSB7CisgICAgICAgICAgICBpID0gMi4wOworICAgICAgICAgICAgaiA9IDEuMDsKKyAgICAgICAgICAgIGdvdG8gQ29tcGFyZTsKKyAgICAgICAgfQorICAgICAgICAvKiB2IGFuZCB3IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGJpdHMgYmVmb3JlIHRoZSByYWRpeAorICAgICAgICAgKiBwb2ludC4gIENvbnN0cnVjdCB0d28gbG9uZ3MgdGhhdCBoYXZlIHRoZSBzYW1lIGNvbXBhcmlzb24KKyAgICAgICAgICogb3V0Y29tZS4KKyAgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBmcmFjcGFydDsKKyAgICAgICAgICAgIGRvdWJsZSBpbnRwYXJ0OworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqb25lID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2diA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqd3cgPSB3OwogCi0JCQlpZiAod3NpZ24gPCAwKSB7Ci0JCQkJd3cgPSBQeU51bWJlcl9OZWdhdGl2ZSh3KTsKLQkJCQlpZiAod3cgPT0gTlVMTCkKLQkJCQkJZ290byBFcnJvcjsKLQkJCX0KLQkJCWVsc2UKLQkJCQlQeV9JTkNSRUYod3cpOworICAgICAgICAgICAgaWYgKHdzaWduIDwgMCkgeworICAgICAgICAgICAgICAgIHd3ID0gUHlOdW1iZXJfTmVnYXRpdmUodyk7CisgICAgICAgICAgICAgICAgaWYgKHd3ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHd3KTsKIAotCQkJZnJhY3BhcnQgPSBtb2RmKGksICZpbnRwYXJ0KTsKLQkJCXZ2ID0gUHlMb25nX0Zyb21Eb3VibGUoaW50cGFydCk7Ci0JCQlpZiAodnYgPT0gTlVMTCkKLQkJCQlnb3RvIEVycm9yOworICAgICAgICAgICAgZnJhY3BhcnQgPSBtb2RmKGksICZpbnRwYXJ0KTsKKyAgICAgICAgICAgIHZ2ID0gUHlMb25nX0Zyb21Eb3VibGUoaW50cGFydCk7CisgICAgICAgICAgICBpZiAodnYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwogCi0JCQlpZiAoZnJhY3BhcnQgIT0gMC4wKSB7Ci0JCQkJLyogU2hpZnQgbGVmdCwgYW5kIG9yIGEgMSBiaXQgaW50byB2dgotCQkJCSAqIHRvIHJlcHJlc2VudCB0aGUgbG9zdCBmcmFjdGlvbi4KLQkJCQkgKi8KLQkJCQlQeU9iamVjdCAqdGVtcDsKKyAgICAgICAgICAgIGlmIChmcmFjcGFydCAhPSAwLjApIHsKKyAgICAgICAgICAgICAgICAvKiBTaGlmdCBsZWZ0LCBhbmQgb3IgYSAxIGJpdCBpbnRvIHZ2CisgICAgICAgICAgICAgICAgICogdG8gcmVwcmVzZW50IHRoZSBsb3N0IGZyYWN0aW9uLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0ZW1wOwogCi0JCQkJb25lID0gUHlJbnRfRnJvbUxvbmcoMSk7Ci0JCQkJaWYgKG9uZSA9PSBOVUxMKQotCQkJCQlnb3RvIEVycm9yOworICAgICAgICAgICAgICAgIG9uZSA9IFB5SW50X0Zyb21Mb25nKDEpOworICAgICAgICAgICAgICAgIGlmIChvbmUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKIAotCQkJCXRlbXAgPSBQeU51bWJlcl9Mc2hpZnQod3csIG9uZSk7Ci0JCQkJaWYgKHRlbXAgPT0gTlVMTCkKLQkJCQkJZ290byBFcnJvcjsKLQkJCQlQeV9ERUNSRUYod3cpOwotCQkJCXd3ID0gdGVtcDsKKyAgICAgICAgICAgICAgICB0ZW1wID0gUHlOdW1iZXJfTHNoaWZ0KHd3LCBvbmUpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHd3KTsKKyAgICAgICAgICAgICAgICB3dyA9IHRlbXA7CiAKLQkJCQl0ZW1wID0gUHlOdW1iZXJfTHNoaWZ0KHZ2LCBvbmUpOwotCQkJCWlmICh0ZW1wID09IE5VTEwpCi0JCQkJCWdvdG8gRXJyb3I7Ci0JCQkJUHlfREVDUkVGKHZ2KTsKLQkJCQl2diA9IHRlbXA7CisgICAgICAgICAgICAgICAgdGVtcCA9IFB5TnVtYmVyX0xzaGlmdCh2diwgb25lKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2dik7CisgICAgICAgICAgICAgICAgdnYgPSB0ZW1wOwogCi0JCQkJdGVtcCA9IFB5TnVtYmVyX09yKHZ2LCBvbmUpOwotCQkJCWlmICh0ZW1wID09IE5VTEwpCi0JCQkJCWdvdG8gRXJyb3I7Ci0JCQkJUHlfREVDUkVGKHZ2KTsKLQkJCQl2diA9IHRlbXA7Ci0JCQl9CisgICAgICAgICAgICAgICAgdGVtcCA9IFB5TnVtYmVyX09yKHZ2LCBvbmUpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZ2KTsKKyAgICAgICAgICAgICAgICB2diA9IHRlbXA7CisgICAgICAgICAgICB9CiAKLQkJCXIgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodnYsIHd3LCBvcCk7Ci0JCQlpZiAociA8IDApCi0JCQkJZ290byBFcnJvcjsKLQkJCXJlc3VsdCA9IFB5Qm9vbF9Gcm9tTG9uZyhyKTsKLSAJCSBFcnJvcjoKLSAJCSAJUHlfWERFQ1JFRih2dik7Ci0gCQkgCVB5X1hERUNSRUYod3cpOwotIAkJIAlQeV9YREVDUkVGKG9uZSk7Ci0gCQkgCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9IC8qIGVsc2UgaWYgKFB5TG9uZ19DaGVjayh3KSkgKi8KKyAgICAgICAgICAgIHIgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodnYsIHd3LCBvcCk7CisgICAgICAgICAgICBpZiAociA8IDApCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5Qm9vbF9Gcm9tTG9uZyhyKTsKKyAgICAgICAgIEVycm9yOgorICAgICAgICAgICAgUHlfWERFQ1JFRih2dik7CisgICAgICAgICAgICBQeV9YREVDUkVGKHd3KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYob25lKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9IC8qIGVsc2UgaWYgKFB5TG9uZ19DaGVjayh3KSkgKi8KIAotCWVsc2UJLyogdyBpc24ndCBmbG9hdCwgaW50LCBvciBsb25nICovCi0JCWdvdG8gVW5pbXBsZW1lbnRlZDsKKyAgICBlbHNlICAgICAgICAvKiB3IGlzbid0IGZsb2F0LCBpbnQsIG9yIGxvbmcgKi8KKyAgICAgICAgZ290byBVbmltcGxlbWVudGVkOwogCiAgQ29tcGFyZToKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJyaWNoY29tcGFyZSIsIHJldHVybiBOVUxMKQotCXN3aXRjaCAob3ApIHsKLQljYXNlIFB5X0VROgotCQlyID0gaSA9PSBqOwotCQlicmVhazsKLQljYXNlIFB5X05FOgotCQlyID0gaSAhPSBqOwotCQlicmVhazsKLQljYXNlIFB5X0xFOgotCQlyID0gaSA8PSBqOwotCQlicmVhazsKLQljYXNlIFB5X0dFOgotCQlyID0gaSA+PSBqOwotCQlicmVhazsKLQljYXNlIFB5X0xUOgotCQlyID0gaSA8IGo7Ci0JCWJyZWFrOwotCWNhc2UgUHlfR1Q6Ci0JCXIgPSBpID4gajsKLQkJYnJlYWs7Ci0JfQotCVB5RlBFX0VORF9QUk9URUNUKHIpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJyaWNoY29tcGFyZSIsIHJldHVybiBOVUxMKQorICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIFB5X0VROgorICAgICAgICByID0gaSA9PSBqOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5X05FOgorICAgICAgICByID0gaSAhPSBqOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5X0xFOgorICAgICAgICByID0gaSA8PSBqOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5X0dFOgorICAgICAgICByID0gaSA+PSBqOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5X0xUOgorICAgICAgICByID0gaSA8IGo7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlfR1Q6CisgICAgICAgIHIgPSBpID4gajsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFB5RlBFX0VORF9QUk9URUNUKHIpCisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyKTsKIAogIFVuaW1wbGVtZW50ZWQ6Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIHN0YXRpYyBsb25nCiBmbG9hdF9oYXNoKFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIF9QeV9IYXNoRG91YmxlKHYtPm9iX2Z2YWwpOworICAgIHJldHVybiBfUHlfSGFzaERvdWJsZSh2LT5vYl9mdmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2FkZChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JZG91YmxlIGEsYjsKLQlDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKLQlDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJhZGQiLCByZXR1cm4gMCkKLQlhID0gYSArIGI7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoYSkKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGEpOworICAgIGRvdWJsZSBhLGI7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgYSk7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodywgYik7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiYWRkIiwgcmV0dXJuIDApCisgICAgYSA9IGEgKyBiOworICAgIFB5RlBFX0VORF9QUk9URUNUKGEpCisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X3N1YihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JZG91YmxlIGEsYjsKLQlDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKLQlDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJzdWJ0cmFjdCIsIHJldHVybiAwKQotCWEgPSBhIC0gYjsKLQlQeUZQRV9FTkRfUFJPVEVDVChhKQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYSk7CisgICAgZG91YmxlIGEsYjsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJzdWJ0cmFjdCIsIHJldHVybiAwKQorICAgIGEgPSBhIC0gYjsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChhKQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9tdWwoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCWRvdWJsZSBhLGI7Ci0JQ09OVkVSVF9UT19ET1VCTEUodiwgYSk7Ci0JQ09OVkVSVF9UT19ET1VCTEUodywgYik7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgibXVsdGlwbHkiLCByZXR1cm4gMCkKLQlhID0gYSAqIGI7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoYSkKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGEpOworICAgIGRvdWJsZSBhLGI7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgYSk7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodywgYik7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgibXVsdGlwbHkiLCByZXR1cm4gMCkKKyAgICBhID0gYSAqIGI7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoYSkKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfZGl2KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlkb3VibGUgYSxiOwotCUNPTlZFUlRfVE9fRE9VQkxFKHYsIGEpOwotCUNPTlZFUlRfVE9fRE9VQkxFKHcsIGIpOworICAgIGRvdWJsZSBhLGI7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgYSk7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodywgYik7CiAjaWZkZWYgUHlfTkFOCi0JaWYgKGIgPT0gMC4wKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkiZmxvYXQgZGl2aXNpb24gYnkgemVybyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGIgPT0gMC4wKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCBkaXZpc2lvbiBieSB6ZXJvIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImRpdmlkZSIsIHJldHVybiAwKQotCWEgPSBhIC8gYjsKLQlQeUZQRV9FTkRfUFJPVEVDVChhKQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYSk7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiZGl2aWRlIiwgcmV0dXJuIDApCisgICAgYSA9IGEgLyBiOworICAgIFB5RlBFX0VORF9QUk9URUNUKGEpCisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2NsYXNzaWNfZGl2KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlkb3VibGUgYSxiOwotCUNPTlZFUlRfVE9fRE9VQkxFKHYsIGEpOwotCUNPTlZFUlRfVE9fRE9VQkxFKHcsIGIpOwotCWlmIChQeV9EaXZpc2lvbldhcm5pbmdGbGFnID49IDIgJiYKLQkgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsICJjbGFzc2ljIGZsb2F0IGRpdmlzaW9uIikgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBkb3VibGUgYSxiOworICAgIENPTlZFUlRfVE9fRE9VQkxFKHYsIGEpOworICAgIENPTlZFUlRfVE9fRE9VQkxFKHcsIGIpOworICAgIGlmIChQeV9EaXZpc2lvbldhcm5pbmdGbGFnID49IDIgJiYKKyAgICAgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsICJjbGFzc2ljIGZsb2F0IGRpdmlzaW9uIikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBQeV9OQU4KLQlpZiAoYiA9PSAwLjApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAotCQkJCSJmbG9hdCBkaXZpc2lvbiBieSB6ZXJvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoYiA9PSAwLjApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IGRpdmlzaW9uIGJ5IHplcm8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiZGl2aWRlIiwgcmV0dXJuIDApCi0JYSA9IGEgLyBiOwotCVB5RlBFX0VORF9QUk9URUNUKGEpCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJkaXZpZGUiLCByZXR1cm4gMCkKKyAgICBhID0gYSAvIGI7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoYSkKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfcmVtKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlkb3VibGUgdngsIHd4OwotCWRvdWJsZSBtb2Q7Ci0JQ09OVkVSVF9UT19ET1VCTEUodiwgdngpOwotCUNPTlZFUlRfVE9fRE9VQkxFKHcsIHd4KTsKKyAgICBkb3VibGUgdngsIHd4OworICAgIGRvdWJsZSBtb2Q7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgdngpOworICAgIENPTlZFUlRfVE9fRE9VQkxFKHcsIHd4KTsKICNpZmRlZiBQeV9OQU4KLQlpZiAod3ggPT0gMC4wKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkiZmxvYXQgbW9kdWxvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAod3ggPT0gMC4wKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCBtb2R1bG8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JUHlGUEVfU1RBUlRfUFJPVEVDVCgibW9kdWxvIiwgcmV0dXJuIDApCi0JbW9kID0gZm1vZCh2eCwgd3gpOwotCS8qIG5vdGU6IGNoZWNraW5nIG1vZCp3eCA8IDAgaXMgaW5jb3JyZWN0IC0tIHVuZGVyZmxvd3MgdG8KLQkgICAwIGlmIHd4IDwgc3FydChzbWFsbGVzdCBub256ZXJvIGRvdWJsZSkgKi8KLQlpZiAobW9kICYmICgod3ggPCAwKSAhPSAobW9kIDwgMCkpKSB7Ci0JCW1vZCArPSB3eDsKLQl9Ci0JUHlGUEVfRU5EX1BST1RFQ1QobW9kKQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUobW9kKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJtb2R1bG8iLCByZXR1cm4gMCkKKyAgICBtb2QgPSBmbW9kKHZ4LCB3eCk7CisgICAgLyogbm90ZTogY2hlY2tpbmcgbW9kKnd4IDwgMCBpcyBpbmNvcnJlY3QgLS0gdW5kZXJmbG93cyB0bworICAgICAgIDAgaWYgd3ggPCBzcXJ0KHNtYWxsZXN0IG5vbnplcm8gZG91YmxlKSAqLworICAgIGlmIChtb2QgJiYgKCh3eCA8IDApICE9IChtb2QgPCAwKSkpIHsKKyAgICAgICAgbW9kICs9IHd4OworICAgIH0KKyAgICBQeUZQRV9FTkRfUFJPVEVDVChtb2QpCisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShtb2QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfZGl2bW9kKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlkb3VibGUgdngsIHd4OwotCWRvdWJsZSBkaXYsIG1vZCwgZmxvb3JkaXY7Ci0gCUNPTlZFUlRfVE9fRE9VQkxFKHYsIHZ4KTsKLSAJQ09OVkVSVF9UT19ET1VCTEUodywgd3gpOwotCWlmICh3eCA9PSAwLjApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLCAiZmxvYXQgZGl2bW9kKCkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImRpdm1vZCIsIHJldHVybiAwKQotCW1vZCA9IGZtb2QodngsIHd4KTsKLQkvKiBmbW9kIGlzIHR5cGljYWxseSBleGFjdCwgc28gdngtbW9kIGlzICptYXRoZW1hdGljYWxseSogYW4KLQkgICBleGFjdCBtdWx0aXBsZSBvZiB3eC4gIEJ1dCB0aGlzIGlzIGZwIGFyaXRobWV0aWMsIGFuZCBmcAotCSAgIHZ4IC0gbW9kIGlzIGFuIGFwcHJveGltYXRpb247IHRoZSByZXN1bHQgaXMgdGhhdCBkaXYgbWF5Ci0JICAgbm90IGJlIGFuIGV4YWN0IGludGVncmFsIHZhbHVlIGFmdGVyIHRoZSBkaXZpc2lvbiwgYWx0aG91Z2gKLQkgICBpdCB3aWxsIGFsd2F5cyBiZSB2ZXJ5IGNsb3NlIHRvIG9uZS4KLQkqLwotCWRpdiA9ICh2eCAtIG1vZCkgLyB3eDsKLQlpZiAobW9kKSB7Ci0JCS8qIGVuc3VyZSB0aGUgcmVtYWluZGVyIGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvciAqLwotCQlpZiAoKHd4IDwgMCkgIT0gKG1vZCA8IDApKSB7Ci0JCQltb2QgKz0gd3g7Ci0JCQlkaXYgLT0gMS4wOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiB0aGUgcmVtYWluZGVyIGlzIHplcm8sIGFuZCBpbiB0aGUgcHJlc2VuY2Ugb2Ygc2lnbmVkIHplcm9lcwotCQkgICBmbW9kIHJldHVybnMgZGlmZmVyZW50IHJlc3VsdHMgYWNyb3NzIHBsYXRmb3JtczsgZW5zdXJlCi0JCSAgIGl0IGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvcjsgd2UnZCBsaWtlIHRvIGRvCi0JCSAgICJtb2QgPSB3eCAqIDAuMCIsIGJ1dCB0aGF0IG1heSBnZXQgb3B0aW1pemVkIGF3YXkgKi8KLQkJbW9kICo9IG1vZDsgIC8qIGhpZGUgIm1vZCA9ICswIiBmcm9tIG9wdGltaXplciAqLwotCQlpZiAod3ggPCAwLjApCi0JCQltb2QgPSAtbW9kOwotCX0KLQkvKiBzbmFwIHF1b3RpZW50IHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUgKi8KLQlpZiAoZGl2KSB7Ci0JCWZsb29yZGl2ID0gZmxvb3IoZGl2KTsKLQkJaWYgKGRpdiAtIGZsb29yZGl2ID4gMC41KQotCQkJZmxvb3JkaXYgKz0gMS4wOwotCX0KLQllbHNlIHsKLQkJLyogZGl2IGlzIHplcm8gLSBnZXQgdGhlIHNhbWUgc2lnbiBhcyB0aGUgdHJ1ZSBxdW90aWVudCAqLwotCQlkaXYgKj0gZGl2OwkvKiBoaWRlICJkaXYgPSArMCIgZnJvbSBvcHRpbWl6ZXJzICovCi0JCWZsb29yZGl2ID0gZGl2ICogdnggLyB3eDsgLyogemVybyB3LyBzaWduIG9mIHZ4L3d4ICovCi0JfQotCVB5RlBFX0VORF9QUk9URUNUKGZsb29yZGl2KQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZGQpIiwgZmxvb3JkaXYsIG1vZCk7CisgICAgZG91YmxlIHZ4LCB3eDsKKyAgICBkb3VibGUgZGl2LCBtb2QsIGZsb29yZGl2OworICAgIENPTlZFUlRfVE9fRE9VQkxFKHYsIHZ4KTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh3LCB3eCk7CisgICAgaWYgKHd4ID09IDAuMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJmbG9hdCBkaXZtb2QoKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiZGl2bW9kIiwgcmV0dXJuIDApCisgICAgbW9kID0gZm1vZCh2eCwgd3gpOworICAgIC8qIGZtb2QgaXMgdHlwaWNhbGx5IGV4YWN0LCBzbyB2eC1tb2QgaXMgKm1hdGhlbWF0aWNhbGx5KiBhbgorICAgICAgIGV4YWN0IG11bHRpcGxlIG9mIHd4LiAgQnV0IHRoaXMgaXMgZnAgYXJpdGhtZXRpYywgYW5kIGZwCisgICAgICAgdnggLSBtb2QgaXMgYW4gYXBwcm94aW1hdGlvbjsgdGhlIHJlc3VsdCBpcyB0aGF0IGRpdiBtYXkKKyAgICAgICBub3QgYmUgYW4gZXhhY3QgaW50ZWdyYWwgdmFsdWUgYWZ0ZXIgdGhlIGRpdmlzaW9uLCBhbHRob3VnaAorICAgICAgIGl0IHdpbGwgYWx3YXlzIGJlIHZlcnkgY2xvc2UgdG8gb25lLgorICAgICovCisgICAgZGl2ID0gKHZ4IC0gbW9kKSAvIHd4OworICAgIGlmIChtb2QpIHsKKyAgICAgICAgLyogZW5zdXJlIHRoZSByZW1haW5kZXIgaGFzIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGRlbm9taW5hdG9yICovCisgICAgICAgIGlmICgod3ggPCAwKSAhPSAobW9kIDwgMCkpIHsKKyAgICAgICAgICAgIG1vZCArPSB3eDsKKyAgICAgICAgICAgIGRpdiAtPSAxLjA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIHRoZSByZW1haW5kZXIgaXMgemVybywgYW5kIGluIHRoZSBwcmVzZW5jZSBvZiBzaWduZWQgemVyb2VzCisgICAgICAgICAgIGZtb2QgcmV0dXJucyBkaWZmZXJlbnQgcmVzdWx0cyBhY3Jvc3MgcGxhdGZvcm1zOyBlbnN1cmUKKyAgICAgICAgICAgaXQgaGFzIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGRlbm9taW5hdG9yOyB3ZSdkIGxpa2UgdG8gZG8KKyAgICAgICAgICAgIm1vZCA9IHd4ICogMC4wIiwgYnV0IHRoYXQgbWF5IGdldCBvcHRpbWl6ZWQgYXdheSAqLworICAgICAgICBtb2QgKj0gbW9kOyAgLyogaGlkZSAibW9kID0gKzAiIGZyb20gb3B0aW1pemVyICovCisgICAgICAgIGlmICh3eCA8IDAuMCkKKyAgICAgICAgICAgIG1vZCA9IC1tb2Q7CisgICAgfQorICAgIC8qIHNuYXAgcXVvdGllbnQgdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSAqLworICAgIGlmIChkaXYpIHsKKyAgICAgICAgZmxvb3JkaXYgPSBmbG9vcihkaXYpOworICAgICAgICBpZiAoZGl2IC0gZmxvb3JkaXYgPiAwLjUpCisgICAgICAgICAgICBmbG9vcmRpdiArPSAxLjA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBkaXYgaXMgemVybyAtIGdldCB0aGUgc2FtZSBzaWduIGFzIHRoZSB0cnVlIHF1b3RpZW50ICovCisgICAgICAgIGRpdiAqPSBkaXY7ICAgICAgICAgICAgIC8qIGhpZGUgImRpdiA9ICswIiBmcm9tIG9wdGltaXplcnMgKi8KKyAgICAgICAgZmxvb3JkaXYgPSBkaXYgKiB2eCAvIHd4OyAvKiB6ZXJvIHcvIHNpZ24gb2Ygdngvd3ggKi8KKyAgICB9CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoZmxvb3JkaXYpCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkZCkiLCBmbG9vcmRpdiwgbW9kKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2Zsb29yX2RpdihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlPYmplY3QgKnQsICpyOworICAgIFB5T2JqZWN0ICp0LCAqcjsKIAotCXQgPSBmbG9hdF9kaXZtb2Qodiwgdyk7Ci0JaWYgKHQgPT0gTlVMTCB8fCB0ID09IFB5X05vdEltcGxlbWVudGVkKQotCQlyZXR1cm4gdDsKLQlhc3NlcnQoUHlUdXBsZV9DaGVja0V4YWN0KHQpKTsKLQlyID0gUHlUdXBsZV9HRVRfSVRFTSh0LCAwKTsKLQlQeV9JTkNSRUYocik7Ci0JUHlfREVDUkVGKHQpOwotCXJldHVybiByOworICAgIHQgPSBmbG9hdF9kaXZtb2Qodiwgdyk7CisgICAgaWYgKHQgPT0gTlVMTCB8fCB0ID09IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICByZXR1cm4gdDsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVja0V4YWN0KHQpKTsKKyAgICByID0gUHlUdXBsZV9HRVRfSVRFTSh0LCAwKTsKKyAgICBQeV9JTkNSRUYocik7CisgICAgUHlfREVDUkVGKHQpOworICAgIHJldHVybiByOwogfQogCiAvKiBkZXRlcm1pbmUgd2hldGhlciB4IGlzIGFuIG9kZCBpbnRlZ2VyIG9yIG5vdDsgIGFzc3VtZXMgdGhhdApAQCAtNzk4LDEyMiArNzk4LDEyMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X3BvdyhQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5T2JqZWN0ICp6KQogewotCWRvdWJsZSBpdiwgaXcsIGl4OwotCWludCBuZWdhdGVfcmVzdWx0ID0gMDsKKyAgICBkb3VibGUgaXYsIGl3LCBpeDsKKyAgICBpbnQgbmVnYXRlX3Jlc3VsdCA9IDA7CiAKLQlpZiAoKFB5T2JqZWN0ICopeiAhPSBQeV9Ob25lKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJwb3coKSAzcmQgYXJndW1lbnQgbm90ICIKLQkJCSJhbGxvd2VkIHVubGVzcyBhbGwgYXJndW1lbnRzIGFyZSBpbnRlZ2VycyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChQeU9iamVjdCAqKXogIT0gUHlfTm9uZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicG93KCkgM3JkIGFyZ3VtZW50IG5vdCAiCisgICAgICAgICAgICAiYWxsb3dlZCB1bmxlc3MgYWxsIGFyZ3VtZW50cyBhcmUgaW50ZWdlcnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JQ09OVkVSVF9UT19ET1VCTEUodiwgaXYpOwotCUNPTlZFUlRfVE9fRE9VQkxFKHcsIGl3KTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCBpdik7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodywgaXcpOwogCi0JLyogU29ydCBvdXQgc3BlY2lhbCBjYXNlcyBoZXJlIGluc3RlYWQgb2YgcmVseWluZyBvbiBwb3coKSAqLwotCWlmIChpdyA9PSAwKSB7CQkvKiB2KiowIGlzIDEsIGV2ZW4gMCoqMCAqLwotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKDEuMCk7Ci0JfQotCWlmIChQeV9JU19OQU4oaXYpKSB7CS8qIG5hbioqdyA9IG5hbiwgdW5sZXNzIHcgPT0gMCAqLwotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGl2KTsKLQl9Ci0JaWYgKFB5X0lTX05BTihpdykpIHsJLyogdioqbmFuID0gbmFuLCB1bmxlc3MgdiA9PSAxOyAxKipuYW4gPSAxICovCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoaXYgPT0gMS4wID8gMS4wIDogaXcpOwotCX0KLQlpZiAoUHlfSVNfSU5GSU5JVFkoaXcpKSB7Ci0JCS8qIHYqKmluZiBpczogMC4wIGlmIGFicyh2KSA8IDE7IDEuMCBpZiBhYnModikgPT0gMTsgaW5mIGlmCi0JCSAqICAgICBhYnModikgPiAxIChpbmNsdWRpbmcgY2FzZSB3aGVyZSB2IGluZmluaXRlKQotCQkgKgotCQkgKiB2KiotaW5mIGlzOiBpbmYgaWYgYWJzKHYpIDwgMTsgMS4wIGlmIGFicyh2KSA9PSAxOyAwLjAgaWYKLQkJICogICAgIGFicyh2KSA+IDEgKGluY2x1ZGluZyBjYXNlIHdoZXJlIHYgaW5maW5pdGUpCi0JCSAqLwotCQlpdiA9IGZhYnMoaXYpOwotCQlpZiAoaXYgPT0gMS4wKQotCQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgxLjApOwotCQllbHNlIGlmICgoaXcgPiAwLjApID09IChpdiA+IDEuMCkpCi0JCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGZhYnMoaXcpKTsgLyogcmV0dXJuIGluZiAqLwotCQllbHNlCi0JCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKDAuMCk7Ci0JfQotCWlmIChQeV9JU19JTkZJTklUWShpdikpIHsKLQkJLyogKCstaW5mKSoqdyBpczogaW5mIGZvciB3IHBvc2l0aXZlLCAwIGZvciB3IG5lZ2F0aXZlOyBpbgotCQkgKiAgICAgYm90aCBjYXNlcywgd2UgbmVlZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIHNpZ24gaWYgdyBpcwotCQkgKiAgICAgYW4gb2RkIGludGVnZXIuCi0JCSAqLwotCQlpbnQgaXdfaXNfb2RkID0gRE9VQkxFX0lTX09ERF9JTlRFR0VSKGl3KTsKLQkJaWYgKGl3ID4gMC4wKQotCQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShpd19pc19vZGQgPyBpdiA6IGZhYnMoaXYpKTsKLQkJZWxzZQotCQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShpd19pc19vZGQgPwotCQkJCQkJICBjb3B5c2lnbigwLjAsIGl2KSA6IDAuMCk7Ci0JfQotCWlmIChpdiA9PSAwLjApIHsgIC8qIDAqKncgaXM6IDAgZm9yIHcgcG9zaXRpdmUsIDEgZm9yIHcgemVybwotCQkJICAgICAoYWxyZWFkeSBkZWFsdCB3aXRoIGFib3ZlKSwgYW5kIGFuIGVycm9yCi0JCQkgICAgIGlmIHcgaXMgbmVnYXRpdmUuICovCi0JCWludCBpd19pc19vZGQgPSBET1VCTEVfSVNfT0REX0lOVEVHRVIoaXcpOwotCQlpZiAoaXcgPCAwLjApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkJIjAuMCBjYW5ub3QgYmUgcmFpc2VkIHRvIGEgIgotCQkJCQkibmVnYXRpdmUgcG93ZXIiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIHVzZSBjb3JyZWN0IHNpZ24gaWYgaXcgaXMgb2RkICovCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoaXdfaXNfb2RkID8gaXYgOiAwLjApOwotCX0KKyAgICAvKiBTb3J0IG91dCBzcGVjaWFsIGNhc2VzIGhlcmUgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHBvdygpICovCisgICAgaWYgKGl3ID09IDApIHsgICAgICAgICAgICAgIC8qIHYqKjAgaXMgMSwgZXZlbiAwKiowICovCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoMS4wKTsKKyAgICB9CisgICAgaWYgKFB5X0lTX05BTihpdikpIHsgICAgICAgIC8qIG5hbioqdyA9IG5hbiwgdW5sZXNzIHcgPT0gMCAqLworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGl2KTsKKyAgICB9CisgICAgaWYgKFB5X0lTX05BTihpdykpIHsgICAgICAgIC8qIHYqKm5hbiA9IG5hbiwgdW5sZXNzIHYgPT0gMTsgMSoqbmFuID0gMSAqLworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGl2ID09IDEuMCA/IDEuMCA6IGl3KTsKKyAgICB9CisgICAgaWYgKFB5X0lTX0lORklOSVRZKGl3KSkgeworICAgICAgICAvKiB2KippbmYgaXM6IDAuMCBpZiBhYnModikgPCAxOyAxLjAgaWYgYWJzKHYpID09IDE7IGluZiBpZgorICAgICAgICAgKiAgICAgYWJzKHYpID4gMSAoaW5jbHVkaW5nIGNhc2Ugd2hlcmUgdiBpbmZpbml0ZSkKKyAgICAgICAgICoKKyAgICAgICAgICogdioqLWluZiBpczogaW5mIGlmIGFicyh2KSA8IDE7IDEuMCBpZiBhYnModikgPT0gMTsgMC4wIGlmCisgICAgICAgICAqICAgICBhYnModikgPiAxIChpbmNsdWRpbmcgY2FzZSB3aGVyZSB2IGluZmluaXRlKQorICAgICAgICAgKi8KKyAgICAgICAgaXYgPSBmYWJzKGl2KTsKKyAgICAgICAgaWYgKGl2ID09IDEuMCkKKyAgICAgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoMS4wKTsKKyAgICAgICAgZWxzZSBpZiAoKGl3ID4gMC4wKSA9PSAoaXYgPiAxLjApKQorICAgICAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmYWJzKGl3KSk7IC8qIHJldHVybiBpbmYgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgwLjApOworICAgIH0KKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkoaXYpKSB7CisgICAgICAgIC8qICgrLWluZikqKncgaXM6IGluZiBmb3IgdyBwb3NpdGl2ZSwgMCBmb3IgdyBuZWdhdGl2ZTsgaW4KKyAgICAgICAgICogICAgIGJvdGggY2FzZXMsIHdlIG5lZWQgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBzaWduIGlmIHcgaXMKKyAgICAgICAgICogICAgIGFuIG9kZCBpbnRlZ2VyLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGl3X2lzX29kZCA9IERPVUJMRV9JU19PRERfSU5URUdFUihpdyk7CisgICAgICAgIGlmIChpdyA+IDAuMCkKKyAgICAgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoaXdfaXNfb2RkID8gaXYgOiBmYWJzKGl2KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoaXdfaXNfb2RkID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weXNpZ24oMC4wLCBpdikgOiAwLjApOworICAgIH0KKyAgICBpZiAoaXYgPT0gMC4wKSB7ICAvKiAwKip3IGlzOiAwIGZvciB3IHBvc2l0aXZlLCAxIGZvciB3IHplcm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoYWxyZWFkeSBkZWFsdCB3aXRoIGFib3ZlKSwgYW5kIGFuIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdyBpcyBuZWdhdGl2ZS4gKi8KKyAgICAgICAgaW50IGl3X2lzX29kZCA9IERPVUJMRV9JU19PRERfSU5URUdFUihpdyk7CisgICAgICAgIGlmIChpdyA8IDAuMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjAgY2Fubm90IGJlIHJhaXNlZCB0byBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgcG93ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIHVzZSBjb3JyZWN0IHNpZ24gaWYgaXcgaXMgb2RkICovCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoaXdfaXNfb2RkID8gaXYgOiAwLjApOworICAgIH0KIAotCWlmIChpdiA8IDAuMCkgewotCQkvKiBXaGV0aGVyIHRoaXMgaXMgYW4gZXJyb3IgaXMgYSBtZXNzLCBhbmQgYnVtcHMgaW50byBsaWJtCi0JCSAqIGJ1Z3Mgc28gd2UgaGF2ZSB0byBmaWd1cmUgaXQgb3V0IG91cnNlbHZlcy4KLQkJICovCi0JCWlmIChpdyAhPSBmbG9vcihpdykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgbnVtYmVyICIKLQkJCQkiY2Fubm90IGJlIHJhaXNlZCB0byBhIGZyYWN0aW9uYWwgcG93ZXIiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIGl3IGlzIGFuIGV4YWN0IGludGVnZXIsIGFsYmVpdCBwZXJoYXBzIGEgdmVyeSBsYXJnZQotCQkgKiBvbmUuICBSZXBsYWNlIGl2IGJ5IGl0cyBhYnNvbHV0ZSB2YWx1ZSBhbmQgcmVtZW1iZXIKLQkJICogdG8gbmVnYXRlIHRoZSBwb3cgcmVzdWx0IGlmIGl3IGlzIG9kZC4KLQkJICovCi0JCWl2ID0gLWl2OwotCQluZWdhdGVfcmVzdWx0ID0gRE9VQkxFX0lTX09ERF9JTlRFR0VSKGl3KTsKLQl9CisgICAgaWYgKGl2IDwgMC4wKSB7CisgICAgICAgIC8qIFdoZXRoZXIgdGhpcyBpcyBhbiBlcnJvciBpcyBhIG1lc3MsIGFuZCBidW1wcyBpbnRvIGxpYm0KKyAgICAgICAgICogYnVncyBzbyB3ZSBoYXZlIHRvIGZpZ3VyZSBpdCBvdXQgb3Vyc2VsdmVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGl3ICE9IGZsb29yKGl3KSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBudW1iZXIgIgorICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgcmFpc2VkIHRvIGEgZnJhY3Rpb25hbCBwb3dlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyogaXcgaXMgYW4gZXhhY3QgaW50ZWdlciwgYWxiZWl0IHBlcmhhcHMgYSB2ZXJ5IGxhcmdlCisgICAgICAgICAqIG9uZS4gIFJlcGxhY2UgaXYgYnkgaXRzIGFic29sdXRlIHZhbHVlIGFuZCByZW1lbWJlcgorICAgICAgICAgKiB0byBuZWdhdGUgdGhlIHBvdyByZXN1bHQgaWYgaXcgaXMgb2RkLgorICAgICAgICAgKi8KKyAgICAgICAgaXYgPSAtaXY7CisgICAgICAgIG5lZ2F0ZV9yZXN1bHQgPSBET1VCTEVfSVNfT0REX0lOVEVHRVIoaXcpOworICAgIH0KIAotCWlmIChpdiA9PSAxLjApIHsgLyogMSoqdyBpcyAxLCBldmVuIDEqKmluZiBhbmQgMSoqbmFuICovCi0JCS8qICgtMSkgKiogbGFyZ2VfaW50ZWdlciBhbHNvIGVuZHMgdXAgaGVyZS4gIEhlcmUncyBhbgotCQkgKiBleHRyYWN0IGZyb20gdGhlIGNvbW1lbnRzIGZvciB0aGUgcHJldmlvdXMKLQkJICogaW1wbGVtZW50YXRpb24gZXhwbGFpbmluZyB3aHkgdGhpcyBzcGVjaWFsIGNhc2UgaXMKLQkJICogbmVjZXNzYXJ5OgotCQkgKgotCQkgKiAtMSByYWlzZWQgdG8gYW4gZXhhY3QgaW50ZWdlciBzaG91bGQgbmV2ZXIgYmUgZXhjZXB0aW9uYWwuCi0JCSAqIEFsYXMsIHNvbWUgbGlibXMgKGNoaWVmbHkgZ2xpYmMgYXMgb2YgZWFybHkgMjAwMykgcmV0dXJuCi0JCSAqIE5hTiBhbmQgc2V0IEVET00gb24gcG93KC0xLCBsYXJnZV9pbnQpIGlmIHRoZSBpbnQgZG9lc24ndAotCQkgKiBoYXBwZW4gdG8gYmUgcmVwcmVzZW50YWJsZSBpbiBhICpDKiBpbnRlZ2VyLiAgVGhhdCdzIGEKLQkJICogYnVnLgotCQkgKi8KLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShuZWdhdGVfcmVzdWx0ID8gLTEuMCA6IDEuMCk7Ci0JfQorICAgIGlmIChpdiA9PSAxLjApIHsgLyogMSoqdyBpcyAxLCBldmVuIDEqKmluZiBhbmQgMSoqbmFuICovCisgICAgICAgIC8qICgtMSkgKiogbGFyZ2VfaW50ZWdlciBhbHNvIGVuZHMgdXAgaGVyZS4gIEhlcmUncyBhbgorICAgICAgICAgKiBleHRyYWN0IGZyb20gdGhlIGNvbW1lbnRzIGZvciB0aGUgcHJldmlvdXMKKyAgICAgICAgICogaW1wbGVtZW50YXRpb24gZXhwbGFpbmluZyB3aHkgdGhpcyBzcGVjaWFsIGNhc2UgaXMKKyAgICAgICAgICogbmVjZXNzYXJ5OgorICAgICAgICAgKgorICAgICAgICAgKiAtMSByYWlzZWQgdG8gYW4gZXhhY3QgaW50ZWdlciBzaG91bGQgbmV2ZXIgYmUgZXhjZXB0aW9uYWwuCisgICAgICAgICAqIEFsYXMsIHNvbWUgbGlibXMgKGNoaWVmbHkgZ2xpYmMgYXMgb2YgZWFybHkgMjAwMykgcmV0dXJuCisgICAgICAgICAqIE5hTiBhbmQgc2V0IEVET00gb24gcG93KC0xLCBsYXJnZV9pbnQpIGlmIHRoZSBpbnQgZG9lc24ndAorICAgICAgICAgKiBoYXBwZW4gdG8gYmUgcmVwcmVzZW50YWJsZSBpbiBhICpDKiBpbnRlZ2VyLiAgVGhhdCdzIGEKKyAgICAgICAgICogYnVnLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShuZWdhdGVfcmVzdWx0ID8gLTEuMCA6IDEuMCk7CisgICAgfQogCi0JLyogTm93IGl2IGFuZCBpdyBhcmUgZmluaXRlLCBpdyBpcyBub256ZXJvLCBhbmQgaXYgaXMKLQkgKiBwb3NpdGl2ZSBhbmQgbm90IGVxdWFsIHRvIDEuMC4gIFdlIGZpbmFsbHkgYWxsb3cKLQkgKiB0aGUgcGxhdGZvcm0gcG93IHRvIHN0ZXAgaW4gYW5kIGRvIHRoZSByZXN0LgotCSAqLwotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJwb3ciLCByZXR1cm4gTlVMTCkKLQlpeCA9IHBvdyhpdiwgaXcpOwotCVB5RlBFX0VORF9QUk9URUNUKGl4KQotCVB5X0FESlVTVF9FUkFOR0UxKGl4KTsKLQlpZiAobmVnYXRlX3Jlc3VsdCkKLQkJaXggPSAtaXg7CisgICAgLyogTm93IGl2IGFuZCBpdyBhcmUgZmluaXRlLCBpdyBpcyBub256ZXJvLCBhbmQgaXYgaXMKKyAgICAgKiBwb3NpdGl2ZSBhbmQgbm90IGVxdWFsIHRvIDEuMC4gIFdlIGZpbmFsbHkgYWxsb3cKKyAgICAgKiB0aGUgcGxhdGZvcm0gcG93IHRvIHN0ZXAgaW4gYW5kIGRvIHRoZSByZXN0LgorICAgICAqLworICAgIGVycm5vID0gMDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJwb3ciLCByZXR1cm4gTlVMTCkKKyAgICBpeCA9IHBvdyhpdiwgaXcpOworICAgIFB5RlBFX0VORF9QUk9URUNUKGl4KQorICAgIFB5X0FESlVTVF9FUkFOR0UxKGl4KTsKKyAgICBpZiAobmVnYXRlX3Jlc3VsdCkKKyAgICAgICAgaXggPSAtaXg7CiAKLQlpZiAoZXJybm8gIT0gMCkgewotCQkvKiBXZSBkb24ndCBleHBlY3QgYW55IGVycm5vIHZhbHVlIG90aGVyIHRoYW4gRVJBTkdFLCBidXQKLQkJICogdGhlIHJhbmdlIG9mIGxpYm0gYnVncyBhcHBlYXJzIHVuYm91bmRlZC4KLQkJICovCi0JCVB5RXJyX1NldEZyb21FcnJubyhlcnJubyA9PSBFUkFOR0UgPyBQeUV4Y19PdmVyZmxvd0Vycm9yIDoKLQkJCQkJCSAgICAgUHlFeGNfVmFsdWVFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGl4KTsKKyAgICBpZiAoZXJybm8gIT0gMCkgeworICAgICAgICAvKiBXZSBkb24ndCBleHBlY3QgYW55IGVycm5vIHZhbHVlIG90aGVyIHRoYW4gRVJBTkdFLCBidXQKKyAgICAgICAgICogdGhlIHJhbmdlIG9mIGxpYm0gYnVncyBhcHBlYXJzIHVuYm91bmRlZC4KKyAgICAgICAgICovCisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhlcnJubyA9PSBFUkFOR0UgPyBQeUV4Y19PdmVyZmxvd0Vycm9yIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGl4KTsKIH0KIAogI3VuZGVmIERPVUJMRV9JU19PRERfSU5URUdFUgpAQCAtOTIxLDEyOSArOTIxLDEyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X25lZyhQeUZsb2F0T2JqZWN0ICp2KQogewotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoLXYtPm9iX2Z2YWwpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoLXYtPm9iX2Z2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfYWJzKFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmYWJzKHYtPm9iX2Z2YWwpKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGZhYnModi0+b2JfZnZhbCkpOwogfQogCiBzdGF0aWMgaW50CiBmbG9hdF9ub256ZXJvKFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIHYtPm9iX2Z2YWwgIT0gMC4wOworICAgIHJldHVybiB2LT5vYl9mdmFsICE9IDAuMDsKIH0KIAogc3RhdGljIGludAogZmxvYXRfY29lcmNlKFB5T2JqZWN0ICoqcHYsIFB5T2JqZWN0ICoqcHcpCiB7Ci0JaWYgKFB5SW50X0NoZWNrKCpwdykpIHsKLQkJbG9uZyB4ID0gUHlJbnRfQXNMb25nKCpwdyk7Ci0JCSpwdyA9IFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKXgpOwotCQlQeV9JTkNSRUYoKnB2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjaygqcHcpKSB7Ci0JCWRvdWJsZSB4ID0gUHlMb25nX0FzRG91YmxlKCpwdyk7Ci0JCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJKnB3ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwotCQlQeV9JTkNSRUYoKnB2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKFB5RmxvYXRfQ2hlY2soKnB3KSkgewotCQlQeV9JTkNSRUYoKnB2KTsKLQkJUHlfSU5DUkVGKCpwdyk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsgLyogQ2FuJ3QgZG8gaXQgKi8KKyAgICBpZiAoUHlJbnRfQ2hlY2soKnB3KSkgeworICAgICAgICBsb25nIHggPSBQeUludF9Bc0xvbmcoKnB3KTsKKyAgICAgICAgKnB3ID0gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpeCk7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKCpwdykpIHsKKyAgICAgICAgZG91YmxlIHggPSBQeUxvbmdfQXNEb3VibGUoKnB3KTsKKyAgICAgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqcHcgPSBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlGbG9hdF9DaGVjaygqcHcpKSB7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICBQeV9JTkNSRUYoKnB3KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOyAvKiBDYW4ndCBkbyBpdCAqLwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfaXNfaW50ZWdlcihQeU9iamVjdCAqdikKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JUHlPYmplY3QgKm87Ci0JCi0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5X0lTX0ZJTklURSh4KSkKLQkJUHlfUkVUVVJOX0ZBTFNFOwotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpc19pbnRlZ2VyIiwgcmV0dXJuIE5VTEwpCi0JbyA9IChmbG9vcih4KSA9PSB4KSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQlQeUZQRV9FTkRfUFJPVEVDVCh4KQotCWlmIChlcnJubyAhPSAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhlcnJubyA9PSBFUkFOR0UgPyBQeUV4Y19PdmVyZmxvd0Vycm9yIDoKLQkJCQkJCSAgICAgUHlFeGNfVmFsdWVFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYobyk7Ci0JcmV0dXJuIG87CisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIFB5T2JqZWN0ICpvOworCisgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5X0lTX0ZJTklURSh4KSkKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIGVycm5vID0gMDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJpc19pbnRlZ2VyIiwgcmV0dXJuIE5VTEwpCisgICAgbyA9IChmbG9vcih4KSA9PSB4KSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVCh4KQorICAgIGlmIChlcnJubyAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhlcnJubyA9PSBFUkFOR0UgPyBQeUV4Y19PdmVyZmxvd0Vycm9yIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYobyk7CisgICAgcmV0dXJuIG87CiB9CiAKICNpZiAwCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfaXNfaW5mKFB5T2JqZWN0ICp2KQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfSU5GSU5JVFkoeCkpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfSU5GSU5JVFkoeCkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfaXNfbmFuKFB5T2JqZWN0ICp2KQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfTkFOKHgpKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKVB5X0lTX05BTih4KSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9pc19maW5pdGUoUHlPYmplY3QgKnYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19GSU5JVEUoeCkpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfRklOSVRFKHgpKTsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfdHJ1bmMoUHlPYmplY3QgKnYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWRvdWJsZSB3aG9sZXBhcnQ7CS8qIGludGVncmFsIHBvcnRpb24gb2YgeCwgcm91bmRlZCB0b3dhcmQgMCAqLworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBkb3VibGUgd2hvbGVwYXJ0OyAgICAgICAgICAgLyogaW50ZWdyYWwgcG9ydGlvbiBvZiB4LCByb3VuZGVkIHRvd2FyZCAwICovCiAKLQkodm9pZCltb2RmKHgsICZ3aG9sZXBhcnQpOwotCS8qIFRyeSB0byBnZXQgb3V0IGNoZWFwIGlmIHRoaXMgZml0cyBpbiBhIFB5dGhvbiBpbnQuICBUaGUgYXR0ZW1wdAotCSAqIHRvIGNhc3QgdG8gbG9uZyBtdXN0IGJlIHByb3RlY3RlZCwgYXMgQyBkb2Vzbid0IGRlZmluZSB3aGF0Ci0JICogaGFwcGVucyBpZiB0aGUgZG91YmxlIGlzIHRvbyBiaWcgdG8gZml0IGluIGEgbG9uZy4gIFNvbWUgcmFyZQotCSAqIHN5c3RlbXMgcmFpc2UgYW4gZXhjZXB0aW9uIHRoZW4gKFJJU0NPUyB3YXMgbWVudGlvbmVkIGFzIG9uZSwKLQkgKiBhbmQgc29tZW9uZSB1c2luZyBhIG5vbi1kZWZhdWx0IG9wdGlvbiBvbiBTdW4gYWxzbyBidW1wZWQgaW50bwotCSAqIHRoYXQpLiAgTm90ZSB0aGF0IGNoZWNraW5nIGZvciA+PSBhbmQgPD0gTE9OR197TUlOLE1BWH0gd291bGQKLQkgKiBzdGlsbCBiZSB2dWxuZXJhYmxlOiAgaWYgYSBsb25nIGhhcyBtb3JlIGJpdHMgb2YgcHJlY2lzaW9uIHRoYW4KLQkgKiBhIGRvdWJsZSwgY2FzdGluZyBNSU4vTUFYIHRvIGRvdWJsZSBtYXkgeWllbGQgYW4gYXBwcm94aW1hdGlvbiwKLQkgKiBhbmQgaWYgdGhhdCdzIHJvdW5kZWQgdXAsIHRoZW4sIGUuZy4sIHdob2xlcGFydD1MT05HX01BWCsxIHdvdWxkCi0JICogeWllbGQgdHJ1ZSBmcm9tIHRoZSBDIGV4cHJlc3Npb24gd2hvbGVwYXJ0PD1MT05HX01BWCwgZGVzcGl0ZQotCSAqIHRoYXQgd2hvbGVwYXJ0IGlzIGFjdHVhbGx5IGdyZWF0ZXIgdGhhbiBMT05HX01BWC4KLQkgKi8KLQlpZiAoTE9OR19NSU4gPCB3aG9sZXBhcnQgJiYgd2hvbGVwYXJ0IDwgTE9OR19NQVgpIHsKLQkJY29uc3QgbG9uZyBhc2xvbmcgPSAobG9uZyl3aG9sZXBhcnQ7Ci0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhhc2xvbmcpOwotCX0KLQlyZXR1cm4gUHlMb25nX0Zyb21Eb3VibGUod2hvbGVwYXJ0KTsKKyAgICAodm9pZCltb2RmKHgsICZ3aG9sZXBhcnQpOworICAgIC8qIFRyeSB0byBnZXQgb3V0IGNoZWFwIGlmIHRoaXMgZml0cyBpbiBhIFB5dGhvbiBpbnQuICBUaGUgYXR0ZW1wdAorICAgICAqIHRvIGNhc3QgdG8gbG9uZyBtdXN0IGJlIHByb3RlY3RlZCwgYXMgQyBkb2Vzbid0IGRlZmluZSB3aGF0CisgICAgICogaGFwcGVucyBpZiB0aGUgZG91YmxlIGlzIHRvbyBiaWcgdG8gZml0IGluIGEgbG9uZy4gIFNvbWUgcmFyZQorICAgICAqIHN5c3RlbXMgcmFpc2UgYW4gZXhjZXB0aW9uIHRoZW4gKFJJU0NPUyB3YXMgbWVudGlvbmVkIGFzIG9uZSwKKyAgICAgKiBhbmQgc29tZW9uZSB1c2luZyBhIG5vbi1kZWZhdWx0IG9wdGlvbiBvbiBTdW4gYWxzbyBidW1wZWQgaW50bworICAgICAqIHRoYXQpLiAgTm90ZSB0aGF0IGNoZWNraW5nIGZvciA+PSBhbmQgPD0gTE9OR197TUlOLE1BWH0gd291bGQKKyAgICAgKiBzdGlsbCBiZSB2dWxuZXJhYmxlOiAgaWYgYSBsb25nIGhhcyBtb3JlIGJpdHMgb2YgcHJlY2lzaW9uIHRoYW4KKyAgICAgKiBhIGRvdWJsZSwgY2FzdGluZyBNSU4vTUFYIHRvIGRvdWJsZSBtYXkgeWllbGQgYW4gYXBwcm94aW1hdGlvbiwKKyAgICAgKiBhbmQgaWYgdGhhdCdzIHJvdW5kZWQgdXAsIHRoZW4sIGUuZy4sIHdob2xlcGFydD1MT05HX01BWCsxIHdvdWxkCisgICAgICogeWllbGQgdHJ1ZSBmcm9tIHRoZSBDIGV4cHJlc3Npb24gd2hvbGVwYXJ0PD1MT05HX01BWCwgZGVzcGl0ZQorICAgICAqIHRoYXQgd2hvbGVwYXJ0IGlzIGFjdHVhbGx5IGdyZWF0ZXIgdGhhbiBMT05HX01BWC4KKyAgICAgKi8KKyAgICBpZiAoTE9OR19NSU4gPCB3aG9sZXBhcnQgJiYgd2hvbGVwYXJ0IDwgTE9OR19NQVgpIHsKKyAgICAgICAgY29uc3QgbG9uZyBhc2xvbmcgPSAobG9uZyl3aG9sZXBhcnQ7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhhc2xvbmcpOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Eb3VibGUod2hvbGVwYXJ0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2xvbmcoUHlPYmplY3QgKnYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCXJldHVybiBQeUxvbmdfRnJvbURvdWJsZSh4KTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tRG91YmxlKHgpOwogfQogCiAvKiBfUHlfZG91YmxlX3JvdW5kOiByb3VuZHMgYSBmaW5pdGUgbm9uemVybyBkb3VibGUgdG8gdGhlIGNsb3Nlc3QgbXVsdGlwbGUgb2YKQEAgLTEwNjgsMTI0ICsxMDY4LDEyNCBAQAogUHlPYmplY3QgKgogX1B5X2RvdWJsZV9yb3VuZChkb3VibGUgeCwgaW50IG5kaWdpdHMpIHsKIAotCWRvdWJsZSByb3VuZGVkLCBtOwotCVB5X3NzaXplX3QgYnVmbGVuLCBteWJ1Zmxlbj0xMDA7Ci0JY2hhciAqYnVmLCAqYnVmX2VuZCwgc2hvcnRidWZbMTAwXSwgKm15YnVmPXNob3J0YnVmOwotCWludCBkZWNwdCwgc2lnbiwgdmFsLCBoYWxmd2F5X2Nhc2U7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgZG91YmxlIHJvdW5kZWQsIG07CisgICAgUHlfc3NpemVfdCBidWZsZW4sIG15YnVmbGVuPTEwMDsKKyAgICBjaGFyICpidWYsICpidWZfZW5kLCBzaG9ydGJ1ZlsxMDBdLCAqbXlidWY9c2hvcnRidWY7CisgICAgaW50IGRlY3B0LCBzaWduLCB2YWwsIGhhbGZ3YXlfY2FzZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCS8qIFRoZSBiYXNpYyBpZGVhIGlzIHZlcnkgc2ltcGxlOiBjb252ZXJ0IGFuZCByb3VuZCB0aGUgZG91YmxlIHRvIGEKLQkgICBkZWNpbWFsIHN0cmluZyB1c2luZyBfUHlfZGdfZHRvYSwgdGhlbiBjb252ZXJ0IHRoYXQgZGVjaW1hbCBzdHJpbmcKLQkgICBiYWNrIHRvIGEgZG91YmxlIHdpdGggX1B5X2RnX3N0cnRvZC4gIFRoZXJlJ3Mgb25lIG1pbm9yIGRpZmZpY3VsdHk6Ci0JICAgUHl0aG9uIDIueCBleHBlY3RzIHJvdW5kIHRvIGRvIHJvdW5kLWhhbGYtYXdheS1mcm9tLXplcm8sIHdoaWxlCi0JICAgX1B5X2RnX2R0b2EgZG9lcyByb3VuZC1oYWxmLXRvLWV2ZW4uICBTbyB3ZSBuZWVkIHNvbWUgd2F5IHRvIGRldGVjdAotCSAgIGFuZCBjb3JyZWN0IHRoZSBoYWxmd2F5IGNhc2VzLgorICAgIC8qIFRoZSBiYXNpYyBpZGVhIGlzIHZlcnkgc2ltcGxlOiBjb252ZXJ0IGFuZCByb3VuZCB0aGUgZG91YmxlIHRvIGEKKyAgICAgICBkZWNpbWFsIHN0cmluZyB1c2luZyBfUHlfZGdfZHRvYSwgdGhlbiBjb252ZXJ0IHRoYXQgZGVjaW1hbCBzdHJpbmcKKyAgICAgICBiYWNrIHRvIGEgZG91YmxlIHdpdGggX1B5X2RnX3N0cnRvZC4gIFRoZXJlJ3Mgb25lIG1pbm9yIGRpZmZpY3VsdHk6CisgICAgICAgUHl0aG9uIDIueCBleHBlY3RzIHJvdW5kIHRvIGRvIHJvdW5kLWhhbGYtYXdheS1mcm9tLXplcm8sIHdoaWxlCisgICAgICAgX1B5X2RnX2R0b2EgZG9lcyByb3VuZC1oYWxmLXRvLWV2ZW4uICBTbyB3ZSBuZWVkIHNvbWUgd2F5IHRvIGRldGVjdAorICAgICAgIGFuZCBjb3JyZWN0IHRoZSBoYWxmd2F5IGNhc2VzLgogCi0JICAgRGV0ZWN0aW9uOiBhIGhhbGZ3YXkgdmFsdWUgaGFzIHRoZSBmb3JtIGsgKiAwLjUgKiAxMCoqLW5kaWdpdHMgZm9yCi0JICAgc29tZSBvZGQgaW50ZWdlciBrLiAgT3IgaW4gb3RoZXIgd29yZHMsIGEgcmF0aW9uYWwgbnVtYmVyIHggaXMKLQkgICBleGFjdGx5IGhhbGZ3YXkgYmV0d2VlbiB0d28gbXVsdGlwbGVzIG9mIDEwKiotbmRpZ2l0cyBpZiBpdHMKLQkgICAyLXZhbHVhdGlvbiBpcyBleGFjdGx5IC1uZGlnaXRzLTEgYW5kIGl0cyA1LXZhbHVhdGlvbiBpcyBhdCBsZWFzdAotCSAgIC1uZGlnaXRzLiAgRm9yIG5kaWdpdHMgPj0gMCB0aGUgbGF0dGVyIGNvbmRpdGlvbiBpcyBhdXRvbWF0aWNhbGx5Ci0JICAgc2F0aXNmaWVkIGZvciBhIGJpbmFyeSBmbG9hdCB4LCBzaW5jZSBhbnkgc3VjaCBmbG9hdCBoYXMKLQkgICBub25uZWdhdGl2ZSA1LXZhbHVhdGlvbi4gIEZvciAwID4gbmRpZ2l0cyA+PSAtMjIsIHggbmVlZHMgdG8gYmUgYW4KLQkgICBpbnRlZ3JhbCBtdWx0aXBsZSBvZiA1KiotbmRpZ2l0czsgd2UgY2FuIGNoZWNrIHRoaXMgdXNpbmcgZm1vZC4KLQkgICBGb3IgLTIyID4gbmRpZ2l0cywgdGhlcmUgYXJlIG5vIGhhbGZ3YXkgY2FzZXM6IDUqKjIzIHRha2VzIDU0IGJpdHMKLQkgICB0byByZXByZXNlbnQgZXhhY3RseSwgc28gYW55IG9kZCBtdWx0aXBsZSBvZiAwLjUgKiAxMCoqbiBmb3IgbiA+PQotCSAgIDIzIHRha2VzIGF0IGxlYXN0IDU0IGJpdHMgb2YgcHJlY2lzaW9uIHRvIHJlcHJlc2VudCBleGFjdGx5LgorICAgICAgIERldGVjdGlvbjogYSBoYWxmd2F5IHZhbHVlIGhhcyB0aGUgZm9ybSBrICogMC41ICogMTAqKi1uZGlnaXRzIGZvcgorICAgICAgIHNvbWUgb2RkIGludGVnZXIgay4gIE9yIGluIG90aGVyIHdvcmRzLCBhIHJhdGlvbmFsIG51bWJlciB4IGlzCisgICAgICAgZXhhY3RseSBoYWxmd2F5IGJldHdlZW4gdHdvIG11bHRpcGxlcyBvZiAxMCoqLW5kaWdpdHMgaWYgaXRzCisgICAgICAgMi12YWx1YXRpb24gaXMgZXhhY3RseSAtbmRpZ2l0cy0xIGFuZCBpdHMgNS12YWx1YXRpb24gaXMgYXQgbGVhc3QKKyAgICAgICAtbmRpZ2l0cy4gIEZvciBuZGlnaXRzID49IDAgdGhlIGxhdHRlciBjb25kaXRpb24gaXMgYXV0b21hdGljYWxseQorICAgICAgIHNhdGlzZmllZCBmb3IgYSBiaW5hcnkgZmxvYXQgeCwgc2luY2UgYW55IHN1Y2ggZmxvYXQgaGFzCisgICAgICAgbm9ubmVnYXRpdmUgNS12YWx1YXRpb24uICBGb3IgMCA+IG5kaWdpdHMgPj0gLTIyLCB4IG5lZWRzIHRvIGJlIGFuCisgICAgICAgaW50ZWdyYWwgbXVsdGlwbGUgb2YgNSoqLW5kaWdpdHM7IHdlIGNhbiBjaGVjayB0aGlzIHVzaW5nIGZtb2QuCisgICAgICAgRm9yIC0yMiA+IG5kaWdpdHMsIHRoZXJlIGFyZSBubyBoYWxmd2F5IGNhc2VzOiA1KioyMyB0YWtlcyA1NCBiaXRzCisgICAgICAgdG8gcmVwcmVzZW50IGV4YWN0bHksIHNvIGFueSBvZGQgbXVsdGlwbGUgb2YgMC41ICogMTAqKm4gZm9yIG4gPj0KKyAgICAgICAyMyB0YWtlcyBhdCBsZWFzdCA1NCBiaXRzIG9mIHByZWNpc2lvbiB0byByZXByZXNlbnQgZXhhY3RseS4KIAotCSAgIENvcnJlY3Rpb246IGEgc2ltcGxlIHN0cmF0ZWd5IGZvciBkZWFsaW5nIHdpdGggaGFsZndheSBjYXNlcyBpcyB0bwotCSAgIChmb3IgdGhlIGhhbGZ3YXkgY2FzZXMgb25seSkgY2FsbCBfUHlfZGdfZHRvYSB3aXRoIGFuIGFyZ3VtZW50IG9mCi0JICAgbmRpZ2l0cysxIGluc3RlYWQgb2YgbmRpZ2l0cyAodGh1cyBkb2luZyBhbiBleGFjdCBjb252ZXJzaW9uIHRvCi0JICAgZGVjaW1hbCksIHJvdW5kIHRoZSByZXN1bHRpbmcgc3RyaW5nIG1hbnVhbGx5LCBhbmQgdGhlbiBjb252ZXJ0Ci0JICAgYmFjayB1c2luZyBfUHlfZGdfc3RydG9kLgotCSovCisgICAgICAgQ29ycmVjdGlvbjogYSBzaW1wbGUgc3RyYXRlZ3kgZm9yIGRlYWxpbmcgd2l0aCBoYWxmd2F5IGNhc2VzIGlzIHRvCisgICAgICAgKGZvciB0aGUgaGFsZndheSBjYXNlcyBvbmx5KSBjYWxsIF9QeV9kZ19kdG9hIHdpdGggYW4gYXJndW1lbnQgb2YKKyAgICAgICBuZGlnaXRzKzEgaW5zdGVhZCBvZiBuZGlnaXRzICh0aHVzIGRvaW5nIGFuIGV4YWN0IGNvbnZlcnNpb24gdG8KKyAgICAgICBkZWNpbWFsKSwgcm91bmQgdGhlIHJlc3VsdGluZyBzdHJpbmcgbWFudWFsbHksIGFuZCB0aGVuIGNvbnZlcnQKKyAgICAgICBiYWNrIHVzaW5nIF9QeV9kZ19zdHJ0b2QuCisgICAgKi8KIAotCS8qIG5hbnMsIGluZmluaXRpZXMgYW5kIHplcm9zIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBkZWFsdAotCSAgIHdpdGggYnkgdGhlIGNhbGxlciAoaW4gdGhpcyBjYXNlLCBidWlsdGluX3JvdW5kKSAqLwotCWFzc2VydChQeV9JU19GSU5JVEUoeCkgJiYgeCAhPSAwLjApOworICAgIC8qIG5hbnMsIGluZmluaXRpZXMgYW5kIHplcm9zIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBkZWFsdAorICAgICAgIHdpdGggYnkgdGhlIGNhbGxlciAoaW4gdGhpcyBjYXNlLCBidWlsdGluX3JvdW5kKSAqLworICAgIGFzc2VydChQeV9JU19GSU5JVEUoeCkgJiYgeCAhPSAwLjApOwogCi0JLyogZmluZCAyLXZhbHVhdGlvbiB2YWwgb2YgeCAqLwotCW0gPSBmcmV4cCh4LCAmdmFsKTsKLQl3aGlsZSAobSAhPSBmbG9vcihtKSkgewotCQltICo9IDIuMDsKLQkJdmFsLS07Ci0JfQorICAgIC8qIGZpbmQgMi12YWx1YXRpb24gdmFsIG9mIHggKi8KKyAgICBtID0gZnJleHAoeCwgJnZhbCk7CisgICAgd2hpbGUgKG0gIT0gZmxvb3IobSkpIHsKKyAgICAgICAgbSAqPSAyLjA7CisgICAgICAgIHZhbC0tOworICAgIH0KIAotCS8qIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBoYWxmd2F5IGNhc2UgKi8KLQlpZiAodmFsID09IC1uZGlnaXRzLTEpIHsKLQkJaWYgKG5kaWdpdHMgPj0gMCkKLQkJCWhhbGZ3YXlfY2FzZSA9IDE7Ci0JCWVsc2UgaWYgKG5kaWdpdHMgPj0gLUZJVkVfUE9XX0xJTUlUKSB7Ci0JCQlkb3VibGUgZml2ZV9wb3cgPSAxLjA7Ci0JCQlpbnQgaTsKLQkJCWZvciAoaT0wOyBpIDwgLW5kaWdpdHM7IGkrKykKLQkJCQlmaXZlX3BvdyAqPSA1LjA7Ci0JCQloYWxmd2F5X2Nhc2UgPSBmbW9kKHgsIGZpdmVfcG93KSA9PSAwLjA7Ci0JCX0KLQkJZWxzZQotCQkJaGFsZndheV9jYXNlID0gMDsKLQl9Ci0JZWxzZQotCQloYWxmd2F5X2Nhc2UgPSAwOworICAgIC8qIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBoYWxmd2F5IGNhc2UgKi8KKyAgICBpZiAodmFsID09IC1uZGlnaXRzLTEpIHsKKyAgICAgICAgaWYgKG5kaWdpdHMgPj0gMCkKKyAgICAgICAgICAgIGhhbGZ3YXlfY2FzZSA9IDE7CisgICAgICAgIGVsc2UgaWYgKG5kaWdpdHMgPj0gLUZJVkVfUE9XX0xJTUlUKSB7CisgICAgICAgICAgICBkb3VibGUgZml2ZV9wb3cgPSAxLjA7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgLW5kaWdpdHM7IGkrKykKKyAgICAgICAgICAgICAgICBmaXZlX3BvdyAqPSA1LjA7CisgICAgICAgICAgICBoYWxmd2F5X2Nhc2UgPSBmbW9kKHgsIGZpdmVfcG93KSA9PSAwLjA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGFsZndheV9jYXNlID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBoYWxmd2F5X2Nhc2UgPSAwOwogCi0JLyogcm91bmQgdG8gYSBkZWNpbWFsIHN0cmluZzsgdXNlIGFuIGV4dHJhIHBsYWNlIGZvciBoYWxmd2F5IGNhc2UgKi8KLQlidWYgPSBfUHlfZGdfZHRvYSh4LCAzLCBuZGlnaXRzK2hhbGZ3YXlfY2FzZSwgJmRlY3B0LCAmc2lnbiwgJmJ1Zl9lbmQpOwotCWlmIChidWYgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYnVmbGVuID0gYnVmX2VuZCAtIGJ1ZjsKKyAgICAvKiByb3VuZCB0byBhIGRlY2ltYWwgc3RyaW5nOyB1c2UgYW4gZXh0cmEgcGxhY2UgZm9yIGhhbGZ3YXkgY2FzZSAqLworICAgIGJ1ZiA9IF9QeV9kZ19kdG9hKHgsIDMsIG5kaWdpdHMraGFsZndheV9jYXNlLCAmZGVjcHQsICZzaWduLCAmYnVmX2VuZCk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBidWZsZW4gPSBidWZfZW5kIC0gYnVmOwogCi0JLyogaW4gaGFsZndheSBjYXNlLCBkbyB0aGUgcm91bmQtaGFsZi1hd2F5LWZyb20temVybyBtYW51YWxseSAqLwotCWlmIChoYWxmd2F5X2Nhc2UpIHsKLQkJaW50IGksIGNhcnJ5OwotCQkvKiBzYW5pdHkgY2hlY2s6IF9QeV9kZ19kdG9hIHNob3VsZCBub3QgaGF2ZSBzdHJpcHBlZAotCQkgICBhbnkgemVyb3MgZnJvbSB0aGUgcmVzdWx0OiB0aGVyZSBzaG91bGQgYmUgZXhhY3RseQotCQkgICBuZGlnaXRzKzEgcGxhY2VzIGZvbGxvd2luZyB0aGUgZGVjaW1hbCBwb2ludCwgYW5kCi0JCSAgIHRoZSBsYXN0IGRpZ2l0IGluIHRoZSBidWZmZXIgc2hvdWxkIGJlIGEgJzUnLiovCi0JCWFzc2VydChidWZsZW4gLSBkZWNwdCA9PSBuZGlnaXRzKzEpOwotCQlhc3NlcnQoYnVmW2J1Zmxlbi0xXSA9PSAnNScpOworICAgIC8qIGluIGhhbGZ3YXkgY2FzZSwgZG8gdGhlIHJvdW5kLWhhbGYtYXdheS1mcm9tLXplcm8gbWFudWFsbHkgKi8KKyAgICBpZiAoaGFsZndheV9jYXNlKSB7CisgICAgICAgIGludCBpLCBjYXJyeTsKKyAgICAgICAgLyogc2FuaXR5IGNoZWNrOiBfUHlfZGdfZHRvYSBzaG91bGQgbm90IGhhdmUgc3RyaXBwZWQKKyAgICAgICAgICAgYW55IHplcm9zIGZyb20gdGhlIHJlc3VsdDogdGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkKKyAgICAgICAgICAgbmRpZ2l0cysxIHBsYWNlcyBmb2xsb3dpbmcgdGhlIGRlY2ltYWwgcG9pbnQsIGFuZAorICAgICAgICAgICB0aGUgbGFzdCBkaWdpdCBpbiB0aGUgYnVmZmVyIHNob3VsZCBiZSBhICc1Jy4qLworICAgICAgICBhc3NlcnQoYnVmbGVuIC0gZGVjcHQgPT0gbmRpZ2l0cysxKTsKKyAgICAgICAgYXNzZXJ0KGJ1ZltidWZsZW4tMV0gPT0gJzUnKTsKIAotCQkvKiBpbmNyZW1lbnQgYW5kIHNoaWZ0IHJpZ2h0IGF0IHRoZSBzYW1lIHRpbWUuICovCi0JCWRlY3B0ICs9IDE7Ci0JCWNhcnJ5ID0gMTsKLQkJZm9yIChpPWJ1Zmxlbi0xOyBpLS0gPiAwOykgewotCQkJY2FycnkgKz0gYnVmW2ldIC0gJzAnOwotCQkJYnVmW2krMV0gPSBjYXJyeSAlIDEwICsgJzAnOwotCQkJY2FycnkgLz0gMTA7Ci0JCX0KLQkJYnVmWzBdID0gY2FycnkgKyAnMCc7Ci0JfQorICAgICAgICAvKiBpbmNyZW1lbnQgYW5kIHNoaWZ0IHJpZ2h0IGF0IHRoZSBzYW1lIHRpbWUuICovCisgICAgICAgIGRlY3B0ICs9IDE7CisgICAgICAgIGNhcnJ5ID0gMTsKKyAgICAgICAgZm9yIChpPWJ1Zmxlbi0xOyBpLS0gPiAwOykgeworICAgICAgICAgICAgY2FycnkgKz0gYnVmW2ldIC0gJzAnOworICAgICAgICAgICAgYnVmW2krMV0gPSBjYXJyeSAlIDEwICsgJzAnOworICAgICAgICAgICAgY2FycnkgLz0gMTA7CisgICAgICAgIH0KKyAgICAgICAgYnVmWzBdID0gY2FycnkgKyAnMCc7CisgICAgfQogCi0JLyogR2V0IG5ldyBidWZmZXIgaWYgc2hvcnRidWYgaXMgdG9vIHNtYWxsLiAgU3BhY2UgbmVlZGVkIDw9IGJ1Zl9lbmQgLQotCSAgIGJ1ZiArIDg6ICgxIGV4dHJhIGZvciAnMCcsIDEgZm9yIHNpZ24sIDUgZm9yIGV4cCwgMSBmb3IgJ1wwJykuICovCi0JaWYgKGJ1ZmxlbiArIDggPiBteWJ1ZmxlbikgewotCQlteWJ1ZmxlbiA9IGJ1Zmxlbis4OwotCQlteWJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKG15YnVmbGVuKTsKLQkJaWYgKG15YnVmID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9Ci0JLyogY29weSBidWYgdG8gbXlidWYsIGFkZGluZyBleHBvbmVudCwgc2lnbiBhbmQgbGVhZGluZyAwICovCi0JUHlPU19zbnByaW50ZihteWJ1ZiwgbXlidWZsZW4sICIlczAlc2UlZCIsIChzaWduID8gIi0iIDogIiIpLAotCQkgICAgICBidWYsIGRlY3B0IC0gKGludClidWZsZW4pOworICAgIC8qIEdldCBuZXcgYnVmZmVyIGlmIHNob3J0YnVmIGlzIHRvbyBzbWFsbC4gIFNwYWNlIG5lZWRlZCA8PSBidWZfZW5kIC0KKyAgICAgICBidWYgKyA4OiAoMSBleHRyYSBmb3IgJzAnLCAxIGZvciBzaWduLCA1IGZvciBleHAsIDEgZm9yICdcMCcpLiAqLworICAgIGlmIChidWZsZW4gKyA4ID4gbXlidWZsZW4pIHsKKyAgICAgICAgbXlidWZsZW4gPSBidWZsZW4rODsKKyAgICAgICAgbXlidWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhteWJ1Zmxlbik7CisgICAgICAgIGlmIChteWJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgfQorICAgIC8qIGNvcHkgYnVmIHRvIG15YnVmLCBhZGRpbmcgZXhwb25lbnQsIHNpZ24gYW5kIGxlYWRpbmcgMCAqLworICAgIFB5T1Nfc25wcmludGYobXlidWYsIG15YnVmbGVuLCAiJXMwJXNlJWQiLCAoc2lnbiA/ICItIiA6ICIiKSwKKyAgICAgICAgICAgICAgICAgIGJ1ZiwgZGVjcHQgLSAoaW50KWJ1Zmxlbik7CiAKLQkvKiBhbmQgY29udmVydCB0aGUgcmVzdWx0aW5nIHN0cmluZyBiYWNrIHRvIGEgZG91YmxlICovCi0JZXJybm8gPSAwOwotCXJvdW5kZWQgPSBfUHlfZGdfc3RydG9kKG15YnVmLCBOVUxMKTsKLQlpZiAoZXJybm8gPT0gRVJBTkdFICYmIGZhYnMocm91bmRlZCkgPj0gMS4pCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJyb3VuZGVkIHZhbHVlIHRvbyBsYXJnZSB0byByZXByZXNlbnQiKTsKLQllbHNlCi0JCXJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZShyb3VuZGVkKTsKKyAgICAvKiBhbmQgY29udmVydCB0aGUgcmVzdWx0aW5nIHN0cmluZyBiYWNrIHRvIGEgZG91YmxlICovCisgICAgZXJybm8gPSAwOworICAgIHJvdW5kZWQgPSBfUHlfZGdfc3RydG9kKG15YnVmLCBOVUxMKTsKKyAgICBpZiAoZXJybm8gPT0gRVJBTkdFICYmIGZhYnMocm91bmRlZCkgPj0gMS4pCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJvdW5kZWQgdmFsdWUgdG9vIGxhcmdlIHRvIHJlcHJlc2VudCIpOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHJvdW5kZWQpOwogCi0JLyogZG9uZSBjb21wdXRpbmcgdmFsdWU7ICBub3cgY2xlYW4gdXAgKi8KLQlpZiAobXlidWYgIT0gc2hvcnRidWYpCi0JCVB5TWVtX0ZyZWUobXlidWYpOworICAgIC8qIGRvbmUgY29tcHV0aW5nIHZhbHVlOyAgbm93IGNsZWFuIHVwICovCisgICAgaWYgKG15YnVmICE9IHNob3J0YnVmKQorICAgICAgICBQeU1lbV9GcmVlKG15YnVmKTsKICAgZXhpdDoKLQlfUHlfZGdfZnJlZWR0b2EoYnVmKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIF9QeV9kZ19mcmVlZHRvYShidWYpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKICN1bmRlZiBGSVZFX1BPV19MSU1JVApAQCAtMTE5Nyw0NyArMTE5Nyw0NyBAQAogCiBQeU9iamVjdCAqCiBfUHlfZG91YmxlX3JvdW5kKGRvdWJsZSB4LCBpbnQgbmRpZ2l0cykgewotCWRvdWJsZSBwb3cxLCBwb3cyLCB5LCB6OwotCWlmIChuZGlnaXRzID49IDApIHsKLQkJaWYgKG5kaWdpdHMgPiAyMikgewotCQkJLyogcG93MSBhbmQgcG93MiBhcmUgZWFjaCBzYWZlIGZyb20gb3ZlcmZsb3csIGJ1dAotCQkJICAgcG93MSpwb3cyIH49IHBvdygxMC4wLCBuZGlnaXRzKSBtaWdodCBvdmVyZmxvdyAqLwotCQkJcG93MSA9IHBvdygxMC4wLCAoZG91YmxlKShuZGlnaXRzLTIyKSk7Ci0JCQlwb3cyID0gMWUyMjsKLQkJfQotCQllbHNlIHsKLQkJCXBvdzEgPSBwb3coMTAuMCwgKGRvdWJsZSluZGlnaXRzKTsKLQkJCXBvdzIgPSAxLjA7Ci0JCX0KLQkJeSA9ICh4KnBvdzEpKnBvdzI7Ci0JCS8qIGlmIHkgb3ZlcmZsb3dzLCB0aGVuIHJvdW5kZWQgdmFsdWUgaXMgZXhhY3RseSB4ICovCi0JCWlmICghUHlfSVNfRklOSVRFKHkpKQotCQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKLQl9Ci0JZWxzZSB7Ci0JCXBvdzEgPSBwb3coMTAuMCwgKGRvdWJsZSktbmRpZ2l0cyk7Ci0JCXBvdzIgPSAxLjA7IC8qIHVudXNlZDsgc2lsZW5jZXMgYSBnY2MgY29tcGlsZXIgd2FybmluZyAqLwotCQl5ID0geCAvIHBvdzE7Ci0JfQorICAgIGRvdWJsZSBwb3cxLCBwb3cyLCB5LCB6OworICAgIGlmIChuZGlnaXRzID49IDApIHsKKyAgICAgICAgaWYgKG5kaWdpdHMgPiAyMikgeworICAgICAgICAgICAgLyogcG93MSBhbmQgcG93MiBhcmUgZWFjaCBzYWZlIGZyb20gb3ZlcmZsb3csIGJ1dAorICAgICAgICAgICAgICAgcG93MSpwb3cyIH49IHBvdygxMC4wLCBuZGlnaXRzKSBtaWdodCBvdmVyZmxvdyAqLworICAgICAgICAgICAgcG93MSA9IHBvdygxMC4wLCAoZG91YmxlKShuZGlnaXRzLTIyKSk7CisgICAgICAgICAgICBwb3cyID0gMWUyMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHBvdzEgPSBwb3coMTAuMCwgKGRvdWJsZSluZGlnaXRzKTsKKyAgICAgICAgICAgIHBvdzIgPSAxLjA7CisgICAgICAgIH0KKyAgICAgICAgeSA9ICh4KnBvdzEpKnBvdzI7CisgICAgICAgIC8qIGlmIHkgb3ZlcmZsb3dzLCB0aGVuIHJvdW5kZWQgdmFsdWUgaXMgZXhhY3RseSB4ICovCisgICAgICAgIGlmICghUHlfSVNfRklOSVRFKHkpKQorICAgICAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHBvdzEgPSBwb3coMTAuMCwgKGRvdWJsZSktbmRpZ2l0cyk7CisgICAgICAgIHBvdzIgPSAxLjA7IC8qIHVudXNlZDsgc2lsZW5jZXMgYSBnY2MgY29tcGlsZXIgd2FybmluZyAqLworICAgICAgICB5ID0geCAvIHBvdzE7CisgICAgfQogCi0JeiA9IHJvdW5kKHkpOwotCWlmIChmYWJzKHkteikgPT0gMC41KQotCQkvKiBoYWxmd2F5IGJldHdlZW4gdHdvIGludGVnZXJzOyB1c2Ugcm91bmQtYXdheS1mcm9tLXplcm8gKi8KLQkJeiA9IHkgKyBjb3B5c2lnbigwLjUsIHkpOworICAgIHogPSByb3VuZCh5KTsKKyAgICBpZiAoZmFicyh5LXopID09IDAuNSkKKyAgICAgICAgLyogaGFsZndheSBiZXR3ZWVuIHR3byBpbnRlZ2VyczsgdXNlIHJvdW5kLWF3YXktZnJvbS16ZXJvICovCisgICAgICAgIHogPSB5ICsgY29weXNpZ24oMC41LCB5KTsKIAotCWlmIChuZGlnaXRzID49IDApCi0JCXogPSAoeiAvIHBvdzIpIC8gcG93MTsKLQllbHNlCi0JCXogKj0gcG93MTsKKyAgICBpZiAobmRpZ2l0cyA+PSAwKQorICAgICAgICB6ID0gKHogLyBwb3cyKSAvIHBvdzE7CisgICAgZWxzZQorICAgICAgICB6ICo9IHBvdzE7CiAKLQkvKiBpZiBjb21wdXRhdGlvbiByZXN1bHRlZCBpbiBvdmVyZmxvdywgcmFpc2UgT3ZlcmZsb3dFcnJvciAqLwotCWlmICghUHlfSVNfRklOSVRFKHopKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJvdmVyZmxvdyBvY2N1cnJlZCBkdXJpbmcgcm91bmQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIGlmIGNvbXB1dGF0aW9uIHJlc3VsdGVkIGluIG92ZXJmbG93LCByYWlzZSBPdmVyZmxvd0Vycm9yICovCisgICAgaWYgKCFQeV9JU19GSU5JVEUoeikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAib3ZlcmZsb3cgb2NjdXJyZWQgZHVyaW5nIHJvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeik7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh6KTsKIH0KIAogI2VuZGlmIC8qIFBZX05PX1NIT1JUX0ZMT0FUX1JFUFIgKi8KQEAgLTEyNDUsMTEgKzEyNDUsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9mbG9hdChQeU9iamVjdCAqdikKIHsKLQlpZiAoUHlGbG9hdF9DaGVja0V4YWN0KHYpKQotCQlQeV9JTkNSRUYodik7Ci0JZWxzZQotCQl2ID0gUHlGbG9hdF9Gcm9tRG91YmxlKCgoUHlGbG9hdE9iamVjdCAqKXYpLT5vYl9mdmFsKTsKLQlyZXR1cm4gdjsKKyAgICBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KHYpKQorICAgICAgICBQeV9JTkNSRUYodik7CisgICAgZWxzZQorICAgICAgICB2ID0gUHlGbG9hdF9Gcm9tRG91YmxlKCgoUHlGbG9hdE9iamVjdCAqKXYpLT5vYl9mdmFsKTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyogdHVybiBBU0NJSSBoZXggY2hhcmFjdGVycyBpbnRvIGludGVnZXIgdmFsdWVzIGFuZCB2aWNlIHZlcnNhICovCkBAIC0xMjU3LDczICsxMjU3LDczIEBACiBzdGF0aWMgY2hhcgogY2hhcl9mcm9tX2hleChpbnQgeCkKIHsKLQlhc3NlcnQoMCA8PSB4ICYmIHggPCAxNik7Ci0JcmV0dXJuICIwMTIzNDU2Nzg5YWJjZGVmIlt4XTsKKyAgICBhc3NlcnQoMCA8PSB4ICYmIHggPCAxNik7CisgICAgcmV0dXJuICIwMTIzNDU2Nzg5YWJjZGVmIlt4XTsKIH0KIAogc3RhdGljIGludAogaGV4X2Zyb21fY2hhcihjaGFyIGMpIHsKLQlpbnQgeDsKLQlzd2l0Y2goYykgewotCWNhc2UgJzAnOgotCQl4ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAnMSc6Ci0JCXggPSAxOwotCQlicmVhazsKLQljYXNlICcyJzoKLQkJeCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgJzMnOgotCQl4ID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSAnNCc6Ci0JCXggPSA0OwotCQlicmVhazsKLQljYXNlICc1JzoKLQkJeCA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgJzYnOgotCQl4ID0gNjsKLQkJYnJlYWs7Ci0JY2FzZSAnNyc6Ci0JCXggPSA3OwotCQlicmVhazsKLQljYXNlICc4JzoKLQkJeCA9IDg7Ci0JCWJyZWFrOwotCWNhc2UgJzknOgotCQl4ID0gOTsKLQkJYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JY2FzZSAnQSc6Ci0JCXggPSAxMDsKLQkJYnJlYWs7Ci0JY2FzZSAnYic6Ci0JY2FzZSAnQic6Ci0JCXggPSAxMTsKLQkJYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JY2FzZSAnQyc6Ci0JCXggPSAxMjsKLQkJYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JY2FzZSAnRCc6Ci0JCXggPSAxMzsKLQkJYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JY2FzZSAnRSc6Ci0JCXggPSAxNDsKLQkJYnJlYWs7Ci0JY2FzZSAnZic6Ci0JY2FzZSAnRic6Ci0JCXggPSAxNTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJeCA9IC0xOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHg7CisgICAgaW50IHg7CisgICAgc3dpdGNoKGMpIHsKKyAgICBjYXNlICcwJzoKKyAgICAgICAgeCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJzEnOgorICAgICAgICB4ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnMic6CisgICAgICAgIHggPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlICczJzoKKyAgICAgICAgeCA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJzQnOgorICAgICAgICB4ID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnNSc6CisgICAgICAgIHggPSA1OworICAgICAgICBicmVhazsKKyAgICBjYXNlICc2JzoKKyAgICAgICAgeCA9IDY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJzcnOgorICAgICAgICB4ID0gNzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnOCc6CisgICAgICAgIHggPSA4OworICAgICAgICBicmVhazsKKyAgICBjYXNlICc5JzoKKyAgICAgICAgeCA9IDk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2EnOgorICAgIGNhc2UgJ0EnOgorICAgICAgICB4ID0gMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgIGNhc2UgJ0InOgorICAgICAgICB4ID0gMTE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2MnOgorICAgIGNhc2UgJ0MnOgorICAgICAgICB4ID0gMTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOgorICAgIGNhc2UgJ0QnOgorICAgICAgICB4ID0gMTM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2UnOgorICAgIGNhc2UgJ0UnOgorICAgICAgICB4ID0gMTQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2YnOgorICAgIGNhc2UgJ0YnOgorICAgICAgICB4ID0gMTU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHggPSAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB4OwogfQogCiAvKiBjb252ZXJ0IGEgZmxvYXQgdG8gYSBoZXhhZGVjaW1hbCBzdHJpbmcgKi8KQEAgLTEzMzUsNTQgKzEzMzUsNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9oZXgoUHlPYmplY3QgKnYpCiB7Ci0JZG91YmxlIHgsIG07Ci0JaW50IGUsIHNoaWZ0LCBpLCBzaSwgZXNpZ247Ci0JLyogU3BhY2UgZm9yIDErKFRPSEVYX05CSVRTLTEpLzQgZGlnaXRzLCBhIGRlY2ltYWwgcG9pbnQsIGFuZCB0aGUKLQkgICB0cmFpbGluZyBOVUwgYnl0ZS4gKi8KLQljaGFyIHNbKFRPSEVYX05CSVRTLTEpLzQrM107CisgICAgZG91YmxlIHgsIG07CisgICAgaW50IGUsIHNoaWZ0LCBpLCBzaSwgZXNpZ247CisgICAgLyogU3BhY2UgZm9yIDErKFRPSEVYX05CSVRTLTEpLzQgZGlnaXRzLCBhIGRlY2ltYWwgcG9pbnQsIGFuZCB0aGUKKyAgICAgICB0cmFpbGluZyBOVUwgYnl0ZS4gKi8KKyAgICBjaGFyIHNbKFRPSEVYX05CSVRTLTEpLzQrM107CiAKLQlDT05WRVJUX1RPX0RPVUJMRSh2LCB4KTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCB4KTsKIAotCWlmIChQeV9JU19OQU4oeCkgfHwgUHlfSVNfSU5GSU5JVFkoeCkpCi0JCXJldHVybiBmbG9hdF9zdHIoKFB5RmxvYXRPYmplY3QgKil2KTsKKyAgICBpZiAoUHlfSVNfTkFOKHgpIHx8IFB5X0lTX0lORklOSVRZKHgpKQorICAgICAgICByZXR1cm4gZmxvYXRfc3RyKChQeUZsb2F0T2JqZWN0ICopdik7CiAKLQlpZiAoeCA9PSAwLjApIHsKLQkJaWYoY29weXNpZ24oMS4wLCB4KSA9PSAtMS4wKQotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIi0weDAuMHArMCIpOwotCQllbHNlCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiMHgwLjBwKzAiKTsKLQl9CisgICAgaWYgKHggPT0gMC4wKSB7CisgICAgICAgIGlmKGNvcHlzaWduKDEuMCwgeCkgPT0gLTEuMCkKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCItMHgwLjBwKzAiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIjB4MC4wcCswIik7CisgICAgfQogCi0JbSA9IGZyZXhwKGZhYnMoeCksICZlKTsKLQlzaGlmdCA9IDEgLSBNQVgoREJMX01JTl9FWFAgLSBlLCAwKTsKLQltID0gbGRleHAobSwgc2hpZnQpOwotCWUgLT0gc2hpZnQ7CisgICAgbSA9IGZyZXhwKGZhYnMoeCksICZlKTsKKyAgICBzaGlmdCA9IDEgLSBNQVgoREJMX01JTl9FWFAgLSBlLCAwKTsKKyAgICBtID0gbGRleHAobSwgc2hpZnQpOworICAgIGUgLT0gc2hpZnQ7CiAKLQlzaSA9IDA7Ci0Jc1tzaV0gPSBjaGFyX2Zyb21faGV4KChpbnQpbSk7Ci0Jc2krKzsKLQltIC09IChpbnQpbTsKLQlzW3NpXSA9ICcuJzsKLQlzaSsrOwotCWZvciAoaT0wOyBpIDwgKFRPSEVYX05CSVRTLTEpLzQ7IGkrKykgewotCQltICo9IDE2LjA7Ci0JCXNbc2ldID0gY2hhcl9mcm9tX2hleCgoaW50KW0pOwotCQlzaSsrOwotCQltIC09IChpbnQpbTsKLQl9Ci0Jc1tzaV0gPSAnXDAnOworICAgIHNpID0gMDsKKyAgICBzW3NpXSA9IGNoYXJfZnJvbV9oZXgoKGludCltKTsKKyAgICBzaSsrOworICAgIG0gLT0gKGludCltOworICAgIHNbc2ldID0gJy4nOworICAgIHNpKys7CisgICAgZm9yIChpPTA7IGkgPCAoVE9IRVhfTkJJVFMtMSkvNDsgaSsrKSB7CisgICAgICAgIG0gKj0gMTYuMDsKKyAgICAgICAgc1tzaV0gPSBjaGFyX2Zyb21faGV4KChpbnQpbSk7CisgICAgICAgIHNpKys7CisgICAgICAgIG0gLT0gKGludCltOworICAgIH0KKyAgICBzW3NpXSA9ICdcMCc7CiAKLQlpZiAoZSA8IDApIHsKLQkJZXNpZ24gPSAoaW50KSctJzsKLQkJZSA9IC1lOwotCX0KLQllbHNlCi0JCWVzaWduID0gKGludCknKyc7CisgICAgaWYgKGUgPCAwKSB7CisgICAgICAgIGVzaWduID0gKGludCknLSc7CisgICAgICAgIGUgPSAtZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBlc2lnbiA9IChpbnQpJysnOwogCi0JaWYgKHggPCAwLjApCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCItMHglc3AlYyVkIiwgcywgZXNpZ24sIGUpOwotCWVsc2UKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjB4JXNwJWMlZCIsIHMsIGVzaWduLCBlKTsKKyAgICBpZiAoeCA8IDAuMCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIi0weCVzcCVjJWQiLCBzLCBlc2lnbiwgZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiMHglc3AlYyVkIiwgcywgZXNpZ24sIGUpOwogfQogCiBQeURvY19TVFJWQVIoZmxvYXRfaGV4X2RvYywKQEAgLTE0MDEsMTEgKzE0MDEsMTEgQEAKIHN0YXRpYyBpbnQKIGNhc2VfaW5zZW5zaXRpdmVfbWF0Y2goY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKIHsKLQl3aGlsZSgqdCAmJiBQeV9UT0xPV0VSKCpzKSA9PSAqdCkgewotCQlzKys7Ci0JCXQrKzsKLQl9Ci0JcmV0dXJuICp0ID8gMCA6IDE7CisgICAgd2hpbGUoKnQgJiYgUHlfVE9MT1dFUigqcykgPT0gKnQpIHsKKyAgICAgICAgcysrOworICAgICAgICB0Kys7CisgICAgfQorICAgIHJldHVybiAqdCA/IDAgOiAxOwogfQogCiAvKiBDb252ZXJ0IGEgaGV4YWRlY2ltYWwgc3RyaW5nIHRvIGEgZmxvYXQuICovCkBAIC0xNDEzLDI1MCArMTQxMywyNTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9mcm9taGV4KFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdF9hc19mbG9hdCwgKnJlc3VsdDsKLQlkb3VibGUgeDsKLQlsb25nIGV4cCwgdG9wX2V4cCwgbHNiLCBrZXlfZGlnaXQ7Ci0JY2hhciAqcywgKmNvZWZmX3N0YXJ0LCAqc19zdG9yZSwgKmNvZWZmX2VuZCwgKmV4cF9zdGFydCwgKnNfZW5kOwotCWludCBoYWxmX2VwcywgZGlnaXQsIHJvdW5kX3VwLCBzaWduPTE7Ci0JUHlfc3NpemVfdCBsZW5ndGgsIG5kaWdpdHMsIGZkaWdpdHMsIGk7CisgICAgUHlPYmplY3QgKnJlc3VsdF9hc19mbG9hdCwgKnJlc3VsdDsKKyAgICBkb3VibGUgeDsKKyAgICBsb25nIGV4cCwgdG9wX2V4cCwgbHNiLCBrZXlfZGlnaXQ7CisgICAgY2hhciAqcywgKmNvZWZmX3N0YXJ0LCAqc19zdG9yZSwgKmNvZWZmX2VuZCwgKmV4cF9zdGFydCwgKnNfZW5kOworICAgIGludCBoYWxmX2VwcywgZGlnaXQsIHJvdW5kX3VwLCBzaWduPTE7CisgICAgUHlfc3NpemVfdCBsZW5ndGgsIG5kaWdpdHMsIGZkaWdpdHMsIGk7CiAKLQkvKgotCSAqIEZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5IGFuZCBjb3JyZWN0bmVzcywgd2UgaW1wb3NlIGFuIGFydGlmaWNpYWwKLQkgKiBsaW1pdCBvbiBuZGlnaXRzLCB0aGUgdG90YWwgbnVtYmVyIG9mIGhleCBkaWdpdHMgaW4gdGhlIGNvZWZmaWNpZW50Ci0JICogVGhlIGxpbWl0IGlzIGNob3NlbiB0byBlbnN1cmUgdGhhdCwgd3JpdGluZyBleHAgZm9yIHRoZSBleHBvbmVudCwKLQkgKgotCSAqICAgKDEpIGlmIGV4cCA+IExPTkdfTUFYLzIgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcgaXMKLQkgKiAgIGd1YXJhbnRlZWQgdG8gb3ZlcmZsb3cgKHByb3ZpZGVkIGl0J3Mgbm9uemVybykKLQkgKgotCSAqICAgKDIpIGlmIGV4cCA8IExPTkdfTUlOLzIgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcgaXMKLQkgKiAgIGd1YXJhbnRlZWQgdG8gdW5kZXJmbG93IHRvIDAuCi0JICoKLQkgKiAgICgzKSBpZiBMT05HX01JTi8yIDw9IGV4cCA8PSBMT05HX01BWC8yIHRoZW4gdGhlcmUncyBubyBkYW5nZXIgb2YKLQkgKiAgIG92ZXJmbG93IGluIHRoZSBjYWxjdWxhdGlvbiBvZiBleHAgYW5kIHRvcF9leHAgYmVsb3cuCi0JICoKLQkgKiBNb3JlIHNwZWNpZmljYWxseSwgbmRpZ2l0cyBpcyBhc3N1bWVkIHRvIHNhdGlzZnkgdGhlIGZvbGxvd2luZwotCSAqIGluZXF1YWxpdGllczoKLQkgKgotCSAqICAgNCpuZGlnaXRzIDw9IERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gTE9OR19NSU4vMgotCSAqICAgNCpuZGlnaXRzIDw9IExPTkdfTUFYLzIgKyAxIC0gREJMX01BWF9FWFAKLQkgKgotCSAqIElmIGVpdGhlciBvZiB0aGVzZSBpbmVxdWFsaXRpZXMgaXMgbm90IHNhdGlzZmllZCwgYSBWYWx1ZUVycm9yIGlzCi0JICogcmFpc2VkLiAgT3RoZXJ3aXNlLCB3cml0ZSB4IGZvciB0aGUgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcsIGFuZAotCSAqIGFzc3VtZSB4IGlzIG5vbnplcm8uICBUaGVuCi0JICoKLQkgKiAgIDIqKihleHAtNCpuZGlnaXRzKSA8PSB8eHwgPCAyKiooZXhwKzQqbmRpZ2l0cykuCi0JICoKLQkgKiBOb3cgaWYgZXhwID4gTE9OR19NQVgvMiB0aGVuOgotCSAqCi0JICogICBleHAgLSA0Km5kaWdpdHMgPj0gTE9OR19NQVgvMiArIDEgLSAoTE9OR19NQVgvMiArIDEgLSBEQkxfTUFYX0VYUCkKLQkgKiAgICAgICAgICAgICAgICAgICAgPSBEQkxfTUFYX0VYUAotCSAqCi0JICogc28gfHh8ID49IDIqKkRCTF9NQVhfRVhQLCB3aGljaCBpcyB0b28gbGFyZ2UgdG8gYmUgc3RvcmVkIGluIEMKLQkgKiBkb3VibGUsIHNvIG92ZXJmbG93cy4gIElmIGV4cCA8IExPTkdfTUlOLzIsIHRoZW4KLQkgKgotCSAqICAgZXhwICsgNCpuZGlnaXRzIDw9IExPTkdfTUlOLzIgLSAxICsgKAotCSAqICAgICAgICAgICAgICAgICAgICAgIERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gTE9OR19NSU4vMikKLQkgKiAgICAgICAgICAgICAgICAgICAgPSBEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRyAtIDEKLQkgKgotCSAqIGFuZCBzbyB8eHwgPCAyKiooREJMX01JTl9FWFAtREJMX01BTlRfRElHLTEpLCBoZW5jZSB1bmRlcmZsb3dzIHRvIDAKLQkgKiB3aGVuIGNvbnZlcnRlZCB0byBhIEMgZG91YmxlLgotCSAqCi0JICogSXQncyBlYXN5IHRvIHNob3cgdGhhdCBpZiBMT05HX01JTi8yIDw9IGV4cCA8PSBMT05HX01BWC8yIHRoZW4gYm90aAotCSAqIGV4cCs0Km5kaWdpdHMgYW5kIGV4cC00Km5kaWdpdHMgYXJlIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYSBsb25nLgotCSAqLworICAgIC8qCisgICAgICogRm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHkgYW5kIGNvcnJlY3RuZXNzLCB3ZSBpbXBvc2UgYW4gYXJ0aWZpY2lhbAorICAgICAqIGxpbWl0IG9uIG5kaWdpdHMsIHRoZSB0b3RhbCBudW1iZXIgb2YgaGV4IGRpZ2l0cyBpbiB0aGUgY29lZmZpY2llbnQKKyAgICAgKiBUaGUgbGltaXQgaXMgY2hvc2VuIHRvIGVuc3VyZSB0aGF0LCB3cml0aW5nIGV4cCBmb3IgdGhlIGV4cG9uZW50LAorICAgICAqCisgICAgICogICAoMSkgaWYgZXhwID4gTE9OR19NQVgvMiB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgaGV4IHN0cmluZyBpcworICAgICAqICAgZ3VhcmFudGVlZCB0byBvdmVyZmxvdyAocHJvdmlkZWQgaXQncyBub256ZXJvKQorICAgICAqCisgICAgICogICAoMikgaWYgZXhwIDwgTE9OR19NSU4vMiB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgaGV4IHN0cmluZyBpcworICAgICAqICAgZ3VhcmFudGVlZCB0byB1bmRlcmZsb3cgdG8gMC4KKyAgICAgKgorICAgICAqICAgKDMpIGlmIExPTkdfTUlOLzIgPD0gZXhwIDw9IExPTkdfTUFYLzIgdGhlbiB0aGVyZSdzIG5vIGRhbmdlciBvZgorICAgICAqICAgb3ZlcmZsb3cgaW4gdGhlIGNhbGN1bGF0aW9uIG9mIGV4cCBhbmQgdG9wX2V4cCBiZWxvdy4KKyAgICAgKgorICAgICAqIE1vcmUgc3BlY2lmaWNhbGx5LCBuZGlnaXRzIGlzIGFzc3VtZWQgdG8gc2F0aXNmeSB0aGUgZm9sbG93aW5nCisgICAgICogaW5lcXVhbGl0aWVzOgorICAgICAqCisgICAgICogICA0Km5kaWdpdHMgPD0gREJMX01JTl9FWFAgLSBEQkxfTUFOVF9ESUcgLSBMT05HX01JTi8yCisgICAgICogICA0Km5kaWdpdHMgPD0gTE9OR19NQVgvMiArIDEgLSBEQkxfTUFYX0VYUAorICAgICAqCisgICAgICogSWYgZWl0aGVyIG9mIHRoZXNlIGluZXF1YWxpdGllcyBpcyBub3Qgc2F0aXNmaWVkLCBhIFZhbHVlRXJyb3IgaXMKKyAgICAgKiByYWlzZWQuICBPdGhlcndpc2UsIHdyaXRlIHggZm9yIHRoZSB2YWx1ZSBvZiB0aGUgaGV4IHN0cmluZywgYW5kCisgICAgICogYXNzdW1lIHggaXMgbm9uemVyby4gIFRoZW4KKyAgICAgKgorICAgICAqICAgMioqKGV4cC00Km5kaWdpdHMpIDw9IHx4fCA8IDIqKihleHArNCpuZGlnaXRzKS4KKyAgICAgKgorICAgICAqIE5vdyBpZiBleHAgPiBMT05HX01BWC8yIHRoZW46CisgICAgICoKKyAgICAgKiAgIGV4cCAtIDQqbmRpZ2l0cyA+PSBMT05HX01BWC8yICsgMSAtIChMT05HX01BWC8yICsgMSAtIERCTF9NQVhfRVhQKQorICAgICAqICAgICAgICAgICAgICAgICAgICA9IERCTF9NQVhfRVhQCisgICAgICoKKyAgICAgKiBzbyB8eHwgPj0gMioqREJMX01BWF9FWFAsIHdoaWNoIGlzIHRvbyBsYXJnZSB0byBiZSBzdG9yZWQgaW4gQworICAgICAqIGRvdWJsZSwgc28gb3ZlcmZsb3dzLiAgSWYgZXhwIDwgTE9OR19NSU4vMiwgdGhlbgorICAgICAqCisgICAgICogICBleHAgKyA0Km5kaWdpdHMgPD0gTE9OR19NSU4vMiAtIDEgKyAoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgREJMX01JTl9FWFAgLSBEQkxfTUFOVF9ESUcgLSBMT05HX01JTi8yKQorICAgICAqICAgICAgICAgICAgICAgICAgICA9IERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gMQorICAgICAqCisgICAgICogYW5kIHNvIHx4fCA8IDIqKihEQkxfTUlOX0VYUC1EQkxfTUFOVF9ESUctMSksIGhlbmNlIHVuZGVyZmxvd3MgdG8gMAorICAgICAqIHdoZW4gY29udmVydGVkIHRvIGEgQyBkb3VibGUuCisgICAgICoKKyAgICAgKiBJdCdzIGVhc3kgdG8gc2hvdyB0aGF0IGlmIExPTkdfTUlOLzIgPD0gZXhwIDw9IExPTkdfTUFYLzIgdGhlbiBib3RoCisgICAgICogZXhwKzQqbmRpZ2l0cyBhbmQgZXhwLTQqbmRpZ2l0cyBhcmUgd2l0aGluIHRoZSByYW5nZSBvZiBhIGxvbmcuCisgICAgICovCiAKLQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJnMsICZsZW5ndGgpKQotCQlyZXR1cm4gTlVMTDsKLQlzX2VuZCA9IHMgKyBsZW5ndGg7CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZzLCAmbGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc19lbmQgPSBzICsgbGVuZ3RoOwogCi0JLyoqKioqKioqKioqKioqKioqKioqCi0JICogUGFyc2UgdGhlIHN0cmluZyAqCi0JICoqKioqKioqKioqKioqKioqKioqLworICAgIC8qKioqKioqKioqKioqKioqKioqKgorICAgICAqIFBhcnNlIHRoZSBzdHJpbmcgKgorICAgICAqKioqKioqKioqKioqKioqKioqKi8KIAotCS8qIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgb3B0aW9uYWwgc2lnbiAqLwotCXdoaWxlIChQeV9JU1NQQUNFKCpzKSkKLQkJcysrOwotCWlmICgqcyA9PSAnLScpIHsKLQkJcysrOwotCQlzaWduID0gLTE7Ci0JfQotCWVsc2UgaWYgKCpzID09ICcrJykKLQkJcysrOworICAgIC8qIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgb3B0aW9uYWwgc2lnbiAqLworICAgIHdoaWxlIChQeV9JU1NQQUNFKCpzKSkKKyAgICAgICAgcysrOworICAgIGlmICgqcyA9PSAnLScpIHsKKyAgICAgICAgcysrOworICAgICAgICBzaWduID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKCpzID09ICcrJykKKyAgICAgICAgcysrOwogCi0JLyogaW5maW5pdGllcyBhbmQgbmFucyAqLwotCWlmICgqcyA9PSAnaScgfHwgKnMgPT0gJ0knKSB7Ci0JCWlmICghY2FzZV9pbnNlbnNpdGl2ZV9tYXRjaChzKzEsICJuZiIpKQotCQkJZ290byBwYXJzZV9lcnJvcjsKLQkJcyArPSAzOwotCQl4ID0gUHlfSFVHRV9WQUw7Ci0JCWlmIChjYXNlX2luc2Vuc2l0aXZlX21hdGNoKHMsICJpbml0eSIpKQotCQkJcyArPSA1OwotCQlnb3RvIGZpbmlzaGVkOwotCX0KLQlpZiAoKnMgPT0gJ24nIHx8ICpzID09ICdOJykgewotCQlpZiAoIWNhc2VfaW5zZW5zaXRpdmVfbWF0Y2gocysxLCAiYW4iKSkKLQkJCWdvdG8gcGFyc2VfZXJyb3I7Ci0JCXMgKz0gMzsKLQkJeCA9IFB5X05BTjsKLQkJZ290byBmaW5pc2hlZDsKLQl9CisgICAgLyogaW5maW5pdGllcyBhbmQgbmFucyAqLworICAgIGlmICgqcyA9PSAnaScgfHwgKnMgPT0gJ0knKSB7CisgICAgICAgIGlmICghY2FzZV9pbnNlbnNpdGl2ZV9tYXRjaChzKzEsICJuZiIpKQorICAgICAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICAgICAgcyArPSAzOworICAgICAgICB4ID0gUHlfSFVHRV9WQUw7CisgICAgICAgIGlmIChjYXNlX2luc2Vuc2l0aXZlX21hdGNoKHMsICJpbml0eSIpKQorICAgICAgICAgICAgcyArPSA1OworICAgICAgICBnb3RvIGZpbmlzaGVkOworICAgIH0KKyAgICBpZiAoKnMgPT0gJ24nIHx8ICpzID09ICdOJykgeworICAgICAgICBpZiAoIWNhc2VfaW5zZW5zaXRpdmVfbWF0Y2gocysxLCAiYW4iKSkKKyAgICAgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisgICAgICAgIHMgKz0gMzsKKyAgICAgICAgeCA9IFB5X05BTjsKKyAgICAgICAgZ290byBmaW5pc2hlZDsKKyAgICB9CiAKLQkvKiBbMHhdICovCi0Jc19zdG9yZSA9IHM7Ci0JaWYgKCpzID09ICcwJykgewotCQlzKys7Ci0JCWlmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKQotCQkJcysrOwotCQllbHNlCi0JCQlzID0gc19zdG9yZTsKLQl9CisgICAgLyogWzB4XSAqLworICAgIHNfc3RvcmUgPSBzOworICAgIGlmICgqcyA9PSAnMCcpIHsKKyAgICAgICAgcysrOworICAgICAgICBpZiAoKnMgPT0gJ3gnIHx8ICpzID09ICdYJykKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcyA9IHNfc3RvcmU7CisgICAgfQogCi0JLyogY29lZmZpY2llbnQ6IDxpbnRlZ2VyPiBbLiA8ZnJhY3Rpb24+XSAqLwotCWNvZWZmX3N0YXJ0ID0gczsKLQl3aGlsZSAoaGV4X2Zyb21fY2hhcigqcykgPj0gMCkKLQkJcysrOwotCXNfc3RvcmUgPSBzOwotCWlmICgqcyA9PSAnLicpIHsKLQkJcysrOwotCQl3aGlsZSAoaGV4X2Zyb21fY2hhcigqcykgPj0gMCkKLQkJCXMrKzsKLQkJY29lZmZfZW5kID0gcy0xOwotCX0KLQllbHNlCi0JCWNvZWZmX2VuZCA9IHM7CisgICAgLyogY29lZmZpY2llbnQ6IDxpbnRlZ2VyPiBbLiA8ZnJhY3Rpb24+XSAqLworICAgIGNvZWZmX3N0YXJ0ID0gczsKKyAgICB3aGlsZSAoaGV4X2Zyb21fY2hhcigqcykgPj0gMCkKKyAgICAgICAgcysrOworICAgIHNfc3RvcmUgPSBzOworICAgIGlmICgqcyA9PSAnLicpIHsKKyAgICAgICAgcysrOworICAgICAgICB3aGlsZSAoaGV4X2Zyb21fY2hhcigqcykgPj0gMCkKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgY29lZmZfZW5kID0gcy0xOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGNvZWZmX2VuZCA9IHM7CiAKLQkvKiBuZGlnaXRzID0gdG90YWwgIyBvZiBoZXggZGlnaXRzOyBmZGlnaXRzID0gIyBhZnRlciBwb2ludCAqLwotCW5kaWdpdHMgPSBjb2VmZl9lbmQgLSBjb2VmZl9zdGFydDsKLQlmZGlnaXRzID0gY29lZmZfZW5kIC0gc19zdG9yZTsKLQlpZiAobmRpZ2l0cyA9PSAwKQotCQlnb3RvIHBhcnNlX2Vycm9yOwotCWlmIChuZGlnaXRzID4gTUlOKERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gTE9OR19NSU4vMiwKLQkJCSAgTE9OR19NQVgvMiArIDEgLSBEQkxfTUFYX0VYUCkvNCkKLQkJZ290byBpbnNhbmVfbGVuZ3RoX2Vycm9yOworICAgIC8qIG5kaWdpdHMgPSB0b3RhbCAjIG9mIGhleCBkaWdpdHM7IGZkaWdpdHMgPSAjIGFmdGVyIHBvaW50ICovCisgICAgbmRpZ2l0cyA9IGNvZWZmX2VuZCAtIGNvZWZmX3N0YXJ0OworICAgIGZkaWdpdHMgPSBjb2VmZl9lbmQgLSBzX3N0b3JlOworICAgIGlmIChuZGlnaXRzID09IDApCisgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisgICAgaWYgKG5kaWdpdHMgPiBNSU4oREJMX01JTl9FWFAgLSBEQkxfTUFOVF9ESUcgLSBMT05HX01JTi8yLAorICAgICAgICAgICAgICAgICAgICAgIExPTkdfTUFYLzIgKyAxIC0gREJMX01BWF9FWFApLzQpCisgICAgICAgIGdvdG8gaW5zYW5lX2xlbmd0aF9lcnJvcjsKIAotCS8qIFtwIDxleHBvbmVudD5dICovCi0JaWYgKCpzID09ICdwJyB8fCAqcyA9PSAnUCcpIHsKLQkJcysrOwotCQlleHBfc3RhcnQgPSBzOwotCQlpZiAoKnMgPT0gJy0nIHx8ICpzID09ICcrJykKLQkJCXMrKzsKLQkJaWYgKCEoJzAnIDw9ICpzICYmICpzIDw9ICc5JykpCi0JCQlnb3RvIHBhcnNlX2Vycm9yOwotCQlzKys7Ci0JCXdoaWxlICgnMCcgPD0gKnMgJiYgKnMgPD0gJzknKQotCQkJcysrOwotCQlleHAgPSBzdHJ0b2woZXhwX3N0YXJ0LCBOVUxMLCAxMCk7Ci0JfQotCWVsc2UKLQkJZXhwID0gMDsKKyAgICAvKiBbcCA8ZXhwb25lbnQ+XSAqLworICAgIGlmICgqcyA9PSAncCcgfHwgKnMgPT0gJ1AnKSB7CisgICAgICAgIHMrKzsKKyAgICAgICAgZXhwX3N0YXJ0ID0gczsKKyAgICAgICAgaWYgKCpzID09ICctJyB8fCAqcyA9PSAnKycpCisgICAgICAgICAgICBzKys7CisgICAgICAgIGlmICghKCcwJyA8PSAqcyAmJiAqcyA8PSAnOScpKQorICAgICAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICAgICAgcysrOworICAgICAgICB3aGlsZSAoJzAnIDw9ICpzICYmICpzIDw9ICc5JykKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgZXhwID0gc3RydG9sKGV4cF9zdGFydCwgTlVMTCwgMTApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGV4cCA9IDA7CiAKIC8qIGZvciAwIDw9IGogPCBuZGlnaXRzLCBIRVhfRElHSVQoaikgZ2l2ZXMgdGhlIGp0aCBtb3N0IHNpZ25pZmljYW50IGRpZ2l0ICovCi0jZGVmaW5lIEhFWF9ESUdJVChqKSBoZXhfZnJvbV9jaGFyKCooKGopIDwgZmRpZ2l0cyA/CQlcCi0JCQkJICAgICBjb2VmZl9lbmQtKGopIDoJCQlcCi0JCQkJICAgICBjb2VmZl9lbmQtMS0oaikpKQorI2RlZmluZSBIRVhfRElHSVQoaikgaGV4X2Zyb21fY2hhcigqKChqKSA8IGZkaWdpdHMgPyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvZWZmX2VuZC0oaikgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvZWZmX2VuZC0xLShqKSkpCiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIENvbXB1dGUgcm91bmRlZCB2YWx1ZSBvZiB0aGUgaGV4IHN0cmluZyAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBDb21wdXRlIHJvdW5kZWQgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JLyogRGlzY2FyZCBsZWFkaW5nIHplcm9zLCBhbmQgY2F0Y2ggZXh0cmVtZSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93ICovCi0Jd2hpbGUgKG5kaWdpdHMgPiAwICYmIEhFWF9ESUdJVChuZGlnaXRzLTEpID09IDApCi0JCW5kaWdpdHMtLTsKLQlpZiAobmRpZ2l0cyA9PSAwIHx8IGV4cCA8IExPTkdfTUlOLzIpIHsKLQkJeCA9IDAuMDsKLQkJZ290byBmaW5pc2hlZDsKLQl9Ci0JaWYgKGV4cCA+IExPTkdfTUFYLzIpCi0JCWdvdG8gb3ZlcmZsb3dfZXJyb3I7CisgICAgLyogRGlzY2FyZCBsZWFkaW5nIHplcm9zLCBhbmQgY2F0Y2ggZXh0cmVtZSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93ICovCisgICAgd2hpbGUgKG5kaWdpdHMgPiAwICYmIEhFWF9ESUdJVChuZGlnaXRzLTEpID09IDApCisgICAgICAgIG5kaWdpdHMtLTsKKyAgICBpZiAobmRpZ2l0cyA9PSAwIHx8IGV4cCA8IExPTkdfTUlOLzIpIHsKKyAgICAgICAgeCA9IDAuMDsKKyAgICAgICAgZ290byBmaW5pc2hlZDsKKyAgICB9CisgICAgaWYgKGV4cCA+IExPTkdfTUFYLzIpCisgICAgICAgIGdvdG8gb3ZlcmZsb3dfZXJyb3I7CiAKLQkvKiBBZGp1c3QgZXhwb25lbnQgZm9yIGZyYWN0aW9uYWwgcGFydC4gKi8KLQlleHAgPSBleHAgLSA0KigobG9uZylmZGlnaXRzKTsKKyAgICAvKiBBZGp1c3QgZXhwb25lbnQgZm9yIGZyYWN0aW9uYWwgcGFydC4gKi8KKyAgICBleHAgPSBleHAgLSA0KigobG9uZylmZGlnaXRzKTsKIAotCS8qIHRvcF9leHAgPSAxIG1vcmUgdGhhbiBleHBvbmVudCBvZiBtb3N0IHNpZy4gYml0IG9mIGNvZWZmaWNpZW50ICovCi0JdG9wX2V4cCA9IGV4cCArIDQqKChsb25nKW5kaWdpdHMgLSAxKTsKLQlmb3IgKGRpZ2l0ID0gSEVYX0RJR0lUKG5kaWdpdHMtMSk7IGRpZ2l0ICE9IDA7IGRpZ2l0IC89IDIpCi0JCXRvcF9leHArKzsKKyAgICAvKiB0b3BfZXhwID0gMSBtb3JlIHRoYW4gZXhwb25lbnQgb2YgbW9zdCBzaWcuIGJpdCBvZiBjb2VmZmljaWVudCAqLworICAgIHRvcF9leHAgPSBleHAgKyA0KigobG9uZyluZGlnaXRzIC0gMSk7CisgICAgZm9yIChkaWdpdCA9IEhFWF9ESUdJVChuZGlnaXRzLTEpOyBkaWdpdCAhPSAwOyBkaWdpdCAvPSAyKQorICAgICAgICB0b3BfZXhwKys7CiAKLQkvKiBjYXRjaCBhbG1vc3QgYWxsIG5vbmV4dHJlbWUgY2FzZXMgb2Ygb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyBoZXJlICovCi0JaWYgKHRvcF9leHAgPCBEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRykgewotCQl4ID0gMC4wOwotCQlnb3RvIGZpbmlzaGVkOwotCX0KLQlpZiAodG9wX2V4cCA+IERCTF9NQVhfRVhQKQotCQlnb3RvIG92ZXJmbG93X2Vycm9yOworICAgIC8qIGNhdGNoIGFsbW9zdCBhbGwgbm9uZXh0cmVtZSBjYXNlcyBvZiBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IGhlcmUgKi8KKyAgICBpZiAodG9wX2V4cCA8IERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHKSB7CisgICAgICAgIHggPSAwLjA7CisgICAgICAgIGdvdG8gZmluaXNoZWQ7CisgICAgfQorICAgIGlmICh0b3BfZXhwID4gREJMX01BWF9FWFApCisgICAgICAgIGdvdG8gb3ZlcmZsb3dfZXJyb3I7CiAKLQkvKiBsc2IgPSBleHBvbmVudCBvZiBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlICpyb3VuZGVkKiB2YWx1ZS4KLQkgICBUaGlzIGlzIHRvcF9leHAgLSBEQkxfTUFOVF9ESUcgdW5sZXNzIHJlc3VsdCBpcyBzdWJub3JtYWwuICovCi0JbHNiID0gTUFYKHRvcF9leHAsIChsb25nKURCTF9NSU5fRVhQKSAtIERCTF9NQU5UX0RJRzsKKyAgICAvKiBsc2IgPSBleHBvbmVudCBvZiBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlICpyb3VuZGVkKiB2YWx1ZS4KKyAgICAgICBUaGlzIGlzIHRvcF9leHAgLSBEQkxfTUFOVF9ESUcgdW5sZXNzIHJlc3VsdCBpcyBzdWJub3JtYWwuICovCisgICAgbHNiID0gTUFYKHRvcF9leHAsIChsb25nKURCTF9NSU5fRVhQKSAtIERCTF9NQU5UX0RJRzsKIAotCXggPSAwLjA7Ci0JaWYgKGV4cCA+PSBsc2IpIHsKLQkJLyogbm8gcm91bmRpbmcgcmVxdWlyZWQgKi8KLQkJZm9yIChpID0gbmRpZ2l0cy0xOyBpID49IDA7IGktLSkKLQkJCXggPSAxNi4wKnggKyBIRVhfRElHSVQoaSk7Ci0JCXggPSBsZGV4cCh4LCAoaW50KShleHApKTsKLQkJZ290byBmaW5pc2hlZDsKLQl9Ci0JLyogcm91bmRpbmcgcmVxdWlyZWQuICBrZXlfZGlnaXQgaXMgdGhlIGluZGV4IG9mIHRoZSBoZXggZGlnaXQKLQkgICBjb250YWluaW5nIHRoZSBmaXJzdCBiaXQgdG8gYmUgcm91bmRlZCBhd2F5LiAqLwotCWhhbGZfZXBzID0gMSA8PCAoaW50KSgobHNiIC0gZXhwIC0gMSkgJSA0KTsKLQlrZXlfZGlnaXQgPSAobHNiIC0gZXhwIC0gMSkgLyA0OwotCWZvciAoaSA9IG5kaWdpdHMtMTsgaSA+IGtleV9kaWdpdDsgaS0tKQotCQl4ID0gMTYuMCp4ICsgSEVYX0RJR0lUKGkpOwotCWRpZ2l0ID0gSEVYX0RJR0lUKGtleV9kaWdpdCk7Ci0JeCA9IDE2LjAqeCArIChkb3VibGUpKGRpZ2l0ICYgKDE2LTIqaGFsZl9lcHMpKTsKKyAgICB4ID0gMC4wOworICAgIGlmIChleHAgPj0gbHNiKSB7CisgICAgICAgIC8qIG5vIHJvdW5kaW5nIHJlcXVpcmVkICovCisgICAgICAgIGZvciAoaSA9IG5kaWdpdHMtMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICB4ID0gMTYuMCp4ICsgSEVYX0RJR0lUKGkpOworICAgICAgICB4ID0gbGRleHAoeCwgKGludCkoZXhwKSk7CisgICAgICAgIGdvdG8gZmluaXNoZWQ7CisgICAgfQorICAgIC8qIHJvdW5kaW5nIHJlcXVpcmVkLiAga2V5X2RpZ2l0IGlzIHRoZSBpbmRleCBvZiB0aGUgaGV4IGRpZ2l0CisgICAgICAgY29udGFpbmluZyB0aGUgZmlyc3QgYml0IHRvIGJlIHJvdW5kZWQgYXdheS4gKi8KKyAgICBoYWxmX2VwcyA9IDEgPDwgKGludCkoKGxzYiAtIGV4cCAtIDEpICUgNCk7CisgICAga2V5X2RpZ2l0ID0gKGxzYiAtIGV4cCAtIDEpIC8gNDsKKyAgICBmb3IgKGkgPSBuZGlnaXRzLTE7IGkgPiBrZXlfZGlnaXQ7IGktLSkKKyAgICAgICAgeCA9IDE2LjAqeCArIEhFWF9ESUdJVChpKTsKKyAgICBkaWdpdCA9IEhFWF9ESUdJVChrZXlfZGlnaXQpOworICAgIHggPSAxNi4wKnggKyAoZG91YmxlKShkaWdpdCAmICgxNi0yKmhhbGZfZXBzKSk7CiAKLQkvKiByb3VuZC1oYWxmLWV2ZW46IHJvdW5kIHVwIGlmIGJpdCBsc2ItMSBpcyAxIGFuZCBhdCBsZWFzdCBvbmUgb2YKLQkgICBiaXRzIGxzYiwgbHNiLTIsIGxzYi0zLCBsc2ItNCwgLi4uIGlzIDEuICovCi0JaWYgKChkaWdpdCAmIGhhbGZfZXBzKSAhPSAwKSB7Ci0JCXJvdW5kX3VwID0gMDsKLQkJaWYgKChkaWdpdCAmICgzKmhhbGZfZXBzLTEpKSAhPSAwIHx8Ci0JCSAgICAoaGFsZl9lcHMgPT0gOCAmJiAoSEVYX0RJR0lUKGtleV9kaWdpdCsxKSAmIDEpICE9IDApKQotCQkJcm91bmRfdXAgPSAxOwotCQllbHNlCi0JCQlmb3IgKGkgPSBrZXlfZGlnaXQtMTsgaSA+PSAwOyBpLS0pCi0JCQkJaWYgKEhFWF9ESUdJVChpKSAhPSAwKSB7Ci0JCQkJCXJvdW5kX3VwID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQlpZiAocm91bmRfdXAgPT0gMSkgewotCQkJeCArPSAyKmhhbGZfZXBzOwotCQkJaWYgKHRvcF9leHAgPT0gREJMX01BWF9FWFAgJiYKLQkJCSAgICB4ID09IGxkZXhwKChkb3VibGUpKDIqaGFsZl9lcHMpLCBEQkxfTUFOVF9ESUcpKQotCQkJCS8qIG92ZXJmbG93IGNvcm5lciBjYXNlOiBwcmUtcm91bmRlZCB2YWx1ZSA8Ci0JCQkJICAgMioqREJMX01BWF9FWFA7IHJvdW5kZWQ9MioqREJMX01BWF9FWFAuICovCi0JCQkJZ290byBvdmVyZmxvd19lcnJvcjsKLQkJfQotCX0KLQl4ID0gbGRleHAoeCwgKGludCkoZXhwKzQqa2V5X2RpZ2l0KSk7CisgICAgLyogcm91bmQtaGFsZi1ldmVuOiByb3VuZCB1cCBpZiBiaXQgbHNiLTEgaXMgMSBhbmQgYXQgbGVhc3Qgb25lIG9mCisgICAgICAgYml0cyBsc2IsIGxzYi0yLCBsc2ItMywgbHNiLTQsIC4uLiBpcyAxLiAqLworICAgIGlmICgoZGlnaXQgJiBoYWxmX2VwcykgIT0gMCkgeworICAgICAgICByb3VuZF91cCA9IDA7CisgICAgICAgIGlmICgoZGlnaXQgJiAoMypoYWxmX2Vwcy0xKSkgIT0gMCB8fAorICAgICAgICAgICAgKGhhbGZfZXBzID09IDggJiYgKEhFWF9ESUdJVChrZXlfZGlnaXQrMSkgJiAxKSAhPSAwKSkKKyAgICAgICAgICAgIHJvdW5kX3VwID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yIChpID0ga2V5X2RpZ2l0LTE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIGlmIChIRVhfRElHSVQoaSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByb3VuZF91cCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHJvdW5kX3VwID09IDEpIHsKKyAgICAgICAgICAgIHggKz0gMipoYWxmX2VwczsKKyAgICAgICAgICAgIGlmICh0b3BfZXhwID09IERCTF9NQVhfRVhQICYmCisgICAgICAgICAgICAgICAgeCA9PSBsZGV4cCgoZG91YmxlKSgyKmhhbGZfZXBzKSwgREJMX01BTlRfRElHKSkKKyAgICAgICAgICAgICAgICAvKiBvdmVyZmxvdyBjb3JuZXIgY2FzZTogcHJlLXJvdW5kZWQgdmFsdWUgPAorICAgICAgICAgICAgICAgICAgIDIqKkRCTF9NQVhfRVhQOyByb3VuZGVkPTIqKkRCTF9NQVhfRVhQLiAqLworICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3dfZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgeCA9IGxkZXhwKHgsIChpbnQpKGV4cCs0KmtleV9kaWdpdCkpOwogCiAgIGZpbmlzaGVkOgotCS8qIG9wdGlvbmFsIHRyYWlsaW5nIHdoaXRlc3BhY2UgbGVhZGluZyB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KLQl3aGlsZSAoUHlfSVNTUEFDRSgqcykpCi0JCXMrKzsKLQlpZiAocyAhPSBzX2VuZCkKLQkJZ290byBwYXJzZV9lcnJvcjsKLQlyZXN1bHRfYXNfZmxvYXQgPSBQeV9CdWlsZFZhbHVlKCIoZCkiLCBzaWduICogeCk7Ci0JaWYgKHJlc3VsdF9hc19mbG9hdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNscywgcmVzdWx0X2FzX2Zsb2F0KTsKLQlQeV9ERUNSRUYocmVzdWx0X2FzX2Zsb2F0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIG9wdGlvbmFsIHRyYWlsaW5nIHdoaXRlc3BhY2UgbGVhZGluZyB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KKyAgICB3aGlsZSAoUHlfSVNTUEFDRSgqcykpCisgICAgICAgIHMrKzsKKyAgICBpZiAocyAhPSBzX2VuZCkKKyAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICByZXN1bHRfYXNfZmxvYXQgPSBQeV9CdWlsZFZhbHVlKCIoZCkiLCBzaWduICogeCk7CisgICAgaWYgKHJlc3VsdF9hc19mbG9hdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNscywgcmVzdWx0X2FzX2Zsb2F0KTsKKyAgICBQeV9ERUNSRUYocmVzdWx0X2FzX2Zsb2F0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogCiAgIG92ZXJmbG93X2Vycm9yOgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImhleGFkZWNpbWFsIHZhbHVlIHRvbyBsYXJnZSB0byByZXByZXNlbnQgYXMgYSBmbG9hdCIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAiaGV4YWRlY2ltYWwgdmFsdWUgdG9vIGxhcmdlIHRvIHJlcHJlc2VudCBhcyBhIGZsb2F0Iik7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgcGFyc2VfZXJyb3I6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkiaW52YWxpZCBoZXhhZGVjaW1hbCBmbG9hdGluZy1wb2ludCBzdHJpbmciKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImludmFsaWQgaGV4YWRlY2ltYWwgZmxvYXRpbmctcG9pbnQgc3RyaW5nIik7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgaW5zYW5lX2xlbmd0aF9lcnJvcjoKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJoZXhhZGVjaW1hbCBzdHJpbmcgdG9vIGxvbmcgdG8gY29udmVydCIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiaGV4YWRlY2ltYWwgc3RyaW5nIHRvbyBsb25nIHRvIGNvbnZlcnQiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGZsb2F0X2Zyb21oZXhfZG9jLApAQCAtMTY3Miw4NSArMTY3Miw4NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2FzX2ludGVnZXJfcmF0aW8oUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JZG91YmxlIHNlbGY7Ci0JZG91YmxlIGZsb2F0X3BhcnQ7Ci0JaW50IGV4cG9uZW50OwotCWludCBpOworICAgIGRvdWJsZSBzZWxmOworICAgIGRvdWJsZSBmbG9hdF9wYXJ0OworICAgIGludCBleHBvbmVudDsKKyAgICBpbnQgaTsKIAotCVB5T2JqZWN0ICpwcmV2OwotCVB5T2JqZWN0ICpweV9leHBvbmVudCA9IE5VTEw7Ci0JUHlPYmplY3QgKm51bWVyYXRvciA9IE5VTEw7Ci0JUHlPYmplY3QgKmRlbm9taW5hdG9yID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0X3BhaXIgPSBOVUxMOwotCVB5TnVtYmVyTWV0aG9kcyAqbG9uZ19tZXRob2RzID0gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyOworICAgIFB5T2JqZWN0ICpwcmV2OworICAgIFB5T2JqZWN0ICpweV9leHBvbmVudCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm51bWVyYXRvciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRlbm9taW5hdG9yID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0X3BhaXIgPSBOVUxMOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbG9uZ19tZXRob2RzID0gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyOwogCiAjZGVmaW5lIElOUExBQ0VfVVBEQVRFKG9iaiwgY2FsbCkgXAotCXByZXYgPSBvYmo7IFwKLQlvYmogPSBjYWxsOyBcCi0JUHlfREVDUkVGKHByZXYpOyBcCisgICAgcHJldiA9IG9iajsgXAorICAgIG9iaiA9IGNhbGw7IFwKKyAgICBQeV9ERUNSRUYocHJldik7IFwKIAotCUNPTlZFUlRfVE9fRE9VQkxFKHYsIHNlbGYpOworICAgIENPTlZFUlRfVE9fRE9VQkxFKHYsIHNlbGYpOwogCi0JaWYgKFB5X0lTX0lORklOSVRZKHNlbGYpKSB7Ci0JICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSAgIkNhbm5vdCBwYXNzIGluZmluaXR5IHRvIGZsb2F0LmFzX2ludGVnZXJfcmF0aW8uIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5X0lTX0lORklOSVRZKHNlbGYpKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHBhc3MgaW5maW5pdHkgdG8gZmxvYXQuYXNfaW50ZWdlcl9yYXRpby4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNpZmRlZiBQeV9OQU4KLQlpZiAoUHlfSVNfTkFOKHNlbGYpKSB7Ci0JICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgIkNhbm5vdCBwYXNzIE5hTiB0byBmbG9hdC5hc19pbnRlZ2VyX3JhdGlvLiIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeV9JU19OQU4oc2VsZikpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcGFzcyBOYU4gdG8gZmxvYXQuYXNfaW50ZWdlcl9yYXRpby4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXNfaW50ZWdlcl9yYXRpbyIsIGdvdG8gZXJyb3IpOwotCWZsb2F0X3BhcnQgPSBmcmV4cChzZWxmLCAmZXhwb25lbnQpOyAgCS8qIHNlbGYgPT0gZmxvYXRfcGFydCAqIDIqKmV4cG9uZW50IGV4YWN0bHkgKi8KLQlQeUZQRV9FTkRfUFJPVEVDVChmbG9hdF9wYXJ0KTsKLQkKLQlmb3IgKGk9MDsgaTwzMDAgJiYgZmxvYXRfcGFydCAhPSBmbG9vcihmbG9hdF9wYXJ0KSA7IGkrKykgewotCQlmbG9hdF9wYXJ0ICo9IDIuMDsKLQkJZXhwb25lbnQtLTsKLQl9CQotCS8qIHNlbGYgPT0gZmxvYXRfcGFydCAqIDIqKmV4cG9uZW50IGV4YWN0bHkgYW5kIGZsb2F0X3BhcnQgaXMgaW50ZWdyYWwuCi0gICAgICAgICAgIElmIEZMVF9SQURJWCAhPSAyLCB0aGUgMzAwIHN0ZXBzIG1heSBsZWF2ZSBhIHRpbnkgZnJhY3Rpb25hbCBwYXJ0Ci0gICAgICAgICAgIHRvIGJlIHRydW5jYXRlZCBieSBQeUxvbmdfRnJvbURvdWJsZSgpLiAqLworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImFzX2ludGVnZXJfcmF0aW8iLCBnb3RvIGVycm9yKTsKKyAgICBmbG9hdF9wYXJ0ID0gZnJleHAoc2VsZiwgJmV4cG9uZW50KTsgICAgICAgIC8qIHNlbGYgPT0gZmxvYXRfcGFydCAqIDIqKmV4cG9uZW50IGV4YWN0bHkgKi8KKyAgICBQeUZQRV9FTkRfUFJPVEVDVChmbG9hdF9wYXJ0KTsKIAotCW51bWVyYXRvciA9IFB5TG9uZ19Gcm9tRG91YmxlKGZsb2F0X3BhcnQpOwotCWlmIChudW1lcmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICBmb3IgKGk9MDsgaTwzMDAgJiYgZmxvYXRfcGFydCAhPSBmbG9vcihmbG9hdF9wYXJ0KSA7IGkrKykgeworICAgICAgICBmbG9hdF9wYXJ0ICo9IDIuMDsKKyAgICAgICAgZXhwb25lbnQtLTsKKyAgICB9CisgICAgLyogc2VsZiA9PSBmbG9hdF9wYXJ0ICogMioqZXhwb25lbnQgZXhhY3RseSBhbmQgZmxvYXRfcGFydCBpcyBpbnRlZ3JhbC4KKyAgICAgICBJZiBGTFRfUkFESVggIT0gMiwgdGhlIDMwMCBzdGVwcyBtYXkgbGVhdmUgYSB0aW55IGZyYWN0aW9uYWwgcGFydAorICAgICAgIHRvIGJlIHRydW5jYXRlZCBieSBQeUxvbmdfRnJvbURvdWJsZSgpLiAqLwogCi0JLyogZm9sZCBpbiAyKipleHBvbmVudCAqLwotCWRlbm9taW5hdG9yID0gUHlMb25nX0Zyb21Mb25nKDEpOwotCXB5X2V4cG9uZW50ID0gUHlMb25nX0Zyb21Mb25nKGxhYnMoKGxvbmcpZXhwb25lbnQpKTsKLQlpZiAocHlfZXhwb25lbnQgPT0gTlVMTCkgZ290byBlcnJvcjsKLQlJTlBMQUNFX1VQREFURShweV9leHBvbmVudCwKLQkJICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbHNoaWZ0KGRlbm9taW5hdG9yLCBweV9leHBvbmVudCkpOwotCWlmIChweV9leHBvbmVudCA9PSBOVUxMKSBnb3RvIGVycm9yOwotCWlmIChleHBvbmVudCA+IDApIHsKLQkJSU5QTEFDRV9VUERBVEUobnVtZXJhdG9yLAotCQkJICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbXVsdGlwbHkobnVtZXJhdG9yLCBweV9leHBvbmVudCkpOwotCQlpZiAobnVtZXJhdG9yID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0JfQotCWVsc2UgewotCQlQeV9ERUNSRUYoZGVub21pbmF0b3IpOwotCQlkZW5vbWluYXRvciA9IHB5X2V4cG9uZW50OwotCQlweV9leHBvbmVudCA9IE5VTEw7Ci0JfQorICAgIG51bWVyYXRvciA9IFB5TG9uZ19Gcm9tRG91YmxlKGZsb2F0X3BhcnQpOworICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKIAotCS8qIFJldHVybnMgaW50cyBpbnN0ZWFkIG9mIGxvbmdzIHdoZXJlIHBvc3NpYmxlICovCi0JSU5QTEFDRV9VUERBVEUobnVtZXJhdG9yLCBQeU51bWJlcl9JbnQobnVtZXJhdG9yKSk7Ci0JaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOwotCUlOUExBQ0VfVVBEQVRFKGRlbm9taW5hdG9yLCBQeU51bWJlcl9JbnQoZGVub21pbmF0b3IpKTsKLQlpZiAoZGVub21pbmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICAvKiBmb2xkIGluIDIqKmV4cG9uZW50ICovCisgICAgZGVub21pbmF0b3IgPSBQeUxvbmdfRnJvbUxvbmcoMSk7CisgICAgcHlfZXhwb25lbnQgPSBQeUxvbmdfRnJvbUxvbmcobGFicygobG9uZylleHBvbmVudCkpOworICAgIGlmIChweV9leHBvbmVudCA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIElOUExBQ0VfVVBEQVRFKHB5X2V4cG9uZW50LAorICAgICAgICAgICAgICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbHNoaWZ0KGRlbm9taW5hdG9yLCBweV9leHBvbmVudCkpOworICAgIGlmIChweV9leHBvbmVudCA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIGlmIChleHBvbmVudCA+IDApIHsKKyAgICAgICAgSU5QTEFDRV9VUERBVEUobnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBsb25nX21ldGhvZHMtPm5iX211bHRpcGx5KG51bWVyYXRvciwgcHlfZXhwb25lbnQpKTsKKyAgICAgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKGRlbm9taW5hdG9yKTsKKyAgICAgICAgZGVub21pbmF0b3IgPSBweV9leHBvbmVudDsKKyAgICAgICAgcHlfZXhwb25lbnQgPSBOVUxMOworICAgIH0KIAotCXJlc3VsdF9wYWlyID0gUHlUdXBsZV9QYWNrKDIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOworICAgIC8qIFJldHVybnMgaW50cyBpbnN0ZWFkIG9mIGxvbmdzIHdoZXJlIHBvc3NpYmxlICovCisgICAgSU5QTEFDRV9VUERBVEUobnVtZXJhdG9yLCBQeU51bWJlcl9JbnQobnVtZXJhdG9yKSk7CisgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIElOUExBQ0VfVVBEQVRFKGRlbm9taW5hdG9yLCBQeU51bWJlcl9JbnQoZGVub21pbmF0b3IpKTsKKyAgICBpZiAoZGVub21pbmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKKworICAgIHJlc3VsdF9wYWlyID0gUHlUdXBsZV9QYWNrKDIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOwogCiAjdW5kZWYgSU5QTEFDRV9VUERBVEUKIGVycm9yOgotCVB5X1hERUNSRUYocHlfZXhwb25lbnQpOwotCVB5X1hERUNSRUYoZGVub21pbmF0b3IpOwotCVB5X1hERUNSRUYobnVtZXJhdG9yKTsKLQlyZXR1cm4gcmVzdWx0X3BhaXI7CisgICAgUHlfWERFQ1JFRihweV9leHBvbmVudCk7CisgICAgUHlfWERFQ1JFRihkZW5vbWluYXRvcik7CisgICAgUHlfWERFQ1JFRihudW1lcmF0b3IpOworICAgIHJldHVybiByZXN1bHRfcGFpcjsKIH0KIAogUHlEb2NfU1RSVkFSKGZsb2F0X2FzX2ludGVnZXJfcmF0aW9fZG9jLApAQCAtMTc3NCwxOCArMTc3NCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqeCA9IFB5X0ZhbHNlOyAvKiBJbnRlZ2VyIHplcm8gKi8KLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7IngiLCAwfTsKKyAgICBQeU9iamVjdCAqeCA9IFB5X0ZhbHNlOyAvKiBJbnRlZ2VyIHplcm8gKi8KKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7IngiLCAwfTsKIAotCWlmICh0eXBlICE9ICZQeUZsb2F0X1R5cGUpCi0JCXJldHVybiBmbG9hdF9zdWJ0eXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsgLyogV2ltcCBvdXQgKi8KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE86ZmxvYXQiLCBrd2xpc3QsICZ4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogSWYgaXQncyBhIHN0cmluZywgYnV0IG5vdCBhIHN0cmluZyBzdWJjbGFzcywgdXNlCi0JICAgUHlGbG9hdF9Gcm9tU3RyaW5nLiAqLwotCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KHgpKQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tU3RyaW5nKHgsIE5VTEwpOwotCXJldHVybiBQeU51bWJlcl9GbG9hdCh4KTsKKyAgICBpZiAodHlwZSAhPSAmUHlGbG9hdF9UeXBlKQorICAgICAgICByZXR1cm4gZmxvYXRfc3VidHlwZV9uZXcodHlwZSwgYXJncywga3dkcyk7IC8qIFdpbXAgb3V0ICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPOmZsb2F0Iiwga3dsaXN0LCAmeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIElmIGl0J3MgYSBzdHJpbmcsIGJ1dCBub3QgYSBzdHJpbmcgc3ViY2xhc3MsIHVzZQorICAgICAgIFB5RmxvYXRfRnJvbVN0cmluZy4gKi8KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh4KSkKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbVN0cmluZyh4LCBOVUxMKTsKKyAgICByZXR1cm4gUHlOdW1iZXJfRmxvYXQoeCk7CiB9CiAKIC8qIFdpbXB5LCBzbG93IGFwcHJvYWNoIHRvIHRwX25ldyBjYWxscyBmb3Igc3VidHlwZXMgb2YgZmxvYXQ6CkBAIC0xNzk2LDMzICsxNzk2LDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfc3VidHlwZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnRtcCwgKm5ld29iajsKKyAgICBQeU9iamVjdCAqdG1wLCAqbmV3b2JqOwogCi0JYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5RmxvYXRfVHlwZSkpOwotCXRtcCA9IGZsb2F0X25ldygmUHlGbG9hdF9UeXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeUZsb2F0X0NoZWNrRXhhY3QodG1wKSk7Ci0JbmV3b2JqID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih0bXApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKChQeUZsb2F0T2JqZWN0ICopbmV3b2JqKS0+b2JfZnZhbCA9ICgoUHlGbG9hdE9iamVjdCAqKXRtcCktPm9iX2Z2YWw7Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIG5ld29iajsKKyAgICBhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlGbG9hdF9UeXBlKSk7CisgICAgdG1wID0gZmxvYXRfbmV3KCZQeUZsb2F0X1R5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5RmxvYXRfQ2hlY2tFeGFjdCh0bXApKTsKKyAgICBuZXdvYmogPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobmV3b2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAoKFB5RmxvYXRPYmplY3QgKiluZXdvYmopLT5vYl9mdmFsID0gKChQeUZsb2F0T2JqZWN0ICopdG1wKS0+b2JfZnZhbDsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gbmV3b2JqOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfZ2V0bmV3YXJncyhQeUZsb2F0T2JqZWN0ICp2KQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZCkiLCB2LT5vYl9mdmFsKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGQpIiwgdi0+b2JfZnZhbCk7CiB9CiAKIC8qIHRoaXMgaXMgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBwYWNrL3VucGFjayByb3V0aW5lcyBiZWxvdyAqLwogCiB0eXBlZGVmIGVudW0gewotCXVua25vd25fZm9ybWF0LCBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0LCBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0CisgICAgdW5rbm93bl9mb3JtYXQsIGllZWVfYmlnX2VuZGlhbl9mb3JtYXQsIGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQKIH0gZmxvYXRfZm9ybWF0X3R5cGU7CiAKIHN0YXRpYyBmbG9hdF9mb3JtYXRfdHlwZSBkb3VibGVfZm9ybWF0LCBmbG9hdF9mb3JtYXQ7CkBAIC0xODMxLDQwICsxODMxLDQwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfZ2V0Zm9ybWF0KFB5VHlwZU9iamVjdCAqdiwgUHlPYmplY3QqIGFyZykKIHsKLQljaGFyKiBzOwotCWZsb2F0X2Zvcm1hdF90eXBlIHI7CisgICAgY2hhciogczsKKyAgICBmbG9hdF9mb3JtYXRfdHlwZSByOwogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhhcmcpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JICAgICAiX19nZXRmb3JtYXRfXygpIGFyZ3VtZW50IG11c3QgYmUgc3RyaW5nLCBub3QgJS41MDBzIiwKLQkJCSAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXMgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKLQlpZiAoc3RyY21wKHMsICJkb3VibGUiKSA9PSAwKSB7Ci0JCXIgPSBkb3VibGVfZm9ybWF0OwotCX0KLQllbHNlIGlmIChzdHJjbXAocywgImZsb2F0IikgPT0gMCkgewotCQlyID0gZmxvYXRfZm9ybWF0OwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIl9fZ2V0Zm9ybWF0X18oKSBhcmd1bWVudCAxIG11c3QgYmUgIgotCQkJCSInZG91YmxlJyBvciAnZmxvYXQnIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlzd2l0Y2ggKHIpIHsKLQljYXNlIHVua25vd25fZm9ybWF0OgotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygidW5rbm93biIpOwotCWNhc2UgaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdDoKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIklFRUUsIGxpdHRsZS1lbmRpYW4iKTsKLQljYXNlIGllZWVfYmlnX2VuZGlhbl9mb3JtYXQ6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJJRUVFLCBiaWctZW5kaWFuIik7Ci0JZGVmYXVsdDoKLQkJUHlfRmF0YWxFcnJvcigiaW5zYW5lIGZsb2F0X2Zvcm1hdCBvciBkb3VibGVfZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICJfX2dldGZvcm1hdF9fKCkgYXJndW1lbnQgbXVzdCBiZSBzdHJpbmcsIG5vdCAlLjUwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyk7CisgICAgaWYgKHN0cmNtcChzLCAiZG91YmxlIikgPT0gMCkgeworICAgICAgICByID0gZG91YmxlX2Zvcm1hdDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKHMsICJmbG9hdCIpID09IDApIHsKKyAgICAgICAgciA9IGZsb2F0X2Zvcm1hdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fZ2V0Zm9ybWF0X18oKSBhcmd1bWVudCAxIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIidkb3VibGUnIG9yICdmbG9hdCciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3dpdGNoIChyKSB7CisgICAgY2FzZSB1bmtub3duX2Zvcm1hdDoKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoInVua25vd24iKTsKKyAgICBjYXNlIGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQ6CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJJRUVFLCBsaXR0bGUtZW5kaWFuIik7CisgICAgY2FzZSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0OgorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiSUVFRSwgYmlnLWVuZGlhbiIpOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImluc2FuZSBmbG9hdF9mb3JtYXQgb3IgZG91YmxlX2Zvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihmbG9hdF9nZXRmb3JtYXRfZG9jLApAQCAtMTg4MCw1NyArMTg4MCw1NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X3NldGZvcm1hdChQeVR5cGVPYmplY3QgKnYsIFB5T2JqZWN0KiBhcmdzKQogewotCWNoYXIqIHR5cGVzdHI7Ci0JY2hhciogZm9ybWF0OwotCWZsb2F0X2Zvcm1hdF90eXBlIGY7Ci0JZmxvYXRfZm9ybWF0X3R5cGUgZGV0ZWN0ZWQ7Ci0JZmxvYXRfZm9ybWF0X3R5cGUgKnA7CisgICAgY2hhciogdHlwZXN0cjsKKyAgICBjaGFyKiBmb3JtYXQ7CisgICAgZmxvYXRfZm9ybWF0X3R5cGUgZjsKKyAgICBmbG9hdF9mb3JtYXRfdHlwZSBkZXRlY3RlZDsKKyAgICBmbG9hdF9mb3JtYXRfdHlwZSAqcDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6X19zZXRmb3JtYXRfXyIsICZ0eXBlc3RyLCAmZm9ybWF0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpfX3NldGZvcm1hdF9fIiwgJnR5cGVzdHIsICZmb3JtYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdHJjbXAodHlwZXN0ciwgImRvdWJsZSIpID09IDApIHsKLQkJcCA9ICZkb3VibGVfZm9ybWF0OwotCQlkZXRlY3RlZCA9IGRldGVjdGVkX2RvdWJsZV9mb3JtYXQ7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcCh0eXBlc3RyLCAiZmxvYXQiKSA9PSAwKSB7Ci0JCXAgPSAmZmxvYXRfZm9ybWF0OwotCQlkZXRlY3RlZCA9IGRldGVjdGVkX2Zsb2F0X2Zvcm1hdDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJfX3NldGZvcm1hdF9fKCkgYXJndW1lbnQgMSBtdXN0ICIKLQkJCQkiYmUgJ2RvdWJsZScgb3IgJ2Zsb2F0JyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JaWYgKHN0cmNtcChmb3JtYXQsICJ1bmtub3duIikgPT0gMCkgewotCQlmID0gdW5rbm93bl9mb3JtYXQ7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChmb3JtYXQsICJJRUVFLCBsaXR0bGUtZW5kaWFuIikgPT0gMCkgewotCQlmID0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdDsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGZvcm1hdCwgIklFRUUsIGJpZy1lbmRpYW4iKSA9PSAwKSB7Ci0JCWYgPSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0OwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIl9fc2V0Zm9ybWF0X18oKSBhcmd1bWVudCAyIG11c3QgYmUgIgotCQkJCSIndW5rbm93bicsICdJRUVFLCBsaXR0bGUtZW5kaWFuJyBvciAiCi0JCQkJIidJRUVFLCBiaWctZW5kaWFuJyIpOwotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RyY21wKHR5cGVzdHIsICJkb3VibGUiKSA9PSAwKSB7CisgICAgICAgIHAgPSAmZG91YmxlX2Zvcm1hdDsKKyAgICAgICAgZGV0ZWN0ZWQgPSBkZXRlY3RlZF9kb3VibGVfZm9ybWF0OworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAodHlwZXN0ciwgImZsb2F0IikgPT0gMCkgeworICAgICAgICBwID0gJmZsb2F0X2Zvcm1hdDsKKyAgICAgICAgZGV0ZWN0ZWQgPSBkZXRlY3RlZF9mbG9hdF9mb3JtYXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX3NldGZvcm1hdF9fKCkgYXJndW1lbnQgMSBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJiZSAnZG91YmxlJyBvciAnZmxvYXQnIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCX0KKyAgICBpZiAoc3RyY21wKGZvcm1hdCwgInVua25vd24iKSA9PSAwKSB7CisgICAgICAgIGYgPSB1bmtub3duX2Zvcm1hdDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKGZvcm1hdCwgIklFRUUsIGxpdHRsZS1lbmRpYW4iKSA9PSAwKSB7CisgICAgICAgIGYgPSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0OworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoZm9ybWF0LCAiSUVFRSwgYmlnLWVuZGlhbiIpID09IDApIHsKKyAgICAgICAgZiA9IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX3NldGZvcm1hdF9fKCkgYXJndW1lbnQgMiBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIndW5rbm93bicsICdJRUVFLCBsaXR0bGUtZW5kaWFuJyBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJ0lFRUUsIGJpZy1lbmRpYW4nIik7CisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGYgIT0gdW5rbm93bl9mb3JtYXQgJiYgZiAhPSBkZXRlY3RlZCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgImNhbiBvbmx5IHNldCAlcyBmb3JtYXQgdG8gJ3Vua25vd24nIG9yIHRoZSAiCi0JCQkgICAgICJkZXRlY3RlZCBwbGF0Zm9ybSB2YWx1ZSIsIHR5cGVzdHIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgfQogCi0JKnAgPSBmOwotCVB5X1JFVFVSTl9OT05FOworICAgIGlmIChmICE9IHVua25vd25fZm9ybWF0ICYmIGYgIT0gZGV0ZWN0ZWQpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuIG9ubHkgc2V0ICVzIGZvcm1hdCB0byAndW5rbm93bicgb3IgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICJkZXRlY3RlZCBwbGF0Zm9ybSB2YWx1ZSIsIHR5cGVzdHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAqcCA9IGY7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihmbG9hdF9zZXRmb3JtYXRfZG9jLApAQCAtMTk0OSwzNyArMTk0OSwzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2dldHplcm8oUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgwLjApOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoMC4wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X19mb3JtYXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZvcm1hdF9zcGVjOworICAgIFB5T2JqZWN0ICpmb3JtYXRfc3BlYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdF9zcGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5Qnl0ZXNfQ2hlY2soZm9ybWF0X3NwZWMpKQotCQlyZXR1cm4gX1B5RmxvYXRfRm9ybWF0QWR2YW5jZWQoc2VsZiwKLQkJCQkJICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGZvcm1hdF9zcGVjKSwKLQkJCQkJICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoZm9ybWF0X3NwZWMpKTsKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkgewotCQkvKiBDb252ZXJ0IGZvcm1hdF9zcGVjIHRvIGEgc3RyICovCi0JCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCVB5T2JqZWN0ICpzdHJfc3BlYyA9IFB5T2JqZWN0X1N0cihmb3JtYXRfc3BlYyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlCeXRlc19DaGVjayhmb3JtYXRfc3BlYykpCisgICAgICAgIHJldHVybiBfUHlGbG9hdF9Gb3JtYXRBZHZhbmNlZChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShmb3JtYXRfc3BlYykpOworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSB7CisgICAgICAgIC8qIENvbnZlcnQgZm9ybWF0X3NwZWMgdG8gYSBzdHIgKi8KKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QgKnN0cl9zcGVjID0gUHlPYmplY3RfU3RyKGZvcm1hdF9zcGVjKTsKIAotCQlpZiAoc3RyX3NwZWMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBpZiAoc3RyX3NwZWMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXJlc3VsdCA9IF9QeUZsb2F0X0Zvcm1hdEFkdmFuY2VkKHNlbGYsCi0JCQkJCQkgUHlCeXRlc19BU19TVFJJTkcoc3RyX3NwZWMpLAotCQkJCQkJIFB5Qnl0ZXNfR0VUX1NJWkUoc3RyX3NwZWMpKTsKKyAgICAgICAgcmVzdWx0ID0gX1B5RmxvYXRfRm9ybWF0QWR2YW5jZWQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc3RyX3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKHN0cl9zcGVjKSk7CiAKLQkJUHlfREVDUkVGKHN0cl9zcGVjKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fZm9ybWF0X18gcmVxdWlyZXMgc3RyIG9yIHVuaWNvZGUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKHN0cl9zcGVjKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fZm9ybWF0X18gcmVxdWlyZXMgc3RyIG9yIHVuaWNvZGUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGZsb2F0X19mb3JtYXRfX2RvYywKQEAgLTE5ODksNDIgKzE5ODksNDIgQEAKIAogCiBzdGF0aWMgUHlNZXRob2REZWYgZmxvYXRfbWV0aG9kc1tdID0gewotCXsiY29uanVnYXRlIiwJKFB5Q0Z1bmN0aW9uKWZsb2F0X2Zsb2F0LAlNRVRIX05PQVJHUywKLQkgIlJldHVybnMgc2VsZiwgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFueSBmbG9hdC4ifSwKLQl7Il9fdHJ1bmNfXyIsCShQeUNGdW5jdGlvbilmbG9hdF90cnVuYywgTUVUSF9OT0FSR1MsCi0gICAgICAgICAiUmV0dXJucyB0aGUgSW50ZWdyYWwgY2xvc2VzdCB0byB4IGJldHdlZW4gMCBhbmQgeC4ifSwKLQl7ImFzX2ludGVnZXJfcmF0aW8iLCAoUHlDRnVuY3Rpb24pZmxvYXRfYXNfaW50ZWdlcl9yYXRpbywgTUVUSF9OT0FSR1MsCi0JIGZsb2F0X2FzX2ludGVnZXJfcmF0aW9fZG9jfSwKLQl7ImZyb21oZXgiLCAoUHlDRnVuY3Rpb24pZmxvYXRfZnJvbWhleCwKLQkgTUVUSF9PfE1FVEhfQ0xBU1MsIGZsb2F0X2Zyb21oZXhfZG9jfSwKLQl7ImhleCIsIChQeUNGdW5jdGlvbilmbG9hdF9oZXgsCi0JIE1FVEhfTk9BUkdTLCBmbG9hdF9oZXhfZG9jfSwKLQl7ImlzX2ludGVnZXIiLAkoUHlDRnVuY3Rpb24pZmxvYXRfaXNfaW50ZWdlciwJTUVUSF9OT0FSR1MsCi0JICJSZXR1cm5zIFRydWUgaWYgdGhlIGZsb2F0IGlzIGFuIGludGVnZXIuIn0sCisgICAgeyJjb25qdWdhdGUiLCAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfZmxvYXQsICAgICAgIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGZsb2F0LiJ9LAorICAgIHsiX190cnVuY19fIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X3RydW5jLCBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgdGhlIEludGVncmFsIGNsb3Nlc3QgdG8geCBiZXR3ZWVuIDAgYW5kIHguIn0sCisgICAgeyJhc19pbnRlZ2VyX3JhdGlvIiwgKFB5Q0Z1bmN0aW9uKWZsb2F0X2FzX2ludGVnZXJfcmF0aW8sIE1FVEhfTk9BUkdTLAorICAgICBmbG9hdF9hc19pbnRlZ2VyX3JhdGlvX2RvY30sCisgICAgeyJmcm9taGV4IiwgKFB5Q0Z1bmN0aW9uKWZsb2F0X2Zyb21oZXgsCisgICAgIE1FVEhfT3xNRVRIX0NMQVNTLCBmbG9hdF9mcm9taGV4X2RvY30sCisgICAgeyJoZXgiLCAoUHlDRnVuY3Rpb24pZmxvYXRfaGV4LAorICAgICBNRVRIX05PQVJHUywgZmxvYXRfaGV4X2RvY30sCisgICAgeyJpc19pbnRlZ2VyIiwgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfaXNfaW50ZWdlciwgIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBhbiBpbnRlZ2VyLiJ9LAogI2lmIDAKLQl7ImlzX2luZiIsCShQeUNGdW5jdGlvbilmbG9hdF9pc19pbmYsCU1FVEhfTk9BUkdTLAotCSAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbmZpbml0ZS4ifSwKLQl7ImlzX2Zpbml0ZSIsCShQeUNGdW5jdGlvbilmbG9hdF9pc19maW5pdGUsCU1FVEhfTk9BUkdTLAotCSAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBmaW5pdGUsIG5laXRoZXIgaW5maW5pdGUgbm9yIE5hTi4ifSwKLQl7ImlzX25hbiIsCShQeUNGdW5jdGlvbilmbG9hdF9pc19uYW4sCU1FVEhfTk9BUkdTLAotCSAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBub3QgYSBudW1iZXIgKE5hTikuIn0sCisgICAgeyJpc19pbmYiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfaXNfaW5mLCAgICAgIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbmZpbml0ZS4ifSwKKyAgICB7ImlzX2Zpbml0ZSIsICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9pc19maW5pdGUsICAgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm5zIFRydWUgaWYgdGhlIGZsb2F0IGlzIGZpbml0ZSwgbmVpdGhlciBpbmZpbml0ZSBub3IgTmFOLiJ9LAorICAgIHsiaXNfbmFuIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X2lzX25hbiwgICAgICBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgVHJ1ZSBpZiB0aGUgZmxvYXQgaXMgbm90IGEgbnVtYmVyIChOYU4pLiJ9LAogI2VuZGlmCi0JeyJfX2dldG5ld2FyZ3NfXyIsCShQeUNGdW5jdGlvbilmbG9hdF9nZXRuZXdhcmdzLAlNRVRIX05PQVJHU30sCi0JeyJfX2dldGZvcm1hdF9fIiwJKFB5Q0Z1bmN0aW9uKWZsb2F0X2dldGZvcm1hdCwJCi0JIE1FVEhfT3xNRVRIX0NMQVNTLAkJZmxvYXRfZ2V0Zm9ybWF0X2RvY30sCi0JeyJfX3NldGZvcm1hdF9fIiwJKFB5Q0Z1bmN0aW9uKWZsb2F0X3NldGZvcm1hdCwJCi0JIE1FVEhfVkFSQVJHU3xNRVRIX0NMQVNTLAlmbG9hdF9zZXRmb3JtYXRfZG9jfSwKLSAgICAgICAgeyJfX2Zvcm1hdF9fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X19mb3JtYXRfXywKLSAgICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgICAgICAgICBmbG9hdF9fZm9ybWF0X19kb2N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2dldG5ld2FyZ3NfXyIsICAgICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9nZXRuZXdhcmdzLCAgTUVUSF9OT0FSR1N9LAorICAgIHsiX19nZXRmb3JtYXRfXyIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfZ2V0Zm9ybWF0LAorICAgICBNRVRIX098TUVUSF9DTEFTUywgICAgICAgICAgICAgICAgIGZsb2F0X2dldGZvcm1hdF9kb2N9LAorICAgIHsiX19zZXRmb3JtYXRfXyIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfc2V0Zm9ybWF0LAorICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9DTEFTUywgICAgICAgICAgIGZsb2F0X3NldGZvcm1hdF9kb2N9LAorICAgIHsiX19mb3JtYXRfXyIsICAgICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9fZm9ybWF0X18sCisgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgICAgICAgICBmbG9hdF9fZm9ybWF0X19kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlHZXRTZXREZWYgZmxvYXRfZ2V0c2V0W10gPSB7Ci0gICAgeyJyZWFsIiwgCisgICAgeyJyZWFsIiwKICAgICAgKGdldHRlcilmbG9hdF9mbG9hdCwgKHNldHRlcilOVUxMLAogICAgICAidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyIiwKICAgICAgTlVMTH0sCi0gICAgeyJpbWFnIiwgCisgICAgeyJpbWFnIiwKICAgICAgKGdldHRlcilmbG9hdF9nZXR6ZXJvLCAoc2V0dGVyKU5VTEwsCiAgICAgICJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciIsCiAgICAgIE5VTEx9LApAQCAtMjAzOCwyMzUgKzIwMzgsMjM1IEBACiAKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBmbG9hdF9hc19udW1iZXIgPSB7Ci0JZmxvYXRfYWRkLCAJLypuYl9hZGQqLwotCWZsb2F0X3N1YiwgCS8qbmJfc3VidHJhY3QqLwotCWZsb2F0X211bCwgCS8qbmJfbXVsdGlwbHkqLwotCWZsb2F0X2NsYXNzaWNfZGl2LCAvKm5iX2RpdmlkZSovCi0JZmxvYXRfcmVtLCAJLypuYl9yZW1haW5kZXIqLwotCWZsb2F0X2Rpdm1vZCwgCS8qbmJfZGl2bW9kKi8KLQlmbG9hdF9wb3csIAkvKm5iX3Bvd2VyKi8KLQkodW5hcnlmdW5jKWZsb2F0X25lZywgLypuYl9uZWdhdGl2ZSovCi0JKHVuYXJ5ZnVuYylmbG9hdF9mbG9hdCwgLypuYl9wb3NpdGl2ZSovCi0JKHVuYXJ5ZnVuYylmbG9hdF9hYnMsIC8qbmJfYWJzb2x1dGUqLwotCShpbnF1aXJ5KWZsb2F0X25vbnplcm8sIC8qbmJfbm9uemVybyovCi0JMCwJCS8qbmJfaW52ZXJ0Ki8KLQkwLAkJLypuYl9sc2hpZnQqLwotCTAsCQkvKm5iX3JzaGlmdCovCi0JMCwJCS8qbmJfYW5kKi8KLQkwLAkJLypuYl94b3IqLwotCTAsCQkvKm5iX29yKi8KLQlmbG9hdF9jb2VyY2UsIAkvKm5iX2NvZXJjZSovCi0JZmxvYXRfdHJ1bmMsIAkvKm5iX2ludCovCi0JZmxvYXRfbG9uZywgCS8qbmJfbG9uZyovCi0JZmxvYXRfZmxvYXQsCS8qbmJfZmxvYXQqLwotCTAsCQkvKiBuYl9vY3QgKi8KLQkwLAkJLyogbmJfaGV4ICovCi0JMCwJCS8qIG5iX2lucGxhY2VfYWRkICovCi0JMCwJCS8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KLQkwLAkJLyogbmJfaW5wbGFjZV9tdWx0aXBseSAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLwotCTAsIAkJLyogbmJfaW5wbGFjZV9wb3dlciAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX2FuZCAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX3hvciAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX29yICovCi0JZmxvYXRfZmxvb3JfZGl2LCAvKiBuYl9mbG9vcl9kaXZpZGUgKi8KLQlmbG9hdF9kaXYsCS8qIG5iX3RydWVfZGl2aWRlICovCi0JMCwJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCi0JMCwJCS8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KKyAgICBmbG9hdF9hZGQsICAgICAgICAgIC8qbmJfYWRkKi8KKyAgICBmbG9hdF9zdWIsICAgICAgICAgIC8qbmJfc3VidHJhY3QqLworICAgIGZsb2F0X211bCwgICAgICAgICAgLypuYl9tdWx0aXBseSovCisgICAgZmxvYXRfY2xhc3NpY19kaXYsIC8qbmJfZGl2aWRlKi8KKyAgICBmbG9hdF9yZW0sICAgICAgICAgIC8qbmJfcmVtYWluZGVyKi8KKyAgICBmbG9hdF9kaXZtb2QsICAgICAgIC8qbmJfZGl2bW9kKi8KKyAgICBmbG9hdF9wb3csICAgICAgICAgIC8qbmJfcG93ZXIqLworICAgICh1bmFyeWZ1bmMpZmxvYXRfbmVnLCAvKm5iX25lZ2F0aXZlKi8KKyAgICAodW5hcnlmdW5jKWZsb2F0X2Zsb2F0LCAvKm5iX3Bvc2l0aXZlKi8KKyAgICAodW5hcnlmdW5jKWZsb2F0X2FicywgLypuYl9hYnNvbHV0ZSovCisgICAgKGlucXVpcnkpZmxvYXRfbm9uemVybywgLypuYl9ub256ZXJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfbHNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfcnNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfYW5kKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfeG9yKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qbmJfb3IqLworICAgIGZsb2F0X2NvZXJjZSwgICAgICAgLypuYl9jb2VyY2UqLworICAgIGZsb2F0X3RydW5jLCAgICAgICAgLypuYl9pbnQqLworICAgIGZsb2F0X2xvbmcsICAgICAgICAgLypuYl9sb25nKi8KKyAgICBmbG9hdF9mbG9hdCwgICAgICAgIC8qbmJfZmxvYXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfb2N0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9oZXggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfYWRkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9yZW1haW5kZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfbHNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hbmQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfeG9yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX29yICovCisgICAgZmxvYXRfZmxvb3JfZGl2LCAvKiBuYl9mbG9vcl9kaXZpZGUgKi8KKyAgICBmbG9hdF9kaXYsICAgICAgICAgIC8qIG5iX3RydWVfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5RmxvYXRfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJmbG9hdCIsCi0Jc2l6ZW9mKFB5RmxvYXRPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpZmxvYXRfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKWZsb2F0X3ByaW50LCAJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJIAkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylmbG9hdF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkmZmxvYXRfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWZsb2F0X2hhc2gsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JKHJlcHJmdW5jKWZsb2F0X3N0ciwJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCQkvKiB0cF9mbGFncyAqLwotCWZsb2F0X2RvYywJCQkJLyogdHBfZG9jICovCi0gCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCWZsb2F0X3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlmbG9hdF9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlmbG9hdF9nZXRzZXQsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlmbG9hdF9uZXcsCQkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImZsb2F0IiwKKyAgICBzaXplb2YoUHlGbG9hdE9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilmbG9hdF9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAocHJpbnRmdW5jKWZsb2F0X3ByaW50LCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWZsb2F0X3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmZsb2F0X2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWZsb2F0X2hhc2gsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKWZsb2F0X3N0ciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZmxvYXRfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIGZsb2F0X3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGZsb2F0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGZsb2F0X2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBmbG9hdF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogdm9pZAogX1B5RmxvYXRfSW5pdCh2b2lkKQogewotCS8qIFdlIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgbWFjaGluZSBpcyB1c2luZyBJRUVFCi0JICAgZmxvYXRpbmcgcG9pbnQgZm9ybWF0cyBieSBwZWVyaW5nIGF0IHRoZSBiaXRzIG9mIHNvbWUKLQkgICBjYXJlZnVsbHkgY2hvc2VuIHZhbHVlcy4gIElmIGl0IGxvb2tzIGxpa2Ugd2UgYXJlIG9uIGFuCi0JICAgSUVFRSBwbGF0Zm9ybSwgdGhlIGZsb2F0IHBhY2tpbmcvdW5wYWNraW5nIHJvdXRpbmVzIGNhbgotCSAgIGp1c3QgY29weSBiaXRzLCBpZiBub3QgdGhleSByZXNvcnQgdG8gYXJpdGhtZXRpYyAmIHNoaWZ0cwotCSAgIGFuZCBtYXNrcy4gIFRoZSBzaGlmdHMgJiBtYXNrcyBhcHByb2FjaCB3b3JrcyBvbiBhbGwgZmluaXRlCi0JICAgdmFsdWVzLCBidXQgd2hhdCBoYXBwZW5zIHRvIGluZmluaXRpZXMsIE5hTnMgYW5kIHNpZ25lZAotCSAgIHplcm9lcyBvbiBwYWNraW5nIGlzIGFuIGFjY2lkZW50LCBhbmQgYXR0ZW1wdGluZyB0byB1bnBhY2sKLQkgICBhIE5hTiBvciBhbiBpbmZpbml0eSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAvKiBXZSBhdHRlbXB0IHRvIGRldGVybWluZSBpZiB0aGlzIG1hY2hpbmUgaXMgdXNpbmcgSUVFRQorICAgICAgIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgYnkgcGVlcmluZyBhdCB0aGUgYml0cyBvZiBzb21lCisgICAgICAgY2FyZWZ1bGx5IGNob3NlbiB2YWx1ZXMuICBJZiBpdCBsb29rcyBsaWtlIHdlIGFyZSBvbiBhbgorICAgICAgIElFRUUgcGxhdGZvcm0sIHRoZSBmbG9hdCBwYWNraW5nL3VucGFja2luZyByb3V0aW5lcyBjYW4KKyAgICAgICBqdXN0IGNvcHkgYml0cywgaWYgbm90IHRoZXkgcmVzb3J0IHRvIGFyaXRobWV0aWMgJiBzaGlmdHMKKyAgICAgICBhbmQgbWFza3MuICBUaGUgc2hpZnRzICYgbWFza3MgYXBwcm9hY2ggd29ya3Mgb24gYWxsIGZpbml0ZQorICAgICAgIHZhbHVlcywgYnV0IHdoYXQgaGFwcGVucyB0byBpbmZpbml0aWVzLCBOYU5zIGFuZCBzaWduZWQKKyAgICAgICB6ZXJvZXMgb24gcGFja2luZyBpcyBhbiBhY2NpZGVudCwgYW5kIGF0dGVtcHRpbmcgdG8gdW5wYWNrCisgICAgICAgYSBOYU4gb3IgYW4gaW5maW5pdHkgd2lsbCByYWlzZSBhbiBleGNlcHRpb24uCiAKLQkgICBOb3RlIHRoYXQgaWYgd2UncmUgb24gc29tZSB3aGFja2VkLW91dCBwbGF0Zm9ybSB3aGljaCB1c2VzCi0JICAgSUVFRSBmb3JtYXRzIGJ1dCBpc24ndCBzdHJpY3RseSBsaXR0bGUtZW5kaWFuIG9yIGJpZy0KLQkgICBlbmRpYW4sIHdlIHdpbGwgZmFsbCBiYWNrIHRvIHRoZSBwb3J0YWJsZSBzaGlmdHMgJiBtYXNrcwotCSAgIG1ldGhvZC4gKi8KKyAgICAgICBOb3RlIHRoYXQgaWYgd2UncmUgb24gc29tZSB3aGFja2VkLW91dCBwbGF0Zm9ybSB3aGljaCB1c2VzCisgICAgICAgSUVFRSBmb3JtYXRzIGJ1dCBpc24ndCBzdHJpY3RseSBsaXR0bGUtZW5kaWFuIG9yIGJpZy0KKyAgICAgICBlbmRpYW4sIHdlIHdpbGwgZmFsbCBiYWNrIHRvIHRoZSBwb3J0YWJsZSBzaGlmdHMgJiBtYXNrcworICAgICAgIG1ldGhvZC4gKi8KIAogI2lmIFNJWkVPRl9ET1VCTEUgPT0gOAotCXsKLQkJZG91YmxlIHggPSA5MDA2MTA0MDcxODMyNTgxLjA7Ci0JCWlmIChtZW1jbXAoJngsICJceDQzXHgzZlx4ZmZceDAxXHgwMlx4MDNceDA0XHgwNSIsIDgpID09IDApCi0JCQlkZXRlY3RlZF9kb3VibGVfZm9ybWF0ID0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdDsKLQkJZWxzZSBpZiAobWVtY21wKCZ4LCAiXHgwNVx4MDRceDAzXHgwMlx4MDFceGZmXHgzZlx4NDMiLCA4KSA9PSAwKQotCQkJZGV0ZWN0ZWRfZG91YmxlX2Zvcm1hdCA9IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQ7Ci0JCWVsc2UgCi0JCQlkZXRlY3RlZF9kb3VibGVfZm9ybWF0ID0gdW5rbm93bl9mb3JtYXQ7Ci0JfQorICAgIHsKKyAgICAgICAgZG91YmxlIHggPSA5MDA2MTA0MDcxODMyNTgxLjA7CisgICAgICAgIGlmIChtZW1jbXAoJngsICJceDQzXHgzZlx4ZmZceDAxXHgwMlx4MDNceDA0XHgwNSIsIDgpID09IDApCisgICAgICAgICAgICBkZXRlY3RlZF9kb3VibGVfZm9ybWF0ID0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdDsKKyAgICAgICAgZWxzZSBpZiAobWVtY21wKCZ4LCAiXHgwNVx4MDRceDAzXHgwMlx4MDFceGZmXHgzZlx4NDMiLCA4KSA9PSAwKQorICAgICAgICAgICAgZGV0ZWN0ZWRfZG91YmxlX2Zvcm1hdCA9IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRldGVjdGVkX2RvdWJsZV9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKKyAgICB9CiAjZWxzZQotCWRldGVjdGVkX2RvdWJsZV9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKKyAgICBkZXRlY3RlZF9kb3VibGVfZm9ybWF0ID0gdW5rbm93bl9mb3JtYXQ7CiAjZW5kaWYKIAogI2lmIFNJWkVPRl9GTE9BVCA9PSA0Ci0JewotCQlmbG9hdCB5ID0gMTY3MTE5MzguMDsKLQkJaWYgKG1lbWNtcCgmeSwgIlx4NGJceDdmXHgwMVx4MDIiLCA0KSA9PSAwKQotCQkJZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0ID0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdDsKLQkJZWxzZSBpZiAobWVtY21wKCZ5LCAiXHgwMlx4MDFceDdmXHg0YiIsIDQpID09IDApCi0JCQlkZXRlY3RlZF9mbG9hdF9mb3JtYXQgPSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0OwotCQllbHNlIAotCQkJZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0ID0gdW5rbm93bl9mb3JtYXQ7Ci0JfQorICAgIHsKKyAgICAgICAgZmxvYXQgeSA9IDE2NzExOTM4LjA7CisgICAgICAgIGlmIChtZW1jbXAoJnksICJceDRiXHg3Zlx4MDFceDAyIiwgNCkgPT0gMCkKKyAgICAgICAgICAgIGRldGVjdGVkX2Zsb2F0X2Zvcm1hdCA9IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQ7CisgICAgICAgIGVsc2UgaWYgKG1lbWNtcCgmeSwgIlx4MDJceDAxXHg3Zlx4NGIiLCA0KSA9PSAwKQorICAgICAgICAgICAgZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0ID0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0ID0gdW5rbm93bl9mb3JtYXQ7CisgICAgfQogI2Vsc2UKLQlkZXRlY3RlZF9mbG9hdF9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKKyAgICBkZXRlY3RlZF9mbG9hdF9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKICNlbmRpZgogCi0JZG91YmxlX2Zvcm1hdCA9IGRldGVjdGVkX2RvdWJsZV9mb3JtYXQ7Ci0JZmxvYXRfZm9ybWF0ID0gZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0OworICAgIGRvdWJsZV9mb3JtYXQgPSBkZXRlY3RlZF9kb3VibGVfZm9ybWF0OworICAgIGZsb2F0X2Zvcm1hdCA9IGRldGVjdGVkX2Zsb2F0X2Zvcm1hdDsKIAotCS8qIEluaXQgZmxvYXQgaW5mbyAqLwotCWlmIChGbG9hdEluZm9UeXBlLnRwX25hbWUgPT0gMCkKLQkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmRmxvYXRJbmZvVHlwZSwgJmZsb2F0aW5mb19kZXNjKTsKKyAgICAvKiBJbml0IGZsb2F0IGluZm8gKi8KKyAgICBpZiAoRmxvYXRJbmZvVHlwZS50cF9uYW1lID09IDApCisgICAgICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJkZsb2F0SW5mb1R5cGUsICZmbG9hdGluZm9fZGVzYyk7CiB9CiAKIGludAogUHlGbG9hdF9DbGVhckZyZWVMaXN0KHZvaWQpCiB7Ci0JUHlGbG9hdE9iamVjdCAqcDsKLQlQeUZsb2F0QmxvY2sgKmxpc3QsICpuZXh0OwotCWludCBpOwotCWludCB1OwkJCS8qIHJlbWFpbmluZyB1bmZyZWVkIGludHMgcGVyIGJsb2NrICovCi0JaW50IGZyZWVsaXN0X3NpemUgPSAwOworICAgIFB5RmxvYXRPYmplY3QgKnA7CisgICAgUHlGbG9hdEJsb2NrICpsaXN0LCAqbmV4dDsKKyAgICBpbnQgaTsKKyAgICBpbnQgdTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVtYWluaW5nIHVuZnJlZWQgaW50cyBwZXIgYmxvY2sgKi8KKyAgICBpbnQgZnJlZWxpc3Rfc2l6ZSA9IDA7CiAKLQlsaXN0ID0gYmxvY2tfbGlzdDsKLQlibG9ja19saXN0ID0gTlVMTDsKLQlmcmVlX2xpc3QgPSBOVUxMOwotCXdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLQkJdSA9IDA7Ci0JCWZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKLQkJICAgICBpIDwgTl9GTE9BVE9CSkVDVFM7Ci0JCSAgICAgaSsrLCBwKyspIHsKLQkJCWlmIChQeUZsb2F0X0NoZWNrRXhhY3QocCkgJiYgUHlfUkVGQ05UKHApICE9IDApCi0JCQkJdSsrOwotCQl9Ci0JCW5leHQgPSBsaXN0LT5uZXh0OwotCQlpZiAodSkgewotCQkJbGlzdC0+bmV4dCA9IGJsb2NrX2xpc3Q7Ci0JCQlibG9ja19saXN0ID0gbGlzdDsKLQkJCWZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKLQkJCSAgICAgaSA8IE5fRkxPQVRPQkpFQ1RTOwotCQkJICAgICBpKyssIHArKykgewotCQkJCWlmICghUHlGbG9hdF9DaGVja0V4YWN0KHApIHx8Ci0JCQkJICAgIFB5X1JFRkNOVChwKSA9PSAwKSB7Ci0JCQkJCVB5X1RZUEUocCkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopCi0JCQkJCQlmcmVlX2xpc3Q7Ci0JCQkJCWZyZWVfbGlzdCA9IHA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJUHlNZW1fRlJFRShsaXN0KTsKLQkJfQotCQlmcmVlbGlzdF9zaXplICs9IHU7Ci0JCWxpc3QgPSBuZXh0OwotCX0KLQlyZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKKyAgICBsaXN0ID0gYmxvY2tfbGlzdDsKKyAgICBibG9ja19saXN0ID0gTlVMTDsKKyAgICBmcmVlX2xpc3QgPSBOVUxMOworICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgdSA9IDA7CisgICAgICAgIGZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKKyAgICAgICAgICAgICBpIDwgTl9GTE9BVE9CSkVDVFM7CisgICAgICAgICAgICAgaSsrLCBwKyspIHsKKyAgICAgICAgICAgIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QocCkgJiYgUHlfUkVGQ05UKHApICE9IDApCisgICAgICAgICAgICAgICAgdSsrOworICAgICAgICB9CisgICAgICAgIG5leHQgPSBsaXN0LT5uZXh0OworICAgICAgICBpZiAodSkgeworICAgICAgICAgICAgbGlzdC0+bmV4dCA9IGJsb2NrX2xpc3Q7CisgICAgICAgICAgICBibG9ja19saXN0ID0gbGlzdDsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKKyAgICAgICAgICAgICAgICAgaSA8IE5fRkxPQVRPQkpFQ1RTOworICAgICAgICAgICAgICAgICBpKyssIHArKykgeworICAgICAgICAgICAgICAgIGlmICghUHlGbG9hdF9DaGVja0V4YWN0KHApIHx8CisgICAgICAgICAgICAgICAgICAgIFB5X1JFRkNOVChwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocCkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopCisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2xpc3Q7CisgICAgICAgICAgICAgICAgICAgIGZyZWVfbGlzdCA9IHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlNZW1fRlJFRShsaXN0KTsKKyAgICAgICAgfQorICAgICAgICBmcmVlbGlzdF9zaXplICs9IHU7CisgICAgICAgIGxpc3QgPSBuZXh0OworICAgIH0KKyAgICByZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKIH0KIAogdm9pZAogUHlGbG9hdF9GaW5pKHZvaWQpCiB7Ci0JUHlGbG9hdE9iamVjdCAqcDsKLQlQeUZsb2F0QmxvY2sgKmxpc3Q7Ci0JaW50IGk7Ci0JaW50IHU7CQkJLyogdG90YWwgdW5mcmVlZCBmbG9hdHMgcGVyIGJsb2NrICovCisgICAgUHlGbG9hdE9iamVjdCAqcDsKKyAgICBQeUZsb2F0QmxvY2sgKmxpc3Q7CisgICAgaW50IGk7CisgICAgaW50IHU7ICAgICAgICAgICAgICAgICAgICAgIC8qIHRvdGFsIHVuZnJlZWQgZmxvYXRzIHBlciBibG9jayAqLwogCi0JdSA9IFB5RmxvYXRfQ2xlYXJGcmVlTGlzdCgpOworICAgIHUgPSBQeUZsb2F0X0NsZWFyRnJlZUxpc3QoKTsKIAotCWlmICghUHlfVmVyYm9zZUZsYWcpCi0JCXJldHVybjsKLQlmcHJpbnRmKHN0ZGVyciwgIiMgY2xlYW51cCBmbG9hdHMiKTsKLQlpZiAoIXUpIHsKLQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCX0KLQllbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCQkiOiAlZCB1bmZyZWVkIGZsb2F0JXNcbiIsCi0JCQl1LCB1ID09IDEgPyAiIiA6ICJzIik7Ci0JfQotCWlmIChQeV9WZXJib3NlRmxhZyA+IDEpIHsKLQkJbGlzdCA9IGJsb2NrX2xpc3Q7Ci0JCXdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLQkJCWZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKLQkJCSAgICAgaSA8IE5fRkxPQVRPQkpFQ1RTOwotCQkJICAgICBpKyssIHArKykgewotCQkJCWlmIChQeUZsb2F0X0NoZWNrRXhhY3QocCkgJiYKLQkJCQkgICAgUHlfUkVGQ05UKHApICE9IDApIHsKLQkJCQkJY2hhciAqYnVmID0gUHlPU19kb3VibGVfdG9fc3RyaW5nKAotCQkJCQkJUHlGbG9hdF9BU19ET1VCTEUocCksICdyJywKLQkJCQkJCTAsIDAsIE5VTEwpOwotCQkJCQlpZiAoYnVmKSB7Ci0JCQkJCQkvKiBYWFgodHdvdXRlcnMpIGNhc3QKLQkJCQkJCSAgIHJlZmNvdW50IHRvIGxvbmcKLQkJCQkJCSAgIHVudGlsICV6ZCBpcwotCQkJCQkJICAgdW5pdmVyc2FsbHkKLQkJCQkJCSAgIGF2YWlsYWJsZQotCQkJCQkJKi8KLQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJICAgICAiIyAgIDxmbG9hdCBhdCAlcCwgcmVmY250PSVsZCwgdmFsPSVzPlxuIiwKLQkJCQkJCXAsIChsb25nKVB5X1JFRkNOVChwKSwgYnVmKTsKLQkJCQkJCVB5TWVtX0ZyZWUoYnVmKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWxpc3QgPSBsaXN0LT5uZXh0OwotCQl9Ci0JfQorICAgIGlmICghUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIHJldHVybjsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiMgY2xlYW51cCBmbG9hdHMiKTsKKyAgICBpZiAoIXUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiOiAlZCB1bmZyZWVkIGZsb2F0JXNcbiIsCisgICAgICAgICAgICB1LCB1ID09IDEgPyAiIiA6ICJzIik7CisgICAgfQorICAgIGlmIChQeV9WZXJib3NlRmxhZyA+IDEpIHsKKyAgICAgICAgbGlzdCA9IGJsb2NrX2xpc3Q7CisgICAgICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKKyAgICAgICAgICAgICAgICAgaSA8IE5fRkxPQVRPQkpFQ1RTOworICAgICAgICAgICAgICAgICBpKyssIHArKykgeworICAgICAgICAgICAgICAgIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QocCkgJiYKKyAgICAgICAgICAgICAgICAgICAgUHlfUkVGQ05UKHApICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmID0gUHlPU19kb3VibGVfdG9fc3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgUHlGbG9hdF9BU19ET1VCTEUocCksICdyJywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFgodHdvdXRlcnMpIGNhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvdW50IHRvIGxvbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsICV6ZCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAiIyAgIDxmbG9hdCBhdCAlcCwgcmVmY250PSVsZCwgdmFsPSVzPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsIChsb25nKVB5X1JFRkNOVChwKSwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjI3NSw0MDYgKzIyNzUsNDA2IEBACiBpbnQKIF9QeUZsb2F0X1BhY2s0KGRvdWJsZSB4LCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpCiB7Ci0JaWYgKGZsb2F0X2Zvcm1hdCA9PSB1bmtub3duX2Zvcm1hdCkgewotCQl1bnNpZ25lZCBjaGFyIHNpZ247Ci0JCWludCBlOwotCQlkb3VibGUgZjsKLQkJdW5zaWduZWQgaW50IGZiaXRzOwotCQlpbnQgaW5jciA9IDE7CisgICAgaWYgKGZsb2F0X2Zvcm1hdCA9PSB1bmtub3duX2Zvcm1hdCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHNpZ247CisgICAgICAgIGludCBlOworICAgICAgICBkb3VibGUgZjsKKyAgICAgICAgdW5zaWduZWQgaW50IGZiaXRzOworICAgICAgICBpbnQgaW5jciA9IDE7CiAKLQkJaWYgKGxlKSB7Ci0JCQlwICs9IDM7Ci0JCQlpbmNyID0gLTE7Ci0JCX0KKyAgICAgICAgaWYgKGxlKSB7CisgICAgICAgICAgICBwICs9IDM7CisgICAgICAgICAgICBpbmNyID0gLTE7CisgICAgICAgIH0KIAotCQlpZiAoeCA8IDApIHsKLQkJCXNpZ24gPSAxOwotCQkJeCA9IC14OwotCQl9Ci0JCWVsc2UKLQkJCXNpZ24gPSAwOworICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgIHNpZ24gPSAxOworICAgICAgICAgICAgeCA9IC14OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNpZ24gPSAwOwogCi0JCWYgPSBmcmV4cCh4LCAmZSk7CisgICAgICAgIGYgPSBmcmV4cCh4LCAmZSk7CiAKLQkJLyogTm9ybWFsaXplIGYgdG8gYmUgaW4gdGhlIHJhbmdlIFsxLjAsIDIuMCkgKi8KLQkJaWYgKDAuNSA8PSBmICYmIGYgPCAxLjApIHsKLQkJCWYgKj0gMi4wOwotCQkJZS0tOwotCQl9Ci0JCWVsc2UgaWYgKGYgPT0gMC4wKQotCQkJZSA9IDA7Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkiZnJleHAoKSByZXN1bHQgb3V0IG9mIHJhbmdlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgLyogTm9ybWFsaXplIGYgdG8gYmUgaW4gdGhlIHJhbmdlIFsxLjAsIDIuMCkgKi8KKyAgICAgICAgaWYgKDAuNSA8PSBmICYmIGYgPCAxLjApIHsKKyAgICAgICAgICAgIGYgKj0gMi4wOworICAgICAgICAgICAgZS0tOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGYgPT0gMC4wKQorICAgICAgICAgICAgZSA9IDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmV4cCgpIHJlc3VsdCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCWlmIChlID49IDEyOCkKLQkJCWdvdG8gT3ZlcmZsb3c7Ci0JCWVsc2UgaWYgKGUgPCAtMTI2KSB7Ci0JCQkvKiBHcmFkdWFsIHVuZGVyZmxvdyAqLwotCQkJZiA9IGxkZXhwKGYsIDEyNiArIGUpOwotCQkJZSA9IDA7Ci0JCX0KLQkJZWxzZSBpZiAoIShlID09IDAgJiYgZiA9PSAwLjApKSB7Ci0JCQllICs9IDEyNzsKLQkJCWYgLT0gMS4wOyAvKiBHZXQgcmlkIG9mIGxlYWRpbmcgMSAqLwotCQl9CisgICAgICAgIGlmIChlID49IDEyOCkKKyAgICAgICAgICAgIGdvdG8gT3ZlcmZsb3c7CisgICAgICAgIGVsc2UgaWYgKGUgPCAtMTI2KSB7CisgICAgICAgICAgICAvKiBHcmFkdWFsIHVuZGVyZmxvdyAqLworICAgICAgICAgICAgZiA9IGxkZXhwKGYsIDEyNiArIGUpOworICAgICAgICAgICAgZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIShlID09IDAgJiYgZiA9PSAwLjApKSB7CisgICAgICAgICAgICBlICs9IDEyNzsKKyAgICAgICAgICAgIGYgLT0gMS4wOyAvKiBHZXQgcmlkIG9mIGxlYWRpbmcgMSAqLworICAgICAgICB9CiAKLQkJZiAqPSA4Mzg4NjA4LjA7IC8qIDIqKjIzICovCi0JCWZiaXRzID0gKHVuc2lnbmVkIGludCkoZiArIDAuNSk7IC8qIFJvdW5kICovCi0JCWFzc2VydChmYml0cyA8PSA4Mzg4NjA4KTsKLQkJaWYgKGZiaXRzID4+IDIzKSB7Ci0JCQkvKiBUaGUgY2FycnkgcHJvcGFnYXRlZCBvdXQgb2YgYSBzdHJpbmcgb2YgMjMgMSBiaXRzLiAqLwotCQkJZmJpdHMgPSAwOwotCQkJKytlOwotCQkJaWYgKGUgPj0gMjU1KQotCQkJCWdvdG8gT3ZlcmZsb3c7Ci0JCX0KKyAgICAgICAgZiAqPSA4Mzg4NjA4LjA7IC8qIDIqKjIzICovCisgICAgICAgIGZiaXRzID0gKHVuc2lnbmVkIGludCkoZiArIDAuNSk7IC8qIFJvdW5kICovCisgICAgICAgIGFzc2VydChmYml0cyA8PSA4Mzg4NjA4KTsKKyAgICAgICAgaWYgKGZiaXRzID4+IDIzKSB7CisgICAgICAgICAgICAvKiBUaGUgY2FycnkgcHJvcGFnYXRlZCBvdXQgb2YgYSBzdHJpbmcgb2YgMjMgMSBiaXRzLiAqLworICAgICAgICAgICAgZmJpdHMgPSAwOworICAgICAgICAgICAgKytlOworICAgICAgICAgICAgaWYgKGUgPj0gMjU1KQorICAgICAgICAgICAgICAgIGdvdG8gT3ZlcmZsb3c7CisgICAgICAgIH0KIAotCQkvKiBGaXJzdCBieXRlICovCi0JCSpwID0gKHNpZ24gPDwgNykgfCAoZSA+PiAxKTsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBGaXJzdCBieXRlICovCisgICAgICAgICpwID0gKHNpZ24gPDwgNykgfCAoZSA+PiAxKTsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIFNlY29uZCBieXRlICovCi0JCSpwID0gKGNoYXIpICgoKGUgJiAxKSA8PCA3KSB8IChmYml0cyA+PiAxNikpOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFNlY29uZCBieXRlICovCisgICAgICAgICpwID0gKGNoYXIpICgoKGUgJiAxKSA8PCA3KSB8IChmYml0cyA+PiAxNikpOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogVGhpcmQgYnl0ZSAqLwotCQkqcCA9IChmYml0cyA+PiA4KSAmIDB4RkY7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogVGhpcmQgYnl0ZSAqLworICAgICAgICAqcCA9IChmYml0cyA+PiA4KSAmIDB4RkY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBGb3VydGggYnl0ZSAqLwotCQkqcCA9IGZiaXRzICYgMHhGRjsKKyAgICAgICAgLyogRm91cnRoIGJ5dGUgKi8KKyAgICAgICAgKnAgPSBmYml0cyAmIDB4RkY7CiAKLQkJLyogRG9uZSAqLwotCQlyZXR1cm4gMDsKKyAgICAgICAgLyogRG9uZSAqLworICAgICAgICByZXR1cm4gMDsKIAotCX0KLQllbHNlIHsKLQkJZmxvYXQgeSA9IChmbG9hdCl4OwotCQljb25zdCBjaGFyICpzID0gKGNoYXIqKSZ5OwotCQlpbnQgaSwgaW5jciA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmbG9hdCB5ID0gKGZsb2F0KXg7CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSAoY2hhciopJnk7CisgICAgICAgIGludCBpLCBpbmNyID0gMTsKIAotCQlpZiAoUHlfSVNfSU5GSU5JVFkoeSkgJiYgIVB5X0lTX0lORklOSVRZKHgpKQotCQkJZ290byBPdmVyZmxvdzsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHkpICYmICFQeV9JU19JTkZJTklUWSh4KSkKKyAgICAgICAgICAgIGdvdG8gT3ZlcmZsb3c7CiAKLQkJaWYgKChmbG9hdF9mb3JtYXQgPT0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdCAmJiAhbGUpCi0JCSAgICB8fCAoZmxvYXRfZm9ybWF0ID09IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQgJiYgbGUpKSB7Ci0JCQlwICs9IDM7Ci0JCQlpbmNyID0gLTE7Ci0JCX0KKyAgICAgICAgaWYgKChmbG9hdF9mb3JtYXQgPT0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdCAmJiAhbGUpCisgICAgICAgICAgICB8fCAoZmxvYXRfZm9ybWF0ID09IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQgJiYgbGUpKSB7CisgICAgICAgICAgICBwICs9IDM7CisgICAgICAgICAgICBpbmNyID0gLTE7CisgICAgICAgIH0KIAotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQkqcCA9ICpzKys7Ci0JCQlwICs9IGluY3I7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAqcCA9ICpzKys7CisgICAgICAgICAgICBwICs9IGluY3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICBPdmVyZmxvdzoKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJmbG9hdCB0b28gbGFyZ2UgdG8gcGFjayB3aXRoIGYgZm9ybWF0Iik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAiZmxvYXQgdG9vIGxhcmdlIHRvIHBhY2sgd2l0aCBmIGZvcm1hdCIpOworICAgIHJldHVybiAtMTsKIH0KIAogaW50CiBfUHlGbG9hdF9QYWNrOChkb3VibGUgeCwgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKQogewotCWlmIChkb3VibGVfZm9ybWF0ID09IHVua25vd25fZm9ybWF0KSB7Ci0JCXVuc2lnbmVkIGNoYXIgc2lnbjsKLQkJaW50IGU7Ci0JCWRvdWJsZSBmOwotCQl1bnNpZ25lZCBpbnQgZmhpLCBmbG87Ci0JCWludCBpbmNyID0gMTsKKyAgICBpZiAoZG91YmxlX2Zvcm1hdCA9PSB1bmtub3duX2Zvcm1hdCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHNpZ247CisgICAgICAgIGludCBlOworICAgICAgICBkb3VibGUgZjsKKyAgICAgICAgdW5zaWduZWQgaW50IGZoaSwgZmxvOworICAgICAgICBpbnQgaW5jciA9IDE7CiAKLQkJaWYgKGxlKSB7Ci0JCQlwICs9IDc7Ci0JCQlpbmNyID0gLTE7Ci0JCX0KKyAgICAgICAgaWYgKGxlKSB7CisgICAgICAgICAgICBwICs9IDc7CisgICAgICAgICAgICBpbmNyID0gLTE7CisgICAgICAgIH0KIAotCQlpZiAoeCA8IDApIHsKLQkJCXNpZ24gPSAxOwotCQkJeCA9IC14OwotCQl9Ci0JCWVsc2UKLQkJCXNpZ24gPSAwOworICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgIHNpZ24gPSAxOworICAgICAgICAgICAgeCA9IC14OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNpZ24gPSAwOwogCi0JCWYgPSBmcmV4cCh4LCAmZSk7CisgICAgICAgIGYgPSBmcmV4cCh4LCAmZSk7CiAKLQkJLyogTm9ybWFsaXplIGYgdG8gYmUgaW4gdGhlIHJhbmdlIFsxLjAsIDIuMCkgKi8KLQkJaWYgKDAuNSA8PSBmICYmIGYgPCAxLjApIHsKLQkJCWYgKj0gMi4wOwotCQkJZS0tOwotCQl9Ci0JCWVsc2UgaWYgKGYgPT0gMC4wKQotCQkJZSA9IDA7Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkiZnJleHAoKSByZXN1bHQgb3V0IG9mIHJhbmdlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgLyogTm9ybWFsaXplIGYgdG8gYmUgaW4gdGhlIHJhbmdlIFsxLjAsIDIuMCkgKi8KKyAgICAgICAgaWYgKDAuNSA8PSBmICYmIGYgPCAxLjApIHsKKyAgICAgICAgICAgIGYgKj0gMi4wOworICAgICAgICAgICAgZS0tOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGYgPT0gMC4wKQorICAgICAgICAgICAgZSA9IDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmV4cCgpIHJlc3VsdCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCWlmIChlID49IDEwMjQpCi0JCQlnb3RvIE92ZXJmbG93OwotCQllbHNlIGlmIChlIDwgLTEwMjIpIHsKLQkJCS8qIEdyYWR1YWwgdW5kZXJmbG93ICovCi0JCQlmID0gbGRleHAoZiwgMTAyMiArIGUpOwotCQkJZSA9IDA7Ci0JCX0KLQkJZWxzZSBpZiAoIShlID09IDAgJiYgZiA9PSAwLjApKSB7Ci0JCQllICs9IDEwMjM7Ci0JCQlmIC09IDEuMDsgLyogR2V0IHJpZCBvZiBsZWFkaW5nIDEgKi8KLQkJfQorICAgICAgICBpZiAoZSA+PSAxMDI0KQorICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICAgICAgZWxzZSBpZiAoZSA8IC0xMDIyKSB7CisgICAgICAgICAgICAvKiBHcmFkdWFsIHVuZGVyZmxvdyAqLworICAgICAgICAgICAgZiA9IGxkZXhwKGYsIDEwMjIgKyBlKTsKKyAgICAgICAgICAgIGUgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCEoZSA9PSAwICYmIGYgPT0gMC4wKSkgeworICAgICAgICAgICAgZSArPSAxMDIzOworICAgICAgICAgICAgZiAtPSAxLjA7IC8qIEdldCByaWQgb2YgbGVhZGluZyAxICovCisgICAgICAgIH0KIAotCQkvKiBmaGkgcmVjZWl2ZXMgdGhlIGhpZ2ggMjggYml0czsgZmxvIHRoZSBsb3cgMjQgYml0cyAoPT0gNTIgYml0cykgKi8KLQkJZiAqPSAyNjg0MzU0NTYuMDsgLyogMioqMjggKi8KLQkJZmhpID0gKHVuc2lnbmVkIGludClmOyAvKiBUcnVuY2F0ZSAqLwotCQlhc3NlcnQoZmhpIDwgMjY4NDM1NDU2KTsKKyAgICAgICAgLyogZmhpIHJlY2VpdmVzIHRoZSBoaWdoIDI4IGJpdHM7IGZsbyB0aGUgbG93IDI0IGJpdHMgKD09IDUyIGJpdHMpICovCisgICAgICAgIGYgKj0gMjY4NDM1NDU2LjA7IC8qIDIqKjI4ICovCisgICAgICAgIGZoaSA9ICh1bnNpZ25lZCBpbnQpZjsgLyogVHJ1bmNhdGUgKi8KKyAgICAgICAgYXNzZXJ0KGZoaSA8IDI2ODQzNTQ1Nik7CiAKLQkJZiAtPSAoZG91YmxlKWZoaTsKLQkJZiAqPSAxNjc3NzIxNi4wOyAvKiAyKioyNCAqLwotCQlmbG8gPSAodW5zaWduZWQgaW50KShmICsgMC41KTsgLyogUm91bmQgKi8KLQkJYXNzZXJ0KGZsbyA8PSAxNjc3NzIxNik7Ci0JCWlmIChmbG8gPj4gMjQpIHsKLQkJCS8qIFRoZSBjYXJyeSBwcm9wYWdhdGVkIG91dCBvZiBhIHN0cmluZyBvZiAyNCAxIGJpdHMuICovCi0JCQlmbG8gPSAwOwotCQkJKytmaGk7Ci0JCQlpZiAoZmhpID4+IDI4KSB7Ci0JCQkJLyogQW5kIGl0IGFsc28gcHJvZ2FnYXRlZCBvdXQgb2YgdGhlIG5leHQgMjggYml0cy4gKi8KLQkJCQlmaGkgPSAwOwotCQkJCSsrZTsKLQkJCQlpZiAoZSA+PSAyMDQ3KQotCQkJCQlnb3RvIE92ZXJmbG93OwotCQkJfQotCQl9CisgICAgICAgIGYgLT0gKGRvdWJsZSlmaGk7CisgICAgICAgIGYgKj0gMTY3NzcyMTYuMDsgLyogMioqMjQgKi8KKyAgICAgICAgZmxvID0gKHVuc2lnbmVkIGludCkoZiArIDAuNSk7IC8qIFJvdW5kICovCisgICAgICAgIGFzc2VydChmbG8gPD0gMTY3NzcyMTYpOworICAgICAgICBpZiAoZmxvID4+IDI0KSB7CisgICAgICAgICAgICAvKiBUaGUgY2FycnkgcHJvcGFnYXRlZCBvdXQgb2YgYSBzdHJpbmcgb2YgMjQgMSBiaXRzLiAqLworICAgICAgICAgICAgZmxvID0gMDsKKyAgICAgICAgICAgICsrZmhpOworICAgICAgICAgICAgaWYgKGZoaSA+PiAyOCkgeworICAgICAgICAgICAgICAgIC8qIEFuZCBpdCBhbHNvIHByb2dhZ2F0ZWQgb3V0IG9mIHRoZSBuZXh0IDI4IGJpdHMuICovCisgICAgICAgICAgICAgICAgZmhpID0gMDsKKyAgICAgICAgICAgICAgICArK2U7CisgICAgICAgICAgICAgICAgaWYgKGUgPj0gMjA0NykKKyAgICAgICAgICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8qIEZpcnN0IGJ5dGUgKi8KLQkJKnAgPSAoc2lnbiA8PCA3KSB8IChlID4+IDQpOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIEZpcnN0IGJ5dGUgKi8KKyAgICAgICAgKnAgPSAoc2lnbiA8PCA3KSB8IChlID4+IDQpOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogU2Vjb25kIGJ5dGUgKi8KLQkJKnAgPSAodW5zaWduZWQgY2hhcikgKCgoZSAmIDB4RikgPDwgNCkgfCAoZmhpID4+IDI0KSk7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogU2Vjb25kIGJ5dGUgKi8KKyAgICAgICAgKnAgPSAodW5zaWduZWQgY2hhcikgKCgoZSAmIDB4RikgPDwgNCkgfCAoZmhpID4+IDI0KSk7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBUaGlyZCBieXRlICovCi0JCSpwID0gKGZoaSA+PiAxNikgJiAweEZGOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFRoaXJkIGJ5dGUgKi8KKyAgICAgICAgKnAgPSAoZmhpID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBGb3VydGggYnl0ZSAqLwotCQkqcCA9IChmaGkgPj4gOCkgJiAweEZGOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIEZvdXJ0aCBieXRlICovCisgICAgICAgICpwID0gKGZoaSA+PiA4KSAmIDB4RkY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBGaWZ0aCBieXRlICovCi0JCSpwID0gZmhpICYgMHhGRjsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBGaWZ0aCBieXRlICovCisgICAgICAgICpwID0gZmhpICYgMHhGRjsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIFNpeHRoIGJ5dGUgKi8KLQkJKnAgPSAoZmxvID4+IDE2KSAmIDB4RkY7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogU2l4dGggYnl0ZSAqLworICAgICAgICAqcCA9IChmbG8gPj4gMTYpICYgMHhGRjsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIFNldmVudGggYnl0ZSAqLwotCQkqcCA9IChmbG8gPj4gOCkgJiAweEZGOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFNldmVudGggYnl0ZSAqLworICAgICAgICAqcCA9IChmbG8gPj4gOCkgJiAweEZGOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogRWlnaHRoIGJ5dGUgKi8KLQkJKnAgPSBmbG8gJiAweEZGOwotCQkvKiBwICs9IGluY3I7IFVubmVlZGVkIChmb3Igbm93KSAqLworICAgICAgICAvKiBFaWdodGggYnl0ZSAqLworICAgICAgICAqcCA9IGZsbyAmIDB4RkY7CisgICAgICAgIC8qIHAgKz0gaW5jcjsgVW5uZWVkZWQgKGZvciBub3cpICovCiAKLQkJLyogRG9uZSAqLwotCQlyZXR1cm4gMDsKKyAgICAgICAgLyogRG9uZSAqLworICAgICAgICByZXR1cm4gMDsKIAotCSAgT3ZlcmZsb3c6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJmbG9hdCB0b28gbGFyZ2UgdG8gcGFjayB3aXRoIGQgZm9ybWF0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnN0IGNoYXIgKnMgPSAoY2hhciopJng7Ci0JCWludCBpLCBpbmNyID0gMTsKKyAgICAgIE92ZXJmbG93OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCB0b28gbGFyZ2UgdG8gcGFjayB3aXRoIGQgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSAoY2hhciopJng7CisgICAgICAgIGludCBpLCBpbmNyID0gMTsKIAotCQlpZiAoKGRvdWJsZV9mb3JtYXQgPT0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdCAmJiAhbGUpCi0JCSAgICB8fCAoZG91YmxlX2Zvcm1hdCA9PSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0ICYmIGxlKSkgewotCQkJcCArPSA3OwotCQkJaW5jciA9IC0xOwotCQl9Ci0JCQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQkqcCA9ICpzKys7Ci0JCQlwICs9IGluY3I7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoKGRvdWJsZV9mb3JtYXQgPT0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdCAmJiAhbGUpCisgICAgICAgICAgICB8fCAoZG91YmxlX2Zvcm1hdCA9PSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0ICYmIGxlKSkgeworICAgICAgICAgICAgcCArPSA3OworICAgICAgICAgICAgaW5jciA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgKnAgPSAqcysrOworICAgICAgICAgICAgcCArPSBpbmNyOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogZG91YmxlCiBfUHlGbG9hdF9VbnBhY2s0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSkKIHsKLQlpZiAoZmxvYXRfZm9ybWF0ID09IHVua25vd25fZm9ybWF0KSB7Ci0JCXVuc2lnbmVkIGNoYXIgc2lnbjsKLQkJaW50IGU7Ci0JCXVuc2lnbmVkIGludCBmOwotCQlkb3VibGUgeDsKLQkJaW50IGluY3IgPSAxOworICAgIGlmIChmbG9hdF9mb3JtYXQgPT0gdW5rbm93bl9mb3JtYXQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzaWduOworICAgICAgICBpbnQgZTsKKyAgICAgICAgdW5zaWduZWQgaW50IGY7CisgICAgICAgIGRvdWJsZSB4OworICAgICAgICBpbnQgaW5jciA9IDE7CiAKLQkJaWYgKGxlKSB7Ci0JCQlwICs9IDM7Ci0JCQlpbmNyID0gLTE7Ci0JCX0KKyAgICAgICAgaWYgKGxlKSB7CisgICAgICAgICAgICBwICs9IDM7CisgICAgICAgICAgICBpbmNyID0gLTE7CisgICAgICAgIH0KIAotCQkvKiBGaXJzdCBieXRlICovCi0JCXNpZ24gPSAoKnAgPj4gNykgJiAxOwotCQllID0gKCpwICYgMHg3RikgPDwgMTsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBGaXJzdCBieXRlICovCisgICAgICAgIHNpZ24gPSAoKnAgPj4gNykgJiAxOworICAgICAgICBlID0gKCpwICYgMHg3RikgPDwgMTsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIFNlY29uZCBieXRlICovCi0JCWUgfD0gKCpwID4+IDcpICYgMTsKLQkJZiA9ICgqcCAmIDB4N0YpIDw8IDE2OwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFNlY29uZCBieXRlICovCisgICAgICAgIGUgfD0gKCpwID4+IDcpICYgMTsKKyAgICAgICAgZiA9ICgqcCAmIDB4N0YpIDw8IDE2OworICAgICAgICBwICs9IGluY3I7CiAKLQkJaWYgKGUgPT0gMjU1KSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY2FuJ3QgdW5wYWNrIElFRUUgNzU0IHNwZWNpYWwgdmFsdWUgIgotCQkJCSJvbiBub24tSUVFRSBwbGF0Zm9ybSIpOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIGlmIChlID09IDI1NSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImNhbid0IHVucGFjayBJRUVFIDc1NCBzcGVjaWFsIHZhbHVlICIKKyAgICAgICAgICAgICAgICAib24gbm9uLUlFRUUgcGxhdGZvcm0iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCS8qIFRoaXJkIGJ5dGUgKi8KLQkJZiB8PSAqcCA8PCA4OwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFRoaXJkIGJ5dGUgKi8KKyAgICAgICAgZiB8PSAqcCA8PCA4OworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogRm91cnRoIGJ5dGUgKi8KLQkJZiB8PSAqcDsKKyAgICAgICAgLyogRm91cnRoIGJ5dGUgKi8KKyAgICAgICAgZiB8PSAqcDsKIAotCQl4ID0gKGRvdWJsZSlmIC8gODM4ODYwOC4wOworICAgICAgICB4ID0gKGRvdWJsZSlmIC8gODM4ODYwOC4wOwogCi0JCS8qIFhYWCBUaGlzIHNhZGx5IGlnbm9yZXMgSW5mL05hTiBpc3N1ZXMgKi8KLQkJaWYgKGUgPT0gMCkKLQkJCWUgPSAtMTI2OwotCQllbHNlIHsKLQkJCXggKz0gMS4wOwotCQkJZSAtPSAxMjc7Ci0JCX0KLQkJeCA9IGxkZXhwKHgsIGUpOworICAgICAgICAvKiBYWFggVGhpcyBzYWRseSBpZ25vcmVzIEluZi9OYU4gaXNzdWVzICovCisgICAgICAgIGlmIChlID09IDApCisgICAgICAgICAgICBlID0gLTEyNjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB4ICs9IDEuMDsKKyAgICAgICAgICAgIGUgLT0gMTI3OworICAgICAgICB9CisgICAgICAgIHggPSBsZGV4cCh4LCBlKTsKIAotCQlpZiAoc2lnbikKLQkJCXggPSAteDsKKyAgICAgICAgaWYgKHNpZ24pCisgICAgICAgICAgICB4ID0gLXg7CiAKLQkJcmV0dXJuIHg7Ci0JfQotCWVsc2UgewotCQlmbG9hdCB4OworICAgICAgICByZXR1cm4geDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZsb2F0IHg7CiAKLQkJaWYgKChmbG9hdF9mb3JtYXQgPT0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdCAmJiAhbGUpCi0JCSAgICB8fCAoZmxvYXRfZm9ybWF0ID09IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQgJiYgbGUpKSB7Ci0JCQljaGFyIGJ1Zls0XTsKLQkJCWNoYXIgKmQgPSAmYnVmWzNdOwotCQkJaW50IGk7CisgICAgICAgIGlmICgoZmxvYXRfZm9ybWF0ID09IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQgJiYgIWxlKQorICAgICAgICAgICAgfHwgKGZsb2F0X2Zvcm1hdCA9PSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0ICYmIGxlKSkgeworICAgICAgICAgICAgY2hhciBidWZbNF07CisgICAgICAgICAgICBjaGFyICpkID0gJmJ1ZlszXTsKKyAgICAgICAgICAgIGludCBpOwogCi0JCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQkJKmQtLSA9ICpwKys7Ci0JCQl9Ci0JCQltZW1jcHkoJngsIGJ1ZiwgNCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltZW1jcHkoJngsIHAsIDQpOwotCQl9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgKmQtLSA9ICpwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoJngsIGJ1ZiwgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkoJngsIHAsIDQpOworICAgICAgICB9CiAKLQkJcmV0dXJuIHg7Ci0JfQkJCisgICAgICAgIHJldHVybiB4OworICAgIH0KIH0KIAogZG91YmxlCiBfUHlGbG9hdF9VbnBhY2s4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSkKIHsKLQlpZiAoZG91YmxlX2Zvcm1hdCA9PSB1bmtub3duX2Zvcm1hdCkgewotCQl1bnNpZ25lZCBjaGFyIHNpZ247Ci0JCWludCBlOwotCQl1bnNpZ25lZCBpbnQgZmhpLCBmbG87Ci0JCWRvdWJsZSB4OwotCQlpbnQgaW5jciA9IDE7CisgICAgaWYgKGRvdWJsZV9mb3JtYXQgPT0gdW5rbm93bl9mb3JtYXQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzaWduOworICAgICAgICBpbnQgZTsKKyAgICAgICAgdW5zaWduZWQgaW50IGZoaSwgZmxvOworICAgICAgICBkb3VibGUgeDsKKyAgICAgICAgaW50IGluY3IgPSAxOwogCi0JCWlmIChsZSkgewotCQkJcCArPSA3OwotCQkJaW5jciA9IC0xOwotCQl9CisgICAgICAgIGlmIChsZSkgeworICAgICAgICAgICAgcCArPSA3OworICAgICAgICAgICAgaW5jciA9IC0xOworICAgICAgICB9CiAKLQkJLyogRmlyc3QgYnl0ZSAqLwotCQlzaWduID0gKCpwID4+IDcpICYgMTsKLQkJZSA9ICgqcCAmIDB4N0YpIDw8IDQ7Ci0JCQotCQlwICs9IGluY3I7CisgICAgICAgIC8qIEZpcnN0IGJ5dGUgKi8KKyAgICAgICAgc2lnbiA9ICgqcCA+PiA3KSAmIDE7CisgICAgICAgIGUgPSAoKnAgJiAweDdGKSA8PCA0OwogCi0JCS8qIFNlY29uZCBieXRlICovCi0JCWUgfD0gKCpwID4+IDQpICYgMHhGOwotCQlmaGkgPSAoKnAgJiAweEYpIDw8IDI0OwotCQlwICs9IGluY3I7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQlpZiAoZSA9PSAyMDQ3KSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY2FuJ3QgdW5wYWNrIElFRUUgNzU0IHNwZWNpYWwgdmFsdWUgIgotCQkJCSJvbiBub24tSUVFRSBwbGF0Zm9ybSIpOwotCQkJcmV0dXJuIC0xLjA7Ci0JCX0KKyAgICAgICAgLyogU2Vjb25kIGJ5dGUgKi8KKyAgICAgICAgZSB8PSAoKnAgPj4gNCkgJiAweEY7CisgICAgICAgIGZoaSA9ICgqcCAmIDB4RikgPDwgMjQ7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBUaGlyZCBieXRlICovCi0JCWZoaSB8PSAqcCA8PCAxNjsKLQkJcCArPSBpbmNyOworICAgICAgICBpZiAoZSA9PSAyMDQ3KSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiY2FuJ3QgdW5wYWNrIElFRUUgNzU0IHNwZWNpYWwgdmFsdWUgIgorICAgICAgICAgICAgICAgICJvbiBub24tSUVFRSBwbGF0Zm9ybSIpOworICAgICAgICAgICAgcmV0dXJuIC0xLjA7CisgICAgICAgIH0KIAotCQkvKiBGb3VydGggYnl0ZSAqLwotCQlmaGkgfD0gKnAgIDw8IDg7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogVGhpcmQgYnl0ZSAqLworICAgICAgICBmaGkgfD0gKnAgPDwgMTY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBGaWZ0aCBieXRlICovCi0JCWZoaSB8PSAqcDsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBGb3VydGggYnl0ZSAqLworICAgICAgICBmaGkgfD0gKnAgIDw8IDg7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBTaXh0aCBieXRlICovCi0JCWZsbyA9ICpwIDw8IDE2OwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIEZpZnRoIGJ5dGUgKi8KKyAgICAgICAgZmhpIHw9ICpwOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogU2V2ZW50aCBieXRlICovCi0JCWZsbyB8PSAqcCA8PCA4OwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFNpeHRoIGJ5dGUgKi8KKyAgICAgICAgZmxvID0gKnAgPDwgMTY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBFaWdodGggYnl0ZSAqLwotCQlmbG8gfD0gKnA7CisgICAgICAgIC8qIFNldmVudGggYnl0ZSAqLworICAgICAgICBmbG8gfD0gKnAgPDwgODsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCXggPSAoZG91YmxlKWZoaSArIChkb3VibGUpZmxvIC8gMTY3NzcyMTYuMDsgLyogMioqMjQgKi8KLQkJeCAvPSAyNjg0MzU0NTYuMDsgLyogMioqMjggKi8KKyAgICAgICAgLyogRWlnaHRoIGJ5dGUgKi8KKyAgICAgICAgZmxvIHw9ICpwOwogCi0JCWlmIChlID09IDApCi0JCQllID0gLTEwMjI7Ci0JCWVsc2UgewotCQkJeCArPSAxLjA7Ci0JCQllIC09IDEwMjM7Ci0JCX0KLQkJeCA9IGxkZXhwKHgsIGUpOworICAgICAgICB4ID0gKGRvdWJsZSlmaGkgKyAoZG91YmxlKWZsbyAvIDE2Nzc3MjE2LjA7IC8qIDIqKjI0ICovCisgICAgICAgIHggLz0gMjY4NDM1NDU2LjA7IC8qIDIqKjI4ICovCiAKLQkJaWYgKHNpZ24pCi0JCQl4ID0gLXg7CisgICAgICAgIGlmIChlID09IDApCisgICAgICAgICAgICBlID0gLTEwMjI7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgeCArPSAxLjA7CisgICAgICAgICAgICBlIC09IDEwMjM7CisgICAgICAgIH0KKyAgICAgICAgeCA9IGxkZXhwKHgsIGUpOwogCi0JCXJldHVybiB4OwotCX0KLQllbHNlIHsKLQkJZG91YmxlIHg7CisgICAgICAgIGlmIChzaWduKQorICAgICAgICAgICAgeCA9IC14OwogCi0JCWlmICgoZG91YmxlX2Zvcm1hdCA9PSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0ICYmICFsZSkKLQkJICAgIHx8IChkb3VibGVfZm9ybWF0ID09IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQgJiYgbGUpKSB7Ci0JCQljaGFyIGJ1Zls4XTsKLQkJCWNoYXIgKmQgPSAmYnVmWzddOwotCQkJaW50IGk7Ci0JCQkKLQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCQkqZC0tID0gKnArKzsKLQkJCX0KLQkJCW1lbWNweSgmeCwgYnVmLCA4KTsKLQkJfQotCQllbHNlIHsKLQkJCW1lbWNweSgmeCwgcCwgOCk7Ci0JCX0KKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkb3VibGUgeDsKIAotCQlyZXR1cm4geDsKLQl9CisgICAgICAgIGlmICgoZG91YmxlX2Zvcm1hdCA9PSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0ICYmICFsZSkKKyAgICAgICAgICAgIHx8IChkb3VibGVfZm9ybWF0ID09IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQgJiYgbGUpKSB7CisgICAgICAgICAgICBjaGFyIGJ1Zls4XTsKKyAgICAgICAgICAgIGNoYXIgKmQgPSAmYnVmWzddOworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgICAgICAqZC0tID0gKnArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweSgmeCwgYnVmLCA4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweSgmeCwgcCwgOCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2ZyYW1lb2JqZWN0LmMgYi9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKaW5kZXggMjEzOTZmZi4uYTM0NzZjZiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mcmFtZW9iamVjdC5jCisrKyBiL09iamVjdHMvZnJhbWVvYmplY3QuYwpAQCAtMTUsMzUgKzE1LDM1IEBACiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeUZyYW1lT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZnJhbWVfbWVtYmVybGlzdFtdID0gewotCXsiZl9iYWNrIiwJVF9PQkpFQ1QsCU9GRihmX2JhY2spLAlST30sCi0JeyJmX2NvZGUiLAlUX09CSkVDVCwJT0ZGKGZfY29kZSksCVJPfSwKLQl7ImZfYnVpbHRpbnMiLAlUX09CSkVDVCwJT0ZGKGZfYnVpbHRpbnMpLFJPfSwKLQl7ImZfZ2xvYmFscyIsCVRfT0JKRUNULAlPRkYoZl9nbG9iYWxzKSwJUk99LAotCXsiZl9sYXN0aSIsCVRfSU5ULAkJT0ZGKGZfbGFzdGkpLAlST30sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJmX2JhY2siLCAgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfYmFjayksICAgIFJPfSwKKyAgICB7ImZfY29kZSIsICAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoZl9jb2RlKSwgICAgUk99LAorICAgIHsiZl9idWlsdGlucyIsICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihmX2J1aWx0aW5zKSxST30sCisgICAgeyJmX2dsb2JhbHMiLCAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfZ2xvYmFscyksIFJPfSwKKyAgICB7ImZfbGFzdGkiLCAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoZl9sYXN0aSksICAgUk99LAorICAgIHtOVUxMfSAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAjZGVmaW5lIFdBUk5fR0VUX1NFVChOQU1FKSBcCiBzdGF0aWMgUHlPYmplY3QgKiBmcmFtZV9nZXRfICMjIE5BTUUoUHlGcmFtZU9iamVjdCAqZikgeyBcCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCNOQU1FICIgaGFzIGJlZW4gcmVtb3ZlZCBpbiAzLngiLCAyKSA8IDApIFwKLQkJcmV0dXJuIE5VTEw7IFwKLQlpZiAoZi0+TkFNRSkgeyBcCi0JCVB5X0lOQ1JFRihmLT5OQU1FKTsgXAotCQlyZXR1cm4gZi0+TkFNRTsgXAotCX0gXAotICAgICAgICBQeV9SRVRVUk5fTk9ORTsJXAorICAgIGlmIChQeUVycl9XYXJuUHkzaygjTkFNRSAiIGhhcyBiZWVuIHJlbW92ZWQgaW4gMy54IiwgMikgPCAwKSBcCisgICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgaWYgKGYtPk5BTUUpIHsgXAorICAgICAgICBQeV9JTkNSRUYoZi0+TkFNRSk7IFwKKyAgICAgICAgcmV0dXJuIGYtPk5BTUU7IFwKKyAgICB9IFwKKyAgICBQeV9SRVRVUk5fTk9ORTsgICAgIFwKIH0gXAogc3RhdGljIGludCBmcmFtZV9zZXRfICMjIE5BTUUoUHlGcmFtZU9iamVjdCAqZiwgUHlPYmplY3QgKm5ldykgeyBcCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCNOQU1FICIgaGFzIGJlZW4gcmVtb3ZlZCBpbiAzLngiLCAyKSA8IDApIFwKLQkJcmV0dXJuIC0xOyBcCi0JaWYgKGYtPk5BTUUpIHsgXAotCQlQeV9DTEVBUihmLT5OQU1FKTsgXAotCX0gXAotICAgICAgICBpZiAobmV3ID09IFB5X05vbmUpIFwKLSAgICAgICAgICAgIG5ldyA9IE5VTEw7IFwKLQlQeV9YSU5DUkVGKG5ldyk7IFwKLQlmLT5OQU1FID0gbmV3OyBcCi0JcmV0dXJuIDA7IFwKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soI05BTUUgIiBoYXMgYmVlbiByZW1vdmVkIGluIDMueCIsIDIpIDwgMCkgXAorICAgICAgICByZXR1cm4gLTE7IFwKKyAgICBpZiAoZi0+TkFNRSkgeyBcCisgICAgICAgIFB5X0NMRUFSKGYtPk5BTUUpOyBcCisgICAgfSBcCisgICAgaWYgKG5ldyA9PSBQeV9Ob25lKSBcCisgICAgICAgIG5ldyA9IE5VTEw7IFwKKyAgICBQeV9YSU5DUkVGKG5ldyk7IFwKKyAgICBmLT5OQU1FID0gbmV3OyBcCisgICAgcmV0dXJuIDA7IFwKIH0KIAogCkBAIC01NSwyOCArNTUsMjggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmcmFtZV9nZXRsb2NhbHMoUHlGcmFtZU9iamVjdCAqZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlQeUZyYW1lX0Zhc3RUb0xvY2FscyhmKTsKLQlQeV9JTkNSRUYoZi0+Zl9sb2NhbHMpOwotCXJldHVybiBmLT5mX2xvY2FsczsKKyAgICBQeUZyYW1lX0Zhc3RUb0xvY2FscyhmKTsKKyAgICBQeV9JTkNSRUYoZi0+Zl9sb2NhbHMpOworICAgIHJldHVybiBmLT5mX2xvY2FsczsKIH0KIAogaW50CiBQeUZyYW1lX0dldExpbmVOdW1iZXIoUHlGcmFtZU9iamVjdCAqZikKIHsKLQlpZiAoZi0+Zl90cmFjZSkKLQkJcmV0dXJuIGYtPmZfbGluZW5vOwotCWVsc2UKLQkJcmV0dXJuIFB5Q29kZV9BZGRyMkxpbmUoZi0+Zl9jb2RlLCBmLT5mX2xhc3RpKTsKKyAgICBpZiAoZi0+Zl90cmFjZSkKKyAgICAgICAgcmV0dXJuIGYtPmZfbGluZW5vOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5Q29kZV9BZGRyMkxpbmUoZi0+Zl9jb2RlLCBmLT5mX2xhc3RpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZyYW1lX2dldGxpbmVubyhQeUZyYW1lT2JqZWN0ICpmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeUZyYW1lX0dldExpbmVOdW1iZXIoZikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhQeUZyYW1lX0dldExpbmVOdW1iZXIoZikpOwogfQogCiAvKiBTZXR0ZXIgZm9yIGZfbGluZW5vIC0geW91IGNhbiBzZXQgZl9saW5lbm8gZnJvbSB3aXRoaW4gYSB0cmFjZSBmdW5jdGlvbiBpbgotICogb3JkZXIgdG8ganVtcCB0byBhIGdpdmVuIGxpbmUgb2YgY29kZSwgc3ViamVjdCB0byBzb21lIHJlc3RyaWN0aW9ucy4JIE1vc3QKKyAqIG9yZGVyIHRvIGp1bXAgdG8gYSBnaXZlbiBsaW5lIG9mIGNvZGUsIHN1YmplY3QgdG8gc29tZSByZXN0cmljdGlvbnMuICBNb3N0CiAgKiBsaW5lcyBhcmUgT0sgdG8ganVtcCB0byBiZWNhdXNlIHRoZXkgZG9uJ3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlCiAgKiBzdGF0ZSBvZiB0aGUgc3RhY2sgKG9idmlvdXMgYmVjYXVzZSB5b3UgY291bGQgcmVtb3ZlIHRoZSBsaW5lIGFuZCB0aGUgY29kZQogICogd291bGQgc3RpbGwgd29yayB3aXRob3V0IGFueSBzdGFjayBlcnJvcnMpLCBidXQgdGhlcmUgYXJlIHNvbWUgY29uc3RydWN0cwpAQCAtOTMsMzA3ICs5MywzMDcgQEAKIHN0YXRpYyBpbnQKIGZyYW1lX3NldGxpbmVubyhQeUZyYW1lT2JqZWN0ICpmLCBQeU9iamVjdCogcF9uZXdfbGluZW5vKQogewotCWludCBuZXdfbGluZW5vID0gMDsJCS8qIFRoZSBuZXcgdmFsdWUgb2YgZl9saW5lbm8gKi8KLQlpbnQgbmV3X2xhc3RpID0gMDsJCS8qIFRoZSBuZXcgdmFsdWUgb2YgZl9sYXN0aSAqLwotCWludCBuZXdfaWJsb2NrID0gMDsJCS8qIFRoZSBuZXcgdmFsdWUgb2YgZl9pYmxvY2sgKi8KLQl1bnNpZ25lZCBjaGFyICpjb2RlID0gTlVMTDsJLyogVGhlIGJ5dGVjb2RlIGZvciB0aGUgZnJhbWUuLi4gKi8KLQlQeV9zc2l6ZV90IGNvZGVfbGVuID0gMDsJLyogLi4uYW5kIGl0cyBsZW5ndGggKi8KLQl1bnNpZ25lZCBjaGFyICpsbm90YWIgPSBOVUxMOwkvKiBJdGVyYXRpbmcgb3ZlciBjb19sbm90YWIgKi8KLQlQeV9zc2l6ZV90IGxub3RhYl9sZW4gPSAwOwkvKiAoZGl0dG8pICovCi0JaW50IG9mZnNldCA9IDA7CQkJLyogKGRpdHRvKSAqLwotCWludCBsaW5lID0gMDsJCQkvKiAoZGl0dG8pICovCi0JaW50IGFkZHIgPSAwOwkJCS8qIChkaXR0bykgKi8KLQlpbnQgbWluX2FkZHIgPSAwOwkJLyogU2Nhbm5pbmcgdGhlIFNFVFVQcyBhbmQgUE9QcyAqLwotCWludCBtYXhfYWRkciA9IDA7CQkvKiAoZGl0dG8pICovCi0JaW50IGRlbHRhX2libG9jayA9IDA7CQkvKiAoZGl0dG8pICovCi0JaW50IG1pbl9kZWx0YV9pYmxvY2sgPSAwOwkvKiAoZGl0dG8pICovCi0JaW50IG1pbl9pYmxvY2sgPSAwOwkJLyogKGRpdHRvKSAqLwotCWludCBmX2xhc3RpX3NldHVwX2FkZHIgPSAwOwkvKiBQb2xpY2luZyBuby1qdW1wLWludG8tZmluYWxseSAqLwotCWludCBuZXdfbGFzdGlfc2V0dXBfYWRkciA9IDA7CS8qIChkaXR0bykgKi8KLQlpbnQgYmxvY2tzdGFja1tDT19NQVhCTE9DS1NdOwkvKiBXYWxraW5nIHRoZSAnZmluYWxseScgYmxvY2tzICovCi0JaW50IGluX2ZpbmFsbHlbQ09fTUFYQkxPQ0tTXTsJLyogKGRpdHRvKSAqLwotCWludCBibG9ja3N0YWNrX3RvcCA9IDA7CQkvKiAoZGl0dG8pICovCi0JdW5zaWduZWQgY2hhciBzZXR1cF9vcCA9IDA7CS8qIChkaXR0bykgKi8KKyAgICBpbnQgbmV3X2xpbmVubyA9IDA7ICAgICAgICAgICAgICAgICAvKiBUaGUgbmV3IHZhbHVlIG9mIGZfbGluZW5vICovCisgICAgaW50IG5ld19sYXN0aSA9IDA7ICAgICAgICAgICAgICAgICAgLyogVGhlIG5ldyB2YWx1ZSBvZiBmX2xhc3RpICovCisgICAgaW50IG5ld19pYmxvY2sgPSAwOyAgICAgICAgICAgICAgICAgLyogVGhlIG5ldyB2YWx1ZSBvZiBmX2libG9jayAqLworICAgIHVuc2lnbmVkIGNoYXIgKmNvZGUgPSBOVUxMOyAgICAgICAgIC8qIFRoZSBieXRlY29kZSBmb3IgdGhlIGZyYW1lLi4uICovCisgICAgUHlfc3NpemVfdCBjb2RlX2xlbiA9IDA7ICAgICAgICAgICAgLyogLi4uYW5kIGl0cyBsZW5ndGggKi8KKyAgICB1bnNpZ25lZCBjaGFyICpsbm90YWIgPSBOVUxMOyAgICAgICAvKiBJdGVyYXRpbmcgb3ZlciBjb19sbm90YWIgKi8KKyAgICBQeV9zc2l6ZV90IGxub3RhYl9sZW4gPSAwOyAgICAgICAgICAvKiAoZGl0dG8pICovCisgICAgaW50IG9mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogKGRpdHRvKSAqLworICAgIGludCBsaW5lID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBpbnQgYWRkciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiAoZGl0dG8pICovCisgICAgaW50IG1pbl9hZGRyID0gMDsgICAgICAgICAgICAgICAgICAgLyogU2Nhbm5pbmcgdGhlIFNFVFVQcyBhbmQgUE9QcyAqLworICAgIGludCBtYXhfYWRkciA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBpbnQgZGVsdGFfaWJsb2NrID0gMDsgICAgICAgICAgICAgICAvKiAoZGl0dG8pICovCisgICAgaW50IG1pbl9kZWx0YV9pYmxvY2sgPSAwOyAgICAgICAgICAgLyogKGRpdHRvKSAqLworICAgIGludCBtaW5faWJsb2NrID0gMDsgICAgICAgICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBpbnQgZl9sYXN0aV9zZXR1cF9hZGRyID0gMDsgICAgICAgICAvKiBQb2xpY2luZyBuby1qdW1wLWludG8tZmluYWxseSAqLworICAgIGludCBuZXdfbGFzdGlfc2V0dXBfYWRkciA9IDA7ICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBpbnQgYmxvY2tzdGFja1tDT19NQVhCTE9DS1NdOyAgICAgICAvKiBXYWxraW5nIHRoZSAnZmluYWxseScgYmxvY2tzICovCisgICAgaW50IGluX2ZpbmFsbHlbQ09fTUFYQkxPQ0tTXTsgICAgICAgLyogKGRpdHRvKSAqLworICAgIGludCBibG9ja3N0YWNrX3RvcCA9IDA7ICAgICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNldHVwX29wID0gMDsgICAgICAgICAvKiAoZGl0dG8pICovCiAKLQkvKiBmX2xpbmVubyBtdXN0IGJlIGFuIGludGVnZXIuICovCi0JaWYgKCFQeUludF9DaGVjayhwX25ld19saW5lbm8pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJsaW5lbm8gbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogZl9saW5lbm8gbXVzdCBiZSBhbiBpbnRlZ2VyLiAqLworICAgIGlmICghUHlJbnRfQ2hlY2socF9uZXdfbGluZW5vKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lbm8gbXVzdCBiZSBhbiBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBZb3UgY2FuIG9ubHkgZG8gdGhpcyBmcm9tIHdpdGhpbiBhIHRyYWNlIGZ1bmN0aW9uLCBub3QgdmlhCi0JICogX2dldGZyYW1lIG9yIHNpbWlsYXIgaGFja2VyeS4gKi8KLQlpZiAoIWYtPmZfdHJhY2UpCi0JewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgImZfbGluZW5vIGNhbiBvbmx5IGJlIHNldCBieSBhIgotCQkJICAgICAiIGxpbmUgdHJhY2UgZnVuY3Rpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBZb3UgY2FuIG9ubHkgZG8gdGhpcyBmcm9tIHdpdGhpbiBhIHRyYWNlIGZ1bmN0aW9uLCBub3QgdmlhCisgICAgICogX2dldGZyYW1lIG9yIHNpbWlsYXIgaGFja2VyeS4gKi8KKyAgICBpZiAoIWYtPmZfdHJhY2UpCisgICAgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJmX2xpbmVubyBjYW4gb25seSBiZSBzZXQgYnkgYSIKKyAgICAgICAgICAgICAgICAgICAgICIgbGluZSB0cmFjZSBmdW5jdGlvbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogRmFpbCBpZiB0aGUgbGluZSBjb21lcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBjb2RlIGJsb2NrLiAqLwotCW5ld19saW5lbm8gPSAoaW50KSBQeUludF9Bc0xvbmcocF9uZXdfbGluZW5vKTsKLQlpZiAobmV3X2xpbmVubyA8IGYtPmZfY29kZS0+Y29fZmlyc3RsaW5lbm8pIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJsaW5lICVkIGNvbWVzIGJlZm9yZSB0aGUgY3VycmVudCBjb2RlIGJsb2NrIiwKLQkJCSAgICAgbmV3X2xpbmVubyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZSBpZiAobmV3X2xpbmVubyA9PSBmLT5mX2NvZGUtPmNvX2ZpcnN0bGluZW5vKSB7Ci0JCW5ld19sYXN0aSA9IDA7Ci0JCW5ld19saW5lbm8gPSBmLT5mX2NvZGUtPmNvX2ZpcnN0bGluZW5vOwotCX0KLQllbHNlIHsKLQkJLyogRmluZCB0aGUgYnl0ZWNvZGUgb2Zmc2V0IGZvciB0aGUgc3RhcnQgb2YgdGhlIGdpdmVuCi0JCSAqIGxpbmUsIG9yIHRoZSBmaXJzdCBjb2RlLW93bmluZyBsaW5lIGFmdGVyIGl0LiAqLwotCQljaGFyICp0bXA7Ci0JCVB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShmLT5mX2NvZGUtPmNvX2xub3RhYiwKLQkJCQkJICZ0bXAsICZsbm90YWJfbGVuKTsKLQkJbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikgdG1wOwotCQlhZGRyID0gMDsKLQkJbGluZSA9IGYtPmZfY29kZS0+Y29fZmlyc3RsaW5lbm87Ci0JCW5ld19sYXN0aSA9IC0xOwotCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGxub3RhYl9sZW47IG9mZnNldCArPSAyKSB7Ci0JCQlhZGRyICs9IGxub3RhYltvZmZzZXRdOwotCQkJbGluZSArPSBsbm90YWJbb2Zmc2V0KzFdOwotCQkJaWYgKGxpbmUgPj0gbmV3X2xpbmVubykgewotCQkJCW5ld19sYXN0aSA9IGFkZHI7Ci0JCQkJbmV3X2xpbmVubyA9IGxpbmU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogRmFpbCBpZiB0aGUgbGluZSBjb21lcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBjb2RlIGJsb2NrLiAqLworICAgIG5ld19saW5lbm8gPSAoaW50KSBQeUludF9Bc0xvbmcocF9uZXdfbGluZW5vKTsKKyAgICBpZiAobmV3X2xpbmVubyA8IGYtPmZfY29kZS0+Y29fZmlyc3RsaW5lbm8pIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibGluZSAlZCBjb21lcyBiZWZvcmUgdGhlIGN1cnJlbnQgY29kZSBibG9jayIsCisgICAgICAgICAgICAgICAgICAgICBuZXdfbGluZW5vKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIGlmIChuZXdfbGluZW5vID09IGYtPmZfY29kZS0+Y29fZmlyc3RsaW5lbm8pIHsKKyAgICAgICAgbmV3X2xhc3RpID0gMDsKKyAgICAgICAgbmV3X2xpbmVubyA9IGYtPmZfY29kZS0+Y29fZmlyc3RsaW5lbm87CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBGaW5kIHRoZSBieXRlY29kZSBvZmZzZXQgZm9yIHRoZSBzdGFydCBvZiB0aGUgZ2l2ZW4KKyAgICAgICAgICogbGluZSwgb3IgdGhlIGZpcnN0IGNvZGUtb3duaW5nIGxpbmUgYWZ0ZXIgaXQuICovCisgICAgICAgIGNoYXIgKnRtcDsKKyAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGYtPmZfY29kZS0+Y29fbG5vdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcCwgJmxub3RhYl9sZW4pOworICAgICAgICBsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKSB0bXA7CisgICAgICAgIGFkZHIgPSAwOworICAgICAgICBsaW5lID0gZi0+Zl9jb2RlLT5jb19maXJzdGxpbmVubzsKKyAgICAgICAgbmV3X2xhc3RpID0gLTE7CisgICAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbG5vdGFiX2xlbjsgb2Zmc2V0ICs9IDIpIHsKKyAgICAgICAgICAgIGFkZHIgKz0gbG5vdGFiW29mZnNldF07CisgICAgICAgICAgICBsaW5lICs9IGxub3RhYltvZmZzZXQrMV07CisgICAgICAgICAgICBpZiAobGluZSA+PSBuZXdfbGluZW5vKSB7CisgICAgICAgICAgICAgICAgbmV3X2xhc3RpID0gYWRkcjsKKyAgICAgICAgICAgICAgICBuZXdfbGluZW5vID0gbGluZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qIElmIHdlIGRpZG4ndCByZWFjaCB0aGUgcmVxdWVzdGVkIGxpbmUsIHJldHVybiBhbiBlcnJvci4gKi8KLQlpZiAobmV3X2xhc3RpID09IC0xKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAibGluZSAlZCBjb21lcyBhZnRlciB0aGUgY3VycmVudCBjb2RlIGJsb2NrIiwKLQkJCSAgICAgbmV3X2xpbmVubyk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogSWYgd2UgZGlkbid0IHJlYWNoIHRoZSByZXF1ZXN0ZWQgbGluZSwgcmV0dXJuIGFuIGVycm9yLiAqLworICAgIGlmIChuZXdfbGFzdGkgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibGluZSAlZCBjb21lcyBhZnRlciB0aGUgY3VycmVudCBjb2RlIGJsb2NrIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ld19saW5lbm8pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogV2UncmUgbm93IHJlYWR5IHRvIGxvb2sgYXQgdGhlIGJ5dGVjb2RlLiAqLwotCVB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShmLT5mX2NvZGUtPmNvX2NvZGUsIChjaGFyICoqKSZjb2RlLCAmY29kZV9sZW4pOwotCW1pbl9hZGRyID0gTUlOKG5ld19sYXN0aSwgZi0+Zl9sYXN0aSk7Ci0JbWF4X2FkZHIgPSBNQVgobmV3X2xhc3RpLCBmLT5mX2xhc3RpKTsKKyAgICAvKiBXZSdyZSBub3cgcmVhZHkgdG8gbG9vayBhdCB0aGUgYnl0ZWNvZGUuICovCisgICAgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGYtPmZfY29kZS0+Y29fY29kZSwgKGNoYXIgKiopJmNvZGUsICZjb2RlX2xlbik7CisgICAgbWluX2FkZHIgPSBNSU4obmV3X2xhc3RpLCBmLT5mX2xhc3RpKTsKKyAgICBtYXhfYWRkciA9IE1BWChuZXdfbGFzdGksIGYtPmZfbGFzdGkpOwogCi0JLyogWW91IGNhbid0IGp1bXAgb250byBhIGxpbmUgd2l0aCBhbiAnZXhjZXB0JyBzdGF0ZW1lbnQgb24gaXQgLQotCSAqIHRoZXkgZXhwZWN0IHRvIGhhdmUgYW4gZXhjZXB0aW9uIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCB3aGljaAotCSAqIHdvbid0IGJlIHRydWUgaWYgeW91IGp1bXAgdG8gdGhlbS4gIFRoZXkgYWx3YXlzIHN0YXJ0IHdpdGggY29kZQotCSAqIHRoYXQgZWl0aGVyIHBvcHMgdGhlIGV4Y2VwdGlvbiB1c2luZyBQT1BfVE9QIChwbGFpbiAnZXhjZXB0OicKLQkgKiBsaW5lcyBkbyB0aGlzKSBvciBkdXBsaWNhdGVzIHRoZSBleGNlcHRpb24gb24gdGhlIHN0YWNrIHVzaW5nCi0JICogRFVQX1RPUCAoaWYgdGhlcmUncyBhbiBleGNlcHRpb24gdHlwZSBzcGVjaWZpZWQpLiAgU2VlIGNvbXBpbGUuYywKLQkgKiAnY29tX3RyeV9leGNlcHQnIGZvciB0aGUgZnVsbCBkZXRhaWxzLiAgVGhlcmUgYXJlbid0IGFueSBvdGhlcgotCSAqIGNhc2VzIChBRkFJSykgd2hlcmUgYSBsaW5lJ3MgY29kZSBjYW4gc3RhcnQgd2l0aCBEVVBfVE9QIG9yCi0JICogUE9QX1RPUCwgYnV0IGlmIGFueSBldmVyIGFwcGVhciwgdGhleSdsbCBiZSBzdWJqZWN0IHRvIHRoZSBzYW1lCi0JICogcmVzdHJpY3Rpb24gKGJ1dCB3aXRoIGEgZGlmZmVyZW50IGVycm9yIG1lc3NhZ2UpLiAqLwotCWlmIChjb2RlW25ld19sYXN0aV0gPT0gRFVQX1RPUCB8fCBjb2RlW25ld19sYXN0aV0gPT0gUE9QX1RPUCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJICAgICJjYW4ndCBqdW1wIHRvICdleGNlcHQnIGxpbmUgYXMgdGhlcmUncyBubyBleGNlcHRpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBZb3UgY2FuJ3QganVtcCBvbnRvIGEgbGluZSB3aXRoIGFuICdleGNlcHQnIHN0YXRlbWVudCBvbiBpdCAtCisgICAgICogdGhleSBleHBlY3QgdG8gaGF2ZSBhbiBleGNlcHRpb24gb24gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIHdoaWNoCisgICAgICogd29uJ3QgYmUgdHJ1ZSBpZiB5b3UganVtcCB0byB0aGVtLiAgVGhleSBhbHdheXMgc3RhcnQgd2l0aCBjb2RlCisgICAgICogdGhhdCBlaXRoZXIgcG9wcyB0aGUgZXhjZXB0aW9uIHVzaW5nIFBPUF9UT1AgKHBsYWluICdleGNlcHQ6JworICAgICAqIGxpbmVzIGRvIHRoaXMpIG9yIGR1cGxpY2F0ZXMgdGhlIGV4Y2VwdGlvbiBvbiB0aGUgc3RhY2sgdXNpbmcKKyAgICAgKiBEVVBfVE9QIChpZiB0aGVyZSdzIGFuIGV4Y2VwdGlvbiB0eXBlIHNwZWNpZmllZCkuICBTZWUgY29tcGlsZS5jLAorICAgICAqICdjb21fdHJ5X2V4Y2VwdCcgZm9yIHRoZSBmdWxsIGRldGFpbHMuICBUaGVyZSBhcmVuJ3QgYW55IG90aGVyCisgICAgICogY2FzZXMgKEFGQUlLKSB3aGVyZSBhIGxpbmUncyBjb2RlIGNhbiBzdGFydCB3aXRoIERVUF9UT1Agb3IKKyAgICAgKiBQT1BfVE9QLCBidXQgaWYgYW55IGV2ZXIgYXBwZWFyLCB0aGV5J2xsIGJlIHN1YmplY3QgdG8gdGhlIHNhbWUKKyAgICAgKiByZXN0cmljdGlvbiAoYnV0IHdpdGggYSBkaWZmZXJlbnQgZXJyb3IgbWVzc2FnZSkuICovCisgICAgaWYgKGNvZGVbbmV3X2xhc3RpXSA9PSBEVVBfVE9QIHx8IGNvZGVbbmV3X2xhc3RpXSA9PSBQT1BfVE9QKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgImNhbid0IGp1bXAgdG8gJ2V4Y2VwdCcgbGluZSBhcyB0aGVyZSdzIG5vIGV4Y2VwdGlvbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogWW91IGNhbid0IGp1bXAgaW50byBvciBvdXQgb2YgYSAnZmluYWxseScgYmxvY2sgYmVjYXVzZSB0aGUgJ3RyeScKLQkgKiBibG9jayBsZWF2ZXMgc29tZXRoaW5nIG9uIHRoZSBzdGFjayBmb3IgdGhlIEVORF9GSU5BTExZIHRvIGNsZWFuCi0JICogdXAuCVNvIHdlIHdhbGsgdGhlIGJ5dGVjb2RlLCBtYWludGFpbmluZyBhIHNpbXVsYXRlZCBibG9ja3N0YWNrLgotCSAqIFdoZW4gd2UgcmVhY2ggdGhlIG9sZCBvciBuZXcgYWRkcmVzcyBhbmQgaXQncyBpbiBhICdmaW5hbGx5JyBibG9jawotCSAqIHdlIG5vdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgU0VUVVBfRklOQUxMWS4gIFRoZSBqdW1wCi0JICogaXMgb25seSBsZWdhbCBpZiBuZWl0aGVyIGFkZHJlc3MgaXMgaW4gYSAnZmluYWxseScgYmxvY2sgb3IKLQkgKiB0aGV5J3JlIGJvdGggaW4gdGhlIHNhbWUgb25lLiAgJ2Jsb2Nrc3RhY2snIGlzIGEgc3RhY2sgb2YgdGhlCi0JICogYnl0ZWNvZGUgYWRkcmVzc2VzIG9mIHRoZSBTRVRVUF9YIG9wY29kZXMsIGFuZCAnaW5fZmluYWxseScgdHJhY2tzCi0JICogd2hldGhlciB3ZSdyZSBpbiBhICdmaW5hbGx5JyBibG9jayBhdCBlYWNoIGJsb2Nrc3RhY2sgbGV2ZWwuICovCi0JZl9sYXN0aV9zZXR1cF9hZGRyID0gLTE7Ci0JbmV3X2xhc3RpX3NldHVwX2FkZHIgPSAtMTsKLQltZW1zZXQoYmxvY2tzdGFjaywgJ1wwJywgc2l6ZW9mKGJsb2Nrc3RhY2spKTsKLQltZW1zZXQoaW5fZmluYWxseSwgJ1wwJywgc2l6ZW9mKGluX2ZpbmFsbHkpKTsKLQlibG9ja3N0YWNrX3RvcCA9IDA7Ci0JZm9yIChhZGRyID0gMDsgYWRkciA8IGNvZGVfbGVuOyBhZGRyKyspIHsKLQkJdW5zaWduZWQgY2hhciBvcCA9IGNvZGVbYWRkcl07Ci0JCXN3aXRjaCAob3ApIHsKLQkJY2FzZSBTRVRVUF9MT09QOgotCQljYXNlIFNFVFVQX0VYQ0VQVDoKLQkJY2FzZSBTRVRVUF9GSU5BTExZOgotCQkJYmxvY2tzdGFja1tibG9ja3N0YWNrX3RvcCsrXSA9IGFkZHI7Ci0JCQlpbl9maW5hbGx5W2Jsb2Nrc3RhY2tfdG9wLTFdID0gMDsKLQkJCWJyZWFrOworICAgIC8qIFlvdSBjYW4ndCBqdW1wIGludG8gb3Igb3V0IG9mIGEgJ2ZpbmFsbHknIGJsb2NrIGJlY2F1c2UgdGhlICd0cnknCisgICAgICogYmxvY2sgbGVhdmVzIHNvbWV0aGluZyBvbiB0aGUgc3RhY2sgZm9yIHRoZSBFTkRfRklOQUxMWSB0byBjbGVhbgorICAgICAqIHVwLiAgICAgIFNvIHdlIHdhbGsgdGhlIGJ5dGVjb2RlLCBtYWludGFpbmluZyBhIHNpbXVsYXRlZCBibG9ja3N0YWNrLgorICAgICAqIFdoZW4gd2UgcmVhY2ggdGhlIG9sZCBvciBuZXcgYWRkcmVzcyBhbmQgaXQncyBpbiBhICdmaW5hbGx5JyBibG9jaworICAgICAqIHdlIG5vdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgU0VUVVBfRklOQUxMWS4gIFRoZSBqdW1wCisgICAgICogaXMgb25seSBsZWdhbCBpZiBuZWl0aGVyIGFkZHJlc3MgaXMgaW4gYSAnZmluYWxseScgYmxvY2sgb3IKKyAgICAgKiB0aGV5J3JlIGJvdGggaW4gdGhlIHNhbWUgb25lLiAgJ2Jsb2Nrc3RhY2snIGlzIGEgc3RhY2sgb2YgdGhlCisgICAgICogYnl0ZWNvZGUgYWRkcmVzc2VzIG9mIHRoZSBTRVRVUF9YIG9wY29kZXMsIGFuZCAnaW5fZmluYWxseScgdHJhY2tzCisgICAgICogd2hldGhlciB3ZSdyZSBpbiBhICdmaW5hbGx5JyBibG9jayBhdCBlYWNoIGJsb2Nrc3RhY2sgbGV2ZWwuICovCisgICAgZl9sYXN0aV9zZXR1cF9hZGRyID0gLTE7CisgICAgbmV3X2xhc3RpX3NldHVwX2FkZHIgPSAtMTsKKyAgICBtZW1zZXQoYmxvY2tzdGFjaywgJ1wwJywgc2l6ZW9mKGJsb2Nrc3RhY2spKTsKKyAgICBtZW1zZXQoaW5fZmluYWxseSwgJ1wwJywgc2l6ZW9mKGluX2ZpbmFsbHkpKTsKKyAgICBibG9ja3N0YWNrX3RvcCA9IDA7CisgICAgZm9yIChhZGRyID0gMDsgYWRkciA8IGNvZGVfbGVuOyBhZGRyKyspIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBvcCA9IGNvZGVbYWRkcl07CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBTRVRVUF9MT09QOgorICAgICAgICBjYXNlIFNFVFVQX0VYQ0VQVDoKKyAgICAgICAgY2FzZSBTRVRVUF9GSU5BTExZOgorICAgICAgICAgICAgYmxvY2tzdGFja1tibG9ja3N0YWNrX3RvcCsrXSA9IGFkZHI7CisgICAgICAgICAgICBpbl9maW5hbGx5W2Jsb2Nrc3RhY2tfdG9wLTFdID0gMDsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUE9QX0JMT0NLOgotCQkJYXNzZXJ0KGJsb2Nrc3RhY2tfdG9wID4gMCk7Ci0JCQlzZXR1cF9vcCA9IGNvZGVbYmxvY2tzdGFja1tibG9ja3N0YWNrX3RvcC0xXV07Ci0JCQlpZiAoc2V0dXBfb3AgPT0gU0VUVVBfRklOQUxMWSkgewotCQkJCWluX2ZpbmFsbHlbYmxvY2tzdGFja190b3AtMV0gPSAxOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYmxvY2tzdGFja190b3AtLTsKLQkJCX0KLQkJCWJyZWFrOworICAgICAgICBjYXNlIFBPUF9CTE9DSzoKKyAgICAgICAgICAgIGFzc2VydChibG9ja3N0YWNrX3RvcCA+IDApOworICAgICAgICAgICAgc2V0dXBfb3AgPSBjb2RlW2Jsb2Nrc3RhY2tbYmxvY2tzdGFja190b3AtMV1dOworICAgICAgICAgICAgaWYgKHNldHVwX29wID09IFNFVFVQX0ZJTkFMTFkpIHsKKyAgICAgICAgICAgICAgICBpbl9maW5hbGx5W2Jsb2Nrc3RhY2tfdG9wLTFdID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGJsb2Nrc3RhY2tfdG9wLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVORF9GSU5BTExZOgotCQkJLyogSWdub3JlIEVORF9GSU5BTExZcyBmb3IgU0VUVVBfRVhDRVBUcyAtIHRoZXkgZXhpc3QKLQkJCSAqIGluIHRoZSBieXRlY29kZSBidXQgZG9uJ3QgY29ycmVzcG9uZCB0byBhbiBhY3R1YWwKLQkJCSAqICdmaW5hbGx5JyBibG9jay4gIChJZiBibG9ja3N0YWNrX3RvcCBpcyAwLCB3ZSBtdXN0Ci0JCQkgKiBiZSBzZWVpbmcgc3VjaCBhbiBFTkRfRklOQUxMWS4pICovCi0JCQlpZiAoYmxvY2tzdGFja190b3AgPiAwKSB7Ci0JCQkJc2V0dXBfb3AgPSBjb2RlW2Jsb2Nrc3RhY2tbYmxvY2tzdGFja190b3AtMV1dOwotCQkJCWlmIChzZXR1cF9vcCA9PSBTRVRVUF9GSU5BTExZKSB7Ci0JCQkJCWJsb2Nrc3RhY2tfdG9wLS07Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgY2FzZSBFTkRfRklOQUxMWToKKyAgICAgICAgICAgIC8qIElnbm9yZSBFTkRfRklOQUxMWXMgZm9yIFNFVFVQX0VYQ0VQVHMgLSB0aGV5IGV4aXN0CisgICAgICAgICAgICAgKiBpbiB0aGUgYnl0ZWNvZGUgYnV0IGRvbid0IGNvcnJlc3BvbmQgdG8gYW4gYWN0dWFsCisgICAgICAgICAgICAgKiAnZmluYWxseScgYmxvY2suICAoSWYgYmxvY2tzdGFja190b3AgaXMgMCwgd2UgbXVzdAorICAgICAgICAgICAgICogYmUgc2VlaW5nIHN1Y2ggYW4gRU5EX0ZJTkFMTFkuKSAqLworICAgICAgICAgICAgaWYgKGJsb2Nrc3RhY2tfdG9wID4gMCkgeworICAgICAgICAgICAgICAgIHNldHVwX29wID0gY29kZVtibG9ja3N0YWNrW2Jsb2Nrc3RhY2tfdG9wLTFdXTsKKyAgICAgICAgICAgICAgICBpZiAoc2V0dXBfb3AgPT0gU0VUVVBfRklOQUxMWSkgeworICAgICAgICAgICAgICAgICAgICBibG9ja3N0YWNrX3RvcC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJLyogRm9yIHRoZSBhZGRyZXNzZXMgd2UncmUgaW50ZXJlc3RlZCBpbiwgc2VlIHdoZXRoZXIgdGhleSdyZQotCQkgKiB3aXRoaW4gYSAnZmluYWxseScgYmxvY2sgYW5kIGlmIHNvLCByZW1lbWJlciB0aGUgYWRkcmVzcwotCQkgKiBvZiB0aGUgU0VUVVBfRklOQUxMWS4gKi8KLQkJaWYgKGFkZHIgPT0gbmV3X2xhc3RpIHx8IGFkZHIgPT0gZi0+Zl9sYXN0aSkgewotCQkJaW50IGkgPSAwOwotCQkJaW50IHNldHVwX2FkZHIgPSAtMTsKLQkJCWZvciAoaSA9IGJsb2Nrc3RhY2tfdG9wLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJaWYgKGluX2ZpbmFsbHlbaV0pIHsKLQkJCQkJc2V0dXBfYWRkciA9IGJsb2Nrc3RhY2tbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KKyAgICAgICAgLyogRm9yIHRoZSBhZGRyZXNzZXMgd2UncmUgaW50ZXJlc3RlZCBpbiwgc2VlIHdoZXRoZXIgdGhleSdyZQorICAgICAgICAgKiB3aXRoaW4gYSAnZmluYWxseScgYmxvY2sgYW5kIGlmIHNvLCByZW1lbWJlciB0aGUgYWRkcmVzcworICAgICAgICAgKiBvZiB0aGUgU0VUVVBfRklOQUxMWS4gKi8KKyAgICAgICAgaWYgKGFkZHIgPT0gbmV3X2xhc3RpIHx8IGFkZHIgPT0gZi0+Zl9sYXN0aSkgeworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgaW50IHNldHVwX2FkZHIgPSAtMTsKKyAgICAgICAgICAgIGZvciAoaSA9IGJsb2Nrc3RhY2tfdG9wLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaWYgKGluX2ZpbmFsbHlbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0dXBfYWRkciA9IGJsb2Nrc3RhY2tbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJaWYgKHNldHVwX2FkZHIgIT0gLTEpIHsKLQkJCQlpZiAoYWRkciA9PSBuZXdfbGFzdGkpIHsKLQkJCQkJbmV3X2xhc3RpX3NldHVwX2FkZHIgPSBzZXR1cF9hZGRyOwotCQkJCX0KKyAgICAgICAgICAgIGlmIChzZXR1cF9hZGRyICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKGFkZHIgPT0gbmV3X2xhc3RpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld19sYXN0aV9zZXR1cF9hZGRyID0gc2V0dXBfYWRkcjsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlpZiAoYWRkciA9PSBmLT5mX2xhc3RpKSB7Ci0JCQkJCWZfbGFzdGlfc2V0dXBfYWRkciA9IHNldHVwX2FkZHI7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgaWYgKGFkZHIgPT0gZi0+Zl9sYXN0aSkgeworICAgICAgICAgICAgICAgICAgICBmX2xhc3RpX3NldHVwX2FkZHIgPSBzZXR1cF9hZGRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWlmIChvcCA+PSBIQVZFX0FSR1VNRU5UKSB7Ci0JCQlhZGRyICs9IDI7Ci0JCX0KLQl9CisgICAgICAgIGlmIChvcCA+PSBIQVZFX0FSR1VNRU5UKSB7CisgICAgICAgICAgICBhZGRyICs9IDI7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBWZXJpZnkgdGhhdCB0aGUgYmxvY2tzdGFjayB0cmFja2luZyBjb2RlIGRpZG4ndCBnZXQgbG9zdC4gKi8KLQlhc3NlcnQoYmxvY2tzdGFja190b3AgPT0gMCk7CisgICAgLyogVmVyaWZ5IHRoYXQgdGhlIGJsb2Nrc3RhY2sgdHJhY2tpbmcgY29kZSBkaWRuJ3QgZ2V0IGxvc3QuICovCisgICAgYXNzZXJ0KGJsb2Nrc3RhY2tfdG9wID09IDApOwogCi0JLyogQWZ0ZXIgYWxsIHRoYXQsIGFyZSB3ZSBqdW1waW5nIGludG8gLyBvdXQgb2YgYSAnZmluYWxseScgYmxvY2s/ICovCi0JaWYgKG5ld19sYXN0aV9zZXR1cF9hZGRyICE9IGZfbGFzdGlfc2V0dXBfYWRkcikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAiY2FuJ3QganVtcCBpbnRvIG9yIG91dCBvZiBhICdmaW5hbGx5JyBibG9jayIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIEFmdGVyIGFsbCB0aGF0LCBhcmUgd2UganVtcGluZyBpbnRvIC8gb3V0IG9mIGEgJ2ZpbmFsbHknIGJsb2NrPyAqLworICAgIGlmIChuZXdfbGFzdGlfc2V0dXBfYWRkciAhPSBmX2xhc3RpX3NldHVwX2FkZHIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjYW4ndCBqdW1wIGludG8gb3Igb3V0IG9mIGEgJ2ZpbmFsbHknIGJsb2NrIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKIAotCS8qIFBvbGljZSBibG9jay1qdW1waW5nICh5b3UgY2FuJ3QganVtcCBpbnRvIHRoZSBtaWRkbGUgb2YgYSBibG9jaykKLQkgKiBhbmQgZW5zdXJlIHRoYXQgdGhlIGJsb2Nrc3RhY2sgZmluaXNoZXMgdXAgaW4gYSBzZW5zaWJsZSBzdGF0ZSAoYnkKLQkgKiBwb3BwaW5nIGFueSBibG9ja3Mgd2UncmUganVtcGluZyBvdXQgb2YpLiAgV2UgbG9vayBhdCBhbGwgdGhlCi0JICogYmxvY2tzdGFjayBvcGVyYXRpb25zIGJldHdlZW4gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRoZSBuZXcKLQkgKiBvbmUsIGFuZCBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGJsb2NrcyB3ZSBkcm9wIG91dCBvZiBvbiB0aGUgd2F5LgotCSAqIEJ5IGFsc28ga2VlcGluZyB0cmFjayBvZiB0aGUgbG93ZXN0IGJsb2Nrc3RhY2sgcG9zaXRpb24gd2Ugc2VlLCB3ZQotCSAqIGNhbiB0ZWxsIHdoZXRoZXIgdGhlIGp1bXAgZ29lcyBpbnRvIGFueSBibG9ja3Mgd2l0aG91dCBjb21pbmcgb3V0Ci0JICogYWdhaW4gLSBpbiB0aGF0IGNhc2Ugd2UgcmFpc2UgYW4gZXhjZXB0aW9uIGJlbG93LiAqLwotCWRlbHRhX2libG9jayA9IDA7Ci0JZm9yIChhZGRyID0gbWluX2FkZHI7IGFkZHIgPCBtYXhfYWRkcjsgYWRkcisrKSB7Ci0JCXVuc2lnbmVkIGNoYXIgb3AgPSBjb2RlW2FkZHJdOwotCQlzd2l0Y2ggKG9wKSB7Ci0JCWNhc2UgU0VUVVBfTE9PUDoKLQkJY2FzZSBTRVRVUF9FWENFUFQ6Ci0JCWNhc2UgU0VUVVBfRklOQUxMWToKLQkJCWRlbHRhX2libG9jaysrOwotCQkJYnJlYWs7CisgICAgLyogUG9saWNlIGJsb2NrLWp1bXBpbmcgKHlvdSBjYW4ndCBqdW1wIGludG8gdGhlIG1pZGRsZSBvZiBhIGJsb2NrKQorICAgICAqIGFuZCBlbnN1cmUgdGhhdCB0aGUgYmxvY2tzdGFjayBmaW5pc2hlcyB1cCBpbiBhIHNlbnNpYmxlIHN0YXRlIChieQorICAgICAqIHBvcHBpbmcgYW55IGJsb2NrcyB3ZSdyZSBqdW1waW5nIG91dCBvZikuICBXZSBsb29rIGF0IGFsbCB0aGUKKyAgICAgKiBibG9ja3N0YWNrIG9wZXJhdGlvbnMgYmV0d2VlbiB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgdGhlIG5ldworICAgICAqIG9uZSwgYW5kIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgYmxvY2tzIHdlIGRyb3Agb3V0IG9mIG9uIHRoZSB3YXkuCisgICAgICogQnkgYWxzbyBrZWVwaW5nIHRyYWNrIG9mIHRoZSBsb3dlc3QgYmxvY2tzdGFjayBwb3NpdGlvbiB3ZSBzZWUsIHdlCisgICAgICogY2FuIHRlbGwgd2hldGhlciB0aGUganVtcCBnb2VzIGludG8gYW55IGJsb2NrcyB3aXRob3V0IGNvbWluZyBvdXQKKyAgICAgKiBhZ2FpbiAtIGluIHRoYXQgY2FzZSB3ZSByYWlzZSBhbiBleGNlcHRpb24gYmVsb3cuICovCisgICAgZGVsdGFfaWJsb2NrID0gMDsKKyAgICBmb3IgKGFkZHIgPSBtaW5fYWRkcjsgYWRkciA8IG1heF9hZGRyOyBhZGRyKyspIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBvcCA9IGNvZGVbYWRkcl07CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBTRVRVUF9MT09QOgorICAgICAgICBjYXNlIFNFVFVQX0VYQ0VQVDoKKyAgICAgICAgY2FzZSBTRVRVUF9GSU5BTExZOgorICAgICAgICAgICAgZGVsdGFfaWJsb2NrKys7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBPUF9CTE9DSzoKLQkJCWRlbHRhX2libG9jay0tOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgY2FzZSBQT1BfQkxPQ0s6CisgICAgICAgICAgICBkZWx0YV9pYmxvY2stLTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJbWluX2RlbHRhX2libG9jayA9IE1JTihtaW5fZGVsdGFfaWJsb2NrLCBkZWx0YV9pYmxvY2spOworICAgICAgICBtaW5fZGVsdGFfaWJsb2NrID0gTUlOKG1pbl9kZWx0YV9pYmxvY2ssIGRlbHRhX2libG9jayk7CiAKLQkJaWYgKG9wID49IEhBVkVfQVJHVU1FTlQpIHsKLQkJCWFkZHIgKz0gMjsKLQkJfQotCX0KKyAgICAgICAgaWYgKG9wID49IEhBVkVfQVJHVU1FTlQpIHsKKyAgICAgICAgICAgIGFkZHIgKz0gMjsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIERlcml2ZSB0aGUgYWJzb2x1dGUgaWJsb2NrIHZhbHVlcyBmcm9tIHRoZSBkZWx0YXMuICovCi0JbWluX2libG9jayA9IGYtPmZfaWJsb2NrICsgbWluX2RlbHRhX2libG9jazsKLQlpZiAobmV3X2xhc3RpID4gZi0+Zl9sYXN0aSkgewotCQkvKiBGb3J3YXJkcyBqdW1wLiAqLwotCQluZXdfaWJsb2NrID0gZi0+Zl9pYmxvY2sgKyBkZWx0YV9pYmxvY2s7Ci0JfQotCWVsc2UgewotCQkvKiBCYWNrd2FyZHMganVtcC4gKi8KLQkJbmV3X2libG9jayA9IGYtPmZfaWJsb2NrIC0gZGVsdGFfaWJsb2NrOwotCX0KKyAgICAvKiBEZXJpdmUgdGhlIGFic29sdXRlIGlibG9jayB2YWx1ZXMgZnJvbSB0aGUgZGVsdGFzLiAqLworICAgIG1pbl9pYmxvY2sgPSBmLT5mX2libG9jayArIG1pbl9kZWx0YV9pYmxvY2s7CisgICAgaWYgKG5ld19sYXN0aSA+IGYtPmZfbGFzdGkpIHsKKyAgICAgICAgLyogRm9yd2FyZHMganVtcC4gKi8KKyAgICAgICAgbmV3X2libG9jayA9IGYtPmZfaWJsb2NrICsgZGVsdGFfaWJsb2NrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogQmFja3dhcmRzIGp1bXAuICovCisgICAgICAgIG5ld19pYmxvY2sgPSBmLT5mX2libG9jayAtIGRlbHRhX2libG9jazsKKyAgICB9CiAKLQkvKiBBcmUgd2UganVtcGluZyBpbnRvIGEgYmxvY2s/ICovCi0JaWYgKG5ld19pYmxvY2sgPiBtaW5faWJsb2NrKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjYW4ndCBqdW1wIGludG8gdGhlIG1pZGRsZSBvZiBhIGJsb2NrIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogQXJlIHdlIGp1bXBpbmcgaW50byBhIGJsb2NrPyAqLworICAgIGlmIChuZXdfaWJsb2NrID4gbWluX2libG9jaykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBqdW1wIGludG8gdGhlIG1pZGRsZSBvZiBhIGJsb2NrIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBQb3AgYW55IGJsb2NrcyB0aGF0IHdlJ3JlIGp1bXBpbmcgb3V0IG9mLiAqLwotCXdoaWxlIChmLT5mX2libG9jayA+IG5ld19pYmxvY2spIHsKLQkJUHlUcnlCbG9jayAqYiA9ICZmLT5mX2Jsb2Nrc3RhY2tbLS1mLT5mX2libG9ja107Ci0JCXdoaWxlICgoZi0+Zl9zdGFja3RvcCAtIGYtPmZfdmFsdWVzdGFjaykgPiBiLT5iX2xldmVsKSB7Ci0JCQlQeU9iamVjdCAqdiA9ICgqLS1mLT5mX3N0YWNrdG9wKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJfQotCX0KKyAgICAvKiBQb3AgYW55IGJsb2NrcyB0aGF0IHdlJ3JlIGp1bXBpbmcgb3V0IG9mLiAqLworICAgIHdoaWxlIChmLT5mX2libG9jayA+IG5ld19pYmxvY2spIHsKKyAgICAgICAgUHlUcnlCbG9jayAqYiA9ICZmLT5mX2Jsb2Nrc3RhY2tbLS1mLT5mX2libG9ja107CisgICAgICAgIHdoaWxlICgoZi0+Zl9zdGFja3RvcCAtIGYtPmZfdmFsdWVzdGFjaykgPiBiLT5iX2xldmVsKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9ICgqLS1mLT5mX3N0YWNrdG9wKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIEZpbmFsbHkgc2V0IHRoZSBuZXcgZl9saW5lbm8gYW5kIGZfbGFzdGkgYW5kIHJldHVybiBPSy4gKi8KLQlmLT5mX2xpbmVubyA9IG5ld19saW5lbm87Ci0JZi0+Zl9sYXN0aSA9IG5ld19sYXN0aTsKLQlyZXR1cm4gMDsKKyAgICAvKiBGaW5hbGx5IHNldCB0aGUgbmV3IGZfbGluZW5vIGFuZCBmX2xhc3RpIGFuZCByZXR1cm4gT0suICovCisgICAgZi0+Zl9saW5lbm8gPSBuZXdfbGluZW5vOworICAgIGYtPmZfbGFzdGkgPSBuZXdfbGFzdGk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmcmFtZV9nZXR0cmFjZShQeUZyYW1lT2JqZWN0ICpmLCB2b2lkICpjbG9zdXJlKQogewotCVB5T2JqZWN0KiB0cmFjZSA9IGYtPmZfdHJhY2U7CisgICAgUHlPYmplY3QqIHRyYWNlID0gZi0+Zl90cmFjZTsKIAotCWlmICh0cmFjZSA9PSBOVUxMKQotCQl0cmFjZSA9IFB5X05vbmU7CisgICAgaWYgKHRyYWNlID09IE5VTEwpCisgICAgICAgIHRyYWNlID0gUHlfTm9uZTsKIAotCVB5X0lOQ1JFRih0cmFjZSk7CisgICAgUHlfSU5DUkVGKHRyYWNlKTsKIAotCXJldHVybiB0cmFjZTsKKyAgICByZXR1cm4gdHJhY2U7CiB9CiAKIHN0YXRpYyBpbnQKIGZyYW1lX3NldHRyYWNlKFB5RnJhbWVPYmplY3QgKmYsIFB5T2JqZWN0KiB2LCB2b2lkICpjbG9zdXJlKQogewotCVB5T2JqZWN0KiBvbGRfdmFsdWU7CisgICAgUHlPYmplY3QqIG9sZF92YWx1ZTsKIAotCS8qIFdlIHJlbHkgb24gZl9saW5lbm8gYmVpbmcgYWNjdXJhdGUgd2hlbiBmX3RyYWNlIGlzIHNldC4gKi8KLQlmLT5mX2xpbmVubyA9IFB5RnJhbWVfR2V0TGluZU51bWJlcihmKTsKKyAgICAvKiBXZSByZWx5IG9uIGZfbGluZW5vIGJlaW5nIGFjY3VyYXRlIHdoZW4gZl90cmFjZSBpcyBzZXQuICovCisgICAgZi0+Zl9saW5lbm8gPSBQeUZyYW1lX0dldExpbmVOdW1iZXIoZik7CiAKLQlvbGRfdmFsdWUgPSBmLT5mX3RyYWNlOwotCVB5X1hJTkNSRUYodik7Ci0JZi0+Zl90cmFjZSA9IHY7Ci0JUHlfWERFQ1JFRihvbGRfdmFsdWUpOworICAgIG9sZF92YWx1ZSA9IGYtPmZfdHJhY2U7CisgICAgUHlfWElOQ1JFRih2KTsKKyAgICBmLT5mX3RyYWNlID0gdjsKKyAgICBQeV9YREVDUkVGKG9sZF92YWx1ZSk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZyYW1lX2dldHJlc3RyaWN0ZWQoUHlGcmFtZU9iamVjdCAqZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFB5RnJhbWVfSXNSZXN0cmljdGVkKGYpKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKFB5RnJhbWVfSXNSZXN0cmljdGVkKGYpKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGZyYW1lX2dldHNldGxpc3RbXSA9IHsKLQl7ImZfbG9jYWxzIiwJKGdldHRlcilmcmFtZV9nZXRsb2NhbHMsIE5VTEwsIE5VTEx9LAotCXsiZl9saW5lbm8iLAkoZ2V0dGVyKWZyYW1lX2dldGxpbmVubywKLQkJCShzZXR0ZXIpZnJhbWVfc2V0bGluZW5vLCBOVUxMfSwKLQl7ImZfdHJhY2UiLAkoZ2V0dGVyKWZyYW1lX2dldHRyYWNlLCAoc2V0dGVyKWZyYW1lX3NldHRyYWNlLCBOVUxMfSwKLQl7ImZfcmVzdHJpY3RlZCIsKGdldHRlcilmcmFtZV9nZXRyZXN0cmljdGVkLE5VTEwsIE5VTEx9LAotCXsiZl9leGNfdHJhY2ViYWNrIiwgKGdldHRlcilmcmFtZV9nZXRfZl9leGNfdHJhY2ViYWNrLAotCSAgICAgICAgICAgICAgICAoc2V0dGVyKWZyYW1lX3NldF9mX2V4Y190cmFjZWJhY2ssIE5VTEx9LAotICAgICAgICB7ImZfZXhjX3R5cGUiLCAgKGdldHRlcilmcmFtZV9nZXRfZl9leGNfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzZXR0ZXIpZnJhbWVfc2V0X2ZfZXhjX3R5cGUsIE5VTEx9LAotICAgICAgICB7ImZfZXhjX3ZhbHVlIiwgKGdldHRlcilmcmFtZV9nZXRfZl9leGNfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2V0dGVyKWZyYW1lX3NldF9mX2V4Y192YWx1ZSwgTlVMTH0sCi0JezB9CisgICAgeyJmX2xvY2FscyIsICAgICAgICAoZ2V0dGVyKWZyYW1lX2dldGxvY2FscywgTlVMTCwgTlVMTH0sCisgICAgeyJmX2xpbmVubyIsICAgICAgICAoZ2V0dGVyKWZyYW1lX2dldGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgKHNldHRlcilmcmFtZV9zZXRsaW5lbm8sIE5VTEx9LAorICAgIHsiZl90cmFjZSIsICAgICAgICAgKGdldHRlcilmcmFtZV9nZXR0cmFjZSwgKHNldHRlcilmcmFtZV9zZXR0cmFjZSwgTlVMTH0sCisgICAgeyJmX3Jlc3RyaWN0ZWQiLChnZXR0ZXIpZnJhbWVfZ2V0cmVzdHJpY3RlZCxOVUxMLCBOVUxMfSwKKyAgICB7ImZfZXhjX3RyYWNlYmFjayIsIChnZXR0ZXIpZnJhbWVfZ2V0X2ZfZXhjX3RyYWNlYmFjaywKKyAgICAgICAgICAgICAgICAgICAgKHNldHRlcilmcmFtZV9zZXRfZl9leGNfdHJhY2ViYWNrLCBOVUxMfSwKKyAgICB7ImZfZXhjX3R5cGUiLCAgKGdldHRlcilmcmFtZV9nZXRfZl9leGNfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgKHNldHRlcilmcmFtZV9zZXRfZl9leGNfdHlwZSwgTlVMTH0sCisgICAgeyJmX2V4Y192YWx1ZSIsIChnZXR0ZXIpZnJhbWVfZ2V0X2ZfZXhjX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAoc2V0dGVyKWZyYW1lX3NldF9mX2V4Y192YWx1ZSwgTlVMTH0sCisgICAgezB9CiB9OwogCiAvKiBTdGFjayBmcmFtZXMgYXJlIGFsbG9jYXRlZCBhbmQgZGVhbGxvY2F0ZWQgYXQgYSBjb25zaWRlcmFibGUgcmF0ZS4KQEAgLTQxMCw3ICs0MTAsNyBAQAogICAgdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHN0aWxsIHZhbGlkOgogCiAgICAgICogb2JfdHlwZSwgb2Jfc2l6ZSwgZl9jb2RlLCBmX3ZhbHVlc3RhY2s7Ci0gICAgICAgCisKICAgICAgKiBmX2xvY2FscywgZl90cmFjZSwKICAgICAgICBmX2V4Y190eXBlLCBmX2V4Y192YWx1ZSwgZl9leGNfdHJhY2ViYWNrIGFyZSBOVUxMOwogCkBAIC00MjEsMTAgKzQyMSwxMCBAQAogICAgaW50ZWdlcnMgYXJlIGFsbG9jYXRlZCBpbiBhIHNwZWNpYWwgd2F5IC0tIHNlZSBpbnRvYmplY3QuYykuICBXaGVuCiAgICBhIHN0YWNrIGZyYW1lIGlzIG9uIHRoZSBmcmVlIGxpc3QsIG9ubHkgdGhlIGZvbGxvd2luZyBtZW1iZXJzIGhhdmUKICAgIGEgbWVhbmluZzoKLQlvYl90eXBlCQk9PSAmRnJhbWV0eXBlCi0JZl9iYWNrCQluZXh0IGl0ZW0gb24gZnJlZSBsaXN0LCBvciBOVUxMCi0JZl9zdGFja3NpemUJc2l6ZSBvZiB2YWx1ZSBzdGFjawotCW9iX3NpemUJCXNpemUgb2YgbG9jYWxzcGx1cworICAgIG9iX3R5cGUgICAgICAgICAgICAgPT0gJkZyYW1ldHlwZQorICAgIGZfYmFjayAgICAgICAgICAgICAgbmV4dCBpdGVtIG9uIGZyZWUgbGlzdCwgb3IgTlVMTAorICAgIGZfc3RhY2tzaXplICAgICAgICAgc2l6ZSBvZiB2YWx1ZSBzdGFjaworICAgIG9iX3NpemUgICAgICAgICAgICAgc2l6ZSBvZiBsb2NhbHNwbHVzCiAgICBOb3RlIHRoYXQgdGhlIHZhbHVlIGFuZCBibG9jayBzdGFja3MgYXJlIHByZXNlcnZlZCAtLSB0aGlzIGNhbiBzYXZlCiAgICBhbm90aGVyIG1hbGxvYygpIGNhbGwgb3IgdHdvIChhbmQgdHdvIGZyZWUoKSBjYWxscyBhcyB3ZWxsISkuCiAgICBBbHNvIG5vdGUgdGhhdCwgdW5saWtlIGZvciBpbnRlZ2VycywgZWFjaCBmcmFtZSBvYmplY3QgaXMgYQpAQCAtNDQwLDMwNyArNDQwLDMwNyBAQAogKi8KIAogc3RhdGljIFB5RnJhbWVPYmplY3QgKmZyZWVfbGlzdCA9IE5VTEw7Ci1zdGF0aWMgaW50IG51bWZyZWUgPSAwOwkJLyogbnVtYmVyIG9mIGZyYW1lcyBjdXJyZW50bHkgaW4gZnJlZV9saXN0ICovCitzdGF0aWMgaW50IG51bWZyZWUgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiBmcmFtZXMgY3VycmVudGx5IGluIGZyZWVfbGlzdCAqLwogLyogbWF4IHZhbHVlIGZvciBudW1mcmVlICovCi0jZGVmaW5lIFB5RnJhbWVfTUFYRlJFRUxJU1QgMjAwCQorI2RlZmluZSBQeUZyYW1lX01BWEZSRUVMSVNUIDIwMAogCiBzdGF0aWMgdm9pZAogZnJhbWVfZGVhbGxvYyhQeUZyYW1lT2JqZWN0ICpmKQogewotCVB5T2JqZWN0ICoqcCwgKip2YWx1ZXN0YWNrOwotCVB5Q29kZU9iamVjdCAqY287CisgICAgUHlPYmplY3QgKipwLCAqKnZhbHVlc3RhY2s7CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKIAotCVB5T2JqZWN0X0dDX1VuVHJhY2soZik7Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihmKQotCS8qIEtpbGwgYWxsIGxvY2FsIHZhcmlhYmxlcyAqLwotCXZhbHVlc3RhY2sgPSBmLT5mX3ZhbHVlc3RhY2s7Ci0JZm9yIChwID0gZi0+Zl9sb2NhbHNwbHVzOyBwIDwgdmFsdWVzdGFjazsgcCsrKQotCQlQeV9DTEVBUigqcCk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhmKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKGYpCisgICAgLyogS2lsbCBhbGwgbG9jYWwgdmFyaWFibGVzICovCisgICAgdmFsdWVzdGFjayA9IGYtPmZfdmFsdWVzdGFjazsKKyAgICBmb3IgKHAgPSBmLT5mX2xvY2Fsc3BsdXM7IHAgPCB2YWx1ZXN0YWNrOyBwKyspCisgICAgICAgIFB5X0NMRUFSKCpwKTsKIAotCS8qIEZyZWUgc3RhY2sgKi8KLQlpZiAoZi0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7Ci0JCWZvciAocCA9IHZhbHVlc3RhY2s7IHAgPCBmLT5mX3N0YWNrdG9wOyBwKyspCi0JCQlQeV9YREVDUkVGKCpwKTsKLQl9CisgICAgLyogRnJlZSBzdGFjayAqLworICAgIGlmIChmLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChwID0gdmFsdWVzdGFjazsgcCA8IGYtPmZfc3RhY2t0b3A7IHArKykKKyAgICAgICAgICAgIFB5X1hERUNSRUYoKnApOworICAgIH0KIAotCVB5X1hERUNSRUYoZi0+Zl9iYWNrKTsKLQlQeV9ERUNSRUYoZi0+Zl9idWlsdGlucyk7Ci0JUHlfREVDUkVGKGYtPmZfZ2xvYmFscyk7Ci0JUHlfQ0xFQVIoZi0+Zl9sb2NhbHMpOwotCVB5X0NMRUFSKGYtPmZfdHJhY2UpOwotCVB5X0NMRUFSKGYtPmZfZXhjX3R5cGUpOwotCVB5X0NMRUFSKGYtPmZfZXhjX3ZhbHVlKTsKLQlQeV9DTEVBUihmLT5mX2V4Y190cmFjZWJhY2spOworICAgIFB5X1hERUNSRUYoZi0+Zl9iYWNrKTsKKyAgICBQeV9ERUNSRUYoZi0+Zl9idWlsdGlucyk7CisgICAgUHlfREVDUkVGKGYtPmZfZ2xvYmFscyk7CisgICAgUHlfQ0xFQVIoZi0+Zl9sb2NhbHMpOworICAgIFB5X0NMRUFSKGYtPmZfdHJhY2UpOworICAgIFB5X0NMRUFSKGYtPmZfZXhjX3R5cGUpOworICAgIFB5X0NMRUFSKGYtPmZfZXhjX3ZhbHVlKTsKKyAgICBQeV9DTEVBUihmLT5mX2V4Y190cmFjZWJhY2spOwogCi0JY28gPSBmLT5mX2NvZGU7Ci0JaWYgKGNvLT5jb196b21iaWVmcmFtZSA9PSBOVUxMKQotCQljby0+Y29fem9tYmllZnJhbWUgPSBmOwotCWVsc2UgaWYgKG51bWZyZWUgPCBQeUZyYW1lX01BWEZSRUVMSVNUKSB7Ci0JCSsrbnVtZnJlZTsKLQkJZi0+Zl9iYWNrID0gZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSBmOwotCX0KLQllbHNlIAotCQlQeU9iamVjdF9HQ19EZWwoZik7CisgICAgY28gPSBmLT5mX2NvZGU7CisgICAgaWYgKGNvLT5jb196b21iaWVmcmFtZSA9PSBOVUxMKQorICAgICAgICBjby0+Y29fem9tYmllZnJhbWUgPSBmOworICAgIGVsc2UgaWYgKG51bWZyZWUgPCBQeUZyYW1lX01BWEZSRUVMSVNUKSB7CisgICAgICAgICsrbnVtZnJlZTsKKyAgICAgICAgZi0+Zl9iYWNrID0gZnJlZV9saXN0OworICAgICAgICBmcmVlX2xpc3QgPSBmOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChmKTsKIAotCVB5X0RFQ1JFRihjbyk7Ci0JUHlfVFJBU0hDQU5fU0FGRV9FTkQoZikKKyAgICBQeV9ERUNSRUYoY28pOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKGYpCiB9CiAKIHN0YXRpYyBpbnQKIGZyYW1lX3RyYXZlcnNlKFB5RnJhbWVPYmplY3QgKmYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipwOwotCWludCBpLCBzbG90czsKKyAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqcDsKKyAgICBpbnQgaSwgc2xvdHM7CiAKLQlQeV9WSVNJVChmLT5mX2JhY2spOwotCVB5X1ZJU0lUKGYtPmZfY29kZSk7Ci0JUHlfVklTSVQoZi0+Zl9idWlsdGlucyk7Ci0JUHlfVklTSVQoZi0+Zl9nbG9iYWxzKTsKLQlQeV9WSVNJVChmLT5mX2xvY2Fscyk7Ci0JUHlfVklTSVQoZi0+Zl90cmFjZSk7Ci0JUHlfVklTSVQoZi0+Zl9leGNfdHlwZSk7Ci0JUHlfVklTSVQoZi0+Zl9leGNfdmFsdWUpOwotCVB5X1ZJU0lUKGYtPmZfZXhjX3RyYWNlYmFjayk7CisgICAgUHlfVklTSVQoZi0+Zl9iYWNrKTsKKyAgICBQeV9WSVNJVChmLT5mX2NvZGUpOworICAgIFB5X1ZJU0lUKGYtPmZfYnVpbHRpbnMpOworICAgIFB5X1ZJU0lUKGYtPmZfZ2xvYmFscyk7CisgICAgUHlfVklTSVQoZi0+Zl9sb2NhbHMpOworICAgIFB5X1ZJU0lUKGYtPmZfdHJhY2UpOworICAgIFB5X1ZJU0lUKGYtPmZfZXhjX3R5cGUpOworICAgIFB5X1ZJU0lUKGYtPmZfZXhjX3ZhbHVlKTsKKyAgICBQeV9WSVNJVChmLT5mX2V4Y190cmFjZWJhY2spOwogCi0JLyogbG9jYWxzICovCi0Jc2xvdHMgPSBmLT5mX2NvZGUtPmNvX25sb2NhbHMgKyBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fY2VsbHZhcnMpICsgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKTsKLQlmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwotCWZvciAoaSA9IHNsb3RzOyAtLWkgPj0gMDsgKytmYXN0bG9jYWxzKQotCQlQeV9WSVNJVCgqZmFzdGxvY2Fscyk7CisgICAgLyogbG9jYWxzICovCisgICAgc2xvdHMgPSBmLT5mX2NvZGUtPmNvX25sb2NhbHMgKyBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fY2VsbHZhcnMpICsgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKTsKKyAgICBmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOworICAgIGZvciAoaSA9IHNsb3RzOyAtLWkgPj0gMDsgKytmYXN0bG9jYWxzKQorICAgICAgICBQeV9WSVNJVCgqZmFzdGxvY2Fscyk7CiAKLQkvKiBzdGFjayAqLwotCWlmIChmLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKLQkJZm9yIChwID0gZi0+Zl92YWx1ZXN0YWNrOyBwIDwgZi0+Zl9zdGFja3RvcDsgcCsrKQotCQkJUHlfVklTSVQoKnApOwotCX0KLQlyZXR1cm4gMDsKKyAgICAvKiBzdGFjayAqLworICAgIGlmIChmLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChwID0gZi0+Zl92YWx1ZXN0YWNrOyBwIDwgZi0+Zl9zdGFja3RvcDsgcCsrKQorICAgICAgICAgICAgUHlfVklTSVQoKnApOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIGZyYW1lX2NsZWFyKFB5RnJhbWVPYmplY3QgKmYpCiB7Ci0JUHlPYmplY3QgKipmYXN0bG9jYWxzLCAqKnAsICoqb2xkdG9wOwotCWludCBpLCBzbG90czsKKyAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqcCwgKipvbGR0b3A7CisgICAgaW50IGksIHNsb3RzOwogCi0JLyogQmVmb3JlIGFueXRoaW5nIGVsc2UsIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZnJhbWUgaXMgY2xlYXJseSBtYXJrZWQKLQkgKiBhcyBiZWluZyBkZWZ1bmN0ISAgRWxzZSwgZS5nLiwgYSBnZW5lcmF0b3IgcmVhY2hhYmxlIGZyb20gdGhpcwotCSAqIGZyYW1lIG1heSBhbHNvIHBvaW50IHRvIHRoaXMgZnJhbWUsIGJlbGlldmUgaXRzZWxmIHRvIHN0aWxsIGJlCi0JICogYWN0aXZlLCBhbmQgdHJ5IGNsZWFuaW5nIHVwIHRoaXMgZnJhbWUgYWdhaW4uCi0JICovCi0Jb2xkdG9wID0gZi0+Zl9zdGFja3RvcDsKLQlmLT5mX3N0YWNrdG9wID0gTlVMTDsKKyAgICAvKiBCZWZvcmUgYW55dGhpbmcgZWxzZSwgbWFrZSBzdXJlIHRoYXQgdGhpcyBmcmFtZSBpcyBjbGVhcmx5IG1hcmtlZAorICAgICAqIGFzIGJlaW5nIGRlZnVuY3QhICBFbHNlLCBlLmcuLCBhIGdlbmVyYXRvciByZWFjaGFibGUgZnJvbSB0aGlzCisgICAgICogZnJhbWUgbWF5IGFsc28gcG9pbnQgdG8gdGhpcyBmcmFtZSwgYmVsaWV2ZSBpdHNlbGYgdG8gc3RpbGwgYmUKKyAgICAgKiBhY3RpdmUsIGFuZCB0cnkgY2xlYW5pbmcgdXAgdGhpcyBmcmFtZSBhZ2Fpbi4KKyAgICAgKi8KKyAgICBvbGR0b3AgPSBmLT5mX3N0YWNrdG9wOworICAgIGYtPmZfc3RhY2t0b3AgPSBOVUxMOwogCi0JUHlfQ0xFQVIoZi0+Zl9leGNfdHlwZSk7Ci0JUHlfQ0xFQVIoZi0+Zl9leGNfdmFsdWUpOwotCVB5X0NMRUFSKGYtPmZfZXhjX3RyYWNlYmFjayk7Ci0JUHlfQ0xFQVIoZi0+Zl90cmFjZSk7CisgICAgUHlfQ0xFQVIoZi0+Zl9leGNfdHlwZSk7CisgICAgUHlfQ0xFQVIoZi0+Zl9leGNfdmFsdWUpOworICAgIFB5X0NMRUFSKGYtPmZfZXhjX3RyYWNlYmFjayk7CisgICAgUHlfQ0xFQVIoZi0+Zl90cmFjZSk7CiAKLQkvKiBsb2NhbHMgKi8KLQlzbG90cyA9IGYtPmZfY29kZS0+Y29fbmxvY2FscyArIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19jZWxsdmFycykgKyBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMpOwotCWZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JZm9yIChpID0gc2xvdHM7IC0taSA+PSAwOyArK2Zhc3Rsb2NhbHMpCi0JCVB5X0NMRUFSKCpmYXN0bG9jYWxzKTsKKyAgICAvKiBsb2NhbHMgKi8KKyAgICBzbG90cyA9IGYtPmZfY29kZS0+Y29fbmxvY2FscyArIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19jZWxsdmFycykgKyBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMpOworICAgIGZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CisgICAgZm9yIChpID0gc2xvdHM7IC0taSA+PSAwOyArK2Zhc3Rsb2NhbHMpCisgICAgICAgIFB5X0NMRUFSKCpmYXN0bG9jYWxzKTsKIAotCS8qIHN0YWNrICovCi0JaWYgKG9sZHRvcCAhPSBOVUxMKSB7Ci0JCWZvciAocCA9IGYtPmZfdmFsdWVzdGFjazsgcCA8IG9sZHRvcDsgcCsrKQotCQkJUHlfQ0xFQVIoKnApOwotCX0KKyAgICAvKiBzdGFjayAqLworICAgIGlmIChvbGR0b3AgIT0gTlVMTCkgeworICAgICAgICBmb3IgKHAgPSBmLT5mX3ZhbHVlc3RhY2s7IHAgPCBvbGR0b3A7IHArKykKKyAgICAgICAgICAgIFB5X0NMRUFSKCpwKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmcmFtZV9zaXplb2YoUHlGcmFtZU9iamVjdCAqZikKIHsKLQlQeV9zc2l6ZV90IHJlcywgZXh0cmFzLCBuY2VsbHMsIG5mcmVlczsKKyAgICBQeV9zc2l6ZV90IHJlcywgZXh0cmFzLCBuY2VsbHMsIG5mcmVlczsKIAotCW5jZWxscyA9IFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19jZWxsdmFycyk7Ci0JbmZyZWVzID0gUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKTsKLQlleHRyYXMgPSBmLT5mX2NvZGUtPmNvX3N0YWNrc2l6ZSArIGYtPmZfY29kZS0+Y29fbmxvY2FscyArCi0JCSBuY2VsbHMgKyBuZnJlZXM7Ci0JLyogc3VidHJhY3Qgb25lIGFzIGl0IGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gUHlGcmFtZU9iamVjdCAqLwotCXJlcyA9IHNpemVvZihQeUZyYW1lT2JqZWN0KSArIChleHRyYXMtMSkgKiBzaXplb2YoUHlPYmplY3QgKik7CisgICAgbmNlbGxzID0gUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2NlbGx2YXJzKTsKKyAgICBuZnJlZXMgPSBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMpOworICAgIGV4dHJhcyA9IGYtPmZfY29kZS0+Y29fc3RhY2tzaXplICsgZi0+Zl9jb2RlLT5jb19ubG9jYWxzICsKKyAgICAgICAgICAgICBuY2VsbHMgKyBuZnJlZXM7CisgICAgLyogc3VidHJhY3Qgb25lIGFzIGl0IGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gUHlGcmFtZU9iamVjdCAqLworICAgIHJlcyA9IHNpemVvZihQeUZyYW1lT2JqZWN0KSArIChleHRyYXMtMSkgKiBzaXplb2YoUHlPYmplY3QgKik7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNpemVvZl9fZG9jX18sCiAiRi5fX3NpemVvZl9fKCkgLT4gc2l6ZSBvZiBGIGluIG1lbW9yeSwgaW4gYnl0ZXMiKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGZyYW1lX21ldGhvZHNbXSA9IHsKLQl7Il9fc2l6ZW9mX18iLAkoUHlDRnVuY3Rpb24pZnJhbWVfc2l6ZW9mLAlNRVRIX05PQVJHUywKLQkgc2l6ZW9mX19kb2NfX30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiX19zaXplb2ZfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWZyYW1lX3NpemVvZiwgICAgICBNRVRIX05PQVJHUywKKyAgICAgc2l6ZW9mX19kb2NfX30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlGcmFtZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImZyYW1lIiwKLQlzaXplb2YoUHlGcmFtZU9iamVjdCksCi0Jc2l6ZW9mKFB5T2JqZWN0ICopLAotCShkZXN0cnVjdG9yKWZyYW1lX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWZyYW1lX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlmcmFtZV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZnJhbWVfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCWZyYW1lX21lbWJlcmxpc3QsCQkJLyogdHBfbWVtYmVycyAqLwotCWZyYW1lX2dldHNldGxpc3QsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImZyYW1lIiwKKyAgICBzaXplb2YoUHlGcmFtZU9iamVjdCksCisgICAgc2l6ZW9mKFB5T2JqZWN0ICopLAorICAgIChkZXN0cnVjdG9yKWZyYW1lX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZnJhbWVfdHJhdmVyc2UsICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlmcmFtZV9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZnJhbWVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgZnJhbWVfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgZnJhbWVfZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqYnVpbHRpbl9vYmplY3Q7CiAKIGludCBfUHlGcmFtZV9Jbml0KCkKIHsKLQlidWlsdGluX29iamVjdCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fYnVpbHRpbnNfXyIpOwotCWlmIChidWlsdGluX29iamVjdCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICBidWlsdGluX29iamVjdCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fYnVpbHRpbnNfXyIpOworICAgIGlmIChidWlsdGluX29iamVjdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogUHlGcmFtZU9iamVjdCAqCiBQeUZyYW1lX05ldyhQeVRocmVhZFN0YXRlICp0c3RhdGUsIFB5Q29kZU9iamVjdCAqY29kZSwgUHlPYmplY3QgKmdsb2JhbHMsCi0JICAgIFB5T2JqZWN0ICpsb2NhbHMpCisgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzKQogewotCVB5RnJhbWVPYmplY3QgKmJhY2sgPSB0c3RhdGUtPmZyYW1lOwotCVB5RnJhbWVPYmplY3QgKmY7Ci0JUHlPYmplY3QgKmJ1aWx0aW5zOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeUZyYW1lT2JqZWN0ICpiYWNrID0gdHN0YXRlLT5mcmFtZTsKKyAgICBQeUZyYW1lT2JqZWN0ICpmOworICAgIFB5T2JqZWN0ICpidWlsdGluczsKKyAgICBQeV9zc2l6ZV90IGk7CiAKICNpZmRlZiBQeV9ERUJVRwotCWlmIChjb2RlID09IE5VTEwgfHwgZ2xvYmFscyA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2soZ2xvYmFscykgfHwKLQkgICAgKGxvY2FscyAhPSBOVUxMICYmICFQeU1hcHBpbmdfQ2hlY2sobG9jYWxzKSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoY29kZSA9PSBOVUxMIHx8IGdsb2JhbHMgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKGdsb2JhbHMpIHx8CisgICAgICAgIChsb2NhbHMgIT0gTlVMTCAmJiAhUHlNYXBwaW5nX0NoZWNrKGxvY2FscykpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlpZiAoYmFjayA9PSBOVUxMIHx8IGJhY2stPmZfZ2xvYmFscyAhPSBnbG9iYWxzKSB7Ci0JCWJ1aWx0aW5zID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgYnVpbHRpbl9vYmplY3QpOwotCQlpZiAoYnVpbHRpbnMpIHsKLQkJCWlmIChQeU1vZHVsZV9DaGVjayhidWlsdGlucykpIHsKLQkJCQlidWlsdGlucyA9IFB5TW9kdWxlX0dldERpY3QoYnVpbHRpbnMpOwotCQkJCWFzc2VydCghYnVpbHRpbnMgfHwgUHlEaWN0X0NoZWNrKGJ1aWx0aW5zKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICghUHlEaWN0X0NoZWNrKGJ1aWx0aW5zKSkKLQkJCQlidWlsdGlucyA9IE5VTEw7Ci0JCX0KLQkJaWYgKGJ1aWx0aW5zID09IE5VTEwpIHsKLQkJCS8qIE5vIGJ1aWx0aW5zIQkgTWFrZSB1cCBhIG1pbmltYWwgb25lCi0JCQkgICBHaXZlIHRoZW0gJ05vbmUnLCBhdCBsZWFzdC4gKi8KLQkJCWJ1aWx0aW5zID0gUHlEaWN0X05ldygpOwotCQkJaWYgKGJ1aWx0aW5zID09IE5VTEwgfHwKLQkJCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZygKLQkJCQkgICAgYnVpbHRpbnMsICJOb25lIiwgUHlfTm9uZSkgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVsc2UKLQkJCVB5X0lOQ1JFRihidWlsdGlucyk7CisgICAgaWYgKGJhY2sgPT0gTlVMTCB8fCBiYWNrLT5mX2dsb2JhbHMgIT0gZ2xvYmFscykgeworICAgICAgICBidWlsdGlucyA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIGJ1aWx0aW5fb2JqZWN0KTsKKyAgICAgICAgaWYgKGJ1aWx0aW5zKSB7CisgICAgICAgICAgICBpZiAoUHlNb2R1bGVfQ2hlY2soYnVpbHRpbnMpKSB7CisgICAgICAgICAgICAgICAgYnVpbHRpbnMgPSBQeU1vZHVsZV9HZXREaWN0KGJ1aWx0aW5zKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIWJ1aWx0aW5zIHx8IFB5RGljdF9DaGVjayhidWlsdGlucykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIVB5RGljdF9DaGVjayhidWlsdGlucykpCisgICAgICAgICAgICAgICAgYnVpbHRpbnMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChidWlsdGlucyA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBObyBidWlsdGlucyEgICAgICAgICAgICAgIE1ha2UgdXAgYSBtaW5pbWFsIG9uZQorICAgICAgICAgICAgICAgR2l2ZSB0aGVtICdOb25lJywgYXQgbGVhc3QuICovCisgICAgICAgICAgICBidWlsdGlucyA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgICAgIGlmIChidWlsdGlucyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5zLCAiTm9uZSIsIFB5X05vbmUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9JTkNSRUYoYnVpbHRpbnMpOwogCi0JfQotCWVsc2UgewotCQkvKiBJZiB3ZSBzaGFyZSB0aGUgZ2xvYmFscywgd2Ugc2hhcmUgdGhlIGJ1aWx0aW5zLgotCQkgICBTYXZlIGEgbG9va3VwIGFuZCBhIGNhbGwuICovCi0JCWJ1aWx0aW5zID0gYmFjay0+Zl9idWlsdGluczsKLQkJYXNzZXJ0KGJ1aWx0aW5zICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGJ1aWx0aW5zKSk7Ci0JCVB5X0lOQ1JFRihidWlsdGlucyk7Ci0JfQotCWlmIChjb2RlLT5jb196b21iaWVmcmFtZSAhPSBOVUxMKSB7Ci0JCWYgPSBjb2RlLT5jb196b21iaWVmcmFtZTsKLQkJY29kZS0+Y29fem9tYmllZnJhbWUgPSBOVUxMOwotCQlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKWYpOwotCQlhc3NlcnQoZi0+Zl9jb2RlID09IGNvZGUpOwotCX0KLQllbHNlIHsKLQkJUHlfc3NpemVfdCBleHRyYXMsIG5jZWxscywgbmZyZWVzOwotCQluY2VsbHMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvZGUtPmNvX2NlbGx2YXJzKTsKLQkJbmZyZWVzID0gUHlUdXBsZV9HRVRfU0laRShjb2RlLT5jb19mcmVldmFycyk7Ci0JCWV4dHJhcyA9IGNvZGUtPmNvX3N0YWNrc2l6ZSArIGNvZGUtPmNvX25sb2NhbHMgKyBuY2VsbHMgKwotCQkgICAgbmZyZWVzOwotCQlpZiAoZnJlZV9saXN0ID09IE5VTEwpIHsKLQkJICAgIGYgPSBQeU9iamVjdF9HQ19OZXdWYXIoUHlGcmFtZU9iamVjdCwgJlB5RnJhbWVfVHlwZSwKLQkJCWV4dHJhcyk7Ci0JCSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0JCQkgICAgUHlfREVDUkVGKGJ1aWx0aW5zKTsKLQkJCSAgICByZXR1cm4gTlVMTDsKLQkJICAgIH0KLQkJfQotCQllbHNlIHsKLQkJICAgIGFzc2VydChudW1mcmVlID4gMCk7Ci0JCSAgICAtLW51bWZyZWU7Ci0JCSAgICBmID0gZnJlZV9saXN0OwotCQkgICAgZnJlZV9saXN0ID0gZnJlZV9saXN0LT5mX2JhY2s7Ci0JCSAgICBpZiAoUHlfU0laRShmKSA8IGV4dHJhcykgewotCQkJICAgIGYgPSBQeU9iamVjdF9HQ19SZXNpemUoUHlGcmFtZU9iamVjdCwgZiwgZXh0cmFzKTsKLQkJCSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0JCQkJICAgIFB5X0RFQ1JFRihidWlsdGlucyk7Ci0JCQkJICAgIHJldHVybiBOVUxMOwotCQkJICAgIH0KLQkJICAgIH0KLQkJICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopZik7Ci0JCX0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIElmIHdlIHNoYXJlIHRoZSBnbG9iYWxzLCB3ZSBzaGFyZSB0aGUgYnVpbHRpbnMuCisgICAgICAgICAgIFNhdmUgYSBsb29rdXAgYW5kIGEgY2FsbC4gKi8KKyAgICAgICAgYnVpbHRpbnMgPSBiYWNrLT5mX2J1aWx0aW5zOworICAgICAgICBhc3NlcnQoYnVpbHRpbnMgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soYnVpbHRpbnMpKTsKKyAgICAgICAgUHlfSU5DUkVGKGJ1aWx0aW5zKTsKKyAgICB9CisgICAgaWYgKGNvZGUtPmNvX3pvbWJpZWZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgZiA9IGNvZGUtPmNvX3pvbWJpZWZyYW1lOworICAgICAgICBjb2RlLT5jb196b21iaWVmcmFtZSA9IE5VTEw7CisgICAgICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopZik7CisgICAgICAgIGFzc2VydChmLT5mX2NvZGUgPT0gY29kZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9zc2l6ZV90IGV4dHJhcywgbmNlbGxzLCBuZnJlZXM7CisgICAgICAgIG5jZWxscyA9IFB5VHVwbGVfR0VUX1NJWkUoY29kZS0+Y29fY2VsbHZhcnMpOworICAgICAgICBuZnJlZXMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvZGUtPmNvX2ZyZWV2YXJzKTsKKyAgICAgICAgZXh0cmFzID0gY29kZS0+Y29fc3RhY2tzaXplICsgY29kZS0+Y29fbmxvY2FscyArIG5jZWxscyArCisgICAgICAgICAgICBuZnJlZXM7CisgICAgICAgIGlmIChmcmVlX2xpc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgZiA9IFB5T2JqZWN0X0dDX05ld1ZhcihQeUZyYW1lT2JqZWN0LCAmUHlGcmFtZV9UeXBlLAorICAgICAgICAgICAgZXh0cmFzKTsKKyAgICAgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYnVpbHRpbnMpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KG51bWZyZWUgPiAwKTsKKyAgICAgICAgICAgIC0tbnVtZnJlZTsKKyAgICAgICAgICAgIGYgPSBmcmVlX2xpc3Q7CisgICAgICAgICAgICBmcmVlX2xpc3QgPSBmcmVlX2xpc3QtPmZfYmFjazsKKyAgICAgICAgICAgIGlmIChQeV9TSVpFKGYpIDwgZXh0cmFzKSB7CisgICAgICAgICAgICAgICAgZiA9IFB5T2JqZWN0X0dDX1Jlc2l6ZShQeUZyYW1lT2JqZWN0LCBmLCBleHRyYXMpOworICAgICAgICAgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGJ1aWx0aW5zKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilmKTsKKyAgICAgICAgfQogCi0JCWYtPmZfY29kZSA9IGNvZGU7Ci0JCWV4dHJhcyA9IGNvZGUtPmNvX25sb2NhbHMgKyBuY2VsbHMgKyBuZnJlZXM7Ci0JCWYtPmZfdmFsdWVzdGFjayA9IGYtPmZfbG9jYWxzcGx1cyArIGV4dHJhczsKLQkJZm9yIChpPTA7IGk8ZXh0cmFzOyBpKyspCi0JCQlmLT5mX2xvY2Fsc3BsdXNbaV0gPSBOVUxMOwotCQlmLT5mX2xvY2FscyA9IE5VTEw7Ci0JCWYtPmZfdHJhY2UgPSBOVUxMOwotCQlmLT5mX2V4Y190eXBlID0gZi0+Zl9leGNfdmFsdWUgPSBmLT5mX2V4Y190cmFjZWJhY2sgPSBOVUxMOwotCX0KLQlmLT5mX3N0YWNrdG9wID0gZi0+Zl92YWx1ZXN0YWNrOwotCWYtPmZfYnVpbHRpbnMgPSBidWlsdGluczsKLQlQeV9YSU5DUkVGKGJhY2spOwotCWYtPmZfYmFjayA9IGJhY2s7Ci0JUHlfSU5DUkVGKGNvZGUpOwotCVB5X0lOQ1JFRihnbG9iYWxzKTsKLQlmLT5mX2dsb2JhbHMgPSBnbG9iYWxzOwotCS8qIE1vc3QgZnVuY3Rpb25zIGhhdmUgQ09fTkVXTE9DQUxTIGFuZCBDT19PUFRJTUlaRUQgc2V0LiAqLwotCWlmICgoY29kZS0+Y29fZmxhZ3MgJiAoQ09fTkVXTE9DQUxTIHwgQ09fT1BUSU1JWkVEKSkgPT0KLQkJKENPX05FV0xPQ0FMUyB8IENPX09QVElNSVpFRCkpCi0JCTsgLyogZl9sb2NhbHMgPSBOVUxMOyB3aWxsIGJlIHNldCBieSBQeUZyYW1lX0Zhc3RUb0xvY2FscygpICovCi0JZWxzZSBpZiAoY29kZS0+Y29fZmxhZ3MgJiBDT19ORVdMT0NBTFMpIHsKLQkJbG9jYWxzID0gUHlEaWN0X05ldygpOwotCQlpZiAobG9jYWxzID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWYtPmZfbG9jYWxzID0gbG9jYWxzOwotCX0KLQllbHNlIHsKLQkJaWYgKGxvY2FscyA9PSBOVUxMKQotCQkJbG9jYWxzID0gZ2xvYmFsczsKLQkJUHlfSU5DUkVGKGxvY2Fscyk7Ci0JCWYtPmZfbG9jYWxzID0gbG9jYWxzOwotCX0KLQlmLT5mX3RzdGF0ZSA9IHRzdGF0ZTsKKyAgICAgICAgZi0+Zl9jb2RlID0gY29kZTsKKyAgICAgICAgZXh0cmFzID0gY29kZS0+Y29fbmxvY2FscyArIG5jZWxscyArIG5mcmVlczsKKyAgICAgICAgZi0+Zl92YWx1ZXN0YWNrID0gZi0+Zl9sb2NhbHNwbHVzICsgZXh0cmFzOworICAgICAgICBmb3IgKGk9MDsgaTxleHRyYXM7IGkrKykKKyAgICAgICAgICAgIGYtPmZfbG9jYWxzcGx1c1tpXSA9IE5VTEw7CisgICAgICAgIGYtPmZfbG9jYWxzID0gTlVMTDsKKyAgICAgICAgZi0+Zl90cmFjZSA9IE5VTEw7CisgICAgICAgIGYtPmZfZXhjX3R5cGUgPSBmLT5mX2V4Y192YWx1ZSA9IGYtPmZfZXhjX3RyYWNlYmFjayA9IE5VTEw7CisgICAgfQorICAgIGYtPmZfc3RhY2t0b3AgPSBmLT5mX3ZhbHVlc3RhY2s7CisgICAgZi0+Zl9idWlsdGlucyA9IGJ1aWx0aW5zOworICAgIFB5X1hJTkNSRUYoYmFjayk7CisgICAgZi0+Zl9iYWNrID0gYmFjazsKKyAgICBQeV9JTkNSRUYoY29kZSk7CisgICAgUHlfSU5DUkVGKGdsb2JhbHMpOworICAgIGYtPmZfZ2xvYmFscyA9IGdsb2JhbHM7CisgICAgLyogTW9zdCBmdW5jdGlvbnMgaGF2ZSBDT19ORVdMT0NBTFMgYW5kIENPX09QVElNSVpFRCBzZXQuICovCisgICAgaWYgKChjb2RlLT5jb19mbGFncyAmIChDT19ORVdMT0NBTFMgfCBDT19PUFRJTUlaRUQpKSA9PQorICAgICAgICAoQ09fTkVXTE9DQUxTIHwgQ09fT1BUSU1JWkVEKSkKKyAgICAgICAgOyAvKiBmX2xvY2FscyA9IE5VTEw7IHdpbGwgYmUgc2V0IGJ5IFB5RnJhbWVfRmFzdFRvTG9jYWxzKCkgKi8KKyAgICBlbHNlIGlmIChjb2RlLT5jb19mbGFncyAmIENPX05FV0xPQ0FMUykgeworICAgICAgICBsb2NhbHMgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChsb2NhbHMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZi0+Zl9sb2NhbHMgPSBsb2NhbHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobG9jYWxzID09IE5VTEwpCisgICAgICAgICAgICBsb2NhbHMgPSBnbG9iYWxzOworICAgICAgICBQeV9JTkNSRUYobG9jYWxzKTsKKyAgICAgICAgZi0+Zl9sb2NhbHMgPSBsb2NhbHM7CisgICAgfQorICAgIGYtPmZfdHN0YXRlID0gdHN0YXRlOwogCi0JZi0+Zl9sYXN0aSA9IC0xOwotCWYtPmZfbGluZW5vID0gY29kZS0+Y29fZmlyc3RsaW5lbm87Ci0JZi0+Zl9pYmxvY2sgPSAwOworICAgIGYtPmZfbGFzdGkgPSAtMTsKKyAgICBmLT5mX2xpbmVubyA9IGNvZGUtPmNvX2ZpcnN0bGluZW5vOworICAgIGYtPmZfaWJsb2NrID0gMDsKIAotCV9QeU9iamVjdF9HQ19UUkFDSyhmKTsKLQlyZXR1cm4gZjsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soZik7CisgICAgcmV0dXJuIGY7CiB9CiAKIC8qIEJsb2NrIG1hbmFnZW1lbnQgKi8KQEAgLTc0OCwyOCArNzQ4LDI4IEBACiB2b2lkCiBQeUZyYW1lX0Jsb2NrU2V0dXAoUHlGcmFtZU9iamVjdCAqZiwgaW50IHR5cGUsIGludCBoYW5kbGVyLCBpbnQgbGV2ZWwpCiB7Ci0JUHlUcnlCbG9jayAqYjsKLQlpZiAoZi0+Zl9pYmxvY2sgPj0gQ09fTUFYQkxPQ0tTKQotCQlQeV9GYXRhbEVycm9yKCJYWFggYmxvY2sgc3RhY2sgb3ZlcmZsb3ciKTsKLQliID0gJmYtPmZfYmxvY2tzdGFja1tmLT5mX2libG9jaysrXTsKLQliLT5iX3R5cGUgPSB0eXBlOwotCWItPmJfbGV2ZWwgPSBsZXZlbDsKLQliLT5iX2hhbmRsZXIgPSBoYW5kbGVyOworICAgIFB5VHJ5QmxvY2sgKmI7CisgICAgaWYgKGYtPmZfaWJsb2NrID49IENPX01BWEJMT0NLUykKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiWFhYIGJsb2NrIHN0YWNrIG92ZXJmbG93Iik7CisgICAgYiA9ICZmLT5mX2Jsb2Nrc3RhY2tbZi0+Zl9pYmxvY2srK107CisgICAgYi0+Yl90eXBlID0gdHlwZTsKKyAgICBiLT5iX2xldmVsID0gbGV2ZWw7CisgICAgYi0+Yl9oYW5kbGVyID0gaGFuZGxlcjsKIH0KIAogUHlUcnlCbG9jayAqCiBQeUZyYW1lX0Jsb2NrUG9wKFB5RnJhbWVPYmplY3QgKmYpCiB7Ci0JUHlUcnlCbG9jayAqYjsKLQlpZiAoZi0+Zl9pYmxvY2sgPD0gMCkKLQkJUHlfRmF0YWxFcnJvcigiWFhYIGJsb2NrIHN0YWNrIHVuZGVyZmxvdyIpOwotCWIgPSAmZi0+Zl9ibG9ja3N0YWNrWy0tZi0+Zl9pYmxvY2tdOwotCXJldHVybiBiOworICAgIFB5VHJ5QmxvY2sgKmI7CisgICAgaWYgKGYtPmZfaWJsb2NrIDw9IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlhYWCBibG9jayBzdGFjayB1bmRlcmZsb3ciKTsKKyAgICBiID0gJmYtPmZfYmxvY2tzdGFja1stLWYtPmZfaWJsb2NrXTsKKyAgICByZXR1cm4gYjsKIH0KIAogLyogQ29udmVydCBiZXR3ZWVuICJmYXN0IiB2ZXJzaW9uIG9mIGxvY2FscyBhbmQgZGljdGlvbmFyeSB2ZXJzaW9uLgotICAgCi0gICBtYXAgYW5kIHZhbHVlcyBhcmUgaW5wdXQgYXJndW1lbnRzLgltYXAgaXMgYSB0dXBsZSBvZiBzdHJpbmdzLgorCisgICBtYXAgYW5kIHZhbHVlcyBhcmUgaW5wdXQgYXJndW1lbnRzLiAgbWFwIGlzIGEgdHVwbGUgb2Ygc3RyaW5ncy4KICAgIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBQeU9iamVjdCouICBBdCBpbmRleCBpLCBtYXBbaV0gaXMgdGhlIG5hbWUgb2YKICAgIHRoZSB2YXJpYWJsZSB3aXRoIHZhbHVlIHZhbHVlc1tpXS4gIFRoZSBmdW5jdGlvbiBjb3BpZXMgdGhlIGZpcnN0CiAgICBubWFwIHZhcmlhYmxlIGZyb20gbWFwL3ZhbHVlcyBpbnRvIGRpY3QuICBJZiB2YWx1ZXNbaV0gaXMgTlVMTCwKQEAgLTc4NSwyOSArNzg1LDI5IEBACiAKIHN0YXRpYyB2b2lkCiBtYXBfdG9fZGljdChQeU9iamVjdCAqbWFwLCBQeV9zc2l6ZV90IG5tYXAsIFB5T2JqZWN0ICpkaWN0LCBQeU9iamVjdCAqKnZhbHVlcywKLQkgICAgaW50IGRlcmVmKQorICAgICAgICAgICAgaW50IGRlcmVmKQogewotCVB5X3NzaXplX3QgajsKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhtYXApKTsKLQlhc3NlcnQoUHlEaWN0X0NoZWNrKGRpY3QpKTsKLQlhc3NlcnQoUHlUdXBsZV9TaXplKG1hcCkgPj0gbm1hcCk7Ci0JZm9yIChqID0gbm1hcDsgLS1qID49IDA7ICkgewotCQlQeU9iamVjdCAqa2V5ID0gUHlUdXBsZV9HRVRfSVRFTShtYXAsIGopOwotCQlQeU9iamVjdCAqdmFsdWUgPSB2YWx1ZXNbal07Ci0JCWFzc2VydChQeVN0cmluZ19DaGVjayhrZXkpKTsKLQkJaWYgKGRlcmVmKSB7Ci0JCQlhc3NlcnQoUHlDZWxsX0NoZWNrKHZhbHVlKSk7Ci0JCQl2YWx1ZSA9IFB5Q2VsbF9HRVQodmFsdWUpOwotCQl9Ci0JCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlPYmplY3RfRGVsSXRlbShkaWN0LCBrZXkpICE9IDApCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChQeU9iamVjdF9TZXRJdGVtKGRpY3QsIGtleSwgdmFsdWUpICE9IDApCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCX0KKyAgICBQeV9zc2l6ZV90IGo7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2sobWFwKSk7CisgICAgYXNzZXJ0KFB5RGljdF9DaGVjayhkaWN0KSk7CisgICAgYXNzZXJ0KFB5VHVwbGVfU2l6ZShtYXApID49IG5tYXApOworICAgIGZvciAoaiA9IG5tYXA7IC0taiA+PSAwOyApIHsKKyAgICAgICAgUHlPYmplY3QgKmtleSA9IFB5VHVwbGVfR0VUX0lURU0obWFwLCBqKTsKKyAgICAgICAgUHlPYmplY3QgKnZhbHVlID0gdmFsdWVzW2pdOworICAgICAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2soa2V5KSk7CisgICAgICAgIGlmIChkZXJlZikgeworICAgICAgICAgICAgYXNzZXJ0KFB5Q2VsbF9DaGVjayh2YWx1ZSkpOworICAgICAgICAgICAgdmFsdWUgPSBQeUNlbGxfR0VUKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5T2JqZWN0X0RlbEl0ZW0oZGljdCwga2V5KSAhPSAwKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0SXRlbShkaWN0LCBrZXksIHZhbHVlKSAhPSAwKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIC8qIENvcHkgdmFsdWVzIGZyb20gdGhlICJsb2NhbHMiIGRpY3QgaW50byB0aGUgZmFzdCBsb2NhbHMuCkBAIC04MTUsNyArODE1LDcgQEAKICAgIGRpY3QgaXMgYW4gaW5wdXQgYXJndW1lbnQgY29udGFpbmluZyBzdHJpbmcga2V5cyByZXByZXNlbnRpbmcKICAgIHZhcmlhYmxlcyBuYW1lcyBhbmQgYXJiaXRyYXJ5IFB5T2JqZWN0KiBhcyB2YWx1ZXMuCiAKLSAgIG1hcCBhbmQgdmFsdWVzIGFyZSBpbnB1dCBhcmd1bWVudHMuCW1hcCBpcyBhIHR1cGxlIG9mIHN0cmluZ3MuCisgICBtYXAgYW5kIHZhbHVlcyBhcmUgaW5wdXQgYXJndW1lbnRzLiAgbWFwIGlzIGEgdHVwbGUgb2Ygc3RyaW5ncy4KICAgIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBQeU9iamVjdCouICBBdCBpbmRleCBpLCBtYXBbaV0gaXMgdGhlIG5hbWUgb2YKICAgIHRoZSB2YXJpYWJsZSB3aXRoIHZhbHVlIHZhbHVlc1tpXS4gIFRoZSBmdW5jdGlvbiBjb3BpZXMgdGhlIGZpcnN0CiAgICBubWFwIHZhcmlhYmxlIGZyb20gbWFwL3ZhbHVlcyBpbnRvIGRpY3QuICBJZiB2YWx1ZXNbaV0gaXMgTlVMTCwKQEAgLTgzMywxNTAgKzgzMywxNTAgQEAKIAogc3RhdGljIHZvaWQKIGRpY3RfdG9fbWFwKFB5T2JqZWN0ICptYXAsIFB5X3NzaXplX3Qgbm1hcCwgUHlPYmplY3QgKmRpY3QsIFB5T2JqZWN0ICoqdmFsdWVzLAotCSAgICBpbnQgZGVyZWYsIGludCBjbGVhcikKKyAgICAgICAgICAgIGludCBkZXJlZiwgaW50IGNsZWFyKQogewotCVB5X3NzaXplX3QgajsKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhtYXApKTsKLQlhc3NlcnQoUHlEaWN0X0NoZWNrKGRpY3QpKTsKLQlhc3NlcnQoUHlUdXBsZV9TaXplKG1hcCkgPj0gbm1hcCk7Ci0JZm9yIChqID0gbm1hcDsgLS1qID49IDA7ICkgewotCQlQeU9iamVjdCAqa2V5ID0gUHlUdXBsZV9HRVRfSVRFTShtYXAsIGopOwotCQlQeU9iamVjdCAqdmFsdWUgPSBQeU9iamVjdF9HZXRJdGVtKGRpY3QsIGtleSk7Ci0JCWFzc2VydChQeVN0cmluZ19DaGVjayhrZXkpKTsKLQkJLyogV2Ugb25seSBjYXJlIGFib3V0IE5VTExzIGlmIGNsZWFyIGlzIHRydWUuICovCi0JCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJaWYgKCFjbGVhcikKLQkJCQljb250aW51ZTsKLQkJfQotCQlpZiAoZGVyZWYpIHsKLQkJCWFzc2VydChQeUNlbGxfQ2hlY2sodmFsdWVzW2pdKSk7Ci0JCQlpZiAoUHlDZWxsX0dFVCh2YWx1ZXNbal0pICE9IHZhbHVlKSB7Ci0JCQkJaWYgKFB5Q2VsbF9TZXQodmFsdWVzW2pdLCB2YWx1ZSkgPCAwKQotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJfQotCQl9IGVsc2UgaWYgKHZhbHVlc1tqXSAhPSB2YWx1ZSkgewotCQkJUHlfWElOQ1JFRih2YWx1ZSk7Ci0JCQlQeV9YREVDUkVGKHZhbHVlc1tqXSk7Ci0JCQl2YWx1ZXNbal0gPSB2YWx1ZTsKLQkJfQotCQlQeV9YREVDUkVGKHZhbHVlKTsKLQl9CisgICAgUHlfc3NpemVfdCBqOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKG1hcCkpOworICAgIGFzc2VydChQeURpY3RfQ2hlY2soZGljdCkpOworICAgIGFzc2VydChQeVR1cGxlX1NpemUobWFwKSA+PSBubWFwKTsKKyAgICBmb3IgKGogPSBubWFwOyAtLWogPj0gMDsgKSB7CisgICAgICAgIFB5T2JqZWN0ICprZXkgPSBQeVR1cGxlX0dFVF9JVEVNKG1hcCwgaik7CisgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IFB5T2JqZWN0X0dldEl0ZW0oZGljdCwga2V5KTsKKyAgICAgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGtleSkpOworICAgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgTlVMTHMgaWYgY2xlYXIgaXMgdHJ1ZS4gKi8KKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBpZiAoIWNsZWFyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChkZXJlZikgeworICAgICAgICAgICAgYXNzZXJ0KFB5Q2VsbF9DaGVjayh2YWx1ZXNbal0pKTsKKyAgICAgICAgICAgIGlmIChQeUNlbGxfR0VUKHZhbHVlc1tqXSkgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlDZWxsX1NldCh2YWx1ZXNbal0sIHZhbHVlKSA8IDApCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWVzW2pdICE9IHZhbHVlKSB7CisgICAgICAgICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodmFsdWVzW2pdKTsKKyAgICAgICAgICAgIHZhbHVlc1tqXSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYodmFsdWUpOworICAgIH0KIH0KIAogdm9pZAogUHlGcmFtZV9GYXN0VG9Mb2NhbHMoUHlGcmFtZU9iamVjdCAqZikKIHsKLQkvKiBNZXJnZSBmYXN0IGxvY2FscyBpbnRvIGYtPmZfbG9jYWxzICovCi0JUHlPYmplY3QgKmxvY2FscywgKm1hcDsKLQlQeU9iamVjdCAqKmZhc3Q7Ci0JUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5X3NzaXplX3QgajsKLQlpbnQgbmNlbGxzLCBuZnJlZXZhcnM7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWxvY2FscyA9IGYtPmZfbG9jYWxzOwotCWlmIChsb2NhbHMgPT0gTlVMTCkgewotCQlsb2NhbHMgPSBmLT5mX2xvY2FscyA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKGxvY2FscyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOyAvKiBDYW4ndCByZXBvcnQgaXQgOi0oICovCi0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JY28gPSBmLT5mX2NvZGU7Ci0JbWFwID0gY28tPmNvX3Zhcm5hbWVzOwotCWlmICghUHlUdXBsZV9DaGVjayhtYXApKQotCQlyZXR1cm47Ci0JUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7Ci0JZmFzdCA9IGYtPmZfbG9jYWxzcGx1czsKLQlqID0gUHlUdXBsZV9HRVRfU0laRShtYXApOwotCWlmIChqID4gY28tPmNvX25sb2NhbHMpCi0JCWogPSBjby0+Y29fbmxvY2FsczsKLQlpZiAoY28tPmNvX25sb2NhbHMpCi0JCW1hcF90b19kaWN0KG1hcCwgaiwgbG9jYWxzLCBmYXN0LCAwKTsKLQluY2VsbHMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycyk7Ci0JbmZyZWV2YXJzID0gUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOwotCWlmIChuY2VsbHMgfHwgbmZyZWV2YXJzKSB7Ci0JCW1hcF90b19kaWN0KGNvLT5jb19jZWxsdmFycywgbmNlbGxzLAotCQkJICAgIGxvY2FscywgZmFzdCArIGNvLT5jb19ubG9jYWxzLCAxKTsKLQkJLyogSWYgdGhlIG5hbWVzcGFjZSBpcyB1bm9wdGltaXplZCwgdGhlbiBvbmUgb2YgdGhlIAotCQkgICBmb2xsb3dpbmcgY2FzZXMgYXBwbGllczoKLQkJICAgMS4gSXQgZG9lcyBub3QgY29udGFpbiBmcmVlIHZhcmlhYmxlcywgYmVjYXVzZSBpdAotCQkgICAgICB1c2VzIGltcG9ydCAqIG9yIGlzIGEgdG9wLWxldmVsIG5hbWVzcGFjZS4KLQkJICAgMi4gSXQgaXMgYSBjbGFzcyBuYW1lc3BhY2UuCi0JCSAgIFdlIGRvbid0IHdhbnQgdG8gYWNjaWRlbnRhbGx5IGNvcHkgZnJlZSB2YXJpYWJsZXMKLQkJICAgaW50byB0aGUgbG9jYWxzIGRpY3QgdXNlZCBieSB0aGUgY2xhc3MuCi0JCSovCi0JCWlmIChjby0+Y29fZmxhZ3MgJiBDT19PUFRJTUlaRUQpIHsKLQkJCW1hcF90b19kaWN0KGNvLT5jb19mcmVldmFycywgbmZyZWV2YXJzLAotCQkJCSAgICBsb2NhbHMsIGZhc3QgKyBjby0+Y29fbmxvY2FscyArIG5jZWxscywgMSk7Ci0JCX0KLQl9Ci0JUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKKyAgICAvKiBNZXJnZSBmYXN0IGxvY2FscyBpbnRvIGYtPmZfbG9jYWxzICovCisgICAgUHlPYmplY3QgKmxvY2FscywgKm1hcDsKKyAgICBQeU9iamVjdCAqKmZhc3Q7CisgICAgUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIFB5X3NzaXplX3QgajsKKyAgICBpbnQgbmNlbGxzLCBuZnJlZXZhcnM7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGxvY2FscyA9IGYtPmZfbG9jYWxzOworICAgIGlmIChsb2NhbHMgPT0gTlVMTCkgeworICAgICAgICBsb2NhbHMgPSBmLT5mX2xvY2FscyA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGxvY2FscyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBDYW4ndCByZXBvcnQgaXQgOi0oICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgY28gPSBmLT5mX2NvZGU7CisgICAgbWFwID0gY28tPmNvX3Zhcm5hbWVzOworICAgIGlmICghUHlUdXBsZV9DaGVjayhtYXApKQorICAgICAgICByZXR1cm47CisgICAgUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisgICAgZmFzdCA9IGYtPmZfbG9jYWxzcGx1czsKKyAgICBqID0gUHlUdXBsZV9HRVRfU0laRShtYXApOworICAgIGlmIChqID4gY28tPmNvX25sb2NhbHMpCisgICAgICAgIGogPSBjby0+Y29fbmxvY2FsczsKKyAgICBpZiAoY28tPmNvX25sb2NhbHMpCisgICAgICAgIG1hcF90b19kaWN0KG1hcCwgaiwgbG9jYWxzLCBmYXN0LCAwKTsKKyAgICBuY2VsbHMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycyk7CisgICAgbmZyZWV2YXJzID0gUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOworICAgIGlmIChuY2VsbHMgfHwgbmZyZWV2YXJzKSB7CisgICAgICAgIG1hcF90b19kaWN0KGNvLT5jb19jZWxsdmFycywgbmNlbGxzLAorICAgICAgICAgICAgICAgICAgICBsb2NhbHMsIGZhc3QgKyBjby0+Y29fbmxvY2FscywgMSk7CisgICAgICAgIC8qIElmIHRoZSBuYW1lc3BhY2UgaXMgdW5vcHRpbWl6ZWQsIHRoZW4gb25lIG9mIHRoZQorICAgICAgICAgICBmb2xsb3dpbmcgY2FzZXMgYXBwbGllczoKKyAgICAgICAgICAgMS4gSXQgZG9lcyBub3QgY29udGFpbiBmcmVlIHZhcmlhYmxlcywgYmVjYXVzZSBpdAorICAgICAgICAgICAgICB1c2VzIGltcG9ydCAqIG9yIGlzIGEgdG9wLWxldmVsIG5hbWVzcGFjZS4KKyAgICAgICAgICAgMi4gSXQgaXMgYSBjbGFzcyBuYW1lc3BhY2UuCisgICAgICAgICAgIFdlIGRvbid0IHdhbnQgdG8gYWNjaWRlbnRhbGx5IGNvcHkgZnJlZSB2YXJpYWJsZXMKKyAgICAgICAgICAgaW50byB0aGUgbG9jYWxzIGRpY3QgdXNlZCBieSB0aGUgY2xhc3MuCisgICAgICAgICovCisgICAgICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19PUFRJTUlaRUQpIHsKKyAgICAgICAgICAgIG1hcF90b19kaWN0KGNvLT5jb19mcmVldmFycywgbmZyZWV2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxzLCBmYXN0ICsgY28tPmNvX25sb2NhbHMgKyBuY2VsbHMsIDEpOworICAgICAgICB9CisgICAgfQorICAgIFB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7CiB9CiAKIHZvaWQKIFB5RnJhbWVfTG9jYWxzVG9GYXN0KFB5RnJhbWVPYmplY3QgKmYsIGludCBjbGVhcikKIHsKLQkvKiBNZXJnZSBmLT5mX2xvY2FscyBpbnRvIGZhc3QgbG9jYWxzICovCi0JUHlPYmplY3QgKmxvY2FscywgKm1hcDsKLQlQeU9iamVjdCAqKmZhc3Q7Ci0JUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5X3NzaXplX3QgajsKLQlpbnQgbmNlbGxzLCBuZnJlZXZhcnM7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWxvY2FscyA9IGYtPmZfbG9jYWxzOwotCWNvID0gZi0+Zl9jb2RlOwotCW1hcCA9IGNvLT5jb192YXJuYW1lczsKLQlpZiAobG9jYWxzID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAoIVB5VHVwbGVfQ2hlY2sobWFwKSkKLQkJcmV0dXJuOwotCVB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwotCWZhc3QgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JaiA9IFB5VHVwbGVfR0VUX1NJWkUobWFwKTsKLQlpZiAoaiA+IGNvLT5jb19ubG9jYWxzKQotCQlqID0gY28tPmNvX25sb2NhbHM7Ci0JaWYgKGNvLT5jb19ubG9jYWxzKQotCSAgICBkaWN0X3RvX21hcChjby0+Y29fdmFybmFtZXMsIGosIGxvY2FscywgZmFzdCwgMCwgY2xlYXIpOwotCW5jZWxscyA9IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKTsKLQluZnJlZXZhcnMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19mcmVldmFycyk7Ci0JaWYgKG5jZWxscyB8fCBuZnJlZXZhcnMpIHsKLQkJZGljdF90b19tYXAoY28tPmNvX2NlbGx2YXJzLCBuY2VsbHMsCi0JCQkgICAgbG9jYWxzLCBmYXN0ICsgY28tPmNvX25sb2NhbHMsIDEsIGNsZWFyKTsKLQkJLyogU2FtZSB0ZXN0IGFzIGluIFB5RnJhbWVfRmFzdFRvTG9jYWxzKCkgYWJvdmUuICovCi0JCWlmIChjby0+Y29fZmxhZ3MgJiBDT19PUFRJTUlaRUQpIHsKLQkJCWRpY3RfdG9fbWFwKGNvLT5jb19mcmVldmFycywgbmZyZWV2YXJzLAotCQkJICAgICAgICBsb2NhbHMsIGZhc3QgKyBjby0+Y29fbmxvY2FscyArIG5jZWxscywgMSwgCi0JCQkgICAgICAgIGNsZWFyKTsKLQkJfQotCX0KLQlQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOworICAgIC8qIE1lcmdlIGYtPmZfbG9jYWxzIGludG8gZmFzdCBsb2NhbHMgKi8KKyAgICBQeU9iamVjdCAqbG9jYWxzLCAqbWFwOworICAgIFB5T2JqZWN0ICoqZmFzdDsKKyAgICBQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgUHlfc3NpemVfdCBqOworICAgIGludCBuY2VsbHMsIG5mcmVldmFyczsKKyAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgbG9jYWxzID0gZi0+Zl9sb2NhbHM7CisgICAgY28gPSBmLT5mX2NvZGU7CisgICAgbWFwID0gY28tPmNvX3Zhcm5hbWVzOworICAgIGlmIChsb2NhbHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghUHlUdXBsZV9DaGVjayhtYXApKQorICAgICAgICByZXR1cm47CisgICAgUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisgICAgZmFzdCA9IGYtPmZfbG9jYWxzcGx1czsKKyAgICBqID0gUHlUdXBsZV9HRVRfU0laRShtYXApOworICAgIGlmIChqID4gY28tPmNvX25sb2NhbHMpCisgICAgICAgIGogPSBjby0+Y29fbmxvY2FsczsKKyAgICBpZiAoY28tPmNvX25sb2NhbHMpCisgICAgICAgIGRpY3RfdG9fbWFwKGNvLT5jb192YXJuYW1lcywgaiwgbG9jYWxzLCBmYXN0LCAwLCBjbGVhcik7CisgICAgbmNlbGxzID0gUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpOworICAgIG5mcmVldmFycyA9IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2ZyZWV2YXJzKTsKKyAgICBpZiAobmNlbGxzIHx8IG5mcmVldmFycykgeworICAgICAgICBkaWN0X3RvX21hcChjby0+Y29fY2VsbHZhcnMsIG5jZWxscywKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxzLCBmYXN0ICsgY28tPmNvX25sb2NhbHMsIDEsIGNsZWFyKTsKKyAgICAgICAgLyogU2FtZSB0ZXN0IGFzIGluIFB5RnJhbWVfRmFzdFRvTG9jYWxzKCkgYWJvdmUuICovCisgICAgICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19PUFRJTUlaRUQpIHsKKyAgICAgICAgICAgIGRpY3RfdG9fbWFwKGNvLT5jb19mcmVldmFycywgbmZyZWV2YXJzLAorICAgICAgICAgICAgICAgIGxvY2FscywgZmFzdCArIGNvLT5jb19ubG9jYWxzICsgbmNlbGxzLCAxLAorICAgICAgICAgICAgICAgIGNsZWFyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOwogfQogCiAvKiBDbGVhciBvdXQgdGhlIGZyZWUgbGlzdCAqLwogaW50CiBQeUZyYW1lX0NsZWFyRnJlZUxpc3Qodm9pZCkKIHsKLQlpbnQgZnJlZWxpc3Rfc2l6ZSA9IG51bWZyZWU7Ci0JCi0Jd2hpbGUgKGZyZWVfbGlzdCAhPSBOVUxMKSB7Ci0JCVB5RnJhbWVPYmplY3QgKmYgPSBmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IGZyZWVfbGlzdC0+Zl9iYWNrOwotCQlQeU9iamVjdF9HQ19EZWwoZik7Ci0JCS0tbnVtZnJlZTsKLQl9Ci0JYXNzZXJ0KG51bWZyZWUgPT0gMCk7Ci0JcmV0dXJuIGZyZWVsaXN0X3NpemU7CisgICAgaW50IGZyZWVsaXN0X3NpemUgPSBudW1mcmVlOworCisgICAgd2hpbGUgKGZyZWVfbGlzdCAhPSBOVUxMKSB7CisgICAgICAgIFB5RnJhbWVPYmplY3QgKmYgPSBmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IGZyZWVfbGlzdC0+Zl9iYWNrOworICAgICAgICBQeU9iamVjdF9HQ19EZWwoZik7CisgICAgICAgIC0tbnVtZnJlZTsKKyAgICB9CisgICAgYXNzZXJ0KG51bWZyZWUgPT0gMCk7CisgICAgcmV0dXJuIGZyZWVsaXN0X3NpemU7CiB9CiAKIHZvaWQKIFB5RnJhbWVfRmluaSh2b2lkKQogewotCSh2b2lkKVB5RnJhbWVfQ2xlYXJGcmVlTGlzdCgpOwotCVB5X1hERUNSRUYoYnVpbHRpbl9vYmplY3QpOwotCWJ1aWx0aW5fb2JqZWN0ID0gTlVMTDsKKyAgICAodm9pZClQeUZyYW1lX0NsZWFyRnJlZUxpc3QoKTsKKyAgICBQeV9YREVDUkVGKGJ1aWx0aW5fb2JqZWN0KTsKKyAgICBidWlsdGluX29iamVjdCA9IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2Z1bmNvYmplY3QuYyBiL09iamVjdHMvZnVuY29iamVjdC5jCmluZGV4IDA3NWY4MjAuLmFkMGY0MjcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZnVuY29iamVjdC5jCisrKyBiL09iamVjdHMvZnVuY29iamVjdC5jCkBAIC05LDE0OSArOSwxNDkgQEAKIFB5T2JqZWN0ICoKIFB5RnVuY3Rpb25fTmV3KFB5T2JqZWN0ICpjb2RlLCBQeU9iamVjdCAqZ2xvYmFscykKIHsKLQlQeUZ1bmN0aW9uT2JqZWN0ICpvcCA9IFB5T2JqZWN0X0dDX05ldyhQeUZ1bmN0aW9uT2JqZWN0LAotCQkJCQkgICAgJlB5RnVuY3Rpb25fVHlwZSk7Ci0Jc3RhdGljIFB5T2JqZWN0ICpfX25hbWVfXyA9IDA7Ci0JaWYgKG9wICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKmRvYzsKLQkJUHlPYmplY3QgKmNvbnN0czsKLQkJUHlPYmplY3QgKm1vZHVsZTsKLQkJb3AtPmZ1bmNfd2Vha3JlZmxpc3QgPSBOVUxMOwotCQlQeV9JTkNSRUYoY29kZSk7Ci0JCW9wLT5mdW5jX2NvZGUgPSBjb2RlOwotCQlQeV9JTkNSRUYoZ2xvYmFscyk7Ci0JCW9wLT5mdW5jX2dsb2JhbHMgPSBnbG9iYWxzOwotCQlvcC0+ZnVuY19uYW1lID0gKChQeUNvZGVPYmplY3QgKiljb2RlKS0+Y29fbmFtZTsKLQkJUHlfSU5DUkVGKG9wLT5mdW5jX25hbWUpOwotCQlvcC0+ZnVuY19kZWZhdWx0cyA9IE5VTEw7IC8qIE5vIGRlZmF1bHQgYXJndW1lbnRzICovCi0JCW9wLT5mdW5jX2Nsb3N1cmUgPSBOVUxMOwotCQljb25zdHMgPSAoKFB5Q29kZU9iamVjdCAqKWNvZGUpLT5jb19jb25zdHM7Ci0JCWlmIChQeVR1cGxlX1NpemUoY29uc3RzKSA+PSAxKSB7Ci0JCQlkb2MgPSBQeVR1cGxlX0dldEl0ZW0oY29uc3RzLCAwKTsKLQkJCWlmICghUHlTdHJpbmdfQ2hlY2soZG9jKSAmJiAhUHlVbmljb2RlX0NoZWNrKGRvYykpCi0JCQkJZG9jID0gUHlfTm9uZTsKLQkJfQotCQllbHNlCi0JCQlkb2MgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoZG9jKTsKLQkJb3AtPmZ1bmNfZG9jID0gZG9jOwotCQlvcC0+ZnVuY19kaWN0ID0gTlVMTDsKLQkJb3AtPmZ1bmNfbW9kdWxlID0gTlVMTDsKKyAgICBQeUZ1bmN0aW9uT2JqZWN0ICpvcCA9IFB5T2JqZWN0X0dDX05ldyhQeUZ1bmN0aW9uT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUZ1bmN0aW9uX1R5cGUpOworICAgIHN0YXRpYyBQeU9iamVjdCAqX19uYW1lX18gPSAwOworICAgIGlmIChvcCAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpkb2M7CisgICAgICAgIFB5T2JqZWN0ICpjb25zdHM7CisgICAgICAgIFB5T2JqZWN0ICptb2R1bGU7CisgICAgICAgIG9wLT5mdW5jX3dlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICAgICAgUHlfSU5DUkVGKGNvZGUpOworICAgICAgICBvcC0+ZnVuY19jb2RlID0gY29kZTsKKyAgICAgICAgUHlfSU5DUkVGKGdsb2JhbHMpOworICAgICAgICBvcC0+ZnVuY19nbG9iYWxzID0gZ2xvYmFsczsKKyAgICAgICAgb3AtPmZ1bmNfbmFtZSA9ICgoUHlDb2RlT2JqZWN0ICopY29kZSktPmNvX25hbWU7CisgICAgICAgIFB5X0lOQ1JFRihvcC0+ZnVuY19uYW1lKTsKKyAgICAgICAgb3AtPmZ1bmNfZGVmYXVsdHMgPSBOVUxMOyAvKiBObyBkZWZhdWx0IGFyZ3VtZW50cyAqLworICAgICAgICBvcC0+ZnVuY19jbG9zdXJlID0gTlVMTDsKKyAgICAgICAgY29uc3RzID0gKChQeUNvZGVPYmplY3QgKiljb2RlKS0+Y29fY29uc3RzOworICAgICAgICBpZiAoUHlUdXBsZV9TaXplKGNvbnN0cykgPj0gMSkgeworICAgICAgICAgICAgZG9jID0gUHlUdXBsZV9HZXRJdGVtKGNvbnN0cywgMCk7CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGRvYykgJiYgIVB5VW5pY29kZV9DaGVjayhkb2MpKQorICAgICAgICAgICAgICAgIGRvYyA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZG9jID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGRvYyk7CisgICAgICAgIG9wLT5mdW5jX2RvYyA9IGRvYzsKKyAgICAgICAgb3AtPmZ1bmNfZGljdCA9IE5VTEw7CisgICAgICAgIG9wLT5mdW5jX21vZHVsZSA9IE5VTEw7CiAKLQkJLyogX19tb2R1bGVfXzogSWYgbW9kdWxlIG5hbWUgaXMgaW4gZ2xvYmFscywgdXNlIGl0LgotCQkgICBPdGhlcndpc2UsIHVzZSBOb25lLgotCQkqLwotCQlpZiAoIV9fbmFtZV9fKSB7Ci0JCQlfX25hbWVfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbmFtZV9fIik7Ci0JCQlpZiAoIV9fbmFtZV9fKSB7Ci0JCQkJUHlfREVDUkVGKG9wKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQltb2R1bGUgPSBQeURpY3RfR2V0SXRlbShnbG9iYWxzLCBfX25hbWVfXyk7Ci0JCWlmIChtb2R1bGUpIHsKLQkJICAgIFB5X0lOQ1JFRihtb2R1bGUpOwotCQkgICAgb3AtPmZ1bmNfbW9kdWxlID0gbW9kdWxlOwotCQl9Ci0JfQotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKG9wKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopb3A7CisgICAgICAgIC8qIF9fbW9kdWxlX186IElmIG1vZHVsZSBuYW1lIGlzIGluIGdsb2JhbHMsIHVzZSBpdC4KKyAgICAgICAgICAgT3RoZXJ3aXNlLCB1c2UgTm9uZS4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCFfX25hbWVfXykgeworICAgICAgICAgICAgX19uYW1lX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX25hbWVfXyIpOworICAgICAgICAgICAgaWYgKCFfX25hbWVfXykgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbW9kdWxlID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgX19uYW1lX18pOworICAgICAgICBpZiAobW9kdWxlKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYobW9kdWxlKTsKKyAgICAgICAgICAgIG9wLT5mdW5jX21vZHVsZSA9IG1vZHVsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9wOwogfQogCiBQeU9iamVjdCAqCiBQeUZ1bmN0aW9uX0dldENvZGUoUHlPYmplY3QgKm9wKQogewotCWlmICghUHlGdW5jdGlvbl9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2NvZGU7CisgICAgaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfY29kZTsKIH0KIAogUHlPYmplY3QgKgogUHlGdW5jdGlvbl9HZXRHbG9iYWxzKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19nbG9iYWxzOworICAgIGlmICghUHlGdW5jdGlvbl9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2dsb2JhbHM7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RnVuY3Rpb25fR2V0TW9kdWxlKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19tb2R1bGU7CisgICAgaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfbW9kdWxlOwogfQogCiBQeU9iamVjdCAqCiBQeUZ1bmN0aW9uX0dldERlZmF1bHRzKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19kZWZhdWx0czsKKyAgICBpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19kZWZhdWx0czsKIH0KIAogaW50CiBQeUZ1bmN0aW9uX1NldERlZmF1bHRzKFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKmRlZmF1bHRzKQogewotCWlmICghUHlGdW5jdGlvbl9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGRlZmF1bHRzID09IFB5X05vbmUpCi0JCWRlZmF1bHRzID0gTlVMTDsKLQllbHNlIGlmIChkZWZhdWx0cyAmJiBQeVR1cGxlX0NoZWNrKGRlZmF1bHRzKSkgewotCQlQeV9JTkNSRUYoZGVmYXVsdHMpOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAibm9uLXR1cGxlIGRlZmF1bHQgYXJncyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X1hERUNSRUYoKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2RlZmF1bHRzKTsKLQkoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfZGVmYXVsdHMgPSBkZWZhdWx0czsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChkZWZhdWx0cyA9PSBQeV9Ob25lKQorICAgICAgICBkZWZhdWx0cyA9IE5VTEw7CisgICAgZWxzZSBpZiAoZGVmYXVsdHMgJiYgUHlUdXBsZV9DaGVjayhkZWZhdWx0cykpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlZmF1bHRzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIm5vbi10dXBsZSBkZWZhdWx0IGFyZ3MiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9YREVDUkVGKCgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19kZWZhdWx0cyk7CisgICAgKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2RlZmF1bHRzID0gZGVmYXVsdHM7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RnVuY3Rpb25fR2V0Q2xvc3VyZShQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfY2xvc3VyZTsKKyAgICBpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19jbG9zdXJlOwogfQogCiBpbnQKIFB5RnVuY3Rpb25fU2V0Q2xvc3VyZShQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICpjbG9zdXJlKQogewotCWlmICghUHlGdW5jdGlvbl9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGNsb3N1cmUgPT0gUHlfTm9uZSkKLQkJY2xvc3VyZSA9IE5VTEw7Ci0JZWxzZSBpZiAoUHlUdXBsZV9DaGVjayhjbG9zdXJlKSkgewotCQlQeV9JTkNSRUYoY2xvc3VyZSk7Ci0JfQotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsIAotCQkJICAgICAiZXhwZWN0ZWQgdHVwbGUgZm9yIGNsb3N1cmUsIGdvdCAnJS4xMDBzJyIsCi0JCQkgICAgIGNsb3N1cmUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X1hERUNSRUYoKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2Nsb3N1cmUpOwotCSgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19jbG9zdXJlID0gY2xvc3VyZTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChjbG9zdXJlID09IFB5X05vbmUpCisgICAgICAgIGNsb3N1cmUgPSBOVUxMOworICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soY2xvc3VyZSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKGNsb3N1cmUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHR1cGxlIGZvciBjbG9zdXJlLCBnb3QgJyUuMTAwcyciLAorICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfWERFQ1JFRigoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfY2xvc3VyZSk7CisgICAgKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2Nsb3N1cmUgPSBjbG9zdXJlOworICAgIHJldHVybiAwOwogfQogCiAvKiBNZXRob2RzICovCkBAIC0xNTksMTg4ICsxNTksMTg4IEBACiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeUZ1bmN0aW9uT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZnVuY19tZW1iZXJsaXN0W10gPSB7Ci0gICAgICAgIHsiZnVuY19jbG9zdXJlIiwgIFRfT0JKRUNULCAgICAgT0ZGKGZ1bmNfY2xvc3VyZSksCi0JIFJFU1RSSUNURUR8UkVBRE9OTFl9LAotICAgICAgICB7Il9fY2xvc3VyZV9fIiwgIFRfT0JKRUNULCAgICAgIE9GRihmdW5jX2Nsb3N1cmUpLAotCSBSRVNUUklDVEVEfFJFQURPTkxZfSwKLSAgICAgICAgeyJmdW5jX2RvYyIsICAgICAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19kb2MpLCBQWV9XUklURV9SRVNUUklDVEVEfSwKLSAgICAgICAgeyJfX2RvY19fIiwgICAgICAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19kb2MpLCBQWV9XUklURV9SRVNUUklDVEVEfSwKLSAgICAgICAgeyJmdW5jX2dsb2JhbHMiLCAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19nbG9iYWxzKSwKLQkgUkVTVFJJQ1RFRHxSRUFET05MWX0sCi0gICAgICAgIHsiX19nbG9iYWxzX18iLCAgVF9PQkpFQ1QsICAgICAgT0ZGKGZ1bmNfZ2xvYmFscyksCi0JIFJFU1RSSUNURUR8UkVBRE9OTFl9LAotICAgICAgICB7Il9fbW9kdWxlX18iLCAgICBUX09CSkVDVCwgICAgIE9GRihmdW5jX21vZHVsZSksIFBZX1dSSVRFX1JFU1RSSUNURUR9LAotICAgICAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCisgICAgeyJmdW5jX2Nsb3N1cmUiLCAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19jbG9zdXJlKSwKKyAgICAgUkVTVFJJQ1RFRHxSRUFET05MWX0sCisgICAgeyJfX2Nsb3N1cmVfXyIsICBUX09CSkVDVCwgICAgICBPRkYoZnVuY19jbG9zdXJlKSwKKyAgICAgUkVTVFJJQ1RFRHxSRUFET05MWX0sCisgICAgeyJmdW5jX2RvYyIsICAgICAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19kb2MpLCBQWV9XUklURV9SRVNUUklDVEVEfSwKKyAgICB7Il9fZG9jX18iLCAgICAgICBUX09CSkVDVCwgICAgIE9GRihmdW5jX2RvYyksIFBZX1dSSVRFX1JFU1RSSUNURUR9LAorICAgIHsiZnVuY19nbG9iYWxzIiwgIFRfT0JKRUNULCAgICAgT0ZGKGZ1bmNfZ2xvYmFscyksCisgICAgIFJFU1RSSUNURUR8UkVBRE9OTFl9LAorICAgIHsiX19nbG9iYWxzX18iLCAgVF9PQkpFQ1QsICAgICAgT0ZGKGZ1bmNfZ2xvYmFscyksCisgICAgIFJFU1RSSUNURUR8UkVBRE9OTFl9LAorICAgIHsiX19tb2R1bGVfXyIsICAgIFRfT0JKRUNULCAgICAgT0ZGKGZ1bmNfbW9kdWxlKSwgUFlfV1JJVEVfUkVTVFJJQ1RFRH0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwogfTsKIAogc3RhdGljIGludAogcmVzdHJpY3RlZCh2b2lkKQogewotCWlmICghUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkKLQkJcmV0dXJuIDA7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJImZ1bmN0aW9uIGF0dHJpYnV0ZXMgbm90IGFjY2Vzc2libGUgaW4gcmVzdHJpY3RlZCBtb2RlIik7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAiZnVuY3Rpb24gYXR0cmlidXRlcyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmNfZ2V0X2RpY3QoUHlGdW5jdGlvbk9iamVjdCAqb3ApCiB7Ci0JaWYgKHJlc3RyaWN0ZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG9wLT5mdW5jX2RpY3QgPT0gTlVMTCkgewotCQlvcC0+ZnVuY19kaWN0ID0gUHlEaWN0X05ldygpOwotCQlpZiAob3AtPmZ1bmNfZGljdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihvcC0+ZnVuY19kaWN0KTsKLQlyZXR1cm4gb3AtPmZ1bmNfZGljdDsKKyAgICBpZiAocmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAob3AtPmZ1bmNfZGljdCA9PSBOVUxMKSB7CisgICAgICAgIG9wLT5mdW5jX2RpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChvcC0+ZnVuY19kaWN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKG9wLT5mdW5jX2RpY3QpOworICAgIHJldHVybiBvcC0+ZnVuY19kaWN0OwogfQogCiBzdGF0aWMgaW50CiBmdW5jX3NldF9kaWN0KFB5RnVuY3Rpb25PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKnRtcDsKKyAgICBQeU9iamVjdCAqdG1wOwogCi0JaWYgKHJlc3RyaWN0ZWQoKSkKLQkJcmV0dXJuIC0xOwotCS8qIEl0IGlzIGlsbGVnYWwgdG8gZGVsIGYuZnVuY19kaWN0ICovCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZnVuY3Rpb24ncyBkaWN0aW9uYXJ5IG1heSBub3QgYmUgZGVsZXRlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIENhbiBvbmx5IHNldCBmdW5jX2RpY3QgdG8gYSBkaWN0aW9uYXJ5ICovCi0JaWYgKCFQeURpY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInNldHRpbmcgZnVuY3Rpb24ncyBkaWN0aW9uYXJ5IHRvIGEgbm9uLWRpY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl0bXAgPSBvcC0+ZnVuY19kaWN0OwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0Jb3AtPmZ1bmNfZGljdCA9IHZhbHVlOwotCVB5X1hERUNSRUYodG1wKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAocmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogSXQgaXMgaWxsZWdhbCB0byBkZWwgZi5mdW5jX2RpY3QgKi8KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uJ3MgZGljdGlvbmFyeSBtYXkgbm90IGJlIGRlbGV0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBDYW4gb25seSBzZXQgZnVuY19kaWN0IHRvIGEgZGljdGlvbmFyeSAqLworICAgIGlmICghUHlEaWN0X0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNldHRpbmcgZnVuY3Rpb24ncyBkaWN0aW9uYXJ5IHRvIGEgbm9uLWRpY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB0bXAgPSBvcC0+ZnVuY19kaWN0OworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgb3AtPmZ1bmNfZGljdCA9IHZhbHVlOworICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmNfZ2V0X2NvZGUoUHlGdW5jdGlvbk9iamVjdCAqb3ApCiB7Ci0JaWYgKHJlc3RyaWN0ZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKG9wLT5mdW5jX2NvZGUpOwotCXJldHVybiBvcC0+ZnVuY19jb2RlOworICAgIGlmIChyZXN0cmljdGVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihvcC0+ZnVuY19jb2RlKTsKKyAgICByZXR1cm4gb3AtPmZ1bmNfY29kZTsKIH0KIAogc3RhdGljIGludAogZnVuY19zZXRfY29kZShQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICp0bXA7Ci0JUHlfc3NpemVfdCBuZnJlZSwgbmNsb3N1cmU7CisgICAgUHlPYmplY3QgKnRtcDsKKyAgICBQeV9zc2l6ZV90IG5mcmVlLCBuY2xvc3VyZTsKIAotCWlmIChyZXN0cmljdGVkKCkpCi0JCXJldHVybiAtMTsKLQkvKiBOb3QgbGVnYWwgdG8gZGVsIGYuZnVuY19jb2RlIG9yIHRvIHNldCBpdCB0byBhbnl0aGluZwotCSAqIG90aGVyIHRoYW4gYSBjb2RlIG9iamVjdC4gKi8KLQlpZiAodmFsdWUgPT0gTlVMTCB8fCAhUHlDb2RlX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2NvZGVfXyBtdXN0IGJlIHNldCB0byBhIGNvZGUgb2JqZWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbmZyZWUgPSBQeUNvZGVfR2V0TnVtRnJlZSgoUHlDb2RlT2JqZWN0ICopdmFsdWUpOwotCW5jbG9zdXJlID0gKG9wLT5mdW5jX2Nsb3N1cmUgPT0gTlVMTCA/IDAgOgotCQkgICAgUHlUdXBsZV9HRVRfU0laRShvcC0+ZnVuY19jbG9zdXJlKSk7Ci0JaWYgKG5jbG9zdXJlICE9IG5mcmVlKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAiJXMoKSByZXF1aXJlcyBhIGNvZGUgb2JqZWN0IHdpdGggJXpkIGZyZWUgdmFycywiCi0JCQkgICAgICIgbm90ICV6ZCIsCi0JCQkgICAgIFB5U3RyaW5nX0FzU3RyaW5nKG9wLT5mdW5jX25hbWUpLAotCQkJICAgICBuY2xvc3VyZSwgbmZyZWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXRtcCA9IG9wLT5mdW5jX2NvZGU7Ci0JUHlfSU5DUkVGKHZhbHVlKTsKLQlvcC0+ZnVuY19jb2RlID0gdmFsdWU7Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHJlc3RyaWN0ZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIE5vdCBsZWdhbCB0byBkZWwgZi5mdW5jX2NvZGUgb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCisgICAgICogb3RoZXIgdGhhbiBhIGNvZGUgb2JqZWN0LiAqLworICAgIGlmICh2YWx1ZSA9PSBOVUxMIHx8ICFQeUNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19jb2RlX18gbXVzdCBiZSBzZXQgdG8gYSBjb2RlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG5mcmVlID0gUHlDb2RlX0dldE51bUZyZWUoKFB5Q29kZU9iamVjdCAqKXZhbHVlKTsKKyAgICBuY2xvc3VyZSA9IChvcC0+ZnVuY19jbG9zdXJlID09IE5VTEwgPyAwIDoKKyAgICAgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUob3AtPmZ1bmNfY2xvc3VyZSkpOworICAgIGlmIChuY2xvc3VyZSAhPSBuZnJlZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlcygpIHJlcXVpcmVzIGEgY29kZSBvYmplY3Qgd2l0aCAlemQgZnJlZSB2YXJzLCIKKyAgICAgICAgICAgICAgICAgICAgICIgbm90ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhvcC0+ZnVuY19uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgIG5jbG9zdXJlLCBuZnJlZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdG1wID0gb3AtPmZ1bmNfY29kZTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIG9wLT5mdW5jX2NvZGUgPSB2YWx1ZTsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmNfZ2V0X25hbWUoUHlGdW5jdGlvbk9iamVjdCAqb3ApCiB7Ci0JUHlfSU5DUkVGKG9wLT5mdW5jX25hbWUpOwotCXJldHVybiBvcC0+ZnVuY19uYW1lOworICAgIFB5X0lOQ1JFRihvcC0+ZnVuY19uYW1lKTsKKyAgICByZXR1cm4gb3AtPmZ1bmNfbmFtZTsKIH0KIAogc3RhdGljIGludAogZnVuY19zZXRfbmFtZShQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCWlmIChyZXN0cmljdGVkKCkpCi0JCXJldHVybiAtMTsKLQkvKiBOb3QgbGVnYWwgdG8gZGVsIGYuZnVuY19uYW1lIG9yIHRvIHNldCBpdCB0byBhbnl0aGluZwotCSAqIG90aGVyIHRoYW4gYSBzdHJpbmcgb2JqZWN0LiAqLwotCWlmICh2YWx1ZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19uYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdG1wID0gb3AtPmZ1bmNfbmFtZTsKLQlQeV9JTkNSRUYodmFsdWUpOwotCW9wLT5mdW5jX25hbWUgPSB2YWx1ZTsKLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAocmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogTm90IGxlZ2FsIHRvIGRlbCBmLmZ1bmNfbmFtZSBvciB0byBzZXQgaXQgdG8gYW55dGhpbmcKKyAgICAgKiBvdGhlciB0aGFuIGEgc3RyaW5nIG9iamVjdC4gKi8KKyAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19uYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdG1wID0gb3AtPmZ1bmNfbmFtZTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIG9wLT5mdW5jX25hbWUgPSB2YWx1ZTsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmNfZ2V0X2RlZmF1bHRzKFB5RnVuY3Rpb25PYmplY3QgKm9wKQogewotCWlmIChyZXN0cmljdGVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChvcC0+ZnVuY19kZWZhdWx0cyA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCVB5X0lOQ1JFRihvcC0+ZnVuY19kZWZhdWx0cyk7Ci0JcmV0dXJuIG9wLT5mdW5jX2RlZmF1bHRzOworICAgIGlmIChyZXN0cmljdGVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChvcC0+ZnVuY19kZWZhdWx0cyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIFB5X0lOQ1JFRihvcC0+ZnVuY19kZWZhdWx0cyk7CisgICAgcmV0dXJuIG9wLT5mdW5jX2RlZmF1bHRzOwogfQogCiBzdGF0aWMgaW50CiBmdW5jX3NldF9kZWZhdWx0cyhQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCWlmIChyZXN0cmljdGVkKCkpCi0JCXJldHVybiAtMTsKLQkvKiBMZWdhbCB0byBkZWwgZi5mdW5jX2RlZmF1bHRzLgotCSAqIENhbiBvbmx5IHNldCBmdW5jX2RlZmF1bHRzIHRvIE5VTEwgb3IgYSB0dXBsZS4gKi8KLQlpZiAodmFsdWUgPT0gUHlfTm9uZSkKLQkJdmFsdWUgPSBOVUxMOwotCWlmICh2YWx1ZSAhPSBOVUxMICYmICFQeVR1cGxlX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2RlZmF1bHRzX18gbXVzdCBiZSBzZXQgdG8gYSB0dXBsZSBvYmplY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl0bXAgPSBvcC0+ZnVuY19kZWZhdWx0czsKLQlQeV9YSU5DUkVGKHZhbHVlKTsKLQlvcC0+ZnVuY19kZWZhdWx0cyA9IHZhbHVlOwotCVB5X1hERUNSRUYodG1wKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAocmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogTGVnYWwgdG8gZGVsIGYuZnVuY19kZWZhdWx0cy4KKyAgICAgKiBDYW4gb25seSBzZXQgZnVuY19kZWZhdWx0cyB0byBOVUxMIG9yIGEgdHVwbGUuICovCisgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCisgICAgICAgIHZhbHVlID0gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gTlVMTCAmJiAhUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2RlZmF1bHRzX18gbXVzdCBiZSBzZXQgdG8gYSB0dXBsZSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB0bXAgPSBvcC0+ZnVuY19kZWZhdWx0czsKKyAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICBvcC0+ZnVuY19kZWZhdWx0cyA9IHZhbHVlOworICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGZ1bmNfZ2V0c2V0bGlzdFtdID0gewotICAgICAgICB7ImZ1bmNfY29kZSIsIChnZXR0ZXIpZnVuY19nZXRfY29kZSwgKHNldHRlcilmdW5jX3NldF9jb2RlfSwKLSAgICAgICAgeyJfX2NvZGVfXyIsIChnZXR0ZXIpZnVuY19nZXRfY29kZSwgKHNldHRlcilmdW5jX3NldF9jb2RlfSwKLSAgICAgICAgeyJmdW5jX2RlZmF1bHRzIiwgKGdldHRlcilmdW5jX2dldF9kZWZhdWx0cywKLQkgKHNldHRlcilmdW5jX3NldF9kZWZhdWx0c30sCi0gICAgICAgIHsiX19kZWZhdWx0c19fIiwgKGdldHRlcilmdW5jX2dldF9kZWZhdWx0cywKLQkgKHNldHRlcilmdW5jX3NldF9kZWZhdWx0c30sCi0JeyJmdW5jX2RpY3QiLCAoZ2V0dGVyKWZ1bmNfZ2V0X2RpY3QsIChzZXR0ZXIpZnVuY19zZXRfZGljdH0sCi0JeyJfX2RpY3RfXyIsIChnZXR0ZXIpZnVuY19nZXRfZGljdCwgKHNldHRlcilmdW5jX3NldF9kaWN0fSwKLQl7ImZ1bmNfbmFtZSIsIChnZXR0ZXIpZnVuY19nZXRfbmFtZSwgKHNldHRlcilmdW5jX3NldF9uYW1lfSwKLQl7Il9fbmFtZV9fIiwgKGdldHRlcilmdW5jX2dldF9uYW1lLCAoc2V0dGVyKWZ1bmNfc2V0X25hbWV9LAotCXtOVUxMfSAvKiBTZW50aW5lbCAqLworICAgIHsiZnVuY19jb2RlIiwgKGdldHRlcilmdW5jX2dldF9jb2RlLCAoc2V0dGVyKWZ1bmNfc2V0X2NvZGV9LAorICAgIHsiX19jb2RlX18iLCAoZ2V0dGVyKWZ1bmNfZ2V0X2NvZGUsIChzZXR0ZXIpZnVuY19zZXRfY29kZX0sCisgICAgeyJmdW5jX2RlZmF1bHRzIiwgKGdldHRlcilmdW5jX2dldF9kZWZhdWx0cywKKyAgICAgKHNldHRlcilmdW5jX3NldF9kZWZhdWx0c30sCisgICAgeyJfX2RlZmF1bHRzX18iLCAoZ2V0dGVyKWZ1bmNfZ2V0X2RlZmF1bHRzLAorICAgICAoc2V0dGVyKWZ1bmNfc2V0X2RlZmF1bHRzfSwKKyAgICB7ImZ1bmNfZGljdCIsIChnZXR0ZXIpZnVuY19nZXRfZGljdCwgKHNldHRlcilmdW5jX3NldF9kaWN0fSwKKyAgICB7Il9fZGljdF9fIiwgKGdldHRlcilmdW5jX2dldF9kaWN0LCAoc2V0dGVyKWZ1bmNfc2V0X2RpY3R9LAorICAgIHsiZnVuY19uYW1lIiwgKGdldHRlcilmdW5jX2dldF9uYW1lLCAoc2V0dGVyKWZ1bmNfc2V0X25hbWV9LAorICAgIHsiX19uYW1lX18iLCAoZ2V0dGVyKWZ1bmNfZ2V0X25hbWUsIChzZXR0ZXIpZnVuY19zZXRfbmFtZX0sCisgICAge05VTEx9IC8qIFNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoZnVuY19kb2MsCkBAIC0zNTMsMjM2ICszNTMsMjM2IEBACiAKIC8qIGZ1bmNfbmV3KCkgbWFpbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW52YXJpYW50cyBmb3IgY2xvc3VyZXMuICBUaGUKICAgIGNsb3N1cmUgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmcmVlIHZhcmlhYmxlcyBvZiB0aGUgY29kZSBvYmplY3QuCi0gICAKLSAgIGlmIGxlbihjb2RlLmNvX2ZyZWV2YXJzKSA9PSAwOiAKLSAgICAgICAgICAgY2xvc3VyZSA9IE5VTEwKKworICAgaWYgbGVuKGNvZGUuY29fZnJlZXZhcnMpID09IDA6CisgICAgICAgY2xvc3VyZSA9IE5VTEwKICAgIGVsc2U6Ci0gICAgICAgICAgIGxlbihjbG9zdXJlKSA9PSBsZW4oY29kZS5jb19mcmVldmFycykKKyAgICAgICBsZW4oY2xvc3VyZSkgPT0gbGVuKGNvZGUuY29fZnJlZXZhcnMpCiAgICBmb3IgZXZlcnkgZWx0IGluIGNsb3N1cmUsIHR5cGUoZWx0KSA9PSBjZWxsCiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogZnVuY19uZXcoUHlUeXBlT2JqZWN0KiB0eXBlLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3KQogewotCVB5Q29kZU9iamVjdCAqY29kZTsKLQlQeU9iamVjdCAqZ2xvYmFsczsKLQlQeU9iamVjdCAqbmFtZSA9IFB5X05vbmU7Ci0JUHlPYmplY3QgKmRlZmF1bHRzID0gUHlfTm9uZTsKLQlQeU9iamVjdCAqY2xvc3VyZSA9IFB5X05vbmU7Ci0JUHlGdW5jdGlvbk9iamVjdCAqbmV3ZnVuYzsKLQlQeV9zc2l6ZV90IG5mcmVlLCBuY2xvc3VyZTsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImNvZGUiLCAiZ2xvYmFscyIsICJuYW1lIiwKLQkJCQkgImFyZ2RlZnMiLCAiY2xvc3VyZSIsIDB9OworICAgIFB5Q29kZU9iamVjdCAqY29kZTsKKyAgICBQeU9iamVjdCAqZ2xvYmFsczsKKyAgICBQeU9iamVjdCAqbmFtZSA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKmRlZmF1bHRzID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqY2xvc3VyZSA9IFB5X05vbmU7CisgICAgUHlGdW5jdGlvbk9iamVjdCAqbmV3ZnVuYzsKKyAgICBQeV9zc2l6ZV90IG5mcmVlLCBuY2xvc3VyZTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImNvZGUiLCAiZ2xvYmFscyIsICJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ2RlZnMiLCAiY2xvc3VyZSIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPIU8hfE9PTzpmdW5jdGlvbiIsCi0JCQkgICAgICBrd2xpc3QsCi0JCQkgICAgICAmUHlDb2RlX1R5cGUsICZjb2RlLAotCQkJICAgICAgJlB5RGljdF9UeXBlLCAmZ2xvYmFscywKLQkJCSAgICAgICZuYW1lLCAmZGVmYXVsdHMsICZjbG9zdXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG5hbWUgIT0gUHlfTm9uZSAmJiAhUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXJnIDMgKG5hbWUpIG11c3QgYmUgTm9uZSBvciBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChkZWZhdWx0cyAhPSBQeV9Ob25lICYmICFQeVR1cGxlX0NoZWNrKGRlZmF1bHRzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhcmcgNCAoZGVmYXVsdHMpIG11c3QgYmUgTm9uZSBvciB0dXBsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbmZyZWUgPSBQeVR1cGxlX0dFVF9TSVpFKGNvZGUtPmNvX2ZyZWV2YXJzKTsKLQlpZiAoIVB5VHVwbGVfQ2hlY2soY2xvc3VyZSkpIHsKLQkJaWYgKG5mcmVlICYmIGNsb3N1cmUgPT0gUHlfTm9uZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImFyZyA1IChjbG9zdXJlKSBtdXN0IGJlIHR1cGxlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbHNlIGlmIChjbG9zdXJlICE9IFB5X05vbmUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZyA1IChjbG9zdXJlKSBtdXN0IGJlIE5vbmUgb3IgdHVwbGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiTyFPIXxPT086ZnVuY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUNvZGVfVHlwZSwgJmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeURpY3RfVHlwZSwgJmdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCAmZGVmYXVsdHMsICZjbG9zdXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG5hbWUgIT0gUHlfTm9uZSAmJiAhUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmcgMyAobmFtZSkgbXVzdCBiZSBOb25lIG9yIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGRlZmF1bHRzICE9IFB5X05vbmUgJiYgIVB5VHVwbGVfQ2hlY2soZGVmYXVsdHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJnIDQgKGRlZmF1bHRzKSBtdXN0IGJlIE5vbmUgb3IgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5mcmVlID0gUHlUdXBsZV9HRVRfU0laRShjb2RlLT5jb19mcmVldmFycyk7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGNsb3N1cmUpKSB7CisgICAgICAgIGlmIChuZnJlZSAmJiBjbG9zdXJlID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZyA1IChjbG9zdXJlKSBtdXN0IGJlIHR1cGxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjbG9zdXJlICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImFyZyA1IChjbG9zdXJlKSBtdXN0IGJlIE5vbmUgb3IgdHVwbGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JLyogY2hlY2sgdGhhdCB0aGUgY2xvc3VyZSBpcyB3ZWxsLWZvcm1lZCAqLwotCW5jbG9zdXJlID0gY2xvc3VyZSA9PSBQeV9Ob25lID8gMCA6IFB5VHVwbGVfR0VUX1NJWkUoY2xvc3VyZSk7Ci0JaWYgKG5mcmVlICE9IG5jbG9zdXJlKQotCQlyZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgICIlcyByZXF1aXJlcyBjbG9zdXJlIG9mIGxlbmd0aCAlemQsIG5vdCAlemQiLAotCQkJCSAgICBQeVN0cmluZ19BU19TVFJJTkcoY29kZS0+Y29fbmFtZSksCi0JCQkJICAgIG5mcmVlLCBuY2xvc3VyZSk7Ci0JaWYgKG5jbG9zdXJlKSB7Ci0JCVB5X3NzaXplX3QgaTsKLQkJZm9yIChpID0gMDsgaSA8IG5jbG9zdXJlOyBpKyspIHsKLQkJCVB5T2JqZWN0ICpvID0gUHlUdXBsZV9HRVRfSVRFTShjbG9zdXJlLCBpKTsKLQkJCWlmICghUHlDZWxsX0NoZWNrKG8pKSB7Ci0JCQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICJhcmcgNSAoY2xvc3VyZSkgZXhwZWN0ZWQgY2VsbCwgZm91bmQgJXMiLAotCQkJCQkJICAgIG8tPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJfQotCQl9Ci0JfQotCQotCW5ld2Z1bmMgPSAoUHlGdW5jdGlvbk9iamVjdCAqKVB5RnVuY3Rpb25fTmV3KChQeU9iamVjdCAqKWNvZGUsIAotCQkJCQkJICAgICBnbG9iYWxzKTsKLQlpZiAobmV3ZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiAobmFtZSAhPSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihuYW1lKTsKLQkJUHlfREVDUkVGKG5ld2Z1bmMtPmZ1bmNfbmFtZSk7Ci0JCW5ld2Z1bmMtPmZ1bmNfbmFtZSA9IG5hbWU7Ci0JfQotCWlmIChkZWZhdWx0cyAhPSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihkZWZhdWx0cyk7Ci0JCW5ld2Z1bmMtPmZ1bmNfZGVmYXVsdHMgID0gZGVmYXVsdHM7Ci0JfQotCWlmIChjbG9zdXJlICE9IFB5X05vbmUpIHsKLQkJUHlfSU5DUkVGKGNsb3N1cmUpOwotCQluZXdmdW5jLT5mdW5jX2Nsb3N1cmUgPSBjbG9zdXJlOwotCX0KKyAgICAvKiBjaGVjayB0aGF0IHRoZSBjbG9zdXJlIGlzIHdlbGwtZm9ybWVkICovCisgICAgbmNsb3N1cmUgPSBjbG9zdXJlID09IFB5X05vbmUgPyAwIDogUHlUdXBsZV9HRVRfU0laRShjbG9zdXJlKTsKKyAgICBpZiAobmZyZWUgIT0gbmNsb3N1cmUpCisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgcmVxdWlyZXMgY2xvc3VyZSBvZiBsZW5ndGggJXpkLCBub3QgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoY29kZS0+Y29fbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmZyZWUsIG5jbG9zdXJlKTsKKyAgICBpZiAobmNsb3N1cmUpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmNsb3N1cmU7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBQeVR1cGxlX0dFVF9JVEVNKGNsb3N1cmUsIGkpOworICAgICAgICAgICAgaWYgKCFQeUNlbGxfQ2hlY2sobykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImFyZyA1IChjbG9zdXJlKSBleHBlY3RlZCBjZWxsLCBmb3VuZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAoUHlPYmplY3QgKiluZXdmdW5jOworICAgIG5ld2Z1bmMgPSAoUHlGdW5jdGlvbk9iamVjdCAqKVB5RnVuY3Rpb25fTmV3KChQeU9iamVjdCAqKWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFscyk7CisgICAgaWYgKG5ld2Z1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAobmFtZSAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKG5ld2Z1bmMtPmZ1bmNfbmFtZSk7CisgICAgICAgIG5ld2Z1bmMtPmZ1bmNfbmFtZSA9IG5hbWU7CisgICAgfQorICAgIGlmIChkZWZhdWx0cyAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihkZWZhdWx0cyk7CisgICAgICAgIG5ld2Z1bmMtPmZ1bmNfZGVmYXVsdHMgID0gZGVmYXVsdHM7CisgICAgfQorICAgIGlmIChjbG9zdXJlICE9IFB5X05vbmUpIHsKKyAgICAgICAgUHlfSU5DUkVGKGNsb3N1cmUpOworICAgICAgICBuZXdmdW5jLT5mdW5jX2Nsb3N1cmUgPSBjbG9zdXJlOworICAgIH0KKworICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdmdW5jOwogfQogCiBzdGF0aWMgdm9pZAogZnVuY19kZWFsbG9jKFB5RnVuY3Rpb25PYmplY3QgKm9wKQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKG9wKTsKLQlpZiAob3AtPmZ1bmNfd2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgb3ApOwotCVB5X0RFQ1JFRihvcC0+ZnVuY19jb2RlKTsKLQlQeV9ERUNSRUYob3AtPmZ1bmNfZ2xvYmFscyk7Ci0JUHlfWERFQ1JFRihvcC0+ZnVuY19tb2R1bGUpOwotCVB5X0RFQ1JFRihvcC0+ZnVuY19uYW1lKTsKLQlQeV9YREVDUkVGKG9wLT5mdW5jX2RlZmF1bHRzKTsKLQlQeV9YREVDUkVGKG9wLT5mdW5jX2RvYyk7Ci0JUHlfWERFQ1JFRihvcC0+ZnVuY19kaWN0KTsKLQlQeV9YREVDUkVGKG9wLT5mdW5jX2Nsb3N1cmUpOwotCVB5T2JqZWN0X0dDX0RlbChvcCk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0sob3ApOworICAgIGlmIChvcC0+ZnVuY193ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBvcCk7CisgICAgUHlfREVDUkVGKG9wLT5mdW5jX2NvZGUpOworICAgIFB5X0RFQ1JFRihvcC0+ZnVuY19nbG9iYWxzKTsKKyAgICBQeV9YREVDUkVGKG9wLT5mdW5jX21vZHVsZSk7CisgICAgUHlfREVDUkVGKG9wLT5mdW5jX25hbWUpOworICAgIFB5X1hERUNSRUYob3AtPmZ1bmNfZGVmYXVsdHMpOworICAgIFB5X1hERUNSRUYob3AtPmZ1bmNfZG9jKTsKKyAgICBQeV9YREVDUkVGKG9wLT5mdW5jX2RpY3QpOworICAgIFB5X1hERUNSRUYob3AtPmZ1bmNfY2xvc3VyZSk7CisgICAgUHlPYmplY3RfR0NfRGVsKG9wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogZnVuY19yZXByKFB5RnVuY3Rpb25PYmplY3QgKm9wKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8ZnVuY3Rpb24gJXMgYXQgJXA+IiwKLQkJCQkgICBQeVN0cmluZ19Bc1N0cmluZyhvcC0+ZnVuY19uYW1lKSwKLQkJCQkgICBvcCk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxmdW5jdGlvbiAlcyBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKG9wLT5mdW5jX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wKTsKIH0KIAogc3RhdGljIGludAogZnVuY190cmF2ZXJzZShQeUZ1bmN0aW9uT2JqZWN0ICpmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChmLT5mdW5jX2NvZGUpOwotCVB5X1ZJU0lUKGYtPmZ1bmNfZ2xvYmFscyk7Ci0JUHlfVklTSVQoZi0+ZnVuY19tb2R1bGUpOwotCVB5X1ZJU0lUKGYtPmZ1bmNfZGVmYXVsdHMpOwotCVB5X1ZJU0lUKGYtPmZ1bmNfZG9jKTsKLQlQeV9WSVNJVChmLT5mdW5jX25hbWUpOwotCVB5X1ZJU0lUKGYtPmZ1bmNfZGljdCk7Ci0JUHlfVklTSVQoZi0+ZnVuY19jbG9zdXJlKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChmLT5mdW5jX2NvZGUpOworICAgIFB5X1ZJU0lUKGYtPmZ1bmNfZ2xvYmFscyk7CisgICAgUHlfVklTSVQoZi0+ZnVuY19tb2R1bGUpOworICAgIFB5X1ZJU0lUKGYtPmZ1bmNfZGVmYXVsdHMpOworICAgIFB5X1ZJU0lUKGYtPmZ1bmNfZG9jKTsKKyAgICBQeV9WSVNJVChmLT5mdW5jX25hbWUpOworICAgIFB5X1ZJU0lUKGYtPmZ1bmNfZGljdCk7CisgICAgUHlfVklTSVQoZi0+ZnVuY19jbG9zdXJlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmN0aW9uX2NhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICphcmdkZWZzOwotCVB5T2JqZWN0ICprd3R1cGxlID0gTlVMTDsKLQlQeU9iamVjdCAqKmQsICoqazsKLQlQeV9zc2l6ZV90IG5rLCBuZDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICphcmdkZWZzOworICAgIFB5T2JqZWN0ICprd3R1cGxlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqKmQsICoqazsKKyAgICBQeV9zc2l6ZV90IG5rLCBuZDsKIAotCWFyZ2RlZnMgPSBQeUZ1bmN0aW9uX0dFVF9ERUZBVUxUUyhmdW5jKTsKLQlpZiAoYXJnZGVmcyAhPSBOVUxMICYmIFB5VHVwbGVfQ2hlY2soYXJnZGVmcykpIHsKLQkJZCA9ICZQeVR1cGxlX0dFVF9JVEVNKChQeVR1cGxlT2JqZWN0ICopYXJnZGVmcywgMCk7Ci0JCW5kID0gUHlUdXBsZV9HRVRfU0laRShhcmdkZWZzKTsKLQl9Ci0JZWxzZSB7Ci0JCWQgPSBOVUxMOwotCQluZCA9IDA7Ci0JfQorICAgIGFyZ2RlZnMgPSBQeUZ1bmN0aW9uX0dFVF9ERUZBVUxUUyhmdW5jKTsKKyAgICBpZiAoYXJnZGVmcyAhPSBOVUxMICYmIFB5VHVwbGVfQ2hlY2soYXJnZGVmcykpIHsKKyAgICAgICAgZCA9ICZQeVR1cGxlX0dFVF9JVEVNKChQeVR1cGxlT2JqZWN0ICopYXJnZGVmcywgMCk7CisgICAgICAgIG5kID0gUHlUdXBsZV9HRVRfU0laRShhcmdkZWZzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGQgPSBOVUxMOworICAgICAgICBuZCA9IDA7CisgICAgfQogCi0JaWYgKGt3ICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGt3KSkgewotCQlQeV9zc2l6ZV90IHBvcywgaTsKLQkJbmsgPSBQeURpY3RfU2l6ZShrdyk7Ci0JCWt3dHVwbGUgPSBQeVR1cGxlX05ldygyKm5rKTsKLQkJaWYgKGt3dHVwbGUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlrID0gJlB5VHVwbGVfR0VUX0lURU0oa3d0dXBsZSwgMCk7Ci0JCXBvcyA9IGkgPSAwOwotCQl3aGlsZSAoUHlEaWN0X05leHQoa3csICZwb3MsICZrW2ldLCAma1tpKzFdKSkgewotCQkJUHlfSU5DUkVGKGtbaV0pOwotCQkJUHlfSU5DUkVGKGtbaSsxXSk7Ci0JCQlpICs9IDI7Ci0JCX0KLQkJbmsgPSBpLzI7Ci0JfQotCWVsc2UgewotCQlrID0gTlVMTDsKLQkJbmsgPSAwOwotCX0KKyAgICBpZiAoa3cgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soa3cpKSB7CisgICAgICAgIFB5X3NzaXplX3QgcG9zLCBpOworICAgICAgICBuayA9IFB5RGljdF9TaXplKGt3KTsKKyAgICAgICAga3d0dXBsZSA9IFB5VHVwbGVfTmV3KDIqbmspOworICAgICAgICBpZiAoa3d0dXBsZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGsgPSAmUHlUdXBsZV9HRVRfSVRFTShrd3R1cGxlLCAwKTsKKyAgICAgICAgcG9zID0gaSA9IDA7CisgICAgICAgIHdoaWxlIChQeURpY3RfTmV4dChrdywgJnBvcywgJmtbaV0sICZrW2krMV0pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoa1tpXSk7CisgICAgICAgICAgICBQeV9JTkNSRUYoa1tpKzFdKTsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgfQorICAgICAgICBuayA9IGkvMjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGsgPSBOVUxMOworICAgICAgICBuayA9IDA7CisgICAgfQogCi0JcmVzdWx0ID0gUHlFdmFsX0V2YWxDb2RlRXgoCi0JCShQeUNvZGVPYmplY3QgKilQeUZ1bmN0aW9uX0dFVF9DT0RFKGZ1bmMpLAotCQlQeUZ1bmN0aW9uX0dFVF9HTE9CQUxTKGZ1bmMpLCAoUHlPYmplY3QgKilOVUxMLAotCQkmUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApLCBQeVR1cGxlX0dFVF9TSVpFKGFyZyksCi0JCWssIG5rLCBkLCBuZCwKLQkJUHlGdW5jdGlvbl9HRVRfQ0xPU1VSRShmdW5jKSk7CisgICAgcmVzdWx0ID0gUHlFdmFsX0V2YWxDb2RlRXgoCisgICAgICAgIChQeUNvZGVPYmplY3QgKilQeUZ1bmN0aW9uX0dFVF9DT0RFKGZ1bmMpLAorICAgICAgICBQeUZ1bmN0aW9uX0dFVF9HTE9CQUxTKGZ1bmMpLCAoUHlPYmplY3QgKilOVUxMLAorICAgICAgICAmUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApLCBQeVR1cGxlX0dFVF9TSVpFKGFyZyksCisgICAgICAgIGssIG5rLCBkLCBuZCwKKyAgICAgICAgUHlGdW5jdGlvbl9HRVRfQ0xPU1VSRShmdW5jKSk7CiAKLQlQeV9YREVDUkVGKGt3dHVwbGUpOworICAgIFB5X1hERUNSRUYoa3d0dXBsZSk7CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEJpbmQgYSBmdW5jdGlvbiB0byBhbiBvYmplY3QgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBmdW5jX2Rlc2NyX2dldChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0JaWYgKG9iaiA9PSBQeV9Ob25lKQotCQlvYmogPSBOVUxMOwotCXJldHVybiBQeU1ldGhvZF9OZXcoZnVuYywgb2JqLCB0eXBlKTsKKyAgICBpZiAob2JqID09IFB5X05vbmUpCisgICAgICAgIG9iaiA9IE5VTEw7CisgICAgcmV0dXJuIFB5TWV0aG9kX05ldyhmdW5jLCBvYmosIHR5cGUpOwogfQogCiBQeVR5cGVPYmplY3QgUHlGdW5jdGlvbl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImZ1bmN0aW9uIiwKLQlzaXplb2YoUHlGdW5jdGlvbk9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilmdW5jX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWZ1bmNfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQlmdW5jdGlvbl9jYWxsLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotCWZ1bmNfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWZ1bmNfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCW9mZnNldG9mKFB5RnVuY3Rpb25PYmplY3QsIGZ1bmNfd2Vha3JlZmxpc3QpLCAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlmdW5jX21lbWJlcmxpc3QsCQkJLyogdHBfbWVtYmVycyAqLwotCWZ1bmNfZ2V0c2V0bGlzdCwJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JZnVuY19kZXNjcl9nZXQsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQlvZmZzZXRvZihQeUZ1bmN0aW9uT2JqZWN0LCBmdW5jX2RpY3QpLAkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlmdW5jX25ldywJCQkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZnVuY3Rpb24iLAorICAgIHNpemVvZihQeUZ1bmN0aW9uT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWZ1bmNfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpZnVuY19yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICBmdW5jdGlvbl9jYWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICBmdW5jX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZnVuY190cmF2ZXJzZSwgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKFB5RnVuY3Rpb25PYmplY3QsIGZ1bmNfd2Vha3JlZmxpc3QpLCAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBmdW5jX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBmdW5jX2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIGZ1bmNfZGVzY3JfZ2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBvZmZzZXRvZihQeUZ1bmN0aW9uT2JqZWN0LCBmdW5jX2RpY3QpLCAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgZnVuY19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIApAQCAtNTkzLDkgKzU5Myw5IEBACiAgICBUbyBkZWNsYXJlIGEgY2xhc3MgbWV0aG9kLCB1c2UgdGhpcyBpZGlvbToKIAogICAgICBjbGFzcyBDOgotICAgICAgICAgZGVmIGYoY2xzLCBhcmcxLCBhcmcyLCAuLi4pOiAuLi4KLQkgZiA9IGNsYXNzbWV0aG9kKGYpCi0gICAKKyAgICAgZGVmIGYoY2xzLCBhcmcxLCBhcmcyLCAuLi4pOiAuLi4KKyAgICAgZiA9IGNsYXNzbWV0aG9kKGYpCisKICAgIEl0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIG9uIHRoZSBjbGFzcyAoZS5nLiBDLmYoKSkgb3Igb24gYW4gaW5zdGFuY2UKICAgIChlLmcuIEMoKS5mKCkpOyB0aGUgaW5zdGFuY2UgaXMgaWdub3JlZCBleGNlcHQgZm9yIGl0cyBjbGFzcy4KICAgIElmIGEgY2xhc3MgbWV0aG9kIGlzIGNhbGxlZCBmb3IgYSBkZXJpdmVkIGNsYXNzLCB0aGUgZGVyaXZlZCBjbGFzcwpAQCAtNjA2LDY3ICs2MDYsNjcgQEAKICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmNtX2NhbGxhYmxlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqY21fY2FsbGFibGU7CiB9IGNsYXNzbWV0aG9kOwogCiBzdGF0aWMgdm9pZAogY21fZGVhbGxvYyhjbGFzc21ldGhvZCAqY20pCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soKFB5T2JqZWN0ICopY20pOwotCVB5X1hERUNSRUYoY20tPmNtX2NhbGxhYmxlKTsKLQlQeV9UWVBFKGNtKS0+dHBfZnJlZSgoUHlPYmplY3QgKiljbSk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soKFB5T2JqZWN0ICopY20pOworICAgIFB5X1hERUNSRUYoY20tPmNtX2NhbGxhYmxlKTsKKyAgICBQeV9UWVBFKGNtKS0+dHBfZnJlZSgoUHlPYmplY3QgKiljbSk7CiB9CiAKIHN0YXRpYyBpbnQKIGNtX3RyYXZlcnNlKGNsYXNzbWV0aG9kICpjbSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoY20tPmNtX2NhbGxhYmxlKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChjbS0+Y21fY2FsbGFibGUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBjbV9jbGVhcihjbGFzc21ldGhvZCAqY20pCiB7Ci0JUHlfQ0xFQVIoY20tPmNtX2NhbGxhYmxlKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihjbS0+Y21fY2FsbGFibGUpOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbV9kZXNjcl9nZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp0eXBlKQogewotCWNsYXNzbWV0aG9kICpjbSA9IChjbGFzc21ldGhvZCAqKXNlbGY7CisgICAgY2xhc3NtZXRob2QgKmNtID0gKGNsYXNzbWV0aG9kICopc2VsZjsKIAotCWlmIChjbS0+Y21fY2FsbGFibGUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJ1bmluaXRpYWxpemVkIGNsYXNzbWV0aG9kIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHR5cGUgPT0gTlVMTCkKLQkJdHlwZSA9IChQeU9iamVjdCAqKShQeV9UWVBFKG9iaikpOwotIAlyZXR1cm4gUHlNZXRob2RfTmV3KGNtLT5jbV9jYWxsYWJsZSwKLQkJCSAgICB0eXBlLCAoUHlPYmplY3QgKikoUHlfVFlQRSh0eXBlKSkpOworICAgIGlmIChjbS0+Y21fY2FsbGFibGUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInVuaW5pdGlhbGl6ZWQgY2xhc3NtZXRob2Qgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAodHlwZSA9PSBOVUxMKQorICAgICAgICB0eXBlID0gKFB5T2JqZWN0ICopKFB5X1RZUEUob2JqKSk7CisgICAgcmV0dXJuIFB5TWV0aG9kX05ldyhjbS0+Y21fY2FsbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCAoUHlPYmplY3QgKikoUHlfVFlQRSh0eXBlKSkpOwogfQogCiBzdGF0aWMgaW50CiBjbV9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JY2xhc3NtZXRob2QgKmNtID0gKGNsYXNzbWV0aG9kICopc2VsZjsKLQlQeU9iamVjdCAqY2FsbGFibGU7CisgICAgY2xhc3NtZXRob2QgKmNtID0gKGNsYXNzbWV0aG9kICopc2VsZjsKKyAgICBQeU9iamVjdCAqY2FsbGFibGU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjbGFzc21ldGhvZCIsIDEsIDEsICZjYWxsYWJsZSkpCi0JCXJldHVybiAtMTsKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJjbGFzc21ldGhvZCIsIGt3ZHMpKQotCQlyZXR1cm4gLTE7Ci0JUHlfSU5DUkVGKGNhbGxhYmxlKTsKLQljbS0+Y21fY2FsbGFibGUgPSBjYWxsYWJsZTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjbGFzc21ldGhvZCIsIDEsIDEsICZjYWxsYWJsZSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJjbGFzc21ldGhvZCIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICBjbS0+Y21fY2FsbGFibGUgPSBjYWxsYWJsZTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5TWVtYmVyRGVmIGNtX21lbWJlcmxpc3RbXSA9IHsKLQl7Il9fZnVuY19fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKGNsYXNzbWV0aG9kLCBjbV9jYWxsYWJsZSksIFJFQURPTkxZfSwKLQl7TlVMTH0gIC8qIFNlbnRpbmVsICovCisgICAgeyJfX2Z1bmNfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihjbGFzc21ldGhvZCwgY21fY2FsbGFibGUpLCBSRUFET05MWX0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKGNsYXNzbWV0aG9kX2RvYywKQEAgLTY5MSw1NyArNjkxLDU3IEBACiBJZiB5b3Ugd2FudCB0aG9zZSwgc2VlIHRoZSBzdGF0aWNtZXRob2QgYnVpbHRpbi4iKTsKIAogUHlUeXBlT2JqZWN0IFB5Q2xhc3NNZXRob2RfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJjbGFzc21ldGhvZCIsCi0Jc2l6ZW9mKGNsYXNzbWV0aG9kKSwKLQkwLAotCShkZXN0cnVjdG9yKWNtX2RlYWxsb2MsCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCi0JY2xhc3NtZXRob2RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY21fdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KWNtX2NsZWFyLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCWNtX21lbWJlcmxpc3QsCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQljbV9kZXNjcl9nZXQsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCWNtX2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImNsYXNzbWV0aG9kIiwKKyAgICBzaXplb2YoY2xhc3NtZXRob2QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpY21fZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCisgICAgY2xhc3NtZXRob2RfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNtX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpY21fY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGNtX21lbWJlcmxpc3QsICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICBjbV9kZXNjcl9nZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgY21faW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBQeU9iamVjdCAqCiBQeUNsYXNzTWV0aG9kX05ldyhQeU9iamVjdCAqY2FsbGFibGUpCiB7Ci0JY2xhc3NtZXRob2QgKmNtID0gKGNsYXNzbWV0aG9kICopCi0JCVB5VHlwZV9HZW5lcmljQWxsb2MoJlB5Q2xhc3NNZXRob2RfVHlwZSwgMCk7Ci0JaWYgKGNtICE9IE5VTEwpIHsKLQkJUHlfSU5DUkVGKGNhbGxhYmxlKTsKLQkJY20tPmNtX2NhbGxhYmxlID0gY2FsbGFibGU7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKiljbTsKKyAgICBjbGFzc21ldGhvZCAqY20gPSAoY2xhc3NtZXRob2QgKikKKyAgICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYygmUHlDbGFzc01ldGhvZF9UeXBlLCAwKTsKKyAgICBpZiAoY20gIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoY2FsbGFibGUpOworICAgICAgICBjbS0+Y21fY2FsbGFibGUgPSBjYWxsYWJsZTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNtOwogfQogCiAKQEAgLTc1MSw4ICs3NTEsOCBAQAogICAgVG8gZGVjbGFyZSBhIHN0YXRpYyBtZXRob2QsIHVzZSB0aGlzIGlkaW9tOgogCiAgICAgIGNsYXNzIEM6Ci0gICAgICAgICBkZWYgZihhcmcxLCBhcmcyLCAuLi4pOiAuLi4KLQkgZiA9IHN0YXRpY21ldGhvZChmKQorICAgICBkZWYgZihhcmcxLCBhcmcyLCAuLi4pOiAuLi4KKyAgICAgZiA9IHN0YXRpY21ldGhvZChmKQogCiAgICBJdCBjYW4gYmUgY2FsbGVkIGVpdGhlciBvbiB0aGUgY2xhc3MgKGUuZy4gQy5mKCkpIG9yIG9uIGFuIGluc3RhbmNlCiAgICAoZS5nLiBDKCkuZigpKTsgdGhlIGluc3RhbmNlIGlzIGlnbm9yZWQgZXhjZXB0IGZvciBpdHMgY2xhc3MuCkBAIC03NjIsNjYgKzc2Miw2NiBAQAogKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqc21fY2FsbGFibGU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpzbV9jYWxsYWJsZTsKIH0gc3RhdGljbWV0aG9kOwogCiBzdGF0aWMgdm9pZAogc21fZGVhbGxvYyhzdGF0aWNtZXRob2QgKnNtKQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKChQeU9iamVjdCAqKXNtKTsKLQlQeV9YREVDUkVGKHNtLT5zbV9jYWxsYWJsZSk7Ci0JUHlfVFlQRShzbSktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc20pOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKChQeU9iamVjdCAqKXNtKTsKKyAgICBQeV9YREVDUkVGKHNtLT5zbV9jYWxsYWJsZSk7CisgICAgUHlfVFlQRShzbSktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc20pOwogfQogCiBzdGF0aWMgaW50CiBzbV90cmF2ZXJzZShzdGF0aWNtZXRob2QgKnNtLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChzbS0+c21fY2FsbGFibGUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNtLT5zbV9jYWxsYWJsZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNtX2NsZWFyKHN0YXRpY21ldGhvZCAqc20pCiB7Ci0JUHlfWERFQ1JFRihzbS0+c21fY2FsbGFibGUpOwotCXNtLT5zbV9jYWxsYWJsZSA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihzbS0+c21fY2FsbGFibGUpOworICAgIHNtLT5zbV9jYWxsYWJsZSA9IE5VTEw7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNtX2Rlc2NyX2dldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0Jc3RhdGljbWV0aG9kICpzbSA9IChzdGF0aWNtZXRob2QgKilzZWxmOworICAgIHN0YXRpY21ldGhvZCAqc20gPSAoc3RhdGljbWV0aG9kICopc2VsZjsKIAotCWlmIChzbS0+c21fY2FsbGFibGUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJ1bmluaXRpYWxpemVkIHN0YXRpY21ldGhvZCBvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihzbS0+c21fY2FsbGFibGUpOwotCXJldHVybiBzbS0+c21fY2FsbGFibGU7CisgICAgaWYgKHNtLT5zbV9jYWxsYWJsZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5pbml0aWFsaXplZCBzdGF0aWNtZXRob2Qgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoc20tPnNtX2NhbGxhYmxlKTsKKyAgICByZXR1cm4gc20tPnNtX2NhbGxhYmxlOwogfQogCiBzdGF0aWMgaW50CiBzbV9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljbWV0aG9kICpzbSA9IChzdGF0aWNtZXRob2QgKilzZWxmOwotCVB5T2JqZWN0ICpjYWxsYWJsZTsKKyAgICBzdGF0aWNtZXRob2QgKnNtID0gKHN0YXRpY21ldGhvZCAqKXNlbGY7CisgICAgUHlPYmplY3QgKmNhbGxhYmxlOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3RhdGljbWV0aG9kIiwgMSwgMSwgJmNhbGxhYmxlKSkKLQkJcmV0dXJuIC0xOwotCWlmICghX1B5QXJnX05vS2V5d29yZHMoInN0YXRpY21ldGhvZCIsIGt3ZHMpKQotCQlyZXR1cm4gLTE7Ci0JUHlfSU5DUkVGKGNhbGxhYmxlKTsKLQlzbS0+c21fY2FsbGFibGUgPSBjYWxsYWJsZTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdGF0aWNtZXRob2QiLCAxLCAxLCAmY2FsbGFibGUpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3Jkcygic3RhdGljbWV0aG9kIiwga3dkcykpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9JTkNSRUYoY2FsbGFibGUpOworICAgIHNtLT5zbV9jYWxsYWJsZSA9IGNhbGxhYmxlOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgc21fbWVtYmVybGlzdFtdID0gewotCXsiX19mdW5jX18iLCBUX09CSkVDVCwgb2Zmc2V0b2Yoc3RhdGljbWV0aG9kLCBzbV9jYWxsYWJsZSksIFJFQURPTkxZfSwKLQl7TlVMTH0gIC8qIFNlbnRpbmVsICovCisgICAgeyJfX2Z1bmNfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihzdGF0aWNtZXRob2QsIHNtX2NhbGxhYmxlKSwgUkVBRE9OTFl9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihzdGF0aWNtZXRob2RfZG9jLApAQCAtODMzLDggKzgzMyw4IEBACiBUbyBkZWNsYXJlIGEgc3RhdGljIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XG5cCiBcblwKICAgICAgY2xhc3MgQzpcblwKLSAgICAgICAgIGRlZiBmKGFyZzEsIGFyZzIsIC4uLik6IC4uLlxuXAotCSBmID0gc3RhdGljbWV0aG9kKGYpXG5cCisgICAgIGRlZiBmKGFyZzEsIGFyZzIsIC4uLik6IC4uLlxuXAorICAgICBmID0gc3RhdGljbWV0aG9kKGYpXG5cCiBcblwKIEl0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIG9uIHRoZSBjbGFzcyAoZS5nLiBDLmYoKSkgb3Igb24gYW4gaW5zdGFuY2VcblwKIChlLmcuIEMoKS5mKCkpLiAgVGhlIGluc3RhbmNlIGlzIGlnbm9yZWQgZXhjZXB0IGZvciBpdHMgY2xhc3MuXG5cCkBAIC04NDMsNTUgKzg0Myw1NSBAQAogRm9yIGEgbW9yZSBhZHZhbmNlZCBjb25jZXB0LCBzZWUgdGhlIGNsYXNzbWV0aG9kIGJ1aWx0aW4uIik7CiAKIFB5VHlwZU9iamVjdCBQeVN0YXRpY01ldGhvZF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInN0YXRpY21ldGhvZCIsCi0Jc2l6ZW9mKHN0YXRpY21ldGhvZCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilzbV9kZWFsbG9jLAkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLAotCXN0YXRpY21ldGhvZF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylzbV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpc21fY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0Jc21fbWVtYmVybGlzdCwJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCXNtX2Rlc2NyX2dldCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0Jc21faW5pdCwJCQkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkJLyogdHBfYWxsb2MgKi8KLQlQeVR5cGVfR2VuZXJpY05ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJzdGF0aWNtZXRob2QiLAorICAgIHNpemVvZihzdGF0aWNtZXRob2QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3Ipc21fZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCisgICAgc3RhdGljbWV0aG9kX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXNtX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpc21fY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHNtX21lbWJlcmxpc3QsICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICBzbV9kZXNjcl9nZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgc21faW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBQeU9iamVjdCAqCiBQeVN0YXRpY01ldGhvZF9OZXcoUHlPYmplY3QgKmNhbGxhYmxlKQogewotCXN0YXRpY21ldGhvZCAqc20gPSAoc3RhdGljbWV0aG9kICopCi0JCVB5VHlwZV9HZW5lcmljQWxsb2MoJlB5U3RhdGljTWV0aG9kX1R5cGUsIDApOwotCWlmIChzbSAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihjYWxsYWJsZSk7Ci0JCXNtLT5zbV9jYWxsYWJsZSA9IGNhbGxhYmxlOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopc207CisgICAgc3RhdGljbWV0aG9kICpzbSA9IChzdGF0aWNtZXRob2QgKikKKyAgICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYygmUHlTdGF0aWNNZXRob2RfVHlwZSwgMCk7CisgICAgaWYgKHNtICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICAgICAgc20tPnNtX2NhbGxhYmxlID0gY2FsbGFibGU7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzbTsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvZ2Vub2JqZWN0LmMgYi9PYmplY3RzL2dlbm9iamVjdC5jCmluZGV4IGMzZmE2NGIuLmFmODEyYzAgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZ2Vub2JqZWN0LmMKKysrIGIvT2JqZWN0cy9nZW5vYmplY3QuYwpAQCAtMTAsMTAzICsxMCwxMDMgQEAKIHN0YXRpYyBpbnQKIGdlbl90cmF2ZXJzZShQeUdlbk9iamVjdCAqZ2VuLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVCgoUHlPYmplY3QgKilnZW4tPmdpX2ZyYW1lKTsKLQlQeV9WSVNJVChnZW4tPmdpX2NvZGUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKChQeU9iamVjdCAqKWdlbi0+Z2lfZnJhbWUpOworICAgIFB5X1ZJU0lUKGdlbi0+Z2lfY29kZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBnZW5fZGVhbGxvYyhQeUdlbk9iamVjdCAqZ2VuKQogewotCVB5T2JqZWN0ICpzZWxmID0gKFB5T2JqZWN0ICopIGdlbjsKKyAgICBQeU9iamVjdCAqc2VsZiA9IChQeU9iamVjdCAqKSBnZW47CiAKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhnZW4pOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKGdlbik7CiAKLQlpZiAoZ2VuLT5naV93ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKHNlbGYpOworICAgIGlmIChnZW4tPmdpX3dlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoc2VsZik7CiAKLQlfUHlPYmplY3RfR0NfVFJBQ0soc2VsZik7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKHNlbGYpOwogCi0JaWYgKGdlbi0+Z2lfZnJhbWUgIT0gTlVMTCAmJiBnZW4tPmdpX2ZyYW1lLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKLQkJLyogR2VuZXJhdG9yIGlzIHBhdXNlZCwgc28gd2UgbmVlZCB0byBjbG9zZSAqLwotCQlQeV9UWVBFKGdlbiktPnRwX2RlbChzZWxmKTsKLQkJaWYgKHNlbGYtPm9iX3JlZmNudCA+IDApCi0JCQlyZXR1cm47CQkvKiByZXN1cnJlY3RlZC4gIDooICovCi0JfQorICAgIGlmIChnZW4tPmdpX2ZyYW1lICE9IE5VTEwgJiYgZ2VuLT5naV9mcmFtZS0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7CisgICAgICAgIC8qIEdlbmVyYXRvciBpcyBwYXVzZWQsIHNvIHdlIG5lZWQgdG8gY2xvc2UgKi8KKyAgICAgICAgUHlfVFlQRShnZW4pLT50cF9kZWwoc2VsZik7CisgICAgICAgIGlmIChzZWxmLT5vYl9yZWZjbnQgPiAwKQorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3VycmVjdGVkLiAgOiggKi8KKyAgICB9CiAKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhzZWxmKTsKLQlQeV9DTEVBUihnZW4tPmdpX2ZyYW1lKTsKLQlQeV9DTEVBUihnZW4tPmdpX2NvZGUpOwotCVB5T2JqZWN0X0dDX0RlbChnZW4pOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKHNlbGYpOworICAgIFB5X0NMRUFSKGdlbi0+Z2lfZnJhbWUpOworICAgIFB5X0NMRUFSKGdlbi0+Z2lfY29kZSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGdlbik7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9zZW5kX2V4KFB5R2VuT2JqZWN0ICpnZW4sIFB5T2JqZWN0ICphcmcsIGludCBleGMpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeUZyYW1lT2JqZWN0ICpmID0gZ2VuLT5naV9mcmFtZTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlGcmFtZU9iamVjdCAqZiA9IGdlbi0+Z2lfZnJhbWU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmIChnZW4tPmdpX3J1bm5pbmcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImdlbmVyYXRvciBhbHJlYWR5IGV4ZWN1dGluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGY9PU5VTEwgfHwgZi0+Zl9zdGFja3RvcCA9PSBOVUxMKSB7Ci0JCS8qIE9ubHkgc2V0IGV4Y2VwdGlvbiBpZiBjYWxsZWQgZnJvbSBzZW5kKCkgKi8KLQkJaWYgKGFyZyAmJiAhZXhjKQotCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChnZW4tPmdpX3J1bm5pbmcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdG9yIGFscmVhZHkgZXhlY3V0aW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZj09TlVMTCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKKyAgICAgICAgLyogT25seSBzZXQgZXhjZXB0aW9uIGlmIGNhbGxlZCBmcm9tIHNlbmQoKSAqLworICAgICAgICBpZiAoYXJnICYmICFleGMpCisgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZi0+Zl9sYXN0aSA9PSAtMSkgewotCQlpZiAoYXJnICYmIGFyZyAhPSBQeV9Ob25lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiY2FuJ3Qgc2VuZCBub24tTm9uZSB2YWx1ZSB0byBhICIKLQkJCQkJImp1c3Qtc3RhcnRlZCBnZW5lcmF0b3IiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogUHVzaCBhcmcgb250byB0aGUgZnJhbWUncyB2YWx1ZSBzdGFjayAqLwotCQlyZXN1bHQgPSBhcmcgPyBhcmcgOiBQeV9Ob25lOwotCSAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7Ci0JICAgICAgICAqKGYtPmZfc3RhY2t0b3ArKykgPSByZXN1bHQ7Ci0JfQorICAgIGlmIChmLT5mX2xhc3RpID09IC0xKSB7CisgICAgICAgIGlmIChhcmcgJiYgYXJnICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHNlbmQgbm9uLU5vbmUgdmFsdWUgdG8gYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImp1c3Qtc3RhcnRlZCBnZW5lcmF0b3IiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUHVzaCBhcmcgb250byB0aGUgZnJhbWUncyB2YWx1ZSBzdGFjayAqLworICAgICAgICByZXN1bHQgPSBhcmcgPyBhcmcgOiBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgKihmLT5mX3N0YWNrdG9wKyspID0gcmVzdWx0OworICAgIH0KIAotCS8qIEdlbmVyYXRvcnMgYWx3YXlzIHJldHVybiB0byB0aGVpciBtb3N0IHJlY2VudCBjYWxsZXIsIG5vdAotCSAqIG5lY2Vzc2FyaWx5IHRoZWlyIGNyZWF0b3IuICovCi0JUHlfWElOQ1JFRih0c3RhdGUtPmZyYW1lKTsKLQlhc3NlcnQoZi0+Zl9iYWNrID09IE5VTEwpOwotCWYtPmZfYmFjayA9IHRzdGF0ZS0+ZnJhbWU7CisgICAgLyogR2VuZXJhdG9ycyBhbHdheXMgcmV0dXJuIHRvIHRoZWlyIG1vc3QgcmVjZW50IGNhbGxlciwgbm90CisgICAgICogbmVjZXNzYXJpbHkgdGhlaXIgY3JlYXRvci4gKi8KKyAgICBQeV9YSU5DUkVGKHRzdGF0ZS0+ZnJhbWUpOworICAgIGFzc2VydChmLT5mX2JhY2sgPT0gTlVMTCk7CisgICAgZi0+Zl9iYWNrID0gdHN0YXRlLT5mcmFtZTsKIAotCWdlbi0+Z2lfcnVubmluZyA9IDE7Ci0JcmVzdWx0ID0gUHlFdmFsX0V2YWxGcmFtZUV4KGYsIGV4Yyk7Ci0JZ2VuLT5naV9ydW5uaW5nID0gMDsKKyAgICBnZW4tPmdpX3J1bm5pbmcgPSAxOworICAgIHJlc3VsdCA9IFB5RXZhbF9FdmFsRnJhbWVFeChmLCBleGMpOworICAgIGdlbi0+Z2lfcnVubmluZyA9IDA7CiAKLQkvKiBEb24ndCBrZWVwIHRoZSByZWZlcmVuY2UgdG8gZl9iYWNrIGFueSBsb25nZXIgdGhhbiBuZWNlc3NhcnkuICBJdAotCSAqIG1heSBrZWVwIGEgY2hhaW4gb2YgZnJhbWVzIGFsaXZlIG9yIGl0IGNvdWxkIGNyZWF0ZSBhIHJlZmVyZW5jZQotCSAqIGN5Y2xlLiAqLwotCWFzc2VydChmLT5mX2JhY2sgPT0gdHN0YXRlLT5mcmFtZSk7Ci0JUHlfQ0xFQVIoZi0+Zl9iYWNrKTsKKyAgICAvKiBEb24ndCBrZWVwIHRoZSByZWZlcmVuY2UgdG8gZl9iYWNrIGFueSBsb25nZXIgdGhhbiBuZWNlc3NhcnkuICBJdAorICAgICAqIG1heSBrZWVwIGEgY2hhaW4gb2YgZnJhbWVzIGFsaXZlIG9yIGl0IGNvdWxkIGNyZWF0ZSBhIHJlZmVyZW5jZQorICAgICAqIGN5Y2xlLiAqLworICAgIGFzc2VydChmLT5mX2JhY2sgPT0gdHN0YXRlLT5mcmFtZSk7CisgICAgUHlfQ0xFQVIoZi0+Zl9iYWNrKTsKIAotCS8qIElmIHRoZSBnZW5lcmF0b3IganVzdCByZXR1cm5lZCAoYXMgb3Bwb3NlZCB0byB5aWVsZGluZyksIHNpZ25hbAotCSAqIHRoYXQgdGhlIGdlbmVyYXRvciBpcyBleGhhdXN0ZWQuICovCi0JaWYgKHJlc3VsdCA9PSBQeV9Ob25lICYmIGYtPmZfc3RhY2t0b3AgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmVzdWx0ID0gTlVMTDsKLQkJLyogU2V0IGV4Y2VwdGlvbiBpZiBub3QgY2FsbGVkIGJ5IGdlbl9pdGVybmV4dCgpICovCi0JCWlmIChhcmcpCi0JCQlQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOwotCX0KKyAgICAvKiBJZiB0aGUgZ2VuZXJhdG9yIGp1c3QgcmV0dXJuZWQgKGFzIG9wcG9zZWQgdG8geWllbGRpbmcpLCBzaWduYWwKKyAgICAgKiB0aGF0IHRoZSBnZW5lcmF0b3IgaXMgZXhoYXVzdGVkLiAqLworICAgIGlmIChyZXN1bHQgPT0gUHlfTm9uZSAmJiBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIC8qIFNldCBleGNlcHRpb24gaWYgbm90IGNhbGxlZCBieSBnZW5faXRlcm5leHQoKSAqLworICAgICAgICBpZiAoYXJnKQorICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKKyAgICB9CiAKLQlpZiAoIXJlc3VsdCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKLQkJLyogZ2VuZXJhdG9yIGNhbid0IGJlIHJlcnVuLCBzbyByZWxlYXNlIHRoZSBmcmFtZSAqLwotCQlQeV9ERUNSRUYoZik7Ci0JCWdlbi0+Z2lfZnJhbWUgPSBOVUxMOwotCX0KKyAgICBpZiAoIXJlc3VsdCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKKyAgICAgICAgLyogZ2VuZXJhdG9yIGNhbid0IGJlIHJlcnVuLCBzbyByZWxlYXNlIHRoZSBmcmFtZSAqLworICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgICAgIGdlbi0+Z2lfZnJhbWUgPSBOVUxMOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHNlbmRfZG9jLApAQCAtMTE2LDcgKzExNiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuX3NlbmQoUHlHZW5PYmplY3QgKmdlbiwgUHlPYmplY3QgKmFyZykKIHsKLQlyZXR1cm4gZ2VuX3NlbmRfZXgoZ2VuLCBhcmcsIDApOworICAgIHJldHVybiBnZW5fc2VuZF9leChnZW4sIGFyZywgMCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjbG9zZV9kb2MsCkBAIC0xMjUsODMgKzEyNSw4MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9jbG9zZShQeUdlbk9iamVjdCAqZ2VuLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmV0dmFsOwotCVB5RXJyX1NldE5vbmUoUHlFeGNfR2VuZXJhdG9yRXhpdCk7Ci0JcmV0dmFsID0gZ2VuX3NlbmRfZXgoZ2VuLCBQeV9Ob25lLCAxKTsKLQlpZiAocmV0dmFsKSB7Ci0JCVB5X0RFQ1JFRihyZXR2YWwpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJnZW5lcmF0b3IgaWdub3JlZCBHZW5lcmF0b3JFeGl0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKQotCSAgICB8fCBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0dlbmVyYXRvckV4aXQpKQotCXsKLQkJUHlFcnJfQ2xlYXIoKTsJLyogaWdub3JlIHRoZXNlIGVycm9ycyAqLwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqcmV0dmFsOworICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfR2VuZXJhdG9yRXhpdCk7CisgICAgcmV0dmFsID0gZ2VuX3NlbmRfZXgoZ2VuLCBQeV9Ob25lLCAxKTsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRvciBpZ25vcmVkIEdlbmVyYXRvckV4aXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pCisgICAgICAgIHx8IFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfR2VuZXJhdG9yRXhpdCkpCisgICAgeworICAgICAgICBQeUVycl9DbGVhcigpOyAgICAgICAgICAvKiBpZ25vcmUgdGhlc2UgZXJyb3JzICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAogZ2VuX2RlbChQeU9iamVjdCAqc2VsZikKIHsKLSAgICAgICAgUHlPYmplY3QgKnJlczsKLSAgICAgICAgUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKLQlQeUdlbk9iamVjdCAqZ2VuID0gKFB5R2VuT2JqZWN0ICopc2VsZjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisgICAgUHlHZW5PYmplY3QgKmdlbiA9IChQeUdlbk9iamVjdCAqKXNlbGY7CiAKLQlpZiAoZ2VuLT5naV9mcmFtZSA9PSBOVUxMIHx8IGdlbi0+Z2lfZnJhbWUtPmZfc3RhY2t0b3AgPT0gTlVMTCkKLQkJLyogR2VuZXJhdG9yIGlzbid0IHBhdXNlZCwgc28gbm8gbmVlZCB0byBjbG9zZSAqLwotCQlyZXR1cm47CisgICAgaWYgKGdlbi0+Z2lfZnJhbWUgPT0gTlVMTCB8fCBnZW4tPmdpX2ZyYW1lLT5mX3N0YWNrdG9wID09IE5VTEwpCisgICAgICAgIC8qIEdlbmVyYXRvciBpc24ndCBwYXVzZWQsIHNvIG5vIG5lZWQgdG8gY2xvc2UgKi8KKyAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIC8qIFRlbXBvcmFyaWx5IHJlc3VycmVjdCB0aGUgb2JqZWN0LiAqLwotICAgICAgICBhc3NlcnQoc2VsZi0+b2JfcmVmY250ID09IDApOwotICAgICAgICBzZWxmLT5vYl9yZWZjbnQgPSAxOworICAgIC8qIFRlbXBvcmFyaWx5IHJlc3VycmVjdCB0aGUgb2JqZWN0LiAqLworICAgIGFzc2VydChzZWxmLT5vYl9yZWZjbnQgPT0gMCk7CisgICAgc2VsZi0+b2JfcmVmY250ID0gMTsKIAotICAgICAgICAvKiBTYXZlIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgaWYgYW55LiAqLwotICAgICAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKKyAgICAvKiBTYXZlIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgaWYgYW55LiAqLworICAgIFB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwogCi0JcmVzID0gZ2VuX2Nsb3NlKGdlbiwgTlVMTCk7CisgICAgcmVzID0gZ2VuX2Nsb3NlKGdlbiwgTlVMTCk7CiAKLQlpZiAocmVzID09IE5VTEwpCi0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShzZWxmKTsKLQllbHNlCi0JCVB5X0RFQ1JFRihyZXMpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAKLSAgICAgICAgLyogUmVzdG9yZSB0aGUgc2F2ZWQgZXhjZXB0aW9uLiAqLwotICAgICAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOworICAgIC8qIFJlc3RvcmUgdGhlIHNhdmVkIGV4Y2VwdGlvbi4gKi8KKyAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOwogCi0gICAgICAgIC8qIFVuZG8gdGhlIHRlbXBvcmFyeSByZXN1cnJlY3Rpb247IGNhbid0IHVzZSBERUNSRUYgaGVyZSwgaXQgd291bGQKLSAgICAgICAgICogY2F1c2UgYSByZWN1cnNpdmUgY2FsbC4KLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydChzZWxmLT5vYl9yZWZjbnQgPiAwKTsKLSAgICAgICAgaWYgKC0tc2VsZi0+b2JfcmVmY250ID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAvKiB0aGlzIGlzIHRoZSBub3JtYWwgcGF0aCBvdXQgKi8KKyAgICAvKiBVbmRvIHRoZSB0ZW1wb3JhcnkgcmVzdXJyZWN0aW9uOyBjYW4ndCB1c2UgREVDUkVGIGhlcmUsIGl0IHdvdWxkCisgICAgICogY2F1c2UgYSByZWN1cnNpdmUgY2FsbC4KKyAgICAgKi8KKyAgICBhc3NlcnQoc2VsZi0+b2JfcmVmY250ID4gMCk7CisgICAgaWYgKC0tc2VsZi0+b2JfcmVmY250ID09IDApCisgICAgICAgIHJldHVybjsgLyogdGhpcyBpcyB0aGUgbm9ybWFsIHBhdGggb3V0ICovCiAKLSAgICAgICAgLyogY2xvc2UoKSByZXN1cnJlY3RlZCBpdCEgIE1ha2UgaXQgbG9vayBsaWtlIHRoZSBvcmlnaW5hbCBQeV9ERUNSRUYKLSAgICAgICAgICogbmV2ZXIgaGFwcGVuZWQuCi0gICAgICAgICAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUHlfc3NpemVfdCByZWZjbnQgPSBzZWxmLT5vYl9yZWZjbnQ7Ci0gICAgICAgICAgICAgICAgX1B5X05ld1JlZmVyZW5jZShzZWxmKTsKLSAgICAgICAgICAgICAgICBzZWxmLT5vYl9yZWZjbnQgPSByZWZjbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KFB5VHlwZV9JU19HQyhzZWxmLT5vYl90eXBlKSAmJgotICAgICAgICAgICAgICAgX1B5X0FTX0dDKHNlbGYpLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsKKyAgICAvKiBjbG9zZSgpIHJlc3VycmVjdGVkIGl0ISAgTWFrZSBpdCBsb29rIGxpa2UgdGhlIG9yaWdpbmFsIFB5X0RFQ1JFRgorICAgICAqIG5ldmVyIGhhcHBlbmVkLgorICAgICAqLworICAgIHsKKyAgICAgICAgUHlfc3NpemVfdCByZWZjbnQgPSBzZWxmLT5vYl9yZWZjbnQ7CisgICAgICAgIF9QeV9OZXdSZWZlcmVuY2Uoc2VsZik7CisgICAgICAgIHNlbGYtPm9iX3JlZmNudCA9IHJlZmNudDsKKyAgICB9CisgICAgYXNzZXJ0KFB5VHlwZV9JU19HQyhzZWxmLT5vYl90eXBlKSAmJgorICAgICAgICAgICBfUHlfQVNfR0Moc2VsZiktPmdjLmdjX3JlZnMgIT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpOwogCi0gICAgICAgIC8qIElmIFB5X1JFRl9ERUJVRywgX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgX1B5X1JlZlRvdGFsLCBzbwotICAgICAgICAgKiB3ZSBuZWVkIHRvIHVuZG8gdGhhdC4gKi8KLSAgICAgICAgX1B5X0RFQ19SRUZUT1RBTDsKLSAgICAgICAgLyogSWYgUHlfVFJBQ0VfUkVGUywgX1B5X05ld1JlZmVyZW5jZSByZS1hZGRlZCBzZWxmIHRvIHRoZSBvYmplY3QKLSAgICAgICAgICogY2hhaW4sIHNvIG5vIG1vcmUgdG8gZG8gdGhlcmUuCi0gICAgICAgICAqIElmIENPVU5UX0FMTE9DUywgdGhlIG9yaWdpbmFsIGRlY3JlZiBidW1wZWQgdHBfZnJlZXMsIGFuZAotICAgICAgICAgKiBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCB0cF9hbGxvY3M6ICBib3RoIG9mIHRob3NlIG5lZWQgdG8gYmUKLSAgICAgICAgICogdW5kb25lLgotICAgICAgICAgKi8KKyAgICAvKiBJZiBQeV9SRUZfREVCVUcsIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIF9QeV9SZWZUb3RhbCwgc28KKyAgICAgKiB3ZSBuZWVkIHRvIHVuZG8gdGhhdC4gKi8KKyAgICBfUHlfREVDX1JFRlRPVEFMOworICAgIC8qIElmIFB5X1RSQUNFX1JFRlMsIF9QeV9OZXdSZWZlcmVuY2UgcmUtYWRkZWQgc2VsZiB0byB0aGUgb2JqZWN0CisgICAgICogY2hhaW4sIHNvIG5vIG1vcmUgdG8gZG8gdGhlcmUuCisgICAgICogSWYgQ09VTlRfQUxMT0NTLCB0aGUgb3JpZ2luYWwgZGVjcmVmIGJ1bXBlZCB0cF9mcmVlcywgYW5kCisgICAgICogX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgdHBfYWxsb2NzOiAgYm90aCBvZiB0aG9zZSBuZWVkIHRvIGJlCisgICAgICogdW5kb25lLgorICAgICAqLwogI2lmZGVmIENPVU5UX0FMTE9DUwotICAgICAgICAtLXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWVzOwotICAgICAgICAtLXNlbGYtPm9iX3R5cGUtPnRwX2FsbG9jczsKKyAgICAtLXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWVzOworICAgIC0tc2VsZi0+b2JfdHlwZS0+dHBfYWxsb2NzOwogI2VuZGlmCiB9CiAKQEAgLTIxNCw5MSArMjE0LDkxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuX3Rocm93KFB5R2VuT2JqZWN0ICpnZW4sIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp0eXA7Ci0JUHlPYmplY3QgKnRiID0gTlVMTDsKLQlQeU9iamVjdCAqdmFsID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdHlwOworICAgIFB5T2JqZWN0ICp0YiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnZhbCA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0aHJvdyIsIDEsIDMsICZ0eXAsICZ2YWwsICZ0YikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRocm93IiwgMSwgMywgJnR5cCwgJnZhbCwgJnRiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBGaXJzdCwgY2hlY2sgdGhlIHRyYWNlYmFjayBhcmd1bWVudCwgcmVwbGFjaW5nIE5vbmUgd2l0aAotCSAgIE5VTEwuICovCi0JaWYgKHRiID09IFB5X05vbmUpCi0JCXRiID0gTlVMTDsKLQllbHNlIGlmICh0YiAhPSBOVUxMICYmICFQeVRyYWNlQmFja19DaGVjayh0YikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ0aHJvdygpIHRoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSB0cmFjZWJhY2sgb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBGaXJzdCwgY2hlY2sgdGhlIHRyYWNlYmFjayBhcmd1bWVudCwgcmVwbGFjaW5nIE5vbmUgd2l0aAorICAgICAgIE5VTEwuICovCisgICAgaWYgKHRiID09IFB5X05vbmUpCisgICAgICAgIHRiID0gTlVMTDsKKyAgICBlbHNlIGlmICh0YiAhPSBOVUxMICYmICFQeVRyYWNlQmFja19DaGVjayh0YikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJ0aHJvdygpIHRoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSB0cmFjZWJhY2sgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRih0eXApOwotCVB5X1hJTkNSRUYodmFsKTsKLQlQeV9YSU5DUkVGKHRiKTsKKyAgICBQeV9JTkNSRUYodHlwKTsKKyAgICBQeV9YSU5DUkVGKHZhbCk7CisgICAgUHlfWElOQ1JFRih0Yik7CiAKLQlpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0eXApKSB7Ci0JCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmdHlwLCAmdmFsLCAmdGIpOwotCX0KKyAgICBpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0eXApKSB7CisgICAgICAgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmdHlwLCAmdmFsLCAmdGIpOworICAgIH0KIAotCWVsc2UgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodHlwKSkgewotCQkvKiBSYWlzaW5nIGFuIGluc3RhbmNlLiAgVGhlIHZhbHVlIHNob3VsZCBiZSBhIGR1bW15LiAqLwotCQlpZiAodmFsICYmIHZhbCAhPSBQeV9Ob25lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAiaW5zdGFuY2UgZXhjZXB0aW9uIG1heSBub3QgaGF2ZSBhIHNlcGFyYXRlIHZhbHVlIik7Ci0JCQlnb3RvIGZhaWxlZF90aHJvdzsKLQkJfQotCQllbHNlIHsKLQkJCS8qIE5vcm1hbGl6ZSB0byByYWlzZSA8Y2xhc3M+LCA8aW5zdGFuY2U+ICovCi0JCQlQeV9YREVDUkVGKHZhbCk7Ci0JCQl2YWwgPSB0eXA7Ci0JCQl0eXAgPSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHR5cCk7Ci0JCQlQeV9JTkNSRUYodHlwKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogTm90IHNvbWV0aGluZyB5b3UgY2FuIHJhaXNlLiAgdGhyb3coKSBmYWlscy4gKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImV4Y2VwdGlvbnMgbXVzdCBiZSBjbGFzc2VzLCBvciBpbnN0YW5jZXMsIG5vdCAlcyIsCi0JCQkgICAgIHR5cC0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQlnb3RvIGZhaWxlZF90aHJvdzsKLQl9CisgICAgZWxzZSBpZiAoUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh0eXApKSB7CisgICAgICAgIC8qIFJhaXNpbmcgYW4gaW5zdGFuY2UuICBUaGUgdmFsdWUgc2hvdWxkIGJlIGEgZHVtbXkuICovCisgICAgICAgIGlmICh2YWwgJiYgdmFsICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICJpbnN0YW5jZSBleGNlcHRpb24gbWF5IG5vdCBoYXZlIGEgc2VwYXJhdGUgdmFsdWUiKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkX3Rocm93OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogTm9ybWFsaXplIHRvIHJhaXNlIDxjbGFzcz4sIDxpbnN0YW5jZT4gKi8KKyAgICAgICAgICAgIFB5X1hERUNSRUYodmFsKTsKKyAgICAgICAgICAgIHZhbCA9IHR5cDsKKyAgICAgICAgICAgIHR5cCA9IFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2xhc3ModHlwKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0eXApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBOb3Qgc29tZXRoaW5nIHlvdSBjYW4gcmFpc2UuICB0aHJvdygpIGZhaWxzLiAqLworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnMgbXVzdCBiZSBjbGFzc2VzLCBvciBpbnN0YW5jZXMsIG5vdCAlcyIsCisgICAgICAgICAgICAgICAgICAgICB0eXAtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgZ290byBmYWlsZWRfdGhyb3c7CisgICAgfQogCi0JUHlFcnJfUmVzdG9yZSh0eXAsIHZhbCwgdGIpOwotCXJldHVybiBnZW5fc2VuZF9leChnZW4sIFB5X05vbmUsIDEpOworICAgIFB5RXJyX1Jlc3RvcmUodHlwLCB2YWwsIHRiKTsKKyAgICByZXR1cm4gZ2VuX3NlbmRfZXgoZ2VuLCBQeV9Ob25lLCAxKTsKIAogZmFpbGVkX3Rocm93OgotCS8qIERpZG4ndCB1c2Ugb3VyIGFyZ3VtZW50cywgc28gcmVzdG9yZSB0aGVpciBvcmlnaW5hbCByZWZjb3VudHMgKi8KLQlQeV9ERUNSRUYodHlwKTsKLQlQeV9YREVDUkVGKHZhbCk7Ci0JUHlfWERFQ1JFRih0Yik7Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogRGlkbid0IHVzZSBvdXIgYXJndW1lbnRzLCBzbyByZXN0b3JlIHRoZWlyIG9yaWdpbmFsIHJlZmNvdW50cyAqLworICAgIFB5X0RFQ1JFRih0eXApOworICAgIFB5X1hERUNSRUYodmFsKTsKKyAgICBQeV9YREVDUkVGKHRiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuX2l0ZXJuZXh0KFB5R2VuT2JqZWN0ICpnZW4pCiB7Ci0JcmV0dXJuIGdlbl9zZW5kX2V4KGdlbiwgTlVMTCwgMCk7CisgICAgcmV0dXJuIGdlbl9zZW5kX2V4KGdlbiwgTlVMTCwgMCk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9yZXByKFB5R2VuT2JqZWN0ICpnZW4pCiB7Ci0JY2hhciAqY29kZV9uYW1lOwotCWNvZGVfbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKCgoUHlDb2RlT2JqZWN0ICopZ2VuLT5naV9jb2RlKS0+Y29fbmFtZSk7Ci0JaWYgKGNvZGVfbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGdlbmVyYXRvciBvYmplY3QgJS4yMDBzIGF0ICVwPiIsCi0JCQkJICAgY29kZV9uYW1lLCBnZW4pOworICAgIGNoYXIgKmNvZGVfbmFtZTsKKyAgICBjb2RlX25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZygoKFB5Q29kZU9iamVjdCAqKWdlbi0+Z2lfY29kZSktPmNvX25hbWUpOworICAgIGlmIChjb2RlX25hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxnZW5lcmF0b3Igb2JqZWN0ICUuMjAwcyBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbmFtZSwgZ2VuKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuX2dldF9uYW1lKFB5R2VuT2JqZWN0ICpnZW4pCiB7Ci0JUHlPYmplY3QgKm5hbWUgPSAoKFB5Q29kZU9iamVjdCAqKWdlbi0+Z2lfY29kZSktPmNvX25hbWU7Ci0JUHlfSU5DUkVGKG5hbWUpOwotCXJldHVybiBuYW1lOworICAgIFB5T2JqZWN0ICpuYW1lID0gKChQeUNvZGVPYmplY3QgKilnZW4tPmdpX2NvZGUpLT5jb19uYW1lOworICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gbmFtZTsKIH0KIAogCkBAIC0zMDYsMTA5ICszMDYsMTA5IEBACiAiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0b3IncyBhc3NvY2lhdGVkIGNvZGUgb2JqZWN0LiIpOwogCiBzdGF0aWMgUHlHZXRTZXREZWYgZ2VuX2dldHNldGxpc3RbXSA9IHsKLQl7Il9fbmFtZV9fIiwgKGdldHRlcilnZW5fZ2V0X25hbWUsIE5VTEwsIGdlbl9fbmFtZV9fZG9jX199LAotCXtOVUxMfQorICAgIHsiX19uYW1lX18iLCAoZ2V0dGVyKWdlbl9nZXRfbmFtZSwgTlVMTCwgZ2VuX19uYW1lX19kb2NfX30sCisgICAge05VTEx9CiB9OwogCiAKIHN0YXRpYyBQeU1lbWJlckRlZiBnZW5fbWVtYmVybGlzdFtdID0gewotCXsiZ2lfZnJhbWUiLAlUX09CSkVDVCwgb2Zmc2V0b2YoUHlHZW5PYmplY3QsIGdpX2ZyYW1lKSwJUk99LAotCXsiZ2lfcnVubmluZyIsCVRfSU5ULCAgICBvZmZzZXRvZihQeUdlbk9iamVjdCwgZ2lfcnVubmluZyksCVJPfSwKLSAgICAgICAgeyJnaV9jb2RlIiwgICAgIFRfT0JKRUNULCBvZmZzZXRvZihQeUdlbk9iamVjdCwgZ2lfY29kZSksICBST30sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJnaV9mcmFtZSIsICAgICAgICBUX09CSkVDVCwgb2Zmc2V0b2YoUHlHZW5PYmplY3QsIGdpX2ZyYW1lKSwgICAgICBST30sCisgICAgeyJnaV9ydW5uaW5nIiwgICAgICBUX0lOVCwgICAgb2Zmc2V0b2YoUHlHZW5PYmplY3QsIGdpX3J1bm5pbmcpLCAgICBST30sCisgICAgeyJnaV9jb2RlIiwgICAgIFRfT0JKRUNULCBvZmZzZXRvZihQeUdlbk9iamVjdCwgZ2lfY29kZSksICBST30sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBnZW5fbWV0aG9kc1tdID0gewotCXsic2VuZCIsKFB5Q0Z1bmN0aW9uKWdlbl9zZW5kLCBNRVRIX08sIHNlbmRfZG9jfSwKLQl7InRocm93IiwoUHlDRnVuY3Rpb24pZ2VuX3Rocm93LCBNRVRIX1ZBUkFSR1MsIHRocm93X2RvY30sCi0JeyJjbG9zZSIsKFB5Q0Z1bmN0aW9uKWdlbl9jbG9zZSwgTUVUSF9OT0FSR1MsIGNsb3NlX2RvY30sCi0Je05VTEwsIE5VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJzZW5kIiwoUHlDRnVuY3Rpb24pZ2VuX3NlbmQsIE1FVEhfTywgc2VuZF9kb2N9LAorICAgIHsidGhyb3ciLChQeUNGdW5jdGlvbilnZW5fdGhyb3csIE1FVEhfVkFSQVJHUywgdGhyb3dfZG9jfSwKKyAgICB7ImNsb3NlIiwoUHlDRnVuY3Rpb24pZ2VuX2Nsb3NlLCBNRVRIX05PQVJHUywgY2xvc2VfZG9jfSwKKyAgICB7TlVMTCwgTlVMTH0gICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlHZW5fVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJnZW5lcmF0b3IiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5R2VuT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZ2VuX2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsIAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZ2VuX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKWdlbl90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0gCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCW9mZnNldG9mKFB5R2VuT2JqZWN0LCBnaV93ZWFrcmVmbGlzdCksCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZ2VuX2l0ZXJuZXh0LAkJLyogdHBfaXRlcm5leHQgKi8KLQlnZW5fbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCWdlbl9tZW1iZXJsaXN0LAkJCQkvKiB0cF9tZW1iZXJzICovCi0JZ2VuX2dldHNldGxpc3QsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJnZW5lcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeUdlbk9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilnZW5fZGVhbGxvYywgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWdlbl9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWdlbl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeUdlbk9iamVjdCwgZ2lfd2Vha3JlZmxpc3QpLCAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylnZW5faXRlcm5leHQsICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGdlbl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGdlbl9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGdlbl9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCiAKLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KLQkwLAkJCQkJLyogdHBfaXNfZ2MgKi8KLQkwLAkJCQkJLyogdHBfYmFzZXMgKi8KLQkwLAkJCQkJLyogdHBfbXJvICovCi0JMCwJCQkJCS8qIHRwX2NhY2hlICovCi0JMCwJCQkJCS8qIHRwX3N1YmNsYXNzZXMgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3QgKi8KLQlnZW5fZGVsLAkJCQkvKiB0cF9kZWwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pc19nYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FjaGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N1YmNsYXNzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0ICovCisgICAgZ2VuX2RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWwgKi8KIH07CiAKIFB5T2JqZWN0ICoKIFB5R2VuX05ldyhQeUZyYW1lT2JqZWN0ICpmKQogewotCVB5R2VuT2JqZWN0ICpnZW4gPSBQeU9iamVjdF9HQ19OZXcoUHlHZW5PYmplY3QsICZQeUdlbl9UeXBlKTsKLQlpZiAoZ2VuID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZ2VuLT5naV9mcmFtZSA9IGY7Ci0JUHlfSU5DUkVGKGYtPmZfY29kZSk7Ci0JZ2VuLT5naV9jb2RlID0gKFB5T2JqZWN0ICopKGYtPmZfY29kZSk7Ci0JZ2VuLT5naV9ydW5uaW5nID0gMDsKLQlnZW4tPmdpX3dlYWtyZWZsaXN0ID0gTlVMTDsKLQlfUHlPYmplY3RfR0NfVFJBQ0soZ2VuKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopZ2VuOworICAgIFB5R2VuT2JqZWN0ICpnZW4gPSBQeU9iamVjdF9HQ19OZXcoUHlHZW5PYmplY3QsICZQeUdlbl9UeXBlKTsKKyAgICBpZiAoZ2VuID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZ2VuLT5naV9mcmFtZSA9IGY7CisgICAgUHlfSU5DUkVGKGYtPmZfY29kZSk7CisgICAgZ2VuLT5naV9jb2RlID0gKFB5T2JqZWN0ICopKGYtPmZfY29kZSk7CisgICAgZ2VuLT5naV9ydW5uaW5nID0gMDsKKyAgICBnZW4tPmdpX3dlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soZ2VuKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZ2VuOwogfQogCiBpbnQKIFB5R2VuX05lZWRzRmluYWxpemluZyhQeUdlbk9iamVjdCAqZ2VuKQogewotCWludCBpOwotCVB5RnJhbWVPYmplY3QgKmYgPSBnZW4tPmdpX2ZyYW1lOworICAgIGludCBpOworICAgIFB5RnJhbWVPYmplY3QgKmYgPSBnZW4tPmdpX2ZyYW1lOwogCi0JaWYgKGYgPT0gTlVMTCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwgfHwgZi0+Zl9pYmxvY2sgPD0gMCkKLQkJcmV0dXJuIDA7IC8qIG5vIGZyYW1lIG9yIGVtcHR5IGJsb2Nrc3RhY2sgPT0gbm8gZmluYWxpemF0aW9uICovCisgICAgaWYgKGYgPT0gTlVMTCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwgfHwgZi0+Zl9pYmxvY2sgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7IC8qIG5vIGZyYW1lIG9yIGVtcHR5IGJsb2Nrc3RhY2sgPT0gbm8gZmluYWxpemF0aW9uICovCiAKLQkvKiBBbnkgYmxvY2sgdHlwZSBiZXNpZGVzIGEgbG9vcCByZXF1aXJlcyBjbGVhbnVwLiAqLwotCWkgPSBmLT5mX2libG9jazsKLQl3aGlsZSAoLS1pID49IDApIHsKLQkJaWYgKGYtPmZfYmxvY2tzdGFja1tpXS5iX3R5cGUgIT0gU0VUVVBfTE9PUCkKLQkJCXJldHVybiAxOwotCX0KKyAgICAvKiBBbnkgYmxvY2sgdHlwZSBiZXNpZGVzIGEgbG9vcCByZXF1aXJlcyBjbGVhbnVwLiAqLworICAgIGkgPSBmLT5mX2libG9jazsKKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgaWYgKGYtPmZfYmxvY2tzdGFja1tpXS5iX3R5cGUgIT0gU0VUVVBfTE9PUCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KIAotCS8qIE5vIGJsb2NrcyBleGNlcHQgbG9vcHMsIGl0J3Mgc2FmZSB0byBza2lwIGZpbmFsaXphdGlvbi4gKi8KLQlyZXR1cm4gMDsKKyAgICAvKiBObyBibG9ja3MgZXhjZXB0IGxvb3BzLCBpdCdzIHNhZmUgdG8gc2tpcCBmaW5hbGl6YXRpb24uICovCisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2ludG9iamVjdC5jIGIvT2JqZWN0cy9pbnRvYmplY3QuYwppbmRleCBiMzAyZDJmLi43ZDcwYmZiIDEwMDY0NAotLS0gYS9PYmplY3RzL2ludG9iamVjdC5jCisrKyBiL09iamVjdHMvaW50b2JqZWN0LmMKQEAgLTEwLDcgKzEwLDcgQEAKIGxvbmcKIFB5SW50X0dldE1heCh2b2lkKQogewotCXJldHVybiBMT05HX01BWDsJLyogVG8gaW5pdGlhbGl6ZSBzeXMubWF4aW50ICovCisgICAgcmV0dXJuIExPTkdfTUFYOyAgICAgICAgICAgIC8qIFRvIGluaXRpYWxpemUgc3lzLm1heGludCAqLwogfQogCiAvKiBJbnRlZ2VycyBhcmUgcXVpdGUgbm9ybWFsIG9iamVjdHMsIHRvIG1ha2Ugb2JqZWN0IGhhbmRsaW5nIHVuaWZvcm0uCkBAIC0zMCwxMyArMzAsMTMgQEAKICAgIHZpYSBhYnVzZSBvZiB0aGVpciBvYl90eXBlIG1lbWJlcnMuCiAqLwogCi0jZGVmaW5lIEJMT0NLX1NJWkUJMTAwMAkvKiAxSyBsZXNzIHR5cGljYWwgbWFsbG9jIG92ZXJoZWFkICovCi0jZGVmaW5lIEJIRUFEX1NJWkUJOAkvKiBFbm91Z2ggZm9yIGEgNjQtYml0IHBvaW50ZXIgKi8KLSNkZWZpbmUgTl9JTlRPQkpFQ1RTCSgoQkxPQ0tfU0laRSAtIEJIRUFEX1NJWkUpIC8gc2l6ZW9mKFB5SW50T2JqZWN0KSkKKyNkZWZpbmUgQkxPQ0tfU0laRSAgICAgIDEwMDAgICAgLyogMUsgbGVzcyB0eXBpY2FsIG1hbGxvYyBvdmVyaGVhZCAqLworI2RlZmluZSBCSEVBRF9TSVpFICAgICAgOCAgICAgICAvKiBFbm91Z2ggZm9yIGEgNjQtYml0IHBvaW50ZXIgKi8KKyNkZWZpbmUgTl9JTlRPQkpFQ1RTICAgICgoQkxPQ0tfU0laRSAtIEJIRUFEX1NJWkUpIC8gc2l6ZW9mKFB5SW50T2JqZWN0KSkKIAogc3RydWN0IF9pbnRibG9jayB7Ci0Jc3RydWN0IF9pbnRibG9jayAqbmV4dDsKLQlQeUludE9iamVjdCBvYmplY3RzW05fSU5UT0JKRUNUU107CisgICAgc3RydWN0IF9pbnRibG9jayAqbmV4dDsKKyAgICBQeUludE9iamVjdCBvYmplY3RzW05fSU5UT0JKRUNUU107CiB9OwogCiB0eXBlZGVmIHN0cnVjdCBfaW50YmxvY2sgUHlJbnRCbG9jazsKQEAgLTQ3LDI4ICs0NywyOCBAQAogc3RhdGljIFB5SW50T2JqZWN0ICoKIGZpbGxfZnJlZV9saXN0KHZvaWQpCiB7Ci0JUHlJbnRPYmplY3QgKnAsICpxOwotCS8qIFB5dGhvbidzIG9iamVjdCBhbGxvY2F0b3IgaXNuJ3QgYXBwcm9wcmlhdGUgZm9yIGxhcmdlIGJsb2Nrcy4gKi8KLQlwID0gKFB5SW50T2JqZWN0ICopIFB5TWVtX01BTExPQyhzaXplb2YoUHlJbnRCbG9jaykpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiAoUHlJbnRPYmplY3QgKikgUHlFcnJfTm9NZW1vcnkoKTsKLQkoKFB5SW50QmxvY2sgKilwKS0+bmV4dCA9IGJsb2NrX2xpc3Q7Ci0JYmxvY2tfbGlzdCA9IChQeUludEJsb2NrICopcDsKLQkvKiBMaW5rIHRoZSBpbnQgb2JqZWN0cyB0b2dldGhlciwgZnJvbSByZWFyIHRvIGZyb250LCB0aGVuIHJldHVybgotCSAgIHRoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGludCBvYmplY3QgaW4gdGhlIGJsb2NrLiAqLwotCXAgPSAmKChQeUludEJsb2NrICopcCktPm9iamVjdHNbMF07Ci0JcSA9IHAgKyBOX0lOVE9CSkVDVFM7Ci0Jd2hpbGUgKC0tcSA+IHApCi0JCVB5X1RZUEUocSkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopKHEtMSk7Ci0JUHlfVFlQRShxKSA9IE5VTEw7Ci0JcmV0dXJuIHAgKyBOX0lOVE9CSkVDVFMgLSAxOworICAgIFB5SW50T2JqZWN0ICpwLCAqcTsKKyAgICAvKiBQeXRob24ncyBvYmplY3QgYWxsb2NhdG9yIGlzbid0IGFwcHJvcHJpYXRlIGZvciBsYXJnZSBibG9ja3MuICovCisgICAgcCA9IChQeUludE9iamVjdCAqKSBQeU1lbV9NQUxMT0Moc2l6ZW9mKFB5SW50QmxvY2spKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKFB5SW50T2JqZWN0ICopIFB5RXJyX05vTWVtb3J5KCk7CisgICAgKChQeUludEJsb2NrICopcCktPm5leHQgPSBibG9ja19saXN0OworICAgIGJsb2NrX2xpc3QgPSAoUHlJbnRCbG9jayAqKXA7CisgICAgLyogTGluayB0aGUgaW50IG9iamVjdHMgdG9nZXRoZXIsIGZyb20gcmVhciB0byBmcm9udCwgdGhlbiByZXR1cm4KKyAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBpbnQgb2JqZWN0IGluIHRoZSBibG9jay4gKi8KKyAgICBwID0gJigoUHlJbnRCbG9jayAqKXApLT5vYmplY3RzWzBdOworICAgIHEgPSBwICsgTl9JTlRPQkpFQ1RTOworICAgIHdoaWxlICgtLXEgPiBwKQorICAgICAgICBQeV9UWVBFKHEpID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKShxLTEpOworICAgIFB5X1RZUEUocSkgPSBOVUxMOworICAgIHJldHVybiBwICsgTl9JTlRPQkpFQ1RTIC0gMTsKIH0KIAogI2lmbmRlZiBOU01BTExQT1NJTlRTCi0jZGVmaW5lIE5TTUFMTFBPU0lOVFMJCTI1NworI2RlZmluZSBOU01BTExQT1NJTlRTICAgICAgICAgICAyNTcKICNlbmRpZgogI2lmbmRlZiBOU01BTExORUdJTlRTCi0jZGVmaW5lIE5TTUFMTE5FR0lOVFMJCTUKKyNkZWZpbmUgTlNNQUxMTkVHSU5UUyAgICAgICAgICAgNQogI2VuZGlmCiAjaWYgTlNNQUxMTkVHSU5UUyArIE5TTUFMTFBPU0lOVFMgPiAwCiAvKiBSZWZlcmVuY2VzIHRvIHNtYWxsIGludGVnZXJzIGFyZSBzYXZlZCBpbiB0aGlzIGFycmF5IHNvIHRoYXQgdGhleQpAQCAtODYsMzI2ICs4NiwzMjYgQEAKIFB5T2JqZWN0ICoKIFB5SW50X0Zyb21Mb25nKGxvbmcgaXZhbCkKIHsKLQlyZWdpc3RlciBQeUludE9iamVjdCAqdjsKKyAgICByZWdpc3RlciBQeUludE9iamVjdCAqdjsKICNpZiBOU01BTExORUdJTlRTICsgTlNNQUxMUE9TSU5UUyA+IDAKLQlpZiAoLU5TTUFMTE5FR0lOVFMgPD0gaXZhbCAmJiBpdmFsIDwgTlNNQUxMUE9TSU5UUykgewotCQl2ID0gc21hbGxfaW50c1tpdmFsICsgTlNNQUxMTkVHSU5UU107Ci0JCVB5X0lOQ1JFRih2KTsKKyAgICBpZiAoLU5TTUFMTE5FR0lOVFMgPD0gaXZhbCAmJiBpdmFsIDwgTlNNQUxMUE9TSU5UUykgeworICAgICAgICB2ID0gc21hbGxfaW50c1tpdmFsICsgTlNNQUxMTkVHSU5UU107CisgICAgICAgIFB5X0lOQ1JFRih2KTsKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkJaWYgKGl2YWwgPj0gMCkKLQkJCXF1aWNrX2ludF9hbGxvY3MrKzsKLQkJZWxzZQotCQkJcXVpY2tfbmVnX2ludF9hbGxvY3MrKzsKKyAgICAgICAgaWYgKGl2YWwgPj0gMCkKKyAgICAgICAgICAgIHF1aWNrX2ludF9hbGxvY3MrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcXVpY2tfbmVnX2ludF9hbGxvY3MrKzsKICNlbmRpZgotCQlyZXR1cm4gKFB5T2JqZWN0ICopIHY7Ci0JfQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIHY7CisgICAgfQogI2VuZGlmCi0JaWYgKGZyZWVfbGlzdCA9PSBOVUxMKSB7Ci0JCWlmICgoZnJlZV9saXN0ID0gZmlsbF9mcmVlX2xpc3QoKSkgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQkvKiBJbmxpbmUgUHlPYmplY3RfTmV3ICovCi0JdiA9IGZyZWVfbGlzdDsKLQlmcmVlX2xpc3QgPSAoUHlJbnRPYmplY3QgKilQeV9UWVBFKHYpOwotCVB5T2JqZWN0X0lOSVQodiwgJlB5SW50X1R5cGUpOwotCXYtPm9iX2l2YWwgPSBpdmFsOwotCXJldHVybiAoUHlPYmplY3QgKikgdjsKKyAgICBpZiAoZnJlZV9saXN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKChmcmVlX2xpc3QgPSBmaWxsX2ZyZWVfbGlzdCgpKSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIElubGluZSBQeU9iamVjdF9OZXcgKi8KKyAgICB2ID0gZnJlZV9saXN0OworICAgIGZyZWVfbGlzdCA9IChQeUludE9iamVjdCAqKVB5X1RZUEUodik7CisgICAgUHlPYmplY3RfSU5JVCh2LCAmUHlJbnRfVHlwZSk7CisgICAgdi0+b2JfaXZhbCA9IGl2YWw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSB2OwogfQogCiBQeU9iamVjdCAqCiBQeUludF9Gcm9tU2l6ZV90KHNpemVfdCBpdmFsKQogewotCWlmIChpdmFsIDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaXZhbCk7Ci0JcmV0dXJuIF9QeUxvbmdfRnJvbVNpemVfdChpdmFsKTsKKyAgICBpZiAoaXZhbCA8PSBMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWl2YWwpOworICAgIHJldHVybiBfUHlMb25nX0Zyb21TaXplX3QoaXZhbCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5SW50X0Zyb21Tc2l6ZV90KFB5X3NzaXplX3QgaXZhbCkKIHsKLQlpZiAoaXZhbCA+PSBMT05HX01JTiAmJiBpdmFsIDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaXZhbCk7Ci0JcmV0dXJuIF9QeUxvbmdfRnJvbVNzaXplX3QoaXZhbCk7CisgICAgaWYgKGl2YWwgPj0gTE9OR19NSU4gJiYgaXZhbCA8PSBMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWl2YWwpOworICAgIHJldHVybiBfUHlMb25nX0Zyb21Tc2l6ZV90KGl2YWwpOwogfQogCiBzdGF0aWMgdm9pZAogaW50X2RlYWxsb2MoUHlJbnRPYmplY3QgKnYpCiB7Ci0JaWYgKFB5SW50X0NoZWNrRXhhY3QodikpIHsKLQkJUHlfVFlQRSh2KSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKilmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IHY7Ci0JfQotCWVsc2UKLQkJUHlfVFlQRSh2KS0+dHBfZnJlZSgoUHlPYmplY3QgKil2KTsKKyAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeV9UWVBFKHYpID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKWZyZWVfbGlzdDsKKyAgICAgICAgZnJlZV9saXN0ID0gdjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9UWVBFKHYpLT50cF9mcmVlKChQeU9iamVjdCAqKXYpOwogfQogCiBzdGF0aWMgdm9pZAogaW50X2ZyZWUoUHlJbnRPYmplY3QgKnYpCiB7Ci0JUHlfVFlQRSh2KSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKilmcmVlX2xpc3Q7Ci0JZnJlZV9saXN0ID0gdjsKKyAgICBQeV9UWVBFKHYpID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKWZyZWVfbGlzdDsKKyAgICBmcmVlX2xpc3QgPSB2OwogfQogCiBsb25nCiBQeUludF9Bc0xvbmcocmVnaXN0ZXIgUHlPYmplY3QgKm9wKQogewotCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JUHlJbnRPYmplY3QgKmlvOwotCWxvbmcgdmFsOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7CisgICAgUHlJbnRPYmplY3QgKmlvOworICAgIGxvbmcgdmFsOwogCi0JaWYgKG9wICYmIFB5SW50X0NoZWNrKG9wKSkKLQkJcmV0dXJuIFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0Kikgb3ApOworICAgIGlmIChvcCAmJiBQeUludF9DaGVjayhvcCkpCisgICAgICAgIHJldHVybiBQeUludF9BU19MT05HKChQeUludE9iamVjdCopIG9wKTsKIAotCWlmIChvcCA9PSBOVUxMIHx8IChuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKLQkgICAgbmItPm5iX2ludCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKG9wID09IE5VTEwgfHwgKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAorICAgICAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfaW50KSAob3ApOwotCWlmIChpbyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFQeUludF9DaGVjayhpbykpIHsKLQkJaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKLQkJCS8qIGdvdCBhIGxvbmc/ID0+IHJldHJ5IGludCBjb252ZXJzaW9uICovCi0JCQl2YWwgPSBQeUxvbmdfQXNMb25nKChQeU9iamVjdCAqKWlvKTsKLQkJCVB5X0RFQ1JFRihpbyk7Ci0JCQlpZiAoKHZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXR1cm4gdmFsOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUHlfREVDUkVGKGlvKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICJfX2ludF9fIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICBpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKKyAgICBpZiAoaW8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlJbnRfQ2hlY2soaW8pKSB7CisgICAgICAgIGlmIChQeUxvbmdfQ2hlY2soaW8pKSB7CisgICAgICAgICAgICAvKiBnb3QgYSBsb25nPyA9PiByZXRyeSBpbnQgY29udmVyc2lvbiAqLworICAgICAgICAgICAgdmFsID0gUHlMb25nX0FzTG9uZygoUHlPYmplY3QgKilpbyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW8pOworICAgICAgICAgICAgaWYgKCh2YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9faW50X18gbWV0aG9kIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlciIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JdmFsID0gUHlJbnRfQVNfTE9ORyhpbyk7Ci0JUHlfREVDUkVGKGlvKTsKKyAgICB2YWwgPSBQeUludF9BU19MT05HKGlvKTsKKyAgICBQeV9ERUNSRUYoaW8pOwogCi0JcmV0dXJuIHZhbDsKKyAgICByZXR1cm4gdmFsOwogfQogCiBQeV9zc2l6ZV90CiBQeUludF9Bc1NzaXplX3QocmVnaXN0ZXIgUHlPYmplY3QgKm9wKQogewogI2lmIFNJWkVPRl9TSVpFX1QgIT0gU0laRU9GX0xPTkcKLQlQeU51bWJlck1ldGhvZHMgKm5iOwotCVB5SW50T2JqZWN0ICppbzsKLQlQeV9zc2l6ZV90IHZhbDsKKyAgICBQeU51bWJlck1ldGhvZHMgKm5iOworICAgIFB5SW50T2JqZWN0ICppbzsKKyAgICBQeV9zc2l6ZV90IHZhbDsKICNlbmRpZgogCi0JaWYgKG9wID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAob3AgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKFB5SW50X0NoZWNrKG9wKSkKLQkJcmV0dXJuIFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0Kikgb3ApOwotCWlmIChQeUxvbmdfQ2hlY2sob3ApKQotCQlyZXR1cm4gX1B5TG9uZ19Bc1NzaXplX3Qob3ApOworICAgIGlmIChQeUludF9DaGVjayhvcCkpCisgICAgICAgIHJldHVybiBQeUludF9BU19MT05HKChQeUludE9iamVjdCopIG9wKTsKKyAgICBpZiAoUHlMb25nX0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIF9QeUxvbmdfQXNTc2l6ZV90KG9wKTsKICNpZiBTSVpFT0ZfU0laRV9UID09IFNJWkVPRl9MT05HCi0JcmV0dXJuIFB5SW50X0FzTG9uZyhvcCk7CisgICAgcmV0dXJuIFB5SW50X0FzTG9uZyhvcCk7CiAjZWxzZQogCi0JaWYgKChuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKLQkgICAgKG5iLT5uYl9pbnQgPT0gTlVMTCAmJiBuYi0+bmJfbG9uZyA9PSAwKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICgobmIgPSBQeV9UWVBFKG9wKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8CisgICAgICAgIChuYi0+bmJfaW50ID09IE5VTEwgJiYgbmItPm5iX2xvbmcgPT0gMCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChuYi0+bmJfbG9uZyAhPSAwKQotCQlpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2xvbmcpIChvcCk7Ci0JZWxzZQotCQlpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKLQlpZiAoaW8gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmICghUHlJbnRfQ2hlY2soaW8pKSB7Ci0JCWlmIChQeUxvbmdfQ2hlY2soaW8pKSB7Ci0JCQkvKiBnb3QgYSBsb25nPyA9PiByZXRyeSBpbnQgY29udmVyc2lvbiAqLwotCQkJdmFsID0gX1B5TG9uZ19Bc1NzaXplX3QoKFB5T2JqZWN0ICopaW8pOwotCQkJUHlfREVDUkVGKGlvKTsKLQkJCWlmICgodmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiB2YWw7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlQeV9ERUNSRUYoaW8pOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgIl9faW50X18gbWV0aG9kIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlciIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgIGlmIChuYi0+bmJfbG9uZyAhPSAwKQorICAgICAgICBpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2xvbmcpIChvcCk7CisgICAgZWxzZQorICAgICAgICBpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKKyAgICBpZiAoaW8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlJbnRfQ2hlY2soaW8pKSB7CisgICAgICAgIGlmIChQeUxvbmdfQ2hlY2soaW8pKSB7CisgICAgICAgICAgICAvKiBnb3QgYSBsb25nPyA9PiByZXRyeSBpbnQgY29udmVyc2lvbiAqLworICAgICAgICAgICAgdmFsID0gX1B5TG9uZ19Bc1NzaXplX3QoKFB5T2JqZWN0ICopaW8pOworICAgICAgICAgICAgUHlfREVDUkVGKGlvKTsKKyAgICAgICAgICAgIGlmICgodmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW8pOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2ludF9fIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCXZhbCA9IFB5SW50X0FTX0xPTkcoaW8pOwotCVB5X0RFQ1JFRihpbyk7CisgICAgdmFsID0gUHlJbnRfQVNfTE9ORyhpbyk7CisgICAgUHlfREVDUkVGKGlvKTsKIAotCXJldHVybiB2YWw7CisgICAgcmV0dXJuIHZhbDsKICNlbmRpZgogfQogCiB1bnNpZ25lZCBsb25nCiBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2socmVnaXN0ZXIgUHlPYmplY3QgKm9wKQogewotCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JUHlJbnRPYmplY3QgKmlvOwotCXVuc2lnbmVkIGxvbmcgdmFsOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7CisgICAgUHlJbnRPYmplY3QgKmlvOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOwogCi0JaWYgKG9wICYmIFB5SW50X0NoZWNrKG9wKSkKLQkJcmV0dXJuIFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0Kikgb3ApOwotCWlmIChvcCAmJiBQeUxvbmdfQ2hlY2sob3ApKQotCQlyZXR1cm4gUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayhvcCk7CisgICAgaWYgKG9wICYmIFB5SW50X0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0Kikgb3ApOworICAgIGlmIChvcCAmJiBQeUxvbmdfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayhvcCk7CiAKLQlpZiAob3AgPT0gTlVMTCB8fCAobmIgPSBQeV9UWVBFKG9wKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8Ci0JICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7Ci0JfQorICAgIGlmIChvcCA9PSBOVUxMIHx8IChuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKKyAgICAgICAgbmItPm5iX2ludCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZyktMTsKKyAgICB9CiAKLQlpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKLQlpZiAoaW8gPT0gTlVMTCkKLQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOwotCWlmICghUHlJbnRfQ2hlY2soaW8pKSB7Ci0JCWlmIChQeUxvbmdfQ2hlY2soaW8pKSB7Ci0JCQl2YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKChQeU9iamVjdCAqKWlvKTsKLQkJCVB5X0RFQ1JFRihpbyk7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7Ci0JCQlyZXR1cm4gdmFsOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUHlfREVDUkVGKGlvKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICJfX2ludF9fIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIiKTsKLQkJCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKLQkJfQotCX0KKyAgICBpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKKyAgICBpZiAoaW8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOworICAgIGlmICghUHlJbnRfQ2hlY2soaW8pKSB7CisgICAgICAgIGlmIChQeUxvbmdfQ2hlY2soaW8pKSB7CisgICAgICAgICAgICB2YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKChQeU9iamVjdCAqKWlvKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUHlfREVDUkVGKGlvKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19pbnRfXyBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyIik7CisgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQl2YWwgPSBQeUludF9BU19MT05HKGlvKTsKLQlQeV9ERUNSRUYoaW8pOworICAgIHZhbCA9IFB5SW50X0FTX0xPTkcoaW8pOworICAgIFB5X0RFQ1JFRihpbyk7CiAKLQlyZXR1cm4gdmFsOworICAgIHJldHVybiB2YWw7CiB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogdW5zaWduZWQgUFlfTE9OR19MT05HCiBQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCkKIHsKLQlQeU51bWJlck1ldGhvZHMgKm5iOwotCVB5SW50T2JqZWN0ICppbzsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7CisgICAgUHlJbnRPYmplY3QgKmlvOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7CiAKLQlpZiAob3AgJiYgUHlJbnRfQ2hlY2sob3ApKQotCQlyZXR1cm4gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKSBvcCk7Ci0JaWYgKG9wICYmIFB5TG9uZ19DaGVjayhvcCkpCi0JCXJldHVybiBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzayhvcCk7CisgICAgaWYgKG9wICYmIFB5SW50X0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0Kikgb3ApOworICAgIGlmIChvcCAmJiBQeUxvbmdfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2sob3ApOwogCi0JaWYgKG9wID09IE5VTEwgfHwgKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAotCSAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKLQkJcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7Ci0JfQorICAgIGlmIChvcCA9PSBOVUxMIHx8IChuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKKyAgICAgICAgbmItPm5iX2ludCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOworICAgIH0KIAotCWlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfaW50KSAob3ApOwotCWlmIChpbyA9PSBOVUxMKQotCQlyZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKLQlpZiAoIVB5SW50X0NoZWNrKGlvKSkgewotCQlpZiAoUHlMb25nX0NoZWNrKGlvKSkgewotCQkJdmFsID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soKFB5T2JqZWN0ICopaW8pOwotCQkJUHlfREVDUkVGKGlvKTsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOwotCQkJcmV0dXJuIHZhbDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVB5X0RFQ1JFRihpbyk7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAiX19pbnRfXyBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyIik7Ci0JCQlyZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKLQkJfQotCX0KKyAgICBpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKKyAgICBpZiAoaW8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7CisgICAgaWYgKCFQeUludF9DaGVjayhpbykpIHsKKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKKyAgICAgICAgICAgIHZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKChQeU9iamVjdCAqKWlvKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW8pOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2ludF9fIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIiKTsKKyAgICAgICAgICAgIHJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOworICAgICAgICB9CisgICAgfQogCi0JdmFsID0gUHlJbnRfQVNfTE9ORyhpbyk7Ci0JUHlfREVDUkVGKGlvKTsKKyAgICB2YWwgPSBQeUludF9BU19MT05HKGlvKTsKKyAgICBQeV9ERUNSRUYoaW8pOwogCi0JcmV0dXJuIHZhbDsKKyAgICByZXR1cm4gdmFsOwogfQogI2VuZGlmCiAKIFB5T2JqZWN0ICoKIFB5SW50X0Zyb21TdHJpbmcoY2hhciAqcywgY2hhciAqKnBlbmQsIGludCBiYXNlKQogewotCWNoYXIgKmVuZDsKLQlsb25nIHg7Ci0JUHlfc3NpemVfdCBzbGVuOwotCVB5T2JqZWN0ICpzb2JqLCAqc3JlcHI7CisgICAgY2hhciAqZW5kOworICAgIGxvbmcgeDsKKyAgICBQeV9zc2l6ZV90IHNsZW47CisgICAgUHlPYmplY3QgKnNvYmosICpzcmVwcjsKIAotCWlmICgoYmFzZSAhPSAwICYmIGJhc2UgPCAyKSB8fCBiYXNlID4gMzYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImludCgpIGJhc2UgbXVzdCBiZSA+PSAyIGFuZCA8PSAzNiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChiYXNlICE9IDAgJiYgYmFzZSA8IDIpIHx8IGJhc2UgPiAzNikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQoKSBiYXNlIG11c3QgYmUgPj0gMiBhbmQgPD0gMzYiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKLQkJcysrOwotCWVycm5vID0gMDsKLQlpZiAoYmFzZSA9PSAwICYmIHNbMF0gPT0gJzAnKSB7Ci0JCXggPSAobG9uZykgUHlPU19zdHJ0b3VsKHMsICZlbmQsIGJhc2UpOwotCQlpZiAoeCA8IDApCi0JCQlyZXR1cm4gUHlMb25nX0Zyb21TdHJpbmcocywgcGVuZCwgYmFzZSk7Ci0JfQotCWVsc2UKLQkJeCA9IFB5T1Nfc3RydG9sKHMsICZlbmQsIGJhc2UpOwotCWlmIChlbmQgPT0gcyB8fCAhaXNhbG51bShQeV9DSEFSTUFTSyhlbmRbLTFdKSkpCi0JCWdvdG8gYmFkOwotCXdoaWxlICgqZW5kICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmVuZCkpKQotCQllbmQrKzsKLQlpZiAoKmVuZCAhPSAnXDAnKSB7CisgICAgd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKKyAgICAgICAgcysrOworICAgIGVycm5vID0gMDsKKyAgICBpZiAoYmFzZSA9PSAwICYmIHNbMF0gPT0gJzAnKSB7CisgICAgICAgIHggPSAobG9uZykgUHlPU19zdHJ0b3VsKHMsICZlbmQsIGJhc2UpOworICAgICAgICBpZiAoeCA8IDApCisgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21TdHJpbmcocywgcGVuZCwgYmFzZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgeCA9IFB5T1Nfc3RydG9sKHMsICZlbmQsIGJhc2UpOworICAgIGlmIChlbmQgPT0gcyB8fCAhaXNhbG51bShQeV9DSEFSTUFTSyhlbmRbLTFdKSkpCisgICAgICAgIGdvdG8gYmFkOworICAgIHdoaWxlICgqZW5kICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmVuZCkpKQorICAgICAgICBlbmQrKzsKKyAgICBpZiAoKmVuZCAhPSAnXDAnKSB7CiAgIGJhZDoKLQkJc2xlbiA9IHN0cmxlbihzKSA8IDIwMCA/IHN0cmxlbihzKSA6IDIwMDsKLQkJc29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIHNsZW4pOwotCQlpZiAoc29iaiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXNyZXByID0gUHlPYmplY3RfUmVwcihzb2JqKTsKLQkJUHlfREVDUkVGKHNvYmopOwotCQlpZiAoc3JlcHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlICVkOiAlcyIsCi0JCQkgICAgIGJhc2UsIFB5U3RyaW5nX0FTX1NUUklORyhzcmVwcikpOwotCQlQeV9ERUNSRUYoc3JlcHIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoZXJybm8gIT0gMCkKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tU3RyaW5nKHMsIHBlbmQsIGJhc2UpOwotCWlmIChwZW5kKQotCQkqcGVuZCA9IGVuZDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgICAgIHNsZW4gPSBzdHJsZW4ocykgPCAyMDAgPyBzdHJsZW4ocykgOiAyMDA7CisgICAgICAgIHNvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBzbGVuKTsKKyAgICAgICAgaWYgKHNvYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzcmVwciA9IFB5T2JqZWN0X1JlcHIoc29iaik7CisgICAgICAgIFB5X0RFQ1JFRihzb2JqKTsKKyAgICAgICAgaWYgKHNyZXByID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgJWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGJhc2UsIFB5U3RyaW5nX0FTX1NUUklORyhzcmVwcikpOworICAgICAgICBQeV9ERUNSRUYoc3JlcHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3RyaW5nKHMsIHBlbmQsIGJhc2UpOworICAgIGlmIChwZW5kKQorICAgICAgICAqcGVuZCA9IGVuZDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CiB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiBQeU9iamVjdCAqCiBQeUludF9Gcm9tVW5pY29kZShQeV9VTklDT0RFICpzLCBQeV9zc2l6ZV90IGxlbmd0aCwgaW50IGJhc2UpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQljaGFyICpidWZmZXIgPSAoY2hhciAqKVB5TWVtX01BTExPQyhsZW5ndGgrMSk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBjaGFyICpidWZmZXIgPSAoY2hhciAqKVB5TWVtX01BTExPQyhsZW5ndGgrMSk7CiAKLQlpZiAoYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQlpZiAoUHlVbmljb2RlX0VuY29kZURlY2ltYWwocywgbGVuZ3RoLCBidWZmZXIsIE5VTEwpKSB7Ci0JCVB5TWVtX0ZSRUUoYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5SW50X0Zyb21TdHJpbmcoYnVmZmVyLCBOVUxMLCBiYXNlKTsKLQlQeU1lbV9GUkVFKGJ1ZmZlcik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoUHlVbmljb2RlX0VuY29kZURlY2ltYWwocywgbGVuZ3RoLCBidWZmZXIsIE5VTEwpKSB7CisgICAgICAgIFB5TWVtX0ZSRUUoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdCA9IFB5SW50X0Zyb21TdHJpbmcoYnVmZmVyLCBOVUxMLCBiYXNlKTsKKyAgICBQeU1lbV9GUkVFKGJ1ZmZlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KICNlbmRpZgogCkBAIC00MTUsNzEgKzQxNSw3MSBAQAogICAgZG9uJ3QgaGF2ZSBhbnkga25vd2xlZGdlIGFib3V0IGNvbnZlcnNpb24gb2Ygb3RoZXIgdHlwZXMgdG8KICAgIGludGVnZXJzLiAqLwogCi0jZGVmaW5lIENPTlZFUlRfVE9fTE9ORyhvYmosIGxuZykJCVwKLQlpZiAoUHlJbnRfQ2hlY2sob2JqKSkgewkJCVwKLQkJbG5nID0gUHlJbnRfQVNfTE9ORyhvYmopOwlcCi0JfQkJCQkJXAotCWVsc2UgewkJCQkJXAotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwlcCi0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsJXAotCX0KKyNkZWZpbmUgQ09OVkVSVF9UT19MT05HKG9iaiwgbG5nKSAgICAgICAgICAgICAgIFwKKyAgICBpZiAoUHlJbnRfQ2hlY2sob2JqKSkgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG5nID0gUHlJbnRfQVNfTE9ORyhvYmopOyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOyAgICAgICAgICAgICAgIFwKKyAgICB9CiAKIC8qIEFSR1NVU0VEICovCiBzdGF0aWMgaW50CiBpbnRfcHJpbnQoUHlJbnRPYmplY3QgKnYsIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiAgICAgIC8qIGZsYWdzIC0tIG5vdCB1c2VkIGJ1dCByZXF1aXJlZCBieSBpbnRlcmZhY2UgKi8KIHsKLQlsb25nIGludF92YWwgPSB2LT5vYl9pdmFsOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAiJWxkIiwgaW50X3ZhbCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXR1cm4gMDsKKyAgICBsb25nIGludF92YWwgPSB2LT5vYl9pdmFsOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmcHJpbnRmKGZwLCAiJWxkIiwgaW50X3ZhbCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogaW50X2NvbXBhcmUoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIGxvbmcgaSA9IHYtPm9iX2l2YWw7Ci0JcmVnaXN0ZXIgbG9uZyBqID0gdy0+b2JfaXZhbDsKLQlyZXR1cm4gKGkgPCBqKSA/IC0xIDogKGkgPiBqKSA/IDEgOiAwOworICAgIHJlZ2lzdGVyIGxvbmcgaSA9IHYtPm9iX2l2YWw7CisgICAgcmVnaXN0ZXIgbG9uZyBqID0gdy0+b2JfaXZhbDsKKyAgICByZXR1cm4gKGkgPCBqKSA/IC0xIDogKGkgPiBqKSA/IDEgOiAwOwogfQogCiBzdGF0aWMgbG9uZwogaW50X2hhc2goUHlJbnRPYmplY3QgKnYpCiB7Ci0JLyogWFhYIElmIHRoaXMgaXMgY2hhbmdlZCwgeW91IGFsc28gbmVlZCB0byBjaGFuZ2UgdGhlIHdheQotCSAgIFB5dGhvbidzIGxvbmcsIGZsb2F0IGFuZCBjb21wbGV4IHR5cGVzIGFyZSBoYXNoZWQuICovCi0JbG9uZyB4ID0gdiAtPiBvYl9pdmFsOwotCWlmICh4ID09IC0xKQotCQl4ID0gLTI7Ci0JcmV0dXJuIHg7CisgICAgLyogWFhYIElmIHRoaXMgaXMgY2hhbmdlZCwgeW91IGFsc28gbmVlZCB0byBjaGFuZ2UgdGhlIHdheQorICAgICAgIFB5dGhvbidzIGxvbmcsIGZsb2F0IGFuZCBjb21wbGV4IHR5cGVzIGFyZSBoYXNoZWQuICovCisgICAgbG9uZyB4ID0gdiAtPiBvYl9pdmFsOworICAgIGlmICh4ID09IC0xKQorICAgICAgICB4ID0gLTI7CisgICAgcmV0dXJuIHg7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfYWRkKFB5SW50T2JqZWN0ICp2LCBQeUludE9iamVjdCAqdykKIHsKLQlyZWdpc3RlciBsb25nIGEsIGIsIHg7Ci0JQ09OVkVSVF9UT19MT05HKHYsIGEpOwotCUNPTlZFUlRfVE9fTE9ORyh3LCBiKTsKLQkvKiBjYXN0cyBpbiB0aGUgbGluZSBiZWxvdyBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIG9uIG92ZXJmbG93ICovCi0JeCA9IChsb25nKSgodW5zaWduZWQgbG9uZylhICsgYik7Ci0JaWYgKCh4XmEpID49IDAgfHwgKHheYikgPj0gMCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwotCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2FkZCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3KTsKKyAgICByZWdpc3RlciBsb25nIGEsIGIsIHg7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGEpOworICAgIENPTlZFUlRfVE9fTE9ORyh3LCBiKTsKKyAgICAvKiBjYXN0cyBpbiB0aGUgbGluZSBiZWxvdyBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIG9uIG92ZXJmbG93ICovCisgICAgeCA9IChsb25nKSgodW5zaWduZWQgbG9uZylhICsgYik7CisgICAgaWYgKCh4XmEpID49IDAgfHwgKHheYikgPj0gMCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIHJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2FkZCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9zdWIoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIGxvbmcgYSwgYiwgeDsKLQlDT05WRVJUX1RPX0xPTkcodiwgYSk7Ci0JQ09OVkVSVF9UT19MT05HKHcsIGIpOwotCS8qIGNhc3RzIGluIHRoZSBsaW5lIGJlbG93IGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgb24gb3ZlcmZsb3cgKi8KLQl4ID0gKGxvbmcpKCh1bnNpZ25lZCBsb25nKWEgLSBiKTsKLQlpZiAoKHheYSkgPj0gMCB8fCAoeF5+YikgPj0gMCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwotCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3N1YnRyYWN0KChQeU9iamVjdCAqKXYsCi0JCQkJCQkgICAgIChQeU9iamVjdCAqKXcpOworICAgIHJlZ2lzdGVyIGxvbmcgYSwgYiwgeDsKKyAgICBDT05WRVJUX1RPX0xPTkcodiwgYSk7CisgICAgQ09OVkVSVF9UT19MT05HKHcsIGIpOworICAgIC8qIGNhc3RzIGluIHRoZSBsaW5lIGJlbG93IGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgb24gb3ZlcmZsb3cgKi8KKyAgICB4ID0gKGxvbmcpKCh1bnNpZ25lZCBsb25nKWEgLSBiKTsKKyAgICBpZiAoKHheYSkgPj0gMCB8fCAoeF5+YikgPj0gMCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIHJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3N1YnRyYWN0KChQeU9iamVjdCAqKXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopdyk7CiB9CiAKIC8qCkBAIC01MTEsNDAgKzUxMSw0MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9tdWwoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCWxvbmcgYSwgYjsKLQlsb25nIGxvbmdwcm9kOwkJCS8qIGEqYiBpbiBuYXRpdmUgbG9uZyBhcml0aG1ldGljICovCi0JZG91YmxlIGRvdWJsZWRfbG9uZ3Byb2Q7CS8qIChkb3VibGUpbG9uZ3Byb2QgKi8KLQlkb3VibGUgZG91YmxlcHJvZDsJCS8qIChkb3VibGUpYSAqIChkb3VibGUpYiAqLworICAgIGxvbmcgYSwgYjsKKyAgICBsb25nIGxvbmdwcm9kOyAgICAgICAgICAgICAgICAgICAgICAvKiBhKmIgaW4gbmF0aXZlIGxvbmcgYXJpdGhtZXRpYyAqLworICAgIGRvdWJsZSBkb3VibGVkX2xvbmdwcm9kOyAgICAgICAgICAgIC8qIChkb3VibGUpbG9uZ3Byb2QgKi8KKyAgICBkb3VibGUgZG91YmxlcHJvZDsgICAgICAgICAgICAgICAgICAvKiAoZG91YmxlKWEgKiAoZG91YmxlKWIgKi8KIAotCUNPTlZFUlRfVE9fTE9ORyh2LCBhKTsKLQlDT05WRVJUX1RPX0xPTkcodywgYik7Ci0JLyogY2FzdHMgaW4gdGhlIG5leHQgbGluZSBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIG9uIG92ZXJmbG93ICovCi0JbG9uZ3Byb2QgPSAobG9uZykoKHVuc2lnbmVkIGxvbmcpYSAqIGIpOwotCWRvdWJsZXByb2QgPSAoZG91YmxlKWEgKiAoZG91YmxlKWI7Ci0JZG91YmxlZF9sb25ncHJvZCA9IChkb3VibGUpbG9uZ3Byb2Q7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGEpOworICAgIENPTlZFUlRfVE9fTE9ORyh3LCBiKTsKKyAgICAvKiBjYXN0cyBpbiB0aGUgbmV4dCBsaW5lIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgb24gb3ZlcmZsb3cgKi8KKyAgICBsb25ncHJvZCA9IChsb25nKSgodW5zaWduZWQgbG9uZylhICogYik7CisgICAgZG91YmxlcHJvZCA9IChkb3VibGUpYSAqIChkb3VibGUpYjsKKyAgICBkb3VibGVkX2xvbmdwcm9kID0gKGRvdWJsZSlsb25ncHJvZDsKIAotCS8qIEZhc3QgcGF0aCBmb3Igbm9ybWFsIGNhc2U6ICBzbWFsbCBtdWx0aXBsaWNhbmRzLCBhbmQgbm8gaW5mbwotCSAgIGlzIGxvc3QgaW4gZWl0aGVyIG1ldGhvZC4gKi8KLQlpZiAoZG91YmxlZF9sb25ncHJvZCA9PSBkb3VibGVwcm9kKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobG9uZ3Byb2QpOworICAgIC8qIEZhc3QgcGF0aCBmb3Igbm9ybWFsIGNhc2U6ICBzbWFsbCBtdWx0aXBsaWNhbmRzLCBhbmQgbm8gaW5mbworICAgICAgIGlzIGxvc3QgaW4gZWl0aGVyIG1ldGhvZC4gKi8KKyAgICBpZiAoZG91YmxlZF9sb25ncHJvZCA9PSBkb3VibGVwcm9kKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobG9uZ3Byb2QpOwogCi0JLyogU29tZWJvZHkgc29tZXdoZXJlIGxvc3QgaW5mby4gIENsb3NlIGVub3VnaCwgb3Igd2F5IG9mZj8gIE5vdGUKLQkgICB0aGF0IGEgIT0gMCBhbmQgYiAhPSAwIChlbHNlIGRvdWJsZWRfbG9uZ3Byb2QgPT0gZG91YmxlcHJvZCA9PSAwKS4KLQkgICBUaGUgZGlmZmVyZW5jZSBlaXRoZXIgaXMgb3IgaXNuJ3Qgc2lnbmlmaWNhbnQgY29tcGFyZWQgdG8gdGhlCi0JICAgdHJ1ZSB2YWx1ZSAob2Ygd2hpY2ggZG91YmxlcHJvZCBpcyBhIGdvb2QgYXBwcm94aW1hdGlvbikuCi0JKi8KLQl7Ci0JCWNvbnN0IGRvdWJsZSBkaWZmID0gZG91YmxlZF9sb25ncHJvZCAtIGRvdWJsZXByb2Q7Ci0JCWNvbnN0IGRvdWJsZSBhYnNkaWZmID0gZGlmZiA+PSAwLjAgPyBkaWZmIDogLWRpZmY7Ci0JCWNvbnN0IGRvdWJsZSBhYnNwcm9kID0gZG91YmxlcHJvZCA+PSAwLjAgPyBkb3VibGVwcm9kIDoKLQkJCQkJCQkgIC1kb3VibGVwcm9kOwotCQkvKiBhYnNkaWZmL2Fic3Byb2QgPD0gMS8zMiBpZmYKLQkJICAgMzIgKiBhYnNkaWZmIDw9IGFic3Byb2QgLS0gNSBnb29kIGJpdHMgaXMgImNsb3NlIGVub3VnaCIgKi8KLQkJaWYgKDMyLjAgKiBhYnNkaWZmIDw9IGFic3Byb2QpCi0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobG9uZ3Byb2QpOwotCQllbHNlCi0JCQlyZXR1cm4gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyLT5uYl9tdWx0aXBseSh2LCB3KTsKLQl9CisgICAgLyogU29tZWJvZHkgc29tZXdoZXJlIGxvc3QgaW5mby4gIENsb3NlIGVub3VnaCwgb3Igd2F5IG9mZj8gIE5vdGUKKyAgICAgICB0aGF0IGEgIT0gMCBhbmQgYiAhPSAwIChlbHNlIGRvdWJsZWRfbG9uZ3Byb2QgPT0gZG91YmxlcHJvZCA9PSAwKS4KKyAgICAgICBUaGUgZGlmZmVyZW5jZSBlaXRoZXIgaXMgb3IgaXNuJ3Qgc2lnbmlmaWNhbnQgY29tcGFyZWQgdG8gdGhlCisgICAgICAgdHJ1ZSB2YWx1ZSAob2Ygd2hpY2ggZG91YmxlcHJvZCBpcyBhIGdvb2QgYXBwcm94aW1hdGlvbikuCisgICAgKi8KKyAgICB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBkaWZmID0gZG91YmxlZF9sb25ncHJvZCAtIGRvdWJsZXByb2Q7CisgICAgICAgIGNvbnN0IGRvdWJsZSBhYnNkaWZmID0gZGlmZiA+PSAwLjAgPyBkaWZmIDogLWRpZmY7CisgICAgICAgIGNvbnN0IGRvdWJsZSBhYnNwcm9kID0gZG91YmxlcHJvZCA+PSAwLjAgPyBkb3VibGVwcm9kIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1kb3VibGVwcm9kOworICAgICAgICAvKiBhYnNkaWZmL2Fic3Byb2QgPD0gMS8zMiBpZmYKKyAgICAgICAgICAgMzIgKiBhYnNkaWZmIDw9IGFic3Byb2QgLS0gNSBnb29kIGJpdHMgaXMgImNsb3NlIGVub3VnaCIgKi8KKyAgICAgICAgaWYgKDMyLjAgKiBhYnNkaWZmIDw9IGFic3Byb2QpCisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobG9uZ3Byb2QpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyLT5uYl9tdWx0aXBseSh2LCB3KTsKKyAgICB9CiB9CiAKIC8qIEludGVnZXIgb3ZlcmZsb3cgY2hlY2tpbmcgZm9yIHVuYXJ5IG5lZ2F0aW9uOiBvbiBhIDIncy1jb21wbGVtZW50CkBAIC01NTUsNDIwICs1NTUsNDIwIEBACiAgKiB3YXJuIGFib3V0IGFwcGx5aW5nIHVuYXJ5IG1pbnVzIHRvIGFuIHVuc2lnbmVkIG9wZXJhbmQuICBIZW5jZSB0aGUKICAqIHdlaXJkICIwLSIuCiAgKi8KLSNkZWZpbmUgVU5BUllfTkVHX1dPVUxEX09WRVJGTE9XKHgpCVwKLQkoKHgpIDwgMCAmJiAodW5zaWduZWQgbG9uZykoeCkgPT0gMC0odW5zaWduZWQgbG9uZykoeCkpCisjZGVmaW5lIFVOQVJZX05FR19XT1VMRF9PVkVSRkxPVyh4KSAgICAgXAorICAgICgoeCkgPCAwICYmICh1bnNpZ25lZCBsb25nKSh4KSA9PSAwLSh1bnNpZ25lZCBsb25nKSh4KSkKIAogLyogUmV0dXJuIHR5cGUgb2YgaV9kaXZtb2QgKi8KIGVudW0gZGl2bW9kX3Jlc3VsdCB7Ci0JRElWTU9EX09LLAkJLyogQ29ycmVjdCByZXN1bHQgKi8KLQlESVZNT0RfT1ZFUkZMT1csCS8qIE92ZXJmbG93LCB0cnkgYWdhaW4gdXNpbmcgbG9uZ3MgKi8KLQlESVZNT0RfRVJST1IJCS8qIEV4Y2VwdGlvbiByYWlzZWQgKi8KKyAgICBESVZNT0RfT0ssICAgICAgICAgICAgICAgICAgLyogQ29ycmVjdCByZXN1bHQgKi8KKyAgICBESVZNT0RfT1ZFUkZMT1csICAgICAgICAgICAgLyogT3ZlcmZsb3csIHRyeSBhZ2FpbiB1c2luZyBsb25ncyAqLworICAgIERJVk1PRF9FUlJPUiAgICAgICAgICAgICAgICAvKiBFeGNlcHRpb24gcmFpc2VkICovCiB9OwogCiBzdGF0aWMgZW51bSBkaXZtb2RfcmVzdWx0CiBpX2Rpdm1vZChyZWdpc3RlciBsb25nIHgsIHJlZ2lzdGVyIGxvbmcgeSwKICAgICAgICAgIGxvbmcgKnBfeGRpdnksIGxvbmcgKnBfeG1vZHkpCiB7Ci0JbG9uZyB4ZGl2eSwgeG1vZHk7CisgICAgbG9uZyB4ZGl2eSwgeG1vZHk7CiAKLQlpZiAoeSA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkiaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybyIpOwotCQlyZXR1cm4gRElWTU9EX0VSUk9SOwotCX0KLQkvKiAoLXN5cy5tYXhpbnQtMSkvLTEgaXMgdGhlIG9ubHkgb3ZlcmZsb3cgY2FzZS4gKi8KLQlpZiAoeSA9PSAtMSAmJiBVTkFSWV9ORUdfV09VTERfT1ZFUkZMT1coeCkpCi0JCXJldHVybiBESVZNT0RfT1ZFUkZMT1c7Ci0JeGRpdnkgPSB4IC8geTsKLQkvKiB4ZGl2KnkgY2FuIG92ZXJmbG93IG9uIHBsYXRmb3JtcyB3aGVyZSB4L3kgZ2l2ZXMgZmxvb3IoeC95KQotCSAqIGZvciB4IGFuZCB5IHdpdGggZGlmZmVyaW5nIHNpZ25zLiAoVGhpcyBpcyB1bnVzdWFsCi0JICogYmVoYXZpb3VyLCBhbmQgQzk5IHByb2hpYml0cyBpdCwgYnV0IGl0J3MgYWxsb3dlZCBieSBDODk7Ci0JICogZm9yIGFuIGV4YW1wbGUgb2Ygb3ZlcmZsb3csIHRha2UgeCA9IExPTkdfTUlOLCB5ID0gNSBvciB4ID0KLQkgKiBMT05HX01BWCwgeSA9IC01LikgIEhvd2V2ZXIsIHggLSB4ZGl2eSp5IGlzIGFsd2F5cwotCSAqIHJlcHJlc2VudGFibGUgYXMgYSBsb25nLCBzaW5jZSBpdCBsaWVzIHN0cmljdGx5IGJldHdlZW4KLQkgKiAtYWJzKHkpIGFuZCBhYnMoeSkuICBXZSBhZGQgY2FzdHMgdG8gYXZvaWQgaW50ZXJtZWRpYXRlCi0JICogb3ZlcmZsb3cuCi0JICovCi0JeG1vZHkgPSAobG9uZykoeCAtICh1bnNpZ25lZCBsb25nKXhkaXZ5ICogeSk7Ci0JLyogSWYgdGhlIHNpZ25zIG9mIHggYW5kIHkgZGlmZmVyLCBhbmQgdGhlIHJlbWFpbmRlciBpcyBub24tMCwKLQkgKiBDODkgZG9lc24ndCBkZWZpbmUgd2hldGhlciB4ZGl2eSBpcyBub3cgdGhlIGZsb29yIG9yIHRoZQotCSAqIGNlaWxpbmcgb2YgdGhlIGluZmluaXRlbHkgcHJlY2lzZSBxdW90aWVudC4gIFdlIHdhbnQgdGhlIGZsb29yLAotCSAqIGFuZCB3ZSBoYXZlIGl0IGlmZiB0aGUgcmVtYWluZGVyJ3Mgc2lnbiBtYXRjaGVzIHkncy4KLQkgKi8KLQlpZiAoeG1vZHkgJiYgKCh5IF4geG1vZHkpIDwgMCkgLyogaS5lLiBhbmQgc2lnbnMgZGlmZmVyICovKSB7Ci0JCXhtb2R5ICs9IHk7Ci0JCS0teGRpdnk7Ci0JCWFzc2VydCh4bW9keSAmJiAoKHkgXiB4bW9keSkgPj0gMCkpOwotCX0KLQkqcF94ZGl2eSA9IHhkaXZ5OwotCSpwX3htb2R5ID0geG1vZHk7Ci0JcmV0dXJuIERJVk1PRF9PSzsKKyAgICBpZiAoeSA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvIik7CisgICAgICAgIHJldHVybiBESVZNT0RfRVJST1I7CisgICAgfQorICAgIC8qICgtc3lzLm1heGludC0xKS8tMSBpcyB0aGUgb25seSBvdmVyZmxvdyBjYXNlLiAqLworICAgIGlmICh5ID09IC0xICYmIFVOQVJZX05FR19XT1VMRF9PVkVSRkxPVyh4KSkKKyAgICAgICAgcmV0dXJuIERJVk1PRF9PVkVSRkxPVzsKKyAgICB4ZGl2eSA9IHggLyB5OworICAgIC8qIHhkaXYqeSBjYW4gb3ZlcmZsb3cgb24gcGxhdGZvcm1zIHdoZXJlIHgveSBnaXZlcyBmbG9vcih4L3kpCisgICAgICogZm9yIHggYW5kIHkgd2l0aCBkaWZmZXJpbmcgc2lnbnMuIChUaGlzIGlzIHVudXN1YWwKKyAgICAgKiBiZWhhdmlvdXIsIGFuZCBDOTkgcHJvaGliaXRzIGl0LCBidXQgaXQncyBhbGxvd2VkIGJ5IEM4OTsKKyAgICAgKiBmb3IgYW4gZXhhbXBsZSBvZiBvdmVyZmxvdywgdGFrZSB4ID0gTE9OR19NSU4sIHkgPSA1IG9yIHggPQorICAgICAqIExPTkdfTUFYLCB5ID0gLTUuKSAgSG93ZXZlciwgeCAtIHhkaXZ5KnkgaXMgYWx3YXlzCisgICAgICogcmVwcmVzZW50YWJsZSBhcyBhIGxvbmcsIHNpbmNlIGl0IGxpZXMgc3RyaWN0bHkgYmV0d2VlbgorICAgICAqIC1hYnMoeSkgYW5kIGFicyh5KS4gIFdlIGFkZCBjYXN0cyB0byBhdm9pZCBpbnRlcm1lZGlhdGUKKyAgICAgKiBvdmVyZmxvdy4KKyAgICAgKi8KKyAgICB4bW9keSA9IChsb25nKSh4IC0gKHVuc2lnbmVkIGxvbmcpeGRpdnkgKiB5KTsKKyAgICAvKiBJZiB0aGUgc2lnbnMgb2YgeCBhbmQgeSBkaWZmZXIsIGFuZCB0aGUgcmVtYWluZGVyIGlzIG5vbi0wLAorICAgICAqIEM4OSBkb2Vzbid0IGRlZmluZSB3aGV0aGVyIHhkaXZ5IGlzIG5vdyB0aGUgZmxvb3Igb3IgdGhlCisgICAgICogY2VpbGluZyBvZiB0aGUgaW5maW5pdGVseSBwcmVjaXNlIHF1b3RpZW50LiAgV2Ugd2FudCB0aGUgZmxvb3IsCisgICAgICogYW5kIHdlIGhhdmUgaXQgaWZmIHRoZSByZW1haW5kZXIncyBzaWduIG1hdGNoZXMgeSdzLgorICAgICAqLworICAgIGlmICh4bW9keSAmJiAoKHkgXiB4bW9keSkgPCAwKSAvKiBpLmUuIGFuZCBzaWducyBkaWZmZXIgKi8pIHsKKyAgICAgICAgeG1vZHkgKz0geTsKKyAgICAgICAgLS14ZGl2eTsKKyAgICAgICAgYXNzZXJ0KHhtb2R5ICYmICgoeSBeIHhtb2R5KSA+PSAwKSk7CisgICAgfQorICAgICpwX3hkaXZ5ID0geGRpdnk7CisgICAgKnBfeG1vZHkgPSB4bW9keTsKKyAgICByZXR1cm4gRElWTU9EX09LOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2RpdihQeUludE9iamVjdCAqeCwgUHlJbnRPYmplY3QgKnkpCiB7Ci0JbG9uZyB4aSwgeWk7Ci0JbG9uZyBkLCBtOwotCUNPTlZFUlRfVE9fTE9ORyh4LCB4aSk7Ci0JQ09OVkVSVF9UT19MT05HKHksIHlpKTsKLQlzd2l0Y2ggKGlfZGl2bW9kKHhpLCB5aSwgJmQsICZtKSkgewotCWNhc2UgRElWTU9EX09LOgotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZCk7Ci0JY2FzZSBESVZNT0RfT1ZFUkZMT1c6Ci0JCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2RpdmlkZSgoUHlPYmplY3QgKil4LAotCQkJCQkJCSAgIChQeU9iamVjdCAqKXkpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsb25nIHhpLCB5aTsKKyAgICBsb25nIGQsIG07CisgICAgQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKKyAgICBDT05WRVJUX1RPX0xPTkcoeSwgeWkpOworICAgIHN3aXRjaCAoaV9kaXZtb2QoeGksIHlpLCAmZCwgJm0pKSB7CisgICAgY2FzZSBESVZNT0RfT0s6CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhkKTsKKyAgICBjYXNlIERJVk1PRF9PVkVSRkxPVzoKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfZGl2aWRlKChQeU9iamVjdCAqKXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKil5KTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfY2xhc3NpY19kaXYoUHlJbnRPYmplY3QgKngsIFB5SW50T2JqZWN0ICp5KQogewotCWxvbmcgeGksIHlpOwotCWxvbmcgZCwgbTsKLQlDT05WRVJUX1RPX0xPTkcoeCwgeGkpOwotCUNPTlZFUlRfVE9fTE9ORyh5LCB5aSk7Ci0JaWYgKFB5X0RpdmlzaW9uV2FybmluZ0ZsYWcgJiYKLQkgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsICJjbGFzc2ljIGludCBkaXZpc2lvbiIpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3dpdGNoIChpX2Rpdm1vZCh4aSwgeWksICZkLCAmbSkpIHsKLQljYXNlIERJVk1PRF9PSzoKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKGQpOwotCWNhc2UgRElWTU9EX09WRVJGTE9XOgotCQlyZXR1cm4gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyLT5uYl9kaXZpZGUoKFB5T2JqZWN0ICopeCwKLQkJCQkJCQkgICAoUHlPYmplY3QgKil5KTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbG9uZyB4aSwgeWk7CisgICAgbG9uZyBkLCBtOworICAgIENPTlZFUlRfVE9fTE9ORyh4LCB4aSk7CisgICAgQ09OVkVSVF9UT19MT05HKHksIHlpKTsKKyAgICBpZiAoUHlfRGl2aXNpb25XYXJuaW5nRmxhZyAmJgorICAgICAgICBQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgImNsYXNzaWMgaW50IGRpdmlzaW9uIikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzd2l0Y2ggKGlfZGl2bW9kKHhpLCB5aSwgJmQsICZtKSkgeworICAgIGNhc2UgRElWTU9EX09LOgorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZCk7CisgICAgY2FzZSBESVZNT0RfT1ZFUkZMT1c6CisgICAgICAgIHJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2RpdmlkZSgoUHlPYmplY3QgKil4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopeSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X3RydWVfZGl2aWRlKFB5SW50T2JqZWN0ICp4LCBQeUludE9iamVjdCAqeSkKIHsKLQlsb25nIHhpLCB5aTsKLQkvKiBJZiB0aGV5IGFyZW4ndCBib3RoIGludHMsIGdpdmUgc29tZW9uZSBlbHNlIGEgY2hhbmNlLiAgSW4KLQkgICBwYXJ0aWN1bGFyLCB0aGlzIGxldHMgaW50L2xvbmcgZ2V0IGhhbmRsZWQgYnkgbG9uZ3MsIHdoaWNoCi0JICAgdW5kZXJmbG93cyB0byAwIGdyYWNlZnVsbHkgaWYgdGhlIGxvbmcgaXMgdG9vIGJpZyB0byBjb252ZXJ0Ci0JICAgdG8gZmxvYXQuICovCi0JQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKLQlDT05WRVJUX1RPX0xPTkcoeSwgeWkpOwotCWlmICh5aSA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkiZGl2aXNpb24gYnkgemVybyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHhpID09IDApCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeWkgPCAwID8gLTAuMCA6IDAuMCk7CisgICAgbG9uZyB4aSwgeWk7CisgICAgLyogSWYgdGhleSBhcmVuJ3QgYm90aCBpbnRzLCBnaXZlIHNvbWVvbmUgZWxzZSBhIGNoYW5jZS4gIEluCisgICAgICAgcGFydGljdWxhciwgdGhpcyBsZXRzIGludC9sb25nIGdldCBoYW5kbGVkIGJ5IGxvbmdzLCB3aGljaAorICAgICAgIHVuZGVyZmxvd3MgdG8gMCBncmFjZWZ1bGx5IGlmIHRoZSBsb25nIGlzIHRvbyBiaWcgdG8gY29udmVydAorICAgICAgIHRvIGZsb2F0LiAqLworICAgIENPTlZFUlRfVE9fTE9ORyh4LCB4aSk7CisgICAgQ09OVkVSVF9UT19MT05HKHksIHlpKTsKKyAgICBpZiAoeWkgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGl2aXNpb24gYnkgemVybyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHhpID09IDApCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeWkgPCAwID8gLTAuMCA6IDAuMCk7CiAKICNkZWZpbmUgV0lEVEhfT0ZfVUxPTkcgKENIQVJfQklUKlNJWkVPRl9MT05HKQogI2lmIERCTF9NQU5UX0RJRyA8IFdJRFRIX09GX1VMT05HCi0JaWYgKCh4aSA+PSAwID8gMFVMICsgeGkgOiAwVUwgLSB4aSkgPj4gREJMX01BTlRfRElHIHx8Ci0JICAgICh5aSA+PSAwID8gMFVMICsgeWkgOiAwVUwgLSB5aSkgPj4gREJMX01BTlRfRElHKQotCQkvKiBMYXJnZSB4IG9yIHkuICBVc2UgbG9uZyBpbnRlZ2VyIGFyaXRobWV0aWMuICovCi0JCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3RydWVfZGl2aWRlKAotCQkJKFB5T2JqZWN0ICopeCwgKFB5T2JqZWN0ICopeSk7Ci0JZWxzZQorICAgIGlmICgoeGkgPj0gMCA/IDBVTCArIHhpIDogMFVMIC0geGkpID4+IERCTF9NQU5UX0RJRyB8fAorICAgICAgICAoeWkgPj0gMCA/IDBVTCArIHlpIDogMFVMIC0geWkpID4+IERCTF9NQU5UX0RJRykKKyAgICAgICAgLyogTGFyZ2UgeCBvciB5LiAgVXNlIGxvbmcgaW50ZWdlciBhcml0aG1ldGljLiAqLworICAgICAgICByZXR1cm4gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyLT5uYl90cnVlX2RpdmlkZSgKKyAgICAgICAgICAgIChQeU9iamVjdCAqKXgsIChQeU9iamVjdCAqKXkpOworICAgIGVsc2UKICNlbmRpZgotCQkvKiBCb3RoIGludHMgY2FuIGJlIGV4YWN0bHkgcmVwcmVzZW50ZWQgYXMgZG91Ymxlcy4gIERvIGEKLQkJICAgZmxvYXRpbmctcG9pbnQgZGl2aXNpb24uICovCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSl4aSAvIChkb3VibGUpeWkpOworICAgICAgICAvKiBCb3RoIGludHMgY2FuIGJlIGV4YWN0bHkgcmVwcmVzZW50ZWQgYXMgZG91Ymxlcy4gIERvIGEKKyAgICAgICAgICAgZmxvYXRpbmctcG9pbnQgZGl2aXNpb24uICovCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSl4aSAvIChkb3VibGUpeWkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X21vZChQeUludE9iamVjdCAqeCwgUHlJbnRPYmplY3QgKnkpCiB7Ci0JbG9uZyB4aSwgeWk7Ci0JbG9uZyBkLCBtOwotCUNPTlZFUlRfVE9fTE9ORyh4LCB4aSk7Ci0JQ09OVkVSVF9UT19MT05HKHksIHlpKTsKLQlzd2l0Y2ggKGlfZGl2bW9kKHhpLCB5aSwgJmQsICZtKSkgewotCWNhc2UgRElWTU9EX09LOgotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobSk7Ci0JY2FzZSBESVZNT0RfT1ZFUkZMT1c6Ci0JCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3JlbWFpbmRlcigoUHlPYmplY3QgKil4LAotCQkJCQkJCSAgICAgIChQeU9iamVjdCAqKXkpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsb25nIHhpLCB5aTsKKyAgICBsb25nIGQsIG07CisgICAgQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKKyAgICBDT05WRVJUX1RPX0xPTkcoeSwgeWkpOworICAgIHN3aXRjaCAoaV9kaXZtb2QoeGksIHlpLCAmZCwgJm0pKSB7CisgICAgY2FzZSBESVZNT0RfT0s6CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtKTsKKyAgICBjYXNlIERJVk1PRF9PVkVSRkxPVzoKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfcmVtYWluZGVyKChQeU9iamVjdCAqKXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKil5KTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfZGl2bW9kKFB5SW50T2JqZWN0ICp4LCBQeUludE9iamVjdCAqeSkKIHsKLQlsb25nIHhpLCB5aTsKLQlsb25nIGQsIG07Ci0JQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKLQlDT05WRVJUX1RPX0xPTkcoeSwgeWkpOwotCXN3aXRjaCAoaV9kaXZtb2QoeGksIHlpLCAmZCwgJm0pKSB7Ci0JY2FzZSBESVZNT0RfT0s6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIobGwpIiwgZCwgbSk7Ci0JY2FzZSBESVZNT0RfT1ZFUkZMT1c6Ci0JCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2Rpdm1vZCgoUHlPYmplY3QgKil4LAotCQkJCQkJCSAgIChQeU9iamVjdCAqKXkpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsb25nIHhpLCB5aTsKKyAgICBsb25nIGQsIG07CisgICAgQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKKyAgICBDT05WRVJUX1RPX0xPTkcoeSwgeWkpOworICAgIHN3aXRjaCAoaV9kaXZtb2QoeGksIHlpLCAmZCwgJm0pKSB7CisgICAgY2FzZSBESVZNT0RfT0s6CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobGwpIiwgZCwgbSk7CisgICAgY2FzZSBESVZNT0RfT1ZFUkZMT1c6CisgICAgICAgIHJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2Rpdm1vZCgoUHlPYmplY3QgKil4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopeSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X3BvdyhQeUludE9iamVjdCAqdiwgUHlJbnRPYmplY3QgKncsIFB5SW50T2JqZWN0ICp6KQogewotCXJlZ2lzdGVyIGxvbmcgaXYsIGl3LCBpej0wLCBpeCwgdGVtcCwgcHJldjsKLQlDT05WRVJUX1RPX0xPTkcodiwgaXYpOwotCUNPTlZFUlRfVE9fTE9ORyh3LCBpdyk7Ci0JaWYgKGl3IDwgMCkgewotCQlpZiAoKFB5T2JqZWN0ICopeiAhPSBQeV9Ob25lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicG93KCkgMm5kIGFyZ3VtZW50ICIKLQkJCSAgICAgImNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIFJldHVybiBhIGZsb2F0LiAgVGhpcyB3b3JrcyBiZWNhdXNlIHdlIGtub3cgdGhhdAotCQkgICB0aGlzIGNhbGxzIGZsb2F0X3BvdygpIHdoaWNoIGNvbnZlcnRzIGl0cwotCQkgICBhcmd1bWVudHMgdG8gZG91YmxlLiAqLwotCQlyZXR1cm4gUHlGbG9hdF9UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIoCi0JCQkoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAoUHlPYmplY3QgKil6KTsKLQl9Ci0gCWlmICgoUHlPYmplY3QgKil6ICE9IFB5X05vbmUpIHsKLQkJQ09OVkVSVF9UT19MT05HKHosIGl6KTsKLQkJaWYgKGl6ID09IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkicG93KCkgM3JkIGFyZ3VtZW50IGNhbm5vdCBiZSAwIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQkvKgotCSAqIFhYWDogVGhlIG9yaWdpbmFsIGV4cG9uZW50aWF0aW9uIGNvZGUgc3RvcHBlZCBsb29waW5nCi0JICogd2hlbiB0ZW1wIGhpdCB6ZXJvOyB0aGlzIGNvZGUgd2lsbCBjb250aW51ZSBvbndhcmRzCi0JICogdW5uZWNlc3NhcmlseSwgYnV0IGF0IGxlYXN0IGl0IHdvbid0IGNhdXNlIGFueSBlcnJvcnMuCi0JICogSG9wZWZ1bGx5IHRoZSBzcGVlZCBpbXByb3ZlbWVudCBmcm9tIHRoZSBmYXN0IGV4cG9uZW50aWF0aW9uCi0JICogd2lsbCBjb21wZW5zYXRlIGZvciB0aGUgc2xpZ2h0IGluZWZmaWNpZW5jeS4KLQkgKiBYWFg6IEJldHRlciBoYW5kbGluZyBvZiBvdmVyZmxvd3MgaXMgZGVzcGVyYXRlbHkgbmVlZGVkLgotCSAqLwotIAl0ZW1wID0gaXY7Ci0JaXggPSAxOwotCXdoaWxlIChpdyA+IDApIHsKLQkgCXByZXYgPSBpeDsJLyogU2F2ZSB2YWx1ZSBmb3Igb3ZlcmZsb3cgY2hlY2sgKi8KLQkgCWlmIChpdyAmIDEpIHsKLQkJIAlpeCA9IGl4KnRlbXA7Ci0JCQlpZiAodGVtcCA9PSAwKQotCQkJCWJyZWFrOyAvKiBBdm9pZCBpeCAvIDAgKi8KLQkJCWlmIChpeCAvIHRlbXAgIT0gcHJldikgewotCQkJCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKAotCQkJCQkoUHlPYmplY3QgKil2LAotCQkJCQkoUHlPYmplY3QgKil3LAotCQkJCQkoUHlPYmplY3QgKil6KTsKLQkJCX0KLQkJfQotCSAJaXcgPj49IDE7CS8qIFNoaWZ0IGV4cG9uZW50IGRvd24gYnkgMSBiaXQgKi8KLQkgICAgICAgIGlmIChpdz09MCkgYnJlYWs7Ci0JIAlwcmV2ID0gdGVtcDsKLQkgCXRlbXAgKj0gdGVtcDsJLyogU3F1YXJlIHRoZSB2YWx1ZSBvZiB0ZW1wICovCi0JIAlpZiAocHJldiAhPSAwICYmIHRlbXAgLyBwcmV2ICE9IHByZXYpIHsKLQkJCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKAotCQkJCShQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsIChQeU9iamVjdCAqKXopOwotCQl9Ci0JIAlpZiAoaXopIHsKLQkJCS8qIElmIHdlIGRpZCBhIG11bHRpcGxpY2F0aW9uLCBwZXJmb3JtIGEgbW9kdWxvICovCi0JCSAJaXggPSBpeCAlIGl6OwotCQkgCXRlbXAgPSB0ZW1wICUgaXo7Ci0JCX0KLQl9Ci0JaWYgKGl6KSB7Ci0JIAlsb25nIGRpdiwgbW9kOwotCQlzd2l0Y2ggKGlfZGl2bW9kKGl4LCBpeiwgJmRpdiwgJm1vZCkpIHsKLQkJY2FzZSBESVZNT0RfT0s6Ci0JCQlpeCA9IG1vZDsKLQkJCWJyZWFrOwotCQljYXNlIERJVk1PRF9PVkVSRkxPVzoKLQkJCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKAotCQkJCShQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsIChQeU9iamVjdCAqKXopOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGl4KTsKKyAgICByZWdpc3RlciBsb25nIGl2LCBpdywgaXo9MCwgaXgsIHRlbXAsIHByZXY7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGl2KTsKKyAgICBDT05WRVJUX1RPX0xPTkcodywgaXcpOworICAgIGlmIChpdyA8IDApIHsKKyAgICAgICAgaWYgKChQeU9iamVjdCAqKXogIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInBvdygpIDJuZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgbmVnYXRpdmUgd2hlbiAzcmQgYXJndW1lbnQgc3BlY2lmaWVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvKiBSZXR1cm4gYSBmbG9hdC4gIFRoaXMgd29ya3MgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAgICAgICAgICAgdGhpcyBjYWxscyBmbG9hdF9wb3coKSB3aGljaCBjb252ZXJ0cyBpdHMKKyAgICAgICAgICAgYXJndW1lbnRzIHRvIGRvdWJsZS4gKi8KKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKAorICAgICAgICAgICAgKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgKFB5T2JqZWN0ICopeik7CisgICAgfQorICAgIGlmICgoUHlPYmplY3QgKil6ICE9IFB5X05vbmUpIHsKKyAgICAgICAgQ09OVkVSVF9UT19MT05HKHosIGl6KTsKKyAgICAgICAgaWYgKGl6ID09IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3coKSAzcmQgYXJndW1lbnQgY2Fubm90IGJlIDAiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgICogWFhYOiBUaGUgb3JpZ2luYWwgZXhwb25lbnRpYXRpb24gY29kZSBzdG9wcGVkIGxvb3BpbmcKKyAgICAgKiB3aGVuIHRlbXAgaGl0IHplcm87IHRoaXMgY29kZSB3aWxsIGNvbnRpbnVlIG9ud2FyZHMKKyAgICAgKiB1bm5lY2Vzc2FyaWx5LCBidXQgYXQgbGVhc3QgaXQgd29uJ3QgY2F1c2UgYW55IGVycm9ycy4KKyAgICAgKiBIb3BlZnVsbHkgdGhlIHNwZWVkIGltcHJvdmVtZW50IGZyb20gdGhlIGZhc3QgZXhwb25lbnRpYXRpb24KKyAgICAgKiB3aWxsIGNvbXBlbnNhdGUgZm9yIHRoZSBzbGlnaHQgaW5lZmZpY2llbmN5LgorICAgICAqIFhYWDogQmV0dGVyIGhhbmRsaW5nIG9mIG92ZXJmbG93cyBpcyBkZXNwZXJhdGVseSBuZWVkZWQuCisgICAgICovCisgICAgdGVtcCA9IGl2OworICAgIGl4ID0gMTsKKyAgICB3aGlsZSAoaXcgPiAwKSB7CisgICAgICAgIHByZXYgPSBpeDsgICAgICAgICAgICAgIC8qIFNhdmUgdmFsdWUgZm9yIG92ZXJmbG93IGNoZWNrICovCisgICAgICAgIGlmIChpdyAmIDEpIHsKKyAgICAgICAgICAgIGl4ID0gaXgqdGVtcDsKKyAgICAgICAgICAgIGlmICh0ZW1wID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIEF2b2lkIGl4IC8gMCAqLworICAgICAgICAgICAgaWYgKGl4IC8gdGVtcCAhPSBwcmV2KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIoCisgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXYsCisgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXcsCisgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGl3ID4+PSAxOyAgICAgICAgICAgICAgIC8qIFNoaWZ0IGV4cG9uZW50IGRvd24gYnkgMSBiaXQgKi8KKyAgICAgICAgaWYgKGl3PT0wKSBicmVhazsKKyAgICAgICAgcHJldiA9IHRlbXA7CisgICAgICAgIHRlbXAgKj0gdGVtcDsgICAgICAgICAgIC8qIFNxdWFyZSB0aGUgdmFsdWUgb2YgdGVtcCAqLworICAgICAgICBpZiAocHJldiAhPSAwICYmIHRlbXAgLyBwcmV2ICE9IHByZXYpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX3Bvd2VyKAorICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsIChQeU9iamVjdCAqKXopOworICAgICAgICB9CisgICAgICAgIGlmIChpeikgeworICAgICAgICAgICAgLyogSWYgd2UgZGlkIGEgbXVsdGlwbGljYXRpb24sIHBlcmZvcm0gYSBtb2R1bG8gKi8KKyAgICAgICAgICAgIGl4ID0gaXggJSBpejsKKyAgICAgICAgICAgIHRlbXAgPSB0ZW1wICUgaXo7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGl6KSB7CisgICAgICAgIGxvbmcgZGl2LCBtb2Q7CisgICAgICAgIHN3aXRjaCAoaV9kaXZtb2QoaXgsIGl6LCAmZGl2LCAmbW9kKSkgeworICAgICAgICBjYXNlIERJVk1PRF9PSzoKKyAgICAgICAgICAgIGl4ID0gbW9kOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElWTU9EX09WRVJGTE9XOgorICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIoCisgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgKFB5T2JqZWN0ICopeik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoaXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X25lZyhQeUludE9iamVjdCAqdikKIHsKLQlyZWdpc3RlciBsb25nIGE7Ci0JYSA9IHYtPm9iX2l2YWw7Ci0gICAgICAgIC8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLwotCWlmIChVTkFSWV9ORUdfV09VTERfT1ZFUkZMT1coYSkpIHsKLQkJUHlPYmplY3QgKm8gPSBQeUxvbmdfRnJvbUxvbmcoYSk7Ci0JCWlmIChvICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICpyZXN1bHQgPSBQeU51bWJlcl9OZWdhdGl2ZShvKTsKLQkJCVB5X0RFQ1JFRihvKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygtYSk7CisgICAgcmVnaXN0ZXIgbG9uZyBhOworICAgIGEgPSB2LT5vYl9pdmFsOworICAgIC8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLworICAgIGlmIChVTkFSWV9ORUdfV09VTERfT1ZFUkZMT1coYSkpIHsKKyAgICAgICAgUHlPYmplY3QgKm8gPSBQeUxvbmdfRnJvbUxvbmcoYSk7CisgICAgICAgIGlmIChvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeU51bWJlcl9OZWdhdGl2ZShvKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygtYSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfYWJzKFB5SW50T2JqZWN0ICp2KQogewotCWlmICh2LT5vYl9pdmFsID49IDApCi0JCXJldHVybiBpbnRfaW50KHYpOwotCWVsc2UKLQkJcmV0dXJuIGludF9uZWcodik7CisgICAgaWYgKHYtPm9iX2l2YWwgPj0gMCkKKyAgICAgICAgcmV0dXJuIGludF9pbnQodik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gaW50X25lZyh2KTsKIH0KIAogc3RhdGljIGludAogaW50X25vbnplcm8oUHlJbnRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIHYtPm9iX2l2YWwgIT0gMDsKKyAgICByZXR1cm4gdi0+b2JfaXZhbCAhPSAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2ludmVydChQeUludE9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcofnYtPm9iX2l2YWwpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh+di0+b2JfaXZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfbHNoaWZ0KFB5SW50T2JqZWN0ICp2LCBQeUludE9iamVjdCAqdykKIHsKLQlsb25nIGEsIGIsIGM7Ci0JUHlPYmplY3QgKnZ2LCAqd3csICpyZXN1bHQ7CisgICAgbG9uZyBhLCBiLCBjOworICAgIFB5T2JqZWN0ICp2diwgKnd3LCAqcmVzdWx0OwogCi0JQ09OVkVSVF9UT19MT05HKHYsIGEpOwotCUNPTlZFUlRfVE9fTE9ORyh3LCBiKTsKLQlpZiAoYiA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBzaGlmdCBjb3VudCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGEgPT0gMCB8fCBiID09IDApCi0JCXJldHVybiBpbnRfaW50KHYpOwotCWlmIChiID49IExPTkdfQklUKSB7Ci0JCXZ2ID0gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodikpOwotCQlpZiAodnYgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQl3dyA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHcpKTsKLQkJaWYgKHd3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2dik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXN1bHQgPSBQeU51bWJlcl9Mc2hpZnQodnYsIHd3KTsKLQkJUHlfREVDUkVGKHZ2KTsKLQkJUHlfREVDUkVGKHd3KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JYyA9IGEgPDwgYjsKLQlpZiAoYSAhPSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKGxvbmcsIGMsIGIpKSB7Ci0JCXZ2ID0gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodikpOwotCQlpZiAodnYgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQl3dyA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHcpKTsKLQkJaWYgKHd3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2dik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXN1bHQgPSBQeU51bWJlcl9Mc2hpZnQodnYsIHd3KTsKLQkJUHlfREVDUkVGKHZ2KTsKLQkJUHlfREVDUkVGKHd3KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGMpOworICAgIENPTlZFUlRfVE9fTE9ORyh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0xPTkcodywgYik7CisgICAgaWYgKGIgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgc2hpZnQgY291bnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChhID09IDAgfHwgYiA9PSAwKQorICAgICAgICByZXR1cm4gaW50X2ludCh2KTsKKyAgICBpZiAoYiA+PSBMT05HX0JJVCkgeworICAgICAgICB2diA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHYpKTsKKyAgICAgICAgaWYgKHZ2ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgd3cgPSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh3KSk7CisgICAgICAgIGlmICh3dyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodnYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlOdW1iZXJfTHNoaWZ0KHZ2LCB3dyk7CisgICAgICAgIFB5X0RFQ1JFRih2dik7CisgICAgICAgIFB5X0RFQ1JFRih3dyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGMgPSBhIDw8IGI7CisgICAgaWYgKGEgIT0gUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVChsb25nLCBjLCBiKSkgeworICAgICAgICB2diA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHYpKTsKKyAgICAgICAgaWYgKHZ2ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgd3cgPSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh3KSk7CisgICAgICAgIGlmICh3dyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodnYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlOdW1iZXJfTHNoaWZ0KHZ2LCB3dyk7CisgICAgICAgIFB5X0RFQ1JFRih2dik7CisgICAgICAgIFB5X0RFQ1JFRih3dyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhjKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9yc2hpZnQoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIGxvbmcgYSwgYjsKLQlDT05WRVJUX1RPX0xPTkcodiwgYSk7Ci0JQ09OVkVSVF9UT19MT05HKHcsIGIpOwotCWlmIChiIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIHNoaWZ0IGNvdW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoYSA9PSAwIHx8IGIgPT0gMCkKLQkJcmV0dXJuIGludF9pbnQodik7Ci0JaWYgKGIgPj0gTE9OR19CSVQpIHsKLQkJaWYgKGEgPCAwKQotCQkJYSA9IC0xOwotCQllbHNlCi0JCQlhID0gMDsKLQl9Ci0JZWxzZSB7Ci0JCWEgPSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKGxvbmcsIGEsIGIpOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoYSk7CisgICAgcmVnaXN0ZXIgbG9uZyBhLCBiOworICAgIENPTlZFUlRfVE9fTE9ORyh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0xPTkcodywgYik7CisgICAgaWYgKGIgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgc2hpZnQgY291bnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChhID09IDAgfHwgYiA9PSAwKQorICAgICAgICByZXR1cm4gaW50X2ludCh2KTsKKyAgICBpZiAoYiA+PSBMT05HX0JJVCkgeworICAgICAgICBpZiAoYSA8IDApCisgICAgICAgICAgICBhID0gLTE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGEgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYSA9IFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQobG9uZywgYSwgYik7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhhKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9hbmQoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIGxvbmcgYSwgYjsKLQlDT05WRVJUX1RPX0xPTkcodiwgYSk7Ci0JQ09OVkVSVF9UT19MT05HKHcsIGIpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhhICYgYik7CisgICAgcmVnaXN0ZXIgbG9uZyBhLCBiOworICAgIENPTlZFUlRfVE9fTE9ORyh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0xPTkcodywgYik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGEgJiBiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF94b3IoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIGxvbmcgYSwgYjsKLQlDT05WRVJUX1RPX0xPTkcodiwgYSk7Ci0JQ09OVkVSVF9UT19MT05HKHcsIGIpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhhIF4gYik7CisgICAgcmVnaXN0ZXIgbG9uZyBhLCBiOworICAgIENPTlZFUlRfVE9fTE9ORyh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0xPTkcodywgYik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGEgXiBiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9vcihQeUludE9iamVjdCAqdiwgUHlJbnRPYmplY3QgKncpCiB7Ci0JcmVnaXN0ZXIgbG9uZyBhLCBiOwotCUNPTlZFUlRfVE9fTE9ORyh2LCBhKTsKLQlDT05WRVJUX1RPX0xPTkcodywgYik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGEgfCBiKTsKKyAgICByZWdpc3RlciBsb25nIGEsIGI7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGEpOworICAgIENPTlZFUlRfVE9fTE9ORyh3LCBiKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoYSB8IGIpOwogfQogCiBzdGF0aWMgaW50CiBpbnRfY29lcmNlKFB5T2JqZWN0ICoqcHYsIFB5T2JqZWN0ICoqcHcpCiB7Ci0JaWYgKFB5SW50X0NoZWNrKCpwdykpIHsKLQkJUHlfSU5DUkVGKCpwdik7Ci0JCVB5X0lOQ1JFRigqcHcpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7IC8qIENhbid0IGRvIGl0ICovCisgICAgaWYgKFB5SW50X0NoZWNrKCpwdykpIHsKKyAgICAgICAgUHlfSU5DUkVGKCpwdik7CisgICAgICAgIFB5X0lOQ1JFRigqcHcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7IC8qIENhbid0IGRvIGl0ICovCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfaW50KFB5SW50T2JqZWN0ICp2KQogewotCWlmIChQeUludF9DaGVja0V4YWN0KHYpKQotCQlQeV9JTkNSRUYodik7Ci0JZWxzZQotCQl2ID0gKFB5SW50T2JqZWN0ICopUHlJbnRfRnJvbUxvbmcodi0+b2JfaXZhbCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXY7CisgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QodikpCisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICBlbHNlCisgICAgICAgIHYgPSAoUHlJbnRPYmplY3QgKilQeUludF9Gcm9tTG9uZyh2LT5vYl9pdmFsKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9sb25nKFB5SW50T2JqZWN0ICp2KQogewotCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoKHYgLT4gb2JfaXZhbCkpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoKHYgLT4gb2JfaXZhbCkpOwogfQogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBCaXRMZW5ndGhUYWJsZVszMl0gPSB7Ci0JMCwgMSwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKLQk1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1CisgICAgMCwgMSwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1CiB9OwogCiBzdGF0aWMgaW50CiBiaXRzX2luX3Vsb25nKHVuc2lnbmVkIGxvbmcgZCkKIHsKLQlpbnQgZF9iaXRzID0gMDsKLQl3aGlsZSAoZCA+PSAzMikgewotCQlkX2JpdHMgKz0gNjsKLQkJZCA+Pj0gNjsKLQl9Ci0JZF9iaXRzICs9IChpbnQpQml0TGVuZ3RoVGFibGVbZF07Ci0JcmV0dXJuIGRfYml0czsKKyAgICBpbnQgZF9iaXRzID0gMDsKKyAgICB3aGlsZSAoZCA+PSAzMikgeworICAgICAgICBkX2JpdHMgKz0gNjsKKyAgICAgICAgZCA+Pj0gNjsKKyAgICB9CisgICAgZF9iaXRzICs9IChpbnQpQml0TGVuZ3RoVGFibGVbZF07CisgICAgcmV0dXJuIGRfYml0czsKIH0KIAogI2lmIDgqU0laRU9GX0xPTkctMSA8PSBEQkxfTUFOVF9ESUcKQEAgLTk3Nyw3ICs5NzcsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9mbG9hdChQeUludE9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpKHYgLT4gb2JfaXZhbCkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSkodiAtPiBvYl9pdmFsKSk7CiB9CiAKICNlbHNlCkBAIC05ODgsNDAgKzk4OCw0MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9mbG9hdChQeUludE9iamVjdCAqdikKIHsKLQl1bnNpZ25lZCBsb25nIGFic19pdmFsLCBsc2I7Ci0JaW50IHJvdW5kX3VwOworICAgIHVuc2lnbmVkIGxvbmcgYWJzX2l2YWwsIGxzYjsKKyAgICBpbnQgcm91bmRfdXA7CiAKLQlpZiAodi0+b2JfaXZhbCA8IDApCi0JCWFic19pdmFsID0gMFUtKHVuc2lnbmVkIGxvbmcpdi0+b2JfaXZhbDsKLQllbHNlCi0JCWFic19pdmFsID0gKHVuc2lnbmVkIGxvbmcpdi0+b2JfaXZhbDsKLQlpZiAoYWJzX2l2YWwgPCAoMUwgPDwgREJMX01BTlRfRElHKSkKLQkJLyogc21hbGwgaW50ZWdlcjsgIG5vIG5lZWQgdG8gcm91bmQgKi8KLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKXYtPm9iX2l2YWwpOworICAgIGlmICh2LT5vYl9pdmFsIDwgMCkKKyAgICAgICAgYWJzX2l2YWwgPSAwVS0odW5zaWduZWQgbG9uZyl2LT5vYl9pdmFsOworICAgIGVsc2UKKyAgICAgICAgYWJzX2l2YWwgPSAodW5zaWduZWQgbG9uZyl2LT5vYl9pdmFsOworICAgIGlmIChhYnNfaXZhbCA8ICgxTCA8PCBEQkxfTUFOVF9ESUcpKQorICAgICAgICAvKiBzbWFsbCBpbnRlZ2VyOyAgbm8gbmVlZCB0byByb3VuZCAqLworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpdi0+b2JfaXZhbCk7CiAKLQkvKiBSb3VuZCBhYnNfaXZhbCB0byBNQU5UX0RJRyBzaWduaWZpY2FudCBiaXRzLCB1c2luZyB0aGUKLQkgICByb3VuZC1oYWxmLXRvLWV2ZW4gcnVsZS4gIGFic19pdmFsICYgbHNiIHBpY2tzIG91dCB0aGUgJ3JvdW5kaW5nJwotCSAgIGJpdDogdGhlIGZpcnN0IGJpdCBhZnRlciB0aGUgbW9zdCBzaWduaWZpY2FudCBNQU5UX0RJRyBiaXRzIG9mCi0JICAgYWJzX2l2YWwuICBXZSByb3VuZCB1cCBpZiB0aGlzIGJpdCBpcyBzZXQsIHByb3ZpZGVkIHRoYXQgZWl0aGVyOgorICAgIC8qIFJvdW5kIGFic19pdmFsIHRvIE1BTlRfRElHIHNpZ25pZmljYW50IGJpdHMsIHVzaW5nIHRoZQorICAgICAgIHJvdW5kLWhhbGYtdG8tZXZlbiBydWxlLiAgYWJzX2l2YWwgJiBsc2IgcGlja3Mgb3V0IHRoZSAncm91bmRpbmcnCisgICAgICAgYml0OiB0aGUgZmlyc3QgYml0IGFmdGVyIHRoZSBtb3N0IHNpZ25pZmljYW50IE1BTlRfRElHIGJpdHMgb2YKKyAgICAgICBhYnNfaXZhbC4gIFdlIHJvdW5kIHVwIGlmIHRoaXMgYml0IGlzIHNldCwgcHJvdmlkZWQgdGhhdCBlaXRoZXI6CiAKLQkgICAgICgxKSBhYnNfaXZhbCBpc24ndCBleGFjdGx5IGhhbGZ3YXkgYmV0d2VlbiB0d28gZmxvYXRzLCBpbiB3aGljaAotCSAgICAgY2FzZSBhdCBsZWFzdCBvbmUgb2YgdGhlIGJpdHMgZm9sbG93aW5nIHRoZSByb3VuZGluZyBiaXQgbXVzdCBiZQotCSAgICAgc2V0OyBpLmUuLCBhYnNfaXZhbCAmIGxzYi0xICE9IDAsIG9yOgorICAgICAgICAgKDEpIGFic19pdmFsIGlzbid0IGV4YWN0bHkgaGFsZndheSBiZXR3ZWVuIHR3byBmbG9hdHMsIGluIHdoaWNoCisgICAgICAgICBjYXNlIGF0IGxlYXN0IG9uZSBvZiB0aGUgYml0cyBmb2xsb3dpbmcgdGhlIHJvdW5kaW5nIGJpdCBtdXN0IGJlCisgICAgICAgICBzZXQ7IGkuZS4sIGFic19pdmFsICYgbHNiLTEgIT0gMCwgb3I6CiAKLQkgICAgICgyKSB0aGUgcmVzdWx0aW5nIHJvdW5kZWQgdmFsdWUgaGFzIGxlYXN0IHNpZ25pZmljYW50IGJpdCAwOyBvcgotCSAgICAgaW4gb3RoZXIgd29yZHMgdGhlIGJpdCBhYm92ZSB0aGUgcm91bmRpbmcgYml0IGlzIHNldCAodGhpcyBpcyB0aGUKLQkgICAgICd0by1ldmVuJyBiaXQgb2Ygcm91bmQtaGFsZi10by1ldmVuKTsgaS5lLiwgYWJzX2l2YWwgJiAyKmxzYiAhPSAwCisgICAgICAgICAoMikgdGhlIHJlc3VsdGluZyByb3VuZGVkIHZhbHVlIGhhcyBsZWFzdCBzaWduaWZpY2FudCBiaXQgMDsgb3IKKyAgICAgICAgIGluIG90aGVyIHdvcmRzIHRoZSBiaXQgYWJvdmUgdGhlIHJvdW5kaW5nIGJpdCBpcyBzZXQgKHRoaXMgaXMgdGhlCisgICAgICAgICAndG8tZXZlbicgYml0IG9mIHJvdW5kLWhhbGYtdG8tZXZlbik7IGkuZS4sIGFic19pdmFsICYgMipsc2IgIT0gMAogCi0JICAgVGhlIGNvbmRpdGlvbiAiKDEpIG9yICgyKSIgZXF1YXRlcyB0byBhYnNfaXZhbCAmIDMqbHNiLTEgIT0gMC4gKi8KKyAgICAgICBUaGUgY29uZGl0aW9uICIoMSkgb3IgKDIpIiBlcXVhdGVzIHRvIGFic19pdmFsICYgMypsc2ItMSAhPSAwLiAqLwogCi0JbHNiID0gMUwgPDwgKGJpdHNfaW5fdWxvbmcoYWJzX2l2YWwpLURCTF9NQU5UX0RJRy0xKTsKLQlyb3VuZF91cCA9IChhYnNfaXZhbCAmIGxzYikgJiYgKGFic19pdmFsICYgKDMqbHNiLTEpKTsKLQlhYnNfaXZhbCAmPSAtMipsc2I7Ci0JaWYgKHJvdW5kX3VwKQotCQlhYnNfaXZhbCArPSAyKmxzYjsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHYtPm9iX2l2YWwgPCAwID8KLQkJCQkgIC0oZG91YmxlKWFic19pdmFsIDoKLQkJCQkgIChkb3VibGUpYWJzX2l2YWwpOworICAgIGxzYiA9IDFMIDw8IChiaXRzX2luX3Vsb25nKGFic19pdmFsKS1EQkxfTUFOVF9ESUctMSk7CisgICAgcm91bmRfdXAgPSAoYWJzX2l2YWwgJiBsc2IpICYmIChhYnNfaXZhbCAmICgzKmxzYi0xKSk7CisgICAgYWJzX2l2YWwgJj0gLTIqbHNiOworICAgIGlmIChyb3VuZF91cCkKKyAgICAgICAgYWJzX2l2YWwgKz0gMipsc2I7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2LT5vYl9pdmFsIDwgMCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKGRvdWJsZSlhYnNfaXZhbCA6CisgICAgICAgICAgICAgICAgICAoZG91YmxlKWFic19pdmFsKTsKIH0KIAogI2VuZGlmCkBAIC0xMDI5LDEzICsxMDI5LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW50X29jdChQeUludE9iamVjdCAqdikKIHsKLQlyZXR1cm4gX1B5SW50X0Zvcm1hdCh2LCA4LCAwKTsKKyAgICByZXR1cm4gX1B5SW50X0Zvcm1hdCh2LCA4LCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9oZXgoUHlJbnRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIF9QeUludF9Gb3JtYXQodiwgMTYsIDApOworICAgIHJldHVybiBfUHlJbnRfRm9ybWF0KHYsIDE2LCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEwNDQsNDcgKzEwNDQsNDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp4ID0gTlVMTDsKLQlpbnQgYmFzZSA9IC05MDk7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJ4IiwgImJhc2UiLCAwfTsKKyAgICBQeU9iamVjdCAqeCA9IE5VTEw7CisgICAgaW50IGJhc2UgPSAtOTA5OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsieCIsICJiYXNlIiwgMH07CiAKLQlpZiAodHlwZSAhPSAmUHlJbnRfVHlwZSkKLQkJcmV0dXJuIGludF9zdWJ0eXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsgLyogV2ltcCBvdXQgKi8KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9pOmludCIsIGt3bGlzdCwKLQkJCQkJICZ4LCAmYmFzZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICh4ID09IE5VTEwpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZygwTCk7Ci0JaWYgKGJhc2UgPT0gLTkwOSkKLQkJcmV0dXJuIFB5TnVtYmVyX0ludCh4KTsKLQlpZiAoUHlTdHJpbmdfQ2hlY2soeCkpIHsKLQkJLyogU2luY2UgUHlJbnRfRnJvbVN0cmluZyBkb2Vzbid0IGhhdmUgYSBsZW5ndGggcGFyYW1ldGVyLAotCQkgKiBjaGVjayBoZXJlIGZvciBwb3NzaWJsZSBOVUxzIGluIHRoZSBzdHJpbmcuICovCi0JCWNoYXIgKnN0cmluZyA9IFB5U3RyaW5nX0FTX1NUUklORyh4KTsKLQkJaWYgKHN0cmxlbihzdHJpbmcpICE9IFB5U3RyaW5nX1NpemUoeCkpIHsKLQkJCS8qIGNyZWF0ZSBhIHJlcHIoKSBvZiB0aGUgaW5wdXQgc3RyaW5nLAotCQkJICoganVzdCBsaWtlIFB5SW50X0Zyb21TdHJpbmcgZG9lcyAqLwotCQkJUHlPYmplY3QgKnNyZXByOwotCQkJc3JlcHIgPSBQeU9iamVjdF9SZXByKHgpOwotCQkJaWYgKHNyZXByID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlICVkOiAlcyIsCi0JCQkgICAgIGJhc2UsIFB5U3RyaW5nX0FTX1NUUklORyhzcmVwcikpOwotCQkJUHlfREVDUkVGKHNyZXByKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBQeUludF9Gcm9tU3RyaW5nKHN0cmluZywgTlVMTCwgYmFzZSk7Ci0JfQorICAgIGlmICh0eXBlICE9ICZQeUludF9UeXBlKQorICAgICAgICByZXR1cm4gaW50X3N1YnR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOyAvKiBXaW1wIG91dCAqLworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T2k6aW50Iiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LCAmYmFzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygwTCk7CisgICAgaWYgKGJhc2UgPT0gLTkwOSkKKyAgICAgICAgcmV0dXJuIFB5TnVtYmVyX0ludCh4KTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soeCkpIHsKKyAgICAgICAgLyogU2luY2UgUHlJbnRfRnJvbVN0cmluZyBkb2Vzbid0IGhhdmUgYSBsZW5ndGggcGFyYW1ldGVyLAorICAgICAgICAgKiBjaGVjayBoZXJlIGZvciBwb3NzaWJsZSBOVUxzIGluIHRoZSBzdHJpbmcuICovCisgICAgICAgIGNoYXIgKnN0cmluZyA9IFB5U3RyaW5nX0FTX1NUUklORyh4KTsKKyAgICAgICAgaWYgKHN0cmxlbihzdHJpbmcpICE9IFB5U3RyaW5nX1NpemUoeCkpIHsKKyAgICAgICAgICAgIC8qIGNyZWF0ZSBhIHJlcHIoKSBvZiB0aGUgaW5wdXQgc3RyaW5nLAorICAgICAgICAgICAgICoganVzdCBsaWtlIFB5SW50X0Zyb21TdHJpbmcgZG9lcyAqLworICAgICAgICAgICAgUHlPYmplY3QgKnNyZXByOworICAgICAgICAgICAgc3JlcHIgPSBQeU9iamVjdF9SZXByKHgpOworICAgICAgICAgICAgaWYgKHNyZXByID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlICVkOiAlcyIsCisgICAgICAgICAgICAgICAgIGJhc2UsIFB5U3RyaW5nX0FTX1NUUklORyhzcmVwcikpOworICAgICAgICAgICAgUHlfREVDUkVGKHNyZXByKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3RyaW5nKHN0cmluZywgTlVMTCwgYmFzZSk7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKHgpKQotCQlyZXR1cm4gUHlJbnRfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUoeCksCi0JCQkJCSBQeVVuaWNvZGVfR0VUX1NJWkUoeCksCi0JCQkJCSBiYXNlKTsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHgpKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUoeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlKTsKICNlbmRpZgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiaW50KCkgY2FuJ3QgY29udmVydCBub24tc3RyaW5nIHdpdGggZXhwbGljaXQgYmFzZSIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJpbnQoKSBjYW4ndCBjb252ZXJ0IG5vbi1zdHJpbmcgd2l0aCBleHBsaWNpdCBiYXNlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFdpbXB5LCBzbG93IGFwcHJvYWNoIHRvIHRwX25ldyBjYWxscyBmb3Igc3VidHlwZXMgb2YgaW50OgpAQCAtMTA5NSw0NyArMTA5NSw0NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9zdWJ0eXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqdG1wLCAqbmV3b2JqOwotCWxvbmcgaXZhbDsKKyAgICBQeU9iamVjdCAqdG1wLCAqbmV3b2JqOworICAgIGxvbmcgaXZhbDsKIAotCWFzc2VydChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeUludF9UeXBlKSk7Ci0JdG1wID0gaW50X25ldygmUHlJbnRfVHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKHRtcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SW50X0NoZWNrKHRtcCkpIHsKLQkJaXZhbCA9IFB5TG9uZ19Bc0xvbmcodG1wKTsKLQkJaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlfREVDUkVGKHRtcCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0gZWxzZSB7Ci0JCWl2YWwgPSAoKFB5SW50T2JqZWN0ICopdG1wKS0+b2JfaXZhbDsKLQl9CisgICAgYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5SW50X1R5cGUpKTsKKyAgICB0bXAgPSBpbnRfbmV3KCZQeUludF9UeXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlJbnRfQ2hlY2sodG1wKSkgeworICAgICAgICBpdmFsID0gUHlMb25nX0FzTG9uZyh0bXApOworICAgICAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaXZhbCA9ICgoUHlJbnRPYmplY3QgKil0bXApLT5vYl9pdmFsOworICAgIH0KIAotCW5ld29iaiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChuZXdvYmogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodG1wKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSgoUHlJbnRPYmplY3QgKiluZXdvYmopLT5vYl9pdmFsID0gaXZhbDsKLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gbmV3b2JqOworICAgIG5ld29iaiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChuZXdvYmogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICgoUHlJbnRPYmplY3QgKiluZXdvYmopLT5vYl9pdmFsID0gaXZhbDsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gbmV3b2JqOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2dldG5ld2FyZ3MoUHlJbnRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsKSIsIHYtPm9iX2l2YWwpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobCkiLCB2LT5vYl9pdmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9nZXQwKFB5SW50T2JqZWN0ICp2LCB2b2lkICpjb250ZXh0KSB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKDBMKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2dldDEoUHlJbnRPYmplY3QgKnYsIHZvaWQgKmNvbnRleHQpIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoMUwpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygxTCk7CiB9CiAKIC8qIENvbnZlcnQgYW4gaW50ZWdlciB0byBhIGRlY2ltYWwgc3RyaW5nLiAgT24gbWFueSBwbGF0Zm9ybXMsIHRoaXMKQEAgLTExNDQsMTggKzExNDQsMTggQEAKICAgIG9wcG9ydHVuaXRpZXMgb2ZmZXJlZCBieSBkaXZpc2lvbiBieSBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfdG9fZGVjaW1hbF9zdHJpbmcoUHlJbnRPYmplY3QgKnYpIHsKLQljaGFyIGJ1ZltzaXplb2YobG9uZykqQ0hBUl9CSVQvMys2XSwgKnAsICpidWZlbmQ7Ci0JbG9uZyBuID0gdi0+b2JfaXZhbDsKLQl1bnNpZ25lZCBsb25nIGFic247Ci0JcCA9IGJ1ZmVuZCA9IGJ1ZiArIHNpemVvZihidWYpOwotCWFic24gPSBuIDwgMCA/IDBVTCAtIG4gOiBuOwotCWRvIHsKLQkJKi0tcCA9ICcwJyArIChjaGFyKShhYnNuICUgMTApOwotCQlhYnNuIC89IDEwOwotCX0gd2hpbGUgKGFic24pOwotCWlmIChuIDwgMCkKLQkJKi0tcCA9ICctJzsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocCwgYnVmZW5kIC0gcCk7CisgICAgY2hhciBidWZbc2l6ZW9mKGxvbmcpKkNIQVJfQklULzMrNl0sICpwLCAqYnVmZW5kOworICAgIGxvbmcgbiA9IHYtPm9iX2l2YWw7CisgICAgdW5zaWduZWQgbG9uZyBhYnNuOworICAgIHAgPSBidWZlbmQgPSBidWYgKyBzaXplb2YoYnVmKTsKKyAgICBhYnNuID0gbiA8IDAgPyAwVUwgLSBuIDogbjsKKyAgICBkbyB7CisgICAgICAgICotLXAgPSAnMCcgKyAoY2hhcikoYWJzbiAlIDEwKTsKKyAgICAgICAgYWJzbiAvPSAxMDsKKyAgICB9IHdoaWxlIChhYnNuKTsKKyAgICBpZiAobiA8IDApCisgICAgICAgICotLXAgPSAnLSc7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHAsIGJ1ZmVuZCAtIHApOwogfQogCiAvKiBDb252ZXJ0IGFuIGludGVnZXIgdG8gdGhlIGdpdmVuIGJhc2UuICBSZXR1cm5zIGEgc3RyaW5nLgpAQCAtMTE2NSwxMTMgKzExNjUsMTEzIEBACiBQeUFQSV9GVU5DKFB5T2JqZWN0KikKIF9QeUludF9Gb3JtYXQoUHlJbnRPYmplY3QgKnYsIGludCBiYXNlLCBpbnQgbmV3c3R5bGUpCiB7Ci0JLyogVGhlcmUgYXJlIG5vIGRvdWJ0IG1hbnksIG1hbnkgd2F5cyB0byBvcHRpbWl6ZSB0aGlzLCB1c2luZyBjb2RlCi0JICAgc2ltaWxhciB0byBfUHlMb25nX0Zvcm1hdCAqLwotCWxvbmcgbiA9IHYtPm9iX2l2YWw7Ci0JaW50ICBuZWdhdGl2ZSA9IG4gPCAwOwotCWludCBpc196ZXJvID0gbiA9PSAwOworICAgIC8qIFRoZXJlIGFyZSBubyBkb3VidCBtYW55LCBtYW55IHdheXMgdG8gb3B0aW1pemUgdGhpcywgdXNpbmcgY29kZQorICAgICAgIHNpbWlsYXIgdG8gX1B5TG9uZ19Gb3JtYXQgKi8KKyAgICBsb25nIG4gPSB2LT5vYl9pdmFsOworICAgIGludCAgbmVnYXRpdmUgPSBuIDwgMDsKKyAgICBpbnQgaXNfemVybyA9IG4gPT0gMDsKIAotCS8qIEZvciB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIHNpemUsIHNlZQotCSAgIGh0dHA6Ly9jLWZhcS5jb20vbWlzYy9oZXhpby5odG1sLiBUaGVuLCBhZGQgYSBmZXcgYnl0ZXMgZm9yCi0JICAgdGhlIHBvc3NpYmxlIHNpZ24gYW5kIHByZWZpeCAiMFtib3hdIiAqLwotCWNoYXIgYnVmW3NpemVvZihuKSpDSEFSX0JJVCs2XTsKKyAgICAvKiBGb3IgdGhlIHJlYXNvbmluZyBiZWhpbmQgdGhpcyBzaXplLCBzZWUKKyAgICAgICBodHRwOi8vYy1mYXEuY29tL21pc2MvaGV4aW8uaHRtbC4gVGhlbiwgYWRkIGEgZmV3IGJ5dGVzIGZvcgorICAgICAgIHRoZSBwb3NzaWJsZSBzaWduIGFuZCBwcmVmaXggIjBbYm94XSIgKi8KKyAgICBjaGFyIGJ1ZltzaXplb2YobikqQ0hBUl9CSVQrNl07CiAKLQkvKiBTdGFydCBieSBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICBXZSBmaWxsIGluIGZyb20KLQkgICB0aGUgYmFjayBmb3J3YXJkLiAqLwotCWNoYXIqIHAgPSAmYnVmW3NpemVvZihidWYpXTsKKyAgICAvKiBTdGFydCBieSBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICBXZSBmaWxsIGluIGZyb20KKyAgICAgICB0aGUgYmFjayBmb3J3YXJkLiAqLworICAgIGNoYXIqIHAgPSAmYnVmW3NpemVvZihidWYpXTsKIAotCWFzc2VydChiYXNlID49IDIgJiYgYmFzZSA8PSAzNik7CisgICAgYXNzZXJ0KGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KTsKIAotCS8qIFNwZWNpYWwgY2FzZSBiYXNlIDEwLCBmb3Igc3BlZWQgKi8KLQlpZiAoYmFzZSA9PSAxMCkKLQkJcmV0dXJuIGludF90b19kZWNpbWFsX3N0cmluZyh2KTsKKyAgICAvKiBTcGVjaWFsIGNhc2UgYmFzZSAxMCwgZm9yIHNwZWVkICovCisgICAgaWYgKGJhc2UgPT0gMTApCisgICAgICAgIHJldHVybiBpbnRfdG9fZGVjaW1hbF9zdHJpbmcodik7CiAKLQlkbyB7Ci0JCS8qIEknZCB1c2UgaV9kaXZtb2QsIGV4Y2VwdCBpdCBkb2Vzbid0IHByb2R1Y2UgdGhlIHJlc3VsdHMKLQkJICAgSSB3YW50IHdoZW4gbiBpcyBuZWdhdGl2ZS4gIFNvIGp1c3QgZHVwbGljYXRlIHRoZSBzYWxpZW50Ci0JCSAgIHBhcnQgaGVyZS4gKi8KLQkJbG9uZyBkaXYgPSBuIC8gYmFzZTsKLQkJbG9uZyBtb2QgPSBuIC0gZGl2ICogYmFzZTsKKyAgICBkbyB7CisgICAgICAgIC8qIEknZCB1c2UgaV9kaXZtb2QsIGV4Y2VwdCBpdCBkb2Vzbid0IHByb2R1Y2UgdGhlIHJlc3VsdHMKKyAgICAgICAgICAgSSB3YW50IHdoZW4gbiBpcyBuZWdhdGl2ZS4gIFNvIGp1c3QgZHVwbGljYXRlIHRoZSBzYWxpZW50CisgICAgICAgICAgIHBhcnQgaGVyZS4gKi8KKyAgICAgICAgbG9uZyBkaXYgPSBuIC8gYmFzZTsKKyAgICAgICAgbG9uZyBtb2QgPSBuIC0gZGl2ICogYmFzZTsKIAotCQkvKiBjb252ZXJ0IGFicyhtb2QpIHRvIHRoZSByaWdodCBjaGFyYWN0ZXIgaW4gWzAtOSwgYS16XSAqLwotCQljaGFyIGNkaWdpdCA9IChjaGFyKShtb2QgPCAwID8gLW1vZCA6IG1vZCk7Ci0JCWNkaWdpdCArPSAoY2RpZ2l0IDwgMTApID8gJzAnIDogJ2EnLTEwOwotCQkqLS1wID0gY2RpZ2l0OworICAgICAgICAvKiBjb252ZXJ0IGFicyhtb2QpIHRvIHRoZSByaWdodCBjaGFyYWN0ZXIgaW4gWzAtOSwgYS16XSAqLworICAgICAgICBjaGFyIGNkaWdpdCA9IChjaGFyKShtb2QgPCAwID8gLW1vZCA6IG1vZCk7CisgICAgICAgIGNkaWdpdCArPSAoY2RpZ2l0IDwgMTApID8gJzAnIDogJ2EnLTEwOworICAgICAgICAqLS1wID0gY2RpZ2l0OwogCi0JCW4gPSBkaXY7Ci0JfSB3aGlsZShuKTsKKyAgICAgICAgbiA9IGRpdjsKKyAgICB9IHdoaWxlKG4pOwogCi0JaWYgKGJhc2UgPT0gMikgewotCQkqLS1wID0gJ2InOwotCQkqLS1wID0gJzAnOwotCX0KLQllbHNlIGlmIChiYXNlID09IDgpIHsKLQkJaWYgKG5ld3N0eWxlKSB7Ci0JCQkqLS1wID0gJ28nOwotCQkJKi0tcCA9ICcwJzsKLQkJfQotCQllbHNlCi0JCQlpZiAoIWlzX3plcm8pCi0JCQkJKi0tcCA9ICcwJzsKLQl9Ci0JZWxzZSBpZiAoYmFzZSA9PSAxNikgewotCQkqLS1wID0gJ3gnOwotCQkqLS1wID0gJzAnOwotCX0KLQllbHNlIHsKLQkJKi0tcCA9ICcjJzsKLQkJKi0tcCA9ICcwJyArIGJhc2UlMTA7Ci0JCWlmIChiYXNlID4gMTApCi0JCQkqLS1wID0gJzAnICsgYmFzZS8xMDsKLQl9Ci0JaWYgKG5lZ2F0aXZlKQotCQkqLS1wID0gJy0nOworICAgIGlmIChiYXNlID09IDIpIHsKKyAgICAgICAgKi0tcCA9ICdiJzsKKyAgICAgICAgKi0tcCA9ICcwJzsKKyAgICB9CisgICAgZWxzZSBpZiAoYmFzZSA9PSA4KSB7CisgICAgICAgIGlmIChuZXdzdHlsZSkgeworICAgICAgICAgICAgKi0tcCA9ICdvJzsKKyAgICAgICAgICAgICotLXAgPSAnMCc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKCFpc196ZXJvKQorICAgICAgICAgICAgICAgICotLXAgPSAnMCc7CisgICAgfQorICAgIGVsc2UgaWYgKGJhc2UgPT0gMTYpIHsKKyAgICAgICAgKi0tcCA9ICd4JzsKKyAgICAgICAgKi0tcCA9ICcwJzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICotLXAgPSAnIyc7CisgICAgICAgICotLXAgPSAnMCcgKyBiYXNlJTEwOworICAgICAgICBpZiAoYmFzZSA+IDEwKQorICAgICAgICAgICAgKi0tcCA9ICcwJyArIGJhc2UvMTA7CisgICAgfQorICAgIGlmIChuZWdhdGl2ZSkKKyAgICAgICAgKi0tcCA9ICctJzsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCAmYnVmW3NpemVvZihidWYpXSAtIHApOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCAmYnVmW3NpemVvZihidWYpXSAtIHApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X19mb3JtYXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZvcm1hdF9zcGVjOworICAgIFB5T2JqZWN0ICpmb3JtYXRfc3BlYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdF9zcGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5Qnl0ZXNfQ2hlY2soZm9ybWF0X3NwZWMpKQotCQlyZXR1cm4gX1B5SW50X0Zvcm1hdEFkdmFuY2VkKHNlbGYsCi0JCQkJCSAgICAgUHlCeXRlc19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAotCQkJCQkgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoZm9ybWF0X3NwZWMpKTsKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkgewotCQkvKiBDb252ZXJ0IGZvcm1hdF9zcGVjIHRvIGEgc3RyICovCi0JCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCVB5T2JqZWN0ICpzdHJfc3BlYyA9IFB5T2JqZWN0X1N0cihmb3JtYXRfc3BlYyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlCeXRlc19DaGVjayhmb3JtYXRfc3BlYykpCisgICAgICAgIHJldHVybiBfUHlJbnRfRm9ybWF0QWR2YW5jZWQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhmb3JtYXRfc3BlYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShmb3JtYXRfc3BlYykpOworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSB7CisgICAgICAgIC8qIENvbnZlcnQgZm9ybWF0X3NwZWMgdG8gYSBzdHIgKi8KKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QgKnN0cl9zcGVjID0gUHlPYmplY3RfU3RyKGZvcm1hdF9zcGVjKTsKIAotCQlpZiAoc3RyX3NwZWMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBpZiAoc3RyX3NwZWMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXJlc3VsdCA9IF9QeUludF9Gb3JtYXRBZHZhbmNlZChzZWxmLAotCQkJCQkgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc3RyX3NwZWMpLAotCQkJCQkgICAgICAgUHlCeXRlc19HRVRfU0laRShzdHJfc3BlYykpOworICAgICAgICByZXN1bHQgPSBfUHlJbnRfRm9ybWF0QWR2YW5jZWQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHN0cl9zcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoc3RyX3NwZWMpKTsKIAotCQlQeV9ERUNSRUYoc3RyX3NwZWMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19mb3JtYXRfXyByZXF1aXJlcyBzdHIgb3IgdW5pY29kZSIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYoc3RyX3NwZWMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19mb3JtYXRfXyByZXF1aXJlcyBzdHIgb3IgdW5pY29kZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2JpdF9sZW5ndGgoUHlJbnRPYmplY3QgKnYpCiB7Ci0JdW5zaWduZWQgbG9uZyBuOworICAgIHVuc2lnbmVkIGxvbmcgbjsKIAotCWlmICh2LT5vYl9pdmFsIDwgMCkKLQkJLyogYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuIHYtPm9iX2l2YWwgPT0gLUxPTkdfTUFYLTEgKi8KLQkJbiA9IDBVLSh1bnNpZ25lZCBsb25nKXYtPm9iX2l2YWw7Ci0JZWxzZQotCQluID0gKHVuc2lnbmVkIGxvbmcpdi0+b2JfaXZhbDsKKyAgICBpZiAodi0+b2JfaXZhbCA8IDApCisgICAgICAgIC8qIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2hlbiB2LT5vYl9pdmFsID09IC1MT05HX01BWC0xICovCisgICAgICAgIG4gPSAwVS0odW5zaWduZWQgbG9uZyl2LT5vYl9pdmFsOworICAgIGVsc2UKKyAgICAgICAgbiA9ICh1bnNpZ25lZCBsb25nKXYtPm9iX2l2YWw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoYml0c19pbl91bG9uZyhuKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGJpdHNfaW5fdWxvbmcobikpOwogfQogCiBQeURvY19TVFJWQVIoaW50X2JpdF9sZW5ndGhfZG9jLApAQCAtMTI4Nyw0NCArMTI4Nyw0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9pc19maW5pdGUoUHlPYmplY3QgKnYpCiB7Ci0JUHlfUkVUVVJOX1RSVUU7CisgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5TWV0aG9kRGVmIGludF9tZXRob2RzW10gPSB7Ci0JeyJjb25qdWdhdGUiLAkoUHlDRnVuY3Rpb24paW50X2ludCwJTUVUSF9OT0FSR1MsCi0JICJSZXR1cm5zIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgaW50LiJ9LAotCXsiYml0X2xlbmd0aCIsIChQeUNGdW5jdGlvbilpbnRfYml0X2xlbmd0aCwgTUVUSF9OT0FSR1MsCi0JIGludF9iaXRfbGVuZ3RoX2RvY30sCisgICAgeyJjb25qdWdhdGUiLCAgICAgICAoUHlDRnVuY3Rpb24paW50X2ludCwgICBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgc2VsZiwgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFueSBpbnQuIn0sCisgICAgeyJiaXRfbGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKWludF9iaXRfbGVuZ3RoLCBNRVRIX05PQVJHUywKKyAgICAgaW50X2JpdF9sZW5ndGhfZG9jfSwKICNpZiAwCi0JeyJpc19maW5pdGUiLAkoUHlDRnVuY3Rpb24paW50X2lzX2Zpbml0ZSwJTUVUSF9OT0FSR1MsCi0JICJSZXR1cm5zIGFsd2F5cyBUcnVlLiJ9LAorICAgIHsiaXNfZmluaXRlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWludF9pc19maW5pdGUsICAgICBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgYWx3YXlzIFRydWUuIn0sCiAjZW5kaWYKLQl7Il9fdHJ1bmNfXyIsCShQeUNGdW5jdGlvbilpbnRfaW50LAlNRVRIX05PQVJHUywKLSAgICAgICAgICJUcnVuY2F0aW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLiJ9LAotCXsiX19nZXRuZXdhcmdzX18iLAkoUHlDRnVuY3Rpb24paW50X2dldG5ld2FyZ3MsCU1FVEhfTk9BUkdTfSwKLSAgICAgICAgeyJfX2Zvcm1hdF9fIiwgKFB5Q0Z1bmN0aW9uKWludF9fZm9ybWF0X18sIE1FVEhfVkFSQVJHU30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fdHJ1bmNfXyIsICAgICAgIChQeUNGdW5jdGlvbilpbnRfaW50LCAgIE1FVEhfTk9BUkdTLAorICAgICAiVHJ1bmNhdGluZyBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi4ifSwKKyAgICB7Il9fZ2V0bmV3YXJnc19fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWludF9nZXRuZXdhcmdzLCAgICBNRVRIX05PQVJHU30sCisgICAgeyJfX2Zvcm1hdF9fIiwgKFB5Q0Z1bmN0aW9uKWludF9fZm9ybWF0X18sIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeUdldFNldERlZiBpbnRfZ2V0c2V0W10gPSB7Ci0JeyJyZWFsIiwKLQkgKGdldHRlcilpbnRfaW50LCAoc2V0dGVyKU5VTEwsCi0JICJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIiLAotCSBOVUxMfSwKLQl7ImltYWciLAotCSAoZ2V0dGVyKWludF9nZXQwLCAoc2V0dGVyKU5VTEwsCi0JICJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciIsCi0JIE5VTEx9LAotCXsibnVtZXJhdG9yIiwKLQkgKGdldHRlcilpbnRfaW50LCAoc2V0dGVyKU5VTEwsCi0JICJ0aGUgbnVtZXJhdG9yIG9mIGEgcmF0aW9uYWwgbnVtYmVyIGluIGxvd2VzdCB0ZXJtcyIsCi0JIE5VTEx9LAotCXsiZGVub21pbmF0b3IiLAotCSAoZ2V0dGVyKWludF9nZXQxLCAoc2V0dGVyKU5VTEwsCi0JICJ0aGUgZGVub21pbmF0b3Igb2YgYSByYXRpb25hbCBudW1iZXIgaW4gbG93ZXN0IHRlcm1zIiwKLQkgTlVMTH0sCi0Je05VTEx9ICAvKiBTZW50aW5lbCAqLworICAgIHsicmVhbCIsCisgICAgIChnZXR0ZXIpaW50X2ludCwgKHNldHRlcilOVUxMLAorICAgICAidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyIiwKKyAgICAgTlVMTH0sCisgICAgeyJpbWFnIiwKKyAgICAgKGdldHRlcilpbnRfZ2V0MCwgKHNldHRlcilOVUxMLAorICAgICAidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIiLAorICAgICBOVUxMfSwKKyAgICB7Im51bWVyYXRvciIsCisgICAgIChnZXR0ZXIpaW50X2ludCwgKHNldHRlcilOVUxMLAorICAgICAidGhlIG51bWVyYXRvciBvZiBhIHJhdGlvbmFsIG51bWJlciBpbiBsb3dlc3QgdGVybXMiLAorICAgICBOVUxMfSwKKyAgICB7ImRlbm9taW5hdG9yIiwKKyAgICAgKGdldHRlcilpbnRfZ2V0MSwgKHNldHRlcilOVUxMLAorICAgICAidGhlIGRlbm9taW5hdG9yIG9mIGEgcmF0aW9uYWwgbnVtYmVyIGluIGxvd2VzdCB0ZXJtcyIsCisgICAgIE5VTEx9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihpbnRfZG9jLApAQCAtMTMzOSwyMTIgKzEzMzksMjEyIEBACiBsb25nIG9iamVjdCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgaW50X2FzX251bWJlciA9IHsKLQkoYmluYXJ5ZnVuYylpbnRfYWRkLAkvKm5iX2FkZCovCi0JKGJpbmFyeWZ1bmMpaW50X3N1YiwJLypuYl9zdWJ0cmFjdCovCi0JKGJpbmFyeWZ1bmMpaW50X211bCwJLypuYl9tdWx0aXBseSovCi0JKGJpbmFyeWZ1bmMpaW50X2NsYXNzaWNfZGl2LCAvKm5iX2RpdmlkZSovCi0JKGJpbmFyeWZ1bmMpaW50X21vZCwJLypuYl9yZW1haW5kZXIqLwotCShiaW5hcnlmdW5jKWludF9kaXZtb2QsCS8qbmJfZGl2bW9kKi8KLQkodGVybmFyeWZ1bmMpaW50X3BvdywJLypuYl9wb3dlciovCi0JKHVuYXJ5ZnVuYylpbnRfbmVnLAkvKm5iX25lZ2F0aXZlKi8KLQkodW5hcnlmdW5jKWludF9pbnQsCS8qbmJfcG9zaXRpdmUqLwotCSh1bmFyeWZ1bmMpaW50X2FicywJLypuYl9hYnNvbHV0ZSovCi0JKGlucXVpcnkpaW50X25vbnplcm8sCS8qbmJfbm9uemVybyovCi0JKHVuYXJ5ZnVuYylpbnRfaW52ZXJ0LAkvKm5iX2ludmVydCovCi0JKGJpbmFyeWZ1bmMpaW50X2xzaGlmdCwJLypuYl9sc2hpZnQqLwotCShiaW5hcnlmdW5jKWludF9yc2hpZnQsCS8qbmJfcnNoaWZ0Ki8KLQkoYmluYXJ5ZnVuYylpbnRfYW5kLAkvKm5iX2FuZCovCi0JKGJpbmFyeWZ1bmMpaW50X3hvciwJLypuYl94b3IqLwotCShiaW5hcnlmdW5jKWludF9vciwJLypuYl9vciovCi0JaW50X2NvZXJjZSwJCS8qbmJfY29lcmNlKi8KLQkodW5hcnlmdW5jKWludF9pbnQsCS8qbmJfaW50Ki8KLQkodW5hcnlmdW5jKWludF9sb25nLAkvKm5iX2xvbmcqLwotCSh1bmFyeWZ1bmMpaW50X2Zsb2F0LAkvKm5iX2Zsb2F0Ki8KLQkodW5hcnlmdW5jKWludF9vY3QsCS8qbmJfb2N0Ki8KLQkodW5hcnlmdW5jKWludF9oZXgsIAkvKm5iX2hleCovCi0JMCwJCQkvKm5iX2lucGxhY2VfYWRkKi8KLQkwLAkJCS8qbmJfaW5wbGFjZV9zdWJ0cmFjdCovCi0JMCwJCQkvKm5iX2lucGxhY2VfbXVsdGlwbHkqLwotCTAsCQkJLypuYl9pbnBsYWNlX2RpdmlkZSovCi0JMCwJCQkvKm5iX2lucGxhY2VfcmVtYWluZGVyKi8KLQkwLAkJCS8qbmJfaW5wbGFjZV9wb3dlciovCi0JMCwJCQkvKm5iX2lucGxhY2VfbHNoaWZ0Ki8KLQkwLAkJCS8qbmJfaW5wbGFjZV9yc2hpZnQqLwotCTAsCQkJLypuYl9pbnBsYWNlX2FuZCovCi0JMCwJCQkvKm5iX2lucGxhY2VfeG9yKi8KLQkwLAkJCS8qbmJfaW5wbGFjZV9vciovCi0JKGJpbmFyeWZ1bmMpaW50X2RpdiwJLyogbmJfZmxvb3JfZGl2aWRlICovCi0JKGJpbmFyeWZ1bmMpaW50X3RydWVfZGl2aWRlLCAvKiBuYl90cnVlX2RpdmlkZSAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KLQkodW5hcnlmdW5jKWludF9pbnQsCS8qIG5iX2luZGV4ICovCisgICAgKGJpbmFyeWZ1bmMpaW50X2FkZCwgICAgICAgIC8qbmJfYWRkKi8KKyAgICAoYmluYXJ5ZnVuYylpbnRfc3ViLCAgICAgICAgLypuYl9zdWJ0cmFjdCovCisgICAgKGJpbmFyeWZ1bmMpaW50X211bCwgICAgICAgIC8qbmJfbXVsdGlwbHkqLworICAgIChiaW5hcnlmdW5jKWludF9jbGFzc2ljX2RpdiwgLypuYl9kaXZpZGUqLworICAgIChiaW5hcnlmdW5jKWludF9tb2QsICAgICAgICAvKm5iX3JlbWFpbmRlciovCisgICAgKGJpbmFyeWZ1bmMpaW50X2Rpdm1vZCwgICAgIC8qbmJfZGl2bW9kKi8KKyAgICAodGVybmFyeWZ1bmMpaW50X3BvdywgICAgICAgLypuYl9wb3dlciovCisgICAgKHVuYXJ5ZnVuYylpbnRfbmVnLCAgICAgICAgIC8qbmJfbmVnYXRpdmUqLworICAgICh1bmFyeWZ1bmMpaW50X2ludCwgICAgICAgICAvKm5iX3Bvc2l0aXZlKi8KKyAgICAodW5hcnlmdW5jKWludF9hYnMsICAgICAgICAgLypuYl9hYnNvbHV0ZSovCisgICAgKGlucXVpcnkpaW50X25vbnplcm8sICAgICAgIC8qbmJfbm9uemVybyovCisgICAgKHVuYXJ5ZnVuYylpbnRfaW52ZXJ0LCAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICAoYmluYXJ5ZnVuYylpbnRfbHNoaWZ0LCAgICAgLypuYl9sc2hpZnQqLworICAgIChiaW5hcnlmdW5jKWludF9yc2hpZnQsICAgICAvKm5iX3JzaGlmdCovCisgICAgKGJpbmFyeWZ1bmMpaW50X2FuZCwgICAgICAgIC8qbmJfYW5kKi8KKyAgICAoYmluYXJ5ZnVuYylpbnRfeG9yLCAgICAgICAgLypuYl94b3IqLworICAgIChiaW5hcnlmdW5jKWludF9vciwgICAgICAgICAvKm5iX29yKi8KKyAgICBpbnRfY29lcmNlLCAgICAgICAgICAgICAgICAgLypuYl9jb2VyY2UqLworICAgICh1bmFyeWZ1bmMpaW50X2ludCwgICAgICAgICAvKm5iX2ludCovCisgICAgKHVuYXJ5ZnVuYylpbnRfbG9uZywgICAgICAgIC8qbmJfbG9uZyovCisgICAgKHVuYXJ5ZnVuYylpbnRfZmxvYXQsICAgICAgIC8qbmJfZmxvYXQqLworICAgICh1bmFyeWZ1bmMpaW50X29jdCwgICAgICAgICAvKm5iX29jdCovCisgICAgKHVuYXJ5ZnVuYylpbnRfaGV4LCAgICAgICAgIC8qbmJfaGV4Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2FkZCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9zdWJ0cmFjdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9tdWx0aXBseSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9kaXZpZGUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcmVtYWluZGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3Bvd2VyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2xzaGlmdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9yc2hpZnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfYW5kKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3hvciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9vciovCisgICAgKGJpbmFyeWZ1bmMpaW50X2RpdiwgICAgICAgIC8qIG5iX2Zsb29yX2RpdmlkZSAqLworICAgIChiaW5hcnlmdW5jKWludF90cnVlX2RpdmlkZSwgLyogbmJfdHJ1ZV9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLworICAgICh1bmFyeWZ1bmMpaW50X2ludCwgICAgICAgICAvKiBuYl9pbmRleCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5SW50X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiaW50IiwKLQlzaXplb2YoUHlJbnRPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpaW50X2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYylpbnRfcHJpbnQsCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpaW50X2NvbXBhcmUsCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylpbnRfdG9fZGVjaW1hbF9zdHJpbmcsCS8qIHRwX3JlcHIgKi8KLQkmaW50X2FzX251bWJlciwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpaW50X2hhc2gsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JKHJlcHJmdW5jKWludF90b19kZWNpbWFsX3N0cmluZywJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19JTlRfU1VCQ0xBU1MsCS8qIHRwX2ZsYWdzICovCi0JaW50X2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlpbnRfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JaW50X2dldHNldCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWludF9uZXcsCQkJCS8qIHRwX25ldyAqLwotCShmcmVlZnVuYylpbnRfZnJlZSwgICAgICAgICAgIAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImludCIsCisgICAgc2l6ZW9mKFB5SW50T2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWludF9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpaW50X3ByaW50LCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYylpbnRfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpaW50X3RvX2RlY2ltYWxfc3RyaW5nLCAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmaW50X2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpaW50X2hhc2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpaW50X3RvX2RlY2ltYWxfc3RyaW5nLCAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19JTlRfU1VCQ0xBU1MsICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgaW50X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGludF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGludF9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpbnRfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIChmcmVlZnVuYylpbnRfZnJlZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogaW50CiBfUHlJbnRfSW5pdCh2b2lkKQogewotCVB5SW50T2JqZWN0ICp2OwotCWludCBpdmFsOworICAgIFB5SW50T2JqZWN0ICp2OworICAgIGludCBpdmFsOwogI2lmIE5TTUFMTE5FR0lOVFMgKyBOU01BTExQT1NJTlRTID4gMAotCWZvciAoaXZhbCA9IC1OU01BTExORUdJTlRTOyBpdmFsIDwgTlNNQUxMUE9TSU5UUzsgaXZhbCsrKSB7Ci0gICAgICAgICAgICAgIGlmICghZnJlZV9saXN0ICYmIChmcmVlX2xpc3QgPSBmaWxsX2ZyZWVfbGlzdCgpKSA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JCS8qIFB5T2JqZWN0X05ldyBpcyBpbmxpbmVkICovCi0JCXYgPSBmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IChQeUludE9iamVjdCAqKVB5X1RZUEUodik7Ci0JCVB5T2JqZWN0X0lOSVQodiwgJlB5SW50X1R5cGUpOwotCQl2LT5vYl9pdmFsID0gaXZhbDsKLQkJc21hbGxfaW50c1tpdmFsICsgTlNNQUxMTkVHSU5UU10gPSB2OwotCX0KKyAgICBmb3IgKGl2YWwgPSAtTlNNQUxMTkVHSU5UUzsgaXZhbCA8IE5TTUFMTFBPU0lOVFM7IGl2YWwrKykgeworICAgICAgICAgIGlmICghZnJlZV9saXN0ICYmIChmcmVlX2xpc3QgPSBmaWxsX2ZyZWVfbGlzdCgpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgLyogUHlPYmplY3RfTmV3IGlzIGlubGluZWQgKi8KKyAgICAgICAgdiA9IGZyZWVfbGlzdDsKKyAgICAgICAgZnJlZV9saXN0ID0gKFB5SW50T2JqZWN0ICopUHlfVFlQRSh2KTsKKyAgICAgICAgUHlPYmplY3RfSU5JVCh2LCAmUHlJbnRfVHlwZSk7CisgICAgICAgIHYtPm9iX2l2YWwgPSBpdmFsOworICAgICAgICBzbWFsbF9pbnRzW2l2YWwgKyBOU01BTExORUdJTlRTXSA9IHY7CisgICAgfQogI2VuZGlmCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIGludAogUHlJbnRfQ2xlYXJGcmVlTGlzdCh2b2lkKQogewotCVB5SW50T2JqZWN0ICpwOwotCVB5SW50QmxvY2sgKmxpc3QsICpuZXh0OwotCWludCBpOwotCWludCB1OwkJCS8qIHJlbWFpbmluZyB1bmZyZWVkIGludHMgcGVyIGJsb2NrICovCi0JaW50IGZyZWVsaXN0X3NpemUgPSAwOworICAgIFB5SW50T2JqZWN0ICpwOworICAgIFB5SW50QmxvY2sgKmxpc3QsICpuZXh0OworICAgIGludCBpOworICAgIGludCB1OyAgICAgICAgICAgICAgICAgICAgICAvKiByZW1haW5pbmcgdW5mcmVlZCBpbnRzIHBlciBibG9jayAqLworICAgIGludCBmcmVlbGlzdF9zaXplID0gMDsKIAotCWxpc3QgPSBibG9ja19saXN0OwotCWJsb2NrX2xpc3QgPSBOVUxMOwotCWZyZWVfbGlzdCA9IE5VTEw7Ci0Jd2hpbGUgKGxpc3QgIT0gTlVMTCkgewotCQl1ID0gMDsKLQkJZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOwotCQkgICAgIGkgPCBOX0lOVE9CSkVDVFM7Ci0JCSAgICAgaSsrLCBwKyspIHsKLQkJCWlmIChQeUludF9DaGVja0V4YWN0KHApICYmIHAtPm9iX3JlZmNudCAhPSAwKQotCQkJCXUrKzsKLQkJfQotCQluZXh0ID0gbGlzdC0+bmV4dDsKLQkJaWYgKHUpIHsKLQkJCWxpc3QtPm5leHQgPSBibG9ja19saXN0OwotCQkJYmxvY2tfbGlzdCA9IGxpc3Q7Ci0JCQlmb3IgKGkgPSAwLCBwID0gJmxpc3QtPm9iamVjdHNbMF07Ci0JCQkgICAgIGkgPCBOX0lOVE9CSkVDVFM7Ci0JCQkgICAgIGkrKywgcCsrKSB7Ci0JCQkJaWYgKCFQeUludF9DaGVja0V4YWN0KHApIHx8Ci0JCQkJICAgIHAtPm9iX3JlZmNudCA9PSAwKSB7Ci0JCQkJCVB5X1RZUEUocCkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopCi0JCQkJCQlmcmVlX2xpc3Q7Ci0JCQkJCWZyZWVfbGlzdCA9IHA7Ci0JCQkJfQorICAgIGxpc3QgPSBibG9ja19saXN0OworICAgIGJsb2NrX2xpc3QgPSBOVUxMOworICAgIGZyZWVfbGlzdCA9IE5VTEw7CisgICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgeworICAgICAgICB1ID0gMDsKKyAgICAgICAgZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOworICAgICAgICAgICAgIGkgPCBOX0lOVE9CSkVDVFM7CisgICAgICAgICAgICAgaSsrLCBwKyspIHsKKyAgICAgICAgICAgIGlmIChQeUludF9DaGVja0V4YWN0KHApICYmIHAtPm9iX3JlZmNudCAhPSAwKQorICAgICAgICAgICAgICAgIHUrKzsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gbGlzdC0+bmV4dDsKKyAgICAgICAgaWYgKHUpIHsKKyAgICAgICAgICAgIGxpc3QtPm5leHQgPSBibG9ja19saXN0OworICAgICAgICAgICAgYmxvY2tfbGlzdCA9IGxpc3Q7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBwID0gJmxpc3QtPm9iamVjdHNbMF07CisgICAgICAgICAgICAgICAgIGkgPCBOX0lOVE9CSkVDVFM7CisgICAgICAgICAgICAgICAgIGkrKywgcCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFQeUludF9DaGVja0V4YWN0KHApIHx8CisgICAgICAgICAgICAgICAgICAgIHAtPm9iX3JlZmNudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocCkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopCisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2xpc3Q7CisgICAgICAgICAgICAgICAgICAgIGZyZWVfbGlzdCA9IHA7CisgICAgICAgICAgICAgICAgfQogI2lmIE5TTUFMTE5FR0lOVFMgKyBOU01BTExQT1NJTlRTID4gMAotCQkJCWVsc2UgaWYgKC1OU01BTExORUdJTlRTIDw9IHAtPm9iX2l2YWwgJiYKLQkJCQkJIHAtPm9iX2l2YWwgPCBOU01BTExQT1NJTlRTICYmCi0JCQkJCSBzbWFsbF9pbnRzW3AtPm9iX2l2YWwgKwotCQkJCQkJICAgIE5TTUFMTE5FR0lOVFNdID09IE5VTEwpIHsKLQkJCQkJUHlfSU5DUkVGKHApOwotCQkJCQlzbWFsbF9pbnRzW3AtPm9iX2l2YWwgKwotCQkJCQkJICAgTlNNQUxMTkVHSU5UU10gPSBwOwotCQkJCX0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgtTlNNQUxMTkVHSU5UUyA8PSBwLT5vYl9pdmFsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgcC0+b2JfaXZhbCA8IE5TTUFMTFBPU0lOVFMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbF9pbnRzW3AtPm9iX2l2YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNNQUxMTkVHSU5UU10gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYocCk7CisgICAgICAgICAgICAgICAgICAgIHNtYWxsX2ludHNbcC0+b2JfaXZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNNQUxMTkVHSU5UU10gPSBwOworICAgICAgICAgICAgICAgIH0KICNlbmRpZgotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJUHlNZW1fRlJFRShsaXN0KTsKLQkJfQotCQlmcmVlbGlzdF9zaXplICs9IHU7Ci0JCWxpc3QgPSBuZXh0OwotCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5TWVtX0ZSRUUobGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZWxpc3Rfc2l6ZSArPSB1OworICAgICAgICBsaXN0ID0gbmV4dDsKKyAgICB9CiAKLQlyZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKKyAgICByZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKIH0KIAogdm9pZAogUHlJbnRfRmluaSh2b2lkKQogewotCVB5SW50T2JqZWN0ICpwOwotCVB5SW50QmxvY2sgKmxpc3Q7Ci0JaW50IGk7Ci0JaW50IHU7CQkJLyogdG90YWwgdW5mcmVlZCBpbnRzIHBlciBibG9jayAqLworICAgIFB5SW50T2JqZWN0ICpwOworICAgIFB5SW50QmxvY2sgKmxpc3Q7CisgICAgaW50IGk7CisgICAgaW50IHU7ICAgICAgICAgICAgICAgICAgICAgIC8qIHRvdGFsIHVuZnJlZWQgaW50cyBwZXIgYmxvY2sgKi8KIAogI2lmIE5TTUFMTE5FR0lOVFMgKyBOU01BTExQT1NJTlRTID4gMAotCVB5SW50T2JqZWN0ICoqcTsKKyAgICBQeUludE9iamVjdCAqKnE7CiAKLQlpID0gTlNNQUxMTkVHSU5UUyArIE5TTUFMTFBPU0lOVFM7Ci0JcSA9IHNtYWxsX2ludHM7Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCVB5X1hERUNSRUYoKnEpOwotCQkqcSsrID0gTlVMTDsKLQl9CisgICAgaSA9IE5TTUFMTE5FR0lOVFMgKyBOU01BTExQT1NJTlRTOworICAgIHEgPSBzbWFsbF9pbnRzOworICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICBQeV9YREVDUkVGKCpxKTsKKyAgICAgICAgKnErKyA9IE5VTEw7CisgICAgfQogI2VuZGlmCi0JdSA9IFB5SW50X0NsZWFyRnJlZUxpc3QoKTsKLQlpZiAoIVB5X1ZlcmJvc2VGbGFnKQotCQlyZXR1cm47Ci0JZnByaW50ZihzdGRlcnIsICIjIGNsZWFudXAgaW50cyIpOwotCWlmICghdSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JfQotCWVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSI6ICVkIHVuZnJlZWQgaW50JXNcbiIsCi0JCQl1LCB1ID09IDEgPyAiIiA6ICJzIik7Ci0JfQotCWlmIChQeV9WZXJib3NlRmxhZyA+IDEpIHsKLQkJbGlzdCA9IGJsb2NrX2xpc3Q7Ci0JCXdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLQkJCWZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKLQkJCSAgICAgaSA8IE5fSU5UT0JKRUNUUzsKLQkJCSAgICAgaSsrLCBwKyspIHsKLQkJCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdChwKSAmJiBwLT5vYl9yZWZjbnQgIT0gMCkKLQkJCQkJLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvCi0JCQkJCSAgIGxvbmcgdW50aWwgJXpkIGlzIHVuaXZlcnNhbGx5Ci0JCQkJCSAgIGF2YWlsYWJsZQotCQkJCQkgKi8KLQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIiMgICA8aW50IGF0ICVwLCByZWZjbnQ9JWxkLCB2YWw9JWxkPlxuIiwKLQkJCQkJCXAsIChsb25nKXAtPm9iX3JlZmNudCwKLQkJCQkJCXAtPm9iX2l2YWwpOwotCQkJfQotCQkJbGlzdCA9IGxpc3QtPm5leHQ7Ci0JCX0KLQl9CisgICAgdSA9IFB5SW50X0NsZWFyRnJlZUxpc3QoKTsKKyAgICBpZiAoIVB5X1ZlcmJvc2VGbGFnKQorICAgICAgICByZXR1cm47CisgICAgZnByaW50ZihzdGRlcnIsICIjIGNsZWFudXAgaW50cyIpOworICAgIGlmICghdSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICI6ICVkIHVuZnJlZWQgaW50JXNcbiIsCisgICAgICAgICAgICB1LCB1ID09IDEgPyAiIiA6ICJzIik7CisgICAgfQorICAgIGlmIChQeV9WZXJib3NlRmxhZyA+IDEpIHsKKyAgICAgICAgbGlzdCA9IGJsb2NrX2xpc3Q7CisgICAgICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKKyAgICAgICAgICAgICAgICAgaSA8IE5fSU5UT0JKRUNUUzsKKyAgICAgICAgICAgICAgICAgaSsrLCBwKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChwKSAmJiBwLT5vYl9yZWZjbnQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvCisgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdW50aWwgJXpkIGlzIHVuaXZlcnNhbGx5CisgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIiMgICA8aW50IGF0ICVwLCByZWZjbnQ9JWxkLCB2YWw9JWxkPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgKGxvbmcpcC0+b2JfcmVmY250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5vYl9pdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9pdGVyb2JqZWN0LmMgYi9PYmplY3RzL2l0ZXJvYmplY3QuYwppbmRleCA5Y2ViYWM5Li41YTlhMmRkIDEwMDY0NAotLS0gYS9PYmplY3RzL2l0ZXJvYmplY3QuYworKysgYi9PYmplY3RzL2l0ZXJvYmplY3QuYwpAQCAtMywyMjggKzMsMjI4IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JbG9uZyAgICAgIGl0X2luZGV4OwotCVB5T2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgICAgICBpdF9pbmRleDsKKyAgICBQeU9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBzZXFpdGVyb2JqZWN0OwogCiBQeU9iamVjdCAqCiBQeVNlcUl0ZXJfTmV3KFB5T2JqZWN0ICpzZXEpCiB7Ci0Jc2VxaXRlcm9iamVjdCAqaXQ7CisgICAgc2VxaXRlcm9iamVjdCAqaXQ7CiAKLQlpZiAoIVB5U2VxdWVuY2VfQ2hlY2soc2VxKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQkKLQlpdCA9IFB5T2JqZWN0X0dDX05ldyhzZXFpdGVyb2JqZWN0LCAmUHlTZXFJdGVyX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpdC0+aXRfaW5kZXggPSAwOwotCVB5X0lOQ1JFRihzZXEpOwotCWl0LT5pdF9zZXEgPSBzZXE7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgaWYgKCFQeVNlcXVlbmNlX0NoZWNrKHNlcSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X0dDX05ldyhzZXFpdGVyb2JqZWN0LCAmUHlTZXFJdGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdC0+aXRfaW5kZXggPSAwOworICAgIFB5X0lOQ1JFRihzZXEpOworICAgIGl0LT5pdF9zZXEgPSBzZXE7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyB2b2lkCiBpdGVyX2RlYWxsb2Moc2VxaXRlcm9iamVjdCAqaXQpCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soaXQpOwotCVB5X1hERUNSRUYoaXQtPml0X3NlcSk7Ci0JUHlPYmplY3RfR0NfRGVsKGl0KTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhpdCk7CisgICAgUHlfWERFQ1JFRihpdC0+aXRfc2VxKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoaXQpOwogfQogCiBzdGF0aWMgaW50CiBpdGVyX3RyYXZlcnNlKHNlcWl0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpdC0+aXRfc2VxKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpdC0+aXRfc2VxKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGl0ZXJfaXRlcm5leHQoUHlPYmplY3QgKml0ZXJhdG9yKQogewotCXNlcWl0ZXJvYmplY3QgKml0OwotCVB5T2JqZWN0ICpzZXE7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBzZXFpdGVyb2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqc2VxOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlhc3NlcnQoUHlTZXFJdGVyX0NoZWNrKGl0ZXJhdG9yKSk7Ci0JaXQgPSAoc2VxaXRlcm9iamVjdCAqKWl0ZXJhdG9yOwotCXNlcSA9IGl0LT5pdF9zZXE7Ci0JaWYgKHNlcSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlTZXFJdGVyX0NoZWNrKGl0ZXJhdG9yKSk7CisgICAgaXQgPSAoc2VxaXRlcm9iamVjdCAqKWl0ZXJhdG9yOworICAgIHNlcSA9IGl0LT5pdF9zZXE7CisgICAgaWYgKHNlcSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZXEsIGl0LT5pdF9pbmRleCk7Ci0JaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JCWl0LT5pdF9pbmRleCsrOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbmRleEVycm9yKSB8fAotCSAgICBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotCXsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlfREVDUkVGKHNlcSk7Ci0JCWl0LT5pdF9zZXEgPSBOVUxMOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeVNlcXVlbmNlX0dldEl0ZW0oc2VxLCBpdC0+aXRfaW5kZXgpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgICBpdC0+aXRfaW5kZXgrKzsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW5kZXhFcnJvcikgfHwKKyAgICAgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICBpdC0+aXRfc2VxID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpdGVyX2xlbihzZXFpdGVyb2JqZWN0ICppdCkKIHsKLQlQeV9zc2l6ZV90IHNlcXNpemUsIGxlbjsKKyAgICBQeV9zc2l6ZV90IHNlcXNpemUsIGxlbjsKIAotCWlmIChpdC0+aXRfc2VxKSB7Ci0JCXNlcXNpemUgPSBQeVNlcXVlbmNlX1NpemUoaXQtPml0X3NlcSk7Ci0JCWlmIChzZXFzaXplID09IC0xKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWxlbiA9IHNlcXNpemUgLSBpdC0+aXRfaW5kZXg7Ci0JCWlmIChsZW4gPj0gMCkKLQkJCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChsZW4pOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7CisgICAgaWYgKGl0LT5pdF9zZXEpIHsKKyAgICAgICAgc2Vxc2l6ZSA9IFB5U2VxdWVuY2VfU2l6ZShpdC0+aXRfc2VxKTsKKyAgICAgICAgaWYgKHNlcXNpemUgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbGVuID0gc2Vxc2l6ZSAtIGl0LT5pdF9pbmRleDsKKyAgICAgICAgaWYgKGxlbiA+PSAwKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGxlbik7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKIH0KIAogUHlEb2NfU1RSVkFSKGxlbmd0aF9oaW50X2RvYywgIlByaXZhdGUgbWV0aG9kIHJldHVybmluZyBhbiBlc3RpbWF0ZSBvZiBsZW4obGlzdChpdCkpLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgc2VxaXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24paXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKWl0ZXJfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5U2VxSXRlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JIml0ZXJhdG9yIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihzZXFpdGVyb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpaXRlcl9kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKWl0ZXJfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JaXRlcl9pdGVybmV4dCwJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzZXFpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2Yoc2VxaXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIGl0ZXJfaXRlcm5leHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzZXFpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKml0X2NhbGxhYmxlOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwotCVB5T2JqZWN0ICppdF9zZW50aW5lbDsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKml0X2NhbGxhYmxlOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0ICppdF9zZW50aW5lbDsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gY2FsbGl0ZXJvYmplY3Q7CiAKIFB5T2JqZWN0ICoKIFB5Q2FsbEl0ZXJfTmV3KFB5T2JqZWN0ICpjYWxsYWJsZSwgUHlPYmplY3QgKnNlbnRpbmVsKQogewotCWNhbGxpdGVyb2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X0dDX05ldyhjYWxsaXRlcm9iamVjdCwgJlB5Q2FsbEl0ZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihjYWxsYWJsZSk7Ci0JaXQtPml0X2NhbGxhYmxlID0gY2FsbGFibGU7Ci0JUHlfSU5DUkVGKHNlbnRpbmVsKTsKLQlpdC0+aXRfc2VudGluZWwgPSBzZW50aW5lbDsKLQlfUHlPYmplY3RfR0NfVFJBQ0soaXQpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBjYWxsaXRlcm9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9HQ19OZXcoY2FsbGl0ZXJvYmplY3QsICZQeUNhbGxJdGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoY2FsbGFibGUpOworICAgIGl0LT5pdF9jYWxsYWJsZSA9IGNhbGxhYmxlOworICAgIFB5X0lOQ1JFRihzZW50aW5lbCk7CisgICAgaXQtPml0X3NlbnRpbmVsID0gc2VudGluZWw7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiBzdGF0aWMgdm9pZAogY2FsbGl0ZXJfZGVhbGxvYyhjYWxsaXRlcm9iamVjdCAqaXQpCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soaXQpOwotCVB5X1hERUNSRUYoaXQtPml0X2NhbGxhYmxlKTsKLQlQeV9YREVDUkVGKGl0LT5pdF9zZW50aW5lbCk7Ci0JUHlPYmplY3RfR0NfRGVsKGl0KTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhpdCk7CisgICAgUHlfWERFQ1JFRihpdC0+aXRfY2FsbGFibGUpOworICAgIFB5X1hERUNSRUYoaXQtPml0X3NlbnRpbmVsKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoaXQpOwogfQogCiBzdGF0aWMgaW50CiBjYWxsaXRlcl90cmF2ZXJzZShjYWxsaXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGl0LT5pdF9jYWxsYWJsZSk7Ci0JUHlfVklTSVQoaXQtPml0X3NlbnRpbmVsKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpdC0+aXRfY2FsbGFibGUpOworICAgIFB5X1ZJU0lUKGl0LT5pdF9zZW50aW5lbCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsaXRlcl9pdGVybmV4dChjYWxsaXRlcm9iamVjdCAqaXQpCiB7Ci0JaWYgKGl0LT5pdF9jYWxsYWJsZSAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0JCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCWlmIChhcmdzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChpdC0+aXRfY2FsbGFibGUsIGFyZ3MsIE5VTEwpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JCWlmIChyZXN1bHQgIT0gTlVMTCkgewotCQkJaW50IG9rOwotCQkJb2sgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wocmVzdWx0LAotCQkJCQkJICAgICAgaXQtPml0X3NlbnRpbmVsLAotCQkJCQkJICAgICAgUHlfRVEpOwotCQkJaWYgKG9rID09IDApCi0JCQkJcmV0dXJuIHJlc3VsdDsgLyogQ29tbW9uIGNhc2UsIGZhc3QgcGF0aCAqLwotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlpZiAob2sgPiAwKSB7Ci0JCQkJUHlfQ0xFQVIoaXQtPml0X2NhbGxhYmxlKTsKLQkJCQlQeV9DTEVBUihpdC0+aXRfc2VudGluZWwpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeV9DTEVBUihpdC0+aXRfY2FsbGFibGUpOwotCQkJUHlfQ0xFQVIoaXQtPml0X3NlbnRpbmVsKTsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoaXQtPml0X2NhbGxhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGl0LT5pdF9jYWxsYWJsZSwgYXJncywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgb2s7CisgICAgICAgICAgICBvayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+aXRfc2VudGluZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9FUSk7CisgICAgICAgICAgICBpZiAob2sgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAvKiBDb21tb24gY2FzZSwgZmFzdCBwYXRoICovCisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChvayA+IDApIHsKKyAgICAgICAgICAgICAgICBQeV9DTEVBUihpdC0+aXRfY2FsbGFibGUpOworICAgICAgICAgICAgICAgIFB5X0NMRUFSKGl0LT5pdF9zZW50aW5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIFB5X0NMRUFSKGl0LT5pdF9jYWxsYWJsZSk7CisgICAgICAgICAgICBQeV9DTEVBUihpdC0+aXRfc2VudGluZWwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiBQeVR5cGVPYmplY3QgUHlDYWxsSXRlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImNhbGxhYmxlLWl0ZXJhdG9yIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGNhbGxpdGVyb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY2FsbGl0ZXJfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY2FsbGl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpY2FsbGl0ZXJfaXRlcm5leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJjYWxsYWJsZS1pdGVyYXRvciIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihjYWxsaXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciljYWxsaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNhbGxpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYyljYWxsaXRlcl9pdGVybmV4dCwgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvbGlzdG9iamVjdC5jIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKaW5kZXggODYxMDA4NS4uOTcwNGQ4ZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9saXN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKQEAgLTUsNyArNSw3IEBACiAjaWZkZWYgU1REQ19IRUFERVJTCiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAjZWxzZQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkJLyogRm9yIHNpemVfdCAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgICAgICAgICAvKiBGb3Igc2l6ZV90ICovCiAjZW5kaWYKIAogLyogRW5zdXJlIG9iX2l0ZW0gaGFzIHJvb20gZm9yIGF0IGxlYXN0IG5ld3NpemUgZWxlbWVudHMsIGFuZCBzZXQKQEAgLTI0LDUyICsyNCw1MiBAQAogc3RhdGljIGludAogbGlzdF9yZXNpemUoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IG5ld3NpemUpCiB7Ci0JUHlPYmplY3QgKippdGVtczsKLQlzaXplX3QgbmV3X2FsbG9jYXRlZDsKLQlQeV9zc2l6ZV90IGFsbG9jYXRlZCA9IHNlbGYtPmFsbG9jYXRlZDsKKyAgICBQeU9iamVjdCAqKml0ZW1zOworICAgIHNpemVfdCBuZXdfYWxsb2NhdGVkOworICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkID0gc2VsZi0+YWxsb2NhdGVkOwogCi0JLyogQnlwYXNzIHJlYWxsb2MoKSB3aGVuIGEgcHJldmlvdXMgb3ZlcmFsbG9jYXRpb24gaXMgbGFyZ2UgZW5vdWdoCi0JICAgdG8gYWNjb21tb2RhdGUgdGhlIG5ld3NpemUuICBJZiB0aGUgbmV3c2l6ZSBmYWxscyBsb3dlciB0aGFuIGhhbGYKLQkgICB0aGUgYWxsb2NhdGVkIHNpemUsIHRoZW4gcHJvY2VlZCB3aXRoIHRoZSByZWFsbG9jKCkgdG8gc2hyaW5rIHRoZSBsaXN0LgotCSovCi0JaWYgKGFsbG9jYXRlZCA+PSBuZXdzaXplICYmIG5ld3NpemUgPj0gKGFsbG9jYXRlZCA+PiAxKSkgewotCQlhc3NlcnQoc2VsZi0+b2JfaXRlbSAhPSBOVUxMIHx8IG5ld3NpemUgPT0gMCk7Ci0JCVB5X1NJWkUoc2VsZikgPSBuZXdzaXplOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogQnlwYXNzIHJlYWxsb2MoKSB3aGVuIGEgcHJldmlvdXMgb3ZlcmFsbG9jYXRpb24gaXMgbGFyZ2UgZW5vdWdoCisgICAgICAgdG8gYWNjb21tb2RhdGUgdGhlIG5ld3NpemUuICBJZiB0aGUgbmV3c2l6ZSBmYWxscyBsb3dlciB0aGFuIGhhbGYKKyAgICAgICB0aGUgYWxsb2NhdGVkIHNpemUsIHRoZW4gcHJvY2VlZCB3aXRoIHRoZSByZWFsbG9jKCkgdG8gc2hyaW5rIHRoZSBsaXN0LgorICAgICovCisgICAgaWYgKGFsbG9jYXRlZCA+PSBuZXdzaXplICYmIG5ld3NpemUgPj0gKGFsbG9jYXRlZCA+PiAxKSkgeworICAgICAgICBhc3NlcnQoc2VsZi0+b2JfaXRlbSAhPSBOVUxMIHx8IG5ld3NpemUgPT0gMCk7CisgICAgICAgIFB5X1NJWkUoc2VsZikgPSBuZXdzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBUaGlzIG92ZXItYWxsb2NhdGVzIHByb3BvcnRpb25hbCB0byB0aGUgbGlzdCBzaXplLCBtYWtpbmcgcm9vbQotCSAqIGZvciBhZGRpdGlvbmFsIGdyb3d0aC4gIFRoZSBvdmVyLWFsbG9jYXRpb24gaXMgbWlsZCwgYnV0IGlzCi0JICogZW5vdWdoIHRvIGdpdmUgbGluZWFyLXRpbWUgYW1vcnRpemVkIGJlaGF2aW9yIG92ZXIgYSBsb25nCi0JICogc2VxdWVuY2Ugb2YgYXBwZW5kcygpIGluIHRoZSBwcmVzZW5jZSBvZiBhIHBvb3JseS1wZXJmb3JtaW5nCi0JICogc3lzdGVtIHJlYWxsb2MoKS4KLQkgKiBUaGUgZ3Jvd3RoIHBhdHRlcm4gaXM6ICAwLCA0LCA4LCAxNiwgMjUsIDM1LCA0NiwgNTgsIDcyLCA4OCwgLi4uCi0JICovCi0JbmV3X2FsbG9jYXRlZCA9IChuZXdzaXplID4+IDMpICsgKG5ld3NpemUgPCA5ID8gMyA6IDYpOworICAgIC8qIFRoaXMgb3Zlci1hbGxvY2F0ZXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBsaXN0IHNpemUsIG1ha2luZyByb29tCisgICAgICogZm9yIGFkZGl0aW9uYWwgZ3Jvd3RoLiAgVGhlIG92ZXItYWxsb2NhdGlvbiBpcyBtaWxkLCBidXQgaXMKKyAgICAgKiBlbm91Z2ggdG8gZ2l2ZSBsaW5lYXItdGltZSBhbW9ydGl6ZWQgYmVoYXZpb3Igb3ZlciBhIGxvbmcKKyAgICAgKiBzZXF1ZW5jZSBvZiBhcHBlbmRzKCkgaW4gdGhlIHByZXNlbmNlIG9mIGEgcG9vcmx5LXBlcmZvcm1pbmcKKyAgICAgKiBzeXN0ZW0gcmVhbGxvYygpLgorICAgICAqIFRoZSBncm93dGggcGF0dGVybiBpczogIDAsIDQsIDgsIDE2LCAyNSwgMzUsIDQ2LCA1OCwgNzIsIDg4LCAuLi4KKyAgICAgKi8KKyAgICBuZXdfYWxsb2NhdGVkID0gKG5ld3NpemUgPj4gMykgKyAobmV3c2l6ZSA8IDkgPyAzIDogNik7CiAKLQkvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLwotCWlmIChuZXdfYWxsb2NhdGVkID4gUFlfU0laRV9NQVggLSBuZXdzaXplKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgewotCQluZXdfYWxsb2NhdGVkICs9IG5ld3NpemU7Ci0JfQorICAgIC8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCisgICAgaWYgKG5ld19hbGxvY2F0ZWQgPiBQWV9TSVpFX01BWCAtIG5ld3NpemUpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIG5ld19hbGxvY2F0ZWQgKz0gbmV3c2l6ZTsKKyAgICB9CiAKLQlpZiAobmV3c2l6ZSA9PSAwKQotCQluZXdfYWxsb2NhdGVkID0gMDsKLQlpdGVtcyA9IHNlbGYtPm9iX2l0ZW07Ci0JaWYgKG5ld19hbGxvY2F0ZWQgPD0gKCh+KHNpemVfdCkwKSAvIHNpemVvZihQeU9iamVjdCAqKSkpCi0JCVB5TWVtX1JFU0laRShpdGVtcywgUHlPYmplY3QgKiwgbmV3X2FsbG9jYXRlZCk7Ci0JZWxzZQotCQlpdGVtcyA9IE5VTEw7Ci0JaWYgKGl0ZW1zID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzZWxmLT5vYl9pdGVtID0gaXRlbXM7Ci0JUHlfU0laRShzZWxmKSA9IG5ld3NpemU7Ci0Jc2VsZi0+YWxsb2NhdGVkID0gbmV3X2FsbG9jYXRlZDsKLQlyZXR1cm4gMDsKKyAgICBpZiAobmV3c2l6ZSA9PSAwKQorICAgICAgICBuZXdfYWxsb2NhdGVkID0gMDsKKyAgICBpdGVtcyA9IHNlbGYtPm9iX2l0ZW07CisgICAgaWYgKG5ld19hbGxvY2F0ZWQgPD0gKCh+KHNpemVfdCkwKSAvIHNpemVvZihQeU9iamVjdCAqKSkpCisgICAgICAgIFB5TWVtX1JFU0laRShpdGVtcywgUHlPYmplY3QgKiwgbmV3X2FsbG9jYXRlZCk7CisgICAgZWxzZQorICAgICAgICBpdGVtcyA9IE5VTEw7CisgICAgaWYgKGl0ZW1zID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzZWxmLT5vYl9pdGVtID0gaXRlbXM7CisgICAgUHlfU0laRShzZWxmKSA9IG5ld3NpemU7CisgICAgc2VsZi0+YWxsb2NhdGVkID0gbmV3X2FsbG9jYXRlZDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogRGVidWcgc3RhdGlzdGljIHRvIGNvbXBhcmUgYWxsb2NhdGlvbnMgd2l0aCByZXVzZSB0aHJvdWdoIHRoZSBmcmVlIGxpc3QgKi8KQEAgLTgxLDEyICs4MSwxMiBAQAogc3RhdGljIHZvaWQKIHNob3dfYWxsb2Modm9pZCkKIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkxpc3QgYWxsb2NhdGlvbnM6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCi0JCWNvdW50X2FsbG9jKTsKLQlmcHJpbnRmKHN0ZGVyciwgIkxpc3QgcmV1c2UgdGhyb3VnaCBmcmVlbGlzdDogJSIgUFlfRk9STUFUX1NJWkVfVAotCQkiZFxuIiwgY291bnRfcmV1c2UpOwotCWZwcmludGYoc3RkZXJyLCAiJS4yZiUlIHJldXNlIHJhdGVcblxuIiwKLQkJKDEwMC4wKmNvdW50X3JldXNlLyhjb3VudF9hbGxvYytjb3VudF9yZXVzZSkpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3QgYWxsb2NhdGlvbnM6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCisgICAgICAgIGNvdW50X2FsbG9jKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3QgcmV1c2UgdGhyb3VnaCBmcmVlbGlzdDogJSIgUFlfRk9STUFUX1NJWkVfVAorICAgICAgICAiZFxuIiwgY291bnRfcmV1c2UpOworICAgIGZwcmludGYoc3RkZXJyLCAiJS4yZiUlIHJldXNlIHJhdGVcblxuIiwKKyAgICAgICAgKDEwMC4wKmNvdW50X3JldXNlLyhjb3VudF9hbGxvYytjb3VudF9yZXVzZSkpKTsKIH0KICNlbmRpZgogCkBAIC0xMDAsNzcgKzEwMCw3NyBAQAogdm9pZAogUHlMaXN0X0Zpbmkodm9pZCkKIHsKLQlQeUxpc3RPYmplY3QgKm9wOworICAgIFB5TGlzdE9iamVjdCAqb3A7CiAKLQl3aGlsZSAobnVtZnJlZSkgewotCQlvcCA9IGZyZWVfbGlzdFstLW51bWZyZWVdOwotCQlhc3NlcnQoUHlMaXN0X0NoZWNrRXhhY3Qob3ApKTsKLQkJUHlPYmplY3RfR0NfRGVsKG9wKTsKLQl9CisgICAgd2hpbGUgKG51bWZyZWUpIHsKKyAgICAgICAgb3AgPSBmcmVlX2xpc3RbLS1udW1mcmVlXTsKKyAgICAgICAgYXNzZXJ0KFB5TGlzdF9DaGVja0V4YWN0KG9wKSk7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChvcCk7CisgICAgfQogfQogCiBQeU9iamVjdCAqCiBQeUxpc3RfTmV3KFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQeUxpc3RPYmplY3QgKm9wOwotCXNpemVfdCBuYnl0ZXM7CisgICAgUHlMaXN0T2JqZWN0ICpvcDsKKyAgICBzaXplX3QgbmJ5dGVzOwogI2lmZGVmIFNIT1dfQUxMT0NfQ09VTlQKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCVB5X0F0RXhpdChzaG93X2FsbG9jKTsKLQkJaW5pdGlhbGl6ZWQgPSAxOwotCX0KKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIFB5X0F0RXhpdChzaG93X2FsbG9jKTsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIH0KICNlbmRpZgogCi0JaWYgKHNpemUgPCAwKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogQ2hlY2sgZm9yIG92ZXJmbG93IHdpdGhvdXQgYW4gYWN0dWFsIG92ZXJmbG93LAotCSAqICB3aGljaCBjYW4gY2F1c2UgY29tcGlsZXIgdG8gb3B0aW1pc2Ugb3V0ICovCi0JaWYgKChzaXplX3Qpc2l6ZSA+IFBZX1NJWkVfTUFYIC8gc2l6ZW9mKFB5T2JqZWN0ICopKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQluYnl0ZXMgPSBzaXplICogc2l6ZW9mKFB5T2JqZWN0ICopOwotCWlmIChudW1mcmVlKSB7Ci0JCW51bWZyZWUtLTsKLQkJb3AgPSBmcmVlX2xpc3RbbnVtZnJlZV07Ci0JCV9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopb3ApOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyB3aXRob3V0IGFuIGFjdHVhbCBvdmVyZmxvdywKKyAgICAgKiAgd2hpY2ggY2FuIGNhdXNlIGNvbXBpbGVyIHRvIG9wdGltaXNlIG91dCAqLworICAgIGlmICgoc2l6ZV90KXNpemUgPiBQWV9TSVpFX01BWCAvIHNpemVvZihQeU9iamVjdCAqKSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgbmJ5dGVzID0gc2l6ZSAqIHNpemVvZihQeU9iamVjdCAqKTsKKyAgICBpZiAobnVtZnJlZSkgeworICAgICAgICBudW1mcmVlLS07CisgICAgICAgIG9wID0gZnJlZV9saXN0W251bWZyZWVdOworICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKW9wKTsKICNpZmRlZiBTSE9XX0FMTE9DX0NPVU5UCi0JCWNvdW50X3JldXNlKys7CisgICAgICAgIGNvdW50X3JldXNlKys7CiAjZW5kaWYKLQl9IGVsc2UgewotCQlvcCA9IFB5T2JqZWN0X0dDX05ldyhQeUxpc3RPYmplY3QsICZQeUxpc3RfVHlwZSk7Ci0JCWlmIChvcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3AgPSBQeU9iamVjdF9HQ19OZXcoUHlMaXN0T2JqZWN0LCAmUHlMaXN0X1R5cGUpOworICAgICAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFNIT1dfQUxMT0NfQ09VTlQKLQkJY291bnRfYWxsb2MrKzsKKyAgICAgICAgY291bnRfYWxsb2MrKzsKICNlbmRpZgotCX0KLQlpZiAoc2l6ZSA8PSAwKQotCQlvcC0+b2JfaXRlbSA9IE5VTEw7Ci0JZWxzZSB7Ci0JCW9wLT5vYl9pdGVtID0gKFB5T2JqZWN0ICoqKSBQeU1lbV9NQUxMT0MobmJ5dGVzKTsKLQkJaWYgKG9wLT5vYl9pdGVtID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihvcCk7Ci0JCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJfQotCQltZW1zZXQob3AtPm9iX2l0ZW0sIDAsIG5ieXRlcyk7Ci0JfQotCVB5X1NJWkUob3ApID0gc2l6ZTsKLQlvcC0+YWxsb2NhdGVkID0gc2l6ZTsKLQlfUHlPYmplY3RfR0NfVFJBQ0sob3ApOwotCXJldHVybiAoUHlPYmplY3QgKikgb3A7CisgICAgfQorICAgIGlmIChzaXplIDw9IDApCisgICAgICAgIG9wLT5vYl9pdGVtID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgb3AtPm9iX2l0ZW0gPSAoUHlPYmplY3QgKiopIFB5TWVtX01BTExPQyhuYnl0ZXMpOworICAgICAgICBpZiAob3AtPm9iX2l0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG9wKTsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICB9CisgICAgICAgIG1lbXNldChvcC0+b2JfaXRlbSwgMCwgbmJ5dGVzKTsKKyAgICB9CisgICAgUHlfU0laRShvcCkgPSBzaXplOworICAgIG9wLT5hbGxvY2F0ZWQgPSBzaXplOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKIH0KIAogUHlfc3NpemVfdAogUHlMaXN0X1NpemUoUHlPYmplY3QgKm9wKQogewotCWlmICghUHlMaXN0X0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQllbHNlCi0JCXJldHVybiBQeV9TSVpFKG9wKTsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlfU0laRShvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqaW5kZXhlcnIgPSBOVUxMOwpAQCAtMTc4LDExNyArMTc4LDExNyBAQAogUHlPYmplY3QgKgogUHlMaXN0X0dldEl0ZW0oUHlPYmplY3QgKm9wLCBQeV9zc2l6ZV90IGkpCiB7Ci0JaWYgKCFQeUxpc3RfQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShvcCkpIHsKLQkJaWYgKGluZGV4ZXJyID09IE5VTEwpIHsKLQkJCWluZGV4ZXJyID0gUHlTdHJpbmdfRnJvbVN0cmluZygKLQkJCQkibGlzdCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJCWlmIChpbmRleGVyciA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5RXJyX1NldE9iamVjdChQeUV4Y19JbmRleEVycm9yLCBpbmRleGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeUxpc3RPYmplY3QgKilvcCkgLT4gb2JfaXRlbVtpXTsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKG9wKSkgeworICAgICAgICBpZiAoaW5kZXhlcnIgPT0gTlVMTCkgeworICAgICAgICAgICAgaW5kZXhlcnIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKAorICAgICAgICAgICAgICAgICJsaXN0IGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgaWYgKGluZGV4ZXJyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0luZGV4RXJyb3IsIGluZGV4ZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5TGlzdE9iamVjdCAqKW9wKSAtPiBvYl9pdGVtW2ldOwogfQogCiBpbnQKIFB5TGlzdF9TZXRJdGVtKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLAogICAgICAgICAgICAgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm5ld2l0ZW0pCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKm9sZGl0ZW07Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKipwOwotCWlmICghUHlMaXN0X0NoZWNrKG9wKSkgewotCQlQeV9YREVDUkVGKG5ld2l0ZW0pOwotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKG9wKSkgewotCQlQeV9YREVDUkVGKG5ld2l0ZW0pOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibGlzdCBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXAgPSAoKFB5TGlzdE9iamVjdCAqKW9wKSAtPiBvYl9pdGVtICsgaTsKLQlvbGRpdGVtID0gKnA7Ci0JKnAgPSBuZXdpdGVtOwotCVB5X1hERUNSRUYob2xkaXRlbSk7Ci0JcmV0dXJuIDA7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9sZGl0ZW07CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKipwOworICAgIGlmICghUHlMaXN0X0NoZWNrKG9wKSkgeworICAgICAgICBQeV9YREVDUkVGKG5ld2l0ZW0pOworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKG9wKSkgeworICAgICAgICBQeV9YREVDUkVGKG5ld2l0ZW0pOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcCA9ICgoUHlMaXN0T2JqZWN0ICopb3ApIC0+IG9iX2l0ZW0gKyBpOworICAgIG9sZGl0ZW0gPSAqcDsKKyAgICAqcCA9IG5ld2l0ZW07CisgICAgUHlfWERFQ1JFRihvbGRpdGVtKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogaW5zMShQeUxpc3RPYmplY3QgKnNlbGYsIFB5X3NzaXplX3Qgd2hlcmUsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgaSwgbiA9IFB5X1NJWkUoc2VsZik7Ci0JUHlPYmplY3QgKippdGVtczsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChuID09IFBZX1NTSVpFX1RfTUFYKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImNhbm5vdCBhZGQgbW9yZSBvYmplY3RzIHRvIGxpc3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBQeV9zc2l6ZV90IGksIG4gPSBQeV9TSVpFKHNlbGYpOworICAgIFB5T2JqZWN0ICoqaXRlbXM7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobiA9PSBQWV9TU0laRV9UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJjYW5ub3QgYWRkIG1vcmUgb2JqZWN0cyB0byBsaXN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAobGlzdF9yZXNpemUoc2VsZiwgbisxKSA9PSAtMSkKLQkJcmV0dXJuIC0xOworICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBuKzEpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAod2hlcmUgPCAwKSB7Ci0JCXdoZXJlICs9IG47Ci0JCWlmICh3aGVyZSA8IDApCi0JCQl3aGVyZSA9IDA7Ci0JfQotCWlmICh3aGVyZSA+IG4pCi0JCXdoZXJlID0gbjsKLQlpdGVtcyA9IHNlbGYtPm9iX2l0ZW07Ci0JZm9yIChpID0gbjsgLS1pID49IHdoZXJlOyApCi0JCWl0ZW1zW2krMV0gPSBpdGVtc1tpXTsKLQlQeV9JTkNSRUYodik7Ci0JaXRlbXNbd2hlcmVdID0gdjsKLQlyZXR1cm4gMDsKKyAgICBpZiAod2hlcmUgPCAwKSB7CisgICAgICAgIHdoZXJlICs9IG47CisgICAgICAgIGlmICh3aGVyZSA8IDApCisgICAgICAgICAgICB3aGVyZSA9IDA7CisgICAgfQorICAgIGlmICh3aGVyZSA+IG4pCisgICAgICAgIHdoZXJlID0gbjsKKyAgICBpdGVtcyA9IHNlbGYtPm9iX2l0ZW07CisgICAgZm9yIChpID0gbjsgLS1pID49IHdoZXJlOyApCisgICAgICAgIGl0ZW1zW2krMV0gPSBpdGVtc1tpXTsKKyAgICBQeV9JTkNSRUYodik7CisgICAgaXRlbXNbd2hlcmVdID0gdjsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeUxpc3RfSW5zZXJ0KFB5T2JqZWN0ICpvcCwgUHlfc3NpemVfdCB3aGVyZSwgUHlPYmplY3QgKm5ld2l0ZW0pCiB7Ci0JaWYgKCFQeUxpc3RfQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBpbnMxKChQeUxpc3RPYmplY3QgKilvcCwgd2hlcmUsIG5ld2l0ZW0pOworICAgIGlmICghUHlMaXN0X0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaW5zMSgoUHlMaXN0T2JqZWN0ICopb3AsIHdoZXJlLCBuZXdpdGVtKTsKIH0KIAogc3RhdGljIGludAogYXBwMShQeUxpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgbiA9IFB5TGlzdF9HRVRfU0laRShzZWxmKTsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeUxpc3RfR0VUX1NJWkUoc2VsZik7CiAKLQlhc3NlcnQgKHYgIT0gTlVMTCk7Ci0JaWYgKG4gPT0gUFlfU1NJWkVfVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkiY2Fubm90IGFkZCBtb3JlIG9iamVjdHMgdG8gbGlzdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGFzc2VydCAodiAhPSBOVUxMKTsKKyAgICBpZiAobiA9PSBQWV9TU0laRV9UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJjYW5ub3QgYWRkIG1vcmUgb2JqZWN0cyB0byBsaXN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAobGlzdF9yZXNpemUoc2VsZiwgbisxKSA9PSAtMSkKLQkJcmV0dXJuIC0xOworICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBuKzEpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9JTkNSRUYodik7Ci0JUHlMaXN0X1NFVF9JVEVNKHNlbGYsIG4sIHYpOwotCXJldHVybiAwOworICAgIFB5X0lOQ1JFRih2KTsKKyAgICBQeUxpc3RfU0VUX0lURU0oc2VsZiwgbiwgdik7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlMaXN0X0FwcGVuZChQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICpuZXdpdGVtKQogewotCWlmIChQeUxpc3RfQ2hlY2sob3ApICYmIChuZXdpdGVtICE9IE5VTEwpKQotCQlyZXR1cm4gYXBwMSgoUHlMaXN0T2JqZWN0ICopb3AsIG5ld2l0ZW0pOwotCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCXJldHVybiAtMTsKKyAgICBpZiAoUHlMaXN0X0NoZWNrKG9wKSAmJiAobmV3aXRlbSAhPSBOVUxMKSkKKyAgICAgICAgcmV0dXJuIGFwcDEoKFB5TGlzdE9iamVjdCAqKW9wLCBuZXdpdGVtKTsKKyAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIE1ldGhvZHMgKi8KQEAgLTI5NiwzMTIgKzI5NiwzMTIgQEAKIHN0YXRpYyB2b2lkCiBsaXN0X2RlYWxsb2MoUHlMaXN0T2JqZWN0ICpvcCkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhvcCk7Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihvcCkKLQlpZiAob3AtPm9iX2l0ZW0gIT0gTlVMTCkgewotCQkvKiBEbyBpdCBiYWNrd2FyZHMsIGZvciBDaHJpc3RpYW4gVGlzbWVyLgotCQkgICBUaGVyZSdzIGEgc2ltcGxlIHRlc3QgY2FzZSB3aGVyZSBzb21laG93IHRoaXMgcmVkdWNlcwotCQkgICB0aHJhc2hpbmcgd2hlbiBhICp2ZXJ5KiBsYXJnZSBsaXN0IGlzIGNyZWF0ZWQgYW5kCi0JCSAgIGltbWVkaWF0ZWx5IGRlbGV0ZWQuICovCi0JCWkgPSBQeV9TSVpFKG9wKTsKLQkJd2hpbGUgKC0taSA+PSAwKSB7Ci0JCQlQeV9YREVDUkVGKG9wLT5vYl9pdGVtW2ldKTsKLQkJfQotCQlQeU1lbV9GUkVFKG9wLT5vYl9pdGVtKTsKLQl9Ci0JaWYgKG51bWZyZWUgPCBQeUxpc3RfTUFYRlJFRUxJU1QgJiYgUHlMaXN0X0NoZWNrRXhhY3Qob3ApKQotCQlmcmVlX2xpc3RbbnVtZnJlZSsrXSA9IG9wOwotCWVsc2UKLQkJUHlfVFlQRShvcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopb3ApOwotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKG9wKQorICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKG9wKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG9wKQorICAgIGlmIChvcC0+b2JfaXRlbSAhPSBOVUxMKSB7CisgICAgICAgIC8qIERvIGl0IGJhY2t3YXJkcywgZm9yIENocmlzdGlhbiBUaXNtZXIuCisgICAgICAgICAgIFRoZXJlJ3MgYSBzaW1wbGUgdGVzdCBjYXNlIHdoZXJlIHNvbWVob3cgdGhpcyByZWR1Y2VzCisgICAgICAgICAgIHRocmFzaGluZyB3aGVuIGEgKnZlcnkqIGxhcmdlIGxpc3QgaXMgY3JlYXRlZCBhbmQKKyAgICAgICAgICAgaW1tZWRpYXRlbHkgZGVsZXRlZC4gKi8KKyAgICAgICAgaSA9IFB5X1NJWkUob3ApOworICAgICAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYob3AtPm9iX2l0ZW1baV0pOworICAgICAgICB9CisgICAgICAgIFB5TWVtX0ZSRUUob3AtPm9iX2l0ZW0pOworICAgIH0KKyAgICBpZiAobnVtZnJlZSA8IFB5TGlzdF9NQVhGUkVFTElTVCAmJiBQeUxpc3RfQ2hlY2tFeGFjdChvcCkpCisgICAgICAgIGZyZWVfbGlzdFtudW1mcmVlKytdID0gb3A7CisgICAgZWxzZQorICAgICAgICBQeV9UWVBFKG9wKS0+dHBfZnJlZSgoUHlPYmplY3QgKilvcCk7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQob3ApCiB9CiAKIHN0YXRpYyBpbnQKIGxpc3RfcHJpbnQoUHlMaXN0T2JqZWN0ICpvcCwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQlpbnQgcmM7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICppdGVtOworICAgIGludCByYzsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKml0ZW07CiAKLQlyYyA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKW9wKTsKLQlpZiAocmMgIT0gMCkgewotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWZwcmludGYoZnAsICJbLi4uXSIpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICJbIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShvcCk7IGkrKykgewotCQlpdGVtID0gb3AtPm9iX2l0ZW1baV07Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQlmcHJpbnRmKGZwLCAiLCAiKTsKLQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCX0KLQkJaWYgKFB5T2JqZWN0X1ByaW50KGl0ZW0sIGZwLCAwKSAhPSAwKSB7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopb3ApOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICJdIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopb3ApOwotCXJldHVybiAwOworICAgIHJjID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopb3ApOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZnByaW50ZihmcCwgIlsuLi5dIik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnByaW50ZihmcCwgIlsiKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKG9wKTsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBvcC0+b2JfaXRlbVtpXTsKKyAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGZwcmludGYoZnAsICIsICIpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlPYmplY3RfUHJpbnQoaXRlbSwgZnAsIDApICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QgKilvcCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnByaW50ZihmcCwgIl0iKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QgKilvcCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X3JlcHIoUHlMaXN0T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqcywgKnRlbXA7Ci0JUHlPYmplY3QgKnBpZWNlcyA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcywgKnRlbXA7CisgICAgUHlPYmplY3QgKnBpZWNlcyA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOwogCi0JaSA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKXYpOwotCWlmIChpICE9IDApIHsKLQkJcmV0dXJuIGkgPiAwID8gUHlTdHJpbmdfRnJvbVN0cmluZygiWy4uLl0iKSA6IE5VTEw7Ci0JfQorICAgIGkgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0Kil2KTsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIHJldHVybiBpID4gMCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoIlsuLi5dIikgOiBOVUxMOworICAgIH0KIAotCWlmIChQeV9TSVpFKHYpID09IDApIHsKLQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiW10iKTsKLQkJZ290byBEb25lOwotCX0KKyAgICBpZiAoUHlfU0laRSh2KSA9PSAwKSB7CisgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIltdIik7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CiAKLQlwaWVjZXMgPSBQeUxpc3RfTmV3KDApOwotCWlmIChwaWVjZXMgPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIHBpZWNlcyA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHBpZWNlcyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQkvKiBEbyByZXByKCkgb24gZWFjaCBlbGVtZW50LiAgTm90ZSB0aGF0IHRoaXMgbWF5IG11dGF0ZSB0aGUgbGlzdCwKLQkgICBzbyBtdXN0IHJlZmV0Y2ggdGhlIGxpc3Qgc2l6ZSBvbiBlYWNoIGl0ZXJhdGlvbi4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh2KTsgKytpKSB7Ci0JCWludCBzdGF0dXM7Ci0JCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBnZXR0aW5nIHRoZSByZXByIG9mIGEgbGlzdCIpKQotCQkJZ290byBEb25lOwotCQlzID0gUHlPYmplY3RfUmVwcih2LT5vYl9pdGVtW2ldKTsKLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlnb3RvIERvbmU7Ci0JCXN0YXR1cyA9IFB5TGlzdF9BcHBlbmQocGllY2VzLCBzKTsKLQkJUHlfREVDUkVGKHMpOyAgLyogYXBwZW5kIGNyZWF0ZWQgYSBuZXcgcmVmICovCi0JCWlmIChzdGF0dXMgPCAwKQotCQkJZ290byBEb25lOwotCX0KKyAgICAvKiBEbyByZXByKCkgb24gZWFjaCBlbGVtZW50LiAgTm90ZSB0aGF0IHRoaXMgbWF5IG11dGF0ZSB0aGUgbGlzdCwKKyAgICAgICBzbyBtdXN0IHJlZmV0Y2ggdGhlIGxpc3Qgc2l6ZSBvbiBlYWNoIGl0ZXJhdGlvbi4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh2KTsgKytpKSB7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBnZXR0aW5nIHRoZSByZXByIG9mIGEgbGlzdCIpKQorICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICBzID0gUHlPYmplY3RfUmVwcih2LT5vYl9pdGVtW2ldKTsKKyAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIHN0YXR1cyA9IFB5TGlzdF9BcHBlbmQocGllY2VzLCBzKTsKKyAgICAgICAgUHlfREVDUkVGKHMpOyAgLyogYXBwZW5kIGNyZWF0ZWQgYSBuZXcgcmVmICovCisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgZ290byBEb25lOworICAgIH0KIAotCS8qIEFkZCAiW10iIGRlY29yYXRpb25zIHRvIHRoZSBmaXJzdCBhbmQgbGFzdCBpdGVtcy4gKi8KLQlhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgPiAwKTsKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiWyIpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl0ZW1wID0gUHlMaXN0X0dFVF9JVEVNKHBpZWNlcywgMCk7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCB0ZW1wKTsKLQlQeUxpc3RfU0VUX0lURU0ocGllY2VzLCAwLCBzKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgLyogQWRkICJbXSIgZGVjb3JhdGlvbnMgdG8gdGhlIGZpcnN0IGFuZCBsYXN0IGl0ZW1zLiAqLworICAgIGFzc2VydChQeUxpc3RfR0VUX1NJWkUocGllY2VzKSA+IDApOworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJbIik7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHRlbXAgPSBQeUxpc3RfR0VUX0lURU0ocGllY2VzLCAwKTsKKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIHRlbXApOworICAgIFB5TGlzdF9TRVRfSVRFTShwaWVjZXMsIDAsIHMpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKIAotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJdIik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXRlbXAgPSBQeUxpc3RfR0VUX0lURU0ocGllY2VzLCBQeUxpc3RfR0VUX1NJWkUocGllY2VzKSAtIDEpOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmdGVtcCwgcyk7Ci0JUHlMaXN0X1NFVF9JVEVNKHBpZWNlcywgUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgLSAxLCB0ZW1wKTsKLQlpZiAodGVtcCA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIl0iKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgdGVtcCA9IFB5TGlzdF9HRVRfSVRFTShwaWVjZXMsIFB5TGlzdF9HRVRfU0laRShwaWVjZXMpIC0gMSk7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZ0ZW1wLCBzKTsKKyAgICBQeUxpc3RfU0VUX0lURU0ocGllY2VzLCBQeUxpc3RfR0VUX1NJWkUocGllY2VzKSAtIDEsIHRlbXApOworICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKIAotCS8qIFBhc3RlIHRoZW0gYWxsIHRvZ2V0aGVyIHdpdGggIiwgIiBiZXR3ZWVuLiAqLwotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIsICIpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlyZXN1bHQgPSBfUHlTdHJpbmdfSm9pbihzLCBwaWVjZXMpOwotCVB5X0RFQ1JFRihzKTsKKyAgICAvKiBQYXN0ZSB0aGVtIGFsbCB0b2dldGhlciB3aXRoICIsICIgYmV0d2Vlbi4gKi8KKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLCAiKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgcmVzdWx0ID0gX1B5U3RyaW5nX0pvaW4ocywgcGllY2VzKTsKKyAgICBQeV9ERUNSRUYocyk7CiAKIERvbmU6Ci0JUHlfWERFQ1JFRihwaWVjZXMpOwotCVB5X1JlcHJMZWF2ZSgoUHlPYmplY3QgKil2KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYocGllY2VzKTsKKyAgICBQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopdik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGxpc3RfbGVuZ3RoKFB5TGlzdE9iamVjdCAqYSkKIHsKLQlyZXR1cm4gUHlfU0laRShhKTsKKyAgICByZXR1cm4gUHlfU0laRShhKTsKIH0KIAogc3RhdGljIGludAogbGlzdF9jb250YWlucyhQeUxpc3RPYmplY3QgKmEsIFB5T2JqZWN0ICplbCkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IGNtcDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IGNtcDsKIAotCWZvciAoaSA9IDAsIGNtcCA9IDAgOyBjbXAgPT0gMCAmJiBpIDwgUHlfU0laRShhKTsgKytpKQotCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZWwsIFB5TGlzdF9HRVRfSVRFTShhLCBpKSwKLQkJCQkJCSAgIFB5X0VRKTsKLQlyZXR1cm4gY21wOworICAgIGZvciAoaSA9IDAsIGNtcCA9IDAgOyBjbXAgPT0gMCAmJiBpIDwgUHlfU0laRShhKTsgKytpKQorICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZWwsIFB5TGlzdF9HRVRfSVRFTShhLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9FUSk7CisgICAgcmV0dXJuIGNtcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfaXRlbShQeUxpc3RPYmplY3QgKmEsIFB5X3NzaXplX3QgaSkKIHsKLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7Ci0JCWlmIChpbmRleGVyciA9PSBOVUxMKSB7Ci0JCQlpbmRleGVyciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoCi0JCQkJImxpc3QgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCQlpZiAoaW5kZXhlcnIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfSW5kZXhFcnJvciwgaW5kZXhlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGEtPm9iX2l0ZW1baV0pOwotCXJldHVybiBhLT5vYl9pdGVtW2ldOworICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKKyAgICAgICAgaWYgKGluZGV4ZXJyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGluZGV4ZXJyID0gUHlTdHJpbmdfRnJvbVN0cmluZygKKyAgICAgICAgICAgICAgICAibGlzdCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIGlmIChpbmRleGVyciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19JbmRleEVycm9yLCBpbmRleGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoYS0+b2JfaXRlbVtpXSk7CisgICAgcmV0dXJuIGEtPm9iX2l0ZW1baV07CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X3NsaWNlKFB5TGlzdE9iamVjdCAqYSwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoKQogewotCVB5TGlzdE9iamVjdCAqbnA7Ci0JUHlPYmplY3QgKipzcmMsICoqZGVzdDsKLQlQeV9zc2l6ZV90IGksIGxlbjsKLQlpZiAoaWxvdyA8IDApCi0JCWlsb3cgPSAwOwotCWVsc2UgaWYgKGlsb3cgPiBQeV9TSVpFKGEpKQotCQlpbG93ID0gUHlfU0laRShhKTsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JZWxzZSBpZiAoaWhpZ2ggPiBQeV9TSVpFKGEpKQotCQlpaGlnaCA9IFB5X1NJWkUoYSk7Ci0JbGVuID0gaWhpZ2ggLSBpbG93OwotCW5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KGxlbik7Ci0JaWYgKG5wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIFB5TGlzdE9iamVjdCAqbnA7CisgICAgUHlPYmplY3QgKipzcmMsICoqZGVzdDsKKyAgICBQeV9zc2l6ZV90IGksIGxlbjsKKyAgICBpZiAoaWxvdyA8IDApCisgICAgICAgIGlsb3cgPSAwOworICAgIGVsc2UgaWYgKGlsb3cgPiBQeV9TSVpFKGEpKQorICAgICAgICBpbG93ID0gUHlfU0laRShhKTsKKyAgICBpZiAoaWhpZ2ggPCBpbG93KQorICAgICAgICBpaGlnaCA9IGlsb3c7CisgICAgZWxzZSBpZiAoaWhpZ2ggPiBQeV9TSVpFKGEpKQorICAgICAgICBpaGlnaCA9IFB5X1NJWkUoYSk7CisgICAgbGVuID0gaWhpZ2ggLSBpbG93OworICAgIG5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KGxlbik7CisgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3JjID0gYS0+b2JfaXRlbSArIGlsb3c7Ci0JZGVzdCA9IG5wLT5vYl9pdGVtOwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqdiA9IHNyY1tpXTsKLQkJUHlfSU5DUkVGKHYpOwotCQlkZXN0W2ldID0gdjsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5wOworICAgIHNyYyA9IGEtPm9iX2l0ZW0gKyBpbG93OworICAgIGRlc3QgPSBucC0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBzcmNbaV07CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgZGVzdFtpXSA9IHY7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilucDsKIH0KIAogUHlPYmplY3QgKgogUHlMaXN0X0dldFNsaWNlKFB5T2JqZWN0ICphLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gpCiB7Ci0JaWYgKCFQeUxpc3RfQ2hlY2soYSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbGlzdF9zbGljZSgoUHlMaXN0T2JqZWN0ICopYSwgaWxvdywgaWhpZ2gpOworICAgIGlmICghUHlMaXN0X0NoZWNrKGEpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Rfc2xpY2UoKFB5TGlzdE9iamVjdCAqKWEsIGlsb3csIGloaWdoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfY29uY2F0KFB5TGlzdE9iamVjdCAqYSwgUHlPYmplY3QgKmJiKQogewotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKipzcmMsICoqZGVzdDsKLQlQeUxpc3RPYmplY3QgKm5wOwotCWlmICghUHlMaXN0X0NoZWNrKGJiKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAiY2FuIG9ubHkgY29uY2F0ZW5hdGUgbGlzdCAobm90IFwiJS4yMDBzXCIpIHRvIGxpc3QiLAotCQkJICBiYi0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7CisgICAgUHlMaXN0T2JqZWN0ICpucDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhiYikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICJjYW4gb25seSBjb25jYXRlbmF0ZSBsaXN0IChub3QgXCIlLjIwMHNcIikgdG8gbGlzdCIsCisgICAgICAgICAgICAgICAgICBiYi0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNkZWZpbmUgYiAoKFB5TGlzdE9iamVjdCAqKWJiKQotCXNpemUgPSBQeV9TSVpFKGEpICsgUHlfU0laRShiKTsKLQlpZiAoc2l6ZSA8IDApCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCW5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KHNpemUpOwotCWlmIChucCA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzcmMgPSBhLT5vYl9pdGVtOwotCWRlc3QgPSBucC0+b2JfaXRlbTsKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShhKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gc3JjW2ldOwotCQlQeV9JTkNSRUYodik7Ci0JCWRlc3RbaV0gPSB2OwotCX0KLQlzcmMgPSBiLT5vYl9pdGVtOwotCWRlc3QgPSBucC0+b2JfaXRlbSArIFB5X1NJWkUoYSk7Ci0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoYik7IGkrKykgewotCQlQeU9iamVjdCAqdiA9IHNyY1tpXTsKLQkJUHlfSU5DUkVGKHYpOwotCQlkZXN0W2ldID0gdjsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5wOworICAgIHNpemUgPSBQeV9TSVpFKGEpICsgUHlfU0laRShiKTsKKyAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIG5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KHNpemUpOworICAgIGlmIChucCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzcmMgPSBhLT5vYl9pdGVtOworICAgIGRlc3QgPSBucC0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShhKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gc3JjW2ldOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIGRlc3RbaV0gPSB2OworICAgIH0KKyAgICBzcmMgPSBiLT5vYl9pdGVtOworICAgIGRlc3QgPSBucC0+b2JfaXRlbSArIFB5X1NJWkUoYSk7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoYik7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdiA9IHNyY1tpXTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBkZXN0W2ldID0gdjsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5wOwogI3VuZGVmIGIKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfcmVwZWF0KFB5TGlzdE9iamVjdCAqYSwgUHlfc3NpemVfdCBuKQogewotCVB5X3NzaXplX3QgaSwgajsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JUHlMaXN0T2JqZWN0ICpucDsKLQlQeU9iamVjdCAqKnAsICoqaXRlbXM7Ci0JUHlPYmplY3QgKmVsZW07Ci0JaWYgKG4gPCAwKQotCQluID0gMDsKLQlzaXplID0gUHlfU0laRShhKSAqIG47Ci0JaWYgKG4gJiYgc2l6ZS9uICE9IFB5X1NJWkUoYSkpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmIChzaXplID09IDApCi0JCXJldHVybiBQeUxpc3RfTmV3KDApOwotCW5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KHNpemUpOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIFB5TGlzdE9iamVjdCAqbnA7CisgICAgUHlPYmplY3QgKipwLCAqKml0ZW1zOworICAgIFB5T2JqZWN0ICplbGVtOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgbiA9IDA7CisgICAgc2l6ZSA9IFB5X1NJWkUoYSkgKiBuOworICAgIGlmIChuICYmIHNpemUvbiAhPSBQeV9TSVpFKGEpKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gUHlMaXN0X05ldygwKTsKKyAgICBucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhzaXplKTsKKyAgICBpZiAobnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpdGVtcyA9IG5wLT5vYl9pdGVtOwotCWlmIChQeV9TSVpFKGEpID09IDEpIHsKLQkJZWxlbSA9IGEtPm9iX2l0ZW1bMF07Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWl0ZW1zW2ldID0gZWxlbTsKLQkJCVB5X0lOQ1JFRihlbGVtKTsKLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopIG5wOwotCX0KLQlwID0gbnAtPm9iX2l0ZW07Ci0JaXRlbXMgPSBhLT5vYl9pdGVtOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IFB5X1NJWkUoYSk7IGorKykgewotCQkJKnAgPSBpdGVtc1tqXTsKLQkJCVB5X0lOQ1JFRigqcCk7Ci0JCQlwKys7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBucDsKKyAgICBpdGVtcyA9IG5wLT5vYl9pdGVtOworICAgIGlmIChQeV9TSVpFKGEpID09IDEpIHsKKyAgICAgICAgZWxlbSA9IGEtPm9iX2l0ZW1bMF07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGl0ZW1zW2ldID0gZWxlbTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIG5wOworICAgIH0KKyAgICBwID0gbnAtPm9iX2l0ZW07CisgICAgaXRlbXMgPSBhLT5vYl9pdGVtOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFB5X1NJWkUoYSk7IGorKykgeworICAgICAgICAgICAgKnAgPSBpdGVtc1tqXTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRigqcCk7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBucDsKIH0KIAogc3RhdGljIGludAogbGlzdF9jbGVhcihQeUxpc3RPYmplY3QgKmEpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICoqaXRlbSA9IGEtPm9iX2l0ZW07Ci0JaWYgKGl0ZW0gIT0gTlVMTCkgewotCQkvKiBCZWNhdXNlIFhERUNSRUYgY2FuIHJlY3Vyc2l2ZWx5IGludm9rZSBvcGVyYXRpb25zIG9uCi0JCSAgIHRoaXMgbGlzdCwgd2UgbWFrZSBpdCBlbXB0eSBmaXJzdC4gKi8KLQkJaSA9IFB5X1NJWkUoYSk7Ci0JCVB5X1NJWkUoYSkgPSAwOwotCQlhLT5vYl9pdGVtID0gTlVMTDsKLQkJYS0+YWxsb2NhdGVkID0gMDsKLQkJd2hpbGUgKC0taSA+PSAwKSB7Ci0JCQlQeV9YREVDUkVGKGl0ZW1baV0pOwotCQl9Ci0JCVB5TWVtX0ZSRUUoaXRlbSk7Ci0JfQotCS8qIE5ldmVyIGZhaWxzOyB0aGUgcmV0dXJuIHZhbHVlIGNhbiBiZSBpZ25vcmVkLgotCSAgIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgbGlzdCBpcyBhY3R1YWxseSBlbXB0eQotCSAgIGF0IHRoaXMgcG9pbnQsIGJlY2F1c2UgWERFQ1JFRiBtYXkgaGF2ZSBwb3B1bGF0ZWQgaXQgYWdhaW4hICovCi0JcmV0dXJuIDA7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICoqaXRlbSA9IGEtPm9iX2l0ZW07CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgeworICAgICAgICAvKiBCZWNhdXNlIFhERUNSRUYgY2FuIHJlY3Vyc2l2ZWx5IGludm9rZSBvcGVyYXRpb25zIG9uCisgICAgICAgICAgIHRoaXMgbGlzdCwgd2UgbWFrZSBpdCBlbXB0eSBmaXJzdC4gKi8KKyAgICAgICAgaSA9IFB5X1NJWkUoYSk7CisgICAgICAgIFB5X1NJWkUoYSkgPSAwOworICAgICAgICBhLT5vYl9pdGVtID0gTlVMTDsKKyAgICAgICAgYS0+YWxsb2NhdGVkID0gMDsKKyAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKGl0ZW1baV0pOworICAgICAgICB9CisgICAgICAgIFB5TWVtX0ZSRUUoaXRlbSk7CisgICAgfQorICAgIC8qIE5ldmVyIGZhaWxzOyB0aGUgcmV0dXJuIHZhbHVlIGNhbiBiZSBpZ25vcmVkLgorICAgICAgIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgbGlzdCBpcyBhY3R1YWxseSBlbXB0eQorICAgICAgIGF0IHRoaXMgcG9pbnQsIGJlY2F1c2UgWERFQ1JFRiBtYXkgaGF2ZSBwb3B1bGF0ZWQgaXQgYWdhaW4hICovCisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIGFbaWxvdzppaGlnaF0gPSB2IGlmIHYgIT0gTlVMTC4KQEAgLTYxMywzNjggKzYxMywzNjggQEAKIHN0YXRpYyBpbnQKIGxpc3RfYXNzX3NsaWNlKFB5TGlzdE9iamVjdCAqYSwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoLCBQeU9iamVjdCAqdikKIHsKLQkvKiBCZWNhdXNlIFtYXURFQ1JFRiBjYW4gcmVjdXJzaXZlbHkgaW52b2tlIGxpc3Qgb3BlcmF0aW9ucyBvbgotCSAgIHRoaXMgbGlzdCwgd2UgbXVzdCBwb3N0cG9uZSBhbGwgW1hdREVDUkVGIGFjdGl2aXR5IHVudGlsCi0JICAgYWZ0ZXIgdGhlIGxpc3QgaXMgYmFjayBpbiBpdHMgY2Fub25pY2FsIHNoYXBlLiAgVGhlcmVmb3JlCi0JICAgd2UgbXVzdCBhbGxvY2F0ZSBhbiBhZGRpdGlvbmFsIGFycmF5LCAncmVjeWNsZScsIGludG8gd2hpY2gKLQkgICB3ZSB0ZW1wb3JhcmlseSBjb3B5IHRoZSBpdGVtcyB0aGF0IGFyZSBkZWxldGVkIGZyb20gdGhlCi0JICAgbGlzdC4gOi0oICovCi0JUHlPYmplY3QgKnJlY3ljbGVfb25fc3RhY2tbOF07Ci0JUHlPYmplY3QgKipyZWN5Y2xlID0gcmVjeWNsZV9vbl9zdGFjazsgLyogd2lsbCBhbGxvY2F0ZSBtb3JlIGlmIG5lZWRlZCAqLwotCVB5T2JqZWN0ICoqaXRlbTsKLQlQeU9iamVjdCAqKnZpdGVtID0gTlVMTDsKLQlQeU9iamVjdCAqdl9hc19TRiA9IE5VTEw7IC8qIFB5U2VxdWVuY2VfRmFzdCh2KSAqLwotCVB5X3NzaXplX3QgbjsgLyogIyBvZiBlbGVtZW50cyBpbiByZXBsYWNlbWVudCBsaXN0ICovCi0JUHlfc3NpemVfdCBub3JpZzsgLyogIyBvZiBlbGVtZW50cyBpbiBsaXN0IGdldHRpbmcgcmVwbGFjZWQgKi8KLQlQeV9zc2l6ZV90IGQ7IC8qIENoYW5nZSBpbiBzaXplICovCi0JUHlfc3NpemVfdCBrOwotCXNpemVfdCBzOwotCWludCByZXN1bHQgPSAtMTsJLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLworICAgIC8qIEJlY2F1c2UgW1hdREVDUkVGIGNhbiByZWN1cnNpdmVseSBpbnZva2UgbGlzdCBvcGVyYXRpb25zIG9uCisgICAgICAgdGhpcyBsaXN0LCB3ZSBtdXN0IHBvc3Rwb25lIGFsbCBbWF1ERUNSRUYgYWN0aXZpdHkgdW50aWwKKyAgICAgICBhZnRlciB0aGUgbGlzdCBpcyBiYWNrIGluIGl0cyBjYW5vbmljYWwgc2hhcGUuICBUaGVyZWZvcmUKKyAgICAgICB3ZSBtdXN0IGFsbG9jYXRlIGFuIGFkZGl0aW9uYWwgYXJyYXksICdyZWN5Y2xlJywgaW50byB3aGljaAorICAgICAgIHdlIHRlbXBvcmFyaWx5IGNvcHkgdGhlIGl0ZW1zIHRoYXQgYXJlIGRlbGV0ZWQgZnJvbSB0aGUKKyAgICAgICBsaXN0LiA6LSggKi8KKyAgICBQeU9iamVjdCAqcmVjeWNsZV9vbl9zdGFja1s4XTsKKyAgICBQeU9iamVjdCAqKnJlY3ljbGUgPSByZWN5Y2xlX29uX3N0YWNrOyAvKiB3aWxsIGFsbG9jYXRlIG1vcmUgaWYgbmVlZGVkICovCisgICAgUHlPYmplY3QgKippdGVtOworICAgIFB5T2JqZWN0ICoqdml0ZW0gPSBOVUxMOworICAgIFB5T2JqZWN0ICp2X2FzX1NGID0gTlVMTDsgLyogUHlTZXF1ZW5jZV9GYXN0KHYpICovCisgICAgUHlfc3NpemVfdCBuOyAvKiAjIG9mIGVsZW1lbnRzIGluIHJlcGxhY2VtZW50IGxpc3QgKi8KKyAgICBQeV9zc2l6ZV90IG5vcmlnOyAvKiAjIG9mIGVsZW1lbnRzIGluIGxpc3QgZ2V0dGluZyByZXBsYWNlZCAqLworICAgIFB5X3NzaXplX3QgZDsgLyogQ2hhbmdlIGluIHNpemUgKi8KKyAgICBQeV9zc2l6ZV90IGs7CisgICAgc2l6ZV90IHM7CisgICAgaW50IHJlc3VsdCA9IC0xOyAgICAgICAgICAgIC8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KICNkZWZpbmUgYiAoKFB5TGlzdE9iamVjdCAqKXYpCi0JaWYgKHYgPT0gTlVMTCkKLQkJbiA9IDA7Ci0JZWxzZSB7Ci0JCWlmIChhID09IGIpIHsKLQkJCS8qIFNwZWNpYWwgY2FzZSAiYVtpOmpdID0gYSIgLS0gY29weSBiIGZpcnN0ICovCi0JCQl2ID0gbGlzdF9zbGljZShiLCAwLCBQeV9TSVpFKGIpKTsKLQkJCWlmICh2ID09IE5VTEwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCXJlc3VsdCA9IGxpc3RfYXNzX3NsaWNlKGEsIGlsb3csIGloaWdoLCB2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJdl9hc19TRiA9IFB5U2VxdWVuY2VfRmFzdCh2LCAiY2FuIG9ubHkgYXNzaWduIGFuIGl0ZXJhYmxlIik7Ci0JCWlmKHZfYXNfU0YgPT0gTlVMTCkKLQkJCWdvdG8gRXJyb3I7Ci0JCW4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUodl9hc19TRik7Ci0JCXZpdGVtID0gUHlTZXF1ZW5jZV9GYXN0X0lURU1TKHZfYXNfU0YpOwotCX0KLQlpZiAoaWxvdyA8IDApCi0JCWlsb3cgPSAwOwotCWVsc2UgaWYgKGlsb3cgPiBQeV9TSVpFKGEpKQotCQlpbG93ID0gUHlfU0laRShhKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBuID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGEgPT0gYikgeworICAgICAgICAgICAgLyogU3BlY2lhbCBjYXNlICJhW2k6al0gPSBhIiAtLSBjb3B5IGIgZmlyc3QgKi8KKyAgICAgICAgICAgIHYgPSBsaXN0X3NsaWNlKGIsIDAsIFB5X1NJWkUoYikpOworICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gbGlzdF9hc3Nfc2xpY2UoYSwgaWxvdywgaWhpZ2gsIHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB2X2FzX1NGID0gUHlTZXF1ZW5jZV9GYXN0KHYsICJjYW4gb25seSBhc3NpZ24gYW4gaXRlcmFibGUiKTsKKyAgICAgICAgaWYodl9hc19TRiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgbiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRSh2X2FzX1NGKTsKKyAgICAgICAgdml0ZW0gPSBQeVNlcXVlbmNlX0Zhc3RfSVRFTVModl9hc19TRik7CisgICAgfQorICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgZWxzZSBpZiAoaWxvdyA+IFB5X1NJWkUoYSkpCisgICAgICAgIGlsb3cgPSBQeV9TSVpFKGEpOwogCi0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWVsc2UgaWYgKGloaWdoID4gUHlfU0laRShhKSkKLQkJaWhpZ2ggPSBQeV9TSVpFKGEpOworICAgIGlmIChpaGlnaCA8IGlsb3cpCisgICAgICAgIGloaWdoID0gaWxvdzsKKyAgICBlbHNlIGlmIChpaGlnaCA+IFB5X1NJWkUoYSkpCisgICAgICAgIGloaWdoID0gUHlfU0laRShhKTsKIAotCW5vcmlnID0gaWhpZ2ggLSBpbG93OwotCWFzc2VydChub3JpZyA+PSAwKTsKLQlkID0gbiAtIG5vcmlnOwotCWlmIChQeV9TSVpFKGEpICsgZCA9PSAwKSB7Ci0JCVB5X1hERUNSRUYodl9hc19TRik7Ci0JCXJldHVybiBsaXN0X2NsZWFyKGEpOwotCX0KLQlpdGVtID0gYS0+b2JfaXRlbTsKLQkvKiByZWN5Y2xlIHRoZSBpdGVtcyB0aGF0IHdlIGFyZSBhYm91dCB0byByZW1vdmUgKi8KLQlzID0gbm9yaWcgKiBzaXplb2YoUHlPYmplY3QgKik7Ci0JaWYgKHMgPiBzaXplb2YocmVjeWNsZV9vbl9zdGFjaykpIHsKLQkJcmVjeWNsZSA9IChQeU9iamVjdCAqKilQeU1lbV9NQUxMT0Mocyk7Ci0JCWlmIChyZWN5Y2xlID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlnb3RvIEVycm9yOwotCQl9Ci0JfQotCW1lbWNweShyZWN5Y2xlLCAmaXRlbVtpbG93XSwgcyk7CisgICAgbm9yaWcgPSBpaGlnaCAtIGlsb3c7CisgICAgYXNzZXJ0KG5vcmlnID49IDApOworICAgIGQgPSBuIC0gbm9yaWc7CisgICAgaWYgKFB5X1NJWkUoYSkgKyBkID09IDApIHsKKyAgICAgICAgUHlfWERFQ1JFRih2X2FzX1NGKTsKKyAgICAgICAgcmV0dXJuIGxpc3RfY2xlYXIoYSk7CisgICAgfQorICAgIGl0ZW0gPSBhLT5vYl9pdGVtOworICAgIC8qIHJlY3ljbGUgdGhlIGl0ZW1zIHRoYXQgd2UgYXJlIGFib3V0IHRvIHJlbW92ZSAqLworICAgIHMgPSBub3JpZyAqIHNpemVvZihQeU9iamVjdCAqKTsKKyAgICBpZiAocyA+IHNpemVvZihyZWN5Y2xlX29uX3N0YWNrKSkgeworICAgICAgICByZWN5Y2xlID0gKFB5T2JqZWN0ICoqKVB5TWVtX01BTExPQyhzKTsKKyAgICAgICAgaWYgKHJlY3ljbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVtY3B5KHJlY3ljbGUsICZpdGVtW2lsb3ddLCBzKTsKIAotCWlmIChkIDwgMCkgeyAvKiBEZWxldGUgLWQgaXRlbXMgKi8KLQkJbWVtbW92ZSgmaXRlbVtpaGlnaCtkXSwgJml0ZW1baWhpZ2hdLAotCQkJKFB5X1NJWkUoYSkgLSBpaGlnaCkqc2l6ZW9mKFB5T2JqZWN0ICopKTsKLQkJbGlzdF9yZXNpemUoYSwgUHlfU0laRShhKSArIGQpOwotCQlpdGVtID0gYS0+b2JfaXRlbTsKLQl9Ci0JZWxzZSBpZiAoZCA+IDApIHsgLyogSW5zZXJ0IGQgaXRlbXMgKi8KLQkJayA9IFB5X1NJWkUoYSk7Ci0JCWlmIChsaXN0X3Jlc2l6ZShhLCBrK2QpIDwgMCkKLQkJCWdvdG8gRXJyb3I7Ci0JCWl0ZW0gPSBhLT5vYl9pdGVtOwotCQltZW1tb3ZlKCZpdGVtW2loaWdoK2RdLCAmaXRlbVtpaGlnaF0sCi0JCQkoayAtIGloaWdoKSpzaXplb2YoUHlPYmplY3QgKikpOwotCX0KLQlmb3IgKGsgPSAwOyBrIDwgbjsgaysrLCBpbG93KyspIHsKLQkJUHlPYmplY3QgKncgPSB2aXRlbVtrXTsKLQkJUHlfWElOQ1JFRih3KTsKLQkJaXRlbVtpbG93XSA9IHc7Ci0JfQotCWZvciAoayA9IG5vcmlnIC0gMTsgayA+PSAwOyAtLWspCi0JCVB5X1hERUNSRUYocmVjeWNsZVtrXSk7Ci0JcmVzdWx0ID0gMDsKKyAgICBpZiAoZCA8IDApIHsgLyogRGVsZXRlIC1kIGl0ZW1zICovCisgICAgICAgIG1lbW1vdmUoJml0ZW1baWhpZ2grZF0sICZpdGVtW2loaWdoXSwKKyAgICAgICAgICAgIChQeV9TSVpFKGEpIC0gaWhpZ2gpKnNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgIGxpc3RfcmVzaXplKGEsIFB5X1NJWkUoYSkgKyBkKTsKKyAgICAgICAgaXRlbSA9IGEtPm9iX2l0ZW07CisgICAgfQorICAgIGVsc2UgaWYgKGQgPiAwKSB7IC8qIEluc2VydCBkIGl0ZW1zICovCisgICAgICAgIGsgPSBQeV9TSVpFKGEpOworICAgICAgICBpZiAobGlzdF9yZXNpemUoYSwgaytkKSA8IDApCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICBpdGVtID0gYS0+b2JfaXRlbTsKKyAgICAgICAgbWVtbW92ZSgmaXRlbVtpaGlnaCtkXSwgJml0ZW1baWhpZ2hdLAorICAgICAgICAgICAgKGsgLSBpaGlnaCkqc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICB9CisgICAgZm9yIChrID0gMDsgayA8IG47IGsrKywgaWxvdysrKSB7CisgICAgICAgIFB5T2JqZWN0ICp3ID0gdml0ZW1ba107CisgICAgICAgIFB5X1hJTkNSRUYodyk7CisgICAgICAgIGl0ZW1baWxvd10gPSB3OworICAgIH0KKyAgICBmb3IgKGsgPSBub3JpZyAtIDE7IGsgPj0gMDsgLS1rKQorICAgICAgICBQeV9YREVDUkVGKHJlY3ljbGVba10pOworICAgIHJlc3VsdCA9IDA7CiAgRXJyb3I6Ci0JaWYgKHJlY3ljbGUgIT0gcmVjeWNsZV9vbl9zdGFjaykKLQkJUHlNZW1fRlJFRShyZWN5Y2xlKTsKLQlQeV9YREVDUkVGKHZfYXNfU0YpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlY3ljbGUgIT0gcmVjeWNsZV9vbl9zdGFjaykKKyAgICAgICAgUHlNZW1fRlJFRShyZWN5Y2xlKTsKKyAgICBQeV9YREVDUkVGKHZfYXNfU0YpOworICAgIHJldHVybiByZXN1bHQ7CiAjdW5kZWYgYgogfQogCiBpbnQKIFB5TGlzdF9TZXRTbGljZShQeU9iamVjdCAqYSwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoLCBQeU9iamVjdCAqdikKIHsKLQlpZiAoIVB5TGlzdF9DaGVjayhhKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gbGlzdF9hc3Nfc2xpY2UoKFB5TGlzdE9iamVjdCAqKWEsIGlsb3csIGloaWdoLCB2KTsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhhKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbGlzdF9hc3Nfc2xpY2UoKFB5TGlzdE9iamVjdCAqKWEsIGlsb3csIGloaWdoLCB2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfaW5wbGFjZV9yZXBlYXQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IG4pCiB7Ci0JUHlPYmplY3QgKippdGVtczsKLQlQeV9zc2l6ZV90IHNpemUsIGksIGosIHA7CisgICAgUHlPYmplY3QgKippdGVtczsKKyAgICBQeV9zc2l6ZV90IHNpemUsIGksIGosIHA7CiAKIAotCXNpemUgPSBQeUxpc3RfR0VUX1NJWkUoc2VsZik7Ci0JaWYgKHNpemUgPT0gMCB8fCBuID09IDEpIHsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKLQl9CisgICAgc2l6ZSA9IFB5TGlzdF9HRVRfU0laRShzZWxmKTsKKyAgICBpZiAoc2l6ZSA9PSAwIHx8IG4gPT0gMSkgeworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIH0KIAotCWlmIChuIDwgMSkgewotCQkodm9pZClsaXN0X2NsZWFyKHNlbGYpOwotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwotCX0KKyAgICBpZiAobiA8IDEpIHsKKyAgICAgICAgKHZvaWQpbGlzdF9jbGVhcihzZWxmKTsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICB9CiAKLQlpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gbikgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9CisgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAvIG4pIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQogCi0JaWYgKGxpc3RfcmVzaXplKHNlbGYsIHNpemUqbikgPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBzaXplKm4pID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXAgPSBzaXplOwotCWl0ZW1zID0gc2VsZi0+b2JfaXRlbTsKLQlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7IC8qIFN0YXJ0IGNvdW50aW5nIGF0IDEsIG5vdCAwICovCi0JCWZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCVB5T2JqZWN0ICpvID0gaXRlbXNbal07Ci0JCQlQeV9JTkNSRUYobyk7Ci0JCQlpdGVtc1twKytdID0gbzsKLQkJfQotCX0KLQlQeV9JTkNSRUYoc2VsZik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgcCA9IHNpemU7CisgICAgaXRlbXMgPSBzZWxmLT5vYl9pdGVtOworICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsgLyogU3RhcnQgY291bnRpbmcgYXQgMSwgbm90IDAgKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBpdGVtc1tqXTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgICAgIGl0ZW1zW3ArK10gPSBvOworICAgICAgICB9CisgICAgfQorICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogc3RhdGljIGludAogbGlzdF9hc3NfaXRlbShQeUxpc3RPYmplY3QgKmEsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKm9sZF92YWx1ZTsKLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIGxpc3RfYXNzX3NsaWNlKGEsIGksIGkrMSwgdik7Ci0JUHlfSU5DUkVGKHYpOwotCW9sZF92YWx1ZSA9IGEtPm9iX2l0ZW1baV07Ci0JYS0+b2JfaXRlbVtpXSA9IHY7Ci0JUHlfREVDUkVGKG9sZF92YWx1ZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKm9sZF92YWx1ZTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbGlzdF9hc3Nfc2xpY2UoYSwgaSwgaSsxLCB2KTsKKyAgICBQeV9JTkNSRUYodik7CisgICAgb2xkX3ZhbHVlID0gYS0+b2JfaXRlbVtpXTsKKyAgICBhLT5vYl9pdGVtW2ldID0gdjsKKyAgICBQeV9ERUNSRUYob2xkX3ZhbHVlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RpbnNlcnQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzppbnNlcnQiLCAmaSwgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoaW5zMShzZWxmLCBpLCB2KSA9PSAwKQotCQlQeV9SRVRVUk5fTk9ORTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzppbnNlcnQiLCAmaSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoaW5zMShzZWxmLCBpLCB2KSA9PSAwKQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RhcHBlbmQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlpZiAoYXBwMShzZWxmLCB2KSA9PSAwKQotCQlQeV9SRVRVUk5fTk9ORTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYXBwMShzZWxmLCB2KSA9PSAwKQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RleHRlbmQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYikKIHsKLQlQeU9iamVjdCAqaXQ7ICAgICAgLyogaXRlcih2KSAqLwotCVB5X3NzaXplX3QgbTsJCSAgIC8qIHNpemUgb2Ygc2VsZiAqLwotCVB5X3NzaXplX3QgbjsJCSAgIC8qIGd1ZXNzIGZvciBzaXplIG9mIGIgKi8KLQlQeV9zc2l6ZV90IG1uOwkJICAgLyogbSArIG4gKi8KLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIFB5T2JqZWN0ICppdDsgICAgICAvKiBpdGVyKHYpICovCisgICAgUHlfc3NpemVfdCBtOyAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc2VsZiAqLworICAgIFB5X3NzaXplX3QgbjsgICAgICAgICAgICAgICAgICAvKiBndWVzcyBmb3Igc2l6ZSBvZiBiICovCisgICAgUHlfc3NpemVfdCBtbjsgICAgICAgICAgICAgICAgIC8qIG0gKyBuICovCisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKIAotCS8qIFNwZWNpYWwgY2FzZXM6Ci0JICAgMSkgbGlzdHMgYW5kIHR1cGxlcyB3aGljaCBjYW4gdXNlIFB5U2VxdWVuY2VfRmFzdCBvcHMKLQkgICAyKSBleHRlbmRpbmcgc2VsZiB0byBzZWxmIHJlcXVpcmVzIG1ha2luZyBhIGNvcHkgZmlyc3QKLQkqLwotCWlmIChQeUxpc3RfQ2hlY2tFeGFjdChiKSB8fCBQeVR1cGxlX0NoZWNrRXhhY3QoYikgfHwgKFB5T2JqZWN0ICopc2VsZiA9PSBiKSB7Ci0JCVB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7Ci0JCWIgPSBQeVNlcXVlbmNlX0Zhc3QoYiwgImFyZ3VtZW50IG11c3QgYmUgaXRlcmFibGUiKTsKLQkJaWYgKCFiKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoYik7Ci0JCWlmIChuID09IDApIHsKLQkJCS8qIHNob3J0IGNpcmN1aXQgd2hlbiBiIGlzIGVtcHR5ICovCi0JCQlQeV9ERUNSRUYoYik7Ci0JCQlQeV9SRVRVUk5fTk9ORTsKLQkJfQotCQltID0gUHlfU0laRShzZWxmKTsKLQkJaWYgKGxpc3RfcmVzaXplKHNlbGYsIG0gKyBuKSA9PSAtMSkgewotCQkJUHlfREVDUkVGKGIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJLyogbm90ZSB0aGF0IHdlIG1heSBzdGlsbCBoYXZlIHNlbGYgPT0gYiBoZXJlIGZvciB0aGUKLQkJICogc2l0dWF0aW9uIGEuZXh0ZW5kKGEpLCBidXQgdGhlIGZvbGxvd2luZyBjb2RlIHdvcmtzCi0JCSAqIGluIHRoYXQgY2FzZSB0b28uICBKdXN0IG1ha2Ugc3VyZSB0byByZXNpemUgc2VsZgotCQkgKiBiZWZvcmUgY2FsbGluZyBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMuCi0JCSAqLwotCQkvKiBwb3B1bGF0ZSB0aGUgZW5kIG9mIHNlbGYgd2l0aCBiJ3MgaXRlbXMgKi8KLQkJc3JjID0gUHlTZXF1ZW5jZV9GYXN0X0lURU1TKGIpOwotCQlkZXN0ID0gc2VsZi0+b2JfaXRlbSArIG07Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCVB5T2JqZWN0ICpvID0gc3JjW2ldOwotCQkJUHlfSU5DUkVGKG8pOwotCQkJZGVzdFtpXSA9IG87Ci0JCX0KLQkJUHlfREVDUkVGKGIpOwotCQlQeV9SRVRVUk5fTk9ORTsKLQl9CisgICAgLyogU3BlY2lhbCBjYXNlczoKKyAgICAgICAxKSBsaXN0cyBhbmQgdHVwbGVzIHdoaWNoIGNhbiB1c2UgUHlTZXF1ZW5jZV9GYXN0IG9wcworICAgICAgIDIpIGV4dGVuZGluZyBzZWxmIHRvIHNlbGYgcmVxdWlyZXMgbWFraW5nIGEgY29weSBmaXJzdAorICAgICovCisgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KGIpIHx8IFB5VHVwbGVfQ2hlY2tFeGFjdChiKSB8fCAoUHlPYmplY3QgKilzZWxmID09IGIpIHsKKyAgICAgICAgUHlPYmplY3QgKipzcmMsICoqZGVzdDsKKyAgICAgICAgYiA9IFB5U2VxdWVuY2VfRmFzdChiLCAiYXJndW1lbnQgbXVzdCBiZSBpdGVyYWJsZSIpOworICAgICAgICBpZiAoIWIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShiKTsKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgLyogc2hvcnQgY2lyY3VpdCB3aGVuIGIgaXMgZW1wdHkgKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRihiKTsKKyAgICAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgICAgICB9CisgICAgICAgIG0gPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbSArIG4pID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvKiBub3RlIHRoYXQgd2UgbWF5IHN0aWxsIGhhdmUgc2VsZiA9PSBiIGhlcmUgZm9yIHRoZQorICAgICAgICAgKiBzaXR1YXRpb24gYS5leHRlbmQoYSksIGJ1dCB0aGUgZm9sbG93aW5nIGNvZGUgd29ya3MKKyAgICAgICAgICogaW4gdGhhdCBjYXNlIHRvby4gIEp1c3QgbWFrZSBzdXJlIHRvIHJlc2l6ZSBzZWxmCisgICAgICAgICAqIGJlZm9yZSBjYWxsaW5nIFB5U2VxdWVuY2VfRmFzdF9JVEVNUy4KKyAgICAgICAgICovCisgICAgICAgIC8qIHBvcHVsYXRlIHRoZSBlbmQgb2Ygc2VsZiB3aXRoIGIncyBpdGVtcyAqLworICAgICAgICBzcmMgPSBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMoYik7CisgICAgICAgIGRlc3QgPSBzZWxmLT5vYl9pdGVtICsgbTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBzcmNbaV07CisgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICBkZXN0W2ldID0gbzsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoYik7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihiKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXRlcm5leHQgPSAqaXQtPm9iX3R5cGUtPnRwX2l0ZXJuZXh0OworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihiKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXRlcm5leHQgPSAqaXQtPm9iX3R5cGUtPnRwX2l0ZXJuZXh0OwogCi0JLyogR3Vlc3MgYSByZXN1bHQgbGlzdCBzaXplLiAqLwotCW4gPSBfUHlPYmplY3RfTGVuZ3RoSGludChiLCA4KTsKLQlpZiAobiA9PSAtMSkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbSA9IFB5X1NJWkUoc2VsZik7Ci0JbW4gPSBtICsgbjsKLQlpZiAobW4gPj0gbSkgewotCQkvKiBNYWtlIHJvb20uICovCi0JCWlmIChsaXN0X3Jlc2l6ZShzZWxmLCBtbikgPT0gLTEpCi0JCQlnb3RvIGVycm9yOwotCQkvKiBNYWtlIHRoZSBsaXN0IHNhbmUgYWdhaW4uICovCi0JCVB5X1NJWkUoc2VsZikgPSBtOwotCX0KLQkvKiBFbHNlIG0gKyBuIG92ZXJmbG93ZWQ7IG9uIHRoZSBjaGFuY2UgdGhhdCBuIGxpZWQsIGFuZCB0aGVyZSByZWFsbHkKLQkgKiBpcyBlbm91Z2ggcm9vbSwgaWdub3JlIGl0LiAgSWYgbiB3YXMgdGVsbGluZyB0aGUgdHJ1dGgsIHdlJ2xsCi0JICogZXZlbnR1YWxseSBydW4gb3V0IG9mIG1lbW9yeSBkdXJpbmcgdGhlIGxvb3AuCi0JICovCisgICAgLyogR3Vlc3MgYSByZXN1bHQgbGlzdCBzaXplLiAqLworICAgIG4gPSBfUHlPYmplY3RfTGVuZ3RoSGludChiLCA4KTsKKyAgICBpZiAobiA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbSA9IFB5X1NJWkUoc2VsZik7CisgICAgbW4gPSBtICsgbjsKKyAgICBpZiAobW4gPj0gbSkgeworICAgICAgICAvKiBNYWtlIHJvb20uICovCisgICAgICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBtbikgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAvKiBNYWtlIHRoZSBsaXN0IHNhbmUgYWdhaW4uICovCisgICAgICAgIFB5X1NJWkUoc2VsZikgPSBtOworICAgIH0KKyAgICAvKiBFbHNlIG0gKyBuIG92ZXJmbG93ZWQ7IG9uIHRoZSBjaGFuY2UgdGhhdCBuIGxpZWQsIGFuZCB0aGVyZSByZWFsbHkKKyAgICAgKiBpcyBlbm91Z2ggcm9vbSwgaWdub3JlIGl0LiAgSWYgbiB3YXMgdGVsbGluZyB0aGUgdHJ1dGgsIHdlJ2xsCisgICAgICogZXZlbnR1YWxseSBydW4gb3V0IG9mIG1lbW9yeSBkdXJpbmcgdGhlIGxvb3AuCisgICAgICovCiAKLQkvKiBSdW4gaXRlcmF0b3IgdG8gZXhoYXVzdGlvbi4gKi8KLQlmb3IgKDs7KSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gaXRlcm5leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJCWVsc2UKLQkJCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChQeV9TSVpFKHNlbGYpIDwgc2VsZi0+YWxsb2NhdGVkKSB7Ci0JCQkvKiBzdGVhbHMgcmVmICovCi0JCQlQeUxpc3RfU0VUX0lURU0oc2VsZiwgUHlfU0laRShzZWxmKSwgaXRlbSk7Ci0JCQkrK1B5X1NJWkUoc2VsZik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgc3RhdHVzID0gYXBwMShzZWxmLCBpdGVtKTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsgIC8qIGFwcGVuZCBjcmVhdGVzIGEgbmV3IHJlZiAqLwotCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCX0KKyAgICAvKiBSdW4gaXRlcmF0b3IgdG8gZXhoYXVzdGlvbi4gKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gaXRlcm5leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChQeV9TSVpFKHNlbGYpIDwgc2VsZi0+YWxsb2NhdGVkKSB7CisgICAgICAgICAgICAvKiBzdGVhbHMgcmVmICovCisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0oc2VsZiwgUHlfU0laRShzZWxmKSwgaXRlbSk7CisgICAgICAgICAgICArK1B5X1NJWkUoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gYXBwMShzZWxmLCBpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsgIC8qIGFwcGVuZCBjcmVhdGVzIGEgbmV3IHJlZiAqLworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIEN1dCBiYWNrIHJlc3VsdCBsaXN0IGlmIGluaXRpYWwgZ3Vlc3Mgd2FzIHRvbyBsYXJnZS4gKi8KLQlpZiAoUHlfU0laRShzZWxmKSA8IHNlbGYtPmFsbG9jYXRlZCkKLQkJbGlzdF9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSk7ICAvKiBzaHJpbmtpbmcgY2FuJ3QgZmFpbCAqLworICAgIC8qIEN1dCBiYWNrIHJlc3VsdCBsaXN0IGlmIGluaXRpYWwgZ3Vlc3Mgd2FzIHRvbyBsYXJnZS4gKi8KKyAgICBpZiAoUHlfU0laRShzZWxmKSA8IHNlbGYtPmFsbG9jYXRlZCkKKyAgICAgICAgbGlzdF9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSk7ICAvKiBzaHJpbmtpbmcgY2FuJ3QgZmFpbCAqLwogCi0JUHlfREVDUkVGKGl0KTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9ERUNSRUYoaXQpOworICAgIFB5X1JFVFVSTl9OT05FOwogCiAgIGVycm9yOgotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlPYmplY3QgKgogX1B5TGlzdF9FeHRlbmQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYikKIHsKLQlyZXR1cm4gbGlzdGV4dGVuZChzZWxmLCBiKTsKKyAgICByZXR1cm4gbGlzdGV4dGVuZChzZWxmLCBiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfaW5wbGFjZV9jb25jYXQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JcmVzdWx0ID0gbGlzdGV4dGVuZChzZWxmLCBvdGhlcik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gcmVzdWx0OwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICByZXN1bHQgPSBsaXN0ZXh0ZW5kKHNlbGYsIG90aGVyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdHBvcChQeUxpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgaSA9IC0xOwotCVB5T2JqZWN0ICp2OwotCWludCBzdGF0dXM7CisgICAgUHlfc3NpemVfdCBpID0gLTE7CisgICAgUHlPYmplY3QgKnY7CisgICAgaW50IHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cG9wIiwgJmkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnBvcCIsICZpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlfU0laRShzZWxmKSA9PSAwKSB7Ci0JCS8qIFNwZWNpYWwtY2FzZSBtb3N0IGNvbW1vbiBmYWlsdXJlIGNhdXNlICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGZyb20gZW1wdHkgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGkgPCAwKQotCQlpICs9IFB5X1NJWkUoc2VsZik7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShzZWxmKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInBvcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXYgPSBzZWxmLT5vYl9pdGVtW2ldOwotCWlmIChpID09IFB5X1NJWkUoc2VsZikgLSAxKSB7Ci0JCXN0YXR1cyA9IGxpc3RfcmVzaXplKHNlbGYsIFB5X1NJWkUoc2VsZikgLSAxKTsKLQkJYXNzZXJ0KHN0YXR1cyA+PSAwKTsKLQkJcmV0dXJuIHY7IC8qIGFuZCB2IG5vdyBvd25zIHRoZSByZWZlcmVuY2UgdGhlIGxpc3QgaGFkICovCi0JfQotCVB5X0lOQ1JFRih2KTsKLQlzdGF0dXMgPSBsaXN0X2Fzc19zbGljZShzZWxmLCBpLCBpKzEsIChQeU9iamVjdCAqKU5VTEwpOwotCWFzc2VydChzdGF0dXMgPj0gMCk7Ci0JLyogVXNlIHN0YXR1cywgc28gdGhhdCBpbiBhIHJlbGVhc2UgYnVpbGQgY29tcGlsZXJzIGRvbid0Ci0JICogY29tcGxhaW4gYWJvdXQgdGhlIHVudXNlZCBuYW1lLgotCSAqLwotCSh2b2lkKSBzdGF0dXM7CisgICAgaWYgKFB5X1NJWkUoc2VsZikgPT0gMCkgeworICAgICAgICAvKiBTcGVjaWFsLWNhc2UgbW9zdCBjb21tb24gZmFpbHVyZSBjYXVzZSAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInBvcCBmcm9tIGVtcHR5IGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpIDwgMCkKKyAgICAgICAgaSArPSBQeV9TSVpFKHNlbGYpOworICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoc2VsZikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2ID0gc2VsZi0+b2JfaXRlbVtpXTsKKyAgICBpZiAoaSA9PSBQeV9TSVpFKHNlbGYpIC0gMSkgeworICAgICAgICBzdGF0dXMgPSBsaXN0X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpIC0gMSk7CisgICAgICAgIGFzc2VydChzdGF0dXMgPj0gMCk7CisgICAgICAgIHJldHVybiB2OyAvKiBhbmQgdiBub3cgb3ducyB0aGUgcmVmZXJlbmNlIHRoZSBsaXN0IGhhZCAqLworICAgIH0KKyAgICBQeV9JTkNSRUYodik7CisgICAgc3RhdHVzID0gbGlzdF9hc3Nfc2xpY2Uoc2VsZiwgaSwgaSsxLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBhc3NlcnQoc3RhdHVzID49IDApOworICAgIC8qIFVzZSBzdGF0dXMsIHNvIHRoYXQgaW4gYSByZWxlYXNlIGJ1aWxkIGNvbXBpbGVycyBkb24ndAorICAgICAqIGNvbXBsYWluIGFib3V0IHRoZSB1bnVzZWQgbmFtZS4KKyAgICAgKi8KKyAgICAodm9pZCkgc3RhdHVzOwogCi0JcmV0dXJuIHY7CisgICAgcmV0dXJuIHY7CiB9CiAKIC8qIFJldmVyc2UgYSBzbGljZSBvZiBhIGxpc3QgaW4gcGxhY2UsIGZyb20gbG8gdXAgdG8gKGV4Y2x1c2l2ZSkgaGkuICovCiBzdGF0aWMgdm9pZAogcmV2ZXJzZV9zbGljZShQeU9iamVjdCAqKmxvLCBQeU9iamVjdCAqKmhpKQogewotCWFzc2VydChsbyAmJiBoaSk7CisgICAgYXNzZXJ0KGxvICYmIGhpKTsKIAotCS0taGk7Ci0Jd2hpbGUgKGxvIDwgaGkpIHsKLQkJUHlPYmplY3QgKnQgPSAqbG87Ci0JCSpsbyA9ICpoaTsKLQkJKmhpID0gdDsKLQkJKytsbzsKLQkJLS1oaTsKLQl9CisgICAgLS1oaTsKKyAgICB3aGlsZSAobG8gPCBoaSkgeworICAgICAgICBQeU9iamVjdCAqdCA9ICpsbzsKKyAgICAgICAgKmxvID0gKmhpOworICAgICAgICAqaGkgPSB0OworICAgICAgICArK2xvOworICAgICAgICAtLWhpOworICAgIH0KIH0KIAogLyogTG90cyBvZiBjb2RlIGZvciBhbiBhZGFwdGl2ZSwgc3RhYmxlLCBuYXR1cmFsIG1lcmdlc29ydC4gIFRoZXJlIGFyZSBtYW55CkBAIC05OTAsMzUgKzk5MCwzNSBAQAogc3RhdGljIGludAogaXNsdChQeU9iamVjdCAqeCwgUHlPYmplY3QgKnksIFB5T2JqZWN0ICpjb21wYXJlKQogewotCVB5T2JqZWN0ICpyZXM7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlfc3NpemVfdCBpOwogCi0JYXNzZXJ0KGNvbXBhcmUgIT0gTlVMTCk7Ci0JLyogQ2FsbCB0aGUgdXNlcidzIGNvbXBhcmlzb24gZnVuY3Rpb24gYW5kIHRyYW5zbGF0ZSB0aGUgMy13YXkKLQkgKiByZXN1bHQgaW50byB0cnVlIG9yIGZhbHNlIChvciBlcnJvcikuCi0JICovCi0JYXJncyA9IFB5VHVwbGVfTmV3KDIpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9JTkNSRUYoeCk7Ci0JUHlfSU5DUkVGKHkpOwotCVB5VHVwbGVfU0VUX0lURU0oYXJncywgMCwgeCk7Ci0JUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAxLCB5KTsKLQlyZXMgPSBQeU9iamVjdF9DYWxsKGNvbXBhcmUsIGFyZ3MsIE5VTEwpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoIVB5SW50X0NoZWNrKHJlcykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNvbXBhcmlzb24gZnVuY3Rpb24gbXVzdCByZXR1cm4gaW50LCBub3QgJS4yMDBzIiwKLQkJCSAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaSA9IFB5SW50X0FzTG9uZyhyZXMpOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiBpIDwgMDsKKyAgICBhc3NlcnQoY29tcGFyZSAhPSBOVUxMKTsKKyAgICAvKiBDYWxsIHRoZSB1c2VyJ3MgY29tcGFyaXNvbiBmdW5jdGlvbiBhbmQgdHJhbnNsYXRlIHRoZSAzLXdheQorICAgICAqIHJlc3VsdCBpbnRvIHRydWUgb3IgZmFsc2UgKG9yIGVycm9yKS4KKyAgICAgKi8KKyAgICBhcmdzID0gUHlUdXBsZV9OZXcoMik7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0lOQ1JFRih4KTsKKyAgICBQeV9JTkNSRUYoeSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCB4KTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDEsIHkpOworICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoY29tcGFyZSwgYXJncywgTlVMTCk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlJbnRfQ2hlY2socmVzKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNvbXBhcmlzb24gZnVuY3Rpb24gbXVzdCByZXR1cm4gaW50LCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGkgPSBQeUludF9Bc0xvbmcocmVzKTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gaSA8IDA7CiB9CiAKIC8qIElmIENPTVBBUkUgaXMgTlVMTCwgY2FsbHMgUHlPYmplY3RfUmljaENvbXBhcmVCb29sIHdpdGggUHlfTFQsIGVsc2UgY2FsbHMKQEAgLTEwMjYsMTYgKzEwMjYsMTYgQEAKICAqIHNvcnRpbmcgZG9lcyBtYW55IGNvbXBhcmlzb25zLgogICogUmV0dXJucyAtMSBvbiBlcnJvciwgMSBpZiB4IDwgeSwgMCBpZiB4ID49IHkuCiAgKi8KLSNkZWZpbmUgSVNMVChYLCBZLCBDT01QQVJFKSAoKENPTVBBUkUpID09IE5VTEwgPwkJCVwKLQkJCSAgICAgUHlPYmplY3RfUmljaENvbXBhcmVCb29sKFgsIFksIFB5X0xUKSA6CVwKLQkJCSAgICAgaXNsdChYLCBZLCBDT01QQVJFKSkKKyNkZWZpbmUgSVNMVChYLCBZLCBDT01QQVJFKSAoKENPTVBBUkUpID09IE5VTEwgPyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgUHlPYmplY3RfUmljaENvbXBhcmVCb29sKFgsIFksIFB5X0xUKSA6ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgaXNsdChYLCBZLCBDT01QQVJFKSkKIAogLyogQ29tcGFyZSBYIHRvIFkgdmlhICI8Ii4gIEdvdG8gImZhaWwiIGlmIHRoZSBjb21wYXJpc29uIHJhaXNlcyBhbgogICAgZXJyb3IuICBFbHNlICJrIiBpcyBzZXQgdG8gdHJ1ZSBpZmYgWDxZLCBhbmQgYW4gImlmIChrKSIgYmxvY2sgaXMKICAgIHN0YXJ0ZWQuICBJdCBtYWtlcyBtb3JlIHNlbnNlIGluIGNvbnRleHQgPHdpbms+LiAgWCBhbmQgWSBhcmUgUHlPYmplY3Qqcy4KICovCiAjZGVmaW5lIElGTFQoWCwgWSkgaWYgKChrID0gSVNMVChYLCBZLCBjb21wYXJlKSkgPCAwKSBnb3RvIGZhaWw7ICBcCi0JCSAgIGlmIChrKQorICAgICAgICAgICBpZiAoaykKIAogLyogYmluYXJ5c29ydCBpcyB0aGUgYmVzdCBtZXRob2QgZm9yIHNvcnRpbmcgc21hbGwgYXJyYXlzOiBpdCBkb2VzCiAgICBmZXcgY29tcGFyZXMsIGJ1dCBjYW4gZG8gZGF0YSBtb3ZlbWVudCBxdWFkcmF0aWMgaW4gdGhlIG51bWJlciBvZgpAQCAtMTA1Miw0OCArMTA1Miw0OCBAQAogYmluYXJ5c29ydChQeU9iamVjdCAqKmxvLCBQeU9iamVjdCAqKmhpLCBQeU9iamVjdCAqKnN0YXJ0LCBQeU9iamVjdCAqY29tcGFyZSkKICAgICAgLyogY29tcGFyZSAtLSBjb21wYXJpc29uIGZ1bmN0aW9uIG9iamVjdCwgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLwogewotCXJlZ2lzdGVyIFB5X3NzaXplX3QgazsKLQlyZWdpc3RlciBQeU9iamVjdCAqKmwsICoqcCwgKipyOwotCXJlZ2lzdGVyIFB5T2JqZWN0ICpwaXZvdDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGs7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKipsLCAqKnAsICoqcjsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqcGl2b3Q7CiAKLQlhc3NlcnQobG8gPD0gc3RhcnQgJiYgc3RhcnQgPD0gaGkpOwotCS8qIGFzc2VydCBbbG8sIHN0YXJ0KSBpcyBzb3J0ZWQgKi8KLQlpZiAobG8gPT0gc3RhcnQpCi0JCSsrc3RhcnQ7Ci0JZm9yICg7IHN0YXJ0IDwgaGk7ICsrc3RhcnQpIHsKLQkJLyogc2V0IGwgdG8gd2hlcmUgKnN0YXJ0IGJlbG9uZ3MgKi8KLQkJbCA9IGxvOwotCQlyID0gc3RhcnQ7Ci0JCXBpdm90ID0gKnI7Ci0JCS8qIEludmFyaWFudHM6Ci0JCSAqIHBpdm90ID49IGFsbCBpbiBbbG8sIGwpLgotCQkgKiBwaXZvdCAgPCBhbGwgaW4gW3IsIHN0YXJ0KS4KLQkJICogVGhlIHNlY29uZCBpcyB2YWN1b3VzbHkgdHJ1ZSBhdCB0aGUgc3RhcnQuCi0JCSAqLwotCQlhc3NlcnQobCA8IHIpOwotCQlkbyB7Ci0JCQlwID0gbCArICgociAtIGwpID4+IDEpOwotCQkJSUZMVChwaXZvdCwgKnApCi0JCQkJciA9IHA7Ci0JCQllbHNlCi0JCQkJbCA9IHArMTsKLQkJfSB3aGlsZSAobCA8IHIpOwotCQlhc3NlcnQobCA9PSByKTsKLQkJLyogVGhlIGludmFyaWFudHMgc3RpbGwgaG9sZCwgc28gcGl2b3QgPj0gYWxsIGluIFtsbywgbCkgYW5kCi0JCSAgIHBpdm90IDwgYWxsIGluIFtsLCBzdGFydCksIHNvIHBpdm90IGJlbG9uZ3MgYXQgbC4gIE5vdGUKLQkJICAgdGhhdCBpZiB0aGVyZSBhcmUgZWxlbWVudHMgZXF1YWwgdG8gcGl2b3QsIGwgcG9pbnRzIHRvIHRoZQotCQkgICBmaXJzdCBzbG90IGFmdGVyIHRoZW0gLS0gdGhhdCdzIHdoeSB0aGlzIHNvcnQgaXMgc3RhYmxlLgotCQkgICBTbGlkZSBvdmVyIHRvIG1ha2Ugcm9vbS4KLQkJICAgQ2F1dGlvbjogdXNpbmcgbWVtbW92ZSBpcyBtdWNoIHNsb3dlciB1bmRlciBNU1ZDIDU7Ci0JCSAgIHdlJ3JlIG5vdCB1c3VhbGx5IG1vdmluZyBtYW55IHNsb3RzLiAqLwotCQlmb3IgKHAgPSBzdGFydDsgcCA+IGw7IC0tcCkKLQkJCSpwID0gKihwLTEpOwotCQkqbCA9IHBpdm90OwotCX0KLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQobG8gPD0gc3RhcnQgJiYgc3RhcnQgPD0gaGkpOworICAgIC8qIGFzc2VydCBbbG8sIHN0YXJ0KSBpcyBzb3J0ZWQgKi8KKyAgICBpZiAobG8gPT0gc3RhcnQpCisgICAgICAgICsrc3RhcnQ7CisgICAgZm9yICg7IHN0YXJ0IDwgaGk7ICsrc3RhcnQpIHsKKyAgICAgICAgLyogc2V0IGwgdG8gd2hlcmUgKnN0YXJ0IGJlbG9uZ3MgKi8KKyAgICAgICAgbCA9IGxvOworICAgICAgICByID0gc3RhcnQ7CisgICAgICAgIHBpdm90ID0gKnI7CisgICAgICAgIC8qIEludmFyaWFudHM6CisgICAgICAgICAqIHBpdm90ID49IGFsbCBpbiBbbG8sIGwpLgorICAgICAgICAgKiBwaXZvdCAgPCBhbGwgaW4gW3IsIHN0YXJ0KS4KKyAgICAgICAgICogVGhlIHNlY29uZCBpcyB2YWN1b3VzbHkgdHJ1ZSBhdCB0aGUgc3RhcnQuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQobCA8IHIpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBwID0gbCArICgociAtIGwpID4+IDEpOworICAgICAgICAgICAgSUZMVChwaXZvdCwgKnApCisgICAgICAgICAgICAgICAgciA9IHA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbCA9IHArMTsKKyAgICAgICAgfSB3aGlsZSAobCA8IHIpOworICAgICAgICBhc3NlcnQobCA9PSByKTsKKyAgICAgICAgLyogVGhlIGludmFyaWFudHMgc3RpbGwgaG9sZCwgc28gcGl2b3QgPj0gYWxsIGluIFtsbywgbCkgYW5kCisgICAgICAgICAgIHBpdm90IDwgYWxsIGluIFtsLCBzdGFydCksIHNvIHBpdm90IGJlbG9uZ3MgYXQgbC4gIE5vdGUKKyAgICAgICAgICAgdGhhdCBpZiB0aGVyZSBhcmUgZWxlbWVudHMgZXF1YWwgdG8gcGl2b3QsIGwgcG9pbnRzIHRvIHRoZQorICAgICAgICAgICBmaXJzdCBzbG90IGFmdGVyIHRoZW0gLS0gdGhhdCdzIHdoeSB0aGlzIHNvcnQgaXMgc3RhYmxlLgorICAgICAgICAgICBTbGlkZSBvdmVyIHRvIG1ha2Ugcm9vbS4KKyAgICAgICAgICAgQ2F1dGlvbjogdXNpbmcgbWVtbW92ZSBpcyBtdWNoIHNsb3dlciB1bmRlciBNU1ZDIDU7CisgICAgICAgICAgIHdlJ3JlIG5vdCB1c3VhbGx5IG1vdmluZyBtYW55IHNsb3RzLiAqLworICAgICAgICBmb3IgKHAgPSBzdGFydDsgcCA+IGw7IC0tcCkKKyAgICAgICAgICAgICpwID0gKihwLTEpOworICAgICAgICAqbCA9IHBpdm90OworICAgIH0KKyAgICByZXR1cm4gMDsKIAogIGZhaWw6Ci0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAogLyoKQEAgLTExMTcsMzUgKzExMTcsMzUgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBjb3VudF9ydW4oUHlPYmplY3QgKipsbywgUHlPYmplY3QgKipoaSwgUHlPYmplY3QgKmNvbXBhcmUsIGludCAqZGVzY2VuZGluZykKIHsKLQlQeV9zc2l6ZV90IGs7Ci0JUHlfc3NpemVfdCBuOworICAgIFB5X3NzaXplX3QgazsKKyAgICBQeV9zc2l6ZV90IG47CiAKLQlhc3NlcnQobG8gPCBoaSk7Ci0JKmRlc2NlbmRpbmcgPSAwOwotCSsrbG87Ci0JaWYgKGxvID09IGhpKQotCQlyZXR1cm4gMTsKKyAgICBhc3NlcnQobG8gPCBoaSk7CisgICAgKmRlc2NlbmRpbmcgPSAwOworICAgICsrbG87CisgICAgaWYgKGxvID09IGhpKQorICAgICAgICByZXR1cm4gMTsKIAotCW4gPSAyOwotCUlGTFQoKmxvLCAqKGxvLTEpKSB7Ci0JCSpkZXNjZW5kaW5nID0gMTsKLQkJZm9yIChsbyA9IGxvKzE7IGxvIDwgaGk7ICsrbG8sICsrbikgewotCQkJSUZMVCgqbG8sICoobG8tMSkpCi0JCQkJOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCWVsc2UgewotCQlmb3IgKGxvID0gbG8rMTsgbG8gPCBoaTsgKytsbywgKytuKSB7Ci0JCQlJRkxUKCpsbywgKihsby0xKSkKLQkJCQlicmVhazsKLQkJfQotCX0KKyAgICBuID0gMjsKKyAgICBJRkxUKCpsbywgKihsby0xKSkgeworICAgICAgICAqZGVzY2VuZGluZyA9IDE7CisgICAgICAgIGZvciAobG8gPSBsbysxOyBsbyA8IGhpOyArK2xvLCArK24pIHsKKyAgICAgICAgICAgIElGTFQoKmxvLCAqKGxvLTEpKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChsbyA9IGxvKzE7IGxvIDwgaGk7ICsrbG8sICsrbikgeworICAgICAgICAgICAgSUZMVCgqbG8sICoobG8tMSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gbjsKKyAgICByZXR1cm4gbjsKIGZhaWw6Ci0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAogLyoKQEAgLTExNzIsNzggKzExNzIsNzggQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBnYWxsb3BfbGVmdChQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqKmEsIFB5X3NzaXplX3QgbiwgUHlfc3NpemVfdCBoaW50LCBQeU9iamVjdCAqY29tcGFyZSkKIHsKLQlQeV9zc2l6ZV90IG9mczsKLQlQeV9zc2l6ZV90IGxhc3RvZnM7Ci0JUHlfc3NpemVfdCBrOworICAgIFB5X3NzaXplX3Qgb2ZzOworICAgIFB5X3NzaXplX3QgbGFzdG9mczsKKyAgICBQeV9zc2l6ZV90IGs7CiAKLQlhc3NlcnQoa2V5ICYmIGEgJiYgbiA+IDAgJiYgaGludCA+PSAwICYmIGhpbnQgPCBuKTsKKyAgICBhc3NlcnQoa2V5ICYmIGEgJiYgbiA+IDAgJiYgaGludCA+PSAwICYmIGhpbnQgPCBuKTsKIAotCWEgKz0gaGludDsKLQlsYXN0b2ZzID0gMDsKLQlvZnMgPSAxOwotCUlGTFQoKmEsIGtleSkgewotCQkvKiBhW2hpbnRdIDwga2V5IC0tIGdhbGxvcCByaWdodCwgdW50aWwKLQkJICogYVtoaW50ICsgbGFzdG9mc10gPCBrZXkgPD0gYVtoaW50ICsgb2ZzXQotCQkgKi8KLQkJY29uc3QgUHlfc3NpemVfdCBtYXhvZnMgPSBuIC0gaGludDsJLyogJmFbbi0xXSBpcyBoaWdoZXN0ICovCi0JCXdoaWxlIChvZnMgPCBtYXhvZnMpIHsKLQkJCUlGTFQoYVtvZnNdLCBrZXkpIHsKLQkJCQlsYXN0b2ZzID0gb2ZzOwotCQkJCW9mcyA9IChvZnMgPDwgMSkgKyAxOwotCQkJCWlmIChvZnMgPD0gMCkJLyogaW50IG92ZXJmbG93ICovCi0JCQkJCW9mcyA9IG1heG9mczsKLQkJCX0KLSAJCQllbHNlCS8qIGtleSA8PSBhW2hpbnQgKyBvZnNdICovCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKG9mcyA+IG1heG9mcykKLQkJCW9mcyA9IG1heG9mczsKLQkJLyogVHJhbnNsYXRlIGJhY2sgdG8gb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KLQkJbGFzdG9mcyArPSBoaW50OwotCQlvZnMgKz0gaGludDsKLQl9Ci0JZWxzZSB7Ci0JCS8qIGtleSA8PSBhW2hpbnRdIC0tIGdhbGxvcCBsZWZ0LCB1bnRpbAotCQkgKiBhW2hpbnQgLSBvZnNdIDwga2V5IDw9IGFbaGludCAtIGxhc3RvZnNdCi0JCSAqLwotCQljb25zdCBQeV9zc2l6ZV90IG1heG9mcyA9IGhpbnQgKyAxOwkvKiAmYVswXSBpcyBsb3dlc3QgKi8KLQkJd2hpbGUgKG9mcyA8IG1heG9mcykgewotCQkJSUZMVCgqKGEtb2ZzKSwga2V5KQotCQkJCWJyZWFrOwotCQkJLyoga2V5IDw9IGFbaGludCAtIG9mc10gKi8KLQkJCWxhc3RvZnMgPSBvZnM7Ci0JCQlvZnMgPSAob2ZzIDw8IDEpICsgMTsKLQkJCWlmIChvZnMgPD0gMCkJLyogaW50IG92ZXJmbG93ICovCi0JCQkJb2ZzID0gbWF4b2ZzOwotCQl9Ci0JCWlmIChvZnMgPiBtYXhvZnMpCi0JCQlvZnMgPSBtYXhvZnM7Ci0JCS8qIFRyYW5zbGF0ZSBiYWNrIHRvIHBvc2l0aXZlIG9mZnNldHMgcmVsYXRpdmUgdG8gJmFbMF0uICovCi0JCWsgPSBsYXN0b2ZzOwotCQlsYXN0b2ZzID0gaGludCAtIG9mczsKLQkJb2ZzID0gaGludCAtIGs7Ci0JfQotCWEgLT0gaGludDsKKyAgICBhICs9IGhpbnQ7CisgICAgbGFzdG9mcyA9IDA7CisgICAgb2ZzID0gMTsKKyAgICBJRkxUKCphLCBrZXkpIHsKKyAgICAgICAgLyogYVtoaW50XSA8IGtleSAtLSBnYWxsb3AgcmlnaHQsIHVudGlsCisgICAgICAgICAqIGFbaGludCArIGxhc3RvZnNdIDwga2V5IDw9IGFbaGludCArIG9mc10KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4b2ZzID0gbiAtIGhpbnQ7ICAgICAgICAgICAgIC8qICZhW24tMV0gaXMgaGlnaGVzdCAqLworICAgICAgICB3aGlsZSAob2ZzIDwgbWF4b2ZzKSB7CisgICAgICAgICAgICBJRkxUKGFbb2ZzXSwga2V5KSB7CisgICAgICAgICAgICAgICAgbGFzdG9mcyA9IG9mczsKKyAgICAgICAgICAgICAgICBvZnMgPSAob2ZzIDw8IDEpICsgMTsKKyAgICAgICAgICAgICAgICBpZiAob2ZzIDw9IDApICAgICAgICAgICAgICAgICAgIC8qIGludCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgICAgICBvZnMgPSBtYXhvZnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8qIGtleSA8PSBhW2hpbnQgKyBvZnNdICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mcyA+IG1heG9mcykKKyAgICAgICAgICAgIG9mcyA9IG1heG9mczsKKyAgICAgICAgLyogVHJhbnNsYXRlIGJhY2sgdG8gb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KKyAgICAgICAgbGFzdG9mcyArPSBoaW50OworICAgICAgICBvZnMgKz0gaGludDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGtleSA8PSBhW2hpbnRdIC0tIGdhbGxvcCBsZWZ0LCB1bnRpbAorICAgICAgICAgKiBhW2hpbnQgLSBvZnNdIDwga2V5IDw9IGFbaGludCAtIGxhc3RvZnNdCisgICAgICAgICAqLworICAgICAgICBjb25zdCBQeV9zc2l6ZV90IG1heG9mcyA9IGhpbnQgKyAxOyAgICAgICAgICAgICAvKiAmYVswXSBpcyBsb3dlc3QgKi8KKyAgICAgICAgd2hpbGUgKG9mcyA8IG1heG9mcykgeworICAgICAgICAgICAgSUZMVCgqKGEtb2ZzKSwga2V5KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyoga2V5IDw9IGFbaGludCAtIG9mc10gKi8KKyAgICAgICAgICAgIGxhc3RvZnMgPSBvZnM7CisgICAgICAgICAgICBvZnMgPSAob2ZzIDw8IDEpICsgMTsKKyAgICAgICAgICAgIGlmIChvZnMgPD0gMCkgICAgICAgICAgICAgICAvKiBpbnQgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBvZnMgPSBtYXhvZnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mcyA+IG1heG9mcykKKyAgICAgICAgICAgIG9mcyA9IG1heG9mczsKKyAgICAgICAgLyogVHJhbnNsYXRlIGJhY2sgdG8gcG9zaXRpdmUgb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KKyAgICAgICAgayA9IGxhc3RvZnM7CisgICAgICAgIGxhc3RvZnMgPSBoaW50IC0gb2ZzOworICAgICAgICBvZnMgPSBoaW50IC0gazsKKyAgICB9CisgICAgYSAtPSBoaW50OwogCi0JYXNzZXJ0KC0xIDw9IGxhc3RvZnMgJiYgbGFzdG9mcyA8IG9mcyAmJiBvZnMgPD0gbik7Ci0JLyogTm93IGFbbGFzdG9mc10gPCBrZXkgPD0gYVtvZnNdLCBzbyBrZXkgYmVsb25ncyBzb21ld2hlcmUgdG8gdGhlCi0JICogcmlnaHQgb2YgbGFzdG9mcyBidXQgbm8gZmFydGhlciByaWdodCB0aGFuIG9mcy4gIERvIGEgYmluYXJ5Ci0JICogc2VhcmNoLCB3aXRoIGludmFyaWFudCBhW2xhc3RvZnMtMV0gPCBrZXkgPD0gYVtvZnNdLgotCSAqLwotCSsrbGFzdG9mczsKLQl3aGlsZSAobGFzdG9mcyA8IG9mcykgewotCQlQeV9zc2l6ZV90IG0gPSBsYXN0b2ZzICsgKChvZnMgLSBsYXN0b2ZzKSA+PiAxKTsKKyAgICBhc3NlcnQoLTEgPD0gbGFzdG9mcyAmJiBsYXN0b2ZzIDwgb2ZzICYmIG9mcyA8PSBuKTsKKyAgICAvKiBOb3cgYVtsYXN0b2ZzXSA8IGtleSA8PSBhW29mc10sIHNvIGtleSBiZWxvbmdzIHNvbWV3aGVyZSB0byB0aGUKKyAgICAgKiByaWdodCBvZiBsYXN0b2ZzIGJ1dCBubyBmYXJ0aGVyIHJpZ2h0IHRoYW4gb2ZzLiAgRG8gYSBiaW5hcnkKKyAgICAgKiBzZWFyY2gsIHdpdGggaW52YXJpYW50IGFbbGFzdG9mcy0xXSA8IGtleSA8PSBhW29mc10uCisgICAgICovCisgICAgKytsYXN0b2ZzOworICAgIHdoaWxlIChsYXN0b2ZzIDwgb2ZzKSB7CisgICAgICAgIFB5X3NzaXplX3QgbSA9IGxhc3RvZnMgKyAoKG9mcyAtIGxhc3RvZnMpID4+IDEpOwogCi0JCUlGTFQoYVttXSwga2V5KQotCQkJbGFzdG9mcyA9IG0rMTsJLyogYVttXSA8IGtleSAqLwotCQllbHNlCi0JCQlvZnMgPSBtOwkvKiBrZXkgPD0gYVttXSAqLwotCX0KLQlhc3NlcnQobGFzdG9mcyA9PSBvZnMpOwkJLyogc28gYVtvZnMtMV0gPCBrZXkgPD0gYVtvZnNdICovCi0JcmV0dXJuIG9mczsKKyAgICAgICAgSUZMVChhW21dLCBrZXkpCisgICAgICAgICAgICBsYXN0b2ZzID0gbSsxOyAgICAgICAgICAgICAgLyogYVttXSA8IGtleSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBvZnMgPSBtOyAgICAgICAgICAgICAgICAgICAgLyoga2V5IDw9IGFbbV0gKi8KKyAgICB9CisgICAgYXNzZXJ0KGxhc3RvZnMgPT0gb2ZzKTsgICAgICAgICAgICAgLyogc28gYVtvZnMtMV0gPCBrZXkgPD0gYVtvZnNdICovCisgICAgcmV0dXJuIG9mczsKIAogZmFpbDoKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKgpAQCAtMTI2Myw3OCArMTI2Myw3OCBAQAogc3RhdGljIFB5X3NzaXplX3QKIGdhbGxvcF9yaWdodChQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqKmEsIFB5X3NzaXplX3QgbiwgUHlfc3NpemVfdCBoaW50LCBQeU9iamVjdCAqY29tcGFyZSkKIHsKLQlQeV9zc2l6ZV90IG9mczsKLQlQeV9zc2l6ZV90IGxhc3RvZnM7Ci0JUHlfc3NpemVfdCBrOworICAgIFB5X3NzaXplX3Qgb2ZzOworICAgIFB5X3NzaXplX3QgbGFzdG9mczsKKyAgICBQeV9zc2l6ZV90IGs7CiAKLQlhc3NlcnQoa2V5ICYmIGEgJiYgbiA+IDAgJiYgaGludCA+PSAwICYmIGhpbnQgPCBuKTsKKyAgICBhc3NlcnQoa2V5ICYmIGEgJiYgbiA+IDAgJiYgaGludCA+PSAwICYmIGhpbnQgPCBuKTsKIAotCWEgKz0gaGludDsKLQlsYXN0b2ZzID0gMDsKLQlvZnMgPSAxOwotCUlGTFQoa2V5LCAqYSkgewotCQkvKiBrZXkgPCBhW2hpbnRdIC0tIGdhbGxvcCBsZWZ0LCB1bnRpbAotCQkgKiBhW2hpbnQgLSBvZnNdIDw9IGtleSA8IGFbaGludCAtIGxhc3RvZnNdCi0JCSAqLwotCQljb25zdCBQeV9zc2l6ZV90IG1heG9mcyA9IGhpbnQgKyAxOwkvKiAmYVswXSBpcyBsb3dlc3QgKi8KLQkJd2hpbGUgKG9mcyA8IG1heG9mcykgewotCQkJSUZMVChrZXksICooYS1vZnMpKSB7Ci0JCQkJbGFzdG9mcyA9IG9mczsKLQkJCQlvZnMgPSAob2ZzIDw8IDEpICsgMTsKLQkJCQlpZiAob2ZzIDw9IDApCS8qIGludCBvdmVyZmxvdyAqLwotCQkJCQlvZnMgPSBtYXhvZnM7Ci0JCQl9Ci0JCQllbHNlCS8qIGFbaGludCAtIG9mc10gPD0ga2V5ICovCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKG9mcyA+IG1heG9mcykKLQkJCW9mcyA9IG1heG9mczsKLQkJLyogVHJhbnNsYXRlIGJhY2sgdG8gcG9zaXRpdmUgb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KLQkJayA9IGxhc3RvZnM7Ci0JCWxhc3RvZnMgPSBoaW50IC0gb2ZzOwotCQlvZnMgPSBoaW50IC0gazsKLQl9Ci0JZWxzZSB7Ci0JCS8qIGFbaGludF0gPD0ga2V5IC0tIGdhbGxvcCByaWdodCwgdW50aWwKLQkJICogYVtoaW50ICsgbGFzdG9mc10gPD0ga2V5IDwgYVtoaW50ICsgb2ZzXQotCQkqLwotCQljb25zdCBQeV9zc2l6ZV90IG1heG9mcyA9IG4gLSBoaW50OwkvKiAmYVtuLTFdIGlzIGhpZ2hlc3QgKi8KLQkJd2hpbGUgKG9mcyA8IG1heG9mcykgewotCQkJSUZMVChrZXksIGFbb2ZzXSkKLQkJCQlicmVhazsKLQkJCS8qIGFbaGludCArIG9mc10gPD0ga2V5ICovCi0JCQlsYXN0b2ZzID0gb2ZzOwotCQkJb2ZzID0gKG9mcyA8PCAxKSArIDE7Ci0JCQlpZiAob2ZzIDw9IDApCS8qIGludCBvdmVyZmxvdyAqLwotCQkJCW9mcyA9IG1heG9mczsKLQkJfQotCQlpZiAob2ZzID4gbWF4b2ZzKQotCQkJb2ZzID0gbWF4b2ZzOwotCQkvKiBUcmFuc2xhdGUgYmFjayB0byBvZmZzZXRzIHJlbGF0aXZlIHRvICZhWzBdLiAqLwotCQlsYXN0b2ZzICs9IGhpbnQ7Ci0JCW9mcyArPSBoaW50OwotCX0KLQlhIC09IGhpbnQ7CisgICAgYSArPSBoaW50OworICAgIGxhc3RvZnMgPSAwOworICAgIG9mcyA9IDE7CisgICAgSUZMVChrZXksICphKSB7CisgICAgICAgIC8qIGtleSA8IGFbaGludF0gLS0gZ2FsbG9wIGxlZnQsIHVudGlsCisgICAgICAgICAqIGFbaGludCAtIG9mc10gPD0ga2V5IDwgYVtoaW50IC0gbGFzdG9mc10KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4b2ZzID0gaGludCArIDE7ICAgICAgICAgICAgIC8qICZhWzBdIGlzIGxvd2VzdCAqLworICAgICAgICB3aGlsZSAob2ZzIDwgbWF4b2ZzKSB7CisgICAgICAgICAgICBJRkxUKGtleSwgKihhLW9mcykpIHsKKyAgICAgICAgICAgICAgICBsYXN0b2ZzID0gb2ZzOworICAgICAgICAgICAgICAgIG9mcyA9IChvZnMgPDwgMSkgKyAxOworICAgICAgICAgICAgICAgIGlmIChvZnMgPD0gMCkgICAgICAgICAgICAgICAgICAgLyogaW50IG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgICAgIG9mcyA9IG1heG9mczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgLyogYVtoaW50IC0gb2ZzXSA8PSBrZXkgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAob2ZzID4gbWF4b2ZzKQorICAgICAgICAgICAgb2ZzID0gbWF4b2ZzOworICAgICAgICAvKiBUcmFuc2xhdGUgYmFjayB0byBwb3NpdGl2ZSBvZmZzZXRzIHJlbGF0aXZlIHRvICZhWzBdLiAqLworICAgICAgICBrID0gbGFzdG9mczsKKyAgICAgICAgbGFzdG9mcyA9IGhpbnQgLSBvZnM7CisgICAgICAgIG9mcyA9IGhpbnQgLSBrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogYVtoaW50XSA8PSBrZXkgLS0gZ2FsbG9wIHJpZ2h0LCB1bnRpbAorICAgICAgICAgKiBhW2hpbnQgKyBsYXN0b2ZzXSA8PSBrZXkgPCBhW2hpbnQgKyBvZnNdCisgICAgICAgICovCisgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4b2ZzID0gbiAtIGhpbnQ7ICAgICAgICAgICAgIC8qICZhW24tMV0gaXMgaGlnaGVzdCAqLworICAgICAgICB3aGlsZSAob2ZzIDwgbWF4b2ZzKSB7CisgICAgICAgICAgICBJRkxUKGtleSwgYVtvZnNdKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyogYVtoaW50ICsgb2ZzXSA8PSBrZXkgKi8KKyAgICAgICAgICAgIGxhc3RvZnMgPSBvZnM7CisgICAgICAgICAgICBvZnMgPSAob2ZzIDw8IDEpICsgMTsKKyAgICAgICAgICAgIGlmIChvZnMgPD0gMCkgICAgICAgICAgICAgICAvKiBpbnQgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBvZnMgPSBtYXhvZnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mcyA+IG1heG9mcykKKyAgICAgICAgICAgIG9mcyA9IG1heG9mczsKKyAgICAgICAgLyogVHJhbnNsYXRlIGJhY2sgdG8gb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KKyAgICAgICAgbGFzdG9mcyArPSBoaW50OworICAgICAgICBvZnMgKz0gaGludDsKKyAgICB9CisgICAgYSAtPSBoaW50OwogCi0JYXNzZXJ0KC0xIDw9IGxhc3RvZnMgJiYgbGFzdG9mcyA8IG9mcyAmJiBvZnMgPD0gbik7Ci0JLyogTm93IGFbbGFzdG9mc10gPD0ga2V5IDwgYVtvZnNdLCBzbyBrZXkgYmVsb25ncyBzb21ld2hlcmUgdG8gdGhlCi0JICogcmlnaHQgb2YgbGFzdG9mcyBidXQgbm8gZmFydGhlciByaWdodCB0aGFuIG9mcy4gIERvIGEgYmluYXJ5Ci0JICogc2VhcmNoLCB3aXRoIGludmFyaWFudCBhW2xhc3RvZnMtMV0gPD0ga2V5IDwgYVtvZnNdLgotCSAqLwotCSsrbGFzdG9mczsKLQl3aGlsZSAobGFzdG9mcyA8IG9mcykgewotCQlQeV9zc2l6ZV90IG0gPSBsYXN0b2ZzICsgKChvZnMgLSBsYXN0b2ZzKSA+PiAxKTsKKyAgICBhc3NlcnQoLTEgPD0gbGFzdG9mcyAmJiBsYXN0b2ZzIDwgb2ZzICYmIG9mcyA8PSBuKTsKKyAgICAvKiBOb3cgYVtsYXN0b2ZzXSA8PSBrZXkgPCBhW29mc10sIHNvIGtleSBiZWxvbmdzIHNvbWV3aGVyZSB0byB0aGUKKyAgICAgKiByaWdodCBvZiBsYXN0b2ZzIGJ1dCBubyBmYXJ0aGVyIHJpZ2h0IHRoYW4gb2ZzLiAgRG8gYSBiaW5hcnkKKyAgICAgKiBzZWFyY2gsIHdpdGggaW52YXJpYW50IGFbbGFzdG9mcy0xXSA8PSBrZXkgPCBhW29mc10uCisgICAgICovCisgICAgKytsYXN0b2ZzOworICAgIHdoaWxlIChsYXN0b2ZzIDwgb2ZzKSB7CisgICAgICAgIFB5X3NzaXplX3QgbSA9IGxhc3RvZnMgKyAoKG9mcyAtIGxhc3RvZnMpID4+IDEpOwogCi0JCUlGTFQoa2V5LCBhW21dKQotCQkJb2ZzID0gbTsJLyoga2V5IDwgYVttXSAqLwotCQllbHNlCi0JCQlsYXN0b2ZzID0gbSsxOwkvKiBhW21dIDw9IGtleSAqLwotCX0KLQlhc3NlcnQobGFzdG9mcyA9PSBvZnMpOwkJLyogc28gYVtvZnMtMV0gPD0ga2V5IDwgYVtvZnNdICovCi0JcmV0dXJuIG9mczsKKyAgICAgICAgSUZMVChrZXksIGFbbV0pCisgICAgICAgICAgICBvZnMgPSBtOyAgICAgICAgICAgICAgICAgICAgLyoga2V5IDwgYVttXSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBsYXN0b2ZzID0gbSsxOyAgICAgICAgICAgICAgLyogYVttXSA8PSBrZXkgKi8KKyAgICB9CisgICAgYXNzZXJ0KGxhc3RvZnMgPT0gb2ZzKTsgICAgICAgICAgICAgLyogc28gYVtvZnMtMV0gPD0ga2V5IDwgYVtvZnNdICovCisgICAgcmV0dXJuIG9mczsKIAogZmFpbDoKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBpbiBhIE1lcmdlU3RhdGUncyBwZW5kaW5nLXJ1bnMgc3RhY2suCkBAIC0xMzU3LDUyICsxMzU3LDUyIEBACiAgKiBhIGNvbnZlbmllbnQgd2F5IHRvIHBhc3Mgc3RhdGUgYXJvdW5kIGFtb25nIHRoZSBoZWxwZXIgZnVuY3Rpb25zLgogICovCiBzdHJ1Y3Qgc19zbGljZSB7Ci0JUHlPYmplY3QgKipiYXNlOwotCVB5X3NzaXplX3QgbGVuOworICAgIFB5T2JqZWN0ICoqYmFzZTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIH07CiAKIHR5cGVkZWYgc3RydWN0IHNfTWVyZ2VTdGF0ZSB7Ci0JLyogVGhlIHVzZXItc3VwcGxpZWQgY29tcGFyaXNvbiBmdW5jdGlvbi4gb3IgTlVMTCBpZiBub25lIGdpdmVuLiAqLwotCVB5T2JqZWN0ICpjb21wYXJlOworICAgIC8qIFRoZSB1c2VyLXN1cHBsaWVkIGNvbXBhcmlzb24gZnVuY3Rpb24uIG9yIE5VTEwgaWYgbm9uZSBnaXZlbi4gKi8KKyAgICBQeU9iamVjdCAqY29tcGFyZTsKIAotCS8qIFRoaXMgY29udHJvbHMgd2hlbiB3ZSBnZXQgKmludG8qIGdhbGxvcGluZyBtb2RlLiAgSXQncyBpbml0aWFsaXplZAotCSAqIHRvIE1JTl9HQUxMT1AuICBtZXJnZV9sbyBhbmQgbWVyZ2VfaGkgdGVuZCB0byBudWRnZSBpdCBoaWdoZXIgZm9yCi0JICogcmFuZG9tIGRhdGEsIGFuZCBsb3dlciBmb3IgaGlnaGx5IHN0cnVjdHVyZWQgZGF0YS4KLQkgKi8KLQlQeV9zc2l6ZV90IG1pbl9nYWxsb3A7CisgICAgLyogVGhpcyBjb250cm9scyB3aGVuIHdlIGdldCAqaW50byogZ2FsbG9waW5nIG1vZGUuICBJdCdzIGluaXRpYWxpemVkCisgICAgICogdG8gTUlOX0dBTExPUC4gIG1lcmdlX2xvIGFuZCBtZXJnZV9oaSB0ZW5kIHRvIG51ZGdlIGl0IGhpZ2hlciBmb3IKKyAgICAgKiByYW5kb20gZGF0YSwgYW5kIGxvd2VyIGZvciBoaWdobHkgc3RydWN0dXJlZCBkYXRhLgorICAgICAqLworICAgIFB5X3NzaXplX3QgbWluX2dhbGxvcDsKIAotCS8qICdhJyBpcyB0ZW1wIHN0b3JhZ2UgdG8gaGVscCB3aXRoIG1lcmdlcy4gIEl0IGNvbnRhaW5zIHJvb20gZm9yCi0JICogYWxsb2NlZCBlbnRyaWVzLgotCSAqLwotCVB5T2JqZWN0ICoqYTsJLyogbWF5IHBvaW50IHRvIHRlbXBhcnJheSBiZWxvdyAqLwotCVB5X3NzaXplX3QgYWxsb2NlZDsKKyAgICAvKiAnYScgaXMgdGVtcCBzdG9yYWdlIHRvIGhlbHAgd2l0aCBtZXJnZXMuICBJdCBjb250YWlucyByb29tIGZvcgorICAgICAqIGFsbG9jZWQgZW50cmllcy4KKyAgICAgKi8KKyAgICBQeU9iamVjdCAqKmE7ICAgICAgIC8qIG1heSBwb2ludCB0byB0ZW1wYXJyYXkgYmVsb3cgKi8KKyAgICBQeV9zc2l6ZV90IGFsbG9jZWQ7CiAKLQkvKiBBIHN0YWNrIG9mIG4gcGVuZGluZyBydW5zIHlldCB0byBiZSBtZXJnZWQuICBSdW4gI2kgc3RhcnRzIGF0Ci0JICogYWRkcmVzcyBiYXNlW2ldIGFuZCBleHRlbmRzIGZvciBsZW5baV0gZWxlbWVudHMuICBJdCdzIGFsd2F5cwotCSAqIHRydWUgKHNvIGxvbmcgYXMgdGhlIGluZGljZXMgYXJlIGluIGJvdW5kcykgdGhhdAotCSAqCi0JICogICAgIHBlbmRpbmdbaV0uYmFzZSArIHBlbmRpbmdbaV0ubGVuID09IHBlbmRpbmdbaSsxXS5iYXNlCi0JICoKLQkgKiBzbyB3ZSBjb3VsZCBjdXQgdGhlIHN0b3JhZ2UgZm9yIHRoaXMsIGJ1dCBpdCdzIGEgbWlub3IgYW1vdW50LAotCSAqIGFuZCBrZWVwaW5nIGFsbCB0aGUgaW5mbyBleHBsaWNpdCBzaW1wbGlmaWVzIHRoZSBjb2RlLgotCSAqLwotCWludCBuOwotCXN0cnVjdCBzX3NsaWNlIHBlbmRpbmdbTUFYX01FUkdFX1BFTkRJTkddOworICAgIC8qIEEgc3RhY2sgb2YgbiBwZW5kaW5nIHJ1bnMgeWV0IHRvIGJlIG1lcmdlZC4gIFJ1biAjaSBzdGFydHMgYXQKKyAgICAgKiBhZGRyZXNzIGJhc2VbaV0gYW5kIGV4dGVuZHMgZm9yIGxlbltpXSBlbGVtZW50cy4gIEl0J3MgYWx3YXlzCisgICAgICogdHJ1ZSAoc28gbG9uZyBhcyB0aGUgaW5kaWNlcyBhcmUgaW4gYm91bmRzKSB0aGF0CisgICAgICoKKyAgICAgKiAgICAgcGVuZGluZ1tpXS5iYXNlICsgcGVuZGluZ1tpXS5sZW4gPT0gcGVuZGluZ1tpKzFdLmJhc2UKKyAgICAgKgorICAgICAqIHNvIHdlIGNvdWxkIGN1dCB0aGUgc3RvcmFnZSBmb3IgdGhpcywgYnV0IGl0J3MgYSBtaW5vciBhbW91bnQsCisgICAgICogYW5kIGtlZXBpbmcgYWxsIHRoZSBpbmZvIGV4cGxpY2l0IHNpbXBsaWZpZXMgdGhlIGNvZGUuCisgICAgICovCisgICAgaW50IG47CisgICAgc3RydWN0IHNfc2xpY2UgcGVuZGluZ1tNQVhfTUVSR0VfUEVORElOR107CiAKLQkvKiAnYScgcG9pbnRzIHRvIHRoaXMgd2hlbiBwb3NzaWJsZSwgcmF0aGVyIHRoYW4gbXVjayB3aXRoIG1hbGxvYy4gKi8KLQlQeU9iamVjdCAqdGVtcGFycmF5W01FUkdFU1RBVEVfVEVNUF9TSVpFXTsKKyAgICAvKiAnYScgcG9pbnRzIHRvIHRoaXMgd2hlbiBwb3NzaWJsZSwgcmF0aGVyIHRoYW4gbXVjayB3aXRoIG1hbGxvYy4gKi8KKyAgICBQeU9iamVjdCAqdGVtcGFycmF5W01FUkdFU1RBVEVfVEVNUF9TSVpFXTsKIH0gTWVyZ2VTdGF0ZTsKIAogLyogQ29uY2VwdHVhbGx5IGEgTWVyZ2VTdGF0ZSdzIGNvbnN0cnVjdG9yLiAqLwogc3RhdGljIHZvaWQKIG1lcmdlX2luaXQoTWVyZ2VTdGF0ZSAqbXMsIFB5T2JqZWN0ICpjb21wYXJlKQogewotCWFzc2VydChtcyAhPSBOVUxMKTsKLQltcy0+Y29tcGFyZSA9IGNvbXBhcmU7Ci0JbXMtPmEgPSBtcy0+dGVtcGFycmF5OwotCW1zLT5hbGxvY2VkID0gTUVSR0VTVEFURV9URU1QX1NJWkU7Ci0JbXMtPm4gPSAwOwotCW1zLT5taW5fZ2FsbG9wID0gTUlOX0dBTExPUDsKKyAgICBhc3NlcnQobXMgIT0gTlVMTCk7CisgICAgbXMtPmNvbXBhcmUgPSBjb21wYXJlOworICAgIG1zLT5hID0gbXMtPnRlbXBhcnJheTsKKyAgICBtcy0+YWxsb2NlZCA9IE1FUkdFU1RBVEVfVEVNUF9TSVpFOworICAgIG1zLT5uID0gMDsKKyAgICBtcy0+bWluX2dhbGxvcCA9IE1JTl9HQUxMT1A7CiB9CiAKIC8qIEZyZWUgYWxsIHRoZSB0ZW1wIG1lbW9yeSBvd25lZCBieSB0aGUgTWVyZ2VTdGF0ZS4gIFRoaXMgbXVzdCBiZSBjYWxsZWQKQEAgLTE0MTIsMTEgKzE0MTIsMTEgQEAKIHN0YXRpYyB2b2lkCiBtZXJnZV9mcmVlbWVtKE1lcmdlU3RhdGUgKm1zKQogewotCWFzc2VydChtcyAhPSBOVUxMKTsKLQlpZiAobXMtPmEgIT0gbXMtPnRlbXBhcnJheSkKLQkJUHlNZW1fRnJlZShtcy0+YSk7Ci0JbXMtPmEgPSBtcy0+dGVtcGFycmF5OwotCW1zLT5hbGxvY2VkID0gTUVSR0VTVEFURV9URU1QX1NJWkU7CisgICAgYXNzZXJ0KG1zICE9IE5VTEwpOworICAgIGlmIChtcy0+YSAhPSBtcy0+dGVtcGFycmF5KQorICAgICAgICBQeU1lbV9GcmVlKG1zLT5hKTsKKyAgICBtcy0+YSA9IG1zLT50ZW1wYXJyYXk7CisgICAgbXMtPmFsbG9jZWQgPSBNRVJHRVNUQVRFX1RFTVBfU0laRTsKIH0KIAogLyogRW5zdXJlIGVub3VnaCB0ZW1wIG1lbW9yeSBmb3IgJ25lZWQnIGFycmF5IHNsb3RzIGlzIGF2YWlsYWJsZS4KQEAgLTE0MjUsMjggKzE0MjUsMjggQEAKIHN0YXRpYyBpbnQKIG1lcmdlX2dldG1lbShNZXJnZVN0YXRlICptcywgUHlfc3NpemVfdCBuZWVkKQogewotCWFzc2VydChtcyAhPSBOVUxMKTsKLQlpZiAobmVlZCA8PSBtcy0+YWxsb2NlZCkKLQkJcmV0dXJuIDA7Ci0JLyogRG9uJ3QgcmVhbGxvYyEgIFRoYXQgY2FuIGNvc3QgY3ljbGVzIHRvIGNvcHkgdGhlIG9sZCBkYXRhLCBidXQKLQkgKiB3ZSBkb24ndCBjYXJlIHdoYXQncyBpbiB0aGUgYmxvY2suCi0JICovCi0JbWVyZ2VfZnJlZW1lbShtcyk7Ci0JaWYgKChzaXplX3QpbmVlZCA+IFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKFB5T2JqZWN0KikpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltcy0+YSA9IChQeU9iamVjdCAqKilQeU1lbV9NYWxsb2MobmVlZCAqIHNpemVvZihQeU9iamVjdCopKTsKLQlpZiAobXMtPmEpIHsKLQkJbXMtPmFsbG9jZWQgPSBuZWVkOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlFcnJfTm9NZW1vcnkoKTsKLQltZXJnZV9mcmVlbWVtKG1zKTsJLyogcmVzZXQgdG8gc2FuZSBzdGF0ZSAqLwotCXJldHVybiAtMTsKKyAgICBhc3NlcnQobXMgIT0gTlVMTCk7CisgICAgaWYgKG5lZWQgPD0gbXMtPmFsbG9jZWQpCisgICAgICAgIHJldHVybiAwOworICAgIC8qIERvbid0IHJlYWxsb2MhICBUaGF0IGNhbiBjb3N0IGN5Y2xlcyB0byBjb3B5IHRoZSBvbGQgZGF0YSwgYnV0CisgICAgICogd2UgZG9uJ3QgY2FyZSB3aGF0J3MgaW4gdGhlIGJsb2NrLgorICAgICAqLworICAgIG1lcmdlX2ZyZWVtZW0obXMpOworICAgIGlmICgoc2l6ZV90KW5lZWQgPiBQWV9TU0laRV9UX01BWCAvIHNpemVvZihQeU9iamVjdCopKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbXMtPmEgPSAoUHlPYmplY3QgKiopUHlNZW1fTWFsbG9jKG5lZWQgKiBzaXplb2YoUHlPYmplY3QqKSk7CisgICAgaWYgKG1zLT5hKSB7CisgICAgICAgIG1zLT5hbGxvY2VkID0gbmVlZDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgbWVyZ2VfZnJlZW1lbShtcyk7ICAgICAgICAgIC8qIHJlc2V0IHRvIHNhbmUgc3RhdGUgKi8KKyAgICByZXR1cm4gLTE7CiB9Ci0jZGVmaW5lIE1FUkdFX0dFVE1FTShNUywgTkVFRCkgKChORUVEKSA8PSAoTVMpLT5hbGxvY2VkID8gMCA6CVwKLQkJCQltZXJnZV9nZXRtZW0oTVMsIE5FRUQpKQorI2RlZmluZSBNRVJHRV9HRVRNRU0oTVMsIE5FRUQpICgoTkVFRCkgPD0gKE1TKS0+YWxsb2NlZCA/IDAgOiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VfZ2V0bWVtKE1TLCBORUVEKSkKIAogLyogTWVyZ2UgdGhlIG5hIGVsZW1lbnRzIHN0YXJ0aW5nIGF0IHBhIHdpdGggdGhlIG5iIGVsZW1lbnRzIHN0YXJ0aW5nIGF0IHBiCiAgKiBpbiBhIHN0YWJsZSB3YXksIGluLXBsYWNlLiAgbmEgYW5kIG5iIG11c3QgYmUgPiAwLCBhbmQgcGEgKyBuYSA9PSBwYi4KQEAgLTE0NTgsMTI3ICsxNDU4LDEyNyBAQAogbWVyZ2VfbG8oTWVyZ2VTdGF0ZSAqbXMsIFB5T2JqZWN0ICoqcGEsIFB5X3NzaXplX3QgbmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipwYiwgUHlfc3NpemVfdCBuYikKIHsKLQlQeV9zc2l6ZV90IGs7Ci0JUHlPYmplY3QgKmNvbXBhcmU7Ci0JUHlPYmplY3QgKipkZXN0OwotCWludCByZXN1bHQgPSAtMTsJLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLwotCVB5X3NzaXplX3QgbWluX2dhbGxvcDsKKyAgICBQeV9zc2l6ZV90IGs7CisgICAgUHlPYmplY3QgKmNvbXBhcmU7CisgICAgUHlPYmplY3QgKipkZXN0OworICAgIGludCByZXN1bHQgPSAtMTsgICAgICAgICAgICAvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCisgICAgUHlfc3NpemVfdCBtaW5fZ2FsbG9wOwogCi0JYXNzZXJ0KG1zICYmIHBhICYmIHBiICYmIG5hID4gMCAmJiBuYiA+IDAgJiYgcGEgKyBuYSA9PSBwYik7Ci0JaWYgKE1FUkdFX0dFVE1FTShtcywgbmEpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShtcy0+YSwgcGEsIG5hICogc2l6ZW9mKFB5T2JqZWN0KikpOwotCWRlc3QgPSBwYTsKLQlwYSA9IG1zLT5hOworICAgIGFzc2VydChtcyAmJiBwYSAmJiBwYiAmJiBuYSA+IDAgJiYgbmIgPiAwICYmIHBhICsgbmEgPT0gcGIpOworICAgIGlmIChNRVJHRV9HRVRNRU0obXMsIG5hKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBtZW1jcHkobXMtPmEsIHBhLCBuYSAqIHNpemVvZihQeU9iamVjdCopKTsKKyAgICBkZXN0ID0gcGE7CisgICAgcGEgPSBtcy0+YTsKIAotCSpkZXN0KysgPSAqcGIrKzsKLQktLW5iOwotCWlmIChuYiA9PSAwKQotCQlnb3RvIFN1Y2NlZWQ7Ci0JaWYgKG5hID09IDEpCi0JCWdvdG8gQ29weUI7CisgICAgKmRlc3QrKyA9ICpwYisrOworICAgIC0tbmI7CisgICAgaWYgKG5iID09IDApCisgICAgICAgIGdvdG8gU3VjY2VlZDsKKyAgICBpZiAobmEgPT0gMSkKKyAgICAgICAgZ290byBDb3B5QjsKIAotCW1pbl9nYWxsb3AgPSBtcy0+bWluX2dhbGxvcDsKLQljb21wYXJlID0gbXMtPmNvbXBhcmU7Ci0JZm9yICg7OykgewotCQlQeV9zc2l6ZV90IGFjb3VudCA9IDA7CS8qICMgb2YgdGltZXMgQSB3b24gaW4gYSByb3cgKi8KLQkJUHlfc3NpemVfdCBiY291bnQgPSAwOwkvKiAjIG9mIHRpbWVzIEIgd29uIGluIGEgcm93ICovCisgICAgbWluX2dhbGxvcCA9IG1zLT5taW5fZ2FsbG9wOworICAgIGNvbXBhcmUgPSBtcy0+Y29tcGFyZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X3NzaXplX3QgYWNvdW50ID0gMDsgICAgICAgICAgLyogIyBvZiB0aW1lcyBBIHdvbiBpbiBhIHJvdyAqLworICAgICAgICBQeV9zc2l6ZV90IGJjb3VudCA9IDA7ICAgICAgICAgIC8qICMgb2YgdGltZXMgQiB3b24gaW4gYSByb3cgKi8KIAotCQkvKiBEbyB0aGUgc3RyYWlnaHRmb3J3YXJkIHRoaW5nIHVudGlsIChpZiBldmVyKSBvbmUgcnVuCi0JCSAqIGFwcGVhcnMgdG8gd2luIGNvbnNpc3RlbnRseS4KLQkJICovCi0gCQlmb3IgKDs7KSB7Ci0gCQkJYXNzZXJ0KG5hID4gMSAmJiBuYiA+IDApOwotCSAJCWsgPSBJU0xUKCpwYiwgKnBhLCBjb21wYXJlKTsKLQkJCWlmIChrKSB7Ci0JCQkJaWYgKGsgPCAwKQotCQkJCQlnb3RvIEZhaWw7Ci0JCQkJKmRlc3QrKyA9ICpwYisrOwotCQkJCSsrYmNvdW50OwotCQkJCWFjb3VudCA9IDA7Ci0JCQkJLS1uYjsKLQkJCQlpZiAobmIgPT0gMCkKLQkJCQkJZ290byBTdWNjZWVkOwotCQkJCWlmIChiY291bnQgPj0gbWluX2dhbGxvcCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkqZGVzdCsrID0gKnBhKys7Ci0JCQkJKythY291bnQ7Ci0JCQkJYmNvdW50ID0gMDsKLQkJCQktLW5hOwotCQkJCWlmIChuYSA9PSAxKQotCQkJCQlnb3RvIENvcHlCOwotCQkJCWlmIChhY291bnQgPj0gbWluX2dhbGxvcCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0gCQl9CisgICAgICAgIC8qIERvIHRoZSBzdHJhaWdodGZvcndhcmQgdGhpbmcgdW50aWwgKGlmIGV2ZXIpIG9uZSBydW4KKyAgICAgICAgICogYXBwZWFycyB0byB3aW4gY29uc2lzdGVudGx5LgorICAgICAgICAgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgYXNzZXJ0KG5hID4gMSAmJiBuYiA+IDApOworICAgICAgICAgICAgayA9IElTTFQoKnBiLCAqcGEsIGNvbXBhcmUpOworICAgICAgICAgICAgaWYgKGspIHsKKyAgICAgICAgICAgICAgICBpZiAoayA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gKnBiKys7CisgICAgICAgICAgICAgICAgKytiY291bnQ7CisgICAgICAgICAgICAgICAgYWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAtLW5iOworICAgICAgICAgICAgICAgIGlmIChuYiA9PSAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIFN1Y2NlZWQ7CisgICAgICAgICAgICAgICAgaWYgKGJjb3VudCA+PSBtaW5fZ2FsbG9wKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICpkZXN0KysgPSAqcGErKzsKKyAgICAgICAgICAgICAgICArK2Fjb3VudDsKKyAgICAgICAgICAgICAgICBiY291bnQgPSAwOworICAgICAgICAgICAgICAgIC0tbmE7CisgICAgICAgICAgICAgICAgaWYgKG5hID09IDEpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gQ29weUI7CisgICAgICAgICAgICAgICAgaWYgKGFjb3VudCA+PSBtaW5fZ2FsbG9wKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8qIE9uZSBydW4gaXMgd2lubmluZyBzbyBjb25zaXN0ZW50bHkgdGhhdCBnYWxsb3BpbmcgbWF5Ci0JCSAqIGJlIGEgaHVnZSB3aW4uICBTbyB0cnkgdGhhdCwgYW5kIGNvbnRpbnVlIGdhbGxvcGluZyB1bnRpbAotCQkgKiAoaWYgZXZlcikgbmVpdGhlciBydW4gYXBwZWFycyB0byBiZSB3aW5uaW5nIGNvbnNpc3RlbnRseQotCQkgKiBhbnltb3JlLgotCQkgKi8KLQkJKyttaW5fZ2FsbG9wOwotCQlkbyB7Ci0gCQkJYXNzZXJ0KG5hID4gMSAmJiBuYiA+IDApOwotCQkJbWluX2dhbGxvcCAtPSBtaW5fZ2FsbG9wID4gMTsKLQkgCQltcy0+bWluX2dhbGxvcCA9IG1pbl9nYWxsb3A7Ci0JCQlrID0gZ2FsbG9wX3JpZ2h0KCpwYiwgcGEsIG5hLCAwLCBjb21wYXJlKTsKLQkJCWFjb3VudCA9IGs7Ci0JCQlpZiAoaykgewotCQkJCWlmIChrIDwgMCkKLQkJCQkJZ290byBGYWlsOwotCQkJCW1lbWNweShkZXN0LCBwYSwgayAqIHNpemVvZihQeU9iamVjdCAqKSk7Ci0JCQkJZGVzdCArPSBrOwotCQkJCXBhICs9IGs7Ci0JCQkJbmEgLT0gazsKLQkJCQlpZiAobmEgPT0gMSkKLQkJCQkJZ290byBDb3B5QjsKLQkJCQkvKiBuYT09MCBpcyBpbXBvc3NpYmxlIG5vdyBpZiB0aGUgY29tcGFyaXNvbgotCQkJCSAqIGZ1bmN0aW9uIGlzIGNvbnNpc3RlbnQsIGJ1dCB3ZSBjYW4ndCBhc3N1bWUKLQkJCQkgKiB0aGF0IGl0IGlzLgotCQkJCSAqLwotCQkJCWlmIChuYSA9PSAwKQotCQkJCQlnb3RvIFN1Y2NlZWQ7Ci0JCQl9Ci0JCQkqZGVzdCsrID0gKnBiKys7Ci0JCQktLW5iOwotCQkJaWYgKG5iID09IDApCi0JCQkJZ290byBTdWNjZWVkOworICAgICAgICAvKiBPbmUgcnVuIGlzIHdpbm5pbmcgc28gY29uc2lzdGVudGx5IHRoYXQgZ2FsbG9waW5nIG1heQorICAgICAgICAgKiBiZSBhIGh1Z2Ugd2luLiAgU28gdHJ5IHRoYXQsIGFuZCBjb250aW51ZSBnYWxsb3BpbmcgdW50aWwKKyAgICAgICAgICogKGlmIGV2ZXIpIG5laXRoZXIgcnVuIGFwcGVhcnMgdG8gYmUgd2lubmluZyBjb25zaXN0ZW50bHkKKyAgICAgICAgICogYW55bW9yZS4KKyAgICAgICAgICovCisgICAgICAgICsrbWluX2dhbGxvcDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYXNzZXJ0KG5hID4gMSAmJiBuYiA+IDApOworICAgICAgICAgICAgbWluX2dhbGxvcCAtPSBtaW5fZ2FsbG9wID4gMTsKKyAgICAgICAgICAgIG1zLT5taW5fZ2FsbG9wID0gbWluX2dhbGxvcDsKKyAgICAgICAgICAgIGsgPSBnYWxsb3BfcmlnaHQoKnBiLCBwYSwgbmEsIDAsIGNvbXBhcmUpOworICAgICAgICAgICAgYWNvdW50ID0gazsKKyAgICAgICAgICAgIGlmIChrKSB7CisgICAgICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRlc3QsIHBhLCBrICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICAgICAgICAgICAgICBkZXN0ICs9IGs7CisgICAgICAgICAgICAgICAgcGEgKz0gazsKKyAgICAgICAgICAgICAgICBuYSAtPSBrOworICAgICAgICAgICAgICAgIGlmIChuYSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBnb3RvIENvcHlCOworICAgICAgICAgICAgICAgIC8qIG5hPT0wIGlzIGltcG9zc2libGUgbm93IGlmIHRoZSBjb21wYXJpc29uCisgICAgICAgICAgICAgICAgICogZnVuY3Rpb24gaXMgY29uc2lzdGVudCwgYnV0IHdlIGNhbid0IGFzc3VtZQorICAgICAgICAgICAgICAgICAqIHRoYXQgaXQgaXMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKG5hID09IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VjY2VlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0KysgPSAqcGIrKzsKKyAgICAgICAgICAgIC0tbmI7CisgICAgICAgICAgICBpZiAobmIgPT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIFN1Y2NlZWQ7CiAKLSAJCQlrID0gZ2FsbG9wX2xlZnQoKnBhLCBwYiwgbmIsIDAsIGNvbXBhcmUpOwotIAkJCWJjb3VudCA9IGs7Ci0JCQlpZiAoaykgewotCQkJCWlmIChrIDwgMCkKLQkJCQkJZ290byBGYWlsOwotCQkJCW1lbW1vdmUoZGVzdCwgcGIsIGsgKiBzaXplb2YoUHlPYmplY3QgKikpOwotCQkJCWRlc3QgKz0gazsKLQkJCQlwYiArPSBrOwotCQkJCW5iIC09IGs7Ci0JCQkJaWYgKG5iID09IDApCi0JCQkJCWdvdG8gU3VjY2VlZDsKLQkJCX0KLQkJCSpkZXN0KysgPSAqcGErKzsKLQkJCS0tbmE7Ci0JCQlpZiAobmEgPT0gMSkKLQkJCQlnb3RvIENvcHlCOwotIAkJfSB3aGlsZSAoYWNvdW50ID49IE1JTl9HQUxMT1AgfHwgYmNvdW50ID49IE1JTl9HQUxMT1ApOwotIAkJKyttaW5fZ2FsbG9wOwkvKiBwZW5hbGl6ZSBpdCBmb3IgbGVhdmluZyBnYWxsb3BpbmcgbW9kZSAqLwotIAkJbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOwotIAl9CisgICAgICAgICAgICBrID0gZ2FsbG9wX2xlZnQoKnBhLCBwYiwgbmIsIDAsIGNvbXBhcmUpOworICAgICAgICAgICAgYmNvdW50ID0gazsKKyAgICAgICAgICAgIGlmIChrKSB7CisgICAgICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICAgICAgbWVtbW92ZShkZXN0LCBwYiwgayAqIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgICAgICAgICAgZGVzdCArPSBrOworICAgICAgICAgICAgICAgIHBiICs9IGs7CisgICAgICAgICAgICAgICAgbmIgLT0gazsKKyAgICAgICAgICAgICAgICBpZiAobmIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBTdWNjZWVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3QrKyA9ICpwYSsrOworICAgICAgICAgICAgLS1uYTsKKyAgICAgICAgICAgIGlmIChuYSA9PSAxKQorICAgICAgICAgICAgICAgIGdvdG8gQ29weUI7CisgICAgICAgIH0gd2hpbGUgKGFjb3VudCA+PSBNSU5fR0FMTE9QIHx8IGJjb3VudCA+PSBNSU5fR0FMTE9QKTsKKyAgICAgICAgKyttaW5fZ2FsbG9wOyAgICAgICAgICAgLyogcGVuYWxpemUgaXQgZm9yIGxlYXZpbmcgZ2FsbG9waW5nIG1vZGUgKi8KKyAgICAgICAgbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOworICAgIH0KIFN1Y2NlZWQ6Ci0JcmVzdWx0ID0gMDsKKyAgICByZXN1bHQgPSAwOwogRmFpbDoKLQlpZiAobmEpCi0JCW1lbWNweShkZXN0LCBwYSwgbmEgKiBzaXplb2YoUHlPYmplY3QqKSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAobmEpCisgICAgICAgIG1lbWNweShkZXN0LCBwYSwgbmEgKiBzaXplb2YoUHlPYmplY3QqKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIENvcHlCOgotCWFzc2VydChuYSA9PSAxICYmIG5iID4gMCk7Ci0JLyogVGhlIGxhc3QgZWxlbWVudCBvZiBwYSBiZWxvbmdzIGF0IHRoZSBlbmQgb2YgdGhlIG1lcmdlLiAqLwotCW1lbW1vdmUoZGVzdCwgcGIsIG5iICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKLQlkZXN0W25iXSA9ICpwYTsKLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQobmEgPT0gMSAmJiBuYiA+IDApOworICAgIC8qIFRoZSBsYXN0IGVsZW1lbnQgb2YgcGEgYmVsb25ncyBhdCB0aGUgZW5kIG9mIHRoZSBtZXJnZS4gKi8KKyAgICBtZW1tb3ZlKGRlc3QsIHBiLCBuYiAqIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgZGVzdFtuYl0gPSAqcGE7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIE1lcmdlIHRoZSBuYSBlbGVtZW50cyBzdGFydGluZyBhdCBwYSB3aXRoIHRoZSBuYiBlbGVtZW50cyBzdGFydGluZyBhdCBwYgpAQCAtMTU5MCwxMzYgKzE1OTAsMTM2IEBACiBzdGF0aWMgUHlfc3NpemVfdAogbWVyZ2VfaGkoTWVyZ2VTdGF0ZSAqbXMsIFB5T2JqZWN0ICoqcGEsIFB5X3NzaXplX3QgbmEsIFB5T2JqZWN0ICoqcGIsIFB5X3NzaXplX3QgbmIpCiB7Ci0JUHlfc3NpemVfdCBrOwotCVB5T2JqZWN0ICpjb21wYXJlOwotCVB5T2JqZWN0ICoqZGVzdDsKLQlpbnQgcmVzdWx0ID0gLTE7CS8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KLQlQeU9iamVjdCAqKmJhc2VhOwotCVB5T2JqZWN0ICoqYmFzZWI7Ci0JUHlfc3NpemVfdCBtaW5fZ2FsbG9wOworICAgIFB5X3NzaXplX3QgazsKKyAgICBQeU9iamVjdCAqY29tcGFyZTsKKyAgICBQeU9iamVjdCAqKmRlc3Q7CisgICAgaW50IHJlc3VsdCA9IC0xOyAgICAgICAgICAgIC8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KKyAgICBQeU9iamVjdCAqKmJhc2VhOworICAgIFB5T2JqZWN0ICoqYmFzZWI7CisgICAgUHlfc3NpemVfdCBtaW5fZ2FsbG9wOwogCi0JYXNzZXJ0KG1zICYmIHBhICYmIHBiICYmIG5hID4gMCAmJiBuYiA+IDAgJiYgcGEgKyBuYSA9PSBwYik7Ci0JaWYgKE1FUkdFX0dFVE1FTShtcywgbmIpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWRlc3QgPSBwYiArIG5iIC0gMTsKLQltZW1jcHkobXMtPmEsIHBiLCBuYiAqIHNpemVvZihQeU9iamVjdCopKTsKLQliYXNlYSA9IHBhOwotCWJhc2ViID0gbXMtPmE7Ci0JcGIgPSBtcy0+YSArIG5iIC0gMTsKLQlwYSArPSBuYSAtIDE7CisgICAgYXNzZXJ0KG1zICYmIHBhICYmIHBiICYmIG5hID4gMCAmJiBuYiA+IDAgJiYgcGEgKyBuYSA9PSBwYik7CisgICAgaWYgKE1FUkdFX0dFVE1FTShtcywgbmIpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGRlc3QgPSBwYiArIG5iIC0gMTsKKyAgICBtZW1jcHkobXMtPmEsIHBiLCBuYiAqIHNpemVvZihQeU9iamVjdCopKTsKKyAgICBiYXNlYSA9IHBhOworICAgIGJhc2ViID0gbXMtPmE7CisgICAgcGIgPSBtcy0+YSArIG5iIC0gMTsKKyAgICBwYSArPSBuYSAtIDE7CiAKLQkqZGVzdC0tID0gKnBhLS07Ci0JLS1uYTsKLQlpZiAobmEgPT0gMCkKLQkJZ290byBTdWNjZWVkOwotCWlmIChuYiA9PSAxKQotCQlnb3RvIENvcHlBOworICAgICpkZXN0LS0gPSAqcGEtLTsKKyAgICAtLW5hOworICAgIGlmIChuYSA9PSAwKQorICAgICAgICBnb3RvIFN1Y2NlZWQ7CisgICAgaWYgKG5iID09IDEpCisgICAgICAgIGdvdG8gQ29weUE7CiAKLQltaW5fZ2FsbG9wID0gbXMtPm1pbl9nYWxsb3A7Ci0JY29tcGFyZSA9IG1zLT5jb21wYXJlOwotCWZvciAoOzspIHsKLQkJUHlfc3NpemVfdCBhY291bnQgPSAwOwkvKiAjIG9mIHRpbWVzIEEgd29uIGluIGEgcm93ICovCi0JCVB5X3NzaXplX3QgYmNvdW50ID0gMDsJLyogIyBvZiB0aW1lcyBCIHdvbiBpbiBhIHJvdyAqLworICAgIG1pbl9nYWxsb3AgPSBtcy0+bWluX2dhbGxvcDsKKyAgICBjb21wYXJlID0gbXMtPmNvbXBhcmU7CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9zc2l6ZV90IGFjb3VudCA9IDA7ICAgICAgICAgIC8qICMgb2YgdGltZXMgQSB3b24gaW4gYSByb3cgKi8KKyAgICAgICAgUHlfc3NpemVfdCBiY291bnQgPSAwOyAgICAgICAgICAvKiAjIG9mIHRpbWVzIEIgd29uIGluIGEgcm93ICovCiAKLQkJLyogRG8gdGhlIHN0cmFpZ2h0Zm9yd2FyZCB0aGluZyB1bnRpbCAoaWYgZXZlcikgb25lIHJ1bgotCQkgKiBhcHBlYXJzIHRvIHdpbiBjb25zaXN0ZW50bHkuCi0JCSAqLwotIAkJZm9yICg7OykgewotIAkJCWFzc2VydChuYSA+IDAgJiYgbmIgPiAxKTsKLQkgCQlrID0gSVNMVCgqcGIsICpwYSwgY29tcGFyZSk7Ci0JCQlpZiAoaykgewotCQkJCWlmIChrIDwgMCkKLQkJCQkJZ290byBGYWlsOwotCQkJCSpkZXN0LS0gPSAqcGEtLTsKLQkJCQkrK2Fjb3VudDsKLQkJCQliY291bnQgPSAwOwotCQkJCS0tbmE7Ci0JCQkJaWYgKG5hID09IDApCi0JCQkJCWdvdG8gU3VjY2VlZDsKLQkJCQlpZiAoYWNvdW50ID49IG1pbl9nYWxsb3ApCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJKmRlc3QtLSA9ICpwYi0tOwotCQkJCSsrYmNvdW50OwotCQkJCWFjb3VudCA9IDA7Ci0JCQkJLS1uYjsKLQkJCQlpZiAobmIgPT0gMSkKLQkJCQkJZ290byBDb3B5QTsKLQkJCQlpZiAoYmNvdW50ID49IG1pbl9nYWxsb3ApCi0JCQkJCWJyZWFrOwotCQkJfQotIAkJfQorICAgICAgICAvKiBEbyB0aGUgc3RyYWlnaHRmb3J3YXJkIHRoaW5nIHVudGlsIChpZiBldmVyKSBvbmUgcnVuCisgICAgICAgICAqIGFwcGVhcnMgdG8gd2luIGNvbnNpc3RlbnRseS4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGFzc2VydChuYSA+IDAgJiYgbmIgPiAxKTsKKyAgICAgICAgICAgIGsgPSBJU0xUKCpwYiwgKnBhLCBjb21wYXJlKTsKKyAgICAgICAgICAgIGlmIChrKSB7CisgICAgICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICAgICAgKmRlc3QtLSA9ICpwYS0tOworICAgICAgICAgICAgICAgICsrYWNvdW50OworICAgICAgICAgICAgICAgIGJjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgLS1uYTsKKyAgICAgICAgICAgICAgICBpZiAobmEgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBTdWNjZWVkOworICAgICAgICAgICAgICAgIGlmIChhY291bnQgPj0gbWluX2dhbGxvcCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAqZGVzdC0tID0gKnBiLS07CisgICAgICAgICAgICAgICAgKytiY291bnQ7CisgICAgICAgICAgICAgICAgYWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAtLW5iOworICAgICAgICAgICAgICAgIGlmIChuYiA9PSAxKQorICAgICAgICAgICAgICAgICAgICBnb3RvIENvcHlBOworICAgICAgICAgICAgICAgIGlmIChiY291bnQgPj0gbWluX2dhbGxvcCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiBPbmUgcnVuIGlzIHdpbm5pbmcgc28gY29uc2lzdGVudGx5IHRoYXQgZ2FsbG9waW5nIG1heQotCQkgKiBiZSBhIGh1Z2Ugd2luLiAgU28gdHJ5IHRoYXQsIGFuZCBjb250aW51ZSBnYWxsb3BpbmcgdW50aWwKLQkJICogKGlmIGV2ZXIpIG5laXRoZXIgcnVuIGFwcGVhcnMgdG8gYmUgd2lubmluZyBjb25zaXN0ZW50bHkKLQkJICogYW55bW9yZS4KLQkJICovCi0JCSsrbWluX2dhbGxvcDsKLQkJZG8gewotIAkJCWFzc2VydChuYSA+IDAgJiYgbmIgPiAxKTsKLQkJCW1pbl9nYWxsb3AgLT0gbWluX2dhbGxvcCA+IDE7Ci0JIAkJbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOwotCQkJayA9IGdhbGxvcF9yaWdodCgqcGIsIGJhc2VhLCBuYSwgbmEtMSwgY29tcGFyZSk7Ci0JCQlpZiAoayA8IDApCi0JCQkJZ290byBGYWlsOwotCQkJayA9IG5hIC0gazsKLQkJCWFjb3VudCA9IGs7Ci0JCQlpZiAoaykgewotCQkJCWRlc3QgLT0gazsKLQkJCQlwYSAtPSBrOwotCQkJCW1lbW1vdmUoZGVzdCsxLCBwYSsxLCBrICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKLQkJCQluYSAtPSBrOwotCQkJCWlmIChuYSA9PSAwKQotCQkJCQlnb3RvIFN1Y2NlZWQ7Ci0JCQl9Ci0JCQkqZGVzdC0tID0gKnBiLS07Ci0JCQktLW5iOwotCQkJaWYgKG5iID09IDEpCi0JCQkJZ290byBDb3B5QTsKKyAgICAgICAgLyogT25lIHJ1biBpcyB3aW5uaW5nIHNvIGNvbnNpc3RlbnRseSB0aGF0IGdhbGxvcGluZyBtYXkKKyAgICAgICAgICogYmUgYSBodWdlIHdpbi4gIFNvIHRyeSB0aGF0LCBhbmQgY29udGludWUgZ2FsbG9waW5nIHVudGlsCisgICAgICAgICAqIChpZiBldmVyKSBuZWl0aGVyIHJ1biBhcHBlYXJzIHRvIGJlIHdpbm5pbmcgY29uc2lzdGVudGx5CisgICAgICAgICAqIGFueW1vcmUuCisgICAgICAgICAqLworICAgICAgICArK21pbl9nYWxsb3A7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGFzc2VydChuYSA+IDAgJiYgbmIgPiAxKTsKKyAgICAgICAgICAgIG1pbl9nYWxsb3AgLT0gbWluX2dhbGxvcCA+IDE7CisgICAgICAgICAgICBtcy0+bWluX2dhbGxvcCA9IG1pbl9nYWxsb3A7CisgICAgICAgICAgICBrID0gZ2FsbG9wX3JpZ2h0KCpwYiwgYmFzZWEsIG5hLCBuYS0xLCBjb21wYXJlKTsKKyAgICAgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICBrID0gbmEgLSBrOworICAgICAgICAgICAgYWNvdW50ID0gazsKKyAgICAgICAgICAgIGlmIChrKSB7CisgICAgICAgICAgICAgICAgZGVzdCAtPSBrOworICAgICAgICAgICAgICAgIHBhIC09IGs7CisgICAgICAgICAgICAgICAgbWVtbW92ZShkZXN0KzEsIHBhKzEsIGsgKiBzaXplb2YoUHlPYmplY3QgKikpOworICAgICAgICAgICAgICAgIG5hIC09IGs7CisgICAgICAgICAgICAgICAgaWYgKG5hID09IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VjY2VlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0LS0gPSAqcGItLTsKKyAgICAgICAgICAgIC0tbmI7CisgICAgICAgICAgICBpZiAobmIgPT0gMSkKKyAgICAgICAgICAgICAgICBnb3RvIENvcHlBOwogCi0gCQkJayA9IGdhbGxvcF9sZWZ0KCpwYSwgYmFzZWIsIG5iLCBuYi0xLCBjb21wYXJlKTsKLQkJCWlmIChrIDwgMCkKLQkJCQlnb3RvIEZhaWw7Ci0JCQlrID0gbmIgLSBrOwotCQkJYmNvdW50ID0gazsKLQkJCWlmIChrKSB7Ci0JCQkJZGVzdCAtPSBrOwotCQkJCXBiIC09IGs7Ci0JCQkJbWVtY3B5KGRlc3QrMSwgcGIrMSwgayAqIHNpemVvZihQeU9iamVjdCAqKSk7Ci0JCQkJbmIgLT0gazsKLQkJCQlpZiAobmIgPT0gMSkKLQkJCQkJZ290byBDb3B5QTsKLQkJCQkvKiBuYj09MCBpcyBpbXBvc3NpYmxlIG5vdyBpZiB0aGUgY29tcGFyaXNvbgotCQkJCSAqIGZ1bmN0aW9uIGlzIGNvbnNpc3RlbnQsIGJ1dCB3ZSBjYW4ndCBhc3N1bWUKLQkJCQkgKiB0aGF0IGl0IGlzLgotCQkJCSAqLwotCQkJCWlmIChuYiA9PSAwKQotCQkJCQlnb3RvIFN1Y2NlZWQ7Ci0JCQl9Ci0JCQkqZGVzdC0tID0gKnBhLS07Ci0JCQktLW5hOwotCQkJaWYgKG5hID09IDApCi0JCQkJZ290byBTdWNjZWVkOwotIAkJfSB3aGlsZSAoYWNvdW50ID49IE1JTl9HQUxMT1AgfHwgYmNvdW50ID49IE1JTl9HQUxMT1ApOwotIAkJKyttaW5fZ2FsbG9wOwkvKiBwZW5hbGl6ZSBpdCBmb3IgbGVhdmluZyBnYWxsb3BpbmcgbW9kZSAqLwotIAkJbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOwotIAl9CisgICAgICAgICAgICBrID0gZ2FsbG9wX2xlZnQoKnBhLCBiYXNlYiwgbmIsIG5iLTEsIGNvbXBhcmUpOworICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIGsgPSBuYiAtIGs7CisgICAgICAgICAgICBiY291bnQgPSBrOworICAgICAgICAgICAgaWYgKGspIHsKKyAgICAgICAgICAgICAgICBkZXN0IC09IGs7CisgICAgICAgICAgICAgICAgcGIgLT0gazsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZGVzdCsxLCBwYisxLCBrICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICAgICAgICAgICAgICBuYiAtPSBrOworICAgICAgICAgICAgICAgIGlmIChuYiA9PSAxKQorICAgICAgICAgICAgICAgICAgICBnb3RvIENvcHlBOworICAgICAgICAgICAgICAgIC8qIG5iPT0wIGlzIGltcG9zc2libGUgbm93IGlmIHRoZSBjb21wYXJpc29uCisgICAgICAgICAgICAgICAgICogZnVuY3Rpb24gaXMgY29uc2lzdGVudCwgYnV0IHdlIGNhbid0IGFzc3VtZQorICAgICAgICAgICAgICAgICAqIHRoYXQgaXQgaXMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKG5iID09IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VjY2VlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0LS0gPSAqcGEtLTsKKyAgICAgICAgICAgIC0tbmE7CisgICAgICAgICAgICBpZiAobmEgPT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIFN1Y2NlZWQ7CisgICAgICAgIH0gd2hpbGUgKGFjb3VudCA+PSBNSU5fR0FMTE9QIHx8IGJjb3VudCA+PSBNSU5fR0FMTE9QKTsKKyAgICAgICAgKyttaW5fZ2FsbG9wOyAgICAgICAgICAgLyogcGVuYWxpemUgaXQgZm9yIGxlYXZpbmcgZ2FsbG9waW5nIG1vZGUgKi8KKyAgICAgICAgbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOworICAgIH0KIFN1Y2NlZWQ6Ci0JcmVzdWx0ID0gMDsKKyAgICByZXN1bHQgPSAwOwogRmFpbDoKLQlpZiAobmIpCi0JCW1lbWNweShkZXN0LShuYi0xKSwgYmFzZWIsIG5iICogc2l6ZW9mKFB5T2JqZWN0KikpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKG5iKQorICAgICAgICBtZW1jcHkoZGVzdC0obmItMSksIGJhc2ViLCBuYiAqIHNpemVvZihQeU9iamVjdCopKTsKKyAgICByZXR1cm4gcmVzdWx0OwogQ29weUE6Ci0JYXNzZXJ0KG5iID09IDEgJiYgbmEgPiAwKTsKLQkvKiBUaGUgZmlyc3QgZWxlbWVudCBvZiBwYiBiZWxvbmdzIGF0IHRoZSBmcm9udCBvZiB0aGUgbWVyZ2UuICovCi0JZGVzdCAtPSBuYTsKLQlwYSAtPSBuYTsKLQltZW1tb3ZlKGRlc3QrMSwgcGErMSwgbmEgKiBzaXplb2YoUHlPYmplY3QgKikpOwotCSpkZXN0ID0gKnBiOwotCXJldHVybiAwOworICAgIGFzc2VydChuYiA9PSAxICYmIG5hID4gMCk7CisgICAgLyogVGhlIGZpcnN0IGVsZW1lbnQgb2YgcGIgYmVsb25ncyBhdCB0aGUgZnJvbnQgb2YgdGhlIG1lcmdlLiAqLworICAgIGRlc3QgLT0gbmE7CisgICAgcGEgLT0gbmE7CisgICAgbWVtbW92ZShkZXN0KzEsIHBhKzEsIG5hICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICAqZGVzdCA9ICpwYjsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogTWVyZ2UgdGhlIHR3byBydW5zIGF0IHN0YWNrIGluZGljZXMgaSBhbmQgaSsxLgpAQCAtMTcyOCw1OCArMTcyOCw1OCBAQAogc3RhdGljIFB5X3NzaXplX3QKIG1lcmdlX2F0KE1lcmdlU3RhdGUgKm1zLCBQeV9zc2l6ZV90IGkpCiB7Ci0JUHlPYmplY3QgKipwYSwgKipwYjsKLQlQeV9zc2l6ZV90IG5hLCBuYjsKLQlQeV9zc2l6ZV90IGs7Ci0JUHlPYmplY3QgKmNvbXBhcmU7CisgICAgUHlPYmplY3QgKipwYSwgKipwYjsKKyAgICBQeV9zc2l6ZV90IG5hLCBuYjsKKyAgICBQeV9zc2l6ZV90IGs7CisgICAgUHlPYmplY3QgKmNvbXBhcmU7CiAKLQlhc3NlcnQobXMgIT0gTlVMTCk7Ci0JYXNzZXJ0KG1zLT5uID49IDIpOwotCWFzc2VydChpID49IDApOwotCWFzc2VydChpID09IG1zLT5uIC0gMiB8fCBpID09IG1zLT5uIC0gMyk7CisgICAgYXNzZXJ0KG1zICE9IE5VTEwpOworICAgIGFzc2VydChtcy0+biA+PSAyKTsKKyAgICBhc3NlcnQoaSA+PSAwKTsKKyAgICBhc3NlcnQoaSA9PSBtcy0+biAtIDIgfHwgaSA9PSBtcy0+biAtIDMpOwogCi0JcGEgPSBtcy0+cGVuZGluZ1tpXS5iYXNlOwotCW5hID0gbXMtPnBlbmRpbmdbaV0ubGVuOwotCXBiID0gbXMtPnBlbmRpbmdbaSsxXS5iYXNlOwotCW5iID0gbXMtPnBlbmRpbmdbaSsxXS5sZW47Ci0JYXNzZXJ0KG5hID4gMCAmJiBuYiA+IDApOwotCWFzc2VydChwYSArIG5hID09IHBiKTsKKyAgICBwYSA9IG1zLT5wZW5kaW5nW2ldLmJhc2U7CisgICAgbmEgPSBtcy0+cGVuZGluZ1tpXS5sZW47CisgICAgcGIgPSBtcy0+cGVuZGluZ1tpKzFdLmJhc2U7CisgICAgbmIgPSBtcy0+cGVuZGluZ1tpKzFdLmxlbjsKKyAgICBhc3NlcnQobmEgPiAwICYmIG5iID4gMCk7CisgICAgYXNzZXJ0KHBhICsgbmEgPT0gcGIpOwogCi0JLyogUmVjb3JkIHRoZSBsZW5ndGggb2YgdGhlIGNvbWJpbmVkIHJ1bnM7IGlmIGkgaXMgdGhlIDNyZC1sYXN0Ci0JICogcnVuIG5vdywgYWxzbyBzbGlkZSBvdmVyIHRoZSBsYXN0IHJ1biAod2hpY2ggaXNuJ3QgaW52b2x2ZWQKLQkgKiBpbiB0aGlzIG1lcmdlKS4gIFRoZSBjdXJyZW50IHJ1biBpKzEgZ29lcyBhd2F5IGluIGFueSBjYXNlLgotCSAqLwotCW1zLT5wZW5kaW5nW2ldLmxlbiA9IG5hICsgbmI7Ci0JaWYgKGkgPT0gbXMtPm4gLSAzKQotCQltcy0+cGVuZGluZ1tpKzFdID0gbXMtPnBlbmRpbmdbaSsyXTsKLQktLW1zLT5uOworICAgIC8qIFJlY29yZCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21iaW5lZCBydW5zOyBpZiBpIGlzIHRoZSAzcmQtbGFzdAorICAgICAqIHJ1biBub3csIGFsc28gc2xpZGUgb3ZlciB0aGUgbGFzdCBydW4gKHdoaWNoIGlzbid0IGludm9sdmVkCisgICAgICogaW4gdGhpcyBtZXJnZSkuICBUaGUgY3VycmVudCBydW4gaSsxIGdvZXMgYXdheSBpbiBhbnkgY2FzZS4KKyAgICAgKi8KKyAgICBtcy0+cGVuZGluZ1tpXS5sZW4gPSBuYSArIG5iOworICAgIGlmIChpID09IG1zLT5uIC0gMykKKyAgICAgICAgbXMtPnBlbmRpbmdbaSsxXSA9IG1zLT5wZW5kaW5nW2krMl07CisgICAgLS1tcy0+bjsKIAotCS8qIFdoZXJlIGRvZXMgYiBzdGFydCBpbiBhPyAgRWxlbWVudHMgaW4gYSBiZWZvcmUgdGhhdCBjYW4gYmUKLQkgKiBpZ25vcmVkIChhbHJlYWR5IGluIHBsYWNlKS4KLQkgKi8KLQljb21wYXJlID0gbXMtPmNvbXBhcmU7Ci0JayA9IGdhbGxvcF9yaWdodCgqcGIsIHBhLCBuYSwgMCwgY29tcGFyZSk7Ci0JaWYgKGsgPCAwKQotCQlyZXR1cm4gLTE7Ci0JcGEgKz0gazsKLQluYSAtPSBrOwotCWlmIChuYSA9PSAwKQotCQlyZXR1cm4gMDsKKyAgICAvKiBXaGVyZSBkb2VzIGIgc3RhcnQgaW4gYT8gIEVsZW1lbnRzIGluIGEgYmVmb3JlIHRoYXQgY2FuIGJlCisgICAgICogaWdub3JlZCAoYWxyZWFkeSBpbiBwbGFjZSkuCisgICAgICovCisgICAgY29tcGFyZSA9IG1zLT5jb21wYXJlOworICAgIGsgPSBnYWxsb3BfcmlnaHQoKnBiLCBwYSwgbmEsIDAsIGNvbXBhcmUpOworICAgIGlmIChrIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHBhICs9IGs7CisgICAgbmEgLT0gazsKKyAgICBpZiAobmEgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBXaGVyZSBkb2VzIGEgZW5kIGluIGI/ICBFbGVtZW50cyBpbiBiIGFmdGVyIHRoYXQgY2FuIGJlCi0JICogaWdub3JlZCAoYWxyZWFkeSBpbiBwbGFjZSkuCi0JICovCi0JbmIgPSBnYWxsb3BfbGVmdChwYVtuYS0xXSwgcGIsIG5iLCBuYi0xLCBjb21wYXJlKTsKLQlpZiAobmIgPD0gMCkKLQkJcmV0dXJuIG5iOworICAgIC8qIFdoZXJlIGRvZXMgYSBlbmQgaW4gYj8gIEVsZW1lbnRzIGluIGIgYWZ0ZXIgdGhhdCBjYW4gYmUKKyAgICAgKiBpZ25vcmVkIChhbHJlYWR5IGluIHBsYWNlKS4KKyAgICAgKi8KKyAgICBuYiA9IGdhbGxvcF9sZWZ0KHBhW25hLTFdLCBwYiwgbmIsIG5iLTEsIGNvbXBhcmUpOworICAgIGlmIChuYiA8PSAwKQorICAgICAgICByZXR1cm4gbmI7CiAKLQkvKiBNZXJnZSB3aGF0IHJlbWFpbnMgb2YgdGhlIHJ1bnMsIHVzaW5nIGEgdGVtcCBhcnJheSB3aXRoCi0JICogbWluKG5hLCBuYikgZWxlbWVudHMuCi0JICovCi0JaWYgKG5hIDw9IG5iKQotCQlyZXR1cm4gbWVyZ2VfbG8obXMsIHBhLCBuYSwgcGIsIG5iKTsKLQllbHNlCi0JCXJldHVybiBtZXJnZV9oaShtcywgcGEsIG5hLCBwYiwgbmIpOworICAgIC8qIE1lcmdlIHdoYXQgcmVtYWlucyBvZiB0aGUgcnVucywgdXNpbmcgYSB0ZW1wIGFycmF5IHdpdGgKKyAgICAgKiBtaW4obmEsIG5iKSBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBpZiAobmEgPD0gbmIpCisgICAgICAgIHJldHVybiBtZXJnZV9sbyhtcywgcGEsIG5hLCBwYiwgbmIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1lcmdlX2hpKG1zLCBwYSwgbmEsIHBiLCBuYik7CiB9CiAKIC8qIEV4YW1pbmUgdGhlIHN0YWNrIG9mIHJ1bnMgd2FpdGluZyB0byBiZSBtZXJnZWQsIG1lcmdpbmcgYWRqYWNlbnQgcnVucwpAQCAtMTc5NSwyNSArMTc5NSwyNSBAQAogc3RhdGljIGludAogbWVyZ2VfY29sbGFwc2UoTWVyZ2VTdGF0ZSAqbXMpCiB7Ci0Jc3RydWN0IHNfc2xpY2UgKnAgPSBtcy0+cGVuZGluZzsKKyAgICBzdHJ1Y3Qgc19zbGljZSAqcCA9IG1zLT5wZW5kaW5nOwogCi0JYXNzZXJ0KG1zKTsKLQl3aGlsZSAobXMtPm4gPiAxKSB7Ci0JCVB5X3NzaXplX3QgbiA9IG1zLT5uIC0gMjsKLQkJaWYgKG4gPiAwICYmIHBbbi0xXS5sZW4gPD0gcFtuXS5sZW4gKyBwW24rMV0ubGVuKSB7Ci0JCSAgICAJaWYgKHBbbi0xXS5sZW4gPCBwW24rMV0ubGVuKQotCQkgICAgCQktLW47Ci0JCQlpZiAobWVyZ2VfYXQobXMsIG4pIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZSBpZiAocFtuXS5sZW4gPD0gcFtuKzFdLmxlbikgewotCQkJIGlmIChtZXJnZV9hdChtcywgbikgPCAwKQotCQkJIAlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChtcyk7CisgICAgd2hpbGUgKG1zLT5uID4gMSkgeworICAgICAgICBQeV9zc2l6ZV90IG4gPSBtcy0+biAtIDI7CisgICAgICAgIGlmIChuID4gMCAmJiBwW24tMV0ubGVuIDw9IHBbbl0ubGVuICsgcFtuKzFdLmxlbikgeworICAgICAgICAgICAgaWYgKHBbbi0xXS5sZW4gPCBwW24rMV0ubGVuKQorICAgICAgICAgICAgICAgIC0tbjsKKyAgICAgICAgICAgIGlmIChtZXJnZV9hdChtcywgbikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwW25dLmxlbiA8PSBwW24rMV0ubGVuKSB7CisgICAgICAgICAgICAgICAgIGlmIChtZXJnZV9hdChtcywgbikgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogUmVnYXJkbGVzcyBvZiBpbnZhcmlhbnRzLCBtZXJnZSBhbGwgcnVucyBvbiB0aGUgc3RhY2sgdW50aWwgb25seSBvbmUKQEAgLTE4MjQsMTcgKzE4MjQsMTcgQEAKIHN0YXRpYyBpbnQKIG1lcmdlX2ZvcmNlX2NvbGxhcHNlKE1lcmdlU3RhdGUgKm1zKQogewotCXN0cnVjdCBzX3NsaWNlICpwID0gbXMtPnBlbmRpbmc7CisgICAgc3RydWN0IHNfc2xpY2UgKnAgPSBtcy0+cGVuZGluZzsKIAotCWFzc2VydChtcyk7Ci0Jd2hpbGUgKG1zLT5uID4gMSkgewotCQlQeV9zc2l6ZV90IG4gPSBtcy0+biAtIDI7Ci0JCWlmIChuID4gMCAmJiBwW24tMV0ubGVuIDwgcFtuKzFdLmxlbikKLQkJCS0tbjsKLQkJaWYgKG1lcmdlX2F0KG1zLCBuKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChtcyk7CisgICAgd2hpbGUgKG1zLT5uID4gMSkgeworICAgICAgICBQeV9zc2l6ZV90IG4gPSBtcy0+biAtIDI7CisgICAgICAgIGlmIChuID4gMCAmJiBwW24tMV0ubGVuIDwgcFtuKzFdLmxlbikKKyAgICAgICAgICAgIC0tbjsKKyAgICAgICAgaWYgKG1lcmdlX2F0KG1zLCBuKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBDb21wdXRlIGEgZ29vZCB2YWx1ZSBmb3IgdGhlIG1pbmltdW0gcnVuIGxlbmd0aDsgbmF0dXJhbCBydW5zIHNob3J0ZXIKQEAgLTE4NTAsMTQgKzE4NTAsMTQgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBtZXJnZV9jb21wdXRlX21pbnJ1bihQeV9zc2l6ZV90IG4pCiB7Ci0JUHlfc3NpemVfdCByID0gMDsJLyogYmVjb21lcyAxIGlmIGFueSAxIGJpdHMgYXJlIHNoaWZ0ZWQgb2ZmICovCisgICAgUHlfc3NpemVfdCByID0gMDsgICAgICAgICAgIC8qIGJlY29tZXMgMSBpZiBhbnkgMSBiaXRzIGFyZSBzaGlmdGVkIG9mZiAqLwogCi0JYXNzZXJ0KG4gPj0gMCk7Ci0Jd2hpbGUgKG4gPj0gNjQpIHsKLQkJciB8PSBuICYgMTsKLQkJbiA+Pj0gMTsKLQl9Ci0JcmV0dXJuIG4gKyByOworICAgIGFzc2VydChuID49IDApOworICAgIHdoaWxlIChuID49IDY0KSB7CisgICAgICAgIHIgfD0gbiAmIDE7CisgICAgICAgIG4gPj49IDE7CisgICAgfQorICAgIHJldHVybiBuICsgcjsKIH0KIAogLyogU3BlY2lhbCB3cmFwcGVyIHRvIHN1cHBvcnQgc3RhYmxlIHNvcnRpbmcgdXNpbmcgdGhlIGRlY29yYXRlLXNvcnQtdW5kZWNvcmF0ZQpAQCAtMTg2OCw5ICsxODY4LDkgQEAKICAgIHRoZSBrZXkgaW5zdGVhZCBvZiBhIGZ1bGwgcmVjb3JkLiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICprZXk7Ci0JUHlPYmplY3QgKnZhbHVlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5T2JqZWN0ICp2YWx1ZTsKIH0gc29ydHdyYXBwZXJvYmplY3Q7CiAKIFB5RG9jX1NUUlZBUihzb3J0d3JhcHBlcl9kb2MsICJPYmplY3Qgd3JhcHBlciB3aXRoIGEgY3VzdG9tIHNvcnQga2V5LiIpOwpAQCAtMTg4MCw1MiArMTg4MCw1MiBAQAogc29ydHdyYXBwZXJfZGVhbGxvYyhzb3J0d3JhcHBlcm9iamVjdCAqKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBzb3J0d3JhcHBlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInNvcnR3cmFwcGVyIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihzb3J0d3JhcHBlcm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3Ipc29ydHdyYXBwZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8Ci0JUHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFLCAJCS8qIHRwX2ZsYWdzICovCi0Jc29ydHdyYXBwZXJfZG9jLAkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylzb3J0d3JhcHBlcl9yaWNoY29tcGFyZSwJLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJzb3J0d3JhcHBlciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihzb3J0d3JhcHBlcm9iamVjdCksICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcilzb3J0d3JhcHBlcl9kZWFsbG9jLCAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwKKyAgICBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkUsICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgc29ydHdyYXBwZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIChyaWNoY21wZnVuYylzb3J0d3JhcHBlcl9yaWNoY29tcGFyZSwgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KIH07CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNvcnR3cmFwcGVyX3JpY2hjb21wYXJlKHNvcnR3cmFwcGVyb2JqZWN0ICphLCBzb3J0d3JhcHBlcm9iamVjdCAqYiwgaW50IG9wKQogewotCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKGIsICZzb3J0d3JhcHBlcl90eXBlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZShhLT5rZXksIGItPmtleSwgb3ApOworICAgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGIsICZzb3J0d3JhcHBlcl90eXBlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZShhLT5rZXksIGItPmtleSwgb3ApOwogfQogCiBzdGF0aWMgdm9pZAogc29ydHdyYXBwZXJfZGVhbGxvYyhzb3J0d3JhcHBlcm9iamVjdCAqc28pCiB7Ci0JUHlfWERFQ1JFRihzby0+a2V5KTsKLQlQeV9YREVDUkVGKHNvLT52YWx1ZSk7Ci0JUHlPYmplY3RfRGVsKHNvKTsKKyAgICBQeV9YREVDUkVGKHNvLT5rZXkpOworICAgIFB5X1hERUNSRUYoc28tPnZhbHVlKTsKKyAgICBQeU9iamVjdF9EZWwoc28pOwogfQogCiAvKiBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSB0byBhIHNvcnR3cmFwcGVyLgpAQCAtMTkzNCwzMCArMTkzNCwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWxkX3NvcnR3cmFwcGVyKFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlzb3J0d3JhcHBlcm9iamVjdCAqc287CisgICAgc29ydHdyYXBwZXJvYmplY3QgKnNvOwogCi0Jc28gPSBQeU9iamVjdF9OZXcoc29ydHdyYXBwZXJvYmplY3QsICZzb3J0d3JhcHBlcl90eXBlKTsKLQlpZiAoc28gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc28tPmtleSA9IGtleTsKLQlzby0+dmFsdWUgPSB2YWx1ZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc287CisgICAgc28gPSBQeU9iamVjdF9OZXcoc29ydHdyYXBwZXJvYmplY3QsICZzb3J0d3JhcHBlcl90eXBlKTsKKyAgICBpZiAoc28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc28tPmtleSA9IGtleTsKKyAgICBzby0+dmFsdWUgPSB2YWx1ZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc287CiB9CiAKIC8qIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSB1bmRlcmx5aW5nIHRoZSB3cmFwcGVyLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHNvcnR3cmFwcGVyX2dldHZhbHVlKFB5T2JqZWN0ICpzbykKIHsKLQlQeU9iamVjdCAqdmFsdWU7CisgICAgUHlPYmplY3QgKnZhbHVlOwogCi0JaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soc28sICZzb3J0d3JhcHBlcl90eXBlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXZhbHVlID0gKChzb3J0d3JhcHBlcm9iamVjdCAqKXNvKS0+dmFsdWU7Ci0JUHlfSU5DUkVGKHZhbHVlKTsKLQlyZXR1cm4gdmFsdWU7CisgICAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soc28sICZzb3J0d3JhcHBlcl90eXBlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHZhbHVlID0gKChzb3J0d3JhcHBlcm9iamVjdCAqKXNvKS0+dmFsdWU7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICByZXR1cm4gdmFsdWU7CiB9CiAKIC8qIFdyYXBwZXIgZm9yIHVzZXIgc3BlY2lmaWVkIGNtcCBmdW5jdGlvbnMgaW4gY29tYmluYXRpb24gd2l0aCBhCkBAIC0xOTY1LDczICsxOTY1LDczIEBACiAgICB3aXRoIHRoZSBhY3R1YWwga2V5IGluc3RlYWQgb2YgdGhlIHNvcnR3cmFwcGVyICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpmdW5jOwogfSBjbXB3cmFwcGVyb2JqZWN0OwogCiBzdGF0aWMgdm9pZAogY21wd3JhcHBlcl9kZWFsbG9jKGNtcHdyYXBwZXJvYmplY3QgKmNvKQogewotCVB5X1hERUNSRUYoY28tPmZ1bmMpOwotCVB5T2JqZWN0X0RlbChjbyk7CisgICAgUHlfWERFQ1JFRihjby0+ZnVuYyk7CisgICAgUHlPYmplY3RfRGVsKGNvKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNtcHdyYXBwZXJfY2FsbChjbXB3cmFwcGVyb2JqZWN0ICpjbywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp4LCAqeSwgKnh4LCAqeXk7CisgICAgUHlPYmplY3QgKngsICp5LCAqeHgsICp5eTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDIsIDIsICZ4LCAmeSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKHgsICZzb3J0d3JhcHBlcl90eXBlKSB8fAotCSAgICAhUHlPYmplY3RfVHlwZUNoZWNrKHksICZzb3J0d3JhcHBlcl90eXBlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXh4ID0gKChzb3J0d3JhcHBlcm9iamVjdCAqKXgpLT5rZXk7Ci0JeXkgPSAoKHNvcnR3cmFwcGVyb2JqZWN0ICopeSktPmtleTsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjby0+ZnVuYywgeHgsIHl5LCBOVUxMKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAyLCAyLCAmeCwgJnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayh4LCAmc29ydHdyYXBwZXJfdHlwZSkgfHwKKyAgICAgICAgIVB5T2JqZWN0X1R5cGVDaGVjayh5LCAmc29ydHdyYXBwZXJfdHlwZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJleHBlY3RlZCBhIHNvcnR3cmFwcGVyb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB4eCA9ICgoc29ydHdyYXBwZXJvYmplY3QgKil4KS0+a2V5OworICAgIHl5ID0gKChzb3J0d3JhcHBlcm9iamVjdCAqKXkpLT5rZXk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY28tPmZ1bmMsIHh4LCB5eSwgTlVMTCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjbXB3cmFwcGVyX2RvYywgImNtcCgpIHdyYXBwZXIgZm9yIHNvcnQgd2l0aCBjdXN0b20ga2V5cy4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjbXB3cmFwcGVyX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiY21wd3JhcHBlciIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoY21wd3JhcHBlcm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY21wd3JhcHBlcl9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkodGVybmFyeWZ1bmMpY21wd3JhcHBlcl9jYWxsLAkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotCWNtcHdyYXBwZXJfZG9jLAkJCQkvKiB0cF9kb2MgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJjbXB3cmFwcGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihjbXB3cmFwcGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciljbXB3cmFwcGVyX2RlYWxsb2MsICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKWNtcHdyYXBwZXJfY2FsbCwgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGNtcHdyYXBwZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbGRfY21wd3JhcHBlcihQeU9iamVjdCAqY21wZnVuYykKIHsKLQljbXB3cmFwcGVyb2JqZWN0ICpjbzsKKyAgICBjbXB3cmFwcGVyb2JqZWN0ICpjbzsKIAotCWNvID0gUHlPYmplY3RfTmV3KGNtcHdyYXBwZXJvYmplY3QsICZjbXB3cmFwcGVyX3R5cGUpOwotCWlmIChjbyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoY21wZnVuYyk7Ci0JY28tPmZ1bmMgPSBjbXBmdW5jOwotCXJldHVybiAoUHlPYmplY3QgKiljbzsKKyAgICBjbyA9IFB5T2JqZWN0X05ldyhjbXB3cmFwcGVyb2JqZWN0LCAmY21wd3JhcHBlcl90eXBlKTsKKyAgICBpZiAoY28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKGNtcGZ1bmMpOworICAgIGNvLT5mdW5jID0gY21wZnVuYzsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopY287CiB9CiAKIC8qIEFuIGFkYXB0aXZlLCBzdGFibGUsIG5hdHVyYWwgbWVyZ2Vzb3J0LiAgU2VlIGxpc3Rzb3J0LnR4dC4KQEAgLTIwNDIsMTcxICsyMDQyLDE3MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3Rzb3J0KFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCU1lcmdlU3RhdGUgbXM7Ci0JUHlPYmplY3QgKipsbywgKipoaTsKLQlQeV9zc2l6ZV90IG5yZW1haW5pbmc7Ci0JUHlfc3NpemVfdCBtaW5ydW47Ci0JUHlfc3NpemVfdCBzYXZlZF9vYl9zaXplLCBzYXZlZF9hbGxvY2F0ZWQ7Ci0JUHlPYmplY3QgKipzYXZlZF9vYl9pdGVtOwotCVB5T2JqZWN0ICoqZmluYWxfb2JfaXRlbTsKLQlQeU9iamVjdCAqY29tcGFyZSA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CS8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KLQlpbnQgcmV2ZXJzZSA9IDA7Ci0JUHlPYmplY3QgKmtleWZ1bmMgPSBOVUxMOwotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqa2V5LCAqdmFsdWUsICprdnBhaXI7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJjbXAiLCAia2V5IiwgInJldmVyc2UiLCAwfTsKKyAgICBNZXJnZVN0YXRlIG1zOworICAgIFB5T2JqZWN0ICoqbG8sICoqaGk7CisgICAgUHlfc3NpemVfdCBucmVtYWluaW5nOworICAgIFB5X3NzaXplX3QgbWlucnVuOworICAgIFB5X3NzaXplX3Qgc2F2ZWRfb2Jfc2l6ZSwgc2F2ZWRfYWxsb2NhdGVkOworICAgIFB5T2JqZWN0ICoqc2F2ZWRfb2JfaXRlbTsKKyAgICBQeU9iamVjdCAqKmZpbmFsX29iX2l0ZW07CisgICAgUHlPYmplY3QgKmNvbXBhcmUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOyAgICAgICAgICAgIC8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KKyAgICBpbnQgcmV2ZXJzZSA9IDA7CisgICAgUHlPYmplY3QgKmtleWZ1bmMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWUsICprdnBhaXI7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJjbXAiLCAia2V5IiwgInJldmVyc2UiLCAwfTsKIAotCWFzc2VydChzZWxmICE9IE5VTEwpOwotCWFzc2VydCAoUHlMaXN0X0NoZWNrKHNlbGYpKTsKLQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T09pOnNvcnQiLAotCQkJa3dsaXN0LCAmY29tcGFyZSwgJmtleWZ1bmMsICZyZXZlcnNlKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoY29tcGFyZSA9PSBQeV9Ob25lKQotCQljb21wYXJlID0gTlVMTDsKLQlpZiAoY29tcGFyZSAhPSBOVUxMICYmIAotCSAgICBQeUVycl9XYXJuUHkzaygidGhlIGNtcCBhcmd1bWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGtleWZ1bmMgPT0gUHlfTm9uZSkKLQkJa2V5ZnVuYyA9IE5VTEw7Ci0JaWYgKGNvbXBhcmUgIT0gTlVMTCAmJiBrZXlmdW5jICE9IE5VTEwpIHsKLQkJY29tcGFyZSA9IGJ1aWxkX2NtcHdyYXBwZXIoY29tcGFyZSk7Ci0JCWlmIChjb21wYXJlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UKLQkJUHlfWElOQ1JFRihjb21wYXJlKTsKKyAgICBhc3NlcnQoc2VsZiAhPSBOVUxMKTsKKyAgICBhc3NlcnQgKFB5TGlzdF9DaGVjayhzZWxmKSk7CisgICAgaWYgKGFyZ3MgIT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9PaTpzb3J0IiwKKyAgICAgICAgICAgIGt3bGlzdCwgJmNvbXBhcmUsICZrZXlmdW5jLCAmcmV2ZXJzZSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGNvbXBhcmUgPT0gUHlfTm9uZSkKKyAgICAgICAgY29tcGFyZSA9IE5VTEw7CisgICAgaWYgKGNvbXBhcmUgIT0gTlVMTCAmJgorICAgICAgICBQeUVycl9XYXJuUHkzaygidGhlIGNtcCBhcmd1bWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGtleWZ1bmMgPT0gUHlfTm9uZSkKKyAgICAgICAga2V5ZnVuYyA9IE5VTEw7CisgICAgaWYgKGNvbXBhcmUgIT0gTlVMTCAmJiBrZXlmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgY29tcGFyZSA9IGJ1aWxkX2NtcHdyYXBwZXIoY29tcGFyZSk7CisgICAgICAgIGlmIChjb21wYXJlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UKKyAgICAgICAgUHlfWElOQ1JFRihjb21wYXJlKTsKIAotCS8qIFRoZSBsaXN0IGlzIHRlbXBvcmFyaWx5IG1hZGUgZW1wdHksIHNvIHRoYXQgbXV0YXRpb25zIHBlcmZvcm1lZAotCSAqIGJ5IGNvbXBhcmlzb24gZnVuY3Rpb25zIGNhbid0IGFmZmVjdCB0aGUgc2xpY2Ugb2YgbWVtb3J5IHdlJ3JlCi0JICogc29ydGluZyAoYWxsb3dpbmcgbXV0YXRpb25zIGR1cmluZyBzb3J0aW5nIGlzIGEgY29yZS1kdW1wCi0JICogZmFjdG9yeSwgc2luY2Ugb2JfaXRlbSBtYXkgY2hhbmdlKS4KLQkgKi8KLQlzYXZlZF9vYl9zaXplID0gUHlfU0laRShzZWxmKTsKLQlzYXZlZF9vYl9pdGVtID0gc2VsZi0+b2JfaXRlbTsKLQlzYXZlZF9hbGxvY2F0ZWQgPSBzZWxmLT5hbGxvY2F0ZWQ7Ci0JUHlfU0laRShzZWxmKSA9IDA7Ci0Jc2VsZi0+b2JfaXRlbSA9IE5VTEw7Ci0Jc2VsZi0+YWxsb2NhdGVkID0gLTE7IC8qIGFueSBvcGVyYXRpb24gd2lsbCByZXNldCBpdCB0byA+PSAwICovCisgICAgLyogVGhlIGxpc3QgaXMgdGVtcG9yYXJpbHkgbWFkZSBlbXB0eSwgc28gdGhhdCBtdXRhdGlvbnMgcGVyZm9ybWVkCisgICAgICogYnkgY29tcGFyaXNvbiBmdW5jdGlvbnMgY2FuJ3QgYWZmZWN0IHRoZSBzbGljZSBvZiBtZW1vcnkgd2UncmUKKyAgICAgKiBzb3J0aW5nIChhbGxvd2luZyBtdXRhdGlvbnMgZHVyaW5nIHNvcnRpbmcgaXMgYSBjb3JlLWR1bXAKKyAgICAgKiBmYWN0b3J5LCBzaW5jZSBvYl9pdGVtIG1heSBjaGFuZ2UpLgorICAgICAqLworICAgIHNhdmVkX29iX3NpemUgPSBQeV9TSVpFKHNlbGYpOworICAgIHNhdmVkX29iX2l0ZW0gPSBzZWxmLT5vYl9pdGVtOworICAgIHNhdmVkX2FsbG9jYXRlZCA9IHNlbGYtPmFsbG9jYXRlZDsKKyAgICBQeV9TSVpFKHNlbGYpID0gMDsKKyAgICBzZWxmLT5vYl9pdGVtID0gTlVMTDsKKyAgICBzZWxmLT5hbGxvY2F0ZWQgPSAtMTsgLyogYW55IG9wZXJhdGlvbiB3aWxsIHJlc2V0IGl0IHRvID49IDAgKi8KIAotCWlmIChrZXlmdW5jICE9IE5VTEwpIHsKLQkJZm9yIChpPTAgOyBpIDwgc2F2ZWRfb2Jfc2l6ZSA7IGkrKykgewotCQkJdmFsdWUgPSBzYXZlZF9vYl9pdGVtW2ldOwotCQkJa2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhrZXlmdW5jLCB2YWx1ZSwKLQkJCQkJCQkgICBOVUxMKTsKLQkJCWlmIChrZXkgPT0gTlVMTCkgewotCQkJCWZvciAoaT1pLTEgOyBpPj0wIDsgaS0tKSB7Ci0JCQkJCWt2cGFpciA9IHNhdmVkX29iX2l0ZW1baV07Ci0JCQkJCXZhbHVlID0gc29ydHdyYXBwZXJfZ2V0dmFsdWUoa3ZwYWlyKTsKLQkJCQkJc2F2ZWRfb2JfaXRlbVtpXSA9IHZhbHVlOwotCQkJCQlQeV9ERUNSRUYoa3ZwYWlyKTsKLQkJCQl9Ci0JCQkJZ290byBkc3VfZmFpbDsKLQkJCX0KLQkJCWt2cGFpciA9IGJ1aWxkX3NvcnR3cmFwcGVyKGtleSwgdmFsdWUpOwotCQkJaWYgKGt2cGFpciA9PSBOVUxMKQotCQkJCWdvdG8gZHN1X2ZhaWw7Ci0JCQlzYXZlZF9vYl9pdGVtW2ldID0ga3ZwYWlyOwotCQl9Ci0JfQorICAgIGlmIChrZXlmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpPTAgOyBpIDwgc2F2ZWRfb2Jfc2l6ZSA7IGkrKykgeworICAgICAgICAgICAgdmFsdWUgPSBzYXZlZF9vYl9pdGVtW2ldOworICAgICAgICAgICAga2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhrZXlmdW5jLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBpZiAoa2V5ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9aS0xIDsgaT49MCA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBrdnBhaXIgPSBzYXZlZF9vYl9pdGVtW2ldOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNvcnR3cmFwcGVyX2dldHZhbHVlKGt2cGFpcik7CisgICAgICAgICAgICAgICAgICAgIHNhdmVkX29iX2l0ZW1baV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGt2cGFpcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gZHN1X2ZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrdnBhaXIgPSBidWlsZF9zb3J0d3JhcHBlcihrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChrdnBhaXIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGRzdV9mYWlsOworICAgICAgICAgICAgc2F2ZWRfb2JfaXRlbVtpXSA9IGt2cGFpcjsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIFJldmVyc2Ugc29ydCBzdGFiaWxpdHkgYWNoaWV2ZWQgYnkgaW5pdGlhbGx5IHJldmVyc2luZyB0aGUgbGlzdCwKLQlhcHBseWluZyBhIHN0YWJsZSBmb3J3YXJkIHNvcnQsIHRoZW4gcmV2ZXJzaW5nIHRoZSBmaW5hbCByZXN1bHQuICovCi0JaWYgKHJldmVyc2UgJiYgc2F2ZWRfb2Jfc2l6ZSA+IDEpCi0JCXJldmVyc2Vfc2xpY2Uoc2F2ZWRfb2JfaXRlbSwgc2F2ZWRfb2JfaXRlbSArIHNhdmVkX29iX3NpemUpOworICAgIC8qIFJldmVyc2Ugc29ydCBzdGFiaWxpdHkgYWNoaWV2ZWQgYnkgaW5pdGlhbGx5IHJldmVyc2luZyB0aGUgbGlzdCwKKyAgICBhcHBseWluZyBhIHN0YWJsZSBmb3J3YXJkIHNvcnQsIHRoZW4gcmV2ZXJzaW5nIHRoZSBmaW5hbCByZXN1bHQuICovCisgICAgaWYgKHJldmVyc2UgJiYgc2F2ZWRfb2Jfc2l6ZSA+IDEpCisgICAgICAgIHJldmVyc2Vfc2xpY2Uoc2F2ZWRfb2JfaXRlbSwgc2F2ZWRfb2JfaXRlbSArIHNhdmVkX29iX3NpemUpOwogCi0JbWVyZ2VfaW5pdCgmbXMsIGNvbXBhcmUpOworICAgIG1lcmdlX2luaXQoJm1zLCBjb21wYXJlKTsKIAotCW5yZW1haW5pbmcgPSBzYXZlZF9vYl9zaXplOwotCWlmIChucmVtYWluaW5nIDwgMikKLQkJZ290byBzdWNjZWVkOworICAgIG5yZW1haW5pbmcgPSBzYXZlZF9vYl9zaXplOworICAgIGlmIChucmVtYWluaW5nIDwgMikKKyAgICAgICAgZ290byBzdWNjZWVkOwogCi0JLyogTWFyY2ggb3ZlciB0aGUgYXJyYXkgb25jZSwgbGVmdCB0byByaWdodCwgZmluZGluZyBuYXR1cmFsIHJ1bnMsCi0JICogYW5kIGV4dGVuZGluZyBzaG9ydCBuYXR1cmFsIHJ1bnMgdG8gbWlucnVuIGVsZW1lbnRzLgotCSAqLwotCWxvID0gc2F2ZWRfb2JfaXRlbTsKLQloaSA9IGxvICsgbnJlbWFpbmluZzsKLQltaW5ydW4gPSBtZXJnZV9jb21wdXRlX21pbnJ1bihucmVtYWluaW5nKTsKLQlkbyB7Ci0JCWludCBkZXNjZW5kaW5nOwotCQlQeV9zc2l6ZV90IG47CisgICAgLyogTWFyY2ggb3ZlciB0aGUgYXJyYXkgb25jZSwgbGVmdCB0byByaWdodCwgZmluZGluZyBuYXR1cmFsIHJ1bnMsCisgICAgICogYW5kIGV4dGVuZGluZyBzaG9ydCBuYXR1cmFsIHJ1bnMgdG8gbWlucnVuIGVsZW1lbnRzLgorICAgICAqLworICAgIGxvID0gc2F2ZWRfb2JfaXRlbTsKKyAgICBoaSA9IGxvICsgbnJlbWFpbmluZzsKKyAgICBtaW5ydW4gPSBtZXJnZV9jb21wdXRlX21pbnJ1bihucmVtYWluaW5nKTsKKyAgICBkbyB7CisgICAgICAgIGludCBkZXNjZW5kaW5nOworICAgICAgICBQeV9zc2l6ZV90IG47CiAKLQkJLyogSWRlbnRpZnkgbmV4dCBydW4uICovCi0JCW4gPSBjb3VudF9ydW4obG8sIGhpLCBjb21wYXJlLCAmZGVzY2VuZGluZyk7Ci0JCWlmIChuIDwgMCkKLQkJCWdvdG8gZmFpbDsKLQkJaWYgKGRlc2NlbmRpbmcpCi0JCQlyZXZlcnNlX3NsaWNlKGxvLCBsbyArIG4pOwotCQkvKiBJZiBzaG9ydCwgZXh0ZW5kIHRvIG1pbihtaW5ydW4sIG5yZW1haW5pbmcpLiAqLwotCQlpZiAobiA8IG1pbnJ1bikgewotCQkJY29uc3QgUHlfc3NpemVfdCBmb3JjZSA9IG5yZW1haW5pbmcgPD0gbWlucnVuID8KLQkgCQkJICAJICBucmVtYWluaW5nIDogbWlucnVuOwotCQkJaWYgKGJpbmFyeXNvcnQobG8sIGxvICsgZm9yY2UsIGxvICsgbiwgY29tcGFyZSkgPCAwKQotCQkJCWdvdG8gZmFpbDsKLQkJCW4gPSBmb3JjZTsKLQkJfQotCQkvKiBQdXNoIHJ1biBvbnRvIHBlbmRpbmctcnVucyBzdGFjaywgYW5kIG1heWJlIG1lcmdlLiAqLwotCQlhc3NlcnQobXMubiA8IE1BWF9NRVJHRV9QRU5ESU5HKTsKLQkJbXMucGVuZGluZ1ttcy5uXS5iYXNlID0gbG87Ci0JCW1zLnBlbmRpbmdbbXMubl0ubGVuID0gbjsKLQkJKyttcy5uOwotCQlpZiAobWVyZ2VfY29sbGFwc2UoJm1zKSA8IDApCi0JCQlnb3RvIGZhaWw7Ci0JCS8qIEFkdmFuY2UgdG8gZmluZCBuZXh0IHJ1bi4gKi8KLQkJbG8gKz0gbjsKLQkJbnJlbWFpbmluZyAtPSBuOwotCX0gd2hpbGUgKG5yZW1haW5pbmcpOwotCWFzc2VydChsbyA9PSBoaSk7CisgICAgICAgIC8qIElkZW50aWZ5IG5leHQgcnVuLiAqLworICAgICAgICBuID0gY291bnRfcnVuKGxvLCBoaSwgY29tcGFyZSwgJmRlc2NlbmRpbmcpOworICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGlmIChkZXNjZW5kaW5nKQorICAgICAgICAgICAgcmV2ZXJzZV9zbGljZShsbywgbG8gKyBuKTsKKyAgICAgICAgLyogSWYgc2hvcnQsIGV4dGVuZCB0byBtaW4obWlucnVuLCBucmVtYWluaW5nKS4gKi8KKyAgICAgICAgaWYgKG4gPCBtaW5ydW4pIHsKKyAgICAgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgZm9yY2UgPSBucmVtYWluaW5nIDw9IG1pbnJ1biA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmVtYWluaW5nIDogbWlucnVuOworICAgICAgICAgICAgaWYgKGJpbmFyeXNvcnQobG8sIGxvICsgZm9yY2UsIGxvICsgbiwgY29tcGFyZSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIG4gPSBmb3JjZTsKKyAgICAgICAgfQorICAgICAgICAvKiBQdXNoIHJ1biBvbnRvIHBlbmRpbmctcnVucyBzdGFjaywgYW5kIG1heWJlIG1lcmdlLiAqLworICAgICAgICBhc3NlcnQobXMubiA8IE1BWF9NRVJHRV9QRU5ESU5HKTsKKyAgICAgICAgbXMucGVuZGluZ1ttcy5uXS5iYXNlID0gbG87CisgICAgICAgIG1zLnBlbmRpbmdbbXMubl0ubGVuID0gbjsKKyAgICAgICAgKyttcy5uOworICAgICAgICBpZiAobWVyZ2VfY29sbGFwc2UoJm1zKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIC8qIEFkdmFuY2UgdG8gZmluZCBuZXh0IHJ1bi4gKi8KKyAgICAgICAgbG8gKz0gbjsKKyAgICAgICAgbnJlbWFpbmluZyAtPSBuOworICAgIH0gd2hpbGUgKG5yZW1haW5pbmcpOworICAgIGFzc2VydChsbyA9PSBoaSk7CiAKLQlpZiAobWVyZ2VfZm9yY2VfY29sbGFwc2UoJm1zKSA8IDApCi0JCWdvdG8gZmFpbDsKLQlhc3NlcnQobXMubiA9PSAxKTsKLQlhc3NlcnQobXMucGVuZGluZ1swXS5iYXNlID09IHNhdmVkX29iX2l0ZW0pOwotCWFzc2VydChtcy5wZW5kaW5nWzBdLmxlbiA9PSBzYXZlZF9vYl9zaXplKTsKKyAgICBpZiAobWVyZ2VfZm9yY2VfY29sbGFwc2UoJm1zKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBhc3NlcnQobXMubiA9PSAxKTsKKyAgICBhc3NlcnQobXMucGVuZGluZ1swXS5iYXNlID09IHNhdmVkX29iX2l0ZW0pOworICAgIGFzc2VydChtcy5wZW5kaW5nWzBdLmxlbiA9PSBzYXZlZF9vYl9zaXplKTsKIAogc3VjY2VlZDoKLQlyZXN1bHQgPSBQeV9Ob25lOworICAgIHJlc3VsdCA9IFB5X05vbmU7CiBmYWlsOgotCWlmIChrZXlmdW5jICE9IE5VTEwpIHsKLQkJZm9yIChpPTAgOyBpIDwgc2F2ZWRfb2Jfc2l6ZSA7IGkrKykgewotCQkJa3ZwYWlyID0gc2F2ZWRfb2JfaXRlbVtpXTsKLQkJCXZhbHVlID0gc29ydHdyYXBwZXJfZ2V0dmFsdWUoa3ZwYWlyKTsKLQkJCXNhdmVkX29iX2l0ZW1baV0gPSB2YWx1ZTsKLQkJCVB5X0RFQ1JFRihrdnBhaXIpOwotCQl9Ci0JfQorICAgIGlmIChrZXlmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpPTAgOyBpIDwgc2F2ZWRfb2Jfc2l6ZSA7IGkrKykgeworICAgICAgICAgICAga3ZwYWlyID0gc2F2ZWRfb2JfaXRlbVtpXTsKKyAgICAgICAgICAgIHZhbHVlID0gc29ydHdyYXBwZXJfZ2V0dmFsdWUoa3ZwYWlyKTsKKyAgICAgICAgICAgIHNhdmVkX29iX2l0ZW1baV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrdnBhaXIpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKHNlbGYtPmFsbG9jYXRlZCAhPSAtMSAmJiByZXN1bHQgIT0gTlVMTCkgewotCQkvKiBUaGUgdXNlciBtdWNrZWQgd2l0aCB0aGUgbGlzdCBkdXJpbmcgdGhlIHNvcnQsCi0JCSAqIGFuZCB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgYW5vdGhlciBlcnJvciB0byByZXBvcnQuCi0JCSAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxpc3QgbW9kaWZpZWQgZHVyaW5nIHNvcnQiKTsKLQkJcmVzdWx0ID0gTlVMTDsKLQl9CisgICAgaWYgKHNlbGYtPmFsbG9jYXRlZCAhPSAtMSAmJiByZXN1bHQgIT0gTlVMTCkgeworICAgICAgICAvKiBUaGUgdXNlciBtdWNrZWQgd2l0aCB0aGUgbGlzdCBkdXJpbmcgdGhlIHNvcnQsCisgICAgICAgICAqIGFuZCB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgYW5vdGhlciBlcnJvciB0byByZXBvcnQuCisgICAgICAgICAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxpc3QgbW9kaWZpZWQgZHVyaW5nIHNvcnQiKTsKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICB9CiAKLQlpZiAocmV2ZXJzZSAmJiBzYXZlZF9vYl9zaXplID4gMSkKLQkJcmV2ZXJzZV9zbGljZShzYXZlZF9vYl9pdGVtLCBzYXZlZF9vYl9pdGVtICsgc2F2ZWRfb2Jfc2l6ZSk7CisgICAgaWYgKHJldmVyc2UgJiYgc2F2ZWRfb2Jfc2l6ZSA+IDEpCisgICAgICAgIHJldmVyc2Vfc2xpY2Uoc2F2ZWRfb2JfaXRlbSwgc2F2ZWRfb2JfaXRlbSArIHNhdmVkX29iX3NpemUpOwogCi0JbWVyZ2VfZnJlZW1lbSgmbXMpOworICAgIG1lcmdlX2ZyZWVtZW0oJm1zKTsKIAogZHN1X2ZhaWw6Ci0JZmluYWxfb2JfaXRlbSA9IHNlbGYtPm9iX2l0ZW07Ci0JaSA9IFB5X1NJWkUoc2VsZik7Ci0JUHlfU0laRShzZWxmKSA9IHNhdmVkX29iX3NpemU7Ci0Jc2VsZi0+b2JfaXRlbSA9IHNhdmVkX29iX2l0ZW07Ci0Jc2VsZi0+YWxsb2NhdGVkID0gc2F2ZWRfYWxsb2NhdGVkOwotCWlmIChmaW5hbF9vYl9pdGVtICE9IE5VTEwpIHsKLQkJLyogd2UgY2Fubm90IHVzZSBsaXN0X2NsZWFyKCkgZm9yIHRoaXMgYmVjYXVzZSBpdCBkb2VzIG5vdAotCQkgICBndWFyYW50ZWUgdGhhdCB0aGUgbGlzdCBpcyByZWFsbHkgZW1wdHkgd2hlbiBpdCByZXR1cm5zICovCi0JCXdoaWxlICgtLWkgPj0gMCkgewotCQkJUHlfWERFQ1JFRihmaW5hbF9vYl9pdGVtW2ldKTsKLQkJfQotCQlQeU1lbV9GUkVFKGZpbmFsX29iX2l0ZW0pOwotCX0KLQlQeV9YREVDUkVGKGNvbXBhcmUpOwotCVB5X1hJTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGZpbmFsX29iX2l0ZW0gPSBzZWxmLT5vYl9pdGVtOworICAgIGkgPSBQeV9TSVpFKHNlbGYpOworICAgIFB5X1NJWkUoc2VsZikgPSBzYXZlZF9vYl9zaXplOworICAgIHNlbGYtPm9iX2l0ZW0gPSBzYXZlZF9vYl9pdGVtOworICAgIHNlbGYtPmFsbG9jYXRlZCA9IHNhdmVkX2FsbG9jYXRlZDsKKyAgICBpZiAoZmluYWxfb2JfaXRlbSAhPSBOVUxMKSB7CisgICAgICAgIC8qIHdlIGNhbm5vdCB1c2UgbGlzdF9jbGVhcigpIGZvciB0aGlzIGJlY2F1c2UgaXQgZG9lcyBub3QKKyAgICAgICAgICAgZ3VhcmFudGVlIHRoYXQgdGhlIGxpc3QgaXMgcmVhbGx5IGVtcHR5IHdoZW4gaXQgcmV0dXJucyAqLworICAgICAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoZmluYWxfb2JfaXRlbVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgUHlNZW1fRlJFRShmaW5hbF9vYl9pdGVtKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihjb21wYXJlKTsKKyAgICBQeV9YSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KICN1bmRlZiBJRkxUCiAjdW5kZWYgSVNMVApAQCAtMjIxNCwyNjIgKzIyMTQsMjYyIEBACiBpbnQKIFB5TGlzdF9Tb3J0KFB5T2JqZWN0ICp2KQogewotCWlmICh2ID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh2KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl2ID0gbGlzdHNvcnQoKFB5TGlzdE9iamVjdCAqKXYsIChQeU9iamVjdCAqKU5VTEwsIChQeU9iamVjdCAqKU5VTEwpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHYgPSBsaXN0c29ydCgoUHlMaXN0T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopTlVMTCwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RyZXZlcnNlKFB5TGlzdE9iamVjdCAqc2VsZikKIHsKLQlpZiAoUHlfU0laRShzZWxmKSA+IDEpCi0JCXJldmVyc2Vfc2xpY2Uoc2VsZi0+b2JfaXRlbSwgc2VsZi0+b2JfaXRlbSArIFB5X1NJWkUoc2VsZikpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGlmIChQeV9TSVpFKHNlbGYpID4gMSkKKyAgICAgICAgcmV2ZXJzZV9zbGljZShzZWxmLT5vYl9pdGVtLCBzZWxmLT5vYl9pdGVtICsgUHlfU0laRShzZWxmKSk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIGludAogUHlMaXN0X1JldmVyc2UoUHlPYmplY3QgKnYpCiB7Ci0JUHlMaXN0T2JqZWN0ICpzZWxmID0gKFB5TGlzdE9iamVjdCAqKXY7CisgICAgUHlMaXN0T2JqZWN0ICpzZWxmID0gKFB5TGlzdE9iamVjdCAqKXY7CiAKLQlpZiAodiA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sodikpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5X1NJWkUoc2VsZikgPiAxKQotCQlyZXZlcnNlX3NsaWNlKHNlbGYtPm9iX2l0ZW0sIHNlbGYtPm9iX2l0ZW0gKyBQeV9TSVpFKHNlbGYpKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodiA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sodikpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKFB5X1NJWkUoc2VsZikgPiAxKQorICAgICAgICByZXZlcnNlX3NsaWNlKHNlbGYtPm9iX2l0ZW0sIHNlbGYtPm9iX2l0ZW0gKyBQeV9TSVpFKHNlbGYpKTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlPYmplY3QgKgogUHlMaXN0X0FzVHVwbGUoUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKnc7Ci0JUHlPYmplY3QgKipwLCAqKnE7Ci0JUHlfc3NpemVfdCBuOwotCWlmICh2ID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh2KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW4gPSBQeV9TSVpFKHYpOwotCXcgPSBQeVR1cGxlX05ldyhuKTsKLQlpZiAodyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwID0gKChQeVR1cGxlT2JqZWN0ICopdyktPm9iX2l0ZW07Ci0JcSA9ICgoUHlMaXN0T2JqZWN0ICopdiktPm9iX2l0ZW07Ci0Jd2hpbGUgKC0tbiA+PSAwKSB7Ci0JCVB5X0lOQ1JFRigqcSk7Ci0JCSpwID0gKnE7Ci0JCXArKzsKLQkJcSsrOwotCX0KLQlyZXR1cm4gdzsKKyAgICBQeU9iamVjdCAqdzsKKyAgICBQeU9iamVjdCAqKnAsICoqcTsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbiA9IFB5X1NJWkUodik7CisgICAgdyA9IFB5VHVwbGVfTmV3KG4pOworICAgIGlmICh3ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSAoKFB5VHVwbGVPYmplY3QgKil3KS0+b2JfaXRlbTsKKyAgICBxID0gKChQeUxpc3RPYmplY3QgKil2KS0+b2JfaXRlbTsKKyAgICB3aGlsZSAoLS1uID49IDApIHsKKyAgICAgICAgUHlfSU5DUkVGKCpxKTsKKyAgICAgICAgKnAgPSAqcTsKKyAgICAgICAgcCsrOworICAgICAgICBxKys7CisgICAgfQorICAgIHJldHVybiB3OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdGluZGV4KFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpLCBzdGFydD0wLCBzdG9wPVB5X1NJWkUoc2VsZik7Ci0JUHlPYmplY3QgKnYsICpmb3JtYXRfdHVwbGUsICplcnJfc3RyaW5nOwotCXN0YXRpYyBQeU9iamVjdCAqZXJyX2Zvcm1hdCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBpLCBzdGFydD0wLCBzdG9wPVB5X1NJWkUoc2VsZik7CisgICAgUHlPYmplY3QgKnYsICpmb3JtYXRfdHVwbGUsICplcnJfc3RyaW5nOworICAgIHN0YXRpYyBQeU9iamVjdCAqZXJyX2Zvcm1hdCA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjppbmRleCIsICZ2LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RvcCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChzdGFydCA8IDApIHsKLQkJc3RhcnQgKz0gUHlfU0laRShzZWxmKTsKLQkJaWYgKHN0YXJ0IDwgMCkKLQkJCXN0YXJ0ID0gMDsKLQl9Ci0JaWYgKHN0b3AgPCAwKSB7Ci0JCXN0b3AgKz0gUHlfU0laRShzZWxmKTsKLQkJaWYgKHN0b3AgPCAwKQotCQkJc3RvcCA9IDA7Ci0JfQotCWZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcCAmJiBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOwotCQlpZiAoY21wID4gMCkKLQkJCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChpKTsKLQkJZWxzZSBpZiAoY21wIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZXJyX2Zvcm1hdCA9PSBOVUxMKSB7Ci0JCWVycl9mb3JtYXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIlciBpcyBub3QgaW4gbGlzdCIpOwotCQlpZiAoZXJyX2Zvcm1hdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvcm1hdF90dXBsZSA9IFB5VHVwbGVfUGFjaygxLCB2KTsKLQlpZiAoZm9ybWF0X3R1cGxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWVycl9zdHJpbmcgPSBQeVN0cmluZ19Gb3JtYXQoZXJyX2Zvcm1hdCwgZm9ybWF0X3R1cGxlKTsKLQlQeV9ERUNSRUYoZm9ybWF0X3R1cGxlKTsKLQlpZiAoZXJyX3N0cmluZyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeUVycl9TZXRPYmplY3QoUHlFeGNfVmFsdWVFcnJvciwgZXJyX3N0cmluZyk7Ci0JUHlfREVDUkVGKGVycl9zdHJpbmcpOwotCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmluZGV4IiwgJnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdG9wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHN0YXJ0IDwgMCkgeworICAgICAgICBzdGFydCArPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgc3RhcnQgPSAwOworICAgIH0KKyAgICBpZiAoc3RvcCA8IDApIHsKKyAgICAgICAgc3RvcCArPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBpZiAoc3RvcCA8IDApCisgICAgICAgICAgICBzdG9wID0gMDsKKyAgICB9CisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wICYmIGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKKyAgICAgICAgaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmLT5vYl9pdGVtW2ldLCB2LCBQeV9FUSk7CisgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGkpOworICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChlcnJfZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgZXJyX2Zvcm1hdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiVyIGlzIG5vdCBpbiBsaXN0Iik7CisgICAgICAgIGlmIChlcnJfZm9ybWF0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9ybWF0X3R1cGxlID0gUHlUdXBsZV9QYWNrKDEsIHYpOworICAgIGlmIChmb3JtYXRfdHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyX3N0cmluZyA9IFB5U3RyaW5nX0Zvcm1hdChlcnJfZm9ybWF0LCBmb3JtYXRfdHVwbGUpOworICAgIFB5X0RFQ1JFRihmb3JtYXRfdHVwbGUpOworICAgIGlmIChlcnJfc3RyaW5nID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19WYWx1ZUVycm9yLCBlcnJfc3RyaW5nKTsKKyAgICBQeV9ERUNSRUYoZXJyX3N0cmluZyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0Y291bnQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IGNvdW50ID0gMDsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBjb3VudCA9IDA7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgewotCQlpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGYtPm9iX2l0ZW1baV0sIHYsIFB5X0VRKTsKLQkJaWYgKGNtcCA+IDApCi0JCQljb3VudCsrOwotCQllbHNlIGlmIChjbXAgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgeworICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGYtPm9iX2l0ZW1baV0sIHYsIFB5X0VRKTsKKyAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0cmVtb3ZlKFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKLQkJaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmLT5vYl9pdGVtW2ldLCB2LCBQeV9FUSk7Ci0JCWlmIChjbXAgPiAwKSB7Ci0JCQlpZiAobGlzdF9hc3Nfc2xpY2Uoc2VsZiwgaSwgaSsxLAotCQkJCQkgICAoUHlPYmplY3QgKilOVUxMKSA9PSAwKQotCQkJCVB5X1JFVFVSTl9OT05FOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZWxzZSBpZiAoY21wIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxpc3QucmVtb3ZlKHgpOiB4IG5vdCBpbiBsaXN0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgeworICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGYtPm9iX2l0ZW1baV0sIHYsIFB5X0VRKTsKKyAgICAgICAgaWYgKGNtcCA+IDApIHsKKyAgICAgICAgICAgIGlmIChsaXN0X2Fzc19zbGljZShzZWxmLCBpLCBpKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopTlVMTCkgPT0gMCkKKyAgICAgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsaXN0LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBsaXN0X3RyYXZlcnNlKFB5TGlzdE9iamVjdCAqbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaSA9IFB5X1NJWkUobyk7IC0taSA+PSAwOyApCi0JCVB5X1ZJU0lUKG8tPm9iX2l0ZW1baV0pOwotCXJldHVybiAwOworICAgIGZvciAoaSA9IFB5X1NJWkUobyk7IC0taSA+PSAwOyApCisgICAgICAgIFB5X1ZJU0lUKG8tPm9iX2l0ZW1baV0pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdF9yaWNoY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeUxpc3RPYmplY3QgKnZsLCAqd2w7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5TGlzdE9iamVjdCAqdmwsICp3bDsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAoIVB5TGlzdF9DaGVjayh2KSB8fCAhUHlMaXN0X0NoZWNrKHcpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sodikgfHwgIVB5TGlzdF9DaGVjayh3KSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JdmwgPSAoUHlMaXN0T2JqZWN0ICopdjsKLQl3bCA9IChQeUxpc3RPYmplY3QgKil3OworICAgIHZsID0gKFB5TGlzdE9iamVjdCAqKXY7CisgICAgd2wgPSAoUHlMaXN0T2JqZWN0ICopdzsKIAotCWlmIChQeV9TSVpFKHZsKSAhPSBQeV9TSVpFKHdsKSAmJiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpKSB7Ci0JCS8qIFNob3J0Y3V0OiBpZiB0aGUgbGVuZ3RocyBkaWZmZXIsIHRoZSBsaXN0cyBkaWZmZXIgKi8KLQkJUHlPYmplY3QgKnJlczsKLQkJaWYgKG9wID09IFB5X0VRKQotCQkJcmVzID0gUHlfRmFsc2U7Ci0JCWVsc2UKLQkJCXJlcyA9IFB5X1RydWU7Ci0JCVB5X0lOQ1JFRihyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KKyAgICBpZiAoUHlfU0laRSh2bCkgIT0gUHlfU0laRSh3bCkgJiYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSkgeworICAgICAgICAvKiBTaG9ydGN1dDogaWYgdGhlIGxlbmd0aHMgZGlmZmVyLCB0aGUgbGlzdHMgZGlmZmVyICovCisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIGlmIChvcCA9PSBQeV9FUSkKKyAgICAgICAgICAgIHJlcyA9IFB5X0ZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBQeV9UcnVlOworICAgICAgICBQeV9JTkNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQkvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBpbmRleCB3aGVyZSBpdGVtcyBhcmUgZGlmZmVyZW50ICovCi0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUodmwpICYmIGkgPCBQeV9TSVpFKHdsKTsgaSsrKSB7Ci0JCWludCBrID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHZsLT5vYl9pdGVtW2ldLAotCQkJCQkJIHdsLT5vYl9pdGVtW2ldLCBQeV9FUSk7Ci0JCWlmIChrIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoIWspCi0JCQlicmVhazsKLQl9CisgICAgLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgaW5kZXggd2hlcmUgaXRlbXMgYXJlIGRpZmZlcmVudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHZsKSAmJiBpIDwgUHlfU0laRSh3bCk7IGkrKykgeworICAgICAgICBpbnQgayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2bC0+b2JfaXRlbVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2wtPm9iX2l0ZW1baV0sIFB5X0VRKTsKKyAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghaykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIAotCWlmIChpID49IFB5X1NJWkUodmwpIHx8IGkgPj0gUHlfU0laRSh3bCkpIHsKLQkJLyogTm8gbW9yZSBpdGVtcyB0byBjb21wYXJlIC0tIGNvbXBhcmUgc2l6ZXMgKi8KLQkJUHlfc3NpemVfdCB2cyA9IFB5X1NJWkUodmwpOwotCQlQeV9zc2l6ZV90IHdzID0gUHlfU0laRSh3bCk7Ci0JCWludCBjbXA7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCXN3aXRjaCAob3ApIHsKLQkJY2FzZSBQeV9MVDogY21wID0gdnMgPCAgd3M7IGJyZWFrOwotCQljYXNlIFB5X0xFOiBjbXAgPSB2cyA8PSB3czsgYnJlYWs7Ci0JCWNhc2UgUHlfRVE6IGNtcCA9IHZzID09IHdzOyBicmVhazsKLQkJY2FzZSBQeV9ORTogY21wID0gdnMgIT0gd3M7IGJyZWFrOwotCQljYXNlIFB5X0dUOiBjbXAgPSB2cyA+ICB3czsgYnJlYWs7Ci0JCWNhc2UgUHlfR0U6IGNtcCA9IHZzID49IHdzOyBicmVhazsKLQkJZGVmYXVsdDogcmV0dXJuIE5VTEw7IC8qIGNhbm5vdCBoYXBwZW4gKi8KLQkJfQotCQlpZiAoY21wKQotCQkJcmVzID0gUHlfVHJ1ZTsKLQkJZWxzZQotCQkJcmVzID0gUHlfRmFsc2U7Ci0JCVB5X0lOQ1JFRihyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KKyAgICBpZiAoaSA+PSBQeV9TSVpFKHZsKSB8fCBpID49IFB5X1NJWkUod2wpKSB7CisgICAgICAgIC8qIE5vIG1vcmUgaXRlbXMgdG8gY29tcGFyZSAtLSBjb21wYXJlIHNpemVzICovCisgICAgICAgIFB5X3NzaXplX3QgdnMgPSBQeV9TSVpFKHZsKTsKKyAgICAgICAgUHlfc3NpemVfdCB3cyA9IFB5X1NJWkUod2wpOworICAgICAgICBpbnQgY21wOworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgUHlfTFQ6IGNtcCA9IHZzIDwgIHdzOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9MRTogY21wID0gdnMgPD0gd3M7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0VROiBjbXAgPSB2cyA9PSB3czsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTkU6IGNtcCA9IHZzICE9IHdzOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9HVDogY21wID0gdnMgPiAgd3M7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0dFOiBjbXAgPSB2cyA+PSB3czsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBjYW5ub3QgaGFwcGVuICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCkKKyAgICAgICAgICAgIHJlcyA9IFB5X1RydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFB5X0ZhbHNlOworICAgICAgICBQeV9JTkNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQkvKiBXZSBoYXZlIGFuIGl0ZW0gdGhhdCBkaWZmZXJzIC0tIHNob3J0Y3V0cyBmb3IgRVEvTkUgKi8KLQlpZiAob3AgPT0gUHlfRVEpIHsKLQkJUHlfSU5DUkVGKFB5X0ZhbHNlKTsKLQkJcmV0dXJuIFB5X0ZhbHNlOwotCX0KLQlpZiAob3AgPT0gUHlfTkUpIHsKLQkJUHlfSU5DUkVGKFB5X1RydWUpOwotCQlyZXR1cm4gUHlfVHJ1ZTsKLQl9CisgICAgLyogV2UgaGF2ZSBhbiBpdGVtIHRoYXQgZGlmZmVycyAtLSBzaG9ydGN1dHMgZm9yIEVRL05FICovCisgICAgaWYgKG9wID09IFB5X0VRKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgICAgIHJldHVybiBQeV9GYWxzZTsKKyAgICB9CisgICAgaWYgKG9wID09IFB5X05FKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9UcnVlKTsKKyAgICAgICAgcmV0dXJuIFB5X1RydWU7CisgICAgfQogCi0JLyogQ29tcGFyZSB0aGUgZmluYWwgaXRlbSBhZ2FpbiB1c2luZyB0aGUgcHJvcGVyIG9wZXJhdG9yICovCi0JcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKHZsLT5vYl9pdGVtW2ldLCB3bC0+b2JfaXRlbVtpXSwgb3ApOworICAgIC8qIENvbXBhcmUgdGhlIGZpbmFsIGl0ZW0gYWdhaW4gdXNpbmcgdGhlIHByb3BlciBvcGVyYXRvciAqLworICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZSh2bC0+b2JfaXRlbVtpXSwgd2wtPm9iX2l0ZW1baV0sIG9wKTsKIH0KIAogc3RhdGljIGludAogbGlzdF9pbml0KFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqYXJnID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNlcXVlbmNlIiwgMH07CisgICAgUHlPYmplY3QgKmFyZyA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzZXF1ZW5jZSIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8TzpsaXN0Iiwga3dsaXN0LCAmYXJnKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifE86bGlzdCIsIGt3bGlzdCwgJmFyZykpCisgICAgICAgIHJldHVybiAtMTsKIAotCS8qIFZlcmlmeSBsaXN0IGludmFyaWFudHMgZXN0YWJsaXNoZWQgYnkgUHlUeXBlX0dlbmVyaWNBbGxvYygpICovCi0JYXNzZXJ0KDAgPD0gUHlfU0laRShzZWxmKSk7Ci0JYXNzZXJ0KFB5X1NJWkUoc2VsZikgPD0gc2VsZi0+YWxsb2NhdGVkIHx8IHNlbGYtPmFsbG9jYXRlZCA9PSAtMSk7Ci0JYXNzZXJ0KHNlbGYtPm9iX2l0ZW0gIT0gTlVMTCB8fAotCSAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPT0gMCB8fCBzZWxmLT5hbGxvY2F0ZWQgPT0gLTEpOworICAgIC8qIFZlcmlmeSBsaXN0IGludmFyaWFudHMgZXN0YWJsaXNoZWQgYnkgUHlUeXBlX0dlbmVyaWNBbGxvYygpICovCisgICAgYXNzZXJ0KDAgPD0gUHlfU0laRShzZWxmKSk7CisgICAgYXNzZXJ0KFB5X1NJWkUoc2VsZikgPD0gc2VsZi0+YWxsb2NhdGVkIHx8IHNlbGYtPmFsbG9jYXRlZCA9PSAtMSk7CisgICAgYXNzZXJ0KHNlbGYtPm9iX2l0ZW0gIT0gTlVMTCB8fAorICAgICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPT0gMCB8fCBzZWxmLT5hbGxvY2F0ZWQgPT0gLTEpOwogCi0JLyogRW1wdHkgcHJldmlvdXMgY29udGVudHMgKi8KLQlpZiAoc2VsZi0+b2JfaXRlbSAhPSBOVUxMKSB7Ci0JCSh2b2lkKWxpc3RfY2xlYXIoc2VsZik7Ci0JfQotCWlmIChhcmcgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcnYgPSBsaXN0ZXh0ZW5kKHNlbGYsIGFyZyk7Ci0JCWlmIChydiA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYocnYpOwotCX0KLQlyZXR1cm4gMDsKKyAgICAvKiBFbXB0eSBwcmV2aW91cyBjb250ZW50cyAqLworICAgIGlmIChzZWxmLT5vYl9pdGVtICE9IE5VTEwpIHsKKyAgICAgICAgKHZvaWQpbGlzdF9jbGVhcihzZWxmKTsKKyAgICB9CisgICAgaWYgKGFyZyAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpydiA9IGxpc3RleHRlbmQoc2VsZiwgYXJnKTsKKyAgICAgICAgaWYgKHJ2ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdF9zaXplb2YoUHlMaXN0T2JqZWN0ICpzZWxmKQogewotCVB5X3NzaXplX3QgcmVzOworICAgIFB5X3NzaXplX3QgcmVzOwogCi0JcmVzID0gc2l6ZW9mKFB5TGlzdE9iamVjdCkgKyBzZWxmLT5hbGxvY2F0ZWQgKiBzaXplb2Yodm9pZCopOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOworICAgIHJlcyA9IHNpemVvZihQeUxpc3RPYmplY3QpICsgc2VsZi0+YWxsb2NhdGVkICogc2l6ZW9mKHZvaWQqKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpsaXN0X2l0ZXIoUHlPYmplY3QgKnNlcSk7CkBAIC0yNTA3LDMyICsyNTA3LDMyIEBACiBzdGF0aWMgUHlPYmplY3QgKmxpc3Rfc3Vic2NyaXB0KFB5TGlzdE9iamVjdCosIFB5T2JqZWN0Kik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBsaXN0X21ldGhvZHNbXSA9IHsKLQl7Il9fZ2V0aXRlbV9fIiwgKFB5Q0Z1bmN0aW9uKWxpc3Rfc3Vic2NyaXB0LCBNRVRIX098TUVUSF9DT0VYSVNULCBnZXRpdGVtX2RvY30sCi0JeyJfX3JldmVyc2VkX18iLChQeUNGdW5jdGlvbilsaXN0X3JldmVyc2VkLCBNRVRIX05PQVJHUywgcmV2ZXJzZWRfZG9jfSwKLQl7Il9fc2l6ZW9mX18iLCAgKFB5Q0Z1bmN0aW9uKWxpc3Rfc2l6ZW9mLCBNRVRIX05PQVJHUywgc2l6ZW9mX2RvY30sCi0JeyJhcHBlbmQiLAkoUHlDRnVuY3Rpb24pbGlzdGFwcGVuZCwgIE1FVEhfTywgYXBwZW5kX2RvY30sCi0JeyJpbnNlcnQiLAkoUHlDRnVuY3Rpb24pbGlzdGluc2VydCwgIE1FVEhfVkFSQVJHUywgaW5zZXJ0X2RvY30sCi0JeyJleHRlbmQiLCAgICAgIChQeUNGdW5jdGlvbilsaXN0ZXh0ZW5kLCAgTUVUSF9PLCBleHRlbmRfZG9jfSwKLQl7InBvcCIsCQkoUHlDRnVuY3Rpb24pbGlzdHBvcCwgCSAgTUVUSF9WQVJBUkdTLCBwb3BfZG9jfSwKLQl7InJlbW92ZSIsCShQeUNGdW5jdGlvbilsaXN0cmVtb3ZlLCAgTUVUSF9PLCByZW1vdmVfZG9jfSwKLQl7ImluZGV4IiwJKFB5Q0Z1bmN0aW9uKWxpc3RpbmRleCwgICBNRVRIX1ZBUkFSR1MsIGluZGV4X2RvY30sCi0JeyJjb3VudCIsCShQeUNGdW5jdGlvbilsaXN0Y291bnQsICAgTUVUSF9PLCBjb3VudF9kb2N9LAotCXsicmV2ZXJzZSIsCShQeUNGdW5jdGlvbilsaXN0cmV2ZXJzZSwgTUVUSF9OT0FSR1MsIHJldmVyc2VfZG9jfSwKLQl7InNvcnQiLAkoUHlDRnVuY3Rpb24pbGlzdHNvcnQsIAkgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHNvcnRfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fZ2V0aXRlbV9fIiwgKFB5Q0Z1bmN0aW9uKWxpc3Rfc3Vic2NyaXB0LCBNRVRIX098TUVUSF9DT0VYSVNULCBnZXRpdGVtX2RvY30sCisgICAgeyJfX3JldmVyc2VkX18iLChQeUNGdW5jdGlvbilsaXN0X3JldmVyc2VkLCBNRVRIX05PQVJHUywgcmV2ZXJzZWRfZG9jfSwKKyAgICB7Il9fc2l6ZW9mX18iLCAgKFB5Q0Z1bmN0aW9uKWxpc3Rfc2l6ZW9mLCBNRVRIX05PQVJHUywgc2l6ZW9mX2RvY30sCisgICAgeyJhcHBlbmQiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pbGlzdGFwcGVuZCwgIE1FVEhfTywgYXBwZW5kX2RvY30sCisgICAgeyJpbnNlcnQiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pbGlzdGluc2VydCwgIE1FVEhfVkFSQVJHUywgaW5zZXJ0X2RvY30sCisgICAgeyJleHRlbmQiLCAgICAgIChQeUNGdW5jdGlvbilsaXN0ZXh0ZW5kLCAgTUVUSF9PLCBleHRlbmRfZG9jfSwKKyAgICB7InBvcCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilsaXN0cG9wLCAgICAgTUVUSF9WQVJBUkdTLCBwb3BfZG9jfSwKKyAgICB7InJlbW92ZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilsaXN0cmVtb3ZlLCAgTUVUSF9PLCByZW1vdmVfZG9jfSwKKyAgICB7ImluZGV4IiwgICAgICAgICAgIChQeUNGdW5jdGlvbilsaXN0aW5kZXgsICAgTUVUSF9WQVJBUkdTLCBpbmRleF9kb2N9LAorICAgIHsiY291bnQiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxpc3Rjb3VudCwgICBNRVRIX08sIGNvdW50X2RvY30sCisgICAgeyJyZXZlcnNlIiwgICAgICAgICAoUHlDRnVuY3Rpb24pbGlzdHJldmVyc2UsIE1FVEhfTk9BUkdTLCByZXZlcnNlX2RvY30sCisgICAgeyJzb3J0IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pbGlzdHNvcnQsICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHNvcnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGxpc3RfYXNfc2VxdWVuY2UgPSB7Ci0JKGxlbmZ1bmMpbGlzdF9sZW5ndGgsCQkJLyogc3FfbGVuZ3RoICovCi0JKGJpbmFyeWZ1bmMpbGlzdF9jb25jYXQsCQkvKiBzcV9jb25jYXQgKi8KLQkoc3NpemVhcmdmdW5jKWxpc3RfcmVwZWF0LAkJLyogc3FfcmVwZWF0ICovCi0JKHNzaXplYXJnZnVuYylsaXN0X2l0ZW0sCQkvKiBzcV9pdGVtICovCi0JKHNzaXplc3NpemVhcmdmdW5jKWxpc3Rfc2xpY2UsCQkvKiBzcV9zbGljZSAqLwotCShzc2l6ZW9iamFyZ3Byb2MpbGlzdF9hc3NfaXRlbSwJCS8qIHNxX2Fzc19pdGVtICovCi0JKHNzaXplc3NpemVvYmphcmdwcm9jKWxpc3RfYXNzX3NsaWNlLAkvKiBzcV9hc3Nfc2xpY2UgKi8KLQkob2Jqb2JqcHJvYylsaXN0X2NvbnRhaW5zLAkJLyogc3FfY29udGFpbnMgKi8KLQkoYmluYXJ5ZnVuYylsaXN0X2lucGxhY2VfY29uY2F0LAkvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpbGlzdF9pbnBsYWNlX3JlcGVhdCwJLyogc3FfaW5wbGFjZV9yZXBlYXQgKi8KKyAgICAobGVuZnVuYylsaXN0X2xlbmd0aCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aCAqLworICAgIChiaW5hcnlmdW5jKWxpc3RfY29uY2F0LCAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgKHNzaXplYXJnZnVuYylsaXN0X3JlcGVhdCwgICAgICAgICAgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKWxpc3RfaXRlbSwgICAgICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAoc3NpemVzc2l6ZWFyZ2Z1bmMpbGlzdF9zbGljZSwgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgKHNzaXplb2JqYXJncHJvYylsaXN0X2Fzc19pdGVtLCAgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIChzc2l6ZXNzaXplb2JqYXJncHJvYylsaXN0X2Fzc19zbGljZSwgICAgICAgLyogc3FfYXNzX3NsaWNlICovCisgICAgKG9iam9ianByb2MpbGlzdF9jb250YWlucywgICAgICAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLworICAgIChiaW5hcnlmdW5jKWxpc3RfaW5wbGFjZV9jb25jYXQsICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9jb25jYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKWxpc3RfaW5wbGFjZV9yZXBlYXQsICAgICAgICAgIC8qIHNxX2lucGxhY2VfcmVwZWF0ICovCiB9OwogCiBQeURvY19TVFJWQVIobGlzdF9kb2MsCkBAIC0yNTQzLDI3NSArMjU0MywyNzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X3N1YnNjcmlwdChQeUxpc3RPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBpdGVtKQogewotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaTsKLQkJaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoaSA8IDApCi0JCQlpICs9IFB5TGlzdF9HRVRfU0laRShzZWxmKTsKLQkJcmV0dXJuIGxpc3RfaXRlbShzZWxmLCBpKTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOwotCQlQeU9iamVjdCogcmVzdWx0OwotCQlQeU9iamVjdCogaXQ7Ci0JCVB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gUHlMaXN0X0dFVF9TSVpFKHNlbGYpOworICAgICAgICByZXR1cm4gbGlzdF9pdGVtKHNlbGYsIGkpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoLCBjdXIsIGk7CisgICAgICAgIFB5T2JqZWN0KiByZXN1bHQ7CisgICAgICAgIFB5T2JqZWN0KiBpdDsKKyAgICAgICAgUHlPYmplY3QgKipzcmMsICoqZGVzdDsKIAotCQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIFB5X1NJWkUoc2VsZiksCi0JCQkJICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0KilpdGVtLCBQeV9TSVpFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlpZiAoc2xpY2VsZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIFB5TGlzdF9OZXcoMCk7Ci0JCX0KLQkJZWxzZSBpZiAoc3RlcCA9PSAxKSB7Ci0JCQlyZXR1cm4gbGlzdF9zbGljZShzZWxmLCBzdGFydCwgc3RvcCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBQeUxpc3RfTmV3KHNsaWNlbGVuZ3RoKTsKLQkJCWlmICghcmVzdWx0KSByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHNsaWNlbGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQeUxpc3RfTmV3KDApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIGxpc3Rfc2xpY2Uoc2VsZiwgc3RhcnQsIHN0b3ApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlMaXN0X05ldyhzbGljZWxlbmd0aCk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIE5VTEw7CiAKLQkJCXNyYyA9IHNlbGYtPm9iX2l0ZW07Ci0JCQlkZXN0ID0gKChQeUxpc3RPYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtOwotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCWl0ID0gc3JjW2N1cl07Ci0JCQkJUHlfSU5DUkVGKGl0KTsKLQkJCQlkZXN0W2ldID0gaXQ7Ci0JCQl9CisgICAgICAgICAgICBzcmMgPSBzZWxmLT5vYl9pdGVtOworICAgICAgICAgICAgZGVzdCA9ICgoUHlMaXN0T2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbTsKKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBpdCA9IHNyY1tjdXJdOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IGl0OworICAgICAgICAgICAgfQogCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMsIG5vdCAlLjIwMHMiLAotCQkJICAgICBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBsaXN0X2Fzc19zdWJzY3JpcHQoUHlMaXN0T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogaXRlbSwgUHlPYmplY3QqIHZhbHVlKQogewotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBQeUxpc3RfR0VUX1NJWkUoc2VsZik7Ci0JCXJldHVybiBsaXN0X2Fzc19pdGVtKHNlbGYsIGksIHZhbHVlKTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aDsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gUHlMaXN0X0dFVF9TSVpFKHNlbGYpOworICAgICAgICByZXR1cm4gbGlzdF9hc3NfaXRlbShzZWxmLCBpLCB2YWx1ZSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGg7CiAKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0KilpdGVtLCBQeV9TSVpFKHNlbGYpLAotCQkJCSAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIFB5X1NJWkUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQlpZiAoc3RlcCA9PSAxKQotCQkJcmV0dXJuIGxpc3RfYXNzX3NsaWNlKHNlbGYsIHN0YXJ0LCBzdG9wLCB2YWx1ZSk7CisgICAgICAgIGlmIChzdGVwID09IDEpCisgICAgICAgICAgICByZXR1cm4gbGlzdF9hc3Nfc2xpY2Uoc2VsZiwgc3RhcnQsIHN0b3AsIHZhbHVlKTsKIAotCQkvKiBNYWtlIHN1cmUgc1s1OjJdID0gWy4uXSBpbnNlcnRzIGF0IHRoZSByaWdodCBwbGFjZToKLQkJICAgYmVmb3JlIDUsIG5vdCBiZWZvcmUgMi4gKi8KLQkJaWYgKChzdGVwIDwgMCAmJiBzdGFydCA8IHN0b3ApIHx8Ci0JCSAgICAoc3RlcCA+IDAgJiYgc3RhcnQgPiBzdG9wKSkKLQkJCXN0b3AgPSBzdGFydDsKKyAgICAgICAgLyogTWFrZSBzdXJlIHNbNToyXSA9IFsuLl0gaW5zZXJ0cyBhdCB0aGUgcmlnaHQgcGxhY2U6CisgICAgICAgICAgIGJlZm9yZSA1LCBub3QgYmVmb3JlIDIuICovCisgICAgICAgIGlmICgoc3RlcCA8IDAgJiYgc3RhcnQgPCBzdG9wKSB8fAorICAgICAgICAgICAgKHN0ZXAgPiAwICYmIHN0YXJ0ID4gc3RvcCkpCisgICAgICAgICAgICBzdG9wID0gc3RhcnQ7CiAKLQkJaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJCS8qIGRlbGV0ZSBzbGljZSAqLwotCQkJUHlPYmplY3QgKipnYXJiYWdlOwotCQkJc2l6ZV90IGN1cjsKLQkJCVB5X3NzaXplX3QgaTsKKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIGRlbGV0ZSBzbGljZSAqLworICAgICAgICAgICAgUHlPYmplY3QgKipnYXJiYWdlOworICAgICAgICAgICAgc2l6ZV90IGN1cjsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKIAotCQkJaWYgKHNsaWNlbGVuZ3RoIDw9IDApCi0JCQkJcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAoc2xpY2VsZW5ndGggPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCQkJaWYgKHN0ZXAgPCAwKSB7Ci0JCQkJc3RvcCA9IHN0YXJ0ICsgMTsKLQkJCQlzdGFydCA9IHN0b3AgKyBzdGVwKihzbGljZWxlbmd0aCAtIDEpIC0gMTsKLQkJCQlzdGVwID0gLXN0ZXA7Ci0JCQl9CisgICAgICAgICAgICBpZiAoc3RlcCA8IDApIHsKKyAgICAgICAgICAgICAgICBzdG9wID0gc3RhcnQgKyAxOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RvcCArIHN0ZXAqKHNsaWNlbGVuZ3RoIC0gMSkgLSAxOworICAgICAgICAgICAgICAgIHN0ZXAgPSAtc3RlcDsKKyAgICAgICAgICAgIH0KIAotCQkJYXNzZXJ0KChzaXplX3Qpc2xpY2VsZW5ndGggPD0KLQkJCSAgICAgICBQWV9TSVpFX01BWCAvIHNpemVvZihQeU9iamVjdCopKTsKKyAgICAgICAgICAgIGFzc2VydCgoc2l6ZV90KXNsaWNlbGVuZ3RoIDw9CisgICAgICAgICAgICAgICAgICAgUFlfU0laRV9NQVggLyBzaXplb2YoUHlPYmplY3QqKSk7CiAKLQkJCWdhcmJhZ2UgPSAoUHlPYmplY3QqKikKLQkJCQlQeU1lbV9NQUxMT0Moc2xpY2VsZW5ndGgqc2l6ZW9mKFB5T2JqZWN0KikpOwotCQkJaWYgKCFnYXJiYWdlKSB7Ci0JCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9CisgICAgICAgICAgICBnYXJiYWdlID0gKFB5T2JqZWN0KiopCisgICAgICAgICAgICAgICAgUHlNZW1fTUFMTE9DKHNsaWNlbGVuZ3RoKnNpemVvZihQeU9iamVjdCopKTsKKyAgICAgICAgICAgIGlmICghZ2FyYmFnZSkgeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogCi0JCQkvKiBkcmF3aW5nIHBpY3R1cmVzIG1pZ2h0IGhlbHAgdW5kZXJzdGFuZCB0aGVzZSBmb3IKLQkJCSAgIGxvb3BzLiBCYXNpY2FsbHksIHdlIG1lbW1vdmUgdGhlIHBhcnRzIG9mIHRoZQotCQkJICAgbGlzdCB0aGF0IGFyZSAqbm90KiBwYXJ0IG9mIHRoZSBzbGljZTogc3RlcC0xCi0JCQkgICBpdGVtcyBmb3IgZWFjaCBpdGVtIHRoYXQgaXMgcGFydCBvZiB0aGUgc2xpY2UsCi0JCQkgICBhbmQgdGhlbiB0YWlsIGVuZCBvZiB0aGUgbGlzdCB0aGF0IHdhcyBub3QKLQkJCSAgIGNvdmVyZWQgYnkgdGhlIHNsaWNlICovCi0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsKLQkJCSAgICAgY3VyIDwgKHNpemVfdClzdG9wOwotCQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQkJUHlfc3NpemVfdCBsaW0gPSBzdGVwIC0gMTsKKyAgICAgICAgICAgIC8qIGRyYXdpbmcgcGljdHVyZXMgbWlnaHQgaGVscCB1bmRlcnN0YW5kIHRoZXNlIGZvcgorICAgICAgICAgICAgICAgbG9vcHMuIEJhc2ljYWxseSwgd2UgbWVtbW92ZSB0aGUgcGFydHMgb2YgdGhlCisgICAgICAgICAgICAgICBsaXN0IHRoYXQgYXJlICpub3QqIHBhcnQgb2YgdGhlIHNsaWNlOiBzdGVwLTEKKyAgICAgICAgICAgICAgIGl0ZW1zIGZvciBlYWNoIGl0ZW0gdGhhdCBpcyBwYXJ0IG9mIHRoZSBzbGljZSwKKyAgICAgICAgICAgICAgIGFuZCB0aGVuIHRhaWwgZW5kIG9mIHRoZSBsaXN0IHRoYXQgd2FzIG5vdAorICAgICAgICAgICAgICAgY292ZXJlZCBieSB0aGUgc2xpY2UgKi8KKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOworICAgICAgICAgICAgICAgICBjdXIgPCAoc2l6ZV90KXN0b3A7CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxpbSA9IHN0ZXAgLSAxOwogCi0JCQkJZ2FyYmFnZVtpXSA9IFB5TGlzdF9HRVRfSVRFTShzZWxmLCBjdXIpOworICAgICAgICAgICAgICAgIGdhcmJhZ2VbaV0gPSBQeUxpc3RfR0VUX0lURU0oc2VsZiwgY3VyKTsKIAotCQkJCWlmIChjdXIgKyBzdGVwID49IChzaXplX3QpUHlfU0laRShzZWxmKSkgewotCQkJCQlsaW0gPSBQeV9TSVpFKHNlbGYpIC0gY3VyIC0gMTsKLQkJCQl9CisgICAgICAgICAgICAgICAgaWYgKGN1ciArIHN0ZXAgPj0gKHNpemVfdClQeV9TSVpFKHNlbGYpKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbSA9IFB5X1NJWkUoc2VsZikgLSBjdXIgLSAxOworICAgICAgICAgICAgICAgIH0KIAotCQkJCW1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIGN1ciAtIGksCi0JCQkJCXNlbGYtPm9iX2l0ZW0gKyBjdXIgKyAxLAotCQkJCQlsaW0gKiBzaXplb2YoUHlPYmplY3QgKikpOwotCQkJfQotCQkJY3VyID0gc3RhcnQgKyBzbGljZWxlbmd0aCpzdGVwOwotCQkJaWYgKGN1ciA8IChzaXplX3QpUHlfU0laRShzZWxmKSkgewotCQkJCW1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIGN1ciAtIHNsaWNlbGVuZ3RoLAotCQkJCQlzZWxmLT5vYl9pdGVtICsgY3VyLAotCQkJCQkoUHlfU0laRShzZWxmKSAtIGN1cikgKiAKLQkJCQkJIHNpemVvZihQeU9iamVjdCAqKSk7Ci0JCQl9CisgICAgICAgICAgICAgICAgbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgY3VyIC0gaSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSArIGN1ciArIDEsCisgICAgICAgICAgICAgICAgICAgIGxpbSAqIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXIgPSBzdGFydCArIHNsaWNlbGVuZ3RoKnN0ZXA7CisgICAgICAgICAgICBpZiAoY3VyIDwgKHNpemVfdClQeV9TSVpFKHNlbGYpKSB7CisgICAgICAgICAgICAgICAgbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgY3VyIC0gc2xpY2VsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gKyBjdXIsCisgICAgICAgICAgICAgICAgICAgIChQeV9TSVpFKHNlbGYpIC0gY3VyKSAqCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUHlPYmplY3QgKikpOworICAgICAgICAgICAgfQogCi0JCQlQeV9TSVpFKHNlbGYpIC09IHNsaWNlbGVuZ3RoOwotCQkJbGlzdF9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSk7CisgICAgICAgICAgICBQeV9TSVpFKHNlbGYpIC09IHNsaWNlbGVuZ3RoOworICAgICAgICAgICAgbGlzdF9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSk7CiAKLQkJCWZvciAoaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsgaSsrKSB7Ci0JCQkJUHlfREVDUkVGKGdhcmJhZ2VbaV0pOwotCQkJfQotCQkJUHlNZW1fRlJFRShnYXJiYWdlKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGdhcmJhZ2VbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlNZW1fRlJFRShnYXJiYWdlKTsKIAotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBhc3NpZ24gc2xpY2UgKi8KLQkJCVB5T2JqZWN0ICppbnMsICpzZXE7Ci0JCQlQeU9iamVjdCAqKmdhcmJhZ2UsICoqc2VxaXRlbXMsICoqc2VsZml0ZW1zOwotCQkJUHlfc3NpemVfdCBjdXIsIGk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIGFzc2lnbiBzbGljZSAqLworICAgICAgICAgICAgUHlPYmplY3QgKmlucywgKnNlcTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqZ2FyYmFnZSwgKipzZXFpdGVtcywgKipzZWxmaXRlbXM7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGN1ciwgaTsKIAotCQkJLyogcHJvdGVjdCBhZ2FpbnN0IGFbOjotMV0gPSBhICovCi0JCQlpZiAoc2VsZiA9PSAoUHlMaXN0T2JqZWN0Kil2YWx1ZSkgewotCQkJCXNlcSA9IGxpc3Rfc2xpY2UoKFB5TGlzdE9iamVjdCopdmFsdWUsIDAsCi0JCQkJCQkgICBQeUxpc3RfR0VUX1NJWkUodmFsdWUpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlcSA9IFB5U2VxdWVuY2VfRmFzdCh2YWx1ZSwKLQkJCQkJCSAgICAgICJtdXN0IGFzc2lnbiBpdGVyYWJsZSAiCi0JCQkJCQkgICAgICAidG8gZXh0ZW5kZWQgc2xpY2UiKTsKLQkJCX0KLQkJCWlmICghc2VxKQotCQkJCXJldHVybiAtMTsKKyAgICAgICAgICAgIC8qIHByb3RlY3QgYWdhaW5zdCBhWzo6LTFdID0gYSAqLworICAgICAgICAgICAgaWYgKHNlbGYgPT0gKFB5TGlzdE9iamVjdCopdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBzZXEgPSBsaXN0X3NsaWNlKChQeUxpc3RPYmplY3QqKXZhbHVlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX1NJWkUodmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHNlcSA9IFB5U2VxdWVuY2VfRmFzdCh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYXNzaWduIGl0ZXJhYmxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIGV4dGVuZGVkIHNsaWNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNlcSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJCWlmIChQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoc2VxKSAhPSBzbGljZWxlbmd0aCkgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiYXR0ZW1wdCB0byBhc3NpZ24gc2VxdWVuY2Ugb2YgIgotCQkJCQkic2l6ZSAlemQgdG8gZXh0ZW5kZWQgc2xpY2Ugb2YgIgotCQkJCQkic2l6ZSAlemQiLAotCQkJCQkgICAgIFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShzZXEpLAotCQkJCQkgICAgIHNsaWNlbGVuZ3RoKTsKLQkJCQlQeV9ERUNSRUYoc2VxKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9CisgICAgICAgICAgICBpZiAoUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKHNlcSkgIT0gc2xpY2VsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImF0dGVtcHQgdG8gYXNzaWduIHNlcXVlbmNlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgInNpemUgJXpkIHRvIGV4dGVuZGVkIHNsaWNlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgInNpemUgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoc2VxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbmd0aCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogCi0JCQlpZiAoIXNsaWNlbGVuZ3RoKSB7Ci0JCQkJUHlfREVDUkVGKHNlcSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9CisgICAgICAgICAgICBpZiAoIXNsaWNlbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CiAKLQkJCWdhcmJhZ2UgPSAoUHlPYmplY3QqKikKLQkJCQlQeU1lbV9NQUxMT0Moc2xpY2VsZW5ndGgqc2l6ZW9mKFB5T2JqZWN0KikpOwotCQkJaWYgKCFnYXJiYWdlKSB7Ci0JCQkJUHlfREVDUkVGKHNlcSk7Ci0JCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9CisgICAgICAgICAgICBnYXJiYWdlID0gKFB5T2JqZWN0KiopCisgICAgICAgICAgICAgICAgUHlNZW1fTUFMTE9DKHNsaWNlbGVuZ3RoKnNpemVvZihQeU9iamVjdCopKTsKKyAgICAgICAgICAgIGlmICghZ2FyYmFnZSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogCi0JCQlzZWxmaXRlbXMgPSBzZWxmLT5vYl9pdGVtOwotCQkJc2VxaXRlbXMgPSBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMoc2VxKTsKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7Ci0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlnYXJiYWdlW2ldID0gc2VsZml0ZW1zW2N1cl07Ci0JCQkJaW5zID0gc2VxaXRlbXNbaV07Ci0JCQkJUHlfSU5DUkVGKGlucyk7Ci0JCQkJc2VsZml0ZW1zW2N1cl0gPSBpbnM7Ci0JCQl9CisgICAgICAgICAgICBzZWxmaXRlbXMgPSBzZWxmLT5vYl9pdGVtOworICAgICAgICAgICAgc2VxaXRlbXMgPSBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMoc2VxKTsKKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBnYXJiYWdlW2ldID0gc2VsZml0ZW1zW2N1cl07CisgICAgICAgICAgICAgICAgaW5zID0gc2VxaXRlbXNbaV07CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGlucyk7CisgICAgICAgICAgICAgICAgc2VsZml0ZW1zW2N1cl0gPSBpbnM7CisgICAgICAgICAgICB9CiAKLQkJCWZvciAoaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsgaSsrKSB7Ci0JCQkJUHlfREVDUkVGKGdhcmJhZ2VbaV0pOwotCQkJfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZ2FyYmFnZVtpXSk7CisgICAgICAgICAgICB9CiAKLQkJCVB5TWVtX0ZSRUUoZ2FyYmFnZSk7Ci0JCQlQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgICAgIFB5TWVtX0ZSRUUoZ2FyYmFnZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VxKTsKIAotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90ICUuMjAwcyIsCi0JCQkgICAgIGl0ZW0tPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIGxpc3RfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYylsaXN0X2xlbmd0aCwKLQkoYmluYXJ5ZnVuYylsaXN0X3N1YnNjcmlwdCwKLQkob2Jqb2JqYXJncHJvYylsaXN0X2Fzc19zdWJzY3JpcHQKKyAgICAobGVuZnVuYylsaXN0X2xlbmd0aCwKKyAgICAoYmluYXJ5ZnVuYylsaXN0X3N1YnNjcmlwdCwKKyAgICAob2Jqb2JqYXJncHJvYylsaXN0X2Fzc19zdWJzY3JpcHQKIH07CiAKIFB5VHlwZU9iamVjdCBQeUxpc3RfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJsaXN0IiwKLQlzaXplb2YoUHlMaXN0T2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWxpc3RfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKWxpc3RfcHJpbnQsCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpbGlzdF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJmxpc3RfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkmbGlzdF9hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkLAkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19MSVNUX1NVQkNMQVNTLAkvKiB0cF9mbGFncyAqLwotIAlsaXN0X2RvYywJCQkJLyogdHBfZG9jICovCi0gCSh0cmF2ZXJzZXByb2MpbGlzdF90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0gCShpbnF1aXJ5KWxpc3RfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQlsaXN0X3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JbGlzdF9pdGVyLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JbGlzdF9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpbGlzdF9pbml0LAkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJsaXN0IiwKKyAgICBzaXplb2YoUHlMaXN0T2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWxpc3RfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpbGlzdF9wcmludCwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpbGlzdF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZsaXN0X2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmbGlzdF9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkLCAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19MSVNUX1NVQkNMQVNTLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgbGlzdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWxpc3RfdHJhdmVyc2UsICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpbGlzdF9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIGxpc3RfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgbGlzdF9pdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGxpc3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylsaXN0X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKiogTGlzdCBJdGVyYXRvciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlsb25nIGl0X2luZGV4OwotCVB5TGlzdE9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBsb25nIGl0X2luZGV4OworICAgIFB5TGlzdE9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBsaXN0aXRlcm9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpsaXN0X2l0ZXIoUHlPYmplY3QgKik7CkBAIC0yODIzLDExOSArMjgyMywxMTkgQEAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGxpc3RpdGVyX21ldGhvZHNbXSA9IHsKLQl7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilsaXN0aXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKWxpc3RpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUxpc3RJdGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkibGlzdGl0ZXJhdG9yIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihsaXN0aXRlcm9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWxpc3RpdGVyX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpbGlzdGl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpbGlzdGl0ZXJfbmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JbGlzdGl0ZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJsaXN0aXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihsaXN0aXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilsaXN0aXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWxpc3RpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylsaXN0aXRlcl9uZXh0LCAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGxpc3RpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogfTsKIAogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdF9pdGVyKFB5T2JqZWN0ICpzZXEpCiB7Ci0JbGlzdGl0ZXJvYmplY3QgKml0OworICAgIGxpc3RpdGVyb2JqZWN0ICppdDsKIAotCWlmICghUHlMaXN0X0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X0dDX05ldyhsaXN0aXRlcm9iamVjdCwgJlB5TGlzdEl0ZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0LT5pdF9pbmRleCA9IDA7Ci0JUHlfSU5DUkVGKHNlcSk7Ci0JaXQtPml0X3NlcSA9IChQeUxpc3RPYmplY3QgKilzZXE7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2soc2VxKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGxpc3RpdGVyb2JqZWN0LCAmUHlMaXN0SXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPml0X2luZGV4ID0gMDsKKyAgICBQeV9JTkNSRUYoc2VxKTsKKyAgICBpdC0+aXRfc2VxID0gKFB5TGlzdE9iamVjdCAqKXNlcTsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soaXQpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIHZvaWQKIGxpc3RpdGVyX2RlYWxsb2MobGlzdGl0ZXJvYmplY3QgKml0KQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKGl0KTsKLQlQeV9YREVDUkVGKGl0LT5pdF9zZXEpOwotCVB5T2JqZWN0X0dDX0RlbChpdCk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soaXQpOworICAgIFB5X1hERUNSRUYoaXQtPml0X3NlcSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGl0KTsKIH0KIAogc3RhdGljIGludAogbGlzdGl0ZXJfdHJhdmVyc2UobGlzdGl0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpdC0+aXRfc2VxKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpdC0+aXRfc2VxKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RpdGVyX25leHQobGlzdGl0ZXJvYmplY3QgKml0KQogewotCVB5TGlzdE9iamVjdCAqc2VxOwotCVB5T2JqZWN0ICppdGVtOworICAgIFB5TGlzdE9iamVjdCAqc2VxOworICAgIFB5T2JqZWN0ICppdGVtOwogCi0JYXNzZXJ0KGl0ICE9IE5VTEwpOwotCXNlcSA9IGl0LT5pdF9zZXE7Ci0JaWYgKHNlcSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKHNlcSkpOworICAgIGFzc2VydChpdCAhPSBOVUxMKTsKKyAgICBzZXEgPSBpdC0+aXRfc2VxOworICAgIGlmIChzZXEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhzZXEpKTsKIAotCWlmIChpdC0+aXRfaW5kZXggPCBQeUxpc3RfR0VUX1NJWkUoc2VxKSkgewotCQlpdGVtID0gUHlMaXN0X0dFVF9JVEVNKHNlcSwgaXQtPml0X2luZGV4KTsKLQkJKytpdC0+aXRfaW5kZXg7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQorICAgIGlmIChpdC0+aXRfaW5kZXggPCBQeUxpc3RfR0VUX1NJWkUoc2VxKSkgeworICAgICAgICBpdGVtID0gUHlMaXN0X0dFVF9JVEVNKHNlcSwgaXQtPml0X2luZGV4KTsKKyAgICAgICAgKytpdC0+aXRfaW5kZXg7CisgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQogCi0JUHlfREVDUkVGKHNlcSk7Ci0JaXQtPml0X3NlcSA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHNlcSk7CisgICAgaXQtPml0X3NlcSA9IE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0aXRlcl9sZW4obGlzdGl0ZXJvYmplY3QgKml0KQogewotCVB5X3NzaXplX3QgbGVuOwotCWlmIChpdC0+aXRfc2VxKSB7Ci0JCWxlbiA9IFB5TGlzdF9HRVRfU0laRShpdC0+aXRfc2VxKSAtIGl0LT5pdF9pbmRleDsKLQkJaWYgKGxlbiA+PSAwKQotCQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGxlbik7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBpZiAoaXQtPml0X3NlcSkgeworICAgICAgICBsZW4gPSBQeUxpc3RfR0VUX1NJWkUoaXQtPml0X3NlcSkgLSBpdC0+aXRfaW5kZXg7CisgICAgICAgIGlmIChsZW4gPj0gMCkKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChsZW4pOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKiogTGlzdCBSZXZlcnNlIEl0ZXJhdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3QgaXRfaW5kZXg7Ci0JUHlMaXN0T2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgaXRfaW5kZXg7CisgICAgUHlMaXN0T2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IGxpc3RyZXZpdGVyb2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKmxpc3RfcmV2ZXJzZWQoUHlMaXN0T2JqZWN0ICosIFB5T2JqZWN0ICopOwpAQCAtMjk0NSwxMDAgKzI5NDUsMTAwIEBACiBzdGF0aWMgUHlPYmplY3QgKmxpc3RyZXZpdGVyX2xlbihsaXN0cmV2aXRlcm9iamVjdCAqKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGxpc3RyZXZpdGVyX21ldGhvZHNbXSA9IHsKLQl7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilsaXN0cmV2aXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKWxpc3RyZXZpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUxpc3RSZXZJdGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkibGlzdHJldmVyc2VpdGVyYXRvciIsCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihsaXN0cmV2aXRlcm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbGlzdHJldml0ZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWxpc3RyZXZpdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWxpc3RyZXZpdGVyX25leHQsCQkvKiB0cF9pdGVybmV4dCAqLwotCWxpc3RyZXZpdGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCi0JMCwKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJsaXN0cmV2ZXJzZWl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihsaXN0cmV2aXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilsaXN0cmV2aXRlcl9kZWFsbG9jLCAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWxpc3RyZXZpdGVyX3RyYXZlcnNlLCAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylsaXN0cmV2aXRlcl9uZXh0LCAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGxpc3RyZXZpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfcmV2ZXJzZWQoUHlMaXN0T2JqZWN0ICpzZXEsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JbGlzdHJldml0ZXJvYmplY3QgKml0OworICAgIGxpc3RyZXZpdGVyb2JqZWN0ICppdDsKIAotCWl0ID0gUHlPYmplY3RfR0NfTmV3KGxpc3RyZXZpdGVyb2JqZWN0LCAmUHlMaXN0UmV2SXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5TGlzdF9DaGVjayhzZXEpKTsKLQlpdC0+aXRfaW5kZXggPSBQeUxpc3RfR0VUX1NJWkUoc2VxKSAtIDE7Ci0JUHlfSU5DUkVGKHNlcSk7Ci0JaXQtPml0X3NlcSA9IHNlcTsKLQlQeU9iamVjdF9HQ19UcmFjayhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGxpc3RyZXZpdGVyb2JqZWN0LCAmUHlMaXN0UmV2SXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhzZXEpKTsKKyAgICBpdC0+aXRfaW5kZXggPSBQeUxpc3RfR0VUX1NJWkUoc2VxKSAtIDE7CisgICAgUHlfSU5DUkVGKHNlcSk7CisgICAgaXQtPml0X3NlcSA9IHNlcTsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhpdCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgdm9pZAogbGlzdHJldml0ZXJfZGVhbGxvYyhsaXN0cmV2aXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhpdCk7Ci0JUHlfWERFQ1JFRihpdC0+aXRfc2VxKTsKLQlQeU9iamVjdF9HQ19EZWwoaXQpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soaXQpOworICAgIFB5X1hERUNSRUYoaXQtPml0X3NlcSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGl0KTsKIH0KIAogc3RhdGljIGludAogbGlzdHJldml0ZXJfdHJhdmVyc2UobGlzdHJldml0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpdC0+aXRfc2VxKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpdC0+aXRfc2VxKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RyZXZpdGVyX25leHQobGlzdHJldml0ZXJvYmplY3QgKml0KQogewotCVB5T2JqZWN0ICppdGVtOwotCVB5X3NzaXplX3QgaW5kZXggPSBpdC0+aXRfaW5kZXg7Ci0JUHlMaXN0T2JqZWN0ICpzZXEgPSBpdC0+aXRfc2VxOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5X3NzaXplX3QgaW5kZXggPSBpdC0+aXRfaW5kZXg7CisgICAgUHlMaXN0T2JqZWN0ICpzZXEgPSBpdC0+aXRfc2VxOwogCi0JaWYgKGluZGV4Pj0wICYmIGluZGV4IDwgUHlMaXN0X0dFVF9TSVpFKHNlcSkpIHsKLQkJaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShzZXEsIGluZGV4KTsKLQkJaXQtPml0X2luZGV4LS07Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCWl0LT5pdF9pbmRleCA9IC0xOwotCWlmIChzZXEgIT0gTlVMTCkgewotCQlpdC0+aXRfc2VxID0gTlVMTDsKLQkJUHlfREVDUkVGKHNlcSk7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGlmIChpbmRleD49MCAmJiBpbmRleCA8IFB5TGlzdF9HRVRfU0laRShzZXEpKSB7CisgICAgICAgIGl0ZW0gPSBQeUxpc3RfR0VUX0lURU0oc2VxLCBpbmRleCk7CisgICAgICAgIGl0LT5pdF9pbmRleC0tOworICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKyAgICBpdC0+aXRfaW5kZXggPSAtMTsKKyAgICBpZiAoc2VxICE9IE5VTEwpIHsKKyAgICAgICAgaXQtPml0X3NlcSA9IE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RyZXZpdGVyX2xlbihsaXN0cmV2aXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlfc3NpemVfdCBsZW4gPSBpdC0+aXRfaW5kZXggKyAxOwotCWlmIChpdC0+aXRfc2VxID09IE5VTEwgfHwgUHlMaXN0X0dFVF9TSVpFKGl0LT5pdF9zZXEpIDwgbGVuKQotCQlsZW4gPSAwOwotCXJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QobGVuKTsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IGl0LT5pdF9pbmRleCArIDE7CisgICAgaWYgKGl0LT5pdF9zZXEgPT0gTlVMTCB8fCBQeUxpc3RfR0VUX1NJWkUoaXQtPml0X3NlcSkgPCBsZW4pCisgICAgICAgIGxlbiA9IDA7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChsZW4pOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9sb25nb2JqZWN0LmMgYi9PYmplY3RzL2xvbmdvYmplY3QuYwppbmRleCBhNDE3ODJhLi42OThhNmRiIDEwMDY0NAotLS0gYS9PYmplY3RzL2xvbmdvYmplY3QuYworKysgYi9PYmplY3RzL2xvbmdvYmplY3QuYwpAQCAtMzQsMTAgKzM0LDEwIEBACiAjZGVmaW5lIE1JTih4LCB5KSAoKHgpID4gKHkpID8gKHkpIDogKHgpKQogCiAjZGVmaW5lIFNJR0NIRUNLKFB5VHJ5QmxvY2spIFwKLQlpZiAoLS1fUHlfVGlja2VyIDwgMCkgeyBcCi0JCV9QeV9UaWNrZXIgPSBfUHlfQ2hlY2tJbnRlcnZhbDsgXAotCQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIFB5VHJ5QmxvY2sgXAotCX0KKyAgICBpZiAoLS1fUHlfVGlja2VyIDwgMCkgeyBcCisgICAgICAgIF9QeV9UaWNrZXIgPSBfUHlfQ2hlY2tJbnRlcnZhbDsgXAorICAgICAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIFB5VHJ5QmxvY2sgXAorICAgIH0KIAogLyogTm9ybWFsaXplIChyZW1vdmUgbGVhZGluZyB6ZXJvcyBmcm9tKSBhIGxvbmcgaW50IG9iamVjdC4KICAgIERvZXNuJ3QgYXR0ZW1wdCB0byBmcmVlIHRoZSBzdG9yYWdlLS1pbiBtb3N0IGNhc2VzLCBkdWUgdG8gdGhlIG5hdHVyZQpAQCAtNDYsNTMgKzQ2LDUzIEBACiBzdGF0aWMgUHlMb25nT2JqZWN0ICoKIGxvbmdfbm9ybWFsaXplKHJlZ2lzdGVyIFB5TG9uZ09iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IGogPSBBQlMoUHlfU0laRSh2KSk7Ci0JUHlfc3NpemVfdCBpID0gajsKKyAgICBQeV9zc2l6ZV90IGogPSBBQlMoUHlfU0laRSh2KSk7CisgICAgUHlfc3NpemVfdCBpID0gajsKIAotCXdoaWxlIChpID4gMCAmJiB2LT5vYl9kaWdpdFtpLTFdID09IDApCi0JCS0taTsKLQlpZiAoaSAhPSBqKQotCQlQeV9TSVpFKHYpID0gKFB5X1NJWkUodikgPCAwKSA/IC0oaSkgOiBpOwotCXJldHVybiB2OworICAgIHdoaWxlIChpID4gMCAmJiB2LT5vYl9kaWdpdFtpLTFdID09IDApCisgICAgICAgIC0taTsKKyAgICBpZiAoaSAhPSBqKQorICAgICAgICBQeV9TSVpFKHYpID0gKFB5X1NJWkUodikgPCAwKSA/IC0oaSkgOiBpOworICAgIHJldHVybiB2OwogfQogCiAvKiBBbGxvY2F0ZSBhIG5ldyBsb25nIGludCBvYmplY3Qgd2l0aCBzaXplIGRpZ2l0cy4KICAgIFJldHVybiBOVUxMIGFuZCBzZXQgZXhjZXB0aW9uIGlmIHdlIHJ1biBvdXQgb2YgbWVtb3J5LiAqLwogCiAjZGVmaW5lIE1BWF9MT05HX0RJR0lUUyBcCi0JKChQWV9TU0laRV9UX01BWCAtIG9mZnNldG9mKFB5TG9uZ09iamVjdCwgb2JfZGlnaXQpKS9zaXplb2YoZGlnaXQpKQorICAgICgoUFlfU1NJWkVfVF9NQVggLSBvZmZzZXRvZihQeUxvbmdPYmplY3QsIG9iX2RpZ2l0KSkvc2l6ZW9mKGRpZ2l0KSkKIAogUHlMb25nT2JqZWN0ICoKIF9QeUxvbmdfTmV3KFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlpZiAoc2l6ZSA+IChQeV9zc2l6ZV90KU1BWF9MT05HX0RJR0lUUykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkidG9vIG1hbnkgZGlnaXRzIGluIGludGVnZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIGNvdmVyaXR5W2FtcGVyc2FuZF9pbl9zaXplXSAqLwotCS8qIFhYWChubm9yd2l0eik6IFB5T2JqZWN0X05FV19WQVIgLyBfUHlPYmplY3RfVkFSX1NJWkUgbmVlZCB0byBkZXRlY3QKLQkgICBvdmVyZmxvdyAqLwotCXJldHVybiBQeU9iamVjdF9ORVdfVkFSKFB5TG9uZ09iamVjdCwgJlB5TG9uZ19UeXBlLCBzaXplKTsKKyAgICBpZiAoc2l6ZSA+IChQeV9zc2l6ZV90KU1BWF9MT05HX0RJR0lUUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBkaWdpdHMgaW4gaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogY292ZXJpdHlbYW1wZXJzYW5kX2luX3NpemVdICovCisgICAgLyogWFhYKG5ub3J3aXR6KTogUHlPYmplY3RfTkVXX1ZBUiAvIF9QeU9iamVjdF9WQVJfU0laRSBuZWVkIHRvIGRldGVjdAorICAgICAgIG92ZXJmbG93ICovCisgICAgcmV0dXJuIFB5T2JqZWN0X05FV19WQVIoUHlMb25nT2JqZWN0LCAmUHlMb25nX1R5cGUsIHNpemUpOwogfQogCiBQeU9iamVjdCAqCiBfUHlMb25nX0NvcHkoUHlMb25nT2JqZWN0ICpzcmMpCiB7Ci0JUHlMb25nT2JqZWN0ICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5TG9uZ09iamVjdCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgaTsKIAotCWFzc2VydChzcmMgIT0gTlVMTCk7Ci0JaSA9IHNyYy0+b2Jfc2l6ZTsKLQlpZiAoaSA8IDApCi0JCWkgPSAtKGkpOwotCXJlc3VsdCA9IF9QeUxvbmdfTmV3KGkpOwotCWlmIChyZXN1bHQgIT0gTlVMTCkgewotCQlyZXN1bHQtPm9iX3NpemUgPSBzcmMtPm9iX3NpemU7Ci0JCXdoaWxlICgtLWkgPj0gMCkKLQkJCXJlc3VsdC0+b2JfZGlnaXRbaV0gPSBzcmMtPm9iX2RpZ2l0W2ldOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIGFzc2VydChzcmMgIT0gTlVMTCk7CisgICAgaSA9IHNyYy0+b2Jfc2l6ZTsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIGkgPSAtKGkpOworICAgIHJlc3VsdCA9IF9QeUxvbmdfTmV3KGkpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgICByZXN1bHQtPm9iX3NpemUgPSBzcmMtPm9iX3NpemU7CisgICAgICAgIHdoaWxlICgtLWkgPj0gMCkKKyAgICAgICAgICAgIHJlc3VsdC0+b2JfZGlnaXRbaV0gPSBzcmMtPm9iX2RpZ2l0W2ldOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCiAvKiBDcmVhdGUgYSBuZXcgbG9uZyBpbnQgb2JqZWN0IGZyb20gYSBDIGxvbmcgaW50ICovCkBAIC0xMDAsNDMgKzEwMCw0MyBAQAogUHlPYmplY3QgKgogUHlMb25nX0Zyb21Mb25nKGxvbmcgaXZhbCkKIHsKLQlQeUxvbmdPYmplY3QgKnY7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYWJzX2l2YWw7Ci0JdW5zaWduZWQgbG9uZyB0OyAgLyogdW5zaWduZWQgc28gPj4gZG9lc24ndCBwcm9wYWdhdGUgc2lnbiBiaXQgKi8KLQlpbnQgbmRpZ2l0cyA9IDA7Ci0JaW50IG5lZ2F0aXZlID0gMDsKKyAgICBQeUxvbmdPYmplY3QgKnY7CisgICAgdW5zaWduZWQgbG9uZyBhYnNfaXZhbDsKKyAgICB1bnNpZ25lZCBsb25nIHQ7ICAvKiB1bnNpZ25lZCBzbyA+PiBkb2Vzbid0IHByb3BhZ2F0ZSBzaWduIGJpdCAqLworICAgIGludCBuZGlnaXRzID0gMDsKKyAgICBpbnQgbmVnYXRpdmUgPSAwOwogCi0JaWYgKGl2YWwgPCAwKSB7Ci0JCS8qIGlmIExPTkdfTUlOID09IC1MT05HX01BWC0xICh0cnVlIG9uIG1vc3QgcGxhdGZvcm1zKSB0aGVuCi0JCSAgIEFOU0kgQyBzYXlzIHRoYXQgdGhlIHJlc3VsdCBvZiAtaXZhbCBpcyB1bmRlZmluZWQgd2hlbiBpdmFsCi0JCSAgID09IExPTkdfTUlOLiAgSGVuY2UgdGhlIGZvbGxvd2luZyB3b3JrYXJvdW5kLiAqLwotCQlhYnNfaXZhbCA9ICh1bnNpZ25lZCBsb25nKSgtMS1pdmFsKSArIDE7Ci0JCW5lZ2F0aXZlID0gMTsKLQl9Ci0JZWxzZSB7Ci0JCWFic19pdmFsID0gKHVuc2lnbmVkIGxvbmcpaXZhbDsKLQl9CisgICAgaWYgKGl2YWwgPCAwKSB7CisgICAgICAgIC8qIGlmIExPTkdfTUlOID09IC1MT05HX01BWC0xICh0cnVlIG9uIG1vc3QgcGxhdGZvcm1zKSB0aGVuCisgICAgICAgICAgIEFOU0kgQyBzYXlzIHRoYXQgdGhlIHJlc3VsdCBvZiAtaXZhbCBpcyB1bmRlZmluZWQgd2hlbiBpdmFsCisgICAgICAgICAgID09IExPTkdfTUlOLiAgSGVuY2UgdGhlIGZvbGxvd2luZyB3b3JrYXJvdW5kLiAqLworICAgICAgICBhYnNfaXZhbCA9ICh1bnNpZ25lZCBsb25nKSgtMS1pdmFsKSArIDE7CisgICAgICAgIG5lZ2F0aXZlID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFic19pdmFsID0gKHVuc2lnbmVkIGxvbmcpaXZhbDsKKyAgICB9CiAKLQkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIFB5dGhvbiBkaWdpdHMuCi0JICAgV2UgdXNlZCB0byBwaWNrIDUgKCJiaWcgZW5vdWdoIGZvciBhbnl0aGluZyIpLCBidXQgdGhhdCdzIGEKLQkgICB3YXN0ZSBvZiB0aW1lIGFuZCBzcGFjZSBnaXZlbiB0aGF0IDUqMTUgPSA3NSBiaXRzIGFyZSByYXJlbHkKLQkgICBuZWVkZWQuICovCi0JdCA9IGFic19pdmFsOwotCXdoaWxlICh0KSB7Ci0JCSsrbmRpZ2l0czsKLQkJdCA+Pj0gUHlMb25nX1NISUZUOwotCX0KLQl2ID0gX1B5TG9uZ19OZXcobmRpZ2l0cyk7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlkaWdpdCAqcCA9IHYtPm9iX2RpZ2l0OwotCQl2LT5vYl9zaXplID0gbmVnYXRpdmUgPyAtbmRpZ2l0cyA6IG5kaWdpdHM7Ci0JCXQgPSBhYnNfaXZhbDsKLQkJd2hpbGUgKHQpIHsKLQkJCSpwKysgPSAoZGlnaXQpKHQgJiBQeUxvbmdfTUFTSyk7Ci0JCQl0ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXY7CisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLgorICAgICAgIFdlIHVzZWQgdG8gcGljayA1ICgiYmlnIGVub3VnaCBmb3IgYW55dGhpbmciKSwgYnV0IHRoYXQncyBhCisgICAgICAgd2FzdGUgb2YgdGltZSBhbmQgc3BhY2UgZ2l2ZW4gdGhhdCA1KjE1ID0gNzUgYml0cyBhcmUgcmFyZWx5CisgICAgICAgbmVlZGVkLiAqLworICAgIHQgPSBhYnNfaXZhbDsKKyAgICB3aGlsZSAodCkgeworICAgICAgICArK25kaWdpdHM7CisgICAgICAgIHQgPj49IFB5TG9uZ19TSElGVDsKKyAgICB9CisgICAgdiA9IF9QeUxvbmdfTmV3KG5kaWdpdHMpOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgZGlnaXQgKnAgPSB2LT5vYl9kaWdpdDsKKyAgICAgICAgdi0+b2Jfc2l6ZSA9IG5lZ2F0aXZlID8gLW5kaWdpdHMgOiBuZGlnaXRzOworICAgICAgICB0ID0gYWJzX2l2YWw7CisgICAgICAgIHdoaWxlICh0KSB7CisgICAgICAgICAgICAqcCsrID0gKGRpZ2l0KSh0ICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgdCA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKil2OwogfQogCiAvKiBDcmVhdGUgYSBuZXcgbG9uZyBpbnQgb2JqZWN0IGZyb20gYSBDIHVuc2lnbmVkIGxvbmcgaW50ICovCkBAIC0xNDQsMjYgKzE0NCwyNiBAQAogUHlPYmplY3QgKgogUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodW5zaWduZWQgbG9uZyBpdmFsKQogewotCVB5TG9uZ09iamVjdCAqdjsKLQl1bnNpZ25lZCBsb25nIHQ7Ci0JaW50IG5kaWdpdHMgPSAwOworICAgIFB5TG9uZ09iamVjdCAqdjsKKyAgICB1bnNpZ25lZCBsb25nIHQ7CisgICAgaW50IG5kaWdpdHMgPSAwOwogCi0JLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLiAqLwotCXQgPSAodW5zaWduZWQgbG9uZylpdmFsOwotCXdoaWxlICh0KSB7Ci0JCSsrbmRpZ2l0czsKLQkJdCA+Pj0gUHlMb25nX1NISUZUOwotCX0KLQl2ID0gX1B5TG9uZ19OZXcobmRpZ2l0cyk7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlkaWdpdCAqcCA9IHYtPm9iX2RpZ2l0OwotCQlQeV9TSVpFKHYpID0gbmRpZ2l0czsKLQkJd2hpbGUgKGl2YWwpIHsKLQkJCSpwKysgPSAoZGlnaXQpKGl2YWwgJiBQeUxvbmdfTUFTSyk7Ci0JCQlpdmFsID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXY7CisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLiAqLworICAgIHQgPSAodW5zaWduZWQgbG9uZylpdmFsOworICAgIHdoaWxlICh0KSB7CisgICAgICAgICsrbmRpZ2l0czsKKyAgICAgICAgdCA+Pj0gUHlMb25nX1NISUZUOworICAgIH0KKyAgICB2ID0gX1B5TG9uZ19OZXcobmRpZ2l0cyk7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBkaWdpdCAqcCA9IHYtPm9iX2RpZ2l0OworICAgICAgICBQeV9TSVpFKHYpID0gbmRpZ2l0czsKKyAgICAgICAgd2hpbGUgKGl2YWwpIHsKKyAgICAgICAgICAgICpwKysgPSAoZGlnaXQpKGl2YWwgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICBpdmFsID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXY7CiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBsb25nIGludCBvYmplY3QgZnJvbSBhIEMgZG91YmxlICovCkBAIC0xNzEsNDEgKzE3MSw0MSBAQAogUHlPYmplY3QgKgogUHlMb25nX0Zyb21Eb3VibGUoZG91YmxlIGR2YWwpCiB7Ci0JUHlMb25nT2JqZWN0ICp2OwotCWRvdWJsZSBmcmFjOwotCWludCBpLCBuZGlnLCBleHBvLCBuZWc7Ci0JbmVnID0gMDsKLQlpZiAoUHlfSVNfSU5GSU5JVFkoZHZhbCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkiY2Fubm90IGNvbnZlcnQgZmxvYXQgaW5maW5pdHkgdG8gaW50ZWdlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5X0lTX05BTihkdmFsKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJjYW5ub3QgY29udmVydCBmbG9hdCBOYU4gdG8gaW50ZWdlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGR2YWwgPCAwLjApIHsKLQkJbmVnID0gMTsKLQkJZHZhbCA9IC1kdmFsOwotCX0KLQlmcmFjID0gZnJleHAoZHZhbCwgJmV4cG8pOyAvKiBkdmFsID0gZnJhYyoyKipleHBvOyAwLjAgPD0gZnJhYyA8IDEuMCAqLwotCWlmIChleHBvIDw9IDApCi0JCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoMEwpOwotCW5kaWcgPSAoZXhwby0xKSAvIFB5TG9uZ19TSElGVCArIDE7IC8qIE51bWJlciBvZiAnZGlnaXRzJyBpbiByZXN1bHQgKi8KLQl2ID0gX1B5TG9uZ19OZXcobmRpZyk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZnJhYyA9IGxkZXhwKGZyYWMsIChleHBvLTEpICUgUHlMb25nX1NISUZUICsgMSk7Ci0JZm9yIChpID0gbmRpZzsgLS1pID49IDA7ICkgewotCQlkaWdpdCBiaXRzID0gKGRpZ2l0KWZyYWM7Ci0JCXYtPm9iX2RpZ2l0W2ldID0gYml0czsKLQkJZnJhYyA9IGZyYWMgLSAoZG91YmxlKWJpdHM7Ci0JCWZyYWMgPSBsZGV4cChmcmFjLCBQeUxvbmdfU0hJRlQpOwotCX0KLQlpZiAobmVnKQotCQlQeV9TSVpFKHYpID0gLShQeV9TSVpFKHYpKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopdjsKKyAgICBQeUxvbmdPYmplY3QgKnY7CisgICAgZG91YmxlIGZyYWM7CisgICAgaW50IGksIG5kaWcsIGV4cG8sIG5lZzsKKyAgICBuZWcgPSAwOworICAgIGlmIChQeV9JU19JTkZJTklUWShkdmFsKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBmbG9hdCBpbmZpbml0eSB0byBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlfSVNfTkFOKGR2YWwpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0IGZsb2F0IE5hTiB0byBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZHZhbCA8IDAuMCkgeworICAgICAgICBuZWcgPSAxOworICAgICAgICBkdmFsID0gLWR2YWw7CisgICAgfQorICAgIGZyYWMgPSBmcmV4cChkdmFsLCAmZXhwbyk7IC8qIGR2YWwgPSBmcmFjKjIqKmV4cG87IDAuMCA8PSBmcmFjIDwgMS4wICovCisgICAgaWYgKGV4cG8gPD0gMCkKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwTCk7CisgICAgbmRpZyA9IChleHBvLTEpIC8gUHlMb25nX1NISUZUICsgMTsgLyogTnVtYmVyIG9mICdkaWdpdHMnIGluIHJlc3VsdCAqLworICAgIHYgPSBfUHlMb25nX05ldyhuZGlnKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcmFjID0gbGRleHAoZnJhYywgKGV4cG8tMSkgJSBQeUxvbmdfU0hJRlQgKyAxKTsKKyAgICBmb3IgKGkgPSBuZGlnOyAtLWkgPj0gMDsgKSB7CisgICAgICAgIGRpZ2l0IGJpdHMgPSAoZGlnaXQpZnJhYzsKKyAgICAgICAgdi0+b2JfZGlnaXRbaV0gPSBiaXRzOworICAgICAgICBmcmFjID0gZnJhYyAtIChkb3VibGUpYml0czsKKyAgICAgICAgZnJhYyA9IGxkZXhwKGZyYWMsIFB5TG9uZ19TSElGVCk7CisgICAgfQorICAgIGlmIChuZWcpCisgICAgICAgIFB5X1NJWkUodikgPSAtKFB5X1NJWkUodikpOworICAgIHJldHVybiAoUHlPYmplY3QgKil2OwogfQogCiAvKiBDaGVja2luZyBmb3Igb3ZlcmZsb3cgaW4gUHlMb25nX0FzTG9uZyBpcyBhIFBJVEEgc2luY2UgQyBkb2Vzbid0IGRlZmluZQpAQCAtMjE3LDggKzIxNyw4IEBACiAgKiBIb3dldmVyLCBzb21lIG90aGVyIGNvbXBpbGVycyB3YXJuIGFib3V0IGFwcGx5aW5nIHVuYXJ5IG1pbnVzIHRvIGFuCiAgKiB1bnNpZ25lZCBvcGVyYW5kLiAgSGVuY2UgdGhlIHdlaXJkICIwLSIuCiAgKi8KLSNkZWZpbmUgUFlfQUJTX0xPTkdfTUlOCQkoMC0odW5zaWduZWQgbG9uZylMT05HX01JTikKLSNkZWZpbmUgUFlfQUJTX1NTSVpFX1RfTUlOCSgwLShzaXplX3QpUFlfU1NJWkVfVF9NSU4pCisjZGVmaW5lIFBZX0FCU19MT05HX01JTiAgICAgICAgICgwLSh1bnNpZ25lZCBsb25nKUxPTkdfTUlOKQorI2RlZmluZSBQWV9BQlNfU1NJWkVfVF9NSU4gICAgICAoMC0oc2l6ZV90KVBZX1NTSVpFX1RfTUlOKQogCiAvKiBHZXQgYSBDIGxvbmcgaW50IGZyb20gYSBQeXRob24gbG9uZyBvciBQeXRob24gaW50IG9iamVjdC4KICAgIE9uIG92ZXJmbG93LCByZXR1cm5zIC0xIGFuZCBzZXRzICpvdmVyZmxvdyB0byAxIG9yIC0xIGRlcGVuZGluZwpAQCAtMjMxLDk1ICsyMzEsOTUgQEAKIGxvbmcKIFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdyhQeU9iamVjdCAqdnYsIGludCAqb3ZlcmZsb3cpCiB7Ci0JLyogVGhpcyB2ZXJzaW9uIGJ5IFRpbSBQZXRlcnMgKi8KLQlyZWdpc3RlciBQeUxvbmdPYmplY3QgKnY7Ci0JdW5zaWduZWQgbG9uZyB4LCBwcmV2OwotCWxvbmcgcmVzOwotCVB5X3NzaXplX3QgaTsKLQlpbnQgc2lnbjsKLQlpbnQgZG9fZGVjcmVmID0gMDsgLyogaWYgbmJfaW50IHdhcyBjYWxsZWQgKi8KKyAgICAvKiBUaGlzIHZlcnNpb24gYnkgVGltIFBldGVycyAqLworICAgIHJlZ2lzdGVyIFB5TG9uZ09iamVjdCAqdjsKKyAgICB1bnNpZ25lZCBsb25nIHgsIHByZXY7CisgICAgbG9uZyByZXM7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBzaWduOworICAgIGludCBkb19kZWNyZWYgPSAwOyAvKiBpZiBuYl9pbnQgd2FzIGNhbGxlZCAqLwogCi0JKm92ZXJmbG93ID0gMDsKLQlpZiAodnYgPT0gTlVMTCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAqb3ZlcmZsb3cgPSAwOworICAgIGlmICh2diA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYoUHlJbnRfQ2hlY2sodnYpKQotCQlyZXR1cm4gUHlJbnRfQXNMb25nKHZ2KTsKKyAgICBpZihQeUludF9DaGVjayh2dikpCisgICAgICAgIHJldHVybiBQeUludF9Bc0xvbmcodnYpOwogCi0JaWYgKCFQeUxvbmdfQ2hlY2sodnYpKSB7Ci0JCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JCW5iID0gdnYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQkJaWYgKG5iID09IE5VTEwgfHwgbmItPm5iX2ludCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXZ2ID0gKCpuYi0+bmJfaW50KSAodnYpOwotCQlpZiAodnYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJZG9fZGVjcmVmID0gMTsKLQkJaWYoUHlJbnRfQ2hlY2sodnYpKSB7Ci0JCQlyZXMgPSBQeUludF9Bc0xvbmcodnYpOwotCQkJZ290byBleGl0OwotCQl9Ci0JCWlmICghUHlMb25nX0NoZWNrKHZ2KSkgewotCQkJUHlfREVDUkVGKHZ2KTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJuYl9pbnQgc2hvdWxkIHJldHVybiBpbnQgb2JqZWN0Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKCFQeUxvbmdfQ2hlY2sodnYpKSB7CisgICAgICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7CisgICAgICAgIG5iID0gdnYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICAgICAgaWYgKG5iID09IE5VTEwgfHwgbmItPm5iX2ludCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdnYgPSAoKm5iLT5uYl9pbnQpICh2dik7CisgICAgICAgIGlmICh2diA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBkb19kZWNyZWYgPSAxOworICAgICAgICBpZihQeUludF9DaGVjayh2dikpIHsKKyAgICAgICAgICAgIHJlcyA9IFB5SW50X0FzTG9uZyh2dik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeUxvbmdfQ2hlY2sodnYpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodnYpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmJfaW50IHNob3VsZCByZXR1cm4gaW50IG9iamVjdCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JcmVzID0gLTE7Ci0JdiA9IChQeUxvbmdPYmplY3QgKil2djsKLQlpID0gUHlfU0laRSh2KTsKKyAgICByZXMgPSAtMTsKKyAgICB2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OworICAgIGkgPSBQeV9TSVpFKHYpOwogCi0Jc3dpdGNoIChpKSB7Ci0JY2FzZSAtMToKLQkJcmVzID0gLShzZGlnaXQpdi0+b2JfZGlnaXRbMF07Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQkJcmVzID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlyZXMgPSB2LT5vYl9kaWdpdFswXTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2lnbiA9IDE7Ci0JCXggPSAwOwotCQlpZiAoaSA8IDApIHsKLQkJCXNpZ24gPSAtMTsKLQkJCWkgPSAtKGkpOwotCQl9Ci0JCXdoaWxlICgtLWkgPj0gMCkgewotCQkJcHJldiA9IHg7Ci0JCQl4ID0gKHggPDwgUHlMb25nX1NISUZUKSArIHYtPm9iX2RpZ2l0W2ldOwotCQkJaWYgKCh4ID4+IFB5TG9uZ19TSElGVCkgIT0gcHJldikgewotCQkJCSpvdmVyZmxvdyA9IHNpZ247Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQl9Ci0JCS8qIEhhdmVuJ3QgbG9zdCBhbnkgYml0cywgYnV0IGNhc3RpbmcgdG8gbG9uZyByZXF1aXJlcyBleHRyYQotCQkgKiBjYXJlIChzZWUgY29tbWVudCBhYm92ZSkuCi0JCSAqLwotCQlpZiAoeCA8PSAodW5zaWduZWQgbG9uZylMT05HX01BWCkgewotCQkJcmVzID0gKGxvbmcpeCAqIHNpZ247Ci0JCX0KLQkJZWxzZSBpZiAoc2lnbiA8IDAgJiYgeCA9PSBQWV9BQlNfTE9OR19NSU4pIHsKLQkJCXJlcyA9IExPTkdfTUlOOwotCQl9Ci0JCWVsc2UgewotCQkJKm92ZXJmbG93ID0gc2lnbjsKLQkJCS8qIHJlcyBpcyBhbHJlYWR5IHNldCB0byAtMSAqLwotCQl9Ci0JfQorICAgIHN3aXRjaCAoaSkgeworICAgIGNhc2UgLTE6CisgICAgICAgIHJlcyA9IC0oc2RpZ2l0KXYtPm9iX2RpZ2l0WzBdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDA6CisgICAgICAgIHJlcyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgcmVzID0gdi0+b2JfZGlnaXRbMF07CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHNpZ24gPSAxOworICAgICAgICB4ID0gMDsKKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICBzaWduID0gLTE7CisgICAgICAgICAgICBpID0gLShpKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgICAgIHByZXYgPSB4OworICAgICAgICAgICAgeCA9ICh4IDw8IFB5TG9uZ19TSElGVCkgKyB2LT5vYl9kaWdpdFtpXTsKKyAgICAgICAgICAgIGlmICgoeCA+PiBQeUxvbmdfU0hJRlQpICE9IHByZXYpIHsKKyAgICAgICAgICAgICAgICAqb3ZlcmZsb3cgPSBzaWduOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBIYXZlbid0IGxvc3QgYW55IGJpdHMsIGJ1dCBjYXN0aW5nIHRvIGxvbmcgcmVxdWlyZXMgZXh0cmEKKyAgICAgICAgICogY2FyZSAoc2VlIGNvbW1lbnQgYWJvdmUpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHggPD0gKHVuc2lnbmVkIGxvbmcpTE9OR19NQVgpIHsKKyAgICAgICAgICAgIHJlcyA9IChsb25nKXggKiBzaWduOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNpZ24gPCAwICYmIHggPT0gUFlfQUJTX0xPTkdfTUlOKSB7CisgICAgICAgICAgICByZXMgPSBMT05HX01JTjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICpvdmVyZmxvdyA9IHNpZ247CisgICAgICAgICAgICAvKiByZXMgaXMgYWxyZWFkeSBzZXQgdG8gLTEgKi8KKyAgICAgICAgfQorICAgIH0KICBleGl0OgotCWlmIChkb19kZWNyZWYpIHsKLQkJUHlfREVDUkVGKHZ2KTsKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoZG9fZGVjcmVmKSB7CisgICAgICAgIFB5X0RFQ1JFRih2dik7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIC8qIEdldCBhIEMgbG9uZyBpbnQgZnJvbSBhIGxvbmcgaW50IG9iamVjdC4KQEAgLTMyOCwxNSArMzI4LDE1IEBACiBsb25nCiBQeUxvbmdfQXNMb25nKFB5T2JqZWN0ICpvYmopCiB7Ci0JaW50IG92ZXJmbG93OwotCWxvbmcgcmVzdWx0ID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KG9iaiwgJm92ZXJmbG93KTsKLQlpZiAob3ZlcmZsb3cpIHsKLQkJLyogWFhYOiBjb3VsZCBiZSBjdXRlIGFuZCBnaXZlIGEgZGlmZmVyZW50Ci0JCSAgIG1lc3NhZ2UgZm9yIG92ZXJmbG93ID09IC0xICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJQeXRob24gaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIEMgbG9uZyIpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGludCBvdmVyZmxvdzsKKyAgICBsb25nIHJlc3VsdCA9IFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdyhvYmosICZvdmVyZmxvdyk7CisgICAgaWYgKG92ZXJmbG93KSB7CisgICAgICAgIC8qIFhYWDogY291bGQgYmUgY3V0ZSBhbmQgZ2l2ZSBhIGRpZmZlcmVudAorICAgICAgICAgICBtZXNzYWdlIGZvciBvdmVyZmxvdyA9PSAtMSAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIEMgbG9uZyIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBHZXQgYSBQeV9zc2l6ZV90IGZyb20gYSBsb25nIGludCBvYmplY3QuCkBAIC0zNDQsNDQgKzM0NCw0NCBAQAogCiBQeV9zc2l6ZV90CiBQeUxvbmdfQXNTc2l6ZV90KFB5T2JqZWN0ICp2dikgewotCXJlZ2lzdGVyIFB5TG9uZ09iamVjdCAqdjsKLQlzaXplX3QgeCwgcHJldjsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHNpZ247CisgICAgcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OworICAgIHNpemVfdCB4LCBwcmV2OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgc2lnbjsKIAotCWlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXYgPSAoUHlMb25nT2JqZWN0ICopdnY7Ci0JaSA9IHYtPm9iX3NpemU7Ci0Jc2lnbiA9IDE7Ci0JeCA9IDA7Ci0JaWYgKGkgPCAwKSB7Ci0JCXNpZ24gPSAtMTsKLQkJaSA9IC0oaSk7Ci0JfQotCXdoaWxlICgtLWkgPj0gMCkgewotCQlwcmV2ID0geDsKLQkJeCA9ICh4IDw8IFB5TG9uZ19TSElGVCkgfCB2LT5vYl9kaWdpdFtpXTsKLQkJaWYgKCh4ID4+IFB5TG9uZ19TSElGVCkgIT0gcHJldikKLQkJCWdvdG8gb3ZlcmZsb3c7Ci0JfQotCS8qIEhhdmVuJ3QgbG9zdCBhbnkgYml0cywgYnV0IGNhc3RpbmcgdG8gYSBzaWduZWQgdHlwZSByZXF1aXJlcwotCSAqIGV4dHJhIGNhcmUgKHNlZSBjb21tZW50IGFib3ZlKS4KLQkgKi8KLQlpZiAoeCA8PSAoc2l6ZV90KVBZX1NTSVpFX1RfTUFYKSB7Ci0JCXJldHVybiAoUHlfc3NpemVfdCl4ICogc2lnbjsKLQl9Ci0JZWxzZSBpZiAoc2lnbiA8IDAgJiYgeCA9PSBQWV9BQlNfU1NJWkVfVF9NSU4pIHsKLQkJcmV0dXJuIFBZX1NTSVpFX1RfTUlOOwotCX0KLQkvKiBlbHNlIG92ZXJmbG93ICovCisgICAgaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdiA9IChQeUxvbmdPYmplY3QgKil2djsKKyAgICBpID0gdi0+b2Jfc2l6ZTsKKyAgICBzaWduID0gMTsKKyAgICB4ID0gMDsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgc2lnbiA9IC0xOworICAgICAgICBpID0gLShpKTsKKyAgICB9CisgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgIHByZXYgPSB4OworICAgICAgICB4ID0gKHggPDwgUHlMb25nX1NISUZUKSB8IHYtPm9iX2RpZ2l0W2ldOworICAgICAgICBpZiAoKHggPj4gUHlMb25nX1NISUZUKSAhPSBwcmV2KQorICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKKyAgICB9CisgICAgLyogSGF2ZW4ndCBsb3N0IGFueSBiaXRzLCBidXQgY2FzdGluZyB0byBhIHNpZ25lZCB0eXBlIHJlcXVpcmVzCisgICAgICogZXh0cmEgY2FyZSAoc2VlIGNvbW1lbnQgYWJvdmUpLgorICAgICAqLworICAgIGlmICh4IDw9IChzaXplX3QpUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgcmV0dXJuIChQeV9zc2l6ZV90KXggKiBzaWduOworICAgIH0KKyAgICBlbHNlIGlmIChzaWduIDwgMCAmJiB4ID09IFBZX0FCU19TU0laRV9UX01JTikgeworICAgICAgICByZXR1cm4gUFlfU1NJWkVfVF9NSU47CisgICAgfQorICAgIC8qIGVsc2Ugb3ZlcmZsb3cgKi8KIAogIG92ZXJmbG93OgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImxvbmcgaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIGludCIpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImxvbmcgaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIGludCIpOworICAgIHJldHVybiAtMTsKIH0KIAogLyogR2V0IGEgQyB1bnNpZ25lZCBsb25nIGludCBmcm9tIGEgbG9uZyBpbnQgb2JqZWN0LgpAQCAtMzkwLDQxICszOTAsNDEgQEAKIHVuc2lnbmVkIGxvbmcKIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhQeU9iamVjdCAqdnYpCiB7Ci0JcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OwotCXVuc2lnbmVkIGxvbmcgeCwgcHJldjsKLQlQeV9zc2l6ZV90IGk7CisgICAgcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OworICAgIHVuc2lnbmVkIGxvbmcgeCwgcHJldjsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgewotCQlpZiAodnYgIT0gTlVMTCAmJiBQeUludF9DaGVjayh2dikpIHsKLQkJCWxvbmcgdmFsID0gUHlJbnRfQXNMb25nKHZ2KTsKLQkJCWlmICh2YWwgPCAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgdmFsdWUgdG8gdW5zaWduZWQgbG9uZyIpOwotCQkJCXJldHVybiAodW5zaWduZWQgbG9uZykgLTE7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsOwotCQl9Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC0xOwotCX0KLQl2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OwotCWkgPSBQeV9TSVpFKHYpOwotCXggPSAwOwotCWlmIChpIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSAgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIHZhbHVlIHRvIHVuc2lnbmVkIGxvbmciKTsKLQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKLQl9Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCXByZXYgPSB4OwotCQl4ID0gKHggPDwgUHlMb25nX1NISUZUKSB8IHYtPm9iX2RpZ2l0W2ldOwotCQlpZiAoKHggPj4gUHlMb25nX1NISUZUKSAhPSBwcmV2KSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibG9uZyBpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQiKTsKLQkJCXJldHVybiAodW5zaWduZWQgbG9uZykgLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIHg7CisgICAgaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgaWYgKHZ2ICE9IE5VTEwgJiYgUHlJbnRfQ2hlY2sodnYpKSB7CisgICAgICAgICAgICBsb25nIHZhbCA9IFB5SW50X0FzTG9uZyh2dik7CisgICAgICAgICAgICBpZiAodmFsIDwgMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIHZhbHVlIHRvIHVuc2lnbmVkIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKKyAgICB9CisgICAgdiA9IChQeUxvbmdPYmplY3QgKil2djsKKyAgICBpID0gUHlfU0laRSh2KTsKKyAgICB4ID0gMDsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgdmFsdWUgdG8gdW5zaWduZWQgbG9uZyIpOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC0xOworICAgIH0KKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgcHJldiA9IHg7CisgICAgICAgIHggPSAoeCA8PCBQeUxvbmdfU0hJRlQpIHwgdi0+b2JfZGlnaXRbaV07CisgICAgICAgIGlmICgoeCA+PiBQeUxvbmdfU0hJRlQpICE9IHByZXYpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJsb25nIGludCB0b28gbGFyZ2UgdG8gY29udmVydCIpOworICAgICAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4geDsKIH0KIAogLyogR2V0IGEgQyB1bnNpZ25lZCBsb25nIGludCBmcm9tIGEgbG9uZyBpbnQgb2JqZWN0LCBpZ25vcmluZyB0aGUgaGlnaCBiaXRzLgpAQCAtNDMzLDMxNyArNDMzLDMxNyBAQAogdW5zaWduZWQgbG9uZwogUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayhQeU9iamVjdCAqdnYpCiB7Ci0JcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OwotCXVuc2lnbmVkIGxvbmcgeDsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHNpZ247CisgICAgcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IHNpZ247CiAKLQlpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgewotCQlpZiAodnYgIT0gTlVMTCAmJiBQeUludF9DaGVjayh2dikpCi0JCQlyZXR1cm4gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKHZ2KTsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAodW5zaWduZWQgbG9uZykgLTE7Ci0JfQotCXYgPSAoUHlMb25nT2JqZWN0ICopdnY7Ci0JaSA9IHYtPm9iX3NpemU7Ci0Jc2lnbiA9IDE7Ci0JeCA9IDA7Ci0JaWYgKGkgPCAwKSB7Ci0JCXNpZ24gPSAtMTsKLQkJaSA9IC1pOwotCX0KLQl3aGlsZSAoLS1pID49IDApIHsKLQkJeCA9ICh4IDw8IFB5TG9uZ19TSElGVCkgfCB2LT5vYl9kaWdpdFtpXTsKLQl9Ci0JcmV0dXJuIHggKiBzaWduOworICAgIGlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7CisgICAgICAgIGlmICh2diAhPSBOVUxMICYmIFB5SW50X0NoZWNrKHZ2KSkKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodnYpOworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKKyAgICB9CisgICAgdiA9IChQeUxvbmdPYmplY3QgKil2djsKKyAgICBpID0gdi0+b2Jfc2l6ZTsKKyAgICBzaWduID0gMTsKKyAgICB4ID0gMDsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgc2lnbiA9IC0xOworICAgICAgICBpID0gLWk7CisgICAgfQorICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICB4ID0gKHggPDwgUHlMb25nX1NISUZUKSB8IHYtPm9iX2RpZ2l0W2ldOworICAgIH0KKyAgICByZXR1cm4geCAqIHNpZ247CiB9CiAKIGludAogX1B5TG9uZ19TaWduKFB5T2JqZWN0ICp2dikKIHsKLQlQeUxvbmdPYmplY3QgKnYgPSAoUHlMb25nT2JqZWN0ICopdnY7CisgICAgUHlMb25nT2JqZWN0ICp2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OwogCi0JYXNzZXJ0KHYgIT0gTlVMTCk7Ci0JYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CisgICAgYXNzZXJ0KHYgIT0gTlVMTCk7CisgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CiAKLQlyZXR1cm4gUHlfU0laRSh2KSA9PSAwID8gMCA6IChQeV9TSVpFKHYpIDwgMCA/IC0xIDogMSk7CisgICAgcmV0dXJuIFB5X1NJWkUodikgPT0gMCA/IDAgOiAoUHlfU0laRSh2KSA8IDAgPyAtMSA6IDEpOwogfQogCiBzaXplX3QKIF9QeUxvbmdfTnVtQml0cyhQeU9iamVjdCAqdnYpCiB7Ci0JUHlMb25nT2JqZWN0ICp2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OwotCXNpemVfdCByZXN1bHQgPSAwOwotCVB5X3NzaXplX3QgbmRpZ2l0czsKKyAgICBQeUxvbmdPYmplY3QgKnYgPSAoUHlMb25nT2JqZWN0ICopdnY7CisgICAgc2l6ZV90IHJlc3VsdCA9IDA7CisgICAgUHlfc3NpemVfdCBuZGlnaXRzOwogCi0JYXNzZXJ0KHYgIT0gTlVMTCk7Ci0JYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7Ci0JbmRpZ2l0cyA9IEFCUyhQeV9TSVpFKHYpKTsKLQlhc3NlcnQobmRpZ2l0cyA9PSAwIHx8IHYtPm9iX2RpZ2l0W25kaWdpdHMgLSAxXSAhPSAwKTsKLQlpZiAobmRpZ2l0cyA+IDApIHsKLQkJZGlnaXQgbXNkID0gdi0+b2JfZGlnaXRbbmRpZ2l0cyAtIDFdOworICAgIGFzc2VydCh2ICE9IE5VTEwpOworICAgIGFzc2VydChQeUxvbmdfQ2hlY2sodikpOworICAgIG5kaWdpdHMgPSBBQlMoUHlfU0laRSh2KSk7CisgICAgYXNzZXJ0KG5kaWdpdHMgPT0gMCB8fCB2LT5vYl9kaWdpdFtuZGlnaXRzIC0gMV0gIT0gMCk7CisgICAgaWYgKG5kaWdpdHMgPiAwKSB7CisgICAgICAgIGRpZ2l0IG1zZCA9IHYtPm9iX2RpZ2l0W25kaWdpdHMgLSAxXTsKIAotCQlyZXN1bHQgPSAobmRpZ2l0cyAtIDEpICogUHlMb25nX1NISUZUOwotCQlpZiAocmVzdWx0IC8gUHlMb25nX1NISUZUICE9IChzaXplX3QpKG5kaWdpdHMgLSAxKSkKLQkJCWdvdG8gT3ZlcmZsb3c7Ci0JCWRvIHsKLQkJCSsrcmVzdWx0OwotCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCWdvdG8gT3ZlcmZsb3c7Ci0JCQltc2QgPj49IDE7Ci0JCX0gd2hpbGUgKG1zZCk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgICAgIHJlc3VsdCA9IChuZGlnaXRzIC0gMSkgKiBQeUxvbmdfU0hJRlQ7CisgICAgICAgIGlmIChyZXN1bHQgLyBQeUxvbmdfU0hJRlQgIT0gKHNpemVfdCkobmRpZ2l0cyAtIDEpKQorICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICAgICAgZG8geworICAgICAgICAgICAgKytyZXN1bHQ7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApCisgICAgICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICAgICAgICAgIG1zZCA+Pj0gMTsKKyAgICAgICAgfSB3aGlsZSAobXNkKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIAogT3ZlcmZsb3c6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsb25nIGhhcyB0b28gbWFueSBiaXRzICIKLQkJCSJ0byBleHByZXNzIGluIGEgcGxhdGZvcm0gc2l6ZV90Iik7Ci0JcmV0dXJuIChzaXplX3QpLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsb25nIGhhcyB0b28gbWFueSBiaXRzICIKKyAgICAgICAgICAgICAgICAgICAgInRvIGV4cHJlc3MgaW4gYSBwbGF0Zm9ybSBzaXplX3QiKTsKKyAgICByZXR1cm4gKHNpemVfdCktMTsKIH0KIAogUHlPYmplY3QgKgogX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ5dGVzLCBzaXplX3QgbiwKLQkJICAgICAgaW50IGxpdHRsZV9lbmRpYW4sIGludCBpc19zaWduZWQpCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxpdHRsZV9lbmRpYW4sIGludCBpc19zaWduZWQpCiB7Ci0JY29uc3QgdW5zaWduZWQgY2hhciogcHN0YXJ0Ynl0ZTsvKiBMU0Igb2YgYnl0ZXMgKi8KLQlpbnQgaW5jcjsJCQkvKiBkaXJlY3Rpb24gdG8gbW92ZSBwc3RhcnRieXRlICovCi0JY29uc3QgdW5zaWduZWQgY2hhciogcGVuZGJ5dGU7CS8qIE1TQiBvZiBieXRlcyAqLwotCXNpemVfdCBudW1zaWduaWZpY2FudGJ5dGVzOwkvKiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXR0ZXIgKi8KLQlQeV9zc2l6ZV90IG5kaWdpdHM7CQkvKiBudW1iZXIgb2YgUHl0aG9uIGxvbmcgZGlnaXRzICovCi0JUHlMb25nT2JqZWN0KiB2OwkJLyogcmVzdWx0ICovCi0JUHlfc3NpemVfdCBpZGlnaXQgPSAwOwkJLyogbmV4dCBmcmVlIGluZGV4IGluIHYtPm9iX2RpZ2l0ICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogcHN0YXJ0Ynl0ZTsvKiBMU0Igb2YgYnl0ZXMgKi8KKyAgICBpbnQgaW5jcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXJlY3Rpb24gdG8gbW92ZSBwc3RhcnRieXRlICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogcGVuZGJ5dGU7ICAgICAgLyogTVNCIG9mIGJ5dGVzICovCisgICAgc2l6ZV90IG51bXNpZ25pZmljYW50Ynl0ZXM7ICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF0dGVyICovCisgICAgUHlfc3NpemVfdCBuZGlnaXRzOyAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIFB5dGhvbiBsb25nIGRpZ2l0cyAqLworICAgIFB5TG9uZ09iamVjdCogdjsgICAgICAgICAgICAgICAgICAgIC8qIHJlc3VsdCAqLworICAgIFB5X3NzaXplX3QgaWRpZ2l0ID0gMDsgICAgICAgICAgICAgIC8qIG5leHQgZnJlZSBpbmRleCBpbiB2LT5vYl9kaWdpdCAqLwogCi0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwTCk7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwTCk7CiAKLQlpZiAobGl0dGxlX2VuZGlhbikgewotCQlwc3RhcnRieXRlID0gYnl0ZXM7Ci0JCXBlbmRieXRlID0gYnl0ZXMgKyBuIC0gMTsKLQkJaW5jciA9IDE7Ci0JfQotCWVsc2UgewotCQlwc3RhcnRieXRlID0gYnl0ZXMgKyBuIC0gMTsKLQkJcGVuZGJ5dGUgPSBieXRlczsKLQkJaW5jciA9IC0xOwotCX0KKyAgICBpZiAobGl0dGxlX2VuZGlhbikgeworICAgICAgICBwc3RhcnRieXRlID0gYnl0ZXM7CisgICAgICAgIHBlbmRieXRlID0gYnl0ZXMgKyBuIC0gMTsKKyAgICAgICAgaW5jciA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwc3RhcnRieXRlID0gYnl0ZXMgKyBuIC0gMTsKKyAgICAgICAgcGVuZGJ5dGUgPSBieXRlczsKKyAgICAgICAgaW5jciA9IC0xOworICAgIH0KIAotCWlmIChpc19zaWduZWQpCi0JCWlzX3NpZ25lZCA9ICpwZW5kYnl0ZSA+PSAweDgwOworICAgIGlmIChpc19zaWduZWQpCisgICAgICAgIGlzX3NpZ25lZCA9ICpwZW5kYnl0ZSA+PSAweDgwOwogCi0JLyogQ29tcHV0ZSBudW1zaWduaWZpY2FudGJ5dGVzLiAgVGhpcyBjb25zaXN0cyBvZiBmaW5kaW5nIHRoZSBtb3N0Ci0JICAgc2lnbmlmaWNhbnQgYnl0ZS4gIExlYWRpbmcgMCBieXRlcyBhcmUgaW5zaWduZmljYW50IGlmIHRoZSBudW1iZXIKLQkgICBpcyBwb3NpdGl2ZSwgYW5kIGxlYWRpbmcgMHhmZiBieXRlcyBpZiBuZWdhdGl2ZS4gKi8KLQl7Ci0JCXNpemVfdCBpOwotCQljb25zdCB1bnNpZ25lZCBjaGFyKiBwID0gcGVuZGJ5dGU7Ci0JCWNvbnN0IGludCBwaW5jciA9IC1pbmNyOyAgLyogc2VhcmNoIE1TQiB0byBMU0IgKi8KLQkJY29uc3QgdW5zaWduZWQgY2hhciBpbnNpZ25maWNhbnQgPSBpc19zaWduZWQgPyAweGZmIDogMHgwMDsKKyAgICAvKiBDb21wdXRlIG51bXNpZ25pZmljYW50Ynl0ZXMuICBUaGlzIGNvbnNpc3RzIG9mIGZpbmRpbmcgdGhlIG1vc3QKKyAgICAgICBzaWduaWZpY2FudCBieXRlLiAgTGVhZGluZyAwIGJ5dGVzIGFyZSBpbnNpZ25maWNhbnQgaWYgdGhlIG51bWJlcgorICAgICAgIGlzIHBvc2l0aXZlLCBhbmQgbGVhZGluZyAweGZmIGJ5dGVzIGlmIG5lZ2F0aXZlLiAqLworICAgIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHAgPSBwZW5kYnl0ZTsKKyAgICAgICAgY29uc3QgaW50IHBpbmNyID0gLWluY3I7ICAvKiBzZWFyY2ggTVNCIHRvIExTQiAqLworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGluc2lnbmZpY2FudCA9IGlzX3NpZ25lZCA/IDB4ZmYgOiAweDAwOwogCi0JCWZvciAoaSA9IDA7IGkgPCBuOyArK2ksIHAgKz0gcGluY3IpIHsKLQkJCWlmICgqcCAhPSBpbnNpZ25maWNhbnQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJbnVtc2lnbmlmaWNhbnRieXRlcyA9IG4gLSBpOwotCQkvKiAyJ3MtY29tcCBpcyBhIGJpdCB0cmlja3kgaGVyZSwgZS5nLiAweGZmMDAgPT0gLTB4MDEwMCwgc28KLQkJICAgYWN0dWFsbHkgaGFzIDIgc2lnbmlmaWNhbnQgYnl0ZXMuICBPVE9ILCAweGZmMDAwMSA9PQotCQkgICAtMHgwMGZmZmYsIHNvIHdlIHdvdWxkbid0ICpuZWVkKiB0byBidW1wIGl0IHRoZXJlOyBidXQgd2UKLQkJICAgZG8gZm9yIDB4ZmZmZiA9IC0weDAwMDEuICBUbyBiZSBzYWZlIHdpdGhvdXQgYm90aGVyaW5nIHRvCi0JCSAgIGNoZWNrIGV2ZXJ5IGNhc2UsIGJ1bXAgaXQgcmVnYXJkbGVzcy4gKi8KLQkJaWYgKGlzX3NpZ25lZCAmJiBudW1zaWduaWZpY2FudGJ5dGVzIDwgbikKLQkJCSsrbnVtc2lnbmlmaWNhbnRieXRlczsKLQl9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2ksIHAgKz0gcGluY3IpIHsKKyAgICAgICAgICAgIGlmICgqcCAhPSBpbnNpZ25maWNhbnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbnVtc2lnbmlmaWNhbnRieXRlcyA9IG4gLSBpOworICAgICAgICAvKiAyJ3MtY29tcCBpcyBhIGJpdCB0cmlja3kgaGVyZSwgZS5nLiAweGZmMDAgPT0gLTB4MDEwMCwgc28KKyAgICAgICAgICAgYWN0dWFsbHkgaGFzIDIgc2lnbmlmaWNhbnQgYnl0ZXMuICBPVE9ILCAweGZmMDAwMSA9PQorICAgICAgICAgICAtMHgwMGZmZmYsIHNvIHdlIHdvdWxkbid0ICpuZWVkKiB0byBidW1wIGl0IHRoZXJlOyBidXQgd2UKKyAgICAgICAgICAgZG8gZm9yIDB4ZmZmZiA9IC0weDAwMDEuICBUbyBiZSBzYWZlIHdpdGhvdXQgYm90aGVyaW5nIHRvCisgICAgICAgICAgIGNoZWNrIGV2ZXJ5IGNhc2UsIGJ1bXAgaXQgcmVnYXJkbGVzcy4gKi8KKyAgICAgICAgaWYgKGlzX3NpZ25lZCAmJiBudW1zaWduaWZpY2FudGJ5dGVzIDwgbikKKyAgICAgICAgICAgICsrbnVtc2lnbmlmaWNhbnRieXRlczsKKyAgICB9CiAKLQkvKiBIb3cgbWFueSBQeXRob24gbG9uZyBkaWdpdHMgZG8gd2UgbmVlZD8gIFdlIGhhdmUKLQkgICA4Km51bXNpZ25pZmljYW50Ynl0ZXMgYml0cywgYW5kIGVhY2ggUHl0aG9uIGxvbmcgZGlnaXQgaGFzCi0JICAgUHlMb25nX1NISUZUIGJpdHMsIHNvIGl0J3MgdGhlIGNlaWxpbmcgb2YgdGhlIHF1b3RpZW50LiAqLwotCS8qIGNhdGNoIG92ZXJmbG93IGJlZm9yZSBpdCBoYXBwZW5zICovCi0JaWYgKG51bXNpZ25pZmljYW50Ynl0ZXMgPiAoUFlfU1NJWkVfVF9NQVggLSBQeUxvbmdfU0hJRlQpIC8gOCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkiYnl0ZSBhcnJheSB0b28gbG9uZyB0byBjb252ZXJ0IHRvIGludCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbmRpZ2l0cyA9IChudW1zaWduaWZpY2FudGJ5dGVzICogOCArIFB5TG9uZ19TSElGVCAtIDEpIC8gUHlMb25nX1NISUZUOwotCXYgPSBfUHlMb25nX05ldyhuZGlnaXRzKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBIb3cgbWFueSBQeXRob24gbG9uZyBkaWdpdHMgZG8gd2UgbmVlZD8gIFdlIGhhdmUKKyAgICAgICA4Km51bXNpZ25pZmljYW50Ynl0ZXMgYml0cywgYW5kIGVhY2ggUHl0aG9uIGxvbmcgZGlnaXQgaGFzCisgICAgICAgUHlMb25nX1NISUZUIGJpdHMsIHNvIGl0J3MgdGhlIGNlaWxpbmcgb2YgdGhlIHF1b3RpZW50LiAqLworICAgIC8qIGNhdGNoIG92ZXJmbG93IGJlZm9yZSBpdCBoYXBwZW5zICovCisgICAgaWYgKG51bXNpZ25pZmljYW50Ynl0ZXMgPiAoUFlfU1NJWkVfVF9NQVggLSBQeUxvbmdfU0hJRlQpIC8gOCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJieXRlIGFycmF5IHRvbyBsb25nIHRvIGNvbnZlcnQgdG8gaW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBuZGlnaXRzID0gKG51bXNpZ25pZmljYW50Ynl0ZXMgKiA4ICsgUHlMb25nX1NISUZUIC0gMSkgLyBQeUxvbmdfU0hJRlQ7CisgICAgdiA9IF9QeUxvbmdfTmV3KG5kaWdpdHMpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogQ29weSB0aGUgYml0cyBvdmVyLiAgVGhlIHRyaWNreSBwYXJ0cyBhcmUgY29tcHV0aW5nIDIncy1jb21wIG9uCi0JICAgdGhlIGZseSBmb3Igc2lnbmVkIG51bWJlcnMsIGFuZCBkZWFsaW5nIHdpdGggdGhlIG1pc21hdGNoIGJldHdlZW4KLQkgICA4LWJpdCBieXRlcyBhbmQgKHByb2JhYmx5KSAxNS1iaXQgUHl0aG9uIGRpZ2l0cy4qLwotCXsKLQkJc2l6ZV90IGk7Ci0JCXR3b2RpZ2l0cyBjYXJyeSA9IDE7CQkvKiBmb3IgMidzLWNvbXAgY2FsY3VsYXRpb24gKi8KLQkJdHdvZGlnaXRzIGFjY3VtID0gMDsJCS8qIHNsaWRpbmcgcmVnaXN0ZXIgKi8KLQkJdW5zaWduZWQgaW50IGFjY3VtYml0cyA9IDA7IAkvKiBudW1iZXIgb2YgYml0cyBpbiBhY2N1bSAqLwotCQljb25zdCB1bnNpZ25lZCBjaGFyKiBwID0gcHN0YXJ0Ynl0ZTsKKyAgICAvKiBDb3B5IHRoZSBiaXRzIG92ZXIuICBUaGUgdHJpY2t5IHBhcnRzIGFyZSBjb21wdXRpbmcgMidzLWNvbXAgb24KKyAgICAgICB0aGUgZmx5IGZvciBzaWduZWQgbnVtYmVycywgYW5kIGRlYWxpbmcgd2l0aCB0aGUgbWlzbWF0Y2ggYmV0d2VlbgorICAgICAgIDgtYml0IGJ5dGVzIGFuZCAocHJvYmFibHkpIDE1LWJpdCBQeXRob24gZGlnaXRzLiovCisgICAgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgdHdvZGlnaXRzIGNhcnJ5ID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIGZvciAyJ3MtY29tcCBjYWxjdWxhdGlvbiAqLworICAgICAgICB0d29kaWdpdHMgYWNjdW0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogc2xpZGluZyByZWdpc3RlciAqLworICAgICAgICB1bnNpZ25lZCBpbnQgYWNjdW1iaXRzID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gYWNjdW0gKi8KKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogcCA9IHBzdGFydGJ5dGU7CiAKLQkJZm9yIChpID0gMDsgaSA8IG51bXNpZ25pZmljYW50Ynl0ZXM7ICsraSwgcCArPSBpbmNyKSB7Ci0JCQl0d29kaWdpdHMgdGhpc2J5dGUgPSAqcDsKLQkJCS8qIENvbXB1dGUgY29ycmVjdGlvbiBmb3IgMidzIGNvbXAsIGlmIG5lZWRlZC4gKi8KLQkJCWlmIChpc19zaWduZWQpIHsKLQkJCQl0aGlzYnl0ZSA9ICgweGZmIF4gdGhpc2J5dGUpICsgY2Fycnk7Ci0JCQkJY2FycnkgPSB0aGlzYnl0ZSA+PiA4OwotCQkJCXRoaXNieXRlICY9IDB4ZmY7Ci0JCQl9Ci0JCQkvKiBCZWNhdXNlIHdlJ3JlIGdvaW5nIExTQiB0byBNU0IsIHRoaXNieXRlIGlzCi0JCQkgICBtb3JlIHNpZ25pZmljYW50IHRoYW4gd2hhdCdzIGFscmVhZHkgaW4gYWNjdW0sCi0JCQkgICBzbyBuZWVkcyB0byBiZSBwcmVwZW5kZWQgdG8gYWNjdW0uICovCi0JCQlhY2N1bSB8PSAodHdvZGlnaXRzKXRoaXNieXRlIDw8IGFjY3VtYml0czsKLQkJCWFjY3VtYml0cyArPSA4OwotCQkJaWYgKGFjY3VtYml0cyA+PSBQeUxvbmdfU0hJRlQpIHsKLQkJCQkvKiBUaGVyZSdzIGVub3VnaCB0byBmaWxsIGEgUHl0aG9uIGRpZ2l0LiAqLwotCQkJCWFzc2VydChpZGlnaXQgPCBuZGlnaXRzKTsKLQkJCQl2LT5vYl9kaWdpdFtpZGlnaXRdID0gKGRpZ2l0KShhY2N1bSAmCi0JCQkJCQkJICAgICAgUHlMb25nX01BU0spOwotCQkJCSsraWRpZ2l0OwotCQkJCWFjY3VtID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCQkJYWNjdW1iaXRzIC09IFB5TG9uZ19TSElGVDsKLQkJCQlhc3NlcnQoYWNjdW1iaXRzIDwgUHlMb25nX1NISUZUKTsKLQkJCX0KLQkJfQotCQlhc3NlcnQoYWNjdW1iaXRzIDwgUHlMb25nX1NISUZUKTsKLQkJaWYgKGFjY3VtYml0cykgewotCQkJYXNzZXJ0KGlkaWdpdCA8IG5kaWdpdHMpOwotCQkJdi0+b2JfZGlnaXRbaWRpZ2l0XSA9IChkaWdpdClhY2N1bTsKLQkJCSsraWRpZ2l0OwotCQl9Ci0JfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtc2lnbmlmaWNhbnRieXRlczsgKytpLCBwICs9IGluY3IpIHsKKyAgICAgICAgICAgIHR3b2RpZ2l0cyB0aGlzYnl0ZSA9ICpwOworICAgICAgICAgICAgLyogQ29tcHV0ZSBjb3JyZWN0aW9uIGZvciAyJ3MgY29tcCwgaWYgbmVlZGVkLiAqLworICAgICAgICAgICAgaWYgKGlzX3NpZ25lZCkgeworICAgICAgICAgICAgICAgIHRoaXNieXRlID0gKDB4ZmYgXiB0aGlzYnl0ZSkgKyBjYXJyeTsKKyAgICAgICAgICAgICAgICBjYXJyeSA9IHRoaXNieXRlID4+IDg7CisgICAgICAgICAgICAgICAgdGhpc2J5dGUgJj0gMHhmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEJlY2F1c2Ugd2UncmUgZ29pbmcgTFNCIHRvIE1TQiwgdGhpc2J5dGUgaXMKKyAgICAgICAgICAgICAgIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiB3aGF0J3MgYWxyZWFkeSBpbiBhY2N1bSwKKyAgICAgICAgICAgICAgIHNvIG5lZWRzIHRvIGJlIHByZXBlbmRlZCB0byBhY2N1bS4gKi8KKyAgICAgICAgICAgIGFjY3VtIHw9ICh0d29kaWdpdHMpdGhpc2J5dGUgPDwgYWNjdW1iaXRzOworICAgICAgICAgICAgYWNjdW1iaXRzICs9IDg7CisgICAgICAgICAgICBpZiAoYWNjdW1iaXRzID49IFB5TG9uZ19TSElGVCkgeworICAgICAgICAgICAgICAgIC8qIFRoZXJlJ3MgZW5vdWdoIHRvIGZpbGwgYSBQeXRob24gZGlnaXQuICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KGlkaWdpdCA8IG5kaWdpdHMpOworICAgICAgICAgICAgICAgIHYtPm9iX2RpZ2l0W2lkaWdpdF0gPSAoZGlnaXQpKGFjY3VtICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICAgICAgKytpZGlnaXQ7CisgICAgICAgICAgICAgICAgYWNjdW0gPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgICAgICAgICBhY2N1bWJpdHMgLT0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgICAgIGFzc2VydChhY2N1bWJpdHMgPCBQeUxvbmdfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydChhY2N1bWJpdHMgPCBQeUxvbmdfU0hJRlQpOworICAgICAgICBpZiAoYWNjdW1iaXRzKSB7CisgICAgICAgICAgICBhc3NlcnQoaWRpZ2l0IDwgbmRpZ2l0cyk7CisgICAgICAgICAgICB2LT5vYl9kaWdpdFtpZGlnaXRdID0gKGRpZ2l0KWFjY3VtOworICAgICAgICAgICAgKytpZGlnaXQ7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeV9TSVpFKHYpID0gaXNfc2lnbmVkID8gLWlkaWdpdCA6IGlkaWdpdDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbG9uZ19ub3JtYWxpemUodik7CisgICAgUHlfU0laRSh2KSA9IGlzX3NpZ25lZCA/IC1pZGlnaXQgOiBpZGlnaXQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWxvbmdfbm9ybWFsaXplKHYpOwogfQogCiBpbnQKIF9QeUxvbmdfQXNCeXRlQXJyYXkoUHlMb25nT2JqZWN0KiB2LAotCQkgICAgdW5zaWduZWQgY2hhciogYnl0ZXMsIHNpemVfdCBuLAotCQkgICAgaW50IGxpdHRsZV9lbmRpYW4sIGludCBpc19zaWduZWQpCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ5dGVzLCBzaXplX3QgbiwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxpdHRsZV9lbmRpYW4sIGludCBpc19zaWduZWQpCiB7Ci0JUHlfc3NpemVfdCBpOwkJLyogaW5kZXggaW50byB2LT5vYl9kaWdpdCAqLwotCVB5X3NzaXplX3QgbmRpZ2l0czsJCS8qIHx2LT5vYl9zaXplfCAqLwotCXR3b2RpZ2l0cyBhY2N1bTsJLyogc2xpZGluZyByZWdpc3RlciAqLwotCXVuc2lnbmVkIGludCBhY2N1bWJpdHM7IC8qICMgYml0cyBpbiBhY2N1bSAqLwotCWludCBkb190d29zX2NvbXA7CS8qIHN0b3JlIDIncy1jb21wPyAgaXNfc2lnbmVkIGFuZCB2IDwgMCAqLwotCWRpZ2l0IGNhcnJ5OwkJLyogZm9yIGNvbXB1dGluZyAyJ3MtY29tcCAqLwotCXNpemVfdCBqOwkJLyogIyBieXRlcyBmaWxsZWQgKi8KLQl1bnNpZ25lZCBjaGFyKiBwOwkvKiBwb2ludGVyIHRvIG5leHQgYnl0ZSBpbiBieXRlcyAqLwotCWludCBwaW5jcjsJCS8qIGRpcmVjdGlvbiB0byBtb3ZlIHAgKi8KKyAgICBQeV9zc2l6ZV90IGk7ICAgICAgICAgICAgICAgLyogaW5kZXggaW50byB2LT5vYl9kaWdpdCAqLworICAgIFB5X3NzaXplX3QgbmRpZ2l0czsgICAgICAgICAgICAgICAgIC8qIHx2LT5vYl9zaXplfCAqLworICAgIHR3b2RpZ2l0cyBhY2N1bTsgICAgICAgICAgICAvKiBzbGlkaW5nIHJlZ2lzdGVyICovCisgICAgdW5zaWduZWQgaW50IGFjY3VtYml0czsgLyogIyBiaXRzIGluIGFjY3VtICovCisgICAgaW50IGRvX3R3b3NfY29tcDsgICAgICAgICAgIC8qIHN0b3JlIDIncy1jb21wPyAgaXNfc2lnbmVkIGFuZCB2IDwgMCAqLworICAgIGRpZ2l0IGNhcnJ5OyAgICAgICAgICAgICAgICAvKiBmb3IgY29tcHV0aW5nIDIncy1jb21wICovCisgICAgc2l6ZV90IGo7ICAgICAgICAgICAgICAgICAgIC8qICMgYnl0ZXMgZmlsbGVkICovCisgICAgdW5zaWduZWQgY2hhciogcDsgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBieXRlIGluIGJ5dGVzICovCisgICAgaW50IHBpbmNyOyAgICAgICAgICAgICAgICAgIC8qIGRpcmVjdGlvbiB0byBtb3ZlIHAgKi8KIAotCWFzc2VydCh2ICE9IE5VTEwgJiYgUHlMb25nX0NoZWNrKHYpKTsKKyAgICBhc3NlcnQodiAhPSBOVUxMICYmIFB5TG9uZ19DaGVjayh2KSk7CiAKLQlpZiAoUHlfU0laRSh2KSA8IDApIHsKLQkJbmRpZ2l0cyA9IC0oUHlfU0laRSh2KSk7Ci0JCWlmICghaXNfc2lnbmVkKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBsb25nIHRvIHVuc2lnbmVkIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZG9fdHdvc19jb21wID0gMTsKLQl9Ci0JZWxzZSB7Ci0JCW5kaWdpdHMgPSBQeV9TSVpFKHYpOwotCQlkb190d29zX2NvbXAgPSAwOwotCX0KKyAgICBpZiAoUHlfU0laRSh2KSA8IDApIHsKKyAgICAgICAgbmRpZ2l0cyA9IC0oUHlfU0laRSh2KSk7CisgICAgICAgIGlmICghaXNfc2lnbmVkKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBsb25nIHRvIHVuc2lnbmVkIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZG9fdHdvc19jb21wID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5kaWdpdHMgPSBQeV9TSVpFKHYpOworICAgICAgICBkb190d29zX2NvbXAgPSAwOworICAgIH0KIAotCWlmIChsaXR0bGVfZW5kaWFuKSB7Ci0JCXAgPSBieXRlczsKLQkJcGluY3IgPSAxOwotCX0KLQllbHNlIHsKLQkJcCA9IGJ5dGVzICsgbiAtIDE7Ci0JCXBpbmNyID0gLTE7Ci0JfQorICAgIGlmIChsaXR0bGVfZW5kaWFuKSB7CisgICAgICAgIHAgPSBieXRlczsKKyAgICAgICAgcGluY3IgPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcCA9IGJ5dGVzICsgbiAtIDE7CisgICAgICAgIHBpbmNyID0gLTE7CisgICAgfQogCi0JLyogQ29weSBvdmVyIGFsbCB0aGUgUHl0aG9uIGRpZ2l0cy4KLQkgICBJdCdzIGNydWNpYWwgdGhhdCBldmVyeSBQeXRob24gZGlnaXQgZXhjZXB0IGZvciB0aGUgTVNEIGNvbnRyaWJ1dGUKLQkgICBleGFjdGx5IFB5TG9uZ19TSElGVCBiaXRzIHRvIHRoZSB0b3RhbCwgc28gZmlyc3QgYXNzZXJ0IHRoYXQgdGhlIGxvbmcgaXMKLQkgICBub3JtYWxpemVkLiAqLwotCWFzc2VydChuZGlnaXRzID09IDAgfHwgdi0+b2JfZGlnaXRbbmRpZ2l0cyAtIDFdICE9IDApOwotCWogPSAwOwotCWFjY3VtID0gMDsKLQlhY2N1bWJpdHMgPSAwOwotCWNhcnJ5ID0gZG9fdHdvc19jb21wID8gMSA6IDA7Ci0JZm9yIChpID0gMDsgaSA8IG5kaWdpdHM7ICsraSkgewotCQlkaWdpdCB0aGlzZGlnaXQgPSB2LT5vYl9kaWdpdFtpXTsKLQkJaWYgKGRvX3R3b3NfY29tcCkgewotCQkJdGhpc2RpZ2l0ID0gKHRoaXNkaWdpdCBeIFB5TG9uZ19NQVNLKSArIGNhcnJ5OwotCQkJY2FycnkgPSB0aGlzZGlnaXQgPj4gUHlMb25nX1NISUZUOwotCQkJdGhpc2RpZ2l0ICY9IFB5TG9uZ19NQVNLOwotCQl9Ci0JCS8qIEJlY2F1c2Ugd2UncmUgZ29pbmcgTFNCIHRvIE1TQiwgdGhpc2RpZ2l0IGlzIG1vcmUKLQkJICAgc2lnbmlmaWNhbnQgdGhhbiB3aGF0J3MgYWxyZWFkeSBpbiBhY2N1bSwgc28gbmVlZHMgdG8gYmUKLQkJICAgcHJlcGVuZGVkIHRvIGFjY3VtLiAqLwotCQlhY2N1bSB8PSAodHdvZGlnaXRzKXRoaXNkaWdpdCA8PCBhY2N1bWJpdHM7CisgICAgLyogQ29weSBvdmVyIGFsbCB0aGUgUHl0aG9uIGRpZ2l0cy4KKyAgICAgICBJdCdzIGNydWNpYWwgdGhhdCBldmVyeSBQeXRob24gZGlnaXQgZXhjZXB0IGZvciB0aGUgTVNEIGNvbnRyaWJ1dGUKKyAgICAgICBleGFjdGx5IFB5TG9uZ19TSElGVCBiaXRzIHRvIHRoZSB0b3RhbCwgc28gZmlyc3QgYXNzZXJ0IHRoYXQgdGhlIGxvbmcgaXMKKyAgICAgICBub3JtYWxpemVkLiAqLworICAgIGFzc2VydChuZGlnaXRzID09IDAgfHwgdi0+b2JfZGlnaXRbbmRpZ2l0cyAtIDFdICE9IDApOworICAgIGogPSAwOworICAgIGFjY3VtID0gMDsKKyAgICBhY2N1bWJpdHMgPSAwOworICAgIGNhcnJ5ID0gZG9fdHdvc19jb21wID8gMSA6IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG5kaWdpdHM7ICsraSkgeworICAgICAgICBkaWdpdCB0aGlzZGlnaXQgPSB2LT5vYl9kaWdpdFtpXTsKKyAgICAgICAgaWYgKGRvX3R3b3NfY29tcCkgeworICAgICAgICAgICAgdGhpc2RpZ2l0ID0gKHRoaXNkaWdpdCBeIFB5TG9uZ19NQVNLKSArIGNhcnJ5OworICAgICAgICAgICAgY2FycnkgPSB0aGlzZGlnaXQgPj4gUHlMb25nX1NISUZUOworICAgICAgICAgICAgdGhpc2RpZ2l0ICY9IFB5TG9uZ19NQVNLOworICAgICAgICB9CisgICAgICAgIC8qIEJlY2F1c2Ugd2UncmUgZ29pbmcgTFNCIHRvIE1TQiwgdGhpc2RpZ2l0IGlzIG1vcmUKKyAgICAgICAgICAgc2lnbmlmaWNhbnQgdGhhbiB3aGF0J3MgYWxyZWFkeSBpbiBhY2N1bSwgc28gbmVlZHMgdG8gYmUKKyAgICAgICAgICAgcHJlcGVuZGVkIHRvIGFjY3VtLiAqLworICAgICAgICBhY2N1bSB8PSAodHdvZGlnaXRzKXRoaXNkaWdpdCA8PCBhY2N1bWJpdHM7CiAKLQkJLyogVGhlIG1vc3Qtc2lnbmlmaWNhbnQgZGlnaXQgbWF5IGJlIChwcm9iYWJseSBpcykgYXQgbGVhc3QKLQkJICAgcGFydGx5IGVtcHR5LiAqLwotCQlpZiAoaSA9PSBuZGlnaXRzIC0gMSkgewotCQkJLyogQ291bnQgIyBvZiBzaWduIGJpdHMgLS0gdGhleSBuZWVkbid0IGJlIHN0b3JlZCwKLQkJCSAqIGFsdGhvdWdoIGZvciBzaWduZWQgY29udmVyc2lvbiB3ZSBuZWVkIGxhdGVyIHRvCi0JCQkgKiBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIHNpZ24gYml0IGdldHMgc3RvcmVkLiAqLwotCQkJZGlnaXQgcyA9IGRvX3R3b3NfY29tcCA/IHRoaXNkaWdpdCBeIFB5TG9uZ19NQVNLIDoKLQkJCQkgICAgICAgICAgICAgICAgdGhpc2RpZ2l0OwotCQkJd2hpbGUgKHMgIT0gMCkgewotCQkJCXMgPj49IDE7Ci0JCQkJYWNjdW1iaXRzKys7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJYWNjdW1iaXRzICs9IFB5TG9uZ19TSElGVDsKKyAgICAgICAgLyogVGhlIG1vc3Qtc2lnbmlmaWNhbnQgZGlnaXQgbWF5IGJlIChwcm9iYWJseSBpcykgYXQgbGVhc3QKKyAgICAgICAgICAgcGFydGx5IGVtcHR5LiAqLworICAgICAgICBpZiAoaSA9PSBuZGlnaXRzIC0gMSkgeworICAgICAgICAgICAgLyogQ291bnQgIyBvZiBzaWduIGJpdHMgLS0gdGhleSBuZWVkbid0IGJlIHN0b3JlZCwKKyAgICAgICAgICAgICAqIGFsdGhvdWdoIGZvciBzaWduZWQgY29udmVyc2lvbiB3ZSBuZWVkIGxhdGVyIHRvCisgICAgICAgICAgICAgKiBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIHNpZ24gYml0IGdldHMgc3RvcmVkLiAqLworICAgICAgICAgICAgZGlnaXQgcyA9IGRvX3R3b3NfY29tcCA/IHRoaXNkaWdpdCBeIFB5TG9uZ19NQVNLIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNkaWdpdDsKKyAgICAgICAgICAgIHdoaWxlIChzICE9IDApIHsKKyAgICAgICAgICAgICAgICBzID4+PSAxOworICAgICAgICAgICAgICAgIGFjY3VtYml0cysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFjY3VtYml0cyArPSBQeUxvbmdfU0hJRlQ7CiAKLQkJLyogU3RvcmUgYXMgbWFueSBieXRlcyBhcyBwb3NzaWJsZS4gKi8KLQkJd2hpbGUgKGFjY3VtYml0cyA+PSA4KSB7Ci0JCQlpZiAoaiA+PSBuKQotCQkJCWdvdG8gT3ZlcmZsb3c7Ci0JCQkrK2o7Ci0JCQkqcCA9ICh1bnNpZ25lZCBjaGFyKShhY2N1bSAmIDB4ZmYpOwotCQkJcCArPSBwaW5jcjsKLQkJCWFjY3VtYml0cyAtPSA4OwotCQkJYWNjdW0gPj49IDg7Ci0JCX0KLQl9CisgICAgICAgIC8qIFN0b3JlIGFzIG1hbnkgYnl0ZXMgYXMgcG9zc2libGUuICovCisgICAgICAgIHdoaWxlIChhY2N1bWJpdHMgPj0gOCkgeworICAgICAgICAgICAgaWYgKGogPj0gbikKKyAgICAgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgICAgICAgICAgKytqOworICAgICAgICAgICAgKnAgPSAodW5zaWduZWQgY2hhcikoYWNjdW0gJiAweGZmKTsKKyAgICAgICAgICAgIHAgKz0gcGluY3I7CisgICAgICAgICAgICBhY2N1bWJpdHMgLT0gODsKKyAgICAgICAgICAgIGFjY3VtID4+PSA4OworICAgICAgICB9CisgICAgfQogCi0JLyogU3RvcmUgdGhlIHN0cmFnZ2xlciAoaWYgYW55KS4gKi8KLQlhc3NlcnQoYWNjdW1iaXRzIDwgOCk7Ci0JYXNzZXJ0KGNhcnJ5ID09IDApOyAgLyogZWxzZSBkb190d29zX2NvbXAgYW5kICpldmVyeSogZGlnaXQgd2FzIDAgKi8KLQlpZiAoYWNjdW1iaXRzID4gMCkgewotCQlpZiAoaiA+PSBuKQotCQkJZ290byBPdmVyZmxvdzsKLQkJKytqOwotCQlpZiAoZG9fdHdvc19jb21wKSB7Ci0JCQkvKiBGaWxsIGxlYWRpbmcgYml0cyBvZiB0aGUgYnl0ZSB3aXRoIHNpZ24gYml0cwotCQkJICAgKGFwcHJvcHJpYXRlbHkgcHJldGVuZGluZyB0aGF0IHRoZSBsb25nIGhhZCBhbgotCQkJICAgaW5maW5pdGUgc3VwcGx5IG9mIHNpZ24gYml0cykuICovCi0JCQlhY2N1bSB8PSAofih0d29kaWdpdHMpMCkgPDwgYWNjdW1iaXRzOwotCQl9Ci0JCSpwID0gKHVuc2lnbmVkIGNoYXIpKGFjY3VtICYgMHhmZik7Ci0JCXAgKz0gcGluY3I7Ci0JfQotCWVsc2UgaWYgKGogPT0gbiAmJiBuID4gMCAmJiBpc19zaWduZWQpIHsKLQkJLyogVGhlIG1haW4gbG9vcCBmaWxsZWQgdGhlIGJ5dGUgYXJyYXkgZXhhY3RseSwgc28gdGhlIGNvZGUKLQkJICAganVzdCBhYm92ZSBkaWRuJ3QgZ2V0IHRvIGVuc3VyZSB0aGVyZSdzIGEgc2lnbiBiaXQsIGFuZCB0aGUKLQkJICAgbG9vcCBiZWxvdyB3b3VsZG4ndCBhZGQgb25lIGVpdGhlci4gIE1ha2Ugc3VyZSBhIHNpZ24gYml0Ci0JCSAgIGV4aXN0cy4gKi8KLQkJdW5zaWduZWQgY2hhciBtc2IgPSAqKHAgLSBwaW5jcik7Ci0JCWludCBzaWduX2JpdF9zZXQgPSBtc2IgPj0gMHg4MDsKLQkJYXNzZXJ0KGFjY3VtYml0cyA9PSAwKTsKLQkJaWYgKHNpZ25fYml0X3NldCA9PSBkb190d29zX2NvbXApCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJZ290byBPdmVyZmxvdzsKLQl9CisgICAgLyogU3RvcmUgdGhlIHN0cmFnZ2xlciAoaWYgYW55KS4gKi8KKyAgICBhc3NlcnQoYWNjdW1iaXRzIDwgOCk7CisgICAgYXNzZXJ0KGNhcnJ5ID09IDApOyAgLyogZWxzZSBkb190d29zX2NvbXAgYW5kICpldmVyeSogZGlnaXQgd2FzIDAgKi8KKyAgICBpZiAoYWNjdW1iaXRzID4gMCkgeworICAgICAgICBpZiAoaiA+PSBuKQorICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICAgICAgKytqOworICAgICAgICBpZiAoZG9fdHdvc19jb21wKSB7CisgICAgICAgICAgICAvKiBGaWxsIGxlYWRpbmcgYml0cyBvZiB0aGUgYnl0ZSB3aXRoIHNpZ24gYml0cworICAgICAgICAgICAgICAgKGFwcHJvcHJpYXRlbHkgcHJldGVuZGluZyB0aGF0IHRoZSBsb25nIGhhZCBhbgorICAgICAgICAgICAgICAgaW5maW5pdGUgc3VwcGx5IG9mIHNpZ24gYml0cykuICovCisgICAgICAgICAgICBhY2N1bSB8PSAofih0d29kaWdpdHMpMCkgPDwgYWNjdW1iaXRzOworICAgICAgICB9CisgICAgICAgICpwID0gKHVuc2lnbmVkIGNoYXIpKGFjY3VtICYgMHhmZik7CisgICAgICAgIHAgKz0gcGluY3I7CisgICAgfQorICAgIGVsc2UgaWYgKGogPT0gbiAmJiBuID4gMCAmJiBpc19zaWduZWQpIHsKKyAgICAgICAgLyogVGhlIG1haW4gbG9vcCBmaWxsZWQgdGhlIGJ5dGUgYXJyYXkgZXhhY3RseSwgc28gdGhlIGNvZGUKKyAgICAgICAgICAganVzdCBhYm92ZSBkaWRuJ3QgZ2V0IHRvIGVuc3VyZSB0aGVyZSdzIGEgc2lnbiBiaXQsIGFuZCB0aGUKKyAgICAgICAgICAgbG9vcCBiZWxvdyB3b3VsZG4ndCBhZGQgb25lIGVpdGhlci4gIE1ha2Ugc3VyZSBhIHNpZ24gYml0CisgICAgICAgICAgIGV4aXN0cy4gKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBtc2IgPSAqKHAgLSBwaW5jcik7CisgICAgICAgIGludCBzaWduX2JpdF9zZXQgPSBtc2IgPj0gMHg4MDsKKyAgICAgICAgYXNzZXJ0KGFjY3VtYml0cyA9PSAwKTsKKyAgICAgICAgaWYgKHNpZ25fYml0X3NldCA9PSBkb190d29zX2NvbXApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICB9CiAKLQkvKiBGaWxsIHJlbWFpbmluZyBieXRlcyB3aXRoIGNvcGllcyBvZiB0aGUgc2lnbiBiaXQuICovCi0JewotCQl1bnNpZ25lZCBjaGFyIHNpZ25ieXRlID0gZG9fdHdvc19jb21wID8gMHhmZlUgOiAwVTsKLQkJZm9yICggOyBqIDwgbjsgKytqLCBwICs9IHBpbmNyKQotCQkJKnAgPSBzaWduYnl0ZTsKLQl9CisgICAgLyogRmlsbCByZW1haW5pbmcgYnl0ZXMgd2l0aCBjb3BpZXMgb2YgdGhlIHNpZ24gYml0LiAqLworICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzaWduYnl0ZSA9IGRvX3R3b3NfY29tcCA/IDB4ZmZVIDogMFU7CisgICAgICAgIGZvciAoIDsgaiA8IG47ICsraiwgcCArPSBwaW5jcikKKyAgICAgICAgICAgICpwID0gc2lnbmJ5dGU7CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKIE92ZXJmbG93OgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibG9uZyB0b28gYmlnIHRvIGNvbnZlcnQiKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsb25nIHRvbyBiaWcgdG8gY29udmVydCIpOworICAgIHJldHVybiAtMTsKIAogfQogCkBAIC03NTMsOSArNzUzLDkgQEAKIFB5TG9uZ19Gcm9tVm9pZFB0cih2b2lkICpwKQogewogI2lmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcKLQlpZiAoKGxvbmcpcCA8IDApCi0JCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZylwKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcCk7CisgICAgaWYgKChsb25nKXAgPCAwKQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpcCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXApOwogI2Vsc2UKIAogI2lmbmRlZiBIQVZFX0xPTkdfTE9ORwpAQCAtNzY0LDEwICs3NjQsMTAgQEAKICNpZiBTSVpFT0ZfTE9OR19MT05HIDwgU0laRU9GX1ZPSURfUAogIyAgIGVycm9yICJQeUxvbmdfRnJvbVZvaWRQdHI6IHNpemVvZihQWV9MT05HX0xPTkcpIDwgc2l6ZW9mKHZvaWQqKSIKICNlbmRpZgotCS8qIG9wdGltaXplIG51bGwgcG9pbnRlcnMgKi8KLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygodW5zaWduZWQgUFlfTE9OR19MT05HKXApOworICAgIC8qIG9wdGltaXplIG51bGwgcG9pbnRlcnMgKi8KKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygodW5zaWduZWQgUFlfTE9OR19MT05HKXApOwogCiAjZW5kaWYgLyogU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORyAqLwogfQpAQCAtNzc3LDE5ICs3NzcsMTkgQEAKIHZvaWQgKgogUHlMb25nX0FzVm9pZFB0cihQeU9iamVjdCAqdnYpCiB7Ci0JLyogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG93IGludCBvciBsb25nIG9iamVjdHMuIElmIHZ2IGlzIG5laXRoZXIsCi0JICAgdGhlbiB0aGUgUHlMb25nX0FzTG9uZyooKSBmdW5jdGlvbnMgd2lsbCByYWlzZSB0aGUgZXhjZXB0aW9uOgotCSAgIFB5RXhjX1N5c3RlbUVycm9yLCAiYmFkIGFyZ3VtZW50IHRvIGludGVybmFsIGZ1bmN0aW9uIgotCSovCisgICAgLyogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG93IGludCBvciBsb25nIG9iamVjdHMuIElmIHZ2IGlzIG5laXRoZXIsCisgICAgICAgdGhlbiB0aGUgUHlMb25nX0FzTG9uZyooKSBmdW5jdGlvbnMgd2lsbCByYWlzZSB0aGUgZXhjZXB0aW9uOgorICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLCAiYmFkIGFyZ3VtZW50IHRvIGludGVybmFsIGZ1bmN0aW9uIgorICAgICovCiAjaWYgU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORwotCWxvbmcgeDsKKyAgICBsb25nIHg7CiAKLQlpZiAoUHlJbnRfQ2hlY2sodnYpKQotCQl4ID0gUHlJbnRfQVNfTE9ORyh2dik7Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKHZ2KSAmJiBfUHlMb25nX1NpZ24odnYpIDwgMCkKLQkJeCA9IFB5TG9uZ19Bc0xvbmcodnYpOwotCWVsc2UKLQkJeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2dik7CisgICAgaWYgKFB5SW50X0NoZWNrKHZ2KSkKKyAgICAgICAgeCA9IFB5SW50X0FTX0xPTkcodnYpOworICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayh2dikgJiYgX1B5TG9uZ19TaWduKHZ2KSA8IDApCisgICAgICAgIHggPSBQeUxvbmdfQXNMb25nKHZ2KTsKKyAgICBlbHNlCisgICAgICAgIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodnYpOwogI2Vsc2UKIAogI2lmbmRlZiBIQVZFX0xPTkdfTE9ORwpAQCAtNzk4LDIwICs3OTgsMjAgQEAKICNpZiBTSVpFT0ZfTE9OR19MT05HIDwgU0laRU9GX1ZPSURfUAogIyAgIGVycm9yICJQeUxvbmdfQXNWb2lkUHRyOiBzaXplb2YoUFlfTE9OR19MT05HKSA8IHNpemVvZih2b2lkKikiCiAjZW5kaWYKLQlQWV9MT05HX0xPTkcgeDsKKyAgICBQWV9MT05HX0xPTkcgeDsKIAotCWlmIChQeUludF9DaGVjayh2dikpCi0JCXggPSBQeUludF9BU19MT05HKHZ2KTsKLQllbHNlIGlmIChQeUxvbmdfQ2hlY2sodnYpICYmIF9QeUxvbmdfU2lnbih2dikgPCAwKQotCQl4ID0gUHlMb25nX0FzTG9uZ0xvbmcodnYpOwotCWVsc2UKLQkJeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodnYpOworICAgIGlmIChQeUludF9DaGVjayh2dikpCisgICAgICAgIHggPSBQeUludF9BU19MT05HKHZ2KTsKKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2sodnYpICYmIF9QeUxvbmdfU2lnbih2dikgPCAwKQorICAgICAgICB4ID0gUHlMb25nX0FzTG9uZ0xvbmcodnYpOworICAgIGVsc2UKKyAgICAgICAgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodnYpOwogCiAjZW5kaWYgLyogU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORyAqLwogCi0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICh2b2lkICopeDsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKHZvaWQgKil4OwogfQogCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKQEAgLTgyMSw0OSArODIxLDQ5IEBACiAgKi8KIAogI2RlZmluZSBJU19MSVRUTEVfRU5ESUFOIChpbnQpKih1bnNpZ25lZCBjaGFyKikmb25lCi0jZGVmaW5lIFBZX0FCU19MTE9OR19NSU4JKDAtKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylQWV9MTE9OR19NSU4pCisjZGVmaW5lIFBZX0FCU19MTE9OR19NSU4gICAgICAgICgwLSh1bnNpZ25lZCBQWV9MT05HX0xPTkcpUFlfTExPTkdfTUlOKQogCiAvKiBDcmVhdGUgYSBuZXcgbG9uZyBpbnQgb2JqZWN0IGZyb20gYSBDIFBZX0xPTkdfTE9ORyBpbnQuICovCiAKIFB5T2JqZWN0ICoKIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTE9OR19MT05HIGl2YWwpCiB7Ci0JUHlMb25nT2JqZWN0ICp2OwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyBhYnNfaXZhbDsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdDsgIC8qIHVuc2lnbmVkIHNvID4+IGRvZXNuJ3QgcHJvcGFnYXRlIHNpZ24gYml0ICovCi0JaW50IG5kaWdpdHMgPSAwOwotCWludCBuZWdhdGl2ZSA9IDA7CisgICAgUHlMb25nT2JqZWN0ICp2OworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBhYnNfaXZhbDsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdDsgIC8qIHVuc2lnbmVkIHNvID4+IGRvZXNuJ3QgcHJvcGFnYXRlIHNpZ24gYml0ICovCisgICAgaW50IG5kaWdpdHMgPSAwOworICAgIGludCBuZWdhdGl2ZSA9IDA7CiAKLQlpZiAoaXZhbCA8IDApIHsKLQkJLyogYXZvaWQgc2lnbmVkIG92ZXJmbG93IG9uIG5lZ2F0aW9uOyAgc2VlIGNvbW1lbnRzCi0JCSAgIGluIFB5TG9uZ19Gcm9tTG9uZyBhYm92ZS4gKi8KLQkJYWJzX2l2YWwgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKSgtMS1pdmFsKSArIDE7Ci0JCW5lZ2F0aXZlID0gMTsKLQl9Ci0JZWxzZSB7Ci0JCWFic19pdmFsID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylpdmFsOwotCX0KKyAgICBpZiAoaXZhbCA8IDApIHsKKyAgICAgICAgLyogYXZvaWQgc2lnbmVkIG92ZXJmbG93IG9uIG5lZ2F0aW9uOyAgc2VlIGNvbW1lbnRzCisgICAgICAgICAgIGluIFB5TG9uZ19Gcm9tTG9uZyBhYm92ZS4gKi8KKyAgICAgICAgYWJzX2l2YWwgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKSgtMS1pdmFsKSArIDE7CisgICAgICAgIG5lZ2F0aXZlID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFic19pdmFsID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylpdmFsOworICAgIH0KIAotCS8qIENvdW50IHRoZSBudW1iZXIgb2YgUHl0aG9uIGRpZ2l0cy4KLQkgICBXZSB1c2VkIHRvIHBpY2sgNSAoImJpZyBlbm91Z2ggZm9yIGFueXRoaW5nIiksIGJ1dCB0aGF0J3MgYQotCSAgIHdhc3RlIG9mIHRpbWUgYW5kIHNwYWNlIGdpdmVuIHRoYXQgNSoxNSA9IDc1IGJpdHMgYXJlIHJhcmVseQotCSAgIG5lZWRlZC4gKi8KLQl0ID0gYWJzX2l2YWw7Ci0Jd2hpbGUgKHQpIHsKLQkJKytuZGlnaXRzOwotCQl0ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JfQotCXYgPSBfUHlMb25nX05ldyhuZGlnaXRzKTsKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCWRpZ2l0ICpwID0gdi0+b2JfZGlnaXQ7Ci0JCVB5X1NJWkUodikgPSBuZWdhdGl2ZSA/IC1uZGlnaXRzIDogbmRpZ2l0czsKLQkJdCA9IGFic19pdmFsOwotCQl3aGlsZSAodCkgewotCQkJKnArKyA9IChkaWdpdCkodCAmIFB5TG9uZ19NQVNLKTsKLQkJCXQgPj49IFB5TG9uZ19TSElGVDsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopdjsKKyAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIFB5dGhvbiBkaWdpdHMuCisgICAgICAgV2UgdXNlZCB0byBwaWNrIDUgKCJiaWcgZW5vdWdoIGZvciBhbnl0aGluZyIpLCBidXQgdGhhdCdzIGEKKyAgICAgICB3YXN0ZSBvZiB0aW1lIGFuZCBzcGFjZSBnaXZlbiB0aGF0IDUqMTUgPSA3NSBiaXRzIGFyZSByYXJlbHkKKyAgICAgICBuZWVkZWQuICovCisgICAgdCA9IGFic19pdmFsOworICAgIHdoaWxlICh0KSB7CisgICAgICAgICsrbmRpZ2l0czsKKyAgICAgICAgdCA+Pj0gUHlMb25nX1NISUZUOworICAgIH0KKyAgICB2ID0gX1B5TG9uZ19OZXcobmRpZ2l0cyk7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBkaWdpdCAqcCA9IHYtPm9iX2RpZ2l0OworICAgICAgICBQeV9TSVpFKHYpID0gbmVnYXRpdmUgPyAtbmRpZ2l0cyA6IG5kaWdpdHM7CisgICAgICAgIHQgPSBhYnNfaXZhbDsKKyAgICAgICAgd2hpbGUgKHQpIHsKKyAgICAgICAgICAgICpwKysgPSAoZGlnaXQpKHQgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICB0ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXY7CiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBsb25nIGludCBvYmplY3QgZnJvbSBhIEMgdW5zaWduZWQgUFlfTE9OR19MT05HIGludC4gKi8KQEAgLTg3MSwyNiArODcxLDI2IEBACiBQeU9iamVjdCAqCiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodW5zaWduZWQgUFlfTE9OR19MT05HIGl2YWwpCiB7Ci0JUHlMb25nT2JqZWN0ICp2OwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB0OwotCWludCBuZGlnaXRzID0gMDsKKyAgICBQeUxvbmdPYmplY3QgKnY7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHQ7CisgICAgaW50IG5kaWdpdHMgPSAwOwogCi0JLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLiAqLwotCXQgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKWl2YWw7Ci0Jd2hpbGUgKHQpIHsKLQkJKytuZGlnaXRzOwotCQl0ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JfQotCXYgPSBfUHlMb25nX05ldyhuZGlnaXRzKTsKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCWRpZ2l0ICpwID0gdi0+b2JfZGlnaXQ7Ci0JCVB5X1NJWkUodikgPSBuZGlnaXRzOwotCQl3aGlsZSAoaXZhbCkgewotCQkJKnArKyA9IChkaWdpdCkoaXZhbCAmIFB5TG9uZ19NQVNLKTsKLQkJCWl2YWwgPj49IFB5TG9uZ19TSElGVDsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopdjsKKyAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIFB5dGhvbiBkaWdpdHMuICovCisgICAgdCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpaXZhbDsKKyAgICB3aGlsZSAodCkgeworICAgICAgICArK25kaWdpdHM7CisgICAgICAgIHQgPj49IFB5TG9uZ19TSElGVDsKKyAgICB9CisgICAgdiA9IF9QeUxvbmdfTmV3KG5kaWdpdHMpOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgZGlnaXQgKnAgPSB2LT5vYl9kaWdpdDsKKyAgICAgICAgUHlfU0laRSh2KSA9IG5kaWdpdHM7CisgICAgICAgIHdoaWxlIChpdmFsKSB7CisgICAgICAgICAgICAqcCsrID0gKGRpZ2l0KShpdmFsICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgaXZhbCA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKil2OwogfQogCiAvKiBDcmVhdGUgYSBuZXcgbG9uZyBpbnQgb2JqZWN0IGZyb20gYSBDIFB5X3NzaXplX3QuICovCkBAIC04OTgsMTEgKzg5OCwxMSBAQAogUHlPYmplY3QgKgogUHlMb25nX0Zyb21Tc2l6ZV90KFB5X3NzaXplX3QgaXZhbCkKIHsKLQlQeV9zc2l6ZV90IGJ5dGVzID0gaXZhbDsKLQlpbnQgb25lID0gMTsKLQlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KAotCQkJKHVuc2lnbmVkIGNoYXIgKikmYnl0ZXMsCi0JCQlTSVpFT0ZfU0laRV9ULCBJU19MSVRUTEVfRU5ESUFOLCAxKTsKKyAgICBQeV9zc2l6ZV90IGJ5dGVzID0gaXZhbDsKKyAgICBpbnQgb25lID0gMTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSZieXRlcywKKyAgICAgICAgICAgICAgICAgICAgU0laRU9GX1NJWkVfVCwgSVNfTElUVExFX0VORElBTiwgMSk7CiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBsb25nIGludCBvYmplY3QgZnJvbSBhIEMgc2l6ZV90LiAqLwpAQCAtOTEwLDExICs5MTAsMTEgQEAKIFB5T2JqZWN0ICoKIFB5TG9uZ19Gcm9tU2l6ZV90KHNpemVfdCBpdmFsKQogewotCXNpemVfdCBieXRlcyA9IGl2YWw7Ci0JaW50IG9uZSA9IDE7Ci0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgKLQkJCSh1bnNpZ25lZCBjaGFyICopJmJ5dGVzLAotCQkJU0laRU9GX1NJWkVfVCwgSVNfTElUVExFX0VORElBTiwgMCk7CisgICAgc2l6ZV90IGJ5dGVzID0gaXZhbDsKKyAgICBpbnQgb25lID0gMTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSZieXRlcywKKyAgICAgICAgICAgICAgICAgICAgU0laRU9GX1NJWkVfVCwgSVNfTElUVExFX0VORElBTiwgMCk7CiB9CiAKIC8qIEdldCBhIEMgUFlfTE9OR19MT05HIGludCBmcm9tIGEgbG9uZyBpbnQgb2JqZWN0LgpAQCAtOTIzLDUxICs5MjMsNTEgQEAKIFBZX0xPTkdfTE9ORwogUHlMb25nX0FzTG9uZ0xvbmcoUHlPYmplY3QgKnZ2KQogewotCVBZX0xPTkdfTE9ORyBieXRlczsKLQlpbnQgb25lID0gMTsKLQlpbnQgcmVzOworICAgIFBZX0xPTkdfTE9ORyBieXRlczsKKyAgICBpbnQgb25lID0gMTsKKyAgICBpbnQgcmVzOwogCi0JaWYgKHZ2ID09IE5VTEwpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFQeUxvbmdfQ2hlY2sodnYpKSB7Ci0JCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JCVB5T2JqZWN0ICppbzsKLQkJaWYgKFB5SW50X0NoZWNrKHZ2KSkKLQkJCXJldHVybiAoUFlfTE9OR19MT05HKVB5SW50X0FzTG9uZyh2dik7Ci0JCWlmICgobmIgPSB2di0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8Ci0JCSAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaW8gPSAoKm5iLT5uYl9pbnQpICh2dik7Ci0JCWlmIChpbyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlJbnRfQ2hlY2soaW8pKSB7Ci0JCQlieXRlcyA9IFB5SW50X0FzTG9uZyhpbyk7Ci0JCQlQeV9ERUNSRUYoaW8pOwotCQkJcmV0dXJuIGJ5dGVzOwotCQl9Ci0JCWlmIChQeUxvbmdfQ2hlY2soaW8pKSB7Ci0JCQlieXRlcyA9IFB5TG9uZ19Bc0xvbmdMb25nKGlvKTsKLQkJCVB5X0RFQ1JFRihpbyk7Ci0JCQlyZXR1cm4gYnl0ZXM7Ci0JCX0KLQkJUHlfREVDUkVGKGlvKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImludGVnZXIgY29udmVyc2lvbiBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodnYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKKyAgICAgICAgUHlPYmplY3QgKmlvOworICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodnYpKQorICAgICAgICAgICAgcmV0dXJuIChQWV9MT05HX0xPTkcpUHlJbnRfQXNMb25nKHZ2KTsKKyAgICAgICAgaWYgKChuYiA9IHZ2LT5vYl90eXBlLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKKyAgICAgICAgICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpbyA9ICgqbmItPm5iX2ludCkgKHZ2KTsKKyAgICAgICAgaWYgKGlvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeUludF9DaGVjayhpbykpIHsKKyAgICAgICAgICAgIGJ5dGVzID0gUHlJbnRfQXNMb25nKGlvKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKKyAgICAgICAgICAgIGJ5dGVzID0gUHlMb25nX0FzTG9uZ0xvbmcoaW8pOworICAgICAgICAgICAgUHlfREVDUkVGKGlvKTsKKyAgICAgICAgICAgIHJldHVybiBieXRlczsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoaW8pOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaW50ZWdlciBjb252ZXJzaW9uIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgKLQkJCShQeUxvbmdPYmplY3QgKil2diwgKHVuc2lnbmVkIGNoYXIgKikmYnl0ZXMsCi0JCQlTSVpFT0ZfTE9OR19MT05HLCBJU19MSVRUTEVfRU5ESUFOLCAxKTsKKyAgICByZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAoUHlMb25nT2JqZWN0ICopdnYsICh1bnNpZ25lZCBjaGFyICopJmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICBTSVpFT0ZfTE9OR19MT05HLCBJU19MSVRUTEVfRU5ESUFOLCAxKTsKIAotCS8qIFBsYW4gOSBjYW4ndCBoYW5kbGUgUFlfTE9OR19MT05HIGluID8gOiBleHByZXNzaW9ucyAqLwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gKFBZX0xPTkdfTE9ORyktMTsKLQllbHNlCi0JCXJldHVybiBieXRlczsKKyAgICAvKiBQbGFuIDkgY2FuJ3QgaGFuZGxlIFBZX0xPTkdfTE9ORyBpbiA/IDogZXhwcmVzc2lvbnMgKi8KKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIChQWV9MT05HX0xPTkcpLTE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYnl0ZXM7CiB9CiAKIC8qIEdldCBhIEMgdW5zaWduZWQgUFlfTE9OR19MT05HIGludCBmcm9tIGEgbG9uZyBpbnQgb2JqZWN0LgpAQCAtOTc2LDI0ICs5NzYsMjQgQEAKIHVuc2lnbmVkIFBZX0xPTkdfTE9ORwogUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyhQeU9iamVjdCAqdnYpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIGJ5dGVzOwotCWludCBvbmUgPSAxOwotCWludCByZXM7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIGJ5dGVzOworICAgIGludCBvbmUgPSAxOworICAgIGludCByZXM7CiAKLQlpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7Ci0JfQorICAgIGlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKKyAgICB9CiAKLQlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KAotCQkJKFB5TG9uZ09iamVjdCAqKXZ2LCAodW5zaWduZWQgY2hhciAqKSZieXRlcywKLQkJCVNJWkVPRl9MT05HX0xPTkcsIElTX0xJVFRMRV9FTkRJQU4sIDApOworICAgIHJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgIChQeUxvbmdPYmplY3QgKil2diwgKHVuc2lnbmVkIGNoYXIgKikmYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIFNJWkVPRl9MT05HX0xPTkcsIElTX0xJVFRMRV9FTkRJQU4sIDApOwogCi0JLyogUGxhbiA5IGNhbid0IGhhbmRsZSBQWV9MT05HX0xPTkcgaW4gPyA6IGV4cHJlc3Npb25zICovCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKXJlczsKLQllbHNlCi0JCXJldHVybiBieXRlczsKKyAgICAvKiBQbGFuIDkgY2FuJ3QgaGFuZGxlIFBZX0xPTkdfTE9ORyBpbiA/IDogZXhwcmVzc2lvbnMgKi8KKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpcmVzOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGJ5dGVzOwogfQogCiAvKiBHZXQgYSBDIHVuc2lnbmVkIGxvbmcgaW50IGZyb20gYSBsb25nIGludCBvYmplY3QsIGlnbm9yaW5nIHRoZSBoaWdoIGJpdHMuCkBAIC0xMDAyLDI3ICsxMDAyLDI3IEBACiB1bnNpZ25lZCBQWV9MT05HX0xPTkcKIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKFB5T2JqZWN0ICp2dikKIHsKLQlyZWdpc3RlciBQeUxvbmdPYmplY3QgKnY7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHg7Ci0JUHlfc3NpemVfdCBpOwotCWludCBzaWduOworICAgIHJlZ2lzdGVyIFB5TG9uZ09iamVjdCAqdjsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IHNpZ247CiAKLQlpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKLQl9Ci0JdiA9IChQeUxvbmdPYmplY3QgKil2djsKLQlpID0gdi0+b2Jfc2l6ZTsKLQlzaWduID0gMTsKLQl4ID0gMDsKLQlpZiAoaSA8IDApIHsKLQkJc2lnbiA9IC0xOwotCQlpID0gLWk7Ci0JfQotCXdoaWxlICgtLWkgPj0gMCkgewotCQl4ID0gKHggPDwgUHlMb25nX1NISUZUKSB8IHYtPm9iX2RpZ2l0W2ldOwotCX0KLQlyZXR1cm4geCAqIHNpZ247CisgICAgaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZykgLTE7CisgICAgfQorICAgIHYgPSAoUHlMb25nT2JqZWN0ICopdnY7CisgICAgaSA9IHYtPm9iX3NpemU7CisgICAgc2lnbiA9IDE7CisgICAgeCA9IDA7CisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgaSA9IC1pOworICAgIH0KKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgeCA9ICh4IDw8IFB5TG9uZ19TSElGVCkgfCB2LT5vYl9kaWdpdFtpXTsKKyAgICB9CisgICAgcmV0dXJuIHggKiBzaWduOwogfQogCiAvKiBHZXQgYSBDIGxvbmcgbG9uZyBpbnQgZnJvbSBhIFB5dGhvbiBsb25nIG9yIFB5dGhvbiBpbnQgb2JqZWN0LgpAQCAtMTAzNiw5NSArMTAzNiw5NSBAQAogUFlfTE9OR19MT05HCiBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93KFB5T2JqZWN0ICp2diwgaW50ICpvdmVyZmxvdykKIHsKLQkvKiBUaGlzIHZlcnNpb24gYnkgVGltIFBldGVycyAqLwotCXJlZ2lzdGVyIFB5TG9uZ09iamVjdCAqdjsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeCwgcHJldjsKLQlQWV9MT05HX0xPTkcgcmVzOwotCVB5X3NzaXplX3QgaTsKLQlpbnQgc2lnbjsKLQlpbnQgZG9fZGVjcmVmID0gMDsgLyogaWYgbmJfaW50IHdhcyBjYWxsZWQgKi8KKyAgICAvKiBUaGlzIHZlcnNpb24gYnkgVGltIFBldGVycyAqLworICAgIHJlZ2lzdGVyIFB5TG9uZ09iamVjdCAqdjsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeCwgcHJldjsKKyAgICBQWV9MT05HX0xPTkcgcmVzOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgc2lnbjsKKyAgICBpbnQgZG9fZGVjcmVmID0gMDsgLyogaWYgbmJfaW50IHdhcyBjYWxsZWQgKi8KIAotCSpvdmVyZmxvdyA9IDA7Ci0JaWYgKHZ2ID09IE5VTEwpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgKm92ZXJmbG93ID0gMDsKKyAgICBpZiAodnYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChQeUludF9DaGVjayh2dikpCi0JCXJldHVybiBQeUludF9Bc0xvbmcodnYpOworICAgIGlmIChQeUludF9DaGVjayh2dikpCisgICAgICAgIHJldHVybiBQeUludF9Bc0xvbmcodnYpOwogCi0JaWYgKCFQeUxvbmdfQ2hlY2sodnYpKSB7Ci0JCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JCW5iID0gdnYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQkJaWYgKG5iID09IE5VTEwgfHwgbmItPm5iX2ludCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXZ2ID0gKCpuYi0+bmJfaW50KSAodnYpOwotCQlpZiAodnYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJZG9fZGVjcmVmID0gMTsKLQkJaWYoUHlJbnRfQ2hlY2sodnYpKSB7Ci0JCQlyZXMgPSBQeUludF9Bc0xvbmcodnYpOwotCQkJZ290byBleGl0OwotCQl9Ci0JCWlmICghUHlMb25nX0NoZWNrKHZ2KSkgewotCQkJUHlfREVDUkVGKHZ2KTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJuYl9pbnQgc2hvdWxkIHJldHVybiBpbnQgb2JqZWN0Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKCFQeUxvbmdfQ2hlY2sodnYpKSB7CisgICAgICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7CisgICAgICAgIG5iID0gdnYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICAgICAgaWYgKG5iID09IE5VTEwgfHwgbmItPm5iX2ludCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdnYgPSAoKm5iLT5uYl9pbnQpICh2dik7CisgICAgICAgIGlmICh2diA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBkb19kZWNyZWYgPSAxOworICAgICAgICBpZihQeUludF9DaGVjayh2dikpIHsKKyAgICAgICAgICAgIHJlcyA9IFB5SW50X0FzTG9uZyh2dik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeUxvbmdfQ2hlY2sodnYpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodnYpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmJfaW50IHNob3VsZCByZXR1cm4gaW50IG9iamVjdCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JcmVzID0gLTE7Ci0JdiA9IChQeUxvbmdPYmplY3QgKil2djsKLQlpID0gUHlfU0laRSh2KTsKKyAgICByZXMgPSAtMTsKKyAgICB2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OworICAgIGkgPSBQeV9TSVpFKHYpOwogCi0Jc3dpdGNoIChpKSB7Ci0JY2FzZSAtMToKLQkJcmVzID0gLShzZGlnaXQpdi0+b2JfZGlnaXRbMF07Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQkJcmVzID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlyZXMgPSB2LT5vYl9kaWdpdFswXTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2lnbiA9IDE7Ci0JCXggPSAwOwotCQlpZiAoaSA8IDApIHsKLQkJCXNpZ24gPSAtMTsKLQkJCWkgPSAtKGkpOwotCQl9Ci0JCXdoaWxlICgtLWkgPj0gMCkgewotCQkJcHJldiA9IHg7Ci0JCQl4ID0gKHggPDwgUHlMb25nX1NISUZUKSArIHYtPm9iX2RpZ2l0W2ldOwotCQkJaWYgKCh4ID4+IFB5TG9uZ19TSElGVCkgIT0gcHJldikgewotCQkJCSpvdmVyZmxvdyA9IHNpZ247Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQl9Ci0JCS8qIEhhdmVuJ3QgbG9zdCBhbnkgYml0cywgYnV0IGNhc3RpbmcgdG8gbG9uZyByZXF1aXJlcyBleHRyYQotCQkgKiBjYXJlIChzZWUgY29tbWVudCBhYm92ZSkuCi0JCSAqLwotCQlpZiAoeCA8PSAodW5zaWduZWQgUFlfTE9OR19MT05HKVBZX0xMT05HX01BWCkgewotCQkJcmVzID0gKFBZX0xPTkdfTE9ORyl4ICogc2lnbjsKLQkJfQotCQllbHNlIGlmIChzaWduIDwgMCAmJiB4ID09IFBZX0FCU19MTE9OR19NSU4pIHsKLQkJCXJlcyA9IFBZX0xMT05HX01JTjsKLQkJfQotCQllbHNlIHsKLQkJCSpvdmVyZmxvdyA9IHNpZ247Ci0JCQkvKiByZXMgaXMgYWxyZWFkeSBzZXQgdG8gLTEgKi8KLQkJfQotCX0KKyAgICBzd2l0Y2ggKGkpIHsKKyAgICBjYXNlIC0xOgorICAgICAgICByZXMgPSAtKHNkaWdpdCl2LT5vYl9kaWdpdFswXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAwOgorICAgICAgICByZXMgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHJlcyA9IHYtPm9iX2RpZ2l0WzBdOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzaWduID0gMTsKKyAgICAgICAgeCA9IDA7CisgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgc2lnbiA9IC0xOworICAgICAgICAgICAgaSA9IC0oaSk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgICAgICBwcmV2ID0geDsKKyAgICAgICAgICAgIHggPSAoeCA8PCBQeUxvbmdfU0hJRlQpICsgdi0+b2JfZGlnaXRbaV07CisgICAgICAgICAgICBpZiAoKHggPj4gUHlMb25nX1NISUZUKSAhPSBwcmV2KSB7CisgICAgICAgICAgICAgICAgKm92ZXJmbG93ID0gc2lnbjsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogSGF2ZW4ndCBsb3N0IGFueSBiaXRzLCBidXQgY2FzdGluZyB0byBsb25nIHJlcXVpcmVzIGV4dHJhCisgICAgICAgICAqIGNhcmUgKHNlZSBjb21tZW50IGFib3ZlKS4KKyAgICAgICAgICovCisgICAgICAgIGlmICh4IDw9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpUFlfTExPTkdfTUFYKSB7CisgICAgICAgICAgICByZXMgPSAoUFlfTE9OR19MT05HKXggKiBzaWduOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNpZ24gPCAwICYmIHggPT0gUFlfQUJTX0xMT05HX01JTikgeworICAgICAgICAgICAgcmVzID0gUFlfTExPTkdfTUlOOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgKm92ZXJmbG93ID0gc2lnbjsKKyAgICAgICAgICAgIC8qIHJlcyBpcyBhbHJlYWR5IHNldCB0byAtMSAqLworICAgICAgICB9CisgICAgfQogIGV4aXQ6Ci0JaWYgKGRvX2RlY3JlZikgewotCQlQeV9ERUNSRUYodnYpOwotCX0KLQlyZXR1cm4gcmVzOworICAgIGlmIChkb19kZWNyZWYpIHsKKyAgICAgICAgUHlfREVDUkVGKHZ2KTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogI3VuZGVmIElTX0xJVFRMRV9FTkRJQU4KQEAgLTExMzQsNTQgKzExMzQsNTQgQEAKIAogc3RhdGljIGludAogY29udmVydF9iaW5vcChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5TG9uZ09iamVjdCAqKmEsIFB5TG9uZ09iamVjdCAqKmIpIHsKLQlpZiAoUHlMb25nX0NoZWNrKHYpKSB7Ci0JCSphID0gKFB5TG9uZ09iamVjdCAqKSB2OwotCQlQeV9JTkNSRUYodik7Ci0JfQotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKSB7Ci0JCSphID0gKFB5TG9uZ09iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh2KSk7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5TG9uZ19DaGVjayh3KSkgewotCQkqYiA9IChQeUxvbmdPYmplY3QgKikgdzsKLQkJUHlfSU5DUkVGKHcpOwotCX0KLQllbHNlIGlmIChQeUludF9DaGVjayh3KSkgewotCQkqYiA9IChQeUxvbmdPYmplY3QgKikgUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodykpOwotCX0KLQllbHNlIHsKLQkJUHlfREVDUkVGKCphKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChQeUxvbmdfQ2hlY2sodikpIHsKKyAgICAgICAgKmEgPSAoUHlMb25nT2JqZWN0ICopIHY7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgKmEgPSAoUHlMb25nT2JqZWN0ICopIFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHYpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoUHlMb25nX0NoZWNrKHcpKSB7CisgICAgICAgICpiID0gKFB5TG9uZ09iamVjdCAqKSB3OworICAgICAgICBQeV9JTkNSRUYodyk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHcpKSB7CisgICAgICAgICpiID0gKFB5TG9uZ09iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh3KSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9ERUNSRUYoKmEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKICNkZWZpbmUgQ09OVkVSVF9CSU5PUCh2LCB3LCBhLCBiKSBcCi0JaWYgKCFjb252ZXJ0X2Jpbm9wKHYsIHcsIGEsIGIpKSB7IFwKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsgXAotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7IFwKLQl9CisgICAgaWYgKCFjb252ZXJ0X2Jpbm9wKHYsIHcsIGEsIGIpKSB7IFwKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsgXAorICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7IFwKKyAgICB9CiAKIC8qIGJpdHNfaW5fZGlnaXQoZCkgcmV0dXJucyB0aGUgdW5pcXVlIGludGVnZXIgayBzdWNoIHRoYXQgMioqKGstMSkgPD0gZCA8CiAgICAyKiprIGlmIGQgaXMgbm9uemVybywgZWxzZSAwLiAqLwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBCaXRMZW5ndGhUYWJsZVszMl0gPSB7Ci0JMCwgMSwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKLQk1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1CisgICAgMCwgMSwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1CiB9OwogCiBzdGF0aWMgaW50CiBiaXRzX2luX2RpZ2l0KGRpZ2l0IGQpCiB7Ci0JaW50IGRfYml0cyA9IDA7Ci0Jd2hpbGUgKGQgPj0gMzIpIHsKLQkJZF9iaXRzICs9IDY7Ci0JCWQgPj49IDY7Ci0JfQotCWRfYml0cyArPSAoaW50KUJpdExlbmd0aFRhYmxlW2RdOwotCXJldHVybiBkX2JpdHM7CisgICAgaW50IGRfYml0cyA9IDA7CisgICAgd2hpbGUgKGQgPj0gMzIpIHsKKyAgICAgICAgZF9iaXRzICs9IDY7CisgICAgICAgIGQgPj49IDY7CisgICAgfQorICAgIGRfYml0cyArPSAoaW50KUJpdExlbmd0aFRhYmxlW2RdOworICAgIHJldHVybiBkX2JpdHM7CiB9CiAKIC8qIHhbMDptXSBhbmQgeVswOm5dIGFyZSBkaWdpdCB2ZWN0b3JzLCBMU0QgZmlyc3QsIG0gPj0gbiByZXF1aXJlZC4gIHhbMDpuXQpAQCAtMTE5MSwyMyArMTE5MSwyMyBAQAogc3RhdGljIGRpZ2l0CiB2X2lhZGQoZGlnaXQgKngsIFB5X3NzaXplX3QgbSwgZGlnaXQgKnksIFB5X3NzaXplX3QgbikKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JZGlnaXQgY2FycnkgPSAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBkaWdpdCBjYXJyeSA9IDA7CiAKLQlhc3NlcnQobSA+PSBuKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCWNhcnJ5ICs9IHhbaV0gKyB5W2ldOwotCQl4W2ldID0gY2FycnkgJiBQeUxvbmdfTUFTSzsKLQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQkJYXNzZXJ0KChjYXJyeSAmIDEpID09IGNhcnJ5KTsKLQl9Ci0JZm9yICg7IGNhcnJ5ICYmIGkgPCBtOyArK2kpIHsKLQkJY2FycnkgKz0geFtpXTsKLQkJeFtpXSA9IGNhcnJ5ICYgUHlMb25nX01BU0s7Ci0JCWNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCWFzc2VydCgoY2FycnkgJiAxKSA9PSBjYXJyeSk7Ci0JfQotCXJldHVybiBjYXJyeTsKKyAgICBhc3NlcnQobSA+PSBuKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGNhcnJ5ICs9IHhbaV0gKyB5W2ldOworICAgICAgICB4W2ldID0gY2FycnkgJiBQeUxvbmdfTUFTSzsKKyAgICAgICAgY2FycnkgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgYXNzZXJ0KChjYXJyeSAmIDEpID09IGNhcnJ5KTsKKyAgICB9CisgICAgZm9yICg7IGNhcnJ5ICYmIGkgPCBtOyArK2kpIHsKKyAgICAgICAgY2FycnkgKz0geFtpXTsKKyAgICAgICAgeFtpXSA9IGNhcnJ5ICYgUHlMb25nX01BU0s7CisgICAgICAgIGNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgIGFzc2VydCgoY2FycnkgJiAxKSA9PSBjYXJyeSk7CisgICAgfQorICAgIHJldHVybiBjYXJyeTsKIH0KIAogLyogeFswOm1dIGFuZCB5WzA6bl0gYXJlIGRpZ2l0IHZlY3RvcnMsIExTRCBmaXJzdCwgbSA+PSBuIHJlcXVpcmVkLiAgeFswOm5dCkBAIC0xMjE3LDIzICsxMjE3LDIzIEBACiBzdGF0aWMgZGlnaXQKIHZfaXN1YihkaWdpdCAqeCwgUHlfc3NpemVfdCBtLCBkaWdpdCAqeSwgUHlfc3NpemVfdCBuKQogewotCVB5X3NzaXplX3QgaTsKLQlkaWdpdCBib3Jyb3cgPSAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBkaWdpdCBib3Jyb3cgPSAwOwogCi0JYXNzZXJ0KG0gPj0gbik7Ci0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlib3Jyb3cgPSB4W2ldIC0geVtpXSAtIGJvcnJvdzsKLQkJeFtpXSA9IGJvcnJvdyAmIFB5TG9uZ19NQVNLOwotCQlib3Jyb3cgPj49IFB5TG9uZ19TSElGVDsKLQkJYm9ycm93ICY9IDE7CS8qIGtlZXAgb25seSAxIHNpZ24gYml0ICovCi0JfQotCWZvciAoOyBib3Jyb3cgJiYgaSA8IG07ICsraSkgewotCQlib3Jyb3cgPSB4W2ldIC0gYm9ycm93OwotCQl4W2ldID0gYm9ycm93ICYgUHlMb25nX01BU0s7Ci0JCWJvcnJvdyA+Pj0gUHlMb25nX1NISUZUOwotCQlib3Jyb3cgJj0gMTsKLQl9Ci0JcmV0dXJuIGJvcnJvdzsKKyAgICBhc3NlcnQobSA+PSBuKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGJvcnJvdyA9IHhbaV0gLSB5W2ldIC0gYm9ycm93OworICAgICAgICB4W2ldID0gYm9ycm93ICYgUHlMb25nX01BU0s7CisgICAgICAgIGJvcnJvdyA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICBib3Jyb3cgJj0gMTsgICAgICAgICAgICAvKiBrZWVwIG9ubHkgMSBzaWduIGJpdCAqLworICAgIH0KKyAgICBmb3IgKDsgYm9ycm93ICYmIGkgPCBtOyArK2kpIHsKKyAgICAgICAgYm9ycm93ID0geFtpXSAtIGJvcnJvdzsKKyAgICAgICAgeFtpXSA9IGJvcnJvdyAmIFB5TG9uZ19NQVNLOworICAgICAgICBib3Jyb3cgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgYm9ycm93ICY9IDE7CisgICAgfQorICAgIHJldHVybiBib3Jyb3c7CiB9CiAKIC8qIFNoaWZ0IGRpZ2l0IHZlY3RvciBhWzA6bV0gZCBiaXRzIGxlZnQsIHdpdGggMCA8PSBkIDwgUHlMb25nX1NISUZULiAgUHV0CkBAIC0xMjQyLDE2ICsxMjQyLDE2IEBACiBzdGF0aWMgZGlnaXQKIHZfbHNoaWZ0KGRpZ2l0ICp6LCBkaWdpdCAqYSwgUHlfc3NpemVfdCBtLCBpbnQgZCkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JZGlnaXQgY2FycnkgPSAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBkaWdpdCBjYXJyeSA9IDA7CiAKLQlhc3NlcnQoMCA8PSBkICYmIGQgPCBQeUxvbmdfU0hJRlQpOwotCWZvciAoaT0wOyBpIDwgbTsgaSsrKSB7Ci0JCXR3b2RpZ2l0cyBhY2MgPSAodHdvZGlnaXRzKWFbaV0gPDwgZCB8IGNhcnJ5OwotCQl6W2ldID0gKGRpZ2l0KWFjYyAmIFB5TG9uZ19NQVNLOwotCQljYXJyeSA9IChkaWdpdCkoYWNjID4+IFB5TG9uZ19TSElGVCk7Ci0JfQotCXJldHVybiBjYXJyeTsKKyAgICBhc3NlcnQoMCA8PSBkICYmIGQgPCBQeUxvbmdfU0hJRlQpOworICAgIGZvciAoaT0wOyBpIDwgbTsgaSsrKSB7CisgICAgICAgIHR3b2RpZ2l0cyBhY2MgPSAodHdvZGlnaXRzKWFbaV0gPDwgZCB8IGNhcnJ5OworICAgICAgICB6W2ldID0gKGRpZ2l0KWFjYyAmIFB5TG9uZ19NQVNLOworICAgICAgICBjYXJyeSA9IChkaWdpdCkoYWNjID4+IFB5TG9uZ19TSElGVCk7CisgICAgfQorICAgIHJldHVybiBjYXJyeTsKIH0KIAogLyogU2hpZnQgZGlnaXQgdmVjdG9yIGFbMDptXSBkIGJpdHMgcmlnaHQsIHdpdGggMCA8PSBkIDwgUHlMb25nX1NISUZULiAgUHV0CkBAIC0xMjYwLDE3ICsxMjYwLDE3IEBACiBzdGF0aWMgZGlnaXQKIHZfcnNoaWZ0KGRpZ2l0ICp6LCBkaWdpdCAqYSwgUHlfc3NpemVfdCBtLCBpbnQgZCkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JZGlnaXQgY2FycnkgPSAwOwotCWRpZ2l0IG1hc2sgPSAoKGRpZ2l0KTEgPDwgZCkgLSAxVTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgZGlnaXQgY2FycnkgPSAwOworICAgIGRpZ2l0IG1hc2sgPSAoKGRpZ2l0KTEgPDwgZCkgLSAxVTsKIAotCWFzc2VydCgwIDw9IGQgJiYgZCA8IFB5TG9uZ19TSElGVCk7Ci0JZm9yIChpPW07IGktLSA+IDA7KSB7Ci0JCXR3b2RpZ2l0cyBhY2MgPSAodHdvZGlnaXRzKWNhcnJ5IDw8IFB5TG9uZ19TSElGVCB8IGFbaV07Ci0JCWNhcnJ5ID0gKGRpZ2l0KWFjYyAmIG1hc2s7Ci0JCXpbaV0gPSAoZGlnaXQpKGFjYyA+PiBkKTsKLQl9Ci0JcmV0dXJuIGNhcnJ5OworICAgIGFzc2VydCgwIDw9IGQgJiYgZCA8IFB5TG9uZ19TSElGVCk7CisgICAgZm9yIChpPW07IGktLSA+IDA7KSB7CisgICAgICAgIHR3b2RpZ2l0cyBhY2MgPSAodHdvZGlnaXRzKWNhcnJ5IDw8IFB5TG9uZ19TSElGVCB8IGFbaV07CisgICAgICAgIGNhcnJ5ID0gKGRpZ2l0KWFjYyAmIG1hc2s7CisgICAgICAgIHpbaV0gPSAoZGlnaXQpKGFjYyA+PiBkKTsKKyAgICB9CisgICAgcmV0dXJuIGNhcnJ5OwogfQogCiAvKiBEaXZpZGUgbG9uZyBwaW4sIHcvIHNpemUgZGlnaXRzLCBieSBub24temVybyBkaWdpdCBuLCBzdG9yaW5nIHF1b3RpZW50CkBAIC0xMjgyLDE4ICsxMjgyLDE4IEBACiBzdGF0aWMgZGlnaXQKIGlucGxhY2VfZGl2cmVtMShkaWdpdCAqcG91dCwgZGlnaXQgKnBpbiwgUHlfc3NpemVfdCBzaXplLCBkaWdpdCBuKQogewotCXR3b2RpZ2l0cyByZW0gPSAwOworICAgIHR3b2RpZ2l0cyByZW0gPSAwOwogCi0JYXNzZXJ0KG4gPiAwICYmIG4gPD0gUHlMb25nX01BU0spOwotCXBpbiArPSBzaXplOwotCXBvdXQgKz0gc2l6ZTsKLQl3aGlsZSAoLS1zaXplID49IDApIHsKLQkJZGlnaXQgaGk7Ci0JCXJlbSA9IChyZW0gPDwgUHlMb25nX1NISUZUKSB8ICotLXBpbjsKLQkJKi0tcG91dCA9IGhpID0gKGRpZ2l0KShyZW0gLyBuKTsKLQkJcmVtIC09ICh0d29kaWdpdHMpaGkgKiBuOwotCX0KLQlyZXR1cm4gKGRpZ2l0KXJlbTsKKyAgICBhc3NlcnQobiA+IDAgJiYgbiA8PSBQeUxvbmdfTUFTSyk7CisgICAgcGluICs9IHNpemU7CisgICAgcG91dCArPSBzaXplOworICAgIHdoaWxlICgtLXNpemUgPj0gMCkgeworICAgICAgICBkaWdpdCBoaTsKKyAgICAgICAgcmVtID0gKHJlbSA8PCBQeUxvbmdfU0hJRlQpIHwgKi0tcGluOworICAgICAgICAqLS1wb3V0ID0gaGkgPSAoZGlnaXQpKHJlbSAvIG4pOworICAgICAgICByZW0gLT0gKHR3b2RpZ2l0cyloaSAqIG47CisgICAgfQorICAgIHJldHVybiAoZGlnaXQpcmVtOwogfQogCiAvKiBEaXZpZGUgYSBsb25nIGludGVnZXIgYnkgYSBkaWdpdCwgcmV0dXJuaW5nIGJvdGggdGhlIHF1b3RpZW50CkBAIC0xMzAzLDE1ICsxMzAzLDE1IEBACiBzdGF0aWMgUHlMb25nT2JqZWN0ICoKIGRpdnJlbTEoUHlMb25nT2JqZWN0ICphLCBkaWdpdCBuLCBkaWdpdCAqcHJlbSkKIHsKLQljb25zdCBQeV9zc2l6ZV90IHNpemUgPSBBQlMoUHlfU0laRShhKSk7Ci0JUHlMb25nT2JqZWN0ICp6OworICAgIGNvbnN0IFB5X3NzaXplX3Qgc2l6ZSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICBQeUxvbmdPYmplY3QgKno7CiAKLQlhc3NlcnQobiA+IDAgJiYgbiA8PSBQeUxvbmdfTUFTSyk7Ci0JeiA9IF9QeUxvbmdfTmV3KHNpemUpOwotCWlmICh6ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCSpwcmVtID0gaW5wbGFjZV9kaXZyZW0xKHotPm9iX2RpZ2l0LCBhLT5vYl9kaWdpdCwgc2l6ZSwgbik7Ci0JcmV0dXJuIGxvbmdfbm9ybWFsaXplKHopOworICAgIGFzc2VydChuID4gMCAmJiBuIDw9IFB5TG9uZ19NQVNLKTsKKyAgICB6ID0gX1B5TG9uZ19OZXcoc2l6ZSk7CisgICAgaWYgKHogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgKnByZW0gPSBpbnBsYWNlX2RpdnJlbTEoei0+b2JfZGlnaXQsIGEtPm9iX2RpZ2l0LCBzaXplLCBuKTsKKyAgICByZXR1cm4gbG9uZ19ub3JtYWxpemUoeik7CiB9CiAKIC8qIENvbnZlcnQgYSBsb25nIGludGVnZXIgdG8gYSBiYXNlIDEwIHN0cmluZy4gIFJldHVybnMgYSBuZXcgbm9uLXNoYXJlZApAQCAtMTMyMSwxMTQgKzEzMjEsMTE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ190b19kZWNpbWFsX3N0cmluZyhQeU9iamVjdCAqYWEsIGludCBhZGRMKQogewotCVB5TG9uZ09iamVjdCAqc2NyYXRjaCwgKmE7Ci0JUHlPYmplY3QgKnN0cjsKLQlQeV9zc2l6ZV90IHNpemUsIHN0cmxlbiwgc2l6ZV9hLCBpLCBqOwotCWRpZ2l0ICpwb3V0LCAqcGluLCByZW0sIHRlbnBvdzsKLQljaGFyICpwOwotCWludCBuZWdhdGl2ZTsKKyAgICBQeUxvbmdPYmplY3QgKnNjcmF0Y2gsICphOworICAgIFB5T2JqZWN0ICpzdHI7CisgICAgUHlfc3NpemVfdCBzaXplLCBzdHJsZW4sIHNpemVfYSwgaSwgajsKKyAgICBkaWdpdCAqcG91dCwgKnBpbiwgcmVtLCB0ZW5wb3c7CisgICAgY2hhciAqcDsKKyAgICBpbnQgbmVnYXRpdmU7CiAKLQlhID0gKFB5TG9uZ09iamVjdCAqKWFhOwotCWlmIChhID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayhhKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKTsKLQluZWdhdGl2ZSA9IFB5X1NJWkUoYSkgPCAwOworICAgIGEgPSAoUHlMb25nT2JqZWN0ICopYWE7CisgICAgaWYgKGEgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKGEpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2l6ZV9hID0gQUJTKFB5X1NJWkUoYSkpOworICAgIG5lZ2F0aXZlID0gUHlfU0laRShhKSA8IDA7CiAKLQkvKiBxdWljayBhbmQgZGlydHkgdXBwZXIgYm91bmQgZm9yIHRoZSBudW1iZXIgb2YgZGlnaXRzCi0JICAgcmVxdWlyZWQgdG8gZXhwcmVzcyBhIGluIGJhc2UgX1B5TG9uZ19ERUNJTUFMX0JBU0U6CisgICAgLyogcXVpY2sgYW5kIGRpcnR5IHVwcGVyIGJvdW5kIGZvciB0aGUgbnVtYmVyIG9mIGRpZ2l0cworICAgICAgIHJlcXVpcmVkIHRvIGV4cHJlc3MgYSBpbiBiYXNlIF9QeUxvbmdfREVDSU1BTF9CQVNFOgogCi0JICAgICAjZGlnaXRzID0gMSArIGZsb29yKGxvZzIoYSkgLyBsb2cyKF9QeUxvbmdfREVDSU1BTF9CQVNFKSkKKyAgICAgICAgICNkaWdpdHMgPSAxICsgZmxvb3IobG9nMihhKSAvIGxvZzIoX1B5TG9uZ19ERUNJTUFMX0JBU0UpKQogCi0JICAgQnV0IGxvZzIoYSkgPCBzaXplX2EgKiBQeUxvbmdfU0hJRlQsIGFuZAotCSAgIGxvZzIoX1B5TG9uZ19ERUNJTUFMX0JBU0UpID0gbG9nMigxMCkgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQKLQkJCQkgICAgICA+IDMgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQKLQkqLwotCWlmIChzaXplX2EgPiBQWV9TU0laRV9UX01BWCAvIFB5TG9uZ19TSElGVCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibG9uZyBpcyB0b28gbGFyZ2UgdG8gZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiB0aGUgZXhwcmVzc2lvbiBzaXplX2EgKiBQeUxvbmdfU0hJRlQgaXMgbm93IHNhZmUgZnJvbSBvdmVyZmxvdyAqLwotCXNpemUgPSAxICsgc2l6ZV9hICogUHlMb25nX1NISUZUIC8gKDMgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQpOwotCXNjcmF0Y2ggPSBfUHlMb25nX05ldyhzaXplKTsKLQlpZiAoc2NyYXRjaCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICBCdXQgbG9nMihhKSA8IHNpemVfYSAqIFB5TG9uZ19TSElGVCwgYW5kCisgICAgICAgbG9nMihfUHlMb25nX0RFQ0lNQUxfQkFTRSkgPSBsb2cyKDEwKSAqIF9QeUxvbmdfREVDSU1BTF9TSElGVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gMyAqIF9QeUxvbmdfREVDSU1BTF9TSElGVAorICAgICovCisgICAgaWYgKHNpemVfYSA+IFBZX1NTSVpFX1RfTUFYIC8gUHlMb25nX1NISUZUKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvbmcgaXMgdG9vIGxhcmdlIHRvIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogdGhlIGV4cHJlc3Npb24gc2l6ZV9hICogUHlMb25nX1NISUZUIGlzIG5vdyBzYWZlIGZyb20gb3ZlcmZsb3cgKi8KKyAgICBzaXplID0gMSArIHNpemVfYSAqIFB5TG9uZ19TSElGVCAvICgzICogX1B5TG9uZ19ERUNJTUFMX1NISUZUKTsKKyAgICBzY3JhdGNoID0gX1B5TG9uZ19OZXcoc2l6ZSk7CisgICAgaWYgKHNjcmF0Y2ggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBjb252ZXJ0IGFycmF5IG9mIGJhc2UgX1B5TG9uZ19CQVNFIGRpZ2l0cyBpbiBwaW4gdG8gYW4gYXJyYXkgb2YKLQkgICBiYXNlIF9QeUxvbmdfREVDSU1BTF9CQVNFIGRpZ2l0cyBpbiBwb3V0LCBmb2xsb3dpbmcgS251dGggKFRBT0NQLAotCSAgIFZvbHVtZSAyICgzcmQgZWRuKSwgc2VjdGlvbiA0LjQsIE1ldGhvZCAxYikuICovCi0JcGluID0gYS0+b2JfZGlnaXQ7Ci0JcG91dCA9IHNjcmF0Y2gtPm9iX2RpZ2l0OwotCXNpemUgPSAwOwotCWZvciAoaSA9IHNpemVfYTsgLS1pID49IDA7ICkgewotCQlkaWdpdCBoaSA9IHBpbltpXTsKLQkJZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgewotCQkJdHdvZGlnaXRzIHogPSAodHdvZGlnaXRzKXBvdXRbal0gPDwgUHlMb25nX1NISUZUIHwgaGk7Ci0JCQloaSA9IChkaWdpdCkoeiAvIF9QeUxvbmdfREVDSU1BTF9CQVNFKTsKLQkJCXBvdXRbal0gPSAoZGlnaXQpKHogLSAodHdvZGlnaXRzKWhpICoKLQkJCQkJICBfUHlMb25nX0RFQ0lNQUxfQkFTRSk7Ci0JCX0KLQkJd2hpbGUgKGhpKSB7Ci0JCQlwb3V0W3NpemUrK10gPSBoaSAlIF9QeUxvbmdfREVDSU1BTF9CQVNFOwotCQkJaGkgLz0gX1B5TG9uZ19ERUNJTUFMX0JBU0U7Ci0JCX0KLQkJLyogY2hlY2sgZm9yIGtleWJvYXJkIGludGVycnVwdCAqLwotCQlTSUdDSEVDSyh7Ci0JCQlQeV9ERUNSRUYoc2NyYXRjaCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfSkKLQl9Ci0JLyogcG91dCBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgZGlnaXQsIHNvIHRoYXQgdGhlIGNhc2Ugd2hlbiBhID0gMAotCSAgIHdvcmtzIGNvcnJlY3RseSAqLwotCWlmIChzaXplID09IDApCi0JCXBvdXRbc2l6ZSsrXSA9IDA7CisgICAgLyogY29udmVydCBhcnJheSBvZiBiYXNlIF9QeUxvbmdfQkFTRSBkaWdpdHMgaW4gcGluIHRvIGFuIGFycmF5IG9mCisgICAgICAgYmFzZSBfUHlMb25nX0RFQ0lNQUxfQkFTRSBkaWdpdHMgaW4gcG91dCwgZm9sbG93aW5nIEtudXRoIChUQU9DUCwKKyAgICAgICBWb2x1bWUgMiAoM3JkIGVkbiksIHNlY3Rpb24gNC40LCBNZXRob2QgMWIpLiAqLworICAgIHBpbiA9IGEtPm9iX2RpZ2l0OworICAgIHBvdXQgPSBzY3JhdGNoLT5vYl9kaWdpdDsKKyAgICBzaXplID0gMDsKKyAgICBmb3IgKGkgPSBzaXplX2E7IC0taSA+PSAwOyApIHsKKyAgICAgICAgZGlnaXQgaGkgPSBwaW5baV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICAgIHR3b2RpZ2l0cyB6ID0gKHR3b2RpZ2l0cylwb3V0W2pdIDw8IFB5TG9uZ19TSElGVCB8IGhpOworICAgICAgICAgICAgaGkgPSAoZGlnaXQpKHogLyBfUHlMb25nX0RFQ0lNQUxfQkFTRSk7CisgICAgICAgICAgICBwb3V0W2pdID0gKGRpZ2l0KSh6IC0gKHR3b2RpZ2l0cyloaSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlMb25nX0RFQ0lNQUxfQkFTRSk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGhpKSB7CisgICAgICAgICAgICBwb3V0W3NpemUrK10gPSBoaSAlIF9QeUxvbmdfREVDSU1BTF9CQVNFOworICAgICAgICAgICAgaGkgLz0gX1B5TG9uZ19ERUNJTUFMX0JBU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogY2hlY2sgZm9yIGtleWJvYXJkIGludGVycnVwdCAqLworICAgICAgICBTSUdDSEVDSyh7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2NyYXRjaCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSkKKyAgICB9CisgICAgLyogcG91dCBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgZGlnaXQsIHNvIHRoYXQgdGhlIGNhc2Ugd2hlbiBhID0gMAorICAgICAgIHdvcmtzIGNvcnJlY3RseSAqLworICAgIGlmIChzaXplID09IDApCisgICAgICAgIHBvdXRbc2l6ZSsrXSA9IDA7CiAKLQkvKiBjYWxjdWxhdGUgZXhhY3QgbGVuZ3RoIG9mIG91dHB1dCBzdHJpbmcsIGFuZCBhbGxvY2F0ZSAqLwotCXN0cmxlbiA9IChhZGRMICE9IDApICsgbmVnYXRpdmUgKwotCQkxICsgKHNpemUgLSAxKSAqIF9QeUxvbmdfREVDSU1BTF9TSElGVDsKLQl0ZW5wb3cgPSAxMDsKLQlyZW0gPSBwb3V0W3NpemUtMV07Ci0Jd2hpbGUgKHJlbSA+PSB0ZW5wb3cpIHsKLQkJdGVucG93ICo9IDEwOwotCQlzdHJsZW4rKzsKLQl9Ci0Jc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc3RybGVuKTsKLQlpZiAoc3RyID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHNjcmF0Y2gpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogY2FsY3VsYXRlIGV4YWN0IGxlbmd0aCBvZiBvdXRwdXQgc3RyaW5nLCBhbmQgYWxsb2NhdGUgKi8KKyAgICBzdHJsZW4gPSAoYWRkTCAhPSAwKSArIG5lZ2F0aXZlICsKKyAgICAgICAgMSArIChzaXplIC0gMSkgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQ7CisgICAgdGVucG93ID0gMTA7CisgICAgcmVtID0gcG91dFtzaXplLTFdOworICAgIHdoaWxlIChyZW0gPj0gdGVucG93KSB7CisgICAgICAgIHRlbnBvdyAqPSAxMDsKKyAgICAgICAgc3RybGVuKys7CisgICAgfQorICAgIHN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHN0cmxlbik7CisgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihzY3JhdGNoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogZmlsbCB0aGUgc3RyaW5nIHJpZ2h0LXRvLWxlZnQgKi8KLQlwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cikgKyBzdHJsZW47Ci0JKnAgPSAnXDAnOwotCWlmIChhZGRMKQotCQkqLS1wID0gJ0wnOwotCS8qIHBvdXRbMF0gdGhyb3VnaCBwb3V0W3NpemUtMl0gY29udHJpYnV0ZSBleGFjdGx5Ci0JICAgX1B5TG9uZ19ERUNJTUFMX1NISUZUIGRpZ2l0cyBlYWNoICovCi0JZm9yIChpPTA7IGkgPCBzaXplIC0gMTsgaSsrKSB7Ci0JCXJlbSA9IHBvdXRbaV07Ci0JCWZvciAoaiA9IDA7IGogPCBfUHlMb25nX0RFQ0lNQUxfU0hJRlQ7IGorKykgewotCQkJKi0tcCA9ICcwJyArIHJlbSAlIDEwOwotCQkJcmVtIC89IDEwOwotCQl9Ci0JfQotCS8qIHBvdXRbc2l6ZS0xXTogYWx3YXlzIHByb2R1Y2UgYXQgbGVhc3Qgb25lIGRlY2ltYWwgZGlnaXQgKi8KLQlyZW0gPSBwb3V0W2ldOwotCWRvIHsKLQkJKi0tcCA9ICcwJyArIHJlbSAlIDEwOwotCQlyZW0gLz0gMTA7Ci0JfSB3aGlsZSAocmVtICE9IDApOworICAgIC8qIGZpbGwgdGhlIHN0cmluZyByaWdodC10by1sZWZ0ICovCisgICAgcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpICsgc3RybGVuOworICAgICpwID0gJ1wwJzsKKyAgICBpZiAoYWRkTCkKKyAgICAgICAgKi0tcCA9ICdMJzsKKyAgICAvKiBwb3V0WzBdIHRocm91Z2ggcG91dFtzaXplLTJdIGNvbnRyaWJ1dGUgZXhhY3RseQorICAgICAgIF9QeUxvbmdfREVDSU1BTF9TSElGVCBkaWdpdHMgZWFjaCAqLworICAgIGZvciAoaT0wOyBpIDwgc2l6ZSAtIDE7IGkrKykgeworICAgICAgICByZW0gPSBwb3V0W2ldOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgX1B5TG9uZ19ERUNJTUFMX1NISUZUOyBqKyspIHsKKyAgICAgICAgICAgICotLXAgPSAnMCcgKyByZW0gJSAxMDsKKyAgICAgICAgICAgIHJlbSAvPSAxMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBwb3V0W3NpemUtMV06IGFsd2F5cyBwcm9kdWNlIGF0IGxlYXN0IG9uZSBkZWNpbWFsIGRpZ2l0ICovCisgICAgcmVtID0gcG91dFtpXTsKKyAgICBkbyB7CisgICAgICAgICotLXAgPSAnMCcgKyByZW0gJSAxMDsKKyAgICAgICAgcmVtIC89IDEwOworICAgIH0gd2hpbGUgKHJlbSAhPSAwKTsKIAotCS8qIGFuZCBzaWduICovCi0JaWYgKG5lZ2F0aXZlKQotCQkqLS1wID0gJy0nOworICAgIC8qIGFuZCBzaWduICovCisgICAgaWYgKG5lZ2F0aXZlKQorICAgICAgICAqLS1wID0gJy0nOwogCi0JLyogY2hlY2sgd2UndmUgY291bnRlZCBjb3JyZWN0bHkgKi8KLQlhc3NlcnQocCA9PSBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSk7Ci0JUHlfREVDUkVGKHNjcmF0Y2gpOwotCXJldHVybiAoUHlPYmplY3QgKilzdHI7CisgICAgLyogY2hlY2sgd2UndmUgY291bnRlZCBjb3JyZWN0bHkgKi8KKyAgICBhc3NlcnQocCA9PSBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSk7CisgICAgUHlfREVDUkVGKHNjcmF0Y2gpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzdHI7CiB9CiAKIC8qIENvbnZlcnQgdGhlIGxvbmcgdG8gYSBzdHJpbmcgb2JqZWN0IHdpdGggZ2l2ZW4gYmFzZSwKQEAgLTE0MzksMTcwICsxNDM5LDE3MCBAQAogUHlBUElfRlVOQyhQeU9iamVjdCAqKQogX1B5TG9uZ19Gb3JtYXQoUHlPYmplY3QgKmFhLCBpbnQgYmFzZSwgaW50IGFkZEwsIGludCBuZXdzdHlsZSkKIHsKLQlyZWdpc3RlciBQeUxvbmdPYmplY3QgKmEgPSAoUHlMb25nT2JqZWN0ICopYWE7Ci0JUHlTdHJpbmdPYmplY3QgKnN0cjsKLQlQeV9zc2l6ZV90IGksIHN6OwotCVB5X3NzaXplX3Qgc2l6ZV9hOwotCWNoYXIgKnA7Ci0JaW50IGJpdHM7Ci0JY2hhciBzaWduID0gJ1wwJzsKKyAgICByZWdpc3RlciBQeUxvbmdPYmplY3QgKmEgPSAoUHlMb25nT2JqZWN0ICopYWE7CisgICAgUHlTdHJpbmdPYmplY3QgKnN0cjsKKyAgICBQeV9zc2l6ZV90IGksIHN6OworICAgIFB5X3NzaXplX3Qgc2l6ZV9hOworICAgIGNoYXIgKnA7CisgICAgaW50IGJpdHM7CisgICAgY2hhciBzaWduID0gJ1wwJzsKIAotCWlmIChiYXNlID09IDEwKQotCQlyZXR1cm4gbG9uZ190b19kZWNpbWFsX3N0cmluZygoUHlPYmplY3QgKilhLCBhZGRMKTsKKyAgICBpZiAoYmFzZSA9PSAxMCkKKyAgICAgICAgcmV0dXJuIGxvbmdfdG9fZGVjaW1hbF9zdHJpbmcoKFB5T2JqZWN0ICopYSwgYWRkTCk7CiAKLQlpZiAoYSA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2soYSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhc3NlcnQoYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpOwotCXNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICBpZiAoYSA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2soYSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhc3NlcnQoYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpOworICAgIHNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKTsKIAotCS8qIENvbXB1dGUgYSByb3VnaCB1cHBlciBib3VuZCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICovCi0JaSA9IGJhc2U7Ci0JYml0cyA9IDA7Ci0Jd2hpbGUgKGkgPiAxKSB7Ci0JCSsrYml0czsKLQkJaSA+Pj0gMTsKLQl9Ci0JaSA9IDUgKyAoYWRkTCA/IDEgOiAwKTsKLQkvKiBlbnN1cmUgd2UgZG9uJ3QgZ2V0IHNpZ25lZCBvdmVyZmxvdyBpbiBzeiBjYWxjdWxhdGlvbiAqLwotCWlmIChzaXplX2EgPiAoUFlfU1NJWkVfVF9NQVggLSBpKSAvIFB5TG9uZ19TSElGVCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibG9uZyBpcyB0b28gbGFyZ2UgdG8gZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzeiA9IGkgKyAxICsgKHNpemVfYSAqIFB5TG9uZ19TSElGVCAtIDEpIC8gYml0czsKLQlhc3NlcnQoc3ogPj0gMCk7Ci0Jc3RyID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopMCwgc3opOwotCWlmIChzdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpICsgc3o7Ci0JKnAgPSAnXDAnOwotCWlmIChhZGRMKQotCQkqLS1wID0gJ0wnOwotCWlmIChhLT5vYl9zaXplIDwgMCkKLQkJc2lnbiA9ICctJzsKKyAgICAvKiBDb21wdXRlIGEgcm91Z2ggdXBwZXIgYm91bmQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAqLworICAgIGkgPSBiYXNlOworICAgIGJpdHMgPSAwOworICAgIHdoaWxlIChpID4gMSkgeworICAgICAgICArK2JpdHM7CisgICAgICAgIGkgPj49IDE7CisgICAgfQorICAgIGkgPSA1ICsgKGFkZEwgPyAxIDogMCk7CisgICAgLyogZW5zdXJlIHdlIGRvbid0IGdldCBzaWduZWQgb3ZlcmZsb3cgaW4gc3ogY2FsY3VsYXRpb24gKi8KKyAgICBpZiAoc2l6ZV9hID4gKFBZX1NTSVpFX1RfTUFYIC0gaSkgLyBQeUxvbmdfU0hJRlQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibG9uZyBpcyB0b28gbGFyZ2UgdG8gZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzeiA9IGkgKyAxICsgKHNpemVfYSAqIFB5TG9uZ19TSElGVCAtIDEpIC8gYml0czsKKyAgICBhc3NlcnQoc3ogPj0gMCk7CisgICAgc3RyID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopMCwgc3opOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpICsgc3o7CisgICAgKnAgPSAnXDAnOworICAgIGlmIChhZGRMKQorICAgICAgICAqLS1wID0gJ0wnOworICAgIGlmIChhLT5vYl9zaXplIDwgMCkKKyAgICAgICAgc2lnbiA9ICctJzsKIAotCWlmIChhLT5vYl9zaXplID09IDApIHsKLQkJKi0tcCA9ICcwJzsKLQl9Ci0JZWxzZSBpZiAoKGJhc2UgJiAoYmFzZSAtIDEpKSA9PSAwKSB7Ci0JCS8qIEpSSDogc3BlY2lhbCBjYXNlIGZvciBwb3dlci1vZi0yIGJhc2VzICovCi0JCXR3b2RpZ2l0cyBhY2N1bSA9IDA7Ci0JCWludCBhY2N1bWJpdHMgPSAwOwkvKiAjIG9mIGJpdHMgaW4gYWNjdW0gKi8KLQkJaW50IGJhc2ViaXRzID0gMTsJLyogIyBvZiBiaXRzIGluIGJhc2UtMSAqLwotCQlpID0gYmFzZTsKLQkJd2hpbGUgKChpID4+PSAxKSA+IDEpCi0JCQkrK2Jhc2ViaXRzOworICAgIGlmIChhLT5vYl9zaXplID09IDApIHsKKyAgICAgICAgKi0tcCA9ICcwJzsKKyAgICB9CisgICAgZWxzZSBpZiAoKGJhc2UgJiAoYmFzZSAtIDEpKSA9PSAwKSB7CisgICAgICAgIC8qIEpSSDogc3BlY2lhbCBjYXNlIGZvciBwb3dlci1vZi0yIGJhc2VzICovCisgICAgICAgIHR3b2RpZ2l0cyBhY2N1bSA9IDA7CisgICAgICAgIGludCBhY2N1bWJpdHMgPSAwOyAgICAgICAgICAgICAgLyogIyBvZiBiaXRzIGluIGFjY3VtICovCisgICAgICAgIGludCBiYXNlYml0cyA9IDE7ICAgICAgICAgICAgICAgLyogIyBvZiBiaXRzIGluIGJhc2UtMSAqLworICAgICAgICBpID0gYmFzZTsKKyAgICAgICAgd2hpbGUgKChpID4+PSAxKSA+IDEpCisgICAgICAgICAgICArK2Jhc2ViaXRzOwogCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplX2E7ICsraSkgewotCQkJYWNjdW0gfD0gKHR3b2RpZ2l0cylhLT5vYl9kaWdpdFtpXSA8PCBhY2N1bWJpdHM7Ci0JCQlhY2N1bWJpdHMgKz0gUHlMb25nX1NISUZUOwotCQkJYXNzZXJ0KGFjY3VtYml0cyA+PSBiYXNlYml0cyk7Ci0JCQlkbyB7Ci0JCQkJY2hhciBjZGlnaXQgPSAoY2hhcikoYWNjdW0gJiAoYmFzZSAtIDEpKTsKLQkJCQljZGlnaXQgKz0gKGNkaWdpdCA8IDEwKSA/ICcwJyA6ICdhJy0xMDsKLQkJCQlhc3NlcnQocCA+IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpKTsKLQkJCQkqLS1wID0gY2RpZ2l0OwotCQkJCWFjY3VtYml0cyAtPSBiYXNlYml0czsKLQkJCQlhY2N1bSA+Pj0gYmFzZWJpdHM7Ci0JCQl9IHdoaWxlIChpIDwgc2l6ZV9hLTEgPyBhY2N1bWJpdHMgPj0gYmFzZWJpdHMgOgotCQkJCQkJYWNjdW0gPiAwKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogTm90IDAsIGFuZCBiYXNlIG5vdCBhIHBvd2VyIG9mIDIuICBEaXZpZGUgcmVwZWF0ZWRseSBieQotCQkgICBiYXNlLCBidXQgZm9yIHNwZWVkIHVzZSB0aGUgaGlnaGVzdCBwb3dlciBvZiBiYXNlIHRoYXQKLQkJICAgZml0cyBpbiBhIGRpZ2l0LiAqLwotCQlQeV9zc2l6ZV90IHNpemUgPSBzaXplX2E7Ci0JCWRpZ2l0ICpwaW4gPSBhLT5vYl9kaWdpdDsKLQkJUHlMb25nT2JqZWN0ICpzY3JhdGNoOwotCQkvKiBwb3diYXN3IDwtIGxhcmdlc3QgcG93ZXIgb2YgYmFzZSB0aGF0IGZpdHMgaW4gYSBkaWdpdC4gKi8KLQkJZGlnaXQgcG93YmFzZSA9IGJhc2U7ICAvKiBwb3diYXNlID09IGJhc2UgKiogcG93ZXIgKi8KLQkJaW50IHBvd2VyID0gMTsKLQkJZm9yICg7OykgewotCQkJdHdvZGlnaXRzIG5ld3BvdyA9IHBvd2Jhc2UgKiAodHdvZGlnaXRzKWJhc2U7Ci0JCQlpZiAobmV3cG93ID4+IFB5TG9uZ19TSElGVCkKLQkJCQkvKiBkb2Vzbid0IGZpdCBpbiBhIGRpZ2l0ICovCi0JCQkJYnJlYWs7Ci0JCQlwb3diYXNlID0gKGRpZ2l0KW5ld3BvdzsKLQkJCSsrcG93ZXI7Ci0JCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVfYTsgKytpKSB7CisgICAgICAgICAgICBhY2N1bSB8PSAodHdvZGlnaXRzKWEtPm9iX2RpZ2l0W2ldIDw8IGFjY3VtYml0czsKKyAgICAgICAgICAgIGFjY3VtYml0cyArPSBQeUxvbmdfU0hJRlQ7CisgICAgICAgICAgICBhc3NlcnQoYWNjdW1iaXRzID49IGJhc2ViaXRzKTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNkaWdpdCA9IChjaGFyKShhY2N1bSAmIChiYXNlIC0gMSkpOworICAgICAgICAgICAgICAgIGNkaWdpdCArPSAoY2RpZ2l0IDwgMTApID8gJzAnIDogJ2EnLTEwOworICAgICAgICAgICAgICAgIGFzc2VydChwID4gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cikpOworICAgICAgICAgICAgICAgICotLXAgPSBjZGlnaXQ7CisgICAgICAgICAgICAgICAgYWNjdW1iaXRzIC09IGJhc2ViaXRzOworICAgICAgICAgICAgICAgIGFjY3VtID4+PSBiYXNlYml0czsKKyAgICAgICAgICAgIH0gd2hpbGUgKGkgPCBzaXplX2EtMSA/IGFjY3VtYml0cyA+PSBiYXNlYml0cyA6CisgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bSA+IDApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBOb3QgMCwgYW5kIGJhc2Ugbm90IGEgcG93ZXIgb2YgMi4gIERpdmlkZSByZXBlYXRlZGx5IGJ5CisgICAgICAgICAgIGJhc2UsIGJ1dCBmb3Igc3BlZWQgdXNlIHRoZSBoaWdoZXN0IHBvd2VyIG9mIGJhc2UgdGhhdAorICAgICAgICAgICBmaXRzIGluIGEgZGlnaXQuICovCisgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSA9IHNpemVfYTsKKyAgICAgICAgZGlnaXQgKnBpbiA9IGEtPm9iX2RpZ2l0OworICAgICAgICBQeUxvbmdPYmplY3QgKnNjcmF0Y2g7CisgICAgICAgIC8qIHBvd2Jhc3cgPC0gbGFyZ2VzdCBwb3dlciBvZiBiYXNlIHRoYXQgZml0cyBpbiBhIGRpZ2l0LiAqLworICAgICAgICBkaWdpdCBwb3diYXNlID0gYmFzZTsgIC8qIHBvd2Jhc2UgPT0gYmFzZSAqKiBwb3dlciAqLworICAgICAgICBpbnQgcG93ZXIgPSAxOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICB0d29kaWdpdHMgbmV3cG93ID0gcG93YmFzZSAqICh0d29kaWdpdHMpYmFzZTsKKyAgICAgICAgICAgIGlmIChuZXdwb3cgPj4gUHlMb25nX1NISUZUKQorICAgICAgICAgICAgICAgIC8qIGRvZXNuJ3QgZml0IGluIGEgZGlnaXQgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHBvd2Jhc2UgPSAoZGlnaXQpbmV3cG93OworICAgICAgICAgICAgKytwb3dlcjsKKyAgICAgICAgfQogCi0JCS8qIEdldCBhIHNjcmF0Y2ggYXJlYSBmb3IgcmVwZWF0ZWQgZGl2aXNpb24uICovCi0JCXNjcmF0Y2ggPSBfUHlMb25nX05ldyhzaXplKTsKLQkJaWYgKHNjcmF0Y2ggPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHN0cik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICAvKiBHZXQgYSBzY3JhdGNoIGFyZWEgZm9yIHJlcGVhdGVkIGRpdmlzaW9uLiAqLworICAgICAgICBzY3JhdGNoID0gX1B5TG9uZ19OZXcoc2l6ZSk7CisgICAgICAgIGlmIChzY3JhdGNoID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQkvKiBSZXBlYXRlZGx5IGRpdmlkZSBieSBwb3diYXNlLiAqLwotCQlkbyB7Ci0JCQlpbnQgbnRvc3RvcmUgPSBwb3dlcjsKLQkJCWRpZ2l0IHJlbSA9IGlucGxhY2VfZGl2cmVtMShzY3JhdGNoLT5vYl9kaWdpdCwKLQkJCQkJCSAgICAgcGluLCBzaXplLCBwb3diYXNlKTsKLQkJCXBpbiA9IHNjcmF0Y2gtPm9iX2RpZ2l0OyAvKiBubyBuZWVkIHRvIHVzZSBhIGFnYWluICovCi0JCQlpZiAocGluW3NpemUgLSAxXSA9PSAwKQotCQkJCS0tc2l6ZTsKLQkJCVNJR0NIRUNLKHsKLQkJCQlQeV9ERUNSRUYoc2NyYXRjaCk7Ci0JCQkJUHlfREVDUkVGKHN0cik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9KQorICAgICAgICAvKiBSZXBlYXRlZGx5IGRpdmlkZSBieSBwb3diYXNlLiAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgbnRvc3RvcmUgPSBwb3dlcjsKKyAgICAgICAgICAgIGRpZ2l0IHJlbSA9IGlucGxhY2VfZGl2cmVtMShzY3JhdGNoLT5vYl9kaWdpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluLCBzaXplLCBwb3diYXNlKTsKKyAgICAgICAgICAgIHBpbiA9IHNjcmF0Y2gtPm9iX2RpZ2l0OyAvKiBubyBuZWVkIHRvIHVzZSBhIGFnYWluICovCisgICAgICAgICAgICBpZiAocGluW3NpemUgLSAxXSA9PSAwKQorICAgICAgICAgICAgICAgIC0tc2l6ZTsKKyAgICAgICAgICAgIFNJR0NIRUNLKHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2NyYXRjaCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9KQogCi0JCQkvKiBCcmVhayByZW0gaW50byBkaWdpdHMuICovCi0JCQlhc3NlcnQobnRvc3RvcmUgPiAwKTsKLQkJCWRvIHsKLQkJCQlkaWdpdCBuZXh0cmVtID0gKGRpZ2l0KShyZW0gLyBiYXNlKTsKLQkJCQljaGFyIGMgPSAoY2hhcikocmVtIC0gbmV4dHJlbSAqIGJhc2UpOwotCQkJCWFzc2VydChwID4gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cikpOwotCQkJCWMgKz0gKGMgPCAxMCkgPyAnMCcgOiAnYSctMTA7Ci0JCQkJKi0tcCA9IGM7Ci0JCQkJcmVtID0gbmV4dHJlbTsKLQkJCQktLW50b3N0b3JlOwotCQkJCS8qIFRlcm1pbmF0aW9uIGlzIGEgYml0IGRlbGljYXRlOiAgbXVzdCBub3QKLQkJCQkgICBzdG9yZSBsZWFkaW5nIHplcm9lcywgc28gbXVzdCBnZXQgb3V0IGlmCi0JCQkJICAgcmVtYWluaW5nIHF1b3RpZW50IGFuZCByZW0gYXJlIGJvdGggMC4gKi8KLQkJCX0gd2hpbGUgKG50b3N0b3JlICYmIChzaXplIHx8IHJlbSkpOwotCQl9IHdoaWxlIChzaXplICE9IDApOwotCQlQeV9ERUNSRUYoc2NyYXRjaCk7Ci0JfQorICAgICAgICAgICAgLyogQnJlYWsgcmVtIGludG8gZGlnaXRzLiAqLworICAgICAgICAgICAgYXNzZXJ0KG50b3N0b3JlID4gMCk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgZGlnaXQgbmV4dHJlbSA9IChkaWdpdCkocmVtIC8gYmFzZSk7CisgICAgICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpKHJlbSAtIG5leHRyZW0gKiBiYXNlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQocCA+IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpKTsKKyAgICAgICAgICAgICAgICBjICs9IChjIDwgMTApID8gJzAnIDogJ2EnLTEwOworICAgICAgICAgICAgICAgICotLXAgPSBjOworICAgICAgICAgICAgICAgIHJlbSA9IG5leHRyZW07CisgICAgICAgICAgICAgICAgLS1udG9zdG9yZTsKKyAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdGlvbiBpcyBhIGJpdCBkZWxpY2F0ZTogIG11c3Qgbm90CisgICAgICAgICAgICAgICAgICAgc3RvcmUgbGVhZGluZyB6ZXJvZXMsIHNvIG11c3QgZ2V0IG91dCBpZgorICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBxdW90aWVudCBhbmQgcmVtIGFyZSBib3RoIDAuICovCisgICAgICAgICAgICB9IHdoaWxlIChudG9zdG9yZSAmJiAoc2l6ZSB8fCByZW0pKTsKKyAgICAgICAgfSB3aGlsZSAoc2l6ZSAhPSAwKTsKKyAgICAgICAgUHlfREVDUkVGKHNjcmF0Y2gpOworICAgIH0KIAotCWlmIChiYXNlID09IDIpIHsKLQkJKi0tcCA9ICdiJzsKLQkJKi0tcCA9ICcwJzsKLQl9Ci0JZWxzZSBpZiAoYmFzZSA9PSA4KSB7Ci0JCWlmIChuZXdzdHlsZSkgewotCQkJKi0tcCA9ICdvJzsKLQkJCSotLXAgPSAnMCc7Ci0JCX0KLQkJZWxzZQotCQkJaWYgKHNpemVfYSAhPSAwKQotCQkJCSotLXAgPSAnMCc7Ci0JfQotCWVsc2UgaWYgKGJhc2UgPT0gMTYpIHsKLQkJKi0tcCA9ICd4JzsKLQkJKi0tcCA9ICcwJzsKLQl9Ci0JZWxzZSBpZiAoYmFzZSAhPSAxMCkgewotCQkqLS1wID0gJyMnOwotCQkqLS1wID0gJzAnICsgYmFzZSUxMDsKLQkJaWYgKGJhc2UgPiAxMCkKLQkJCSotLXAgPSAnMCcgKyBiYXNlLzEwOwotCX0KLQlpZiAoc2lnbikKLQkJKi0tcCA9IHNpZ247Ci0JaWYgKHAgIT0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cikpIHsKLQkJY2hhciAqcSA9IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpOwotCQlhc3NlcnQocCA+IHEpOwotCQlkbyB7Ci0JCX0gd2hpbGUgKCgqcSsrID0gKnArKykgIT0gJ1wwJyk7Ci0JCXEtLTsKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgoUHlPYmplY3QgKiopJnN0ciwKLQkJCQkgKFB5X3NzaXplX3QpIChxIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cikpKTsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXN0cjsKKyAgICBpZiAoYmFzZSA9PSAyKSB7CisgICAgICAgICotLXAgPSAnYic7CisgICAgICAgICotLXAgPSAnMCc7CisgICAgfQorICAgIGVsc2UgaWYgKGJhc2UgPT0gOCkgeworICAgICAgICBpZiAobmV3c3R5bGUpIHsKKyAgICAgICAgICAgICotLXAgPSAnbyc7CisgICAgICAgICAgICAqLS1wID0gJzAnOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChzaXplX2EgIT0gMCkKKyAgICAgICAgICAgICAgICAqLS1wID0gJzAnOworICAgIH0KKyAgICBlbHNlIGlmIChiYXNlID09IDE2KSB7CisgICAgICAgICotLXAgPSAneCc7CisgICAgICAgICotLXAgPSAnMCc7CisgICAgfQorICAgIGVsc2UgaWYgKGJhc2UgIT0gMTApIHsKKyAgICAgICAgKi0tcCA9ICcjJzsKKyAgICAgICAgKi0tcCA9ICcwJyArIGJhc2UlMTA7CisgICAgICAgIGlmIChiYXNlID4gMTApCisgICAgICAgICAgICAqLS1wID0gJzAnICsgYmFzZS8xMDsKKyAgICB9CisgICAgaWYgKHNpZ24pCisgICAgICAgICotLXAgPSBzaWduOworICAgIGlmIChwICE9IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpKSB7CisgICAgICAgIGNoYXIgKnEgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RyKTsKKyAgICAgICAgYXNzZXJ0KHAgPiBxKTsKKyAgICAgICAgZG8geworICAgICAgICB9IHdoaWxlICgoKnErKyA9ICpwKyspICE9ICdcMCcpOworICAgICAgICBxLS07CisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoKFB5T2JqZWN0ICoqKSZzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QpIChxIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cikpKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXN0cjsKIH0KIAogLyogVGFibGUgb2YgZGlnaXQgdmFsdWVzIGZvciA4LWJpdCBzdHJpbmcgLT4gaW50ZWdlciBjb252ZXJzaW9uLgpAQCAtMTYxMywyMiArMTYxMywyMiBAQAogICogYmFzZSBCIGRpZ2l0IGlmZiBfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soYyldIDwgQi4KICAqLwogaW50IF9QeUxvbmdfRGlnaXRWYWx1ZVsyNTZdID0gewotCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAotCTAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAotCTI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAotCTI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAotCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAorICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAorICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorICAgIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAogfTsKIAogLyogKnN0ciBwb2ludHMgdG8gdGhlIGZpcnN0IGRpZ2l0IGluIGEgc3RyaW5nIG9mIGJhc2UgYGJhc2VgIGRpZ2l0cy4gIGJhc2UKQEAgLTE2NDAsMTE1ICsxNjQwLDExNSBAQAogc3RhdGljIFB5TG9uZ09iamVjdCAqCiBsb25nX2Zyb21fYmluYXJ5X2Jhc2UoY2hhciAqKnN0ciwgaW50IGJhc2UpCiB7Ci0JY2hhciAqcCA9ICpzdHI7Ci0JY2hhciAqc3RhcnQgPSBwOwotCWludCBiaXRzX3Blcl9jaGFyOwotCVB5X3NzaXplX3QgbjsKLQlQeUxvbmdPYmplY3QgKno7Ci0JdHdvZGlnaXRzIGFjY3VtOwotCWludCBiaXRzX2luX2FjY3VtOwotCWRpZ2l0ICpwZGlnaXQ7CisgICAgY2hhciAqcCA9ICpzdHI7CisgICAgY2hhciAqc3RhcnQgPSBwOworICAgIGludCBiaXRzX3Blcl9jaGFyOworICAgIFB5X3NzaXplX3QgbjsKKyAgICBQeUxvbmdPYmplY3QgKno7CisgICAgdHdvZGlnaXRzIGFjY3VtOworICAgIGludCBiaXRzX2luX2FjY3VtOworICAgIGRpZ2l0ICpwZGlnaXQ7CiAKLQlhc3NlcnQoYmFzZSA+PSAyICYmIGJhc2UgPD0gMzIgJiYgKGJhc2UgJiAoYmFzZSAtIDEpKSA9PSAwKTsKLQluID0gYmFzZTsKLQlmb3IgKGJpdHNfcGVyX2NoYXIgPSAtMTsgbjsgKytiaXRzX3Blcl9jaGFyKQotCQluID4+PSAxOwotCS8qIG4gPC0gdG90YWwgIyBvZiBiaXRzIG5lZWRlZCwgd2hpbGUgc2V0dGluZyBwIHRvIGVuZC1vZi1zdHJpbmcgKi8KLQl3aGlsZSAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpwKV0gPCBiYXNlKQotCQkrK3A7Ci0JKnN0ciA9IHA7Ci0JLyogbiA8LSAjIG9mIFB5dGhvbiBkaWdpdHMgbmVlZGVkLCA9IGNlaWxpbmcobi9QeUxvbmdfU0hJRlQpLiAqLwotCW4gPSAocCAtIHN0YXJ0KSAqIGJpdHNfcGVyX2NoYXIgKyBQeUxvbmdfU0hJRlQgLSAxOwotCWlmIChuIC8gYml0c19wZXJfY2hhciA8IHAgLSBzdGFydCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibG9uZyBzdHJpbmcgdG9vIGxhcmdlIHRvIGNvbnZlcnQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW4gPSBuIC8gUHlMb25nX1NISUZUOwotCXogPSBfUHlMb25nX05ldyhuKTsKLQlpZiAoeiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBSZWFkIHN0cmluZyBmcm9tIHJpZ2h0LCBhbmQgZmlsbCBpbiBsb25nIGZyb20gbGVmdDsgaS5lLiwKLQkgKiBmcm9tIGxlYXN0IHRvIG1vc3Qgc2lnbmlmaWNhbnQgaW4gYm90aC4KLQkgKi8KLQlhY2N1bSA9IDA7Ci0JYml0c19pbl9hY2N1bSA9IDA7Ci0JcGRpZ2l0ID0gei0+b2JfZGlnaXQ7Ci0Jd2hpbGUgKC0tcCA+PSBzdGFydCkgewotCQlpbnQgayA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqcCldOwotCQlhc3NlcnQoayA+PSAwICYmIGsgPCBiYXNlKTsKLQkJYWNjdW0gfD0gKHR3b2RpZ2l0cylrIDw8IGJpdHNfaW5fYWNjdW07Ci0JCWJpdHNfaW5fYWNjdW0gKz0gYml0c19wZXJfY2hhcjsKLQkJaWYgKGJpdHNfaW5fYWNjdW0gPj0gUHlMb25nX1NISUZUKSB7Ci0JCQkqcGRpZ2l0KysgPSAoZGlnaXQpKGFjY3VtICYgUHlMb25nX01BU0spOwotCQkJYXNzZXJ0KHBkaWdpdCAtIHotPm9iX2RpZ2l0IDw9IG4pOwotCQkJYWNjdW0gPj49IFB5TG9uZ19TSElGVDsKLQkJCWJpdHNfaW5fYWNjdW0gLT0gUHlMb25nX1NISUZUOwotCQkJYXNzZXJ0KGJpdHNfaW5fYWNjdW0gPCBQeUxvbmdfU0hJRlQpOwotCQl9Ci0JfQotCWlmIChiaXRzX2luX2FjY3VtKSB7Ci0JCWFzc2VydChiaXRzX2luX2FjY3VtIDw9IFB5TG9uZ19TSElGVCk7Ci0JCSpwZGlnaXQrKyA9IChkaWdpdClhY2N1bTsKLQkJYXNzZXJ0KHBkaWdpdCAtIHotPm9iX2RpZ2l0IDw9IG4pOwotCX0KLQl3aGlsZSAocGRpZ2l0IC0gei0+b2JfZGlnaXQgPCBuKQotCQkqcGRpZ2l0KysgPSAwOwotCXJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICBhc3NlcnQoYmFzZSA+PSAyICYmIGJhc2UgPD0gMzIgJiYgKGJhc2UgJiAoYmFzZSAtIDEpKSA9PSAwKTsKKyAgICBuID0gYmFzZTsKKyAgICBmb3IgKGJpdHNfcGVyX2NoYXIgPSAtMTsgbjsgKytiaXRzX3Blcl9jaGFyKQorICAgICAgICBuID4+PSAxOworICAgIC8qIG4gPC0gdG90YWwgIyBvZiBiaXRzIG5lZWRlZCwgd2hpbGUgc2V0dGluZyBwIHRvIGVuZC1vZi1zdHJpbmcgKi8KKyAgICB3aGlsZSAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpwKV0gPCBiYXNlKQorICAgICAgICArK3A7CisgICAgKnN0ciA9IHA7CisgICAgLyogbiA8LSAjIG9mIFB5dGhvbiBkaWdpdHMgbmVlZGVkLCA9IGNlaWxpbmcobi9QeUxvbmdfU0hJRlQpLiAqLworICAgIG4gPSAocCAtIHN0YXJ0KSAqIGJpdHNfcGVyX2NoYXIgKyBQeUxvbmdfU0hJRlQgLSAxOworICAgIGlmIChuIC8gYml0c19wZXJfY2hhciA8IHAgLSBzdGFydCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsb25nIHN0cmluZyB0b28gbGFyZ2UgdG8gY29udmVydCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbiA9IG4gLyBQeUxvbmdfU0hJRlQ7CisgICAgeiA9IF9QeUxvbmdfTmV3KG4pOworICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIFJlYWQgc3RyaW5nIGZyb20gcmlnaHQsIGFuZCBmaWxsIGluIGxvbmcgZnJvbSBsZWZ0OyBpLmUuLAorICAgICAqIGZyb20gbGVhc3QgdG8gbW9zdCBzaWduaWZpY2FudCBpbiBib3RoLgorICAgICAqLworICAgIGFjY3VtID0gMDsKKyAgICBiaXRzX2luX2FjY3VtID0gMDsKKyAgICBwZGlnaXQgPSB6LT5vYl9kaWdpdDsKKyAgICB3aGlsZSAoLS1wID49IHN0YXJ0KSB7CisgICAgICAgIGludCBrID0gX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpwKV07CisgICAgICAgIGFzc2VydChrID49IDAgJiYgayA8IGJhc2UpOworICAgICAgICBhY2N1bSB8PSAodHdvZGlnaXRzKWsgPDwgYml0c19pbl9hY2N1bTsKKyAgICAgICAgYml0c19pbl9hY2N1bSArPSBiaXRzX3Blcl9jaGFyOworICAgICAgICBpZiAoYml0c19pbl9hY2N1bSA+PSBQeUxvbmdfU0hJRlQpIHsKKyAgICAgICAgICAgICpwZGlnaXQrKyA9IChkaWdpdCkoYWNjdW0gJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICBhc3NlcnQocGRpZ2l0IC0gei0+b2JfZGlnaXQgPD0gbik7CisgICAgICAgICAgICBhY2N1bSA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgYml0c19pbl9hY2N1bSAtPSBQeUxvbmdfU0hJRlQ7CisgICAgICAgICAgICBhc3NlcnQoYml0c19pbl9hY2N1bSA8IFB5TG9uZ19TSElGVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJpdHNfaW5fYWNjdW0pIHsKKyAgICAgICAgYXNzZXJ0KGJpdHNfaW5fYWNjdW0gPD0gUHlMb25nX1NISUZUKTsKKyAgICAgICAgKnBkaWdpdCsrID0gKGRpZ2l0KWFjY3VtOworICAgICAgICBhc3NlcnQocGRpZ2l0IC0gei0+b2JfZGlnaXQgPD0gbik7CisgICAgfQorICAgIHdoaWxlIChwZGlnaXQgLSB6LT5vYl9kaWdpdCA8IG4pCisgICAgICAgICpwZGlnaXQrKyA9IDA7CisgICAgcmV0dXJuIGxvbmdfbm9ybWFsaXplKHopOwogfQogCiBQeU9iamVjdCAqCiBQeUxvbmdfRnJvbVN0cmluZyhjaGFyICpzdHIsIGNoYXIgKipwZW5kLCBpbnQgYmFzZSkKIHsKLQlpbnQgc2lnbiA9IDE7Ci0JY2hhciAqc3RhcnQsICpvcmlnX3N0ciA9IHN0cjsKLQlQeUxvbmdPYmplY3QgKno7Ci0JUHlPYmplY3QgKnN0cm9iaiwgKnN0cnJlcHI7Ci0JUHlfc3NpemVfdCBzbGVuOworICAgIGludCBzaWduID0gMTsKKyAgICBjaGFyICpzdGFydCwgKm9yaWdfc3RyID0gc3RyOworICAgIFB5TG9uZ09iamVjdCAqejsKKyAgICBQeU9iamVjdCAqc3Ryb2JqLCAqc3RycmVwcjsKKyAgICBQeV9zc2l6ZV90IHNsZW47CiAKLQlpZiAoKGJhc2UgIT0gMCAmJiBiYXNlIDwgMikgfHwgYmFzZSA+IDM2KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJsb25nKCkgYXJnIDIgbXVzdCBiZSA+PSAyIGFuZCA8PSAzNiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jd2hpbGUgKCpzdHIgIT0gJ1wwJyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzdHIpKSkKLQkJc3RyKys7Ci0JaWYgKCpzdHIgPT0gJysnKQotCQkrK3N0cjsKLQllbHNlIGlmICgqc3RyID09ICctJykgewotCQkrK3N0cjsKLQkJc2lnbiA9IC0xOwotCX0KLQl3aGlsZSAoKnN0ciAhPSAnXDAnICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnN0cikpKQotCQlzdHIrKzsKLQlpZiAoYmFzZSA9PSAwKSB7Ci0JCS8qIE5vIGJhc2UgZ2l2ZW4uICBEZWR1Y2UgdGhlIGJhc2UgZnJvbSB0aGUgY29udGVudHMKLQkJICAgb2YgdGhlIHN0cmluZyAqLwotCQlpZiAoc3RyWzBdICE9ICcwJykKLQkJCWJhc2UgPSAxMDsKLQkJZWxzZSBpZiAoc3RyWzFdID09ICd4JyB8fCBzdHJbMV0gPT0gJ1gnKQotCQkJYmFzZSA9IDE2OwotCQllbHNlIGlmIChzdHJbMV0gPT0gJ28nIHx8IHN0clsxXSA9PSAnTycpCi0JCQliYXNlID0gODsKLQkJZWxzZSBpZiAoc3RyWzFdID09ICdiJyB8fCBzdHJbMV0gPT0gJ0InKQotCQkJYmFzZSA9IDI7Ci0JCWVsc2UKLQkJCS8qICJvbGQiIChDLXN0eWxlKSBvY3RhbCBsaXRlcmFsLCBzdGlsbCB2YWxpZCBpbgotCQkJICAgMi54LCBhbHRob3VnaCBpbGxlZ2FsIGluIDMueCAqLwotCQkJYmFzZSA9IDg7Ci0JfQotCS8qIFdoZXRoZXIgb3Igbm90IHdlIHdlcmUgZGVkdWNpbmcgdGhlIGJhc2UsIHNraXAgbGVhZGluZyBjaGFycwotCSAgIGFzIG5lZWRlZCAqLwotCWlmIChzdHJbMF0gPT0gJzAnICYmCi0JICAgICgoYmFzZSA9PSAxNiAmJiAoc3RyWzFdID09ICd4JyB8fCBzdHJbMV0gPT0gJ1gnKSkgfHwKLQkgICAgIChiYXNlID09IDggICYmIChzdHJbMV0gPT0gJ28nIHx8IHN0clsxXSA9PSAnTycpKSB8fAotCSAgICAgKGJhc2UgPT0gMiAgJiYgKHN0clsxXSA9PSAnYicgfHwgc3RyWzFdID09ICdCJykpKSkKLQkJc3RyICs9IDI7CisgICAgaWYgKChiYXNlICE9IDAgJiYgYmFzZSA8IDIpIHx8IGJhc2UgPiAzNikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsb25nKCkgYXJnIDIgbXVzdCBiZSA+PSAyIGFuZCA8PSAzNiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgd2hpbGUgKCpzdHIgIT0gJ1wwJyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzdHIpKSkKKyAgICAgICAgc3RyKys7CisgICAgaWYgKCpzdHIgPT0gJysnKQorICAgICAgICArK3N0cjsKKyAgICBlbHNlIGlmICgqc3RyID09ICctJykgeworICAgICAgICArK3N0cjsKKyAgICAgICAgc2lnbiA9IC0xOworICAgIH0KKyAgICB3aGlsZSAoKnN0ciAhPSAnXDAnICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnN0cikpKQorICAgICAgICBzdHIrKzsKKyAgICBpZiAoYmFzZSA9PSAwKSB7CisgICAgICAgIC8qIE5vIGJhc2UgZ2l2ZW4uICBEZWR1Y2UgdGhlIGJhc2UgZnJvbSB0aGUgY29udGVudHMKKyAgICAgICAgICAgb2YgdGhlIHN0cmluZyAqLworICAgICAgICBpZiAoc3RyWzBdICE9ICcwJykKKyAgICAgICAgICAgIGJhc2UgPSAxMDsKKyAgICAgICAgZWxzZSBpZiAoc3RyWzFdID09ICd4JyB8fCBzdHJbMV0gPT0gJ1gnKQorICAgICAgICAgICAgYmFzZSA9IDE2OworICAgICAgICBlbHNlIGlmIChzdHJbMV0gPT0gJ28nIHx8IHN0clsxXSA9PSAnTycpCisgICAgICAgICAgICBiYXNlID0gODsKKyAgICAgICAgZWxzZSBpZiAoc3RyWzFdID09ICdiJyB8fCBzdHJbMV0gPT0gJ0InKQorICAgICAgICAgICAgYmFzZSA9IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8qICJvbGQiIChDLXN0eWxlKSBvY3RhbCBsaXRlcmFsLCBzdGlsbCB2YWxpZCBpbgorICAgICAgICAgICAgICAgMi54LCBhbHRob3VnaCBpbGxlZ2FsIGluIDMueCAqLworICAgICAgICAgICAgYmFzZSA9IDg7CisgICAgfQorICAgIC8qIFdoZXRoZXIgb3Igbm90IHdlIHdlcmUgZGVkdWNpbmcgdGhlIGJhc2UsIHNraXAgbGVhZGluZyBjaGFycworICAgICAgIGFzIG5lZWRlZCAqLworICAgIGlmIChzdHJbMF0gPT0gJzAnICYmCisgICAgICAgICgoYmFzZSA9PSAxNiAmJiAoc3RyWzFdID09ICd4JyB8fCBzdHJbMV0gPT0gJ1gnKSkgfHwKKyAgICAgICAgIChiYXNlID09IDggICYmIChzdHJbMV0gPT0gJ28nIHx8IHN0clsxXSA9PSAnTycpKSB8fAorICAgICAgICAgKGJhc2UgPT0gMiAgJiYgKHN0clsxXSA9PSAnYicgfHwgc3RyWzFdID09ICdCJykpKSkKKyAgICAgICAgc3RyICs9IDI7CiAKLQlzdGFydCA9IHN0cjsKLQlpZiAoKGJhc2UgJiAoYmFzZSAtIDEpKSA9PSAwKQotCQl6ID0gbG9uZ19mcm9tX2JpbmFyeV9iYXNlKCZzdHIsIGJhc2UpOwotCWVsc2UgeworICAgIHN0YXJ0ID0gc3RyOworICAgIGlmICgoYmFzZSAmIChiYXNlIC0gMSkpID09IDApCisgICAgICAgIHogPSBsb25nX2Zyb21fYmluYXJ5X2Jhc2UoJnN0ciwgYmFzZSk7CisgICAgZWxzZSB7CiAvKioqCiBCaW5hcnkgYmFzZXMgY2FuIGJlIGNvbnZlcnRlZCBpbiB0aW1lIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIGRpZ2l0cywgYmVjYXVzZQogUHl0aG9uJ3MgcmVwcmVzZW50YXRpb24gYmFzZSBpcyBiaW5hcnkuICBPdGhlciBiYXNlcyAoaW5jbHVkaW5nIGRlY2ltYWwhKSB1c2UKQEAgLTE4MzQsMjI1ICsxODM0LDIyNSBAQAoganVzdCAxIGRpZ2l0IGF0IHRoZSBzdGFydCwgc28gdGhhdCB0aGUgY29weWluZyBjb2RlIHdhcyBleGVyY2lzZWQgZm9yIGV2ZXJ5CiBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0LgogKioqLwotCQlyZWdpc3RlciB0d29kaWdpdHMgYzsJLyogY3VycmVudCBpbnB1dCBjaGFyYWN0ZXIgKi8KLQkJUHlfc3NpemVfdCBzaXplX3o7Ci0JCWludCBpOwotCQlpbnQgY29udndpZHRoOwotCQl0d29kaWdpdHMgY29udm11bHRtYXgsIGNvbnZtdWx0OwotCQlkaWdpdCAqcHosICpwenN0b3A7Ci0JCWNoYXIqIHNjYW47CisgICAgICAgIHJlZ2lzdGVyIHR3b2RpZ2l0cyBjOyAgICAgICAgICAgLyogY3VycmVudCBpbnB1dCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgUHlfc3NpemVfdCBzaXplX3o7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgY29udndpZHRoOworICAgICAgICB0d29kaWdpdHMgY29udm11bHRtYXgsIGNvbnZtdWx0OworICAgICAgICBkaWdpdCAqcHosICpwenN0b3A7CisgICAgICAgIGNoYXIqIHNjYW47CiAKLQkJc3RhdGljIGRvdWJsZSBsb2dfYmFzZV9QeUxvbmdfQkFTRVszN10gPSB7MC4wZTAsfTsKLQkJc3RhdGljIGludCBjb252d2lkdGhfYmFzZVszN10gPSB7MCx9OwotCQlzdGF0aWMgdHdvZGlnaXRzIGNvbnZtdWx0bWF4X2Jhc2VbMzddID0gezAsfTsKKyAgICAgICAgc3RhdGljIGRvdWJsZSBsb2dfYmFzZV9QeUxvbmdfQkFTRVszN10gPSB7MC4wZTAsfTsKKyAgICAgICAgc3RhdGljIGludCBjb252d2lkdGhfYmFzZVszN10gPSB7MCx9OworICAgICAgICBzdGF0aWMgdHdvZGlnaXRzIGNvbnZtdWx0bWF4X2Jhc2VbMzddID0gezAsfTsKIAotCQlpZiAobG9nX2Jhc2VfUHlMb25nX0JBU0VbYmFzZV0gPT0gMC4wKSB7Ci0JCQl0d29kaWdpdHMgY29udm1heCA9IGJhc2U7Ci0JCQlpbnQgaSA9IDE7CisgICAgICAgIGlmIChsb2dfYmFzZV9QeUxvbmdfQkFTRVtiYXNlXSA9PSAwLjApIHsKKyAgICAgICAgICAgIHR3b2RpZ2l0cyBjb252bWF4ID0gYmFzZTsKKyAgICAgICAgICAgIGludCBpID0gMTsKIAotCQkJbG9nX2Jhc2VfUHlMb25nX0JBU0VbYmFzZV0gPSBsb2coKGRvdWJsZSliYXNlKSAvCi0JCQkJCQlsb2coKGRvdWJsZSlQeUxvbmdfQkFTRSk7Ci0JCQlmb3IgKDs7KSB7Ci0JCQkJdHdvZGlnaXRzIG5leHQgPSBjb252bWF4ICogYmFzZTsKLQkJCQlpZiAobmV4dCA+IFB5TG9uZ19CQVNFKQotCQkJCQlicmVhazsKLQkJCQljb252bWF4ID0gbmV4dDsKLQkJCQkrK2k7Ci0JCQl9Ci0JCQljb252bXVsdG1heF9iYXNlW2Jhc2VdID0gY29udm1heDsKLQkJCWFzc2VydChpID4gMCk7Ci0JCQljb252d2lkdGhfYmFzZVtiYXNlXSA9IGk7Ci0JCX0KKyAgICAgICAgICAgIGxvZ19iYXNlX1B5TG9uZ19CQVNFW2Jhc2VdID0gbG9nKChkb3VibGUpYmFzZSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKChkb3VibGUpUHlMb25nX0JBU0UpOworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIHR3b2RpZ2l0cyBuZXh0ID0gY29udm1heCAqIGJhc2U7CisgICAgICAgICAgICAgICAgaWYgKG5leHQgPiBQeUxvbmdfQkFTRSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY29udm1heCA9IG5leHQ7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udm11bHRtYXhfYmFzZVtiYXNlXSA9IGNvbnZtYXg7CisgICAgICAgICAgICBhc3NlcnQoaSA+IDApOworICAgICAgICAgICAgY29udndpZHRoX2Jhc2VbYmFzZV0gPSBpOworICAgICAgICB9CiAKLQkJLyogRmluZCBsZW5ndGggb2YgdGhlIHN0cmluZyBvZiBudW1lcmljIGNoYXJhY3RlcnMuICovCi0JCXNjYW4gPSBzdHI7Ci0JCXdoaWxlIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnNjYW4pXSA8IGJhc2UpCi0JCQkrK3NjYW47CisgICAgICAgIC8qIEZpbmQgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgb2YgbnVtZXJpYyBjaGFyYWN0ZXJzLiAqLworICAgICAgICBzY2FuID0gc3RyOworICAgICAgICB3aGlsZSAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzY2FuKV0gPCBiYXNlKQorICAgICAgICAgICAgKytzY2FuOwogCi0JCS8qIENyZWF0ZSBhIGxvbmcgb2JqZWN0IHRoYXQgY2FuIGNvbnRhaW4gdGhlIGxhcmdlc3QgcG9zc2libGUKLQkJICogaW50ZWdlciB3aXRoIHRoaXMgYmFzZSBhbmQgbGVuZ3RoLiAgTm90ZSB0aGF0IHRoZXJlJ3Mgbm8KLQkJICogbmVlZCB0byBpbml0aWFsaXplIHotPm9iX2RpZ2l0IC0tIG5vIHNsb3QgaXMgcmVhZCB1cCBiZWZvcmUKLQkJICogYmVpbmcgc3RvcmVkIGludG8uCi0JCSAqLwotCQlzaXplX3ogPSAoUHlfc3NpemVfdCkoKHNjYW4gLSBzdHIpICogbG9nX2Jhc2VfUHlMb25nX0JBU0VbYmFzZV0pICsgMTsKLQkJLyogVW5jb21tZW50IG5leHQgbGluZSB0byB0ZXN0IGV4Y2VlZGluZ2x5IHJhcmUgY29weSBjb2RlICovCi0JCS8qIHNpemVfeiA9IDE7ICovCi0JCWFzc2VydChzaXplX3ogPiAwKTsKLQkJeiA9IF9QeUxvbmdfTmV3KHNpemVfeik7Ci0JCWlmICh6ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlfU0laRSh6KSA9IDA7CisgICAgICAgIC8qIENyZWF0ZSBhIGxvbmcgb2JqZWN0IHRoYXQgY2FuIGNvbnRhaW4gdGhlIGxhcmdlc3QgcG9zc2libGUKKyAgICAgICAgICogaW50ZWdlciB3aXRoIHRoaXMgYmFzZSBhbmQgbGVuZ3RoLiAgTm90ZSB0aGF0IHRoZXJlJ3Mgbm8KKyAgICAgICAgICogbmVlZCB0byBpbml0aWFsaXplIHotPm9iX2RpZ2l0IC0tIG5vIHNsb3QgaXMgcmVhZCB1cCBiZWZvcmUKKyAgICAgICAgICogYmVpbmcgc3RvcmVkIGludG8uCisgICAgICAgICAqLworICAgICAgICBzaXplX3ogPSAoUHlfc3NpemVfdCkoKHNjYW4gLSBzdHIpICogbG9nX2Jhc2VfUHlMb25nX0JBU0VbYmFzZV0pICsgMTsKKyAgICAgICAgLyogVW5jb21tZW50IG5leHQgbGluZSB0byB0ZXN0IGV4Y2VlZGluZ2x5IHJhcmUgY29weSBjb2RlICovCisgICAgICAgIC8qIHNpemVfeiA9IDE7ICovCisgICAgICAgIGFzc2VydChzaXplX3ogPiAwKTsKKyAgICAgICAgeiA9IF9QeUxvbmdfTmV3KHNpemVfeik7CisgICAgICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfU0laRSh6KSA9IDA7CiAKLQkJLyogYGNvbnZ3aWR0aGAgY29uc2VjdXRpdmUgaW5wdXQgZGlnaXRzIGFyZSB0cmVhdGVkIGFzIGEgc2luZ2xlCi0JCSAqIGRpZ2l0IGluIGJhc2UgYGNvbnZtdWx0bWF4YC4KLQkJICovCi0JCWNvbnZ3aWR0aCA9IGNvbnZ3aWR0aF9iYXNlW2Jhc2VdOwotCQljb252bXVsdG1heCA9IGNvbnZtdWx0bWF4X2Jhc2VbYmFzZV07CisgICAgICAgIC8qIGBjb252d2lkdGhgIGNvbnNlY3V0aXZlIGlucHV0IGRpZ2l0cyBhcmUgdHJlYXRlZCBhcyBhIHNpbmdsZQorICAgICAgICAgKiBkaWdpdCBpbiBiYXNlIGBjb252bXVsdG1heGAuCisgICAgICAgICAqLworICAgICAgICBjb252d2lkdGggPSBjb252d2lkdGhfYmFzZVtiYXNlXTsKKyAgICAgICAgY29udm11bHRtYXggPSBjb252bXVsdG1heF9iYXNlW2Jhc2VdOwogCi0JCS8qIFdvcmsgOy0pICovCi0JCXdoaWxlIChzdHIgPCBzY2FuKSB7Ci0JCQkvKiBncmFiIHVwIHRvIGNvbnZ3aWR0aCBkaWdpdHMgZnJvbSB0aGUgaW5wdXQgc3RyaW5nICovCi0JCQljID0gKGRpZ2l0KV9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc3RyKyspXTsKLQkJCWZvciAoaSA9IDE7IGkgPCBjb252d2lkdGggJiYgc3RyICE9IHNjYW47ICsraSwgKytzdHIpIHsKLQkJCQljID0gKHR3b2RpZ2l0cykoYyAqICBiYXNlICsKLQkJCQkJX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzdHIpXSk7Ci0JCQkJYXNzZXJ0KGMgPCBQeUxvbmdfQkFTRSk7Ci0JCQl9CisgICAgICAgIC8qIFdvcmsgOy0pICovCisgICAgICAgIHdoaWxlIChzdHIgPCBzY2FuKSB7CisgICAgICAgICAgICAvKiBncmFiIHVwIHRvIGNvbnZ3aWR0aCBkaWdpdHMgZnJvbSB0aGUgaW5wdXQgc3RyaW5nICovCisgICAgICAgICAgICBjID0gKGRpZ2l0KV9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc3RyKyspXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBjb252d2lkdGggJiYgc3RyICE9IHNjYW47ICsraSwgKytzdHIpIHsKKyAgICAgICAgICAgICAgICBjID0gKHR3b2RpZ2l0cykoYyAqICBiYXNlICsKKyAgICAgICAgICAgICAgICAgICAgX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzdHIpXSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGMgPCBQeUxvbmdfQkFTRSk7CisgICAgICAgICAgICB9CiAKLQkJCWNvbnZtdWx0ID0gY29udm11bHRtYXg7Ci0JCQkvKiBDYWxjdWxhdGUgdGhlIHNoaWZ0IG9ubHkgaWYgd2UgY291bGRuJ3QgZ2V0Ci0JCQkgKiBjb252d2lkdGggZGlnaXRzLgotCQkJICovCi0JCQlpZiAoaSAhPSBjb252d2lkdGgpIHsKLQkJCQljb252bXVsdCA9IGJhc2U7Ci0JCQkJZm9yICggOyBpID4gMTsgLS1pKQotCQkJCQljb252bXVsdCAqPSBiYXNlOwotCQkJfQorICAgICAgICAgICAgY29udm11bHQgPSBjb252bXVsdG1heDsKKyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgc2hpZnQgb25seSBpZiB3ZSBjb3VsZG4ndCBnZXQKKyAgICAgICAgICAgICAqIGNvbnZ3aWR0aCBkaWdpdHMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChpICE9IGNvbnZ3aWR0aCkgeworICAgICAgICAgICAgICAgIGNvbnZtdWx0ID0gYmFzZTsKKyAgICAgICAgICAgICAgICBmb3IgKCA7IGkgPiAxOyAtLWkpCisgICAgICAgICAgICAgICAgICAgIGNvbnZtdWx0ICo9IGJhc2U7CisgICAgICAgICAgICB9CiAKLQkJCS8qIE11bHRpcGx5IHogYnkgY29udm11bHQsIGFuZCBhZGQgYy4gKi8KLQkJCXB6ID0gei0+b2JfZGlnaXQ7Ci0JCQlwenN0b3AgPSBweiArIFB5X1NJWkUoeik7Ci0JCQlmb3IgKDsgcHogPCBwenN0b3A7ICsrcHopIHsKLQkJCQljICs9ICh0d29kaWdpdHMpKnB6ICogY29udm11bHQ7Ci0JCQkJKnB6ID0gKGRpZ2l0KShjICYgUHlMb25nX01BU0spOwotCQkJCWMgPj49IFB5TG9uZ19TSElGVDsKLQkJCX0KLQkJCS8qIGNhcnJ5IG9mZiB0aGUgY3VycmVudCBlbmQ/ICovCi0JCQlpZiAoYykgewotCQkJCWFzc2VydChjIDwgUHlMb25nX0JBU0UpOwotCQkJCWlmIChQeV9TSVpFKHopIDwgc2l6ZV96KSB7Ci0JCQkJCSpweiA9IChkaWdpdCljOwotCQkJCQkrK1B5X1NJWkUoeik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlQeUxvbmdPYmplY3QgKnRtcDsKLQkJCQkJLyogRXh0cmVtZWx5IHJhcmUuICBHZXQgbW9yZSBzcGFjZS4gKi8KLQkJCQkJYXNzZXJ0KFB5X1NJWkUoeikgPT0gc2l6ZV96KTsKLQkJCQkJdG1wID0gX1B5TG9uZ19OZXcoc2l6ZV96ICsgMSk7Ci0JCQkJCWlmICh0bXAgPT0gTlVMTCkgewotCQkJCQkJUHlfREVDUkVGKHopOwotCQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJCX0KLQkJCQkJbWVtY3B5KHRtcC0+b2JfZGlnaXQsCi0JCQkJCSAgICAgICB6LT5vYl9kaWdpdCwKLQkJCQkJICAgICAgIHNpemVvZihkaWdpdCkgKiBzaXplX3opOwotCQkJCQlQeV9ERUNSRUYoeik7Ci0JCQkJCXogPSB0bXA7Ci0JCQkJCXotPm9iX2RpZ2l0W3NpemVfel0gPSAoZGlnaXQpYzsKLQkJCQkJKytzaXplX3o7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWlmICh6ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChzdHIgPT0gc3RhcnQpCi0JCWdvdG8gb25FcnJvcjsKLQlpZiAoc2lnbiA8IDApCi0JCVB5X1NJWkUoeikgPSAtKFB5X1NJWkUoeikpOwotCWlmICgqc3RyID09ICdMJyB8fCAqc3RyID09ICdsJykKLQkJc3RyKys7Ci0Jd2hpbGUgKCpzdHIgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCi0JCXN0cisrOwotCWlmICgqc3RyICE9ICdcMCcpCi0JCWdvdG8gb25FcnJvcjsKLQlpZiAocGVuZCkKLQkJKnBlbmQgPSBzdHI7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSB6OworICAgICAgICAgICAgLyogTXVsdGlwbHkgeiBieSBjb252bXVsdCwgYW5kIGFkZCBjLiAqLworICAgICAgICAgICAgcHogPSB6LT5vYl9kaWdpdDsKKyAgICAgICAgICAgIHB6c3RvcCA9IHB6ICsgUHlfU0laRSh6KTsKKyAgICAgICAgICAgIGZvciAoOyBweiA8IHB6c3RvcDsgKytweikgeworICAgICAgICAgICAgICAgIGMgKz0gKHR3b2RpZ2l0cykqcHogKiBjb252bXVsdDsKKyAgICAgICAgICAgICAgICAqcHogPSAoZGlnaXQpKGMgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICAgICAgYyA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY2Fycnkgb2ZmIHRoZSBjdXJyZW50IGVuZD8gKi8KKyAgICAgICAgICAgIGlmIChjKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGMgPCBQeUxvbmdfQkFTRSk7CisgICAgICAgICAgICAgICAgaWYgKFB5X1NJWkUoeikgPCBzaXplX3opIHsKKyAgICAgICAgICAgICAgICAgICAgKnB6ID0gKGRpZ2l0KWM7CisgICAgICAgICAgICAgICAgICAgICsrUHlfU0laRSh6KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5TG9uZ09iamVjdCAqdG1wOworICAgICAgICAgICAgICAgICAgICAvKiBFeHRyZW1lbHkgcmFyZS4gIEdldCBtb3JlIHNwYWNlLiAqLworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoUHlfU0laRSh6KSA9PSBzaXplX3opOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBfUHlMb25nX05ldyhzaXplX3ogKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkodG1wLT5vYl9kaWdpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHotPm9iX2RpZ2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRpZ2l0KSAqIHNpemVfeik7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih6KTsKKyAgICAgICAgICAgICAgICAgICAgeiA9IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgei0+b2JfZGlnaXRbc2l6ZV96XSA9IChkaWdpdCljOworICAgICAgICAgICAgICAgICAgICArK3NpemVfejsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHN0ciA9PSBzdGFydCkKKyAgICAgICAgZ290byBvbkVycm9yOworICAgIGlmIChzaWduIDwgMCkKKyAgICAgICAgUHlfU0laRSh6KSA9IC0oUHlfU0laRSh6KSk7CisgICAgaWYgKCpzdHIgPT0gJ0wnIHx8ICpzdHIgPT0gJ2wnKQorICAgICAgICBzdHIrKzsKKyAgICB3aGlsZSAoKnN0ciAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzdHIpKSkKKyAgICAgICAgc3RyKys7CisgICAgaWYgKCpzdHIgIT0gJ1wwJykKKyAgICAgICAgZ290byBvbkVycm9yOworICAgIGlmIChwZW5kKQorICAgICAgICAqcGVuZCA9IHN0cjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHo7CiAKICBvbkVycm9yOgotCVB5X1hERUNSRUYoeik7Ci0Jc2xlbiA9IHN0cmxlbihvcmlnX3N0cikgPCAyMDAgPyBzdHJsZW4ob3JpZ19zdHIpIDogMjAwOwotCXN0cm9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG9yaWdfc3RyLCBzbGVuKTsKLQlpZiAoc3Ryb2JqID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXN0cnJlcHIgPSBQeU9iamVjdF9SZXByKHN0cm9iaik7Ci0JUHlfREVDUkVGKHN0cm9iaik7Ci0JaWYgKHN0cnJlcHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCSAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgbG9uZygpIHdpdGggYmFzZSAlZDogJXMiLAotCQkgICAgIGJhc2UsIFB5U3RyaW5nX0FTX1NUUklORyhzdHJyZXByKSk7Ci0JUHlfREVDUkVGKHN0cnJlcHIpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYoeik7CisgICAgc2xlbiA9IHN0cmxlbihvcmlnX3N0cikgPCAyMDAgPyBzdHJsZW4ob3JpZ19zdHIpIDogMjAwOworICAgIHN0cm9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG9yaWdfc3RyLCBzbGVuKTsKKyAgICBpZiAoc3Ryb2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0cnJlcHIgPSBQeU9iamVjdF9SZXByKHN0cm9iaik7CisgICAgUHlfREVDUkVGKHN0cm9iaik7CisgICAgaWYgKHN0cnJlcHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGxvbmcoKSB3aXRoIGJhc2UgJWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgYmFzZSwgUHlTdHJpbmdfQVNfU1RSSU5HKHN0cnJlcHIpKTsKKyAgICBQeV9ERUNSRUYoc3RycmVwcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiBQeU9iamVjdCAqCiBQeUxvbmdfRnJvbVVuaWNvZGUoUHlfVU5JQ09ERSAqdSwgUHlfc3NpemVfdCBsZW5ndGgsIGludCBiYXNlKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JY2hhciAqYnVmZmVyID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobGVuZ3RoKzEpOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqYnVmZmVyID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobGVuZ3RoKzEpOwogCi0JaWYgKGJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsKHUsIGxlbmd0aCwgYnVmZmVyLCBOVUxMKSkgewotCQlQeU1lbV9GUkVFKGJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHQgPSBQeUxvbmdfRnJvbVN0cmluZyhidWZmZXIsIE5VTEwsIGJhc2UpOwotCVB5TWVtX0ZSRUUoYnVmZmVyKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChQeVVuaWNvZGVfRW5jb2RlRGVjaW1hbCh1LCBsZW5ndGgsIGJ1ZmZlciwgTlVMTCkpIHsKKyAgICAgICAgUHlNZW1fRlJFRShidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21TdHJpbmcoYnVmZmVyLCBOVUxMLCBiYXNlKTsKKyAgICBQeU1lbV9GUkVFKGJ1ZmZlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KICNlbmRpZgogCiAvKiBmb3J3YXJkICovCiBzdGF0aWMgUHlMb25nT2JqZWN0ICp4X2RpdnJlbQotCShQeUxvbmdPYmplY3QgKiwgUHlMb25nT2JqZWN0ICosIFB5TG9uZ09iamVjdCAqKik7CisgICAgKFB5TG9uZ09iamVjdCAqLCBQeUxvbmdPYmplY3QgKiwgUHlMb25nT2JqZWN0ICoqKTsKIHN0YXRpYyBQeU9iamVjdCAqbG9uZ19sb25nKFB5T2JqZWN0ICp2KTsKIAogLyogTG9uZyBkaXZpc2lvbiB3aXRoIHJlbWFpbmRlciwgdG9wLWxldmVsIHJvdXRpbmUgKi8KIAogc3RhdGljIGludAogbG9uZ19kaXZyZW0oUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIsCi0JICAgIFB5TG9uZ09iamVjdCAqKnBkaXYsIFB5TG9uZ09iamVjdCAqKnByZW0pCisgICAgICAgICAgICBQeUxvbmdPYmplY3QgKipwZGl2LCBQeUxvbmdPYmplY3QgKipwcmVtKQogewotCVB5X3NzaXplX3Qgc2l6ZV9hID0gQUJTKFB5X1NJWkUoYSkpLCBzaXplX2IgPSBBQlMoUHlfU0laRShiKSk7Ci0JUHlMb25nT2JqZWN0ICp6OworICAgIFB5X3NzaXplX3Qgc2l6ZV9hID0gQUJTKFB5X1NJWkUoYSkpLCBzaXplX2IgPSBBQlMoUHlfU0laRShiKSk7CisgICAgUHlMb25nT2JqZWN0ICp6OwogCi0JaWYgKHNpemVfYiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkibG9uZyBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChzaXplX2EgPCBzaXplX2IgfHwKLQkgICAgKHNpemVfYSA9PSBzaXplX2IgJiYKLQkgICAgIGEtPm9iX2RpZ2l0W3NpemVfYS0xXSA8IGItPm9iX2RpZ2l0W3NpemVfYi0xXSkpIHsKLQkJLyogfGF8IDwgfGJ8LiAqLwotCQkqcGRpdiA9IF9QeUxvbmdfTmV3KDApOwotCQlpZiAoKnBkaXYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfSU5DUkVGKGEpOwotCQkqcHJlbSA9IChQeUxvbmdPYmplY3QgKikgYTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChzaXplX2IgPT0gMSkgewotCQlkaWdpdCByZW0gPSAwOwotCQl6ID0gZGl2cmVtMShhLCBiLT5vYl9kaWdpdFswXSwgJnJlbSk7Ci0JCWlmICh6ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCSpwcmVtID0gKFB5TG9uZ09iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpcmVtKTsKLQkJaWYgKCpwcmVtID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih6KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlIHsKLQkJeiA9IHhfZGl2cmVtKGEsIGIsIHByZW0pOwotCQlpZiAoeiA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQkvKiBTZXQgdGhlIHNpZ25zLgotCSAgIFRoZSBxdW90aWVudCB6IGhhcyB0aGUgc2lnbiBvZiBhKmI7Ci0JICAgdGhlIHJlbWFpbmRlciByIGhhcyB0aGUgc2lnbiBvZiBhLAotCSAgIHNvIGEgPSBiKnogKyByLiAqLwotCWlmICgoYS0+b2Jfc2l6ZSA8IDApICE9IChiLT5vYl9zaXplIDwgMCkpCi0JCXotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOwotCWlmIChhLT5vYl9zaXplIDwgMCAmJiAoKnByZW0pLT5vYl9zaXplICE9IDApCi0JCSgqcHJlbSktPm9iX3NpemUgPSAtKCgqcHJlbSktPm9iX3NpemUpOwotCSpwZGl2ID0gejsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc2l6ZV9iID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvbmcgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc2l6ZV9hIDwgc2l6ZV9iIHx8CisgICAgICAgIChzaXplX2EgPT0gc2l6ZV9iICYmCisgICAgICAgICBhLT5vYl9kaWdpdFtzaXplX2EtMV0gPCBiLT5vYl9kaWdpdFtzaXplX2ItMV0pKSB7CisgICAgICAgIC8qIHxhfCA8IHxifC4gKi8KKyAgICAgICAgKnBkaXYgPSBfUHlMb25nX05ldygwKTsKKyAgICAgICAgaWYgKCpwZGl2ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0lOQ1JFRihhKTsKKyAgICAgICAgKnByZW0gPSAoUHlMb25nT2JqZWN0ICopIGE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoc2l6ZV9iID09IDEpIHsKKyAgICAgICAgZGlnaXQgcmVtID0gMDsKKyAgICAgICAgeiA9IGRpdnJlbTEoYSwgYi0+b2JfZGlnaXRbMF0sICZyZW0pOworICAgICAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqcHJlbSA9IChQeUxvbmdPYmplY3QgKikgUHlMb25nX0Zyb21Mb25nKChsb25nKXJlbSk7CisgICAgICAgIGlmICgqcHJlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoeik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHogPSB4X2RpdnJlbShhLCBiLCBwcmVtKTsKKyAgICAgICAgaWYgKHogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogU2V0IHRoZSBzaWducy4KKyAgICAgICBUaGUgcXVvdGllbnQgeiBoYXMgdGhlIHNpZ24gb2YgYSpiOworICAgICAgIHRoZSByZW1haW5kZXIgciBoYXMgdGhlIHNpZ24gb2YgYSwKKyAgICAgICBzbyBhID0gYip6ICsgci4gKi8KKyAgICBpZiAoKGEtPm9iX3NpemUgPCAwKSAhPSAoYi0+b2Jfc2l6ZSA8IDApKQorICAgICAgICB6LT5vYl9zaXplID0gLSh6LT5vYl9zaXplKTsKKyAgICBpZiAoYS0+b2Jfc2l6ZSA8IDAgJiYgKCpwcmVtKS0+b2Jfc2l6ZSAhPSAwKQorICAgICAgICAoKnByZW0pLT5vYl9zaXplID0gLSgoKnByZW0pLT5vYl9zaXplKTsKKyAgICAqcGRpdiA9IHo7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFVuc2lnbmVkIGxvbmcgZGl2aXNpb24gd2l0aCByZW1haW5kZXIgLS0gdGhlIGFsZ29yaXRobS4gIFRoZSBhcmd1bWVudHMgdjEKQEAgLTIwNjEsMTI1ICsyMDYxLDEyNSBAQAogc3RhdGljIFB5TG9uZ09iamVjdCAqCiB4X2RpdnJlbShQeUxvbmdPYmplY3QgKnYxLCBQeUxvbmdPYmplY3QgKncxLCBQeUxvbmdPYmplY3QgKipwcmVtKQogewotCVB5TG9uZ09iamVjdCAqdiwgKncsICphOwotCVB5X3NzaXplX3QgaSwgaywgc2l6ZV92LCBzaXplX3c7Ci0JaW50IGQ7Ci0JZGlnaXQgd20xLCB3bTIsIGNhcnJ5LCBxLCByLCB2dG9wLCAqdjAsICp2aywgKncwLCAqYWs7Ci0JdHdvZGlnaXRzIHZ2OwotCXNkaWdpdCB6aGk7Ci0Jc3R3b2RpZ2l0cyB6OworICAgIFB5TG9uZ09iamVjdCAqdiwgKncsICphOworICAgIFB5X3NzaXplX3QgaSwgaywgc2l6ZV92LCBzaXplX3c7CisgICAgaW50IGQ7CisgICAgZGlnaXQgd20xLCB3bTIsIGNhcnJ5LCBxLCByLCB2dG9wLCAqdjAsICp2aywgKncwLCAqYWs7CisgICAgdHdvZGlnaXRzIHZ2OworICAgIHNkaWdpdCB6aGk7CisgICAgc3R3b2RpZ2l0cyB6OwogCi0JLyogV2UgZm9sbG93IEtudXRoIFtUaGUgQXJ0IG9mIENvbXB1dGVyIFByb2dyYW1taW5nLCBWb2wuIDIgKDNyZAotCSAgIGVkbi4pLCBzZWN0aW9uIDQuMy4xLCBBbGdvcml0aG0gRF0sIGV4Y2VwdCB0aGF0IHdlIGRvbid0IGV4cGxpY2l0bHkKLQkgICBoYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSB3aGVuIHRoZSBpbml0aWFsIGVzdGltYXRlIHEgZm9yIGEgcXVvdGllbnQKLQkgICBkaWdpdCBpcyA+PSBQeUxvbmdfQkFTRTogdGhlIG1heCB2YWx1ZSBmb3IgcSBpcyBQeUxvbmdfQkFTRSsxLCBhbmQKLQkgICB0aGF0IHdvbid0IG92ZXJmbG93IGEgZGlnaXQuICovCisgICAgLyogV2UgZm9sbG93IEtudXRoIFtUaGUgQXJ0IG9mIENvbXB1dGVyIFByb2dyYW1taW5nLCBWb2wuIDIgKDNyZAorICAgICAgIGVkbi4pLCBzZWN0aW9uIDQuMy4xLCBBbGdvcml0aG0gRF0sIGV4Y2VwdCB0aGF0IHdlIGRvbid0IGV4cGxpY2l0bHkKKyAgICAgICBoYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSB3aGVuIHRoZSBpbml0aWFsIGVzdGltYXRlIHEgZm9yIGEgcXVvdGllbnQKKyAgICAgICBkaWdpdCBpcyA+PSBQeUxvbmdfQkFTRTogdGhlIG1heCB2YWx1ZSBmb3IgcSBpcyBQeUxvbmdfQkFTRSsxLCBhbmQKKyAgICAgICB0aGF0IHdvbid0IG92ZXJmbG93IGEgZGlnaXQuICovCiAKLQkvKiBhbGxvY2F0ZSBzcGFjZTsgdyB3aWxsIGFsc28gYmUgdXNlZCB0byBob2xkIHRoZSBmaW5hbCByZW1haW5kZXIgKi8KLQlzaXplX3YgPSBBQlMoUHlfU0laRSh2MSkpOwotCXNpemVfdyA9IEFCUyhQeV9TSVpFKHcxKSk7Ci0JYXNzZXJ0KHNpemVfdiA+PSBzaXplX3cgJiYgc2l6ZV93ID49IDIpOyAvKiBBc3NlcnQgY2hlY2tzIGJ5IGRpdigpICovCi0JdiA9IF9QeUxvbmdfTmV3KHNpemVfdisxKTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCSpwcmVtID0gTlVMTDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXcgPSBfUHlMb25nX05ldyhzaXplX3cpOwotCWlmICh3ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHYpOwotCQkqcHJlbSA9IE5VTEw7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBhbGxvY2F0ZSBzcGFjZTsgdyB3aWxsIGFsc28gYmUgdXNlZCB0byBob2xkIHRoZSBmaW5hbCByZW1haW5kZXIgKi8KKyAgICBzaXplX3YgPSBBQlMoUHlfU0laRSh2MSkpOworICAgIHNpemVfdyA9IEFCUyhQeV9TSVpFKHcxKSk7CisgICAgYXNzZXJ0KHNpemVfdiA+PSBzaXplX3cgJiYgc2l6ZV93ID49IDIpOyAvKiBBc3NlcnQgY2hlY2tzIGJ5IGRpdigpICovCisgICAgdiA9IF9QeUxvbmdfTmV3KHNpemVfdisxKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICpwcmVtID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHcgPSBfUHlMb25nX05ldyhzaXplX3cpOworICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAqcHJlbSA9IE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIG5vcm1hbGl6ZTogc2hpZnQgdzEgbGVmdCBzbyB0aGF0IGl0cyB0b3AgZGlnaXQgaXMgPj0gUHlMb25nX0JBU0UvMi4KLQkgICBzaGlmdCB2MSBsZWZ0IGJ5IHRoZSBzYW1lIGFtb3VudC4gIFJlc3VsdHMgZ28gaW50byB3IGFuZCB2LiAqLwotCWQgPSBQeUxvbmdfU0hJRlQgLSBiaXRzX2luX2RpZ2l0KHcxLT5vYl9kaWdpdFtzaXplX3ctMV0pOwotCWNhcnJ5ID0gdl9sc2hpZnQody0+b2JfZGlnaXQsIHcxLT5vYl9kaWdpdCwgc2l6ZV93LCBkKTsKLQlhc3NlcnQoY2FycnkgPT0gMCk7Ci0JY2FycnkgPSB2X2xzaGlmdCh2LT5vYl9kaWdpdCwgdjEtPm9iX2RpZ2l0LCBzaXplX3YsIGQpOwotCWlmIChjYXJyeSAhPSAwIHx8IHYtPm9iX2RpZ2l0W3NpemVfdi0xXSA+PSB3LT5vYl9kaWdpdFtzaXplX3ctMV0pIHsKLQkJdi0+b2JfZGlnaXRbc2l6ZV92XSA9IGNhcnJ5OwotCQlzaXplX3YrKzsKLQl9CisgICAgLyogbm9ybWFsaXplOiBzaGlmdCB3MSBsZWZ0IHNvIHRoYXQgaXRzIHRvcCBkaWdpdCBpcyA+PSBQeUxvbmdfQkFTRS8yLgorICAgICAgIHNoaWZ0IHYxIGxlZnQgYnkgdGhlIHNhbWUgYW1vdW50LiAgUmVzdWx0cyBnbyBpbnRvIHcgYW5kIHYuICovCisgICAgZCA9IFB5TG9uZ19TSElGVCAtIGJpdHNfaW5fZGlnaXQodzEtPm9iX2RpZ2l0W3NpemVfdy0xXSk7CisgICAgY2FycnkgPSB2X2xzaGlmdCh3LT5vYl9kaWdpdCwgdzEtPm9iX2RpZ2l0LCBzaXplX3csIGQpOworICAgIGFzc2VydChjYXJyeSA9PSAwKTsKKyAgICBjYXJyeSA9IHZfbHNoaWZ0KHYtPm9iX2RpZ2l0LCB2MS0+b2JfZGlnaXQsIHNpemVfdiwgZCk7CisgICAgaWYgKGNhcnJ5ICE9IDAgfHwgdi0+b2JfZGlnaXRbc2l6ZV92LTFdID49IHctPm9iX2RpZ2l0W3NpemVfdy0xXSkgeworICAgICAgICB2LT5vYl9kaWdpdFtzaXplX3ZdID0gY2Fycnk7CisgICAgICAgIHNpemVfdisrOworICAgIH0KIAotCS8qIE5vdyB2LT5vYl9kaWdpdFtzaXplX3YtMV0gPCB3LT5vYl9kaWdpdFtzaXplX3ctMV0sIHNvIHF1b3RpZW50IGhhcwotCSAgIGF0IG1vc3QgKGFuZCB1c3VhbGx5IGV4YWN0bHkpIGsgPSBzaXplX3YgLSBzaXplX3cgZGlnaXRzLiAqLwotCWsgPSBzaXplX3YgLSBzaXplX3c7Ci0JYXNzZXJ0KGsgPj0gMCk7Ci0JYSA9IF9QeUxvbmdfTmV3KGspOwotCWlmIChhID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHcpOwotCQlQeV9ERUNSRUYodik7Ci0JCSpwcmVtID0gTlVMTDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXYwID0gdi0+b2JfZGlnaXQ7Ci0JdzAgPSB3LT5vYl9kaWdpdDsKLQl3bTEgPSB3MFtzaXplX3ctMV07Ci0Jd20yID0gdzBbc2l6ZV93LTJdOwotCWZvciAodmsgPSB2MCtrLCBhayA9IGEtPm9iX2RpZ2l0ICsgazsgdmstLSA+IHYwOykgewotCQkvKiBpbm5lciBsb29wOiBkaXZpZGUgdmtbMDpzaXplX3crMV0gYnkgdzBbMDpzaXplX3ddLCBnaXZpbmcKLQkJICAgc2luZ2xlLWRpZ2l0IHF1b3RpZW50IHEsIHJlbWFpbmRlciBpbiB2a1swOnNpemVfd10uICovCisgICAgLyogTm93IHYtPm9iX2RpZ2l0W3NpemVfdi0xXSA8IHctPm9iX2RpZ2l0W3NpemVfdy0xXSwgc28gcXVvdGllbnQgaGFzCisgICAgICAgYXQgbW9zdCAoYW5kIHVzdWFsbHkgZXhhY3RseSkgayA9IHNpemVfdiAtIHNpemVfdyBkaWdpdHMuICovCisgICAgayA9IHNpemVfdiAtIHNpemVfdzsKKyAgICBhc3NlcnQoayA+PSAwKTsKKyAgICBhID0gX1B5TG9uZ19OZXcoayk7CisgICAgaWYgKGEgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgKnByZW0gPSBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdjAgPSB2LT5vYl9kaWdpdDsKKyAgICB3MCA9IHctPm9iX2RpZ2l0OworICAgIHdtMSA9IHcwW3NpemVfdy0xXTsKKyAgICB3bTIgPSB3MFtzaXplX3ctMl07CisgICAgZm9yICh2ayA9IHYwK2ssIGFrID0gYS0+b2JfZGlnaXQgKyBrOyB2ay0tID4gdjA7KSB7CisgICAgICAgIC8qIGlubmVyIGxvb3A6IGRpdmlkZSB2a1swOnNpemVfdysxXSBieSB3MFswOnNpemVfd10sIGdpdmluZworICAgICAgICAgICBzaW5nbGUtZGlnaXQgcXVvdGllbnQgcSwgcmVtYWluZGVyIGluIHZrWzA6c2l6ZV93XS4gKi8KIAotCQlTSUdDSEVDSyh7Ci0JCQlQeV9ERUNSRUYoYSk7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQkqcHJlbSA9IE5VTEw7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfSkKKyAgICAgICAgU0lHQ0hFQ0soeworICAgICAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgKnByZW0gPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0pCiAKLQkJLyogZXN0aW1hdGUgcXVvdGllbnQgZGlnaXQgcTsgbWF5IG92ZXJlc3RpbWF0ZSBieSAxIChyYXJlKSAqLwotCQl2dG9wID0gdmtbc2l6ZV93XTsKLQkJYXNzZXJ0KHZ0b3AgPD0gd20xKTsKLQkJdnYgPSAoKHR3b2RpZ2l0cyl2dG9wIDw8IFB5TG9uZ19TSElGVCkgfCB2a1tzaXplX3ctMV07Ci0JCXEgPSAoZGlnaXQpKHZ2IC8gd20xKTsKLQkJciA9IChkaWdpdCkodnYgLSAodHdvZGlnaXRzKXdtMSAqIHEpOyAvKiByID0gdnYgJSB3bTEgKi8KLQkJd2hpbGUgKCh0d29kaWdpdHMpd20yICogcSA+ICgoKHR3b2RpZ2l0cylyIDw8IFB5TG9uZ19TSElGVCkKLQkJCQkJICAgICB8IHZrW3NpemVfdy0yXSkpIHsKLQkJCS0tcTsKLQkJCXIgKz0gd20xOwotCQkJaWYgKHIgPj0gUHlMb25nX0JBU0UpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJYXNzZXJ0KHEgPD0gUHlMb25nX0JBU0UpOworICAgICAgICAvKiBlc3RpbWF0ZSBxdW90aWVudCBkaWdpdCBxOyBtYXkgb3ZlcmVzdGltYXRlIGJ5IDEgKHJhcmUpICovCisgICAgICAgIHZ0b3AgPSB2a1tzaXplX3ddOworICAgICAgICBhc3NlcnQodnRvcCA8PSB3bTEpOworICAgICAgICB2diA9ICgodHdvZGlnaXRzKXZ0b3AgPDwgUHlMb25nX1NISUZUKSB8IHZrW3NpemVfdy0xXTsKKyAgICAgICAgcSA9IChkaWdpdCkodnYgLyB3bTEpOworICAgICAgICByID0gKGRpZ2l0KSh2diAtICh0d29kaWdpdHMpd20xICogcSk7IC8qIHIgPSB2diAlIHdtMSAqLworICAgICAgICB3aGlsZSAoKHR3b2RpZ2l0cyl3bTIgKiBxID4gKCgodHdvZGlnaXRzKXIgPDwgUHlMb25nX1NISUZUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmtbc2l6ZV93LTJdKSkgeworICAgICAgICAgICAgLS1xOworICAgICAgICAgICAgciArPSB3bTE7CisgICAgICAgICAgICBpZiAociA+PSBQeUxvbmdfQkFTRSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQocSA8PSBQeUxvbmdfQkFTRSk7CiAKLQkJLyogc3VidHJhY3QgcSp3MFswOnNpemVfd10gZnJvbSB2a1swOnNpemVfdysxXSAqLwotCQl6aGkgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZV93OyArK2kpIHsKLQkJCS8qIGludmFyaWFudHM6IC1QeUxvbmdfQkFTRSA8PSAtcSA8PSB6aGkgPD0gMDsKLQkJCSAgIC1QeUxvbmdfQkFTRSAqIHEgPD0geiA8IFB5TG9uZ19CQVNFICovCi0JCQl6ID0gKHNkaWdpdCl2a1tpXSArIHpoaSAtCi0JCQkJKHN0d29kaWdpdHMpcSAqIChzdHdvZGlnaXRzKXcwW2ldOwotCQkJdmtbaV0gPSAoZGlnaXQpeiAmIFB5TG9uZ19NQVNLOwotCQkJemhpID0gKHNkaWdpdClQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKHN0d29kaWdpdHMsCi0JCQkJCQkJeiwgUHlMb25nX1NISUZUKTsKLQkJfQorICAgICAgICAvKiBzdWJ0cmFjdCBxKncwWzA6c2l6ZV93XSBmcm9tIHZrWzA6c2l6ZV93KzFdICovCisgICAgICAgIHpoaSA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX3c7ICsraSkgeworICAgICAgICAgICAgLyogaW52YXJpYW50czogLVB5TG9uZ19CQVNFIDw9IC1xIDw9IHpoaSA8PSAwOworICAgICAgICAgICAgICAgLVB5TG9uZ19CQVNFICogcSA8PSB6IDwgUHlMb25nX0JBU0UgKi8KKyAgICAgICAgICAgIHogPSAoc2RpZ2l0KXZrW2ldICsgemhpIC0KKyAgICAgICAgICAgICAgICAoc3R3b2RpZ2l0cylxICogKHN0d29kaWdpdHMpdzBbaV07CisgICAgICAgICAgICB2a1tpXSA9IChkaWdpdCl6ICYgUHlMb25nX01BU0s7CisgICAgICAgICAgICB6aGkgPSAoc2RpZ2l0KVB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQoc3R3b2RpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiwgUHlMb25nX1NISUZUKTsKKyAgICAgICAgfQogCi0JCS8qIGFkZCB3IGJhY2sgaWYgcSB3YXMgdG9vIGxhcmdlICh0aGlzIGJyYW5jaCB0YWtlbiByYXJlbHkpICovCi0JCWFzc2VydCgoc2RpZ2l0KXZ0b3AgKyB6aGkgPT0gLTEgfHwgKHNkaWdpdCl2dG9wICsgemhpID09IDApOwotCQlpZiAoKHNkaWdpdCl2dG9wICsgemhpIDwgMCkgewotCQkJY2FycnkgPSAwOwotCQkJZm9yIChpID0gMDsgaSA8IHNpemVfdzsgKytpKSB7Ci0JCQkJY2FycnkgKz0gdmtbaV0gKyB3MFtpXTsKLQkJCQl2a1tpXSA9IGNhcnJ5ICYgUHlMb25nX01BU0s7Ci0JCQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQkJCX0KLQkJCS0tcTsKLQkJfQorICAgICAgICAvKiBhZGQgdyBiYWNrIGlmIHEgd2FzIHRvbyBsYXJnZSAodGhpcyBicmFuY2ggdGFrZW4gcmFyZWx5KSAqLworICAgICAgICBhc3NlcnQoKHNkaWdpdCl2dG9wICsgemhpID09IC0xIHx8IChzZGlnaXQpdnRvcCArIHpoaSA9PSAwKTsKKyAgICAgICAgaWYgKChzZGlnaXQpdnRvcCArIHpoaSA8IDApIHsKKyAgICAgICAgICAgIGNhcnJ5ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX3c7ICsraSkgeworICAgICAgICAgICAgICAgIGNhcnJ5ICs9IHZrW2ldICsgdzBbaV07CisgICAgICAgICAgICAgICAgdmtbaV0gPSBjYXJyeSAmIFB5TG9uZ19NQVNLOworICAgICAgICAgICAgICAgIGNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAtLXE7CisgICAgICAgIH0KIAotCQkvKiBzdG9yZSBxdW90aWVudCBkaWdpdCAqLwotCQlhc3NlcnQocSA8IFB5TG9uZ19CQVNFKTsKLQkJKi0tYWsgPSBxOwotCX0KKyAgICAgICAgLyogc3RvcmUgcXVvdGllbnQgZGlnaXQgKi8KKyAgICAgICAgYXNzZXJ0KHEgPCBQeUxvbmdfQkFTRSk7CisgICAgICAgICotLWFrID0gcTsKKyAgICB9CiAKLQkvKiB1bnNoaWZ0IHJlbWFpbmRlcjsgd2UgcmV1c2UgdyB0byBzdG9yZSB0aGUgcmVzdWx0ICovCi0JY2FycnkgPSB2X3JzaGlmdCh3MCwgdjAsIHNpemVfdywgZCk7Ci0JYXNzZXJ0KGNhcnJ5PT0wKTsKLQlQeV9ERUNSRUYodik7CisgICAgLyogdW5zaGlmdCByZW1haW5kZXI7IHdlIHJldXNlIHcgdG8gc3RvcmUgdGhlIHJlc3VsdCAqLworICAgIGNhcnJ5ID0gdl9yc2hpZnQodzAsIHYwLCBzaXplX3csIGQpOworICAgIGFzc2VydChjYXJyeT09MCk7CisgICAgUHlfREVDUkVGKHYpOwogCi0JKnByZW0gPSBsb25nX25vcm1hbGl6ZSh3KTsKLQlyZXR1cm4gbG9uZ19ub3JtYWxpemUoYSk7CisgICAgKnByZW0gPSBsb25nX25vcm1hbGl6ZSh3KTsKKyAgICByZXR1cm4gbG9uZ19ub3JtYWxpemUoYSk7CiB9CiAKIC8qIEZvciBhIG5vbnplcm8gUHlMb25nIGEsIGV4cHJlc3MgYSBpbiB0aGUgZm9ybSB4ICogMioqZSwgd2l0aCAwLjUgPD0KQEAgLTIxOTksMTExICsyMTk5LDExMSBAQAogZG91YmxlCiBfUHlMb25nX0ZyZXhwKFB5TG9uZ09iamVjdCAqYSwgUHlfc3NpemVfdCAqZSkKIHsKLQlQeV9zc2l6ZV90IGFfc2l6ZSwgYV9iaXRzLCBzaGlmdF9kaWdpdHMsIHNoaWZ0X2JpdHMsIHhfc2l6ZTsKLQkvKiBTZWUgYmVsb3cgZm9yIHdoeSB4X2RpZ2l0cyBpcyBhbHdheXMgbGFyZ2UgZW5vdWdoLiAqLwotCWRpZ2l0IHJlbSwgeF9kaWdpdHNbMiArIChEQkxfTUFOVF9ESUcgKyAxKSAvIFB5TG9uZ19TSElGVF07Ci0JZG91YmxlIGR4OwotCS8qIENvcnJlY3Rpb24gdGVybSBmb3Igcm91bmQtaGFsZi10by1ldmVuIHJvdW5kaW5nLiAgRm9yIGEgZGlnaXQgeCwKLQkgICAieCArIGhhbGZfZXZlbl9jb3JyZWN0aW9uW3ggJiA3XSIgZ2l2ZXMgeCByb3VuZGVkIHRvIHRoZSBuZWFyZXN0Ci0JICAgbXVsdGlwbGUgb2YgNCwgcm91bmRpbmcgdGllcyB0byBhIG11bHRpcGxlIG9mIDguICovCi0Jc3RhdGljIGNvbnN0IGludCBoYWxmX2V2ZW5fY29ycmVjdGlvbls4XSA9IHswLCAtMSwgLTIsIDEsIDAsIC0xLCAyLCAxfTsKKyAgICBQeV9zc2l6ZV90IGFfc2l6ZSwgYV9iaXRzLCBzaGlmdF9kaWdpdHMsIHNoaWZ0X2JpdHMsIHhfc2l6ZTsKKyAgICAvKiBTZWUgYmVsb3cgZm9yIHdoeSB4X2RpZ2l0cyBpcyBhbHdheXMgbGFyZ2UgZW5vdWdoLiAqLworICAgIGRpZ2l0IHJlbSwgeF9kaWdpdHNbMiArIChEQkxfTUFOVF9ESUcgKyAxKSAvIFB5TG9uZ19TSElGVF07CisgICAgZG91YmxlIGR4OworICAgIC8qIENvcnJlY3Rpb24gdGVybSBmb3Igcm91bmQtaGFsZi10by1ldmVuIHJvdW5kaW5nLiAgRm9yIGEgZGlnaXQgeCwKKyAgICAgICAieCArIGhhbGZfZXZlbl9jb3JyZWN0aW9uW3ggJiA3XSIgZ2l2ZXMgeCByb3VuZGVkIHRvIHRoZSBuZWFyZXN0CisgICAgICAgbXVsdGlwbGUgb2YgNCwgcm91bmRpbmcgdGllcyB0byBhIG11bHRpcGxlIG9mIDguICovCisgICAgc3RhdGljIGNvbnN0IGludCBoYWxmX2V2ZW5fY29ycmVjdGlvbls4XSA9IHswLCAtMSwgLTIsIDEsIDAsIC0xLCAyLCAxfTsKIAotCWFfc2l6ZSA9IEFCUyhQeV9TSVpFKGEpKTsKLQlpZiAoYV9zaXplID09IDApIHsKLQkJLyogU3BlY2lhbCBjYXNlIGZvciAwOiBzaWduaWZpY2FuZCAwLjAsIGV4cG9uZW50IDAuICovCi0JCSplID0gMDsKLQkJcmV0dXJuIDAuMDsKLQl9Ci0JYV9iaXRzID0gYml0c19pbl9kaWdpdChhLT5vYl9kaWdpdFthX3NpemUtMV0pOwotCS8qIFRoZSBmb2xsb3dpbmcgaXMgYW4gb3ZlcmZsb3ctZnJlZSB2ZXJzaW9uIG9mIHRoZSBjaGVjawotCSAgICJpZiAoKGFfc2l6ZSAtIDEpICogUHlMb25nX1NISUZUICsgYV9iaXRzID4gUFlfU1NJWkVfVF9NQVgpIC4uLiIgKi8KLQlpZiAoYV9zaXplID49IChQWV9TU0laRV9UX01BWCAtIDEpIC8gUHlMb25nX1NISUZUICsgMSAmJgotCSAgICAoYV9zaXplID4gKFBZX1NTSVpFX1RfTUFYIC0gMSkgLyBQeUxvbmdfU0hJRlQgKyAxIHx8Ci0JICAgICBhX2JpdHMgPiAoUFlfU1NJWkVfVF9NQVggLSAxKSAlIFB5TG9uZ19TSElGVCArIDEpKQotCQkgZ290byBvdmVyZmxvdzsKLQlhX2JpdHMgPSAoYV9zaXplIC0gMSkgKiBQeUxvbmdfU0hJRlQgKyBhX2JpdHM7CisgICAgYV9zaXplID0gQUJTKFB5X1NJWkUoYSkpOworICAgIGlmIChhX3NpemUgPT0gMCkgeworICAgICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIDA6IHNpZ25pZmljYW5kIDAuMCwgZXhwb25lbnQgMC4gKi8KKyAgICAgICAgKmUgPSAwOworICAgICAgICByZXR1cm4gMC4wOworICAgIH0KKyAgICBhX2JpdHMgPSBiaXRzX2luX2RpZ2l0KGEtPm9iX2RpZ2l0W2Ffc2l6ZS0xXSk7CisgICAgLyogVGhlIGZvbGxvd2luZyBpcyBhbiBvdmVyZmxvdy1mcmVlIHZlcnNpb24gb2YgdGhlIGNoZWNrCisgICAgICAgImlmICgoYV9zaXplIC0gMSkgKiBQeUxvbmdfU0hJRlQgKyBhX2JpdHMgPiBQWV9TU0laRV9UX01BWCkgLi4uIiAqLworICAgIGlmIChhX3NpemUgPj0gKFBZX1NTSVpFX1RfTUFYIC0gMSkgLyBQeUxvbmdfU0hJRlQgKyAxICYmCisgICAgICAgIChhX3NpemUgPiAoUFlfU1NJWkVfVF9NQVggLSAxKSAvIFB5TG9uZ19TSElGVCArIDEgfHwKKyAgICAgICAgIGFfYml0cyA+IChQWV9TU0laRV9UX01BWCAtIDEpICUgUHlMb25nX1NISUZUICsgMSkpCisgICAgICAgICBnb3RvIG92ZXJmbG93OworICAgIGFfYml0cyA9IChhX3NpemUgLSAxKSAqIFB5TG9uZ19TSElGVCArIGFfYml0czsKIAotCS8qIFNoaWZ0IHRoZSBmaXJzdCBEQkxfTUFOVF9ESUcgKyAyIGJpdHMgb2YgYSBpbnRvIHhfZGlnaXRzWzA6eF9zaXplXQotCSAgIChzaGlmdGluZyBsZWZ0IGlmIGFfYml0cyA8PSBEQkxfTUFOVF9ESUcgKyAyKS4KKyAgICAvKiBTaGlmdCB0aGUgZmlyc3QgREJMX01BTlRfRElHICsgMiBiaXRzIG9mIGEgaW50byB4X2RpZ2l0c1swOnhfc2l6ZV0KKyAgICAgICAoc2hpZnRpbmcgbGVmdCBpZiBhX2JpdHMgPD0gREJMX01BTlRfRElHICsgMikuCiAKLQkgICBOdW1iZXIgb2YgZGlnaXRzIG5lZWRlZCBmb3IgcmVzdWx0OiB3cml0ZSAvLyBmb3IgZmxvb3IgZGl2aXNpb24uCi0JICAgVGhlbiBpZiBzaGlmdGluZyBsZWZ0LCB3ZSBlbmQgdXAgdXNpbmcKKyAgICAgICBOdW1iZXIgb2YgZGlnaXRzIG5lZWRlZCBmb3IgcmVzdWx0OiB3cml0ZSAvLyBmb3IgZmxvb3IgZGl2aXNpb24uCisgICAgICAgVGhlbiBpZiBzaGlmdGluZyBsZWZ0LCB3ZSBlbmQgdXAgdXNpbmcKIAotCSAgICAgMSArIGFfc2l6ZSArIChEQkxfTUFOVF9ESUcgKyAyIC0gYV9iaXRzKSAvLyBQeUxvbmdfU0hJRlQKKyAgICAgICAgIDEgKyBhX3NpemUgKyAoREJMX01BTlRfRElHICsgMiAtIGFfYml0cykgLy8gUHlMb25nX1NISUZUCiAKLQkgICBkaWdpdHMuICBJZiBzaGlmdGluZyByaWdodCwgd2UgdXNlCisgICAgICAgZGlnaXRzLiAgSWYgc2hpZnRpbmcgcmlnaHQsIHdlIHVzZQogCi0JICAgICBhX3NpemUgLSAoYV9iaXRzIC0gREJMX01BTlRfRElHIC0gMikgLy8gUHlMb25nX1NISUZUCisgICAgICAgICBhX3NpemUgLSAoYV9iaXRzIC0gREJMX01BTlRfRElHIC0gMikgLy8gUHlMb25nX1NISUZUCiAKLQkgICBkaWdpdHMuICBVc2luZyBhX3NpemUgPSAxICsgKGFfYml0cyAtIDEpIC8vIFB5TG9uZ19TSElGVCBhbG9uZyB3aXRoCi0JICAgdGhlIGluZXF1YWxpdGllcworICAgICAgIGRpZ2l0cy4gIFVzaW5nIGFfc2l6ZSA9IDEgKyAoYV9iaXRzIC0gMSkgLy8gUHlMb25nX1NISUZUIGFsb25nIHdpdGgKKyAgICAgICB0aGUgaW5lcXVhbGl0aWVzCiAKLQkgICAgIG0gLy8gUHlMb25nX1NISUZUICsgbiAvLyBQeUxvbmdfU0hJRlQgPD0gKG0gKyBuKSAvLyBQeUxvbmdfU0hJRlQKLQkgICAgIG0gLy8gUHlMb25nX1NISUZUIC0gbiAvLyBQeUxvbmdfU0hJRlQgPD0KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKyAobSAtIG4gLSAxKSAvLyBQeUxvbmdfU0hJRlQsCisgICAgICAgICBtIC8vIFB5TG9uZ19TSElGVCArIG4gLy8gUHlMb25nX1NISUZUIDw9IChtICsgbikgLy8gUHlMb25nX1NISUZUCisgICAgICAgICBtIC8vIFB5TG9uZ19TSElGVCAtIG4gLy8gUHlMb25nX1NISUZUIDw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICsgKG0gLSBuIC0gMSkgLy8gUHlMb25nX1NISUZULAogCi0JICAgdmFsaWQgZm9yIGFueSBpbnRlZ2VycyBtIGFuZCBuLCB3ZSBmaW5kIHRoYXQgeF9zaXplIHNhdGlzZmllcworICAgICAgIHZhbGlkIGZvciBhbnkgaW50ZWdlcnMgbSBhbmQgbiwgd2UgZmluZCB0aGF0IHhfc2l6ZSBzYXRpc2ZpZXMKIAotCSAgICAgeF9zaXplIDw9IDIgKyAoREJMX01BTlRfRElHICsgMSkgLy8gUHlMb25nX1NISUZUCisgICAgICAgICB4X3NpemUgPD0gMiArIChEQkxfTUFOVF9ESUcgKyAxKSAvLyBQeUxvbmdfU0hJRlQKIAotCSAgIGluIGJvdGggY2FzZXMuCi0JKi8KLQlpZiAoYV9iaXRzIDw9IERCTF9NQU5UX0RJRyArIDIpIHsKLQkJc2hpZnRfZGlnaXRzID0gKERCTF9NQU5UX0RJRyArIDIgLSBhX2JpdHMpIC8gUHlMb25nX1NISUZUOwotCQlzaGlmdF9iaXRzID0gKERCTF9NQU5UX0RJRyArIDIgLSBhX2JpdHMpICUgUHlMb25nX1NISUZUOwotCQl4X3NpemUgPSAwOwotCQl3aGlsZSAoeF9zaXplIDwgc2hpZnRfZGlnaXRzKQotCQkJeF9kaWdpdHNbeF9zaXplKytdID0gMDsKLQkJcmVtID0gdl9sc2hpZnQoeF9kaWdpdHMgKyB4X3NpemUsIGEtPm9iX2RpZ2l0LCBhX3NpemUsCi0JCQkgICAgICAgKGludClzaGlmdF9iaXRzKTsKLQkJeF9zaXplICs9IGFfc2l6ZTsKLQkJeF9kaWdpdHNbeF9zaXplKytdID0gcmVtOwotCX0KLQllbHNlIHsKLQkJc2hpZnRfZGlnaXRzID0gKGFfYml0cyAtIERCTF9NQU5UX0RJRyAtIDIpIC8gUHlMb25nX1NISUZUOwotCQlzaGlmdF9iaXRzID0gKGFfYml0cyAtIERCTF9NQU5UX0RJRyAtIDIpICUgUHlMb25nX1NISUZUOwotCQlyZW0gPSB2X3JzaGlmdCh4X2RpZ2l0cywgYS0+b2JfZGlnaXQgKyBzaGlmdF9kaWdpdHMsCi0JCQkgICAgICAgYV9zaXplIC0gc2hpZnRfZGlnaXRzLCAoaW50KXNoaWZ0X2JpdHMpOwotCQl4X3NpemUgPSBhX3NpemUgLSBzaGlmdF9kaWdpdHM7Ci0JCS8qIEZvciBjb3JyZWN0IHJvdW5kaW5nIGJlbG93LCB3ZSBuZWVkIHRoZSBsZWFzdCBzaWduaWZpY2FudAotCQkgICBiaXQgb2YgeCB0byBiZSAnc3RpY2t5JyBmb3IgdGhpcyBzaGlmdDogaWYgYW55IG9mIHRoZSBiaXRzCi0JCSAgIHNoaWZ0ZWQgb3V0IHdhcyBub256ZXJvLCB3ZSBzZXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdAotCQkgICBvZiB4LiAqLwotCQlpZiAocmVtKQotCQkJeF9kaWdpdHNbMF0gfD0gMTsKLQkJZWxzZQotCQkJd2hpbGUgKHNoaWZ0X2RpZ2l0cyA+IDApCi0JCQkJaWYgKGEtPm9iX2RpZ2l0Wy0tc2hpZnRfZGlnaXRzXSkgewotCQkJCQl4X2RpZ2l0c1swXSB8PSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JfQotCWFzc2VydCgxIDw9IHhfc2l6ZSAmJiB4X3NpemUgPD0gKFB5X3NzaXplX3QpKHNpemVvZih4X2RpZ2l0cykvc2l6ZW9mKGRpZ2l0KSkpOworICAgICAgIGluIGJvdGggY2FzZXMuCisgICAgKi8KKyAgICBpZiAoYV9iaXRzIDw9IERCTF9NQU5UX0RJRyArIDIpIHsKKyAgICAgICAgc2hpZnRfZGlnaXRzID0gKERCTF9NQU5UX0RJRyArIDIgLSBhX2JpdHMpIC8gUHlMb25nX1NISUZUOworICAgICAgICBzaGlmdF9iaXRzID0gKERCTF9NQU5UX0RJRyArIDIgLSBhX2JpdHMpICUgUHlMb25nX1NISUZUOworICAgICAgICB4X3NpemUgPSAwOworICAgICAgICB3aGlsZSAoeF9zaXplIDwgc2hpZnRfZGlnaXRzKQorICAgICAgICAgICAgeF9kaWdpdHNbeF9zaXplKytdID0gMDsKKyAgICAgICAgcmVtID0gdl9sc2hpZnQoeF9kaWdpdHMgKyB4X3NpemUsIGEtPm9iX2RpZ2l0LCBhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpc2hpZnRfYml0cyk7CisgICAgICAgIHhfc2l6ZSArPSBhX3NpemU7CisgICAgICAgIHhfZGlnaXRzW3hfc2l6ZSsrXSA9IHJlbTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNoaWZ0X2RpZ2l0cyA9IChhX2JpdHMgLSBEQkxfTUFOVF9ESUcgLSAyKSAvIFB5TG9uZ19TSElGVDsKKyAgICAgICAgc2hpZnRfYml0cyA9IChhX2JpdHMgLSBEQkxfTUFOVF9ESUcgLSAyKSAlIFB5TG9uZ19TSElGVDsKKyAgICAgICAgcmVtID0gdl9yc2hpZnQoeF9kaWdpdHMsIGEtPm9iX2RpZ2l0ICsgc2hpZnRfZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICBhX3NpemUgLSBzaGlmdF9kaWdpdHMsIChpbnQpc2hpZnRfYml0cyk7CisgICAgICAgIHhfc2l6ZSA9IGFfc2l6ZSAtIHNoaWZ0X2RpZ2l0czsKKyAgICAgICAgLyogRm9yIGNvcnJlY3Qgcm91bmRpbmcgYmVsb3csIHdlIG5lZWQgdGhlIGxlYXN0IHNpZ25pZmljYW50CisgICAgICAgICAgIGJpdCBvZiB4IHRvIGJlICdzdGlja3knIGZvciB0aGlzIHNoaWZ0OiBpZiBhbnkgb2YgdGhlIGJpdHMKKyAgICAgICAgICAgc2hpZnRlZCBvdXQgd2FzIG5vbnplcm8sIHdlIHNldCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0CisgICAgICAgICAgIG9mIHguICovCisgICAgICAgIGlmIChyZW0pCisgICAgICAgICAgICB4X2RpZ2l0c1swXSB8PSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3aGlsZSAoc2hpZnRfZGlnaXRzID4gMCkKKyAgICAgICAgICAgICAgICBpZiAoYS0+b2JfZGlnaXRbLS1zaGlmdF9kaWdpdHNdKSB7CisgICAgICAgICAgICAgICAgICAgIHhfZGlnaXRzWzBdIHw9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KDEgPD0geF9zaXplICYmIHhfc2l6ZSA8PSAoUHlfc3NpemVfdCkoc2l6ZW9mKHhfZGlnaXRzKS9zaXplb2YoZGlnaXQpKSk7CiAKLQkvKiBSb3VuZCwgYW5kIGNvbnZlcnQgdG8gZG91YmxlLiAqLwotCXhfZGlnaXRzWzBdICs9IGhhbGZfZXZlbl9jb3JyZWN0aW9uW3hfZGlnaXRzWzBdICYgN107Ci0JZHggPSB4X2RpZ2l0c1stLXhfc2l6ZV07Ci0Jd2hpbGUgKHhfc2l6ZSA+IDApCi0JCWR4ID0gZHggKiBQeUxvbmdfQkFTRSArIHhfZGlnaXRzWy0teF9zaXplXTsKKyAgICAvKiBSb3VuZCwgYW5kIGNvbnZlcnQgdG8gZG91YmxlLiAqLworICAgIHhfZGlnaXRzWzBdICs9IGhhbGZfZXZlbl9jb3JyZWN0aW9uW3hfZGlnaXRzWzBdICYgN107CisgICAgZHggPSB4X2RpZ2l0c1stLXhfc2l6ZV07CisgICAgd2hpbGUgKHhfc2l6ZSA+IDApCisgICAgICAgIGR4ID0gZHggKiBQeUxvbmdfQkFTRSArIHhfZGlnaXRzWy0teF9zaXplXTsKIAotCS8qIFJlc2NhbGU7ICBtYWtlIGNvcnJlY3Rpb24gaWYgcmVzdWx0IGlzIDEuMC4gKi8KLQlkeCAvPSA0LjAgKiBFWFAyX0RCTF9NQU5UX0RJRzsKLQlpZiAoZHggPT0gMS4wKSB7Ci0JCWlmIChhX2JpdHMgPT0gUFlfU1NJWkVfVF9NQVgpCi0JCQlnb3RvIG92ZXJmbG93OwotCQlkeCA9IDAuNTsKLQkJYV9iaXRzICs9IDE7Ci0JfQorICAgIC8qIFJlc2NhbGU7ICBtYWtlIGNvcnJlY3Rpb24gaWYgcmVzdWx0IGlzIDEuMC4gKi8KKyAgICBkeCAvPSA0LjAgKiBFWFAyX0RCTF9NQU5UX0RJRzsKKyAgICBpZiAoZHggPT0gMS4wKSB7CisgICAgICAgIGlmIChhX2JpdHMgPT0gUFlfU1NJWkVfVF9NQVgpCisgICAgICAgICAgICBnb3RvIG92ZXJmbG93OworICAgICAgICBkeCA9IDAuNTsKKyAgICAgICAgYV9iaXRzICs9IDE7CisgICAgfQogCi0JKmUgPSBhX2JpdHM7Ci0JcmV0dXJuIFB5X1NJWkUoYSkgPCAwID8gLWR4IDogZHg7CisgICAgKmUgPSBhX2JpdHM7CisgICAgcmV0dXJuIFB5X1NJWkUoYSkgPCAwID8gLWR4IDogZHg7CiAKICAgb3ZlcmZsb3c6Ci0JLyogZXhwb25lbnQgPiBQWV9TU0laRV9UX01BWCAqLwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImh1Z2UgaW50ZWdlcjogbnVtYmVyIG9mIGJpdHMgb3ZlcmZsb3dzIGEgUHlfc3NpemVfdCIpOwotCSplID0gMDsKLQlyZXR1cm4gLTEuMDsKKyAgICAvKiBleHBvbmVudCA+IFBZX1NTSVpFX1RfTUFYICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJodWdlIGludGVnZXI6IG51bWJlciBvZiBiaXRzIG92ZXJmbG93cyBhIFB5X3NzaXplX3QiKTsKKyAgICAqZSA9IDA7CisgICAgcmV0dXJuIC0xLjA7CiB9CiAKIC8qIEdldCBhIEMgZG91YmxlIGZyb20gYSBsb25nIGludCBvYmplY3QuICBSb3VuZHMgdG8gdGhlIG5lYXJlc3QgZG91YmxlLApAQCAtMjMxMiwyMCArMjMxMiwyMCBAQAogZG91YmxlCiBQeUxvbmdfQXNEb3VibGUoUHlPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCBleHBvbmVudDsKLQlkb3VibGUgeDsKKyAgICBQeV9zc2l6ZV90IGV4cG9uZW50OworICAgIGRvdWJsZSB4OwogCi0JaWYgKHYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHYpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTEuMDsKLQl9Ci0JeCA9IF9QeUxvbmdfRnJleHAoKFB5TG9uZ09iamVjdCAqKXYsICZleHBvbmVudCk7Ci0JaWYgKCh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgfHwgZXhwb25lbnQgPiBEQkxfTUFYX0VYUCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibG9uZyBpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXQiKTsKLQkJcmV0dXJuIC0xLjA7Ci0JfQotCXJldHVybiBsZGV4cCh4LCAoaW50KWV4cG9uZW50KTsKKyAgICBpZiAodiA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodikpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMS4wOworICAgIH0KKyAgICB4ID0gX1B5TG9uZ19GcmV4cCgoUHlMb25nT2JqZWN0ICopdiwgJmV4cG9uZW50KTsKKyAgICBpZiAoKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB8fCBleHBvbmVudCA+IERCTF9NQVhfRVhQKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvbmcgaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMS4wOworICAgIH0KKyAgICByZXR1cm4gbGRleHAoeCwgKGludClleHBvbmVudCk7CiB9CiAKIC8qIE1ldGhvZHMgKi8KQEAgLTIzMzMsNzggKzIzMzMsNzggQEAKIHN0YXRpYyB2b2lkCiBsb25nX2RlYWxsb2MoUHlPYmplY3QgKnYpCiB7Ci0JUHlfVFlQRSh2KS0+dHBfZnJlZSh2KTsKKyAgICBQeV9UWVBFKHYpLT50cF9mcmVlKHYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19yZXByKFB5T2JqZWN0ICp2KQogewotCXJldHVybiBfUHlMb25nX0Zvcm1hdCh2LCAxMCwgMSwgMCk7CisgICAgcmV0dXJuIF9QeUxvbmdfRm9ybWF0KHYsIDEwLCAxLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfc3RyKFB5T2JqZWN0ICp2KQogewotCXJldHVybiBfUHlMb25nX0Zvcm1hdCh2LCAxMCwgMCwgMCk7CisgICAgcmV0dXJuIF9QeUxvbmdfRm9ybWF0KHYsIDEwLCAwLCAwKTsKIH0KIAogc3RhdGljIGludAogbG9uZ19jb21wYXJlKFB5TG9uZ09iamVjdCAqYSwgUHlMb25nT2JqZWN0ICpiKQogewotCVB5X3NzaXplX3Qgc2lnbjsKKyAgICBQeV9zc2l6ZV90IHNpZ247CiAKLQlpZiAoUHlfU0laRShhKSAhPSBQeV9TSVpFKGIpKSB7Ci0JCXNpZ24gPSBQeV9TSVpFKGEpIC0gUHlfU0laRShiKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5X3NzaXplX3QgaSA9IEFCUyhQeV9TSVpFKGEpKTsKLQkJd2hpbGUgKC0taSA+PSAwICYmIGEtPm9iX2RpZ2l0W2ldID09IGItPm9iX2RpZ2l0W2ldKQotCQkJOwotCQlpZiAoaSA8IDApCi0JCQlzaWduID0gMDsKLQkJZWxzZSB7Ci0JCQlzaWduID0gKHNkaWdpdClhLT5vYl9kaWdpdFtpXSAtIChzZGlnaXQpYi0+b2JfZGlnaXRbaV07Ci0JCQlpZiAoUHlfU0laRShhKSA8IDApCi0JCQkJc2lnbiA9IC1zaWduOwotCQl9Ci0JfQotCXJldHVybiBzaWduIDwgMCA/IC0xIDogc2lnbiA+IDAgPyAxIDogMDsKKyAgICBpZiAoUHlfU0laRShhKSAhPSBQeV9TSVpFKGIpKSB7CisgICAgICAgIHNpZ24gPSBQeV9TSVpFKGEpIC0gUHlfU0laRShiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgaSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICAgICAgd2hpbGUgKC0taSA+PSAwICYmIGEtPm9iX2RpZ2l0W2ldID09IGItPm9iX2RpZ2l0W2ldKQorICAgICAgICAgICAgOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBzaWduID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzaWduID0gKHNkaWdpdClhLT5vYl9kaWdpdFtpXSAtIChzZGlnaXQpYi0+b2JfZGlnaXRbaV07CisgICAgICAgICAgICBpZiAoUHlfU0laRShhKSA8IDApCisgICAgICAgICAgICAgICAgc2lnbiA9IC1zaWduOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzaWduIDwgMCA/IC0xIDogc2lnbiA+IDAgPyAxIDogMDsKIH0KIAogc3RhdGljIGxvbmcKIGxvbmdfaGFzaChQeUxvbmdPYmplY3QgKnYpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCVB5X3NzaXplX3QgaTsKLQlpbnQgc2lnbjsKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBzaWduOwogCi0JLyogVGhpcyBpcyBkZXNpZ25lZCBzbyB0aGF0IFB5dGhvbiBpbnRzIGFuZCBsb25ncyB3aXRoIHRoZQotCSAgIHNhbWUgdmFsdWUgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZSwgb3RoZXJ3aXNlIGNvbXBhcmlzb25zCi0JICAgb2YgbWFwcGluZyBrZXlzIHdpbGwgdHVybiBvdXQgd2VpcmQgKi8KLQlpID0gdi0+b2Jfc2l6ZTsKLQlzaWduID0gMTsKLQl4ID0gMDsKLQlpZiAoaSA8IDApIHsKLQkJc2lnbiA9IC0xOwotCQlpID0gLShpKTsKLQl9Ci0JLyogVGhlIGZvbGxvd2luZyBsb29wIHByb2R1Y2VzIGEgQyB1bnNpZ25lZCBsb25nIHggc3VjaCB0aGF0IHggaXMKLQkgICBjb25ncnVlbnQgdG8gdGhlIGFic29sdXRlIHZhbHVlIG9mIHYgbW9kdWxvIFVMT05HX01BWC4gIFRoZQotCSAgIHJlc3VsdGluZyB4IGlzIG5vbnplcm8gaWYgYW5kIG9ubHkgaWYgdiBpcy4gKi8KLQl3aGlsZSAoLS1pID49IDApIHsKLQkJLyogRm9yY2UgYSBuYXRpdmUgbG9uZyAjLWJpdHMgKDMyIG9yIDY0KSBjaXJjdWxhciBzaGlmdCAqLwotCQl4ID0gKHggPj4gKDgqU0laRU9GX0xPTkctUHlMb25nX1NISUZUKSkgfCAoeCA8PCBQeUxvbmdfU0hJRlQpOwotCQl4ICs9IHYtPm9iX2RpZ2l0W2ldOwotCQkvKiBJZiB0aGUgYWRkaXRpb24gYWJvdmUgb3ZlcmZsb3dlZCB3ZSBjb21wZW5zYXRlIGJ5Ci0JCSAgIGluY3JlbWVudGluZy4gIFRoaXMgcHJlc2VydmVzIHRoZSB2YWx1ZSBtb2R1bG8KLQkJICAgVUxPTkdfTUFYLiAqLwotCQlpZiAoeCA8IHYtPm9iX2RpZ2l0W2ldKQotCQkJeCsrOwotCX0KLQl4ID0geCAqIHNpZ247Ci0JaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpLTEpCi0JCXggPSAodW5zaWduZWQgbG9uZyktMjsKLQlyZXR1cm4gKGxvbmcpeDsKKyAgICAvKiBUaGlzIGlzIGRlc2lnbmVkIHNvIHRoYXQgUHl0aG9uIGludHMgYW5kIGxvbmdzIHdpdGggdGhlCisgICAgICAgc2FtZSB2YWx1ZSBoYXNoIHRvIHRoZSBzYW1lIHZhbHVlLCBvdGhlcndpc2UgY29tcGFyaXNvbnMKKyAgICAgICBvZiBtYXBwaW5nIGtleXMgd2lsbCB0dXJuIG91dCB3ZWlyZCAqLworICAgIGkgPSB2LT5vYl9zaXplOworICAgIHNpZ24gPSAxOworICAgIHggPSAwOworICAgIGlmIChpIDwgMCkgeworICAgICAgICBzaWduID0gLTE7CisgICAgICAgIGkgPSAtKGkpOworICAgIH0KKyAgICAvKiBUaGUgZm9sbG93aW5nIGxvb3AgcHJvZHVjZXMgYSBDIHVuc2lnbmVkIGxvbmcgeCBzdWNoIHRoYXQgeCBpcworICAgICAgIGNvbmdydWVudCB0byB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdiBtb2R1bG8gVUxPTkdfTUFYLiAgVGhlCisgICAgICAgcmVzdWx0aW5nIHggaXMgbm9uemVybyBpZiBhbmQgb25seSBpZiB2IGlzLiAqLworICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICAvKiBGb3JjZSBhIG5hdGl2ZSBsb25nICMtYml0cyAoMzIgb3IgNjQpIGNpcmN1bGFyIHNoaWZ0ICovCisgICAgICAgIHggPSAoeCA+PiAoOCpTSVpFT0ZfTE9ORy1QeUxvbmdfU0hJRlQpKSB8ICh4IDw8IFB5TG9uZ19TSElGVCk7CisgICAgICAgIHggKz0gdi0+b2JfZGlnaXRbaV07CisgICAgICAgIC8qIElmIHRoZSBhZGRpdGlvbiBhYm92ZSBvdmVyZmxvd2VkIHdlIGNvbXBlbnNhdGUgYnkKKyAgICAgICAgICAgaW5jcmVtZW50aW5nLiAgVGhpcyBwcmVzZXJ2ZXMgdGhlIHZhbHVlIG1vZHVsbworICAgICAgICAgICBVTE9OR19NQVguICovCisgICAgICAgIGlmICh4IDwgdi0+b2JfZGlnaXRbaV0pCisgICAgICAgICAgICB4Kys7CisgICAgfQorICAgIHggPSB4ICogc2lnbjsKKyAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZyktMSkKKyAgICAgICAgeCA9ICh1bnNpZ25lZCBsb25nKS0yOworICAgIHJldHVybiAobG9uZyl4OwogfQogCiAKQEAgLTI0MTMsMzMgKzI0MTMsMzMgQEAKIHN0YXRpYyBQeUxvbmdPYmplY3QgKgogeF9hZGQoUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIpCiB7Ci0JUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSksIHNpemVfYiA9IEFCUyhQeV9TSVpFKGIpKTsKLQlQeUxvbmdPYmplY3QgKno7Ci0JUHlfc3NpemVfdCBpOwotCWRpZ2l0IGNhcnJ5ID0gMDsKKyAgICBQeV9zc2l6ZV90IHNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKSwgc2l6ZV9iID0gQUJTKFB5X1NJWkUoYikpOworICAgIFB5TG9uZ09iamVjdCAqejsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgZGlnaXQgY2FycnkgPSAwOwogCi0JLyogRW5zdXJlIGEgaXMgdGhlIGxhcmdlciBvZiB0aGUgdHdvOiAqLwotCWlmIChzaXplX2EgPCBzaXplX2IpIHsKLQkJeyBQeUxvbmdPYmplY3QgKnRlbXAgPSBhOyBhID0gYjsgYiA9IHRlbXA7IH0KLQkJeyBQeV9zc2l6ZV90IHNpemVfdGVtcCA9IHNpemVfYTsKLQkJICBzaXplX2EgPSBzaXplX2I7Ci0JCSAgc2l6ZV9iID0gc2l6ZV90ZW1wOyB9Ci0JfQotCXogPSBfUHlMb25nX05ldyhzaXplX2ErMSk7Ci0JaWYgKHogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IHNpemVfYjsgKytpKSB7Ci0JCWNhcnJ5ICs9IGEtPm9iX2RpZ2l0W2ldICsgYi0+b2JfZGlnaXRbaV07Ci0JCXotPm9iX2RpZ2l0W2ldID0gY2FycnkgJiBQeUxvbmdfTUFTSzsKLQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQl9Ci0JZm9yICg7IGkgPCBzaXplX2E7ICsraSkgewotCQljYXJyeSArPSBhLT5vYl9kaWdpdFtpXTsKLQkJei0+b2JfZGlnaXRbaV0gPSBjYXJyeSAmIFB5TG9uZ19NQVNLOwotCQljYXJyeSA+Pj0gUHlMb25nX1NISUZUOwotCX0KLQl6LT5vYl9kaWdpdFtpXSA9IGNhcnJ5OwotCXJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICAvKiBFbnN1cmUgYSBpcyB0aGUgbGFyZ2VyIG9mIHRoZSB0d286ICovCisgICAgaWYgKHNpemVfYSA8IHNpemVfYikgeworICAgICAgICB7IFB5TG9uZ09iamVjdCAqdGVtcCA9IGE7IGEgPSBiOyBiID0gdGVtcDsgfQorICAgICAgICB7IFB5X3NzaXplX3Qgc2l6ZV90ZW1wID0gc2l6ZV9hOworICAgICAgICAgIHNpemVfYSA9IHNpemVfYjsKKyAgICAgICAgICBzaXplX2IgPSBzaXplX3RlbXA7IH0KKyAgICB9CisgICAgeiA9IF9QeUxvbmdfTmV3KHNpemVfYSsxKTsKKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9iOyArK2kpIHsKKyAgICAgICAgY2FycnkgKz0gYS0+b2JfZGlnaXRbaV0gKyBiLT5vYl9kaWdpdFtpXTsKKyAgICAgICAgei0+b2JfZGlnaXRbaV0gPSBjYXJyeSAmIFB5TG9uZ19NQVNLOworICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHNpemVfYTsgKytpKSB7CisgICAgICAgIGNhcnJ5ICs9IGEtPm9iX2RpZ2l0W2ldOworICAgICAgICB6LT5vYl9kaWdpdFtpXSA9IGNhcnJ5ICYgUHlMb25nX01BU0s7CisgICAgICAgIGNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgfQorICAgIHotPm9iX2RpZ2l0W2ldID0gY2Fycnk7CisgICAgcmV0dXJuIGxvbmdfbm9ybWFsaXplKHopOwogfQogCiAvKiBTdWJ0cmFjdCB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHR3byBpbnRlZ2Vycy4gKi8KQEAgLTI0NDcsMTA3ICsyNDQ3LDEwNyBAQAogc3RhdGljIFB5TG9uZ09iamVjdCAqCiB4X3N1YihQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYikKIHsKLQlQeV9zc2l6ZV90IHNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKSwgc2l6ZV9iID0gQUJTKFB5X1NJWkUoYikpOwotCVB5TG9uZ09iamVjdCAqejsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHNpZ24gPSAxOwotCWRpZ2l0IGJvcnJvdyA9IDA7CisgICAgUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSksIHNpemVfYiA9IEFCUyhQeV9TSVpFKGIpKTsKKyAgICBQeUxvbmdPYmplY3QgKno7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBzaWduID0gMTsKKyAgICBkaWdpdCBib3Jyb3cgPSAwOwogCi0JLyogRW5zdXJlIGEgaXMgdGhlIGxhcmdlciBvZiB0aGUgdHdvOiAqLwotCWlmIChzaXplX2EgPCBzaXplX2IpIHsKLQkJc2lnbiA9IC0xOwotCQl7IFB5TG9uZ09iamVjdCAqdGVtcCA9IGE7IGEgPSBiOyBiID0gdGVtcDsgfQotCQl7IFB5X3NzaXplX3Qgc2l6ZV90ZW1wID0gc2l6ZV9hOwotCQkgIHNpemVfYSA9IHNpemVfYjsKLQkJICBzaXplX2IgPSBzaXplX3RlbXA7IH0KLQl9Ci0JZWxzZSBpZiAoc2l6ZV9hID09IHNpemVfYikgewotCQkvKiBGaW5kIGhpZ2hlc3QgZGlnaXQgd2hlcmUgYSBhbmQgYiBkaWZmZXI6ICovCi0JCWkgPSBzaXplX2E7Ci0JCXdoaWxlICgtLWkgPj0gMCAmJiBhLT5vYl9kaWdpdFtpXSA9PSBiLT5vYl9kaWdpdFtpXSkKLQkJCTsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuIF9QeUxvbmdfTmV3KDApOwotCQlpZiAoYS0+b2JfZGlnaXRbaV0gPCBiLT5vYl9kaWdpdFtpXSkgewotCQkJc2lnbiA9IC0xOwotCQkJeyBQeUxvbmdPYmplY3QgKnRlbXAgPSBhOyBhID0gYjsgYiA9IHRlbXA7IH0KLQkJfQotCQlzaXplX2EgPSBzaXplX2IgPSBpKzE7Ci0JfQotCXogPSBfUHlMb25nX05ldyhzaXplX2EpOwotCWlmICh6ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBzaXplX2I7ICsraSkgewotCQkvKiBUaGUgZm9sbG93aW5nIGFzc3VtZXMgdW5zaWduZWQgYXJpdGhtZXRpYwotCQkgICB3b3JrcyBtb2R1bGUgMioqTiBmb3Igc29tZSBOPlB5TG9uZ19TSElGVC4gKi8KLQkJYm9ycm93ID0gYS0+b2JfZGlnaXRbaV0gLSBiLT5vYl9kaWdpdFtpXSAtIGJvcnJvdzsKLQkJei0+b2JfZGlnaXRbaV0gPSBib3Jyb3cgJiBQeUxvbmdfTUFTSzsKLQkJYm9ycm93ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCWJvcnJvdyAmPSAxOyAvKiBLZWVwIG9ubHkgb25lIHNpZ24gYml0ICovCi0JfQotCWZvciAoOyBpIDwgc2l6ZV9hOyArK2kpIHsKLQkJYm9ycm93ID0gYS0+b2JfZGlnaXRbaV0gLSBib3Jyb3c7Ci0JCXotPm9iX2RpZ2l0W2ldID0gYm9ycm93ICYgUHlMb25nX01BU0s7Ci0JCWJvcnJvdyA+Pj0gUHlMb25nX1NISUZUOwotCQlib3Jyb3cgJj0gMTsgLyogS2VlcCBvbmx5IG9uZSBzaWduIGJpdCAqLwotCX0KLQlhc3NlcnQoYm9ycm93ID09IDApOwotCWlmIChzaWduIDwgMCkKLQkJei0+b2Jfc2l6ZSA9IC0oei0+b2Jfc2l6ZSk7Ci0JcmV0dXJuIGxvbmdfbm9ybWFsaXplKHopOworICAgIC8qIEVuc3VyZSBhIGlzIHRoZSBsYXJnZXIgb2YgdGhlIHR3bzogKi8KKyAgICBpZiAoc2l6ZV9hIDwgc2l6ZV9iKSB7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgeyBQeUxvbmdPYmplY3QgKnRlbXAgPSBhOyBhID0gYjsgYiA9IHRlbXA7IH0KKyAgICAgICAgeyBQeV9zc2l6ZV90IHNpemVfdGVtcCA9IHNpemVfYTsKKyAgICAgICAgICBzaXplX2EgPSBzaXplX2I7CisgICAgICAgICAgc2l6ZV9iID0gc2l6ZV90ZW1wOyB9CisgICAgfQorICAgIGVsc2UgaWYgKHNpemVfYSA9PSBzaXplX2IpIHsKKyAgICAgICAgLyogRmluZCBoaWdoZXN0IGRpZ2l0IHdoZXJlIGEgYW5kIGIgZGlmZmVyOiAqLworICAgICAgICBpID0gc2l6ZV9hOworICAgICAgICB3aGlsZSAoLS1pID49IDAgJiYgYS0+b2JfZGlnaXRbaV0gPT0gYi0+b2JfZGlnaXRbaV0pCisgICAgICAgICAgICA7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBfUHlMb25nX05ldygwKTsKKyAgICAgICAgaWYgKGEtPm9iX2RpZ2l0W2ldIDwgYi0+b2JfZGlnaXRbaV0pIHsKKyAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgICAgIHsgUHlMb25nT2JqZWN0ICp0ZW1wID0gYTsgYSA9IGI7IGIgPSB0ZW1wOyB9CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV9hID0gc2l6ZV9iID0gaSsxOworICAgIH0KKyAgICB6ID0gX1B5TG9uZ19OZXcoc2l6ZV9hKTsKKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9iOyArK2kpIHsKKyAgICAgICAgLyogVGhlIGZvbGxvd2luZyBhc3N1bWVzIHVuc2lnbmVkIGFyaXRobWV0aWMKKyAgICAgICAgICAgd29ya3MgbW9kdWxlIDIqKk4gZm9yIHNvbWUgTj5QeUxvbmdfU0hJRlQuICovCisgICAgICAgIGJvcnJvdyA9IGEtPm9iX2RpZ2l0W2ldIC0gYi0+b2JfZGlnaXRbaV0gLSBib3Jyb3c7CisgICAgICAgIHotPm9iX2RpZ2l0W2ldID0gYm9ycm93ICYgUHlMb25nX01BU0s7CisgICAgICAgIGJvcnJvdyA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICBib3Jyb3cgJj0gMTsgLyogS2VlcCBvbmx5IG9uZSBzaWduIGJpdCAqLworICAgIH0KKyAgICBmb3IgKDsgaSA8IHNpemVfYTsgKytpKSB7CisgICAgICAgIGJvcnJvdyA9IGEtPm9iX2RpZ2l0W2ldIC0gYm9ycm93OworICAgICAgICB6LT5vYl9kaWdpdFtpXSA9IGJvcnJvdyAmIFB5TG9uZ19NQVNLOworICAgICAgICBib3Jyb3cgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgYm9ycm93ICY9IDE7IC8qIEtlZXAgb25seSBvbmUgc2lnbiBiaXQgKi8KKyAgICB9CisgICAgYXNzZXJ0KGJvcnJvdyA9PSAwKTsKKyAgICBpZiAoc2lnbiA8IDApCisgICAgICAgIHotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOworICAgIHJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfYWRkKFB5TG9uZ09iamVjdCAqdiwgUHlMb25nT2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmIsICp6OworICAgIFB5TG9uZ09iamVjdCAqYSwgKmIsICp6OwogCi0JQ09OVkVSVF9CSU5PUCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAmYSwgJmIpOworICAgIENPTlZFUlRfQklOT1AoKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgJmEsICZiKTsKIAotCWlmIChhLT5vYl9zaXplIDwgMCkgewotCQlpZiAoYi0+b2Jfc2l6ZSA8IDApIHsKLQkJCXogPSB4X2FkZChhLCBiKTsKLQkJCWlmICh6ICE9IE5VTEwgJiYgei0+b2Jfc2l6ZSAhPSAwKQotCQkJCXotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOwotCQl9Ci0JCWVsc2UKLQkJCXogPSB4X3N1YihiLCBhKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChiLT5vYl9zaXplIDwgMCkKLQkJCXogPSB4X3N1YihhLCBiKTsKLQkJZWxzZQotCQkJeiA9IHhfYWRkKGEsIGIpOwotCX0KLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXJldHVybiAoUHlPYmplY3QgKil6OworICAgIGlmIChhLT5vYl9zaXplIDwgMCkgeworICAgICAgICBpZiAoYi0+b2Jfc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIHogPSB4X2FkZChhLCBiKTsKKyAgICAgICAgICAgIGlmICh6ICE9IE5VTEwgJiYgei0+b2Jfc2l6ZSAhPSAwKQorICAgICAgICAgICAgICAgIHotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHogPSB4X3N1YihiLCBhKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChiLT5vYl9zaXplIDwgMCkKKyAgICAgICAgICAgIHogPSB4X3N1YihhLCBiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeiA9IHhfYWRkKGEsIGIpOworICAgIH0KKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHJldHVybiAoUHlPYmplY3QgKil6OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19zdWIoUHlMb25nT2JqZWN0ICp2LCBQeUxvbmdPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYiwgKno7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYiwgKno7CiAKLQlDT05WRVJUX0JJTk9QKChQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsICZhLCAmYik7CisgICAgQ09OVkVSVF9CSU5PUCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAmYSwgJmIpOwogCi0JaWYgKGEtPm9iX3NpemUgPCAwKSB7Ci0JCWlmIChiLT5vYl9zaXplIDwgMCkKLQkJCXogPSB4X3N1YihhLCBiKTsKLQkJZWxzZQotCQkJeiA9IHhfYWRkKGEsIGIpOwotCQlpZiAoeiAhPSBOVUxMICYmIHotPm9iX3NpemUgIT0gMCkKLQkJCXotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOwotCX0KLQllbHNlIHsKLQkJaWYgKGItPm9iX3NpemUgPCAwKQotCQkJeiA9IHhfYWRkKGEsIGIpOwotCQllbHNlCi0JCQl6ID0geF9zdWIoYSwgYik7Ci0JfQotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXo7CisgICAgaWYgKGEtPm9iX3NpemUgPCAwKSB7CisgICAgICAgIGlmIChiLT5vYl9zaXplIDwgMCkKKyAgICAgICAgICAgIHogPSB4X3N1YihhLCBiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeiA9IHhfYWRkKGEsIGIpOworICAgICAgICBpZiAoeiAhPSBOVUxMICYmIHotPm9iX3NpemUgIT0gMCkKKyAgICAgICAgICAgIHotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGItPm9iX3NpemUgPCAwKQorICAgICAgICAgICAgeiA9IHhfYWRkKGEsIGIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6ID0geF9zdWIoYSwgYik7CisgICAgfQorICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXo7CiB9CiAKIC8qIEdyYWRlIHNjaG9vbCBtdWx0aXBsaWNhdGlvbiwgaWdub3JpbmcgdGhlIHNpZ25zLgpAQCAtMjU1Niw4NSArMjU1Niw4NSBAQAogc3RhdGljIFB5TG9uZ09iamVjdCAqCiB4X211bChQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYikKIHsKLQlQeUxvbmdPYmplY3QgKno7Ci0JUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSk7Ci0JUHlfc3NpemVfdCBzaXplX2IgPSBBQlMoUHlfU0laRShiKSk7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5TG9uZ09iamVjdCAqejsKKyAgICBQeV9zc2l6ZV90IHNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICBQeV9zc2l6ZV90IHNpemVfYiA9IEFCUyhQeV9TSVpFKGIpKTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLSAgICAgCXogPSBfUHlMb25nX05ldyhzaXplX2EgKyBzaXplX2IpOwotCWlmICh6ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHogPSBfUHlMb25nX05ldyhzaXplX2EgKyBzaXplX2IpOworICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbWVtc2V0KHotPm9iX2RpZ2l0LCAwLCBQeV9TSVpFKHopICogc2l6ZW9mKGRpZ2l0KSk7Ci0JaWYgKGEgPT0gYikgewotCQkvKiBFZmZpY2llbnQgc3F1YXJpbmcgcGVyIEhBQywgQWxnb3JpdGhtIDE0LjE2OgotCQkgKiBodHRwOi8vd3d3LmNhY3IubWF0aC51d2F0ZXJsb28uY2EvaGFjL2Fib3V0L2NoYXAxNC5wZGYKLQkJICogR2l2ZXMgc2xpZ2h0bHkgbGVzcyB0aGFuIGEgMnggc3BlZWR1cCB3aGVuIGEgPT0gYiwKLQkJICogdmlhIGV4cGxvaXRpbmcgdGhhdCBlYWNoIGVudHJ5IGluIHRoZSBtdWx0aXBsaWNhdGlvbgotCQkgKiBweXJhbWlkIGFwcGVhcnMgdHdpY2UgKGV4Y2VwdCBmb3IgdGhlIHNpemVfYSBzcXVhcmVzKS4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplX2E7ICsraSkgewotCQkJdHdvZGlnaXRzIGNhcnJ5OwotCQkJdHdvZGlnaXRzIGYgPSBhLT5vYl9kaWdpdFtpXTsKLQkJCWRpZ2l0ICpweiA9IHotPm9iX2RpZ2l0ICsgKGkgPDwgMSk7Ci0JCQlkaWdpdCAqcGEgPSBhLT5vYl9kaWdpdCArIGkgKyAxOwotCQkJZGlnaXQgKnBhZW5kID0gYS0+b2JfZGlnaXQgKyBzaXplX2E7CisgICAgbWVtc2V0KHotPm9iX2RpZ2l0LCAwLCBQeV9TSVpFKHopICogc2l6ZW9mKGRpZ2l0KSk7CisgICAgaWYgKGEgPT0gYikgeworICAgICAgICAvKiBFZmZpY2llbnQgc3F1YXJpbmcgcGVyIEhBQywgQWxnb3JpdGhtIDE0LjE2OgorICAgICAgICAgKiBodHRwOi8vd3d3LmNhY3IubWF0aC51d2F0ZXJsb28uY2EvaGFjL2Fib3V0L2NoYXAxNC5wZGYKKyAgICAgICAgICogR2l2ZXMgc2xpZ2h0bHkgbGVzcyB0aGFuIGEgMnggc3BlZWR1cCB3aGVuIGEgPT0gYiwKKyAgICAgICAgICogdmlhIGV4cGxvaXRpbmcgdGhhdCBlYWNoIGVudHJ5IGluIHRoZSBtdWx0aXBsaWNhdGlvbgorICAgICAgICAgKiBweXJhbWlkIGFwcGVhcnMgdHdpY2UgKGV4Y2VwdCBmb3IgdGhlIHNpemVfYSBzcXVhcmVzKS4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX2E7ICsraSkgeworICAgICAgICAgICAgdHdvZGlnaXRzIGNhcnJ5OworICAgICAgICAgICAgdHdvZGlnaXRzIGYgPSBhLT5vYl9kaWdpdFtpXTsKKyAgICAgICAgICAgIGRpZ2l0ICpweiA9IHotPm9iX2RpZ2l0ICsgKGkgPDwgMSk7CisgICAgICAgICAgICBkaWdpdCAqcGEgPSBhLT5vYl9kaWdpdCArIGkgKyAxOworICAgICAgICAgICAgZGlnaXQgKnBhZW5kID0gYS0+b2JfZGlnaXQgKyBzaXplX2E7CiAKLQkJCVNJR0NIRUNLKHsKLQkJCQlQeV9ERUNSRUYoeik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9KQorICAgICAgICAgICAgU0lHQ0hFQ0soeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih6KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0pCiAKLQkJCWNhcnJ5ID0gKnB6ICsgZiAqIGY7Ci0JCQkqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7Ci0JCQljYXJyeSA+Pj0gUHlMb25nX1NISUZUOwotCQkJYXNzZXJ0KGNhcnJ5IDw9IFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgIGNhcnJ5ID0gKnB6ICsgZiAqIGY7CisgICAgICAgICAgICAqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgYXNzZXJ0KGNhcnJ5IDw9IFB5TG9uZ19NQVNLKTsKIAotCQkJLyogTm93IGYgaXMgYWRkZWQgaW4gdHdpY2UgaW4gZWFjaCBjb2x1bW4gb2YgdGhlCi0JCQkgKiBweXJhbWlkIGl0IGFwcGVhcnMuICBTYW1lIGFzIGFkZGluZyBmPDwxIG9uY2UuCi0JCQkgKi8KLQkJCWYgPDw9IDE7Ci0JCQl3aGlsZSAocGEgPCBwYWVuZCkgewotCQkJCWNhcnJ5ICs9ICpweiArICpwYSsrICogZjsKLQkJCQkqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7Ci0JCQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQkJCQlhc3NlcnQoY2FycnkgPD0gKFB5TG9uZ19NQVNLIDw8IDEpKTsKLQkJCX0KLQkJCWlmIChjYXJyeSkgewotCQkJCWNhcnJ5ICs9ICpwejsKLQkJCQkqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7Ci0JCQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQkJCX0KLQkJCWlmIChjYXJyeSkKLQkJCQkqcHogKz0gKGRpZ2l0KShjYXJyeSAmIFB5TG9uZ19NQVNLKTsKLQkJCWFzc2VydCgoY2FycnkgPj4gUHlMb25nX1NISUZUKSA9PSAwKTsKLQkJfQotCX0KLQllbHNlIHsJLyogYSBpcyBub3QgdGhlIHNhbWUgYXMgYiAtLSBncmFkZXNjaG9vbCBsb25nIG11bHQgKi8KLQkJZm9yIChpID0gMDsgaSA8IHNpemVfYTsgKytpKSB7Ci0JCQl0d29kaWdpdHMgY2FycnkgPSAwOwotCQkJdHdvZGlnaXRzIGYgPSBhLT5vYl9kaWdpdFtpXTsKLQkJCWRpZ2l0ICpweiA9IHotPm9iX2RpZ2l0ICsgaTsKLQkJCWRpZ2l0ICpwYiA9IGItPm9iX2RpZ2l0OwotCQkJZGlnaXQgKnBiZW5kID0gYi0+b2JfZGlnaXQgKyBzaXplX2I7CisgICAgICAgICAgICAvKiBOb3cgZiBpcyBhZGRlZCBpbiB0d2ljZSBpbiBlYWNoIGNvbHVtbiBvZiB0aGUKKyAgICAgICAgICAgICAqIHB5cmFtaWQgaXQgYXBwZWFycy4gIFNhbWUgYXMgYWRkaW5nIGY8PDEgb25jZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZiA8PD0gMTsKKyAgICAgICAgICAgIHdoaWxlIChwYSA8IHBhZW5kKSB7CisgICAgICAgICAgICAgICAgY2FycnkgKz0gKnB6ICsgKnBhKysgKiBmOworICAgICAgICAgICAgICAgICpweisrID0gKGRpZ2l0KShjYXJyeSAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgICAgIGFzc2VydChjYXJyeSA8PSAoUHlMb25nX01BU0sgPDwgMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhcnJ5KSB7CisgICAgICAgICAgICAgICAgY2FycnkgKz0gKnB6OworICAgICAgICAgICAgICAgICpweisrID0gKGRpZ2l0KShjYXJyeSAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhcnJ5KQorICAgICAgICAgICAgICAgICpweiArPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgYXNzZXJ0KChjYXJyeSA+PiBQeUxvbmdfU0hJRlQpID09IDApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeyAgICAgIC8qIGEgaXMgbm90IHRoZSBzYW1lIGFzIGIgLS0gZ3JhZGVzY2hvb2wgbG9uZyBtdWx0ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX2E7ICsraSkgeworICAgICAgICAgICAgdHdvZGlnaXRzIGNhcnJ5ID0gMDsKKyAgICAgICAgICAgIHR3b2RpZ2l0cyBmID0gYS0+b2JfZGlnaXRbaV07CisgICAgICAgICAgICBkaWdpdCAqcHogPSB6LT5vYl9kaWdpdCArIGk7CisgICAgICAgICAgICBkaWdpdCAqcGIgPSBiLT5vYl9kaWdpdDsKKyAgICAgICAgICAgIGRpZ2l0ICpwYmVuZCA9IGItPm9iX2RpZ2l0ICsgc2l6ZV9iOwogCi0JCQlTSUdDSEVDSyh7Ci0JCQkJUHlfREVDUkVGKHopOwotCQkJCXJldHVybiBOVUxMOwotCQkJfSkKKyAgICAgICAgICAgIFNJR0NIRUNLKHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9KQogCi0JCQl3aGlsZSAocGIgPCBwYmVuZCkgewotCQkJCWNhcnJ5ICs9ICpweiArICpwYisrICogZjsKLQkJCQkqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7Ci0JCQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQkJCQlhc3NlcnQoY2FycnkgPD0gUHlMb25nX01BU0spOwotCQkJfQotCQkJaWYgKGNhcnJ5KQotCQkJCSpweiArPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOwotCQkJYXNzZXJ0KChjYXJyeSA+PiBQeUxvbmdfU0hJRlQpID09IDApOwotCQl9Ci0JfQotCXJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICAgICAgICAgIHdoaWxlIChwYiA8IHBiZW5kKSB7CisgICAgICAgICAgICAgICAgY2FycnkgKz0gKnB6ICsgKnBiKysgKiBmOworICAgICAgICAgICAgICAgICpweisrID0gKGRpZ2l0KShjYXJyeSAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgICAgIGFzc2VydChjYXJyeSA8PSBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FycnkpCisgICAgICAgICAgICAgICAgKnB6ICs9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICBhc3NlcnQoKGNhcnJ5ID4+IFB5TG9uZ19TSElGVCkgPT0gMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxvbmdfbm9ybWFsaXplKHopOwogfQogCiAvKiBBIGhlbHBlciBmb3IgS2FyYXRzdWJhIG11bHRpcGxpY2F0aW9uIChrX211bCkuCkBAIC0yNjQ3LDI2ICsyNjQ3LDI2IEBACiBzdGF0aWMgaW50CiBrbXVsX3NwbGl0KFB5TG9uZ09iamVjdCAqbiwgUHlfc3NpemVfdCBzaXplLCBQeUxvbmdPYmplY3QgKipoaWdoLCBQeUxvbmdPYmplY3QgKipsb3cpCiB7Ci0JUHlMb25nT2JqZWN0ICpoaSwgKmxvOwotCVB5X3NzaXplX3Qgc2l6ZV9sbywgc2l6ZV9oaTsKLQljb25zdCBQeV9zc2l6ZV90IHNpemVfbiA9IEFCUyhQeV9TSVpFKG4pKTsKKyAgICBQeUxvbmdPYmplY3QgKmhpLCAqbG87CisgICAgUHlfc3NpemVfdCBzaXplX2xvLCBzaXplX2hpOworICAgIGNvbnN0IFB5X3NzaXplX3Qgc2l6ZV9uID0gQUJTKFB5X1NJWkUobikpOwogCi0Jc2l6ZV9sbyA9IE1JTihzaXplX24sIHNpemUpOwotCXNpemVfaGkgPSBzaXplX24gLSBzaXplX2xvOworICAgIHNpemVfbG8gPSBNSU4oc2l6ZV9uLCBzaXplKTsKKyAgICBzaXplX2hpID0gc2l6ZV9uIC0gc2l6ZV9sbzsKIAotCWlmICgoaGkgPSBfUHlMb25nX05ldyhzaXplX2hpKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmICgobG8gPSBfUHlMb25nX05ldyhzaXplX2xvKSkgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaGkpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICgoaGkgPSBfUHlMb25nX05ldyhzaXplX2hpKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICgobG8gPSBfUHlMb25nX05ldyhzaXplX2xvKSkgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaGkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbWVtY3B5KGxvLT5vYl9kaWdpdCwgbi0+b2JfZGlnaXQsIHNpemVfbG8gKiBzaXplb2YoZGlnaXQpKTsKLQltZW1jcHkoaGktPm9iX2RpZ2l0LCBuLT5vYl9kaWdpdCArIHNpemVfbG8sIHNpemVfaGkgKiBzaXplb2YoZGlnaXQpKTsKKyAgICBtZW1jcHkobG8tPm9iX2RpZ2l0LCBuLT5vYl9kaWdpdCwgc2l6ZV9sbyAqIHNpemVvZihkaWdpdCkpOworICAgIG1lbWNweShoaS0+b2JfZGlnaXQsIG4tPm9iX2RpZ2l0ICsgc2l6ZV9sbywgc2l6ZV9oaSAqIHNpemVvZihkaWdpdCkpOwogCi0JKmhpZ2ggPSBsb25nX25vcm1hbGl6ZShoaSk7Ci0JKmxvdyA9IGxvbmdfbm9ybWFsaXplKGxvKTsKLQlyZXR1cm4gMDsKKyAgICAqaGlnaCA9IGxvbmdfbm9ybWFsaXplKGhpKTsKKyAgICAqbG93ID0gbG9uZ19ub3JtYWxpemUobG8pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlMb25nT2JqZWN0ICprX2xvcHNpZGVkX211bChQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYik7CkBAIC0yNjc4LDE2OSArMjY3OCwxNjkgQEAKIHN0YXRpYyBQeUxvbmdPYmplY3QgKgoga19tdWwoUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIpCiB7Ci0JUHlfc3NpemVfdCBhc2l6ZSA9IEFCUyhQeV9TSVpFKGEpKTsKLQlQeV9zc2l6ZV90IGJzaXplID0gQUJTKFB5X1NJWkUoYikpOwotCVB5TG9uZ09iamVjdCAqYWggPSBOVUxMOwotCVB5TG9uZ09iamVjdCAqYWwgPSBOVUxMOwotCVB5TG9uZ09iamVjdCAqYmggPSBOVUxMOwotCVB5TG9uZ09iamVjdCAqYmwgPSBOVUxMOwotCVB5TG9uZ09iamVjdCAqcmV0ID0gTlVMTDsKLQlQeUxvbmdPYmplY3QgKnQxLCAqdDIsICp0MzsKLQlQeV9zc2l6ZV90IHNoaWZ0OwkvKiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB3ZSBzcGxpdCBvZmYgKi8KLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBhc2l6ZSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICBQeV9zc2l6ZV90IGJzaXplID0gQUJTKFB5X1NJWkUoYikpOworICAgIFB5TG9uZ09iamVjdCAqYWggPSBOVUxMOworICAgIFB5TG9uZ09iamVjdCAqYWwgPSBOVUxMOworICAgIFB5TG9uZ09iamVjdCAqYmggPSBOVUxMOworICAgIFB5TG9uZ09iamVjdCAqYmwgPSBOVUxMOworICAgIFB5TG9uZ09iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBQeUxvbmdPYmplY3QgKnQxLCAqdDIsICp0MzsKKyAgICBQeV9zc2l6ZV90IHNoaWZ0OyAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBkaWdpdHMgd2Ugc3BsaXQgb2ZmICovCisgICAgUHlfc3NpemVfdCBpOwogCi0JLyogKGFoKlgrYWwpKGJoKlgrYmwpID0gYWgqYmgqWCpYICsgKGFoKmJsICsgYWwqYmgpKlggKyBhbCpibAotCSAqIExldCBrID0gKGFoK2FsKSooYmgrYmwpID0gYWgqYmwgKyBhbCpiaCAgKyBhaCpiaCArIGFsKmJsCi0JICogVGhlbiB0aGUgb3JpZ2luYWwgcHJvZHVjdCBpcwotCSAqICAgICBhaCpiaCpYKlggKyAoayAtIGFoKmJoIC0gYWwqYmwpKlggKyBhbCpibAotCSAqIEJ5IHBpY2tpbmcgWCB0byBiZSBhIHBvd2VyIG9mIDIsICIqWCIgaXMganVzdCBzaGlmdGluZywgYW5kIGl0J3MKLQkgKiBiZWVuIHJlZHVjZWQgdG8gMyBtdWx0aXBsaWVzIG9uIG51bWJlcnMgaGFsZiB0aGUgc2l6ZS4KLQkgKi8KKyAgICAvKiAoYWgqWCthbCkoYmgqWCtibCkgPSBhaCpiaCpYKlggKyAoYWgqYmwgKyBhbCpiaCkqWCArIGFsKmJsCisgICAgICogTGV0IGsgPSAoYWgrYWwpKihiaCtibCkgPSBhaCpibCArIGFsKmJoICArIGFoKmJoICsgYWwqYmwKKyAgICAgKiBUaGVuIHRoZSBvcmlnaW5hbCBwcm9kdWN0IGlzCisgICAgICogICAgIGFoKmJoKlgqWCArIChrIC0gYWgqYmggLSBhbCpibCkqWCArIGFsKmJsCisgICAgICogQnkgcGlja2luZyBYIHRvIGJlIGEgcG93ZXIgb2YgMiwgIipYIiBpcyBqdXN0IHNoaWZ0aW5nLCBhbmQgaXQncworICAgICAqIGJlZW4gcmVkdWNlZCB0byAzIG11bHRpcGxpZXMgb24gbnVtYmVycyBoYWxmIHRoZSBzaXplLgorICAgICAqLwogCi0JLyogV2Ugd2FudCB0byBzcGxpdCBiYXNlZCBvbiB0aGUgbGFyZ2VyIG51bWJlcjsgZmlkZGxlIHNvIHRoYXQgYgotCSAqIGlzIGxhcmdlc3QuCi0JICovCi0JaWYgKGFzaXplID4gYnNpemUpIHsKLQkJdDEgPSBhOwotCQlhID0gYjsKLQkJYiA9IHQxOworICAgIC8qIFdlIHdhbnQgdG8gc3BsaXQgYmFzZWQgb24gdGhlIGxhcmdlciBudW1iZXI7IGZpZGRsZSBzbyB0aGF0IGIKKyAgICAgKiBpcyBsYXJnZXN0LgorICAgICAqLworICAgIGlmIChhc2l6ZSA+IGJzaXplKSB7CisgICAgICAgIHQxID0gYTsKKyAgICAgICAgYSA9IGI7CisgICAgICAgIGIgPSB0MTsKIAotCQlpID0gYXNpemU7Ci0JCWFzaXplID0gYnNpemU7Ci0JCWJzaXplID0gaTsKLQl9CisgICAgICAgIGkgPSBhc2l6ZTsKKyAgICAgICAgYXNpemUgPSBic2l6ZTsKKyAgICAgICAgYnNpemUgPSBpOworICAgIH0KIAotCS8qIFVzZSBncmFkZXNjaG9vbCBtYXRoIHdoZW4gZWl0aGVyIG51bWJlciBpcyB0b28gc21hbGwuICovCi0JaSA9IGEgPT0gYiA/IEtBUkFUU1VCQV9TUVVBUkVfQ1VUT0ZGIDogS0FSQVRTVUJBX0NVVE9GRjsKLQlpZiAoYXNpemUgPD0gaSkgewotCQlpZiAoYXNpemUgPT0gMCkKLQkJCXJldHVybiBfUHlMb25nX05ldygwKTsKLQkJZWxzZQotCQkJcmV0dXJuIHhfbXVsKGEsIGIpOwotCX0KKyAgICAvKiBVc2UgZ3JhZGVzY2hvb2wgbWF0aCB3aGVuIGVpdGhlciBudW1iZXIgaXMgdG9vIHNtYWxsLiAqLworICAgIGkgPSBhID09IGIgPyBLQVJBVFNVQkFfU1FVQVJFX0NVVE9GRiA6IEtBUkFUU1VCQV9DVVRPRkY7CisgICAgaWYgKGFzaXplIDw9IGkpIHsKKyAgICAgICAgaWYgKGFzaXplID09IDApCisgICAgICAgICAgICByZXR1cm4gX1B5TG9uZ19OZXcoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB4X211bChhLCBiKTsKKyAgICB9CiAKLQkvKiBJZiBhIGlzIHNtYWxsIGNvbXBhcmVkIHRvIGIsIHNwbGl0dGluZyBvbiBiIGdpdmVzIGEgZGVnZW5lcmF0ZQotCSAqIGNhc2Ugd2l0aCBhaD09MCwgYW5kIEthcmF0c3ViYSBtYXkgYmUgKGV2ZW4gbXVjaCkgbGVzcyBlZmZpY2llbnQKLQkgKiB0aGFuICJncmFkZSBzY2hvb2wiIHRoZW4uICBIb3dldmVyLCB3ZSBjYW4gc3RpbGwgd2luLCBieSB2aWV3aW5nCi0JICogYiBhcyBhIHN0cmluZyBvZiAiYmlnIGRpZ2l0cyIsIGVhY2ggb2Ygd2lkdGggYS0+b2Jfc2l6ZS4gIFRoYXQKLQkgKiBsZWFkcyB0byBhIHNlcXVlbmNlIG9mIGJhbGFuY2VkIGNhbGxzIHRvIGtfbXVsLgotCSAqLwotCWlmICgyICogYXNpemUgPD0gYnNpemUpCi0JCXJldHVybiBrX2xvcHNpZGVkX211bChhLCBiKTsKKyAgICAvKiBJZiBhIGlzIHNtYWxsIGNvbXBhcmVkIHRvIGIsIHNwbGl0dGluZyBvbiBiIGdpdmVzIGEgZGVnZW5lcmF0ZQorICAgICAqIGNhc2Ugd2l0aCBhaD09MCwgYW5kIEthcmF0c3ViYSBtYXkgYmUgKGV2ZW4gbXVjaCkgbGVzcyBlZmZpY2llbnQKKyAgICAgKiB0aGFuICJncmFkZSBzY2hvb2wiIHRoZW4uICBIb3dldmVyLCB3ZSBjYW4gc3RpbGwgd2luLCBieSB2aWV3aW5nCisgICAgICogYiBhcyBhIHN0cmluZyBvZiAiYmlnIGRpZ2l0cyIsIGVhY2ggb2Ygd2lkdGggYS0+b2Jfc2l6ZS4gIFRoYXQKKyAgICAgKiBsZWFkcyB0byBhIHNlcXVlbmNlIG9mIGJhbGFuY2VkIGNhbGxzIHRvIGtfbXVsLgorICAgICAqLworICAgIGlmICgyICogYXNpemUgPD0gYnNpemUpCisgICAgICAgIHJldHVybiBrX2xvcHNpZGVkX211bChhLCBiKTsKIAotCS8qIFNwbGl0IGEgJiBiIGludG8gaGkgJiBsbyBwaWVjZXMuICovCi0Jc2hpZnQgPSBic2l6ZSA+PiAxOwotCWlmIChrbXVsX3NwbGl0KGEsIHNoaWZ0LCAmYWgsICZhbCkgPCAwKSBnb3RvIGZhaWw7Ci0JYXNzZXJ0KFB5X1NJWkUoYWgpID4gMCk7CS8qIHRoZSBzcGxpdCBpc24ndCBkZWdlbmVyYXRlICovCisgICAgLyogU3BsaXQgYSAmIGIgaW50byBoaSAmIGxvIHBpZWNlcy4gKi8KKyAgICBzaGlmdCA9IGJzaXplID4+IDE7CisgICAgaWYgKGttdWxfc3BsaXQoYSwgc2hpZnQsICZhaCwgJmFsKSA8IDApIGdvdG8gZmFpbDsKKyAgICBhc3NlcnQoUHlfU0laRShhaCkgPiAwKTsgICAgICAgICAgICAvKiB0aGUgc3BsaXQgaXNuJ3QgZGVnZW5lcmF0ZSAqLwogCi0JaWYgKGEgPT0gYikgewotCQliaCA9IGFoOwotCQlibCA9IGFsOwotCQlQeV9JTkNSRUYoYmgpOwotCQlQeV9JTkNSRUYoYmwpOwotCX0KLQllbHNlIGlmIChrbXVsX3NwbGl0KGIsIHNoaWZ0LCAmYmgsICZibCkgPCAwKSBnb3RvIGZhaWw7CisgICAgaWYgKGEgPT0gYikgeworICAgICAgICBiaCA9IGFoOworICAgICAgICBibCA9IGFsOworICAgICAgICBQeV9JTkNSRUYoYmgpOworICAgICAgICBQeV9JTkNSRUYoYmwpOworICAgIH0KKyAgICBlbHNlIGlmIChrbXVsX3NwbGl0KGIsIHNoaWZ0LCAmYmgsICZibCkgPCAwKSBnb3RvIGZhaWw7CiAKLQkvKiBUaGUgcGxhbjoKLQkgKiAxLiBBbGxvY2F0ZSByZXN1bHQgc3BhY2UgKGFzaXplICsgYnNpemUgZGlnaXRzOiAgdGhhdCdzIGFsd2F5cwotCSAqICAgIGVub3VnaCkuCi0JICogMi4gQ29tcHV0ZSBhaCpiaCwgYW5kIGNvcHkgaW50byByZXN1bHQgYXQgMipzaGlmdC4KLQkgKiAzLiBDb21wdXRlIGFsKmJsLCBhbmQgY29weSBpbnRvIHJlc3VsdCBhdCAwLiAgTm90ZSB0aGF0IHRoaXMKLQkgKiAgICBjYW4ndCBvdmVybGFwIHdpdGggIzIuCi0JICogNC4gU3VidHJhY3QgYWwqYmwgZnJvbSB0aGUgcmVzdWx0LCBzdGFydGluZyBhdCBzaGlmdC4gIFRoaXMgbWF5Ci0JICogICAgdW5kZXJmbG93IChib3Jyb3cgb3V0IG9mIHRoZSBoaWdoIGRpZ2l0KSwgYnV0IHdlIGRvbid0IGNhcmU6Ci0JICogICAgd2UncmUgZWZmZWN0aXZlbHkgZG9pbmcgdW5zaWduZWQgYXJpdGhtZXRpYyBtb2QKLQkgKiAgICBQeUxvbmdfQkFTRSoqKHNpemVhICsgc2l6ZWIpLCBhbmQgc28gbG9uZyBhcyB0aGUgKmZpbmFsKiByZXN1bHQgZml0cywKLQkgKiAgICBib3Jyb3dzIGFuZCBjYXJyaWVzIG91dCBvZiB0aGUgaGlnaCBkaWdpdCBjYW4gYmUgaWdub3JlZC4KLQkgKiA1LiBTdWJ0cmFjdCBhaCpiaCBmcm9tIHRoZSByZXN1bHQsIHN0YXJ0aW5nIGF0IHNoaWZ0LgotCSAqIDYuIENvbXB1dGUgKGFoK2FsKSooYmgrYmwpLCBhbmQgYWRkIGl0IGludG8gdGhlIHJlc3VsdCBzdGFydGluZwotCSAqICAgIGF0IHNoaWZ0LgotCSAqLworICAgIC8qIFRoZSBwbGFuOgorICAgICAqIDEuIEFsbG9jYXRlIHJlc3VsdCBzcGFjZSAoYXNpemUgKyBic2l6ZSBkaWdpdHM6ICB0aGF0J3MgYWx3YXlzCisgICAgICogICAgZW5vdWdoKS4KKyAgICAgKiAyLiBDb21wdXRlIGFoKmJoLCBhbmQgY29weSBpbnRvIHJlc3VsdCBhdCAyKnNoaWZ0LgorICAgICAqIDMuIENvbXB1dGUgYWwqYmwsIGFuZCBjb3B5IGludG8gcmVzdWx0IGF0IDAuICBOb3RlIHRoYXQgdGhpcworICAgICAqICAgIGNhbid0IG92ZXJsYXAgd2l0aCAjMi4KKyAgICAgKiA0LiBTdWJ0cmFjdCBhbCpibCBmcm9tIHRoZSByZXN1bHQsIHN0YXJ0aW5nIGF0IHNoaWZ0LiAgVGhpcyBtYXkKKyAgICAgKiAgICB1bmRlcmZsb3cgKGJvcnJvdyBvdXQgb2YgdGhlIGhpZ2ggZGlnaXQpLCBidXQgd2UgZG9uJ3QgY2FyZToKKyAgICAgKiAgICB3ZSdyZSBlZmZlY3RpdmVseSBkb2luZyB1bnNpZ25lZCBhcml0aG1ldGljIG1vZAorICAgICAqICAgIFB5TG9uZ19CQVNFKiooc2l6ZWEgKyBzaXplYiksIGFuZCBzbyBsb25nIGFzIHRoZSAqZmluYWwqIHJlc3VsdCBmaXRzLAorICAgICAqICAgIGJvcnJvd3MgYW5kIGNhcnJpZXMgb3V0IG9mIHRoZSBoaWdoIGRpZ2l0IGNhbiBiZSBpZ25vcmVkLgorICAgICAqIDUuIFN1YnRyYWN0IGFoKmJoIGZyb20gdGhlIHJlc3VsdCwgc3RhcnRpbmcgYXQgc2hpZnQuCisgICAgICogNi4gQ29tcHV0ZSAoYWgrYWwpKihiaCtibCksIGFuZCBhZGQgaXQgaW50byB0aGUgcmVzdWx0IHN0YXJ0aW5nCisgICAgICogICAgYXQgc2hpZnQuCisgICAgICovCiAKLQkvKiAxLiBBbGxvY2F0ZSByZXN1bHQgc3BhY2UuICovCi0JcmV0ID0gX1B5TG9uZ19OZXcoYXNpemUgKyBic2l6ZSk7Ci0JaWYgKHJldCA9PSBOVUxMKSBnb3RvIGZhaWw7CisgICAgLyogMS4gQWxsb2NhdGUgcmVzdWx0IHNwYWNlLiAqLworICAgIHJldCA9IF9QeUxvbmdfTmV3KGFzaXplICsgYnNpemUpOworICAgIGlmIChyZXQgPT0gTlVMTCkgZ290byBmYWlsOwogI2lmZGVmIFB5X0RFQlVHCi0JLyogRmlsbCB3aXRoIHRyYXNoLCB0byBjYXRjaCByZWZlcmVuY2UgdG8gdW5pbml0aWFsaXplZCBkaWdpdHMuICovCi0JbWVtc2V0KHJldC0+b2JfZGlnaXQsIDB4REYsIFB5X1NJWkUocmV0KSAqIHNpemVvZihkaWdpdCkpOworICAgIC8qIEZpbGwgd2l0aCB0cmFzaCwgdG8gY2F0Y2ggcmVmZXJlbmNlIHRvIHVuaW5pdGlhbGl6ZWQgZGlnaXRzLiAqLworICAgIG1lbXNldChyZXQtPm9iX2RpZ2l0LCAweERGLCBQeV9TSVpFKHJldCkgKiBzaXplb2YoZGlnaXQpKTsKICNlbmRpZgogCi0JLyogMi4gdDEgPC0gYWgqYmgsIGFuZCBjb3B5IGludG8gaGlnaCBkaWdpdHMgb2YgcmVzdWx0LiAqLwotCWlmICgodDEgPSBrX211bChhaCwgYmgpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JYXNzZXJ0KFB5X1NJWkUodDEpID49IDApOwotCWFzc2VydCgyKnNoaWZ0ICsgUHlfU0laRSh0MSkgPD0gUHlfU0laRShyZXQpKTsKLQltZW1jcHkocmV0LT5vYl9kaWdpdCArIDIqc2hpZnQsIHQxLT5vYl9kaWdpdCwKLQkgICAgICAgUHlfU0laRSh0MSkgKiBzaXplb2YoZGlnaXQpKTsKKyAgICAvKiAyLiB0MSA8LSBhaCpiaCwgYW5kIGNvcHkgaW50byBoaWdoIGRpZ2l0cyBvZiByZXN1bHQuICovCisgICAgaWYgKCh0MSA9IGtfbXVsKGFoLCBiaCkpID09IE5VTEwpIGdvdG8gZmFpbDsKKyAgICBhc3NlcnQoUHlfU0laRSh0MSkgPj0gMCk7CisgICAgYXNzZXJ0KDIqc2hpZnQgKyBQeV9TSVpFKHQxKSA8PSBQeV9TSVpFKHJldCkpOworICAgIG1lbWNweShyZXQtPm9iX2RpZ2l0ICsgMipzaGlmdCwgdDEtPm9iX2RpZ2l0LAorICAgICAgICAgICBQeV9TSVpFKHQxKSAqIHNpemVvZihkaWdpdCkpOwogCi0JLyogWmVyby1vdXQgdGhlIGRpZ2l0cyBoaWdoZXIgdGhhbiB0aGUgYWgqYmggY29weS4gKi8KLQlpID0gUHlfU0laRShyZXQpIC0gMipzaGlmdCAtIFB5X1NJWkUodDEpOwotCWlmIChpKQotCQltZW1zZXQocmV0LT5vYl9kaWdpdCArIDIqc2hpZnQgKyBQeV9TSVpFKHQxKSwgMCwKLQkJICAgICAgIGkgKiBzaXplb2YoZGlnaXQpKTsKKyAgICAvKiBaZXJvLW91dCB0aGUgZGlnaXRzIGhpZ2hlciB0aGFuIHRoZSBhaCpiaCBjb3B5LiAqLworICAgIGkgPSBQeV9TSVpFKHJldCkgLSAyKnNoaWZ0IC0gUHlfU0laRSh0MSk7CisgICAgaWYgKGkpCisgICAgICAgIG1lbXNldChyZXQtPm9iX2RpZ2l0ICsgMipzaGlmdCArIFB5X1NJWkUodDEpLCAwLAorICAgICAgICAgICAgICAgaSAqIHNpemVvZihkaWdpdCkpOwogCi0JLyogMy4gdDIgPC0gYWwqYmwsIGFuZCBjb3B5IGludG8gdGhlIGxvdyBkaWdpdHMuICovCi0JaWYgKCh0MiA9IGtfbXVsKGFsLCBibCkpID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHQxKTsKLQkJZ290byBmYWlsOwotCX0KLQlhc3NlcnQoUHlfU0laRSh0MikgPj0gMCk7Ci0JYXNzZXJ0KFB5X1NJWkUodDIpIDw9IDIqc2hpZnQpOyAvKiBubyBvdmVybGFwIHdpdGggaGlnaCBkaWdpdHMgKi8KLQltZW1jcHkocmV0LT5vYl9kaWdpdCwgdDItPm9iX2RpZ2l0LCBQeV9TSVpFKHQyKSAqIHNpemVvZihkaWdpdCkpOworICAgIC8qIDMuIHQyIDwtIGFsKmJsLCBhbmQgY29weSBpbnRvIHRoZSBsb3cgZGlnaXRzLiAqLworICAgIGlmICgodDIgPSBrX211bChhbCwgYmwpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih0MSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgYXNzZXJ0KFB5X1NJWkUodDIpID49IDApOworICAgIGFzc2VydChQeV9TSVpFKHQyKSA8PSAyKnNoaWZ0KTsgLyogbm8gb3ZlcmxhcCB3aXRoIGhpZ2ggZGlnaXRzICovCisgICAgbWVtY3B5KHJldC0+b2JfZGlnaXQsIHQyLT5vYl9kaWdpdCwgUHlfU0laRSh0MikgKiBzaXplb2YoZGlnaXQpKTsKIAotCS8qIFplcm8gb3V0IHJlbWFpbmluZyBkaWdpdHMuICovCi0JaSA9IDIqc2hpZnQgLSBQeV9TSVpFKHQyKTsJLyogbnVtYmVyIG9mIHVuaW5pdGlhbGl6ZWQgZGlnaXRzICovCi0JaWYgKGkpCi0JCW1lbXNldChyZXQtPm9iX2RpZ2l0ICsgUHlfU0laRSh0MiksIDAsIGkgKiBzaXplb2YoZGlnaXQpKTsKKyAgICAvKiBaZXJvIG91dCByZW1haW5pbmcgZGlnaXRzLiAqLworICAgIGkgPSAyKnNoaWZ0IC0gUHlfU0laRSh0Mik7ICAgICAgICAgIC8qIG51bWJlciBvZiB1bmluaXRpYWxpemVkIGRpZ2l0cyAqLworICAgIGlmIChpKQorICAgICAgICBtZW1zZXQocmV0LT5vYl9kaWdpdCArIFB5X1NJWkUodDIpLCAwLCBpICogc2l6ZW9mKGRpZ2l0KSk7CiAKLQkvKiA0ICYgNS4gU3VidHJhY3QgYWgqYmggKHQxKSBhbmQgYWwqYmwgKHQyKS4gIFdlIGRvIGFsKmJsIGZpcnN0Ci0JICogYmVjYXVzZSBpdCdzIGZyZXNoZXIgaW4gY2FjaGUuCi0JICovCi0JaSA9IFB5X1NJWkUocmV0KSAtIHNoaWZ0OyAgLyogIyBkaWdpdHMgYWZ0ZXIgc2hpZnQgKi8KLQkodm9pZCl2X2lzdWIocmV0LT5vYl9kaWdpdCArIHNoaWZ0LCBpLCB0Mi0+b2JfZGlnaXQsIFB5X1NJWkUodDIpKTsKLQlQeV9ERUNSRUYodDIpOworICAgIC8qIDQgJiA1LiBTdWJ0cmFjdCBhaCpiaCAodDEpIGFuZCBhbCpibCAodDIpLiAgV2UgZG8gYWwqYmwgZmlyc3QKKyAgICAgKiBiZWNhdXNlIGl0J3MgZnJlc2hlciBpbiBjYWNoZS4KKyAgICAgKi8KKyAgICBpID0gUHlfU0laRShyZXQpIC0gc2hpZnQ7ICAvKiAjIGRpZ2l0cyBhZnRlciBzaGlmdCAqLworICAgICh2b2lkKXZfaXN1YihyZXQtPm9iX2RpZ2l0ICsgc2hpZnQsIGksIHQyLT5vYl9kaWdpdCwgUHlfU0laRSh0MikpOworICAgIFB5X0RFQ1JFRih0Mik7CiAKLQkodm9pZCl2X2lzdWIocmV0LT5vYl9kaWdpdCArIHNoaWZ0LCBpLCB0MS0+b2JfZGlnaXQsIFB5X1NJWkUodDEpKTsKLQlQeV9ERUNSRUYodDEpOworICAgICh2b2lkKXZfaXN1YihyZXQtPm9iX2RpZ2l0ICsgc2hpZnQsIGksIHQxLT5vYl9kaWdpdCwgUHlfU0laRSh0MSkpOworICAgIFB5X0RFQ1JFRih0MSk7CiAKLQkvKiA2LiB0MyA8LSAoYWgrYWwpKGJoK2JsKSwgYW5kIGFkZCBpbnRvIHJlc3VsdC4gKi8KLQlpZiAoKHQxID0geF9hZGQoYWgsIGFsKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCVB5X0RFQ1JFRihhaCk7Ci0JUHlfREVDUkVGKGFsKTsKLQlhaCA9IGFsID0gTlVMTDsKKyAgICAvKiA2LiB0MyA8LSAoYWgrYWwpKGJoK2JsKSwgYW5kIGFkZCBpbnRvIHJlc3VsdC4gKi8KKyAgICBpZiAoKHQxID0geF9hZGQoYWgsIGFsKSkgPT0gTlVMTCkgZ290byBmYWlsOworICAgIFB5X0RFQ1JFRihhaCk7CisgICAgUHlfREVDUkVGKGFsKTsKKyAgICBhaCA9IGFsID0gTlVMTDsKIAotCWlmIChhID09IGIpIHsKLQkJdDIgPSB0MTsKLQkJUHlfSU5DUkVGKHQyKTsKLQl9Ci0JZWxzZSBpZiAoKHQyID0geF9hZGQoYmgsIGJsKSkgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodDEpOwotCQlnb3RvIGZhaWw7Ci0JfQotCVB5X0RFQ1JFRihiaCk7Ci0JUHlfREVDUkVGKGJsKTsKLQliaCA9IGJsID0gTlVMTDsKKyAgICBpZiAoYSA9PSBiKSB7CisgICAgICAgIHQyID0gdDE7CisgICAgICAgIFB5X0lOQ1JFRih0Mik7CisgICAgfQorICAgIGVsc2UgaWYgKCh0MiA9IHhfYWRkKGJoLCBibCkpID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHQxKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBQeV9ERUNSRUYoYmgpOworICAgIFB5X0RFQ1JFRihibCk7CisgICAgYmggPSBibCA9IE5VTEw7CiAKLQl0MyA9IGtfbXVsKHQxLCB0Mik7Ci0JUHlfREVDUkVGKHQxKTsKLQlQeV9ERUNSRUYodDIpOwotCWlmICh0MyA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JYXNzZXJ0KFB5X1NJWkUodDMpID49IDApOworICAgIHQzID0ga19tdWwodDEsIHQyKTsKKyAgICBQeV9ERUNSRUYodDEpOworICAgIFB5X0RFQ1JFRih0Mik7CisgICAgaWYgKHQzID09IE5VTEwpIGdvdG8gZmFpbDsKKyAgICBhc3NlcnQoUHlfU0laRSh0MykgPj0gMCk7CiAKLQkvKiBBZGQgdDMuICBJdCdzIG5vdCBvYnZpb3VzIHdoeSB3ZSBjYW4ndCBydW4gb3V0IG9mIHJvb20gaGVyZS4KLQkgKiBTZWUgdGhlICgqKSBjb21tZW50IGFmdGVyIHRoaXMgZnVuY3Rpb24uCi0JICovCi0JKHZvaWQpdl9pYWRkKHJldC0+b2JfZGlnaXQgKyBzaGlmdCwgaSwgdDMtPm9iX2RpZ2l0LCBQeV9TSVpFKHQzKSk7Ci0JUHlfREVDUkVGKHQzKTsKKyAgICAvKiBBZGQgdDMuICBJdCdzIG5vdCBvYnZpb3VzIHdoeSB3ZSBjYW4ndCBydW4gb3V0IG9mIHJvb20gaGVyZS4KKyAgICAgKiBTZWUgdGhlICgqKSBjb21tZW50IGFmdGVyIHRoaXMgZnVuY3Rpb24uCisgICAgICovCisgICAgKHZvaWQpdl9pYWRkKHJldC0+b2JfZGlnaXQgKyBzaGlmdCwgaSwgdDMtPm9iX2RpZ2l0LCBQeV9TSVpFKHQzKSk7CisgICAgUHlfREVDUkVGKHQzKTsKIAotCXJldHVybiBsb25nX25vcm1hbGl6ZShyZXQpOworICAgIHJldHVybiBsb25nX25vcm1hbGl6ZShyZXQpOwogCiAgZmFpbDoKLSAJUHlfWERFQ1JFRihyZXQpOwotCVB5X1hERUNSRUYoYWgpOwotCVB5X1hERUNSRUYoYWwpOwotCVB5X1hERUNSRUYoYmgpOwotCVB5X1hERUNSRUYoYmwpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYocmV0KTsKKyAgICBQeV9YREVDUkVGKGFoKTsKKyAgICBQeV9YREVDUkVGKGFsKTsKKyAgICBQeV9YREVDUkVGKGJoKTsKKyAgICBQeV9YREVDUkVGKGJsKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogKCopIFdoeSBhZGRpbmcgdDMgY2FuJ3QgInJ1biBvdXQgb2Ygcm9vbSIgYWJvdmUuCkBAIC0yODk5LDc0ICsyODk5LDc0IEBACiBzdGF0aWMgUHlMb25nT2JqZWN0ICoKIGtfbG9wc2lkZWRfbXVsKFB5TG9uZ09iamVjdCAqYSwgUHlMb25nT2JqZWN0ICpiKQogewotCWNvbnN0IFB5X3NzaXplX3QgYXNpemUgPSBBQlMoUHlfU0laRShhKSk7Ci0JUHlfc3NpemVfdCBic2l6ZSA9IEFCUyhQeV9TSVpFKGIpKTsKLQlQeV9zc2l6ZV90IG5iZG9uZTsJLyogIyBvZiBiIGRpZ2l0cyBhbHJlYWR5IG11bHRpcGxpZWQgKi8KLQlQeUxvbmdPYmplY3QgKnJldDsKLQlQeUxvbmdPYmplY3QgKmJzbGljZSA9IE5VTEw7CisgICAgY29uc3QgUHlfc3NpemVfdCBhc2l6ZSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICBQeV9zc2l6ZV90IGJzaXplID0gQUJTKFB5X1NJWkUoYikpOworICAgIFB5X3NzaXplX3QgbmJkb25lOyAgICAgICAgICAvKiAjIG9mIGIgZGlnaXRzIGFscmVhZHkgbXVsdGlwbGllZCAqLworICAgIFB5TG9uZ09iamVjdCAqcmV0OworICAgIFB5TG9uZ09iamVjdCAqYnNsaWNlID0gTlVMTDsKIAotCWFzc2VydChhc2l6ZSA+IEtBUkFUU1VCQV9DVVRPRkYpOwotCWFzc2VydCgyICogYXNpemUgPD0gYnNpemUpOworICAgIGFzc2VydChhc2l6ZSA+IEtBUkFUU1VCQV9DVVRPRkYpOworICAgIGFzc2VydCgyICogYXNpemUgPD0gYnNpemUpOwogCi0JLyogQWxsb2NhdGUgcmVzdWx0IHNwYWNlLCBhbmQgemVybyBpdCBvdXQuICovCi0JcmV0ID0gX1B5TG9uZ19OZXcoYXNpemUgKyBic2l6ZSk7Ci0JaWYgKHJldCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQocmV0LT5vYl9kaWdpdCwgMCwgUHlfU0laRShyZXQpICogc2l6ZW9mKGRpZ2l0KSk7CisgICAgLyogQWxsb2NhdGUgcmVzdWx0IHNwYWNlLCBhbmQgemVybyBpdCBvdXQuICovCisgICAgcmV0ID0gX1B5TG9uZ19OZXcoYXNpemUgKyBic2l6ZSk7CisgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQocmV0LT5vYl9kaWdpdCwgMCwgUHlfU0laRShyZXQpICogc2l6ZW9mKGRpZ2l0KSk7CiAKLQkvKiBTdWNjZXNzaXZlIHNsaWNlcyBvZiBiIGFyZSBjb3BpZWQgaW50byBic2xpY2UuICovCi0JYnNsaWNlID0gX1B5TG9uZ19OZXcoYXNpemUpOwotCWlmIChic2xpY2UgPT0gTlVMTCkKLQkJZ290byBmYWlsOworICAgIC8qIFN1Y2Nlc3NpdmUgc2xpY2VzIG9mIGIgYXJlIGNvcGllZCBpbnRvIGJzbGljZS4gKi8KKyAgICBic2xpY2UgPSBfUHlMb25nX05ldyhhc2l6ZSk7CisgICAgaWYgKGJzbGljZSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CiAKLQluYmRvbmUgPSAwOwotCXdoaWxlIChic2l6ZSA+IDApIHsKLQkJUHlMb25nT2JqZWN0ICpwcm9kdWN0OwotCQljb25zdCBQeV9zc2l6ZV90IG5idG91c2UgPSBNSU4oYnNpemUsIGFzaXplKTsKKyAgICBuYmRvbmUgPSAwOworICAgIHdoaWxlIChic2l6ZSA+IDApIHsKKyAgICAgICAgUHlMb25nT2JqZWN0ICpwcm9kdWN0OworICAgICAgICBjb25zdCBQeV9zc2l6ZV90IG5idG91c2UgPSBNSU4oYnNpemUsIGFzaXplKTsKIAotCQkvKiBNdWx0aXBseSB0aGUgbmV4dCBzbGljZSBvZiBiIGJ5IGEuICovCi0JCW1lbWNweShic2xpY2UtPm9iX2RpZ2l0LCBiLT5vYl9kaWdpdCArIG5iZG9uZSwKLQkJICAgICAgIG5idG91c2UgKiBzaXplb2YoZGlnaXQpKTsKLQkJUHlfU0laRShic2xpY2UpID0gbmJ0b3VzZTsKLQkJcHJvZHVjdCA9IGtfbXVsKGEsIGJzbGljZSk7Ci0JCWlmIChwcm9kdWN0ID09IE5VTEwpCi0JCQlnb3RvIGZhaWw7CisgICAgICAgIC8qIE11bHRpcGx5IHRoZSBuZXh0IHNsaWNlIG9mIGIgYnkgYS4gKi8KKyAgICAgICAgbWVtY3B5KGJzbGljZS0+b2JfZGlnaXQsIGItPm9iX2RpZ2l0ICsgbmJkb25lLAorICAgICAgICAgICAgICAgbmJ0b3VzZSAqIHNpemVvZihkaWdpdCkpOworICAgICAgICBQeV9TSVpFKGJzbGljZSkgPSBuYnRvdXNlOworICAgICAgICBwcm9kdWN0ID0ga19tdWwoYSwgYnNsaWNlKTsKKyAgICAgICAgaWYgKHByb2R1Y3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKIAotCQkvKiBBZGQgaW50byByZXN1bHQuICovCi0JCSh2b2lkKXZfaWFkZChyZXQtPm9iX2RpZ2l0ICsgbmJkb25lLCBQeV9TSVpFKHJldCkgLSBuYmRvbmUsCi0JCQkgICAgIHByb2R1Y3QtPm9iX2RpZ2l0LCBQeV9TSVpFKHByb2R1Y3QpKTsKLQkJUHlfREVDUkVGKHByb2R1Y3QpOworICAgICAgICAvKiBBZGQgaW50byByZXN1bHQuICovCisgICAgICAgICh2b2lkKXZfaWFkZChyZXQtPm9iX2RpZ2l0ICsgbmJkb25lLCBQeV9TSVpFKHJldCkgLSBuYmRvbmUsCisgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LT5vYl9kaWdpdCwgUHlfU0laRShwcm9kdWN0KSk7CisgICAgICAgIFB5X0RFQ1JFRihwcm9kdWN0KTsKIAotCQlic2l6ZSAtPSBuYnRvdXNlOwotCQluYmRvbmUgKz0gbmJ0b3VzZTsKLQl9CisgICAgICAgIGJzaXplIC09IG5idG91c2U7CisgICAgICAgIG5iZG9uZSArPSBuYnRvdXNlOworICAgIH0KIAotCVB5X0RFQ1JFRihic2xpY2UpOwotCXJldHVybiBsb25nX25vcm1hbGl6ZShyZXQpOworICAgIFB5X0RFQ1JFRihic2xpY2UpOworICAgIHJldHVybiBsb25nX25vcm1hbGl6ZShyZXQpOwogCiAgZmFpbDoKLQlQeV9ERUNSRUYocmV0KTsKLQlQeV9YREVDUkVGKGJzbGljZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJldCk7CisgICAgUHlfWERFQ1JFRihic2xpY2UpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19tdWwoUHlMb25nT2JqZWN0ICp2LCBQeUxvbmdPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYiwgKno7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYiwgKno7CiAKLQlpZiAoIWNvbnZlcnRfYmlub3AoKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgJmEsICZiKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGlmICghY29udmVydF9iaW5vcCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAmYSwgJmIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CiAKLQl6ID0ga19tdWwoYSwgYik7Ci0JLyogTmVnYXRlIGlmIGV4YWN0bHkgb25lIG9mIHRoZSBpbnB1dHMgaXMgbmVnYXRpdmUuICovCi0JaWYgKCgoYS0+b2Jfc2l6ZSBeIGItPm9iX3NpemUpIDwgMCkgJiYgeikKLQkJei0+b2Jfc2l6ZSA9IC0oei0+b2Jfc2l6ZSk7Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopejsKKyAgICB6ID0ga19tdWwoYSwgYik7CisgICAgLyogTmVnYXRlIGlmIGV4YWN0bHkgb25lIG9mIHRoZSBpbnB1dHMgaXMgbmVnYXRpdmUuICovCisgICAgaWYgKCgoYS0+b2Jfc2l6ZSBeIGItPm9iX3NpemUpIDwgMCkgJiYgeikKKyAgICAgICAgei0+b2Jfc2l6ZSA9IC0oei0+b2Jfc2l6ZSk7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopejsKIH0KIAogLyogVGhlIC8gYW5kICUgb3BlcmF0b3JzIGFyZSBub3cgZGVmaW5lZCBpbiB0ZXJtcyBvZiBkaXZtb2QoKS4KQEAgLTI5NzUsMTEgKzI5NzUsMTEgQEAKICAgIHxhfCBieSB8YnwsIHdpdGggdGhlIHNpZ24gb2YgYS4gIFRoaXMgaXMgYWxzbyBleHByZXNzZWQKICAgIGFzIGEgLSBiKnRydW5jKGEvYiksIGlmIHRydW5jIHRydW5jYXRlcyB0b3dhcmRzIHplcm8uCiAgICBTb21lIGV4YW1wbGVzOgotICAgCSBhCSBiCWEgcmVtIGIJCWEgbW9kIGIKLSAgIAkgMTMJIDEwCSAzCQkgMwotICAgCS0xMwkgMTAJLTMJCSA3Ci0gICAJIDEzCS0xMAkgMwkJLTcKLSAgIAktMTMJLTEwCS0zCQktMworICAgICBhICAgICAgICAgICBiICAgICAgYSByZW0gYiAgICAgICAgIGEgbW9kIGIKKyAgICAgMTMgICAgICAgICAgMTAgICAgICAzICAgICAgICAgICAgICAgMworICAgIC0xMyAgICAgICAgICAxMCAgICAgLTMgICAgICAgICAgICAgICA3CisgICAgIDEzICAgICAgICAgLTEwICAgICAgMyAgICAgICAgICAgICAgLTcKKyAgICAtMTMgICAgICAgICAtMTAgICAgIC0zICAgICAgICAgICAgICAtMwogICAgU28sIHRvIGdldCBmcm9tIHJlbSB0byBtb2QsIHdlIGhhdmUgdG8gYWRkIGIgaWYgYSBhbmQgYgogICAgaGF2ZSBkaWZmZXJlbnQgc2lnbnMuICBXZSB0aGVuIHN1YnRyYWN0IG9uZSBmcm9tIHRoZSAnZGl2JwogICAgcGFydCBvZiB0aGUgb3V0Y29tZSB0byBrZWVwIHRoZSBpbnZhcmlhbnQgaW50YWN0LiAqLwpAQCAtMjk5Miw3NSArMjk5Miw3NSBAQAogICovCiBzdGF0aWMgaW50CiBsX2Rpdm1vZChQeUxvbmdPYmplY3QgKnYsIFB5TG9uZ09iamVjdCAqdywKLQkgUHlMb25nT2JqZWN0ICoqcGRpdiwgUHlMb25nT2JqZWN0ICoqcG1vZCkKKyAgICAgICAgIFB5TG9uZ09iamVjdCAqKnBkaXYsIFB5TG9uZ09iamVjdCAqKnBtb2QpCiB7Ci0JUHlMb25nT2JqZWN0ICpkaXYsICptb2Q7CisgICAgUHlMb25nT2JqZWN0ICpkaXYsICptb2Q7CiAKLQlpZiAobG9uZ19kaXZyZW0odiwgdywgJmRpdiwgJm1vZCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKChQeV9TSVpFKG1vZCkgPCAwICYmIFB5X1NJWkUodykgPiAwKSB8fAotCSAgICAoUHlfU0laRShtb2QpID4gMCAmJiBQeV9TSVpFKHcpIDwgMCkpIHsKLQkJUHlMb25nT2JqZWN0ICp0ZW1wOwotCQlQeUxvbmdPYmplY3QgKm9uZTsKLQkJdGVtcCA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19hZGQobW9kLCB3KTsKLQkJUHlfREVDUkVGKG1vZCk7Ci0JCW1vZCA9IHRlbXA7Ci0JCWlmIChtb2QgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGRpdik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJb25lID0gKFB5TG9uZ09iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmcoMUwpOwotCQlpZiAob25lID09IE5VTEwgfHwKLQkJICAgICh0ZW1wID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX3N1YihkaXYsIG9uZSkpID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihtb2QpOwotCQkJUHlfREVDUkVGKGRpdik7Ci0JCQlQeV9YREVDUkVGKG9uZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKG9uZSk7Ci0JCVB5X0RFQ1JFRihkaXYpOwotCQlkaXYgPSB0ZW1wOwotCX0KLQlpZiAocGRpdiAhPSBOVUxMKQotCQkqcGRpdiA9IGRpdjsKLQllbHNlCi0JCVB5X0RFQ1JFRihkaXYpOworICAgIGlmIChsb25nX2RpdnJlbSh2LCB3LCAmZGl2LCAmbW9kKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoKFB5X1NJWkUobW9kKSA8IDAgJiYgUHlfU0laRSh3KSA+IDApIHx8CisgICAgICAgIChQeV9TSVpFKG1vZCkgPiAwICYmIFB5X1NJWkUodykgPCAwKSkgeworICAgICAgICBQeUxvbmdPYmplY3QgKnRlbXA7CisgICAgICAgIFB5TG9uZ09iamVjdCAqb25lOworICAgICAgICB0ZW1wID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX2FkZChtb2QsIHcpOworICAgICAgICBQeV9ERUNSRUYobW9kKTsKKyAgICAgICAgbW9kID0gdGVtcDsKKyAgICAgICAgaWYgKG1vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGl2KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBvbmUgPSAoUHlMb25nT2JqZWN0ICopIFB5TG9uZ19Gcm9tTG9uZygxTCk7CisgICAgICAgIGlmIChvbmUgPT0gTlVMTCB8fAorICAgICAgICAgICAgKHRlbXAgPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfc3ViKGRpdiwgb25lKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG1vZCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGl2KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYob25lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYob25lKTsKKyAgICAgICAgUHlfREVDUkVGKGRpdik7CisgICAgICAgIGRpdiA9IHRlbXA7CisgICAgfQorICAgIGlmIChwZGl2ICE9IE5VTEwpCisgICAgICAgICpwZGl2ID0gZGl2OworICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKGRpdik7CiAKLQlpZiAocG1vZCAhPSBOVUxMKQotCQkqcG1vZCA9IG1vZDsKLQllbHNlCi0JCVB5X0RFQ1JFRihtb2QpOworICAgIGlmIChwbW9kICE9IE5VTEwpCisgICAgICAgICpwbW9kID0gbW9kOworICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKG1vZCk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfZGl2KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeUxvbmdPYmplY3QgKmEsICpiLCAqZGl2OworICAgIFB5TG9uZ09iamVjdCAqYSwgKmIsICpkaXY7CiAKLQlDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7Ci0JaWYgKGxfZGl2bW9kKGEsIGIsICZkaXYsIE5VTEwpIDwgMCkKLQkJZGl2ID0gTlVMTDsKLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXJldHVybiAoUHlPYmplY3QgKilkaXY7CisgICAgQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOworICAgIGlmIChsX2Rpdm1vZChhLCBiLCAmZGl2LCBOVUxMKSA8IDApCisgICAgICAgIGRpdiA9IE5VTEw7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGl2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19jbGFzc2ljX2RpdihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYiwgKmRpdjsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiLCAqZGl2OwogCi0JQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOwotCWlmIChQeV9EaXZpc2lvbldhcm5pbmdGbGFnICYmCi0JICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAiY2xhc3NpYyBsb25nIGRpdmlzaW9uIikgPCAwKQotCQlkaXYgPSBOVUxMOwotCWVsc2UgaWYgKGxfZGl2bW9kKGEsIGIsICZkaXYsIE5VTEwpIDwgMCkKLQkJZGl2ID0gTlVMTDsKLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXJldHVybiAoUHlPYmplY3QgKilkaXY7CisgICAgQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOworICAgIGlmIChQeV9EaXZpc2lvbldhcm5pbmdGbGFnICYmCisgICAgICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAiY2xhc3NpYyBsb25nIGRpdmlzaW9uIikgPCAwKQorICAgICAgICBkaXYgPSBOVUxMOworICAgIGVsc2UgaWYgKGxfZGl2bW9kKGEsIGIsICZkaXYsIE5VTEwpIDwgMCkKKyAgICAgICAgZGl2ID0gTlVMTDsKKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHJldHVybiAoUHlPYmplY3QgKilkaXY7CiB9CiAKIC8qIFB5TG9uZy9QeUxvbmcgLT4gZmxvYXQsIHdpdGggY29ycmVjdGx5IHJvdW5kZWQgcmVzdWx0LiAqLwpAQCAtMzA3MSw2NTMgKzMwNzEsNjUzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ190cnVlX2RpdmlkZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYiwgKng7Ci0JUHlfc3NpemVfdCBhX3NpemUsIGJfc2l6ZSwgc2hpZnQsIGV4dHJhX2JpdHMsIGRpZmYsIHhfc2l6ZSwgeF9iaXRzOwotCWRpZ2l0IG1hc2ssIGxvdzsKLQlpbnQgaW5leGFjdCwgbmVnYXRlLCBhX2lzX3NtYWxsLCBiX2lzX3NtYWxsOwotCWRvdWJsZSBkeCwgcmVzdWx0OworICAgIFB5TG9uZ09iamVjdCAqYSwgKmIsICp4OworICAgIFB5X3NzaXplX3QgYV9zaXplLCBiX3NpemUsIHNoaWZ0LCBleHRyYV9iaXRzLCBkaWZmLCB4X3NpemUsIHhfYml0czsKKyAgICBkaWdpdCBtYXNrLCBsb3c7CisgICAgaW50IGluZXhhY3QsIG5lZ2F0ZSwgYV9pc19zbWFsbCwgYl9pc19zbWFsbDsKKyAgICBkb3VibGUgZHgsIHJlc3VsdDsKIAotCUNPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CiAKLQkvKgotCSAgIE1ldGhvZCBpbiBhIG51dHNoZWxsOgorICAgIC8qCisgICAgICAgTWV0aG9kIGluIGEgbnV0c2hlbGw6CiAKLQkgICAgIDAuIHJlZHVjZSB0byBjYXNlIGEsIGIgPiAwOyBmaWx0ZXIgb3V0IG9idmlvdXMgdW5kZXJmbG93L292ZXJmbG93Ci0JICAgICAxLiBjaG9vc2UgYSBzdWl0YWJsZSBpbnRlZ2VyICdzaGlmdCcKLQkgICAgIDIuIHVzZSBpbnRlZ2VyIGFyaXRobWV0aWMgdG8gY29tcHV0ZSB4ID0gZmxvb3IoMioqLXNoaWZ0KmEvYikKLQkgICAgIDMuIGFkanVzdCB4IGZvciBjb3JyZWN0IHJvdW5kaW5nCi0JICAgICA0LiBjb252ZXJ0IHggdG8gYSBkb3VibGUgZHggd2l0aCB0aGUgc2FtZSB2YWx1ZQotCSAgICAgNS4gcmV0dXJuIGxkZXhwKGR4LCBzaGlmdCkuCisgICAgICAgICAwLiByZWR1Y2UgdG8gY2FzZSBhLCBiID4gMDsgZmlsdGVyIG91dCBvYnZpb3VzIHVuZGVyZmxvdy9vdmVyZmxvdworICAgICAgICAgMS4gY2hvb3NlIGEgc3VpdGFibGUgaW50ZWdlciAnc2hpZnQnCisgICAgICAgICAyLiB1c2UgaW50ZWdlciBhcml0aG1ldGljIHRvIGNvbXB1dGUgeCA9IGZsb29yKDIqKi1zaGlmdCphL2IpCisgICAgICAgICAzLiBhZGp1c3QgeCBmb3IgY29ycmVjdCByb3VuZGluZworICAgICAgICAgNC4gY29udmVydCB4IHRvIGEgZG91YmxlIGR4IHdpdGggdGhlIHNhbWUgdmFsdWUKKyAgICAgICAgIDUuIHJldHVybiBsZGV4cChkeCwgc2hpZnQpLgogCi0JICAgSW4gbW9yZSBkZXRhaWw6CisgICAgICAgSW4gbW9yZSBkZXRhaWw6CiAKLQkgICAwLiBGb3IgYW55IGEsIGEvMCByYWlzZXMgWmVyb0RpdmlzaW9uRXJyb3I7IGZvciBub256ZXJvIGIsIDAvYgotCSAgIHJldHVybnMgZWl0aGVyIDAuMCBvciAtMC4wLCBkZXBlbmRpbmcgb24gdGhlIHNpZ24gb2YgYi4gIEZvciBhIGFuZAotCSAgIGIgYm90aCBub256ZXJvLCBpZ25vcmUgc2lnbnMgb2YgYSBhbmQgYiwgYW5kIGFkZCB0aGUgc2lnbiBiYWNrIGluCi0JICAgYXQgdGhlIGVuZC4gIE5vdyB3cml0ZSBhX2JpdHMgYW5kIGJfYml0cyBmb3IgdGhlIGJpdCBsZW5ndGhzIG9mIGEKLQkgICBhbmQgYiByZXNwZWN0aXZlbHkgKHRoYXQgaXMsIGFfYml0cyA9IDEgKyBmbG9vcihsb2dfMihhKSk7IGxpa2V3aXNlCi0JICAgZm9yIGIpLiAgVGhlbgorICAgICAgIDAuIEZvciBhbnkgYSwgYS8wIHJhaXNlcyBaZXJvRGl2aXNpb25FcnJvcjsgZm9yIG5vbnplcm8gYiwgMC9iCisgICAgICAgcmV0dXJucyBlaXRoZXIgMC4wIG9yIC0wLjAsIGRlcGVuZGluZyBvbiB0aGUgc2lnbiBvZiBiLiAgRm9yIGEgYW5kCisgICAgICAgYiBib3RoIG5vbnplcm8sIGlnbm9yZSBzaWducyBvZiBhIGFuZCBiLCBhbmQgYWRkIHRoZSBzaWduIGJhY2sgaW4KKyAgICAgICBhdCB0aGUgZW5kLiAgTm93IHdyaXRlIGFfYml0cyBhbmQgYl9iaXRzIGZvciB0aGUgYml0IGxlbmd0aHMgb2YgYQorICAgICAgIGFuZCBiIHJlc3BlY3RpdmVseSAodGhhdCBpcywgYV9iaXRzID0gMSArIGZsb29yKGxvZ18yKGEpKTsgbGlrZXdpc2UKKyAgICAgICBmb3IgYikuICBUaGVuCiAKLQkgICAgICAyKiooYV9iaXRzIC0gYl9iaXRzIC0gMSkgPCBhL2IgPCAyKiooYV9iaXRzIC0gYl9iaXRzICsgMSkuCisgICAgICAgICAgMioqKGFfYml0cyAtIGJfYml0cyAtIDEpIDwgYS9iIDwgMioqKGFfYml0cyAtIGJfYml0cyArIDEpLgogCi0JICAgU28gaWYgYV9iaXRzIC0gYl9iaXRzID4gREJMX01BWF9FWFAgdGhlbiBhL2IgPiAyKipEQkxfTUFYX0VYUCBhbmQKLQkgICBzbyBvdmVyZmxvd3MuICBTaW1pbGFybHksIGlmIGFfYml0cyAtIGJfYml0cyA8IERCTF9NSU5fRVhQIC0KLQkgICBEQkxfTUFOVF9ESUcgLSAxIHRoZW4gYS9iIHVuZGVyZmxvd3MgdG8gMC4gIFdpdGggdGhlc2UgY2FzZXMgb3V0IG9mCi0JICAgdGhlIHdheSwgd2UgY2FuIGFzc3VtZSB0aGF0CisgICAgICAgU28gaWYgYV9iaXRzIC0gYl9iaXRzID4gREJMX01BWF9FWFAgdGhlbiBhL2IgPiAyKipEQkxfTUFYX0VYUCBhbmQKKyAgICAgICBzbyBvdmVyZmxvd3MuICBTaW1pbGFybHksIGlmIGFfYml0cyAtIGJfYml0cyA8IERCTF9NSU5fRVhQIC0KKyAgICAgICBEQkxfTUFOVF9ESUcgLSAxIHRoZW4gYS9iIHVuZGVyZmxvd3MgdG8gMC4gIFdpdGggdGhlc2UgY2FzZXMgb3V0IG9mCisgICAgICAgdGhlIHdheSwgd2UgY2FuIGFzc3VtZSB0aGF0CiAKLQkgICAgICBEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRyAtIDEgPD0gYV9iaXRzIC0gYl9iaXRzIDw9IERCTF9NQVhfRVhQLgorICAgICAgICAgIERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gMSA8PSBhX2JpdHMgLSBiX2JpdHMgPD0gREJMX01BWF9FWFAuCiAKLQkgICAxLiBUaGUgaW50ZWdlciAnc2hpZnQnIGlzIGNob3NlbiBzbyB0aGF0IHggaGFzIHRoZSByaWdodCBudW1iZXIgb2YKLQkgICBiaXRzIGZvciBhIGRvdWJsZSwgcGx1cyB0d28gb3IgdGhyZWUgZXh0cmEgYml0cyB0aGF0IHdpbGwgYmUgdXNlZAotCSAgIGluIHRoZSByb3VuZGluZyBkZWNpc2lvbnMuICBXcml0aW5nIGFfYml0cyBhbmQgYl9iaXRzIGZvciB0aGUKLQkgICBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyBpbiBhIGFuZCBiIHJlc3BlY3RpdmVseSwgYQotCSAgIHN0cmFpZ2h0Zm9yd2FyZCBmb3JtdWxhIGZvciBzaGlmdCBpczoKKyAgICAgICAxLiBUaGUgaW50ZWdlciAnc2hpZnQnIGlzIGNob3NlbiBzbyB0aGF0IHggaGFzIHRoZSByaWdodCBudW1iZXIgb2YKKyAgICAgICBiaXRzIGZvciBhIGRvdWJsZSwgcGx1cyB0d28gb3IgdGhyZWUgZXh0cmEgYml0cyB0aGF0IHdpbGwgYmUgdXNlZAorICAgICAgIGluIHRoZSByb3VuZGluZyBkZWNpc2lvbnMuICBXcml0aW5nIGFfYml0cyBhbmQgYl9iaXRzIGZvciB0aGUKKyAgICAgICBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyBpbiBhIGFuZCBiIHJlc3BlY3RpdmVseSwgYQorICAgICAgIHN0cmFpZ2h0Zm9yd2FyZCBmb3JtdWxhIGZvciBzaGlmdCBpczoKIAotCSAgICAgIHNoaWZ0ID0gYV9iaXRzIC0gYl9iaXRzIC0gREJMX01BTlRfRElHIC0gMgorICAgICAgICAgIHNoaWZ0ID0gYV9iaXRzIC0gYl9iaXRzIC0gREJMX01BTlRfRElHIC0gMgogCi0JICAgVGhpcyBpcyBmaW5lIGluIHRoZSB1c3VhbCBjYXNlLCBidXQgaWYgYS9iIGlzIHNtYWxsZXIgdGhhbiB0aGUKLQkgICBzbWFsbGVzdCBub3JtYWwgZmxvYXQgdGhlbiBpdCBjYW4gbGVhZCB0byBkb3VibGUgcm91bmRpbmcgb24gYW4KLQkgICBJRUVFIDc1NCBwbGF0Zm9ybSwgZ2l2aW5nIGluY29ycmVjdGx5IHJvdW5kZWQgcmVzdWx0cy4gIFNvIHdlCi0JICAgYWRqdXN0IHRoZSBmb3JtdWxhIHNsaWdodGx5LiAgVGhlIGFjdHVhbCBmb3JtdWxhIHVzZWQgaXM6CisgICAgICAgVGhpcyBpcyBmaW5lIGluIHRoZSB1c3VhbCBjYXNlLCBidXQgaWYgYS9iIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICBzbWFsbGVzdCBub3JtYWwgZmxvYXQgdGhlbiBpdCBjYW4gbGVhZCB0byBkb3VibGUgcm91bmRpbmcgb24gYW4KKyAgICAgICBJRUVFIDc1NCBwbGF0Zm9ybSwgZ2l2aW5nIGluY29ycmVjdGx5IHJvdW5kZWQgcmVzdWx0cy4gIFNvIHdlCisgICAgICAgYWRqdXN0IHRoZSBmb3JtdWxhIHNsaWdodGx5LiAgVGhlIGFjdHVhbCBmb3JtdWxhIHVzZWQgaXM6CiAKLQkgICAgICAgc2hpZnQgPSBNQVgoYV9iaXRzIC0gYl9iaXRzLCBEQkxfTUlOX0VYUCkgLSBEQkxfTUFOVF9ESUcgLSAyCisgICAgICAgICAgIHNoaWZ0ID0gTUFYKGFfYml0cyAtIGJfYml0cywgREJMX01JTl9FWFApIC0gREJMX01BTlRfRElHIC0gMgogCi0JICAgMi4gVGhlIHF1YW50aXR5IHggaXMgY29tcHV0ZWQgYnkgZmlyc3Qgc2hpZnRpbmcgYSAobGVmdCAtc2hpZnQgYml0cwotCSAgIGlmIHNoaWZ0IDw9IDAsIHJpZ2h0IHNoaWZ0IGJpdHMgaWYgc2hpZnQgPiAwKSBhbmQgdGhlbiBkaXZpZGluZyBieQotCSAgIGIuICBGb3IgYm90aCB0aGUgc2hpZnQgYW5kIHRoZSBkaXZpc2lvbiwgd2Uga2VlcCB0cmFjayBvZiB3aGV0aGVyCi0JICAgdGhlIHJlc3VsdCBpcyBpbmV4YWN0LCBpbiBhIGZsYWcgJ2luZXhhY3QnOyB0aGlzIGluZm9ybWF0aW9uIGlzCi0JICAgbmVlZGVkIGF0IHRoZSByb3VuZGluZyBzdGFnZS4KKyAgICAgICAyLiBUaGUgcXVhbnRpdHkgeCBpcyBjb21wdXRlZCBieSBmaXJzdCBzaGlmdGluZyBhIChsZWZ0IC1zaGlmdCBiaXRzCisgICAgICAgaWYgc2hpZnQgPD0gMCwgcmlnaHQgc2hpZnQgYml0cyBpZiBzaGlmdCA+IDApIGFuZCB0aGVuIGRpdmlkaW5nIGJ5CisgICAgICAgYi4gIEZvciBib3RoIHRoZSBzaGlmdCBhbmQgdGhlIGRpdmlzaW9uLCB3ZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIKKyAgICAgICB0aGUgcmVzdWx0IGlzIGluZXhhY3QsIGluIGEgZmxhZyAnaW5leGFjdCc7IHRoaXMgaW5mb3JtYXRpb24gaXMKKyAgICAgICBuZWVkZWQgYXQgdGhlIHJvdW5kaW5nIHN0YWdlLgogCi0JICAgV2l0aCB0aGUgY2hvaWNlIG9mIHNoaWZ0IGFib3ZlLCB0b2dldGhlciB3aXRoIG91ciBhc3N1bXB0aW9uIHRoYXQKLQkgICBhX2JpdHMgLSBiX2JpdHMgPj0gREJMX01JTl9FWFAgLSBEQkxfTUFOVF9ESUcgLSAxLCBpdCBmb2xsb3dzCi0JICAgdGhhdCB4ID49IDEuCisgICAgICAgV2l0aCB0aGUgY2hvaWNlIG9mIHNoaWZ0IGFib3ZlLCB0b2dldGhlciB3aXRoIG91ciBhc3N1bXB0aW9uIHRoYXQKKyAgICAgICBhX2JpdHMgLSBiX2JpdHMgPj0gREJMX01JTl9FWFAgLSBEQkxfTUFOVF9ESUcgLSAxLCBpdCBmb2xsb3dzCisgICAgICAgdGhhdCB4ID49IDEuCiAKLQkgICAzLiBOb3cgeCAqIDIqKnNoaWZ0IDw9IGEvYiA8ICh4KzEpICogMioqc2hpZnQuICBXZSB3YW50IHRvIHJlcGxhY2UKLQkgICB0aGlzIHdpdGggYW4gZXhhY3RseSByZXByZXNlbnRhYmxlIGZsb2F0IG9mIHRoZSBmb3JtCisgICAgICAgMy4gTm93IHggKiAyKipzaGlmdCA8PSBhL2IgPCAoeCsxKSAqIDIqKnNoaWZ0LiAgV2Ugd2FudCB0byByZXBsYWNlCisgICAgICAgdGhpcyB3aXRoIGFuIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBmbG9hdCBvZiB0aGUgZm9ybQogCi0JICAgICAgcm91bmQoeC8yKipleHRyYV9iaXRzKSAqIDIqKihleHRyYV9iaXRzK3NoaWZ0KS4KKyAgICAgICAgICByb3VuZCh4LzIqKmV4dHJhX2JpdHMpICogMioqKGV4dHJhX2JpdHMrc2hpZnQpLgogCi0JICAgRm9yIGZsb2F0IHJlcHJlc2VudGFiaWxpdHksIHdlIG5lZWQgeC8yKipleHRyYV9iaXRzIDwKLQkgICAyKipEQkxfTUFOVF9ESUcgYW5kIGV4dHJhX2JpdHMgKyBzaGlmdCA+PSBEQkxfTUlOX0VYUCAtCi0JICAgREJMX01BTlRfRElHLiAgVGhpcyB0cmFuc2xhdGVzIHRvIHRoZSBjb25kaXRpb246CisgICAgICAgRm9yIGZsb2F0IHJlcHJlc2VudGFiaWxpdHksIHdlIG5lZWQgeC8yKipleHRyYV9iaXRzIDwKKyAgICAgICAyKipEQkxfTUFOVF9ESUcgYW5kIGV4dHJhX2JpdHMgKyBzaGlmdCA+PSBEQkxfTUlOX0VYUCAtCisgICAgICAgREJMX01BTlRfRElHLiAgVGhpcyB0cmFuc2xhdGVzIHRvIHRoZSBjb25kaXRpb246CiAKLQkgICAgICBleHRyYV9iaXRzID49IE1BWCh4X2JpdHMsIERCTF9NSU5fRVhQIC0gc2hpZnQpIC0gREJMX01BTlRfRElHCisgICAgICAgICAgZXh0cmFfYml0cyA+PSBNQVgoeF9iaXRzLCBEQkxfTUlOX0VYUCAtIHNoaWZ0KSAtIERCTF9NQU5UX0RJRwogCi0JICAgVG8gcm91bmQsIHdlIGp1c3QgbW9kaWZ5IHRoZSBib3R0b20gZGlnaXQgb2YgeCBpbi1wbGFjZTsgdGhpcyBjYW4KLQkgICBlbmQgdXAgZ2l2aW5nIGEgZGlnaXQgd2l0aCB2YWx1ZSA+IFB5TE9OR19NQVNLLCBidXQgdGhhdCdzIG5vdCBhCi0JICAgcHJvYmxlbSBzaW5jZSBkaWdpdHMgY2FuIGhvbGQgdmFsdWVzIHVwIHRvIDIqUHlMT05HX01BU0srMS4KKyAgICAgICBUbyByb3VuZCwgd2UganVzdCBtb2RpZnkgdGhlIGJvdHRvbSBkaWdpdCBvZiB4IGluLXBsYWNlOyB0aGlzIGNhbgorICAgICAgIGVuZCB1cCBnaXZpbmcgYSBkaWdpdCB3aXRoIHZhbHVlID4gUHlMT05HX01BU0ssIGJ1dCB0aGF0J3Mgbm90IGEKKyAgICAgICBwcm9ibGVtIHNpbmNlIGRpZ2l0cyBjYW4gaG9sZCB2YWx1ZXMgdXAgdG8gMipQeUxPTkdfTUFTSysxLgogCi0JICAgV2l0aCB0aGUgb3JpZ2luYWwgY2hvaWNlcyBmb3Igc2hpZnQgYWJvdmUsIGV4dHJhX2JpdHMgd2lsbCBhbHdheXMKLQkgICBiZSAyIG9yIDMuICBUaGVuIHJvdW5kaW5nIHVuZGVyIHRoZSByb3VuZC1oYWxmLXRvLWV2ZW4gcnVsZSwgd2UKLQkgICByb3VuZCB1cCBpZmYgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgb2YgdGhlIGV4dHJhIGJpdHMgaXMgMSwgYW5kCi0JICAgZWl0aGVyOiAoYSkgdGhlIGNvbXB1dGF0aW9uIG9mIHggaW4gc3RlcCAyIGhhZCBhbiBpbmV4YWN0IHJlc3VsdCwKLQkgICBvciAoYikgYXQgbGVhc3Qgb25lIG90aGVyIG9mIHRoZSBleHRyYSBiaXRzIGlzIDEsIG9yIChjKSB0aGUgbGVhc3QKLQkgICBzaWduaWZpY2FudCBiaXQgb2YgeCAoYWJvdmUgdGhvc2UgdG8gYmUgcm91bmRlZCkgaXMgMS4KKyAgICAgICBXaXRoIHRoZSBvcmlnaW5hbCBjaG9pY2VzIGZvciBzaGlmdCBhYm92ZSwgZXh0cmFfYml0cyB3aWxsIGFsd2F5cworICAgICAgIGJlIDIgb3IgMy4gIFRoZW4gcm91bmRpbmcgdW5kZXIgdGhlIHJvdW5kLWhhbGYtdG8tZXZlbiBydWxlLCB3ZQorICAgICAgIHJvdW5kIHVwIGlmZiB0aGUgbW9zdCBzaWduaWZpY2FudCBvZiB0aGUgZXh0cmEgYml0cyBpcyAxLCBhbmQKKyAgICAgICBlaXRoZXI6IChhKSB0aGUgY29tcHV0YXRpb24gb2YgeCBpbiBzdGVwIDIgaGFkIGFuIGluZXhhY3QgcmVzdWx0LAorICAgICAgIG9yIChiKSBhdCBsZWFzdCBvbmUgb3RoZXIgb2YgdGhlIGV4dHJhIGJpdHMgaXMgMSwgb3IgKGMpIHRoZSBsZWFzdAorICAgICAgIHNpZ25pZmljYW50IGJpdCBvZiB4IChhYm92ZSB0aG9zZSB0byBiZSByb3VuZGVkKSBpcyAxLgogCi0JICAgNC4gQ29udmVyc2lvbiB0byBhIGRvdWJsZSBpcyBzdHJhaWdodGZvcndhcmQ7IGFsbCBmbG9hdGluZy1wb2ludAotCSAgIG9wZXJhdGlvbnMgaW52b2x2ZWQgaW4gdGhlIGNvbnZlcnNpb24gYXJlIGV4YWN0LCBzbyB0aGVyZSdzIG5vCi0JICAgZGFuZ2VyIG9mIHJvdW5kaW5nIGVycm9ycy4KKyAgICAgICA0LiBDb252ZXJzaW9uIHRvIGEgZG91YmxlIGlzIHN0cmFpZ2h0Zm9yd2FyZDsgYWxsIGZsb2F0aW5nLXBvaW50CisgICAgICAgb3BlcmF0aW9ucyBpbnZvbHZlZCBpbiB0aGUgY29udmVyc2lvbiBhcmUgZXhhY3QsIHNvIHRoZXJlJ3Mgbm8KKyAgICAgICBkYW5nZXIgb2Ygcm91bmRpbmcgZXJyb3JzLgogCi0JICAgNS4gVXNlIGxkZXhwKHgsIHNoaWZ0KSB0byBjb21wdXRlIHgqMioqc2hpZnQsIHRoZSBmaW5hbCByZXN1bHQuCi0JICAgVGhlIHJlc3VsdCB3aWxsIGFsd2F5cyBiZSBleGFjdGx5IHJlcHJlc2VudGFibGUgYXMgYSBkb3VibGUsIGV4Y2VwdAotCSAgIGluIHRoZSBjYXNlIHRoYXQgaXQgb3ZlcmZsb3dzLiAgVG8gYXZvaWQgZGVwZW5kZW5jZSBvbiB0aGUgZXhhY3QKLQkgICBiZWhhdmlvdXIgb2YgbGRleHAgb24gb3ZlcmZsb3csIHdlIGNoZWNrIGZvciBvdmVyZmxvdyBiZWZvcmUKLQkgICBhcHBseWluZyBsZGV4cC4gIFRoZSByZXN1bHQgb2YgbGRleHAgaXMgYWRqdXN0ZWQgZm9yIHNpZ24gYmVmb3JlCi0JICAgcmV0dXJuaW5nLgotCSovCisgICAgICAgNS4gVXNlIGxkZXhwKHgsIHNoaWZ0KSB0byBjb21wdXRlIHgqMioqc2hpZnQsIHRoZSBmaW5hbCByZXN1bHQuCisgICAgICAgVGhlIHJlc3VsdCB3aWxsIGFsd2F5cyBiZSBleGFjdGx5IHJlcHJlc2VudGFibGUgYXMgYSBkb3VibGUsIGV4Y2VwdAorICAgICAgIGluIHRoZSBjYXNlIHRoYXQgaXQgb3ZlcmZsb3dzLiAgVG8gYXZvaWQgZGVwZW5kZW5jZSBvbiB0aGUgZXhhY3QKKyAgICAgICBiZWhhdmlvdXIgb2YgbGRleHAgb24gb3ZlcmZsb3csIHdlIGNoZWNrIGZvciBvdmVyZmxvdyBiZWZvcmUKKyAgICAgICBhcHBseWluZyBsZGV4cC4gIFRoZSByZXN1bHQgb2YgbGRleHAgaXMgYWRqdXN0ZWQgZm9yIHNpZ24gYmVmb3JlCisgICAgICAgcmV0dXJuaW5nLgorICAgICovCiAKLQkvKiBSZWR1Y2UgdG8gY2FzZSB3aGVyZSBhIGFuZCBiIGFyZSBib3RoIHBvc2l0aXZlLiAqLwotCWFfc2l6ZSA9IEFCUyhQeV9TSVpFKGEpKTsKLQliX3NpemUgPSBBQlMoUHlfU0laRShiKSk7Ci0JbmVnYXRlID0gKFB5X1NJWkUoYSkgPCAwKSBeIChQeV9TSVpFKGIpIDwgMCk7Ci0JaWYgKGJfc2l6ZSA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkiZGl2aXNpb24gYnkgemVybyIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlpZiAoYV9zaXplID09IDApCi0JCWdvdG8gdW5kZXJmbG93X29yX3plcm87CisgICAgLyogUmVkdWNlIHRvIGNhc2Ugd2hlcmUgYSBhbmQgYiBhcmUgYm90aCBwb3NpdGl2ZS4gKi8KKyAgICBhX3NpemUgPSBBQlMoUHlfU0laRShhKSk7CisgICAgYl9zaXplID0gQUJTKFB5X1NJWkUoYikpOworICAgIG5lZ2F0ZSA9IChQeV9TSVpFKGEpIDwgMCkgXiAoUHlfU0laRShiKSA8IDApOworICAgIGlmIChiX3NpemUgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGl2aXNpb24gYnkgemVybyIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAoYV9zaXplID09IDApCisgICAgICAgIGdvdG8gdW5kZXJmbG93X29yX3plcm87CiAKLQkvKiBGYXN0IHBhdGggZm9yIGEgYW5kIGIgc21hbGwgKGV4YWN0bHkgcmVwcmVzZW50YWJsZSBpbiBhIGRvdWJsZSkuCi0JICAgUmVsaWVzIG9uIGZsb2F0aW5nLXBvaW50IGRpdmlzaW9uIGJlaW5nIGNvcnJlY3RseSByb3VuZGVkOyByZXN1bHRzCi0JICAgbWF5IGJlIHN1YmplY3QgdG8gZG91YmxlIHJvdW5kaW5nIG9uIHg4NiBtYWNoaW5lcyB0aGF0IG9wZXJhdGUgd2l0aAotCSAgIHRoZSB4ODcgRlBVIHNldCB0byA2NC1iaXQgcHJlY2lzaW9uLiAqLwotCWFfaXNfc21hbGwgPSBhX3NpemUgPD0gTUFOVF9ESUdfRElHSVRTIHx8Ci0JCShhX3NpemUgPT0gTUFOVF9ESUdfRElHSVRTKzEgJiYKLQkJIGEtPm9iX2RpZ2l0W01BTlRfRElHX0RJR0lUU10gPj4gTUFOVF9ESUdfQklUUyA9PSAwKTsKLQliX2lzX3NtYWxsID0gYl9zaXplIDw9IE1BTlRfRElHX0RJR0lUUyB8fAotCQkoYl9zaXplID09IE1BTlRfRElHX0RJR0lUUysxICYmCi0JCSBiLT5vYl9kaWdpdFtNQU5UX0RJR19ESUdJVFNdID4+IE1BTlRfRElHX0JJVFMgPT0gMCk7Ci0JaWYgKGFfaXNfc21hbGwgJiYgYl9pc19zbWFsbCkgewotCQlkb3VibGUgZGEsIGRiOwotCQlkYSA9IGEtPm9iX2RpZ2l0Wy0tYV9zaXplXTsKLQkJd2hpbGUgKGFfc2l6ZSA+IDApCi0JCQlkYSA9IGRhICogUHlMb25nX0JBU0UgKyBhLT5vYl9kaWdpdFstLWFfc2l6ZV07Ci0JCWRiID0gYi0+b2JfZGlnaXRbLS1iX3NpemVdOwotCQl3aGlsZSAoYl9zaXplID4gMCkKLQkJCWRiID0gZGIgKiBQeUxvbmdfQkFTRSArIGItPm9iX2RpZ2l0Wy0tYl9zaXplXTsKLQkJcmVzdWx0ID0gZGEgLyBkYjsKLQkJZ290byBzdWNjZXNzOwotCX0KKyAgICAvKiBGYXN0IHBhdGggZm9yIGEgYW5kIGIgc21hbGwgKGV4YWN0bHkgcmVwcmVzZW50YWJsZSBpbiBhIGRvdWJsZSkuCisgICAgICAgUmVsaWVzIG9uIGZsb2F0aW5nLXBvaW50IGRpdmlzaW9uIGJlaW5nIGNvcnJlY3RseSByb3VuZGVkOyByZXN1bHRzCisgICAgICAgbWF5IGJlIHN1YmplY3QgdG8gZG91YmxlIHJvdW5kaW5nIG9uIHg4NiBtYWNoaW5lcyB0aGF0IG9wZXJhdGUgd2l0aAorICAgICAgIHRoZSB4ODcgRlBVIHNldCB0byA2NC1iaXQgcHJlY2lzaW9uLiAqLworICAgIGFfaXNfc21hbGwgPSBhX3NpemUgPD0gTUFOVF9ESUdfRElHSVRTIHx8CisgICAgICAgIChhX3NpemUgPT0gTUFOVF9ESUdfRElHSVRTKzEgJiYKKyAgICAgICAgIGEtPm9iX2RpZ2l0W01BTlRfRElHX0RJR0lUU10gPj4gTUFOVF9ESUdfQklUUyA9PSAwKTsKKyAgICBiX2lzX3NtYWxsID0gYl9zaXplIDw9IE1BTlRfRElHX0RJR0lUUyB8fAorICAgICAgICAoYl9zaXplID09IE1BTlRfRElHX0RJR0lUUysxICYmCisgICAgICAgICBiLT5vYl9kaWdpdFtNQU5UX0RJR19ESUdJVFNdID4+IE1BTlRfRElHX0JJVFMgPT0gMCk7CisgICAgaWYgKGFfaXNfc21hbGwgJiYgYl9pc19zbWFsbCkgeworICAgICAgICBkb3VibGUgZGEsIGRiOworICAgICAgICBkYSA9IGEtPm9iX2RpZ2l0Wy0tYV9zaXplXTsKKyAgICAgICAgd2hpbGUgKGFfc2l6ZSA+IDApCisgICAgICAgICAgICBkYSA9IGRhICogUHlMb25nX0JBU0UgKyBhLT5vYl9kaWdpdFstLWFfc2l6ZV07CisgICAgICAgIGRiID0gYi0+b2JfZGlnaXRbLS1iX3NpemVdOworICAgICAgICB3aGlsZSAoYl9zaXplID4gMCkKKyAgICAgICAgICAgIGRiID0gZGIgKiBQeUxvbmdfQkFTRSArIGItPm9iX2RpZ2l0Wy0tYl9zaXplXTsKKyAgICAgICAgcmVzdWx0ID0gZGEgLyBkYjsKKyAgICAgICAgZ290byBzdWNjZXNzOworICAgIH0KIAotCS8qIENhdGNoIG9idmlvdXMgY2FzZXMgb2YgdW5kZXJmbG93IGFuZCBvdmVyZmxvdyAqLwotCWRpZmYgPSBhX3NpemUgLSBiX3NpemU7Ci0JaWYgKGRpZmYgPiBQWV9TU0laRV9UX01BWC9QeUxvbmdfU0hJRlQgLSAxKQotCQkvKiBFeHRyZW1lIG92ZXJmbG93ICovCi0JCWdvdG8gb3ZlcmZsb3c7Ci0JZWxzZSBpZiAoZGlmZiA8IDEgLSBQWV9TU0laRV9UX01BWC9QeUxvbmdfU0hJRlQpCi0JCS8qIEV4dHJlbWUgdW5kZXJmbG93ICovCi0JCWdvdG8gdW5kZXJmbG93X29yX3plcm87Ci0JLyogTmV4dCBsaW5lIGlzIG5vdyBzYWZlIGZyb20gb3ZlcmZsb3dpbmcgYSBQeV9zc2l6ZV90ICovCi0JZGlmZiA9IGRpZmYgKiBQeUxvbmdfU0hJRlQgKyBiaXRzX2luX2RpZ2l0KGEtPm9iX2RpZ2l0W2Ffc2l6ZSAtIDFdKSAtCi0JCWJpdHNfaW5fZGlnaXQoYi0+b2JfZGlnaXRbYl9zaXplIC0gMV0pOwotCS8qIE5vdyBkaWZmID0gYV9iaXRzIC0gYl9iaXRzLiAqLwotCWlmIChkaWZmID4gREJMX01BWF9FWFApCi0JCWdvdG8gb3ZlcmZsb3c7Ci0JZWxzZSBpZiAoZGlmZiA8IERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gMSkKLQkJZ290byB1bmRlcmZsb3dfb3JfemVybzsKKyAgICAvKiBDYXRjaCBvYnZpb3VzIGNhc2VzIG9mIHVuZGVyZmxvdyBhbmQgb3ZlcmZsb3cgKi8KKyAgICBkaWZmID0gYV9zaXplIC0gYl9zaXplOworICAgIGlmIChkaWZmID4gUFlfU1NJWkVfVF9NQVgvUHlMb25nX1NISUZUIC0gMSkKKyAgICAgICAgLyogRXh0cmVtZSBvdmVyZmxvdyAqLworICAgICAgICBnb3RvIG92ZXJmbG93OworICAgIGVsc2UgaWYgKGRpZmYgPCAxIC0gUFlfU1NJWkVfVF9NQVgvUHlMb25nX1NISUZUKQorICAgICAgICAvKiBFeHRyZW1lIHVuZGVyZmxvdyAqLworICAgICAgICBnb3RvIHVuZGVyZmxvd19vcl96ZXJvOworICAgIC8qIE5leHQgbGluZSBpcyBub3cgc2FmZSBmcm9tIG92ZXJmbG93aW5nIGEgUHlfc3NpemVfdCAqLworICAgIGRpZmYgPSBkaWZmICogUHlMb25nX1NISUZUICsgYml0c19pbl9kaWdpdChhLT5vYl9kaWdpdFthX3NpemUgLSAxXSkgLQorICAgICAgICBiaXRzX2luX2RpZ2l0KGItPm9iX2RpZ2l0W2Jfc2l6ZSAtIDFdKTsKKyAgICAvKiBOb3cgZGlmZiA9IGFfYml0cyAtIGJfYml0cy4gKi8KKyAgICBpZiAoZGlmZiA+IERCTF9NQVhfRVhQKQorICAgICAgICBnb3RvIG92ZXJmbG93OworICAgIGVsc2UgaWYgKGRpZmYgPCBEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRyAtIDEpCisgICAgICAgIGdvdG8gdW5kZXJmbG93X29yX3plcm87CiAKLQkvKiBDaG9vc2UgdmFsdWUgZm9yIHNoaWZ0OyBzZWUgY29tbWVudHMgZm9yIHN0ZXAgMSBhYm92ZS4gKi8KLQlzaGlmdCA9IE1BWChkaWZmLCBEQkxfTUlOX0VYUCkgLSBEQkxfTUFOVF9ESUcgLSAyOworICAgIC8qIENob29zZSB2YWx1ZSBmb3Igc2hpZnQ7IHNlZSBjb21tZW50cyBmb3Igc3RlcCAxIGFib3ZlLiAqLworICAgIHNoaWZ0ID0gTUFYKGRpZmYsIERCTF9NSU5fRVhQKSAtIERCTF9NQU5UX0RJRyAtIDI7CiAKLQlpbmV4YWN0ID0gMDsKKyAgICBpbmV4YWN0ID0gMDsKIAotCS8qIHggPSBhYnMoYSAqIDIqKi1zaGlmdCkgKi8KLQlpZiAoc2hpZnQgPD0gMCkgewotCQlQeV9zc2l6ZV90IGksIHNoaWZ0X2RpZ2l0cyA9IC1zaGlmdCAvIFB5TG9uZ19TSElGVDsKLQkJZGlnaXQgcmVtOwotCQkvKiB4ID0gYSA8PCAtc2hpZnQgKi8KLQkJaWYgKGFfc2l6ZSA+PSBQWV9TU0laRV9UX01BWCAtIDEgLSBzaGlmdF9kaWdpdHMpIHsKLQkJCS8qIEluIHByYWN0aWNlLCBpdCdzIHByb2JhYmx5IGltcG9zc2libGUgdG8gZW5kIHVwCi0JCQkgICBoZXJlLiAgQm90aCBhIGFuZCBiIHdvdWxkIGhhdmUgdG8gYmUgZW5vcm1vdXMsCi0JCQkgICB1c2luZyBjbG9zZSB0byBTSVpFX1RfTUFYIGJ5dGVzIG9mIG1lbW9yeSBlYWNoLiAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJICAgICJpbnRlcm1lZGlhdGUgb3ZlcmZsb3cgZHVyaW5nIGRpdmlzaW9uIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCXggPSBfUHlMb25nX05ldyhhX3NpemUgKyBzaGlmdF9kaWdpdHMgKyAxKTsKLQkJaWYgKHggPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaGlmdF9kaWdpdHM7IGkrKykKLQkJCXgtPm9iX2RpZ2l0W2ldID0gMDsKLQkJcmVtID0gdl9sc2hpZnQoeC0+b2JfZGlnaXQgKyBzaGlmdF9kaWdpdHMsIGEtPm9iX2RpZ2l0LAotCQkJICAgICAgIGFfc2l6ZSwgLXNoaWZ0ICUgUHlMb25nX1NISUZUKTsKLQkJeC0+b2JfZGlnaXRbYV9zaXplICsgc2hpZnRfZGlnaXRzXSA9IHJlbTsKLQl9Ci0JZWxzZSB7Ci0JCVB5X3NzaXplX3Qgc2hpZnRfZGlnaXRzID0gc2hpZnQgLyBQeUxvbmdfU0hJRlQ7Ci0JCWRpZ2l0IHJlbTsKLQkJLyogeCA9IGEgPj4gc2hpZnQgKi8KLQkJYXNzZXJ0KGFfc2l6ZSA+PSBzaGlmdF9kaWdpdHMpOwotCQl4ID0gX1B5TG9uZ19OZXcoYV9zaXplIC0gc2hpZnRfZGlnaXRzKTsKLQkJaWYgKHggPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCXJlbSA9IHZfcnNoaWZ0KHgtPm9iX2RpZ2l0LCBhLT5vYl9kaWdpdCArIHNoaWZ0X2RpZ2l0cywKLQkJCSAgICAgICBhX3NpemUgLSBzaGlmdF9kaWdpdHMsIHNoaWZ0ICUgUHlMb25nX1NISUZUKTsKLQkJLyogc2V0IGluZXhhY3QgaWYgYW55IG9mIHRoZSBiaXRzIHNoaWZ0ZWQgb3V0IGlzIG5vbnplcm8gKi8KLQkJaWYgKHJlbSkKLQkJCWluZXhhY3QgPSAxOwotCQl3aGlsZSAoIWluZXhhY3QgJiYgc2hpZnRfZGlnaXRzID4gMCkKLQkJCWlmIChhLT5vYl9kaWdpdFstLXNoaWZ0X2RpZ2l0c10pCi0JCQkJaW5leGFjdCA9IDE7Ci0JfQotCWxvbmdfbm9ybWFsaXplKHgpOwotCXhfc2l6ZSA9IFB5X1NJWkUoeCk7CisgICAgLyogeCA9IGFicyhhICogMioqLXNoaWZ0KSAqLworICAgIGlmIChzaGlmdCA8PSAwKSB7CisgICAgICAgIFB5X3NzaXplX3QgaSwgc2hpZnRfZGlnaXRzID0gLXNoaWZ0IC8gUHlMb25nX1NISUZUOworICAgICAgICBkaWdpdCByZW07CisgICAgICAgIC8qIHggPSBhIDw8IC1zaGlmdCAqLworICAgICAgICBpZiAoYV9zaXplID49IFBZX1NTSVpFX1RfTUFYIC0gMSAtIHNoaWZ0X2RpZ2l0cykgeworICAgICAgICAgICAgLyogSW4gcHJhY3RpY2UsIGl0J3MgcHJvYmFibHkgaW1wb3NzaWJsZSB0byBlbmQgdXAKKyAgICAgICAgICAgICAgIGhlcmUuICBCb3RoIGEgYW5kIGIgd291bGQgaGF2ZSB0byBiZSBlbm9ybW91cywKKyAgICAgICAgICAgICAgIHVzaW5nIGNsb3NlIHRvIFNJWkVfVF9NQVggYnl0ZXMgb2YgbWVtb3J5IGVhY2guICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm1lZGlhdGUgb3ZlcmZsb3cgZHVyaW5nIGRpdmlzaW9uIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHggPSBfUHlMb25nX05ldyhhX3NpemUgKyBzaGlmdF9kaWdpdHMgKyAxKTsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaGlmdF9kaWdpdHM7IGkrKykKKyAgICAgICAgICAgIHgtPm9iX2RpZ2l0W2ldID0gMDsKKyAgICAgICAgcmVtID0gdl9sc2hpZnQoeC0+b2JfZGlnaXQgKyBzaGlmdF9kaWdpdHMsIGEtPm9iX2RpZ2l0LAorICAgICAgICAgICAgICAgICAgICAgICBhX3NpemUsIC1zaGlmdCAlIFB5TG9uZ19TSElGVCk7CisgICAgICAgIHgtPm9iX2RpZ2l0W2Ffc2l6ZSArIHNoaWZ0X2RpZ2l0c10gPSByZW07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9zc2l6ZV90IHNoaWZ0X2RpZ2l0cyA9IHNoaWZ0IC8gUHlMb25nX1NISUZUOworICAgICAgICBkaWdpdCByZW07CisgICAgICAgIC8qIHggPSBhID4+IHNoaWZ0ICovCisgICAgICAgIGFzc2VydChhX3NpemUgPj0gc2hpZnRfZGlnaXRzKTsKKyAgICAgICAgeCA9IF9QeUxvbmdfTmV3KGFfc2l6ZSAtIHNoaWZ0X2RpZ2l0cyk7CisgICAgICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICByZW0gPSB2X3JzaGlmdCh4LT5vYl9kaWdpdCwgYS0+b2JfZGlnaXQgKyBzaGlmdF9kaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGFfc2l6ZSAtIHNoaWZ0X2RpZ2l0cywgc2hpZnQgJSBQeUxvbmdfU0hJRlQpOworICAgICAgICAvKiBzZXQgaW5leGFjdCBpZiBhbnkgb2YgdGhlIGJpdHMgc2hpZnRlZCBvdXQgaXMgbm9uemVybyAqLworICAgICAgICBpZiAocmVtKQorICAgICAgICAgICAgaW5leGFjdCA9IDE7CisgICAgICAgIHdoaWxlICghaW5leGFjdCAmJiBzaGlmdF9kaWdpdHMgPiAwKQorICAgICAgICAgICAgaWYgKGEtPm9iX2RpZ2l0Wy0tc2hpZnRfZGlnaXRzXSkKKyAgICAgICAgICAgICAgICBpbmV4YWN0ID0gMTsKKyAgICB9CisgICAgbG9uZ19ub3JtYWxpemUoeCk7CisgICAgeF9zaXplID0gUHlfU0laRSh4KTsKIAotCS8qIHggLy89IGIuIElmIHRoZSByZW1haW5kZXIgaXMgbm9uemVybywgc2V0IGluZXhhY3QuICBXZSBvd24gdGhlIG9ubHkKLQkgICByZWZlcmVuY2UgdG8geCwgc28gaXQncyBzYWZlIHRvIG1vZGlmeSBpdCBpbi1wbGFjZS4gKi8KLQlpZiAoYl9zaXplID09IDEpIHsKLQkJZGlnaXQgcmVtID0gaW5wbGFjZV9kaXZyZW0xKHgtPm9iX2RpZ2l0LCB4LT5vYl9kaWdpdCwgeF9zaXplLAotCQkJCSAgICAgIGItPm9iX2RpZ2l0WzBdKTsKLQkJbG9uZ19ub3JtYWxpemUoeCk7Ci0JCWlmIChyZW0pCi0JCQlpbmV4YWN0ID0gMTsKLQl9Ci0JZWxzZSB7Ci0JCVB5TG9uZ09iamVjdCAqZGl2LCAqcmVtOwotCQlkaXYgPSB4X2RpdnJlbSh4LCBiLCAmcmVtKTsKLQkJUHlfREVDUkVGKHgpOwotCQl4ID0gZGl2OwotCQlpZiAoeCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKFB5X1NJWkUocmVtKSkKLQkJCWluZXhhY3QgPSAxOwotCQlQeV9ERUNSRUYocmVtKTsKLQl9Ci0JeF9zaXplID0gQUJTKFB5X1NJWkUoeCkpOwotCWFzc2VydCh4X3NpemUgPiAwKTsgLyogcmVzdWx0IG9mIGRpdmlzaW9uIGlzIG5ldmVyIHplcm8gKi8KLQl4X2JpdHMgPSAoeF9zaXplLTEpKlB5TG9uZ19TSElGVCtiaXRzX2luX2RpZ2l0KHgtPm9iX2RpZ2l0W3hfc2l6ZS0xXSk7CisgICAgLyogeCAvLz0gYi4gSWYgdGhlIHJlbWFpbmRlciBpcyBub256ZXJvLCBzZXQgaW5leGFjdC4gIFdlIG93biB0aGUgb25seQorICAgICAgIHJlZmVyZW5jZSB0byB4LCBzbyBpdCdzIHNhZmUgdG8gbW9kaWZ5IGl0IGluLXBsYWNlLiAqLworICAgIGlmIChiX3NpemUgPT0gMSkgeworICAgICAgICBkaWdpdCByZW0gPSBpbnBsYWNlX2RpdnJlbTEoeC0+b2JfZGlnaXQsIHgtPm9iX2RpZ2l0LCB4X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLT5vYl9kaWdpdFswXSk7CisgICAgICAgIGxvbmdfbm9ybWFsaXplKHgpOworICAgICAgICBpZiAocmVtKQorICAgICAgICAgICAgaW5leGFjdCA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUxvbmdPYmplY3QgKmRpdiwgKnJlbTsKKyAgICAgICAgZGl2ID0geF9kaXZyZW0oeCwgYiwgJnJlbSk7CisgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgeCA9IGRpdjsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChQeV9TSVpFKHJlbSkpCisgICAgICAgICAgICBpbmV4YWN0ID0gMTsKKyAgICAgICAgUHlfREVDUkVGKHJlbSk7CisgICAgfQorICAgIHhfc2l6ZSA9IEFCUyhQeV9TSVpFKHgpKTsKKyAgICBhc3NlcnQoeF9zaXplID4gMCk7IC8qIHJlc3VsdCBvZiBkaXZpc2lvbiBpcyBuZXZlciB6ZXJvICovCisgICAgeF9iaXRzID0gKHhfc2l6ZS0xKSpQeUxvbmdfU0hJRlQrYml0c19pbl9kaWdpdCh4LT5vYl9kaWdpdFt4X3NpemUtMV0pOwogCi0JLyogVGhlIG51bWJlciBvZiBleHRyYSBiaXRzIHRoYXQgaGF2ZSB0byBiZSByb3VuZGVkIGF3YXkuICovCi0JZXh0cmFfYml0cyA9IE1BWCh4X2JpdHMsIERCTF9NSU5fRVhQIC0gc2hpZnQpIC0gREJMX01BTlRfRElHOwotCWFzc2VydChleHRyYV9iaXRzID09IDIgfHwgZXh0cmFfYml0cyA9PSAzKTsKKyAgICAvKiBUaGUgbnVtYmVyIG9mIGV4dHJhIGJpdHMgdGhhdCBoYXZlIHRvIGJlIHJvdW5kZWQgYXdheS4gKi8KKyAgICBleHRyYV9iaXRzID0gTUFYKHhfYml0cywgREJMX01JTl9FWFAgLSBzaGlmdCkgLSBEQkxfTUFOVF9ESUc7CisgICAgYXNzZXJ0KGV4dHJhX2JpdHMgPT0gMiB8fCBleHRyYV9iaXRzID09IDMpOwogCi0JLyogUm91bmQgYnkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBsb3cgZGlnaXQgb2YgeC4gKi8KLQltYXNrID0gKGRpZ2l0KTEgPDwgKGV4dHJhX2JpdHMgLSAxKTsKLQlsb3cgPSB4LT5vYl9kaWdpdFswXSB8IGluZXhhY3Q7Ci0JaWYgKGxvdyAmIG1hc2sgJiYgbG93ICYgKDMqbWFzay0xKSkKLQkJbG93ICs9IG1hc2s7Ci0JeC0+b2JfZGlnaXRbMF0gPSBsb3cgJiB+KG1hc2stMVUpOworICAgIC8qIFJvdW5kIGJ5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgbG93IGRpZ2l0IG9mIHguICovCisgICAgbWFzayA9IChkaWdpdCkxIDw8IChleHRyYV9iaXRzIC0gMSk7CisgICAgbG93ID0geC0+b2JfZGlnaXRbMF0gfCBpbmV4YWN0OworICAgIGlmIChsb3cgJiBtYXNrICYmIGxvdyAmICgzKm1hc2stMSkpCisgICAgICAgIGxvdyArPSBtYXNrOworICAgIHgtPm9iX2RpZ2l0WzBdID0gbG93ICYgfihtYXNrLTFVKTsKIAotCS8qIENvbnZlcnQgeCB0byBhIGRvdWJsZSBkeDsgdGhlIGNvbnZlcnNpb24gaXMgZXhhY3QuICovCi0JZHggPSB4LT5vYl9kaWdpdFstLXhfc2l6ZV07Ci0Jd2hpbGUgKHhfc2l6ZSA+IDApCi0JCWR4ID0gZHggKiBQeUxvbmdfQkFTRSArIHgtPm9iX2RpZ2l0Wy0teF9zaXplXTsKLQlQeV9ERUNSRUYoeCk7CisgICAgLyogQ29udmVydCB4IHRvIGEgZG91YmxlIGR4OyB0aGUgY29udmVyc2lvbiBpcyBleGFjdC4gKi8KKyAgICBkeCA9IHgtPm9iX2RpZ2l0Wy0teF9zaXplXTsKKyAgICB3aGlsZSAoeF9zaXplID4gMCkKKyAgICAgICAgZHggPSBkeCAqIFB5TG9uZ19CQVNFICsgeC0+b2JfZGlnaXRbLS14X3NpemVdOworICAgIFB5X0RFQ1JFRih4KTsKIAotCS8qIENoZWNrIHdoZXRoZXIgbGRleHAgcmVzdWx0IHdpbGwgb3ZlcmZsb3cgYSBkb3VibGUuICovCi0JaWYgKHNoaWZ0ICsgeF9iaXRzID49IERCTF9NQVhfRVhQICYmCi0JICAgIChzaGlmdCArIHhfYml0cyA+IERCTF9NQVhfRVhQIHx8IGR4ID09IGxkZXhwKDEuMCwgKGludCl4X2JpdHMpKSkKLQkJZ290byBvdmVyZmxvdzsKLQlyZXN1bHQgPSBsZGV4cChkeCwgKGludClzaGlmdCk7CisgICAgLyogQ2hlY2sgd2hldGhlciBsZGV4cCByZXN1bHQgd2lsbCBvdmVyZmxvdyBhIGRvdWJsZS4gKi8KKyAgICBpZiAoc2hpZnQgKyB4X2JpdHMgPj0gREJMX01BWF9FWFAgJiYKKyAgICAgICAgKHNoaWZ0ICsgeF9iaXRzID4gREJMX01BWF9FWFAgfHwgZHggPT0gbGRleHAoMS4wLCAoaW50KXhfYml0cykpKQorICAgICAgICBnb3RvIG92ZXJmbG93OworICAgIHJlc3VsdCA9IGxkZXhwKGR4LCAoaW50KXNoaWZ0KTsKIAogICBzdWNjZXNzOgotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShuZWdhdGUgPyAtcmVzdWx0IDogcmVzdWx0KTsKKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUobmVnYXRlID8gLXJlc3VsdCA6IHJlc3VsdCk7CiAKICAgdW5kZXJmbG93X29yX3plcm86Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKG5lZ2F0ZSA/IC0wLjAgOiAwLjApOworICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShuZWdhdGUgPyAtMC4wIDogMC4wKTsKIAogICBvdmVyZmxvdzoKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJpbnRlZ2VyIGRpdmlzaW9uIHJlc3VsdCB0b28gbGFyZ2UgZm9yIGEgZmxvYXQiKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImludGVnZXIgZGl2aXNpb24gcmVzdWx0IHRvbyBsYXJnZSBmb3IgYSBmbG9hdCIpOwogICBlcnJvcjoKLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX21vZChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYiwgKm1vZDsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiLCAqbW9kOwogCi0JQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOworICAgIENPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKIAotCWlmIChsX2Rpdm1vZChhLCBiLCBOVUxMLCAmbW9kKSA8IDApCi0JCW1vZCA9IE5VTEw7Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbW9kOworICAgIGlmIChsX2Rpdm1vZChhLCBiLCBOVUxMLCAmbW9kKSA8IDApCisgICAgICAgIG1vZCA9IE5VTEw7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbW9kOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19kaXZtb2QoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmIsICpkaXYsICptb2Q7Ci0JUHlPYmplY3QgKno7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYiwgKmRpdiwgKm1vZDsKKyAgICBQeU9iamVjdCAqejsKIAotCUNPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CiAKLQlpZiAobF9kaXZtb2QoYSwgYiwgJmRpdiwgJm1vZCkgPCAwKSB7Ci0JCVB5X0RFQ1JFRihhKTsKLQkJUHlfREVDUkVGKGIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JeiA9IFB5VHVwbGVfTmV3KDIpOwotCWlmICh6ICE9IE5VTEwpIHsKLQkJUHlUdXBsZV9TZXRJdGVtKHosIDAsIChQeU9iamVjdCAqKSBkaXYpOwotCQlQeVR1cGxlX1NldEl0ZW0oeiwgMSwgKFB5T2JqZWN0ICopIG1vZCk7Ci0JfQotCWVsc2UgewotCQlQeV9ERUNSRUYoZGl2KTsKLQkJUHlfREVDUkVGKG1vZCk7Ci0JfQotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIHo7CisgICAgaWYgKGxfZGl2bW9kKGEsIGIsICZkaXYsICZtb2QpIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgIFB5X0RFQ1JFRihiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHogPSBQeVR1cGxlX05ldygyKTsKKyAgICBpZiAoeiAhPSBOVUxMKSB7CisgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh6LCAwLCAoUHlPYmplY3QgKikgZGl2KTsKKyAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHosIDEsIChQeU9iamVjdCAqKSBtb2QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKGRpdik7CisgICAgICAgIFB5X0RFQ1JFRihtb2QpOworICAgIH0KKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHJldHVybiB6OwogfQogCiAvKiBwb3codiwgdywgeCkgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX3BvdyhQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5T2JqZWN0ICp4KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmIsICpjOyAvKiBhLGIsYyA9IHYsdyx4ICovCi0JaW50IG5lZ2F0aXZlT3V0cHV0ID0gMDsgIC8qIGlmIHg8MCByZXR1cm4gbmVnYXRpdmUgb3V0cHV0ICovCisgICAgUHlMb25nT2JqZWN0ICphLCAqYiwgKmM7IC8qIGEsYixjID0gdix3LHggKi8KKyAgICBpbnQgbmVnYXRpdmVPdXRwdXQgPSAwOyAgLyogaWYgeDwwIHJldHVybiBuZWdhdGl2ZSBvdXRwdXQgKi8KIAotCVB5TG9uZ09iamVjdCAqeiA9IE5VTEw7ICAvKiBhY2N1bXVsYXRlZCByZXN1bHQgKi8KLQlQeV9zc2l6ZV90IGksIGosIGs7ICAgICAgICAgICAgIC8qIGNvdW50ZXJzICovCi0JUHlMb25nT2JqZWN0ICp0ZW1wID0gTlVMTDsKKyAgICBQeUxvbmdPYmplY3QgKnogPSBOVUxMOyAgLyogYWNjdW11bGF0ZWQgcmVzdWx0ICovCisgICAgUHlfc3NpemVfdCBpLCBqLCBrOyAgICAgICAgICAgICAvKiBjb3VudGVycyAqLworICAgIFB5TG9uZ09iamVjdCAqdGVtcCA9IE5VTEw7CiAKLQkvKiA1LWFyeSB2YWx1ZXMuICBJZiB0aGUgZXhwb25lbnQgaXMgbGFyZ2UgZW5vdWdoLCB0YWJsZSBpcwotCSAqIHByZWNvbXB1dGVkIHNvIHRoYXQgdGFibGVbaV0gPT0gYSoqaSAlIGMgZm9yIGkgaW4gcmFuZ2UoMzIpLgotCSAqLwotCVB5TG9uZ09iamVjdCAqdGFibGVbMzJdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0JCQkJICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgLyogNS1hcnkgdmFsdWVzLiAgSWYgdGhlIGV4cG9uZW50IGlzIGxhcmdlIGVub3VnaCwgdGFibGUgaXMKKyAgICAgKiBwcmVjb21wdXRlZCBzbyB0aGF0IHRhYmxlW2ldID09IGEqKmkgJSBjIGZvciBpIGluIHJhbmdlKDMyKS4KKyAgICAgKi8KKyAgICBQeUxvbmdPYmplY3QgKnRhYmxlWzMyXSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OwogCi0JLyogYSwgYiwgYyA9IHYsIHcsIHggKi8KLQlDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7Ci0JaWYgKFB5TG9uZ19DaGVjayh4KSkgewotCQljID0gKFB5TG9uZ09iamVjdCAqKXg7Ci0JCVB5X0lOQ1JFRih4KTsKLQl9Ci0JZWxzZSBpZiAoUHlJbnRfQ2hlY2soeCkpIHsKLQkJYyA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh4KSk7Ci0JCWlmIChjID09IE5VTEwpCi0JCQlnb3RvIEVycm9yOwotCX0KLQllbHNlIGlmICh4ID09IFB5X05vbmUpCi0JCWMgPSBOVUxMOwotCWVsc2UgewotCQlQeV9ERUNSRUYoYSk7Ci0JCVB5X0RFQ1JFRihiKTsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KKyAgICAvKiBhLCBiLCBjID0gdiwgdywgeCAqLworICAgIENPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBpZiAoUHlMb25nX0NoZWNrKHgpKSB7CisgICAgICAgIGMgPSAoUHlMb25nT2JqZWN0ICopeDsKKyAgICAgICAgUHlfSU5DUkVGKHgpOworICAgIH0KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayh4KSkgeworICAgICAgICBjID0gKFB5TG9uZ09iamVjdCAqKVB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHgpKTsKKyAgICAgICAgaWYgKGMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGVsc2UgaWYgKHggPT0gUHlfTm9uZSkKKyAgICAgICAgYyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgUHlfREVDUkVGKGIpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JaWYgKFB5X1NJWkUoYikgPCAwKSB7ICAvKiBpZiBleHBvbmVudCBpcyBuZWdhdGl2ZSAqLwotCQlpZiAoYykgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInBvdygpIDJuZCBhcmd1bWVudCAiCi0JCQkgICAgImNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWQiKTsKLQkJCWdvdG8gRXJyb3I7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBlbHNlIHJldHVybiBhIGZsb2F0LiAgVGhpcyB3b3JrcyBiZWNhdXNlIHdlIGtub3cKLQkJCSAgIHRoYXQgdGhpcyBjYWxscyBmbG9hdF9wb3coKSB3aGljaCBjb252ZXJ0cyBpdHMKLQkJCSAgIGFyZ3VtZW50cyB0byBkb3VibGUuICovCi0JCQlQeV9ERUNSRUYoYSk7Ci0JCQlQeV9ERUNSRUYoYik7Ci0JCQlyZXR1cm4gUHlGbG9hdF9UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIodiwgdywgeCk7Ci0JCX0KLQl9CisgICAgaWYgKFB5X1NJWkUoYikgPCAwKSB7ICAvKiBpZiBleHBvbmVudCBpcyBuZWdhdGl2ZSAqLworICAgICAgICBpZiAoYykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInBvdygpIDJuZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgImNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWQiKTsKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBlbHNlIHJldHVybiBhIGZsb2F0LiAgVGhpcyB3b3JrcyBiZWNhdXNlIHdlIGtub3cKKyAgICAgICAgICAgICAgIHRoYXQgdGhpcyBjYWxscyBmbG9hdF9wb3coKSB3aGljaCBjb252ZXJ0cyBpdHMKKyAgICAgICAgICAgICAgIGFyZ3VtZW50cyB0byBkb3VibGUuICovCisgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYik7CisgICAgICAgICAgICByZXR1cm4gUHlGbG9hdF9UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIodiwgdywgeCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoYykgewotCQkvKiBpZiBtb2R1bHVzID09IDA6Ci0JCSAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkgKi8KLQkJaWYgKFB5X1NJWkUoYykgPT0gMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJwb3coKSAzcmQgYXJndW1lbnQgY2Fubm90IGJlIDAiKTsKLQkJCWdvdG8gRXJyb3I7Ci0JCX0KKyAgICBpZiAoYykgeworICAgICAgICAvKiBpZiBtb2R1bHVzID09IDA6CisgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkgKi8KKyAgICAgICAgaWYgKFB5X1NJWkUoYykgPT0gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvdygpIDNyZCBhcmd1bWVudCBjYW5ub3QgYmUgMCIpOworICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgfQogCi0JCS8qIGlmIG1vZHVsdXMgPCAwOgotCQkgICAgICAgbmVnYXRpdmVPdXRwdXQgPSBUcnVlCi0JCSAgICAgICBtb2R1bHVzID0gLW1vZHVsdXMgKi8KLQkJaWYgKFB5X1NJWkUoYykgPCAwKSB7Ci0JCQluZWdhdGl2ZU91dHB1dCA9IDE7Ci0JCQl0ZW1wID0gKFB5TG9uZ09iamVjdCAqKV9QeUxvbmdfQ29weShjKTsKLQkJCWlmICh0ZW1wID09IE5VTEwpCi0JCQkJZ290byBFcnJvcjsKLQkJCVB5X0RFQ1JFRihjKTsKLQkJCWMgPSB0ZW1wOwotCQkJdGVtcCA9IE5VTEw7Ci0JCQljLT5vYl9zaXplID0gLSBjLT5vYl9zaXplOwotCQl9CisgICAgICAgIC8qIGlmIG1vZHVsdXMgPCAwOgorICAgICAgICAgICAgICAgbmVnYXRpdmVPdXRwdXQgPSBUcnVlCisgICAgICAgICAgICAgICBtb2R1bHVzID0gLW1vZHVsdXMgKi8KKyAgICAgICAgaWYgKFB5X1NJWkUoYykgPCAwKSB7CisgICAgICAgICAgICBuZWdhdGl2ZU91dHB1dCA9IDE7CisgICAgICAgICAgICB0ZW1wID0gKFB5TG9uZ09iamVjdCAqKV9QeUxvbmdfQ29weShjKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjKTsKKyAgICAgICAgICAgIGMgPSB0ZW1wOworICAgICAgICAgICAgdGVtcCA9IE5VTEw7CisgICAgICAgICAgICBjLT5vYl9zaXplID0gLSBjLT5vYl9zaXplOworICAgICAgICB9CiAKLQkJLyogaWYgbW9kdWx1cyA9PSAxOgotCQkgICAgICAgcmV0dXJuIDAgKi8KLQkJaWYgKChQeV9TSVpFKGMpID09IDEpICYmIChjLT5vYl9kaWdpdFswXSA9PSAxKSkgewotCQkJeiA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoMEwpOwotCQkJZ290byBEb25lOwotCQl9CisgICAgICAgIC8qIGlmIG1vZHVsdXMgPT0gMToKKyAgICAgICAgICAgICAgIHJldHVybiAwICovCisgICAgICAgIGlmICgoUHlfU0laRShjKSA9PSAxKSAmJiAoYy0+b2JfZGlnaXRbMF0gPT0gMSkpIHsKKyAgICAgICAgICAgIHogPSAoUHlMb25nT2JqZWN0ICopUHlMb25nX0Zyb21Mb25nKDBMKTsKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgfQogCi0JCS8qIGlmIGJhc2UgPCAwOgotCQkgICAgICAgYmFzZSA9IGJhc2UgJSBtb2R1bHVzCi0JCSAgIEhhdmluZyB0aGUgYmFzZSBwb3NpdGl2ZSBqdXN0IG1ha2VzIHRoaW5ncyBlYXNpZXIuICovCi0JCWlmIChQeV9TSVpFKGEpIDwgMCkgewotCQkJaWYgKGxfZGl2bW9kKGEsIGMsIE5VTEwsICZ0ZW1wKSA8IDApCi0JCQkJZ290byBFcnJvcjsKLQkJCVB5X0RFQ1JFRihhKTsKLQkJCWEgPSB0ZW1wOwotCQkJdGVtcCA9IE5VTEw7Ci0JCX0KLQl9CisgICAgICAgIC8qIGlmIGJhc2UgPCAwOgorICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UgJSBtb2R1bHVzCisgICAgICAgICAgIEhhdmluZyB0aGUgYmFzZSBwb3NpdGl2ZSBqdXN0IG1ha2VzIHRoaW5ncyBlYXNpZXIuICovCisgICAgICAgIGlmIChQeV9TSVpFKGEpIDwgMCkgeworICAgICAgICAgICAgaWYgKGxfZGl2bW9kKGEsIGMsIE5VTEwsICZ0ZW1wKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgIGEgPSB0ZW1wOworICAgICAgICAgICAgdGVtcCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBBdCB0aGlzIHBvaW50IGEsIGIsIGFuZCBjIGFyZSBndWFyYW50ZWVkIG5vbi1uZWdhdGl2ZSBVTkxFU1MKLQkgICBjIGlzIE5VTEwsIGluIHdoaWNoIGNhc2UgYSBtYXkgYmUgbmVnYXRpdmUuICovCisgICAgLyogQXQgdGhpcyBwb2ludCBhLCBiLCBhbmQgYyBhcmUgZ3VhcmFudGVlZCBub24tbmVnYXRpdmUgVU5MRVNTCisgICAgICAgYyBpcyBOVUxMLCBpbiB3aGljaCBjYXNlIGEgbWF5IGJlIG5lZ2F0aXZlLiAqLwogCi0JeiA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoMUwpOwotCWlmICh6ID09IE5VTEwpCi0JCWdvdG8gRXJyb3I7CisgICAgeiA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoMUwpOworICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgIGdvdG8gRXJyb3I7CiAKLQkvKiBQZXJmb3JtIGEgbW9kdWxhciByZWR1Y3Rpb24sIFggPSBYICUgYywgYnV0IGxlYXZlIFggYWxvbmUgaWYgYwotCSAqIGlzIE5VTEwuCi0JICovCi0jZGVmaW5lIFJFRFVDRShYKQkJCQkJXAotCWlmIChjICE9IE5VTEwpIHsJCQkJXAotCQlpZiAobF9kaXZtb2QoWCwgYywgTlVMTCwgJnRlbXApIDwgMCkJXAotCQkJZ290byBFcnJvcjsJCQlcCi0JCVB5X1hERUNSRUYoWCk7CQkJCVwKLQkJWCA9IHRlbXA7CQkJCVwKLQkJdGVtcCA9IE5VTEw7CQkJCVwKLQl9CisgICAgLyogUGVyZm9ybSBhIG1vZHVsYXIgcmVkdWN0aW9uLCBYID0gWCAlIGMsIGJ1dCBsZWF2ZSBYIGFsb25lIGlmIGMKKyAgICAgKiBpcyBOVUxMLgorICAgICAqLworI2RlZmluZSBSRURVQ0UoWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGMgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGxfZGl2bW9kKFgsIGMsIE5VTEwsICZ0ZW1wKSA8IDApICAgICAgICAgICAgXAorICAgICAgICAgICAgZ290byBFcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X1hERUNSRUYoWCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgWCA9IHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCi0JLyogTXVsdGlwbHkgdHdvIHZhbHVlcywgdGhlbiByZWR1Y2UgdGhlIHJlc3VsdDoKLQkgICByZXN1bHQgPSBYKlkgJSBjLiAgSWYgYyBpcyBOVUxMLCBza2lwIHRoZSBtb2QuICovCi0jZGVmaW5lIE1VTFQoWCwgWSwgcmVzdWx0KQkJCQlcCi17CQkJCQkJCVwKLQl0ZW1wID0gKFB5TG9uZ09iamVjdCAqKWxvbmdfbXVsKFgsIFkpOwkJXAotCWlmICh0ZW1wID09IE5VTEwpCQkJCVwKLQkJZ290byBFcnJvcjsJCQkJXAotCVB5X1hERUNSRUYocmVzdWx0KTsJCQkJXAotCXJlc3VsdCA9IHRlbXA7CQkJCQlcCi0JdGVtcCA9IE5VTEw7CQkJCQlcCi0JUkVEVUNFKHJlc3VsdCkJCQkJCVwKKyAgICAvKiBNdWx0aXBseSB0d28gdmFsdWVzLCB0aGVuIHJlZHVjZSB0aGUgcmVzdWx0OgorICAgICAgIHJlc3VsdCA9IFgqWSAlIGMuICBJZiBjIGlzIE5VTEwsIHNraXAgdGhlIG1vZC4gKi8KKyNkZWZpbmUgTVVMVChYLCBZLCByZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcCA9IChQeUxvbmdPYmplY3QgKilsb25nX211bChYLCBZKTsgICAgICAgICAgICAgIFwKKyAgICBpZiAodGVtcCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIEVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUHlfWERFQ1JFRihyZXN1bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXN1bHQgPSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkVEVUNFKHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAotCWlmIChQeV9TSVpFKGIpIDw9IEZJVkVBUllfQ1VUT0ZGKSB7Ci0JCS8qIExlZnQtdG8tcmlnaHQgYmluYXJ5IGV4cG9uZW50aWF0aW9uIChIQUMgQWxnb3JpdGhtIDE0Ljc5KSAqLwotCQkvKiBodHRwOi8vd3d3LmNhY3IubWF0aC51d2F0ZXJsb28uY2EvaGFjL2Fib3V0L2NoYXAxNC5wZGYgICAgKi8KLQkJZm9yIChpID0gUHlfU0laRShiKSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0JCQlkaWdpdCBiaSA9IGItPm9iX2RpZ2l0W2ldOworICAgIGlmIChQeV9TSVpFKGIpIDw9IEZJVkVBUllfQ1VUT0ZGKSB7CisgICAgICAgIC8qIExlZnQtdG8tcmlnaHQgYmluYXJ5IGV4cG9uZW50aWF0aW9uIChIQUMgQWxnb3JpdGhtIDE0Ljc5KSAqLworICAgICAgICAvKiBodHRwOi8vd3d3LmNhY3IubWF0aC51d2F0ZXJsb28uY2EvaGFjL2Fib3V0L2NoYXAxNC5wZGYgICAgKi8KKyAgICAgICAgZm9yIChpID0gUHlfU0laRShiKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBkaWdpdCBiaSA9IGItPm9iX2RpZ2l0W2ldOwogCi0JCQlmb3IgKGogPSAoZGlnaXQpMSA8PCAoUHlMb25nX1NISUZULTEpOyBqICE9IDA7IGogPj49IDEpIHsKLQkJCQlNVUxUKHosIHosIHopCi0JCQkJaWYgKGJpICYgaikKLQkJCQkJTVVMVCh6LCBhLCB6KQotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBMZWZ0LXRvLXJpZ2h0IDUtYXJ5IGV4cG9uZW50aWF0aW9uIChIQUMgQWxnb3JpdGhtIDE0LjgyKSAqLwotCQlQeV9JTkNSRUYoeik7CS8qIHN0aWxsIGhvbGRzIDFMICovCi0JCXRhYmxlWzBdID0gejsKLQkJZm9yIChpID0gMTsgaSA8IDMyOyArK2kpCi0JCQlNVUxUKHRhYmxlW2ktMV0sIGEsIHRhYmxlW2ldKQorICAgICAgICAgICAgZm9yIChqID0gKGRpZ2l0KTEgPDwgKFB5TG9uZ19TSElGVC0xKTsgaiAhPSAwOyBqID4+PSAxKSB7CisgICAgICAgICAgICAgICAgTVVMVCh6LCB6LCB6KQorICAgICAgICAgICAgICAgIGlmIChiaSAmIGopCisgICAgICAgICAgICAgICAgICAgIE1VTFQoeiwgYSwgeikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogTGVmdC10by1yaWdodCA1LWFyeSBleHBvbmVudGlhdGlvbiAoSEFDIEFsZ29yaXRobSAxNC44MikgKi8KKyAgICAgICAgUHlfSU5DUkVGKHopOyAgICAgICAgICAgLyogc3RpbGwgaG9sZHMgMUwgKi8KKyAgICAgICAgdGFibGVbMF0gPSB6OworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMzI7ICsraSkKKyAgICAgICAgICAgIE1VTFQodGFibGVbaS0xXSwgYSwgdGFibGVbaV0pCiAKLQkJZm9yIChpID0gUHlfU0laRShiKSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0JCQljb25zdCBkaWdpdCBiaSA9IGItPm9iX2RpZ2l0W2ldOworICAgICAgICBmb3IgKGkgPSBQeV9TSVpFKGIpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIGNvbnN0IGRpZ2l0IGJpID0gYi0+b2JfZGlnaXRbaV07CiAKLQkJCWZvciAoaiA9IFB5TG9uZ19TSElGVCAtIDU7IGogPj0gMDsgaiAtPSA1KSB7Ci0JCQkJY29uc3QgaW50IGluZGV4ID0gKGJpID4+IGopICYgMHgxZjsKLQkJCQlmb3IgKGsgPSAwOyBrIDwgNTsgKytrKQotCQkJCQlNVUxUKHosIHosIHopCi0JCQkJaWYgKGluZGV4KQotCQkJCQlNVUxUKHosIHRhYmxlW2luZGV4XSwgeikKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIGZvciAoaiA9IFB5TG9uZ19TSElGVCAtIDU7IGogPj0gMDsgaiAtPSA1KSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGluZGV4ID0gKGJpID4+IGopICYgMHgxZjsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNTsgKytrKQorICAgICAgICAgICAgICAgICAgICBNVUxUKHosIHosIHopCisgICAgICAgICAgICAgICAgaWYgKGluZGV4KQorICAgICAgICAgICAgICAgICAgICBNVUxUKHosIHRhYmxlW2luZGV4XSwgeikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChuZWdhdGl2ZU91dHB1dCAmJiAoUHlfU0laRSh6KSAhPSAwKSkgewotCQl0ZW1wID0gKFB5TG9uZ09iamVjdCAqKWxvbmdfc3ViKHosIGMpOwotCQlpZiAodGVtcCA9PSBOVUxMKQotCQkJZ290byBFcnJvcjsKLQkJUHlfREVDUkVGKHopOwotCQl6ID0gdGVtcDsKLQkJdGVtcCA9IE5VTEw7Ci0JfQotCWdvdG8gRG9uZTsKKyAgICBpZiAobmVnYXRpdmVPdXRwdXQgJiYgKFB5X1NJWkUoeikgIT0gMCkpIHsKKyAgICAgICAgdGVtcCA9IChQeUxvbmdPYmplY3QgKilsb25nX3N1Yih6LCBjKTsKKyAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIFB5X0RFQ1JFRih6KTsKKyAgICAgICAgeiA9IHRlbXA7CisgICAgICAgIHRlbXAgPSBOVUxMOworICAgIH0KKyAgICBnb3RvIERvbmU7CiAKICBFcnJvcjoKLSAJaWYgKHogIT0gTlVMTCkgewotIAkJUHlfREVDUkVGKHopOwotIAkJeiA9IE5VTEw7Ci0gCX0KLQkvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBpZiAoeiAhPSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih6KTsKKyAgICAgICAgeiA9IE5VTEw7CisgICAgfQorICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogIERvbmU6Ci0JaWYgKFB5X1NJWkUoYikgPiBGSVZFQVJZX0NVVE9GRikgewotCQlmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLQkJCVB5X1hERUNSRUYodGFibGVbaV0pOwotCX0KLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCVB5X1hERUNSRUYoYyk7Ci0JUHlfWERFQ1JFRih0ZW1wKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopejsKKyAgICBpZiAoUHlfU0laRShiKSA+IEZJVkVBUllfQ1VUT0ZGKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQorICAgICAgICAgICAgUHlfWERFQ1JFRih0YWJsZVtpXSk7CisgICAgfQorICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgUHlfWERFQ1JFRihjKTsKKyAgICBQeV9YREVDUkVGKHRlbXApOworICAgIHJldHVybiAoUHlPYmplY3QgKil6OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19pbnZlcnQoUHlMb25nT2JqZWN0ICp2KQogewotCS8qIEltcGxlbWVudCB+eCBhcyAtKHgrMSkgKi8KLQlQeUxvbmdPYmplY3QgKng7Ci0JUHlMb25nT2JqZWN0ICp3OwotCXcgPSAoUHlMb25nT2JqZWN0ICopUHlMb25nX0Zyb21Mb25nKDFMKTsKLQlpZiAodyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl4ID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX2FkZCh2LCB3KTsKLQlQeV9ERUNSRUYodyk7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfU0laRSh4KSA9IC0oUHlfU0laRSh4KSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXg7CisgICAgLyogSW1wbGVtZW50IH54IGFzIC0oeCsxKSAqLworICAgIFB5TG9uZ09iamVjdCAqeDsKKyAgICBQeUxvbmdPYmplY3QgKnc7CisgICAgdyA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoMUwpOworICAgIGlmICh3ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHggPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfYWRkKHYsIHcpOworICAgIFB5X0RFQ1JFRih3KTsKKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9TSVpFKHgpID0gLShQeV9TSVpFKHgpKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopeDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfbmVnKFB5TG9uZ09iamVjdCAqdikKIHsKLQlQeUxvbmdPYmplY3QgKno7Ci0JaWYgKHYtPm9iX3NpemUgPT0gMCAmJiBQeUxvbmdfQ2hlY2tFeGFjdCh2KSkgewotCQkvKiAtMCA9PSAwICovCi0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKSB2OwotCX0KLQl6ID0gKFB5TG9uZ09iamVjdCAqKV9QeUxvbmdfQ29weSh2KTsKLQlpZiAoeiAhPSBOVUxMKQotCQl6LT5vYl9zaXplID0gLSh2LT5vYl9zaXplKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopejsKKyAgICBQeUxvbmdPYmplY3QgKno7CisgICAgaWYgKHYtPm9iX3NpemUgPT0gMCAmJiBQeUxvbmdfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICAvKiAtMCA9PSAwICovCisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKSB2OworICAgIH0KKyAgICB6ID0gKFB5TG9uZ09iamVjdCAqKV9QeUxvbmdfQ29weSh2KTsKKyAgICBpZiAoeiAhPSBOVUxMKQorICAgICAgICB6LT5vYl9zaXplID0gLSh2LT5vYl9zaXplKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopejsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfYWJzKFB5TG9uZ09iamVjdCAqdikKIHsKLQlpZiAodi0+b2Jfc2l6ZSA8IDApCi0JCXJldHVybiBsb25nX25lZyh2KTsKLQllbHNlCi0JCXJldHVybiBsb25nX2xvbmcoKFB5T2JqZWN0ICopdik7CisgICAgaWYgKHYtPm9iX3NpemUgPCAwKQorICAgICAgICByZXR1cm4gbG9uZ19uZWcodik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gbG9uZ19sb25nKChQeU9iamVjdCAqKXYpOwogfQogCiBzdGF0aWMgaW50CiBsb25nX25vbnplcm8oUHlMb25nT2JqZWN0ICp2KQogewotCXJldHVybiBQeV9TSVpFKHYpICE9IDA7CisgICAgcmV0dXJuIFB5X1NJWkUodikgIT0gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfcnNoaWZ0KFB5TG9uZ09iamVjdCAqdiwgUHlMb25nT2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmI7Ci0JUHlMb25nT2JqZWN0ICp6ID0gTlVMTDsKLQlQeV9zc2l6ZV90IHNoaWZ0YnksIG5ld3NpemUsIHdvcmRzaGlmdCwgbG9zaGlmdCwgaGlzaGlmdCwgaSwgajsKLQlkaWdpdCBsb21hc2ssIGhpbWFzazsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiOworICAgIFB5TG9uZ09iamVjdCAqeiA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBzaGlmdGJ5LCBuZXdzaXplLCB3b3Jkc2hpZnQsIGxvc2hpZnQsIGhpc2hpZnQsIGksIGo7CisgICAgZGlnaXQgbG9tYXNrLCBoaW1hc2s7CiAKLQlDT05WRVJUX0JJTk9QKChQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsICZhLCAmYik7CisgICAgQ09OVkVSVF9CSU5PUCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAmYSwgJmIpOwogCi0JaWYgKFB5X1NJWkUoYSkgPCAwKSB7Ci0JCS8qIFJpZ2h0IHNoaWZ0aW5nIG5lZ2F0aXZlIG51bWJlcnMgaXMgaGFyZGVyICovCi0JCVB5TG9uZ09iamVjdCAqYTEsICphMjsKLQkJYTEgPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfaW52ZXJ0KGEpOwotCQlpZiAoYTEgPT0gTlVMTCkKLQkJCWdvdG8gcnNoaWZ0X2Vycm9yOwotCQlhMiA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19yc2hpZnQoYTEsIGIpOwotCQlQeV9ERUNSRUYoYTEpOwotCQlpZiAoYTIgPT0gTlVMTCkKLQkJCWdvdG8gcnNoaWZ0X2Vycm9yOwotCQl6ID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX2ludmVydChhMik7Ci0JCVB5X0RFQ1JFRihhMik7Ci0JfQotCWVsc2UgewotCQlzaGlmdGJ5ID0gUHlMb25nX0FzU3NpemVfdCgoUHlPYmplY3QgKiliKTsKLQkJaWYgKHNoaWZ0YnkgPT0gLTFMICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlnb3RvIHJzaGlmdF9lcnJvcjsKLQkJaWYgKHNoaWZ0YnkgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIm5lZ2F0aXZlIHNoaWZ0IGNvdW50Iik7Ci0JCQlnb3RvIHJzaGlmdF9lcnJvcjsKLQkJfQotCQl3b3Jkc2hpZnQgPSBzaGlmdGJ5IC8gUHlMb25nX1NISUZUOwotCQluZXdzaXplID0gQUJTKFB5X1NJWkUoYSkpIC0gd29yZHNoaWZ0OwotCQlpZiAobmV3c2l6ZSA8PSAwKSB7Ci0JCQl6ID0gX1B5TG9uZ19OZXcoMCk7Ci0JCQlQeV9ERUNSRUYoYSk7Ci0JCQlQeV9ERUNSRUYoYik7Ci0JCQlyZXR1cm4gKFB5T2JqZWN0ICopejsKLQkJfQotCQlsb3NoaWZ0ID0gc2hpZnRieSAlIFB5TG9uZ19TSElGVDsKLQkJaGlzaGlmdCA9IFB5TG9uZ19TSElGVCAtIGxvc2hpZnQ7Ci0JCWxvbWFzayA9ICgoZGlnaXQpMSA8PCBoaXNoaWZ0KSAtIDE7Ci0JCWhpbWFzayA9IFB5TG9uZ19NQVNLIF4gbG9tYXNrOwotCQl6ID0gX1B5TG9uZ19OZXcobmV3c2l6ZSk7Ci0JCWlmICh6ID09IE5VTEwpCi0JCQlnb3RvIHJzaGlmdF9lcnJvcjsKLQkJaWYgKFB5X1NJWkUoYSkgPCAwKQotCQkJUHlfU0laRSh6KSA9IC0oUHlfU0laRSh6KSk7Ci0JCWZvciAoaSA9IDAsIGogPSB3b3Jkc2hpZnQ7IGkgPCBuZXdzaXplOyBpKyssIGorKykgewotCQkJei0+b2JfZGlnaXRbaV0gPSAoYS0+b2JfZGlnaXRbal0gPj4gbG9zaGlmdCkgJiBsb21hc2s7Ci0JCQlpZiAoaSsxIDwgbmV3c2l6ZSkKLQkJCQl6LT5vYl9kaWdpdFtpXSB8PQotCQkJCSAgKGEtPm9iX2RpZ2l0W2orMV0gPDwgaGlzaGlmdCkgJiBoaW1hc2s7Ci0JCX0KLQkJeiA9IGxvbmdfbm9ybWFsaXplKHopOwotCX0KKyAgICBpZiAoUHlfU0laRShhKSA8IDApIHsKKyAgICAgICAgLyogUmlnaHQgc2hpZnRpbmcgbmVnYXRpdmUgbnVtYmVycyBpcyBoYXJkZXIgKi8KKyAgICAgICAgUHlMb25nT2JqZWN0ICphMSwgKmEyOworICAgICAgICBhMSA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19pbnZlcnQoYSk7CisgICAgICAgIGlmIChhMSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byByc2hpZnRfZXJyb3I7CisgICAgICAgIGEyID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX3JzaGlmdChhMSwgYik7CisgICAgICAgIFB5X0RFQ1JFRihhMSk7CisgICAgICAgIGlmIChhMiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byByc2hpZnRfZXJyb3I7CisgICAgICAgIHogPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfaW52ZXJ0KGEyKTsKKyAgICAgICAgUHlfREVDUkVGKGEyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNoaWZ0YnkgPSBQeUxvbmdfQXNTc2l6ZV90KChQeU9iamVjdCAqKWIpOworICAgICAgICBpZiAoc2hpZnRieSA9PSAtMUwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIGdvdG8gcnNoaWZ0X2Vycm9yOworICAgICAgICBpZiAoc2hpZnRieSA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBzaGlmdCBjb3VudCIpOworICAgICAgICAgICAgZ290byByc2hpZnRfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgd29yZHNoaWZ0ID0gc2hpZnRieSAvIFB5TG9uZ19TSElGVDsKKyAgICAgICAgbmV3c2l6ZSA9IEFCUyhQeV9TSVpFKGEpKSAtIHdvcmRzaGlmdDsKKyAgICAgICAgaWYgKG5ld3NpemUgPD0gMCkgeworICAgICAgICAgICAgeiA9IF9QeUxvbmdfTmV3KDApOworICAgICAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICAgICAgUHlfREVDUkVGKGIpOworICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXo7CisgICAgICAgIH0KKyAgICAgICAgbG9zaGlmdCA9IHNoaWZ0YnkgJSBQeUxvbmdfU0hJRlQ7CisgICAgICAgIGhpc2hpZnQgPSBQeUxvbmdfU0hJRlQgLSBsb3NoaWZ0OworICAgICAgICBsb21hc2sgPSAoKGRpZ2l0KTEgPDwgaGlzaGlmdCkgLSAxOworICAgICAgICBoaW1hc2sgPSBQeUxvbmdfTUFTSyBeIGxvbWFzazsKKyAgICAgICAgeiA9IF9QeUxvbmdfTmV3KG5ld3NpemUpOworICAgICAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byByc2hpZnRfZXJyb3I7CisgICAgICAgIGlmIChQeV9TSVpFKGEpIDwgMCkKKyAgICAgICAgICAgIFB5X1NJWkUoeikgPSAtKFB5X1NJWkUoeikpOworICAgICAgICBmb3IgKGkgPSAwLCBqID0gd29yZHNoaWZ0OyBpIDwgbmV3c2l6ZTsgaSsrLCBqKyspIHsKKyAgICAgICAgICAgIHotPm9iX2RpZ2l0W2ldID0gKGEtPm9iX2RpZ2l0W2pdID4+IGxvc2hpZnQpICYgbG9tYXNrOworICAgICAgICAgICAgaWYgKGkrMSA8IG5ld3NpemUpCisgICAgICAgICAgICAgICAgei0+b2JfZGlnaXRbaV0gfD0KKyAgICAgICAgICAgICAgICAgIChhLT5vYl9kaWdpdFtqKzFdIDw8IGhpc2hpZnQpICYgaGltYXNrOworICAgICAgICB9CisgICAgICAgIHogPSBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICB9CiByc2hpZnRfZXJyb3I6Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHo7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHo7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfbHNoaWZ0KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQkvKiBUaGlzIHZlcnNpb24gZHVlIHRvIFRpbSBQZXRlcnMgKi8KLQlQeUxvbmdPYmplY3QgKmEsICpiOwotCVB5TG9uZ09iamVjdCAqeiA9IE5VTEw7Ci0JUHlfc3NpemVfdCBzaGlmdGJ5LCBvbGRzaXplLCBuZXdzaXplLCB3b3Jkc2hpZnQsIHJlbXNoaWZ0LCBpLCBqOwotCXR3b2RpZ2l0cyBhY2N1bTsKKyAgICAvKiBUaGlzIHZlcnNpb24gZHVlIHRvIFRpbSBQZXRlcnMgKi8KKyAgICBQeUxvbmdPYmplY3QgKmEsICpiOworICAgIFB5TG9uZ09iamVjdCAqeiA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBzaGlmdGJ5LCBvbGRzaXplLCBuZXdzaXplLCB3b3Jkc2hpZnQsIHJlbXNoaWZ0LCBpLCBqOworICAgIHR3b2RpZ2l0cyBhY2N1bTsKIAotCUNPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CiAKLQlzaGlmdGJ5ID0gUHlMb25nX0FzU3NpemVfdCgoUHlPYmplY3QgKiliKTsKLQlpZiAoc2hpZnRieSA9PSAtMUwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBsc2hpZnRfZXJyb3I7Ci0JaWYgKHNoaWZ0YnkgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgc2hpZnQgY291bnQiKTsKLQkJZ290byBsc2hpZnRfZXJyb3I7Ci0JfQotCS8qIHdvcmRzaGlmdCwgcmVtc2hpZnQgPSBkaXZtb2Qoc2hpZnRieSwgUHlMb25nX1NISUZUKSAqLwotCXdvcmRzaGlmdCA9IHNoaWZ0YnkgLyBQeUxvbmdfU0hJRlQ7Ci0JcmVtc2hpZnQgID0gc2hpZnRieSAtIHdvcmRzaGlmdCAqIFB5TG9uZ19TSElGVDsKKyAgICBzaGlmdGJ5ID0gUHlMb25nX0FzU3NpemVfdCgoUHlPYmplY3QgKiliKTsKKyAgICBpZiAoc2hpZnRieSA9PSAtMUwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBsc2hpZnRfZXJyb3I7CisgICAgaWYgKHNoaWZ0YnkgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgc2hpZnQgY291bnQiKTsKKyAgICAgICAgZ290byBsc2hpZnRfZXJyb3I7CisgICAgfQorICAgIC8qIHdvcmRzaGlmdCwgcmVtc2hpZnQgPSBkaXZtb2Qoc2hpZnRieSwgUHlMb25nX1NISUZUKSAqLworICAgIHdvcmRzaGlmdCA9IHNoaWZ0YnkgLyBQeUxvbmdfU0hJRlQ7CisgICAgcmVtc2hpZnQgID0gc2hpZnRieSAtIHdvcmRzaGlmdCAqIFB5TG9uZ19TSElGVDsKIAotCW9sZHNpemUgPSBBQlMoYS0+b2Jfc2l6ZSk7Ci0JbmV3c2l6ZSA9IG9sZHNpemUgKyB3b3Jkc2hpZnQ7Ci0JaWYgKHJlbXNoaWZ0KQotCQkrK25ld3NpemU7Ci0JeiA9IF9QeUxvbmdfTmV3KG5ld3NpemUpOwotCWlmICh6ID09IE5VTEwpCi0JCWdvdG8gbHNoaWZ0X2Vycm9yOwotCWlmIChhLT5vYl9zaXplIDwgMCkKLQkJei0+b2Jfc2l6ZSA9IC0oei0+b2Jfc2l6ZSk7Ci0JZm9yIChpID0gMDsgaSA8IHdvcmRzaGlmdDsgaSsrKQotCQl6LT5vYl9kaWdpdFtpXSA9IDA7Ci0JYWNjdW0gPSAwOwotCWZvciAoaSA9IHdvcmRzaGlmdCwgaiA9IDA7IGogPCBvbGRzaXplOyBpKyssIGorKykgewotCQlhY2N1bSB8PSAodHdvZGlnaXRzKWEtPm9iX2RpZ2l0W2pdIDw8IHJlbXNoaWZ0OwotCQl6LT5vYl9kaWdpdFtpXSA9IChkaWdpdCkoYWNjdW0gJiBQeUxvbmdfTUFTSyk7Ci0JCWFjY3VtID4+PSBQeUxvbmdfU0hJRlQ7Ci0JfQotCWlmIChyZW1zaGlmdCkKLQkJei0+b2JfZGlnaXRbbmV3c2l6ZS0xXSA9IChkaWdpdClhY2N1bTsKLQllbHNlCi0JCWFzc2VydCghYWNjdW0pOwotCXogPSBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICBvbGRzaXplID0gQUJTKGEtPm9iX3NpemUpOworICAgIG5ld3NpemUgPSBvbGRzaXplICsgd29yZHNoaWZ0OworICAgIGlmIChyZW1zaGlmdCkKKyAgICAgICAgKytuZXdzaXplOworICAgIHogPSBfUHlMb25nX05ldyhuZXdzaXplKTsKKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICBnb3RvIGxzaGlmdF9lcnJvcjsKKyAgICBpZiAoYS0+b2Jfc2l6ZSA8IDApCisgICAgICAgIHotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCB3b3Jkc2hpZnQ7IGkrKykKKyAgICAgICAgei0+b2JfZGlnaXRbaV0gPSAwOworICAgIGFjY3VtID0gMDsKKyAgICBmb3IgKGkgPSB3b3Jkc2hpZnQsIGogPSAwOyBqIDwgb2xkc2l6ZTsgaSsrLCBqKyspIHsKKyAgICAgICAgYWNjdW0gfD0gKHR3b2RpZ2l0cylhLT5vYl9kaWdpdFtqXSA8PCByZW1zaGlmdDsKKyAgICAgICAgei0+b2JfZGlnaXRbaV0gPSAoZGlnaXQpKGFjY3VtICYgUHlMb25nX01BU0spOworICAgICAgICBhY2N1bSA+Pj0gUHlMb25nX1NISUZUOworICAgIH0KKyAgICBpZiAocmVtc2hpZnQpCisgICAgICAgIHotPm9iX2RpZ2l0W25ld3NpemUtMV0gPSAoZGlnaXQpYWNjdW07CisgICAgZWxzZQorICAgICAgICBhc3NlcnQoIWFjY3VtKTsKKyAgICB6ID0gbG9uZ19ub3JtYWxpemUoeik7CiBsc2hpZnRfZXJyb3I6Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHo7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHo7CiB9CiAKIC8qIENvbXB1dGUgdHdvJ3MgY29tcGxlbWVudCBvZiBkaWdpdCB2ZWN0b3IgYVswOm1dLCB3cml0aW5nIHJlc3VsdCB0bwpAQCAtMzcyNywyNDYgKzM3MjcsMjQ2IEBACiBzdGF0aWMgdm9pZAogdl9jb21wbGVtZW50KGRpZ2l0ICp6LCBkaWdpdCAqYSwgUHlfc3NpemVfdCBtKQogewotCVB5X3NzaXplX3QgaTsKLQlkaWdpdCBjYXJyeSA9IDE7Ci0JZm9yIChpID0gMDsgaSA8IG07ICsraSkgewotCQljYXJyeSArPSBhW2ldIF4gUHlMb25nX01BU0s7Ci0JCXpbaV0gPSBjYXJyeSAmIFB5TG9uZ19NQVNLOwotCQljYXJyeSA+Pj0gUHlMb25nX1NISUZUOwotCX0KLQlhc3NlcnQoY2FycnkgPT0gMCk7CisgICAgUHlfc3NpemVfdCBpOworICAgIGRpZ2l0IGNhcnJ5ID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CisgICAgICAgIGNhcnJ5ICs9IGFbaV0gXiBQeUxvbmdfTUFTSzsKKyAgICAgICAgeltpXSA9IGNhcnJ5ICYgUHlMb25nX01BU0s7CisgICAgICAgIGNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgfQorICAgIGFzc2VydChjYXJyeSA9PSAwKTsKIH0KIAogLyogQml0d2lzZSBhbmQveG9yL29yIG9wZXJhdGlvbnMgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfYml0d2lzZShQeUxvbmdPYmplY3QgKmEsCi0JICAgICBpbnQgb3AsICAvKiAnJicsICd8JywgJ14nICovCi0JICAgICBQeUxvbmdPYmplY3QgKmIpCisgICAgICAgICAgICAgaW50IG9wLCAgLyogJyYnLCAnfCcsICdeJyAqLworICAgICAgICAgUHlMb25nT2JqZWN0ICpiKQogewotCWludCBuZWdhLCBuZWdiLCBuZWd6OwotCVB5X3NzaXplX3Qgc2l6ZV9hLCBzaXplX2IsIHNpemVfeiwgaTsKLQlQeUxvbmdPYmplY3QgKno7CisgICAgaW50IG5lZ2EsIG5lZ2IsIG5lZ3o7CisgICAgUHlfc3NpemVfdCBzaXplX2EsIHNpemVfYiwgc2l6ZV96LCBpOworICAgIFB5TG9uZ09iamVjdCAqejsKIAotCS8qIEJpdHdpc2Ugb3BlcmF0aW9ucyBmb3IgbmVnYXRpdmUgbnVtYmVycyBvcGVyYXRlIGFzIHRob3VnaAotCSAgIG9uIGEgdHdvJ3MgY29tcGxlbWVudCByZXByZXNlbnRhdGlvbi4gIFNvIGNvbnZlcnQgYXJndW1lbnRzCi0JICAgZnJvbSBzaWduLW1hZ25pdHVkZSB0byB0d28ncyBjb21wbGVtZW50LCBhbmQgY29udmVydCB0aGUKLQkgICByZXN1bHQgYmFjayB0byBzaWduLW1hZ25pdHVkZSBhdCB0aGUgZW5kLiAqLworICAgIC8qIEJpdHdpc2Ugb3BlcmF0aW9ucyBmb3IgbmVnYXRpdmUgbnVtYmVycyBvcGVyYXRlIGFzIHRob3VnaAorICAgICAgIG9uIGEgdHdvJ3MgY29tcGxlbWVudCByZXByZXNlbnRhdGlvbi4gIFNvIGNvbnZlcnQgYXJndW1lbnRzCisgICAgICAgZnJvbSBzaWduLW1hZ25pdHVkZSB0byB0d28ncyBjb21wbGVtZW50LCBhbmQgY29udmVydCB0aGUKKyAgICAgICByZXN1bHQgYmFjayB0byBzaWduLW1hZ25pdHVkZSBhdCB0aGUgZW5kLiAqLwogCi0JLyogSWYgYSBpcyBuZWdhdGl2ZSwgcmVwbGFjZSBpdCBieSBpdHMgdHdvJ3MgY29tcGxlbWVudC4gKi8KLQlzaXplX2EgPSBBQlMoUHlfU0laRShhKSk7Ci0JbmVnYSA9IFB5X1NJWkUoYSkgPCAwOwotCWlmIChuZWdhKSB7Ci0JCXogPSBfUHlMb25nX05ldyhzaXplX2EpOwotCQlpZiAoeiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXZfY29tcGxlbWVudCh6LT5vYl9kaWdpdCwgYS0+b2JfZGlnaXQsIHNpemVfYSk7Ci0JCWEgPSB6OwotCX0KLQllbHNlCi0JCS8qIEtlZXAgcmVmZXJlbmNlIGNvdW50IGNvbnNpc3RlbnQuICovCi0JCVB5X0lOQ1JFRihhKTsKKyAgICAvKiBJZiBhIGlzIG5lZ2F0aXZlLCByZXBsYWNlIGl0IGJ5IGl0cyB0d28ncyBjb21wbGVtZW50LiAqLworICAgIHNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICBuZWdhID0gUHlfU0laRShhKSA8IDA7CisgICAgaWYgKG5lZ2EpIHsKKyAgICAgICAgeiA9IF9QeUxvbmdfTmV3KHNpemVfYSk7CisgICAgICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdl9jb21wbGVtZW50KHotPm9iX2RpZ2l0LCBhLT5vYl9kaWdpdCwgc2l6ZV9hKTsKKyAgICAgICAgYSA9IHo7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgLyogS2VlcCByZWZlcmVuY2UgY291bnQgY29uc2lzdGVudC4gKi8KKyAgICAgICAgUHlfSU5DUkVGKGEpOwogCi0JLyogU2FtZSBmb3IgYi4gKi8KLQlzaXplX2IgPSBBQlMoUHlfU0laRShiKSk7Ci0JbmVnYiA9IFB5X1NJWkUoYikgPCAwOwotCWlmIChuZWdiKSB7Ci0JCXogPSBfUHlMb25nX05ldyhzaXplX2IpOwotCQlpZiAoeiA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQl2X2NvbXBsZW1lbnQoei0+b2JfZGlnaXQsIGItPm9iX2RpZ2l0LCBzaXplX2IpOwotCQliID0gejsKLQl9Ci0JZWxzZQotCQlQeV9JTkNSRUYoYik7CisgICAgLyogU2FtZSBmb3IgYi4gKi8KKyAgICBzaXplX2IgPSBBQlMoUHlfU0laRShiKSk7CisgICAgbmVnYiA9IFB5X1NJWkUoYikgPCAwOworICAgIGlmIChuZWdiKSB7CisgICAgICAgIHogPSBfUHlMb25nX05ldyhzaXplX2IpOworICAgICAgICBpZiAoeiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB2X2NvbXBsZW1lbnQoei0+b2JfZGlnaXQsIGItPm9iX2RpZ2l0LCBzaXplX2IpOworICAgICAgICBiID0gejsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYoYik7CiAKLQkvKiBTd2FwIGEgYW5kIGIgaWYgbmVjZXNzYXJ5IHRvIGVuc3VyZSBzaXplX2EgPj0gc2l6ZV9iLiAqLwotCWlmIChzaXplX2EgPCBzaXplX2IpIHsKLQkJeiA9IGE7IGEgPSBiOyBiID0gejsKLQkJc2l6ZV96ID0gc2l6ZV9hOyBzaXplX2EgPSBzaXplX2I7IHNpemVfYiA9IHNpemVfejsKLQkJbmVneiA9IG5lZ2E7IG5lZ2EgPSBuZWdiOyBuZWdiID0gbmVnejsKLQl9CisgICAgLyogU3dhcCBhIGFuZCBiIGlmIG5lY2Vzc2FyeSB0byBlbnN1cmUgc2l6ZV9hID49IHNpemVfYi4gKi8KKyAgICBpZiAoc2l6ZV9hIDwgc2l6ZV9iKSB7CisgICAgICAgIHogPSBhOyBhID0gYjsgYiA9IHo7CisgICAgICAgIHNpemVfeiA9IHNpemVfYTsgc2l6ZV9hID0gc2l6ZV9iOyBzaXplX2IgPSBzaXplX3o7CisgICAgICAgIG5lZ3ogPSBuZWdhOyBuZWdhID0gbmVnYjsgbmVnYiA9IG5lZ3o7CisgICAgfQogCi0JLyogSlJIOiBUaGUgb3JpZ2luYWwgbG9naWMgaGVyZSB3YXMgdG8gYWxsb2NhdGUgdGhlIHJlc3VsdCB2YWx1ZSAoeikKLQkgICBhcyB0aGUgbG9uZ2VyIG9mIHRoZSB0d28gb3BlcmFuZHMuICBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBjYXNlcwotCSAgIHdoZXJlIHRoZSByZXN1bHQgaXMgZ3VhcmFudGVlZCB0byBiZSBzaG9ydGVyIHRoYW4gdGhhdDogQU5EIG9mIHR3bwotCSAgIHBvc2l0aXZlcywgT1Igb2YgdHdvIG5lZ2F0aXZlczogdXNlIHRoZSBzaG9ydGVyIG51bWJlci4gIEFORCB3aXRoCi0JICAgbWl4ZWQgc2lnbnM6IHVzZSB0aGUgcG9zaXRpdmUgbnVtYmVyLiAgT1Igd2l0aCBtaXhlZCBzaWduczogdXNlIHRoZQotCSAgIG5lZ2F0aXZlIG51bWJlci4KLQkqLwotCXN3aXRjaCAob3ApIHsKLQljYXNlICdeJzoKLQkJbmVneiA9IG5lZ2EgXiBuZWdiOwotCQlzaXplX3ogPSBzaXplX2E7Ci0JCWJyZWFrOwotCWNhc2UgJyYnOgotCQluZWd6ID0gbmVnYSAmIG5lZ2I7Ci0JCXNpemVfeiA9IG5lZ2IgPyBzaXplX2EgOiBzaXplX2I7Ci0JCWJyZWFrOwotCWNhc2UgJ3wnOgotCQluZWd6ID0gbmVnYSB8IG5lZ2I7Ci0JCXNpemVfeiA9IG5lZ2IgPyBzaXplX2IgOiBzaXplX2E7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBKUkg6IFRoZSBvcmlnaW5hbCBsb2dpYyBoZXJlIHdhcyB0byBhbGxvY2F0ZSB0aGUgcmVzdWx0IHZhbHVlICh6KQorICAgICAgIGFzIHRoZSBsb25nZXIgb2YgdGhlIHR3byBvcGVyYW5kcy4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIGNhc2VzCisgICAgICAgd2hlcmUgdGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIHNob3J0ZXIgdGhhbiB0aGF0OiBBTkQgb2YgdHdvCisgICAgICAgcG9zaXRpdmVzLCBPUiBvZiB0d28gbmVnYXRpdmVzOiB1c2UgdGhlIHNob3J0ZXIgbnVtYmVyLiAgQU5EIHdpdGgKKyAgICAgICBtaXhlZCBzaWduczogdXNlIHRoZSBwb3NpdGl2ZSBudW1iZXIuICBPUiB3aXRoIG1peGVkIHNpZ25zOiB1c2UgdGhlCisgICAgICAgbmVnYXRpdmUgbnVtYmVyLgorICAgICovCisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgJ14nOgorICAgICAgICBuZWd6ID0gbmVnYSBeIG5lZ2I7CisgICAgICAgIHNpemVfeiA9IHNpemVfYTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICAgIG5lZ3ogPSBuZWdhICYgbmVnYjsKKyAgICAgICAgc2l6ZV96ID0gbmVnYiA/IHNpemVfYSA6IHNpemVfYjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnfCc6CisgICAgICAgIG5lZ3ogPSBuZWdhIHwgbmVnYjsKKyAgICAgICAgc2l6ZV96ID0gbmVnYiA/IHNpemVfYiA6IHNpemVfYTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogV2UgYWxsb3cgYW4gZXh0cmEgZGlnaXQgaWYgeiBpcyBuZWdhdGl2ZSwgdG8gbWFrZSBzdXJlIHRoYXQKLQkgICB0aGUgZmluYWwgdHdvJ3MgY29tcGxlbWVudCBvZiB6IGRvZXNuJ3Qgb3ZlcmZsb3cuICovCi0JeiA9IF9QeUxvbmdfTmV3KHNpemVfeiArIG5lZ3opOwotCWlmICh6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGEpOwotCQlQeV9ERUNSRUYoYik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBXZSBhbGxvdyBhbiBleHRyYSBkaWdpdCBpZiB6IGlzIG5lZ2F0aXZlLCB0byBtYWtlIHN1cmUgdGhhdAorICAgICAgIHRoZSBmaW5hbCB0d28ncyBjb21wbGVtZW50IG9mIHogZG9lc24ndCBvdmVyZmxvdy4gKi8KKyAgICB6ID0gX1B5TG9uZ19OZXcoc2l6ZV96ICsgbmVneik7CisgICAgaWYgKHogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgIFB5X0RFQ1JFRihiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ29tcHV0ZSBkaWdpdHMgZm9yIG92ZXJsYXAgb2YgYSBhbmQgYi4gKi8KLQlzd2l0Y2gob3ApIHsKLQljYXNlICcmJzoKLQkJZm9yIChpID0gMDsgaSA8IHNpemVfYjsgKytpKQotCQkJei0+b2JfZGlnaXRbaV0gPSBhLT5vYl9kaWdpdFtpXSAmIGItPm9iX2RpZ2l0W2ldOwotCQlicmVhazsKLQljYXNlICd8JzoKLQkJZm9yIChpID0gMDsgaSA8IHNpemVfYjsgKytpKQotCQkJei0+b2JfZGlnaXRbaV0gPSBhLT5vYl9kaWdpdFtpXSB8IGItPm9iX2RpZ2l0W2ldOwotCQlicmVhazsKLQljYXNlICdeJzoKLQkJZm9yIChpID0gMDsgaSA8IHNpemVfYjsgKytpKQotCQkJei0+b2JfZGlnaXRbaV0gPSBhLT5vYl9kaWdpdFtpXSBeIGItPm9iX2RpZ2l0W2ldOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ29tcHV0ZSBkaWdpdHMgZm9yIG92ZXJsYXAgb2YgYSBhbmQgYi4gKi8KKyAgICBzd2l0Y2gob3ApIHsKKyAgICBjYXNlICcmJzoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVfYjsgKytpKQorICAgICAgICAgICAgei0+b2JfZGlnaXRbaV0gPSBhLT5vYl9kaWdpdFtpXSAmIGItPm9iX2RpZ2l0W2ldOworICAgICAgICBicmVhazsKKyAgICBjYXNlICd8JzoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVfYjsgKytpKQorICAgICAgICAgICAgei0+b2JfZGlnaXRbaV0gPSBhLT5vYl9kaWdpdFtpXSB8IGItPm9iX2RpZ2l0W2ldOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdeJzoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVfYjsgKytpKQorICAgICAgICAgICAgei0+b2JfZGlnaXRbaV0gPSBhLT5vYl9kaWdpdFtpXSBeIGItPm9iX2RpZ2l0W2ldOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBDb3B5IGFueSByZW1haW5pbmcgZGlnaXRzIG9mIGEsIGludmVydGluZyBpZiBuZWNlc3NhcnkuICovCi0JaWYgKG9wID09ICdeJyAmJiBuZWdiKQotCQlmb3IgKDsgaSA8IHNpemVfejsgKytpKQotCQkJei0+b2JfZGlnaXRbaV0gPSBhLT5vYl9kaWdpdFtpXSBeIFB5TG9uZ19NQVNLOwotCWVsc2UgaWYgKGkgPCBzaXplX3opCi0JCW1lbWNweSgmei0+b2JfZGlnaXRbaV0sICZhLT5vYl9kaWdpdFtpXSwKLQkJICAgICAgIChzaXplX3otaSkqc2l6ZW9mKGRpZ2l0KSk7CisgICAgLyogQ29weSBhbnkgcmVtYWluaW5nIGRpZ2l0cyBvZiBhLCBpbnZlcnRpbmcgaWYgbmVjZXNzYXJ5LiAqLworICAgIGlmIChvcCA9PSAnXicgJiYgbmVnYikKKyAgICAgICAgZm9yICg7IGkgPCBzaXplX3o7ICsraSkKKyAgICAgICAgICAgIHotPm9iX2RpZ2l0W2ldID0gYS0+b2JfZGlnaXRbaV0gXiBQeUxvbmdfTUFTSzsKKyAgICBlbHNlIGlmIChpIDwgc2l6ZV96KQorICAgICAgICBtZW1jcHkoJnotPm9iX2RpZ2l0W2ldLCAmYS0+b2JfZGlnaXRbaV0sCisgICAgICAgICAgICAgICAoc2l6ZV96LWkpKnNpemVvZihkaWdpdCkpOwogCi0JLyogQ29tcGxlbWVudCByZXN1bHQgaWYgbmVnYXRpdmUuICovCi0JaWYgKG5lZ3opIHsKLQkJUHlfU0laRSh6KSA9IC0oUHlfU0laRSh6KSk7Ci0JCXotPm9iX2RpZ2l0W3NpemVfel0gPSBQeUxvbmdfTUFTSzsKLQkJdl9jb21wbGVtZW50KHotPm9iX2RpZ2l0LCB6LT5vYl9kaWdpdCwgc2l6ZV96KzEpOwotCX0KKyAgICAvKiBDb21wbGVtZW50IHJlc3VsdCBpZiBuZWdhdGl2ZS4gKi8KKyAgICBpZiAobmVneikgeworICAgICAgICBQeV9TSVpFKHopID0gLShQeV9TSVpFKHopKTsKKyAgICAgICAgei0+b2JfZGlnaXRbc2l6ZV96XSA9IFB5TG9uZ19NQVNLOworICAgICAgICB2X2NvbXBsZW1lbnQoei0+b2JfZGlnaXQsIHotPm9iX2RpZ2l0LCBzaXplX3orMSk7CisgICAgfQogCi0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbG9uZ19ub3JtYWxpemUoeik7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbG9uZ19ub3JtYWxpemUoeik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2FuZChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYjsKLQlQeU9iamVjdCAqYzsKLQlDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7Ci0JYyA9IGxvbmdfYml0d2lzZShhLCAnJicsIGIpOwotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIGM7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYjsKKyAgICBQeU9iamVjdCAqYzsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CisgICAgYyA9IGxvbmdfYml0d2lzZShhLCAnJicsIGIpOworICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIGM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX3hvcihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYjsKLQlQeU9iamVjdCAqYzsKLQlDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7Ci0JYyA9IGxvbmdfYml0d2lzZShhLCAnXicsIGIpOwotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIGM7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYjsKKyAgICBQeU9iamVjdCAqYzsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CisgICAgYyA9IGxvbmdfYml0d2lzZShhLCAnXicsIGIpOworICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIGM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX29yKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeUxvbmdPYmplY3QgKmEsICpiOwotCVB5T2JqZWN0ICpjOwotCUNPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKLQljID0gbG9uZ19iaXR3aXNlKGEsICd8JywgYik7Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gYzsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiOworICAgIFB5T2JqZWN0ICpjOworICAgIENPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBjID0gbG9uZ19iaXR3aXNlKGEsICd8JywgYik7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gYzsKIH0KIAogc3RhdGljIGludAogbG9uZ19jb2VyY2UoUHlPYmplY3QgKipwdiwgUHlPYmplY3QgKipwdykKIHsKLQlpZiAoUHlJbnRfQ2hlY2soKnB3KSkgewotCQkqcHcgPSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORygqcHcpKTsKLQkJaWYgKCpwdyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlQeV9JTkNSRUYoKnB2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjaygqcHcpKSB7Ci0JCVB5X0lOQ1JFRigqcHYpOwotCQlQeV9JTkNSRUYoKnB3KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOyAvKiBDYW4ndCBkbyBpdCAqLworICAgIGlmIChQeUludF9DaGVjaygqcHcpKSB7CisgICAgICAgICpwdyA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKCpwdykpOworICAgICAgICBpZiAoKnB3ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKCpwdykpIHsKKyAgICAgICAgUHlfSU5DUkVGKCpwdik7CisgICAgICAgIFB5X0lOQ1JFRigqcHcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7IC8qIENhbid0IGRvIGl0ICovCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2xvbmcoUHlPYmplY3QgKnYpCiB7Ci0JaWYgKFB5TG9uZ19DaGVja0V4YWN0KHYpKQotCQlQeV9JTkNSRUYodik7Ci0JZWxzZQotCQl2ID0gX1B5TG9uZ19Db3B5KChQeUxvbmdPYmplY3QgKil2KTsKLQlyZXR1cm4gdjsKKyAgICBpZiAoUHlMb25nX0NoZWNrRXhhY3QodikpCisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICBlbHNlCisgICAgICAgIHYgPSBfUHlMb25nX0NvcHkoKFB5TG9uZ09iamVjdCAqKXYpOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19pbnQoUHlPYmplY3QgKnYpCiB7Ci0JbG9uZyB4OwotCXggPSBQeUxvbmdfQXNMb25nKHYpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlpZiAoUHlMb25nX0NoZWNrRXhhY3QodikpIHsKLQkJCQkJUHlfSU5DUkVGKHYpOwotCQkJCQlyZXR1cm4gdjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gX1B5TG9uZ19Db3B5KChQeUxvbmdPYmplY3QgKil2KTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIGxvbmcgeDsKKyAgICB4ID0gUHlMb25nX0FzTG9uZyh2KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeUxvbmdfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX1B5TG9uZ19Db3B5KChQeUxvbmdPYmplY3QgKil2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19mbG9hdChQeU9iamVjdCAqdikKIHsKLQlkb3VibGUgcmVzdWx0OwotCXJlc3VsdCA9IFB5TG9uZ19Bc0RvdWJsZSh2KTsKLQlpZiAocmVzdWx0ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyZXN1bHQpOworICAgIGRvdWJsZSByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlMb25nX0FzRG91YmxlKHYpOworICAgIGlmIChyZXN1bHQgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX29jdChQeU9iamVjdCAqdikKIHsKLQlyZXR1cm4gX1B5TG9uZ19Gb3JtYXQodiwgOCwgMSwgMCk7CisgICAgcmV0dXJuIF9QeUxvbmdfRm9ybWF0KHYsIDgsIDEsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19oZXgoUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIF9QeUxvbmdfRm9ybWF0KHYsIDE2LCAxLCAwKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gb3JtYXQodiwgMTYsIDEsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMzk3NSw0OSArMzk3NSw0OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp4ID0gTlVMTDsKLQlpbnQgYmFzZSA9IC05MDk7CQkgICAgIC8qIHVubGlrZWx5ISAqLwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsieCIsICJiYXNlIiwgMH07CisgICAgUHlPYmplY3QgKnggPSBOVUxMOworICAgIGludCBiYXNlID0gLTkwOTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5saWtlbHkhICovCisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJ4IiwgImJhc2UiLCAwfTsKIAotCWlmICh0eXBlICE9ICZQeUxvbmdfVHlwZSkKLQkJcmV0dXJuIGxvbmdfc3VidHlwZV9uZXcodHlwZSwgYXJncywga3dkcyk7IC8qIFdpbXAgb3V0ICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPaTpsb25nIiwga3dsaXN0LAotCQkJCQkgJngsICZiYXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwTCk7Ci0JaWYgKGJhc2UgPT0gLTkwOSkKLQkJcmV0dXJuIFB5TnVtYmVyX0xvbmcoeCk7Ci0JZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soeCkpIHsKLQkJLyogU2luY2UgUHlMb25nX0Zyb21TdHJpbmcgZG9lc24ndCBoYXZlIGEgbGVuZ3RoIHBhcmFtZXRlciwKLQkJICogY2hlY2sgaGVyZSBmb3IgcG9zc2libGUgTlVMcyBpbiB0aGUgc3RyaW5nLiAqLwotCQljaGFyICpzdHJpbmcgPSBQeVN0cmluZ19BU19TVFJJTkcoeCk7Ci0JCWlmIChzdHJsZW4oc3RyaW5nKSAhPSAoc2l6ZV90KVB5U3RyaW5nX1NpemUoeCkpIHsKLQkJCS8qIGNyZWF0ZSBhIHJlcHIoKSBvZiB0aGUgaW5wdXQgc3RyaW5nLAotCQkJICoganVzdCBsaWtlIFB5TG9uZ19Gcm9tU3RyaW5nIGRvZXMuICovCi0JCQlQeU9iamVjdCAqc3JlcHI7Ci0JCQlzcmVwciA9IFB5T2JqZWN0X1JlcHIoeCk7Ci0JCQlpZiAoc3JlcHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBsb25nKCkgd2l0aCBiYXNlICVkOiAlcyIsCi0JCQkgICAgIGJhc2UsIFB5U3RyaW5nX0FTX1NUUklORyhzcmVwcikpOwotCQkJUHlfREVDUkVGKHNyZXByKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBQeUxvbmdfRnJvbVN0cmluZyhQeVN0cmluZ19BU19TVFJJTkcoeCksIE5VTEwsIGJhc2UpOwotCX0KKyAgICBpZiAodHlwZSAhPSAmUHlMb25nX1R5cGUpCisgICAgICAgIHJldHVybiBsb25nX3N1YnR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOyAvKiBXaW1wIG91dCAqLworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T2k6bG9uZyIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwgJmJhc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKDBMKTsKKyAgICBpZiAoYmFzZSA9PSAtOTA5KQorICAgICAgICByZXR1cm4gUHlOdW1iZXJfTG9uZyh4KTsKKyAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayh4KSkgeworICAgICAgICAvKiBTaW5jZSBQeUxvbmdfRnJvbVN0cmluZyBkb2Vzbid0IGhhdmUgYSBsZW5ndGggcGFyYW1ldGVyLAorICAgICAgICAgKiBjaGVjayBoZXJlIGZvciBwb3NzaWJsZSBOVUxzIGluIHRoZSBzdHJpbmcuICovCisgICAgICAgIGNoYXIgKnN0cmluZyA9IFB5U3RyaW5nX0FTX1NUUklORyh4KTsKKyAgICAgICAgaWYgKHN0cmxlbihzdHJpbmcpICE9IChzaXplX3QpUHlTdHJpbmdfU2l6ZSh4KSkgeworICAgICAgICAgICAgLyogY3JlYXRlIGEgcmVwcigpIG9mIHRoZSBpbnB1dCBzdHJpbmcsCisgICAgICAgICAgICAgKiBqdXN0IGxpa2UgUHlMb25nX0Zyb21TdHJpbmcgZG9lcy4gKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpzcmVwcjsKKyAgICAgICAgICAgIHNyZXByID0gUHlPYmplY3RfUmVwcih4KTsKKyAgICAgICAgICAgIGlmIChzcmVwciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGxvbmcoKSB3aXRoIGJhc2UgJWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgYmFzZSwgUHlTdHJpbmdfQVNfU1RSSU5HKHNyZXByKSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3JlcHIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyh4KSwgTlVMTCwgYmFzZSk7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soeCkpCi0JCXJldHVybiBQeUxvbmdfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUoeCksCi0JCQkJCSAgUHlVbmljb2RlX0dFVF9TSVpFKHgpLAotCQkJCQkgIGJhc2UpOworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh4KSkKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5pY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERSh4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSk7CiAjZW5kaWYKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJsb25nKCkgY2FuJ3QgY29udmVydCBub24tc3RyaW5nIHdpdGggZXhwbGljaXQgYmFzZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAibG9uZygpIGNhbid0IGNvbnZlcnQgbm9uLXN0cmluZyB3aXRoIGV4cGxpY2l0IGJhc2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiAvKiBXaW1weSwgc2xvdyBhcHByb2FjaCB0byB0cF9uZXcgY2FsbHMgZm9yIHN1YnR5cGVzIG9mIGxvbmc6CkBAIC00MDI4LDEzOCArNDAyOCwxMzggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX3N1YnR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5TG9uZ09iamVjdCAqdG1wLCAqbmV3b2JqOwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICBQeUxvbmdPYmplY3QgKnRtcCwgKm5ld29iajsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAKLQlhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlMb25nX1R5cGUpKTsKLQl0bXAgPSAoUHlMb25nT2JqZWN0ICopbG9uZ19uZXcoJlB5TG9uZ19UeXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeUxvbmdfQ2hlY2tFeGFjdCh0bXApKTsKLQluID0gUHlfU0laRSh0bXApOwotCWlmIChuIDwgMCkKLQkJbiA9IC1uOwotCW5ld29iaiA9IChQeUxvbmdPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCBuKTsKLQlpZiAobmV3b2JqID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHRtcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhc3NlcnQoUHlMb25nX0NoZWNrKG5ld29iaikpOwotCVB5X1NJWkUobmV3b2JqKSA9IFB5X1NJWkUodG1wKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQluZXdvYmotPm9iX2RpZ2l0W2ldID0gdG1wLT5vYl9kaWdpdFtpXTsKLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3b2JqOworICAgIGFzc2VydChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeUxvbmdfVHlwZSkpOworICAgIHRtcCA9IChQeUxvbmdPYmplY3QgKilsb25nX25ldygmUHlMb25nX1R5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5TG9uZ19DaGVja0V4YWN0KHRtcCkpOworICAgIG4gPSBQeV9TSVpFKHRtcCk7CisgICAgaWYgKG4gPCAwKQorICAgICAgICBuID0gLW47CisgICAgbmV3b2JqID0gKFB5TG9uZ09iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIG4pOworICAgIGlmIChuZXdvYmogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzc2VydChQeUxvbmdfQ2hlY2sobmV3b2JqKSk7CisgICAgUHlfU0laRShuZXdvYmopID0gUHlfU0laRSh0bXApOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIG5ld29iai0+b2JfZGlnaXRbaV0gPSB0bXAtPm9iX2RpZ2l0W2ldOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdvYmo7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2dldG5ld2FyZ3MoUHlMb25nT2JqZWN0ICp2KQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoTikiLCBfUHlMb25nX0NvcHkodikpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoTikiLCBfUHlMb25nX0NvcHkodikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19nZXQwKFB5TG9uZ09iamVjdCAqdiwgdm9pZCAqY29udGV4dCkgewotCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoMEwpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoMEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19nZXQxKFB5TG9uZ09iamVjdCAqdiwgdm9pZCAqY29udGV4dCkgewotCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoMUwpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoMUwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19fZm9ybWF0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpmb3JtYXRfc3BlYzsKKyAgICBQeU9iamVjdCAqZm9ybWF0X3NwZWM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19mb3JtYXRfXyIsICZmb3JtYXRfc3BlYykpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeUJ5dGVzX0NoZWNrKGZvcm1hdF9zcGVjKSkKLQkJcmV0dXJuIF9QeUxvbmdfRm9ybWF0QWR2YW5jZWQoc2VsZiwKLQkJCQkJICAgICAgUHlCeXRlc19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAotCQkJCQkgICAgICBQeUJ5dGVzX0dFVF9TSVpFKGZvcm1hdF9zcGVjKSk7Ci0JaWYgKFB5VW5pY29kZV9DaGVjayhmb3JtYXRfc3BlYykpIHsKLQkJLyogQ29udmVydCBmb3JtYXRfc3BlYyB0byBhIHN0ciAqLwotCQlQeU9iamVjdCAqcmVzdWx0OwotCQlQeU9iamVjdCAqc3RyX3NwZWMgPSBQeU9iamVjdF9TdHIoZm9ybWF0X3NwZWMpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdF9zcGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5Qnl0ZXNfQ2hlY2soZm9ybWF0X3NwZWMpKQorICAgICAgICByZXR1cm4gX1B5TG9uZ19Gb3JtYXRBZHZhbmNlZChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhmb3JtYXRfc3BlYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoZm9ybWF0X3NwZWMpKTsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkgeworICAgICAgICAvKiBDb252ZXJ0IGZvcm1hdF9zcGVjIHRvIGEgc3RyICovCisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgIFB5T2JqZWN0ICpzdHJfc3BlYyA9IFB5T2JqZWN0X1N0cihmb3JtYXRfc3BlYyk7CiAKLQkJaWYgKHN0cl9zcGVjID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHN0cl9zcGVjID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlyZXN1bHQgPSBfUHlMb25nX0Zvcm1hdEFkdmFuY2VkKHNlbGYsCi0JCQkJCQlQeUJ5dGVzX0FTX1NUUklORyhzdHJfc3BlYyksCi0JCQkJCQlQeUJ5dGVzX0dFVF9TSVpFKHN0cl9zcGVjKSk7CisgICAgICAgIHJlc3VsdCA9IF9QeUxvbmdfRm9ybWF0QWR2YW5jZWQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzdHJfc3BlYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShzdHJfc3BlYykpOwogCi0JCVB5X0RFQ1JFRihzdHJfc3BlYyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJfX2Zvcm1hdF9fIHJlcXVpcmVzIHN0ciBvciB1bmljb2RlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihzdHJfc3BlYyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJfX2Zvcm1hdF9fIHJlcXVpcmVzIHN0ciBvciB1bmljb2RlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX3NpemVvZihQeUxvbmdPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCByZXM7CisgICAgUHlfc3NpemVfdCByZXM7CiAKLQlyZXMgPSB2LT5vYl90eXBlLT50cF9iYXNpY3NpemUgKyBBQlMoUHlfU0laRSh2KSkqc2l6ZW9mKGRpZ2l0KTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKKyAgICByZXMgPSB2LT5vYl90eXBlLT50cF9iYXNpY3NpemUgKyBBQlMoUHlfU0laRSh2KSkqc2l6ZW9mKGRpZ2l0KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfYml0X2xlbmd0aChQeUxvbmdPYmplY3QgKnYpCiB7Ci0JUHlMb25nT2JqZWN0ICpyZXN1bHQsICp4LCAqeTsKLQlQeV9zc2l6ZV90IG5kaWdpdHMsIG1zZF9iaXRzID0gMDsKLQlkaWdpdCBtc2Q7CisgICAgUHlMb25nT2JqZWN0ICpyZXN1bHQsICp4LCAqeTsKKyAgICBQeV9zc2l6ZV90IG5kaWdpdHMsIG1zZF9iaXRzID0gMDsKKyAgICBkaWdpdCBtc2Q7CiAKLQlhc3NlcnQodiAhPSBOVUxMKTsKLQlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKKyAgICBhc3NlcnQodiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKIAotCW5kaWdpdHMgPSBBQlMoUHlfU0laRSh2KSk7Ci0JaWYgKG5kaWdpdHMgPT0gMCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOworICAgIG5kaWdpdHMgPSBBQlMoUHlfU0laRSh2KSk7CisgICAgaWYgKG5kaWdpdHMgPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOwogCi0JbXNkID0gdi0+b2JfZGlnaXRbbmRpZ2l0cy0xXTsKLQl3aGlsZSAobXNkID49IDMyKSB7Ci0JCW1zZF9iaXRzICs9IDY7Ci0JCW1zZCA+Pj0gNjsKLQl9Ci0JbXNkX2JpdHMgKz0gKGxvbmcpKEJpdExlbmd0aFRhYmxlW21zZF0pOworICAgIG1zZCA9IHYtPm9iX2RpZ2l0W25kaWdpdHMtMV07CisgICAgd2hpbGUgKG1zZCA+PSAzMikgeworICAgICAgICBtc2RfYml0cyArPSA2OworICAgICAgICBtc2QgPj49IDY7CisgICAgfQorICAgIG1zZF9iaXRzICs9IChsb25nKShCaXRMZW5ndGhUYWJsZVttc2RdKTsKIAotCWlmIChuZGlnaXRzIDw9IFBZX1NTSVpFX1RfTUFYL1B5TG9uZ19TSElGVCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KChuZGlnaXRzLTEpKlB5TG9uZ19TSElGVCArIG1zZF9iaXRzKTsKKyAgICBpZiAobmRpZ2l0cyA8PSBQWV9TU0laRV9UX01BWC9QeUxvbmdfU0hJRlQpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCgobmRpZ2l0cy0xKSpQeUxvbmdfU0hJRlQgKyBtc2RfYml0cyk7CiAKLQkvKiBleHByZXNzaW9uIGFib3ZlIG1heSBvdmVyZmxvdzsgdXNlIFB5dGhvbiBpbnRlZ2VycyBpbnN0ZWFkICovCi0JcmVzdWx0ID0gKFB5TG9uZ09iamVjdCAqKVB5TG9uZ19Gcm9tU3NpemVfdChuZGlnaXRzIC0gMSk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl4ID0gKFB5TG9uZ09iamVjdCAqKVB5TG9uZ19Gcm9tTG9uZyhQeUxvbmdfU0hJRlQpOwotCWlmICh4ID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0JeSA9IChQeUxvbmdPYmplY3QgKilsb25nX211bChyZXN1bHQsIHgpOwotCVB5X0RFQ1JFRih4KTsKLQlpZiAoeSA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJlc3VsdCA9IHk7CisgICAgLyogZXhwcmVzc2lvbiBhYm92ZSBtYXkgb3ZlcmZsb3c7IHVzZSBQeXRob24gaW50ZWdlcnMgaW5zdGVhZCAqLworICAgIHJlc3VsdCA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbVNzaXplX3QobmRpZ2l0cyAtIDEpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeCA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoUHlMb25nX1NISUZUKTsKKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHkgPSAoUHlMb25nT2JqZWN0ICopbG9uZ19tdWwocmVzdWx0LCB4KTsKKyAgICBQeV9ERUNSRUYoeCk7CisgICAgaWYgKHkgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXN1bHQgPSB5OwogCi0JeCA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoKGxvbmcpbXNkX2JpdHMpOwotCWlmICh4ID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0JeSA9IChQeUxvbmdPYmplY3QgKilsb25nX2FkZChyZXN1bHQsIHgpOwotCVB5X0RFQ1JFRih4KTsKLQlpZiAoeSA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJlc3VsdCA9IHk7CisgICAgeCA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoKGxvbmcpbXNkX2JpdHMpOworICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgeSA9IChQeUxvbmdPYmplY3QgKilsb25nX2FkZChyZXN1bHQsIHgpOworICAgIFB5X0RFQ1JFRih4KTsKKyAgICBpZiAoeSA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJlc3VsdCA9IHk7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CiAKIGVycm9yOgotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIobG9uZ19iaXRfbGVuZ3RoX2RvYywKQEAgLTQxNzUsMjYgKzQxNzUsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2lzX2Zpbml0ZShQeU9iamVjdCAqdikKIHsKLQlQeV9SRVRVUk5fVFJVRTsKKyAgICBQeV9SRVRVUk5fVFJVRTsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlNZXRob2REZWYgbG9uZ19tZXRob2RzW10gPSB7Ci0JeyJjb25qdWdhdGUiLAkoUHlDRnVuY3Rpb24pbG9uZ19sb25nLAlNRVRIX05PQVJHUywKLQkgIlJldHVybnMgc2VsZiwgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFueSBsb25nLiJ9LAotCXsiYml0X2xlbmd0aCIsCShQeUNGdW5jdGlvbilsb25nX2JpdF9sZW5ndGgsIE1FVEhfTk9BUkdTLAotCSBsb25nX2JpdF9sZW5ndGhfZG9jfSwKKyAgICB7ImNvbmp1Z2F0ZSIsICAgICAgIChQeUNGdW5jdGlvbilsb25nX2xvbmcsIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGxvbmcuIn0sCisgICAgeyJiaXRfbGVuZ3RoIiwgICAgICAoUHlDRnVuY3Rpb24pbG9uZ19iaXRfbGVuZ3RoLCBNRVRIX05PQVJHUywKKyAgICAgbG9uZ19iaXRfbGVuZ3RoX2RvY30sCiAjaWYgMAotCXsiaXNfZmluaXRlIiwJKFB5Q0Z1bmN0aW9uKWxvbmdfaXNfZmluaXRlLAlNRVRIX05PQVJHUywKLQkgIlJldHVybnMgYWx3YXlzIFRydWUuIn0sCisgICAgeyJpc19maW5pdGUiLCAgICAgICAoUHlDRnVuY3Rpb24pbG9uZ19pc19maW5pdGUsICAgIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBhbHdheXMgVHJ1ZS4ifSwKICNlbmRpZgotCXsiX190cnVuY19fIiwJKFB5Q0Z1bmN0aW9uKWxvbmdfbG9uZywJTUVUSF9OT0FSR1MsCi0gICAgICAgICAiVHJ1bmNhdGluZyBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi4ifSwKLQl7Il9fZ2V0bmV3YXJnc19fIiwJKFB5Q0Z1bmN0aW9uKWxvbmdfZ2V0bmV3YXJncywJTUVUSF9OT0FSR1N9LAotICAgICAgICB7Il9fZm9ybWF0X18iLCAoUHlDRnVuY3Rpb24pbG9uZ19fZm9ybWF0X18sIE1FVEhfVkFSQVJHU30sCi0JeyJfX3NpemVvZl9fIiwJKFB5Q0Z1bmN0aW9uKWxvbmdfc2l6ZW9mLCBNRVRIX05PQVJHUywKLQkgIlJldHVybnMgc2l6ZSBpbiBtZW1vcnksIGluIGJ5dGVzIn0sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fdHJ1bmNfXyIsICAgICAgIChQeUNGdW5jdGlvbilsb25nX2xvbmcsIE1FVEhfTk9BUkdTLAorICAgICAiVHJ1bmNhdGluZyBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi4ifSwKKyAgICB7Il9fZ2V0bmV3YXJnc19fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxvbmdfZ2V0bmV3YXJncywgICBNRVRIX05PQVJHU30sCisgICAgeyJfX2Zvcm1hdF9fIiwgKFB5Q0Z1bmN0aW9uKWxvbmdfX2Zvcm1hdF9fLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiX19zaXplb2ZfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWxvbmdfc2l6ZW9mLCBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgc2l6ZSBpbiBtZW1vcnksIGluIGJ5dGVzIn0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeUdldFNldERlZiBsb25nX2dldHNldFtdID0gewpAQCAtNDIyNyw4OSArNDIyNyw4OSBAQAogY29udmVydGluZyBhIG5vbi1zdHJpbmcuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgbG9uZ19hc19udW1iZXIgPSB7Ci0JKGJpbmFyeWZ1bmMpCWxvbmdfYWRkLAkvKm5iX2FkZCovCi0JKGJpbmFyeWZ1bmMpCWxvbmdfc3ViLAkvKm5iX3N1YnRyYWN0Ki8KLQkoYmluYXJ5ZnVuYykJbG9uZ19tdWwsCS8qbmJfbXVsdGlwbHkqLwotCQkJbG9uZ19jbGFzc2ljX2RpdiwgLypuYl9kaXZpZGUqLwotCQkJbG9uZ19tb2QsCS8qbmJfcmVtYWluZGVyKi8KLQkJCWxvbmdfZGl2bW9kLAkvKm5iX2Rpdm1vZCovCi0JCQlsb25nX3BvdywJLypuYl9wb3dlciovCi0JKHVuYXJ5ZnVuYykgCWxvbmdfbmVnLAkvKm5iX25lZ2F0aXZlKi8KLQkodW5hcnlmdW5jKSAJbG9uZ19sb25nLAkvKnRwX3Bvc2l0aXZlKi8KLQkodW5hcnlmdW5jKSAJbG9uZ19hYnMsCS8qdHBfYWJzb2x1dGUqLwotCShpbnF1aXJ5KQlsb25nX25vbnplcm8sCS8qdHBfbm9uemVybyovCi0JKHVuYXJ5ZnVuYykJbG9uZ19pbnZlcnQsCS8qbmJfaW52ZXJ0Ki8KLQkJCWxvbmdfbHNoaWZ0LAkvKm5iX2xzaGlmdCovCi0JKGJpbmFyeWZ1bmMpCWxvbmdfcnNoaWZ0LAkvKm5iX3JzaGlmdCovCi0JCQlsb25nX2FuZCwJLypuYl9hbmQqLwotCQkJbG9uZ194b3IsCS8qbmJfeG9yKi8KLQkJCWxvbmdfb3IsCS8qbmJfb3IqLwotCQkJbG9uZ19jb2VyY2UsCS8qbmJfY29lcmNlKi8KLQkJCWxvbmdfaW50LAkvKm5iX2ludCovCi0JCQlsb25nX2xvbmcsCS8qbmJfbG9uZyovCi0JCQlsb25nX2Zsb2F0LAkvKm5iX2Zsb2F0Ki8KLQkJCWxvbmdfb2N0LAkvKm5iX29jdCovCi0JCQlsb25nX2hleCwJLypuYl9oZXgqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfYWRkICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9zdWJ0cmFjdCAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfbXVsdGlwbHkgKi8KLQkwLAkJCQkvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfcmVtYWluZGVyICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9wb3dlciAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfbHNoaWZ0ICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9yc2hpZnQgKi8KLQkwLAkJCQkvKiBuYl9pbnBsYWNlX2FuZCAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfeG9yICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9vciAqLwotCWxvbmdfZGl2LAkJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLwotCWxvbmdfdHJ1ZV9kaXZpZGUsCQkvKiBuYl90cnVlX2RpdmlkZSAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLwotCWxvbmdfbG9uZywJCQkvKiBuYl9pbmRleCAqLworICAgIChiaW5hcnlmdW5jKSAgICAgICAgbG9uZ19hZGQsICAgICAgIC8qbmJfYWRkKi8KKyAgICAoYmluYXJ5ZnVuYykgICAgICAgIGxvbmdfc3ViLCAgICAgICAvKm5iX3N1YnRyYWN0Ki8KKyAgICAoYmluYXJ5ZnVuYykgICAgICAgIGxvbmdfbXVsLCAgICAgICAvKm5iX211bHRpcGx5Ki8KKyAgICAgICAgICAgIGxvbmdfY2xhc3NpY19kaXYsIC8qbmJfZGl2aWRlKi8KKyAgICAgICAgICAgIGxvbmdfbW9kLCAgICAgICAgICAgICAgICAgICAvKm5iX3JlbWFpbmRlciovCisgICAgICAgICAgICBsb25nX2Rpdm1vZCwgICAgICAgICAgICAgICAgLypuYl9kaXZtb2QqLworICAgICAgICAgICAgbG9uZ19wb3csICAgICAgICAgICAgICAgICAgIC8qbmJfcG93ZXIqLworICAgICh1bmFyeWZ1bmMpICAgICAgICAgbG9uZ19uZWcsICAgICAgIC8qbmJfbmVnYXRpdmUqLworICAgICh1bmFyeWZ1bmMpICAgICAgICAgbG9uZ19sb25nLCAgICAgIC8qdHBfcG9zaXRpdmUqLworICAgICh1bmFyeWZ1bmMpICAgICAgICAgbG9uZ19hYnMsICAgICAgIC8qdHBfYWJzb2x1dGUqLworICAgIChpbnF1aXJ5KSAgICAgICAgICAgbG9uZ19ub256ZXJvLCAgIC8qdHBfbm9uemVybyovCisgICAgKHVuYXJ5ZnVuYykgICAgICAgICBsb25nX2ludmVydCwgICAgLypuYl9pbnZlcnQqLworICAgICAgICAgICAgbG9uZ19sc2hpZnQsICAgICAgICAgICAgICAgIC8qbmJfbHNoaWZ0Ki8KKyAgICAoYmluYXJ5ZnVuYykgICAgICAgIGxvbmdfcnNoaWZ0LCAgICAvKm5iX3JzaGlmdCovCisgICAgICAgICAgICBsb25nX2FuZCwgICAgICAgICAgICAgICAgICAgLypuYl9hbmQqLworICAgICAgICAgICAgbG9uZ194b3IsICAgICAgICAgICAgICAgICAgIC8qbmJfeG9yKi8KKyAgICAgICAgICAgIGxvbmdfb3IsICAgICAgICAgICAgICAgICAgICAvKm5iX29yKi8KKyAgICAgICAgICAgIGxvbmdfY29lcmNlLCAgICAgICAgICAgICAgICAvKm5iX2NvZXJjZSovCisgICAgICAgICAgICBsb25nX2ludCwgICAgICAgICAgICAgICAgICAgLypuYl9pbnQqLworICAgICAgICAgICAgbG9uZ19sb25nLCAgICAgICAgICAgICAgICAgIC8qbmJfbG9uZyovCisgICAgICAgICAgICBsb25nX2Zsb2F0LCAgICAgICAgICAgICAgICAgLypuYl9mbG9hdCovCisgICAgICAgICAgICBsb25nX29jdCwgICAgICAgICAgICAgICAgICAgLypuYl9vY3QqLworICAgICAgICAgICAgbG9uZ19oZXgsICAgICAgICAgICAgICAgICAgIC8qbmJfaGV4Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2FkZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hbmQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3hvciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfb3IgKi8KKyAgICBsb25nX2RpdiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9mbG9vcl9kaXZpZGUgKi8KKyAgICBsb25nX3RydWVfZGl2aWRlLCAgICAgICAgICAgICAgICAgICAvKiBuYl90cnVlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLworICAgIGxvbmdfbG9uZywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2luZGV4ICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlMb25nX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkJLyogb2Jfc2l6ZSAqLwotCSJsb25nIiwJCQkJCS8qIHRwX25hbWUgKi8KLQlvZmZzZXRvZihQeUxvbmdPYmplY3QsIG9iX2RpZ2l0KSwJLyogdHBfYmFzaWNzaXplICovCi0Jc2l6ZW9mKGRpZ2l0KSwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQlsb25nX2RlYWxsb2MsCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpbG9uZ19jb21wYXJlLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQlsb25nX3JlcHIsCQkJCS8qIHRwX3JlcHIgKi8KLQkmbG9uZ19hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpbG9uZ19oYXNoLAkJCS8qIHRwX2hhc2ggKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgIAkJCS8qIHRwX2NhbGwgKi8KLSAgICAgICAgbG9uZ19zdHIsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfTE9OR19TVUJDTEFTUywJLyogdHBfZmxhZ3MgKi8KLQlsb25nX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlsb25nX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCWxvbmdfZ2V0c2V0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JbG9uZ19uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAibG9uZyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBvZmZzZXRvZihQeUxvbmdPYmplY3QsIG9iX2RpZ2l0KSwgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIHNpemVvZihkaWdpdCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICBsb25nX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgKGNtcGZ1bmMpbG9uZ19jb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgbG9uZ19yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmxvbmdfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWxvbmdfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgbG9uZ19zdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfTE9OR19TVUJDTEFTUywgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGxvbmdfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBsb25nX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBsb25nX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgbG9uZ19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBMb25nX0luZm9UeXBlOwpAQCAtNDMyMSw0MyArNDMyMSw0MyBAQAogaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgaW50ZWdlcnMuICBUaGUgYXR0cmlidXRlcyBhcmUgcmVhZCBvbmx5LiIpOwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCBsb25nX2luZm9fZmllbGRzW10gPSB7Ci0JeyJiaXRzX3Blcl9kaWdpdCIsICJzaXplIG9mIGEgZGlnaXQgaW4gYml0cyJ9LAotCXsic2l6ZW9mX2RpZ2l0IiwgInNpemUgaW4gYnl0ZXMgb2YgdGhlIEMgdHlwZSB1c2VkIHRvICIKLQkgICAgICAgICAgICAgICAgICJyZXByZXNlbnQgYSBkaWdpdCJ9LAotCXtOVUxMLCBOVUxMfQorICAgIHsiYml0c19wZXJfZGlnaXQiLCAic2l6ZSBvZiBhIGRpZ2l0IGluIGJpdHMifSwKKyAgICB7InNpemVvZl9kaWdpdCIsICJzaXplIGluIGJ5dGVzIG9mIHRoZSBDIHR5cGUgdXNlZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAicmVwcmVzZW50IGEgZGlnaXQifSwKKyAgICB7TlVMTCwgTlVMTH0KIH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2MgbG9uZ19pbmZvX2Rlc2MgPSB7Ci0JInN5cy5sb25nX2luZm8iLCAgIC8qIG5hbWUgKi8KLQlsb25nX2luZm9fX2RvY19fLCAgLyogZG9jICovCi0JbG9uZ19pbmZvX2ZpZWxkcywgIC8qIGZpZWxkcyAqLwotCTIgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBmaWVsZHMgKi8KKyAgICAic3lzLmxvbmdfaW5mbyIsICAgLyogbmFtZSAqLworICAgIGxvbmdfaW5mb19fZG9jX18sICAvKiBkb2MgKi8KKyAgICBsb25nX2luZm9fZmllbGRzLCAgLyogZmllbGRzICovCisgICAgMiAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGZpZWxkcyAqLwogfTsKIAogUHlPYmplY3QgKgogUHlMb25nX0dldEluZm8odm9pZCkKIHsKLQlQeU9iamVjdCogbG9uZ19pbmZvOwotCWludCBmaWVsZCA9IDA7Ci0JbG9uZ19pbmZvID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJkxvbmdfSW5mb1R5cGUpOwotCWlmIChsb25nX2luZm8gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShsb25nX2luZm8sIGZpZWxkKyssCi0JCQkJICBQeUludF9Gcm9tTG9uZyhQeUxvbmdfU0hJRlQpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKGxvbmdfaW5mbywgZmllbGQrKywKLQkJCQkgIFB5SW50X0Zyb21Mb25nKHNpemVvZihkaWdpdCkpKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeV9DTEVBUihsb25nX2luZm8pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGxvbmdfaW5mbzsKKyAgICBQeU9iamVjdCogbG9uZ19pbmZvOworICAgIGludCBmaWVsZCA9IDA7CisgICAgbG9uZ19pbmZvID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJkxvbmdfSW5mb1R5cGUpOworICAgIGlmIChsb25nX2luZm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShsb25nX2luZm8sIGZpZWxkKyssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZyhQeUxvbmdfU0hJRlQpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKGxvbmdfaW5mbywgZmllbGQrKywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKHNpemVvZihkaWdpdCkpKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9DTEVBUihsb25nX2luZm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGxvbmdfaW5mbzsKIH0KIAogaW50CiBfUHlMb25nX0luaXQodm9pZCkKIHsKLQkvKiBpbml0aWFsaXplIGxvbmdfaW5mbyAqLwotCWlmIChMb25nX0luZm9UeXBlLnRwX25hbWUgPT0gMCkKLQkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmTG9uZ19JbmZvVHlwZSwgJmxvbmdfaW5mb19kZXNjKTsKLQlyZXR1cm4gMTsKKyAgICAvKiBpbml0aWFsaXplIGxvbmdfaW5mbyAqLworICAgIGlmIChMb25nX0luZm9UeXBlLnRwX25hbWUgPT0gMCkKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmTG9uZ19JbmZvVHlwZSwgJmxvbmdfaW5mb19kZXNjKTsKKyAgICByZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvbWV0aG9kb2JqZWN0LmMgYi9PYmplY3RzL21ldGhvZG9iamVjdC5jCmluZGV4IDY5ZDc3OTEuLjBiNjBjYTMgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbWV0aG9kb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9tZXRob2RvYmplY3QuYwpAQCAtMTYsMTEzICsxNiwxMTMgQEAKIFB5T2JqZWN0ICoKIFB5Q0Z1bmN0aW9uX05ld0V4KFB5TWV0aG9kRGVmICptbCwgUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICptb2R1bGUpCiB7Ci0JUHlDRnVuY3Rpb25PYmplY3QgKm9wOwotCW9wID0gZnJlZV9saXN0OwotCWlmIChvcCAhPSBOVUxMKSB7Ci0JCWZyZWVfbGlzdCA9IChQeUNGdW5jdGlvbk9iamVjdCAqKShvcC0+bV9zZWxmKTsKLQkJUHlPYmplY3RfSU5JVChvcCwgJlB5Q0Z1bmN0aW9uX1R5cGUpOwotCQludW1mcmVlLS07Ci0JfQotCWVsc2UgewotCQlvcCA9IFB5T2JqZWN0X0dDX05ldyhQeUNGdW5jdGlvbk9iamVjdCwgJlB5Q0Z1bmN0aW9uX1R5cGUpOwotCQlpZiAob3AgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlvcC0+bV9tbCA9IG1sOwotCVB5X1hJTkNSRUYoc2VsZik7Ci0Jb3AtPm1fc2VsZiA9IHNlbGY7Ci0JUHlfWElOQ1JFRihtb2R1bGUpOwotCW9wLT5tX21vZHVsZSA9IG1vZHVsZTsKLQlfUHlPYmplY3RfR0NfVFJBQ0sob3ApOwotCXJldHVybiAoUHlPYmplY3QgKilvcDsKKyAgICBQeUNGdW5jdGlvbk9iamVjdCAqb3A7CisgICAgb3AgPSBmcmVlX2xpc3Q7CisgICAgaWYgKG9wICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZV9saXN0ID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopKG9wLT5tX3NlbGYpOworICAgICAgICBQeU9iamVjdF9JTklUKG9wLCAmUHlDRnVuY3Rpb25fVHlwZSk7CisgICAgICAgIG51bWZyZWUtLTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG9wID0gUHlPYmplY3RfR0NfTmV3KFB5Q0Z1bmN0aW9uT2JqZWN0LCAmUHlDRnVuY3Rpb25fVHlwZSk7CisgICAgICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9wLT5tX21sID0gbWw7CisgICAgUHlfWElOQ1JFRihzZWxmKTsKKyAgICBvcC0+bV9zZWxmID0gc2VsZjsKKyAgICBQeV9YSU5DUkVGKG1vZHVsZSk7CisgICAgb3AtPm1fbW9kdWxlID0gbW9kdWxlOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9wOwogfQogCiBQeUNGdW5jdGlvbgogUHlDRnVuY3Rpb25fR2V0RnVuY3Rpb24oUHlPYmplY3QgKm9wKQogewotCWlmICghUHlDRnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlDRnVuY3Rpb25PYmplY3QgKilvcCkgLT4gbV9tbCAtPiBtbF9tZXRoOworICAgIGlmICghUHlDRnVuY3Rpb25fQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICgoUHlDRnVuY3Rpb25PYmplY3QgKilvcCkgLT4gbV9tbCAtPiBtbF9tZXRoOwogfQogCiBQeU9iamVjdCAqCiBQeUNGdW5jdGlvbl9HZXRTZWxmKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb3ApIC0+IG1fc2VsZjsKKyAgICBpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb3ApIC0+IG1fc2VsZjsKIH0KIAogaW50CiBQeUNGdW5jdGlvbl9HZXRGbGFncyhQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeUNGdW5jdGlvbl9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuICgoUHlDRnVuY3Rpb25PYmplY3QgKilvcCkgLT4gbV9tbCAtPiBtbF9mbGFnczsKKyAgICBpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gKChQeUNGdW5jdGlvbk9iamVjdCAqKW9wKSAtPiBtX21sIC0+IG1sX2ZsYWdzOwogfQogCiBQeU9iamVjdCAqCiBQeUNGdW5jdGlvbl9DYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlDRnVuY3Rpb25PYmplY3QqIGYgPSAoUHlDRnVuY3Rpb25PYmplY3QqKWZ1bmM7Ci0JUHlDRnVuY3Rpb24gbWV0aCA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihmdW5jKTsKLQlQeU9iamVjdCAqc2VsZiA9IFB5Q0Z1bmN0aW9uX0dFVF9TRUxGKGZ1bmMpOwotCVB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeUNGdW5jdGlvbk9iamVjdCogZiA9IChQeUNGdW5jdGlvbk9iamVjdCopZnVuYzsKKyAgICBQeUNGdW5jdGlvbiBtZXRoID0gUHlDRnVuY3Rpb25fR0VUX0ZVTkNUSU9OKGZ1bmMpOworICAgIFB5T2JqZWN0ICpzZWxmID0gUHlDRnVuY3Rpb25fR0VUX1NFTEYoZnVuYyk7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0Jc3dpdGNoIChQeUNGdW5jdGlvbl9HRVRfRkxBR1MoZnVuYykgJiB+KE1FVEhfQ0xBU1MgfCBNRVRIX1NUQVRJQyB8IE1FVEhfQ09FWElTVCkpIHsKLQljYXNlIE1FVEhfVkFSQVJHUzoKLQkJaWYgKGt3ID09IE5VTEwgfHwgUHlEaWN0X1NpemUoa3cpID09IDApCi0JCQlyZXR1cm4gKCptZXRoKShzZWxmLCBhcmcpOwotCQlicmVhazsKLQljYXNlIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFM6Ci0JY2FzZSBNRVRIX09MREFSR1MgfCBNRVRIX0tFWVdPUkRTOgotCQlyZXR1cm4gKCooUHlDRnVuY3Rpb25XaXRoS2V5d29yZHMpbWV0aCkoc2VsZiwgYXJnLCBrdyk7Ci0JY2FzZSBNRVRIX05PQVJHUzoKLQkJaWYgKGt3ID09IE5VTEwgfHwgUHlEaWN0X1NpemUoa3cpID09IDApIHsKLQkJCXNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZyk7Ci0JCQlpZiAoc2l6ZSA9PSAwKQotCQkJCXJldHVybiAoKm1ldGgpKHNlbGYsIE5VTEwpOwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAiJS4yMDBzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglemQgZ2l2ZW4pIiwKLQkJCSAgICBmLT5tX21sLT5tbF9uYW1lLCBzaXplKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgTUVUSF9POgotCQlpZiAoa3cgPT0gTlVMTCB8fCBQeURpY3RfU2l6ZShrdykgPT0gMCkgewotCQkJc2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoYXJnKTsKLQkJCWlmIChzaXplID09IDEpCi0JCQkJcmV0dXJuICgqbWV0aCkoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApKTsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgIiUuMjAwcygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICglemQgZ2l2ZW4pIiwKLQkJCSAgICBmLT5tX21sLT5tbF9uYW1lLCBzaXplKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgTUVUSF9PTERBUkdTOgotCQkvKiB0aGUgcmVhbGx5IG9sZCBzdHlsZSAqLwotCQlpZiAoa3cgPT0gTlVMTCB8fCBQeURpY3RfU2l6ZShrdykgPT0gMCkgewotCQkJc2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoYXJnKTsKLQkJCWlmIChzaXplID09IDEpCi0JCQkJYXJnID0gUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApOwotCQkJZWxzZSBpZiAoc2l6ZSA9PSAwKQotCQkJCWFyZyA9IE5VTEw7Ci0JCQlyZXR1cm4gKCptZXRoKShzZWxmLCBhcmcpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiUuMjAwcygpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzIiwKLQkJICAgICBmLT5tX21sLT5tbF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBzd2l0Y2ggKFB5Q0Z1bmN0aW9uX0dFVF9GTEFHUyhmdW5jKSAmIH4oTUVUSF9DTEFTUyB8IE1FVEhfU1RBVElDIHwgTUVUSF9DT0VYSVNUKSkgeworICAgIGNhc2UgTUVUSF9WQVJBUkdTOgorICAgICAgICBpZiAoa3cgPT0gTlVMTCB8fCBQeURpY3RfU2l6ZShrdykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAoKm1ldGgpKHNlbGYsIGFyZyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUzoKKyAgICBjYXNlIE1FVEhfT0xEQVJHUyB8IE1FVEhfS0VZV09SRFM6CisgICAgICAgIHJldHVybiAoKihQeUNGdW5jdGlvbldpdGhLZXl3b3JkcyltZXRoKShzZWxmLCBhcmcsIGt3KTsKKyAgICBjYXNlIE1FVEhfTk9BUkdTOgorICAgICAgICBpZiAoa3cgPT0gTlVMTCB8fCBQeURpY3RfU2l6ZShrdykgPT0gMCkgeworICAgICAgICAgICAgc2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoYXJnKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuICgqbWV0aCkoc2VsZiwgTlVMTCk7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBubyBhcmd1bWVudHMgKCV6ZCBnaXZlbikiLAorICAgICAgICAgICAgICAgIGYtPm1fbWwtPm1sX25hbWUsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRVRIX086CisgICAgICAgIGlmIChrdyA9PSBOVUxMIHx8IFB5RGljdF9TaXplKGt3KSA9PSAwKSB7CisgICAgICAgICAgICBzaXplID0gUHlUdXBsZV9HRVRfU0laRShhcmcpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKCptZXRoKShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKGFyZywgMCkpOworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKCV6ZCBnaXZlbikiLAorICAgICAgICAgICAgICAgIGYtPm1fbWwtPm1sX25hbWUsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRVRIX09MREFSR1M6CisgICAgICAgIC8qIHRoZSByZWFsbHkgb2xkIHN0eWxlICovCisgICAgICAgIGlmIChrdyA9PSBOVUxMIHx8IFB5RGljdF9TaXplKGt3KSA9PSAwKSB7CisgICAgICAgICAgICBzaXplID0gUHlUdXBsZV9HRVRfU0laRShhcmcpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICAgICAgICBhcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZywgMCk7CisgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDApCisgICAgICAgICAgICAgICAgYXJnID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAoKm1ldGgpKHNlbGYsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJS4yMDBzKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHMiLAorICAgICAgICAgICAgICAgICBmLT5tX21sLT5tbF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogTWV0aG9kcyAodGhlIHN0YW5kYXJkIGJ1aWx0LWluIG1ldGhvZHMsIHRoYXQgaXMpICovCkBAIC0xMzAsMTg3ICsxMzAsMTg3IEBACiBzdGF0aWMgdm9pZAogbWV0aF9kZWFsbG9jKFB5Q0Z1bmN0aW9uT2JqZWN0ICptKQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKG0pOwotCVB5X1hERUNSRUYobS0+bV9zZWxmKTsKLQlQeV9YREVDUkVGKG0tPm1fbW9kdWxlKTsKLQlpZiAobnVtZnJlZSA8IFB5Q0Z1bmN0aW9uX01BWEZSRUVMSVNUKSB7Ci0JCW0tPm1fc2VsZiA9IChQeU9iamVjdCAqKWZyZWVfbGlzdDsKLQkJZnJlZV9saXN0ID0gbTsKLQkJbnVtZnJlZSsrOwotCX0KLQllbHNlIHsKLQkJUHlPYmplY3RfR0NfRGVsKG0pOwotCX0KKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhtKTsKKyAgICBQeV9YREVDUkVGKG0tPm1fc2VsZik7CisgICAgUHlfWERFQ1JFRihtLT5tX21vZHVsZSk7CisgICAgaWYgKG51bWZyZWUgPCBQeUNGdW5jdGlvbl9NQVhGUkVFTElTVCkgeworICAgICAgICBtLT5tX3NlbGYgPSAoUHlPYmplY3QgKilmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IG07CisgICAgICAgIG51bWZyZWUrKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChtKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRoX2dldF9fZG9jX18oUHlDRnVuY3Rpb25PYmplY3QgKm0sIHZvaWQgKmNsb3N1cmUpCiB7Ci0JY29uc3QgY2hhciAqZG9jID0gbS0+bV9tbC0+bWxfZG9jOworICAgIGNvbnN0IGNoYXIgKmRvYyA9IG0tPm1fbWwtPm1sX2RvYzsKIAotCWlmIChkb2MgIT0gTlVMTCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGRvYyAhPSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ldGhfZ2V0X19uYW1lX18oUHlDRnVuY3Rpb25PYmplY3QgKm0sIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobS0+bV9tbC0+bWxfbmFtZSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobS0+bV9tbC0+bWxfbmFtZSk7CiB9CiAKIHN0YXRpYyBpbnQKIG1ldGhfdHJhdmVyc2UoUHlDRnVuY3Rpb25PYmplY3QgKm0sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKG0tPm1fc2VsZik7Ci0JUHlfVklTSVQobS0+bV9tb2R1bGUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKG0tPm1fc2VsZik7CisgICAgUHlfVklTSVQobS0+bV9tb2R1bGUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aF9nZXRfX3NlbGZfXyhQeUNGdW5jdGlvbk9iamVjdCAqbSwgdm9pZCAqY2xvc3VyZSkKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJIm1ldGhvZC5fX3NlbGZfXyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNlbGYgPSBtLT5tX3NlbGY7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJc2VsZiA9IFB5X05vbmU7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAibWV0aG9kLl9fc2VsZl9fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2VsZiA9IG0tPm1fc2VsZjsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICBzZWxmID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBtZXRoX2dldHNldHMgW10gPSB7Ci0JeyJfX2RvY19fIiwgIChnZXR0ZXIpbWV0aF9nZXRfX2RvY19fLCAgTlVMTCwgTlVMTH0sCi0JeyJfX25hbWVfXyIsIChnZXR0ZXIpbWV0aF9nZXRfX25hbWVfXywgTlVMTCwgTlVMTH0sCi0JeyJfX3NlbGZfXyIsIChnZXR0ZXIpbWV0aF9nZXRfX3NlbGZfXywgTlVMTCwgTlVMTH0sCi0JezB9CisgICAgeyJfX2RvY19fIiwgIChnZXR0ZXIpbWV0aF9nZXRfX2RvY19fLCAgTlVMTCwgTlVMTH0sCisgICAgeyJfX25hbWVfXyIsIChnZXR0ZXIpbWV0aF9nZXRfX25hbWVfXywgTlVMTCwgTlVMTH0sCisgICAgeyJfX3NlbGZfXyIsIChnZXR0ZXIpbWV0aF9nZXRfX3NlbGZfXywgTlVMTCwgTlVMTH0sCisgICAgezB9CiB9OwogCiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeUNGdW5jdGlvbk9iamVjdCwgeCkKIAogc3RhdGljIFB5TWVtYmVyRGVmIG1ldGhfbWVtYmVyc1tdID0gewotCXsiX19tb2R1bGVfXyIsICAgIFRfT0JKRUNULCAgICAgT0ZGKG1fbW9kdWxlKSwgUFlfV1JJVEVfUkVTVFJJQ1RFRH0sCi0Je05VTEx9CisgICAgeyJfX21vZHVsZV9fIiwgICAgVF9PQkpFQ1QsICAgICBPRkYobV9tb2R1bGUpLCBQWV9XUklURV9SRVNUUklDVEVEfSwKKyAgICB7TlVMTH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRoX3JlcHIoUHlDRnVuY3Rpb25PYmplY3QgKm0pCiB7Ci0JaWYgKG0tPm1fc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGJ1aWx0LWluIGZ1bmN0aW9uICVzPiIsCi0JCQkJCSAgIG0tPm1fbWwtPm1sX25hbWUpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8YnVpbHQtaW4gbWV0aG9kICVzIG9mICVzIG9iamVjdCBhdCAlcD4iLAotCQkJCSAgIG0tPm1fbWwtPm1sX25hbWUsCi0JCQkJICAgbS0+bV9zZWxmLT5vYl90eXBlLT50cF9uYW1lLAotCQkJCSAgIG0tPm1fc2VsZik7CisgICAgaWYgKG0tPm1fc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGJ1aWx0LWluIGZ1bmN0aW9uICVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1fbWwtPm1sX25hbWUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8YnVpbHQtaW4gbWV0aG9kICVzIG9mICVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1fbWwtPm1sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+bV9zZWxmLT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1fc2VsZik7CiB9CiAKIHN0YXRpYyBpbnQKIG1ldGhfY29tcGFyZShQeUNGdW5jdGlvbk9iamVjdCAqYSwgUHlDRnVuY3Rpb25PYmplY3QgKmIpCiB7Ci0JaWYgKGEtPm1fc2VsZiAhPSBiLT5tX3NlbGYpCi0JCXJldHVybiAoYS0+bV9zZWxmIDwgYi0+bV9zZWxmKSA/IC0xIDogMTsKLQlpZiAoYS0+bV9tbC0+bWxfbWV0aCA9PSBiLT5tX21sLT5tbF9tZXRoKQotCQlyZXR1cm4gMDsKLQlpZiAoc3RyY21wKGEtPm1fbWwtPm1sX25hbWUsIGItPm1fbWwtPm1sX25hbWUpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWVsc2UKLQkJcmV0dXJuIDE7CisgICAgaWYgKGEtPm1fc2VsZiAhPSBiLT5tX3NlbGYpCisgICAgICAgIHJldHVybiAoYS0+bV9zZWxmIDwgYi0+bV9zZWxmKSA/IC0xIDogMTsKKyAgICBpZiAoYS0+bV9tbC0+bWxfbWV0aCA9PSBiLT5tX21sLT5tbF9tZXRoKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc3RyY21wKGEtPm1fbWwtPm1sX25hbWUsIGItPm1fbWwtPm1sX25hbWUpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRoX3JpY2hjb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlQeUNGdW5jdGlvbk9iamVjdCAqYSwgKmI7Ci0JUHlPYmplY3QgKnJlczsKLQlpbnQgZXE7CisgICAgUHlDRnVuY3Rpb25PYmplY3QgKmEsICpiOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgaW50IGVxOwogCi0JaWYgKG9wICE9IFB5X0VRICYmIG9wICE9IFB5X05FKSB7Ci0JCS8qIFB5M0sgd2FybmluZyBpZiBjb21wYXJpc29uIGlzbid0ID09IG9yICE9LiAgKi8KLQkJaWYgKFB5RXJyX1dhcm5QeTNrKCJidWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZCBvcmRlciAiCi0JCQkJICAgImNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIGlmIChvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSkgeworICAgICAgICAvKiBQeTNLIHdhcm5pbmcgaWYgY29tcGFyaXNvbiBpc24ndCA9PSBvciAhPS4gICovCisgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygiYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2Qgb3JkZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JZWxzZSBpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKHNlbGYpIHx8ICFQeUNGdW5jdGlvbl9DaGVjayhvdGhlcikpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlhID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopc2VsZjsKLQliID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb3RoZXI7Ci0JZXEgPSBhLT5tX3NlbGYgPT0gYi0+bV9zZWxmOwotCWlmIChlcSkKLQkJZXEgPSBhLT5tX21sLT5tbF9tZXRoID09IGItPm1fbWwtPm1sX21ldGg7Ci0JaWYgKG9wID09IFB5X0VRKQotCQlyZXMgPSBlcSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQllbHNlCi0JCXJlcyA9IGVxID8gUHlfRmFsc2UgOiBQeV9UcnVlOwotCVB5X0lOQ1JFRihyZXMpOwotCXJldHVybiByZXM7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKHNlbGYpIHx8ICFQeUNGdW5jdGlvbl9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICBhID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopc2VsZjsKKyAgICBiID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb3RoZXI7CisgICAgZXEgPSBhLT5tX3NlbGYgPT0gYi0+bV9zZWxmOworICAgIGlmIChlcSkKKyAgICAgICAgZXEgPSBhLT5tX21sLT5tbF9tZXRoID09IGItPm1fbWwtPm1sX21ldGg7CisgICAgaWYgKG9wID09IFB5X0VRKQorICAgICAgICByZXMgPSBlcSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IGVxID8gUHlfRmFsc2UgOiBQeV9UcnVlOworICAgIFB5X0lOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBsb25nCiBtZXRoX2hhc2goUHlDRnVuY3Rpb25PYmplY3QgKmEpCiB7Ci0JbG9uZyB4LHk7Ci0JaWYgKGEtPm1fc2VsZiA9PSBOVUxMKQotCQl4ID0gMDsKLQllbHNlIHsKLQkJeCA9IFB5T2JqZWN0X0hhc2goYS0+bV9zZWxmKTsKLQkJaWYgKHggPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXkgPSBfUHlfSGFzaFBvaW50ZXIoKHZvaWQqKShhLT5tX21sLT5tbF9tZXRoKSk7Ci0JaWYgKHkgPT0gLTEpCi0JCXJldHVybiAtMTsKLQl4IF49IHk7Ci0JaWYgKHggPT0gLTEpCi0JCXggPSAtMjsKLQlyZXR1cm4geDsKKyAgICBsb25nIHgseTsKKyAgICBpZiAoYS0+bV9zZWxmID09IE5VTEwpCisgICAgICAgIHggPSAwOworICAgIGVsc2UgeworICAgICAgICB4ID0gUHlPYmplY3RfSGFzaChhLT5tX3NlbGYpOworICAgICAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeSA9IF9QeV9IYXNoUG9pbnRlcigodm9pZCopKGEtPm1fbWwtPm1sX21ldGgpKTsKKyAgICBpZiAoeSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHggXj0geTsKKyAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgeCA9IC0yOworICAgIHJldHVybiB4OwogfQogCiAKIFB5VHlwZU9iamVjdCBQeUNGdW5jdGlvbl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImJ1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kIiwKLQlzaXplb2YoUHlDRnVuY3Rpb25PYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpbWV0aF9kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpbWV0aF9jb21wYXJlLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpbWV0aF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpbWV0aF9oYXNoLAkJCS8qIHRwX2hhc2ggKi8KLQlQeUNGdW5jdGlvbl9DYWxsLAkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKW1ldGhfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCW1ldGhfcmljaGNvbXBhcmUsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQltZXRoX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQltZXRoX2dldHNldHMsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJidWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZCIsCisgICAgc2l6ZW9mKFB5Q0Z1bmN0aW9uT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKW1ldGhfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYyltZXRoX2NvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpbWV0aF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpbWV0aF9oYXNoLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICBQeUNGdW5jdGlvbl9DYWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbWV0aF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgbWV0aF9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIG1ldGhfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIG1ldGhfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCiB9OwogCiAvKiBMaXN0IGFsbCBtZXRob2RzIGluIGEgY2hhaW4gLS0gaGVscGVyIGZvciBmaW5kbWV0aG9kaW5jaGFpbiAqLwpAQCAtMzE4LDMyICszMTgsMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0bWV0aG9kY2hhaW4oUHlNZXRob2RDaGFpbiAqY2hhaW4pCiB7Ci0JUHlNZXRob2RDaGFpbiAqYzsKLQlQeU1ldGhvZERlZiAqbWw7Ci0JaW50IGksIG47Ci0JUHlPYmplY3QgKnY7CisgICAgUHlNZXRob2RDaGFpbiAqYzsKKyAgICBQeU1ldGhvZERlZiAqbWw7CisgICAgaW50IGksIG47CisgICAgUHlPYmplY3QgKnY7CiAKLQluID0gMDsKLQlmb3IgKGMgPSBjaGFpbjsgYyAhPSBOVUxMOyBjID0gYy0+bGluaykgewotCQlmb3IgKG1sID0gYy0+bWV0aG9kczsgbWwtPm1sX25hbWUgIT0gTlVMTDsgbWwrKykKLQkJCW4rKzsKLQl9Ci0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaSA9IDA7Ci0JZm9yIChjID0gY2hhaW47IGMgIT0gTlVMTDsgYyA9IGMtPmxpbmspIHsKLQkJZm9yIChtbCA9IGMtPm1ldGhvZHM7IG1sLT5tbF9uYW1lICE9IE5VTEw7IG1sKyspIHsKLQkJCVB5TGlzdF9TZXRJdGVtKHYsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcobWwtPm1sX25hbWUpKTsKLQkJCWkrKzsKLQkJfQotCX0KLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeUxpc3RfU29ydCh2KTsKLQlyZXR1cm4gdjsKKyAgICBuID0gMDsKKyAgICBmb3IgKGMgPSBjaGFpbjsgYyAhPSBOVUxMOyBjID0gYy0+bGluaykgeworICAgICAgICBmb3IgKG1sID0gYy0+bWV0aG9kczsgbWwtPm1sX25hbWUgIT0gTlVMTDsgbWwrKykKKyAgICAgICAgICAgIG4rKzsKKyAgICB9CisgICAgdiA9IFB5TGlzdF9OZXcobik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaSA9IDA7CisgICAgZm9yIChjID0gY2hhaW47IGMgIT0gTlVMTDsgYyA9IGMtPmxpbmspIHsKKyAgICAgICAgZm9yIChtbCA9IGMtPm1ldGhvZHM7IG1sLT5tbF9uYW1lICE9IE5VTEw7IG1sKyspIHsKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKHYsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcobWwtPm1sX25hbWUpKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUxpc3RfU29ydCh2KTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyogRmluZCBhIG1ldGhvZCBpbiBhIG1ldGhvZCBjaGFpbiAqLwpAQCAtMzUxLDMxICszNTEsMzEgQEAKIFB5T2JqZWN0ICoKIFB5X0ZpbmRNZXRob2RJbkNoYWluKFB5TWV0aG9kQ2hhaW4gKmNoYWluLCBQeU9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnXycpIHsKLQkJaWYgKHN0cmNtcChuYW1lLCAiX19tZXRob2RzX18iKSA9PSAwKSB7Ci0JCQlpZiAoUHlFcnJfV2FyblB5M2soIl9fbWV0aG9kc19fIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwKLQkJCQkJICAgMSkgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJcmV0dXJuIGxpc3RtZXRob2RjaGFpbihjaGFpbik7Ci0JCX0KLQkJaWYgKHN0cmNtcChuYW1lLCAiX19kb2NfXyIpID09IDApIHsKLQkJCWNvbnN0IGNoYXIgKmRvYyA9IHNlbGYtPm9iX3R5cGUtPnRwX2RvYzsKLQkJCWlmIChkb2MgIT0gTlVMTCkKLQkJCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2MpOwotCQl9Ci0JfQotCXdoaWxlIChjaGFpbiAhPSBOVUxMKSB7Ci0JCVB5TWV0aG9kRGVmICptbCA9IGNoYWluLT5tZXRob2RzOwotCQlmb3IgKDsgbWwtPm1sX25hbWUgIT0gTlVMTDsgbWwrKykgewotCQkJaWYgKG5hbWVbMF0gPT0gbWwtPm1sX25hbWVbMF0gJiYKLQkJCSAgICBzdHJjbXAobmFtZSsxLCBtbC0+bWxfbmFtZSsxKSA9PSAwKQotCQkJCS8qIFhYWCAqLwotCQkJCXJldHVybiBQeUNGdW5jdGlvbl9OZXcobWwsIHNlbGYpOwotCQl9Ci0JCWNoYWluID0gY2hhaW4tPmxpbms7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gPT0gJ18nKSB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgIl9fbWV0aG9kc19fIikgPT0gMCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJfX21ldGhvZHNfXyBub3Qgc3VwcG9ydGVkIGluIDMueCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIGxpc3RtZXRob2RjaGFpbihjaGFpbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAiX19kb2NfXyIpID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRvYyA9IHNlbGYtPm9iX3R5cGUtPnRwX2RvYzsKKyAgICAgICAgICAgIGlmIChkb2MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2MpOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlIChjaGFpbiAhPSBOVUxMKSB7CisgICAgICAgIFB5TWV0aG9kRGVmICptbCA9IGNoYWluLT5tZXRob2RzOworICAgICAgICBmb3IgKDsgbWwtPm1sX25hbWUgIT0gTlVMTDsgbWwrKykgeworICAgICAgICAgICAgaWYgKG5hbWVbMF0gPT0gbWwtPm1sX25hbWVbMF0gJiYKKyAgICAgICAgICAgICAgICBzdHJjbXAobmFtZSsxLCBtbC0+bWxfbmFtZSsxKSA9PSAwKQorICAgICAgICAgICAgICAgIC8qIFhYWCAqLworICAgICAgICAgICAgICAgIHJldHVybiBQeUNGdW5jdGlvbl9OZXcobWwsIHNlbGYpOworICAgICAgICB9CisgICAgICAgIGNoYWluID0gY2hhaW4tPmxpbms7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIEZpbmQgYSBtZXRob2QgaW4gYSBzaW5nbGUgbWV0aG9kIGxpc3QgKi8KQEAgLTM4MywxMCArMzgzLDEwIEBACiBQeU9iamVjdCAqCiBQeV9GaW5kTWV0aG9kKFB5TWV0aG9kRGVmICptZXRob2RzLCBQeU9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlQeU1ldGhvZENoYWluIGNoYWluOwotCWNoYWluLm1ldGhvZHMgPSBtZXRob2RzOwotCWNoYWluLmxpbmsgPSBOVUxMOwotCXJldHVybiBQeV9GaW5kTWV0aG9kSW5DaGFpbigmY2hhaW4sIHNlbGYsIG5hbWUpOworICAgIFB5TWV0aG9kQ2hhaW4gY2hhaW47CisgICAgY2hhaW4ubWV0aG9kcyA9IG1ldGhvZHM7CisgICAgY2hhaW4ubGluayA9IE5VTEw7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2RJbkNoYWluKCZjaGFpbiwgc2VsZiwgbmFtZSk7CiB9CiAKIC8qIENsZWFyIG91dCB0aGUgZnJlZSBsaXN0ICovCkBAIC0zOTQsMjIgKzM5NCwyMiBAQAogaW50CiBQeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0KHZvaWQpCiB7Ci0JaW50IGZyZWVsaXN0X3NpemUgPSBudW1mcmVlOwotCQotCXdoaWxlIChmcmVlX2xpc3QpIHsKLQkJUHlDRnVuY3Rpb25PYmplY3QgKnYgPSBmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IChQeUNGdW5jdGlvbk9iamVjdCAqKSh2LT5tX3NlbGYpOwotCQlQeU9iamVjdF9HQ19EZWwodik7Ci0JCW51bWZyZWUtLTsKLQl9Ci0JYXNzZXJ0KG51bWZyZWUgPT0gMCk7Ci0JcmV0dXJuIGZyZWVsaXN0X3NpemU7CisgICAgaW50IGZyZWVsaXN0X3NpemUgPSBudW1mcmVlOworCisgICAgd2hpbGUgKGZyZWVfbGlzdCkgeworICAgICAgICBQeUNGdW5jdGlvbk9iamVjdCAqdiA9IGZyZWVfbGlzdDsKKyAgICAgICAgZnJlZV9saXN0ID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopKHYtPm1fc2VsZik7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbCh2KTsKKyAgICAgICAgbnVtZnJlZS0tOworICAgIH0KKyAgICBhc3NlcnQobnVtZnJlZSA9PSAwKTsKKyAgICByZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKIH0KIAogdm9pZAogUHlDRnVuY3Rpb25fRmluaSh2b2lkKQogewotCSh2b2lkKVB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3QoKTsKKyAgICAodm9pZClQeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0KCk7CiB9CiAKIC8qIFB5Q0Z1bmN0aW9uX05ldygpIGlzIG5vdyBqdXN0IGEgbWFjcm8gdGhhdCBjYWxscyBQeUNGdW5jdGlvbl9OZXdFeCgpLApAQCAtNDIzLDUgKzQyMyw1IEBACiBQeU9iamVjdCAqCiBQeUNGdW5jdGlvbl9OZXcoUHlNZXRob2REZWYgKm1sLCBQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlDRnVuY3Rpb25fTmV3RXgobWwsIHNlbGYsIE5VTEwpOworICAgIHJldHVybiBQeUNGdW5jdGlvbl9OZXdFeChtbCwgc2VsZiwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL21vZHVsZW9iamVjdC5jIGIvT2JqZWN0cy9tb2R1bGVvYmplY3QuYwppbmRleCBjOWYwMGU5Li5jZWQxNmViIDEwMDY0NAotLS0gYS9PYmplY3RzL21vZHVsZW9iamVjdC5jCisrKyBiL09iamVjdHMvbW9kdWxlb2JqZWN0LmMKQEAgLTUsMTQ0ICs1LDE0NCBAQAogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICptZF9kaWN0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqbWRfZGljdDsKIH0gUHlNb2R1bGVPYmplY3Q7CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBtb2R1bGVfbWVtYmVyc1tdID0gewotCXsiX19kaWN0X18iLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlNb2R1bGVPYmplY3QsIG1kX2RpY3QpLCBSRUFET05MWX0sCi0JezB9CisgICAgeyJfX2RpY3RfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeU1vZHVsZU9iamVjdCwgbWRfZGljdCksIFJFQURPTkxZfSwKKyAgICB7MH0KIH07CiAKIFB5T2JqZWN0ICoKIFB5TW9kdWxlX05ldyhjb25zdCBjaGFyICpuYW1lKQogewotCVB5TW9kdWxlT2JqZWN0ICptOwotCVB5T2JqZWN0ICpuYW1lb2JqOwotCW0gPSBQeU9iamVjdF9HQ19OZXcoUHlNb2R1bGVPYmplY3QsICZQeU1vZHVsZV9UeXBlKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKLQltLT5tZF9kaWN0ID0gUHlEaWN0X05ldygpOwotCWlmIChtLT5tZF9kaWN0ID09IE5VTEwgfHwgbmFtZW9iaiA9PSBOVUxMKQotCQlnb3RvIGZhaWw7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG0tPm1kX2RpY3QsICJfX25hbWVfXyIsIG5hbWVvYmopICE9IDApCi0JCWdvdG8gZmFpbDsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobS0+bWRfZGljdCwgIl9fZG9jX18iLCBQeV9Ob25lKSAhPSAwKQotCQlnb3RvIGZhaWw7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG0tPm1kX2RpY3QsICJfX3BhY2thZ2VfXyIsIFB5X05vbmUpICE9IDApCi0JCWdvdG8gZmFpbDsKLQlQeV9ERUNSRUYobmFtZW9iaik7Ci0JUHlPYmplY3RfR0NfVHJhY2sobSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW07CisgICAgUHlNb2R1bGVPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm5hbWVvYmo7CisgICAgbSA9IFB5T2JqZWN0X0dDX05ldyhQeU1vZHVsZU9iamVjdCwgJlB5TW9kdWxlX1R5cGUpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5hbWVvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworICAgIG0tPm1kX2RpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKG0tPm1kX2RpY3QgPT0gTlVMTCB8fCBuYW1lb2JqID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobS0+bWRfZGljdCwgIl9fbmFtZV9fIiwgbmFtZW9iaikgIT0gMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtLT5tZF9kaWN0LCAiX19kb2NfXyIsIFB5X05vbmUpICE9IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobS0+bWRfZGljdCwgIl9fcGFja2FnZV9fIiwgUHlfTm9uZSkgIT0gMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIFB5X0RFQ1JFRihuYW1lb2JqKTsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhtKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbTsKIAogIGZhaWw6Ci0JUHlfWERFQ1JFRihuYW1lb2JqKTsKLQlQeV9ERUNSRUYobSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihuYW1lb2JqKTsKKyAgICBQeV9ERUNSRUYobSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TW9kdWxlX0dldERpY3QoUHlPYmplY3QgKm0pCiB7Ci0JUHlPYmplY3QgKmQ7Ci0JaWYgKCFQeU1vZHVsZV9DaGVjayhtKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWQgPSAoKFB5TW9kdWxlT2JqZWN0ICopbSkgLT4gbWRfZGljdDsKLQlpZiAoZCA9PSBOVUxMKQotCQkoKFB5TW9kdWxlT2JqZWN0ICopbSkgLT4gbWRfZGljdCA9IGQgPSBQeURpY3RfTmV3KCk7Ci0JcmV0dXJuIGQ7CisgICAgUHlPYmplY3QgKmQ7CisgICAgaWYgKCFQeU1vZHVsZV9DaGVjayhtKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGQgPSAoKFB5TW9kdWxlT2JqZWN0ICopbSkgLT4gbWRfZGljdDsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICAoKFB5TW9kdWxlT2JqZWN0ICopbSkgLT4gbWRfZGljdCA9IGQgPSBQeURpY3RfTmV3KCk7CisgICAgcmV0dXJuIGQ7CiB9CiAKIGNoYXIgKgogUHlNb2R1bGVfR2V0TmFtZShQeU9iamVjdCAqbSkKIHsKLQlQeU9iamVjdCAqZDsKLQlQeU9iamVjdCAqbmFtZW9iajsKLQlpZiAoIVB5TW9kdWxlX0NoZWNrKG0pKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkID0gKChQeU1vZHVsZU9iamVjdCAqKW0pLT5tZF9kaWN0OwotCWlmIChkID09IE5VTEwgfHwKLQkgICAgKG5hbWVvYmogPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiX19uYW1lX18iKSkgPT0gTlVMTCB8fAotCSAgICAhUHlTdHJpbmdfQ2hlY2sobmFtZW9iaikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJuYW1lbGVzcyBtb2R1bGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZyhuYW1lb2JqKTsKKyAgICBQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbmFtZW9iajsKKyAgICBpZiAoIVB5TW9kdWxlX0NoZWNrKG0pKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkID0gKChQeU1vZHVsZU9iamVjdCAqKW0pLT5tZF9kaWN0OworICAgIGlmIChkID09IE5VTEwgfHwKKyAgICAgICAgKG5hbWVvYmogPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiX19uYW1lX18iKSkgPT0gTlVMTCB8fAorICAgICAgICAhUHlTdHJpbmdfQ2hlY2sobmFtZW9iaikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJuYW1lbGVzcyBtb2R1bGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Bc1N0cmluZyhuYW1lb2JqKTsKIH0KIAogY2hhciAqCiBQeU1vZHVsZV9HZXRGaWxlbmFtZShQeU9iamVjdCAqbSkKIHsKLQlQeU9iamVjdCAqZDsKLQlQeU9iamVjdCAqZmlsZW9iajsKLQlpZiAoIVB5TW9kdWxlX0NoZWNrKG0pKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkID0gKChQeU1vZHVsZU9iamVjdCAqKW0pLT5tZF9kaWN0OwotCWlmIChkID09IE5VTEwgfHwKLQkgICAgKGZpbGVvYmogPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiX19maWxlX18iKSkgPT0gTlVMTCB8fAotCSAgICAhUHlTdHJpbmdfQ2hlY2soZmlsZW9iaikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJtb2R1bGUgZmlsZW5hbWUgbWlzc2luZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKGZpbGVvYmopOworICAgIFB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpmaWxlb2JqOworICAgIGlmICghUHlNb2R1bGVfQ2hlY2sobSkpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGQgPSAoKFB5TW9kdWxlT2JqZWN0ICopbSktPm1kX2RpY3Q7CisgICAgaWYgKGQgPT0gTlVMTCB8fAorICAgICAgICAoZmlsZW9iaiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIpKSA9PSBOVUxMIHx8CisgICAgICAgICFQeVN0cmluZ19DaGVjayhmaWxlb2JqKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIm1vZHVsZSBmaWxlbmFtZSBtaXNzaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoZmlsZW9iaik7CiB9CiAKIHZvaWQKIF9QeU1vZHVsZV9DbGVhcihQeU9iamVjdCAqbSkKIHsKLQkvKiBUbyBtYWtlIHRoZSBleGVjdXRpb24gb3JkZXIgb2YgZGVzdHJ1Y3RvcnMgZm9yIGdsb2JhbAotCSAgIG9iamVjdHMgYSBiaXQgbW9yZSBwcmVkaWN0YWJsZSwgd2UgZmlyc3QgemFwIGFsbCBvYmplY3RzCi0JICAgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBhIHNpbmdsZSB1bmRlcnNjb3JlLCBiZWZvcmUgd2UgY2xlYXIKLQkgICB0aGUgZW50aXJlIGRpY3Rpb25hcnkuICBXZSB6YXAgdGhlbSBieSByZXBsYWNpbmcgdGhlbSB3aXRoCi0JICAgTm9uZSwgcmF0aGVyIHRoYW4gZGVsZXRpbmcgdGhlbSBmcm9tIHRoZSBkaWN0aW9uYXJ5LCB0bwotCSAgIGF2b2lkIHJlaGFzaGluZyB0aGUgZGljdGlvbmFyeSAodG8gc29tZSBleHRlbnQpLiAqLworICAgIC8qIFRvIG1ha2UgdGhlIGV4ZWN1dGlvbiBvcmRlciBvZiBkZXN0cnVjdG9ycyBmb3IgZ2xvYmFsCisgICAgICAgb2JqZWN0cyBhIGJpdCBtb3JlIHByZWRpY3RhYmxlLCB3ZSBmaXJzdCB6YXAgYWxsIG9iamVjdHMKKyAgICAgICB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGEgc2luZ2xlIHVuZGVyc2NvcmUsIGJlZm9yZSB3ZSBjbGVhcgorICAgICAgIHRoZSBlbnRpcmUgZGljdGlvbmFyeS4gIFdlIHphcCB0aGVtIGJ5IHJlcGxhY2luZyB0aGVtIHdpdGgKKyAgICAgICBOb25lLCByYXRoZXIgdGhhbiBkZWxldGluZyB0aGVtIGZyb20gdGhlIGRpY3Rpb25hcnksIHRvCisgICAgICAgYXZvaWQgcmVoYXNoaW5nIHRoZSBkaWN0aW9uYXJ5ICh0byBzb21lIGV4dGVudCkuICovCiAKLQlQeV9zc2l6ZV90IHBvczsKLQlQeU9iamVjdCAqa2V5LCAqdmFsdWU7Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlfc3NpemVfdCBwb3M7CisgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgIFB5T2JqZWN0ICpkOwogCi0JZCA9ICgoUHlNb2R1bGVPYmplY3QgKiltKS0+bWRfZGljdDsKLQlpZiAoZCA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgZCA9ICgoUHlNb2R1bGVPYmplY3QgKiltKS0+bWRfZGljdDsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBGaXJzdCwgY2xlYXIgb25seSBuYW1lcyBzdGFydGluZyB3aXRoIGEgc2luZ2xlIHVuZGVyc2NvcmUgKi8KLQlwb3MgPSAwOwotCXdoaWxlIChQeURpY3RfTmV4dChkLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCWlmICh2YWx1ZSAhPSBQeV9Ob25lICYmIFB5U3RyaW5nX0NoZWNrKGtleSkpIHsKLQkJCWNoYXIgKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOwotCQkJaWYgKHNbMF0gPT0gJ18nICYmIHNbMV0gIT0gJ18nKSB7Ci0JCQkJaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkKLQkJCQkgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgICBjbGVhclsxXSAlc1xuIiwgcyk7Ci0JCQkJUHlEaWN0X1NldEl0ZW0oZCwga2V5LCBQeV9Ob25lKTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBGaXJzdCwgY2xlYXIgb25seSBuYW1lcyBzdGFydGluZyB3aXRoIGEgc2luZ2xlIHVuZGVyc2NvcmUgKi8KKyAgICBwb3MgPSAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChkLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBQeV9Ob25lICYmIFB5U3RyaW5nX0NoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIGNoYXIgKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOworICAgICAgICAgICAgaWYgKHNbMF0gPT0gJ18nICYmIHNbMV0gIT0gJ18nKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkKKyAgICAgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgICBjbGVhclsxXSAlc1xuIiwgcyk7CisgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW0oZCwga2V5LCBQeV9Ob25lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qIE5leHQsIGNsZWFyIGFsbCBuYW1lcyBleGNlcHQgZm9yIF9fYnVpbHRpbnNfXyAqLwotCXBvcyA9IDA7Ci0Jd2hpbGUgKFB5RGljdF9OZXh0KGQsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKLQkJaWYgKHZhbHVlICE9IFB5X05vbmUgJiYgUHlTdHJpbmdfQ2hlY2soa2V5KSkgewotCQkJY2hhciAqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKGtleSk7Ci0JCQlpZiAoc1swXSAhPSAnXycgfHwgc3RyY21wKHMsICJfX2J1aWx0aW5zX18iKSAhPSAwKSB7Ci0JCQkJaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkKLQkJCQkgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgICBjbGVhclsyXSAlc1xuIiwgcyk7Ci0JCQkJUHlEaWN0X1NldEl0ZW0oZCwga2V5LCBQeV9Ob25lKTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBOZXh0LCBjbGVhciBhbGwgbmFtZXMgZXhjZXB0IGZvciBfX2J1aWx0aW5zX18gKi8KKyAgICBwb3MgPSAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChkLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBQeV9Ob25lICYmIFB5U3RyaW5nX0NoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIGNoYXIgKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOworICAgICAgICAgICAgaWYgKHNbMF0gIT0gJ18nIHx8IHN0cmNtcChzLCAiX19idWlsdGluc19fIikgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZyA+IDEpCisgICAgICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICAgY2xlYXJbMl0gJXNcbiIsIHMpOworICAgICAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtKGQsIGtleSwgUHlfTm9uZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBOb3RlOiB3ZSBsZWF2ZSBfX2J1aWx0aW5zX18gaW4gcGxhY2UsIHNvIHRoYXQgZGVzdHJ1Y3RvcnMKLQkgICBvZiBub24tZ2xvYmFsIG9iamVjdHMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSBjYW4gc3RpbGwgdXNlCi0JICAgYnVpbHRpbnMsIGluIHBhcnRpY3VsYXJseSAnTm9uZScuICovCisgICAgLyogTm90ZTogd2UgbGVhdmUgX19idWlsdGluc19fIGluIHBsYWNlLCBzbyB0aGF0IGRlc3RydWN0b3JzCisgICAgICAgb2Ygbm9uLWdsb2JhbCBvYmplY3RzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgY2FuIHN0aWxsIHVzZQorICAgICAgIGJ1aWx0aW5zLCBpbiBwYXJ0aWN1bGFybHkgJ05vbmUnLiAqLwogCiB9CiAKQEAgLTE1MSw1NiArMTUxLDU2IEBACiBzdGF0aWMgaW50CiBtb2R1bGVfaW5pdChQeU1vZHVsZU9iamVjdCAqbSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJkb2MiLCBOVUxMfTsKLQlQeU9iamVjdCAqZGljdCwgKm5hbWUgPSBQeV9Ob25lLCAqZG9jID0gUHlfTm9uZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiU3xPOm1vZHVsZS5fX2luaXRfXyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm5hbWUsICZkb2MpKQotCQlyZXR1cm4gLTE7Ci0JZGljdCA9IG0tPm1kX2RpY3Q7Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlkaWN0ID0gUHlEaWN0X05ldygpOwotCQlpZiAoZGljdCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQltLT5tZF9kaWN0ID0gZGljdDsKLQl9Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX25hbWVfXyIsIG5hbWUpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19kb2NfXyIsIGRvYykgPCAwKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJuYW1lIiwgImRvYyIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpkaWN0LCAqbmFtZSA9IFB5X05vbmUsICpkb2MgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJTfE86bW9kdWxlLl9faW5pdF9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZuYW1lLCAmZG9jKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGRpY3QgPSBtLT5tZF9kaWN0OworICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbS0+bWRfZGljdCA9IGRpY3Q7CisgICAgfQorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19uYW1lX18iLCBuYW1lKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iLCBkb2MpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogbW9kdWxlX2RlYWxsb2MoUHlNb2R1bGVPYmplY3QgKm0pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhtKTsKLQlpZiAobS0+bWRfZGljdCAhPSBOVUxMKSB7Ci0JCS8qIElmIHdlIGFyZSB0aGUgb25seSBvbmVzIGhvbGRpbmcgYSByZWZlcmVuY2UsIHdlIGNhbiBjbGVhcgotCQkgICB0aGUgZGljdGlvbmFyeS4gKi8KLQkJaWYgKFB5X1JFRkNOVChtLT5tZF9kaWN0KSA9PSAxKQotCQkJX1B5TW9kdWxlX0NsZWFyKChQeU9iamVjdCAqKW0pOwotCQlQeV9ERUNSRUYobS0+bWRfZGljdCk7Ci0JfQotCVB5X1RZUEUobSktPnRwX2ZyZWUoKFB5T2JqZWN0ICopbSk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhtKTsKKyAgICBpZiAobS0+bWRfZGljdCAhPSBOVUxMKSB7CisgICAgICAgIC8qIElmIHdlIGFyZSB0aGUgb25seSBvbmVzIGhvbGRpbmcgYSByZWZlcmVuY2UsIHdlIGNhbiBjbGVhcgorICAgICAgICAgICB0aGUgZGljdGlvbmFyeS4gKi8KKyAgICAgICAgaWYgKFB5X1JFRkNOVChtLT5tZF9kaWN0KSA9PSAxKQorICAgICAgICAgICAgX1B5TW9kdWxlX0NsZWFyKChQeU9iamVjdCAqKW0pOworICAgICAgICBQeV9ERUNSRUYobS0+bWRfZGljdCk7CisgICAgfQorICAgIFB5X1RZUEUobSktPnRwX2ZyZWUoKFB5T2JqZWN0ICopbSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtb2R1bGVfcmVwcihQeU1vZHVsZU9iamVjdCAqbSkKIHsKLQljaGFyICpuYW1lOwotCWNoYXIgKmZpbGVuYW1lOworICAgIGNoYXIgKm5hbWU7CisgICAgY2hhciAqZmlsZW5hbWU7CiAKLQluYW1lID0gUHlNb2R1bGVfR2V0TmFtZSgoUHlPYmplY3QgKiltKTsKLQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCW5hbWUgPSAiPyI7Ci0JfQotCWZpbGVuYW1lID0gUHlNb2R1bGVfR2V0RmlsZW5hbWUoKFB5T2JqZWN0ICopbSk7Ci0JaWYgKGZpbGVuYW1lID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxtb2R1bGUgJyVzJyAoYnVpbHQtaW4pPiIsIG5hbWUpOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPG1vZHVsZSAnJXMnIGZyb20gJyVzJz4iLCBuYW1lLCBmaWxlbmFtZSk7CisgICAgbmFtZSA9IFB5TW9kdWxlX0dldE5hbWUoKFB5T2JqZWN0ICopbSk7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBuYW1lID0gIj8iOworICAgIH0KKyAgICBmaWxlbmFtZSA9IFB5TW9kdWxlX0dldEZpbGVuYW1lKChQeU9iamVjdCAqKW0pOworICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8bW9kdWxlICclcycgKGJ1aWx0LWluKT4iLCBuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxtb2R1bGUgJyVzJyBmcm9tICclcyc+IiwgbmFtZSwgZmlsZW5hbWUpOwogfQogCiAvKiBXZSBvbmx5IG5lZWQgYSB0cmF2ZXJzZSBmdW5jdGlvbiwgbm8gY2xlYXIgZnVuY3Rpb246IElmIHRoZSBtb2R1bGUKQEAgLTIwOSw4ICsyMDksOCBAQAogc3RhdGljIGludAogbW9kdWxlX3RyYXZlcnNlKFB5TW9kdWxlT2JqZWN0ICptLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChtLT5tZF9kaWN0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChtLT5tZF9kaWN0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCkBAIC0yMjAsNDQgKzIyMCw0NCBAQAogVGhlIG5hbWUgbXVzdCBiZSBhIHN0cmluZzsgdGhlIG9wdGlvbmFsIGRvYyBhcmd1bWVudCBjYW4gaGF2ZSBhbnkgdHlwZS4iKTsKIAogUHlUeXBlT2JqZWN0IFB5TW9kdWxlX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkibW9kdWxlIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeU1vZHVsZU9iamVjdCksCQkJLyogdHBfc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKW1vZHVsZV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyltb2R1bGVfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkJLyogdHBfZmxhZ3MgKi8KLQltb2R1bGVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKW1vZHVsZV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCW1vZHVsZV9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCW9mZnNldG9mKFB5TW9kdWxlT2JqZWN0LCBtZF9kaWN0KSwJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYyltb2R1bGVfaW5pdCwJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCVB5VHlwZV9HZW5lcmljTmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCSAgICAgICAgLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgIm1vZHVsZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5TW9kdWxlT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIChkZXN0cnVjdG9yKW1vZHVsZV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpbW9kdWxlX3JlcHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBtb2R1bGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbW9kdWxlX3RyYXZlcnNlLCAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgbW9kdWxlX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgb2Zmc2V0b2YoUHlNb2R1bGVPYmplY3QsIG1kX2RpY3QpLCAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKW1vZHVsZV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9vYmplY3QuYyBiL09iamVjdHMvb2JqZWN0LmMKaW5kZXggY2Y4YTU1MC4uZTQyNTJjNSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9vYmplY3QuYworKysgYi9PYmplY3RzL29iamVjdC5jCkBAIC0xNCwxOCArMTQsMTggQEAKIFB5X3NzaXplX3QKIF9QeV9HZXRSZWZUb3RhbCh2b2lkKQogewotCVB5T2JqZWN0ICpvOwotCVB5X3NzaXplX3QgdG90YWwgPSBfUHlfUmVmVG90YWw7Ci0gICAgICAgIC8qIGlnbm9yZSB0aGUgcmVmZXJlbmNlcyB0byB0aGUgZHVtbXkgb2JqZWN0IG9mIHRoZSBkaWN0cyBhbmQgc2V0cwotICAgICAgICAgICBiZWNhdXNlIHRoZXkgYXJlIG5vdCByZWxpYWJsZSBhbmQgbm90IHVzZWZ1bCAobm93IHRoYXQgdGhlCi0gICAgICAgICAgIGhhc2ggdGFibGUgY29kZSBpcyB3ZWxsLXRlc3RlZCkgKi8KLQlvID0gX1B5RGljdF9EdW1teSgpOwotCWlmIChvICE9IE5VTEwpCi0JCXRvdGFsIC09IG8tPm9iX3JlZmNudDsKLQlvID0gX1B5U2V0X0R1bW15KCk7Ci0JaWYgKG8gIT0gTlVMTCkKLQkJdG90YWwgLT0gby0+b2JfcmVmY250OwotCXJldHVybiB0b3RhbDsKKyAgICBQeU9iamVjdCAqbzsKKyAgICBQeV9zc2l6ZV90IHRvdGFsID0gX1B5X1JlZlRvdGFsOworICAgIC8qIGlnbm9yZSB0aGUgcmVmZXJlbmNlcyB0byB0aGUgZHVtbXkgb2JqZWN0IG9mIHRoZSBkaWN0cyBhbmQgc2V0cworICAgICAgIGJlY2F1c2UgdGhleSBhcmUgbm90IHJlbGlhYmxlIGFuZCBub3QgdXNlZnVsIChub3cgdGhhdCB0aGUKKyAgICAgICBoYXNoIHRhYmxlIGNvZGUgaXMgd2VsbC10ZXN0ZWQpICovCisgICAgbyA9IF9QeURpY3RfRHVtbXkoKTsKKyAgICBpZiAobyAhPSBOVUxMKQorICAgICAgICB0b3RhbCAtPSBvLT5vYl9yZWZjbnQ7CisgICAgbyA9IF9QeVNldF9EdW1teSgpOworICAgIGlmIChvICE9IE5VTEwpCisgICAgICAgIHRvdGFsIC09IG8tPm9iX3JlZmNudDsKKyAgICByZXR1cm4gdG90YWw7CiB9CiAjZW5kaWYgLyogUHlfUkVGX0RFQlVHICovCiAKQEAgLTU4LDIxICs1OCwyMSBAQAogX1B5X0FkZFRvQWxsT2JqZWN0cyhQeU9iamVjdCAqb3AsIGludCBmb3JjZSkKIHsKICNpZmRlZiAgUHlfREVCVUcKLQlpZiAoIWZvcmNlKSB7Ci0JCS8qIElmIGl0J3MgaW5pdGlhbGl6ZWQgbWVtb3J5LCBvcCBtdXN0IGJlIGluIG9yIG91dCBvZgotCQkgKiB0aGUgbGlzdCB1bmFtYmlndW91c2x5LgotCQkgKi8KLQkJYXNzZXJ0KChvcC0+X29iX3ByZXYgPT0gTlVMTCkgPT0gKG9wLT5fb2JfbmV4dCA9PSBOVUxMKSk7Ci0JfQorICAgIGlmICghZm9yY2UpIHsKKyAgICAgICAgLyogSWYgaXQncyBpbml0aWFsaXplZCBtZW1vcnksIG9wIG11c3QgYmUgaW4gb3Igb3V0IG9mCisgICAgICAgICAqIHRoZSBsaXN0IHVuYW1iaWd1b3VzbHkuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQoKG9wLT5fb2JfcHJldiA9PSBOVUxMKSA9PSAob3AtPl9vYl9uZXh0ID09IE5VTEwpKTsKKyAgICB9CiAjZW5kaWYKLQlpZiAoZm9yY2UgfHwgb3AtPl9vYl9wcmV2ID09IE5VTEwpIHsKLQkJb3AtPl9vYl9uZXh0ID0gcmVmY2hhaW4uX29iX25leHQ7Ci0JCW9wLT5fb2JfcHJldiA9ICZyZWZjaGFpbjsKLQkJcmVmY2hhaW4uX29iX25leHQtPl9vYl9wcmV2ID0gb3A7Ci0JCXJlZmNoYWluLl9vYl9uZXh0ID0gb3A7Ci0JfQorICAgIGlmIChmb3JjZSB8fCBvcC0+X29iX3ByZXYgPT0gTlVMTCkgeworICAgICAgICBvcC0+X29iX25leHQgPSByZWZjaGFpbi5fb2JfbmV4dDsKKyAgICAgICAgb3AtPl9vYl9wcmV2ID0gJnJlZmNoYWluOworICAgICAgICByZWZjaGFpbi5fb2JfbmV4dC0+X29iX3ByZXYgPSBvcDsKKyAgICAgICAgcmVmY2hhaW4uX29iX25leHQgPSBvcDsKKyAgICB9CiB9Ci0jZW5kaWYJLyogUHlfVFJBQ0VfUkVGUyAqLworI2VuZGlmICAvKiBQeV9UUkFDRV9SRUZTICovCiAKICNpZmRlZiBDT1VOVF9BTExPQ1MKIHN0YXRpYyBQeVR5cGVPYmplY3QgKnR5cGVfbGlzdDsKQEAgLTg5LDk5ICs4OSw5OSBAQAogdm9pZAogZHVtcF9jb3VudHMoRklMRSogZikKIHsKLQlQeVR5cGVPYmplY3QgKnRwOworICAgIFB5VHlwZU9iamVjdCAqdHA7CiAKLQlmb3IgKHRwID0gdHlwZV9saXN0OyB0cDsgdHAgPSB0cC0+dHBfbmV4dCkKLQkJZnByaW50ZihmLCAiJXMgYWxsb2MnZDogJSIgUFlfRk9STUFUX1NJWkVfVCAiZCwgIgotCQkJImZyZWVkOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkLCAiCi0JCQkibWF4IGluIHVzZTogJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwKLQkJCXRwLT50cF9uYW1lLCB0cC0+dHBfYWxsb2NzLCB0cC0+dHBfZnJlZXMsCi0JCQl0cC0+dHBfbWF4YWxsb2MpOwotCWZwcmludGYoZiwgImZhc3QgdHVwbGUgYWxsb2NzOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkLCAiCi0JCSJlbXB0eTogJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwKLQkJZmFzdF90dXBsZV9hbGxvY3MsIHR1cGxlX3plcm9fYWxsb2NzKTsKLQlmcHJpbnRmKGYsICJmYXN0IGludCBhbGxvY3M6IHBvczogJSIgUFlfRk9STUFUX1NJWkVfVCAiZCwgIgotCQkibmVnOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAotCQlxdWlja19pbnRfYWxsb2NzLCBxdWlja19uZWdfaW50X2FsbG9jcyk7Ci0JZnByaW50ZihmLCAibnVsbCBzdHJpbmdzOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkLCAiCi0JCSIxLXN0cmluZ3M6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCi0JCW51bGxfc3RyaW5ncywgb25lX3N0cmluZ3MpOworICAgIGZvciAodHAgPSB0eXBlX2xpc3Q7IHRwOyB0cCA9IHRwLT50cF9uZXh0KQorICAgICAgICBmcHJpbnRmKGYsICIlcyBhbGxvYydkOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkLCAiCisgICAgICAgICAgICAiZnJlZWQ6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQsICIKKyAgICAgICAgICAgICJtYXggaW4gdXNlOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAorICAgICAgICAgICAgdHAtPnRwX25hbWUsIHRwLT50cF9hbGxvY3MsIHRwLT50cF9mcmVlcywKKyAgICAgICAgICAgIHRwLT50cF9tYXhhbGxvYyk7CisgICAgZnByaW50ZihmLCAiZmFzdCB0dXBsZSBhbGxvY3M6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQsICIKKyAgICAgICAgImVtcHR5OiAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAorICAgICAgICBmYXN0X3R1cGxlX2FsbG9jcywgdHVwbGVfemVyb19hbGxvY3MpOworICAgIGZwcmludGYoZiwgImZhc3QgaW50IGFsbG9jczogcG9zOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkLCAiCisgICAgICAgICJuZWc6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCisgICAgICAgIHF1aWNrX2ludF9hbGxvY3MsIHF1aWNrX25lZ19pbnRfYWxsb2NzKTsKKyAgICBmcHJpbnRmKGYsICJudWxsIHN0cmluZ3M6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQsICIKKyAgICAgICAgIjEtc3RyaW5nczogJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwKKyAgICAgICAgbnVsbF9zdHJpbmdzLCBvbmVfc3RyaW5ncyk7CiB9CiAKIFB5T2JqZWN0ICoKIGdldF9jb3VudHModm9pZCkKIHsKLQlQeVR5cGVPYmplY3QgKnRwOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKnY7CisgICAgUHlUeXBlT2JqZWN0ICp0cDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICp2OwogCi0JcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAodHAgPSB0eXBlX2xpc3Q7IHRwOyB0cCA9IHRwLT50cF9uZXh0KSB7Ci0JCXYgPSBQeV9CdWlsZFZhbHVlKCIoc25ubikiLCB0cC0+dHBfbmFtZSwgdHAtPnRwX2FsbG9jcywKLQkJCQkgIHRwLT50cF9mcmVlcywgdHAtPnRwX21heGFsbG9jKTsKLQkJaWYgKHYgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoUHlMaXN0X0FwcGVuZChyZXN1bHQsIHYpIDwgMCkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYodik7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAodHAgPSB0eXBlX2xpc3Q7IHRwOyB0cCA9IHRwLT50cF9uZXh0KSB7CisgICAgICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoc25ubikiLCB0cC0+dHBfbmFtZSwgdHAtPnRwX2FsbG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnRwX2ZyZWVzLCB0cC0+dHBfbWF4YWxsb2MpOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHJlc3VsdCwgdikgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogdm9pZAogaW5jX2NvdW50KFB5VHlwZU9iamVjdCAqdHApCiB7Ci0JaWYgKHRwLT50cF9uZXh0ID09IE5VTEwgJiYgdHAtPnRwX3ByZXYgPT0gTlVMTCkgewotCQkvKiBmaXJzdCB0aW1lOyBpbnNlcnQgaW4gbGlua2VkIGxpc3QgKi8KLQkJaWYgKHRwLT50cF9uZXh0ICE9IE5VTEwpIC8qIHNhbml0eSBjaGVjayAqLwotCQkJUHlfRmF0YWxFcnJvcigiWFhYIGluY19jb3VudCBzYW5pdHkgY2hlY2siKTsKLQkJaWYgKHR5cGVfbGlzdCkKLQkJCXR5cGVfbGlzdC0+dHBfcHJldiA9IHRwOwotCQl0cC0+dHBfbmV4dCA9IHR5cGVfbGlzdDsKLQkJLyogTm90ZSB0aGF0IGFzIG9mIFB5dGhvbiAyLjIsIGhlYXAtYWxsb2NhdGVkIHR5cGUgb2JqZWN0cwotCQkgKiBjYW4gZ28gYXdheSwgYnV0IHRoaXMgY29kZSByZXF1aXJlcyB0aGF0IHRoZXkgc3RheSBhbGl2ZQotCQkgKiB1bnRpbCBwcm9ncmFtIGV4aXQuICBUaGF0J3Mgd2h5IHdlJ3JlIGNhcmVmdWwgd2l0aAotCQkgKiByZWZjb3VudHMgaGVyZS4gIHR5cGVfbGlzdCBnZXRzIGEgbmV3IHJlZmVyZW5jZSB0byB0cCwKLQkJICogd2hpbGUgb3duZXJzaGlwIG9mIHRoZSByZWZlcmVuY2UgdHlwZV9saXN0IHVzZWQgdG8gaG9sZAotCQkgKiAoaWYgYW55KSB3YXMgdHJhbnNmZXJyZWQgdG8gdHAtPnRwX25leHQgaW4gdGhlIGxpbmUgYWJvdmUuCi0JCSAqIHRwIGlzIHRodXMgZWZmZWN0aXZlbHkgaW1tb3J0YWwgYWZ0ZXIgdGhpcy4KLQkJICovCi0JCVB5X0lOQ1JFRih0cCk7Ci0JCXR5cGVfbGlzdCA9IHRwOworICAgIGlmICh0cC0+dHBfbmV4dCA9PSBOVUxMICYmIHRwLT50cF9wcmV2ID09IE5VTEwpIHsKKyAgICAgICAgLyogZmlyc3QgdGltZTsgaW5zZXJ0IGluIGxpbmtlZCBsaXN0ICovCisgICAgICAgIGlmICh0cC0+dHBfbmV4dCAhPSBOVUxMKSAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlhYWCBpbmNfY291bnQgc2FuaXR5IGNoZWNrIik7CisgICAgICAgIGlmICh0eXBlX2xpc3QpCisgICAgICAgICAgICB0eXBlX2xpc3QtPnRwX3ByZXYgPSB0cDsKKyAgICAgICAgdHAtPnRwX25leHQgPSB0eXBlX2xpc3Q7CisgICAgICAgIC8qIE5vdGUgdGhhdCBhcyBvZiBQeXRob24gMi4yLCBoZWFwLWFsbG9jYXRlZCB0eXBlIG9iamVjdHMKKyAgICAgICAgICogY2FuIGdvIGF3YXksIGJ1dCB0aGlzIGNvZGUgcmVxdWlyZXMgdGhhdCB0aGV5IHN0YXkgYWxpdmUKKyAgICAgICAgICogdW50aWwgcHJvZ3JhbSBleGl0LiAgVGhhdCdzIHdoeSB3ZSdyZSBjYXJlZnVsIHdpdGgKKyAgICAgICAgICogcmVmY291bnRzIGhlcmUuICB0eXBlX2xpc3QgZ2V0cyBhIG5ldyByZWZlcmVuY2UgdG8gdHAsCisgICAgICAgICAqIHdoaWxlIG93bmVyc2hpcCBvZiB0aGUgcmVmZXJlbmNlIHR5cGVfbGlzdCB1c2VkIHRvIGhvbGQKKyAgICAgICAgICogKGlmIGFueSkgd2FzIHRyYW5zZmVycmVkIHRvIHRwLT50cF9uZXh0IGluIHRoZSBsaW5lIGFib3ZlLgorICAgICAgICAgKiB0cCBpcyB0aHVzIGVmZmVjdGl2ZWx5IGltbW9ydGFsIGFmdGVyIHRoaXMuCisgICAgICAgICAqLworICAgICAgICBQeV9JTkNSRUYodHApOworICAgICAgICB0eXBlX2xpc3QgPSB0cDsKICNpZmRlZiBQeV9UUkFDRV9SRUZTCi0JCS8qIEFsc28gaW5zZXJ0IGluIHRoZSBkb3VibHktbGlua2VkIGxpc3Qgb2YgYWxsIG9iamVjdHMsCi0JCSAqIGlmIG5vdCBhbHJlYWR5IHRoZXJlLgotCQkgKi8KLQkJX1B5X0FkZFRvQWxsT2JqZWN0cygoUHlPYmplY3QgKil0cCwgMCk7CisgICAgICAgIC8qIEFsc28gaW5zZXJ0IGluIHRoZSBkb3VibHktbGlua2VkIGxpc3Qgb2YgYWxsIG9iamVjdHMsCisgICAgICAgICAqIGlmIG5vdCBhbHJlYWR5IHRoZXJlLgorICAgICAgICAgKi8KKyAgICAgICAgX1B5X0FkZFRvQWxsT2JqZWN0cygoUHlPYmplY3QgKil0cCwgMCk7CiAjZW5kaWYKLQl9Ci0JdHAtPnRwX2FsbG9jcysrOwotCWlmICh0cC0+dHBfYWxsb2NzIC0gdHAtPnRwX2ZyZWVzID4gdHAtPnRwX21heGFsbG9jKQotCQl0cC0+dHBfbWF4YWxsb2MgPSB0cC0+dHBfYWxsb2NzIC0gdHAtPnRwX2ZyZWVzOworICAgIH0KKyAgICB0cC0+dHBfYWxsb2NzKys7CisgICAgaWYgKHRwLT50cF9hbGxvY3MgLSB0cC0+dHBfZnJlZXMgPiB0cC0+dHBfbWF4YWxsb2MpCisgICAgICAgIHRwLT50cF9tYXhhbGxvYyA9IHRwLT50cF9hbGxvY3MgLSB0cC0+dHBfZnJlZXM7CiB9CiAKIHZvaWQgZGVjX2NvdW50KFB5VHlwZU9iamVjdCAqdHApCiB7Ci0JdHAtPnRwX2ZyZWVzKys7Ci0JaWYgKHVubGlzdF90eXBlc193aXRob3V0X29iamVjdHMgJiYKLQkgICAgdHAtPnRwX2FsbG9jcyA9PSB0cC0+dHBfZnJlZXMpIHsKLQkJLyogdW5saW5rIHRoZSB0eXBlIGZyb20gdHlwZV9saXN0ICovCi0JCWlmICh0cC0+dHBfcHJldikKLQkJCXRwLT50cF9wcmV2LT50cF9uZXh0ID0gdHAtPnRwX25leHQ7Ci0JCWVsc2UKLQkJCXR5cGVfbGlzdCA9IHRwLT50cF9uZXh0OwotCQlpZiAodHAtPnRwX25leHQpCi0JCQl0cC0+dHBfbmV4dC0+dHBfcHJldiA9IHRwLT50cF9wcmV2OwotCQl0cC0+dHBfbmV4dCA9IHRwLT50cF9wcmV2ID0gTlVMTDsKLQkJUHlfREVDUkVGKHRwKTsKLQl9CisgICAgdHAtPnRwX2ZyZWVzKys7CisgICAgaWYgKHVubGlzdF90eXBlc193aXRob3V0X29iamVjdHMgJiYKKyAgICAgICAgdHAtPnRwX2FsbG9jcyA9PSB0cC0+dHBfZnJlZXMpIHsKKyAgICAgICAgLyogdW5saW5rIHRoZSB0eXBlIGZyb20gdHlwZV9saXN0ICovCisgICAgICAgIGlmICh0cC0+dHBfcHJldikKKyAgICAgICAgICAgIHRwLT50cF9wcmV2LT50cF9uZXh0ID0gdHAtPnRwX25leHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGVfbGlzdCA9IHRwLT50cF9uZXh0OworICAgICAgICBpZiAodHAtPnRwX25leHQpCisgICAgICAgICAgICB0cC0+dHBfbmV4dC0+dHBfcHJldiA9IHRwLT50cF9wcmV2OworICAgICAgICB0cC0+dHBfbmV4dCA9IHRwLT50cF9wcmV2ID0gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKHRwKTsKKyAgICB9CiB9CiAKICNlbmRpZgpAQCAtMTkxLDEzICsxOTEsMTMgQEAKIHZvaWQKIF9QeV9OZWdhdGl2ZVJlZmNvdW50KGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbGluZW5vLCBQeU9iamVjdCAqb3ApCiB7Ci0JY2hhciBidWZbMzAwXTsKKyAgICBjaGFyIGJ1ZlszMDBdOwogCi0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkgICAgICAiJXM6JWkgb2JqZWN0IGF0ICVwIGhhcyBuZWdhdGl2ZSByZWYgY291bnQgIgotCQkgICAgICAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCIsCi0JCSAgICAgIGZuYW1lLCBsaW5lbm8sIG9wLCBvcC0+b2JfcmVmY250KTsKLQlQeV9GYXRhbEVycm9yKGJ1Zik7CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgIiVzOiVpIG9iamVjdCBhdCAlcCBoYXMgbmVnYXRpdmUgcmVmIGNvdW50ICIKKyAgICAgICAgICAgICAgICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKKyAgICAgICAgICAgICAgICAgIGZuYW1lLCBsaW5lbm8sIG9wLCBvcC0+b2JfcmVmY250KTsKKyAgICBQeV9GYXRhbEVycm9yKGJ1Zik7CiB9CiAKICNlbmRpZiAvKiBQeV9SRUZfREVCVUcgKi8KQEAgLTIxNyw0NSArMjE3LDQ1IEBACiBQeU9iamVjdCAqCiBQeU9iamVjdF9Jbml0KFB5T2JqZWN0ICpvcCwgUHlUeXBlT2JqZWN0ICp0cCkKIHsKLQlpZiAob3AgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JLyogQW55IGNoYW5nZXMgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiBQeU9iamVjdF9JTklUIChvYmppbXBsLmgpICovCi0JUHlfVFlQRShvcCkgPSB0cDsKLQlfUHlfTmV3UmVmZXJlbmNlKG9wKTsKLQlyZXR1cm4gb3A7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIC8qIEFueSBjaGFuZ2VzIHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gUHlPYmplY3RfSU5JVCAob2JqaW1wbC5oKSAqLworICAgIFB5X1RZUEUob3ApID0gdHA7CisgICAgX1B5X05ld1JlZmVyZW5jZShvcCk7CisgICAgcmV0dXJuIG9wOwogfQogCiBQeVZhck9iamVjdCAqCiBQeU9iamVjdF9Jbml0VmFyKFB5VmFyT2JqZWN0ICpvcCwgUHlUeXBlT2JqZWN0ICp0cCwgUHlfc3NpemVfdCBzaXplKQogewotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gKFB5VmFyT2JqZWN0ICopIFB5RXJyX05vTWVtb3J5KCk7Ci0JLyogQW55IGNoYW5nZXMgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiBQeU9iamVjdF9JTklUX1ZBUiAqLwotCW9wLT5vYl9zaXplID0gc2l6ZTsKLQlQeV9UWVBFKG9wKSA9IHRwOwotCV9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopb3ApOwotCXJldHVybiBvcDsKKyAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChQeVZhck9iamVjdCAqKSBQeUVycl9Ob01lbW9yeSgpOworICAgIC8qIEFueSBjaGFuZ2VzIHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gUHlPYmplY3RfSU5JVF9WQVIgKi8KKyAgICBvcC0+b2Jfc2l6ZSA9IHNpemU7CisgICAgUHlfVFlQRShvcCkgPSB0cDsKKyAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKW9wKTsKKyAgICByZXR1cm4gb3A7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeU9iamVjdF9OZXcoUHlUeXBlT2JqZWN0ICp0cCkKIHsKLQlQeU9iamVjdCAqb3A7Ci0Jb3AgPSAoUHlPYmplY3QgKikgUHlPYmplY3RfTUFMTE9DKF9QeU9iamVjdF9TSVpFKHRwKSk7Ci0JaWYgKG9wID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCXJldHVybiBQeU9iamVjdF9JTklUKG9wLCB0cCk7CisgICAgUHlPYmplY3QgKm9wOworICAgIG9wID0gKFB5T2JqZWN0ICopIFB5T2JqZWN0X01BTExPQyhfUHlPYmplY3RfU0laRSh0cCkpOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICByZXR1cm4gUHlPYmplY3RfSU5JVChvcCwgdHApOwogfQogCiBQeVZhck9iamVjdCAqCiBfUHlPYmplY3RfTmV3VmFyKFB5VHlwZU9iamVjdCAqdHAsIFB5X3NzaXplX3Qgbml0ZW1zKQogewotCVB5VmFyT2JqZWN0ICpvcDsKLQljb25zdCBzaXplX3Qgc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRSh0cCwgbml0ZW1zKTsKLQlvcCA9IChQeVZhck9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0Moc2l6ZSk7Ci0JaWYgKG9wID09IE5VTEwpCi0JCXJldHVybiAoUHlWYXJPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOwotCXJldHVybiBQeU9iamVjdF9JTklUX1ZBUihvcCwgdHAsIG5pdGVtcyk7CisgICAgUHlWYXJPYmplY3QgKm9wOworICAgIGNvbnN0IHNpemVfdCBzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHRwLCBuaXRlbXMpOworICAgIG9wID0gKFB5VmFyT2JqZWN0ICopIFB5T2JqZWN0X01BTExPQyhzaXplKTsKKyAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChQeVZhck9iamVjdCAqKVB5RXJyX05vTWVtb3J5KCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0lOSVRfVkFSKG9wLCB0cCwgbml0ZW1zKTsKIH0KIAogLyogZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggMi4yICovCkBAIC0yNjMsMjg0ICsyNjMsMjg0IEBACiB2b2lkCiBfUHlPYmplY3RfRGVsKFB5T2JqZWN0ICpvcCkKIHsKLQlQeU9iamVjdF9GUkVFKG9wKTsKKyAgICBQeU9iamVjdF9GUkVFKG9wKTsKIH0KIAogLyogSW1wbGVtZW50YXRpb24gb2YgUHlPYmplY3RfUHJpbnQgd2l0aCByZWN1cnNpb24gY2hlY2tpbmcgKi8KIHN0YXRpYyBpbnQKIGludGVybmFsX3ByaW50KFB5T2JqZWN0ICpvcCwgRklMRSAqZnAsIGludCBmbGFncywgaW50IG5lc3RpbmcpCiB7Ci0JaW50IHJldCA9IDA7Ci0JaWYgKG5lc3RpbmcgPiAxMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicHJpbnQgcmVjdXJzaW9uIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQotCQlyZXR1cm4gLTE7CisgICAgaW50IHJldCA9IDA7CisgICAgaWYgKG5lc3RpbmcgPiAxMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicHJpbnQgcmVjdXJzaW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQorICAgICAgICByZXR1cm4gLTE7CiAjaWZkZWYgVVNFX1NUQUNLQ0hFQ0sKLQlpZiAoUHlPU19DaGVja1N0YWNrKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAic3RhY2sgb3ZlcmZsb3ciKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoUHlPU19DaGVja1N0YWNrKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAic3RhY2sgb3ZlcmZsb3ciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICNlbmRpZgotCWNsZWFyZXJyKGZwKTsgLyogQ2xlYXIgYW55IHByZXZpb3VzIGVycm9yIGNvbmRpdGlvbiAqLwotCWlmIChvcCA9PSBOVUxMKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnByaW50ZihmcCwgIjxuaWw+Iik7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCWVsc2UgewotCQlpZiAob3AtPm9iX3JlZmNudCA8PSAwKQotCQkJLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvIGxvbmcgdW50aWwgJXpkIGlzCi0JCQkgICB1bml2ZXJzYWxseSBhdmFpbGFibGUgKi8KLQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCWZwcmludGYoZnAsICI8cmVmY250ICVsZCBhdCAlcD4iLAotCQkJCShsb25nKW9wLT5vYl9yZWZjbnQsIG9wKTsKLQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCWVsc2UgaWYgKFB5X1RZUEUob3ApLT50cF9wcmludCA9PSBOVUxMKSB7Ci0JCQlQeU9iamVjdCAqczsKLQkJCWlmIChmbGFncyAmIFB5X1BSSU5UX1JBVykKLQkJCQlzID0gUHlPYmplY3RfU3RyKG9wKTsKLQkJCWVsc2UKLQkJCQlzID0gUHlPYmplY3RfUmVwcihvcCk7Ci0JCQlpZiAocyA9PSBOVUxMKQotCQkJCXJldCA9IC0xOwotCQkJZWxzZSB7Ci0JCQkJcmV0ID0gaW50ZXJuYWxfcHJpbnQocywgZnAsIFB5X1BSSU5UX1JBVywKLQkJCQkJCSAgICAgbmVzdGluZysxKTsKLQkJCX0KLQkJCVB5X1hERUNSRUYocyk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0ID0gKCpQeV9UWVBFKG9wKS0+dHBfcHJpbnQpKG9wLCBmcCwgZmxhZ3MpOwotCX0KLQlpZiAocmV0ID09IDApIHsKLQkJaWYgKGZlcnJvcihmcCkpIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCWNsZWFyZXJyKGZwKTsKLQkJCXJldCA9IC0xOwotCQl9Ci0JfQotCXJldHVybiByZXQ7CisgICAgY2xlYXJlcnIoZnApOyAvKiBDbGVhciBhbnkgcHJldmlvdXMgZXJyb3IgY29uZGl0aW9uICovCisgICAgaWYgKG9wID09IE5VTEwpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHJpbnRmKGZwLCAiPG5pbD4iKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChvcC0+b2JfcmVmY250IDw9IDApCisgICAgICAgICAgICAvKiBYWFgodHdvdXRlcnMpIGNhc3QgcmVmY291bnQgdG8gbG9uZyB1bnRpbCAlemQgaXMKKyAgICAgICAgICAgICAgIHVuaXZlcnNhbGx5IGF2YWlsYWJsZSAqLworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgZnByaW50ZihmcCwgIjxyZWZjbnQgJWxkIGF0ICVwPiIsCisgICAgICAgICAgICAgICAgKGxvbmcpb3AtPm9iX3JlZmNudCwgb3ApOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZWxzZSBpZiAoUHlfVFlQRShvcCktPnRwX3ByaW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzOworICAgICAgICAgICAgaWYgKGZsYWdzICYgUHlfUFJJTlRfUkFXKQorICAgICAgICAgICAgICAgIHMgPSBQeU9iamVjdF9TdHIob3ApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHMgPSBQeU9iamVjdF9SZXByKG9wKTsKKyAgICAgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBpbnRlcm5hbF9wcmludChzLCBmcCwgUHlfUFJJTlRfUkFXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmcrMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9YREVDUkVGKHMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldCA9ICgqUHlfVFlQRShvcCktPnRwX3ByaW50KShvcCwgZnAsIGZsYWdzKTsKKyAgICB9CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIGlmIChmZXJyb3IoZnApKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICBjbGVhcmVycihmcCk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OwogfQogCiBpbnQKIFB5T2JqZWN0X1ByaW50KFB5T2JqZWN0ICpvcCwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQlyZXR1cm4gaW50ZXJuYWxfcHJpbnQob3AsIGZwLCBmbGFncywgMCk7CisgICAgcmV0dXJuIGludGVybmFsX3ByaW50KG9wLCBmcCwgZmxhZ3MsIDApOwogfQogCiAKIC8qIEZvciBkZWJ1Z2dpbmcgY29udmVuaWVuY2UuICBTZWUgTWlzYy9nZGJpbml0IGZvciBzb21lIHVzZWZ1bCBnZGIgaG9va3MgKi8KIHZvaWQgX1B5T2JqZWN0X0R1bXAoUHlPYmplY3QqIG9wKQogewotCWlmIChvcCA9PSBOVUxMKQotCQlmcHJpbnRmKHN0ZGVyciwgIk5VTExcbiIpOwotCWVsc2UgeworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5VTExcbiIpOworICAgIGVsc2UgewogI2lmZGVmIFdJVEhfVEhSRUFECi0JCVB5R0lMU3RhdGVfU1RBVEUgZ2lsOworICAgICAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbDsKICNlbmRpZgotCQlmcHJpbnRmKHN0ZGVyciwgIm9iamVjdCAgOiAiKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJvYmplY3QgIDogIik7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJZ2lsID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyAgICAgICAgZ2lsID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKICNlbmRpZgotCQkodm9pZClQeU9iamVjdF9QcmludChvcCwgc3RkZXJyLCAwKTsKKyAgICAgICAgKHZvaWQpUHlPYmplY3RfUHJpbnQob3AsIHN0ZGVyciwgMCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbCk7CisgICAgICAgIFB5R0lMU3RhdGVfUmVsZWFzZShnaWwpOwogI2VuZGlmCi0JCS8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0byBsb25nIHVudGlsICV6ZCBpcwotCQkgICB1bml2ZXJzYWxseSBhdmFpbGFibGUgKi8KLQkJZnByaW50ZihzdGRlcnIsICJcbiIKLQkJCSJ0eXBlICAgIDogJXNcbiIKLQkJCSJyZWZjb3VudDogJWxkXG4iCi0JCQkiYWRkcmVzcyA6ICVwXG4iLAotCQkJUHlfVFlQRShvcCk9PU5VTEwgPyAiTlVMTCIgOiBQeV9UWVBFKG9wKS0+dHBfbmFtZSwKLQkJCShsb25nKW9wLT5vYl9yZWZjbnQsCi0JCQlvcCk7Ci0JfQorICAgICAgICAvKiBYWFgodHdvdXRlcnMpIGNhc3QgcmVmY291bnQgdG8gbG9uZyB1bnRpbCAlemQgaXMKKyAgICAgICAgICAgdW5pdmVyc2FsbHkgYXZhaWxhYmxlICovCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iCisgICAgICAgICAgICAidHlwZSAgICA6ICVzXG4iCisgICAgICAgICAgICAicmVmY291bnQ6ICVsZFxuIgorICAgICAgICAgICAgImFkZHJlc3MgOiAlcFxuIiwKKyAgICAgICAgICAgIFB5X1RZUEUob3ApPT1OVUxMID8gIk5VTEwiIDogUHlfVFlQRShvcCktPnRwX25hbWUsCisgICAgICAgICAgICAobG9uZylvcC0+b2JfcmVmY250LAorICAgICAgICAgICAgb3ApOworICAgIH0KIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfUmVwcihQeU9iamVjdCAqdikKIHsKLQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgVVNFX1NUQUNLQ0hFQ0sKLQlpZiAoUHlPU19DaGVja1N0YWNrKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAic3RhY2sgb3ZlcmZsb3ciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeU9TX0NoZWNrU3RhY2soKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJzdGFjayBvdmVyZmxvdyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiPE5VTEw+Iik7Ci0JZWxzZSBpZiAoUHlfVFlQRSh2KS0+dHBfcmVwciA9PSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAotCQkJCQkgICBQeV9UWVBFKHYpLT50cF9uYW1lLCB2KTsKLQllbHNlIHsKLQkJUHlPYmplY3QgKnJlczsKLQkJcmVzID0gKCpQeV9UWVBFKHYpLT50cF9yZXByKSh2KTsKLQkJaWYgKHJlcyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxOVUxMPiIpOworICAgIGVsc2UgaWYgKFB5X1RZUEUodiktPnRwX3JlcHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBvYmplY3QgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSwgdik7CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIHJlcyA9ICgqUHlfVFlQRSh2KS0+dHBfcmVwcikodik7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhyZXMpKSB7Ci0JCQlQeU9iamVjdCogc3RyOwotCQkJc3RyID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhyZXMsIE5VTEwsIE5VTEwpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlpZiAoc3RyKQotCQkJCXJlcyA9IHN0cjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHJlcykpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0KiBzdHI7CisgICAgICAgICAgICBzdHIgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHJlcywgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIGlmIChzdHIpCisgICAgICAgICAgICAgICAgcmVzID0gc3RyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAjZW5kaWYKLQkJaWYgKCFQeVN0cmluZ19DaGVjayhyZXMpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIl9fcmVwcl9fIHJldHVybmVkIG5vbi1zdHJpbmcgKHR5cGUgJS4yMDBzKSIsCi0JCQkJICAgICBQeV9UWVBFKHJlcyktPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhyZXMpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJfX3JlcHJfXyByZXR1cm5lZCBub24tc3RyaW5nICh0eXBlICUuMjAwcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocmVzKS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogfQogCiBQeU9iamVjdCAqCiBfUHlPYmplY3RfU3RyKFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICpyZXM7Ci0JaW50IHR5cGVfb2s7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxOVUxMPiIpOwotCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KHYpKSB7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dXJuIHY7Ci0JfQorICAgIFB5T2JqZWN0ICpyZXM7CisgICAgaW50IHR5cGVfb2s7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxOVUxMPiIpOworICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3QodikpIHsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gdjsKLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQogI2VuZGlmCi0JaWYgKFB5X1RZUEUodiktPnRwX3N0ciA9PSBOVUxMKQotCQlyZXR1cm4gUHlPYmplY3RfUmVwcih2KTsKKyAgICBpZiAoUHlfVFlQRSh2KS0+dHBfc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeU9iamVjdF9SZXByKHYpOwogCi0JLyogSXQgaXMgcG9zc2libGUgZm9yIGEgdHlwZSB0byBoYXZlIGEgdHBfc3RyIHJlcHJlc2VudGF0aW9uIHRoYXQgbG9vcHMKLQkgICBpbmZpbml0ZWx5LiAqLwotCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBnZXR0aW5nIHRoZSBzdHIgb2YgYW4gb2JqZWN0IikpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9ICgqUHlfVFlQRSh2KS0+dHBfc3RyKSh2KTsKLQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXR5cGVfb2sgPSBQeVN0cmluZ19DaGVjayhyZXMpOworICAgIC8qIEl0IGlzIHBvc3NpYmxlIGZvciBhIHR5cGUgdG8gaGF2ZSBhIHRwX3N0ciByZXByZXNlbnRhdGlvbiB0aGF0IGxvb3BzCisgICAgICAgaW5maW5pdGVseS4gKi8KKyAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgZ2V0dGluZyB0aGUgc3RyIG9mIGFuIG9iamVjdCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSAoKlB5X1RZUEUodiktPnRwX3N0cikodik7CisgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0eXBlX29rID0gUHlTdHJpbmdfQ2hlY2socmVzKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JdHlwZV9vayA9IHR5cGVfb2sgfHwgUHlVbmljb2RlX0NoZWNrKHJlcyk7CisgICAgdHlwZV9vayA9IHR5cGVfb2sgfHwgUHlVbmljb2RlX0NoZWNrKHJlcyk7CiAjZW5kaWYKLQlpZiAoIXR5cGVfb2spIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIl9fc3RyX18gcmV0dXJuZWQgbm9uLXN0cmluZyAodHlwZSAlLjIwMHMpIiwKLQkJCSAgICAgUHlfVFlQRShyZXMpLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcmVzOworICAgIGlmICghdHlwZV9vaykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIl9fc3RyX18gcmV0dXJuZWQgbm9uLXN0cmluZyAodHlwZSAlLjIwMHMpIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocmVzKS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfU3RyKFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICpyZXMgPSBfUHlPYmplY3RfU3RyKHYpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKnJlcyA9IF9QeU9iamVjdF9TdHIodik7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhyZXMpKSB7Ci0JCVB5T2JqZWN0KiBzdHI7Ci0JCXN0ciA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcocmVzLCBOVUxMLCBOVUxMKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCWlmIChzdHIpCi0JCQlyZXMgPSBzdHI7Ci0JCWVsc2UKLQkJICAgIAlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhyZXMpKSB7CisgICAgICAgIFB5T2JqZWN0KiBzdHI7CisgICAgICAgIHN0ciA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcocmVzLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIGlmIChzdHIpCisgICAgICAgICAgICByZXMgPSBzdHI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCWFzc2VydChQeVN0cmluZ19DaGVjayhyZXMpKTsKLQlyZXR1cm4gcmVzOworICAgIGFzc2VydChQeVN0cmluZ19DaGVjayhyZXMpKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogUHlPYmplY3QgKgogUHlPYmplY3RfVW5pY29kZShQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqcmVzOwotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICpzdHI7Ci0JaW50IHVuaWNvZGVfbWV0aG9kX2ZvdW5kID0gMDsKLQlzdGF0aWMgUHlPYmplY3QgKnVuaWNvZGVzdHI7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqc3RyOworICAgIGludCB1bmljb2RlX21ldGhvZF9mb3VuZCA9IDA7CisgICAgc3RhdGljIFB5T2JqZWN0ICp1bmljb2Rlc3RyOwogCi0JaWYgKHYgPT0gTlVMTCkgewotCQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8TlVMTD4iKTsKLQkJaWYgKHJlcyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXN0ciA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdChyZXMsIE5VTEwsICJzdHJpY3QiKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiBzdHI7Ci0JfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2KSkgewotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiB2OwotCX0KKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxOVUxMPiIpOworICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc3RyID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHJlcywgTlVMTCwgInN0cmljdCIpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQogCi0JaWYgKFB5SW5zdGFuY2VfQ2hlY2sodikpIHsKLQkJLyogV2UncmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzc2ljIGNsYXNzICovCi0JCS8qIFRyeSBfX3VuaWNvZGVfXyBmcm9tIHRoZSBpbnN0YW5jZSAtLSBhbGFzIHdlIGhhdmUgbm8gdHlwZSAqLwotCQlmdW5jID0gUHlPYmplY3RfR2V0QXR0cih2LCB1bmljb2Rlc3RyKTsKLQkJaWYgKGZ1bmMgIT0gTlVMTCkgewotCQkJdW5pY29kZV9tZXRob2RfZm91bmQgPSAxOwotCQkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihmdW5jKTsKLQkJfQotCQllbHNlIHsKLQkJCVB5RXJyX0NsZWFyKCk7IAotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBOb3QgYSBjbGFzc2ljIGNsYXNzIGluc3RhbmNlLCB0cnkgX191bmljb2RlX18uICovCi0JCWZ1bmMgPSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbCh2LCAiX191bmljb2RlX18iLCAmdW5pY29kZXN0cik7Ci0JCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJCXVuaWNvZGVfbWV0aG9kX2ZvdW5kID0gMTsKLQkJCXJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZnVuYywgTlVMTCk7Ci0JCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCX0KLQkJZWxzZSBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkgeworICAgICAgICAvKiBXZSdyZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzaWMgY2xhc3MgKi8KKyAgICAgICAgLyogVHJ5IF9fdW5pY29kZV9fIGZyb20gdGhlIGluc3RhbmNlIC0tIGFsYXMgd2UgaGF2ZSBubyB0eXBlICovCisgICAgICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIHVuaWNvZGVzdHIpOworICAgICAgICBpZiAoZnVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgICB1bmljb2RlX21ldGhvZF9mb3VuZCA9IDE7CisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZ1bmMsIE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogTm90IGEgY2xhc3NpYyBjbGFzcyBpbnN0YW5jZSwgdHJ5IF9fdW5pY29kZV9fLiAqLworICAgICAgICBmdW5jID0gX1B5T2JqZWN0X0xvb2t1cFNwZWNpYWwodiwgIl9fdW5pY29kZV9fIiwgJnVuaWNvZGVzdHIpOworICAgICAgICBpZiAoZnVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgICB1bmljb2RlX21ldGhvZF9mb3VuZCA9IDE7CisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZ1bmMsIE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBEaWRuJ3QgZmluZCBfX3VuaWNvZGVfXyAqLwotCWlmICghdW5pY29kZV9tZXRob2RfZm91bmQpIHsKLQkJaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQkJLyogRm9yIGEgVW5pY29kZSBzdWJ0eXBlIHRoYXQncyBkaWRuJ3Qgb3ZlcndyaXRlIF9fdW5pY29kZV9fLAotCQkJICAgcmV0dXJuIGEgdHJ1ZSBVbmljb2RlIG9iamVjdCB3aXRoIHRoZSBzYW1lIGRhdGEuICovCi0JCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKHYpLAotCQkJCQkJICAgICBQeVVuaWNvZGVfR0VUX1NJWkUodikpOwotCQl9Ci0JCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KHYpKSB7Ci0JCQlQeV9JTkNSRUYodik7Ci0JCQlyZXMgPSB2OwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFB5X1RZUEUodiktPnRwX3N0ciAhPSBOVUxMKQotCQkJCXJlcyA9ICgqUHlfVFlQRSh2KS0+dHBfc3RyKSh2KTsKLQkJCWVsc2UKLQkJCQlyZXMgPSBQeU9iamVjdF9SZXByKHYpOwotCQl9Ci0JfQorICAgIC8qIERpZG4ndCBmaW5kIF9fdW5pY29kZV9fICovCisgICAgaWYgKCF1bmljb2RlX21ldGhvZF9mb3VuZCkgeworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAvKiBGb3IgYSBVbmljb2RlIHN1YnR5cGUgdGhhdCdzIGRpZG4ndCBvdmVyd3JpdGUgX191bmljb2RlX18sCisgICAgICAgICAgICAgICByZXR1cm4gYSB0cnVlIFVuaWNvZGUgb2JqZWN0IHdpdGggdGhlIHNhbWUgZGF0YS4gKi8KKyAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRSh2KSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIHJlcyA9IHY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlfVFlQRSh2KS0+dHBfc3RyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcmVzID0gKCpQeV9UWVBFKHYpLT50cF9zdHIpKHYpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X1JlcHIodik7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlVbmljb2RlX0NoZWNrKHJlcykpIHsKLQkJc3RyID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHJlcywgTlVMTCwgInN0cmljdCIpOwotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmVzID0gc3RyOwotCX0KLQlyZXR1cm4gcmVzOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2socmVzKSkgeworICAgICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QocmVzLCBOVUxMLCAic3RyaWN0Iik7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXMgPSBzdHI7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAjZW5kaWYKIApAQCAtNTU1LDM5ICs1NTUsMzkgQEAKIHN0YXRpYyBpbnQKIGFkanVzdF90cF9jb21wYXJlKGludCBjKQogewotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWlmIChjICE9IC0xICYmIGMgIT0gLTIpIHsKLQkJCVB5T2JqZWN0ICp0LCAqdiwgKnRiOwotCQkJUHlFcnJfRmV0Y2goJnQsICZ2LCAmdGIpOwotCQkJaWYgKFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsCi0JCQkJICAgICAgICJ0cF9jb21wYXJlIGRpZG4ndCByZXR1cm4gLTEgb3IgLTIgIgotCQkJCSAgICAgICAiZm9yIGV4Y2VwdGlvbiIpIDwgMCkgewotCQkJCVB5X1hERUNSRUYodCk7Ci0JCQkJUHlfWERFQ1JFRih2KTsKLQkJCQlQeV9YREVDUkVGKHRiKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlQeUVycl9SZXN0b3JlKHQsIHYsIHRiKTsKLQkJfQotCQlyZXR1cm4gLTI7Ci0JfQotCWVsc2UgaWYgKGMgPCAtMSB8fCBjID4gMSkgewotCQlpZiAoUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywKLQkJCSAgICAgICAidHBfY29tcGFyZSBkaWRuJ3QgcmV0dXJuIC0xLCAwIG9yIDEiKSA8IDApCi0JCQlyZXR1cm4gLTI7Ci0JCWVsc2UKLQkJCXJldHVybiBjIDwgLTEgPyAtMSA6IDE7Ci0JfQotCWVsc2UgewotCQlhc3NlcnQoYyA+PSAtMSAmJiBjIDw9IDEpOwotCQlyZXR1cm4gYzsKLQl9CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgaWYgKGMgIT0gLTEgJiYgYyAhPSAtMikgeworICAgICAgICAgICAgUHlPYmplY3QgKnQsICp2LCAqdGI7CisgICAgICAgICAgICBQeUVycl9GZXRjaCgmdCwgJnYsICZ0Yik7CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cF9jb21wYXJlIGRpZG4ndCByZXR1cm4gLTEgb3IgLTIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBleGNlcHRpb24iKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHQpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0Yik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlFcnJfUmVzdG9yZSh0LCB2LCB0Yik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKyAgICBlbHNlIGlmIChjIDwgLTEgfHwgYyA+IDEpIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICJ0cF9jb21wYXJlIGRpZG4ndCByZXR1cm4gLTEsIDAgb3IgMSIpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGMgPCAtMSA/IC0xIDogMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFzc2VydChjID49IC0xICYmIGMgPD0gMSk7CisgICAgICAgIHJldHVybiBjOworICAgIH0KIH0KIAogCiAvKiBNYWNybyB0byBnZXQgdGhlIHRwX3JpY2hjb21wYXJlIGZpZWxkIG9mIGEgdHlwZSBpZiBkZWZpbmVkICovCiAjZGVmaW5lIFJJQ0hDT01QQVJFKHQpIChQeVR5cGVfSGFzRmVhdHVyZSgodCksIFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgID8gKHQpLT50cF9yaWNoY29tcGFyZSA6IE5VTEwpCisgICAgICAgICAgICAgPyAodCktPnRwX3JpY2hjb21wYXJlIDogTlVMTCkKIAogLyogTWFwIHJpY2ggY29tcGFyaXNvbiBvcGVyYXRvcnMgdG8gdGhlaXIgc3dhcHBlZCB2ZXJzaW9uLCBlLmcuIExUIC0tPiBHVCAqLwogaW50IF9QeV9Td2FwcGVkT3BbXSA9IHtQeV9HVCwgUHlfR0UsIFB5X0VRLCBQeV9ORSwgUHlfTFQsIFB5X0xFfTsKQEAgLTYwMiwyOSArNjAyLDI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHJ5X3JpY2hfY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlyaWNoY21wZnVuYyBmOwotCVB5T2JqZWN0ICpyZXM7CisgICAgcmljaGNtcGZ1bmMgZjsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKHYtPm9iX3R5cGUgIT0gdy0+b2JfdHlwZSAmJgotCSAgICBQeVR5cGVfSXNTdWJ0eXBlKHctPm9iX3R5cGUsIHYtPm9iX3R5cGUpICYmCi0JICAgIChmID0gUklDSENPTVBBUkUody0+b2JfdHlwZSkpICE9IE5VTEwpIHsKLQkJcmVzID0gKCpmKSh3LCB2LCBfUHlfU3dhcHBlZE9wW29wXSk7Ci0JCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4gcmVzOwotCQlQeV9ERUNSRUYocmVzKTsKLQl9Ci0JaWYgKChmID0gUklDSENPTVBBUkUodi0+b2JfdHlwZSkpICE9IE5VTEwpIHsKLQkJcmVzID0gKCpmKSh2LCB3LCBvcCk7Ci0JCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4gcmVzOwotCQlQeV9ERUNSRUYocmVzKTsKLQl9Ci0JaWYgKChmID0gUklDSENPTVBBUkUody0+b2JfdHlwZSkpICE9IE5VTEwpIHsKLQkJcmV0dXJuICgqZikodywgdiwgX1B5X1N3YXBwZWRPcFtvcF0pOwotCX0KLQlyZXMgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKLQlQeV9JTkNSRUYocmVzKTsKLQlyZXR1cm4gcmVzOworICAgIGlmICh2LT5vYl90eXBlICE9IHctPm9iX3R5cGUgJiYKKyAgICAgICAgUHlUeXBlX0lzU3VidHlwZSh3LT5vYl90eXBlLCB2LT5vYl90eXBlKSAmJgorICAgICAgICAoZiA9IFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpKSAhPSBOVUxMKSB7CisgICAgICAgIHJlcyA9ICgqZikodywgdiwgX1B5X1N3YXBwZWRPcFtvcF0pOworICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQorICAgIGlmICgoZiA9IFJJQ0hDT01QQVJFKHYtPm9iX3R5cGUpKSAhPSBOVUxMKSB7CisgICAgICAgIHJlcyA9ICgqZikodiwgdywgb3ApOworICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQorICAgIGlmICgoZiA9IFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpKSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiAoKmYpKHcsIHYsIF9QeV9Td2FwcGVkT3Bbb3BdKTsKKyAgICB9CisgICAgcmVzID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogVHJ5IGEgZ2VudWluZSByaWNoIGNvbXBhcmlzb24sIHJldHVybmluZyBhbiBpbnQuICBSZXR1cm46CkBAIC02MzcsMjEgKzYzNywyMSBAQAogc3RhdGljIGludAogdHJ5X3JpY2hfY29tcGFyZV9ib29sKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5T2JqZWN0ICpyZXM7Ci0JaW50IG9rOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgaW50IG9rOwogCi0JaWYgKFJJQ0hDT01QQVJFKHYtPm9iX3R5cGUpID09IE5VTEwgJiYgUklDSENPTVBBUkUody0+b2JfdHlwZSkgPT0gTlVMTCkKLQkJcmV0dXJuIDI7IC8qIFNob3J0Y3V0LCBhdm9pZCBJTkNSRUYrREVDUkVGICovCi0JcmVzID0gdHJ5X3JpY2hfY29tcGFyZSh2LCB3LCBvcCk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHJlcyA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmV0dXJuIDI7Ci0JfQotCW9rID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIG9rOworICAgIGlmIChSSUNIQ09NUEFSRSh2LT5vYl90eXBlKSA9PSBOVUxMICYmIFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpID09IE5VTEwpCisgICAgICAgIHJldHVybiAyOyAvKiBTaG9ydGN1dCwgYXZvaWQgSU5DUkVGK0RFQ1JFRiAqLworICAgIHJlcyA9IHRyeV9yaWNoX2NvbXBhcmUodiwgdywgb3ApOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChyZXMgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiBvazsKIH0KIAogLyogVHJ5IHJpY2ggY29tcGFyaXNvbnMgdG8gZGV0ZXJtaW5lIGEgMy13YXkgY29tcGFyaXNvbi4gIFJldHVybjoKQEAgLTY2NCwyNyArNjY0LDI3IEBACiBzdGF0aWMgaW50CiB0cnlfcmljaF90b18zd2F5X2NvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCXN0YXRpYyBzdHJ1Y3QgeyBpbnQgb3A7IGludCBvdXRjb21lOyB9IHRyaWVzWzNdID0gewotCQkvKiBUcnkgdGhpcyBvcGVyYXRvciwgYW5kIGlmIGl0IGlzIHRydWUsIHVzZSB0aGlzIG91dGNvbWU6ICovCi0JCXtQeV9FUSwgMH0sCi0JCXtQeV9MVCwgLTF9LAotCQl7UHlfR1QsIDF9LAotCX07Ci0JaW50IGk7CisgICAgc3RhdGljIHN0cnVjdCB7IGludCBvcDsgaW50IG91dGNvbWU7IH0gdHJpZXNbM10gPSB7CisgICAgICAgIC8qIFRyeSB0aGlzIG9wZXJhdG9yLCBhbmQgaWYgaXQgaXMgdHJ1ZSwgdXNlIHRoaXMgb3V0Y29tZTogKi8KKyAgICAgICAge1B5X0VRLCAwfSwKKyAgICAgICAge1B5X0xULCAtMX0sCisgICAgICAgIHtQeV9HVCwgMX0sCisgICAgfTsKKyAgICBpbnQgaTsKIAotCWlmIChSSUNIQ09NUEFSRSh2LT5vYl90eXBlKSA9PSBOVUxMICYmIFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpID09IE5VTEwpCi0JCXJldHVybiAyOyAvKiBTaG9ydGN1dCAqLworICAgIGlmIChSSUNIQ09NUEFSRSh2LT5vYl90eXBlKSA9PSBOVUxMICYmIFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpID09IE5VTEwpCisgICAgICAgIHJldHVybiAyOyAvKiBTaG9ydGN1dCAqLwogCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlzd2l0Y2ggKHRyeV9yaWNoX2NvbXBhcmVfYm9vbCh2LCB3LCB0cmllc1tpXS5vcCkpIHsKLQkJY2FzZSAtMToKLQkJCXJldHVybiAtMjsKLQkJY2FzZSAxOgotCQkJcmV0dXJuIHRyaWVzW2ldLm91dGNvbWU7Ci0JCX0KLQl9CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBzd2l0Y2ggKHRyeV9yaWNoX2NvbXBhcmVfYm9vbCh2LCB3LCB0cmllc1tpXS5vcCkpIHsKKyAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuIHRyaWVzW2ldLm91dGNvbWU7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gMjsKKyAgICByZXR1cm4gMjsKIH0KIAogLyogVHJ5IGEgMy13YXkgY29tcGFyaXNvbiwgcmV0dXJuaW5nIGFuIGludC4gIFJldHVybjoKQEAgLTY5Nyw1NSArNjk3LDU1IEBACiBzdGF0aWMgaW50CiB0cnlfM3dheV9jb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpbnQgYzsKLQljbXBmdW5jIGY7CisgICAgaW50IGM7CisgICAgY21wZnVuYyBmOwogCi0JLyogQ29tcGFyaXNvbnMgaW52b2x2aW5nIGluc3RhbmNlcyBhcmUgZ2l2ZW4gdG8gaW5zdGFuY2VfY29tcGFyZSwKLQkgICB3aGljaCBoYXMgdGhlIHNhbWUgcmV0dXJuIGNvbnZlbnRpb25zIGFzIHRoaXMgZnVuY3Rpb24uICovCisgICAgLyogQ29tcGFyaXNvbnMgaW52b2x2aW5nIGluc3RhbmNlcyBhcmUgZ2l2ZW4gdG8gaW5zdGFuY2VfY29tcGFyZSwKKyAgICAgICB3aGljaCBoYXMgdGhlIHNhbWUgcmV0dXJuIGNvbnZlbnRpb25zIGFzIHRoaXMgZnVuY3Rpb24uICovCiAKLQlmID0gdi0+b2JfdHlwZS0+dHBfY29tcGFyZTsKLQlpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkKLQkJcmV0dXJuICgqZikodiwgdyk7Ci0JaWYgKFB5SW5zdGFuY2VfQ2hlY2sodykpCi0JCXJldHVybiAoKnctPm9iX3R5cGUtPnRwX2NvbXBhcmUpKHYsIHcpOworICAgIGYgPSB2LT5vYl90eXBlLT50cF9jb21wYXJlOworICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHYpKQorICAgICAgICByZXR1cm4gKCpmKSh2LCB3KTsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayh3KSkKKyAgICAgICAgcmV0dXJuICgqdy0+b2JfdHlwZS0+dHBfY29tcGFyZSkodiwgdyk7CiAKLQkvKiBJZiBib3RoIGhhdmUgdGhlIHNhbWUgKG5vbi1OVUxMKSB0cF9jb21wYXJlLCB1c2UgaXQuICovCi0JaWYgKGYgIT0gTlVMTCAmJiBmID09IHctPm9iX3R5cGUtPnRwX2NvbXBhcmUpIHsKLQkJYyA9ICgqZikodiwgdyk7Ci0JCXJldHVybiBhZGp1c3RfdHBfY29tcGFyZShjKTsKLQl9CisgICAgLyogSWYgYm90aCBoYXZlIHRoZSBzYW1lIChub24tTlVMTCkgdHBfY29tcGFyZSwgdXNlIGl0LiAqLworICAgIGlmIChmICE9IE5VTEwgJiYgZiA9PSB3LT5vYl90eXBlLT50cF9jb21wYXJlKSB7CisgICAgICAgIGMgPSAoKmYpKHYsIHcpOworICAgICAgICByZXR1cm4gYWRqdXN0X3RwX2NvbXBhcmUoYyk7CisgICAgfQogCi0JLyogSWYgZWl0aGVyIHRwX2NvbXBhcmUgaXMgX1B5T2JqZWN0X1Nsb3RDb21wYXJlLCB0aGF0J3Mgc2FmZS4gKi8KLQlpZiAoZiA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUgfHwKLQkgICAgdy0+b2JfdHlwZS0+dHBfY29tcGFyZSA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUpCi0JCXJldHVybiBfUHlPYmplY3RfU2xvdENvbXBhcmUodiwgdyk7CisgICAgLyogSWYgZWl0aGVyIHRwX2NvbXBhcmUgaXMgX1B5T2JqZWN0X1Nsb3RDb21wYXJlLCB0aGF0J3Mgc2FmZS4gKi8KKyAgICBpZiAoZiA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUgfHwKKyAgICAgICAgdy0+b2JfdHlwZS0+dHBfY29tcGFyZSA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUpCisgICAgICAgIHJldHVybiBfUHlPYmplY3RfU2xvdENvbXBhcmUodiwgdyk7CiAKLQkvKiBJZiB3ZSdyZSBoZXJlLCB2IGFuZCB3LAotCSAgICBhKSBhcmUgbm90IGluc3RhbmNlczsKLQkgICAgYikgaGF2ZSBkaWZmZXJlbnQgdHlwZXMgb3IgYSB0eXBlIHdpdGhvdXQgdHBfY29tcGFyZTsgYW5kCi0JICAgIGMpIGRvbid0IGhhdmUgYSB1c2VyLWRlZmluZWQgdHBfY29tcGFyZS4KLQkgICB0cF9jb21wYXJlIGltcGxlbWVudGF0aW9ucyBpbiBDIGFzc3VtZSB0aGF0IGJvdGggYXJndW1lbnRzCi0JICAgaGF2ZSB0aGVpciB0eXBlLCBzbyB3ZSBnaXZlIHVwIGlmIHRoZSBjb2VyY2lvbiBmYWlscyBvciBpZgotCSAgIGl0IHlpZWxkcyB0eXBlcyB3aGljaCBhcmUgc3RpbGwgaW5jb21wYXRpYmxlICh3aGljaCBjYW4KLQkgICBoYXBwZW4gd2l0aCBhIHVzZXItZGVmaW5lZCBuYl9jb2VyY2UpLgotCSovCi0JYyA9IFB5TnVtYmVyX0NvZXJjZUV4KCZ2LCAmdyk7Ci0JaWYgKGMgPCAwKQotCQlyZXR1cm4gLTI7Ci0JaWYgKGMgPiAwKQotCQlyZXR1cm4gMjsKLQlmID0gdi0+b2JfdHlwZS0+dHBfY29tcGFyZTsKLQlpZiAoZiAhPSBOVUxMICYmIGYgPT0gdy0+b2JfdHlwZS0+dHBfY29tcGFyZSkgewotCQljID0gKCpmKSh2LCB3KTsKLQkJUHlfREVDUkVGKHYpOwotCQlQeV9ERUNSRUYodyk7Ci0JCXJldHVybiBhZGp1c3RfdHBfY29tcGFyZShjKTsKLQl9CisgICAgLyogSWYgd2UncmUgaGVyZSwgdiBhbmQgdywKKyAgICAgICAgYSkgYXJlIG5vdCBpbnN0YW5jZXM7CisgICAgICAgIGIpIGhhdmUgZGlmZmVyZW50IHR5cGVzIG9yIGEgdHlwZSB3aXRob3V0IHRwX2NvbXBhcmU7IGFuZAorICAgICAgICBjKSBkb24ndCBoYXZlIGEgdXNlci1kZWZpbmVkIHRwX2NvbXBhcmUuCisgICAgICAgdHBfY29tcGFyZSBpbXBsZW1lbnRhdGlvbnMgaW4gQyBhc3N1bWUgdGhhdCBib3RoIGFyZ3VtZW50cworICAgICAgIGhhdmUgdGhlaXIgdHlwZSwgc28gd2UgZ2l2ZSB1cCBpZiB0aGUgY29lcmNpb24gZmFpbHMgb3IgaWYKKyAgICAgICBpdCB5aWVsZHMgdHlwZXMgd2hpY2ggYXJlIHN0aWxsIGluY29tcGF0aWJsZSAod2hpY2ggY2FuCisgICAgICAgaGFwcGVuIHdpdGggYSB1c2VyLWRlZmluZWQgbmJfY29lcmNlKS4KKyAgICAqLworICAgIGMgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOworICAgIGlmIChjIDwgMCkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIGlmIChjID4gMCkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgZiA9IHYtPm9iX3R5cGUtPnRwX2NvbXBhcmU7CisgICAgaWYgKGYgIT0gTlVMTCAmJiBmID09IHctPm9iX3R5cGUtPnRwX2NvbXBhcmUpIHsKKyAgICAgICAgYyA9ICgqZikodiwgdyk7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICByZXR1cm4gYWRqdXN0X3RwX2NvbXBhcmUoYyk7CisgICAgfQogCi0JLyogTm8gY29tcGFyaXNvbiBkZWZpbmVkICovCi0JUHlfREVDUkVGKHYpOwotCVB5X0RFQ1JFRih3KTsKLQlyZXR1cm4gMjsKKyAgICAvKiBObyBjb21wYXJpc29uIGRlZmluZWQgKi8KKyAgICBQeV9ERUNSRUYodik7CisgICAgUHlfREVDUkVGKHcpOworICAgIHJldHVybiAyOwogfQogCiAvKiBGaW5hbCBmYWxsYmFjayAzLXdheSBjb21wYXJpc29uLCByZXR1cm5pbmcgYW4gaW50LiAgUmV0dXJuOgpAQCAtNzU3LDQzICs3NTcsNDMgQEAKIHN0YXRpYyBpbnQKIGRlZmF1bHRfM3dheV9jb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpbnQgYzsKLQljb25zdCBjaGFyICp2bmFtZSwgKnduYW1lOworICAgIGludCBjOworICAgIGNvbnN0IGNoYXIgKnZuYW1lLCAqd25hbWU7CiAKLQlpZiAodi0+b2JfdHlwZSA9PSB3LT5vYl90eXBlKSB7Ci0JCS8qIFdoZW4gY29tcGFyaW5nIHRoZXNlIHBvaW50ZXJzLCB0aGV5IG11c3QgYmUgY2FzdCB0bwotCQkgKiBpbnRlZ2VyIHR5cGVzIChpLmUuIFB5X3VpbnRwdHJfdCwgb3VyIHNwZWxsaW5nIG9mIEM5WCdzCi0JCSAqIHVpbnRwdHJfdCkuICBBTlNJIHNwZWNpZmllcyB0aGF0IHBvaW50ZXIgY29tcGFyZXMgb3RoZXIKLQkJICogdGhhbiA9PSBhbmQgIT0gdG8gbm9uLXJlbGF0ZWQgc3RydWN0dXJlcyBhcmUgdW5kZWZpbmVkLgotCQkgKi8KLQkJUHlfdWludHB0cl90IHZ2ID0gKFB5X3VpbnRwdHJfdCl2OwotCQlQeV91aW50cHRyX3Qgd3cgPSAoUHlfdWludHB0cl90KXc7Ci0JCXJldHVybiAodnYgPCB3dykgPyAtMSA6ICh2diA+IHd3KSA/IDEgOiAwOwotCX0KKyAgICBpZiAodi0+b2JfdHlwZSA9PSB3LT5vYl90eXBlKSB7CisgICAgICAgIC8qIFdoZW4gY29tcGFyaW5nIHRoZXNlIHBvaW50ZXJzLCB0aGV5IG11c3QgYmUgY2FzdCB0bworICAgICAgICAgKiBpbnRlZ2VyIHR5cGVzIChpLmUuIFB5X3VpbnRwdHJfdCwgb3VyIHNwZWxsaW5nIG9mIEM5WCdzCisgICAgICAgICAqIHVpbnRwdHJfdCkuICBBTlNJIHNwZWNpZmllcyB0aGF0IHBvaW50ZXIgY29tcGFyZXMgb3RoZXIKKyAgICAgICAgICogdGhhbiA9PSBhbmQgIT0gdG8gbm9uLXJlbGF0ZWQgc3RydWN0dXJlcyBhcmUgdW5kZWZpbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgUHlfdWludHB0cl90IHZ2ID0gKFB5X3VpbnRwdHJfdCl2OworICAgICAgICBQeV91aW50cHRyX3Qgd3cgPSAoUHlfdWludHB0cl90KXc7CisgICAgICAgIHJldHVybiAodnYgPCB3dykgPyAtMSA6ICh2diA+IHd3KSA/IDEgOiAwOworICAgIH0KIAotCS8qIE5vbmUgaXMgc21hbGxlciB0aGFuIGFueXRoaW5nICovCi0JaWYgKHYgPT0gUHlfTm9uZSkKLQkJcmV0dXJuIC0xOwotCWlmICh3ID09IFB5X05vbmUpCi0JCXJldHVybiAxOworICAgIC8qIE5vbmUgaXMgc21hbGxlciB0aGFuIGFueXRoaW5nICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh3ID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiAxOwogCi0JLyogZGlmZmVyZW50IHR5cGU6IGNvbXBhcmUgdHlwZSBuYW1lczsgbnVtYmVycyBhcmUgc21hbGxlciAqLwotCWlmIChQeU51bWJlcl9DaGVjayh2KSkKLQkJdm5hbWUgPSAiIjsKLQllbHNlCi0JCXZuYW1lID0gdi0+b2JfdHlwZS0+dHBfbmFtZTsKLQlpZiAoUHlOdW1iZXJfQ2hlY2sodykpCi0JCXduYW1lID0gIiI7Ci0JZWxzZQotCQl3bmFtZSA9IHctPm9iX3R5cGUtPnRwX25hbWU7Ci0JYyA9IHN0cmNtcCh2bmFtZSwgd25hbWUpOwotCWlmIChjIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmIChjID4gMCkKLQkJcmV0dXJuIDE7Ci0JLyogU2FtZSB0eXBlIG5hbWUsIG9yIChtb3JlIGxpa2VseSkgaW5jb21wYXJhYmxlIG51bWVyaWMgdHlwZXMgKi8KLQlyZXR1cm4gKChQeV91aW50cHRyX3QpKHYtPm9iX3R5cGUpIDwgKAotCQlQeV91aW50cHRyX3QpKHctPm9iX3R5cGUpKSA/IC0xIDogMTsKKyAgICAvKiBkaWZmZXJlbnQgdHlwZTogY29tcGFyZSB0eXBlIG5hbWVzOyBudW1iZXJzIGFyZSBzbWFsbGVyICovCisgICAgaWYgKFB5TnVtYmVyX0NoZWNrKHYpKQorICAgICAgICB2bmFtZSA9ICIiOworICAgIGVsc2UKKyAgICAgICAgdm5hbWUgPSB2LT5vYl90eXBlLT50cF9uYW1lOworICAgIGlmIChQeU51bWJlcl9DaGVjayh3KSkKKyAgICAgICAgd25hbWUgPSAiIjsKKyAgICBlbHNlCisgICAgICAgIHduYW1lID0gdy0+b2JfdHlwZS0+dHBfbmFtZTsKKyAgICBjID0gc3RyY21wKHZuYW1lLCB3bmFtZSk7CisgICAgaWYgKGMgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGMgPiAwKQorICAgICAgICByZXR1cm4gMTsKKyAgICAvKiBTYW1lIHR5cGUgbmFtZSwgb3IgKG1vcmUgbGlrZWx5KSBpbmNvbXBhcmFibGUgbnVtZXJpYyB0eXBlcyAqLworICAgIHJldHVybiAoKFB5X3VpbnRwdHJfdCkodi0+b2JfdHlwZSkgPCAoCisgICAgICAgIFB5X3VpbnRwdHJfdCkody0+b2JfdHlwZSkpID8gLTEgOiAxOwogfQogCiAvKiBEbyBhIDMtd2F5IGNvbXBhcmlzb24sIGJ5IGhvb2sgb3IgYnkgY3Jvb2suICBSZXR1cm46CkBAIC04MDcsMzUgKzgwNywzNSBAQAogc3RhdGljIGludAogZG9fY21wKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpbnQgYzsKLQljbXBmdW5jIGY7CisgICAgaW50IGM7CisgICAgY21wZnVuYyBmOwogCi0JaWYgKHYtPm9iX3R5cGUgPT0gdy0+b2JfdHlwZQotCSAgICAmJiAoZiA9IHYtPm9iX3R5cGUtPnRwX2NvbXBhcmUpICE9IE5VTEwpIHsKLQkJYyA9ICgqZikodiwgdyk7Ci0JCWlmIChQeUluc3RhbmNlX0NoZWNrKHYpKSB7Ci0JCQkvKiBJbnN0YW5jZSB0cF9jb21wYXJlIGhhcyBhIGRpZmZlcmVudCBzaWduYXR1cmUuCi0JCQkgICBCdXQgaWYgaXQgcmV0dXJucyB1bmRlZmluZWQgd2UgZmFsbCB0aHJvdWdoLiAqLwotCQkJaWYgKGMgIT0gMikKLQkJCQlyZXR1cm4gYzsKLQkJCS8qIEVsc2UgZmFsbCB0aHJvdWdoIHRvIHRyeV9yaWNoX3RvXzN3YXlfY29tcGFyZSgpICovCi0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGFkanVzdF90cF9jb21wYXJlKGMpOwotCX0KLQkvKiBXZSBvbmx5IGdldCBoZXJlIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6Ci0JICAgYSkgdiBhbmQgdyBoYXZlIGRpZmZlcmVudCB0eXBlcwotCSAgIGIpIHYgYW5kIHcgaGF2ZSB0aGUgc2FtZSB0eXBlLCB3aGljaCBkb2Vzbid0IGhhdmUgdHBfY29tcGFyZQotCSAgIGMpIHYgYW5kIHcgYXJlIGluc3RhbmNlcywgYW5kIGVpdGhlciBfX2NtcF9fIGlzIG5vdCBkZWZpbmVkIG9yCi0JICAgICAgX19jbXBfXyByZXR1cm5zIE5vdEltcGxlbWVudGVkCi0JKi8KLQljID0gdHJ5X3JpY2hfdG9fM3dheV9jb21wYXJlKHYsIHcpOwotCWlmIChjIDwgMikKLQkJcmV0dXJuIGM7Ci0JYyA9IHRyeV8zd2F5X2NvbXBhcmUodiwgdyk7Ci0JaWYgKGMgPCAyKQotCQlyZXR1cm4gYzsKLQlyZXR1cm4gZGVmYXVsdF8zd2F5X2NvbXBhcmUodiwgdyk7CisgICAgaWYgKHYtPm9iX3R5cGUgPT0gdy0+b2JfdHlwZQorICAgICAgICAmJiAoZiA9IHYtPm9iX3R5cGUtPnRwX2NvbXBhcmUpICE9IE5VTEwpIHsKKyAgICAgICAgYyA9ICgqZikodiwgdyk7CisgICAgICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAvKiBJbnN0YW5jZSB0cF9jb21wYXJlIGhhcyBhIGRpZmZlcmVudCBzaWduYXR1cmUuCisgICAgICAgICAgICAgICBCdXQgaWYgaXQgcmV0dXJucyB1bmRlZmluZWQgd2UgZmFsbCB0aHJvdWdoLiAqLworICAgICAgICAgICAgaWYgKGMgIT0gMikKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIC8qIEVsc2UgZmFsbCB0aHJvdWdoIHRvIHRyeV9yaWNoX3RvXzN3YXlfY29tcGFyZSgpICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGFkanVzdF90cF9jb21wYXJlKGMpOworICAgIH0KKyAgICAvKiBXZSBvbmx5IGdldCBoZXJlIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisgICAgICAgYSkgdiBhbmQgdyBoYXZlIGRpZmZlcmVudCB0eXBlcworICAgICAgIGIpIHYgYW5kIHcgaGF2ZSB0aGUgc2FtZSB0eXBlLCB3aGljaCBkb2Vzbid0IGhhdmUgdHBfY29tcGFyZQorICAgICAgIGMpIHYgYW5kIHcgYXJlIGluc3RhbmNlcywgYW5kIGVpdGhlciBfX2NtcF9fIGlzIG5vdCBkZWZpbmVkIG9yCisgICAgICAgICAgX19jbXBfXyByZXR1cm5zIE5vdEltcGxlbWVudGVkCisgICAgKi8KKyAgICBjID0gdHJ5X3JpY2hfdG9fM3dheV9jb21wYXJlKHYsIHcpOworICAgIGlmIChjIDwgMikKKyAgICAgICAgcmV0dXJuIGM7CisgICAgYyA9IHRyeV8zd2F5X2NvbXBhcmUodiwgdyk7CisgICAgaWYgKGMgPCAyKQorICAgICAgICByZXR1cm4gYzsKKyAgICByZXR1cm4gZGVmYXVsdF8zd2F5X2NvbXBhcmUodiwgdyk7CiB9CiAKIC8qIENvbXBhcmUgdiB0byB3LiAgUmV0dXJuCkBAIC04NDgsMzcgKzg0OCwzNyBAQAogaW50CiBQeU9iamVjdF9Db21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpbnQgcmVzdWx0OworICAgIGludCByZXN1bHQ7CiAKLQlpZiAodiA9PSBOVUxMIHx8IHcgPT0gTlVMTCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodiA9PSB3KQotCQlyZXR1cm4gMDsKLQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gY21wIikpCi0JCXJldHVybiAtMTsKLQlyZXN1bHQgPSBkb19jbXAodiwgdyk7Ci0JUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JcmV0dXJuIHJlc3VsdCA8IDAgPyAtMSA6IHJlc3VsdDsKKyAgICBpZiAodiA9PSBOVUxMIHx8IHcgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodiA9PSB3KQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gY21wIikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXN1bHQgPSBkb19jbXAodiwgdyk7CisgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgcmV0dXJuIHJlc3VsdCA8IDAgPyAtMSA6IHJlc3VsdDsKIH0KIAogLyogUmV0dXJuIChuZXcgcmVmZXJlbmNlIHRvKSBQeV9UcnVlIG9yIFB5X0ZhbHNlLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGNvbnZlcnRfM3dheV90b19vYmplY3QoaW50IG9wLCBpbnQgYykKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCXN3aXRjaCAob3ApIHsKLQljYXNlIFB5X0xUOiBjID0gYyA8ICAwOyBicmVhazsKLQljYXNlIFB5X0xFOiBjID0gYyA8PSAwOyBicmVhazsKLQljYXNlIFB5X0VROiBjID0gYyA9PSAwOyBicmVhazsKLQljYXNlIFB5X05FOiBjID0gYyAhPSAwOyBicmVhazsKLQljYXNlIFB5X0dUOiBjID0gYyA+ICAwOyBicmVhazsKLQljYXNlIFB5X0dFOiBjID0gYyA+PSAwOyBicmVhazsKLQl9Ci0JcmVzdWx0ID0gYyA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUHlfTFQ6IGMgPSBjIDwgIDA7IGJyZWFrOworICAgIGNhc2UgUHlfTEU6IGMgPSBjIDw9IDA7IGJyZWFrOworICAgIGNhc2UgUHlfRVE6IGMgPSBjID09IDA7IGJyZWFrOworICAgIGNhc2UgUHlfTkU6IGMgPSBjICE9IDA7IGJyZWFrOworICAgIGNhc2UgUHlfR1Q6IGMgPSBjID4gIDA7IGJyZWFrOworICAgIGNhc2UgUHlfR0U6IGMgPSBjID49IDA7IGJyZWFrOworICAgIH0KKyAgICByZXN1bHQgPSBjID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFdlIHdhbnQgYSByaWNoIGNvbXBhcmlzb24gYnV0IGRvbid0IGhhdmUgb25lLiAgVHJ5IGEgMy13YXkgY21wIGluc3RlYWQuCkBAIC04OTAsMjUgKzg5MCwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRyeV8zd2F5X3RvX3JpY2hfY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlpbnQgYzsKKyAgICBpbnQgYzsKIAotCWMgPSB0cnlfM3dheV9jb21wYXJlKHYsIHcpOwotCWlmIChjID49IDIpIHsKKyAgICBjID0gdHJ5XzN3YXlfY29tcGFyZSh2LCB3KTsKKyAgICBpZiAoYyA+PSAyKSB7CiAKLQkJLyogUHkzSyB3YXJuaW5nIGlmIHR5cGVzIGFyZSBub3QgZXF1YWwgYW5kIGNvbXBhcmlzb24gaXNuJ3QgPT0gb3IgIT0gICovCi0JCWlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYKLQkJICAgIHYtPm9iX3R5cGUgIT0gdy0+b2JfdHlwZSAmJiBvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSAmJgotCQkgICAgUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCSAgICAgICAiY29tcGFyaW5nIHVuZXF1YWwgdHlwZXMgbm90IHN1cHBvcnRlZCAiCi0JCQkgICAgICAgImluIDMueCIsIDEpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgLyogUHkzSyB3YXJuaW5nIGlmIHR5cGVzIGFyZSBub3QgZXF1YWwgYW5kIGNvbXBhcmlzb24gaXNuJ3QgPT0gb3IgIT0gICovCisgICAgICAgIGlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYKKyAgICAgICAgICAgIHYtPm9iX3R5cGUgIT0gdy0+b2JfdHlwZSAmJiBvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSAmJgorICAgICAgICAgICAgUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhcmluZyB1bmVxdWFsIHR5cGVzIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAiaW4gMy54IiwgMSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCWMgPSBkZWZhdWx0XzN3YXlfY29tcGFyZSh2LCB3KTsKLQl9Ci0JaWYgKGMgPD0gLTIpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBjb252ZXJ0XzN3YXlfdG9fb2JqZWN0KG9wLCBjKTsKKyAgICAgICAgYyA9IGRlZmF1bHRfM3dheV9jb21wYXJlKHYsIHcpOworICAgIH0KKyAgICBpZiAoYyA8PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGNvbnZlcnRfM3dheV90b19vYmplY3Qob3AsIGMpOwogfQogCiAvKiBEbyByaWNoIGNvbXBhcmlzb24gb24gdiBhbmQgdy4gIFJldHVybgpAQCAtOTIwLDE0ICs5MjAsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb19yaWNoY21wKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCXJlcyA9IHRyeV9yaWNoX2NvbXBhcmUodiwgdywgb3ApOwotCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCXJldHVybiByZXM7Ci0JUHlfREVDUkVGKHJlcyk7CisgICAgcmVzID0gdHJ5X3JpY2hfY29tcGFyZSh2LCB3LCBvcCk7CisgICAgaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBQeV9ERUNSRUYocmVzKTsKIAotCXJldHVybiB0cnlfM3dheV90b19yaWNoX2NvbXBhcmUodiwgdywgb3ApOworICAgIHJldHVybiB0cnlfM3dheV90b19yaWNoX2NvbXBhcmUodiwgdywgb3ApOwogfQogCiAvKiBSZXR1cm46CkBAIC05MzgsNzcgKzkzOCw3NyBAQAogUHlPYmplY3QgKgogUHlPYmplY3RfUmljaENvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JYXNzZXJ0KFB5X0xUIDw9IG9wICYmIG9wIDw9IFB5X0dFKTsKLQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gY21wIikpCi0JCXJldHVybiBOVUxMOworICAgIGFzc2VydChQeV9MVCA8PSBvcCAmJiBvcCA8PSBQeV9HRSk7CisgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIGNtcCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIElmIHRoZSB0eXBlcyBhcmUgZXF1YWwsIGFuZCBub3Qgb2xkLXN0eWxlIGluc3RhbmNlcywgdHJ5IHRvCi0JICAgZ2V0IG91dCBjaGVhcCAoZG9uJ3QgYm90aGVyIHdpdGggY29lcmNpb25zIGV0Yy4pLiAqLwotCWlmICh2LT5vYl90eXBlID09IHctPm9iX3R5cGUgJiYgIVB5SW5zdGFuY2VfQ2hlY2sodikpIHsKLQkJY21wZnVuYyBmY21wOwotCQlyaWNoY21wZnVuYyBmcmljaCA9IFJJQ0hDT01QQVJFKHYtPm9iX3R5cGUpOwotCQkvKiBJZiB0aGUgdHlwZSBoYXMgcmljaGNtcCwgdHJ5IGl0IGZpcnN0LiAgdHJ5X3JpY2hfY29tcGFyZQotCQkgICB0cmllcyBpdCB0d28tc2lkZWQsIHdoaWNoIGlzIG5vdCBuZWVkZWQgc2luY2Ugd2UndmUgYQotCQkgICBzaW5nbGUgdHlwZSBvbmx5LiAqLwotCQlpZiAoZnJpY2ggIT0gTlVMTCkgewotCQkJcmVzID0gKCpmcmljaCkodiwgdywgb3ApOwotCQkJaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCQlnb3RvIERvbmU7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJfQotCQkvKiBObyByaWNoY21wLCBvciB0aGlzIHBhcnRpY3VsYXIgcmljaG1wIG5vdCBpbXBsZW1lbnRlZC4KLQkJICAgVHJ5IDMtd2F5IGNtcC4gKi8KLQkJZmNtcCA9IHYtPm9iX3R5cGUtPnRwX2NvbXBhcmU7Ci0JCWlmIChmY21wICE9IE5VTEwpIHsKLQkJCWludCBjID0gKCpmY21wKSh2LCB3KTsKLQkJCWMgPSBhZGp1c3RfdHBfY29tcGFyZShjKTsKLQkJCWlmIChjID09IC0yKSB7Ci0JCQkJcmVzID0gTlVMTDsKLQkJCQlnb3RvIERvbmU7Ci0JCQl9Ci0JCQlyZXMgPSBjb252ZXJ0XzN3YXlfdG9fb2JqZWN0KG9wLCBjKTsKLQkJCWdvdG8gRG9uZTsKLQkJfQotCX0KKyAgICAvKiBJZiB0aGUgdHlwZXMgYXJlIGVxdWFsLCBhbmQgbm90IG9sZC1zdHlsZSBpbnN0YW5jZXMsIHRyeSB0bworICAgICAgIGdldCBvdXQgY2hlYXAgKGRvbid0IGJvdGhlciB3aXRoIGNvZXJjaW9ucyBldGMuKS4gKi8KKyAgICBpZiAodi0+b2JfdHlwZSA9PSB3LT5vYl90eXBlICYmICFQeUluc3RhbmNlX0NoZWNrKHYpKSB7CisgICAgICAgIGNtcGZ1bmMgZmNtcDsKKyAgICAgICAgcmljaGNtcGZ1bmMgZnJpY2ggPSBSSUNIQ09NUEFSRSh2LT5vYl90eXBlKTsKKyAgICAgICAgLyogSWYgdGhlIHR5cGUgaGFzIHJpY2hjbXAsIHRyeSBpdCBmaXJzdC4gIHRyeV9yaWNoX2NvbXBhcmUKKyAgICAgICAgICAgdHJpZXMgaXQgdHdvLXNpZGVkLCB3aGljaCBpcyBub3QgbmVlZGVkIHNpbmNlIHdlJ3ZlIGEKKyAgICAgICAgICAgc2luZ2xlIHR5cGUgb25seS4gKi8KKyAgICAgICAgaWYgKGZyaWNoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlcyA9ICgqZnJpY2gpKHYsIHcsIG9wKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgLyogTm8gcmljaGNtcCwgb3IgdGhpcyBwYXJ0aWN1bGFyIHJpY2htcCBub3QgaW1wbGVtZW50ZWQuCisgICAgICAgICAgIFRyeSAzLXdheSBjbXAuICovCisgICAgICAgIGZjbXAgPSB2LT5vYl90eXBlLT50cF9jb21wYXJlOworICAgICAgICBpZiAoZmNtcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgYyA9ICgqZmNtcCkodiwgdyk7CisgICAgICAgICAgICBjID0gYWRqdXN0X3RwX2NvbXBhcmUoYyk7CisgICAgICAgICAgICBpZiAoYyA9PSAtMikgeworICAgICAgICAgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gY29udmVydF8zd2F5X3RvX29iamVjdChvcCwgYyk7CisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBGYXN0IHBhdGggbm90IHRha2VuLCBvciBjb3VsZG4ndCBkZWxpdmVyIGEgdXNlZnVsIHJlc3VsdC4gKi8KLQlyZXMgPSBkb19yaWNoY21wKHYsIHcsIG9wKTsKKyAgICAvKiBGYXN0IHBhdGggbm90IHRha2VuLCBvciBjb3VsZG4ndCBkZWxpdmVyIGEgdXNlZnVsIHJlc3VsdC4gKi8KKyAgICByZXMgPSBkb19yaWNoY21wKHYsIHcsIG9wKTsKIERvbmU6Ci0JUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAvKiBSZXR1cm4gLTEgaWYgZXJyb3I7IDEgaWYgdiBvcCB3OyAwIGlmIG5vdCAodiBvcCB3KS4gKi8KIGludAogUHlPYmplY3RfUmljaENvbXBhcmVCb29sKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5T2JqZWN0ICpyZXM7Ci0JaW50IG9rOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgaW50IG9rOwogCi0JLyogUXVpY2sgcmVzdWx0IHdoZW4gb2JqZWN0cyBhcmUgdGhlIHNhbWUuCi0JICAgR3VhcmFudGVlcyB0aGF0IGlkZW50aXR5IGltcGxpZXMgZXF1YWxpdHkuICovCi0JaWYgKHYgPT0gdykgewotCQlpZiAob3AgPT0gUHlfRVEpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZSBpZiAob3AgPT0gUHlfTkUpCi0JCQlyZXR1cm4gMDsKLQl9CisgICAgLyogUXVpY2sgcmVzdWx0IHdoZW4gb2JqZWN0cyBhcmUgdGhlIHNhbWUuCisgICAgICAgR3VhcmFudGVlcyB0aGF0IGlkZW50aXR5IGltcGxpZXMgZXF1YWxpdHkuICovCisgICAgaWYgKHYgPT0gdykgeworICAgICAgICBpZiAob3AgPT0gUHlfRVEpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgZWxzZSBpZiAob3AgPT0gUHlfTkUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlyZXMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZSh2LCB3LCBvcCk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKFB5Qm9vbF9DaGVjayhyZXMpKQotCQlvayA9IChyZXMgPT0gUHlfVHJ1ZSk7Ci0JZWxzZQotCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiBvazsKKyAgICByZXMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZSh2LCB3LCBvcCk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFB5Qm9vbF9DaGVjayhyZXMpKQorICAgICAgICBvayA9IChyZXMgPT0gUHlfVHJ1ZSk7CisgICAgZWxzZQorICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiBvazsKIH0KIAogLyogU2V0IG9mIGhhc2ggdXRpbGl0eSBmdW5jdGlvbnMgdG8gaGVscCBtYWludGFpbmluZyB0aGUgaW52YXJpYW50IHRoYXQKLQlpZiBhPT1iIHRoZW4gaGFzaChhKT09aGFzaChiKQorICAgIGlmIGE9PWIgdGhlbiBoYXNoKGEpPT1oYXNoKGIpCiAKICAgIEFsbCB0aGUgdXRpbGl0eSBmdW5jdGlvbnMgKF9QeV9IYXNoKigpKSByZXR1cm4gIi0xIiB0byBzaWduaWZ5IGFuIGVycm9yLgogKi8KQEAgLTEwMTYsMjUyICsxMDE2LDI1MiBAQAogbG9uZwogX1B5X0hhc2hEb3VibGUoZG91YmxlIHYpCiB7Ci0JZG91YmxlIGludHBhcnQsIGZyYWN0cGFydDsKLQlpbnQgZXhwbzsKLQlsb25nIGhpcGFydDsKLQlsb25nIHg7CQkvKiB0aGUgZmluYWwgaGFzaCB2YWx1ZSAqLwotCS8qIFRoaXMgaXMgZGVzaWduZWQgc28gdGhhdCBQeXRob24gbnVtYmVycyBvZiBkaWZmZXJlbnQgdHlwZXMKLQkgKiB0aGF0IGNvbXBhcmUgZXF1YWwgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZTsgb3RoZXJ3aXNlIGNvbXBhcmlzb25zCi0JICogb2YgbWFwcGluZyBrZXlzIHdpbGwgdHVybiBvdXQgd2VpcmQuCi0JICovCisgICAgZG91YmxlIGludHBhcnQsIGZyYWN0cGFydDsKKyAgICBpbnQgZXhwbzsKKyAgICBsb25nIGhpcGFydDsKKyAgICBsb25nIHg7ICAgICAgICAgICAgIC8qIHRoZSBmaW5hbCBoYXNoIHZhbHVlICovCisgICAgLyogVGhpcyBpcyBkZXNpZ25lZCBzbyB0aGF0IFB5dGhvbiBudW1iZXJzIG9mIGRpZmZlcmVudCB0eXBlcworICAgICAqIHRoYXQgY29tcGFyZSBlcXVhbCBoYXNoIHRvIHRoZSBzYW1lIHZhbHVlOyBvdGhlcndpc2UgY29tcGFyaXNvbnMKKyAgICAgKiBvZiBtYXBwaW5nIGtleXMgd2lsbCB0dXJuIG91dCB3ZWlyZC4KKyAgICAgKi8KIAotCWlmICghUHlfSVNfRklOSVRFKHYpKSB7Ci0JCWlmIChQeV9JU19JTkZJTklUWSh2KSkKLQkJCXJldHVybiB2IDwgMCA/IC0yNzE4MjggOiAzMTQxNTk7Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCX0KLQlmcmFjdHBhcnQgPSBtb2RmKHYsICZpbnRwYXJ0KTsKLQlpZiAoZnJhY3RwYXJ0ID09IDAuMCkgewotCQkvKiBUaGlzIG11c3QgcmV0dXJuIHRoZSBzYW1lIGhhc2ggYXMgYW4gZXF1YWwgaW50IG9yIGxvbmcuICovCi0JCWlmIChpbnRwYXJ0ID4gTE9OR19NQVgvMiB8fCAtaW50cGFydCA+IExPTkdfTUFYLzIpIHsKLQkJCS8qIENvbnZlcnQgdG8gbG9uZyBhbmQgdXNlIGl0cyBoYXNoLiAqLwotCQkJUHlPYmplY3QgKnBsb25nOwkvKiBjb252ZXJ0ZWQgdG8gUHl0aG9uIGxvbmcgKi8KLQkJCXBsb25nID0gUHlMb25nX0Zyb21Eb3VibGUodik7Ci0JCQlpZiAocGxvbmcgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQl4ID0gUHlPYmplY3RfSGFzaChwbG9uZyk7Ci0JCQlQeV9ERUNSRUYocGxvbmcpOwotCQkJcmV0dXJuIHg7Ci0JCX0KLQkJLyogRml0cyBpbiBhIEMgbG9uZyA9PSBhIFB5dGhvbiBpbnQsIHNvIGlzIGl0cyBvd24gaGFzaC4gKi8KLQkJeCA9IChsb25nKWludHBhcnQ7Ci0JCWlmICh4ID09IC0xKQotCQkJeCA9IC0yOwotCQlyZXR1cm4geDsKLQl9Ci0JLyogVGhlIGZyYWN0aW9uYWwgcGFydCBpcyBub24temVybywgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dAotCSAqIG1ha2luZyB0aGlzIG1hdGNoIHRoZSBoYXNoIG9mIHNvbWUgb3RoZXIgdHlwZS4KLQkgKiBVc2UgZnJleHAgdG8gZ2V0IGF0IHRoZSBiaXRzIGluIHRoZSBkb3VibGUuCi0JICogU2luY2UgdGhlIFZBWCBEIGRvdWJsZSBmb3JtYXQgaGFzIDU2IG1hbnRpc3NhIGJpdHMsIHdoaWNoIGlzIHRoZQotCSAqIG1vc3Qgb2YgYW55IGRvdWJsZSBmb3JtYXQgaW4gdXNlLCBlYWNoIG9mIHRoZXNlIHBhcnRzIG1heSBoYXZlIGFzCi0JICogbWFueSBhcyAoYnV0IG5vIG1vcmUgdGhhbikgNTYgc2lnbmlmaWNhbnQgYml0cy4KLQkgKiBTbywgYXNzdW1pbmcgc2l6ZW9mKGxvbmcpID49IDQsIGVhY2ggcGFydCBjYW4gYmUgYnJva2VuIGludG8gdHdvCi0JICogbG9uZ3M7IGZyZXhwIGFuZCBtdWx0aXBsaWNhdGlvbiBhcmUgdXNlZCB0byBkbyB0aGF0LgotCSAqIEFsc28sIHNpbmNlIHRoZSBDcmF5IGRvdWJsZSBmb3JtYXQgaGFzIDE1IGV4cG9uZW50IGJpdHMsIHdoaWNoIGlzCi0JICogdGhlIG1vc3Qgb2YgYW55IGRvdWJsZSBmb3JtYXQgaW4gdXNlLCBzaGlmdGluZyB0aGUgZXhwb25lbnQgZmllbGQKLQkgKiBsZWZ0IGJ5IDE1IHdvbid0IG92ZXJmbG93IGEgbG9uZyAoYWdhaW4gYXNzdW1pbmcgc2l6ZW9mKGxvbmcpID49IDQpLgotCSAqLwotCXYgPSBmcmV4cCh2LCAmZXhwbyk7Ci0JdiAqPSAyMTQ3NDgzNjQ4LjA7CS8qIDIqKjMxICovCi0JaGlwYXJ0ID0gKGxvbmcpdjsJLyogdGFrZSB0aGUgdG9wIDMyIGJpdHMgKi8KLQl2ID0gKHYgLSAoZG91YmxlKWhpcGFydCkgKiAyMTQ3NDgzNjQ4LjA7IC8qIGdldCB0aGUgbmV4dCAzMiBiaXRzICovCi0JeCA9IGhpcGFydCArIChsb25nKXYgKyAoZXhwbyA8PCAxNSk7Ci0JaWYgKHggPT0gLTEpCi0JCXggPSAtMjsKLQlyZXR1cm4geDsKKyAgICBpZiAoIVB5X0lTX0ZJTklURSh2KSkgeworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkodikpCisgICAgICAgICAgICByZXR1cm4gdiA8IDAgPyAtMjcxODI4IDogMzE0MTU5OworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZnJhY3RwYXJ0ID0gbW9kZih2LCAmaW50cGFydCk7CisgICAgaWYgKGZyYWN0cGFydCA9PSAwLjApIHsKKyAgICAgICAgLyogVGhpcyBtdXN0IHJldHVybiB0aGUgc2FtZSBoYXNoIGFzIGFuIGVxdWFsIGludCBvciBsb25nLiAqLworICAgICAgICBpZiAoaW50cGFydCA+IExPTkdfTUFYLzIgfHwgLWludHBhcnQgPiBMT05HX01BWC8yKSB7CisgICAgICAgICAgICAvKiBDb252ZXJ0IHRvIGxvbmcgYW5kIHVzZSBpdHMgaGFzaC4gKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpwbG9uZzsgICAgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRlZCB0byBQeXRob24gbG9uZyAqLworICAgICAgICAgICAgcGxvbmcgPSBQeUxvbmdfRnJvbURvdWJsZSh2KTsKKyAgICAgICAgICAgIGlmIChwbG9uZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHggPSBQeU9iamVjdF9IYXNoKHBsb25nKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwbG9uZyk7CisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgfQorICAgICAgICAvKiBGaXRzIGluIGEgQyBsb25nID09IGEgUHl0aG9uIGludCwgc28gaXMgaXRzIG93biBoYXNoLiAqLworICAgICAgICB4ID0gKGxvbmcpaW50cGFydDsKKyAgICAgICAgaWYgKHggPT0gLTEpCisgICAgICAgICAgICB4ID0gLTI7CisgICAgICAgIHJldHVybiB4OworICAgIH0KKyAgICAvKiBUaGUgZnJhY3Rpb25hbCBwYXJ0IGlzIG5vbi16ZXJvLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0CisgICAgICogbWFraW5nIHRoaXMgbWF0Y2ggdGhlIGhhc2ggb2Ygc29tZSBvdGhlciB0eXBlLgorICAgICAqIFVzZSBmcmV4cCB0byBnZXQgYXQgdGhlIGJpdHMgaW4gdGhlIGRvdWJsZS4KKyAgICAgKiBTaW5jZSB0aGUgVkFYIEQgZG91YmxlIGZvcm1hdCBoYXMgNTYgbWFudGlzc2EgYml0cywgd2hpY2ggaXMgdGhlCisgICAgICogbW9zdCBvZiBhbnkgZG91YmxlIGZvcm1hdCBpbiB1c2UsIGVhY2ggb2YgdGhlc2UgcGFydHMgbWF5IGhhdmUgYXMKKyAgICAgKiBtYW55IGFzIChidXQgbm8gbW9yZSB0aGFuKSA1NiBzaWduaWZpY2FudCBiaXRzLgorICAgICAqIFNvLCBhc3N1bWluZyBzaXplb2YobG9uZykgPj0gNCwgZWFjaCBwYXJ0IGNhbiBiZSBicm9rZW4gaW50byB0d28KKyAgICAgKiBsb25nczsgZnJleHAgYW5kIG11bHRpcGxpY2F0aW9uIGFyZSB1c2VkIHRvIGRvIHRoYXQuCisgICAgICogQWxzbywgc2luY2UgdGhlIENyYXkgZG91YmxlIGZvcm1hdCBoYXMgMTUgZXhwb25lbnQgYml0cywgd2hpY2ggaXMKKyAgICAgKiB0aGUgbW9zdCBvZiBhbnkgZG91YmxlIGZvcm1hdCBpbiB1c2UsIHNoaWZ0aW5nIHRoZSBleHBvbmVudCBmaWVsZAorICAgICAqIGxlZnQgYnkgMTUgd29uJ3Qgb3ZlcmZsb3cgYSBsb25nIChhZ2FpbiBhc3N1bWluZyBzaXplb2YobG9uZykgPj0gNCkuCisgICAgICovCisgICAgdiA9IGZyZXhwKHYsICZleHBvKTsKKyAgICB2ICo9IDIxNDc0ODM2NDguMDsgICAgICAgICAgLyogMioqMzEgKi8KKyAgICBoaXBhcnQgPSAobG9uZyl2OyAgICAgICAgICAgLyogdGFrZSB0aGUgdG9wIDMyIGJpdHMgKi8KKyAgICB2ID0gKHYgLSAoZG91YmxlKWhpcGFydCkgKiAyMTQ3NDgzNjQ4LjA7IC8qIGdldCB0aGUgbmV4dCAzMiBiaXRzICovCisgICAgeCA9IGhpcGFydCArIChsb25nKXYgKyAoZXhwbyA8PCAxNSk7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHggPSAtMjsKKyAgICByZXR1cm4geDsKIH0KIAogbG9uZwogX1B5X0hhc2hQb2ludGVyKHZvaWQgKnApCiB7Ci0JbG9uZyB4OwotCXNpemVfdCB5ID0gKHNpemVfdClwOwotCS8qIGJvdHRvbSAzIG9yIDQgYml0cyBhcmUgbGlrZWx5IHRvIGJlIDA7IHJvdGF0ZSB5IGJ5IDQgdG8gYXZvaWQKLQkgICBleGNlc3NpdmUgaGFzaCBjb2xsaXNpb25zIGZvciBkaWN0cyBhbmQgc2V0cyAqLwotCXkgPSAoeSA+PiA0KSB8ICh5IDw8ICg4ICogU0laRU9GX1ZPSURfUCAtIDQpKTsKLQl4ID0gKGxvbmcpeTsKLQlpZiAoeCA9PSAtMSkKLQkJeCA9IC0yOwotCXJldHVybiB4OworICAgIGxvbmcgeDsKKyAgICBzaXplX3QgeSA9IChzaXplX3QpcDsKKyAgICAvKiBib3R0b20gMyBvciA0IGJpdHMgYXJlIGxpa2VseSB0byBiZSAwOyByb3RhdGUgeSBieSA0IHRvIGF2b2lkCisgICAgICAgZXhjZXNzaXZlIGhhc2ggY29sbGlzaW9ucyBmb3IgZGljdHMgYW5kIHNldHMgKi8KKyAgICB5ID0gKHkgPj4gNCkgfCAoeSA8PCAoOCAqIFNJWkVPRl9WT0lEX1AgLSA0KSk7CisgICAgeCA9IChsb25nKXk7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHggPSAtMjsKKyAgICByZXR1cm4geDsKIH0KIAogbG9uZwogUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKFB5T2JqZWN0ICpzZWxmKQogewotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJ1bmhhc2hhYmxlIHR5cGU6ICclLjIwMHMnIiwKLQkJICAgICBzZWxmLT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInVuaGFzaGFibGUgdHlwZTogJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICBzZWxmLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIGxvbmcKIFB5T2JqZWN0X0hhc2goUHlPYmplY3QgKnYpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IHYtPm9iX3R5cGU7Ci0JaWYgKHRwLT50cF9oYXNoICE9IE5VTEwpCi0JCXJldHVybiAoKnRwLT50cF9oYXNoKSh2KTsKLQkvKiBUbyBrZWVwIHRvIHRoZSBnZW5lcmFsIHByYWN0aWNlIHRoYXQgaW5oZXJpdGluZwotCSAqIHNvbGVseSBmcm9tIG9iamVjdCBpbiBDIGNvZGUgc2hvdWxkIHdvcmsgd2l0aG91dAotCSAqIGFuIGV4cGxpY2l0IGNhbGwgdG8gUHlUeXBlX1JlYWR5LCB3ZSBpbXBsaWNpdGx5IGNhbGwKLQkgKiBQeVR5cGVfUmVhZHkgaGVyZSBhbmQgdGhlbiBjaGVjayB0aGUgdHBfaGFzaCBzbG90IGFnYWluCi0JICovCi0JaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJaWYgKFB5VHlwZV9SZWFkeSh0cCkgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlpZiAodHAtPnRwX2hhc2ggIT0gTlVMTCkKLQkJCXJldHVybiAoKnRwLT50cF9oYXNoKSh2KTsKLQl9Ci0JaWYgKHRwLT50cF9jb21wYXJlID09IE5VTEwgJiYgUklDSENPTVBBUkUodHApID09IE5VTEwpIHsKLQkJcmV0dXJuIF9QeV9IYXNoUG9pbnRlcih2KTsgLyogVXNlIGFkZHJlc3MgYXMgaGFzaCB2YWx1ZSAqLwotCX0KLQkvKiBJZiB0aGVyZSdzIGEgY21wIGJ1dCBubyBoYXNoIGRlZmluZWQsIHRoZSBvYmplY3QgY2FuJ3QgYmUgaGFzaGVkICovCi0JcmV0dXJuIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCh2KTsKKyAgICBQeVR5cGVPYmplY3QgKnRwID0gdi0+b2JfdHlwZTsKKyAgICBpZiAodHAtPnRwX2hhc2ggIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICgqdHAtPnRwX2hhc2gpKHYpOworICAgIC8qIFRvIGtlZXAgdG8gdGhlIGdlbmVyYWwgcHJhY3RpY2UgdGhhdCBpbmhlcml0aW5nCisgICAgICogc29sZWx5IGZyb20gb2JqZWN0IGluIEMgY29kZSBzaG91bGQgd29yayB3aXRob3V0CisgICAgICogYW4gZXhwbGljaXQgY2FsbCB0byBQeVR5cGVfUmVhZHksIHdlIGltcGxpY2l0bHkgY2FsbAorICAgICAqIFB5VHlwZV9SZWFkeSBoZXJlIGFuZCB0aGVuIGNoZWNrIHRoZSB0cF9oYXNoIHNsb3QgYWdhaW4KKyAgICAgKi8KKyAgICBpZiAodHAtPnRwX2RpY3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHRwKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICh0cC0+dHBfaGFzaCAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuICgqdHAtPnRwX2hhc2gpKHYpOworICAgIH0KKyAgICBpZiAodHAtPnRwX2NvbXBhcmUgPT0gTlVMTCAmJiBSSUNIQ09NUEFSRSh0cCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gX1B5X0hhc2hQb2ludGVyKHYpOyAvKiBVc2UgYWRkcmVzcyBhcyBoYXNoIHZhbHVlICovCisgICAgfQorICAgIC8qIElmIHRoZXJlJ3MgYSBjbXAgYnV0IG5vIGhhc2ggZGVmaW5lZCwgdGhlIG9iamVjdCBjYW4ndCBiZSBoYXNoZWQgKi8KKyAgICByZXR1cm4gUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKHYpOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKFB5T2JqZWN0ICp2LCBjb25zdCBjaGFyICpuYW1lKQogewotCVB5T2JqZWN0ICp3LCAqcmVzOworICAgIFB5T2JqZWN0ICp3LCAqcmVzOwogCi0JaWYgKFB5X1RZUEUodiktPnRwX2dldGF0dHIgIT0gTlVMTCkKLQkJcmV0dXJuICgqUHlfVFlQRSh2KS0+dHBfZ2V0YXR0cikodiwgKGNoYXIqKW5hbWUpOwotCXcgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKG5hbWUpOwotCWlmICh3ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9IFB5T2JqZWN0X0dldEF0dHIodiwgdyk7Ci0JUHlfWERFQ1JFRih3KTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChQeV9UWVBFKHYpLT50cF9nZXRhdHRyICE9IE5VTEwpCisgICAgICAgIHJldHVybiAoKlB5X1RZUEUodiktPnRwX2dldGF0dHIpKHYsIChjaGFyKiluYW1lKTsKKyAgICB3ID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhuYW1lKTsKKyAgICBpZiAodyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIHcpOworICAgIFB5X1hERUNSRUYodyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogaW50CiBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKFB5T2JqZWN0ICp2LCBjb25zdCBjaGFyICpuYW1lKQogewotCVB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsIG5hbWUpOwotCWlmIChyZXMgIT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmV0dXJuIDE7Ci0JfQotCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgbmFtZSk7CisgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKFB5T2JqZWN0ICp2LCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdykKIHsKLQlQeU9iamVjdCAqczsKLQlpbnQgcmVzOworICAgIFB5T2JqZWN0ICpzOworICAgIGludCByZXM7CiAKLQlpZiAoUHlfVFlQRSh2KS0+dHBfc2V0YXR0ciAhPSBOVUxMKQotCQlyZXR1cm4gKCpQeV9UWVBFKHYpLT50cF9zZXRhdHRyKSh2LCAoY2hhciopbmFtZSwgdyk7Ci0JcyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobmFtZSk7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IFB5T2JqZWN0X1NldEF0dHIodiwgcywgdyk7Ci0JUHlfWERFQ1JFRihzKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChQeV9UWVBFKHYpLT50cF9zZXRhdHRyICE9IE5VTEwpCisgICAgICAgIHJldHVybiAoKlB5X1RZUEUodiktPnRwX3NldGF0dHIpKHYsIChjaGFyKiluYW1lLCB3KTsKKyAgICBzID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhuYW1lKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gUHlPYmplY3RfU2V0QXR0cih2LCBzLCB3KTsKKyAgICBQeV9YREVDUkVGKHMpOworICAgIHJldHVybiByZXM7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0dldEF0dHIoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKHYpOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKHYpOwogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCS8qIFRoZSBVbmljb2RlIHRvIHN0cmluZyBjb252ZXJzaW9uIGlzIGRvbmUgaGVyZSBiZWNhdXNlIHRoZQotCQkgICBleGlzdGluZyB0cF9nZXRhdHRybyBzbG90cyBleHBlY3QgYSBzdHJpbmcgb2JqZWN0IGFzIG5hbWUKLQkJICAgYW5kIHdlIHdvdWxkbid0IHdhbnQgdG8gYnJlYWsgdGhvc2UuICovCi0JCWlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKLQkJCW5hbWUgPSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcobmFtZSwgTlVMTCk7Ci0JCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVsc2UKKyAgICAgICAgLyogVGhlIFVuaWNvZGUgdG8gc3RyaW5nIGNvbnZlcnNpb24gaXMgZG9uZSBoZXJlIGJlY2F1c2UgdGhlCisgICAgICAgICAgIGV4aXN0aW5nIHRwX2dldGF0dHJvIHNsb3RzIGV4cGVjdCBhIHN0cmluZyBvYmplY3QgYXMgbmFtZQorICAgICAgICAgICBhbmQgd2Ugd291bGRuJ3Qgd2FudCB0byBicmVhayB0aG9zZS4gKi8KKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgeworICAgICAgICAgICAgbmFtZSA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQogI2VuZGlmCi0JCXsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCi0JCQkJICAgICBQeV9UWVBFKG5hbWUpLT50cF9uYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWlmICh0cC0+dHBfZ2V0YXR0cm8gIT0gTlVMTCkKLQkJcmV0dXJuICgqdHAtPnRwX2dldGF0dHJvKSh2LCBuYW1lKTsKLQlpZiAodHAtPnRwX2dldGF0dHIgIT0gTlVMTCkKLQkJcmV0dXJuICgqdHAtPnRwX2dldGF0dHIpKHYsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkgICAgICInJS41MHMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKLQkJICAgICB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShuYW1lKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodHAtPnRwX2dldGF0dHJvICE9IE5VTEwpCisgICAgICAgIHJldHVybiAoKnRwLT50cF9nZXRhdHRybykodiwgbmFtZSk7CisgICAgaWYgKHRwLT50cF9nZXRhdHRyICE9IE5VTEwpCisgICAgICAgIHJldHVybiAoKnRwLT50cF9nZXRhdHRyKSh2LCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIiclLjUwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogaW50CiBQeU9iamVjdF9IYXNBdHRyKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeU9iamVjdCAqcmVzID0gUHlPYmplY3RfR2V0QXR0cih2LCBuYW1lKTsKLQlpZiAocmVzICE9IE5VTEwpIHsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiAxOwotCX0KLQlQeUVycl9DbGVhcigpOwotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOworICAgIGlmIChyZXMgIT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlPYmplY3RfU2V0QXR0cihQeU9iamVjdCAqdiwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeVR5cGVPYmplY3QgKnRwID0gUHlfVFlQRSh2KTsKLQlpbnQgZXJyOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKHYpOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKXsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKXsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCS8qIFRoZSBVbmljb2RlIHRvIHN0cmluZyBjb252ZXJzaW9uIGlzIGRvbmUgaGVyZSBiZWNhdXNlIHRoZQotCQkgICBleGlzdGluZyB0cF9zZXRhdHRybyBzbG90cyBleHBlY3QgYSBzdHJpbmcgb2JqZWN0IGFzIG5hbWUKLQkJICAgYW5kIHdlIHdvdWxkbid0IHdhbnQgdG8gYnJlYWsgdGhvc2UuICovCi0JCWlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKLQkJCW5hbWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwsIE5VTEwpOwotCQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQorICAgICAgICAvKiBUaGUgVW5pY29kZSB0byBzdHJpbmcgY29udmVyc2lvbiBpcyBkb25lIGhlcmUgYmVjYXVzZSB0aGUKKyAgICAgICAgICAgZXhpc3RpbmcgdHBfc2V0YXR0cm8gc2xvdHMgZXhwZWN0IGEgc3RyaW5nIG9iamVjdCBhcyBuYW1lCisgICAgICAgICAgIGFuZCB3ZSB3b3VsZG4ndCB3YW50IHRvIGJyZWFrIHRob3NlLiAqLworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7CisgICAgICAgICAgICBuYW1lID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZgotCQl7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJyUuMjAwcyciLAotCQkJCSAgICAgUHlfVFlQRShuYW1lKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZWxzZQotCQlQeV9JTkNSRUYobmFtZSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUobmFtZSktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKG5hbWUpOwogCi0JUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmbmFtZSk7Ci0JaWYgKHRwLT50cF9zZXRhdHRybyAhPSBOVUxMKSB7Ci0JCWVyciA9ICgqdHAtPnRwX3NldGF0dHJvKSh2LCBuYW1lLCB2YWx1ZSk7Ci0JCVB5X0RFQ1JFRihuYW1lKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKHRwLT50cF9zZXRhdHRyICE9IE5VTEwpIHsKLQkJZXJyID0gKCp0cC0+dHBfc2V0YXR0cikodiwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLCB2YWx1ZSk7Ci0JCVB5X0RFQ1JFRihuYW1lKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JUHlfREVDUkVGKG5hbWUpOwotCWlmICh0cC0+dHBfZ2V0YXR0ciA9PSBOVUxMICYmIHRwLT50cF9nZXRhdHRybyA9PSBOVUxMKQotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJyUuMTAwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGVzICIKLQkJCSAgICAgIiglcyAuJS4xMDBzKSIsCi0JCQkgICAgIHRwLT50cF9uYW1lLAotCQkJICAgICB2YWx1ZT09TlVMTCA/ICJkZWwiIDogImFzc2lnbiB0byIsCi0JCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JZWxzZQotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJyUuMTAwcycgb2JqZWN0IGhhcyBvbmx5IHJlYWQtb25seSBhdHRyaWJ1dGVzICIKLQkJCSAgICAgIiglcyAuJS4xMDBzKSIsCi0JCQkgICAgIHRwLT50cF9uYW1lLAotCQkJICAgICB2YWx1ZT09TlVMTCA/ICJkZWwiIDogImFzc2lnbiB0byIsCi0JCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JcmV0dXJuIC0xOworICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJm5hbWUpOworICAgIGlmICh0cC0+dHBfc2V0YXR0cm8gIT0gTlVMTCkgeworICAgICAgICBlcnIgPSAoKnRwLT50cF9zZXRhdHRybykodiwgbmFtZSwgdmFsdWUpOworICAgICAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmICh0cC0+dHBfc2V0YXR0ciAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9ICgqdHAtPnRwX3NldGF0dHIpKHYsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgdmFsdWUpOworICAgICAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICBpZiAodHAtPnRwX2dldGF0dHIgPT0gTlVMTCAmJiB0cC0+dHBfZ2V0YXR0cm8gPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgIiglcyAuJS4xMDBzKSIsCisgICAgICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlPT1OVUxMID8gImRlbCIgOiAiYXNzaWduIHRvIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CisgICAgZWxzZQorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclLjEwMHMnIG9iamVjdCBoYXMgb25seSByZWFkLW9ubHkgYXR0cmlidXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAiKCVzIC4lLjEwMHMpIiwKKyAgICAgICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgdmFsdWU9PU5VTEwgPyAiZGVsIiA6ICJhc3NpZ24gdG8iLAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIEhlbHBlciB0byBnZXQgYSBwb2ludGVyIHRvIGFuIG9iamVjdCdzIF9fZGljdF9fIHNsb3QsIGlmIGFueSAqLwpAQCAtMTI2OSwzNSArMTI2OSwzNSBAQAogUHlPYmplY3QgKioKIF9QeU9iamVjdF9HZXREaWN0UHRyKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlfc3NpemVfdCBkaWN0b2Zmc2V0OwotCVB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKG9iaik7CisgICAgUHlfc3NpemVfdCBkaWN0b2Zmc2V0OworICAgIFB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKG9iaik7CiAKLQlpZiAoISh0cC0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKQotCQlyZXR1cm4gTlVMTDsKLQlkaWN0b2Zmc2V0ID0gdHAtPnRwX2RpY3RvZmZzZXQ7Ci0JaWYgKGRpY3RvZmZzZXQgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRpY3RvZmZzZXQgPCAwKSB7Ci0JCVB5X3NzaXplX3QgdHNpemU7Ci0JCXNpemVfdCBzaXplOworICAgIGlmICghKHRwLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRpY3RvZmZzZXQgPSB0cC0+dHBfZGljdG9mZnNldDsKKyAgICBpZiAoZGljdG9mZnNldCA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZGljdG9mZnNldCA8IDApIHsKKyAgICAgICAgUHlfc3NpemVfdCB0c2l6ZTsKKyAgICAgICAgc2l6ZV90IHNpemU7CiAKLQkJdHNpemUgPSAoKFB5VmFyT2JqZWN0ICopb2JqKS0+b2Jfc2l6ZTsKLQkJaWYgKHRzaXplIDwgMCkKLQkJCXRzaXplID0gLXRzaXplOwotCQlzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHRwLCB0c2l6ZSk7CisgICAgICAgIHRzaXplID0gKChQeVZhck9iamVjdCAqKW9iaiktPm9iX3NpemU7CisgICAgICAgIGlmICh0c2l6ZSA8IDApCisgICAgICAgICAgICB0c2l6ZSA9IC10c2l6ZTsKKyAgICAgICAgc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRSh0cCwgdHNpemUpOwogCi0JCWRpY3RvZmZzZXQgKz0gKGxvbmcpc2l6ZTsKLQkJYXNzZXJ0KGRpY3RvZmZzZXQgPiAwKTsKLQkJYXNzZXJ0KGRpY3RvZmZzZXQgJSBTSVpFT0ZfVk9JRF9QID09IDApOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICoqKSAoKGNoYXIgKilvYmogKyBkaWN0b2Zmc2V0KTsKKyAgICAgICAgZGljdG9mZnNldCArPSAobG9uZylzaXplOworICAgICAgICBhc3NlcnQoZGljdG9mZnNldCA+IDApOworICAgICAgICBhc3NlcnQoZGljdG9mZnNldCAlIFNJWkVPRl9WT0lEX1AgPT0gMCk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiopICgoY2hhciAqKW9iaiArIGRpY3RvZmZzZXQpOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9TZWxmSXRlcihQeU9iamVjdCAqb2JqKQogewotCVB5X0lOQ1JFRihvYmopOwotCXJldHVybiBvYmo7CisgICAgUHlfSU5DUkVGKG9iaik7CisgICAgcmV0dXJuIG9iajsKIH0KIAogLyogSGVscGVyIHVzZWQgd2hlbiB0aGUgX19uZXh0X18gbWV0aG9kIGlzIHJlbW92ZWQgZnJvbSBhIHR5cGU6CkBAIC0xMzA4LDEwICsxMzA4LDEwIEBACiBQeU9iamVjdCAqCiBfUHlPYmplY3RfTmV4dE5vdEltcGxlbWVudGVkKFB5T2JqZWN0ICpzZWxmKQogewotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgIiclLjIwMHMnIG9iamVjdCBpcyBub3QgaXRlcmFibGUiLAotCQkgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICInJS4yMDBzJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIEdlbmVyaWMgR2V0QXR0ciBmdW5jdGlvbnMgLSBwdXQgdGhlc2UgaW4geW91ciB0cF9bZ3NdZXRhdHRybyBzbG90ICovCkBAIC0xMzE5LDIyMSArMTMxOSwyMjEgQEAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICpuYW1lKQogewotCVB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKG9iaik7Ci0JUHlPYmplY3QgKmRlc2NyID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlkZXNjcmdldGZ1bmMgZjsKLQlQeV9zc2l6ZV90IGRpY3RvZmZzZXQ7Ci0JUHlPYmplY3QgKipkaWN0cHRyOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKG9iaik7CisgICAgUHlPYmplY3QgKmRlc2NyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBkZXNjcmdldGZ1bmMgZjsKKyAgICBQeV9zc2l6ZV90IGRpY3RvZmZzZXQ7CisgICAgUHlPYmplY3QgKipkaWN0cHRyOwogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSl7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSl7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkvKiBUaGUgVW5pY29kZSB0byBzdHJpbmcgY29udmVyc2lvbiBpcyBkb25lIGhlcmUgYmVjYXVzZSB0aGUKLQkJICAgZXhpc3RpbmcgdHBfc2V0YXR0cm8gc2xvdHMgZXhwZWN0IGEgc3RyaW5nIG9iamVjdCBhcyBuYW1lCi0JCSAgIGFuZCB3ZSB3b3VsZG4ndCB3YW50IHRvIGJyZWFrIHRob3NlLiAqLwotCQlpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7Ci0JCQluYW1lID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMLCBOVUxMKTsKLQkJCWlmIChuYW1lID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZWxzZQorICAgICAgICAvKiBUaGUgVW5pY29kZSB0byBzdHJpbmcgY29udmVyc2lvbiBpcyBkb25lIGhlcmUgYmVjYXVzZSB0aGUKKyAgICAgICAgICAgZXhpc3RpbmcgdHBfc2V0YXR0cm8gc2xvdHMgZXhwZWN0IGEgc3RyaW5nIG9iamVjdCBhcyBuYW1lCisgICAgICAgICAgIGFuZCB3ZSB3b3VsZG4ndCB3YW50IHRvIGJyZWFrIHRob3NlLiAqLworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7CisgICAgICAgICAgICBuYW1lID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQogI2VuZGlmCi0JCXsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCi0JCQkJICAgICBQeV9UWVBFKG5hbWUpLT50cF9uYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UKLQkJUHlfSU5DUkVGKG5hbWUpOworICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICclLjIwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG5hbWUpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKG5hbWUpOwogCi0JaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJaWYgKFB5VHlwZV9SZWFkeSh0cCkgPCAwKQotCQkJZ290byBkb25lOwotCX0KKyAgICBpZiAodHAtPnRwX2RpY3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHRwKSA8IDApCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCiAjaWYgMCAvKiBYWFggdGhpcyBpcyBub3QgcXVpdGUgX1B5VHlwZV9Mb29rdXAgYW55bW9yZSAqLwotCS8qIElubGluZSBfUHlUeXBlX0xvb2t1cCAqLwotCXsKLQkJUHlfc3NpemVfdCBpLCBuOwotCQlQeU9iamVjdCAqbXJvLCAqYmFzZSwgKmRpY3Q7CisgICAgLyogSW5saW5lIF9QeVR5cGVfTG9va3VwICovCisgICAgeworICAgICAgICBQeV9zc2l6ZV90IGksIG47CisgICAgICAgIFB5T2JqZWN0ICptcm8sICpiYXNlLCAqZGljdDsKIAotCQkvKiBMb29rIGluIHRwX2RpY3Qgb2YgdHlwZXMgaW4gTVJPICovCi0JCW1ybyA9IHRwLT50cF9tcm87Ci0JCWFzc2VydChtcm8gIT0gTlVMTCk7Ci0JCWFzc2VydChQeVR1cGxlX0NoZWNrKG1ybykpOwotCQluID0gUHlUdXBsZV9HRVRfU0laRShtcm8pOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQliYXNlID0gUHlUdXBsZV9HRVRfSVRFTShtcm8sIGkpOwotCQkJaWYgKFB5Q2xhc3NfQ2hlY2soYmFzZSkpCi0JCQkJZGljdCA9ICgoUHlDbGFzc09iamVjdCAqKWJhc2UpLT5jbF9kaWN0OwotCQkJZWxzZSB7Ci0JCQkJYXNzZXJ0KFB5VHlwZV9DaGVjayhiYXNlKSk7Ci0JCQkJZGljdCA9ICgoUHlUeXBlT2JqZWN0ICopYmFzZSktPnRwX2RpY3Q7Ci0JCQl9Ci0JCQlhc3NlcnQoZGljdCAmJiBQeURpY3RfQ2hlY2soZGljdCkpOwotCQkJZGVzY3IgPSBQeURpY3RfR2V0SXRlbShkaWN0LCBuYW1lKTsKLQkJCWlmIChkZXNjciAhPSBOVUxMKQotCQkJCWJyZWFrOwotCQl9Ci0JfQorICAgICAgICAvKiBMb29rIGluIHRwX2RpY3Qgb2YgdHlwZXMgaW4gTVJPICovCisgICAgICAgIG1ybyA9IHRwLT50cF9tcm87CisgICAgICAgIGFzc2VydChtcm8gIT0gTlVMTCk7CisgICAgICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKG1ybykpOworICAgICAgICBuID0gUHlUdXBsZV9HRVRfU0laRShtcm8pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBiYXNlID0gUHlUdXBsZV9HRVRfSVRFTShtcm8sIGkpOworICAgICAgICAgICAgaWYgKFB5Q2xhc3NfQ2hlY2soYmFzZSkpCisgICAgICAgICAgICAgICAgZGljdCA9ICgoUHlDbGFzc09iamVjdCAqKWJhc2UpLT5jbF9kaWN0OworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayhiYXNlKSk7CisgICAgICAgICAgICAgICAgZGljdCA9ICgoUHlUeXBlT2JqZWN0ICopYmFzZSktPnRwX2RpY3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoZGljdCAmJiBQeURpY3RfQ2hlY2soZGljdCkpOworICAgICAgICAgICAgZGVzY3IgPSBQeURpY3RfR2V0SXRlbShkaWN0LCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogI2Vsc2UKLQlkZXNjciA9IF9QeVR5cGVfTG9va3VwKHRwLCBuYW1lKTsKKyAgICBkZXNjciA9IF9QeVR5cGVfTG9va3VwKHRwLCBuYW1lKTsKICNlbmRpZgogCi0JUHlfWElOQ1JFRihkZXNjcik7CisgICAgUHlfWElOQ1JFRihkZXNjcik7CiAKLQlmID0gTlVMTDsKLQlpZiAoZGVzY3IgIT0gTlVMTCAmJgotCSAgICBQeVR5cGVfSGFzRmVhdHVyZShkZXNjci0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkgewotCQlmID0gZGVzY3ItPm9iX3R5cGUtPnRwX2Rlc2NyX2dldDsKLQkJaWYgKGYgIT0gTlVMTCAmJiBQeURlc2NyX0lzRGF0YShkZXNjcikpIHsKLQkJCXJlcyA9IGYoZGVzY3IsIG9iaiwgKFB5T2JqZWN0ICopb2JqLT5vYl90eXBlKTsKLQkJCVB5X0RFQ1JFRihkZXNjcik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9CisgICAgZiA9IE5VTEw7CisgICAgaWYgKGRlc2NyICE9IE5VTEwgJiYKKyAgICAgICAgUHlUeXBlX0hhc0ZlYXR1cmUoZGVzY3ItPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpIHsKKyAgICAgICAgZiA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9nZXQ7CisgICAgICAgIGlmIChmICE9IE5VTEwgJiYgUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKSB7CisgICAgICAgICAgICByZXMgPSBmKGRlc2NyLCBvYmosIChQeU9iamVjdCAqKW9iai0+b2JfdHlwZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgfQogCi0JLyogSW5saW5lIF9QeU9iamVjdF9HZXREaWN0UHRyICovCi0JZGljdG9mZnNldCA9IHRwLT50cF9kaWN0b2Zmc2V0OwotCWlmIChkaWN0b2Zmc2V0ICE9IDApIHsKLQkJUHlPYmplY3QgKmRpY3Q7Ci0JCWlmIChkaWN0b2Zmc2V0IDwgMCkgewotCQkJUHlfc3NpemVfdCB0c2l6ZTsKLQkJCXNpemVfdCBzaXplOworICAgIC8qIElubGluZSBfUHlPYmplY3RfR2V0RGljdFB0ciAqLworICAgIGRpY3RvZmZzZXQgPSB0cC0+dHBfZGljdG9mZnNldDsKKyAgICBpZiAoZGljdG9mZnNldCAhPSAwKSB7CisgICAgICAgIFB5T2JqZWN0ICpkaWN0OworICAgICAgICBpZiAoZGljdG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgdHNpemU7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZTsKIAotCQkJdHNpemUgPSAoKFB5VmFyT2JqZWN0ICopb2JqKS0+b2Jfc2l6ZTsKLQkJCWlmICh0c2l6ZSA8IDApCi0JCQkJdHNpemUgPSAtdHNpemU7Ci0JCQlzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHRwLCB0c2l6ZSk7CisgICAgICAgICAgICB0c2l6ZSA9ICgoUHlWYXJPYmplY3QgKilvYmopLT5vYl9zaXplOworICAgICAgICAgICAgaWYgKHRzaXplIDwgMCkKKyAgICAgICAgICAgICAgICB0c2l6ZSA9IC10c2l6ZTsKKyAgICAgICAgICAgIHNpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUodHAsIHRzaXplKTsKIAotCQkJZGljdG9mZnNldCArPSAobG9uZylzaXplOwotCQkJYXNzZXJ0KGRpY3RvZmZzZXQgPiAwKTsKLQkJCWFzc2VydChkaWN0b2Zmc2V0ICUgU0laRU9GX1ZPSURfUCA9PSAwKTsKLQkJfQotCQlkaWN0cHRyID0gKFB5T2JqZWN0ICoqKSAoKGNoYXIgKilvYmogKyBkaWN0b2Zmc2V0KTsKLQkJZGljdCA9ICpkaWN0cHRyOwotCQlpZiAoZGljdCAhPSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoZGljdCk7Ci0JCQlyZXMgPSBQeURpY3RfR2V0SXRlbShkaWN0LCBuYW1lKTsKLQkJCWlmIChyZXMgIT0gTlVMTCkgewotCQkJCVB5X0lOQ1JFRihyZXMpOwotCQkJCVB5X1hERUNSRUYoZGVzY3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGljdCk7Ci0JCQkJZ290byBkb25lOwotCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGRpY3QpOwotCQl9Ci0JfQorICAgICAgICAgICAgZGljdG9mZnNldCArPSAobG9uZylzaXplOworICAgICAgICAgICAgYXNzZXJ0KGRpY3RvZmZzZXQgPiAwKTsKKyAgICAgICAgICAgIGFzc2VydChkaWN0b2Zmc2V0ICUgU0laRU9GX1ZPSURfUCA9PSAwKTsKKyAgICAgICAgfQorICAgICAgICBkaWN0cHRyID0gKFB5T2JqZWN0ICoqKSAoKGNoYXIgKilvYmogKyBkaWN0b2Zmc2V0KTsKKyAgICAgICAgZGljdCA9ICpkaWN0cHRyOworICAgICAgICBpZiAoZGljdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgICAgICAgICByZXMgPSBQeURpY3RfR2V0SXRlbShkaWN0LCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoZGVzY3IpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoZiAhPSBOVUxMKSB7Ci0JCXJlcyA9IGYoZGVzY3IsIG9iaiwgKFB5T2JqZWN0ICopUHlfVFlQRShvYmopKTsKLQkJUHlfREVDUkVGKGRlc2NyKTsKLQkJZ290byBkb25lOwotCX0KKyAgICBpZiAoZiAhPSBOVUxMKSB7CisgICAgICAgIHJlcyA9IGYoZGVzY3IsIG9iaiwgKFB5T2JqZWN0ICopUHlfVFlQRShvYmopKTsKKyAgICAgICAgUHlfREVDUkVGKGRlc2NyKTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KIAotCWlmIChkZXNjciAhPSBOVUxMKSB7Ci0JCXJlcyA9IGRlc2NyOwotCQkvKiBkZXNjciB3YXMgYWxyZWFkeSBpbmNyZWZlZCBhYm92ZSAqLwotCQlnb3RvIGRvbmU7Ci0JfQorICAgIGlmIChkZXNjciAhPSBOVUxMKSB7CisgICAgICAgIHJlcyA9IGRlc2NyOworICAgICAgICAvKiBkZXNjciB3YXMgYWxyZWFkeSBpbmNyZWZlZCBhYm92ZSAqLworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkgICAgICInJS41MHMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKLQkJICAgICB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICInJS41MHMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKKyAgICAgICAgICAgICAgICAgdHAtPnRwX25hbWUsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CiAgIGRvbmU6Ci0JUHlfREVDUkVGKG5hbWUpOwotCXJldHVybiByZXM7CisgICAgUHlfREVDUkVGKG5hbWUpOworICAgIHJldHVybiByZXM7CiB9CiAKIGludAogUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeVR5cGVPYmplY3QgKnRwID0gUHlfVFlQRShvYmopOwotCVB5T2JqZWN0ICpkZXNjcjsKLQlkZXNjcnNldGZ1bmMgZjsKLQlQeU9iamVjdCAqKmRpY3RwdHI7Ci0JaW50IHJlcyA9IC0xOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKG9iaik7CisgICAgUHlPYmplY3QgKmRlc2NyOworICAgIGRlc2Nyc2V0ZnVuYyBmOworICAgIFB5T2JqZWN0ICoqZGljdHB0cjsKKyAgICBpbnQgcmVzID0gLTE7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKXsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKXsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCS8qIFRoZSBVbmljb2RlIHRvIHN0cmluZyBjb252ZXJzaW9uIGlzIGRvbmUgaGVyZSBiZWNhdXNlIHRoZQotCQkgICBleGlzdGluZyB0cF9zZXRhdHRybyBzbG90cyBleHBlY3QgYSBzdHJpbmcgb2JqZWN0IGFzIG5hbWUKLQkJICAgYW5kIHdlIHdvdWxkbid0IHdhbnQgdG8gYnJlYWsgdGhvc2UuICovCi0JCWlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKLQkJCW5hbWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwsIE5VTEwpOwotCQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQorICAgICAgICAvKiBUaGUgVW5pY29kZSB0byBzdHJpbmcgY29udmVyc2lvbiBpcyBkb25lIGhlcmUgYmVjYXVzZSB0aGUKKyAgICAgICAgICAgZXhpc3RpbmcgdHBfc2V0YXR0cm8gc2xvdHMgZXhwZWN0IGEgc3RyaW5nIG9iamVjdCBhcyBuYW1lCisgICAgICAgICAgIGFuZCB3ZSB3b3VsZG4ndCB3YW50IHRvIGJyZWFrIHRob3NlLiAqLworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7CisgICAgICAgICAgICBuYW1lID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZgotCQl7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJyUuMjAwcyciLAotCQkJCSAgICAgUHlfVFlQRShuYW1lKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZWxzZQotCQlQeV9JTkNSRUYobmFtZSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUobmFtZSktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKG5hbWUpOwogCi0JaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJaWYgKFB5VHlwZV9SZWFkeSh0cCkgPCAwKQotCQkJZ290byBkb25lOwotCX0KKyAgICBpZiAodHAtPnRwX2RpY3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHRwKSA8IDApCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JZGVzY3IgPSBfUHlUeXBlX0xvb2t1cCh0cCwgbmFtZSk7Ci0JZiA9IE5VTEw7Ci0JaWYgKGRlc2NyICE9IE5VTEwgJiYKLQkgICAgUHlUeXBlX0hhc0ZlYXR1cmUoZGVzY3ItPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpIHsKLQkJZiA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9zZXQ7Ci0JCWlmIChmICE9IE5VTEwgJiYgUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKSB7Ci0JCQlyZXMgPSBmKGRlc2NyLCBvYmosIHZhbHVlKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KKyAgICBkZXNjciA9IF9QeVR5cGVfTG9va3VwKHRwLCBuYW1lKTsKKyAgICBmID0gTlVMTDsKKyAgICBpZiAoZGVzY3IgIT0gTlVMTCAmJgorICAgICAgICBQeVR5cGVfSGFzRmVhdHVyZShkZXNjci0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkgeworICAgICAgICBmID0gZGVzY3ItPm9iX3R5cGUtPnRwX2Rlc2NyX3NldDsKKyAgICAgICAgaWYgKGYgIT0gTlVMTCAmJiBQeURlc2NyX0lzRGF0YShkZXNjcikpIHsKKyAgICAgICAgICAgIHJlcyA9IGYoZGVzY3IsIG9iaiwgdmFsdWUpOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgfQogCi0JZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKG9iaik7Ci0JaWYgKGRpY3RwdHIgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqZGljdCA9ICpkaWN0cHRyOwotCQlpZiAoZGljdCA9PSBOVUxMICYmIHZhbHVlICE9IE5VTEwpIHsKLQkJCWRpY3QgPSBQeURpY3RfTmV3KCk7Ci0JCQlpZiAoZGljdCA9PSBOVUxMKQotCQkJCWdvdG8gZG9uZTsKLQkJCSpkaWN0cHRyID0gZGljdDsKLQkJfQotCQlpZiAoZGljdCAhPSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoZGljdCk7Ci0JCQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJCQlyZXMgPSBQeURpY3RfRGVsSXRlbShkaWN0LCBuYW1lKTsKLQkJCWVsc2UKLQkJCQlyZXMgPSBQeURpY3RfU2V0SXRlbShkaWN0LCBuYW1lLCB2YWx1ZSk7Ci0JCQlpZiAocmVzIDwgMCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKLQkJCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCQkJUHlfREVDUkVGKGRpY3QpOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQorICAgIGRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihvYmopOworICAgIGlmIChkaWN0cHRyICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmRpY3QgPSAqZGljdHB0cjsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCAmJiB2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAqZGljdHB0ciA9IGRpY3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpY3QgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGRpY3QpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmVzID0gUHlEaWN0X0RlbEl0ZW0oZGljdCwgbmFtZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzID0gUHlEaWN0X1NldEl0ZW0oZGljdCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgaWYgKHJlcyA8IDAgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChmICE9IE5VTEwpIHsKLQkJcmVzID0gZihkZXNjciwgb2JqLCB2YWx1ZSk7Ci0JCWdvdG8gZG9uZTsKLQl9CisgICAgaWYgKGYgIT0gTlVMTCkgeworICAgICAgICByZXMgPSBmKGRlc2NyLCBvYmosIHZhbHVlKTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KIAotCWlmIChkZXNjciA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgIiclLjEwMHMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclLjIwMHMnIiwKLQkJCSAgICAgdHAtPnRwX25hbWUsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JCWdvdG8gZG9uZTsKLQl9CisgICAgaWYgKGRlc2NyID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclLjEwMHMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclLjIwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkgICAgICInJS41MHMnIG9iamVjdCBhdHRyaWJ1dGUgJyUuNDAwcycgaXMgcmVhZC1vbmx5IiwKLQkJICAgICB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICInJS41MHMnIG9iamVjdCBhdHRyaWJ1dGUgJyUuNDAwcycgaXMgcmVhZC1vbmx5IiwKKyAgICAgICAgICAgICAgICAgdHAtPnRwX25hbWUsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CiAgIGRvbmU6Ci0JUHlfREVDUkVGKG5hbWUpOwotCXJldHVybiByZXM7CisgICAgUHlfREVDUkVGKG5hbWUpOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qIFRlc3QgYSB2YWx1ZSB1c2VkIGFzIGNvbmRpdGlvbiwgZS5nLiwgaW4gYSBmb3Igb3IgaWYgc3RhdGVtZW50LgpAQCAtMTU0MiwyNiArMTU0MiwyNiBAQAogaW50CiBQeU9iamVjdF9Jc1RydWUoUHlPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCByZXM7Ci0JaWYgKHYgPT0gUHlfVHJ1ZSkKLQkJcmV0dXJuIDE7Ci0JaWYgKHYgPT0gUHlfRmFsc2UpCi0JCXJldHVybiAwOwotCWlmICh2ID09IFB5X05vbmUpCi0JCXJldHVybiAwOwotCWVsc2UgaWYgKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmCi0JCSB2LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX25vbnplcm8gIT0gTlVMTCkKLQkJcmVzID0gKCp2LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX25vbnplcm8pKHYpOwotCWVsc2UgaWYgKHYtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcgIT0gTlVMTCAmJgotCQkgdi0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZy0+bXBfbGVuZ3RoICE9IE5VTEwpCi0JCXJlcyA9ICgqdi0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZy0+bXBfbGVuZ3RoKSh2KTsKLQllbHNlIGlmICh2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSAhPSBOVUxMICYmCi0JCSB2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfbGVuZ3RoICE9IE5VTEwpCi0JCXJlcyA9ICgqdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2xlbmd0aCkodik7Ci0JZWxzZQotCQlyZXR1cm4gMTsKLQkvKiBpZiBpdCBpcyBuZWdhdGl2ZSwgaXQgc2hvdWxkIGJlIGVpdGhlciAtMSBvciAtMiAqLwotCXJldHVybiAocmVzID4gMCkgPyAxIDogUHlfU0FGRV9ET1dOQ0FTVChyZXMsIFB5X3NzaXplX3QsIGludCk7CisgICAgUHlfc3NpemVfdCByZXM7CisgICAgaWYgKHYgPT0gUHlfVHJ1ZSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfRmFsc2UpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UgaWYgKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmCisgICAgICAgICAgICAgdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9ub256ZXJvICE9IE5VTEwpCisgICAgICAgIHJlcyA9ICgqdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9ub256ZXJvKSh2KTsKKyAgICBlbHNlIGlmICh2LT5vYl90eXBlLT50cF9hc19tYXBwaW5nICE9IE5VTEwgJiYKKyAgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9hc19tYXBwaW5nLT5tcF9sZW5ndGggIT0gTlVMTCkKKyAgICAgICAgcmVzID0gKCp2LT5vYl90eXBlLT50cF9hc19tYXBwaW5nLT5tcF9sZW5ndGgpKHYpOworICAgIGVsc2UgaWYgKHYtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlICE9IE5VTEwgJiYKKyAgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfbGVuZ3RoICE9IE5VTEwpCisgICAgICAgIHJlcyA9ICgqdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2xlbmd0aCkodik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMTsKKyAgICAvKiBpZiBpdCBpcyBuZWdhdGl2ZSwgaXQgc2hvdWxkIGJlIGVpdGhlciAtMSBvciAtMiAqLworICAgIHJldHVybiAocmVzID4gMCkgPyAxIDogUHlfU0FGRV9ET1dOQ0FTVChyZXMsIFB5X3NzaXplX3QsIGludCk7CiB9CiAKIC8qIGVxdWl2YWxlbnQgb2YgJ25vdCB2JwpAQCAtMTU3MCwxMSArMTU3MCwxMSBAQAogaW50CiBQeU9iamVjdF9Ob3QoUHlPYmplY3QgKnYpCiB7Ci0JaW50IHJlczsKLQlyZXMgPSBQeU9iamVjdF9Jc1RydWUodik7Ci0JaWYgKHJlcyA8IDApCi0JCXJldHVybiByZXM7Ci0JcmV0dXJuIHJlcyA9PSAwOworICAgIGludCByZXM7CisgICAgcmVzID0gUHlPYmplY3RfSXNUcnVlKHYpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworICAgIHJldHVybiByZXMgPT0gMDsKIH0KIAogLyogQ29lcmNlIHR3byBudW1lcmljIHR5cGVzIHRvIHRoZSAibGFyZ2VyIiBvbmUuCkBAIC0xNTg3LDI5ICsxNTg3LDI5IEBACiBpbnQKIFB5TnVtYmVyX0NvZXJjZUV4KFB5T2JqZWN0ICoqcHYsIFB5T2JqZWN0ICoqcHcpCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKnYgPSAqcHY7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKncgPSAqcHc7Ci0JaW50IHJlczsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqdiA9ICpwdjsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqdyA9ICpwdzsKKyAgICBpbnQgcmVzOwogCi0JLyogU2hvcnRjdXQgb25seSBmb3Igb2xkLXN0eWxlIHR5cGVzICovCi0JaWYgKHYtPm9iX3R5cGUgPT0gdy0+b2JfdHlwZSAmJgotCSAgICAhUHlUeXBlX0hhc0ZlYXR1cmUodi0+b2JfdHlwZSwgUHlfVFBGTEFHU19DSEVDS1RZUEVTKSkKLQl7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJUHlfSU5DUkVGKHcpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciAmJiB2LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSkgewotCQlyZXMgPSAoKnYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfY29lcmNlKShwdiwgcHcpOwotCQlpZiAocmVzIDw9IDApCi0JCQlyZXR1cm4gcmVzOwotCX0KLQlpZiAody0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICYmIHctPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfY29lcmNlKSB7Ci0JCXJlcyA9ICgqdy0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UpKHB3LCBwdik7Ci0JCWlmIChyZXMgPD0gMCkKLQkJCXJldHVybiByZXM7Ci0JfQotCXJldHVybiAxOworICAgIC8qIFNob3J0Y3V0IG9ubHkgZm9yIG9sZC1zdHlsZSB0eXBlcyAqLworICAgIGlmICh2LT5vYl90eXBlID09IHctPm9iX3R5cGUgJiYKKyAgICAgICAgIVB5VHlwZV9IYXNGZWF0dXJlKHYtPm9iX3R5cGUsIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykpCisgICAgeworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIFB5X0lOQ1JFRih3KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICh2LT5vYl90eXBlLT50cF9hc19udW1iZXIgJiYgdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UpIHsKKyAgICAgICAgcmVzID0gKCp2LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSkocHYsIHB3KTsKKyAgICAgICAgaWYgKHJlcyA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKHctPm9iX3R5cGUtPnRwX2FzX251bWJlciAmJiB3LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSkgeworICAgICAgICByZXMgPSAoKnctPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfY29lcmNlKShwdywgcHYpOworICAgICAgICBpZiAocmVzIDw9IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogLyogQ29lcmNlIHR3byBudW1lcmljIHR5cGVzIHRvIHRoZSAibGFyZ2VyIiBvbmUuCkBAIC0xNjIwLDExICsxNjIwLDExIEBACiBpbnQKIFB5TnVtYmVyX0NvZXJjZShQeU9iamVjdCAqKnB2LCBQeU9iamVjdCAqKnB3KQogewotCWludCBlcnIgPSBQeU51bWJlcl9Db2VyY2VFeChwdiwgcHcpOwotCWlmIChlcnIgPD0gMCkKLQkJcmV0dXJuIGVycjsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibnVtYmVyIGNvZXJjaW9uIGZhaWxlZCIpOwotCXJldHVybiAtMTsKKyAgICBpbnQgZXJyID0gUHlOdW1iZXJfQ29lcmNlRXgocHYsIHB3KTsKKyAgICBpZiAoZXJyIDw9IDApCisgICAgICAgIHJldHVybiBlcnI7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm51bWJlciBjb2VyY2lvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIApAQCAtMTYzMywyMiArMTYzMywyMiBAQAogaW50CiBQeUNhbGxhYmxlX0NoZWNrKFB5T2JqZWN0ICp4KQogewotCWlmICh4ID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmIChQeUluc3RhbmNlX0NoZWNrKHgpKSB7Ci0JCVB5T2JqZWN0ICpjYWxsID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh4LCAiX19jYWxsX18iKTsKLQkJaWYgKGNhbGwgPT0gTlVMTCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCS8qIENvdWxkIHRlc3QgcmVjdXJzaXZlbHkgYnV0IGRvbid0LCBmb3IgZmVhciBvZiBlbmRsZXNzCi0JCSAgIHJlY3Vyc2lvbiBpZiBzb21lIGpva2VyIHNldHMgc2VsZi5fX2NhbGxfXyA9IHNlbGYgKi8KLQkJUHlfREVDUkVGKGNhbGwpOwotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiB4LT5vYl90eXBlLT50cF9jYWxsICE9IE5VTEw7Ci0JfQorICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHgpKSB7CisgICAgICAgIFB5T2JqZWN0ICpjYWxsID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh4LCAiX19jYWxsX18iKTsKKyAgICAgICAgaWYgKGNhbGwgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8qIENvdWxkIHRlc3QgcmVjdXJzaXZlbHkgYnV0IGRvbid0LCBmb3IgZmVhciBvZiBlbmRsZXNzCisgICAgICAgICAgIHJlY3Vyc2lvbiBpZiBzb21lIGpva2VyIHNldHMgc2VsZi5fX2NhbGxfXyA9IHNlbGYgKi8KKyAgICAgICAgUHlfREVDUkVGKGNhbGwpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiB4LT5vYl90eXBlLT50cF9jYWxsICE9IE5VTEw7CisgICAgfQogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB5T2JqZWN0X0RpcigpIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTY2NCw1MiArMTY2NCw1MiBAQAogc3RhdGljIGludAogbWVyZ2VfY2xhc3NfZGljdChQeU9iamVjdCogZGljdCwgUHlPYmplY3QqIGFjbGFzcykKIHsKLQlQeU9iamVjdCAqY2xhc3NkaWN0OwotCVB5T2JqZWN0ICpiYXNlczsKKyAgICBQeU9iamVjdCAqY2xhc3NkaWN0OworICAgIFB5T2JqZWN0ICpiYXNlczsKIAotCWFzc2VydChQeURpY3RfQ2hlY2soZGljdCkpOwotCWFzc2VydChhY2xhc3MpOworICAgIGFzc2VydChQeURpY3RfQ2hlY2soZGljdCkpOworICAgIGFzc2VydChhY2xhc3MpOwogCi0JLyogTWVyZ2UgaW4gdGhlIHR5cGUncyBkaWN0IChpZiBhbnkpLiAqLwotCWNsYXNzZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoYWNsYXNzLCAiX19kaWN0X18iKTsKLQlpZiAoY2xhc3NkaWN0ID09IE5VTEwpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZSB7Ci0JCWludCBzdGF0dXMgPSBQeURpY3RfVXBkYXRlKGRpY3QsIGNsYXNzZGljdCk7Ci0JCVB5X0RFQ1JFRihjbGFzc2RpY3QpOwotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9CisgICAgLyogTWVyZ2UgaW4gdGhlIHR5cGUncyBkaWN0IChpZiBhbnkpLiAqLworICAgIGNsYXNzZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoYWNsYXNzLCAiX19kaWN0X18iKTsKKyAgICBpZiAoY2xhc3NkaWN0ID09IE5VTEwpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgZWxzZSB7CisgICAgICAgIGludCBzdGF0dXMgPSBQeURpY3RfVXBkYXRlKGRpY3QsIGNsYXNzZGljdCk7CisgICAgICAgIFB5X0RFQ1JFRihjbGFzc2RpY3QpOworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBSZWN1cnNpdmVseSBtZXJnZSBpbiB0aGUgYmFzZSB0eXBlcycgKGlmIGFueSkgZGljdHMuICovCi0JYmFzZXMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGFjbGFzcywgIl9fYmFzZXNfXyIpOwotCWlmIChiYXNlcyA9PSBOVUxMKQotCQlQeUVycl9DbGVhcigpOwotCWVsc2UgewotCQkvKiBXZSBoYXZlIG5vIGd1YXJhbnRlZSB0aGF0IGJhc2VzIGlzIGEgcmVhbCB0dXBsZSAqLwotCQlQeV9zc2l6ZV90IGksIG47Ci0JCW4gPSBQeVNlcXVlbmNlX1NpemUoYmFzZXMpOyAvKiBUaGlzIGJldHRlciBiZSByaWdodCAqLwotCQlpZiAobiA8IDApCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlpbnQgc3RhdHVzOwotCQkJCVB5T2JqZWN0ICpiYXNlID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGJhc2VzLCBpKTsKLQkJCQlpZiAoYmFzZSA9PSBOVUxMKSB7Ci0JCQkJCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJc3RhdHVzID0gbWVyZ2VfY2xhc3NfZGljdChkaWN0LCBiYXNlKTsKLQkJCQlQeV9ERUNSRUYoYmFzZSk7Ci0JCQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlQeV9ERUNSRUYoYmFzZXMpOwotCX0KLQlyZXR1cm4gMDsKKyAgICAvKiBSZWN1cnNpdmVseSBtZXJnZSBpbiB0aGUgYmFzZSB0eXBlcycgKGlmIGFueSkgZGljdHMuICovCisgICAgYmFzZXMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGFjbGFzcywgIl9fYmFzZXNfXyIpOworICAgIGlmIChiYXNlcyA9PSBOVUxMKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIGVsc2UgeworICAgICAgICAvKiBXZSBoYXZlIG5vIGd1YXJhbnRlZSB0aGF0IGJhc2VzIGlzIGEgcmVhbCB0dXBsZSAqLworICAgICAgICBQeV9zc2l6ZV90IGksIG47CisgICAgICAgIG4gPSBQeVNlcXVlbmNlX1NpemUoYmFzZXMpOyAvKiBUaGlzIGJldHRlciBiZSByaWdodCAqLworICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpiYXNlID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGJhc2VzLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoYmFzZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gbWVyZ2VfY2xhc3NfZGljdChkaWN0LCBiYXNlKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYmFzZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogSGVscGVyIGZvciBQeU9iamVjdF9EaXIuCkBAIC0xNzIyLDEwNyArMTcyMiwxMDcgQEAKIHN0YXRpYyBpbnQKIG1lcmdlX2xpc3RfYXR0cihQeU9iamVjdCogZGljdCwgUHlPYmplY3QqIG9iaiwgY29uc3QgY2hhciAqYXR0cm5hbWUpCiB7Ci0JUHlPYmplY3QgKmxpc3Q7Ci0JaW50IHJlc3VsdCA9IDA7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgaW50IHJlc3VsdCA9IDA7CiAKLQlhc3NlcnQoUHlEaWN0X0NoZWNrKGRpY3QpKTsKLQlhc3NlcnQob2JqKTsKLQlhc3NlcnQoYXR0cm5hbWUpOworICAgIGFzc2VydChQeURpY3RfQ2hlY2soZGljdCkpOworICAgIGFzc2VydChvYmopOworICAgIGFzc2VydChhdHRybmFtZSk7CiAKLQlsaXN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosIGF0dHJuYW1lKTsKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlQeUVycl9DbGVhcigpOworICAgIGxpc3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgYXR0cm5hbWUpOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAKLQllbHNlIGlmIChQeUxpc3RfQ2hlY2sobGlzdCkpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBQeUxpc3RfR0VUX1NJWkUobGlzdCk7ICsraSkgewotCQkJUHlPYmplY3QgKml0ZW0gPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCQlpZiAoUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKLQkJCQlyZXN1bHQgPSBQeURpY3RfU2V0SXRlbShkaWN0LCBpdGVtLCBQeV9Ob25lKTsKLQkJCQlpZiAocmVzdWx0IDwgMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAmJgotCQkgICAgKHN0cmNtcChhdHRybmFtZSwgIl9fbWVtYmVyc19fIikgPT0gMCB8fAotCQkgICAgIHN0cmNtcChhdHRybmFtZSwgIl9fbWV0aG9kc19fIikgPT0gMCkpIHsKLQkJCWlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAKLQkJCQkgICAgICAgIl9fbWVtYmVyc19fIGFuZCBfX21ldGhvZHNfXyBub3QgIgotCQkJCSAgICAgICAic3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkgewotCQkJCVB5X1hERUNSRUYobGlzdCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQorICAgIGVsc2UgaWYgKFB5TGlzdF9DaGVjayhsaXN0KSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5TGlzdF9HRVRfU0laRShsaXN0KTsgKytpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhpdGVtKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5RGljdF9TZXRJdGVtKGRpY3QsIGl0ZW0sIFB5X05vbmUpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoUHlfUHkza1dhcm5pbmdGbGFnICYmCisgICAgICAgICAgICAoc3RyY21wKGF0dHJuYW1lLCAiX19tZW1iZXJzX18iKSA9PSAwIHx8CisgICAgICAgICAgICAgc3RyY21wKGF0dHJuYW1lLCAiX19tZXRob2RzX18iKSA9PSAwKSkgeworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19tZW1iZXJzX18gYW5kIF9fbWV0aG9kc19fIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYobGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JUHlfWERFQ1JFRihsaXN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYobGlzdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogSGVscGVyIGZvciBQeU9iamVjdF9EaXIgd2l0aG91dCBhcmd1bWVudHM6IHJldHVybnMgdGhlIGxvY2FsIHNjb3BlLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIF9kaXJfbG9jYWxzKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm5hbWVzOwotCVB5T2JqZWN0ICpsb2NhbHMgPSBQeUV2YWxfR2V0TG9jYWxzKCk7CisgICAgUHlPYmplY3QgKm5hbWVzOworICAgIFB5T2JqZWN0ICpsb2NhbHMgPSBQeUV2YWxfR2V0TG9jYWxzKCk7CiAKLQlpZiAobG9jYWxzID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiZnJhbWUgZG9lcyBub3QgZXhpc3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChsb2NhbHMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJmcmFtZSBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQluYW1lcyA9IFB5TWFwcGluZ19LZXlzKGxvY2Fscyk7Ci0JaWYgKCFuYW1lcykKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUxpc3RfQ2hlY2sobmFtZXMpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkiZGlyKCk6IGV4cGVjdGVkIGtleXMoKSBvZiBsb2NhbHMgdG8gYmUgYSBsaXN0LCAiCi0JCQkibm90ICclLjIwMHMnIiwgUHlfVFlQRShuYW1lcyktPnRwX25hbWUpOwotCQlQeV9ERUNSRUYobmFtZXMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogdGhlIGxvY2FscyBkb24ndCBuZWVkIHRvIGJlIERFQ1JFRidkICovCi0JcmV0dXJuIG5hbWVzOworICAgIG5hbWVzID0gUHlNYXBwaW5nX0tleXMobG9jYWxzKTsKKyAgICBpZiAoIW5hbWVzKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhuYW1lcykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJkaXIoKTogZXhwZWN0ZWQga2V5cygpIG9mIGxvY2FscyB0byBiZSBhIGxpc3QsICIKKyAgICAgICAgICAgICJub3QgJyUuMjAwcyciLCBQeV9UWVBFKG5hbWVzKS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiB0aGUgbG9jYWxzIGRvbid0IG5lZWQgdG8gYmUgREVDUkVGJ2QgKi8KKyAgICByZXR1cm4gbmFtZXM7CiB9CiAKIC8qIEhlbHBlciBmb3IgUHlPYmplY3RfRGlyIG9mIHR5cGUgb2JqZWN0czogcmV0dXJucyBfX2RpY3RfXyBhbmQgX19iYXNlc19fLgotICAgV2UgZGVsaWJlcmF0ZWx5IGRvbid0IHN1Y2sgdXAgaXRzIF9fY2xhc3NfXywgYXMgbWV0aG9kcyBiZWxvbmdpbmcgdG8gdGhlIAotICAgbWV0YWNsYXNzIHdvdWxkIHByb2JhYmx5IGJlIG1vcmUgY29uZnVzaW5nIHRoYW4gaGVscGZ1bC4gCisgICBXZSBkZWxpYmVyYXRlbHkgZG9uJ3Qgc3VjayB1cCBpdHMgX19jbGFzc19fLCBhcyBtZXRob2RzIGJlbG9uZ2luZyB0byB0aGUKKyAgIG1ldGFjbGFzcyB3b3VsZCBwcm9iYWJseSBiZSBtb3JlIGNvbmZ1c2luZyB0aGFuIGhlbHBmdWwuCiAqLwotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogX3NwZWNpYWxpemVkX2Rpcl90eXBlKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRpY3QgPSBQeURpY3RfTmV3KCk7CiAKLQlpZiAoZGljdCAhPSBOVUxMICYmIG1lcmdlX2NsYXNzX2RpY3QoZGljdCwgb2JqKSA9PSAwKQotCQlyZXN1bHQgPSBQeURpY3RfS2V5cyhkaWN0KTsKKyAgICBpZiAoZGljdCAhPSBOVUxMICYmIG1lcmdlX2NsYXNzX2RpY3QoZGljdCwgb2JqKSA9PSAwKQorICAgICAgICByZXN1bHQgPSBQeURpY3RfS2V5cyhkaWN0KTsKIAotCVB5X1hERUNSRUYoZGljdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGRpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEhlbHBlciBmb3IgUHlPYmplY3RfRGlyIG9mIG1vZHVsZSBvYmplY3RzOiByZXR1cm5zIHRoZSBtb2R1bGUncyBfX2RpY3RfXy4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBfc3BlY2lhbGl6ZWRfZGlyX21vZHVsZShQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCVB5T2JqZWN0ICpkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2RpY3RfXyIpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2RpY3RfXyIpOwogCi0JaWYgKGRpY3QgIT0gTlVMTCkgewotCQlpZiAoUHlEaWN0X0NoZWNrKGRpY3QpKQotCQkJcmVzdWx0ID0gUHlEaWN0X0tleXMoZGljdCk7Ci0JCWVsc2UgewotCQkJY2hhciAqbmFtZSA9IFB5TW9kdWxlX0dldE5hbWUob2JqKTsKLQkJCWlmIChuYW1lKQotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSAgICAgIiUuMjAwcy5fX2RpY3RfXyBpcyBub3QgYSBkaWN0aW9uYXJ5IiwKLQkJCQkJICAgICBuYW1lKTsKLQkJfQotCX0KKyAgICBpZiAoZGljdCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChQeURpY3RfQ2hlY2soZGljdCkpCisgICAgICAgICAgICByZXN1bHQgPSBQeURpY3RfS2V5cyhkaWN0KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICpuYW1lID0gUHlNb2R1bGVfR2V0TmFtZShvYmopOworICAgICAgICAgICAgaWYgKG5hbWUpCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcy5fX2RpY3RfXyBpcyBub3QgYSBkaWN0aW9uYXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeV9YREVDUkVGKGRpY3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBIZWxwZXIgZm9yIFB5T2JqZWN0X0RpciBvZiBnZW5lcmljIG9iamVjdHM6IHJldHVybnMgX19kaWN0X18sIF9fY2xhc3NfXywKQEAgLTE4MzEsNTQgKzE4MzEsNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfZ2VuZXJpY19kaXIoUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlQeU9iamVjdCAqZGljdCA9IE5VTEw7Ci0JUHlPYmplY3QgKml0c2NsYXNzID0gTlVMTDsKLQkKLQkvKiBHZXQgX19kaWN0X18gKHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGEgcmVhbCBkaWN0Li4uKSAqLwotCWRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fZGljdF9fIik7Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOwotCQlkaWN0ID0gUHlEaWN0X05ldygpOwotCX0KLQllbHNlIGlmICghUHlEaWN0X0NoZWNrKGRpY3QpKSB7Ci0JCVB5X0RFQ1JFRihkaWN0KTsKLQkJZGljdCA9IFB5RGljdF9OZXcoKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIENvcHkgX19kaWN0X18gdG8gYXZvaWQgbXV0YXRpbmcgaXQuICovCi0JCVB5T2JqZWN0ICp0ZW1wID0gUHlEaWN0X0NvcHkoZGljdCk7Ci0JCVB5X0RFQ1JFRihkaWN0KTsKLQkJZGljdCA9IHRlbXA7Ci0JfQorICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkaWN0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaXRzY2xhc3MgPSBOVUxMOwogCi0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKKyAgICAvKiBHZXQgX19kaWN0X18gKHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGEgcmVhbCBkaWN0Li4uKSAqLworICAgIGRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fZGljdF9fIik7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBkaWN0ID0gUHlEaWN0X05ldygpOworICAgIH0KKyAgICBlbHNlIGlmICghUHlEaWN0X0NoZWNrKGRpY3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIENvcHkgX19kaWN0X18gdG8gYXZvaWQgbXV0YXRpbmcgaXQuICovCisgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gUHlEaWN0X0NvcHkoZGljdCk7CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgZGljdCA9IHRlbXA7CisgICAgfQogCi0JLyogTWVyZ2UgaW4gX19tZW1iZXJzX18gYW5kIF9fbWV0aG9kc19fIChpZiBhbnkpLgotCSAqIFRoaXMgaXMgcmVtb3ZlZCBpbiBQeXRob24gMzAwMC4gKi8KLQlpZiAobWVyZ2VfbGlzdF9hdHRyKGRpY3QsIG9iaiwgIl9fbWVtYmVyc19fIikgPCAwKQotCQlnb3RvIGVycm9yOwotCWlmIChtZXJnZV9saXN0X2F0dHIoZGljdCwgb2JqLCAiX19tZXRob2RzX18iKSA8IDApCi0JCWdvdG8gZXJyb3I7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCS8qIE1lcmdlIGluIGF0dHJzIHJlYWNoYWJsZSBmcm9tIGl0cyBjbGFzcy4gKi8KLQlpdHNjbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19jbGFzc19fIik7Ci0JaWYgKGl0c2NsYXNzID09IE5VTEwpCi0JCS8qIFhYWCh0b21lcik6IFBlcmhhcHMgZmFsbCBiYWNrIHRvIG9iai0+b2JfdHlwZSBpZiBubwotCQkgICAgICAgICAgICAgICBfX2NsYXNzX18gZXhpc3RzPyAqLwotCQlQeUVycl9DbGVhcigpOwotCWVsc2UgewotCQlpZiAobWVyZ2VfY2xhc3NfZGljdChkaWN0LCBpdHNjbGFzcykgIT0gMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIC8qIE1lcmdlIGluIF9fbWVtYmVyc19fIGFuZCBfX21ldGhvZHNfXyAoaWYgYW55KS4KKyAgICAgKiBUaGlzIGlzIHJlbW92ZWQgaW4gUHl0aG9uIDMwMDAuICovCisgICAgaWYgKG1lcmdlX2xpc3RfYXR0cihkaWN0LCBvYmosICJfX21lbWJlcnNfXyIpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAobWVyZ2VfbGlzdF9hdHRyKGRpY3QsIG9iaiwgIl9fbWV0aG9kc19fIikgPCAwKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JcmVzdWx0ID0gUHlEaWN0X0tleXMoZGljdCk7Ci0JLyogZmFsbCB0aHJvdWdoICovCisgICAgLyogTWVyZ2UgaW4gYXR0cnMgcmVhY2hhYmxlIGZyb20gaXRzIGNsYXNzLiAqLworICAgIGl0c2NsYXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2NsYXNzX18iKTsKKyAgICBpZiAoaXRzY2xhc3MgPT0gTlVMTCkKKyAgICAgICAgLyogWFhYKHRvbWVyKTogUGVyaGFwcyBmYWxsIGJhY2sgdG8gb2JqLT5vYl90eXBlIGlmIG5vCisgICAgICAgICAgICAgICAgICAgICAgIF9fY2xhc3NfXyBleGlzdHM/ICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChtZXJnZV9jbGFzc19kaWN0KGRpY3QsIGl0c2NsYXNzKSAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXN1bHQgPSBQeURpY3RfS2V5cyhkaWN0KTsKKyAgICAvKiBmYWxsIHRocm91Z2ggKi8KIGVycm9yOgotCVB5X1hERUNSRUYoaXRzY2xhc3MpOwotCVB5X1hERUNSRUYoZGljdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGl0c2NsYXNzKTsKKyAgICBQeV9YREVDUkVGKGRpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEhlbHBlciBmb3IgUHlPYmplY3RfRGlyOiBvYmplY3QgaW50cm9zcGVjdGlvbi4KQEAgLTE4ODcsNDAgKzE4ODcsNDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfZGlyX29iamVjdChQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCVB5T2JqZWN0ICpkaXJmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKilvYmotPm9iX3R5cGUsCi0JCQkJCQkgICAiX19kaXJfXyIpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkaXJmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKilvYmotPm9iX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2Rpcl9fIik7CiAKLQlhc3NlcnQob2JqKTsKLQlpZiAoZGlyZnVuYyA9PSBOVUxMKSB7Ci0JCS8qIHVzZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCWlmIChQeU1vZHVsZV9DaGVjayhvYmopKQotCQkJcmVzdWx0ID0gX3NwZWNpYWxpemVkX2Rpcl9tb2R1bGUob2JqKTsKLQkJZWxzZSBpZiAoUHlUeXBlX0NoZWNrKG9iaikgfHwgUHlDbGFzc19DaGVjayhvYmopKQotCQkJcmVzdWx0ID0gX3NwZWNpYWxpemVkX2Rpcl90eXBlKG9iaik7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IF9nZW5lcmljX2RpcihvYmopOwotCX0KLQllbHNlIHsKLQkJLyogdXNlIF9fZGlyX18gKi8KLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhkaXJmdW5jLCBvYmosIE5VTEwpOwotCQlQeV9ERUNSRUYoZGlyZnVuYyk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgIGFzc2VydChvYmopOworICAgIGlmIChkaXJmdW5jID09IE5VTEwpIHsKKyAgICAgICAgLyogdXNlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKFB5TW9kdWxlX0NoZWNrKG9iaikpCisgICAgICAgICAgICByZXN1bHQgPSBfc3BlY2lhbGl6ZWRfZGlyX21vZHVsZShvYmopOworICAgICAgICBlbHNlIGlmIChQeVR5cGVfQ2hlY2sob2JqKSB8fCBQeUNsYXNzX0NoZWNrKG9iaikpCisgICAgICAgICAgICByZXN1bHQgPSBfc3BlY2lhbGl6ZWRfZGlyX3R5cGUob2JqKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gX2dlbmVyaWNfZGlyKG9iaik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiB1c2UgX19kaXJfXyAqLworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGRpcmZ1bmMsIG9iaiwgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihkaXJmdW5jKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJLyogcmVzdWx0IG11c3QgYmUgYSBsaXN0ICovCi0JCS8qIFhYWChnYnJhbmRsKTogY291bGQgYWxzbyBjaGVjayBpZiBhbGwgaXRlbXMgYXJlIHN0cmluZ3MgKi8KLQkJaWYgKCFQeUxpc3RfQ2hlY2socmVzdWx0KSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJfX2Rpcl9fKCkgbXVzdCByZXR1cm4gYSBsaXN0LCBub3QgJS4yMDBzIiwKLQkJCQkgICAgIFB5X1RZUEUocmVzdWx0KS0+dHBfbmFtZSk7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJlc3VsdCA9IE5VTEw7Ci0JCX0KLQl9CisgICAgICAgIC8qIHJlc3VsdCBtdXN0IGJlIGEgbGlzdCAqLworICAgICAgICAvKiBYWFgoZ2JyYW5kbCk6IGNvdWxkIGFsc28gY2hlY2sgaWYgYWxsIGl0ZW1zIGFyZSBzdHJpbmdzICovCisgICAgICAgIGlmICghUHlMaXN0X0NoZWNrKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9fZGlyX18oKSBtdXN0IHJldHVybiBhIGxpc3QsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocmVzdWx0KS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEltcGxlbWVudGF0aW9uIG9mIGRpcigpIC0tIGlmIG9iaiBpcyBOVUxMLCByZXR1cm5zIHRoZSBuYW1lcyBpbiB0aGUgY3VycmVudApAQCAtMTkzMCwyNCArMTkzMCwyNCBAQAogUHlPYmplY3QgKgogUHlPYmplY3RfRGlyKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QgKiByZXN1bHQ7CisgICAgUHlPYmplY3QgKiByZXN1bHQ7CiAKLQlpZiAob2JqID09IE5VTEwpCi0JCS8qIG5vIG9iamVjdCAtLSBpbnRyb3NwZWN0IHRoZSBsb2NhbHMgKi8KLQkJcmVzdWx0ID0gX2Rpcl9sb2NhbHMoKTsKLQllbHNlCi0JCS8qIG9iamVjdCAtLSBpbnRyb3NwZWN0IHRoZSBvYmplY3QgKi8KLQkJcmVzdWx0ID0gX2Rpcl9vYmplY3Qob2JqKTsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIC8qIG5vIG9iamVjdCAtLSBpbnRyb3NwZWN0IHRoZSBsb2NhbHMgKi8KKyAgICAgICAgcmVzdWx0ID0gX2Rpcl9sb2NhbHMoKTsKKyAgICBlbHNlCisgICAgICAgIC8qIG9iamVjdCAtLSBpbnRyb3NwZWN0IHRoZSBvYmplY3QgKi8KKyAgICAgICAgcmVzdWx0ID0gX2Rpcl9vYmplY3Qob2JqKTsKIAotCWFzc2VydChyZXN1bHQgPT0gTlVMTCB8fCBQeUxpc3RfQ2hlY2socmVzdWx0KSk7CisgICAgYXNzZXJ0KHJlc3VsdCA9PSBOVUxMIHx8IFB5TGlzdF9DaGVjayhyZXN1bHQpKTsKIAotCWlmIChyZXN1bHQgIT0gTlVMTCAmJiBQeUxpc3RfU29ydChyZXN1bHQpICE9IDApIHsKLQkJLyogc29ydGluZyB0aGUgbGlzdCBmYWlsZWQgKi8KLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJlc3VsdCA9IE5VTEw7Ci0JfQotCQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIFB5TGlzdF9Tb3J0KHJlc3VsdCkgIT0gMCkgeworICAgICAgICAvKiBzb3J0aW5nIHRoZSBsaXN0IGZhaWxlZCAqLworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKgpAQCAtMTk2MSwzNSArMTk2MSwzNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5vbmVfcmVwcihQeU9iamVjdCAqb3ApCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIk5vbmUiKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiTm9uZSIpOwogfQogCiAvKiBBUkdVU0VEICovCiBzdGF0aWMgdm9pZAogbm9uZV9kZWFsbG9jKFB5T2JqZWN0KiBpZ25vcmUpCiB7Ci0JLyogVGhpcyBzaG91bGQgbmV2ZXIgZ2V0IGNhbGxlZCwgYnV0IHdlIGFsc28gZG9uJ3Qgd2FudCB0byBTRUdWIGlmCi0JICogd2UgYWNjaWRlbnRhbGx5IGRlY3JlZiBOb25lIG91dCBvZiBleGlzdGVuY2UuCi0JICovCi0JUHlfRmF0YWxFcnJvcigiZGVhbGxvY2F0aW5nIE5vbmUiKTsKKyAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBnZXQgY2FsbGVkLCBidXQgd2UgYWxzbyBkb24ndCB3YW50IHRvIFNFR1YgaWYKKyAgICAgKiB3ZSBhY2NpZGVudGFsbHkgZGVjcmVmIE5vbmUgb3V0IG9mIGV4aXN0ZW5jZS4KKyAgICAgKi8KKyAgICBQeV9GYXRhbEVycm9yKCJkZWFsbG9jYXRpbmcgTm9uZSIpOwogfQogCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlOb25lX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiTm9uZVR5cGUiLAotCTAsCi0JMCwKLQlub25lX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovIC8qbmV2ZXIgY2FsbGVkKi8KLQkwLAkJLyp0cF9wcmludCovCi0JMCwJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCS8qdHBfc2V0YXR0ciovCi0JMCwJCS8qdHBfY29tcGFyZSovCi0Jbm9uZV9yZXByLAkvKnRwX3JlcHIqLwotCTAsCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYylfUHlfSGFzaFBvaW50ZXIsIC8qdHBfaGFzaCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgIk5vbmVUeXBlIiwKKyAgICAwLAorICAgIDAsCisgICAgbm9uZV9kZWFsbG9jLCAgICAgICAvKnRwX2RlYWxsb2MqLyAvKm5ldmVyIGNhbGxlZCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICBub25lX3JlcHIsICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgKGhhc2hmdW5jKV9QeV9IYXNoUG9pbnRlciwgLyp0cF9oYXNoICovCiB9OwogCiBQeU9iamVjdCBfUHlfTm9uZVN0cnVjdCA9IHsKQEAgLTIwMDMsMTY3ICsyMDAzLDE2NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIE5vdEltcGxlbWVudGVkX3JlcHIoUHlPYmplY3QgKm9wKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJOb3RJbXBsZW1lbnRlZCIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJOb3RJbXBsZW1lbnRlZCIpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5Tm90SW1wbGVtZW50ZWRfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJOb3RJbXBsZW1lbnRlZFR5cGUiLAotCTAsCi0JMCwKLQlub25lX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovIC8qbmV2ZXIgY2FsbGVkKi8KLQkwLAkJLyp0cF9wcmludCovCi0JMCwJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCS8qdHBfc2V0YXR0ciovCi0JMCwJCS8qdHBfY29tcGFyZSovCi0JTm90SW1wbGVtZW50ZWRfcmVwciwgLyp0cF9yZXByKi8KLQkwLAkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJLyp0cF9oYXNoICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiTm90SW1wbGVtZW50ZWRUeXBlIiwKKyAgICAwLAorICAgIDAsCisgICAgbm9uZV9kZWFsbG9jLCAgICAgICAvKnRwX2RlYWxsb2MqLyAvKm5ldmVyIGNhbGxlZCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICBOb3RJbXBsZW1lbnRlZF9yZXByLCAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCiB9OwogCiBQeU9iamVjdCBfUHlfTm90SW1wbGVtZW50ZWRTdHJ1Y3QgPSB7Ci0JX1B5T2JqZWN0X0VYVFJBX0lOSVQKLQkxLCAmUHlOb3RJbXBsZW1lbnRlZF9UeXBlCisgICAgX1B5T2JqZWN0X0VYVFJBX0lOSVQKKyAgICAxLCAmUHlOb3RJbXBsZW1lbnRlZF9UeXBlCiB9OwogCiB2b2lkCiBfUHlfUmVhZHlUeXBlcyh2b2lkKQogewotCWlmIChQeVR5cGVfUmVhZHkoJlB5VHlwZV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdHlwZSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBlX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB0eXBlIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJl9QeVdlYWtyZWZfUmVmVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHdlYWtyZWYgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJl9QeVdlYWtyZWZfUmVmVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHdlYWtyZWYgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmX1B5V2Vha3JlZl9DYWxsYWJsZVByb3h5VHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGNhbGxhYmxlIHdlYWtyZWYgcHJveHkgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJl9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBjYWxsYWJsZSB3ZWFrcmVmIHByb3h5IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJl9QeVdlYWtyZWZfUHJveHlUeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgd2Vha3JlZiBwcm94eSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmX1B5V2Vha3JlZl9Qcm94eVR5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB3ZWFrcmVmIHByb3h5IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5Qm9vbF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgYm9vbCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlCb29sX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBib29sIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5U3RyaW5nX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzdHIgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5U3RyaW5nX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzdHIgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlCeXRlQXJyYXlfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGJ5dGVhcnJheSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlCeXRlQXJyYXlfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGJ5dGVhcnJheSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUxpc3RfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGxpc3QgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5TGlzdF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgbGlzdCB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeU5vbmVfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIE5vbmUgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Tm9uZV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgTm9uZSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeU5vdEltcGxlbWVudGVkX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBOb3RJbXBsZW1lbnRlZCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlOb3RJbXBsZW1lbnRlZF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgTm90SW1wbGVtZW50ZWQgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlUcmFjZUJhY2tfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHRyYWNlYmFjayB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUcmFjZUJhY2tfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHRyYWNlYmFjayB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVN1cGVyX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzdXBlciB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlTdXBlcl9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgc3VwZXIgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlCYXNlT2JqZWN0X1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBvYmplY3QgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5QmFzZU9iamVjdF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgb2JqZWN0IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5UmFuZ2VfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHhyYW5nZSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlSYW5nZV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgeHJhbmdlIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5RGljdF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZGljdCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlEaWN0X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBkaWN0IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5U2V0X1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzZXQgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5U2V0X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzZXQgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlVbmljb2RlX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB1bmljb2RlIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVVuaWNvZGVfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHVuaWNvZGUgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlTbGljZV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgc2xpY2UgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5U2xpY2VfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHNsaWNlIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5U3RhdGljTWV0aG9kX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzdGF0aWMgbWV0aG9kIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVN0YXRpY01ldGhvZF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgc3RhdGljIG1ldGhvZCB0eXBlIik7CiAKICNpZm5kZWYgV0lUSE9VVF9DT01QTEVYCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlDb21wbGV4X1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBjb21wbGV4IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUNvbXBsZXhfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGNvbXBsZXggdHlwZSIpOwogI2VuZGlmCiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUZsb2F0X1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBmbG9hdCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlGbG9hdF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZmxvYXQgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlCdWZmZXJfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGJ1ZmZlciB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlCdWZmZXJfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGJ1ZmZlciB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUxvbmdfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGxvbmcgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5TG9uZ19UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgbG9uZyB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUludF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgaW50IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUludF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgaW50IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5RnJvemVuU2V0X1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBmcm96ZW5zZXQgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RnJvemVuU2V0X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBmcm96ZW5zZXQgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlQcm9wZXJ0eV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgcHJvcGVydHkgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5UHJvcGVydHlfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHByb3BlcnR5IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5TWVtb3J5Vmlld19UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgbWVtb3J5dmlldyB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlNZW1vcnlWaWV3X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBtZW1vcnl2aWV3IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5VHVwbGVfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHR1cGxlIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR1cGxlX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB0dXBsZSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUVudW1fVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGVudW1lcmF0ZSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlFbnVtX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBlbnVtZXJhdGUgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlSZXZlcnNlZF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgcmV2ZXJzZWQgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5UmV2ZXJzZWRfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHJldmVyc2VkIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5Q29kZV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgY29kZSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlDb2RlX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBjb2RlIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5RnJhbWVfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGZyYW1lIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUZyYW1lX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBmcmFtZSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUNGdW5jdGlvbl9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgYnVpbHRpbiBmdW5jdGlvbiB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlDRnVuY3Rpb25fVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGJ1aWx0aW4gZnVuY3Rpb24gdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlNZXRob2RfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIG1ldGhvZCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlNZXRob2RfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIG1ldGhvZCB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUZ1bmN0aW9uX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBmdW5jdGlvbiB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlGdW5jdGlvbl9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZnVuY3Rpb24gdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlDbGFzc19UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgY2xhc3MgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q2xhc3NfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGNsYXNzIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5RGljdFByb3h5X1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBkaWN0IHByb3h5IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeURpY3RQcm94eV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZGljdCBwcm94eSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUdlbl9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZ2VuZXJhdG9yIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUdlbl9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZ2VuZXJhdG9yIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5R2V0U2V0RGVzY3JfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGdldC1zZXQgZGVzY3JpcHRvciB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlHZXRTZXREZXNjcl9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZ2V0LXNldCBkZXNjcmlwdG9yIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5V3JhcHBlckRlc2NyX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB3cmFwcGVyIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVdyYXBwZXJEZXNjcl9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgd3JhcHBlciB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUluc3RhbmNlX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBpbnN0YW5jZSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlJbnN0YW5jZV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgaW5zdGFuY2UgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlFbGxpcHNpc19UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZWxsaXBzaXMgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RWxsaXBzaXNfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGVsbGlwc2lzIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5TWVtYmVyRGVzY3JfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIG1lbWJlciBkZXNjcmlwdG9yIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeU1lbWJlckRlc2NyX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBtZW1iZXIgZGVzY3JpcHRvciB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUZpbGVfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGZpbGUgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RmlsZV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZmlsZSB0eXBlIik7CiB9CiAKIApAQCAtMjE3Miw0MyArMjE3Miw0MyBAQAogdm9pZAogX1B5X05ld1JlZmVyZW5jZShQeU9iamVjdCAqb3ApCiB7Ci0JX1B5X0lOQ19SRUZUT1RBTDsKLQlvcC0+b2JfcmVmY250ID0gMTsKLQlfUHlfQWRkVG9BbGxPYmplY3RzKG9wLCAxKTsKLQlfUHlfSU5DX1RQQUxMT0NTKG9wKTsKKyAgICBfUHlfSU5DX1JFRlRPVEFMOworICAgIG9wLT5vYl9yZWZjbnQgPSAxOworICAgIF9QeV9BZGRUb0FsbE9iamVjdHMob3AsIDEpOworICAgIF9QeV9JTkNfVFBBTExPQ1Mob3ApOwogfQogCiB2b2lkCiBfUHlfRm9yZ2V0UmVmZXJlbmNlKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCkKIHsKICNpZmRlZiBTTE9XX1VOUkVGX0NIRUNLCi0gICAgICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpwOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpwOwogI2VuZGlmCi0JaWYgKG9wLT5vYl9yZWZjbnQgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJVTlJFRiBuZWdhdGl2ZSByZWZjbnQiKTsKLQlpZiAob3AgPT0gJnJlZmNoYWluIHx8Ci0JICAgIG9wLT5fb2JfcHJldi0+X29iX25leHQgIT0gb3AgfHwgb3AtPl9vYl9uZXh0LT5fb2JfcHJldiAhPSBvcCkKLQkJUHlfRmF0YWxFcnJvcigiVU5SRUYgaW52YWxpZCBvYmplY3QiKTsKKyAgICBpZiAob3AtPm9iX3JlZmNudCA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlVOUkVGIG5lZ2F0aXZlIHJlZmNudCIpOworICAgIGlmIChvcCA9PSAmcmVmY2hhaW4gfHwKKyAgICAgICAgb3AtPl9vYl9wcmV2LT5fb2JfbmV4dCAhPSBvcCB8fCBvcC0+X29iX25leHQtPl9vYl9wcmV2ICE9IG9wKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJVTlJFRiBpbnZhbGlkIG9iamVjdCIpOwogI2lmZGVmIFNMT1dfVU5SRUZfQ0hFQ0sKLQlmb3IgKHAgPSByZWZjaGFpbi5fb2JfbmV4dDsgcCAhPSAmcmVmY2hhaW47IHAgPSBwLT5fb2JfbmV4dCkgewotCQlpZiAocCA9PSBvcCkKLQkJCWJyZWFrOwotCX0KLQlpZiAocCA9PSAmcmVmY2hhaW4pIC8qIE5vdCBmb3VuZCAqLwotCQlQeV9GYXRhbEVycm9yKCJVTlJFRiB1bmtub3duIG9iamVjdCIpOworICAgIGZvciAocCA9IHJlZmNoYWluLl9vYl9uZXh0OyBwICE9ICZyZWZjaGFpbjsgcCA9IHAtPl9vYl9uZXh0KSB7CisgICAgICAgIGlmIChwID09IG9wKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChwID09ICZyZWZjaGFpbikgLyogTm90IGZvdW5kICovCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlVOUkVGIHVua25vd24gb2JqZWN0Iik7CiAjZW5kaWYKLQlvcC0+X29iX25leHQtPl9vYl9wcmV2ID0gb3AtPl9vYl9wcmV2OwotCW9wLT5fb2JfcHJldi0+X29iX25leHQgPSBvcC0+X29iX25leHQ7Ci0Jb3AtPl9vYl9uZXh0ID0gb3AtPl9vYl9wcmV2ID0gTlVMTDsKLQlfUHlfSU5DX1RQRlJFRVMob3ApOworICAgIG9wLT5fb2JfbmV4dC0+X29iX3ByZXYgPSBvcC0+X29iX3ByZXY7CisgICAgb3AtPl9vYl9wcmV2LT5fb2JfbmV4dCA9IG9wLT5fb2JfbmV4dDsKKyAgICBvcC0+X29iX25leHQgPSBvcC0+X29iX3ByZXYgPSBOVUxMOworICAgIF9QeV9JTkNfVFBGUkVFUyhvcCk7CiB9CiAKIHZvaWQKIF9QeV9EZWFsbG9jKFB5T2JqZWN0ICpvcCkKIHsKLQlkZXN0cnVjdG9yIGRlYWxsb2MgPSBQeV9UWVBFKG9wKS0+dHBfZGVhbGxvYzsKLQlfUHlfRm9yZ2V0UmVmZXJlbmNlKG9wKTsKLQkoKmRlYWxsb2MpKG9wKTsKKyAgICBkZXN0cnVjdG9yIGRlYWxsb2MgPSBQeV9UWVBFKG9wKS0+dHBfZGVhbGxvYzsKKyAgICBfUHlfRm9yZ2V0UmVmZXJlbmNlKG9wKTsKKyAgICAoKmRlYWxsb2MpKG9wKTsKIH0KIAogLyogUHJpbnQgYWxsIGxpdmUgb2JqZWN0cy4gIEJlY2F1c2UgUHlPYmplY3RfUHJpbnQgaXMgY2FsbGVkLCB0aGUKQEAgLTIyMTcsMTQgKzIyMTcsMTQgQEAKIHZvaWQKIF9QeV9QcmludFJlZmVyZW5jZXMoRklMRSAqZnApCiB7Ci0JUHlPYmplY3QgKm9wOwotCWZwcmludGYoZnAsICJSZW1haW5pbmcgb2JqZWN0czpcbiIpOwotCWZvciAob3AgPSByZWZjaGFpbi5fb2JfbmV4dDsgb3AgIT0gJnJlZmNoYWluOyBvcCA9IG9wLT5fb2JfbmV4dCkgewotCQlmcHJpbnRmKGZwLCAiJXAgWyUiIFBZX0ZPUk1BVF9TSVpFX1QgImRdICIsIG9wLCBvcC0+b2JfcmVmY250KTsKLQkJaWYgKFB5T2JqZWN0X1ByaW50KG9wLCBmcCwgMCkgIT0gMCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCXB1dGMoJ1xuJywgZnApOwotCX0KKyAgICBQeU9iamVjdCAqb3A7CisgICAgZnByaW50ZihmcCwgIlJlbWFpbmluZyBvYmplY3RzOlxuIik7CisgICAgZm9yIChvcCA9IHJlZmNoYWluLl9vYl9uZXh0OyBvcCAhPSAmcmVmY2hhaW47IG9wID0gb3AtPl9vYl9uZXh0KSB7CisgICAgICAgIGZwcmludGYoZnAsICIlcCBbJSIgUFlfRk9STUFUX1NJWkVfVCAiZF0gIiwgb3AsIG9wLT5vYl9yZWZjbnQpOworICAgICAgICBpZiAoUHlPYmplY3RfUHJpbnQob3AsIGZwLCAwKSAhPSAwKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcHV0YygnXG4nLCBmcCk7CisgICAgfQogfQogCiAvKiBQcmludCB0aGUgYWRkcmVzc2VzIG9mIGFsbCBsaXZlIG9iamVjdHMuICBVbmxpa2UgX1B5X1ByaW50UmVmZXJlbmNlcywgdGhpcwpAQCAtMjIzMyw0MCArMjIzMyw0MCBAQAogdm9pZAogX1B5X1ByaW50UmVmZXJlbmNlQWRkcmVzc2VzKEZJTEUgKmZwKQogewotCVB5T2JqZWN0ICpvcDsKLQlmcHJpbnRmKGZwLCAiUmVtYWluaW5nIG9iamVjdCBhZGRyZXNzZXM6XG4iKTsKLQlmb3IgKG9wID0gcmVmY2hhaW4uX29iX25leHQ7IG9wICE9ICZyZWZjaGFpbjsgb3AgPSBvcC0+X29iX25leHQpCi0JCWZwcmludGYoZnAsICIlcCBbJSIgUFlfRk9STUFUX1NJWkVfVCAiZF0gJXNcbiIsIG9wLAotCQkJb3AtPm9iX3JlZmNudCwgUHlfVFlQRShvcCktPnRwX25hbWUpOworICAgIFB5T2JqZWN0ICpvcDsKKyAgICBmcHJpbnRmKGZwLCAiUmVtYWluaW5nIG9iamVjdCBhZGRyZXNzZXM6XG4iKTsKKyAgICBmb3IgKG9wID0gcmVmY2hhaW4uX29iX25leHQ7IG9wICE9ICZyZWZjaGFpbjsgb3AgPSBvcC0+X29iX25leHQpCisgICAgICAgIGZwcmludGYoZnAsICIlcCBbJSIgUFlfRk9STUFUX1NJWkVfVCAiZF0gJXNcbiIsIG9wLAorICAgICAgICAgICAgb3AtPm9iX3JlZmNudCwgUHlfVFlQRShvcCktPnRwX25hbWUpOwogfQogCiBQeU9iamVjdCAqCiBfUHlfR2V0T2JqZWN0cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGksIG47Ci0JUHlPYmplY3QgKnQgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXMsICpvcDsKKyAgICBpbnQgaSwgbjsKKyAgICBQeU9iamVjdCAqdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlcywgKm9wOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfE8iLCAmbiwgJnQpKQotCQlyZXR1cm4gTlVMTDsKLQlvcCA9IHJlZmNoYWluLl9vYl9uZXh0OwotCXJlcyA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyAobiA9PSAwIHx8IGkgPCBuKSAmJiBvcCAhPSAmcmVmY2hhaW47IGkrKykgewotCQl3aGlsZSAob3AgPT0gc2VsZiB8fCBvcCA9PSBhcmdzIHx8IG9wID09IHJlcyB8fCBvcCA9PSB0IHx8Ci0JCSAgICAgICAodCAhPSBOVUxMICYmIFB5X1RZUEUob3ApICE9IChQeVR5cGVPYmplY3QgKikgdCkpIHsKLQkJCW9wID0gb3AtPl9vYl9uZXh0OwotCQkJaWYgKG9wID09ICZyZWZjaGFpbikKLQkJCQlyZXR1cm4gcmVzOwotCQl9Ci0JCWlmIChQeUxpc3RfQXBwZW5kKHJlcywgb3ApIDwgMCkgewotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlvcCA9IG9wLT5fb2JfbmV4dDsKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8TyIsICZuLCAmdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9wID0gcmVmY2hhaW4uX29iX25leHQ7CisgICAgcmVzID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IChuID09IDAgfHwgaSA8IG4pICYmIG9wICE9ICZyZWZjaGFpbjsgaSsrKSB7CisgICAgICAgIHdoaWxlIChvcCA9PSBzZWxmIHx8IG9wID09IGFyZ3MgfHwgb3AgPT0gcmVzIHx8IG9wID09IHQgfHwKKyAgICAgICAgICAgICAgICh0ICE9IE5VTEwgJiYgUHlfVFlQRShvcCkgIT0gKFB5VHlwZU9iamVjdCAqKSB0KSkgeworICAgICAgICAgICAgb3AgPSBvcC0+X29iX25leHQ7CisgICAgICAgICAgICBpZiAob3AgPT0gJnJlZmNoYWluKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQocmVzLCBvcCkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG9wID0gb3AtPl9vYl9uZXh0OworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiAjZW5kaWYKQEAgLTIyODksMTkgKzIyODksMTkgQEAKIHZvaWQgKgogUHlNZW1fTWFsbG9jKHNpemVfdCBuYnl0ZXMpCiB7Ci0JcmV0dXJuIFB5TWVtX01BTExPQyhuYnl0ZXMpOworICAgIHJldHVybiBQeU1lbV9NQUxMT0MobmJ5dGVzKTsKIH0KIAogdm9pZCAqCiBQeU1lbV9SZWFsbG9jKHZvaWQgKnAsIHNpemVfdCBuYnl0ZXMpCiB7Ci0JcmV0dXJuIFB5TWVtX1JFQUxMT0MocCwgbmJ5dGVzKTsKKyAgICByZXR1cm4gUHlNZW1fUkVBTExPQyhwLCBuYnl0ZXMpOwogfQogCiB2b2lkCiBQeU1lbV9GcmVlKHZvaWQgKnApCiB7Ci0JUHlNZW1fRlJFRShwKTsKKyAgICBQeU1lbV9GUkVFKHApOwogfQogCiAKQEAgLTIzMjIsNTIgKzIzMjIsNTIgQEAKIGludAogUHlfUmVwckVudGVyKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JUHlPYmplY3QgKmxpc3Q7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICpsaXN0OworICAgIFB5X3NzaXplX3QgaTsKIAotCWRpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlsaXN0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgS0VZKTsKLQlpZiAobGlzdCA9PSBOVUxMKSB7Ci0JCWxpc3QgPSBQeUxpc3RfTmV3KDApOwotCQlpZiAobGlzdCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgS0VZLCBsaXN0KSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0RFQ1JFRihsaXN0KTsKLQl9Ci0JaSA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKLQl3aGlsZSAoLS1pID49IDApIHsKLQkJaWYgKFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKSA9PSBvYmopCi0JCQlyZXR1cm4gMTsKLQl9Ci0JUHlMaXN0X0FwcGVuZChsaXN0LCBvYmopOwotCXJldHVybiAwOworICAgIGRpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBsaXN0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgS0VZKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgICAgIGxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgICAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgS0VZLCBsaXN0KSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICB9CisgICAgaSA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgaWYgKFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKSA9PSBvYmopCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgUHlMaXN0X0FwcGVuZChsaXN0LCBvYmopOworICAgIHJldHVybiAwOwogfQogCiB2b2lkCiBQeV9SZXByTGVhdmUoUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlQeU9iamVjdCAqbGlzdDsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOwotCWlmIChkaWN0ID09IE5VTEwpCi0JCXJldHVybjsKLQlsaXN0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgS0VZKTsKLQlpZiAobGlzdCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sobGlzdCkpCi0JCXJldHVybjsKLQlpID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOwotCS8qIENvdW50IGJhY2t3YXJkcyBiZWNhdXNlIHdlIGFsd2F5cyBleHBlY3Qgb2JqIHRvIGJlIGxpc3RbLTFdICovCi0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCWlmIChQeUxpc3RfR0VUX0lURU0obGlzdCwgaSkgPT0gb2JqKSB7Ci0JCQlQeUxpc3RfU2V0U2xpY2UobGlzdCwgaSwgaSArIDEsIE5VTEwpOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBsaXN0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgS0VZKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sobGlzdCkpCisgICAgICAgIHJldHVybjsKKyAgICBpID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOworICAgIC8qIENvdW50IGJhY2t3YXJkcyBiZWNhdXNlIHdlIGFsd2F5cyBleHBlY3Qgb2JqIHRvIGJlIGxpc3RbLTFdICovCisgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgIGlmIChQeUxpc3RfR0VUX0lURU0obGlzdCwgaSkgPT0gb2JqKSB7CisgICAgICAgICAgICBQeUxpc3RfU2V0U2xpY2UobGlzdCwgaSwgaSArIDEsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIC8qIFRyYXNoY2FuIHN1cHBvcnQuICovCkBAIC0yMzg3LDExICsyMzg3LDExIEBACiB2b2lkCiBfUHlUcmFzaF9kZXBvc2l0X29iamVjdChQeU9iamVjdCAqb3ApCiB7Ci0JYXNzZXJ0KFB5T2JqZWN0X0lTX0dDKG9wKSk7Ci0JYXNzZXJ0KF9QeV9BU19HQyhvcCktPmdjLmdjX3JlZnMgPT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpOwotCWFzc2VydChvcC0+b2JfcmVmY250ID09IDApOwotCV9QeV9BU19HQyhvcCktPmdjLmdjX3ByZXYgPSAoUHlHQ19IZWFkICopX1B5VHJhc2hfZGVsZXRlX2xhdGVyOwotCV9QeVRyYXNoX2RlbGV0ZV9sYXRlciA9IG9wOworICAgIGFzc2VydChQeU9iamVjdF9JU19HQyhvcCkpOworICAgIGFzc2VydChfUHlfQVNfR0Mob3ApLT5nYy5nY19yZWZzID09IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsKKyAgICBhc3NlcnQob3AtPm9iX3JlZmNudCA9PSAwKTsKKyAgICBfUHlfQVNfR0Mob3ApLT5nYy5nY19wcmV2ID0gKFB5R0NfSGVhZCAqKV9QeVRyYXNoX2RlbGV0ZV9sYXRlcjsKKyAgICBfUHlUcmFzaF9kZWxldGVfbGF0ZXIgPSBvcDsKIH0KIAogLyogRGVhbGxvY2NhdGUgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBfUHlUcmFzaF9kZWxldGVfbGF0ZXIgbGlzdC4gIENhbGxlZCB3aGVuCkBAIC0yNDAwLDI0ICsyNDAwLDI0IEBACiB2b2lkCiBfUHlUcmFzaF9kZXN0cm95X2NoYWluKHZvaWQpCiB7Ci0Jd2hpbGUgKF9QeVRyYXNoX2RlbGV0ZV9sYXRlcikgewotCQlQeU9iamVjdCAqb3AgPSBfUHlUcmFzaF9kZWxldGVfbGF0ZXI7Ci0JCWRlc3RydWN0b3IgZGVhbGxvYyA9IFB5X1RZUEUob3ApLT50cF9kZWFsbG9jOworICAgIHdoaWxlIChfUHlUcmFzaF9kZWxldGVfbGF0ZXIpIHsKKyAgICAgICAgUHlPYmplY3QgKm9wID0gX1B5VHJhc2hfZGVsZXRlX2xhdGVyOworICAgICAgICBkZXN0cnVjdG9yIGRlYWxsb2MgPSBQeV9UWVBFKG9wKS0+dHBfZGVhbGxvYzsKIAotCQlfUHlUcmFzaF9kZWxldGVfbGF0ZXIgPQotCQkJKFB5T2JqZWN0KikgX1B5X0FTX0dDKG9wKS0+Z2MuZ2NfcHJldjsKKyAgICAgICAgX1B5VHJhc2hfZGVsZXRlX2xhdGVyID0KKyAgICAgICAgICAgIChQeU9iamVjdCopIF9QeV9BU19HQyhvcCktPmdjLmdjX3ByZXY7CiAKLQkJLyogQ2FsbCB0aGUgZGVhbGxvY2F0b3IgZGlyZWN0bHkuICBUaGlzIHVzZWQgdG8gdHJ5IHRvCi0JCSAqIGZvb2wgUHlfREVDUkVGIGludG8gY2FsbGluZyBpdCBpbmRpcmVjdGx5LCBidXQKLQkJICogUHlfREVDUkVGIHdhcyBhbHJlYWR5IGNhbGxlZCBvbiB0aGlzIG9iamVjdCwgYW5kIGluCi0JCSAqIGFzc29ydGVkIG5vbi1yZWxlYXNlIGJ1aWxkcyBjYWxsaW5nIFB5X0RFQ1JFRiBhZ2FpbiBlbmRzCi0JCSAqIHVwIGRpc3RvcnRpbmcgYWxsb2NhdGlvbiBzdGF0aXN0aWNzLgotCQkgKi8KLQkJYXNzZXJ0KG9wLT5vYl9yZWZjbnQgPT0gMCk7Ci0JCSsrX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7Ci0JCSgqZGVhbGxvYykob3ApOwotCQktLV9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOwotCX0KKyAgICAgICAgLyogQ2FsbCB0aGUgZGVhbGxvY2F0b3IgZGlyZWN0bHkuICBUaGlzIHVzZWQgdG8gdHJ5IHRvCisgICAgICAgICAqIGZvb2wgUHlfREVDUkVGIGludG8gY2FsbGluZyBpdCBpbmRpcmVjdGx5LCBidXQKKyAgICAgICAgICogUHlfREVDUkVGIHdhcyBhbHJlYWR5IGNhbGxlZCBvbiB0aGlzIG9iamVjdCwgYW5kIGluCisgICAgICAgICAqIGFzc29ydGVkIG5vbi1yZWxlYXNlIGJ1aWxkcyBjYWxsaW5nIFB5X0RFQ1JFRiBhZ2FpbiBlbmRzCisgICAgICAgICAqIHVwIGRpc3RvcnRpbmcgYWxsb2NhdGlvbiBzdGF0aXN0aWNzLgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KG9wLT5vYl9yZWZjbnQgPT0gMCk7CisgICAgICAgICsrX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7CisgICAgICAgICgqZGVhbGxvYykob3ApOworICAgICAgICAtLV9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgIH0KIH0KIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9PYmplY3RzL29ibWFsbG9jLmMgYi9PYmplY3RzL29ibWFsbG9jLmMKaW5kZXggYzhjMzZkNS4uNTA2YjFjMSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9vYm1hbGxvYy5jCisrKyBiL09iamVjdHMvb2JtYWxsb2MuYwpAQCAtMjcsNyArMjcsNyBAQAogICAgdGhlIGN5Y2xpYyBnYXJiYWdlIGNvbGxlY3RvciBvcGVyYXRlcyBzZWxlY3RpdmVseSBvbiBjb250YWluZXIgb2JqZWN0cy4KIAogCi0gICAgICAgIE9iamVjdC1zcGVjaWZpYyBhbGxvY2F0b3JzCisgICAgT2JqZWN0LXNwZWNpZmljIGFsbG9jYXRvcnMKICAgICBfX19fXyAgIF9fX19fXyAgIF9fX19fXyAgICAgICBfX19fX19fXwogICAgWyBpbnQgXSBbIGRpY3QgXSBbIGxpc3QgXSAuLi4gWyBzdHJpbmcgXSAgICAgICBQeXRob24gY29yZSAgICAgICAgIHwKICszIHwgPC0tLS0tIE9iamVjdC1zcGVjaWZpYyBtZW1vcnkgLS0tLS0+IHwgPC0tIE5vbi1vYmplY3QgbWVtb3J5IC0tPiB8CkBAIC02Nyw3ICs2Nyw3IEBACiAgKiAgICBpbiBQcm9jLiAxOTk1IEludCdsLiBXb3Jrc2hvcCBvbiBNZW1vcnkgTWFuYWdlbWVudCwgU2VwdGVtYmVyIDE5OTUuCiAgKi8KIAotLyogI3VuZGVmIFdJVEhfTUVNT1JZX0xJTUlUUyAqLwkJLyogZGlzYWJsZSBtZW0gbGltaXQgY2hlY2tzICAqLworLyogI3VuZGVmIFdJVEhfTUVNT1JZX0xJTUlUUyAqLyAgICAgICAgIC8qIGRpc2FibGUgbWVtIGxpbWl0IGNoZWNrcyAgKi8KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKQEAgLTk1LDIyICs5NSwyMiBAQAogICoKICAqIEZvciBzbWFsbCByZXF1ZXN0cyB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgdGFibGU6CiAgKgotICogUmVxdWVzdCBpbiBieXRlcwlTaXplIG9mIGFsbG9jYXRlZCBibG9jayAgICAgIFNpemUgY2xhc3MgaWR4CisgKiBSZXF1ZXN0IGluIGJ5dGVzICAgICBTaXplIG9mIGFsbG9jYXRlZCBibG9jayAgICAgIFNpemUgY2xhc3MgaWR4CiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgICAgICAgMS04ICAgICAgICAgICAgICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgMAotICoJICA5LTE2ICAgICAgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAxCi0gKgkgMTctMjQgICAgICAgICAgICAgICAgICAgMjQgICAgICAgICAgICAgICAgICAgICAgIDIKLSAqCSAyNS0zMiAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgMwotICoJIDMzLTQwICAgICAgICAgICAgICAgICAgIDQwICAgICAgICAgICAgICAgICAgICAgICA0Ci0gKgkgNDEtNDggICAgICAgICAgICAgICAgICAgNDggICAgICAgICAgICAgICAgICAgICAgIDUKLSAqCSA0OS01NiAgICAgICAgICAgICAgICAgICA1NiAgICAgICAgICAgICAgICAgICAgICAgNgotICoJIDU3LTY0ICAgICAgICAgICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICA3Ci0gKgkgNjUtNzIgICAgICAgICAgICAgICAgICAgNzIgICAgICAgICAgICAgICAgICAgICAgIDgKLSAqCSAgLi4uICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgIC4uLgotICoJMjQxLTI0OCAgICAgICAgICAgICAgICAgMjQ4ICAgICAgICAgICAgICAgICAgICAgIDMwCi0gKgkyNDktMjU2ICAgICAgICAgICAgICAgICAyNTYgICAgICAgICAgICAgICAgICAgICAgMzEKKyAqICAgICAgICA5LTE2ICAgICAgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAxCisgKiAgICAgICAxNy0yNCAgICAgICAgICAgICAgICAgICAyNCAgICAgICAgICAgICAgICAgICAgICAgMgorICogICAgICAgMjUtMzIgICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDMKKyAqICAgICAgIDMzLTQwICAgICAgICAgICAgICAgICAgIDQwICAgICAgICAgICAgICAgICAgICAgICA0CisgKiAgICAgICA0MS00OCAgICAgICAgICAgICAgICAgICA0OCAgICAgICAgICAgICAgICAgICAgICAgNQorICogICAgICAgNDktNTYgICAgICAgICAgICAgICAgICAgNTYgICAgICAgICAgICAgICAgICAgICAgIDYKKyAqICAgICAgIDU3LTY0ICAgICAgICAgICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICA3CisgKiAgICAgICA2NS03MiAgICAgICAgICAgICAgICAgICA3MiAgICAgICAgICAgICAgICAgICAgICAgOAorICogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAuLi4KKyAqICAgICAgMjQxLTI0OCAgICAgICAgICAgICAgICAgMjQ4ICAgICAgICAgICAgICAgICAgICAgIDMwCisgKiAgICAgIDI0OS0yNTYgICAgICAgICAgICAgICAgIDI1NiAgICAgICAgICAgICAgICAgICAgICAzMQogICoKLSAqCTAsIDI1NyBhbmQgdXA6IHJvdXRlZCB0byB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3IuCisgKiAgICAgIDAsIDI1NyBhbmQgdXA6IHJvdXRlZCB0byB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3IuCiAgKi8KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC0xMjcsOSArMTI3LDkgQEAKICAqCiAgKiBZb3Ugc2hvdWxkbid0IGNoYW5nZSB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCiAgKi8KLSNkZWZpbmUgQUxJR05NRU5UCQk4CQkvKiBtdXN0IGJlIDJeTiAqLwotI2RlZmluZSBBTElHTk1FTlRfU0hJRlQJCTMKLSNkZWZpbmUgQUxJR05NRU5UX01BU0sJCShBTElHTk1FTlQgLSAxKQorI2RlZmluZSBBTElHTk1FTlQgICAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgLyogbXVzdCBiZSAyXk4gKi8KKyNkZWZpbmUgQUxJR05NRU5UX1NISUZUICAgICAgICAgMworI2RlZmluZSBBTElHTk1FTlRfTUFTSyAgICAgICAgICAoQUxJR05NRU5UIC0gMSkKIAogLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gc2l6ZSBjbGFzcyBJLCBhcyBhIHVpbnQuICovCiAjZGVmaW5lIElOREVYMlNJWkUoSSkgKCgodWludCkoSSkgKyAxKSA8PCBBTElHTk1FTlRfU0hJRlQpCkBAIC0xNDAsMTQgKzE0MCwxNCBAQAogICogdGhpcyB2YWx1ZSBhY2NvcmRpbmcgdG8geW91ciBhcHBsaWNhdGlvbiBiZWhhdmlvdXIgYW5kIG1lbW9yeSBuZWVkcy4KICAqCiAgKiBUaGUgZm9sbG93aW5nIGludmFyaWFudHMgbXVzdCBob2xkOgotICoJMSkgQUxJR05NRU5UIDw9IFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEIDw9IDI1NgotICoJMikgU01BTExfUkVRVUVTVF9USFJFU0hPTEQgaXMgZXZlbmx5IGRpdmlzaWJsZSBieSBBTElHTk1FTlQKKyAqICAgICAgMSkgQUxJR05NRU5UIDw9IFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEIDw9IDI1NgorICogICAgICAyKSBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCBpcyBldmVubHkgZGl2aXNpYmxlIGJ5IEFMSUdOTUVOVAogICoKICAqIEFsdGhvdWdoIG5vdCByZXF1aXJlZCwgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgc3BhY2UgZWZmaWNpZW5jeSwKICAqIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgU01BTExfUkVRVUVTVF9USFJFU0hPTEQgaXMgc2V0IHRvIGEgcG93ZXIgb2YgMi4KICAqLwotI2RlZmluZSBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRAkyNTYKLSNkZWZpbmUgTkJfU01BTExfU0laRV9DTEFTU0VTCShTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCAvIEFMSUdOTUVOVCkKKyNkZWZpbmUgU01BTExfUkVRVUVTVF9USFJFU0hPTEQgMjU2CisjZGVmaW5lIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyAgIChTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCAvIEFMSUdOTUVOVCkKIAogLyoKICAqIFRoZSBzeXN0ZW0ncyBWTU0gcGFnZSBzaXplIGNhbiBiZSBvYnRhaW5lZCBvbiBtb3N0IHVuaWNlcyB3aXRoIGEKQEAgLTE1OSwxNSArMTU5LDE1IEBACiAgKiB2aW9sYXRpb24gZmF1bHQuICA0SyBpcyBhcHBhcmVudGx5IE9LIGZvciBhbGwgdGhlIHBsYXRmb3JtcyB0aGF0IHB5dGhvbgogICogY3VycmVudGx5IHRhcmdldHMuCiAgKi8KLSNkZWZpbmUgU1lTVEVNX1BBR0VfU0laRQkoNCAqIDEwMjQpCi0jZGVmaW5lIFNZU1RFTV9QQUdFX1NJWkVfTUFTSwkoU1lTVEVNX1BBR0VfU0laRSAtIDEpCisjZGVmaW5lIFNZU1RFTV9QQUdFX1NJWkUgICAgICAgICg0ICogMTAyNCkKKyNkZWZpbmUgU1lTVEVNX1BBR0VfU0laRV9NQVNLICAgKFNZU1RFTV9QQUdFX1NJWkUgLSAxKQogCiAvKgogICogTWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IG1hbmFnZWQgYnkgdGhlIGFsbG9jYXRvciBmb3Igc21hbGwgcmVxdWVzdHMuCiAgKi8KICNpZmRlZiBXSVRIX01FTU9SWV9MSU1JVFMKICNpZm5kZWYgU01BTExfTUVNT1JZX0xJTUlUCi0jZGVmaW5lIFNNQUxMX01FTU9SWV9MSU1JVAkoNjQgKiAxMDI0ICogMTAyNCkJLyogNjQgTUIgLS0gbW9yZT8gKi8KKyNkZWZpbmUgU01BTExfTUVNT1JZX0xJTUlUICAgICAgKDY0ICogMTAyNCAqIDEwMjQpICAgICAgLyogNjQgTUIgLS0gbW9yZT8gKi8KICNlbmRpZgogI2VuZGlmCiAKQEAgLTE4NCwxOCArMTg0LDE4IEBACiAgKiBzb21lIGFkZHJlc3Mgc3BhY2Ugd2FzdGFnZSwgYnV0IHRoaXMgaXMgdGhlIG1vc3QgcG9ydGFibGUgd2F5IHRvIHJlcXVlc3QKICAqIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0gYWNyb3NzIHZhcmlvdXMgcGxhdGZvcm1zLgogICovCi0jZGVmaW5lIEFSRU5BX1NJWkUJCSgyNTYgPDwgMTApCS8qIDI1NktCICovCisjZGVmaW5lIEFSRU5BX1NJWkUgICAgICAgICAgICAgICgyNTYgPDwgMTApICAgICAvKiAyNTZLQiAqLwogCiAjaWZkZWYgV0lUSF9NRU1PUllfTElNSVRTCi0jZGVmaW5lIE1BWF9BUkVOQVMJCShTTUFMTF9NRU1PUllfTElNSVQgLyBBUkVOQV9TSVpFKQorI2RlZmluZSBNQVhfQVJFTkFTICAgICAgICAgICAgICAoU01BTExfTUVNT1JZX0xJTUlUIC8gQVJFTkFfU0laRSkKICNlbmRpZgogCiAvKgogICogU2l6ZSBvZiB0aGUgcG9vbHMgdXNlZCBmb3Igc21hbGwgYmxvY2tzLiBTaG91bGQgYmUgYSBwb3dlciBvZiAyLAogICogYmV0d2VlbiAxSyBhbmQgU1lTVEVNX1BBR0VfU0laRSwgdGhhdCBpczogMWssIDJrLCA0ay4KICAqLwotI2RlZmluZSBQT09MX1NJWkUJCVNZU1RFTV9QQUdFX1NJWkUJLyogbXVzdCBiZSAyXk4gKi8KLSNkZWZpbmUgUE9PTF9TSVpFX01BU0sJCVNZU1RFTV9QQUdFX1NJWkVfTUFTSworI2RlZmluZSBQT09MX1NJWkUgICAgICAgICAgICAgICBTWVNURU1fUEFHRV9TSVpFICAgICAgICAvKiBtdXN0IGJlIDJeTiAqLworI2RlZmluZSBQT09MX1NJWkVfTUFTSyAgICAgICAgICBTWVNURU1fUEFHRV9TSVpFX01BU0sKIAogLyoKICAqIC0tIEVuZCBvZiB0dW5hYmxlIHNldHRpbmdzIHNlY3Rpb24gLS0KQEAgLTIyMSw5MiArMjIxLDkyIEBACiAvKgogICogUHl0aG9uJ3MgdGhyZWFkcyBhcmUgc2VyaWFsaXplZCwgc28gb2JqZWN0IG1hbGxvYyBsb2NraW5nIGlzIGRpc2FibGVkLgogICovCi0jZGVmaW5lIFNJTVBMRUxPQ0tfREVDTChsb2NrKQkvKiBzaW1wbGUgbG9jayBkZWNsYXJhdGlvbgkJKi8KLSNkZWZpbmUgU0lNUExFTE9DS19JTklUKGxvY2spCS8qIGFsbG9jYXRlIChpZiBuZWVkZWQpIGFuZCBpbml0aWFsaXplCSovCi0jZGVmaW5lIFNJTVBMRUxPQ0tfRklOSShsb2NrKQkvKiBmcmVlL2Rlc3Ryb3kgYW4gZXhpc3RpbmcgbG9jayAJKi8KLSNkZWZpbmUgU0lNUExFTE9DS19MT0NLKGxvY2spCS8qIGFjcXVpcmUgcmVsZWFzZWQgbG9jayAqLwotI2RlZmluZSBTSU1QTEVMT0NLX1VOTE9DSyhsb2NrKQkvKiByZWxlYXNlIGFjcXVpcmVkIGxvY2sgKi8KKyNkZWZpbmUgU0lNUExFTE9DS19ERUNMKGxvY2spICAgLyogc2ltcGxlIGxvY2sgZGVjbGFyYXRpb24gICAgICAgICAgICAgICovCisjZGVmaW5lIFNJTVBMRUxPQ0tfSU5JVChsb2NrKSAgIC8qIGFsbG9jYXRlIChpZiBuZWVkZWQpIGFuZCBpbml0aWFsaXplICAqLworI2RlZmluZSBTSU1QTEVMT0NLX0ZJTkkobG9jaykgICAvKiBmcmVlL2Rlc3Ryb3kgYW4gZXhpc3RpbmcgbG9jayAgICAgICAgKi8KKyNkZWZpbmUgU0lNUExFTE9DS19MT0NLKGxvY2spICAgLyogYWNxdWlyZSByZWxlYXNlZCBsb2NrICovCisjZGVmaW5lIFNJTVBMRUxPQ0tfVU5MT0NLKGxvY2spIC8qIHJlbGVhc2UgYWNxdWlyZWQgbG9jayAqLwogCiAvKgogICogQmFzaWMgdHlwZXMKICAqIEkgZG9uJ3QgY2FyZSBpZiB0aGVzZSBhcmUgZGVmaW5lZCBpbiA8c3lzL3R5cGVzLmg+IG9yIGVsc2V3aGVyZS4gQXhpb20uCiAgKi8KICN1bmRlZiAgdWNoYXIKLSNkZWZpbmUgdWNoYXIJdW5zaWduZWQgY2hhcgkvKiBhc3N1bWluZyA9PSA4IGJpdHMgICovCisjZGVmaW5lIHVjaGFyICAgdW5zaWduZWQgY2hhciAgIC8qIGFzc3VtaW5nID09IDggYml0cyAgKi8KIAogI3VuZGVmICB1aW50Ci0jZGVmaW5lIHVpbnQJdW5zaWduZWQgaW50CS8qIGFzc3VtaW5nID49IDE2IGJpdHMgKi8KKyNkZWZpbmUgdWludCAgICB1bnNpZ25lZCBpbnQgICAgLyogYXNzdW1pbmcgPj0gMTYgYml0cyAqLwogCiAjdW5kZWYgIHVsb25nCi0jZGVmaW5lIHVsb25nCXVuc2lnbmVkIGxvbmcJLyogYXNzdW1pbmcgPj0gMzIgYml0cyAqLworI2RlZmluZSB1bG9uZyAgIHVuc2lnbmVkIGxvbmcgICAvKiBhc3N1bWluZyA+PSAzMiBiaXRzICovCiAKICN1bmRlZiB1cHRyCi0jZGVmaW5lIHVwdHIJUHlfdWludHB0cl90CisjZGVmaW5lIHVwdHIgICAgUHlfdWludHB0cl90CiAKIC8qIFdoZW4geW91IHNheSBtZW1vcnksIG15IG1pbmQgcmVhc29ucyBpbiB0ZXJtcyBvZiAocG9pbnRlcnMgdG8pIGJsb2NrcyAqLwogdHlwZWRlZiB1Y2hhciBibG9jazsKIAogLyogUG9vbCBmb3Igc21hbGwgYmxvY2tzLiAqLwogc3RydWN0IHBvb2xfaGVhZGVyIHsKLQl1bmlvbiB7IGJsb2NrICpfcGFkZGluZzsKLQkJdWludCBjb3VudDsgfSByZWY7CS8qIG51bWJlciBvZiBhbGxvY2F0ZWQgYmxvY2tzICAgICovCi0JYmxvY2sgKmZyZWVibG9jazsJCS8qIHBvb2wncyBmcmVlIGxpc3QgaGVhZCAgICAgICAgICovCi0Jc3RydWN0IHBvb2xfaGVhZGVyICpuZXh0cG9vbDsJLyogbmV4dCBwb29sIG9mIHRoaXMgc2l6ZSBjbGFzcyAgKi8KLQlzdHJ1Y3QgcG9vbF9oZWFkZXIgKnByZXZwb29sOwkvKiBwcmV2aW91cyBwb29sICAgICAgICIiICAgICAgICAqLwotCXVpbnQgYXJlbmFpbmRleDsJCS8qIGluZGV4IGludG8gYXJlbmFzIG9mIGJhc2UgYWRyICovCi0JdWludCBzemlkeDsJCQkvKiBibG9jayBzaXplIGNsYXNzIGluZGV4CSAqLwotCXVpbnQgbmV4dG9mZnNldDsJCS8qIGJ5dGVzIHRvIHZpcmdpbiBibG9jawkgKi8KLQl1aW50IG1heG5leHRvZmZzZXQ7CQkvKiBsYXJnZXN0IHZhbGlkIG5leHRvZmZzZXQJICovCisgICAgdW5pb24geyBibG9jayAqX3BhZGRpbmc7CisgICAgICAgIHVpbnQgY291bnQ7IH0gcmVmOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBibG9ja3MgICAgKi8KKyAgICBibG9jayAqZnJlZWJsb2NrOyAgICAgICAgICAgICAgICAgICAvKiBwb29sJ3MgZnJlZSBsaXN0IGhlYWQgICAgICAgICAqLworICAgIHN0cnVjdCBwb29sX2hlYWRlciAqbmV4dHBvb2w7ICAgICAgIC8qIG5leHQgcG9vbCBvZiB0aGlzIHNpemUgY2xhc3MgICovCisgICAgc3RydWN0IHBvb2xfaGVhZGVyICpwcmV2cG9vbDsgICAgICAgLyogcHJldmlvdXMgcG9vbCAgICAgICAiIiAgICAgICAgKi8KKyAgICB1aW50IGFyZW5haW5kZXg7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbnRvIGFyZW5hcyBvZiBiYXNlIGFkciAqLworICAgIHVpbnQgc3ppZHg7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJsb2NrIHNpemUgY2xhc3MgaW5kZXggICAgICAgICovCisgICAgdWludCBuZXh0b2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgdG8gdmlyZ2luIGJsb2NrICAgICAgICAgKi8KKyAgICB1aW50IG1heG5leHRvZmZzZXQ7ICAgICAgICAgICAgICAgICAvKiBsYXJnZXN0IHZhbGlkIG5leHRvZmZzZXQgICAgICAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcG9vbF9oZWFkZXIgKnBvb2xwOwogCiAvKiBSZWNvcmQga2VlcGluZyBmb3IgYXJlbmFzLiAqLwogc3RydWN0IGFyZW5hX29iamVjdCB7Ci0JLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGFyZW5hLCBhcyByZXR1cm5lZCBieSBtYWxsb2MuICBOb3RlIHRoYXQgMAotCSAqIHdpbGwgbmV2ZXIgYmUgcmV0dXJuZWQgYnkgYSBzdWNjZXNzZnVsIG1hbGxvYywgYW5kIGlzIHVzZWQKLQkgKiBoZXJlIHRvIG1hcmsgYW4gYXJlbmFfb2JqZWN0IHRoYXQgZG9lc24ndCBjb3JyZXNwb25kIHRvIGFuCi0JICogYWxsb2NhdGVkIGFyZW5hLgotCSAqLwotCXVwdHIgYWRkcmVzczsKKyAgICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgYXJlbmEsIGFzIHJldHVybmVkIGJ5IG1hbGxvYy4gIE5vdGUgdGhhdCAwCisgICAgICogd2lsbCBuZXZlciBiZSByZXR1cm5lZCBieSBhIHN1Y2Nlc3NmdWwgbWFsbG9jLCBhbmQgaXMgdXNlZAorICAgICAqIGhlcmUgdG8gbWFyayBhbiBhcmVuYV9vYmplY3QgdGhhdCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYW4KKyAgICAgKiBhbGxvY2F0ZWQgYXJlbmEuCisgICAgICovCisgICAgdXB0ciBhZGRyZXNzOwogCi0JLyogUG9vbC1hbGlnbmVkIHBvaW50ZXIgdG8gdGhlIG5leHQgcG9vbCB0byBiZSBjYXJ2ZWQgb2ZmLiAqLwotCWJsb2NrKiBwb29sX2FkZHJlc3M7CisgICAgLyogUG9vbC1hbGlnbmVkIHBvaW50ZXIgdG8gdGhlIG5leHQgcG9vbCB0byBiZSBjYXJ2ZWQgb2ZmLiAqLworICAgIGJsb2NrKiBwb29sX2FkZHJlc3M7CiAKLQkvKiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwb29scyBpbiB0aGUgYXJlbmE6ICBmcmVlIHBvb2xzICsgbmV2ZXItCi0JICogYWxsb2NhdGVkIHBvb2xzLgotCSAqLwotCXVpbnQgbmZyZWVwb29sczsKKyAgICAvKiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwb29scyBpbiB0aGUgYXJlbmE6ICBmcmVlIHBvb2xzICsgbmV2ZXItCisgICAgICogYWxsb2NhdGVkIHBvb2xzLgorICAgICAqLworICAgIHVpbnQgbmZyZWVwb29sczsKIAotCS8qIFRoZSB0b3RhbCBudW1iZXIgb2YgcG9vbHMgaW4gdGhlIGFyZW5hLCB3aGV0aGVyIG9yIG5vdCBhdmFpbGFibGUuICovCi0JdWludCBudG90YWxwb29sczsKKyAgICAvKiBUaGUgdG90YWwgbnVtYmVyIG9mIHBvb2xzIGluIHRoZSBhcmVuYSwgd2hldGhlciBvciBub3QgYXZhaWxhYmxlLiAqLworICAgIHVpbnQgbnRvdGFscG9vbHM7CiAKLQkvKiBTaW5nbHktbGlua2VkIGxpc3Qgb2YgYXZhaWxhYmxlIHBvb2xzLiAqLwotCXN0cnVjdCBwb29sX2hlYWRlciogZnJlZXBvb2xzOworICAgIC8qIFNpbmdseS1saW5rZWQgbGlzdCBvZiBhdmFpbGFibGUgcG9vbHMuICovCisgICAgc3RydWN0IHBvb2xfaGVhZGVyKiBmcmVlcG9vbHM7CiAKLQkvKiBXaGVuZXZlciB0aGlzIGFyZW5hX29iamVjdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIGFsbG9jYXRlZAotCSAqIGFyZW5hLCB0aGUgbmV4dGFyZW5hIG1lbWJlciBpcyB1c2VkIHRvIGxpbmsgYWxsIHVuYXNzb2NpYXRlZAotCSAqIGFyZW5hX29iamVjdHMgaW4gdGhlIHNpbmdseS1saW5rZWQgYHVudXNlZF9hcmVuYV9vYmplY3RzYCBsaXN0LgotCSAqIFRoZSBwcmV2YXJlbmEgbWVtYmVyIGlzIHVudXNlZCBpbiB0aGlzIGNhc2UuCi0JICoKLQkgKiBXaGVuIHRoaXMgYXJlbmFfb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbGxvY2F0ZWQgYXJlbmEKLQkgKiB3aXRoIGF0IGxlYXN0IG9uZSBhdmFpbGFibGUgcG9vbCwgYm90aCBtZW1iZXJzIGFyZSB1c2VkIGluIHRoZQotCSAqIGRvdWJseS1saW5rZWQgYHVzYWJsZV9hcmVuYXNgIGxpc3QsIHdoaWNoIGlzIG1haW50YWluZWQgaW4KLQkgKiBpbmNyZWFzaW5nIG9yZGVyIG9mIGBuZnJlZXBvb2xzYCB2YWx1ZXMuCi0JICoKLQkgKiBFbHNlIHRoaXMgYXJlbmFfb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbGxvY2F0ZWQgYXJlbmEKLQkgKiBhbGwgb2Ygd2hvc2UgcG9vbHMgYXJlIGluIHVzZS4gIGBuZXh0YXJlbmFgIGFuZCBgcHJldmFyZW5hYAotCSAqIGFyZSBib3RoIG1lYW5pbmdsZXNzIGluIHRoaXMgY2FzZS4KLQkgKi8KLQlzdHJ1Y3QgYXJlbmFfb2JqZWN0KiBuZXh0YXJlbmE7Ci0Jc3RydWN0IGFyZW5hX29iamVjdCogcHJldmFyZW5hOworICAgIC8qIFdoZW5ldmVyIHRoaXMgYXJlbmFfb2JqZWN0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gYWxsb2NhdGVkCisgICAgICogYXJlbmEsIHRoZSBuZXh0YXJlbmEgbWVtYmVyIGlzIHVzZWQgdG8gbGluayBhbGwgdW5hc3NvY2lhdGVkCisgICAgICogYXJlbmFfb2JqZWN0cyBpbiB0aGUgc2luZ2x5LWxpbmtlZCBgdW51c2VkX2FyZW5hX29iamVjdHNgIGxpc3QuCisgICAgICogVGhlIHByZXZhcmVuYSBtZW1iZXIgaXMgdW51c2VkIGluIHRoaXMgY2FzZS4KKyAgICAgKgorICAgICAqIFdoZW4gdGhpcyBhcmVuYV9vYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGFsbG9jYXRlZCBhcmVuYQorICAgICAqIHdpdGggYXQgbGVhc3Qgb25lIGF2YWlsYWJsZSBwb29sLCBib3RoIG1lbWJlcnMgYXJlIHVzZWQgaW4gdGhlCisgICAgICogZG91Ymx5LWxpbmtlZCBgdXNhYmxlX2FyZW5hc2AgbGlzdCwgd2hpY2ggaXMgbWFpbnRhaW5lZCBpbgorICAgICAqIGluY3JlYXNpbmcgb3JkZXIgb2YgYG5mcmVlcG9vbHNgIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEVsc2UgdGhpcyBhcmVuYV9vYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGFsbG9jYXRlZCBhcmVuYQorICAgICAqIGFsbCBvZiB3aG9zZSBwb29scyBhcmUgaW4gdXNlLiAgYG5leHRhcmVuYWAgYW5kIGBwcmV2YXJlbmFgCisgICAgICogYXJlIGJvdGggbWVhbmluZ2xlc3MgaW4gdGhpcyBjYXNlLgorICAgICAqLworICAgIHN0cnVjdCBhcmVuYV9vYmplY3QqIG5leHRhcmVuYTsKKyAgICBzdHJ1Y3QgYXJlbmFfb2JqZWN0KiBwcmV2YXJlbmE7CiB9OwogCiAjdW5kZWYgIFJPVU5EVVAKLSNkZWZpbmUgUk9VTkRVUCh4KQkJKCgoeCkgKyBBTElHTk1FTlRfTUFTSykgJiB+QUxJR05NRU5UX01BU0spCi0jZGVmaW5lIFBPT0xfT1ZFUkhFQUQJCVJPVU5EVVAoc2l6ZW9mKHN0cnVjdCBwb29sX2hlYWRlcikpCisjZGVmaW5lIFJPVU5EVVAoeCkgICAgICAgICAgICAgICgoKHgpICsgQUxJR05NRU5UX01BU0spICYgfkFMSUdOTUVOVF9NQVNLKQorI2RlZmluZSBQT09MX09WRVJIRUFEICAgICAgICAgICBST1VORFVQKHNpemVvZihzdHJ1Y3QgcG9vbF9oZWFkZXIpKQogCi0jZGVmaW5lIERVTU1ZX1NJWkVfSURYCQkweGZmZmYJLyogc2l6ZSBjbGFzcyBvZiBuZXdseSBjYWNoZWQgcG9vbHMgKi8KKyNkZWZpbmUgRFVNTVlfU0laRV9JRFggICAgICAgICAgMHhmZmZmICAvKiBzaXplIGNsYXNzIG9mIG5ld2x5IGNhY2hlZCBwb29scyAqLwogCiAvKiBSb3VuZCBwb2ludGVyIFAgZG93biB0byB0aGUgY2xvc2VzdCBwb29sLWFsaWduZWQgYWRkcmVzcyA8PSBQLCBhcyBhIHBvb2xwICovCiAjZGVmaW5lIFBPT0xfQUREUihQKSAoKHBvb2xwKSgodXB0cikoUCkgJiB+KHVwdHIpUE9PTF9TSVpFX01BU0spKQpAQCAtMzIwLDEwICszMjAsMTAgQEAKICAqIFRoaXMgbWFsbG9jIGxvY2sKICAqLwogU0lNUExFTE9DS19ERUNMKF9tYWxsb2NfbG9jaykKLSNkZWZpbmUgTE9DSygpCQlTSU1QTEVMT0NLX0xPQ0soX21hbGxvY19sb2NrKQotI2RlZmluZSBVTkxPQ0soKQlTSU1QTEVMT0NLX1VOTE9DSyhfbWFsbG9jX2xvY2spCi0jZGVmaW5lIExPQ0tfSU5JVCgpCVNJTVBMRUxPQ0tfSU5JVChfbWFsbG9jX2xvY2spCi0jZGVmaW5lIExPQ0tfRklOSSgpCVNJTVBMRUxPQ0tfRklOSShfbWFsbG9jX2xvY2spCisjZGVmaW5lIExPQ0soKSAgICAgICAgICBTSU1QTEVMT0NLX0xPQ0soX21hbGxvY19sb2NrKQorI2RlZmluZSBVTkxPQ0soKSAgICAgICAgU0lNUExFTE9DS19VTkxPQ0soX21hbGxvY19sb2NrKQorI2RlZmluZSBMT0NLX0lOSVQoKSAgICAgU0lNUExFTE9DS19JTklUKF9tYWxsb2NfbG9jaykKKyNkZWZpbmUgTE9DS19GSU5JKCkgICAgIFNJTVBMRUxPQ0tfRklOSShfbWFsbG9jX2xvY2spCiAKIC8qCiAgKiBQb29sIHRhYmxlIC0tIGhlYWRlZCwgY2lyY3VsYXIsIGRvdWJseS1saW5rZWQgbGlzdHMgb2YgcGFydGlhbGx5IHVzZWQgcG9vbHMuCkBAIC00MDMsOSArNDAzLDkgQEAKIGNvbXBlbnNhdGluZyBmb3IgdGhhdCBhIHBvb2xfaGVhZGVyJ3MgbmV4dHBvb2wgYW5kIHByZXZwb29sIG1lbWJlcnMKIGltbWVkaWF0ZWx5IGZvbGxvdyBhIHBvb2xfaGVhZGVyJ3MgZmlyc3QgdHdvIG1lbWJlcnM6CiAKLQl1bmlvbiB7IGJsb2NrICpfcGFkZGluZzsKLQkJdWludCBjb3VudDsgfSByZWY7Ci0JYmxvY2sgKmZyZWVibG9jazsKKyAgICB1bmlvbiB7IGJsb2NrICpfcGFkZGluZzsKKyAgICAgICAgdWludCBjb3VudDsgfSByZWY7CisgICAgYmxvY2sgKmZyZWVibG9jazsKIAogZWFjaCBvZiB3aGljaCBjb25zdW1lIHNpemVvZihibG9jayAqKSBieXRlcy4gIFNvIHdoYXQgdXNlZHBvb2xzW2kraV0gcmVhbGx5CiBjb250YWlucyBpcyBhIGZ1ZGdlZC11cCBwb2ludGVyIHAgc3VjaCB0aGF0ICppZiogQyBiZWxpZXZlcyBpdCdzIGEgcG9vbHAKQEAgLTQyMSwyNSArNDIxLDI1IEBACiB0aGUgcHJldnBvb2wgbWVtYmVyLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCi0jZGVmaW5lIFBUQSh4KQkoKHBvb2xwICkoKHVjaGFyICopJih1c2VkcG9vbHNbMiooeCldKSAtIDIqc2l6ZW9mKGJsb2NrICopKSkKLSNkZWZpbmUgUFQoeCkJUFRBKHgpLCBQVEEoeCkKKyNkZWZpbmUgUFRBKHgpICAoKHBvb2xwICkoKHVjaGFyICopJih1c2VkcG9vbHNbMiooeCldKSAtIDIqc2l6ZW9mKGJsb2NrICopKSkKKyNkZWZpbmUgUFQoeCkgICBQVEEoeCksIFBUQSh4KQogCiBzdGF0aWMgcG9vbHAgdXNlZHBvb2xzWzIgKiAoKE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyArIDcpIC8gOCkgKiA4XSA9IHsKLQlQVCgwKSwgUFQoMSksIFBUKDIpLCBQVCgzKSwgUFQoNCksIFBUKDUpLCBQVCg2KSwgUFQoNykKKyAgICBQVCgwKSwgUFQoMSksIFBUKDIpLCBQVCgzKSwgUFQoNCksIFBUKDUpLCBQVCg2KSwgUFQoNykKICNpZiBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgPiA4Ci0JLCBQVCg4KSwgUFQoOSksIFBUKDEwKSwgUFQoMTEpLCBQVCgxMiksIFBUKDEzKSwgUFQoMTQpLCBQVCgxNSkKKyAgICAsIFBUKDgpLCBQVCg5KSwgUFQoMTApLCBQVCgxMSksIFBUKDEyKSwgUFQoMTMpLCBQVCgxNCksIFBUKDE1KQogI2lmIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyA+IDE2Ci0JLCBQVCgxNiksIFBUKDE3KSwgUFQoMTgpLCBQVCgxOSksIFBUKDIwKSwgUFQoMjEpLCBQVCgyMiksIFBUKDIzKQorICAgICwgUFQoMTYpLCBQVCgxNyksIFBUKDE4KSwgUFQoMTkpLCBQVCgyMCksIFBUKDIxKSwgUFQoMjIpLCBQVCgyMykKICNpZiBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgPiAyNAotCSwgUFQoMjQpLCBQVCgyNSksIFBUKDI2KSwgUFQoMjcpLCBQVCgyOCksIFBUKDI5KSwgUFQoMzApLCBQVCgzMSkKKyAgICAsIFBUKDI0KSwgUFQoMjUpLCBQVCgyNiksIFBUKDI3KSwgUFQoMjgpLCBQVCgyOSksIFBUKDMwKSwgUFQoMzEpCiAjaWYgTkJfU01BTExfU0laRV9DTEFTU0VTID4gMzIKLQksIFBUKDMyKSwgUFQoMzMpLCBQVCgzNCksIFBUKDM1KSwgUFQoMzYpLCBQVCgzNyksIFBUKDM4KSwgUFQoMzkpCisgICAgLCBQVCgzMiksIFBUKDMzKSwgUFQoMzQpLCBQVCgzNSksIFBUKDM2KSwgUFQoMzcpLCBQVCgzOCksIFBUKDM5KQogI2lmIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyA+IDQwCi0JLCBQVCg0MCksIFBUKDQxKSwgUFQoNDIpLCBQVCg0MyksIFBUKDQ0KSwgUFQoNDUpLCBQVCg0NiksIFBUKDQ3KQorICAgICwgUFQoNDApLCBQVCg0MSksIFBUKDQyKSwgUFQoNDMpLCBQVCg0NCksIFBUKDQ1KSwgUFQoNDYpLCBQVCg0NykKICNpZiBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgPiA0OAotCSwgUFQoNDgpLCBQVCg0OSksIFBUKDUwKSwgUFQoNTEpLCBQVCg1MiksIFBUKDUzKSwgUFQoNTQpLCBQVCg1NSkKKyAgICAsIFBUKDQ4KSwgUFQoNDkpLCBQVCg1MCksIFBUKDUxKSwgUFQoNTIpLCBQVCg1MyksIFBUKDU0KSwgUFQoNTUpCiAjaWYgTkJfU01BTExfU0laRV9DTEFTU0VTID4gNTYKLQksIFBUKDU2KSwgUFQoNTcpLCBQVCg1OCksIFBUKDU5KSwgUFQoNjApLCBQVCg2MSksIFBUKDYyKSwgUFQoNjMpCisgICAgLCBQVCg1NiksIFBUKDU3KSwgUFQoNTgpLCBQVCg1OSksIFBUKDYwKSwgUFQoNjEpLCBQVCg2MiksIFBUKDYzKQogI2VuZGlmIC8qIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyA+IDU2ICovCiAjZW5kaWYgLyogTkJfU01BTExfU0laRV9DTEFTU0VTID4gNDggKi8KICNlbmRpZiAvKiBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgPiA0MCAqLwpAQCAtNTIzLDkwICs1MjMsOTAgQEAKIHN0YXRpYyBzdHJ1Y3QgYXJlbmFfb2JqZWN0KgogbmV3X2FyZW5hKHZvaWQpCiB7Ci0Jc3RydWN0IGFyZW5hX29iamVjdCogYXJlbmFvYmo7Ci0JdWludCBleGNlc3M7CS8qIG51bWJlciBvZiBieXRlcyBhYm92ZSBwb29sIGFsaWdubWVudCAqLworICAgIHN0cnVjdCBhcmVuYV9vYmplY3QqIGFyZW5hb2JqOworICAgIHVpbnQgZXhjZXNzOyAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIGFib3ZlIHBvb2wgYWxpZ25tZW50ICovCiAKICNpZmRlZiBQWU1BTExPQ19ERUJVRwotCWlmIChQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIikpCi0JCV9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKCk7CisgICAgaWYgKFB5X0dFVEVOVigiUFlUSE9OTUFMTE9DU1RBVFMiKSkKKyAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHMoKTsKICNlbmRpZgotCWlmICh1bnVzZWRfYXJlbmFfb2JqZWN0cyA9PSBOVUxMKSB7Ci0JCXVpbnQgaTsKLQkJdWludCBudW1hcmVuYXM7Ci0JCXNpemVfdCBuYnl0ZXM7CisgICAgaWYgKHVudXNlZF9hcmVuYV9vYmplY3RzID09IE5VTEwpIHsKKyAgICAgICAgdWludCBpOworICAgICAgICB1aW50IG51bWFyZW5hczsKKyAgICAgICAgc2l6ZV90IG5ieXRlczsKIAotCQkvKiBEb3VibGUgdGhlIG51bWJlciBvZiBhcmVuYSBvYmplY3RzIG9uIGVhY2ggYWxsb2NhdGlvbi4KLQkJICogTm90ZSB0aGF0IGl0J3MgcG9zc2libGUgZm9yIGBudW1hcmVuYXNgIHRvIG92ZXJmbG93LgotCQkgKi8KLQkJbnVtYXJlbmFzID0gbWF4YXJlbmFzID8gbWF4YXJlbmFzIDw8IDEgOiBJTklUSUFMX0FSRU5BX09CSkVDVFM7Ci0JCWlmIChudW1hcmVuYXMgPD0gbWF4YXJlbmFzKQotCQkJcmV0dXJuIE5VTEw7CS8qIG92ZXJmbG93ICovCisgICAgICAgIC8qIERvdWJsZSB0aGUgbnVtYmVyIG9mIGFyZW5hIG9iamVjdHMgb24gZWFjaCBhbGxvY2F0aW9uLgorICAgICAgICAgKiBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgYG51bWFyZW5hc2AgdG8gb3ZlcmZsb3cuCisgICAgICAgICAqLworICAgICAgICBudW1hcmVuYXMgPSBtYXhhcmVuYXMgPyBtYXhhcmVuYXMgPDwgMSA6IElOSVRJQUxfQVJFTkFfT0JKRUNUUzsKKyAgICAgICAgaWYgKG51bWFyZW5hcyA8PSBtYXhhcmVuYXMpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogb3ZlcmZsb3cgKi8KICNpZiBTSVpFT0ZfU0laRV9UIDw9IFNJWkVPRl9JTlQKLQkJaWYgKG51bWFyZW5hcyA+IFBZX1NJWkVfTUFYIC8gc2l6ZW9mKCphcmVuYXMpKQotCQkJcmV0dXJuIE5VTEw7CS8qIG92ZXJmbG93ICovCisgICAgICAgIGlmIChudW1hcmVuYXMgPiBQWV9TSVpFX01BWCAvIHNpemVvZigqYXJlbmFzKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBvdmVyZmxvdyAqLwogI2VuZGlmCi0JCW5ieXRlcyA9IG51bWFyZW5hcyAqIHNpemVvZigqYXJlbmFzKTsKLQkJYXJlbmFvYmogPSAoc3RydWN0IGFyZW5hX29iamVjdCAqKXJlYWxsb2MoYXJlbmFzLCBuYnl0ZXMpOwotCQlpZiAoYXJlbmFvYmogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlhcmVuYXMgPSBhcmVuYW9iajsKKyAgICAgICAgbmJ5dGVzID0gbnVtYXJlbmFzICogc2l6ZW9mKCphcmVuYXMpOworICAgICAgICBhcmVuYW9iaiA9IChzdHJ1Y3QgYXJlbmFfb2JqZWN0ICopcmVhbGxvYyhhcmVuYXMsIG5ieXRlcyk7CisgICAgICAgIGlmIChhcmVuYW9iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGFyZW5hcyA9IGFyZW5hb2JqOwogCi0JCS8qIFdlIG1pZ2h0IG5lZWQgdG8gZml4IHBvaW50ZXJzIHRoYXQgd2VyZSBjb3BpZWQuICBIb3dldmVyLAotCQkgKiBuZXdfYXJlbmEgb25seSBnZXRzIGNhbGxlZCB3aGVuIGFsbCB0aGUgcGFnZXMgaW4gdGhlCi0JCSAqIHByZXZpb3VzIGFyZW5hcyBhcmUgZnVsbC4gIFRodXMsIHRoZXJlIGFyZSAqbm8qIHBvaW50ZXJzCi0JCSAqIGludG8gdGhlIG9sZCBhcnJheS4gVGh1cywgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dAotCQkgKiBpbnZhbGlkIHBvaW50ZXJzLiAgSnVzdCB0byBiZSBzdXJlLCBzb21lIGFzc2VydHM6Ci0JCSAqLwotCQlhc3NlcnQodXNhYmxlX2FyZW5hcyA9PSBOVUxMKTsKLQkJYXNzZXJ0KHVudXNlZF9hcmVuYV9vYmplY3RzID09IE5VTEwpOworICAgICAgICAvKiBXZSBtaWdodCBuZWVkIHRvIGZpeCBwb2ludGVycyB0aGF0IHdlcmUgY29waWVkLiAgSG93ZXZlciwKKyAgICAgICAgICogbmV3X2FyZW5hIG9ubHkgZ2V0cyBjYWxsZWQgd2hlbiBhbGwgdGhlIHBhZ2VzIGluIHRoZQorICAgICAgICAgKiBwcmV2aW91cyBhcmVuYXMgYXJlIGZ1bGwuICBUaHVzLCB0aGVyZSBhcmUgKm5vKiBwb2ludGVycworICAgICAgICAgKiBpbnRvIHRoZSBvbGQgYXJyYXkuIFRodXMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQKKyAgICAgICAgICogaW52YWxpZCBwb2ludGVycy4gIEp1c3QgdG8gYmUgc3VyZSwgc29tZSBhc3NlcnRzOgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KHVzYWJsZV9hcmVuYXMgPT0gTlVMTCk7CisgICAgICAgIGFzc2VydCh1bnVzZWRfYXJlbmFfb2JqZWN0cyA9PSBOVUxMKTsKIAotCQkvKiBQdXQgdGhlIG5ldyBhcmVuYXMgb24gdGhlIHVudXNlZF9hcmVuYV9vYmplY3RzIGxpc3QuICovCi0JCWZvciAoaSA9IG1heGFyZW5hczsgaSA8IG51bWFyZW5hczsgKytpKSB7Ci0JCQlhcmVuYXNbaV0uYWRkcmVzcyA9IDA7CS8qIG1hcmsgYXMgdW5hc3NvY2lhdGVkICovCi0JCQlhcmVuYXNbaV0ubmV4dGFyZW5hID0gaSA8IG51bWFyZW5hcyAtIDEgPwotCQkJCQkgICAgICAgJmFyZW5hc1tpKzFdIDogTlVMTDsKLQkJfQorICAgICAgICAvKiBQdXQgdGhlIG5ldyBhcmVuYXMgb24gdGhlIHVudXNlZF9hcmVuYV9vYmplY3RzIGxpc3QuICovCisgICAgICAgIGZvciAoaSA9IG1heGFyZW5hczsgaSA8IG51bWFyZW5hczsgKytpKSB7CisgICAgICAgICAgICBhcmVuYXNbaV0uYWRkcmVzcyA9IDA7ICAgICAgICAgICAgICAvKiBtYXJrIGFzIHVuYXNzb2NpYXRlZCAqLworICAgICAgICAgICAgYXJlbmFzW2ldLm5leHRhcmVuYSA9IGkgPCBudW1hcmVuYXMgLSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZW5hc1tpKzFdIDogTlVMTDsKKyAgICAgICAgfQogCi0JCS8qIFVwZGF0ZSBnbG9iYWxzLiAqLwotCQl1bnVzZWRfYXJlbmFfb2JqZWN0cyA9ICZhcmVuYXNbbWF4YXJlbmFzXTsKLQkJbWF4YXJlbmFzID0gbnVtYXJlbmFzOwotCX0KKyAgICAgICAgLyogVXBkYXRlIGdsb2JhbHMuICovCisgICAgICAgIHVudXNlZF9hcmVuYV9vYmplY3RzID0gJmFyZW5hc1ttYXhhcmVuYXNdOworICAgICAgICBtYXhhcmVuYXMgPSBudW1hcmVuYXM7CisgICAgfQogCi0JLyogVGFrZSB0aGUgbmV4dCBhdmFpbGFibGUgYXJlbmEgb2JqZWN0IG9mZiB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KLQlhc3NlcnQodW51c2VkX2FyZW5hX29iamVjdHMgIT0gTlVMTCk7Ci0JYXJlbmFvYmogPSB1bnVzZWRfYXJlbmFfb2JqZWN0czsKLQl1bnVzZWRfYXJlbmFfb2JqZWN0cyA9IGFyZW5hb2JqLT5uZXh0YXJlbmE7Ci0JYXNzZXJ0KGFyZW5hb2JqLT5hZGRyZXNzID09IDApOwotCWFyZW5hb2JqLT5hZGRyZXNzID0gKHVwdHIpbWFsbG9jKEFSRU5BX1NJWkUpOwotCWlmIChhcmVuYW9iai0+YWRkcmVzcyA9PSAwKSB7Ci0JCS8qIFRoZSBhbGxvY2F0aW9uIGZhaWxlZDogcmV0dXJuIE5VTEwgYWZ0ZXIgcHV0dGluZyB0aGUKLQkJICogYXJlbmFvYmogYmFjay4KLQkJICovCi0JCWFyZW5hb2JqLT5uZXh0YXJlbmEgPSB1bnVzZWRfYXJlbmFfb2JqZWN0czsKLQkJdW51c2VkX2FyZW5hX29iamVjdHMgPSBhcmVuYW9iajsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFRha2UgdGhlIG5leHQgYXZhaWxhYmxlIGFyZW5hIG9iamVjdCBvZmYgdGhlIGhlYWQgb2YgdGhlIGxpc3QuICovCisgICAgYXNzZXJ0KHVudXNlZF9hcmVuYV9vYmplY3RzICE9IE5VTEwpOworICAgIGFyZW5hb2JqID0gdW51c2VkX2FyZW5hX29iamVjdHM7CisgICAgdW51c2VkX2FyZW5hX29iamVjdHMgPSBhcmVuYW9iai0+bmV4dGFyZW5hOworICAgIGFzc2VydChhcmVuYW9iai0+YWRkcmVzcyA9PSAwKTsKKyAgICBhcmVuYW9iai0+YWRkcmVzcyA9ICh1cHRyKW1hbGxvYyhBUkVOQV9TSVpFKTsKKyAgICBpZiAoYXJlbmFvYmotPmFkZHJlc3MgPT0gMCkgeworICAgICAgICAvKiBUaGUgYWxsb2NhdGlvbiBmYWlsZWQ6IHJldHVybiBOVUxMIGFmdGVyIHB1dHRpbmcgdGhlCisgICAgICAgICAqIGFyZW5hb2JqIGJhY2suCisgICAgICAgICAqLworICAgICAgICBhcmVuYW9iai0+bmV4dGFyZW5hID0gdW51c2VkX2FyZW5hX29iamVjdHM7CisgICAgICAgIHVudXNlZF9hcmVuYV9vYmplY3RzID0gYXJlbmFvYmo7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCSsrbmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkOworICAgICsrbmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkOwogI2lmZGVmIFBZTUFMTE9DX0RFQlVHCi0JKytudGltZXNfYXJlbmFfYWxsb2NhdGVkOwotCWlmIChuYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQgPiBuYXJlbmFzX2hpZ2h3YXRlcikKLQkJbmFyZW5hc19oaWdod2F0ZXIgPSBuYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQ7CisgICAgKytudGltZXNfYXJlbmFfYWxsb2NhdGVkOworICAgIGlmIChuYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQgPiBuYXJlbmFzX2hpZ2h3YXRlcikKKyAgICAgICAgbmFyZW5hc19oaWdod2F0ZXIgPSBuYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQ7CiAjZW5kaWYKLQlhcmVuYW9iai0+ZnJlZXBvb2xzID0gTlVMTDsKLQkvKiBwb29sX2FkZHJlc3MgPC0gZmlyc3QgcG9vbC1hbGlnbmVkIGFkZHJlc3MgaW4gdGhlIGFyZW5hCi0JICAgbmZyZWVwb29scyA8LSBudW1iZXIgb2Ygd2hvbGUgcG9vbHMgdGhhdCBmaXQgYWZ0ZXIgYWxpZ25tZW50ICovCi0JYXJlbmFvYmotPnBvb2xfYWRkcmVzcyA9IChibG9jayopYXJlbmFvYmotPmFkZHJlc3M7Ci0JYXJlbmFvYmotPm5mcmVlcG9vbHMgPSBBUkVOQV9TSVpFIC8gUE9PTF9TSVpFOwotCWFzc2VydChQT09MX1NJWkUgKiBhcmVuYW9iai0+bmZyZWVwb29scyA9PSBBUkVOQV9TSVpFKTsKLQlleGNlc3MgPSAodWludCkoYXJlbmFvYmotPmFkZHJlc3MgJiBQT09MX1NJWkVfTUFTSyk7Ci0JaWYgKGV4Y2VzcyAhPSAwKSB7Ci0JCS0tYXJlbmFvYmotPm5mcmVlcG9vbHM7Ci0JCWFyZW5hb2JqLT5wb29sX2FkZHJlc3MgKz0gUE9PTF9TSVpFIC0gZXhjZXNzOwotCX0KLQlhcmVuYW9iai0+bnRvdGFscG9vbHMgPSBhcmVuYW9iai0+bmZyZWVwb29sczsKKyAgICBhcmVuYW9iai0+ZnJlZXBvb2xzID0gTlVMTDsKKyAgICAvKiBwb29sX2FkZHJlc3MgPC0gZmlyc3QgcG9vbC1hbGlnbmVkIGFkZHJlc3MgaW4gdGhlIGFyZW5hCisgICAgICAgbmZyZWVwb29scyA8LSBudW1iZXIgb2Ygd2hvbGUgcG9vbHMgdGhhdCBmaXQgYWZ0ZXIgYWxpZ25tZW50ICovCisgICAgYXJlbmFvYmotPnBvb2xfYWRkcmVzcyA9IChibG9jayopYXJlbmFvYmotPmFkZHJlc3M7CisgICAgYXJlbmFvYmotPm5mcmVlcG9vbHMgPSBBUkVOQV9TSVpFIC8gUE9PTF9TSVpFOworICAgIGFzc2VydChQT09MX1NJWkUgKiBhcmVuYW9iai0+bmZyZWVwb29scyA9PSBBUkVOQV9TSVpFKTsKKyAgICBleGNlc3MgPSAodWludCkoYXJlbmFvYmotPmFkZHJlc3MgJiBQT09MX1NJWkVfTUFTSyk7CisgICAgaWYgKGV4Y2VzcyAhPSAwKSB7CisgICAgICAgIC0tYXJlbmFvYmotPm5mcmVlcG9vbHM7CisgICAgICAgIGFyZW5hb2JqLT5wb29sX2FkZHJlc3MgKz0gUE9PTF9TSVpFIC0gZXhjZXNzOworICAgIH0KKyAgICBhcmVuYW9iai0+bnRvdGFscG9vbHMgPSBhcmVuYW9iai0+bmZyZWVwb29sczsKIAotCXJldHVybiBhcmVuYW9iajsKKyAgICByZXR1cm4gYXJlbmFvYmo7CiB9CiAKIC8qCkBAIC02MjIsMTEgKzYyMiwxMSBAQAogVHJpY2t5OiAgTGV0IEIgYmUgdGhlIGFyZW5hIGJhc2UgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBvb2wsIEIgPQogYXJlbmFzWyhQT09MKS0+YXJlbmFpbmRleF0uYWRkcmVzcy4gIFRoZW4gUCBiZWxvbmdzIHRvIHRoZSBhcmVuYSBpZiBhbmQgb25seSBpZgogCi0JQiA8PSBQIDwgQiArIEFSRU5BX1NJWkUKKyAgICBCIDw9IFAgPCBCICsgQVJFTkFfU0laRQogCiBTdWJ0cmFjdGluZyBCIHRocm91Z2hvdXQsIHRoaXMgaXMgdHJ1ZSBpZmYKIAotCTAgPD0gUC1CIDwgQVJFTkFfU0laRQorICAgIDAgPD0gUC1CIDwgQVJFTkFfU0laRQogCiBCeSB1c2luZyB1bnNpZ25lZCBhcml0aG1ldGljLCB0aGUgIjAgPD0iIGhhbGYgb2YgdGhlIHRlc3QgY2FuIGJlIHNraXBwZWQuCiAKQEAgLTY2MCw3ICs2NjAsNyBAQAogYXJlbmFfb2JqZWN0IChvbmUgbm90IGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggYW4gYWxsb2NhdGVkIGFyZW5hKSwKIEFPLmFkZHJlc3MgaXMgMCwgYW5kIHRoZSBzZWNvbmQgdGVzdCBpbiB0aGUgbWFjcm8gcmVkdWNlcyB0bzoKIAotCVAgPCBBUkVOQV9TSVpFCisgICAgUCA8IEFSRU5BX1NJWkUKIAogSWYgUCA+PSBBUkVOQV9TSVpFIChleHRyZW1lbHkgbGlrZWx5KSwgdGhlIG1hY3JvIGFnYWluIGNvcnJlY3RseSBjb25jbHVkZXMKIHRoYXQgUCBpcyBub3QgY29udHJvbGxlZCBieSBvYm1hbGxvYy4gIEhvd2V2ZXIsIGlmIFAgPCBBUkVOQV9TSVpFLCB0aGlzIHBhcnQKQEAgLTY4MywxMCArNjgzLDEwIEBACiBvYm1hbGxvYyBjb250cm9scy4gIFNpbmNlIHRoaXMgdGVzdCBpcyBuZWVkZWQgYXQgZXZlcnkgZW50cnkgcG9pbnQsIGl0J3MKIGV4dHJlbWVseSBkZXNpcmFibGUgdGhhdCBpdCBiZSB0aGlzIGZhc3QuCiAqLwotI2RlZmluZSBQeV9BRERSRVNTX0lOX1JBTkdFKFAsIFBPT0wpCQkJXAotCSgoUE9PTCktPmFyZW5haW5kZXggPCBtYXhhcmVuYXMgJiYJCVwKLQkgKHVwdHIpKFApIC0gYXJlbmFzWyhQT09MKS0+YXJlbmFpbmRleF0uYWRkcmVzcyA8ICh1cHRyKUFSRU5BX1NJWkUgJiYgXAotCSBhcmVuYXNbKFBPT0wpLT5hcmVuYWluZGV4XS5hZGRyZXNzICE9IDApCisjZGVmaW5lIFB5X0FERFJFU1NfSU5fUkFOR0UoUCwgUE9PTCkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKFBPT0wpLT5hcmVuYWluZGV4IDwgbWF4YXJlbmFzICYmICAgICAgICAgICAgICAgICAgXAorICAgICAodXB0cikoUCkgLSBhcmVuYXNbKFBPT0wpLT5hcmVuYWluZGV4XS5hZGRyZXNzIDwgKHVwdHIpQVJFTkFfU0laRSAmJiBcCisgICAgIGFyZW5hc1soUE9PTCktPmFyZW5haW5kZXhdLmFkZHJlc3MgIT0gMCkKIAogCiAvKiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gcnVubmluZyBtZW1vcnkgZGVidWdnZXJzIHN1Y2ggYXMKQEAgLTcwOSw3ICs3MDksNyBAQAogI3VuZGVmIFB5X0FERFJFU1NfSU5fUkFOR0UKIAogI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDEpIHx8IFwKLQkJCSAgKF9fR05VQ19fID49IDQpKQorICAgICAgICAgICAgICAoX19HTlVDX18gPj0gNCkpCiAjZGVmaW5lIFB5X05PX0lOTElORSBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18pKQogI2Vsc2UKICNkZWZpbmUgUHlfTk9fSU5MSU5FCkBAIC03MzgsMjAxICs3MzgsMjAxIEBACiB2b2lkICoKIFB5T2JqZWN0X01hbGxvYyhzaXplX3QgbmJ5dGVzKQogewotCWJsb2NrICpicDsKLQlwb29scCBwb29sOwotCXBvb2xwIG5leHQ7Ci0JdWludCBzaXplOworICAgIGJsb2NrICpicDsKKyAgICBwb29scCBwb29sOworICAgIHBvb2xwIG5leHQ7CisgICAgdWludCBzaXplOwogCiAjaWZkZWYgV0lUSF9WQUxHUklORAotCWlmIChVTkxJS0VMWShydW5uaW5nX29uX3ZhbGdyaW5kID09IC0xKSkKLQkJcnVubmluZ19vbl92YWxncmluZCA9IFJVTk5JTkdfT05fVkFMR1JJTkQ7Ci0JaWYgKFVOTElLRUxZKHJ1bm5pbmdfb25fdmFsZ3JpbmQpKQotCQlnb3RvIHJlZGlyZWN0OworICAgIGlmIChVTkxJS0VMWShydW5uaW5nX29uX3ZhbGdyaW5kID09IC0xKSkKKyAgICAgICAgcnVubmluZ19vbl92YWxncmluZCA9IFJVTk5JTkdfT05fVkFMR1JJTkQ7CisgICAgaWYgKFVOTElLRUxZKHJ1bm5pbmdfb25fdmFsZ3JpbmQpKQorICAgICAgICBnb3RvIHJlZGlyZWN0OwogI2VuZGlmCiAKLQkvKgotCSAqIExpbWl0IG91cnNlbHZlcyB0byBQWV9TU0laRV9UX01BWCBieXRlcyB0byBwcmV2ZW50IHNlY3VyaXR5IGhvbGVzLgotCSAqIE1vc3QgcHl0aG9uIGludGVybmFscyBibGluZGx5IHVzZSBhIHNpZ25lZCBQeV9zc2l6ZV90IHRvIHRyYWNrCi0JICogdGhpbmdzIHdpdGhvdXQgY2hlY2tpbmcgZm9yIG92ZXJmbG93cyBvciBuZWdhdGl2ZXMuCi0JICogQXMgc2l6ZV90IGlzIHVuc2lnbmVkLCBjaGVja2luZyBmb3IgbmJ5dGVzIDwgMCBpcyBub3QgcmVxdWlyZWQuCi0JICovCi0JaWYgKG5ieXRlcyA+IFBZX1NTSVpFX1RfTUFYKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKgorICAgICAqIExpbWl0IG91cnNlbHZlcyB0byBQWV9TU0laRV9UX01BWCBieXRlcyB0byBwcmV2ZW50IHNlY3VyaXR5IGhvbGVzLgorICAgICAqIE1vc3QgcHl0aG9uIGludGVybmFscyBibGluZGx5IHVzZSBhIHNpZ25lZCBQeV9zc2l6ZV90IHRvIHRyYWNrCisgICAgICogdGhpbmdzIHdpdGhvdXQgY2hlY2tpbmcgZm9yIG92ZXJmbG93cyBvciBuZWdhdGl2ZXMuCisgICAgICogQXMgc2l6ZV90IGlzIHVuc2lnbmVkLCBjaGVja2luZyBmb3IgbmJ5dGVzIDwgMCBpcyBub3QgcmVxdWlyZWQuCisgICAgICovCisgICAgaWYgKG5ieXRlcyA+IFBZX1NTSVpFX1RfTUFYKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qCi0JICogVGhpcyBpbXBsaWNpdGx5IHJlZGlyZWN0cyBtYWxsb2MoMCkuCi0JICovCi0JaWYgKChuYnl0ZXMgLSAxKSA8IFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEKSB7Ci0JCUxPQ0soKTsKLQkJLyoKLQkJICogTW9zdCBmcmVxdWVudCBwYXRocyBmaXJzdAotCQkgKi8KLQkJc2l6ZSA9ICh1aW50KShuYnl0ZXMgLSAxKSA+PiBBTElHTk1FTlRfU0hJRlQ7Ci0JCXBvb2wgPSB1c2VkcG9vbHNbc2l6ZSArIHNpemVdOwotCQlpZiAocG9vbCAhPSBwb29sLT5uZXh0cG9vbCkgewotCQkJLyoKLQkJCSAqIFRoZXJlIGlzIGEgdXNlZCBwb29sIGZvciB0aGlzIHNpemUgY2xhc3MuCi0JCQkgKiBQaWNrIHVwIHRoZSBoZWFkIGJsb2NrIG9mIGl0cyBmcmVlIGxpc3QuCi0JCQkgKi8KLQkJCSsrcG9vbC0+cmVmLmNvdW50OwotCQkJYnAgPSBwb29sLT5mcmVlYmxvY2s7Ci0JCQlhc3NlcnQoYnAgIT0gTlVMTCk7Ci0JCQlpZiAoKHBvb2wtPmZyZWVibG9jayA9ICooYmxvY2sgKiopYnApICE9IE5VTEwpIHsKLQkJCQlVTkxPQ0soKTsKLQkJCQlyZXR1cm4gKHZvaWQgKilicDsKLQkJCX0KLQkJCS8qCi0JCQkgKiBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZyZWUgbGlzdCwgdHJ5IHRvIGV4dGVuZCBpdC4KLQkJCSAqLwotCQkJaWYgKHBvb2wtPm5leHRvZmZzZXQgPD0gcG9vbC0+bWF4bmV4dG9mZnNldCkgewotCQkJCS8qIFRoZXJlIGlzIHJvb20gZm9yIGFub3RoZXIgYmxvY2suICovCi0JCQkJcG9vbC0+ZnJlZWJsb2NrID0gKGJsb2NrKilwb29sICsKLQkJCQkJCSAgcG9vbC0+bmV4dG9mZnNldDsKLQkJCQlwb29sLT5uZXh0b2Zmc2V0ICs9IElOREVYMlNJWkUoc2l6ZSk7Ci0JCQkJKihibG9jayAqKikocG9vbC0+ZnJlZWJsb2NrKSA9IE5VTEw7Ci0JCQkJVU5MT0NLKCk7Ci0JCQkJcmV0dXJuICh2b2lkICopYnA7Ci0JCQl9Ci0JCQkvKiBQb29sIGlzIGZ1bGwsIHVubGluayBmcm9tIHVzZWQgcG9vbHMuICovCi0JCQluZXh0ID0gcG9vbC0+bmV4dHBvb2w7Ci0JCQlwb29sID0gcG9vbC0+cHJldnBvb2w7Ci0JCQluZXh0LT5wcmV2cG9vbCA9IHBvb2w7Ci0JCQlwb29sLT5uZXh0cG9vbCA9IG5leHQ7Ci0JCQlVTkxPQ0soKTsKLQkJCXJldHVybiAodm9pZCAqKWJwOwotCQl9CisgICAgLyoKKyAgICAgKiBUaGlzIGltcGxpY2l0bHkgcmVkaXJlY3RzIG1hbGxvYygwKS4KKyAgICAgKi8KKyAgICBpZiAoKG5ieXRlcyAtIDEpIDwgU01BTExfUkVRVUVTVF9USFJFU0hPTEQpIHsKKyAgICAgICAgTE9DSygpOworICAgICAgICAvKgorICAgICAgICAgKiBNb3N0IGZyZXF1ZW50IHBhdGhzIGZpcnN0CisgICAgICAgICAqLworICAgICAgICBzaXplID0gKHVpbnQpKG5ieXRlcyAtIDEpID4+IEFMSUdOTUVOVF9TSElGVDsKKyAgICAgICAgcG9vbCA9IHVzZWRwb29sc1tzaXplICsgc2l6ZV07CisgICAgICAgIGlmIChwb29sICE9IHBvb2wtPm5leHRwb29sKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlcmUgaXMgYSB1c2VkIHBvb2wgZm9yIHRoaXMgc2l6ZSBjbGFzcy4KKyAgICAgICAgICAgICAqIFBpY2sgdXAgdGhlIGhlYWQgYmxvY2sgb2YgaXRzIGZyZWUgbGlzdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgKytwb29sLT5yZWYuY291bnQ7CisgICAgICAgICAgICBicCA9IHBvb2wtPmZyZWVibG9jazsKKyAgICAgICAgICAgIGFzc2VydChicCAhPSBOVUxMKTsKKyAgICAgICAgICAgIGlmICgocG9vbC0+ZnJlZWJsb2NrID0gKihibG9jayAqKilicCkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKWJwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZnJlZSBsaXN0LCB0cnkgdG8gZXh0ZW5kIGl0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocG9vbC0+bmV4dG9mZnNldCA8PSBwb29sLT5tYXhuZXh0b2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgcm9vbSBmb3IgYW5vdGhlciBibG9jay4gKi8KKyAgICAgICAgICAgICAgICBwb29sLT5mcmVlYmxvY2sgPSAoYmxvY2sqKXBvb2wgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wtPm5leHRvZmZzZXQ7CisgICAgICAgICAgICAgICAgcG9vbC0+bmV4dG9mZnNldCArPSBJTkRFWDJTSVpFKHNpemUpOworICAgICAgICAgICAgICAgICooYmxvY2sgKiopKHBvb2wtPmZyZWVibG9jaykgPSBOVUxMOworICAgICAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKWJwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogUG9vbCBpcyBmdWxsLCB1bmxpbmsgZnJvbSB1c2VkIHBvb2xzLiAqLworICAgICAgICAgICAgbmV4dCA9IHBvb2wtPm5leHRwb29sOworICAgICAgICAgICAgcG9vbCA9IHBvb2wtPnByZXZwb29sOworICAgICAgICAgICAgbmV4dC0+cHJldnBvb2wgPSBwb29sOworICAgICAgICAgICAgcG9vbC0+bmV4dHBvb2wgPSBuZXh0OworICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICByZXR1cm4gKHZvaWQgKilicDsKKyAgICAgICAgfQogCi0JCS8qIFRoZXJlIGlzbid0IGEgcG9vbCBvZiB0aGUgcmlnaHQgc2l6ZSBjbGFzcyBpbW1lZGlhdGVseQotCQkgKiBhdmFpbGFibGU6ICB1c2UgYSBmcmVlIHBvb2wuCi0JCSAqLwotCQlpZiAodXNhYmxlX2FyZW5hcyA9PSBOVUxMKSB7Ci0JCQkvKiBObyBhcmVuYSBoYXMgYSBmcmVlIHBvb2w6ICBhbGxvY2F0ZSBhIG5ldyBhcmVuYS4gKi8KKyAgICAgICAgLyogVGhlcmUgaXNuJ3QgYSBwb29sIG9mIHRoZSByaWdodCBzaXplIGNsYXNzIGltbWVkaWF0ZWx5CisgICAgICAgICAqIGF2YWlsYWJsZTogIHVzZSBhIGZyZWUgcG9vbC4KKyAgICAgICAgICovCisgICAgICAgIGlmICh1c2FibGVfYXJlbmFzID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIE5vIGFyZW5hIGhhcyBhIGZyZWUgcG9vbDogIGFsbG9jYXRlIGEgbmV3IGFyZW5hLiAqLwogI2lmZGVmIFdJVEhfTUVNT1JZX0xJTUlUUwotCQkJaWYgKG5hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZCA+PSBNQVhfQVJFTkFTKSB7Ci0JCQkJVU5MT0NLKCk7Ci0JCQkJZ290byByZWRpcmVjdDsKLQkJCX0KKyAgICAgICAgICAgIGlmIChuYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQgPj0gTUFYX0FSRU5BUykgeworICAgICAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgICAgIGdvdG8gcmVkaXJlY3Q7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCXVzYWJsZV9hcmVuYXMgPSBuZXdfYXJlbmEoKTsKLQkJCWlmICh1c2FibGVfYXJlbmFzID09IE5VTEwpIHsKLQkJCQlVTkxPQ0soKTsKLQkJCQlnb3RvIHJlZGlyZWN0OwotCQkJfQotCQkJdXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hID0KLQkJCQl1c2FibGVfYXJlbmFzLT5wcmV2YXJlbmEgPSBOVUxMOwotCQl9Ci0JCWFzc2VydCh1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgdXNhYmxlX2FyZW5hcyA9IG5ld19hcmVuYSgpOworICAgICAgICAgICAgaWYgKHVzYWJsZV9hcmVuYXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgICAgIGdvdG8gcmVkaXJlY3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmEgPQorICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMtPnByZXZhcmVuYSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7CiAKLQkJLyogVHJ5IHRvIGdldCBhIGNhY2hlZCBmcmVlIHBvb2wuICovCi0JCXBvb2wgPSB1c2FibGVfYXJlbmFzLT5mcmVlcG9vbHM7Ci0JCWlmIChwb29sICE9IE5VTEwpIHsKLQkJCS8qIFVubGluayBmcm9tIGNhY2hlZCBwb29scy4gKi8KLQkJCXVzYWJsZV9hcmVuYXMtPmZyZWVwb29scyA9IHBvb2wtPm5leHRwb29sOworICAgICAgICAvKiBUcnkgdG8gZ2V0IGEgY2FjaGVkIGZyZWUgcG9vbC4gKi8KKyAgICAgICAgcG9vbCA9IHVzYWJsZV9hcmVuYXMtPmZyZWVwb29sczsKKyAgICAgICAgaWYgKHBvb2wgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogVW5saW5rIGZyb20gY2FjaGVkIHBvb2xzLiAqLworICAgICAgICAgICAgdXNhYmxlX2FyZW5hcy0+ZnJlZXBvb2xzID0gcG9vbC0+bmV4dHBvb2w7CiAKLQkJCS8qIFRoaXMgYXJlbmEgYWxyZWFkeSBoYWQgdGhlIHNtYWxsZXN0IG5mcmVlcG9vbHMKLQkJCSAqIHZhbHVlLCBzbyBkZWNyZWFzaW5nIG5mcmVlcG9vbHMgZG9lc24ndCBjaGFuZ2UKLQkJCSAqIHRoYXQsIGFuZCB3ZSBkb24ndCBuZWVkIHRvIHJlYXJyYW5nZSB0aGUKLQkJCSAqIHVzYWJsZV9hcmVuYXMgbGlzdC4gIEhvd2V2ZXIsIGlmIHRoZSBhcmVuYSBoYXMKLQkJCSAqIGJlY29tZSB3aG9sbHkgYWxsb2NhdGVkLCB3ZSBuZWVkIHRvIHJlbW92ZSBpdHMKLQkJCSAqIGFyZW5hX29iamVjdCBmcm9tIHVzYWJsZV9hcmVuYXMuCi0JCQkgKi8KLQkJCS0tdXNhYmxlX2FyZW5hcy0+bmZyZWVwb29sczsKLQkJCWlmICh1c2FibGVfYXJlbmFzLT5uZnJlZXBvb2xzID09IDApIHsKLQkJCQkvKiBXaG9sbHkgYWxsb2NhdGVkOiAgcmVtb3ZlLiAqLwotCQkJCWFzc2VydCh1c2FibGVfYXJlbmFzLT5mcmVlcG9vbHMgPT0gTlVMTCk7Ci0JCQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYSA9PSBOVUxMIHx8Ci0JCQkJICAgICAgIHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYS0+cHJldmFyZW5hID09Ci0JCQkJCSAgIHVzYWJsZV9hcmVuYXMpOworICAgICAgICAgICAgLyogVGhpcyBhcmVuYSBhbHJlYWR5IGhhZCB0aGUgc21hbGxlc3QgbmZyZWVwb29scworICAgICAgICAgICAgICogdmFsdWUsIHNvIGRlY3JlYXNpbmcgbmZyZWVwb29scyBkb2Vzbid0IGNoYW5nZQorICAgICAgICAgICAgICogdGhhdCwgYW5kIHdlIGRvbid0IG5lZWQgdG8gcmVhcnJhbmdlIHRoZQorICAgICAgICAgICAgICogdXNhYmxlX2FyZW5hcyBsaXN0LiAgSG93ZXZlciwgaWYgdGhlIGFyZW5hIGhhcworICAgICAgICAgICAgICogYmVjb21lIHdob2xseSBhbGxvY2F0ZWQsIHdlIG5lZWQgdG8gcmVtb3ZlIGl0cworICAgICAgICAgICAgICogYXJlbmFfb2JqZWN0IGZyb20gdXNhYmxlX2FyZW5hcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLS11c2FibGVfYXJlbmFzLT5uZnJlZXBvb2xzOworICAgICAgICAgICAgaWYgKHVzYWJsZV9hcmVuYXMtPm5mcmVlcG9vbHMgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIFdob2xseSBhbGxvY2F0ZWQ6ICByZW1vdmUuICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmZyZWVwb29scyA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcyk7CiAKLQkJCQl1c2FibGVfYXJlbmFzID0gdXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hOwotCQkJCWlmICh1c2FibGVfYXJlbmFzICE9IE5VTEwpIHsKLQkJCQkJdXNhYmxlX2FyZW5hcy0+cHJldmFyZW5hID0gTlVMTDsKLQkJCQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogbmZyZWVwb29scyA+IDA6ICBpdCBtdXN0IGJlIHRoYXQgZnJlZXBvb2xzCi0JCQkJICogaXNuJ3QgTlVMTCwgb3IgdGhhdCB3ZSBoYXZlbid0IHlldCBjYXJ2ZWQKLQkJCQkgKiBvZmYgYWxsIHRoZSBhcmVuYSdzIHBvb2xzIGZvciB0aGUgZmlyc3QKLQkJCQkgKiB0aW1lLgotCQkJCSAqLwotCQkJCWFzc2VydCh1c2FibGVfYXJlbmFzLT5mcmVlcG9vbHMgIT0gTlVMTCB8fAotCQkJCSAgICAgICB1c2FibGVfYXJlbmFzLT5wb29sX2FkZHJlc3MgPD0KLQkJCQkgICAgICAgICAgIChibG9jayopdXNhYmxlX2FyZW5hcy0+YWRkcmVzcyArCi0JCQkJICAgICAgICAgICAgICAgQVJFTkFfU0laRSAtIFBPT0xfU0laRSk7Ci0JCQl9Ci0JCWluaXRfcG9vbDoKLQkJCS8qIEZyb250bGluayB0byB1c2VkIHBvb2xzLiAqLwotCQkJbmV4dCA9IHVzZWRwb29sc1tzaXplICsgc2l6ZV07IC8qID09IHByZXYgKi8KLQkJCXBvb2wtPm5leHRwb29sID0gbmV4dDsKLQkJCXBvb2wtPnByZXZwb29sID0gbmV4dDsKLQkJCW5leHQtPm5leHRwb29sID0gcG9vbDsKLQkJCW5leHQtPnByZXZwb29sID0gcG9vbDsKLQkJCXBvb2wtPnJlZi5jb3VudCA9IDE7Ci0JCQlpZiAocG9vbC0+c3ppZHggPT0gc2l6ZSkgewotCQkJCS8qIEx1Y2tpbHksIHRoaXMgcG9vbCBsYXN0IGNvbnRhaW5lZCBibG9ja3MKLQkJCQkgKiBvZiB0aGUgc2FtZSBzaXplIGNsYXNzLCBzbyBpdHMgaGVhZGVyCi0JCQkJICogYW5kIGZyZWUgbGlzdCBhcmUgYWxyZWFkeSBpbml0aWFsaXplZC4KLQkJCQkgKi8KLQkJCQlicCA9IHBvb2wtPmZyZWVibG9jazsKLQkJCQlwb29sLT5mcmVlYmxvY2sgPSAqKGJsb2NrICoqKWJwOwotCQkJCVVOTE9DSygpOwotCQkJCXJldHVybiAodm9pZCAqKWJwOwotCQkJfQotCQkJLyoKLQkJCSAqIEluaXRpYWxpemUgdGhlIHBvb2wgaGVhZGVyLCBzZXQgdXAgdGhlIGZyZWUgbGlzdCB0bwotCQkJICogY29udGFpbiBqdXN0IHRoZSBzZWNvbmQgYmxvY2ssIGFuZCByZXR1cm4gdGhlIGZpcnN0Ci0JCQkgKiBibG9jay4KLQkJCSAqLwotCQkJcG9vbC0+c3ppZHggPSBzaXplOwotCQkJc2l6ZSA9IElOREVYMlNJWkUoc2l6ZSk7Ci0JCQlicCA9IChibG9jayAqKXBvb2wgKyBQT09MX09WRVJIRUFEOwotCQkJcG9vbC0+bmV4dG9mZnNldCA9IFBPT0xfT1ZFUkhFQUQgKyAoc2l6ZSA8PCAxKTsKLQkJCXBvb2wtPm1heG5leHRvZmZzZXQgPSBQT09MX1NJWkUgLSBzaXplOwotCQkJcG9vbC0+ZnJlZWJsb2NrID0gYnAgKyBzaXplOwotCQkJKihibG9jayAqKikocG9vbC0+ZnJlZWJsb2NrKSA9IE5VTEw7Ci0JCQlVTkxPQ0soKTsKLQkJCXJldHVybiAodm9pZCAqKWJwOwotCQl9CisgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcyA9IHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYTsKKyAgICAgICAgICAgICAgICBpZiAodXNhYmxlX2FyZW5hcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMtPnByZXZhcmVuYSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG5mcmVlcG9vbHMgPiAwOiAgaXQgbXVzdCBiZSB0aGF0IGZyZWVwb29scworICAgICAgICAgICAgICAgICAqIGlzbid0IE5VTEwsIG9yIHRoYXQgd2UgaGF2ZW4ndCB5ZXQgY2FydmVkCisgICAgICAgICAgICAgICAgICogb2ZmIGFsbCB0aGUgYXJlbmEncyBwb29scyBmb3IgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgICogdGltZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+ZnJlZXBvb2xzICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcy0+cG9vbF9hZGRyZXNzIDw9CisgICAgICAgICAgICAgICAgICAgICAgIChibG9jayopdXNhYmxlX2FyZW5hcy0+YWRkcmVzcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkVOQV9TSVpFIC0gUE9PTF9TSVpFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaW5pdF9wb29sOgorICAgICAgICAgICAgLyogRnJvbnRsaW5rIHRvIHVzZWQgcG9vbHMuICovCisgICAgICAgICAgICBuZXh0ID0gdXNlZHBvb2xzW3NpemUgKyBzaXplXTsgLyogPT0gcHJldiAqLworICAgICAgICAgICAgcG9vbC0+bmV4dHBvb2wgPSBuZXh0OworICAgICAgICAgICAgcG9vbC0+cHJldnBvb2wgPSBuZXh0OworICAgICAgICAgICAgbmV4dC0+bmV4dHBvb2wgPSBwb29sOworICAgICAgICAgICAgbmV4dC0+cHJldnBvb2wgPSBwb29sOworICAgICAgICAgICAgcG9vbC0+cmVmLmNvdW50ID0gMTsKKyAgICAgICAgICAgIGlmIChwb29sLT5zemlkeCA9PSBzaXplKSB7CisgICAgICAgICAgICAgICAgLyogTHVja2lseSwgdGhpcyBwb29sIGxhc3QgY29udGFpbmVkIGJsb2NrcworICAgICAgICAgICAgICAgICAqIG9mIHRoZSBzYW1lIHNpemUgY2xhc3MsIHNvIGl0cyBoZWFkZXIKKyAgICAgICAgICAgICAgICAgKiBhbmQgZnJlZSBsaXN0IGFyZSBhbHJlYWR5IGluaXRpYWxpemVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGJwID0gcG9vbC0+ZnJlZWJsb2NrOworICAgICAgICAgICAgICAgIHBvb2wtPmZyZWVibG9jayA9ICooYmxvY2sgKiopYnA7CisgICAgICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopYnA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSW5pdGlhbGl6ZSB0aGUgcG9vbCBoZWFkZXIsIHNldCB1cCB0aGUgZnJlZSBsaXN0IHRvCisgICAgICAgICAgICAgKiBjb250YWluIGp1c3QgdGhlIHNlY29uZCBibG9jaywgYW5kIHJldHVybiB0aGUgZmlyc3QKKyAgICAgICAgICAgICAqIGJsb2NrLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwb29sLT5zemlkeCA9IHNpemU7CisgICAgICAgICAgICBzaXplID0gSU5ERVgyU0laRShzaXplKTsKKyAgICAgICAgICAgIGJwID0gKGJsb2NrICopcG9vbCArIFBPT0xfT1ZFUkhFQUQ7CisgICAgICAgICAgICBwb29sLT5uZXh0b2Zmc2V0ID0gUE9PTF9PVkVSSEVBRCArIChzaXplIDw8IDEpOworICAgICAgICAgICAgcG9vbC0+bWF4bmV4dG9mZnNldCA9IFBPT0xfU0laRSAtIHNpemU7CisgICAgICAgICAgICBwb29sLT5mcmVlYmxvY2sgPSBicCArIHNpemU7CisgICAgICAgICAgICAqKGJsb2NrICoqKShwb29sLT5mcmVlYmxvY2spID0gTlVMTDsKKyAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgcmV0dXJuICh2b2lkICopYnA7CisgICAgICAgIH0KIAotCQkvKiBDYXJ2ZSBvZmYgYSBuZXcgcG9vbC4gKi8KLQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPm5mcmVlcG9vbHMgPiAwKTsKLQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmZyZWVwb29scyA9PSBOVUxMKTsKLQkJcG9vbCA9IChwb29scCl1c2FibGVfYXJlbmFzLT5wb29sX2FkZHJlc3M7Ci0JCWFzc2VydCgoYmxvY2sqKXBvb2wgPD0gKGJsb2NrKil1c2FibGVfYXJlbmFzLT5hZGRyZXNzICsKLQkJICAgICAgICAgICAgICAgICAgICAgICBBUkVOQV9TSVpFIC0gUE9PTF9TSVpFKTsKLQkJcG9vbC0+YXJlbmFpbmRleCA9IHVzYWJsZV9hcmVuYXMgLSBhcmVuYXM7Ci0JCWFzc2VydCgmYXJlbmFzW3Bvb2wtPmFyZW5haW5kZXhdID09IHVzYWJsZV9hcmVuYXMpOwotCQlwb29sLT5zemlkeCA9IERVTU1ZX1NJWkVfSURYOwotCQl1c2FibGVfYXJlbmFzLT5wb29sX2FkZHJlc3MgKz0gUE9PTF9TSVpFOwotCQktLXVzYWJsZV9hcmVuYXMtPm5mcmVlcG9vbHM7CisgICAgICAgIC8qIENhcnZlIG9mZiBhIG5ldyBwb29sLiAqLworICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+bmZyZWVwb29scyA+IDApOworICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+ZnJlZXBvb2xzID09IE5VTEwpOworICAgICAgICBwb29sID0gKHBvb2xwKXVzYWJsZV9hcmVuYXMtPnBvb2xfYWRkcmVzczsKKyAgICAgICAgYXNzZXJ0KChibG9jayopcG9vbCA8PSAoYmxvY2sqKXVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSRU5BX1NJWkUgLSBQT09MX1NJWkUpOworICAgICAgICBwb29sLT5hcmVuYWluZGV4ID0gdXNhYmxlX2FyZW5hcyAtIGFyZW5hczsKKyAgICAgICAgYXNzZXJ0KCZhcmVuYXNbcG9vbC0+YXJlbmFpbmRleF0gPT0gdXNhYmxlX2FyZW5hcyk7CisgICAgICAgIHBvb2wtPnN6aWR4ID0gRFVNTVlfU0laRV9JRFg7CisgICAgICAgIHVzYWJsZV9hcmVuYXMtPnBvb2xfYWRkcmVzcyArPSBQT09MX1NJWkU7CisgICAgICAgIC0tdXNhYmxlX2FyZW5hcy0+bmZyZWVwb29sczsKIAotCQlpZiAodXNhYmxlX2FyZW5hcy0+bmZyZWVwb29scyA9PSAwKSB7Ci0JCQlhc3NlcnQodXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hID09IE5VTEwgfHwKLQkJCSAgICAgICB1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9PQotCQkJICAgICAgIAkgICB1c2FibGVfYXJlbmFzKTsKLQkJCS8qIFVubGluayB0aGUgYXJlbmE6ICBpdCBpcyBjb21wbGV0ZWx5IGFsbG9jYXRlZC4gKi8KLQkJCXVzYWJsZV9hcmVuYXMgPSB1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmE7Ci0JCQlpZiAodXNhYmxlX2FyZW5hcyAhPSBOVUxMKSB7Ci0JCQkJdXNhYmxlX2FyZW5hcy0+cHJldmFyZW5hID0gTlVMTDsKLQkJCQlhc3NlcnQodXNhYmxlX2FyZW5hcy0+YWRkcmVzcyAhPSAwKTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAodXNhYmxlX2FyZW5hcy0+bmZyZWVwb29scyA9PSAwKSB7CisgICAgICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9PQorICAgICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMpOworICAgICAgICAgICAgLyogVW5saW5rIHRoZSBhcmVuYTogIGl0IGlzIGNvbXBsZXRlbHkgYWxsb2NhdGVkLiAqLworICAgICAgICAgICAgdXNhYmxlX2FyZW5hcyA9IHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYTsKKyAgICAgICAgICAgIGlmICh1c2FibGVfYXJlbmFzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5wcmV2YXJlbmEgPSBOVUxMOworICAgICAgICAgICAgICAgIGFzc2VydCh1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJZ290byBpbml0X3Bvb2w7Ci0JfQorICAgICAgICBnb3RvIGluaXRfcG9vbDsKKyAgICB9CiAKLSAgICAgICAgLyogVGhlIHNtYWxsIGJsb2NrIGFsbG9jYXRvciBlbmRzIGhlcmUuICovCisgICAgLyogVGhlIHNtYWxsIGJsb2NrIGFsbG9jYXRvciBlbmRzIGhlcmUuICovCiAKIHJlZGlyZWN0OgotCS8qIFJlZGlyZWN0IHRoZSBvcmlnaW5hbCByZXF1ZXN0IHRvIHRoZSB1bmRlcmx5aW5nIChsaWJjKSBhbGxvY2F0b3IuCi0JICogV2UganVtcCBoZXJlIG9uIGJpZ2dlciByZXF1ZXN0cywgb24gZXJyb3IgaW4gdGhlIGNvZGUgYWJvdmUgKGFzIGEKLQkgKiBsYXN0IGNoYW5jZSB0byBzZXJ2ZSB0aGUgcmVxdWVzdCkgb3Igd2hlbiB0aGUgbWF4IG1lbW9yeSBsaW1pdAotCSAqIGhhcyBiZWVuIHJlYWNoZWQuCi0JICovCi0JaWYgKG5ieXRlcyA9PSAwKQotCQluYnl0ZXMgPSAxOwotCXJldHVybiAodm9pZCAqKW1hbGxvYyhuYnl0ZXMpOworICAgIC8qIFJlZGlyZWN0IHRoZSBvcmlnaW5hbCByZXF1ZXN0IHRvIHRoZSB1bmRlcmx5aW5nIChsaWJjKSBhbGxvY2F0b3IuCisgICAgICogV2UganVtcCBoZXJlIG9uIGJpZ2dlciByZXF1ZXN0cywgb24gZXJyb3IgaW4gdGhlIGNvZGUgYWJvdmUgKGFzIGEKKyAgICAgKiBsYXN0IGNoYW5jZSB0byBzZXJ2ZSB0aGUgcmVxdWVzdCkgb3Igd2hlbiB0aGUgbWF4IG1lbW9yeSBsaW1pdAorICAgICAqIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICovCisgICAgaWYgKG5ieXRlcyA9PSAwKQorICAgICAgICBuYnl0ZXMgPSAxOworICAgIHJldHVybiAodm9pZCAqKW1hbGxvYyhuYnl0ZXMpOwogfQogCiAvKiBmcmVlICovCkBAIC05NDEsMjE4ICs5NDEsMjE4IEBACiB2b2lkCiBQeU9iamVjdF9GcmVlKHZvaWQgKnApCiB7Ci0JcG9vbHAgcG9vbDsKLQlibG9jayAqbGFzdGZyZWU7Ci0JcG9vbHAgbmV4dCwgcHJldjsKLQl1aW50IHNpemU7CisgICAgcG9vbHAgcG9vbDsKKyAgICBibG9jayAqbGFzdGZyZWU7CisgICAgcG9vbHAgbmV4dCwgcHJldjsKKyAgICB1aW50IHNpemU7CiAKLQlpZiAocCA9PSBOVUxMKQkvKiBmcmVlKE5VTEwpIGhhcyBubyBlZmZlY3QgKi8KLQkJcmV0dXJuOworICAgIGlmIChwID09IE5VTEwpICAgICAgLyogZnJlZShOVUxMKSBoYXMgbm8gZWZmZWN0ICovCisgICAgICAgIHJldHVybjsKIAogI2lmZGVmIFdJVEhfVkFMR1JJTkQKLQlpZiAoVU5MSUtFTFkocnVubmluZ19vbl92YWxncmluZCA+IDApKQotCQlnb3RvIHJlZGlyZWN0OworICAgIGlmIChVTkxJS0VMWShydW5uaW5nX29uX3ZhbGdyaW5kID4gMCkpCisgICAgICAgIGdvdG8gcmVkaXJlY3Q7CiAjZW5kaWYKIAotCXBvb2wgPSBQT09MX0FERFIocCk7Ci0JaWYgKFB5X0FERFJFU1NfSU5fUkFOR0UocCwgcG9vbCkpIHsKLQkJLyogV2UgYWxsb2NhdGVkIHRoaXMgYWRkcmVzcy4gKi8KLQkJTE9DSygpOwotCQkvKiBMaW5rIHAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwb29sJ3MgZnJlZWJsb2NrIGxpc3QuICBTaW5jZQotCQkgKiB0aGUgcG9vbCBoYWQgYXQgbGVhc3QgdGhlIHAgYmxvY2sgb3V0c3RhbmRpbmcsIHRoZSBwb29sCi0JCSAqIHdhc24ndCBlbXB0eSAoc28gaXQncyBhbHJlYWR5IGluIGEgdXNlZHBvb2xzW10gbGlzdCwgb3IKLQkJICogd2FzIGZ1bGwgYW5kIGlzIGluIG5vIGxpc3QgLS0gaXQncyBub3QgaW4gdGhlIGZyZWVibG9ja3MKLQkJICogbGlzdCBpbiBhbnkgY2FzZSkuCi0JCSAqLwotCQlhc3NlcnQocG9vbC0+cmVmLmNvdW50ID4gMCk7CS8qIGVsc2UgaXQgd2FzIGVtcHR5ICovCi0JCSooYmxvY2sgKiopcCA9IGxhc3RmcmVlID0gcG9vbC0+ZnJlZWJsb2NrOwotCQlwb29sLT5mcmVlYmxvY2sgPSAoYmxvY2sgKilwOwotCQlpZiAobGFzdGZyZWUpIHsKLQkJCXN0cnVjdCBhcmVuYV9vYmplY3QqIGFvOwotCQkJdWludCBuZjsgIC8qIGFvLT5uZnJlZXBvb2xzICovCisgICAgcG9vbCA9IFBPT0xfQUREUihwKTsKKyAgICBpZiAoUHlfQUREUkVTU19JTl9SQU5HRShwLCBwb29sKSkgeworICAgICAgICAvKiBXZSBhbGxvY2F0ZWQgdGhpcyBhZGRyZXNzLiAqLworICAgICAgICBMT0NLKCk7CisgICAgICAgIC8qIExpbmsgcCB0byB0aGUgc3RhcnQgb2YgdGhlIHBvb2wncyBmcmVlYmxvY2sgbGlzdC4gIFNpbmNlCisgICAgICAgICAqIHRoZSBwb29sIGhhZCBhdCBsZWFzdCB0aGUgcCBibG9jayBvdXRzdGFuZGluZywgdGhlIHBvb2wKKyAgICAgICAgICogd2Fzbid0IGVtcHR5IChzbyBpdCdzIGFscmVhZHkgaW4gYSB1c2VkcG9vbHNbXSBsaXN0LCBvcgorICAgICAgICAgKiB3YXMgZnVsbCBhbmQgaXMgaW4gbm8gbGlzdCAtLSBpdCdzIG5vdCBpbiB0aGUgZnJlZWJsb2NrcworICAgICAgICAgKiBsaXN0IGluIGFueSBjYXNlKS4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydChwb29sLT5yZWYuY291bnQgPiAwKTsgICAgICAgICAgICAvKiBlbHNlIGl0IHdhcyBlbXB0eSAqLworICAgICAgICAqKGJsb2NrICoqKXAgPSBsYXN0ZnJlZSA9IHBvb2wtPmZyZWVibG9jazsKKyAgICAgICAgcG9vbC0+ZnJlZWJsb2NrID0gKGJsb2NrICopcDsKKyAgICAgICAgaWYgKGxhc3RmcmVlKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXJlbmFfb2JqZWN0KiBhbzsKKyAgICAgICAgICAgIHVpbnQgbmY7ICAvKiBhby0+bmZyZWVwb29scyAqLwogCi0JCQkvKiBmcmVlYmxvY2sgd2Fzbid0IE5VTEwsIHNvIHRoZSBwb29sIHdhc24ndCBmdWxsLAotCQkJICogYW5kIHRoZSBwb29sIGlzIGluIGEgdXNlZHBvb2xzW10gbGlzdC4KLQkJCSAqLwotCQkJaWYgKC0tcG9vbC0+cmVmLmNvdW50ICE9IDApIHsKLQkJCQkvKiBwb29sIGlzbid0IGVtcHR5OiAgbGVhdmUgaXQgaW4gdXNlZHBvb2xzICovCi0JCQkJVU5MT0NLKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLyogUG9vbCBpcyBub3cgZW1wdHk6ICB1bmxpbmsgZnJvbSB1c2VkcG9vbHMsIGFuZAotCQkJICogbGluayB0byB0aGUgZnJvbnQgb2YgZnJlZXBvb2xzLiAgVGhpcyBlbnN1cmVzIHRoYXQKLQkJCSAqIHByZXZpb3VzbHkgZnJlZWQgcG9vbHMgd2lsbCBiZSBhbGxvY2F0ZWQgbGF0ZXIKLQkJCSAqIChiZWluZyBub3QgcmVmZXJlbmNlZCwgdGhleSBhcmUgcGVyaGFwcyBwYWdlZCBvdXQpLgotCQkJICovCi0JCQluZXh0ID0gcG9vbC0+bmV4dHBvb2w7Ci0JCQlwcmV2ID0gcG9vbC0+cHJldnBvb2w7Ci0JCQluZXh0LT5wcmV2cG9vbCA9IHByZXY7Ci0JCQlwcmV2LT5uZXh0cG9vbCA9IG5leHQ7CisgICAgICAgICAgICAvKiBmcmVlYmxvY2sgd2Fzbid0IE5VTEwsIHNvIHRoZSBwb29sIHdhc24ndCBmdWxsLAorICAgICAgICAgICAgICogYW5kIHRoZSBwb29sIGlzIGluIGEgdXNlZHBvb2xzW10gbGlzdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKC0tcG9vbC0+cmVmLmNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAvKiBwb29sIGlzbid0IGVtcHR5OiAgbGVhdmUgaXQgaW4gdXNlZHBvb2xzICovCisgICAgICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogUG9vbCBpcyBub3cgZW1wdHk6ICB1bmxpbmsgZnJvbSB1c2VkcG9vbHMsIGFuZAorICAgICAgICAgICAgICogbGluayB0byB0aGUgZnJvbnQgb2YgZnJlZXBvb2xzLiAgVGhpcyBlbnN1cmVzIHRoYXQKKyAgICAgICAgICAgICAqIHByZXZpb3VzbHkgZnJlZWQgcG9vbHMgd2lsbCBiZSBhbGxvY2F0ZWQgbGF0ZXIKKyAgICAgICAgICAgICAqIChiZWluZyBub3QgcmVmZXJlbmNlZCwgdGhleSBhcmUgcGVyaGFwcyBwYWdlZCBvdXQpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuZXh0ID0gcG9vbC0+bmV4dHBvb2w7CisgICAgICAgICAgICBwcmV2ID0gcG9vbC0+cHJldnBvb2w7CisgICAgICAgICAgICBuZXh0LT5wcmV2cG9vbCA9IHByZXY7CisgICAgICAgICAgICBwcmV2LT5uZXh0cG9vbCA9IG5leHQ7CiAKLQkJCS8qIExpbmsgdGhlIHBvb2wgdG8gZnJlZXBvb2xzLiAgVGhpcyBpcyBhIHNpbmdseS1saW5rZWQKLQkJCSAqIGxpc3QsIGFuZCBwb29sLT5wcmV2cG9vbCBpc24ndCB1c2VkIHRoZXJlLgotCQkJICovCi0JCQlhbyA9ICZhcmVuYXNbcG9vbC0+YXJlbmFpbmRleF07Ci0JCQlwb29sLT5uZXh0cG9vbCA9IGFvLT5mcmVlcG9vbHM7Ci0JCQlhby0+ZnJlZXBvb2xzID0gcG9vbDsKLQkJCW5mID0gKythby0+bmZyZWVwb29sczsKKyAgICAgICAgICAgIC8qIExpbmsgdGhlIHBvb2wgdG8gZnJlZXBvb2xzLiAgVGhpcyBpcyBhIHNpbmdseS1saW5rZWQKKyAgICAgICAgICAgICAqIGxpc3QsIGFuZCBwb29sLT5wcmV2cG9vbCBpc24ndCB1c2VkIHRoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhbyA9ICZhcmVuYXNbcG9vbC0+YXJlbmFpbmRleF07CisgICAgICAgICAgICBwb29sLT5uZXh0cG9vbCA9IGFvLT5mcmVlcG9vbHM7CisgICAgICAgICAgICBhby0+ZnJlZXBvb2xzID0gcG9vbDsKKyAgICAgICAgICAgIG5mID0gKythby0+bmZyZWVwb29sczsKIAotCQkJLyogQWxsIHRoZSByZXN0IGlzIGFyZW5hIG1hbmFnZW1lbnQuICBXZSBqdXN0IGZyZWVkCi0JCQkgKiBhIHBvb2wsIGFuZCB0aGVyZSBhcmUgNCBjYXNlcyBmb3IgYXJlbmEgbWdtdDoKLQkJCSAqIDEuIElmIGFsbCB0aGUgcG9vbHMgYXJlIGZyZWUsIHJldHVybiB0aGUgYXJlbmEgdG8KLQkJCSAqICAgIHRoZSBzeXN0ZW0gZnJlZSgpLgotCQkJICogMi4gSWYgdGhpcyBpcyB0aGUgb25seSBmcmVlIHBvb2wgaW4gdGhlIGFyZW5hLAotCQkJICogICAgYWRkIHRoZSBhcmVuYSBiYWNrIHRvIHRoZSBgdXNhYmxlX2FyZW5hc2AgbGlzdC4KLQkJCSAqIDMuIElmIHRoZSAibmV4dCIgYXJlbmEgaGFzIGEgc21hbGxlciBjb3VudCBvZiBmcmVlCi0JCQkgKiAgICBwb29scywgd2UgaGF2ZSB0byAic2xpZGUgdGhpcyBhcmVuYSByaWdodCIgdG8KLQkJCSAqICAgIHJlc3RvcmUgdGhhdCB1c2FibGVfYXJlbmFzIGlzIHNvcnRlZCBpbiBvcmRlciBvZgotCQkJICogICAgbmZyZWVwb29scy4KLQkJCSAqIDQuIEVsc2UgdGhlcmUncyBub3RoaW5nIG1vcmUgdG8gZG8uCi0JCQkgKi8KLQkJCWlmIChuZiA9PSBhby0+bnRvdGFscG9vbHMpIHsKLQkJCQkvKiBDYXNlIDEuICBGaXJzdCB1bmxpbmsgYW8gZnJvbSB1c2FibGVfYXJlbmFzLgotCQkJCSAqLwotCQkJCWFzc2VydChhby0+cHJldmFyZW5hID09IE5VTEwgfHwKLQkJCQkgICAgICAgYW8tPnByZXZhcmVuYS0+YWRkcmVzcyAhPSAwKTsKLQkJCQlhc3NlcnQoYW8gLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAotCQkJCSAgICAgICBhby0+bmV4dGFyZW5hLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgLyogQWxsIHRoZSByZXN0IGlzIGFyZW5hIG1hbmFnZW1lbnQuICBXZSBqdXN0IGZyZWVkCisgICAgICAgICAgICAgKiBhIHBvb2wsIGFuZCB0aGVyZSBhcmUgNCBjYXNlcyBmb3IgYXJlbmEgbWdtdDoKKyAgICAgICAgICAgICAqIDEuIElmIGFsbCB0aGUgcG9vbHMgYXJlIGZyZWUsIHJldHVybiB0aGUgYXJlbmEgdG8KKyAgICAgICAgICAgICAqICAgIHRoZSBzeXN0ZW0gZnJlZSgpLgorICAgICAgICAgICAgICogMi4gSWYgdGhpcyBpcyB0aGUgb25seSBmcmVlIHBvb2wgaW4gdGhlIGFyZW5hLAorICAgICAgICAgICAgICogICAgYWRkIHRoZSBhcmVuYSBiYWNrIHRvIHRoZSBgdXNhYmxlX2FyZW5hc2AgbGlzdC4KKyAgICAgICAgICAgICAqIDMuIElmIHRoZSAibmV4dCIgYXJlbmEgaGFzIGEgc21hbGxlciBjb3VudCBvZiBmcmVlCisgICAgICAgICAgICAgKiAgICBwb29scywgd2UgaGF2ZSB0byAic2xpZGUgdGhpcyBhcmVuYSByaWdodCIgdG8KKyAgICAgICAgICAgICAqICAgIHJlc3RvcmUgdGhhdCB1c2FibGVfYXJlbmFzIGlzIHNvcnRlZCBpbiBvcmRlciBvZgorICAgICAgICAgICAgICogICAgbmZyZWVwb29scy4KKyAgICAgICAgICAgICAqIDQuIEVsc2UgdGhlcmUncyBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuZiA9PSBhby0+bnRvdGFscG9vbHMpIHsKKyAgICAgICAgICAgICAgICAvKiBDYXNlIDEuICBGaXJzdCB1bmxpbmsgYW8gZnJvbSB1c2FibGVfYXJlbmFzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGFzc2VydChhby0+cHJldmFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYS0+YWRkcmVzcyAhPSAwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoYW8gLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICBhby0+bmV4dGFyZW5hLT5hZGRyZXNzICE9IDApOwogCi0JCQkJLyogRml4IHRoZSBwb2ludGVyIGluIHRoZSBwcmV2YXJlbmEsIG9yIHRoZQotCQkJCSAqIHVzYWJsZV9hcmVuYXMgcG9pbnRlci4KLQkJCQkgKi8KLQkJCQlpZiAoYW8tPnByZXZhcmVuYSA9PSBOVUxMKSB7Ci0JCQkJCXVzYWJsZV9hcmVuYXMgPSBhby0+bmV4dGFyZW5hOwotCQkJCQlhc3NlcnQodXNhYmxlX2FyZW5hcyA9PSBOVUxMIHx8Ci0JCQkJCSAgICAgICB1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYXNzZXJ0KGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9PSBhbyk7Ci0JCQkJCWFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9Ci0JCQkJCQlhby0+bmV4dGFyZW5hOwotCQkJCX0KLQkJCQkvKiBGaXggdGhlIHBvaW50ZXIgaW4gdGhlIG5leHRhcmVuYS4gKi8KLQkJCQlpZiAoYW8tPm5leHRhcmVuYSAhPSBOVUxMKSB7Ci0JCQkJCWFzc2VydChhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPT0gYW8pOwotCQkJCQlhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPQotCQkJCQkJYW8tPnByZXZhcmVuYTsKLQkJCQl9Ci0JCQkJLyogUmVjb3JkIHRoYXQgdGhpcyBhcmVuYV9vYmplY3Qgc2xvdCBpcwotCQkJCSAqIGF2YWlsYWJsZSB0byBiZSByZXVzZWQuCi0JCQkJICovCi0JCQkJYW8tPm5leHRhcmVuYSA9IHVudXNlZF9hcmVuYV9vYmplY3RzOwotCQkJCXVudXNlZF9hcmVuYV9vYmplY3RzID0gYW87CisgICAgICAgICAgICAgICAgLyogRml4IHRoZSBwb2ludGVyIGluIHRoZSBwcmV2YXJlbmEsIG9yIHRoZQorICAgICAgICAgICAgICAgICAqIHVzYWJsZV9hcmVuYXMgcG9pbnRlci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYW8tPnByZXZhcmVuYSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMgPSBhby0+bmV4dGFyZW5hOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9PSBhbyk7CisgICAgICAgICAgICAgICAgICAgIGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9CisgICAgICAgICAgICAgICAgICAgICAgICBhby0+bmV4dGFyZW5hOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBGaXggdGhlIHBvaW50ZXIgaW4gdGhlIG5leHRhcmVuYS4gKi8KKyAgICAgICAgICAgICAgICBpZiAoYW8tPm5leHRhcmVuYSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPT0gYW8pOworICAgICAgICAgICAgICAgICAgICBhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPQorICAgICAgICAgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogUmVjb3JkIHRoYXQgdGhpcyBhcmVuYV9vYmplY3Qgc2xvdCBpcworICAgICAgICAgICAgICAgICAqIGF2YWlsYWJsZSB0byBiZSByZXVzZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYW8tPm5leHRhcmVuYSA9IHVudXNlZF9hcmVuYV9vYmplY3RzOworICAgICAgICAgICAgICAgIHVudXNlZF9hcmVuYV9vYmplY3RzID0gYW87CiAKLQkJCQkvKiBGcmVlIHRoZSBlbnRpcmUgYXJlbmEuICovCi0JCQkJZnJlZSgodm9pZCAqKWFvLT5hZGRyZXNzKTsKLQkJCQlhby0+YWRkcmVzcyA9IDA7CS8qIG1hcmsgdW5hc3NvY2lhdGVkICovCi0JCQkJLS1uYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQ7CisgICAgICAgICAgICAgICAgLyogRnJlZSB0aGUgZW50aXJlIGFyZW5hLiAqLworICAgICAgICAgICAgICAgIGZyZWUoKHZvaWQgKilhby0+YWRkcmVzcyk7CisgICAgICAgICAgICAgICAgYW8tPmFkZHJlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hcmsgdW5hc3NvY2lhdGVkICovCisgICAgICAgICAgICAgICAgLS1uYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQ7CiAKLQkJCQlVTkxPQ0soKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAobmYgPT0gMSkgewotCQkJCS8qIENhc2UgMi4gIFB1dCBhbyBhdCB0aGUgaGVhZCBvZgotCQkJCSAqIHVzYWJsZV9hcmVuYXMuICBOb3RlIHRoYXQgYmVjYXVzZQotCQkJCSAqIGFvLT5uZnJlZXBvb2xzIHdhcyAwIGJlZm9yZSwgYW8gaXNuJ3QKLQkJCQkgKiBjdXJyZW50bHkgb24gdGhlIHVzYWJsZV9hcmVuYXMgbGlzdC4KLQkJCQkgKi8KLQkJCQlhby0+bmV4dGFyZW5hID0gdXNhYmxlX2FyZW5hczsKLQkJCQlhby0+cHJldmFyZW5hID0gTlVMTDsKLQkJCQlpZiAodXNhYmxlX2FyZW5hcykKLQkJCQkJdXNhYmxlX2FyZW5hcy0+cHJldmFyZW5hID0gYW87Ci0JCQkJdXNhYmxlX2FyZW5hcyA9IGFvOwotCQkJCWFzc2VydCh1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZiA9PSAxKSB7CisgICAgICAgICAgICAgICAgLyogQ2FzZSAyLiAgUHV0IGFvIGF0IHRoZSBoZWFkIG9mCisgICAgICAgICAgICAgICAgICogdXNhYmxlX2FyZW5hcy4gIE5vdGUgdGhhdCBiZWNhdXNlCisgICAgICAgICAgICAgICAgICogYW8tPm5mcmVlcG9vbHMgd2FzIDAgYmVmb3JlLCBhbyBpc24ndAorICAgICAgICAgICAgICAgICAqIGN1cnJlbnRseSBvbiB0aGUgdXNhYmxlX2FyZW5hcyBsaXN0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGFvLT5uZXh0YXJlbmEgPSB1c2FibGVfYXJlbmFzOworICAgICAgICAgICAgICAgIGFvLT5wcmV2YXJlbmEgPSBOVUxMOworICAgICAgICAgICAgICAgIGlmICh1c2FibGVfYXJlbmFzKQorICAgICAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5wcmV2YXJlbmEgPSBhbzsKKyAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzID0gYW87CisgICAgICAgICAgICAgICAgYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7CiAKLQkJCQlVTkxPQ0soKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvKiBJZiB0aGlzIGFyZW5hIGlzIG5vdyBvdXQgb2Ygb3JkZXIsIHdlIG5lZWQgdG8ga2VlcAotCQkJICogdGhlIGxpc3Qgc29ydGVkLiAgVGhlIGxpc3QgaXMga2VwdCBzb3J0ZWQgc28gdGhhdAotCQkJICogdGhlICJtb3N0IGZ1bGwiIGFyZW5hcyBhcmUgdXNlZCBmaXJzdCwgd2hpY2ggYWxsb3dzCi0JCQkgKiB0aGUgbmVhcmx5IGVtcHR5IGFyZW5hcyB0byBiZSBjb21wbGV0ZWx5IGZyZWVkLiAgSW4KLQkJCSAqIGEgZmV3IHVuLXNjaWVudGlmaWMgdGVzdHMsIGl0IHNlZW1zIGxpa2UgdGhpcwotCQkJICogYXBwcm9hY2ggYWxsb3dlZCBhIGxvdCBtb3JlIG1lbW9yeSB0byBiZSBmcmVlZC4KLQkJCSAqLwotCQkJaWYgKGFvLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAotCQkJCSAgICAgbmYgPD0gYW8tPm5leHRhcmVuYS0+bmZyZWVwb29scykgewotCQkJCS8qIENhc2UgNC4gIE5vdGhpbmcgdG8gZG8uICovCi0JCQkJVU5MT0NLKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLyogQ2FzZSAzOiAgV2UgaGF2ZSB0byBtb3ZlIHRoZSBhcmVuYSB0b3dhcmRzIHRoZSBlbmQKLQkJCSAqIG9mIHRoZSBsaXN0LCBiZWNhdXNlIGl0IGhhcyBtb3JlIGZyZWUgcG9vbHMgdGhhbgotCQkJICogdGhlIGFyZW5hIHRvIGl0cyByaWdodC4KLQkJCSAqIEZpcnN0IHVubGluayBhbyBmcm9tIHVzYWJsZV9hcmVuYXMuCi0JCQkgKi8KLQkJCWlmIChhby0+cHJldmFyZW5hICE9IE5VTEwpIHsKLQkJCQkvKiBhbyBpc24ndCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLwotCQkJCWFzc2VydChhby0+cHJldmFyZW5hLT5uZXh0YXJlbmEgPT0gYW8pOwotCQkJCWFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9IGFvLT5uZXh0YXJlbmE7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBhbyBpcyBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLwotCQkJCWFzc2VydCh1c2FibGVfYXJlbmFzID09IGFvKTsKLQkJCQl1c2FibGVfYXJlbmFzID0gYW8tPm5leHRhcmVuYTsKLQkJCX0KLQkJCWFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9IGFvLT5wcmV2YXJlbmE7CisgICAgICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgdGhpcyBhcmVuYSBpcyBub3cgb3V0IG9mIG9yZGVyLCB3ZSBuZWVkIHRvIGtlZXAKKyAgICAgICAgICAgICAqIHRoZSBsaXN0IHNvcnRlZC4gIFRoZSBsaXN0IGlzIGtlcHQgc29ydGVkIHNvIHRoYXQKKyAgICAgICAgICAgICAqIHRoZSAibW9zdCBmdWxsIiBhcmVuYXMgYXJlIHVzZWQgZmlyc3QsIHdoaWNoIGFsbG93cworICAgICAgICAgICAgICogdGhlIG5lYXJseSBlbXB0eSBhcmVuYXMgdG8gYmUgY29tcGxldGVseSBmcmVlZC4gIEluCisgICAgICAgICAgICAgKiBhIGZldyB1bi1zY2llbnRpZmljIHRlc3RzLCBpdCBzZWVtcyBsaWtlIHRoaXMKKyAgICAgICAgICAgICAqIGFwcHJvYWNoIGFsbG93ZWQgYSBsb3QgbW9yZSBtZW1vcnkgdG8gYmUgZnJlZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChhby0+bmV4dGFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZiA8PSBhby0+bmV4dGFyZW5hLT5uZnJlZXBvb2xzKSB7CisgICAgICAgICAgICAgICAgLyogQ2FzZSA0LiAgTm90aGluZyB0byBkby4gKi8KKyAgICAgICAgICAgICAgICBVTkxPQ0soKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDYXNlIDM6ICBXZSBoYXZlIHRvIG1vdmUgdGhlIGFyZW5hIHRvd2FyZHMgdGhlIGVuZAorICAgICAgICAgICAgICogb2YgdGhlIGxpc3QsIGJlY2F1c2UgaXQgaGFzIG1vcmUgZnJlZSBwb29scyB0aGFuCisgICAgICAgICAgICAgKiB0aGUgYXJlbmEgdG8gaXRzIHJpZ2h0LgorICAgICAgICAgICAgICogRmlyc3QgdW5saW5rIGFvIGZyb20gdXNhYmxlX2FyZW5hcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGFvLT5wcmV2YXJlbmEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8qIGFvIGlzbid0IGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9PSBhbyk7CisgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID0gYW8tPm5leHRhcmVuYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGFvIGlzIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KHVzYWJsZV9hcmVuYXMgPT0gYW8pOworICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMgPSBhby0+bmV4dGFyZW5hOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW8tPm5leHRhcmVuYS0+cHJldmFyZW5hID0gYW8tPnByZXZhcmVuYTsKIAotCQkJLyogTG9jYXRlIHRoZSBuZXcgaW5zZXJ0aW9uIHBvaW50IGJ5IGl0ZXJhdGluZyBvdmVyCi0JCQkgKiB0aGUgbGlzdCwgdXNpbmcgb3VyIG5leHRhcmVuYSBwb2ludGVyLgotCQkJICovCi0JCQl3aGlsZSAoYW8tPm5leHRhcmVuYSAhPSBOVUxMICYmCi0JCQkJCW5mID4gYW8tPm5leHRhcmVuYS0+bmZyZWVwb29scykgewotCQkJCWFvLT5wcmV2YXJlbmEgPSBhby0+bmV4dGFyZW5hOwotCQkJCWFvLT5uZXh0YXJlbmEgPSBhby0+bmV4dGFyZW5hLT5uZXh0YXJlbmE7Ci0JCQl9CisgICAgICAgICAgICAvKiBMb2NhdGUgdGhlIG5ldyBpbnNlcnRpb24gcG9pbnQgYnkgaXRlcmF0aW5nIG92ZXIKKyAgICAgICAgICAgICAqIHRoZSBsaXN0LCB1c2luZyBvdXIgbmV4dGFyZW5hIHBvaW50ZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdoaWxlIChhby0+bmV4dGFyZW5hICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZiA+IGFvLT5uZXh0YXJlbmEtPm5mcmVlcG9vbHMpIHsKKyAgICAgICAgICAgICAgICBhby0+cHJldmFyZW5hID0gYW8tPm5leHRhcmVuYTsKKyAgICAgICAgICAgICAgICBhby0+bmV4dGFyZW5hID0gYW8tPm5leHRhcmVuYS0+bmV4dGFyZW5hOworICAgICAgICAgICAgfQogCi0JCQkvKiBJbnNlcnQgYW8gYXQgdGhpcyBwb2ludC4gKi8KLQkJCWFzc2VydChhby0+bmV4dGFyZW5hID09IE5VTEwgfHwKLQkJCQlhby0+cHJldmFyZW5hID09IGFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSk7Ci0JCQlhc3NlcnQoYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID09IGFvLT5uZXh0YXJlbmEpOworICAgICAgICAgICAgLyogSW5zZXJ0IGFvIGF0IHRoaXMgcG9pbnQuICovCisgICAgICAgICAgICBhc3NlcnQoYW8tPm5leHRhcmVuYSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYSA9PSBhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEpOworICAgICAgICAgICAgYXNzZXJ0KGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9PSBhby0+bmV4dGFyZW5hKTsKIAotCQkJYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID0gYW87Ci0JCQlpZiAoYW8tPm5leHRhcmVuYSAhPSBOVUxMKQotCQkJCWFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9IGFvOworICAgICAgICAgICAgYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID0gYW87CisgICAgICAgICAgICBpZiAoYW8tPm5leHRhcmVuYSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9IGFvOwogCi0JCQkvKiBWZXJpZnkgdGhhdCB0aGUgc3dhcHMgd29ya2VkLiAqLwotCQkJYXNzZXJ0KGFvLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAotCQkJCSAgbmYgPD0gYW8tPm5leHRhcmVuYS0+bmZyZWVwb29scyk7Ci0JCQlhc3NlcnQoYW8tPnByZXZhcmVuYSA9PSBOVUxMIHx8Ci0JCQkJICBuZiA+IGFvLT5wcmV2YXJlbmEtPm5mcmVlcG9vbHMpOwotCQkJYXNzZXJ0KGFvLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAotCQkJCWFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9PSBhbyk7Ci0JCQlhc3NlcnQoKHVzYWJsZV9hcmVuYXMgPT0gYW8gJiYKLQkJCQlhby0+cHJldmFyZW5hID09IE5VTEwpIHx8Ci0JCQkJYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID09IGFvKTsKKyAgICAgICAgICAgIC8qIFZlcmlmeSB0aGF0IHRoZSBzd2FwcyB3b3JrZWQuICovCisgICAgICAgICAgICBhc3NlcnQoYW8tPm5leHRhcmVuYSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgbmYgPD0gYW8tPm5leHRhcmVuYS0+bmZyZWVwb29scyk7CisgICAgICAgICAgICBhc3NlcnQoYW8tPnByZXZhcmVuYSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgbmYgPiBhby0+cHJldmFyZW5hLT5uZnJlZXBvb2xzKTsKKyAgICAgICAgICAgIGFzc2VydChhby0+bmV4dGFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPT0gYW8pOworICAgICAgICAgICAgYXNzZXJ0KCh1c2FibGVfYXJlbmFzID09IGFvICYmCisgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYSA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9PSBhbyk7CiAKLQkJCVVOTE9DSygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8qIFBvb2wgd2FzIGZ1bGwsIHNvIGRvZXNuJ3QgY3VycmVudGx5IGxpdmUgaW4gYW55IGxpc3Q6Ci0JCSAqIGxpbmsgaXQgdG8gdGhlIGZyb250IG9mIHRoZSBhcHByb3ByaWF0ZSB1c2VkcG9vbHNbXSBsaXN0LgotCQkgKiBUaGlzIG1pbWljcyBMUlUgcG9vbCB1c2FnZSBmb3IgbmV3IGFsbG9jYXRpb25zIGFuZAotCQkgKiB0YXJnZXRzIG9wdGltYWwgZmlsbGluZyB3aGVuIHNldmVyYWwgcG9vbHMgY29udGFpbgotCQkgKiBibG9ja3Mgb2YgdGhlIHNhbWUgc2l6ZSBjbGFzcy4KLQkJICovCi0JCS0tcG9vbC0+cmVmLmNvdW50OwotCQlhc3NlcnQocG9vbC0+cmVmLmNvdW50ID4gMCk7CS8qIGVsc2UgdGhlIHBvb2wgaXMgZW1wdHkgKi8KLQkJc2l6ZSA9IHBvb2wtPnN6aWR4OwotCQluZXh0ID0gdXNlZHBvb2xzW3NpemUgKyBzaXplXTsKLQkJcHJldiA9IG5leHQtPnByZXZwb29sOwotCQkvKiBpbnNlcnQgcG9vbCBiZWZvcmUgbmV4dDogICBwcmV2IDwtPiBwb29sIDwtPiBuZXh0ICovCi0JCXBvb2wtPm5leHRwb29sID0gbmV4dDsKLQkJcG9vbC0+cHJldnBvb2wgPSBwcmV2OwotCQluZXh0LT5wcmV2cG9vbCA9IHBvb2w7Ci0JCXByZXYtPm5leHRwb29sID0gcG9vbDsKLQkJVU5MT0NLKCk7Ci0JCXJldHVybjsKLQl9CisgICAgICAgICAgICBVTkxPQ0soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvKiBQb29sIHdhcyBmdWxsLCBzbyBkb2Vzbid0IGN1cnJlbnRseSBsaXZlIGluIGFueSBsaXN0OgorICAgICAgICAgKiBsaW5rIGl0IHRvIHRoZSBmcm9udCBvZiB0aGUgYXBwcm9wcmlhdGUgdXNlZHBvb2xzW10gbGlzdC4KKyAgICAgICAgICogVGhpcyBtaW1pY3MgTFJVIHBvb2wgdXNhZ2UgZm9yIG5ldyBhbGxvY2F0aW9ucyBhbmQKKyAgICAgICAgICogdGFyZ2V0cyBvcHRpbWFsIGZpbGxpbmcgd2hlbiBzZXZlcmFsIHBvb2xzIGNvbnRhaW4KKyAgICAgICAgICogYmxvY2tzIG9mIHRoZSBzYW1lIHNpemUgY2xhc3MuCisgICAgICAgICAqLworICAgICAgICAtLXBvb2wtPnJlZi5jb3VudDsKKyAgICAgICAgYXNzZXJ0KHBvb2wtPnJlZi5jb3VudCA+IDApOyAgICAgICAgICAgIC8qIGVsc2UgdGhlIHBvb2wgaXMgZW1wdHkgKi8KKyAgICAgICAgc2l6ZSA9IHBvb2wtPnN6aWR4OworICAgICAgICBuZXh0ID0gdXNlZHBvb2xzW3NpemUgKyBzaXplXTsKKyAgICAgICAgcHJldiA9IG5leHQtPnByZXZwb29sOworICAgICAgICAvKiBpbnNlcnQgcG9vbCBiZWZvcmUgbmV4dDogICBwcmV2IDwtPiBwb29sIDwtPiBuZXh0ICovCisgICAgICAgIHBvb2wtPm5leHRwb29sID0gbmV4dDsKKyAgICAgICAgcG9vbC0+cHJldnBvb2wgPSBwcmV2OworICAgICAgICBuZXh0LT5wcmV2cG9vbCA9IHBvb2w7CisgICAgICAgIHByZXYtPm5leHRwb29sID0gcG9vbDsKKyAgICAgICAgVU5MT0NLKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICNpZmRlZiBXSVRIX1ZBTEdSSU5ECiByZWRpcmVjdDoKICNlbmRpZgotCS8qIFdlIGRpZG4ndCBhbGxvY2F0ZSB0aGlzIGFkZHJlc3MuICovCi0JZnJlZShwKTsKKyAgICAvKiBXZSBkaWRuJ3QgYWxsb2NhdGUgdGhpcyBhZGRyZXNzLiAqLworICAgIGZyZWUocCk7CiB9CiAKIC8qIHJlYWxsb2MuICBJZiBwIGlzIE5VTEwsIHRoaXMgYWN0cyBsaWtlIG1hbGxvYyhuYnl0ZXMpLiAgRWxzZSBpZiBuYnl0ZXM9PTAsCkBAIC0xMTY0LDgxICsxMTY0LDgxIEBACiB2b2lkICoKIFB5T2JqZWN0X1JlYWxsb2Modm9pZCAqcCwgc2l6ZV90IG5ieXRlcykKIHsKLQl2b2lkICpicDsKLQlwb29scCBwb29sOwotCXNpemVfdCBzaXplOworICAgIHZvaWQgKmJwOworICAgIHBvb2xwIHBvb2w7CisgICAgc2l6ZV90IHNpemU7CiAKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gUHlPYmplY3RfTWFsbG9jKG5ieXRlcyk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X01hbGxvYyhuYnl0ZXMpOwogCi0JLyoKLQkgKiBMaW1pdCBvdXJzZWx2ZXMgdG8gUFlfU1NJWkVfVF9NQVggYnl0ZXMgdG8gcHJldmVudCBzZWN1cml0eSBob2xlcy4KLQkgKiBNb3N0IHB5dGhvbiBpbnRlcm5hbHMgYmxpbmRseSB1c2UgYSBzaWduZWQgUHlfc3NpemVfdCB0byB0cmFjawotCSAqIHRoaW5ncyB3aXRob3V0IGNoZWNraW5nIGZvciBvdmVyZmxvd3Mgb3IgbmVnYXRpdmVzLgotCSAqIEFzIHNpemVfdCBpcyB1bnNpZ25lZCwgY2hlY2tpbmcgZm9yIG5ieXRlcyA8IDAgaXMgbm90IHJlcXVpcmVkLgotCSAqLwotCWlmIChuYnl0ZXMgPiBQWV9TU0laRV9UX01BWCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyoKKyAgICAgKiBMaW1pdCBvdXJzZWx2ZXMgdG8gUFlfU1NJWkVfVF9NQVggYnl0ZXMgdG8gcHJldmVudCBzZWN1cml0eSBob2xlcy4KKyAgICAgKiBNb3N0IHB5dGhvbiBpbnRlcm5hbHMgYmxpbmRseSB1c2UgYSBzaWduZWQgUHlfc3NpemVfdCB0byB0cmFjaworICAgICAqIHRoaW5ncyB3aXRob3V0IGNoZWNraW5nIGZvciBvdmVyZmxvd3Mgb3IgbmVnYXRpdmVzLgorICAgICAqIEFzIHNpemVfdCBpcyB1bnNpZ25lZCwgY2hlY2tpbmcgZm9yIG5ieXRlcyA8IDAgaXMgbm90IHJlcXVpcmVkLgorICAgICAqLworICAgIGlmIChuYnl0ZXMgPiBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNpZmRlZiBXSVRIX1ZBTEdSSU5ECi0JLyogVHJlYXQgcnVubmluZ19vbl92YWxncmluZCA9PSAtMSB0aGUgc2FtZSBhcyAwICovCi0JaWYgKFVOTElLRUxZKHJ1bm5pbmdfb25fdmFsZ3JpbmQgPiAwKSkKLQkJZ290byByZWRpcmVjdDsKKyAgICAvKiBUcmVhdCBydW5uaW5nX29uX3ZhbGdyaW5kID09IC0xIHRoZSBzYW1lIGFzIDAgKi8KKyAgICBpZiAoVU5MSUtFTFkocnVubmluZ19vbl92YWxncmluZCA+IDApKQorICAgICAgICBnb3RvIHJlZGlyZWN0OwogI2VuZGlmCiAKLQlwb29sID0gUE9PTF9BRERSKHApOwotCWlmIChQeV9BRERSRVNTX0lOX1JBTkdFKHAsIHBvb2wpKSB7Ci0JCS8qIFdlJ3JlIGluIGNoYXJnZSBvZiB0aGlzIGJsb2NrICovCi0JCXNpemUgPSBJTkRFWDJTSVpFKHBvb2wtPnN6aWR4KTsKLQkJaWYgKG5ieXRlcyA8PSBzaXplKSB7Ci0JCQkvKiBUaGUgYmxvY2sgaXMgc3RheWluZyB0aGUgc2FtZSBvciBzaHJpbmtpbmcuICBJZgotCQkJICogaXQncyBzaHJpbmtpbmcsIHRoZXJlJ3MgYSB0cmFkZW9mZjogIGl0IGNvc3RzCi0JCQkgKiBjeWNsZXMgdG8gY29weSB0aGUgYmxvY2sgdG8gYSBzbWFsbGVyIHNpemUgY2xhc3MsCi0JCQkgKiBidXQgaXQgd2FzdGVzIG1lbW9yeSBub3QgdG8gY29weSBpdC4gIFRoZQotCQkJICogY29tcHJvbWlzZSBoZXJlIGlzIHRvIGNvcHkgb24gc2hyaW5rIG9ubHkgaWYgYXQKLQkJCSAqIGxlYXN0IDI1JSBvZiBzaXplIGNhbiBiZSBzaGF2ZWQgb2ZmLgotCQkJICovCi0JCQlpZiAoNCAqIG5ieXRlcyA+IDMgKiBzaXplKSB7Ci0JCQkJLyogSXQncyB0aGUgc2FtZSwKLQkJCQkgKiBvciBzaHJpbmtpbmcgYW5kIG5ldy9vbGQgPiAzLzQuCi0JCQkJICovCi0JCQkJcmV0dXJuIHA7Ci0JCQl9Ci0JCQlzaXplID0gbmJ5dGVzOwotCQl9Ci0JCWJwID0gUHlPYmplY3RfTWFsbG9jKG5ieXRlcyk7Ci0JCWlmIChicCAhPSBOVUxMKSB7Ci0JCQltZW1jcHkoYnAsIHAsIHNpemUpOwotCQkJUHlPYmplY3RfRnJlZShwKTsKLQkJfQotCQlyZXR1cm4gYnA7Ci0JfQorICAgIHBvb2wgPSBQT09MX0FERFIocCk7CisgICAgaWYgKFB5X0FERFJFU1NfSU5fUkFOR0UocCwgcG9vbCkpIHsKKyAgICAgICAgLyogV2UncmUgaW4gY2hhcmdlIG9mIHRoaXMgYmxvY2sgKi8KKyAgICAgICAgc2l6ZSA9IElOREVYMlNJWkUocG9vbC0+c3ppZHgpOworICAgICAgICBpZiAobmJ5dGVzIDw9IHNpemUpIHsKKyAgICAgICAgICAgIC8qIFRoZSBibG9jayBpcyBzdGF5aW5nIHRoZSBzYW1lIG9yIHNocmlua2luZy4gIElmCisgICAgICAgICAgICAgKiBpdCdzIHNocmlua2luZywgdGhlcmUncyBhIHRyYWRlb2ZmOiAgaXQgY29zdHMKKyAgICAgICAgICAgICAqIGN5Y2xlcyB0byBjb3B5IHRoZSBibG9jayB0byBhIHNtYWxsZXIgc2l6ZSBjbGFzcywKKyAgICAgICAgICAgICAqIGJ1dCBpdCB3YXN0ZXMgbWVtb3J5IG5vdCB0byBjb3B5IGl0LiAgVGhlCisgICAgICAgICAgICAgKiBjb21wcm9taXNlIGhlcmUgaXMgdG8gY29weSBvbiBzaHJpbmsgb25seSBpZiBhdAorICAgICAgICAgICAgICogbGVhc3QgMjUlIG9mIHNpemUgY2FuIGJlIHNoYXZlZCBvZmYuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICg0ICogbmJ5dGVzID4gMyAqIHNpemUpIHsKKyAgICAgICAgICAgICAgICAvKiBJdCdzIHRoZSBzYW1lLAorICAgICAgICAgICAgICAgICAqIG9yIHNocmlua2luZyBhbmQgbmV3L29sZCA+IDMvNC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemUgPSBuYnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgYnAgPSBQeU9iamVjdF9NYWxsb2MobmJ5dGVzKTsKKyAgICAgICAgaWYgKGJwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweShicCwgcCwgc2l6ZSk7CisgICAgICAgICAgICBQeU9iamVjdF9GcmVlKHApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBicDsKKyAgICB9CiAjaWZkZWYgV0lUSF9WQUxHUklORAogIHJlZGlyZWN0OgogI2VuZGlmCi0JLyogV2UncmUgbm90IG1hbmFnaW5nIHRoaXMgYmxvY2suICBJZiBuYnl0ZXMgPD0KLQkgKiBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCwgaXQncyB0ZW1wdGluZyB0byB0cnkgdG8gdGFrZSBvdmVyIHRoaXMKLQkgKiBibG9jay4gIEhvd2V2ZXIsIGlmIHdlIGRvLCB3ZSBuZWVkIHRvIGNvcHkgdGhlIHZhbGlkIGRhdGEgZnJvbQotCSAqIHRoZSBDLW1hbmFnZWQgYmxvY2sgdG8gb25lIG9mIG91ciBibG9ja3MsIGFuZCB0aGVyZSdzIG5vIHBvcnRhYmxlCi0JICogd2F5IHRvIGtub3cgaG93IG11Y2ggb2YgdGhlIG1lbW9yeSBzcGFjZSBzdGFydGluZyBhdCBwIGlzIHZhbGlkLgotCSAqIEFzIGJ1ZyAxMTg1ODgzIHBvaW50ZWQgb3V0IHRoZSBoYXJkIHdheSwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZQotCSAqIEMtbWFuYWdlZCBibG9jayBpcyAiYXQgdGhlIGVuZCIgb2YgYWxsb2NhdGVkIFZNIHNwYWNlLCBzbyB0aGF0Ci0JICogYSBtZW1vcnkgZmF1bHQgY2FuIG9jY3VyIGlmIHdlIHRyeSB0byBjb3B5IG5ieXRlcyBieXRlcyBzdGFydGluZwotCSAqIGF0IHAuICBJbnN0ZWFkIHdlIHB1bnQ6ICBsZXQgQyBjb250aW51ZSB0byBtYW5hZ2UgdGhpcyBibG9jay4KLSAgICAgICAgICovCi0JaWYgKG5ieXRlcykKLQkJcmV0dXJuIHJlYWxsb2MocCwgbmJ5dGVzKTsKLQkvKiBDIGRvZXNuJ3QgZGVmaW5lIHRoZSByZXN1bHQgb2YgcmVhbGxvYyhwLCAwKSAoaXQgbWF5IG9yIG1heSBub3QKLQkgKiByZXR1cm4gTlVMTCB0aGVuKSwgYnV0IFB5dGhvbidzIGRvY3MgcHJvbWlzZSB0aGF0IG5ieXRlcz09MCBuZXZlcgotCSAqIHJldHVybnMgTlVMTC4gIFdlIGRvbid0IHBhc3MgMCB0byByZWFsbG9jKCksIHRvIGF2b2lkIHRoYXQgZW5kY2FzZQotCSAqIHRvIGJlZ2luIHdpdGguICBFdmVuIHRoZW4sIHdlIGNhbid0IGJlIHN1cmUgdGhhdCByZWFsbG9jKCkgd29uJ3QKLQkgKiByZXR1cm4gTlVMTC4KLQkgKi8KLQlicCA9IHJlYWxsb2MocCwgMSk7Ci0gICAJcmV0dXJuIGJwID8gYnAgOiBwOworICAgIC8qIFdlJ3JlIG5vdCBtYW5hZ2luZyB0aGlzIGJsb2NrLiAgSWYgbmJ5dGVzIDw9CisgICAgICogU01BTExfUkVRVUVTVF9USFJFU0hPTEQsIGl0J3MgdGVtcHRpbmcgdG8gdHJ5IHRvIHRha2Ugb3ZlciB0aGlzCisgICAgICogYmxvY2suICBIb3dldmVyLCBpZiB3ZSBkbywgd2UgbmVlZCB0byBjb3B5IHRoZSB2YWxpZCBkYXRhIGZyb20KKyAgICAgKiB0aGUgQy1tYW5hZ2VkIGJsb2NrIHRvIG9uZSBvZiBvdXIgYmxvY2tzLCBhbmQgdGhlcmUncyBubyBwb3J0YWJsZQorICAgICAqIHdheSB0byBrbm93IGhvdyBtdWNoIG9mIHRoZSBtZW1vcnkgc3BhY2Ugc3RhcnRpbmcgYXQgcCBpcyB2YWxpZC4KKyAgICAgKiBBcyBidWcgMTE4NTg4MyBwb2ludGVkIG91dCB0aGUgaGFyZCB3YXksIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKKyAgICAgKiBDLW1hbmFnZWQgYmxvY2sgaXMgImF0IHRoZSBlbmQiIG9mIGFsbG9jYXRlZCBWTSBzcGFjZSwgc28gdGhhdAorICAgICAqIGEgbWVtb3J5IGZhdWx0IGNhbiBvY2N1ciBpZiB3ZSB0cnkgdG8gY29weSBuYnl0ZXMgYnl0ZXMgc3RhcnRpbmcKKyAgICAgKiBhdCBwLiAgSW5zdGVhZCB3ZSBwdW50OiAgbGV0IEMgY29udGludWUgdG8gbWFuYWdlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgaWYgKG5ieXRlcykKKyAgICAgICAgcmV0dXJuIHJlYWxsb2MocCwgbmJ5dGVzKTsKKyAgICAvKiBDIGRvZXNuJ3QgZGVmaW5lIHRoZSByZXN1bHQgb2YgcmVhbGxvYyhwLCAwKSAoaXQgbWF5IG9yIG1heSBub3QKKyAgICAgKiByZXR1cm4gTlVMTCB0aGVuKSwgYnV0IFB5dGhvbidzIGRvY3MgcHJvbWlzZSB0aGF0IG5ieXRlcz09MCBuZXZlcgorICAgICAqIHJldHVybnMgTlVMTC4gIFdlIGRvbid0IHBhc3MgMCB0byByZWFsbG9jKCksIHRvIGF2b2lkIHRoYXQgZW5kY2FzZQorICAgICAqIHRvIGJlZ2luIHdpdGguICBFdmVuIHRoZW4sIHdlIGNhbid0IGJlIHN1cmUgdGhhdCByZWFsbG9jKCkgd29uJ3QKKyAgICAgKiByZXR1cm4gTlVMTC4KKyAgICAgKi8KKyAgICBicCA9IHJlYWxsb2MocCwgMSk7CisgICAgcmV0dXJuIGJwID8gYnAgOiBwOwogfQogCi0jZWxzZQkvKiAhIFdJVEhfUFlNQUxMT0MgKi8KKyNlbHNlICAgLyogISBXSVRIX1BZTUFMTE9DICovCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogcHltYWxsb2Mgbm90IGVuYWJsZWQ6ICBSZWRpcmVjdCB0aGUgZW50cnkgcG9pbnRzIHRvIG1hbGxvYy4gIFRoZXNlIHdpbGwKQEAgLTEyNDcsMTkgKzEyNDcsMTkgQEAKIHZvaWQgKgogUHlPYmplY3RfTWFsbG9jKHNpemVfdCBuKQogewotCXJldHVybiBQeU1lbV9NQUxMT0Mobik7CisgICAgcmV0dXJuIFB5TWVtX01BTExPQyhuKTsKIH0KIAogdm9pZCAqCiBQeU9iamVjdF9SZWFsbG9jKHZvaWQgKnAsIHNpemVfdCBuKQogewotCXJldHVybiBQeU1lbV9SRUFMTE9DKHAsIG4pOworICAgIHJldHVybiBQeU1lbV9SRUFMTE9DKHAsIG4pOwogfQogCiB2b2lkCiBQeU9iamVjdF9GcmVlKHZvaWQgKnApCiB7Ci0JUHlNZW1fRlJFRShwKTsKKyAgICBQeU1lbV9GUkVFKHApOwogfQogI2VuZGlmIC8qIFdJVEhfUFlNQUxMT0MgKi8KIApAQCAtMTI4NCw3ICsxMjg0LDcgQEAKICNkZWZpbmUgX1BZTUFMTE9DX01FTV9JRCAnbScgICAvKiB0aGUgUHlNZW1fTWFsbG9jKCkgQVBJICovCiAjZGVmaW5lIF9QWU1BTExPQ19PQkpfSUQgJ28nICAgLyogVGhlIFB5T2JqZWN0X01hbGxvYygpIEFQSSAqLwogCi1zdGF0aWMgc2l6ZV90IHNlcmlhbG5vID0gMDsJLyogaW5jcmVtZW50ZWQgb24gZWFjaCBkZWJ1ZyB7bSxyZX1hbGxvYyAqLworc3RhdGljIHNpemVfdCBzZXJpYWxubyA9IDA7ICAgICAvKiBpbmNyZW1lbnRlZCBvbiBlYWNoIGRlYnVnIHttLHJlfWFsbG9jICovCiAKIC8qIHNlcmlhbG5vIGlzIGFsd2F5cyBpbmNyZW1lbnRlZCB2aWEgY2FsbGluZyB0aGlzIHJvdXRpbmUuICBUaGUgcG9pbnQgaXMKICAqIHRvIHN1cHBseSBhIHNpbmdsZSBwbGFjZSB0byBzZXQgYSBicmVha3BvaW50LgpAQCAtMTI5Miw3ICsxMjkyLDcgQEAKIHN0YXRpYyB2b2lkCiBidW1wc2VyaWFsbm8odm9pZCkKIHsKLQkrK3NlcmlhbG5vOworICAgICsrc2VyaWFsbm87CiB9CiAKICNkZWZpbmUgU1NUIFNJWkVPRl9TSVpFX1QKQEAgLTEzMDEsMTMgKzEzMDEsMTMgQEAKIHN0YXRpYyBzaXplX3QKIHJlYWRfc2l6ZV90KGNvbnN0IHZvaWQgKnApCiB7Ci0JY29uc3QgdWNoYXIgKnEgPSAoY29uc3QgdWNoYXIgKilwOwotCXNpemVfdCByZXN1bHQgPSAqcSsrOwotCWludCBpOworICAgIGNvbnN0IHVjaGFyICpxID0gKGNvbnN0IHVjaGFyICopcDsKKyAgICBzaXplX3QgcmVzdWx0ID0gKnErKzsKKyAgICBpbnQgaTsKIAotCWZvciAoaSA9IFNTVDsgLS1pID4gMDsgKytxKQotCQlyZXN1bHQgPSAocmVzdWx0IDw8IDgpIHwgKnE7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmb3IgKGkgPSBTU1Q7IC0taSA+IDA7ICsrcSkKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSB8ICpxOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFdyaXRlIG4gYXMgYSBiaWctZW5kaWFuIHNpemVfdCwgTVNCIGF0IGFkZHJlc3MgcCwgTFNCIGF0CkBAIC0xMzE2LDEzICsxMzE2LDEzIEBACiBzdGF0aWMgdm9pZAogd3JpdGVfc2l6ZV90KHZvaWQgKnAsIHNpemVfdCBuKQogewotCXVjaGFyICpxID0gKHVjaGFyICopcCArIFNTVCAtIDE7Ci0JaW50IGk7CisgICAgdWNoYXIgKnEgPSAodWNoYXIgKilwICsgU1NUIC0gMTsKKyAgICBpbnQgaTsKIAotCWZvciAoaSA9IFNTVDsgLS1pID49IDA7IC0tcSkgewotCQkqcSA9ICh1Y2hhcikobiAmIDB4ZmYpOwotCQluID4+PSA4OwotCX0KKyAgICBmb3IgKGkgPSBTU1Q7IC0taSA+PSAwOyAtLXEpIHsKKyAgICAgICAgKnEgPSAodWNoYXIpKG4gJiAweGZmKTsKKyAgICAgICAgbiA+Pj0gODsKKyAgICB9CiB9CiAKICNpZmRlZiBQeV9ERUJVRwpAQCAtMTMzMywyMiArMTMzMywyMiBAQAogc3RhdGljIGludAogcG9vbF9pc19pbl9saXN0KGNvbnN0IHBvb2xwIHRhcmdldCwgcG9vbHAgbGlzdCkKIHsKLQlwb29scCBvcmlnbGlzdCA9IGxpc3Q7Ci0JYXNzZXJ0KHRhcmdldCAhPSBOVUxMKTsKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlkbyB7Ci0JCWlmICh0YXJnZXQgPT0gbGlzdCkKLQkJCXJldHVybiAxOwotCQlsaXN0ID0gbGlzdC0+bmV4dHBvb2w7Ci0JfSB3aGlsZSAobGlzdCAhPSBOVUxMICYmIGxpc3QgIT0gb3JpZ2xpc3QpOwotCXJldHVybiAwOworICAgIHBvb2xwIG9yaWdsaXN0ID0gbGlzdDsKKyAgICBhc3NlcnQodGFyZ2V0ICE9IE5VTEwpOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGRvIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBsaXN0KQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0cG9vbDsKKyAgICB9IHdoaWxlIChsaXN0ICE9IE5VTEwgJiYgbGlzdCAhPSBvcmlnbGlzdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKICNlbHNlCiAjZGVmaW5lIHBvb2xfaXNfaW5fbGlzdChYLCBZKSAxCiAKLSNlbmRpZgkvKiBQeV9ERUJVRyAqLworI2VuZGlmICAvKiBQeV9ERUJVRyAqLwogCiAvKiBMZXQgUyA9IHNpemVvZihzaXplX3QpLiAgVGhlIGRlYnVnIG1hbGxvYyBhc2tzIGZvciA0KlMgZXh0cmEgYnl0ZXMgYW5kCiAgICBmaWxscyB0aGVtIHdpdGggdXNlZnVsIHN0dWZmLCBoZXJlIGNhbGxpbmcgdGhlIHVuZGVybHlpbmcgbWFsbG9jJ3MgcmVzdWx0IHA6CkBAIC0xMzc4LDM5ICsxMzc4LDM5IEBACiB2b2lkICoKIF9QeU1lbV9EZWJ1Z01hbGxvYyhzaXplX3QgbmJ5dGVzKQogewotCXJldHVybiBfUHlPYmplY3RfRGVidWdNYWxsb2NBcGkoX1BZTUFMTE9DX01FTV9JRCwgbmJ5dGVzKTsKKyAgICByZXR1cm4gX1B5T2JqZWN0X0RlYnVnTWFsbG9jQXBpKF9QWU1BTExPQ19NRU1fSUQsIG5ieXRlcyk7CiB9CiB2b2lkICoKIF9QeU1lbV9EZWJ1Z1JlYWxsb2Modm9pZCAqcCwgc2l6ZV90IG5ieXRlcykKIHsKLQlyZXR1cm4gX1B5T2JqZWN0X0RlYnVnUmVhbGxvY0FwaShfUFlNQUxMT0NfTUVNX0lELCBwLCBuYnl0ZXMpOworICAgIHJldHVybiBfUHlPYmplY3RfRGVidWdSZWFsbG9jQXBpKF9QWU1BTExPQ19NRU1fSUQsIHAsIG5ieXRlcyk7CiB9CiB2b2lkCiBfUHlNZW1fRGVidWdGcmVlKHZvaWQgKnApCiB7Ci0JX1B5T2JqZWN0X0RlYnVnRnJlZUFwaShfUFlNQUxMT0NfTUVNX0lELCBwKTsKKyAgICBfUHlPYmplY3RfRGVidWdGcmVlQXBpKF9QWU1BTExPQ19NRU1fSUQsIHApOwogfQogCiAvKiBkZWJ1ZyByZXBsYWNlbWVudHMgZm9yIHRoZSBQeU9iamVjdF8qIG1lbW9yeSBBUEkgKi8KIHZvaWQgKgogX1B5T2JqZWN0X0RlYnVnTWFsbG9jKHNpemVfdCBuYnl0ZXMpCiB7Ci0JcmV0dXJuIF9QeU9iamVjdF9EZWJ1Z01hbGxvY0FwaShfUFlNQUxMT0NfT0JKX0lELCBuYnl0ZXMpOworICAgIHJldHVybiBfUHlPYmplY3RfRGVidWdNYWxsb2NBcGkoX1BZTUFMTE9DX09CSl9JRCwgbmJ5dGVzKTsKIH0KIHZvaWQgKgogX1B5T2JqZWN0X0RlYnVnUmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbmJ5dGVzKQogewotCXJldHVybiBfUHlPYmplY3RfRGVidWdSZWFsbG9jQXBpKF9QWU1BTExPQ19PQkpfSUQsIHAsIG5ieXRlcyk7CisgICAgcmV0dXJuIF9QeU9iamVjdF9EZWJ1Z1JlYWxsb2NBcGkoX1BZTUFMTE9DX09CSl9JRCwgcCwgbmJ5dGVzKTsKIH0KIHZvaWQKIF9QeU9iamVjdF9EZWJ1Z0ZyZWUodm9pZCAqcCkKIHsKLQlfUHlPYmplY3RfRGVidWdGcmVlQXBpKF9QWU1BTExPQ19PQkpfSUQsIHApOworICAgIF9QeU9iamVjdF9EZWJ1Z0ZyZWVBcGkoX1BZTUFMTE9DX09CSl9JRCwgcCk7CiB9CiB2b2lkCiBfUHlPYmplY3RfRGVidWdDaGVja0FkZHJlc3MoY29uc3Qgdm9pZCAqcCkKIHsKLQlfUHlPYmplY3RfRGVidWdDaGVja0FkZHJlc3NBcGkoX1BZTUFMTE9DX09CSl9JRCwgcCk7CisgICAgX1B5T2JqZWN0X0RlYnVnQ2hlY2tBZGRyZXNzQXBpKF9QWU1BTExPQ19PQkpfSUQsIHApOwogfQogCiAKQEAgLTE0MTgsMzQgKzE0MTgsMzQgQEAKIHZvaWQgKgogX1B5T2JqZWN0X0RlYnVnTWFsbG9jQXBpKGNoYXIgaWQsIHNpemVfdCBuYnl0ZXMpCiB7Ci0JdWNoYXIgKnA7CS8qIGJhc2UgYWRkcmVzcyBvZiBtYWxsb2MnZWQgYmxvY2sgKi8KLQl1Y2hhciAqdGFpbDsJLyogcCArIDIqU1NUICsgbmJ5dGVzID09IHBvaW50ZXIgdG8gdGFpbCBwYWQgYnl0ZXMgKi8KLQlzaXplX3QgdG90YWw7CS8qIG5ieXRlcyArIDQqU1NUICovCisgICAgdWNoYXIgKnA7ICAgICAgICAgICAvKiBiYXNlIGFkZHJlc3Mgb2YgbWFsbG9jJ2VkIGJsb2NrICovCisgICAgdWNoYXIgKnRhaWw7ICAgICAgICAvKiBwICsgMipTU1QgKyBuYnl0ZXMgPT0gcG9pbnRlciB0byB0YWlsIHBhZCBieXRlcyAqLworICAgIHNpemVfdCB0b3RhbDsgICAgICAgLyogbmJ5dGVzICsgNCpTU1QgKi8KIAotCWJ1bXBzZXJpYWxubygpOwotCXRvdGFsID0gbmJ5dGVzICsgNCpTU1Q7Ci0JaWYgKHRvdGFsIDwgbmJ5dGVzKQotCQkvKiBvdmVyZmxvdzogIGNhbid0IHJlcHJlc2VudCB0b3RhbCBhcyBhIHNpemVfdCAqLwotCQlyZXR1cm4gTlVMTDsKKyAgICBidW1wc2VyaWFsbm8oKTsKKyAgICB0b3RhbCA9IG5ieXRlcyArIDQqU1NUOworICAgIGlmICh0b3RhbCA8IG5ieXRlcykKKyAgICAgICAgLyogb3ZlcmZsb3c6ICBjYW4ndCByZXByZXNlbnQgdG90YWwgYXMgYSBzaXplX3QgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlwID0gKHVjaGFyICopUHlPYmplY3RfTWFsbG9jKHRvdGFsKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBwID0gKHVjaGFyICopUHlPYmplY3RfTWFsbG9jKHRvdGFsKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGF0IHAsIHdyaXRlIHNpemUgKFNTVCBieXRlcyksIGlkICgxIGJ5dGUpLCBwYWQgKFNTVC0xIGJ5dGVzKSAqLwotCXdyaXRlX3NpemVfdChwLCBuYnl0ZXMpOwotCXBbU1NUXSA9ICh1Y2hhcilpZDsKLQltZW1zZXQocCArIFNTVCArIDEgLCBGT1JCSURERU5CWVRFLCBTU1QtMSk7CisgICAgLyogYXQgcCwgd3JpdGUgc2l6ZSAoU1NUIGJ5dGVzKSwgaWQgKDEgYnl0ZSksIHBhZCAoU1NULTEgYnl0ZXMpICovCisgICAgd3JpdGVfc2l6ZV90KHAsIG5ieXRlcyk7CisgICAgcFtTU1RdID0gKHVjaGFyKWlkOworICAgIG1lbXNldChwICsgU1NUICsgMSAsIEZPUkJJRERFTkJZVEUsIFNTVC0xKTsKIAotCWlmIChuYnl0ZXMgPiAwKQotCQltZW1zZXQocCArIDIqU1NULCBDTEVBTkJZVEUsIG5ieXRlcyk7CisgICAgaWYgKG5ieXRlcyA+IDApCisgICAgICAgIG1lbXNldChwICsgMipTU1QsIENMRUFOQllURSwgbmJ5dGVzKTsKIAotCS8qIGF0IHRhaWwsIHdyaXRlIHBhZCAoU1NUIGJ5dGVzKSBhbmQgc2VyaWFsbm8gKFNTVCBieXRlcykgKi8KLQl0YWlsID0gcCArIDIqU1NUICsgbmJ5dGVzOwotCW1lbXNldCh0YWlsLCBGT1JCSURERU5CWVRFLCBTU1QpOwotCXdyaXRlX3NpemVfdCh0YWlsICsgU1NULCBzZXJpYWxubyk7CisgICAgLyogYXQgdGFpbCwgd3JpdGUgcGFkIChTU1QgYnl0ZXMpIGFuZCBzZXJpYWxubyAoU1NUIGJ5dGVzKSAqLworICAgIHRhaWwgPSBwICsgMipTU1QgKyBuYnl0ZXM7CisgICAgbWVtc2V0KHRhaWwsIEZPUkJJRERFTkJZVEUsIFNTVCk7CisgICAgd3JpdGVfc2l6ZV90KHRhaWwgKyBTU1QsIHNlcmlhbG5vKTsKIAotCXJldHVybiBwICsgMipTU1Q7CisgICAgcmV0dXJuIHAgKyAyKlNTVDsKIH0KIAogLyogVGhlIGRlYnVnIGZyZWUgZmlyc3QgY2hlY2tzIHRoZSAyKlNTVCBieXRlcyBvbiBlYWNoIGVuZCBmb3Igc2FuaXR5IChpbgpAQCAtMTQ1Niw2OCArMTQ1Niw2OCBAQAogdm9pZAogX1B5T2JqZWN0X0RlYnVnRnJlZUFwaShjaGFyIGFwaSwgdm9pZCAqcCkKIHsKLQl1Y2hhciAqcSA9ICh1Y2hhciAqKXAgLSAyKlNTVDsgIC8qIGFkZHJlc3MgcmV0dXJuZWQgZnJvbSBtYWxsb2MgKi8KLQlzaXplX3QgbmJ5dGVzOworICAgIHVjaGFyICpxID0gKHVjaGFyICopcCAtIDIqU1NUOyAgLyogYWRkcmVzcyByZXR1cm5lZCBmcm9tIG1hbGxvYyAqLworICAgIHNpemVfdCBuYnl0ZXM7CiAKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JX1B5T2JqZWN0X0RlYnVnQ2hlY2tBZGRyZXNzQXBpKGFwaSwgcCk7Ci0JbmJ5dGVzID0gcmVhZF9zaXplX3QocSk7Ci0JbmJ5dGVzICs9IDQqU1NUOwotCWlmIChuYnl0ZXMgPiAwKQotCQltZW1zZXQocSwgREVBREJZVEUsIG5ieXRlcyk7Ci0JUHlPYmplY3RfRnJlZShxKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgX1B5T2JqZWN0X0RlYnVnQ2hlY2tBZGRyZXNzQXBpKGFwaSwgcCk7CisgICAgbmJ5dGVzID0gcmVhZF9zaXplX3QocSk7CisgICAgbmJ5dGVzICs9IDQqU1NUOworICAgIGlmIChuYnl0ZXMgPiAwKQorICAgICAgICBtZW1zZXQocSwgREVBREJZVEUsIG5ieXRlcyk7CisgICAgUHlPYmplY3RfRnJlZShxKTsKIH0KIAogdm9pZCAqCiBfUHlPYmplY3RfRGVidWdSZWFsbG9jQXBpKGNoYXIgYXBpLCB2b2lkICpwLCBzaXplX3QgbmJ5dGVzKQogewotCXVjaGFyICpxID0gKHVjaGFyICopcDsKLQl1Y2hhciAqdGFpbDsKLQlzaXplX3QgdG90YWw7CS8qIG5ieXRlcyArIDQqU1NUICovCi0Jc2l6ZV90IG9yaWdpbmFsX25ieXRlczsKLQlpbnQgaTsKKyAgICB1Y2hhciAqcSA9ICh1Y2hhciAqKXA7CisgICAgdWNoYXIgKnRhaWw7CisgICAgc2l6ZV90IHRvdGFsOyAgICAgICAvKiBuYnl0ZXMgKyA0KlNTVCAqLworICAgIHNpemVfdCBvcmlnaW5hbF9uYnl0ZXM7CisgICAgaW50IGk7CiAKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gX1B5T2JqZWN0X0RlYnVnTWFsbG9jQXBpKGFwaSwgbmJ5dGVzKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX1B5T2JqZWN0X0RlYnVnTWFsbG9jQXBpKGFwaSwgbmJ5dGVzKTsKIAotCV9QeU9iamVjdF9EZWJ1Z0NoZWNrQWRkcmVzc0FwaShhcGksIHApOwotCWJ1bXBzZXJpYWxubygpOwotCW9yaWdpbmFsX25ieXRlcyA9IHJlYWRfc2l6ZV90KHEgLSAyKlNTVCk7Ci0JdG90YWwgPSBuYnl0ZXMgKyA0KlNTVDsKLQlpZiAodG90YWwgPCBuYnl0ZXMpCi0JCS8qIG92ZXJmbG93OiAgY2FuJ3QgcmVwcmVzZW50IHRvdGFsIGFzIGEgc2l6ZV90ICovCi0JCXJldHVybiBOVUxMOworICAgIF9QeU9iamVjdF9EZWJ1Z0NoZWNrQWRkcmVzc0FwaShhcGksIHApOworICAgIGJ1bXBzZXJpYWxubygpOworICAgIG9yaWdpbmFsX25ieXRlcyA9IHJlYWRfc2l6ZV90KHEgLSAyKlNTVCk7CisgICAgdG90YWwgPSBuYnl0ZXMgKyA0KlNTVDsKKyAgICBpZiAodG90YWwgPCBuYnl0ZXMpCisgICAgICAgIC8qIG92ZXJmbG93OiAgY2FuJ3QgcmVwcmVzZW50IHRvdGFsIGFzIGEgc2l6ZV90ICovCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKG5ieXRlcyA8IG9yaWdpbmFsX25ieXRlcykgewotCQkvKiBzaHJpbmtpbmc6ICBtYXJrIG9sZCBleHRyYSBtZW1vcnkgZGVhZCAqLwotCQltZW1zZXQocSArIG5ieXRlcywgREVBREJZVEUsIG9yaWdpbmFsX25ieXRlcyAtIG5ieXRlcyArIDIqU1NUKTsKLQl9CisgICAgaWYgKG5ieXRlcyA8IG9yaWdpbmFsX25ieXRlcykgeworICAgICAgICAvKiBzaHJpbmtpbmc6ICBtYXJrIG9sZCBleHRyYSBtZW1vcnkgZGVhZCAqLworICAgICAgICBtZW1zZXQocSArIG5ieXRlcywgREVBREJZVEUsIG9yaWdpbmFsX25ieXRlcyAtIG5ieXRlcyArIDIqU1NUKTsKKyAgICB9CiAKLQkvKiBSZXNpemUgYW5kIGFkZCBkZWNvcmF0aW9ucy4gV2UgbWF5IGdldCBhIG5ldyBwb2ludGVyIGhlcmUsIGluIHdoaWNoCi0JICogY2FzZSB3ZSBkaWRuJ3QgZ2V0IHRoZSBjaGFuY2UgdG8gbWFyayB0aGUgb2xkIG1lbW9yeSB3aXRoIERFQURCWVRFLAotCSAqIGJ1dCB3ZSBsaXZlIHdpdGggdGhhdC4KLQkgKi8KLQlxID0gKHVjaGFyICopUHlPYmplY3RfUmVhbGxvYyhxIC0gMipTU1QsIHRvdGFsKTsKLQlpZiAocSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBSZXNpemUgYW5kIGFkZCBkZWNvcmF0aW9ucy4gV2UgbWF5IGdldCBhIG5ldyBwb2ludGVyIGhlcmUsIGluIHdoaWNoCisgICAgICogY2FzZSB3ZSBkaWRuJ3QgZ2V0IHRoZSBjaGFuY2UgdG8gbWFyayB0aGUgb2xkIG1lbW9yeSB3aXRoIERFQURCWVRFLAorICAgICAqIGJ1dCB3ZSBsaXZlIHdpdGggdGhhdC4KKyAgICAgKi8KKyAgICBxID0gKHVjaGFyICopUHlPYmplY3RfUmVhbGxvYyhxIC0gMipTU1QsIHRvdGFsKTsKKyAgICBpZiAocSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXdyaXRlX3NpemVfdChxLCBuYnl0ZXMpOwotCWFzc2VydChxW1NTVF0gPT0gKHVjaGFyKWFwaSk7Ci0JZm9yIChpID0gMTsgaSA8IFNTVDsgKytpKQotCQlhc3NlcnQocVtTU1QgKyBpXSA9PSBGT1JCSURERU5CWVRFKTsKLQlxICs9IDIqU1NUOwotCXRhaWwgPSBxICsgbmJ5dGVzOwotCW1lbXNldCh0YWlsLCBGT1JCSURERU5CWVRFLCBTU1QpOwotCXdyaXRlX3NpemVfdCh0YWlsICsgU1NULCBzZXJpYWxubyk7CisgICAgd3JpdGVfc2l6ZV90KHEsIG5ieXRlcyk7CisgICAgYXNzZXJ0KHFbU1NUXSA9PSAodWNoYXIpYXBpKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgU1NUOyArK2kpCisgICAgICAgIGFzc2VydChxW1NTVCArIGldID09IEZPUkJJRERFTkJZVEUpOworICAgIHEgKz0gMipTU1Q7CisgICAgdGFpbCA9IHEgKyBuYnl0ZXM7CisgICAgbWVtc2V0KHRhaWwsIEZPUkJJRERFTkJZVEUsIFNTVCk7CisgICAgd3JpdGVfc2l6ZV90KHRhaWwgKyBTU1QsIHNlcmlhbG5vKTsKIAotCWlmIChuYnl0ZXMgPiBvcmlnaW5hbF9uYnl0ZXMpIHsKLQkJLyogZ3Jvd2luZzogIG1hcmsgbmV3IGV4dHJhIG1lbW9yeSBjbGVhbiAqLwotCQltZW1zZXQocSArIG9yaWdpbmFsX25ieXRlcywgQ0xFQU5CWVRFLAotCQkJbmJ5dGVzIC0gb3JpZ2luYWxfbmJ5dGVzKTsKLQl9CisgICAgaWYgKG5ieXRlcyA+IG9yaWdpbmFsX25ieXRlcykgeworICAgICAgICAvKiBncm93aW5nOiAgbWFyayBuZXcgZXh0cmEgbWVtb3J5IGNsZWFuICovCisgICAgICAgIG1lbXNldChxICsgb3JpZ2luYWxfbmJ5dGVzLCBDTEVBTkJZVEUsCisgICAgICAgICAgICBuYnl0ZXMgLSBvcmlnaW5hbF9uYnl0ZXMpOworICAgIH0KIAotCXJldHVybiBxOworICAgIHJldHVybiBxOwogfQogCiAvKiBDaGVjayB0aGUgZm9yYmlkZGVuIGJ5dGVzIG9uIGJvdGggZW5kcyBvZiB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgcC4KQEAgLTE1MjgsMTkyICsxNTI4LDE5MiBAQAogIHZvaWQKIF9QeU9iamVjdF9EZWJ1Z0NoZWNrQWRkcmVzc0FwaShjaGFyIGFwaSwgY29uc3Qgdm9pZCAqcCkKIHsKLQljb25zdCB1Y2hhciAqcSA9IChjb25zdCB1Y2hhciAqKXA7Ci0JY2hhciBtc2didWZbNjRdOwotCWNoYXIgKm1zZzsKLQlzaXplX3QgbmJ5dGVzOwotCWNvbnN0IHVjaGFyICp0YWlsOwotCWludCBpOwotCWNoYXIgaWQ7CisgICAgY29uc3QgdWNoYXIgKnEgPSAoY29uc3QgdWNoYXIgKilwOworICAgIGNoYXIgbXNnYnVmWzY0XTsKKyAgICBjaGFyICptc2c7CisgICAgc2l6ZV90IG5ieXRlczsKKyAgICBjb25zdCB1Y2hhciAqdGFpbDsKKyAgICBpbnQgaTsKKyAgICBjaGFyIGlkOwogCi0JaWYgKHAgPT0gTlVMTCkgewotCQltc2cgPSAiZGlkbid0IGV4cGVjdCBhIE5VTEwgcG9pbnRlciI7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgbXNnID0gImRpZG4ndCBleHBlY3QgYSBOVUxMIHBvaW50ZXIiOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIENoZWNrIHRoZSBBUEkgaWQgKi8KLQlpZCA9IChjaGFyKXFbLVNTVF07Ci0JaWYgKGlkICE9IGFwaSkgewotCQltc2cgPSBtc2didWY7Ci0JCXNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZ2J1ZiksICJiYWQgSUQ6IEFsbG9jYXRlZCB1c2luZyBBUEkgJyVjJywgdmVyaWZpZWQgdXNpbmcgQVBJICclYyciLCBpZCwgYXBpKTsKLQkJbXNnYnVmW3NpemVvZihtc2didWYpLTFdID0gMDsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgLyogQ2hlY2sgdGhlIEFQSSBpZCAqLworICAgIGlkID0gKGNoYXIpcVstU1NUXTsKKyAgICBpZiAoaWQgIT0gYXBpKSB7CisgICAgICAgIG1zZyA9IG1zZ2J1ZjsKKyAgICAgICAgc25wcmludGYobXNnLCBzaXplb2YobXNnYnVmKSwgImJhZCBJRDogQWxsb2NhdGVkIHVzaW5nIEFQSSAnJWMnLCB2ZXJpZmllZCB1c2luZyBBUEkgJyVjJyIsIGlkLCBhcGkpOworICAgICAgICBtc2didWZbc2l6ZW9mKG1zZ2J1ZiktMV0gPSAwOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIENoZWNrIHRoZSBzdHVmZiBhdCB0aGUgc3RhcnQgb2YgcCBmaXJzdDogIGlmIHRoZXJlJ3MgdW5kZXJ3cml0ZQotCSAqIGNvcnJ1cHRpb24sIHRoZSBudW1iZXItb2YtYnl0ZXMgZmllbGQgbWF5IGJlIG51dHMsIGFuZCBjaGVja2luZwotCSAqIHRoZSB0YWlsIGNvdWxkIGxlYWQgdG8gYSBzZWdmYXVsdCB0aGVuLgotCSAqLwotCWZvciAoaSA9IFNTVC0xOyBpID49IDE7IC0taSkgewotCQlpZiAoKihxLWkpICE9IEZPUkJJRERFTkJZVEUpIHsKLQkJCW1zZyA9ICJiYWQgbGVhZGluZyBwYWQgYnl0ZSI7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQorICAgIC8qIENoZWNrIHRoZSBzdHVmZiBhdCB0aGUgc3RhcnQgb2YgcCBmaXJzdDogIGlmIHRoZXJlJ3MgdW5kZXJ3cml0ZQorICAgICAqIGNvcnJ1cHRpb24sIHRoZSBudW1iZXItb2YtYnl0ZXMgZmllbGQgbWF5IGJlIG51dHMsIGFuZCBjaGVja2luZworICAgICAqIHRoZSB0YWlsIGNvdWxkIGxlYWQgdG8gYSBzZWdmYXVsdCB0aGVuLgorICAgICAqLworICAgIGZvciAoaSA9IFNTVC0xOyBpID49IDE7IC0taSkgeworICAgICAgICBpZiAoKihxLWkpICE9IEZPUkJJRERFTkJZVEUpIHsKKyAgICAgICAgICAgIG1zZyA9ICJiYWQgbGVhZGluZyBwYWQgYnl0ZSI7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQogCi0JbmJ5dGVzID0gcmVhZF9zaXplX3QocSAtIDIqU1NUKTsKLQl0YWlsID0gcSArIG5ieXRlczsKLQlmb3IgKGkgPSAwOyBpIDwgU1NUOyArK2kpIHsKLQkJaWYgKHRhaWxbaV0gIT0gRk9SQklEREVOQllURSkgewotCQkJbXNnID0gImJhZCB0cmFpbGluZyBwYWQgYnl0ZSI7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQorICAgIG5ieXRlcyA9IHJlYWRfc2l6ZV90KHEgLSAyKlNTVCk7CisgICAgdGFpbCA9IHEgKyBuYnl0ZXM7CisgICAgZm9yIChpID0gMDsgaSA8IFNTVDsgKytpKSB7CisgICAgICAgIGlmICh0YWlsW2ldICE9IEZPUkJJRERFTkJZVEUpIHsKKyAgICAgICAgICAgIG1zZyA9ICJiYWQgdHJhaWxpbmcgcGFkIGJ5dGUiOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybjsKKyAgICByZXR1cm47CiAKIGVycm9yOgotCV9QeU9iamVjdF9EZWJ1Z0R1bXBBZGRyZXNzKHApOwotCVB5X0ZhdGFsRXJyb3IobXNnKTsKKyAgICBfUHlPYmplY3RfRGVidWdEdW1wQWRkcmVzcyhwKTsKKyAgICBQeV9GYXRhbEVycm9yKG1zZyk7CiB9CiAKIC8qIERpc3BsYXkgaW5mbyB0byBzdGRlcnIgYWJvdXQgdGhlIG1lbW9yeSBibG9jayBhdCBwLiAqLwogdm9pZAogX1B5T2JqZWN0X0RlYnVnRHVtcEFkZHJlc3MoY29uc3Qgdm9pZCAqcCkKIHsKLQljb25zdCB1Y2hhciAqcSA9IChjb25zdCB1Y2hhciAqKXA7Ci0JY29uc3QgdWNoYXIgKnRhaWw7Ci0Jc2l6ZV90IG5ieXRlcywgc2VyaWFsOwotCWludCBpOwotCWludCBvazsKLQljaGFyIGlkOworICAgIGNvbnN0IHVjaGFyICpxID0gKGNvbnN0IHVjaGFyICopcDsKKyAgICBjb25zdCB1Y2hhciAqdGFpbDsKKyAgICBzaXplX3QgbmJ5dGVzLCBzZXJpYWw7CisgICAgaW50IGk7CisgICAgaW50IG9rOworICAgIGNoYXIgaWQ7CiAKLQlmcHJpbnRmKHN0ZGVyciwgIkRlYnVnIG1lbW9yeSBibG9jayBhdCBhZGRyZXNzIHA9JXA6IiwgcCk7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaWQgPSAoY2hhcilxWy1TU1RdOwotCWZwcmludGYoc3RkZXJyLCAiIEFQSSAnJWMnXG4iLCBpZCk7CisgICAgZnByaW50ZihzdGRlcnIsICJEZWJ1ZyBtZW1vcnkgYmxvY2sgYXQgYWRkcmVzcyBwPSVwOiIsIHApOworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlkID0gKGNoYXIpcVstU1NUXTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiBBUEkgJyVjJ1xuIiwgaWQpOwogCi0JbmJ5dGVzID0gcmVhZF9zaXplX3QocSAtIDIqU1NUKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgICAlIiBQWV9GT1JNQVRfU0laRV9UICJ1IGJ5dGVzIG9yaWdpbmFsbHkgIgotCSAgICAgICAgICAgICAgICAicmVxdWVzdGVkXG4iLCBuYnl0ZXMpOworICAgIG5ieXRlcyA9IHJlYWRfc2l6ZV90KHEgLSAyKlNTVCk7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgJSIgUFlfRk9STUFUX1NJWkVfVCAidSBieXRlcyBvcmlnaW5hbGx5ICIKKyAgICAgICAgICAgICAgICAgICAgInJlcXVlc3RlZFxuIiwgbmJ5dGVzKTsKIAotCS8qIEluIGNhc2UgdGhpcyBpcyBudXRzLCBjaGVjayB0aGUgbGVhZGluZyBwYWQgYnl0ZXMgZmlyc3QuICovCi0JZnByaW50ZihzdGRlcnIsICIgICAgVGhlICVkIHBhZCBieXRlcyBhdCBwLSVkIGFyZSAiLCBTU1QtMSwgU1NULTEpOwotCW9rID0gMTsKLQlmb3IgKGkgPSAxOyBpIDw9IFNTVC0xOyArK2kpIHsKLQkJaWYgKCoocS1pKSAhPSBGT1JCSURERU5CWVRFKSB7Ci0JCQlvayA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAob2spCi0JCWZwdXRzKCJGT1JCSURERU5CWVRFLCBhcyBleHBlY3RlZC5cbiIsIHN0ZGVycik7Ci0JZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAibm90IGFsbCBGT1JCSURERU5CWVRFICgweCUwMngpOlxuIiwKLQkJCUZPUkJJRERFTkJZVEUpOwotCQlmb3IgKGkgPSBTU1QtMTsgaSA+PSAxOyAtLWkpIHsKLQkJCWNvbnN0IHVjaGFyIGJ5dGUgPSAqKHEtaSk7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgYXQgcC0lZDogMHglMDJ4IiwgaSwgYnl0ZSk7Ci0JCQlpZiAoYnl0ZSAhPSBGT1JCSURERU5CWVRFKQotCQkJCWZwdXRzKCIgKioqIE9VQ0giLCBzdGRlcnIpOwotCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKLQkJfQorICAgIC8qIEluIGNhc2UgdGhpcyBpcyBudXRzLCBjaGVjayB0aGUgbGVhZGluZyBwYWQgYnl0ZXMgZmlyc3QuICovCisgICAgZnByaW50ZihzdGRlcnIsICIgICAgVGhlICVkIHBhZCBieXRlcyBhdCBwLSVkIGFyZSAiLCBTU1QtMSwgU1NULTEpOworICAgIG9rID0gMTsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IFNTVC0xOyArK2kpIHsKKyAgICAgICAgaWYgKCoocS1pKSAhPSBGT1JCSURERU5CWVRFKSB7CisgICAgICAgICAgICBvayA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob2spCisgICAgICAgIGZwdXRzKCJGT1JCSURERU5CWVRFLCBhcyBleHBlY3RlZC5cbiIsIHN0ZGVycik7CisgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm90IGFsbCBGT1JCSURERU5CWVRFICgweCUwMngpOlxuIiwKKyAgICAgICAgICAgIEZPUkJJRERFTkJZVEUpOworICAgICAgICBmb3IgKGkgPSBTU1QtMTsgaSA+PSAxOyAtLWkpIHsKKyAgICAgICAgICAgIGNvbnN0IHVjaGFyIGJ5dGUgPSAqKHEtaSk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgYXQgcC0lZDogMHglMDJ4IiwgaSwgYnl0ZSk7CisgICAgICAgICAgICBpZiAoYnl0ZSAhPSBGT1JCSURERU5CWVRFKQorICAgICAgICAgICAgICAgIGZwdXRzKCIgKioqIE9VQ0giLCBzdGRlcnIpOworICAgICAgICAgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyAgICAgICAgfQogCi0JCWZwdXRzKCIgICAgQmVjYXVzZSBtZW1vcnkgaXMgY29ycnVwdGVkIGF0IHRoZSBzdGFydCwgdGhlICIKLQkJICAgICAgImNvdW50IG9mIGJ5dGVzIHJlcXVlc3RlZFxuIgotCQkgICAgICAiICAgICAgIG1heSBiZSBib2d1cywgYW5kIGNoZWNraW5nIHRoZSB0cmFpbGluZyBwYWQgIgotCQkgICAgICAiYnl0ZXMgbWF5IHNlZ2ZhdWx0LlxuIiwgc3RkZXJyKTsKLQl9CisgICAgICAgIGZwdXRzKCIgICAgQmVjYXVzZSBtZW1vcnkgaXMgY29ycnVwdGVkIGF0IHRoZSBzdGFydCwgdGhlICIKKyAgICAgICAgICAgICAgImNvdW50IG9mIGJ5dGVzIHJlcXVlc3RlZFxuIgorICAgICAgICAgICAgICAiICAgICAgIG1heSBiZSBib2d1cywgYW5kIGNoZWNraW5nIHRoZSB0cmFpbGluZyBwYWQgIgorICAgICAgICAgICAgICAiYnl0ZXMgbWF5IHNlZ2ZhdWx0LlxuIiwgc3RkZXJyKTsKKyAgICB9CiAKLQl0YWlsID0gcSArIG5ieXRlczsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgICBUaGUgJWQgcGFkIGJ5dGVzIGF0IHRhaWw9JXAgYXJlICIsIFNTVCwgdGFpbCk7Ci0Jb2sgPSAxOwotCWZvciAoaSA9IDA7IGkgPCBTU1Q7ICsraSkgewotCQlpZiAodGFpbFtpXSAhPSBGT1JCSURERU5CWVRFKSB7Ci0JCQlvayA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAob2spCi0JCWZwdXRzKCJGT1JCSURERU5CWVRFLCBhcyBleHBlY3RlZC5cbiIsIHN0ZGVycik7Ci0JZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAibm90IGFsbCBGT1JCSURERU5CWVRFICgweCUwMngpOlxuIiwKLQkJCUZPUkJJRERFTkJZVEUpOwotCQlmb3IgKGkgPSAwOyBpIDwgU1NUOyArK2kpIHsKLQkJCWNvbnN0IHVjaGFyIGJ5dGUgPSB0YWlsW2ldOwotCQkJZnByaW50ZihzdGRlcnIsICIgICAgICAgIGF0IHRhaWwrJWQ6IDB4JTAyeCIsCi0JCQkJaSwgYnl0ZSk7Ci0JCQlpZiAoYnl0ZSAhPSBGT1JCSURERU5CWVRFKQotCQkJCWZwdXRzKCIgKioqIE9VQ0giLCBzdGRlcnIpOwotCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKLQkJfQotCX0KKyAgICB0YWlsID0gcSArIG5ieXRlczsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICBUaGUgJWQgcGFkIGJ5dGVzIGF0IHRhaWw9JXAgYXJlICIsIFNTVCwgdGFpbCk7CisgICAgb2sgPSAxOworICAgIGZvciAoaSA9IDA7IGkgPCBTU1Q7ICsraSkgeworICAgICAgICBpZiAodGFpbFtpXSAhPSBGT1JCSURERU5CWVRFKSB7CisgICAgICAgICAgICBvayA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob2spCisgICAgICAgIGZwdXRzKCJGT1JCSURERU5CWVRFLCBhcyBleHBlY3RlZC5cbiIsIHN0ZGVycik7CisgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm90IGFsbCBGT1JCSURERU5CWVRFICgweCUwMngpOlxuIiwKKyAgICAgICAgICAgIEZPUkJJRERFTkJZVEUpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU1NUOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IHVjaGFyIGJ5dGUgPSB0YWlsW2ldOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgIGF0IHRhaWwrJWQ6IDB4JTAyeCIsCisgICAgICAgICAgICAgICAgaSwgYnl0ZSk7CisgICAgICAgICAgICBpZiAoYnl0ZSAhPSBGT1JCSURERU5CWVRFKQorICAgICAgICAgICAgICAgIGZwdXRzKCIgKioqIE9VQ0giLCBzdGRlcnIpOworICAgICAgICAgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyAgICAgICAgfQorICAgIH0KIAotCXNlcmlhbCA9IHJlYWRfc2l6ZV90KHRhaWwgKyBTU1QpOwotCWZwcmludGYoc3RkZXJyLCAiICAgIFRoZSBibG9jayB3YXMgbWFkZSBieSBjYWxsICMlIiBQWV9GT1JNQVRfU0laRV9UCi0JCQkidSB0byBkZWJ1ZyBtYWxsb2MvcmVhbGxvYy5cbiIsIHNlcmlhbCk7CisgICAgc2VyaWFsID0gcmVhZF9zaXplX3QodGFpbCArIFNTVCk7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgVGhlIGJsb2NrIHdhcyBtYWRlIGJ5IGNhbGwgIyUiIFBZX0ZPUk1BVF9TSVpFX1QKKyAgICAgICAgICAgICAgICAgICAgInUgdG8gZGVidWcgbWFsbG9jL3JlYWxsb2MuXG4iLCBzZXJpYWwpOwogCi0JaWYgKG5ieXRlcyA+IDApIHsKLQkJaSA9IDA7Ci0JCWZwdXRzKCIgICAgRGF0YSBhdCBwOiIsIHN0ZGVycik7Ci0JCS8qIHByaW50IHVwIHRvIDggYnl0ZXMgYXQgdGhlIHN0YXJ0ICovCi0JCXdoaWxlIChxIDwgdGFpbCAmJiBpIDwgOCkgewotCQkJZnByaW50ZihzdGRlcnIsICIgJTAyeCIsICpxKTsKLQkJCSsraTsKLQkJCSsrcTsKLQkJfQotCQkvKiBhbmQgdXAgdG8gOCBhdCB0aGUgZW5kICovCi0JCWlmIChxIDwgdGFpbCkgewotCQkJaWYgKHRhaWwgLSBxID4gOCkgewotCQkJCWZwdXRzKCIgLi4uIiwgc3RkZXJyKTsKLQkJCQlxID0gdGFpbCAtIDg7Ci0JCQl9Ci0JCQl3aGlsZSAocSA8IHRhaWwpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAlMDJ4IiwgKnEpOwotCQkJCSsrcTsKLQkJCX0KLQkJfQotCQlmcHV0YygnXG4nLCBzdGRlcnIpOwotCX0KKyAgICBpZiAobmJ5dGVzID4gMCkgeworICAgICAgICBpID0gMDsKKyAgICAgICAgZnB1dHMoIiAgICBEYXRhIGF0IHA6Iiwgc3RkZXJyKTsKKyAgICAgICAgLyogcHJpbnQgdXAgdG8gOCBieXRlcyBhdCB0aGUgc3RhcnQgKi8KKyAgICAgICAgd2hpbGUgKHEgPCB0YWlsICYmIGkgPCA4KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlMDJ4IiwgKnEpOworICAgICAgICAgICAgKytpOworICAgICAgICAgICAgKytxOworICAgICAgICB9CisgICAgICAgIC8qIGFuZCB1cCB0byA4IGF0IHRoZSBlbmQgKi8KKyAgICAgICAgaWYgKHEgPCB0YWlsKSB7CisgICAgICAgICAgICBpZiAodGFpbCAtIHEgPiA4KSB7CisgICAgICAgICAgICAgICAgZnB1dHMoIiAuLi4iLCBzdGRlcnIpOworICAgICAgICAgICAgICAgIHEgPSB0YWlsIC0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChxIDwgdGFpbCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICUwMngiLCAqcSk7CisgICAgICAgICAgICAgICAgKytxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CisgICAgfQogfQogCiBzdGF0aWMgc2l6ZV90CiBwcmludG9uZShjb25zdCBjaGFyKiBtc2csIHNpemVfdCB2YWx1ZSkKIHsKLQlpbnQgaSwgazsKLQljaGFyIGJ1ZlsxMDBdOwotCXNpemVfdCBvcmlndmFsdWUgPSB2YWx1ZTsKKyAgICBpbnQgaSwgazsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNpemVfdCBvcmlndmFsdWUgPSB2YWx1ZTsKIAotCWZwdXRzKG1zZywgc3RkZXJyKTsKLQlmb3IgKGkgPSAoaW50KXN0cmxlbihtc2cpOyBpIDwgMzU7ICsraSkKLQkJZnB1dGMoJyAnLCBzdGRlcnIpOwotCWZwdXRjKCc9Jywgc3RkZXJyKTsKKyAgICBmcHV0cyhtc2csIHN0ZGVycik7CisgICAgZm9yIChpID0gKGludClzdHJsZW4obXNnKTsgaSA8IDM1OyArK2kpCisgICAgICAgIGZwdXRjKCcgJywgc3RkZXJyKTsKKyAgICBmcHV0YygnPScsIHN0ZGVycik7CiAKLQkvKiBXcml0ZSB0aGUgdmFsdWUgd2l0aCBjb21tYXMuICovCi0JaSA9IDIyOwotCWJ1ZltpLS1dID0gJ1wwJzsKLQlidWZbaS0tXSA9ICdcbic7Ci0JayA9IDM7Ci0JZG8gewotCQlzaXplX3QgbmV4dHZhbHVlID0gdmFsdWUgLyAxMDsKLQkJdWludCBkaWdpdCA9ICh1aW50KSh2YWx1ZSAtIG5leHR2YWx1ZSAqIDEwKTsKLQkJdmFsdWUgPSBuZXh0dmFsdWU7Ci0JCWJ1ZltpLS1dID0gKGNoYXIpKGRpZ2l0ICsgJzAnKTsKLQkJLS1rOwotCQlpZiAoayA9PSAwICYmIHZhbHVlICYmIGkgPj0gMCkgewotCQkJayA9IDM7Ci0JCQlidWZbaS0tXSA9ICcsJzsKLQkJfQotCX0gd2hpbGUgKHZhbHVlICYmIGkgPj0gMCk7CisgICAgLyogV3JpdGUgdGhlIHZhbHVlIHdpdGggY29tbWFzLiAqLworICAgIGkgPSAyMjsKKyAgICBidWZbaS0tXSA9ICdcMCc7CisgICAgYnVmW2ktLV0gPSAnXG4nOworICAgIGsgPSAzOworICAgIGRvIHsKKyAgICAgICAgc2l6ZV90IG5leHR2YWx1ZSA9IHZhbHVlIC8gMTA7CisgICAgICAgIHVpbnQgZGlnaXQgPSAodWludCkodmFsdWUgLSBuZXh0dmFsdWUgKiAxMCk7CisgICAgICAgIHZhbHVlID0gbmV4dHZhbHVlOworICAgICAgICBidWZbaS0tXSA9IChjaGFyKShkaWdpdCArICcwJyk7CisgICAgICAgIC0tazsKKyAgICAgICAgaWYgKGsgPT0gMCAmJiB2YWx1ZSAmJiBpID49IDApIHsKKyAgICAgICAgICAgIGsgPSAzOworICAgICAgICAgICAgYnVmW2ktLV0gPSAnLCc7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICh2YWx1ZSAmJiBpID49IDApOwogCi0Jd2hpbGUgKGkgPj0gMCkKLQkJYnVmW2ktLV0gPSAnICc7Ci0JZnB1dHMoYnVmLCBzdGRlcnIpOworICAgIHdoaWxlIChpID49IDApCisgICAgICAgIGJ1ZltpLS1dID0gJyAnOworICAgIGZwdXRzKGJ1Ziwgc3RkZXJyKTsKIAotCXJldHVybiBvcmlndmFsdWU7CisgICAgcmV0dXJuIG9yaWd2YWx1ZTsKIH0KIAogLyogUHJpbnQgc3VtbWFyeSBpbmZvIHRvIHN0ZGVyciBhYm91dCB0aGUgc3RhdGUgb2YgcHltYWxsb2MncyBzdHJ1Y3R1cmVzLgpAQCAtMTcyMywxNDAgKzE3MjMsMTQwIEBACiB2b2lkCiBfUHlPYmplY3RfRGVidWdNYWxsb2NTdGF0cyh2b2lkKQogewotCXVpbnQgaTsKLQljb25zdCB1aW50IG51bWNsYXNzZXMgPSBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCA+PiBBTElHTk1FTlRfU0hJRlQ7Ci0JLyogIyBvZiBwb29scywgYWxsb2NhdGVkIGJsb2NrcywgYW5kIGZyZWUgYmxvY2tzIHBlciBjbGFzcyBpbmRleCAqLwotCXNpemVfdCBudW1wb29sc1tTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCA+PiBBTElHTk1FTlRfU0hJRlRdOwotCXNpemVfdCBudW1ibG9ja3NbU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPj4gQUxJR05NRU5UX1NISUZUXTsKLQlzaXplX3QgbnVtZnJlZWJsb2Nrc1tTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCA+PiBBTElHTk1FTlRfU0hJRlRdOwotCS8qIHRvdGFsICMgb2YgYWxsb2NhdGVkIGJ5dGVzIGluIHVzZWQgYW5kIGZ1bGwgcG9vbHMgKi8KLQlzaXplX3QgYWxsb2NhdGVkX2J5dGVzID0gMDsKLQkvKiB0b3RhbCAjIG9mIGF2YWlsYWJsZSBieXRlcyBpbiB1c2VkIHBvb2xzICovCi0Jc2l6ZV90IGF2YWlsYWJsZV9ieXRlcyA9IDA7Ci0JLyogIyBvZiBmcmVlIHBvb2xzICsgcG9vbHMgbm90IHlldCBjYXJ2ZWQgb3V0IG9mIGN1cnJlbnQgYXJlbmEgKi8KLQl1aW50IG51bWZyZWVwb29scyA9IDA7Ci0JLyogIyBvZiBieXRlcyBmb3IgYXJlbmEgYWxpZ25tZW50IHBhZGRpbmcgKi8KLQlzaXplX3QgYXJlbmFfYWxpZ25tZW50ID0gMDsKLQkvKiAjIG9mIGJ5dGVzIGluIHVzZWQgYW5kIGZ1bGwgcG9vbHMgdXNlZCBmb3IgcG9vbF9oZWFkZXJzICovCi0Jc2l6ZV90IHBvb2xfaGVhZGVyX2J5dGVzID0gMDsKLQkvKiAjIG9mIGJ5dGVzIGluIHVzZWQgYW5kIGZ1bGwgcG9vbHMgd2FzdGVkIGR1ZSB0byBxdWFudGl6YXRpb24sCi0JICogaS5lLiB0aGUgbmVjZXNzYXJpbHkgbGVmdG92ZXIgc3BhY2UgYXQgdGhlIGVuZHMgb2YgdXNlZCBhbmQKLQkgKiBmdWxsIHBvb2xzLgotCSAqLwotCXNpemVfdCBxdWFudGl6YXRpb24gPSAwOwotCS8qICMgb2YgYXJlbmFzIGFjdHVhbGx5IGFsbG9jYXRlZC4gKi8KLQlzaXplX3QgbmFyZW5hcyA9IDA7Ci0JLyogcnVubmluZyB0b3RhbCAtLSBzaG91bGQgZXF1YWwgbmFyZW5hcyAqIEFSRU5BX1NJWkUgKi8KLQlzaXplX3QgdG90YWw7Ci0JY2hhciBidWZbMTI4XTsKKyAgICB1aW50IGk7CisgICAgY29uc3QgdWludCBudW1jbGFzc2VzID0gU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPj4gQUxJR05NRU5UX1NISUZUOworICAgIC8qICMgb2YgcG9vbHMsIGFsbG9jYXRlZCBibG9ja3MsIGFuZCBmcmVlIGJsb2NrcyBwZXIgY2xhc3MgaW5kZXggKi8KKyAgICBzaXplX3QgbnVtcG9vbHNbU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPj4gQUxJR05NRU5UX1NISUZUXTsKKyAgICBzaXplX3QgbnVtYmxvY2tzW1NNQUxMX1JFUVVFU1RfVEhSRVNIT0xEID4+IEFMSUdOTUVOVF9TSElGVF07CisgICAgc2l6ZV90IG51bWZyZWVibG9ja3NbU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPj4gQUxJR05NRU5UX1NISUZUXTsKKyAgICAvKiB0b3RhbCAjIG9mIGFsbG9jYXRlZCBieXRlcyBpbiB1c2VkIGFuZCBmdWxsIHBvb2xzICovCisgICAgc2l6ZV90IGFsbG9jYXRlZF9ieXRlcyA9IDA7CisgICAgLyogdG90YWwgIyBvZiBhdmFpbGFibGUgYnl0ZXMgaW4gdXNlZCBwb29scyAqLworICAgIHNpemVfdCBhdmFpbGFibGVfYnl0ZXMgPSAwOworICAgIC8qICMgb2YgZnJlZSBwb29scyArIHBvb2xzIG5vdCB5ZXQgY2FydmVkIG91dCBvZiBjdXJyZW50IGFyZW5hICovCisgICAgdWludCBudW1mcmVlcG9vbHMgPSAwOworICAgIC8qICMgb2YgYnl0ZXMgZm9yIGFyZW5hIGFsaWdubWVudCBwYWRkaW5nICovCisgICAgc2l6ZV90IGFyZW5hX2FsaWdubWVudCA9IDA7CisgICAgLyogIyBvZiBieXRlcyBpbiB1c2VkIGFuZCBmdWxsIHBvb2xzIHVzZWQgZm9yIHBvb2xfaGVhZGVycyAqLworICAgIHNpemVfdCBwb29sX2hlYWRlcl9ieXRlcyA9IDA7CisgICAgLyogIyBvZiBieXRlcyBpbiB1c2VkIGFuZCBmdWxsIHBvb2xzIHdhc3RlZCBkdWUgdG8gcXVhbnRpemF0aW9uLAorICAgICAqIGkuZS4gdGhlIG5lY2Vzc2FyaWx5IGxlZnRvdmVyIHNwYWNlIGF0IHRoZSBlbmRzIG9mIHVzZWQgYW5kCisgICAgICogZnVsbCBwb29scy4KKyAgICAgKi8KKyAgICBzaXplX3QgcXVhbnRpemF0aW9uID0gMDsKKyAgICAvKiAjIG9mIGFyZW5hcyBhY3R1YWxseSBhbGxvY2F0ZWQuICovCisgICAgc2l6ZV90IG5hcmVuYXMgPSAwOworICAgIC8qIHJ1bm5pbmcgdG90YWwgLS0gc2hvdWxkIGVxdWFsIG5hcmVuYXMgKiBBUkVOQV9TSVpFICovCisgICAgc2l6ZV90IHRvdGFsOworICAgIGNoYXIgYnVmWzEyOF07CiAKLQlmcHJpbnRmKHN0ZGVyciwgIlNtYWxsIGJsb2NrIHRocmVzaG9sZCA9ICVkLCBpbiAldSBzaXplIGNsYXNzZXMuXG4iLAotCQlTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCwgbnVtY2xhc3Nlcyk7CisgICAgZnByaW50ZihzdGRlcnIsICJTbWFsbCBibG9jayB0aHJlc2hvbGQgPSAlZCwgaW4gJXUgc2l6ZSBjbGFzc2VzLlxuIiwKKyAgICAgICAgU01BTExfUkVRVUVTVF9USFJFU0hPTEQsIG51bWNsYXNzZXMpOwogCi0JZm9yIChpID0gMDsgaSA8IG51bWNsYXNzZXM7ICsraSkKLQkJbnVtcG9vbHNbaV0gPSBudW1ibG9ja3NbaV0gPSBudW1mcmVlYmxvY2tzW2ldID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtY2xhc3NlczsgKytpKQorICAgICAgICBudW1wb29sc1tpXSA9IG51bWJsb2Nrc1tpXSA9IG51bWZyZWVibG9ja3NbaV0gPSAwOwogCi0JLyogQmVjYXVzZSBmdWxsIHBvb2xzIGFyZW4ndCBsaW5rZWQgdG8gZnJvbSBhbnl0aGluZywgaXQncyBlYXNpZXN0Ci0JICogdG8gbWFyY2ggb3ZlciBhbGwgdGhlIGFyZW5hcy4gIElmIHdlJ3JlIGx1Y2t5LCBtb3N0IG9mIHRoZSBtZW1vcnkKLQkgKiB3aWxsIGJlIGxpdmluZyBpbiBmdWxsIHBvb2xzIC0tIHdvdWxkIGJlIGEgc2hhbWUgdG8gbWlzcyB0aGVtLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBtYXhhcmVuYXM7ICsraSkgewotCQl1aW50IGo7Ci0JCXVwdHIgYmFzZSA9IGFyZW5hc1tpXS5hZGRyZXNzOworICAgIC8qIEJlY2F1c2UgZnVsbCBwb29scyBhcmVuJ3QgbGlua2VkIHRvIGZyb20gYW55dGhpbmcsIGl0J3MgZWFzaWVzdAorICAgICAqIHRvIG1hcmNoIG92ZXIgYWxsIHRoZSBhcmVuYXMuICBJZiB3ZSdyZSBsdWNreSwgbW9zdCBvZiB0aGUgbWVtb3J5CisgICAgICogd2lsbCBiZSBsaXZpbmcgaW4gZnVsbCBwb29scyAtLSB3b3VsZCBiZSBhIHNoYW1lIHRvIG1pc3MgdGhlbS4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4YXJlbmFzOyArK2kpIHsKKyAgICAgICAgdWludCBqOworICAgICAgICB1cHRyIGJhc2UgPSBhcmVuYXNbaV0uYWRkcmVzczsKIAotCQkvKiBTa2lwIGFyZW5hcyB3aGljaCBhcmUgbm90IGFsbG9jYXRlZC4gKi8KLQkJaWYgKGFyZW5hc1tpXS5hZGRyZXNzID09ICh1cHRyKU5VTEwpCi0JCQljb250aW51ZTsKLQkJbmFyZW5hcyArPSAxOworICAgICAgICAvKiBTa2lwIGFyZW5hcyB3aGljaCBhcmUgbm90IGFsbG9jYXRlZC4gKi8KKyAgICAgICAgaWYgKGFyZW5hc1tpXS5hZGRyZXNzID09ICh1cHRyKU5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbmFyZW5hcyArPSAxOwogCi0JCW51bWZyZWVwb29scyArPSBhcmVuYXNbaV0ubmZyZWVwb29sczsKKyAgICAgICAgbnVtZnJlZXBvb2xzICs9IGFyZW5hc1tpXS5uZnJlZXBvb2xzOwogCi0JCS8qIHJvdW5kIHVwIHRvIHBvb2wgYWxpZ25tZW50ICovCi0JCWlmIChiYXNlICYgKHVwdHIpUE9PTF9TSVpFX01BU0spIHsKLQkJCWFyZW5hX2FsaWdubWVudCArPSBQT09MX1NJWkU7Ci0JCQliYXNlICY9IH4odXB0cilQT09MX1NJWkVfTUFTSzsKLQkJCWJhc2UgKz0gUE9PTF9TSVpFOwotCQl9CisgICAgICAgIC8qIHJvdW5kIHVwIHRvIHBvb2wgYWxpZ25tZW50ICovCisgICAgICAgIGlmIChiYXNlICYgKHVwdHIpUE9PTF9TSVpFX01BU0spIHsKKyAgICAgICAgICAgIGFyZW5hX2FsaWdubWVudCArPSBQT09MX1NJWkU7CisgICAgICAgICAgICBiYXNlICY9IH4odXB0cilQT09MX1NJWkVfTUFTSzsKKyAgICAgICAgICAgIGJhc2UgKz0gUE9PTF9TSVpFOworICAgICAgICB9CiAKLQkJLyogdmlzaXQgZXZlcnkgcG9vbCBpbiB0aGUgYXJlbmEgKi8KLQkJYXNzZXJ0KGJhc2UgPD0gKHVwdHIpIGFyZW5hc1tpXS5wb29sX2FkZHJlc3MpOwotCQlmb3IgKGogPSAwOwotCQkJICAgIGJhc2UgPCAodXB0cikgYXJlbmFzW2ldLnBvb2xfYWRkcmVzczsKLQkJCSAgICArK2osIGJhc2UgKz0gUE9PTF9TSVpFKSB7Ci0JCQlwb29scCBwID0gKHBvb2xwKWJhc2U7Ci0JCQljb25zdCB1aW50IHN6ID0gcC0+c3ppZHg7Ci0JCQl1aW50IGZyZWVibG9ja3M7CisgICAgICAgIC8qIHZpc2l0IGV2ZXJ5IHBvb2wgaW4gdGhlIGFyZW5hICovCisgICAgICAgIGFzc2VydChiYXNlIDw9ICh1cHRyKSBhcmVuYXNbaV0ucG9vbF9hZGRyZXNzKTsKKyAgICAgICAgZm9yIChqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYmFzZSA8ICh1cHRyKSBhcmVuYXNbaV0ucG9vbF9hZGRyZXNzOworICAgICAgICAgICAgICAgICAgICArK2osIGJhc2UgKz0gUE9PTF9TSVpFKSB7CisgICAgICAgICAgICBwb29scCBwID0gKHBvb2xwKWJhc2U7CisgICAgICAgICAgICBjb25zdCB1aW50IHN6ID0gcC0+c3ppZHg7CisgICAgICAgICAgICB1aW50IGZyZWVibG9ja3M7CiAKLQkJCWlmIChwLT5yZWYuY291bnQgPT0gMCkgewotCQkJCS8qIGN1cnJlbnRseSB1bnVzZWQgKi8KLQkJCQlhc3NlcnQocG9vbF9pc19pbl9saXN0KHAsIGFyZW5hc1tpXS5mcmVlcG9vbHMpKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCSsrbnVtcG9vbHNbc3pdOwotCQkJbnVtYmxvY2tzW3N6XSArPSBwLT5yZWYuY291bnQ7Ci0JCQlmcmVlYmxvY2tzID0gTlVNQkxPQ0tTKHN6KSAtIHAtPnJlZi5jb3VudDsKLQkJCW51bWZyZWVibG9ja3Nbc3pdICs9IGZyZWVibG9ja3M7CisgICAgICAgICAgICBpZiAocC0+cmVmLmNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBjdXJyZW50bHkgdW51c2VkICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KHBvb2xfaXNfaW5fbGlzdChwLCBhcmVuYXNbaV0uZnJlZXBvb2xzKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK251bXBvb2xzW3N6XTsKKyAgICAgICAgICAgIG51bWJsb2Nrc1tzel0gKz0gcC0+cmVmLmNvdW50OworICAgICAgICAgICAgZnJlZWJsb2NrcyA9IE5VTUJMT0NLUyhzeikgLSBwLT5yZWYuY291bnQ7CisgICAgICAgICAgICBudW1mcmVlYmxvY2tzW3N6XSArPSBmcmVlYmxvY2tzOwogI2lmZGVmIFB5X0RFQlVHCi0JCQlpZiAoZnJlZWJsb2NrcyA+IDApCi0JCQkJYXNzZXJ0KHBvb2xfaXNfaW5fbGlzdChwLCB1c2VkcG9vbHNbc3ogKyBzel0pKTsKKyAgICAgICAgICAgIGlmIChmcmVlYmxvY2tzID4gMCkKKyAgICAgICAgICAgICAgICBhc3NlcnQocG9vbF9pc19pbl9saXN0KHAsIHVzZWRwb29sc1tzeiArIHN6XSkpOwogI2VuZGlmCi0JCX0KLQl9Ci0JYXNzZXJ0KG5hcmVuYXMgPT0gbmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQobmFyZW5hcyA9PSBuYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQpOwogCi0JZnB1dGMoJ1xuJywgc3RkZXJyKTsKLQlmcHV0cygiY2xhc3MgICBzaXplICAgbnVtIHBvb2xzICAgYmxvY2tzIGluIHVzZSAgYXZhaWwgYmxvY2tzXG4iCi0JICAgICAgIi0tLS0tICAgLS0tLSAgIC0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLVxuIiwKLQkJc3RkZXJyKTsKKyAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworICAgIGZwdXRzKCJjbGFzcyAgIHNpemUgICBudW0gcG9vbHMgICBibG9ja3MgaW4gdXNlICBhdmFpbCBibG9ja3NcbiIKKyAgICAgICAgICAiLS0tLS0gICAtLS0tICAgLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tXG4iLAorICAgICAgICBzdGRlcnIpOwogCi0JZm9yIChpID0gMDsgaSA8IG51bWNsYXNzZXM7ICsraSkgewotCQlzaXplX3QgcCA9IG51bXBvb2xzW2ldOwotCQlzaXplX3QgYiA9IG51bWJsb2Nrc1tpXTsKLQkJc2l6ZV90IGYgPSBudW1mcmVlYmxvY2tzW2ldOwotCQl1aW50IHNpemUgPSBJTkRFWDJTSVpFKGkpOwotCQlpZiAocCA9PSAwKSB7Ci0JCQlhc3NlcnQoYiA9PSAwICYmIGYgPT0gMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmcHJpbnRmKHN0ZGVyciwgIiU1dSAlNnUgIgotCQkJCSIlMTEiIFBZX0ZPUk1BVF9TSVpFX1QgInUgIgotCQkJCSIlMTUiIFBZX0ZPUk1BVF9TSVpFX1QgInUgIgotCQkJCSIlMTMiIFBZX0ZPUk1BVF9TSVpFX1QgInVcbiIsCi0JCQlpLCBzaXplLCBwLCBiLCBmKTsKLQkJYWxsb2NhdGVkX2J5dGVzICs9IGIgKiBzaXplOwotCQlhdmFpbGFibGVfYnl0ZXMgKz0gZiAqIHNpemU7Ci0JCXBvb2xfaGVhZGVyX2J5dGVzICs9IHAgKiBQT09MX09WRVJIRUFEOwotCQlxdWFudGl6YXRpb24gKz0gcCAqICgoUE9PTF9TSVpFIC0gUE9PTF9PVkVSSEVBRCkgJSBzaXplKTsKLQl9Ci0JZnB1dGMoJ1xuJywgc3RkZXJyKTsKLQkodm9pZClwcmludG9uZSgiIyB0aW1lcyBvYmplY3QgbWFsbG9jIGNhbGxlZCIsIHNlcmlhbG5vKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtY2xhc3NlczsgKytpKSB7CisgICAgICAgIHNpemVfdCBwID0gbnVtcG9vbHNbaV07CisgICAgICAgIHNpemVfdCBiID0gbnVtYmxvY2tzW2ldOworICAgICAgICBzaXplX3QgZiA9IG51bWZyZWVibG9ja3NbaV07CisgICAgICAgIHVpbnQgc2l6ZSA9IElOREVYMlNJWkUoaSk7CisgICAgICAgIGlmIChwID09IDApIHsKKyAgICAgICAgICAgIGFzc2VydChiID09IDAgJiYgZiA9PSAwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJTV1ICU2dSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTExIiBQWV9GT1JNQVRfU0laRV9UICJ1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMTUiIFBZX0ZPUk1BVF9TSVpFX1QgInUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiUxMyIgUFlfRk9STUFUX1NJWkVfVCAidVxuIiwKKyAgICAgICAgICAgIGksIHNpemUsIHAsIGIsIGYpOworICAgICAgICBhbGxvY2F0ZWRfYnl0ZXMgKz0gYiAqIHNpemU7CisgICAgICAgIGF2YWlsYWJsZV9ieXRlcyArPSBmICogc2l6ZTsKKyAgICAgICAgcG9vbF9oZWFkZXJfYnl0ZXMgKz0gcCAqIFBPT0xfT1ZFUkhFQUQ7CisgICAgICAgIHF1YW50aXphdGlvbiArPSBwICogKChQT09MX1NJWkUgLSBQT09MX09WRVJIRUFEKSAlIHNpemUpOworICAgIH0KKyAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworICAgICh2b2lkKXByaW50b25lKCIjIHRpbWVzIG9iamVjdCBtYWxsb2MgY2FsbGVkIiwgc2VyaWFsbm8pOwogCi0JKHZvaWQpcHJpbnRvbmUoIiMgYXJlbmFzIGFsbG9jYXRlZCB0b3RhbCIsIG50aW1lc19hcmVuYV9hbGxvY2F0ZWQpOwotCSh2b2lkKXByaW50b25lKCIjIGFyZW5hcyByZWNsYWltZWQiLCBudGltZXNfYXJlbmFfYWxsb2NhdGVkIC0gbmFyZW5hcyk7Ci0JKHZvaWQpcHJpbnRvbmUoIiMgYXJlbmFzIGhpZ2h3YXRlciBtYXJrIiwgbmFyZW5hc19oaWdod2F0ZXIpOwotCSh2b2lkKXByaW50b25lKCIjIGFyZW5hcyBhbGxvY2F0ZWQgY3VycmVudCIsIG5hcmVuYXMpOworICAgICh2b2lkKXByaW50b25lKCIjIGFyZW5hcyBhbGxvY2F0ZWQgdG90YWwiLCBudGltZXNfYXJlbmFfYWxsb2NhdGVkKTsKKyAgICAodm9pZClwcmludG9uZSgiIyBhcmVuYXMgcmVjbGFpbWVkIiwgbnRpbWVzX2FyZW5hX2FsbG9jYXRlZCAtIG5hcmVuYXMpOworICAgICh2b2lkKXByaW50b25lKCIjIGFyZW5hcyBoaWdod2F0ZXIgbWFyayIsIG5hcmVuYXNfaGlnaHdhdGVyKTsKKyAgICAodm9pZClwcmludG9uZSgiIyBhcmVuYXMgYWxsb2NhdGVkIGN1cnJlbnQiLCBuYXJlbmFzKTsKIAotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJIiUiIFBZX0ZPUk1BVF9TSVpFX1QgInUgYXJlbmFzICogJWQgYnl0ZXMvYXJlbmEiLAotCQluYXJlbmFzLCBBUkVOQV9TSVpFKTsKLQkodm9pZClwcmludG9uZShidWYsIG5hcmVuYXMgKiBBUkVOQV9TSVpFKTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJ1IGFyZW5hcyAqICVkIGJ5dGVzL2FyZW5hIiwKKyAgICAgICAgbmFyZW5hcywgQVJFTkFfU0laRSk7CisgICAgKHZvaWQpcHJpbnRvbmUoYnVmLCBuYXJlbmFzICogQVJFTkFfU0laRSk7CiAKLQlmcHV0YygnXG4nLCBzdGRlcnIpOworICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CiAKLQl0b3RhbCA9IHByaW50b25lKCIjIGJ5dGVzIGluIGFsbG9jYXRlZCBibG9ja3MiLCBhbGxvY2F0ZWRfYnl0ZXMpOwotCXRvdGFsICs9IHByaW50b25lKCIjIGJ5dGVzIGluIGF2YWlsYWJsZSBibG9ja3MiLCBhdmFpbGFibGVfYnl0ZXMpOworICAgIHRvdGFsID0gcHJpbnRvbmUoIiMgYnl0ZXMgaW4gYWxsb2NhdGVkIGJsb2NrcyIsIGFsbG9jYXRlZF9ieXRlcyk7CisgICAgdG90YWwgKz0gcHJpbnRvbmUoIiMgYnl0ZXMgaW4gYXZhaWxhYmxlIGJsb2NrcyIsIGF2YWlsYWJsZV9ieXRlcyk7CiAKLQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSIldSB1bnVzZWQgcG9vbHMgKiAlZCBieXRlcyIsIG51bWZyZWVwb29scywgUE9PTF9TSVpFKTsKLQl0b3RhbCArPSBwcmludG9uZShidWYsIChzaXplX3QpbnVtZnJlZXBvb2xzICogUE9PTF9TSVpFKTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICIldSB1bnVzZWQgcG9vbHMgKiAlZCBieXRlcyIsIG51bWZyZWVwb29scywgUE9PTF9TSVpFKTsKKyAgICB0b3RhbCArPSBwcmludG9uZShidWYsIChzaXplX3QpbnVtZnJlZXBvb2xzICogUE9PTF9TSVpFKTsKIAotCXRvdGFsICs9IHByaW50b25lKCIjIGJ5dGVzIGxvc3QgdG8gcG9vbCBoZWFkZXJzIiwgcG9vbF9oZWFkZXJfYnl0ZXMpOwotCXRvdGFsICs9IHByaW50b25lKCIjIGJ5dGVzIGxvc3QgdG8gcXVhbnRpemF0aW9uIiwgcXVhbnRpemF0aW9uKTsKLQl0b3RhbCArPSBwcmludG9uZSgiIyBieXRlcyBsb3N0IHRvIGFyZW5hIGFsaWdubWVudCIsIGFyZW5hX2FsaWdubWVudCk7Ci0JKHZvaWQpcHJpbnRvbmUoIlRvdGFsIiwgdG90YWwpOworICAgIHRvdGFsICs9IHByaW50b25lKCIjIGJ5dGVzIGxvc3QgdG8gcG9vbCBoZWFkZXJzIiwgcG9vbF9oZWFkZXJfYnl0ZXMpOworICAgIHRvdGFsICs9IHByaW50b25lKCIjIGJ5dGVzIGxvc3QgdG8gcXVhbnRpemF0aW9uIiwgcXVhbnRpemF0aW9uKTsKKyAgICB0b3RhbCArPSBwcmludG9uZSgiIyBieXRlcyBsb3N0IHRvIGFyZW5hIGFsaWdubWVudCIsIGFyZW5hX2FsaWdubWVudCk7CisgICAgKHZvaWQpcHJpbnRvbmUoIlRvdGFsIiwgdG90YWwpOwogfQogCi0jZW5kaWYJLyogUFlNQUxMT0NfREVCVUcgKi8KKyNlbmRpZiAgLyogUFlNQUxMT0NfREVCVUcgKi8KIAogI2lmZGVmIFB5X1VTSU5HX01FTU9SWV9ERUJVR0dFUgogLyogTWFrZSB0aGlzIGZ1bmN0aW9uIGxhc3Qgc28gZ2NjIHdvbid0IGlubGluZSBpdCBzaW5jZSB0aGUgZGVmaW5pdGlvbiBpcwpAQCAtMTg2NSw4ICsxODY1LDggQEAKIGludAogUHlfQUREUkVTU19JTl9SQU5HRSh2b2lkICpQLCBwb29scCBwb29sKQogewotCXJldHVybiBwb29sLT5hcmVuYWluZGV4IDwgbWF4YXJlbmFzICYmCi0JICAgICAgICh1cHRyKVAgLSBhcmVuYXNbcG9vbC0+YXJlbmFpbmRleF0uYWRkcmVzcyA8ICh1cHRyKUFSRU5BX1NJWkUgJiYKLQkgICAgICAgYXJlbmFzW3Bvb2wtPmFyZW5haW5kZXhdLmFkZHJlc3MgIT0gMDsKKyAgICByZXR1cm4gcG9vbC0+YXJlbmFpbmRleCA8IG1heGFyZW5hcyAmJgorICAgICAgICAgICAodXB0cilQIC0gYXJlbmFzW3Bvb2wtPmFyZW5haW5kZXhdLmFkZHJlc3MgPCAodXB0cilBUkVOQV9TSVpFICYmCisgICAgICAgICAgIGFyZW5hc1twb29sLT5hcmVuYWluZGV4XS5hZGRyZXNzICE9IDA7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL09iamVjdHMvcmFuZ2VvYmplY3QuYyBiL09iamVjdHMvcmFuZ2VvYmplY3QuYwppbmRleCBmNDViNzcxLi40ZTY0ZGJhIDEwMDY0NAotLS0gYS9PYmplY3RzL3Jhbmdlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9yYW5nZW9iamVjdC5jCkBAIC0zLDEwICszLDEwIEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JbG9uZwlzdGFydDsKLQlsb25nCXN0ZXA7Ci0JbG9uZwlsZW47CisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgICAgICAgIHN0YXJ0OworICAgIGxvbmcgICAgICAgIHN0ZXA7CisgICAgbG9uZyAgICAgICAgbGVuOwogfSByYW5nZW9iamVjdDsKIAogLyogUmV0dXJuIG51bWJlciBvZiBpdGVtcyBpbiByYW5nZSAobG8sIGhpLCBzdGVwKS4gIHN0ZXAgIT0gMApAQCAtMzAsNTMgKzMwLDUzIEBACiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICBhc3NlcnQoc3RlcCAhPSAwKTsKICAgICBpZiAoc3RlcCA+IDAgJiYgbG8gPCBoaSkKLSAgICAgICAgcmV0dXJuIDFVTCArIChoaSAtIDFVTCAtIGxvKSAvIHN0ZXA7CisgICAgcmV0dXJuIDFVTCArIChoaSAtIDFVTCAtIGxvKSAvIHN0ZXA7CiAgICAgZWxzZSBpZiAoc3RlcCA8IDAgJiYgbG8gPiBoaSkKLSAgICAgICAgcmV0dXJuIDFVTCArIChsbyAtIDFVTCAtIGhpKSAvICgwVUwgLSBzdGVwKTsKKyAgICByZXR1cm4gMVVMICsgKGxvIC0gMVVMIC0gaGkpIC8gKDBVTCAtIHN0ZXApOwogICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDBVTDsKKyAgICByZXR1cm4gMFVMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZ2VfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlyYW5nZW9iamVjdCAqb2JqOwotCWxvbmcgaWxvdyA9IDAsIGloaWdoID0gMCwgaXN0ZXAgPSAxOwotCXVuc2lnbmVkIGxvbmcgbjsKKyAgICByYW5nZW9iamVjdCAqb2JqOworICAgIGxvbmcgaWxvdyA9IDAsIGloaWdoID0gMCwgaXN0ZXAgPSAxOworICAgIHVuc2lnbmVkIGxvbmcgbjsKIAotCWlmICghX1B5QXJnX05vS2V5d29yZHMoInhyYW5nZSgpIiwga3cpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJ4cmFuZ2UoKSIsIGt3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpIDw9IDEpIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkJImw7eHJhbmdlKCkgcmVxdWlyZXMgMS0zIGludCBhcmd1bWVudHMiLAotCQkJCSZpaGlnaCkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAotCQkJCSJsbHxsO3hyYW5nZSgpIHJlcXVpcmVzIDEtMyBpbnQgYXJndW1lbnRzIiwKLQkJCQkmaWxvdywgJmloaWdoLCAmaXN0ZXApKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChpc3RlcCA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAieHJhbmdlKCkgYXJnIDMgbXVzdCBub3QgYmUgemVybyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbiA9IGdldF9sZW5fb2ZfcmFuZ2UoaWxvdywgaWhpZ2gsIGlzdGVwKTsKLQlpZiAobiA+ICh1bnNpZ25lZCBsb25nKUxPTkdfTUFYIHx8IChsb25nKW4gPiBQWV9TU0laRV9UX01BWCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkieHJhbmdlKCkgcmVzdWx0IGhhcyB0b28gbWFueSBpdGVtcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA8PSAxKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgImw7eHJhbmdlKCkgcmVxdWlyZXMgMS0zIGludCBhcmd1bWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgJmloaWdoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAibGx8bDt4cmFuZ2UoKSByZXF1aXJlcyAxLTMgaW50IGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAmaWxvdywgJmloaWdoLCAmaXN0ZXApKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpc3RlcCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAieHJhbmdlKCkgYXJnIDMgbXVzdCBub3QgYmUgemVybyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbiA9IGdldF9sZW5fb2ZfcmFuZ2UoaWxvdywgaWhpZ2gsIGlzdGVwKTsKKyAgICBpZiAobiA+ICh1bnNpZ25lZCBsb25nKUxPTkdfTUFYIHx8IChsb25nKW4gPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ4cmFuZ2UoKSByZXN1bHQgaGFzIHRvbyBtYW55IGl0ZW1zIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW9iaiA9IFB5T2JqZWN0X05ldyhyYW5nZW9iamVjdCwgJlB5UmFuZ2VfVHlwZSk7Ci0JaWYgKG9iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlvYmotPnN0YXJ0ID0gaWxvdzsKLQlvYmotPmxlbiAgID0gKGxvbmcpbjsKLQlvYmotPnN0ZXAgID0gaXN0ZXA7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBvYmo7CisgICAgb2JqID0gUHlPYmplY3RfTmV3KHJhbmdlb2JqZWN0LCAmUHlSYW5nZV9UeXBlKTsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9iai0+c3RhcnQgPSBpbG93OworICAgIG9iai0+bGVuICAgPSAobG9uZyluOworICAgIG9iai0+c3RlcCAgPSBpc3RlcDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9iajsKIH0KIAogUHlEb2NfU1RSVkFSKHJhbmdlX2RvYywKQEAgLTg5LDYwICs4OSw2MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmdlX2l0ZW0ocmFuZ2VvYmplY3QgKnIsIFB5X3NzaXplX3QgaSkKIHsKLQlpZiAoaSA8IDAgfHwgaSA+PSByLT5sZW4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJInhyYW5nZSBvYmplY3QgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBkbyBjYWxjdWxhdGlvbiBlbnRpcmVseSB1c2luZyB1bnNpZ25lZCBsb25ncywgdG8gYXZvaWQKLQkgICB1bmRlZmluZWQgYmVoYXZpb3VyIGR1ZSB0byBzaWduZWQgb3ZlcmZsb3cuICovCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKShyLT5zdGFydCArICh1bnNpZ25lZCBsb25nKWkgKiByLT5zdGVwKSk7CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gci0+bGVuKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInhyYW5nZSBvYmplY3QgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBkbyBjYWxjdWxhdGlvbiBlbnRpcmVseSB1c2luZyB1bnNpZ25lZCBsb25ncywgdG8gYXZvaWQKKyAgICAgICB1bmRlZmluZWQgYmVoYXZpb3VyIGR1ZSB0byBzaWduZWQgb3ZlcmZsb3cuICovCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKShyLT5zdGFydCArICh1bnNpZ25lZCBsb25nKWkgKiByLT5zdGVwKSk7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiByYW5nZV9sZW5ndGgocmFuZ2VvYmplY3QgKnIpCiB7Ci0JcmV0dXJuIChQeV9zc2l6ZV90KShyLT5sZW4pOworICAgIHJldHVybiAoUHlfc3NpemVfdCkoci0+bGVuKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmdlX3JlcHIocmFuZ2VvYmplY3QgKnIpCiB7Ci0JUHlPYmplY3QgKnJ0bjsKKyAgICBQeU9iamVjdCAqcnRuOwogCi0JaWYgKHItPnN0YXJ0ID09IDAgJiYgci0+c3RlcCA9PSAxKQotCQlydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJ4cmFuZ2UoJWxkKSIsCi0JCQkJCSAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwKTsKKyAgICBpZiAoci0+c3RhcnQgPT0gMCAmJiByLT5zdGVwID09IDEpCisgICAgICAgIHJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInhyYW5nZSglbGQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zdGFydCArIHItPmxlbiAqIHItPnN0ZXApOwogCi0JZWxzZSBpZiAoci0+c3RlcCA9PSAxKQotCQlydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJ4cmFuZ2UoJWxkLCAlbGQpIiwKLQkJCQkJICByLT5zdGFydCwKLQkJCQkJICByLT5zdGFydCArIHItPmxlbiAqIHItPnN0ZXApOworICAgIGVsc2UgaWYgKHItPnN0ZXAgPT0gMSkKKyAgICAgICAgcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgieHJhbmdlKCVsZCwgJWxkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwKTsKIAotCWVsc2UKLQkJcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgieHJhbmdlKCVsZCwgJWxkLCAlbGQpIiwKLQkJCQkJICByLT5zdGFydCwKLQkJCQkJICByLT5zdGFydCArIHItPmxlbiAqIHItPnN0ZXAsCi0JCQkJCSAgci0+c3RlcCk7Ci0JcmV0dXJuIHJ0bjsKKyAgICBlbHNlCisgICAgICAgIHJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInhyYW5nZSglbGQsICVsZCwgJWxkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0ZXApOworICAgIHJldHVybiBydG47CiB9CiAKIC8qIFBpY2tsaW5nIHN1cHBvcnQgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZV9yZWR1Y2UocmFuZ2VvYmplY3QgKnIsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoTyhpaWkpKSIsIFB5X1RZUEUociksCi0JCQkgICAgIHItPnN0YXJ0LAotCQkJICAgICByLT5zdGFydCArIHItPmxlbiAqIHItPnN0ZXAsCi0JCQkgICAgIHItPnN0ZXApOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoTyhpaWkpKSIsIFB5X1RZUEUociksCisgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0ZXApOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgcmFuZ2VfYXNfc2VxdWVuY2UgPSB7Ci0JKGxlbmZ1bmMpcmFuZ2VfbGVuZ3RoLAkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCS8qIHNxX2NvbmNhdCAqLwotCTAsCQkJLyogc3FfcmVwZWF0ICovCi0JKHNzaXplYXJnZnVuYylyYW5nZV9pdGVtLCAvKiBzcV9pdGVtICovCi0JMCwJCQkvKiBzcV9zbGljZSAqLworICAgIChsZW5mdW5jKXJhbmdlX2xlbmd0aCwgICAgICAvKiBzcV9sZW5ndGggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdCAqLworICAgIChzc2l6ZWFyZ2Z1bmMpcmFuZ2VfaXRlbSwgLyogc3FfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9zbGljZSAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICogcmFuZ2VfaXRlcihQeU9iamVjdCAqc2VxKTsKQEAgLTE1MiwxNzEgKzE1MiwxNzEgQEAKICJSZXR1cm5zIGEgcmV2ZXJzZSBpdGVyYXRvci4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHJhbmdlX21ldGhvZHNbXSA9IHsKLQl7Il9fcmV2ZXJzZWRfXyIsCShQeUNGdW5jdGlvbilyYW5nZV9yZXZlcnNlLCBNRVRIX05PQVJHUywgcmV2ZXJzZV9kb2N9LAotCXsiX19yZWR1Y2VfXyIsCQkoUHlDRnVuY3Rpb24pcmFuZ2VfcmVkdWNlLCBNRVRIX1ZBUkFSR1N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19yZXZlcnNlZF9fIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pcmFuZ2VfcmV2ZXJzZSwgTUVUSF9OT0FSR1MsIHJldmVyc2VfZG9jfSwKKyAgICB7Il9fcmVkdWNlX18iLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXJhbmdlX3JlZHVjZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5UmFuZ2VfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJLyogTnVtYmVyIG9mIGl0ZW1zIGZvciB2YXJvYmplY3QgKi8KLQkieHJhbmdlIiwJCS8qIE5hbWUgb2YgdGhpcyB0eXBlICovCi0Jc2l6ZW9mKHJhbmdlb2JqZWN0KSwJLyogQmFzaWMgb2JqZWN0IHNpemUgKi8KLQkwLAkJCS8qIEl0ZW0gc2l6ZSBmb3IgdmFyb2JqZWN0ICovCi0JKGRlc3RydWN0b3IpUHlPYmplY3RfRGVsLCAvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylyYW5nZV9yZXByLAkvKiB0cF9yZXByICovCi0JMCwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmcmFuZ2VfYXNfc2VxdWVuY2UsCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgIC8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkvKiB0cF9mbGFncyAqLwotCXJhbmdlX2RvYywJCS8qIHRwX2RvYyAqLwotCTAsCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlyYW5nZV9pdGVyLAkJLyogdHBfaXRlciAqLwotCTAsCQkJLyogdHBfaXRlcm5leHQgKi8KLQlyYW5nZV9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJLyogdHBfYWxsb2MgKi8KLQlyYW5nZV9uZXcsCQkvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaXRlbXMgZm9yIHZhcm9iamVjdCAqLworICAgICJ4cmFuZ2UiLCAgICAgICAgICAgICAgICAgICAvKiBOYW1lIG9mIHRoaXMgdHlwZSAqLworICAgIHNpemVvZihyYW5nZW9iamVjdCksICAgICAgICAvKiBCYXNpYyBvYmplY3Qgc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdGVtIHNpemUgZm9yIHZhcm9iamVjdCAqLworICAgIChkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylyYW5nZV9yZXByLCAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZyYW5nZV9hc19zZXF1ZW5jZSwgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHJhbmdlX2RvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICByYW5nZV9pdGVyLCAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHJhbmdlX21ldGhvZHMsICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHJhbmdlX25ldywgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiBYcmFuZ2UgSXRlcmF0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JbG9uZwlpbmRleDsKLQlsb25nCXN0YXJ0OwotCWxvbmcJc3RlcDsKLQlsb25nCWxlbjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgbG9uZyAgICAgICAgaW5kZXg7CisgICAgbG9uZyAgICAgICAgc3RhcnQ7CisgICAgbG9uZyAgICAgICAgc3RlcDsKKyAgICBsb25nICAgICAgICBsZW47CiB9IHJhbmdlaXRlcm9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmdlaXRlcl9uZXh0KHJhbmdlaXRlcm9iamVjdCAqcikKIHsKLQlpZiAoci0+aW5kZXggPCByLT5sZW4pCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhyLT5zdGFydCArIChyLT5pbmRleCsrKSAqIHItPnN0ZXApOwotCXJldHVybiBOVUxMOworICAgIGlmIChyLT5pbmRleCA8IHItPmxlbikKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHItPnN0YXJ0ICsgKHItPmluZGV4KyspICogci0+c3RlcCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZWl0ZXJfbGVuKHJhbmdlaXRlcm9iamVjdCAqcikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoci0+bGVuIC0gci0+aW5kZXgpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyLT5sZW4gLSByLT5pbmRleCk7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHJhbmdlaXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pcmFuZ2VpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pcmFuZ2VpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlyYW5nZWl0ZXJfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCi0JInJhbmdlaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KLQlzaXplb2YocmFuZ2VpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylyYW5nZWl0ZXJfbmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JcmFuZ2VpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICJyYW5nZWl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHJhbmdlaXRlcm9iamVjdCksICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXJhbmdlaXRlcl9uZXh0LCAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgcmFuZ2VpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZV9pdGVyKFB5T2JqZWN0ICpzZXEpCiB7Ci0JcmFuZ2VpdGVyb2JqZWN0ICppdDsKKyAgICByYW5nZWl0ZXJvYmplY3QgKml0OwogCi0JaWYgKCFQeVJhbmdlX0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05ldyhyYW5nZWl0ZXJvYmplY3QsICZQeXJhbmdlaXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXQtPmluZGV4ID0gMDsKLQlpdC0+c3RhcnQgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RhcnQ7Ci0JaXQtPnN0ZXAgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RlcDsKLQlpdC0+bGVuID0gKChyYW5nZW9iamVjdCAqKXNlcSktPmxlbjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgaWYgKCFQeVJhbmdlX0NoZWNrKHNlcSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05ldyhyYW5nZWl0ZXJvYmplY3QsICZQeXJhbmdlaXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPmluZGV4ID0gMDsKKyAgICBpdC0+c3RhcnQgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RhcnQ7CisgICAgaXQtPnN0ZXAgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RlcDsKKyAgICBpdC0+bGVuID0gKChyYW5nZW9iamVjdCAqKXNlcSktPmxlbjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZV9yZXZlcnNlKFB5T2JqZWN0ICpzZXEpCiB7Ci0JcmFuZ2VpdGVyb2JqZWN0ICppdDsKLQlsb25nIHN0YXJ0LCBzdGVwLCBsZW47CisgICAgcmFuZ2VpdGVyb2JqZWN0ICppdDsKKyAgICBsb25nIHN0YXJ0LCBzdGVwLCBsZW47CiAKLQlpZiAoIVB5UmFuZ2VfQ2hlY2soc2VxKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTmV3KHJhbmdlaXRlcm9iamVjdCwgJlB5cmFuZ2VpdGVyX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5UmFuZ2VfQ2hlY2soc2VxKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTmV3KHJhbmdlaXRlcm9iamVjdCwgJlB5cmFuZ2VpdGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXJ0ID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0YXJ0OwotCXN0ZXAgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RlcDsKLQlsZW4gPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+bGVuOworICAgIHN0YXJ0ID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0YXJ0OworICAgIHN0ZXAgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RlcDsKKyAgICBsZW4gPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+bGVuOwogCi0JaXQtPmluZGV4ID0gMDsKLQlpdC0+bGVuID0gbGVuOwotCS8qIHRoZSBjYXN0cyBiZWxvdyBndWFyZCBhZ2FpbnN0IHNpZ25lZCBvdmVyZmxvdyBieSB0dXJuaW5nIGl0Ci0JICAgaW50byB1bnNpZ25lZCBvdmVyZmxvdyBpbnN0ZWFkLiAgVGhlIGNvcnJlY3RuZXNzIG9mIHRoaXMKLQkgICBjb2RlIHN0aWxsIGRlcGVuZHMgb24gY29udmVyc2lvbiBmcm9tIHVuc2lnbmVkIGxvbmcgdG8gbG9uZwotCSAgIHdyYXBwaW5nIG1vZHVsbyBVTE9OR19NQVgrMSwgd2hpY2ggaXNuJ3QgZ3VhcmFudGVlZCAoc2VlCi0JICAgQzk5IDYuMy4xLjNwMykgYnV0IHNlZW1zIHRvIGhvbGQgaW4gcHJhY3RpY2UgZm9yIGFsbAotCSAgIHBsYXRmb3JtcyB3ZSdyZSBsaWtlbHkgdG8gbWVldC4KKyAgICBpdC0+aW5kZXggPSAwOworICAgIGl0LT5sZW4gPSBsZW47CisgICAgLyogdGhlIGNhc3RzIGJlbG93IGd1YXJkIGFnYWluc3Qgc2lnbmVkIG92ZXJmbG93IGJ5IHR1cm5pbmcgaXQKKyAgICAgICBpbnRvIHVuc2lnbmVkIG92ZXJmbG93IGluc3RlYWQuICBUaGUgY29ycmVjdG5lc3Mgb2YgdGhpcworICAgICAgIGNvZGUgc3RpbGwgZGVwZW5kcyBvbiBjb252ZXJzaW9uIGZyb20gdW5zaWduZWQgbG9uZyB0byBsb25nCisgICAgICAgd3JhcHBpbmcgbW9kdWxvIFVMT05HX01BWCsxLCB3aGljaCBpc24ndCBndWFyYW50ZWVkIChzZWUKKyAgICAgICBDOTkgNi4zLjEuM3AzKSBidXQgc2VlbXMgdG8gaG9sZCBpbiBwcmFjdGljZSBmb3IgYWxsCisgICAgICAgcGxhdGZvcm1zIHdlJ3JlIGxpa2VseSB0byBtZWV0LgogCi0JICAgSWYgc3RlcCA9PSBMT05HX01JTiB0aGVuIHdlIHN0aWxsIGVuZCB1cCB3aXRoIExPTkdfTUlOCi0JICAgYWZ0ZXIgbmVnYXRpb247IGJ1dCB0aGlzIHdvcmtzIG91dCwgc2luY2Ugd2UndmUgc3RpbGwgZ290Ci0JICAgdGhlIGNvcnJlY3QgdmFsdWUgbW9kdWxvIFVMT05HX01BWCsxLCBhbmQgdGhlIHJhbmdlX2l0ZW0KLQkgICBjYWxjdWxhdGlvbiBpcyBhbHNvIGRvbmUgbW9kdWxvIFVMT05HX01BWCsxLgotCSovCi0JaXQtPnN0YXJ0ID0gKGxvbmcpKHN0YXJ0ICsgKHVuc2lnbmVkIGxvbmcpKGxlbi0xKSAqIHN0ZXApOwotCWl0LT5zdGVwID0gKGxvbmcpKDBVTC1zdGVwKTsKKyAgICAgICBJZiBzdGVwID09IExPTkdfTUlOIHRoZW4gd2Ugc3RpbGwgZW5kIHVwIHdpdGggTE9OR19NSU4KKyAgICAgICBhZnRlciBuZWdhdGlvbjsgYnV0IHRoaXMgd29ya3Mgb3V0LCBzaW5jZSB3ZSd2ZSBzdGlsbCBnb3QKKyAgICAgICB0aGUgY29ycmVjdCB2YWx1ZSBtb2R1bG8gVUxPTkdfTUFYKzEsIGFuZCB0aGUgcmFuZ2VfaXRlbQorICAgICAgIGNhbGN1bGF0aW9uIGlzIGFsc28gZG9uZSBtb2R1bG8gVUxPTkdfTUFYKzEuCisgICAgKi8KKyAgICBpdC0+c3RhcnQgPSAobG9uZykoc3RhcnQgKyAodW5zaWduZWQgbG9uZykobGVuLTEpICogc3RlcCk7CisgICAgaXQtPnN0ZXAgPSAobG9uZykoMFVMLXN0ZXApOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvc2V0b2JqZWN0LmMgYi9PYmplY3RzL3NldG9iamVjdC5jCmluZGV4IGY5N2IwYzAuLmY5OGE5MzAgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc2V0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9zZXRvYmplY3QuYwpAQCAtMSw1ICsxLDUgQEAKIAotLyogc2V0IG9iamVjdCBpbXBsZW1lbnRhdGlvbiAKKy8qIHNldCBvYmplY3QgaW1wbGVtZW50YXRpb24KICAgIFdyaXR0ZW4gYW5kIG1haW50YWluZWQgYnkgUmF5bW9uZCBELiBIZXR0aW5nZXIgPHB5dGhvbkByY24uY29tPgogICAgRGVyaXZlZCBmcm9tIExpYi9zZXRzLnB5IGFuZCBPYmplY3RzL2RpY3RvYmplY3QuYy4KIApAQCAtMTYsMTIgKzE2LDEyIEBACiBzdGF0aWMgdm9pZAogc2V0X2tleV9lcnJvcihQeU9iamVjdCAqYXJnKQogewotCVB5T2JqZWN0ICp0dXA7Ci0JdHVwID0gUHlUdXBsZV9QYWNrKDEsIGFyZyk7Ci0JaWYgKCF0dXApCi0JCXJldHVybjsgLyogY2FsbGVyIHdpbGwgZXhwZWN0IGVycm9yIHRvIGJlIHNldCBhbnl3YXkgKi8KLQlQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIHR1cCk7Ci0JUHlfREVDUkVGKHR1cCk7CisgICAgUHlPYmplY3QgKnR1cDsKKyAgICB0dXAgPSBQeVR1cGxlX1BhY2soMSwgYXJnKTsKKyAgICBpZiAoIXR1cCkKKyAgICAgICAgcmV0dXJuOyAvKiBjYWxsZXIgd2lsbCBleHBlY3QgZXJyb3IgdG8gYmUgc2V0IGFueXdheSAqLworICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwgdHVwKTsKKyAgICBQeV9ERUNSRUYodHVwKTsKIH0KIAogLyogVGhpcyBtdXN0IGJlID49IDEuICovCkBAIC0zNCwyMCArMzQsMjAgQEAKIFB5T2JqZWN0ICoKIF9QeVNldF9EdW1teSh2b2lkKQogewotCXJldHVybiBkdW1teTsKKyAgICByZXR1cm4gZHVtbXk7CiB9CiAjZW5kaWYKIAotI2RlZmluZSBJTklUX05PTlpFUk9fU0VUX1NMT1RTKHNvKSBkbyB7CQkJCVwKLQkoc28pLT50YWJsZSA9IChzbyktPnNtYWxsdGFibGU7CQkJCVwKLQkoc28pLT5tYXNrID0gUHlTZXRfTUlOU0laRSAtIDE7CQkJCVwKLQkoc28pLT5oYXNoID0gLTE7CQkJCQlcCisjZGVmaW5lIElOSVRfTk9OWkVST19TRVRfU0xPVFMoc28pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChzbyktPnRhYmxlID0gKHNvKS0+c21hbGx0YWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoc28pLT5tYXNrID0gUHlTZXRfTUlOU0laRSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHNvKS0+aGFzaCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUoMCkKIAotI2RlZmluZSBFTVBUWV9UT19NSU5TSVpFKHNvKSBkbyB7CQkJCVwKLQltZW1zZXQoKHNvKS0+c21hbGx0YWJsZSwgMCwgc2l6ZW9mKChzbyktPnNtYWxsdGFibGUpKTsJXAotCShzbyktPnVzZWQgPSAoc28pLT5maWxsID0gMDsJCQkJXAotCUlOSVRfTk9OWkVST19TRVRfU0xPVFMoc28pOwkJCQlcCisjZGVmaW5lIEVNUFRZX1RPX01JTlNJWkUoc28pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbXNldCgoc28pLT5zbWFsbHRhYmxlLCAwLCBzaXplb2YoKHNvKS0+c21hbGx0YWJsZSkpOyAgICAgIFwKKyAgICAoc28pLT51c2VkID0gKHNvKS0+ZmlsbCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSU5JVF9OT05aRVJPX1NFVF9TTE9UUyhzbyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUoMCkKIAogLyogUmV1c2Ugc2NoZW1lIHRvIHNhdmUgY2FsbHMgdG8gbWFsbG9jLCBmcmVlLCBhbmQgbWVtc2V0ICovCkBAIC03NSw3OCArNzUsNzggQEAKIHN0YXRpYyBzZXRlbnRyeSAqCiBzZXRfbG9va2tleShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIHJlZ2lzdGVyIGxvbmcgaGFzaCkKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGk7Ci0JcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7Ci0JcmVnaXN0ZXIgc2V0ZW50cnkgKmZyZWVzbG90OwotCXJlZ2lzdGVyIHNpemVfdCBtYXNrID0gc28tPm1hc2s7Ci0Jc2V0ZW50cnkgKnRhYmxlID0gc28tPnRhYmxlOwotCXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKLQlyZWdpc3RlciBpbnQgY21wOwotCVB5T2JqZWN0ICpzdGFydGtleTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7CisgICAgcmVnaXN0ZXIgc2V0ZW50cnkgKmZyZWVzbG90OworICAgIHJlZ2lzdGVyIHNpemVfdCBtYXNrID0gc28tPm1hc2s7CisgICAgc2V0ZW50cnkgKnRhYmxlID0gc28tPnRhYmxlOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICByZWdpc3RlciBpbnQgY21wOworICAgIFB5T2JqZWN0ICpzdGFydGtleTsKIAotCWkgPSBoYXNoICYgbWFzazsKLQllbnRyeSA9ICZ0YWJsZVtpXTsKLQlpZiAoZW50cnktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXkgPT0ga2V5KQotCQlyZXR1cm4gZW50cnk7CisgICAgaSA9IGhhc2ggJiBtYXNrOworICAgIGVudHJ5ID0gJnRhYmxlW2ldOworICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBrZXkpCisgICAgICAgIHJldHVybiBlbnRyeTsKIAotCWlmIChlbnRyeS0+a2V5ID09IGR1bW15KQotCQlmcmVlc2xvdCA9IGVudHJ5OwotCWVsc2UgewotCQlpZiAoZW50cnktPmhhc2ggPT0gaGFzaCkgewotCQkJc3RhcnRrZXkgPSBlbnRyeS0+a2V5OwotCQkJUHlfSU5DUkVGKHN0YXJ0a2V5KTsKLQkJCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7Ci0JCQlQeV9ERUNSRUYoc3RhcnRrZXkpOwotCQkJaWYgKGNtcCA8IDApCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpZiAodGFibGUgPT0gc28tPnRhYmxlICYmIGVudHJ5LT5rZXkgPT0gc3RhcnRrZXkpIHsKLQkJCQlpZiAoY21wID4gMCkKLQkJCQkJcmV0dXJuIGVudHJ5OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogVGhlIGNvbXBhcmUgZGlkIG1ham9yIG5hc3R5IHN0dWZmIHRvIHRoZQotCQkJCSAqIHNldDogIHN0YXJ0IG92ZXIuCi0gCQkJCSAqLwotIAkJCQlyZXR1cm4gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7Ci0gCQkJfQotCQl9Ci0JCWZyZWVzbG90ID0gTlVMTDsKLQl9CisgICAgaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkpCisgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoKSB7CisgICAgICAgICAgICBzdGFydGtleSA9IGVudHJ5LT5rZXk7CisgICAgICAgICAgICBQeV9JTkNSRUYoc3RhcnRrZXkpOworICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHN0YXJ0a2V5LCBrZXksIFB5X0VRKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmICh0YWJsZSA9PSBzby0+dGFibGUgJiYgZW50cnktPmtleSA9PSBzdGFydGtleSkgeworICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCisgICAgICAgICAgICAgICAgICogc2V0OiAgc3RhcnQgb3Zlci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJlZXNsb3QgPSBOVUxMOworICAgIH0KIAotCS8qIEluIHRoZSBsb29wLCBrZXkgPT0gZHVtbXkgaXMgYnkgZmFyIChmYWN0b3Igb2YgMTAwcykgdGhlCi0JICAgbGVhc3QgbGlrZWx5IG91dGNvbWUsIHNvIHRlc3QgZm9yIHRoYXQgbGFzdC4gKi8KLQlmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKLQkJaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOwotCQllbnRyeSA9ICZ0YWJsZVtpICYgbWFza107Ci0JCWlmIChlbnRyeS0+a2V5ID09IE5VTEwpIHsKLQkJCWlmIChmcmVlc2xvdCAhPSBOVUxMKQotCQkJCWVudHJ5ID0gZnJlZXNsb3Q7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoZW50cnktPmtleSA9PSBrZXkpCi0JCQlicmVhazsKLQkJaWYgKGVudHJ5LT5oYXNoID09IGhhc2ggJiYgZW50cnktPmtleSAhPSBkdW1teSkgewotCQkJc3RhcnRrZXkgPSBlbnRyeS0+a2V5OwotCQkJUHlfSU5DUkVGKHN0YXJ0a2V5KTsKLQkJCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7Ci0JCQlQeV9ERUNSRUYoc3RhcnRrZXkpOwotCQkJaWYgKGNtcCA8IDApCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpZiAodGFibGUgPT0gc28tPnRhYmxlICYmIGVudHJ5LT5rZXkgPT0gc3RhcnRrZXkpIHsKLQkJCQlpZiAoY21wID4gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCi0JCQkJICogc2V0OiAgc3RhcnQgb3Zlci4KLSAJCQkJICovCi0gCQkJCXJldHVybiBzZXRfbG9va2tleShzbywga2V5LCBoYXNoKTsKLSAJCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZW50cnktPmtleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQotCQkJZnJlZXNsb3QgPSBlbnRyeTsKLQl9Ci0JcmV0dXJuIGVudHJ5OworICAgIC8qIEluIHRoZSBsb29wLCBrZXkgPT0gZHVtbXkgaXMgYnkgZmFyIChmYWN0b3Igb2YgMTAwcykgdGhlCisgICAgICAgbGVhc3QgbGlrZWx5IG91dGNvbWUsIHNvIHRlc3QgZm9yIHRoYXQgbGFzdC4gKi8KKyAgICBmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKKyAgICAgICAgaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOworICAgICAgICBlbnRyeSA9ICZ0YWJsZVtpICYgbWFza107CisgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChmcmVlc2xvdCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGVudHJ5ID0gZnJlZXNsb3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW50cnktPmtleSA9PSBrZXkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IGhhc2ggJiYgZW50cnktPmtleSAhPSBkdW1teSkgeworICAgICAgICAgICAgc3RhcnRrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcnRrZXkpOworICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAodGFibGUgPT0gc28tPnRhYmxlICYmIGVudHJ5LT5rZXkgPT0gc3RhcnRrZXkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCisgICAgICAgICAgICAgICAgICogc2V0OiAgc3RhcnQgb3Zlci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZW50cnktPmtleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgZnJlZXNsb3QgPSBlbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5OwogfQogCiAvKgpAQCAtMTU3LDUwICsxNTcsNTAgQEAKIHN0YXRpYyBzZXRlbnRyeSAqCiBzZXRfbG9va2tleV9zdHJpbmcoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCByZWdpc3RlciBsb25nIGhhc2gpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOwotCXJlZ2lzdGVyIHNldGVudHJ5ICpmcmVlc2xvdDsKLQlyZWdpc3RlciBzaXplX3QgbWFzayA9IHNvLT5tYXNrOwotCXNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICpmcmVlc2xvdDsKKyAgICByZWdpc3RlciBzaXplX3QgbWFzayA9IHNvLT5tYXNrOworICAgIHNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CiAKLQkvKiBNYWtlIHN1cmUgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgdG8gaGFuZGxlIG5vbi1zdHJpbmcga2V5cywKLQkgICBpbmNsdWRpbmcgc3ViY2xhc3NlcyBvZiBzdHI7IGUuZy4sIG9uZSByZWFzb24gdG8gc3ViY2xhc3MKLQkgICBzdHJpbmdzIGlzIHRvIG92ZXJyaWRlIF9fZXFfXywgYW5kIGZvciBzcGVlZCB3ZSBkb24ndCBjYXRlciB0bwotCSAgIHRoYXQgaGVyZS4gKi8KLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSkgewotCQlzby0+bG9va3VwID0gc2V0X2xvb2trZXk7Ci0JCXJldHVybiBzZXRfbG9va2tleShzbywga2V5LCBoYXNoKTsKLQl9Ci0JaSA9IGhhc2ggJiBtYXNrOwotCWVudHJ5ID0gJnRhYmxlW2ldOwotCWlmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBrZXkpCi0JCXJldHVybiBlbnRyeTsKLQlpZiAoZW50cnktPmtleSA9PSBkdW1teSkKLQkJZnJlZXNsb3QgPSBlbnRyeTsKLQllbHNlIHsKLQkJaWYgKGVudHJ5LT5oYXNoID09IGhhc2ggJiYgX1B5U3RyaW5nX0VxKGVudHJ5LT5rZXksIGtleSkpCi0JCQlyZXR1cm4gZW50cnk7Ci0JCWZyZWVzbG90ID0gTlVMTDsKLQl9CisgICAgLyogTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBoYXZlIHRvIGhhbmRsZSBub24tc3RyaW5nIGtleXMsCisgICAgICAgaW5jbHVkaW5nIHN1YmNsYXNzZXMgb2Ygc3RyOyBlLmcuLCBvbmUgcmVhc29uIHRvIHN1YmNsYXNzCisgICAgICAgc3RyaW5ncyBpcyB0byBvdmVycmlkZSBfX2VxX18sIGFuZCBmb3Igc3BlZWQgd2UgZG9uJ3QgY2F0ZXIgdG8KKyAgICAgICB0aGF0IGhlcmUuICovCisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkpIHsKKyAgICAgICAgc28tPmxvb2t1cCA9IHNldF9sb29ra2V5OworICAgICAgICByZXR1cm4gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7CisgICAgfQorICAgIGkgPSBoYXNoICYgbWFzazsKKyAgICBlbnRyeSA9ICZ0YWJsZVtpXTsKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXkgPT0ga2V5KQorICAgICAgICByZXR1cm4gZW50cnk7CisgICAgaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkpCisgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoICYmIF9QeVN0cmluZ19FcShlbnRyeS0+a2V5LCBrZXkpKQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICBmcmVlc2xvdCA9IE5VTEw7CisgICAgfQogCi0JLyogSW4gdGhlIGxvb3AsIGtleSA9PSBkdW1teSBpcyBieSBmYXIgKGZhY3RvciBvZiAxMDBzKSB0aGUKLQkgICBsZWFzdCBsaWtlbHkgb3V0Y29tZSwgc28gdGVzdCBmb3IgdGhhdCBsYXN0LiAqLwotCWZvciAocGVydHVyYiA9IGhhc2g7IDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgewotCQlpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7Ci0JCWVudHJ5ID0gJnRhYmxlW2kgJiBtYXNrXTsKLQkJaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkKLQkJCXJldHVybiBmcmVlc2xvdCA9PSBOVUxMID8gZW50cnkgOiBmcmVlc2xvdDsKLQkJaWYgKGVudHJ5LT5rZXkgPT0ga2V5Ci0JCSAgICB8fCAoZW50cnktPmhhc2ggPT0gaGFzaAotCQkJJiYgZW50cnktPmtleSAhPSBkdW1teQotCQkJJiYgX1B5U3RyaW5nX0VxKGVudHJ5LT5rZXksIGtleSkpKQotCQkJcmV0dXJuIGVudHJ5OwotCQlpZiAoZW50cnktPmtleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQotCQkJZnJlZXNsb3QgPSBlbnRyeTsKLQl9Ci0JYXNzZXJ0KDApOwkvKiBOT1QgUkVBQ0hFRCAqLwotCXJldHVybiAwOworICAgIC8qIEluIHRoZSBsb29wLCBrZXkgPT0gZHVtbXkgaXMgYnkgZmFyIChmYWN0b3Igb2YgMTAwcykgdGhlCisgICAgICAgbGVhc3QgbGlrZWx5IG91dGNvbWUsIHNvIHRlc3QgZm9yIHRoYXQgbGFzdC4gKi8KKyAgICBmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKKyAgICAgICAgaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOworICAgICAgICBlbnRyeSA9ICZ0YWJsZVtpICYgbWFza107CisgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVudHJ5IDogZnJlZXNsb3Q7CisgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IGtleQorICAgICAgICAgICAgfHwgKGVudHJ5LT5oYXNoID09IGhhc2gKKyAgICAgICAgICAgICYmIGVudHJ5LT5rZXkgIT0gZHVtbXkKKyAgICAgICAgICAgICYmIF9QeVN0cmluZ19FcShlbnRyeS0+a2V5LCBrZXkpKSkKKyAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkgJiYgZnJlZXNsb3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CisgICAgfQorICAgIGFzc2VydCgwKTsgICAgICAgICAgLyogTk9UIFJFQUNIRUQgKi8KKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTIxMSwzMCArMjExLDMwIEBACiBzdGF0aWMgaW50CiBzZXRfaW5zZXJ0X2tleShyZWdpc3RlciBQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCkKIHsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7Ci0JdHlwZWRlZiBzZXRlbnRyeSAqKCpsb29rdXBmdW5jKShQeVNldE9iamVjdCAqLCBQeU9iamVjdCAqLCBsb25nKTsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CisgICAgdHlwZWRlZiBzZXRlbnRyeSAqKCpsb29rdXBmdW5jKShQeVNldE9iamVjdCAqLCBQeU9iamVjdCAqLCBsb25nKTsKIAotCWFzc2VydChzby0+bG9va3VwICE9IE5VTEwpOwotCWVudHJ5ID0gc28tPmxvb2t1cChzbywga2V5LCBoYXNoKTsKLQlpZiAoZW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChlbnRyeS0+a2V5ID09IE5VTEwpIHsKLQkJLyogVU5VU0VEICovCi0JCXNvLT5maWxsKys7IAotCQllbnRyeS0+a2V5ID0ga2V5OwotCQllbnRyeS0+aGFzaCA9IGhhc2g7Ci0JCXNvLT51c2VkKys7Ci0JfSBlbHNlIGlmIChlbnRyeS0+a2V5ID09IGR1bW15KSB7Ci0JCS8qIERVTU1ZICovCi0JCWVudHJ5LT5rZXkgPSBrZXk7Ci0JCWVudHJ5LT5oYXNoID0gaGFzaDsKLQkJc28tPnVzZWQrKzsKLQkJUHlfREVDUkVGKGR1bW15KTsKLQl9IGVsc2UgewotCQkvKiBBQ1RJVkUgKi8KLQkJUHlfREVDUkVGKGtleSk7Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChzby0+bG9va3VwICE9IE5VTEwpOworICAgIGVudHJ5ID0gc28tPmxvb2t1cChzbywga2V5LCBoYXNoKTsKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpIHsKKyAgICAgICAgLyogVU5VU0VEICovCisgICAgICAgIHNvLT5maWxsKys7CisgICAgICAgIGVudHJ5LT5rZXkgPSBrZXk7CisgICAgICAgIGVudHJ5LT5oYXNoID0gaGFzaDsKKyAgICAgICAgc28tPnVzZWQrKzsKKyAgICB9IGVsc2UgaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkpIHsKKyAgICAgICAgLyogRFVNTVkgKi8KKyAgICAgICAgZW50cnktPmtleSA9IGtleTsKKyAgICAgICAgZW50cnktPmhhc2ggPSBoYXNoOworICAgICAgICBzby0+dXNlZCsrOworICAgICAgICBQeV9ERUNSRUYoZHVtbXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEFDVElWRSAqLworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yNDgsMjIgKzI0OCwyMiBAQAogc3RhdGljIHZvaWQKIHNldF9pbnNlcnRfY2xlYW4ocmVnaXN0ZXIgUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpCiB7Ci0JcmVnaXN0ZXIgc2l6ZV90IGk7Ci0JcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7Ci0JcmVnaXN0ZXIgc2l6ZV90IG1hc2sgPSAoc2l6ZV90KXNvLT5tYXNrOwotCXNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG1hc2sgPSAoc2l6ZV90KXNvLT5tYXNrOworICAgIHNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CiAKLQlpID0gaGFzaCAmIG1hc2s7Ci0JZW50cnkgPSAmdGFibGVbaV07Ci0JZm9yIChwZXJ0dXJiID0gaGFzaDsgZW50cnktPmtleSAhPSBOVUxMOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7Ci0JCWkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKLQkJZW50cnkgPSAmdGFibGVbaSAmIG1hc2tdOwotCX0KLQlzby0+ZmlsbCsrOwotCWVudHJ5LT5rZXkgPSBrZXk7Ci0JZW50cnktPmhhc2ggPSBoYXNoOwotCXNvLT51c2VkKys7CisgICAgaSA9IGhhc2ggJiBtYXNrOworICAgIGVudHJ5ID0gJnRhYmxlW2ldOworICAgIGZvciAocGVydHVyYiA9IGhhc2g7IGVudHJ5LT5rZXkgIT0gTlVMTDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgeworICAgICAgICBpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7CisgICAgICAgIGVudHJ5ID0gJnRhYmxlW2kgJiBtYXNrXTsKKyAgICB9CisgICAgc28tPmZpbGwrKzsKKyAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgIGVudHJ5LT5oYXNoID0gaGFzaDsKKyAgICBzby0+dXNlZCsrOwogfQogCiAvKgpAQCAtMjc0LDg2ICsyNzQsODYgQEAKIHN0YXRpYyBpbnQKIHNldF90YWJsZV9yZXNpemUoUHlTZXRPYmplY3QgKnNvLCBQeV9zc2l6ZV90IG1pbnVzZWQpCiB7Ci0JUHlfc3NpemVfdCBuZXdzaXplOwotCXNldGVudHJ5ICpvbGR0YWJsZSwgKm5ld3RhYmxlLCAqZW50cnk7Ci0JUHlfc3NpemVfdCBpOwotCWludCBpc19vbGR0YWJsZV9tYWxsb2NlZDsKLQlzZXRlbnRyeSBzbWFsbF9jb3B5W1B5U2V0X01JTlNJWkVdOworICAgIFB5X3NzaXplX3QgbmV3c2l6ZTsKKyAgICBzZXRlbnRyeSAqb2xkdGFibGUsICpuZXd0YWJsZSwgKmVudHJ5OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgaXNfb2xkdGFibGVfbWFsbG9jZWQ7CisgICAgc2V0ZW50cnkgc21hbGxfY29weVtQeVNldF9NSU5TSVpFXTsKIAotCWFzc2VydChtaW51c2VkID49IDApOworICAgIGFzc2VydChtaW51c2VkID49IDApOwogCi0JLyogRmluZCB0aGUgc21hbGxlc3QgdGFibGUgc2l6ZSA+IG1pbnVzZWQuICovCi0JZm9yIChuZXdzaXplID0gUHlTZXRfTUlOU0laRTsKLQkgICAgIG5ld3NpemUgPD0gbWludXNlZCAmJiBuZXdzaXplID4gMDsKLQkgICAgIG5ld3NpemUgPDw9IDEpCi0JCTsKLQlpZiAobmV3c2l6ZSA8PSAwKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogRmluZCB0aGUgc21hbGxlc3QgdGFibGUgc2l6ZSA+IG1pbnVzZWQuICovCisgICAgZm9yIChuZXdzaXplID0gUHlTZXRfTUlOU0laRTsKKyAgICAgICAgIG5ld3NpemUgPD0gbWludXNlZCAmJiBuZXdzaXplID4gMDsKKyAgICAgICAgIG5ld3NpemUgPDw9IDEpCisgICAgICAgIDsKKyAgICBpZiAobmV3c2l6ZSA8PSAwKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBHZXQgc3BhY2UgZm9yIGEgbmV3IHRhYmxlLiAqLwotCW9sZHRhYmxlID0gc28tPnRhYmxlOwotCWFzc2VydChvbGR0YWJsZSAhPSBOVUxMKTsKLQlpc19vbGR0YWJsZV9tYWxsb2NlZCA9IG9sZHRhYmxlICE9IHNvLT5zbWFsbHRhYmxlOworICAgIC8qIEdldCBzcGFjZSBmb3IgYSBuZXcgdGFibGUuICovCisgICAgb2xkdGFibGUgPSBzby0+dGFibGU7CisgICAgYXNzZXJ0KG9sZHRhYmxlICE9IE5VTEwpOworICAgIGlzX29sZHRhYmxlX21hbGxvY2VkID0gb2xkdGFibGUgIT0gc28tPnNtYWxsdGFibGU7CiAKLQlpZiAobmV3c2l6ZSA9PSBQeVNldF9NSU5TSVpFKSB7Ci0JCS8qIEEgbGFyZ2UgdGFibGUgaXMgc2hyaW5raW5nLCBvciB3ZSBjYW4ndCBnZXQgYW55IHNtYWxsZXIuICovCi0JCW5ld3RhYmxlID0gc28tPnNtYWxsdGFibGU7Ci0JCWlmIChuZXd0YWJsZSA9PSBvbGR0YWJsZSkgewotCQkJaWYgKHNvLT5maWxsID09IHNvLT51c2VkKSB7Ci0JCQkJLyogTm8gZHVtbWllcywgc28gbm8gcG9pbnQgZG9pbmcgYW55dGhpbmcuICovCi0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkvKiBXZSdyZSBub3QgZ29pbmcgdG8gcmVzaXplIGl0LCBidXQgcmVidWlsZCB0aGUKLQkJCSAgIHRhYmxlIGFueXdheSB0byBwdXJnZSBvbGQgZHVtbXkgZW50cmllcy4KLQkJCSAgIFN1YnRsZTogIFRoaXMgaXMgKm5lY2Vzc2FyeSogaWYgZmlsbD09c2l6ZSwKLQkJCSAgIGFzIHNldF9sb29ra2V5IG5lZWRzIGF0IGxlYXN0IG9uZSB2aXJnaW4gc2xvdCB0bwotCQkJICAgdGVybWluYXRlIGZhaWxpbmcgc2VhcmNoZXMuICBJZiBmaWxsIDwgc2l6ZSwgaXQncwotCQkJICAgbWVyZWx5IGRlc2lyYWJsZSwgYXMgZHVtbWllcyBzbG93IHNlYXJjaGVzLiAqLwotCQkJYXNzZXJ0KHNvLT5maWxsID4gc28tPnVzZWQpOwotCQkJbWVtY3B5KHNtYWxsX2NvcHksIG9sZHRhYmxlLCBzaXplb2Yoc21hbGxfY29weSkpOwotCQkJb2xkdGFibGUgPSBzbWFsbF9jb3B5OwotCQl9Ci0JfQotCWVsc2UgewotCQluZXd0YWJsZSA9IFB5TWVtX05FVyhzZXRlbnRyeSwgbmV3c2l6ZSk7Ci0JCWlmIChuZXd0YWJsZSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgIGlmIChuZXdzaXplID09IFB5U2V0X01JTlNJWkUpIHsKKyAgICAgICAgLyogQSBsYXJnZSB0YWJsZSBpcyBzaHJpbmtpbmcsIG9yIHdlIGNhbid0IGdldCBhbnkgc21hbGxlci4gKi8KKyAgICAgICAgbmV3dGFibGUgPSBzby0+c21hbGx0YWJsZTsKKyAgICAgICAgaWYgKG5ld3RhYmxlID09IG9sZHRhYmxlKSB7CisgICAgICAgICAgICBpZiAoc28tPmZpbGwgPT0gc28tPnVzZWQpIHsKKyAgICAgICAgICAgICAgICAvKiBObyBkdW1taWVzLCBzbyBubyBwb2ludCBkb2luZyBhbnl0aGluZy4gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdlJ3JlIG5vdCBnb2luZyB0byByZXNpemUgaXQsIGJ1dCByZWJ1aWxkIHRoZQorICAgICAgICAgICAgICAgdGFibGUgYW55d2F5IHRvIHB1cmdlIG9sZCBkdW1teSBlbnRyaWVzLgorICAgICAgICAgICAgICAgU3VidGxlOiAgVGhpcyBpcyAqbmVjZXNzYXJ5KiBpZiBmaWxsPT1zaXplLAorICAgICAgICAgICAgICAgYXMgc2V0X2xvb2trZXkgbmVlZHMgYXQgbGVhc3Qgb25lIHZpcmdpbiBzbG90IHRvCisgICAgICAgICAgICAgICB0ZXJtaW5hdGUgZmFpbGluZyBzZWFyY2hlcy4gIElmIGZpbGwgPCBzaXplLCBpdCdzCisgICAgICAgICAgICAgICBtZXJlbHkgZGVzaXJhYmxlLCBhcyBkdW1taWVzIHNsb3cgc2VhcmNoZXMuICovCisgICAgICAgICAgICBhc3NlcnQoc28tPmZpbGwgPiBzby0+dXNlZCk7CisgICAgICAgICAgICBtZW1jcHkoc21hbGxfY29weSwgb2xkdGFibGUsIHNpemVvZihzbWFsbF9jb3B5KSk7CisgICAgICAgICAgICBvbGR0YWJsZSA9IHNtYWxsX2NvcHk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5ld3RhYmxlID0gUHlNZW1fTkVXKHNldGVudHJ5LCBuZXdzaXplKTsKKyAgICAgICAgaWYgKG5ld3RhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBNYWtlIHRoZSBzZXQgZW1wdHksIHVzaW5nIHRoZSBuZXcgdGFibGUuICovCi0JYXNzZXJ0KG5ld3RhYmxlICE9IG9sZHRhYmxlKTsKLQlzby0+dGFibGUgPSBuZXd0YWJsZTsKLQlzby0+bWFzayA9IG5ld3NpemUgLSAxOwotCW1lbXNldChuZXd0YWJsZSwgMCwgc2l6ZW9mKHNldGVudHJ5KSAqIG5ld3NpemUpOwotCXNvLT51c2VkID0gMDsKLQlpID0gc28tPmZpbGw7Ci0Jc28tPmZpbGwgPSAwOworICAgIC8qIE1ha2UgdGhlIHNldCBlbXB0eSwgdXNpbmcgdGhlIG5ldyB0YWJsZS4gKi8KKyAgICBhc3NlcnQobmV3dGFibGUgIT0gb2xkdGFibGUpOworICAgIHNvLT50YWJsZSA9IG5ld3RhYmxlOworICAgIHNvLT5tYXNrID0gbmV3c2l6ZSAtIDE7CisgICAgbWVtc2V0KG5ld3RhYmxlLCAwLCBzaXplb2Yoc2V0ZW50cnkpICogbmV3c2l6ZSk7CisgICAgc28tPnVzZWQgPSAwOworICAgIGkgPSBzby0+ZmlsbDsKKyAgICBzby0+ZmlsbCA9IDA7CiAKLQkvKiBDb3B5IHRoZSBkYXRhIG92ZXI7IHRoaXMgaXMgcmVmY291bnQtbmV1dHJhbCBmb3IgYWN0aXZlIGVudHJpZXM7Ci0JICAgZHVtbXkgZW50cmllcyBhcmVuJ3QgY29waWVkIG92ZXIsIG9mIGNvdXJzZSAqLwotCWZvciAoZW50cnkgPSBvbGR0YWJsZTsgaSA+IDA7IGVudHJ5KyspIHsKLQkJaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkgewotCQkJLyogVU5VU0VEICovCi0JCQk7Ci0JCX0gZWxzZSBpZiAoZW50cnktPmtleSA9PSBkdW1teSkgewotCQkJLyogRFVNTVkgKi8KLQkJCS0taTsKLQkJCWFzc2VydChlbnRyeS0+a2V5ID09IGR1bW15KTsKLQkJCVB5X0RFQ1JFRihlbnRyeS0+a2V5KTsKLQkJfSBlbHNlIHsKLQkJCS8qIEFDVElWRSAqLwotCQkJLS1pOwotCQkJc2V0X2luc2VydF9jbGVhbihzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOwotCQl9Ci0JfQorICAgIC8qIENvcHkgdGhlIGRhdGEgb3ZlcjsgdGhpcyBpcyByZWZjb3VudC1uZXV0cmFsIGZvciBhY3RpdmUgZW50cmllczsKKyAgICAgICBkdW1teSBlbnRyaWVzIGFyZW4ndCBjb3BpZWQgb3Zlciwgb2YgY291cnNlICovCisgICAgZm9yIChlbnRyeSA9IG9sZHRhYmxlOyBpID4gMDsgZW50cnkrKykgeworICAgICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBVTlVTRUQgKi8KKyAgICAgICAgICAgIDsKKyAgICAgICAgfSBlbHNlIGlmIChlbnRyeS0+a2V5ID09IGR1bW15KSB7CisgICAgICAgICAgICAvKiBEVU1NWSAqLworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgYXNzZXJ0KGVudHJ5LT5rZXkgPT0gZHVtbXkpOworICAgICAgICAgICAgUHlfREVDUkVGKGVudHJ5LT5rZXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogQUNUSVZFICovCisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzZXRfaW5zZXJ0X2NsZWFuKHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoaXNfb2xkdGFibGVfbWFsbG9jZWQpCi0JCVB5TWVtX0RFTChvbGR0YWJsZSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGlzX29sZHRhYmxlX21hbGxvY2VkKQorICAgICAgICBQeU1lbV9ERUwob2xkdGFibGUpOworICAgIHJldHVybiAwOwogfQogCiAvKiBDQVVUSU9OOiBzZXRfYWRkX2tleS9lbnRyeSgpIG11c3QgZ3VhcmFudGVlIGl0IHdvbid0IHJlc2l6ZSB0aGUgdGFibGUgKi8KQEAgLTM2MSw0MiArMzYxLDQyIEBACiBzdGF0aWMgaW50CiBzZXRfYWRkX2VudHJ5KHJlZ2lzdGVyIFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKmVudHJ5KQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3Qgbl91c2VkOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3Qgbl91c2VkOwogCi0JYXNzZXJ0KHNvLT5maWxsIDw9IHNvLT5tYXNrKTsgIC8qIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90ICovCi0Jbl91c2VkID0gc28tPnVzZWQ7Ci0JUHlfSU5DUkVGKGVudHJ5LT5rZXkpOwotCWlmIChzZXRfaW5zZXJ0X2tleShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpID09IC0xKSB7Ci0JCVB5X0RFQ1JFRihlbnRyeS0+a2V5KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIShzby0+dXNlZCA+IG5fdXNlZCAmJiBzby0+ZmlsbCozID49IChzby0+bWFzaysxKSoyKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkPjUwMDAwID8gc28tPnVzZWQqMiA6IHNvLT51c2VkKjQpOworICAgIGFzc2VydChzby0+ZmlsbCA8PSBzby0+bWFzayk7ICAvKiBhdCBsZWFzdCBvbmUgZW1wdHkgc2xvdCAqLworICAgIG5fdXNlZCA9IHNvLT51c2VkOworICAgIFB5X0lOQ1JFRihlbnRyeS0+a2V5KTsKKyAgICBpZiAoc2V0X2luc2VydF9rZXkoc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYoZW50cnktPmtleSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEoc28tPnVzZWQgPiBuX3VzZWQgJiYgc28tPmZpbGwqMyA+PSAoc28tPm1hc2srMSkqMikpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKIH0KIAogc3RhdGljIGludAogc2V0X2FkZF9rZXkocmVnaXN0ZXIgUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotCXJlZ2lzdGVyIGxvbmcgaGFzaDsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IG5fdXNlZDsKKyAgICByZWdpc3RlciBsb25nIGhhc2g7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBuX3VzZWQ7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQlhc3NlcnQoc28tPmZpbGwgPD0gc28tPm1hc2spOyAgLyogYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgKi8KLQluX3VzZWQgPSBzby0+dXNlZDsKLQlQeV9JTkNSRUYoa2V5KTsKLQlpZiAoc2V0X2luc2VydF9rZXkoc28sIGtleSwgaGFzaCkgPT0gLTEpIHsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCEoc28tPnVzZWQgPiBuX3VzZWQgJiYgc28tPmZpbGwqMyA+PSAoc28tPm1hc2srMSkqMikpCi0JCXJldHVybiAwOwotCXJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhc3NlcnQoc28tPmZpbGwgPD0gc28tPm1hc2spOyAgLyogYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgKi8KKyAgICBuX3VzZWQgPSBzby0+dXNlZDsKKyAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICBpZiAoc2V0X2luc2VydF9rZXkoc28sIGtleSwgaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEoc28tPnVzZWQgPiBuX3VzZWQgJiYgc28tPmZpbGwqMyA+PSAoc28tPm1hc2srMSkqMikpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKIH0KIAogI2RlZmluZSBESVNDQVJEX05PVEZPVU5EIDAKQEAgLTQwNCwxMTEgKzQwNCwxMTEgQEAKIAogc3RhdGljIGludAogc2V0X2Rpc2NhcmRfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBzZXRlbnRyeSAqb2xkZW50cnkpCi17CXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKLQlQeU9iamVjdCAqb2xkX2tleTsKK3sgICAgICAgcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OworICAgIFB5T2JqZWN0ICpvbGRfa2V5OwogCi0JZW50cnkgPSAoc28tPmxvb2t1cCkoc28sIG9sZGVudHJ5LT5rZXksIG9sZGVudHJ5LT5oYXNoKTsKLQlpZiAoZW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChlbnRyeS0+a2V5ID09IE5VTEwgIHx8ICBlbnRyeS0+a2V5ID09IGR1bW15KQotCQlyZXR1cm4gRElTQ0FSRF9OT1RGT1VORDsKLQlvbGRfa2V5ID0gZW50cnktPmtleTsKLQlQeV9JTkNSRUYoZHVtbXkpOwotCWVudHJ5LT5rZXkgPSBkdW1teTsKLQlzby0+dXNlZC0tOwotCVB5X0RFQ1JFRihvbGRfa2V5KTsKLQlyZXR1cm4gRElTQ0FSRF9GT1VORDsKKyAgICBlbnRyeSA9IChzby0+bG9va3VwKShzbywgb2xkZW50cnktPmtleSwgb2xkZW50cnktPmhhc2gpOworICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCAgfHwgIGVudHJ5LT5rZXkgPT0gZHVtbXkpCisgICAgICAgIHJldHVybiBESVNDQVJEX05PVEZPVU5EOworICAgIG9sZF9rZXkgPSBlbnRyeS0+a2V5OworICAgIFB5X0lOQ1JFRihkdW1teSk7CisgICAgZW50cnktPmtleSA9IGR1bW15OworICAgIHNvLT51c2VkLS07CisgICAgUHlfREVDUkVGKG9sZF9rZXkpOworICAgIHJldHVybiBESVNDQVJEX0ZPVU5EOwogfQogCiBzdGF0aWMgaW50CiBzZXRfZGlzY2FyZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotCXJlZ2lzdGVyIGxvbmcgaGFzaDsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7Ci0JUHlPYmplY3QgKm9sZF9rZXk7CisgICAgcmVnaXN0ZXIgbG9uZyBoYXNoOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeU9iamVjdCAqb2xkX2tleTsKIAotCWFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbnRyeSA9IChzby0+bG9va3VwKShzbywga2V5LCBoYXNoKTsKLQlpZiAoZW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChlbnRyeS0+a2V5ID09IE5VTEwgIHx8ICBlbnRyeS0+a2V5ID09IGR1bW15KQotCQlyZXR1cm4gRElTQ0FSRF9OT1RGT1VORDsKLQlvbGRfa2V5ID0gZW50cnktPmtleTsKLQlQeV9JTkNSRUYoZHVtbXkpOwotCWVudHJ5LT5rZXkgPSBkdW1teTsKLQlzby0+dXNlZC0tOwotCVB5X0RFQ1JFRihvbGRfa2V5KTsKLQlyZXR1cm4gRElTQ0FSRF9GT1VORDsKKyAgICBhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKKyAgICAgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZW50cnkgPSAoc28tPmxvb2t1cCkoc28sIGtleSwgaGFzaCk7CisgICAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMICB8fCAgZW50cnktPmtleSA9PSBkdW1teSkKKyAgICAgICAgcmV0dXJuIERJU0NBUkRfTk9URk9VTkQ7CisgICAgb2xkX2tleSA9IGVudHJ5LT5rZXk7CisgICAgUHlfSU5DUkVGKGR1bW15KTsKKyAgICBlbnRyeS0+a2V5ID0gZHVtbXk7CisgICAgc28tPnVzZWQtLTsKKyAgICBQeV9ERUNSRUYob2xkX2tleSk7CisgICAgcmV0dXJuIERJU0NBUkRfRk9VTkQ7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF9jbGVhcl9pbnRlcm5hbChQeVNldE9iamVjdCAqc28pCiB7Ci0Jc2V0ZW50cnkgKmVudHJ5LCAqdGFibGU7Ci0JaW50IHRhYmxlX2lzX21hbGxvY2VkOwotCVB5X3NzaXplX3QgZmlsbDsKLQlzZXRlbnRyeSBzbWFsbF9jb3B5W1B5U2V0X01JTlNJWkVdOworICAgIHNldGVudHJ5ICplbnRyeSwgKnRhYmxlOworICAgIGludCB0YWJsZV9pc19tYWxsb2NlZDsKKyAgICBQeV9zc2l6ZV90IGZpbGw7CisgICAgc2V0ZW50cnkgc21hbGxfY29weVtQeVNldF9NSU5TSVpFXTsKICNpZmRlZiBQeV9ERUJVRwotCVB5X3NzaXplX3QgaSwgbjsKLQlhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIGFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKIAotCW4gPSBzby0+bWFzayArIDE7Ci0JaSA9IDA7CisgICAgbiA9IHNvLT5tYXNrICsgMTsKKyAgICBpID0gMDsKICNlbmRpZgogCi0JdGFibGUgPSBzby0+dGFibGU7Ci0JYXNzZXJ0KHRhYmxlICE9IE5VTEwpOwotCXRhYmxlX2lzX21hbGxvY2VkID0gdGFibGUgIT0gc28tPnNtYWxsdGFibGU7CisgICAgdGFibGUgPSBzby0+dGFibGU7CisgICAgYXNzZXJ0KHRhYmxlICE9IE5VTEwpOworICAgIHRhYmxlX2lzX21hbGxvY2VkID0gdGFibGUgIT0gc28tPnNtYWxsdGFibGU7CiAKLQkvKiBUaGlzIGlzIGRlbGljYXRlLiAgRHVyaW5nIHRoZSBwcm9jZXNzIG9mIGNsZWFyaW5nIHRoZSBzZXQsCi0JICogZGVjcmVmcyBjYW4gY2F1c2UgdGhlIHNldCB0byBtdXRhdGUuICBUbyBhdm9pZCBmYXRhbCBjb25mdXNpb24KLQkgKiAodm9pY2Ugb2YgZXhwZXJpZW5jZSksIHdlIGhhdmUgdG8gbWFrZSB0aGUgc2V0IGVtcHR5IGJlZm9yZQotCSAqIGNsZWFyaW5nIHRoZSBzbG90cywgYW5kIG5ldmVyIHJlZmVyIHRvIGFueXRoaW5nIHZpYSBzby0+cmVmIHdoaWxlCi0JICogY2xlYXJpbmcuCi0JICovCi0JZmlsbCA9IHNvLT5maWxsOwotCWlmICh0YWJsZV9pc19tYWxsb2NlZCkKLQkJRU1QVFlfVE9fTUlOU0laRShzbyk7CisgICAgLyogVGhpcyBpcyBkZWxpY2F0ZS4gIER1cmluZyB0aGUgcHJvY2VzcyBvZiBjbGVhcmluZyB0aGUgc2V0LAorICAgICAqIGRlY3JlZnMgY2FuIGNhdXNlIHRoZSBzZXQgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uCisgICAgICogKHZvaWNlIG9mIGV4cGVyaWVuY2UpLCB3ZSBoYXZlIHRvIG1ha2UgdGhlIHNldCBlbXB0eSBiZWZvcmUKKyAgICAgKiBjbGVhcmluZyB0aGUgc2xvdHMsIGFuZCBuZXZlciByZWZlciB0byBhbnl0aGluZyB2aWEgc28tPnJlZiB3aGlsZQorICAgICAqIGNsZWFyaW5nLgorICAgICAqLworICAgIGZpbGwgPSBzby0+ZmlsbDsKKyAgICBpZiAodGFibGVfaXNfbWFsbG9jZWQpCisgICAgICAgIEVNUFRZX1RPX01JTlNJWkUoc28pOwogCi0JZWxzZSBpZiAoZmlsbCA+IDApIHsKLQkJLyogSXQncyBhIHNtYWxsIHRhYmxlIHdpdGggc29tZXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY2xlYXJlZC4KLQkJICogQWZyYWlkIHRoZSBvbmx5IHNhZmUgd2F5IGlzIHRvIGNvcHkgdGhlIHNldCBlbnRyaWVzIGludG8KLQkJICogYW5vdGhlciBzbWFsbCB0YWJsZSBmaXJzdC4KLQkJICovCi0JCW1lbWNweShzbWFsbF9jb3B5LCB0YWJsZSwgc2l6ZW9mKHNtYWxsX2NvcHkpKTsKLQkJdGFibGUgPSBzbWFsbF9jb3B5OwotCQlFTVBUWV9UT19NSU5TSVpFKHNvKTsKLQl9Ci0JLyogZWxzZSBpdCdzIGEgc21hbGwgdGFibGUgdGhhdCdzIGFscmVhZHkgZW1wdHkgKi8KKyAgICBlbHNlIGlmIChmaWxsID4gMCkgeworICAgICAgICAvKiBJdCdzIGEgc21hbGwgdGFibGUgd2l0aCBzb21ldGhpbmcgdGhhdCBuZWVkcyB0byBiZSBjbGVhcmVkLgorICAgICAgICAgKiBBZnJhaWQgdGhlIG9ubHkgc2FmZSB3YXkgaXMgdG8gY29weSB0aGUgc2V0IGVudHJpZXMgaW50bworICAgICAgICAgKiBhbm90aGVyIHNtYWxsIHRhYmxlIGZpcnN0LgorICAgICAgICAgKi8KKyAgICAgICAgbWVtY3B5KHNtYWxsX2NvcHksIHRhYmxlLCBzaXplb2Yoc21hbGxfY29weSkpOworICAgICAgICB0YWJsZSA9IHNtYWxsX2NvcHk7CisgICAgICAgIEVNUFRZX1RPX01JTlNJWkUoc28pOworICAgIH0KKyAgICAvKiBlbHNlIGl0J3MgYSBzbWFsbCB0YWJsZSB0aGF0J3MgYWxyZWFkeSBlbXB0eSAqLwogCi0JLyogTm93IHdlIGNhbiBmaW5hbGx5IGNsZWFyIHRoaW5ncy4gIElmIEMgaGFkIHJlZmNvdW50cywgd2UgY291bGQKLQkgKiBhc3NlcnQgdGhhdCB0aGUgcmVmY291bnQgb24gdGFibGUgaXMgMSBub3csIGkuZS4gdGhhdCB0aGlzIGZ1bmN0aW9uCi0JICogaGFzIHVuaXF1ZSBhY2Nlc3MgdG8gaXQsIHNvIGRlY3JlZiBzaWRlLWVmZmVjdHMgY2FuJ3QgYWx0ZXIgaXQuCi0JICovCi0JZm9yIChlbnRyeSA9IHRhYmxlOyBmaWxsID4gMDsgKytlbnRyeSkgeworICAgIC8qIE5vdyB3ZSBjYW4gZmluYWxseSBjbGVhciB0aGluZ3MuICBJZiBDIGhhZCByZWZjb3VudHMsIHdlIGNvdWxkCisgICAgICogYXNzZXJ0IHRoYXQgdGhlIHJlZmNvdW50IG9uIHRhYmxlIGlzIDEgbm93LCBpLmUuIHRoYXQgdGhpcyBmdW5jdGlvbgorICAgICAqIGhhcyB1bmlxdWUgYWNjZXNzIHRvIGl0LCBzbyBkZWNyZWYgc2lkZS1lZmZlY3RzIGNhbid0IGFsdGVyIGl0LgorICAgICAqLworICAgIGZvciAoZW50cnkgPSB0YWJsZTsgZmlsbCA+IDA7ICsrZW50cnkpIHsKICNpZmRlZiBQeV9ERUJVRwotCQlhc3NlcnQoaSA8IG4pOwotCQkrK2k7CisgICAgICAgIGFzc2VydChpIDwgbik7CisgICAgICAgICsraTsKICNlbmRpZgotCQlpZiAoZW50cnktPmtleSkgewotCQkJLS1maWxsOwotCQkJUHlfREVDUkVGKGVudHJ5LT5rZXkpOwotCQl9CisgICAgICAgIGlmIChlbnRyeS0+a2V5KSB7CisgICAgICAgICAgICAtLWZpbGw7CisgICAgICAgICAgICBQeV9ERUNSRUYoZW50cnktPmtleSk7CisgICAgICAgIH0KICNpZmRlZiBQeV9ERUJVRwotCQllbHNlCi0JCQlhc3NlcnQoZW50cnktPmtleSA9PSBOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNzZXJ0KGVudHJ5LT5rZXkgPT0gTlVMTCk7CiAjZW5kaWYKLQl9CisgICAgfQogCi0JaWYgKHRhYmxlX2lzX21hbGxvY2VkKQotCQlQeU1lbV9ERUwodGFibGUpOwotCXJldHVybiAwOworICAgIGlmICh0YWJsZV9pc19tYWxsb2NlZCkKKyAgICAgICAgUHlNZW1fREVMKHRhYmxlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTUyMiwyMzYgKzUyMiwyMzYgQEAKICAqICAgICB9CiAgKgogICogQ0FVVElPTjogIEluIGdlbmVyYWwsIGl0IGlzbid0IHNhZmUgdG8gdXNlIHNldF9uZXh0IGluIGEgbG9vcCB0aGF0Ci0gKiBtdXRhdGVzIHRoZSB0YWJsZS4gIAorICogbXV0YXRlcyB0aGUgdGFibGUuCiAgKi8KIHN0YXRpYyBpbnQKIHNldF9uZXh0KFB5U2V0T2JqZWN0ICpzbywgUHlfc3NpemVfdCAqcG9zX3B0ciwgc2V0ZW50cnkgKiplbnRyeV9wdHIpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3QgbWFzazsKLQlyZWdpc3RlciBzZXRlbnRyeSAqdGFibGU7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgbWFzazsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqdGFibGU7CiAKLQlhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7Ci0JaSA9ICpwb3NfcHRyOwotCWFzc2VydChpID49IDApOwotCXRhYmxlID0gc28tPnRhYmxlOwotCW1hc2sgPSBzby0+bWFzazsKLQl3aGlsZSAoaSA8PSBtYXNrICYmICh0YWJsZVtpXS5rZXkgPT0gTlVMTCB8fCB0YWJsZVtpXS5rZXkgPT0gZHVtbXkpKQotCQlpKys7Ci0JKnBvc19wdHIgPSBpKzE7Ci0JaWYgKGkgPiBtYXNrKQotCQlyZXR1cm4gMDsKLQlhc3NlcnQodGFibGVbaV0ua2V5ICE9IE5VTEwpOwotCSplbnRyeV9wdHIgPSAmdGFibGVbaV07Ci0JcmV0dXJuIDE7CisgICAgYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOworICAgIGkgPSAqcG9zX3B0cjsKKyAgICBhc3NlcnQoaSA+PSAwKTsKKyAgICB0YWJsZSA9IHNvLT50YWJsZTsKKyAgICBtYXNrID0gc28tPm1hc2s7CisgICAgd2hpbGUgKGkgPD0gbWFzayAmJiAodGFibGVbaV0ua2V5ID09IE5VTEwgfHwgdGFibGVbaV0ua2V5ID09IGR1bW15KSkKKyAgICAgICAgaSsrOworICAgICpwb3NfcHRyID0gaSsxOworICAgIGlmIChpID4gbWFzaykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYXNzZXJ0KHRhYmxlW2ldLmtleSAhPSBOVUxMKTsKKyAgICAqZW50cnlfcHRyID0gJnRhYmxlW2ldOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogc2V0X2RlYWxsb2MoUHlTZXRPYmplY3QgKnNvKQogewotCXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKLQlQeV9zc2l6ZV90IGZpbGwgPSBzby0+ZmlsbDsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHNvKTsKLQlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHNvKQotCWlmIChzby0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgc28pOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeV9zc2l6ZV90IGZpbGwgPSBzby0+ZmlsbDsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHNvKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHNvKQorICAgIGlmIChzby0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgc28pOwogCi0JZm9yIChlbnRyeSA9IHNvLT50YWJsZTsgZmlsbCA+IDA7IGVudHJ5KyspIHsKLQkJaWYgKGVudHJ5LT5rZXkpIHsKLQkJCS0tZmlsbDsKLQkJCVB5X0RFQ1JFRihlbnRyeS0+a2V5KTsKLQkJfQotCX0KLQlpZiAoc28tPnRhYmxlICE9IHNvLT5zbWFsbHRhYmxlKQotCQlQeU1lbV9ERUwoc28tPnRhYmxlKTsKLQlpZiAobnVtZnJlZSA8IFB5U2V0X01BWEZSRUVMSVNUICYmIFB5QW55U2V0X0NoZWNrRXhhY3Qoc28pKQotCQlmcmVlX2xpc3RbbnVtZnJlZSsrXSA9IHNvOwotCWVsc2UgCi0JCVB5X1RZUEUoc28pLT50cF9mcmVlKHNvKTsKLQlQeV9UUkFTSENBTl9TQUZFX0VORChzbykKKyAgICBmb3IgKGVudHJ5ID0gc28tPnRhYmxlOyBmaWxsID4gMDsgZW50cnkrKykgeworICAgICAgICBpZiAoZW50cnktPmtleSkgeworICAgICAgICAgICAgLS1maWxsOworICAgICAgICAgICAgUHlfREVDUkVGKGVudHJ5LT5rZXkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzby0+dGFibGUgIT0gc28tPnNtYWxsdGFibGUpCisgICAgICAgIFB5TWVtX0RFTChzby0+dGFibGUpOworICAgIGlmIChudW1mcmVlIDwgUHlTZXRfTUFYRlJFRUxJU1QgJiYgUHlBbnlTZXRfQ2hlY2tFeGFjdChzbykpCisgICAgICAgIGZyZWVfbGlzdFtudW1mcmVlKytdID0gc287CisgICAgZWxzZQorICAgICAgICBQeV9UWVBFKHNvKS0+dHBfZnJlZShzbyk7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQoc28pCiB9CiAKIHN0YXRpYyBpbnQKIHNldF90cF9wcmludChQeVNldE9iamVjdCAqc28sIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiB7Ci0Jc2V0ZW50cnkgKmVudHJ5OwotCVB5X3NzaXplX3QgcG9zPTA7Ci0JY2hhciAqZW1pdCA9ICIiOwkvKiBObyBzZXBhcmF0b3IgZW1pdHRlZCBvbiBmaXJzdCBwYXNzICovCi0JY2hhciAqc2VwYXJhdG9yID0gIiwgIjsKLQlpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopc28pOworICAgIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeV9zc2l6ZV90IHBvcz0wOworICAgIGNoYXIgKmVtaXQgPSAiIjsgICAgICAgICAgICAvKiBObyBzZXBhcmF0b3IgZW1pdHRlZCBvbiBmaXJzdCBwYXNzICovCisgICAgY2hhciAqc2VwYXJhdG9yID0gIiwgIjsKKyAgICBpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopc28pOwogCi0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlmcHJpbnRmKGZwLCAiJXMoLi4uKSIsIHNvLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJcmV0dXJuIDA7Ci0JfSAgICAgICAgCisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHJpbnRmKGZwLCAiJXMoLi4uKSIsIHNvLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICIlcyhbIiwgc28tPm9iX3R5cGUtPnRwX25hbWUpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0Jd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnB1dHMoZW1pdCwgZnApOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQllbWl0ID0gc2VwYXJhdG9yOwotCQlpZiAoUHlPYmplY3RfUHJpbnQoZW50cnktPmtleSwgZnAsIDApICE9IDApIHsKLQkJCVB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKXNvKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnB1dHMoIl0pIiwgZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlfUmVwckxlYXZlKChQeU9iamVjdCopc28pOyAgICAgICAgCi0JcmV0dXJuIDA7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICIlcyhbIiwgc28tPm9iX3R5cGUtPnRwX25hbWUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZnB1dHMoZW1pdCwgZnApOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBlbWl0ID0gc2VwYXJhdG9yOworICAgICAgICBpZiAoUHlPYmplY3RfUHJpbnQoZW50cnktPmtleSwgZnAsIDApICE9IDApIHsKKyAgICAgICAgICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKXNvKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnB1dHMoIl0pIiwgZnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCopc28pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3JlcHIoUHlTZXRPYmplY3QgKnNvKQogewotCVB5T2JqZWN0ICprZXlzLCAqcmVzdWx0PU5VTEwsICpsaXN0cmVwcjsKLQlpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopc28pOworICAgIFB5T2JqZWN0ICprZXlzLCAqcmVzdWx0PU5VTEwsICpsaXN0cmVwcjsKKyAgICBpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopc28pOwogCi0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCIlcyguLi4pIiwgc28tPm9iX3R5cGUtPnRwX25hbWUpOwotCX0KKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKC4uLikiLCBzby0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgfQogCi0Ja2V5cyA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilzbyk7Ci0JaWYgKGtleXMgPT0gTlVMTCkKLQkJZ290byBkb25lOwotCWxpc3RyZXByID0gUHlPYmplY3RfUmVwcihrZXlzKTsKLQlQeV9ERUNSRUYoa2V5cyk7Ci0JaWYgKGxpc3RyZXByID09IE5VTEwpCi0JCWdvdG8gZG9uZTsKKyAgICBrZXlzID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKXNvKTsKKyAgICBpZiAoa2V5cyA9PSBOVUxMKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgbGlzdHJlcHIgPSBQeU9iamVjdF9SZXByKGtleXMpOworICAgIFB5X0RFQ1JFRihrZXlzKTsKKyAgICBpZiAobGlzdHJlcHIgPT0gTlVMTCkKKyAgICAgICAgZ290byBkb25lOwogCi0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJXMpIiwgc28tPm9iX3R5cGUtPnRwX25hbWUsCi0JCVB5U3RyaW5nX0FTX1NUUklORyhsaXN0cmVwcikpOwotCVB5X0RFQ1JFRihsaXN0cmVwcik7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJXMpIiwgc28tPm9iX3R5cGUtPnRwX25hbWUsCisgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhsaXN0cmVwcikpOworICAgIFB5X0RFQ1JFRihsaXN0cmVwcik7CiBkb25lOgotCVB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKXNvKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKXNvKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogc2V0X2xlbihQeU9iamVjdCAqc28pCiB7Ci0JcmV0dXJuICgoUHlTZXRPYmplY3QgKilzbyktPnVzZWQ7CisgICAgcmV0dXJuICgoUHlTZXRPYmplY3QgKilzbyktPnVzZWQ7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF9tZXJnZShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcnNldCkKIHsKLQlQeVNldE9iamVjdCAqb3RoZXI7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeVNldE9iamVjdCAqb3RoZXI7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKIAotCWFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKLQlhc3NlcnQgKFB5QW55U2V0X0NoZWNrKG90aGVyc2V0KSk7CisgICAgYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOworICAgIGFzc2VydCAoUHlBbnlTZXRfQ2hlY2sob3RoZXJzZXQpKTsKIAotCW90aGVyID0gKFB5U2V0T2JqZWN0KilvdGhlcnNldDsKLQlpZiAob3RoZXIgPT0gc28gfHwgb3RoZXItPnVzZWQgPT0gMCkKLQkJLyogYS51cGRhdGUoYSkgb3IgYS51cGRhdGUoe30pOyBub3RoaW5nIHRvIGRvICovCi0JCXJldHVybiAwOwotCS8qIERvIG9uZSBiaWcgcmVzaXplIGF0IHRoZSBzdGFydCwgcmF0aGVyIHRoYW4KLQkgKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcga2V5cy4gIEV4cGVjdAotCSAqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgotCSAqLwotCWlmICgoc28tPmZpbGwgKyBvdGhlci0+dXNlZCkqMyA+PSAoc28tPm1hc2srMSkqMikgewotCSAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCAoc28tPnVzZWQgKyBvdGhlci0+dXNlZCkqMikgIT0gMCkKLQkJICAgcmV0dXJuIC0xOwotCX0KLQlmb3IgKGkgPSAwOyBpIDw9IG90aGVyLT5tYXNrOyBpKyspIHsKLQkJZW50cnkgPSAmb3RoZXItPnRhYmxlW2ldOwotCQlpZiAoZW50cnktPmtleSAhPSBOVUxMICYmIAotCQkgICAgZW50cnktPmtleSAhPSBkdW1teSkgewotCQkJUHlfSU5DUkVGKGVudHJ5LT5rZXkpOwotCQkJaWYgKHNldF9pbnNlcnRfa2V5KHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCkgPT0gLTEpIHsKLQkJCQlQeV9ERUNSRUYoZW50cnktPmtleSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOworICAgIG90aGVyID0gKFB5U2V0T2JqZWN0KilvdGhlcnNldDsKKyAgICBpZiAob3RoZXIgPT0gc28gfHwgb3RoZXItPnVzZWQgPT0gMCkKKyAgICAgICAgLyogYS51cGRhdGUoYSkgb3IgYS51cGRhdGUoe30pOyBub3RoaW5nIHRvIGRvICovCisgICAgICAgIHJldHVybiAwOworICAgIC8qIERvIG9uZSBiaWcgcmVzaXplIGF0IHRoZSBzdGFydCwgcmF0aGVyIHRoYW4KKyAgICAgKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcga2V5cy4gIEV4cGVjdAorICAgICAqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgorICAgICAqLworICAgIGlmICgoc28tPmZpbGwgKyBvdGhlci0+dXNlZCkqMyA+PSAoc28tPm1hc2srMSkqMikgeworICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCAoc28tPnVzZWQgKyBvdGhlci0+dXNlZCkqMikgIT0gMCkKKyAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDw9IG90aGVyLT5tYXNrOyBpKyspIHsKKyAgICAgICAgZW50cnkgPSAmb3RoZXItPnRhYmxlW2ldOworICAgICAgICBpZiAoZW50cnktPmtleSAhPSBOVUxMICYmCisgICAgICAgICAgICBlbnRyeS0+a2V5ICE9IGR1bW15KSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZW50cnktPmtleSk7CisgICAgICAgICAgICBpZiAoc2V0X2luc2VydF9rZXkoc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbnRyeS0+a2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF9jb250YWluc19rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotCWxvbmcgaGFzaDsKLQlzZXRlbnRyeSAqZW50cnk7CisgICAgbG9uZyBoYXNoOworICAgIHNldGVudHJ5ICplbnRyeTsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8Ci0JICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKLQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWVudHJ5ID0gKHNvLT5sb29rdXApKHNvLCBrZXksIGhhc2gpOwotCWlmIChlbnRyeSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0Ja2V5ID0gZW50cnktPmtleTsKLQlyZXR1cm4ga2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15OworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVudHJ5ID0gKHNvLT5sb29rdXApKHNvLCBrZXksIGhhc2gpOworICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAga2V5ID0gZW50cnktPmtleTsKKyAgICByZXR1cm4ga2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15OwogfQogCiBzdGF0aWMgaW50CiBzZXRfY29udGFpbnNfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBzZXRlbnRyeSAqZW50cnkpCiB7Ci0JUHlPYmplY3QgKmtleTsKLQlzZXRlbnRyeSAqbHVfZW50cnk7CisgICAgUHlPYmplY3QgKmtleTsKKyAgICBzZXRlbnRyeSAqbHVfZW50cnk7CiAKLQlsdV9lbnRyeSA9IChzby0+bG9va3VwKShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOwotCWlmIChsdV9lbnRyeSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0Ja2V5ID0gbHVfZW50cnktPmtleTsgCi0JcmV0dXJuIGtleSAhPSBOVUxMICYmIGtleSAhPSBkdW1teTsKKyAgICBsdV9lbnRyeSA9IChzby0+bG9va3VwKShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgIGlmIChsdV9lbnRyeSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAga2V5ID0gbHVfZW50cnktPmtleTsKKyAgICByZXR1cm4ga2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3BvcChQeVNldE9iamVjdCAqc28pCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpID0gMDsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7Ci0JUHlPYmplY3QgKmtleTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGkgPSAwOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeU9iamVjdCAqa2V5OwogCi0JYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOwotCWlmIChzby0+dXNlZCA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgInBvcCBmcm9tIGFuIGVtcHR5IHNldCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOworICAgIGlmIChzby0+dXNlZCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgInBvcCBmcm9tIGFuIGVtcHR5IHNldCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBTZXQgZW50cnkgdG8gInRoZSBmaXJzdCIgdW51c2VkIG9yIGR1bW15IHNldCBlbnRyeS4gIFdlIGFidXNlCi0JICogdGhlIGhhc2ggZmllbGQgb2Ygc2xvdCAwIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyOgotCSAqIElmIHNsb3QgMCBoYXMgYSB2YWx1ZSwgdXNlIHNsb3QgMC4KLQkgKiBFbHNlIHNsb3QgMCBpcyBiZWluZyB1c2VkIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyLAotCSAqIGFuZCB3ZSB1c2UgaXRzIGhhc2ggdmFsdWUgYXMgdGhlIGZpcnN0IGluZGV4IHRvIGxvb2suCi0JICovCi0JZW50cnkgPSAmc28tPnRhYmxlWzBdOwotCWlmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBkdW1teSkgewotCQlpID0gZW50cnktPmhhc2g7Ci0JCS8qIFRoZSBoYXNoIGZpZWxkIG1heSBiZSBhIHJlYWwgaGFzaCB2YWx1ZSwgb3IgaXQgbWF5IGJlIGEKLQkJICogbGVnaXQgc2VhcmNoIGZpbmdlciwgb3IgaXQgbWF5IGJlIGEgb25jZS1sZWdpdCBzZWFyY2gKLQkJICogZmluZ2VyIHRoYXQncyBvdXQgb2YgYm91bmRzIG5vdyBiZWNhdXNlIGl0IHdyYXBwZWQgYXJvdW5kCi0JCSAqIG9yIHRoZSB0YWJsZSBzaHJ1bmsgLS0gc2ltcGx5IG1ha2Ugc3VyZSBpdCdzIGluIGJvdW5kcyBub3cuCi0JCSAqLwotCQlpZiAoaSA+IHNvLT5tYXNrIHx8IGkgPCAxKQotCQkJaSA9IDE7CS8qIHNraXAgc2xvdCAwICovCi0JCXdoaWxlICgoZW50cnkgPSAmc28tPnRhYmxlW2ldKS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleT09ZHVtbXkpIHsKLQkJCWkrKzsKLQkJCWlmIChpID4gc28tPm1hc2spCi0JCQkJaSA9IDE7Ci0JCX0KLQl9Ci0Ja2V5ID0gZW50cnktPmtleTsKLQlQeV9JTkNSRUYoZHVtbXkpOwotCWVudHJ5LT5rZXkgPSBkdW1teTsKLQlzby0+dXNlZC0tOwotCXNvLT50YWJsZVswXS5oYXNoID0gaSArIDE7ICAvKiBuZXh0IHBsYWNlIHRvIHN0YXJ0ICovCi0JcmV0dXJuIGtleTsKKyAgICAvKiBTZXQgZW50cnkgdG8gInRoZSBmaXJzdCIgdW51c2VkIG9yIGR1bW15IHNldCBlbnRyeS4gIFdlIGFidXNlCisgICAgICogdGhlIGhhc2ggZmllbGQgb2Ygc2xvdCAwIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyOgorICAgICAqIElmIHNsb3QgMCBoYXMgYSB2YWx1ZSwgdXNlIHNsb3QgMC4KKyAgICAgKiBFbHNlIHNsb3QgMCBpcyBiZWluZyB1c2VkIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyLAorICAgICAqIGFuZCB3ZSB1c2UgaXRzIGhhc2ggdmFsdWUgYXMgdGhlIGZpcnN0IGluZGV4IHRvIGxvb2suCisgICAgICovCisgICAgZW50cnkgPSAmc28tPnRhYmxlWzBdOworICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBkdW1teSkgeworICAgICAgICBpID0gZW50cnktPmhhc2g7CisgICAgICAgIC8qIFRoZSBoYXNoIGZpZWxkIG1heSBiZSBhIHJlYWwgaGFzaCB2YWx1ZSwgb3IgaXQgbWF5IGJlIGEKKyAgICAgICAgICogbGVnaXQgc2VhcmNoIGZpbmdlciwgb3IgaXQgbWF5IGJlIGEgb25jZS1sZWdpdCBzZWFyY2gKKyAgICAgICAgICogZmluZ2VyIHRoYXQncyBvdXQgb2YgYm91bmRzIG5vdyBiZWNhdXNlIGl0IHdyYXBwZWQgYXJvdW5kCisgICAgICAgICAqIG9yIHRoZSB0YWJsZSBzaHJ1bmsgLS0gc2ltcGx5IG1ha2Ugc3VyZSBpdCdzIGluIGJvdW5kcyBub3cuCisgICAgICAgICAqLworICAgICAgICBpZiAoaSA+IHNvLT5tYXNrIHx8IGkgPCAxKQorICAgICAgICAgICAgaSA9IDE7ICAgICAgICAgICAgICAvKiBza2lwIHNsb3QgMCAqLworICAgICAgICB3aGlsZSAoKGVudHJ5ID0gJnNvLT50YWJsZVtpXSktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXk9PWR1bW15KSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZiAoaSA+IHNvLT5tYXNrKQorICAgICAgICAgICAgICAgIGkgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGtleSA9IGVudHJ5LT5rZXk7CisgICAgUHlfSU5DUkVGKGR1bW15KTsKKyAgICBlbnRyeS0+a2V5ID0gZHVtbXk7CisgICAgc28tPnVzZWQtLTsKKyAgICBzby0+dGFibGVbMF0uaGFzaCA9IGkgKyAxOyAgLyogbmV4dCBwbGFjZSB0byBzdGFydCAqLworICAgIHJldHVybiBrZXk7CiB9CiAKIFB5RG9jX1NUUlZBUihwb3BfZG9jLCAiUmVtb3ZlIGFuZCByZXR1cm4gYW4gYXJiaXRyYXJ5IHNldCBlbGVtZW50LlxuXApAQCAtNzYwLDI3NyArNzYwLDI3NyBAQAogc3RhdGljIGludAogc2V0X3RyYXZlcnNlKFB5U2V0T2JqZWN0ICpzbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOwotCXNldGVudHJ5ICplbnRyeTsKKyAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgc2V0ZW50cnkgKmVudHJ5OwogCi0Jd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKQotCQlQeV9WSVNJVChlbnRyeS0+a2V5KTsKLQlyZXR1cm4gMDsKKyAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpCisgICAgICAgIFB5X1ZJU0lUKGVudHJ5LT5rZXkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgbG9uZwogZnJvemVuc2V0X2hhc2goUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlTZXRPYmplY3QgKnNvID0gKFB5U2V0T2JqZWN0ICopc2VsZjsKLQlsb25nIGgsIGhhc2ggPSAxOTI3ODY4MjM3TDsKLQlzZXRlbnRyeSAqZW50cnk7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5U2V0T2JqZWN0ICpzbyA9IChQeVNldE9iamVjdCAqKXNlbGY7CisgICAgbG9uZyBoLCBoYXNoID0gMTkyNzg2ODIzN0w7CisgICAgc2V0ZW50cnkgKmVudHJ5OworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAotCWlmIChzby0+aGFzaCAhPSAtMSkKLQkJcmV0dXJuIHNvLT5oYXNoOworICAgIGlmIChzby0+aGFzaCAhPSAtMSkKKyAgICAgICAgcmV0dXJuIHNvLT5oYXNoOwogCi0JaGFzaCAqPSBQeVNldF9HRVRfU0laRShzZWxmKSArIDE7Ci0Jd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0JCS8qIFdvcmsgdG8gaW5jcmVhc2UgdGhlIGJpdCBkaXNwZXJzaW9uIGZvciBjbG9zZWx5IHNwYWNlZCBoYXNoCi0JCSAgIHZhbHVlcy4gIFRoZSBpcyBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHVzZSBjYXNlcyBoYXZlIG1hbnkgCi0JCSAgIGNvbWJpbmF0aW9ucyBvZiBhIHNtYWxsIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIG5lYXJieSAKLQkJICAgaGFzaGVzIHNvIHRoYXQgbWFueSBkaXN0aW5jdCBjb21iaW5hdGlvbnMgY29sbGFwc2UgdG8gb25seSAKLQkJICAgYSBoYW5kZnVsIG9mIGRpc3RpbmN0IGhhc2ggdmFsdWVzLiAqLwotCQloID0gZW50cnktPmhhc2g7Ci0JCWhhc2ggXj0gKGggXiAoaCA8PCAxNikgXiA4OTg2OTc0N0wpICAqIDM2NDQ3OTgxNjd1OwotCX0KLQloYXNoID0gaGFzaCAqIDY5MDY5TCArIDkwNzEzMzkyM0w7Ci0JaWYgKGhhc2ggPT0gLTEpCi0JCWhhc2ggPSA1OTA5MjM3MTNMOwotCXNvLT5oYXNoID0gaGFzaDsKLQlyZXR1cm4gaGFzaDsKKyAgICBoYXNoICo9IFB5U2V0X0dFVF9TSVpFKHNlbGYpICsgMTsKKyAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKKyAgICAgICAgLyogV29yayB0byBpbmNyZWFzZSB0aGUgYml0IGRpc3BlcnNpb24gZm9yIGNsb3NlbHkgc3BhY2VkIGhhc2gKKyAgICAgICAgICAgdmFsdWVzLiAgVGhlIGlzIGltcG9ydGFudCBiZWNhdXNlIHNvbWUgdXNlIGNhc2VzIGhhdmUgbWFueQorICAgICAgICAgICBjb21iaW5hdGlvbnMgb2YgYSBzbWFsbCBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBuZWFyYnkKKyAgICAgICAgICAgaGFzaGVzIHNvIHRoYXQgbWFueSBkaXN0aW5jdCBjb21iaW5hdGlvbnMgY29sbGFwc2UgdG8gb25seQorICAgICAgICAgICBhIGhhbmRmdWwgb2YgZGlzdGluY3QgaGFzaCB2YWx1ZXMuICovCisgICAgICAgIGggPSBlbnRyeS0+aGFzaDsKKyAgICAgICAgaGFzaCBePSAoaCBeIChoIDw8IDE2KSBeIDg5ODY5NzQ3TCkgICogMzY0NDc5ODE2N3U7CisgICAgfQorICAgIGhhc2ggPSBoYXNoICogNjkwNjlMICsgOTA3MTMzOTIzTDsKKyAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgaGFzaCA9IDU5MDkyMzcxM0w7CisgICAgc28tPmhhc2ggPSBoYXNoOworICAgIHJldHVybiBoYXNoOwogfQogCiAvKioqKiogU2V0IGl0ZXJhdG9yIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlTZXRPYmplY3QgKnNpX3NldDsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KLQlQeV9zc2l6ZV90IHNpX3VzZWQ7Ci0JUHlfc3NpemVfdCBzaV9wb3M7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5U2V0T2JqZWN0ICpzaV9zZXQ7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlfc3NpemVfdCBzaV91c2VkOworICAgIFB5X3NzaXplX3Qgc2lfcG9zOworICAgIFB5X3NzaXplX3QgbGVuOwogfSBzZXRpdGVyb2JqZWN0OwogCiBzdGF0aWMgdm9pZAogc2V0aXRlcl9kZWFsbG9jKHNldGl0ZXJvYmplY3QgKnNpKQogewotCVB5X1hERUNSRUYoc2ktPnNpX3NldCk7Ci0JUHlPYmplY3RfR0NfRGVsKHNpKTsKKyAgICBQeV9YREVDUkVGKHNpLT5zaV9zZXQpOworICAgIFB5T2JqZWN0X0dDX0RlbChzaSk7CiB9CiAKIHN0YXRpYyBpbnQKIHNldGl0ZXJfdHJhdmVyc2Uoc2V0aXRlcm9iamVjdCAqc2ksIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNpLT5zaV9zZXQpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNpLT5zaV9zZXQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0aXRlcl9sZW4oc2V0aXRlcm9iamVjdCAqc2kpCiB7Ci0JUHlfc3NpemVfdCBsZW4gPSAwOwotCWlmIChzaS0+c2lfc2V0ICE9IE5VTEwgJiYgc2ktPnNpX3VzZWQgPT0gc2ktPnNpX3NldC0+dXNlZCkKLQkJbGVuID0gc2ktPmxlbjsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobGVuKTsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IDA7CisgICAgaWYgKHNpLT5zaV9zZXQgIT0gTlVMTCAmJiBzaS0+c2lfdXNlZCA9PSBzaS0+c2lfc2V0LT51c2VkKQorICAgICAgICBsZW4gPSBzaS0+bGVuOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhsZW4pOwogfQogCiBQeURvY19TVFJWQVIobGVuZ3RoX2hpbnRfZG9jLCAiUHJpdmF0ZSBtZXRob2QgcmV0dXJuaW5nIGFuIGVzdGltYXRlIG9mIGxlbihsaXN0KGl0KSkuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzZXRpdGVyX21ldGhvZHNbXSA9IHsKLQl7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilzZXRpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pc2V0aXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKnNldGl0ZXJfaXRlcm5leHQoc2V0aXRlcm9iamVjdCAqc2kpCiB7Ci0JUHlPYmplY3QgKmtleTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGksIG1hc2s7Ci0JcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OwotCVB5U2V0T2JqZWN0ICpzbyA9IHNpLT5zaV9zZXQ7CisgICAgUHlPYmplY3QgKmtleTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIG1hc2s7CisgICAgcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OworICAgIFB5U2V0T2JqZWN0ICpzbyA9IHNpLT5zaV9zZXQ7CiAKLQlpZiAoc28gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOworICAgIGlmIChzbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CiAKLQlpZiAoc2ktPnNpX3VzZWQgIT0gc28tPnVzZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiU2V0IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7Ci0JCXNpLT5zaV91c2VkID0gLTE7IC8qIE1ha2UgdGhpcyBzdGF0ZSBzdGlja3kgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzaS0+c2lfdXNlZCAhPSBzby0+dXNlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNldCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICBzaS0+c2lfdXNlZCA9IC0xOyAvKiBNYWtlIHRoaXMgc3RhdGUgc3RpY2t5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWkgPSBzaS0+c2lfcG9zOwotCWFzc2VydChpPj0wKTsKLQllbnRyeSA9IHNvLT50YWJsZTsKLQltYXNrID0gc28tPm1hc2s7Ci0Jd2hpbGUgKGkgPD0gbWFzayAmJiAoZW50cnlbaV0ua2V5ID09IE5VTEwgfHwgZW50cnlbaV0ua2V5ID09IGR1bW15KSkKLQkJaSsrOwotCXNpLT5zaV9wb3MgPSBpKzE7Ci0JaWYgKGkgPiBtYXNrKQotCQlnb3RvIGZhaWw7Ci0Jc2ktPmxlbi0tOwotCWtleSA9IGVudHJ5W2ldLmtleTsKLQlQeV9JTkNSRUYoa2V5KTsKLQlyZXR1cm4ga2V5OworICAgIGkgPSBzaS0+c2lfcG9zOworICAgIGFzc2VydChpPj0wKTsKKyAgICBlbnRyeSA9IHNvLT50YWJsZTsKKyAgICBtYXNrID0gc28tPm1hc2s7CisgICAgd2hpbGUgKGkgPD0gbWFzayAmJiAoZW50cnlbaV0ua2V5ID09IE5VTEwgfHwgZW50cnlbaV0ua2V5ID09IGR1bW15KSkKKyAgICAgICAgaSsrOworICAgIHNpLT5zaV9wb3MgPSBpKzE7CisgICAgaWYgKGkgPiBtYXNrKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgc2ktPmxlbi0tOworICAgIGtleSA9IGVudHJ5W2ldLmtleTsKKyAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICByZXR1cm4ga2V5OwogCiBmYWlsOgotCVB5X0RFQ1JFRihzbyk7Ci0Jc2ktPnNpX3NldCA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHNvKTsKKyAgICBzaS0+c2lfc2V0ID0gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeVNldEl0ZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJzZXRpdGVyYXRvciIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2Yoc2V0aXRlcm9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXNldGl0ZXJfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYylzZXRpdGVyX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLSAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpc2V0aXRlcl9pdGVybmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0Jc2V0aXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAorICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInNldGl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHNldGl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXNldGl0ZXJfZGVhbGxvYywgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2Mpc2V0aXRlcl90cmF2ZXJzZSwgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXNldGl0ZXJfaXRlcm5leHQsICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc2V0aXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaXRlcihQeVNldE9iamVjdCAqc28pCiB7Ci0Jc2V0aXRlcm9iamVjdCAqc2kgPSBQeU9iamVjdF9HQ19OZXcoc2V0aXRlcm9iamVjdCwgJlB5U2V0SXRlcl9UeXBlKTsKLQlpZiAoc2kgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKHNvKTsKLQlzaS0+c2lfc2V0ID0gc287Ci0Jc2ktPnNpX3VzZWQgPSBzby0+dXNlZDsKLQlzaS0+c2lfcG9zID0gMDsKLQlzaS0+bGVuID0gc28tPnVzZWQ7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKHNpKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2k7CisgICAgc2V0aXRlcm9iamVjdCAqc2kgPSBQeU9iamVjdF9HQ19OZXcoc2V0aXRlcm9iamVjdCwgJlB5U2V0SXRlcl9UeXBlKTsKKyAgICBpZiAoc2kgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKHNvKTsKKyAgICBzaS0+c2lfc2V0ID0gc287CisgICAgc2ktPnNpX3VzZWQgPSBzby0+dXNlZDsKKyAgICBzaS0+c2lfcG9zID0gMDsKKyAgICBzaS0+bGVuID0gc28tPnVzZWQ7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKHNpKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2k7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF91cGRhdGVfaW50ZXJuYWwoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKmtleSwgKml0OworICAgIFB5T2JqZWN0ICprZXksICppdDsKIAotCWlmIChQeUFueVNldF9DaGVjayhvdGhlcikpCi0JCXJldHVybiBzZXRfbWVyZ2Uoc28sIG90aGVyKTsKKyAgICBpZiAoUHlBbnlTZXRfQ2hlY2sob3RoZXIpKQorICAgICAgICByZXR1cm4gc2V0X21lcmdlKHNvLCBvdGhlcik7CiAKLQlpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7Ci0JCVB5T2JqZWN0ICp2YWx1ZTsKLQkJUHlfc3NpemVfdCBwb3MgPSAwOwotCQlsb25nIGhhc2g7Ci0JCVB5X3NzaXplX3QgZGljdHNpemUgPSBQeURpY3RfU2l6ZShvdGhlcik7CisgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgeworICAgICAgICBQeU9iamVjdCAqdmFsdWU7CisgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgbG9uZyBoYXNoOworICAgICAgICBQeV9zc2l6ZV90IGRpY3RzaXplID0gUHlEaWN0X1NpemUob3RoZXIpOwogCi0JCS8qIERvIG9uZSBiaWcgcmVzaXplIGF0IHRoZSBzdGFydCwgcmF0aGVyIHRoYW4KLQkJKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcga2V5cy4gIEV4cGVjdAotCQkqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgotCQkqLwotCQlpZiAoZGljdHNpemUgPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmICgoc28tPmZpbGwgKyBkaWN0c2l6ZSkqMyA+PSAoc28tPm1hc2srMSkqMikgewotCQkJaWYgKHNldF90YWJsZV9yZXNpemUoc28sIChzby0+dXNlZCArIGRpY3RzaXplKSoyKSAhPSAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQl3aGlsZSAoX1B5RGljdF9OZXh0KG90aGVyLCAmcG9zLCAma2V5LCAmdmFsdWUsICZoYXNoKSkgewotCQkJc2V0ZW50cnkgYW5fZW50cnk7CisgICAgICAgIC8qIERvIG9uZSBiaWcgcmVzaXplIGF0IHRoZSBzdGFydCwgcmF0aGVyIHRoYW4KKyAgICAgICAgKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcga2V5cy4gIEV4cGVjdAorICAgICAgICAqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgorICAgICAgICAqLworICAgICAgICBpZiAoZGljdHNpemUgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICgoc28tPmZpbGwgKyBkaWN0c2l6ZSkqMyA+PSAoc28tPm1hc2srMSkqMikgeworICAgICAgICAgICAgaWYgKHNldF90YWJsZV9yZXNpemUoc28sIChzby0+dXNlZCArIGRpY3RzaXplKSoyKSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoX1B5RGljdF9OZXh0KG90aGVyLCAmcG9zLCAma2V5LCAmdmFsdWUsICZoYXNoKSkgeworICAgICAgICAgICAgc2V0ZW50cnkgYW5fZW50cnk7CiAKLQkJCWFuX2VudHJ5Lmhhc2ggPSBoYXNoOwotCQkJYW5fZW50cnkua2V5ID0ga2V5OwotCQkJaWYgKHNldF9hZGRfZW50cnkoc28sICZhbl9lbnRyeSkgPT0gLTEpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgICAgIGFuX2VudHJ5Lmhhc2ggPSBoYXNoOworICAgICAgICAgICAgYW5fZW50cnkua2V5ID0ga2V5OworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sICZhbl9lbnRyeSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihvdGhlcik7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIob3RoZXIpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQl3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkX2tleShzbywga2V5KSA9PSAtMSkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0gCi0JCVB5X0RFQ1JFRihrZXkpOwotCX0KLQlQeV9ERUNSRUYoaXQpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNldF9hZGRfa2V5KHNvLCBrZXkpID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF91cGRhdGUoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZm9yIChpPTAgOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncykgOyBpKyspIHsKLQkJUHlPYmplY3QgKm90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJaWYgKHNldF91cGRhdGVfaW50ZXJuYWwoc28sIG90aGVyKSA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChzbywgb3RoZXIpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCi1QeURvY19TVFJWQVIodXBkYXRlX2RvYywgCitQeURvY19TVFJWQVIodXBkYXRlX2RvYywKICJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgdW5pb24gb2YgaXRzZWxmIGFuZCBvdGhlcnMuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlX25ld19zZXQoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqaXRlcmFibGUpCiB7Ci0JcmVnaXN0ZXIgUHlTZXRPYmplY3QgKnNvID0gTlVMTDsKKyAgICByZWdpc3RlciBQeVNldE9iamVjdCAqc28gPSBOVUxMOwogCi0JaWYgKGR1bW15ID09IE5VTEwpIHsgLyogQXV0by1pbml0aWFsaXplIGR1bW15ICovCi0JCWR1bW15ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPGR1bW15IGtleT4iKTsKLQkJaWYgKGR1bW15ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGR1bW15ID09IE5VTEwpIHsgLyogQXV0by1pbml0aWFsaXplIGR1bW15ICovCisgICAgICAgIGR1bW15ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPGR1bW15IGtleT4iKTsKKyAgICAgICAgaWYgKGR1bW15ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBjcmVhdGUgUHlTZXRPYmplY3Qgc3RydWN0dXJlICovCi0JaWYgKG51bWZyZWUgJiYKLQkgICAgKHR5cGUgPT0gJlB5U2V0X1R5cGUgIHx8ICB0eXBlID09ICZQeUZyb3plblNldF9UeXBlKSkgewotCQlzbyA9IGZyZWVfbGlzdFstLW51bWZyZWVdOwotCQlhc3NlcnQgKHNvICE9IE5VTEwgJiYgUHlBbnlTZXRfQ2hlY2tFeGFjdChzbykpOwotCQlQeV9UWVBFKHNvKSA9IHR5cGU7Ci0JCV9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopc28pOwotCQlFTVBUWV9UT19NSU5TSVpFKHNvKTsKLQkJUHlPYmplY3RfR0NfVHJhY2soc28pOwotCX0gZWxzZSB7Ci0JCXNvID0gKFB5U2V0T2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JCWlmIChzbyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCS8qIHRwX2FsbG9jIGhhcyBhbHJlYWR5IHplcm9lZCB0aGUgc3RydWN0dXJlICovCi0JCWFzc2VydChzby0+dGFibGUgPT0gTlVMTCAmJiBzby0+ZmlsbCA9PSAwICYmIHNvLT51c2VkID09IDApOwotCQlJTklUX05PTlpFUk9fU0VUX1NMT1RTKHNvKTsKLQl9CisgICAgLyogY3JlYXRlIFB5U2V0T2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGlmIChudW1mcmVlICYmCisgICAgICAgICh0eXBlID09ICZQeVNldF9UeXBlICB8fCAgdHlwZSA9PSAmUHlGcm96ZW5TZXRfVHlwZSkpIHsKKyAgICAgICAgc28gPSBmcmVlX2xpc3RbLS1udW1mcmVlXTsKKyAgICAgICAgYXNzZXJ0IChzbyAhPSBOVUxMICYmIFB5QW55U2V0X0NoZWNrRXhhY3Qoc28pKTsKKyAgICAgICAgUHlfVFlQRShzbykgPSB0eXBlOworICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKXNvKTsKKyAgICAgICAgRU1QVFlfVE9fTUlOU0laRShzbyk7CisgICAgICAgIFB5T2JqZWN0X0dDX1RyYWNrKHNvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbyA9IChQeVNldE9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgICAgICBpZiAoc28gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAvKiB0cF9hbGxvYyBoYXMgYWxyZWFkeSB6ZXJvZWQgdGhlIHN0cnVjdHVyZSAqLworICAgICAgICBhc3NlcnQoc28tPnRhYmxlID09IE5VTEwgJiYgc28tPmZpbGwgPT0gMCAmJiBzby0+dXNlZCA9PSAwKTsKKyAgICAgICAgSU5JVF9OT05aRVJPX1NFVF9TTE9UUyhzbyk7CisgICAgfQogCi0Jc28tPmxvb2t1cCA9IHNldF9sb29ra2V5X3N0cmluZzsKLQlzby0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIHNvLT5sb29rdXAgPSBzZXRfbG9va2tleV9zdHJpbmc7CisgICAgc28tPndlYWtyZWZsaXN0ID0gTlVMTDsKIAotCWlmIChpdGVyYWJsZSAhPSBOVUxMKSB7Ci0JCWlmIChzZXRfdXBkYXRlX2ludGVybmFsKHNvLCBpdGVyYWJsZSkgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihzbyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAoaXRlcmFibGUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChzbywgaXRlcmFibGUpID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc28pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopc287CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNvOwogfQogCiAvKiBUaGUgZW1wdHkgZnJvemVuc2V0IGlzIGEgc2luZ2xldG9uICovCkBAIC0xMDM5LDU2ICsxMDM5LDU2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZnJvemVuc2V0X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMLCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IE5VTEwsICpyZXN1bHQ7CiAKLQlpZiAodHlwZSA9PSAmUHlGcm96ZW5TZXRfVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImZyb3plbnNldCgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZQeUZyb3plblNldF9UeXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiZnJvemVuc2V0KCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIHR5cGUtPnRwX25hbWUsIDAsIDEsICZpdGVyYWJsZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgdHlwZS0+dHBfbmFtZSwgMCwgMSwgJml0ZXJhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodHlwZSAhPSAmUHlGcm96ZW5TZXRfVHlwZSkKLQkJcmV0dXJuIG1ha2VfbmV3X3NldCh0eXBlLCBpdGVyYWJsZSk7CisgICAgaWYgKHR5cGUgIT0gJlB5RnJvemVuU2V0X1R5cGUpCisgICAgICAgIHJldHVybiBtYWtlX25ld19zZXQodHlwZSwgaXRlcmFibGUpOwogCi0JaWYgKGl0ZXJhYmxlICE9IE5VTEwpIHsKLQkJLyogZnJvemVuc2V0KGYpIGlzIGlkZW1wb3RlbnQgKi8KLQkJaWYgKFB5RnJvemVuU2V0X0NoZWNrRXhhY3QoaXRlcmFibGUpKSB7Ci0JCQlQeV9JTkNSRUYoaXRlcmFibGUpOwotCQkJcmV0dXJuIGl0ZXJhYmxlOwotCQl9Ci0JCXJlc3VsdCA9IG1ha2VfbmV3X3NldCh0eXBlLCBpdGVyYWJsZSk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCB8fCBQeVNldF9HRVRfU0laRShyZXN1bHQpKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JfQotCS8qIFRoZSBlbXB0eSBmcm96ZW5zZXQgaXMgYSBzaW5nbGV0b24gKi8KLQlpZiAoZW1wdHlmcm96ZW5zZXQgPT0gTlVMTCkKLQkJZW1wdHlmcm96ZW5zZXQgPSBtYWtlX25ld19zZXQodHlwZSwgTlVMTCk7Ci0JUHlfWElOQ1JFRihlbXB0eWZyb3plbnNldCk7Ci0JcmV0dXJuIGVtcHR5ZnJvemVuc2V0OworICAgIGlmIChpdGVyYWJsZSAhPSBOVUxMKSB7CisgICAgICAgIC8qIGZyb3plbnNldChmKSBpcyBpZGVtcG90ZW50ICovCisgICAgICAgIGlmIChQeUZyb3plblNldF9DaGVja0V4YWN0KGl0ZXJhYmxlKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZXJhYmxlKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyYWJsZTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBtYWtlX25ld19zZXQodHlwZSwgaXRlcmFibGUpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwgfHwgUHlTZXRfR0VUX1NJWkUocmVzdWx0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICAvKiBUaGUgZW1wdHkgZnJvemVuc2V0IGlzIGEgc2luZ2xldG9uICovCisgICAgaWYgKGVtcHR5ZnJvemVuc2V0ID09IE5VTEwpCisgICAgICAgIGVtcHR5ZnJvemVuc2V0ID0gbWFrZV9uZXdfc2V0KHR5cGUsIE5VTEwpOworICAgIFB5X1hJTkNSRUYoZW1wdHlmcm96ZW5zZXQpOworICAgIHJldHVybiBlbXB0eWZyb3plbnNldDsKIH0KIAogdm9pZAogUHlTZXRfRmluaSh2b2lkKQogewotCVB5U2V0T2JqZWN0ICpzbzsKKyAgICBQeVNldE9iamVjdCAqc287CiAKLQl3aGlsZSAobnVtZnJlZSkgewotCQludW1mcmVlLS07Ci0JCXNvID0gZnJlZV9saXN0W251bWZyZWVdOwotCQlQeU9iamVjdF9HQ19EZWwoc28pOwotCX0KLQlQeV9DTEVBUihkdW1teSk7Ci0JUHlfQ0xFQVIoZW1wdHlmcm96ZW5zZXQpOworICAgIHdoaWxlIChudW1mcmVlKSB7CisgICAgICAgIG51bWZyZWUtLTsKKyAgICAgICAgc28gPSBmcmVlX2xpc3RbbnVtZnJlZV07CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChzbyk7CisgICAgfQorICAgIFB5X0NMRUFSKGR1bW15KTsKKyAgICBQeV9DTEVBUihlbXB0eWZyb3plbnNldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWlmICh0eXBlID09ICZQeVNldF9UeXBlICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic2V0KCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JcmV0dXJuIG1ha2VfbmV3X3NldCh0eXBlLCBOVUxMKTsKKyAgICBpZiAodHlwZSA9PSAmUHlTZXRfVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInNldCgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIG1ha2VfbmV3X3NldCh0eXBlLCBOVUxMKTsKIH0KIAogLyogc2V0X3N3YXBfYm9kaWVzKCkgc3dpdGNoZXMgdGhlIGNvbnRlbnRzIG9mIGFueSB0d28gc2V0cyBieSBtb3ZpbmcgdGhlaXIKQEAgLTEwOTgsNjQgKzEwOTgsNjQgQEAKICAgICAgdD1zZXQoYSk7IGEuY2xlYXIoKTsgYS51cGRhdGUoYik7IGIuY2xlYXIoKTsgYi51cGRhdGUodCk7IGRlbCB0CiAKICAgIFRoZSBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMgYW5kIGl0IGxlYXZlcyBib3RoIG9iamVjdHMgaW4gYSBzdGFibGUgc3RhdGUuCi0gICBVc2VmdWwgZm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmcm96ZW5zZXRzIGZyb20gc2V0cyBmb3IgbWVtYmVyc2hpcCB0ZXN0aW5nIAorICAgVXNlZnVsIGZvciBjcmVhdGluZyB0ZW1wb3JhcnkgZnJvemVuc2V0cyBmcm9tIHNldHMgZm9yIG1lbWJlcnNoaXAgdGVzdGluZwogICAgaW4gX19jb250YWluc19fKCksIGRpc2NhcmQoKSwgYW5kIHJlbW92ZSgpLiAgQWxzbyB1c2VmdWwgZm9yIG9wZXJhdGlvbnMKLSAgIHRoYXQgdXBkYXRlIGluLXBsYWNlIChieSBhbGxvd2luZyBhbiBpbnRlcm1lZGlhdGUgcmVzdWx0IHRvIGJlIHN3YXBwZWQgCisgICB0aGF0IHVwZGF0ZSBpbi1wbGFjZSAoYnkgYWxsb3dpbmcgYW4gaW50ZXJtZWRpYXRlIHJlc3VsdCB0byBiZSBzd2FwcGVkCiAgICBpbnRvIG9uZSBvZiB0aGUgb3JpZ2luYWwgaW5wdXRzKS4KICovCiAKIHN0YXRpYyB2b2lkCiBzZXRfc3dhcF9ib2RpZXMoUHlTZXRPYmplY3QgKmEsIFB5U2V0T2JqZWN0ICpiKQogewotCVB5X3NzaXplX3QgdDsKLQlzZXRlbnRyeSAqdTsKLQlzZXRlbnRyeSAqKCpmKShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCk7Ci0Jc2V0ZW50cnkgdGFiW1B5U2V0X01JTlNJWkVdOwotCWxvbmcgaDsKKyAgICBQeV9zc2l6ZV90IHQ7CisgICAgc2V0ZW50cnkgKnU7CisgICAgc2V0ZW50cnkgKigqZikoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOworICAgIHNldGVudHJ5IHRhYltQeVNldF9NSU5TSVpFXTsKKyAgICBsb25nIGg7CiAKLQl0ID0gYS0+ZmlsbDsgICAgIGEtPmZpbGwgICA9IGItPmZpbGw7ICAgICAgICBiLT5maWxsICA9IHQ7Ci0JdCA9IGEtPnVzZWQ7ICAgICBhLT51c2VkICAgPSBiLT51c2VkOyAgICAgICAgYi0+dXNlZCAgPSB0OwotCXQgPSBhLT5tYXNrOyAgICAgYS0+bWFzayAgID0gYi0+bWFzazsgICAgICAgIGItPm1hc2sgID0gdDsKKyAgICB0ID0gYS0+ZmlsbDsgICAgIGEtPmZpbGwgICA9IGItPmZpbGw7ICAgICAgICBiLT5maWxsICA9IHQ7CisgICAgdCA9IGEtPnVzZWQ7ICAgICBhLT51c2VkICAgPSBiLT51c2VkOyAgICAgICAgYi0+dXNlZCAgPSB0OworICAgIHQgPSBhLT5tYXNrOyAgICAgYS0+bWFzayAgID0gYi0+bWFzazsgICAgICAgIGItPm1hc2sgID0gdDsKIAotCXUgPSBhLT50YWJsZTsKLQlpZiAoYS0+dGFibGUgPT0gYS0+c21hbGx0YWJsZSkKLQkJdSA9IGItPnNtYWxsdGFibGU7Ci0JYS0+dGFibGUgID0gYi0+dGFibGU7Ci0JaWYgKGItPnRhYmxlID09IGItPnNtYWxsdGFibGUpCi0JCWEtPnRhYmxlID0gYS0+c21hbGx0YWJsZTsKLQliLT50YWJsZSA9IHU7CisgICAgdSA9IGEtPnRhYmxlOworICAgIGlmIChhLT50YWJsZSA9PSBhLT5zbWFsbHRhYmxlKQorICAgICAgICB1ID0gYi0+c21hbGx0YWJsZTsKKyAgICBhLT50YWJsZSAgPSBiLT50YWJsZTsKKyAgICBpZiAoYi0+dGFibGUgPT0gYi0+c21hbGx0YWJsZSkKKyAgICAgICAgYS0+dGFibGUgPSBhLT5zbWFsbHRhYmxlOworICAgIGItPnRhYmxlID0gdTsKIAotCWYgPSBhLT5sb29rdXA7ICAgYS0+bG9va3VwID0gYi0+bG9va3VwOyAgICAgIGItPmxvb2t1cCA9IGY7CisgICAgZiA9IGEtPmxvb2t1cDsgICBhLT5sb29rdXAgPSBiLT5sb29rdXA7ICAgICAgYi0+bG9va3VwID0gZjsKIAotCWlmIChhLT50YWJsZSA9PSBhLT5zbWFsbHRhYmxlIHx8IGItPnRhYmxlID09IGItPnNtYWxsdGFibGUpIHsKLQkJbWVtY3B5KHRhYiwgYS0+c21hbGx0YWJsZSwgc2l6ZW9mKHRhYikpOwotCQltZW1jcHkoYS0+c21hbGx0YWJsZSwgYi0+c21hbGx0YWJsZSwgc2l6ZW9mKHRhYikpOwotCQltZW1jcHkoYi0+c21hbGx0YWJsZSwgdGFiLCBzaXplb2YodGFiKSk7Ci0JfQorICAgIGlmIChhLT50YWJsZSA9PSBhLT5zbWFsbHRhYmxlIHx8IGItPnRhYmxlID09IGItPnNtYWxsdGFibGUpIHsKKyAgICAgICAgbWVtY3B5KHRhYiwgYS0+c21hbGx0YWJsZSwgc2l6ZW9mKHRhYikpOworICAgICAgICBtZW1jcHkoYS0+c21hbGx0YWJsZSwgYi0+c21hbGx0YWJsZSwgc2l6ZW9mKHRhYikpOworICAgICAgICBtZW1jcHkoYi0+c21hbGx0YWJsZSwgdGFiLCBzaXplb2YodGFiKSk7CisgICAgfQogCi0JaWYgKFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShhKSwgJlB5RnJvemVuU2V0X1R5cGUpICAmJgotCSAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUoYiksICZQeUZyb3plblNldF9UeXBlKSkgewotCQloID0gYS0+aGFzaDsgICAgIGEtPmhhc2ggPSBiLT5oYXNoOyAgYi0+aGFzaCA9IGg7Ci0JfSBlbHNlIHsKLQkJYS0+aGFzaCA9IC0xOwotCQliLT5oYXNoID0gLTE7Ci0JfQorICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUoYSksICZQeUZyb3plblNldF9UeXBlKSAgJiYKKyAgICAgICAgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKGIpLCAmUHlGcm96ZW5TZXRfVHlwZSkpIHsKKyAgICAgICAgaCA9IGEtPmhhc2g7ICAgICBhLT5oYXNoID0gYi0+aGFzaDsgIGItPmhhc2ggPSBoOworICAgIH0gZWxzZSB7CisgICAgICAgIGEtPmhhc2ggPSAtMTsKKyAgICAgICAgYi0+aGFzaCA9IC0xOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9jb3B5KFB5U2V0T2JqZWN0ICpzbykKIHsKLQlyZXR1cm4gbWFrZV9uZXdfc2V0KFB5X1RZUEUoc28pLCAoUHlPYmplY3QgKilzbyk7CisgICAgcmV0dXJuIG1ha2VfbmV3X3NldChQeV9UWVBFKHNvKSwgKFB5T2JqZWN0ICopc28pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZnJvemVuc2V0X2NvcHkoUHlTZXRPYmplY3QgKnNvKQogewotCWlmIChQeUZyb3plblNldF9DaGVja0V4YWN0KHNvKSkgewotCQlQeV9JTkNSRUYoc28pOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopc287Ci0JfQotCXJldHVybiBzZXRfY29weShzbyk7CisgICAgaWYgKFB5RnJvemVuU2V0X0NoZWNrRXhhY3Qoc28pKSB7CisgICAgICAgIFB5X0lOQ1JFRihzbyk7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilzbzsKKyAgICB9CisgICAgcmV0dXJuIHNldF9jb3B5KHNvKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvcHlfZG9jLCAiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgc2V0LiIpOwpAQCAtMTE2Myw4ICsxMTYzLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY2xlYXIoUHlTZXRPYmplY3QgKnNvKQogewotCXNldF9jbGVhcl9pbnRlcm5hbChzbyk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgc2V0X2NsZWFyX2ludGVybmFsKHNvKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGNsZWFyX2RvYywgIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIHNldC4iKTsKQEAgLTExNzIsMjQgKzExNzIsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfdW5pb24oUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeVNldE9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICpvdGhlcjsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlTZXRPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqb3RoZXI7CisgICAgUHlfc3NpemVfdCBpOwogCi0JcmVzdWx0ID0gKFB5U2V0T2JqZWN0ICopc2V0X2NvcHkoc28pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gKFB5U2V0T2JqZWN0ICopc2V0X2NvcHkoc28pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgewotCQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCWlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKLQkJCWNvbnRpbnVlOwotCQlpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChyZXN1bHQsIG90aGVyKSA9PSAtMSkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIGZvciAoaT0wIDsgaTxQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDsgaSsrKSB7CisgICAgICAgIG90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChzZXRfdXBkYXRlX2ludGVybmFsKHJlc3VsdCwgb3RoZXIpID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUih1bmlvbl9kb2MsCkBAIC0xMjAwLDE0MiArMTIwMCwxNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfb3IoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlTZXRPYmplY3QgKnJlc3VsdDsKKyAgICBQeVNldE9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFueVNldF9DaGVjayhzbykgfHwgIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGlmICghUHlBbnlTZXRfQ2hlY2soc28pIHx8ICFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KIAotCXJlc3VsdCA9IChQeVNldE9iamVjdCAqKXNldF9jb3B5KHNvKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKLQkJcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKLQlpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChyZXN1bHQsIG90aGVyKSA9PSAtMSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgcmVzdWx0ID0gKFB5U2V0T2JqZWN0ICopc2V0X2NvcHkoc28pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIGlmIChzZXRfdXBkYXRlX2ludGVybmFsKHJlc3VsdCwgb3RoZXIpID09IC0xKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pb3IoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChzbywgb3RoZXIpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoc28pOwotCXJldHVybiAoUHlPYmplY3QgKilzbzsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGlmIChzZXRfdXBkYXRlX2ludGVybmFsKHNvLCBvdGhlcikgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihzbyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2ludGVyc2VjdGlvbihQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeVNldE9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICprZXksICppdCwgKnRtcDsKKyAgICBQeVNldE9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICprZXksICppdCwgKnRtcDsKIAotCWlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKLQkJcmV0dXJuIHNldF9jb3B5KHNvKTsKKyAgICBpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCisgICAgICAgIHJldHVybiBzZXRfY29weShzbyk7CiAKLQlyZXN1bHQgPSAoUHlTZXRPYmplY3QgKiltYWtlX25ld19zZXQoUHlfVFlQRShzbyksIE5VTEwpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gKFB5U2V0T2JqZWN0ICopbWFrZV9uZXdfc2V0KFB5X1RZUEUoc28pLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5QW55U2V0X0NoZWNrKG90aGVyKSkgewkJCi0JCVB5X3NzaXplX3QgcG9zID0gMDsKLQkJc2V0ZW50cnkgKmVudHJ5OworICAgIGlmIChQeUFueVNldF9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgICAgICBzZXRlbnRyeSAqZW50cnk7CiAKLQkJaWYgKFB5U2V0X0dFVF9TSVpFKG90aGVyKSA+IFB5U2V0X0dFVF9TSVpFKHNvKSkgewotCQkJdG1wID0gKFB5T2JqZWN0ICopc287Ci0JCQlzbyA9IChQeVNldE9iamVjdCAqKW90aGVyOwotCQkJb3RoZXIgPSB0bXA7Ci0JCX0KKyAgICAgICAgaWYgKFB5U2V0X0dFVF9TSVpFKG90aGVyKSA+IFB5U2V0X0dFVF9TSVpFKHNvKSkgeworICAgICAgICAgICAgdG1wID0gKFB5T2JqZWN0ICopc287CisgICAgICAgICAgICBzbyA9IChQeVNldE9iamVjdCAqKW90aGVyOworICAgICAgICAgICAgb3RoZXIgPSB0bXA7CisgICAgICAgIH0KIAotCQl3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpIHsKLQkJCWludCBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgZW50cnkpOwotCQkJaWYgKHJ2ID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlpZiAocnYpIHsKLQkJCQlpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsIGVudHJ5KSA9PSAtMSkgewotCQkJCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7Ci0JfQorICAgICAgICB3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpIHsKKyAgICAgICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgZW50cnkpOworICAgICAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocnYpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsIGVudHJ5KSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgfQogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKG90aGVyKTsKLQlpZiAoaXQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihvdGhlcik7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCWludCBydjsKLQkJc2V0ZW50cnkgZW50cnk7Ci0JCWxvbmcgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBpbnQgcnY7CisgICAgICAgIHNldGVudHJ5IGVudHJ5OworICAgICAgICBsb25nIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CiAKLQkJaWYgKGhhc2ggPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZW50cnkuaGFzaCA9IGhhc2g7Ci0JCWVudHJ5LmtleSA9IGtleTsKLQkJcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sICZlbnRyeSk7Ci0JCWlmIChydiA9PSAtMSkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJUHlfREVDUkVGKGtleSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAocnYpIHsKLQkJCWlmIChzZXRfYWRkX2VudHJ5KHJlc3VsdCwgJmVudHJ5KSA9PSAtMSkgewotCQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJUHlfREVDUkVGKGtleSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJUHlfREVDUkVGKGtleSk7Ci0JfQotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgICAgICBpZiAoaGFzaCA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbnRyeS5oYXNoID0gaGFzaDsKKyAgICAgICAgZW50cnkua2V5ID0ga2V5OworICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgJmVudHJ5KTsKKyAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChydikgeworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkocmVzdWx0LCAmZW50cnkpID09IC0xKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaW50ZXJzZWN0aW9uX211bHRpKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICpyZXN1bHQgPSAoUHlPYmplY3QgKilzbzsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IChQeU9iamVjdCAqKXNvOwogCi0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKLQkJcmV0dXJuIHNldF9jb3B5KHNvKTsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKQorICAgICAgICByZXR1cm4gc2V0X2NvcHkoc28pOwogCi0JUHlfSU5DUkVGKHNvKTsKLQlmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgewotCQlQeU9iamVjdCAqb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlQeU9iamVjdCAqbmV3cmVzdWx0ID0gc2V0X2ludGVyc2VjdGlvbigoUHlTZXRPYmplY3QgKilyZXN1bHQsIG90aGVyKTsKLQkJaWYgKG5ld3Jlc3VsdCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBuZXdyZXN1bHQ7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlfSU5DUkVGKHNvKTsKKyAgICBmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBQeU9iamVjdCAqbmV3cmVzdWx0ID0gc2V0X2ludGVyc2VjdGlvbigoUHlTZXRPYmplY3QgKilyZXN1bHQsIG90aGVyKTsKKyAgICAgICAgaWYgKG5ld3Jlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSBuZXdyZXN1bHQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihpbnRlcnNlY3Rpb25fZG9jLApAQCAtMTM0NiwyNyArMTM0NiwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pbnRlcnNlY3Rpb25fdXBkYXRlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCXRtcCA9IHNldF9pbnRlcnNlY3Rpb24oc28sIG90aGVyKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNldF9zd2FwX2JvZGllcyhzbywgKFB5U2V0T2JqZWN0ICopdG1wKTsKLQlQeV9ERUNSRUYodG1wKTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICB0bXAgPSBzZXRfaW50ZXJzZWN0aW9uKHNvLCBvdGhlcik7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRfc3dhcF9ib2RpZXMoc28sIChQeVNldE9iamVjdCAqKXRtcCk7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaW50ZXJzZWN0aW9uX3VwZGF0ZV9tdWx0aShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCXRtcCA9IHNldF9pbnRlcnNlY3Rpb25fbXVsdGkoc28sIGFyZ3MpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0X3N3YXBfYm9kaWVzKHNvLCAoUHlTZXRPYmplY3QgKil0bXApOwotCVB5X0RFQ1JFRih0bXApOwotCVB5X1JFVFVSTl9OT05FOworICAgIHRtcCA9IHNldF9pbnRlcnNlY3Rpb25fbXVsdGkoc28sIGFyZ3MpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0X3N3YXBfYm9kaWVzKHNvLCAoUHlTZXRPYmplY3QgKil0bXApOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoaW50ZXJzZWN0aW9uX3VwZGF0ZV9kb2MsCkBAIC0xMzc1LDkyICsxMzc1LDkyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2FuZChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlpZiAoIVB5QW55U2V0X0NoZWNrKHNvKSB8fCAhUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JcmV0dXJuIHNldF9pbnRlcnNlY3Rpb24oc28sIG90aGVyKTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNvKSB8fCAhUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgcmV0dXJuIHNldF9pbnRlcnNlY3Rpb24oc28sIG90aGVyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pYW5kKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JcmVzdWx0ID0gc2V0X2ludGVyc2VjdGlvbl91cGRhdGUoc28sIG90aGVyKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5X0lOQ1JFRihzbyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNvOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgcmVzdWx0ID0gc2V0X2ludGVyc2VjdGlvbl91cGRhdGUoc28sIG90aGVyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0lOQ1JFRihzbyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2lzZGlzam9pbnQoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKmtleSwgKml0LCAqdG1wOworICAgIFB5T2JqZWN0ICprZXksICppdCwgKnRtcDsKIAotCWlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikgewotCQlpZiAoUHlTZXRfR0VUX1NJWkUoc28pID09IDApCi0JCQlQeV9SRVRVUk5fVFJVRTsKLQkJZWxzZQotCQkJUHlfUkVUVVJOX0ZBTFNFOwotCX0KKyAgICBpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpIHsKKyAgICAgICAgaWYgKFB5U2V0X0dFVF9TSVpFKHNvKSA9PSAwKQorICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CiAKLQlpZiAoUHlBbnlTZXRfQ2hlY2tFeGFjdChvdGhlcikpIHsJCQotCQlQeV9zc2l6ZV90IHBvcyA9IDA7Ci0JCXNldGVudHJ5ICplbnRyeTsKKyAgICBpZiAoUHlBbnlTZXRfQ2hlY2tFeGFjdChvdGhlcikpIHsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgICAgICBzZXRlbnRyeSAqZW50cnk7CiAKLQkJaWYgKFB5U2V0X0dFVF9TSVpFKG90aGVyKSA+IFB5U2V0X0dFVF9TSVpFKHNvKSkgewotCQkJdG1wID0gKFB5T2JqZWN0ICopc287Ci0JCQlzbyA9IChQeVNldE9iamVjdCAqKW90aGVyOwotCQkJb3RoZXIgPSB0bXA7Ci0JCX0KLQkJd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKSB7Ci0JCQlpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5KTsKLQkJCWlmIChydiA9PSAtMSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWlmIChydikKLQkJCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCX0KLQkJUHlfUkVUVVJOX1RSVUU7Ci0JfQorICAgICAgICBpZiAoUHlTZXRfR0VUX1NJWkUob3RoZXIpID4gUHlTZXRfR0VUX1NJWkUoc28pKSB7CisgICAgICAgICAgICB0bXAgPSAoUHlPYmplY3QgKilzbzsKKyAgICAgICAgICAgIHNvID0gKFB5U2V0T2JqZWN0ICopb3RoZXI7CisgICAgICAgICAgICBvdGhlciA9IHRtcDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpIHsKKyAgICAgICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgZW50cnkpOworICAgICAgICAgICAgaWYgKHJ2ID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKHJ2KQorICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICB9CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIob3RoZXIpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIob3RoZXIpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCWludCBydjsKLQkJc2V0ZW50cnkgZW50cnk7Ci0JCWxvbmcgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBpbnQgcnY7CisgICAgICAgIHNldGVudHJ5IGVudHJ5OworICAgICAgICBsb25nIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CiAKLQkJaWYgKGhhc2ggPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJUHlfREVDUkVGKGl0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVudHJ5Lmhhc2ggPSBoYXNoOwotCQllbnRyeS5rZXkgPSBrZXk7Ci0JCXJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCAmZW50cnkpOwotCQlQeV9ERUNSRUYoa2V5KTsKLQkJaWYgKHJ2ID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKHJ2KSB7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJUHlfUkVUVVJOX0ZBTFNFOwotCQl9Ci0JfQotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X1JFVFVSTl9UUlVFOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZW50cnkuaGFzaCA9IGhhc2g7CisgICAgICAgIGVudHJ5LmtleSA9IGtleTsKKyAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sICZlbnRyeSk7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocnYpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAKIFB5RG9jX1NUUlZBUihpc2Rpc2pvaW50X2RvYywKQEAgLTE0NjksNTEgKzE0NjksNTEgQEAKIHN0YXRpYyBpbnQKIHNldF9kaWZmZXJlbmNlX3VwZGF0ZV9pbnRlcm5hbChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCi0JCXJldHVybiBzZXRfY2xlYXJfaW50ZXJuYWwoc28pOwotCQotCWlmIChQeUFueVNldF9DaGVjayhvdGhlcikpIHsKLQkJc2V0ZW50cnkgKmVudHJ5OwotCQlQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQorICAgICAgICByZXR1cm4gc2V0X2NsZWFyX2ludGVybmFsKHNvKTsKIAotCQl3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpCi0JCQlpZiAoc2V0X2Rpc2NhcmRfZW50cnkoc28sIGVudHJ5KSA9PSAtMSkKLQkJCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkJUHlPYmplY3QgKmtleSwgKml0OwotCQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIob3RoZXIpOwotCQlpZiAoaXQgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKKyAgICBpZiAoUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIHNldGVudHJ5ICplbnRyeTsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCi0JCXdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCQlpZiAoc2V0X2Rpc2NhcmRfa2V5KHNvLCBrZXkpID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKGl0KTsKLQkJCQlQeV9ERUNSRUYoa2V5KTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJfQotCQlQeV9ERUNSRUYoaXQpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JLyogSWYgbW9yZSB0aGFuIDEvNSBhcmUgZHVtbWllcywgdGhlbiByZXNpemUgdGhlbSBhd2F5LiAqLwotCWlmICgoc28tPmZpbGwgLSBzby0+dXNlZCkgKiA1IDwgc28tPm1hc2spCi0JCXJldHVybiAwOwotCXJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKKyAgICAgICAgd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKQorICAgICAgICAgICAgaWYgKHNldF9kaXNjYXJkX2VudHJ5KHNvLCBlbnRyeSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICprZXksICppdDsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKG90aGVyKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChzZXRfZGlzY2FyZF9rZXkoc28sIGtleSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBJZiBtb3JlIHRoYW4gMS81IGFyZSBkdW1taWVzLCB0aGVuIHJlc2l6ZSB0aGVtIGF3YXkuICovCisgICAgaWYgKChzby0+ZmlsbCAtIHNvLT51c2VkKSAqIDUgPCBzby0+bWFzaykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkPjUwMDAwID8gc28tPnVzZWQqMiA6IHNvLT51c2VkKjQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2RpZmZlcmVuY2VfdXBkYXRlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaT0wIDsgaTxQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCWlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoc28sIG90aGVyKSA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBpZiAoc2V0X2RpZmZlcmVuY2VfdXBkYXRlX2ludGVybmFsKHNvLCBvdGhlcikgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkaWZmZXJlbmNlX3VwZGF0ZV9kb2MsCkBAIC0xNTIyLDc3ICsxNTIyLDc3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2RpZmZlcmVuY2UoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlzZXRlbnRyeSAqZW50cnk7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgc2V0ZW50cnkgKmVudHJ5OworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAotCWlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpICAmJiAhUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7Ci0JCXJlc3VsdCA9IHNldF9jb3B5KHNvKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBvdGhlcikgIT0gLTEpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCXJlc3VsdCA9IG1ha2VfbmV3X3NldChQeV9UWVBFKHNvKSwgTlVMTCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSAgJiYgIVB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgeworICAgICAgICByZXN1bHQgPSBzZXRfY29weShzbyk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoc2V0X2RpZmZlcmVuY2VfdXBkYXRlX2ludGVybmFsKChQeVNldE9iamVjdCAqKXJlc3VsdCwgb3RoZXIpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKLQkJd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0JCQlzZXRlbnRyeSBlbnRyeWNvcHk7Ci0JCQllbnRyeWNvcHkuaGFzaCA9IGVudHJ5LT5oYXNoOwotCQkJZW50cnljb3B5LmtleSA9IGVudHJ5LT5rZXk7Ci0JCQlpZiAoIV9QeURpY3RfQ29udGFpbnMob3RoZXIsIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKSkgewotCQkJCWlmIChzZXRfYWRkX2VudHJ5KChQeVNldE9iamVjdCAqKXJlc3VsdCwgJmVudHJ5Y29weSkgPT0gLTEpIHsKLQkJCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICByZXN1bHQgPSBtYWtlX25ld19zZXQoUHlfVFlQRShzbyksIE5VTEwpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKLQkJaW50IHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KChQeVNldE9iamVjdCAqKW90aGVyLCBlbnRyeSk7Ci0JCWlmIChydiA9PSAtMSkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIXJ2KSB7Ci0JCQlpZiAoc2V0X2FkZF9lbnRyeSgoUHlTZXRPYmplY3QgKilyZXN1bHQsIGVudHJ5KSA9PSAtMSkgewotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgeworICAgICAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKKyAgICAgICAgICAgIHNldGVudHJ5IGVudHJ5Y29weTsKKyAgICAgICAgICAgIGVudHJ5Y29weS5oYXNoID0gZW50cnktPmhhc2g7CisgICAgICAgICAgICBlbnRyeWNvcHkua2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgICAgIGlmICghX1B5RGljdF9Db250YWlucyhvdGhlciwgZW50cnktPmtleSwgZW50cnktPmhhc2gpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCAmZW50cnljb3B5KSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7CisgICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOworICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFydikgeworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBlbnRyeSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2RpZmZlcmVuY2VfbXVsdGkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKnJlc3VsdCwgKm90aGVyOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcmVzdWx0LCAqb3RoZXI7CiAKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKQotCQlyZXR1cm4gc2V0X2NvcHkoc28pOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApCisgICAgICAgIHJldHVybiBzZXRfY29weShzbyk7CiAKLQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JcmVzdWx0ID0gc2V0X2RpZmZlcmVuY2Uoc28sIG90aGVyKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICByZXN1bHQgPSBzZXRfZGlmZmVyZW5jZShzbywgb3RoZXIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGk9MSA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgewotCQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCWlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBvdGhlcikgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmb3IgKGk9MSA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgeworICAgICAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIGlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBvdGhlcikgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGRpZmZlcmVuY2VfZG9jLApAQCAtMTYwMiw4MSArMTYwMiw4MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9zdWIoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JaWYgKCFQeUFueVNldF9DaGVjayhzbykgfHwgIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCXJldHVybiBzZXRfZGlmZmVyZW5jZShzbywgb3RoZXIpOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2soc28pIHx8ICFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICByZXR1cm4gc2V0X2RpZmZlcmVuY2Uoc28sIG90aGVyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pc3ViKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCWlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JaWYgKHNldF9kaWZmZXJlbmNlX3VwZGF0ZV9pbnRlcm5hbChzbywgb3RoZXIpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoc28pOwotCXJldHVybiAoUHlPYmplY3QgKilzbzsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoc28sIG90aGVyKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKHNvKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc287CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5U2V0T2JqZWN0ICpvdGhlcnNldDsKLQlQeU9iamVjdCAqa2V5OwotCVB5X3NzaXplX3QgcG9zID0gMDsKLQlzZXRlbnRyeSAqZW50cnk7CisgICAgUHlTZXRPYmplY3QgKm90aGVyc2V0OworICAgIFB5T2JqZWN0ICprZXk7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIHNldGVudHJ5ICplbnRyeTsKIAotCWlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKLQkJcmV0dXJuIHNldF9jbGVhcihzbyk7CisgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQorICAgICAgICByZXR1cm4gc2V0X2NsZWFyKHNvKTsKIAotCWlmIChQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKLQkJUHlPYmplY3QgKnZhbHVlOwotCQlpbnQgcnY7Ci0JCWxvbmcgaGFzaDsKLQkJd2hpbGUgKF9QeURpY3RfTmV4dChvdGhlciwgJnBvcywgJmtleSwgJnZhbHVlLCAmaGFzaCkpIHsKLQkJCXNldGVudHJ5IGFuX2VudHJ5OworICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKKyAgICAgICAgUHlPYmplY3QgKnZhbHVlOworICAgICAgICBpbnQgcnY7CisgICAgICAgIGxvbmcgaGFzaDsKKyAgICAgICAgd2hpbGUgKF9QeURpY3RfTmV4dChvdGhlciwgJnBvcywgJmtleSwgJnZhbHVlLCAmaGFzaCkpIHsKKyAgICAgICAgICAgIHNldGVudHJ5IGFuX2VudHJ5OwogCi0JCQlhbl9lbnRyeS5oYXNoID0gaGFzaDsKLQkJCWFuX2VudHJ5LmtleSA9IGtleTsKLQkJCXJ2ID0gc2V0X2Rpc2NhcmRfZW50cnkoc28sICZhbl9lbnRyeSk7Ci0JCQlpZiAocnYgPT0gLTEpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpZiAocnYgPT0gRElTQ0FSRF9OT1RGT1VORCkgewotCQkJCWlmIChzZXRfYWRkX2VudHJ5KHNvLCAmYW5fZW50cnkpID09IC0xKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlQeV9SRVRVUk5fTk9ORTsKLQl9CisgICAgICAgICAgICBhbl9lbnRyeS5oYXNoID0gaGFzaDsKKyAgICAgICAgICAgIGFuX2VudHJ5LmtleSA9IGtleTsKKyAgICAgICAgICAgIHJ2ID0gc2V0X2Rpc2NhcmRfZW50cnkoc28sICZhbl9lbnRyeSk7CisgICAgICAgICAgICBpZiAocnYgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAocnYgPT0gRElTQ0FSRF9OT1RGT1VORCkgeworICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCAmYW5fZW50cnkpID09IC0xKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CiAKLQlpZiAoUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihvdGhlcik7Ci0JCW90aGVyc2V0ID0gKFB5U2V0T2JqZWN0ICopb3RoZXI7Ci0JfSBlbHNlIHsKLQkJb3RoZXJzZXQgPSAoUHlTZXRPYmplY3QgKiltYWtlX25ld19zZXQoUHlfVFlQRShzbyksIG90aGVyKTsKLQkJaWYgKG90aGVyc2V0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICBQeV9JTkNSRUYob3RoZXIpOworICAgICAgICBvdGhlcnNldCA9IChQeVNldE9iamVjdCAqKW90aGVyOworICAgIH0gZWxzZSB7CisgICAgICAgIG90aGVyc2V0ID0gKFB5U2V0T2JqZWN0ICopbWFrZV9uZXdfc2V0KFB5X1RZUEUoc28pLCBvdGhlcik7CisgICAgICAgIGlmIChvdGhlcnNldCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jd2hpbGUgKHNldF9uZXh0KG90aGVyc2V0LCAmcG9zLCAmZW50cnkpKSB7Ci0JCWludCBydiA9IHNldF9kaXNjYXJkX2VudHJ5KHNvLCBlbnRyeSk7Ci0JCWlmIChydiA9PSAtMSkgewotCQkJUHlfREVDUkVGKG90aGVyc2V0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChydiA9PSBESVNDQVJEX05PVEZPVU5EKSB7Ci0JCQlpZiAoc2V0X2FkZF9lbnRyeShzbywgZW50cnkpID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKG90aGVyc2V0KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQlQeV9ERUNSRUYob3RoZXJzZXQpOwotCVB5X1JFVFVSTl9OT05FOworICAgIHdoaWxlIChzZXRfbmV4dChvdGhlcnNldCwgJnBvcywgJmVudHJ5KSkgeworICAgICAgICBpbnQgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnkpOworICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvdGhlcnNldCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocnYgPT0gRElTQ0FSRF9OT1RGT1VORCkgeworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sIGVudHJ5KSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvdGhlcnNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKG90aGVyc2V0KTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZV9kb2MsCkBAIC0xNjg1LDE3ICsxNjg1LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICpydjsKLQlQeVNldE9iamVjdCAqb3RoZXJzZXQ7CisgICAgUHlPYmplY3QgKnJ2OworICAgIFB5U2V0T2JqZWN0ICpvdGhlcnNldDsKIAotCW90aGVyc2V0ID0gKFB5U2V0T2JqZWN0ICopbWFrZV9uZXdfc2V0KFB5X1RZUEUoc28pLCBvdGhlcik7Ci0JaWYgKG90aGVyc2V0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShvdGhlcnNldCwgKFB5T2JqZWN0ICopc28pOwotCWlmIChydiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9ERUNSRUYocnYpOwotCXJldHVybiAoUHlPYmplY3QgKilvdGhlcnNldDsKKyAgICBvdGhlcnNldCA9IChQeVNldE9iamVjdCAqKW1ha2VfbmV3X3NldChQeV9UWVBFKHNvKSwgb3RoZXIpOworICAgIGlmIChvdGhlcnNldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUob3RoZXJzZXQsIChQeU9iamVjdCAqKXNvKTsKKyAgICBpZiAocnYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb3RoZXJzZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihzeW1tZXRyaWNfZGlmZmVyZW5jZV9kb2MsCkBAIC0xNzA2LDU2ICsxNzA2LDU2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3hvcihQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlpZiAoIVB5QW55U2V0X0NoZWNrKHNvKSB8fCAhUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JcmV0dXJuIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShzbywgb3RoZXIpOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2soc28pIHx8ICFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICByZXR1cm4gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKHNvLCBvdGhlcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaXhvcihQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCXJlc3VsdCA9IHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc28sIG90aGVyKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5X0lOQ1JFRihzbyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNvOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgcmVzdWx0ID0gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzbywgb3RoZXIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfSU5DUkVGKHNvKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc287CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaXNzdWJzZXQoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0Jc2V0ZW50cnkgKmVudHJ5OwotCVB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBzZXRlbnRyeSAqZW50cnk7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCi0JaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKLQkJUHlPYmplY3QgKnRtcCwgKnJlc3VsdDsKLQkJdG1wID0gbWFrZV9uZXdfc2V0KCZQeVNldF9UeXBlLCBvdGhlcik7Ci0JCWlmICh0bXAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXN1bHQgPSBzZXRfaXNzdWJzZXQoc28sIHRtcCk7Ci0JCVB5X0RFQ1JFRih0bXApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlpZiAoUHlTZXRfR0VUX1NJWkUoc28pID4gUHlTZXRfR0VUX1NJWkUob3RoZXIpKSAKLQkJUHlfUkVUVVJOX0ZBTFNFOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5T2JqZWN0ICp0bXAsICpyZXN1bHQ7CisgICAgICAgIHRtcCA9IG1ha2VfbmV3X3NldCgmUHlTZXRfVHlwZSwgb3RoZXIpOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzdWx0ID0gc2V0X2lzc3Vic2V0KHNvLCB0bXApOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgaWYgKFB5U2V0X0dFVF9TSVpFKHNvKSA+IFB5U2V0X0dFVF9TSVpFKG90aGVyKSkKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogCi0Jd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0JCWludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOwotCQlpZiAocnYgPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCFydikKLQkJCVB5X1JFVFVSTl9GQUxTRTsKLQl9Ci0JUHlfUkVUVVJOX1RSVUU7CisgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7CisgICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOworICAgICAgICBpZiAocnYgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFydikKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CisgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAKIFB5RG9jX1NUUlZBUihpc3N1YnNldF9kb2MsICJSZXBvcnQgd2hldGhlciBhbm90aGVyIHNldCBjb250YWlucyB0aGlzIHNldC4iKTsKQEAgLTE3NjMsMTcgKzE3NjMsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaXNzdXBlcnNldChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqdG1wLCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICp0bXAsICpyZXN1bHQ7CiAKLQlpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQl0bXAgPSBtYWtlX25ld19zZXQoJlB5U2V0X1R5cGUsIG90aGVyKTsKLQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlc3VsdCA9IHNldF9pc3N1cGVyc2V0KHNvLCB0bXApOwotCQlQeV9ERUNSRUYodG1wKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcmV0dXJuIHNldF9pc3N1YnNldCgoUHlTZXRPYmplY3QgKilvdGhlciwgKFB5T2JqZWN0ICopc28pOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIHRtcCA9IG1ha2VfbmV3X3NldCgmUHlTZXRfVHlwZSwgb3RoZXIpOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzdWx0ID0gc2V0X2lzc3VwZXJzZXQoc28sIHRtcCk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gc2V0X2lzc3Vic2V0KChQeVNldE9iamVjdCAqKW90aGVyLCAoUHlPYmplY3QgKilzbyk7CiB9CiAKIFB5RG9jX1NUUlZBUihpc3N1cGVyc2V0X2RvYywgIlJlcG9ydCB3aGV0aGVyIHRoaXMgc2V0IGNvbnRhaW5zIGFub3RoZXIgc2V0LiIpOwpAQCAtMTc4MSw2NSArMTc4MSw2NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9yaWNoY29tcGFyZShQeVNldE9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqcjEsICpyMjsKKyAgICBQeU9iamVjdCAqcjEsICpyMjsKIAotCWlmKCFQeUFueVNldF9DaGVjayh3KSkgewotCQlpZiAob3AgPT0gUHlfRVEpCi0JCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCWlmIChvcCA9PSBQeV9ORSkKLQkJCVB5X1JFVFVSTl9UUlVFOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY2FuIG9ubHkgY29tcGFyZSB0byBhIHNldCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3dpdGNoIChvcCkgewotCWNhc2UgUHlfRVE6Ci0JCWlmIChQeVNldF9HRVRfU0laRSh2KSAhPSBQeVNldF9HRVRfU0laRSh3KSkKLQkJCVB5X1JFVFVSTl9GQUxTRTsKLQkJaWYgKHYtPmhhc2ggIT0gLTEgICYmCi0JCSAgICAoKFB5U2V0T2JqZWN0ICopdyktPmhhc2ggIT0gLTEgJiYKLQkJICAgIHYtPmhhc2ggIT0gKChQeVNldE9iamVjdCAqKXcpLT5oYXNoKQotCQkJUHlfUkVUVVJOX0ZBTFNFOwotCQlyZXR1cm4gc2V0X2lzc3Vic2V0KHYsIHcpOwotCWNhc2UgUHlfTkU6Ci0JCXIxID0gc2V0X3JpY2hjb21wYXJlKHYsIHcsIFB5X0VRKTsKLQkJaWYgKHIxID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcjIgPSBQeUJvb2xfRnJvbUxvbmcoUHlPYmplY3RfTm90KHIxKSk7Ci0JCVB5X0RFQ1JFRihyMSk7Ci0JCXJldHVybiByMjsKLQljYXNlIFB5X0xFOgotCQlyZXR1cm4gc2V0X2lzc3Vic2V0KHYsIHcpOwotCWNhc2UgUHlfR0U6Ci0JCXJldHVybiBzZXRfaXNzdXBlcnNldCh2LCB3KTsKLQljYXNlIFB5X0xUOgotCQlpZiAoUHlTZXRfR0VUX1NJWkUodikgPj0gUHlTZXRfR0VUX1NJWkUodykpCi0JCQlQeV9SRVRVUk5fRkFMU0U7CQkKLQkJcmV0dXJuIHNldF9pc3N1YnNldCh2LCB3KTsKLQljYXNlIFB5X0dUOgotCQlpZiAoUHlTZXRfR0VUX1NJWkUodikgPD0gUHlTZXRfR0VUX1NJWkUodykpCi0JCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCXJldHVybiBzZXRfaXNzdXBlcnNldCh2LCB3KTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgaWYoIVB5QW55U2V0X0NoZWNrKHcpKSB7CisgICAgICAgIGlmIChvcCA9PSBQeV9FUSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgaWYgKG9wID09IFB5X05FKQorICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYW4gb25seSBjb21wYXJlIHRvIGEgc2V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBQeV9FUToKKyAgICAgICAgaWYgKFB5U2V0X0dFVF9TSVpFKHYpICE9IFB5U2V0X0dFVF9TSVpFKHcpKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBpZiAodi0+aGFzaCAhPSAtMSAgJiYKKyAgICAgICAgICAgICgoUHlTZXRPYmplY3QgKil3KS0+aGFzaCAhPSAtMSAmJgorICAgICAgICAgICAgdi0+aGFzaCAhPSAoKFB5U2V0T2JqZWN0ICopdyktPmhhc2gpCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIHJldHVybiBzZXRfaXNzdWJzZXQodiwgdyk7CisgICAgY2FzZSBQeV9ORToKKyAgICAgICAgcjEgPSBzZXRfcmljaGNvbXBhcmUodiwgdywgUHlfRVEpOworICAgICAgICBpZiAocjEgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByMiA9IFB5Qm9vbF9Gcm9tTG9uZyhQeU9iamVjdF9Ob3QocjEpKTsKKyAgICAgICAgUHlfREVDUkVGKHIxKTsKKyAgICAgICAgcmV0dXJuIHIyOworICAgIGNhc2UgUHlfTEU6CisgICAgICAgIHJldHVybiBzZXRfaXNzdWJzZXQodiwgdyk7CisgICAgY2FzZSBQeV9HRToKKyAgICAgICAgcmV0dXJuIHNldF9pc3N1cGVyc2V0KHYsIHcpOworICAgIGNhc2UgUHlfTFQ6CisgICAgICAgIGlmIChQeVNldF9HRVRfU0laRSh2KSA+PSBQeVNldF9HRVRfU0laRSh3KSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgcmV0dXJuIHNldF9pc3N1YnNldCh2LCB3KTsKKyAgICBjYXNlIFB5X0dUOgorICAgICAgICBpZiAoUHlTZXRfR0VUX1NJWkUodikgPD0gUHlTZXRfR0VUX1NJWkUodykpCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIHJldHVybiBzZXRfaXNzdXBlcnNldCh2LCB3KTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF9ub2NtcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYW5ub3QgY29tcGFyZSBzZXRzIHVzaW5nIGNtcCgpIik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYW5ub3QgY29tcGFyZSBzZXRzIHVzaW5nIGNtcCgpIik7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2FkZChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCiB7Ci0JaWYgKHNldF9hZGRfa2V5KHNvLCBrZXkpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAoc2V0X2FkZF9rZXkoc28sIGtleSkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCi1QeURvY19TVFJWQVIoYWRkX2RvYywgCitQeURvY19TVFJWQVIoYWRkX2RvYywKICJBZGQgYW4gZWxlbWVudCB0byBhIHNldC5cblwKIFxuXAogVGhpcyBoYXMgbm8gZWZmZWN0IGlmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgcHJlc2VudC4iKTsKQEAgLTE4NDcsMzQgKzE4NDcsMzQgQEAKIHN0YXRpYyBpbnQKIHNldF9jb250YWlucyhQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlPYmplY3QgKnRtcGtleTsKLQlpbnQgcnY7CisgICAgUHlPYmplY3QgKnRtcGtleTsKKyAgICBpbnQgcnY7CiAKLQlydiA9IHNldF9jb250YWluc19rZXkoc28sIGtleSk7Ci0JaWYgKHJ2ID09IC0xKSB7Ci0JCWlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotCQkJcmV0dXJuIC0xOwotCQlQeUVycl9DbGVhcigpOwotCQl0bXBrZXkgPSBtYWtlX25ld19zZXQoJlB5RnJvemVuU2V0X1R5cGUsIE5VTEwpOwotCQlpZiAodG1wa2V5ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCXNldF9zd2FwX2JvZGllcygoUHlTZXRPYmplY3QgKil0bXBrZXksIChQeVNldE9iamVjdCAqKWtleSk7Ci0JCXJ2ID0gc2V0X2NvbnRhaW5zKHNvLCB0bXBrZXkpOwotCQlzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOwotCQlQeV9ERUNSRUYodG1wa2V5KTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2tleShzbywga2V5KTsKKyAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAgaWYgKCFQeVNldF9DaGVjayhrZXkpIHx8ICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHRtcGtleSA9IG1ha2VfbmV3X3NldCgmUHlGcm96ZW5TZXRfVHlwZSwgTlVMTCk7CisgICAgICAgIGlmICh0bXBrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKKyAgICAgICAgcnYgPSBzZXRfY29udGFpbnMoc28sIHRtcGtleSk7CisgICAgICAgIHNldF9zd2FwX2JvZGllcygoUHlTZXRPYmplY3QgKil0bXBrZXksIChQeVNldE9iamVjdCAqKWtleSk7CisgICAgICAgIFB5X0RFQ1JFRih0bXBrZXkpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfZGlyZWN0X2NvbnRhaW5zKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKIHsKLQlsb25nIHJlc3VsdDsKKyAgICBsb25nIHJlc3VsdDsKIAotCXJlc3VsdCA9IHNldF9jb250YWlucyhzbywga2V5KTsKLQlpZiAocmVzdWx0ID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gc2V0X2NvbnRhaW5zKHNvLCBrZXkpOworICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvbnRhaW5zX2RvYywgInguX19jb250YWluc19fKHkpIDw9PT4geSBpbiB4LiIpOwpAQCAtMTg4MiwzMCArMTg4MiwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9yZW1vdmUoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotCVB5T2JqZWN0ICp0bXBrZXk7Ci0JaW50IHJ2OworICAgIFB5T2JqZWN0ICp0bXBrZXk7CisgICAgaW50IHJ2OwogCi0JcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIGtleSk7Ci0JaWYgKHJ2ID09IC0xKSB7Ci0JCWlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXRtcGtleSA9IG1ha2VfbmV3X3NldCgmUHlGcm96ZW5TZXRfVHlwZSwgTlVMTCk7Ci0JCWlmICh0bXBrZXkgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOwotCQlydiA9IHNldF9kaXNjYXJkX2tleShzbywgdG1wa2V5KTsKLQkJc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKLQkJUHlfREVDUkVGKHRtcGtleSk7Ci0JCWlmIChydiA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0gCisgICAgcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIGtleSk7CisgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgIGlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHRtcGtleSA9IG1ha2VfbmV3X3NldCgmUHlGcm96ZW5TZXRfVHlwZSwgTlVMTCk7CisgICAgICAgIGlmICh0bXBrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOworICAgICAgICBydiA9IHNldF9kaXNjYXJkX2tleShzbywgdG1wa2V5KTsKKyAgICAgICAgc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKKyAgICAgICAgUHlfREVDUkVGKHRtcGtleSk7CisgICAgICAgIGlmIChydiA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChydiA9PSBESVNDQVJEX05PVEZPVU5EKSB7Ci0JCXNldF9rZXlfZXJyb3Ioa2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X1JFVFVSTl9OT05FOworICAgIGlmIChydiA9PSBESVNDQVJEX05PVEZPVU5EKSB7CisgICAgICAgIHNldF9rZXlfZXJyb3Ioa2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIocmVtb3ZlX2RvYywKQEAgLTE5MTYsNTQgKzE5MTYsNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfZGlzY2FyZChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlPYmplY3QgKnRtcGtleSwgKnJlc3VsdDsKLQlpbnQgcnY7CisgICAgUHlPYmplY3QgKnRtcGtleSwgKnJlc3VsdDsKKyAgICBpbnQgcnY7CiAKLQlydiA9IHNldF9kaXNjYXJkX2tleShzbywga2V5KTsKLQlpZiAocnYgPT0gLTEpIHsKLQkJaWYgKCFQeVNldF9DaGVjayhrZXkpIHx8ICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJdG1wa2V5ID0gbWFrZV9uZXdfc2V0KCZQeUZyb3plblNldF9UeXBlLCBOVUxMKTsKLQkJaWYgKHRtcGtleSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXNldF9zd2FwX2JvZGllcygoUHlTZXRPYmplY3QgKil0bXBrZXksIChQeVNldE9iamVjdCAqKWtleSk7Ci0JCXJlc3VsdCA9IHNldF9kaXNjYXJkKHNvLCB0bXBrZXkpOwotCQlzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOwotCQlQeV9ERUNSRUYodG1wa2V5KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIGtleSk7CisgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgIGlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHRtcGtleSA9IG1ha2VfbmV3X3NldCgmUHlGcm96ZW5TZXRfVHlwZSwgTlVMTCk7CisgICAgICAgIGlmICh0bXBrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOworICAgICAgICByZXN1bHQgPSBzZXRfZGlzY2FyZChzbywgdG1wa2V5KTsKKyAgICAgICAgc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKKyAgICAgICAgUHlfREVDUkVGKHRtcGtleSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZGlzY2FyZF9kb2MsCiAiUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHNldCBpZiBpdCBpcyBhIG1lbWJlci5cblwKIFxuXAotSWYgdGhlIGVsZW1lbnQgaXMgbm90IGEgbWVtYmVyLCBkbyBub3RoaW5nLiIpOyAKK0lmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgZG8gbm90aGluZy4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9yZWR1Y2UoUHlTZXRPYmplY3QgKnNvKQogewotCVB5T2JqZWN0ICprZXlzPU5VTEwsICphcmdzPU5VTEwsICpyZXN1bHQ9TlVMTCwgKmRpY3Q9TlVMTDsKKyAgICBQeU9iamVjdCAqa2V5cz1OVUxMLCAqYXJncz1OVUxMLCAqcmVzdWx0PU5VTEwsICpkaWN0PU5VTEw7CiAKLQlrZXlzID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKXNvKTsKLQlpZiAoa2V5cyA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCBrZXlzKTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0JZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopc28sICJfX2RpY3RfXyIpOwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJZGljdCA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihkaWN0KTsKLQl9Ci0JcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDMsIFB5X1RZUEUoc28pLCBhcmdzLCBkaWN0KTsKKyAgICBrZXlzID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKXNvKTsKKyAgICBpZiAoa2V5cyA9PSBOVUxMKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBrZXlzKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopc28sICJfX2RpY3RfXyIpOworICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZGljdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihkaWN0KTsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDMsIFB5X1RZUEUoc28pLCBhcmdzLCBkaWN0KTsKIGRvbmU6Ci0JUHlfWERFQ1JFRihhcmdzKTsKLQlQeV9YREVDUkVGKGtleXMpOwotCVB5X1hERUNSRUYoZGljdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGFyZ3MpOworICAgIFB5X1hERUNSRUYoa2V5cyk7CisgICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIocmVkdWNlX2RvYywgIlJldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcGlja2xpbmcuIik7CkBAIC0xOTcxLDQyICsxOTcxLDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3NpemVvZihQeVNldE9iamVjdCAqc28pCiB7Ci0JUHlfc3NpemVfdCByZXM7CisgICAgUHlfc3NpemVfdCByZXM7CiAKLQlyZXMgPSBzaXplb2YoUHlTZXRPYmplY3QpOwotCWlmIChzby0+dGFibGUgIT0gc28tPnNtYWxsdGFibGUpCi0JCXJlcyA9IHJlcyArIChzby0+bWFzayArIDEpICogc2l6ZW9mKHNldGVudHJ5KTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKKyAgICByZXMgPSBzaXplb2YoUHlTZXRPYmplY3QpOworICAgIGlmIChzby0+dGFibGUgIT0gc28tPnNtYWxsdGFibGUpCisgICAgICAgIHJlcyA9IHJlcyArIChzby0+bWFzayArIDEpICogc2l6ZW9mKHNldGVudHJ5KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNpemVvZl9kb2MsICJTLl9fc2l6ZW9mX18oKSAtPiBzaXplIG9mIFMgaW4gbWVtb3J5LCBpbiBieXRlcyIpOwogc3RhdGljIGludAogc2V0X2luaXQoUHlTZXRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IE5VTEw7CiAKLQlpZiAoIVB5QW55U2V0X0NoZWNrKHNlbGYpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKFB5U2V0X0NoZWNrKHNlbGYpICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic2V0KCkiLCBrd2RzKSkKLQkJcmV0dXJuIC0xOwotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwgMCwgMSwgJml0ZXJhYmxlKSkKLQkJcmV0dXJuIC0xOwotCXNldF9jbGVhcl9pbnRlcm5hbChzZWxmKTsKLQlzZWxmLT5oYXNoID0gLTE7Ci0JaWYgKGl0ZXJhYmxlID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiBzZXRfdXBkYXRlX2ludGVybmFsKHNlbGYsIGl0ZXJhYmxlKTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNlbGYpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFB5U2V0X0NoZWNrKHNlbGYpICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic2V0KCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwgMCwgMSwgJml0ZXJhYmxlKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNldF9jbGVhcl9pbnRlcm5hbChzZWxmKTsKKyAgICBzZWxmLT5oYXNoID0gLTE7CisgICAgaWYgKGl0ZXJhYmxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzZXRfdXBkYXRlX2ludGVybmFsKHNlbGYsIGl0ZXJhYmxlKTsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIHNldF9hc19zZXF1ZW5jZSA9IHsKLQlzZXRfbGVuLAkJCS8qIHNxX2xlbmd0aCAqLwotCTAsCQkJCS8qIHNxX2NvbmNhdCAqLwotCTAsCQkJCS8qIHNxX3JlcGVhdCAqLwotCTAsCQkJCS8qIHNxX2l0ZW0gKi8KLQkwLAkJCQkvKiBzcV9zbGljZSAqLwotCTAsCQkJCS8qIHNxX2Fzc19pdGVtICovCi0JMCwJCQkJLyogc3FfYXNzX3NsaWNlICovCi0JKG9iam9ianByb2Mpc2V0X2NvbnRhaW5zLAkvKiBzcV9jb250YWlucyAqLworICAgIHNldF9sZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbmNhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9zbGljZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX3NsaWNlICovCisgICAgKG9iam9ianByb2Mpc2V0X2NvbnRhaW5zLCAgICAgICAgICAgLyogc3FfY29udGFpbnMgKi8KIH07CiAKIC8qIHNldCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMDE5LDg4ICsyMDE5LDg4IEBACiAjZW5kaWYKIAogc3RhdGljIFB5TWV0aG9kRGVmIHNldF9tZXRob2RzW10gPSB7Ci0JeyJhZGQiLAkJKFB5Q0Z1bmN0aW9uKXNldF9hZGQsCQlNRVRIX08sCi0JIGFkZF9kb2N9LAotCXsiY2xlYXIiLAkoUHlDRnVuY3Rpb24pc2V0X2NsZWFyLAkJTUVUSF9OT0FSR1MsCi0JIGNsZWFyX2RvY30sCi0JeyJfX2NvbnRhaW5zX18iLChQeUNGdW5jdGlvbilzZXRfZGlyZWN0X2NvbnRhaW5zLAlNRVRIX08gfCBNRVRIX0NPRVhJU1QsCi0JIGNvbnRhaW5zX2RvY30sCi0JeyJjb3B5IiwJKFB5Q0Z1bmN0aW9uKXNldF9jb3B5LAkJTUVUSF9OT0FSR1MsCi0JIGNvcHlfZG9jfSwKLQl7ImRpc2NhcmQiLAkoUHlDRnVuY3Rpb24pc2V0X2Rpc2NhcmQsCU1FVEhfTywKLQkgZGlzY2FyZF9kb2N9LAotCXsiZGlmZmVyZW5jZSIsCShQeUNGdW5jdGlvbilzZXRfZGlmZmVyZW5jZV9tdWx0aSwJTUVUSF9WQVJBUkdTLAotCSBkaWZmZXJlbmNlX2RvY30sCi0JeyJkaWZmZXJlbmNlX3VwZGF0ZSIsCShQeUNGdW5jdGlvbilzZXRfZGlmZmVyZW5jZV91cGRhdGUsCU1FVEhfVkFSQVJHUywKLQkgZGlmZmVyZW5jZV91cGRhdGVfZG9jfSwKLQl7ImludGVyc2VjdGlvbiIsKFB5Q0Z1bmN0aW9uKXNldF9pbnRlcnNlY3Rpb25fbXVsdGksCU1FVEhfVkFSQVJHUywKLQkgaW50ZXJzZWN0aW9uX2RvY30sCi0JeyJpbnRlcnNlY3Rpb25fdXBkYXRlIiwoUHlDRnVuY3Rpb24pc2V0X2ludGVyc2VjdGlvbl91cGRhdGVfbXVsdGksCU1FVEhfVkFSQVJHUywKLQkgaW50ZXJzZWN0aW9uX3VwZGF0ZV9kb2N9LAotCXsiaXNkaXNqb2ludCIsCShQeUNGdW5jdGlvbilzZXRfaXNkaXNqb2ludCwJTUVUSF9PLAotCSBpc2Rpc2pvaW50X2RvY30sCi0JeyJpc3N1YnNldCIsCShQeUNGdW5jdGlvbilzZXRfaXNzdWJzZXQsCU1FVEhfTywKLQkgaXNzdWJzZXRfZG9jfSwKLQl7Imlzc3VwZXJzZXQiLAkoUHlDRnVuY3Rpb24pc2V0X2lzc3VwZXJzZXQsCU1FVEhfTywKLQkgaXNzdXBlcnNldF9kb2N9LAotCXsicG9wIiwJCShQeUNGdW5jdGlvbilzZXRfcG9wLAkJTUVUSF9OT0FSR1MsCi0JIHBvcF9kb2N9LAotCXsiX19yZWR1Y2VfXyIsCShQeUNGdW5jdGlvbilzZXRfcmVkdWNlLAlNRVRIX05PQVJHUywKLQkgcmVkdWNlX2RvY30sCi0JeyJyZW1vdmUiLAkoUHlDRnVuY3Rpb24pc2V0X3JlbW92ZSwJTUVUSF9PLAotCSByZW1vdmVfZG9jfSwKLQl7Il9fc2l6ZW9mX18iLAkoUHlDRnVuY3Rpb24pc2V0X3NpemVvZiwJTUVUSF9OT0FSR1MsCi0JIHNpemVvZl9kb2N9LAotCXsic3ltbWV0cmljX2RpZmZlcmVuY2UiLChQeUNGdW5jdGlvbilzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UsCU1FVEhfTywKLQkgc3ltbWV0cmljX2RpZmZlcmVuY2VfZG9jfSwKLQl7InN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSIsKFB5Q0Z1bmN0aW9uKXNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUsCU1FVEhfTywKLQkgc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlX2RvY30sCisgICAgeyJhZGQiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2FkZCwgICAgICAgICAgIE1FVEhfTywKKyAgICAgYWRkX2RvY30sCisgICAgeyJjbGVhciIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2NsZWFyLCAgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBjbGVhcl9kb2N9LAorICAgIHsiX19jb250YWluc19fIiwoUHlDRnVuY3Rpb24pc2V0X2RpcmVjdF9jb250YWlucywgICAgICAgICAgIE1FVEhfTyB8IE1FVEhfQ09FWElTVCwKKyAgICAgY29udGFpbnNfZG9jfSwKKyAgICB7ImNvcHkiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfY29weSwgICAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIGNvcHlfZG9jfSwKKyAgICB7ImRpc2NhcmQiLCAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfZGlzY2FyZCwgICAgICAgTUVUSF9PLAorICAgICBkaXNjYXJkX2RvY30sCisgICAgeyJkaWZmZXJlbmNlIiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2RpZmZlcmVuY2VfbXVsdGksICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBkaWZmZXJlbmNlX2RvY30sCisgICAgeyJkaWZmZXJlbmNlX3VwZGF0ZSIsICAgICAgIChQeUNGdW5jdGlvbilzZXRfZGlmZmVyZW5jZV91cGRhdGUsICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIGRpZmZlcmVuY2VfdXBkYXRlX2RvY30sCisgICAgeyJpbnRlcnNlY3Rpb24iLChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX211bHRpLCAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBpbnRlcnNlY3Rpb25fZG9jfSwKKyAgICB7ImludGVyc2VjdGlvbl91cGRhdGUiLChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX3VwZGF0ZV9tdWx0aSwgICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBpbnRlcnNlY3Rpb25fdXBkYXRlX2RvY30sCisgICAgeyJpc2Rpc2pvaW50IiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2lzZGlzam9pbnQsICAgIE1FVEhfTywKKyAgICAgaXNkaXNqb2ludF9kb2N9LAorICAgIHsiaXNzdWJzZXQiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pc3N1YnNldCwgICAgICBNRVRIX08sCisgICAgIGlzc3Vic2V0X2RvY30sCisgICAgeyJpc3N1cGVyc2V0IiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2lzc3VwZXJzZXQsICAgIE1FVEhfTywKKyAgICAgaXNzdXBlcnNldF9kb2N9LAorICAgIHsicG9wIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9wb3AsICAgICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgcG9wX2RvY30sCisgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X3JlZHVjZSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICByZWR1Y2VfZG9jfSwKKyAgICB7InJlbW92ZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfcmVtb3ZlLCAgICAgICAgTUVUSF9PLAorICAgICByZW1vdmVfZG9jfSwKKyAgICB7Il9fc2l6ZW9mX18iLCAgICAgIChQeUNGdW5jdGlvbilzZXRfc2l6ZW9mLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHNpemVvZl9kb2N9LAorICAgIHsic3ltbWV0cmljX2RpZmZlcmVuY2UiLChQeUNGdW5jdGlvbilzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UsICAgICAgTUVUSF9PLAorICAgICBzeW1tZXRyaWNfZGlmZmVyZW5jZV9kb2N9LAorICAgIHsic3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlIiwoUHlDRnVuY3Rpb24pc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSwgICAgICAgIE1FVEhfTywKKyAgICAgc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlX2RvY30sCiAjaWZkZWYgUHlfREVCVUcKLQl7InRlc3RfY19hcGkiLAkoUHlDRnVuY3Rpb24pdGVzdF9jX2FwaSwJTUVUSF9OT0FSR1MsCi0JIHRlc3RfY19hcGlfZG9jfSwKKyAgICB7InRlc3RfY19hcGkiLCAgICAgIChQeUNGdW5jdGlvbil0ZXN0X2NfYXBpLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHRlc3RfY19hcGlfZG9jfSwKICNlbmRpZgotCXsidW5pb24iLAkoUHlDRnVuY3Rpb24pc2V0X3VuaW9uLAkJTUVUSF9WQVJBUkdTLAotCSB1bmlvbl9kb2N9LAotCXsidXBkYXRlIiwJKFB5Q0Z1bmN0aW9uKXNldF91cGRhdGUsCU1FVEhfVkFSQVJHUywKLQkgdXBkYXRlX2RvY30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsidW5pb24iLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF91bmlvbiwgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIHVuaW9uX2RvY30sCisgICAgeyJ1cGRhdGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3VwZGF0ZSwgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgdXBkYXRlX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIHNldF9hc19udW1iZXIgPSB7Ci0JMCwJCQkJLypuYl9hZGQqLwotCShiaW5hcnlmdW5jKXNldF9zdWIsCQkvKm5iX3N1YnRyYWN0Ki8KLQkwLAkJCQkvKm5iX211bHRpcGx5Ki8KLQkwLAkJCQkvKm5iX2RpdmlkZSovCi0JMCwJCQkJLypuYl9yZW1haW5kZXIqLwotCTAsCQkJCS8qbmJfZGl2bW9kKi8KLQkwLAkJCQkvKm5iX3Bvd2VyKi8KLQkwLAkJCQkvKm5iX25lZ2F0aXZlKi8KLQkwLAkJCQkvKm5iX3Bvc2l0aXZlKi8KLQkwLAkJCQkvKm5iX2Fic29sdXRlKi8KLQkwLAkJCQkvKm5iX25vbnplcm8qLwotCTAsCQkJCS8qbmJfaW52ZXJ0Ki8KLQkwLAkJCQkvKm5iX2xzaGlmdCovCi0JMCwJCQkJLypuYl9yc2hpZnQqLwotCShiaW5hcnlmdW5jKXNldF9hbmQsCQkvKm5iX2FuZCovCi0JKGJpbmFyeWZ1bmMpc2V0X3hvciwJCS8qbmJfeG9yKi8KLQkoYmluYXJ5ZnVuYylzZXRfb3IsCQkvKm5iX29yKi8KLQkwLAkJCQkvKm5iX2NvZXJjZSovCi0JMCwJCQkJLypuYl9pbnQqLwotCTAsCQkJCS8qbmJfbG9uZyovCi0JMCwJCQkJLypuYl9mbG9hdCovCi0JMCwJCQkJLypuYl9vY3QqLwotCTAsIAkJCQkvKm5iX2hleCovCi0JMCwJCQkJLypuYl9pbnBsYWNlX2FkZCovCi0JKGJpbmFyeWZ1bmMpc2V0X2lzdWIsCQkvKm5iX2lucGxhY2Vfc3VidHJhY3QqLwotCTAsCQkJCS8qbmJfaW5wbGFjZV9tdWx0aXBseSovCi0JMCwJCQkJLypuYl9pbnBsYWNlX2RpdmlkZSovCi0JMCwJCQkJLypuYl9pbnBsYWNlX3JlbWFpbmRlciovCi0JMCwJCQkJLypuYl9pbnBsYWNlX3Bvd2VyKi8KLQkwLAkJCQkvKm5iX2lucGxhY2VfbHNoaWZ0Ki8KLQkwLAkJCQkvKm5iX2lucGxhY2VfcnNoaWZ0Ki8KLQkoYmluYXJ5ZnVuYylzZXRfaWFuZCwJCS8qbmJfaW5wbGFjZV9hbmQqLwotCShiaW5hcnlmdW5jKXNldF9peG9yLAkJLypuYl9pbnBsYWNlX3hvciovCi0JKGJpbmFyeWZ1bmMpc2V0X2lvciwJCS8qbmJfaW5wbGFjZV9vciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9hZGQqLworICAgIChiaW5hcnlmdW5jKXNldF9zdWIsICAgICAgICAgICAgICAgIC8qbmJfc3VidHJhY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbXVsdGlwbHkqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfZGl2aWRlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3JlbWFpbmRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9kaXZtb2QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfcG93ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbmVnYXRpdmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfcG9zaXRpdmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfYWJzb2x1dGUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbm9uemVybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnZlcnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbHNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3JzaGlmdCovCisgICAgKGJpbmFyeWZ1bmMpc2V0X2FuZCwgICAgICAgICAgICAgICAgLypuYl9hbmQqLworICAgIChiaW5hcnlmdW5jKXNldF94b3IsICAgICAgICAgICAgICAgIC8qbmJfeG9yKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfb3IsICAgICAgICAgICAgICAgICAvKm5iX29yKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2NvZXJjZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbG9uZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9mbG9hdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9vY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaGV4Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfYWRkKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfaXN1YiwgICAgICAgICAgICAgICAvKm5iX2lucGxhY2Vfc3VidHJhY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9tdWx0aXBseSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2RpdmlkZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3JlbWFpbmRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3Bvd2VyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfbHNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcnNoaWZ0Ki8KKyAgICAoYmluYXJ5ZnVuYylzZXRfaWFuZCwgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfYW5kKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfaXhvciwgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfeG9yKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfaW9yLCAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2Vfb3IqLwogfTsKIAogUHlEb2NfU1RSVkFSKHNldF9kb2MsCkBAIC0yMTEwLDk2ICsyMTEwLDk2IEBACiBCdWlsZCBhbiB1bm9yZGVyZWQgY29sbGVjdGlvbiBvZiB1bmlxdWUgZWxlbWVudHMuIik7CiAKIFB5VHlwZU9iamVjdCBQeVNldF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInNldCIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoUHlTZXRPYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3Ipc2V0X2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKXNldF90cF9wcmludCwJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCXNldF9ub2NtcCwJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKXNldF9yZXByLAkJLyogdHBfcmVwciAqLwotCSZzZXRfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCSZzZXRfYXNfc2VxdWVuY2UsCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkLAkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlzZXRfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2Mpc2V0X3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KXNldF9jbGVhcl9pbnRlcm5hbCwJLyogdHBfY2xlYXIgKi8KLQkocmljaGNtcGZ1bmMpc2V0X3JpY2hjb21wYXJlLAkvKiB0cF9yaWNoY29tcGFyZSAqLwotCW9mZnNldG9mKFB5U2V0T2JqZWN0LCB3ZWFrcmVmbGlzdCksCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JKGdldGl0ZXJmdW5jKXNldF9pdGVyLAkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzZXRfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylzZXRfaW5pdCwJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJLyogdHBfYWxsb2MgKi8KLQlzZXRfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJzZXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlTZXRPYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilzZXRfZGVhbGxvYywgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKHByaW50ZnVuYylzZXRfdHBfcHJpbnQsICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIHNldF9ub2NtcCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpc2V0X3JlcHIsICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJnNldF9hc19udW1iZXIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJnNldF9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKVB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgc2V0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylzZXRfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlzZXRfY2xlYXJfaW50ZXJuYWwsICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIChyaWNoY21wZnVuYylzZXRfcmljaGNvbXBhcmUsICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlTZXRPYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIChnZXRpdGVyZnVuYylzZXRfaXRlciwgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzZXRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylzZXRfaW5pdCwgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHNldF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIGZyb3plbnNldCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIGZyb3plbnNldF9tZXRob2RzW10gPSB7Ci0JeyJfX2NvbnRhaW5zX18iLChQeUNGdW5jdGlvbilzZXRfZGlyZWN0X2NvbnRhaW5zLAlNRVRIX08gfCBNRVRIX0NPRVhJU1QsCi0JIGNvbnRhaW5zX2RvY30sCi0JeyJjb3B5IiwJKFB5Q0Z1bmN0aW9uKWZyb3plbnNldF9jb3B5LAlNRVRIX05PQVJHUywKLQkgY29weV9kb2N9LAotCXsiZGlmZmVyZW5jZSIsCShQeUNGdW5jdGlvbilzZXRfZGlmZmVyZW5jZV9tdWx0aSwJTUVUSF9WQVJBUkdTLAotCSBkaWZmZXJlbmNlX2RvY30sCi0JeyJpbnRlcnNlY3Rpb24iLChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX211bHRpLAlNRVRIX1ZBUkFSR1MsCi0JIGludGVyc2VjdGlvbl9kb2N9LAotCXsiaXNkaXNqb2ludCIsCShQeUNGdW5jdGlvbilzZXRfaXNkaXNqb2ludCwJTUVUSF9PLAotCSBpc2Rpc2pvaW50X2RvY30sCi0JeyJpc3N1YnNldCIsCShQeUNGdW5jdGlvbilzZXRfaXNzdWJzZXQsCU1FVEhfTywKLQkgaXNzdWJzZXRfZG9jfSwKLQl7Imlzc3VwZXJzZXQiLAkoUHlDRnVuY3Rpb24pc2V0X2lzc3VwZXJzZXQsCU1FVEhfTywKLQkgaXNzdXBlcnNldF9kb2N9LAotCXsiX19yZWR1Y2VfXyIsCShQeUNGdW5jdGlvbilzZXRfcmVkdWNlLAlNRVRIX05PQVJHUywKLQkgcmVkdWNlX2RvY30sCi0JeyJfX3NpemVvZl9fIiwJKFB5Q0Z1bmN0aW9uKXNldF9zaXplb2YsCU1FVEhfTk9BUkdTLAotCSBzaXplb2ZfZG9jfSwKLQl7InN5bW1ldHJpY19kaWZmZXJlbmNlIiwoUHlDRnVuY3Rpb24pc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlLAlNRVRIX08sCi0JIHN5bW1ldHJpY19kaWZmZXJlbmNlX2RvY30sCi0JeyJ1bmlvbiIsCShQeUNGdW5jdGlvbilzZXRfdW5pb24sCQlNRVRIX1ZBUkFSR1MsCi0JIHVuaW9uX2RvY30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiX19jb250YWluc19fIiwoUHlDRnVuY3Rpb24pc2V0X2RpcmVjdF9jb250YWlucywgICAgICAgICAgIE1FVEhfTyB8IE1FVEhfQ09FWElTVCwKKyAgICAgY29udGFpbnNfZG9jfSwKKyAgICB7ImNvcHkiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilmcm96ZW5zZXRfY29weSwgICAgTUVUSF9OT0FSR1MsCisgICAgIGNvcHlfZG9jfSwKKyAgICB7ImRpZmZlcmVuY2UiLCAgICAgIChQeUNGdW5jdGlvbilzZXRfZGlmZmVyZW5jZV9tdWx0aSwgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIGRpZmZlcmVuY2VfZG9jfSwKKyAgICB7ImludGVyc2VjdGlvbiIsKFB5Q0Z1bmN0aW9uKXNldF9pbnRlcnNlY3Rpb25fbXVsdGksICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIGludGVyc2VjdGlvbl9kb2N9LAorICAgIHsiaXNkaXNqb2ludCIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pc2Rpc2pvaW50LCAgICBNRVRIX08sCisgICAgIGlzZGlzam9pbnRfZG9jfSwKKyAgICB7Imlzc3Vic2V0IiwgICAgICAgIChQeUNGdW5jdGlvbilzZXRfaXNzdWJzZXQsICAgICAgTUVUSF9PLAorICAgICBpc3N1YnNldF9kb2N9LAorICAgIHsiaXNzdXBlcnNldCIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pc3N1cGVyc2V0LCAgICBNRVRIX08sCisgICAgIGlzc3VwZXJzZXRfZG9jfSwKKyAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbilzZXRfcmVkdWNlLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHJlZHVjZV9kb2N9LAorICAgIHsiX19zaXplb2ZfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9zaXplb2YsICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgc2l6ZW9mX2RvY30sCisgICAgeyJzeW1tZXRyaWNfZGlmZmVyZW5jZSIsKFB5Q0Z1bmN0aW9uKXNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZSwgICAgICBNRVRIX08sCisgICAgIHN5bW1ldHJpY19kaWZmZXJlbmNlX2RvY30sCisgICAgeyJ1bmlvbiIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3VuaW9uLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgdW5pb25fZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgZnJvemVuc2V0X2FzX251bWJlciA9IHsKLQkwLAkJCQkvKm5iX2FkZCovCi0JKGJpbmFyeWZ1bmMpc2V0X3N1YiwJCS8qbmJfc3VidHJhY3QqLwotCTAsCQkJCS8qbmJfbXVsdGlwbHkqLwotCTAsCQkJCS8qbmJfZGl2aWRlKi8KLQkwLAkJCQkvKm5iX3JlbWFpbmRlciovCi0JMCwJCQkJLypuYl9kaXZtb2QqLwotCTAsCQkJCS8qbmJfcG93ZXIqLwotCTAsCQkJCS8qbmJfbmVnYXRpdmUqLwotCTAsCQkJCS8qbmJfcG9zaXRpdmUqLwotCTAsCQkJCS8qbmJfYWJzb2x1dGUqLwotCTAsCQkJCS8qbmJfbm9uemVybyovCi0JMCwJCQkJLypuYl9pbnZlcnQqLwotCTAsCQkJCS8qbmJfbHNoaWZ0Ki8KLQkwLAkJCQkvKm5iX3JzaGlmdCovCi0JKGJpbmFyeWZ1bmMpc2V0X2FuZCwJCS8qbmJfYW5kKi8KLQkoYmluYXJ5ZnVuYylzZXRfeG9yLAkJLypuYl94b3IqLwotCShiaW5hcnlmdW5jKXNldF9vciwJCS8qbmJfb3IqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfYWRkKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfc3ViLCAgICAgICAgICAgICAgICAvKm5iX3N1YnRyYWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX211bHRpcGx5Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2RpdmlkZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9yZW1haW5kZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfZGl2bW9kKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3Bvd2VyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX25lZ2F0aXZlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3Bvc2l0aXZlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2Fic29sdXRlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX25vbnplcm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2xzaGlmdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9yc2hpZnQqLworICAgIChiaW5hcnlmdW5jKXNldF9hbmQsICAgICAgICAgICAgICAgIC8qbmJfYW5kKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfeG9yLCAgICAgICAgICAgICAgICAvKm5iX3hvciovCisgICAgKGJpbmFyeWZ1bmMpc2V0X29yLCAgICAgICAgICAgICAgICAgLypuYl9vciovCiB9OwogCiBQeURvY19TVFJWQVIoZnJvemVuc2V0X2RvYywKQEAgLTIyMDksNDcgKzIyMDksNDcgQEAKIEJ1aWxkIGFuIGltbXV0YWJsZSB1bm9yZGVyZWQgY29sbGVjdGlvbiBvZiB1bmlxdWUgZWxlbWVudHMuIik7CiAKIFB5VHlwZU9iamVjdCBQeUZyb3plblNldF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImZyb3plbnNldCIsCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeVNldE9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilzZXRfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCShwcmludGZ1bmMpc2V0X3RwX3ByaW50LAkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0Jc2V0X25vY21wLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpc2V0X3JlcHIsCQkvKiB0cF9yZXByICovCi0JJmZyb3plbnNldF9hc19udW1iZXIsCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmc2V0X2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JZnJvemVuc2V0X2hhc2gsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JZnJvemVuc2V0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXNldF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlzZXRfY2xlYXJfaW50ZXJuYWwsCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKXNldF9yaWNoY29tcGFyZSwJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihQeVNldE9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCShnZXRpdGVyZnVuYylzZXRfaXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWZyb3plbnNldF9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCS8qIHRwX2FsbG9jICovCi0JZnJvemVuc2V0X25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZnJvemVuc2V0IiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5U2V0T2JqZWN0KSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3Ipc2V0X2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpc2V0X3RwX3ByaW50LCAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICBzZXRfbm9jbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXNldF9yZXByLCAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZmcm96ZW5zZXRfYXNfbnVtYmVyLCAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZzZXRfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIGZyb3plbnNldF9oYXNoLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBmcm96ZW5zZXRfZG9jLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXNldF90cmF2ZXJzZSwgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KXNldF9jbGVhcl9pbnRlcm5hbCwgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKXNldF9yaWNoY29tcGFyZSwgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeVNldE9iamVjdCwgd2Vha3JlZmxpc3QpLCAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgKGdldGl0ZXJmdW5jKXNldF9pdGVyLCAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZnJvemVuc2V0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBmcm96ZW5zZXRfbmV3LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKQEAgLTIyNTgsMjUyICsyMjU4LDI1MiBAQAogUHlPYmplY3QgKgogUHlTZXRfTmV3KFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKLQlyZXR1cm4gbWFrZV9uZXdfc2V0KCZQeVNldF9UeXBlLCBpdGVyYWJsZSk7CisgICAgcmV0dXJuIG1ha2VfbmV3X3NldCgmUHlTZXRfVHlwZSwgaXRlcmFibGUpOwogfQogCiBQeU9iamVjdCAqCiBQeUZyb3plblNldF9OZXcoUHlPYmplY3QgKml0ZXJhYmxlKQogewotCXJldHVybiBtYWtlX25ld19zZXQoJlB5RnJvemVuU2V0X1R5cGUsIGl0ZXJhYmxlKTsKKyAgICByZXR1cm4gbWFrZV9uZXdfc2V0KCZQeUZyb3plblNldF9UeXBlLCBpdGVyYWJsZSk7CiB9CiAKIFB5X3NzaXplX3QKIFB5U2V0X1NpemUoUHlPYmplY3QgKmFueXNldCkKIHsKLQlpZiAoIVB5QW55U2V0X0NoZWNrKGFueXNldCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIFB5U2V0X0dFVF9TSVpFKGFueXNldCk7CisgICAgaWYgKCFQeUFueVNldF9DaGVjayhhbnlzZXQpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBQeVNldF9HRVRfU0laRShhbnlzZXQpOwogfQogCiBpbnQKIFB5U2V0X0NsZWFyKFB5T2JqZWN0ICpzZXQpCiB7Ci0JaWYgKCFQeVNldF9DaGVjayhzZXQpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBzZXRfY2xlYXJfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopc2V0KTsKKyAgICBpZiAoIVB5U2V0X0NoZWNrKHNldCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNldF9jbGVhcl9pbnRlcm5hbCgoUHlTZXRPYmplY3QgKilzZXQpOwogfQogCiBpbnQKIFB5U2V0X0NvbnRhaW5zKFB5T2JqZWN0ICphbnlzZXQsIFB5T2JqZWN0ICprZXkpCiB7Ci0JaWYgKCFQeUFueVNldF9DaGVjayhhbnlzZXQpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBzZXRfY29udGFpbnNfa2V5KChQeVNldE9iamVjdCAqKWFueXNldCwga2V5KTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKGFueXNldCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNldF9jb250YWluc19rZXkoKFB5U2V0T2JqZWN0ICopYW55c2V0LCBrZXkpOwogfQogCiBpbnQKIFB5U2V0X0Rpc2NhcmQoUHlPYmplY3QgKnNldCwgUHlPYmplY3QgKmtleSkKIHsKLQlpZiAoIVB5U2V0X0NoZWNrKHNldCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIHNldF9kaXNjYXJkX2tleSgoUHlTZXRPYmplY3QgKilzZXQsIGtleSk7CisgICAgaWYgKCFQeVNldF9DaGVjayhzZXQpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBzZXRfZGlzY2FyZF9rZXkoKFB5U2V0T2JqZWN0ICopc2V0LCBrZXkpOwogfQogCiBpbnQKIFB5U2V0X0FkZChQeU9iamVjdCAqYW55c2V0LCBQeU9iamVjdCAqa2V5KQogewotCWlmICghUHlTZXRfQ2hlY2soYW55c2V0KSAmJiAKLQkgICAgKCFQeUZyb3plblNldF9DaGVjayhhbnlzZXQpIHx8IFB5X1JFRkNOVChhbnlzZXQpICE9IDEpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBzZXRfYWRkX2tleSgoUHlTZXRPYmplY3QgKilhbnlzZXQsIGtleSk7CisgICAgaWYgKCFQeVNldF9DaGVjayhhbnlzZXQpICYmCisgICAgICAgICghUHlGcm96ZW5TZXRfQ2hlY2soYW55c2V0KSB8fCBQeV9SRUZDTlQoYW55c2V0KSAhPSAxKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc2V0X2FkZF9rZXkoKFB5U2V0T2JqZWN0ICopYW55c2V0LCBrZXkpOwogfQogCiBpbnQKIF9QeVNldF9OZXh0KFB5T2JqZWN0ICpzZXQsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXkpCiB7Ci0Jc2V0ZW50cnkgKmVudHJ5X3B0cjsKKyAgICBzZXRlbnRyeSAqZW50cnlfcHRyOwogCi0JaWYgKCFQeUFueVNldF9DaGVjayhzZXQpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChzZXRfbmV4dCgoUHlTZXRPYmplY3QgKilzZXQsIHBvcywgJmVudHJ5X3B0cikgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JKmtleSA9IGVudHJ5X3B0ci0+a2V5OwotCXJldHVybiAxOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2soc2V0KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopc2V0LCBwb3MsICZlbnRyeV9wdHIpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgICprZXkgPSBlbnRyeV9wdHItPmtleTsKKyAgICByZXR1cm4gMTsKIH0KIAogaW50CiBfUHlTZXRfTmV4dEVudHJ5KFB5T2JqZWN0ICpzZXQsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXksIGxvbmcgKmhhc2gpCiB7Ci0Jc2V0ZW50cnkgKmVudHJ5OworICAgIHNldGVudHJ5ICplbnRyeTsKIAotCWlmICghUHlBbnlTZXRfQ2hlY2soc2V0KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopc2V0LCBwb3MsICZlbnRyeSkgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JKmtleSA9IGVudHJ5LT5rZXk7Ci0JKmhhc2ggPSBlbnRyeS0+aGFzaDsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNldCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKXNldCwgcG9zLCAmZW50cnkpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgICprZXkgPSBlbnRyeS0+a2V5OworICAgICpoYXNoID0gZW50cnktPmhhc2g7CisgICAgcmV0dXJuIDE7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2V0X1BvcChQeU9iamVjdCAqc2V0KQogewotCWlmICghUHlTZXRfQ2hlY2soc2V0KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzZXRfcG9wKChQeVNldE9iamVjdCAqKXNldCk7CisgICAgaWYgKCFQeVNldF9DaGVjayhzZXQpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHNldF9wb3AoKFB5U2V0T2JqZWN0ICopc2V0KTsKIH0KIAogaW50CiBfUHlTZXRfVXBkYXRlKFB5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKLQlpZiAoIVB5U2V0X0NoZWNrKHNldCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIHNldF91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopc2V0LCBpdGVyYWJsZSk7CisgICAgaWYgKCFQeVNldF9DaGVjayhzZXQpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBzZXRfdXBkYXRlX2ludGVybmFsKChQeVNldE9iamVjdCAqKXNldCwgaXRlcmFibGUpOwogfQogCiAjaWZkZWYgUHlfREVCVUcKIAotLyogVGVzdCBjb2RlIHRvIGJlIGNhbGxlZCB3aXRoIGFueSB0aHJlZSBlbGVtZW50IHNldC4gCisvKiBUZXN0IGNvZGUgdG8gYmUgY2FsbGVkIHdpdGggYW55IHRocmVlIGVsZW1lbnQgc2V0LgogICAgUmV0dXJucyBUcnVlIGFuZCBvcmlnaW5hbCBzZXQgaXMgcmVzdG9yZWQuICovCiAKLSNkZWZpbmUgYXNzZXJ0UmFpc2VzKGNhbGxfcmV0dXJuX3ZhbHVlLCBleGNlcHRpb24pCQlcCi0JZG8gewkJCQkJCQlcCi0JCWFzc2VydChjYWxsX3JldHVybl92YWx1ZSk7CQkJXAotCQlhc3NlcnQoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhleGNlcHRpb24pKTsJXAotCQlQeUVycl9DbGVhcigpOwkJCQkJXAotCX0gd2hpbGUoMCkKKyNkZWZpbmUgYXNzZXJ0UmFpc2VzKGNhbGxfcmV0dXJuX3ZhbHVlLCBleGNlcHRpb24pICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NlcnQoY2FsbF9yZXR1cm5fdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXNzZXJ0KFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoZXhjZXB0aW9uKSk7ICAgICAgICAgICAgICBcCisgICAgICAgIFB5RXJyX0NsZWFyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfY19hcGkoUHlTZXRPYmplY3QgKnNvKQogewotCVB5X3NzaXplX3QgY291bnQ7Ci0JY2hhciAqczsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKmVsZW09TlVMTCwgKmR1cD1OVUxMLCAqdCwgKmYsICpkdXAyLCAqeDsKLQlQeU9iamVjdCAqb2IgPSAoUHlPYmplY3QgKilzbzsKLQlQeU9iamVjdCAqc3RyOworICAgIFB5X3NzaXplX3QgY291bnQ7CisgICAgY2hhciAqczsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKmVsZW09TlVMTCwgKmR1cD1OVUxMLCAqdCwgKmYsICpkdXAyLCAqeDsKKyAgICBQeU9iamVjdCAqb2IgPSAoUHlPYmplY3QgKilzbzsKKyAgICBQeU9iamVjdCAqc3RyOwogCi0JLyogVmVyaWZ5IHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoUHlBbnlTZXRfQ2hlY2sob2IpKTsKLQlhc3NlcnQoUHlBbnlTZXRfQ2hlY2tFeGFjdChvYikpOwotCWFzc2VydCghUHlGcm96ZW5TZXRfQ2hlY2tFeGFjdChvYikpOworICAgIC8qIFZlcmlmeSBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KFB5QW55U2V0X0NoZWNrKG9iKSk7CisgICAgYXNzZXJ0KFB5QW55U2V0X0NoZWNrRXhhY3Qob2IpKTsKKyAgICBhc3NlcnQoIVB5RnJvemVuU2V0X0NoZWNrRXhhY3Qob2IpKTsKIAotCS8qIHNvLmNsZWFyKCk7IHNvIHw9IHNldCgiYWJjIik7ICovCi0Jc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZygiYWJjIik7Ci0JaWYgKHN0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRfY2xlYXJfaW50ZXJuYWwoc28pOwotCWlmIChzZXRfdXBkYXRlX2ludGVybmFsKHNvLCBzdHIpID09IC0xKSB7Ci0JCVB5X0RFQ1JFRihzdHIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfREVDUkVGKHN0cik7CisgICAgLyogc28uY2xlYXIoKTsgc28gfD0gc2V0KCJhYmMiKTsgKi8KKyAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJhYmMiKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldF9jbGVhcl9pbnRlcm5hbChzbyk7CisgICAgaWYgKHNldF91cGRhdGVfaW50ZXJuYWwoc28sIHN0cikgPT0gLTEpIHsKKyAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYoc3RyKTsKIAotCS8qIEV4ZXJjaXNlIHR5cGUvc2l6ZSBjaGVja3MgKi8KLQlhc3NlcnQoUHlTZXRfU2l6ZShvYikgPT0gMyk7Ci0JYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAzKTsKKyAgICAvKiBFeGVyY2lzZSB0eXBlL3NpemUgY2hlY2tzICovCisgICAgYXNzZXJ0KFB5U2V0X1NpemUob2IpID09IDMpOworICAgIGFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMyk7CiAKLQkvKiBSYWlzZSBUeXBlRXJyb3IgZm9yIG5vbi1pdGVyYWJsZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKi8KLQlhc3NlcnRSYWlzZXMoUHlTZXRfTmV3KFB5X05vbmUpID09IE5VTEwsIFB5RXhjX1R5cGVFcnJvcik7Ci0JYXNzZXJ0UmFpc2VzKFB5RnJvemVuU2V0X05ldyhQeV9Ob25lKSA9PSBOVUxMLCBQeUV4Y19UeXBlRXJyb3IpOworICAgIC8qIFJhaXNlIFR5cGVFcnJvciBmb3Igbm9uLWl0ZXJhYmxlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyAqLworICAgIGFzc2VydFJhaXNlcyhQeVNldF9OZXcoUHlfTm9uZSkgPT0gTlVMTCwgUHlFeGNfVHlwZUVycm9yKTsKKyAgICBhc3NlcnRSYWlzZXMoUHlGcm96ZW5TZXRfTmV3KFB5X05vbmUpID09IE5VTEwsIFB5RXhjX1R5cGVFcnJvcik7CiAKLQkvKiBSYWlzZSBUeXBlRXJyb3IgZm9yIHVuaGFzaGFibGUga2V5ICovCi0JZHVwID0gUHlTZXRfTmV3KG9iKTsKLQlhc3NlcnRSYWlzZXMoUHlTZXRfRGlzY2FyZChvYiwgZHVwKSA9PSAtMSwgUHlFeGNfVHlwZUVycm9yKTsKLQlhc3NlcnRSYWlzZXMoUHlTZXRfQ29udGFpbnMob2IsIGR1cCkgPT0gLTEsIFB5RXhjX1R5cGVFcnJvcik7Ci0JYXNzZXJ0UmFpc2VzKFB5U2V0X0FkZChvYiwgZHVwKSA9PSAtMSwgUHlFeGNfVHlwZUVycm9yKTsKKyAgICAvKiBSYWlzZSBUeXBlRXJyb3IgZm9yIHVuaGFzaGFibGUga2V5ICovCisgICAgZHVwID0gUHlTZXRfTmV3KG9iKTsKKyAgICBhc3NlcnRSYWlzZXMoUHlTZXRfRGlzY2FyZChvYiwgZHVwKSA9PSAtMSwgUHlFeGNfVHlwZUVycm9yKTsKKyAgICBhc3NlcnRSYWlzZXMoUHlTZXRfQ29udGFpbnMob2IsIGR1cCkgPT0gLTEsIFB5RXhjX1R5cGVFcnJvcik7CisgICAgYXNzZXJ0UmFpc2VzKFB5U2V0X0FkZChvYiwgZHVwKSA9PSAtMSwgUHlFeGNfVHlwZUVycm9yKTsKIAotCS8qIEV4ZXJjaXNlIHN1Y2Nlc3NmdWwgcG9wLCBjb250YWlucywgYWRkLCBhbmQgZGlzY2FyZCAqLwotCWVsZW0gPSBQeVNldF9Qb3Aob2IpOwotCWFzc2VydChQeVNldF9Db250YWlucyhvYiwgZWxlbSkgPT0gMCk7Ci0JYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAyKTsKLQlhc3NlcnQoUHlTZXRfQWRkKG9iLCBlbGVtKSA9PSAwKTsKLQlhc3NlcnQoUHlTZXRfQ29udGFpbnMob2IsIGVsZW0pID09IDEpOwotCWFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMyk7Ci0JYXNzZXJ0KFB5U2V0X0Rpc2NhcmQob2IsIGVsZW0pID09IDEpOwotCWFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMik7Ci0JYXNzZXJ0KFB5U2V0X0Rpc2NhcmQob2IsIGVsZW0pID09IDApOwotCWFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMik7CisgICAgLyogRXhlcmNpc2Ugc3VjY2Vzc2Z1bCBwb3AsIGNvbnRhaW5zLCBhZGQsIGFuZCBkaXNjYXJkICovCisgICAgZWxlbSA9IFB5U2V0X1BvcChvYik7CisgICAgYXNzZXJ0KFB5U2V0X0NvbnRhaW5zKG9iLCBlbGVtKSA9PSAwKTsKKyAgICBhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDIpOworICAgIGFzc2VydChQeVNldF9BZGQob2IsIGVsZW0pID09IDApOworICAgIGFzc2VydChQeVNldF9Db250YWlucyhvYiwgZWxlbSkgPT0gMSk7CisgICAgYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAzKTsKKyAgICBhc3NlcnQoUHlTZXRfRGlzY2FyZChvYiwgZWxlbSkgPT0gMSk7CisgICAgYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAyKTsKKyAgICBhc3NlcnQoUHlTZXRfRGlzY2FyZChvYiwgZWxlbSkgPT0gMCk7CisgICAgYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAyKTsKIAotCS8qIEV4ZXJjaXNlIGNsZWFyICovCi0JZHVwMiA9IFB5U2V0X05ldyhkdXApOwotCWFzc2VydChQeVNldF9DbGVhcihkdXAyKSA9PSAwKTsKLQlhc3NlcnQoUHlTZXRfU2l6ZShkdXAyKSA9PSAwKTsKLQlQeV9ERUNSRUYoZHVwMik7CisgICAgLyogRXhlcmNpc2UgY2xlYXIgKi8KKyAgICBkdXAyID0gUHlTZXRfTmV3KGR1cCk7CisgICAgYXNzZXJ0KFB5U2V0X0NsZWFyKGR1cDIpID09IDApOworICAgIGFzc2VydChQeVNldF9TaXplKGR1cDIpID09IDApOworICAgIFB5X0RFQ1JFRihkdXAyKTsKIAotCS8qIFJhaXNlIFN5c3RlbUVycm9yIG9uIGNsZWFyIG9yIHVwZGF0ZSBvZiBmcm96ZW4gc2V0ICovCi0JZiA9IFB5RnJvemVuU2V0X05ldyhkdXApOwotCWFzc2VydFJhaXNlcyhQeVNldF9DbGVhcihmKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOwotCWFzc2VydFJhaXNlcyhfUHlTZXRfVXBkYXRlKGYsIGR1cCkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKLQlhc3NlcnQoUHlTZXRfQWRkKGYsIGVsZW0pID09IDApOwotCVB5X0lOQ1JFRihmKTsKLQlhc3NlcnRSYWlzZXMoUHlTZXRfQWRkKGYsIGVsZW0pID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7Ci0JUHlfREVDUkVGKGYpOwotCVB5X0RFQ1JFRihmKTsKKyAgICAvKiBSYWlzZSBTeXN0ZW1FcnJvciBvbiBjbGVhciBvciB1cGRhdGUgb2YgZnJvemVuIHNldCAqLworICAgIGYgPSBQeUZyb3plblNldF9OZXcoZHVwKTsKKyAgICBhc3NlcnRSYWlzZXMoUHlTZXRfQ2xlYXIoZikgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKKyAgICBhc3NlcnRSYWlzZXMoX1B5U2V0X1VwZGF0ZShmLCBkdXApID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7CisgICAgYXNzZXJ0KFB5U2V0X0FkZChmLCBlbGVtKSA9PSAwKTsKKyAgICBQeV9JTkNSRUYoZik7CisgICAgYXNzZXJ0UmFpc2VzKFB5U2V0X0FkZChmLCBlbGVtKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOworICAgIFB5X0RFQ1JFRihmKTsKKyAgICBQeV9ERUNSRUYoZik7CiAKLQkvKiBFeGVyY2lzZSBkaXJlY3QgaXRlcmF0aW9uICovCi0JaSA9IDAsIGNvdW50ID0gMDsKLQl3aGlsZSAoX1B5U2V0X05leHQoKFB5T2JqZWN0ICopZHVwLCAmaSwgJngpKSB7Ci0JCXMgPSBQeVN0cmluZ19Bc1N0cmluZyh4KTsKLQkJYXNzZXJ0KHMgJiYgKHNbMF0gPT0gJ2EnIHx8IHNbMF0gPT0gJ2InIHx8IHNbMF0gPT0gJ2MnKSk7Ci0JCWNvdW50Kys7Ci0JfQotCWFzc2VydChjb3VudCA9PSAzKTsKKyAgICAvKiBFeGVyY2lzZSBkaXJlY3QgaXRlcmF0aW9uICovCisgICAgaSA9IDAsIGNvdW50ID0gMDsKKyAgICB3aGlsZSAoX1B5U2V0X05leHQoKFB5T2JqZWN0ICopZHVwLCAmaSwgJngpKSB7CisgICAgICAgIHMgPSBQeVN0cmluZ19Bc1N0cmluZyh4KTsKKyAgICAgICAgYXNzZXJ0KHMgJiYgKHNbMF0gPT0gJ2EnIHx8IHNbMF0gPT0gJ2InIHx8IHNbMF0gPT0gJ2MnKSk7CisgICAgICAgIGNvdW50Kys7CisgICAgfQorICAgIGFzc2VydChjb3VudCA9PSAzKTsKIAotCS8qIEV4ZXJjaXNlIHVwZGF0ZXMgKi8KLQlkdXAyID0gUHlTZXRfTmV3KE5VTEwpOwotCWFzc2VydChfUHlTZXRfVXBkYXRlKGR1cDIsIGR1cCkgPT0gMCk7Ci0JYXNzZXJ0KFB5U2V0X1NpemUoZHVwMikgPT0gMyk7Ci0JYXNzZXJ0KF9QeVNldF9VcGRhdGUoZHVwMiwgZHVwKSA9PSAwKTsKLQlhc3NlcnQoUHlTZXRfU2l6ZShkdXAyKSA9PSAzKTsKLQlQeV9ERUNSRUYoZHVwMik7CisgICAgLyogRXhlcmNpc2UgdXBkYXRlcyAqLworICAgIGR1cDIgPSBQeVNldF9OZXcoTlVMTCk7CisgICAgYXNzZXJ0KF9QeVNldF9VcGRhdGUoZHVwMiwgZHVwKSA9PSAwKTsKKyAgICBhc3NlcnQoUHlTZXRfU2l6ZShkdXAyKSA9PSAzKTsKKyAgICBhc3NlcnQoX1B5U2V0X1VwZGF0ZShkdXAyLCBkdXApID09IDApOworICAgIGFzc2VydChQeVNldF9TaXplKGR1cDIpID09IDMpOworICAgIFB5X0RFQ1JFRihkdXAyKTsKIAotCS8qIFJhaXNlIFN5c3RlbUVycm9yIHdoZW4gc2VsZiBhcmd1bWVudCBpcyBub3QgYSBzZXQgb3IgZnJvemVuc2V0LiAqLwotCXQgPSBQeVR1cGxlX05ldygwKTsKLQlhc3NlcnRSYWlzZXMoUHlTZXRfU2l6ZSh0KSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOwotCWFzc2VydFJhaXNlcyhQeVNldF9Db250YWlucyh0LCBlbGVtKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOwotCVB5X0RFQ1JFRih0KTsKKyAgICAvKiBSYWlzZSBTeXN0ZW1FcnJvciB3aGVuIHNlbGYgYXJndW1lbnQgaXMgbm90IGEgc2V0IG9yIGZyb3plbnNldC4gKi8KKyAgICB0ID0gUHlUdXBsZV9OZXcoMCk7CisgICAgYXNzZXJ0UmFpc2VzKFB5U2V0X1NpemUodCkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKKyAgICBhc3NlcnRSYWlzZXMoUHlTZXRfQ29udGFpbnModCwgZWxlbSkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKKyAgICBQeV9ERUNSRUYodCk7CiAKLQkvKiBSYWlzZSBTeXN0ZW1FcnJvciB3aGVuIHNlbGYgYXJndW1lbnQgaXMgbm90IGEgc2V0LiAqLwotCWYgPSBQeUZyb3plblNldF9OZXcoZHVwKTsKLQlhc3NlcnQoUHlTZXRfU2l6ZShmKSA9PSAzKTsKLQlhc3NlcnQoUHlGcm96ZW5TZXRfQ2hlY2tFeGFjdChmKSk7Ci0JYXNzZXJ0UmFpc2VzKFB5U2V0X0Rpc2NhcmQoZiwgZWxlbSkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKLQlhc3NlcnRSYWlzZXMoUHlTZXRfUG9wKGYpID09IE5VTEwsIFB5RXhjX1N5c3RlbUVycm9yKTsKLQlQeV9ERUNSRUYoZik7CisgICAgLyogUmFpc2UgU3lzdGVtRXJyb3Igd2hlbiBzZWxmIGFyZ3VtZW50IGlzIG5vdCBhIHNldC4gKi8KKyAgICBmID0gUHlGcm96ZW5TZXRfTmV3KGR1cCk7CisgICAgYXNzZXJ0KFB5U2V0X1NpemUoZikgPT0gMyk7CisgICAgYXNzZXJ0KFB5RnJvemVuU2V0X0NoZWNrRXhhY3QoZikpOworICAgIGFzc2VydFJhaXNlcyhQeVNldF9EaXNjYXJkKGYsIGVsZW0pID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7CisgICAgYXNzZXJ0UmFpc2VzKFB5U2V0X1BvcChmKSA9PSBOVUxMLCBQeUV4Y19TeXN0ZW1FcnJvcik7CisgICAgUHlfREVDUkVGKGYpOwogCi0JLyogUmFpc2UgS2V5RXJyb3Igd2hlbiBwb3BwaW5nIGZyb20gYW4gZW1wdHkgc2V0ICovCi0JYXNzZXJ0KFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdChvYiwgb2IpID09IG9iKTsKLQlQeV9ERUNSRUYob2IpOwotCWFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMCk7Ci0JYXNzZXJ0UmFpc2VzKFB5U2V0X1BvcChvYikgPT0gTlVMTCwgUHlFeGNfS2V5RXJyb3IpOworICAgIC8qIFJhaXNlIEtleUVycm9yIHdoZW4gcG9wcGluZyBmcm9tIGFuIGVtcHR5IHNldCAqLworICAgIGFzc2VydChQeU51bWJlcl9JblBsYWNlU3VidHJhY3Qob2IsIG9iKSA9PSBvYik7CisgICAgUHlfREVDUkVGKG9iKTsKKyAgICBhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDApOworICAgIGFzc2VydFJhaXNlcyhQeVNldF9Qb3Aob2IpID09IE5VTEwsIFB5RXhjX0tleUVycm9yKTsKIAotCS8qIFJlc3RvcmUgdGhlIHNldCBmcm9tIHRoZSBjb3B5IHVzaW5nIHRoZSBQeU51bWJlciBBUEkgKi8KLQlhc3NlcnQoUHlOdW1iZXJfSW5QbGFjZU9yKG9iLCBkdXApID09IG9iKTsKLQlQeV9ERUNSRUYob2IpOworICAgIC8qIFJlc3RvcmUgdGhlIHNldCBmcm9tIHRoZSBjb3B5IHVzaW5nIHRoZSBQeU51bWJlciBBUEkgKi8KKyAgICBhc3NlcnQoUHlOdW1iZXJfSW5QbGFjZU9yKG9iLCBkdXApID09IG9iKTsKKyAgICBQeV9ERUNSRUYob2IpOwogCi0JLyogVmVyaWZ5IGNvbnN0cnVjdG9ycyBhY2NlcHQgTlVMTCBhcmd1bWVudHMgKi8KLQlmID0gUHlTZXRfTmV3KE5VTEwpOwotCWFzc2VydChmICE9IE5VTEwpOwotCWFzc2VydChQeVNldF9HRVRfU0laRShmKSA9PSAwKTsKLQlQeV9ERUNSRUYoZik7Ci0JZiA9IFB5RnJvemVuU2V0X05ldyhOVUxMKTsKLQlhc3NlcnQoZiAhPSBOVUxMKTsKLQlhc3NlcnQoUHlGcm96ZW5TZXRfQ2hlY2tFeGFjdChmKSk7Ci0JYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKGYpID09IDApOwotCVB5X0RFQ1JFRihmKTsKKyAgICAvKiBWZXJpZnkgY29uc3RydWN0b3JzIGFjY2VwdCBOVUxMIGFyZ3VtZW50cyAqLworICAgIGYgPSBQeVNldF9OZXcoTlVMTCk7CisgICAgYXNzZXJ0KGYgIT0gTlVMTCk7CisgICAgYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKGYpID09IDApOworICAgIFB5X0RFQ1JFRihmKTsKKyAgICBmID0gUHlGcm96ZW5TZXRfTmV3KE5VTEwpOworICAgIGFzc2VydChmICE9IE5VTEwpOworICAgIGFzc2VydChQeUZyb3plblNldF9DaGVja0V4YWN0KGYpKTsKKyAgICBhc3NlcnQoUHlTZXRfR0VUX1NJWkUoZikgPT0gMCk7CisgICAgUHlfREVDUkVGKGYpOwogCi0JUHlfREVDUkVGKGVsZW0pOwotCVB5X0RFQ1JFRihkdXApOwotCVB5X1JFVFVSTl9UUlVFOworICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICBQeV9ERUNSRUYoZHVwKTsKKyAgICBQeV9SRVRVUk5fVFJVRTsKIH0KIAogI3VuZGVmIGFzc2VydFJhaXNlcwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zbGljZW9iamVjdC5jIGIvT2JqZWN0cy9zbGljZW9iamVjdC5jCmluZGV4IDJlYjM5NDEuLmQxZmUwNTIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc2xpY2VvYmplY3QuYworKysgYi9PYmplY3RzL3NsaWNlb2JqZWN0LmMKQEAgLTcsNyArNyw3IEBACiBmb3IgdGhpcyBmaWxlLgogKi8KIAotLyogCisvKgogUHlfRWxsaXBzaXMgZW5jb2RlcyB0aGUgJy4uLicgcnViYmVyIGluZGV4IHRva2VuLiBJdCBpcyBzaW1pbGFyIHRvCiB0aGUgUHlfTm9uZVN0cnVjdCBpbiB0aGF0IHRoZXJlIGlzIG5vIHdheSB0byBjcmVhdGUgb3RoZXIgb2JqZWN0cyBvZgogdGhpcyB0eXBlIGFuZCB0aGVyZSBpcyBleGFjdGx5IG9uZSBpbiBleGlzdGVuY2UuCkBAIC0xOSwzNSArMTksMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBlbGxpcHNpc19yZXByKFB5T2JqZWN0ICpvcCkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiRWxsaXBzaXMiKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiRWxsaXBzaXMiKTsKIH0KIAogUHlUeXBlT2JqZWN0IFB5RWxsaXBzaXNfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJlbGxpcHNpcyIsCQkJLyogdHBfbmFtZSAqLwotCTAsCQkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwgLypuZXZlciBjYWxsZWQqLwkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JZWxsaXBzaXNfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZWxsaXBzaXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAvKm5ldmVyIGNhbGxlZCovICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICBlbGxpcHNpc19yZXByLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KIH07CiAKIFB5T2JqZWN0IF9QeV9FbGxpcHNpc09iamVjdCA9IHsKLQlfUHlPYmplY3RfRVhUUkFfSU5JVAotCTEsICZQeUVsbGlwc2lzX1R5cGUKKyAgICBfUHlPYmplY3RfRVhUUkFfSU5JVAorICAgIDEsICZQeUVsbGlwc2lzX1R5cGUKIH07CiAKIApAQCAtNjAsMTU0ICs2MCwxNTQgQEAKIFB5T2JqZWN0ICoKIFB5U2xpY2VfTmV3KFB5T2JqZWN0ICpzdGFydCwgUHlPYmplY3QgKnN0b3AsIFB5T2JqZWN0ICpzdGVwKQogewotCVB5U2xpY2VPYmplY3QgKm9iaiA9IFB5T2JqZWN0X05ldyhQeVNsaWNlT2JqZWN0LCAmUHlTbGljZV9UeXBlKTsKKyAgICBQeVNsaWNlT2JqZWN0ICpvYmogPSBQeU9iamVjdF9OZXcoUHlTbGljZU9iamVjdCwgJlB5U2xpY2VfVHlwZSk7CiAKLQlpZiAob2JqID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3RlcCA9PSBOVUxMKSBzdGVwID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYoc3RlcCk7Ci0JaWYgKHN0YXJ0ID09IE5VTEwpIHN0YXJ0ID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYoc3RhcnQpOwotCWlmIChzdG9wID09IE5VTEwpIHN0b3AgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRihzdG9wKTsKKyAgICBpZiAoc3RlcCA9PSBOVUxMKSBzdGVwID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoc3RlcCk7CisgICAgaWYgKHN0YXJ0ID09IE5VTEwpIHN0YXJ0ID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoc3RhcnQpOworICAgIGlmIChzdG9wID09IE5VTEwpIHN0b3AgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihzdG9wKTsKIAotCW9iai0+c3RlcCA9IHN0ZXA7Ci0Jb2JqLT5zdGFydCA9IHN0YXJ0OwotCW9iai0+c3RvcCA9IHN0b3A7CisgICAgb2JqLT5zdGVwID0gc3RlcDsKKyAgICBvYmotPnN0YXJ0ID0gc3RhcnQ7CisgICAgb2JqLT5zdG9wID0gc3RvcDsKIAotCXJldHVybiAoUHlPYmplY3QgKikgb2JqOworICAgIHJldHVybiAoUHlPYmplY3QgKikgb2JqOwogfQogCiBQeU9iamVjdCAqCiBfUHlTbGljZV9Gcm9tSW5kaWNlcyhQeV9zc2l6ZV90IGlzdGFydCwgUHlfc3NpemVfdCBpc3RvcCkKIHsKLQlQeU9iamVjdCAqc3RhcnQsICplbmQsICpzbGljZTsKLQlzdGFydCA9IFB5SW50X0Zyb21Tc2l6ZV90KGlzdGFydCk7Ci0JaWYgKCFzdGFydCkKLQkJcmV0dXJuIE5VTEw7Ci0JZW5kID0gUHlJbnRfRnJvbVNzaXplX3QoaXN0b3ApOwotCWlmICghZW5kKSB7Ci0JCVB5X0RFQ1JFRihzdGFydCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeU9iamVjdCAqc3RhcnQsICplbmQsICpzbGljZTsKKyAgICBzdGFydCA9IFB5SW50X0Zyb21Tc2l6ZV90KGlzdGFydCk7CisgICAgaWYgKCFzdGFydCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZW5kID0gUHlJbnRfRnJvbVNzaXplX3QoaXN0b3ApOworICAgIGlmICghZW5kKSB7CisgICAgICAgIFB5X0RFQ1JFRihzdGFydCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNsaWNlID0gUHlTbGljZV9OZXcoc3RhcnQsIGVuZCwgTlVMTCk7Ci0JUHlfREVDUkVGKHN0YXJ0KTsKLQlQeV9ERUNSRUYoZW5kKTsKLQlyZXR1cm4gc2xpY2U7CisgICAgc2xpY2UgPSBQeVNsaWNlX05ldyhzdGFydCwgZW5kLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoc3RhcnQpOworICAgIFB5X0RFQ1JFRihlbmQpOworICAgIHJldHVybiBzbGljZTsKIH0KIAogaW50CiBQeVNsaWNlX0dldEluZGljZXMoUHlTbGljZU9iamVjdCAqciwgUHlfc3NpemVfdCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKnN0b3AsIFB5X3NzaXplX3QgKnN0ZXApCiB7Ci0JLyogWFhYIHN1cHBvcnQgbG9uZyBpbnRzICovCi0JaWYgKHItPnN0ZXAgPT0gUHlfTm9uZSkgewotCQkqc3RlcCA9IDE7Ci0JfSBlbHNlIHsKLQkJaWYgKCFQeUludF9DaGVjayhyLT5zdGVwKSAmJiAhUHlMb25nX0NoZWNrKHItPnN0ZXApKSByZXR1cm4gLTE7Ci0JCSpzdGVwID0gUHlJbnRfQXNTc2l6ZV90KHItPnN0ZXApOwotCX0KLQlpZiAoci0+c3RhcnQgPT0gUHlfTm9uZSkgewotCQkqc3RhcnQgPSAqc3RlcCA8IDAgPyBsZW5ndGgtMSA6IDA7Ci0JfSBlbHNlIHsKLQkJaWYgKCFQeUludF9DaGVjayhyLT5zdGFydCkgJiYgIVB5TG9uZ19DaGVjayhyLT5zdGVwKSkgcmV0dXJuIC0xOwotCQkqc3RhcnQgPSBQeUludF9Bc1NzaXplX3Qoci0+c3RhcnQpOwotCQlpZiAoKnN0YXJ0IDwgMCkgKnN0YXJ0ICs9IGxlbmd0aDsKLQl9Ci0JaWYgKHItPnN0b3AgPT0gUHlfTm9uZSkgewotCQkqc3RvcCA9ICpzdGVwIDwgMCA/IC0xIDogbGVuZ3RoOwotCX0gZWxzZSB7Ci0JCWlmICghUHlJbnRfQ2hlY2soci0+c3RvcCkgJiYgIVB5TG9uZ19DaGVjayhyLT5zdGVwKSkgcmV0dXJuIC0xOwotCQkqc3RvcCA9IFB5SW50X0FzU3NpemVfdChyLT5zdG9wKTsKLQkJaWYgKCpzdG9wIDwgMCkgKnN0b3AgKz0gbGVuZ3RoOwotCX0KLQlpZiAoKnN0b3AgPiBsZW5ndGgpIHJldHVybiAtMTsKLQlpZiAoKnN0YXJ0ID49IGxlbmd0aCkgcmV0dXJuIC0xOwotCWlmICgqc3RlcCA9PSAwKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYIHN1cHBvcnQgbG9uZyBpbnRzICovCisgICAgaWYgKHItPnN0ZXAgPT0gUHlfTm9uZSkgeworICAgICAgICAqc3RlcCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUludF9DaGVjayhyLT5zdGVwKSAmJiAhUHlMb25nX0NoZWNrKHItPnN0ZXApKSByZXR1cm4gLTE7CisgICAgICAgICpzdGVwID0gUHlJbnRfQXNTc2l6ZV90KHItPnN0ZXApOworICAgIH0KKyAgICBpZiAoci0+c3RhcnQgPT0gUHlfTm9uZSkgeworICAgICAgICAqc3RhcnQgPSAqc3RlcCA8IDAgPyBsZW5ndGgtMSA6IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUludF9DaGVjayhyLT5zdGFydCkgJiYgIVB5TG9uZ19DaGVjayhyLT5zdGVwKSkgcmV0dXJuIC0xOworICAgICAgICAqc3RhcnQgPSBQeUludF9Bc1NzaXplX3Qoci0+c3RhcnQpOworICAgICAgICBpZiAoKnN0YXJ0IDwgMCkgKnN0YXJ0ICs9IGxlbmd0aDsKKyAgICB9CisgICAgaWYgKHItPnN0b3AgPT0gUHlfTm9uZSkgeworICAgICAgICAqc3RvcCA9ICpzdGVwIDwgMCA/IC0xIDogbGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghUHlJbnRfQ2hlY2soci0+c3RvcCkgJiYgIVB5TG9uZ19DaGVjayhyLT5zdGVwKSkgcmV0dXJuIC0xOworICAgICAgICAqc3RvcCA9IFB5SW50X0FzU3NpemVfdChyLT5zdG9wKTsKKyAgICAgICAgaWYgKCpzdG9wIDwgMCkgKnN0b3AgKz0gbGVuZ3RoOworICAgIH0KKyAgICBpZiAoKnN0b3AgPiBsZW5ndGgpIHJldHVybiAtMTsKKyAgICBpZiAoKnN0YXJ0ID49IGxlbmd0aCkgcmV0dXJuIC0xOworICAgIGlmICgqc3RlcCA9PSAwKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlTbGljZV9HZXRJbmRpY2VzRXgoUHlTbGljZU9iamVjdCAqciwgUHlfc3NpemVfdCBsZW5ndGgsCi0JCSAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKnN0b3AsIFB5X3NzaXplX3QgKnN0ZXAsIFB5X3NzaXplX3QgKnNsaWNlbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKnN0b3AsIFB5X3NzaXplX3QgKnN0ZXAsIFB5X3NzaXplX3QgKnNsaWNlbGVuZ3RoKQogewotCS8qIHRoaXMgaXMgaGFyZGVyIHRvIGdldCByaWdodCB0aGFuIHlvdSBtaWdodCB0aGluayAqLworICAgIC8qIHRoaXMgaXMgaGFyZGVyIHRvIGdldCByaWdodCB0aGFuIHlvdSBtaWdodCB0aGluayAqLwogCi0JUHlfc3NpemVfdCBkZWZzdGFydCwgZGVmc3RvcDsKKyAgICBQeV9zc2l6ZV90IGRlZnN0YXJ0LCBkZWZzdG9wOwogCi0JaWYgKHItPnN0ZXAgPT0gUHlfTm9uZSkgewotCQkqc3RlcCA9IDE7Ci0JfSAKLQllbHNlIHsKLQkJaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgoci0+c3RlcCwgc3RlcCkpIHJldHVybiAtMTsKLQkJaWYgKCpzdGVwID09IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkic2xpY2Ugc3RlcCBjYW5ub3QgYmUgemVybyIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgIGlmIChyLT5zdGVwID09IFB5X05vbmUpIHsKKyAgICAgICAgKnN0ZXAgPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgoci0+c3RlcCwgc3RlcCkpIHJldHVybiAtMTsKKyAgICAgICAgaWYgKCpzdGVwID09IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzbGljZSBzdGVwIGNhbm5vdCBiZSB6ZXJvIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQlkZWZzdGFydCA9ICpzdGVwIDwgMCA/IGxlbmd0aC0xIDogMDsKLQlkZWZzdG9wID0gKnN0ZXAgPCAwID8gLTEgOiBsZW5ndGg7CisgICAgZGVmc3RhcnQgPSAqc3RlcCA8IDAgPyBsZW5ndGgtMSA6IDA7CisgICAgZGVmc3RvcCA9ICpzdGVwIDwgMCA/IC0xIDogbGVuZ3RoOwogCi0JaWYgKHItPnN0YXJ0ID09IFB5X05vbmUpIHsKLQkJKnN0YXJ0ID0gZGVmc3RhcnQ7Ci0JfQotCWVsc2UgewotCQlpZiAoIV9QeUV2YWxfU2xpY2VJbmRleChyLT5zdGFydCwgc3RhcnQpKSByZXR1cm4gLTE7Ci0JCWlmICgqc3RhcnQgPCAwKSAqc3RhcnQgKz0gbGVuZ3RoOwotCQlpZiAoKnN0YXJ0IDwgMCkgKnN0YXJ0ID0gKCpzdGVwIDwgMCkgPyAtMSA6IDA7Ci0JCWlmICgqc3RhcnQgPj0gbGVuZ3RoKSAKLQkJCSpzdGFydCA9ICgqc3RlcCA8IDApID8gbGVuZ3RoIC0gMSA6IGxlbmd0aDsKLQl9CisgICAgaWYgKHItPnN0YXJ0ID09IFB5X05vbmUpIHsKKyAgICAgICAgKnN0YXJ0ID0gZGVmc3RhcnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIV9QeUV2YWxfU2xpY2VJbmRleChyLT5zdGFydCwgc3RhcnQpKSByZXR1cm4gLTE7CisgICAgICAgIGlmICgqc3RhcnQgPCAwKSAqc3RhcnQgKz0gbGVuZ3RoOworICAgICAgICBpZiAoKnN0YXJ0IDwgMCkgKnN0YXJ0ID0gKCpzdGVwIDwgMCkgPyAtMSA6IDA7CisgICAgICAgIGlmICgqc3RhcnQgPj0gbGVuZ3RoKQorICAgICAgICAgICAgKnN0YXJ0ID0gKCpzdGVwIDwgMCkgPyBsZW5ndGggLSAxIDogbGVuZ3RoOworICAgIH0KIAotCWlmIChyLT5zdG9wID09IFB5X05vbmUpIHsKLQkJKnN0b3AgPSBkZWZzdG9wOwotCX0KLQllbHNlIHsKLQkJaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgoci0+c3RvcCwgc3RvcCkpIHJldHVybiAtMTsKLQkJaWYgKCpzdG9wIDwgMCkgKnN0b3AgKz0gbGVuZ3RoOwotCQlpZiAoKnN0b3AgPCAwKSAqc3RvcCA9ICgqc3RlcCA8IDApID8gLTEgOiAwOwotCQlpZiAoKnN0b3AgPj0gbGVuZ3RoKQotCQkJKnN0b3AgPSAoKnN0ZXAgPCAwKSA/IGxlbmd0aCAtIDEgOiBsZW5ndGg7Ci0JfQorICAgIGlmIChyLT5zdG9wID09IFB5X05vbmUpIHsKKyAgICAgICAgKnN0b3AgPSBkZWZzdG9wOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgoci0+c3RvcCwgc3RvcCkpIHJldHVybiAtMTsKKyAgICAgICAgaWYgKCpzdG9wIDwgMCkgKnN0b3AgKz0gbGVuZ3RoOworICAgICAgICBpZiAoKnN0b3AgPCAwKSAqc3RvcCA9ICgqc3RlcCA8IDApID8gLTEgOiAwOworICAgICAgICBpZiAoKnN0b3AgPj0gbGVuZ3RoKQorICAgICAgICAgICAgKnN0b3AgPSAoKnN0ZXAgPCAwKSA/IGxlbmd0aCAtIDEgOiBsZW5ndGg7CisgICAgfQogCi0JaWYgKCgqc3RlcCA8IDAgJiYgKnN0b3AgPj0gKnN0YXJ0KSAKLQkgICAgfHwgKCpzdGVwID4gMCAmJiAqc3RhcnQgPj0gKnN0b3ApKSB7Ci0JCSpzbGljZWxlbmd0aCA9IDA7Ci0JfQotCWVsc2UgaWYgKCpzdGVwIDwgMCkgewotCQkqc2xpY2VsZW5ndGggPSAoKnN0b3AtKnN0YXJ0KzEpLygqc3RlcCkrMTsKLQl9Ci0JZWxzZSB7Ci0JCSpzbGljZWxlbmd0aCA9ICgqc3RvcC0qc3RhcnQtMSkvKCpzdGVwKSsxOwotCX0KKyAgICBpZiAoKCpzdGVwIDwgMCAmJiAqc3RvcCA+PSAqc3RhcnQpCisgICAgICAgIHx8ICgqc3RlcCA+IDAgJiYgKnN0YXJ0ID49ICpzdG9wKSkgeworICAgICAgICAqc2xpY2VsZW5ndGggPSAwOworICAgIH0KKyAgICBlbHNlIGlmICgqc3RlcCA8IDApIHsKKyAgICAgICAgKnNsaWNlbGVuZ3RoID0gKCpzdG9wLSpzdGFydCsxKS8oKnN0ZXApKzE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqc2xpY2VsZW5ndGggPSAoKnN0b3AtKnN0YXJ0LTEpLygqc3RlcCkrMTsKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNsaWNlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnN0YXJ0LCAqc3RvcCwgKnN0ZXA7CisgICAgUHlPYmplY3QgKnN0YXJ0LCAqc3RvcCwgKnN0ZXA7CiAKLQlzdGFydCA9IHN0b3AgPSBzdGVwID0gTlVMTDsKKyAgICBzdGFydCA9IHN0b3AgPSBzdGVwID0gTlVMTDsKIAotCWlmICghX1B5QXJnX05vS2V5d29yZHMoInNsaWNlKCkiLCBrdykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghX1B5QXJnX05vS2V5d29yZHMoInNsaWNlKCkiLCBrdykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2xpY2UiLCAxLCAzLCAmc3RhcnQsICZzdG9wLCAmc3RlcCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNsaWNlIiwgMSwgMywgJnN0YXJ0LCAmc3RvcCwgJnN0ZXApKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFRoaXMgc3dhcHBpbmcgb2Ygc3RvcCBhbmQgc3RhcnQgaXMgdG8gbWFpbnRhaW4gc2ltaWxhcml0eSB3aXRoCi0JICAgcmFuZ2UoKS4gKi8KLQlpZiAoc3RvcCA9PSBOVUxMKSB7Ci0JCXN0b3AgPSBzdGFydDsKLQkJc3RhcnQgPSBOVUxMOwotCX0KLQlyZXR1cm4gUHlTbGljZV9OZXcoc3RhcnQsIHN0b3AsIHN0ZXApOworICAgIC8qIFRoaXMgc3dhcHBpbmcgb2Ygc3RvcCBhbmQgc3RhcnQgaXMgdG8gbWFpbnRhaW4gc2ltaWxhcml0eSB3aXRoCisgICAgICAgcmFuZ2UoKS4gKi8KKyAgICBpZiAoc3RvcCA9PSBOVUxMKSB7CisgICAgICAgIHN0b3AgPSBzdGFydDsKKyAgICAgICAgc3RhcnQgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTbGljZV9OZXcoc3RhcnQsIHN0b3AsIHN0ZXApOwogfQogCiBQeURvY19TVFJWQVIoc2xpY2VfZG9jLApAQCAtMjE4LDUzICsyMTgsNTMgQEAKIHN0YXRpYyB2b2lkCiBzbGljZV9kZWFsbG9jKFB5U2xpY2VPYmplY3QgKnIpCiB7Ci0JUHlfREVDUkVGKHItPnN0ZXApOwotCVB5X0RFQ1JFRihyLT5zdGFydCk7Ci0JUHlfREVDUkVGKHItPnN0b3ApOwotCVB5T2JqZWN0X0RlbChyKTsKKyAgICBQeV9ERUNSRUYoci0+c3RlcCk7CisgICAgUHlfREVDUkVGKHItPnN0YXJ0KTsKKyAgICBQeV9ERUNSRUYoci0+c3RvcCk7CisgICAgUHlPYmplY3RfRGVsKHIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xpY2VfcmVwcihQeVNsaWNlT2JqZWN0ICpyKQogewotCVB5T2JqZWN0ICpzLCAqY29tbWE7CisgICAgUHlPYmplY3QgKnMsICpjb21tYTsKIAotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJzbGljZSgiKTsKLQljb21tYSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwgIik7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeU9iamVjdF9SZXByKHItPnN0YXJ0KSk7Ci0JUHlTdHJpbmdfQ29uY2F0KCZzLCBjb21tYSk7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeU9iamVjdF9SZXByKHItPnN0b3ApKTsKLQlQeVN0cmluZ19Db25jYXQoJnMsIGNvbW1hKTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5T2JqZWN0X1JlcHIoci0+c3RlcCkpOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlTdHJpbmdfRnJvbVN0cmluZygiKSIpKTsKLQlQeV9ERUNSRUYoY29tbWEpOwotCXJldHVybiBzOworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJzbGljZSgiKTsKKyAgICBjb21tYSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwgIik7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeU9iamVjdF9SZXByKHItPnN0YXJ0KSk7CisgICAgUHlTdHJpbmdfQ29uY2F0KCZzLCBjb21tYSk7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeU9iamVjdF9SZXByKHItPnN0b3ApKTsKKyAgICBQeVN0cmluZ19Db25jYXQoJnMsIGNvbW1hKTsKKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5T2JqZWN0X1JlcHIoci0+c3RlcCkpOworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlTdHJpbmdfRnJvbVN0cmluZygiKSIpKTsKKyAgICBQeV9ERUNSRUYoY29tbWEpOworICAgIHJldHVybiBzOwogfQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgc2xpY2VfbWVtYmVyc1tdID0gewotCXsic3RhcnQiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTbGljZU9iamVjdCwgc3RhcnQpLCBSRUFET05MWX0sCi0JeyJzdG9wIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5U2xpY2VPYmplY3QsIHN0b3ApLCBSRUFET05MWX0sCi0JeyJzdGVwIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5U2xpY2VPYmplY3QsIHN0ZXApLCBSRUFET05MWX0sCi0JezB9CisgICAgeyJzdGFydCIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVNsaWNlT2JqZWN0LCBzdGFydCksIFJFQURPTkxZfSwKKyAgICB7InN0b3AiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTbGljZU9iamVjdCwgc3RvcCksIFJFQURPTkxZfSwKKyAgICB7InN0ZXAiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTbGljZU9iamVjdCwgc3RlcCksIFJFQURPTkxZfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCoKIHNsaWNlX2luZGljZXMoUHlTbGljZU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGxlbikKIHsKLQlQeV9zc2l6ZV90IGlsZW4sIHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aDsKKyAgICBQeV9zc2l6ZV90IGlsZW4sIHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aDsKIAotCWlsZW4gPSBQeU51bWJlcl9Bc1NzaXplX3QobGVuLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKKyAgICBpbGVuID0gUHlOdW1iZXJfQXNTc2l6ZV90KGxlbiwgUHlFeGNfT3ZlcmZsb3dFcnJvcik7CiAKLQlpZiAoaWxlbiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoaWxlbiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeVNsaWNlX0dldEluZGljZXNFeChzZWxmLCBpbGVuLCAmc3RhcnQsICZzdG9wLCAKLQkJCQkgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoc2VsZiwgaWxlbiwgJnN0YXJ0LCAmc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIobm5uKSIsIHN0YXJ0LCBzdG9wLCBzdGVwKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKG5ubikiLCBzdGFydCwgc3RvcCwgc3RlcCk7CiB9CiAKIFB5RG9jX1NUUlZBUihzbGljZV9pbmRpY2VzX2RvYywKQEAgLTI3OCw4NCArMjc4LDg0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2xpY2VfcmVkdWNlKFB5U2xpY2VPYmplY3QqIHNlbGYpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT09PKSIsIFB5X1RZUEUoc2VsZiksIHNlbGYtPnN0YXJ0LCBzZWxmLT5zdG9wLCBzZWxmLT5zdGVwKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPT08pIiwgUHlfVFlQRShzZWxmKSwgc2VsZi0+c3RhcnQsIHNlbGYtPnN0b3AsIHNlbGYtPnN0ZXApOwogfQogCiBQeURvY19TVFJWQVIocmVkdWNlX2RvYywgIlJldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcGlja2xpbmcuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzbGljZV9tZXRob2RzW10gPSB7Ci0JeyJpbmRpY2VzIiwJKFB5Q0Z1bmN0aW9uKXNsaWNlX2luZGljZXMsCi0JIE1FVEhfTywJc2xpY2VfaW5kaWNlc19kb2N9LAotCXsiX19yZWR1Y2VfXyIsCShQeUNGdW5jdGlvbilzbGljZV9yZWR1Y2UsCi0JIE1FVEhfTk9BUkdTLAlyZWR1Y2VfZG9jfSwKLQl7TlVMTCwgTlVMTH0KKyAgICB7ImluZGljZXMiLCAgICAgICAgIChQeUNGdW5jdGlvbilzbGljZV9pbmRpY2VzLAorICAgICBNRVRIX08sICAgICAgICAgICAgc2xpY2VfaW5kaWNlc19kb2N9LAorICAgIHsiX19yZWR1Y2VfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKXNsaWNlX3JlZHVjZSwKKyAgICAgTUVUSF9OT0FSR1MsICAgICAgIHJlZHVjZV9kb2N9LAorICAgIHtOVUxMLCBOVUxMfQogfTsKIAogc3RhdGljIGludAogc2xpY2VfY29tcGFyZShQeVNsaWNlT2JqZWN0ICp2LCBQeVNsaWNlT2JqZWN0ICp3KQogewotCWludCByZXN1bHQgPSAwOworICAgIGludCByZXN1bHQgPSAwOwogCi0gICAgICAgIGlmICh2ID09IHcpCi0JCXJldHVybiAwOworICAgIGlmICh2ID09IHcpCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKFB5T2JqZWN0X0NtcCh2LT5zdGFydCwgdy0+c3RhcnQsICZyZXN1bHQpIDwgMCkKLQkgICAgcmV0dXJuIC0yOwotCWlmIChyZXN1bHQgIT0gMCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlpZiAoUHlPYmplY3RfQ21wKHYtPnN0b3AsIHctPnN0b3AsICZyZXN1bHQpIDwgMCkKLQkgICAgcmV0dXJuIC0yOwotCWlmIChyZXN1bHQgIT0gMCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlpZiAoUHlPYmplY3RfQ21wKHYtPnN0ZXAsIHctPnN0ZXAsICZyZXN1bHQpIDwgMCkKLQkgICAgcmV0dXJuIC0yOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKFB5T2JqZWN0X0NtcCh2LT5zdGFydCwgdy0+c3RhcnQsICZyZXN1bHQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIGlmIChyZXN1bHQgIT0gMCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoUHlPYmplY3RfQ21wKHYtPnN0b3AsIHctPnN0b3AsICZyZXN1bHQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIGlmIChyZXN1bHQgIT0gMCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoUHlPYmplY3RfQ21wKHYtPnN0ZXAsIHctPnN0ZXAsICZyZXN1bHQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBsb25nCiBzbGljZV9oYXNoKFB5U2xpY2VPYmplY3QgKnYpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInVuaGFzaGFibGUgdHlwZSIpOwotCXJldHVybiAtMUw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInVuaGFzaGFibGUgdHlwZSIpOworICAgIHJldHVybiAtMUw7CiB9CiAKIFB5VHlwZU9iamVjdCBQeVNsaWNlX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkic2xpY2UiLAkJLyogTmFtZSBvZiB0aGlzIHR5cGUgKi8KLQlzaXplb2YoUHlTbGljZU9iamVjdCksCS8qIEJhc2ljIG9iamVjdCBzaXplICovCi0JMCwJCQkvKiBJdGVtIHNpemUgZm9yIHZhcm9iamVjdCAqLwotCShkZXN0cnVjdG9yKXNsaWNlX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCShjbXBmdW5jKXNsaWNlX2NvbXBhcmUsIAkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylzbGljZV9yZXByLCAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkgICAgCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpc2xpY2VfaGFzaCwJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MgKi8KLQlzbGljZV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0Jc2xpY2VfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCXNsaWNlX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCXNsaWNlX25ldywJCQkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAic2xpY2UiLCAgICAgICAgICAgICAgICAgICAgLyogTmFtZSBvZiB0aGlzIHR5cGUgKi8KKyAgICBzaXplb2YoUHlTbGljZU9iamVjdCksICAgICAgLyogQmFzaWMgb2JqZWN0IHNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXRlbSBzaXplIGZvciB2YXJvYmplY3QgKi8KKyAgICAoZGVzdHJ1Y3RvcilzbGljZV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgKGNtcGZ1bmMpc2xpY2VfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXNsaWNlX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKXNsaWNlX2hhc2gsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHNsaWNlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzbGljZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBzbGljZV9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgc2xpY2VfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9zdHJpbmdfZm9ybWF0LmggYi9PYmplY3RzL3N0cmluZ2xpYi9zdHJpbmdfZm9ybWF0LmgKaW5kZXggZWU2NTMzZS4uMGFhZmIxNCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvc3RyaW5nX2Zvcm1hdC5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL3N0cmluZ19mb3JtYXQuaApAQCAtNTYzLDE1ICs1NjMsMTUgQEAKICAgICBQeU9iamVjdCAqZm9ybWF0X3NwZWNfb2JqZWN0ID0gTlVMTDsKICAgICBQeU9iamVjdCAqKCpmb3JtYXR0ZXIpKFB5T2JqZWN0ICosIFNUUklOR0xJQl9DSEFSICosIFB5X3NzaXplX3QpID0gTlVMTDsKICAgICBTVFJJTkdMSUJfQ0hBUiogZm9ybWF0X3NwZWNfc3RhcnQgPSBmb3JtYXRfc3BlYy0+cHRyID8KLQkgICAgZm9ybWF0X3NwZWMtPnB0ciA6IE5VTEw7CisgICAgICAgICAgICBmb3JtYXRfc3BlYy0+cHRyIDogTlVMTDsKICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbiA9IGZvcm1hdF9zcGVjLT5wdHIgPwotCSAgICBmb3JtYXRfc3BlYy0+ZW5kIC0gZm9ybWF0X3NwZWMtPnB0ciA6IDA7CisgICAgICAgICAgICBmb3JtYXRfc3BlYy0+ZW5kIC0gZm9ybWF0X3NwZWMtPnB0ciA6IDA7CiAKICAgICAvKiBJZiB3ZSBrbm93IHRoZSB0eXBlIGV4YWN0bHksIHNraXAgdGhlIGxvb2t1cCBvZiBfX2Zvcm1hdF9fIGFuZCBqdXN0CiAgICAgICAgY2FsbCB0aGUgZm9ybWF0dGVyIGRpcmVjdGx5LiAqLwogI2lmIFNUUklOR0xJQl9JU19VTklDT0RFCiAgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KGZpZWxkb2JqKSkKLQlmb3JtYXR0ZXIgPSBfUHlVbmljb2RlX0Zvcm1hdEFkdmFuY2VkOworICAgICAgICBmb3JtYXR0ZXIgPSBfUHlVbmljb2RlX0Zvcm1hdEFkdmFuY2VkOwogICAgIC8qIFVuZm9ydHVuYXRlbHksIHRoZXJlJ3MgYSBwcm9ibGVtIHdpdGggY2hlY2tpbmcgZm9yIGludCwgbG9uZywKICAgICAgICBhbmQgZmxvYXQgaGVyZS4gIElmIHdlJ3JlIGJlaW5nIGluY2x1ZGVkIGFzIHVuaWNvZGUsIHRoZWlyCiAgICAgICAgZm9ybWF0dGVycyBleHBlY3Qgc3RyaW5nIGZvcm1hdF9zcGVjIGFyZ3MuICBGb3Igbm93LCBqdXN0IHNraXAKQEAgLTU3OSwyOSArNTc5LDI5IEBACiAgICAgICAgaGFzc2xlLiAqLwogI2Vsc2UKICAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChmaWVsZG9iaikpCi0JZm9ybWF0dGVyID0gX1B5Qnl0ZXNfRm9ybWF0QWR2YW5jZWQ7CisgICAgICAgIGZvcm1hdHRlciA9IF9QeUJ5dGVzX0Zvcm1hdEFkdmFuY2VkOwogICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrRXhhY3QoZmllbGRvYmopKQotCWZvcm1hdHRlciA9X1B5SW50X0Zvcm1hdEFkdmFuY2VkOworICAgICAgICBmb3JtYXR0ZXIgPV9QeUludF9Gb3JtYXRBZHZhbmNlZDsKICAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2tFeGFjdChmaWVsZG9iaikpCi0JZm9ybWF0dGVyID1fUHlMb25nX0Zvcm1hdEFkdmFuY2VkOworICAgICAgICBmb3JtYXR0ZXIgPV9QeUxvbmdfRm9ybWF0QWR2YW5jZWQ7CiAgICAgZWxzZSBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KGZpZWxkb2JqKSkKLQlmb3JtYXR0ZXIgPSBfUHlGbG9hdF9Gb3JtYXRBZHZhbmNlZDsKKyAgICAgICAgZm9ybWF0dGVyID0gX1B5RmxvYXRfRm9ybWF0QWR2YW5jZWQ7CiAjZW5kaWYKIAogICAgIGlmIChmb3JtYXR0ZXIpIHsKLQkvKiB3ZSBrbm93IGV4YWN0bHkgd2hpY2ggZm9ybWF0dGVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gX19mb3JtYXRfXyBpcwotCSAgIGxvb2tlZCB1cCwgc28gY2FsbCBpdCBkaXJlY3RseSwgaW5zdGVhZC4gKi8KLQlyZXN1bHQgPSBmb3JtYXR0ZXIoZmllbGRvYmosIGZvcm1hdF9zcGVjX3N0YXJ0LCBmb3JtYXRfc3BlY19sZW4pOworICAgICAgICAvKiB3ZSBrbm93IGV4YWN0bHkgd2hpY2ggZm9ybWF0dGVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gX19mb3JtYXRfXyBpcworICAgICAgICAgICBsb29rZWQgdXAsIHNvIGNhbGwgaXQgZGlyZWN0bHksIGluc3RlYWQuICovCisgICAgICAgIHJlc3VsdCA9IGZvcm1hdHRlcihmaWVsZG9iaiwgZm9ybWF0X3NwZWNfc3RhcnQsIGZvcm1hdF9zcGVjX2xlbik7CiAgICAgfQogICAgIGVsc2UgewotCS8qIFdlIG5lZWQgdG8gY3JlYXRlIGFuIG9iamVjdCBvdXQgb2YgdGhlIHBvaW50ZXJzIHdlIGhhdmUsIGJlY2F1c2UKLQkgICBfX2Zvcm1hdF9fIHRha2VzIGEgc3RyaW5nL3VuaWNvZGUgb2JqZWN0IGZvciBmb3JtYXRfc3BlYy4gKi8KLQlmb3JtYXRfc3BlY19vYmplY3QgPSBTVFJJTkdMSUJfTkVXKGZvcm1hdF9zcGVjX3N0YXJ0LAotCQkJCQkgICBmb3JtYXRfc3BlY19sZW4pOwotCWlmIChmb3JtYXRfc3BlY19vYmplY3QgPT0gTlVMTCkKLQkgICAgZ290byBkb25lOworICAgICAgICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhbiBvYmplY3Qgb3V0IG9mIHRoZSBwb2ludGVycyB3ZSBoYXZlLCBiZWNhdXNlCisgICAgICAgICAgIF9fZm9ybWF0X18gdGFrZXMgYSBzdHJpbmcvdW5pY29kZSBvYmplY3QgZm9yIGZvcm1hdF9zcGVjLiAqLworICAgICAgICBmb3JtYXRfc3BlY19vYmplY3QgPSBTVFJJTkdMSUJfTkVXKGZvcm1hdF9zcGVjX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjX2xlbik7CisgICAgICAgIGlmIChmb3JtYXRfc3BlY19vYmplY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKIAotCXJlc3VsdCA9IFB5T2JqZWN0X0Zvcm1hdChmaWVsZG9iaiwgZm9ybWF0X3NwZWNfb2JqZWN0KTsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfRm9ybWF0KGZpZWxkb2JqLCBmb3JtYXRfc3BlY19vYmplY3QpOwogICAgIH0KICAgICBpZiAocmVzdWx0ID09IE5VTEwpCiAgICAgICAgIGdvdG8gZG9uZTsKQEAgLTYxNCwxMSArNjE0LDExIEBACiAgICAgLyogQ29udmVydCByZXN1bHQgdG8gb3VyIHR5cGUuICBXZSBjb3VsZCBiZSBzdHIsIGFuZCByZXN1bHQgY291bGQKICAgICAgICBiZSB1bmljb2RlICovCiAgICAgewotCVB5T2JqZWN0ICp0bXAgPSBTVFJJTkdMSUJfVE9TVFIocmVzdWx0KTsKLQlpZiAodG1wID09IE5VTEwpCi0JICAgIGdvdG8gZG9uZTsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXN1bHQgPSB0bXA7CisgICAgICAgIFB5T2JqZWN0ICp0bXAgPSBTVFJJTkdMSUJfVE9TVFIocmVzdWx0KTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gdG1wOwogICAgIH0KICNlbmRpZgogCkBAIC04NDksMTcgKzg0OSwxNyBAQAogICAgIGNhc2UgJ3MnOgogICAgICAgICByZXR1cm4gU1RSSU5HTElCX1RPU1RSKG9iaik7CiAgICAgZGVmYXVsdDoKLQlpZiAoY29udmVyc2lvbiA+IDMyICYmIGNvbnZlcnNpb24gPCAxMjcpIHsKLQkJLyogSXQncyB0aGUgQVNDSUkgc3VicmFuZ2U7IGNhc3RpbmcgdG8gY2hhciBpcyBzYWZlCi0JCSAgIChhc3N1bWluZyB0aGUgZXhlY3V0aW9uIGNoYXJhY3RlciBzZXQgaXMgYW4gQVNDSUkKLQkJICAgc3VwZXJzZXQpLiAqLwotICAgICAgICAJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgIGlmIChjb252ZXJzaW9uID4gMzIgJiYgY29udmVyc2lvbiA8IDEyNykgeworICAgICAgICAgICAgICAgIC8qIEl0J3MgdGhlIEFTQ0lJIHN1YnJhbmdlOyBjYXN0aW5nIHRvIGNoYXIgaXMgc2FmZQorICAgICAgICAgICAgICAgICAgIChhc3N1bWluZyB0aGUgZXhlY3V0aW9uIGNoYXJhY3RlciBzZXQgaXMgYW4gQVNDSUkKKyAgICAgICAgICAgICAgICAgICBzdXBlcnNldCkuICovCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBjb252ZXJzaW9uIHNwZWNpZmllciAlYyIsCiAgICAgICAgICAgICAgICAgICAgICAoY2hhciljb252ZXJzaW9uKTsKLQl9IGVsc2UKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCSAgICAgIlVua25vd24gY29udmVyc2lvbiBzcGVjaWZpZXIgXFx4JXgiLAotCQkgICAgICh1bnNpZ25lZCBpbnQpY29udmVyc2lvbik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gY29udmVyc2lvbiBzcGVjaWZpZXIgXFx4JXgiLAorICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljb252ZXJzaW9uKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogfQpAQCAtMTEyNCw3ICsxMTI0LDcgQEAKICAgICAgICAgICAgIFB5X0lOQ1JFRihjb252ZXJzaW9uX3N0cik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotCSAgICBjb252ZXJzaW9uX3N0ciA9IFNUUklOR0xJQl9ORVcoJmNvbnZlcnNpb24sIDEpOworICAgICAgICAgICAgY29udmVyc2lvbl9zdHIgPSBTVFJJTkdMSUJfTkVXKCZjb252ZXJzaW9uLCAxKTsKICAgICAgICAgaWYgKGNvbnZlcnNpb25fc3RyID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGRvbmU7CiAKQEAgLTExNDAsMzkgKzExNDAsMzkgQEAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGZvcm1hdHRlcml0ZXJfbWV0aG9kc1tdID0gewotICAgIHtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlGb3JtYXR0ZXJJdGVyX1R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLSAgICAiZm9ybWF0dGVyaXRlcmF0b3IiLAkJLyogdHBfbmFtZSAqLwotICAgIHNpemVvZihmb3JtYXR0ZXJpdGVyb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0gICAgMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCisgICAgImZvcm1hdHRlcml0ZXJhdG9yIiwgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihmb3JtYXR0ZXJpdGVyb2JqZWN0KSwgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKWZvcm1hdHRlcml0ZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotICAgIDAsCQkJCQkvKiB0cF9wcmludCAqLwotICAgIDAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0gICAgMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLSAgICAwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotICAgIDAsCQkJCQkvKiB0cF9yZXByICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0gICAgMCwJCQkJCS8qIHRwX2hhc2ggKi8KLSAgICAwLAkJCQkJLyogdHBfY2FsbCAqLwotICAgIDAsCQkJCQkvKiB0cF9zdHIgKi8KLSAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0gICAgMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotICAgIDAsCQkJCQkvKiB0cF9kb2MgKi8KLSAgICAwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLSAgICAwLAkJCQkJLyogdHBfY2xlYXIgKi8KLSAgICAwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLSAgICAwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLSAgICBQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0gICAgKGl0ZXJuZXh0ZnVuYylmb3JtYXR0ZXJpdGVyX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0gICAgZm9ybWF0dGVyaXRlcl9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWZvcm1hdHRlcml0ZXJfZGVhbGxvYywgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZm9ybWF0dGVyaXRlcl9uZXh0LCAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZm9ybWF0dGVyaXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgIDAsCiB9OwogCkBAIC0xMjczLDM5ICsxMjczLDM5IEBACiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmaWVsZG5hbWVpdGVyX21ldGhvZHNbXSA9IHsKLSAgICB7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5RmllbGROYW1lSXRlcl9UeXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0gICAgImZpZWxkbmFtZWl0ZXJhdG9yIiwJCS8qIHRwX25hbWUgKi8KLSAgICBzaXplb2YoZmllbGRuYW1laXRlcm9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLworICAgICJmaWVsZG5hbWVpdGVyYXRvciIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZmllbGRuYW1laXRlcm9iamVjdCksICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgIC8qIG1ldGhvZHMgKi8KLSAgICAoZGVzdHJ1Y3RvcilmaWVsZG5hbWVpdGVyX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLSAgICAwLAkJCQkJLyogdHBfcHJpbnQgKi8KLSAgICAwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotICAgIDAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0gICAgMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLSAgICAwLAkJCQkJLyogdHBfcmVwciAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotICAgIDAsCQkJCQkvKiB0cF9oYXNoICovCi0gICAgMCwJCQkJCS8qIHRwX2NhbGwgKi8KLSAgICAwLAkJCQkJLyogdHBfc3RyICovCi0gICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotICAgIDAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MgKi8KLSAgICAwLAkJCQkJLyogdHBfZG9jICovCi0gICAgMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwJCQkJCS8qIHRwX2NsZWFyICovCi0gICAgMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0gICAgUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotICAgIChpdGVybmV4dGZ1bmMpZmllbGRuYW1laXRlcl9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotICAgIGZpZWxkbmFtZWl0ZXJfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilmaWVsZG5hbWVpdGVyX2RlYWxsb2MsICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWZpZWxkbmFtZWl0ZXJfbmV4dCwgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGZpZWxkbmFtZWl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAwfTsKIAogLyogdW5pY29kZV9mb3JtYXR0ZXJfZmllbGRfbmFtZV9zcGxpdCBpcyB1c2VkIHRvIGltcGxlbWVudApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdvYmplY3QuYyBiL09iamVjdHMvc3RyaW5nb2JqZWN0LmMKaW5kZXggYWJiMWQzYS4uMGZiYzAxYyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdvYmplY3QuYworKysgYi9PYmplY3RzL3N0cmluZ29iamVjdC5jCkBAIC02MCw0MDIgKzYwLDQwMiBAQAogUHlPYmplY3QgKgogUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKm9wOwotCWlmIChzaXplIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCSAgICAiTmVnYXRpdmUgc2l6ZSBwYXNzZWQgdG8gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzaXplID09IDAgJiYgKG9wID0gbnVsbHN0cmluZykgIT0gTlVMTCkgeworICAgIHJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpvcDsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgIk5lZ2F0aXZlIHNpemUgcGFzc2VkIHRvIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAwICYmIChvcCA9IG51bGxzdHJpbmcpICE9IE5VTEwpIHsKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkJbnVsbF9zdHJpbmdzKys7CisgICAgICAgIG51bGxfc3RyaW5ncysrOwogI2VuZGlmCi0JCVB5X0lOQ1JFRihvcCk7Ci0JCXJldHVybiAoUHlPYmplY3QgKilvcDsKLQl9Ci0JaWYgKHNpemUgPT0gMSAmJiBzdHIgIT0gTlVMTCAmJgotCSAgICAob3AgPSBjaGFyYWN0ZXJzWypzdHIgJiBVQ0hBUl9NQVhdKSAhPSBOVUxMKQotCXsKKyAgICAgICAgUHlfSU5DUkVGKG9wKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW9wOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAxICYmIHN0ciAhPSBOVUxMICYmCisgICAgICAgIChvcCA9IGNoYXJhY3RlcnNbKnN0ciAmIFVDSEFSX01BWF0pICE9IE5VTEwpCisgICAgewogI2lmZGVmIENPVU5UX0FMTE9DUwotCQlvbmVfc3RyaW5ncysrOworICAgICAgICBvbmVfc3RyaW5ncysrOwogI2VuZGlmCi0JCVB5X0lOQ1JFRihvcCk7Ci0JCXJldHVybiAoUHlPYmplY3QgKilvcDsKLQl9CisgICAgICAgIFB5X0lOQ1JFRihvcCk7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilvcDsKKyAgICB9CiAKLQlpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gUHlTdHJpbmdPYmplY3RfU0laRSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInN0cmluZyBpcyB0b28gbGFyZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLSBQeVN0cmluZ09iamVjdF9TSVpFKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic3RyaW5nIGlzIHRvbyBsYXJnZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBJbmxpbmUgUHlPYmplY3RfTmV3VmFyICovCi0Jb3AgPSAoUHlTdHJpbmdPYmplY3QgKilQeU9iamVjdF9NQUxMT0MoUHlTdHJpbmdPYmplY3RfU0laRSArIHNpemUpOwotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlQeU9iamVjdF9JTklUX1ZBUihvcCwgJlB5U3RyaW5nX1R5cGUsIHNpemUpOwotCW9wLT5vYl9zaGFzaCA9IC0xOwotCW9wLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOwotCWlmIChzdHIgIT0gTlVMTCkKLQkJUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBzdHIsIHNpemUpOwotCW9wLT5vYl9zdmFsW3NpemVdID0gJ1wwJzsKLQkvKiBzaGFyZSBzaG9ydCBzdHJpbmdzICovCi0JaWYgKHNpemUgPT0gMCkgewotCQlQeU9iamVjdCAqdCA9IChQeU9iamVjdCAqKW9wOwotCQlQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZ0KTsKLQkJb3AgPSAoUHlTdHJpbmdPYmplY3QgKil0OwotCQludWxsc3RyaW5nID0gb3A7Ci0JCVB5X0lOQ1JFRihvcCk7Ci0JfSBlbHNlIGlmIChzaXplID09IDEgJiYgc3RyICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnQgPSAoUHlPYmplY3QgKilvcDsKLQkJUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmdCk7Ci0JCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopdDsKLQkJY2hhcmFjdGVyc1sqc3RyICYgVUNIQVJfTUFYXSA9IG9wOwotCQlQeV9JTkNSRUYob3ApOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIC8qIElubGluZSBQeU9iamVjdF9OZXdWYXIgKi8KKyAgICBvcCA9IChQeVN0cmluZ09iamVjdCAqKVB5T2JqZWN0X01BTExPQyhQeVN0cmluZ09iamVjdF9TSVpFICsgc2l6ZSk7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFB5T2JqZWN0X0lOSVRfVkFSKG9wLCAmUHlTdHJpbmdfVHlwZSwgc2l6ZSk7CisgICAgb3AtPm9iX3NoYXNoID0gLTE7CisgICAgb3AtPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7CisgICAgaWYgKHN0ciAhPSBOVUxMKQorICAgICAgICBQeV9NRU1DUFkob3AtPm9iX3N2YWwsIHN0ciwgc2l6ZSk7CisgICAgb3AtPm9iX3N2YWxbc2l6ZV0gPSAnXDAnOworICAgIC8qIHNoYXJlIHNob3J0IHN0cmluZ3MgKi8KKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIFB5T2JqZWN0ICp0ID0gKFB5T2JqZWN0ICopb3A7CisgICAgICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJnQpOworICAgICAgICBvcCA9IChQeVN0cmluZ09iamVjdCAqKXQ7CisgICAgICAgIG51bGxzdHJpbmcgPSBvcDsKKyAgICAgICAgUHlfSU5DUkVGKG9wKTsKKyAgICB9IGVsc2UgaWYgKHNpemUgPT0gMSAmJiBzdHIgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqdCA9IChQeU9iamVjdCAqKW9wOworICAgICAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZ0KTsKKyAgICAgICAgb3AgPSAoUHlTdHJpbmdPYmplY3QgKil0OworICAgICAgICBjaGFyYWN0ZXJzWypzdHIgJiBVQ0hBUl9NQVhdID0gb3A7CisgICAgICAgIFB5X0lOQ1JFRihvcCk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U3RyaW5nX0Zyb21TdHJpbmcoY29uc3QgY2hhciAqc3RyKQogewotCXJlZ2lzdGVyIHNpemVfdCBzaXplOwotCXJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpvcDsKKyAgICByZWdpc3RlciBzaXplX3Qgc2l6ZTsKKyAgICByZWdpc3RlciBQeVN0cmluZ09iamVjdCAqb3A7CiAKLQlhc3NlcnQoc3RyICE9IE5VTEwpOwotCXNpemUgPSBzdHJsZW4oc3RyKTsKLQlpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gUHlTdHJpbmdPYmplY3RfU0laRSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJzdHJpbmcgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHNpemUgPT0gMCAmJiAob3AgPSBudWxsc3RyaW5nKSAhPSBOVUxMKSB7CisgICAgYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKyAgICBzaXplID0gc3RybGVuKHN0cik7CisgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIFB5U3RyaW5nT2JqZWN0X1NJWkUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAic3RyaW5nIGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzaXplID09IDAgJiYgKG9wID0gbnVsbHN0cmluZykgIT0gTlVMTCkgewogI2lmZGVmIENPVU5UX0FMTE9DUwotCQludWxsX3N0cmluZ3MrKzsKKyAgICAgICAgbnVsbF9zdHJpbmdzKys7CiAjZW5kaWYKLQkJUHlfSU5DUkVGKG9wKTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKW9wOwotCX0KLQlpZiAoc2l6ZSA9PSAxICYmIChvcCA9IGNoYXJhY3RlcnNbKnN0ciAmIFVDSEFSX01BWF0pICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKG9wKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW9wOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAxICYmIChvcCA9IGNoYXJhY3RlcnNbKnN0ciAmIFVDSEFSX01BWF0pICE9IE5VTEwpIHsKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkJb25lX3N0cmluZ3MrKzsKKyAgICAgICAgb25lX3N0cmluZ3MrKzsKICNlbmRpZgotCQlQeV9JTkNSRUYob3ApOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopb3A7Ci0JfQorICAgICAgICBQeV9JTkNSRUYob3ApOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopb3A7CisgICAgfQogCi0JLyogSW5saW5lIFB5T2JqZWN0X05ld1ZhciAqLwotCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKFB5U3RyaW5nT2JqZWN0X1NJWkUgKyBzaXplKTsKLQlpZiAob3AgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JUHlPYmplY3RfSU5JVF9WQVIob3AsICZQeVN0cmluZ19UeXBlLCBzaXplKTsKLQlvcC0+b2Jfc2hhc2ggPSAtMTsKLQlvcC0+b2Jfc3N0YXRlID0gU1NUQVRFX05PVF9JTlRFUk5FRDsKLQlQeV9NRU1DUFkob3AtPm9iX3N2YWwsIHN0ciwgc2l6ZSsxKTsKLQkvKiBzaGFyZSBzaG9ydCBzdHJpbmdzICovCi0JaWYgKHNpemUgPT0gMCkgewotCQlQeU9iamVjdCAqdCA9IChQeU9iamVjdCAqKW9wOwotCQlQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZ0KTsKLQkJb3AgPSAoUHlTdHJpbmdPYmplY3QgKil0OwotCQludWxsc3RyaW5nID0gb3A7Ci0JCVB5X0lOQ1JFRihvcCk7Ci0JfSBlbHNlIGlmIChzaXplID09IDEpIHsKLQkJUHlPYmplY3QgKnQgPSAoUHlPYmplY3QgKilvcDsKLQkJUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmdCk7Ci0JCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopdDsKLQkJY2hhcmFjdGVyc1sqc3RyICYgVUNIQVJfTUFYXSA9IG9wOwotCQlQeV9JTkNSRUYob3ApOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIC8qIElubGluZSBQeU9iamVjdF9OZXdWYXIgKi8KKyAgICBvcCA9IChQeVN0cmluZ09iamVjdCAqKVB5T2JqZWN0X01BTExPQyhQeVN0cmluZ09iamVjdF9TSVpFICsgc2l6ZSk7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFB5T2JqZWN0X0lOSVRfVkFSKG9wLCAmUHlTdHJpbmdfVHlwZSwgc2l6ZSk7CisgICAgb3AtPm9iX3NoYXNoID0gLTE7CisgICAgb3AtPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7CisgICAgUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBzdHIsIHNpemUrMSk7CisgICAgLyogc2hhcmUgc2hvcnQgc3RyaW5ncyAqLworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgUHlPYmplY3QgKnQgPSAoUHlPYmplY3QgKilvcDsKKyAgICAgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmdCk7CisgICAgICAgIG9wID0gKFB5U3RyaW5nT2JqZWN0ICopdDsKKyAgICAgICAgbnVsbHN0cmluZyA9IG9wOworICAgICAgICBQeV9JTkNSRUYob3ApOworICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgIFB5T2JqZWN0ICp0ID0gKFB5T2JqZWN0ICopb3A7CisgICAgICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJnQpOworICAgICAgICBvcCA9IChQeVN0cmluZ09iamVjdCAqKXQ7CisgICAgICAgIGNoYXJhY3RlcnNbKnN0ciAmIFVDSEFSX01BWF0gPSBvcDsKKyAgICAgICAgUHlfSU5DUkVGKG9wKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKIH0KIAogUHlPYmplY3QgKgogUHlTdHJpbmdfRnJvbUZvcm1hdFYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhcmdzKQogewotCXZhX2xpc3QgY291bnQ7Ci0JUHlfc3NpemVfdCBuID0gMDsKLQljb25zdCBjaGFyKiBmOwotCWNoYXIgKnM7Ci0JUHlPYmplY3QqIHN0cmluZzsKKyAgICB2YV9saXN0IGNvdW50OworICAgIFB5X3NzaXplX3QgbiA9IDA7CisgICAgY29uc3QgY2hhciogZjsKKyAgICBjaGFyICpzOworICAgIFB5T2JqZWN0KiBzdHJpbmc7CiAKICNpZmRlZiBWQV9MSVNUX0lTX0FSUkFZCi0JUHlfTUVNQ1BZKGNvdW50LCB2YXJncywgc2l6ZW9mKHZhX2xpc3QpKTsKKyAgICBQeV9NRU1DUFkoY291bnQsIHZhcmdzLCBzaXplb2YodmFfbGlzdCkpOwogI2Vsc2UKICNpZmRlZiAgX192YV9jb3B5Ci0JX192YV9jb3B5KGNvdW50LCB2YXJncyk7CisgICAgX192YV9jb3B5KGNvdW50LCB2YXJncyk7CiAjZWxzZQotCWNvdW50ID0gdmFyZ3M7CisgICAgY291bnQgPSB2YXJnczsKICNlbmRpZgogI2VuZGlmCi0JLyogc3RlcCAxOiBmaWd1cmUgb3V0IGhvdyBsYXJnZSBhIGJ1ZmZlciB3ZSBuZWVkICovCi0JZm9yIChmID0gZm9ybWF0OyAqZjsgZisrKSB7Ci0JCWlmICgqZiA9PSAnJScpIHsKKyAgICAvKiBzdGVwIDE6IGZpZ3VyZSBvdXQgaG93IGxhcmdlIGEgYnVmZmVyIHdlIG5lZWQgKi8KKyAgICBmb3IgKGYgPSBmb3JtYXQ7ICpmOyBmKyspIHsKKyAgICAgICAgaWYgKCpmID09ICclJykgewogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCQlpbnQgbG9uZ2xvbmdmbGFnID0gMDsKKyAgICAgICAgICAgIGludCBsb25nbG9uZ2ZsYWcgPSAwOwogI2VuZGlmCi0JCQljb25zdCBjaGFyKiBwID0gZjsKLQkJCXdoaWxlICgqKytmICYmICpmICE9ICclJyAmJiAhaXNhbHBoYShQeV9DSEFSTUFTSygqZikpKQotCQkJCTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBmOworICAgICAgICAgICAgd2hpbGUgKCorK2YgJiYgKmYgIT0gJyUnICYmICFpc2FscGhhKFB5X0NIQVJNQVNLKCpmKSkpCisgICAgICAgICAgICAgICAgOwogCi0JCQkvKiBza2lwIHRoZSAnbCcgb3IgJ3onIGluIHslbGQsICV6ZCwgJWx1LCAlenV9IHNpbmNlCi0JCQkgKiB0aGV5IGRvbid0IGFmZmVjdCB0aGUgYW1vdW50IG9mIHNwYWNlIHdlIHJlc2VydmUuCi0JCQkgKi8KLQkJCWlmICgqZiA9PSAnbCcpIHsKLQkJCQlpZiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpIHsKLQkJCQkJKytmOwotCQkJCX0KKyAgICAgICAgICAgIC8qIHNraXAgdGhlICdsJyBvciAneicgaW4geyVsZCwgJXpkLCAlbHUsICV6dX0gc2luY2UKKyAgICAgICAgICAgICAqIHRoZXkgZG9uJ3QgYWZmZWN0IHRoZSBhbW91bnQgb2Ygc3BhY2Ugd2UgcmVzZXJ2ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCpmID09ICdsJykgeworICAgICAgICAgICAgICAgIGlmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykgeworICAgICAgICAgICAgICAgICAgICArK2Y7CisgICAgICAgICAgICAgICAgfQogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCQkJZWxzZSBpZiAoZlsxXSA9PSAnbCcgJiYKLQkJCQkJIChmWzJdID09ICdkJyB8fCBmWzJdID09ICd1JykpIHsKLQkJCQkJbG9uZ2xvbmdmbGFnID0gMTsKLQkJCQkJZiArPSAyOwotCQkJCX0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmWzFdID09ICdsJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChmWzJdID09ICdkJyB8fCBmWzJdID09ICd1JykpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZ2xvbmdmbGFnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZiArPSAyOworICAgICAgICAgICAgICAgIH0KICNlbmRpZgotCQkJfQotCQkJZWxzZSBpZiAoKmYgPT0gJ3onICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKLQkJCQkrK2Y7Ci0JCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgqZiA9PSAneicgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgeworICAgICAgICAgICAgICAgICsrZjsKKyAgICAgICAgICAgIH0KIAotCQkJc3dpdGNoICgqZikgewotCQkJY2FzZSAnYyc6Ci0JCQkJKHZvaWQpdmFfYXJnKGNvdW50LCBpbnQpOwotCQkJCS8qIGZhbGwgdGhyb3VnaC4uLiAqLwotCQkJY2FzZSAnJSc6Ci0JCQkJbisrOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnZCc6IGNhc2UgJ3UnOiBjYXNlICdpJzogY2FzZSAneCc6Ci0JCQkJKHZvaWQpIHZhX2FyZyhjb3VudCwgaW50KTsKKyAgICAgICAgICAgIHN3aXRjaCAoKmYpIHsKKyAgICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgICAgICh2b2lkKXZhX2FyZyhjb3VudCwgaW50KTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2guLi4gKi8KKyAgICAgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2QnOiBjYXNlICd1JzogY2FzZSAnaSc6IGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoY291bnQsIGludCk7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQkJCQkvKiBOZWVkIGF0IG1vc3QKLQkJCQkgICBjZWlsKGxvZzEwKDI1NikqU0laRU9GX0xPTkdfTE9ORykgZGlnaXRzLAotCQkJCSAgIHBsdXMgMSBmb3IgdGhlIHNpZ24uICA1My8yMiBpcyBhbiB1cHBlcgotCQkJCSAgIGJvdW5kIGZvciBsb2cxMCgyNTYpLiAqLwotCQkJCWlmIChsb25nbG9uZ2ZsYWcpCi0JCQkJCW4gKz0gMiArIChTSVpFT0ZfTE9OR19MT05HKjUzLTEpIC8gMjI7Ci0JCQkJZWxzZQorICAgICAgICAgICAgICAgIC8qIE5lZWQgYXQgbW9zdAorICAgICAgICAgICAgICAgICAgIGNlaWwobG9nMTAoMjU2KSpTSVpFT0ZfTE9OR19MT05HKSBkaWdpdHMsCisgICAgICAgICAgICAgICAgICAgcGx1cyAxIGZvciB0aGUgc2lnbi4gIDUzLzIyIGlzIGFuIHVwcGVyCisgICAgICAgICAgICAgICAgICAgYm91bmQgZm9yIGxvZzEwKDI1NikuICovCisgICAgICAgICAgICAgICAgaWYgKGxvbmdsb25nZmxhZykKKyAgICAgICAgICAgICAgICAgICAgbiArPSAyICsgKFNJWkVPRl9MT05HX0xPTkcqNTMtMSkgLyAyMjsKKyAgICAgICAgICAgICAgICBlbHNlCiAjZW5kaWYKLQkJCQkJLyogMjAgYnl0ZXMgaXMgZW5vdWdoIHRvIGhvbGQgYSA2NC1iaXQKLQkJCQkJICAgaW50ZWdlci4gIERlY2ltYWwgdGFrZXMgdGhlIG1vc3QKLQkJCQkJICAgc3BhY2UuICBUaGlzIGlzbid0IGVub3VnaCBmb3IKLQkJCQkJICAgb2N0YWwuICovCi0JCQkJCW4gKz0gMjA7CisgICAgICAgICAgICAgICAgICAgIC8qIDIwIGJ5dGVzIGlzIGVub3VnaCB0byBob2xkIGEgNjQtYml0CisgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXIuICBEZWNpbWFsIHRha2VzIHRoZSBtb3N0CisgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlLiAgVGhpcyBpc24ndCBlbm91Z2ggZm9yCisgICAgICAgICAgICAgICAgICAgICAgIG9jdGFsLiAqLworICAgICAgICAgICAgICAgICAgICBuICs9IDIwOwogCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdzJzoKLQkJCQlzID0gdmFfYXJnKGNvdW50LCBjaGFyKik7Ci0JCQkJbiArPSBzdHJsZW4ocyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdwJzoKLQkJCQkodm9pZCkgdmFfYXJnKGNvdW50LCBpbnQpOwotCQkJCS8qIG1heGltdW0gNjQtYml0IHBvaW50ZXIgcmVwcmVzZW50YXRpb246Ci0JCQkJICogMHhmZmZmZmZmZmZmZmZmZmZmCi0JCQkJICogc28gMTkgY2hhcmFjdGVycyBpcyBlbm91Z2guCi0JCQkJICogWFhYIEkgY291bnQgMTggLS0gd2hhdCdzIHRoZSBleHRyYSBmb3I/Ci0JCQkJICovCi0JCQkJbiArPSAxOTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLyogaWYgd2Ugc3R1bWJsZSB1cG9uIGFuIHVua25vd24KLQkJCQkgICBmb3JtYXR0aW5nIGNvZGUsIGNvcHkgdGhlIHJlc3Qgb2YKLQkJCQkgICB0aGUgZm9ybWF0IHN0cmluZyB0byB0aGUgb3V0cHV0Ci0JCQkJICAgc3RyaW5nLiAod2UgY2Fubm90IGp1c3Qgc2tpcCB0aGUKLQkJCQkgICBjb2RlLCBzaW5jZSB0aGVyZSdzIG5vIHdheSB0byBrbm93Ci0JCQkJICAgd2hhdCdzIGluIHRoZSBhcmd1bWVudCBsaXN0KSAqLwotCQkJCW4gKz0gc3RybGVuKHApOwotCQkJCWdvdG8gZXhwYW5kOwotCQkJfQotCQl9IGVsc2UKLQkJCW4rKzsKLQl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgICBzID0gdmFfYXJnKGNvdW50LCBjaGFyKik7CisgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKGNvdW50LCBpbnQpOworICAgICAgICAgICAgICAgIC8qIG1heGltdW0gNjQtYml0IHBvaW50ZXIgcmVwcmVzZW50YXRpb246CisgICAgICAgICAgICAgICAgICogMHhmZmZmZmZmZmZmZmZmZmZmCisgICAgICAgICAgICAgICAgICogc28gMTkgY2hhcmFjdGVycyBpcyBlbm91Z2guCisgICAgICAgICAgICAgICAgICogWFhYIEkgY291bnQgMTggLS0gd2hhdCdzIHRoZSBleHRyYSBmb3I/CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbiArPSAxOTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLyogaWYgd2Ugc3R1bWJsZSB1cG9uIGFuIHVua25vd24KKyAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nIGNvZGUsIGNvcHkgdGhlIHJlc3Qgb2YKKyAgICAgICAgICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgc3RyaW5nLiAod2UgY2Fubm90IGp1c3Qgc2tpcCB0aGUKKyAgICAgICAgICAgICAgICAgICBjb2RlLCBzaW5jZSB0aGVyZSdzIG5vIHdheSB0byBrbm93CisgICAgICAgICAgICAgICAgICAgd2hhdCdzIGluIHRoZSBhcmd1bWVudCBsaXN0KSAqLworICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHApOworICAgICAgICAgICAgICAgIGdvdG8gZXhwYW5kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG4rKzsKKyAgICB9CiAgZXhwYW5kOgotCS8qIHN0ZXAgMjogZmlsbCB0aGUgYnVmZmVyICovCi0JLyogU2luY2Ugd2UndmUgYW5hbHl6ZWQgaG93IG11Y2ggc3BhY2Ugd2UgbmVlZCBmb3IgdGhlIHdvcnN0IGNhc2UsCi0JICAgdXNlIHNwcmludGYgZGlyZWN0bHkgaW5zdGVhZCBvZiB0aGUgc2xvd2VyIFB5T1Nfc25wcmludGYuICovCi0Jc3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKCFzdHJpbmcpCi0JCXJldHVybiBOVUxMOworICAgIC8qIHN0ZXAgMjogZmlsbCB0aGUgYnVmZmVyICovCisgICAgLyogU2luY2Ugd2UndmUgYW5hbHl6ZWQgaG93IG11Y2ggc3BhY2Ugd2UgbmVlZCBmb3IgdGhlIHdvcnN0IGNhc2UsCisgICAgICAgdXNlIHNwcmludGYgZGlyZWN0bHkgaW5zdGVhZCBvZiB0aGUgc2xvd2VyIFB5T1Nfc25wcmludGYuICovCisgICAgc3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKCFzdHJpbmcpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZyk7CisgICAgcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZyk7CiAKLQlmb3IgKGYgPSBmb3JtYXQ7ICpmOyBmKyspIHsKLQkJaWYgKCpmID09ICclJykgewotCQkJY29uc3QgY2hhciogcCA9IGYrKzsKLQkJCVB5X3NzaXplX3QgaTsKLQkJCWludCBsb25nZmxhZyA9IDA7CisgICAgZm9yIChmID0gZm9ybWF0OyAqZjsgZisrKSB7CisgICAgICAgIGlmICgqZiA9PSAnJScpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBmKys7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICBpbnQgbG9uZ2ZsYWcgPSAwOwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCQlpbnQgbG9uZ2xvbmdmbGFnID0gMDsKKyAgICAgICAgICAgIGludCBsb25nbG9uZ2ZsYWcgPSAwOwogI2VuZGlmCi0JCQlpbnQgc2l6ZV90ZmxhZyA9IDA7Ci0JCQkvKiBwYXJzZSB0aGUgd2lkdGgucHJlY2lzaW9uIHBhcnQgKHdlJ3JlIG9ubHkKLQkJCSAgIGludGVyZXN0ZWQgaW4gdGhlIHByZWNpc2lvbiB2YWx1ZSwgaWYgYW55KSAqLwotCQkJbiA9IDA7Ci0JCQl3aGlsZSAoaXNkaWdpdChQeV9DSEFSTUFTSygqZikpKQotCQkJCW4gPSAobioxMCkgKyAqZisrIC0gJzAnOwotCQkJaWYgKCpmID09ICcuJykgewotCQkJCWYrKzsKLQkJCQluID0gMDsKLQkJCQl3aGlsZSAoaXNkaWdpdChQeV9DSEFSTUFTSygqZikpKQotCQkJCQluID0gKG4qMTApICsgKmYrKyAtICcwJzsKLQkJCX0KLQkJCXdoaWxlICgqZiAmJiAqZiAhPSAnJScgJiYgIWlzYWxwaGEoUHlfQ0hBUk1BU0soKmYpKSkKLQkJCQlmKys7Ci0JCQkvKiBIYW5kbGUgJWxkLCAlbHUsICVsbGQgYW5kICVsbHUuICovCi0JCQlpZiAoKmYgPT0gJ2wnKSB7Ci0JCQkJaWYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSB7Ci0JCQkJCWxvbmdmbGFnID0gMTsKLQkJCQkJKytmOwotCQkJCX0KKyAgICAgICAgICAgIGludCBzaXplX3RmbGFnID0gMDsKKyAgICAgICAgICAgIC8qIHBhcnNlIHRoZSB3aWR0aC5wcmVjaXNpb24gcGFydCAod2UncmUgb25seQorICAgICAgICAgICAgICAgaW50ZXJlc3RlZCBpbiB0aGUgcHJlY2lzaW9uIHZhbHVlLCBpZiBhbnkpICovCisgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCpmKSkpCisgICAgICAgICAgICAgICAgbiA9IChuKjEwKSArICpmKysgLSAnMCc7CisgICAgICAgICAgICBpZiAoKmYgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgZisrOworICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCpmKSkpCisgICAgICAgICAgICAgICAgICAgIG4gPSAobioxMCkgKyAqZisrIC0gJzAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKCpmICYmICpmICE9ICclJyAmJiAhaXNhbHBoYShQeV9DSEFSTUFTSygqZikpKQorICAgICAgICAgICAgICAgIGYrKzsKKyAgICAgICAgICAgIC8qIEhhbmRsZSAlbGQsICVsdSwgJWxsZCBhbmQgJWxsdS4gKi8KKyAgICAgICAgICAgIGlmICgqZiA9PSAnbCcpIHsKKyAgICAgICAgICAgICAgICBpZiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZ2ZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICArK2Y7CisgICAgICAgICAgICAgICAgfQogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCQkJZWxzZSBpZiAoZlsxXSA9PSAnbCcgJiYKLQkJCQkJIChmWzJdID09ICdkJyB8fCBmWzJdID09ICd1JykpIHsKLQkJCQkJbG9uZ2xvbmdmbGFnID0gMTsKLQkJCQkJZiArPSAyOwotCQkJCX0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmWzFdID09ICdsJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChmWzJdID09ICdkJyB8fCBmWzJdID09ICd1JykpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZ2xvbmdmbGFnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZiArPSAyOworICAgICAgICAgICAgICAgIH0KICNlbmRpZgotCQkJfQotCQkJLyogaGFuZGxlIHRoZSBzaXplX3QgZmxhZy4gKi8KLQkJCWVsc2UgaWYgKCpmID09ICd6JyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7Ci0JCQkJc2l6ZV90ZmxhZyA9IDE7Ci0JCQkJKytmOwotCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaGFuZGxlIHRoZSBzaXplX3QgZmxhZy4gKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKCpmID09ICd6JyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90ZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgKytmOworICAgICAgICAgICAgfQogCi0JCQlzd2l0Y2ggKCpmKSB7Ci0JCQljYXNlICdjJzoKLQkJCQkqcysrID0gdmFfYXJnKHZhcmdzLCBpbnQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnZCc6Ci0JCQkJaWYgKGxvbmdmbGFnKQotCQkJCQlzcHJpbnRmKHMsICIlbGQiLCB2YV9hcmcodmFyZ3MsIGxvbmcpKTsKKyAgICAgICAgICAgIHN3aXRjaCAoKmYpIHsKKyAgICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgICAgICpzKysgPSB2YV9hcmcodmFyZ3MsIGludCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVsZCIsIHZhX2FyZyh2YXJncywgbG9uZykpOwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCQkJZWxzZSBpZiAobG9uZ2xvbmdmbGFnKQotCQkJCQlzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfTE9OR19MT05HICJkIiwKLQkJCQkJCXZhX2FyZyh2YXJncywgUFlfTE9OR19MT05HKSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9uZ2xvbmdmbGFnKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfTE9OR19MT05HICJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgUFlfTE9OR19MT05HKSk7CiAjZW5kaWYKLQkJCQllbHNlIGlmIChzaXplX3RmbGFnKQotCQkJCQlzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKLQkJCQkJICAgICAgICB2YV9hcmcodmFyZ3MsIFB5X3NzaXplX3QpKTsKLQkJCQllbHNlCi0JCQkJCXNwcmludGYocywgIiVkIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKLQkJCQlzICs9IHN0cmxlbihzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3UnOgotCQkJCWlmIChsb25nZmxhZykKLQkJCQkJc3ByaW50ZihzLCAiJWx1IiwKLQkJCQkJCXZhX2FyZyh2YXJncywgdW5zaWduZWQgbG9uZykpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemVfdGZsYWcpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQiLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCBQeV9zc2l6ZV90KSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlZCIsIHZhX2FyZyh2YXJncywgaW50KSk7CisgICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVsdSIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHVuc2lnbmVkIGxvbmcpKTsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCQkJCWVsc2UgaWYgKGxvbmdsb25nZmxhZykKLQkJCQkJc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX0xPTkdfTE9ORyAidSIsCi0JCQkJCQl2YV9hcmcodmFyZ3MsIFBZX0xPTkdfTE9ORykpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvbmdsb25nZmxhZykKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX0xPTkdfTE9ORyAidSIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIFBZX0xPTkdfTE9ORykpOwogI2VuZGlmCi0JCQkJZWxzZSBpZiAoc2l6ZV90ZmxhZykKLQkJCQkJc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCi0JCQkJCSAgICAgICAgdmFfYXJnKHZhcmdzLCBzaXplX3QpKTsKLQkJCQllbHNlCi0JCQkJCXNwcmludGYocywgIiV1IiwKLQkJCQkJCXZhX2FyZyh2YXJncywgdW5zaWduZWQgaW50KSk7Ci0JCQkJcyArPSBzdHJsZW4ocyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdpJzoKLQkJCQlzcHJpbnRmKHMsICIlaSIsIHZhX2FyZyh2YXJncywgaW50KSk7Ci0JCQkJcyArPSBzdHJsZW4ocyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICd4JzoKLQkJCQlzcHJpbnRmKHMsICIleCIsIHZhX2FyZyh2YXJncywgaW50KSk7Ci0JCQkJcyArPSBzdHJsZW4ocyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdzJzoKLQkJCQlwID0gdmFfYXJnKHZhcmdzLCBjaGFyKik7Ci0JCQkJaSA9IHN0cmxlbihwKTsKLQkJCQlpZiAobiA+IDAgJiYgaSA+IG4pCi0JCQkJCWkgPSBuOwotCQkJCVB5X01FTUNQWShzLCBwLCBpKTsKLQkJCQlzICs9IGk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdwJzoKLQkJCQlzcHJpbnRmKHMsICIlcCIsIHZhX2FyZyh2YXJncywgdm9pZCopKTsKLQkJCQkvKiAlcCBpcyBpbGwtZGVmaW5lZDogIGVuc3VyZSBsZWFkaW5nIDB4LiAqLwotCQkJCWlmIChzWzFdID09ICdYJykKLQkJCQkJc1sxXSA9ICd4JzsKLQkJCQllbHNlIGlmIChzWzFdICE9ICd4JykgewotCQkJCQltZW1tb3ZlKHMrMiwgcywgc3RybGVuKHMpKzEpOwotCQkJCQlzWzBdID0gJzAnOwotCQkJCQlzWzFdID0gJ3gnOwotCQkJCX0KLQkJCQlzICs9IHN0cmxlbihzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyUnOgotCQkJCSpzKysgPSAnJSc7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0cmNweShzLCBwKTsKLQkJCQlzICs9IHN0cmxlbihzKTsKLQkJCQlnb3RvIGVuZDsKLQkJCX0KLQkJfSBlbHNlCi0JCQkqcysrID0gKmY7Ci0JfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemVfdGZsYWcpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgInUiLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCBzaXplX3QpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgdW5zaWduZWQgaW50KSk7CisgICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlaSIsIHZhX2FyZyh2YXJncywgaW50KSk7CisgICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIleCIsIHZhX2FyZyh2YXJncywgaW50KSk7CisgICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgICBwID0gdmFfYXJnKHZhcmdzLCBjaGFyKik7CisgICAgICAgICAgICAgICAgaSA9IHN0cmxlbihwKTsKKyAgICAgICAgICAgICAgICBpZiAobiA+IDAgJiYgaSA+IG4pCisgICAgICAgICAgICAgICAgICAgIGkgPSBuOworICAgICAgICAgICAgICAgIFB5X01FTUNQWShzLCBwLCBpKTsKKyAgICAgICAgICAgICAgICBzICs9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlcCIsIHZhX2FyZyh2YXJncywgdm9pZCopKTsKKyAgICAgICAgICAgICAgICAvKiAlcCBpcyBpbGwtZGVmaW5lZDogIGVuc3VyZSBsZWFkaW5nIDB4LiAqLworICAgICAgICAgICAgICAgIGlmIChzWzFdID09ICdYJykKKyAgICAgICAgICAgICAgICAgICAgc1sxXSA9ICd4JzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzWzFdICE9ICd4JykgeworICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKHMrMiwgcywgc3RybGVuKHMpKzEpOworICAgICAgICAgICAgICAgICAgICBzWzBdID0gJzAnOworICAgICAgICAgICAgICAgICAgICBzWzFdID0gJ3gnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgICAgICpzKysgPSAnJSc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN0cmNweShzLCBwKTsKKyAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAqcysrID0gKmY7CisgICAgfQogCiAgZW5kOgotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZzdHJpbmcsIHMgLSBQeVN0cmluZ19BU19TVFJJTkcoc3RyaW5nKSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBzdHJpbmc7CisgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnN0cmluZywgcyAtIFB5U3RyaW5nX0FTX1NUUklORyhzdHJpbmcpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHN0cmluZzsKIH0KIAogUHlPYmplY3QgKgogUHlTdHJpbmdfRnJvbUZvcm1hdChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQlQeU9iamVjdCogcmV0OwotCXZhX2xpc3QgdmFyZ3M7CisgICAgUHlPYmplY3QqIHJldDsKKyAgICB2YV9saXN0IHZhcmdzOwogCiAjaWZkZWYgSEFWRV9TVERBUkdfUFJPVE9UWVBFUwotCXZhX3N0YXJ0KHZhcmdzLCBmb3JtYXQpOworICAgIHZhX3N0YXJ0KHZhcmdzLCBmb3JtYXQpOwogI2Vsc2UKLQl2YV9zdGFydCh2YXJncyk7CisgICAgdmFfc3RhcnQodmFyZ3MpOwogI2VuZGlmCi0JcmV0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdFYoZm9ybWF0LCB2YXJncyk7Ci0JdmFfZW5kKHZhcmdzKTsKLQlyZXR1cm4gcmV0OworICAgIHJldCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXRWKGZvcm1hdCwgdmFyZ3MpOworICAgIHZhX2VuZCh2YXJncyk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogCiBQeU9iamVjdCAqUHlTdHJpbmdfRGVjb2RlKGNvbnN0IGNoYXIgKnMsCi0JCQkgIFB5X3NzaXplX3Qgc2l6ZSwKLQkJCSAgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICp2LCAqc3RyOwogCiAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgc2l6ZSk7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIHYgPSBQeVN0cmluZ19Bc0RlY29kZWRTdHJpbmcoc3RyLCBlbmNvZGluZywgZXJyb3JzKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KIAogUHlPYmplY3QgKlB5U3RyaW5nX0FzRGVjb2RlZE9iamVjdChQeU9iamVjdCAqc3RyLAotCQkJCSAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJCSAgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqdjsKIAogICAgIGlmICghUHlTdHJpbmdfQ2hlY2soc3RyKSkgewotICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOwotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogCiAgICAgaWYgKGVuY29kaW5nID09IE5VTEwpIHsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZW5jb2RpbmcgPSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCk7CisgICAgZW5jb2RpbmcgPSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCk7CiAjZWxzZQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm8gZW5jb2Rpbmcgc3BlY2lmaWVkIik7Ci0JZ290byBvbkVycm9yOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm8gZW5jb2Rpbmcgc3BlY2lmaWVkIik7CisgICAgZ290byBvbkVycm9yOwogI2VuZGlmCiAgICAgfQogCiAgICAgLyogRGVjb2RlIHZpYSB0aGUgY29kZWMgcmVnaXN0cnkgKi8KICAgICB2ID0gUHlDb2RlY19EZWNvZGUoc3RyLCBlbmNvZGluZywgZXJyb3JzKTsKICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgZ290byBvbkVycm9yOwogCiAgICAgcmV0dXJuIHY7CiAKQEAgLTQ2NCwzMSArNDY0LDMxIEBACiB9CiAKIFB5T2JqZWN0ICpQeVN0cmluZ19Bc0RlY29kZWRTdHJpbmcoUHlPYmplY3QgKnN0ciwKLQkJCQkgICBjb25zdCBjaGFyICplbmNvZGluZywKLQkJCQkgICBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgUHlPYmplY3QgKnY7CiAKICAgICB2ID0gUHlTdHJpbmdfQXNEZWNvZGVkT2JqZWN0KHN0ciwgZW5jb2RpbmcsIGVycm9ycyk7CiAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIGdvdG8gb25FcnJvcjsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKICAgICAvKiBDb252ZXJ0IFVuaWNvZGUgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcgKi8KICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JUHlPYmplY3QgKnRlbXAgPSB2OwotCXYgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHYsIE5VTEwsIE5VTEwpOwotCVB5X0RFQ1JFRih0ZW1wKTsKLQlpZiAodiA9PSBOVUxMKQotCSAgICBnb3RvIG9uRXJyb3I7CisgICAgUHlPYmplY3QgKnRlbXAgPSB2OworICAgIHYgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHYsIE5VTEwsIE5VTEwpOworICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogI2VuZGlmCiAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgImRlY29kZXIgZGlkIG5vdCByZXR1cm4gYSBzdHJpbmcgb2JqZWN0ICh0eXBlPSUuNDAwcykiLAotICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSk7Ci0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJkZWNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nIG9iamVjdCAodHlwZT0lLjQwMHMpIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSk7CisgICAgUHlfREVDUkVGKHYpOworICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAKICAgICByZXR1cm4gdjsKQEAgLTQ5OCw0NCArNDk4LDQ0IEBACiB9CiAKIFB5T2JqZWN0ICpQeVN0cmluZ19FbmNvZGUoY29uc3QgY2hhciAqcywKLQkJCSAgUHlfc3NpemVfdCBzaXplLAotCQkJICBjb25zdCBjaGFyICplbmNvZGluZywKLQkJCSAgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgUHlPYmplY3QgKnYsICpzdHI7CiAKICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBzaXplKTsKICAgICBpZiAoc3RyID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IFB5U3RyaW5nX0FzRW5jb2RlZFN0cmluZyhzdHIsIGVuY29kaW5nLCBlcnJvcnMpOwogICAgIFB5X0RFQ1JFRihzdHIpOwogICAgIHJldHVybiB2OwogfQogCiBQeU9iamVjdCAqUHlTdHJpbmdfQXNFbmNvZGVkT2JqZWN0KFB5T2JqZWN0ICpzdHIsCi0JCQkJICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkJICAgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICp2OwogCiAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhzdHIpKSB7Ci0gICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAKICAgICBpZiAoZW5jb2RpbmcgPT0gTlVMTCkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbmNvZGluZyA9IFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKTsKKyAgICBlbmNvZGluZyA9IFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKTsKICNlbHNlCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBlbmNvZGluZyBzcGVjaWZpZWQiKTsKLQlnb3RvIG9uRXJyb3I7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBlbmNvZGluZyBzcGVjaWZpZWQiKTsKKyAgICBnb3RvIG9uRXJyb3I7CiAjZW5kaWYKICAgICB9CiAKICAgICAvKiBFbmNvZGUgdmlhIHRoZSBjb2RlYyByZWdpc3RyeSAqLwogICAgIHYgPSBQeUNvZGVjX0VuY29kZShzdHIsIGVuY29kaW5nLCBlcnJvcnMpOwogICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBnb3RvIG9uRXJyb3I7CiAKICAgICByZXR1cm4gdjsKIApAQCAtNTQ0LDMxICs1NDQsMzEgQEAKIH0KIAogUHlPYmplY3QgKlB5U3RyaW5nX0FzRW5jb2RlZFN0cmluZyhQeU9iamVjdCAqc3RyLAotCQkJCSAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJCSAgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqdjsKIAogICAgIHYgPSBQeVN0cmluZ19Bc0VuY29kZWRPYmplY3Qoc3RyLCBlbmNvZGluZywgZXJyb3JzKTsKICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgZ290byBvbkVycm9yOwogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgIC8qIENvbnZlcnQgVW5pY29kZSB0byBhIHN0cmluZyB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZyAqLwogICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKLQlQeU9iamVjdCAqdGVtcCA9IHY7Ci0JdiA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodiwgTlVMTCwgTlVMTCk7Ci0JUHlfREVDUkVGKHRlbXApOwotCWlmICh2ID09IE5VTEwpCi0JICAgIGdvdG8gb25FcnJvcjsKKyAgICBQeU9iamVjdCAqdGVtcCA9IHY7CisgICAgdiA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodiwgTlVMTCwgTlVMTCk7CisgICAgUHlfREVDUkVGKHRlbXApOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAjZW5kaWYKICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiZW5jb2RlciBkaWQgbm90IHJldHVybiBhIHN0cmluZyBvYmplY3QgKHR5cGU9JS40MDBzKSIsCi0gICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKLSAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImVuY29kZXIgZGlkIG5vdCByZXR1cm4gYSBzdHJpbmcgb2JqZWN0ICh0eXBlPSUuNDAwcykiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgZ290byBvbkVycm9yOwogICAgIH0KIAogICAgIHJldHVybiB2OwpAQCAtNTgwLDI1ICs1ODAsMjUgQEAKIHN0YXRpYyB2b2lkCiBzdHJpbmdfZGVhbGxvYyhQeU9iamVjdCAqb3ApCiB7Ci0Jc3dpdGNoIChQeVN0cmluZ19DSEVDS19JTlRFUk5FRChvcCkpIHsKLQkJY2FzZSBTU1RBVEVfTk9UX0lOVEVSTkVEOgotCQkJYnJlYWs7CisgICAgc3dpdGNoIChQeVN0cmluZ19DSEVDS19JTlRFUk5FRChvcCkpIHsKKyAgICAgICAgY2FzZSBTU1RBVEVfTk9UX0lOVEVSTkVEOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBTU1RBVEVfSU5URVJORURfTU9SVEFMOgotCQkJLyogcmV2aXZlIGRlYWQgb2JqZWN0IHRlbXBvcmFyaWx5IGZvciBEZWxJdGVtICovCi0JCQlQeV9SRUZDTlQob3ApID0gMzsKLQkJCWlmIChQeURpY3RfRGVsSXRlbShpbnRlcm5lZCwgb3ApICE9IDApCi0JCQkJUHlfRmF0YWxFcnJvcigKLQkJCQkJImRlbGV0aW9uIG9mIGludGVybmVkIHN0cmluZyBmYWlsZWQiKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFNTVEFURV9JTlRFUk5FRF9NT1JUQUw6CisgICAgICAgICAgICAvKiByZXZpdmUgZGVhZCBvYmplY3QgdGVtcG9yYXJpbHkgZm9yIERlbEl0ZW0gKi8KKyAgICAgICAgICAgIFB5X1JFRkNOVChvcCkgPSAzOworICAgICAgICAgICAgaWYgKFB5RGljdF9EZWxJdGVtKGludGVybmVkLCBvcCkgIT0gMCkKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKAorICAgICAgICAgICAgICAgICAgICAiZGVsZXRpb24gb2YgaW50ZXJuZWQgc3RyaW5nIGZhaWxlZCIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBTU1RBVEVfSU5URVJORURfSU1NT1JUQUw6Ci0JCQlQeV9GYXRhbEVycm9yKCJJbW1vcnRhbCBpbnRlcm5lZCBzdHJpbmcgZGllZC4iKTsKKyAgICAgICAgY2FzZSBTU1RBVEVfSU5URVJORURfSU1NT1JUQUw6CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJJbW1vcnRhbCBpbnRlcm5lZCBzdHJpbmcgZGllZC4iKTsKIAotCQlkZWZhdWx0OgotCQkJUHlfRmF0YWxFcnJvcigiSW5jb25zaXN0ZW50IGludGVybmVkIHN0cmluZyBzdGF0ZS4iKTsKLQl9Ci0JUHlfVFlQRShvcCktPnRwX2ZyZWUob3ApOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiSW5jb25zaXN0ZW50IGludGVybmVkIHN0cmluZyBzdGF0ZS4iKTsKKyAgICB9CisgICAgUHlfVFlQRShvcCktPnRwX2ZyZWUob3ApOwogfQogCiAvKiBVbmVzY2FwZSBhIGJhY2tzbGFzaC1lc2NhcGVkIHN0cmluZy4gSWYgdW5pY29kZSBpcyBub24temVybywKQEAgLTYwNywxNTMgKzYwNywxNTMgQEAKICAgIHNwZWNpZmllZCBlbmNvZGluZy4gICovCiAKIFB5T2JqZWN0ICpQeVN0cmluZ19EZWNvZGVFc2NhcGUoY29uc3QgY2hhciAqcywKLQkJCQlQeV9zc2l6ZV90IGxlbiwKLQkJCQljb25zdCBjaGFyICplcnJvcnMsCi0JCQkJUHlfc3NpemVfdCB1bmljb2RlLAotCQkJCWNvbnN0IGNoYXIgKnJlY29kZV9lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCB1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWNvZGVfZW5jb2RpbmcpCiB7Ci0JaW50IGM7Ci0JY2hhciAqcCwgKmJ1ZjsKLQljb25zdCBjaGFyICplbmQ7Ci0JUHlPYmplY3QgKnY7Ci0JUHlfc3NpemVfdCBuZXdsZW4gPSByZWNvZGVfZW5jb2RpbmcgPyA0KmxlbjpsZW47Ci0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbmV3bGVuKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwID0gYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JZW5kID0gcyArIGxlbjsKLQl3aGlsZSAocyA8IGVuZCkgewotCQlpZiAoKnMgIT0gJ1xcJykgewotCQkgIG5vbl9lc2M6CisgICAgaW50IGM7CisgICAgY2hhciAqcCwgKmJ1ZjsKKyAgICBjb25zdCBjaGFyICplbmQ7CisgICAgUHlPYmplY3QgKnY7CisgICAgUHlfc3NpemVfdCBuZXdsZW4gPSByZWNvZGVfZW5jb2RpbmcgPyA0KmxlbjpsZW47CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbmV3bGVuKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwID0gYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgZW5kID0gcyArIGxlbjsKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICBpZiAoKnMgIT0gJ1xcJykgeworICAgICAgICAgIG5vbl9lc2M6CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJaWYgKHJlY29kZV9lbmNvZGluZyAmJiAoKnMgJiAweDgwKSkgewotCQkJCVB5T2JqZWN0ICp1LCAqdzsKLQkJCQljaGFyICpyOwotCQkJCWNvbnN0IGNoYXIqIHQ7Ci0JCQkJUHlfc3NpemVfdCBybjsKLQkJCQl0ID0gczsKLQkJCQkvKiBEZWNvZGUgbm9uLUFTQ0lJIGJ5dGVzIGFzIFVURi04LiAqLwotCQkJCXdoaWxlICh0IDwgZW5kICYmICgqdCAmIDB4ODApKSB0Kys7Ci0JCQkJdSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIHQgLSBzLCBlcnJvcnMpOwotCQkJCWlmKCF1KSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIGlmIChyZWNvZGVfZW5jb2RpbmcgJiYgKCpzICYgMHg4MCkpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqdSwgKnc7CisgICAgICAgICAgICAgICAgY2hhciAqcjsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0OworICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgcm47CisgICAgICAgICAgICAgICAgdCA9IHM7CisgICAgICAgICAgICAgICAgLyogRGVjb2RlIG5vbi1BU0NJSSBieXRlcyBhcyBVVEYtOC4gKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAodCA8IGVuZCAmJiAoKnQgJiAweDgwKSkgdCsrOworICAgICAgICAgICAgICAgIHUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCB0IC0gcywgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICBpZighdSkgZ290byBmYWlsZWQ7CiAKLQkJCQkvKiBSZWNvZGUgdGhlbSBpbiB0YXJnZXQgZW5jb2RpbmcuICovCi0JCQkJdyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCi0JCQkJCXUsIHJlY29kZV9lbmNvZGluZywgZXJyb3JzKTsKLQkJCQlQeV9ERUNSRUYodSk7Ci0JCQkJaWYgKCF3KQlnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICAvKiBSZWNvZGUgdGhlbSBpbiB0YXJnZXQgZW5jb2RpbmcuICovCisgICAgICAgICAgICAgICAgdyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIHUsIHJlY29kZV9lbmNvZGluZywgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICAgICAgaWYgKCF3KSAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CiAKLQkJCQkvKiBBcHBlbmQgYnl0ZXMgdG8gb3V0cHV0IGJ1ZmZlci4gKi8KLQkJCQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2sodykpOwotCQkJCXIgPSBQeVN0cmluZ19BU19TVFJJTkcodyk7Ci0JCQkJcm4gPSBQeVN0cmluZ19HRVRfU0laRSh3KTsKLQkJCQlQeV9NRU1DUFkocCwgciwgcm4pOwotCQkJCXAgKz0gcm47Ci0JCQkJUHlfREVDUkVGKHcpOwotCQkJCXMgPSB0OwotCQkJfSBlbHNlIHsKLQkJCQkqcCsrID0gKnMrKzsKLQkJCX0KKyAgICAgICAgICAgICAgICAvKiBBcHBlbmQgYnl0ZXMgdG8gb3V0cHV0IGJ1ZmZlci4gKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2sodykpOworICAgICAgICAgICAgICAgIHIgPSBQeVN0cmluZ19BU19TVFJJTkcodyk7CisgICAgICAgICAgICAgICAgcm4gPSBQeVN0cmluZ19HRVRfU0laRSh3KTsKKyAgICAgICAgICAgICAgICBQeV9NRU1DUFkocCwgciwgcm4pOworICAgICAgICAgICAgICAgIHAgKz0gcm47CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgICAgIHMgPSB0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqcCsrID0gKnMrKzsKKyAgICAgICAgICAgIH0KICNlbHNlCi0JCQkqcCsrID0gKnMrKzsKKyAgICAgICAgICAgICpwKysgPSAqcysrOwogI2VuZGlmCi0JCQljb250aW51ZTsKLQkJfQotCQlzKys7Ci0gICAgICAgICAgICAgICAgaWYgKHM9PWVuZCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJUcmFpbGluZyBcXCBpbiBzdHJpbmciKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JCXN3aXRjaCAoKnMrKykgewotCQkvKiBYWFggVGhpcyBhc3N1bWVzIEFTQ0lJISAqLwotCQljYXNlICdcbic6IGJyZWFrOwotCQljYXNlICdcXCc6ICpwKysgPSAnXFwnOyBicmVhazsKLQkJY2FzZSAnXCcnOiAqcCsrID0gJ1wnJzsgYnJlYWs7Ci0JCWNhc2UgJ1wiJzogKnArKyA9ICdcIic7IGJyZWFrOwotCQljYXNlICdiJzogKnArKyA9ICdcYic7IGJyZWFrOwotCQljYXNlICdmJzogKnArKyA9ICdcMDE0JzsgYnJlYWs7IC8qIEZGICovCi0JCWNhc2UgJ3QnOiAqcCsrID0gJ1x0JzsgYnJlYWs7Ci0JCWNhc2UgJ24nOiAqcCsrID0gJ1xuJzsgYnJlYWs7Ci0JCWNhc2UgJ3InOiAqcCsrID0gJ1xyJzsgYnJlYWs7Ci0JCWNhc2UgJ3YnOiAqcCsrID0gJ1wwMTMnOyBicmVhazsgLyogVlQgKi8KLQkJY2FzZSAnYSc6ICpwKysgPSAnXDAwNyc7IGJyZWFrOyAvKiBCRUwsIG5vdCBjbGFzc2ljIEMgKi8KLQkJY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6Ci0JCWNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgotCQkJYyA9IHNbLTFdIC0gJzAnOwotCQkJaWYgKHMgPCBlbmQgJiYgJzAnIDw9ICpzICYmICpzIDw9ICc3JykgewotCQkJCWMgPSAoYzw8MykgKyAqcysrIC0gJzAnOwotCQkJCWlmIChzIDwgZW5kICYmICcwJyA8PSAqcyAmJiAqcyA8PSAnNycpCi0JCQkJCWMgPSAoYzw8MykgKyAqcysrIC0gJzAnOwotCQkJfQotCQkJKnArKyA9IGM7Ci0JCQlicmVhazsKLQkJY2FzZSAneCc6Ci0JCQlpZiAocysxIDwgZW5kICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXN4ZGlnaXQoUHlfQ0hBUk1BU0soc1swXSkpICYmCi0JCQkgICAgaXN4ZGlnaXQoUHlfQ0hBUk1BU0soc1sxXSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCQkJCXVuc2lnbmVkIGludCB4ID0gMDsKLQkJCQljID0gUHlfQ0hBUk1BU0soKnMpOwotCQkJCXMrKzsKLQkJCQlpZiAoaXNkaWdpdChjKSkKLQkJCQkJeCA9IGMgLSAnMCc7Ci0JCQkJZWxzZSBpZiAoaXNsb3dlcihjKSkKLQkJCQkJeCA9IDEwICsgYyAtICdhJzsKLQkJCQllbHNlCi0JCQkJCXggPSAxMCArIGMgLSAnQSc7Ci0JCQkJeCA9IHggPDwgNDsKLQkJCQljID0gUHlfQ0hBUk1BU0soKnMpOwotCQkJCXMrKzsKLQkJCQlpZiAoaXNkaWdpdChjKSkKLQkJCQkJeCArPSBjIC0gJzAnOwotCQkJCWVsc2UgaWYgKGlzbG93ZXIoYykpCi0JCQkJCXggKz0gMTAgKyBjIC0gJ2EnOwotCQkJCWVsc2UKLQkJCQkJeCArPSAxMCArIGMgLSAnQSc7Ci0JCQkJKnArKyA9IHg7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIWVycm9ycyB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJImludmFsaWQgXFx4IGVzY2FwZSIpOwotCQkJCWdvdG8gZmFpbGVkOwotCQkJfQotCQkJaWYgKHN0cmNtcChlcnJvcnMsICJyZXBsYWNlIikgPT0gMCkgewotCQkJCSpwKysgPSAnPyc7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChlcnJvcnMsICJpZ25vcmUiKSA9PSAwKQotCQkJCS8qIGRvIG5vdGhpbmcgKi87Ci0JCQllbHNlIHsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJICAgICAiZGVjb2RpbmcgZXJyb3I7ICIKLQkJCQkJICAgICAidW5rbm93biBlcnJvciBoYW5kbGluZyBjb2RlOiAlLjQwMHMiLAotCQkJCQkgICAgIGVycm9ycyk7Ci0JCQkJZ290byBmYWlsZWQ7Ci0JCQl9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzKys7CisgICAgICAgIGlmIChzPT1lbmQpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFpbGluZyBcXCBpbiBzdHJpbmciKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoKnMrKykgeworICAgICAgICAvKiBYWFggVGhpcyBhc3N1bWVzIEFTQ0lJISAqLworICAgICAgICBjYXNlICdcbic6IGJyZWFrOworICAgICAgICBjYXNlICdcXCc6ICpwKysgPSAnXFwnOyBicmVhazsKKyAgICAgICAgY2FzZSAnXCcnOiAqcCsrID0gJ1wnJzsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wiJzogKnArKyA9ICdcIic7IGJyZWFrOworICAgICAgICBjYXNlICdiJzogKnArKyA9ICdcYic7IGJyZWFrOworICAgICAgICBjYXNlICdmJzogKnArKyA9ICdcMDE0JzsgYnJlYWs7IC8qIEZGICovCisgICAgICAgIGNhc2UgJ3QnOiAqcCsrID0gJ1x0JzsgYnJlYWs7CisgICAgICAgIGNhc2UgJ24nOiAqcCsrID0gJ1xuJzsgYnJlYWs7CisgICAgICAgIGNhc2UgJ3InOiAqcCsrID0gJ1xyJzsgYnJlYWs7CisgICAgICAgIGNhc2UgJ3YnOiAqcCsrID0gJ1wwMTMnOyBicmVhazsgLyogVlQgKi8KKyAgICAgICAgY2FzZSAnYSc6ICpwKysgPSAnXDAwNyc7IGJyZWFrOyAvKiBCRUwsIG5vdCBjbGFzc2ljIEMgKi8KKyAgICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6CisgICAgICAgIGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgorICAgICAgICAgICAgYyA9IHNbLTFdIC0gJzAnOworICAgICAgICAgICAgaWYgKHMgPCBlbmQgJiYgJzAnIDw9ICpzICYmICpzIDw9ICc3JykgeworICAgICAgICAgICAgICAgIGMgPSAoYzw8MykgKyAqcysrIC0gJzAnOworICAgICAgICAgICAgICAgIGlmIChzIDwgZW5kICYmICcwJyA8PSAqcyAmJiAqcyA8PSAnNycpCisgICAgICAgICAgICAgICAgICAgIGMgPSAoYzw8MykgKyAqcysrIC0gJzAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnArKyA9IGM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICBpZiAocysxIDwgZW5kICYmCisgICAgICAgICAgICAgICAgaXN4ZGlnaXQoUHlfQ0hBUk1BU0soc1swXSkpICYmCisgICAgICAgICAgICAgICAgaXN4ZGlnaXQoUHlfQ0hBUk1BU0soc1sxXSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB4ID0gMDsKKyAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKnMpOworICAgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgICAgICBpZiAoaXNkaWdpdChjKSkKKyAgICAgICAgICAgICAgICAgICAgeCA9IGMgLSAnMCc7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNsb3dlcihjKSkKKyAgICAgICAgICAgICAgICAgICAgeCA9IDEwICsgYyAtICdhJzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHggPSAxMCArIGMgLSAnQSc7CisgICAgICAgICAgICAgICAgeCA9IHggPDwgNDsKKyAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKnMpOworICAgICAgICAgICAgICAgIHMrKzsKKyAgICAgICAgICAgICAgICBpZiAoaXNkaWdpdChjKSkKKyAgICAgICAgICAgICAgICAgICAgeCArPSBjIC0gJzAnOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzbG93ZXIoYykpCisgICAgICAgICAgICAgICAgICAgIHggKz0gMTAgKyBjIC0gJ2EnOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeCArPSAxMCArIGMgLSAnQSc7CisgICAgICAgICAgICAgICAgKnArKyA9IHg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWVycm9ycyB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBcXHggZXNjYXBlIik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgKnArKyA9ICc/JzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGVycm9ycywgImlnbm9yZSIpID09IDApCisgICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLzsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVjb2RpbmcgZXJyb3I7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gZXJyb3IgaGFuZGxpbmcgY29kZTogJS40MDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KICNpZm5kZWYgUHlfVVNJTkdfVU5JQ09ERQotCQljYXNlICd1JzoKLQkJY2FzZSAnVSc6Ci0JCWNhc2UgJ04nOgotCQkJaWYgKHVuaWNvZGUpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJICAiVW5pY29kZSBlc2NhcGVzIG5vdCBsZWdhbCAiCi0JCQkJCSAgIndoZW4gVW5pY29kZSBkaXNhYmxlZCIpOwotCQkJCWdvdG8gZmFpbGVkOwotCQkJfQorICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgY2FzZSAnVSc6CisgICAgICAgIGNhc2UgJ04nOgorICAgICAgICAgICAgaWYgKHVuaWNvZGUpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaWNvZGUgZXNjYXBlcyBub3QgbGVnYWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hlbiBVbmljb2RlIGRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJZGVmYXVsdDoKLQkJCSpwKysgPSAnXFwnOwotCQkJcy0tOwotCQkJZ290byBub25fZXNjOyAvKiBhbiBhcmJpdHJ5IG51bWJlciBvZiB1bmVzY2FwZWQKLQkJCQkJIFVURi04IGJ5dGVzIG1heSBmb2xsb3cuICovCi0JCX0KLQl9Ci0JaWYgKHAtYnVmIDwgbmV3bGVuICYmIF9QeVN0cmluZ19SZXNpemUoJnYsIHAgLSBidWYpKQotCQlnb3RvIGZhaWxlZDsKLQlyZXR1cm4gdjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICpwKysgPSAnXFwnOworICAgICAgICAgICAgcy0tOworICAgICAgICAgICAgZ290byBub25fZXNjOyAvKiBhbiBhcmJpdHJ5IG51bWJlciBvZiB1bmVzY2FwZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGLTggYnl0ZXMgbWF5IGZvbGxvdy4gKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocC1idWYgPCBuZXdsZW4gJiYgX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgcCAtIGJ1ZikpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIHJldHVybiB2OwogICBmYWlsZWQ6Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTc2Miw3NSArNzYyLDc1IEBACiBzdGF0aWMgUHlfc3NpemVfdAogc3RyaW5nX2dldHNpemUocmVnaXN0ZXIgUHlPYmplY3QgKm9wKQogewotICAgIAljaGFyICpzOwotICAgIAlQeV9zc2l6ZV90IGxlbjsKLQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKG9wLCAmcywgJmxlbikpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gbGVuOworICAgIGNoYXIgKnM7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShvcCwgJnMsICZsZW4pKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIC8qY29uc3QqLyBjaGFyICoKIHN0cmluZ19nZXRidWZmZXIocmVnaXN0ZXIgUHlPYmplY3QgKm9wKQogewotICAgIAljaGFyICpzOwotICAgIAlQeV9zc2l6ZV90IGxlbjsKLQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKG9wLCAmcywgJmxlbikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBzOworICAgIGNoYXIgKnM7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShvcCwgJnMsICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gczsKIH0KIAogUHlfc3NpemVfdAogUHlTdHJpbmdfU2l6ZShyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayhvcCkpCi0JCXJldHVybiBzdHJpbmdfZ2V0c2l6ZShvcCk7Ci0JcmV0dXJuIFB5X1NJWkUob3ApOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gc3RyaW5nX2dldHNpemUob3ApOworICAgIHJldHVybiBQeV9TSVpFKG9wKTsKIH0KIAogLypjb25zdCovIGNoYXIgKgogUHlTdHJpbmdfQXNTdHJpbmcocmVnaXN0ZXIgUHlPYmplY3QgKm9wKQogewotCWlmICghUHlTdHJpbmdfQ2hlY2sob3ApKQotCQlyZXR1cm4gc3RyaW5nX2dldGJ1ZmZlcihvcCk7Ci0JcmV0dXJuICgoUHlTdHJpbmdPYmplY3QgKilvcCkgLT4gb2Jfc3ZhbDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIHN0cmluZ19nZXRidWZmZXIob3ApOworICAgIHJldHVybiAoKFB5U3RyaW5nT2JqZWN0ICopb3ApIC0+IG9iX3N2YWw7CiB9CiAKIGludAogUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHJlZ2lzdGVyIFB5T2JqZWN0ICpvYmosCi0JCQkgcmVnaXN0ZXIgY2hhciAqKnMsCi0JCQkgcmVnaXN0ZXIgUHlfc3NpemVfdCAqbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNoYXIgKipzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgKmxlbikKIHsKLQlpZiAocyA9PSBOVUxMKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKG9iaikpIHsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG9iaikpIHsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkgewotCQkJb2JqID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKG9iaiwgTlVMTCk7Ci0JCQlpZiAob2JqID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UKKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKSB7CisgICAgICAgICAgICBvYmogPSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcob2JqLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQogI2VuZGlmCi0JCXsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiZXhwZWN0ZWQgc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0LCAiCi0JCQkJICAgICAiJS4yMDBzIGZvdW5kIiwgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyBmb3VuZCIsIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQkqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhvYmopOwotCWlmIChsZW4gIT0gTlVMTCkKLQkJKmxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKG9iaik7Ci0JZWxzZSBpZiAoc3RybGVuKCpzKSAhPSAoc2l6ZV90KVB5U3RyaW5nX0dFVF9TSVpFKG9iaikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZXhwZWN0ZWQgc3RyaW5nIHdpdGhvdXQgbnVsbCBieXRlcyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKG9iaik7CisgICAgaWYgKGxlbiAhPSBOVUxMKQorICAgICAgICAqbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUob2JqKTsKKyAgICBlbHNlIGlmIChzdHJsZW4oKnMpICE9IChzaXplX3QpUHlTdHJpbmdfR0VUX1NJWkUob2JqKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyB3aXRob3V0IG51bGwgYnl0ZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTg1Miw1NjggKzg1Miw1NjggQEAKIHN0YXRpYyBpbnQKIHN0cmluZ19wcmludChQeVN0cmluZ09iamVjdCAqb3AsIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiB7Ci0JUHlfc3NpemVfdCBpLCBzdHJfbGVuOwotCWNoYXIgYzsKLQlpbnQgcXVvdGU7CisgICAgUHlfc3NpemVfdCBpLCBzdHJfbGVuOworICAgIGNoYXIgYzsKKyAgICBpbnQgcXVvdGU7CiAKLQkvKiBYWFggT3VnaHQgdG8gY2hlY2sgZm9yIGludGVycnVwdHMgd2hlbiB3cml0aW5nIGxvbmcgc3RyaW5ncyAqLwotCWlmICghIFB5U3RyaW5nX0NoZWNrRXhhY3Qob3ApKSB7Ci0JCWludCByZXQ7Ci0JCS8qIEEgc3RyIHN1YmNsYXNzIG1heSBoYXZlIGl0cyBvd24gX19zdHJfXyBtZXRob2QuICovCi0JCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5T2JqZWN0X1N0cigoUHlPYmplY3QgKilvcCk7Ci0JCWlmIChvcCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlyZXQgPSBzdHJpbmdfcHJpbnQob3AsIGZwLCBmbGFncyk7Ci0JCVB5X0RFQ1JFRihvcCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWlmIChmbGFncyAmIFB5X1BSSU5UX1JBVykgewotCQljaGFyICpkYXRhID0gb3AtPm9iX3N2YWw7Ci0JCVB5X3NzaXplX3Qgc2l6ZSA9IFB5X1NJWkUob3ApOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXdoaWxlIChzaXplID4gSU5UX01BWCkgewotCQkJLyogVmVyeSBsb25nIHN0cmluZ3MgY2Fubm90IGJlIHdyaXR0ZW4gYXRvbWljYWxseS4KLQkJCSAqIEJ1dCBkb24ndCB3cml0ZSBleGFjdGx5IElOVF9NQVggYnl0ZXMgYXQgYSB0aW1lCi0JCQkgKiB0byBhdm9pZCBtZW1vcnkgYWxpZ21lbnQgaXNzdWVzLgotCQkJICovCi0JCQljb25zdCBpbnQgY2h1bmtfc2l6ZSA9IElOVF9NQVggJiB+MHgzRkZGOwotCQkJZndyaXRlKGRhdGEsIDEsIGNodW5rX3NpemUsIGZwKTsKLQkJCWRhdGEgKz0gY2h1bmtfc2l6ZTsKLQkJCXNpemUgLT0gY2h1bmtfc2l6ZTsKLQkJfQorICAgIC8qIFhYWCBPdWdodCB0byBjaGVjayBmb3IgaW50ZXJydXB0cyB3aGVuIHdyaXRpbmcgbG9uZyBzdHJpbmdzICovCisgICAgaWYgKCEgUHlTdHJpbmdfQ2hlY2tFeGFjdChvcCkpIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgLyogQSBzdHIgc3ViY2xhc3MgbWF5IGhhdmUgaXRzIG93biBfX3N0cl9fIG1ldGhvZC4gKi8KKyAgICAgICAgb3AgPSAoUHlTdHJpbmdPYmplY3QgKikgUHlPYmplY3RfU3RyKChQeU9iamVjdCAqKW9wKTsKKyAgICAgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldCA9IHN0cmluZ19wcmludChvcCwgZnAsIGZsYWdzKTsKKyAgICAgICAgUHlfREVDUkVGKG9wKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgUHlfUFJJTlRfUkFXKSB7CisgICAgICAgIGNoYXIgKmRhdGEgPSBvcC0+b2Jfc3ZhbDsKKyAgICAgICAgUHlfc3NpemVfdCBzaXplID0gUHlfU0laRShvcCk7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgd2hpbGUgKHNpemUgPiBJTlRfTUFYKSB7CisgICAgICAgICAgICAvKiBWZXJ5IGxvbmcgc3RyaW5ncyBjYW5ub3QgYmUgd3JpdHRlbiBhdG9taWNhbGx5LgorICAgICAgICAgICAgICogQnV0IGRvbid0IHdyaXRlIGV4YWN0bHkgSU5UX01BWCBieXRlcyBhdCBhIHRpbWUKKyAgICAgICAgICAgICAqIHRvIGF2b2lkIG1lbW9yeSBhbGlnbWVudCBpc3N1ZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvbnN0IGludCBjaHVua19zaXplID0gSU5UX01BWCAmIH4weDNGRkY7CisgICAgICAgICAgICBmd3JpdGUoZGF0YSwgMSwgY2h1bmtfc2l6ZSwgZnApOworICAgICAgICAgICAgZGF0YSArPSBjaHVua19zaXplOworICAgICAgICAgICAgc2l6ZSAtPSBjaHVua19zaXplOworICAgICAgICB9CiAjaWZkZWYgX19WTVMKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSkgZndyaXRlKGRhdGEsIChpbnQpc2l6ZSwgMSwgZnApOworICAgICAgICBpZiAoc2l6ZSkgZndyaXRlKGRhdGEsIChpbnQpc2l6ZSwgMSwgZnApOwogI2Vsc2UKLSAgICAgICAgICAgICAgICBmd3JpdGUoZGF0YSwgMSwgKGludClzaXplLCBmcCk7CisgICAgICAgIGZ3cml0ZShkYXRhLCAxLCAoaW50KXNpemUsIGZwKTsKICNlbmRpZgotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIGZpZ3VyZSBvdXQgd2hpY2ggcXVvdGUgdG8gdXNlOyBzaW5nbGUgaXMgcHJlZmVycmVkICovCi0JcXVvdGUgPSAnXCcnOwotCWlmIChtZW1jaHIob3AtPm9iX3N2YWwsICdcJycsIFB5X1NJWkUob3ApKSAmJgotCSAgICAhbWVtY2hyKG9wLT5vYl9zdmFsLCAnIicsIFB5X1NJWkUob3ApKSkKLQkJcXVvdGUgPSAnIic7CisgICAgLyogZmlndXJlIG91dCB3aGljaCBxdW90ZSB0byB1c2U7IHNpbmdsZSBpcyBwcmVmZXJyZWQgKi8KKyAgICBxdW90ZSA9ICdcJyc7CisgICAgaWYgKG1lbWNocihvcC0+b2Jfc3ZhbCwgJ1wnJywgUHlfU0laRShvcCkpICYmCisgICAgICAgICFtZW1jaHIob3AtPm9iX3N2YWwsICciJywgUHlfU0laRShvcCkpKQorICAgICAgICBxdW90ZSA9ICciJzsKIAotCXN0cl9sZW4gPSBQeV9TSVpFKG9wKTsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnB1dGMocXVvdGUsIGZwKTsKLQlmb3IgKGkgPSAwOyBpIDwgc3RyX2xlbjsgaSsrKSB7Ci0JCS8qIFNpbmNlIHN0cmluZ3MgYXJlIGltbXV0YWJsZSBhbmQgdGhlIGNhbGxlciBzaG91bGQgaGF2ZSBhCi0JCXJlZmVyZW5jZSwgYWNjZXNzaW5nIHRoZSBpbnRlcmFsIGJ1ZmZlciBzaG91bGQgbm90IGJlIGFuIGlzc3VlCi0JCXdpdGggdGhlIEdJTCByZWxlYXNlZC4gKi8KLQkJYyA9IG9wLT5vYl9zdmFsW2ldOwotCQlpZiAoYyA9PSBxdW90ZSB8fCBjID09ICdcXCcpCi0JCQlmcHJpbnRmKGZwLCAiXFwlYyIsIGMpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1x0JykKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICJcXHQiKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdcbicpCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXFxuIik7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXHInKQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlxcciIpOwotCQllbHNlIGlmIChjIDwgJyAnIHx8IGMgPj0gMHg3ZikKLQkJCWZwcmludGYoZnAsICJcXHglMDJ4IiwgYyAmIDB4ZmYpOwotCQllbHNlCi0JCQlmcHV0YyhjLCBmcCk7Ci0JfQotCWZwdXRjKHF1b3RlLCBmcCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXR1cm4gMDsKKyAgICBzdHJfbGVuID0gUHlfU0laRShvcCk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwdXRjKHF1b3RlLCBmcCk7CisgICAgZm9yIChpID0gMDsgaSA8IHN0cl9sZW47IGkrKykgeworICAgICAgICAvKiBTaW5jZSBzdHJpbmdzIGFyZSBpbW11dGFibGUgYW5kIHRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgYQorICAgICAgICByZWZlcmVuY2UsIGFjY2Vzc2luZyB0aGUgaW50ZXJhbCBidWZmZXIgc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZQorICAgICAgICB3aXRoIHRoZSBHSUwgcmVsZWFzZWQuICovCisgICAgICAgIGMgPSBvcC0+b2Jfc3ZhbFtpXTsKKyAgICAgICAgaWYgKGMgPT0gcXVvdGUgfHwgYyA9PSAnXFwnKQorICAgICAgICAgICAgZnByaW50ZihmcCwgIlxcJWMiLCBjKTsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXHQnKQorICAgICAgICAgICAgZnByaW50ZihmcCwgIlxcdCIpOworICAgICAgICBlbHNlIGlmIChjID09ICdcbicpCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXFxuIik7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xyJykKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcXHIiKTsKKyAgICAgICAgZWxzZSBpZiAoYyA8ICcgJyB8fCBjID49IDB4N2YpCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXFx4JTAyeCIsIGMgJiAweGZmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnB1dGMoYywgZnApOworICAgIH0KKyAgICBmcHV0YyhxdW90ZSwgZnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0dXJuIDA7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U3RyaW5nX1JlcHIoUHlPYmplY3QgKm9iaiwgaW50IHNtYXJ0cXVvdGVzKQogewotCXJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0KiBvcCA9IChQeVN0cmluZ09iamVjdCopIG9iajsKLQlzaXplX3QgbmV3c2l6ZSA9IDIgKyA0ICogUHlfU0laRShvcCk7Ci0JUHlPYmplY3QgKnY7Ci0JaWYgKG5ld3NpemUgPiBQWV9TU0laRV9UX01BWCB8fCBuZXdzaXplIC8gNCAhPSBQeV9TSVpFKG9wKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJzdHJpbmcgaXMgdG9vIGxhcmdlIHRvIG1ha2UgcmVwciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuZXdzaXplKTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCQlyZWdpc3RlciBjaGFyIGM7Ci0JCXJlZ2lzdGVyIGNoYXIgKnA7Ci0JCWludCBxdW90ZTsKKyAgICByZWdpc3RlciBQeVN0cmluZ09iamVjdCogb3AgPSAoUHlTdHJpbmdPYmplY3QqKSBvYmo7CisgICAgc2l6ZV90IG5ld3NpemUgPSAyICsgNCAqIFB5X1NJWkUob3ApOworICAgIFB5T2JqZWN0ICp2OworICAgIGlmIChuZXdzaXplID4gUFlfU1NJWkVfVF9NQVggfHwgbmV3c2l6ZSAvIDQgIT0gUHlfU0laRShvcCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAic3RyaW5nIGlzIHRvbyBsYXJnZSB0byBtYWtlIHJlcHIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG5ld3NpemUpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZWdpc3RlciBQeV9zc2l6ZV90IGk7CisgICAgICAgIHJlZ2lzdGVyIGNoYXIgYzsKKyAgICAgICAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgICAgICAgaW50IHF1b3RlOwogCi0JCS8qIGZpZ3VyZSBvdXQgd2hpY2ggcXVvdGUgdG8gdXNlOyBzaW5nbGUgaXMgcHJlZmVycmVkICovCi0JCXF1b3RlID0gJ1wnJzsKLQkJaWYgKHNtYXJ0cXVvdGVzICYmCi0JCSAgICBtZW1jaHIob3AtPm9iX3N2YWwsICdcJycsIFB5X1NJWkUob3ApKSAmJgotCQkgICAgIW1lbWNocihvcC0+b2Jfc3ZhbCwgJyInLCBQeV9TSVpFKG9wKSkpCi0JCQlxdW90ZSA9ICciJzsKKyAgICAgICAgLyogZmlndXJlIG91dCB3aGljaCBxdW90ZSB0byB1c2U7IHNpbmdsZSBpcyBwcmVmZXJyZWQgKi8KKyAgICAgICAgcXVvdGUgPSAnXCcnOworICAgICAgICBpZiAoc21hcnRxdW90ZXMgJiYKKyAgICAgICAgICAgIG1lbWNocihvcC0+b2Jfc3ZhbCwgJ1wnJywgUHlfU0laRShvcCkpICYmCisgICAgICAgICAgICAhbWVtY2hyKG9wLT5vYl9zdmFsLCAnIicsIFB5X1NJWkUob3ApKSkKKyAgICAgICAgICAgIHF1b3RlID0gJyInOwogCi0JCXAgPSBQeVN0cmluZ19BU19TVFJJTkcodik7Ci0JCSpwKysgPSBxdW90ZTsKLQkJZm9yIChpID0gMDsgaSA8IFB5X1NJWkUob3ApOyBpKyspIHsKLQkJCS8qIFRoZXJlJ3MgYXQgbGVhc3QgZW5vdWdoIHJvb20gZm9yIGEgaGV4IGVzY2FwZQotCQkJICAgYW5kIGEgY2xvc2luZyBxdW90ZS4gKi8KLQkJCWFzc2VydChuZXdzaXplIC0gKHAgLSBQeVN0cmluZ19BU19TVFJJTkcodikpID49IDUpOwotCQkJYyA9IG9wLT5vYl9zdmFsW2ldOwotCQkJaWYgKGMgPT0gcXVvdGUgfHwgYyA9PSAnXFwnKQotCQkJCSpwKysgPSAnXFwnLCAqcCsrID0gYzsKLQkJCWVsc2UgaWYgKGMgPT0gJ1x0JykKLQkJCQkqcCsrID0gJ1xcJywgKnArKyA9ICd0JzsKLQkJCWVsc2UgaWYgKGMgPT0gJ1xuJykKLQkJCQkqcCsrID0gJ1xcJywgKnArKyA9ICduJzsKLQkJCWVsc2UgaWYgKGMgPT0gJ1xyJykKLQkJCQkqcCsrID0gJ1xcJywgKnArKyA9ICdyJzsKLQkJCWVsc2UgaWYgKGMgPCAnICcgfHwgYyA+PSAweDdmKSB7Ci0JCQkJLyogRm9yIHBlcmZvcm1hbmNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwKLQkJCQkgICBQeU9TX3NucHJpbnRmIGhlcmUgKGV4dHJhIGxheWVycyBvZgotCQkJCSAgIGZ1bmN0aW9uIGNhbGwpLiAqLwotCQkJCXNwcmludGYocCwgIlxceCUwMngiLCBjICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gNDsKLQkJCX0KLQkJCWVsc2UKLQkJCQkqcCsrID0gYzsKLQkJfQotCQlhc3NlcnQobmV3c2l6ZSAtIChwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpKSA+PSAxKTsKLQkJKnArKyA9IHF1b3RlOwotCQkqcCA9ICdcMCc7Ci0JCWlmIChfUHlTdHJpbmdfUmVzaXplKCZ2LCAocCAtIFB5U3RyaW5nX0FTX1NUUklORyh2KSkpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiB2OwotCX0KKyAgICAgICAgcCA9IFB5U3RyaW5nX0FTX1NUUklORyh2KTsKKyAgICAgICAgKnArKyA9IHF1b3RlOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShvcCk7IGkrKykgeworICAgICAgICAgICAgLyogVGhlcmUncyBhdCBsZWFzdCBlbm91Z2ggcm9vbSBmb3IgYSBoZXggZXNjYXBlCisgICAgICAgICAgICAgICBhbmQgYSBjbG9zaW5nIHF1b3RlLiAqLworICAgICAgICAgICAgYXNzZXJ0KG5ld3NpemUgLSAocCAtIFB5U3RyaW5nX0FTX1NUUklORyh2KSkgPj0gNSk7CisgICAgICAgICAgICBjID0gb3AtPm9iX3N2YWxbaV07CisgICAgICAgICAgICBpZiAoYyA9PSBxdW90ZSB8fCBjID09ICdcXCcpCisgICAgICAgICAgICAgICAgKnArKyA9ICdcXCcsICpwKysgPSBjOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXHQnKQorICAgICAgICAgICAgICAgICpwKysgPSAnXFwnLCAqcCsrID0gJ3QnOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICpwKysgPSAnXFwnLCAqcCsrID0gJ24nOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXHInKQorICAgICAgICAgICAgICAgICpwKysgPSAnXFwnLCAqcCsrID0gJ3InOworICAgICAgICAgICAgZWxzZSBpZiAoYyA8ICcgJyB8fCBjID49IDB4N2YpIHsKKyAgICAgICAgICAgICAgICAvKiBGb3IgcGVyZm9ybWFuY2UsIHdlIGRvbid0IHdhbnQgdG8gY2FsbAorICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYgaGVyZSAoZXh0cmEgbGF5ZXJzIG9mCisgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbCkuICovCisgICAgICAgICAgICAgICAgc3ByaW50ZihwLCAiXFx4JTAyeCIsIGMgJiAweGZmKTsKKyAgICAgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKnArKyA9IGM7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KG5ld3NpemUgLSAocCAtIFB5U3RyaW5nX0FTX1NUUklORyh2KSkgPj0gMSk7CisgICAgICAgICpwKysgPSBxdW90ZTsKKyAgICAgICAgKnAgPSAnXDAnOworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgKHAgLSBQeVN0cmluZ19BU19TVFJJTkcodikpKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcmVwcihQeU9iamVjdCAqb3ApCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX1JlcHIob3AsIDEpOworICAgIHJldHVybiBQeVN0cmluZ19SZXByKG9wLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19zdHIoUHlPYmplY3QgKnMpCiB7Ci0JYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHMpKTsKLQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChzKSkgewotCQlQeV9JTkNSRUYocyk7Ci0JCXJldHVybiBzOwotCX0KLQllbHNlIHsKLQkJLyogU3VidHlwZSAtLSByZXR1cm4gZ2VudWluZSBzdHJpbmcgd2l0aCB0aGUgc2FtZSB2YWx1ZS4gKi8KLQkJUHlTdHJpbmdPYmplY3QgKnQgPSAoUHlTdHJpbmdPYmplY3QgKikgczsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHQtPm9iX3N2YWwsIFB5X1NJWkUodCkpOwotCX0KKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2socykpOworICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHMpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBTdWJ0eXBlIC0tIHJldHVybiBnZW51aW5lIHN0cmluZyB3aXRoIHRoZSBzYW1lIHZhbHVlLiAqLworICAgICAgICBQeVN0cmluZ09iamVjdCAqdCA9IChQeVN0cmluZ09iamVjdCAqKSBzOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodC0+b2Jfc3ZhbCwgUHlfU0laRSh0KSk7CisgICAgfQogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogc3RyaW5nX2xlbmd0aChQeVN0cmluZ09iamVjdCAqYSkKIHsKLQlyZXR1cm4gUHlfU0laRShhKTsKKyAgICByZXR1cm4gUHlfU0laRShhKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19jb25jYXQocmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKmEsIHJlZ2lzdGVyIFB5T2JqZWN0ICpiYikKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IHNpemU7Ci0JcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKm9wOwotCWlmICghUHlTdHJpbmdfQ2hlY2soYmIpKSB7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBzaXplOworICAgIHJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpvcDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGJiKSkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhiYikpCi0JCSAgICByZXR1cm4gUHlVbmljb2RlX0NvbmNhdCgoUHlPYmplY3QgKilhLCBiYik7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soYmIpKQorICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Db25jYXQoKFB5T2JqZWN0ICopYSwgYmIpOwogI2VuZGlmCi0JCWlmIChQeUJ5dGVBcnJheV9DaGVjayhiYikpCi0JCSAgICByZXR1cm4gUHlCeXRlQXJyYXlfQ29uY2F0KChQeU9iamVjdCAqKWEsIGJiKTsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbm5vdCBjb25jYXRlbmF0ZSAnc3RyJyBhbmQgJyUuMjAwcycgb2JqZWN0cyIsCi0JCQkgICAgIFB5X1RZUEUoYmIpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBpZiAoUHlCeXRlQXJyYXlfQ2hlY2soYmIpKQorICAgICAgICAgICAgcmV0dXJuIFB5Qnl0ZUFycmF5X0NvbmNhdCgoUHlPYmplY3QgKilhLCBiYik7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbmNhdGVuYXRlICdzdHInIGFuZCAnJS4yMDBzJyBvYmplY3RzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoYmIpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2RlZmluZSBiICgoUHlTdHJpbmdPYmplY3QgKiliYikKLQkvKiBPcHRpbWl6ZSBjYXNlcyB3aXRoIGVtcHR5IGxlZnQgb3IgcmlnaHQgb3BlcmFuZCAqLwotCWlmICgoUHlfU0laRShhKSA9PSAwIHx8IFB5X1NJWkUoYikgPT0gMCkgJiYKLQkgICAgUHlTdHJpbmdfQ2hlY2tFeGFjdChhKSAmJiBQeVN0cmluZ19DaGVja0V4YWN0KGIpKSB7Ci0JCWlmIChQeV9TSVpFKGEpID09IDApIHsKLQkJCVB5X0lOQ1JFRihiYik7Ci0JCQlyZXR1cm4gYmI7Ci0JCX0KLQkJUHlfSU5DUkVGKGEpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopYTsKLQl9Ci0Jc2l6ZSA9IFB5X1NJWkUoYSkgKyBQeV9TSVpFKGIpOwotCS8qIENoZWNrIHRoYXQgc3RyaW5nIHNpemVzIGFyZSBub3QgbmVnYXRpdmUsIHRvIHByZXZlbnQgYW4KLQkgICBvdmVyZmxvdyBpbiBjYXNlcyB3aGVyZSB3ZSBhcmUgcGFzc2VkIGluY29ycmVjdGx5LWNyZWF0ZWQKLQkgICBzdHJpbmdzIHdpdGggbmVnYXRpdmUgbGVuZ3RocyAoZHVlIHRvIGEgYnVnIGluIG90aGVyIGNvZGUpLgotICAgICAgICAqLwotCWlmIChQeV9TSVpFKGEpIDwgMCB8fCBQeV9TSVpFKGIpIDwgMCB8fAotCSAgICBQeV9TSVpFKGEpID4gUFlfU1NJWkVfVF9NQVggLSBQeV9TSVpFKGIpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJzdHJpbmdzIGFyZSB0b28gbGFyZ2UgdG8gY29uY2F0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBPcHRpbWl6ZSBjYXNlcyB3aXRoIGVtcHR5IGxlZnQgb3IgcmlnaHQgb3BlcmFuZCAqLworICAgIGlmICgoUHlfU0laRShhKSA9PSAwIHx8IFB5X1NJWkUoYikgPT0gMCkgJiYKKyAgICAgICAgUHlTdHJpbmdfQ2hlY2tFeGFjdChhKSAmJiBQeVN0cmluZ19DaGVja0V4YWN0KGIpKSB7CisgICAgICAgIGlmIChQeV9TSVpFKGEpID09IDApIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihiYik7CisgICAgICAgICAgICByZXR1cm4gYmI7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKGEpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopYTsKKyAgICB9CisgICAgc2l6ZSA9IFB5X1NJWkUoYSkgKyBQeV9TSVpFKGIpOworICAgIC8qIENoZWNrIHRoYXQgc3RyaW5nIHNpemVzIGFyZSBub3QgbmVnYXRpdmUsIHRvIHByZXZlbnQgYW4KKyAgICAgICBvdmVyZmxvdyBpbiBjYXNlcyB3aGVyZSB3ZSBhcmUgcGFzc2VkIGluY29ycmVjdGx5LWNyZWF0ZWQKKyAgICAgICBzdHJpbmdzIHdpdGggbmVnYXRpdmUgbGVuZ3RocyAoZHVlIHRvIGEgYnVnIGluIG90aGVyIGNvZGUpLgorICAgICovCisgICAgaWYgKFB5X1NJWkUoYSkgPCAwIHx8IFB5X1NJWkUoYikgPCAwIHx8CisgICAgICAgIFB5X1NJWkUoYSkgPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoYikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5ncyBhcmUgdG9vIGxhcmdlIHRvIGNvbmNhdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBJbmxpbmUgUHlPYmplY3RfTmV3VmFyICovCi0JaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIFB5U3RyaW5nT2JqZWN0X1NJWkUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInN0cmluZ3MgYXJlIHRvbyBsYXJnZSB0byBjb25jYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKFB5U3RyaW5nT2JqZWN0X1NJWkUgKyBzaXplKTsKLQlpZiAob3AgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JUHlPYmplY3RfSU5JVF9WQVIob3AsICZQeVN0cmluZ19UeXBlLCBzaXplKTsKLQlvcC0+b2Jfc2hhc2ggPSAtMTsKLQlvcC0+b2Jfc3N0YXRlID0gU1NUQVRFX05PVF9JTlRFUk5FRDsKLQlQeV9NRU1DUFkob3AtPm9iX3N2YWwsIGEtPm9iX3N2YWwsIFB5X1NJWkUoYSkpOwotCVB5X01FTUNQWShvcC0+b2Jfc3ZhbCArIFB5X1NJWkUoYSksIGItPm9iX3N2YWwsIFB5X1NJWkUoYikpOwotCW9wLT5vYl9zdmFsW3NpemVdID0gJ1wwJzsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIC8qIElubGluZSBQeU9iamVjdF9OZXdWYXIgKi8KKyAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gUHlTdHJpbmdPYmplY3RfU0laRSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdzIGFyZSB0b28gbGFyZ2UgdG8gY29uY2F0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvcCA9IChQeVN0cmluZ09iamVjdCAqKVB5T2JqZWN0X01BTExPQyhQeVN0cmluZ09iamVjdF9TSVpFICsgc2l6ZSk7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFB5T2JqZWN0X0lOSVRfVkFSKG9wLCAmUHlTdHJpbmdfVHlwZSwgc2l6ZSk7CisgICAgb3AtPm9iX3NoYXNoID0gLTE7CisgICAgb3AtPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7CisgICAgUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBhLT5vYl9zdmFsLCBQeV9TSVpFKGEpKTsKKyAgICBQeV9NRU1DUFkob3AtPm9iX3N2YWwgKyBQeV9TSVpFKGEpLCBiLT5vYl9zdmFsLCBQeV9TSVpFKGIpKTsKKyAgICBvcC0+b2Jfc3ZhbFtzaXplXSA9ICdcMCc7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKICN1bmRlZiBiCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcmVwZWF0KHJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICphLCByZWdpc3RlciBQeV9zc2l6ZV90IG4pCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgajsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IHNpemU7Ci0JcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKm9wOwotCXNpemVfdCBuYnl0ZXM7Ci0JaWYgKG4gPCAwKQotCQluID0gMDsKLQkvKiB3YXRjaCBvdXQgZm9yIG92ZXJmbG93czogIHRoZSBzaXplIGNhbiBvdmVyZmxvdyBpbnQsCi0JICogYW5kIHRoZSAjIG9mIGJ5dGVzIG5lZWRlZCBjYW4gb3ZlcmZsb3cgc2l6ZV90Ci0JICovCi0Jc2l6ZSA9IFB5X1NJWkUoYSkgKiBuOwotCWlmIChuICYmIHNpemUgLyBuICE9IFB5X1NJWkUoYSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkicmVwZWF0ZWQgc3RyaW5nIGlzIHRvbyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc2l6ZSA9PSBQeV9TSVpFKGEpICYmIFB5U3RyaW5nX0NoZWNrRXhhY3QoYSkpIHsKLQkJUHlfSU5DUkVGKGEpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopYTsKLQl9Ci0JbmJ5dGVzID0gKHNpemVfdClzaXplOwotCWlmIChuYnl0ZXMgKyBQeVN0cmluZ09iamVjdF9TSVpFIDw9IG5ieXRlcykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJyZXBlYXRlZCBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKFB5U3RyaW5nT2JqZWN0X1NJWkUgKyBuYnl0ZXMpOwotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlQeU9iamVjdF9JTklUX1ZBUihvcCwgJlB5U3RyaW5nX1R5cGUsIHNpemUpOwotCW9wLT5vYl9zaGFzaCA9IC0xOwotCW9wLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOwotCW9wLT5vYl9zdmFsW3NpemVdID0gJ1wwJzsKLQlpZiAoUHlfU0laRShhKSA9PSAxICYmIG4gPiAwKSB7Ci0JCW1lbXNldChvcC0+b2Jfc3ZhbCwgYS0+b2Jfc3ZhbFswXSAsIG4pOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOwotCX0KLQlpID0gMDsKLQlpZiAoaSA8IHNpemUpIHsKLQkJUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBhLT5vYl9zdmFsLCBQeV9TSVpFKGEpKTsKLQkJaSA9IFB5X1NJWkUoYSk7Ci0JfQotCXdoaWxlIChpIDwgc2l6ZSkgewotCQlqID0gKGkgPD0gc2l6ZS1pKSAgPyAgaSAgOiAgc2l6ZS1pOwotCQlQeV9NRU1DUFkob3AtPm9iX3N2YWwraSwgb3AtPm9iX3N2YWwsIGopOwotCQlpICs9IGo7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKikgb3A7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgajsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IHNpemU7CisgICAgcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKm9wOworICAgIHNpemVfdCBuYnl0ZXM7CisgICAgaWYgKG4gPCAwKQorICAgICAgICBuID0gMDsKKyAgICAvKiB3YXRjaCBvdXQgZm9yIG92ZXJmbG93czogIHRoZSBzaXplIGNhbiBvdmVyZmxvdyBpbnQsCisgICAgICogYW5kIHRoZSAjIG9mIGJ5dGVzIG5lZWRlZCBjYW4gb3ZlcmZsb3cgc2l6ZV90CisgICAgICovCisgICAgc2l6ZSA9IFB5X1NJWkUoYSkgKiBuOworICAgIGlmIChuICYmIHNpemUgLyBuICE9IFB5X1NJWkUoYSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAicmVwZWF0ZWQgc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSBQeV9TSVpFKGEpICYmIFB5U3RyaW5nX0NoZWNrRXhhY3QoYSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKGEpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopYTsKKyAgICB9CisgICAgbmJ5dGVzID0gKHNpemVfdClzaXplOworICAgIGlmIChuYnl0ZXMgKyBQeVN0cmluZ09iamVjdF9TSVpFIDw9IG5ieXRlcykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJyZXBlYXRlZCBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9wID0gKFB5U3RyaW5nT2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKFB5U3RyaW5nT2JqZWN0X1NJWkUgKyBuYnl0ZXMpOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeU9iamVjdF9JTklUX1ZBUihvcCwgJlB5U3RyaW5nX1R5cGUsIHNpemUpOworICAgIG9wLT5vYl9zaGFzaCA9IC0xOworICAgIG9wLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOworICAgIG9wLT5vYl9zdmFsW3NpemVdID0gJ1wwJzsKKyAgICBpZiAoUHlfU0laRShhKSA9PSAxICYmIG4gPiAwKSB7CisgICAgICAgIG1lbXNldChvcC0+b2Jfc3ZhbCwgYS0+b2Jfc3ZhbFswXSAsIG4pOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIH0KKyAgICBpID0gMDsKKyAgICBpZiAoaSA8IHNpemUpIHsKKyAgICAgICAgUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBhLT5vYl9zdmFsLCBQeV9TSVpFKGEpKTsKKyAgICAgICAgaSA9IFB5X1NJWkUoYSk7CisgICAgfQorICAgIHdoaWxlIChpIDwgc2l6ZSkgeworICAgICAgICBqID0gKGkgPD0gc2l6ZS1pKSAgPyAgaSAgOiAgc2l6ZS1pOworICAgICAgICBQeV9NRU1DUFkob3AtPm9iX3N2YWwraSwgb3AtPm9iX3N2YWwsIGopOworICAgICAgICBpICs9IGo7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIC8qIFN0cmluZyBzbGljZSBhW2k6al0gY29uc2lzdHMgb2YgY2hhcmFjdGVycyBhW2ldIC4uLiBhW2otMV0gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19zbGljZShyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqYSwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLAotCSAgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBqKQorICAgICAgICAgICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaikKICAgICAgLyogaiAtLSBtYXkgYmUgbmVnYXRpdmUhICovCiB7Ci0JaWYgKGkgPCAwKQotCQlpID0gMDsKLQlpZiAoaiA8IDApCi0JCWogPSAwOyAvKiBBdm9pZCBzaWduZWQvdW5zaWduZWQgYnVnIGluIG5leHQgbGluZSAqLwotCWlmIChqID4gUHlfU0laRShhKSkKLQkJaiA9IFB5X1NJWkUoYSk7Ci0JaWYgKGkgPT0gMCAmJiBqID09IFB5X1NJWkUoYSkgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChhKSkgewotCQkvKiBJdCdzIHRoZSBzYW1lIGFzIGEgKi8KLQkJUHlfSU5DUkVGKGEpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopYTsKLQl9Ci0JaWYgKGogPCBpKQotCQlqID0gaTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYS0+b2Jfc3ZhbCArIGksIGotaSk7CisgICAgaWYgKGkgPCAwKQorICAgICAgICBpID0gMDsKKyAgICBpZiAoaiA8IDApCisgICAgICAgIGogPSAwOyAvKiBBdm9pZCBzaWduZWQvdW5zaWduZWQgYnVnIGluIG5leHQgbGluZSAqLworICAgIGlmIChqID4gUHlfU0laRShhKSkKKyAgICAgICAgaiA9IFB5X1NJWkUoYSk7CisgICAgaWYgKGkgPT0gMCAmJiBqID09IFB5X1NJWkUoYSkgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChhKSkgeworICAgICAgICAvKiBJdCdzIHRoZSBzYW1lIGFzIGEgKi8KKyAgICAgICAgUHlfSU5DUkVGKGEpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopYTsKKyAgICB9CisgICAgaWYgKGogPCBpKQorICAgICAgICBqID0gaTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYS0+b2Jfc3ZhbCArIGksIGotaSk7CiB9CiAKIHN0YXRpYyBpbnQKIHN0cmluZ19jb250YWlucyhQeU9iamVjdCAqc3RyX29iaiwgUHlPYmplY3QgKnN1Yl9vYmopCiB7Ci0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KHN1Yl9vYmopKSB7CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KHN1Yl9vYmopKSB7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQlpZiAoUHlVbmljb2RlX0NoZWNrKHN1Yl9vYmopKQotCQkJcmV0dXJuIFB5VW5pY29kZV9Db250YWlucyhzdHJfb2JqLCBzdWJfb2JqKTsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJfb2JqKSkKKyAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfQ29udGFpbnMoc3RyX29iaiwgc3ViX29iaik7CiAjZW5kaWYKLQkJaWYgKCFQeVN0cmluZ19DaGVjayhzdWJfb2JqKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAiJ2luIDxzdHJpbmc+JyByZXF1aXJlcyBzdHJpbmcgYXMgbGVmdCBvcGVyYW5kLCAiCi0JCQkgICAgIm5vdCAlLjIwMHMiLCBQeV9UWVBFKHN1Yl9vYmopLT50cF9uYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhzdWJfb2JqKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiJ2luIDxzdHJpbmc+JyByZXF1aXJlcyBzdHJpbmcgYXMgbGVmdCBvcGVyYW5kLCAiCisgICAgICAgICAgICAgICAgIm5vdCAlLjIwMHMiLCBQeV9UWVBFKHN1Yl9vYmopLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBzdHJpbmdsaWJfY29udGFpbnNfb2JqKHN0cl9vYmosIHN1Yl9vYmopOworICAgIHJldHVybiBzdHJpbmdsaWJfY29udGFpbnNfb2JqKHN0cl9vYmosIHN1Yl9vYmopOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2l0ZW0oUHlTdHJpbmdPYmplY3QgKmEsIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSkKIHsKLQljaGFyIHBjaGFyOwotCVB5T2JqZWN0ICp2OwotCWlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJzdHJpbmcgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlwY2hhciA9IGEtPm9iX3N2YWxbaV07Ci0JdiA9IChQeU9iamVjdCAqKWNoYXJhY3RlcnNbcGNoYXIgJiBVQ0hBUl9NQVhdOwotCWlmICh2ID09IE5VTEwpCi0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgmcGNoYXIsIDEpOwotCWVsc2UgeworICAgIGNoYXIgcGNoYXI7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInN0cmluZyBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBjaGFyID0gYS0+b2Jfc3ZhbFtpXTsKKyAgICB2ID0gKFB5T2JqZWN0ICopY2hhcmFjdGVyc1twY2hhciAmIFVDSEFSX01BWF07CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCZwY2hhciwgMSk7CisgICAgZWxzZSB7CiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JCW9uZV9zdHJpbmdzKys7CisgICAgICAgIG9uZV9zdHJpbmdzKys7CiAjZW5kaWYKLQkJUHlfSU5DUkVGKHYpOwotCX0KLQlyZXR1cm4gdjsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgogc3RyaW5nX3JpY2hjb21wYXJlKFB5U3RyaW5nT2JqZWN0ICphLCBQeVN0cmluZ09iamVjdCAqYiwgaW50IG9wKQogewotCWludCBjOwotCVB5X3NzaXplX3QgbGVuX2EsIGxlbl9iOwotCVB5X3NzaXplX3QgbWluX2xlbjsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBjOworICAgIFB5X3NzaXplX3QgbGVuX2EsIGxlbl9iOworICAgIFB5X3NzaXplX3QgbWluX2xlbjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JLyogTWFrZSBzdXJlIGJvdGggYXJndW1lbnRzIGFyZSBzdHJpbmdzLiAqLwotCWlmICghKFB5U3RyaW5nX0NoZWNrKGEpICYmIFB5U3RyaW5nX0NoZWNrKGIpKSkgewotCQlyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChhID09IGIpIHsKLQkJc3dpdGNoIChvcCkgewotCQljYXNlIFB5X0VROmNhc2UgUHlfTEU6Y2FzZSBQeV9HRToKLQkJCXJlc3VsdCA9IFB5X1RydWU7Ci0JCQlnb3RvIG91dDsKLQkJY2FzZSBQeV9ORTpjYXNlIFB5X0xUOmNhc2UgUHlfR1Q6Ci0JCQlyZXN1bHQgPSBQeV9GYWxzZTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCWlmIChvcCA9PSBQeV9FUSkgewotCQkvKiBTdXBwb3J0aW5nIFB5X05FIGhlcmUgYXMgd2VsbCBkb2VzIG5vdCBzYXZlCi0JCSAgIG11Y2ggdGltZSwgc2luY2UgUHlfTkUgaXMgcmFyZWx5IHVzZWQuICAqLwotCQlpZiAoUHlfU0laRShhKSA9PSBQeV9TSVpFKGIpCi0JCSAgICAmJiAoYS0+b2Jfc3ZhbFswXSA9PSBiLT5vYl9zdmFsWzBdCi0JCQkmJiBtZW1jbXAoYS0+b2Jfc3ZhbCwgYi0+b2Jfc3ZhbCwgUHlfU0laRShhKSkgPT0gMCkpIHsKLQkJCXJlc3VsdCA9IFB5X1RydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBQeV9GYWxzZTsKLQkJfQotCQlnb3RvIG91dDsKLQl9Ci0JbGVuX2EgPSBQeV9TSVpFKGEpOyBsZW5fYiA9IFB5X1NJWkUoYik7Ci0JbWluX2xlbiA9IChsZW5fYSA8IGxlbl9iKSA/IGxlbl9hIDogbGVuX2I7Ci0JaWYgKG1pbl9sZW4gPiAwKSB7Ci0JCWMgPSBQeV9DSEFSTUFTSygqYS0+b2Jfc3ZhbCkgLSBQeV9DSEFSTUFTSygqYi0+b2Jfc3ZhbCk7Ci0JCWlmIChjPT0wKQotCQkJYyA9IG1lbWNtcChhLT5vYl9zdmFsLCBiLT5vYl9zdmFsLCBtaW5fbGVuKTsKLQl9IGVsc2UKLQkJYyA9IDA7Ci0JaWYgKGMgPT0gMCkKLQkJYyA9IChsZW5fYSA8IGxlbl9iKSA/IC0xIDogKGxlbl9hID4gbGVuX2IpID8gMSA6IDA7Ci0Jc3dpdGNoIChvcCkgewotCWNhc2UgUHlfTFQ6IGMgPSBjIDwgIDA7IGJyZWFrOwotCWNhc2UgUHlfTEU6IGMgPSBjIDw9IDA7IGJyZWFrOwotCWNhc2UgUHlfRVE6IGFzc2VydCgwKTsgIGJyZWFrOyAvKiB1bnJlYWNoYWJsZSAqLwotCWNhc2UgUHlfTkU6IGMgPSBjICE9IDA7IGJyZWFrOwotCWNhc2UgUHlfR1Q6IGMgPSBjID4gIDA7IGJyZWFrOwotCWNhc2UgUHlfR0U6IGMgPSBjID49IDA7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOwotCQlnb3RvIG91dDsKLQl9Ci0JcmVzdWx0ID0gYyA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICAvKiBNYWtlIHN1cmUgYm90aCBhcmd1bWVudHMgYXJlIHN0cmluZ3MuICovCisgICAgaWYgKCEoUHlTdHJpbmdfQ2hlY2soYSkgJiYgUHlTdHJpbmdfQ2hlY2soYikpKSB7CisgICAgICAgIHJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgaWYgKGEgPT0gYikgeworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgUHlfRVE6Y2FzZSBQeV9MRTpjYXNlIFB5X0dFOgorICAgICAgICAgICAgcmVzdWx0ID0gUHlfVHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBjYXNlIFB5X05FOmNhc2UgUHlfTFQ6Y2FzZSBQeV9HVDoKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5X0ZhbHNlOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG9wID09IFB5X0VRKSB7CisgICAgICAgIC8qIFN1cHBvcnRpbmcgUHlfTkUgaGVyZSBhcyB3ZWxsIGRvZXMgbm90IHNhdmUKKyAgICAgICAgICAgbXVjaCB0aW1lLCBzaW5jZSBQeV9ORSBpcyByYXJlbHkgdXNlZC4gICovCisgICAgICAgIGlmIChQeV9TSVpFKGEpID09IFB5X1NJWkUoYikKKyAgICAgICAgICAgICYmIChhLT5vYl9zdmFsWzBdID09IGItPm9iX3N2YWxbMF0KKyAgICAgICAgICAgICYmIG1lbWNtcChhLT5vYl9zdmFsLCBiLT5vYl9zdmFsLCBQeV9TSVpFKGEpKSA9PSAwKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlfVHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5X0ZhbHNlOworICAgICAgICB9CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBsZW5fYSA9IFB5X1NJWkUoYSk7IGxlbl9iID0gUHlfU0laRShiKTsKKyAgICBtaW5fbGVuID0gKGxlbl9hIDwgbGVuX2IpID8gbGVuX2EgOiBsZW5fYjsKKyAgICBpZiAobWluX2xlbiA+IDApIHsKKyAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCphLT5vYl9zdmFsKSAtIFB5X0NIQVJNQVNLKCpiLT5vYl9zdmFsKTsKKyAgICAgICAgaWYgKGM9PTApCisgICAgICAgICAgICBjID0gbWVtY21wKGEtPm9iX3N2YWwsIGItPm9iX3N2YWwsIG1pbl9sZW4pOworICAgIH0gZWxzZQorICAgICAgICBjID0gMDsKKyAgICBpZiAoYyA9PSAwKQorICAgICAgICBjID0gKGxlbl9hIDwgbGVuX2IpID8gLTEgOiAobGVuX2EgPiBsZW5fYikgPyAxIDogMDsKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBQeV9MVDogYyA9IGMgPCAgMDsgYnJlYWs7CisgICAgY2FzZSBQeV9MRTogYyA9IGMgPD0gMDsgYnJlYWs7CisgICAgY2FzZSBQeV9FUTogYXNzZXJ0KDApOyAgYnJlYWs7IC8qIHVucmVhY2hhYmxlICovCisgICAgY2FzZSBQeV9ORTogYyA9IGMgIT0gMDsgYnJlYWs7CisgICAgY2FzZSBQeV9HVDogYyA9IGMgPiAgMDsgYnJlYWs7CisgICAgY2FzZSBQeV9HRTogYyA9IGMgPj0gMDsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByZXN1bHQgPSBjID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwogICBvdXQ6Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBpbnQKIF9QeVN0cmluZ19FcShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKIHsKLQlQeVN0cmluZ09iamVjdCAqYSA9IChQeVN0cmluZ09iamVjdCopIG8xOwotCVB5U3RyaW5nT2JqZWN0ICpiID0gKFB5U3RyaW5nT2JqZWN0KikgbzI7Ci0gICAgICAgIHJldHVybiBQeV9TSVpFKGEpID09IFB5X1NJWkUoYikKLSAgICAgICAgICAmJiAqYS0+b2Jfc3ZhbCA9PSAqYi0+b2Jfc3ZhbAotICAgICAgICAgICYmIG1lbWNtcChhLT5vYl9zdmFsLCBiLT5vYl9zdmFsLCBQeV9TSVpFKGEpKSA9PSAwOworICAgIFB5U3RyaW5nT2JqZWN0ICphID0gKFB5U3RyaW5nT2JqZWN0KikgbzE7CisgICAgUHlTdHJpbmdPYmplY3QgKmIgPSAoUHlTdHJpbmdPYmplY3QqKSBvMjsKKyAgICByZXR1cm4gUHlfU0laRShhKSA9PSBQeV9TSVpFKGIpCisgICAgICAmJiAqYS0+b2Jfc3ZhbCA9PSAqYi0+b2Jfc3ZhbAorICAgICAgJiYgbWVtY21wKGEtPm9iX3N2YWwsIGItPm9iX3N2YWwsIFB5X1NJWkUoYSkpID09IDA7CiB9CiAKIHN0YXRpYyBsb25nCiBzdHJpbmdfaGFzaChQeVN0cmluZ09iamVjdCAqYSkKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGxlbjsKLQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOwotCXJlZ2lzdGVyIGxvbmcgeDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGxlbjsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOworICAgIHJlZ2lzdGVyIGxvbmcgeDsKIAotCWlmIChhLT5vYl9zaGFzaCAhPSAtMSkKLQkJcmV0dXJuIGEtPm9iX3NoYXNoOwotCWxlbiA9IFB5X1NJWkUoYSk7Ci0JcCA9ICh1bnNpZ25lZCBjaGFyICopIGEtPm9iX3N2YWw7Ci0JeCA9ICpwIDw8IDc7Ci0Jd2hpbGUgKC0tbGVuID49IDApCi0JCXggPSAoMTAwMDAwMyp4KSBeICpwKys7Ci0JeCBePSBQeV9TSVpFKGEpOwotCWlmICh4ID09IC0xKQotCQl4ID0gLTI7Ci0JYS0+b2Jfc2hhc2ggPSB4OwotCXJldHVybiB4OworICAgIGlmIChhLT5vYl9zaGFzaCAhPSAtMSkKKyAgICAgICAgcmV0dXJuIGEtPm9iX3NoYXNoOworICAgIGxlbiA9IFB5X1NJWkUoYSk7CisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIGEtPm9iX3N2YWw7CisgICAgeCA9ICpwIDw8IDc7CisgICAgd2hpbGUgKC0tbGVuID49IDApCisgICAgICAgIHggPSAoMTAwMDAwMyp4KSBeICpwKys7CisgICAgeCBePSBQeV9TSVpFKGEpOworICAgIGlmICh4ID09IC0xKQorICAgICAgICB4ID0gLTI7CisgICAgYS0+b2Jfc2hhc2ggPSB4OworICAgIHJldHVybiB4OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBzdHJpbmdfc3Vic2NyaXB0KFB5U3RyaW5nT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogaXRlbSkKIHsKLQlpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQkJcmV0dXJuIHN0cmluZ19pdGVtKHNlbGYsIGkpOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoLCBjdXIsIGk7Ci0JCWNoYXIqIHNvdXJjZV9idWY7Ci0JCWNoYXIqIHJlc3VsdF9idWY7Ci0JCVB5T2JqZWN0KiByZXN1bHQ7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgICAgIHJldHVybiBzdHJpbmdfaXRlbShzZWxmLCBpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOworICAgICAgICBjaGFyKiBzb3VyY2VfYnVmOworICAgICAgICBjaGFyKiByZXN1bHRfYnVmOworICAgICAgICBQeU9iamVjdCogcmVzdWx0OwogCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwKLQkJCQkgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCi0JCQkJICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0KilpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlpZiAoc2xpY2VsZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCIiLCAwKTsKLQkJfQotCQllbHNlIGlmIChzdGFydCA9PSAwICYmIHN0ZXAgPT0gMSAmJgotCQkJIHNsaWNlbGVuZ3RoID09IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpICYmCi0JCQkgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotCQkJUHlfSU5DUkVGKHNlbGYpOwotCQkJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Ci0JCX0KLQkJZWxzZSBpZiAoc3RlcCA9PSAxKSB7Ci0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0JCQkJUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsCi0JCQkJc2xpY2VsZW5ndGgpOwotCQl9Ci0JCWVsc2UgewotCQkJc291cmNlX2J1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKChQeU9iamVjdCopc2VsZik7Ci0JCQlyZXN1bHRfYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2Moc2xpY2VsZW5ndGgpOwotCQkJaWYgKHJlc3VsdF9idWYgPT0gTlVMTCkKLQkJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgaWYgKHNsaWNlbGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RhcnQgPT0gMCAmJiBzdGVwID09IDEgJiYKKyAgICAgICAgICAgICAgICAgc2xpY2VsZW5ndGggPT0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgJiYKKyAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RlcCA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsCisgICAgICAgICAgICAgICAgc2xpY2VsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc291cmNlX2J1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKChQeU9iamVjdCopc2VsZik7CisgICAgICAgICAgICByZXN1bHRfYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2Moc2xpY2VsZW5ndGgpOworICAgICAgICAgICAgaWYgKHJlc3VsdF9idWYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCXJlc3VsdF9idWZbaV0gPSBzb3VyY2VfYnVmW2N1cl07Ci0JCQl9CisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOworICAgICAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0X2J1ZltpXSA9IHNvdXJjZV9idWZbY3VyXTsKKyAgICAgICAgICAgIH0KIAotCQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzdWx0X2J1ZiwKLQkJCQkJCQkgICAgc2xpY2VsZW5ndGgpOwotCQkJUHlNZW1fRnJlZShyZXN1bHRfYnVmKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJzdHJpbmcgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgJS4yMDBzIiwKLQkJCSAgICAgUHlfVFlQRShpdGVtKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlc3VsdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbmd0aCk7CisgICAgICAgICAgICBQeU1lbV9GcmVlKHJlc3VsdF9idWYpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoaXRlbSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBzdHJpbmdfYnVmZmVyX2dldHJlYWRidWYoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IHZvaWQgKipwdHIpCiB7Ci0JaWYgKCBpbmRleCAhPSAwICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJImFjY2Vzc2luZyBub24tZXhpc3RlbnQgc3RyaW5nIHNlZ21lbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcHRyID0gKHZvaWQgKilzZWxmLT5vYl9zdmFsOwotCXJldHVybiBQeV9TSVpFKHNlbGYpOworICAgIGlmICggaW5kZXggIT0gMCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzc2luZyBub24tZXhpc3RlbnQgc3RyaW5nIHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcHRyID0gKHZvaWQgKilzZWxmLT5vYl9zdmFsOworICAgIHJldHVybiBQeV9TSVpFKHNlbGYpOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogc3RyaW5nX2J1ZmZlcl9nZXR3cml0ZWJ1ZihQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgY29uc3Qgdm9pZCAqKnB0cikKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJIkNhbm5vdCB1c2Ugc3RyaW5nIGFzIG1vZGlmaWFibGUgYnVmZmVyIik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgdXNlIHN0cmluZyBhcyBtb2RpZmlhYmxlIGJ1ZmZlciIpOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIHN0cmluZ19idWZmZXJfZ2V0c2VnY291bnQoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgKmxlbnApCiB7Ci0JaWYgKCBsZW5wICkKLQkJKmxlbnAgPSBQeV9TSVpFKHNlbGYpOwotCXJldHVybiAxOworICAgIGlmICggbGVucCApCisgICAgICAgICpsZW5wID0gUHlfU0laRShzZWxmKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIHN0cmluZ19idWZmZXJfZ2V0Y2hhcmJ1ZihQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgY29uc3QgY2hhciAqKnB0cikKIHsKLQlpZiAoIGluZGV4ICE9IDAgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiYWNjZXNzaW5nIG5vbi1leGlzdGVudCBzdHJpbmcgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwdHIgPSBzZWxmLT5vYl9zdmFsOwotCXJldHVybiBQeV9TSVpFKHNlbGYpOworICAgIGlmICggaW5kZXggIT0gMCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzc2luZyBub24tZXhpc3RlbnQgc3RyaW5nIHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcHRyID0gc2VsZi0+b2Jfc3ZhbDsKKyAgICByZXR1cm4gUHlfU0laRShzZWxmKTsKIH0KIAogc3RhdGljIGludAogc3RyaW5nX2J1ZmZlcl9nZXRidWZmZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X2J1ZmZlciAqdmlldywgaW50IGZsYWdzKQogewotCXJldHVybiBQeUJ1ZmZlcl9GaWxsSW5mbyh2aWV3LCAoUHlPYmplY3QqKXNlbGYsCi0JCQkJICh2b2lkICopc2VsZi0+b2Jfc3ZhbCwgUHlfU0laRShzZWxmKSwKLQkJCQkgMSwgZmxhZ3MpOworICAgIHJldHVybiBQeUJ1ZmZlcl9GaWxsSW5mbyh2aWV3LCAoUHlPYmplY3QqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc2VsZi0+b2Jfc3ZhbCwgUHlfU0laRShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgZmxhZ3MpOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgc3RyaW5nX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKXN0cmluZ19sZW5ndGgsIC8qc3FfbGVuZ3RoKi8KLQkoYmluYXJ5ZnVuYylzdHJpbmdfY29uY2F0LCAvKnNxX2NvbmNhdCovCi0JKHNzaXplYXJnZnVuYylzdHJpbmdfcmVwZWF0LCAvKnNxX3JlcGVhdCovCi0JKHNzaXplYXJnZnVuYylzdHJpbmdfaXRlbSwgLypzcV9pdGVtKi8KLQkoc3NpemVzc2l6ZWFyZ2Z1bmMpc3RyaW5nX3NsaWNlLCAvKnNxX3NsaWNlKi8KLQkwLAkJLypzcV9hc3NfaXRlbSovCi0JMCwJCS8qc3FfYXNzX3NsaWNlKi8KLQkob2Jqb2JqcHJvYylzdHJpbmdfY29udGFpbnMgLypzcV9jb250YWlucyovCisgICAgKGxlbmZ1bmMpc3RyaW5nX2xlbmd0aCwgLypzcV9sZW5ndGgqLworICAgIChiaW5hcnlmdW5jKXN0cmluZ19jb25jYXQsIC8qc3FfY29uY2F0Ki8KKyAgICAoc3NpemVhcmdmdW5jKXN0cmluZ19yZXBlYXQsIC8qc3FfcmVwZWF0Ki8KKyAgICAoc3NpemVhcmdmdW5jKXN0cmluZ19pdGVtLCAvKnNxX2l0ZW0qLworICAgIChzc2l6ZXNzaXplYXJnZnVuYylzdHJpbmdfc2xpY2UsIC8qc3Ffc2xpY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgLypzcV9hc3NfaXRlbSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnNxX2Fzc19zbGljZSovCisgICAgKG9iam9ianByb2Mpc3RyaW5nX2NvbnRhaW5zIC8qc3FfY29udGFpbnMqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgc3RyaW5nX2FzX21hcHBpbmcgPSB7Ci0JKGxlbmZ1bmMpc3RyaW5nX2xlbmd0aCwKLQkoYmluYXJ5ZnVuYylzdHJpbmdfc3Vic2NyaXB0LAotCTAsCisgICAgKGxlbmZ1bmMpc3RyaW5nX2xlbmd0aCwKKyAgICAoYmluYXJ5ZnVuYylzdHJpbmdfc3Vic2NyaXB0LAorICAgIDAsCiB9OwogCiBzdGF0aWMgUHlCdWZmZXJQcm9jcyBzdHJpbmdfYXNfYnVmZmVyID0gewotCShyZWFkYnVmZmVycHJvYylzdHJpbmdfYnVmZmVyX2dldHJlYWRidWYsCi0JKHdyaXRlYnVmZmVycHJvYylzdHJpbmdfYnVmZmVyX2dldHdyaXRlYnVmLAotCShzZWdjb3VudHByb2Mpc3RyaW5nX2J1ZmZlcl9nZXRzZWdjb3VudCwKLQkoY2hhcmJ1ZmZlcnByb2Mpc3RyaW5nX2J1ZmZlcl9nZXRjaGFyYnVmLAotCShnZXRidWZmZXJwcm9jKXN0cmluZ19idWZmZXJfZ2V0YnVmZmVyLAotCTAsIC8qIFhYWCAqLworICAgIChyZWFkYnVmZmVycHJvYylzdHJpbmdfYnVmZmVyX2dldHJlYWRidWYsCisgICAgKHdyaXRlYnVmZmVycHJvYylzdHJpbmdfYnVmZmVyX2dldHdyaXRlYnVmLAorICAgIChzZWdjb3VudHByb2Mpc3RyaW5nX2J1ZmZlcl9nZXRzZWdjb3VudCwKKyAgICAoY2hhcmJ1ZmZlcnByb2Mpc3RyaW5nX2J1ZmZlcl9nZXRjaGFyYnVmLAorICAgIChnZXRidWZmZXJwcm9jKXN0cmluZ19idWZmZXJfZ2V0YnVmZmVyLAorICAgIDAsIC8qIFhYWCAqLwogfTsKIAogCkBAIC0xNDM5LDI5ICsxNDM5LDI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3NwbGl0KFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBuOwotCVB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMTsKLQljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwotCVB5T2JqZWN0ICpzdWJvYmogPSBQeV9Ob25lOworICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksIG47CisgICAgUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xOworICAgIGNvbnN0IGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzdWI7CisgICAgUHlPYmplY3QgKnN1Ym9iaiA9IFB5X05vbmU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPbjpzcGxpdCIsICZzdWJvYmosICZtYXhzcGxpdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChtYXhzcGxpdCA8IDApCi0JCW1heHNwbGl0ID0gUFlfU1NJWkVfVF9NQVg7Ci0JaWYgKHN1Ym9iaiA9PSBQeV9Ob25lKQotCQlyZXR1cm4gc3RyaW5nbGliX3NwbGl0X3doaXRlc3BhY2UoKFB5T2JqZWN0Kikgc2VsZiwgcywgbGVuLCBtYXhzcGxpdCk7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHN1Ym9iaikpIHsKLQkJc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1Ym9iaik7Ci0JCW4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJvYmopOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPbjpzcGxpdCIsICZzdWJvYmosICZtYXhzcGxpdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtYXhzcGxpdCA8IDApCisgICAgICAgIG1heHNwbGl0ID0gUFlfU1NJWkVfVF9NQVg7CisgICAgaWYgKHN1Ym9iaiA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gc3RyaW5nbGliX3NwbGl0X3doaXRlc3BhY2UoKFB5T2JqZWN0Kikgc2VsZiwgcywgbGVuLCBtYXhzcGxpdCk7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHN1Ym9iaikpIHsKKyAgICAgICAgc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1Ym9iaik7CisgICAgICAgIG4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJvYmopOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpCi0JCXJldHVybiBQeVVuaWNvZGVfU3BsaXQoKFB5T2JqZWN0ICopc2VsZiwgc3Vib2JqLCBtYXhzcGxpdCk7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfU3BsaXQoKFB5T2JqZWN0ICopc2VsZiwgc3Vib2JqLCBtYXhzcGxpdCk7CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vib2JqLCAmc3ViLCAmbikpCi0JCXJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJvYmosICZzdWIsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gc3RyaW5nbGliX3NwbGl0KChQeU9iamVjdCopIHNlbGYsIHMsIGxlbiwgc3ViLCBuLCBtYXhzcGxpdCk7CisgICAgcmV0dXJuIHN0cmluZ2xpYl9zcGxpdCgoUHlPYmplY3QqKSBzZWxmLCBzLCBsZW4sIHN1YiwgbiwgbWF4c3BsaXQpOwogfQogCiBQeURvY19TVFJWQVIocGFydGl0aW9uX19kb2NfXywKQEAgLTE0NzQsMjUgKzE0NzQsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcGFydGl0aW9uKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2VwX29iaikKIHsKLQljb25zdCBjaGFyICpzZXA7Ci0JUHlfc3NpemVfdCBzZXBfbGVuOworICAgIGNvbnN0IGNoYXIgKnNlcDsKKyAgICBQeV9zc2l6ZV90IHNlcF9sZW47CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc2VwX29iaikpIHsKLQkJc2VwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlcF9vYmopOwotCQlzZXBfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VwX29iaik7Ci0JfQorICAgIGlmIChQeVN0cmluZ19DaGVjayhzZXBfb2JqKSkgeworICAgICAgICBzZXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VwX29iaik7CisgICAgICAgIHNlcF9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZXBfb2JqKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzZXBfb2JqKSkKLQkJcmV0dXJuIFB5VW5pY29kZV9QYXJ0aXRpb24oKFB5T2JqZWN0ICopIHNlbGYsIHNlcF9vYmopOworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzZXBfb2JqKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9QYXJ0aXRpb24oKFB5T2JqZWN0ICopIHNlbGYsIHNlcF9vYmopOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHNlcF9vYmosICZzZXAsICZzZXBfbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHNlcF9vYmosICZzZXAsICZzZXBfbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gc3RyaW5nbGliX3BhcnRpdGlvbigKLQkJKFB5T2JqZWN0Kikgc2VsZiwKLQkJUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwKLQkJc2VwX29iaiwgc2VwLCBzZXBfbGVuCi0JCSk7CisgICAgcmV0dXJuIHN0cmluZ2xpYl9wYXJ0aXRpb24oCisgICAgICAgIChQeU9iamVjdCopIHNlbGYsCisgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisgICAgICAgIHNlcF9vYmosIHNlcCwgc2VwX2xlbgorICAgICAgICApOwogfQogCiBQeURvY19TVFJWQVIocnBhcnRpdGlvbl9fZG9jX18sCkBAIC0xNTA1LDI1ICsxNTA1LDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3JwYXJ0aXRpb24oUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXBfb2JqKQogewotCWNvbnN0IGNoYXIgKnNlcDsKLQlQeV9zc2l6ZV90IHNlcF9sZW47CisgICAgY29uc3QgY2hhciAqc2VwOworICAgIFB5X3NzaXplX3Qgc2VwX2xlbjsKIAotCWlmIChQeVN0cmluZ19DaGVjayhzZXBfb2JqKSkgewotCQlzZXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VwX29iaik7Ci0JCXNlcF9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZXBfb2JqKTsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHNlcF9vYmopKSB7CisgICAgICAgIHNlcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZXBfb2JqKTsKKyAgICAgICAgc2VwX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlcF9vYmopOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHNlcF9vYmopKQotCQlyZXR1cm4gUHlVbmljb2RlX1JQYXJ0aXRpb24oKFB5T2JqZWN0ICopIHNlbGYsIHNlcF9vYmopOworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzZXBfb2JqKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9SUGFydGl0aW9uKChQeU9iamVjdCAqKSBzZWxmLCBzZXBfb2JqKTsKICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzZXBfb2JqLCAmc2VwLCAmc2VwX2xlbikpCi0JCXJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzZXBfb2JqLCAmc2VwLCAmc2VwX2xlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIHN0cmluZ2xpYl9ycGFydGl0aW9uKAotCQkoUHlPYmplY3QqKSBzZWxmLAotCQlQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAotCQlzZXBfb2JqLCBzZXAsIHNlcF9sZW4KLQkJKTsKKyAgICByZXR1cm4gc3RyaW5nbGliX3JwYXJ0aXRpb24oCisgICAgICAgIChQeU9iamVjdCopIHNlbGYsCisgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisgICAgICAgIHNlcF9vYmosIHNlcCwgc2VwX2xlbgorICAgICAgICApOwogfQogCiBQeURvY19TVFJWQVIocnNwbGl0X19kb2NfXywKQEAgLTE1MzgsMjkgKzE1MzgsMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcnNwbGl0KFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBuOwotCVB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMTsKLQljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwotCVB5T2JqZWN0ICpzdWJvYmogPSBQeV9Ob25lOworICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksIG47CisgICAgUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xOworICAgIGNvbnN0IGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzdWI7CisgICAgUHlPYmplY3QgKnN1Ym9iaiA9IFB5X05vbmU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPbjpyc3BsaXQiLCAmc3Vib2JqLCAmbWF4c3BsaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobWF4c3BsaXQgPCAwKQotCQltYXhzcGxpdCA9IFBZX1NTSVpFX1RfTUFYOwotCWlmIChzdWJvYmogPT0gUHlfTm9uZSkKLQkJcmV0dXJuIHN0cmluZ2xpYl9yc3BsaXRfd2hpdGVzcGFjZSgoUHlPYmplY3QqKSBzZWxmLCBzLCBsZW4sIG1heHNwbGl0KTsKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc3Vib2JqKSkgewotCQlzdWIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3Vib2JqKTsKLQkJbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Ym9iaik7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE9uOnJzcGxpdCIsICZzdWJvYmosICZtYXhzcGxpdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtYXhzcGxpdCA8IDApCisgICAgICAgIG1heHNwbGl0ID0gUFlfU1NJWkVfVF9NQVg7CisgICAgaWYgKHN1Ym9iaiA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gc3RyaW5nbGliX3JzcGxpdF93aGl0ZXNwYWNlKChQeU9iamVjdCopIHNlbGYsIHMsIGxlbiwgbWF4c3BsaXQpOworICAgIGlmIChQeVN0cmluZ19DaGVjayhzdWJvYmopKSB7CisgICAgICAgIHN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJvYmopOworICAgICAgICBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vib2JqKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJvYmopKQotCQlyZXR1cm4gUHlVbmljb2RlX1JTcGxpdCgoUHlPYmplY3QgKilzZWxmLCBzdWJvYmosIG1heHNwbGl0KTsKKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vib2JqKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9SU3BsaXQoKFB5T2JqZWN0ICopc2VsZiwgc3Vib2JqLCBtYXhzcGxpdCk7CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vib2JqLCAmc3ViLCAmbikpCi0JCXJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJvYmosICZzdWIsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gc3RyaW5nbGliX3JzcGxpdCgoUHlPYmplY3QqKSBzZWxmLCBzLCBsZW4sIHN1YiwgbiwgbWF4c3BsaXQpOworICAgIHJldHVybiBzdHJpbmdsaWJfcnNwbGl0KChQeU9iamVjdCopIHNlbGYsIHMsIGxlbiwgc3ViLCBuLCBtYXhzcGxpdCk7CiB9CiAKIApAQCAtMTU3MywxNjcgKzE1NzMsMTY3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2pvaW4oUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvcmlnKQogewotCWNoYXIgKnNlcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKLQljb25zdCBQeV9zc2l6ZV90IHNlcGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWNoYXIgKnA7Ci0JUHlfc3NpemVfdCBzZXFsZW4gPSAwOwotCXNpemVfdCBzeiA9IDA7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICpzZXEsICppdGVtOworICAgIGNoYXIgKnNlcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICBjb25zdCBQeV9zc2l6ZV90IHNlcGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGNoYXIgKnA7CisgICAgUHlfc3NpemVfdCBzZXFsZW4gPSAwOworICAgIHNpemVfdCBzeiA9IDA7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpzZXEsICppdGVtOwogCi0Jc2VxID0gUHlTZXF1ZW5jZV9GYXN0KG9yaWcsICIiKTsKLQlpZiAoc2VxID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHNlcSA9IFB5U2VxdWVuY2VfRmFzdChvcmlnLCAiIik7CisgICAgaWYgKHNlcSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNlcWxlbiA9IFB5U2VxdWVuY2VfU2l6ZShzZXEpOwotCWlmIChzZXFsZW4gPT0gMCkgewotCQlQeV9ERUNSRUYoc2VxKTsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCX0KLQlpZiAoc2VxbGVuID09IDEpIHsKLQkJaXRlbSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShzZXEsIDApOwotCQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChpdGVtKSB8fCBQeVVuaWNvZGVfQ2hlY2tFeGFjdChpdGVtKSkgewotCQkJUHlfSU5DUkVGKGl0ZW0pOwotCQkJUHlfREVDUkVGKHNlcSk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfQotCX0KKyAgICBzZXFsZW4gPSBQeVNlcXVlbmNlX1NpemUoc2VxKTsKKyAgICBpZiAoc2VxbGVuID09IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICB9CisgICAgaWYgKHNlcWxlbiA9PSAxKSB7CisgICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oc2VxLCAwKTsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QoaXRlbSkgfHwgUHlVbmljb2RlX0NoZWNrRXhhY3QoaXRlbSkpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBUaGVyZSBhcmUgYXQgbGVhc3QgdHdvIHRoaW5ncyB0byBqb2luLCBvciBlbHNlIHdlIGhhdmUgYSBzdWJjbGFzcwotCSAqIG9mIHRoZSBidWlsdGluIHR5cGVzIGluIHRoZSBzZXF1ZW5jZS4KLQkgKiBEbyBhIHByZS1wYXNzIHRvIGZpZ3VyZSBvdXQgdGhlIHRvdGFsIGFtb3VudCBvZiBzcGFjZSB3ZSdsbAotCSAqIG5lZWQgKHN6KSwgc2VlIHdoZXRoZXIgYW55IGFyZ3VtZW50IGlzIGFic3VyZCwgYW5kIGRlZmVyIHRvCi0JICogdGhlIFVuaWNvZGUgam9pbiBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgc2VxbGVuOyBpKyspIHsKLQkJY29uc3Qgc2l6ZV90IG9sZF9zeiA9IHN6OwotCQlpdGVtID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKHNlcSwgaSk7Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpeworICAgIC8qIFRoZXJlIGFyZSBhdCBsZWFzdCB0d28gdGhpbmdzIHRvIGpvaW4sIG9yIGVsc2Ugd2UgaGF2ZSBhIHN1YmNsYXNzCisgICAgICogb2YgdGhlIGJ1aWx0aW4gdHlwZXMgaW4gdGhlIHNlcXVlbmNlLgorICAgICAqIERvIGEgcHJlLXBhc3MgdG8gZmlndXJlIG91dCB0aGUgdG90YWwgYW1vdW50IG9mIHNwYWNlIHdlJ2xsCisgICAgICogbmVlZCAoc3opLCBzZWUgd2hldGhlciBhbnkgYXJndW1lbnQgaXMgYWJzdXJkLCBhbmQgZGVmZXIgdG8KKyAgICAgKiB0aGUgVW5pY29kZSBqb2luIGlmIGFwcHJvcHJpYXRlLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzZXFsZW47IGkrKykgeworICAgICAgICBjb25zdCBzaXplX3Qgb2xkX3N6ID0gc3o7CisgICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oc2VxLCBpKTsKKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhpdGVtKSl7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJaWYgKFB5VW5pY29kZV9DaGVjayhpdGVtKSkgewotCQkJCS8qIERlZmVyIHRvIFVuaWNvZGUgam9pbi4KLQkJCQkgKiBDQVVUSU9OOiAgVGhlcmUncyBubyBndXJhbnRlZSB0aGF0IHRoZQotCQkJCSAqIG9yaWdpbmFsIHNlcXVlbmNlIGNhbiBiZSBpdGVyYXRlZCBvdmVyCi0JCQkJICogYWdhaW4sIHNvIHdlIG11c3QgcGFzcyBzZXEgaGVyZS4KLQkJCQkgKi8KLQkJCQlQeU9iamVjdCAqcmVzdWx0OwotCQkJCXJlc3VsdCA9IFB5VW5pY29kZV9Kb2luKChQeU9iamVjdCAqKXNlbGYsIHNlcSk7Ci0JCQkJUHlfREVDUkVGKHNlcSk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgICAgICAvKiBEZWZlciB0byBVbmljb2RlIGpvaW4uCisgICAgICAgICAgICAgICAgICogQ0FVVElPTjogIFRoZXJlJ3Mgbm8gZ3VyYW50ZWUgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgKiBvcmlnaW5hbCBzZXF1ZW5jZSBjYW4gYmUgaXRlcmF0ZWQgb3ZlcgorICAgICAgICAgICAgICAgICAqIGFnYWluLCBzbyB3ZSBtdXN0IHBhc3Mgc2VxIGhlcmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfSm9pbigoUHlPYmplY3QgKilzZWxmLCBzZXEpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAic2VxdWVuY2UgaXRlbSAlemQ6IGV4cGVjdGVkIHN0cmluZywiCi0JCQkJICAgICAiICUuODBzIGZvdW5kIiwKLQkJCQkgICAgIGksIFB5X1RZUEUoaXRlbSktPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKHNlcSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzeiArPSBQeVN0cmluZ19HRVRfU0laRShpdGVtKTsKLQkJaWYgKGkgIT0gMCkKLQkJCXN6ICs9IHNlcGxlbjsKLQkJaWYgKHN6IDwgb2xkX3N6IHx8IHN6ID4gUFlfU1NJWkVfVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJqb2luKCkgcmVzdWx0IGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKLQkJCVB5X0RFQ1JFRihzZXEpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSBpdGVtICV6ZDogZXhwZWN0ZWQgc3RyaW5nLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICUuODBzIGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpLCBQeV9UWVBFKGl0ZW0pLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3ogKz0gUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSk7CisgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICBzeiArPSBzZXBsZW47CisgICAgICAgIGlmIChzeiA8IG9sZF9zeiB8fCBzeiA+IFBZX1NTSVpFX1RfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAiam9pbigpIHJlc3VsdCBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JLyogQWxsb2NhdGUgcmVzdWx0IHNwYWNlLiAqLwotCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKilOVUxMLCBzeik7Ci0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihzZXEpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQWxsb2NhdGUgcmVzdWx0IHNwYWNlLiAqLworICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKilOVUxMLCBzeik7CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBDYXRlbmF0ZSBldmVyeXRoaW5nLiAqLwotCXAgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2VxbGVuOyArK2kpIHsKLQkJc2l6ZV90IG47Ci0JCWl0ZW0gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oc2VxLCBpKTsKLQkJbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pOwotCQlQeV9NRU1DUFkocCwgUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLCBuKTsKLQkJcCArPSBuOwotCQlpZiAoaSA8IHNlcWxlbiAtIDEpIHsKLQkJCVB5X01FTUNQWShwLCBzZXAsIHNlcGxlbik7Ci0JCQlwICs9IHNlcGxlbjsKLQkJfQotCX0KKyAgICAvKiBDYXRlbmF0ZSBldmVyeXRoaW5nLiAqLworICAgIHAgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VxbGVuOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IG47CisgICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oc2VxLCBpKTsKKyAgICAgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pOworICAgICAgICBQeV9NRU1DUFkocCwgUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLCBuKTsKKyAgICAgICAgcCArPSBuOworICAgICAgICBpZiAoaSA8IHNlcWxlbiAtIDEpIHsKKyAgICAgICAgICAgIFB5X01FTUNQWShwLCBzZXAsIHNlcGxlbik7CisgICAgICAgICAgICBwICs9IHNlcGxlbjsKKyAgICAgICAgfQorICAgIH0KIAotCVB5X0RFQ1JFRihzZXEpOwotCXJldHVybiByZXM7CisgICAgUHlfREVDUkVGKHNlcSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlPYmplY3QgKgogX1B5U3RyaW5nX0pvaW4oUHlPYmplY3QgKnNlcCwgUHlPYmplY3QgKngpCiB7Ci0JYXNzZXJ0KHNlcCAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHNlcCkpOwotCWFzc2VydCh4ICE9IE5VTEwpOwotCXJldHVybiBzdHJpbmdfam9pbigoUHlTdHJpbmdPYmplY3QgKilzZXAsIHgpOworICAgIGFzc2VydChzZXAgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhzZXApKTsKKyAgICBhc3NlcnQoeCAhPSBOVUxMKTsKKyAgICByZXR1cm4gc3RyaW5nX2pvaW4oKFB5U3RyaW5nT2JqZWN0ICopc2VwLCB4KTsKIH0KIAogLyogaGVscGVyIG1hY3JvIHRvIGZpeHVwIHN0YXJ0L2VuZCBzbGljZSB2YWx1ZXMgKi8KICNkZWZpbmUgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuKSAgICAgICAgIFwKLQlpZiAoZW5kID4gbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBlbmQgPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZWxzZSBpZiAoZW5kIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgZW5kICs9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBpZiAoZW5kIDwgMCkgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgICAgICBlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChzdGFydCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIHN0YXJ0ICs9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgaWYgKHN0YXJ0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgICAgc3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICBcCi0JfQorICAgIGlmIChlbmQgPiBsZW4pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVuZCA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmIChlbmQgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbmQgKz0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChlbmQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3RhcnQgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGFydCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzdGFydCA8IDApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKIHN0cmluZ19maW5kX2ludGVybmFsKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGRpcikKIHsKLQlQeU9iamVjdCAqc3Vib2JqOwotCWNvbnN0IGNoYXIgKnN1YjsKLQlQeV9zc2l6ZV90IHN1Yl9sZW47Ci0JUHlfc3NpemVfdCBzdGFydD0wLCBlbmQ9UFlfU1NJWkVfVF9NQVg7Ci0JUHlPYmplY3QgKm9ial9zdGFydD1QeV9Ob25lLCAqb2JqX2VuZD1QeV9Ob25lOworICAgIFB5T2JqZWN0ICpzdWJvYmo7CisgICAgY29uc3QgY2hhciAqc3ViOworICAgIFB5X3NzaXplX3Qgc3ViX2xlbjsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0PTAsIGVuZD1QWV9TU0laRV9UX01BWDsKKyAgICBQeU9iamVjdCAqb2JqX3N0YXJ0PVB5X05vbmUsICpvYmpfZW5kPVB5X05vbmU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98T086ZmluZC9yZmluZC9pbmRleC9yaW5kZXgiLCAmc3Vib2JqLAotCQkmb2JqX3N0YXJ0LCAmb2JqX2VuZCkpCi0JCXJldHVybiAtMjsKLQkvKiBUbyBzdXBwb3J0IE5vbmUgaW4gInN0YXJ0IiBhbmQgImVuZCIgYXJndW1lbnRzLCBtZWFuaW5nCi0JICAgdGhlIHNhbWUgYXMgaWYgdGhleSB3ZXJlIG5vdCBwYXNzZWQuCi0JKi8KLQlpZiAob2JqX3N0YXJ0ICE9IFB5X05vbmUpCi0JCWlmICghX1B5RXZhbF9TbGljZUluZGV4KG9ial9zdGFydCwgJnN0YXJ0KSkKLQkgICAgICAgIHJldHVybiAtMjsKLQlpZiAob2JqX2VuZCAhPSBQeV9Ob25lKQotCQlpZiAoIV9QeUV2YWxfU2xpY2VJbmRleChvYmpfZW5kLCAmZW5kKSkKLQkgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98T086ZmluZC9yZmluZC9pbmRleC9yaW5kZXgiLCAmc3Vib2JqLAorICAgICAgICAmb2JqX3N0YXJ0LCAmb2JqX2VuZCkpCisgICAgICAgIHJldHVybiAtMjsKKyAgICAvKiBUbyBzdXBwb3J0IE5vbmUgaW4gInN0YXJ0IiBhbmQgImVuZCIgYXJndW1lbnRzLCBtZWFuaW5nCisgICAgICAgdGhlIHNhbWUgYXMgaWYgdGhleSB3ZXJlIG5vdCBwYXNzZWQuCisgICAgKi8KKyAgICBpZiAob2JqX3N0YXJ0ICE9IFB5X05vbmUpCisgICAgICAgIGlmICghX1B5RXZhbF9TbGljZUluZGV4KG9ial9zdGFydCwgJnN0YXJ0KSkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIGlmIChvYmpfZW5kICE9IFB5X05vbmUpCisgICAgICAgIGlmICghX1B5RXZhbF9TbGljZUluZGV4KG9ial9lbmQsICZlbmQpKQorICAgICAgICByZXR1cm4gLTI7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc3Vib2JqKSkgewotCQlzdWIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3Vib2JqKTsKLQkJc3ViX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Ym9iaik7Ci0JfQorICAgIGlmIChQeVN0cmluZ19DaGVjayhzdWJvYmopKSB7CisgICAgICAgIHN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJvYmopOworICAgICAgICBzdWJfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vib2JqKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJvYmopKQotCQlyZXR1cm4gUHlVbmljb2RlX0ZpbmQoCi0JCQkoUHlPYmplY3QgKilzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsIGRpcik7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRmluZCgKKyAgICAgICAgICAgIChQeU9iamVjdCAqKXNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgZGlyKTsKICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJvYmosICZzdWIsICZzdWJfbGVuKSkKLQkJLyogWFhYIC0gdGhlICJleHBlY3RlZCBhIGNoYXJhY3RlciBidWZmZXIgb2JqZWN0IiBpcyBwcmV0dHkKLQkJICAgY29uZnVzaW5nIGZvciBhIG5vbi1leHBlcnQuICByZW1hcCB0byBzb21ldGhpbmcgZWxzZSA/ICovCi0JCXJldHVybiAtMjsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vib2JqLCAmc3ViLCAmc3ViX2xlbikpCisgICAgICAgIC8qIFhYWCAtIHRoZSAiZXhwZWN0ZWQgYSBjaGFyYWN0ZXIgYnVmZmVyIG9iamVjdCIgaXMgcHJldHR5CisgICAgICAgICAgIGNvbmZ1c2luZyBmb3IgYSBub24tZXhwZXJ0LiAgcmVtYXAgdG8gc29tZXRoaW5nIGVsc2UgPyAqLworICAgICAgICByZXR1cm4gLTI7CiAKLQlpZiAoZGlyID4gMCkKLQkJcmV0dXJuIHN0cmluZ2xpYl9maW5kX3NsaWNlKAotCQkJUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwKLQkJCXN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7Ci0JZWxzZQotCQlyZXR1cm4gc3RyaW5nbGliX3JmaW5kX3NsaWNlKAotCQkJUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwKLQkJCXN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7CisgICAgaWYgKGRpciA+IDApCisgICAgICAgIHJldHVybiBzdHJpbmdsaWJfZmluZF9zbGljZSgKKyAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHN0cmluZ2xpYl9yZmluZF9zbGljZSgKKyAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwogfQogCiAKQEAgLTE3NDksMTAgKzE3NDksMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfZmluZChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7Ci0JaWYgKHJlc3VsdCA9PSAtMikKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CiB9CiAKIApAQCAtMTc2NCwxNSArMTc2NCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19pbmRleChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7Ci0JaWYgKHJlc3VsdCA9PSAtMikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHJlc3VsdCA9PSAtMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic3Vic3RyaW5nIG5vdCBmb3VuZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzdHJpbmcgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzdWx0KTsKIH0KIAogCkBAIC0xNzg4LDEwICsxNzg4LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3JmaW5kKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IHJlc3VsdCA9IHN0cmluZ19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKLQlpZiAocmVzdWx0ID09IC0yKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IHN0cmluZ19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKKyAgICBpZiAocmVzdWx0ID09IC0yKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzdWx0KTsKIH0KIAogCkBAIC0xODAzLDExNSArMTgwMywxMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcmluZGV4KFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IHJlc3VsdCA9IHN0cmluZ19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKLQlpZiAocmVzdWx0ID09IC0yKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocmVzdWx0ID09IC0xKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzdWJzdHJpbmcgbm90IGZvdW5kIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IHN0cmluZ19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKKyAgICBpZiAocmVzdWx0ID09IC0yKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN1YnN0cmluZyBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXN1bHQpOwogfQogCiAKIFB5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogZG9feHN0cmlwKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBpbnQgc3RyaXB0eXBlLCBQeU9iamVjdCAqc2Vwb2JqKQogewotCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQljaGFyICpzZXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2Vwb2JqKTsKLQlQeV9zc2l6ZV90IHNlcGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlcG9iaik7Ci0JUHlfc3NpemVfdCBpLCBqOworICAgIGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBjaGFyICpzZXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2Vwb2JqKTsKKyAgICBQeV9zc2l6ZV90IHNlcGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlcG9iaik7CisgICAgUHlfc3NpemVfdCBpLCBqOwogCi0JaSA9IDA7Ci0JaWYgKHN0cmlwdHlwZSAhPSBSSUdIVFNUUklQKSB7Ci0JCXdoaWxlIChpIDwgbGVuICYmIG1lbWNocihzZXAsIFB5X0NIQVJNQVNLKHNbaV0pLCBzZXBsZW4pKSB7Ci0JCQlpKys7Ci0JCX0KLQl9CisgICAgaSA9IDA7CisgICAgaWYgKHN0cmlwdHlwZSAhPSBSSUdIVFNUUklQKSB7CisgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIG1lbWNocihzZXAsIFB5X0NIQVJNQVNLKHNbaV0pLCBzZXBsZW4pKSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CiAKLQlqID0gbGVuOwotCWlmIChzdHJpcHR5cGUgIT0gTEVGVFNUUklQKSB7Ci0JCWRvIHsKLQkJCWotLTsKLQkJfSB3aGlsZSAoaiA+PSBpICYmIG1lbWNocihzZXAsIFB5X0NIQVJNQVNLKHNbal0pLCBzZXBsZW4pKTsKLQkJaisrOwotCX0KKyAgICBqID0gbGVuOworICAgIGlmIChzdHJpcHR5cGUgIT0gTEVGVFNUUklQKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGotLTsKKyAgICAgICAgfSB3aGlsZSAoaiA+PSBpICYmIG1lbWNocihzZXAsIFB5X0NIQVJNQVNLKHNbal0pLCBzZXBsZW4pKTsKKyAgICAgICAgaisrOworICAgIH0KIAotCWlmIChpID09IDAgJiYgaiA9PSBsZW4gJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiAoUHlPYmplY3QqKXNlbGY7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraSwgai1pKTsKKyAgICBpZiAoaSA9PSAwICYmIGogPT0gbGVuICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2ksIGotaSk7CiB9CiAKIAogUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCiBkb19zdHJpcChQeVN0cmluZ09iamVjdCAqc2VsZiwgaW50IHN0cmlwdHlwZSkKIHsKLQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksIGksIGo7CisgICAgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBpLCBqOwogCi0JaSA9IDA7Ci0JaWYgKHN0cmlwdHlwZSAhPSBSSUdIVFNUUklQKSB7Ci0JCXdoaWxlIChpIDwgbGVuICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7Ci0JCQlpKys7Ci0JCX0KLQl9CisgICAgaSA9IDA7CisgICAgaWYgKHN0cmlwdHlwZSAhPSBSSUdIVFNUUklQKSB7CisgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CiAKLQlqID0gbGVuOwotCWlmIChzdHJpcHR5cGUgIT0gTEVGVFNUUklQKSB7Ci0JCWRvIHsKLQkJCWotLTsKLQkJfSB3aGlsZSAoaiA+PSBpICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tqXSkpKTsKLQkJaisrOwotCX0KKyAgICBqID0gbGVuOworICAgIGlmIChzdHJpcHR5cGUgIT0gTEVGVFNUUklQKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGotLTsKKyAgICAgICAgfSB3aGlsZSAoaiA+PSBpICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tqXSkpKTsKKyAgICAgICAgaisrOworICAgIH0KIAotCWlmIChpID09IDAgJiYgaiA9PSBsZW4gJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiAoUHlPYmplY3QqKXNlbGY7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraSwgai1pKTsKKyAgICBpZiAoaSA9PSAwICYmIGogPT0gbGVuICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2ksIGotaSk7CiB9CiAKIAogUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCiBkb19hcmdzdHJpcChQeVN0cmluZ09iamVjdCAqc2VsZiwgaW50IHN0cmlwdHlwZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNlcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnNlcCA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgKGNoYXIgKilzdHJpcGZvcm1hdFtzdHJpcHR5cGVdLCAmc2VwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIChjaGFyICopc3RyaXBmb3JtYXRbc3RyaXB0eXBlXSwgJnNlcCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHNlcCAhPSBOVUxMICYmIHNlcCAhPSBQeV9Ob25lKSB7Ci0JCWlmIChQeVN0cmluZ19DaGVjayhzZXApKQotCQkJcmV0dXJuIGRvX3hzdHJpcChzZWxmLCBzdHJpcHR5cGUsIHNlcCk7CisgICAgaWYgKHNlcCAhPSBOVUxMICYmIHNlcCAhPSBQeV9Ob25lKSB7CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhzZXApKQorICAgICAgICAgICAgcmV0dXJuIGRvX3hzdHJpcChzZWxmLCBzdHJpcHR5cGUsIHNlcCk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc2VwKSkgewotCQkJUHlPYmplY3QgKnVuaXNlbGYgPSBQeVVuaWNvZGVfRnJvbU9iamVjdCgoUHlPYmplY3QgKilzZWxmKTsKLQkJCVB5T2JqZWN0ICpyZXM7Ci0JCQlpZiAodW5pc2VsZj09TlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCXJlcyA9IF9QeVVuaWNvZGVfWFN0cmlwKChQeVVuaWNvZGVPYmplY3QgKil1bmlzZWxmLAotCQkJCXN0cmlwdHlwZSwgc2VwKTsKLQkJCVB5X0RFQ1JFRih1bmlzZWxmKTsKLQkJCXJldHVybiByZXM7Ci0JCX0KKyAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHNlcCkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp1bmlzZWxmID0gUHlVbmljb2RlX0Zyb21PYmplY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICAgICAgaWYgKHVuaXNlbGY9PU5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXMgPSBfUHlVbmljb2RlX1hTdHJpcCgoUHlVbmljb2RlT2JqZWN0ICopdW5pc2VsZiwKKyAgICAgICAgICAgICAgICBzdHJpcHR5cGUsIHNlcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodW5pc2VsZik7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CiAjZW5kaWYKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQkgICAgICIlcyBhcmcgbXVzdCBiZSBOb25lLCBzdHIgb3IgdW5pY29kZSIsCisgICAgICAgICAgICAgICAgICAgICAiJXMgYXJnIG11c3QgYmUgTm9uZSwgc3RyIG9yIHVuaWNvZGUiLAogI2Vsc2UKLQkJCSAgICAgIiVzIGFyZyBtdXN0IGJlIE5vbmUgb3Igc3RyIiwKKyAgICAgICAgICAgICAgICAgICAgICIlcyBhcmcgbXVzdCBiZSBOb25lIG9yIHN0ciIsCiAjZW5kaWYKLQkJCSAgICAgU1RSSVBOQU1FKHN0cmlwdHlwZSkpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICAgICAgICAgICBTVFJJUE5BTUUoc3RyaXB0eXBlKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBkb19zdHJpcChzZWxmLCBzdHJpcHR5cGUpOworICAgIHJldHVybiBkb19zdHJpcChzZWxmLCBzdHJpcHR5cGUpOwogfQogCiAKQEAgLTE5MjYsMTAgKzE5MjYsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfc3RyaXAoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApCi0JCXJldHVybiBkb19zdHJpcChzZWxmLCBCT1RIU1RSSVApOyAvKiBDb21tb24gY2FzZSAqLwotCWVsc2UKLQkJcmV0dXJuIGRvX2FyZ3N0cmlwKHNlbGYsIEJPVEhTVFJJUCwgYXJncyk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKKyAgICAgICAgcmV0dXJuIGRvX3N0cmlwKHNlbGYsIEJPVEhTVFJJUCk7IC8qIENvbW1vbiBjYXNlICovCisgICAgZWxzZQorICAgICAgICByZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgQk9USFNUUklQLCBhcmdzKTsKIH0KIAogCkBAIC0xOTQzLDEwICsxOTQzLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2xzdHJpcChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKLQkJcmV0dXJuIGRvX3N0cmlwKHNlbGYsIExFRlRTVFJJUCk7IC8qIENvbW1vbiBjYXNlICovCi0JZWxzZQotCQlyZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgTEVGVFNUUklQLCBhcmdzKTsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKQorICAgICAgICByZXR1cm4gZG9fc3RyaXAoc2VsZiwgTEVGVFNUUklQKTsgLyogQ29tbW9uIGNhc2UgKi8KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBkb19hcmdzdHJpcChzZWxmLCBMRUZUU1RSSVAsIGFyZ3MpOwogfQogCiAKQEAgLTE5NjAsMTAgKzE5NjAsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcnN0cmlwKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKQotCQlyZXR1cm4gZG9fc3RyaXAoc2VsZiwgUklHSFRTVFJJUCk7IC8qIENvbW1vbiBjYXNlICovCi0JZWxzZQotCQlyZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgUklHSFRTVFJJUCwgYXJncyk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKKyAgICAgICAgcmV0dXJuIGRvX3N0cmlwKHNlbGYsIFJJR0hUU1RSSVApOyAvKiBDb21tb24gY2FzZSAqLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRvX2FyZ3N0cmlwKHNlbGYsIFJJR0hUU1RSSVAsIGFyZ3MpOwogfQogCiAKQEAgLTE5ODAsMjUgKzE5ODAsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfbG93ZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqczsKLQlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqbmV3b2JqOworICAgIGNoYXIgKnM7CisgICAgUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgUHlPYmplY3QgKm5ld29iajsKIAotCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmICghbmV3b2JqKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAoIW5ld29iaikKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5ld29iaik7CisgICAgcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOwogCi0JUHlfTUVNQ1BZKHMsIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgbik7CisgICAgUHlfTUVNQ1BZKHMsIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgbik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soc1tpXSk7Ci0JCWlmIChpc3VwcGVyKGMpKQotCQkJc1tpXSA9IF90b2xvd2VyKGMpOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soc1tpXSk7CisgICAgICAgIGlmIChpc3VwcGVyKGMpKQorICAgICAgICAgICAgc1tpXSA9IF90b2xvd2VyKGMpOworICAgIH0KIAotCXJldHVybiBuZXdvYmo7CisgICAgcmV0dXJuIG5ld29iajsKIH0KIAogUHlEb2NfU1RSVkFSKHVwcGVyX19kb2NfXywKQEAgLTIwMTMsMjUgKzIwMTMsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfdXBwZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqczsKLQlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqbmV3b2JqOworICAgIGNoYXIgKnM7CisgICAgUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgUHlPYmplY3QgKm5ld29iajsKIAotCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmICghbmV3b2JqKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAoIW5ld29iaikKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5ld29iaik7CisgICAgcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOwogCi0JUHlfTUVNQ1BZKHMsIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgbik7CisgICAgUHlfTUVNQ1BZKHMsIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgbik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soc1tpXSk7Ci0JCWlmIChpc2xvd2VyKGMpKQotCQkJc1tpXSA9IF90b3VwcGVyKGMpOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soc1tpXSk7CisgICAgICAgIGlmIChpc2xvd2VyKGMpKQorICAgICAgICAgICAgc1tpXSA9IF90b3VwcGVyKGMpOworICAgIH0KIAotCXJldHVybiBuZXdvYmo7CisgICAgcmV0dXJuIG5ld29iajsKIH0KIAogUHlEb2NfU1RSVkFSKHRpdGxlX19kb2NfXywKQEAgLTIwNDMsMzAgKzIwNDMsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHN0cmluZ190aXRsZShQeVN0cmluZ09iamVjdCAqc2VsZikKIHsKLQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc19uZXc7Ci0JUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JaW50IHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKLQlQeU9iamVjdCAqbmV3b2JqOworICAgIGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKKyAgICBQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBpbnQgcHJldmlvdXNfaXNfY2FzZWQgPSAwOworICAgIFB5T2JqZWN0ICpuZXdvYmo7CiAKLQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3b2JqID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc2xvd2VyKGMpKSB7Ci0JCQlpZiAoIXByZXZpb3VzX2lzX2Nhc2VkKQotCQkJICAgIGMgPSB0b3VwcGVyKGMpOwotCQkJcHJldmlvdXNfaXNfY2FzZWQgPSAxOwotCQl9IGVsc2UgaWYgKGlzdXBwZXIoYykpIHsKLQkJCWlmIChwcmV2aW91c19pc19jYXNlZCkKLQkJCSAgICBjID0gdG9sb3dlcihjKTsKLQkJCXByZXZpb3VzX2lzX2Nhc2VkID0gMTsKLQkJfSBlbHNlCi0JCQlwcmV2aW91c19pc19jYXNlZCA9IDA7Ci0JCSpzX25ldysrID0gYzsKLQl9Ci0JcmV0dXJuIG5ld29iajsKKyAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAobmV3b2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgIGlmIChpc2xvd2VyKGMpKSB7CisgICAgICAgICAgICBpZiAoIXByZXZpb3VzX2lzX2Nhc2VkKQorICAgICAgICAgICAgICAgIGMgPSB0b3VwcGVyKGMpOworICAgICAgICAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOworICAgICAgICB9IGVsc2UgaWYgKGlzdXBwZXIoYykpIHsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c19pc19jYXNlZCkKKyAgICAgICAgICAgICAgICBjID0gdG9sb3dlcihjKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDA7CisgICAgICAgICpzX25ldysrID0gYzsKKyAgICB9CisgICAgcmV0dXJuIG5ld29iajsKIH0KIAogUHlEb2NfU1RSVkFSKGNhcGl0YWxpemVfX2RvY19fLApAQCAtMjA3OCwzMSArMjA3OCwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19jYXBpdGFsaXplKFB5U3RyaW5nT2JqZWN0ICpzZWxmKQogewotCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKLQlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqbmV3b2JqOworICAgIGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKKyAgICBQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBQeU9iamVjdCAqbmV3b2JqOwogCi0JbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7Ci0JaWYgKDAgPCBuKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc2xvd2VyKGMpKQotCQkJKnNfbmV3ID0gdG91cHBlcihjKTsKLQkJZWxzZQotCQkJKnNfbmV3ID0gYzsKLQkJc19uZXcrKzsKLQl9Ci0JZm9yIChpID0gMTsgaSA8IG47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoaXN1cHBlcihjKSkKLQkJCSpzX25ldyA9IHRvbG93ZXIoYyk7Ci0JCWVsc2UKLQkJCSpzX25ldyA9IGM7Ci0JCXNfbmV3Kys7Ci0JfQotCXJldHVybiBuZXdvYmo7CisgICAgbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CisgICAgaWYgKDAgPCBuKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgIGlmIChpc2xvd2VyKGMpKQorICAgICAgICAgICAgKnNfbmV3ID0gdG91cHBlcihjKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnNfbmV3ID0gYzsKKyAgICAgICAgc19uZXcrKzsKKyAgICB9CisgICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICBpZiAoaXN1cHBlcihjKSkKKyAgICAgICAgICAgICpzX25ldyA9IHRvbG93ZXIoYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpzX25ldyA9IGM7CisgICAgICAgIHNfbmV3Kys7CisgICAgfQorICAgIHJldHVybiBuZXdvYmo7CiB9CiAKIApAQCAtMjExNiwzNyArMjExNiwzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19jb3VudChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnN1Yl9vYmo7Ci0JY29uc3QgY2hhciAqc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwotCVB5X3NzaXplX3Qgc3ViX2xlbjsKLQlQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7CisgICAgUHlPYmplY3QgKnN1Yl9vYmo7CisgICAgY29uc3QgY2hhciAqc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOworICAgIFB5X3NzaXplX3Qgc3ViX2xlbjsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjpjb3VudCIsICZzdWJfb2JqLAotCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6Y291bnQiLCAmc3ViX29iaiwKKyAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHN1Yl9vYmopKSB7Ci0JCXN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJfb2JqKTsKLQkJc3ViX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Yl9vYmopOwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3ViX29iaikpIHsKKyAgICAgICAgc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1Yl9vYmopOworICAgICAgICBzdWJfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3ViX29iaik7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3ViX29iaikpIHsKLQkJUHlfc3NpemVfdCBjb3VudDsKLQkJY291bnQgPSBQeVVuaWNvZGVfQ291bnQoKFB5T2JqZWN0ICopc2VsZiwgc3ViX29iaiwgc3RhcnQsIGVuZCk7Ci0JCWlmIChjb3VudCA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCQllbHNlCi0JCSAgICAJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKLQl9CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Yl9vYmopKSB7CisgICAgICAgIFB5X3NzaXplX3QgY291bnQ7CisgICAgICAgIGNvdW50ID0gUHlVbmljb2RlX0NvdW50KChQeU9iamVjdCAqKXNlbGYsIHN1Yl9vYmosIHN0YXJ0LCBlbmQpOworICAgICAgICBpZiAoY291bnQgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKKyAgICB9CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3ViX29iaiwgJnN1YiwgJnN1Yl9sZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3ViX29iaiwgJnN1YiwgJnN1Yl9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpKTsKKyAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoCi0JCXN0cmluZ2xpYl9jb3VudChzdHIgKyBzdGFydCwgZW5kIC0gc3RhcnQsIHN1Yiwgc3ViX2xlbiwgUFlfU1NJWkVfVF9NQVgpCi0JCSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KAorICAgICAgICBzdHJpbmdsaWJfY291bnQoc3RyICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBzdWIsIHN1Yl9sZW4sIFBZX1NTSVpFX1RfTUFYKQorICAgICAgICApOwogfQogCiBQeURvY19TVFJWQVIoc3dhcGNhc2VfX2RvY19fLApAQCAtMjE1OCwyNyArMjE1OCwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19zd2FwY2FzZShQeVN0cmluZ09iamVjdCAqc2VsZikKIHsKLQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc19uZXc7Ci0JUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JUHlPYmplY3QgKm5ld29iajsKKyAgICBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc19uZXc7CisgICAgUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgUHlPYmplY3QgKm5ld29iajsKIAotCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXdvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKLQkJaWYgKGlzbG93ZXIoYykpIHsKLQkJCSpzX25ldyA9IHRvdXBwZXIoYyk7Ci0JCX0KLQkJZWxzZSBpZiAoaXN1cHBlcihjKSkgewotCQkJKnNfbmV3ID0gdG9sb3dlcihjKTsKLQkJfQotCQllbHNlCi0JCQkqc19uZXcgPSBjOwotCQlzX25ldysrOwotCX0KLQlyZXR1cm4gbmV3b2JqOworICAgIG5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworICAgIGlmIChuZXdvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKKyAgICAgICAgaWYgKGlzbG93ZXIoYykpIHsKKyAgICAgICAgICAgICpzX25ldyA9IHRvdXBwZXIoYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXN1cHBlcihjKSkgeworICAgICAgICAgICAgKnNfbmV3ID0gdG9sb3dlcihjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqc19uZXcgPSBjOworICAgICAgICBzX25ldysrOworICAgIH0KKyAgICByZXR1cm4gbmV3b2JqOwogfQogCiAKQEAgLTIxOTMsMTI0ICsyMTkzLDEyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ190cmFuc2xhdGUoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJlZ2lzdGVyIGNoYXIgKmlucHV0LCAqb3V0cHV0OwotCWNvbnN0IGNoYXIgKnRhYmxlOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgYywgY2hhbmdlZCA9IDA7Ci0JUHlPYmplY3QgKmlucHV0X29iaiA9IChQeU9iamVjdCopc2VsZjsKLQljb25zdCBjaGFyICpvdXRwdXRfc3RhcnQsICpkZWxfdGFibGU9TlVMTDsKLQlQeV9zc2l6ZV90IGlubGVuLCB0YWJsZW4sIGRlbGxlbiA9IDA7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlpbnQgdHJhbnNfdGFibGVbMjU2XTsKLQlQeU9iamVjdCAqdGFibGVvYmosICpkZWxvYmogPSBOVUxMOworICAgIHJlZ2lzdGVyIGNoYXIgKmlucHV0LCAqb3V0cHV0OworICAgIGNvbnN0IGNoYXIgKnRhYmxlOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgYywgY2hhbmdlZCA9IDA7CisgICAgUHlPYmplY3QgKmlucHV0X29iaiA9IChQeU9iamVjdCopc2VsZjsKKyAgICBjb25zdCBjaGFyICpvdXRwdXRfc3RhcnQsICpkZWxfdGFibGU9TlVMTDsKKyAgICBQeV9zc2l6ZV90IGlubGVuLCB0YWJsZW4sIGRlbGxlbiA9IDA7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgdHJhbnNfdGFibGVbMjU2XTsKKyAgICBQeU9iamVjdCAqdGFibGVvYmosICpkZWxvYmogPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJhbnNsYXRlIiwgMSwgMiwKLQkJCSAgICAgICZ0YWJsZW9iaiwgJmRlbG9iaikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRyYW5zbGF0ZSIsIDEsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJsZW9iaiwgJmRlbG9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHRhYmxlb2JqKSkgewotCQl0YWJsZSA9IFB5U3RyaW5nX0FTX1NUUklORyh0YWJsZW9iaik7Ci0JCXRhYmxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRhYmxlb2JqKTsKLQl9Ci0JZWxzZSBpZiAodGFibGVvYmogPT0gUHlfTm9uZSkgewotCQl0YWJsZSA9IE5VTEw7Ci0JCXRhYmxlbiA9IDI1NjsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHRhYmxlb2JqKSkgeworICAgICAgICB0YWJsZSA9IFB5U3RyaW5nX0FTX1NUUklORyh0YWJsZW9iaik7CisgICAgICAgIHRhYmxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRhYmxlb2JqKTsKKyAgICB9CisgICAgZWxzZSBpZiAodGFibGVvYmogPT0gUHlfTm9uZSkgeworICAgICAgICB0YWJsZSA9IE5VTEw7CisgICAgICAgIHRhYmxlbiA9IDI1NjsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh0YWJsZW9iaikpIHsKLQkJLyogVW5pY29kZSAudHJhbnNsYXRlKCkgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZGVsZXRlY2hhcnMKLQkJICAgcGFyYW1ldGVyOyBpbnN0ZWFkIGEgbWFwcGluZyB0byBOb25lIHdpbGwgY2F1c2UgY2hhcmFjdGVycwotCQkgICB0byBiZSBkZWxldGVkLiAqLwotCQlpZiAoZGVsb2JqICE9IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiZGVsZXRpb25zIGFyZSBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseSBmb3IgdW5pY29kZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIFB5VW5pY29kZV9UcmFuc2xhdGUoKFB5T2JqZWN0ICopc2VsZiwgdGFibGVvYmosIE5VTEwpOwotCX0KKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodGFibGVvYmopKSB7CisgICAgICAgIC8qIFVuaWNvZGUgLnRyYW5zbGF0ZSgpIGRvZXMgbm90IHN1cHBvcnQgdGhlIGRlbGV0ZWNoYXJzCisgICAgICAgICAgIHBhcmFtZXRlcjsgaW5zdGVhZCBhIG1hcHBpbmcgdG8gTm9uZSB3aWxsIGNhdXNlIGNoYXJhY3RlcnMKKyAgICAgICAgICAgdG8gYmUgZGVsZXRlZC4gKi8KKyAgICAgICAgaWYgKGRlbG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImRlbGV0aW9ucyBhcmUgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgZm9yIHVuaWNvZGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfVHJhbnNsYXRlKChQeU9iamVjdCAqKXNlbGYsIHRhYmxlb2JqLCBOVUxMKTsKKyAgICB9CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodGFibGVvYmosICZ0YWJsZSwgJnRhYmxlbikpCi0JCXJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih0YWJsZW9iaiwgJnRhYmxlLCAmdGFibGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodGFibGVuICE9IDI1NikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJICAidHJhbnNsYXRpb24gdGFibGUgbXVzdCBiZSAyNTYgY2hhcmFjdGVycyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodGFibGVuICE9IDI1NikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAidHJhbnNsYXRpb24gdGFibGUgbXVzdCBiZSAyNTYgY2hhcmFjdGVycyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChkZWxvYmogIT0gTlVMTCkgewotCQlpZiAoUHlTdHJpbmdfQ2hlY2soZGVsb2JqKSkgewotCQkJZGVsX3RhYmxlID0gUHlTdHJpbmdfQVNfU1RSSU5HKGRlbG9iaik7Ci0JCQlkZWxsZW4gPSBQeVN0cmluZ19HRVRfU0laRShkZWxvYmopOwotCQl9CisgICAgaWYgKGRlbG9iaiAhPSBOVUxMKSB7CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhkZWxvYmopKSB7CisgICAgICAgICAgICBkZWxfdGFibGUgPSBQeVN0cmluZ19BU19TVFJJTkcoZGVsb2JqKTsKKyAgICAgICAgICAgIGRlbGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGRlbG9iaik7CisgICAgICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhkZWxvYmopKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImRlbGV0aW9ucyBhcmUgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgZm9yIHVuaWNvZGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhkZWxvYmopKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImRlbGV0aW9ucyBhcmUgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgZm9yIHVuaWNvZGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAjZW5kaWYKLQkJZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKGRlbG9iaiwgJmRlbF90YWJsZSwgJmRlbGxlbikpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCWRlbF90YWJsZSA9IE5VTEw7Ci0JCWRlbGxlbiA9IDA7Ci0JfQorICAgICAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoZGVsb2JqLCAmZGVsX3RhYmxlLCAmZGVsbGVuKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGVsX3RhYmxlID0gTlVMTDsKKyAgICAgICAgZGVsbGVuID0gMDsKKyAgICB9CiAKLQlpbmxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGlucHV0X29iaik7Ci0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBpbmxlbik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlvdXRwdXRfc3RhcnQgPSBvdXRwdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpOwotCWlucHV0ID0gUHlTdHJpbmdfQVNfU1RSSU5HKGlucHV0X29iaik7CisgICAgaW5sZW4gPSBQeVN0cmluZ19HRVRfU0laRShpbnB1dF9vYmopOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgaW5sZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3V0cHV0X3N0YXJ0ID0gb3V0cHV0ID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KTsKKyAgICBpbnB1dCA9IFB5U3RyaW5nX0FTX1NUUklORyhpbnB1dF9vYmopOwogCi0JaWYgKGRlbGxlbiA9PSAwICYmIHRhYmxlICE9IE5VTEwpIHsKLQkJLyogSWYgbm8gZGVsZXRpb25zIGFyZSByZXF1aXJlZCwgdXNlIGZhc3RlciBjb2RlICovCi0JCWZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7Ci0JCQljID0gUHlfQ0hBUk1BU0soKmlucHV0KyspOwotCQkJaWYgKFB5X0NIQVJNQVNLKCgqb3V0cHV0KysgPSB0YWJsZVtjXSkpICE9IGMpCi0JCQkJY2hhbmdlZCA9IDE7Ci0JCX0KLQkJaWYgKGNoYW5nZWQgfHwgIVB5U3RyaW5nX0NoZWNrRXhhY3QoaW5wdXRfb2JqKSkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeV9JTkNSRUYoaW5wdXRfb2JqKTsKLQkJcmV0dXJuIGlucHV0X29iajsKLQl9CisgICAgaWYgKGRlbGxlbiA9PSAwICYmIHRhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgLyogSWYgbm8gZGVsZXRpb25zIGFyZSByZXF1aXJlZCwgdXNlIGZhc3RlciBjb2RlICovCisgICAgICAgIGZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7CisgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKmlucHV0KyspOworICAgICAgICAgICAgaWYgKFB5X0NIQVJNQVNLKCgqb3V0cHV0KysgPSB0YWJsZVtjXSkpICE9IGMpCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYW5nZWQgfHwgIVB5U3RyaW5nX0NoZWNrRXhhY3QoaW5wdXRfb2JqKSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9JTkNSRUYoaW5wdXRfb2JqKTsKKyAgICAgICAgcmV0dXJuIGlucHV0X29iajsKKyAgICB9CiAKLQlpZiAodGFibGUgPT0gTlVMTCkgewotCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCQl0cmFuc190YWJsZVtpXSA9IFB5X0NIQVJNQVNLKGkpOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJCXRyYW5zX3RhYmxlW2ldID0gUHlfQ0hBUk1BU0sodGFibGVbaV0pOwotCX0KKyAgICBpZiAodGFibGUgPT0gTlVMTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICB0cmFuc190YWJsZVtpXSA9IFB5X0NIQVJNQVNLKGkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIHRyYW5zX3RhYmxlW2ldID0gUHlfQ0hBUk1BU0sodGFibGVbaV0pOworICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBkZWxsZW47IGkrKykKLQkJdHJhbnNfdGFibGVbKGludCkgUHlfQ0hBUk1BU0soZGVsX3RhYmxlW2ldKV0gPSAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVsbGVuOyBpKyspCisgICAgICAgIHRyYW5zX3RhYmxlWyhpbnQpIFB5X0NIQVJNQVNLKGRlbF90YWJsZVtpXSldID0gLTE7CiAKLQlmb3IgKGkgPSBpbmxlbjsgLS1pID49IDA7ICkgewotCQljID0gUHlfQ0hBUk1BU0soKmlucHV0KyspOwotCQlpZiAodHJhbnNfdGFibGVbY10gIT0gLTEpCi0JCQlpZiAoUHlfQ0hBUk1BU0soKm91dHB1dCsrID0gKGNoYXIpdHJhbnNfdGFibGVbY10pID09IGMpCi0JCQkJY29udGludWU7Ci0JCWNoYW5nZWQgPSAxOwotCX0KLQlpZiAoIWNoYW5nZWQgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChpbnB1dF9vYmopKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeV9JTkNSRUYoaW5wdXRfb2JqKTsKLQkJcmV0dXJuIGlucHV0X29iajsKLQl9Ci0JLyogRml4IHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nICovCi0JaWYgKGlubGVuID4gMCAmJiBfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIG91dHB1dCAtIG91dHB1dF9zdGFydCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiByZXN1bHQ7CisgICAgZm9yIChpID0gaW5sZW47IC0taSA+PSAwOyApIHsKKyAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCppbnB1dCsrKTsKKyAgICAgICAgaWYgKHRyYW5zX3RhYmxlW2NdICE9IC0xKQorICAgICAgICAgICAgaWYgKFB5X0NIQVJNQVNLKCpvdXRwdXQrKyA9IChjaGFyKXRyYW5zX3RhYmxlW2NdKSA9PSBjKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICB9CisgICAgaWYgKCFjaGFuZ2VkICYmIFB5U3RyaW5nX0NoZWNrRXhhY3QoaW5wdXRfb2JqKSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfSU5DUkVGKGlucHV0X29iaik7CisgICAgICAgIHJldHVybiBpbnB1dF9vYmo7CisgICAgfQorICAgIC8qIEZpeCB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyAqLworICAgIGlmIChpbmxlbiA+IDAgJiYgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBvdXRwdXQgLSBvdXRwdXRfc3RhcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKIC8qIGZpbmQgYW5kIGNvdW50IGNoYXJhY3RlcnMgYW5kIHN1YnN0cmluZ3MgKi8KIAotI2RlZmluZSBmaW5kY2hhcih0YXJnZXQsIHRhcmdldF9sZW4sIGMpCQkJCVwKKyNkZWZpbmUgZmluZGNoYXIodGFyZ2V0LCB0YXJnZXRfbGVuLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICgoY2hhciAqKW1lbWNocigoY29uc3Qgdm9pZCAqKSh0YXJnZXQpLCBjLCB0YXJnZXRfbGVuKSkKIAogLyogU3RyaW5nIG9wcyBtdXN0IHJldHVybiBhIHN0cmluZy4gICovCkBAIC0yMzE4LDI5ICsyMzE4LDI5IEBACiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmV0dXJuX3NlbGYoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gc2VsZjsKLQl9Ci0JcmV0dXJuIChQeVN0cmluZ09iamVjdCAqKVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQlQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksCi0JCVB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgeworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKyAgICByZXR1cm4gKFB5U3RyaW5nT2JqZWN0ICopUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwKKyAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikpOwogfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKIGNvdW50Y2hhcihjb25zdCBjaGFyICp0YXJnZXQsIGludCB0YXJnZXRfbGVuLCBjaGFyIGMsIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JUHlfc3NpemVfdCBjb3VudD0wOwotCWNvbnN0IGNoYXIgKnN0YXJ0PXRhcmdldDsKLQljb25zdCBjaGFyICplbmQ9dGFyZ2V0K3RhcmdldF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudD0wOworICAgIGNvbnN0IGNoYXIgKnN0YXJ0PXRhcmdldDsKKyAgICBjb25zdCBjaGFyICplbmQ9dGFyZ2V0K3RhcmdldF9sZW47CiAKLQl3aGlsZSAoIChzdGFydD1maW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBjKSkgIT0gTlVMTCApIHsKLQkJY291bnQrKzsKLQkJaWYgKGNvdW50ID49IG1heGNvdW50KQotCQkJYnJlYWs7Ci0JCXN0YXJ0ICs9IDE7Ci0JfQotCXJldHVybiBjb3VudDsKKyAgICB3aGlsZSAoIChzdGFydD1maW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBjKSkgIT0gTlVMTCApIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgaWYgKGNvdW50ID49IG1heGNvdW50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKIH0KIAogCkBAIC0yMzQ5LDQ2MCArMjM0OSw0NjAgQEAKIC8qIGxlbihzZWxmKT49MSwgZnJvbT0iIiwgbGVuKHRvKT49MSwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX2ludGVybGVhdmUoUHlTdHJpbmdPYmplY3QgKnNlbGYsCi0JCSAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotCQkgICBQeV9zc2l6ZV90IG1heGNvdW50KQorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLQlQeV9zc2l6ZV90IGNvdW50LCBpLCBwcm9kdWN0OwotCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50LCBpLCBwcm9kdWN0OworICAgIFB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CiAKLQlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworICAgIHNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAKLQkvKiAxIGF0IHRoZSBlbmQgcGx1cyAxIGFmdGVyIGV2ZXJ5IGNoYXJhY3RlciAqLwotCWNvdW50ID0gc2VsZl9sZW4rMTsKLQlpZiAobWF4Y291bnQgPCBjb3VudCkgCi0JCWNvdW50ID0gbWF4Y291bnQ7CisgICAgLyogMSBhdCB0aGUgZW5kIHBsdXMgMSBhZnRlciBldmVyeSBjaGFyYWN0ZXIgKi8KKyAgICBjb3VudCA9IHNlbGZfbGVuKzE7CisgICAgaWYgKG1heGNvdW50IDwgY291bnQpCisgICAgICAgIGNvdW50ID0gbWF4Y291bnQ7CiAKLQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQkvKiAgIHJlc3VsdF9sZW4gPSBjb3VudCAqIHRvX2xlbiArIHNlbGZfbGVuOyAqLwotCXByb2R1Y3QgPSBjb3VudCAqIHRvX2xlbjsKLQlpZiAocHJvZHVjdCAvIHRvX2xlbiAhPSBjb3VudCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdF9sZW4gPSBwcm9kdWN0ICsgc2VsZl9sZW47Ci0JaWYgKHJlc3VsdF9sZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0gIAotCWlmICghIChyZXN1bHQgPSAoUHlTdHJpbmdPYmplY3QgKikKLQkgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSApCi0JCXJldHVybiBOVUxMOworICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLworICAgIC8qICAgcmVzdWx0X2xlbiA9IGNvdW50ICogdG9fbGVuICsgc2VsZl9sZW47ICovCisgICAgcHJvZHVjdCA9IGNvdW50ICogdG9fbGVuOworICAgIGlmIChwcm9kdWN0IC8gdG9fbGVuICE9IGNvdW50KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfbGVuID0gcHJvZHVjdCArIHNlbGZfbGVuOworICAgIGlmIChyZXN1bHRfbGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICBpZiAoISAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFRPRE86IHNwZWNpYWwgY2FzZSBzaW5nbGUgY2hhcmFjdGVyLCB3aGljaCBkb2Vzbid0IG5lZWQgbWVtY3B5ICovCisgICAgc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIHJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CiAKLQkvKiBMYXkgdGhlIGZpcnN0IG9uZSBkb3duIChndWFyYW50ZWVkIHRoaXMgd2lsbCBvY2N1cikgKi8KLQlQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0JcmVzdWx0X3MgKz0gdG9fbGVuOwotCWNvdW50IC09IDE7Ci0gIAotCWZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKLQkJKnJlc3VsdF9zKysgPSAqc2VsZl9zKys7Ci0JCVB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLQkJcmVzdWx0X3MgKz0gdG9fbGVuOwotCX0KKyAgICAvKiBUT0RPOiBzcGVjaWFsIGNhc2Ugc2luZ2xlIGNoYXJhY3Rlciwgd2hpY2ggZG9lc24ndCBuZWVkIG1lbWNweSAqLwogCi0JLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0JUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuLWkpOworICAgIC8qIExheSB0aGUgZmlyc3Qgb25lIGRvd24gKGd1YXJhbnRlZWQgdGhpcyB3aWxsIG9jY3VyKSAqLworICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgY291bnQgLT0gMTsKIAotCXJldHVybiByZXN1bHQ7CisgICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgeworICAgICAgICAqcmVzdWx0X3MrKyA9ICpzZWxmX3MrKzsKKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgfQorCisgICAgLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCisgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuLWkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogU3BlY2lhbCBjYXNlIGZvciBkZWxldGluZyBhIHNpbmdsZSBjaGFyYWN0ZXIgKi8KIC8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT0xLCB0bz0iIiwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX2RlbGV0ZV9zaW5nbGVfY2hhcmFjdGVyKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkJCWNoYXIgZnJvbV9jLCBQeV9zc2l6ZV90IG1heGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQljaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLQljaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLQlQeV9zc2l6ZV90IGNvdW50OwotCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7CisgICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudDsKKyAgICBQeVN0cmluZ09iamVjdCAqcmVzdWx0OwogCi0Jc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAKLQljb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKLQlpZiAoY291bnQgPT0gMCkgewotCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0JfQotICAKLQlyZXN1bHRfbGVuID0gc2VsZl9sZW4gLSBjb3VudDsgIC8qIGZyb21fbGVuID09IDEgKi8KLQlhc3NlcnQocmVzdWx0X2xlbj49MCk7CisgICAgY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KIAotCWlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQotCSAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gLSBjb3VudDsgIC8qIGZyb21fbGVuID09IDEgKi8KKyAgICBhc3NlcnQocmVzdWx0X2xlbj49MCk7CiAKLQlzdGFydCA9IHNlbGZfczsKLQllbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLQl3aGlsZSAoY291bnQtLSA+IDApIHsKLQkJbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7Ci0JCWlmIChuZXh0ID09IE5VTEwpCi0JCQlicmVhazsKLQkJUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0JCXJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLQkJc3RhcnQgPSBuZXh0KzE7Ci0JfQotCVB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7CisgICAgaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICBzdGFydCA9IHNlbGZfczsKKyAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKKyAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7CisgICAgICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7CisgICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKKyAgICAgICAgc3RhcnQgPSBuZXh0KzE7CisgICAgfQorICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgdG89IiIsIG1heGNvdW50Pj0xICovCiAKIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoUHlTdHJpbmdPYmplY3QgKnNlbGYsCi0JCQkgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotCQkJIFB5X3NzaXplX3QgbWF4Y291bnQpIHsKLQljaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLQljaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLQlQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7Ci0JUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkgeworICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOworICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKKyAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOworICAgIFB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKKyAgICBQeVN0cmluZ09iamVjdCAqcmVzdWx0OwogCi0Jc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAKLQljb3VudCA9IHN0cmluZ2xpYl9jb3VudChzZWxmX3MsIHNlbGZfbGVuLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y291bnQpOworICAgIGNvdW50ID0gc3RyaW5nbGliX2NvdW50KHNlbGZfcywgc2VsZl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7CiAKLQlpZiAoY291bnQgPT0gMCkgewotCQkvKiBubyBtYXRjaGVzICovCi0JCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLQl9CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgLyogbm8gbWF0Y2hlcyAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQogCi0JcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gKGNvdW50ICogZnJvbV9sZW4pOwotCWFzc2VydCAocmVzdWx0X2xlbj49MCk7CisgICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gKGNvdW50ICogZnJvbV9sZW4pOworICAgIGFzc2VydCAocmVzdWx0X2xlbj49MCk7CiAKLQlpZiAoIChyZXN1bHQgPSAoUHlTdHJpbmdPYmplY3QgKikKLQkgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOworICAgIGlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQorICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOworICAgIHJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CiAKLQlzdGFydCA9IHNlbGZfczsKLQllbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLQl3aGlsZSAoY291bnQtLSA+IDApIHsKLQkJb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZC1zdGFydCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0JCWlmIChvZmZzZXQgPT0gLTEpCi0JCQlicmVhazsKLQkJbmV4dCA9IHN0YXJ0ICsgb2Zmc2V0OworICAgIHN0YXJ0ID0gc2VsZl9zOworICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOworICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuZXh0ID0gc3RhcnQgKyBvZmZzZXQ7CiAKLQkJUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7CisgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwogCi0JCXJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLQkJc3RhcnQgPSBuZXh0K2Zyb21fbGVuOwotCX0KLQlQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKKyAgICAgICAgc3RhcnQgPSBuZXh0K2Zyb21fbGVuOworICAgIH0KKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT1sZW4odG8pPT0xLCBtYXhjb3VudD49MSAqLwogUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3Rlcl9pbl9wbGFjZShQeVN0cmluZ09iamVjdCAqc2VsZiwKLQkJCQkgIGNoYXIgZnJvbV9jLCBjaGFyIHRvX2MsCi0JCQkJICBQeV9zc2l6ZV90IG1heGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZnJvbV9jLCBjaGFyIHRvX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQljaGFyICpzZWxmX3MsICpyZXN1bHRfcywgKnN0YXJ0LCAqZW5kLCAqbmV4dDsKLQlQeV9zc2l6ZV90IHNlbGZfbGVuOwotCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3MsICpzdGFydCwgKmVuZCwgKm5leHQ7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbjsKKyAgICBQeVN0cmluZ09iamVjdCAqcmVzdWx0OwogCi0JLyogVGhlIHJlc3VsdCBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCi0Jc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgLyogVGhlIHJlc3VsdCBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCisgICAgc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIHNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAKLQluZXh0ID0gZmluZGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jKTsKKyAgICBuZXh0ID0gZmluZGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jKTsKIAotCWlmIChuZXh0ID09IE5VTEwpIHsKLQkJLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLQkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotCX0KKyAgICBpZiAobmV4dCA9PSBOVUxMKSB7CisgICAgICAgIC8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CiAKLQkvKiBOZWVkIHRvIG1ha2UgYSBuZXcgc3RyaW5nICovCi0JcmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7Ci0JUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKKyAgICAvKiBOZWVkIHRvIG1ha2UgYSBuZXcgc3RyaW5nICovCisgICAgcmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKIAotCS8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCi0Jc3RhcnQgPSAgcmVzdWx0X3MgKyAobmV4dC1zZWxmX3MpOwotCSpzdGFydCA9IHRvX2M7Ci0Jc3RhcnQrKzsKLQllbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOworICAgIC8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCisgICAgc3RhcnQgPSAgcmVzdWx0X3MgKyAobmV4dC1zZWxmX3MpOworICAgICpzdGFydCA9IHRvX2M7CisgICAgc3RhcnQrKzsKKyAgICBlbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOwogCi0Jd2hpbGUgKC0tbWF4Y291bnQgPiAwKSB7Ci0JCW5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotCQlpZiAobmV4dCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCSpuZXh0ID0gdG9fYzsKLQkJc3RhcnQgPSBuZXh0KzE7Ci0JfQorICAgIHdoaWxlICgtLW1heGNvdW50ID4gMCkgeworICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAqbmV4dCA9IHRvX2M7CisgICAgICAgIHN0YXJ0ID0gbmV4dCsxOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PWxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoUHlTdHJpbmdPYmplY3QgKnNlbGYsCi0JCQkgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0JCQkgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLQkJCSAgIFB5X3NzaXplX3QgbWF4Y291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JY2hhciAqcmVzdWx0X3MsICpzdGFydCwgKmVuZDsKLQljaGFyICpzZWxmX3M7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgb2Zmc2V0OwotCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqcmVzdWx0X3MsICpzdGFydCwgKmVuZDsKKyAgICBjaGFyICpzZWxmX3M7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgb2Zmc2V0OworICAgIFB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CiAKLQkvKiBUaGUgcmVzdWx0IHN0cmluZyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KKyAgICAvKiBUaGUgcmVzdWx0IHN0cmluZyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KIAotCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKLQlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworICAgIHNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICBzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogCi0Jb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc2VsZl9zLCBzZWxmX2xlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotCSAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCWlmIChvZmZzZXQgPT0gLTEpIHsKLQkJLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLQkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotCX0KKyAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzZWxmX3MsIHNlbGZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKG9mZnNldCA9PSAtMSkgeworICAgICAgICAvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQogCi0JLyogTmVlZCB0byBtYWtlIGEgbmV3IHN0cmluZyAqLwotCXJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwotCVB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7CisgICAgLyogTmVlZCB0byBtYWtlIGEgbmV3IHN0cmluZyAqLworICAgIHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7CiAKLQkvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLwotCXN0YXJ0ID0gIHJlc3VsdF9zICsgb2Zmc2V0OwotCVB5X01FTUNQWShzdGFydCwgdG9fcywgZnJvbV9sZW4pOwotCXN0YXJ0ICs9IGZyb21fbGVuOwotCWVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47CisgICAgLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KKyAgICBzdGFydCA9ICByZXN1bHRfcyArIG9mZnNldDsKKyAgICBQeV9NRU1DUFkoc3RhcnQsIHRvX3MsIGZyb21fbGVuKTsKKyAgICBzdGFydCArPSBmcm9tX2xlbjsKKyAgICBlbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOwogCi0Jd2hpbGUgKCAtLW1heGNvdW50ID4gMCkgewotCQlvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAotCQkgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQkJaWYgKG9mZnNldD09LTEpCi0JCQlicmVhazsKLQkJUHlfTUVNQ1BZKHN0YXJ0K29mZnNldCwgdG9fcywgZnJvbV9sZW4pOwotCQlzdGFydCArPSBvZmZzZXQrZnJvbV9sZW47Ci0JfQorICAgIHdoaWxlICggLS1tYXhjb3VudCA+IDApIHsKKyAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZC1zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGlmIChvZmZzZXQ9PS0xKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIFB5X01FTUNQWShzdGFydCtvZmZzZXQsIHRvX3MsIGZyb21fbGVuKTsKKyAgICAgICAgc3RhcnQgKz0gb2Zmc2V0K2Zyb21fbGVuOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PTEsIGxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkJIGNoYXIgZnJvbV9jLAotCQkJIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotCQkJIFB5X3NzaXplX3QgbWF4Y291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQljaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLQljaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLQlQeV9zc2l6ZV90IGNvdW50LCBwcm9kdWN0OwotCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7CisgICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudCwgcHJvZHVjdDsKKyAgICBQeVN0cmluZ09iamVjdCAqcmVzdWx0OwogCi0Jc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIHNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAKLQljb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKLQlpZiAoY291bnQgPT0gMCkgewotCQkvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCi0JCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLQl9CisgICAgY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQogCi0JLyogdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBhbmQgbmV3LCBoZW5jZSB0aGUgIi0xIiAqLwotCS8qICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLTEpICAqLwotCXByb2R1Y3QgPSBjb3VudCAqICh0b19sZW4tMSk7Ci0JaWYgKHByb2R1Y3QgLyAodG9fbGVuLTEpICE9IGNvdW50KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIHByb2R1Y3Q7Ci0JaWYgKHJlc3VsdF9sZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG5ldywgaGVuY2UgdGhlICItMSIgKi8KKyAgICAvKiAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi0xKSAgKi8KKyAgICBwcm9kdWN0ID0gY291bnQgKiAodG9fbGVuLTEpOworICAgIGlmIChwcm9kdWN0IC8gKHRvX2xlbi0xKSAhPSBjb3VudCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBwcm9kdWN0OworICAgIGlmIChyZXN1bHRfbGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQotCSAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOworICAgIGlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQorICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwogCi0Jc3RhcnQgPSBzZWxmX3M7Ci0JZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0Jd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0JCW5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotCQlpZiAobmV4dCA9PSBOVUxMKSAKLQkJCWJyZWFrOworICAgIHN0YXJ0ID0gc2VsZl9zOworICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOworICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWlmIChuZXh0ID09IHN0YXJ0KSB7Ci0JCQkvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KLQkJCVB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLQkJCXJlc3VsdF9zICs9IHRvX2xlbjsKLQkJCXN0YXJ0ICs9IDE7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KLQkJCVB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotCQkJcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotCQkJUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotCQkJcmVzdWx0X3MgKz0gdG9fbGVuOwotCQkJc3RhcnQgPSBuZXh0KzE7Ci0JCX0KLQl9Ci0JLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgc3RyaW5nICovCi0JUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKKyAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQpIHsKKyAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICAgICAgc3RhcnQgKz0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7CisgICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7CisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisgICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgICAgICBzdGFydCA9IG5leHQrMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBzdHJpbmcgKi8KKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgbGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX3N1YnN0cmluZyhQeVN0cmluZ09iamVjdCAqc2VsZiwKLQkJICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0JCSAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0JCSAgUHlfc3NpemVfdCBtYXhjb3VudCkgewotCWNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotCWNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLQlQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotCVB5X3NzaXplX3QgY291bnQsIG9mZnNldCwgcHJvZHVjdDsKLQlQeVN0cmluZ09iamVjdCAqcmVzdWx0OworICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCisgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KSB7CisgICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7CisgICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0LCBwcm9kdWN0OworICAgIFB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CiAKLQlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0Jc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKIAotCWNvdW50ID0gc3RyaW5nbGliX2NvdW50KHNlbGZfcywgc2VsZl9sZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7CisgICAgY291bnQgPSBzdHJpbmdsaWJfY291bnQoc2VsZl9zLCBzZWxmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvdW50KTsKIAotCWlmIChjb3VudCA9PSAwKSB7Ci0JCS8qIG5vIG1hdGNoZXMsIHJldHVybiB1bmNoYW5nZWQgKi8KLQkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotCX0KKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CiAKLQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQkvKiAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pICovCi0JcHJvZHVjdCA9IGNvdW50ICogKHRvX2xlbi1mcm9tX2xlbik7Ci0JaWYgKHByb2R1Y3QgLyAodG9fbGVuLWZyb21fbGVuKSAhPSBjb3VudCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBwcm9kdWN0OwotCWlmIChyZXN1bHRfbGVuIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICAvKiAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pICovCisgICAgcHJvZHVjdCA9IGNvdW50ICogKHRvX2xlbi1mcm9tX2xlbik7CisgICAgaWYgKHByb2R1Y3QgLyAodG9fbGVuLWZyb21fbGVuKSAhPSBjb3VudCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBwcm9kdWN0OworICAgIGlmIChyZXN1bHRfbGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQotCSAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOworICAgIGlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQorICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwogCi0Jc3RhcnQgPSBzZWxmX3M7Ci0JZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0Jd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0JCW9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQtc3RhcnQsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCQlpZiAob2Zmc2V0ID09IC0xKQotCQkJYnJlYWs7Ci0JCW5leHQgPSBzdGFydCtvZmZzZXQ7Ci0JCWlmIChuZXh0ID09IHN0YXJ0KSB7Ci0JCQkvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KLQkJCVB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLQkJCXJlc3VsdF9zICs9IHRvX2xlbjsKLQkJCXN0YXJ0ICs9IGZyb21fbGVuOwotCQl9IGVsc2UgewotCQkJLyogY29weSB0aGUgdW5jaGFuZ2VkIG9sZCB0aGVuIHRoZSAndG8nICovCi0JCQlQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLQkJCXJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLQkJCVB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLQkJCXJlc3VsdF9zICs9IHRvX2xlbjsKLQkJCXN0YXJ0ID0gbmV4dCtmcm9tX2xlbjsKLQkJfQotCX0KLQkvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBzdHJpbmcgKi8KLQlQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOworICAgIHN0YXJ0ID0gc2VsZl9zOworICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOworICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuZXh0ID0gc3RhcnQrb2Zmc2V0OworICAgICAgICBpZiAobmV4dCA9PSBzdGFydCkgeworICAgICAgICAgICAgLyogcmVwbGFjZSB3aXRoIHRoZSAndG8nICovCisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisgICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgICAgICBzdGFydCArPSBmcm9tX2xlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7CisgICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7CisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisgICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgICAgICBzdGFydCA9IG5leHQrZnJvbV9sZW47CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgc3RyaW5nICovCisgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmVwbGFjZShQeVN0cmluZ09iamVjdCAqc2VsZiwKLQljb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0JY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0JUHlfc3NpemVfdCBtYXhjb3VudCkKKyAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCisgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCisgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQlpZiAobWF4Y291bnQgPCAwKSB7Ci0JCW1heGNvdW50ID0gUFlfU1NJWkVfVF9NQVg7Ci0JfSBlbHNlIGlmIChtYXhjb3VudCA9PSAwIHx8IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDApIHsKLQkJLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLQkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotCX0KKyAgICBpZiAobWF4Y291bnQgPCAwKSB7CisgICAgICAgIG1heGNvdW50ID0gUFlfU1NJWkVfVF9NQVg7CisgICAgfSBlbHNlIGlmIChtYXhjb3VudCA9PSAwIHx8IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDApIHsKKyAgICAgICAgLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KIAotCWlmIChtYXhjb3VudCA9PSAwIHx8Ci0JICAgIChmcm9tX2xlbiA9PSAwICYmIHRvX2xlbiA9PSAwKSkgewotCQkvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0JfQorICAgIGlmIChtYXhjb3VudCA9PSAwIHx8CisgICAgICAgIChmcm9tX2xlbiA9PSAwICYmIHRvX2xlbiA9PSAwKSkgeworICAgICAgICAvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQogCi0JLyogSGFuZGxlIHplcm8tbGVuZ3RoIHNwZWNpYWwgY2FzZXMgKi8KKyAgICAvKiBIYW5kbGUgemVyby1sZW5ndGggc3BlY2lhbCBjYXNlcyAqLwogCi0JaWYgKGZyb21fbGVuID09IDApIHsKLQkJLyogaW5zZXJ0IHRoZSAndG8nIHN0cmluZyBldmVyeXdoZXJlLiAgICovCi0JCS8qICAgID4+PiAiUHl0aG9uIi5yZXBsYWNlKCIiLCAiLiIpICAgICAqLwotCQkvKiAgICAnLlAueS50Lmguby5uLicgICAgICAgICAgICAgICAgICAgKi8KLQkJcmV0dXJuIHJlcGxhY2VfaW50ZXJsZWF2ZShzZWxmLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLQl9CisgICAgaWYgKGZyb21fbGVuID09IDApIHsKKyAgICAgICAgLyogaW5zZXJ0IHRoZSAndG8nIHN0cmluZyBldmVyeXdoZXJlLiAgICovCisgICAgICAgIC8qICAgID4+PiAiUHl0aG9uIi5yZXBsYWNlKCIiLCAiLiIpICAgICAqLworICAgICAgICAvKiAgICAnLlAueS50Lmguby5uLicgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIHJlcGxhY2VfaW50ZXJsZWF2ZShzZWxmLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKKyAgICB9CiAKLQkvKiBFeGNlcHQgZm9yICIiLnJlcGxhY2UoIiIsICJBIikgPT0gIkEiIHRoZXJlIGlzIG5vIHdheSBiZXlvbmQgdGhpcyAqLwotCS8qIHBvaW50IGZvciBhbiBlbXB0eSBzZWxmIHN0cmluZyB0byBnZW5lcmF0ZSBhIG5vbi1lbXB0eSBzdHJpbmcgKi8KLQkvKiBTcGVjaWFsIGNhc2Ugc28gdGhlIHJlbWFpbmluZyBjb2RlIGFsd2F5cyBnZXRzIGEgbm9uLWVtcHR5IHN0cmluZyAqLwotCWlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAwKSB7Ci0JCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLQl9CisgICAgLyogRXhjZXB0IGZvciAiIi5yZXBsYWNlKCIiLCAiQSIpID09ICJBIiB0aGVyZSBpcyBubyB3YXkgYmV5b25kIHRoaXMgKi8KKyAgICAvKiBwb2ludCBmb3IgYW4gZW1wdHkgc2VsZiBzdHJpbmcgdG8gZ2VuZXJhdGUgYSBub24tZW1wdHkgc3RyaW5nICovCisgICAgLyogU3BlY2lhbCBjYXNlIHNvIHRoZSByZW1haW5pbmcgY29kZSBhbHdheXMgZ2V0cyBhIG5vbi1lbXB0eSBzdHJpbmcgKi8KKyAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkgeworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQogCi0JaWYgKHRvX2xlbiA9PSAwKSB7Ci0JCS8qIGRlbGV0ZSBhbGwgb2NjdXJhbmNlcyBvZiAnZnJvbScgc3RyaW5nICovCi0JCWlmIChmcm9tX2xlbiA9PSAxKSB7Ci0JCQlyZXR1cm4gcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcigKLQkJCQlzZWxmLCBmcm9tX3NbMF0sIG1heGNvdW50KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiByZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgbWF4Y291bnQpOwotCQl9Ci0JfQorICAgIGlmICh0b19sZW4gPT0gMCkgeworICAgICAgICAvKiBkZWxldGUgYWxsIG9jY3VyYW5jZXMgb2YgJ2Zyb20nIHN0cmluZyAqLworICAgICAgICBpZiAoZnJvbV9sZW4gPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VfZGVsZXRlX3NpbmdsZV9jaGFyYWN0ZXIoCisgICAgICAgICAgICAgICAgc2VsZiwgZnJvbV9zWzBdLCBtYXhjb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIG1heGNvdW50KTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIEhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlcmUgYm90aCBzdHJpbmdzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoICovCisgICAgLyogSGFuZGxlIHNwZWNpYWwgY2FzZSB3aGVyZSBib3RoIHN0cmluZ3MgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKi8KIAotCWlmIChmcm9tX2xlbiA9PSB0b19sZW4pIHsKLQkJaWYgKGZyb21fbGVuID09IDEpIHsKLQkJCXJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoCi0JCQkJc2VsZiwKLQkJCQlmcm9tX3NbMF0sCi0JCQkJdG9fc1swXSwKLQkJCQltYXhjb3VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoCi0JCQkJc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0JCX0KLQl9CisgICAgaWYgKGZyb21fbGVuID09IHRvX2xlbikgeworICAgICAgICBpZiAoZnJvbV9sZW4gPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3Rlcl9pbl9wbGFjZSgKKyAgICAgICAgICAgICAgICBzZWxmLAorICAgICAgICAgICAgICAgIGZyb21fc1swXSwKKyAgICAgICAgICAgICAgICB0b19zWzBdLAorICAgICAgICAgICAgICAgIG1heGNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZSgKKyAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIE90aGVyd2lzZSB1c2UgdGhlIG1vcmUgZ2VuZXJpYyBhbGdvcml0aG1zICovCi0JaWYgKGZyb21fbGVuID09IDEpIHsKLQkJcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihzZWxmLCBmcm9tX3NbMF0sCi0JCQkJCQl0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLQl9IGVsc2UgewotCQkvKiBsZW4oJ2Zyb20nKT49MiwgbGVuKCd0bycpPj0xICovCi0JCXJldHVybiByZXBsYWNlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLQl9CisgICAgLyogT3RoZXJ3aXNlIHVzZSB0aGUgbW9yZSBnZW5lcmljIGFsZ29yaXRobXMgKi8KKyAgICBpZiAoZnJvbV9sZW4gPT0gMSkgeworICAgICAgICByZXR1cm4gcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyKHNlbGYsIGZyb21fc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBsZW4oJ2Zyb20nKT49MiwgbGVuKCd0bycpPj0xICovCisgICAgICAgIHJldHVybiByZXBsYWNlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihyZXBsYWNlX19kb2NfXywKQEAgLTI4MTUsNDEgKzI4MTUsNDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcmVwbGFjZShQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBjb3VudCA9IC0xOwotCVB5T2JqZWN0ICpmcm9tLCAqdG87Ci0JY29uc3QgY2hhciAqZnJvbV9zLCAqdG9fczsKLQlQeV9zc2l6ZV90IGZyb21fbGVuLCB0b19sZW47CisgICAgUHlfc3NpemVfdCBjb3VudCA9IC0xOworICAgIFB5T2JqZWN0ICpmcm9tLCAqdG87CisgICAgY29uc3QgY2hhciAqZnJvbV9zLCAqdG9fczsKKyAgICBQeV9zc2l6ZV90IGZyb21fbGVuLCB0b19sZW47CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PfG46cmVwbGFjZSIsICZmcm9tLCAmdG8sICZjb3VudCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098bjpyZXBsYWNlIiwgJmZyb20sICZ0bywgJmNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2soZnJvbSkpIHsKLQkJZnJvbV9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZyb20pOwotCQlmcm9tX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGZyb20pOwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZnJvbSkpIHsKKyAgICAgICAgZnJvbV9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZyb20pOworICAgICAgICBmcm9tX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGZyb20pOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhmcm9tKSkKLQkJcmV0dXJuIFB5VW5pY29kZV9SZXBsYWNlKChQeU9iamVjdCAqKXNlbGYsCi0JCQkJCSBmcm9tLCB0bywgY291bnQpOworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZnJvbSkpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfUmVwbGFjZSgoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSwgdG8sIGNvdW50KTsKICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihmcm9tLCAmZnJvbV9zLCAmZnJvbV9sZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoZnJvbSwgJmZyb21fcywgJmZyb21fbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sodG8pKSB7Ci0JCXRvX3MgPSBQeVN0cmluZ19BU19TVFJJTkcodG8pOwotCQl0b19sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh0byk7Ci0JfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh0bykpIHsKKyAgICAgICAgdG9fcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0byk7CisgICAgICAgIHRvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRvKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh0bykpCi0JCXJldHVybiBQeVVuaWNvZGVfUmVwbGFjZSgoUHlPYmplY3QgKilzZWxmLAotCQkJCQkgZnJvbSwgdG8sIGNvdW50KTsKKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodG8pKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX1JlcGxhY2UoKFB5T2JqZWN0ICopc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20sIHRvLCBjb3VudCk7CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodG8sICZ0b19zLCAmdG9fbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHRvLCAmdG9fcywgJnRvX2xlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKXJlcGxhY2UoKFB5U3RyaW5nT2JqZWN0ICopIHNlbGYsCi0JCQkJICAgZnJvbV9zLCBmcm9tX2xlbiwKLQkJCQkgICB0b19zLCB0b19sZW4sIGNvdW50KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVwbGFjZSgoUHlTdHJpbmdPYmplY3QgKikgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3MsIHRvX2xlbiwgY291bnQpOwogfQogCiAvKiogRW5kIERBTEtFICoqLwpAQCAtMjg2MCw0MyArMjg2MCw0MyBAQAogICovCiBQeV9MT0NBTChpbnQpCiBfc3RyaW5nX3RhaWxtYXRjaChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnN1YnN0ciwgUHlfc3NpemVfdCBzdGFydCwKLQkJICBQeV9zc2l6ZV90IGVuZCwgaW50IGRpcmVjdGlvbikKKyAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kLCBpbnQgZGlyZWN0aW9uKQogewotCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JUHlfc3NpemVfdCBzbGVuOwotCWNvbnN0IGNoYXIqIHN1YjsKLQljb25zdCBjaGFyKiBzdHI7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBQeV9zc2l6ZV90IHNsZW47CisgICAgY29uc3QgY2hhciogc3ViOworICAgIGNvbnN0IGNoYXIqIHN0cjsKIAotCWlmIChQeVN0cmluZ19DaGVjayhzdWJzdHIpKSB7Ci0JCXN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJzdHIpOwotCQlzbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vic3RyKTsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHN1YnN0cikpIHsKKyAgICAgICAgc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1YnN0cik7CisgICAgICAgIHNsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJzdHIpOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1YnN0cikpCi0JCXJldHVybiBQeVVuaWNvZGVfVGFpbG1hdGNoKChQeU9iamVjdCAqKXNlbGYsCi0JCQkJCSAgIHN1YnN0ciwgc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vic3RyKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9UYWlsbWF0Y2goKFB5T2JqZWN0ICopc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyLCBzdGFydCwgZW5kLCBkaXJlY3Rpb24pOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHN1YnN0ciwgJnN1YiwgJnNsZW4pKQotCQlyZXR1cm4gLTE7Ci0Jc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJzdHIsICZzdWIsICZzbGVuKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKIAotCUFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7CisgICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuKTsKIAotCWlmIChkaXJlY3Rpb24gPCAwKSB7Ci0JCS8qIHN0YXJ0c3dpdGggKi8KLQkJaWYgKHN0YXJ0K3NsZW4gPiBsZW4pCi0JCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQkvKiBlbmRzd2l0aCAqLwotCQlpZiAoZW5kLXN0YXJ0IDwgc2xlbiB8fCBzdGFydCA+IGxlbikKLQkJCXJldHVybiAwOworICAgIGlmIChkaXJlY3Rpb24gPCAwKSB7CisgICAgICAgIC8qIHN0YXJ0c3dpdGggKi8KKyAgICAgICAgaWYgKHN0YXJ0K3NsZW4gPiBsZW4pCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBlbmRzd2l0aCAqLworICAgICAgICBpZiAoZW5kLXN0YXJ0IDwgc2xlbiB8fCBzdGFydCA+IGxlbikKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWlmIChlbmQtc2xlbiA+IHN0YXJ0KQotCQkJc3RhcnQgPSBlbmQgLSBzbGVuOwotCX0KLQlpZiAoZW5kLXN0YXJ0ID49IHNsZW4pCi0JCXJldHVybiAhIG1lbWNtcChzdHIrc3RhcnQsIHN1Yiwgc2xlbik7Ci0JcmV0dXJuIDA7CisgICAgICAgIGlmIChlbmQtc2xlbiA+IHN0YXJ0KQorICAgICAgICAgICAgc3RhcnQgPSBlbmQgLSBzbGVuOworICAgIH0KKyAgICBpZiAoZW5kLXN0YXJ0ID49IHNsZW4pCisgICAgICAgIHJldHVybiAhIG1lbWNtcChzdHIrc3RhcnQsIHN1Yiwgc2xlbik7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMjkxMSwzMyArMjkxMSwzMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19zdGFydHN3aXRoKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLQlQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwotCVB5T2JqZWN0ICpzdWJvYmo7Ci0JaW50IHJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKKyAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOworICAgIFB5T2JqZWN0ICpzdWJvYmo7CisgICAgaW50IHJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOnN0YXJ0c3dpdGgiLCAmc3Vib2JqLAotCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgewotCQlQeV9zc2l6ZV90IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgewotCQkJcmVzdWx0ID0gX3N0cmluZ190YWlsbWF0Y2goc2VsZiwKLQkJCQkJUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpLAotCQkJCQlzdGFydCwgZW5kLCAtMSk7Ci0JCQlpZiAocmVzdWx0ID09IC0xKQotCQkJCXJldHVybiBOVUxMOwotCQkJZWxzZSBpZiAocmVzdWx0KSB7Ci0JCQkJUHlfUkVUVVJOX1RSVUU7Ci0JCQl9Ci0JCX0KLQkJUHlfUkVUVVJOX0ZBTFNFOwotCX0KLQlyZXN1bHQgPSBfc3RyaW5nX3RhaWxtYXRjaChzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsIC0xKTsKLQlpZiAocmVzdWx0ID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjpzdGFydHN3aXRoIiwgJnN1Ym9iaiwKKyAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IF9zdHJpbmdfdGFpbG1hdGNoKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIC0xKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgfQorICAgIHJlc3VsdCA9IF9zdHJpbmdfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgLTEpOworICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOwogfQogCiAKQEAgLTI5NTIsMzMgKzI5NTIsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfZW5kc3dpdGgoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3Qgc3RhcnQgPSAwOwotCVB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0JUHlPYmplY3QgKnN1Ym9iajsKLQlpbnQgcmVzdWx0OworICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CisgICAgUHlPYmplY3QgKnN1Ym9iajsKKyAgICBpbnQgcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6ZW5kc3dpdGgiLCAmc3Vib2JqLAotCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgewotCQlQeV9zc2l6ZV90IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgewotCQkJcmVzdWx0ID0gX3N0cmluZ190YWlsbWF0Y2goc2VsZiwKLQkJCQkJUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpLAotCQkJCQlzdGFydCwgZW5kLCArMSk7Ci0JCQlpZiAocmVzdWx0ID09IC0xKQotCQkJCXJldHVybiBOVUxMOwotCQkJZWxzZSBpZiAocmVzdWx0KSB7Ci0JCQkJUHlfUkVUVVJOX1RSVUU7Ci0JCQl9Ci0JCX0KLQkJUHlfUkVUVVJOX0ZBTFNFOwotCX0KLQlyZXN1bHQgPSBfc3RyaW5nX3RhaWxtYXRjaChzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsICsxKTsKLQlpZiAocmVzdWx0ID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjplbmRzd2l0aCIsICZzdWJvYmosCisgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LCBfUHlFdmFsX1NsaWNlSW5kZXgsICZlbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQgPSBfc3RyaW5nX3RhaWxtYXRjaChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCArMSk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgICByZXN1bHQgPSBfc3RyaW5nX3RhaWxtYXRjaChzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsICsxKTsKKyAgICBpZiAocmVzdWx0ID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KIAogCkBAIC0zMDAxLDE4ICszMDAxLDE4IEBACiAgICAgUHlPYmplY3QgKnY7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8c3M6ZW5jb2RlIiwKLQkJCQkgICAgIGt3bGlzdCwgJmVuY29kaW5nLCAmZXJyb3JzKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgIHJldHVybiBOVUxMOwogICAgIHYgPSBQeVN0cmluZ19Bc0VuY29kZWRPYmplY3QoKFB5T2JqZWN0ICopc2VsZiwgZW5jb2RpbmcsIGVycm9ycyk7CiAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIGdvdG8gb25FcnJvcjsKICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpICYmICFQeVVuaWNvZGVfQ2hlY2sodikpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJlbmNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nL3VuaWNvZGUgb2JqZWN0ICIKLSAgICAgICAgICAgICAgICAgICAgICIodHlwZT0lLjQwMHMpIiwKLSAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOwotICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJlbmNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nL3VuaWNvZGUgb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgIih0eXBlPSUuNDAwcykiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiB2OwogCkBAIC0zMDQwLDE4ICszMDQwLDE4IEBACiAgICAgUHlPYmplY3QgKnY7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8c3M6ZGVjb2RlIiwKLQkJCQkgICAgIGt3bGlzdCwgJmVuY29kaW5nLCAmZXJyb3JzKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgIHJldHVybiBOVUxMOwogICAgIHYgPSBQeVN0cmluZ19Bc0RlY29kZWRPYmplY3QoKFB5T2JqZWN0ICopc2VsZiwgZW5jb2RpbmcsIGVycm9ycyk7CiAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIGdvdG8gb25FcnJvcjsKICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpICYmICFQeVVuaWNvZGVfQ2hlY2sodikpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJkZWNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nL3VuaWNvZGUgb2JqZWN0ICIKLSAgICAgICAgICAgICAgICAgICAgICIodHlwZT0lLjQwMHMpIiwKLSAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOwotICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJkZWNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nL3VuaWNvZGUgb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgIih0eXBlPSUuNDAwcykiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiB2OwogCkBAIC0zMDc2LDY1ICszMDc2LDY1IEBACiAgICAgaW50IHRhYnNpemUgPSA4OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpleHBhbmR0YWJzIiwgJnRhYnNpemUpKQotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogRmlyc3QgcGFzczogZGV0ZXJtaW5lIHNpemUgb2Ygb3V0cHV0IHN0cmluZyAqLwogICAgIGkgPSAwOyAvKiBjaGFycyB1cCB0byBhbmQgaW5jbHVkaW5nIG1vc3QgcmVjZW50IFxuIG9yIFxyICovCiAgICAgaiA9IDA7IC8qIGNoYXJzIHNpbmNlIG1vc3QgcmVjZW50IFxuIG9yIFxyICh1c2UgaW4gdGFiIGNhbGN1bGF0aW9ucykgKi8KICAgICBlID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7IC8qIGVuZCBvZiBpbnB1dCAqLwogICAgIGZvciAocCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsgcCA8IGU7IHArKykKLSAgICAgICAgaWYgKCpwID09ICdcdCcpIHsKLQkgICAgaWYgKHRhYnNpemUgPiAwKSB7Ci0JCWluY3IgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKLQkJaWYgKGogPiBQWV9TU0laRV9UX01BWCAtIGluY3IpCi0JCSAgICBnb3RvIG92ZXJmbG93MTsKLQkJaiArPSBpbmNyOwotICAgICAgICAgICAgfQotCX0KLSAgICAgICAgZWxzZSB7Ci0JICAgIGlmIChqID4gUFlfU1NJWkVfVF9NQVggLSAxKQotCQlnb3RvIG92ZXJmbG93MTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdccicpIHsKLQkJaWYgKGkgPiBQWV9TU0laRV9UX01BWCAtIGopCi0JCSAgICBnb3RvIG92ZXJmbG93MTsKLSAgICAgICAgICAgICAgICBpICs9IGo7Ci0gICAgICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICB9CisgICAgaWYgKCpwID09ICdcdCcpIHsKKyAgICAgICAgaWYgKHRhYnNpemUgPiAwKSB7CisgICAgICAgIGluY3IgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKKyAgICAgICAgaWYgKGogPiBQWV9TU0laRV9UX01BWCAtIGluY3IpCisgICAgICAgICAgICBnb3RvIG92ZXJmbG93MTsKKyAgICAgICAgaiArPSBpbmNyOwogICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoaiA+IFBZX1NTSVpFX1RfTUFYIC0gMSkKKyAgICAgICAgZ290byBvdmVyZmxvdzE7CisgICAgICAgIGorKzsKKyAgICAgICAgaWYgKCpwID09ICdcbicgfHwgKnAgPT0gJ1xyJykgeworICAgICAgICBpZiAoaSA+IFBZX1NTSVpFX1RfTUFYIC0gaikKKyAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3cxOworICAgICAgICBpICs9IGo7CisgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKGkgPiBQWV9TU0laRV9UX01BWCAtIGopCi0JZ290byBvdmVyZmxvdzE7CisgICAgZ290byBvdmVyZmxvdzE7CiAKICAgICAvKiBTZWNvbmQgcGFzczogY3JlYXRlIG91dHB1dCBzdHJpbmcgYW5kIGZpbGwgaXQgKi8KICAgICB1ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgaSArIGopOwogICAgIGlmICghdSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBqID0gMDsgLyogc2FtZSBhcyBpbiBmaXJzdCBwYXNzICovCiAgICAgcSA9IFB5U3RyaW5nX0FTX1NUUklORyh1KTsgLyogbmV4dCBvdXRwdXQgY2hhciAqLwogICAgIHFlID0gUHlTdHJpbmdfQVNfU1RSSU5HKHUpICsgUHlTdHJpbmdfR0VUX1NJWkUodSk7IC8qIGVuZCBvZiBvdXRwdXQgKi8KIAogICAgIGZvciAocCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsgcCA8IGU7IHArKykKLSAgICAgICAgaWYgKCpwID09ICdcdCcpIHsKLQkgICAgaWYgKHRhYnNpemUgPiAwKSB7Ci0JCWkgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKLQkJaiArPSBpOwotCQl3aGlsZSAoaS0tKSB7Ci0JCSAgICBpZiAocSA+PSBxZSkKLQkJCWdvdG8gb3ZlcmZsb3cyOwotCQkgICAgKnErKyA9ICcgJzsKLQkJfQotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICBpZiAocSA+PSBxZSkKLQkJZ290byBvdmVyZmxvdzI7Ci0JICAgICpxKysgPSAqcDsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdccicpCi0gICAgICAgICAgICAgICAgaiA9IDA7CisgICAgaWYgKCpwID09ICdcdCcpIHsKKyAgICAgICAgaWYgKHRhYnNpemUgPiAwKSB7CisgICAgICAgIGkgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKKyAgICAgICAgaiArPSBpOworICAgICAgICB3aGlsZSAoaS0tKSB7CisgICAgICAgICAgICBpZiAocSA+PSBxZSkKKyAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3cyOworICAgICAgICAgICAgKnErKyA9ICcgJzsKICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAocSA+PSBxZSkKKyAgICAgICAgZ290byBvdmVyZmxvdzI7CisgICAgICAgICpxKysgPSAqcDsKKyAgICAgICAgaisrOworICAgICAgICBpZiAoKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInKQorICAgICAgICBqID0gMDsKKyAgICB9CiAKICAgICByZXR1cm4gdTsKIApAQCAtMzE1MSwyNiArMzE1MSwyNiBAQAogICAgIFB5T2JqZWN0ICp1OwogCiAgICAgaWYgKGxlZnQgPCAwKQotICAgICAgICBsZWZ0ID0gMDsKKyAgICBsZWZ0ID0gMDsKICAgICBpZiAocmlnaHQgPCAwKQotICAgICAgICByaWdodCA9IDA7CisgICAgcmlnaHQgPSAwOwogCiAgICAgaWYgKGxlZnQgPT0gMCAmJiByaWdodCA9PSAwICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiAgICAgfQogCiAgICAgdSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsCi0JCQkJICAgbGVmdCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpICsgcmlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgKyByaWdodCk7CiAgICAgaWYgKHUpIHsKLSAgICAgICAgaWYgKGxlZnQpCi0gICAgICAgICAgICBtZW1zZXQoUHlTdHJpbmdfQVNfU1RSSU5HKHUpLCBmaWxsLCBsZWZ0KTsKLSAgICAgICAgUHlfTUVNQ1BZKFB5U3RyaW5nX0FTX1NUUklORyh1KSArIGxlZnQsCi0JICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwKLQkgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikpOwotICAgICAgICBpZiAocmlnaHQpCi0gICAgICAgICAgICBtZW1zZXQoUHlTdHJpbmdfQVNfU1RSSU5HKHUpICsgbGVmdCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAotCQkgICBmaWxsLCByaWdodCk7CisgICAgaWYgKGxlZnQpCisgICAgICAgIG1lbXNldChQeVN0cmluZ19BU19TVFJJTkcodSksIGZpbGwsIGxlZnQpOworICAgIFB5X01FTUNQWShQeVN0cmluZ19BU19TVFJJTkcodSkgKyBsZWZ0LAorICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksCisgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpKTsKKyAgICBpZiAocmlnaHQpCisgICAgICAgIG1lbXNldChQeVN0cmluZ19BU19TVFJJTkcodSkgKyBsZWZ0ICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisgICAgICAgICAgIGZpbGwsIHJpZ2h0KTsKICAgICB9CiAKICAgICByZXR1cm4gdTsKQEAgLTMxODksMTEgKzMxODksMTEgQEAKICAgICBjaGFyIGZpbGxjaGFyID0gJyAnOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGM6bGp1c3QiLCAmd2lkdGgsICZmaWxsY2hhcikpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID49IHdpZHRoICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CiAgICAgfQogCiAgICAgcmV0dXJuIHBhZChzZWxmLCAwLCB3aWR0aCAtIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBmaWxsY2hhcik7CkBAIC0zMjEzLDExICszMjEzLDExIEBACiAgICAgY2hhciBmaWxsY2hhciA9ICcgJzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxjOnJqdXN0IiwgJndpZHRoLCAmZmlsbGNoYXIpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA+PSB3aWR0aCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwogICAgIH0KIAogICAgIHJldHVybiBwYWQoc2VsZiwgd2lkdGggLSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgMCwgZmlsbGNoYXIpOwpAQCAtMzIzOCwxMSArMzIzOCwxMSBAQAogICAgIGNoYXIgZmlsbGNoYXIgPSAnICc7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58YzpjZW50ZXIiLCAmd2lkdGgsICZmaWxsY2hhcikpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID49IHdpZHRoICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CiAgICAgfQogCiAgICAgbWFyZyA9IHdpZHRoIC0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CkBAIC0zMjY2LDE4ICszMjY2LDE4IEBACiAgICAgUHlfc3NpemVfdCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibjp6ZmlsbCIsICZ3aWR0aCkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID49IHdpZHRoKSB7Ci0gICAgICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0gICAgICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0gICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLAotICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpCi0gICAgICAgICAgICApOworICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksCisgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpCisgICAgICAgICk7CiAgICAgfQogCiAgICAgZmlsbCA9IHdpZHRoIC0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CkBAIC0zMjg1LDEzICszMjg1LDEzIEBACiAgICAgcyA9IHBhZChzZWxmLCBmaWxsLCAwLCAnMCcpOwogCiAgICAgaWYgKHMgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHMpOwogICAgIGlmIChwW2ZpbGxdID09ICcrJyB8fCBwW2ZpbGxdID09ICctJykgewotICAgICAgICAvKiBtb3ZlIHNpZ24gdG8gYmVnaW5uaW5nIG9mIHN0cmluZyAqLwotICAgICAgICBwWzBdID0gcFtmaWxsXTsKLSAgICAgICAgcFtmaWxsXSA9ICcwJzsKKyAgICAvKiBtb3ZlIHNpZ24gdG8gYmVnaW5uaW5nIG9mIHN0cmluZyAqLworICAgIHBbMF0gPSBwW2ZpbGxdOworICAgIHBbZmlsbF0gPSAnMCc7CiAgICAgfQogCiAgICAgcmV0dXJuIChQeU9iamVjdCopIHM7CkBAIC0zMzA3LDIyICszMzA3LDIyIEBACiBzdHJpbmdfaXNzcGFjZShQeVN0cmluZ09iamVjdCAqc2VsZikKIHsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwCi0gICAgICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmU7CiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDEgJiYKLQlpc3NwYWNlKCpwKSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOworICAgIGlzc3BhY2UoKnApKQorICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAKICAgICBlID0gcCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JaWYgKCFpc3NwYWNlKCpwKSkKLQkgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICBpZiAoIWlzc3BhY2UoKnApKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogICAgIH0KICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOwogfQpAQCAtMzMzOCwyMiArMzMzOCwyMiBAQAogc3RyaW5nX2lzYWxwaGEoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcAotICAgICAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplOwogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAxICYmCi0JaXNhbHBoYSgqcCkpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKKyAgICBpc2FscGhhKCpwKSkKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOwogCiAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDApCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogCiAgICAgZSA9IHAgKyBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmICghaXNhbHBoYSgqcCkpCi0JICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgaWYgKCFpc2FscGhhKCpwKSkKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKICAgICB9CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKIH0KQEAgLTMzNjksMjIgKzMzNjksMjIgQEAKIHN0cmluZ19pc2FsbnVtKFB5U3RyaW5nT2JqZWN0ICpzZWxmKQogewogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAKLSAgICAgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZTsKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMSAmJgotCWlzYWxudW0oKnApKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CisgICAgaXNhbG51bSgqcCkpCisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKIAogICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgc3RyaW5ncyAqLwogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAwKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKIAogICAgIGUgPSBwICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlpZiAoIWlzYWxudW0oKnApKQotCSAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIGlmICghaXNhbG51bSgqcCkpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CiB9CkBAIC0zNDAwLDIyICszNDAwLDIyIEBACiBzdHJpbmdfaXNkaWdpdChQeVN0cmluZ09iamVjdCAqc2VsZikKIHsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwCi0gICAgICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmU7CiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDEgJiYKLQlpc2RpZ2l0KCpwKSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOworICAgIGlzZGlnaXQoKnApKQorICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAKICAgICBlID0gcCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JaWYgKCFpc2RpZ2l0KCpwKSkKLQkgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICBpZiAoIWlzZGlnaXQoKnApKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogICAgIH0KICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOwogfQpAQCAtMzQzMSwyNSArMzQzMSwyNSBAQAogc3RyaW5nX2lzbG93ZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcAotICAgICAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplOwogICAgIGludCBjYXNlZDsKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKGlzbG93ZXIoKnApICE9IDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoaXNsb3dlcigqcCkgIT0gMCk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAKICAgICBlID0gcCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogICAgIGNhc2VkID0gMDsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmIChpc3VwcGVyKCpwKSkKLQkgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKLQllbHNlIGlmICghY2FzZWQgJiYgaXNsb3dlcigqcCkpCi0JICAgIGNhc2VkID0gMTsKKyAgICBpZiAoaXN1cHBlcigqcCkpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgZWxzZSBpZiAoIWNhc2VkICYmIGlzbG93ZXIoKnApKQorICAgICAgICBjYXNlZCA9IDE7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoY2FzZWQpOwogfQpAQCAtMzQ2NSwyNSArMzQ2NSwyNSBAQAogc3RyaW5nX2lzdXBwZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcAotICAgICAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplOwogICAgIGludCBjYXNlZDsKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKGlzdXBwZXIoKnApICE9IDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoaXN1cHBlcigqcCkgIT0gMCk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAKICAgICBlID0gcCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogICAgIGNhc2VkID0gMDsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmIChpc2xvd2VyKCpwKSkKLQkgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKLQllbHNlIGlmICghY2FzZWQgJiYgaXN1cHBlcigqcCkpCi0JICAgIGNhc2VkID0gMTsKKyAgICBpZiAoaXNsb3dlcigqcCkpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgZWxzZSBpZiAoIWNhc2VkICYmIGlzdXBwZXIoKnApKQorICAgICAgICBjYXNlZCA9IDE7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoY2FzZWQpOwogfQpAQCAtMzUwMSwzOCArMzUwMSwzOCBAQAogc3RyaW5nX2lzdGl0bGUoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bmNhc2VkKQogewogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAKLSAgICAgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZTsKICAgICBpbnQgY2FzZWQsIHByZXZpb3VzX2lzX2Nhc2VkOwogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAxKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoaXN1cHBlcigqcCkgIT0gMCk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhpc3VwcGVyKCpwKSAhPSAwKTsKIAogICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgc3RyaW5ncyAqLwogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAwKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKIAogICAgIGUgPSBwICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAgICAgY2FzZWQgPSAwOwogICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCXJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2ggPSAqcDsKKyAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyIGNoID0gKnA7CiAKLQlpZiAoaXN1cHBlcihjaCkpIHsKLQkgICAgaWYgKHByZXZpb3VzX2lzX2Nhc2VkKQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwotCSAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7Ci0JICAgIGNhc2VkID0gMTsKLQl9Ci0JZWxzZSBpZiAoaXNsb3dlcihjaCkpIHsKLQkgICAgaWYgKCFwcmV2aW91c19pc19jYXNlZCkKLQkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKLQkgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOwotCSAgICBjYXNlZCA9IDE7Ci0JfQotCWVsc2UKLQkgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAwOworICAgIGlmIChpc3VwcGVyKGNoKSkgeworICAgICAgICBpZiAocHJldmlvdXNfaXNfY2FzZWQpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKKyAgICAgICAgY2FzZWQgPSAxOworICAgIH0KKyAgICBlbHNlIGlmIChpc2xvd2VyKGNoKSkgeworICAgICAgICBpZiAoIXByZXZpb3VzX2lzX2Nhc2VkKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7CisgICAgICAgIGNhc2VkID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDA7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoY2FzZWQpOwogfQpAQCAtMzU1MSwxMiArMzU1MSwxMiBAQAogICAgIGludCBrZWVwZW5kcyA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnNwbGl0bGluZXMiLCAma2VlcGVuZHMpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIHJldHVybiBzdHJpbmdsaWJfc3BsaXRsaW5lcygKLSAgICAgICAgKFB5T2JqZWN0Kikgc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwKLSAgICAgICAga2VlcGVuZHMKLSAgICAgICAgKTsKKyAgICAoUHlPYmplY3QqKSBzZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAorICAgIGtlZXBlbmRzCisgICAgKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNpemVvZl9fZG9jX18sCkBAIC0zNTY1LDE1ICszNTY1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3NpemVvZihQeVN0cmluZ09iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IHJlczsKLQlyZXMgPSBQeVN0cmluZ09iamVjdF9TSVpFICsgUHlTdHJpbmdfR0VUX1NJWkUodikgKiBQeV9UWVBFKHYpLT50cF9pdGVtc2l6ZTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKKyAgICBQeV9zc2l6ZV90IHJlczsKKyAgICByZXMgPSBQeVN0cmluZ09iamVjdF9TSVpFICsgUHlTdHJpbmdfR0VUX1NJWkUodikgKiBQeV9UWVBFKHYpLT50cF9pdGVtc2l6ZTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19nZXRuZXdhcmdzKFB5U3RyaW5nT2JqZWN0ICp2KQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIocyMpIiwgdi0+b2Jfc3ZhbCwgUHlfU0laRSh2KSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzIykiLCB2LT5vYl9zdmFsLCBQeV9TSVpFKHYpKTsKIH0KIAogCkBAIC0zNTk0LDIwICszNTk0LDIwIEBACiAgICAgLyogSWYgMi54LCBjb252ZXJ0IGZvcm1hdF9zcGVjIHRvIHRoZSBzYW1lIHR5cGUgYXMgdmFsdWUgKi8KICAgICAvKiBUaGlzIGlzIHRvIGFsbG93IHRoaW5ncyBsaWtlIHUnJy5mb3JtYXQoJycpICovCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQotICAgICAgICBnb3RvIGRvbmU7CisgICAgZ290byBkb25lOwogICAgIGlmICghKFB5U3RyaW5nX0NoZWNrKGZvcm1hdF9zcGVjKSB8fCBQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiX19mb3JtYXRfXyBhcmcgbXVzdCBiZSBzdHIgIgotCQkgICAgICJvciB1bmljb2RlLCBub3QgJXMiLCBQeV9UWVBFKGZvcm1hdF9zcGVjKS0+dHBfbmFtZSk7Ci0JZ290byBkb25lOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJfX2Zvcm1hdF9fIGFyZyBtdXN0IGJlIHN0ciAiCisgICAgICAgICAgICAgICAgICJvciB1bmljb2RlLCBub3QgJXMiLCBQeV9UWVBFKGZvcm1hdF9zcGVjKS0+dHBfbmFtZSk7CisgICAgZ290byBkb25lOwogICAgIH0KICAgICB0bXAgPSBQeU9iamVjdF9TdHIoZm9ybWF0X3NwZWMpOwogICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgZ290byBkb25lOworICAgIGdvdG8gZG9uZTsKICAgICBmb3JtYXRfc3BlYyA9IHRtcDsKIAogICAgIHJlc3VsdCA9IF9QeUJ5dGVzX0Zvcm1hdEFkdmFuY2VkKHNlbGYsCi0JCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAotCQkJCSAgICAgUHlTdHJpbmdfR0VUX1NJWkUoZm9ybWF0X3NwZWMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKGZvcm1hdF9zcGVjKSk7CiBkb25lOgogICAgIFB5X1hERUNSRUYodG1wKTsKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMzYyMSw2MSArMzYyMSw2MSBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYKIHN0cmluZ19tZXRob2RzW10gPSB7Ci0JLyogQ291bnRlcnBhcnRzIG9mIHRoZSBvYnNvbGV0ZSBzdHJvcG1vZHVsZSBmdW5jdGlvbnM7IGV4Y2VwdAotCSAgIHN0cmluZy5tYWtldHJhbnMoKS4gKi8KLQl7ImpvaW4iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2pvaW4sIE1FVEhfTywgam9pbl9fZG9jX199LAotCXsic3BsaXQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3NwbGl0LCBNRVRIX1ZBUkFSR1MsIHNwbGl0X19kb2NfX30sCi0JeyJyc3BsaXQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JzcGxpdCwgTUVUSF9WQVJBUkdTLCByc3BsaXRfX2RvY19ffSwKLQl7Imxvd2VyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19sb3dlciwgTUVUSF9OT0FSR1MsIGxvd2VyX19kb2NfX30sCi0JeyJ1cHBlciIsIChQeUNGdW5jdGlvbilzdHJpbmdfdXBwZXIsIE1FVEhfTk9BUkdTLCB1cHBlcl9fZG9jX199LAotCXsiaXNsb3dlciIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNsb3dlciwgTUVUSF9OT0FSR1MsIGlzbG93ZXJfX2RvY19ffSwKLQl7ImlzdXBwZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzdXBwZXIsIE1FVEhfTk9BUkdTLCBpc3VwcGVyX19kb2NfX30sCi0JeyJpc3NwYWNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc3NwYWNlLCBNRVRIX05PQVJHUywgaXNzcGFjZV9fZG9jX199LAotCXsiaXNkaWdpdCIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNkaWdpdCwgTUVUSF9OT0FSR1MsIGlzZGlnaXRfX2RvY19ffSwKLQl7ImlzdGl0bGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzdGl0bGUsIE1FVEhfTk9BUkdTLCBpc3RpdGxlX19kb2NfX30sCi0JeyJpc2FscGhhIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc2FscGhhLCBNRVRIX05PQVJHUywgaXNhbHBoYV9fZG9jX199LAotCXsiaXNhbG51bSIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNhbG51bSwgTUVUSF9OT0FSR1MsIGlzYWxudW1fX2RvY19ffSwKLQl7ImNhcGl0YWxpemUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2NhcGl0YWxpemUsIE1FVEhfTk9BUkdTLAotCSBjYXBpdGFsaXplX19kb2NfX30sCi0JeyJjb3VudCIsIChQeUNGdW5jdGlvbilzdHJpbmdfY291bnQsIE1FVEhfVkFSQVJHUywgY291bnRfX2RvY19ffSwKLQl7ImVuZHN3aXRoIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19lbmRzd2l0aCwgTUVUSF9WQVJBUkdTLAotCSBlbmRzd2l0aF9fZG9jX199LAotCXsicGFydGl0aW9uIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19wYXJ0aXRpb24sIE1FVEhfTywgcGFydGl0aW9uX19kb2NfX30sCi0JeyJmaW5kIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19maW5kLCBNRVRIX1ZBUkFSR1MsIGZpbmRfX2RvY19ffSwKLQl7ImluZGV4IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pbmRleCwgTUVUSF9WQVJBUkdTLCBpbmRleF9fZG9jX199LAotCXsibHN0cmlwIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19sc3RyaXAsIE1FVEhfVkFSQVJHUywgbHN0cmlwX19kb2NfX30sCi0JeyJyZXBsYWNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yZXBsYWNlLCBNRVRIX1ZBUkFSR1MsIHJlcGxhY2VfX2RvY19ffSwKLQl7InJmaW5kIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yZmluZCwgTUVUSF9WQVJBUkdTLCByZmluZF9fZG9jX199LAotCXsicmluZGV4IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yaW5kZXgsIE1FVEhfVkFSQVJHUywgcmluZGV4X19kb2NfX30sCi0JeyJyc3RyaXAiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JzdHJpcCwgTUVUSF9WQVJBUkdTLCByc3RyaXBfX2RvY19ffSwKLQl7InJwYXJ0aXRpb24iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JwYXJ0aXRpb24sIE1FVEhfTywKLQkgcnBhcnRpdGlvbl9fZG9jX199LAotCXsic3RhcnRzd2l0aCIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3RhcnRzd2l0aCwgTUVUSF9WQVJBUkdTLAotCSBzdGFydHN3aXRoX19kb2NfX30sCi0JeyJzdHJpcCIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3RyaXAsIE1FVEhfVkFSQVJHUywgc3RyaXBfX2RvY19ffSwKLQl7InN3YXBjYXNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19zd2FwY2FzZSwgTUVUSF9OT0FSR1MsCi0JIHN3YXBjYXNlX19kb2NfX30sCi0JeyJ0cmFuc2xhdGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3RyYW5zbGF0ZSwgTUVUSF9WQVJBUkdTLAotCSB0cmFuc2xhdGVfX2RvY19ffSwKLQl7InRpdGxlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ190aXRsZSwgTUVUSF9OT0FSR1MsIHRpdGxlX19kb2NfX30sCi0JeyJsanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdfbGp1c3QsIE1FVEhfVkFSQVJHUywgbGp1c3RfX2RvY19ffSwKLQl7InJqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yanVzdCwgTUVUSF9WQVJBUkdTLCByanVzdF9fZG9jX199LAotCXsiY2VudGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19jZW50ZXIsIE1FVEhfVkFSQVJHUywgY2VudGVyX19kb2NfX30sCi0JeyJ6ZmlsbCIsIChQeUNGdW5jdGlvbilzdHJpbmdfemZpbGwsIE1FVEhfVkFSQVJHUywgemZpbGxfX2RvY19ffSwKLQl7ImZvcm1hdCIsIChQeUNGdW5jdGlvbikgZG9fc3RyaW5nX2Zvcm1hdCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgZm9ybWF0X19kb2NfX30sCi0JeyJfX2Zvcm1hdF9fIiwgKFB5Q0Z1bmN0aW9uKSBzdHJpbmdfX2Zvcm1hdF9fLCBNRVRIX1ZBUkFSR1MsIHBfZm9ybWF0X19kb2NfX30sCi0JeyJfZm9ybWF0dGVyX2ZpZWxkX25hbWVfc3BsaXQiLCAoUHlDRnVuY3Rpb24pIGZvcm1hdHRlcl9maWVsZF9uYW1lX3NwbGl0LCBNRVRIX05PQVJHU30sCi0JeyJfZm9ybWF0dGVyX3BhcnNlciIsIChQeUNGdW5jdGlvbikgZm9ybWF0dGVyX3BhcnNlciwgTUVUSF9OT0FSR1N9LAotCXsiZW5jb2RlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19lbmNvZGUsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGVuY29kZV9fZG9jX199LAotCXsiZGVjb2RlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19kZWNvZGUsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGRlY29kZV9fZG9jX199LAotCXsiZXhwYW5kdGFicyIsIChQeUNGdW5jdGlvbilzdHJpbmdfZXhwYW5kdGFicywgTUVUSF9WQVJBUkdTLAotCSBleHBhbmR0YWJzX19kb2NfX30sCi0JeyJzcGxpdGxpbmVzIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19zcGxpdGxpbmVzLCBNRVRIX1ZBUkFSR1MsCi0JIHNwbGl0bGluZXNfX2RvY19ffSwKLQl7Il9fc2l6ZW9mX18iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3NpemVvZiwgTUVUSF9OT0FSR1MsCi0JIHNpemVvZl9fZG9jX199LAotCXsiX19nZXRuZXdhcmdzX18iLAkoUHlDRnVuY3Rpb24pc3RyaW5nX2dldG5ld2FyZ3MsCU1FVEhfTk9BUkdTfSwKLQl7TlVMTCwgICAgIE5VTEx9CQkgICAgIC8qIHNlbnRpbmVsICovCisgICAgLyogQ291bnRlcnBhcnRzIG9mIHRoZSBvYnNvbGV0ZSBzdHJvcG1vZHVsZSBmdW5jdGlvbnM7IGV4Y2VwdAorICAgICAgIHN0cmluZy5tYWtldHJhbnMoKS4gKi8KKyAgICB7ImpvaW4iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2pvaW4sIE1FVEhfTywgam9pbl9fZG9jX199LAorICAgIHsic3BsaXQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3NwbGl0LCBNRVRIX1ZBUkFSR1MsIHNwbGl0X19kb2NfX30sCisgICAgeyJyc3BsaXQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JzcGxpdCwgTUVUSF9WQVJBUkdTLCByc3BsaXRfX2RvY19ffSwKKyAgICB7Imxvd2VyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19sb3dlciwgTUVUSF9OT0FSR1MsIGxvd2VyX19kb2NfX30sCisgICAgeyJ1cHBlciIsIChQeUNGdW5jdGlvbilzdHJpbmdfdXBwZXIsIE1FVEhfTk9BUkdTLCB1cHBlcl9fZG9jX199LAorICAgIHsiaXNsb3dlciIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNsb3dlciwgTUVUSF9OT0FSR1MsIGlzbG93ZXJfX2RvY19ffSwKKyAgICB7ImlzdXBwZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzdXBwZXIsIE1FVEhfTk9BUkdTLCBpc3VwcGVyX19kb2NfX30sCisgICAgeyJpc3NwYWNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc3NwYWNlLCBNRVRIX05PQVJHUywgaXNzcGFjZV9fZG9jX199LAorICAgIHsiaXNkaWdpdCIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNkaWdpdCwgTUVUSF9OT0FSR1MsIGlzZGlnaXRfX2RvY19ffSwKKyAgICB7ImlzdGl0bGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzdGl0bGUsIE1FVEhfTk9BUkdTLCBpc3RpdGxlX19kb2NfX30sCisgICAgeyJpc2FscGhhIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc2FscGhhLCBNRVRIX05PQVJHUywgaXNhbHBoYV9fZG9jX199LAorICAgIHsiaXNhbG51bSIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNhbG51bSwgTUVUSF9OT0FSR1MsIGlzYWxudW1fX2RvY19ffSwKKyAgICB7ImNhcGl0YWxpemUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2NhcGl0YWxpemUsIE1FVEhfTk9BUkdTLAorICAgICBjYXBpdGFsaXplX19kb2NfX30sCisgICAgeyJjb3VudCIsIChQeUNGdW5jdGlvbilzdHJpbmdfY291bnQsIE1FVEhfVkFSQVJHUywgY291bnRfX2RvY19ffSwKKyAgICB7ImVuZHN3aXRoIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19lbmRzd2l0aCwgTUVUSF9WQVJBUkdTLAorICAgICBlbmRzd2l0aF9fZG9jX199LAorICAgIHsicGFydGl0aW9uIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19wYXJ0aXRpb24sIE1FVEhfTywgcGFydGl0aW9uX19kb2NfX30sCisgICAgeyJmaW5kIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19maW5kLCBNRVRIX1ZBUkFSR1MsIGZpbmRfX2RvY19ffSwKKyAgICB7ImluZGV4IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pbmRleCwgTUVUSF9WQVJBUkdTLCBpbmRleF9fZG9jX199LAorICAgIHsibHN0cmlwIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19sc3RyaXAsIE1FVEhfVkFSQVJHUywgbHN0cmlwX19kb2NfX30sCisgICAgeyJyZXBsYWNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yZXBsYWNlLCBNRVRIX1ZBUkFSR1MsIHJlcGxhY2VfX2RvY19ffSwKKyAgICB7InJmaW5kIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yZmluZCwgTUVUSF9WQVJBUkdTLCByZmluZF9fZG9jX199LAorICAgIHsicmluZGV4IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yaW5kZXgsIE1FVEhfVkFSQVJHUywgcmluZGV4X19kb2NfX30sCisgICAgeyJyc3RyaXAiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JzdHJpcCwgTUVUSF9WQVJBUkdTLCByc3RyaXBfX2RvY19ffSwKKyAgICB7InJwYXJ0aXRpb24iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JwYXJ0aXRpb24sIE1FVEhfTywKKyAgICAgcnBhcnRpdGlvbl9fZG9jX199LAorICAgIHsic3RhcnRzd2l0aCIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3RhcnRzd2l0aCwgTUVUSF9WQVJBUkdTLAorICAgICBzdGFydHN3aXRoX19kb2NfX30sCisgICAgeyJzdHJpcCIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3RyaXAsIE1FVEhfVkFSQVJHUywgc3RyaXBfX2RvY19ffSwKKyAgICB7InN3YXBjYXNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19zd2FwY2FzZSwgTUVUSF9OT0FSR1MsCisgICAgIHN3YXBjYXNlX19kb2NfX30sCisgICAgeyJ0cmFuc2xhdGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3RyYW5zbGF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICB0cmFuc2xhdGVfX2RvY19ffSwKKyAgICB7InRpdGxlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ190aXRsZSwgTUVUSF9OT0FSR1MsIHRpdGxlX19kb2NfX30sCisgICAgeyJsanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdfbGp1c3QsIE1FVEhfVkFSQVJHUywgbGp1c3RfX2RvY19ffSwKKyAgICB7InJqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yanVzdCwgTUVUSF9WQVJBUkdTLCByanVzdF9fZG9jX199LAorICAgIHsiY2VudGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19jZW50ZXIsIE1FVEhfVkFSQVJHUywgY2VudGVyX19kb2NfX30sCisgICAgeyJ6ZmlsbCIsIChQeUNGdW5jdGlvbilzdHJpbmdfemZpbGwsIE1FVEhfVkFSQVJHUywgemZpbGxfX2RvY19ffSwKKyAgICB7ImZvcm1hdCIsIChQeUNGdW5jdGlvbikgZG9fc3RyaW5nX2Zvcm1hdCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgZm9ybWF0X19kb2NfX30sCisgICAgeyJfX2Zvcm1hdF9fIiwgKFB5Q0Z1bmN0aW9uKSBzdHJpbmdfX2Zvcm1hdF9fLCBNRVRIX1ZBUkFSR1MsIHBfZm9ybWF0X19kb2NfX30sCisgICAgeyJfZm9ybWF0dGVyX2ZpZWxkX25hbWVfc3BsaXQiLCAoUHlDRnVuY3Rpb24pIGZvcm1hdHRlcl9maWVsZF9uYW1lX3NwbGl0LCBNRVRIX05PQVJHU30sCisgICAgeyJfZm9ybWF0dGVyX3BhcnNlciIsIChQeUNGdW5jdGlvbikgZm9ybWF0dGVyX3BhcnNlciwgTUVUSF9OT0FSR1N9LAorICAgIHsiZW5jb2RlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19lbmNvZGUsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGVuY29kZV9fZG9jX199LAorICAgIHsiZGVjb2RlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19kZWNvZGUsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGRlY29kZV9fZG9jX199LAorICAgIHsiZXhwYW5kdGFicyIsIChQeUNGdW5jdGlvbilzdHJpbmdfZXhwYW5kdGFicywgTUVUSF9WQVJBUkdTLAorICAgICBleHBhbmR0YWJzX19kb2NfX30sCisgICAgeyJzcGxpdGxpbmVzIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19zcGxpdGxpbmVzLCBNRVRIX1ZBUkFSR1MsCisgICAgIHNwbGl0bGluZXNfX2RvY19ffSwKKyAgICB7Il9fc2l6ZW9mX18iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3NpemVvZiwgTUVUSF9OT0FSR1MsCisgICAgIHNpemVvZl9fZG9jX199LAorICAgIHsiX19nZXRuZXdhcmdzX18iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc3RyaW5nX2dldG5ld2FyZ3MsIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTCwgICAgIE5VTEx9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMzY4NCwxMTEgKzM2ODQsMTExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqeCA9IE5VTEw7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJvYmplY3QiLCAwfTsKKyAgICBQeU9iamVjdCAqeCA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJvYmplY3QiLCAwfTsKIAotCWlmICh0eXBlICE9ICZQeVN0cmluZ19UeXBlKQotCQlyZXR1cm4gc3RyX3N1YnR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8TzpzdHIiLCBrd2xpc3QsICZ4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCXJldHVybiBQeU9iamVjdF9TdHIoeCk7CisgICAgaWYgKHR5cGUgIT0gJlB5U3RyaW5nX1R5cGUpCisgICAgICAgIHJldHVybiBzdHJfc3VidHlwZV9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPOnN0ciIsIGt3bGlzdCwgJngpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgcmV0dXJuIFB5T2JqZWN0X1N0cih4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cl9zdWJ0eXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqdG1wLCAqcG5ldzsKLQlQeV9zc2l6ZV90IG47CisgICAgUHlPYmplY3QgKnRtcCwgKnBuZXc7CisgICAgUHlfc3NpemVfdCBuOwogCi0JYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5U3RyaW5nX1R5cGUpKTsKLQl0bXAgPSBzdHJpbmdfbmV3KCZQeVN0cmluZ19UeXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeVN0cmluZ19DaGVja0V4YWN0KHRtcCkpOwotCW4gPSBQeVN0cmluZ19HRVRfU0laRSh0bXApOwotCXBuZXcgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCBuKTsKLQlpZiAocG5ldyAhPSBOVUxMKSB7Ci0JCVB5X01FTUNQWShQeVN0cmluZ19BU19TVFJJTkcocG5ldyksIFB5U3RyaW5nX0FTX1NUUklORyh0bXApLCBuKzEpOwotCQkoKFB5U3RyaW5nT2JqZWN0ICopcG5ldyktPm9iX3NoYXNoID0KLQkJCSgoUHlTdHJpbmdPYmplY3QgKil0bXApLT5vYl9zaGFzaDsKLQkJKChQeVN0cmluZ09iamVjdCAqKXBuZXcpLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOwotCX0KLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gcG5ldzsKKyAgICBhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlTdHJpbmdfVHlwZSkpOworICAgIHRtcCA9IHN0cmluZ19uZXcoJlB5U3RyaW5nX1R5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrRXhhY3QodG1wKSk7CisgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRtcCk7CisgICAgcG5ldyA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIG4pOworICAgIGlmIChwbmV3ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfTUVNQ1BZKFB5U3RyaW5nX0FTX1NUUklORyhwbmV3KSwgUHlTdHJpbmdfQVNfU1RSSU5HKHRtcCksIG4rMSk7CisgICAgICAgICgoUHlTdHJpbmdPYmplY3QgKilwbmV3KS0+b2Jfc2hhc2ggPQorICAgICAgICAgICAgKChQeVN0cmluZ09iamVjdCAqKXRtcCktPm9iX3NoYXNoOworICAgICAgICAoKFB5U3RyaW5nT2JqZWN0ICopcG5ldyktPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7CisgICAgfQorICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiBwbmV3OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYmFzZXN0cmluZ19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJUaGUgYmFzZXN0cmluZyB0eXBlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiVGhlIGJhc2VzdHJpbmcgdHlwZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfbW9kKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zvcm1hdCh2LCB3KTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zvcm1hdCh2LCB3KTsKIH0KIAogUHlEb2NfU1RSVkFSKGJhc2VzdHJpbmdfZG9jLAogIlR5cGUgYmFzZXN0cmluZyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyB0aGUgYmFzZSBmb3Igc3RyIGFuZCB1bmljb2RlLiIpOwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIHN0cmluZ19hc19udW1iZXIgPSB7Ci0JMCwJCQkvKm5iX2FkZCovCi0JMCwJCQkvKm5iX3N1YnRyYWN0Ki8KLQkwLAkJCS8qbmJfbXVsdGlwbHkqLwotCTAsIAkJCS8qbmJfZGl2aWRlKi8KLQlzdHJpbmdfbW9kLAkJLypuYl9yZW1haW5kZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2FkZCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfc3VidHJhY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX211bHRpcGx5Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9kaXZpZGUqLworICAgIHN0cmluZ19tb2QsICAgICAgICAgICAgICAgICAvKm5iX3JlbWFpbmRlciovCiB9OwogCiAKIFB5VHlwZU9iamVjdCBQeUJhc2VTdHJpbmdfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJiYXNlc3RyaW5nIiwKLQkwLAotCTAsCi0gCTAsCQkJIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJIAkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJIAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJIAkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQliYXNlc3RyaW5nX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCSZQeUJhc2VPYmplY3RfVHlwZSwJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQliYXNlc3RyaW5nX25ldywJCQkJLyogdHBfbmV3ICovCi0JMCwJCSAgICAgICAgICAgICAgICAJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImJhc2VzdHJpbmciLAorICAgIDAsCisgICAgMCwKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICBiYXNlc3RyaW5nX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAmUHlCYXNlT2JqZWN0X1R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGJhc2VzdHJpbmdfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBQeURvY19TVFJWQVIoc3RyaW5nX2RvYywKQEAgLTM3OTgsNzAgKzM3OTgsNzAgQEAKIElmIHRoZSBhcmd1bWVudCBpcyBhIHN0cmluZywgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc2FtZSBvYmplY3QuIik7CiAKIFB5VHlwZU9iamVjdCBQeVN0cmluZ19UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInN0ciIsCi0JUHlTdHJpbmdPYmplY3RfU0laRSwKLQlzaXplb2YoY2hhciksCi0gCXN0cmluZ19kZWFsbG9jLCAJCQkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYylzdHJpbmdfcHJpbnQsIAkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQlzdHJpbmdfcmVwciwgCQkJCS8qIHRwX3JlcHIgKi8KLQkmc3RyaW5nX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmc3RyaW5nX2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JJnN0cmluZ19hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpc3RyaW5nX2hhc2gsIAkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCXN0cmluZ19zdHIsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkmc3RyaW5nX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19TVFJJTkdfU1VCQ0xBU1MgfAotCQlQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSLAkvKiB0cF9mbGFncyAqLwotCXN0cmluZ19kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylzdHJpbmdfcmljaGNvbXBhcmUsCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzdHJpbmdfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCSZQeUJhc2VTdHJpbmdfVHlwZSwJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlzdHJpbmdfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsCSAgICAgICAgICAgICAgICAJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInN0ciIsCisgICAgUHlTdHJpbmdPYmplY3RfU0laRSwKKyAgICBzaXplb2YoY2hhciksCisgICAgc3RyaW5nX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKHByaW50ZnVuYylzdHJpbmdfcHJpbnQsICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIHN0cmluZ19yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZzdHJpbmdfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJnN0cmluZ19hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICZzdHJpbmdfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylzdHJpbmdfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIHN0cmluZ19zdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAmc3RyaW5nX2FzX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUyB8CisgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIsICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHN0cmluZ19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAocmljaGNtcGZ1bmMpc3RyaW5nX3JpY2hjb21wYXJlLCAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzdHJpbmdfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICZQeUJhc2VTdHJpbmdfVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgc3RyaW5nX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIHZvaWQKIFB5U3RyaW5nX0NvbmNhdChyZWdpc3RlciBQeU9iamVjdCAqKnB2LCByZWdpc3RlciBQeU9iamVjdCAqdykKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqdjsKLQlpZiAoKnB2ID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAodyA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjaygqcHYpKSB7Ci0JCVB5X0RFQ1JFRigqcHYpOwotCQkqcHYgPSBOVUxMOwotCQlyZXR1cm47Ci0JfQotCXYgPSBzdHJpbmdfY29uY2F0KChQeVN0cmluZ09iamVjdCAqKSAqcHYsIHcpOwotCVB5X0RFQ1JFRigqcHYpOwotCSpwdiA9IHY7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnY7CisgICAgaWYgKCpwdiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgaWYgKHcgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2soKnB2KSkgeworICAgICAgICBQeV9ERUNSRUYoKnB2KTsKKyAgICAgICAgKnB2ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2ID0gc3RyaW5nX2NvbmNhdCgoUHlTdHJpbmdPYmplY3QgKikgKnB2LCB3KTsKKyAgICBQeV9ERUNSRUYoKnB2KTsKKyAgICAqcHYgPSB2OwogfQogCiB2b2lkCiBQeVN0cmluZ19Db25jYXRBbmREZWwocmVnaXN0ZXIgUHlPYmplY3QgKipwdiwgcmVnaXN0ZXIgUHlPYmplY3QgKncpCiB7Ci0JUHlTdHJpbmdfQ29uY2F0KHB2LCB3KTsKLQlQeV9YREVDUkVGKHcpOworICAgIFB5U3RyaW5nX0NvbmNhdChwdiwgdyk7CisgICAgUHlfWERFQ1JFRih3KTsKIH0KIAogCkBAIC0zODgyLDMyICszODgyLDMyIEBACiBpbnQKIF9QeVN0cmluZ19SZXNpemUoUHlPYmplY3QgKipwdiwgUHlfc3NpemVfdCBuZXdzaXplKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotCXJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpzdjsKLQl2ID0gKnB2OwotCWlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlfUkVGQ05UKHYpICE9IDEgfHwgbmV3c2l6ZSA8IDAgfHwKLQkgICAgUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQodikpIHsKLQkJKnB2ID0gMDsKLQkJUHlfREVDUkVGKHYpOwotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiBYWFggVU5SRUYvTkVXUkVGIGludGVyZmFjZSBzaG91bGQgYmUgbW9yZSBzeW1tZXRyaWNhbCAqLwotCV9QeV9ERUNfUkVGVE9UQUw7Ci0JX1B5X0ZvcmdldFJlZmVyZW5jZSh2KTsKLQkqcHYgPSAoUHlPYmplY3QgKikKLQkJUHlPYmplY3RfUkVBTExPQygoY2hhciAqKXYsIFB5U3RyaW5nT2JqZWN0X1NJWkUgKyBuZXdzaXplKTsKLQlpZiAoKnB2ID09IE5VTEwpIHsKLQkJUHlPYmplY3RfRGVsKHYpOwotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCV9QeV9OZXdSZWZlcmVuY2UoKnB2KTsKLQlzdiA9IChQeVN0cmluZ09iamVjdCAqKSAqcHY7Ci0JUHlfU0laRShzdikgPSBuZXdzaXplOwotCXN2LT5vYl9zdmFsW25ld3NpemVdID0gJ1wwJzsKLQlzdi0+b2Jfc2hhc2ggPSAtMTsJLyogaW52YWxpZGF0ZSBjYWNoZWQgaGFzaCB2YWx1ZSAqLwotCXJldHVybiAwOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OworICAgIHJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpzdjsKKyAgICB2ID0gKnB2OworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlfUkVGQ05UKHYpICE9IDEgfHwgbmV3c2l6ZSA8IDAgfHwKKyAgICAgICAgUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQodikpIHsKKyAgICAgICAgKnB2ID0gMDsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBYWFggVU5SRUYvTkVXUkVGIGludGVyZmFjZSBzaG91bGQgYmUgbW9yZSBzeW1tZXRyaWNhbCAqLworICAgIF9QeV9ERUNfUkVGVE9UQUw7CisgICAgX1B5X0ZvcmdldFJlZmVyZW5jZSh2KTsKKyAgICAqcHYgPSAoUHlPYmplY3QgKikKKyAgICAgICAgUHlPYmplY3RfUkVBTExPQygoY2hhciAqKXYsIFB5U3RyaW5nT2JqZWN0X1NJWkUgKyBuZXdzaXplKTsKKyAgICBpZiAoKnB2ID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3RfRGVsKHYpOworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIF9QeV9OZXdSZWZlcmVuY2UoKnB2KTsKKyAgICBzdiA9IChQeVN0cmluZ09iamVjdCAqKSAqcHY7CisgICAgUHlfU0laRShzdikgPSBuZXdzaXplOworICAgIHN2LT5vYl9zdmFsW25ld3NpemVdID0gJ1wwJzsKKyAgICBzdi0+b2Jfc2hhc2ggPSAtMTsgICAgICAgICAgLyogaW52YWxpZGF0ZSBjYWNoZWQgaGFzaCB2YWx1ZSAqLworICAgIHJldHVybiAwOwogfQogCiAvKiBIZWxwZXJzIGZvciBmb3JtYXRzdHJpbmcgKi8KQEAgLTM5MTUsNTkgKzM5MTUsNTkgQEAKIFB5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogZ2V0bmV4dGFyZyhQeU9iamVjdCAqYXJncywgUHlfc3NpemVfdCBhcmdsZW4sIFB5X3NzaXplX3QgKnBfYXJnaWR4KQogewotCVB5X3NzaXplX3QgYXJnaWR4ID0gKnBfYXJnaWR4OwotCWlmIChhcmdpZHggPCBhcmdsZW4pIHsKLQkJKCpwX2FyZ2lkeCkrKzsKLQkJaWYgKGFyZ2xlbiA8IDApCi0JCQlyZXR1cm4gYXJnczsKLQkJZWxzZQotCQkJcmV0dXJuIFB5VHVwbGVfR2V0SXRlbShhcmdzLCBhcmdpZHgpOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJIm5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmb3JtYXQgc3RyaW5nIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfc3NpemVfdCBhcmdpZHggPSAqcF9hcmdpZHg7CisgICAgaWYgKGFyZ2lkeCA8IGFyZ2xlbikgeworICAgICAgICAoKnBfYXJnaWR4KSsrOworICAgICAgICBpZiAoYXJnbGVuIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBhcmdzOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGFyZ2lkeCk7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZm9ybWF0IHN0cmluZyIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBGb3JtYXQgY29kZXMKLSAqIEZfTEpVU1QJJy0nCi0gKiBGX1NJR04JJysnCi0gKiBGX0JMQU5LCScgJwotICogRl9BTFQJJyMnCi0gKiBGX1pFUk8JJzAnCisgKiBGX0xKVVNUICAgICAgJy0nCisgKiBGX1NJR04gICAgICAgJysnCisgKiBGX0JMQU5LICAgICAgJyAnCisgKiBGX0FMVCAgICAgICAgJyMnCisgKiBGX1pFUk8gICAgICAgJzAnCiAgKi8KICNkZWZpbmUgRl9MSlVTVCAoMTw8MCkKLSNkZWZpbmUgRl9TSUdOCSgxPDwxKQorI2RlZmluZSBGX1NJR04gICgxPDwxKQogI2RlZmluZSBGX0JMQU5LICgxPDwyKQotI2RlZmluZSBGX0FMVAkoMTw8MykKLSNkZWZpbmUgRl9aRVJPCSgxPDw0KQorI2RlZmluZSBGX0FMVCAgICgxPDwzKQorI2RlZmluZSBGX1pFUk8gICgxPDw0KQogCiAvKiBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSB0byBhIFB5U3RyaW5nIG9iamVjdCwgb3IgTlVMTCBvbiBmYWlsdXJlLiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybWF0ZmxvYXQoUHlPYmplY3QgKnYsIGludCBmbGFncywgaW50IHByZWMsIGludCB0eXBlKQogewotCWNoYXIgKnA7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlkb3VibGUgeDsKKyAgICBjaGFyICpwOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgZG91YmxlIHg7CiAKLQl4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImZsb2F0IGFyZ3VtZW50IHJlcXVpcmVkLCAiCi0JCQkgICAgICJub3QgJS4yMDBzIiwgUHlfVFlQRSh2KS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImZsb2F0IGFyZ3VtZW50IHJlcXVpcmVkLCAiCisgICAgICAgICAgICAgICAgICAgICAibm90ICUuMjAwcyIsIFB5X1RZUEUodiktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAocHJlYyA8IDApCi0JCXByZWMgPSA2OworICAgIGlmIChwcmVjIDwgMCkKKyAgICAgICAgcHJlYyA9IDY7CiAKLQlwID0gUHlPU19kb3VibGVfdG9fc3RyaW5nKHgsIHR5cGUsIHByZWMsCi0JCQkJICAoZmxhZ3MgJiBGX0FMVCkgPyBQeV9EVFNGX0FMVCA6IDAsIE5VTEwpOworICAgIHAgPSBQeU9TX2RvdWJsZV90b19zdHJpbmcoeCwgdHlwZSwgcHJlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEZfQUxUKSA/IFB5X0RUU0ZfQUxUIDogMCwgTlVMTCk7CiAKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCBzdHJsZW4ocCkpOwotCVB5TWVtX0ZyZWUocCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCBzdHJsZW4ocCkpOworICAgIFB5TWVtX0ZyZWUocCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogX1B5U3RyaW5nX0Zvcm1hdExvbmcgZW11bGF0ZXMgdGhlIGZvcm1hdCBjb2RlcyBkLCB1LCBvLCB4IGFuZCBYLCBhbmQKQEAgLTM5ODMsMjI2ICszOTgzLDIyNiBAQAogICogICAgICAgICBzZXQgaW4gZmxhZ3MuICBUaGUgY2FzZSBvZiBoZXggZGlnaXRzIHdpbGwgYmUgY29ycmVjdCwKICAqICAgICBUaGVyZSB3aWxsIGJlIGF0IGxlYXN0IHByZWMgZGlnaXRzLCB6ZXJvLWZpbGxlZCBvbiB0aGUgbGVmdCBpZgogICogICAgICAgICBuZWNlc3NhcnkgdG8gZ2V0IHRoYXQgbWFueS4KLSAqIHZhbAkJb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAotICogZmxhZ3MJYml0bWFzayBvZiBmb3JtYXQgZmxhZ3M7IG9ubHkgRl9BTFQgaXMgbG9va2VkIGF0Ci0gKiBwcmVjCQltaW5pbXVtIG51bWJlciBvZiBkaWdpdHM7IDAtZmlsbCBvbiBsZWZ0IGlmIG5lZWRlZAotICogdHlwZQkJYSBjaGFyYWN0ZXIgaW4gW2R1b3hYXTsgdSBhY3RzIHRoZSBzYW1lIGFzIGQKKyAqIHZhbCAgICAgICAgICBvYmplY3QgdG8gYmUgY29udmVydGVkCisgKiBmbGFncyAgICAgICAgYml0bWFzayBvZiBmb3JtYXQgZmxhZ3M7IG9ubHkgRl9BTFQgaXMgbG9va2VkIGF0CisgKiBwcmVjICAgICAgICAgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzOyAwLWZpbGwgb24gbGVmdCBpZiBuZWVkZWQKKyAqIHR5cGUgICAgICAgICBhIGNoYXJhY3RlciBpbiBbZHVveFhdOyB1IGFjdHMgdGhlIHNhbWUgYXMgZAogICoKICAqIENBVVRJT046ICBvLCB4IGFuZCBYIGNvbnZlcnNpb25zIG9uIHJlZ3VsYXIgaW50cyBjYW4gbmV2ZXIKICAqIHByb2R1Y2UgYSAnLScgc2lnbiwgYnV0IGNhbiBmb3IgUHl0aG9uJ3MgdW5ib3VuZGVkIGludHMuCiAgKi8KIFB5T2JqZWN0KgogX1B5U3RyaW5nX0Zvcm1hdExvbmcoUHlPYmplY3QgKnZhbCwgaW50IGZsYWdzLCBpbnQgcHJlYywgaW50IHR5cGUsCi0JCSAgICAgY2hhciAqKnBidWYsIGludCAqcGxlbikKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipwYnVmLCBpbnQgKnBsZW4pCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JY2hhciAqYnVmOwotCVB5X3NzaXplX3QgaTsKLQlpbnQgc2lnbjsJLyogMSBpZiAnLScsIGVsc2UgMCAqLwotCWludCBsZW47CS8qIG51bWJlciBvZiBjaGFyYWN0ZXJzICovCi0JUHlfc3NpemVfdCBsbGVuOwotCWludCBudW1kaWdpdHM7CS8qIGxlbiA9PSBudW1ub25kaWdpdHMgKyBudW1kaWdpdHMgKi8KLQlpbnQgbnVtbm9uZGlnaXRzID0gMDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBjaGFyICpidWY7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBzaWduOyAgICAgICAgICAgLyogMSBpZiAnLScsIGVsc2UgMCAqLworICAgIGludCBsZW47ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgKi8KKyAgICBQeV9zc2l6ZV90IGxsZW47CisgICAgaW50IG51bWRpZ2l0czsgICAgICAvKiBsZW4gPT0gbnVtbm9uZGlnaXRzICsgbnVtZGlnaXRzICovCisgICAgaW50IG51bW5vbmRpZ2l0cyA9IDA7CiAKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlICdkJzoKLQljYXNlICd1JzoKLQkJcmVzdWx0ID0gUHlfVFlQRSh2YWwpLT50cF9zdHIodmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JCXJlc3VsdCA9IFB5X1RZUEUodmFsKS0+dHBfYXNfbnVtYmVyLT5uYl9vY3QodmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSAneCc6Ci0JY2FzZSAnWCc6Ci0JCW51bW5vbmRpZ2l0cyA9IDI7Ci0JCXJlc3VsdCA9IFB5X1RZUEUodmFsKS0+dHBfYXNfbnVtYmVyLT5uYl9oZXgodmFsKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYXNzZXJ0KCEiJ3R5cGUnIG5vdCBpbiBbZHVveFhdIik7Ci0JfQotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gTlVMTDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICd1JzoKKyAgICAgICAgcmVzdWx0ID0gUHlfVFlQRSh2YWwpLT50cF9zdHIodmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbyc6CisgICAgICAgIHJlc3VsdCA9IFB5X1RZUEUodmFsKS0+dHBfYXNfbnVtYmVyLT5uYl9vY3QodmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAneCc6CisgICAgY2FzZSAnWCc6CisgICAgICAgIG51bW5vbmRpZ2l0cyA9IDI7CisgICAgICAgIHJlc3VsdCA9IFB5X1RZUEUodmFsKS0+dHBfYXNfbnVtYmVyLT5uYl9oZXgodmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KCEiJ3R5cGUnIG5vdCBpbiBbZHVveFhdIik7CisgICAgfQorICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCk7Ci0JaWYgKCFidWYpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBidWYgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpOworICAgIGlmICghYnVmKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBUbyBtb2RpZnkgdGhlIHN0cmluZyBpbi1wbGFjZSwgdGhlcmUgY2FuIG9ubHkgYmUgb25lIHJlZmVyZW5jZS4gKi8KLQlpZiAoUHlfUkVGQ05UKHJlc3VsdCkgIT0gMSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWxsZW4gPSBQeVN0cmluZ19TaXplKHJlc3VsdCk7Ci0JaWYgKGxsZW4gPiBJTlRfTUFYKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic3RyaW5nIHRvbyBsYXJnZSBpbiBfUHlTdHJpbmdfRm9ybWF0TG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbGVuID0gKGludClsbGVuOwotCWlmIChidWZbbGVuLTFdID09ICdMJykgewotCQktLWxlbjsKLQkJYnVmW2xlbl0gPSAnXDAnOwotCX0KLQlzaWduID0gYnVmWzBdID09ICctJzsKLQludW1ub25kaWdpdHMgKz0gc2lnbjsKLQludW1kaWdpdHMgPSBsZW4gLSBudW1ub25kaWdpdHM7Ci0JYXNzZXJ0KG51bWRpZ2l0cyA+IDApOworICAgIC8qIFRvIG1vZGlmeSB0aGUgc3RyaW5nIGluLXBsYWNlLCB0aGVyZSBjYW4gb25seSBiZSBvbmUgcmVmZXJlbmNlLiAqLworICAgIGlmIChQeV9SRUZDTlQocmVzdWx0KSAhPSAxKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbGxlbiA9IFB5U3RyaW5nX1NpemUocmVzdWx0KTsKKyAgICBpZiAobGxlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzdHJpbmcgdG9vIGxhcmdlIGluIF9QeVN0cmluZ19Gb3JtYXRMb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsZW4gPSAoaW50KWxsZW47CisgICAgaWYgKGJ1ZltsZW4tMV0gPT0gJ0wnKSB7CisgICAgICAgIC0tbGVuOworICAgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgfQorICAgIHNpZ24gPSBidWZbMF0gPT0gJy0nOworICAgIG51bW5vbmRpZ2l0cyArPSBzaWduOworICAgIG51bWRpZ2l0cyA9IGxlbiAtIG51bW5vbmRpZ2l0czsKKyAgICBhc3NlcnQobnVtZGlnaXRzID4gMCk7CiAKLQkvKiBHZXQgcmlkIG9mIGJhc2UgbWFya2VyIHVubGVzcyBGX0FMVCAqLwotCWlmICgoZmxhZ3MgJiBGX0FMVCkgPT0gMCkgewotCQkvKiBOZWVkIHRvIHNraXAgMHgsIDBYIG9yIDAuICovCi0JCWludCBza2lwcGVkID0gMDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgJ28nOgotCQkJYXNzZXJ0KGJ1ZltzaWduXSA9PSAnMCcpOwotCQkJLyogSWYgMCBpcyBvbmx5IGRpZ2l0LCBsZWF2ZSBpdCBhbG9uZS4gKi8KLQkJCWlmIChudW1kaWdpdHMgPiAxKSB7Ci0JCQkJc2tpcHBlZCA9IDE7Ci0JCQkJLS1udW1kaWdpdHM7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAneCc6Ci0JCWNhc2UgJ1gnOgotCQkJYXNzZXJ0KGJ1ZltzaWduXSA9PSAnMCcpOwotCQkJYXNzZXJ0KGJ1ZltzaWduICsgMV0gPT0gJ3gnKTsKLQkJCXNraXBwZWQgPSAyOwotCQkJbnVtbm9uZGlnaXRzIC09IDI7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc2tpcHBlZCkgewotCQkJYnVmICs9IHNraXBwZWQ7Ci0JCQlsZW4gLT0gc2tpcHBlZDsKLQkJCWlmIChzaWduKQotCQkJCWJ1ZlswXSA9ICctJzsKLQkJfQotCQlhc3NlcnQobGVuID09IG51bW5vbmRpZ2l0cyArIG51bWRpZ2l0cyk7Ci0JCWFzc2VydChudW1kaWdpdHMgPiAwKTsKLQl9CisgICAgLyogR2V0IHJpZCBvZiBiYXNlIG1hcmtlciB1bmxlc3MgRl9BTFQgKi8KKyAgICBpZiAoKGZsYWdzICYgRl9BTFQpID09IDApIHsKKyAgICAgICAgLyogTmVlZCB0byBza2lwIDB4LCAwWCBvciAwLiAqLworICAgICAgICBpbnQgc2tpcHBlZCA9IDA7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIGFzc2VydChidWZbc2lnbl0gPT0gJzAnKTsKKyAgICAgICAgICAgIC8qIElmIDAgaXMgb25seSBkaWdpdCwgbGVhdmUgaXQgYWxvbmUuICovCisgICAgICAgICAgICBpZiAobnVtZGlnaXRzID4gMSkgeworICAgICAgICAgICAgICAgIHNraXBwZWQgPSAxOworICAgICAgICAgICAgICAgIC0tbnVtZGlnaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgIGFzc2VydChidWZbc2lnbl0gPT0gJzAnKTsKKyAgICAgICAgICAgIGFzc2VydChidWZbc2lnbiArIDFdID09ICd4Jyk7CisgICAgICAgICAgICBza2lwcGVkID0gMjsKKyAgICAgICAgICAgIG51bW5vbmRpZ2l0cyAtPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNraXBwZWQpIHsKKyAgICAgICAgICAgIGJ1ZiArPSBza2lwcGVkOworICAgICAgICAgICAgbGVuIC09IHNraXBwZWQ7CisgICAgICAgICAgICBpZiAoc2lnbikKKyAgICAgICAgICAgICAgICBidWZbMF0gPSAnLSc7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGxlbiA9PSBudW1ub25kaWdpdHMgKyBudW1kaWdpdHMpOworICAgICAgICBhc3NlcnQobnVtZGlnaXRzID4gMCk7CisgICAgfQogCi0JLyogRmlsbCB3aXRoIGxlYWRpbmcgemVyb2VzIHRvIG1lZXQgbWluaW11bSB3aWR0aC4gKi8KLQlpZiAocHJlYyA+IG51bWRpZ2l0cykgewotCQlQeU9iamVjdCAqcjEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLAotCQkJCQludW1ub25kaWdpdHMgKyBwcmVjKTsKLQkJY2hhciAqYjE7Ci0JCWlmICghcjEpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJYjEgPSBQeVN0cmluZ19BU19TVFJJTkcocjEpOwotCQlmb3IgKGkgPSAwOyBpIDwgbnVtbm9uZGlnaXRzOyArK2kpCi0JCQkqYjErKyA9ICpidWYrKzsKLQkJZm9yIChpID0gMDsgaSA8IHByZWMgLSBudW1kaWdpdHM7IGkrKykKLQkJCSpiMSsrID0gJzAnOwotCQlmb3IgKGkgPSAwOyBpIDwgbnVtZGlnaXRzOyBpKyspCi0JCQkqYjErKyA9ICpidWYrKzsKLQkJKmIxID0gJ1wwJzsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJlc3VsdCA9IHIxOwotCQlidWYgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKLQkJbGVuID0gbnVtbm9uZGlnaXRzICsgcHJlYzsKLQl9CisgICAgLyogRmlsbCB3aXRoIGxlYWRpbmcgemVyb2VzIHRvIG1lZXQgbWluaW11bSB3aWR0aC4gKi8KKyAgICBpZiAocHJlYyA+IG51bWRpZ2l0cykgeworICAgICAgICBQeU9iamVjdCAqcjEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1ub25kaWdpdHMgKyBwcmVjKTsKKyAgICAgICAgY2hhciAqYjE7CisgICAgICAgIGlmICghcjEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYjEgPSBQeVN0cmluZ19BU19TVFJJTkcocjEpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtbm9uZGlnaXRzOyArK2kpCisgICAgICAgICAgICAqYjErKyA9ICpidWYrKzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHByZWMgLSBudW1kaWdpdHM7IGkrKykKKyAgICAgICAgICAgICpiMSsrID0gJzAnOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtZGlnaXRzOyBpKyspCisgICAgICAgICAgICAqYjErKyA9ICpidWYrKzsKKyAgICAgICAgKmIxID0gJ1wwJzsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IHIxOworICAgICAgICBidWYgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICAgICAgbGVuID0gbnVtbm9uZGlnaXRzICsgcHJlYzsKKyAgICB9CiAKLQkvKiBGaXggdXAgY2FzZSBmb3IgaGV4IGNvbnZlcnNpb25zLiAqLwotCWlmICh0eXBlID09ICdYJykgewotCQkvKiBOZWVkIHRvIGNvbnZlcnQgYWxsIGxvd2VyIGNhc2UgbGV0dGVycyB0byB1cHBlciBjYXNlLgotCQkgICBhbmQgbmVlZCB0byBjb252ZXJ0IDB4IHRvIDBYIChhbmQgLTB4IHRvIC0wWCkuICovCi0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCWlmIChidWZbaV0gPj0gJ2EnICYmIGJ1ZltpXSA8PSAneCcpCi0JCQkJYnVmW2ldIC09ICdhJy0nQSc7Ci0JfQotCSpwYnVmID0gYnVmOwotCSpwbGVuID0gbGVuOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogRml4IHVwIGNhc2UgZm9yIGhleCBjb252ZXJzaW9ucy4gKi8KKyAgICBpZiAodHlwZSA9PSAnWCcpIHsKKyAgICAgICAgLyogTmVlZCB0byBjb252ZXJ0IGFsbCBsb3dlciBjYXNlIGxldHRlcnMgdG8gdXBwZXIgY2FzZS4KKyAgICAgICAgICAgYW5kIG5lZWQgdG8gY29udmVydCAweCB0byAwWCAoYW5kIC0weCB0byAtMFgpLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICBpZiAoYnVmW2ldID49ICdhJyAmJiBidWZbaV0gPD0gJ3gnKQorICAgICAgICAgICAgICAgIGJ1ZltpXSAtPSAnYSctJ0EnOworICAgIH0KKyAgICAqcGJ1ZiA9IGJ1ZjsKKyAgICAqcGxlbiA9IGxlbjsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeV9MT0NBTF9JTkxJTkUoaW50KQogZm9ybWF0aW50KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgaW50IGZsYWdzLAogICAgICAgICAgIGludCBwcmVjLCBpbnQgdHlwZSwgUHlPYmplY3QgKnYpCiB7Ci0JLyogZm10ID0gJyUjLicgKyBgcHJlY2AgKyAnbCcgKyBgdHlwZWAKLQkgICB3b3JzdCBjYXNlIGxlbmd0aCA9IDMgKyAxOSAod29yc3QgbGVuIG9mIElOVF9NQVggb24gNjQtYml0IG1hY2hpbmUpCi0JICAgKyAxICsgMSA9IDI0ICovCi0JY2hhciBmbXRbNjRdOwkvKiBwbGVudHkgYmlnIGVub3VnaCEgKi8KLQljaGFyICpzaWduOwotCWxvbmcgeDsKKyAgICAvKiBmbXQgPSAnJSMuJyArIGBwcmVjYCArICdsJyArIGB0eXBlYAorICAgICAgIHdvcnN0IGNhc2UgbGVuZ3RoID0gMyArIDE5ICh3b3JzdCBsZW4gb2YgSU5UX01BWCBvbiA2NC1iaXQgbWFjaGluZSkKKyAgICAgICArIDEgKyAxID0gMjQgKi8KKyAgICBjaGFyIGZtdFs2NF07ICAgICAgIC8qIHBsZW50eSBiaWcgZW5vdWdoISAqLworICAgIGNoYXIgKnNpZ247CisgICAgbG9uZyB4OwogCi0JeCA9IFB5SW50X0FzTG9uZyh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJpbnQgYXJndW1lbnQgcmVxdWlyZWQsIG5vdCAlLjIwMHMiLAotCQkJICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoeCA8IDAgJiYgdHlwZSA9PSAndScpIHsKLQkJdHlwZSA9ICdkJzsKLQl9Ci0JaWYgKHggPCAwICYmICh0eXBlID09ICd4JyB8fCB0eXBlID09ICdYJyB8fCB0eXBlID09ICdvJykpCi0JCXNpZ24gPSAiLSI7Ci0JZWxzZQotCQlzaWduID0gIiI7Ci0JaWYgKHByZWMgPCAwKQotCQlwcmVjID0gMTsKKyAgICB4ID0gUHlJbnRfQXNMb25nKHYpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImludCBhcmd1bWVudCByZXF1aXJlZCwgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoeCA8IDAgJiYgdHlwZSA9PSAndScpIHsKKyAgICAgICAgdHlwZSA9ICdkJzsKKyAgICB9CisgICAgaWYgKHggPCAwICYmICh0eXBlID09ICd4JyB8fCB0eXBlID09ICdYJyB8fCB0eXBlID09ICdvJykpCisgICAgICAgIHNpZ24gPSAiLSI7CisgICAgZWxzZQorICAgICAgICBzaWduID0gIiI7CisgICAgaWYgKHByZWMgPCAwKQorICAgICAgICBwcmVjID0gMTsKIAotCWlmICgoZmxhZ3MgJiBGX0FMVCkgJiYKLQkgICAgKHR5cGUgPT0gJ3gnIHx8IHR5cGUgPT0gJ1gnKSkgewotCQkvKiBXaGVuIGNvbnZlcnRpbmcgdW5kZXIgJSN4IG9yICUjWCwgdGhlcmUgYXJlIGEgbnVtYmVyCi0JCSAqIG9mIGlzc3VlcyB0aGF0IGNhdXNlIHBhaW46Ci0JCSAqIC0gd2hlbiAwIGlzIGJlaW5nIGNvbnZlcnRlZCwgdGhlIEMgc3RhbmRhcmQgbGVhdmVzIG9mZgotCQkgKiAgIHRoZSAnMHgnIG9yICcwWCcsIHdoaWNoIGlzIGluY29uc2lzdGVudCB3aXRoIG90aGVyCi0JCSAqICAgJSN4LyUjWCBjb252ZXJzaW9ucyBhbmQgaW5jb25zaXN0ZW50IHdpdGggUHl0aG9uJ3MKLQkJICogICBoZXgoKSBmdW5jdGlvbgotCQkgKiAtIHRoZXJlIGFyZSBwbGF0Zm9ybXMgdGhhdCB2aW9sYXRlIHRoZSBzdGFuZGFyZCBhbmQKLQkJICogICBjb252ZXJ0IDAgd2l0aCB0aGUgJzB4JyBvciAnMFgnCi0JCSAqICAgKE1ldHJvd2Vya3MsIENvbXBhcSBUcnU2NCkKLQkJICogLSB0aGVyZSBhcmUgcGxhdGZvcm1zIHRoYXQgZ2l2ZSAnMHgnIHdoZW4gY29udmVydGluZwotCQkgKiAgIHVuZGVyICUjWCwgYnV0IGNvbnZlcnQgMCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0JCSAqICAgc3RhbmRhcmQgKE9TLzIgRU1YKQotCQkgKgotCQkgKiBXZSBjYW4gYWNoaWV2ZSB0aGUgZGVzaXJlZCBjb25zaXN0ZW5jeSBieSBpbnNlcnRpbmcgb3VyCi0JCSAqIG93biAnMHgnIG9yICcwWCcgcHJlZml4LCBhbmQgc3Vic3RpdHV0aW5nICV4LyVYIGluIHBsYWNlCi0JCSAqIG9mICUjeC8lI1guCi0JCSAqCi0JCSAqIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGFwcHJvYWNoIGFzIHVzZWQgaW4KLQkJICogZm9ybWF0aW50KCkgaW4gdW5pY29kZW9iamVjdC5jCi0JCSAqLwotCQlQeU9TX3NucHJpbnRmKGZtdCwgc2l6ZW9mKGZtdCksICIlczAlYyUlLiVkbCVjIiwKLQkJCSAgICAgIHNpZ24sIHR5cGUsIHByZWMsIHR5cGUpOwotCX0KLQllbHNlIHsKLQkJUHlPU19zbnByaW50ZihmbXQsIHNpemVvZihmbXQpLCAiJXMlJSVzLiVkbCVjIiwKLQkJCSAgICAgIHNpZ24sIChmbGFncyZGX0FMVCkgPyAiIyIgOiAiIiwKLQkJCSAgICAgIHByZWMsIHR5cGUpOwotCX0KKyAgICBpZiAoKGZsYWdzICYgRl9BTFQpICYmCisgICAgICAgICh0eXBlID09ICd4JyB8fCB0eXBlID09ICdYJykpIHsKKyAgICAgICAgLyogV2hlbiBjb252ZXJ0aW5nIHVuZGVyICUjeCBvciAlI1gsIHRoZXJlIGFyZSBhIG51bWJlcgorICAgICAgICAgKiBvZiBpc3N1ZXMgdGhhdCBjYXVzZSBwYWluOgorICAgICAgICAgKiAtIHdoZW4gMCBpcyBiZWluZyBjb252ZXJ0ZWQsIHRoZSBDIHN0YW5kYXJkIGxlYXZlcyBvZmYKKyAgICAgICAgICogICB0aGUgJzB4JyBvciAnMFgnLCB3aGljaCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBvdGhlcgorICAgICAgICAgKiAgICUjeC8lI1ggY29udmVyc2lvbnMgYW5kIGluY29uc2lzdGVudCB3aXRoIFB5dGhvbidzCisgICAgICAgICAqICAgaGV4KCkgZnVuY3Rpb24KKyAgICAgICAgICogLSB0aGVyZSBhcmUgcGxhdGZvcm1zIHRoYXQgdmlvbGF0ZSB0aGUgc3RhbmRhcmQgYW5kCisgICAgICAgICAqICAgY29udmVydCAwIHdpdGggdGhlICcweCcgb3IgJzBYJworICAgICAgICAgKiAgIChNZXRyb3dlcmtzLCBDb21wYXEgVHJ1NjQpCisgICAgICAgICAqIC0gdGhlcmUgYXJlIHBsYXRmb3JtcyB0aGF0IGdpdmUgJzB4JyB3aGVuIGNvbnZlcnRpbmcKKyAgICAgICAgICogICB1bmRlciAlI1gsIGJ1dCBjb252ZXJ0IDAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorICAgICAgICAgKiAgIHN0YW5kYXJkIChPUy8yIEVNWCkKKyAgICAgICAgICoKKyAgICAgICAgICogV2UgY2FuIGFjaGlldmUgdGhlIGRlc2lyZWQgY29uc2lzdGVuY3kgYnkgaW5zZXJ0aW5nIG91cgorICAgICAgICAgKiBvd24gJzB4JyBvciAnMFgnIHByZWZpeCwgYW5kIHN1YnN0aXR1dGluZyAleC8lWCBpbiBwbGFjZQorICAgICAgICAgKiBvZiAlI3gvJSNYLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhcHByb2FjaCBhcyB1c2VkIGluCisgICAgICAgICAqIGZvcm1hdGludCgpIGluIHVuaWNvZGVvYmplY3QuYworICAgICAgICAgKi8KKyAgICAgICAgUHlPU19zbnByaW50ZihmbXQsIHNpemVvZihmbXQpLCAiJXMwJWMlJS4lZGwlYyIsCisgICAgICAgICAgICAgICAgICAgICAgc2lnbiwgdHlwZSwgcHJlYywgdHlwZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9TX3NucHJpbnRmKGZtdCwgc2l6ZW9mKGZtdCksICIlcyUlJXMuJWRsJWMiLAorICAgICAgICAgICAgICAgICAgICAgIHNpZ24sIChmbGFncyZGX0FMVCkgPyAiIyIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVjLCB0eXBlKTsKKyAgICB9CiAKLQkvKiBidWYgPSAnKycvJy0nLycnICsgJzAnLycweCcvJycgKyAnWzAtOV0nKm1heChwcmVjLCBsZW4oeCBpbiBvY3RhbCkpCi0JICogd29yc3QgY2FzZSBidWYgPSAnLTB4JyArIFswLTldKnByZWMsIHdoZXJlIHByZWMgPj0gMTEKLQkgKi8KLQlpZiAoYnVmbGVuIDw9IDE0IHx8IGJ1ZmxlbiA8PSAoc2l6ZV90KTMgKyAoc2l6ZV90KXByZWMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCSAgICAiZm9ybWF0dGVkIGludGVnZXIgaXMgdG9vIGxvbmcgKHByZWNpc2lvbiB0b28gbGFyZ2U/KSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChzaWduWzBdKQotCQlQeU9TX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCBmbXQsIC14KTsKLQllbHNlCi0JCVB5T1Nfc25wcmludGYoYnVmLCBidWZsZW4sIGZtdCwgeCk7Ci0JcmV0dXJuIChpbnQpc3RybGVuKGJ1Zik7CisgICAgLyogYnVmID0gJysnLyctJy8nJyArICcwJy8nMHgnLycnICsgJ1swLTldJyptYXgocHJlYywgbGVuKHggaW4gb2N0YWwpKQorICAgICAqIHdvcnN0IGNhc2UgYnVmID0gJy0weCcgKyBbMC05XSpwcmVjLCB3aGVyZSBwcmVjID49IDExCisgICAgICovCisgICAgaWYgKGJ1ZmxlbiA8PSAxNCB8fCBidWZsZW4gPD0gKHNpemVfdCkzICsgKHNpemVfdClwcmVjKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgImZvcm1hdHRlZCBpbnRlZ2VyIGlzIHRvbyBsb25nIChwcmVjaXNpb24gdG9vIGxhcmdlPykiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc2lnblswXSkKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIGJ1ZmxlbiwgZm10LCAteCk7CisgICAgZWxzZQorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCBmbXQsIHgpOworICAgIHJldHVybiAoaW50KXN0cmxlbihidWYpOwogfQogCiBQeV9MT0NBTF9JTkxJTkUoaW50KQogZm9ybWF0Y2hhcihjaGFyICpidWYsIHNpemVfdCBidWZsZW4sIFB5T2JqZWN0ICp2KQogewotCS8qIHByZXN1bWUgdGhhdCB0aGUgYnVmZmVyIGlzIGF0IGxlYXN0IDIgY2hhcmFjdGVycyBsb25nICovCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCWlmICghUHlBcmdfUGFyc2UodiwgImM7JWMgcmVxdWlyZXMgaW50IG9yIGNoYXIiLCAmYnVmWzBdKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghUHlBcmdfUGFyc2UodiwgImI7JWMgcmVxdWlyZXMgaW50IG9yIGNoYXIiLCAmYnVmWzBdKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JYnVmWzFdID0gJ1wwJzsKLQlyZXR1cm4gMTsKKyAgICAvKiBwcmVzdW1lIHRoYXQgdGhlIGJ1ZmZlciBpcyBhdCBsZWFzdCAyIGNoYXJhY3RlcnMgbG9uZyAqLworICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJjOyVjIHJlcXVpcmVzIGludCBvciBjaGFyIiwgJmJ1ZlswXSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJiOyVjIHJlcXVpcmVzIGludCBvciBjaGFyIiwgJmJ1ZlswXSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGJ1ZlsxXSA9ICdcMCc7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIGZtdCUodjEsdjIsLi4uKSBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gc3ByaW50ZihmbXQsIHYxLCB2MiwgLi4uKQpAQCAtNDIxOCw2MTUgKzQyMTgsNjE1IEBACiBQeU9iamVjdCAqCiBQeVN0cmluZ19Gb3JtYXQoUHlPYmplY3QgKmZvcm1hdCwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZm10LCAqcmVzOwotCVB5X3NzaXplX3QgYXJnbGVuLCBhcmdpZHg7Ci0JUHlfc3NpemVfdCByZXNsZW4sIHJlc2NudCwgZm10Y250OwotCWludCBhcmdzX293bmVkID0gMDsKLQlQeU9iamVjdCAqcmVzdWx0LCAqb3JpZ19hcmdzOworICAgIGNoYXIgKmZtdCwgKnJlczsKKyAgICBQeV9zc2l6ZV90IGFyZ2xlbiwgYXJnaWR4OworICAgIFB5X3NzaXplX3QgcmVzbGVuLCByZXNjbnQsIGZtdGNudDsKKyAgICBpbnQgYXJnc19vd25lZCA9IDA7CisgICAgUHlPYmplY3QgKnJlc3VsdCwgKm9yaWdfYXJnczsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JUHlPYmplY3QgKnYsICp3OworICAgIFB5T2JqZWN0ICp2LCAqdzsKICNlbmRpZgotCVB5T2JqZWN0ICpkaWN0ID0gTlVMTDsKLQlpZiAoZm9ybWF0ID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKGZvcm1hdCkgfHwgYXJncyA9PSBOVUxMKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb3JpZ19hcmdzID0gYXJnczsKLQlmbXQgPSBQeVN0cmluZ19BU19TVFJJTkcoZm9ybWF0KTsKLQlmbXRjbnQgPSBQeVN0cmluZ19HRVRfU0laRShmb3JtYXQpOwotCXJlc2xlbiA9IHJlc2NudCA9IGZtdGNudCArIDEwMDsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHJlc2xlbik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpOwotCWlmIChQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCWFyZ2xlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JCWFyZ2lkeCA9IDA7Ci0JfQotCWVsc2UgewotCQlhcmdsZW4gPSAtMTsKLQkJYXJnaWR4ID0gLTI7Ci0JfQotCWlmIChQeV9UWVBFKGFyZ3MpLT50cF9hc19tYXBwaW5nICYmICFQeVR1cGxlX0NoZWNrKGFyZ3MpICYmCi0JICAgICFQeU9iamVjdF9UeXBlQ2hlY2soYXJncywgJlB5QmFzZVN0cmluZ19UeXBlKSkKLQkJZGljdCA9IGFyZ3M7Ci0Jd2hpbGUgKC0tZm10Y250ID49IDApIHsKLQkJaWYgKCpmbXQgIT0gJyUnKSB7Ci0JCQlpZiAoLS1yZXNjbnQgPCAwKSB7Ci0JCQkJcmVzY250ID0gZm10Y250ICsgMTAwOwotCQkJCXJlc2xlbiArPSByZXNjbnQ7Ci0JCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJcmVzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkKLQkJCQkJKyByZXNsZW4gLSByZXNjbnQ7Ci0JCQkJLS1yZXNjbnQ7Ci0JCQl9Ci0JCQkqcmVzKysgPSAqZm10Kys7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBHb3QgYSBmb3JtYXQgc3BlY2lmaWVyICovCi0JCQlpbnQgZmxhZ3MgPSAwOwotCQkJUHlfc3NpemVfdCB3aWR0aCA9IC0xOwotCQkJaW50IHByZWMgPSAtMTsKLQkJCWludCBjID0gJ1wwJzsKLQkJCWludCBmaWxsOwotCQkJaW50IGlzbnVtb2s7Ci0JCQlQeU9iamVjdCAqdiA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqdGVtcCA9IE5VTEw7Ci0JCQljaGFyICpwYnVmOwotCQkJaW50IHNpZ247Ci0JCQlQeV9zc2l6ZV90IGxlbjsKLQkJCWNoYXIgZm9ybWF0YnVmW0ZPUk1BVEJVRkxFTl07Ci0JCQkgICAgIC8qIEZvciBmb3JtYXR7aW50LGNoYXJ9KCkgKi8KKyAgICBQeU9iamVjdCAqZGljdCA9IE5VTEw7CisgICAgaWYgKGZvcm1hdCA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhmb3JtYXQpIHx8IGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9yaWdfYXJncyA9IGFyZ3M7CisgICAgZm10ID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZvcm1hdCk7CisgICAgZm10Y250ID0gUHlTdHJpbmdfR0VUX1NJWkUoZm9ybWF0KTsKKyAgICByZXNsZW4gPSByZXNjbnQgPSBmbXRjbnQgKyAxMDA7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCByZXNsZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KTsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgICAgICBhcmdsZW4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgICAgICBhcmdpZHggPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXJnbGVuID0gLTE7CisgICAgICAgIGFyZ2lkeCA9IC0yOworICAgIH0KKyAgICBpZiAoUHlfVFlQRShhcmdzKS0+dHBfYXNfbWFwcGluZyAmJiAhUHlUdXBsZV9DaGVjayhhcmdzKSAmJgorICAgICAgICAhUHlPYmplY3RfVHlwZUNoZWNrKGFyZ3MsICZQeUJhc2VTdHJpbmdfVHlwZSkpCisgICAgICAgIGRpY3QgPSBhcmdzOworICAgIHdoaWxlICgtLWZtdGNudCA+PSAwKSB7CisgICAgICAgIGlmICgqZm10ICE9ICclJykgeworICAgICAgICAgICAgaWYgKC0tcmVzY250IDwgMCkgeworICAgICAgICAgICAgICAgIHJlc2NudCA9IGZtdGNudCArIDEwMDsKKyAgICAgICAgICAgICAgICByZXNsZW4gKz0gcmVzY250OworICAgICAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIHJlc2xlbikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICsgcmVzbGVuIC0gcmVzY250OworICAgICAgICAgICAgICAgIC0tcmVzY250OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnJlcysrID0gKmZtdCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogR290IGEgZm9ybWF0IHNwZWNpZmllciAqLworICAgICAgICAgICAgaW50IGZsYWdzID0gMDsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qgd2lkdGggPSAtMTsKKyAgICAgICAgICAgIGludCBwcmVjID0gLTE7CisgICAgICAgICAgICBpbnQgYyA9ICdcMCc7CisgICAgICAgICAgICBpbnQgZmlsbDsKKyAgICAgICAgICAgIGludCBpc251bW9rOworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBOVUxMOworICAgICAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBOVUxMOworICAgICAgICAgICAgY2hhciAqcGJ1ZjsKKyAgICAgICAgICAgIGludCBzaWduOworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47CisgICAgICAgICAgICBjaGFyIGZvcm1hdGJ1ZltGT1JNQVRCVUZMRU5dOworICAgICAgICAgICAgICAgICAvKiBGb3IgZm9ybWF0e2ludCxjaGFyfSgpICovCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJY2hhciAqZm10X3N0YXJ0ID0gZm10OwotCQkJUHlfc3NpemVfdCBhcmdpZHhfc3RhcnQgPSBhcmdpZHg7CisgICAgICAgICAgICBjaGFyICpmbXRfc3RhcnQgPSBmbXQ7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGFyZ2lkeF9zdGFydCA9IGFyZ2lkeDsKICNlbmRpZgogCi0JCQlmbXQrKzsKLQkJCWlmICgqZm10ID09ICcoJykgewotCQkJCWNoYXIgKmtleXN0YXJ0OwotCQkJCVB5X3NzaXplX3Qga2V5bGVuOwotCQkJCVB5T2JqZWN0ICprZXk7Ci0JCQkJaW50IHBjb3VudCA9IDE7CisgICAgICAgICAgICBmbXQrKzsKKyAgICAgICAgICAgIGlmICgqZm10ID09ICcoJykgeworICAgICAgICAgICAgICAgIGNoYXIgKmtleXN0YXJ0OworICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qga2V5bGVuOworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprZXk7CisgICAgICAgICAgICAgICAgaW50IHBjb3VudCA9IDE7CiAKLQkJCQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkgImZvcm1hdCByZXF1aXJlcyBhIG1hcHBpbmciKTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQkJKytmbXQ7Ci0JCQkJLS1mbXRjbnQ7Ci0JCQkJa2V5c3RhcnQgPSBmbXQ7Ci0JCQkJLyogU2tpcCBvdmVyIGJhbGFuY2VkIHBhcmVudGhlc2VzICovCi0JCQkJd2hpbGUgKHBjb3VudCA+IDAgJiYgLS1mbXRjbnQgPj0gMCkgewotCQkJCQlpZiAoKmZtdCA9PSAnKScpCi0JCQkJCQktLXBjb3VudDsKLQkJCQkJZWxzZSBpZiAoKmZtdCA9PSAnKCcpCi0JCQkJCQkrK3Bjb3VudDsKLQkJCQkJZm10Kys7Ci0JCQkJfQotCQkJCWtleWxlbiA9IGZtdCAtIGtleXN0YXJ0IC0gMTsKLQkJCQlpZiAoZm10Y250IDwgMCB8fCBwY291bnQgPiAwKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJICAgImluY29tcGxldGUgZm9ybWF0IGtleSIpOwotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJCQlrZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShrZXlzdGFydCwKLQkJCQkJCQkJIGtleWxlbik7Ci0JCQkJaWYgKGtleSA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCWlmIChhcmdzX293bmVkKSB7Ci0JCQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJCQkJYXJnc19vd25lZCA9IDA7Ci0JCQkJfQotCQkJCWFyZ3MgPSBQeU9iamVjdF9HZXRJdGVtKGRpY3QsIGtleSk7Ci0JCQkJUHlfREVDUkVGKGtleSk7Ci0JCQkJaWYgKGFyZ3MgPT0gTlVMTCkgewotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJCQlhcmdzX293bmVkID0gMTsKLQkJCQlhcmdsZW4gPSAtMTsKLQkJCQlhcmdpZHggPSAtMjsKLQkJCX0KLQkJCXdoaWxlICgtLWZtdGNudCA+PSAwKSB7Ci0JCQkJc3dpdGNoIChjID0gKmZtdCsrKSB7Ci0JCQkJY2FzZSAnLSc6IGZsYWdzIHw9IEZfTEpVU1Q7IGNvbnRpbnVlOwotCQkJCWNhc2UgJysnOiBmbGFncyB8PSBGX1NJR047IGNvbnRpbnVlOwotCQkJCWNhc2UgJyAnOiBmbGFncyB8PSBGX0JMQU5LOyBjb250aW51ZTsKLQkJCQljYXNlICcjJzogZmxhZ3MgfD0gRl9BTFQ7IGNvbnRpbnVlOwotCQkJCWNhc2UgJzAnOiBmbGFncyB8PSBGX1pFUk87IGNvbnRpbnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjID09ICcqJykgewotCQkJCXYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7Ci0JCQkJaWYgKHYgPT0gTlVMTCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlpZiAoIVB5SW50X0NoZWNrKHYpKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkJIiogd2FudHMgaW50Iik7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCXdpZHRoID0gUHlJbnRfQXNMb25nKHYpOwotCQkJCWlmICh3aWR0aCA8IDApIHsKLQkJCQkJZmxhZ3MgfD0gRl9MSlVTVDsKLQkJCQkJd2lkdGggPSAtd2lkdGg7Ci0JCQkJfQotCQkJCWlmICgtLWZtdGNudCA+PSAwKQotCQkJCQljID0gKmZtdCsrOwotCQkJfQotCQkJZWxzZSBpZiAoYyA+PSAwICYmIGlzZGlnaXQoYykpIHsKLQkJCQl3aWR0aCA9IGMgLSAnMCc7Ci0JCQkJd2hpbGUgKC0tZm10Y250ID49IDApIHsKLQkJCQkJYyA9IFB5X0NIQVJNQVNLKCpmbXQrKyk7Ci0JCQkJCWlmICghaXNkaWdpdChjKSkKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAoKHdpZHRoKjEwKSAvIDEwICE9IHdpZHRoKSB7Ci0JCQkJCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJCQkJUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCQkid2lkdGggdG9vIGJpZyIpOwotCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJfQotCQkJCQl3aWR0aCA9IHdpZHRoKjEwICsgKGMgLSAnMCcpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjID09ICcuJykgewotCQkJCXByZWMgPSAwOwotCQkJCWlmICgtLWZtdGNudCA+PSAwKQotCQkJCQljID0gKmZtdCsrOwotCQkJCWlmIChjID09ICcqJykgewotCQkJCQl2ID0gZ2V0bmV4dGFyZyhhcmdzLCBhcmdsZW4sICZhcmdpZHgpOwotCQkJCQlpZiAodiA9PSBOVUxMKQotCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJaWYgKCFQeUludF9DaGVjayh2KSkgewotCQkJCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCQkiKiB3YW50cyBpbnQiKTsKLQkJCQkJCWdvdG8gZXJyb3I7Ci0JCQkJCX0KLQkJCQkJcHJlYyA9IFB5SW50X0FzTG9uZyh2KTsKLQkJCQkJaWYgKHByZWMgPCAwKQotCQkJCQkJcHJlYyA9IDA7Ci0JCQkJCWlmICgtLWZtdGNudCA+PSAwKQotCQkJCQkJYyA9ICpmbXQrKzsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYyA+PSAwICYmIGlzZGlnaXQoYykpIHsKLQkJCQkJcHJlYyA9IGMgLSAnMCc7Ci0JCQkJCXdoaWxlICgtLWZtdGNudCA+PSAwKSB7Ci0JCQkJCQljID0gUHlfQ0hBUk1BU0soKmZtdCsrKTsKLQkJCQkJCWlmICghaXNkaWdpdChjKSkKLQkJCQkJCQlicmVhazsKLQkJCQkJCWlmICgocHJlYyoxMCkgLyAxMCAhPSBwcmVjKSB7Ci0JCQkJCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCQkJCSAgICBQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJCSAgICAicHJlYyB0b28gYmlnIik7Ci0JCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJCX0KLQkJCQkJCXByZWMgPSBwcmVjKjEwICsgKGMgLSAnMCcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSAvKiBwcmVjICovCi0JCQlpZiAoZm10Y250ID49IDApIHsKLQkJCQlpZiAoYyA9PSAnaCcgfHwgYyA9PSAnbCcgfHwgYyA9PSAnTCcpIHsKLQkJCQkJaWYgKC0tZm10Y250ID49IDApCi0JCQkJCQljID0gKmZtdCsrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmbXRjbnQgPCAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiaW5jb21wbGV0ZSBmb3JtYXQiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKGMgIT0gJyUnKSB7Ci0JCQkJdiA9IGdldG5leHRhcmcoYXJncywgYXJnbGVuLCAmYXJnaWR4KTsKLQkJCQlpZiAodiA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJc2lnbiA9IDA7Ci0JCQlmaWxsID0gJyAnOwotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICclJzoKLQkJCQlwYnVmID0gIiUiOwotCQkJCWxlbiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdzJzoKLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQkJaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQkJCQlmbXQgPSBmbXRfc3RhcnQ7Ci0JCQkJCWFyZ2lkeCA9IGFyZ2lkeF9zdGFydDsKLQkJCQkJZ290byB1bmljb2RlOwotCQkJCX0KLSNlbmRpZgotCQkJCXRlbXAgPSBfUHlPYmplY3RfU3RyKHYpOwotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCQlpZiAodGVtcCAhPSBOVUxMICYmIFB5VW5pY29kZV9DaGVjayh0ZW1wKSkgewotCQkJCQlQeV9ERUNSRUYodGVtcCk7Ci0JCQkJCWZtdCA9IGZtdF9zdGFydDsKLQkJCQkJYXJnaWR4ID0gYXJnaWR4X3N0YXJ0OwotCQkJCQlnb3RvIHVuaWNvZGU7Ci0JCQkJfQotI2VuZGlmCi0JCQkJLyogRmFsbCB0aHJvdWdoICovCi0JCQljYXNlICdyJzoKLQkJCQlpZiAoYyA9PSAncicpCi0JCQkJCXRlbXAgPSBQeU9iamVjdF9SZXByKHYpOwotCQkJCWlmICh0ZW1wID09IE5VTEwpCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJaWYgKCFQeVN0cmluZ19DaGVjayh0ZW1wKSkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkgICIlcyBhcmd1bWVudCBoYXMgbm9uLXN0cmluZyBzdHIoKSIpOwotCQkJCQlQeV9ERUNSRUYodGVtcCk7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCXBidWYgPSBQeVN0cmluZ19BU19TVFJJTkcodGVtcCk7Ci0JCQkJbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodGVtcCk7Ci0JCQkJaWYgKHByZWMgPj0gMCAmJiBsZW4gPiBwcmVjKQotCQkJCQlsZW4gPSBwcmVjOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnaSc6Ci0JCQljYXNlICdkJzoKLQkJCWNhc2UgJ3UnOgotCQkJY2FzZSAnbyc6Ci0JCQljYXNlICd4JzoKLQkJCWNhc2UgJ1gnOgotCQkJCWlmIChjID09ICdpJykKLQkJCQkJYyA9ICdkJzsKLQkJCQlpc251bW9rID0gMDsKLQkJCQlpZiAoUHlOdW1iZXJfQ2hlY2sodikpIHsKLQkJCQkJUHlPYmplY3QgKmlvYmo9TlVMTDsKLQotCQkJCQlpZiAoUHlJbnRfQ2hlY2sodikgfHwgKFB5TG9uZ19DaGVjayh2KSkpIHsKLQkJCQkJCWlvYmogPSB2OwotCQkJCQkJUHlfSU5DUkVGKGlvYmopOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaW9iaiA9IFB5TnVtYmVyX0ludCh2KTsKLQkJCQkJCWlmIChpb2JqPT1OVUxMKSBpb2JqID0gUHlOdW1iZXJfTG9uZyh2KTsKLQkJCQkJfQotCQkJCQlpZiAoaW9iaiE9TlVMTCkgewotCQkJCQkJaWYgKFB5SW50X0NoZWNrKGlvYmopKSB7Ci0JCQkJCQkJaXNudW1vayA9IDE7Ci0JCQkJCQkJcGJ1ZiA9IGZvcm1hdGJ1ZjsKLQkJCQkJCQlsZW4gPSBmb3JtYXRpbnQocGJ1ZiwKLQkJCQkJCQkJCXNpemVvZihmb3JtYXRidWYpLAotCQkJCQkJCQkJZmxhZ3MsIHByZWMsIGMsIGlvYmopOwotCQkJCQkJCVB5X0RFQ1JFRihpb2JqKTsKLQkJCQkJCQlpZiAobGVuIDwgMCkKLQkJCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJCQlzaWduID0gMTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhpb2JqKSkgewotCQkJCQkJCWludCBpbGVuOwotCQkJCQkJCQotCQkJCQkJCWlzbnVtb2sgPSAxOwotCQkJCQkJCXRlbXAgPSBfUHlTdHJpbmdfRm9ybWF0TG9uZyhpb2JqLCBmbGFncywKLQkJCQkJCQkJcHJlYywgYywgJnBidWYsICZpbGVuKTsKLQkJCQkJCQlQeV9ERUNSRUYoaW9iaik7Ci0JCQkJCQkJbGVuID0gaWxlbjsKLQkJCQkJCQlpZiAoIXRlbXApCi0JCQkJCQkJCWdvdG8gZXJyb3I7Ci0JCQkJCQkJc2lnbiA9IDE7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlQeV9ERUNSRUYoaW9iaik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFpc251bW9rKSB7Ci0JCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIAotCQkJCQkgICAgIiUlJWMgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgIgotCQkJCQkgICAgIm5vdCAlLjIwMHMiLCBjLCBQeV9UWVBFKHYpLT50cF9uYW1lKTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQkJaWYgKGZsYWdzICYgRl9aRVJPKQotCQkJCQlmaWxsID0gJzAnOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnZSc6Ci0JCQljYXNlICdFJzoKLQkJCWNhc2UgJ2YnOgotCQkJY2FzZSAnRic6Ci0JCQljYXNlICdnJzoKLQkJCWNhc2UgJ0cnOgotCQkJCXRlbXAgPSBmb3JtYXRmbG9hdCh2LCBmbGFncywgcHJlYywgYyk7Ci0JCQkJaWYgKHRlbXAgPT0gTlVMTCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlwYnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRlbXApOwotCQkJCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRlbXApOwotCQkJCXNpZ24gPSAxOwotCQkJCWlmIChmbGFncyAmIEZfWkVSTykKLQkJCQkJZmlsbCA9ICcwJzsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ2MnOgotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCQlpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JCQkJCWZtdCA9IGZtdF9zdGFydDsKLQkJCQkJYXJnaWR4ID0gYXJnaWR4X3N0YXJ0OwotCQkJCQlnb3RvIHVuaWNvZGU7Ci0JCQkJfQotI2VuZGlmCi0JCQkJcGJ1ZiA9IGZvcm1hdGJ1ZjsKLQkJCQlsZW4gPSBmb3JtYXRjaGFyKHBidWYsIHNpemVvZihmb3JtYXRidWYpLCB2KTsKLQkJCQlpZiAobGVuIDwgMCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAidW5zdXBwb3J0ZWQgZm9ybWF0IGNoYXJhY3RlciAnJWMnICgweCV4KSAiCi0JCQkJICAiYXQgaW5kZXggJXpkIiwKLQkJCQkgIGMsIGMsCi0JCQkJICAoUHlfc3NpemVfdCkoZm10IC0gMSAtCi0JCQkJCSAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhmb3JtYXQpKSk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmIChzaWduKSB7Ci0JCQkJaWYgKCpwYnVmID09ICctJyB8fCAqcGJ1ZiA9PSAnKycpIHsKLQkJCQkJc2lnbiA9ICpwYnVmKys7Ci0JCQkJCWxlbi0tOwotCQkJCX0KLQkJCQllbHNlIGlmIChmbGFncyAmIEZfU0lHTikKLQkJCQkJc2lnbiA9ICcrJzsKLQkJCQllbHNlIGlmIChmbGFncyAmIEZfQkxBTkspCi0JCQkJCXNpZ24gPSAnICc7Ci0JCQkJZWxzZQotCQkJCQlzaWduID0gMDsKLQkJCX0KLQkJCWlmICh3aWR0aCA8IGxlbikKLQkJCQl3aWR0aCA9IGxlbjsKLQkJCWlmIChyZXNjbnQgLSAoc2lnbiAhPSAwKSA8IHdpZHRoKSB7Ci0JCQkJcmVzbGVuIC09IHJlc2NudDsKLQkJCQlyZXNjbnQgPSB3aWR0aCArIGZtdGNudCArIDEwMDsKLQkJCQlyZXNsZW4gKz0gcmVzY250OwotCQkJCWlmIChyZXNsZW4gPCAwKSB7Ci0JCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCQlQeV9YREVDUkVGKHRlbXApOwotCQkJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQl9Ci0JCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkgewotCQkJCQlQeV9YREVDUkVGKHRlbXApOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJcmVzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkKLQkJCQkJKyByZXNsZW4gLSByZXNjbnQ7Ci0JCQl9Ci0JCQlpZiAoc2lnbikgewotCQkJCWlmIChmaWxsICE9ICcgJykKLQkJCQkJKnJlcysrID0gc2lnbjsKLQkJCQlyZXNjbnQtLTsKLQkJCQlpZiAod2lkdGggPiBsZW4pCi0JCQkJCXdpZHRoLS07Ci0JCQl9Ci0JCQlpZiAoKGZsYWdzICYgRl9BTFQpICYmIChjID09ICd4JyB8fCBjID09ICdYJykpIHsKLQkJCQlhc3NlcnQocGJ1ZlswXSA9PSAnMCcpOwotCQkJCWFzc2VydChwYnVmWzFdID09IGMpOwotCQkJCWlmIChmaWxsICE9ICcgJykgewotCQkJCQkqcmVzKysgPSAqcGJ1ZisrOwotCQkJCQkqcmVzKysgPSAqcGJ1ZisrOwotCQkJCX0KLQkJCQlyZXNjbnQgLT0gMjsKLQkJCQl3aWR0aCAtPSAyOwotCQkJCWlmICh3aWR0aCA8IDApCi0JCQkJCXdpZHRoID0gMDsKLQkJCQlsZW4gLT0gMjsKLQkJCX0KLQkJCWlmICh3aWR0aCA+IGxlbiAmJiAhKGZsYWdzICYgRl9MSlVTVCkpIHsKLQkJCQlkbyB7Ci0JCQkJCS0tcmVzY250OwotCQkJCQkqcmVzKysgPSBmaWxsOwotCQkJCX0gd2hpbGUgKC0td2lkdGggPiBsZW4pOwotCQkJfQotCQkJaWYgKGZpbGwgPT0gJyAnKSB7Ci0JCQkJaWYgKHNpZ24pCi0JCQkJCSpyZXMrKyA9IHNpZ247Ci0JCQkJaWYgKChmbGFncyAmIEZfQUxUKSAmJgotCQkJCSAgICAoYyA9PSAneCcgfHwgYyA9PSAnWCcpKSB7Ci0JCQkJCWFzc2VydChwYnVmWzBdID09ICcwJyk7Ci0JCQkJCWFzc2VydChwYnVmWzFdID09IGMpOwotCQkJCQkqcmVzKysgPSAqcGJ1ZisrOwotCQkJCQkqcmVzKysgPSAqcGJ1ZisrOwotCQkJCX0KLQkJCX0KLQkJCVB5X01FTUNQWShyZXMsIHBidWYsIGxlbik7Ci0JCQlyZXMgKz0gbGVuOwotCQkJcmVzY250IC09IGxlbjsKLQkJCXdoaWxlICgtLXdpZHRoID49IGxlbikgewotCQkJCS0tcmVzY250OwotCQkJCSpyZXMrKyA9ICcgJzsKLQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWN0ICYmIChhcmdpZHggPCBhcmdsZW4pICYmIGMgIT0gJyUnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgc3RyaW5nIGZvcm1hdHRpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgcmVxdWlyZXMgYSBtYXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrZm10OworICAgICAgICAgICAgICAgIC0tZm10Y250OworICAgICAgICAgICAgICAgIGtleXN0YXJ0ID0gZm10OworICAgICAgICAgICAgICAgIC8qIFNraXAgb3ZlciBiYWxhbmNlZCBwYXJlbnRoZXNlcyAqLworICAgICAgICAgICAgICAgIHdoaWxlIChwY291bnQgPiAwICYmIC0tZm10Y250ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpmbXQgPT0gJyknKQorICAgICAgICAgICAgICAgICAgICAgICAgLS1wY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpmbXQgPT0gJygnKQorICAgICAgICAgICAgICAgICAgICAgICAgKytwY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGZtdCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBrZXlsZW4gPSBmbXQgLSBrZXlzdGFydCAtIDE7CisgICAgICAgICAgICAgICAgaWYgKGZtdGNudCA8IDAgfHwgcGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb21wbGV0ZSBmb3JtYXQga2V5Iik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGtleSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGtleXN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWxlbik7CisgICAgICAgICAgICAgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGlmIChhcmdzX293bmVkKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgYXJnc19vd25lZCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFyZ3MgPSBQeU9iamVjdF9HZXRJdGVtKGRpY3QsIGtleSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcmdzX293bmVkID0gMTsKKyAgICAgICAgICAgICAgICBhcmdsZW4gPSAtMTsKKyAgICAgICAgICAgICAgICBhcmdpZHggPSAtMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgtLWZtdGNudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjID0gKmZtdCsrKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6IGZsYWdzIHw9IEZfTEpVU1Q7IGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNhc2UgJysnOiBmbGFncyB8PSBGX1NJR047IGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNhc2UgJyAnOiBmbGFncyB8PSBGX0JMQU5LOyBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjYXNlICcjJzogZmxhZ3MgfD0gRl9BTFQ7IGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNhc2UgJzAnOiBmbGFncyB8PSBGX1pFUk87IGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09ICcqJykgeworICAgICAgICAgICAgICAgIHYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiB3YW50cyBpbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2lkdGggPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgICAgICAgICAgaWYgKHdpZHRoIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0xKVVNUOworICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC13aWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKC0tZm10Y250ID49IDApCisgICAgICAgICAgICAgICAgICAgIGMgPSAqZm10Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID49IDAgJiYgaXNkaWdpdChjKSkgeworICAgICAgICAgICAgICAgIHdpZHRoID0gYyAtICcwJzsKKyAgICAgICAgICAgICAgICB3aGlsZSAoLS1mbXRjbnQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKmZtdCsrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmICgod2lkdGgqMTApIC8gMTAgIT0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCB0b28gYmlnIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gd2lkdGgqMTAgKyAoYyAtICcwJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgcHJlYyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKC0tZm10Y250ID49IDApCisgICAgICAgICAgICAgICAgICAgIGMgPSAqZm10Kys7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyonKSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIHdhbnRzIGludCIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmVjID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJlYyA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKC0tZm10Y250ID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjID0gKmZtdCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjID49IDAgJiYgaXNkaWdpdChjKSkgeworICAgICAgICAgICAgICAgICAgICBwcmVjID0gYyAtICcwJzsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tZm10Y250ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqZm10KyspOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVjKjEwKSAvIDEwICE9IHByZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVjIHRvbyBiaWciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJUHlfWERFQ1JFRih0ZW1wKTsKLQkJfSAvKiAnJScgKi8KLQl9IC8qIHVudGlsIGVuZCAqLwotCWlmIChhcmdpZHggPCBhcmdsZW4gJiYgIWRpY3QpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibm90IGFsbCBhcmd1bWVudHMgY29udmVydGVkIGR1cmluZyBzdHJpbmcgZm9ybWF0dGluZyIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlpZiAoYXJnc19vd25lZCkgewotCQlQeV9ERUNSRUYoYXJncyk7Ci0JfQotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIHJlc2xlbiAtIHJlc2NudCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjID0gcHJlYyoxMCArIChjIC0gJzAnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogcHJlYyAqLworICAgICAgICAgICAgaWYgKGZtdGNudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ2gnIHx8IGMgPT0gJ2wnIHx8IGMgPT0gJ0wnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgtLWZtdGNudCA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICpmbXQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm10Y250IDwgMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb21wbGV0ZSBmb3JtYXQiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgIT0gJyUnKSB7CisgICAgICAgICAgICAgICAgdiA9IGdldG5leHRhcmcoYXJncywgYXJnbGVuLCAmYXJnaWR4KTsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2lnbiA9IDA7CisgICAgICAgICAgICBmaWxsID0gJyAnOworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgICAgICBwYnVmID0gIiUiOworICAgICAgICAgICAgICAgIGxlbiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgeworICAgICAgICAgICAgICAgICAgICBmbXQgPSBmbXRfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGFyZ2lkeCA9IGFyZ2lkeF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgZ290byB1bmljb2RlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIHRlbXAgPSBfUHlPYmplY3RfU3RyKHYpOworI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKKyAgICAgICAgICAgICAgICBpZiAodGVtcCAhPSBOVUxMICYmIFB5VW5pY29kZV9DaGVjayh0ZW1wKSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGZtdCA9IGZtdF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgYXJnaWR4ID0gYXJnaWR4X3N0YXJ0OworICAgICAgICAgICAgICAgICAgICBnb3RvIHVuaWNvZGU7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAncicpCisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBQeU9iamVjdF9SZXByKHYpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh0ZW1wKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICIlcyBhcmd1bWVudCBoYXMgbm9uLXN0cmluZyBzdHIoKSIpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBidWYgPSBQeVN0cmluZ19BU19TVFJJTkcodGVtcCk7CisgICAgICAgICAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodGVtcCk7CisgICAgICAgICAgICAgICAgaWYgKHByZWMgPj0gMCAmJiBsZW4gPiBwcmVjKQorICAgICAgICAgICAgICAgICAgICBsZW4gPSBwcmVjOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICAgICAgICAgIGlmIChjID09ICdpJykKKyAgICAgICAgICAgICAgICAgICAgYyA9ICdkJzsKKyAgICAgICAgICAgICAgICBpc251bW9rID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoUHlOdW1iZXJfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmlvYmo9TlVMTDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikgfHwgKFB5TG9uZ19DaGVjayh2KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvYmogPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGlvYmopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW9iaiA9IFB5TnVtYmVyX0ludCh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2JqPT1OVUxMKSBpb2JqID0gUHlOdW1iZXJfTG9uZyh2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaW9iaiE9TlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKGlvYmopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNudW1vayA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ1ZiA9IGZvcm1hdGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBmb3JtYXRpbnQocGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZvcm1hdGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBwcmVjLCBjLCBpb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soaW9iaikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWxlbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzbnVtb2sgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBfUHlTdHJpbmdfRm9ybWF0TG9uZyhpb2JqLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYywgYywgJnBidWYsICZpbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gaWxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRlbXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFpc251bW9rKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiJSUlYyBmb3JtYXQ6IGEgbnVtYmVyIGlzIHJlcXVpcmVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAibm90ICUuMjAwcyIsIGMsIFB5X1RZUEUodiktPnRwX25hbWUpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGX1pFUk8pCisgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAnMCc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICAgICAgY2FzZSAnRyc6CisgICAgICAgICAgICAgICAgdGVtcCA9IGZvcm1hdGZsb2F0KHYsIGZsYWdzLCBwcmVjLCBjKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIHBidWYgPSBQeVN0cmluZ19BU19TVFJJTkcodGVtcCk7CisgICAgICAgICAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodGVtcCk7CisgICAgICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRl9aRVJPKQorICAgICAgICAgICAgICAgICAgICBmaWxsID0gJzAnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnYyc6CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm10ID0gZm10X3N0YXJ0OworICAgICAgICAgICAgICAgICAgICBhcmdpZHggPSBhcmdpZHhfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gdW5pY29kZTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBwYnVmID0gZm9ybWF0YnVmOworICAgICAgICAgICAgICAgIGxlbiA9IGZvcm1hdGNoYXIocGJ1Ziwgc2l6ZW9mKGZvcm1hdGJ1ZiksIHYpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyICclYycgKDB4JXgpICIKKyAgICAgICAgICAgICAgICAgICJhdCBpbmRleCAlemQiLAorICAgICAgICAgICAgICAgICAgYywgYywKKyAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KShmbXQgLSAxIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhmb3JtYXQpKSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaWduKSB7CisgICAgICAgICAgICAgICAgaWYgKCpwYnVmID09ICctJyB8fCAqcGJ1ZiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICpwYnVmKys7CisgICAgICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmbGFncyAmIEZfU0lHTikKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICcrJzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmbGFncyAmIEZfQkxBTkspCisgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAnICc7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzaWduID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3aWR0aCA8IGxlbikKKyAgICAgICAgICAgICAgICB3aWR0aCA9IGxlbjsKKyAgICAgICAgICAgIGlmIChyZXNjbnQgLSAoc2lnbiAhPSAwKSA8IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgcmVzbGVuIC09IHJlc2NudDsKKyAgICAgICAgICAgICAgICByZXNjbnQgPSB3aWR0aCArIGZtdGNudCArIDEwMDsKKyAgICAgICAgICAgICAgICByZXNsZW4gKz0gcmVzY250OworICAgICAgICAgICAgICAgIGlmIChyZXNsZW4gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkgeworICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgKyByZXNsZW4gLSByZXNjbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2lnbikgeworICAgICAgICAgICAgICAgIGlmIChmaWxsICE9ICcgJykKKyAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gc2lnbjsKKyAgICAgICAgICAgICAgICByZXNjbnQtLTsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBsZW4pCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGZsYWdzICYgRl9BTFQpICYmIChjID09ICd4JyB8fCBjID09ICdYJykpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQocGJ1ZlswXSA9PSAnMCcpOworICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzFdID09IGMpOworICAgICAgICAgICAgICAgIGlmIChmaWxsICE9ICcgJykgeworICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOworICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXNjbnQgLT0gMjsKKyAgICAgICAgICAgICAgICB3aWR0aCAtPSAyOworICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8IDApCisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMDsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3aWR0aCA+IGxlbiAmJiAhKGZsYWdzICYgRl9MSlVTVCkpIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIC0tcmVzY250OworICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSBmaWxsOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0td2lkdGggPiBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbGwgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpZ24pCisgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IHNpZ247CisgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIEZfQUxUKSAmJgorICAgICAgICAgICAgICAgICAgICAoYyA9PSAneCcgfHwgYyA9PSAnWCcpKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzBdID09ICcwJyk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzFdID09IGMpOworICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOworICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X01FTUNQWShyZXMsIHBidWYsIGxlbik7CisgICAgICAgICAgICByZXMgKz0gbGVuOworICAgICAgICAgICAgcmVzY250IC09IGxlbjsKKyAgICAgICAgICAgIHdoaWxlICgtLXdpZHRoID49IGxlbikgeworICAgICAgICAgICAgICAgIC0tcmVzY250OworICAgICAgICAgICAgICAgICpyZXMrKyA9ICcgJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkaWN0ICYmIChhcmdpZHggPCBhcmdsZW4pICYmIGMgIT0gJyUnKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYWxsIGFyZ3VtZW50cyBjb252ZXJ0ZWQgZHVyaW5nIHN0cmluZyBmb3JtYXR0aW5nIik7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKKyAgICAgICAgfSAvKiAnJScgKi8KKyAgICB9IC8qIHVudGlsIGVuZCAqLworICAgIGlmIChhcmdpZHggPCBhcmdsZW4gJiYgIWRpY3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYWxsIGFyZ3VtZW50cyBjb252ZXJ0ZWQgZHVyaW5nIHN0cmluZyBmb3JtYXR0aW5nIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGlmIChhcmdzX293bmVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgcmVzbGVuIC0gcmVzY250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKICB1bmljb2RlOgotCWlmIChhcmdzX293bmVkKSB7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQkJYXJnc19vd25lZCA9IDA7Ci0JfQotCS8qIEZpZGRsZSBhcmdzIHJpZ2h0IChyZW1vdmUgdGhlIGZpcnN0IGFyZ2lkeCBhcmd1bWVudHMpICovCi0JaWYgKFB5VHVwbGVfQ2hlY2sob3JpZ19hcmdzKSAmJiBhcmdpZHggPiAwKSB7Ci0JCVB5T2JqZWN0ICp2OwotCQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKG9yaWdfYXJncykgLSBhcmdpZHg7Ci0JCXYgPSBQeVR1cGxlX05ldyhuKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCXdoaWxlICgtLW4gPj0gMCkgewotCQkJUHlPYmplY3QgKncgPSBQeVR1cGxlX0dFVF9JVEVNKG9yaWdfYXJncywgbiArIGFyZ2lkeCk7Ci0JCQlQeV9JTkNSRUYodyk7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHYsIG4sIHcpOwotCQl9Ci0JCWFyZ3MgPSB2OwotCX0gZWxzZSB7Ci0JCVB5X0lOQ1JFRihvcmlnX2FyZ3MpOwotCQlhcmdzID0gb3JpZ19hcmdzOwotCX0KLQlhcmdzX293bmVkID0gMTsKLQkvKiBUYWtlIHdoYXQgd2UgaGF2ZSBvZiB0aGUgcmVzdWx0IGFuZCBsZXQgdGhlIFVuaWNvZGUgZm9ybWF0dGluZwotCSAgIGZ1bmN0aW9uIGZvcm1hdCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQuICovCi0JcmVzY250ID0gcmVzIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7Ci0JaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgcmVzY250KSkKLQkJZ290byBlcnJvcjsKLQlmbXRjbnQgPSBQeVN0cmluZ19HRVRfU0laRShmb3JtYXQpIC0gXAotCQkgKGZtdCAtIFB5U3RyaW5nX0FTX1NUUklORyhmb3JtYXQpKTsKLQlmb3JtYXQgPSBQeVVuaWNvZGVfRGVjb2RlKGZtdCwgZm10Y250LCBOVUxMLCBOVUxMKTsKLQlpZiAoZm9ybWF0ID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0JdiA9IFB5VW5pY29kZV9Gb3JtYXQoZm9ybWF0LCBhcmdzKTsKLQlQeV9ERUNSRUYoZm9ybWF0KTsKLQlpZiAodiA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCS8qIFBhc3RlIHdoYXQgd2UgaGF2ZSAocmVzdWx0KSB0byB3aGF0IHRoZSBVbmljb2RlIGZvcm1hdHRpbmcKLQkgICBmdW5jdGlvbiByZXR1cm5lZCAodikgYW5kIHJldHVybiB0aGUgcmVzdWx0IChvciBlcnJvcikgKi8KLQl3ID0gUHlVbmljb2RlX0NvbmNhdChyZXN1bHQsIHYpOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5X0RFQ1JFRih2KTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHc7CisgICAgaWYgKGFyZ3Nfb3duZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBhcmdzX293bmVkID0gMDsKKyAgICB9CisgICAgLyogRmlkZGxlIGFyZ3MgcmlnaHQgKHJlbW92ZSB0aGUgZmlyc3QgYXJnaWR4IGFyZ3VtZW50cykgKi8KKyAgICBpZiAoUHlUdXBsZV9DaGVjayhvcmlnX2FyZ3MpICYmIGFyZ2lkeCA+IDApIHsKKyAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgIFB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUob3JpZ19hcmdzKSAtIGFyZ2lkeDsKKyAgICAgICAgdiA9IFB5VHVwbGVfTmV3KG4pOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgd2hpbGUgKC0tbiA+PSAwKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdyA9IFB5VHVwbGVfR0VUX0lURU0ob3JpZ19hcmdzLCBuICsgYXJnaWR4KTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih3KTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgbiwgdyk7CisgICAgICAgIH0KKyAgICAgICAgYXJncyA9IHY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKG9yaWdfYXJncyk7CisgICAgICAgIGFyZ3MgPSBvcmlnX2FyZ3M7CisgICAgfQorICAgIGFyZ3Nfb3duZWQgPSAxOworICAgIC8qIFRha2Ugd2hhdCB3ZSBoYXZlIG9mIHRoZSByZXN1bHQgYW5kIGxldCB0aGUgVW5pY29kZSBmb3JtYXR0aW5nCisgICAgICAgZnVuY3Rpb24gZm9ybWF0IHRoZSByZXN0IG9mIHRoZSBpbnB1dC4gKi8KKyAgICByZXNjbnQgPSByZXMgLSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCByZXNjbnQpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGZtdGNudCA9IFB5U3RyaW5nX0dFVF9TSVpFKGZvcm1hdCkgLSBcCisgICAgICAgICAgICAgKGZtdCAtIFB5U3RyaW5nX0FTX1NUUklORyhmb3JtYXQpKTsKKyAgICBmb3JtYXQgPSBQeVVuaWNvZGVfRGVjb2RlKGZtdCwgZm10Y250LCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgdiA9IFB5VW5pY29kZV9Gb3JtYXQoZm9ybWF0LCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoZm9ybWF0KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIC8qIFBhc3RlIHdoYXQgd2UgaGF2ZSAocmVzdWx0KSB0byB3aGF0IHRoZSBVbmljb2RlIGZvcm1hdHRpbmcKKyAgICAgICBmdW5jdGlvbiByZXR1cm5lZCAodikgYW5kIHJldHVybiB0aGUgcmVzdWx0IChvciBlcnJvcikgKi8KKyAgICB3ID0gUHlVbmljb2RlX0NvbmNhdChyZXN1bHQsIHYpOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgcmV0dXJuIHc7CiAjZW5kaWYgLyogUHlfVVNJTkdfVU5JQ09ERSAqLwogCiAgZXJyb3I6Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JaWYgKGFyZ3Nfb3duZWQpIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBpZiAoYXJnc19vd25lZCkgeworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiB2b2lkCiBQeVN0cmluZ19JbnRlcm5JblBsYWNlKFB5T2JqZWN0ICoqcCkKIHsKLQlyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqcyA9IChQeVN0cmluZ09iamVjdCAqKSgqcCk7Ci0JUHlPYmplY3QgKnQ7Ci0JaWYgKHMgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2socykpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5U3RyaW5nX0ludGVybkluUGxhY2U6IHN0cmluZ3Mgb25seSBwbGVhc2UhIik7Ci0JLyogSWYgaXQncyBhIHN0cmluZyBzdWJjbGFzcywgd2UgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCBwdXR0aW5nCi0JICAgaXQgaW4gdGhlIGludGVybmVkIGRpY3QgbWlnaHQgZG8uICovCi0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KHMpKQotCQlyZXR1cm47Ci0JaWYgKFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKHMpKQotCQlyZXR1cm47Ci0JaWYgKGludGVybmVkID09IE5VTEwpIHsKLQkJaW50ZXJuZWQgPSBQeURpY3RfTmV3KCk7Ci0JCWlmIChpbnRlcm5lZCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOyAvKiBEb24ndCBsZWF2ZSBhbiBleGNlcHRpb24gKi8KLQkJCXJldHVybjsKLQkJfQotCX0KLQl0ID0gUHlEaWN0X0dldEl0ZW0oaW50ZXJuZWQsIChQeU9iamVjdCAqKXMpOwotCWlmICh0KSB7Ci0JCVB5X0lOQ1JFRih0KTsKLQkJUHlfREVDUkVGKCpwKTsKLQkJKnAgPSB0OwotCQlyZXR1cm47Ci0JfQorICAgIHJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpzID0gKFB5U3RyaW5nT2JqZWN0ICopKCpwKTsKKyAgICBQeU9iamVjdCAqdDsKKyAgICBpZiAocyA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhzKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlTdHJpbmdfSW50ZXJuSW5QbGFjZTogc3RyaW5ncyBvbmx5IHBsZWFzZSEiKTsKKyAgICAvKiBJZiBpdCdzIGEgc3RyaW5nIHN1YmNsYXNzLCB3ZSBkb24ndCByZWFsbHkga25vdyB3aGF0IHB1dHRpbmcKKyAgICAgICBpdCBpbiB0aGUgaW50ZXJuZWQgZGljdCBtaWdodCBkby4gKi8KKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3QocykpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQocykpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoaW50ZXJuZWQgPT0gTlVMTCkgeworICAgICAgICBpbnRlcm5lZCA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGludGVybmVkID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIERvbid0IGxlYXZlIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHQgPSBQeURpY3RfR2V0SXRlbShpbnRlcm5lZCwgKFB5T2JqZWN0ICopcyk7CisgICAgaWYgKHQpIHsKKyAgICAgICAgUHlfSU5DUkVGKHQpOworICAgICAgICBQeV9ERUNSRUYoKnApOworICAgICAgICAqcCA9IHQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW0oaW50ZXJuZWQsIChQeU9iamVjdCAqKXMsIChQeU9iamVjdCAqKXMpIDwgMCkgewotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm47Ci0JfQotCS8qIFRoZSB0d28gcmVmZXJlbmNlcyBpbiBpbnRlcm5lZCBhcmUgbm90IGNvdW50ZWQgYnkgcmVmY250LgotCSAgIFRoZSBzdHJpbmcgZGVhbGxvY2F0b3Igd2lsbCB0YWtlIGNhcmUgb2YgdGhpcyAqLwotCVB5X1JFRkNOVChzKSAtPSAyOwotCVB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKHMpID0gU1NUQVRFX0lOVEVSTkVEX01PUlRBTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW0oaW50ZXJuZWQsIChQeU9iamVjdCAqKXMsIChQeU9iamVjdCAqKXMpIDwgMCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIFRoZSB0d28gcmVmZXJlbmNlcyBpbiBpbnRlcm5lZCBhcmUgbm90IGNvdW50ZWQgYnkgcmVmY250LgorICAgICAgIFRoZSBzdHJpbmcgZGVhbGxvY2F0b3Igd2lsbCB0YWtlIGNhcmUgb2YgdGhpcyAqLworICAgIFB5X1JFRkNOVChzKSAtPSAyOworICAgIFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKHMpID0gU1NUQVRFX0lOVEVSTkVEX01PUlRBTDsKIH0KIAogdm9pZAogUHlTdHJpbmdfSW50ZXJuSW1tb3J0YWwoUHlPYmplY3QgKipwKQogewotCVB5U3RyaW5nX0ludGVybkluUGxhY2UocCk7Ci0JaWYgKFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKCpwKSAhPSBTU1RBVEVfSU5URVJORURfSU1NT1JUQUwpIHsKLQkJUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQoKnApID0gU1NUQVRFX0lOVEVSTkVEX0lNTU9SVEFMOwotCQlQeV9JTkNSRUYoKnApOwotCX0KKyAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKHApOworICAgIGlmIChQeVN0cmluZ19DSEVDS19JTlRFUk5FRCgqcCkgIT0gU1NUQVRFX0lOVEVSTkVEX0lNTU9SVEFMKSB7CisgICAgICAgIFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKCpwKSA9IFNTVEFURV9JTlRFUk5FRF9JTU1PUlRBTDsKKyAgICAgICAgUHlfSU5DUkVGKCpwKTsKKyAgICB9CiB9CiAKIAogUHlPYmplY3QgKgogUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhjb25zdCBjaGFyICpjcCkKIHsKLQlQeU9iamVjdCAqcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoY3ApOwotCWlmIChzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5U3RyaW5nX0ludGVybkluUGxhY2UoJnMpOwotCXJldHVybiBzOworICAgIFB5T2JqZWN0ICpzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjcCk7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmcyk7CisgICAgcmV0dXJuIHM7CiB9CiAKIHZvaWQKIFB5U3RyaW5nX0Zpbmkodm9pZCkKIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgVUNIQVJfTUFYICsgMTsgaSsrKSB7Ci0JCVB5X1hERUNSRUYoY2hhcmFjdGVyc1tpXSk7Ci0JCWNoYXJhY3RlcnNbaV0gPSBOVUxMOwotCX0KLQlQeV9YREVDUkVGKG51bGxzdHJpbmcpOwotCW51bGxzdHJpbmcgPSBOVUxMOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBVQ0hBUl9NQVggKyAxOyBpKyspIHsKKyAgICAgICAgUHlfWERFQ1JFRihjaGFyYWN0ZXJzW2ldKTsKKyAgICAgICAgY2hhcmFjdGVyc1tpXSA9IE5VTEw7CisgICAgfQorICAgIFB5X1hERUNSRUYobnVsbHN0cmluZyk7CisgICAgbnVsbHN0cmluZyA9IE5VTEw7CiB9CiAKIHZvaWQgX1B5X1JlbGVhc2VJbnRlcm5lZFN0cmluZ3Modm9pZCkKIHsKLQlQeU9iamVjdCAqa2V5czsKLQlQeVN0cmluZ09iamVjdCAqczsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlfc3NpemVfdCBpbW1vcnRhbF9zaXplID0gMCwgbW9ydGFsX3NpemUgPSAwOworICAgIFB5T2JqZWN0ICprZXlzOworICAgIFB5U3RyaW5nT2JqZWN0ICpzOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeV9zc2l6ZV90IGltbW9ydGFsX3NpemUgPSAwLCBtb3J0YWxfc2l6ZSA9IDA7CiAKLQlpZiAoaW50ZXJuZWQgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKGludGVybmVkKSkKLQkJcmV0dXJuOwotCWtleXMgPSBQeURpY3RfS2V5cyhpbnRlcm5lZCk7Ci0JaWYgKGtleXMgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKGtleXMpKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybjsKLQl9CisgICAgaWYgKGludGVybmVkID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhpbnRlcm5lZCkpCisgICAgICAgIHJldHVybjsKKyAgICBrZXlzID0gUHlEaWN0X0tleXMoaW50ZXJuZWQpOworICAgIGlmIChrZXlzID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhrZXlzKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQogCi0JLyogU2luY2UgX1B5X1JlbGVhc2VJbnRlcm5lZFN0cmluZ3MoKSBpcyBpbnRlbmRlZCB0byBoZWxwIGEgbGVhawotCSAgIGRldGVjdG9yLCBpbnRlcm5lZCBzdHJpbmdzIGFyZSBub3QgZm9yY2libHkgZGVhbGxvY2F0ZWQ7IHJhdGhlciwgd2UKLQkgICBnaXZlIHRoZW0gdGhlaXIgc3RvbGVuIHJlZmVyZW5jZXMgYmFjaywgYW5kIHRoZW4gY2xlYXIgYW5kIERFQ1JFRgotCSAgIHRoZSBpbnRlcm5lZCBkaWN0LiAqLworICAgIC8qIFNpbmNlIF9QeV9SZWxlYXNlSW50ZXJuZWRTdHJpbmdzKCkgaXMgaW50ZW5kZWQgdG8gaGVscCBhIGxlYWsKKyAgICAgICBkZXRlY3RvciwgaW50ZXJuZWQgc3RyaW5ncyBhcmUgbm90IGZvcmNpYmx5IGRlYWxsb2NhdGVkOyByYXRoZXIsIHdlCisgICAgICAgZ2l2ZSB0aGVtIHRoZWlyIHN0b2xlbiByZWZlcmVuY2VzIGJhY2ssIGFuZCB0aGVuIGNsZWFyIGFuZCBERUNSRUYKKyAgICAgICB0aGUgaW50ZXJuZWQgZGljdC4gKi8KIAotCW4gPSBQeUxpc3RfR0VUX1NJWkUoa2V5cyk7Ci0JZnByaW50ZihzdGRlcnIsICJyZWxlYXNpbmcgJSIgUFlfRk9STUFUX1NJWkVfVCAiZCBpbnRlcm5lZCBzdHJpbmdzXG4iLAotCQluKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXMgPSAoUHlTdHJpbmdPYmplY3QgKikgUHlMaXN0X0dFVF9JVEVNKGtleXMsIGkpOwotCQlzd2l0Y2ggKHMtPm9iX3NzdGF0ZSkgewotCQljYXNlIFNTVEFURV9OT1RfSU5URVJORUQ6Ci0JCQkvKiBYWFggU2hvdWxkbid0IGhhcHBlbiAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NUQVRFX0lOVEVSTkVEX0lNTU9SVEFMOgotCQkJUHlfUkVGQ05UKHMpICs9IDE7Ci0JCQlpbW1vcnRhbF9zaXplICs9IFB5X1NJWkUocyk7Ci0JCQlicmVhazsKLQkJY2FzZSBTU1RBVEVfSU5URVJORURfTU9SVEFMOgotCQkJUHlfUkVGQ05UKHMpICs9IDI7Ci0JCQltb3J0YWxfc2l6ZSArPSBQeV9TSVpFKHMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlQeV9GYXRhbEVycm9yKCJJbmNvbnNpc3RlbnQgaW50ZXJuZWQgc3RyaW5nIHN0YXRlLiIpOwotCQl9Ci0JCXMtPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7Ci0JfQotCWZwcmludGYoc3RkZXJyLCAidG90YWwgc2l6ZSBvZiBhbGwgaW50ZXJuZWQgc3RyaW5nczogIgotCQkJIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQvJSIgUFlfRk9STUFUX1NJWkVfVCAiZCAiCi0JCQkibW9ydGFsL2ltbW9ydGFsXG4iLCBtb3J0YWxfc2l6ZSwgaW1tb3J0YWxfc2l6ZSk7Ci0JUHlfREVDUkVGKGtleXMpOwotCVB5RGljdF9DbGVhcihpbnRlcm5lZCk7Ci0JUHlfREVDUkVGKGludGVybmVkKTsKLQlpbnRlcm5lZCA9IE5VTEw7CisgICAgbiA9IFB5TGlzdF9HRVRfU0laRShrZXlzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInJlbGVhc2luZyAlIiBQWV9GT1JNQVRfU0laRV9UICJkIGludGVybmVkIHN0cmluZ3NcbiIsCisgICAgICAgIG4pOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgcyA9IChQeVN0cmluZ09iamVjdCAqKSBQeUxpc3RfR0VUX0lURU0oa2V5cywgaSk7CisgICAgICAgIHN3aXRjaCAocy0+b2Jfc3N0YXRlKSB7CisgICAgICAgIGNhc2UgU1NUQVRFX05PVF9JTlRFUk5FRDoKKyAgICAgICAgICAgIC8qIFhYWCBTaG91bGRuJ3QgaGFwcGVuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTU1RBVEVfSU5URVJORURfSU1NT1JUQUw6CisgICAgICAgICAgICBQeV9SRUZDTlQocykgKz0gMTsKKyAgICAgICAgICAgIGltbW9ydGFsX3NpemUgKz0gUHlfU0laRShzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNTVEFURV9JTlRFUk5FRF9NT1JUQUw6CisgICAgICAgICAgICBQeV9SRUZDTlQocykgKz0gMjsKKyAgICAgICAgICAgIG1vcnRhbF9zaXplICs9IFB5X1NJWkUocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkluY29uc2lzdGVudCBpbnRlcm5lZCBzdHJpbmcgc3RhdGUuIik7CisgICAgICAgIH0KKyAgICAgICAgcy0+b2Jfc3N0YXRlID0gU1NUQVRFX05PVF9JTlRFUk5FRDsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJ0b3RhbCBzaXplIG9mIGFsbCBpbnRlcm5lZCBzdHJpbmdzOiAiCisgICAgICAgICAgICAgICAgICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJkLyUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgIgorICAgICAgICAgICAgICAgICAgICAibW9ydGFsL2ltbW9ydGFsXG4iLCBtb3J0YWxfc2l6ZSwgaW1tb3J0YWxfc2l6ZSk7CisgICAgUHlfREVDUkVGKGtleXMpOworICAgIFB5RGljdF9DbGVhcihpbnRlcm5lZCk7CisgICAgUHlfREVDUkVGKGludGVybmVkKTsKKyAgICBpbnRlcm5lZCA9IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cnVjdHNlcS5jIGIvT2JqZWN0cy9zdHJ1Y3RzZXEuYwppbmRleCBhZDI0NmExLi41OGUxNWNiIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cnVjdHNlcS5jCisrKyBiL09iamVjdHMvc3RydWN0c2VxLmMKQEAgLTksNyArOSw3IEBACiBzdGF0aWMgY2hhciByZWFsX2xlbmd0aF9rZXlbXSA9ICJuX2ZpZWxkcyI7CiBzdGF0aWMgY2hhciB1bm5hbWVkX2ZpZWxkc19rZXlbXSA9ICJuX3VubmFtZWRfZmllbGRzIjsKIAotLyogRmllbGRzIHdpdGggdGhpcyBuYW1lIGhhdmUgb25seSBhIGZpZWxkIGluZGV4LCBub3QgYSBmaWVsZCBuYW1lLiAKKy8qIEZpZWxkcyB3aXRoIHRoaXMgbmFtZSBoYXZlIG9ubHkgYSBmaWVsZCBpbmRleCwgbm90IGEgZmllbGQgbmFtZS4KICAgIFRoZXkgYXJlIG9ubHkgYWxsb3dlZCBmb3IgaW5kaWNlcyA8IG5fdmlzaWJsZV9maWVsZHMuICovCiBjaGFyICpQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZCA9ICJ1bm5hbWVkIGZpZWxkIjsKIApAQCAtMjksNTExICsyOSw1MTEgQEAKIFB5T2JqZWN0ICoKIFB5U3RydWN0U2VxdWVuY2VfTmV3KFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeVN0cnVjdFNlcXVlbmNlICpvYmo7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqOwogCi0Jb2JqID0gUHlPYmplY3RfTmV3KFB5U3RydWN0U2VxdWVuY2UsIHR5cGUpOwotCWlmIChvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfU0laRShvYmopID0gVklTSUJMRV9TSVpFX1RQKHR5cGUpOworICAgIG9iaiA9IFB5T2JqZWN0X05ldyhQeVN0cnVjdFNlcXVlbmNlLCB0eXBlKTsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1NJWkUob2JqKSA9IFZJU0lCTEVfU0laRV9UUCh0eXBlKTsKIAotCXJldHVybiAoUHlPYmplY3QqKSBvYmo7CisgICAgcmV0dXJuIChQeU9iamVjdCopIG9iajsKIH0KIAogc3RhdGljIHZvaWQKIHN0cnVjdHNlcV9kZWFsbG9jKFB5U3RydWN0U2VxdWVuY2UgKm9iaikKIHsKLQlQeV9zc2l6ZV90IGksIHNpemU7CisgICAgUHlfc3NpemVfdCBpLCBzaXplOwogCi0Jc2l6ZSA9IFJFQUxfU0laRShvYmopOwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJUHlfWERFQ1JFRihvYmotPm9iX2l0ZW1baV0pOwotCX0KLQlQeU9iamVjdF9EZWwob2JqKTsKKyAgICBzaXplID0gUkVBTF9TSVpFKG9iaik7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBQeV9YREVDUkVGKG9iai0+b2JfaXRlbVtpXSk7CisgICAgfQorICAgIFB5T2JqZWN0X0RlbChvYmopOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogc3RydWN0c2VxX2xlbmd0aChQeVN0cnVjdFNlcXVlbmNlICpvYmopCiB7Ci0JcmV0dXJuIFZJU0lCTEVfU0laRShvYmopOworICAgIHJldHVybiBWSVNJQkxFX1NJWkUob2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgogc3RydWN0c2VxX2l0ZW0oUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqLCBQeV9zc2l6ZV90IGkpCiB7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gVklTSUJMRV9TSVpFKG9iaikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihvYmotPm9iX2l0ZW1baV0pOwotCXJldHVybiBvYmotPm9iX2l0ZW1baV07CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gVklTSUJMRV9TSVpFKG9iaikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihvYmotPm9iX2l0ZW1baV0pOworICAgIHJldHVybiBvYmotPm9iX2l0ZW1baV07CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHN0cnVjdHNlcV9zbGljZShQeVN0cnVjdFNlcXVlbmNlICpvYmosIFB5X3NzaXplX3QgbG93LCBQeV9zc2l6ZV90IGhpZ2gpCiB7Ci0JUHlUdXBsZU9iamVjdCAqbnA7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5VHVwbGVPYmplY3QgKm5wOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmIChsb3cgPCAwKQotCQlsb3cgPSAwOwotCWlmIChoaWdoID4gVklTSUJMRV9TSVpFKG9iaikpCi0JCWhpZ2ggPSBWSVNJQkxFX1NJWkUob2JqKTsKLQlpZiAoaGlnaCA8IGxvdykKLQkJaGlnaCA9IGxvdzsKLQlucCA9IChQeVR1cGxlT2JqZWN0ICopUHlUdXBsZV9OZXcoaGlnaC1sb3cpOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IoaSA9IGxvdzsgaSA8IGhpZ2g7ICsraSkgewotCQlQeU9iamVjdCAqdiA9IG9iai0+b2JfaXRlbVtpXTsKLQkJUHlfSU5DUkVGKHYpOwotCQlQeVR1cGxlX1NFVF9JVEVNKG5wLCBpLWxvdywgdik7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKikgbnA7CisgICAgaWYgKGxvdyA8IDApCisgICAgICAgIGxvdyA9IDA7CisgICAgaWYgKGhpZ2ggPiBWSVNJQkxFX1NJWkUob2JqKSkKKyAgICAgICAgaGlnaCA9IFZJU0lCTEVfU0laRShvYmopOworICAgIGlmIChoaWdoIDwgbG93KQorICAgICAgICBoaWdoID0gbG93OworICAgIG5wID0gKFB5VHVwbGVPYmplY3QgKilQeVR1cGxlX05ldyhoaWdoLWxvdyk7CisgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvcihpID0gbG93OyBpIDwgaGlnaDsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gb2JqLT5vYl9pdGVtW2ldOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obnAsIGktbG93LCB2KTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBucDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9zdWJzY3JpcHQoUHlTdHJ1Y3RTZXF1ZW5jZSAqc2VsZiwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBWSVNJQkxFX1NJWkUoc2VsZik7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gVklTSUJMRV9TSVpFKHNlbGYpOwogCi0JCWlmIChpIDwgMCB8fCBpID49IFZJU0lCTEVfU0laRShzZWxmKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJInR1cGxlIGluZGV4IG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfSU5DUkVGKHNlbGYtPm9iX2l0ZW1baV0pOwotCQlyZXR1cm4gc2VsZi0+b2JfaXRlbVtpXTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbiwgY3VyLCBpOwotCQlQeU9iamVjdCAqcmVzdWx0OwotCQkKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwKLQkJCQkJIFZJU0lCTEVfU0laRShzZWxmKSwgJnN0YXJ0LCAmc3RvcCwKLQkJCQkJICZzdGVwLCAmc2xpY2VsZW4pIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKHNsaWNlbGVuIDw9IDApCi0JCQlyZXR1cm4gUHlUdXBsZV9OZXcoMCk7Ci0JCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHNsaWNlbGVuKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47Ci0JCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBzZWxmLT5vYl9pdGVtW2N1cl07Ci0JCQlQeV9JTkNSRUYodik7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgdik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInN0cnVjdHNlcSBpbmRleCBtdXN0IGJlIGludGVnZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSBWSVNJQkxFX1NJWkUoc2VsZikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5vYl9pdGVtW2ldKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPm9iX2l0ZW1baV07CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW4sIGN1ciwgaTsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QgKilpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVklTSUJMRV9TSVpFKHNlbGYpLCAmc3RhcnQsICZzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2xpY2VsZW4gPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcoc2xpY2VsZW4pOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKKyAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IHNlbGYtPm9iX2l0ZW1bY3VyXTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCB2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3RzZXEgaW5kZXggbXVzdCBiZSBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKmFyZyA9IE5VTEw7Ci0JUHlPYmplY3QgKmRpY3QgPSBOVUxMOwotCVB5T2JqZWN0ICpvYjsKLQlQeVN0cnVjdFNlcXVlbmNlICpyZXMgPSBOVUxMOwotCVB5X3NzaXplX3QgbGVuLCBtaW5fbGVuLCBtYXhfbGVuLCBpLCBuX3VubmFtZWRfZmllbGRzOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2VxdWVuY2UiLCAiZGljdCIsIDB9OworICAgIFB5T2JqZWN0ICphcmcgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkaWN0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqb2I7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZSAqcmVzID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGxlbiwgbWluX2xlbiwgbWF4X2xlbiwgaSwgbl91bm5hbWVkX2ZpZWxkczsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNlcXVlbmNlIiwgImRpY3QiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86c3RydWN0c2VxIiwgCi0JCQkJCSBrd2xpc3QsICZhcmcsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98TzpzdHJ1Y3RzZXEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmFyZywgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFyZyA9IFB5U2VxdWVuY2VfRmFzdChhcmcsICJjb25zdHJ1Y3RvciByZXF1aXJlcyBhIHNlcXVlbmNlIik7CisgICAgYXJnID0gUHlTZXF1ZW5jZV9GYXN0KGFyZywgImNvbnN0cnVjdG9yIHJlcXVpcmVzIGEgc2VxdWVuY2UiKTsKIAotCWlmICghYXJnKSB7CQkJCQotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFhcmcpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGRpY3QgJiYgIVB5RGljdF9DaGVjayhkaWN0KSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCSAgICAgIiUuNTAwcygpIHRha2VzIGEgZGljdCBhcyBzZWNvbmQgYXJnLCBpZiBhbnkiLAotCQkJICAgICB0eXBlLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKGFyZyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZGljdCAmJiAhUHlEaWN0X0NoZWNrKGRpY3QpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJS41MDBzKCkgdGFrZXMgYSBkaWN0IGFzIHNlY29uZCBhcmcsIGlmIGFueSIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWxlbiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShhcmcpOwotCW1pbl9sZW4gPSBWSVNJQkxFX1NJWkVfVFAodHlwZSk7Ci0JbWF4X2xlbiA9IFJFQUxfU0laRV9UUCh0eXBlKTsKLQluX3VubmFtZWRfZmllbGRzID0gVU5OQU1FRF9GSUVMRFNfVFAodHlwZSk7CisgICAgbGVuID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKGFyZyk7CisgICAgbWluX2xlbiA9IFZJU0lCTEVfU0laRV9UUCh0eXBlKTsKKyAgICBtYXhfbGVuID0gUkVBTF9TSVpFX1RQKHR5cGUpOworICAgIG5fdW5uYW1lZF9maWVsZHMgPSBVTk5BTUVEX0ZJRUxEU19UUCh0eXBlKTsKIAotCWlmIChtaW5fbGVuICE9IG1heF9sZW4pIHsKLQkJaWYgKGxlbiA8IG1pbl9sZW4pIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIAotCSAgICAgICAiJS41MDBzKCkgdGFrZXMgYW4gYXQgbGVhc3QgJXpkLXNlcXVlbmNlICglemQtc2VxdWVuY2UgZ2l2ZW4pIiwKLQkJCQkgICAgIHR5cGUtPnRwX25hbWUsIG1pbl9sZW4sIGxlbik7Ci0JCQlQeV9ERUNSRUYoYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgaWYgKG1pbl9sZW4gIT0gbWF4X2xlbikgeworICAgICAgICBpZiAobGVuIDwgbWluX2xlbikgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgIiUuNTAwcygpIHRha2VzIGFuIGF0IGxlYXN0ICV6ZC1zZXF1ZW5jZSAoJXpkLXNlcXVlbmNlIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLCBtaW5fbGVuLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlpZiAobGVuID4gbWF4X2xlbikgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCi0JICAgICAgICIlLjUwMHMoKSB0YWtlcyBhbiBhdCBtb3N0ICV6ZC1zZXF1ZW5jZSAoJXpkLXNlcXVlbmNlIGdpdmVuKSIsCi0JCQkJICAgICB0eXBlLT50cF9uYW1lLCBtYXhfbGVuLCBsZW4pOwotCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0gCi0JZWxzZSB7Ci0JCWlmIChsZW4gIT0gbWluX2xlbikgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCi0JICAgICAgICIlLjUwMHMoKSB0YWtlcyBhICV6ZC1zZXF1ZW5jZSAoJXpkLXNlcXVlbmNlIGdpdmVuKSIsCi0JCQkJICAgICB0eXBlLT50cF9uYW1lLCBtaW5fbGVuLCBsZW4pOwotCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICAgICAgaWYgKGxlbiA+IG1heF9sZW4pIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICIlLjUwMHMoKSB0YWtlcyBhbiBhdCBtb3N0ICV6ZC1zZXF1ZW5jZSAoJXpkLXNlcXVlbmNlIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLCBtYXhfbGVuLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChsZW4gIT0gbWluX2xlbikgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgIiUuNTAwcygpIHRha2VzIGEgJXpkLXNlcXVlbmNlICglemQtc2VxdWVuY2UgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsIG1pbl9sZW4sIGxlbik7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXJlcyA9IChQeVN0cnVjdFNlcXVlbmNlKikgUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcodHlwZSk7Ci0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLQkJUHlPYmplY3QgKnYgPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oYXJnLCBpKTsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXMtPm9iX2l0ZW1baV0gPSB2OwotCX0KLQlmb3IgKDsgaSA8IG1heF9sZW47ICsraSkgewotCQlpZiAoZGljdCAmJiAob2IgPSBQeURpY3RfR2V0SXRlbVN0cmluZygKLQkJCWRpY3QsIHR5cGUtPnRwX21lbWJlcnNbaS1uX3VubmFtZWRfZmllbGRzXS5uYW1lKSkpIHsKLQkJfQotCQllbHNlIHsKLQkJCW9iID0gUHlfTm9uZTsKLQkJfQotCQlQeV9JTkNSRUYob2IpOwotCQlyZXMtPm9iX2l0ZW1baV0gPSBvYjsKLQl9Ci0JCi0JUHlfREVDUkVGKGFyZyk7Ci0JcmV0dXJuIChQeU9iamVjdCopIHJlczsKKyAgICByZXMgPSAoUHlTdHJ1Y3RTZXF1ZW5jZSopIFB5U3RydWN0U2VxdWVuY2VfTmV3KHR5cGUpOworICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGFyZywgaSk7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgcmVzLT5vYl9pdGVtW2ldID0gdjsKKyAgICB9CisgICAgZm9yICg7IGkgPCBtYXhfbGVuOyArK2kpIHsKKyAgICAgICAgaWYgKGRpY3QgJiYgKG9iID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoCisgICAgICAgICAgICBkaWN0LCB0eXBlLT50cF9tZW1iZXJzW2ktbl91bm5hbWVkX2ZpZWxkc10ubmFtZSkpKSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvYiA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKG9iKTsKKyAgICAgICAgcmVzLT5vYl9pdGVtW2ldID0gb2I7CisgICAgfQorCisgICAgUHlfREVDUkVGKGFyZyk7CisgICAgcmV0dXJuIChQeU9iamVjdCopIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ha2VfdHVwbGUoUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqKQogewotCXJldHVybiBzdHJ1Y3RzZXFfc2xpY2Uob2JqLCAwLCBWSVNJQkxFX1NJWkUob2JqKSk7CisgICAgcmV0dXJuIHN0cnVjdHNlcV9zbGljZShvYmosIDAsIFZJU0lCTEVfU0laRShvYmopKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9yZXByKFB5U3RydWN0U2VxdWVuY2UgKm9iaikKIHsKLQkvKiBidWZmZXIgYW5kIHR5cGUgc2l6ZSB3ZXJlIGNob3NlbiB3ZWxsIGNvbnNpZGVyZWQuICovCisgICAgLyogYnVmZmVyIGFuZCB0eXBlIHNpemUgd2VyZSBjaG9zZW4gd2VsbCBjb25zaWRlcmVkLiAqLwogI2RlZmluZSBSRVBSX0JVRkZFUl9TSVpFIDUxMgogI2RlZmluZSBUWVBFX01BWFNJWkUgMTAwCiAKLQlQeU9iamVjdCAqdHVwOwotCVB5VHlwZU9iamVjdCAqdHlwID0gUHlfVFlQRShvYmopOwotCWludCBpLCByZW1vdmVsYXN0ID0gMDsKLQlQeV9zc2l6ZV90IGxlbjsKLQljaGFyIGJ1ZltSRVBSX0JVRkZFUl9TSVpFXTsKLQljaGFyICplbmRvZmJ1ZiwgKnBidWYgPSBidWY7CisgICAgUHlPYmplY3QgKnR1cDsKKyAgICBQeVR5cGVPYmplY3QgKnR5cCA9IFB5X1RZUEUob2JqKTsKKyAgICBpbnQgaSwgcmVtb3ZlbGFzdCA9IDA7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgY2hhciBidWZbUkVQUl9CVUZGRVJfU0laRV07CisgICAgY2hhciAqZW5kb2ZidWYsICpwYnVmID0gYnVmOwogCi0JLyogcG9pbnRlciB0byBlbmQgb2Ygd3JpdGVhYmxlIGJ1ZmZlcjsgc2FmZXMgc3BhY2UgZm9yICIuLi4pXDAiICovCi0JZW5kb2ZidWY9ICZidWZbUkVQUl9CVUZGRVJfU0laRS01XTsKKyAgICAvKiBwb2ludGVyIHRvIGVuZCBvZiB3cml0ZWFibGUgYnVmZmVyOyBzYWZlcyBzcGFjZSBmb3IgIi4uLilcMCIgKi8KKyAgICBlbmRvZmJ1Zj0gJmJ1ZltSRVBSX0JVRkZFUl9TSVpFLTVdOwogCi0JaWYgKCh0dXAgPSBtYWtlX3R1cGxlKG9iaikpID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgodHVwID0gbWFrZV90dXBsZShvYmopKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qICJ0eXBlbmFtZSgiLCBsaW1pdGVkIHRvICBUWVBFX01BWFNJWkUgKi8KLQlsZW4gPSBzdHJsZW4odHlwLT50cF9uYW1lKSA+IFRZUEVfTUFYU0laRSA/IFRZUEVfTUFYU0laRSA6Ci0JCQkJCQkgICAgc3RybGVuKHR5cC0+dHBfbmFtZSk7Ci0Jc3RybmNweShwYnVmLCB0eXAtPnRwX25hbWUsIGxlbik7Ci0JcGJ1ZiArPSBsZW47Ci0JKnBidWYrKyA9ICcoJzsKKyAgICAvKiAidHlwZW5hbWUoIiwgbGltaXRlZCB0byAgVFlQRV9NQVhTSVpFICovCisgICAgbGVuID0gc3RybGVuKHR5cC0+dHBfbmFtZSkgPiBUWVBFX01BWFNJWkUgPyBUWVBFX01BWFNJWkUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbih0eXAtPnRwX25hbWUpOworICAgIHN0cm5jcHkocGJ1ZiwgdHlwLT50cF9uYW1lLCBsZW4pOworICAgIHBidWYgKz0gbGVuOworICAgICpwYnVmKysgPSAnKCc7CiAKLQlmb3IgKGk9MDsgaSA8IFZJU0lCTEVfU0laRShvYmopOyBpKyspIHsKLQkJUHlPYmplY3QgKnZhbCwgKnJlcHI7Ci0JCWNoYXIgKmNuYW1lLCAqY3JlcHI7CisgICAgZm9yIChpPTA7IGkgPCBWSVNJQkxFX1NJWkUob2JqKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2YWwsICpyZXByOworICAgICAgICBjaGFyICpjbmFtZSwgKmNyZXByOwogCi0JCWNuYW1lID0gdHlwLT50cF9tZW1iZXJzW2ldLm5hbWU7Ci0JCQotCQl2YWwgPSBQeVR1cGxlX0dldEl0ZW0odHVwLCBpKTsKLQkJaWYgKGNuYW1lID09IE5VTEwgfHwgdmFsID09IE5VTEwpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJlcHIgPSBQeU9iamVjdF9SZXByKHZhbCk7Ci0JCWlmIChyZXByID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih0dXApOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJY3JlcHIgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXByKTsKLQkJaWYgKGNyZXByID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih0dXApOwotCQkJUHlfREVDUkVGKHJlcHIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJCi0JCS8qICsgMzoga2VlcCBzcGFjZSBmb3IgIj0iIGFuZCAiLCAiICovCi0gCQlsZW4gPSBzdHJsZW4oY25hbWUpICsgc3RybGVuKGNyZXByKSArIDM7Ci0JCWlmICgocGJ1ZitsZW4pIDw9IGVuZG9mYnVmKSB7Ci0JCQlzdHJjcHkocGJ1ZiwgY25hbWUpOwotCQkJcGJ1ZiArPSBzdHJsZW4oY25hbWUpOwotCQkJKnBidWYrKyA9ICc9JzsKLQkJCXN0cmNweShwYnVmLCBjcmVwcik7Ci0JCQlwYnVmICs9IHN0cmxlbihjcmVwcik7Ci0JCQkqcGJ1ZisrID0gJywnOwotCQkJKnBidWYrKyA9ICcgJzsKLQkJCXJlbW92ZWxhc3QgPSAxOwotCQkJUHlfREVDUkVGKHJlcHIpOwotCQl9Ci0JCWVsc2UgewotCQkJc3RyY3B5KHBidWYsICIuLi4iKTsKLQkJCXBidWYgKz0gMzsKLQkJCXJlbW92ZWxhc3QgPSAwOwotCQkJUHlfREVDUkVGKHJlcHIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKHR1cCk7Ci0JaWYgKHJlbW92ZWxhc3QpIHsKLQkJLyogb3ZlcndyaXRlIGxhc3QgIiwgIiAqLwotCQlwYnVmLT0yOwotCX0KLQkqcGJ1ZisrID0gJyknOwotCSpwYnVmID0gJ1wwJzsKKyAgICAgICAgY25hbWUgPSB0eXAtPnRwX21lbWJlcnNbaV0ubmFtZTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgICAgIHZhbCA9IFB5VHVwbGVfR2V0SXRlbSh0dXAsIGkpOworICAgICAgICBpZiAoY25hbWUgPT0gTlVMTCB8fCB2YWwgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVwciA9IFB5T2JqZWN0X1JlcHIodmFsKTsKKyAgICAgICAgaWYgKHJlcHIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHR1cCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBjcmVwciA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcHIpOworICAgICAgICBpZiAoY3JlcHIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHR1cCk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVwcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8qICsgMzoga2VlcCBzcGFjZSBmb3IgIj0iIGFuZCAiLCAiICovCisgICAgICAgIGxlbiA9IHN0cmxlbihjbmFtZSkgKyBzdHJsZW4oY3JlcHIpICsgMzsKKyAgICAgICAgaWYgKChwYnVmK2xlbikgPD0gZW5kb2ZidWYpIHsKKyAgICAgICAgICAgIHN0cmNweShwYnVmLCBjbmFtZSk7CisgICAgICAgICAgICBwYnVmICs9IHN0cmxlbihjbmFtZSk7CisgICAgICAgICAgICAqcGJ1ZisrID0gJz0nOworICAgICAgICAgICAgc3RyY3B5KHBidWYsIGNyZXByKTsKKyAgICAgICAgICAgIHBidWYgKz0gc3RybGVuKGNyZXByKTsKKyAgICAgICAgICAgICpwYnVmKysgPSAnLCc7CisgICAgICAgICAgICAqcGJ1ZisrID0gJyAnOworICAgICAgICAgICAgcmVtb3ZlbGFzdCA9IDE7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVwcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdHJjcHkocGJ1ZiwgIi4uLiIpOworICAgICAgICAgICAgcGJ1ZiArPSAzOworICAgICAgICAgICAgcmVtb3ZlbGFzdCA9IDA7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVwcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICBpZiAocmVtb3ZlbGFzdCkgeworICAgICAgICAvKiBvdmVyd3JpdGUgbGFzdCAiLCAiICovCisgICAgICAgIHBidWYtPTI7CisgICAgfQorICAgICpwYnVmKysgPSAnKSc7CisgICAgKnBidWYgPSAnXDAnOworCisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9jb25jYXQoUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqLCBQeU9iamVjdCAqYikKIHsKLQlQeU9iamVjdCAqdHVwLCAqcmVzdWx0OwotCXR1cCA9IG1ha2VfdHVwbGUob2JqKTsKLQlyZXN1bHQgPSBQeVNlcXVlbmNlX0NvbmNhdCh0dXAsIGIpOwotCVB5X0RFQ1JFRih0dXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnR1cCwgKnJlc3VsdDsKKyAgICB0dXAgPSBtYWtlX3R1cGxlKG9iaik7CisgICAgcmVzdWx0ID0gUHlTZXF1ZW5jZV9Db25jYXQodHVwLCBiKTsKKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RydWN0c2VxX3JlcGVhdChQeVN0cnVjdFNlcXVlbmNlICpvYmosIFB5X3NzaXplX3QgbikKIHsKLQlQeU9iamVjdCAqdHVwLCAqcmVzdWx0OwotCXR1cCA9IG1ha2VfdHVwbGUob2JqKTsKLQlyZXN1bHQgPSBQeVNlcXVlbmNlX1JlcGVhdCh0dXAsIG4pOwotCVB5X0RFQ1JFRih0dXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnR1cCwgKnJlc3VsdDsKKyAgICB0dXAgPSBtYWtlX3R1cGxlKG9iaik7CisgICAgcmVzdWx0ID0gUHlTZXF1ZW5jZV9SZXBlYXQodHVwLCBuKTsKKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBzdHJ1Y3RzZXFfY29udGFpbnMoUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqLCBQeU9iamVjdCAqbykKIHsKLQlQeU9iamVjdCAqdHVwOwotCWludCByZXN1bHQ7Ci0JdHVwID0gbWFrZV90dXBsZShvYmopOwotCWlmICghdHVwKQotCQlyZXR1cm4gLTE7Ci0JcmVzdWx0ID0gUHlTZXF1ZW5jZV9Db250YWlucyh0dXAsIG8pOwotCVB5X0RFQ1JFRih0dXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnR1cDsKKyAgICBpbnQgcmVzdWx0OworICAgIHR1cCA9IG1ha2VfdHVwbGUob2JqKTsKKyAgICBpZiAoIXR1cCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJlc3VsdCA9IFB5U2VxdWVuY2VfQ29udGFpbnModHVwLCBvKTsKKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgbG9uZwogc3RydWN0c2VxX2hhc2goUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCAqdHVwOwotCWxvbmcgcmVzdWx0OwotCXR1cCA9IG1ha2VfdHVwbGUoKFB5U3RydWN0U2VxdWVuY2UqKSBvYmopOwotCWlmICghdHVwKQotCQlyZXR1cm4gLTE7Ci0JcmVzdWx0ID0gUHlPYmplY3RfSGFzaCh0dXApOwotCVB5X0RFQ1JFRih0dXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnR1cDsKKyAgICBsb25nIHJlc3VsdDsKKyAgICB0dXAgPSBtYWtlX3R1cGxlKChQeVN0cnVjdFNlcXVlbmNlKikgb2JqKTsKKyAgICBpZiAoIXR1cCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0hhc2godHVwKTsKKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RydWN0c2VxX3JpY2hjb21wYXJlKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICpvMiwgaW50IG9wKQogewotCVB5T2JqZWN0ICp0dXAsICpyZXN1bHQ7Ci0JdHVwID0gbWFrZV90dXBsZSgoUHlTdHJ1Y3RTZXF1ZW5jZSopIG9iaik7Ci0JcmVzdWx0ID0gUHlPYmplY3RfUmljaENvbXBhcmUodHVwLCBvMiwgb3ApOwotCVB5X0RFQ1JFRih0dXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnR1cCwgKnJlc3VsdDsKKyAgICB0dXAgPSBtYWtlX3R1cGxlKChQeVN0cnVjdFNlcXVlbmNlKikgb2JqKTsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9SaWNoQ29tcGFyZSh0dXAsIG8yLCBvcCk7CisgICAgUHlfREVDUkVGKHR1cCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9yZWR1Y2UoUHlTdHJ1Y3RTZXF1ZW5jZSogc2VsZikKIHsKLQlQeU9iamVjdCogdHVwOwotCVB5T2JqZWN0KiBkaWN0OwotCVB5T2JqZWN0KiByZXN1bHQ7Ci0JUHlfc3NpemVfdCBuX2ZpZWxkcywgbl92aXNpYmxlX2ZpZWxkcywgbl91bm5hbWVkX2ZpZWxkczsKLQlpbnQgaTsKLQkKLQluX2ZpZWxkcyA9IFJFQUxfU0laRShzZWxmKTsKLQluX3Zpc2libGVfZmllbGRzID0gVklTSUJMRV9TSVpFKHNlbGYpOwotCW5fdW5uYW1lZF9maWVsZHMgPSBVTk5BTUVEX0ZJRUxEUyhzZWxmKTsKLQl0dXAgPSBQeVR1cGxlX05ldyhuX3Zpc2libGVfZmllbGRzKTsKLQlpZiAoIXR1cCkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlPYmplY3QqIHR1cDsKKyAgICBQeU9iamVjdCogZGljdDsKKyAgICBQeU9iamVjdCogcmVzdWx0OworICAgIFB5X3NzaXplX3Qgbl9maWVsZHMsIG5fdmlzaWJsZV9maWVsZHMsIG5fdW5uYW1lZF9maWVsZHM7CisgICAgaW50IGk7CiAKLQlkaWN0ID0gUHlEaWN0X05ldygpOwotCWlmICghZGljdCkgewotCQlQeV9ERUNSRUYodHVwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG5fZmllbGRzID0gUkVBTF9TSVpFKHNlbGYpOworICAgIG5fdmlzaWJsZV9maWVsZHMgPSBWSVNJQkxFX1NJWkUoc2VsZik7CisgICAgbl91bm5hbWVkX2ZpZWxkcyA9IFVOTkFNRURfRklFTERTKHNlbGYpOworICAgIHR1cCA9IFB5VHVwbGVfTmV3KG5fdmlzaWJsZV9maWVsZHMpOworICAgIGlmICghdHVwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBuX3Zpc2libGVfZmllbGRzOyBpKyspIHsKLQkJUHlfSU5DUkVGKHNlbGYtPm9iX2l0ZW1baV0pOwotCQlQeVR1cGxlX1NFVF9JVEVNKHR1cCwgaSwgc2VsZi0+b2JfaXRlbVtpXSk7Ci0JfQotCQotCWZvciAoOyBpIDwgbl9maWVsZHM7IGkrKykgewotCQljaGFyICpuID0gUHlfVFlQRShzZWxmKS0+dHBfbWVtYmVyc1tpLW5fdW5uYW1lZF9maWVsZHNdLm5hbWU7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG4sCi0JCQkJICAgICBzZWxmLT5vYl9pdGVtW2ldKTsKLQl9CisgICAgZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgUHlfREVDUkVGKHR1cCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIihPKE9PKSkiLCBQeV9UWVBFKHNlbGYpLCB0dXAsIGRpY3QpOworICAgIGZvciAoaSA9IDA7IGkgPCBuX3Zpc2libGVfZmllbGRzOyBpKyspIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPm9iX2l0ZW1baV0pOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cCwgaSwgc2VsZi0+b2JfaXRlbVtpXSk7CisgICAgfQogCi0JUHlfREVDUkVGKHR1cCk7Ci0JUHlfREVDUkVGKGRpY3QpOworICAgIGZvciAoOyBpIDwgbl9maWVsZHM7IGkrKykgeworICAgICAgICBjaGFyICpuID0gUHlfVFlQRShzZWxmKS0+dHBfbWVtYmVyc1tpLW5fdW5uYW1lZF9maWVsZHNdLm5hbWU7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW1baV0pOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiKE8oT08pKSIsIFB5X1RZUEUoc2VsZiksIHR1cCwgZGljdCk7CisKKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICBQeV9ERUNSRUYoZGljdCk7CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgc3RydWN0c2VxX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKXN0cnVjdHNlcV9sZW5ndGgsCi0JKGJpbmFyeWZ1bmMpc3RydWN0c2VxX2NvbmNhdCwgICAgICAgICAgIC8qIHNxX2NvbmNhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpc3RydWN0c2VxX3JlcGVhdCwgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KLQkoc3NpemVhcmdmdW5jKXN0cnVjdHNlcV9pdGVtLAkJLyogc3FfaXRlbSAqLwotCShzc2l6ZXNzaXplYXJnZnVuYylzdHJ1Y3RzZXFfc2xpY2UsCS8qIHNxX3NsaWNlICovCi0JMCwJCQkJCS8qIHNxX2Fzc19pdGVtICovCi0JMCwJCQkJCS8qIHNxX2Fzc19zbGljZSAqLwotCShvYmpvYmpwcm9jKXN0cnVjdHNlcV9jb250YWlucywJICAgICAgICAvKiBzcV9jb250YWlucyAqLworICAgIChsZW5mdW5jKXN0cnVjdHNlcV9sZW5ndGgsCisgICAgKGJpbmFyeWZ1bmMpc3RydWN0c2VxX2NvbmNhdCwgICAgICAgICAgIC8qIHNxX2NvbmNhdCAqLworICAgIChzc2l6ZWFyZ2Z1bmMpc3RydWN0c2VxX3JlcGVhdCwgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKXN0cnVjdHNlcV9pdGVtLCAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAoc3NpemVzc2l6ZWFyZ2Z1bmMpc3RydWN0c2VxX3NsaWNlLCAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX3NsaWNlICovCisgICAgKG9iam9ianByb2Mpc3RydWN0c2VxX2NvbnRhaW5zLCAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgc3RydWN0c2VxX2FzX21hcHBpbmcgPSB7Ci0JKGxlbmZ1bmMpc3RydWN0c2VxX2xlbmd0aCwKLQkoYmluYXJ5ZnVuYylzdHJ1Y3RzZXFfc3Vic2NyaXB0LAorICAgIChsZW5mdW5jKXN0cnVjdHNlcV9sZW5ndGgsCisgICAgKGJpbmFyeWZ1bmMpc3RydWN0c2VxX3N1YnNjcmlwdCwKIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzdHJ1Y3RzZXFfbWV0aG9kc1tdID0gewotCXsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilzdHJ1Y3RzZXFfcmVkdWNlLCAKLQkgTUVUSF9OT0FSR1MsIE5VTEx9LAotCXtOVUxMLCBOVUxMfQorICAgIHsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilzdHJ1Y3RzZXFfcmVkdWNlLAorICAgICBNRVRIX05PQVJHUywgTlVMTH0sCisgICAge05VTEwsIE5VTEx9CiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IF9zdHJ1Y3Rfc2VxdWVuY2VfdGVtcGxhdGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQlOVUxMLAkgICAgICAgICAgICAgICAgICAgICAJCS8qIHRwX25hbWUgKi8KLSAgICAgICAgMCwJCSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCSAgICAgICAgICAgICAgICAgICAgICAJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3Ipc3RydWN0c2VxX2RlYWxsb2MsCSAgICAgICAgLyogdHBfZGVhbGxvYyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkwLAkJCSAJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylzdHJ1Y3RzZXFfcmVwciwgICAgICAgICAgICAgCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJnN0cnVjdHNlcV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZzdHJ1Y3RzZXFfYXNfbWFwcGluZywJCQkvKiB0cF9hc19tYXBwaW5nICovCi0Jc3RydWN0c2VxX2hhc2gsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLCAgICAgICAgICAgICAgCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCSAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KLQlOVUxMLAkgCQkgICAgICAgICAJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0Jc3RydWN0c2VxX3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzdHJ1Y3RzZXFfbWV0aG9kcywgICAgICAJCS8qIHRwX21ldGhvZHMgKi8KLSAgICAgICAgTlVMTCwJCQkgICAgICAgICAgICAgCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCSAgICAgICAgICAJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlzdHJ1Y3RzZXFfbmV3LAkJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIChkZXN0cnVjdG9yKXN0cnVjdHNlcV9kZWFsbG9jLCAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpc3RydWN0c2VxX3JlcHIsICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZzdHJ1Y3RzZXFfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmc3RydWN0c2VxX2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICBzdHJ1Y3RzZXFfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgc3RydWN0c2VxX3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc3RydWN0c2VxX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHN0cnVjdHNlcV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiB2b2lkCiBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlTdHJ1Y3RTZXF1ZW5jZV9EZXNjICpkZXNjKQogewotCVB5T2JqZWN0ICpkaWN0OwotCVB5TWVtYmVyRGVmKiBtZW1iZXJzOwotCWludCBuX21lbWJlcnMsIG5fdW5uYW1lZF9tZW1iZXJzLCBpLCBrOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5TWVtYmVyRGVmKiBtZW1iZXJzOworICAgIGludCBuX21lbWJlcnMsIG5fdW5uYW1lZF9tZW1iZXJzLCBpLCBrOwogCiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwotCS8qIGlmIHRoZSB0eXBlIG9iamVjdCB3YXMgY2hhaW5lZCwgdW5jaGFpbiBpdCBmaXJzdAotCSAgIGJlZm9yZSBvdmVyd3JpdGluZyBpdHMgc3RvcmFnZSAqLwotCWlmICh0eXBlLT5fb2JfbmV4dCkgewotCQlfUHlfRm9yZ2V0UmVmZXJlbmNlKChQeU9iamVjdCopdHlwZSk7Ci0JfQorICAgIC8qIGlmIHRoZSB0eXBlIG9iamVjdCB3YXMgY2hhaW5lZCwgdW5jaGFpbiBpdCBmaXJzdAorICAgICAgIGJlZm9yZSBvdmVyd3JpdGluZyBpdHMgc3RvcmFnZSAqLworICAgIGlmICh0eXBlLT5fb2JfbmV4dCkgeworICAgICAgICBfUHlfRm9yZ2V0UmVmZXJlbmNlKChQeU9iamVjdCopdHlwZSk7CisgICAgfQogI2VuZGlmCiAKLQluX3VubmFtZWRfbWVtYmVycyA9IDA7Ci0JZm9yIChpID0gMDsgZGVzYy0+ZmllbGRzW2ldLm5hbWUgIT0gTlVMTDsgKytpKQotCQlpZiAoZGVzYy0+ZmllbGRzW2ldLm5hbWUgPT0gUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQpCi0JCQluX3VubmFtZWRfbWVtYmVycysrOwotCW5fbWVtYmVycyA9IGk7CisgICAgbl91bm5hbWVkX21lbWJlcnMgPSAwOworICAgIGZvciAoaSA9IDA7IGRlc2MtPmZpZWxkc1tpXS5uYW1lICE9IE5VTEw7ICsraSkKKyAgICAgICAgaWYgKGRlc2MtPmZpZWxkc1tpXS5uYW1lID09IFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkKQorICAgICAgICAgICAgbl91bm5hbWVkX21lbWJlcnMrKzsKKyAgICBuX21lbWJlcnMgPSBpOwogCi0JbWVtY3B5KHR5cGUsICZfc3RydWN0X3NlcXVlbmNlX3RlbXBsYXRlLCBzaXplb2YoUHlUeXBlT2JqZWN0KSk7Ci0JdHlwZS0+dHBfbmFtZSA9IGRlc2MtPm5hbWU7Ci0JdHlwZS0+dHBfZG9jID0gZGVzYy0+ZG9jOwotCXR5cGUtPnRwX2Jhc2ljc2l6ZSA9IHNpemVvZihQeVN0cnVjdFNlcXVlbmNlKSsKLQkJc2l6ZW9mKFB5T2JqZWN0KikqKG5fbWVtYmVycy0xKTsKLQl0eXBlLT50cF9pdGVtc2l6ZSA9IDA7CisgICAgbWVtY3B5KHR5cGUsICZfc3RydWN0X3NlcXVlbmNlX3RlbXBsYXRlLCBzaXplb2YoUHlUeXBlT2JqZWN0KSk7CisgICAgdHlwZS0+dHBfbmFtZSA9IGRlc2MtPm5hbWU7CisgICAgdHlwZS0+dHBfZG9jID0gZGVzYy0+ZG9jOworICAgIHR5cGUtPnRwX2Jhc2ljc2l6ZSA9IHNpemVvZihQeVN0cnVjdFNlcXVlbmNlKSsKKyAgICAgICAgc2l6ZW9mKFB5T2JqZWN0KikqKG5fbWVtYmVycy0xKTsKKyAgICB0eXBlLT50cF9pdGVtc2l6ZSA9IDA7CiAKLQltZW1iZXJzID0gUHlNZW1fTkVXKFB5TWVtYmVyRGVmLCBuX21lbWJlcnMtbl91bm5hbWVkX21lbWJlcnMrMSk7Ci0JaWYgKG1lbWJlcnMgPT0gTlVMTCkKLQkJcmV0dXJuOwotCQotCWZvciAoaSA9IGsgPSAwOyBpIDwgbl9tZW1iZXJzOyArK2kpIHsKLQkJaWYgKGRlc2MtPmZpZWxkc1tpXS5uYW1lID09IFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkKQotCQkJY29udGludWU7Ci0JCW1lbWJlcnNba10ubmFtZSA9IGRlc2MtPmZpZWxkc1tpXS5uYW1lOwotCQltZW1iZXJzW2tdLnR5cGUgPSBUX09CSkVDVDsKLQkJbWVtYmVyc1trXS5vZmZzZXQgPSBvZmZzZXRvZihQeVN0cnVjdFNlcXVlbmNlLCBvYl9pdGVtKQotCQkgICsgaSAqIHNpemVvZihQeU9iamVjdCopOwotCQltZW1iZXJzW2tdLmZsYWdzID0gUkVBRE9OTFk7Ci0JCW1lbWJlcnNba10uZG9jID0gZGVzYy0+ZmllbGRzW2ldLmRvYzsKLQkJaysrOwotCX0KLQltZW1iZXJzW2tdLm5hbWUgPSBOVUxMOworICAgIG1lbWJlcnMgPSBQeU1lbV9ORVcoUHlNZW1iZXJEZWYsIG5fbWVtYmVycy1uX3VubmFtZWRfbWVtYmVycysxKTsKKyAgICBpZiAobWVtYmVycyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQl0eXBlLT50cF9tZW1iZXJzID0gbWVtYmVyczsKKyAgICBmb3IgKGkgPSBrID0gMDsgaSA8IG5fbWVtYmVyczsgKytpKSB7CisgICAgICAgIGlmIChkZXNjLT5maWVsZHNbaV0ubmFtZSA9PSBQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBtZW1iZXJzW2tdLm5hbWUgPSBkZXNjLT5maWVsZHNbaV0ubmFtZTsKKyAgICAgICAgbWVtYmVyc1trXS50eXBlID0gVF9PQkpFQ1Q7CisgICAgICAgIG1lbWJlcnNba10ub2Zmc2V0ID0gb2Zmc2V0b2YoUHlTdHJ1Y3RTZXF1ZW5jZSwgb2JfaXRlbSkKKyAgICAgICAgICArIGkgKiBzaXplb2YoUHlPYmplY3QqKTsKKyAgICAgICAgbWVtYmVyc1trXS5mbGFncyA9IFJFQURPTkxZOworICAgICAgICBtZW1iZXJzW2tdLmRvYyA9IGRlc2MtPmZpZWxkc1tpXS5kb2M7CisgICAgICAgIGsrKzsKKyAgICB9CisgICAgbWVtYmVyc1trXS5uYW1lID0gTlVMTDsKIAotCWlmIChQeVR5cGVfUmVhZHkodHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKHR5cGUpOworICAgIHR5cGUtPnRwX21lbWJlcnMgPSBtZW1iZXJzOwogCi0JZGljdCA9IHR5cGUtPnRwX2RpY3Q7Ci0jZGVmaW5lIFNFVF9ESUNUX0ZST01fSU5UKGtleSwgdmFsdWUpCQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOwlcCi0JCWlmICh2ICE9IE5VTEwpIHsJCQkJXAotCQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwga2V5LCB2KTsJXAotCQkJUHlfREVDUkVGKHYpOwkJCQlcCi0JCX0JCQkJCQlcCi0JfSB3aGlsZSAoMCkKKyAgICBpZiAoUHlUeXBlX1JlYWR5KHR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRih0eXBlKTsKIAotCVNFVF9ESUNUX0ZST01fSU5UKHZpc2libGVfbGVuZ3RoX2tleSwgZGVzYy0+bl9pbl9zZXF1ZW5jZSk7Ci0JU0VUX0RJQ1RfRlJPTV9JTlQocmVhbF9sZW5ndGhfa2V5LCBuX21lbWJlcnMpOwotCVNFVF9ESUNUX0ZST01fSU5UKHVubmFtZWRfZmllbGRzX2tleSwgbl91bm5hbWVkX21lbWJlcnMpOworICAgIGRpY3QgPSB0eXBlLT50cF9kaWN0OworI2RlZmluZSBTRVRfRElDVF9GUk9NX0lOVChrZXksIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsgICAgICAgICAgICAgXAorICAgICAgICBpZiAodiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIGtleSwgdik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeV9ERUNSRUYodik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgU0VUX0RJQ1RfRlJPTV9JTlQodmlzaWJsZV9sZW5ndGhfa2V5LCBkZXNjLT5uX2luX3NlcXVlbmNlKTsKKyAgICBTRVRfRElDVF9GUk9NX0lOVChyZWFsX2xlbmd0aF9rZXksIG5fbWVtYmVycyk7CisgICAgU0VUX0RJQ1RfRlJPTV9JTlQodW5uYW1lZF9maWVsZHNfa2V5LCBuX3VubmFtZWRfbWVtYmVycyk7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3R1cGxlb2JqZWN0LmMgYi9PYmplY3RzL3R1cGxlb2JqZWN0LmMKaW5kZXggMTQzYTYyYy4uMzI0OWNjYyAxMDA2NDQKLS0tIGEvT2JqZWN0cy90dXBsZW9iamVjdC5jCisrKyBiL09iamVjdHMvdHVwbGVvYmplY3QuYwpAQCAtNSw3ICs1LDcgQEAKIAogLyogU3BlZWQgb3B0aW1pemF0aW9uIHRvIGF2b2lkIGZyZXF1ZW50IG1hbGxvYy9mcmVlIG9mIHNtYWxsIHR1cGxlcyAqLwogI2lmbmRlZiBQeVR1cGxlX01BWFNBVkVTSVpFCi0jZGVmaW5lIFB5VHVwbGVfTUFYU0FWRVNJWkUJMjAgIC8qIExhcmdlc3QgdHVwbGUgdG8gc2F2ZSBvbiBmcmVlIGxpc3QgKi8KKyNkZWZpbmUgUHlUdXBsZV9NQVhTQVZFU0laRSAgICAgMjAgIC8qIExhcmdlc3QgdHVwbGUgdG8gc2F2ZSBvbiBmcmVlIGxpc3QgKi8KICNlbmRpZgogI2lmbmRlZiBQeVR1cGxlX01BWEZSRUVMSVNUCiAjZGVmaW5lIFB5VHVwbGVfTUFYRlJFRUxJU1QgIDIwMDAgIC8qIE1heGltdW0gbnVtYmVyIG9mIHR1cGxlcyBvZiBlYWNoIHNpemUgdG8gc2F2ZSAqLwpAQCAtMzUsMTIgKzM1LDEyIEBACiBzdGF0aWMgdm9pZAogc2hvd190cmFjayh2b2lkKQogewotCWZwcmludGYoc3RkZXJyLCAiVHVwbGVzIGNyZWF0ZWQ6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCi0JCWNvdW50X3RyYWNrZWQgKyBjb3VudF91bnRyYWNrZWQpOwotCWZwcmludGYoc3RkZXJyLCAiVHVwbGVzIHRyYWNrZWQgYnkgdGhlIEdDOiAlIiBQWV9GT1JNQVRfU0laRV9UCi0JCSJkXG4iLCBjb3VudF90cmFja2VkKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiUuMmYlJSB0dXBsZSB0cmFja2luZyByYXRlXG5cbiIsCi0JCSgxMDAuMCpjb3VudF90cmFja2VkLyhjb3VudF91bnRyYWNrZWQrY291bnRfdHJhY2tlZCkpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlR1cGxlcyBjcmVhdGVkOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAorICAgICAgICBjb3VudF90cmFja2VkICsgY291bnRfdW50cmFja2VkKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlR1cGxlcyB0cmFja2VkIGJ5IHRoZSBHQzogJSIgUFlfRk9STUFUX1NJWkVfVAorICAgICAgICAiZFxuIiwgY291bnRfdHJhY2tlZCk7CisgICAgZnByaW50ZihzdGRlcnIsICIlLjJmJSUgdHVwbGUgdHJhY2tpbmcgcmF0ZVxuXG4iLAorICAgICAgICAoMTAwLjAqY291bnRfdHJhY2tlZC8oY291bnRfdW50cmFja2VkK2NvdW50X3RyYWNrZWQpKSk7CiB9CiAjZW5kaWYKIApAQCAtNDgsMTYwICs0OCwxNjAgQEAKIFB5T2JqZWN0ICoKIFB5VHVwbGVfTmV3KHJlZ2lzdGVyIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlyZWdpc3RlciBQeVR1cGxlT2JqZWN0ICpvcDsKLQlQeV9zc2l6ZV90IGk7Ci0JaWYgKHNpemUgPCAwKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqb3A7CisgICAgUHlfc3NpemVfdCBpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2lmIFB5VHVwbGVfTUFYU0FWRVNJWkUgPiAwCi0JaWYgKHNpemUgPT0gMCAmJiBmcmVlX2xpc3RbMF0pIHsKLQkJb3AgPSBmcmVlX2xpc3RbMF07Ci0JCVB5X0lOQ1JFRihvcCk7CisgICAgaWYgKHNpemUgPT0gMCAmJiBmcmVlX2xpc3RbMF0pIHsKKyAgICAgICAgb3AgPSBmcmVlX2xpc3RbMF07CisgICAgICAgIFB5X0lOQ1JFRihvcCk7CiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JCXR1cGxlX3plcm9fYWxsb2NzKys7CisgICAgICAgIHR1cGxlX3plcm9fYWxsb2NzKys7CiAjZW5kaWYKLQkJcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKLQl9Ci0JaWYgKHNpemUgPCBQeVR1cGxlX01BWFNBVkVTSVpFICYmIChvcCA9IGZyZWVfbGlzdFtzaXplXSkgIT0gTlVMTCkgewotCQlmcmVlX2xpc3Rbc2l6ZV0gPSAoUHlUdXBsZU9iamVjdCAqKSBvcC0+b2JfaXRlbVswXTsKLQkJbnVtZnJlZVtzaXplXS0tOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIH0KKyAgICBpZiAoc2l6ZSA8IFB5VHVwbGVfTUFYU0FWRVNJWkUgJiYgKG9wID0gZnJlZV9saXN0W3NpemVdKSAhPSBOVUxMKSB7CisgICAgICAgIGZyZWVfbGlzdFtzaXplXSA9IChQeVR1cGxlT2JqZWN0ICopIG9wLT5vYl9pdGVtWzBdOworICAgICAgICBudW1mcmVlW3NpemVdLS07CiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JCWZhc3RfdHVwbGVfYWxsb2NzKys7CisgICAgICAgIGZhc3RfdHVwbGVfYWxsb2NzKys7CiAjZW5kaWYKLQkJLyogSW5saW5lIFB5T2JqZWN0X0luaXRWYXIgKi8KKyAgICAgICAgLyogSW5saW5lIFB5T2JqZWN0X0luaXRWYXIgKi8KICNpZmRlZiBQeV9UUkFDRV9SRUZTCi0JCVB5X1NJWkUob3ApID0gc2l6ZTsKLQkJUHlfVFlQRShvcCkgPSAmUHlUdXBsZV9UeXBlOworICAgICAgICBQeV9TSVpFKG9wKSA9IHNpemU7CisgICAgICAgIFB5X1RZUEUob3ApID0gJlB5VHVwbGVfVHlwZTsKICNlbmRpZgotCQlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKW9wKTsKLQl9Ci0JZWxzZQorICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKW9wKTsKKyAgICB9CisgICAgZWxzZQogI2VuZGlmCi0JewotCQlQeV9zc2l6ZV90IG5ieXRlcyA9IHNpemUgKiBzaXplb2YoUHlPYmplY3QgKik7Ci0JCS8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotCQlpZiAobmJ5dGVzIC8gc2l6ZW9mKFB5T2JqZWN0ICopICE9IChzaXplX3Qpc2l6ZSB8fAotCQkgICAgKG5ieXRlcyA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5VHVwbGVPYmplY3QpIC0gc2l6ZW9mKFB5T2JqZWN0ICopKSkKLQkJewotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCX0KKyAgICB7CisgICAgICAgIFB5X3NzaXplX3QgbmJ5dGVzID0gc2l6ZSAqIHNpemVvZihQeU9iamVjdCAqKTsKKyAgICAgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgICAgIGlmIChuYnl0ZXMgLyBzaXplb2YoUHlPYmplY3QgKikgIT0gKHNpemVfdClzaXplIHx8CisgICAgICAgICAgICAobmJ5dGVzID4gUFlfU1NJWkVfVF9NQVggLSBzaXplb2YoUHlUdXBsZU9iamVjdCkgLSBzaXplb2YoUHlPYmplY3QgKikpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgfQogCi0JCW9wID0gUHlPYmplY3RfR0NfTmV3VmFyKFB5VHVwbGVPYmplY3QsICZQeVR1cGxlX1R5cGUsIHNpemUpOwotCQlpZiAob3AgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykKLQkJb3AtPm9iX2l0ZW1baV0gPSBOVUxMOworICAgICAgICBvcCA9IFB5T2JqZWN0X0dDX05ld1ZhcihQeVR1cGxlT2JqZWN0LCAmUHlUdXBsZV9UeXBlLCBzaXplKTsKKyAgICAgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpPTA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIG9wLT5vYl9pdGVtW2ldID0gTlVMTDsKICNpZiBQeVR1cGxlX01BWFNBVkVTSVpFID4gMAotCWlmIChzaXplID09IDApIHsKLQkJZnJlZV9saXN0WzBdID0gb3A7Ci0JCSsrbnVtZnJlZVswXTsKLQkJUHlfSU5DUkVGKG9wKTsJLyogZXh0cmEgSU5DUkVGIHNvIHRoYXQgdGhpcyBpcyBuZXZlciBmcmVlZCAqLwotCX0KKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIGZyZWVfbGlzdFswXSA9IG9wOworICAgICAgICArK251bWZyZWVbMF07CisgICAgICAgIFB5X0lOQ1JFRihvcCk7ICAgICAgICAgIC8qIGV4dHJhIElOQ1JFRiBzbyB0aGF0IHRoaXMgaXMgbmV2ZXIgZnJlZWQgKi8KKyAgICB9CiAjZW5kaWYKICNpZmRlZiBTSE9XX1RSQUNLX0NPVU5UCi0JY291bnRfdHJhY2tlZCsrOworICAgIGNvdW50X3RyYWNrZWQrKzsKICNlbmRpZgotCV9QeU9iamVjdF9HQ19UUkFDSyhvcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0sob3ApOworICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIFB5X3NzaXplX3QKIFB5VHVwbGVfU2l6ZShyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQllbHNlCi0JCXJldHVybiBQeV9TSVpFKG9wKTsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5X1NJWkUob3ApOwogfQogCiBQeU9iamVjdCAqCiBQeVR1cGxlX0dldEl0ZW0ocmVnaXN0ZXIgUHlPYmplY3QgKm9wLCByZWdpc3RlciBQeV9zc2l6ZV90IGkpCiB7Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUob3ApKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeVR1cGxlT2JqZWN0ICopb3ApIC0+IG9iX2l0ZW1baV07CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUob3ApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeVR1cGxlT2JqZWN0ICopb3ApIC0+IG9iX2l0ZW1baV07CiB9CiAKIGludAogUHlUdXBsZV9TZXRJdGVtKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqbmV3aXRlbSkKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqb2xkaXRlbTsKLQlyZWdpc3RlciBQeU9iamVjdCAqKnA7Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKG9wKSB8fCBvcC0+b2JfcmVmY250ICE9IDEpIHsKLQkJUHlfWERFQ1JFRihuZXdpdGVtKTsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShvcCkpIHsKLQkJUHlfWERFQ1JFRihuZXdpdGVtKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJInR1cGxlIGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcCA9ICgoUHlUdXBsZU9iamVjdCAqKW9wKSAtPiBvYl9pdGVtICsgaTsKLQlvbGRpdGVtID0gKnA7Ci0JKnAgPSBuZXdpdGVtOwotCVB5X1hERUNSRUYob2xkaXRlbSk7Ci0JcmV0dXJuIDA7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9sZGl0ZW07CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKipwOworICAgIGlmICghUHlUdXBsZV9DaGVjayhvcCkgfHwgb3AtPm9iX3JlZmNudCAhPSAxKSB7CisgICAgICAgIFB5X1hERUNSRUYobmV3aXRlbSk7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUob3ApKSB7CisgICAgICAgIFB5X1hERUNSRUYobmV3aXRlbSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInR1cGxlIGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcCA9ICgoUHlUdXBsZU9iamVjdCAqKW9wKSAtPiBvYl9pdGVtICsgaTsKKyAgICBvbGRpdGVtID0gKnA7CisgICAgKnAgPSBuZXdpdGVtOworICAgIFB5X1hERUNSRUYob2xkaXRlbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQKIF9QeVR1cGxlX01heWJlVW50cmFjayhQeU9iamVjdCAqb3ApCiB7Ci0JUHlUdXBsZU9iamVjdCAqdDsKLQlQeV9zc2l6ZV90IGksIG47Ci0JCi0JaWYgKCFQeVR1cGxlX0NoZWNrRXhhY3Qob3ApIHx8ICFfUHlPYmplY3RfR0NfSVNfVFJBQ0tFRChvcCkpCi0JCXJldHVybjsKLQl0ID0gKFB5VHVwbGVPYmplY3QgKikgb3A7Ci0JbiA9IFB5X1NJWkUodCk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqZWx0ID0gUHlUdXBsZV9HRVRfSVRFTSh0LCBpKTsKLQkJLyogVHVwbGUgd2l0aCBOVUxMIGVsZW1lbnRzIGFyZW4ndAotCQkgICBmdWxseSBjb25zdHJ1Y3RlZCwgZG9uJ3QgdW50cmFjawotCQkgICB0aGVtIHlldC4gKi8KLQkJaWYgKCFlbHQgfHwKLQkJCV9QeU9iamVjdF9HQ19NQVlfQkVfVFJBQ0tFRChlbHQpKQotCQkJcmV0dXJuOwotCX0KKyAgICBQeVR1cGxlT2JqZWN0ICp0OworICAgIFB5X3NzaXplX3QgaSwgbjsKKworICAgIGlmICghUHlUdXBsZV9DaGVja0V4YWN0KG9wKSB8fCAhX1B5T2JqZWN0X0dDX0lTX1RSQUNLRUQob3ApKQorICAgICAgICByZXR1cm47CisgICAgdCA9IChQeVR1cGxlT2JqZWN0ICopIG9wOworICAgIG4gPSBQeV9TSVpFKHQpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmVsdCA9IFB5VHVwbGVfR0VUX0lURU0odCwgaSk7CisgICAgICAgIC8qIFR1cGxlIHdpdGggTlVMTCBlbGVtZW50cyBhcmVuJ3QKKyAgICAgICAgICAgZnVsbHkgY29uc3RydWN0ZWQsIGRvbid0IHVudHJhY2sKKyAgICAgICAgICAgdGhlbSB5ZXQuICovCisgICAgICAgIGlmICghZWx0IHx8CisgICAgICAgICAgICBfUHlPYmplY3RfR0NfTUFZX0JFX1RSQUNLRUQoZWx0KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CiAjaWZkZWYgU0hPV19UUkFDS19DT1VOVAotCWNvdW50X3RyYWNrZWQtLTsKLQljb3VudF91bnRyYWNrZWQrKzsKKyAgICBjb3VudF90cmFja2VkLS07CisgICAgY291bnRfdW50cmFja2VkKys7CiAjZW5kaWYKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhvcCk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0sob3ApOwogfQogCiBQeU9iamVjdCAqCiBQeVR1cGxlX1BhY2soUHlfc3NpemVfdCBuLCAuLi4pCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICpvOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKippdGVtczsKLQl2YV9saXN0IHZhcmdzOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqbzsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICoqaXRlbXM7CisgICAgdmFfbGlzdCB2YXJnczsKIAotCXZhX3N0YXJ0KHZhcmdzLCBuKTsKLQlyZXN1bHQgPSBQeVR1cGxlX05ldyhuKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0ZW1zID0gKChQeVR1cGxlT2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCW8gPSB2YV9hcmcodmFyZ3MsIFB5T2JqZWN0ICopOwotCQlQeV9JTkNSRUYobyk7Ci0JCWl0ZW1zW2ldID0gbzsKLQl9Ci0JdmFfZW5kKHZhcmdzKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHZhX3N0YXJ0KHZhcmdzLCBuKTsKKyAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGl0ZW1zID0gKChQeVR1cGxlT2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIG8gPSB2YV9hcmcodmFyZ3MsIFB5T2JqZWN0ICopOworICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgIGl0ZW1zW2ldID0gbzsKKyAgICB9CisgICAgdmFfZW5kKHZhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTIxMCw0MzAgKzIxMCw0MzAgQEAKIHN0YXRpYyB2b2lkCiB0dXBsZWRlYWxsb2MocmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqb3ApCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgbGVuID0gIFB5X1NJWkUob3ApOwotCVB5T2JqZWN0X0dDX1VuVHJhY2sob3ApOwotCVB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4ob3ApCi0JaWYgKGxlbiA+IDApIHsKLQkJaSA9IGxlbjsKLQkJd2hpbGUgKC0taSA+PSAwKQotCQkJUHlfWERFQ1JFRihvcC0+b2JfaXRlbVtpXSk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgbGVuID0gIFB5X1NJWkUob3ApOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sob3ApOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4ob3ApCisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgaSA9IGxlbjsKKyAgICAgICAgd2hpbGUgKC0taSA+PSAwKQorICAgICAgICAgICAgUHlfWERFQ1JFRihvcC0+b2JfaXRlbVtpXSk7CiAjaWYgUHlUdXBsZV9NQVhTQVZFU0laRSA+IDAKLQkJaWYgKGxlbiA8IFB5VHVwbGVfTUFYU0FWRVNJWkUgJiYKLQkJICAgIG51bWZyZWVbbGVuXSA8IFB5VHVwbGVfTUFYRlJFRUxJU1QgJiYKLQkJICAgIFB5X1RZUEUob3ApID09ICZQeVR1cGxlX1R5cGUpCi0JCXsKLQkJCW9wLT5vYl9pdGVtWzBdID0gKFB5T2JqZWN0ICopIGZyZWVfbGlzdFtsZW5dOwotCQkJbnVtZnJlZVtsZW5dKys7Ci0JCQlmcmVlX2xpc3RbbGVuXSA9IG9wOwotCQkJZ290byBkb25lOyAvKiByZXR1cm4gKi8KLQkJfQorICAgICAgICBpZiAobGVuIDwgUHlUdXBsZV9NQVhTQVZFU0laRSAmJgorICAgICAgICAgICAgbnVtZnJlZVtsZW5dIDwgUHlUdXBsZV9NQVhGUkVFTElTVCAmJgorICAgICAgICAgICAgUHlfVFlQRShvcCkgPT0gJlB5VHVwbGVfVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgb3AtPm9iX2l0ZW1bMF0gPSAoUHlPYmplY3QgKikgZnJlZV9saXN0W2xlbl07CisgICAgICAgICAgICBudW1mcmVlW2xlbl0rKzsKKyAgICAgICAgICAgIGZyZWVfbGlzdFtsZW5dID0gb3A7CisgICAgICAgICAgICBnb3RvIGRvbmU7IC8qIHJldHVybiAqLworICAgICAgICB9CiAjZW5kaWYKLQl9Ci0JUHlfVFlQRShvcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopb3ApOworICAgIH0KKyAgICBQeV9UWVBFKG9wKS0+dHBfZnJlZSgoUHlPYmplY3QgKilvcCk7CiBkb25lOgotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKG9wKQorICAgIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKG9wKQogfQogCiBzdGF0aWMgaW50CiB0dXBsZXByaW50KFB5VHVwbGVPYmplY3QgKm9wLCBGSUxFICpmcCwgaW50IGZsYWdzKQogewotCVB5X3NzaXplX3QgaTsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnByaW50ZihmcCwgIigiKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKG9wKTsgaSsrKSB7Ci0JCWlmIChpID4gMCkgewotCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkJZnByaW50ZihmcCwgIiwgIik7Ci0JCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQl9Ci0JCWlmIChQeU9iamVjdF9QcmludChvcC0+b2JfaXRlbVtpXSwgZnAsIDApICE9IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWkgPSBQeV9TSVpFKG9wKTsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JaWYgKGkgPT0gMSkKLQkJZnByaW50ZihmcCwgIiwiKTsKLQlmcHJpbnRmKGZwLCAiKSIpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JcmV0dXJuIDA7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmcHJpbnRmKGZwLCAiKCIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUob3ApOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiLCAiKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5T2JqZWN0X1ByaW50KG9wLT5vYl9pdGVtW2ldLCBmcCwgMCkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaSA9IFB5X1NJWkUob3ApOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoaSA9PSAxKQorICAgICAgICBmcHJpbnRmKGZwLCAiLCIpOworICAgIGZwcmludGYoZnAsICIpIik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlcmVwcihQeVR1cGxlT2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqcywgKnRlbXA7Ci0JUHlPYmplY3QgKnBpZWNlcywgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICpzLCAqdGVtcDsKKyAgICBQeU9iamVjdCAqcGllY2VzLCAqcmVzdWx0ID0gTlVMTDsKIAotCW4gPSBQeV9TSVpFKHYpOwotCWlmIChuID09IDApCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIoKSIpOworICAgIG4gPSBQeV9TSVpFKHYpOworICAgIGlmIChuID09IDApCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIoKSIpOwogCi0JLyogV2hpbGUgbm90IG11dGFibGUsIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIGVuZCB1cCB3aXRoIGEgY3ljbGUgaW4gYQotCSAgIHR1cGxlIHRocm91Z2ggYW4gb2JqZWN0IHRoYXQgc3RvcmVzIGl0c2VsZiB3aXRoaW4gYSB0dXBsZSAoYW5kIHRodXMKLQkgICBpbmZpbml0ZWx5IGFza3MgZm9yIHRoZSByZXByIG9mIGl0c2VsZikuIFRoaXMgc2hvdWxkIG9ubHkgYmUKLQkgICBwb3NzaWJsZSB3aXRoaW4gYSB0eXBlLiAqLwotCWkgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0ICopdik7Ci0JaWYgKGkgIT0gMCkgewotCQlyZXR1cm4gaSA+IDAgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKCIoLi4uKSIpIDogTlVMTDsKLQl9CisgICAgLyogV2hpbGUgbm90IG11dGFibGUsIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIGVuZCB1cCB3aXRoIGEgY3ljbGUgaW4gYQorICAgICAgIHR1cGxlIHRocm91Z2ggYW4gb2JqZWN0IHRoYXQgc3RvcmVzIGl0c2VsZiB3aXRoaW4gYSB0dXBsZSAoYW5kIHRodXMKKyAgICAgICBpbmZpbml0ZWx5IGFza3MgZm9yIHRoZSByZXByIG9mIGl0c2VsZikuIFRoaXMgc2hvdWxkIG9ubHkgYmUKKyAgICAgICBwb3NzaWJsZSB3aXRoaW4gYSB0eXBlLiAqLworICAgIGkgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0ICopdik7CisgICAgaWYgKGkgIT0gMCkgeworICAgICAgICByZXR1cm4gaSA+IDAgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKCIoLi4uKSIpIDogTlVMTDsKKyAgICB9CiAKLQlwaWVjZXMgPSBQeVR1cGxlX05ldyhuKTsKLQlpZiAocGllY2VzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHBpZWNlcyA9IFB5VHVwbGVfTmV3KG4pOworICAgIGlmIChwaWVjZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBEbyByZXByKCkgb24gZWFjaCBlbGVtZW50LiAqLwotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIGdldHRpbmcgdGhlIHJlcHIgb2YgYSB0dXBsZSIpKQotCQkJZ290byBEb25lOwotCQlzID0gUHlPYmplY3RfUmVwcih2LT5vYl9pdGVtW2ldKTsKLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlnb3RvIERvbmU7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocGllY2VzLCBpLCBzKTsKLQl9CisgICAgLyogRG8gcmVwcigpIG9uIGVhY2ggZWxlbWVudC4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBnZXR0aW5nIHRoZSByZXByIG9mIGEgdHVwbGUiKSkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgcyA9IFB5T2JqZWN0X1JlcHIodi0+b2JfaXRlbVtpXSk7CisgICAgICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHBpZWNlcywgaSwgcyk7CisgICAgfQogCi0JLyogQWRkICIoKSIgZGVjb3JhdGlvbnMgdG8gdGhlIGZpcnN0IGFuZCBsYXN0IGl0ZW1zLiAqLwotCWFzc2VydChuID4gMCk7Ci0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIigiKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JdGVtcCA9IFB5VHVwbGVfR0VUX0lURU0ocGllY2VzLCAwKTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIHRlbXApOwotCVB5VHVwbGVfU0VUX0lURU0ocGllY2VzLCAwLCBzKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgLyogQWRkICIoKSIgZGVjb3JhdGlvbnMgdG8gdGhlIGZpcnN0IGFuZCBsYXN0IGl0ZW1zLiAqLworICAgIGFzc2VydChuID4gMCk7CisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIigiKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgdGVtcCA9IFB5VHVwbGVfR0VUX0lURU0ocGllY2VzLCAwKTsKKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIHRlbXApOworICAgIFB5VHVwbGVfU0VUX0lURU0ocGllY2VzLCAwLCBzKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuID09IDEgPyAiLCkiIDogIikiKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JdGVtcCA9IFB5VHVwbGVfR0VUX0lURU0ocGllY2VzLCBuLTEpOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmdGVtcCwgcyk7Ci0JUHlUdXBsZV9TRVRfSVRFTShwaWVjZXMsIG4tMSwgdGVtcCk7Ci0JaWYgKHRlbXAgPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG4gPT0gMSA/ICIsKSIgOiAiKSIpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB0ZW1wID0gUHlUdXBsZV9HRVRfSVRFTShwaWVjZXMsIG4tMSk7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZ0ZW1wLCBzKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHBpZWNlcywgbi0xLCB0ZW1wKTsKKyAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQkvKiBQYXN0ZSB0aGVtIGFsbCB0b2dldGhlciB3aXRoICIsICIgYmV0d2Vlbi4gKi8KLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLCAiKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JcmVzdWx0ID0gX1B5U3RyaW5nX0pvaW4ocywgcGllY2VzKTsKLQlQeV9ERUNSRUYocyk7CQorICAgIC8qIFBhc3RlIHRoZW0gYWxsIHRvZ2V0aGVyIHdpdGggIiwgIiBiZXR3ZWVuLiAqLworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIsICIpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICByZXN1bHQgPSBfUHlTdHJpbmdfSm9pbihzLCBwaWVjZXMpOworICAgIFB5X0RFQ1JFRihzKTsKIAogRG9uZToKLQlQeV9ERUNSRUYocGllY2VzKTsKLQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopdik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9ERUNSRUYocGllY2VzKTsKKyAgICBQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopdik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotLyogVGhlIGFkZGVuZCA4MjUyMCwgd2FzIHNlbGVjdGVkIGZyb20gdGhlIHJhbmdlKDAsIDEwMDAwMDApIGZvciAKLSAgIGdlbmVyYXRpbmcgdGhlIGdyZWF0ZXN0IG51bWJlciBvZiBwcmltZSBtdWx0aXBsaWVycyBmb3IgdHVwbGVzIAorLyogVGhlIGFkZGVuZCA4MjUyMCwgd2FzIHNlbGVjdGVkIGZyb20gdGhlIHJhbmdlKDAsIDEwMDAwMDApIGZvcgorICAgZ2VuZXJhdGluZyB0aGUgZ3JlYXRlc3QgbnVtYmVyIG9mIHByaW1lIG11bHRpcGxpZXJzIGZvciB0dXBsZXMKICAgIHVwdG8gbGVuZ3RoIGVpZ2h0OgogCi0gICAgIDEwODI1MjcsIDExNjUwNDksIDEwODI1MzEsIDExNjUwNTcsIDEyNDc1ODEsIDEzMzAxMDMsIDEwODI1MzMsIAorICAgICAxMDgyNTI3LCAxMTY1MDQ5LCAxMDgyNTMxLCAxMTY1MDU3LCAxMjQ3NTgxLCAxMzMwMTAzLCAxMDgyNTMzLAogICAgICAxMzMwMTExLCAxNDEyNjMzLCAxMTY1MDY5LCAxMjQ3NTk5LCAxNDk1MTc3LCAxNTc3Njk5CiAqLwogCiBzdGF0aWMgbG9uZwogdHVwbGVoYXNoKFB5VHVwbGVPYmplY3QgKnYpCiB7Ci0JcmVnaXN0ZXIgbG9uZyB4LCB5OwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgbGVuID0gUHlfU0laRSh2KTsKLQlyZWdpc3RlciBQeU9iamVjdCAqKnA7Ci0JbG9uZyBtdWx0ID0gMTAwMDAwM0w7Ci0JeCA9IDB4MzQ1Njc4TDsKLQlwID0gdi0+b2JfaXRlbTsKLQl3aGlsZSAoLS1sZW4gPj0gMCkgewotCQl5ID0gUHlPYmplY3RfSGFzaCgqcCsrKTsKLQkJaWYgKHkgPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JCXggPSAoeCBeIHkpICogbXVsdDsKLQkJLyogdGhlIGNhc3QgbWlnaHQgdHJ1bmNhdGUgbGVuOyB0aGF0IGRvZXNuJ3QgY2hhbmdlIGhhc2ggc3RhYmlsaXR5ICovCi0JCW11bHQgKz0gKGxvbmcpKDgyNTIwTCArIGxlbiArIGxlbik7Ci0JfQotCXggKz0gOTc1MzFMOwotCWlmICh4ID09IC0xKQotCQl4ID0gLTI7Ci0JcmV0dXJuIHg7CisgICAgcmVnaXN0ZXIgbG9uZyB4LCB5OworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgbGVuID0gUHlfU0laRSh2KTsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqKnA7CisgICAgbG9uZyBtdWx0ID0gMTAwMDAwM0w7CisgICAgeCA9IDB4MzQ1Njc4TDsKKyAgICBwID0gdi0+b2JfaXRlbTsKKyAgICB3aGlsZSAoLS1sZW4gPj0gMCkgeworICAgICAgICB5ID0gUHlPYmplY3RfSGFzaCgqcCsrKTsKKyAgICAgICAgaWYgKHkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHggPSAoeCBeIHkpICogbXVsdDsKKyAgICAgICAgLyogdGhlIGNhc3QgbWlnaHQgdHJ1bmNhdGUgbGVuOyB0aGF0IGRvZXNuJ3QgY2hhbmdlIGhhc2ggc3RhYmlsaXR5ICovCisgICAgICAgIG11bHQgKz0gKGxvbmcpKDgyNTIwTCArIGxlbiArIGxlbik7CisgICAgfQorICAgIHggKz0gOTc1MzFMOworICAgIGlmICh4ID09IC0xKQorICAgICAgICB4ID0gLTI7CisgICAgcmV0dXJuIHg7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiB0dXBsZWxlbmd0aChQeVR1cGxlT2JqZWN0ICphKQogewotCXJldHVybiBQeV9TSVpFKGEpOworICAgIHJldHVybiBQeV9TSVpFKGEpOwogfQogCiBzdGF0aWMgaW50CiB0dXBsZWNvbnRhaW5zKFB5VHVwbGVPYmplY3QgKmEsIFB5T2JqZWN0ICplbCkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IGNtcDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IGNtcDsKIAotCWZvciAoaSA9IDAsIGNtcCA9IDAgOyBjbXAgPT0gMCAmJiBpIDwgUHlfU0laRShhKTsgKytpKQotCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZWwsIFB5VHVwbGVfR0VUX0lURU0oYSwgaSksCi0JCQkJCQkgICBQeV9FUSk7Ci0JcmV0dXJuIGNtcDsKKyAgICBmb3IgKGkgPSAwLCBjbXAgPSAwIDsgY21wID09IDAgJiYgaSA8IFB5X1NJWkUoYSk7ICsraSkKKyAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsLCBQeVR1cGxlX0dFVF9JVEVNKGEsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0VRKTsKKyAgICByZXR1cm4gY21wOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHVwbGVpdGVtKHJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKmEsIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSkKIHsKLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoYS0+b2JfaXRlbVtpXSk7Ci0JcmV0dXJuIGEtPm9iX2l0ZW1baV07CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInR1cGxlIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKGEtPm9iX2l0ZW1baV0pOworICAgIHJldHVybiBhLT5vYl9pdGVtW2ldOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotdHVwbGVzbGljZShyZWdpc3RlciBQeVR1cGxlT2JqZWN0ICphLCByZWdpc3RlciBQeV9zc2l6ZV90IGlsb3csIAotCSAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaWhpZ2gpCit0dXBsZXNsaWNlKHJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKmEsIHJlZ2lzdGVyIFB5X3NzaXplX3QgaWxvdywKKyAgICAgICAgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpaGlnaCkKIHsKLQlyZWdpc3RlciBQeVR1cGxlT2JqZWN0ICpucDsKLQlQeU9iamVjdCAqKnNyYywgKipkZXN0OwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IGxlbjsKLQlpZiAoaWxvdyA8IDApCi0JCWlsb3cgPSAwOwotCWlmIChpaGlnaCA+IFB5X1NJWkUoYSkpCi0JCWloaWdoID0gUHlfU0laRShhKTsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JaWYgKGlsb3cgPT0gMCAmJiBpaGlnaCA9PSBQeV9TSVpFKGEpICYmIFB5VHVwbGVfQ2hlY2tFeGFjdChhKSkgewotCQlQeV9JTkNSRUYoYSk7Ci0JCXJldHVybiAoUHlPYmplY3QgKilhOwotCX0KLQlsZW4gPSBpaGlnaCAtIGlsb3c7Ci0JbnAgPSAoUHlUdXBsZU9iamVjdCAqKVB5VHVwbGVfTmV3KGxlbik7Ci0JaWYgKG5wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNyYyA9IGEtPm9iX2l0ZW0gKyBpbG93OwotCWRlc3QgPSBucC0+b2JfaXRlbTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBzcmNbaV07Ci0JCVB5X0lOQ1JFRih2KTsKLQkJZGVzdFtpXSA9IHY7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilucDsKKyAgICByZWdpc3RlciBQeVR1cGxlT2JqZWN0ICpucDsKKyAgICBQeU9iamVjdCAqKnNyYywgKipkZXN0OworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBpZiAoaWxvdyA8IDApCisgICAgICAgIGlsb3cgPSAwOworICAgIGlmIChpaGlnaCA+IFB5X1NJWkUoYSkpCisgICAgICAgIGloaWdoID0gUHlfU0laRShhKTsKKyAgICBpZiAoaWhpZ2ggPCBpbG93KQorICAgICAgICBpaGlnaCA9IGlsb3c7CisgICAgaWYgKGlsb3cgPT0gMCAmJiBpaGlnaCA9PSBQeV9TSVpFKGEpICYmIFB5VHVwbGVfQ2hlY2tFeGFjdChhKSkgeworICAgICAgICBQeV9JTkNSRUYoYSk7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilhOworICAgIH0KKyAgICBsZW4gPSBpaGlnaCAtIGlsb3c7CisgICAgbnAgPSAoUHlUdXBsZU9iamVjdCAqKVB5VHVwbGVfTmV3KGxlbik7CisgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNyYyA9IGEtPm9iX2l0ZW0gKyBpbG93OworICAgIGRlc3QgPSBucC0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBzcmNbaV07CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgZGVzdFtpXSA9IHY7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilucDsKIH0KIAogUHlPYmplY3QgKgogUHlUdXBsZV9HZXRTbGljZShQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBqKQogewotCWlmIChvcCA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB0dXBsZXNsaWNlKChQeVR1cGxlT2JqZWN0ICopb3AsIGksIGopOworICAgIGlmIChvcCA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB0dXBsZXNsaWNlKChQeVR1cGxlT2JqZWN0ICopb3AsIGksIGopOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHVwbGVjb25jYXQocmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqYSwgcmVnaXN0ZXIgUHlPYmplY3QgKmJiKQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3Qgc2l6ZTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKipzcmMsICoqZGVzdDsKLQlQeVR1cGxlT2JqZWN0ICpucDsKLQlpZiAoIVB5VHVwbGVfQ2hlY2soYmIpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgCQkgICAgICJjYW4gb25seSBjb25jYXRlbmF0ZSB0dXBsZSAobm90IFwiJS4yMDBzXCIpIHRvIHR1cGxlIiwKLQkJCSAgICAgUHlfVFlQRShiYiktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBzaXplOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqKnNyYywgKipkZXN0OworICAgIFB5VHVwbGVPYmplY3QgKm5wOworICAgIGlmICghUHlUdXBsZV9DaGVjayhiYikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAiY2FuIG9ubHkgY29uY2F0ZW5hdGUgdHVwbGUgKG5vdCBcIiUuMjAwc1wiKSB0byB0dXBsZSIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUoYmIpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2RlZmluZSBiICgoUHlUdXBsZU9iamVjdCAqKWJiKQotCXNpemUgPSBQeV9TSVpFKGEpICsgUHlfU0laRShiKTsKLQlpZiAoc2l6ZSA8IDApCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCW5wID0gKFB5VHVwbGVPYmplY3QgKikgUHlUdXBsZV9OZXcoc2l6ZSk7Ci0JaWYgKG5wID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNyYyA9IGEtPm9iX2l0ZW07Ci0JZGVzdCA9IG5wLT5vYl9pdGVtOwotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKGEpOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBzcmNbaV07Ci0JCVB5X0lOQ1JFRih2KTsKLQkJZGVzdFtpXSA9IHY7Ci0JfQotCXNyYyA9IGItPm9iX2l0ZW07Ci0JZGVzdCA9IG5wLT5vYl9pdGVtICsgUHlfU0laRShhKTsKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShiKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gc3JjW2ldOwotCQlQeV9JTkNSRUYodik7Ci0JCWRlc3RbaV0gPSB2OwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbnA7CisgICAgc2l6ZSA9IFB5X1NJWkUoYSkgKyBQeV9TSVpFKGIpOworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgbnAgPSAoUHlUdXBsZU9iamVjdCAqKSBQeVR1cGxlX05ldyhzaXplKTsKKyAgICBpZiAobnAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3JjID0gYS0+b2JfaXRlbTsKKyAgICBkZXN0ID0gbnAtPm9iX2l0ZW07CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoYSk7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdiA9IHNyY1tpXTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBkZXN0W2ldID0gdjsKKyAgICB9CisgICAgc3JjID0gYi0+b2JfaXRlbTsKKyAgICBkZXN0ID0gbnAtPm9iX2l0ZW0gKyBQeV9TSVpFKGEpOworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKGIpOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBzcmNbaV07CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgZGVzdFtpXSA9IHY7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilucDsKICN1bmRlZiBiCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZXJlcGVhdChQeVR1cGxlT2JqZWN0ICphLCBQeV9zc2l6ZV90IG4pCiB7Ci0JUHlfc3NpemVfdCBpLCBqOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeVR1cGxlT2JqZWN0ICpucDsKLQlQeU9iamVjdCAqKnAsICoqaXRlbXM7Ci0JaWYgKG4gPCAwKQotCQluID0gMDsKLQlpZiAoUHlfU0laRShhKSA9PSAwIHx8IG4gPT0gMSkgewotCQlpZiAoUHlUdXBsZV9DaGVja0V4YWN0KGEpKSB7Ci0JCQkvKiBTaW5jZSB0dXBsZXMgYXJlIGltbXV0YWJsZSwgd2UgY2FuIHJldHVybiBhIHNoYXJlZAotCQkJICAgY29weSBpbiB0aGlzIGNhc2UgKi8KLQkJCVB5X0lOQ1JFRihhKTsKLQkJCXJldHVybiAoUHlPYmplY3QgKilhOwotCQl9Ci0JCWlmIChQeV9TSVpFKGEpID09IDApCi0JCQlyZXR1cm4gUHlUdXBsZV9OZXcoMCk7Ci0JfQotCXNpemUgPSBQeV9TSVpFKGEpICogbjsKLQlpZiAoc2l6ZS9QeV9TSVpFKGEpICE9IG4pCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCW5wID0gKFB5VHVwbGVPYmplY3QgKikgUHlUdXBsZV9OZXcoc2l6ZSk7Ci0JaWYgKG5wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXAgPSBucC0+b2JfaXRlbTsKLQlpdGVtcyA9IGEtPm9iX2l0ZW07Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgUHlfU0laRShhKTsgaisrKSB7Ci0JCQkqcCA9IGl0ZW1zW2pdOwotCQkJUHlfSU5DUkVGKCpwKTsKLQkJCXArKzsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopIG5wOworICAgIFB5X3NzaXplX3QgaSwgajsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlUdXBsZU9iamVjdCAqbnA7CisgICAgUHlPYmplY3QgKipwLCAqKml0ZW1zOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgbiA9IDA7CisgICAgaWYgKFB5X1NJWkUoYSkgPT0gMCB8fCBuID09IDEpIHsKKyAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdChhKSkgeworICAgICAgICAgICAgLyogU2luY2UgdHVwbGVzIGFyZSBpbW11dGFibGUsIHdlIGNhbiByZXR1cm4gYSBzaGFyZWQKKyAgICAgICAgICAgICAgIGNvcHkgaW4gdGhpcyBjYXNlICovCisgICAgICAgICAgICBQeV9JTkNSRUYoYSk7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopYTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlfU0laRShhKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIFB5VHVwbGVfTmV3KDApOworICAgIH0KKyAgICBzaXplID0gUHlfU0laRShhKSAqIG47CisgICAgaWYgKHNpemUvUHlfU0laRShhKSAhPSBuKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBucCA9IChQeVR1cGxlT2JqZWN0ICopIFB5VHVwbGVfTmV3KHNpemUpOworICAgIGlmIChucCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwID0gbnAtPm9iX2l0ZW07CisgICAgaXRlbXMgPSBhLT5vYl9pdGVtOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFB5X1NJWkUoYSk7IGorKykgeworICAgICAgICAgICAgKnAgPSBpdGVtc1tqXTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRigqcCk7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBucDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlaW5kZXgoUHlUdXBsZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpLCBzdGFydD0wLCBzdG9wPVB5X1NJWkUoc2VsZik7Ci0JUHlPYmplY3QgKnY7CisgICAgUHlfc3NpemVfdCBpLCBzdGFydD0wLCBzdG9wPVB5X1NJWkUoc2VsZik7CisgICAgUHlPYmplY3QgKnY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjppbmRleCIsICZ2LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RvcCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChzdGFydCA8IDApIHsKLQkJc3RhcnQgKz0gUHlfU0laRShzZWxmKTsKLQkJaWYgKHN0YXJ0IDwgMCkKLQkJCXN0YXJ0ID0gMDsKLQl9Ci0JaWYgKHN0b3AgPCAwKSB7Ci0JCXN0b3AgKz0gUHlfU0laRShzZWxmKTsKLQkJaWYgKHN0b3AgPCAwKQotCQkJc3RvcCA9IDA7Ci0JfQotCWZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcCAmJiBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOwotCQlpZiAoY21wID4gMCkKLQkJCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChpKTsKLQkJZWxzZSBpZiAoY21wIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInR1cGxlLmluZGV4KHgpOiB4IG5vdCBpbiB0dXBsZSIpOwotCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmluZGV4IiwgJnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdG9wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHN0YXJ0IDwgMCkgeworICAgICAgICBzdGFydCArPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgc3RhcnQgPSAwOworICAgIH0KKyAgICBpZiAoc3RvcCA8IDApIHsKKyAgICAgICAgc3RvcCArPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBpZiAoc3RvcCA8IDApCisgICAgICAgICAgICBzdG9wID0gMDsKKyAgICB9CisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wICYmIGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKKyAgICAgICAgaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmLT5vYl9pdGVtW2ldLCB2LCBQeV9FUSk7CisgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGkpOworICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidHVwbGUuaW5kZXgoeCk6IHggbm90IGluIHR1cGxlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZWNvdW50KFB5VHVwbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgY291bnQgPSAwOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOwotCQlpZiAoY21wID4gMCkKLQkJCWNvdW50Kys7Ci0JCWVsc2UgaWYgKGNtcCA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOworICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKIH0KIAogc3RhdGljIGludAogdHVwbGV0cmF2ZXJzZShQeVR1cGxlT2JqZWN0ICpvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZm9yIChpID0gUHlfU0laRShvKTsgLS1pID49IDA7ICkKLQkJUHlfVklTSVQoby0+b2JfaXRlbVtpXSk7Ci0JcmV0dXJuIDA7CisgICAgZm9yIChpID0gUHlfU0laRShvKTsgLS1pID49IDA7ICkKKyAgICAgICAgUHlfVklTSVQoby0+b2JfaXRlbVtpXSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZXJpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5VHVwbGVPYmplY3QgKnZ0LCAqd3Q7Ci0JUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3Qgdmxlbiwgd2xlbjsKKyAgICBQeVR1cGxlT2JqZWN0ICp2dCwgKnd0OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IHZsZW4sIHdsZW47CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2sodikgfHwgIVB5VHVwbGVfQ2hlY2sodykpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2sodikgfHwgIVB5VHVwbGVfQ2hlY2sodykpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KIAotCXZ0ID0gKFB5VHVwbGVPYmplY3QgKil2OwotCXd0ID0gKFB5VHVwbGVPYmplY3QgKil3OworICAgIHZ0ID0gKFB5VHVwbGVPYmplY3QgKil2OworICAgIHd0ID0gKFB5VHVwbGVPYmplY3QgKil3OwogCi0JdmxlbiA9IFB5X1NJWkUodnQpOwotCXdsZW4gPSBQeV9TSVpFKHd0KTsKKyAgICB2bGVuID0gUHlfU0laRSh2dCk7CisgICAgd2xlbiA9IFB5X1NJWkUod3QpOwogCi0JLyogTm90ZTogIHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgZm9yIGxpc3RzIGhhcyBhbiAiZWFybHkgb3V0IiB0ZXN0Ci0JICogaGVyZSB3aGVuIG9wIGlzIEVRIG9yIE5FIGFuZCB0aGUgbGVuZ3RocyBkaWZmZXIuICBUaGF0IHBheXMgdGhlcmUsCi0JICogYnV0IFRpbSB3YXMgdW5hYmxlIHRvIGZpbmQgYW55IHJlYWwgY29kZSB3aGVyZSBFUS9ORSB0dXBsZQotCSAqIGNvbXBhcmVzIGRvbid0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoLCBzbyB0ZXN0aW5nIGZvciBpdCBoZXJlIHdvdWxkCi0JICogaGF2ZSBjb3N0IHdpdGhvdXQgYmVuZWZpdC4KLQkgKi8KKyAgICAvKiBOb3RlOiAgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBmb3IgbGlzdHMgaGFzIGFuICJlYXJseSBvdXQiIHRlc3QKKyAgICAgKiBoZXJlIHdoZW4gb3AgaXMgRVEgb3IgTkUgYW5kIHRoZSBsZW5ndGhzIGRpZmZlci4gIFRoYXQgcGF5cyB0aGVyZSwKKyAgICAgKiBidXQgVGltIHdhcyB1bmFibGUgdG8gZmluZCBhbnkgcmVhbCBjb2RlIHdoZXJlIEVRL05FIHR1cGxlCisgICAgICogY29tcGFyZXMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgsIHNvIHRlc3RpbmcgZm9yIGl0IGhlcmUgd291bGQKKyAgICAgKiBoYXZlIGNvc3Qgd2l0aG91dCBiZW5lZml0LgorICAgICAqLwogCi0JLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgaW5kZXggd2hlcmUgaXRlbXMgYXJlIGRpZmZlcmVudC4KLQkgKiBOb3RlIHRoYXQgYmVjYXVzZSB0dXBsZXMgYXJlIGltbXV0YWJsZSwgaXQncyBzYWZlIHRvIHJldXNlCi0JICogdmxlbiBhbmQgd2xlbiBhY3Jvc3MgdGhlIGNvbXBhcmlzb24gY2FsbHMuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHZsZW4gJiYgaSA8IHdsZW47IGkrKykgewotCQlpbnQgayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2dC0+b2JfaXRlbVtpXSwKLQkJCQkJCSB3dC0+b2JfaXRlbVtpXSwgUHlfRVEpOwotCQlpZiAoayA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCFrKQotCQkJYnJlYWs7Ci0JfQorICAgIC8qIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGluZGV4IHdoZXJlIGl0ZW1zIGFyZSBkaWZmZXJlbnQuCisgICAgICogTm90ZSB0aGF0IGJlY2F1c2UgdHVwbGVzIGFyZSBpbW11dGFibGUsIGl0J3Mgc2FmZSB0byByZXVzZQorICAgICAqIHZsZW4gYW5kIHdsZW4gYWNyb3NzIHRoZSBjb21wYXJpc29uIGNhbGxzLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCB2bGVuICYmIGkgPCB3bGVuOyBpKyspIHsKKyAgICAgICAgaW50IGsgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodnQtPm9iX2l0ZW1baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0LT5vYl9pdGVtW2ldLCBQeV9FUSk7CisgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIWspCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQlpZiAoaSA+PSB2bGVuIHx8IGkgPj0gd2xlbikgewotCQkvKiBObyBtb3JlIGl0ZW1zIHRvIGNvbXBhcmUgLS0gY29tcGFyZSBzaXplcyAqLwotCQlpbnQgY21wOwotCQlQeU9iamVjdCAqcmVzOwotCQlzd2l0Y2ggKG9wKSB7Ci0JCWNhc2UgUHlfTFQ6IGNtcCA9IHZsZW4gPCAgd2xlbjsgYnJlYWs7Ci0JCWNhc2UgUHlfTEU6IGNtcCA9IHZsZW4gPD0gd2xlbjsgYnJlYWs7Ci0JCWNhc2UgUHlfRVE6IGNtcCA9IHZsZW4gPT0gd2xlbjsgYnJlYWs7Ci0JCWNhc2UgUHlfTkU6IGNtcCA9IHZsZW4gIT0gd2xlbjsgYnJlYWs7Ci0JCWNhc2UgUHlfR1Q6IGNtcCA9IHZsZW4gPiAgd2xlbjsgYnJlYWs7Ci0JCWNhc2UgUHlfR0U6IGNtcCA9IHZsZW4gPj0gd2xlbjsgYnJlYWs7Ci0JCWRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBjYW5ub3QgaGFwcGVuICovCi0JCX0KLQkJaWYgKGNtcCkKLQkJCXJlcyA9IFB5X1RydWU7Ci0JCWVsc2UKLQkJCXJlcyA9IFB5X0ZhbHNlOwotCQlQeV9JTkNSRUYocmVzKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgaWYgKGkgPj0gdmxlbiB8fCBpID49IHdsZW4pIHsKKyAgICAgICAgLyogTm8gbW9yZSBpdGVtcyB0byBjb21wYXJlIC0tIGNvbXBhcmUgc2l6ZXMgKi8KKyAgICAgICAgaW50IGNtcDsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIFB5X0xUOiBjbXAgPSB2bGVuIDwgIHdsZW47IGJyZWFrOworICAgICAgICBjYXNlIFB5X0xFOiBjbXAgPSB2bGVuIDw9IHdsZW47IGJyZWFrOworICAgICAgICBjYXNlIFB5X0VROiBjbXAgPSB2bGVuID09IHdsZW47IGJyZWFrOworICAgICAgICBjYXNlIFB5X05FOiBjbXAgPSB2bGVuICE9IHdsZW47IGJyZWFrOworICAgICAgICBjYXNlIFB5X0dUOiBjbXAgPSB2bGVuID4gIHdsZW47IGJyZWFrOworICAgICAgICBjYXNlIFB5X0dFOiBjbXAgPSB2bGVuID49IHdsZW47IGJyZWFrOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gTlVMTDsgLyogY2Fubm90IGhhcHBlbiAqLworICAgICAgICB9CisgICAgICAgIGlmIChjbXApCisgICAgICAgICAgICByZXMgPSBQeV9UcnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBQeV9GYWxzZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogCi0JLyogV2UgaGF2ZSBhbiBpdGVtIHRoYXQgZGlmZmVycyAtLSBzaG9ydGN1dHMgZm9yIEVRL05FICovCi0JaWYgKG9wID09IFB5X0VRKSB7Ci0JCVB5X0lOQ1JFRihQeV9GYWxzZSk7Ci0JCXJldHVybiBQeV9GYWxzZTsKLQl9Ci0JaWYgKG9wID09IFB5X05FKSB7Ci0JCVB5X0lOQ1JFRihQeV9UcnVlKTsKLQkJcmV0dXJuIFB5X1RydWU7Ci0JfQorICAgIC8qIFdlIGhhdmUgYW4gaXRlbSB0aGF0IGRpZmZlcnMgLS0gc2hvcnRjdXRzIGZvciBFUS9ORSAqLworICAgIGlmIChvcCA9PSBQeV9FUSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfRmFsc2UpOworICAgICAgICByZXR1cm4gUHlfRmFsc2U7CisgICAgfQorICAgIGlmIChvcCA9PSBQeV9ORSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfVHJ1ZSk7CisgICAgICAgIHJldHVybiBQeV9UcnVlOworICAgIH0KIAotCS8qIENvbXBhcmUgdGhlIGZpbmFsIGl0ZW0gYWdhaW4gdXNpbmcgdGhlIHByb3BlciBvcGVyYXRvciAqLwotCXJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZSh2dC0+b2JfaXRlbVtpXSwgd3QtPm9iX2l0ZW1baV0sIG9wKTsKKyAgICAvKiBDb21wYXJlIHRoZSBmaW5hbCBpdGVtIGFnYWluIHVzaW5nIHRoZSBwcm9wZXIgb3BlcmF0b3IgKi8KKyAgICByZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUodnQtPm9iX2l0ZW1baV0sIHd0LT5vYl9pdGVtW2ldLCBvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC02NDIsNDEgKzY0Miw0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqYXJnID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNlcXVlbmNlIiwgMH07CisgICAgUHlPYmplY3QgKmFyZyA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzZXF1ZW5jZSIsIDB9OwogCi0JaWYgKHR5cGUgIT0gJlB5VHVwbGVfVHlwZSkKLQkJcmV0dXJuIHR1cGxlX3N1YnR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8Tzp0dXBsZSIsIGt3bGlzdCwgJmFyZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlICE9ICZQeVR1cGxlX1R5cGUpCisgICAgICAgIHJldHVybiB0dXBsZV9zdWJ0eXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE86dHVwbGUiLCBrd2xpc3QsICZhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIFB5VHVwbGVfTmV3KDApOwotCWVsc2UKLQkJcmV0dXJuIFB5U2VxdWVuY2VfVHVwbGUoYXJnKTsKKyAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeVR1cGxlX05ldygwKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVNlcXVlbmNlX1R1cGxlKGFyZyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZV9zdWJ0eXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqdG1wLCAqbmV3b2JqLCAqaXRlbTsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKnRtcCwgKm5ld29iaiwgKml0ZW07CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5VHVwbGVfVHlwZSkpOwotCXRtcCA9IHR1cGxlX25ldygmUHlUdXBsZV9UeXBlLCBhcmdzLCBrd2RzKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeVR1cGxlX0NoZWNrKHRtcCkpOwotCW5ld29iaiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIG4gPSBQeVR1cGxlX0dFVF9TSVpFKHRtcCkpOwotCWlmIChuZXdvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpdGVtID0gUHlUdXBsZV9HRVRfSVRFTSh0bXAsIGkpOwotCQlQeV9JTkNSRUYoaXRlbSk7Ci0JCVB5VHVwbGVfU0VUX0lURU0obmV3b2JqLCBpLCBpdGVtKTsKLQl9Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIG5ld29iajsKKyAgICBhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlUdXBsZV9UeXBlKSk7CisgICAgdG1wID0gdHVwbGVfbmV3KCZQeVR1cGxlX1R5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2sodG1wKSk7CisgICAgbmV3b2JqID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgbiA9IFB5VHVwbGVfR0VUX1NJWkUodG1wKSk7CisgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHRtcCwgaSk7CisgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdvYmosIGksIGl0ZW0pOworICAgIH0KKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gbmV3b2JqOwogfQogCiBQeURvY19TVFJWQVIodHVwbGVfZG9jLApAQCAtNjg2LDg2ICs2ODYsODYgQEAKIElmIHRoZSBhcmd1bWVudCBpcyBhIHR1cGxlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzYW1lIG9iamVjdC4iKTsKIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIHR1cGxlX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKXR1cGxlbGVuZ3RoLAkJCS8qIHNxX2xlbmd0aCAqLwotCShiaW5hcnlmdW5jKXR1cGxlY29uY2F0LAkJLyogc3FfY29uY2F0ICovCi0JKHNzaXplYXJnZnVuYyl0dXBsZXJlcGVhdCwJCS8qIHNxX3JlcGVhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpdHVwbGVpdGVtLAkJLyogc3FfaXRlbSAqLwotCShzc2l6ZXNzaXplYXJnZnVuYyl0dXBsZXNsaWNlLAkJLyogc3Ffc2xpY2UgKi8KLQkwLAkJCQkJLyogc3FfYXNzX2l0ZW0gKi8KLQkwLAkJCQkJLyogc3FfYXNzX3NsaWNlICovCi0JKG9iam9ianByb2MpdHVwbGVjb250YWlucywJCS8qIHNxX2NvbnRhaW5zICovCisgICAgKGxlbmZ1bmMpdHVwbGVsZW5ndGgsICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9sZW5ndGggKi8KKyAgICAoYmluYXJ5ZnVuYyl0dXBsZWNvbmNhdCwgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbmNhdCAqLworICAgIChzc2l6ZWFyZ2Z1bmMpdHVwbGVyZXBlYXQsICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0ICovCisgICAgKHNzaXplYXJnZnVuYyl0dXBsZWl0ZW0sICAgICAgICAgICAgICAgICAgICAvKiBzcV9pdGVtICovCisgICAgKHNzaXplc3NpemVhcmdmdW5jKXR1cGxlc2xpY2UsICAgICAgICAgICAgICAvKiBzcV9zbGljZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIChvYmpvYmpwcm9jKXR1cGxlY29udGFpbnMsICAgICAgICAgICAgICAgICAgLyogc3FfY29udGFpbnMgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCoKIHR1cGxlc3Vic2NyaXB0KFB5VHVwbGVPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBpdGVtKQogewotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoaSA8IDApCi0JCQlpICs9IFB5VHVwbGVfR0VUX1NJWkUoc2VsZik7Ci0JCXJldHVybiB0dXBsZWl0ZW0oc2VsZiwgaSk7Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIGN1ciwgaTsKLQkJUHlPYmplY3QqIHJlc3VsdDsKLQkJUHlPYmplY3QqIGl0OwotCQlQeU9iamVjdCAqKnNyYywgKipkZXN0OworICAgIGlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKKyAgICAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IFB5VHVwbGVfR0VUX1NJWkUoc2VsZik7CisgICAgICAgIHJldHVybiB0dXBsZWl0ZW0oc2VsZiwgaSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIGN1ciwgaTsKKyAgICAgICAgUHlPYmplY3QqIHJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QqIGl0OworICAgICAgICBQeU9iamVjdCAqKnNyYywgKipkZXN0OwogCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwKLQkJCQkgUHlUdXBsZV9HRVRfU0laRShzZWxmKSwKLQkJCQkgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfU0laRShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJaWYgKHNsaWNlbGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBQeVR1cGxlX05ldygwKTsKLQkJfQotCQllbHNlIGlmIChzdGFydCA9PSAwICYmIHN0ZXAgPT0gMSAmJgotCQkJIHNsaWNlbGVuZ3RoID09IFB5VHVwbGVfR0VUX1NJWkUoc2VsZikgJiYKLQkJCSBQeVR1cGxlX0NoZWNrRXhhY3Qoc2VsZikpIHsKLQkJCVB5X0lOQ1JFRihzZWxmKTsKLQkJCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcoc2xpY2VsZW5ndGgpOwotCQkJaWYgKCFyZXN1bHQpIHJldHVybiBOVUxMOworICAgICAgICBpZiAoc2xpY2VsZW5ndGggPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFB5VHVwbGVfTmV3KDApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0YXJ0ID09IDAgJiYgc3RlcCA9PSAxICYmCisgICAgICAgICAgICAgICAgIHNsaWNlbGVuZ3RoID09IFB5VHVwbGVfR0VUX1NJWkUoc2VsZikgJiYKKyAgICAgICAgICAgICAgICAgUHlUdXBsZV9DaGVja0V4YWN0KHNlbGYpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHNsaWNlbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gTlVMTDsKIAotCQkJc3JjID0gc2VsZi0+b2JfaXRlbTsKLQkJCWRlc3QgPSAoKFB5VHVwbGVPYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtOwotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsgCi0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlpdCA9IHNyY1tjdXJdOwotCQkJCVB5X0lOQ1JFRihpdCk7Ci0JCQkJZGVzdFtpXSA9IGl0OwotCQkJfQotCQkJCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCSAgICAgInR1cGxlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90ICUuMjAwcyIsCi0JCQkgICAgIFB5X1RZUEUoaXRlbSktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICBzcmMgPSBzZWxmLT5vYl9pdGVtOworICAgICAgICAgICAgZGVzdCA9ICgoUHlUdXBsZU9iamVjdCAqKXJlc3VsdCktPm9iX2l0ZW07CisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOworICAgICAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICAgICAgaXQgPSBzcmNbY3VyXTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBpdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ0dXBsZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShpdGVtKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlX2dldG5ld2FyZ3MoUHlUdXBsZU9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE4pIiwgdHVwbGVzbGljZSh2LCAwLCBQeV9TSVpFKHYpKSk7Ci0JCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihOKSIsIHR1cGxlc2xpY2UodiwgMCwgUHlfU0laRSh2KSkpOworCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZV9zaXplb2YoUHlUdXBsZU9iamVjdCAqc2VsZikKIHsKLQlQeV9zc2l6ZV90IHJlczsKKyAgICBQeV9zc2l6ZV90IHJlczsKIAotCXJlcyA9IFB5VHVwbGVfVHlwZS50cF9iYXNpY3NpemUgKyBQeV9TSVpFKHNlbGYpICogc2l6ZW9mKFB5T2JqZWN0ICopOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOworICAgIHJlcyA9IFB5VHVwbGVfVHlwZS50cF9iYXNpY3NpemUgKyBQeV9TSVpFKHNlbGYpICogc2l6ZW9mKFB5T2JqZWN0ICopOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOwogfQogCiBQeURvY19TVFJWQVIoaW5kZXhfZG9jLApAQCAtNzc4LDYyICs3NzgsNjIgQEAKICJULl9fc2l6ZW9mX18oKSAtLSBzaXplIG9mIFQgaW4gbWVtb3J5LCBpbiBieXRlcyIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgdHVwbGVfbWV0aG9kc1tdID0gewotCXsiX19nZXRuZXdhcmdzX18iLAkoUHlDRnVuY3Rpb24pdHVwbGVfZ2V0bmV3YXJncywJTUVUSF9OT0FSR1N9LAotCXsiX19zaXplb2ZfXyIsCShQeUNGdW5jdGlvbil0dXBsZV9zaXplb2YsIE1FVEhfTk9BUkdTLCBzaXplb2ZfZG9jfSwKLQl7ImluZGV4IiwJKFB5Q0Z1bmN0aW9uKXR1cGxlaW5kZXgsICBNRVRIX1ZBUkFSR1MsIGluZGV4X2RvY30sCi0JeyJjb3VudCIsCShQeUNGdW5jdGlvbil0dXBsZWNvdW50LCAgTUVUSF9PLCBjb3VudF9kb2N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2dldG5ld2FyZ3NfXyIsICAgICAgICAgIChQeUNGdW5jdGlvbil0dXBsZV9nZXRuZXdhcmdzLCAgTUVUSF9OT0FSR1N9LAorICAgIHsiX19zaXplb2ZfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKXR1cGxlX3NpemVvZiwgTUVUSF9OT0FSR1MsIHNpemVvZl9kb2N9LAorICAgIHsiaW5kZXgiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXR1cGxlaW5kZXgsICBNRVRIX1ZBUkFSR1MsIGluZGV4X2RvY30sCisgICAgeyJjb3VudCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pdHVwbGVjb3VudCwgIE1FVEhfTywgY291bnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgdHVwbGVfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYyl0dXBsZWxlbmd0aCwKLQkoYmluYXJ5ZnVuYyl0dXBsZXN1YnNjcmlwdCwKLQkwCisgICAgKGxlbmZ1bmMpdHVwbGVsZW5ndGgsCisgICAgKGJpbmFyeWZ1bmMpdHVwbGVzdWJzY3JpcHQsCisgICAgMAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICp0dXBsZV9pdGVyKFB5T2JqZWN0ICpzZXEpOwogCiBQeVR5cGVPYmplY3QgUHlUdXBsZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInR1cGxlIiwKLQlzaXplb2YoUHlUdXBsZU9iamVjdCkgLSBzaXplb2YoUHlPYmplY3QgKiksCi0Jc2l6ZW9mKFB5T2JqZWN0ICopLAotCShkZXN0cnVjdG9yKXR1cGxlZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKXR1cGxlcHJpbnQsCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpdHVwbGVyZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJnR1cGxlX2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JJnR1cGxlX2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYyl0dXBsZWhhc2gsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfVFVQTEVfU1VCQ0xBU1MsIC8qIHRwX2ZsYWdzICovCi0JdHVwbGVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYyl0dXBsZXRyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQl0dXBsZXJpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JdHVwbGVfaXRlciwJICAgIAkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQl0dXBsZV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCXR1cGxlX25ldywJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLCAgICAgICAgCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAidHVwbGUiLAorICAgIHNpemVvZihQeVR1cGxlT2JqZWN0KSAtIHNpemVvZihQeU9iamVjdCAqKSwKKyAgICBzaXplb2YoUHlPYmplY3QgKiksCisgICAgKGRlc3RydWN0b3IpdHVwbGVkZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKHByaW50ZnVuYyl0dXBsZXByaW50LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyl0dXBsZXJlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJnR1cGxlX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICZ0dXBsZV9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYyl0dXBsZWhhc2gsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX1RVUExFX1NVQkNMQVNTLCAvKiB0cF9mbGFncyAqLworICAgIHR1cGxlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyl0dXBsZXRyYXZlcnNlLCAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICB0dXBsZXJpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIHR1cGxlX2l0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICB0dXBsZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgdHVwbGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gYnJlYWtzIHRoZSBub3Rpb24gdGhhdCB0dXBsZXMgYXJlIGltbXV0YWJsZToKQEAgLTg0NiwyMDcgKzg0NiwyMDcgQEAKIGludAogX1B5VHVwbGVfUmVzaXplKFB5T2JqZWN0ICoqcHYsIFB5X3NzaXplX3QgbmV3c2l6ZSkKIHsKLQlyZWdpc3RlciBQeVR1cGxlT2JqZWN0ICp2OwotCXJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKnN2OwotCVB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IG9sZHNpemU7CisgICAgcmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqdjsKKyAgICByZWdpc3RlciBQeVR1cGxlT2JqZWN0ICpzdjsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBvbGRzaXplOwogCi0JdiA9IChQeVR1cGxlT2JqZWN0ICopICpwdjsKLQlpZiAodiA9PSBOVUxMIHx8IFB5X1RZUEUodikgIT0gJlB5VHVwbGVfVHlwZSB8fAotCSAgICAoUHlfU0laRSh2KSAhPSAwICYmIFB5X1JFRkNOVCh2KSAhPSAxKSkgewotCQkqcHYgPSAwOwotCQlQeV9YREVDUkVGKHYpOwotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlvbGRzaXplID0gUHlfU0laRSh2KTsKLQlpZiAob2xkc2l6ZSA9PSBuZXdzaXplKQotCQlyZXR1cm4gMDsKKyAgICB2ID0gKFB5VHVwbGVPYmplY3QgKikgKnB2OworICAgIGlmICh2ID09IE5VTEwgfHwgUHlfVFlQRSh2KSAhPSAmUHlUdXBsZV9UeXBlIHx8CisgICAgICAgIChQeV9TSVpFKHYpICE9IDAgJiYgUHlfUkVGQ05UKHYpICE9IDEpKSB7CisgICAgICAgICpwdiA9IDA7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG9sZHNpemUgPSBQeV9TSVpFKHYpOworICAgIGlmIChvbGRzaXplID09IG5ld3NpemUpCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKG9sZHNpemUgPT0gMCkgewotCQkvKiBFbXB0eSB0dXBsZXMgYXJlIG9mdGVuIHNoYXJlZCwgc28gd2Ugc2hvdWxkIG5ldmVyIAotCQkgICByZXNpemUgdGhlbSBpbi1wbGFjZSBldmVuIGlmIHdlIGRvIG93biB0aGUgb25seQotCQkgICAoY3VycmVudCkgcmVmZXJlbmNlICovCi0JCVB5X0RFQ1JFRih2KTsKLQkJKnB2ID0gUHlUdXBsZV9OZXcobmV3c2l6ZSk7Ci0JCXJldHVybiAqcHYgPT0gTlVMTCA/IC0xIDogMDsKLQl9CisgICAgaWYgKG9sZHNpemUgPT0gMCkgeworICAgICAgICAvKiBFbXB0eSB0dXBsZXMgYXJlIG9mdGVuIHNoYXJlZCwgc28gd2Ugc2hvdWxkIG5ldmVyCisgICAgICAgICAgIHJlc2l6ZSB0aGVtIGluLXBsYWNlIGV2ZW4gaWYgd2UgZG8gb3duIHRoZSBvbmx5CisgICAgICAgICAgIChjdXJyZW50KSByZWZlcmVuY2UgKi8KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAqcHYgPSBQeVR1cGxlX05ldyhuZXdzaXplKTsKKyAgICAgICAgcmV0dXJuICpwdiA9PSBOVUxMID8gLTEgOiAwOworICAgIH0KIAotCS8qIFhYWCBVTlJFRi9ORVdSRUYgaW50ZXJmYWNlIHNob3VsZCBiZSBtb3JlIHN5bW1ldHJpY2FsICovCi0JX1B5X0RFQ19SRUZUT1RBTDsKLQlpZiAoX1B5T2JqZWN0X0dDX0lTX1RSQUNLRUQodikpCi0JCV9QeU9iamVjdF9HQ19VTlRSQUNLKHYpOwotCV9QeV9Gb3JnZXRSZWZlcmVuY2UoKFB5T2JqZWN0ICopIHYpOwotCS8qIERFQ1JFRiBpdGVtcyBkZWxldGVkIGJ5IHNocmlua2FnZSAqLwotCWZvciAoaSA9IG5ld3NpemU7IGkgPCBvbGRzaXplOyBpKyspIHsKLQkJUHlfWERFQ1JFRih2LT5vYl9pdGVtW2ldKTsKLQkJdi0+b2JfaXRlbVtpXSA9IE5VTEw7Ci0JfQotCXN2ID0gUHlPYmplY3RfR0NfUmVzaXplKFB5VHVwbGVPYmplY3QsIHYsIG5ld3NpemUpOwotCWlmIChzdiA9PSBOVUxMKSB7Ci0JCSpwdiA9IE5VTEw7Ci0JCVB5T2JqZWN0X0dDX0RlbCh2KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKSBzdik7Ci0JLyogWmVybyBvdXQgaXRlbXMgYWRkZWQgYnkgZ3Jvd2luZyAqLwotCWlmIChuZXdzaXplID4gb2xkc2l6ZSkKLQkJbWVtc2V0KCZzdi0+b2JfaXRlbVtvbGRzaXplXSwgMCwKLQkJICAgICAgIHNpemVvZigqc3YtPm9iX2l0ZW0pICogKG5ld3NpemUgLSBvbGRzaXplKSk7Ci0JKnB2ID0gKFB5T2JqZWN0ICopIHN2OwotCV9QeU9iamVjdF9HQ19UUkFDSyhzdik7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYIFVOUkVGL05FV1JFRiBpbnRlcmZhY2Ugc2hvdWxkIGJlIG1vcmUgc3ltbWV0cmljYWwgKi8KKyAgICBfUHlfREVDX1JFRlRPVEFMOworICAgIGlmIChfUHlPYmplY3RfR0NfSVNfVFJBQ0tFRCh2KSkKKyAgICAgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0sodik7CisgICAgX1B5X0ZvcmdldFJlZmVyZW5jZSgoUHlPYmplY3QgKikgdik7CisgICAgLyogREVDUkVGIGl0ZW1zIGRlbGV0ZWQgYnkgc2hyaW5rYWdlICovCisgICAgZm9yIChpID0gbmV3c2l6ZTsgaSA8IG9sZHNpemU7IGkrKykgeworICAgICAgICBQeV9YREVDUkVGKHYtPm9iX2l0ZW1baV0pOworICAgICAgICB2LT5vYl9pdGVtW2ldID0gTlVMTDsKKyAgICB9CisgICAgc3YgPSBQeU9iamVjdF9HQ19SZXNpemUoUHlUdXBsZU9iamVjdCwgdiwgbmV3c2l6ZSk7CisgICAgaWYgKHN2ID09IE5VTEwpIHsKKyAgICAgICAgKnB2ID0gTlVMTDsKKyAgICAgICAgUHlPYmplY3RfR0NfRGVsKHYpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopIHN2KTsKKyAgICAvKiBaZXJvIG91dCBpdGVtcyBhZGRlZCBieSBncm93aW5nICovCisgICAgaWYgKG5ld3NpemUgPiBvbGRzaXplKQorICAgICAgICBtZW1zZXQoJnN2LT5vYl9pdGVtW29sZHNpemVdLCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKCpzdi0+b2JfaXRlbSkgKiAobmV3c2l6ZSAtIG9sZHNpemUpKTsKKyAgICAqcHYgPSAoUHlPYmplY3QgKikgc3Y7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKHN2KTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeVR1cGxlX0NsZWFyRnJlZUxpc3Qodm9pZCkKIHsKLQlpbnQgZnJlZWxpc3Rfc2l6ZSA9IDA7CisgICAgaW50IGZyZWVsaXN0X3NpemUgPSAwOwogI2lmIFB5VHVwbGVfTUFYU0FWRVNJWkUgPiAwCi0JaW50IGk7Ci0JZm9yIChpID0gMTsgaSA8IFB5VHVwbGVfTUFYU0FWRVNJWkU7IGkrKykgewotCQlQeVR1cGxlT2JqZWN0ICpwLCAqcTsKLQkJcCA9IGZyZWVfbGlzdFtpXTsKLQkJZnJlZWxpc3Rfc2l6ZSArPSBudW1mcmVlW2ldOwotCQlmcmVlX2xpc3RbaV0gPSBOVUxMOwotCQludW1mcmVlW2ldID0gMDsKLQkJd2hpbGUgKHApIHsKLQkJCXEgPSBwOwotCQkJcCA9IChQeVR1cGxlT2JqZWN0ICopKHAtPm9iX2l0ZW1bMF0pOwotCQkJUHlPYmplY3RfR0NfRGVsKHEpOwotCQl9Ci0JfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDE7IGkgPCBQeVR1cGxlX01BWFNBVkVTSVpFOyBpKyspIHsKKyAgICAgICAgUHlUdXBsZU9iamVjdCAqcCwgKnE7CisgICAgICAgIHAgPSBmcmVlX2xpc3RbaV07CisgICAgICAgIGZyZWVsaXN0X3NpemUgKz0gbnVtZnJlZVtpXTsKKyAgICAgICAgZnJlZV9saXN0W2ldID0gTlVMTDsKKyAgICAgICAgbnVtZnJlZVtpXSA9IDA7CisgICAgICAgIHdoaWxlIChwKSB7CisgICAgICAgICAgICBxID0gcDsKKyAgICAgICAgICAgIHAgPSAoUHlUdXBsZU9iamVjdCAqKShwLT5vYl9pdGVtWzBdKTsKKyAgICAgICAgICAgIFB5T2JqZWN0X0dDX0RlbChxKTsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgotCXJldHVybiBmcmVlbGlzdF9zaXplOworICAgIHJldHVybiBmcmVlbGlzdF9zaXplOwogfQotCQorCiB2b2lkCiBQeVR1cGxlX0Zpbmkodm9pZCkKIHsKICNpZiBQeVR1cGxlX01BWFNBVkVTSVpFID4gMAotCS8qIGVtcHR5IHR1cGxlcyBhcmUgdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UgYW5kIGFwcGxpY2F0aW9ucyBtYXkKLQkgKiByZWx5IG9uIHRoZSBmYWN0IHRoYXQgYW4gZW1wdHkgdHVwbGUgaXMgYSBzaW5nbGV0b24uICovCi0JUHlfWERFQ1JFRihmcmVlX2xpc3RbMF0pOwotCWZyZWVfbGlzdFswXSA9IE5VTEw7CisgICAgLyogZW1wdHkgdHVwbGVzIGFyZSB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZSBhbmQgYXBwbGljYXRpb25zIG1heQorICAgICAqIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBhbiBlbXB0eSB0dXBsZSBpcyBhIHNpbmdsZXRvbi4gKi8KKyAgICBQeV9YREVDUkVGKGZyZWVfbGlzdFswXSk7CisgICAgZnJlZV9saXN0WzBdID0gTlVMTDsKIAotCSh2b2lkKVB5VHVwbGVfQ2xlYXJGcmVlTGlzdCgpOworICAgICh2b2lkKVB5VHVwbGVfQ2xlYXJGcmVlTGlzdCgpOwogI2VuZGlmCiAjaWZkZWYgU0hPV19UUkFDS19DT1VOVAotCXNob3dfdHJhY2soKTsKKyAgICBzaG93X3RyYWNrKCk7CiAjZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqIFR1cGxlIEl0ZXJhdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWxvbmcgaXRfaW5kZXg7Ci0JUHlUdXBsZU9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBsb25nIGl0X2luZGV4OworICAgIFB5VHVwbGVPYmplY3QgKml0X3NlcTsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gdHVwbGVpdGVyb2JqZWN0OwogCiBzdGF0aWMgdm9pZAogdHVwbGVpdGVyX2RlYWxsb2ModHVwbGVpdGVyb2JqZWN0ICppdCkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhpdCk7Ci0JUHlfWERFQ1JFRihpdC0+aXRfc2VxKTsKLQlQeU9iamVjdF9HQ19EZWwoaXQpOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKGl0KTsKKyAgICBQeV9YREVDUkVGKGl0LT5pdF9zZXEpOworICAgIFB5T2JqZWN0X0dDX0RlbChpdCk7CiB9CiAKIHN0YXRpYyBpbnQKIHR1cGxlaXRlcl90cmF2ZXJzZSh0dXBsZWl0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpdC0+aXRfc2VxKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpdC0+aXRfc2VxKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlaXRlcl9uZXh0KHR1cGxlaXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlUdXBsZU9iamVjdCAqc2VxOwotCVB5T2JqZWN0ICppdGVtOworICAgIFB5VHVwbGVPYmplY3QgKnNlcTsKKyAgICBQeU9iamVjdCAqaXRlbTsKIAotCWFzc2VydChpdCAhPSBOVUxMKTsKLQlzZXEgPSBpdC0+aXRfc2VxOwotCWlmIChzZXEgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2soc2VxKSk7CisgICAgYXNzZXJ0KGl0ICE9IE5VTEwpOworICAgIHNlcSA9IGl0LT5pdF9zZXE7CisgICAgaWYgKHNlcSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhzZXEpKTsKIAotCWlmIChpdC0+aXRfaW5kZXggPCBQeVR1cGxlX0dFVF9TSVpFKHNlcSkpIHsKLQkJaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oc2VxLCBpdC0+aXRfaW5kZXgpOwotCQkrK2l0LT5pdF9pbmRleDsKLQkJUHlfSU5DUkVGKGl0ZW0pOwotCQlyZXR1cm4gaXRlbTsKLQl9CisgICAgaWYgKGl0LT5pdF9pbmRleCA8IFB5VHVwbGVfR0VUX1NJWkUoc2VxKSkgeworICAgICAgICBpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShzZXEsIGl0LT5pdF9pbmRleCk7CisgICAgICAgICsraXQtPml0X2luZGV4OworICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KIAotCVB5X0RFQ1JFRihzZXEpOwotCWl0LT5pdF9zZXEgPSBOVUxMOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihzZXEpOworICAgIGl0LT5pdF9zZXEgPSBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHVwbGVpdGVyX2xlbih0dXBsZWl0ZXJvYmplY3QgKml0KQogewotCVB5X3NzaXplX3QgbGVuID0gMDsKLQlpZiAoaXQtPml0X3NlcSkKLQkJbGVuID0gUHlUdXBsZV9HRVRfU0laRShpdC0+aXRfc2VxKSAtIGl0LT5pdF9pbmRleDsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QobGVuKTsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IDA7CisgICAgaWYgKGl0LT5pdF9zZXEpCisgICAgICAgIGxlbiA9IFB5VHVwbGVfR0VUX1NJWkUoaXQtPml0X3NlcSkgLSBpdC0+aXRfaW5kZXg7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGxlbik7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHR1cGxlaXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pdHVwbGVpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pdHVwbGVpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeVR1cGxlSXRlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInR1cGxlaXRlcmF0b3IiLAkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YodHVwbGVpdGVyb2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcil0dXBsZWl0ZXJfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYyl0dXBsZWl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpdHVwbGVpdGVyX25leHQsCQkvKiB0cF9pdGVybmV4dCAqLwotCXR1cGxlaXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAorICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInR1cGxlaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHR1cGxlaXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXR1cGxlaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpdHVwbGVpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXR1cGxlaXRlcl9uZXh0LCAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgdHVwbGVpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZV9pdGVyKFB5T2JqZWN0ICpzZXEpCiB7Ci0JdHVwbGVpdGVyb2JqZWN0ICppdDsKKyAgICB0dXBsZWl0ZXJvYmplY3QgKml0OwogCi0JaWYgKCFQeVR1cGxlX0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X0dDX05ldyh0dXBsZWl0ZXJvYmplY3QsICZQeVR1cGxlSXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXQtPml0X2luZGV4ID0gMDsKLQlQeV9JTkNSRUYoc2VxKTsKLQlpdC0+aXRfc2VxID0gKFB5VHVwbGVPYmplY3QgKilzZXE7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHNlcSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X0dDX05ldyh0dXBsZWl0ZXJvYmplY3QsICZQeVR1cGxlSXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPml0X2luZGV4ID0gMDsKKyAgICBQeV9JTkNSRUYoc2VxKTsKKyAgICBpdC0+aXRfc2VxID0gKFB5VHVwbGVPYmplY3QgKilzZXE7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3R5cGVvYmplY3QuYyBiL09iamVjdHMvdHlwZW9iamVjdC5jCmluZGV4IGUzNDczMjguLmM0YjlkYmYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvdHlwZW9iamVjdC5jCisrKyBiL09iamVjdHMvdHlwZW9iamVjdC5jCkBAIC0xMiwyMiArMTIsMjIgQEAKICAgIHRoZXkgbm9ybWFsbHkgd291bGQuICBUaGlzIGlzIHdoeSB0aGUgbWF4aW11bSBzaXplIGlzIGxpbWl0ZWQgdG8KICAgIE1DQUNIRV9NQVhfQVRUUl9TSVpFLCBzaW5jZSBpdCBtaWdodCBiZSBhIHByb2JsZW0gaWYgdmVyeSBsYXJnZQogICAgc3RyaW5ncyBhcmUgdXNlZCBhcyBhdHRyaWJ1dGUgbmFtZXMuICovCi0jZGVmaW5lIE1DQUNIRV9NQVhfQVRUUl9TSVpFCTEwMAotI2RlZmluZSBNQ0FDSEVfU0laRV9FWFAJCTEwCi0jZGVmaW5lIE1DQUNIRV9IQVNIKHZlcnNpb24sIG5hbWVfaGFzaCkJCQkJCVwKLQkJKCgodW5zaWduZWQgaW50KSh2ZXJzaW9uKSAqICh1bnNpZ25lZCBpbnQpKG5hbWVfaGFzaCkpCVwKLQkJID4+ICg4KnNpemVvZih1bnNpZ25lZCBpbnQpIC0gTUNBQ0hFX1NJWkVfRVhQKSkKKyNkZWZpbmUgTUNBQ0hFX01BWF9BVFRSX1NJWkUgICAgMTAwCisjZGVmaW5lIE1DQUNIRV9TSVpFX0VYUCAgICAgICAgIDEwCisjZGVmaW5lIE1DQUNIRV9IQVNIKHZlcnNpb24sIG5hbWVfaGFzaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKHVuc2lnbmVkIGludCkodmVyc2lvbikgKiAodW5zaWduZWQgaW50KShuYW1lX2hhc2gpKSAgICAgICAgICBcCisgICAgICAgICA+PiAoOCpzaXplb2YodW5zaWduZWQgaW50KSAtIE1DQUNIRV9TSVpFX0VYUCkpCiAjZGVmaW5lIE1DQUNIRV9IQVNIX01FVEhPRCh0eXBlLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU1DQUNIRV9IQVNIKCh0eXBlKS0+dHBfdmVyc2lvbl90YWcsICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgICAgICAgICAoKFB5U3RyaW5nT2JqZWN0ICopKG5hbWUpKS0+b2Jfc2hhc2gpCisgICAgICAgIE1DQUNIRV9IQVNIKCh0eXBlKS0+dHBfdmVyc2lvbl90YWcsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoKFB5U3RyaW5nT2JqZWN0ICopKG5hbWUpKS0+b2Jfc2hhc2gpCiAjZGVmaW5lIE1DQUNIRV9DQUNIRUFCTEVfTkFNRShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCVB5U3RyaW5nX0NoZWNrRXhhY3QobmFtZSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlQeVN0cmluZ19HRVRfU0laRShuYW1lKSA8PSBNQ0FDSEVfTUFYX0FUVFJfU0laRQorICAgICAgICBQeVN0cmluZ19DaGVja0V4YWN0KG5hbWUpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUobmFtZSkgPD0gTUNBQ0hFX01BWF9BVFRSX1NJWkUKIAogc3RydWN0IG1ldGhvZF9jYWNoZV9lbnRyeSB7Ci0JdW5zaWduZWQgaW50IHZlcnNpb247Ci0JUHlPYmplY3QgKm5hbWU7CQkvKiByZWZlcmVuY2UgdG8gZXhhY3RseSBhIHN0ciBvciBOb25lICovCi0JUHlPYmplY3QgKnZhbHVlOwkvKiBib3Jyb3dlZCAqLworICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uOworICAgIFB5T2JqZWN0ICpuYW1lOyAgICAgICAgICAgICAvKiByZWZlcmVuY2UgdG8gZXhhY3RseSBhIHN0ciBvciBOb25lICovCisgICAgUHlPYmplY3QgKnZhbHVlOyAgICAgICAgICAgIC8qIGJvcnJvd2VkICovCiB9OwogCiBzdGF0aWMgc3RydWN0IG1ldGhvZF9jYWNoZV9lbnRyeSBtZXRob2RfY2FjaGVbMSA8PCBNQ0FDSEVfU0laRV9FWFBdOwpAQCAtMzYsMzEzICszNiwzMTMgQEAKIHVuc2lnbmVkIGludAogUHlUeXBlX0NsZWFyQ2FjaGUodm9pZCkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JdW5zaWduZWQgaW50IGN1cl92ZXJzaW9uX3RhZyA9IG5leHRfdmVyc2lvbl90YWcgLSAxOworICAgIFB5X3NzaXplX3QgaTsKKyAgICB1bnNpZ25lZCBpbnQgY3VyX3ZlcnNpb25fdGFnID0gbmV4dF92ZXJzaW9uX3RhZyAtIDE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgTUNBQ0hFX1NJWkVfRVhQKTsgaSsrKSB7Ci0JCW1ldGhvZF9jYWNoZVtpXS52ZXJzaW9uID0gMDsKLQkJUHlfQ0xFQVIobWV0aG9kX2NhY2hlW2ldLm5hbWUpOwotCQltZXRob2RfY2FjaGVbaV0udmFsdWUgPSBOVUxMOwotCX0KLQluZXh0X3ZlcnNpb25fdGFnID0gMDsKLQkvKiBtYXJrIGFsbCB2ZXJzaW9uIHRhZ3MgYXMgaW52YWxpZCAqLwotCVB5VHlwZV9Nb2RpZmllZCgmUHlCYXNlT2JqZWN0X1R5cGUpOwotCXJldHVybiBjdXJfdmVyc2lvbl90YWc7CisgICAgZm9yIChpID0gMDsgaSA8ICgxIDw8IE1DQUNIRV9TSVpFX0VYUCk7IGkrKykgeworICAgICAgICBtZXRob2RfY2FjaGVbaV0udmVyc2lvbiA9IDA7CisgICAgICAgIFB5X0NMRUFSKG1ldGhvZF9jYWNoZVtpXS5uYW1lKTsKKyAgICAgICAgbWV0aG9kX2NhY2hlW2ldLnZhbHVlID0gTlVMTDsKKyAgICB9CisgICAgbmV4dF92ZXJzaW9uX3RhZyA9IDA7CisgICAgLyogbWFyayBhbGwgdmVyc2lvbiB0YWdzIGFzIGludmFsaWQgKi8KKyAgICBQeVR5cGVfTW9kaWZpZWQoJlB5QmFzZU9iamVjdF9UeXBlKTsKKyAgICByZXR1cm4gY3VyX3ZlcnNpb25fdGFnOwogfQogCiB2b2lkCiBQeVR5cGVfTW9kaWZpZWQoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCS8qIEludmFsaWRhdGUgYW55IGNhY2hlZCBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIGFsbAotCSAgIHN1YmNsYXNzZXMuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgYmFzZQotCSAgIGNsYXNzZXMsIG1ybywgb3IgYXR0cmlidXRlcyBvZiB0aGUgdHlwZSBhcmUgYWx0ZXJlZC4KKyAgICAvKiBJbnZhbGlkYXRlIGFueSBjYWNoZWQgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBhbGwKKyAgICAgICBzdWJjbGFzc2VzLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJhc2UKKyAgICAgICBjbGFzc2VzLCBtcm8sIG9yIGF0dHJpYnV0ZXMgb2YgdGhlIHR5cGUgYXJlIGFsdGVyZWQuCiAKLQkgICBJbnZhcmlhbnRzOgorICAgICAgIEludmFyaWFudHM6CiAKLQkgICAtIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcgaXMgbmV2ZXIgc2V0IGlmCi0JICAgICBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUcgaXMgbm90IHNldCAoZS5nLiBvbiB0eXBlCi0JICAgICBvYmplY3RzIGNvbWluZyBmcm9tIG5vbi1yZWNvbXBpbGVkIGV4dGVuc2lvbiBtb2R1bGVzKQorICAgICAgIC0gUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRyBpcyBuZXZlciBzZXQgaWYKKyAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBRyBpcyBub3Qgc2V0IChlLmcuIG9uIHR5cGUKKyAgICAgICAgIG9iamVjdHMgY29taW5nIGZyb20gbm9uLXJlY29tcGlsZWQgZXh0ZW5zaW9uIG1vZHVsZXMpCiAKLQkgICAtIGJlZm9yZSBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHIGNhbiBiZSBzZXQgb24gYSB0eXBlLAotCSAgICAgaXQgbXVzdCBmaXJzdCBiZSBzZXQgb24gYWxsIHN1cGVyIHR5cGVzLgorICAgICAgIC0gYmVmb3JlIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcgY2FuIGJlIHNldCBvbiBhIHR5cGUsCisgICAgICAgICBpdCBtdXN0IGZpcnN0IGJlIHNldCBvbiBhbGwgc3VwZXIgdHlwZXMuCiAKLQkgICBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRyBvZiBhCi0JICAgdHlwZSAoc28gaXQgbXVzdCBmaXJzdCBjbGVhciBpdCBvbiBhbGwgc3ViY2xhc3NlcykuICBUaGUKLQkgICB0cF92ZXJzaW9uX3RhZyB2YWx1ZSBpcyBtZWFuaW5nbGVzcyB1bmxlc3MgdGhpcyBmbGFnIGlzIHNldC4KLQkgICBXZSBkb24ndCBhc3NpZ24gbmV3IHZlcnNpb24gdGFncyBlYWdlcmx5LCBidXQgb25seSBhcwotCSAgIG5lZWRlZC4KLQkgKi8KLQlQeU9iamVjdCAqcmF3LCAqcmVmOwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICAgICBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRyBvZiBhCisgICAgICAgdHlwZSAoc28gaXQgbXVzdCBmaXJzdCBjbGVhciBpdCBvbiBhbGwgc3ViY2xhc3NlcykuICBUaGUKKyAgICAgICB0cF92ZXJzaW9uX3RhZyB2YWx1ZSBpcyBtZWFuaW5nbGVzcyB1bmxlc3MgdGhpcyBmbGFnIGlzIHNldC4KKyAgICAgICBXZSBkb24ndCBhc3NpZ24gbmV3IHZlcnNpb24gdGFncyBlYWdlcmx5LCBidXQgb25seSBhcworICAgICAgIG5lZWRlZC4KKyAgICAgKi8KKyAgICBQeU9iamVjdCAqcmF3LCAqcmVmOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRykpCi0JCXJldHVybjsKKyAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcpKQorICAgICAgICByZXR1cm47CiAKLQlyYXcgPSB0eXBlLT50cF9zdWJjbGFzc2VzOwotCWlmIChyYXcgIT0gTlVMTCkgewotCQluID0gUHlMaXN0X0dFVF9TSVpFKHJhdyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXJlZiA9IFB5TGlzdF9HRVRfSVRFTShyYXcsIGkpOwotCQkJcmVmID0gUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKTsKLQkJCWlmIChyZWYgIT0gUHlfTm9uZSkgewotCQkJCVB5VHlwZV9Nb2RpZmllZCgoUHlUeXBlT2JqZWN0ICopcmVmKTsKLQkJCX0KLQkJfQotCX0KLQl0eXBlLT50cF9mbGFncyAmPSB+UHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRzsKKyAgICByYXcgPSB0eXBlLT50cF9zdWJjbGFzc2VzOworICAgIGlmIChyYXcgIT0gTlVMTCkgeworICAgICAgICBuID0gUHlMaXN0X0dFVF9TSVpFKHJhdyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHJlZiA9IFB5TGlzdF9HRVRfSVRFTShyYXcsIGkpOworICAgICAgICAgICAgcmVmID0gUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKTsKKyAgICAgICAgICAgIGlmIChyZWYgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5VHlwZV9Nb2RpZmllZCgoUHlUeXBlT2JqZWN0ICopcmVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB0eXBlLT50cF9mbGFncyAmPSB+UHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRzsKIH0KIAogc3RhdGljIHZvaWQKIHR5cGVfbXJvX21vZGlmaWVkKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmJhc2VzKSB7Ci0JLyoKLQkgICBDaGVjayB0aGF0IGFsbCBiYXNlIGNsYXNzZXMgb3IgZWxlbWVudHMgb2YgdGhlIG1ybyBvZiB0eXBlIGFyZQotCSAgIGFibGUgdG8gYmUgY2FjaGVkLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJhc2UKLQkgICBjbGFzc2VzIG9yIG1ybyBvZiB0aGUgdHlwZSBhcmUgYWx0ZXJlZC4KKyAgICAvKgorICAgICAgIENoZWNrIHRoYXQgYWxsIGJhc2UgY2xhc3NlcyBvciBlbGVtZW50cyBvZiB0aGUgbXJvIG9mIHR5cGUgYXJlCisgICAgICAgYWJsZSB0byBiZSBjYWNoZWQuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgYmFzZQorICAgICAgIGNsYXNzZXMgb3IgbXJvIG9mIHRoZSB0eXBlIGFyZSBhbHRlcmVkLgogCi0JICAgVW5zZXQgSEFWRV9WRVJTSU9OX1RBRyBhbmQgVkFMSURfVkVSU0lPTl9UQUcgaWYgdGhlIHR5cGUKLQkgICBpbmhlcml0cyBmcm9tIGFuIG9sZC1zdHlsZSBjbGFzcywgZWl0aGVyIGRpcmVjdGx5IG9yIGlmIGl0Ci0JICAgYXBwZWFycyBpbiB0aGUgTVJPIG9mIGEgbmV3LXN0eWxlIGNsYXNzLiAgTm8gc3VwcG9ydCBlaXRoZXIgZm9yCi0JICAgY3VzdG9tIE1ST3MgdGhhdCBpbmNsdWRlIHR5cGVzIHRoYXQgYXJlIG5vdCBvZmZpY2lhbGx5IHN1cGVyCi0JICAgdHlwZXMuCisgICAgICAgVW5zZXQgSEFWRV9WRVJTSU9OX1RBRyBhbmQgVkFMSURfVkVSU0lPTl9UQUcgaWYgdGhlIHR5cGUKKyAgICAgICBpbmhlcml0cyBmcm9tIGFuIG9sZC1zdHlsZSBjbGFzcywgZWl0aGVyIGRpcmVjdGx5IG9yIGlmIGl0CisgICAgICAgYXBwZWFycyBpbiB0aGUgTVJPIG9mIGEgbmV3LXN0eWxlIGNsYXNzLiAgTm8gc3VwcG9ydCBlaXRoZXIgZm9yCisgICAgICAgY3VzdG9tIE1ST3MgdGhhdCBpbmNsdWRlIHR5cGVzIHRoYXQgYXJlIG5vdCBvZmZpY2lhbGx5IHN1cGVyCisgICAgICAgdHlwZXMuCiAKLQkgICBDYWxsZWQgZnJvbSBtcm9faW50ZXJuYWwsIHdoaWNoIHdpbGwgc3Vic2VxdWVudGx5IGJlIGNhbGxlZCBvbgotCSAgIGVhY2ggc3ViY2xhc3Mgd2hlbiB0aGVpciBtcm8gaXMgcmVjdXJzaXZlbHkgdXBkYXRlZC4KLQkgKi8KLQlQeV9zc2l6ZV90IGksIG47Ci0JaW50IGNsZWFyID0gMDsKKyAgICAgICBDYWxsZWQgZnJvbSBtcm9faW50ZXJuYWwsIHdoaWNoIHdpbGwgc3Vic2VxdWVudGx5IGJlIGNhbGxlZCBvbgorICAgICAgIGVhY2ggc3ViY2xhc3Mgd2hlbiB0aGVpciBtcm8gaXMgcmVjdXJzaXZlbHkgdXBkYXRlZC4KKyAgICAgKi8KKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgaW50IGNsZWFyID0gMDsKIAotCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKSkKLQkJcmV0dXJuOworICAgIGlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKSkKKyAgICAgICAgcmV0dXJuOwogCi0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKLQkJUHlUeXBlT2JqZWN0ICpjbHM7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgUHlUeXBlT2JqZWN0ICpjbHM7CiAKLQkJaWYgKCFQeVR5cGVfQ2hlY2soYikgKSB7Ci0JCQljbGVhciA9IDE7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICBpZiAoIVB5VHlwZV9DaGVjayhiKSApIHsKKyAgICAgICAgICAgIGNsZWFyID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJY2xzID0gKFB5VHlwZU9iamVjdCAqKWI7CisgICAgICAgIGNscyA9IChQeVR5cGVPYmplY3QgKiliOwogCi0JCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUoY2xzLCBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUcpIHx8Ci0JCSAgICAhUHlUeXBlX0lzU3VidHlwZSh0eXBlLCBjbHMpKSB7Ci0JCQljbGVhciA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KKyAgICAgICAgaWYgKCFQeVR5cGVfSGFzRmVhdHVyZShjbHMsIFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBRykgfHwKKyAgICAgICAgICAgICFQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsIGNscykpIHsKKyAgICAgICAgICAgIGNsZWFyID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGNsZWFyKQotCQl0eXBlLT50cF9mbGFncyAmPSB+KFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBR3wKLQkJICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHKTsKKyAgICBpZiAoY2xlYXIpCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzICY9IH4oUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcpOwogfQogCiBzdGF0aWMgaW50CiBhc3NpZ25fdmVyc2lvbl90YWcoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCS8qIEVuc3VyZSB0aGF0IHRoZSB0cF92ZXJzaW9uX3RhZyBpcyB2YWxpZCBhbmQgc2V0Ci0JICAgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRy4gIFRvIHJlc3BlY3QgdGhlIGludmFyaWFudCwgdGhpcwotCSAgIG11c3QgZmlyc3QgYmUgZG9uZSBvbiBhbGwgc3VwZXIgY2xhc3Nlcy4gIFJldHVybiAwIGlmIHRoaXMKLQkgICBjYW5ub3QgYmUgZG9uZSwgMSBpZiBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHLgotCSovCi0JUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICpiYXNlczsKKyAgICAvKiBFbnN1cmUgdGhhdCB0aGUgdHBfdmVyc2lvbl90YWcgaXMgdmFsaWQgYW5kIHNldAorICAgICAgIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcuICBUbyByZXNwZWN0IHRoZSBpbnZhcmlhbnQsIHRoaXMKKyAgICAgICBtdXN0IGZpcnN0IGJlIGRvbmUgb24gYWxsIHN1cGVyIGNsYXNzZXMuICBSZXR1cm4gMCBpZiB0aGlzCisgICAgICAgY2Fubm90IGJlIGRvbmUsIDEgaWYgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRy4KKyAgICAqLworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqYmFzZXM7CiAKLQlpZiAoUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRykpCi0JCXJldHVybiAxOwotCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX1JFQURZKSkKLQkJcmV0dXJuIDA7CisgICAgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBRykpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19SRUFEWSkpCisgICAgICAgIHJldHVybiAwOwogCi0JdHlwZS0+dHBfdmVyc2lvbl90YWcgPSBuZXh0X3ZlcnNpb25fdGFnKys7Ci0JLyogZm9yIHN0cmVzcy10ZXN0aW5nOiBuZXh0X3ZlcnNpb25fdGFnICY9IDB4RkY7ICovCisgICAgdHlwZS0+dHBfdmVyc2lvbl90YWcgPSBuZXh0X3ZlcnNpb25fdGFnKys7CisgICAgLyogZm9yIHN0cmVzcy10ZXN0aW5nOiBuZXh0X3ZlcnNpb25fdGFnICY9IDB4RkY7ICovCiAKLQlpZiAodHlwZS0+dHBfdmVyc2lvbl90YWcgPT0gMCkgewotCQkvKiB3cmFwLWFyb3VuZCBvciBqdXN0IHN0YXJ0aW5nIFB5dGhvbiAtIGNsZWFyIHRoZSB3aG9sZQotCQkgICBjYWNoZSBieSBmaWxsaW5nIG5hbWVzIHdpdGggcmVmZXJlbmNlcyB0byBQeV9Ob25lLgotCQkgICBWYWx1ZXMgYXJlIGFsc28gc2V0IHRvIE5VTEwgZm9yIGFkZGVkIHByb3RlY3Rpb24sIGFzIHRoZXkKLQkJICAgYXJlIGJvcnJvd2VkIHJlZmVyZW5jZSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgTUNBQ0hFX1NJWkVfRVhQKTsgaSsrKSB7Ci0JCQltZXRob2RfY2FjaGVbaV0udmFsdWUgPSBOVUxMOwotCQkJUHlfWERFQ1JFRihtZXRob2RfY2FjaGVbaV0ubmFtZSk7Ci0JCQltZXRob2RfY2FjaGVbaV0ubmFtZSA9IFB5X05vbmU7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCX0KLQkJLyogbWFyayBhbGwgdmVyc2lvbiB0YWdzIGFzIGludmFsaWQgKi8KLQkJUHlUeXBlX01vZGlmaWVkKCZQeUJhc2VPYmplY3RfVHlwZSk7Ci0JCXJldHVybiAxOwotCX0KLQliYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpiID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCWFzc2VydChQeVR5cGVfQ2hlY2soYikpOwotCQlpZiAoIWFzc2lnbl92ZXJzaW9uX3RhZygoUHlUeXBlT2JqZWN0ICopYikpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRzsKLQlyZXR1cm4gMTsKKyAgICBpZiAodHlwZS0+dHBfdmVyc2lvbl90YWcgPT0gMCkgeworICAgICAgICAvKiB3cmFwLWFyb3VuZCBvciBqdXN0IHN0YXJ0aW5nIFB5dGhvbiAtIGNsZWFyIHRoZSB3aG9sZQorICAgICAgICAgICBjYWNoZSBieSBmaWxsaW5nIG5hbWVzIHdpdGggcmVmZXJlbmNlcyB0byBQeV9Ob25lLgorICAgICAgICAgICBWYWx1ZXMgYXJlIGFsc28gc2V0IHRvIE5VTEwgZm9yIGFkZGVkIHByb3RlY3Rpb24sIGFzIHRoZXkKKyAgICAgICAgICAgYXJlIGJvcnJvd2VkIHJlZmVyZW5jZSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKDEgPDwgTUNBQ0hFX1NJWkVfRVhQKTsgaSsrKSB7CisgICAgICAgICAgICBtZXRob2RfY2FjaGVbaV0udmFsdWUgPSBOVUxMOworICAgICAgICAgICAgUHlfWERFQ1JFRihtZXRob2RfY2FjaGVbaV0ubmFtZSk7CisgICAgICAgICAgICBtZXRob2RfY2FjaGVbaV0ubmFtZSA9IFB5X05vbmU7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIH0KKyAgICAgICAgLyogbWFyayBhbGwgdmVyc2lvbiB0YWdzIGFzIGludmFsaWQgKi8KKyAgICAgICAgUHlUeXBlX01vZGlmaWVkKCZQeUJhc2VPYmplY3RfVHlwZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBiYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOworICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpiID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7CisgICAgICAgIGFzc2VydChQeVR5cGVfQ2hlY2soYikpOworICAgICAgICBpZiAoIWFzc2lnbl92ZXJzaW9uX3RhZygoUHlUeXBlT2JqZWN0ICopYikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRzsKKyAgICByZXR1cm4gMTsKIH0KIAogCiBzdGF0aWMgUHlNZW1iZXJEZWYgdHlwZV9tZW1iZXJzW10gPSB7Ci0JeyJfX2Jhc2ljc2l6ZV9fIiwgVF9JTlQsIG9mZnNldG9mKFB5VHlwZU9iamVjdCx0cF9iYXNpY3NpemUpLFJFQURPTkxZfSwKLQl7Il9faXRlbXNpemVfXyIsIFRfSU5ULCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2l0ZW1zaXplKSwgUkVBRE9OTFl9LAotCXsiX19mbGFnc19fIiwgVF9MT05HLCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2ZsYWdzKSwgUkVBRE9OTFl9LAotCXsiX193ZWFrcmVmb2Zmc2V0X18iLCBUX0xPTkcsCi0JIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfd2Vha2xpc3RvZmZzZXQpLCBSRUFET05MWX0sCi0JeyJfX2Jhc2VfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2Jhc2UpLCBSRUFET05MWX0sCi0JeyJfX2RpY3RvZmZzZXRfXyIsIFRfTE9ORywKLQkgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF9kaWN0b2Zmc2V0KSwgUkVBRE9OTFl9LAotCXsiX19tcm9fXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX21ybyksIFJFQURPTkxZfSwKLQl7MH0KKyAgICB7Il9fYmFzaWNzaXplX18iLCBUX0lOVCwgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LHRwX2Jhc2ljc2l6ZSksUkVBRE9OTFl9LAorICAgIHsiX19pdGVtc2l6ZV9fIiwgVF9JTlQsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfaXRlbXNpemUpLCBSRUFET05MWX0sCisgICAgeyJfX2ZsYWdzX18iLCBUX0xPTkcsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfZmxhZ3MpLCBSRUFET05MWX0sCisgICAgeyJfX3dlYWtyZWZvZmZzZXRfXyIsIFRfTE9ORywKKyAgICAgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF93ZWFrbGlzdG9mZnNldCksIFJFQURPTkxZfSwKKyAgICB7Il9fYmFzZV9fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfYmFzZSksIFJFQURPTkxZfSwKKyAgICB7Il9fZGljdG9mZnNldF9fIiwgVF9MT05HLAorICAgICBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2RpY3RvZmZzZXQpLCBSRUFET05MWX0sCisgICAgeyJfX21yb19fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfbXJvKSwgUkVBRE9OTFl9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfbmFtZShQeVR5cGVPYmplY3QgKnR5cGUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JY29uc3QgY2hhciAqczsKKyAgICBjb25zdCBjaGFyICpzOwogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgewotCQlQeUhlYXBUeXBlT2JqZWN0KiBldCA9IChQeUhlYXBUeXBlT2JqZWN0Kil0eXBlOworICAgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpIHsKKyAgICAgICAgUHlIZWFwVHlwZU9iamVjdCogZXQgPSAoUHlIZWFwVHlwZU9iamVjdCopdHlwZTsKIAotCQlQeV9JTkNSRUYoZXQtPmh0X25hbWUpOwotCQlyZXR1cm4gZXQtPmh0X25hbWU7Ci0JfQotCWVsc2UgewotCQlzID0gc3RycmNocih0eXBlLT50cF9uYW1lLCAnLicpOwotCQlpZiAocyA9PSBOVUxMKQotCQkJcyA9IHR5cGUtPnRwX25hbWU7Ci0JCWVsc2UKLQkJCXMrKzsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7Ci0JfQorICAgICAgICBQeV9JTkNSRUYoZXQtPmh0X25hbWUpOworICAgICAgICByZXR1cm4gZXQtPmh0X25hbWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzID0gc3RycmNocih0eXBlLT50cF9uYW1lLCAnLicpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgcyA9IHR5cGUtPnRwX25hbWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiB0eXBlX3NldF9uYW1lKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjb250ZXh0KQogewotCVB5SGVhcFR5cGVPYmplY3QqIGV0OworICAgIFB5SGVhcFR5cGVPYmplY3QqIGV0OwogCi0JaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY2FuJ3Qgc2V0ICVzLl9fbmFtZV9fIiwgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCF2YWx1ZSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY2FuJ3QgZGVsZXRlICVzLl9fbmFtZV9fIiwgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbiBvbmx5IGFzc2lnbiBzdHJpbmcgdG8gJXMuX19uYW1lX18sIG5vdCAnJXMnIiwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSkKLQkgICAgIT0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJfX25hbWVfXyBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgc2V0ICVzLl9fbmFtZV9fIiwgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRlbGV0ZSAlcy5fX25hbWVfXyIsIHR5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuIG9ubHkgYXNzaWduIHN0cmluZyB0byAlcy5fX25hbWVfXywgbm90ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSkKKyAgICAgICAgIT0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19uYW1lX18gbXVzdCBub3QgY29udGFpbiBudWxsIGJ5dGVzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlldCA9IChQeUhlYXBUeXBlT2JqZWN0Kil0eXBlOworICAgIGV0ID0gKFB5SGVhcFR5cGVPYmplY3QqKXR5cGU7CiAKLQlQeV9JTkNSRUYodmFsdWUpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CiAKLQlQeV9ERUNSRUYoZXQtPmh0X25hbWUpOwotCWV0LT5odF9uYW1lID0gdmFsdWU7CisgICAgUHlfREVDUkVGKGV0LT5odF9uYW1lKTsKKyAgICBldC0+aHRfbmFtZSA9IHZhbHVlOwogCi0JdHlwZS0+dHBfbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSk7CisgICAgdHlwZS0+dHBfbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfbW9kdWxlKFB5VHlwZU9iamVjdCAqdHlwZSwgdm9pZCAqY29udGV4dCkKIHsKLQlQeU9iamVjdCAqbW9kOwotCWNoYXIgKnM7CisgICAgUHlPYmplY3QgKm1vZDsKKyAgICBjaGFyICpzOwogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgewotCQltb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCAiX19tb2R1bGVfXyIpOwotCQlpZiAoIW1vZCkgeyAKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIl9fbW9kdWxlX18iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCVB5X1hJTkNSRUYobW9kKTsKLQkJcmV0dXJuIG1vZDsKLQl9Ci0JZWxzZSB7Ci0JCXMgPSBzdHJyY2hyKHR5cGUtPnRwX25hbWUsICcuJyk7Ci0JCWlmIChzICE9IE5VTEwpCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0JCQkgICAgdHlwZS0+dHBfbmFtZSwgKFB5X3NzaXplX3QpKHMgLSB0eXBlLT50cF9uYW1lKSk7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJfX2J1aWx0aW5fXyIpOwotCX0KKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSB7CisgICAgICAgIG1vZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX21vZHVsZV9fIik7CisgICAgICAgIGlmICghbW9kKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJfX21vZHVsZV9fIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBQeV9YSU5DUkVGKG1vZCk7CisgICAgICAgIHJldHVybiBtb2Q7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzID0gc3RycmNocih0eXBlLT50cF9uYW1lLCAnLicpOworICAgICAgICBpZiAocyAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsIChQeV9zc2l6ZV90KShzIC0gdHlwZS0+dHBfbmFtZSkpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiX19idWlsdGluX18iKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfc2V0X21vZHVsZShQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY29udGV4dCkKIHsKLQlpZiAoISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYW4ndCBzZXQgJXMuX19tb2R1bGVfXyIsIHR5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghdmFsdWUpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbid0IGRlbGV0ZSAlcy5fX21vZHVsZV9fIiwgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNhbid0IHNldCAlcy5fX21vZHVsZV9fIiwgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRlbGV0ZSAlcy5fX21vZHVsZV9fIiwgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlQeVR5cGVfTW9kaWZpZWQodHlwZSk7CisgICAgUHlUeXBlX01vZGlmaWVkKHR5cGUpOwogCi0JcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX21vZHVsZV9fIiwgdmFsdWUpOworICAgIHJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCAiX19tb2R1bGVfXyIsIHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfYWJzdHJhY3RtZXRob2RzKFB5VHlwZU9iamVjdCAqdHlwZSwgdm9pZCAqY29udGV4dCkKIHsKLQlQeU9iamVjdCAqbW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwKLQkJCQkJICAgICAiX19hYnN0cmFjdG1ldGhvZHNfXyIpOwotCWlmICghbW9kKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIl9fYWJzdHJhY3RtZXRob2RzX18iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X1hJTkNSRUYobW9kKTsKLQlyZXR1cm4gbW9kOworICAgIFB5T2JqZWN0ICptb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19hYnN0cmFjdG1ldGhvZHNfXyIpOworICAgIGlmICghbW9kKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIl9fYWJzdHJhY3RtZXRob2RzX18iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1hJTkNSRUYobW9kKTsKKyAgICByZXR1cm4gbW9kOwogfQogCiBzdGF0aWMgaW50CiB0eXBlX3NldF9hYnN0cmFjdG1ldGhvZHMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JLyogX19hYnN0cmFjdG1ldGhvZHNfXyBzaG91bGQgb25seSBiZSBzZXQgb25jZSBvbiBhIHR5cGUsIGluCi0JICAgYWJjLkFCQ01ldGEuX19uZXdfXywgc28gdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGRvIGFueXRoaW5nCi0JICAgc3BlY2lhbCB0byB1cGRhdGUgc3ViY2xhc3Nlcy4KLQkqLwotCWludCByZXMgPSBQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LAotCQkJCSAgICAgICAiX19hYnN0cmFjdG1ldGhvZHNfXyIsIHZhbHVlKTsKLQlpZiAocmVzID09IDApIHsKLQkJUHlUeXBlX01vZGlmaWVkKHR5cGUpOwotCQlpZiAodmFsdWUgJiYgUHlPYmplY3RfSXNUcnVlKHZhbHVlKSkgewotCQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19JU19BQlNUUkFDVDsKLQkJfQotCQllbHNlIHsKLQkJCXR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0lTX0FCU1RSQUNUOwotCQl9Ci0JfQotCXJldHVybiByZXM7CisgICAgLyogX19hYnN0cmFjdG1ldGhvZHNfXyBzaG91bGQgb25seSBiZSBzZXQgb25jZSBvbiBhIHR5cGUsIGluCisgICAgICAgYWJjLkFCQ01ldGEuX19uZXdfXywgc28gdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGRvIGFueXRoaW5nCisgICAgICAgc3BlY2lhbCB0byB1cGRhdGUgc3ViY2xhc3Nlcy4KKyAgICAqLworICAgIGludCByZXMgPSBQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19hYnN0cmFjdG1ldGhvZHNfXyIsIHZhbHVlKTsKKyAgICBpZiAocmVzID09IDApIHsKKyAgICAgICAgUHlUeXBlX01vZGlmaWVkKHR5cGUpOworICAgICAgICBpZiAodmFsdWUgJiYgUHlPYmplY3RfSXNUcnVlKHZhbHVlKSkgeworICAgICAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19JU19BQlNUUkFDVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0lTX0FCU1RSQUNUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0eXBlX2dldF9iYXNlcyhQeVR5cGVPYmplY3QgKnR5cGUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JUHlfSU5DUkVGKHR5cGUtPnRwX2Jhc2VzKTsKLQlyZXR1cm4gdHlwZS0+dHBfYmFzZXM7CisgICAgUHlfSU5DUkVGKHR5cGUtPnRwX2Jhc2VzKTsKKyAgICByZXR1cm4gdHlwZS0+dHBfYmFzZXM7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgKmJlc3RfYmFzZShQeU9iamVjdCAqKTsKQEAgLTM1NCw0MTYgKzM1NCw0MTYgQEAKIAogdHlwZWRlZiBpbnQgKCp1cGRhdGVfY2FsbGJhY2spKFB5VHlwZU9iamVjdCAqLCB2b2lkICopOwogc3RhdGljIGludCB1cGRhdGVfc3ViY2xhc3NlcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lLAotCQkJICAgICB1cGRhdGVfY2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKmRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfY2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKmRhdGEpOwogc3RhdGljIGludCByZWN1cnNlX2Rvd25fc3ViY2xhc3NlcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lLAotCQkJCSAgIHVwZGF0ZV9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqZGF0YSk7CiAKIHN0YXRpYyBpbnQKIG1yb19zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QqIHRlbXApCiB7Ci0JUHlUeXBlT2JqZWN0ICpzdWJjbGFzczsKLQlQeU9iamVjdCAqcmVmLCAqc3ViY2xhc3NlcywgKm9sZF9tcm87Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5VHlwZU9iamVjdCAqc3ViY2xhc3M7CisgICAgUHlPYmplY3QgKnJlZiwgKnN1YmNsYXNzZXMsICpvbGRfbXJvOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCXN1YmNsYXNzZXMgPSB0eXBlLT50cF9zdWJjbGFzc2VzOwotCWlmIChzdWJjbGFzc2VzID09IE5VTEwpCi0JCXJldHVybiAwOwotCWFzc2VydChQeUxpc3RfQ2hlY2soc3ViY2xhc3NlcykpOwotCW4gPSBQeUxpc3RfR0VUX1NJWkUoc3ViY2xhc3Nlcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlyZWYgPSBQeUxpc3RfR0VUX0lURU0oc3ViY2xhc3NlcywgaSk7Ci0JCWFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7Ci0JCXN1YmNsYXNzID0gKFB5VHlwZU9iamVjdCAqKVB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZik7Ci0JCWFzc2VydChzdWJjbGFzcyAhPSBOVUxMKTsKLQkJaWYgKChQeU9iamVjdCAqKXN1YmNsYXNzID09IFB5X05vbmUpCi0JCQljb250aW51ZTsKLQkJYXNzZXJ0KFB5VHlwZV9DaGVjayhzdWJjbGFzcykpOwotCQlvbGRfbXJvID0gc3ViY2xhc3MtPnRwX21ybzsKLQkJaWYgKG1yb19pbnRlcm5hbChzdWJjbGFzcykgPCAwKSB7Ci0JCQlzdWJjbGFzcy0+dHBfbXJvID0gb2xkX21ybzsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIHsKLQkJCVB5T2JqZWN0KiB0dXBsZTsKLQkJCXR1cGxlID0gUHlUdXBsZV9QYWNrKDIsIHN1YmNsYXNzLCBvbGRfbXJvKTsKLQkJCVB5X0RFQ1JFRihvbGRfbXJvKTsKLQkJCWlmICghdHVwbGUpCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKFB5TGlzdF9BcHBlbmQodGVtcCwgdHVwbGUpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlQeV9ERUNSRUYodHVwbGUpOwotCQl9Ci0JCWlmIChtcm9fc3ViY2xhc3NlcyhzdWJjbGFzcywgdGVtcCkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBzdWJjbGFzc2VzID0gdHlwZS0+dHBfc3ViY2xhc3NlczsKKyAgICBpZiAoc3ViY2xhc3NlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKHN1YmNsYXNzZXMpKTsKKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKHN1YmNsYXNzZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgcmVmID0gUHlMaXN0X0dFVF9JVEVNKHN1YmNsYXNzZXMsIGkpOworICAgICAgICBhc3NlcnQoUHlXZWFrcmVmX0NoZWNrUmVmKHJlZikpOworICAgICAgICBzdWJjbGFzcyA9IChQeVR5cGVPYmplY3QgKilQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpOworICAgICAgICBhc3NlcnQoc3ViY2xhc3MgIT0gTlVMTCk7CisgICAgICAgIGlmICgoUHlPYmplY3QgKilzdWJjbGFzcyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGFzc2VydChQeVR5cGVfQ2hlY2soc3ViY2xhc3MpKTsKKyAgICAgICAgb2xkX21ybyA9IHN1YmNsYXNzLT50cF9tcm87CisgICAgICAgIGlmIChtcm9faW50ZXJuYWwoc3ViY2xhc3MpIDwgMCkgeworICAgICAgICAgICAgc3ViY2xhc3MtPnRwX21ybyA9IG9sZF9tcm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCogdHVwbGU7CisgICAgICAgICAgICB0dXBsZSA9IFB5VHVwbGVfUGFjaygyLCBzdWJjbGFzcywgb2xkX21ybyk7CisgICAgICAgICAgICBQeV9ERUNSRUYob2xkX21ybyk7CisgICAgICAgICAgICBpZiAoIXR1cGxlKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHRlbXAsIHR1cGxlKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobXJvX3N1YmNsYXNzZXMoc3ViY2xhc3MsIHRlbXApIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfc2V0X2Jhc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjb250ZXh0KQogewotCVB5X3NzaXplX3QgaTsKLQlpbnQgciA9IDA7Ci0JUHlPYmplY3QgKm9iLCAqdGVtcDsKLQlQeVR5cGVPYmplY3QgKm5ld19iYXNlLCAqb2xkX2Jhc2U7Ci0JUHlPYmplY3QgKm9sZF9iYXNlcywgKm9sZF9tcm87CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCByID0gMDsKKyAgICBQeU9iamVjdCAqb2IsICp0ZW1wOworICAgIFB5VHlwZU9iamVjdCAqbmV3X2Jhc2UsICpvbGRfYmFzZTsKKyAgICBQeU9iamVjdCAqb2xkX2Jhc2VzLCAqb2xkX21ybzsKIAotCWlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbid0IHNldCAlcy5fX2Jhc2VzX18iLCB0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIXZhbHVlKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYW4ndCBkZWxldGUgJXMuX19iYXNlc19fIiwgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJjYW4gb25seSBhc3NpZ24gdHVwbGUgdG8gJXMuX19iYXNlc19fLCBub3QgJXMiLAotCQkJICAgICB0eXBlLT50cF9uYW1lLCBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5VHVwbGVfR0VUX1NJWkUodmFsdWUpID09IDApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiY2FuIG9ubHkgYXNzaWduIG5vbi1lbXB0eSB0dXBsZSB0byAlcy5fX2Jhc2VzX18sIG5vdCAoKSIsCi0JCQkgICAgIHR5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHZhbHVlKTsgaSsrKSB7Ci0JCW9iID0gUHlUdXBsZV9HRVRfSVRFTSh2YWx1ZSwgaSk7Ci0JCWlmICghUHlDbGFzc19DaGVjayhvYikgJiYgIVB5VHlwZV9DaGVjayhvYikpIHsKLQkJCVB5RXJyX0Zvcm1hdCgKLQkJCQlQeUV4Y19UeXBlRXJyb3IsCi0JIiVzLl9fYmFzZXNfXyBtdXN0IGJlIHR1cGxlIG9mIG9sZC0gb3IgbmV3LXN0eWxlIGNsYXNzZXMsIG5vdCAnJXMnIiwKLQkJCQl0eXBlLT50cF9uYW1lLCBQeV9UWVBFKG9iKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKFB5VHlwZV9DaGVjayhvYikpIHsKLQkJCWlmIChQeVR5cGVfSXNTdWJ0eXBlKChQeVR5cGVPYmplY3QqKW9iLCB0eXBlKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiYSBfX2Jhc2VzX18gaXRlbSBjYXVzZXMgYW4gaW5oZXJpdGFuY2UgY3ljbGUiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNhbid0IHNldCAlcy5fX2Jhc2VzX18iLCB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlICVzLl9fYmFzZXNfXyIsIHR5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAiY2FuIG9ubHkgYXNzaWduIHR1cGxlIHRvICVzLl9fYmFzZXNfXywgbm90ICVzIiwKKyAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKHZhbHVlKSA9PSAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgImNhbiBvbmx5IGFzc2lnbiBub24tZW1wdHkgdHVwbGUgdG8gJXMuX19iYXNlc19fLCBub3QgKCkiLAorICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRSh2YWx1ZSk7IGkrKykgeworICAgICAgICBvYiA9IFB5VHVwbGVfR0VUX0lURU0odmFsdWUsIGkpOworICAgICAgICBpZiAoIVB5Q2xhc3NfQ2hlY2sob2IpICYmICFQeVR5cGVfQ2hlY2sob2IpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICIlcy5fX2Jhc2VzX18gbXVzdCBiZSB0dXBsZSBvZiBvbGQtIG9yIG5ldy1zdHlsZSBjbGFzc2VzLCBub3QgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgUHlfVFlQRShvYiktPnRwX25hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5VHlwZV9DaGVjayhvYikpIHsKKyAgICAgICAgICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKChQeVR5cGVPYmplY3QqKW9iLCB0eXBlKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiYSBfX2Jhc2VzX18gaXRlbSBjYXVzZXMgYW4gaW5oZXJpdGFuY2UgY3ljbGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQluZXdfYmFzZSA9IGJlc3RfYmFzZSh2YWx1ZSk7CisgICAgbmV3X2Jhc2UgPSBiZXN0X2Jhc2UodmFsdWUpOwogCi0JaWYgKCFuZXdfYmFzZSkgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICghbmV3X2Jhc2UpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICghY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudCh0eXBlLT50cF9iYXNlLCBuZXdfYmFzZSwgIl9fYmFzZXNfXyIpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KHR5cGUtPnRwX2Jhc2UsIG5ld19iYXNlLCAiX19iYXNlc19fIikpCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X0lOQ1JFRihuZXdfYmFzZSk7Ci0JUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYobmV3X2Jhc2UpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CiAKLQlvbGRfYmFzZXMgPSB0eXBlLT50cF9iYXNlczsKLQlvbGRfYmFzZSA9IHR5cGUtPnRwX2Jhc2U7Ci0Jb2xkX21ybyA9IHR5cGUtPnRwX21ybzsKKyAgICBvbGRfYmFzZXMgPSB0eXBlLT50cF9iYXNlczsKKyAgICBvbGRfYmFzZSA9IHR5cGUtPnRwX2Jhc2U7CisgICAgb2xkX21ybyA9IHR5cGUtPnRwX21ybzsKIAotCXR5cGUtPnRwX2Jhc2VzID0gdmFsdWU7Ci0JdHlwZS0+dHBfYmFzZSA9IG5ld19iYXNlOworICAgIHR5cGUtPnRwX2Jhc2VzID0gdmFsdWU7CisgICAgdHlwZS0+dHBfYmFzZSA9IG5ld19iYXNlOwogCi0JaWYgKG1yb19pbnRlcm5hbCh0eXBlKSA8IDApIHsKLQkJZ290byBiYWlsOwotCX0KKyAgICBpZiAobXJvX2ludGVybmFsKHR5cGUpIDwgMCkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQogCi0JdGVtcCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKCF0ZW1wKQotCQlnb3RvIGJhaWw7CisgICAgdGVtcCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKCF0ZW1wKQorICAgICAgICBnb3RvIGJhaWw7CiAKLQlyID0gbXJvX3N1YmNsYXNzZXModHlwZSwgdGVtcCk7CisgICAgciA9IG1yb19zdWJjbGFzc2VzKHR5cGUsIHRlbXApOwogCi0JaWYgKHIgPCAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBQeUxpc3RfU2l6ZSh0ZW1wKTsgaSsrKSB7Ci0JCQlQeVR5cGVPYmplY3QqIGNsczsKLQkJCVB5T2JqZWN0KiBtcm87Ci0JCQlQeUFyZ19VbnBhY2tUdXBsZShQeUxpc3RfR0VUX0lURU0odGVtcCwgaSksCi0JCQkJCSAiIiwgMiwgMiwgJmNscywgJm1ybyk7Ci0JCQlQeV9JTkNSRUYobXJvKTsKLQkJCW9iID0gY2xzLT50cF9tcm87Ci0JCQljbHMtPnRwX21ybyA9IG1ybzsKLQkJCVB5X0RFQ1JFRihvYik7Ci0JCX0KLQkJUHlfREVDUkVGKHRlbXApOwotCQlnb3RvIGJhaWw7Ci0JfQorICAgIGlmIChyIDwgMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X1NpemUodGVtcCk7IGkrKykgeworICAgICAgICAgICAgUHlUeXBlT2JqZWN0KiBjbHM7CisgICAgICAgICAgICBQeU9iamVjdCogbXJvOworICAgICAgICAgICAgUHlBcmdfVW5wYWNrVHVwbGUoUHlMaXN0X0dFVF9JVEVNKHRlbXAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgMiwgMiwgJmNscywgJm1ybyk7CisgICAgICAgICAgICBQeV9JTkNSRUYobXJvKTsKKyAgICAgICAgICAgIG9iID0gY2xzLT50cF9tcm87CisgICAgICAgICAgICBjbHMtPnRwX21ybyA9IG1ybzsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvYik7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQogCi0JUHlfREVDUkVGKHRlbXApOworICAgIFB5X0RFQ1JFRih0ZW1wKTsKIAotCS8qIGFueSBiYXNlIHRoYXQgd2FzIGluIF9fYmFzZXNfXyBidXQgbm93IGlzbid0LCB3ZQotCSAgIG5lZWQgdG8gcmVtb3ZlIHx0eXBlfCBmcm9tIGl0cyB0cF9zdWJjbGFzc2VzLgotCSAgIGNvbnZlcnNlbHksIGFueSBjbGFzcyBub3cgaW4gX19iYXNlc19fIHRoYXQgd2Fzbid0Ci0JICAgbmVlZHMgdG8gaGF2ZSB8dHlwZXwgYWRkZWQgdG8gaXRzIHN1YmNsYXNzZXMuICovCisgICAgLyogYW55IGJhc2UgdGhhdCB3YXMgaW4gX19iYXNlc19fIGJ1dCBub3cgaXNuJ3QsIHdlCisgICAgICAgbmVlZCB0byByZW1vdmUgfHR5cGV8IGZyb20gaXRzIHRwX3N1YmNsYXNzZXMuCisgICAgICAgY29udmVyc2VseSwgYW55IGNsYXNzIG5vdyBpbiBfX2Jhc2VzX18gdGhhdCB3YXNuJ3QKKyAgICAgICBuZWVkcyB0byBoYXZlIHx0eXBlfCBhZGRlZCB0byBpdHMgc3ViY2xhc3Nlcy4gKi8KIAotCS8qIGZvciBub3csIHNvZCB0aGF0OiBqdXN0IHJlbW92ZSBmcm9tIGFsbCBvbGRfYmFzZXMsCi0JICAgYWRkIHRvIGFsbCBuZXdfYmFzZXMgKi8KKyAgICAvKiBmb3Igbm93LCBzb2QgdGhhdDoganVzdCByZW1vdmUgZnJvbSBhbGwgb2xkX2Jhc2VzLAorICAgICAgIGFkZCB0byBhbGwgbmV3X2Jhc2VzICovCiAKLQlmb3IgKGkgPSBQeVR1cGxlX0dFVF9TSVpFKG9sZF9iYXNlcykgLSAxOyBpID49IDA7IGktLSkgewotCQlvYiA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX2Jhc2VzLCBpKTsKLQkJaWYgKFB5VHlwZV9DaGVjayhvYikpIHsKLQkJCXJlbW92ZV9zdWJjbGFzcygKLQkJCQkoUHlUeXBlT2JqZWN0KilvYiwgdHlwZSk7Ci0JCX0KLQl9CisgICAgZm9yIChpID0gUHlUdXBsZV9HRVRfU0laRShvbGRfYmFzZXMpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgb2IgPSBQeVR1cGxlX0dFVF9JVEVNKG9sZF9iYXNlcywgaSk7CisgICAgICAgIGlmIChQeVR5cGVfQ2hlY2sob2IpKSB7CisgICAgICAgICAgICByZW1vdmVfc3ViY2xhc3MoCisgICAgICAgICAgICAgICAgKFB5VHlwZU9iamVjdCopb2IsIHR5cGUpOworICAgICAgICB9CisgICAgfQogCi0JZm9yIChpID0gUHlUdXBsZV9HRVRfU0laRSh2YWx1ZSkgLSAxOyBpID49IDA7IGktLSkgewotCQlvYiA9IFB5VHVwbGVfR0VUX0lURU0odmFsdWUsIGkpOwotCQlpZiAoUHlUeXBlX0NoZWNrKG9iKSkgewotCQkJaWYgKGFkZF9zdWJjbGFzcygoUHlUeXBlT2JqZWN0KilvYiwgdHlwZSkgPCAwKQotCQkJCXIgPSAtMTsKLQkJfQotCX0KKyAgICBmb3IgKGkgPSBQeVR1cGxlX0dFVF9TSVpFKHZhbHVlKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIG9iID0gUHlUdXBsZV9HRVRfSVRFTSh2YWx1ZSwgaSk7CisgICAgICAgIGlmIChQeVR5cGVfQ2hlY2sob2IpKSB7CisgICAgICAgICAgICBpZiAoYWRkX3N1YmNsYXNzKChQeVR5cGVPYmplY3QqKW9iLCB0eXBlKSA8IDApCisgICAgICAgICAgICAgICAgciA9IC0xOworICAgICAgICB9CisgICAgfQogCi0JdXBkYXRlX2FsbF9zbG90cyh0eXBlKTsKKyAgICB1cGRhdGVfYWxsX3Nsb3RzKHR5cGUpOwogCi0JUHlfREVDUkVGKG9sZF9iYXNlcyk7Ci0JUHlfREVDUkVGKG9sZF9iYXNlKTsKLQlQeV9ERUNSRUYob2xkX21ybyk7CisgICAgUHlfREVDUkVGKG9sZF9iYXNlcyk7CisgICAgUHlfREVDUkVGKG9sZF9iYXNlKTsKKyAgICBQeV9ERUNSRUYob2xkX21ybyk7CiAKLQlyZXR1cm4gcjsKKyAgICByZXR1cm4gcjsKIAogICBiYWlsOgotCVB5X0RFQ1JFRih0eXBlLT50cF9iYXNlcyk7Ci0JUHlfREVDUkVGKHR5cGUtPnRwX2Jhc2UpOwotCWlmICh0eXBlLT50cF9tcm8gIT0gb2xkX21ybykgewotCQlQeV9ERUNSRUYodHlwZS0+dHBfbXJvKTsKLQl9CisgICAgUHlfREVDUkVGKHR5cGUtPnRwX2Jhc2VzKTsKKyAgICBQeV9ERUNSRUYodHlwZS0+dHBfYmFzZSk7CisgICAgaWYgKHR5cGUtPnRwX21ybyAhPSBvbGRfbXJvKSB7CisgICAgICAgIFB5X0RFQ1JFRih0eXBlLT50cF9tcm8pOworICAgIH0KIAotCXR5cGUtPnRwX2Jhc2VzID0gb2xkX2Jhc2VzOwotCXR5cGUtPnRwX2Jhc2UgPSBvbGRfYmFzZTsKLQl0eXBlLT50cF9tcm8gPSBvbGRfbXJvOworICAgIHR5cGUtPnRwX2Jhc2VzID0gb2xkX2Jhc2VzOworICAgIHR5cGUtPnRwX2Jhc2UgPSBvbGRfYmFzZTsKKyAgICB0eXBlLT50cF9tcm8gPSBvbGRfbXJvOwogCi0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfZGljdChQeVR5cGVPYmplY3QgKnR5cGUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JaWYgKHR5cGUtPnRwX2RpY3QgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlEaWN0UHJveHlfTmV3KHR5cGUtPnRwX2RpY3QpOworICAgIGlmICh0eXBlLT50cF9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5RGljdFByb3h5X05ldyh0eXBlLT50cF9kaWN0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfZ2V0X2RvYyhQeVR5cGVPYmplY3QgKnR5cGUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlpZiAoISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpICYmIHR5cGUtPnRwX2RvYyAhPSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyh0eXBlLT50cF9kb2MpOwotCXJlc3VsdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCXJlc3VsdCA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCX0KLQllbHNlIGlmIChQeV9UWVBFKHJlc3VsdCktPnRwX2Rlc2NyX2dldCkgewotCQlyZXN1bHQgPSBQeV9UWVBFKHJlc3VsdCktPnRwX2Rlc2NyX2dldChyZXN1bHQsIE5VTEwsCi0JCQkJCQkgICAgICAgKFB5T2JqZWN0ICopdHlwZSk7Ci0JfQotCWVsc2UgewotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgJiYgdHlwZS0+dHBfZG9jICE9IE5VTEwpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHR5cGUtPnRwX2RvYyk7CisgICAgcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fZG9jX18iKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5X1RZUEUocmVzdWx0KS0+dHBfZGVzY3JfZ2V0KSB7CisgICAgICAgIHJlc3VsdCA9IFB5X1RZUEUocmVzdWx0KS0+dHBfZGVzY3JfZ2V0KHJlc3VsdCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopdHlwZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfX19pbnN0YW5jZWNoZWNrX18oUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICppbnN0KQogewotCXN3aXRjaCAoX1B5T2JqZWN0X1JlYWxJc0luc3RhbmNlKGluc3QsIHR5cGUpKSB7Ci0JY2FzZSAtMToKLQkJcmV0dXJuIE5VTEw7Ci0JY2FzZSAwOgotCQlQeV9SRVRVUk5fRkFMU0U7Ci0JZGVmYXVsdDoKLQkJUHlfUkVUVVJOX1RSVUU7Ci0JfQorICAgIHN3aXRjaCAoX1B5T2JqZWN0X1JlYWxJc0luc3RhbmNlKGluc3QsIHR5cGUpKSB7CisgICAgY2FzZSAtMToKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSAwOgorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgfQogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0eXBlX19fc3ViY2xhc3NjaGVja19fKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqaW5zdCkKIHsKLQlzd2l0Y2ggKF9QeU9iamVjdF9SZWFsSXNTdWJjbGFzcyhpbnN0LCB0eXBlKSkgewotCWNhc2UgLTE6Ci0JCXJldHVybiBOVUxMOwotCWNhc2UgMDoKLQkJUHlfUkVUVVJOX0ZBTFNFOwotCWRlZmF1bHQ6Ci0JCVB5X1JFVFVSTl9UUlVFOwotCX0KKyAgICBzd2l0Y2ggKF9QeU9iamVjdF9SZWFsSXNTdWJjbGFzcyhpbnN0LCB0eXBlKSkgeworICAgIGNhc2UgLTE6CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgMDoKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgIH0KIH0KIAogCiBzdGF0aWMgUHlHZXRTZXREZWYgdHlwZV9nZXRzZXRzW10gPSB7Ci0JeyJfX25hbWVfXyIsIChnZXR0ZXIpdHlwZV9uYW1lLCAoc2V0dGVyKXR5cGVfc2V0X25hbWUsIE5VTEx9LAotCXsiX19iYXNlc19fIiwgKGdldHRlcil0eXBlX2dldF9iYXNlcywgKHNldHRlcil0eXBlX3NldF9iYXNlcywgTlVMTH0sCi0JeyJfX21vZHVsZV9fIiwgKGdldHRlcil0eXBlX21vZHVsZSwgKHNldHRlcil0eXBlX3NldF9tb2R1bGUsIE5VTEx9LAotCXsiX19hYnN0cmFjdG1ldGhvZHNfXyIsIChnZXR0ZXIpdHlwZV9hYnN0cmFjdG1ldGhvZHMsCi0JIChzZXR0ZXIpdHlwZV9zZXRfYWJzdHJhY3RtZXRob2RzLCBOVUxMfSwKLQl7Il9fZGljdF9fIiwgIChnZXR0ZXIpdHlwZV9kaWN0LCAgTlVMTCwgTlVMTH0sCi0JeyJfX2RvY19fIiwgKGdldHRlcil0eXBlX2dldF9kb2MsIE5VTEwsIE5VTEx9LAotCXswfQorICAgIHsiX19uYW1lX18iLCAoZ2V0dGVyKXR5cGVfbmFtZSwgKHNldHRlcil0eXBlX3NldF9uYW1lLCBOVUxMfSwKKyAgICB7Il9fYmFzZXNfXyIsIChnZXR0ZXIpdHlwZV9nZXRfYmFzZXMsIChzZXR0ZXIpdHlwZV9zZXRfYmFzZXMsIE5VTEx9LAorICAgIHsiX19tb2R1bGVfXyIsIChnZXR0ZXIpdHlwZV9tb2R1bGUsIChzZXR0ZXIpdHlwZV9zZXRfbW9kdWxlLCBOVUxMfSwKKyAgICB7Il9fYWJzdHJhY3RtZXRob2RzX18iLCAoZ2V0dGVyKXR5cGVfYWJzdHJhY3RtZXRob2RzLAorICAgICAoc2V0dGVyKXR5cGVfc2V0X2Fic3RyYWN0bWV0aG9kcywgTlVMTH0sCisgICAgeyJfX2RpY3RfXyIsICAoZ2V0dGVyKXR5cGVfZGljdCwgIE5VTEwsIE5VTEx9LAorICAgIHsiX19kb2NfXyIsIChnZXR0ZXIpdHlwZV9nZXRfZG9jLCBOVUxMLCBOVUxMfSwKKyAgICB7MH0KIH07CiAKIAogc3RhdGljIFB5T2JqZWN0KgogdHlwZV9yaWNoY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5X3VpbnRwdHJfdCB2diwgd3c7Ci0JaW50IGM7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeV91aW50cHRyX3QgdnYsIHd3OworICAgIGludCBjOwogCi0JLyogTWFrZSBzdXJlIGJvdGggYXJndW1lbnRzIGFyZSB0eXBlcy4gKi8KLQlpZiAoIVB5VHlwZV9DaGVjayh2KSB8fCAhUHlUeXBlX0NoZWNrKHcpIHx8Ci0JICAgIC8qIElmIHRoZXJlIGlzIGEgX19jbXBfXyBtZXRob2QgZGVmaW5lZCwgbGV0IGl0IGJlIGNhbGxlZCBpbnN0ZWFkCi0JICAgICAgIG9mIG91ciBkdW1iIGZ1bmN0aW9uIGRlc2lnbmVkIG1lcmVseSB0byB3YXJuLiAgU2VlIGJ1ZwotCSAgICAgICAjNzQ5MS4gKi8KLQkgICAgUHlfVFlQRSh2KS0+dHBfY29tcGFyZSB8fCBQeV9UWVBFKHcpLT50cF9jb21wYXJlKSB7Ci0JCXJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOwotCQlnb3RvIG91dDsKLQl9CisgICAgLyogTWFrZSBzdXJlIGJvdGggYXJndW1lbnRzIGFyZSB0eXBlcy4gKi8KKyAgICBpZiAoIVB5VHlwZV9DaGVjayh2KSB8fCAhUHlUeXBlX0NoZWNrKHcpIHx8CisgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgX19jbXBfXyBtZXRob2QgZGVmaW5lZCwgbGV0IGl0IGJlIGNhbGxlZCBpbnN0ZWFkCisgICAgICAgICAgIG9mIG91ciBkdW1iIGZ1bmN0aW9uIGRlc2lnbmVkIG1lcmVseSB0byB3YXJuLiAgU2VlIGJ1ZworICAgICAgICAgICAjNzQ5MS4gKi8KKyAgICAgICAgUHlfVFlQRSh2KS0+dHBfY29tcGFyZSB8fCBQeV9UWVBFKHcpLT50cF9jb21wYXJlKSB7CisgICAgICAgIHJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CiAKLQkvKiBQeTNLIHdhcm5pbmcgaWYgY29tcGFyaXNvbiBpc24ndCA9PSBvciAhPSAgKi8KLQlpZiAoUHlfUHkza1dhcm5pbmdGbGFnICYmIG9wICE9IFB5X0VRICYmIG9wICE9IFB5X05FICYmCi0JCVB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkgICAidHlwZSBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgIgotCQkJICAgImluIDMueCIsIDEpIDwgMCkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogUHkzSyB3YXJuaW5nIGlmIGNvbXBhcmlzb24gaXNuJ3QgPT0gb3IgIT0gICovCisgICAgaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAmJiBvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSAmJgorICAgICAgICBQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICJ0eXBlIGluZXF1YWxpdHkgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgImluIDMueCIsIDEpIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBDb21wYXJlIGFkZHJlc3NlcyAqLwotCXZ2ID0gKFB5X3VpbnRwdHJfdCl2OwotCXd3ID0gKFB5X3VpbnRwdHJfdCl3OwotCXN3aXRjaCAob3ApIHsKLQljYXNlIFB5X0xUOiBjID0gdnYgPCAgd3c7IGJyZWFrOwotCWNhc2UgUHlfTEU6IGMgPSB2diA8PSB3dzsgYnJlYWs7Ci0JY2FzZSBQeV9FUTogYyA9IHZ2ID09IHd3OyBicmVhazsKLQljYXNlIFB5X05FOiBjID0gdnYgIT0gd3c7IGJyZWFrOwotCWNhc2UgUHlfR1Q6IGMgPSB2diA+ICB3dzsgYnJlYWs7Ci0JY2FzZSBQeV9HRTogYyA9IHZ2ID49IHd3OyBicmVhazsKLQlkZWZhdWx0OgotCQlyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKLQkJZ290byBvdXQ7Ci0JfQotCXJlc3VsdCA9IGMgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgICAgLyogQ29tcGFyZSBhZGRyZXNzZXMgKi8KKyAgICB2diA9IChQeV91aW50cHRyX3QpdjsKKyAgICB3dyA9IChQeV91aW50cHRyX3QpdzsKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBQeV9MVDogYyA9IHZ2IDwgIHd3OyBicmVhazsKKyAgICBjYXNlIFB5X0xFOiBjID0gdnYgPD0gd3c7IGJyZWFrOworICAgIGNhc2UgUHlfRVE6IGMgPSB2diA9PSB3dzsgYnJlYWs7CisgICAgY2FzZSBQeV9ORTogYyA9IHZ2ICE9IHd3OyBicmVhazsKKyAgICBjYXNlIFB5X0dUOiBjID0gdnYgPiAgd3c7IGJyZWFrOworICAgIGNhc2UgUHlfR0U6IGMgPSB2diA+PSB3dzsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByZXN1bHQgPSBjID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwogCiAgIC8qIGluY3JlZiBhbmQgcmV0dXJuICovCiAgIG91dDoKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0eXBlX3JlcHIoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5T2JqZWN0ICptb2QsICpuYW1lLCAqcnRuOwotCWNoYXIgKmtpbmQ7CisgICAgUHlPYmplY3QgKm1vZCwgKm5hbWUsICpydG47CisgICAgY2hhciAqa2luZDsKIAotCW1vZCA9IHR5cGVfbW9kdWxlKHR5cGUsIE5VTEwpOwotCWlmIChtb2QgPT0gTlVMTCkKLQkJUHlFcnJfQ2xlYXIoKTsKLQllbHNlIGlmICghUHlTdHJpbmdfQ2hlY2sobW9kKSkgewotCQlQeV9ERUNSRUYobW9kKTsKLQkJbW9kID0gTlVMTDsKLQl9Ci0JbmFtZSA9IHR5cGVfbmFtZSh0eXBlLCBOVUxMKTsKLQlpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBtb2QgPSB0eXBlX21vZHVsZSh0eXBlLCBOVUxMKTsKKyAgICBpZiAobW9kID09IE5VTEwpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKG1vZCkpIHsKKyAgICAgICAgUHlfREVDUkVGKG1vZCk7CisgICAgICAgIG1vZCA9IE5VTEw7CisgICAgfQorICAgIG5hbWUgPSB0eXBlX25hbWUodHlwZSwgTlVMTCk7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQotCQlraW5kID0gImNsYXNzIjsKLQllbHNlCi0JCWtpbmQgPSAidHlwZSI7CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKKyAgICAgICAga2luZCA9ICJjbGFzcyI7CisgICAgZWxzZQorICAgICAgICBraW5kID0gInR5cGUiOwogCi0JaWYgKG1vZCAhPSBOVUxMICYmIHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobW9kKSwgIl9fYnVpbHRpbl9fIikpIHsKLQkJcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzICclcy4lcyc+IiwKLQkJCQkJICBraW5kLAotCQkJCQkgIFB5U3RyaW5nX0FTX1NUUklORyhtb2QpLAotCQkJCQkgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JfQotCWVsc2UKLQkJcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzICclcyc+Iiwga2luZCwgdHlwZS0+dHBfbmFtZSk7CisgICAgaWYgKG1vZCAhPSBOVUxMICYmIHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobW9kKSwgIl9fYnVpbHRpbl9fIikpIHsKKyAgICAgICAgcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzICclcy4lcyc+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhtb2QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzICclcyc+Iiwga2luZCwgdHlwZS0+dHBfbmFtZSk7CiAKLQlQeV9YREVDUkVGKG1vZCk7Ci0JUHlfREVDUkVGKG5hbWUpOwotCXJldHVybiBydG47CisgICAgUHlfWERFQ1JFRihtb2QpOworICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gcnRuOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9jYWxsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpvYmo7CisgICAgUHlPYmplY3QgKm9iajsKIAotCWlmICh0eXBlLT50cF9uZXcgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY2Fubm90IGNyZWF0ZSAnJS4xMDBzJyBpbnN0YW5jZXMiLAotCQkJICAgICB0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh0eXBlLT50cF9uZXcgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjcmVhdGUgJyUuMTAwcycgaW5zdGFuY2VzIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlvYmogPSB0eXBlLT50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKG9iaiAhPSBOVUxMKSB7Ci0JCS8qIFVnbHkgZXhjZXB0aW9uOiB3aGVuIHRoZSBjYWxsIHdhcyB0eXBlKHNvbWV0aGluZyksCi0JCSAgIGRvbid0IGNhbGwgdHBfaW5pdCBvbiB0aGUgcmVzdWx0LiAqLwotCQlpZiAodHlwZSA9PSAmUHlUeXBlX1R5cGUgJiYKLQkJICAgIFB5VHVwbGVfQ2hlY2soYXJncykgJiYgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxICYmCi0JCSAgICAoa3dkcyA9PSBOVUxMIHx8Ci0JCSAgICAgKFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSA9PSAwKSkpCi0JCQlyZXR1cm4gb2JqOwotCQkvKiBJZiB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0eXBlLAotCQkgICBpdCB3b24ndCBiZSBpbml0aWFsaXplZC4gKi8KLQkJaWYgKCFQeVR5cGVfSXNTdWJ0eXBlKG9iai0+b2JfdHlwZSwgdHlwZSkpCi0JCQlyZXR1cm4gb2JqOwotCQl0eXBlID0gb2JqLT5vYl90eXBlOwotCQlpZiAoUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSAmJgotCQkgICAgdHlwZS0+dHBfaW5pdCAhPSBOVUxMICYmCi0JCSAgICB0eXBlLT50cF9pbml0KG9iaiwgYXJncywga3dkcykgPCAwKSB7Ci0JCQlQeV9ERUNSRUYob2JqKTsKLQkJCW9iaiA9IE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIG9iajsKKyAgICBvYmogPSB0eXBlLT50cF9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgIC8qIFVnbHkgZXhjZXB0aW9uOiB3aGVuIHRoZSBjYWxsIHdhcyB0eXBlKHNvbWV0aGluZyksCisgICAgICAgICAgIGRvbid0IGNhbGwgdHBfaW5pdCBvbiB0aGUgcmVzdWx0LiAqLworICAgICAgICBpZiAodHlwZSA9PSAmUHlUeXBlX1R5cGUgJiYKKyAgICAgICAgICAgIFB5VHVwbGVfQ2hlY2soYXJncykgJiYgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxICYmCisgICAgICAgICAgICAoa3dkcyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgKFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSA9PSAwKSkpCisgICAgICAgICAgICByZXR1cm4gb2JqOworICAgICAgICAvKiBJZiB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0eXBlLAorICAgICAgICAgICBpdCB3b24ndCBiZSBpbml0aWFsaXplZC4gKi8KKyAgICAgICAgaWYgKCFQeVR5cGVfSXNTdWJ0eXBlKG9iai0+b2JfdHlwZSwgdHlwZSkpCisgICAgICAgICAgICByZXR1cm4gb2JqOworICAgICAgICB0eXBlID0gb2JqLT5vYl90eXBlOworICAgICAgICBpZiAoUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSAmJgorICAgICAgICAgICAgdHlwZS0+dHBfaW5pdCAhPSBOVUxMICYmCisgICAgICAgICAgICB0eXBlLT50cF9pbml0KG9iaiwgYXJncywga3dkcykgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgICAgIG9iaiA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG9iajsKIH0KIAogUHlPYmplY3QgKgogUHlUeXBlX0dlbmVyaWNBbGxvYyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgbml0ZW1zKQogewotCVB5T2JqZWN0ICpvYmo7Ci0JY29uc3Qgc2l6ZV90IHNpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUodHlwZSwgbml0ZW1zKzEpOwotCS8qIG5vdGUgdGhhdCB3ZSBuZWVkIHRvIGFkZCBvbmUsIGZvciB0aGUgc2VudGluZWwgKi8KKyAgICBQeU9iamVjdCAqb2JqOworICAgIGNvbnN0IHNpemVfdCBzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHR5cGUsIG5pdGVtcysxKTsKKyAgICAvKiBub3RlIHRoYXQgd2UgbmVlZCB0byBhZGQgb25lLCBmb3IgdGhlIHNlbnRpbmVsICovCiAKLQlpZiAoUHlUeXBlX0lTX0dDKHR5cGUpKQotCQlvYmogPSBfUHlPYmplY3RfR0NfTWFsbG9jKHNpemUpOwotCWVsc2UKLQkJb2JqID0gKFB5T2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKHNpemUpOworICAgIGlmIChQeVR5cGVfSVNfR0ModHlwZSkpCisgICAgICAgIG9iaiA9IF9QeU9iamVjdF9HQ19NYWxsb2Moc2l6ZSk7CisgICAgZWxzZQorICAgICAgICBvYmogPSAoUHlPYmplY3QgKilQeU9iamVjdF9NQUxMT0Moc2l6ZSk7CiAKLQlpZiAob2JqID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmIChvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQltZW1zZXQob2JqLCAnXDAnLCBzaXplKTsKKyAgICBtZW1zZXQob2JqLCAnXDAnLCBzaXplKTsKIAotCWlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCi0JCVB5X0lOQ1JFRih0eXBlKTsKKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQorICAgICAgICBQeV9JTkNSRUYodHlwZSk7CiAKLQlpZiAodHlwZS0+dHBfaXRlbXNpemUgPT0gMCkKLQkJUHlPYmplY3RfSU5JVChvYmosIHR5cGUpOwotCWVsc2UKLQkJKHZvaWQpIFB5T2JqZWN0X0lOSVRfVkFSKChQeVZhck9iamVjdCAqKW9iaiwgdHlwZSwgbml0ZW1zKTsKKyAgICBpZiAodHlwZS0+dHBfaXRlbXNpemUgPT0gMCkKKyAgICAgICAgUHlPYmplY3RfSU5JVChvYmosIHR5cGUpOworICAgIGVsc2UKKyAgICAgICAgKHZvaWQpIFB5T2JqZWN0X0lOSVRfVkFSKChQeVZhck9iamVjdCAqKW9iaiwgdHlwZSwgbml0ZW1zKTsKIAotCWlmIChQeVR5cGVfSVNfR0ModHlwZSkpCi0JCV9QeU9iamVjdF9HQ19UUkFDSyhvYmopOwotCXJldHVybiBvYmo7CisgICAgaWYgKFB5VHlwZV9JU19HQyh0eXBlKSkKKyAgICAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKG9iaik7CisgICAgcmV0dXJuIG9iajsKIH0KIAogUHlPYmplY3QgKgogUHlUeXBlX0dlbmVyaWNOZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JcmV0dXJuIHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIHJldHVybiB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKIH0KIAogLyogSGVscGVycyBmb3Igc3VidHlwaW5nICovCkBAIC03NzEsMzQxICs3NzEsMzQxIEBACiBzdGF0aWMgaW50CiB0cmF2ZXJzZV9zbG90cyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlNZW1iZXJEZWYgKm1wOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU1lbWJlckRlZiAqbXA7CiAKLQluID0gUHlfU0laRSh0eXBlKTsKLQltcCA9IFB5SGVhcFR5cGVfR0VUX01FTUJFUlMoKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBtcCsrKSB7Ci0JCWlmIChtcC0+dHlwZSA9PSBUX09CSkVDVF9FWCkgewotCQkJY2hhciAqYWRkciA9IChjaGFyICopc2VsZiArIG1wLT5vZmZzZXQ7Ci0JCQlQeU9iamVjdCAqb2JqID0gKihQeU9iamVjdCAqKilhZGRyOwotCQkJaWYgKG9iaiAhPSBOVUxMKSB7Ci0JCQkJaW50IGVyciA9IHZpc2l0KG9iaiwgYXJnKTsKLQkJCQlpZiAoZXJyKQotCQkJCQlyZXR1cm4gZXJyOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOworICAgIG4gPSBQeV9TSVpFKHR5cGUpOworICAgIG1wID0gUHlIZWFwVHlwZV9HRVRfTUVNQkVSUygoUHlIZWFwVHlwZU9iamVjdCAqKXR5cGUpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyssIG1wKyspIHsKKyAgICAgICAgaWYgKG1wLT50eXBlID09IFRfT0JKRUNUX0VYKSB7CisgICAgICAgICAgICBjaGFyICphZGRyID0gKGNoYXIgKilzZWxmICsgbXAtPm9mZnNldDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvYmogPSAqKFB5T2JqZWN0ICoqKWFkZHI7CisgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyID0gdmlzaXQob2JqLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHN1YnR5cGVfdHJhdmVyc2UoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5VHlwZU9iamVjdCAqdHlwZSwgKmJhc2U7Ci0JdHJhdmVyc2Vwcm9jIGJhc2V0cmF2ZXJzZTsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGUsICpiYXNlOworICAgIHRyYXZlcnNlcHJvYyBiYXNldHJhdmVyc2U7CiAKLQkvKiBGaW5kIHRoZSBuZWFyZXN0IGJhc2Ugd2l0aCBhIGRpZmZlcmVudCB0cF90cmF2ZXJzZSwKLQkgICBhbmQgdHJhdmVyc2Ugc2xvdHMgd2hpbGUgd2UncmUgYXQgaXQgKi8KLQl0eXBlID0gUHlfVFlQRShzZWxmKTsKLQliYXNlID0gdHlwZTsKLQl3aGlsZSAoKGJhc2V0cmF2ZXJzZSA9IGJhc2UtPnRwX3RyYXZlcnNlKSA9PSBzdWJ0eXBlX3RyYXZlcnNlKSB7Ci0JCWlmIChQeV9TSVpFKGJhc2UpKSB7Ci0JCQlpbnQgZXJyID0gdHJhdmVyc2Vfc2xvdHMoYmFzZSwgc2VsZiwgdmlzaXQsIGFyZyk7Ci0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7Ci0JCX0KLQkJYmFzZSA9IGJhc2UtPnRwX2Jhc2U7Ci0JCWFzc2VydChiYXNlKTsKLQl9CisgICAgLyogRmluZCB0aGUgbmVhcmVzdCBiYXNlIHdpdGggYSBkaWZmZXJlbnQgdHBfdHJhdmVyc2UsCisgICAgICAgYW5kIHRyYXZlcnNlIHNsb3RzIHdoaWxlIHdlJ3JlIGF0IGl0ICovCisgICAgdHlwZSA9IFB5X1RZUEUoc2VsZik7CisgICAgYmFzZSA9IHR5cGU7CisgICAgd2hpbGUgKChiYXNldHJhdmVyc2UgPSBiYXNlLT50cF90cmF2ZXJzZSkgPT0gc3VidHlwZV90cmF2ZXJzZSkgeworICAgICAgICBpZiAoUHlfU0laRShiYXNlKSkgeworICAgICAgICAgICAgaW50IGVyciA9IHRyYXZlcnNlX3Nsb3RzKGJhc2UsIHNlbGYsIHZpc2l0LCBhcmcpOworICAgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgICAgICBhc3NlcnQoYmFzZSk7CisgICAgfQogCi0JaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgIT0gYmFzZS0+dHBfZGljdG9mZnNldCkgewotCQlQeU9iamVjdCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihzZWxmKTsKLQkJaWYgKGRpY3RwdHIgJiYgKmRpY3RwdHIpCi0JCQlQeV9WSVNJVCgqZGljdHB0cik7Ci0JfQorICAgIGlmICh0eXBlLT50cF9kaWN0b2Zmc2V0ICE9IGJhc2UtPnRwX2RpY3RvZmZzZXQpIHsKKyAgICAgICAgUHlPYmplY3QgKipkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoc2VsZik7CisgICAgICAgIGlmIChkaWN0cHRyICYmICpkaWN0cHRyKQorICAgICAgICAgICAgUHlfVklTSVQoKmRpY3RwdHIpOworICAgIH0KIAotCWlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCi0JCS8qIEZvciBhIGhlYXB0eXBlLCB0aGUgaW5zdGFuY2VzIGNvdW50IGFzIHJlZmVyZW5jZXMKLQkJICAgdG8gdGhlIHR5cGUuCSBUcmF2ZXJzZSB0aGUgdHlwZSBzbyB0aGUgY29sbGVjdG9yCi0JCSAgIGNhbiBmaW5kIGN5Y2xlcyBpbnZvbHZpbmcgdGhpcyBsaW5rLiAqLwotCQlQeV9WSVNJVCh0eXBlKTsKKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQorICAgICAgICAvKiBGb3IgYSBoZWFwdHlwZSwgdGhlIGluc3RhbmNlcyBjb3VudCBhcyByZWZlcmVuY2VzCisgICAgICAgICAgIHRvIHRoZSB0eXBlLiAgICAgICAgICBUcmF2ZXJzZSB0aGUgdHlwZSBzbyB0aGUgY29sbGVjdG9yCisgICAgICAgICAgIGNhbiBmaW5kIGN5Y2xlcyBpbnZvbHZpbmcgdGhpcyBsaW5rLiAqLworICAgICAgICBQeV9WSVNJVCh0eXBlKTsKIAotCWlmIChiYXNldHJhdmVyc2UpCi0JCXJldHVybiBiYXNldHJhdmVyc2Uoc2VsZiwgdmlzaXQsIGFyZyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGJhc2V0cmF2ZXJzZSkKKyAgICAgICAgcmV0dXJuIGJhc2V0cmF2ZXJzZShzZWxmLCB2aXNpdCwgYXJnKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIGNsZWFyX3Nsb3RzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlfc3NpemVfdCBpLCBuOwotCVB5TWVtYmVyRGVmICptcDsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlNZW1iZXJEZWYgKm1wOwogCi0JbiA9IFB5X1NJWkUodHlwZSk7Ci0JbXAgPSBQeUhlYXBUeXBlX0dFVF9NRU1CRVJTKChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZSk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKywgbXArKykgewotCQlpZiAobXAtPnR5cGUgPT0gVF9PQkpFQ1RfRVggJiYgIShtcC0+ZmxhZ3MgJiBSRUFET05MWSkpIHsKLQkJCWNoYXIgKmFkZHIgPSAoY2hhciAqKXNlbGYgKyBtcC0+b2Zmc2V0OwotCQkJUHlPYmplY3QgKm9iaiA9ICooUHlPYmplY3QgKiopYWRkcjsKLQkJCWlmIChvYmogIT0gTlVMTCkgewotCQkJCSooUHlPYmplY3QgKiopYWRkciA9IE5VTEw7Ci0JCQkJUHlfREVDUkVGKG9iaik7Ci0JCQl9Ci0JCX0KLQl9CisgICAgbiA9IFB5X1NJWkUodHlwZSk7CisgICAgbXAgPSBQeUhlYXBUeXBlX0dFVF9NRU1CRVJTKChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZSk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKywgbXArKykgeworICAgICAgICBpZiAobXAtPnR5cGUgPT0gVF9PQkpFQ1RfRVggJiYgIShtcC0+ZmxhZ3MgJiBSRUFET05MWSkpIHsKKyAgICAgICAgICAgIGNoYXIgKmFkZHIgPSAoY2hhciAqKXNlbGYgKyBtcC0+b2Zmc2V0OworICAgICAgICAgICAgUHlPYmplY3QgKm9iaiA9ICooUHlPYmplY3QgKiopYWRkcjsKKyAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICooUHlPYmplY3QgKiopYWRkciA9IE5VTEw7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIHN1YnR5cGVfY2xlYXIoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlLCAqYmFzZTsKLQlpbnF1aXJ5IGJhc2VjbGVhcjsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGUsICpiYXNlOworICAgIGlucXVpcnkgYmFzZWNsZWFyOwogCi0JLyogRmluZCB0aGUgbmVhcmVzdCBiYXNlIHdpdGggYSBkaWZmZXJlbnQgdHBfY2xlYXIKLQkgICBhbmQgY2xlYXIgc2xvdHMgd2hpbGUgd2UncmUgYXQgaXQgKi8KLQl0eXBlID0gUHlfVFlQRShzZWxmKTsKLQliYXNlID0gdHlwZTsKLQl3aGlsZSAoKGJhc2VjbGVhciA9IGJhc2UtPnRwX2NsZWFyKSA9PSBzdWJ0eXBlX2NsZWFyKSB7Ci0JCWlmIChQeV9TSVpFKGJhc2UpKQotCQkJY2xlYXJfc2xvdHMoYmFzZSwgc2VsZik7Ci0JCWJhc2UgPSBiYXNlLT50cF9iYXNlOwotCQlhc3NlcnQoYmFzZSk7Ci0JfQorICAgIC8qIEZpbmQgdGhlIG5lYXJlc3QgYmFzZSB3aXRoIGEgZGlmZmVyZW50IHRwX2NsZWFyCisgICAgICAgYW5kIGNsZWFyIHNsb3RzIHdoaWxlIHdlJ3JlIGF0IGl0ICovCisgICAgdHlwZSA9IFB5X1RZUEUoc2VsZik7CisgICAgYmFzZSA9IHR5cGU7CisgICAgd2hpbGUgKChiYXNlY2xlYXIgPSBiYXNlLT50cF9jbGVhcikgPT0gc3VidHlwZV9jbGVhcikgeworICAgICAgICBpZiAoUHlfU0laRShiYXNlKSkKKyAgICAgICAgICAgIGNsZWFyX3Nsb3RzKGJhc2UsIHNlbGYpOworICAgICAgICBiYXNlID0gYmFzZS0+dHBfYmFzZTsKKyAgICAgICAgYXNzZXJ0KGJhc2UpOworICAgIH0KIAotCS8qIFRoZXJlJ3Mgbm8gbmVlZCB0byBjbGVhciB0aGUgaW5zdGFuY2UgZGljdCAoaWYgYW55KTsKLQkgICB0aGUgY29sbGVjdG9yIHdpbGwgY2FsbCBpdHMgdHBfY2xlYXIgaGFuZGxlci4gKi8KKyAgICAvKiBUaGVyZSdzIG5vIG5lZWQgdG8gY2xlYXIgdGhlIGluc3RhbmNlIGRpY3QgKGlmIGFueSk7CisgICAgICAgdGhlIGNvbGxlY3RvciB3aWxsIGNhbGwgaXRzIHRwX2NsZWFyIGhhbmRsZXIuICovCiAKLQlpZiAoYmFzZWNsZWFyKQotCQlyZXR1cm4gYmFzZWNsZWFyKHNlbGYpOwotCXJldHVybiAwOworICAgIGlmIChiYXNlY2xlYXIpCisgICAgICAgIHJldHVybiBiYXNlY2xlYXIoc2VsZik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBzdWJ0eXBlX2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlLCAqYmFzZTsKLQlkZXN0cnVjdG9yIGJhc2VkZWFsbG9jOworICAgIFB5VHlwZU9iamVjdCAqdHlwZSwgKmJhc2U7CisgICAgZGVzdHJ1Y3RvciBiYXNlZGVhbGxvYzsKIAotCS8qIEV4dHJhY3QgdGhlIHR5cGU7IHdlIGV4cGVjdCBpdCB0byBiZSBhIGhlYXAgdHlwZSAqLwotCXR5cGUgPSBQeV9UWVBFKHNlbGYpOwotCWFzc2VydCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpOworICAgIC8qIEV4dHJhY3QgdGhlIHR5cGU7IHdlIGV4cGVjdCBpdCB0byBiZSBhIGhlYXAgdHlwZSAqLworICAgIHR5cGUgPSBQeV9UWVBFKHNlbGYpOworICAgIGFzc2VydCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpOwogCi0JLyogVGVzdCB3aGV0aGVyIHRoZSB0eXBlIGhhcyBHQyBleGFjdGx5IG9uY2UgKi8KKyAgICAvKiBUZXN0IHdoZXRoZXIgdGhlIHR5cGUgaGFzIEdDIGV4YWN0bHkgb25jZSAqLwogCi0JaWYgKCFQeVR5cGVfSVNfR0ModHlwZSkpIHsKLQkJLyogSXQncyByZWFsbHkgcmFyZSB0byBmaW5kIGEgZHluYW1pYyB0eXBlIHRoYXQgZG9lc24ndCBoYXZlCi0JCSAgIEdDOyBpdCBjYW4gb25seSBoYXBwZW4gd2hlbiBkZXJpdmluZyBmcm9tICdvYmplY3QnIGFuZCBub3QKLQkJICAgYWRkaW5nIGFueSBzbG90cyBvciBpbnN0YW5jZSB2YXJpYWJsZXMuICBUaGlzIGFsbG93cwotCQkgICBjZXJ0YWluIHNpbXBsaWZpY2F0aW9uczogdGhlcmUncyBubyBuZWVkIHRvIGNhbGwKLQkJICAgY2xlYXJfc2xvdHMoKSwgb3IgREVDUkVGIHRoZSBkaWN0LCBvciBjbGVhciB3ZWFrcmVmcy4gKi8KKyAgICBpZiAoIVB5VHlwZV9JU19HQyh0eXBlKSkgeworICAgICAgICAvKiBJdCdzIHJlYWxseSByYXJlIHRvIGZpbmQgYSBkeW5hbWljIHR5cGUgdGhhdCBkb2Vzbid0IGhhdmUKKyAgICAgICAgICAgR0M7IGl0IGNhbiBvbmx5IGhhcHBlbiB3aGVuIGRlcml2aW5nIGZyb20gJ29iamVjdCcgYW5kIG5vdAorICAgICAgICAgICBhZGRpbmcgYW55IHNsb3RzIG9yIGluc3RhbmNlIHZhcmlhYmxlcy4gIFRoaXMgYWxsb3dzCisgICAgICAgICAgIGNlcnRhaW4gc2ltcGxpZmljYXRpb25zOiB0aGVyZSdzIG5vIG5lZWQgdG8gY2FsbAorICAgICAgICAgICBjbGVhcl9zbG90cygpLCBvciBERUNSRUYgdGhlIGRpY3QsIG9yIGNsZWFyIHdlYWtyZWZzLiAqLwogCi0JCS8qIE1heWJlIGNhbGwgZmluYWxpemVyOyBleGl0IGVhcmx5IGlmIHJlc3VycmVjdGVkICovCi0JCWlmICh0eXBlLT50cF9kZWwpIHsKLQkJCXR5cGUtPnRwX2RlbChzZWxmKTsKLQkJCWlmIChzZWxmLT5vYl9yZWZjbnQgPiAwKQotCQkJCXJldHVybjsKLQkJfQorICAgICAgICAvKiBNYXliZSBjYWxsIGZpbmFsaXplcjsgZXhpdCBlYXJseSBpZiByZXN1cnJlY3RlZCAqLworICAgICAgICBpZiAodHlwZS0+dHBfZGVsKSB7CisgICAgICAgICAgICB0eXBlLT50cF9kZWwoc2VsZik7CisgICAgICAgICAgICBpZiAoc2VsZi0+b2JfcmVmY250ID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotCQkvKiBGaW5kIHRoZSBuZWFyZXN0IGJhc2Ugd2l0aCBhIGRpZmZlcmVudCB0cF9kZWFsbG9jICovCi0JCWJhc2UgPSB0eXBlOwotCQl3aGlsZSAoKGJhc2VkZWFsbG9jID0gYmFzZS0+dHBfZGVhbGxvYykgPT0gc3VidHlwZV9kZWFsbG9jKSB7Ci0JCQlhc3NlcnQoUHlfU0laRShiYXNlKSA9PSAwKTsKLQkJCWJhc2UgPSBiYXNlLT50cF9iYXNlOwotCQkJYXNzZXJ0KGJhc2UpOwotCQl9CisgICAgICAgIC8qIEZpbmQgdGhlIG5lYXJlc3QgYmFzZSB3aXRoIGEgZGlmZmVyZW50IHRwX2RlYWxsb2MgKi8KKyAgICAgICAgYmFzZSA9IHR5cGU7CisgICAgICAgIHdoaWxlICgoYmFzZWRlYWxsb2MgPSBiYXNlLT50cF9kZWFsbG9jKSA9PSBzdWJ0eXBlX2RlYWxsb2MpIHsKKyAgICAgICAgICAgIGFzc2VydChQeV9TSVpFKGJhc2UpID09IDApOworICAgICAgICAgICAgYmFzZSA9IGJhc2UtPnRwX2Jhc2U7CisgICAgICAgICAgICBhc3NlcnQoYmFzZSk7CisgICAgICAgIH0KIAotCQkvKiBFeHRyYWN0IHRoZSB0eXBlIGFnYWluOyB0cF9kZWwgbWF5IGhhdmUgY2hhbmdlZCBpdCAqLwotCQl0eXBlID0gUHlfVFlQRShzZWxmKTsKKyAgICAgICAgLyogRXh0cmFjdCB0aGUgdHlwZSBhZ2FpbjsgdHBfZGVsIG1heSBoYXZlIGNoYW5nZWQgaXQgKi8KKyAgICAgICAgdHlwZSA9IFB5X1RZUEUoc2VsZik7CiAKLQkJLyogQ2FsbCB0aGUgYmFzZSB0cF9kZWFsbG9jKCkgKi8KLQkJYXNzZXJ0KGJhc2VkZWFsbG9jKTsKLQkJYmFzZWRlYWxsb2Moc2VsZik7CisgICAgICAgIC8qIENhbGwgdGhlIGJhc2UgdHBfZGVhbGxvYygpICovCisgICAgICAgIGFzc2VydChiYXNlZGVhbGxvYyk7CisgICAgICAgIGJhc2VkZWFsbG9jKHNlbGYpOwogCi0JCS8qIENhbid0IHJlZmVyZW5jZSBzZWxmIGJleW9uZCB0aGlzIHBvaW50ICovCi0JCVB5X0RFQ1JFRih0eXBlKTsKKyAgICAgICAgLyogQ2FuJ3QgcmVmZXJlbmNlIHNlbGYgYmV5b25kIHRoaXMgcG9pbnQgKi8KKyAgICAgICAgUHlfREVDUkVGKHR5cGUpOwogCi0JCS8qIERvbmUgKi8KLQkJcmV0dXJuOwotCX0KKyAgICAgICAgLyogRG9uZSAqLworICAgICAgICByZXR1cm47CisgICAgfQogCi0JLyogV2UgZ2V0IGhlcmUgb25seSBpZiB0aGUgdHlwZSBoYXMgR0MgKi8KKyAgICAvKiBXZSBnZXQgaGVyZSBvbmx5IGlmIHRoZSB0eXBlIGhhcyBHQyAqLwogCi0JLyogVW5UcmFjayBhbmQgcmUtVHJhY2sgYXJvdW5kIHRoZSB0cmFzaGNhbiBtYWNybywgYWxhcyAqLwotCS8qIFNlZSBleHBsYW5hdGlvbiBhdCBlbmQgb2YgZnVuY3Rpb24gZm9yIGZ1bGwgZGlzY2xvc3VyZSAqLwotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0JKytfUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKLQlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHNlbGYpOwotCS0tX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7Ci0JLyogRE8gTk9UIHJlc3RvcmUgR0MgdHJhY2tpbmcgYXQgdGhpcyBwb2ludC4gIHdlYWtyZWYgY2FsbGJhY2tzCi0JICogKGlmIGFueSwgYW5kIHdoZXRoZXIgZGlyZWN0bHkgaGVyZSBvciBpbmRpcmVjdGx5IGluIHNvbWV0aGluZyB3ZQotCSAqIGNhbGwpIG1heSB0cmlnZ2VyIEdDLCBhbmQgaWYgc2VsZiBpcyB0cmFja2VkIGF0IHRoYXQgcG9pbnQsIGl0Ci0JICogd2lsbCBsb29rIGxpa2UgdHJhc2ggdG8gR0MgYW5kIEdDIHdpbGwgdHJ5IHRvIGRlbGV0ZSBzZWxmIGFnYWluLgotCSAqLworICAgIC8qIFVuVHJhY2sgYW5kIHJlLVRyYWNrIGFyb3VuZCB0aGUgdHJhc2hjYW4gbWFjcm8sIGFsYXMgKi8KKyAgICAvKiBTZWUgZXhwbGFuYXRpb24gYXQgZW5kIG9mIGZ1bmN0aW9uIGZvciBmdWxsIGRpc2Nsb3N1cmUgKi8KKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworICAgICsrX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihzZWxmKTsKKyAgICAtLV9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgIC8qIERPIE5PVCByZXN0b3JlIEdDIHRyYWNraW5nIGF0IHRoaXMgcG9pbnQuICB3ZWFrcmVmIGNhbGxiYWNrcworICAgICAqIChpZiBhbnksIGFuZCB3aGV0aGVyIGRpcmVjdGx5IGhlcmUgb3IgaW5kaXJlY3RseSBpbiBzb21ldGhpbmcgd2UKKyAgICAgKiBjYWxsKSBtYXkgdHJpZ2dlciBHQywgYW5kIGlmIHNlbGYgaXMgdHJhY2tlZCBhdCB0aGF0IHBvaW50LCBpdAorICAgICAqIHdpbGwgbG9vayBsaWtlIHRyYXNoIHRvIEdDIGFuZCBHQyB3aWxsIHRyeSB0byBkZWxldGUgc2VsZiBhZ2Fpbi4KKyAgICAgKi8KIAotCS8qIEZpbmQgdGhlIG5lYXJlc3QgYmFzZSB3aXRoIGEgZGlmZmVyZW50IHRwX2RlYWxsb2MgKi8KLQliYXNlID0gdHlwZTsKLQl3aGlsZSAoKGJhc2VkZWFsbG9jID0gYmFzZS0+dHBfZGVhbGxvYykgPT0gc3VidHlwZV9kZWFsbG9jKSB7Ci0JCWJhc2UgPSBiYXNlLT50cF9iYXNlOwotCQlhc3NlcnQoYmFzZSk7Ci0JfQorICAgIC8qIEZpbmQgdGhlIG5lYXJlc3QgYmFzZSB3aXRoIGEgZGlmZmVyZW50IHRwX2RlYWxsb2MgKi8KKyAgICBiYXNlID0gdHlwZTsKKyAgICB3aGlsZSAoKGJhc2VkZWFsbG9jID0gYmFzZS0+dHBfZGVhbGxvYykgPT0gc3VidHlwZV9kZWFsbG9jKSB7CisgICAgICAgIGJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgICAgICBhc3NlcnQoYmFzZSk7CisgICAgfQogCi0JLyogSWYgd2UgYWRkZWQgYSB3ZWFrbGlzdCwgd2UgY2xlYXIgaXQuCSBEbyB0aGlzICpiZWZvcmUqIGNhbGxpbmcKLQkgICB0aGUgZmluYWxpemVyIChfX2RlbF9fKSwgY2xlYXJpbmcgc2xvdHMsIG9yIGNsZWFyaW5nIHRoZSBpbnN0YW5jZQotCSAgIGRpY3QuICovCisgICAgLyogSWYgd2UgYWRkZWQgYSB3ZWFrbGlzdCwgd2UgY2xlYXIgaXQuICAgICAgRG8gdGhpcyAqYmVmb3JlKiBjYWxsaW5nCisgICAgICAgdGhlIGZpbmFsaXplciAoX19kZWxfXyksIGNsZWFyaW5nIHNsb3RzLCBvciBjbGVhcmluZyB0aGUgaW5zdGFuY2UKKyAgICAgICBkaWN0LiAqLwogCi0JaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmICFiYXNlLT50cF93ZWFrbGlzdG9mZnNldCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcyhzZWxmKTsKKyAgICBpZiAodHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgJiYgIWJhc2UtPnRwX3dlYWtsaXN0b2Zmc2V0KQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKHNlbGYpOwogCi0JLyogTWF5YmUgY2FsbCBmaW5hbGl6ZXI7IGV4aXQgZWFybHkgaWYgcmVzdXJyZWN0ZWQgKi8KLQlpZiAodHlwZS0+dHBfZGVsKSB7Ci0JCV9QeU9iamVjdF9HQ19UUkFDSyhzZWxmKTsKLQkJdHlwZS0+dHBfZGVsKHNlbGYpOwotCQlpZiAoc2VsZi0+b2JfcmVmY250ID4gMCkKLQkJCWdvdG8gZW5kbGFiZWw7CS8qIHJlc3VycmVjdGVkICovCi0JCWVsc2UKLQkJCV9QeU9iamVjdF9HQ19VTlRSQUNLKHNlbGYpOwotCQkvKiBOZXcgd2Vha3JlZnMgY291bGQgYmUgY3JlYXRlZCBkdXJpbmcgdGhlIGZpbmFsaXplciBjYWxsLgotCQkgICAgSWYgdGhpcyBvY2N1cnMsIGNsZWFyIHRoZW0gb3V0IHdpdGhvdXQgY2FsbGluZyB0aGVpcgotCQkgICAgZmluYWxpemVycyBzaW5jZSB0aGV5IG1pZ2h0IHJlbHkgb24gcGFydCBvZiB0aGUgb2JqZWN0Ci0JCSAgICBiZWluZyBmaW5hbGl6ZWQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZC4gKi8KLQkJaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmICFiYXNlLT50cF93ZWFrbGlzdG9mZnNldCkgewotCQkJLyogTW9kZWxlZCBhZnRlciBHRVRfV0VBS1JFRlNfTElTVFBUUigpICovCi0JCQlQeVdlYWtSZWZlcmVuY2UgKipsaXN0ID0gKFB5V2Vha1JlZmVyZW5jZSAqKikgXAotCQkJCVB5T2JqZWN0X0dFVF9XRUFLUkVGU19MSVNUUFRSKHNlbGYpOwotCQkJd2hpbGUgKCpsaXN0KQotCQkJCV9QeVdlYWtyZWZfQ2xlYXJSZWYoKmxpc3QpOwotCQl9Ci0JfQorICAgIC8qIE1heWJlIGNhbGwgZmluYWxpemVyOyBleGl0IGVhcmx5IGlmIHJlc3VycmVjdGVkICovCisgICAgaWYgKHR5cGUtPnRwX2RlbCkgeworICAgICAgICBfUHlPYmplY3RfR0NfVFJBQ0soc2VsZik7CisgICAgICAgIHR5cGUtPnRwX2RlbChzZWxmKTsKKyAgICAgICAgaWYgKHNlbGYtPm9iX3JlZmNudCA+IDApCisgICAgICAgICAgICBnb3RvIGVuZGxhYmVsOyAgICAgICAgICAgICAgLyogcmVzdXJyZWN0ZWQgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soc2VsZik7CisgICAgICAgIC8qIE5ldyB3ZWFrcmVmcyBjb3VsZCBiZSBjcmVhdGVkIGR1cmluZyB0aGUgZmluYWxpemVyIGNhbGwuCisgICAgICAgICAgICBJZiB0aGlzIG9jY3VycywgY2xlYXIgdGhlbSBvdXQgd2l0aG91dCBjYWxsaW5nIHRoZWlyCisgICAgICAgICAgICBmaW5hbGl6ZXJzIHNpbmNlIHRoZXkgbWlnaHQgcmVseSBvbiBwYXJ0IG9mIHRoZSBvYmplY3QKKyAgICAgICAgICAgIGJlaW5nIGZpbmFsaXplZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLiAqLworICAgICAgICBpZiAodHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgJiYgIWJhc2UtPnRwX3dlYWtsaXN0b2Zmc2V0KSB7CisgICAgICAgICAgICAvKiBNb2RlbGVkIGFmdGVyIEdFVF9XRUFLUkVGU19MSVNUUFRSKCkgKi8KKyAgICAgICAgICAgIFB5V2Vha1JlZmVyZW5jZSAqKmxpc3QgPSAoUHlXZWFrUmVmZXJlbmNlICoqKSBcCisgICAgICAgICAgICAgICAgUHlPYmplY3RfR0VUX1dFQUtSRUZTX0xJU1RQVFIoc2VsZik7CisgICAgICAgICAgICB3aGlsZSAoKmxpc3QpCisgICAgICAgICAgICAgICAgX1B5V2Vha3JlZl9DbGVhclJlZigqbGlzdCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiAgQ2xlYXIgc2xvdHMgdXAgdG8gdGhlIG5lYXJlc3QgYmFzZSB3aXRoIGEgZGlmZmVyZW50IHRwX2RlYWxsb2MgKi8KLQliYXNlID0gdHlwZTsKLQl3aGlsZSAoYmFzZS0+dHBfZGVhbGxvYyA9PSBzdWJ0eXBlX2RlYWxsb2MpIHsKLQkJaWYgKFB5X1NJWkUoYmFzZSkpCi0JCQljbGVhcl9zbG90cyhiYXNlLCBzZWxmKTsKLQkJYmFzZSA9IGJhc2UtPnRwX2Jhc2U7Ci0JCWFzc2VydChiYXNlKTsKLQl9CisgICAgLyogIENsZWFyIHNsb3RzIHVwIHRvIHRoZSBuZWFyZXN0IGJhc2Ugd2l0aCBhIGRpZmZlcmVudCB0cF9kZWFsbG9jICovCisgICAgYmFzZSA9IHR5cGU7CisgICAgd2hpbGUgKGJhc2UtPnRwX2RlYWxsb2MgPT0gc3VidHlwZV9kZWFsbG9jKSB7CisgICAgICAgIGlmIChQeV9TSVpFKGJhc2UpKQorICAgICAgICAgICAgY2xlYXJfc2xvdHMoYmFzZSwgc2VsZik7CisgICAgICAgIGJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgICAgICBhc3NlcnQoYmFzZSk7CisgICAgfQogCi0JLyogSWYgd2UgYWRkZWQgYSBkaWN0LCBERUNSRUYgaXQgKi8KLQlpZiAodHlwZS0+dHBfZGljdG9mZnNldCAmJiAhYmFzZS0+dHBfZGljdG9mZnNldCkgewotCQlQeU9iamVjdCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihzZWxmKTsKLQkJaWYgKGRpY3RwdHIgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKmRpY3QgPSAqZGljdHB0cjsKLQkJCWlmIChkaWN0ICE9IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoZGljdCk7Ci0JCQkJKmRpY3RwdHIgPSBOVUxMOwotCQkJfQotCQl9Ci0JfQorICAgIC8qIElmIHdlIGFkZGVkIGEgZGljdCwgREVDUkVGIGl0ICovCisgICAgaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgJiYgIWJhc2UtPnRwX2RpY3RvZmZzZXQpIHsKKyAgICAgICAgUHlPYmplY3QgKipkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoc2VsZik7CisgICAgICAgIGlmIChkaWN0cHRyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpkaWN0ID0gKmRpY3RwdHI7CisgICAgICAgICAgICBpZiAoZGljdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICAgICAgICAgICpkaWN0cHRyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qIEV4dHJhY3QgdGhlIHR5cGUgYWdhaW47IHRwX2RlbCBtYXkgaGF2ZSBjaGFuZ2VkIGl0ICovCi0JdHlwZSA9IFB5X1RZUEUoc2VsZik7CisgICAgLyogRXh0cmFjdCB0aGUgdHlwZSBhZ2FpbjsgdHBfZGVsIG1heSBoYXZlIGNoYW5nZWQgaXQgKi8KKyAgICB0eXBlID0gUHlfVFlQRShzZWxmKTsKIAotCS8qIENhbGwgdGhlIGJhc2UgdHBfZGVhbGxvYygpOyBmaXJzdCByZXRyYWNrIHNlbGYgaWYKLQkgKiBiYXNlZGVhbGxvYyBrbm93cyBhYm91dCBnYy4KLQkgKi8KLQlpZiAoUHlUeXBlX0lTX0dDKGJhc2UpKQotCQlfUHlPYmplY3RfR0NfVFJBQ0soc2VsZik7Ci0JYXNzZXJ0KGJhc2VkZWFsbG9jKTsKLQliYXNlZGVhbGxvYyhzZWxmKTsKKyAgICAvKiBDYWxsIHRoZSBiYXNlIHRwX2RlYWxsb2MoKTsgZmlyc3QgcmV0cmFjayBzZWxmIGlmCisgICAgICogYmFzZWRlYWxsb2Mga25vd3MgYWJvdXQgZ2MuCisgICAgICovCisgICAgaWYgKFB5VHlwZV9JU19HQyhiYXNlKSkKKyAgICAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKHNlbGYpOworICAgIGFzc2VydChiYXNlZGVhbGxvYyk7CisgICAgYmFzZWRlYWxsb2Moc2VsZik7CiAKLQkvKiBDYW4ndCByZWZlcmVuY2Ugc2VsZiBiZXlvbmQgdGhpcyBwb2ludCAqLwotCVB5X0RFQ1JFRih0eXBlKTsKKyAgICAvKiBDYW4ndCByZWZlcmVuY2Ugc2VsZiBiZXlvbmQgdGhpcyBwb2ludCAqLworICAgIFB5X0RFQ1JFRih0eXBlKTsKIAogICBlbmRsYWJlbDoKLQkrK19QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOwotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKHNlbGYpOwotCS0tX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7CisgICAgKytfUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0VORChzZWxmKTsKKyAgICAtLV9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOwogCi0JLyogRXhwbGFuYXRpb24gb2YgdGhlIHdlaXJkbmVzcyBhcm91bmQgdGhlIHRyYXNoY2FuIG1hY3JvczoKKyAgICAvKiBFeHBsYW5hdGlvbiBvZiB0aGUgd2VpcmRuZXNzIGFyb3VuZCB0aGUgdHJhc2hjYW4gbWFjcm9zOgogCi0JICAgUS4gV2hhdCBkbyB0aGUgdHJhc2hjYW4gbWFjcm9zIGRvPworICAgICAgIFEuIFdoYXQgZG8gdGhlIHRyYXNoY2FuIG1hY3JvcyBkbz8KIAotCSAgIEEuIFJlYWQgdGhlIGNvbW1lbnQgdGl0bGVkICJUcmFzaGNhbiBtZWNoYW5pc20iIGluIG9iamVjdC5oLgotCSAgICAgIEZvciBvbmUsIHRoaXMgZXhwbGFpbnMgd2h5IHRoZXJlIG11c3QgYmUgYSBjYWxsIHRvIEdDLXVudHJhY2sKLQkgICAgICBiZWZvcmUgdGhlIHRyYXNoY2FuIGJlZ2luIG1hY3JvLglXaXRob3V0IHVuZGVyc3RhbmRpbmcgdGhlCi0JICAgICAgdHJhc2hjYW4gY29kZSwgdGhlIGFuc3dlcnMgdG8gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMgZG9uJ3QgbWFrZQotCSAgICAgIHNlbnNlLgorICAgICAgIEEuIFJlYWQgdGhlIGNvbW1lbnQgdGl0bGVkICJUcmFzaGNhbiBtZWNoYW5pc20iIGluIG9iamVjdC5oLgorICAgICAgICAgIEZvciBvbmUsIHRoaXMgZXhwbGFpbnMgd2h5IHRoZXJlIG11c3QgYmUgYSBjYWxsIHRvIEdDLXVudHJhY2sKKyAgICAgICAgICBiZWZvcmUgdGhlIHRyYXNoY2FuIGJlZ2luIG1hY3JvLiAgICAgIFdpdGhvdXQgdW5kZXJzdGFuZGluZyB0aGUKKyAgICAgICAgICB0cmFzaGNhbiBjb2RlLCB0aGUgYW5zd2VycyB0byB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucyBkb24ndCBtYWtlCisgICAgICAgICAgc2Vuc2UuCiAKLQkgICBRLiBXaHkgZG8gd2UgR0MtdW50cmFjayBiZWZvcmUgdGhlIHRyYXNoY2FuIGFuZCB0aGVuIGltbWVkaWF0ZWx5Ci0JICAgICAgR0MtdHJhY2sgYWdhaW4gYWZ0ZXJ3YXJkPworICAgICAgIFEuIFdoeSBkbyB3ZSBHQy11bnRyYWNrIGJlZm9yZSB0aGUgdHJhc2hjYW4gYW5kIHRoZW4gaW1tZWRpYXRlbHkKKyAgICAgICAgICBHQy10cmFjayBhZ2FpbiBhZnRlcndhcmQ/CiAKLQkgICBBLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBiYXNlIGNsYXNzIGlzIEdDLWF3YXJlLCB0aGUgYmFzZSBjbGFzcwotCSAgICAgIHByb2JhYmx5IEdDLXVudHJhY2tzIHRoZSBvYmplY3QuCUlmIGl0IGRvZXMgdGhhdCB1c2luZyB0aGUKLQkgICAgICBVTlRSQUNLIG1hY3JvLCB0aGlzIHdpbGwgY3Jhc2ggd2hlbiB0aGUgb2JqZWN0IGlzIGFscmVhZHkKLQkgICAgICB1bnRyYWNrZWQuICBCZWNhdXNlIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgYmFzZSBjbGFzcyBkb2VzLCB0aGUKLQkgICAgICBvbmx5IHNhZmUgdGhpbmcgaXMgdG8gbWFrZSBzdXJlIHRoZSBvYmplY3QgaXMgdHJhY2tlZCB3aGVuIHdlCi0JICAgICAgY2FsbCB0aGUgYmFzZSBjbGFzcyBkZWFsbG9jLiAgQnV0Li4uICBUaGUgdHJhc2hjYW4gYmVnaW4gbWFjcm8KLQkgICAgICByZXF1aXJlcyB0aGF0IHRoZSBvYmplY3QgaXMgKnVudHJhY2tlZCogYmVmb3JlIGl0IGlzIGNhbGxlZC4gIFNvCi0JICAgICAgdGhlIGRhbmNlIGJlY29tZXM6CisgICAgICAgQS4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgYmFzZSBjbGFzcyBpcyBHQy1hd2FyZSwgdGhlIGJhc2UgY2xhc3MKKyAgICAgICAgICBwcm9iYWJseSBHQy11bnRyYWNrcyB0aGUgb2JqZWN0LiAgICAgIElmIGl0IGRvZXMgdGhhdCB1c2luZyB0aGUKKyAgICAgICAgICBVTlRSQUNLIG1hY3JvLCB0aGlzIHdpbGwgY3Jhc2ggd2hlbiB0aGUgb2JqZWN0IGlzIGFscmVhZHkKKyAgICAgICAgICB1bnRyYWNrZWQuICBCZWNhdXNlIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgYmFzZSBjbGFzcyBkb2VzLCB0aGUKKyAgICAgICAgICBvbmx5IHNhZmUgdGhpbmcgaXMgdG8gbWFrZSBzdXJlIHRoZSBvYmplY3QgaXMgdHJhY2tlZCB3aGVuIHdlCisgICAgICAgICAgY2FsbCB0aGUgYmFzZSBjbGFzcyBkZWFsbG9jLiAgQnV0Li4uICBUaGUgdHJhc2hjYW4gYmVnaW4gbWFjcm8KKyAgICAgICAgICByZXF1aXJlcyB0aGF0IHRoZSBvYmplY3QgaXMgKnVudHJhY2tlZCogYmVmb3JlIGl0IGlzIGNhbGxlZC4gIFNvCisgICAgICAgICAgdGhlIGRhbmNlIGJlY29tZXM6CiAKLQkJIEdDIHVudHJhY2sKLQkJIHRyYXNoY2FuIGJlZ2luCi0JCSBHQyB0cmFjaworICAgICAgICAgR0MgdW50cmFjaworICAgICAgICAgdHJhc2hjYW4gYmVnaW4KKyAgICAgICAgIEdDIHRyYWNrCiAKLQkgICBRLiBXaHkgZGlkIHRoZSBsYXN0IHF1ZXN0aW9uIHNheSAiaW1tZWRpYXRlbHkgR0MtdHJhY2sgYWdhaW4iPwotCSAgICAgIEl0J3Mgbm93aGVyZSBuZWFyIGltbWVkaWF0ZWx5LgorICAgICAgIFEuIFdoeSBkaWQgdGhlIGxhc3QgcXVlc3Rpb24gc2F5ICJpbW1lZGlhdGVseSBHQy10cmFjayBhZ2FpbiI/CisgICAgICAgICAgSXQncyBub3doZXJlIG5lYXIgaW1tZWRpYXRlbHkuCiAKLQkgICBBLiBCZWNhdXNlIHRoZSBjb2RlICp1c2VkKiB0byByZS10cmFjayBpbW1lZGlhdGVseS4JQmFkIElkZWEuCi0JICAgICAgc2VsZiBoYXMgYSByZWZjb3VudCBvZiAwLCBhbmQgaWYgZ2MgZXZlciBnZXRzIGl0cyBoYW5kcyBvbiBpdAotCSAgICAgICh3aGljaCBjYW4gaGFwcGVuIGlmIGFueSB3ZWFrcmVmIGNhbGxiYWNrIGdldHMgaW52b2tlZCksIGl0Ci0JICAgICAgbG9va3MgbGlrZSB0cmFzaCB0byBnYyB0b28sIGFuZCBnYyBhbHNvIHRyaWVzIHRvIGRlbGV0ZSBzZWxmCi0JICAgICAgdGhlbi4gIEJ1dCB3ZSdyZSBhbHJlYWR5IGRlbGV0aW5nIHNlbGYuICBEb3VibGUgZGVhbGxvY3Rpb24gaXMKLQkgICAgICBhIHN1YnRsZSBkaXNhc3Rlci4KKyAgICAgICBBLiBCZWNhdXNlIHRoZSBjb2RlICp1c2VkKiB0byByZS10cmFjayBpbW1lZGlhdGVseS4gICAgICBCYWQgSWRlYS4KKyAgICAgICAgICBzZWxmIGhhcyBhIHJlZmNvdW50IG9mIDAsIGFuZCBpZiBnYyBldmVyIGdldHMgaXRzIGhhbmRzIG9uIGl0CisgICAgICAgICAgKHdoaWNoIGNhbiBoYXBwZW4gaWYgYW55IHdlYWtyZWYgY2FsbGJhY2sgZ2V0cyBpbnZva2VkKSwgaXQKKyAgICAgICAgICBsb29rcyBsaWtlIHRyYXNoIHRvIGdjIHRvbywgYW5kIGdjIGFsc28gdHJpZXMgdG8gZGVsZXRlIHNlbGYKKyAgICAgICAgICB0aGVuLiAgQnV0IHdlJ3JlIGFscmVhZHkgZGVsZXRpbmcgc2VsZi4gIERvdWJsZSBkZWFsbG9jdGlvbiBpcworICAgICAgICAgIGEgc3VidGxlIGRpc2FzdGVyLgogCi0JICAgUS4gV2h5IHRoZSBiaXphcnJlIChuZXQtemVybykgbWFuaXB1bGF0aW9uIG9mCi0JICAgICAgX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgYXJvdW5kIHRoZSB0cmFzaGNhbiBtYWNyb3M/CisgICAgICAgUS4gV2h5IHRoZSBiaXphcnJlIChuZXQtemVybykgbWFuaXB1bGF0aW9uIG9mCisgICAgICAgICAgX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgYXJvdW5kIHRoZSB0cmFzaGNhbiBtYWNyb3M/CiAKLQkgICBBLiBTb21lIGJhc2UgY2xhc3NlcyAoZS5nLiBsaXN0KSBhbHNvIHVzZSB0aGUgdHJhc2hjYW4gbWVjaGFuaXNtLgotCSAgICAgIFRoZSBmb2xsb3dpbmcgc2NlbmFyaW8gdXNlZCB0byBiZSBwb3NzaWJsZToKKyAgICAgICBBLiBTb21lIGJhc2UgY2xhc3NlcyAoZS5nLiBsaXN0KSBhbHNvIHVzZSB0aGUgdHJhc2hjYW4gbWVjaGFuaXNtLgorICAgICAgICAgIFRoZSBmb2xsb3dpbmcgc2NlbmFyaW8gdXNlZCB0byBiZSBwb3NzaWJsZToKIAotCSAgICAgIC0gc3VwcG9zZSB0aGUgdHJhc2hjYW4gbGV2ZWwgaXMgb25lIGJlbG93IHRoZSB0cmFzaGNhbiBsaW1pdAorICAgICAgICAgIC0gc3VwcG9zZSB0aGUgdHJhc2hjYW4gbGV2ZWwgaXMgb25lIGJlbG93IHRoZSB0cmFzaGNhbiBsaW1pdAogCi0JICAgICAgLSBzdWJ0eXBlX2RlYWxsb2MoKSBpcyBjYWxsZWQKKyAgICAgICAgICAtIHN1YnR5cGVfZGVhbGxvYygpIGlzIGNhbGxlZAogCi0JICAgICAgLSB0aGUgdHJhc2hjYW4gbGltaXQgaXMgbm90IHlldCByZWFjaGVkLCBzbyB0aGUgdHJhc2hjYW4gbGV2ZWwKLQkJaXMgaW5jcmVtZW50ZWQgYW5kIHRoZSBjb2RlIGJldHdlZW4gdHJhc2hjYW4gYmVnaW4gYW5kIGVuZCBpcwotCQlleGVjdXRlZAorICAgICAgICAgIC0gdGhlIHRyYXNoY2FuIGxpbWl0IGlzIG5vdCB5ZXQgcmVhY2hlZCwgc28gdGhlIHRyYXNoY2FuIGxldmVsCisgICAgICAgIGlzIGluY3JlbWVudGVkIGFuZCB0aGUgY29kZSBiZXR3ZWVuIHRyYXNoY2FuIGJlZ2luIGFuZCBlbmQgaXMKKyAgICAgICAgZXhlY3V0ZWQKIAotCSAgICAgIC0gdGhpcyBkZXN0cm95cyBtdWNoIG9mIHRoZSBvYmplY3QncyBjb250ZW50cywgaW5jbHVkaW5nIGl0cwotCQlzbG90cyBhbmQgX19kaWN0X18KKyAgICAgICAgICAtIHRoaXMgZGVzdHJveXMgbXVjaCBvZiB0aGUgb2JqZWN0J3MgY29udGVudHMsIGluY2x1ZGluZyBpdHMKKyAgICAgICAgc2xvdHMgYW5kIF9fZGljdF9fCiAKLQkgICAgICAtIGJhc2VkZWFsbG9jKCkgaXMgY2FsbGVkOyB0aGlzIGlzIHJlYWxseSBsaXN0X2RlYWxsb2MoKSwgb3IKLQkJc29tZSBvdGhlciB0eXBlIHdoaWNoIGFsc28gdXNlcyB0aGUgdHJhc2hjYW4gbWFjcm9zCisgICAgICAgICAgLSBiYXNlZGVhbGxvYygpIGlzIGNhbGxlZDsgdGhpcyBpcyByZWFsbHkgbGlzdF9kZWFsbG9jKCksIG9yCisgICAgICAgIHNvbWUgb3RoZXIgdHlwZSB3aGljaCBhbHNvIHVzZXMgdGhlIHRyYXNoY2FuIG1hY3JvcwogCi0JICAgICAgLSB0aGUgdHJhc2hjYW4gbGltaXQgaXMgbm93IHJlYWNoZWQsIHNvIHRoZSBvYmplY3QgaXMgcHV0IG9uIHRoZQotCQl0cmFzaGNhbidzIHRvLWJlLWRlbGV0ZWQtbGF0ZXIgbGlzdAorICAgICAgICAgIC0gdGhlIHRyYXNoY2FuIGxpbWl0IGlzIG5vdyByZWFjaGVkLCBzbyB0aGUgb2JqZWN0IGlzIHB1dCBvbiB0aGUKKyAgICAgICAgdHJhc2hjYW4ncyB0by1iZS1kZWxldGVkLWxhdGVyIGxpc3QKIAotCSAgICAgIC0gYmFzZWRlYWxsb2MoKSByZXR1cm5zCisgICAgICAgICAgLSBiYXNlZGVhbGxvYygpIHJldHVybnMKIAotCSAgICAgIC0gc3VidHlwZV9kZWFsbG9jKCkgZGVjcmVmcyB0aGUgb2JqZWN0J3MgdHlwZQorICAgICAgICAgIC0gc3VidHlwZV9kZWFsbG9jKCkgZGVjcmVmcyB0aGUgb2JqZWN0J3MgdHlwZQogCi0JICAgICAgLSBzdWJ0eXBlX2RlYWxsb2MoKSByZXR1cm5zCisgICAgICAgICAgLSBzdWJ0eXBlX2RlYWxsb2MoKSByZXR1cm5zCiAKLQkgICAgICAtIGxhdGVyLCB0aGUgdHJhc2hjYW4gY29kZSBzdGFydHMgZGVsZXRpbmcgdGhlIG9iamVjdHMgZnJvbSBpdHMKLQkJdG8tYmUtZGVsZXRlZC1sYXRlciBsaXN0CisgICAgICAgICAgLSBsYXRlciwgdGhlIHRyYXNoY2FuIGNvZGUgc3RhcnRzIGRlbGV0aW5nIHRoZSBvYmplY3RzIGZyb20gaXRzCisgICAgICAgIHRvLWJlLWRlbGV0ZWQtbGF0ZXIgbGlzdAogCi0JICAgICAgLSBzdWJ0eXBlX2RlYWxsb2MoKSBpcyBjYWxsZWQgKkFHQUlOKiBmb3IgdGhlIHNhbWUgb2JqZWN0CisgICAgICAgICAgLSBzdWJ0eXBlX2RlYWxsb2MoKSBpcyBjYWxsZWQgKkFHQUlOKiBmb3IgdGhlIHNhbWUgb2JqZWN0CiAKLQkgICAgICAtIGF0IHRoZSB2ZXJ5IGxlYXN0IChpZiB0aGUgZGVzdHJveWVkIHNsb3RzIGFuZCBfX2RpY3RfXyBkb24ndAotCQljYXVzZSBwcm9ibGVtcykgdGhlIG9iamVjdCdzIHR5cGUgZ2V0cyBkZWNyZWYnZWQgYSBzZWNvbmQKLQkJdGltZSwgd2hpY2ggaXMgKkJBRCohISEKKyAgICAgICAgICAtIGF0IHRoZSB2ZXJ5IGxlYXN0IChpZiB0aGUgZGVzdHJveWVkIHNsb3RzIGFuZCBfX2RpY3RfXyBkb24ndAorICAgICAgICBjYXVzZSBwcm9ibGVtcykgdGhlIG9iamVjdCdzIHR5cGUgZ2V0cyBkZWNyZWYnZWQgYSBzZWNvbmQKKyAgICAgICAgdGltZSwgd2hpY2ggaXMgKkJBRCohISEKIAotCSAgICAgIFRoZSByZW1lZHkgaXMgdG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlIGNvZGUgYmV0d2VlbiB0cmFzaGNhbgotCSAgICAgIGJlZ2luIGFuZCBlbmQgaW4gc3VidHlwZV9kZWFsbG9jKCkgaXMgY2FsbGVkLCB0aGUgY29kZSBiZXR3ZWVuCi0JICAgICAgdHJhc2hjYW4gYmVnaW4gYW5kIGVuZCBpbiBiYXNlZGVhbGxvYygpIHdpbGwgYWxzbyBiZSBjYWxsZWQuCi0JICAgICAgVGhpcyBpcyBkb25lIGJ5IGRlY3JlbWVudGluZyB0aGUgbGV2ZWwgYWZ0ZXIgcGFzc2luZyBpbnRvIHRoZQotCSAgICAgIHRyYXNoY2FuIGJsb2NrLCBhbmQgaW5jcmVtZW50aW5nIGl0IGp1c3QgYmVmb3JlIGxlYXZpbmcgdGhlCi0JICAgICAgYmxvY2suCisgICAgICAgICAgVGhlIHJlbWVkeSBpcyB0byBtYWtlIHN1cmUgdGhhdCBpZiB0aGUgY29kZSBiZXR3ZWVuIHRyYXNoY2FuCisgICAgICAgICAgYmVnaW4gYW5kIGVuZCBpbiBzdWJ0eXBlX2RlYWxsb2MoKSBpcyBjYWxsZWQsIHRoZSBjb2RlIGJldHdlZW4KKyAgICAgICAgICB0cmFzaGNhbiBiZWdpbiBhbmQgZW5kIGluIGJhc2VkZWFsbG9jKCkgd2lsbCBhbHNvIGJlIGNhbGxlZC4KKyAgICAgICAgICBUaGlzIGlzIGRvbmUgYnkgZGVjcmVtZW50aW5nIHRoZSBsZXZlbCBhZnRlciBwYXNzaW5nIGludG8gdGhlCisgICAgICAgICAgdHJhc2hjYW4gYmxvY2ssIGFuZCBpbmNyZW1lbnRpbmcgaXQganVzdCBiZWZvcmUgbGVhdmluZyB0aGUKKyAgICAgICAgICBibG9jay4KIAotCSAgICAgIEJ1dCBub3cgaXQncyBwb3NzaWJsZSB0aGF0IGEgY2hhaW4gb2Ygb2JqZWN0cyBjb25zaXN0aW5nIHNvbGVseQotCSAgICAgIG9mIG9iamVjdHMgd2hvc2UgZGVhbGxvY2F0b3IgaXMgc3VidHlwZV9kZWFsbG9jKCkgd2lsbCBkZWZlYXQKLQkgICAgICB0aGUgdHJhc2hjYW4gbWVjaGFuaXNtIGNvbXBsZXRlbHk6IHRoZSBkZWNyZW1lbnRlZCBsZXZlbCBtZWFucwotCSAgICAgIHRoYXQgdGhlIGVmZmVjdGl2ZSBsZXZlbCBuZXZlciByZWFjaGVzIHRoZSBsaW1pdC4JIFRoZXJlZm9yZSwgd2UKLQkgICAgICAqaW5jcmVtZW50KiB0aGUgbGV2ZWwgKmJlZm9yZSogZW50ZXJpbmcgdGhlIHRyYXNoY2FuIGJsb2NrLCBhbmQKLQkgICAgICBtYXRjaGluZ2x5IGRlY3JlbWVudCBpdCBhZnRlciBsZWF2aW5nLiAgVGhpcyBtZWFucyB0aGUgdHJhc2hjYW4KLQkgICAgICBjb2RlIHdpbGwgdHJpZ2dlciBhIGxpdHRsZSBlYXJseSwgYnV0IHRoYXQncyBubyBiaWcgZGVhbC4KKyAgICAgICAgICBCdXQgbm93IGl0J3MgcG9zc2libGUgdGhhdCBhIGNoYWluIG9mIG9iamVjdHMgY29uc2lzdGluZyBzb2xlbHkKKyAgICAgICAgICBvZiBvYmplY3RzIHdob3NlIGRlYWxsb2NhdG9yIGlzIHN1YnR5cGVfZGVhbGxvYygpIHdpbGwgZGVmZWF0CisgICAgICAgICAgdGhlIHRyYXNoY2FuIG1lY2hhbmlzbSBjb21wbGV0ZWx5OiB0aGUgZGVjcmVtZW50ZWQgbGV2ZWwgbWVhbnMKKyAgICAgICAgICB0aGF0IHRoZSBlZmZlY3RpdmUgbGV2ZWwgbmV2ZXIgcmVhY2hlcyB0aGUgbGltaXQuICAgICAgVGhlcmVmb3JlLCB3ZQorICAgICAgICAgICppbmNyZW1lbnQqIHRoZSBsZXZlbCAqYmVmb3JlKiBlbnRlcmluZyB0aGUgdHJhc2hjYW4gYmxvY2ssIGFuZAorICAgICAgICAgIG1hdGNoaW5nbHkgZGVjcmVtZW50IGl0IGFmdGVyIGxlYXZpbmcuICBUaGlzIG1lYW5zIHRoZSB0cmFzaGNhbgorICAgICAgICAgIGNvZGUgd2lsbCB0cmlnZ2VyIGEgbGl0dGxlIGVhcmx5LCBidXQgdGhhdCdzIG5vIGJpZyBkZWFsLgogCi0JICAgUS4gQXJlIHRoZXJlIGFueSBsaXZlIGV4YW1wbGVzIG9mIGNvZGUgaW4gbmVlZCBvZiBhbGwgdGhpcwotCSAgICAgIGNvbXBsZXhpdHk/CisgICAgICAgUS4gQXJlIHRoZXJlIGFueSBsaXZlIGV4YW1wbGVzIG9mIGNvZGUgaW4gbmVlZCBvZiBhbGwgdGhpcworICAgICAgICAgIGNvbXBsZXhpdHk/CiAKLQkgICBBLiBZZXMuICBTZWUgU0YgYnVnIDY2ODQzMyBmb3IgY29kZSB0aGF0IGNyYXNoZWQgKHdoZW4gUHl0aG9uIHdhcwotCSAgICAgIGNvbXBpbGVkIGluIGRlYnVnIG1vZGUpIGJlZm9yZSB0aGUgdHJhc2hjYW4gbGV2ZWwgbWFuaXB1bGF0aW9ucwotCSAgICAgIHdlcmUgYWRkZWQuICBGb3IgbW9yZSBkaXNjdXNzaW9uLCBzZWUgU0YgcGF0Y2hlcyA1ODE3NDIsIDU3NTA3MwotCSAgICAgIGFuZCBidWcgNTc0MjA3LgotCSovCisgICAgICAgQS4gWWVzLiAgU2VlIFNGIGJ1ZyA2Njg0MzMgZm9yIGNvZGUgdGhhdCBjcmFzaGVkICh3aGVuIFB5dGhvbiB3YXMKKyAgICAgICAgICBjb21waWxlZCBpbiBkZWJ1ZyBtb2RlKSBiZWZvcmUgdGhlIHRyYXNoY2FuIGxldmVsIG1hbmlwdWxhdGlvbnMKKyAgICAgICAgICB3ZXJlIGFkZGVkLiAgRm9yIG1vcmUgZGlzY3Vzc2lvbiwgc2VlIFNGIHBhdGNoZXMgNTgxNzQyLCA1NzUwNzMKKyAgICAgICAgICBhbmQgYnVnIDU3NDIwNy4KKyAgICAqLwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpzb2xpZF9iYXNlKFB5VHlwZU9iamVjdCAqdHlwZSk7CkBAIC0xMTE1LDM5ICsxMTE1LDM5IEBACiBpbnQKIFB5VHlwZV9Jc1N1YnR5cGUoUHlUeXBlT2JqZWN0ICphLCBQeVR5cGVPYmplY3QgKmIpCiB7Ci0JUHlPYmplY3QgKm1ybzsKKyAgICBQeU9iamVjdCAqbXJvOwogCi0JaWYgKCEoYS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKQotCQlyZXR1cm4gYiA9PSBhIHx8IGIgPT0gJlB5QmFzZU9iamVjdF9UeXBlOworICAgIGlmICghKGEtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkKKyAgICAgICAgcmV0dXJuIGIgPT0gYSB8fCBiID09ICZQeUJhc2VPYmplY3RfVHlwZTsKIAotCW1ybyA9IGEtPnRwX21ybzsKLQlpZiAobXJvICE9IE5VTEwpIHsKLQkJLyogRGVhbCB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlIHdpdGhvdXQgcmVjdXJzaW9uCi0JCSAgIGJ5IHdhbGtpbmcgdGhlIE1STyB0dXBsZSAqLwotCQlQeV9zc2l6ZV90IGksIG47Ci0JCWFzc2VydChQeVR1cGxlX0NoZWNrKG1ybykpOwotCQluID0gUHlUdXBsZV9HRVRfU0laRShtcm8pOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlpZiAoUHlUdXBsZV9HRVRfSVRFTShtcm8sIGkpID09IChQeU9iamVjdCAqKWIpCi0JCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgewotCQkvKiBhIGlzIG5vdCBjb21wbGV0ZWx5IGluaXRpbGl6ZWQgeWV0OyBmb2xsb3cgdHBfYmFzZSAqLwotCQlkbyB7Ci0JCQlpZiAoYSA9PSBiKQotCQkJCXJldHVybiAxOwotCQkJYSA9IGEtPnRwX2Jhc2U7Ci0JCX0gd2hpbGUgKGEgIT0gTlVMTCk7Ci0JCXJldHVybiBiID09ICZQeUJhc2VPYmplY3RfVHlwZTsKLQl9CisgICAgbXJvID0gYS0+dHBfbXJvOworICAgIGlmIChtcm8gIT0gTlVMTCkgeworICAgICAgICAvKiBEZWFsIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2Ugd2l0aG91dCByZWN1cnNpb24KKyAgICAgICAgICAgYnkgd2Fsa2luZyB0aGUgTVJPIHR1cGxlICovCisgICAgICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2sobXJvKSk7CisgICAgICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKG1ybyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQeVR1cGxlX0dFVF9JVEVNKG1ybywgaSkgPT0gKFB5T2JqZWN0ICopYikKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGEgaXMgbm90IGNvbXBsZXRlbHkgaW5pdGlsaXplZCB5ZXQ7IGZvbGxvdyB0cF9iYXNlICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChhID09IGIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBhID0gYS0+dHBfYmFzZTsKKyAgICAgICAgfSB3aGlsZSAoYSAhPSBOVUxMKTsKKyAgICAgICAgcmV0dXJuIGIgPT0gJlB5QmFzZU9iamVjdF9UeXBlOworICAgIH0KIH0KIAogLyogSW50ZXJuYWwgcm91dGluZXMgdG8gZG8gYSBtZXRob2QgbG9va3VwIGluIHRoZSB0eXBlCiAgICB3aXRob3V0IGxvb2tpbmcgaW4gdGhlIGluc3RhbmNlIGRpY3Rpb25hcnkKICAgIChzbyB3ZSBjYW4ndCB1c2UgUHlPYmplY3RfR2V0QXR0cikgYnV0IHN0aWxsIGJpbmRpbmcKLSAgIGl0IHRvIHRoZSBpbnN0YW5jZS4JVGhlIGFyZ3VtZW50cyBhcmUgdGhlIG9iamVjdCwKKyAgIGl0IHRvIHRoZSBpbnN0YW5jZS4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBvYmplY3QsCiAgICB0aGUgbWV0aG9kIG5hbWUgYXMgYSBDIHN0cmluZywgYW5kIHRoZSBhZGRyZXNzIG9mIGEKICAgIHN0YXRpYyB2YXJpYWJsZSB1c2VkIHRvIGNhY2hlIHRoZSBpbnRlcm5lZCBQeXRob24gc3RyaW5nLgogCkBAIC0xMTY0LDc2ICsxMTY0LDc2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbG9va3VwX21heWJlKFB5T2JqZWN0ICpzZWxmLCBjaGFyICphdHRyc3RyLCBQeU9iamVjdCAqKmF0dHJvYmopCiB7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKCphdHRyb2JqID09IE5VTEwpIHsKLQkJKmF0dHJvYmogPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKGF0dHJzdHIpOwotCQlpZiAoKmF0dHJvYmogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXMgPSBfUHlUeXBlX0xvb2t1cChQeV9UWVBFKHNlbGYpLCAqYXR0cm9iaik7Ci0JaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCWRlc2NyZ2V0ZnVuYyBmOwotCQlpZiAoKGYgPSBQeV9UWVBFKHJlcyktPnRwX2Rlc2NyX2dldCkgPT0gTlVMTCkKLQkJCVB5X0lOQ1JFRihyZXMpOwotCQllbHNlCi0JCQlyZXMgPSBmKHJlcywgc2VsZiwgKFB5T2JqZWN0ICopKFB5X1RZUEUoc2VsZikpKTsKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoKmF0dHJvYmogPT0gTlVMTCkgeworICAgICAgICAqYXR0cm9iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoYXR0cnN0cik7CisgICAgICAgIGlmICgqYXR0cm9iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlcyA9IF9QeVR5cGVfTG9va3VwKFB5X1RZUEUoc2VsZiksICphdHRyb2JqKTsKKyAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVzY3JnZXRmdW5jIGY7CisgICAgICAgIGlmICgoZiA9IFB5X1RZUEUocmVzKS0+dHBfZGVzY3JfZ2V0KSA9PSBOVUxMKQorICAgICAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IGYocmVzLCBzZWxmLCAoUHlPYmplY3QgKikoUHlfVFlQRShzZWxmKSkpOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9va3VwX21ldGhvZChQeU9iamVjdCAqc2VsZiwgY2hhciAqYXR0cnN0ciwgUHlPYmplY3QgKiphdHRyb2JqKQogewotCVB5T2JqZWN0ICpyZXMgPSBsb29rdXBfbWF5YmUoc2VsZiwgYXR0cnN0ciwgYXR0cm9iaik7Ci0JaWYgKHJlcyA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsICphdHRyb2JqKTsKLQlyZXR1cm4gcmVzOworICAgIFB5T2JqZWN0ICpyZXMgPSBsb29rdXBfbWF5YmUoc2VsZiwgYXR0cnN0ciwgYXR0cm9iaik7CisgICAgaWYgKHJlcyA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsICphdHRyb2JqKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBQeU9iamVjdCAqCiBfUHlPYmplY3RfTG9va3VwU3BlY2lhbChQeU9iamVjdCAqc2VsZiwgY2hhciAqYXR0cnN0ciwgUHlPYmplY3QgKiphdHRyb2JqKQogewotCWFzc2VydCghUHlJbnN0YW5jZV9DaGVjayhzZWxmKSk7Ci0JcmV0dXJuIGxvb2t1cF9tYXliZShzZWxmLCBhdHRyc3RyLCBhdHRyb2JqKTsKKyAgICBhc3NlcnQoIVB5SW5zdGFuY2VfQ2hlY2soc2VsZikpOworICAgIHJldHVybiBsb29rdXBfbWF5YmUoc2VsZiwgYXR0cnN0ciwgYXR0cm9iaik7CiB9CiAKIC8qIEEgdmFyaWF0aW9uIG9mIFB5T2JqZWN0X0NhbGxNZXRob2QgdGhhdCB1c2VzIGxvb2t1cF9tZXRob2QoKQotICAgaW5zdGVhZCBvZiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKCkuCSBUaGlzIHVzZXMgdGhlIHNhbWUgY29udmVudGlvbgorICAgaW5zdGVhZCBvZiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKCkuICBUaGlzIHVzZXMgdGhlIHNhbWUgY29udmVudGlvbgogICAgYXMgbG9va3VwX21ldGhvZCB0byBjYWNoZSB0aGUgaW50ZXJuZWQgbmFtZSBzdHJpbmcgb2JqZWN0LiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9tZXRob2QoUHlPYmplY3QgKm8sIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICoqbmFtZW9iaiwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YTsKLQlQeU9iamVjdCAqYXJncywgKmZ1bmMgPSAwLCAqcmV0dmFsOwotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIHZhX2xpc3QgdmE7CisgICAgUHlPYmplY3QgKmFyZ3MsICpmdW5jID0gMCwgKnJldHZhbDsKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKIAotCWZ1bmMgPSBsb29rdXBfbWF5YmUobywgbmFtZSwgbmFtZW9iaik7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQl2YV9lbmQodmEpOwotCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsICpuYW1lb2JqKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGZ1bmMgPSBsb29rdXBfbWF5YmUobywgbmFtZSwgbmFtZW9iaik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICB2YV9lbmQodmEpOworICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsICpuYW1lb2JqKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGZvcm1hdCAmJiAqZm9ybWF0KQotCQlhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOwotCWVsc2UKLQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkKKyAgICAgICAgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKyAgICBlbHNlCisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKIAotCXZhX2VuZCh2YSk7CisgICAgdmFfZW5kKHZhKTsKIAotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwotCXJldHZhbCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOworICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CiAKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfREVDUkVGKGZ1bmMpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CiAKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIC8qIENsb25lIG9mIGNhbGxfbWV0aG9kKCkgdGhhdCByZXR1cm5zIE5vdEltcGxlbWVudGVkIHdoZW4gdGhlIGxvb2t1cCBmYWlscy4gKi8KQEAgLTEyNDEsNzggKzEyNDEsNzggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX21heWJlKFB5T2JqZWN0ICpvLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqKm5hbWVvYmosIGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7Ci0JUHlPYmplY3QgKmFyZ3MsICpmdW5jID0gMCwgKnJldHZhbDsKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICB2YV9saXN0IHZhOworICAgIFB5T2JqZWN0ICphcmdzLCAqZnVuYyA9IDAsICpyZXR2YWw7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CiAKLQlmdW5jID0gbG9va3VwX21heWJlKG8sIG5hbWUsIG5hbWVvYmopOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJdmFfZW5kKHZhKTsKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCQl9Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBmdW5jID0gbG9va3VwX21heWJlKG8sIG5hbWUsIG5hbWVvYmopOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgdmFfZW5kKHZhKTsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChmb3JtYXQgJiYgKmZvcm1hdCkKLQkJYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKLQllbHNlCi0JCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpCisgICAgICAgIGFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7CisgICAgZWxzZQorICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CiAKLQl2YV9lbmQodmEpOworICAgIHZhX2VuZCh2YSk7CiAKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLQlyZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwogCi0JUHlfREVDUkVGKGFyZ3MpOwotCVB5X0RFQ1JFRihmdW5jKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOwogCi0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50CiBmaWxsX2NsYXNzaWNfbXJvKFB5T2JqZWN0ICptcm8sIFB5T2JqZWN0ICpjbHMpCiB7Ci0JUHlPYmplY3QgKmJhc2VzLCAqYmFzZTsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKmJhc2VzLCAqYmFzZTsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKG1ybykpOwotCWFzc2VydChQeUNsYXNzX0NoZWNrKGNscykpOwotCWkgPSBQeVNlcXVlbmNlX0NvbnRhaW5zKG1ybywgY2xzKTsKLQlpZiAoaSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoIWkpIHsKLQkJaWYgKFB5TGlzdF9BcHBlbmQobXJvLCBjbHMpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JYmFzZXMgPSAoKFB5Q2xhc3NPYmplY3QgKiljbHMpLT5jbF9iYXNlczsKLQlhc3NlcnQoYmFzZXMgJiYgUHlUdXBsZV9DaGVjayhiYXNlcykpOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWJhc2UgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKLQkJaWYgKGZpbGxfY2xhc3NpY19tcm8obXJvLCBiYXNlKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChQeUxpc3RfQ2hlY2sobXJvKSk7CisgICAgYXNzZXJ0KFB5Q2xhc3NfQ2hlY2soY2xzKSk7CisgICAgaSA9IFB5U2VxdWVuY2VfQ29udGFpbnMobXJvLCBjbHMpOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghaSkgeworICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChtcm8sIGNscykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBiYXNlcyA9ICgoUHlDbGFzc09iamVjdCAqKWNscyktPmNsX2Jhc2VzOworICAgIGFzc2VydChiYXNlcyAmJiBQeVR1cGxlX0NoZWNrKGJhc2VzKSk7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOworICAgICAgICBpZiAoZmlsbF9jbGFzc2ljX21ybyhtcm8sIGJhc2UpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGFzc2ljX21ybyhQeU9iamVjdCAqY2xzKQogewotCVB5T2JqZWN0ICptcm87CisgICAgUHlPYmplY3QgKm1ybzsKIAotCWFzc2VydChQeUNsYXNzX0NoZWNrKGNscykpOwotCW1ybyA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKG1ybyAhPSBOVUxMKSB7Ci0JCWlmIChmaWxsX2NsYXNzaWNfbXJvKG1ybywgY2xzKSA9PSAwKQotCQkJcmV0dXJuIG1ybzsKLQkJUHlfREVDUkVGKG1ybyk7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGFzc2VydChQeUNsYXNzX0NoZWNrKGNscykpOworICAgIG1ybyA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKG1ybyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChmaWxsX2NsYXNzaWNfbXJvKG1ybywgY2xzKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG1ybzsKKyAgICAgICAgUHlfREVDUkVGKG1ybyk7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiAvKgpAQCAtMTM0NSw2MyArMTM0NSw2MyBAQAogCiBzdGF0aWMgaW50CiB0YWlsX2NvbnRhaW5zKFB5T2JqZWN0ICpsaXN0LCBpbnQgd2hlbmNlLCBQeU9iamVjdCAqbykgewotCVB5X3NzaXplX3Qgaiwgc2l6ZTsKLQlzaXplID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOworICAgIFB5X3NzaXplX3Qgaiwgc2l6ZTsKKyAgICBzaXplID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOwogCi0JZm9yIChqID0gd2hlbmNlKzE7IGogPCBzaXplOyBqKyspIHsKLQkJaWYgKFB5TGlzdF9HRVRfSVRFTShsaXN0LCBqKSA9PSBvKQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgIGZvciAoaiA9IHdoZW5jZSsxOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICAgIGlmIChQeUxpc3RfR0VUX0lURU0obGlzdCwgaikgPT0gbykKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsYXNzX25hbWUoUHlPYmplY3QgKmNscykKIHsKLQlQeU9iamVjdCAqbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY2xzLCAiX19uYW1lX18iKTsKLQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X1hERUNSRUYobmFtZSk7Ci0JCW5hbWUgPSBQeU9iamVjdF9SZXByKGNscyk7Ci0JfQotCWlmIChuYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKLQkJUHlfREVDUkVGKG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIG5hbWU7CisgICAgUHlPYmplY3QgKm5hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNscywgIl9fbmFtZV9fIik7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9YREVDUkVGKG5hbWUpOworICAgICAgICBuYW1lID0gUHlPYmplY3RfUmVwcihjbHMpOworICAgIH0KKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuYW1lOwogfQogCiBzdGF0aWMgaW50CiBjaGVja19kdXBsaWNhdGVzKFB5T2JqZWN0ICpsaXN0KQogewotCVB5X3NzaXplX3QgaSwgaiwgbjsKLQkvKiBMZXQncyB1c2UgYSBxdWFkcmF0aWMgdGltZSBhbGdvcml0aG0sCi0JICAgYXNzdW1pbmcgdGhhdCB0aGUgYmFzZXMgbGlzdHMgaXMgc2hvcnQuCi0JKi8KLQluID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKm8gPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCWZvciAoaiA9IGkgKyAxOyBqIDwgbjsgaisrKSB7Ci0JCQlpZiAoUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGopID09IG8pIHsKLQkJCQlvID0gY2xhc3NfbmFtZShvKTsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkgICAgICJkdXBsaWNhdGUgYmFzZSBjbGFzcyAlcyIsCi0JCQkJCSAgICAgbyA/IFB5U3RyaW5nX0FTX1NUUklORyhvKSA6ICI/Iik7Ci0JCQkJUHlfWERFQ1JFRihvKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgUHlfc3NpemVfdCBpLCBqLCBuOworICAgIC8qIExldCdzIHVzZSBhIHF1YWRyYXRpYyB0aW1lIGFsZ29yaXRobSwKKyAgICAgICBhc3N1bWluZyB0aGF0IHRoZSBiYXNlcyBsaXN0cyBpcyBzaG9ydC4KKyAgICAqLworICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqbyA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfR0VUX0lURU0obGlzdCwgaikgPT0gbykgeworICAgICAgICAgICAgICAgIG8gPSBjbGFzc19uYW1lKG8pOworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdXBsaWNhdGUgYmFzZSBjbGFzcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPyBQeVN0cmluZ19BU19TVFJJTkcobykgOiAiPyIpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBSYWlzZSBhIFR5cGVFcnJvciBmb3IgYW4gTVJPIG9yZGVyIGRpc2FncmVlbWVudC4KIAogICAgSXQncyBoYXJkIHRvIHByb2R1Y2UgYSBnb29kIGVycm9yIG1lc3NhZ2UuICBJbiB0aGUgYWJzZW5jZSBvZiBiZXR0ZXIKICAgIGluc2lnaHQgaW50byBlcnJvciByZXBvcnRpbmcsIHJlcG9ydCB0aGUgY2xhc3NlcyB0aGF0IHdlcmUgY2FuZGlkYXRlcwotICAgdG8gYmUgcHV0IG5leHQgaW50byB0aGUgTVJPLgkgVGhlcmUgaXMgc29tZSBjb25mbGljdCBiZXR3ZWVuIHRoZQorICAgdG8gYmUgcHV0IG5leHQgaW50byB0aGUgTVJPLiAgVGhlcmUgaXMgc29tZSBjb25mbGljdCBiZXR3ZWVuIHRoZQogICAgb3JkZXIgaW4gd2hpY2ggdGhleSBzaG91bGQgYmUgcHV0IGluIHRoZSBNUk8sIGJ1dCBpdCdzIGhhcmQgdG8KICAgIGRpYWdub3NlIHdoYXQgY29uc3RyYWludCBjYW4ndCBiZSBzYXRpc2ZpZWQuCiAqLwpAQCAtMTQwOSwyNTggKzE0MDksMjU4IEBACiBzdGF0aWMgdm9pZAogc2V0X21yb19lcnJvcihQeU9iamVjdCAqdG9fbWVyZ2UsIGludCAqcmVtYWluKQogewotCVB5X3NzaXplX3QgaSwgbiwgb2ZmLCB0b19tZXJnZV9zaXplOwotCWNoYXIgYnVmWzEwMDBdOwotCVB5T2JqZWN0ICprLCAqdjsKLQlQeU9iamVjdCAqc2V0ID0gUHlEaWN0X05ldygpOwotCWlmICghc2V0KSByZXR1cm47CisgICAgUHlfc3NpemVfdCBpLCBuLCBvZmYsIHRvX21lcmdlX3NpemU7CisgICAgY2hhciBidWZbMTAwMF07CisgICAgUHlPYmplY3QgKmssICp2OworICAgIFB5T2JqZWN0ICpzZXQgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFzZXQpIHJldHVybjsKIAotCXRvX21lcmdlX3NpemUgPSBQeUxpc3RfR0VUX1NJWkUodG9fbWVyZ2UpOwotCWZvciAoaSA9IDA7IGkgPCB0b19tZXJnZV9zaXplOyBpKyspIHsKLQkJUHlPYmplY3QgKkwgPSBQeUxpc3RfR0VUX0lURU0odG9fbWVyZ2UsIGkpOwotCQlpZiAocmVtYWluW2ldIDwgUHlMaXN0X0dFVF9TSVpFKEwpKSB7Ci0JCQlQeU9iamVjdCAqYyA9IFB5TGlzdF9HRVRfSVRFTShMLCByZW1haW5baV0pOwotCQkJaWYgKFB5RGljdF9TZXRJdGVtKHNldCwgYywgUHlfTm9uZSkgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKHNldCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCW4gPSBQeURpY3RfU2l6ZShzZXQpOworICAgIHRvX21lcmdlX3NpemUgPSBQeUxpc3RfR0VUX1NJWkUodG9fbWVyZ2UpOworICAgIGZvciAoaSA9IDA7IGkgPCB0b19tZXJnZV9zaXplOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKkwgPSBQeUxpc3RfR0VUX0lURU0odG9fbWVyZ2UsIGkpOworICAgICAgICBpZiAocmVtYWluW2ldIDwgUHlMaXN0X0dFVF9TSVpFKEwpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqYyA9IFB5TGlzdF9HRVRfSVRFTShMLCByZW1haW5baV0pOworICAgICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNldCwgYywgUHlfTm9uZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG4gPSBQeURpY3RfU2l6ZShzZXQpOwogCi0Jb2ZmID0gUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQ2Fubm90IGNyZWF0ZSBhIFwKKyAgICBvZmYgPSBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJDYW5ub3QgY3JlYXRlIGEgXAogY29uc2lzdGVudCBtZXRob2QgcmVzb2x1dGlvblxub3JkZXIgKE1STykgZm9yIGJhc2VzIik7Ci0JaSA9IDA7Ci0Jd2hpbGUgKFB5RGljdF9OZXh0KHNldCwgJmksICZrLCAmdikgJiYgKHNpemVfdClvZmYgPCBzaXplb2YoYnVmKSkgewotCQlQeU9iamVjdCAqbmFtZSA9IGNsYXNzX25hbWUoayk7Ci0JCW9mZiArPSBQeU9TX3NucHJpbnRmKGJ1ZiArIG9mZiwgc2l6ZW9mKGJ1ZikgLSBvZmYsICIgJXMiLAotCQkJCSAgICAgbmFtZSA/IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSA6ICI/Iik7Ci0JCVB5X1hERUNSRUYobmFtZSk7Ci0JCWlmICgtLW4gJiYgKHNpemVfdCkob2ZmKzEpIDwgc2l6ZW9mKGJ1ZikpIHsKLQkJCWJ1ZltvZmYrK10gPSAnLCc7Ci0JCQlidWZbb2ZmXSA9ICdcMCc7Ci0JCX0KLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgYnVmKTsKLQlQeV9ERUNSRUYoc2V0KTsKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoUHlEaWN0X05leHQoc2V0LCAmaSwgJmssICZ2KSAmJiAoc2l6ZV90KW9mZiA8IHNpemVvZihidWYpKSB7CisgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gY2xhc3NfbmFtZShrKTsKKyAgICAgICAgb2ZmICs9IFB5T1Nfc25wcmludGYoYnVmICsgb2ZmLCBzaXplb2YoYnVmKSAtIG9mZiwgIiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPyBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkgOiAiPyIpOworICAgICAgICBQeV9YREVDUkVGKG5hbWUpOworICAgICAgICBpZiAoLS1uICYmIChzaXplX3QpKG9mZisxKSA8IHNpemVvZihidWYpKSB7CisgICAgICAgICAgICBidWZbb2ZmKytdID0gJywnOworICAgICAgICAgICAgYnVmW29mZl0gPSAnXDAnOworICAgICAgICB9CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGJ1Zik7CisgICAgUHlfREVDUkVGKHNldCk7CiB9CiAKIHN0YXRpYyBpbnQKIHBtZXJnZShQeU9iamVjdCAqYWNjLCBQeU9iamVjdCogdG9fbWVyZ2UpIHsKLQlQeV9zc2l6ZV90IGksIGosIHRvX21lcmdlX3NpemUsIGVtcHR5X2NudDsKLQlpbnQgKnJlbWFpbjsKLQlpbnQgb2s7CisgICAgUHlfc3NpemVfdCBpLCBqLCB0b19tZXJnZV9zaXplLCBlbXB0eV9jbnQ7CisgICAgaW50ICpyZW1haW47CisgICAgaW50IG9rOwogCi0JdG9fbWVyZ2Vfc2l6ZSA9IFB5TGlzdF9HRVRfU0laRSh0b19tZXJnZSk7CisgICAgdG9fbWVyZ2Vfc2l6ZSA9IFB5TGlzdF9HRVRfU0laRSh0b19tZXJnZSk7CiAKLQkvKiByZW1haW4gc3RvcmVzIGFuIGluZGV4IGludG8gZWFjaCBzdWJsaXN0IG9mIHRvX21lcmdlLgotCSAgIHJlbWFpbltpXSBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgYmFzZSBpbiB0b19tZXJnZVtpXQotCSAgIHRoYXQgaXMgbm90IGluY2x1ZGVkIGluIGFjYy4KLQkqLwotCXJlbWFpbiA9IChpbnQgKilQeU1lbV9NQUxMT0MoU0laRU9GX0lOVCp0b19tZXJnZV9zaXplKTsKLQlpZiAocmVtYWluID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlmb3IgKGkgPSAwOyBpIDwgdG9fbWVyZ2Vfc2l6ZTsgaSsrKQotCQlyZW1haW5baV0gPSAwOworICAgIC8qIHJlbWFpbiBzdG9yZXMgYW4gaW5kZXggaW50byBlYWNoIHN1Ymxpc3Qgb2YgdG9fbWVyZ2UuCisgICAgICAgcmVtYWluW2ldIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBiYXNlIGluIHRvX21lcmdlW2ldCisgICAgICAgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gYWNjLgorICAgICovCisgICAgcmVtYWluID0gKGludCAqKVB5TWVtX01BTExPQyhTSVpFT0ZfSU5UKnRvX21lcmdlX3NpemUpOworICAgIGlmIChyZW1haW4gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGZvciAoaSA9IDA7IGkgPCB0b19tZXJnZV9zaXplOyBpKyspCisgICAgICAgIHJlbWFpbltpXSA9IDA7CiAKICAgYWdhaW46Ci0JZW1wdHlfY250ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgdG9fbWVyZ2Vfc2l6ZTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpjYW5kaWRhdGU7CisgICAgZW1wdHlfY250ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdG9fbWVyZ2Vfc2l6ZTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpjYW5kaWRhdGU7CiAKLQkJUHlPYmplY3QgKmN1cl9saXN0ID0gUHlMaXN0X0dFVF9JVEVNKHRvX21lcmdlLCBpKTsKKyAgICAgICAgUHlPYmplY3QgKmN1cl9saXN0ID0gUHlMaXN0X0dFVF9JVEVNKHRvX21lcmdlLCBpKTsKIAotCQlpZiAocmVtYWluW2ldID49IFB5TGlzdF9HRVRfU0laRShjdXJfbGlzdCkpIHsKLQkJCWVtcHR5X2NudCsrOwotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKHJlbWFpbltpXSA+PSBQeUxpc3RfR0VUX1NJWkUoY3VyX2xpc3QpKSB7CisgICAgICAgICAgICBlbXB0eV9jbnQrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJLyogQ2hvb3NlIG5leHQgY2FuZGlkYXRlIGZvciBNUk8uCisgICAgICAgIC8qIENob29zZSBuZXh0IGNhbmRpZGF0ZSBmb3IgTVJPLgogCi0JCSAgIFRoZSBpbnB1dCBzZXF1ZW5jZXMgYWxvbmUgY2FuIGRldGVybWluZSB0aGUgY2hvaWNlLgotCQkgICBJZiBub3QsIGNob29zZSB0aGUgY2xhc3Mgd2hpY2ggYXBwZWFycyBpbiB0aGUgTVJPCi0JCSAgIG9mIHRoZSBlYXJsaWVzdCBkaXJlY3Qgc3VwZXJjbGFzcyBvZiB0aGUgbmV3IGNsYXNzLgotCQkqLworICAgICAgICAgICBUaGUgaW5wdXQgc2VxdWVuY2VzIGFsb25lIGNhbiBkZXRlcm1pbmUgdGhlIGNob2ljZS4KKyAgICAgICAgICAgSWYgbm90LCBjaG9vc2UgdGhlIGNsYXNzIHdoaWNoIGFwcGVhcnMgaW4gdGhlIE1STworICAgICAgICAgICBvZiB0aGUgZWFybGllc3QgZGlyZWN0IHN1cGVyY2xhc3Mgb2YgdGhlIG5ldyBjbGFzcy4KKyAgICAgICAgKi8KIAotCQljYW5kaWRhdGUgPSBQeUxpc3RfR0VUX0lURU0oY3VyX2xpc3QsIHJlbWFpbltpXSk7Ci0JCWZvciAoaiA9IDA7IGogPCB0b19tZXJnZV9zaXplOyBqKyspIHsKLQkJCVB5T2JqZWN0ICpqX2xzdCA9IFB5TGlzdF9HRVRfSVRFTSh0b19tZXJnZSwgaik7Ci0JCQlpZiAodGFpbF9jb250YWlucyhqX2xzdCwgcmVtYWluW2pdLCBjYW5kaWRhdGUpKSB7Ci0JCQkJZ290byBza2lwOyAvKiBjb250aW51ZSBvdXRlciBsb29wICovCi0JCQl9Ci0JCX0KLQkJb2sgPSBQeUxpc3RfQXBwZW5kKGFjYywgY2FuZGlkYXRlKTsKLQkJaWYgKG9rIDwgMCkgewotCQkJUHlNZW1fRnJlZShyZW1haW4pOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWZvciAoaiA9IDA7IGogPCB0b19tZXJnZV9zaXplOyBqKyspIHsKLQkJCVB5T2JqZWN0ICpqX2xzdCA9IFB5TGlzdF9HRVRfSVRFTSh0b19tZXJnZSwgaik7Ci0JCQlpZiAocmVtYWluW2pdIDwgUHlMaXN0X0dFVF9TSVpFKGpfbHN0KSAmJgotCQkJICAgIFB5TGlzdF9HRVRfSVRFTShqX2xzdCwgcmVtYWluW2pdKSA9PSBjYW5kaWRhdGUpIHsKLQkJCQlyZW1haW5bal0rKzsKLQkJCX0KLQkJfQotCQlnb3RvIGFnYWluOwotCSAgc2tpcDogOwotCX0KKyAgICAgICAgY2FuZGlkYXRlID0gUHlMaXN0X0dFVF9JVEVNKGN1cl9saXN0LCByZW1haW5baV0pOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG9fbWVyZ2Vfc2l6ZTsgaisrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqal9sc3QgPSBQeUxpc3RfR0VUX0lURU0odG9fbWVyZ2UsIGopOworICAgICAgICAgICAgaWYgKHRhaWxfY29udGFpbnMoal9sc3QsIHJlbWFpbltqXSwgY2FuZGlkYXRlKSkgeworICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsgLyogY29udGludWUgb3V0ZXIgbG9vcCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9rID0gUHlMaXN0X0FwcGVuZChhY2MsIGNhbmRpZGF0ZSk7CisgICAgICAgIGlmIChvayA8IDApIHsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUocmVtYWluKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG9fbWVyZ2Vfc2l6ZTsgaisrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqal9sc3QgPSBQeUxpc3RfR0VUX0lURU0odG9fbWVyZ2UsIGopOworICAgICAgICAgICAgaWYgKHJlbWFpbltqXSA8IFB5TGlzdF9HRVRfU0laRShqX2xzdCkgJiYKKyAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX0lURU0oal9sc3QsIHJlbWFpbltqXSkgPT0gY2FuZGlkYXRlKSB7CisgICAgICAgICAgICAgICAgcmVtYWluW2pdKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIHNraXA6IDsKKyAgICB9CiAKLQlpZiAoZW1wdHlfY250ID09IHRvX21lcmdlX3NpemUpIHsKLQkJUHlNZW1fRlJFRShyZW1haW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc2V0X21yb19lcnJvcih0b19tZXJnZSwgcmVtYWluKTsKLQlQeU1lbV9GUkVFKHJlbWFpbik7Ci0JcmV0dXJuIC0xOworICAgIGlmIChlbXB0eV9jbnQgPT0gdG9fbWVyZ2Vfc2l6ZSkgeworICAgICAgICBQeU1lbV9GUkVFKHJlbWFpbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzZXRfbXJvX2Vycm9yKHRvX21lcmdlLCByZW1haW4pOworICAgIFB5TWVtX0ZSRUUocmVtYWluKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtcm9faW1wbGVtZW50YXRpb24oUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlpbnQgb2s7Ci0JUHlPYmplY3QgKmJhc2VzLCAqcmVzdWx0OwotCVB5T2JqZWN0ICp0b19tZXJnZSwgKmJhc2VzX2FzbGlzdDsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgaW50IG9rOworICAgIFB5T2JqZWN0ICpiYXNlcywgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqdG9fbWVyZ2UsICpiYXNlc19hc2xpc3Q7CiAKLQlpZiAodHlwZS0+dHBfZGljdCA9PSBOVUxMKSB7Ci0JCWlmIChQeVR5cGVfUmVhZHkodHlwZSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh0eXBlLT50cF9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSh0eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBGaW5kIGEgc3VwZXJjbGFzcyBsaW5lYXJpemF0aW9uIHRoYXQgaG9ub3JzIHRoZSBjb25zdHJhaW50cwotCSAgIG9mIHRoZSBleHBsaWNpdCBsaXN0cyBvZiBiYXNlcyBhbmQgdGhlIGNvbnN0cmFpbnRzIGltcGxpZWQgYnkKLQkgICBlYWNoIGJhc2UgY2xhc3MuCisgICAgLyogRmluZCBhIHN1cGVyY2xhc3MgbGluZWFyaXphdGlvbiB0aGF0IGhvbm9ycyB0aGUgY29uc3RyYWludHMKKyAgICAgICBvZiB0aGUgZXhwbGljaXQgbGlzdHMgb2YgYmFzZXMgYW5kIHRoZSBjb25zdHJhaW50cyBpbXBsaWVkIGJ5CisgICAgICAgZWFjaCBiYXNlIGNsYXNzLgogCi0JICAgdG9fbWVyZ2UgaXMgYSBsaXN0IG9mIGxpc3RzLCB3aGVyZSBlYWNoIGxpc3QgaXMgYSBzdXBlcmNsYXNzCi0JICAgbGluZWFyaXphdGlvbiBpbXBsaWVkIGJ5IGEgYmFzZSBjbGFzcy4gIFRoZSBsYXN0IGVsZW1lbnQgb2YKLQkgICB0b19tZXJnZSBpcyB0aGUgZGVjbGFyZWQgbGlzdCBvZiBiYXNlcy4KLQkqLworICAgICAgIHRvX21lcmdlIGlzIGEgbGlzdCBvZiBsaXN0cywgd2hlcmUgZWFjaCBsaXN0IGlzIGEgc3VwZXJjbGFzcworICAgICAgIGxpbmVhcml6YXRpb24gaW1wbGllZCBieSBhIGJhc2UgY2xhc3MuICBUaGUgbGFzdCBlbGVtZW50IG9mCisgICAgICAgdG9fbWVyZ2UgaXMgdGhlIGRlY2xhcmVkIGxpc3Qgb2YgYmFzZXMuCisgICAgKi8KIAotCWJhc2VzID0gdHlwZS0+dHBfYmFzZXM7Ci0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgIGJhc2VzID0gdHlwZS0+dHBfYmFzZXM7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOwogCi0JdG9fbWVyZ2UgPSBQeUxpc3RfTmV3KG4rMSk7Ci0JaWYgKHRvX21lcmdlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHRvX21lcmdlID0gUHlMaXN0X05ldyhuKzEpOworICAgIGlmICh0b19tZXJnZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKmJhc2UgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKLQkJUHlPYmplY3QgKnBhcmVudE1STzsKLQkJaWYgKFB5VHlwZV9DaGVjayhiYXNlKSkKLQkJCXBhcmVudE1STyA9IFB5U2VxdWVuY2VfTGlzdCgKLQkJCQkoKFB5VHlwZU9iamVjdCopYmFzZSktPnRwX21ybyk7Ci0JCWVsc2UKLQkJCXBhcmVudE1STyA9IGNsYXNzaWNfbXJvKGJhc2UpOwotCQlpZiAocGFyZW50TVJPID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih0b19tZXJnZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmJhc2UgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgUHlPYmplY3QgKnBhcmVudE1STzsKKyAgICAgICAgaWYgKFB5VHlwZV9DaGVjayhiYXNlKSkKKyAgICAgICAgICAgIHBhcmVudE1STyA9IFB5U2VxdWVuY2VfTGlzdCgKKyAgICAgICAgICAgICAgICAoKFB5VHlwZU9iamVjdCopYmFzZSktPnRwX21ybyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhcmVudE1STyA9IGNsYXNzaWNfbXJvKGJhc2UpOworICAgICAgICBpZiAocGFyZW50TVJPID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0b19tZXJnZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCVB5TGlzdF9TRVRfSVRFTSh0b19tZXJnZSwgaSwgcGFyZW50TVJPKTsKLQl9CisgICAgICAgIFB5TGlzdF9TRVRfSVRFTSh0b19tZXJnZSwgaSwgcGFyZW50TVJPKTsKKyAgICB9CiAKLQliYXNlc19hc2xpc3QgPSBQeVNlcXVlbmNlX0xpc3QoYmFzZXMpOwotCWlmIChiYXNlc19hc2xpc3QgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodG9fbWVyZ2UpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogVGhpcyBpcyBqdXN0IGEgYmFzaWMgc2FuaXR5IGNoZWNrLiAqLwotCWlmIChjaGVja19kdXBsaWNhdGVzKGJhc2VzX2FzbGlzdCkgPCAwKSB7Ci0JCVB5X0RFQ1JFRih0b19tZXJnZSk7Ci0JCVB5X0RFQ1JFRihiYXNlc19hc2xpc3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlMaXN0X1NFVF9JVEVNKHRvX21lcmdlLCBuLCBiYXNlc19hc2xpc3QpOworICAgIGJhc2VzX2FzbGlzdCA9IFB5U2VxdWVuY2VfTGlzdChiYXNlcyk7CisgICAgaWYgKGJhc2VzX2FzbGlzdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih0b19tZXJnZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBUaGlzIGlzIGp1c3QgYSBiYXNpYyBzYW5pdHkgY2hlY2suICovCisgICAgaWYgKGNoZWNrX2R1cGxpY2F0ZXMoYmFzZXNfYXNsaXN0KSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHRvX21lcmdlKTsKKyAgICAgICAgUHlfREVDUkVGKGJhc2VzX2FzbGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUxpc3RfU0VUX0lURU0odG9fbWVyZ2UsIG4sIGJhc2VzX2FzbGlzdCk7CiAKLQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJbT10iLCAoUHlPYmplY3QgKil0eXBlKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHRvX21lcmdlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIltPXSIsIChQeU9iamVjdCAqKXR5cGUpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodG9fbWVyZ2UpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlvayA9IHBtZXJnZShyZXN1bHQsIHRvX21lcmdlKTsKLQlQeV9ERUNSRUYodG9fbWVyZ2UpOwotCWlmIChvayA8IDApIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBvayA9IHBtZXJnZShyZXN1bHQsIHRvX21lcmdlKTsKKyAgICBQeV9ERUNSRUYodG9fbWVyZ2UpOworICAgIGlmIChvayA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1yb19leHRlcm5hbChQeU9iamVjdCAqc2VsZikKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGUgPSAoUHlUeXBlT2JqZWN0ICopc2VsZjsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGUgPSAoUHlUeXBlT2JqZWN0ICopc2VsZjsKIAotCXJldHVybiBtcm9faW1wbGVtZW50YXRpb24odHlwZSk7CisgICAgcmV0dXJuIG1yb19pbXBsZW1lbnRhdGlvbih0eXBlKTsKIH0KIAogc3RhdGljIGludAogbXJvX2ludGVybmFsKFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqbXJvLCAqcmVzdWx0LCAqdHVwbGU7Ci0JaW50IGNoZWNraXQgPSAwOworICAgIFB5T2JqZWN0ICptcm8sICpyZXN1bHQsICp0dXBsZTsKKyAgICBpbnQgY2hlY2tpdCA9IDA7CiAKLQlpZiAoUHlfVFlQRSh0eXBlKSA9PSAmUHlUeXBlX1R5cGUpIHsKLQkJcmVzdWx0ID0gbXJvX2ltcGxlbWVudGF0aW9uKHR5cGUpOwotCX0KLQllbHNlIHsKLQkJc3RhdGljIFB5T2JqZWN0ICptcm9fc3RyOwotCQljaGVja2l0ID0gMTsKLQkJbXJvID0gbG9va3VwX21ldGhvZCgoUHlPYmplY3QgKil0eXBlLCAibXJvIiwgJm1yb19zdHIpOwotCQlpZiAobXJvID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QobXJvLCBOVUxMKTsKLQkJUHlfREVDUkVGKG1ybyk7Ci0JfQotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXR1cGxlID0gUHlTZXF1ZW5jZV9UdXBsZShyZXN1bHQpOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCWlmICh0dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGNoZWNraXQpIHsKLQkJUHlfc3NpemVfdCBpLCBsZW47Ci0JCVB5T2JqZWN0ICpjbHM7Ci0JCVB5VHlwZU9iamVjdCAqc29saWQ7CisgICAgaWYgKFB5X1RZUEUodHlwZSkgPT0gJlB5VHlwZV9UeXBlKSB7CisgICAgICAgIHJlc3VsdCA9IG1yb19pbXBsZW1lbnRhdGlvbih0eXBlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YXRpYyBQeU9iamVjdCAqbXJvX3N0cjsKKyAgICAgICAgY2hlY2tpdCA9IDE7CisgICAgICAgIG1ybyA9IGxvb2t1cF9tZXRob2QoKFB5T2JqZWN0ICopdHlwZSwgIm1ybyIsICZtcm9fc3RyKTsKKyAgICAgICAgaWYgKG1ybyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG1ybywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihtcm8pOworICAgIH0KKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB0dXBsZSA9IFB5U2VxdWVuY2VfVHVwbGUocmVzdWx0KTsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBpZiAodHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChjaGVja2l0KSB7CisgICAgICAgIFB5X3NzaXplX3QgaSwgbGVuOworICAgICAgICBQeU9iamVjdCAqY2xzOworICAgICAgICBQeVR5cGVPYmplY3QgKnNvbGlkOwogCi0JCXNvbGlkID0gc29saWRfYmFzZSh0eXBlKTsKKyAgICAgICAgc29saWQgPSBzb2xpZF9iYXNlKHR5cGUpOwogCi0JCWxlbiA9IFB5VHVwbGVfR0VUX1NJWkUodHVwbGUpOworICAgICAgICBsZW4gPSBQeVR1cGxlX0dFVF9TSVpFKHR1cGxlKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCVB5VHlwZU9iamVjdCAqdDsKLQkJCWNscyA9IFB5VHVwbGVfR0VUX0lURU0odHVwbGUsIGkpOwotCQkJaWYgKFB5Q2xhc3NfQ2hlY2soY2xzKSkgCi0JCQkJY29udGludWU7Ci0JCQllbHNlIGlmICghUHlUeXBlX0NoZWNrKGNscykpIHsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAibXJvKCkgcmV0dXJuZWQgYSBub24tY2xhc3MgKCclLjUwMHMnKSIsCi0JCQkJCSAgICAgUHlfVFlQRShjbHMpLT50cF9uYW1lKTsKLQkJCQlQeV9ERUNSRUYodHVwbGUpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXQgPSAoUHlUeXBlT2JqZWN0KiljbHM7Ci0JCQlpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoc29saWQsIHNvbGlkX2Jhc2UodCkpKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAibXJvKCkgcmV0dXJuZWQgYmFzZSB3aXRoIHVuc3VpdGFibGUgbGF5b3V0ICgnJS41MDBzJykiLAotCQkJCQkgICAgIHQtPnRwX25hbWUpOwotCQkJCVB5X0RFQ1JFRih0dXBsZSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQotCXR5cGUtPnRwX21ybyA9IHR1cGxlOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIFB5VHlwZU9iamVjdCAqdDsKKyAgICAgICAgICAgIGNscyA9IFB5VHVwbGVfR0VUX0lURU0odHVwbGUsIGkpOworICAgICAgICAgICAgaWYgKFB5Q2xhc3NfQ2hlY2soY2xzKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFQeVR5cGVfQ2hlY2soY2xzKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJtcm8oKSByZXR1cm5lZCBhIG5vbi1jbGFzcyAoJyUuNTAwcycpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoY2xzKS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ID0gKFB5VHlwZU9iamVjdCopY2xzOworICAgICAgICAgICAgaWYgKCFQeVR5cGVfSXNTdWJ0eXBlKHNvbGlkLCBzb2xpZF9iYXNlKHQpKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgIm1ybygpIHJldHVybmVkIGJhc2Ugd2l0aCB1bnN1aXRhYmxlIGxheW91dCAoJyUuNTAwcycpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgdHlwZS0+dHBfbXJvID0gdHVwbGU7CiAKLQl0eXBlX21yb19tb2RpZmllZCh0eXBlLCB0eXBlLT50cF9tcm8pOwotCS8qIGNvcm5lciBjYXNlOiB0aGUgb2xkLXN0eWxlIHN1cGVyIGNsYXNzIG1pZ2h0IGhhdmUgYmVlbiBoaWRkZW4KLQkgICBmcm9tIHRoZSBjdXN0b20gTVJPICovCi0JdHlwZV9tcm9fbW9kaWZpZWQodHlwZSwgdHlwZS0+dHBfYmFzZXMpOworICAgIHR5cGVfbXJvX21vZGlmaWVkKHR5cGUsIHR5cGUtPnRwX21ybyk7CisgICAgLyogY29ybmVyIGNhc2U6IHRoZSBvbGQtc3R5bGUgc3VwZXIgY2xhc3MgbWlnaHQgaGF2ZSBiZWVuIGhpZGRlbgorICAgICAgIGZyb20gdGhlIGN1c3RvbSBNUk8gKi8KKyAgICB0eXBlX21yb19tb2RpZmllZCh0eXBlLCB0eXBlLT50cF9iYXNlcyk7CiAKLQlQeVR5cGVfTW9kaWZpZWQodHlwZSk7CisgICAgUHlUeXBlX01vZGlmaWVkKHR5cGUpOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMTY3MCw5MiArMTY3MCw5MiBAQAogc3RhdGljIFB5VHlwZU9iamVjdCAqCiBiZXN0X2Jhc2UoUHlPYmplY3QgKmJhc2VzKQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlQeVR5cGVPYmplY3QgKmJhc2UsICp3aW5uZXIsICpjYW5kaWRhdGUsICpiYXNlX2k7Ci0JUHlPYmplY3QgKmJhc2VfcHJvdG87CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5VHlwZU9iamVjdCAqYmFzZSwgKndpbm5lciwgKmNhbmRpZGF0ZSwgKmJhc2VfaTsKKyAgICBQeU9iamVjdCAqYmFzZV9wcm90bzsKIAotCWFzc2VydChQeVR1cGxlX0NoZWNrKGJhc2VzKSk7Ci0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOwotCWFzc2VydChuID4gMCk7Ci0JYmFzZSA9IE5VTEw7Ci0Jd2lubmVyID0gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWJhc2VfcHJvdG8gPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKLQkJaWYgKFB5Q2xhc3NfQ2hlY2soYmFzZV9wcm90bykpCi0JCQljb250aW51ZTsKLQkJaWYgKCFQeVR5cGVfQ2hlY2soYmFzZV9wcm90bykpIHsKLQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImJhc2VzIG11c3QgYmUgdHlwZXMiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWJhc2VfaSA9IChQeVR5cGVPYmplY3QgKiliYXNlX3Byb3RvOwotCQlpZiAoYmFzZV9pLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJCWlmIChQeVR5cGVfUmVhZHkoYmFzZV9pKSA8IDApCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJY2FuZGlkYXRlID0gc29saWRfYmFzZShiYXNlX2kpOwotCQlpZiAod2lubmVyID09IE5VTEwpIHsKLQkJCXdpbm5lciA9IGNhbmRpZGF0ZTsKLQkJCWJhc2UgPSBiYXNlX2k7Ci0JCX0KLQkJZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZSh3aW5uZXIsIGNhbmRpZGF0ZSkpCi0JCQk7Ci0JCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoY2FuZGlkYXRlLCB3aW5uZXIpKSB7Ci0JCQl3aW5uZXIgPSBjYW5kaWRhdGU7Ci0JCQliYXNlID0gYmFzZV9pOwotCQl9Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCQkibXVsdGlwbGUgYmFzZXMgaGF2ZSAiCi0JCQkJImluc3RhbmNlIGxheS1vdXQgY29uZmxpY3QiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWlmIChiYXNlID09IE5VTEwpCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiYSBuZXctc3R5bGUgY2xhc3MgY2FuJ3QgaGF2ZSBvbmx5IGNsYXNzaWMgYmFzZXMiKTsKLQlyZXR1cm4gYmFzZTsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhiYXNlcykpOworICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKKyAgICBhc3NlcnQobiA+IDApOworICAgIGJhc2UgPSBOVUxMOworICAgIHdpbm5lciA9IE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBiYXNlX3Byb3RvID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7CisgICAgICAgIGlmIChQeUNsYXNzX0NoZWNrKGJhc2VfcHJvdG8pKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICghUHlUeXBlX0NoZWNrKGJhc2VfcHJvdG8pKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJiYXNlcyBtdXN0IGJlIHR5cGVzIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBiYXNlX2kgPSAoUHlUeXBlT2JqZWN0ICopYmFzZV9wcm90bzsKKyAgICAgICAgaWYgKGJhc2VfaS0+dHBfZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KGJhc2VfaSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGNhbmRpZGF0ZSA9IHNvbGlkX2Jhc2UoYmFzZV9pKTsKKyAgICAgICAgaWYgKHdpbm5lciA9PSBOVUxMKSB7CisgICAgICAgICAgICB3aW5uZXIgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICBiYXNlID0gYmFzZV9pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUod2lubmVyLCBjYW5kaWRhdGUpKQorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGNhbmRpZGF0ZSwgd2lubmVyKSkgeworICAgICAgICAgICAgd2lubmVyID0gY2FuZGlkYXRlOworICAgICAgICAgICAgYmFzZSA9IGJhc2VfaTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIm11bHRpcGxlIGJhc2VzIGhhdmUgIgorICAgICAgICAgICAgICAgICJpbnN0YW5jZSBsYXktb3V0IGNvbmZsaWN0Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYmFzZSA9PSBOVUxMKQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImEgbmV3LXN0eWxlIGNsYXNzIGNhbid0IGhhdmUgb25seSBjbGFzc2ljIGJhc2VzIik7CisgICAgcmV0dXJuIGJhc2U7CiB9CiAKIHN0YXRpYyBpbnQKIGV4dHJhX2l2YXJzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlUeXBlT2JqZWN0ICpiYXNlKQogewotCXNpemVfdCB0X3NpemUgPSB0eXBlLT50cF9iYXNpY3NpemU7Ci0Jc2l6ZV90IGJfc2l6ZSA9IGJhc2UtPnRwX2Jhc2ljc2l6ZTsKKyAgICBzaXplX3QgdF9zaXplID0gdHlwZS0+dHBfYmFzaWNzaXplOworICAgIHNpemVfdCBiX3NpemUgPSBiYXNlLT50cF9iYXNpY3NpemU7CiAKLQlhc3NlcnQodF9zaXplID49IGJfc2l6ZSk7IC8qIEVsc2UgdHlwZSBzbWFsbGVyIHRoYW4gYmFzZSEgKi8KLQlpZiAodHlwZS0+dHBfaXRlbXNpemUgfHwgYmFzZS0+dHBfaXRlbXNpemUpIHsKLQkJLyogSWYgaXRlbXNpemUgaXMgaW52b2x2ZWQsIHN0cmljdGVyIHJ1bGVzICovCi0JCXJldHVybiB0X3NpemUgIT0gYl9zaXplIHx8Ci0JCQl0eXBlLT50cF9pdGVtc2l6ZSAhPSBiYXNlLT50cF9pdGVtc2l6ZTsKLQl9Ci0JaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmIGJhc2UtPnRwX3dlYWtsaXN0b2Zmc2V0ID09IDAgJiYKLQkgICAgdHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgKyBzaXplb2YoUHlPYmplY3QgKikgPT0gdF9zaXplICYmCi0JICAgIHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKLQkJdF9zaXplIC09IHNpemVvZihQeU9iamVjdCAqKTsKLQlpZiAodHlwZS0+dHBfZGljdG9mZnNldCAmJiBiYXNlLT50cF9kaWN0b2Zmc2V0ID09IDAgJiYKLQkgICAgdHlwZS0+dHBfZGljdG9mZnNldCArIHNpemVvZihQeU9iamVjdCAqKSA9PSB0X3NpemUgJiYKLQkgICAgdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQotCQl0X3NpemUgLT0gc2l6ZW9mKFB5T2JqZWN0ICopOworICAgIGFzc2VydCh0X3NpemUgPj0gYl9zaXplKTsgLyogRWxzZSB0eXBlIHNtYWxsZXIgdGhhbiBiYXNlISAqLworICAgIGlmICh0eXBlLT50cF9pdGVtc2l6ZSB8fCBiYXNlLT50cF9pdGVtc2l6ZSkgeworICAgICAgICAvKiBJZiBpdGVtc2l6ZSBpcyBpbnZvbHZlZCwgc3RyaWN0ZXIgcnVsZXMgKi8KKyAgICAgICAgcmV0dXJuIHRfc2l6ZSAhPSBiX3NpemUgfHwKKyAgICAgICAgICAgIHR5cGUtPnRwX2l0ZW1zaXplICE9IGJhc2UtPnRwX2l0ZW1zaXplOworICAgIH0KKyAgICBpZiAodHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgJiYgYmFzZS0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gMCAmJgorICAgICAgICB0eXBlLT50cF93ZWFrbGlzdG9mZnNldCArIHNpemVvZihQeU9iamVjdCAqKSA9PSB0X3NpemUgJiYKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQorICAgICAgICB0X3NpemUgLT0gc2l6ZW9mKFB5T2JqZWN0ICopOworICAgIGlmICh0eXBlLT50cF9kaWN0b2Zmc2V0ICYmIGJhc2UtPnRwX2RpY3RvZmZzZXQgPT0gMCAmJgorICAgICAgICB0eXBlLT50cF9kaWN0b2Zmc2V0ICsgc2l6ZW9mKFB5T2JqZWN0ICopID09IHRfc2l6ZSAmJgorICAgICAgICB0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCisgICAgICAgIHRfc2l6ZSAtPSBzaXplb2YoUHlPYmplY3QgKik7CiAKLQlyZXR1cm4gdF9zaXplICE9IGJfc2l6ZTsKKyAgICByZXR1cm4gdF9zaXplICE9IGJfc2l6ZTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCAqCiBzb2xpZF9iYXNlKFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeVR5cGVPYmplY3QgKmJhc2U7CisgICAgUHlUeXBlT2JqZWN0ICpiYXNlOwogCi0JaWYgKHR5cGUtPnRwX2Jhc2UpCi0JCWJhc2UgPSBzb2xpZF9iYXNlKHR5cGUtPnRwX2Jhc2UpOwotCWVsc2UKLQkJYmFzZSA9ICZQeUJhc2VPYmplY3RfVHlwZTsKLQlpZiAoZXh0cmFfaXZhcnModHlwZSwgYmFzZSkpCi0JCXJldHVybiB0eXBlOwotCWVsc2UKLQkJcmV0dXJuIGJhc2U7CisgICAgaWYgKHR5cGUtPnRwX2Jhc2UpCisgICAgICAgIGJhc2UgPSBzb2xpZF9iYXNlKHR5cGUtPnRwX2Jhc2UpOworICAgIGVsc2UKKyAgICAgICAgYmFzZSA9ICZQeUJhc2VPYmplY3RfVHlwZTsKKyAgICBpZiAoZXh0cmFfaXZhcnModHlwZSwgYmFzZSkpCisgICAgICAgIHJldHVybiB0eXBlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGJhc2U7CiB9CiAKIHN0YXRpYyB2b2lkIG9iamVjdF9kZWFsbG9jKFB5T2JqZWN0ICopOwpAQCAtMTc3MSwxOTEgKzE3NzEsMTkxIEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0ICoKIGdldF9idWlsdGluX2Jhc2Vfd2l0aF9kaWN0KFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQl3aGlsZSAodHlwZS0+dHBfYmFzZSAhPSBOVUxMKSB7Ci0JCWlmICh0eXBlLT50cF9kaWN0b2Zmc2V0ICE9IDAgJiYKLQkJICAgICEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKLQkJCXJldHVybiB0eXBlOwotCQl0eXBlID0gdHlwZS0+dHBfYmFzZTsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgd2hpbGUgKHR5cGUtPnRwX2Jhc2UgIT0gTlVMTCkgeworICAgICAgICBpZiAodHlwZS0+dHBfZGljdG9mZnNldCAhPSAwICYmCisgICAgICAgICAgICAhKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkpCisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgdHlwZSA9IHR5cGUtPnRwX2Jhc2U7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2RpY3RfZGVzY3JpcHRvcihQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpkaWN0X3N0cjsKLQlQeU9iamVjdCAqZGVzY3I7CisgICAgc3RhdGljIFB5T2JqZWN0ICpkaWN0X3N0cjsKKyAgICBQeU9iamVjdCAqZGVzY3I7CiAKLQlpZiAoZGljdF9zdHIgPT0gTlVMTCkgewotCQlkaWN0X3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGljdF9fIik7Ci0JCWlmIChkaWN0X3N0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHlwZSwgZGljdF9zdHIpOwotCWlmIChkZXNjciA9PSBOVUxMIHx8ICFQeURlc2NyX0lzRGF0YShkZXNjcikpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChkaWN0X3N0ciA9PSBOVUxMKSB7CisgICAgICAgIGRpY3Rfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kaWN0X18iKTsKKyAgICAgICAgaWYgKGRpY3Rfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGVzY3IgPSBfUHlUeXBlX0xvb2t1cCh0eXBlLCBkaWN0X3N0cik7CisgICAgaWYgKGRlc2NyID09IE5VTEwgfHwgIVB5RGVzY3JfSXNEYXRhKGRlc2NyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gZGVzY3I7CisgICAgcmV0dXJuIGRlc2NyOwogfQogCiBzdGF0aWMgdm9pZAogcmFpc2VfZGljdF9kZXNjcl9lcnJvcihQeU9iamVjdCAqb2JqKQogewotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgInRoaXMgX19kaWN0X18gZGVzY3JpcHRvciBkb2VzIG5vdCBzdXBwb3J0ICIKLQkJICAgICAiJyUuMjAwcycgb2JqZWN0cyIsIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgInRoaXMgX19kaWN0X18gZGVzY3JpcHRvciBkb2VzIG5vdCBzdXBwb3J0ICIKKyAgICAgICAgICAgICAgICAgIiclLjIwMHMnIG9iamVjdHMiLCBvYmotPm9iX3R5cGUtPnRwX25hbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3VidHlwZV9kaWN0KFB5T2JqZWN0ICpvYmosIHZvaWQgKmNvbnRleHQpCiB7Ci0JUHlPYmplY3QgKipkaWN0cHRyOwotCVB5T2JqZWN0ICpkaWN0OwotCVB5VHlwZU9iamVjdCAqYmFzZTsKKyAgICBQeU9iamVjdCAqKmRpY3RwdHI7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlUeXBlT2JqZWN0ICpiYXNlOwogCi0JYmFzZSA9IGdldF9idWlsdGluX2Jhc2Vfd2l0aF9kaWN0KG9iai0+b2JfdHlwZSk7Ci0JaWYgKGJhc2UgIT0gTlVMTCkgewotCQlkZXNjcmdldGZ1bmMgZnVuYzsKLQkJUHlPYmplY3QgKmRlc2NyID0gZ2V0X2RpY3RfZGVzY3JpcHRvcihiYXNlKTsKLQkJaWYgKGRlc2NyID09IE5VTEwpIHsKLQkJCXJhaXNlX2RpY3RfZGVzY3JfZXJyb3Iob2JqKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWZ1bmMgPSBkZXNjci0+b2JfdHlwZS0+dHBfZGVzY3JfZ2V0OwotCQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCQlyYWlzZV9kaWN0X2Rlc2NyX2Vycm9yKG9iaik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gZnVuYyhkZXNjciwgb2JqLCAoUHlPYmplY3QgKikob2JqLT5vYl90eXBlKSk7Ci0JfQorICAgIGJhc2UgPSBnZXRfYnVpbHRpbl9iYXNlX3dpdGhfZGljdChvYmotPm9iX3R5cGUpOworICAgIGlmIChiYXNlICE9IE5VTEwpIHsKKyAgICAgICAgZGVzY3JnZXRmdW5jIGZ1bmM7CisgICAgICAgIFB5T2JqZWN0ICpkZXNjciA9IGdldF9kaWN0X2Rlc2NyaXB0b3IoYmFzZSk7CisgICAgICAgIGlmIChkZXNjciA9PSBOVUxMKSB7CisgICAgICAgICAgICByYWlzZV9kaWN0X2Rlc2NyX2Vycm9yKG9iaik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBmdW5jID0gZGVzY3ItPm9iX3R5cGUtPnRwX2Rlc2NyX2dldDsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmFpc2VfZGljdF9kZXNjcl9lcnJvcihvYmopOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZ1bmMoZGVzY3IsIG9iaiwgKFB5T2JqZWN0ICopKG9iai0+b2JfdHlwZSkpOworICAgIH0KIAotCWRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihvYmopOwotCWlmIChkaWN0cHRyID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSJUaGlzIG9iamVjdCBoYXMgbm8gX19kaWN0X18iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRpY3QgPSAqZGljdHB0cjsKLQlpZiAoZGljdCA9PSBOVUxMKQotCQkqZGljdHB0ciA9IGRpY3QgPSBQeURpY3RfTmV3KCk7Ci0JUHlfWElOQ1JFRihkaWN0KTsKLQlyZXR1cm4gZGljdDsKKyAgICBkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIob2JqKTsKKyAgICBpZiAoZGljdHB0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIG9iamVjdCBoYXMgbm8gX19kaWN0X18iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRpY3QgPSAqZGljdHB0cjsKKyAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICAqZGljdHB0ciA9IGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgUHlfWElOQ1JFRihkaWN0KTsKKyAgICByZXR1cm4gZGljdDsKIH0KIAogc3RhdGljIGludAogc3VidHlwZV9zZXRkaWN0KFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY29udGV4dCkKIHsKLQlQeU9iamVjdCAqKmRpY3RwdHI7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JUHlUeXBlT2JqZWN0ICpiYXNlOworICAgIFB5T2JqZWN0ICoqZGljdHB0cjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeVR5cGVPYmplY3QgKmJhc2U7CiAKLQliYXNlID0gZ2V0X2J1aWx0aW5fYmFzZV93aXRoX2RpY3Qob2JqLT5vYl90eXBlKTsKLQlpZiAoYmFzZSAhPSBOVUxMKSB7Ci0JCWRlc2Nyc2V0ZnVuYyBmdW5jOwotCQlQeU9iamVjdCAqZGVzY3IgPSBnZXRfZGljdF9kZXNjcmlwdG9yKGJhc2UpOwotCQlpZiAoZGVzY3IgPT0gTlVMTCkgewotCQkJcmFpc2VfZGljdF9kZXNjcl9lcnJvcihvYmopOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWZ1bmMgPSBkZXNjci0+b2JfdHlwZS0+dHBfZGVzY3Jfc2V0OwotCQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCQlyYWlzZV9kaWN0X2Rlc2NyX2Vycm9yKG9iaik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIGZ1bmMoZGVzY3IsIG9iaiwgdmFsdWUpOwotCX0KKyAgICBiYXNlID0gZ2V0X2J1aWx0aW5fYmFzZV93aXRoX2RpY3Qob2JqLT5vYl90eXBlKTsKKyAgICBpZiAoYmFzZSAhPSBOVUxMKSB7CisgICAgICAgIGRlc2Nyc2V0ZnVuYyBmdW5jOworICAgICAgICBQeU9iamVjdCAqZGVzY3IgPSBnZXRfZGljdF9kZXNjcmlwdG9yKGJhc2UpOworICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkgeworICAgICAgICAgICAgcmFpc2VfZGljdF9kZXNjcl9lcnJvcihvYmopOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZ1bmMgPSBkZXNjci0+b2JfdHlwZS0+dHBfZGVzY3Jfc2V0OworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICByYWlzZV9kaWN0X2Rlc2NyX2Vycm9yKG9iaik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZ1bmMoZGVzY3IsIG9iaiwgdmFsdWUpOworICAgIH0KIAotCWRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihvYmopOwotCWlmIChkaWN0cHRyID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSJUaGlzIG9iamVjdCBoYXMgbm8gX19kaWN0X18iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodmFsdWUgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiX19kaWN0X18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0aW9uYXJ5LCAiCi0JCQkgICAgICJub3QgYSAnJS4yMDBzJyIsIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlkaWN0ID0gKmRpY3RwdHI7Ci0JUHlfWElOQ1JFRih2YWx1ZSk7Ci0JKmRpY3RwdHIgPSB2YWx1ZTsKLQlQeV9YREVDUkVGKGRpY3QpOwotCXJldHVybiAwOworICAgIGRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihvYmopOworICAgIGlmIChkaWN0cHRyID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgb2JqZWN0IGhhcyBubyBfX2RpY3RfXyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh2YWx1ZSAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19kaWN0X18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0aW9uYXJ5LCAiCisgICAgICAgICAgICAgICAgICAgICAibm90IGEgJyUuMjAwcyciLCBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZGljdCA9ICpkaWN0cHRyOworICAgIFB5X1hJTkNSRUYodmFsdWUpOworICAgICpkaWN0cHRyID0gdmFsdWU7CisgICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN1YnR5cGVfZ2V0d2Vha3JlZihQeU9iamVjdCAqb2JqLCB2b2lkICpjb250ZXh0KQogewotCVB5T2JqZWN0ICoqd2Vha2xpc3RwdHI7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqKndlYWtsaXN0cHRyOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoUHlfVFlQRShvYmopLT50cF93ZWFrbGlzdG9mZnNldCA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkiVGhpcyBvYmplY3QgaGFzIG5vIF9fd2Vha3JlZl9fIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhc3NlcnQoUHlfVFlQRShvYmopLT50cF93ZWFrbGlzdG9mZnNldCA+IDApOwotCWFzc2VydChQeV9UWVBFKG9iaiktPnRwX3dlYWtsaXN0b2Zmc2V0ICsgc2l6ZW9mKFB5T2JqZWN0ICopIDw9Ci0JICAgICAgIChzaXplX3QpKFB5X1RZUEUob2JqKS0+dHBfYmFzaWNzaXplKSk7Ci0Jd2Vha2xpc3RwdHIgPSAoUHlPYmplY3QgKiopCi0JCSgoY2hhciAqKW9iaiArIFB5X1RZUEUob2JqKS0+dHBfd2Vha2xpc3RvZmZzZXQpOwotCWlmICgqd2Vha2xpc3RwdHIgPT0gTlVMTCkKLQkJcmVzdWx0ID0gUHlfTm9uZTsKLQllbHNlCi0JCXJlc3VsdCA9ICp3ZWFrbGlzdHB0cjsKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChQeV9UWVBFKG9iaiktPnRwX3dlYWtsaXN0b2Zmc2V0ID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgb2JqZWN0IGhhcyBubyBfX3dlYWtyZWZfXyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXNzZXJ0KFB5X1RZUEUob2JqKS0+dHBfd2Vha2xpc3RvZmZzZXQgPiAwKTsKKyAgICBhc3NlcnQoUHlfVFlQRShvYmopLT50cF93ZWFrbGlzdG9mZnNldCArIHNpemVvZihQeU9iamVjdCAqKSA8PQorICAgICAgICAgICAoc2l6ZV90KShQeV9UWVBFKG9iaiktPnRwX2Jhc2ljc2l6ZSkpOworICAgIHdlYWtsaXN0cHRyID0gKFB5T2JqZWN0ICoqKQorICAgICAgICAoKGNoYXIgKilvYmogKyBQeV9UWVBFKG9iaiktPnRwX3dlYWtsaXN0b2Zmc2V0KTsKKyAgICBpZiAoKndlYWtsaXN0cHRyID09IE5VTEwpCisgICAgICAgIHJlc3VsdCA9IFB5X05vbmU7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSAqd2Vha2xpc3RwdHI7CisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogVGhyZWUgdmFyaWFudHMgb24gdGhlIHN1YnR5cGVfZ2V0c2V0cyBsaXN0LiAqLwogCiBzdGF0aWMgUHlHZXRTZXREZWYgc3VidHlwZV9nZXRzZXRzX2Z1bGxbXSA9IHsKLQl7Il9fZGljdF9fIiwgc3VidHlwZV9kaWN0LCBzdWJ0eXBlX3NldGRpY3QsCi0JIFB5RG9jX1NUUigiZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKSIpfSwKLQl7Il9fd2Vha3JlZl9fIiwgc3VidHlwZV9nZXR3ZWFrcmVmLCBOVUxMLAotCSBQeURvY19TVFIoImxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QgKGlmIGRlZmluZWQpIil9LAotCXswfQorICAgIHsiX19kaWN0X18iLCBzdWJ0eXBlX2RpY3QsIHN1YnR5cGVfc2V0ZGljdCwKKyAgICAgUHlEb2NfU1RSKCJkaWN0aW9uYXJ5IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMgKGlmIGRlZmluZWQpIil9LAorICAgIHsiX193ZWFrcmVmX18iLCBzdWJ0eXBlX2dldHdlYWtyZWYsIE5VTEwsCisgICAgIFB5RG9jX1NUUigibGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdCAoaWYgZGVmaW5lZCkiKX0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlHZXRTZXREZWYgc3VidHlwZV9nZXRzZXRzX2RpY3Rfb25seVtdID0gewotCXsiX19kaWN0X18iLCBzdWJ0eXBlX2RpY3QsIHN1YnR5cGVfc2V0ZGljdCwKLQkgUHlEb2NfU1RSKCJkaWN0aW9uYXJ5IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMgKGlmIGRlZmluZWQpIil9LAotCXswfQorICAgIHsiX19kaWN0X18iLCBzdWJ0eXBlX2RpY3QsIHN1YnR5cGVfc2V0ZGljdCwKKyAgICAgUHlEb2NfU1RSKCJkaWN0aW9uYXJ5IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMgKGlmIGRlZmluZWQpIil9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIHN1YnR5cGVfZ2V0c2V0c193ZWFrcmVmX29ubHlbXSA9IHsKLQl7Il9fd2Vha3JlZl9fIiwgc3VidHlwZV9nZXR3ZWFrcmVmLCBOVUxMLAotCSBQeURvY19TVFIoImxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QgKGlmIGRlZmluZWQpIil9LAotCXswfQorICAgIHsiX193ZWFrcmVmX18iLCBzdWJ0eXBlX2dldHdlYWtyZWYsIE5VTEwsCisgICAgIFB5RG9jX1NUUigibGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdCAoaWYgZGVmaW5lZCkiKX0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgaW50CiB2YWxpZF9pZGVudGlmaWVyKFB5T2JqZWN0ICpzKQogewotCXVuc2lnbmVkIGNoYXIgKnA7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhzKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiX19zbG90c19fIGl0ZW1zIG11c3QgYmUgc3RyaW5ncywgbm90ICclLjIwMHMnIiwKLQkJCSAgICAgUHlfVFlQRShzKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQlwID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHMpOwotCW4gPSBQeVN0cmluZ19HRVRfU0laRShzKTsKLQkvKiBXZSBtdXN0IHJlamVjdCBhbiBlbXB0eSBuYW1lLiAgQXMgYSBoYWNrLCB3ZSBidW1wIHRoZQotCSAgIGxlbmd0aCB0byAxIHNvIHRoYXQgdGhlIGxvb3Agd2lsbCBiYWxrIG9uIHRoZSB0cmFpbGluZyBcMC4gKi8KLQlpZiAobiA9PSAwKQotCQluID0gMTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBwKyspIHsKLQkJaWYgKCEoaSA9PSAwID8gaXNhbHBoYSgqcCkgOiBpc2FsbnVtKCpwKSkgJiYgKnAgIT0gJ18nKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiX19zbG90c19fIG11c3QgYmUgaWRlbnRpZmllcnMiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXJldHVybiAxOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2socykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJfX3Nsb3RzX18gaXRlbXMgbXVzdCBiZSBzdHJpbmdzLCBub3QgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHMpOworICAgIG4gPSBQeVN0cmluZ19HRVRfU0laRShzKTsKKyAgICAvKiBXZSBtdXN0IHJlamVjdCBhbiBlbXB0eSBuYW1lLiAgQXMgYSBoYWNrLCB3ZSBidW1wIHRoZQorICAgICAgIGxlbmd0aCB0byAxIHNvIHRoYXQgdGhlIGxvb3Agd2lsbCBiYWxrIG9uIHRoZSB0cmFpbGluZyBcMC4gKi8KKyAgICBpZiAobiA9PSAwKQorICAgICAgICBuID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBwKyspIHsKKyAgICAgICAgaWYgKCEoaSA9PSAwID8gaXNhbHBoYSgqcCkgOiBpc2FsbnVtKCpwKSkgJiYgKnAgIT0gJ18nKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX3Nsb3RzX18gbXVzdCBiZSBpZGVudGlmaWVycyIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCkBAIC0xOTY0LDMzICsxOTY0LDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogX3VuaWNvZGVfdG9fc3RyaW5nKFB5T2JqZWN0ICpzbG90cywgUHlfc3NpemVfdCBuc2xvdHMpCiB7Ci0JUHlPYmplY3QgKnRtcCA9IE5VTEw7Ci0JUHlPYmplY3QgKnNsb3RfbmFtZSwgKm5ld19uYW1lOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqdG1wID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc2xvdF9uYW1lLCAqbmV3X25hbWU7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG5zbG90czsgaSsrKSB7Ci0JCWlmIChQeVVuaWNvZGVfQ2hlY2soc2xvdF9uYW1lID0gUHlUdXBsZV9HRVRfSVRFTShzbG90cywgaSkpKSB7Ci0JCQlpZiAodG1wID09IE5VTEwpIHsKLQkJCQl0bXAgPSBQeVNlcXVlbmNlX0xpc3Qoc2xvdHMpOwotCQkJCWlmICh0bXAgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQluZXdfbmFtZSA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhzbG90X25hbWUsCi0JCQkJCQkJCSAgICAgTlVMTCk7Ci0JCQlpZiAobmV3X25hbWUgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRih0bXApOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJUHlfSU5DUkVGKG5ld19uYW1lKTsKLQkJCVB5TGlzdF9TRVRfSVRFTSh0bXAsIGksIG5ld19uYW1lKTsKLQkJCVB5X0RFQ1JFRihzbG90X25hbWUpOwotCQl9Ci0JfQotCWlmICh0bXAgIT0gTlVMTCkgewotCQlzbG90cyA9IFB5TGlzdF9Bc1R1cGxlKHRtcCk7Ci0JCVB5X0RFQ1JFRih0bXApOwotCX0KLQlyZXR1cm4gc2xvdHM7CisgICAgZm9yIChpID0gMDsgaSA8IG5zbG90czsgaSsrKSB7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soc2xvdF9uYW1lID0gUHlUdXBsZV9HRVRfSVRFTShzbG90cywgaSkpKSB7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBQeVNlcXVlbmNlX0xpc3Qoc2xvdHMpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdfbmFtZSA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhzbG90X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIGlmIChuZXdfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9JTkNSRUYobmV3X25hbWUpOworICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHRtcCwgaSwgbmV3X25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHNsb3RfbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRtcCAhPSBOVUxMKSB7CisgICAgICAgIHNsb3RzID0gUHlMaXN0X0FzVHVwbGUodG1wKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgfQorICAgIHJldHVybiBzbG90czsKIH0KICNlbmRpZgogCkBAIC0yMDAxLDQ1MCArMjAwMSw0NTAgQEAKIHN0YXRpYyBpbnQKIHR5cGVfaW5pdChQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaW50IHJlczsKKyAgICBpbnQgcmVzOwogCi0JYXNzZXJ0KGFyZ3MgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLQlhc3NlcnQoa3dkcyA9PSBOVUxMIHx8IFB5RGljdF9DaGVjayhrd2RzKSk7CisgICAgYXNzZXJ0KGFyZ3MgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICBhc3NlcnQoa3dkcyA9PSBOVUxMIHx8IFB5RGljdF9DaGVjayhrd2RzKSk7CiAKLQlpZiAoa3dkcyAhPSBOVUxMICYmIFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSAhPSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInR5cGUuX19pbml0X18oKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50cyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChrd2RzICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpICE9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlLl9faW5pdF9fKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChhcmdzICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayhhcmdzKSAmJgotCSAgICAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSAhPSAxICYmIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgIT0gMykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidHlwZS5fX2luaXRfXygpIHRha2VzIDEgb3IgMyBhcmd1bWVudHMiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoYXJncyAhPSBOVUxMICYmIFB5VHVwbGVfQ2hlY2soYXJncykgJiYKKyAgICAgICAgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgIT0gMSAmJiBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICE9IDMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidHlwZS5fX2luaXRfXygpIHRha2VzIDEgb3IgMyBhcmd1bWVudHMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIENhbGwgb2JqZWN0Ll9faW5pdF9fKHNlbGYpIG5vdy4gKi8KLQkvKiBYWFggQ291bGQgY2FsbCBzdXBlcih0eXBlLCBjbHMpLl9faW5pdF9fKCkgYnV0IHdoYXQncyB0aGUgcG9pbnQ/ICovCi0JYXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMCwgMCk7Ci0JcmVzID0gb2JqZWN0X2luaXQoY2xzLCBhcmdzLCBOVUxMKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHJlczsKKyAgICAvKiBDYWxsIG9iamVjdC5fX2luaXRfXyhzZWxmKSBub3cuICovCisgICAgLyogWFhYIENvdWxkIGNhbGwgc3VwZXIodHlwZSwgY2xzKS5fX2luaXRfXygpIGJ1dCB3aGF0J3MgdGhlIHBvaW50PyAqLworICAgIGFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDAsIDApOworICAgIHJlcyA9IG9iamVjdF9pbml0KGNscywgYXJncywgTlVMTCk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0eXBlX25ldyhQeVR5cGVPYmplY3QgKm1ldGF0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKm5hbWUsICpiYXNlcywgKmRpY3Q7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJuYW1lIiwgImJhc2VzIiwgImRpY3QiLCAwfTsKLQlQeU9iamVjdCAqc2xvdHMsICp0bXAsICpuZXdzbG90czsKLQlQeVR5cGVPYmplY3QgKnR5cGUsICpiYXNlLCAqdG1wdHlwZSwgKndpbm5lcjsKLQlQeUhlYXBUeXBlT2JqZWN0ICpldDsKLQlQeU1lbWJlckRlZiAqbXA7Ci0JUHlfc3NpemVfdCBpLCBuYmFzZXMsIG5zbG90cywgc2xvdG9mZnNldCwgYWRkX2RpY3QsIGFkZF93ZWFrOwotCWludCBqLCBtYXlfYWRkX2RpY3QsIG1heV9hZGRfd2VhazsKKyAgICBQeU9iamVjdCAqbmFtZSwgKmJhc2VzLCAqZGljdDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAiYmFzZXMiLCAiZGljdCIsIDB9OworICAgIFB5T2JqZWN0ICpzbG90cywgKnRtcCwgKm5ld3Nsb3RzOworICAgIFB5VHlwZU9iamVjdCAqdHlwZSwgKmJhc2UsICp0bXB0eXBlLCAqd2lubmVyOworICAgIFB5SGVhcFR5cGVPYmplY3QgKmV0OworICAgIFB5TWVtYmVyRGVmICptcDsKKyAgICBQeV9zc2l6ZV90IGksIG5iYXNlcywgbnNsb3RzLCBzbG90b2Zmc2V0LCBhZGRfZGljdCwgYWRkX3dlYWs7CisgICAgaW50IGosIG1heV9hZGRfZGljdCwgbWF5X2FkZF93ZWFrOwogCi0JYXNzZXJ0KGFyZ3MgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLQlhc3NlcnQoa3dkcyA9PSBOVUxMIHx8IFB5RGljdF9DaGVjayhrd2RzKSk7CisgICAgYXNzZXJ0KGFyZ3MgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICBhc3NlcnQoa3dkcyA9PSBOVUxMIHx8IFB5RGljdF9DaGVjayhrd2RzKSk7CiAKLQkvKiBTcGVjaWFsIGNhc2U6IHR5cGUoeCkgc2hvdWxkIHJldHVybiB4LT5vYl90eXBlICovCi0JewotCQljb25zdCBQeV9zc2l6ZV90IG5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQkJY29uc3QgUHlfc3NpemVfdCBua3dkcyA9IGt3ZHMgPT0gTlVMTCA/IDAgOiBQeURpY3RfU2l6ZShrd2RzKTsKKyAgICAvKiBTcGVjaWFsIGNhc2U6IHR5cGUoeCkgc2hvdWxkIHJldHVybiB4LT5vYl90eXBlICovCisgICAgeworICAgICAgICBjb25zdCBQeV9zc2l6ZV90IG5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICAgICAgY29uc3QgUHlfc3NpemVfdCBua3dkcyA9IGt3ZHMgPT0gTlVMTCA/IDAgOiBQeURpY3RfU2l6ZShrd2RzKTsKIAotCQlpZiAoUHlUeXBlX0NoZWNrRXhhY3QobWV0YXR5cGUpICYmIG5hcmdzID09IDEgJiYgbmt3ZHMgPT0gMCkgewotCQkJUHlPYmplY3QgKnggPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCQkJUHlfSU5DUkVGKFB5X1RZUEUoeCkpOwotCQkJcmV0dXJuIChQeU9iamVjdCAqKSBQeV9UWVBFKHgpOwotCQl9CisgICAgICAgIGlmIChQeVR5cGVfQ2hlY2tFeGFjdChtZXRhdHlwZSkgJiYgbmFyZ3MgPT0gMSAmJiBua3dkcyA9PSAwKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqeCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfVFlQRSh4KSk7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIFB5X1RZUEUoeCk7CisgICAgICAgIH0KIAotCQkvKiBTRiBidWcgNDc1MzI3IC0tIGlmIHRoYXQgZGlkbid0IHRyaWdnZXIsIHdlIG5lZWQgMwotCQkgICBhcmd1bWVudHMuIGJ1dCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMgYmVsb3cgbWF5IGdpdmUKLQkJICAgYSBtc2cgc2F5aW5nIHR5cGUoKSBuZWVkcyBleGFjdGx5IDMuICovCi0JCWlmIChuYXJncyArIG5rd2RzICE9IDMpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJ0eXBlKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50cyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgICAgIC8qIFNGIGJ1ZyA0NzUzMjcgLS0gaWYgdGhhdCBkaWRuJ3QgdHJpZ2dlciwgd2UgbmVlZCAzCisgICAgICAgICAgIGFyZ3VtZW50cy4gYnV0IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyBiZWxvdyBtYXkgZ2l2ZQorICAgICAgICAgICBhIG1zZyBzYXlpbmcgdHlwZSgpIG5lZWRzIGV4YWN0bHkgMy4gKi8KKyAgICAgICAgaWYgKG5hcmdzICsgbmt3ZHMgIT0gMykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSgpIHRha2VzIDEgb3IgMyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JLyogQ2hlY2sgYXJndW1lbnRzOiAobmFtZSwgYmFzZXMsIGRpY3QpICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIlNPIU8hOnR5cGUiLCBrd2xpc3QsCi0JCQkJCSAmbmFtZSwKLQkJCQkJICZQeVR1cGxlX1R5cGUsICZiYXNlcywKLQkJCQkJICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBDaGVjayBhcmd1bWVudHM6IChuYW1lLCBiYXNlcywgZGljdCkgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiU08hTyE6dHlwZSIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlUdXBsZV9UeXBlLCAmYmFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5RGljdF9UeXBlLCAmZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogRGV0ZXJtaW5lIHRoZSBwcm9wZXIgbWV0YXR5cGUgdG8gZGVhbCB3aXRoIHRoaXMsCi0JICAgYW5kIGNoZWNrIGZvciBtZXRhdHlwZSBjb25mbGljdHMgd2hpbGUgd2UncmUgYXQgaXQuCi0JICAgTm90ZSB0aGF0IGlmIHNvbWUgb3RoZXIgbWV0YXR5cGUgd2lucyB0byBjb250cmFjdCwKLQkgICBpdCdzIHBvc3NpYmxlIHRoYXQgaXRzIGluc3RhbmNlcyBhcmUgbm90IHR5cGVzLiAqLwotCW5iYXNlcyA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOwotCXdpbm5lciA9IG1ldGF0eXBlOwotCWZvciAoaSA9IDA7IGkgPCBuYmFzZXM7IGkrKykgewotCQl0bXAgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKLQkJdG1wdHlwZSA9IHRtcC0+b2JfdHlwZTsKLQkJaWYgKHRtcHR5cGUgPT0gJlB5Q2xhc3NfVHlwZSkKLQkJCWNvbnRpbnVlOyAvKiBTcGVjaWFsIGNhc2UgY2xhc3NpYyBjbGFzc2VzICovCi0JCWlmIChQeVR5cGVfSXNTdWJ0eXBlKHdpbm5lciwgdG1wdHlwZSkpCi0JCQljb250aW51ZTsKLQkJaWYgKFB5VHlwZV9Jc1N1YnR5cGUodG1wdHlwZSwgd2lubmVyKSkgewotCQkJd2lubmVyID0gdG1wdHlwZTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1ldGFjbGFzcyBjb25mbGljdDogIgotCQkJCSJ0aGUgbWV0YWNsYXNzIG9mIGEgZGVyaXZlZCBjbGFzcyAiCi0JCQkJIm11c3QgYmUgYSAobm9uLXN0cmljdCkgc3ViY2xhc3MgIgotCQkJCSJvZiB0aGUgbWV0YWNsYXNzZXMgb2YgYWxsIGl0cyBiYXNlcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHdpbm5lciAhPSBtZXRhdHlwZSkgewotCQlpZiAod2lubmVyLT50cF9uZXcgIT0gdHlwZV9uZXcpIC8qIFBhc3MgaXQgdG8gdGhlIHdpbm5lciAqLwotCQkJcmV0dXJuIHdpbm5lci0+dHBfbmV3KHdpbm5lciwgYXJncywga3dkcyk7Ci0JCW1ldGF0eXBlID0gd2lubmVyOwotCX0KKyAgICAvKiBEZXRlcm1pbmUgdGhlIHByb3BlciBtZXRhdHlwZSB0byBkZWFsIHdpdGggdGhpcywKKyAgICAgICBhbmQgY2hlY2sgZm9yIG1ldGF0eXBlIGNvbmZsaWN0cyB3aGlsZSB3ZSdyZSBhdCBpdC4KKyAgICAgICBOb3RlIHRoYXQgaWYgc29tZSBvdGhlciBtZXRhdHlwZSB3aW5zIHRvIGNvbnRyYWN0LAorICAgICAgIGl0J3MgcG9zc2libGUgdGhhdCBpdHMgaW5zdGFuY2VzIGFyZSBub3QgdHlwZXMuICovCisgICAgbmJhc2VzID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7CisgICAgd2lubmVyID0gbWV0YXR5cGU7CisgICAgZm9yIChpID0gMDsgaSA8IG5iYXNlczsgaSsrKSB7CisgICAgICAgIHRtcCA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOworICAgICAgICB0bXB0eXBlID0gdG1wLT5vYl90eXBlOworICAgICAgICBpZiAodG1wdHlwZSA9PSAmUHlDbGFzc19UeXBlKQorICAgICAgICAgICAgY29udGludWU7IC8qIFNwZWNpYWwgY2FzZSBjbGFzc2ljIGNsYXNzZXMgKi8KKyAgICAgICAgaWYgKFB5VHlwZV9Jc1N1YnR5cGUod2lubmVyLCB0bXB0eXBlKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoUHlUeXBlX0lzU3VidHlwZSh0bXB0eXBlLCB3aW5uZXIpKSB7CisgICAgICAgICAgICB3aW5uZXIgPSB0bXB0eXBlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhY2xhc3MgY29uZmxpY3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgbWV0YWNsYXNzIG9mIGEgZGVyaXZlZCBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBhIChub24tc3RyaWN0KSBzdWJjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAib2YgdGhlIG1ldGFjbGFzc2VzIG9mIGFsbCBpdHMgYmFzZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh3aW5uZXIgIT0gbWV0YXR5cGUpIHsKKyAgICAgICAgaWYgKHdpbm5lci0+dHBfbmV3ICE9IHR5cGVfbmV3KSAvKiBQYXNzIGl0IHRvIHRoZSB3aW5uZXIgKi8KKyAgICAgICAgICAgIHJldHVybiB3aW5uZXItPnRwX25ldyh3aW5uZXIsIGFyZ3MsIGt3ZHMpOworICAgICAgICBtZXRhdHlwZSA9IHdpbm5lcjsKKyAgICB9CiAKLQkvKiBBZGp1c3QgZm9yIGVtcHR5IHR1cGxlIGJhc2VzICovCi0JaWYgKG5iYXNlcyA9PSAwKSB7Ci0JCWJhc2VzID0gUHlUdXBsZV9QYWNrKDEsICZQeUJhc2VPYmplY3RfVHlwZSk7Ci0JCWlmIChiYXNlcyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW5iYXNlcyA9IDE7Ci0JfQotCWVsc2UKLQkJUHlfSU5DUkVGKGJhc2VzKTsKKyAgICAvKiBBZGp1c3QgZm9yIGVtcHR5IHR1cGxlIGJhc2VzICovCisgICAgaWYgKG5iYXNlcyA9PSAwKSB7CisgICAgICAgIGJhc2VzID0gUHlUdXBsZV9QYWNrKDEsICZQeUJhc2VPYmplY3RfVHlwZSk7CisgICAgICAgIGlmIChiYXNlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG5iYXNlcyA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKGJhc2VzKTsKIAotCS8qIFhYWCBGcm9tIGhlcmUgdW50aWwgdHlwZSBpcyBhbGxvY2F0ZWQsICJyZXR1cm4gTlVMTCIgbGVha3MgYmFzZXMhICovCisgICAgLyogWFhYIEZyb20gaGVyZSB1bnRpbCB0eXBlIGlzIGFsbG9jYXRlZCwgInJldHVybiBOVUxMIiBsZWFrcyBiYXNlcyEgKi8KIAotCS8qIENhbGN1bGF0ZSBiZXN0IGJhc2UsIGFuZCBjaGVjayB0aGF0IGFsbCBiYXNlcyBhcmUgdHlwZSBvYmplY3RzICovCi0JYmFzZSA9IGJlc3RfYmFzZShiYXNlcyk7Ci0JaWYgKGJhc2UgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoYmFzZXMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeVR5cGVfSGFzRmVhdHVyZShiYXNlLCBQeV9UUEZMQUdTX0JBU0VUWVBFKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAidHlwZSAnJS4xMDBzJyBpcyBub3QgYW4gYWNjZXB0YWJsZSBiYXNlIHR5cGUiLAotCQkJICAgICBiYXNlLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIENhbGN1bGF0ZSBiZXN0IGJhc2UsIGFuZCBjaGVjayB0aGF0IGFsbCBiYXNlcyBhcmUgdHlwZSBvYmplY3RzICovCisgICAgYmFzZSA9IGJlc3RfYmFzZShiYXNlcyk7CisgICAgaWYgKGJhc2UgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeVR5cGVfSGFzRmVhdHVyZShiYXNlLCBQeV9UUEZMQUdTX0JBU0VUWVBFKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInR5cGUgJyUuMTAwcycgaXMgbm90IGFuIGFjY2VwdGFibGUgYmFzZSB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIGJhc2UtPnRwX25hbWUpOworICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBDaGVjayBmb3IgYSBfX3Nsb3RzX18gc2VxdWVuY2UgdmFyaWFibGUgaW4gZGljdCwgYW5kIGNvdW50IGl0ICovCi0Jc2xvdHMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiX19zbG90c19fIik7Ci0JbnNsb3RzID0gMDsKLQlhZGRfZGljdCA9IDA7Ci0JYWRkX3dlYWsgPSAwOwotCW1heV9hZGRfZGljdCA9IGJhc2UtPnRwX2RpY3RvZmZzZXQgPT0gMDsKLQltYXlfYWRkX3dlYWsgPSBiYXNlLT50cF93ZWFrbGlzdG9mZnNldCA9PSAwICYmIGJhc2UtPnRwX2l0ZW1zaXplID09IDA7Ci0JaWYgKHNsb3RzID09IE5VTEwpIHsKLQkJaWYgKG1heV9hZGRfZGljdCkgewotCQkJYWRkX2RpY3QrKzsKLQkJfQotCQlpZiAobWF5X2FkZF93ZWFrKSB7Ci0JCQlhZGRfd2VhaysrOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBIYXZlIHNsb3RzICovCisgICAgLyogQ2hlY2sgZm9yIGEgX19zbG90c19fIHNlcXVlbmNlIHZhcmlhYmxlIGluIGRpY3QsIGFuZCBjb3VudCBpdCAqLworICAgIHNsb3RzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fc2xvdHNfXyIpOworICAgIG5zbG90cyA9IDA7CisgICAgYWRkX2RpY3QgPSAwOworICAgIGFkZF93ZWFrID0gMDsKKyAgICBtYXlfYWRkX2RpY3QgPSBiYXNlLT50cF9kaWN0b2Zmc2V0ID09IDA7CisgICAgbWF5X2FkZF93ZWFrID0gYmFzZS0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gMCAmJiBiYXNlLT50cF9pdGVtc2l6ZSA9PSAwOworICAgIGlmIChzbG90cyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChtYXlfYWRkX2RpY3QpIHsKKyAgICAgICAgICAgIGFkZF9kaWN0Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heV9hZGRfd2VhaykgeworICAgICAgICAgICAgYWRkX3dlYWsrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogSGF2ZSBzbG90cyAqLwogCi0JCS8qIE1ha2UgaXQgaW50byBhIHR1cGxlICovCi0JCWlmIChQeVN0cmluZ19DaGVjayhzbG90cykgfHwgUHlVbmljb2RlX0NoZWNrKHNsb3RzKSkKLQkJCXNsb3RzID0gUHlUdXBsZV9QYWNrKDEsIHNsb3RzKTsKLQkJZWxzZQotCQkJc2xvdHMgPSBQeVNlcXVlbmNlX1R1cGxlKHNsb3RzKTsKLQkJaWYgKHNsb3RzID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlhc3NlcnQoUHlUdXBsZV9DaGVjayhzbG90cykpOworICAgICAgICAvKiBNYWtlIGl0IGludG8gYSB0dXBsZSAqLworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc2xvdHMpIHx8IFB5VW5pY29kZV9DaGVjayhzbG90cykpCisgICAgICAgICAgICBzbG90cyA9IFB5VHVwbGVfUGFjaygxLCBzbG90cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNsb3RzID0gUHlTZXF1ZW5jZV9UdXBsZShzbG90cyk7CisgICAgICAgIGlmIChzbG90cyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soc2xvdHMpKTsKIAotCQkvKiBBcmUgc2xvdHMgYWxsb3dlZD8gKi8KLQkJbnNsb3RzID0gUHlUdXBsZV9HRVRfU0laRShzbG90cyk7Ci0JCWlmIChuc2xvdHMgPiAwICYmIGJhc2UtPnRwX2l0ZW1zaXplICE9IDApIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAibm9uZW1wdHkgX19zbG90c19fICIKLQkJCQkgICAgICJub3Qgc3VwcG9ydGVkIGZvciBzdWJ0eXBlIG9mICclcyciLAotCQkJCSAgICAgYmFzZS0+dHBfbmFtZSk7Ci0JCSAgYmFkX3Nsb3RzOgotCQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJCVB5X0RFQ1JFRihzbG90cyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICAvKiBBcmUgc2xvdHMgYWxsb3dlZD8gKi8KKyAgICAgICAgbnNsb3RzID0gUHlUdXBsZV9HRVRfU0laRShzbG90cyk7CisgICAgICAgIGlmIChuc2xvdHMgPiAwICYmIGJhc2UtPnRwX2l0ZW1zaXplICE9IDApIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbmVtcHR5IF9fc2xvdHNfXyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBzdXBwb3J0ZWQgZm9yIHN1YnR5cGUgb2YgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+dHBfbmFtZSk7CisgICAgICAgICAgYmFkX3Nsb3RzOgorICAgICAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzbG90cyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQl0bXAgPSBfdW5pY29kZV90b19zdHJpbmcoc2xvdHMsIG5zbG90cyk7Ci0JCWlmICh0bXAgPT0gTlVMTCkKLQkJCWdvdG8gYmFkX3Nsb3RzOwotCQlpZiAodG1wICE9IHNsb3RzKSB7Ci0JCQlQeV9ERUNSRUYoc2xvdHMpOwotCQkJc2xvdHMgPSB0bXA7Ci0JCX0KKyAgICAgICAgdG1wID0gX3VuaWNvZGVfdG9fc3RyaW5nKHNsb3RzLCBuc2xvdHMpOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGJhZF9zbG90czsKKyAgICAgICAgaWYgKHRtcCAhPSBzbG90cykgeworICAgICAgICAgICAgUHlfREVDUkVGKHNsb3RzKTsKKyAgICAgICAgICAgIHNsb3RzID0gdG1wOworICAgICAgICB9CiAjZW5kaWYKLQkJLyogQ2hlY2sgZm9yIHZhbGlkIHNsb3QgbmFtZXMgYW5kIHR3byBzcGVjaWFsIGNhc2VzICovCi0JCWZvciAoaSA9IDA7IGkgPCBuc2xvdHM7IGkrKykgewotCQkJUHlPYmplY3QgKnRtcCA9IFB5VHVwbGVfR0VUX0lURU0oc2xvdHMsIGkpOwotCQkJY2hhciAqczsKLQkJCWlmICghdmFsaWRfaWRlbnRpZmllcih0bXApKQotCQkJCWdvdG8gYmFkX3Nsb3RzOwotCQkJYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHRtcCkpOwotCQkJcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0bXApOwotCQkJaWYgKHN0cmNtcChzLCAiX19kaWN0X18iKSA9PSAwKSB7Ci0JCQkJaWYgKCFtYXlfYWRkX2RpY3QgfHwgYWRkX2RpY3QpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJfX2RpY3RfXyBzbG90IGRpc2FsbG93ZWQ6ICIKLQkJCQkJCSJ3ZSBhbHJlYWR5IGdvdCBvbmUiKTsKLQkJCQkJZ290byBiYWRfc2xvdHM7Ci0JCQkJfQotCQkJCWFkZF9kaWN0Kys7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKHMsICJfX3dlYWtyZWZfXyIpID09IDApIHsKLQkJCQlpZiAoIW1heV9hZGRfd2VhayB8fCBhZGRfd2VhaykgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkJIl9fd2Vha3JlZl9fIHNsb3QgZGlzYWxsb3dlZDogIgotCQkJCQkJImVpdGhlciB3ZSBhbHJlYWR5IGdvdCBvbmUsICIKLQkJCQkJCSJvciBfX2l0ZW1zaXplX18gIT0gMCIpOwotCQkJCQlnb3RvIGJhZF9zbG90czsKLQkJCQl9Ci0JCQkJYWRkX3dlYWsrKzsKLQkJCX0KLQkJfQorICAgICAgICAvKiBDaGVjayBmb3IgdmFsaWQgc2xvdCBuYW1lcyBhbmQgdHdvIHNwZWNpYWwgY2FzZXMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zbG90czsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdG1wID0gUHlUdXBsZV9HRVRfSVRFTShzbG90cywgaSk7CisgICAgICAgICAgICBjaGFyICpzOworICAgICAgICAgICAgaWYgKCF2YWxpZF9pZGVudGlmaWVyKHRtcCkpCisgICAgICAgICAgICAgICAgZ290byBiYWRfc2xvdHM7CisgICAgICAgICAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2sodG1wKSk7CisgICAgICAgICAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRtcCk7CisgICAgICAgICAgICBpZiAoc3RyY21wKHMsICJfX2RpY3RfXyIpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1heV9hZGRfZGljdCB8fCBhZGRfZGljdCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fZGljdF9fIHNsb3QgZGlzYWxsb3dlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIndlIGFscmVhZHkgZ290IG9uZSIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9zbG90czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkX2RpY3QrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJjbXAocywgIl9fd2Vha3JlZl9fIikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghbWF5X2FkZF93ZWFrIHx8IGFkZF93ZWFrKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX193ZWFrcmVmX18gc2xvdCBkaXNhbGxvd2VkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZWl0aGVyIHdlIGFscmVhZHkgZ290IG9uZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yIF9faXRlbXNpemVfXyAhPSAwIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX3Nsb3RzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRfd2VhaysrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLyogQ29weSBzbG90cyBpbnRvIGEgbGlzdCwgbWFuZ2xlIG5hbWVzIGFuZCBzb3J0IHRoZW0uCi0JCSAgIFNvcnRlZCBuYW1lcyBhcmUgbmVlZGVkIGZvciBfX2NsYXNzX18gYXNzaWdubWVudC4KLQkJICAgQ29udmVydCB0aGVtIGJhY2sgdG8gdHVwbGUgYXQgdGhlIGVuZC4KLQkJKi8KLQkJbmV3c2xvdHMgPSBQeUxpc3RfTmV3KG5zbG90cyAtIGFkZF9kaWN0IC0gYWRkX3dlYWspOwotCQlpZiAobmV3c2xvdHMgPT0gTlVMTCkKLQkJCWdvdG8gYmFkX3Nsb3RzOwotCQlmb3IgKGkgPSBqID0gMDsgaSA8IG5zbG90czsgaSsrKSB7Ci0JCQljaGFyICpzOwotCQkJdG1wID0gUHlUdXBsZV9HRVRfSVRFTShzbG90cywgaSk7Ci0JCQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRtcCk7Ci0JCQlpZiAoKGFkZF9kaWN0ICYmIHN0cmNtcChzLCAiX19kaWN0X18iKSA9PSAwKSB8fAotCQkJICAgIChhZGRfd2VhayAmJiBzdHJjbXAocywgIl9fd2Vha3JlZl9fIikgPT0gMCkpCi0JCQkJY29udGludWU7Ci0JCQl0bXAgPV9QeV9NYW5nbGUobmFtZSwgdG1wKTsKLQkJCWlmICghdG1wKQotCQkJICAgIGdvdG8gYmFkX3Nsb3RzOwotCQkJUHlMaXN0X1NFVF9JVEVNKG5ld3Nsb3RzLCBqLCB0bXApOwotCQkJaisrOwotCQl9Ci0JCWFzc2VydChqID09IG5zbG90cyAtIGFkZF9kaWN0IC0gYWRkX3dlYWspOwotCQluc2xvdHMgPSBqOwotCQlQeV9ERUNSRUYoc2xvdHMpOwotCQlpZiAoUHlMaXN0X1NvcnQobmV3c2xvdHMpID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoYmFzZXMpOwotCQkJUHlfREVDUkVGKG5ld3Nsb3RzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNsb3RzID0gUHlMaXN0X0FzVHVwbGUobmV3c2xvdHMpOwotCQlQeV9ERUNSRUYobmV3c2xvdHMpOwotCQlpZiAoc2xvdHMgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIC8qIENvcHkgc2xvdHMgaW50byBhIGxpc3QsIG1hbmdsZSBuYW1lcyBhbmQgc29ydCB0aGVtLgorICAgICAgICAgICBTb3J0ZWQgbmFtZXMgYXJlIG5lZWRlZCBmb3IgX19jbGFzc19fIGFzc2lnbm1lbnQuCisgICAgICAgICAgIENvbnZlcnQgdGhlbSBiYWNrIHRvIHR1cGxlIGF0IHRoZSBlbmQuCisgICAgICAgICovCisgICAgICAgIG5ld3Nsb3RzID0gUHlMaXN0X05ldyhuc2xvdHMgLSBhZGRfZGljdCAtIGFkZF93ZWFrKTsKKyAgICAgICAgaWYgKG5ld3Nsb3RzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGJhZF9zbG90czsKKyAgICAgICAgZm9yIChpID0gaiA9IDA7IGkgPCBuc2xvdHM7IGkrKykgeworICAgICAgICAgICAgY2hhciAqczsKKyAgICAgICAgICAgIHRtcCA9IFB5VHVwbGVfR0VUX0lURU0oc2xvdHMsIGkpOworICAgICAgICAgICAgcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0bXApOworICAgICAgICAgICAgaWYgKChhZGRfZGljdCAmJiBzdHJjbXAocywgIl9fZGljdF9fIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAoYWRkX3dlYWsgJiYgc3RyY21wKHMsICJfX3dlYWtyZWZfXyIpID09IDApKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdG1wID1fUHlfTWFuZ2xlKG5hbWUsIHRtcCk7CisgICAgICAgICAgICBpZiAoIXRtcCkKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9zbG90czsKKyAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShuZXdzbG90cywgaiwgdG1wKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoaiA9PSBuc2xvdHMgLSBhZGRfZGljdCAtIGFkZF93ZWFrKTsKKyAgICAgICAgbnNsb3RzID0gajsKKyAgICAgICAgUHlfREVDUkVGKHNsb3RzKTsKKyAgICAgICAgaWYgKFB5TGlzdF9Tb3J0KG5ld3Nsb3RzKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdzbG90cyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzbG90cyA9IFB5TGlzdF9Bc1R1cGxlKG5ld3Nsb3RzKTsKKyAgICAgICAgUHlfREVDUkVGKG5ld3Nsb3RzKTsKKyAgICAgICAgaWYgKHNsb3RzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCS8qIFNlY29uZGFyeSBiYXNlcyBtYXkgcHJvdmlkZSB3ZWFrcmVmcyBvciBkaWN0ICovCi0JCWlmIChuYmFzZXMgPiAxICYmCi0JCSAgICAoKG1heV9hZGRfZGljdCAmJiAhYWRkX2RpY3QpIHx8Ci0JCSAgICAgKG1heV9hZGRfd2VhayAmJiAhYWRkX3dlYWspKSkgewotCQkJZm9yIChpID0gMDsgaSA8IG5iYXNlczsgaSsrKSB7Ci0JCQkJdG1wID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCQkJaWYgKHRtcCA9PSAoUHlPYmplY3QgKiliYXNlKQotCQkJCQljb250aW51ZTsgLyogU2tpcCBwcmltYXJ5IGJhc2UgKi8KLQkJCQlpZiAoUHlDbGFzc19DaGVjayh0bXApKSB7Ci0JCQkJCS8qIENsYXNzaWMgYmFzZSBjbGFzcyBwcm92aWRlcyBib3RoICovCi0JCQkJCWlmIChtYXlfYWRkX2RpY3QgJiYgIWFkZF9kaWN0KQotCQkJCQkJYWRkX2RpY3QrKzsKLQkJCQkJaWYgKG1heV9hZGRfd2VhayAmJiAhYWRkX3dlYWspCi0JCQkJCQlhZGRfd2VhaysrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYXNzZXJ0KFB5VHlwZV9DaGVjayh0bXApKTsKLQkJCQl0bXB0eXBlID0gKFB5VHlwZU9iamVjdCAqKXRtcDsKLQkJCQlpZiAobWF5X2FkZF9kaWN0ICYmICFhZGRfZGljdCAmJgotCQkJCSAgICB0bXB0eXBlLT50cF9kaWN0b2Zmc2V0ICE9IDApCi0JCQkJCWFkZF9kaWN0Kys7Ci0JCQkJaWYgKG1heV9hZGRfd2VhayAmJiAhYWRkX3dlYWsgJiYKLQkJCQkgICAgdG1wdHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgIT0gMCkKLQkJCQkJYWRkX3dlYWsrKzsKLQkJCQlpZiAobWF5X2FkZF9kaWN0ICYmICFhZGRfZGljdCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKG1heV9hZGRfd2VhayAmJiAhYWRkX3dlYWspCi0JCQkJCWNvbnRpbnVlOwotCQkJCS8qIE5vdGhpbmcgbW9yZSB0byBjaGVjayAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAvKiBTZWNvbmRhcnkgYmFzZXMgbWF5IHByb3ZpZGUgd2Vha3JlZnMgb3IgZGljdCAqLworICAgICAgICBpZiAobmJhc2VzID4gMSAmJgorICAgICAgICAgICAgKChtYXlfYWRkX2RpY3QgJiYgIWFkZF9kaWN0KSB8fAorICAgICAgICAgICAgIChtYXlfYWRkX3dlYWsgJiYgIWFkZF93ZWFrKSkpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYmFzZXM7IGkrKykgeworICAgICAgICAgICAgICAgIHRtcCA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gKFB5T2JqZWN0ICopYmFzZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIFNraXAgcHJpbWFyeSBiYXNlICovCisgICAgICAgICAgICAgICAgaWYgKFB5Q2xhc3NfQ2hlY2sodG1wKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBDbGFzc2ljIGJhc2UgY2xhc3MgcHJvdmlkZXMgYm90aCAqLworICAgICAgICAgICAgICAgICAgICBpZiAobWF5X2FkZF9kaWN0ICYmICFhZGRfZGljdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9kaWN0Kys7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXlfYWRkX3dlYWsgJiYgIWFkZF93ZWFrKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3dlYWsrKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFzc2VydChQeVR5cGVfQ2hlY2sodG1wKSk7CisgICAgICAgICAgICAgICAgdG1wdHlwZSA9IChQeVR5cGVPYmplY3QgKil0bXA7CisgICAgICAgICAgICAgICAgaWYgKG1heV9hZGRfZGljdCAmJiAhYWRkX2RpY3QgJiYKKyAgICAgICAgICAgICAgICAgICAgdG1wdHlwZS0+dHBfZGljdG9mZnNldCAhPSAwKQorICAgICAgICAgICAgICAgICAgICBhZGRfZGljdCsrOworICAgICAgICAgICAgICAgIGlmIChtYXlfYWRkX3dlYWsgJiYgIWFkZF93ZWFrICYmCisgICAgICAgICAgICAgICAgICAgIHRtcHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICE9IDApCisgICAgICAgICAgICAgICAgICAgIGFkZF93ZWFrKys7CisgICAgICAgICAgICAgICAgaWYgKG1heV9hZGRfZGljdCAmJiAhYWRkX2RpY3QpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChtYXlfYWRkX3dlYWsgJiYgIWFkZF93ZWFrKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvKiBOb3RoaW5nIG1vcmUgdG8gY2hlY2sgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qIFhYWCBGcm9tIGhlcmUgdW50aWwgdHlwZSBpcyBzYWZlbHkgYWxsb2NhdGVkLAotCSAgICJyZXR1cm4gTlVMTCIgbWF5IGxlYWsgc2xvdHMhICovCisgICAgLyogWFhYIEZyb20gaGVyZSB1bnRpbCB0eXBlIGlzIHNhZmVseSBhbGxvY2F0ZWQsCisgICAgICAgInJldHVybiBOVUxMIiBtYXkgbGVhayBzbG90cyEgKi8KIAotCS8qIEFsbG9jYXRlIHRoZSB0eXBlIG9iamVjdCAqLwotCXR5cGUgPSAoUHlUeXBlT2JqZWN0ICopbWV0YXR5cGUtPnRwX2FsbG9jKG1ldGF0eXBlLCBuc2xvdHMpOwotCWlmICh0eXBlID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRihzbG90cyk7Ci0JCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBBbGxvY2F0ZSB0aGUgdHlwZSBvYmplY3QgKi8KKyAgICB0eXBlID0gKFB5VHlwZU9iamVjdCAqKW1ldGF0eXBlLT50cF9hbGxvYyhtZXRhdHlwZSwgbnNsb3RzKTsKKyAgICBpZiAodHlwZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2xvdHMpOworICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBLZWVwIG5hbWUgYW5kIHNsb3RzIGFsaXZlIGluIHRoZSBleHRlbmRlZCB0eXBlIG9iamVjdCAqLwotCWV0ID0gKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlOwotCVB5X0lOQ1JFRihuYW1lKTsKLQlldC0+aHRfbmFtZSA9IG5hbWU7Ci0JZXQtPmh0X3Nsb3RzID0gc2xvdHM7CisgICAgLyogS2VlcCBuYW1lIGFuZCBzbG90cyBhbGl2ZSBpbiB0aGUgZXh0ZW5kZWQgdHlwZSBvYmplY3QgKi8KKyAgICBldCA9IChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZTsKKyAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgZXQtPmh0X25hbWUgPSBuYW1lOworICAgIGV0LT5odF9zbG90cyA9IHNsb3RzOwogCi0JLyogSW5pdGlhbGl6ZSB0cF9mbGFncyAqLwotCXR5cGUtPnRwX2ZsYWdzID0gUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IRUFQVFlQRSB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEU7Ci0JaWYgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKQotCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0hBVkVfR0M7Ci0JaWYgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUikKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUjsKKyAgICAvKiBJbml0aWFsaXplIHRwX2ZsYWdzICovCisgICAgdHlwZS0+dHBfZmxhZ3MgPSBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hFQVBUWVBFIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRTsKKyAgICBpZiAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSEFWRV9HQzsKKyAgICBpZiAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSOwogCi0JLyogSXQncyBhIG5ldy1zdHlsZSBudW1iZXIgdW5sZXNzIGl0IHNwZWNpZmljYWxseSBpbmhlcml0cyBhbnkKLQkgICBvbGQtc3R5bGUgbnVtZXJpYyBiZWhhdmlvciAqLwotCWlmICgoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpIHx8Ci0JICAgIChiYXNlLT50cF9hc19udW1iZXIgPT0gTlVMTCkpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUzsKKyAgICAvKiBJdCdzIGEgbmV3LXN0eWxlIG51bWJlciB1bmxlc3MgaXQgc3BlY2lmaWNhbGx5IGluaGVyaXRzIGFueQorICAgICAgIG9sZC1zdHlsZSBudW1lcmljIGJlaGF2aW9yICovCisgICAgaWYgKChiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykgfHwKKyAgICAgICAgKGJhc2UtPnRwX2FzX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19DSEVDS1RZUEVTOwogCi0JLyogSW5pdGlhbGl6ZSBlc3NlbnRpYWwgZmllbGRzICovCi0JdHlwZS0+dHBfYXNfbnVtYmVyID0gJmV0LT5hc19udW1iZXI7Ci0JdHlwZS0+dHBfYXNfc2VxdWVuY2UgPSAmZXQtPmFzX3NlcXVlbmNlOwotCXR5cGUtPnRwX2FzX21hcHBpbmcgPSAmZXQtPmFzX21hcHBpbmc7Ci0JdHlwZS0+dHBfYXNfYnVmZmVyID0gJmV0LT5hc19idWZmZXI7Ci0JdHlwZS0+dHBfbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKTsKKyAgICAvKiBJbml0aWFsaXplIGVzc2VudGlhbCBmaWVsZHMgKi8KKyAgICB0eXBlLT50cF9hc19udW1iZXIgPSAmZXQtPmFzX251bWJlcjsKKyAgICB0eXBlLT50cF9hc19zZXF1ZW5jZSA9ICZldC0+YXNfc2VxdWVuY2U7CisgICAgdHlwZS0+dHBfYXNfbWFwcGluZyA9ICZldC0+YXNfbWFwcGluZzsKKyAgICB0eXBlLT50cF9hc19idWZmZXIgPSAmZXQtPmFzX2J1ZmZlcjsKKyAgICB0eXBlLT50cF9uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpOwogCi0JLyogU2V0IHRwX2Jhc2UgYW5kIHRwX2Jhc2VzICovCi0JdHlwZS0+dHBfYmFzZXMgPSBiYXNlczsKLQlQeV9JTkNSRUYoYmFzZSk7Ci0JdHlwZS0+dHBfYmFzZSA9IGJhc2U7CisgICAgLyogU2V0IHRwX2Jhc2UgYW5kIHRwX2Jhc2VzICovCisgICAgdHlwZS0+dHBfYmFzZXMgPSBiYXNlczsKKyAgICBQeV9JTkNSRUYoYmFzZSk7CisgICAgdHlwZS0+dHBfYmFzZSA9IGJhc2U7CiAKLQkvKiBJbml0aWFsaXplIHRwX2RpY3QgZnJvbSBwYXNzZWQtaW4gZGljdCAqLwotCXR5cGUtPnRwX2RpY3QgPSBkaWN0ID0gUHlEaWN0X0NvcHkoZGljdCk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodHlwZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBJbml0aWFsaXplIHRwX2RpY3QgZnJvbSBwYXNzZWQtaW4gZGljdCAqLworICAgIHR5cGUtPnRwX2RpY3QgPSBkaWN0ID0gUHlEaWN0X0NvcHkoZGljdCk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFNldCBfX21vZHVsZV9fIGluIHRoZSBkaWN0ICovCi0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJfX21vZHVsZV9fIikgPT0gTlVMTCkgewotCQl0bXAgPSBQeUV2YWxfR2V0R2xvYmFscygpOwotCQlpZiAodG1wICE9IE5VTEwpIHsKLQkJCXRtcCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHRtcCwgIl9fbmFtZV9fIik7Ci0JCQlpZiAodG1wICE9IE5VTEwpIHsKLQkJCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fbW9kdWxlX18iLAotCQkJCQkJCSB0bXApIDwgMCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogU2V0IF9fbW9kdWxlX18gaW4gdGhlIGRpY3QgKi8KKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fbW9kdWxlX18iKSA9PSBOVUxMKSB7CisgICAgICAgIHRtcCA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7CisgICAgICAgIGlmICh0bXAgIT0gTlVMTCkgeworICAgICAgICAgICAgdG1wID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodG1wLCAiX19uYW1lX18iKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19tb2R1bGVfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qIFNldCB0cF9kb2MgdG8gYSBjb3B5IG9mIGRpY3RbJ19fZG9jX18nXSwgaWYgdGhlIGxhdHRlciBpcyB0aGVyZQotCSAgIGFuZCBpcyBhIHN0cmluZy4gIFRoZSBfX2RvY19fIGFjY2Vzc29yIHdpbGwgZmlyc3QgbG9vayBmb3IgdHBfZG9jOwotCSAgIGlmIHRoYXQgZmFpbHMsIGl0IHdpbGwgc3RpbGwgbG9vayBpbnRvIF9fZGljdF9fLgotCSovCi0JewotCQlQeU9iamVjdCAqZG9jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iKTsKLQkJaWYgKGRvYyAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGRvYykpIHsKLQkJCWNvbnN0IHNpemVfdCBuID0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRShkb2MpOwotCQkJY2hhciAqdHBfZG9jID0gKGNoYXIgKilQeU9iamVjdF9NQUxMT0MobisxKTsKLQkJCWlmICh0cF9kb2MgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRih0eXBlKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCW1lbWNweSh0cF9kb2MsIFB5U3RyaW5nX0FTX1NUUklORyhkb2MpLCBuKzEpOwotCQkJdHlwZS0+dHBfZG9jID0gdHBfZG9jOwotCQl9Ci0JfQorICAgIC8qIFNldCB0cF9kb2MgdG8gYSBjb3B5IG9mIGRpY3RbJ19fZG9jX18nXSwgaWYgdGhlIGxhdHRlciBpcyB0aGVyZQorICAgICAgIGFuZCBpcyBhIHN0cmluZy4gIFRoZSBfX2RvY19fIGFjY2Vzc29yIHdpbGwgZmlyc3QgbG9vayBmb3IgdHBfZG9jOworICAgICAgIGlmIHRoYXQgZmFpbHMsIGl0IHdpbGwgc3RpbGwgbG9vayBpbnRvIF9fZGljdF9fLgorICAgICovCisgICAgeworICAgICAgICBQeU9iamVjdCAqZG9jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iKTsKKyAgICAgICAgaWYgKGRvYyAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGRvYykpIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBuID0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRShkb2MpOworICAgICAgICAgICAgY2hhciAqdHBfZG9jID0gKGNoYXIgKilQeU9iamVjdF9NQUxMT0MobisxKTsKKyAgICAgICAgICAgIGlmICh0cF9kb2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweSh0cF9kb2MsIFB5U3RyaW5nX0FTX1NUUklORyhkb2MpLCBuKzEpOworICAgICAgICAgICAgdHlwZS0+dHBfZG9jID0gdHBfZG9jOworICAgICAgICB9CisgICAgfQogCi0JLyogU3BlY2lhbC1jYXNlIF9fbmV3X186IGlmIGl0J3MgYSBwbGFpbiBmdW5jdGlvbiwKLQkgICBtYWtlIGl0IGEgc3RhdGljIGZ1bmN0aW9uICovCi0JdG1wID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fbmV3X18iKTsKLQlpZiAodG1wICE9IE5VTEwgJiYgUHlGdW5jdGlvbl9DaGVjayh0bXApKSB7Ci0JCXRtcCA9IFB5U3RhdGljTWV0aG9kX05ldyh0bXApOwotCQlpZiAodG1wID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih0eXBlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX25ld19fIiwgdG1wKTsKLQkJUHlfREVDUkVGKHRtcCk7Ci0JfQorICAgIC8qIFNwZWNpYWwtY2FzZSBfX25ld19fOiBpZiBpdCdzIGEgcGxhaW4gZnVuY3Rpb24sCisgICAgICAgbWFrZSBpdCBhIHN0YXRpYyBmdW5jdGlvbiAqLworICAgIHRtcCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJfX25ld19fIik7CisgICAgaWYgKHRtcCAhPSBOVUxMICYmIFB5RnVuY3Rpb25fQ2hlY2sodG1wKSkgeworICAgICAgICB0bXAgPSBQeVN0YXRpY01ldGhvZF9OZXcodG1wKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodHlwZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19uZXdfXyIsIHRtcCk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgIH0KIAotCS8qIEFkZCBkZXNjcmlwdG9ycyBmb3IgY3VzdG9tIHNsb3RzIGZyb20gX19zbG90c19fLCBvciBmb3IgX19kaWN0X18gKi8KLQltcCA9IFB5SGVhcFR5cGVfR0VUX01FTUJFUlMoZXQpOwotCXNsb3RvZmZzZXQgPSBiYXNlLT50cF9iYXNpY3NpemU7Ci0JaWYgKHNsb3RzICE9IE5VTEwpIHsKLQkJZm9yIChpID0gMDsgaSA8IG5zbG90czsgaSsrLCBtcCsrKSB7Ci0JCQltcC0+bmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORygKLQkJCQlQeVR1cGxlX0dFVF9JVEVNKHNsb3RzLCBpKSk7Ci0JCQltcC0+dHlwZSA9IFRfT0JKRUNUX0VYOwotCQkJbXAtPm9mZnNldCA9IHNsb3RvZmZzZXQ7CisgICAgLyogQWRkIGRlc2NyaXB0b3JzIGZvciBjdXN0b20gc2xvdHMgZnJvbSBfX3Nsb3RzX18sIG9yIGZvciBfX2RpY3RfXyAqLworICAgIG1wID0gUHlIZWFwVHlwZV9HRVRfTUVNQkVSUyhldCk7CisgICAgc2xvdG9mZnNldCA9IGJhc2UtPnRwX2Jhc2ljc2l6ZTsKKyAgICBpZiAoc2xvdHMgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnNsb3RzOyBpKyssIG1wKyspIHsKKyAgICAgICAgICAgIG1wLT5uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc2xvdHMsIGkpKTsKKyAgICAgICAgICAgIG1wLT50eXBlID0gVF9PQkpFQ1RfRVg7CisgICAgICAgICAgICBtcC0+b2Zmc2V0ID0gc2xvdG9mZnNldDsKIAotCQkJLyogX19kaWN0X18gYW5kIF9fd2Vha3JlZl9fIGFyZSBhbHJlYWR5IGZpbHRlcmVkIG91dCAqLwotCQkJYXNzZXJ0KHN0cmNtcChtcC0+bmFtZSwgIl9fZGljdF9fIikgIT0gMCk7Ci0JCQlhc3NlcnQoc3RyY21wKG1wLT5uYW1lLCAiX193ZWFrcmVmX18iKSAhPSAwKTsKKyAgICAgICAgICAgIC8qIF9fZGljdF9fIGFuZCBfX3dlYWtyZWZfXyBhcmUgYWxyZWFkeSBmaWx0ZXJlZCBvdXQgKi8KKyAgICAgICAgICAgIGFzc2VydChzdHJjbXAobXAtPm5hbWUsICJfX2RpY3RfXyIpICE9IDApOworICAgICAgICAgICAgYXNzZXJ0KHN0cmNtcChtcC0+bmFtZSwgIl9fd2Vha3JlZl9fIikgIT0gMCk7CiAKLQkJCXNsb3RvZmZzZXQgKz0gc2l6ZW9mKFB5T2JqZWN0ICopOwotCQl9Ci0JfQotCWlmIChhZGRfZGljdCkgewotCQlpZiAoYmFzZS0+dHBfaXRlbXNpemUpCi0JCQl0eXBlLT50cF9kaWN0b2Zmc2V0ID0gLShsb25nKXNpemVvZihQeU9iamVjdCAqKTsKLQkJZWxzZQotCQkJdHlwZS0+dHBfZGljdG9mZnNldCA9IHNsb3RvZmZzZXQ7Ci0JCXNsb3RvZmZzZXQgKz0gc2l6ZW9mKFB5T2JqZWN0ICopOwotCX0KLQlpZiAoYWRkX3dlYWspIHsKLQkJYXNzZXJ0KCFiYXNlLT50cF9pdGVtc2l6ZSk7Ci0JCXR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ID0gc2xvdG9mZnNldDsKLQkJc2xvdG9mZnNldCArPSBzaXplb2YoUHlPYmplY3QgKik7Ci0JfQotCXR5cGUtPnRwX2Jhc2ljc2l6ZSA9IHNsb3RvZmZzZXQ7Ci0JdHlwZS0+dHBfaXRlbXNpemUgPSBiYXNlLT50cF9pdGVtc2l6ZTsKLQl0eXBlLT50cF9tZW1iZXJzID0gUHlIZWFwVHlwZV9HRVRfTUVNQkVSUyhldCk7CisgICAgICAgICAgICBzbG90b2Zmc2V0ICs9IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYWRkX2RpY3QpIHsKKyAgICAgICAgaWYgKGJhc2UtPnRwX2l0ZW1zaXplKQorICAgICAgICAgICAgdHlwZS0+dHBfZGljdG9mZnNldCA9IC0obG9uZylzaXplb2YoUHlPYmplY3QgKik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGUtPnRwX2RpY3RvZmZzZXQgPSBzbG90b2Zmc2V0OworICAgICAgICBzbG90b2Zmc2V0ICs9IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICB9CisgICAgaWYgKGFkZF93ZWFrKSB7CisgICAgICAgIGFzc2VydCghYmFzZS0+dHBfaXRlbXNpemUpOworICAgICAgICB0eXBlLT50cF93ZWFrbGlzdG9mZnNldCA9IHNsb3RvZmZzZXQ7CisgICAgICAgIHNsb3RvZmZzZXQgKz0gc2l6ZW9mKFB5T2JqZWN0ICopOworICAgIH0KKyAgICB0eXBlLT50cF9iYXNpY3NpemUgPSBzbG90b2Zmc2V0OworICAgIHR5cGUtPnRwX2l0ZW1zaXplID0gYmFzZS0+dHBfaXRlbXNpemU7CisgICAgdHlwZS0+dHBfbWVtYmVycyA9IFB5SGVhcFR5cGVfR0VUX01FTUJFUlMoZXQpOwogCi0JaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmIHR5cGUtPnRwX2RpY3RvZmZzZXQpCi0JCXR5cGUtPnRwX2dldHNldCA9IHN1YnR5cGVfZ2V0c2V0c19mdWxsOwotCWVsc2UgaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmICF0eXBlLT50cF9kaWN0b2Zmc2V0KQotCQl0eXBlLT50cF9nZXRzZXQgPSBzdWJ0eXBlX2dldHNldHNfd2Vha3JlZl9vbmx5OwotCWVsc2UgaWYgKCF0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAmJiB0eXBlLT50cF9kaWN0b2Zmc2V0KQotCQl0eXBlLT50cF9nZXRzZXQgPSBzdWJ0eXBlX2dldHNldHNfZGljdF9vbmx5OwotCWVsc2UKLQkJdHlwZS0+dHBfZ2V0c2V0ID0gTlVMTDsKKyAgICBpZiAodHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgJiYgdHlwZS0+dHBfZGljdG9mZnNldCkKKyAgICAgICAgdHlwZS0+dHBfZ2V0c2V0ID0gc3VidHlwZV9nZXRzZXRzX2Z1bGw7CisgICAgZWxzZSBpZiAodHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgJiYgIXR5cGUtPnRwX2RpY3RvZmZzZXQpCisgICAgICAgIHR5cGUtPnRwX2dldHNldCA9IHN1YnR5cGVfZ2V0c2V0c193ZWFrcmVmX29ubHk7CisgICAgZWxzZSBpZiAoIXR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmIHR5cGUtPnRwX2RpY3RvZmZzZXQpCisgICAgICAgIHR5cGUtPnRwX2dldHNldCA9IHN1YnR5cGVfZ2V0c2V0c19kaWN0X29ubHk7CisgICAgZWxzZQorICAgICAgICB0eXBlLT50cF9nZXRzZXQgPSBOVUxMOwogCi0JLyogU3BlY2lhbCBjYXNlIHNvbWUgc2xvdHMgKi8KLQlpZiAodHlwZS0+dHBfZGljdG9mZnNldCAhPSAwIHx8IG5zbG90cyA+IDApIHsKLQkJaWYgKGJhc2UtPnRwX2dldGF0dHIgPT0gTlVMTCAmJiBiYXNlLT50cF9nZXRhdHRybyA9PSBOVUxMKQotCQkJdHlwZS0+dHBfZ2V0YXR0cm8gPSBQeU9iamVjdF9HZW5lcmljR2V0QXR0cjsKLQkJaWYgKGJhc2UtPnRwX3NldGF0dHIgPT0gTlVMTCAmJiBiYXNlLT50cF9zZXRhdHRybyA9PSBOVUxMKQotCQkJdHlwZS0+dHBfc2V0YXR0cm8gPSBQeU9iamVjdF9HZW5lcmljU2V0QXR0cjsKLQl9Ci0JdHlwZS0+dHBfZGVhbGxvYyA9IHN1YnR5cGVfZGVhbGxvYzsKKyAgICAvKiBTcGVjaWFsIGNhc2Ugc29tZSBzbG90cyAqLworICAgIGlmICh0eXBlLT50cF9kaWN0b2Zmc2V0ICE9IDAgfHwgbnNsb3RzID4gMCkgeworICAgICAgICBpZiAoYmFzZS0+dHBfZ2V0YXR0ciA9PSBOVUxMICYmIGJhc2UtPnRwX2dldGF0dHJvID09IE5VTEwpCisgICAgICAgICAgICB0eXBlLT50cF9nZXRhdHRybyA9IFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyOworICAgICAgICBpZiAoYmFzZS0+dHBfc2V0YXR0ciA9PSBOVUxMICYmIGJhc2UtPnRwX3NldGF0dHJvID09IE5VTEwpCisgICAgICAgICAgICB0eXBlLT50cF9zZXRhdHRybyA9IFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyOworICAgIH0KKyAgICB0eXBlLT50cF9kZWFsbG9jID0gc3VidHlwZV9kZWFsbG9jOwogCi0JLyogRW5hYmxlIEdDIHVubGVzcyB0aGVyZSBhcmUgcmVhbGx5IG5vIGluc3RhbmNlIHZhcmlhYmxlcyBwb3NzaWJsZSAqLwotCWlmICghKHR5cGUtPnRwX2Jhc2ljc2l6ZSA9PSBzaXplb2YoUHlPYmplY3QpICYmCi0JICAgICAgdHlwZS0+dHBfaXRlbXNpemUgPT0gMCkpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSEFWRV9HQzsKKyAgICAvKiBFbmFibGUgR0MgdW5sZXNzIHRoZXJlIGFyZSByZWFsbHkgbm8gaW5zdGFuY2UgdmFyaWFibGVzIHBvc3NpYmxlICovCisgICAgaWYgKCEodHlwZS0+dHBfYmFzaWNzaXplID09IHNpemVvZihQeU9iamVjdCkgJiYKKyAgICAgICAgICB0eXBlLT50cF9pdGVtc2l6ZSA9PSAwKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19IQVZFX0dDOwogCi0JLyogQWx3YXlzIG92ZXJyaWRlIGFsbG9jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIHJlZ3VsYXIgaGVhcCAqLwotCXR5cGUtPnRwX2FsbG9jID0gUHlUeXBlX0dlbmVyaWNBbGxvYzsKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpIHsKLQkJdHlwZS0+dHBfZnJlZSA9IFB5T2JqZWN0X0dDX0RlbDsKLQkJdHlwZS0+dHBfdHJhdmVyc2UgPSBzdWJ0eXBlX3RyYXZlcnNlOwotCQl0eXBlLT50cF9jbGVhciA9IHN1YnR5cGVfY2xlYXI7Ci0JfQotCWVsc2UKLQkJdHlwZS0+dHBfZnJlZSA9IFB5T2JqZWN0X0RlbDsKKyAgICAvKiBBbHdheXMgb3ZlcnJpZGUgYWxsb2NhdGlvbiBzdHJhdGVneSB0byB1c2UgcmVndWxhciBoZWFwICovCisgICAgdHlwZS0+dHBfYWxsb2MgPSBQeVR5cGVfR2VuZXJpY0FsbG9jOworICAgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykgeworICAgICAgICB0eXBlLT50cF9mcmVlID0gUHlPYmplY3RfR0NfRGVsOworICAgICAgICB0eXBlLT50cF90cmF2ZXJzZSA9IHN1YnR5cGVfdHJhdmVyc2U7CisgICAgICAgIHR5cGUtPnRwX2NsZWFyID0gc3VidHlwZV9jbGVhcjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB0eXBlLT50cF9mcmVlID0gUHlPYmplY3RfRGVsOwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgcmVzdCAqLwotCWlmIChQeVR5cGVfUmVhZHkodHlwZSkgPCAwKSB7Ci0JCVB5X0RFQ1JFRih0eXBlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgdGhlIHJlc3QgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KHR5cGUpIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYodHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFB1dCB0aGUgcHJvcGVyIHNsb3RzIGluIHBsYWNlICovCi0JZml4dXBfc2xvdF9kaXNwYXRjaGVycyh0eXBlKTsKKyAgICAvKiBQdXQgdGhlIHByb3BlciBzbG90cyBpbiBwbGFjZSAqLworICAgIGZpeHVwX3Nsb3RfZGlzcGF0Y2hlcnModHlwZSk7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopdHlwZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopdHlwZTsKIH0KIAogLyogSW50ZXJuYWwgQVBJIHRvIGxvb2sgZm9yIGEgbmFtZSB0aHJvdWdoIHRoZSBNUk8uCkBAIC0yNDUyLDU0ICsyNDUyLDU0IEBACiBQeU9iamVjdCAqCiBfUHlUeXBlX0xvb2t1cChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqbXJvLCAqcmVzLCAqYmFzZSwgKmRpY3Q7Ci0JdW5zaWduZWQgaW50IGg7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICptcm8sICpyZXMsICpiYXNlLCAqZGljdDsKKyAgICB1bnNpZ25lZCBpbnQgaDsKIAotCWlmIChNQ0FDSEVfQ0FDSEVBQkxFX05BTUUobmFtZSkgJiYKLQkgICAgUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRykpIHsKLQkJLyogZmFzdCBwYXRoICovCi0JCWggPSBNQ0FDSEVfSEFTSF9NRVRIT0QodHlwZSwgbmFtZSk7Ci0JCWlmIChtZXRob2RfY2FjaGVbaF0udmVyc2lvbiA9PSB0eXBlLT50cF92ZXJzaW9uX3RhZyAmJgotCQkgICAgbWV0aG9kX2NhY2hlW2hdLm5hbWUgPT0gbmFtZSkKLQkJICAgIHJldHVybiBtZXRob2RfY2FjaGVbaF0udmFsdWU7Ci0JfQorICAgIGlmIChNQ0FDSEVfQ0FDSEVBQkxFX05BTUUobmFtZSkgJiYKKyAgICAgICAgUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRykpIHsKKyAgICAgICAgLyogZmFzdCBwYXRoICovCisgICAgICAgIGggPSBNQ0FDSEVfSEFTSF9NRVRIT0QodHlwZSwgbmFtZSk7CisgICAgICAgIGlmIChtZXRob2RfY2FjaGVbaF0udmVyc2lvbiA9PSB0eXBlLT50cF92ZXJzaW9uX3RhZyAmJgorICAgICAgICAgICAgbWV0aG9kX2NhY2hlW2hdLm5hbWUgPT0gbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBtZXRob2RfY2FjaGVbaF0udmFsdWU7CisgICAgfQogCi0JLyogTG9vayBpbiB0cF9kaWN0IG9mIHR5cGVzIGluIE1STyAqLwotCW1ybyA9IHR5cGUtPnRwX21ybzsKKyAgICAvKiBMb29rIGluIHRwX2RpY3Qgb2YgdHlwZXMgaW4gTVJPICovCisgICAgbXJvID0gdHlwZS0+dHBfbXJvOwogCi0JLyogSWYgbXJvIGlzIE5VTEwsIHRoZSB0eXBlIGlzIGVpdGhlciBub3QgeWV0IGluaXRpYWxpemVkCi0JICAgYnkgUHlUeXBlX1JlYWR5KCksIG9yIGFscmVhZHkgY2xlYXJlZCBieSB0eXBlX2NsZWFyKCkuCi0JICAgRWl0aGVyIHdheSB0aGUgc2FmZXN0IHRoaW5nIHRvIGRvIGlzIHRvIHJldHVybiBOVUxMLiAqLwotCWlmIChtcm8gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogSWYgbXJvIGlzIE5VTEwsIHRoZSB0eXBlIGlzIGVpdGhlciBub3QgeWV0IGluaXRpYWxpemVkCisgICAgICAgYnkgUHlUeXBlX1JlYWR5KCksIG9yIGFscmVhZHkgY2xlYXJlZCBieSB0eXBlX2NsZWFyKCkuCisgICAgICAgRWl0aGVyIHdheSB0aGUgc2FmZXN0IHRoaW5nIHRvIGRvIGlzIHRvIHJldHVybiBOVUxMLiAqLworICAgIGlmIChtcm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXMgPSBOVUxMOwotCWFzc2VydChQeVR1cGxlX0NoZWNrKG1ybykpOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKG1ybyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQliYXNlID0gUHlUdXBsZV9HRVRfSVRFTShtcm8sIGkpOwotCQlpZiAoUHlDbGFzc19DaGVjayhiYXNlKSkKLQkJCWRpY3QgPSAoKFB5Q2xhc3NPYmplY3QgKiliYXNlKS0+Y2xfZGljdDsKLQkJZWxzZSB7Ci0JCQlhc3NlcnQoUHlUeXBlX0NoZWNrKGJhc2UpKTsKLQkJCWRpY3QgPSAoKFB5VHlwZU9iamVjdCAqKWJhc2UpLT50cF9kaWN0OwotCQl9Ci0JCWFzc2VydChkaWN0ICYmIFB5RGljdF9DaGVjayhkaWN0KSk7Ci0JCXJlcyA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIG5hbWUpOwotCQlpZiAocmVzICE9IE5VTEwpCi0JCQlicmVhazsKLQl9CisgICAgcmVzID0gTlVMTDsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhtcm8pKTsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShtcm8pOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0obXJvLCBpKTsKKyAgICAgICAgaWYgKFB5Q2xhc3NfQ2hlY2soYmFzZSkpCisgICAgICAgICAgICBkaWN0ID0gKChQeUNsYXNzT2JqZWN0ICopYmFzZSktPmNsX2RpY3Q7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayhiYXNlKSk7CisgICAgICAgICAgICBkaWN0ID0gKChQeVR5cGVPYmplY3QgKiliYXNlKS0+dHBfZGljdDsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoZGljdCAmJiBQeURpY3RfQ2hlY2soZGljdCkpOworICAgICAgICByZXMgPSBQeURpY3RfR2V0SXRlbShkaWN0LCBuYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogCi0JaWYgKE1DQUNIRV9DQUNIRUFCTEVfTkFNRShuYW1lKSAmJiBhc3NpZ25fdmVyc2lvbl90YWcodHlwZSkpIHsKLQkJaCA9IE1DQUNIRV9IQVNIX01FVEhPRCh0eXBlLCBuYW1lKTsKLQkJbWV0aG9kX2NhY2hlW2hdLnZlcnNpb24gPSB0eXBlLT50cF92ZXJzaW9uX3RhZzsKLQkJbWV0aG9kX2NhY2hlW2hdLnZhbHVlID0gcmVzOyAgLyogYm9ycm93ZWQgKi8KLQkJUHlfSU5DUkVGKG5hbWUpOwotCQlQeV9ERUNSRUYobWV0aG9kX2NhY2hlW2hdLm5hbWUpOwotCQltZXRob2RfY2FjaGVbaF0ubmFtZSA9IG5hbWU7Ci0JfQotCXJldHVybiByZXM7CisgICAgaWYgKE1DQUNIRV9DQUNIRUFCTEVfTkFNRShuYW1lKSAmJiBhc3NpZ25fdmVyc2lvbl90YWcodHlwZSkpIHsKKyAgICAgICAgaCA9IE1DQUNIRV9IQVNIX01FVEhPRCh0eXBlLCBuYW1lKTsKKyAgICAgICAgbWV0aG9kX2NhY2hlW2hdLnZlcnNpb24gPSB0eXBlLT50cF92ZXJzaW9uX3RhZzsKKyAgICAgICAgbWV0aG9kX2NhY2hlW2hdLnZhbHVlID0gcmVzOyAgLyogYm9ycm93ZWQgKi8KKyAgICAgICAgUHlfSU5DUkVGKG5hbWUpOworICAgICAgICBQeV9ERUNSRUYobWV0aG9kX2NhY2hlW2hdLm5hbWUpOworICAgICAgICBtZXRob2RfY2FjaGVbaF0ubmFtZSA9IG5hbWU7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIC8qIFRoaXMgaXMgc2ltaWxhciB0byBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigpLApAQCAtMjUwNywxNTYgKzI1MDcsMTU2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9nZXRhdHRybyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5VHlwZU9iamVjdCAqbWV0YXR5cGUgPSBQeV9UWVBFKHR5cGUpOwotCVB5T2JqZWN0ICptZXRhX2F0dHJpYnV0ZSwgKmF0dHJpYnV0ZTsKLQlkZXNjcmdldGZ1bmMgbWV0YV9nZXQ7CisgICAgUHlUeXBlT2JqZWN0ICptZXRhdHlwZSA9IFB5X1RZUEUodHlwZSk7CisgICAgUHlPYmplY3QgKm1ldGFfYXR0cmlidXRlLCAqYXR0cmlidXRlOworICAgIGRlc2NyZ2V0ZnVuYyBtZXRhX2dldDsKIAotCS8qIEluaXRpYWxpemUgdGhpcyB0eXBlICh3ZSdsbCBhc3N1bWUgdGhlIG1ldGF0eXBlIGlzIGluaXRpYWxpemVkKSAqLwotCWlmICh0eXBlLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJaWYgKFB5VHlwZV9SZWFkeSh0eXBlKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB0aGlzIHR5cGUgKHdlJ2xsIGFzc3VtZSB0aGUgbWV0YXR5cGUgaXMgaW5pdGlhbGl6ZWQpICovCisgICAgaWYgKHR5cGUtPnRwX2RpY3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHR5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIE5vIHJlYWRhYmxlIGRlc2NyaXB0b3IgZm91bmQgeWV0ICovCi0JbWV0YV9nZXQgPSBOVUxMOworICAgIC8qIE5vIHJlYWRhYmxlIGRlc2NyaXB0b3IgZm91bmQgeWV0ICovCisgICAgbWV0YV9nZXQgPSBOVUxMOwogCi0JLyogTG9vayBmb3IgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgbWV0YXR5cGUgKi8KLQltZXRhX2F0dHJpYnV0ZSA9IF9QeVR5cGVfTG9va3VwKG1ldGF0eXBlLCBuYW1lKTsKKyAgICAvKiBMb29rIGZvciB0aGUgYXR0cmlidXRlIGluIHRoZSBtZXRhdHlwZSAqLworICAgIG1ldGFfYXR0cmlidXRlID0gX1B5VHlwZV9Mb29rdXAobWV0YXR5cGUsIG5hbWUpOwogCi0JaWYgKG1ldGFfYXR0cmlidXRlICE9IE5VTEwpIHsKLQkJbWV0YV9nZXQgPSBQeV9UWVBFKG1ldGFfYXR0cmlidXRlKS0+dHBfZGVzY3JfZ2V0OworICAgIGlmIChtZXRhX2F0dHJpYnV0ZSAhPSBOVUxMKSB7CisgICAgICAgIG1ldGFfZ2V0ID0gUHlfVFlQRShtZXRhX2F0dHJpYnV0ZSktPnRwX2Rlc2NyX2dldDsKIAotCQlpZiAobWV0YV9nZXQgIT0gTlVMTCAmJiBQeURlc2NyX0lzRGF0YShtZXRhX2F0dHJpYnV0ZSkpIHsKLQkJCS8qIERhdGEgZGVzY3JpcHRvcnMgaW1wbGVtZW50IHRwX2Rlc2NyX3NldCB0byBpbnRlcmNlcHQKLQkJCSAqIHdyaXRlcy4gQXNzdW1lIHRoZSBhdHRyaWJ1dGUgaXMgbm90IG92ZXJyaWRkZW4gaW4KLQkJCSAqIHR5cGUncyB0cF9kaWN0IChhbmQgYmFzZXMpOiBjYWxsIHRoZSBkZXNjcmlwdG9yIG5vdy4KLQkJCSAqLwotCQkJcmV0dXJuIG1ldGFfZ2V0KG1ldGFfYXR0cmlidXRlLCAoUHlPYmplY3QgKil0eXBlLAotCQkJCQkoUHlPYmplY3QgKiltZXRhdHlwZSk7Ci0JCX0KLQkJUHlfSU5DUkVGKG1ldGFfYXR0cmlidXRlKTsKLQl9CisgICAgICAgIGlmIChtZXRhX2dldCAhPSBOVUxMICYmIFB5RGVzY3JfSXNEYXRhKG1ldGFfYXR0cmlidXRlKSkgeworICAgICAgICAgICAgLyogRGF0YSBkZXNjcmlwdG9ycyBpbXBsZW1lbnQgdHBfZGVzY3Jfc2V0IHRvIGludGVyY2VwdAorICAgICAgICAgICAgICogd3JpdGVzLiBBc3N1bWUgdGhlIGF0dHJpYnV0ZSBpcyBub3Qgb3ZlcnJpZGRlbiBpbgorICAgICAgICAgICAgICogdHlwZSdzIHRwX2RpY3QgKGFuZCBiYXNlcyk6IGNhbGwgdGhlIGRlc2NyaXB0b3Igbm93LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gbWV0YV9nZXQobWV0YV9hdHRyaWJ1dGUsIChQeU9iamVjdCAqKXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopbWV0YXR5cGUpOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihtZXRhX2F0dHJpYnV0ZSk7CisgICAgfQogCi0JLyogTm8gZGF0YSBkZXNjcmlwdG9yIGZvdW5kIG9uIG1ldGF0eXBlLiBMb29rIGluIHRwX2RpY3Qgb2YgdGhpcwotCSAqIHR5cGUgYW5kIGl0cyBiYXNlcyAqLwotCWF0dHJpYnV0ZSA9IF9QeVR5cGVfTG9va3VwKHR5cGUsIG5hbWUpOwotCWlmIChhdHRyaWJ1dGUgIT0gTlVMTCkgewotCQkvKiBJbXBsZW1lbnQgZGVzY3JpcHRvciBmdW5jdGlvbmFsaXR5LCBpZiBhbnkgKi8KLQkJZGVzY3JnZXRmdW5jIGxvY2FsX2dldCA9IFB5X1RZUEUoYXR0cmlidXRlKS0+dHBfZGVzY3JfZ2V0OworICAgIC8qIE5vIGRhdGEgZGVzY3JpcHRvciBmb3VuZCBvbiBtZXRhdHlwZS4gTG9vayBpbiB0cF9kaWN0IG9mIHRoaXMKKyAgICAgKiB0eXBlIGFuZCBpdHMgYmFzZXMgKi8KKyAgICBhdHRyaWJ1dGUgPSBfUHlUeXBlX0xvb2t1cCh0eXBlLCBuYW1lKTsKKyAgICBpZiAoYXR0cmlidXRlICE9IE5VTEwpIHsKKyAgICAgICAgLyogSW1wbGVtZW50IGRlc2NyaXB0b3IgZnVuY3Rpb25hbGl0eSwgaWYgYW55ICovCisgICAgICAgIGRlc2NyZ2V0ZnVuYyBsb2NhbF9nZXQgPSBQeV9UWVBFKGF0dHJpYnV0ZSktPnRwX2Rlc2NyX2dldDsKIAotCQlQeV9YREVDUkVGKG1ldGFfYXR0cmlidXRlKTsKKyAgICAgICAgUHlfWERFQ1JFRihtZXRhX2F0dHJpYnV0ZSk7CiAKLQkJaWYgKGxvY2FsX2dldCAhPSBOVUxMKSB7Ci0JCQkvKiBOVUxMIDJuZCBhcmd1bWVudCBpbmRpY2F0ZXMgdGhlIGRlc2NyaXB0b3Igd2FzCi0JCQkgKiBmb3VuZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBpdHNlbGYgKG9yIGEgYmFzZSkgICovCi0JCQlyZXR1cm4gbG9jYWxfZ2V0KGF0dHJpYnV0ZSwgKFB5T2JqZWN0ICopTlVMTCwKLQkJCQkJIChQeU9iamVjdCAqKXR5cGUpOwotCQl9CisgICAgICAgIGlmIChsb2NhbF9nZXQgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogTlVMTCAybmQgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBkZXNjcmlwdG9yIHdhcworICAgICAgICAgICAgICogZm91bmQgb24gdGhlIHRhcmdldCBvYmplY3QgaXRzZWxmIChvciBhIGJhc2UpICAqLworICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2dldChhdHRyaWJ1dGUsIChQeU9iamVjdCAqKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXR5cGUpOworICAgICAgICB9CiAKLQkJUHlfSU5DUkVGKGF0dHJpYnV0ZSk7Ci0JCXJldHVybiBhdHRyaWJ1dGU7Ci0JfQorICAgICAgICBQeV9JTkNSRUYoYXR0cmlidXRlKTsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKKyAgICB9CiAKLQkvKiBObyBhdHRyaWJ1dGUgZm91bmQgaW4gbG9jYWwgX19kaWN0X18gKG9yIGJhc2VzKTogdXNlIHRoZQotCSAqIGRlc2NyaXB0b3IgZnJvbSB0aGUgbWV0YXR5cGUsIGlmIGFueSAqLwotCWlmIChtZXRhX2dldCAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCXJlcyA9IG1ldGFfZ2V0KG1ldGFfYXR0cmlidXRlLCAoUHlPYmplY3QgKil0eXBlLAotCQkJICAgICAgIChQeU9iamVjdCAqKW1ldGF0eXBlKTsKLQkJUHlfREVDUkVGKG1ldGFfYXR0cmlidXRlKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgLyogTm8gYXR0cmlidXRlIGZvdW5kIGluIGxvY2FsIF9fZGljdF9fIChvciBiYXNlcyk6IHVzZSB0aGUKKyAgICAgKiBkZXNjcmlwdG9yIGZyb20gdGhlIG1ldGF0eXBlLCBpZiBhbnkgKi8KKyAgICBpZiAobWV0YV9nZXQgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICByZXMgPSBtZXRhX2dldChtZXRhX2F0dHJpYnV0ZSwgKFB5T2JqZWN0ICopdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopbWV0YXR5cGUpOworICAgICAgICBQeV9ERUNSRUYobWV0YV9hdHRyaWJ1dGUpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCS8qIElmIGFuIG9yZGluYXJ5IGF0dHJpYnV0ZSB3YXMgZm91bmQgb24gdGhlIG1ldGF0eXBlLCByZXR1cm4gaXQgbm93ICovCi0JaWYgKG1ldGFfYXR0cmlidXRlICE9IE5VTEwpIHsKLQkJcmV0dXJuIG1ldGFfYXR0cmlidXRlOwotCX0KKyAgICAvKiBJZiBhbiBvcmRpbmFyeSBhdHRyaWJ1dGUgd2FzIGZvdW5kIG9uIHRoZSBtZXRhdHlwZSwgcmV0dXJuIGl0IG5vdyAqLworICAgIGlmIChtZXRhX2F0dHJpYnV0ZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtZXRhX2F0dHJpYnV0ZTsKKyAgICB9CiAKLQkvKiBHaXZlIHVwICovCi0JUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJICJ0eXBlIG9iamVjdCAnJS41MHMnIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAotCQkJIHR5cGUtPnRwX25hbWUsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogR2l2ZSB1cCAqLworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ0eXBlIG9iamVjdCAnJS41MHMnIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogdHlwZV9zZXRhdHRybyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgewotCQlQeUVycl9Gb3JtYXQoCi0JCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkiY2FuJ3Qgc2V0IGF0dHJpYnV0ZXMgb2YgYnVpbHQtaW4vZXh0ZW5zaW9uIHR5cGUgJyVzJyIsCi0JCQl0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoKFB5T2JqZWN0ICopdHlwZSwgbmFtZSwgdmFsdWUpIDwgMCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiB1cGRhdGVfc2xvdCh0eXBlLCBuYW1lKTsKKyAgICBpZiAoISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJjYW4ndCBzZXQgYXR0cmlidXRlcyBvZiBidWlsdC1pbi9leHRlbnNpb24gdHlwZSAnJXMnIiwKKyAgICAgICAgICAgIHR5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9HZW5lcmljU2V0QXR0cigoUHlPYmplY3QgKil0eXBlLCBuYW1lLCB2YWx1ZSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHVwZGF0ZV9zbG90KHR5cGUsIG5hbWUpOwogfQogCiBzdGF0aWMgdm9pZAogdHlwZV9kZWFsbG9jKFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeUhlYXBUeXBlT2JqZWN0ICpldDsKKyAgICBQeUhlYXBUeXBlT2JqZWN0ICpldDsKIAotCS8qIEFzc2VydCB0aGlzIGlzIGEgaGVhcC1hbGxvY2F0ZWQgdHlwZSBvYmplY3QgKi8KLQlhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyh0eXBlKTsKLQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKXR5cGUpOwotCWV0ID0gKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlOwotCVB5X1hERUNSRUYodHlwZS0+dHBfYmFzZSk7Ci0JUHlfWERFQ1JFRih0eXBlLT50cF9kaWN0KTsKLQlQeV9YREVDUkVGKHR5cGUtPnRwX2Jhc2VzKTsKLQlQeV9YREVDUkVGKHR5cGUtPnRwX21ybyk7Ci0JUHlfWERFQ1JFRih0eXBlLT50cF9jYWNoZSk7Ci0JUHlfWERFQ1JFRih0eXBlLT50cF9zdWJjbGFzc2VzKTsKLQkvKiBBIHR5cGUncyB0cF9kb2MgaXMgaGVhcCBhbGxvY2F0ZWQsIHVubGlrZSB0aGUgdHBfZG9jIHNsb3RzCi0JICogb2YgbW9zdCBvdGhlciBvYmplY3RzLiAgSXQncyBva2F5IHRvIGNhc3QgaXQgdG8gY2hhciAqLgotCSAqLwotCVB5T2JqZWN0X0ZyZWUoKGNoYXIgKil0eXBlLT50cF9kb2MpOwotCVB5X1hERUNSRUYoZXQtPmh0X25hbWUpOwotCVB5X1hERUNSRUYoZXQtPmh0X3Nsb3RzKTsKLQlQeV9UWVBFKHR5cGUpLT50cF9mcmVlKChQeU9iamVjdCAqKXR5cGUpOworICAgIC8qIEFzc2VydCB0aGlzIGlzIGEgaGVhcC1hbGxvY2F0ZWQgdHlwZSBvYmplY3QgKi8KKyAgICBhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyh0eXBlKTsKKyAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKXR5cGUpOworICAgIGV0ID0gKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlOworICAgIFB5X1hERUNSRUYodHlwZS0+dHBfYmFzZSk7CisgICAgUHlfWERFQ1JFRih0eXBlLT50cF9kaWN0KTsKKyAgICBQeV9YREVDUkVGKHR5cGUtPnRwX2Jhc2VzKTsKKyAgICBQeV9YREVDUkVGKHR5cGUtPnRwX21ybyk7CisgICAgUHlfWERFQ1JFRih0eXBlLT50cF9jYWNoZSk7CisgICAgUHlfWERFQ1JFRih0eXBlLT50cF9zdWJjbGFzc2VzKTsKKyAgICAvKiBBIHR5cGUncyB0cF9kb2MgaXMgaGVhcCBhbGxvY2F0ZWQsIHVubGlrZSB0aGUgdHBfZG9jIHNsb3RzCisgICAgICogb2YgbW9zdCBvdGhlciBvYmplY3RzLiAgSXQncyBva2F5IHRvIGNhc3QgaXQgdG8gY2hhciAqLgorICAgICAqLworICAgIFB5T2JqZWN0X0ZyZWUoKGNoYXIgKil0eXBlLT50cF9kb2MpOworICAgIFB5X1hERUNSRUYoZXQtPmh0X25hbWUpOworICAgIFB5X1hERUNSRUYoZXQtPmh0X3Nsb3RzKTsKKyAgICBQeV9UWVBFKHR5cGUpLT50cF9mcmVlKChQeU9iamVjdCAqKXR5cGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3NfaWdub3JlZCkKIHsKLQlQeU9iamVjdCAqbGlzdCwgKnJhdywgKnJlZjsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKmxpc3QsICpyYXcsICpyZWY7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmF3ID0gdHlwZS0+dHBfc3ViY2xhc3NlczsKLQlpZiAocmF3ID09IE5VTEwpCi0JCXJldHVybiBsaXN0OwotCWFzc2VydChQeUxpc3RfQ2hlY2socmF3KSk7Ci0JbiA9IFB5TGlzdF9HRVRfU0laRShyYXcpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJcmVmID0gUHlMaXN0X0dFVF9JVEVNKHJhdywgaSk7Ci0JCWFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7Ci0JCXJlZiA9IFB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZik7Ci0JCWlmIChyZWYgIT0gUHlfTm9uZSkgewotCQkJaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgcmVmKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYobGlzdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmF3ID0gdHlwZS0+dHBfc3ViY2xhc3NlczsKKyAgICBpZiAocmF3ID09IE5VTEwpCisgICAgICAgIHJldHVybiBsaXN0OworICAgIGFzc2VydChQeUxpc3RfQ2hlY2socmF3KSk7CisgICAgbiA9IFB5TGlzdF9HRVRfU0laRShyYXcpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgcmVmID0gUHlMaXN0X0dFVF9JVEVNKHJhdywgaSk7CisgICAgICAgIGFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7CisgICAgICAgIHJlZiA9IFB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZik7CisgICAgICAgIGlmIChyZWYgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgcmVmKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0eXBlX21ldGhvZHNbXSA9IHsKLQl7Im1ybyIsIChQeUNGdW5jdGlvbiltcm9fZXh0ZXJuYWwsIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIm1ybygpIC0+IGxpc3RcbnJldHVybiBhIHR5cGUncyBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciIpfSwKLQl7Il9fc3ViY2xhc3Nlc19fIiwgKFB5Q0Z1bmN0aW9uKXR5cGVfc3ViY2xhc3NlcywgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiX19zdWJjbGFzc2VzX18oKSAtPiBsaXN0IG9mIGltbWVkaWF0ZSBzdWJjbGFzc2VzIil9LAotCXsiX19pbnN0YW5jZWNoZWNrX18iLCB0eXBlX19faW5zdGFuY2VjaGVja19fLCBNRVRIX08sCi0JIFB5RG9jX1NUUigiX19pbnN0YW5jZWNoZWNrX18oKSAtPiBjaGVjayBpZiBhbiBvYmplY3QgaXMgYW4gaW5zdGFuY2UiKX0sCi0JeyJfX3N1YmNsYXNzY2hlY2tfXyIsIHR5cGVfX19zdWJjbGFzc2NoZWNrX18sIE1FVEhfTywKLQkgUHlEb2NfU1RSKCJfX3N1YmNsYXNzY2hja19fIC0+IGNoZWNrIGlmIGFuIGNsYXNzIGlzIGEgc3ViY2xhc3MiKX0sCi0JezB9CisgICAgeyJtcm8iLCAoUHlDRnVuY3Rpb24pbXJvX2V4dGVybmFsLCBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJtcm8oKSAtPiBsaXN0XG5yZXR1cm4gYSB0eXBlJ3MgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIiKX0sCisgICAgeyJfX3N1YmNsYXNzZXNfXyIsIChQeUNGdW5jdGlvbil0eXBlX3N1YmNsYXNzZXMsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIl9fc3ViY2xhc3Nlc19fKCkgLT4gbGlzdCBvZiBpbW1lZGlhdGUgc3ViY2xhc3NlcyIpfSwKKyAgICB7Il9faW5zdGFuY2VjaGVja19fIiwgdHlwZV9fX2luc3RhbmNlY2hlY2tfXywgTUVUSF9PLAorICAgICBQeURvY19TVFIoIl9faW5zdGFuY2VjaGVja19fKCkgLT4gY2hlY2sgaWYgYW4gb2JqZWN0IGlzIGFuIGluc3RhbmNlIil9LAorICAgIHsiX19zdWJjbGFzc2NoZWNrX18iLCB0eXBlX19fc3ViY2xhc3NjaGVja19fLCBNRVRIX08sCisgICAgIFB5RG9jX1NUUigiX19zdWJjbGFzc2NoY2tfXyAtPiBjaGVjayBpZiBhbiBjbGFzcyBpcyBhIHN1YmNsYXNzIil9LAorICAgIHswfQogfTsKIAogUHlEb2NfU1RSVkFSKHR5cGVfZG9jLApAQCAtMjY2NiwxMDkgKzI2NjYsMTA5IEBACiBzdGF0aWMgaW50CiB0eXBlX3RyYXZlcnNlKFB5VHlwZU9iamVjdCAqdHlwZSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JLyogQmVjYXVzZSBvZiB0eXBlX2lzX2djKCksIHRoZSBjb2xsZWN0b3Igb25seSBjYWxscyB0aGlzCi0JICAgZm9yIGhlYXB0eXBlcy4gKi8KLQlhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKKyAgICAvKiBCZWNhdXNlIG9mIHR5cGVfaXNfZ2MoKSwgdGhlIGNvbGxlY3RvciBvbmx5IGNhbGxzIHRoaXMKKyAgICAgICBmb3IgaGVhcHR5cGVzLiAqLworICAgIGFzc2VydCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpOwogCi0JUHlfVklTSVQodHlwZS0+dHBfZGljdCk7Ci0JUHlfVklTSVQodHlwZS0+dHBfY2FjaGUpOwotCVB5X1ZJU0lUKHR5cGUtPnRwX21ybyk7Ci0JUHlfVklTSVQodHlwZS0+dHBfYmFzZXMpOwotCVB5X1ZJU0lUKHR5cGUtPnRwX2Jhc2UpOworICAgIFB5X1ZJU0lUKHR5cGUtPnRwX2RpY3QpOworICAgIFB5X1ZJU0lUKHR5cGUtPnRwX2NhY2hlKTsKKyAgICBQeV9WSVNJVCh0eXBlLT50cF9tcm8pOworICAgIFB5X1ZJU0lUKHR5cGUtPnRwX2Jhc2VzKTsKKyAgICBQeV9WSVNJVCh0eXBlLT50cF9iYXNlKTsKIAotCS8qIFRoZXJlJ3Mgbm8gbmVlZCB0byB2aXNpdCB0eXBlLT50cF9zdWJjbGFzc2VzIG9yCi0JICAgKChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZSktPmh0X3Nsb3RzLCBiZWNhdXNlIHRoZXkgY2FuJ3QgYmUgaW52b2x2ZWQKLQkgICBpbiBjeWNsZXM7IHRwX3N1YmNsYXNzZXMgaXMgYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcywKLQkgICBhbmQgc2xvdHMgaXMgYSB0dXBsZSBvZiBzdHJpbmdzLiAqLworICAgIC8qIFRoZXJlJ3Mgbm8gbmVlZCB0byB2aXNpdCB0eXBlLT50cF9zdWJjbGFzc2VzIG9yCisgICAgICAgKChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZSktPmh0X3Nsb3RzLCBiZWNhdXNlIHRoZXkgY2FuJ3QgYmUgaW52b2x2ZWQKKyAgICAgICBpbiBjeWNsZXM7IHRwX3N1YmNsYXNzZXMgaXMgYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcywKKyAgICAgICBhbmQgc2xvdHMgaXMgYSB0dXBsZSBvZiBzdHJpbmdzLiAqLwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfY2xlYXIoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCS8qIEJlY2F1c2Ugb2YgdHlwZV9pc19nYygpLCB0aGUgY29sbGVjdG9yIG9ubHkgY2FsbHMgdGhpcwotCSAgIGZvciBoZWFwdHlwZXMuICovCi0JYXNzZXJ0KHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSk7CisgICAgLyogQmVjYXVzZSBvZiB0eXBlX2lzX2djKCksIHRoZSBjb2xsZWN0b3Igb25seSBjYWxscyB0aGlzCisgICAgICAgZm9yIGhlYXB0eXBlcy4gKi8KKyAgICBhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKIAotCS8qIFRoZSBvbmx5IGZpZWxkIHdlIG5lZWQgdG8gY2xlYXIgaXMgdHBfbXJvLCB3aGljaCBpcyBwYXJ0IG9mIGEKLQkgICBoYXJkIGN5Y2xlIChpdHMgZmlyc3QgZWxlbWVudCBpcyB0aGUgY2xhc3MgaXRzZWxmKSB0aGF0IHdvbid0Ci0JICAgYmUgYnJva2VuIG90aGVyd2lzZSAoaXQncyBhIHR1cGxlIGFuZCB0dXBsZXMgZG9uJ3QgaGF2ZSBhCi0JICAgdHBfY2xlYXIgaGFuZGxlcikuICBOb25lIG9mIHRoZSBvdGhlciBmaWVsZHMgbmVlZCB0byBiZQotCSAgIGNsZWFyZWQsIGFuZCBoZXJlJ3Mgd2h5OgorICAgIC8qIFRoZSBvbmx5IGZpZWxkIHdlIG5lZWQgdG8gY2xlYXIgaXMgdHBfbXJvLCB3aGljaCBpcyBwYXJ0IG9mIGEKKyAgICAgICBoYXJkIGN5Y2xlIChpdHMgZmlyc3QgZWxlbWVudCBpcyB0aGUgY2xhc3MgaXRzZWxmKSB0aGF0IHdvbid0CisgICAgICAgYmUgYnJva2VuIG90aGVyd2lzZSAoaXQncyBhIHR1cGxlIGFuZCB0dXBsZXMgZG9uJ3QgaGF2ZSBhCisgICAgICAgdHBfY2xlYXIgaGFuZGxlcikuICBOb25lIG9mIHRoZSBvdGhlciBmaWVsZHMgbmVlZCB0byBiZQorICAgICAgIGNsZWFyZWQsIGFuZCBoZXJlJ3Mgd2h5OgogCi0JICAgdHBfZGljdDoKLQkgICAgICAgSXQgaXMgYSBkaWN0LCBzbyB0aGUgY29sbGVjdG9yIHdpbGwgY2FsbCBpdHMgdHBfY2xlYXIuCisgICAgICAgdHBfZGljdDoKKyAgICAgICAgICAgSXQgaXMgYSBkaWN0LCBzbyB0aGUgY29sbGVjdG9yIHdpbGwgY2FsbCBpdHMgdHBfY2xlYXIuCiAKLQkgICB0cF9jYWNoZToKLQkgICAgICAgTm90IHVzZWQ7IGlmIGl0IHdlcmUsIGl0IHdvdWxkIGJlIGEgZGljdC4KKyAgICAgICB0cF9jYWNoZToKKyAgICAgICAgICAgTm90IHVzZWQ7IGlmIGl0IHdlcmUsIGl0IHdvdWxkIGJlIGEgZGljdC4KIAotCSAgIHRwX2Jhc2VzLCB0cF9iYXNlOgotCSAgICAgICBJZiB0aGVzZSBhcmUgaW52b2x2ZWQgaW4gYSBjeWNsZSwgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdAotCSAgICAgICBvbmUgb3RoZXIsIG11dGFibGUgb2JqZWN0IGluIHRoZSBjeWNsZSwgZS5nLiBhIGJhc2UKLQkgICAgICAgY2xhc3MncyBkaWN0OyB0aGUgY3ljbGUgd2lsbCBiZSBicm9rZW4gdGhhdCB3YXkuCisgICAgICAgdHBfYmFzZXMsIHRwX2Jhc2U6CisgICAgICAgICAgIElmIHRoZXNlIGFyZSBpbnZvbHZlZCBpbiBhIGN5Y2xlLCB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0CisgICAgICAgICAgIG9uZSBvdGhlciwgbXV0YWJsZSBvYmplY3QgaW4gdGhlIGN5Y2xlLCBlLmcuIGEgYmFzZQorICAgICAgICAgICBjbGFzcydzIGRpY3Q7IHRoZSBjeWNsZSB3aWxsIGJlIGJyb2tlbiB0aGF0IHdheS4KIAotCSAgIHRwX3N1YmNsYXNzZXM6Ci0JICAgICAgIEEgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgY2FuJ3QgYmUgcGFydCBvZiBhIGN5Y2xlOyBhbmQKLQkgICAgICAgbGlzdHMgaGF2ZSB0aGVpciBvd24gdHBfY2xlYXIuCisgICAgICAgdHBfc3ViY2xhc3NlczoKKyAgICAgICAgICAgQSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyBjYW4ndCBiZSBwYXJ0IG9mIGEgY3ljbGU7IGFuZAorICAgICAgICAgICBsaXN0cyBoYXZlIHRoZWlyIG93biB0cF9jbGVhci4KIAotCSAgIHNsb3RzIChpbiBQeUhlYXBUeXBlT2JqZWN0KToKLQkgICAgICAgQSB0dXBsZSBvZiBzdHJpbmdzIGNhbid0IGJlIHBhcnQgb2YgYSBjeWNsZS4KLQkqLworICAgICAgIHNsb3RzIChpbiBQeUhlYXBUeXBlT2JqZWN0KToKKyAgICAgICAgICAgQSB0dXBsZSBvZiBzdHJpbmdzIGNhbid0IGJlIHBhcnQgb2YgYSBjeWNsZS4KKyAgICAqLwogCi0JUHlfQ0xFQVIodHlwZS0+dHBfbXJvKTsKKyAgICBQeV9DTEVBUih0eXBlLT50cF9tcm8pOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfaXNfZ2MoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCXJldHVybiB0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEU7CisgICAgcmV0dXJuIHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRTsKIH0KIAogUHlUeXBlT2JqZWN0IFB5VHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInR5cGUiLAkJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeUhlYXBUeXBlT2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCXNpemVvZihQeU1lbWJlckRlZiksCQkJLyogdHBfaXRlbXNpemUgKi8KLQkoZGVzdHJ1Y3Rvcil0eXBlX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpdHlwZV9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpX1B5X0hhc2hQb2ludGVyLAkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYyl0eXBlX2NhbGwsCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkoZ2V0YXR0cm9mdW5jKXR5cGVfZ2V0YXR0cm8sCQkvKiB0cF9nZXRhdHRybyAqLwotCShzZXRhdHRyb2Z1bmMpdHlwZV9zZXRhdHRybywJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX1RZUEVfU1VCQ0xBU1MsCS8qIHRwX2ZsYWdzICovCi0JdHlwZV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpdHlwZV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpdHlwZV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCXR5cGVfcmljaGNvbXBhcmUsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCW9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfd2Vha2xpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JdHlwZV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JdHlwZV9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JdHlwZV9nZXRzZXRzLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQlvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2RpY3QpLAkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JdHlwZV9pbml0LAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JdHlwZV9uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCQkvKiB0cF9mcmVlICovCi0JKGlucXVpcnkpdHlwZV9pc19nYywJCQkvKiB0cF9pc19nYyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5SGVhcFR5cGVPYmplY3QpLCAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICBzaXplb2YoUHlNZW1iZXJEZWYpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgKGRlc3RydWN0b3IpdHlwZV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpdHlwZV9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpX1B5X0hhc2hQb2ludGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAodGVybmFyeWZ1bmMpdHlwZV9jYWxsLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIChnZXRhdHRyb2Z1bmMpdHlwZV9nZXRhdHRybywgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAoc2V0YXR0cm9mdW5jKXR5cGVfc2V0YXR0cm8sICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19UWVBFX1NVQkNMQVNTLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgdHlwZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXR5cGVfdHJhdmVyc2UsICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpdHlwZV9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIHR5cGVfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF93ZWFrbGlzdCksICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICB0eXBlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICB0eXBlX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICB0eXBlX2dldHNldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2RpY3QpLCAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICB0eXBlX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgdHlwZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICAoaW5xdWlyeSl0eXBlX2lzX2djLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2lzX2djICovCiB9OwogCiAKQEAgLTI4MjEsMjgyICsyODIxLDI4MiBAQAogc3RhdGljIGludAogZXhjZXNzX2FyZ3MoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIHx8Ci0JCShrd2RzICYmIFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSk7CisgICAgcmV0dXJuIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgfHwKKyAgICAgICAgKGt3ZHMgJiYgUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpKTsKIH0KIAogc3RhdGljIGludAogb2JqZWN0X2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpbnQgZXJyID0gMDsKLQlpZiAoZXhjZXNzX2FyZ3MoYXJncywga3dkcykpIHsKLQkJUHlUeXBlT2JqZWN0ICp0eXBlID0gUHlfVFlQRShzZWxmKTsKLQkJaWYgKHR5cGUtPnRwX2luaXQgIT0gb2JqZWN0X2luaXQgJiYKLQkJICAgIHR5cGUtPnRwX25ldyAhPSBvYmplY3RfbmV3KQotCQl7Ci0JCQllcnIgPSBQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCSAgICJvYmplY3QuX19pbml0X18oKSB0YWtlcyBubyBwYXJhbWV0ZXJzIiwKLQkJCQkgICAxKTsKLQkJfQotCQllbHNlIGlmICh0eXBlLT50cF9pbml0ICE9IG9iamVjdF9pbml0IHx8Ci0JCQkgdHlwZS0+dHBfbmV3ID09IG9iamVjdF9uZXcpCi0JCXsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm9iamVjdC5fX2luaXRfXygpIHRha2VzIG5vIHBhcmFtZXRlcnMiKTsKLQkJCWVyciA9IC0xOwotCQl9Ci0JfQotCXJldHVybiBlcnI7CisgICAgaW50IGVyciA9IDA7CisgICAgaWYgKGV4Y2Vzc19hcmdzKGFyZ3MsIGt3ZHMpKSB7CisgICAgICAgIFB5VHlwZU9iamVjdCAqdHlwZSA9IFB5X1RZUEUoc2VsZik7CisgICAgICAgIGlmICh0eXBlLT50cF9pbml0ICE9IG9iamVjdF9pbml0ICYmCisgICAgICAgICAgICB0eXBlLT50cF9uZXcgIT0gb2JqZWN0X25ldykKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdC5fX2luaXRfXygpIHRha2VzIG5vIHBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlLT50cF9pbml0ICE9IG9iamVjdF9pbml0IHx8CisgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25ldyA9PSBvYmplY3RfbmV3KQorICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJvYmplY3QuX19pbml0X18oKSB0YWtlcyBubyBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb2JqZWN0X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpbnQgZXJyID0gMDsKLQlpZiAoZXhjZXNzX2FyZ3MoYXJncywga3dkcykpIHsKLQkJaWYgKHR5cGUtPnRwX25ldyAhPSBvYmplY3RfbmV3ICYmCi0JCSAgICB0eXBlLT50cF9pbml0ICE9IG9iamVjdF9pbml0KQotCQl7Ci0JCQllcnIgPSBQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCSAgICJvYmplY3QuX19uZXdfXygpIHRha2VzIG5vIHBhcmFtZXRlcnMiLAotCQkJCSAgIDEpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUtPnRwX25ldyAhPSBvYmplY3RfbmV3IHx8Ci0JCQkgdHlwZS0+dHBfaW5pdCA9PSBvYmplY3RfaW5pdCkKLQkJewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkib2JqZWN0Ll9fbmV3X18oKSB0YWtlcyBubyBwYXJhbWV0ZXJzIik7Ci0JCQllcnIgPSAtMTsKLQkJfQotCX0KLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaW50IGVyciA9IDA7CisgICAgaWYgKGV4Y2Vzc19hcmdzKGFyZ3MsIGt3ZHMpKSB7CisgICAgICAgIGlmICh0eXBlLT50cF9uZXcgIT0gb2JqZWN0X25ldyAmJgorICAgICAgICAgICAgdHlwZS0+dHBfaW5pdCAhPSBvYmplY3RfaW5pdCkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdC5fX25ld19fKCkgdGFrZXMgbm8gcGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUtPnRwX25ldyAhPSBvYmplY3RfbmV3IHx8CisgICAgICAgICAgICAgICAgIHR5cGUtPnRwX2luaXQgPT0gb2JqZWN0X2luaXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIm9iamVjdC5fX25ld19fKCkgdGFrZXMgbm8gcGFyYW1ldGVycyIpOworICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19JU19BQlNUUkFDVCkgewotCQlzdGF0aWMgUHlPYmplY3QgKmNvbW1hID0gTlVMTDsKLQkJUHlPYmplY3QgKmFic3RyYWN0X21ldGhvZHMgPSBOVUxMOwotCQlQeU9iamVjdCAqYnVpbHRpbnM7Ci0JCVB5T2JqZWN0ICpzb3J0ZWQ7Ci0JCVB5T2JqZWN0ICpzb3J0ZWRfbWV0aG9kcyA9IE5VTEw7Ci0JCVB5T2JqZWN0ICpqb2luZWQgPSBOVUxMOwotCQljb25zdCBjaGFyICpqb2luZWRfc3RyOworICAgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSVNfQUJTVFJBQ1QpIHsKKyAgICAgICAgc3RhdGljIFB5T2JqZWN0ICpjb21tYSA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICphYnN0cmFjdF9tZXRob2RzID0gTlVMTDsKKyAgICAgICAgUHlPYmplY3QgKmJ1aWx0aW5zOworICAgICAgICBQeU9iamVjdCAqc29ydGVkOworICAgICAgICBQeU9iamVjdCAqc29ydGVkX21ldGhvZHMgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqam9pbmVkID0gTlVMTDsKKyAgICAgICAgY29uc3QgY2hhciAqam9pbmVkX3N0cjsKIAotCQkvKiBDb21wdXRlICIsICIuam9pbihzb3J0ZWQodHlwZS5fX2Fic3RyYWN0bWV0aG9kc19fKSkKLQkJICAgaW50byBqb2luZWQuICovCi0JCWFic3RyYWN0X21ldGhvZHMgPSB0eXBlX2Fic3RyYWN0bWV0aG9kcyh0eXBlLCBOVUxMKTsKLQkJaWYgKGFic3RyYWN0X21ldGhvZHMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWJ1aWx0aW5zID0gUHlFdmFsX0dldEJ1aWx0aW5zKCk7Ci0JCWlmIChidWlsdGlucyA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJc29ydGVkID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoYnVpbHRpbnMsICJzb3J0ZWQiKTsKLQkJaWYgKHNvcnRlZCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJc29ydGVkX21ldGhvZHMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHNvcnRlZCwKLQkJCQkJCQkgICAgICBhYnN0cmFjdF9tZXRob2RzLAotCQkJCQkJCSAgICAgIE5VTEwpOwotCQlpZiAoc29ydGVkX21ldGhvZHMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmIChjb21tYSA9PSBOVUxMKSB7Ci0JCQljb21tYSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIiwgIik7Ci0JCQlpZiAoY29tbWEgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQl9Ci0JCWpvaW5lZCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoY29tbWEsICJqb2luIiwKLQkJCQkJICAgICAiTyIsICBzb3J0ZWRfbWV0aG9kcyk7Ci0JCWlmIChqb2luZWQgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWpvaW5lZF9zdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhqb2luZWQpOwotCQlpZiAoam9pbmVkX3N0ciA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKKyAgICAgICAgLyogQ29tcHV0ZSAiLCAiLmpvaW4oc29ydGVkKHR5cGUuX19hYnN0cmFjdG1ldGhvZHNfXykpCisgICAgICAgICAgIGludG8gam9pbmVkLiAqLworICAgICAgICBhYnN0cmFjdF9tZXRob2RzID0gdHlwZV9hYnN0cmFjdG1ldGhvZHModHlwZSwgTlVMTCk7CisgICAgICAgIGlmIChhYnN0cmFjdF9tZXRob2RzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBidWlsdGlucyA9IFB5RXZhbF9HZXRCdWlsdGlucygpOworICAgICAgICBpZiAoYnVpbHRpbnMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHNvcnRlZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGJ1aWx0aW5zLCAic29ydGVkIik7CisgICAgICAgIGlmIChzb3J0ZWQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHNvcnRlZF9tZXRob2RzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhzb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdF9tZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGlmIChzb3J0ZWRfbWV0aG9kcyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGNvbW1hID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbW1hID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiLCAiKTsKKyAgICAgICAgICAgIGlmIChjb21tYSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgam9pbmVkID0gUHlPYmplY3RfQ2FsbE1ldGhvZChjb21tYSwgImpvaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPIiwgIHNvcnRlZF9tZXRob2RzKTsKKyAgICAgICAgaWYgKGpvaW5lZCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgam9pbmVkX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGpvaW5lZCk7CisgICAgICAgIGlmIChqb2luZWRfc3RyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOwogCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJDYW4ndCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcyAlcyAiCi0JCQkgICAgICJ3aXRoIGFic3RyYWN0IG1ldGhvZHMgJXMiLAotCQkJICAgICB0eXBlLT50cF9uYW1lLAotCQkJICAgICBqb2luZWRfc3RyKTsKLQllcnJvcjoKLQkJUHlfWERFQ1JFRihqb2luZWQpOwotCQlQeV9YREVDUkVGKHNvcnRlZF9tZXRob2RzKTsKLQkJUHlfWERFQ1JFRihhYnN0cmFjdF9tZXRob2RzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcyAlcyAiCisgICAgICAgICAgICAgICAgICAgICAid2l0aCBhYnN0cmFjdCBtZXRob2RzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBqb2luZWRfc3RyKTsKKyAgICBlcnJvcjoKKyAgICAgICAgUHlfWERFQ1JFRihqb2luZWQpOworICAgICAgICBQeV9YREVDUkVGKHNvcnRlZF9tZXRob2RzKTsKKyAgICAgICAgUHlfWERFQ1JFRihhYnN0cmFjdF9tZXRob2RzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKIH0KIAogc3RhdGljIHZvaWQKIG9iamVjdF9kZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9iamVjdF9yZXByKFB5T2JqZWN0ICpzZWxmKQogewotCVB5VHlwZU9iamVjdCAqdHlwZTsKLQlQeU9iamVjdCAqbW9kLCAqbmFtZSwgKnJ0bjsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGU7CisgICAgUHlPYmplY3QgKm1vZCwgKm5hbWUsICpydG47CiAKLQl0eXBlID0gUHlfVFlQRShzZWxmKTsKLQltb2QgPSB0eXBlX21vZHVsZSh0eXBlLCBOVUxMKTsKLQlpZiAobW9kID09IE5VTEwpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKG1vZCkpIHsKLQkJUHlfREVDUkVGKG1vZCk7Ci0JCW1vZCA9IE5VTEw7Ci0JfQotCW5hbWUgPSB0eXBlX25hbWUodHlwZSwgTlVMTCk7Ci0JaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG1vZCAhPSBOVUxMICYmIHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobW9kKSwgIl9fYnVpbHRpbl9fIikpCi0JCXJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcy4lcyBvYmplY3QgYXQgJXA+IiwKLQkJCQkJICBQeVN0cmluZ19BU19TVFJJTkcobW9kKSwKLQkJCQkJICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksCi0JCQkJCSAgc2VsZik7Ci0JZWxzZQotCQlydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgb2JqZWN0IGF0ICVwPiIsCi0JCQkJCSAgdHlwZS0+dHBfbmFtZSwgc2VsZik7Ci0JUHlfWERFQ1JFRihtb2QpOwotCVB5X0RFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcnRuOworICAgIHR5cGUgPSBQeV9UWVBFKHNlbGYpOworICAgIG1vZCA9IHR5cGVfbW9kdWxlKHR5cGUsIE5VTEwpOworICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2sobW9kKSkgeworICAgICAgICBQeV9ERUNSRUYobW9kKTsKKyAgICAgICAgbW9kID0gTlVMTDsKKyAgICB9CisgICAgbmFtZSA9IHR5cGVfbmFtZSh0eXBlLCBOVUxMKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobW9kICE9IE5VTEwgJiYgc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhtb2QpLCAiX19idWlsdGluX18iKSkKKyAgICAgICAgcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzLiVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhtb2QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBvYmplY3QgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLCBzZWxmKTsKKyAgICBQeV9YREVDUkVGKG1vZCk7CisgICAgUHlfREVDUkVGKG5hbWUpOworICAgIHJldHVybiBydG47CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvYmplY3Rfc3RyKFB5T2JqZWN0ICpzZWxmKQogewotCXVuYXJ5ZnVuYyBmOworICAgIHVuYXJ5ZnVuYyBmOwogCi0JZiA9IFB5X1RZUEUoc2VsZiktPnRwX3JlcHI7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJZiA9IG9iamVjdF9yZXByOwotCXJldHVybiBmKHNlbGYpOworICAgIGYgPSBQeV9UWVBFKHNlbGYpLT50cF9yZXByOworICAgIGlmIChmID09IE5VTEwpCisgICAgICAgIGYgPSBvYmplY3RfcmVwcjsKKyAgICByZXR1cm4gZihzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9iamVjdF9nZXRfY2xhc3MoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlfSU5DUkVGKFB5X1RZUEUoc2VsZikpOwotCXJldHVybiAoUHlPYmplY3QgKikoUHlfVFlQRShzZWxmKSk7CisgICAgUHlfSU5DUkVGKFB5X1RZUEUoc2VsZikpOworICAgIHJldHVybiAoUHlPYmplY3QgKikoUHlfVFlQRShzZWxmKSk7CiB9CiAKIHN0YXRpYyBpbnQKIGVxdWl2X3N0cnVjdHMoUHlUeXBlT2JqZWN0ICphLCBQeVR5cGVPYmplY3QgKmIpCiB7Ci0JcmV0dXJuIGEgPT0gYiB8fAotCSAgICAgICAoYSAhPSBOVUxMICYmCi0JCWIgIT0gTlVMTCAmJgotCQlhLT50cF9iYXNpY3NpemUgPT0gYi0+dHBfYmFzaWNzaXplICYmCi0JCWEtPnRwX2l0ZW1zaXplID09IGItPnRwX2l0ZW1zaXplICYmCi0JCWEtPnRwX2RpY3RvZmZzZXQgPT0gYi0+dHBfZGljdG9mZnNldCAmJgotCQlhLT50cF93ZWFrbGlzdG9mZnNldCA9PSBiLT50cF93ZWFrbGlzdG9mZnNldCAmJgotCQkoKGEtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSA9PQotCQkgKGItPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSkpOworICAgIHJldHVybiBhID09IGIgfHwKKyAgICAgICAgICAgKGEgIT0gTlVMTCAmJgorICAgICAgICBiICE9IE5VTEwgJiYKKyAgICAgICAgYS0+dHBfYmFzaWNzaXplID09IGItPnRwX2Jhc2ljc2l6ZSAmJgorICAgICAgICBhLT50cF9pdGVtc2l6ZSA9PSBiLT50cF9pdGVtc2l6ZSAmJgorICAgICAgICBhLT50cF9kaWN0b2Zmc2V0ID09IGItPnRwX2RpY3RvZmZzZXQgJiYKKyAgICAgICAgYS0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gYi0+dHBfd2Vha2xpc3RvZmZzZXQgJiYKKyAgICAgICAgKChhLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykgPT0KKyAgICAgICAgIChiLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykpKTsKIH0KIAogc3RhdGljIGludAogc2FtZV9zbG90c19hZGRlZChQeVR5cGVPYmplY3QgKmEsIFB5VHlwZU9iamVjdCAqYikKIHsKLQlQeVR5cGVPYmplY3QgKmJhc2UgPSBhLT50cF9iYXNlOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeU9iamVjdCAqc2xvdHNfYSwgKnNsb3RzX2I7CisgICAgUHlUeXBlT2JqZWN0ICpiYXNlID0gYS0+dHBfYmFzZTsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlPYmplY3QgKnNsb3RzX2EsICpzbG90c19iOwogCi0JaWYgKGJhc2UgIT0gYi0+dHBfYmFzZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGVxdWl2X3N0cnVjdHMoYSwgYmFzZSkgJiYgZXF1aXZfc3RydWN0cyhiLCBiYXNlKSkKLQkJcmV0dXJuIDE7Ci0Jc2l6ZSA9IGJhc2UtPnRwX2Jhc2ljc2l6ZTsKLQlpZiAoYS0+dHBfZGljdG9mZnNldCA9PSBzaXplICYmIGItPnRwX2RpY3RvZmZzZXQgPT0gc2l6ZSkKLQkJc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKik7Ci0JaWYgKGEtPnRwX3dlYWtsaXN0b2Zmc2V0ID09IHNpemUgJiYgYi0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gc2l6ZSkKLQkJc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgaWYgKGJhc2UgIT0gYi0+dHBfYmFzZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGVxdWl2X3N0cnVjdHMoYSwgYmFzZSkgJiYgZXF1aXZfc3RydWN0cyhiLCBiYXNlKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgc2l6ZSA9IGJhc2UtPnRwX2Jhc2ljc2l6ZTsKKyAgICBpZiAoYS0+dHBfZGljdG9mZnNldCA9PSBzaXplICYmIGItPnRwX2RpY3RvZmZzZXQgPT0gc2l6ZSkKKyAgICAgICAgc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgaWYgKGEtPnRwX3dlYWtsaXN0b2Zmc2V0ID09IHNpemUgJiYgYi0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gc2l6ZSkKKyAgICAgICAgc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKik7CiAKLQkvKiBDaGVjayBzbG90cyBjb21wbGlhbmNlICovCi0Jc2xvdHNfYSA9ICgoUHlIZWFwVHlwZU9iamVjdCAqKWEpLT5odF9zbG90czsKLQlzbG90c19iID0gKChQeUhlYXBUeXBlT2JqZWN0ICopYiktPmh0X3Nsb3RzOwotCWlmIChzbG90c19hICYmIHNsb3RzX2IpIHsKLQkJaWYgKFB5T2JqZWN0X0NvbXBhcmUoc2xvdHNfYSwgc2xvdHNfYikgIT0gMCkKLQkJCXJldHVybiAwOwotCQlzaXplICs9IHNpemVvZihQeU9iamVjdCAqKSAqIFB5VHVwbGVfR0VUX1NJWkUoc2xvdHNfYSk7Ci0JfQotCXJldHVybiBzaXplID09IGEtPnRwX2Jhc2ljc2l6ZSAmJiBzaXplID09IGItPnRwX2Jhc2ljc2l6ZTsKKyAgICAvKiBDaGVjayBzbG90cyBjb21wbGlhbmNlICovCisgICAgc2xvdHNfYSA9ICgoUHlIZWFwVHlwZU9iamVjdCAqKWEpLT5odF9zbG90czsKKyAgICBzbG90c19iID0gKChQeUhlYXBUeXBlT2JqZWN0ICopYiktPmh0X3Nsb3RzOworICAgIGlmIChzbG90c19hICYmIHNsb3RzX2IpIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0NvbXBhcmUoc2xvdHNfYSwgc2xvdHNfYikgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzaXplICs9IHNpemVvZihQeU9iamVjdCAqKSAqIFB5VHVwbGVfR0VUX1NJWkUoc2xvdHNfYSk7CisgICAgfQorICAgIHJldHVybiBzaXplID09IGEtPnRwX2Jhc2ljc2l6ZSAmJiBzaXplID09IGItPnRwX2Jhc2ljc2l6ZTsKIH0KIAogc3RhdGljIGludAogY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QqIG9sZHRvLCBQeVR5cGVPYmplY3QqIG5ld3RvLCBjaGFyKiBhdHRyKQogewotCVB5VHlwZU9iamVjdCAqbmV3YmFzZSwgKm9sZGJhc2U7CisgICAgUHlUeXBlT2JqZWN0ICpuZXdiYXNlLCAqb2xkYmFzZTsKIAotCWlmIChuZXd0by0+dHBfZGVhbGxvYyAhPSBvbGR0by0+dHBfZGVhbGxvYyB8fAotCSAgICBuZXd0by0+dHBfZnJlZSAhPSBvbGR0by0+dHBfZnJlZSkKLQl7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIlcyBhc3NpZ25tZW50OiAiCi0JCQkgICAgICInJXMnIGRlYWxsb2NhdG9yIGRpZmZlcnMgZnJvbSAnJXMnIiwKLQkJCSAgICAgYXR0ciwKLQkJCSAgICAgbmV3dG8tPnRwX25hbWUsCi0JCQkgICAgIG9sZHRvLT50cF9uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW5ld2Jhc2UgPSBuZXd0bzsKLQlvbGRiYXNlID0gb2xkdG87Ci0Jd2hpbGUgKGVxdWl2X3N0cnVjdHMobmV3YmFzZSwgbmV3YmFzZS0+dHBfYmFzZSkpCi0JCW5ld2Jhc2UgPSBuZXdiYXNlLT50cF9iYXNlOwotCXdoaWxlIChlcXVpdl9zdHJ1Y3RzKG9sZGJhc2UsIG9sZGJhc2UtPnRwX2Jhc2UpKQotCQlvbGRiYXNlID0gb2xkYmFzZS0+dHBfYmFzZTsKLQlpZiAobmV3YmFzZSAhPSBvbGRiYXNlICYmCi0JICAgIChuZXdiYXNlLT50cF9iYXNlICE9IG9sZGJhc2UtPnRwX2Jhc2UgfHwKLQkgICAgICFzYW1lX3Nsb3RzX2FkZGVkKG5ld2Jhc2UsIG9sZGJhc2UpKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJXMgYXNzaWdubWVudDogIgotCQkJICAgICAiJyVzJyBvYmplY3QgbGF5b3V0IGRpZmZlcnMgZnJvbSAnJXMnIiwKLQkJCSAgICAgYXR0ciwKLQkJCSAgICAgbmV3dG8tPnRwX25hbWUsCi0JCQkgICAgIG9sZHRvLT50cF9uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChuZXd0by0+dHBfZGVhbGxvYyAhPSBvbGR0by0+dHBfZGVhbGxvYyB8fAorICAgICAgICBuZXd0by0+dHBfZnJlZSAhPSBvbGR0by0+dHBfZnJlZSkKKyAgICB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMgYXNzaWdubWVudDogIgorICAgICAgICAgICAgICAgICAgICAgIiclcycgZGVhbGxvY2F0b3IgZGlmZmVycyBmcm9tICclcyciLAorICAgICAgICAgICAgICAgICAgICAgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgIG5ld3RvLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgb2xkdG8tPnRwX25hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbmV3YmFzZSA9IG5ld3RvOworICAgIG9sZGJhc2UgPSBvbGR0bzsKKyAgICB3aGlsZSAoZXF1aXZfc3RydWN0cyhuZXdiYXNlLCBuZXdiYXNlLT50cF9iYXNlKSkKKyAgICAgICAgbmV3YmFzZSA9IG5ld2Jhc2UtPnRwX2Jhc2U7CisgICAgd2hpbGUgKGVxdWl2X3N0cnVjdHMob2xkYmFzZSwgb2xkYmFzZS0+dHBfYmFzZSkpCisgICAgICAgIG9sZGJhc2UgPSBvbGRiYXNlLT50cF9iYXNlOworICAgIGlmIChuZXdiYXNlICE9IG9sZGJhc2UgJiYKKyAgICAgICAgKG5ld2Jhc2UtPnRwX2Jhc2UgIT0gb2xkYmFzZS0+dHBfYmFzZSB8fAorICAgICAgICAgIXNhbWVfc2xvdHNfYWRkZWQobmV3YmFzZSwgb2xkYmFzZSkpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMgYXNzaWdubWVudDogIgorICAgICAgICAgICAgICAgICAgICAgIiclcycgb2JqZWN0IGxheW91dCBkaWZmZXJzIGZyb20gJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgbmV3dG8tPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBvbGR0by0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBvYmplY3Rfc2V0X2NsYXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlUeXBlT2JqZWN0ICpvbGR0byA9IFB5X1RZUEUoc2VsZik7Ci0JUHlUeXBlT2JqZWN0ICpuZXd0bzsKKyAgICBQeVR5cGVPYmplY3QgKm9sZHRvID0gUHlfVFlQRShzZWxmKTsKKyAgICBQeVR5cGVPYmplY3QgKm5ld3RvOwogCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY2FuJ3QgZGVsZXRlIF9fY2xhc3NfXyBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIVB5VHlwZV9DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAiX19jbGFzc19fIG11c3QgYmUgc2V0IHRvIG5ldy1zdHlsZSBjbGFzcywgbm90ICclcycgb2JqZWN0IiwKLQkJICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbmV3dG8gPSAoUHlUeXBlT2JqZWN0ICopdmFsdWU7Ci0JaWYgKCEobmV3dG8tPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgfHwKLQkgICAgIShvbGR0by0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKLQl7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJfX2NsYXNzX18gYXNzaWdubWVudDogb25seSBmb3IgaGVhcCB0eXBlcyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KG5ld3RvLCBvbGR0bywgIl9fY2xhc3NfXyIpKSB7Ci0JCVB5X0lOQ1JFRihuZXd0byk7Ci0JCVB5X1RZUEUoc2VsZikgPSBuZXd0bzsKLQkJUHlfREVDUkVGKG9sZHRvKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIF9fY2xhc3NfXyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5VHlwZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAiX19jbGFzc19fIG11c3QgYmUgc2V0IHRvIG5ldy1zdHlsZSBjbGFzcywgbm90ICclcycgb2JqZWN0IiwKKyAgICAgICAgICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbmV3dG8gPSAoUHlUeXBlT2JqZWN0ICopdmFsdWU7CisgICAgaWYgKCEobmV3dG8tPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgfHwKKyAgICAgICAgIShvbGR0by0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKKyAgICB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19jbGFzc19fIGFzc2lnbm1lbnQ6IG9ubHkgZm9yIGhlYXAgdHlwZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChuZXd0bywgb2xkdG8sICJfX2NsYXNzX18iKSkgeworICAgICAgICBQeV9JTkNSRUYobmV3dG8pOworICAgICAgICBQeV9UWVBFKHNlbGYpID0gbmV3dG87CisgICAgICAgIFB5X0RFQ1JFRihvbGR0byk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIG9iamVjdF9nZXRzZXRzW10gPSB7Ci0JeyJfX2NsYXNzX18iLCBvYmplY3RfZ2V0X2NsYXNzLCBvYmplY3Rfc2V0X2NsYXNzLAotCSBQeURvY19TVFIoInRoZSBvYmplY3QncyBjbGFzcyIpfSwKLQl7MH0KKyAgICB7Il9fY2xhc3NfXyIsIG9iamVjdF9nZXRfY2xhc3MsIG9iamVjdF9zZXRfY2xhc3MsCisgICAgIFB5RG9jX1NUUigidGhlIG9iamVjdCdzIGNsYXNzIil9LAorICAgIHswfQogfTsKIAogCkBAIC0zMTEwLDE5MCArMzExMCwxOTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBvcnRfY29weXJlZyh2b2lkKQogewotCXN0YXRpYyBQeU9iamVjdCAqY29weXJlZ19zdHI7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjb3B5cmVnX3N0cjsKIAotCWlmICghY29weXJlZ19zdHIpIHsKLQkJY29weXJlZ19zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJjb3B5X3JlZyIpOwotCQlpZiAoY29weXJlZ19zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIWNvcHlyZWdfc3RyKSB7CisgICAgICAgIGNvcHlyZWdfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiY29weV9yZWciKTsKKyAgICAgICAgaWYgKGNvcHlyZWdfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlJbXBvcnRfSW1wb3J0KGNvcHlyZWdfc3RyKTsKKyAgICByZXR1cm4gUHlJbXBvcnRfSW1wb3J0KGNvcHlyZWdfc3RyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3RuYW1lcyhQeU9iamVjdCAqY2xzKQogewotCVB5T2JqZWN0ICpjbHNkaWN0OwotCVB5T2JqZWN0ICpjb3B5cmVnOwotCVB5T2JqZWN0ICpzbG90bmFtZXM7CisgICAgUHlPYmplY3QgKmNsc2RpY3Q7CisgICAgUHlPYmplY3QgKmNvcHlyZWc7CisgICAgUHlPYmplY3QgKnNsb3RuYW1lczsKIAotCWlmICghUHlUeXBlX0NoZWNrKGNscykpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgaWYgKCFQeVR5cGVfQ2hlY2soY2xzKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIAotCWNsc2RpY3QgPSAoKFB5VHlwZU9iamVjdCAqKWNscyktPnRwX2RpY3Q7Ci0Jc2xvdG5hbWVzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoY2xzZGljdCwgIl9fc2xvdG5hbWVzX18iKTsKLQlpZiAoc2xvdG5hbWVzICE9IE5VTEwgJiYgUHlMaXN0X0NoZWNrKHNsb3RuYW1lcykpIHsKLQkJUHlfSU5DUkVGKHNsb3RuYW1lcyk7Ci0JCXJldHVybiBzbG90bmFtZXM7Ci0JfQorICAgIGNsc2RpY3QgPSAoKFB5VHlwZU9iamVjdCAqKWNscyktPnRwX2RpY3Q7CisgICAgc2xvdG5hbWVzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoY2xzZGljdCwgIl9fc2xvdG5hbWVzX18iKTsKKyAgICBpZiAoc2xvdG5hbWVzICE9IE5VTEwgJiYgUHlMaXN0X0NoZWNrKHNsb3RuYW1lcykpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNsb3RuYW1lcyk7CisgICAgICAgIHJldHVybiBzbG90bmFtZXM7CisgICAgfQogCi0JY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7Ci0JaWYgKGNvcHlyZWcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7CisgICAgaWYgKGNvcHlyZWcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzbG90bmFtZXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGNvcHlyZWcsICJfc2xvdG5hbWVzIiwgIk8iLCBjbHMpOwotCVB5X0RFQ1JFRihjb3B5cmVnKTsKLQlpZiAoc2xvdG5hbWVzICE9IE5VTEwgJiYKLQkgICAgc2xvdG5hbWVzICE9IFB5X05vbmUgJiYKLQkgICAgIVB5TGlzdF9DaGVjayhzbG90bmFtZXMpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJjb3B5X3JlZy5fc2xvdG5hbWVzIGRpZG4ndCByZXR1cm4gYSBsaXN0IG9yIE5vbmUiKTsKLQkJUHlfREVDUkVGKHNsb3RuYW1lcyk7Ci0JCXNsb3RuYW1lcyA9IE5VTEw7Ci0JfQorICAgIHNsb3RuYW1lcyA9IFB5T2JqZWN0X0NhbGxNZXRob2QoY29weXJlZywgIl9zbG90bmFtZXMiLCAiTyIsIGNscyk7CisgICAgUHlfREVDUkVGKGNvcHlyZWcpOworICAgIGlmIChzbG90bmFtZXMgIT0gTlVMTCAmJgorICAgICAgICBzbG90bmFtZXMgIT0gUHlfTm9uZSAmJgorICAgICAgICAhUHlMaXN0X0NoZWNrKHNsb3RuYW1lcykpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImNvcHlfcmVnLl9zbG90bmFtZXMgZGlkbid0IHJldHVybiBhIGxpc3Qgb3IgTm9uZSIpOworICAgICAgICBQeV9ERUNSRUYoc2xvdG5hbWVzKTsKKyAgICAgICAgc2xvdG5hbWVzID0gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gc2xvdG5hbWVzOworICAgIHJldHVybiBzbG90bmFtZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZWR1Y2VfMihQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0ICpjbHMsICpnZXRuZXdhcmdzOwotCVB5T2JqZWN0ICphcmdzID0gTlVMTCwgKmFyZ3MyID0gTlVMTDsKLQlQeU9iamVjdCAqZ2V0c3RhdGUgPSBOVUxMLCAqc3RhdGUgPSBOVUxMLCAqbmFtZXMgPSBOVUxMOwotCVB5T2JqZWN0ICpzbG90cyA9IE5VTEwsICpsaXN0aXRlbXMgPSBOVUxMLCAqZGljdGl0ZW1zID0gTlVMTDsKLQlQeU9iamVjdCAqY29weXJlZyA9IE5VTEwsICpuZXdvYmogPSBOVUxMLCAqcmVzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKmNscywgKmdldG5ld2FyZ3M7CisgICAgUHlPYmplY3QgKmFyZ3MgPSBOVUxMLCAqYXJnczIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpnZXRzdGF0ZSA9IE5VTEwsICpzdGF0ZSA9IE5VTEwsICpuYW1lcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnNsb3RzID0gTlVMTCwgKmxpc3RpdGVtcyA9IE5VTEwsICpkaWN0aXRlbXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpjb3B5cmVnID0gTlVMTCwgKm5ld29iaiA9IE5VTEwsICpyZXMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWNscyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19jbGFzc19fIik7Ci0JaWYgKGNscyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjbHMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fY2xhc3NfXyIpOworICAgIGlmIChjbHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlnZXRuZXdhcmdzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2dldG5ld2FyZ3NfXyIpOwotCWlmIChnZXRuZXdhcmdzICE9IE5VTEwpIHsKLQkJYXJncyA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZ2V0bmV3YXJncywgTlVMTCk7Ci0JCVB5X0RFQ1JFRihnZXRuZXdhcmdzKTsKLQkJaWYgKGFyZ3MgIT0gTlVMTCAmJiAhUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19nZXRuZXdhcmdzX18gc2hvdWxkIHJldHVybiBhIHR1cGxlLCAiCi0JCQkJIm5vdCAnJS4yMDBzJyIsIFB5X1RZUEUoYXJncyktPnRwX25hbWUpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQl9Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJZ290byBlbmQ7CisgICAgZ2V0bmV3YXJncyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19nZXRuZXdhcmdzX18iKTsKKyAgICBpZiAoZ2V0bmV3YXJncyAhPSBOVUxMKSB7CisgICAgICAgIGFyZ3MgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGdldG5ld2FyZ3MsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZ2V0bmV3YXJncyk7CisgICAgICAgIGlmIChhcmdzICE9IE5VTEwgJiYgIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIl9fZ2V0bmV3YXJnc19fIHNob3VsZCByZXR1cm4gYSB0dXBsZSwgIgorICAgICAgICAgICAgICAgICJub3QgJyUuMjAwcyciLCBQeV9UWVBFKGFyZ3MpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgfQorICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIGdvdG8gZW5kOwogCi0JZ2V0c3RhdGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fZ2V0c3RhdGVfXyIpOwotCWlmIChnZXRzdGF0ZSAhPSBOVUxMKSB7Ci0JCXN0YXRlID0gUHlPYmplY3RfQ2FsbE9iamVjdChnZXRzdGF0ZSwgTlVMTCk7Ci0JCVB5X0RFQ1JFRihnZXRzdGF0ZSk7Ci0JCWlmIChzdGF0ZSA9PSBOVUxMKQotCQkJZ290byBlbmQ7Ci0JfQotCWVsc2UgewotCQlQeUVycl9DbGVhcigpOwotCQlzdGF0ZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19kaWN0X18iKTsKLQkJaWYgKHN0YXRlID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlzdGF0ZSA9IFB5X05vbmU7Ci0JCQlQeV9JTkNSRUYoc3RhdGUpOwotCQl9Ci0JCW5hbWVzID0gc2xvdG5hbWVzKGNscyk7Ci0JCWlmIChuYW1lcyA9PSBOVUxMKQotCQkJZ290byBlbmQ7Ci0JCWlmIChuYW1lcyAhPSBQeV9Ob25lKSB7Ci0JCQlhc3NlcnQoUHlMaXN0X0NoZWNrKG5hbWVzKSk7Ci0JCQlzbG90cyA9IFB5RGljdF9OZXcoKTsKLQkJCWlmIChzbG90cyA9PSBOVUxMKQotCQkJCWdvdG8gZW5kOwotCQkJbiA9IDA7Ci0JCQkvKiBDYW4ndCBwcmUtY29tcHV0ZSB0aGUgbGlzdCBzaXplOyB0aGUgbGlzdAotCQkJICAgaXMgc3RvcmVkIG9uIHRoZSBjbGFzcyBzbyBhY2Nlc3NpYmxlIHRvIG90aGVyCi0JCQkgICB0aHJlYWRzLCB3aGljaCBtYXkgYmUgcnVuIGJ5IERFQ1JFRiAqLwotCQkJZm9yIChpID0gMDsgaSA8IFB5TGlzdF9HRVRfU0laRShuYW1lcyk7IGkrKykgewotCQkJCVB5T2JqZWN0ICpuYW1lLCAqdmFsdWU7Ci0JCQkJbmFtZSA9IFB5TGlzdF9HRVRfSVRFTShuYW1lcywgaSk7Ci0JCQkJdmFsdWUgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgbmFtZSk7Ci0JCQkJaWYgKHZhbHVlID09IE5VTEwpCi0JCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBlcnIgPSBQeURpY3RfU2V0SXRlbShzbG90cywgbmFtZSwKLQkJCQkJCQkJIHZhbHVlKTsKLQkJCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCQkJaWYgKGVycikKLQkJCQkJCWdvdG8gZW5kOwotCQkJCQluKys7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG4pIHsKLQkJCQlzdGF0ZSA9IFB5X0J1aWxkVmFsdWUoIihOTykiLCBzdGF0ZSwgc2xvdHMpOwotCQkJCWlmIChzdGF0ZSA9PSBOVUxMKQotCQkJCQlnb3RvIGVuZDsKLQkJCX0KLQkJfQotCX0KKyAgICBnZXRzdGF0ZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19nZXRzdGF0ZV9fIik7CisgICAgaWYgKGdldHN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdGUgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGdldHN0YXRlLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGdldHN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHN0YXRlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2RpY3RfXyIpOworICAgICAgICBpZiAoc3RhdGUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHN0YXRlID0gUHlfTm9uZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbmFtZXMgPSBzbG90bmFtZXMoY2xzKTsKKyAgICAgICAgaWYgKG5hbWVzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgaWYgKG5hbWVzICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGFzc2VydChQeUxpc3RfQ2hlY2sobmFtZXMpKTsKKyAgICAgICAgICAgIHNsb3RzID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKHNsb3RzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgICAgIC8qIENhbid0IHByZS1jb21wdXRlIHRoZSBsaXN0IHNpemU7IHRoZSBsaXN0CisgICAgICAgICAgICAgICBpcyBzdG9yZWQgb24gdGhlIGNsYXNzIHNvIGFjY2Vzc2libGUgdG8gb3RoZXIKKyAgICAgICAgICAgICAgIHRocmVhZHMsIHdoaWNoIG1heSBiZSBydW4gYnkgREVDUkVGICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X0dFVF9TSVpFKG5hbWVzKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUsICp2YWx1ZTsKKyAgICAgICAgICAgICAgICBuYW1lID0gUHlMaXN0X0dFVF9JVEVNKG5hbWVzLCBpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IFB5RGljdF9TZXRJdGVtKHNsb3RzLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobikgeworICAgICAgICAgICAgICAgIHN0YXRlID0gUHlfQnVpbGRWYWx1ZSgiKE5PKSIsIHN0YXRlLCBzbG90cyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKCFQeUxpc3RfQ2hlY2sob2JqKSkgewotCQlsaXN0aXRlbXMgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYobGlzdGl0ZW1zKTsKLQl9Ci0JZWxzZSB7Ci0JCWxpc3RpdGVtcyA9IFB5T2JqZWN0X0dldEl0ZXIob2JqKTsKLQkJaWYgKGxpc3RpdGVtcyA9PSBOVUxMKQotCQkJZ290byBlbmQ7Ci0JfQorICAgIGlmICghUHlMaXN0X0NoZWNrKG9iaikpIHsKKyAgICAgICAgbGlzdGl0ZW1zID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGxpc3RpdGVtcyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsaXN0aXRlbXMgPSBQeU9iamVjdF9HZXRJdGVyKG9iaik7CisgICAgICAgIGlmIChsaXN0aXRlbXMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgIH0KIAotCWlmICghUHlEaWN0X0NoZWNrKG9iaikpIHsKLQkJZGljdGl0ZW1zID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKGRpY3RpdGVtcyk7Ci0JfQotCWVsc2UgewotCQlkaWN0aXRlbXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG9iaiwgIml0ZXJpdGVtcyIsICIiKTsKLQkJaWYgKGRpY3RpdGVtcyA9PSBOVUxMKQotCQkJZ290byBlbmQ7Ci0JfQorICAgIGlmICghUHlEaWN0X0NoZWNrKG9iaikpIHsKKyAgICAgICAgZGljdGl0ZW1zID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGRpY3RpdGVtcyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkaWN0aXRlbXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG9iaiwgIml0ZXJpdGVtcyIsICIiKTsKKyAgICAgICAgaWYgKGRpY3RpdGVtcyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgfQogCi0JY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7Ci0JaWYgKGNvcHlyZWcgPT0gTlVMTCkKLQkJZ290byBlbmQ7Ci0JbmV3b2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb3B5cmVnLCAiX19uZXdvYmpfXyIpOwotCWlmIChuZXdvYmogPT0gTlVMTCkKLQkJZ290byBlbmQ7CisgICAgY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7CisgICAgaWYgKGNvcHlyZWcgPT0gTlVMTCkKKyAgICAgICAgZ290byBlbmQ7CisgICAgbmV3b2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb3B5cmVnLCAiX19uZXdvYmpfXyIpOworICAgIGlmIChuZXdvYmogPT0gTlVMTCkKKyAgICAgICAgZ290byBlbmQ7CiAKLQluID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQlhcmdzMiA9IFB5VHVwbGVfTmV3KG4rMSk7Ci0JaWYgKGFyZ3MyID09IE5VTEwpCi0JCWdvdG8gZW5kOwotCVB5VHVwbGVfU0VUX0lURU0oYXJnczIsIDAsIGNscyk7Ci0JY2xzID0gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJUHlfSU5DUkVGKHYpOwotCQlQeVR1cGxlX1NFVF9JVEVNKGFyZ3MyLCBpKzEsIHYpOwotCX0KKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBhcmdzMiA9IFB5VHVwbGVfTmV3KG4rMSk7CisgICAgaWYgKGFyZ3MyID09IE5VTEwpCisgICAgICAgIGdvdG8gZW5kOworICAgIFB5VHVwbGVfU0VUX0lURU0oYXJnczIsIDAsIGNscyk7CisgICAgY2xzID0gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MyLCBpKzEsIHYpOworICAgIH0KIAotCXJlcyA9IFB5VHVwbGVfUGFjayg1LCBuZXdvYmosIGFyZ3MyLCBzdGF0ZSwgbGlzdGl0ZW1zLCBkaWN0aXRlbXMpOworICAgIHJlcyA9IFB5VHVwbGVfUGFjayg1LCBuZXdvYmosIGFyZ3MyLCBzdGF0ZSwgbGlzdGl0ZW1zLCBkaWN0aXRlbXMpOwogCiAgIGVuZDoKLQlQeV9YREVDUkVGKGNscyk7Ci0JUHlfWERFQ1JFRihhcmdzKTsKLQlQeV9YREVDUkVGKGFyZ3MyKTsKLQlQeV9YREVDUkVGKHNsb3RzKTsKLQlQeV9YREVDUkVGKHN0YXRlKTsKLQlQeV9YREVDUkVGKG5hbWVzKTsKLQlQeV9YREVDUkVGKGxpc3RpdGVtcyk7Ci0JUHlfWERFQ1JFRihkaWN0aXRlbXMpOwotCVB5X1hERUNSRUYoY29weXJlZyk7Ci0JUHlfWERFQ1JFRihuZXdvYmopOwotCXJldHVybiByZXM7CisgICAgUHlfWERFQ1JFRihjbHMpOworICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgUHlfWERFQ1JFRihhcmdzMik7CisgICAgUHlfWERFQ1JFRihzbG90cyk7CisgICAgUHlfWERFQ1JFRihzdGF0ZSk7CisgICAgUHlfWERFQ1JFRihuYW1lcyk7CisgICAgUHlfWERFQ1JFRihsaXN0aXRlbXMpOworICAgIFB5X1hERUNSRUYoZGljdGl0ZW1zKTsKKyAgICBQeV9YREVDUkVGKGNvcHlyZWcpOworICAgIFB5X1hERUNSRUYobmV3b2JqKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAvKgpAQCAtMzMxNCw3OSArMzMxNCw3OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb21tb25fcmVkdWNlKFB5T2JqZWN0ICpzZWxmLCBpbnQgcHJvdG8pCiB7Ci0JUHlPYmplY3QgKmNvcHlyZWcsICpyZXM7CisgICAgUHlPYmplY3QgKmNvcHlyZWcsICpyZXM7CiAKLQlpZiAocHJvdG8gPj0gMikKLQkJcmV0dXJuIHJlZHVjZV8yKHNlbGYpOworICAgIGlmIChwcm90byA+PSAyKQorICAgICAgICByZXR1cm4gcmVkdWNlXzIoc2VsZik7CiAKLQljb3B5cmVnID0gaW1wb3J0X2NvcHlyZWcoKTsKLQlpZiAoIWNvcHlyZWcpCi0JCXJldHVybiBOVUxMOworICAgIGNvcHlyZWcgPSBpbXBvcnRfY29weXJlZygpOworICAgIGlmICghY29weXJlZykKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXMgPSBQeUV2YWxfQ2FsbE1ldGhvZChjb3B5cmVnLCAiX3JlZHVjZV9leCIsICIoT2kpIiwgc2VsZiwgcHJvdG8pOwotCVB5X0RFQ1JFRihjb3B5cmVnKTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE1ldGhvZChjb3B5cmVnLCAiX3JlZHVjZV9leCIsICIoT2kpIiwgc2VsZiwgcHJvdG8pOworICAgIFB5X0RFQ1JFRihjb3B5cmVnKTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9iamVjdF9yZWR1Y2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBwcm90byA9IDA7CisgICAgaW50IHByb3RvID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X19yZWR1Y2VfXyIsICZwcm90bykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X19yZWR1Y2VfXyIsICZwcm90bykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIF9jb21tb25fcmVkdWNlKHNlbGYsIHByb3RvKTsKKyAgICByZXR1cm4gX2NvbW1vbl9yZWR1Y2Uoc2VsZiwgcHJvdG8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb2JqZWN0X3JlZHVjZV9leChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJlZHVjZSwgKnJlczsKLQlpbnQgcHJvdG8gPSAwOworICAgIFB5T2JqZWN0ICpyZWR1Y2UsICpyZXM7CisgICAgaW50IHByb3RvID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X19yZWR1Y2VfZXhfXyIsICZwcm90bykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X19yZWR1Y2VfZXhfXyIsICZwcm90bykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVkdWNlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAiX19yZWR1Y2VfXyIpOwotCWlmIChyZWR1Y2UgPT0gTlVMTCkKLQkJUHlFcnJfQ2xlYXIoKTsKLQllbHNlIHsKLQkJUHlPYmplY3QgKmNscywgKmNsc3JlZHVjZSwgKm9ianJlZHVjZTsKLQkJaW50IG92ZXJyaWRlOwotCQljbHMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJfX2NsYXNzX18iKTsKLQkJaWYgKGNscyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVkdWNlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWNsc3JlZHVjZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY2xzLCAiX19yZWR1Y2VfXyIpOwotCQlQeV9ERUNSRUYoY2xzKTsKLQkJaWYgKGNsc3JlZHVjZSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVkdWNlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW9ianJlZHVjZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKFB5QmFzZU9iamVjdF9UeXBlLnRwX2RpY3QsCi0JCQkJCQkgIl9fcmVkdWNlX18iKTsKLQkJb3ZlcnJpZGUgPSAoY2xzcmVkdWNlICE9IG9ianJlZHVjZSk7Ci0JCVB5X0RFQ1JFRihjbHNyZWR1Y2UpOwotCQlpZiAob3ZlcnJpZGUpIHsKLQkJCXJlcyA9IFB5T2JqZWN0X0NhbGxPYmplY3QocmVkdWNlLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihyZWR1Y2UpOwotCQkJcmV0dXJuIHJlczsKLQkJfQotCQllbHNlCi0JCQlQeV9ERUNSRUYocmVkdWNlKTsKLQl9CisgICAgcmVkdWNlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAiX19yZWR1Y2VfXyIpOworICAgIGlmIChyZWR1Y2UgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKmNscywgKmNsc3JlZHVjZSwgKm9ianJlZHVjZTsKKyAgICAgICAgaW50IG92ZXJyaWRlOworICAgICAgICBjbHMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJfX2NsYXNzX18iKTsKKyAgICAgICAgaWYgKGNscyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVkdWNlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGNsc3JlZHVjZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY2xzLCAiX19yZWR1Y2VfXyIpOworICAgICAgICBQeV9ERUNSRUYoY2xzKTsKKyAgICAgICAgaWYgKGNsc3JlZHVjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVkdWNlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG9ianJlZHVjZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKFB5QmFzZU9iamVjdF9UeXBlLnRwX2RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX3JlZHVjZV9fIik7CisgICAgICAgIG92ZXJyaWRlID0gKGNsc3JlZHVjZSAhPSBvYmpyZWR1Y2UpOworICAgICAgICBQeV9ERUNSRUYoY2xzcmVkdWNlKTsKKyAgICAgICAgaWYgKG92ZXJyaWRlKSB7CisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHJlZHVjZSwgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVkdWNlKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfREVDUkVGKHJlZHVjZSk7CisgICAgfQogCi0JcmV0dXJuIF9jb21tb25fcmVkdWNlKHNlbGYsIHByb3RvKTsKKyAgICByZXR1cm4gX2NvbW1vbl9yZWR1Y2Uoc2VsZiwgcHJvdG8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb2JqZWN0X3N1YmNsYXNzaG9vayhQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKIH0KIAogUHlEb2NfU1RSVkFSKG9iamVjdF9zdWJjbGFzc2hvb2tfZG9jLApAQCAtMzQwMiwxNDEgKzM0MDIsMTQxIEBACiAKICAgIGNsYXNzIG9iamVjdDoKICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6Ci0gICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZm9ybWF0X3NwZWMsIHN0cik6Ci0gICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0KHN0cihzZWxmKSwgZm9ybWF0X3NwZWMpCi0gICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShmb3JtYXRfc3BlYywgdW5pY29kZSk6Ci0gICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0KHVuaWNvZGUoc2VsZiksIGZvcm1hdF9zcGVjKQorICAgICAgIGlmIGlzaW5zdGFuY2UoZm9ybWF0X3NwZWMsIHN0cik6CisgICAgICAgICAgIHJldHVybiBmb3JtYXQoc3RyKHNlbGYpLCBmb3JtYXRfc3BlYykKKyAgICAgICBlbGlmIGlzaW5zdGFuY2UoZm9ybWF0X3NwZWMsIHVuaWNvZGUpOgorICAgICAgICAgICByZXR1cm4gZm9ybWF0KHVuaWNvZGUoc2VsZiksIGZvcm1hdF9zcGVjKQogKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBvYmplY3RfZm9ybWF0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjOwotICAgICAgICBQeU9iamVjdCAqc2VsZl9hc19zdHIgPSBOVUxMOwotICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLSAgICAgICAgUHlPYmplY3QgKmZvcm1hdF9tZXRoID0gTlVMTDsKLSAgICAgICAgUHlfc3NpemVfdCBmb3JtYXRfbGVuOworICAgIFB5T2JqZWN0ICpmb3JtYXRfc3BlYzsKKyAgICBQeU9iamVjdCAqc2VsZl9hc19zdHIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmb3JtYXRfbWV0aCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBmb3JtYXRfbGVuOwogCi0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdF9zcGVjKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19mb3JtYXRfXyIsICZmb3JtYXRfc3BlYykpCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkgewotCSAgICAgICAgZm9ybWF0X2xlbiA9IFB5VW5pY29kZV9HRVRfU0laRShmb3JtYXRfc3BlYyk7Ci0JICAgICAgICBzZWxmX2FzX3N0ciA9IFB5T2JqZWN0X1VuaWNvZGUoc2VsZik7Ci0JfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhmb3JtYXRfc3BlYykpIHsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkgeworICAgICAgICBmb3JtYXRfbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKGZvcm1hdF9zcGVjKTsKKyAgICAgICAgc2VsZl9hc19zdHIgPSBQeU9iamVjdF9Vbmljb2RlKHNlbGYpOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soZm9ybWF0X3NwZWMpKSB7CiAjZWxzZQotICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZm9ybWF0X3NwZWMpKSB7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGZvcm1hdF9zcGVjKSkgewogI2VuZGlmCi0JICAgICAgICBmb3JtYXRfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZm9ybWF0X3NwZWMpOwotCSAgICAgICAgc2VsZl9hc19zdHIgPSBQeU9iamVjdF9TdHIoc2VsZik7Ci0JfSBlbHNlIHsKLQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IHRvIF9fZm9ybWF0X18gbXVzdCBiZSB1bmljb2RlIG9yIHN0ciIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBmb3JtYXRfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZm9ybWF0X3NwZWMpOworICAgICAgICBzZWxmX2FzX3N0ciA9IFB5T2JqZWN0X1N0cihzZWxmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiYXJndW1lbnQgdG8gX19mb3JtYXRfXyBtdXN0IGJlIHVuaWNvZGUgb3Igc3RyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgICAgICBpZiAoc2VsZl9hc19zdHIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIElzc3VlIDc5OTQ6IElmIHdlJ3JlIGNvbnZlcnRpbmcgdG8gYSBzdHJpbmcsIHdlCi0gICAgICAgICAgICAgICAgICAgc2hvdWxkIHJlamVjdCBmb3JtYXQgc3BlY2lmaWNhdGlvbnMgKi8KLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0X2xlbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QuX19mb3JtYXRfXyB3aXRoIGEgbm9uLWVtcHR5IGZvcm1hdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyBpcyBkZXByZWNhdGVkIiwgMSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEV2ZW50dWFsbHkgdGhpcyB3aWxsIGJlY29tZSBhbiBlcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1lbXB0eSBmb3JtYXQgc3RyaW5nIHBhc3NlZCB0byBvYmplY3QuX19mb3JtYXRfXyIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7Ci0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogZmluZCB0aGUgZm9ybWF0IGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgZm9ybWF0X21ldGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGZfYXNfc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19mb3JtYXRfXyIpOwotICAgICAgICAgICAgICAgIGlmIChmb3JtYXRfbWV0aCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBjYWxsIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZvcm1hdF9tZXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICAgICAgfQorICAgIGlmIChzZWxmX2FzX3N0ciAhPSBOVUxMKSB7CisgICAgICAgIC8qIElzc3VlIDc5OTQ6IElmIHdlJ3JlIGNvbnZlcnRpbmcgdG8gYSBzdHJpbmcsIHdlCisgICAgICAgICAgIHNob3VsZCByZWplY3QgZm9ybWF0IHNwZWNpZmljYXRpb25zICovCisgICAgICAgIGlmIChmb3JtYXRfbGVuID4gMCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICJvYmplY3QuX19mb3JtYXRfXyB3aXRoIGEgbm9uLWVtcHR5IGZvcm1hdCAiCisgICAgICAgICAgICAgInN0cmluZyBpcyBkZXByZWNhdGVkIiwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRXZlbnR1YWxseSB0aGlzIHdpbGwgYmVjb21lIGFuIGVycm9yOgorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICJub24tZW1wdHkgZm9ybWF0IHN0cmluZyBwYXNzZWQgdG8gb2JqZWN0Ll9fZm9ybWF0X18iKTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgICovCiAgICAgICAgIH0KIAotZG9uZToKLSAgICAgICAgUHlfWERFQ1JFRihzZWxmX2FzX3N0cik7Ci0gICAgICAgIFB5X1hERUNSRUYoZm9ybWF0X21ldGgpOworICAgICAgICAvKiBmaW5kIHRoZSBmb3JtYXQgZnVuY3Rpb24gKi8KKyAgICAgICAgZm9ybWF0X21ldGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGZfYXNfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fZm9ybWF0X18iKTsKKyAgICAgICAgaWYgKGZvcm1hdF9tZXRoICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgIC8qIGFuZCBjYWxsIGl0ICovCisgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZvcm1hdF9tZXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKK2RvbmU6CisgICAgUHlfWERFQ1JFRihzZWxmX2FzX3N0cik7CisgICAgUHlfWERFQ1JFRihmb3JtYXRfbWV0aCk7CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb2JqZWN0X3NpemVvZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCByZXMsIGlzaXplOworICAgIFB5X3NzaXplX3QgcmVzLCBpc2l6ZTsKIAotCXJlcyA9IDA7Ci0JaXNpemUgPSBzZWxmLT5vYl90eXBlLT50cF9pdGVtc2l6ZTsKLQlpZiAoaXNpemUgPiAwKQotCQlyZXMgPSBzZWxmLT5vYl90eXBlLT5vYl9zaXplICogaXNpemU7Ci0JcmVzICs9IHNlbGYtPm9iX3R5cGUtPnRwX2Jhc2ljc2l6ZTsKKyAgICByZXMgPSAwOworICAgIGlzaXplID0gc2VsZi0+b2JfdHlwZS0+dHBfaXRlbXNpemU7CisgICAgaWYgKGlzaXplID4gMCkKKyAgICAgICAgcmVzID0gc2VsZi0+b2JfdHlwZS0+b2Jfc2l6ZSAqIGlzaXplOworICAgIHJlcyArPSBzZWxmLT5vYl90eXBlLT50cF9iYXNpY3NpemU7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsJIAorICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgb2JqZWN0X21ldGhvZHNbXSA9IHsKLQl7Il9fcmVkdWNlX2V4X18iLCBvYmplY3RfcmVkdWNlX2V4LCBNRVRIX1ZBUkFSR1MsCi0JIFB5RG9jX1NUUigiaGVscGVyIGZvciBwaWNrbGUiKX0sCi0JeyJfX3JlZHVjZV9fIiwgb2JqZWN0X3JlZHVjZSwgTUVUSF9WQVJBUkdTLAotCSBQeURvY19TVFIoImhlbHBlciBmb3IgcGlja2xlIil9LAotCXsiX19zdWJjbGFzc2hvb2tfXyIsIG9iamVjdF9zdWJjbGFzc2hvb2ssIE1FVEhfQ0xBU1MgfCBNRVRIX1ZBUkFSR1MsCi0JIG9iamVjdF9zdWJjbGFzc2hvb2tfZG9jfSwKLSAgICAgICAgeyJfX2Zvcm1hdF9fIiwgb2JqZWN0X2Zvcm1hdCwgTUVUSF9WQVJBUkdTLAotICAgICAgICAgUHlEb2NfU1RSKCJkZWZhdWx0IG9iamVjdCBmb3JtYXR0ZXIiKX0sCi0gICAgICAgIHsiX19zaXplb2ZfXyIsIG9iamVjdF9zaXplb2YsIE1FVEhfTk9BUkdTLAotICAgICAgICAgUHlEb2NfU1RSKCJfX3NpemVvZl9fKCkgLT4gc2l6ZSBvZiBvYmplY3QgaW4gbWVtb3J5LCBpbiBieXRlcyIpfSwKLQl7MH0KKyAgICB7Il9fcmVkdWNlX2V4X18iLCBvYmplY3RfcmVkdWNlX2V4LCBNRVRIX1ZBUkFSR1MsCisgICAgIFB5RG9jX1NUUigiaGVscGVyIGZvciBwaWNrbGUiKX0sCisgICAgeyJfX3JlZHVjZV9fIiwgb2JqZWN0X3JlZHVjZSwgTUVUSF9WQVJBUkdTLAorICAgICBQeURvY19TVFIoImhlbHBlciBmb3IgcGlja2xlIil9LAorICAgIHsiX19zdWJjbGFzc2hvb2tfXyIsIG9iamVjdF9zdWJjbGFzc2hvb2ssIE1FVEhfQ0xBU1MgfCBNRVRIX1ZBUkFSR1MsCisgICAgIG9iamVjdF9zdWJjbGFzc2hvb2tfZG9jfSwKKyAgICB7Il9fZm9ybWF0X18iLCBvYmplY3RfZm9ybWF0LCBNRVRIX1ZBUkFSR1MsCisgICAgIFB5RG9jX1NUUigiZGVmYXVsdCBvYmplY3QgZm9ybWF0dGVyIil9LAorICAgIHsiX19zaXplb2ZfXyIsIG9iamVjdF9zaXplb2YsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIl9fc2l6ZW9mX18oKSAtPiBzaXplIG9mIG9iamVjdCBpbiBtZW1vcnksIGluIGJ5dGVzIil9LAorICAgIHswfQogfTsKIAogCiBQeVR5cGVPYmplY3QgUHlCYXNlT2JqZWN0X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkib2JqZWN0IiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0Jb2JqZWN0X2RlYWxsb2MsCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQlvYmplY3RfcmVwciwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylfUHlfSGFzaFBvaW50ZXIsCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQlvYmplY3Rfc3RyLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCVB5RG9jX1NUUigiVGhlIG1vc3QgYmFzZSB0eXBlIiksCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0Jb2JqZWN0X21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCW9iamVjdF9nZXRzZXRzLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCW9iamVjdF9pbml0LAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCW9iamVjdF9uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0RlbCwJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgIm9iamVjdCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5T2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgb2JqZWN0X2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIG9iamVjdF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylfUHlfSGFzaFBvaW50ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIG9iamVjdF9zdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgUHlEb2NfU1RSKCJUaGUgbW9zdCBiYXNlIHR5cGUiKSwgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIG9iamVjdF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIG9iamVjdF9nZXRzZXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIG9iamVjdF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBvYmplY3RfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC0zNTQ1LDc3ICszNTQ1LDc3IEBACiBzdGF0aWMgaW50CiBhZGRfbWV0aG9kcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5TWV0aG9kRGVmICptZXRoKQogewotCVB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKKyAgICBQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CiAKLQlmb3IgKDsgbWV0aC0+bWxfbmFtZSAhPSBOVUxMOyBtZXRoKyspIHsKLQkJUHlPYmplY3QgKmRlc2NyOwotCQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgbWV0aC0+bWxfbmFtZSkgJiYKLQkJCSEobWV0aC0+bWxfZmxhZ3MgJiBNRVRIX0NPRVhJU1QpKQotCQkJCWNvbnRpbnVlOwotCQlpZiAobWV0aC0+bWxfZmxhZ3MgJiBNRVRIX0NMQVNTKSB7Ci0JCQlpZiAobWV0aC0+bWxfZmxhZ3MgJiBNRVRIX1NUQVRJQykgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAgIm1ldGhvZCBjYW5ub3QgYmUgYm90aCBjbGFzcyBhbmQgc3RhdGljIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZGVzY3IgPSBQeURlc2NyX05ld0NsYXNzTWV0aG9kKHR5cGUsIG1ldGgpOwotCQl9Ci0JCWVsc2UgaWYgKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9TVEFUSUMpIHsKLQkJCVB5T2JqZWN0ICpjZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyhtZXRoLCBOVUxMKTsKLQkJCWlmIChjZnVuYyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCWRlc2NyID0gUHlTdGF0aWNNZXRob2RfTmV3KGNmdW5jKTsKLQkJCVB5X0RFQ1JFRihjZnVuYyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZXNjciA9IFB5RGVzY3JfTmV3TWV0aG9kKHR5cGUsIG1ldGgpOwotCQl9Ci0JCWlmIChkZXNjciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbWV0aC0+bWxfbmFtZSwgZGVzY3IpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGRlc2NyKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgZm9yICg7IG1ldGgtPm1sX25hbWUgIT0gTlVMTDsgbWV0aCsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpkZXNjcjsKKyAgICAgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIG1ldGgtPm1sX25hbWUpICYmCisgICAgICAgICAgICAhKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9DT0VYSVNUKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9DTEFTUykgeworICAgICAgICAgICAgaWYgKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9TVEFUSUMpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJtZXRob2QgY2Fubm90IGJlIGJvdGggY2xhc3MgYW5kIHN0YXRpYyIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2NyID0gUHlEZXNjcl9OZXdDbGFzc01ldGhvZCh0eXBlLCBtZXRoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtZXRoLT5tbF9mbGFncyAmIE1FVEhfU1RBVElDKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqY2Z1bmMgPSBQeUNGdW5jdGlvbl9OZXcobWV0aCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoY2Z1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBkZXNjciA9IFB5U3RhdGljTWV0aG9kX05ldyhjZnVuYyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2Z1bmMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZGVzY3IgPSBQeURlc2NyX05ld01ldGhvZCh0eXBlLCBtZXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG1ldGgtPm1sX25hbWUsIGRlc2NyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBhZGRfbWVtYmVycyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5TWVtYmVyRGVmICptZW1iKQogewotCVB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKKyAgICBQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CiAKLQlmb3IgKDsgbWVtYi0+bmFtZSAhPSBOVUxMOyBtZW1iKyspIHsKLQkJUHlPYmplY3QgKmRlc2NyOwotCQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgbWVtYi0+bmFtZSkpCi0JCQljb250aW51ZTsKLQkJZGVzY3IgPSBQeURlc2NyX05ld01lbWJlcih0eXBlLCBtZW1iKTsKLQkJaWYgKGRlc2NyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBtZW1iLT5uYW1lLCBkZXNjcikgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYoZGVzY3IpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBmb3IgKDsgbWVtYi0+bmFtZSAhPSBOVUxMOyBtZW1iKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmRlc2NyOworICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgbWVtYi0+bmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZGVzY3IgPSBQeURlc2NyX05ld01lbWJlcih0eXBlLCBtZW1iKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBtZW1iLT5uYW1lLCBkZXNjcikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogYWRkX2dldHNldChQeVR5cGVPYmplY3QgKnR5cGUsIFB5R2V0U2V0RGVmICpnc3ApCiB7Ci0JUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OworICAgIFB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKIAotCWZvciAoOyBnc3AtPm5hbWUgIT0gTlVMTDsgZ3NwKyspIHsKLQkJUHlPYmplY3QgKmRlc2NyOwotCQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgZ3NwLT5uYW1lKSkKLQkJCWNvbnRpbnVlOwotCQlkZXNjciA9IFB5RGVzY3JfTmV3R2V0U2V0KHR5cGUsIGdzcCk7CisgICAgZm9yICg7IGdzcC0+bmFtZSAhPSBOVUxMOyBnc3ArKykgeworICAgICAgICBQeU9iamVjdCAqZGVzY3I7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCBnc3AtPm5hbWUpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRlc2NyID0gUHlEZXNjcl9OZXdHZXRTZXQodHlwZSwgZ3NwKTsKIAotCQlpZiAoZGVzY3IgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIGdzcC0+bmFtZSwgZGVzY3IpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGRlc2NyKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGlmIChkZXNjciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgZ3NwLT5uYW1lLCBkZXNjcikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogI2RlZmluZSBCVUZGRVJfRkxBR1MgKFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUikKQEAgLTM2MjMsMTE0ICszNjIzLDExNCBAQAogc3RhdGljIHZvaWQKIGluaGVyaXRfc3BlY2lhbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5VHlwZU9iamVjdCAqYmFzZSkKIHsKLQlQeV9zc2l6ZV90IG9sZHNpemUsIG5ld3NpemU7CisgICAgUHlfc3NpemVfdCBvbGRzaXplLCBuZXdzaXplOwogCi0JLyogU3BlY2lhbCBmbGFnIG1hZ2ljICovCi0JaWYgKCF0eXBlLT50cF9hc19idWZmZXIgJiYgYmFzZS0+dHBfYXNfYnVmZmVyKSB7Ci0JCXR5cGUtPnRwX2ZsYWdzICY9IH5CVUZGRVJfRkxBR1M7Ci0JCXR5cGUtPnRwX2ZsYWdzIHw9Ci0JCQliYXNlLT50cF9mbGFncyAmIEJVRkZFUl9GTEFHUzsKLQl9Ci0JaWYgKCF0eXBlLT50cF9hc19zZXF1ZW5jZSAmJiBiYXNlLT50cF9hc19zZXF1ZW5jZSkgewotCQl0eXBlLT50cF9mbGFncyAmPSB+UHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOOwotCQl0eXBlLT50cF9mbGFncyB8PSBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTjsKLQl9Ci0JaWYgKCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTKSAhPQotCSAgICAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUykpIHsKLQkJaWYgKCghdHlwZS0+dHBfYXNfbnVtYmVyICYmIGJhc2UtPnRwX2FzX251bWJlcikgfHwKLQkJICAgICghdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYgYmFzZS0+dHBfYXNfc2VxdWVuY2UpKSB7Ci0JCQl0eXBlLT50cF9mbGFncyAmPSB+UHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFM7Ci0JCQlpZiAoIXR5cGUtPnRwX2FzX251bWJlciAmJiAhdHlwZS0+dHBfYXNfc2VxdWVuY2UpIHsKLQkJCQl0eXBlLT50cF9mbGFncyB8PSBiYXNlLT50cF9mbGFncyAmCi0JCQkJCVB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTOwotCQkJfQotCQl9Ci0JCS8qIFdvdyAqLwotCX0KLQlpZiAoIXR5cGUtPnRwX2FzX251bWJlciAmJiBiYXNlLT50cF9hc19udW1iZXIpIHsKLQkJdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfQ0hFQ0tUWVBFUzsKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0NIRUNLVFlQRVM7Ci0JfQorICAgIC8qIFNwZWNpYWwgZmxhZyBtYWdpYyAqLworICAgIGlmICghdHlwZS0+dHBfYXNfYnVmZmVyICYmIGJhc2UtPnRwX2FzX2J1ZmZlcikgeworICAgICAgICB0eXBlLT50cF9mbGFncyAmPSB+QlVGRkVSX0ZMQUdTOworICAgICAgICB0eXBlLT50cF9mbGFncyB8PQorICAgICAgICAgICAgYmFzZS0+dHBfZmxhZ3MgJiBCVUZGRVJfRkxBR1M7CisgICAgfQorICAgIGlmICghdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYgYmFzZS0+dHBfYXNfc2VxdWVuY2UpIHsKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTjsKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfU0VRVUVOQ0VfSU47CisgICAgfQorICAgIGlmICgodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUykgIT0KKyAgICAgICAgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFMpKSB7CisgICAgICAgIGlmICgoIXR5cGUtPnRwX2FzX251bWJlciAmJiBiYXNlLT50cF9hc19udW1iZXIpIHx8CisgICAgICAgICAgICAoIXR5cGUtPnRwX2FzX3NlcXVlbmNlICYmIGJhc2UtPnRwX2FzX3NlcXVlbmNlKSkgeworICAgICAgICAgICAgdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTOworICAgICAgICAgICAgaWYgKCF0eXBlLT50cF9hc19udW1iZXIgJiYgIXR5cGUtPnRwX2FzX3NlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gYmFzZS0+dHBfZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBXb3cgKi8KKyAgICB9CisgICAgaWYgKCF0eXBlLT50cF9hc19udW1iZXIgJiYgYmFzZS0+dHBfYXNfbnVtYmVyKSB7CisgICAgICAgIHR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0NIRUNLVFlQRVM7CisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19DSEVDS1RZUEVTOworICAgIH0KIAotCS8qIENvcHlpbmcgYmFzaWNzaXplIGlzIGNvbm5lY3RlZCB0byB0aGUgR0MgZmxhZ3MgKi8KLQlvbGRzaXplID0gYmFzZS0+dHBfYmFzaWNzaXplOwotCW5ld3NpemUgPSB0eXBlLT50cF9iYXNpY3NpemUgPyB0eXBlLT50cF9iYXNpY3NpemUgOiBvbGRzaXplOwotCWlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSAmJgotCSAgICAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpICYmCi0JICAgICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRS8qR0Mgc2xvdHMgZXhpc3QqLykgJiYKLQkgICAgKCF0eXBlLT50cF90cmF2ZXJzZSAmJiAhdHlwZS0+dHBfY2xlYXIpKSB7Ci0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSEFWRV9HQzsKLQkJaWYgKHR5cGUtPnRwX3RyYXZlcnNlID09IE5VTEwpCi0JCQl0eXBlLT50cF90cmF2ZXJzZSA9IGJhc2UtPnRwX3RyYXZlcnNlOwotCQlpZiAodHlwZS0+dHBfY2xlYXIgPT0gTlVMTCkKLQkJCXR5cGUtPnRwX2NsZWFyID0gYmFzZS0+dHBfY2xlYXI7Ci0JfQotCWlmICh0eXBlLT50cF9mbGFncyAmIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSB7Ci0JCS8qIFRoZSBjb25kaXRpb24gYmVsb3cgY291bGQgdXNlIHNvbWUgZXhwbGFuYXRpb24uCi0JCSAgIEl0IGFwcGVhcnMgdGhhdCB0cF9uZXcgaXMgbm90IGluaGVyaXRlZCBmb3Igc3RhdGljIHR5cGVzCi0JCSAgIHdob3NlIGJhc2UgY2xhc3MgaXMgJ29iamVjdCc7IHRoaXMgc2VlbXMgdG8gYmUgYSBwcmVjYXV0aW9uCi0JCSAgIHNvIHRoYXQgb2xkIGV4dGVuc2lvbiB0eXBlcyBkb24ndCBzdWRkZW5seSBiZWNvbWUKLQkJICAgY2FsbGFibGUgKG9iamVjdC5fX25ld19fIHdvdWxkbid0IGluc3VyZSB0aGUgaW52YXJpYW50cwotCQkgICB0aGF0IHRoZSBleHRlbnNpb24gdHlwZSdzIG93biBmYWN0b3J5IGZ1bmN0aW9uIGVuc3VyZXMpLgotCQkgICBIZWFwIHR5cGVzLCBvZiBjb3Vyc2UsIGFyZSB1bmRlciBvdXIgY29udHJvbCwgc28gdGhleSBkbwotCQkgICBpbmhlcml0IHRwX25ldzsgc3RhdGljIGV4dGVuc2lvbiB0eXBlcyB0aGF0IHNwZWNpZnkgc29tZQotCQkgICBvdGhlciBidWlsdC1pbiB0eXBlIGFzIHRoZSBkZWZhdWx0IGFyZSBjb25zaWRlcmVkCi0JCSAgIG5ldy1zdHlsZS1hd2FyZSBzbyB0aGV5IGFsc28gaW5oZXJpdCBvYmplY3QuX19uZXdfXy4gKi8KLQkJaWYgKGJhc2UgIT0gJlB5QmFzZU9iamVjdF9UeXBlIHx8Ci0JCSAgICAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgewotCQkJaWYgKHR5cGUtPnRwX25ldyA9PSBOVUxMKQotCQkJCXR5cGUtPnRwX25ldyA9IGJhc2UtPnRwX25ldzsKLQkJfQotCX0KLQl0eXBlLT50cF9iYXNpY3NpemUgPSBuZXdzaXplOworICAgIC8qIENvcHlpbmcgYmFzaWNzaXplIGlzIGNvbm5lY3RlZCB0byB0aGUgR0MgZmxhZ3MgKi8KKyAgICBvbGRzaXplID0gYmFzZS0+dHBfYmFzaWNzaXplOworICAgIG5ld3NpemUgPSB0eXBlLT50cF9iYXNpY3NpemUgPyB0eXBlLT50cF9iYXNpY3NpemUgOiBvbGRzaXplOworICAgIGlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSAmJgorICAgICAgICAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpICYmCisgICAgICAgICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRS8qR0Mgc2xvdHMgZXhpc3QqLykgJiYKKyAgICAgICAgKCF0eXBlLT50cF90cmF2ZXJzZSAmJiAhdHlwZS0+dHBfY2xlYXIpKSB7CisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSEFWRV9HQzsKKyAgICAgICAgaWYgKHR5cGUtPnRwX3RyYXZlcnNlID09IE5VTEwpCisgICAgICAgICAgICB0eXBlLT50cF90cmF2ZXJzZSA9IGJhc2UtPnRwX3RyYXZlcnNlOworICAgICAgICBpZiAodHlwZS0+dHBfY2xlYXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHR5cGUtPnRwX2NsZWFyID0gYmFzZS0+dHBfY2xlYXI7CisgICAgfQorICAgIGlmICh0eXBlLT50cF9mbGFncyAmIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSB7CisgICAgICAgIC8qIFRoZSBjb25kaXRpb24gYmVsb3cgY291bGQgdXNlIHNvbWUgZXhwbGFuYXRpb24uCisgICAgICAgICAgIEl0IGFwcGVhcnMgdGhhdCB0cF9uZXcgaXMgbm90IGluaGVyaXRlZCBmb3Igc3RhdGljIHR5cGVzCisgICAgICAgICAgIHdob3NlIGJhc2UgY2xhc3MgaXMgJ29iamVjdCc7IHRoaXMgc2VlbXMgdG8gYmUgYSBwcmVjYXV0aW9uCisgICAgICAgICAgIHNvIHRoYXQgb2xkIGV4dGVuc2lvbiB0eXBlcyBkb24ndCBzdWRkZW5seSBiZWNvbWUKKyAgICAgICAgICAgY2FsbGFibGUgKG9iamVjdC5fX25ld19fIHdvdWxkbid0IGluc3VyZSB0aGUgaW52YXJpYW50cworICAgICAgICAgICB0aGF0IHRoZSBleHRlbnNpb24gdHlwZSdzIG93biBmYWN0b3J5IGZ1bmN0aW9uIGVuc3VyZXMpLgorICAgICAgICAgICBIZWFwIHR5cGVzLCBvZiBjb3Vyc2UsIGFyZSB1bmRlciBvdXIgY29udHJvbCwgc28gdGhleSBkbworICAgICAgICAgICBpbmhlcml0IHRwX25ldzsgc3RhdGljIGV4dGVuc2lvbiB0eXBlcyB0aGF0IHNwZWNpZnkgc29tZQorICAgICAgICAgICBvdGhlciBidWlsdC1pbiB0eXBlIGFzIHRoZSBkZWZhdWx0IGFyZSBjb25zaWRlcmVkCisgICAgICAgICAgIG5ldy1zdHlsZS1hd2FyZSBzbyB0aGV5IGFsc28gaW5oZXJpdCBvYmplY3QuX19uZXdfXy4gKi8KKyAgICAgICAgaWYgKGJhc2UgIT0gJlB5QmFzZU9iamVjdF9UeXBlIHx8CisgICAgICAgICAgICAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgeworICAgICAgICAgICAgaWYgKHR5cGUtPnRwX25ldyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHR5cGUtPnRwX25ldyA9IGJhc2UtPnRwX25ldzsKKyAgICAgICAgfQorICAgIH0KKyAgICB0eXBlLT50cF9iYXNpY3NpemUgPSBuZXdzaXplOwogCi0JLyogQ29weSBvdGhlciBub24tZnVuY3Rpb24gc2xvdHMgKi8KKyAgICAvKiBDb3B5IG90aGVyIG5vbi1mdW5jdGlvbiBzbG90cyAqLwogCiAjdW5kZWYgQ09QWVZBTAogI2RlZmluZSBDT1BZVkFMKFNMT1QpIFwKLQlpZiAodHlwZS0+U0xPVCA9PSAwKSB0eXBlLT5TTE9UID0gYmFzZS0+U0xPVAorICAgIGlmICh0eXBlLT5TTE9UID09IDApIHR5cGUtPlNMT1QgPSBiYXNlLT5TTE9UCiAKLQlDT1BZVkFMKHRwX2l0ZW1zaXplKTsKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUykgewotCQlDT1BZVkFMKHRwX3dlYWtsaXN0b2Zmc2V0KTsKLQl9Ci0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpIHsKLQkJQ09QWVZBTCh0cF9kaWN0b2Zmc2V0KTsKLQl9CisgICAgQ09QWVZBTCh0cF9pdGVtc2l6ZSk7CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMpIHsKKyAgICAgICAgQ09QWVZBTCh0cF93ZWFrbGlzdG9mZnNldCk7CisgICAgfQorICAgIGlmICh0eXBlLT50cF9mbGFncyAmIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSB7CisgICAgICAgIENPUFlWQUwodHBfZGljdG9mZnNldCk7CisgICAgfQogCi0JLyogU2V0dXAgZmFzdCBzdWJjbGFzcyBmbGFncyAqLwotCWlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsIChQeVR5cGVPYmplY3QqKVB5RXhjX0Jhc2VFeGNlcHRpb24pKQotCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTOwotCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5VHlwZV9UeXBlKSkKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19UWVBFX1NVQkNMQVNTOwotCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5SW50X1R5cGUpKQotCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0lOVF9TVUJDTEFTUzsKLQllbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeUxvbmdfVHlwZSkpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfTE9OR19TVUJDTEFTUzsKLQllbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeVN0cmluZ19UeXBlKSkKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19TVFJJTkdfU1VCQ0xBU1M7CisgICAgLyogU2V0dXAgZmFzdCBzdWJjbGFzcyBmbGFncyAqLworICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsIChQeVR5cGVPYmplY3QqKVB5RXhjX0Jhc2VFeGNlcHRpb24pKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5VHlwZV9UeXBlKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19UWVBFX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5SW50X1R5cGUpKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0lOVF9TVUJDTEFTUzsKKyAgICBlbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeUxvbmdfVHlwZSkpCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfTE9OR19TVUJDTEFTUzsKKyAgICBlbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeVN0cmluZ19UeXBlKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19TVFJJTkdfU1VCQ0xBU1M7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5VW5pY29kZV9UeXBlKSkKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19VTklDT0RFX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5VW5pY29kZV9UeXBlKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19VTklDT0RFX1NVQkNMQVNTOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShiYXNlLCAmUHlUdXBsZV9UeXBlKSkKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19UVVBMRV9TVUJDTEFTUzsKLQllbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeUxpc3RfVHlwZSkpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUzsKLQllbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeURpY3RfVHlwZSkpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfRElDVF9TVUJDTEFTUzsKKyAgICBlbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeVR1cGxlX1R5cGUpKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1RVUExFX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5TGlzdF9UeXBlKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19MSVNUX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5RGljdF9UeXBlKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19ESUNUX1NVQkNMQVNTOwogfQogCiBzdGF0aWMgaW50CiBvdmVycmlkZXNfbmFtZShQeVR5cGVPYmplY3QgKnR5cGUsIGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OworICAgIFB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKIAotCWFzc2VydChkaWN0ICE9IE5VTEwpOwotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCBuYW1lKSAhPSBOVUxMKSB7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQoZGljdCAhPSBOVUxMKTsKKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgbmFtZSkgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgT1ZFUlJJREVTX0hBU0goeCkgICAgICAgb3ZlcnJpZGVzX25hbWUoeCwgIl9faGFzaF9fIikKQEAgLTM3NDAsNyArMzc0MCw3IEBACiBzdGF0aWMgdm9pZAogaW5oZXJpdF9zbG90cyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5VHlwZU9iamVjdCAqYmFzZSkKIHsKLQlQeVR5cGVPYmplY3QgKmJhc2ViYXNlOworICAgIFB5VHlwZU9iamVjdCAqYmFzZWJhc2U7CiAKICN1bmRlZiBTTE9UREVGSU5FRAogI3VuZGVmIENPUFlTTE9UCkBAIC0zNzUwLDE4NSArMzc1MCwxODUgQEAKICN1bmRlZiBDT1BZQlVGCiAKICNkZWZpbmUgU0xPVERFRklORUQoU0xPVCkgXAotCShiYXNlLT5TTE9UICE9IDAgJiYgXAotCSAoYmFzZWJhc2UgPT0gTlVMTCB8fCBiYXNlLT5TTE9UICE9IGJhc2ViYXNlLT5TTE9UKSkKKyAgICAoYmFzZS0+U0xPVCAhPSAwICYmIFwKKyAgICAgKGJhc2ViYXNlID09IE5VTEwgfHwgYmFzZS0+U0xPVCAhPSBiYXNlYmFzZS0+U0xPVCkpCiAKICNkZWZpbmUgQ09QWVNMT1QoU0xPVCkgXAotCWlmICghdHlwZS0+U0xPVCAmJiBTTE9UREVGSU5FRChTTE9UKSkgdHlwZS0+U0xPVCA9IGJhc2UtPlNMT1QKKyAgICBpZiAoIXR5cGUtPlNMT1QgJiYgU0xPVERFRklORUQoU0xPVCkpIHR5cGUtPlNMT1QgPSBiYXNlLT5TTE9UCiAKICNkZWZpbmUgQ09QWU5VTShTTE9UKSBDT1BZU0xPVCh0cF9hc19udW1iZXItPlNMT1QpCiAjZGVmaW5lIENPUFlTRVEoU0xPVCkgQ09QWVNMT1QodHBfYXNfc2VxdWVuY2UtPlNMT1QpCiAjZGVmaW5lIENPUFlNQVAoU0xPVCkgQ09QWVNMT1QodHBfYXNfbWFwcGluZy0+U0xPVCkKICNkZWZpbmUgQ09QWUJVRihTTE9UKSBDT1BZU0xPVCh0cF9hc19idWZmZXItPlNMT1QpCiAKLQkvKiBUaGlzIHdvbid0IGluaGVyaXQgaW5kaXJlY3Qgc2xvdHMgKGZyb20gdHBfYXNfbnVtYmVyIGV0Yy4pCi0JICAgaWYgdHlwZSBkb2Vzbid0IHByb3ZpZGUgdGhlIHNwYWNlLiAqLworICAgIC8qIFRoaXMgd29uJ3QgaW5oZXJpdCBpbmRpcmVjdCBzbG90cyAoZnJvbSB0cF9hc19udW1iZXIgZXRjLikKKyAgICAgICBpZiB0eXBlIGRvZXNuJ3QgcHJvdmlkZSB0aGUgc3BhY2UuICovCiAKLQlpZiAodHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYgYmFzZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwpIHsKLQkJYmFzZWJhc2UgPSBiYXNlLT50cF9iYXNlOwotCQlpZiAoYmFzZWJhc2UtPnRwX2FzX251bWJlciA9PSBOVUxMKQotCQkJYmFzZWJhc2UgPSBOVUxMOwotCQlDT1BZTlVNKG5iX2FkZCk7Ci0JCUNPUFlOVU0obmJfc3VidHJhY3QpOwotCQlDT1BZTlVNKG5iX211bHRpcGx5KTsKLQkJQ09QWU5VTShuYl9kaXZpZGUpOwotCQlDT1BZTlVNKG5iX3JlbWFpbmRlcik7Ci0JCUNPUFlOVU0obmJfZGl2bW9kKTsKLQkJQ09QWU5VTShuYl9wb3dlcik7Ci0JCUNPUFlOVU0obmJfbmVnYXRpdmUpOwotCQlDT1BZTlVNKG5iX3Bvc2l0aXZlKTsKLQkJQ09QWU5VTShuYl9hYnNvbHV0ZSk7Ci0JCUNPUFlOVU0obmJfbm9uemVybyk7Ci0JCUNPUFlOVU0obmJfaW52ZXJ0KTsKLQkJQ09QWU5VTShuYl9sc2hpZnQpOwotCQlDT1BZTlVNKG5iX3JzaGlmdCk7Ci0JCUNPUFlOVU0obmJfYW5kKTsKLQkJQ09QWU5VTShuYl94b3IpOwotCQlDT1BZTlVNKG5iX29yKTsKLQkJQ09QWU5VTShuYl9jb2VyY2UpOwotCQlDT1BZTlVNKG5iX2ludCk7Ci0JCUNPUFlOVU0obmJfbG9uZyk7Ci0JCUNPUFlOVU0obmJfZmxvYXQpOwotCQlDT1BZTlVNKG5iX29jdCk7Ci0JCUNPUFlOVU0obmJfaGV4KTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX2FkZCk7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9zdWJ0cmFjdCk7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9tdWx0aXBseSk7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9kaXZpZGUpOwotCQlDT1BZTlVNKG5iX2lucGxhY2VfcmVtYWluZGVyKTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX3Bvd2VyKTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX2xzaGlmdCk7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9yc2hpZnQpOwotCQlDT1BZTlVNKG5iX2lucGxhY2VfYW5kKTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX3hvcik7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9vcik7Ci0JCWlmIChiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykgewotCQkJQ09QWU5VTShuYl90cnVlX2RpdmlkZSk7Ci0JCQlDT1BZTlVNKG5iX2Zsb29yX2RpdmlkZSk7Ci0JCQlDT1BZTlVNKG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUpOwotCQkJQ09QWU5VTShuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSk7Ci0JCX0KLQkJaWYgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0lOREVYKSB7Ci0JCQlDT1BZTlVNKG5iX2luZGV4KTsKLQkJfQotCX0KKyAgICBpZiAodHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYgYmFzZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgYmFzZWJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgICAgICBpZiAoYmFzZWJhc2UtPnRwX2FzX251bWJlciA9PSBOVUxMKQorICAgICAgICAgICAgYmFzZWJhc2UgPSBOVUxMOworICAgICAgICBDT1BZTlVNKG5iX2FkZCk7CisgICAgICAgIENPUFlOVU0obmJfc3VidHJhY3QpOworICAgICAgICBDT1BZTlVNKG5iX211bHRpcGx5KTsKKyAgICAgICAgQ09QWU5VTShuYl9kaXZpZGUpOworICAgICAgICBDT1BZTlVNKG5iX3JlbWFpbmRlcik7CisgICAgICAgIENPUFlOVU0obmJfZGl2bW9kKTsKKyAgICAgICAgQ09QWU5VTShuYl9wb3dlcik7CisgICAgICAgIENPUFlOVU0obmJfbmVnYXRpdmUpOworICAgICAgICBDT1BZTlVNKG5iX3Bvc2l0aXZlKTsKKyAgICAgICAgQ09QWU5VTShuYl9hYnNvbHV0ZSk7CisgICAgICAgIENPUFlOVU0obmJfbm9uemVybyk7CisgICAgICAgIENPUFlOVU0obmJfaW52ZXJ0KTsKKyAgICAgICAgQ09QWU5VTShuYl9sc2hpZnQpOworICAgICAgICBDT1BZTlVNKG5iX3JzaGlmdCk7CisgICAgICAgIENPUFlOVU0obmJfYW5kKTsKKyAgICAgICAgQ09QWU5VTShuYl94b3IpOworICAgICAgICBDT1BZTlVNKG5iX29yKTsKKyAgICAgICAgQ09QWU5VTShuYl9jb2VyY2UpOworICAgICAgICBDT1BZTlVNKG5iX2ludCk7CisgICAgICAgIENPUFlOVU0obmJfbG9uZyk7CisgICAgICAgIENPUFlOVU0obmJfZmxvYXQpOworICAgICAgICBDT1BZTlVNKG5iX29jdCk7CisgICAgICAgIENPUFlOVU0obmJfaGV4KTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX2FkZCk7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9zdWJ0cmFjdCk7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9tdWx0aXBseSk7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9kaXZpZGUpOworICAgICAgICBDT1BZTlVNKG5iX2lucGxhY2VfcmVtYWluZGVyKTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX3Bvd2VyKTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX2xzaGlmdCk7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9yc2hpZnQpOworICAgICAgICBDT1BZTlVNKG5iX2lucGxhY2VfYW5kKTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX3hvcik7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9vcik7CisgICAgICAgIGlmIChiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykgeworICAgICAgICAgICAgQ09QWU5VTShuYl90cnVlX2RpdmlkZSk7CisgICAgICAgICAgICBDT1BZTlVNKG5iX2Zsb29yX2RpdmlkZSk7CisgICAgICAgICAgICBDT1BZTlVNKG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUpOworICAgICAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0lOREVYKSB7CisgICAgICAgICAgICBDT1BZTlVNKG5iX2luZGV4KTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmICh0eXBlLT50cF9hc19zZXF1ZW5jZSAhPSBOVUxMICYmIGJhc2UtPnRwX2FzX3NlcXVlbmNlICE9IE5VTEwpIHsKLQkJYmFzZWJhc2UgPSBiYXNlLT50cF9iYXNlOwotCQlpZiAoYmFzZWJhc2UtPnRwX2FzX3NlcXVlbmNlID09IE5VTEwpCi0JCQliYXNlYmFzZSA9IE5VTEw7Ci0JCUNPUFlTRVEoc3FfbGVuZ3RoKTsKLQkJQ09QWVNFUShzcV9jb25jYXQpOwotCQlDT1BZU0VRKHNxX3JlcGVhdCk7Ci0JCUNPUFlTRVEoc3FfaXRlbSk7Ci0JCUNPUFlTRVEoc3Ffc2xpY2UpOwotCQlDT1BZU0VRKHNxX2Fzc19pdGVtKTsKLQkJQ09QWVNFUShzcV9hc3Nfc2xpY2UpOwotCQlDT1BZU0VRKHNxX2NvbnRhaW5zKTsKLQkJQ09QWVNFUShzcV9pbnBsYWNlX2NvbmNhdCk7Ci0JCUNPUFlTRVEoc3FfaW5wbGFjZV9yZXBlYXQpOwotCX0KKyAgICBpZiAodHlwZS0+dHBfYXNfc2VxdWVuY2UgIT0gTlVMTCAmJiBiYXNlLT50cF9hc19zZXF1ZW5jZSAhPSBOVUxMKSB7CisgICAgICAgIGJhc2ViYXNlID0gYmFzZS0+dHBfYmFzZTsKKyAgICAgICAgaWYgKGJhc2ViYXNlLT50cF9hc19zZXF1ZW5jZSA9PSBOVUxMKQorICAgICAgICAgICAgYmFzZWJhc2UgPSBOVUxMOworICAgICAgICBDT1BZU0VRKHNxX2xlbmd0aCk7CisgICAgICAgIENPUFlTRVEoc3FfY29uY2F0KTsKKyAgICAgICAgQ09QWVNFUShzcV9yZXBlYXQpOworICAgICAgICBDT1BZU0VRKHNxX2l0ZW0pOworICAgICAgICBDT1BZU0VRKHNxX3NsaWNlKTsKKyAgICAgICAgQ09QWVNFUShzcV9hc3NfaXRlbSk7CisgICAgICAgIENPUFlTRVEoc3FfYXNzX3NsaWNlKTsKKyAgICAgICAgQ09QWVNFUShzcV9jb250YWlucyk7CisgICAgICAgIENPUFlTRVEoc3FfaW5wbGFjZV9jb25jYXQpOworICAgICAgICBDT1BZU0VRKHNxX2lucGxhY2VfcmVwZWF0KTsKKyAgICB9CiAKLQlpZiAodHlwZS0+dHBfYXNfbWFwcGluZyAhPSBOVUxMICYmIGJhc2UtPnRwX2FzX21hcHBpbmcgIT0gTlVMTCkgewotCQliYXNlYmFzZSA9IGJhc2UtPnRwX2Jhc2U7Ci0JCWlmIChiYXNlYmFzZS0+dHBfYXNfbWFwcGluZyA9PSBOVUxMKQotCQkJYmFzZWJhc2UgPSBOVUxMOwotCQlDT1BZTUFQKG1wX2xlbmd0aCk7Ci0JCUNPUFlNQVAobXBfc3Vic2NyaXB0KTsKLQkJQ09QWU1BUChtcF9hc3Nfc3Vic2NyaXB0KTsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2FzX21hcHBpbmcgIT0gTlVMTCAmJiBiYXNlLT50cF9hc19tYXBwaW5nICE9IE5VTEwpIHsKKyAgICAgICAgYmFzZWJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgICAgICBpZiAoYmFzZWJhc2UtPnRwX2FzX21hcHBpbmcgPT0gTlVMTCkKKyAgICAgICAgICAgIGJhc2ViYXNlID0gTlVMTDsKKyAgICAgICAgQ09QWU1BUChtcF9sZW5ndGgpOworICAgICAgICBDT1BZTUFQKG1wX3N1YnNjcmlwdCk7CisgICAgICAgIENPUFlNQVAobXBfYXNzX3N1YnNjcmlwdCk7CisgICAgfQogCi0JaWYgKHR5cGUtPnRwX2FzX2J1ZmZlciAhPSBOVUxMICYmIGJhc2UtPnRwX2FzX2J1ZmZlciAhPSBOVUxMKSB7Ci0JCWJhc2ViYXNlID0gYmFzZS0+dHBfYmFzZTsKLQkJaWYgKGJhc2ViYXNlLT50cF9hc19idWZmZXIgPT0gTlVMTCkKLQkJCWJhc2ViYXNlID0gTlVMTDsKLQkJQ09QWUJVRihiZl9nZXRyZWFkYnVmZmVyKTsKLQkJQ09QWUJVRihiZl9nZXR3cml0ZWJ1ZmZlcik7Ci0JCUNPUFlCVUYoYmZfZ2V0c2VnY291bnQpOwotCQlDT1BZQlVGKGJmX2dldGNoYXJidWZmZXIpOwotCQlDT1BZQlVGKGJmX2dldGJ1ZmZlcik7Ci0JCUNPUFlCVUYoYmZfcmVsZWFzZWJ1ZmZlcik7Ci0JfQorICAgIGlmICh0eXBlLT50cF9hc19idWZmZXIgIT0gTlVMTCAmJiBiYXNlLT50cF9hc19idWZmZXIgIT0gTlVMTCkgeworICAgICAgICBiYXNlYmFzZSA9IGJhc2UtPnRwX2Jhc2U7CisgICAgICAgIGlmIChiYXNlYmFzZS0+dHBfYXNfYnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICBiYXNlYmFzZSA9IE5VTEw7CisgICAgICAgIENPUFlCVUYoYmZfZ2V0cmVhZGJ1ZmZlcik7CisgICAgICAgIENPUFlCVUYoYmZfZ2V0d3JpdGVidWZmZXIpOworICAgICAgICBDT1BZQlVGKGJmX2dldHNlZ2NvdW50KTsKKyAgICAgICAgQ09QWUJVRihiZl9nZXRjaGFyYnVmZmVyKTsKKyAgICAgICAgQ09QWUJVRihiZl9nZXRidWZmZXIpOworICAgICAgICBDT1BZQlVGKGJmX3JlbGVhc2VidWZmZXIpOworICAgIH0KIAotCWJhc2ViYXNlID0gYmFzZS0+dHBfYmFzZTsKKyAgICBiYXNlYmFzZSA9IGJhc2UtPnRwX2Jhc2U7CiAKLQlDT1BZU0xPVCh0cF9kZWFsbG9jKTsKLQlDT1BZU0xPVCh0cF9wcmludCk7Ci0JaWYgKHR5cGUtPnRwX2dldGF0dHIgPT0gTlVMTCAmJiB0eXBlLT50cF9nZXRhdHRybyA9PSBOVUxMKSB7Ci0JCXR5cGUtPnRwX2dldGF0dHIgPSBiYXNlLT50cF9nZXRhdHRyOwotCQl0eXBlLT50cF9nZXRhdHRybyA9IGJhc2UtPnRwX2dldGF0dHJvOwotCX0KLQlpZiAodHlwZS0+dHBfc2V0YXR0ciA9PSBOVUxMICYmIHR5cGUtPnRwX3NldGF0dHJvID09IE5VTEwpIHsKLQkJdHlwZS0+dHBfc2V0YXR0ciA9IGJhc2UtPnRwX3NldGF0dHI7Ci0JCXR5cGUtPnRwX3NldGF0dHJvID0gYmFzZS0+dHBfc2V0YXR0cm87Ci0JfQotCS8qIHRwX2NvbXBhcmUgc2VlIHRwX3JpY2hjb21wYXJlICovCi0JQ09QWVNMT1QodHBfcmVwcik7Ci0JLyogdHBfaGFzaCBzZWUgdHBfcmljaGNvbXBhcmUgKi8KLQlDT1BZU0xPVCh0cF9jYWxsKTsKLQlDT1BZU0xPVCh0cF9zdHIpOwotCWlmICh0eXBlLT50cF9mbGFncyAmIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFKSB7Ci0JCWlmICh0eXBlLT50cF9jb21wYXJlID09IE5VTEwgJiYKLQkJICAgIHR5cGUtPnRwX3JpY2hjb21wYXJlID09IE5VTEwgJiYKLQkJICAgIHR5cGUtPnRwX2hhc2ggPT0gTlVMTCkKLQkJewotCQkJdHlwZS0+dHBfY29tcGFyZSA9IGJhc2UtPnRwX2NvbXBhcmU7Ci0JCQl0eXBlLT50cF9yaWNoY29tcGFyZSA9IGJhc2UtPnRwX3JpY2hjb21wYXJlOwotCQkJdHlwZS0+dHBfaGFzaCA9IGJhc2UtPnRwX2hhc2g7Ci0JCQkvKiBDaGVjayBmb3IgY2hhbmdlcyB0byBpbmhlcml0ZWQgbWV0aG9kcyBpbiBQeTNrKi8KLQkJCWlmIChQeV9QeTNrV2FybmluZ0ZsYWcpIHsKLQkJCQlpZiAoYmFzZS0+dHBfaGFzaCAmJgotCQkJCQkJKGJhc2UtPnRwX2hhc2ggIT0gUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKSAmJgotCQkJCQkJIU9WRVJSSURFU19IQVNIKHR5cGUpKSB7Ci0JCQkJCWlmIChPVkVSUklERVNfQ01QKHR5cGUpKSB7Ci0JCQkJCQlQeUVycl9XYXJuUHkzaygiT3ZlcnJpZGluZyAiCi0JCQkJCQkgICJfX2NtcF9fIGJsb2NrcyBpbmhlcml0YW5jZSAiCi0JCQkJCQkgICJvZiBfX2hhc2hfXyBpbiAzLngiLAotCQkJCQkJICAxKTsKLQkJCQkJfQotCQkJCQlpZiAoT1ZFUlJJREVTX0VRKHR5cGUpKSB7Ci0JCQkJCQlQeUVycl9XYXJuUHkzaygiT3ZlcnJpZGluZyAiCi0JCQkJCQkgICJfX2VxX18gYmxvY2tzIGluaGVyaXRhbmNlICIKLQkJCQkJCSAgIm9mIF9faGFzaF9fIGluIDMueCIsCi0JCQkJCQkgIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQlDT1BZU0xPVCh0cF9jb21wYXJlKTsKLQl9Ci0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfSVRFUikgewotCQlDT1BZU0xPVCh0cF9pdGVyKTsKLQkJQ09QWVNMT1QodHBfaXRlcm5leHQpOwotCX0KLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykgewotCQlDT1BZU0xPVCh0cF9kZXNjcl9nZXQpOwotCQlDT1BZU0xPVCh0cF9kZXNjcl9zZXQpOwotCQlDT1BZU0xPVCh0cF9kaWN0b2Zmc2V0KTsKLQkJQ09QWVNMT1QodHBfaW5pdCk7Ci0JCUNPUFlTTE9UKHRwX2FsbG9jKTsKLQkJQ09QWVNMT1QodHBfaXNfZ2MpOwotCQlpZiAoKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSA9PQotCQkgICAgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSkgewotCQkJLyogVGhleSBhZ3JlZSBhYm91dCBnYy4gKi8KLQkJCUNPUFlTTE9UKHRwX2ZyZWUpOwotCQl9Ci0JCWVsc2UgaWYgKCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykgJiYKLQkJCSB0eXBlLT50cF9mcmVlID09IE5VTEwgJiYKLQkJCSBiYXNlLT50cF9mcmVlID09IF9QeU9iamVjdF9EZWwpIHsKLQkJCS8qIEEgYml0IG9mIG1hZ2ljIHRvIHBsdWcgaW4gdGhlIGNvcnJlY3QgZGVmYXVsdAotCQkJICogdHBfZnJlZSBmdW5jdGlvbiB3aGVuIGEgZGVyaXZlZCBjbGFzcyBhZGRzIGdjLAotCQkJICogZGlkbid0IGRlZmluZSB0cF9mcmVlLCBhbmQgdGhlIGJhc2UgdXNlcyB0aGUKLQkJCSAqIGRlZmF1bHQgbm9uLWdjIHRwX2ZyZWUuCi0JCQkgKi8KLQkJCXR5cGUtPnRwX2ZyZWUgPSBQeU9iamVjdF9HQ19EZWw7Ci0JCX0KLQkJLyogZWxzZSB0aGV5IGRpZG4ndCBhZ3JlZSBhYm91dCBnYywgYW5kIHRoZXJlIGlzbid0IHNvbWV0aGluZwotCQkgKiBvYnZpb3VzIHRvIGJlIGRvbmUgLS0gdGhlIHR5cGUgaXMgb24gaXRzIG93bi4KLQkJICovCi0JfQorICAgIENPUFlTTE9UKHRwX2RlYWxsb2MpOworICAgIENPUFlTTE9UKHRwX3ByaW50KTsKKyAgICBpZiAodHlwZS0+dHBfZ2V0YXR0ciA9PSBOVUxMICYmIHR5cGUtPnRwX2dldGF0dHJvID09IE5VTEwpIHsKKyAgICAgICAgdHlwZS0+dHBfZ2V0YXR0ciA9IGJhc2UtPnRwX2dldGF0dHI7CisgICAgICAgIHR5cGUtPnRwX2dldGF0dHJvID0gYmFzZS0+dHBfZ2V0YXR0cm87CisgICAgfQorICAgIGlmICh0eXBlLT50cF9zZXRhdHRyID09IE5VTEwgJiYgdHlwZS0+dHBfc2V0YXR0cm8gPT0gTlVMTCkgeworICAgICAgICB0eXBlLT50cF9zZXRhdHRyID0gYmFzZS0+dHBfc2V0YXR0cjsKKyAgICAgICAgdHlwZS0+dHBfc2V0YXR0cm8gPSBiYXNlLT50cF9zZXRhdHRybzsKKyAgICB9CisgICAgLyogdHBfY29tcGFyZSBzZWUgdHBfcmljaGNvbXBhcmUgKi8KKyAgICBDT1BZU0xPVCh0cF9yZXByKTsKKyAgICAvKiB0cF9oYXNoIHNlZSB0cF9yaWNoY29tcGFyZSAqLworICAgIENPUFlTTE9UKHRwX2NhbGwpOworICAgIENPUFlTTE9UKHRwX3N0cik7CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkUpIHsKKyAgICAgICAgaWYgKHR5cGUtPnRwX2NvbXBhcmUgPT0gTlVMTCAmJgorICAgICAgICAgICAgdHlwZS0+dHBfcmljaGNvbXBhcmUgPT0gTlVMTCAmJgorICAgICAgICAgICAgdHlwZS0+dHBfaGFzaCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlLT50cF9jb21wYXJlID0gYmFzZS0+dHBfY29tcGFyZTsKKyAgICAgICAgICAgIHR5cGUtPnRwX3JpY2hjb21wYXJlID0gYmFzZS0+dHBfcmljaGNvbXBhcmU7CisgICAgICAgICAgICB0eXBlLT50cF9oYXNoID0gYmFzZS0+dHBfaGFzaDsKKyAgICAgICAgICAgIC8qIENoZWNrIGZvciBjaGFuZ2VzIHRvIGluaGVyaXRlZCBtZXRob2RzIGluIFB5M2sqLworICAgICAgICAgICAgaWYgKFB5X1B5M2tXYXJuaW5nRmxhZykgeworICAgICAgICAgICAgICAgIGlmIChiYXNlLT50cF9oYXNoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNlLT50cF9oYXNoICE9IFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIU9WRVJSSURFU19IQVNIKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChPVkVSUklERVNfQ01QKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9XYXJuUHkzaygiT3ZlcnJpZGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2NtcF9fIGJsb2NrcyBpbmhlcml0YW5jZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiBfX2hhc2hfXyBpbiAzLngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoT1ZFUlJJREVTX0VRKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9XYXJuUHkzaygiT3ZlcnJpZGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2VxX18gYmxvY2tzIGluaGVyaXRhbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIF9faGFzaF9fIGluIDMueCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBDT1BZU0xPVCh0cF9jb21wYXJlKTsKKyAgICB9CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfSVRFUikgeworICAgICAgICBDT1BZU0xPVCh0cF9pdGVyKTsKKyAgICAgICAgQ09QWVNMT1QodHBfaXRlcm5leHQpOworICAgIH0KKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykgeworICAgICAgICBDT1BZU0xPVCh0cF9kZXNjcl9nZXQpOworICAgICAgICBDT1BZU0xPVCh0cF9kZXNjcl9zZXQpOworICAgICAgICBDT1BZU0xPVCh0cF9kaWN0b2Zmc2V0KTsKKyAgICAgICAgQ09QWVNMT1QodHBfaW5pdCk7CisgICAgICAgIENPUFlTTE9UKHRwX2FsbG9jKTsKKyAgICAgICAgQ09QWVNMT1QodHBfaXNfZ2MpOworICAgICAgICBpZiAoKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSA9PQorICAgICAgICAgICAgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSkgeworICAgICAgICAgICAgLyogVGhleSBhZ3JlZSBhYm91dCBnYy4gKi8KKyAgICAgICAgICAgIENPUFlTTE9UKHRwX2ZyZWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykgJiYKKyAgICAgICAgICAgICAgICAgdHlwZS0+dHBfZnJlZSA9PSBOVUxMICYmCisgICAgICAgICAgICAgICAgIGJhc2UtPnRwX2ZyZWUgPT0gX1B5T2JqZWN0X0RlbCkgeworICAgICAgICAgICAgLyogQSBiaXQgb2YgbWFnaWMgdG8gcGx1ZyBpbiB0aGUgY29ycmVjdCBkZWZhdWx0CisgICAgICAgICAgICAgKiB0cF9mcmVlIGZ1bmN0aW9uIHdoZW4gYSBkZXJpdmVkIGNsYXNzIGFkZHMgZ2MsCisgICAgICAgICAgICAgKiBkaWRuJ3QgZGVmaW5lIHRwX2ZyZWUsIGFuZCB0aGUgYmFzZSB1c2VzIHRoZQorICAgICAgICAgICAgICogZGVmYXVsdCBub24tZ2MgdHBfZnJlZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdHlwZS0+dHBfZnJlZSA9IFB5T2JqZWN0X0dDX0RlbDsKKyAgICAgICAgfQorICAgICAgICAvKiBlbHNlIHRoZXkgZGlkbid0IGFncmVlIGFib3V0IGdjLCBhbmQgdGhlcmUgaXNuJ3Qgc29tZXRoaW5nCisgICAgICAgICAqIG9idmlvdXMgdG8gYmUgZG9uZSAtLSB0aGUgdHlwZSBpcyBvbiBpdHMgb3duLgorICAgICAgICAgKi8KKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQgYWRkX29wZXJhdG9ycyhQeVR5cGVPYmplY3QgKik7CkBAIC0zOTM2LDI0NCArMzkzNiwyNDQgQEAKIGludAogUHlUeXBlX1JlYWR5KFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqZGljdCwgKmJhc2VzOwotCVB5VHlwZU9iamVjdCAqYmFzZTsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKmRpY3QsICpiYXNlczsKKyAgICBQeVR5cGVPYmplY3QgKmJhc2U7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19SRUFEWSkgewotCQlhc3NlcnQodHlwZS0+dHBfZGljdCAhPSBOVUxMKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWFzc2VydCgodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX1JFQURZSU5HKSA9PSAwKTsKKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX1JFQURZKSB7CisgICAgICAgIGFzc2VydCh0eXBlLT50cF9kaWN0ICE9IE5VTEwpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXNzZXJ0KCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfUkVBRFlJTkcpID09IDApOwogCi0JdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19SRUFEWUlORzsKKyAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1JFQURZSU5HOwogCiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwotCS8qIFB5VHlwZV9SZWFkeSBpcyB0aGUgY2xvc2VzdCB0aGluZyB3ZSBoYXZlIHRvIGEgY2hva2UgcG9pbnQKLQkgKiBmb3IgdHlwZSBvYmplY3RzLCBzbyBpcyB0aGUgYmVzdCBwbGFjZSBJIGNhbiB0aGluayBvZiB0byB0cnkKLQkgKiB0byBnZXQgdHlwZSBvYmplY3RzIGludG8gdGhlIGRvdWJseS1saW5rZWQgbGlzdCBvZiBhbGwgb2JqZWN0cy4KLQkgKiBTdGlsbCwgbm90IGFsbCB0eXBlIG9iamVjdHMgZ28gdGhydSBQeVR5cGVfUmVhZHkuCi0JICovCi0JX1B5X0FkZFRvQWxsT2JqZWN0cygoUHlPYmplY3QgKil0eXBlLCAwKTsKKyAgICAvKiBQeVR5cGVfUmVhZHkgaXMgdGhlIGNsb3Nlc3QgdGhpbmcgd2UgaGF2ZSB0byBhIGNob2tlIHBvaW50CisgICAgICogZm9yIHR5cGUgb2JqZWN0cywgc28gaXMgdGhlIGJlc3QgcGxhY2UgSSBjYW4gdGhpbmsgb2YgdG8gdHJ5CisgICAgICogdG8gZ2V0IHR5cGUgb2JqZWN0cyBpbnRvIHRoZSBkb3VibHktbGlua2VkIGxpc3Qgb2YgYWxsIG9iamVjdHMuCisgICAgICogU3RpbGwsIG5vdCBhbGwgdHlwZSBvYmplY3RzIGdvIHRocnUgUHlUeXBlX1JlYWR5LgorICAgICAqLworICAgIF9QeV9BZGRUb0FsbE9iamVjdHMoKFB5T2JqZWN0ICopdHlwZSwgMCk7CiAjZW5kaWYKIAotCS8qIEluaXRpYWxpemUgdHBfYmFzZSAoZGVmYXVsdHMgdG8gQmFzZU9iamVjdCB1bmxlc3MgdGhhdCdzIHVzKSAqLwotCWJhc2UgPSB0eXBlLT50cF9iYXNlOwotCWlmIChiYXNlID09IE5VTEwgJiYgdHlwZSAhPSAmUHlCYXNlT2JqZWN0X1R5cGUpIHsKLQkJYmFzZSA9IHR5cGUtPnRwX2Jhc2UgPSAmUHlCYXNlT2JqZWN0X1R5cGU7Ci0JCVB5X0lOQ1JFRihiYXNlKTsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB0cF9iYXNlIChkZWZhdWx0cyB0byBCYXNlT2JqZWN0IHVubGVzcyB0aGF0J3MgdXMpICovCisgICAgYmFzZSA9IHR5cGUtPnRwX2Jhc2U7CisgICAgaWYgKGJhc2UgPT0gTlVMTCAmJiB0eXBlICE9ICZQeUJhc2VPYmplY3RfVHlwZSkgeworICAgICAgICBiYXNlID0gdHlwZS0+dHBfYmFzZSA9ICZQeUJhc2VPYmplY3RfVHlwZTsKKyAgICAgICAgUHlfSU5DUkVGKGJhc2UpOworICAgIH0KIAotCS8qIE5vdyB0aGUgb25seSB3YXkgYmFzZSBjYW4gc3RpbGwgYmUgTlVMTCBpcyBpZiB0eXBlIGlzCi0JICogJlB5QmFzZU9iamVjdF9UeXBlLgotCSAqLworICAgIC8qIE5vdyB0aGUgb25seSB3YXkgYmFzZSBjYW4gc3RpbGwgYmUgTlVMTCBpcyBpZiB0eXBlIGlzCisgICAgICogJlB5QmFzZU9iamVjdF9UeXBlLgorICAgICAqLwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgYmFzZSBjbGFzcyAqLwotCWlmIChiYXNlICYmIGJhc2UtPnRwX2RpY3QgPT0gTlVMTCkgewotCQlpZiAoUHlUeXBlX1JlYWR5KGJhc2UpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgdGhlIGJhc2UgY2xhc3MgKi8KKyAgICBpZiAoYmFzZSAmJiBiYXNlLT50cF9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeShiYXNlKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIEluaXRpYWxpemUgb2JfdHlwZSBpZiBOVUxMLglUaGlzIG1lYW5zIGV4dGVuc2lvbnMgdGhhdCB3YW50IHRvIGJlCi0JICAgY29tcGlsYWJsZSBzZXBhcmF0ZWx5IG9uIFdpbmRvd3MgY2FuIGNhbGwgUHlUeXBlX1JlYWR5KCkgaW5zdGVhZCBvZgotCSAgIGluaXRpYWxpemluZyB0aGUgb2JfdHlwZSBmaWVsZCBvZiB0aGVpciB0eXBlIG9iamVjdHMuICovCi0JLyogVGhlIHRlc3QgZm9yIGJhc2UgIT0gTlVMTCBpcyByZWFsbHkgdW5uZWNlc3NhcnksIHNpbmNlIGJhc2UgaXMgb25seQotCSAgIE5VTEwgd2hlbiB0eXBlIGlzICZQeUJhc2VPYmplY3RfVHlwZSwgYW5kIHdlIGtub3cgaXRzIG9iX3R5cGUgaXMKLQkgICBub3QgTlVMTCAoaXQncyBpbml0aWFsaXplZCB0byAmUHlUeXBlX1R5cGUpLgkgQnV0IGNvdmVyaXR5IGRvZXNuJ3QKLQkgICBrbm93IHRoYXQuICovCi0JaWYgKFB5X1RZUEUodHlwZSkgPT0gTlVMTCAmJiBiYXNlICE9IE5VTEwpCi0JCVB5X1RZUEUodHlwZSkgPSBQeV9UWVBFKGJhc2UpOworICAgIC8qIEluaXRpYWxpemUgb2JfdHlwZSBpZiBOVUxMLiAgICAgIFRoaXMgbWVhbnMgZXh0ZW5zaW9ucyB0aGF0IHdhbnQgdG8gYmUKKyAgICAgICBjb21waWxhYmxlIHNlcGFyYXRlbHkgb24gV2luZG93cyBjYW4gY2FsbCBQeVR5cGVfUmVhZHkoKSBpbnN0ZWFkIG9mCisgICAgICAgaW5pdGlhbGl6aW5nIHRoZSBvYl90eXBlIGZpZWxkIG9mIHRoZWlyIHR5cGUgb2JqZWN0cy4gKi8KKyAgICAvKiBUaGUgdGVzdCBmb3IgYmFzZSAhPSBOVUxMIGlzIHJlYWxseSB1bm5lY2Vzc2FyeSwgc2luY2UgYmFzZSBpcyBvbmx5CisgICAgICAgTlVMTCB3aGVuIHR5cGUgaXMgJlB5QmFzZU9iamVjdF9UeXBlLCBhbmQgd2Uga25vdyBpdHMgb2JfdHlwZSBpcworICAgICAgIG5vdCBOVUxMIChpdCdzIGluaXRpYWxpemVkIHRvICZQeVR5cGVfVHlwZSkuICAgICAgQnV0IGNvdmVyaXR5IGRvZXNuJ3QKKyAgICAgICBrbm93IHRoYXQuICovCisgICAgaWYgKFB5X1RZUEUodHlwZSkgPT0gTlVMTCAmJiBiYXNlICE9IE5VTEwpCisgICAgICAgIFB5X1RZUEUodHlwZSkgPSBQeV9UWVBFKGJhc2UpOwogCi0JLyogSW5pdGlhbGl6ZSB0cF9iYXNlcyAqLwotCWJhc2VzID0gdHlwZS0+dHBfYmFzZXM7Ci0JaWYgKGJhc2VzID09IE5VTEwpIHsKLQkJaWYgKGJhc2UgPT0gTlVMTCkKLQkJCWJhc2VzID0gUHlUdXBsZV9OZXcoMCk7Ci0JCWVsc2UKLQkJCWJhc2VzID0gUHlUdXBsZV9QYWNrKDEsIGJhc2UpOwotCQlpZiAoYmFzZXMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCXR5cGUtPnRwX2Jhc2VzID0gYmFzZXM7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgdHBfYmFzZXMgKi8KKyAgICBiYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOworICAgIGlmIChiYXNlcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChiYXNlID09IE5VTEwpCisgICAgICAgICAgICBiYXNlcyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiYXNlcyA9IFB5VHVwbGVfUGFjaygxLCBiYXNlKTsKKyAgICAgICAgaWYgKGJhc2VzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB0eXBlLT50cF9iYXNlcyA9IGJhc2VzOworICAgIH0KIAotCS8qIEluaXRpYWxpemUgdHBfZGljdCAqLwotCWRpY3QgPSB0eXBlLT50cF9kaWN0OwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJZGljdCA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCXR5cGUtPnRwX2RpY3QgPSBkaWN0OwotCX0KKyAgICAvKiBJbml0aWFsaXplIHRwX2RpY3QgKi8KKyAgICBkaWN0ID0gdHlwZS0+dHBfZGljdDsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB0eXBlLT50cF9kaWN0ID0gZGljdDsKKyAgICB9CiAKLQkvKiBBZGQgdHlwZS1zcGVjaWZpYyBkZXNjcmlwdG9ycyB0byB0cF9kaWN0ICovCi0JaWYgKGFkZF9vcGVyYXRvcnModHlwZSkgPCAwKQotCQlnb3RvIGVycm9yOwotCWlmICh0eXBlLT50cF9tZXRob2RzICE9IE5VTEwpIHsKLQkJaWYgKGFkZF9tZXRob2RzKHR5cGUsIHR5cGUtPnRwX21ldGhvZHMpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCWlmICh0eXBlLT50cF9tZW1iZXJzICE9IE5VTEwpIHsKLQkJaWYgKGFkZF9tZW1iZXJzKHR5cGUsIHR5cGUtPnRwX21lbWJlcnMpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCWlmICh0eXBlLT50cF9nZXRzZXQgIT0gTlVMTCkgewotCQlpZiAoYWRkX2dldHNldCh0eXBlLCB0eXBlLT50cF9nZXRzZXQpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIC8qIEFkZCB0eXBlLXNwZWNpZmljIGRlc2NyaXB0b3JzIHRvIHRwX2RpY3QgKi8KKyAgICBpZiAoYWRkX29wZXJhdG9ycyh0eXBlKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKHR5cGUtPnRwX21ldGhvZHMgIT0gTlVMTCkgeworICAgICAgICBpZiAoYWRkX21ldGhvZHModHlwZSwgdHlwZS0+dHBfbWV0aG9kcykgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKHR5cGUtPnRwX21lbWJlcnMgIT0gTlVMTCkgeworICAgICAgICBpZiAoYWRkX21lbWJlcnModHlwZSwgdHlwZS0+dHBfbWVtYmVycykgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKHR5cGUtPnRwX2dldHNldCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChhZGRfZ2V0c2V0KHR5cGUsIHR5cGUtPnRwX2dldHNldCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBDYWxjdWxhdGUgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgKi8KLQlpZiAobXJvX2ludGVybmFsKHR5cGUpIDwgMCkgewotCQlnb3RvIGVycm9yOwotCX0KKyAgICAvKiBDYWxjdWxhdGUgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgKi8KKyAgICBpZiAobXJvX2ludGVybmFsKHR5cGUpIDwgMCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIEluaGVyaXQgc3BlY2lhbCBmbGFncyBmcm9tIGRvbWluYW50IGJhc2UgKi8KLQlpZiAodHlwZS0+dHBfYmFzZSAhPSBOVUxMKQotCQlpbmhlcml0X3NwZWNpYWwodHlwZSwgdHlwZS0+dHBfYmFzZSk7CisgICAgLyogSW5oZXJpdCBzcGVjaWFsIGZsYWdzIGZyb20gZG9taW5hbnQgYmFzZSAqLworICAgIGlmICh0eXBlLT50cF9iYXNlICE9IE5VTEwpCisgICAgICAgIGluaGVyaXRfc3BlY2lhbCh0eXBlLCB0eXBlLT50cF9iYXNlKTsKIAotCS8qIEluaXRpYWxpemUgdHBfZGljdCBwcm9wZXJseSAqLwotCWJhc2VzID0gdHlwZS0+dHBfbXJvOwotCWFzc2VydChiYXNlcyAhPSBOVUxMKTsKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhiYXNlcykpOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKLQlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpiID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCWlmIChQeVR5cGVfQ2hlY2soYikpCi0JCQlpbmhlcml0X3Nsb3RzKHR5cGUsIChQeVR5cGVPYmplY3QgKiliKTsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB0cF9kaWN0IHByb3Blcmx5ICovCisgICAgYmFzZXMgPSB0eXBlLT50cF9tcm87CisgICAgYXNzZXJ0KGJhc2VzICE9IE5VTEwpOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGJhc2VzKSk7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgaWYgKFB5VHlwZV9DaGVjayhiKSkKKyAgICAgICAgICAgIGluaGVyaXRfc2xvdHModHlwZSwgKFB5VHlwZU9iamVjdCAqKWIpOworICAgIH0KIAotCS8qIFNhbml0eSBjaGVjayBmb3IgdHBfZnJlZS4gKi8KLQlpZiAoUHlUeXBlX0lTX0dDKHR5cGUpICYmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfQkFTRVRZUEUpICYmCi0JICAgICh0eXBlLT50cF9mcmVlID09IE5VTEwgfHwgdHlwZS0+dHBfZnJlZSA9PSBQeU9iamVjdF9EZWwpKSB7Ci0JCS8qIFRoaXMgYmFzZSBjbGFzcyBuZWVkcyB0byBjYWxsIHRwX2ZyZWUsIGJ1dCBkb2Vzbid0IGhhdmUKLQkJICogb25lLCBvciBpdHMgdHBfZnJlZSBpcyBmb3Igbm9uLWdjJ2VkIG9iamVjdHMuCi0JCSAqLwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAidHlwZSAnJS4xMDBzJyBwYXJ0aWNpcGF0ZXMgaW4gIgotCQkJICAgICAiZ2MgYW5kIGlzIGEgYmFzZSB0eXBlIGJ1dCBoYXMgaW5hcHByb3ByaWF0ZSAiCi0JCQkgICAgICJ0cF9mcmVlIHNsb3QiLAotCQkJICAgICB0eXBlLT50cF9uYW1lKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgLyogU2FuaXR5IGNoZWNrIGZvciB0cF9mcmVlLiAqLworICAgIGlmIChQeVR5cGVfSVNfR0ModHlwZSkgJiYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19CQVNFVFlQRSkgJiYKKyAgICAgICAgKHR5cGUtPnRwX2ZyZWUgPT0gTlVMTCB8fCB0eXBlLT50cF9mcmVlID09IFB5T2JqZWN0X0RlbCkpIHsKKyAgICAgICAgLyogVGhpcyBiYXNlIGNsYXNzIG5lZWRzIHRvIGNhbGwgdHBfZnJlZSwgYnV0IGRvZXNuJ3QgaGF2ZQorICAgICAgICAgKiBvbmUsIG9yIGl0cyB0cF9mcmVlIGlzIGZvciBub24tZ2MnZWQgb2JqZWN0cy4KKyAgICAgICAgICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJ0eXBlICclLjEwMHMnIHBhcnRpY2lwYXRlcyBpbiAiCisgICAgICAgICAgICAgICAgICAgICAiZ2MgYW5kIGlzIGEgYmFzZSB0eXBlIGJ1dCBoYXMgaW5hcHByb3ByaWF0ZSAiCisgICAgICAgICAgICAgICAgICAgICAidHBfZnJlZSBzbG90IiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIGlmIHRoZSB0eXBlIGRpY3Rpb25hcnkgZG9lc24ndCBjb250YWluIGEgX19kb2NfXywgc2V0IGl0IGZyb20KLQkgICB0aGUgdHBfZG9jIHNsb3QuCi0JICovCi0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIikgPT0gTlVMTCkgewotCQlpZiAodHlwZS0+dHBfZG9jICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICpkb2MgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHR5cGUtPnRwX2RvYyk7Ci0JCQlpZiAoZG9jID09IE5VTEwpCi0JCQkJZ290byBlcnJvcjsKLQkJCVB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIiwgZG9jKTsKLQkJCVB5X0RFQ1JFRihkb2MpOwotCQl9IGVsc2UgewotCQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwKLQkJCQkJICAgICAiX19kb2NfXyIsIFB5X05vbmUpOwotCQl9Ci0JfQorICAgIC8qIGlmIHRoZSB0eXBlIGRpY3Rpb25hcnkgZG9lc24ndCBjb250YWluIGEgX19kb2NfXywgc2V0IGl0IGZyb20KKyAgICAgICB0aGUgdHBfZG9jIHNsb3QuCisgICAgICovCisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIikgPT0gTlVMTCkgeworICAgICAgICBpZiAodHlwZS0+dHBfZG9jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpkb2MgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHR5cGUtPnRwX2RvYyk7CisgICAgICAgICAgICBpZiAoZG9jID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX2RvY19fIiwgZG9jKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkb2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2RvY19fIiwgUHlfTm9uZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBTb21lIG1vcmUgc3BlY2lhbCBzdHVmZiAqLwotCWJhc2UgPSB0eXBlLT50cF9iYXNlOwotCWlmIChiYXNlICE9IE5VTEwpIHsKLQkJaWYgKHR5cGUtPnRwX2FzX251bWJlciA9PSBOVUxMKQotCQkJdHlwZS0+dHBfYXNfbnVtYmVyID0gYmFzZS0+dHBfYXNfbnVtYmVyOwotCQlpZiAodHlwZS0+dHBfYXNfc2VxdWVuY2UgPT0gTlVMTCkKLQkJCXR5cGUtPnRwX2FzX3NlcXVlbmNlID0gYmFzZS0+dHBfYXNfc2VxdWVuY2U7Ci0JCWlmICh0eXBlLT50cF9hc19tYXBwaW5nID09IE5VTEwpCi0JCQl0eXBlLT50cF9hc19tYXBwaW5nID0gYmFzZS0+dHBfYXNfbWFwcGluZzsKLQkJaWYgKHR5cGUtPnRwX2FzX2J1ZmZlciA9PSBOVUxMKQotCQkJdHlwZS0+dHBfYXNfYnVmZmVyID0gYmFzZS0+dHBfYXNfYnVmZmVyOwotCX0KKyAgICAvKiBTb21lIG1vcmUgc3BlY2lhbCBzdHVmZiAqLworICAgIGJhc2UgPSB0eXBlLT50cF9iYXNlOworICAgIGlmIChiYXNlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHR5cGUtPnRwX2FzX251bWJlciA9PSBOVUxMKQorICAgICAgICAgICAgdHlwZS0+dHBfYXNfbnVtYmVyID0gYmFzZS0+dHBfYXNfbnVtYmVyOworICAgICAgICBpZiAodHlwZS0+dHBfYXNfc2VxdWVuY2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHR5cGUtPnRwX2FzX3NlcXVlbmNlID0gYmFzZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIGlmICh0eXBlLT50cF9hc19tYXBwaW5nID09IE5VTEwpCisgICAgICAgICAgICB0eXBlLT50cF9hc19tYXBwaW5nID0gYmFzZS0+dHBfYXNfbWFwcGluZzsKKyAgICAgICAgaWYgKHR5cGUtPnRwX2FzX2J1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgdHlwZS0+dHBfYXNfYnVmZmVyID0gYmFzZS0+dHBfYXNfYnVmZmVyOworICAgIH0KIAotCS8qIExpbmsgaW50byBlYWNoIGJhc2UgY2xhc3MncyBsaXN0IG9mIHN1YmNsYXNzZXMgKi8KLQliYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpiID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCWlmIChQeVR5cGVfQ2hlY2soYikgJiYKLQkJICAgIGFkZF9zdWJjbGFzcygoUHlUeXBlT2JqZWN0ICopYiwgdHlwZSkgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgLyogTGluayBpbnRvIGVhY2ggYmFzZSBjbGFzcydzIGxpc3Qgb2Ygc3ViY2xhc3NlcyAqLworICAgIGJhc2VzID0gdHlwZS0+dHBfYmFzZXM7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgaWYgKFB5VHlwZV9DaGVjayhiKSAmJgorICAgICAgICAgICAgYWRkX3N1YmNsYXNzKChQeVR5cGVPYmplY3QgKiliLCB0eXBlKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIEFsbCBkb25lIC0tIHNldCB0aGUgcmVhZHkgZmxhZyAqLwotCWFzc2VydCh0eXBlLT50cF9kaWN0ICE9IE5VTEwpOwotCXR5cGUtPnRwX2ZsYWdzID0KLQkJKHR5cGUtPnRwX2ZsYWdzICYgflB5X1RQRkxBR1NfUkVBRFlJTkcpIHwgUHlfVFBGTEFHU19SRUFEWTsKLQlyZXR1cm4gMDsKKyAgICAvKiBBbGwgZG9uZSAtLSBzZXQgdGhlIHJlYWR5IGZsYWcgKi8KKyAgICBhc3NlcnQodHlwZS0+dHBfZGljdCAhPSBOVUxMKTsKKyAgICB0eXBlLT50cF9mbGFncyA9CisgICAgICAgICh0eXBlLT50cF9mbGFncyAmIH5QeV9UUEZMQUdTX1JFQURZSU5HKSB8IFB5X1RQRkxBR1NfUkVBRFk7CisgICAgcmV0dXJuIDA7CiAKICAgZXJyb3I6Ci0JdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfUkVBRFlJTkc7Ci0JcmV0dXJuIC0xOworICAgIHR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX1JFQURZSU5HOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIGludAogYWRkX3N1YmNsYXNzKFB5VHlwZU9iamVjdCAqYmFzZSwgUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5X3NzaXplX3QgaTsKLQlpbnQgcmVzdWx0OwotCVB5T2JqZWN0ICpsaXN0LCAqcmVmLCAqbmV3b2JqOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgcmVzdWx0OworICAgIFB5T2JqZWN0ICpsaXN0LCAqcmVmLCAqbmV3b2JqOwogCi0JbGlzdCA9IGJhc2UtPnRwX3N1YmNsYXNzZXM7Ci0JaWYgKGxpc3QgPT0gTlVMTCkgewotCQliYXNlLT50cF9zdWJjbGFzc2VzID0gbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmIChsaXN0ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWFzc2VydChQeUxpc3RfQ2hlY2sobGlzdCkpOwotCW5ld29iaiA9IFB5V2Vha3JlZl9OZXdSZWYoKFB5T2JqZWN0ICopdHlwZSwgTlVMTCk7Ci0JaSA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKLQl3aGlsZSAoLS1pID49IDApIHsKLQkJcmVmID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOwotCQlhc3NlcnQoUHlXZWFrcmVmX0NoZWNrUmVmKHJlZikpOwotCQlpZiAoUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKSA9PSBQeV9Ob25lKQotCQkJcmV0dXJuIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIG5ld29iaik7Ci0JfQotCXJlc3VsdCA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbmV3b2JqKTsKLQlQeV9ERUNSRUYobmV3b2JqKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGxpc3QgPSBiYXNlLT50cF9zdWJjbGFzc2VzOworICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgYmFzZS0+dHBfc3ViY2xhc3NlcyA9IGxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgICAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGxpc3QpKTsKKyAgICBuZXdvYmogPSBQeVdlYWtyZWZfTmV3UmVmKChQeU9iamVjdCAqKXR5cGUsIE5VTEwpOworICAgIGkgPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CisgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgIHJlZiA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgYXNzZXJ0KFB5V2Vha3JlZl9DaGVja1JlZihyZWYpKTsKKyAgICAgICAgaWYgKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZikgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHJldHVybiBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBuZXdvYmopOworICAgIH0KKyAgICByZXN1bHQgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIG5ld29iaik7CisgICAgUHlfREVDUkVGKG5ld29iaik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIHZvaWQKIHJlbW92ZV9zdWJjbGFzcyhQeVR5cGVPYmplY3QgKmJhc2UsIFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKmxpc3QsICpyZWY7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpsaXN0LCAqcmVmOwogCi0JbGlzdCA9IGJhc2UtPnRwX3N1YmNsYXNzZXM7Ci0JaWYgKGxpc3QgPT0gTlVMTCkgewotCQlyZXR1cm47Ci0JfQotCWFzc2VydChQeUxpc3RfQ2hlY2sobGlzdCkpOwotCWkgPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCXJlZiA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKLQkJYXNzZXJ0KFB5V2Vha3JlZl9DaGVja1JlZihyZWYpKTsKLQkJaWYgKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZikgPT0gKFB5T2JqZWN0Kil0eXBlKSB7Ci0JCQkvKiB0aGlzIGNhbid0IGZhaWwsIHJpZ2h0PyAqLwotCQkJUHlTZXF1ZW5jZV9EZWxJdGVtKGxpc3QsIGkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQorICAgIGxpc3QgPSBiYXNlLT50cF9zdWJjbGFzc2VzOworICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGxpc3QpKTsKKyAgICBpID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOworICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICByZWYgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CisgICAgICAgIGFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7CisgICAgICAgIGlmIChQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpID09IChQeU9iamVjdCopdHlwZSkgeworICAgICAgICAgICAgLyogdGhpcyBjYW4ndCBmYWlsLCByaWdodD8gKi8KKyAgICAgICAgICAgIFB5U2VxdWVuY2VfRGVsSXRlbShsaXN0LCBpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIGludAogY2hlY2tfbnVtX2FyZ3MoUHlPYmplY3QgKm9iLCBpbnQgbikKIHsKLQlpZiAoIVB5VHVwbGVfQ2hlY2tFeGFjdChvYikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkgICAgIlB5QXJnX1VucGFja1R1cGxlKCkgYXJndW1lbnQgbGlzdCBpcyBub3QgYSB0dXBsZSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKG4gPT0gUHlUdXBsZV9HRVRfU0laRShvYikpCi0JCXJldHVybiAxOwotCVB5RXJyX0Zvcm1hdCgKLQkgICAgUHlFeGNfVHlwZUVycm9yLCAKLQkgICAgImV4cGVjdGVkICVkIGFyZ3VtZW50cywgZ290ICV6ZCIsIG4sIFB5VHVwbGVfR0VUX1NJWkUob2IpKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2tFeGFjdChvYikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgIlB5QXJnX1VucGFja1R1cGxlKCkgYXJndW1lbnQgbGlzdCBpcyBub3QgYSB0dXBsZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG4gPT0gUHlUdXBsZV9HRVRfU0laRShvYikpCisgICAgICAgIHJldHVybiAxOworICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAiZXhwZWN0ZWQgJWQgYXJndW1lbnRzLCBnb3QgJXpkIiwgbiwgUHlUdXBsZV9HRVRfU0laRShvYikpOworICAgIHJldHVybiAwOwogfQogCiAvKiBHZW5lcmljIHdyYXBwZXJzIGZvciBvdmVybG9hZGFibGUgJ29wZXJhdG9ycycgc3VjaCBhcyBfX2dldGl0ZW1fXyAqLwogCiAvKiBUaGVyZSdzIGEgd3JhcHBlciAqZnVuY3Rpb24qIGZvciBlYWNoIGRpc3RpbmN0IGZ1bmN0aW9uIHR5cGVkZWYgdXNlZAotICAgZm9yIHR5cGUgb2JqZWN0IHNsb3RzIChlLmcuIGJpbmFyeWZ1bmMsIHRlcm5hcnlmdW5jLCBldGMuKS4JVGhlcmUncyBhCisgICBmb3IgdHlwZSBvYmplY3Qgc2xvdHMgKGUuZy4gYmluYXJ5ZnVuYywgdGVybmFyeWZ1bmMsIGV0Yy4pLiAgVGhlcmUncyBhCiAgICB3cmFwcGVyICp0YWJsZSogZm9yIGVhY2ggZGlzdGluY3Qgb3BlcmF0aW9uIChlLmcuIF9fbGVuX18sIF9fYWRkX18pLgogICAgTW9zdCB0YWJsZXMgaGF2ZSBvbmx5IG9uZSBlbnRyeTsgdGhlIHRhYmxlcyBmb3IgYmluYXJ5IG9wZXJhdG9ycyBoYXZlIHR3bwogICAgZW50cmllcywgb25lIHJlZ3VsYXIgYW5kIG9uZSB3aXRoIHJldmVyc2VkIGFyZ3VtZW50cy4gKi8KQEAgLTQxODEsMzU3ICs0MTgxLDM1NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfbGVuZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JbGVuZnVuYyBmdW5jID0gKGxlbmZ1bmMpd3JhcHBlZDsKLQlQeV9zc2l6ZV90IHJlczsKKyAgICBsZW5mdW5jIGZ1bmMgPSAobGVuZnVuYyl3cmFwcGVkOworICAgIFB5X3NzaXplX3QgcmVzOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmKTsKLQlpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXMpOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZik7CisgICAgaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfaW5xdWlyeXByZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWlucXVpcnkgZnVuYyA9IChpbnF1aXJ5KXdyYXBwZWQ7Ci0JaW50IHJlczsKKyAgICBpbnF1aXJ5IGZ1bmMgPSAoaW5xdWlyeSl3cmFwcGVkOworICAgIGludCByZXM7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDApKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYpOwotCWlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylyZXMpOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZik7CisgICAgaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKXJlcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2JpbmFyeWZ1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWJpbmFyeWZ1bmMgZnVuYyA9IChiaW5hcnlmdW5jKXdyYXBwZWQ7Ci0JUHlPYmplY3QgKm90aGVyOworICAgIGJpbmFyeWZ1bmMgZnVuYyA9IChiaW5hcnlmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKm90aGVyOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCXJldHVybiAoKmZ1bmMpKHNlbGYsIG90aGVyKTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZiwgb3RoZXIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9iaW5hcnlmdW5jX2woUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWJpbmFyeWZ1bmMgZnVuYyA9IChiaW5hcnlmdW5jKXdyYXBwZWQ7Ci0JUHlPYmplY3QgKm90aGVyOworICAgIGJpbmFyeWZ1bmMgZnVuYyA9IChiaW5hcnlmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKm90aGVyOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCWlmICghKHNlbGYtPm9iX3R5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19DSEVDS1RZUEVTKSAmJgotCSAgICAhUHlUeXBlX0lzU3VidHlwZShvdGhlci0+b2JfdHlwZSwgc2VsZi0+b2JfdHlwZSkpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlyZXR1cm4gKCpmdW5jKShzZWxmLCBvdGhlcik7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIGlmICghKHNlbGYtPm9iX3R5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19DSEVDS1RZUEVTKSAmJgorICAgICAgICAhUHlUeXBlX0lzU3VidHlwZShvdGhlci0+b2JfdHlwZSwgc2VsZi0+b2JfdHlwZSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICByZXR1cm4gKCpmdW5jKShzZWxmLCBvdGhlcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2JpbmFyeWZ1bmNfcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JYmluYXJ5ZnVuYyBmdW5jID0gKGJpbmFyeWZ1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqb3RoZXI7CisgICAgYmluYXJ5ZnVuYyBmdW5jID0gKGJpbmFyeWZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb3RoZXI7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaWYgKCEoc2VsZi0+b2JfdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpICYmCi0JICAgICFQeVR5cGVfSXNTdWJ0eXBlKG90aGVyLT5vYl90eXBlLCBzZWxmLT5vYl90eXBlKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCXJldHVybiAoKmZ1bmMpKG90aGVyLCBzZWxmKTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgaWYgKCEoc2VsZi0+b2JfdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpICYmCisgICAgICAgICFQeVR5cGVfSXNTdWJ0eXBlKG90aGVyLT5vYl90eXBlLCBzZWxmLT5vYl90eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIHJldHVybiAoKmZ1bmMpKG90aGVyLCBzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfY29lcmNlZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JY29lcmNpb24gZnVuYyA9IChjb2VyY2lvbil3cmFwcGVkOwotCVB5T2JqZWN0ICpvdGhlciwgKnJlczsKLQlpbnQgb2s7CisgICAgY29lcmNpb24gZnVuYyA9IChjb2VyY2lvbil3cmFwcGVkOworICAgIFB5T2JqZWN0ICpvdGhlciwgKnJlczsKKyAgICBpbnQgb2s7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0Jb2sgPSBmdW5jKCZzZWxmLCAmb3RoZXIpOwotCWlmIChvayA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChvayA+IDApIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlyZXMgPSBQeVR1cGxlX05ldygyKTsKLQlpZiAocmVzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHNlbGYpOwotCQlQeV9ERUNSRUYob3RoZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlUdXBsZV9TRVRfSVRFTShyZXMsIDAsIHNlbGYpOwotCVB5VHVwbGVfU0VUX0lURU0ocmVzLCAxLCBvdGhlcik7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgb2sgPSBmdW5jKCZzZWxmLCAmb3RoZXIpOworICAgIGlmIChvayA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChvayA+IDApIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICByZXMgPSBQeVR1cGxlX05ldygyKTsKKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICBQeV9ERUNSRUYob3RoZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXMsIDAsIHNlbGYpOworICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzLCAxLCBvdGhlcik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfdGVybmFyeWZ1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXRlcm5hcnlmdW5jIGZ1bmMgPSAodGVybmFyeWZ1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqb3RoZXI7Ci0JUHlPYmplY3QgKnRoaXJkID0gUHlfTm9uZTsKKyAgICB0ZXJuYXJ5ZnVuYyBmdW5jID0gKHRlcm5hcnlmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKm90aGVyOworICAgIFB5T2JqZWN0ICp0aGlyZCA9IFB5X05vbmU7CiAKLQkvKiBOb3RlOiBUaGlzIHdyYXBwZXIgb25seSB3b3JrcyBmb3IgX19wb3dfXygpICovCisgICAgLyogTm90ZTogVGhpcyB3cmFwcGVyIG9ubHkgd29ya3MgZm9yIF9fcG93X18oKSAqLwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJm90aGVyLCAmdGhpcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKCpmdW5jKShzZWxmLCBvdGhlciwgdGhpcmQpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDIsICZvdGhlciwgJnRoaXJkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZiwgb3RoZXIsIHRoaXJkKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfdGVybmFyeWZ1bmNfcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JdGVybmFyeWZ1bmMgZnVuYyA9ICh0ZXJuYXJ5ZnVuYyl3cmFwcGVkOwotCVB5T2JqZWN0ICpvdGhlcjsKLQlQeU9iamVjdCAqdGhpcmQgPSBQeV9Ob25lOworICAgIHRlcm5hcnlmdW5jIGZ1bmMgPSAodGVybmFyeWZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb3RoZXI7CisgICAgUHlPYmplY3QgKnRoaXJkID0gUHlfTm9uZTsKIAotCS8qIE5vdGU6IFRoaXMgd3JhcHBlciBvbmx5IHdvcmtzIGZvciBfX3Bvd19fKCkgKi8KKyAgICAvKiBOb3RlOiBUaGlzIHdyYXBwZXIgb25seSB3b3JrcyBmb3IgX19wb3dfXygpICovCiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmb3RoZXIsICZ0aGlyZCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoKmZ1bmMpKG90aGVyLCBzZWxmLCB0aGlyZCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJm90aGVyLCAmdGhpcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKCpmdW5jKShvdGhlciwgc2VsZiwgdGhpcmQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF91bmFyeWZ1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXVuYXJ5ZnVuYyBmdW5jID0gKHVuYXJ5ZnVuYyl3cmFwcGVkOworICAgIHVuYXJ5ZnVuYyBmdW5jID0gKHVuYXJ5ZnVuYyl3cmFwcGVkOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICgqZnVuYykoc2VsZik7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2luZGV4YXJnZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jc3NpemVhcmdmdW5jIGZ1bmMgPSAoc3NpemVhcmdmdW5jKXdyYXBwZWQ7Ci0JUHlPYmplY3QqIG87Ci0JUHlfc3NpemVfdCBpOworICAgIHNzaXplYXJnZnVuYyBmdW5jID0gKHNzaXplYXJnZnVuYyl3cmFwcGVkOworICAgIFB5T2JqZWN0KiBvOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDEsICZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaSA9IFB5TnVtYmVyX0FzU3NpemVfdChvLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKLQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKCpmdW5jKShzZWxmLCBpKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAxLCAmbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGkgPSBQeU51bWJlcl9Bc1NzaXplX3QobywgUHlFeGNfT3ZlcmZsb3dFcnJvcik7CisgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZiwgaSk7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBnZXRpbmRleChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBpOwogCi0JaSA9IFB5TnVtYmVyX0FzU3NpemVfdChhcmcsIFB5RXhjX092ZXJmbG93RXJyb3IpOwotCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQlpZiAoaSA8IDApIHsKLQkJUHlTZXF1ZW5jZU1ldGhvZHMgKnNxID0gUHlfVFlQRShzZWxmKS0+dHBfYXNfc2VxdWVuY2U7Ci0JCWlmIChzcSAmJiBzcS0+c3FfbGVuZ3RoKSB7Ci0JCQlQeV9zc2l6ZV90IG4gPSAoKnNxLT5zcV9sZW5ndGgpKHNlbGYpOwotCQkJaWYgKG4gPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCWkgKz0gbjsKLQkJfQotCX0KLQlyZXR1cm4gaTsKKyAgICBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGFyZywgUHlFeGNfT3ZlcmZsb3dFcnJvcik7CisgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpIDwgMCkgeworICAgICAgICBQeVNlcXVlbmNlTWV0aG9kcyAqc3EgPSBQeV9UWVBFKHNlbGYpLT50cF9hc19zZXF1ZW5jZTsKKyAgICAgICAgaWYgKHNxICYmIHNxLT5zcV9sZW5ndGgpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbiA9ICgqc3EtPnNxX2xlbmd0aCkoc2VsZik7CisgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaSArPSBuOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9zcV9pdGVtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlzc2l6ZWFyZ2Z1bmMgZnVuYyA9IChzc2l6ZWFyZ2Z1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqYXJnOwotCVB5X3NzaXplX3QgaTsKKyAgICBzc2l6ZWFyZ2Z1bmMgZnVuYyA9IChzc2l6ZWFyZ2Z1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqYXJnOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDEpIHsKLQkJYXJnID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQkJaSA9IGdldGluZGV4KHNlbGYsIGFyZyk7Ci0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmV0dXJuICgqZnVuYykoc2VsZiwgaSk7Ci0JfQotCWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpOwotCWFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxKSB7CisgICAgICAgIGFyZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgICAgIGkgPSBnZXRpbmRleChzZWxmLCBhcmcpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiAoKmZ1bmMpKHNlbGYsIGkpOworICAgIH0KKyAgICBjaGVja19udW1fYXJncyhhcmdzLCAxKTsKKyAgICBhc3NlcnQoUHlFcnJfT2NjdXJyZWQoKSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX3NzaXplc3NpemVhcmdmdW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlzc2l6ZXNzaXplYXJnZnVuYyBmdW5jID0gKHNzaXplc3NpemVhcmdmdW5jKXdyYXBwZWQ7Ci0JUHlfc3NpemVfdCBpLCBqOworICAgIHNzaXplc3NpemVhcmdmdW5jIGZ1bmMgPSAoc3NpemVzc2l6ZWFyZ2Z1bmMpd3JhcHBlZDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5uIiwgJmksICZqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICgqZnVuYykoc2VsZiwgaSwgaik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJubiIsICZpLCAmaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoKmZ1bmMpKHNlbGYsIGksIGopOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9zcV9zZXRpdGVtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlzc2l6ZW9iamFyZ3Byb2MgZnVuYyA9IChzc2l6ZW9iamFyZ3Byb2Mpd3JhcHBlZDsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHJlczsKLQlQeU9iamVjdCAqYXJnLCAqdmFsdWU7CisgICAgc3NpemVvYmphcmdwcm9jIGZ1bmMgPSAoc3NpemVvYmphcmdwcm9jKXdyYXBwZWQ7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKmFyZywgKnZhbHVlOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJmFyZywgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaSA9IGdldGluZGV4KHNlbGYsIGFyZyk7Ci0JaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBpLCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJmFyZywgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaSA9IGdldGluZGV4KHNlbGYsIGFyZyk7CisgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmLCBpLCB2YWx1ZSk7CisgICAgaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX3NxX2RlbGl0ZW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXNzaXplb2JqYXJncHJvYyBmdW5jID0gKHNzaXplb2JqYXJncHJvYyl3cmFwcGVkOwotCVB5X3NzaXplX3QgaTsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICphcmc7CisgICAgc3NpemVvYmphcmdwcm9jIGZ1bmMgPSAoc3NpemVvYmphcmdwcm9jKXdyYXBwZWQ7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKmFyZzsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaSA9IGdldGluZGV4KHNlbGYsIGFyZyk7Ci0JaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBpLCBOVUxMKTsKLQlpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIGkgPSBnZXRpbmRleChzZWxmLCBhcmcpOworICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgaSwgTlVMTCk7CisgICAgaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX3NzaXplc3NpemVvYmphcmdwcm9jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlzc2l6ZXNzaXplb2JqYXJncHJvYyBmdW5jID0gKHNzaXplc3NpemVvYmphcmdwcm9jKXdyYXBwZWQ7Ci0JUHlfc3NpemVfdCBpLCBqOwotCWludCByZXM7Ci0JUHlPYmplY3QgKnZhbHVlOworICAgIHNzaXplc3NpemVvYmphcmdwcm9jIGZ1bmMgPSAoc3NpemVzc2l6ZW9iamFyZ3Byb2Mpd3JhcHBlZDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CisgICAgaW50IHJlczsKKyAgICBQeU9iamVjdCAqdmFsdWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5uTyIsICZpLCAmaiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBpLCBqLCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJubk8iLCAmaSwgJmosICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgaSwgaiwgdmFsdWUpOworICAgIGlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9kZWxzbGljZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jc3NpemVzc2l6ZW9iamFyZ3Byb2MgZnVuYyA9IChzc2l6ZXNzaXplb2JqYXJncHJvYyl3cmFwcGVkOwotCVB5X3NzaXplX3QgaSwgajsKLQlpbnQgcmVzOworICAgIHNzaXplc3NpemVvYmphcmdwcm9jIGZ1bmMgPSAoc3NpemVzc2l6ZW9iamFyZ3Byb2Mpd3JhcHBlZDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CisgICAgaW50IHJlczsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibm4iLCAmaSwgJmopKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYsIGksIGosIE5VTEwpOwotCWlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibm4iLCAmaSwgJmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSAoKmZ1bmMpKHNlbGYsIGksIGosIE5VTEwpOworICAgIGlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBYWFggb2Jqb2JqcHJvYyBpcyBhIG1pc25vbWVyOyBzaG91bGQgYmUgb2JqYXJncHJlZCAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfb2Jqb2JqcHJvYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jb2Jqb2JqcHJvYyBmdW5jID0gKG9iam9ianByb2Mpd3JhcHBlZDsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICp2YWx1ZTsKKyAgICBvYmpvYmpwcm9jIGZ1bmMgPSAob2Jqb2JqcHJvYyl3cmFwcGVkOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKnZhbHVlOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdmFsdWUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCXJlcyA9ICgqZnVuYykoc2VsZiwgdmFsdWUpOwotCWlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlcyk7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdmFsdWUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgdmFsdWUpOworICAgIGlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX29iam9iamFyZ3Byb2MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCW9iam9iamFyZ3Byb2MgZnVuYyA9IChvYmpvYmphcmdwcm9jKXdyYXBwZWQ7Ci0JaW50IHJlczsKLQlQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgb2Jqb2JqYXJncHJvYyBmdW5jID0gKG9iam9iamFyZ3Byb2Mpd3JhcHBlZDsKKyAgICBpbnQgcmVzOworICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDIsIDIsICZrZXksICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9ICgqZnVuYykoc2VsZiwga2V5LCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJmtleSwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmLCBrZXksIHZhbHVlKTsKKyAgICBpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfZGVsaXRlbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jb2Jqb2JqYXJncHJvYyBmdW5jID0gKG9iam9iamFyZ3Byb2Mpd3JhcHBlZDsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICprZXk7CisgICAgb2Jqb2JqYXJncHJvYyBmdW5jID0gKG9iam9iamFyZ3Byb2Mpd3JhcHBlZDsKKyAgICBpbnQgcmVzOworICAgIFB5T2JqZWN0ICprZXk7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlrZXkgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCXJlcyA9ICgqZnVuYykoc2VsZiwga2V5LCBOVUxMKTsKLQlpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBrZXkgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwga2V5LCBOVUxMKTsKKyAgICBpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfY21wZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JY21wZnVuYyBmdW5jID0gKGNtcGZ1bmMpd3JhcHBlZDsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICpvdGhlcjsKKyAgICBjbXBmdW5jIGZ1bmMgPSAoY21wZnVuYyl3cmFwcGVkOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKm90aGVyOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCWlmIChQeV9UWVBFKG90aGVyKS0+dHBfY29tcGFyZSAhPSBmdW5jICYmCi0JICAgICFQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob3RoZXIpLCBQeV9UWVBFKHNlbGYpKSkgewotCQlQeUVycl9Gb3JtYXQoCi0JCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkiJXMuX19jbXBfXyh4LHkpIHJlcXVpcmVzIHkgdG8gYmUgYSAnJXMnLCBub3QgYSAnJXMnIiwKLQkJCVB5X1RZUEUoc2VsZiktPnRwX25hbWUsCi0JCQlQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAotCQkJUHlfVFlQRShvdGhlciktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBvdGhlcik7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXMpOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBpZiAoUHlfVFlQRShvdGhlciktPnRwX2NvbXBhcmUgIT0gZnVuYyAmJgorICAgICAgICAhUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG90aGVyKSwgUHlfVFlQRShzZWxmKSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIiVzLl9fY21wX18oeCx5KSByZXF1aXJlcyB5IHRvIGJlIGEgJyVzJywgbm90IGEgJyVzJyIsCisgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAorICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKKyAgICAgICAgICAgIFB5X1RZUEUob3RoZXIpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgb3RoZXIpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmVzKTsKIH0KIAogLyogSGVscGVyIHRvIGNoZWNrIGZvciBvYmplY3QuX19zZXRhdHRyX18gb3IgX19kZWxhdHRyX18gYXBwbGllZCB0byBhIHR5cGUuCkBAIC00NTM5LDkwICs0NTM5LDkwIEBACiBzdGF0aWMgaW50CiBoYWNrY2hlY2soUHlPYmplY3QgKnNlbGYsIHNldGF0dHJvZnVuYyBmdW5jLCBjaGFyICp3aGF0KQogewotCVB5VHlwZU9iamVjdCAqdHlwZSA9IFB5X1RZUEUoc2VsZik7Ci0Jd2hpbGUgKHR5cGUgJiYgdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQotCQl0eXBlID0gdHlwZS0+dHBfYmFzZTsKLQkvKiBJZiB0eXBlIGlzIE5VTEwgbm93LCB0aGlzIGlzIGEgcmVhbGx5IHdlaXJkIHR5cGUuCi0JICAgSW4gdGhlIHNwaXJpdCBvZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoPyksIGp1c3Qgc2h1dCB1cC4gKi8KLQlpZiAodHlwZSAmJiB0eXBlLT50cF9zZXRhdHRybyAhPSBmdW5jKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYW4ndCBhcHBseSB0aGlzICVzIHRvICVzIG9iamVjdCIsCi0JCQkgICAgIHdoYXQsCi0JCQkgICAgIHR5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlID0gUHlfVFlQRShzZWxmKTsKKyAgICB3aGlsZSAodHlwZSAmJiB0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCisgICAgICAgIHR5cGUgPSB0eXBlLT50cF9iYXNlOworICAgIC8qIElmIHR5cGUgaXMgTlVMTCBub3csIHRoaXMgaXMgYSByZWFsbHkgd2VpcmQgdHlwZS4KKyAgICAgICBJbiB0aGUgc3Bpcml0IG9mIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICg/KSwganVzdCBzaHV0IHVwLiAqLworICAgIGlmICh0eXBlICYmIHR5cGUtPnRwX3NldGF0dHJvICE9IGZ1bmMpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBhcHBseSB0aGlzICVzIHRvICVzIG9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICB3aGF0LAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfc2V0YXR0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jc2V0YXR0cm9mdW5jIGZ1bmMgPSAoc2V0YXR0cm9mdW5jKXdyYXBwZWQ7Ci0JaW50IHJlczsKLQlQeU9iamVjdCAqbmFtZSwgKnZhbHVlOworICAgIHNldGF0dHJvZnVuYyBmdW5jID0gKHNldGF0dHJvZnVuYyl3cmFwcGVkOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKm5hbWUsICp2YWx1ZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDIsIDIsICZuYW1lLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWhhY2tjaGVjayhzZWxmLCBmdW5jLCAiX19zZXRhdHRyX18iKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBuYW1lLCB2YWx1ZSk7Ci0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAyLCAyLCAmbmFtZSwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFoYWNrY2hlY2soc2VsZiwgZnVuYywgIl9fc2V0YXR0cl9fIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgbmFtZSwgdmFsdWUpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2RlbGF0dHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXNldGF0dHJvZnVuYyBmdW5jID0gKHNldGF0dHJvZnVuYyl3cmFwcGVkOwotCWludCByZXM7Ci0JUHlPYmplY3QgKm5hbWU7CisgICAgc2V0YXR0cm9mdW5jIGZ1bmMgPSAoc2V0YXR0cm9mdW5jKXdyYXBwZWQ7CisgICAgaW50IHJlczsKKyAgICBQeU9iamVjdCAqbmFtZTsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCi0JCXJldHVybiBOVUxMOwotCW5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCWlmICghaGFja2NoZWNrKHNlbGYsIGZ1bmMsICJfX2RlbGF0dHJfXyIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYsIG5hbWUsIE5VTEwpOwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgaWYgKCFoYWNrY2hlY2soc2VsZiwgZnVuYywgIl9fZGVsYXR0cl9fIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgbmFtZSwgTlVMTCk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfaGFzaGZ1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWhhc2hmdW5jIGZ1bmMgPSAoaGFzaGZ1bmMpd3JhcHBlZDsKLQlsb25nIHJlczsKKyAgICBoYXNoZnVuYyBmdW5jID0gKGhhc2hmdW5jKXdyYXBwZWQ7CisgICAgbG9uZyByZXM7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDApKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYpOwotCWlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlcyk7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmKTsKKyAgICBpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyZXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9jYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCwgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JdGVybmFyeWZ1bmMgZnVuYyA9ICh0ZXJuYXJ5ZnVuYyl3cmFwcGVkOworICAgIHRlcm5hcnlmdW5jIGZ1bmMgPSAodGVybmFyeWZ1bmMpd3JhcHBlZDsKIAotCXJldHVybiAoKmZ1bmMpKHNlbGYsIGFyZ3MsIGt3ZHMpOworICAgIHJldHVybiAoKmZ1bmMpKHNlbGYsIGFyZ3MsIGt3ZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9yaWNoY21wZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQsIGludCBvcCkKIHsKLQlyaWNoY21wZnVuYyBmdW5jID0gKHJpY2hjbXBmdW5jKXdyYXBwZWQ7Ci0JUHlPYmplY3QgKm90aGVyOworICAgIHJpY2hjbXBmdW5jIGZ1bmMgPSAocmljaGNtcGZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb3RoZXI7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JcmV0dXJuICgqZnVuYykoc2VsZiwgb3RoZXIsIG9wKTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZiwgb3RoZXIsIG9wKTsKIH0KIAogI3VuZGVmIFJJQ0hDTVBfV1JBUFBFUgpAQCAtNDYzMCw3ICs0NjMwLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqIFwKIHJpY2hjbXBfIyNOQU1FKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkgXAogeyBcCi0JcmV0dXJuIHdyYXBfcmljaGNtcGZ1bmMoc2VsZiwgYXJncywgd3JhcHBlZCwgT1ApOyBcCisgICAgcmV0dXJuIHdyYXBfcmljaGNtcGZ1bmMoc2VsZiwgYXJncywgd3JhcHBlZCwgT1ApOyBcCiB9CiAKIFJJQ0hDTVBfV1JBUFBFUihsdCwgUHlfTFQpCkBAIC00NjQzLDE2NCArNDY0MywxNjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX25leHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXVuYXJ5ZnVuYyBmdW5jID0gKHVuYXJ5ZnVuYyl3cmFwcGVkOwotCVB5T2JqZWN0ICpyZXM7CisgICAgdW5hcnlmdW5jIGZ1bmMgPSAodW5hcnlmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMCkpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9ICgqZnVuYykoc2VsZik7Ci0JaWYgKHJlcyA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQotCQlQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOwotCXJldHVybiByZXM7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmKTsKKyAgICBpZiAocmVzID09IE5VTEwgJiYgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfZGVzY3JfZ2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlkZXNjcmdldGZ1bmMgZnVuYyA9IChkZXNjcmdldGZ1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqb2JqOwotCVB5T2JqZWN0ICp0eXBlID0gTlVMTDsKKyAgICBkZXNjcmdldGZ1bmMgZnVuYyA9IChkZXNjcmdldGZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIFB5T2JqZWN0ICp0eXBlID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDIsICZvYmosICZ0eXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG9iaiA9PSBQeV9Ob25lKQotCQlvYmogPSBOVUxMOwotCWlmICh0eXBlID09IFB5X05vbmUpCi0JCXR5cGUgPSBOVUxMOwotCWlmICh0eXBlID09IE5VTEwgJiZvYmogPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2dldF9fKE5vbmUsIE5vbmUpIGlzIGludmFsaWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKmZ1bmMpKHNlbGYsIG9iaiwgdHlwZSk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJm9iaiwgJnR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAob2JqID09IFB5X05vbmUpCisgICAgICAgIG9iaiA9IE5VTEw7CisgICAgaWYgKHR5cGUgPT0gUHlfTm9uZSkKKyAgICAgICAgdHlwZSA9IE5VTEw7CisgICAgaWYgKHR5cGUgPT0gTlVMTCAmJm9iaiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19nZXRfXyhOb25lLCBOb25lKSBpcyBpbnZhbGlkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKCpmdW5jKShzZWxmLCBvYmosIHR5cGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9kZXNjcl9zZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWRlc2Nyc2V0ZnVuYyBmdW5jID0gKGRlc2Nyc2V0ZnVuYyl3cmFwcGVkOwotCVB5T2JqZWN0ICpvYmosICp2YWx1ZTsKLQlpbnQgcmV0OworICAgIGRlc2Nyc2V0ZnVuYyBmdW5jID0gKGRlc2Nyc2V0ZnVuYyl3cmFwcGVkOworICAgIFB5T2JqZWN0ICpvYmosICp2YWx1ZTsKKyAgICBpbnQgcmV0OwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJm9iaiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0ID0gKCpmdW5jKShzZWxmLCBvYmosIHZhbHVlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDIsIDIsICZvYmosICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldCA9ICgqZnVuYykoc2VsZiwgb2JqLCB2YWx1ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfZGVzY3JfZGVsZXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlkZXNjcnNldGZ1bmMgZnVuYyA9IChkZXNjcnNldGZ1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqb2JqOwotCWludCByZXQ7CisgICAgZGVzY3JzZXRmdW5jIGZ1bmMgPSAoZGVzY3JzZXRmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBpbnQgcmV0OwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb2JqID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlyZXQgPSAoKmZ1bmMpKHNlbGYsIG9iaiwgTlVMTCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvYmogPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIHJldCA9ICgqZnVuYykoc2VsZiwgb2JqLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCwgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaW5pdHByb2MgZnVuYyA9IChpbml0cHJvYyl3cmFwcGVkOworICAgIGluaXRwcm9jIGZ1bmMgPSAoaW5pdHByb2Mpd3JhcHBlZDsKIAotCWlmIChmdW5jKHNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChmdW5jKHNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHBfbmV3X3dyYXBwZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGUsICpzdWJ0eXBlLCAqc3RhdGljYmFzZTsKLQlQeU9iamVjdCAqYXJnMCwgKnJlczsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGUsICpzdWJ0eXBlLCAqc3RhdGljYmFzZTsKKyAgICBQeU9iamVjdCAqYXJnMCwgKnJlczsKIAotCWlmIChzZWxmID09IE5VTEwgfHwgIVB5VHlwZV9DaGVjayhzZWxmKSkKLQkJUHlfRmF0YWxFcnJvcigiX19uZXdfXygpIGNhbGxlZCB3aXRoIG5vbi10eXBlICdzZWxmJyIpOwotCXR5cGUgPSAoUHlUeXBlT2JqZWN0ICopc2VsZjsKLQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykgfHwgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8IDEpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiVzLl9fbmV3X18oKTogbm90IGVub3VnaCBhcmd1bWVudHMiLAotCQkJICAgICB0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWFyZzAgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCWlmICghUHlUeXBlX0NoZWNrKGFyZzApKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIlcy5fX25ld19fKFgpOiBYIGlzIG5vdCBhIHR5cGUgb2JqZWN0ICglcykiLAotCQkJICAgICB0eXBlLT50cF9uYW1lLAotCQkJICAgICBQeV9UWVBFKGFyZzApLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN1YnR5cGUgPSAoUHlUeXBlT2JqZWN0ICopYXJnMDsKLQlpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoc3VidHlwZSwgdHlwZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiVzLl9fbmV3X18oJXMpOiAlcyBpcyBub3QgYSBzdWJ0eXBlIG9mICVzIiwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgc3VidHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgc3VidHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2VsZiA9PSBOVUxMIHx8ICFQeVR5cGVfQ2hlY2soc2VsZikpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIl9fbmV3X18oKSBjYWxsZWQgd2l0aCBub24tdHlwZSAnc2VsZiciKTsKKyAgICB0eXBlID0gKFB5VHlwZU9iamVjdCAqKXNlbGY7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpIHx8IFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPCAxKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMuX19uZXdfXygpOiBub3QgZW5vdWdoIGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFyZzAgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIGlmICghUHlUeXBlX0NoZWNrKGFyZzApKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMuX19uZXdfXyhYKTogWCBpcyBub3QgYSB0eXBlIG9iamVjdCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZzApLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN1YnR5cGUgPSAoUHlUeXBlT2JqZWN0ICopYXJnMDsKKyAgICBpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoc3VidHlwZSwgdHlwZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlcy5fX25ld19fKCVzKTogJXMgaXMgbm90IGEgc3VidHlwZSBvZiAlcyIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgc3VidHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ2hlY2sgdGhhdCB0aGUgdXNlIGRvZXNuJ3QgZG8gc29tZXRoaW5nIHNpbGx5IGFuZCB1bnNhZmUgbGlrZQotCSAgIG9iamVjdC5fX25ld19fKGRpY3QpLiAgVG8gZG8gdGhpcywgd2UgY2hlY2sgdGhhdCB0aGUKLQkgICBtb3N0IGRlcml2ZWQgYmFzZSB0aGF0J3Mgbm90IGEgaGVhcCB0eXBlIGlzIHRoaXMgdHlwZS4gKi8KLQlzdGF0aWNiYXNlID0gc3VidHlwZTsKLQl3aGlsZSAoc3RhdGljYmFzZSAmJiAoc3RhdGljYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKLQkJc3RhdGljYmFzZSA9IHN0YXRpY2Jhc2UtPnRwX2Jhc2U7Ci0JLyogSWYgc3RhdGljYmFzZSBpcyBOVUxMIG5vdywgaXQgaXMgYSByZWFsbHkgd2VpcmQgdHlwZS4KLQkgICBJbiB0aGUgc3Bpcml0IG9mIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICg/KSwganVzdCBzaHV0IHVwLiAqLwotCWlmIChzdGF0aWNiYXNlICYmIHN0YXRpY2Jhc2UtPnRwX25ldyAhPSB0eXBlLT50cF9uZXcpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiVzLl9fbmV3X18oJXMpIGlzIG5vdCBzYWZlLCB1c2UgJXMuX19uZXdfXygpIiwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgc3VidHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgc3RhdGljYmFzZSA9PSBOVUxMID8gIj8iIDogc3RhdGljYmFzZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBDaGVjayB0aGF0IHRoZSB1c2UgZG9lc24ndCBkbyBzb21ldGhpbmcgc2lsbHkgYW5kIHVuc2FmZSBsaWtlCisgICAgICAgb2JqZWN0Ll9fbmV3X18oZGljdCkuICBUbyBkbyB0aGlzLCB3ZSBjaGVjayB0aGF0IHRoZQorICAgICAgIG1vc3QgZGVyaXZlZCBiYXNlIHRoYXQncyBub3QgYSBoZWFwIHR5cGUgaXMgdGhpcyB0eXBlLiAqLworICAgIHN0YXRpY2Jhc2UgPSBzdWJ0eXBlOworICAgIHdoaWxlIChzdGF0aWNiYXNlICYmIChzdGF0aWNiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKQorICAgICAgICBzdGF0aWNiYXNlID0gc3RhdGljYmFzZS0+dHBfYmFzZTsKKyAgICAvKiBJZiBzdGF0aWNiYXNlIGlzIE5VTEwgbm93LCBpdCBpcyBhIHJlYWxseSB3ZWlyZCB0eXBlLgorICAgICAgIEluIHRoZSBzcGlyaXQgb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKD8pLCBqdXN0IHNodXQgdXAuICovCisgICAgaWYgKHN0YXRpY2Jhc2UgJiYgc3RhdGljYmFzZS0+dHBfbmV3ICE9IHR5cGUtPnRwX25ldykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiVzLl9fbmV3X18oJXMpIGlzIG5vdCBzYWZlLCB1c2UgJXMuX19uZXdfXygpIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljYmFzZSA9PSBOVUxMID8gIj8iIDogc3RhdGljYmFzZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIFB5VHVwbGVfR0VUX1NJWkUoYXJncykpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9IHR5cGUtPnRwX25ldyhzdWJ0eXBlLCBhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHJlczsKKyAgICBhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSB0eXBlLT50cF9uZXcoc3VidHlwZSwgYXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgdHBfbmV3X21ldGhvZGRlZltdID0gewotCXsiX19uZXdfXyIsIChQeUNGdW5jdGlvbil0cF9uZXdfd3JhcHBlciwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigiVC5fX25ld19fKFMsIC4uLikgLT4gIgotCQkgICAiYSBuZXcgb2JqZWN0IHdpdGggdHlwZSBTLCBhIHN1YnR5cGUgb2YgVCIpfSwKLQl7MH0KKyAgICB7Il9fbmV3X18iLCAoUHlDRnVuY3Rpb24pdHBfbmV3X3dyYXBwZXIsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAorICAgICBQeURvY19TVFIoIlQuX19uZXdfXyhTLCAuLi4pIC0+ICIKKyAgICAgICAgICAgICAgICJhIG5ldyBvYmplY3Qgd2l0aCB0eXBlIFMsIGEgc3VidHlwZSBvZiBUIil9LAorICAgIHswfQogfTsKIAogc3RhdGljIGludAogYWRkX3RwX25ld193cmFwcGVyKFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqZnVuYzsKIAotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCAiX19uZXdfXyIpICE9IE5VTEwpCi0JCXJldHVybiAwOwotCWZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcodHBfbmV3X21ldGhvZGRlZiwgKFB5T2JqZWN0ICopdHlwZSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCAiX19uZXdfXyIsIGZ1bmMpKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX25ld19fIikgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyh0cF9uZXdfbWV0aG9kZGVmLCAoUHlPYmplY3QgKil0eXBlKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX25ld19fIiwgZnVuYykpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogU2xvdCB3cmFwcGVycyB0aGF0IGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgX19mb29fXyBzbG90LiAgU2VlIGNvbW1lbnRzCkBAIC00ODEwLDE2ICs0ODEwLDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKiBcCiBGVU5DTkFNRShQeU9iamVjdCAqc2VsZikgXAogeyBcCi0Jc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHI7IFwKLQlyZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsICIoKSIpOyBcCisgICAgc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHI7IFwKKyAgICByZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsICIoKSIpOyBcCiB9CiAKICNkZWZpbmUgU0xPVDEoRlVOQ05BTUUsIE9QU1RSLCBBUkcxVFlQRSwgQVJHQ09ERVMpIFwKIHN0YXRpYyBQeU9iamVjdCAqIFwKIEZVTkNOQU1FKFB5T2JqZWN0ICpzZWxmLCBBUkcxVFlQRSBhcmcxKSBcCiB7IFwKLQlzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0cjsgXAotCXJldHVybiBjYWxsX21ldGhvZChzZWxmLCBPUFNUUiwgJmNhY2hlX3N0ciwgIigiIEFSR0NPREVTICIpIiwgYXJnMSk7IFwKKyAgICBzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0cjsgXAorICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCBPUFNUUiwgJmNhY2hlX3N0ciwgIigiIEFSR0NPREVTICIpIiwgYXJnMSk7IFwKIH0KIAogLyogQm9vbGVhbiBoZWxwZXIgZm9yIFNMT1QxQklORlVMTCgpLgpAQCAtNDgyNywzMyArNDgyNywzMyBAQAogc3RhdGljIGludAogbWV0aG9kX2lzX292ZXJsb2FkZWQoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCwgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqYSwgKmI7Ci0JaW50IG9rOworICAgIFB5T2JqZWN0ICphLCAqYjsKKyAgICBpbnQgb2s7CiAKLQliID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKikoUHlfVFlQRShyaWdodCkpLCBuYW1lKTsKLQlpZiAoYiA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCS8qIElmIHJpZ2h0IGRvZXNuJ3QgaGF2ZSBpdCwgaXQncyBub3Qgb3ZlcmxvYWRlZCAqLwotCQlyZXR1cm4gMDsKLQl9CisgICAgYiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopKFB5X1RZUEUocmlnaHQpKSwgbmFtZSk7CisgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAvKiBJZiByaWdodCBkb2Vzbid0IGhhdmUgaXQsIGl0J3Mgbm90IG92ZXJsb2FkZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JYSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopKFB5X1RZUEUobGVmdCkpLCBuYW1lKTsKLQlpZiAoYSA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X0RFQ1JFRihiKTsKLQkJLyogSWYgcmlnaHQgaGFzIGl0IGJ1dCBsZWZ0IGRvZXNuJ3QsIGl0J3Mgb3ZlcmxvYWRlZCAqLwotCQlyZXR1cm4gMTsKLQl9CisgICAgYSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopKFB5X1RZUEUobGVmdCkpLCBuYW1lKTsKKyAgICBpZiAoYSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X0RFQ1JFRihiKTsKKyAgICAgICAgLyogSWYgcmlnaHQgaGFzIGl0IGJ1dCBsZWZ0IGRvZXNuJ3QsIGl0J3Mgb3ZlcmxvYWRlZCAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQlvayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChhLCBiLCBQeV9ORSk7Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlpZiAob2sgPCAwKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBvayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChhLCBiLCBQeV9ORSk7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICBpZiAob2sgPCAwKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJldHVybiBvazsKKyAgICByZXR1cm4gb2s7CiB9CiAKIApAQCAtNDg2MSw2OCArNDg2MSw2OCBAQAogc3RhdGljIFB5T2JqZWN0ICogXAogRlVOQ05BTUUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlcikgXAogeyBcCi0Jc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHIsICpyY2FjaGVfc3RyOyBcCi0JaW50IGRvX290aGVyID0gUHlfVFlQRShzZWxmKSAhPSBQeV9UWVBFKG90aGVyKSAmJiBcCi0JICAgIFB5X1RZUEUob3RoZXIpLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJiBcCi0JICAgIFB5X1RZUEUob3RoZXIpLT50cF9hc19udW1iZXItPlNMT1ROQU1FID09IFRFU1RGVU5DOyBcCi0JaWYgKFB5X1RZUEUoc2VsZiktPnRwX2FzX251bWJlciAhPSBOVUxMICYmIFwKLQkgICAgUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyLT5TTE9UTkFNRSA9PSBURVNURlVOQykgeyBcCi0JCVB5T2JqZWN0ICpyOyBcCi0JCWlmIChkb19vdGhlciAmJiBcCi0JCSAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob3RoZXIpLCBQeV9UWVBFKHNlbGYpKSAmJiBcCi0JCSAgICBtZXRob2RfaXNfb3ZlcmxvYWRlZChzZWxmLCBvdGhlciwgUk9QU1RSKSkgeyBcCi0JCQlyID0gY2FsbF9tYXliZSggXAotCQkJCW90aGVyLCBST1BTVFIsICZyY2FjaGVfc3RyLCAiKE8pIiwgc2VsZik7IFwKLQkJCWlmIChyICE9IFB5X05vdEltcGxlbWVudGVkKSBcCi0JCQkJcmV0dXJuIHI7IFwKLQkJCVB5X0RFQ1JFRihyKTsgXAotCQkJZG9fb3RoZXIgPSAwOyBcCi0JCX0gXAotCQlyID0gY2FsbF9tYXliZSggXAotCQkJc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsICIoTykiLCBvdGhlcik7IFwKLQkJaWYgKHIgIT0gUHlfTm90SW1wbGVtZW50ZWQgfHwgXAotCQkgICAgUHlfVFlQRShvdGhlcikgPT0gUHlfVFlQRShzZWxmKSkgXAotCQkJcmV0dXJuIHI7IFwKLQkJUHlfREVDUkVGKHIpOyBcCi0JfSBcCi0JaWYgKGRvX290aGVyKSB7IFwKLQkJcmV0dXJuIGNhbGxfbWF5YmUoIFwKLQkJCW90aGVyLCBST1BTVFIsICZyY2FjaGVfc3RyLCAiKE8pIiwgc2VsZik7IFwKLQl9IFwKLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOyBcCi0JcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOyBcCisgICAgc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHIsICpyY2FjaGVfc3RyOyBcCisgICAgaW50IGRvX290aGVyID0gUHlfVFlQRShzZWxmKSAhPSBQeV9UWVBFKG90aGVyKSAmJiBcCisgICAgICAgIFB5X1RZUEUob3RoZXIpLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJiBcCisgICAgICAgIFB5X1RZUEUob3RoZXIpLT50cF9hc19udW1iZXItPlNMT1ROQU1FID09IFRFU1RGVU5DOyBcCisgICAgaWYgKFB5X1RZUEUoc2VsZiktPnRwX2FzX251bWJlciAhPSBOVUxMICYmIFwKKyAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyLT5TTE9UTkFNRSA9PSBURVNURlVOQykgeyBcCisgICAgICAgIFB5T2JqZWN0ICpyOyBcCisgICAgICAgIGlmIChkb19vdGhlciAmJiBcCisgICAgICAgICAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob3RoZXIpLCBQeV9UWVBFKHNlbGYpKSAmJiBcCisgICAgICAgICAgICBtZXRob2RfaXNfb3ZlcmxvYWRlZChzZWxmLCBvdGhlciwgUk9QU1RSKSkgeyBcCisgICAgICAgICAgICByID0gY2FsbF9tYXliZSggXAorICAgICAgICAgICAgICAgIG90aGVyLCBST1BTVFIsICZyY2FjaGVfc3RyLCAiKE8pIiwgc2VsZik7IFwKKyAgICAgICAgICAgIGlmIChyICE9IFB5X05vdEltcGxlbWVudGVkKSBcCisgICAgICAgICAgICAgICAgcmV0dXJuIHI7IFwKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyKTsgXAorICAgICAgICAgICAgZG9fb3RoZXIgPSAwOyBcCisgICAgICAgIH0gXAorICAgICAgICByID0gY2FsbF9tYXliZSggXAorICAgICAgICAgICAgc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsICIoTykiLCBvdGhlcik7IFwKKyAgICAgICAgaWYgKHIgIT0gUHlfTm90SW1wbGVtZW50ZWQgfHwgXAorICAgICAgICAgICAgUHlfVFlQRShvdGhlcikgPT0gUHlfVFlQRShzZWxmKSkgXAorICAgICAgICAgICAgcmV0dXJuIHI7IFwKKyAgICAgICAgUHlfREVDUkVGKHIpOyBcCisgICAgfSBcCisgICAgaWYgKGRvX290aGVyKSB7IFwKKyAgICAgICAgcmV0dXJuIGNhbGxfbWF5YmUoIFwKKyAgICAgICAgICAgIG90aGVyLCBST1BTVFIsICZyY2FjaGVfc3RyLCAiKE8pIiwgc2VsZik7IFwKKyAgICB9IFwKKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOyBcCisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOyBcCiB9CiAKICNkZWZpbmUgU0xPVDFCSU4oRlVOQ05BTUUsIFNMT1ROQU1FLCBPUFNUUiwgUk9QU1RSKSBcCi0JU0xPVDFCSU5GVUxMKEZVTkNOQU1FLCBGVU5DTkFNRSwgU0xPVE5BTUUsIE9QU1RSLCBST1BTVFIpCisgICAgU0xPVDFCSU5GVUxMKEZVTkNOQU1FLCBGVU5DTkFNRSwgU0xPVE5BTUUsIE9QU1RSLCBST1BTVFIpCiAKICNkZWZpbmUgU0xPVDIoRlVOQ05BTUUsIE9QU1RSLCBBUkcxVFlQRSwgQVJHMlRZUEUsIEFSR0NPREVTKSBcCiBzdGF0aWMgUHlPYmplY3QgKiBcCiBGVU5DTkFNRShQeU9iamVjdCAqc2VsZiwgQVJHMVRZUEUgYXJnMSwgQVJHMlRZUEUgYXJnMikgXAogeyBcCi0Jc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHI7IFwKLQlyZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsIFwKLQkJCSAgICIoIiBBUkdDT0RFUyAiKSIsIGFyZzEsIGFyZzIpOyBcCisgICAgc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHI7IFwKKyAgICByZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgT1BTVFIsICZjYWNoZV9zdHIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIigiIEFSR0NPREVTICIpIiwgYXJnMSwgYXJnMik7IFwKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIHNsb3Rfc3FfbGVuZ3RoKFB5T2JqZWN0ICpzZWxmKQogewotCXN0YXRpYyBQeU9iamVjdCAqbGVuX3N0cjsKLQlQeU9iamVjdCAqcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fbGVuX18iLCAmbGVuX3N0ciwgIigpIik7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgc3RhdGljIFB5T2JqZWN0ICpsZW5fc3RyOworICAgIFB5T2JqZWN0ICpyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19sZW5fXyIsICZsZW5fc3RyLCAiKCkiKTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWxlbiA9IFB5SW50X0FzU3NpemVfdChyZXMpOwotCVB5X0RFQ1JFRihyZXMpOwotCWlmIChsZW4gPCAwKSB7Ci0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiX19sZW5fXygpIHNob3VsZCByZXR1cm4gPj0gMCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBsZW47CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbGVuID0gUHlJbnRfQXNTc2l6ZV90KHJlcyk7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fbGVuX18oKSBzaG91bGQgcmV0dXJuID49IDAiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbGVuOwogfQogCiAvKiBTdXBlci1vcHRpbWl6ZWQgdmVyc2lvbiBvZiBzbG90X3NxX2l0ZW0uCkBAIC00OTMwLDEzMSArNDkzMCwxMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3NxX2l0ZW0oUHlPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaSkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmdldGl0ZW1fc3RyOwotCVB5T2JqZWN0ICpmdW5jLCAqYXJncyA9IE5VTEwsICppdmFsID0gTlVMTCwgKnJldHZhbCA9IE5VTEw7Ci0JZGVzY3JnZXRmdW5jIGY7CisgICAgc3RhdGljIFB5T2JqZWN0ICpnZXRpdGVtX3N0cjsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3MgPSBOVUxMLCAqaXZhbCA9IE5VTEwsICpyZXR2YWwgPSBOVUxMOworICAgIGRlc2NyZ2V0ZnVuYyBmOwogCi0JaWYgKGdldGl0ZW1fc3RyID09IE5VTEwpIHsKLQkJZ2V0aXRlbV9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOwotCQlpZiAoZ2V0aXRlbV9zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShzZWxmKSwgZ2V0aXRlbV9zdHIpOwotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJaWYgKChmID0gUHlfVFlQRShmdW5jKS0+dHBfZGVzY3JfZ2V0KSA9PSBOVUxMKQotCQkJUHlfSU5DUkVGKGZ1bmMpOwotCQllbHNlIHsKLQkJCWZ1bmMgPSBmKGZ1bmMsIHNlbGYsIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKSk7Ci0JCQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJaXZhbCA9IFB5SW50X0Zyb21Tc2l6ZV90KGkpOwotCQlpZiAoaXZhbCAhPSBOVUxMKSB7Ci0JCQlhcmdzID0gUHlUdXBsZV9OZXcoMSk7Ci0JCQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCQkJUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBpdmFsKTsKLQkJCQlyZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotCQkJCVB5X1hERUNSRUYoYXJncyk7Ci0JCQkJUHlfWERFQ1JFRihmdW5jKTsKLQkJCQlyZXR1cm4gcmV0dmFsOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIGdldGl0ZW1fc3RyKTsKLQl9Ci0JUHlfWERFQ1JFRihhcmdzKTsKLQlQeV9YREVDUkVGKGl2YWwpOwotCVB5X1hERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGdldGl0ZW1fc3RyID09IE5VTEwpIHsKKyAgICAgICAgZ2V0aXRlbV9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOworICAgICAgICBpZiAoZ2V0aXRlbV9zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmdW5jID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShzZWxmKSwgZ2V0aXRlbV9zdHIpOworICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKChmID0gUHlfVFlQRShmdW5jKS0+dHBfZGVzY3JfZ2V0KSA9PSBOVUxMKQorICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZ1bmMgPSBmKGZ1bmMsIHNlbGYsIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKSk7CisgICAgICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaXZhbCA9IFB5SW50X0Zyb21Tc2l6ZV90KGkpOworICAgICAgICBpZiAoaXZhbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMSk7CisgICAgICAgICAgICBpZiAoYXJncyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBpdmFsKTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIGdldGl0ZW1fc3RyKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICBQeV9YREVDUkVGKGl2YWwpOworICAgIFB5X1hERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHNsb3Rfc3Ffc2xpY2UoUHlPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBqKQogewotCXN0YXRpYyBQeU9iamVjdCAqZ2V0c2xpY2Vfc3RyOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX2dldHNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZDsgIgotCQkJICAgICJ1c2UgX19nZXRpdGVtX18iLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19nZXRzbGljZV9fIiwgJmdldHNsaWNlX3N0ciwKLQkJIm5uIiwgaSwgaik7CisgICAgc3RhdGljIFB5T2JqZWN0ICpnZXRzbGljZV9zdHI7CisKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19nZXRzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgX19nZXRpdGVtX18iLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19nZXRzbGljZV9fIiwgJmdldHNsaWNlX3N0ciwKKyAgICAgICAgIm5uIiwgaSwgaik7CiB9CiAKIHN0YXRpYyBpbnQKIHNsb3Rfc3FfYXNzX2l0ZW0oUHlPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqZGVsaXRlbV9zdHIsICpzZXRpdGVtX3N0cjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVsaXRlbV9zdHIsICpzZXRpdGVtX3N0cjsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKQotCQlyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxpdGVtX18iLCAmZGVsaXRlbV9zdHIsCi0JCQkJICAiKG4pIiwgaW5kZXgpOwotCWVsc2UKLQkJcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fc2V0aXRlbV9fIiwgJnNldGl0ZW1fc3RyLAotCQkJCSAgIihuTykiLCBpbmRleCwgdmFsdWUpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiAwOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxpdGVtX18iLCAmZGVsaXRlbV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIobikiLCBpbmRleCk7CisgICAgZWxzZQorICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19zZXRpdGVtX18iLCAmc2V0aXRlbV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIobk8pIiwgaW5kZXgsIHZhbHVlKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogc2xvdF9zcV9hc3Nfc2xpY2UoUHlPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBqLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlzdGF0aWMgUHlPYmplY3QgKmRlbHNsaWNlX3N0ciwgKnNldHNsaWNlX3N0cjsKLQkKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19kZWxzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQ7ICIKLQkJCQkgICAidXNlIF9fZGVsaXRlbV9fIiwgMSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxzbGljZV9fIiwgJmRlbHNsaWNlX3N0ciwKLQkJCQkgICIobm4pIiwgaSwgaik7Ci0JfQotCWVsc2UgewotCQlpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19zZXRzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQ7ICIKLQkJCQkJInVzZSBfX3NldGl0ZW1fXyIsIDEpIDwgMCkKLQkJCXJldHVybiAtMTsJCQotCQlyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19zZXRzbGljZV9fIiwgJnNldHNsaWNlX3N0ciwKLQkJCSAgIihubk8pIiwgaSwgaiwgdmFsdWUpOwotCX0KLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVsc2xpY2Vfc3RyLCAqc2V0c2xpY2Vfc3RyOworCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJpbiAzLngsIF9fZGVsc2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIF9fZGVsaXRlbV9fIiwgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxzbGljZV9fIiwgJmRlbHNsaWNlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihubikiLCBpLCBqKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX3NldHNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIF9fc2V0aXRlbV9fIiwgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19zZXRzbGljZV9fIiwgJnNldHNsaWNlX3N0ciwKKyAgICAgICAgICAgICAgICAgICIobm5PKSIsIGksIGosIHZhbHVlKTsKKyAgICB9CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNsb3Rfc3FfY29udGFpbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqZnVuYywgKnJlcywgKmFyZ3M7Ci0JaW50IHJlc3VsdCA9IC0xOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzLCAqYXJnczsKKyAgICBpbnQgcmVzdWx0ID0gLTE7CiAKLQlzdGF0aWMgUHlPYmplY3QgKmNvbnRhaW5zX3N0cjsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmNvbnRhaW5zX3N0cjsKIAotCWZ1bmMgPSBsb29rdXBfbWF5YmUoc2VsZiwgIl9fY29udGFpbnNfXyIsICZjb250YWluc19zdHIpOwotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJYXJncyA9IFB5VHVwbGVfUGFjaygxLCB2YWx1ZSk7Ci0JCWlmIChhcmdzID09IE5VTEwpCi0JCQlyZXMgPSBOVUxMOwotCQllbHNlIHsKLQkJCXJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0JCQlQeV9ERUNSRUYoYXJncyk7Ci0JCX0KLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlpZiAocmVzICE9IE5VTEwpIHsKLQkJCXJlc3VsdCA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoISBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCS8qIFBvc3NpYmxlIHJlc3VsdHM6IC0xIGFuZCAxICovCi0JCXJlc3VsdCA9IChpbnQpX1B5U2VxdWVuY2VfSXRlclNlYXJjaChzZWxmLCB2YWx1ZSwKLQkJCQkJCSBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmdW5jID0gbG9va3VwX21heWJlKHNlbGYsICJfX2NvbnRhaW5zX18iLCAmY29udGFpbnNfc3RyKTsKKyAgICBpZiAoZnVuYyAhPSBOVUxMKSB7CisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdmFsdWUpOworICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICAgICAgcmVzID0gTlVMTDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCEgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAvKiBQb3NzaWJsZSByZXN1bHRzOiAtMSBhbmQgMSAqLworICAgICAgICByZXN1bHQgPSAoaW50KV9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goc2VsZiwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAjZGVmaW5lIHNsb3RfbXBfbGVuZ3RoIHNsb3Rfc3FfbGVuZ3RoCkBAIC01MDY0LDE5ICs1MDY0LDE5IEBACiBzdGF0aWMgaW50CiBzbG90X21wX2Fzc19zdWJzY3JpcHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqZGVsaXRlbV9zdHIsICpzZXRpdGVtX3N0cjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVsaXRlbV9zdHIsICpzZXRpdGVtX3N0cjsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKQotCQlyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxpdGVtX18iLCAmZGVsaXRlbV9zdHIsCi0JCQkJICAiKE8pIiwga2V5KTsKLQllbHNlCi0JCXJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX3NldGl0ZW1fXyIsICZzZXRpdGVtX3N0ciwKLQkJCQkgIihPTykiLCBrZXksIHZhbHVlKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fZGVsaXRlbV9fIiwgJmRlbGl0ZW1fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKE8pIiwga2V5KTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX3NldGl0ZW1fXyIsICZzZXRpdGVtX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiKE9PKSIsIGtleSwgdmFsdWUpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBTTE9UMUJJTihzbG90X25iX2FkZCwgbmJfYWRkLCAiX19hZGRfXyIsICJfX3JhZGRfXyIpCkBAIC01MDg5LDI1ICs1MDg5LDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKnNsb3RfbmJfcG93ZXIoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKIFNMT1QxQklORlVMTChzbG90X25iX3Bvd2VyX2JpbmFyeSwgc2xvdF9uYl9wb3dlciwKLQkgICAgIG5iX3Bvd2VyLCAiX19wb3dfXyIsICJfX3Jwb3dfXyIpCisgICAgICAgICAgICAgbmJfcG93ZXIsICJfX3Bvd19fIiwgIl9fcnBvd19fIikKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3RfbmJfcG93ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgUHlPYmplY3QgKm1vZHVsdXMpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpwb3dfc3RyOworICAgIHN0YXRpYyBQeU9iamVjdCAqcG93X3N0cjsKIAotCWlmIChtb2R1bHVzID09IFB5X05vbmUpCi0JCXJldHVybiBzbG90X25iX3Bvd2VyX2JpbmFyeShzZWxmLCBvdGhlcik7Ci0JLyogVGhyZWUtYXJnIHBvd2VyIGRvZXNuJ3QgdXNlIF9fcnBvd19fLiAgQnV0IHRlcm5hcnlfb3AKLQkgICBjYW4gY2FsbCB0aGlzIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCdzIHR5cGUgdXNlcwotCSAgIHNsb3RfbmJfcG93ZXIsIHNvIGNoZWNrIGJlZm9yZSBjYWxsaW5nIHNlbGYuX19wb3dfXy4gKi8KLQlpZiAoUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYKLQkgICAgUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyLT5uYl9wb3dlciA9PSBzbG90X25iX3Bvd2VyKSB7Ci0JCXJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19wb3dfXyIsICZwb3dfc3RyLAotCQkJCSAgICIoT08pIiwgb3RoZXIsIG1vZHVsdXMpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBpZiAobW9kdWx1cyA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gc2xvdF9uYl9wb3dlcl9iaW5hcnkoc2VsZiwgb3RoZXIpOworICAgIC8qIFRocmVlLWFyZyBwb3dlciBkb2Vzbid0IHVzZSBfX3Jwb3dfXy4gIEJ1dCB0ZXJuYXJ5X29wCisgICAgICAgY2FuIGNhbGwgdGhpcyB3aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQncyB0eXBlIHVzZXMKKyAgICAgICBzbG90X25iX3Bvd2VyLCBzbyBjaGVjayBiZWZvcmUgY2FsbGluZyBzZWxmLl9fcG93X18uICovCisgICAgaWYgKFB5X1RZUEUoc2VsZiktPnRwX2FzX251bWJlciAhPSBOVUxMICYmCisgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX2FzX251bWJlci0+bmJfcG93ZXIgPT0gc2xvdF9uYl9wb3dlcikgeworICAgICAgICByZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgIl9fcG93X18iLCAmcG93X3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIoT08pIiwgb3RoZXIsIG1vZHVsdXMpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKIH0KIAogU0xPVDAoc2xvdF9uYl9uZWdhdGl2ZSwgIl9fbmVnX18iKQpAQCAtNTExNyw0OSArNTExNyw0OSBAQAogc3RhdGljIGludAogc2xvdF9uYl9ub256ZXJvKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jLCAqYXJnczsKLQlzdGF0aWMgUHlPYmplY3QgKm5vbnplcm9fc3RyLCAqbGVuX3N0cjsKLQlpbnQgcmVzdWx0ID0gLTE7Ci0JaW50IHVzaW5nX2xlbiA9IDA7CisgICAgUHlPYmplY3QgKmZ1bmMsICphcmdzOworICAgIHN0YXRpYyBQeU9iamVjdCAqbm9uemVyb19zdHIsICpsZW5fc3RyOworICAgIGludCByZXN1bHQgPSAtMTsKKyAgICBpbnQgdXNpbmdfbGVuID0gMDsKIAotCWZ1bmMgPSBsb29rdXBfbWF5YmUoc2VsZiwgIl9fbm9uemVyb19fIiwgJm5vbnplcm9fc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlmdW5jID0gbG9va3VwX21heWJlKHNlbGYsICJfX2xlbl9fIiwgJmxlbl9zdHIpOwotCQlpZiAoZnVuYyA9PSBOVUxMKQotCQkJcmV0dXJuIFB5RXJyX09jY3VycmVkKCkgPyAtMSA6IDE7Ci0JCXVzaW5nX2xlbiA9IDE7Ci0JfQotCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp0ZW1wID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlpZiAodGVtcCAhPSBOVUxMKSB7Ci0JCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdCh0ZW1wKSB8fCBQeUJvb2xfQ2hlY2sodGVtcCkpCi0JCQkJcmVzdWx0ID0gUHlPYmplY3RfSXNUcnVlKHRlbXApOwotCQkJZWxzZSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICAgICAiJXMgc2hvdWxkIHJldHVybiAiCi0JCQkJCSAgICAgImJvb2wgb3IgaW50LCByZXR1cm5lZCAlcyIsCi0JCQkJCSAgICAgKHVzaW5nX2xlbiA/ICJfX2xlbl9fIgotCQkJCQkgICAgICAgICAgICAgICAgOiAiX19ub256ZXJvX18iKSwKLQkJCQkJICAgICB0ZW1wLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCQlyZXN1bHQgPSAtMTsKLQkJCX0KLQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJfQotCX0KLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmdW5jID0gbG9va3VwX21heWJlKHNlbGYsICJfX25vbnplcm9fXyIsICZub256ZXJvX3N0cik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZnVuYyA9IGxvb2t1cF9tYXliZShzZWxmLCAiX19sZW5fXyIsICZsZW5fc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9PY2N1cnJlZCgpID8gLTEgOiAxOworICAgICAgICB1c2luZ19sZW4gPSAxOworICAgIH0KKyAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgaWYgKGFyZ3MgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgaWYgKHRlbXAgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QodGVtcCkgfHwgUHlCb29sX0NoZWNrKHRlbXApKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0lzVHJ1ZSh0ZW1wKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBzaG91bGQgcmV0dXJuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvb2wgb3IgaW50LCByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2luZ19sZW4gPyAiX19sZW5fXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJfX25vbnplcm9fXyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF9uYl9pbmRleChQeU9iamVjdCAqc2VsZikKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmluZGV4X3N0cjsKLQlyZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgIl9faW5kZXhfXyIsICZpbmRleF9zdHIsICIoKSIpOworICAgIHN0YXRpYyBQeU9iamVjdCAqaW5kZXhfc3RyOworICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19pbmRleF9fIiwgJmluZGV4X3N0ciwgIigpIik7CiB9CiAKIApAQCAtNTE3Myw1OSArNTE3Myw1OSBAQAogc3RhdGljIGludAogc2xvdF9uYl9jb2VyY2UoUHlPYmplY3QgKiphLCBQeU9iamVjdCAqKmIpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpjb2VyY2Vfc3RyOwotCVB5T2JqZWN0ICpzZWxmID0gKmEsICpvdGhlciA9ICpiOworICAgIHN0YXRpYyBQeU9iamVjdCAqY29lcmNlX3N0cjsKKyAgICBQeU9iamVjdCAqc2VsZiA9ICphLCAqb3RoZXIgPSAqYjsKIAotCWlmIChzZWxmLT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSA9PSBzbG90X25iX2NvZXJjZSkgewotCQlQeU9iamVjdCAqcjsKLQkJciA9IGNhbGxfbWF5YmUoCi0JCQlzZWxmLCAiX19jb2VyY2VfXyIsICZjb2VyY2Vfc3RyLCAiKE8pIiwgb3RoZXIpOwotCQlpZiAociA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAociA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQkJUHlfREVDUkVGKHIpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCFQeVR1cGxlX0NoZWNrKHIpIHx8IFB5VHVwbGVfR0VUX1NJWkUocikgIT0gMikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJfX2NvZXJjZV9fIGRpZG4ndCByZXR1cm4gYSAyLXR1cGxlIik7Ci0JCQkJUHlfREVDUkVGKHIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCSphID0gUHlUdXBsZV9HRVRfSVRFTShyLCAwKTsKLQkJCVB5X0lOQ1JFRigqYSk7Ci0JCQkqYiA9IFB5VHVwbGVfR0VUX0lURU0ociwgMSk7Ci0JCQlQeV9JTkNSRUYoKmIpOwotCQkJUHlfREVDUkVGKHIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JaWYgKG90aGVyLT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJgotCSAgICBvdGhlci0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UgPT0gc2xvdF9uYl9jb2VyY2UpIHsKLQkJUHlPYmplY3QgKnI7Ci0JCXIgPSBjYWxsX21heWJlKAotCQkJb3RoZXIsICJfX2NvZXJjZV9fIiwgJmNvZXJjZV9zdHIsICIoTykiLCBzZWxmKTsKLQkJaWYgKHIgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHIgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJCVB5X0RFQ1JFRihyKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWlmICghUHlUdXBsZV9DaGVjayhyKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHIpICE9IDIpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJfX2NvZXJjZV9fIGRpZG4ndCByZXR1cm4gYSAyLXR1cGxlIik7Ci0JCQlQeV9ERUNSRUYocik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJKmEgPSBQeVR1cGxlX0dFVF9JVEVNKHIsIDEpOwotCQlQeV9JTkNSRUYoKmEpOwotCQkqYiA9IFB5VHVwbGVfR0VUX0lURU0ociwgMCk7Ci0JCVB5X0lOQ1JFRigqYik7Ci0JCVB5X0RFQ1JFRihyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChzZWxmLT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSA9PSBzbG90X25iX2NvZXJjZSkgeworICAgICAgICBQeU9iamVjdCAqcjsKKyAgICAgICAgciA9IGNhbGxfbWF5YmUoCisgICAgICAgICAgICBzZWxmLCAiX19jb2VyY2VfXyIsICZjb2VyY2Vfc3RyLCAiKE8pIiwgb3RoZXIpOworICAgICAgICBpZiAociA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAociA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHIpIHx8IFB5VHVwbGVfR0VUX1NJWkUocikgIT0gMikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJfX2NvZXJjZV9fIGRpZG4ndCByZXR1cm4gYSAyLXR1cGxlIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICphID0gUHlUdXBsZV9HRVRfSVRFTShyLCAwKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRigqYSk7CisgICAgICAgICAgICAqYiA9IFB5VHVwbGVfR0VUX0lURU0ociwgMSk7CisgICAgICAgICAgICBQeV9JTkNSRUYoKmIpOworICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG90aGVyLT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJgorICAgICAgICBvdGhlci0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UgPT0gc2xvdF9uYl9jb2VyY2UpIHsKKyAgICAgICAgUHlPYmplY3QgKnI7CisgICAgICAgIHIgPSBjYWxsX21heWJlKAorICAgICAgICAgICAgb3RoZXIsICJfX2NvZXJjZV9fIiwgJmNvZXJjZV9zdHIsICIoTykiLCBzZWxmKTsKKyAgICAgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHIgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICghUHlUdXBsZV9DaGVjayhyKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHIpICE9IDIpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fY29lcmNlX18gZGlkbid0IHJldHVybiBhIDItdHVwbGUiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAqYSA9IFB5VHVwbGVfR0VUX0lURU0ociwgMSk7CisgICAgICAgIFB5X0lOQ1JFRigqYSk7CisgICAgICAgICpiID0gUHlUdXBsZV9HRVRfSVRFTShyLCAwKTsKKyAgICAgICAgUHlfSU5DUkVGKCpiKTsKKyAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIFNMT1QwKHNsb3RfbmJfaW50LCAiX19pbnRfXyIpCkBAIC01MjM5LDExICs1MjM5LDExIEBACiBTTE9UMShzbG90X25iX2lucGxhY2VfZGl2aWRlLCAiX19pZGl2X18iLCBQeU9iamVjdCAqLCAiTyIpCiBTTE9UMShzbG90X25iX2lucGxhY2VfcmVtYWluZGVyLCAiX19pbW9kX18iLCBQeU9iamVjdCAqLCAiTyIpCiAvKiBDYW4ndCB1c2UgU0xPVDEgaGVyZSwgYmVjYXVzZSBuYl9pbnBsYWNlX3Bvd2VyIGlzIHRlcm5hcnkgKi8KLXN0YXRpYyBQeU9iamVjdCAqIAotc2xvdF9uYl9pbnBsYWNlX3Bvd2VyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqIGFyZzEsIFB5T2JqZWN0ICphcmcyKSAKLXsgCi0gIHN0YXRpYyBQeU9iamVjdCAqY2FjaGVfc3RyOyAKLSAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJfX2lwb3dfXyIsICZjYWNoZV9zdHIsICIoIiAiTyIgIikiLCBhcmcxKTsgCitzdGF0aWMgUHlPYmplY3QgKgorc2xvdF9uYl9pbnBsYWNlX3Bvd2VyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqIGFyZzEsIFB5T2JqZWN0ICphcmcyKQoreworICBzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0cjsKKyAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJfX2lwb3dfXyIsICZjYWNoZV9zdHIsICIoIiAiTyIgIikiLCBhcmcxKTsKIH0KIFNMT1QxKHNsb3RfbmJfaW5wbGFjZV9sc2hpZnQsICJfX2lsc2hpZnRfXyIsIFB5T2JqZWN0ICosICJPIikKIFNMT1QxKHNsb3RfbmJfaW5wbGFjZV9yc2hpZnQsICJfX2lyc2hpZnRfXyIsIFB5T2JqZWN0ICosICJPIikKQEAgLTUyNTEsNyArNTI1MSw3IEBACiBTTE9UMShzbG90X25iX2lucGxhY2VfeG9yLCAiX19peG9yX18iLCBQeU9iamVjdCAqLCAiTyIpCiBTTE9UMShzbG90X25iX2lucGxhY2Vfb3IsICJfX2lvcl9fIiwgUHlPYmplY3QgKiwgIk8iKQogU0xPVDFCSU4oc2xvdF9uYl9mbG9vcl9kaXZpZGUsIG5iX2Zsb29yX2RpdmlkZSwKLQkgIl9fZmxvb3JkaXZfXyIsICJfX3JmbG9vcmRpdl9fIikKKyAgICAgICAgICJfX2Zsb29yZGl2X18iLCAiX19yZmxvb3JkaXZfXyIpCiBTTE9UMUJJTihzbG90X25iX3RydWVfZGl2aWRlLCBuYl90cnVlX2RpdmlkZSwgIl9fdHJ1ZWRpdl9fIiwgIl9fcnRydWVkaXZfXyIpCiBTTE9UMShzbG90X25iX2lucGxhY2VfZmxvb3JfZGl2aWRlLCAiX19pZmxvb3JkaXZfXyIsIFB5T2JqZWN0ICosICJPIikKIFNMT1QxKHNsb3RfbmJfaW5wbGFjZV90cnVlX2RpdmlkZSwgIl9faXRydWVkaXZfXyIsIFB5T2JqZWN0ICosICJPIikKQEAgLTUyNTksMTQ4ICs1MjU5LDE0OCBAQAogc3RhdGljIGludAogaGFsZl9jb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmdzLCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqY21wX3N0cjsKLQlQeV9zc2l6ZV90IGM7CisgICAgUHlPYmplY3QgKmZ1bmMsICphcmdzLCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqY21wX3N0cjsKKyAgICBQeV9zc2l6ZV90IGM7CiAKLQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19jbXBfXyIsICZjbXBfc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWVsc2UgewotCQlhcmdzID0gUHlUdXBsZV9QYWNrKDEsIG90aGVyKTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkKLQkJCXJlcyA9IE5VTEw7Ci0JCWVsc2UgewotCQkJcmVzID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJfQotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJCWlmIChyZXMgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTI7Ci0JCQljID0gUHlJbnRfQXNMb25nKHJlcyk7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCWlmIChjID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0yOwotCQkJcmV0dXJuIChjIDwgMCkgPyAtMSA6IChjID4gMCkgPyAxIDogMDsKLQkJfQotCQlQeV9ERUNSRUYocmVzKTsKLQl9Ci0JcmV0dXJuIDI7CisgICAgZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fY21wX18iLCAmY21wX3N0cik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBvdGhlcik7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgICAgICByZXMgPSBOVUxMOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICAgICAgYyA9IFB5SW50X0FzTG9uZyhyZXMpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICBpZiAoYyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgICAgIHJldHVybiAoYyA8IDApID8gLTEgOiAoYyA+IDApID8gMSA6IDA7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQorICAgIHJldHVybiAyOwogfQogCiAvKiBUaGlzIHNsb3QgaXMgcHVibGlzaGVkIGZvciB0aGUgYmVuZWZpdCBvZiB0cnlfM3dheV9jb21wYXJlIGluIG9iamVjdC5jICovCiBpbnQKIF9QeU9iamVjdF9TbG90Q29tcGFyZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyKQogewotCWludCBjOworICAgIGludCBjOwogCi0JaWYgKFB5X1RZUEUoc2VsZiktPnRwX2NvbXBhcmUgPT0gX1B5T2JqZWN0X1Nsb3RDb21wYXJlKSB7Ci0JCWMgPSBoYWxmX2NvbXBhcmUoc2VsZiwgb3RoZXIpOwotCQlpZiAoYyA8PSAxKQotCQkJcmV0dXJuIGM7Ci0JfQotCWlmIChQeV9UWVBFKG90aGVyKS0+dHBfY29tcGFyZSA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUpIHsKLQkJYyA9IGhhbGZfY29tcGFyZShvdGhlciwgc2VsZik7Ci0JCWlmIChjIDwgLTEpCi0JCQlyZXR1cm4gLTI7Ci0JCWlmIChjIDw9IDEpCi0JCQlyZXR1cm4gLWM7Ci0JfQotCXJldHVybiAodm9pZCAqKXNlbGYgPCAodm9pZCAqKW90aGVyID8gLTEgOgotCQkodm9pZCAqKXNlbGYgPiAodm9pZCAqKW90aGVyID8gMSA6IDA7CisgICAgaWYgKFB5X1RZUEUoc2VsZiktPnRwX2NvbXBhcmUgPT0gX1B5T2JqZWN0X1Nsb3RDb21wYXJlKSB7CisgICAgICAgIGMgPSBoYWxmX2NvbXBhcmUoc2VsZiwgb3RoZXIpOworICAgICAgICBpZiAoYyA8PSAxKQorICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgfQorICAgIGlmIChQeV9UWVBFKG90aGVyKS0+dHBfY29tcGFyZSA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUpIHsKKyAgICAgICAgYyA9IGhhbGZfY29tcGFyZShvdGhlciwgc2VsZik7CisgICAgICAgIGlmIChjIDwgLTEpCisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGlmIChjIDw9IDEpCisgICAgICAgICAgICByZXR1cm4gLWM7CisgICAgfQorICAgIHJldHVybiAodm9pZCAqKXNlbGYgPCAodm9pZCAqKW90aGVyID8gLTEgOgorICAgICAgICAodm9pZCAqKXNlbGYgPiAodm9pZCAqKW90aGVyID8gMSA6IDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX3JlcHIoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpyZXByX3N0cjsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnJlcHJfc3RyOwogCi0JZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fcmVwcl9fIiwgJnJlcHJfc3RyKTsKLQlpZiAoZnVuYyAhPSBOVUxMKSB7Ci0JCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIE5VTEwpOwotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCXJldHVybiByZXM7Ci0JfQotCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBvYmplY3QgYXQgJXA+IiwKLQkJCQkgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLCBzZWxmKTsKKyAgICBmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19yZXByX18iLCAmcmVwcl9zdHIpOworICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF90cF9zdHIoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpzdHJfc3RyOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqc3RyX3N0cjsKIAotCWZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX3N0cl9fIiwgJnN0cl9zdHIpOwotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgTlVMTCk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiBzbG90X3RwX3JlcHIoc2VsZik7Ci0JfQorICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX3N0cl9fIiwgJnN0cl9zdHIpOworICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBzbG90X3RwX3JlcHIoc2VsZik7CisgICAgfQogfQogCiBzdGF0aWMgbG9uZwogc2xvdF90cF9oYXNoKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jOwotCXN0YXRpYyBQeU9iamVjdCAqaGFzaF9zdHIsICplcV9zdHIsICpjbXBfc3RyOwotCWxvbmcgaDsKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmhhc2hfc3RyLCAqZXFfc3RyLCAqY21wX3N0cjsKKyAgICBsb25nIGg7CiAKLQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19oYXNoX18iLCAmaGFzaF9zdHIpOworICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2hhc2hfXyIsICZoYXNoX3N0cik7CiAKLQlpZiAoZnVuYyAhPSBOVUxMICYmIGZ1bmMgIT0gUHlfTm9uZSkgewotCQlQeU9iamVjdCAqcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgTlVMTCk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJaWYgKHJlcyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlMb25nX0NoZWNrKHJlcykpCi0JCQloID0gUHlMb25nX1R5cGUudHBfaGFzaChyZXMpOwotCQllbHNlCi0JCQloID0gUHlJbnRfQXNMb25nKHJlcyk7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCX0KLQllbHNlIHsKLQkJUHlfWERFQ1JFRihmdW5jKTsgLyogbWF5IGJlIE5vbmUgKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fZXFfXyIsICZlcV9zdHIpOwotCQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fY21wX18iLCAmY21wX3N0cik7Ci0JCX0KLQkJaWYgKGZ1bmMgIT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJcmV0dXJuIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZChzZWxmKTsKLQkJfQotCQlQeUVycl9DbGVhcigpOwotCQloID0gX1B5X0hhc2hQb2ludGVyKCh2b2lkICopc2VsZik7Ci0JfQotCWlmIChoID09IC0xICYmICFQeUVycl9PY2N1cnJlZCgpKQotCQloID0gLTI7Ci0JcmV0dXJuIGg7CisgICAgaWYgKGZ1bmMgIT0gTlVMTCAmJiBmdW5jICE9IFB5X05vbmUpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhyZXMpKQorICAgICAgICAgICAgaCA9IFB5TG9uZ19UeXBlLnRwX2hhc2gocmVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaCA9IFB5SW50X0FzTG9uZyhyZXMpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X1hERUNSRUYoZnVuYyk7IC8qIG1heSBiZSBOb25lICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2VxX18iLCAmZXFfc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2NtcF9fIiwgJmNtcF9zdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgIHJldHVybiBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaCA9IF9QeV9IYXNoUG9pbnRlcigodm9pZCAqKXNlbGYpOworICAgIH0KKyAgICBpZiAoaCA9PSAtMSAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgaCA9IC0yOworICAgIHJldHVybiBoOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF90cF9jYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpjYWxsX3N0cjsKLQlQeU9iamVjdCAqbWV0aCA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fY2FsbF9fIiwgJmNhbGxfc3RyKTsKLQlQeU9iamVjdCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqY2FsbF9zdHI7CisgICAgUHlPYmplY3QgKm1ldGggPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2NhbGxfXyIsICZjYWxsX3N0cik7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChtZXRoID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChtZXRoID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzID0gUHlPYmplY3RfQ2FsbChtZXRoLCBhcmdzLCBrd2RzKTsKKyAgICByZXMgPSBQeU9iamVjdF9DYWxsKG1ldGgsIGFyZ3MsIGt3ZHMpOwogCi0JUHlfREVDUkVGKG1ldGgpOwotCXJldHVybiByZXM7CisgICAgUHlfREVDUkVGKG1ldGgpOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qIFRoZXJlIGFyZSB0d28gc2xvdCBkaXNwYXRjaCBmdW5jdGlvbnMgZm9yIHRwX2dldGF0dHJvLgpAQCAtNTQxNywxMDAgKzU0MTcsMTAwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF90cF9nZXRhdHRybyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpnZXRhdHRyaWJ1dGVfc3RyID0gTlVMTDsKLQlyZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgIl9fZ2V0YXR0cmlidXRlX18iLCAmZ2V0YXR0cmlidXRlX3N0ciwKLQkJCSAgICIoTykiLCBuYW1lKTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmdldGF0dHJpYnV0ZV9zdHIgPSBOVUxMOworICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19nZXRhdHRyaWJ1dGVfXyIsICZnZXRhdHRyaWJ1dGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAiKE8pIiwgbmFtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2F0dHJpYnV0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmF0dHIsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5T2JqZWN0ICpyZXMsICpkZXNjciA9IE5VTEw7Ci0JZGVzY3JnZXRmdW5jIGYgPSBQeV9UWVBFKGF0dHIpLT50cF9kZXNjcl9nZXQ7CisgICAgUHlPYmplY3QgKnJlcywgKmRlc2NyID0gTlVMTDsKKyAgICBkZXNjcmdldGZ1bmMgZiA9IFB5X1RZUEUoYXR0ciktPnRwX2Rlc2NyX2dldDsKIAotCWlmIChmICE9IE5VTEwpIHsKLQkJZGVzY3IgPSBmKGF0dHIsIHNlbGYsIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKSk7Ci0JCWlmIChkZXNjciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UKLQkJCWF0dHIgPSBkZXNjcjsKLQl9Ci0JcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhhdHRyLCBuYW1lLCBOVUxMKTsKLQlQeV9YREVDUkVGKGRlc2NyKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChmICE9IE5VTEwpIHsKKyAgICAgICAgZGVzY3IgPSBmKGF0dHIsIHNlbGYsIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKSk7CisgICAgICAgIGlmIChkZXNjciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF0dHIgPSBkZXNjcjsKKyAgICB9CisgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhhdHRyLCBuYW1lLCBOVUxMKTsKKyAgICBQeV9YREVDUkVGKGRlc2NyKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF90cF9nZXRhdHRyX2hvb2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKHNlbGYpOwotCVB5T2JqZWN0ICpnZXRhdHRyLCAqZ2V0YXR0cmlidXRlLCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqZ2V0YXR0cmlidXRlX3N0ciA9IE5VTEw7Ci0Jc3RhdGljIFB5T2JqZWN0ICpnZXRhdHRyX3N0ciA9IE5VTEw7CisgICAgUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUoc2VsZik7CisgICAgUHlPYmplY3QgKmdldGF0dHIsICpnZXRhdHRyaWJ1dGUsICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpnZXRhdHRyaWJ1dGVfc3RyID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmdldGF0dHJfc3RyID0gTlVMTDsKIAotCWlmIChnZXRhdHRyX3N0ciA9PSBOVUxMKSB7Ci0JCWdldGF0dHJfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRhdHRyX18iKTsKLQkJaWYgKGdldGF0dHJfc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGdldGF0dHJpYnV0ZV9zdHIgPT0gTlVMTCkgewotCQlnZXRhdHRyaWJ1dGVfc3RyID0KLQkJCVB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0YXR0cmlidXRlX18iKTsKLQkJaWYgKGdldGF0dHJpYnV0ZV9zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQkvKiBzcGVlZCBoYWNrOiB3ZSBjb3VsZCB1c2UgbG9va3VwX21heWJlLCBidXQgdGhhdCB3b3VsZCByZXNvbHZlIHRoZQotCSAgIG1ldGhvZCBmdWxseSBmb3IgZWFjaCBhdHRyaWJ1dGUgbG9va3VwIGZvciBjbGFzc2VzIHdpdGgKLQkgICBfX2dldGF0dHJfXywgZXZlbiB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgcHJlc2VudC4gU28gd2UgdXNlCi0JICAgX1B5VHlwZV9Mb29rdXAgYW5kIGNyZWF0ZSB0aGUgbWV0aG9kIG9ubHkgd2hlbiBuZWVkZWQsIHdpdGgKLQkgICBjYWxsX2F0dHJpYnV0ZS4gKi8KLQlnZXRhdHRyID0gX1B5VHlwZV9Mb29rdXAodHAsIGdldGF0dHJfc3RyKTsKLQlpZiAoZ2V0YXR0ciA9PSBOVUxMKSB7Ci0JCS8qIE5vIF9fZ2V0YXR0cl9fIGhvb2s6IHVzZSBhIHNpbXBsZXIgZGlzcGF0Y2hlciAqLwotCQl0cC0+dHBfZ2V0YXR0cm8gPSBzbG90X3RwX2dldGF0dHJvOwotCQlyZXR1cm4gc2xvdF90cF9nZXRhdHRybyhzZWxmLCBuYW1lKTsKLQl9Ci0JUHlfSU5DUkVGKGdldGF0dHIpOwotCS8qIHNwZWVkIGhhY2s6IHdlIGNvdWxkIHVzZSBsb29rdXBfbWF5YmUsIGJ1dCB0aGF0IHdvdWxkIHJlc29sdmUgdGhlCi0JICAgbWV0aG9kIGZ1bGx5IGZvciBlYWNoIGF0dHJpYnV0ZSBsb29rdXAgZm9yIGNsYXNzZXMgd2l0aAotCSAgIF9fZ2V0YXR0cl9fLCBldmVuIHdoZW4gc2VsZiBoYXMgdGhlIGRlZmF1bHQgX19nZXRhdHRyaWJ1dGVfXwotCSAgIG1ldGhvZC4gU28gd2UgdXNlIF9QeVR5cGVfTG9va3VwIGFuZCBjcmVhdGUgdGhlIG1ldGhvZCBvbmx5IHdoZW4KLQkgICBuZWVkZWQsIHdpdGggY2FsbF9hdHRyaWJ1dGUuICovCi0JZ2V0YXR0cmlidXRlID0gX1B5VHlwZV9Mb29rdXAodHAsIGdldGF0dHJpYnV0ZV9zdHIpOwotCWlmIChnZXRhdHRyaWJ1dGUgPT0gTlVMTCB8fAotCSAgICAoUHlfVFlQRShnZXRhdHRyaWJ1dGUpID09ICZQeVdyYXBwZXJEZXNjcl9UeXBlICYmCi0JICAgICAoKFB5V3JhcHBlckRlc2NyT2JqZWN0ICopZ2V0YXR0cmlidXRlKS0+ZF93cmFwcGVkID09Ci0JICAgICAodm9pZCAqKVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKSkKLQkJcmVzID0gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoc2VsZiwgbmFtZSk7Ci0JZWxzZSB7Ci0JCVB5X0lOQ1JFRihnZXRhdHRyaWJ1dGUpOwotCQlyZXMgPSBjYWxsX2F0dHJpYnV0ZShzZWxmLCBnZXRhdHRyaWJ1dGUsIG5hbWUpOwotCQlQeV9ERUNSRUYoZ2V0YXR0cmlidXRlKTsKLQl9Ci0JaWYgKHJlcyA9PSBOVUxMICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJlcyA9IGNhbGxfYXR0cmlidXRlKHNlbGYsIGdldGF0dHIsIG5hbWUpOwotCX0KLQlQeV9ERUNSRUYoZ2V0YXR0cik7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoZ2V0YXR0cl9zdHIgPT0gTlVMTCkgeworICAgICAgICBnZXRhdHRyX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0YXR0cl9fIik7CisgICAgICAgIGlmIChnZXRhdHRyX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChnZXRhdHRyaWJ1dGVfc3RyID09IE5VTEwpIHsKKyAgICAgICAgZ2V0YXR0cmlidXRlX3N0ciA9CisgICAgICAgICAgICBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGF0dHJpYnV0ZV9fIik7CisgICAgICAgIGlmIChnZXRhdHRyaWJ1dGVfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogc3BlZWQgaGFjazogd2UgY291bGQgdXNlIGxvb2t1cF9tYXliZSwgYnV0IHRoYXQgd291bGQgcmVzb2x2ZSB0aGUKKyAgICAgICBtZXRob2QgZnVsbHkgZm9yIGVhY2ggYXR0cmlidXRlIGxvb2t1cCBmb3IgY2xhc3NlcyB3aXRoCisgICAgICAgX19nZXRhdHRyX18sIGV2ZW4gd2hlbiB0aGUgYXR0cmlidXRlIGlzIHByZXNlbnQuIFNvIHdlIHVzZQorICAgICAgIF9QeVR5cGVfTG9va3VwIGFuZCBjcmVhdGUgdGhlIG1ldGhvZCBvbmx5IHdoZW4gbmVlZGVkLCB3aXRoCisgICAgICAgY2FsbF9hdHRyaWJ1dGUuICovCisgICAgZ2V0YXR0ciA9IF9QeVR5cGVfTG9va3VwKHRwLCBnZXRhdHRyX3N0cik7CisgICAgaWYgKGdldGF0dHIgPT0gTlVMTCkgeworICAgICAgICAvKiBObyBfX2dldGF0dHJfXyBob29rOiB1c2UgYSBzaW1wbGVyIGRpc3BhdGNoZXIgKi8KKyAgICAgICAgdHAtPnRwX2dldGF0dHJvID0gc2xvdF90cF9nZXRhdHRybzsKKyAgICAgICAgcmV0dXJuIHNsb3RfdHBfZ2V0YXR0cm8oc2VsZiwgbmFtZSk7CisgICAgfQorICAgIFB5X0lOQ1JFRihnZXRhdHRyKTsKKyAgICAvKiBzcGVlZCBoYWNrOiB3ZSBjb3VsZCB1c2UgbG9va3VwX21heWJlLCBidXQgdGhhdCB3b3VsZCByZXNvbHZlIHRoZQorICAgICAgIG1ldGhvZCBmdWxseSBmb3IgZWFjaCBhdHRyaWJ1dGUgbG9va3VwIGZvciBjbGFzc2VzIHdpdGgKKyAgICAgICBfX2dldGF0dHJfXywgZXZlbiB3aGVuIHNlbGYgaGFzIHRoZSBkZWZhdWx0IF9fZ2V0YXR0cmlidXRlX18KKyAgICAgICBtZXRob2QuIFNvIHdlIHVzZSBfUHlUeXBlX0xvb2t1cCBhbmQgY3JlYXRlIHRoZSBtZXRob2Qgb25seSB3aGVuCisgICAgICAgbmVlZGVkLCB3aXRoIGNhbGxfYXR0cmlidXRlLiAqLworICAgIGdldGF0dHJpYnV0ZSA9IF9QeVR5cGVfTG9va3VwKHRwLCBnZXRhdHRyaWJ1dGVfc3RyKTsKKyAgICBpZiAoZ2V0YXR0cmlidXRlID09IE5VTEwgfHwKKyAgICAgICAgKFB5X1RZUEUoZ2V0YXR0cmlidXRlKSA9PSAmUHlXcmFwcGVyRGVzY3JfVHlwZSAmJgorICAgICAgICAgKChQeVdyYXBwZXJEZXNjck9iamVjdCAqKWdldGF0dHJpYnV0ZSktPmRfd3JhcHBlZCA9PQorICAgICAgICAgKHZvaWQgKilQeU9iamVjdF9HZW5lcmljR2V0QXR0cikpCisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKHNlbGYsIG5hbWUpOworICAgIGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoZ2V0YXR0cmlidXRlKTsKKyAgICAgICAgcmVzID0gY2FsbF9hdHRyaWJ1dGUoc2VsZiwgZ2V0YXR0cmlidXRlLCBuYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKGdldGF0dHJpYnV0ZSk7CisgICAgfQorICAgIGlmIChyZXMgPT0gTlVMTCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXMgPSBjYWxsX2F0dHJpYnV0ZShzZWxmLCBnZXRhdHRyLCBuYW1lKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGdldGF0dHIpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIHNsb3RfdHBfc2V0YXR0cm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlzdGF0aWMgUHlPYmplY3QgKmRlbGF0dHJfc3RyLCAqc2V0YXR0cl9zdHI7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmRlbGF0dHJfc3RyLCAqc2V0YXR0cl9zdHI7CiAKLQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fZGVsYXR0cl9fIiwgJmRlbGF0dHJfc3RyLAotCQkJCSAgIihPKSIsIG5hbWUpOwotCWVsc2UKLQkJcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fc2V0YXR0cl9fIiwgJnNldGF0dHJfc3RyLAotCQkJCSAgIihPTykiLCBuYW1lLCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIHJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX2RlbGF0dHJfXyIsICZkZWxhdHRyX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihPKSIsIG5hbWUpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fc2V0YXR0cl9fIiwgJnNldGF0dHJfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKE9PKSIsIG5hbWUsIHZhbHVlKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGNoYXIgKm5hbWVfb3BbXSA9IHsKQEAgLTU1MjUsMjQ0ICs1NTI1LDI0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGhhbGZfcmljaGNvbXBhcmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewotCVB5T2JqZWN0ICpmdW5jLCAqYXJncywgKnJlczsKLQlzdGF0aWMgUHlPYmplY3QgKm9wX3N0cls2XTsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3MsICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpvcF9zdHJbNl07CiAKLQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCBuYW1lX29wW29wXSwgJm9wX3N0cltvcF0pOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlhcmdzID0gUHlUdXBsZV9QYWNrKDEsIG90aGVyKTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXMgPSBOVUxMOwotCWVsc2UgewotCQlyZXMgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JfQotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzOworICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsIG5hbWVfb3Bbb3BdLCAmb3Bfc3RyW29wXSk7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgb3RoZXIpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJlcyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX3JpY2hjb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoUHlfVFlQRShzZWxmKS0+dHBfcmljaGNvbXBhcmUgPT0gc2xvdF90cF9yaWNoY29tcGFyZSkgewotCQlyZXMgPSBoYWxmX3JpY2hjb21wYXJlKHNlbGYsIG90aGVyLCBvcCk7Ci0JCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4gcmVzOwotCQlQeV9ERUNSRUYocmVzKTsKLQl9Ci0JaWYgKFB5X1RZUEUob3RoZXIpLT50cF9yaWNoY29tcGFyZSA9PSBzbG90X3RwX3JpY2hjb21wYXJlKSB7Ci0JCXJlcyA9IGhhbGZfcmljaGNvbXBhcmUob3RoZXIsIHNlbGYsIF9QeV9Td2FwcGVkT3Bbb3BdKTsKLQkJaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQkJcmV0dXJuIHJlczsKLQkJfQotCQlQeV9ERUNSRUYocmVzKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgaWYgKFB5X1RZUEUoc2VsZiktPnRwX3JpY2hjb21wYXJlID09IHNsb3RfdHBfcmljaGNvbXBhcmUpIHsKKyAgICAgICAgcmVzID0gaGFsZl9yaWNoY29tcGFyZShzZWxmLCBvdGhlciwgb3ApOworICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQorICAgIGlmIChQeV9UWVBFKG90aGVyKS0+dHBfcmljaGNvbXBhcmUgPT0gc2xvdF90cF9yaWNoY29tcGFyZSkgeworICAgICAgICByZXMgPSBoYWxmX3JpY2hjb21wYXJlKG90aGVyLCBzZWxmLCBfUHlfU3dhcHBlZE9wW29wXSk7CisgICAgICAgIGlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF90cF9pdGVyKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jLCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqaXRlcl9zdHIsICpnZXRpdGVtX3N0cjsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKml0ZXJfc3RyLCAqZ2V0aXRlbV9zdHI7CiAKLQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19pdGVyX18iLCAmaXRlcl9zdHIpOwotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKmFyZ3M7Ci0JCWFyZ3MgPSByZXMgPSBQeVR1cGxlX05ldygwKTsKLQkJaWYgKGFyZ3MgIT0gTlVMTCkgewotCQkJcmVzID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJfQotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCXJldHVybiByZXM7Ci0JfQotCVB5RXJyX0NsZWFyKCk7Ci0JZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fZ2V0aXRlbV9fIiwgJmdldGl0ZW1fc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICInJS4yMDBzJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlIiwKLQkJCSAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIFB5U2VxSXRlcl9OZXcoc2VsZik7CisgICAgZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9faXRlcl9fIiwgJml0ZXJfc3RyKTsKKyAgICBpZiAoZnVuYyAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICphcmdzOworICAgICAgICBhcmdzID0gcmVzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGlmIChhcmdzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2dldGl0ZW1fXyIsICZnZXRpdGVtX3N0cik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclLjIwMHMnIG9iamVjdCBpcyBub3QgaXRlcmFibGUiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIFB5U2VxSXRlcl9OZXcoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX2l0ZXJuZXh0KFB5T2JqZWN0ICpzZWxmKQogewotCXN0YXRpYyBQeU9iamVjdCAqbmV4dF9zdHI7Ci0JcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJuZXh0IiwgJm5leHRfc3RyLCAiKCkiKTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm5leHRfc3RyOworICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAibmV4dCIsICZuZXh0X3N0ciwgIigpIik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX2Rlc2NyX2dldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUoc2VsZik7Ci0JUHlPYmplY3QgKmdldDsKLQlzdGF0aWMgUHlPYmplY3QgKmdldF9zdHIgPSBOVUxMOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKHNlbGYpOworICAgIFB5T2JqZWN0ICpnZXQ7CisgICAgc3RhdGljIFB5T2JqZWN0ICpnZXRfc3RyID0gTlVMTDsKIAotCWlmIChnZXRfc3RyID09IE5VTEwpIHsKLQkJZ2V0X3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0X18iKTsKLQkJaWYgKGdldF9zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlnZXQgPSBfUHlUeXBlX0xvb2t1cCh0cCwgZ2V0X3N0cik7Ci0JaWYgKGdldCA9PSBOVUxMKSB7Ci0JCS8qIEF2b2lkIGZ1cnRoZXIgc2xvd2Rvd25zICovCi0JCWlmICh0cC0+dHBfZGVzY3JfZ2V0ID09IHNsb3RfdHBfZGVzY3JfZ2V0KQotCQkJdHAtPnRwX2Rlc2NyX2dldCA9IE5VTEw7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJcmV0dXJuIHNlbGY7Ci0JfQotCWlmIChvYmogPT0gTlVMTCkKLQkJb2JqID0gUHlfTm9uZTsKLQlpZiAodHlwZSA9PSBOVUxMKQotCQl0eXBlID0gUHlfTm9uZTsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnZXQsIHNlbGYsIG9iaiwgdHlwZSwgTlVMTCk7CisgICAgaWYgKGdldF9zdHIgPT0gTlVMTCkgeworICAgICAgICBnZXRfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRfXyIpOworICAgICAgICBpZiAoZ2V0X3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGdldCA9IF9QeVR5cGVfTG9va3VwKHRwLCBnZXRfc3RyKTsKKyAgICBpZiAoZ2V0ID09IE5VTEwpIHsKKyAgICAgICAgLyogQXZvaWQgZnVydGhlciBzbG93ZG93bnMgKi8KKyAgICAgICAgaWYgKHRwLT50cF9kZXNjcl9nZXQgPT0gc2xvdF90cF9kZXNjcl9nZXQpCisgICAgICAgICAgICB0cC0+dHBfZGVzY3JfZ2V0ID0gTlVMTDsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gc2VsZjsKKyAgICB9CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICBvYmogPSBQeV9Ob25lOworICAgIGlmICh0eXBlID09IE5VTEwpCisgICAgICAgIHR5cGUgPSBQeV9Ob25lOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdldCwgc2VsZiwgb2JqLCB0eXBlLCBOVUxMKTsKIH0KIAogc3RhdGljIGludAogc2xvdF90cF9kZXNjcl9zZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0YXJnZXQsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqZGVsX3N0ciwgKnNldF9zdHI7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmRlbF9zdHIsICpzZXRfc3RyOwogCi0JaWYgKHZhbHVlID09IE5VTEwpCi0JCXJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX2RlbGV0ZV9fIiwgJmRlbF9zdHIsCi0JCQkJICAiKE8pIiwgdGFyZ2V0KTsKLQllbHNlCi0JCXJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX3NldF9fIiwgJnNldF9zdHIsCi0JCQkJICAiKE9PKSIsIHRhcmdldCwgdmFsdWUpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiAwOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxldGVfXyIsICZkZWxfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKE8pIiwgdGFyZ2V0KTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX3NldF9fIiwgJnNldF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoT08pIiwgdGFyZ2V0LCB2YWx1ZSk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNsb3RfdHBfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBQeU9iamVjdCAqaW5pdF9zdHI7Ci0JUHlPYmplY3QgKm1ldGggPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2luaXRfXyIsICZpbml0X3N0cik7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmluaXRfc3RyOworICAgIFB5T2JqZWN0ICptZXRoID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19pbml0X18iLCAmaW5pdF9zdHIpOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAobWV0aCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcmVzID0gUHlPYmplY3RfQ2FsbChtZXRoLCBhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYobWV0aCk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHJlcyAhPSBQeV9Ob25lKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJfX2luaXRfXygpIHNob3VsZCByZXR1cm4gTm9uZSwgbm90ICclLjIwMHMnIiwKLQkJCSAgICAgUHlfVFlQRShyZXMpLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKG1ldGggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwobWV0aCwgYXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKG1ldGgpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChyZXMgIT0gUHlfTm9uZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIl9faW5pdF9fKCkgc2hvdWxkIHJldHVybiBOb25lLCBub3QgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShyZXMpLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKm5ld19zdHI7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKm5ld2FyZ3MsICp4OwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm5ld19zdHI7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKm5ld2FyZ3MsICp4OworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWlmIChuZXdfc3RyID09IE5VTEwpIHsKLQkJbmV3X3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbmV3X18iKTsKLQkJaWYgKG5ld19zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gUHlPYmplY3RfR2V0QXR0cigoUHlPYmplY3QgKil0eXBlLCBuZXdfc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JbmV3YXJncyA9IFB5VHVwbGVfTmV3KG4rMSk7Ci0JaWYgKG5ld2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKHR5cGUpOwotCVB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgMCwgKFB5T2JqZWN0ICopdHlwZSk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQl4ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJUHlfSU5DUkVGKHgpOwotCQlQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIGkrMSwgeCk7Ci0JfQotCXggPSBQeU9iamVjdF9DYWxsKGZ1bmMsIG5ld2FyZ3MsIGt3ZHMpOwotCVB5X0RFQ1JFRihuZXdhcmdzKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHg7CisgICAgaWYgKG5ld19zdHIgPT0gTlVMTCkgeworICAgICAgICBuZXdfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uZXdfXyIpOworICAgICAgICBpZiAobmV3X3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyKChQeU9iamVjdCAqKXR5cGUsIG5ld19zdHIpOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBuZXdhcmdzID0gUHlUdXBsZV9OZXcobisxKTsKKyAgICBpZiAobmV3YXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYodHlwZSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmdzLCAwLCAoUHlPYmplY3QgKil0eXBlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHggPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgaSsxLCB4KTsKKyAgICB9CisgICAgeCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgbmV3YXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4geDsKIH0KIAogc3RhdGljIHZvaWQKIHNsb3RfdHBfZGVsKFB5T2JqZWN0ICpzZWxmKQogewotCXN0YXRpYyBQeU9iamVjdCAqZGVsX3N0ciA9IE5VTEw7Ci0JUHlPYmplY3QgKmRlbCwgKnJlczsKLQlQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVsX3N0ciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRlbCwgKnJlczsKKyAgICBQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOwogCi0JLyogVGVtcG9yYXJpbHkgcmVzdXJyZWN0IHRoZSBvYmplY3QuICovCi0JYXNzZXJ0KHNlbGYtPm9iX3JlZmNudCA9PSAwKTsKLQlzZWxmLT5vYl9yZWZjbnQgPSAxOworICAgIC8qIFRlbXBvcmFyaWx5IHJlc3VycmVjdCB0aGUgb2JqZWN0LiAqLworICAgIGFzc2VydChzZWxmLT5vYl9yZWZjbnQgPT0gMCk7CisgICAgc2VsZi0+b2JfcmVmY250ID0gMTsKIAotCS8qIFNhdmUgdGhlIGN1cnJlbnQgZXhjZXB0aW9uLCBpZiBhbnkuICovCi0JUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KKyAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKIAotCS8qIEV4ZWN1dGUgX19kZWxfXyBtZXRob2QsIGlmIGFueS4gKi8KLQlkZWwgPSBsb29rdXBfbWF5YmUoc2VsZiwgIl9fZGVsX18iLCAmZGVsX3N0cik7Ci0JaWYgKGRlbCAhPSBOVUxMKSB7Ci0JCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGRlbCwgTlVMTCk7Ci0JCWlmIChyZXMgPT0gTlVMTCkKLQkJCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShkZWwpOwotCQllbHNlCi0JCQlQeV9ERUNSRUYocmVzKTsKLQkJUHlfREVDUkVGKGRlbCk7Ci0JfQorICAgIC8qIEV4ZWN1dGUgX19kZWxfXyBtZXRob2QsIGlmIGFueS4gKi8KKyAgICBkZWwgPSBsb29rdXBfbWF5YmUoc2VsZiwgIl9fZGVsX18iLCAmZGVsX3N0cik7CisgICAgaWYgKGRlbCAhPSBOVUxMKSB7CisgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGRlbCwgTlVMTCk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShkZWwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgUHlfREVDUkVGKGRlbCk7CisgICAgfQogCi0JLyogUmVzdG9yZSB0aGUgc2F2ZWQgZXhjZXB0aW9uLiAqLwotCVB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7CisgICAgLyogUmVzdG9yZSB0aGUgc2F2ZWQgZXhjZXB0aW9uLiAqLworICAgIFB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7CiAKLQkvKiBVbmRvIHRoZSB0ZW1wb3JhcnkgcmVzdXJyZWN0aW9uOyBjYW4ndCB1c2UgREVDUkVGIGhlcmUsIGl0IHdvdWxkCi0JICogY2F1c2UgYSByZWN1cnNpdmUgY2FsbC4KLQkgKi8KLQlhc3NlcnQoc2VsZi0+b2JfcmVmY250ID4gMCk7Ci0JaWYgKC0tc2VsZi0+b2JfcmVmY250ID09IDApCi0JCXJldHVybjsJLyogdGhpcyBpcyB0aGUgbm9ybWFsIHBhdGggb3V0ICovCisgICAgLyogVW5kbyB0aGUgdGVtcG9yYXJ5IHJlc3VycmVjdGlvbjsgY2FuJ3QgdXNlIERFQ1JFRiBoZXJlLCBpdCB3b3VsZAorICAgICAqIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwuCisgICAgICovCisgICAgYXNzZXJ0KHNlbGYtPm9iX3JlZmNudCA+IDApOworICAgIGlmICgtLXNlbGYtPm9iX3JlZmNudCA9PSAwKQorICAgICAgICByZXR1cm47ICAgICAgICAgLyogdGhpcyBpcyB0aGUgbm9ybWFsIHBhdGggb3V0ICovCiAKLQkvKiBfX2RlbF9fIHJlc3VycmVjdGVkIGl0ISAgTWFrZSBpdCBsb29rIGxpa2UgdGhlIG9yaWdpbmFsIFB5X0RFQ1JFRgotCSAqIG5ldmVyIGhhcHBlbmVkLgotCSAqLwotCXsKLQkJUHlfc3NpemVfdCByZWZjbnQgPSBzZWxmLT5vYl9yZWZjbnQ7Ci0JCV9QeV9OZXdSZWZlcmVuY2Uoc2VsZik7Ci0JCXNlbGYtPm9iX3JlZmNudCA9IHJlZmNudDsKLQl9Ci0JYXNzZXJ0KCFQeVR5cGVfSVNfR0MoUHlfVFlQRShzZWxmKSkgfHwKLQkgICAgICAgX1B5X0FTX0dDKHNlbGYpLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsKLQkvKiBJZiBQeV9SRUZfREVCVUcsIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIF9QeV9SZWZUb3RhbCwgc28KLQkgKiB3ZSBuZWVkIHRvIHVuZG8gdGhhdC4gKi8KLQlfUHlfREVDX1JFRlRPVEFMOwotCS8qIElmIFB5X1RSQUNFX1JFRlMsIF9QeV9OZXdSZWZlcmVuY2UgcmUtYWRkZWQgc2VsZiB0byB0aGUgb2JqZWN0Ci0JICogY2hhaW4sIHNvIG5vIG1vcmUgdG8gZG8gdGhlcmUuCi0JICogSWYgQ09VTlRfQUxMT0NTLCB0aGUgb3JpZ2luYWwgZGVjcmVmIGJ1bXBlZCB0cF9mcmVlcywgYW5kCi0JICogX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgdHBfYWxsb2NzOiAgYm90aCBvZiB0aG9zZSBuZWVkIHRvIGJlCi0JICogdW5kb25lLgotCSAqLworICAgIC8qIF9fZGVsX18gcmVzdXJyZWN0ZWQgaXQhICBNYWtlIGl0IGxvb2sgbGlrZSB0aGUgb3JpZ2luYWwgUHlfREVDUkVGCisgICAgICogbmV2ZXIgaGFwcGVuZWQuCisgICAgICovCisgICAgeworICAgICAgICBQeV9zc2l6ZV90IHJlZmNudCA9IHNlbGYtPm9iX3JlZmNudDsKKyAgICAgICAgX1B5X05ld1JlZmVyZW5jZShzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfcmVmY250ID0gcmVmY250OworICAgIH0KKyAgICBhc3NlcnQoIVB5VHlwZV9JU19HQyhQeV9UWVBFKHNlbGYpKSB8fAorICAgICAgICAgICBfUHlfQVNfR0Moc2VsZiktPmdjLmdjX3JlZnMgIT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpOworICAgIC8qIElmIFB5X1JFRl9ERUJVRywgX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgX1B5X1JlZlRvdGFsLCBzbworICAgICAqIHdlIG5lZWQgdG8gdW5kbyB0aGF0LiAqLworICAgIF9QeV9ERUNfUkVGVE9UQUw7CisgICAgLyogSWYgUHlfVFJBQ0VfUkVGUywgX1B5X05ld1JlZmVyZW5jZSByZS1hZGRlZCBzZWxmIHRvIHRoZSBvYmplY3QKKyAgICAgKiBjaGFpbiwgc28gbm8gbW9yZSB0byBkbyB0aGVyZS4KKyAgICAgKiBJZiBDT1VOVF9BTExPQ1MsIHRoZSBvcmlnaW5hbCBkZWNyZWYgYnVtcGVkIHRwX2ZyZWVzLCBhbmQKKyAgICAgKiBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCB0cF9hbGxvY3M6ICBib3RoIG9mIHRob3NlIG5lZWQgdG8gYmUKKyAgICAgKiB1bmRvbmUuCisgICAgICovCiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JLS1QeV9UWVBFKHNlbGYpLT50cF9mcmVlczsKLQktLVB5X1RZUEUoc2VsZiktPnRwX2FsbG9jczsKKyAgICAtLVB5X1RZUEUoc2VsZiktPnRwX2ZyZWVzOworICAgIC0tUHlfVFlQRShzZWxmKS0+dHBfYWxsb2NzOwogI2VuZGlmCiB9CiAKQEAgLTU3OTEsMjY3ICs1NzkxLDI2NyBAQAogI3VuZGVmIFJCSU5TTE9UCiAKICNkZWZpbmUgVFBTTE9UKE5BTUUsIFNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MpIFwKLQl7TkFNRSwgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCBTTE9UKSwgKHZvaWQgKikoRlVOQ1RJT04pLCBXUkFQUEVSLCBcCi0JIFB5RG9jX1NUUihET0MpfQorICAgIHtOQU1FLCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIFNMT1QpLCAodm9pZCAqKShGVU5DVElPTiksIFdSQVBQRVIsIFwKKyAgICAgUHlEb2NfU1RSKERPQyl9CiAjZGVmaW5lIEZMU0xPVChOQU1FLCBTTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DLCBGTEFHUykgXAotCXtOQU1FLCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIFNMT1QpLCAodm9pZCAqKShGVU5DVElPTiksIFdSQVBQRVIsIFwKLQkgUHlEb2NfU1RSKERPQyksIEZMQUdTfQorICAgIHtOQU1FLCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIFNMT1QpLCAodm9pZCAqKShGVU5DVElPTiksIFdSQVBQRVIsIFwKKyAgICAgUHlEb2NfU1RSKERPQyksIEZMQUdTfQogI2RlZmluZSBFVFNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCXtOQU1FLCBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBTTE9UKSwgKHZvaWQgKikoRlVOQ1RJT04pLCBXUkFQUEVSLCBcCi0JIFB5RG9jX1NUUihET0MpfQorICAgIHtOQU1FLCBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBTTE9UKSwgKHZvaWQgKikoRlVOQ1RJT04pLCBXUkFQUEVSLCBcCisgICAgIFB5RG9jX1NUUihET0MpfQogI2RlZmluZSBTUVNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19zZXF1ZW5jZS5TTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKQorICAgIEVUU0xPVChOQU1FLCBhc19zZXF1ZW5jZS5TTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKQogI2RlZmluZSBNUFNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19tYXBwaW5nLlNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MpCisgICAgRVRTTE9UKE5BTUUsIGFzX21hcHBpbmcuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykKICNkZWZpbmUgTkJTTE9UKE5BTUUsIFNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MpIFwKLQlFVFNMT1QoTkFNRSwgYXNfbnVtYmVyLlNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MpCisgICAgRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKQogI2RlZmluZSBVTlNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIFwKLQkgICAgICAgInguIiBOQU1FICIoKSA8PT0+ICIgRE9DKQorICAgIEVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIFwKKyAgICAgICAgICAgInguIiBOQU1FICIoKSA8PT0+ICIgRE9DKQogI2RlZmluZSBJQlNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIFwKLQkgICAgICAgInguIiBOQU1FICIoeSkgPD09PiB4IiBET0MgInkiKQorICAgIEVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIFwKKyAgICAgICAgICAgInguIiBOQU1FICIoeSkgPD09PiB4IiBET0MgInkiKQogI2RlZmluZSBCSU5TTE9UKE5BTUUsIFNMT1QsIEZVTkNUSU9OLCBET0MpIFwKLQlFVFNMT1QoTkFNRSwgYXNfbnVtYmVyLlNMT1QsIEZVTkNUSU9OLCB3cmFwX2JpbmFyeWZ1bmNfbCwgXAotCSAgICAgICAieC4iIE5BTUUgIih5KSA8PT0+IHgiIERPQyAieSIpCisgICAgRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgd3JhcF9iaW5hcnlmdW5jX2wsIFwKKyAgICAgICAgICAgInguIiBOQU1FICIoeSkgPD09PiB4IiBET0MgInkiKQogI2RlZmluZSBSQklOU0xPVChOQU1FLCBTTE9ULCBGVU5DVElPTiwgRE9DKSBcCi0JRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgd3JhcF9iaW5hcnlmdW5jX3IsIFwKLQkgICAgICAgInguIiBOQU1FICIoeSkgPD09PiB5IiBET0MgIngiKQorICAgIEVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIHdyYXBfYmluYXJ5ZnVuY19yLCBcCisgICAgICAgICAgICJ4LiIgTkFNRSAiKHkpIDw9PT4geSIgRE9DICJ4IikKICNkZWZpbmUgQklOU0xPVE5PVElORklYKE5BTUUsIFNMT1QsIEZVTkNUSU9OLCBET0MpIFwKLQlFVFNMT1QoTkFNRSwgYXNfbnVtYmVyLlNMT1QsIEZVTkNUSU9OLCB3cmFwX2JpbmFyeWZ1bmNfbCwgXAotCSAgICAgICAieC4iIE5BTUUgIih5KSA8PT0+ICIgRE9DKQorICAgIEVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIHdyYXBfYmluYXJ5ZnVuY19sLCBcCisgICAgICAgICAgICJ4LiIgTkFNRSAiKHkpIDw9PT4gIiBET0MpCiAjZGVmaW5lIFJCSU5TTE9UTk9USU5GSVgoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIHdyYXBfYmluYXJ5ZnVuY19yLCBcCi0JICAgICAgICJ4LiIgTkFNRSAiKHkpIDw9PT4gIiBET0MpCisgICAgRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgd3JhcF9iaW5hcnlmdW5jX3IsIFwKKyAgICAgICAgICAgInguIiBOQU1FICIoeSkgPD09PiAiIERPQykKIAogc3RhdGljIHNsb3RkZWYgc2xvdGRlZnNbXSA9IHsKLQlTUVNMT1QoIl9fbGVuX18iLCBzcV9sZW5ndGgsIHNsb3Rfc3FfbGVuZ3RoLCB3cmFwX2xlbmZ1bmMsCi0JICAgICAgICJ4Ll9fbGVuX18oKSA8PT0+IGxlbih4KSIpLAotCS8qIEhlYXAgdHlwZXMgZGVmaW5pbmcgX19hZGRfXy9fX211bF9fIGhhdmUgc3FfY29uY2F0L3NxX3JlcGVhdCA9PSBOVUxMLgotCSAgIFRoZSBsb2dpYyBpbiBhYnN0cmFjdC5jIGFsd2F5cyBmYWxscyBiYWNrIHRvIG5iX2FkZC9uYl9tdWx0aXBseSBpbgotCSAgIHRoaXMgY2FzZS4gIERlZmluaW5nIGJvdGggdGhlIG5iXyogYW5kIHRoZSBzcV8qIHNsb3RzIHRvIGNhbGwgdGhlCi0JICAgdXNlci1kZWZpbmVkIG1ldGhvZHMgaGFzIHVuZXhwZWN0ZWQgc2lkZS1lZmZlY3RzLCBhcyBzaG93biBieQotCSAgIHRlc3RfZGVzY3Iubm90aW1wbGVtZW50ZWQoKSAqLwotCVNRU0xPVCgiX19hZGRfXyIsIHNxX2NvbmNhdCwgTlVMTCwgd3JhcF9iaW5hcnlmdW5jLAotCSAgInguX19hZGRfXyh5KSA8PT0+IHgreSIpLAotCVNRU0xPVCgiX19tdWxfXyIsIHNxX3JlcGVhdCwgTlVMTCwgd3JhcF9pbmRleGFyZ2Z1bmMsCi0JICAieC5fX211bF9fKG4pIDw9PT4geCpuIiksCi0JU1FTTE9UKCJfX3JtdWxfXyIsIHNxX3JlcGVhdCwgTlVMTCwgd3JhcF9pbmRleGFyZ2Z1bmMsCi0JICAieC5fX3JtdWxfXyhuKSA8PT0+IG4qeCIpLAotCVNRU0xPVCgiX19nZXRpdGVtX18iLCBzcV9pdGVtLCBzbG90X3NxX2l0ZW0sIHdyYXBfc3FfaXRlbSwKLQkgICAgICAgInguX19nZXRpdGVtX18oeSkgPD09PiB4W3ldIiksCi0JU1FTTE9UKCJfX2dldHNsaWNlX18iLCBzcV9zbGljZSwgc2xvdF9zcV9zbGljZSwgd3JhcF9zc2l6ZXNzaXplYXJnZnVuYywKLQkgICAgICAgInguX19nZXRzbGljZV9fKGksIGopIDw9PT4geFtpOmpdXG5cCi0JICAgICAgIFxuXAotCSAgICAgICBVc2Ugb2YgbmVnYXRpdmUgaW5kaWNlcyBpcyBub3Qgc3VwcG9ydGVkLiIpLAotCVNRU0xPVCgiX19zZXRpdGVtX18iLCBzcV9hc3NfaXRlbSwgc2xvdF9zcV9hc3NfaXRlbSwgd3JhcF9zcV9zZXRpdGVtLAotCSAgICAgICAieC5fX3NldGl0ZW1fXyhpLCB5KSA8PT0+IHhbaV09eSIpLAotCVNRU0xPVCgiX19kZWxpdGVtX18iLCBzcV9hc3NfaXRlbSwgc2xvdF9zcV9hc3NfaXRlbSwgd3JhcF9zcV9kZWxpdGVtLAotCSAgICAgICAieC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCB4W3ldIiksCi0JU1FTTE9UKCJfX3NldHNsaWNlX18iLCBzcV9hc3Nfc2xpY2UsIHNsb3Rfc3FfYXNzX3NsaWNlLAotCSAgICAgICB3cmFwX3NzaXplc3NpemVvYmphcmdwcm9jLAotCSAgICAgICAieC5fX3NldHNsaWNlX18oaSwgaiwgeSkgPD09PiB4W2k6al09eVxuXAotCSAgICAgICBcblwKLQkgICAgICAgVXNlICBvZiBuZWdhdGl2ZSBpbmRpY2VzIGlzIG5vdCBzdXBwb3J0ZWQuIiksCi0JU1FTTE9UKCJfX2RlbHNsaWNlX18iLCBzcV9hc3Nfc2xpY2UsIHNsb3Rfc3FfYXNzX3NsaWNlLCB3cmFwX2RlbHNsaWNlLAotCSAgICAgICAieC5fX2RlbHNsaWNlX18oaSwgaikgPD09PiBkZWwgeFtpOmpdXG5cCi0JICAgICAgIFxuXAotCSAgICAgICBVc2Ugb2YgbmVnYXRpdmUgaW5kaWNlcyBpcyBub3Qgc3VwcG9ydGVkLiIpLAotCVNRU0xPVCgiX19jb250YWluc19fIiwgc3FfY29udGFpbnMsIHNsb3Rfc3FfY29udGFpbnMsIHdyYXBfb2Jqb2JqcHJvYywKLQkgICAgICAgInguX19jb250YWluc19fKHkpIDw9PT4geSBpbiB4IiksCi0JU1FTTE9UKCJfX2lhZGRfXyIsIHNxX2lucGxhY2VfY29uY2F0LCBOVUxMLAotCSAgd3JhcF9iaW5hcnlmdW5jLCAieC5fX2lhZGRfXyh5KSA8PT0+IHgrPXkiKSwKLQlTUVNMT1QoIl9faW11bF9fIiwgc3FfaW5wbGFjZV9yZXBlYXQsIE5VTEwsCi0JICB3cmFwX2luZGV4YXJnZnVuYywgInguX19pbXVsX18oeSkgPD09PiB4Kj15IiksCisgICAgU1FTTE9UKCJfX2xlbl9fIiwgc3FfbGVuZ3RoLCBzbG90X3NxX2xlbmd0aCwgd3JhcF9sZW5mdW5jLAorICAgICAgICAgICAieC5fX2xlbl9fKCkgPD09PiBsZW4oeCkiKSwKKyAgICAvKiBIZWFwIHR5cGVzIGRlZmluaW5nIF9fYWRkX18vX19tdWxfXyBoYXZlIHNxX2NvbmNhdC9zcV9yZXBlYXQgPT0gTlVMTC4KKyAgICAgICBUaGUgbG9naWMgaW4gYWJzdHJhY3QuYyBhbHdheXMgZmFsbHMgYmFjayB0byBuYl9hZGQvbmJfbXVsdGlwbHkgaW4KKyAgICAgICB0aGlzIGNhc2UuICBEZWZpbmluZyBib3RoIHRoZSBuYl8qIGFuZCB0aGUgc3FfKiBzbG90cyB0byBjYWxsIHRoZQorICAgICAgIHVzZXItZGVmaW5lZCBtZXRob2RzIGhhcyB1bmV4cGVjdGVkIHNpZGUtZWZmZWN0cywgYXMgc2hvd24gYnkKKyAgICAgICB0ZXN0X2Rlc2NyLm5vdGltcGxlbWVudGVkKCkgKi8KKyAgICBTUVNMT1QoIl9fYWRkX18iLCBzcV9jb25jYXQsIE5VTEwsIHdyYXBfYmluYXJ5ZnVuYywKKyAgICAgICJ4Ll9fYWRkX18oeSkgPD09PiB4K3kiKSwKKyAgICBTUVNMT1QoIl9fbXVsX18iLCBzcV9yZXBlYXQsIE5VTEwsIHdyYXBfaW5kZXhhcmdmdW5jLAorICAgICAgInguX19tdWxfXyhuKSA8PT0+IHgqbiIpLAorICAgIFNRU0xPVCgiX19ybXVsX18iLCBzcV9yZXBlYXQsIE5VTEwsIHdyYXBfaW5kZXhhcmdmdW5jLAorICAgICAgInguX19ybXVsX18obikgPD09PiBuKngiKSwKKyAgICBTUVNMT1QoIl9fZ2V0aXRlbV9fIiwgc3FfaXRlbSwgc2xvdF9zcV9pdGVtLCB3cmFwX3NxX2l0ZW0sCisgICAgICAgICAgICJ4Ll9fZ2V0aXRlbV9fKHkpIDw9PT4geFt5XSIpLAorICAgIFNRU0xPVCgiX19nZXRzbGljZV9fIiwgc3Ffc2xpY2UsIHNsb3Rfc3Ffc2xpY2UsIHdyYXBfc3NpemVzc2l6ZWFyZ2Z1bmMsCisgICAgICAgICAgICJ4Ll9fZ2V0c2xpY2VfXyhpLCBqKSA8PT0+IHhbaTpqXVxuXAorICAgICAgICAgICBcblwKKyAgICAgICAgICAgVXNlIG9mIG5lZ2F0aXZlIGluZGljZXMgaXMgbm90IHN1cHBvcnRlZC4iKSwKKyAgICBTUVNMT1QoIl9fc2V0aXRlbV9fIiwgc3FfYXNzX2l0ZW0sIHNsb3Rfc3FfYXNzX2l0ZW0sIHdyYXBfc3Ffc2V0aXRlbSwKKyAgICAgICAgICAgInguX19zZXRpdGVtX18oaSwgeSkgPD09PiB4W2ldPXkiKSwKKyAgICBTUVNMT1QoIl9fZGVsaXRlbV9fIiwgc3FfYXNzX2l0ZW0sIHNsb3Rfc3FfYXNzX2l0ZW0sIHdyYXBfc3FfZGVsaXRlbSwKKyAgICAgICAgICAgInguX19kZWxpdGVtX18oeSkgPD09PiBkZWwgeFt5XSIpLAorICAgIFNRU0xPVCgiX19zZXRzbGljZV9fIiwgc3FfYXNzX3NsaWNlLCBzbG90X3NxX2Fzc19zbGljZSwKKyAgICAgICAgICAgd3JhcF9zc2l6ZXNzaXplb2JqYXJncHJvYywKKyAgICAgICAgICAgInguX19zZXRzbGljZV9fKGksIGosIHkpIDw9PT4geFtpOmpdPXlcblwKKyAgICAgICAgICAgXG5cCisgICAgICAgICAgIFVzZSAgb2YgbmVnYXRpdmUgaW5kaWNlcyBpcyBub3Qgc3VwcG9ydGVkLiIpLAorICAgIFNRU0xPVCgiX19kZWxzbGljZV9fIiwgc3FfYXNzX3NsaWNlLCBzbG90X3NxX2Fzc19zbGljZSwgd3JhcF9kZWxzbGljZSwKKyAgICAgICAgICAgInguX19kZWxzbGljZV9fKGksIGopIDw9PT4gZGVsIHhbaTpqXVxuXAorICAgICAgICAgICBcblwKKyAgICAgICAgICAgVXNlIG9mIG5lZ2F0aXZlIGluZGljZXMgaXMgbm90IHN1cHBvcnRlZC4iKSwKKyAgICBTUVNMT1QoIl9fY29udGFpbnNfXyIsIHNxX2NvbnRhaW5zLCBzbG90X3NxX2NvbnRhaW5zLCB3cmFwX29iam9ianByb2MsCisgICAgICAgICAgICJ4Ll9fY29udGFpbnNfXyh5KSA8PT0+IHkgaW4geCIpLAorICAgIFNRU0xPVCgiX19pYWRkX18iLCBzcV9pbnBsYWNlX2NvbmNhdCwgTlVMTCwKKyAgICAgIHdyYXBfYmluYXJ5ZnVuYywgInguX19pYWRkX18oeSkgPD09PiB4Kz15IiksCisgICAgU1FTTE9UKCJfX2ltdWxfXyIsIHNxX2lucGxhY2VfcmVwZWF0LCBOVUxMLAorICAgICAgd3JhcF9pbmRleGFyZ2Z1bmMsICJ4Ll9faW11bF9fKHkpIDw9PT4geCo9eSIpLAogCi0JTVBTTE9UKCJfX2xlbl9fIiwgbXBfbGVuZ3RoLCBzbG90X21wX2xlbmd0aCwgd3JhcF9sZW5mdW5jLAotCSAgICAgICAieC5fX2xlbl9fKCkgPD09PiBsZW4oeCkiKSwKLQlNUFNMT1QoIl9fZ2V0aXRlbV9fIiwgbXBfc3Vic2NyaXB0LCBzbG90X21wX3N1YnNjcmlwdCwKLQkgICAgICAgd3JhcF9iaW5hcnlmdW5jLAotCSAgICAgICAieC5fX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV0iKSwKLQlNUFNMT1QoIl9fc2V0aXRlbV9fIiwgbXBfYXNzX3N1YnNjcmlwdCwgc2xvdF9tcF9hc3Nfc3Vic2NyaXB0LAotCSAgICAgICB3cmFwX29iam9iamFyZ3Byb2MsCi0JICAgICAgICJ4Ll9fc2V0aXRlbV9fKGksIHkpIDw9PT4geFtpXT15IiksCi0JTVBTTE9UKCJfX2RlbGl0ZW1fXyIsIG1wX2Fzc19zdWJzY3JpcHQsIHNsb3RfbXBfYXNzX3N1YnNjcmlwdCwKLQkgICAgICAgd3JhcF9kZWxpdGVtLAotCSAgICAgICAieC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCB4W3ldIiksCisgICAgTVBTTE9UKCJfX2xlbl9fIiwgbXBfbGVuZ3RoLCBzbG90X21wX2xlbmd0aCwgd3JhcF9sZW5mdW5jLAorICAgICAgICAgICAieC5fX2xlbl9fKCkgPD09PiBsZW4oeCkiKSwKKyAgICBNUFNMT1QoIl9fZ2V0aXRlbV9fIiwgbXBfc3Vic2NyaXB0LCBzbG90X21wX3N1YnNjcmlwdCwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLAorICAgICAgICAgICAieC5fX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV0iKSwKKyAgICBNUFNMT1QoIl9fc2V0aXRlbV9fIiwgbXBfYXNzX3N1YnNjcmlwdCwgc2xvdF9tcF9hc3Nfc3Vic2NyaXB0LAorICAgICAgICAgICB3cmFwX29iam9iamFyZ3Byb2MsCisgICAgICAgICAgICJ4Ll9fc2V0aXRlbV9fKGksIHkpIDw9PT4geFtpXT15IiksCisgICAgTVBTTE9UKCJfX2RlbGl0ZW1fXyIsIG1wX2Fzc19zdWJzY3JpcHQsIHNsb3RfbXBfYXNzX3N1YnNjcmlwdCwKKyAgICAgICAgICAgd3JhcF9kZWxpdGVtLAorICAgICAgICAgICAieC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCB4W3ldIiksCiAKLQlCSU5TTE9UKCJfX2FkZF9fIiwgbmJfYWRkLCBzbG90X25iX2FkZCwKLQkJIisiKSwKLQlSQklOU0xPVCgiX19yYWRkX18iLCBuYl9hZGQsIHNsb3RfbmJfYWRkLAotCQkgIisiKSwKLQlCSU5TTE9UKCJfX3N1Yl9fIiwgbmJfc3VidHJhY3QsIHNsb3RfbmJfc3VidHJhY3QsCi0JCSItIiksCi0JUkJJTlNMT1QoIl9fcnN1Yl9fIiwgbmJfc3VidHJhY3QsIHNsb3RfbmJfc3VidHJhY3QsCi0JCSAiLSIpLAotCUJJTlNMT1QoIl9fbXVsX18iLCBuYl9tdWx0aXBseSwgc2xvdF9uYl9tdWx0aXBseSwKLQkJIioiKSwKLQlSQklOU0xPVCgiX19ybXVsX18iLCBuYl9tdWx0aXBseSwgc2xvdF9uYl9tdWx0aXBseSwKLQkJICIqIiksCi0JQklOU0xPVCgiX19kaXZfXyIsIG5iX2RpdmlkZSwgc2xvdF9uYl9kaXZpZGUsCi0JCSIvIiksCi0JUkJJTlNMT1QoIl9fcmRpdl9fIiwgbmJfZGl2aWRlLCBzbG90X25iX2RpdmlkZSwKLQkJICIvIiksCi0JQklOU0xPVCgiX19tb2RfXyIsIG5iX3JlbWFpbmRlciwgc2xvdF9uYl9yZW1haW5kZXIsCi0JCSIlIiksCi0JUkJJTlNMT1QoIl9fcm1vZF9fIiwgbmJfcmVtYWluZGVyLCBzbG90X25iX3JlbWFpbmRlciwKLQkJICIlIiksCi0JQklOU0xPVE5PVElORklYKCJfX2Rpdm1vZF9fIiwgbmJfZGl2bW9kLCBzbG90X25iX2Rpdm1vZCwKLQkJImRpdm1vZCh4LCB5KSIpLAotCVJCSU5TTE9UTk9USU5GSVgoIl9fcmRpdm1vZF9fIiwgbmJfZGl2bW9kLCBzbG90X25iX2Rpdm1vZCwKLQkJICJkaXZtb2QoeSwgeCkiKSwKLQlOQlNMT1QoIl9fcG93X18iLCBuYl9wb3dlciwgc2xvdF9uYl9wb3dlciwgd3JhcF90ZXJuYXJ5ZnVuYywKLQkgICAgICAgInguX19wb3dfXyh5Wywgel0pIDw9PT4gcG93KHgsIHlbLCB6XSkiKSwKLQlOQlNMT1QoIl9fcnBvd19fIiwgbmJfcG93ZXIsIHNsb3RfbmJfcG93ZXIsIHdyYXBfdGVybmFyeWZ1bmNfciwKLQkgICAgICAgInkuX19ycG93X18oeFssIHpdKSA8PT0+IHBvdyh4LCB5Wywgel0pIiksCi0JVU5TTE9UKCJfX25lZ19fIiwgbmJfbmVnYXRpdmUsIHNsb3RfbmJfbmVnYXRpdmUsIHdyYXBfdW5hcnlmdW5jLCAiLXgiKSwKLQlVTlNMT1QoIl9fcG9zX18iLCBuYl9wb3NpdGl2ZSwgc2xvdF9uYl9wb3NpdGl2ZSwgd3JhcF91bmFyeWZ1bmMsICIreCIpLAotCVVOU0xPVCgiX19hYnNfXyIsIG5iX2Fic29sdXRlLCBzbG90X25iX2Fic29sdXRlLCB3cmFwX3VuYXJ5ZnVuYywKLQkgICAgICAgImFicyh4KSIpLAotCVVOU0xPVCgiX19ub256ZXJvX18iLCBuYl9ub256ZXJvLCBzbG90X25iX25vbnplcm8sIHdyYXBfaW5xdWlyeXByZWQsCi0JICAgICAgICJ4ICE9IDAiKSwKLQlVTlNMT1QoIl9faW52ZXJ0X18iLCBuYl9pbnZlcnQsIHNsb3RfbmJfaW52ZXJ0LCB3cmFwX3VuYXJ5ZnVuYywgIn54IiksCi0JQklOU0xPVCgiX19sc2hpZnRfXyIsIG5iX2xzaGlmdCwgc2xvdF9uYl9sc2hpZnQsICI8PCIpLAotCVJCSU5TTE9UKCJfX3Jsc2hpZnRfXyIsIG5iX2xzaGlmdCwgc2xvdF9uYl9sc2hpZnQsICI8PCIpLAotCUJJTlNMT1QoIl9fcnNoaWZ0X18iLCBuYl9yc2hpZnQsIHNsb3RfbmJfcnNoaWZ0LCAiPj4iKSwKLQlSQklOU0xPVCgiX19ycnNoaWZ0X18iLCBuYl9yc2hpZnQsIHNsb3RfbmJfcnNoaWZ0LCAiPj4iKSwKLQlCSU5TTE9UKCJfX2FuZF9fIiwgbmJfYW5kLCBzbG90X25iX2FuZCwgIiYiKSwKLQlSQklOU0xPVCgiX19yYW5kX18iLCBuYl9hbmQsIHNsb3RfbmJfYW5kLCAiJiIpLAotCUJJTlNMT1QoIl9feG9yX18iLCBuYl94b3IsIHNsb3RfbmJfeG9yLCAiXiIpLAotCVJCSU5TTE9UKCJfX3J4b3JfXyIsIG5iX3hvciwgc2xvdF9uYl94b3IsICJeIiksCi0JQklOU0xPVCgiX19vcl9fIiwgbmJfb3IsIHNsb3RfbmJfb3IsICJ8IiksCi0JUkJJTlNMT1QoIl9fcm9yX18iLCBuYl9vciwgc2xvdF9uYl9vciwgInwiKSwKLQlOQlNMT1QoIl9fY29lcmNlX18iLCBuYl9jb2VyY2UsIHNsb3RfbmJfY29lcmNlLCB3cmFwX2NvZXJjZWZ1bmMsCi0JICAgICAgICJ4Ll9fY29lcmNlX18oeSkgPD09PiBjb2VyY2UoeCwgeSkiKSwKLQlVTlNMT1QoIl9faW50X18iLCBuYl9pbnQsIHNsb3RfbmJfaW50LCB3cmFwX3VuYXJ5ZnVuYywKLQkgICAgICAgImludCh4KSIpLAotCVVOU0xPVCgiX19sb25nX18iLCBuYl9sb25nLCBzbG90X25iX2xvbmcsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAibG9uZyh4KSIpLAotCVVOU0xPVCgiX19mbG9hdF9fIiwgbmJfZmxvYXQsIHNsb3RfbmJfZmxvYXQsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAiZmxvYXQoeCkiKSwKLQlVTlNMT1QoIl9fb2N0X18iLCBuYl9vY3QsIHNsb3RfbmJfb2N0LCB3cmFwX3VuYXJ5ZnVuYywKLQkgICAgICAgIm9jdCh4KSIpLAotCVVOU0xPVCgiX19oZXhfXyIsIG5iX2hleCwgc2xvdF9uYl9oZXgsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAiaGV4KHgpIiksCi0JTkJTTE9UKCJfX2luZGV4X18iLCBuYl9pbmRleCwgc2xvdF9uYl9pbmRleCwgd3JhcF91bmFyeWZ1bmMsIAotCSAgICAgICAieFt5OnpdIDw9PT4geFt5Ll9faW5kZXhfXygpOnouX19pbmRleF9fKCldIiksCi0JSUJTTE9UKCJfX2lhZGRfXyIsIG5iX2lucGxhY2VfYWRkLCBzbG90X25iX2lucGxhY2VfYWRkLAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIrIiksCi0JSUJTTE9UKCJfX2lzdWJfXyIsIG5iX2lucGxhY2Vfc3VidHJhY3QsIHNsb3RfbmJfaW5wbGFjZV9zdWJ0cmFjdCwKLQkgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiLSIpLAotCUlCU0xPVCgiX19pbXVsX18iLCBuYl9pbnBsYWNlX211bHRpcGx5LCBzbG90X25iX2lucGxhY2VfbXVsdGlwbHksCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIioiKSwKLQlJQlNMT1QoIl9faWRpdl9fIiwgbmJfaW5wbGFjZV9kaXZpZGUsIHNsb3RfbmJfaW5wbGFjZV9kaXZpZGUsCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIi8iKSwKLQlJQlNMT1QoIl9faW1vZF9fIiwgbmJfaW5wbGFjZV9yZW1haW5kZXIsIHNsb3RfbmJfaW5wbGFjZV9yZW1haW5kZXIsCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIiUiKSwKLQlJQlNMT1QoIl9faXBvd19fIiwgbmJfaW5wbGFjZV9wb3dlciwgc2xvdF9uYl9pbnBsYWNlX3Bvd2VyLAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIqKiIpLAotCUlCU0xPVCgiX19pbHNoaWZ0X18iLCBuYl9pbnBsYWNlX2xzaGlmdCwgc2xvdF9uYl9pbnBsYWNlX2xzaGlmdCwKLQkgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiPDwiKSwKLQlJQlNMT1QoIl9faXJzaGlmdF9fIiwgbmJfaW5wbGFjZV9yc2hpZnQsIHNsb3RfbmJfaW5wbGFjZV9yc2hpZnQsCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIj4+IiksCi0JSUJTTE9UKCJfX2lhbmRfXyIsIG5iX2lucGxhY2VfYW5kLCBzbG90X25iX2lucGxhY2VfYW5kLAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICImIiksCi0JSUJTTE9UKCJfX2l4b3JfXyIsIG5iX2lucGxhY2VfeG9yLCBzbG90X25iX2lucGxhY2VfeG9yLAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICJeIiksCi0JSUJTTE9UKCJfX2lvcl9fIiwgbmJfaW5wbGFjZV9vciwgc2xvdF9uYl9pbnBsYWNlX29yLAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICJ8IiksCi0JQklOU0xPVCgiX19mbG9vcmRpdl9fIiwgbmJfZmxvb3JfZGl2aWRlLCBzbG90X25iX2Zsb29yX2RpdmlkZSwgIi8vIiksCi0JUkJJTlNMT1QoIl9fcmZsb29yZGl2X18iLCBuYl9mbG9vcl9kaXZpZGUsIHNsb3RfbmJfZmxvb3JfZGl2aWRlLCAiLy8iKSwKLQlCSU5TTE9UKCJfX3RydWVkaXZfXyIsIG5iX3RydWVfZGl2aWRlLCBzbG90X25iX3RydWVfZGl2aWRlLCAiLyIpLAotCVJCSU5TTE9UKCJfX3J0cnVlZGl2X18iLCBuYl90cnVlX2RpdmlkZSwgc2xvdF9uYl90cnVlX2RpdmlkZSwgIi8iKSwKLQlJQlNMT1QoIl9faWZsb29yZGl2X18iLCBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSwKLQkgICAgICAgc2xvdF9uYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSwgd3JhcF9iaW5hcnlmdW5jLCAiLy8iKSwKLQlJQlNMT1QoIl9faXRydWVkaXZfXyIsIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUsCi0JICAgICAgIHNsb3RfbmJfaW5wbGFjZV90cnVlX2RpdmlkZSwgd3JhcF9iaW5hcnlmdW5jLCAiLyIpLAorICAgIEJJTlNMT1QoIl9fYWRkX18iLCBuYl9hZGQsIHNsb3RfbmJfYWRkLAorICAgICAgICAiKyIpLAorICAgIFJCSU5TTE9UKCJfX3JhZGRfXyIsIG5iX2FkZCwgc2xvdF9uYl9hZGQsCisgICAgICAgICAgICAgIisiKSwKKyAgICBCSU5TTE9UKCJfX3N1Yl9fIiwgbmJfc3VidHJhY3QsIHNsb3RfbmJfc3VidHJhY3QsCisgICAgICAgICItIiksCisgICAgUkJJTlNMT1QoIl9fcnN1Yl9fIiwgbmJfc3VidHJhY3QsIHNsb3RfbmJfc3VidHJhY3QsCisgICAgICAgICAgICAgIi0iKSwKKyAgICBCSU5TTE9UKCJfX211bF9fIiwgbmJfbXVsdGlwbHksIHNsb3RfbmJfbXVsdGlwbHksCisgICAgICAgICIqIiksCisgICAgUkJJTlNMT1QoIl9fcm11bF9fIiwgbmJfbXVsdGlwbHksIHNsb3RfbmJfbXVsdGlwbHksCisgICAgICAgICAgICAgIioiKSwKKyAgICBCSU5TTE9UKCJfX2Rpdl9fIiwgbmJfZGl2aWRlLCBzbG90X25iX2RpdmlkZSwKKyAgICAgICAgIi8iKSwKKyAgICBSQklOU0xPVCgiX19yZGl2X18iLCBuYl9kaXZpZGUsIHNsb3RfbmJfZGl2aWRlLAorICAgICAgICAgICAgICIvIiksCisgICAgQklOU0xPVCgiX19tb2RfXyIsIG5iX3JlbWFpbmRlciwgc2xvdF9uYl9yZW1haW5kZXIsCisgICAgICAgICIlIiksCisgICAgUkJJTlNMT1QoIl9fcm1vZF9fIiwgbmJfcmVtYWluZGVyLCBzbG90X25iX3JlbWFpbmRlciwKKyAgICAgICAgICAgICAiJSIpLAorICAgIEJJTlNMT1ROT1RJTkZJWCgiX19kaXZtb2RfXyIsIG5iX2Rpdm1vZCwgc2xvdF9uYl9kaXZtb2QsCisgICAgICAgICJkaXZtb2QoeCwgeSkiKSwKKyAgICBSQklOU0xPVE5PVElORklYKCJfX3JkaXZtb2RfXyIsIG5iX2Rpdm1vZCwgc2xvdF9uYl9kaXZtb2QsCisgICAgICAgICAgICAgImRpdm1vZCh5LCB4KSIpLAorICAgIE5CU0xPVCgiX19wb3dfXyIsIG5iX3Bvd2VyLCBzbG90X25iX3Bvd2VyLCB3cmFwX3Rlcm5hcnlmdW5jLAorICAgICAgICAgICAieC5fX3Bvd19fKHlbLCB6XSkgPD09PiBwb3coeCwgeVssIHpdKSIpLAorICAgIE5CU0xPVCgiX19ycG93X18iLCBuYl9wb3dlciwgc2xvdF9uYl9wb3dlciwgd3JhcF90ZXJuYXJ5ZnVuY19yLAorICAgICAgICAgICAieS5fX3Jwb3dfXyh4Wywgel0pIDw9PT4gcG93KHgsIHlbLCB6XSkiKSwKKyAgICBVTlNMT1QoIl9fbmVnX18iLCBuYl9uZWdhdGl2ZSwgc2xvdF9uYl9uZWdhdGl2ZSwgd3JhcF91bmFyeWZ1bmMsICIteCIpLAorICAgIFVOU0xPVCgiX19wb3NfXyIsIG5iX3Bvc2l0aXZlLCBzbG90X25iX3Bvc2l0aXZlLCB3cmFwX3VuYXJ5ZnVuYywgIit4IiksCisgICAgVU5TTE9UKCJfX2Fic19fIiwgbmJfYWJzb2x1dGUsIHNsb3RfbmJfYWJzb2x1dGUsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAiYWJzKHgpIiksCisgICAgVU5TTE9UKCJfX25vbnplcm9fXyIsIG5iX25vbnplcm8sIHNsb3RfbmJfbm9uemVybywgd3JhcF9pbnF1aXJ5cHJlZCwKKyAgICAgICAgICAgInggIT0gMCIpLAorICAgIFVOU0xPVCgiX19pbnZlcnRfXyIsIG5iX2ludmVydCwgc2xvdF9uYl9pbnZlcnQsIHdyYXBfdW5hcnlmdW5jLCAifngiKSwKKyAgICBCSU5TTE9UKCJfX2xzaGlmdF9fIiwgbmJfbHNoaWZ0LCBzbG90X25iX2xzaGlmdCwgIjw8IiksCisgICAgUkJJTlNMT1QoIl9fcmxzaGlmdF9fIiwgbmJfbHNoaWZ0LCBzbG90X25iX2xzaGlmdCwgIjw8IiksCisgICAgQklOU0xPVCgiX19yc2hpZnRfXyIsIG5iX3JzaGlmdCwgc2xvdF9uYl9yc2hpZnQsICI+PiIpLAorICAgIFJCSU5TTE9UKCJfX3Jyc2hpZnRfXyIsIG5iX3JzaGlmdCwgc2xvdF9uYl9yc2hpZnQsICI+PiIpLAorICAgIEJJTlNMT1QoIl9fYW5kX18iLCBuYl9hbmQsIHNsb3RfbmJfYW5kLCAiJiIpLAorICAgIFJCSU5TTE9UKCJfX3JhbmRfXyIsIG5iX2FuZCwgc2xvdF9uYl9hbmQsICImIiksCisgICAgQklOU0xPVCgiX194b3JfXyIsIG5iX3hvciwgc2xvdF9uYl94b3IsICJeIiksCisgICAgUkJJTlNMT1QoIl9fcnhvcl9fIiwgbmJfeG9yLCBzbG90X25iX3hvciwgIl4iKSwKKyAgICBCSU5TTE9UKCJfX29yX18iLCBuYl9vciwgc2xvdF9uYl9vciwgInwiKSwKKyAgICBSQklOU0xPVCgiX19yb3JfXyIsIG5iX29yLCBzbG90X25iX29yLCAifCIpLAorICAgIE5CU0xPVCgiX19jb2VyY2VfXyIsIG5iX2NvZXJjZSwgc2xvdF9uYl9jb2VyY2UsIHdyYXBfY29lcmNlZnVuYywKKyAgICAgICAgICAgInguX19jb2VyY2VfXyh5KSA8PT0+IGNvZXJjZSh4LCB5KSIpLAorICAgIFVOU0xPVCgiX19pbnRfXyIsIG5iX2ludCwgc2xvdF9uYl9pbnQsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAiaW50KHgpIiksCisgICAgVU5TTE9UKCJfX2xvbmdfXyIsIG5iX2xvbmcsIHNsb3RfbmJfbG9uZywgd3JhcF91bmFyeWZ1bmMsCisgICAgICAgICAgICJsb25nKHgpIiksCisgICAgVU5TTE9UKCJfX2Zsb2F0X18iLCBuYl9mbG9hdCwgc2xvdF9uYl9mbG9hdCwgd3JhcF91bmFyeWZ1bmMsCisgICAgICAgICAgICJmbG9hdCh4KSIpLAorICAgIFVOU0xPVCgiX19vY3RfXyIsIG5iX29jdCwgc2xvdF9uYl9vY3QsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAib2N0KHgpIiksCisgICAgVU5TTE9UKCJfX2hleF9fIiwgbmJfaGV4LCBzbG90X25iX2hleCwgd3JhcF91bmFyeWZ1bmMsCisgICAgICAgICAgICJoZXgoeCkiKSwKKyAgICBOQlNMT1QoIl9faW5kZXhfXyIsIG5iX2luZGV4LCBzbG90X25iX2luZGV4LCB3cmFwX3VuYXJ5ZnVuYywKKyAgICAgICAgICAgInhbeTp6XSA8PT0+IHhbeS5fX2luZGV4X18oKTp6Ll9faW5kZXhfXygpXSIpLAorICAgIElCU0xPVCgiX19pYWRkX18iLCBuYl9pbnBsYWNlX2FkZCwgc2xvdF9uYl9pbnBsYWNlX2FkZCwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiKyIpLAorICAgIElCU0xPVCgiX19pc3ViX18iLCBuYl9pbnBsYWNlX3N1YnRyYWN0LCBzbG90X25iX2lucGxhY2Vfc3VidHJhY3QsCisgICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIi0iKSwKKyAgICBJQlNMT1QoIl9faW11bF9fIiwgbmJfaW5wbGFjZV9tdWx0aXBseSwgc2xvdF9uYl9pbnBsYWNlX211bHRpcGx5LAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIqIiksCisgICAgSUJTTE9UKCJfX2lkaXZfXyIsIG5iX2lucGxhY2VfZGl2aWRlLCBzbG90X25iX2lucGxhY2VfZGl2aWRlLAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIvIiksCisgICAgSUJTTE9UKCJfX2ltb2RfXyIsIG5iX2lucGxhY2VfcmVtYWluZGVyLCBzbG90X25iX2lucGxhY2VfcmVtYWluZGVyLAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIlIiksCisgICAgSUJTTE9UKCJfX2lwb3dfXyIsIG5iX2lucGxhY2VfcG93ZXIsIHNsb3RfbmJfaW5wbGFjZV9wb3dlciwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiKioiKSwKKyAgICBJQlNMT1QoIl9faWxzaGlmdF9fIiwgbmJfaW5wbGFjZV9sc2hpZnQsIHNsb3RfbmJfaW5wbGFjZV9sc2hpZnQsCisgICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIjw8IiksCisgICAgSUJTTE9UKCJfX2lyc2hpZnRfXyIsIG5iX2lucGxhY2VfcnNoaWZ0LCBzbG90X25iX2lucGxhY2VfcnNoaWZ0LAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICI+PiIpLAorICAgIElCU0xPVCgiX19pYW5kX18iLCBuYl9pbnBsYWNlX2FuZCwgc2xvdF9uYl9pbnBsYWNlX2FuZCwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiJiIpLAorICAgIElCU0xPVCgiX19peG9yX18iLCBuYl9pbnBsYWNlX3hvciwgc2xvdF9uYl9pbnBsYWNlX3hvciwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiXiIpLAorICAgIElCU0xPVCgiX19pb3JfXyIsIG5iX2lucGxhY2Vfb3IsIHNsb3RfbmJfaW5wbGFjZV9vciwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAifCIpLAorICAgIEJJTlNMT1QoIl9fZmxvb3JkaXZfXyIsIG5iX2Zsb29yX2RpdmlkZSwgc2xvdF9uYl9mbG9vcl9kaXZpZGUsICIvLyIpLAorICAgIFJCSU5TTE9UKCJfX3JmbG9vcmRpdl9fIiwgbmJfZmxvb3JfZGl2aWRlLCBzbG90X25iX2Zsb29yX2RpdmlkZSwgIi8vIiksCisgICAgQklOU0xPVCgiX190cnVlZGl2X18iLCBuYl90cnVlX2RpdmlkZSwgc2xvdF9uYl90cnVlX2RpdmlkZSwgIi8iKSwKKyAgICBSQklOU0xPVCgiX19ydHJ1ZWRpdl9fIiwgbmJfdHJ1ZV9kaXZpZGUsIHNsb3RfbmJfdHJ1ZV9kaXZpZGUsICIvIiksCisgICAgSUJTTE9UKCJfX2lmbG9vcmRpdl9fIiwgbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUsCisgICAgICAgICAgIHNsb3RfbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUsIHdyYXBfYmluYXJ5ZnVuYywgIi8vIiksCisgICAgSUJTTE9UKCJfX2l0cnVlZGl2X18iLCBuYl9pbnBsYWNlX3RydWVfZGl2aWRlLAorICAgICAgICAgICBzbG90X25iX2lucGxhY2VfdHJ1ZV9kaXZpZGUsIHdyYXBfYmluYXJ5ZnVuYywgIi8iKSwKIAotCVRQU0xPVCgiX19zdHJfXyIsIHRwX3N0ciwgc2xvdF90cF9zdHIsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAieC5fX3N0cl9fKCkgPD09PiBzdHIoeCkiKSwKLQlUUFNMT1QoIl9fc3RyX18iLCB0cF9wcmludCwgTlVMTCwgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19yZXByX18iLCB0cF9yZXByLCBzbG90X3RwX3JlcHIsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAieC5fX3JlcHJfXygpIDw9PT4gcmVwcih4KSIpLAotCVRQU0xPVCgiX19yZXByX18iLCB0cF9wcmludCwgTlVMTCwgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19jbXBfXyIsIHRwX2NvbXBhcmUsIF9QeU9iamVjdF9TbG90Q29tcGFyZSwgd3JhcF9jbXBmdW5jLAotCSAgICAgICAieC5fX2NtcF9fKHkpIDw9PT4gY21wKHgseSkiKSwKLQlUUFNMT1QoIl9faGFzaF9fIiwgdHBfaGFzaCwgc2xvdF90cF9oYXNoLCB3cmFwX2hhc2hmdW5jLAotCSAgICAgICAieC5fX2hhc2hfXygpIDw9PT4gaGFzaCh4KSIpLAotCUZMU0xPVCgiX19jYWxsX18iLCB0cF9jYWxsLCBzbG90X3RwX2NhbGwsICh3cmFwcGVyZnVuYyl3cmFwX2NhbGwsCi0JICAgICAgICJ4Ll9fY2FsbF9fKC4uLikgPD09PiB4KC4uLikiLCBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSwKLQlUUFNMT1QoIl9fZ2V0YXR0cmlidXRlX18iLCB0cF9nZXRhdHRybywgc2xvdF90cF9nZXRhdHRyX2hvb2ssCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgInguX19nZXRhdHRyaWJ1dGVfXygnbmFtZScpIDw9PT4geC5uYW1lIiksCi0JVFBTTE9UKCJfX2dldGF0dHJpYnV0ZV9fIiwgdHBfZ2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19nZXRhdHRyX18iLCB0cF9nZXRhdHRybywgc2xvdF90cF9nZXRhdHRyX2hvb2ssIE5VTEwsICIiKSwKLQlUUFNMT1QoIl9fZ2V0YXR0cl9fIiwgdHBfZ2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19zZXRhdHRyX18iLCB0cF9zZXRhdHRybywgc2xvdF90cF9zZXRhdHRybywgd3JhcF9zZXRhdHRyLAotCSAgICAgICAieC5fX3NldGF0dHJfXygnbmFtZScsIHZhbHVlKSA8PT0+IHgubmFtZSA9IHZhbHVlIiksCi0JVFBTTE9UKCJfX3NldGF0dHJfXyIsIHRwX3NldGF0dHIsIE5VTEwsIE5VTEwsICIiKSwKLQlUUFNMT1QoIl9fZGVsYXR0cl9fIiwgdHBfc2V0YXR0cm8sIHNsb3RfdHBfc2V0YXR0cm8sIHdyYXBfZGVsYXR0ciwKLQkgICAgICAgInguX19kZWxhdHRyX18oJ25hbWUnKSA8PT0+IGRlbCB4Lm5hbWUiKSwKLQlUUFNMT1QoIl9fZGVsYXR0cl9fIiwgdHBfc2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19sdF9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfbHQsCi0JICAgICAgICJ4Ll9fbHRfXyh5KSA8PT0+IHg8eSIpLAotCVRQU0xPVCgiX19sZV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfbGUsCi0JICAgICAgICJ4Ll9fbGVfXyh5KSA8PT0+IHg8PXkiKSwKLQlUUFNMT1QoIl9fZXFfXyIsIHRwX3JpY2hjb21wYXJlLCBzbG90X3RwX3JpY2hjb21wYXJlLCByaWNoY21wX2VxLAotCSAgICAgICAieC5fX2VxX18oeSkgPD09PiB4PT15IiksCi0JVFBTTE9UKCJfX25lX18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9uZSwKLQkgICAgICAgInguX19uZV9fKHkpIDw9PT4geCE9eSIpLAotCVRQU0xPVCgiX19ndF9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZ3QsCi0JICAgICAgICJ4Ll9fZ3RfXyh5KSA8PT0+IHg+eSIpLAotCVRQU0xPVCgiX19nZV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZ2UsCi0JICAgICAgICJ4Ll9fZ2VfXyh5KSA8PT0+IHg+PXkiKSwKLQlUUFNMT1QoIl9faXRlcl9fIiwgdHBfaXRlciwgc2xvdF90cF9pdGVyLCB3cmFwX3VuYXJ5ZnVuYywKLQkgICAgICAgInguX19pdGVyX18oKSA8PT0+IGl0ZXIoeCkiKSwKLQlUUFNMT1QoIm5leHQiLCB0cF9pdGVybmV4dCwgc2xvdF90cF9pdGVybmV4dCwgd3JhcF9uZXh0LAotCSAgICAgICAieC5uZXh0KCkgLT4gdGhlIG5leHQgdmFsdWUsIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24iKSwKLQlUUFNMT1QoIl9fZ2V0X18iLCB0cF9kZXNjcl9nZXQsIHNsb3RfdHBfZGVzY3JfZ2V0LCB3cmFwX2Rlc2NyX2dldCwKLQkgICAgICAgImRlc2NyLl9fZ2V0X18ob2JqWywgdHlwZV0pIC0+IHZhbHVlIiksCi0JVFBTTE9UKCJfX3NldF9fIiwgdHBfZGVzY3Jfc2V0LCBzbG90X3RwX2Rlc2NyX3NldCwgd3JhcF9kZXNjcl9zZXQsCi0JICAgICAgICJkZXNjci5fX3NldF9fKG9iaiwgdmFsdWUpIiksCi0JVFBTTE9UKCJfX2RlbGV0ZV9fIiwgdHBfZGVzY3Jfc2V0LCBzbG90X3RwX2Rlc2NyX3NldCwKLQkgICAgICAgd3JhcF9kZXNjcl9kZWxldGUsICJkZXNjci5fX2RlbGV0ZV9fKG9iaikiKSwKLQlGTFNMT1QoIl9faW5pdF9fIiwgdHBfaW5pdCwgc2xvdF90cF9pbml0LCAod3JhcHBlcmZ1bmMpd3JhcF9pbml0LAotCSAgICAgICAieC5fX2luaXRfXyguLi4pIGluaXRpYWxpemVzIHg7ICIKLQkgICAgICAgInNlZSB4Ll9fY2xhc3NfXy5fX2RvY19fIGZvciBzaWduYXR1cmUiLAotCSAgICAgICBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSwKLQlUUFNMT1QoIl9fbmV3X18iLCB0cF9uZXcsIHNsb3RfdHBfbmV3LCBOVUxMLCAiIiksCi0JVFBTTE9UKCJfX2RlbF9fIiwgdHBfZGVsLCBzbG90X3RwX2RlbCwgTlVMTCwgIiIpLAotCXtOVUxMfQorICAgIFRQU0xPVCgiX19zdHJfXyIsIHRwX3N0ciwgc2xvdF90cF9zdHIsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAieC5fX3N0cl9fKCkgPD09PiBzdHIoeCkiKSwKKyAgICBUUFNMT1QoIl9fc3RyX18iLCB0cF9wcmludCwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19yZXByX18iLCB0cF9yZXByLCBzbG90X3RwX3JlcHIsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAieC5fX3JlcHJfXygpIDw9PT4gcmVwcih4KSIpLAorICAgIFRQU0xPVCgiX19yZXByX18iLCB0cF9wcmludCwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19jbXBfXyIsIHRwX2NvbXBhcmUsIF9QeU9iamVjdF9TbG90Q29tcGFyZSwgd3JhcF9jbXBmdW5jLAorICAgICAgICAgICAieC5fX2NtcF9fKHkpIDw9PT4gY21wKHgseSkiKSwKKyAgICBUUFNMT1QoIl9faGFzaF9fIiwgdHBfaGFzaCwgc2xvdF90cF9oYXNoLCB3cmFwX2hhc2hmdW5jLAorICAgICAgICAgICAieC5fX2hhc2hfXygpIDw9PT4gaGFzaCh4KSIpLAorICAgIEZMU0xPVCgiX19jYWxsX18iLCB0cF9jYWxsLCBzbG90X3RwX2NhbGwsICh3cmFwcGVyZnVuYyl3cmFwX2NhbGwsCisgICAgICAgICAgICJ4Ll9fY2FsbF9fKC4uLikgPD09PiB4KC4uLikiLCBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSwKKyAgICBUUFNMT1QoIl9fZ2V0YXR0cmlidXRlX18iLCB0cF9nZXRhdHRybywgc2xvdF90cF9nZXRhdHRyX2hvb2ssCisgICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgInguX19nZXRhdHRyaWJ1dGVfXygnbmFtZScpIDw9PT4geC5uYW1lIiksCisgICAgVFBTTE9UKCJfX2dldGF0dHJpYnV0ZV9fIiwgdHBfZ2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19nZXRhdHRyX18iLCB0cF9nZXRhdHRybywgc2xvdF90cF9nZXRhdHRyX2hvb2ssIE5VTEwsICIiKSwKKyAgICBUUFNMT1QoIl9fZ2V0YXR0cl9fIiwgdHBfZ2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19zZXRhdHRyX18iLCB0cF9zZXRhdHRybywgc2xvdF90cF9zZXRhdHRybywgd3JhcF9zZXRhdHRyLAorICAgICAgICAgICAieC5fX3NldGF0dHJfXygnbmFtZScsIHZhbHVlKSA8PT0+IHgubmFtZSA9IHZhbHVlIiksCisgICAgVFBTTE9UKCJfX3NldGF0dHJfXyIsIHRwX3NldGF0dHIsIE5VTEwsIE5VTEwsICIiKSwKKyAgICBUUFNMT1QoIl9fZGVsYXR0cl9fIiwgdHBfc2V0YXR0cm8sIHNsb3RfdHBfc2V0YXR0cm8sIHdyYXBfZGVsYXR0ciwKKyAgICAgICAgICAgInguX19kZWxhdHRyX18oJ25hbWUnKSA8PT0+IGRlbCB4Lm5hbWUiKSwKKyAgICBUUFNMT1QoIl9fZGVsYXR0cl9fIiwgdHBfc2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19sdF9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfbHQsCisgICAgICAgICAgICJ4Ll9fbHRfXyh5KSA8PT0+IHg8eSIpLAorICAgIFRQU0xPVCgiX19sZV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfbGUsCisgICAgICAgICAgICJ4Ll9fbGVfXyh5KSA8PT0+IHg8PXkiKSwKKyAgICBUUFNMT1QoIl9fZXFfXyIsIHRwX3JpY2hjb21wYXJlLCBzbG90X3RwX3JpY2hjb21wYXJlLCByaWNoY21wX2VxLAorICAgICAgICAgICAieC5fX2VxX18oeSkgPD09PiB4PT15IiksCisgICAgVFBTTE9UKCJfX25lX18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9uZSwKKyAgICAgICAgICAgInguX19uZV9fKHkpIDw9PT4geCE9eSIpLAorICAgIFRQU0xPVCgiX19ndF9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZ3QsCisgICAgICAgICAgICJ4Ll9fZ3RfXyh5KSA8PT0+IHg+eSIpLAorICAgIFRQU0xPVCgiX19nZV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZ2UsCisgICAgICAgICAgICJ4Ll9fZ2VfXyh5KSA8PT0+IHg+PXkiKSwKKyAgICBUUFNMT1QoIl9faXRlcl9fIiwgdHBfaXRlciwgc2xvdF90cF9pdGVyLCB3cmFwX3VuYXJ5ZnVuYywKKyAgICAgICAgICAgInguX19pdGVyX18oKSA8PT0+IGl0ZXIoeCkiKSwKKyAgICBUUFNMT1QoIm5leHQiLCB0cF9pdGVybmV4dCwgc2xvdF90cF9pdGVybmV4dCwgd3JhcF9uZXh0LAorICAgICAgICAgICAieC5uZXh0KCkgLT4gdGhlIG5leHQgdmFsdWUsIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24iKSwKKyAgICBUUFNMT1QoIl9fZ2V0X18iLCB0cF9kZXNjcl9nZXQsIHNsb3RfdHBfZGVzY3JfZ2V0LCB3cmFwX2Rlc2NyX2dldCwKKyAgICAgICAgICAgImRlc2NyLl9fZ2V0X18ob2JqWywgdHlwZV0pIC0+IHZhbHVlIiksCisgICAgVFBTTE9UKCJfX3NldF9fIiwgdHBfZGVzY3Jfc2V0LCBzbG90X3RwX2Rlc2NyX3NldCwgd3JhcF9kZXNjcl9zZXQsCisgICAgICAgICAgICJkZXNjci5fX3NldF9fKG9iaiwgdmFsdWUpIiksCisgICAgVFBTTE9UKCJfX2RlbGV0ZV9fIiwgdHBfZGVzY3Jfc2V0LCBzbG90X3RwX2Rlc2NyX3NldCwKKyAgICAgICAgICAgd3JhcF9kZXNjcl9kZWxldGUsICJkZXNjci5fX2RlbGV0ZV9fKG9iaikiKSwKKyAgICBGTFNMT1QoIl9faW5pdF9fIiwgdHBfaW5pdCwgc2xvdF90cF9pbml0LCAod3JhcHBlcmZ1bmMpd3JhcF9pbml0LAorICAgICAgICAgICAieC5fX2luaXRfXyguLi4pIGluaXRpYWxpemVzIHg7ICIKKyAgICAgICAgICAgInNlZSB4Ll9fY2xhc3NfXy5fX2RvY19fIGZvciBzaWduYXR1cmUiLAorICAgICAgICAgICBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSwKKyAgICBUUFNMT1QoIl9fbmV3X18iLCB0cF9uZXcsIHNsb3RfdHBfbmV3LCBOVUxMLCAiIiksCisgICAgVFBTTE9UKCJfX2RlbF9fIiwgdHBfZGVsLCBzbG90X3RwX2RlbCwgTlVMTCwgIiIpLAorICAgIHtOVUxMfQogfTsKIAogLyogR2l2ZW4gYSB0eXBlIHBvaW50ZXIgYW5kIGFuIG9mZnNldCBnb3R0ZW4gZnJvbSBhIHNsb3RkZWYgZW50cnksIHJldHVybiBhCi0gICBwb2ludGVyIHRvIHRoZSBhY3R1YWwgc2xvdC4JVGhpcyBpcyBub3QgcXVpdGUgdGhlIHNhbWUgYXMgc2ltcGx5IGFkZGluZworICAgcG9pbnRlciB0byB0aGUgYWN0dWFsIHNsb3QuICBUaGlzIGlzIG5vdCBxdWl0ZSB0aGUgc2FtZSBhcyBzaW1wbHkgYWRkaW5nCiAgICB0aGUgb2Zmc2V0IHRvIHRoZSB0eXBlIHBvaW50ZXIsIHNpbmNlIGl0IHRha2VzIGNhcmUgdG8gaW5kaXJlY3QgdGhyb3VnaCB0aGUKICAgIHByb3BlciBpbmRpcmVjdGlvbiBwb2ludGVyIChhc19idWZmZXIsIGV0Yy4pOyBpdCByZXR1cm5zIE5VTEwgaWYgdGhlCiAgICBpbmRpcmVjdGlvbiBwb2ludGVyIGlzIE5VTEwuICovCiBzdGF0aWMgdm9pZCAqKgogc2xvdHB0cihQeVR5cGVPYmplY3QgKnR5cGUsIGludCBpb2Zmc2V0KQogewotCWNoYXIgKnB0cjsKLQlsb25nIG9mZnNldCA9IGlvZmZzZXQ7CisgICAgY2hhciAqcHRyOworICAgIGxvbmcgb2Zmc2V0ID0gaW9mZnNldDsKIAotCS8qIE5vdGU6IHRoaXMgZGVwZW5kcyBvbiB0aGUgb3JkZXIgb2YgdGhlIG1lbWJlcnMgb2YgUHlIZWFwVHlwZU9iamVjdCEgKi8KLQlhc3NlcnQob2Zmc2V0ID49IDApOwotCWFzc2VydCgoc2l6ZV90KW9mZnNldCA8IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX2J1ZmZlcikpOwotCWlmICgoc2l6ZV90KW9mZnNldCA+PSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19zZXF1ZW5jZSkpIHsKLQkJcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkJb2Zmc2V0IC09IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX3NlcXVlbmNlKTsKLQl9Ci0JZWxzZSBpZiAoKHNpemVfdClvZmZzZXQgPj0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbWFwcGluZykpIHsKLQkJcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19tYXBwaW5nOwotCQlvZmZzZXQgLT0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbWFwcGluZyk7Ci0JfQotCWVsc2UgaWYgKChzaXplX3Qpb2Zmc2V0ID49IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX251bWJlcikpIHsKLQkJcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19udW1iZXI7Ci0JCW9mZnNldCAtPSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19udW1iZXIpOwotCX0KLQllbHNlIHsKLQkJcHRyID0gKGNoYXIgKil0eXBlOwotCX0KLQlpZiAocHRyICE9IE5VTEwpCi0JCXB0ciArPSBvZmZzZXQ7Ci0JcmV0dXJuICh2b2lkICoqKXB0cjsKKyAgICAvKiBOb3RlOiB0aGlzIGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIHRoZSBtZW1iZXJzIG9mIFB5SGVhcFR5cGVPYmplY3QhICovCisgICAgYXNzZXJ0KG9mZnNldCA+PSAwKTsKKyAgICBhc3NlcnQoKHNpemVfdClvZmZzZXQgPCBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19idWZmZXIpKTsKKyAgICBpZiAoKHNpemVfdClvZmZzZXQgPj0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfc2VxdWVuY2UpKSB7CisgICAgICAgIHB0ciA9IChjaGFyICopdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIG9mZnNldCAtPSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19zZXF1ZW5jZSk7CisgICAgfQorICAgIGVsc2UgaWYgKChzaXplX3Qpb2Zmc2V0ID49IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX21hcHBpbmcpKSB7CisgICAgICAgIHB0ciA9IChjaGFyICopdHlwZS0+dHBfYXNfbWFwcGluZzsKKyAgICAgICAgb2Zmc2V0IC09IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX21hcHBpbmcpOworICAgIH0KKyAgICBlbHNlIGlmICgoc2l6ZV90KW9mZnNldCA+PSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19udW1iZXIpKSB7CisgICAgICAgIHB0ciA9IChjaGFyICopdHlwZS0+dHBfYXNfbnVtYmVyOworICAgICAgICBvZmZzZXQgLT0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbnVtYmVyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHB0ciA9IChjaGFyICopdHlwZTsKKyAgICB9CisgICAgaWYgKHB0ciAhPSBOVUxMKQorICAgICAgICBwdHIgKz0gb2Zmc2V0OworICAgIHJldHVybiAodm9pZCAqKilwdHI7CiB9CiAKIC8qIExlbmd0aCBvZiBhcnJheSBvZiBzbG90ZGVmIHBvaW50ZXJzIHVzZWQgdG8gc3RvcmUgc2xvdHMgd2l0aCB0aGUKQEAgLTYwNjUsMzcgKzYwNjUsMzcgQEAKIHN0YXRpYyB2b2lkICoqCiByZXNvbHZlX3Nsb3RkdXBzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JLyogWFhYIE1heWJlIHRoaXMgY291bGQgYmUgb3B0aW1pemVkIG1vcmUgLS0gYnV0IGlzIGl0IHdvcnRoIGl0PyAqLworICAgIC8qIFhYWCBNYXliZSB0aGlzIGNvdWxkIGJlIG9wdGltaXplZCBtb3JlIC0tIGJ1dCBpcyBpdCB3b3J0aCBpdD8gKi8KIAotCS8qIHBuYW1lIGFuZCBwdHJzIGFjdCBhcyBhIGxpdHRsZSBjYWNoZSAqLwotCXN0YXRpYyBQeU9iamVjdCAqcG5hbWU7Ci0Jc3RhdGljIHNsb3RkZWYgKnB0cnNbTUFYX0VRVUlWXTsKLQlzbG90ZGVmICpwLCAqKnBwOwotCXZvaWQgKipyZXMsICoqcHRyOworICAgIC8qIHBuYW1lIGFuZCBwdHJzIGFjdCBhcyBhIGxpdHRsZSBjYWNoZSAqLworICAgIHN0YXRpYyBQeU9iamVjdCAqcG5hbWU7CisgICAgc3RhdGljIHNsb3RkZWYgKnB0cnNbTUFYX0VRVUlWXTsKKyAgICBzbG90ZGVmICpwLCAqKnBwOworICAgIHZvaWQgKipyZXMsICoqcHRyOwogCi0JaWYgKHBuYW1lICE9IG5hbWUpIHsKLQkJLyogQ29sbGVjdCBhbGwgc2xvdGRlZnMgdGhhdCBtYXRjaCBuYW1lIGludG8gcHRycy4gKi8KLQkJcG5hbWUgPSBuYW1lOwotCQlwcCA9IHB0cnM7Ci0JCWZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lX3N0cm9iajsgcCsrKSB7Ci0JCQlpZiAocC0+bmFtZV9zdHJvYmogPT0gbmFtZSkKLQkJCQkqcHArKyA9IHA7Ci0JCX0KLQkJKnBwID0gTlVMTDsKLQl9CisgICAgaWYgKHBuYW1lICE9IG5hbWUpIHsKKyAgICAgICAgLyogQ29sbGVjdCBhbGwgc2xvdGRlZnMgdGhhdCBtYXRjaCBuYW1lIGludG8gcHRycy4gKi8KKyAgICAgICAgcG5hbWUgPSBuYW1lOworICAgICAgICBwcCA9IHB0cnM7CisgICAgICAgIGZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lX3N0cm9iajsgcCsrKSB7CisgICAgICAgICAgICBpZiAocC0+bmFtZV9zdHJvYmogPT0gbmFtZSkKKyAgICAgICAgICAgICAgICAqcHArKyA9IHA7CisgICAgICAgIH0KKyAgICAgICAgKnBwID0gTlVMTDsKKyAgICB9CiAKLQkvKiBMb29rIGluIGFsbCBtYXRjaGluZyBzbG90cyBvZiB0aGUgdHlwZTsgaWYgZXhhY3RseSBvbmUgb2YgdGhlc2UgaGFzCi0JICAgYSBmaWxsZWQtaW4gc2xvdCwgcmV0dXJuIGl0cyB2YWx1ZS4JT3RoZXJ3aXNlIHJldHVybiBOVUxMLiAqLwotCXJlcyA9IE5VTEw7Ci0JZm9yIChwcCA9IHB0cnM7ICpwcDsgcHArKykgewotCQlwdHIgPSBzbG90cHRyKHR5cGUsICgqcHApLT5vZmZzZXQpOwotCQlpZiAocHRyID09IE5VTEwgfHwgKnB0ciA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWlmIChyZXMgIT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXMgPSBwdHI7Ci0JfQotCXJldHVybiByZXM7CisgICAgLyogTG9vayBpbiBhbGwgbWF0Y2hpbmcgc2xvdHMgb2YgdGhlIHR5cGU7IGlmIGV4YWN0bHkgb25lIG9mIHRoZXNlIGhhcworICAgICAgIGEgZmlsbGVkLWluIHNsb3QsIHJldHVybiBpdHMgdmFsdWUuICAgICAgT3RoZXJ3aXNlIHJldHVybiBOVUxMLiAqLworICAgIHJlcyA9IE5VTEw7CisgICAgZm9yIChwcCA9IHB0cnM7ICpwcDsgcHArKykgeworICAgICAgICBwdHIgPSBzbG90cHRyKHR5cGUsICgqcHApLT5vZmZzZXQpOworICAgICAgICBpZiAocHRyID09IE5VTEwgfHwgKnB0ciA9PSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXMgPSBwdHI7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIC8qIENvbW1vbiBjb2RlIGZvciB1cGRhdGVfc2xvdHNfY2FsbGJhY2soKSBhbmQgZml4dXBfc2xvdF9kaXNwYXRjaGVycygpLiAgVGhpcwpAQCAtNjEwNyw4MSArNjEwNyw4MSBAQAogc3RhdGljIHNsb3RkZWYgKgogdXBkYXRlX29uZV9zbG90KFB5VHlwZU9iamVjdCAqdHlwZSwgc2xvdGRlZiAqcCkKIHsKLQlQeU9iamVjdCAqZGVzY3I7Ci0JUHlXcmFwcGVyRGVzY3JPYmplY3QgKmQ7Ci0Jdm9pZCAqZ2VuZXJpYyA9IE5VTEwsICpzcGVjaWZpYyA9IE5VTEw7Ci0JaW50IHVzZV9nZW5lcmljID0gMDsKLQlpbnQgb2Zmc2V0ID0gcC0+b2Zmc2V0OwotCXZvaWQgKipwdHIgPSBzbG90cHRyKHR5cGUsIG9mZnNldCk7CisgICAgUHlPYmplY3QgKmRlc2NyOworICAgIFB5V3JhcHBlckRlc2NyT2JqZWN0ICpkOworICAgIHZvaWQgKmdlbmVyaWMgPSBOVUxMLCAqc3BlY2lmaWMgPSBOVUxMOworICAgIGludCB1c2VfZ2VuZXJpYyA9IDA7CisgICAgaW50IG9mZnNldCA9IHAtPm9mZnNldDsKKyAgICB2b2lkICoqcHRyID0gc2xvdHB0cih0eXBlLCBvZmZzZXQpOwogCi0JaWYgKHB0ciA9PSBOVUxMKSB7Ci0JCWRvIHsKLQkJCSsrcDsKLQkJfSB3aGlsZSAocC0+b2Zmc2V0ID09IG9mZnNldCk7Ci0JCXJldHVybiBwOwotCX0KLQlkbyB7Ci0JCWRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHlwZSwgcC0+bmFtZV9zdHJvYmopOwotCQlpZiAoZGVzY3IgPT0gTlVMTCkgewotCQkJaWYgKHB0ciA9PSAodm9pZCoqKSZ0eXBlLT50cF9pdGVybmV4dCkgewotCQkJCXNwZWNpZmljID0gX1B5T2JqZWN0X05leHROb3RJbXBsZW1lbnRlZDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChQeV9UWVBFKGRlc2NyKSA9PSAmUHlXcmFwcGVyRGVzY3JfVHlwZSkgewotCQkJdm9pZCAqKnRwdHIgPSByZXNvbHZlX3Nsb3RkdXBzKHR5cGUsIHAtPm5hbWVfc3Ryb2JqKTsKLQkJCWlmICh0cHRyID09IE5VTEwgfHwgdHB0ciA9PSBwdHIpCi0JCQkJZ2VuZXJpYyA9IHAtPmZ1bmN0aW9uOwotCQkJZCA9IChQeVdyYXBwZXJEZXNjck9iamVjdCAqKWRlc2NyOwotCQkJaWYgKGQtPmRfYmFzZS0+d3JhcHBlciA9PSBwLT53cmFwcGVyICYmCi0JCQkgICAgUHlUeXBlX0lzU3VidHlwZSh0eXBlLCBkLT5kX3R5cGUpKQotCQkJewotCQkJCWlmIChzcGVjaWZpYyA9PSBOVUxMIHx8Ci0JCQkJICAgIHNwZWNpZmljID09IGQtPmRfd3JhcHBlZCkKLQkJCQkJc3BlY2lmaWMgPSBkLT5kX3dyYXBwZWQ7Ci0JCQkJZWxzZQotCQkJCQl1c2VfZ2VuZXJpYyA9IDE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoUHlfVFlQRShkZXNjcikgPT0gJlB5Q0Z1bmN0aW9uX1R5cGUgJiYKLQkJCSBQeUNGdW5jdGlvbl9HRVRfRlVOQ1RJT04oZGVzY3IpID09Ci0JCQkgKFB5Q0Z1bmN0aW9uKXRwX25ld193cmFwcGVyICYmCi0JCQkgcHRyID09ICh2b2lkKiopJnR5cGUtPnRwX25ldykKLQkJewotCQkJLyogVGhlIF9fbmV3X18gd3JhcHBlciBpcyBub3QgYSB3cmFwcGVyIGRlc2NyaXB0b3IsCi0JCQkgICBzbyBtdXN0IGJlIHNwZWNpYWwtY2FzZWQgZGlmZmVyZW50bHkuCi0JCQkgICBJZiB3ZSBkb24ndCBkbyB0aGlzLCBjcmVhdGluZyBhbiBpbnN0YW5jZSB3aWxsCi0JCQkgICBhbHdheXMgdXNlIHNsb3RfdHBfbmV3IHdoaWNoIHdpbGwgbG9vayB1cAotCQkJICAgX19uZXdfXyBpbiB0aGUgTVJPIHdoaWNoIHdpbGwgY2FsbCB0cF9uZXdfd3JhcHBlcgotCQkJICAgd2hpY2ggd2lsbCBsb29rIHRocm91Z2ggdGhlIGJhc2UgY2xhc3NlcyBsb29raW5nCi0JCQkgICBmb3IgYSBzdGF0aWMgYmFzZSBhbmQgY2FsbCBpdHMgdHBfbmV3ICh1c3VhbGx5Ci0JCQkgICBQeVR5cGVfR2VuZXJpY05ldyksIGFmdGVyIHBlcmZvcm1pbmcgdmFyaW91cwotCQkJICAgc2FuaXR5IGNoZWNrcyBhbmQgY29uc3RydWN0aW5nIGEgbmV3IGFyZ3VtZW50Ci0JCQkgICBsaXN0LiAgQ3V0IGFsbCB0aGF0IG5vbnNlbnNlIHNob3J0IC0tIHRoaXMgc3BlZWRzCi0JCQkgICB1cCBpbnN0YW5jZSBjcmVhdGlvbiB0cmVtZW5kb3VzbHkuICovCi0JCQlzcGVjaWZpYyA9ICh2b2lkICopdHlwZS0+dHBfbmV3OwotCQkJLyogWFhYIEknbSBub3QgMTAwJSBzdXJlIHRoYXQgdGhlcmUgaXNuJ3QgYSBob2xlCi0JCQkgICBpbiB0aGlzIHJlYXNvbmluZyB0aGF0IHJlcXVpcmVzIGFkZGl0aW9uYWwKLQkJCSAgIHNhbml0eSBjaGVja3MuICBJJ2xsIGJ1eSB0aGUgZmlyc3QgcGVyc29uIHRvCi0JCQkgICBwb2ludCBvdXQgYSBidWcgaW4gdGhpcyByZWFzb25pbmcgYSBiZWVyLiAqLwotCQl9Ci0JCWVsc2UgaWYgKGRlc2NyID09IFB5X05vbmUgJiYKLQkJCSBwdHIgPT0gKHZvaWQqKikmdHlwZS0+dHBfaGFzaCkgewotCQkJLyogV2Ugc3BlY2lmaWNhbGx5IGFsbG93IF9faGFzaF9fIHRvIGJlIHNldCB0byBOb25lCi0JCQkgICB0byBwcmV2ZW50IGluaGVyaXRhbmNlIG9mIHRoZSBkZWZhdWx0Ci0JCQkgICBpbXBsZW1lbnRhdGlvbiBmcm9tIG9iamVjdC5fX2hhc2hfXyAqLwotCQkJc3BlY2lmaWMgPSBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1c2VfZ2VuZXJpYyA9IDE7Ci0JCQlnZW5lcmljID0gcC0+ZnVuY3Rpb247Ci0JCX0KLQl9IHdoaWxlICgoKytwKS0+b2Zmc2V0ID09IG9mZnNldCk7Ci0JaWYgKHNwZWNpZmljICYmICF1c2VfZ2VuZXJpYykKLQkJKnB0ciA9IHNwZWNpZmljOwotCWVsc2UKLQkJKnB0ciA9IGdlbmVyaWM7Ci0JcmV0dXJuIHA7CisgICAgaWYgKHB0ciA9PSBOVUxMKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICsrcDsKKyAgICAgICAgfSB3aGlsZSAocC0+b2Zmc2V0ID09IG9mZnNldCk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHlwZSwgcC0+bmFtZV9zdHJvYmopOworICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHB0ciA9PSAodm9pZCoqKSZ0eXBlLT50cF9pdGVybmV4dCkgeworICAgICAgICAgICAgICAgIHNwZWNpZmljID0gX1B5T2JqZWN0X05leHROb3RJbXBsZW1lbnRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChQeV9UWVBFKGRlc2NyKSA9PSAmUHlXcmFwcGVyRGVzY3JfVHlwZSkgeworICAgICAgICAgICAgdm9pZCAqKnRwdHIgPSByZXNvbHZlX3Nsb3RkdXBzKHR5cGUsIHAtPm5hbWVfc3Ryb2JqKTsKKyAgICAgICAgICAgIGlmICh0cHRyID09IE5VTEwgfHwgdHB0ciA9PSBwdHIpCisgICAgICAgICAgICAgICAgZ2VuZXJpYyA9IHAtPmZ1bmN0aW9uOworICAgICAgICAgICAgZCA9IChQeVdyYXBwZXJEZXNjck9iamVjdCAqKWRlc2NyOworICAgICAgICAgICAgaWYgKGQtPmRfYmFzZS0+d3JhcHBlciA9PSBwLT53cmFwcGVyICYmCisgICAgICAgICAgICAgICAgUHlUeXBlX0lzU3VidHlwZSh0eXBlLCBkLT5kX3R5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzcGVjaWZpYyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljID09IGQtPmRfd3JhcHBlZCkKKyAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgPSBkLT5kX3dyYXBwZWQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB1c2VfZ2VuZXJpYyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlfVFlQRShkZXNjcikgPT0gJlB5Q0Z1bmN0aW9uX1R5cGUgJiYKKyAgICAgICAgICAgICAgICAgUHlDRnVuY3Rpb25fR0VUX0ZVTkNUSU9OKGRlc2NyKSA9PQorICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdHBfbmV3X3dyYXBwZXIgJiYKKyAgICAgICAgICAgICAgICAgcHRyID09ICh2b2lkKiopJnR5cGUtPnRwX25ldykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIF9fbmV3X18gd3JhcHBlciBpcyBub3QgYSB3cmFwcGVyIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICBzbyBtdXN0IGJlIHNwZWNpYWwtY2FzZWQgZGlmZmVyZW50bHkuCisgICAgICAgICAgICAgICBJZiB3ZSBkb24ndCBkbyB0aGlzLCBjcmVhdGluZyBhbiBpbnN0YW5jZSB3aWxsCisgICAgICAgICAgICAgICBhbHdheXMgdXNlIHNsb3RfdHBfbmV3IHdoaWNoIHdpbGwgbG9vayB1cAorICAgICAgICAgICAgICAgX19uZXdfXyBpbiB0aGUgTVJPIHdoaWNoIHdpbGwgY2FsbCB0cF9uZXdfd3JhcHBlcgorICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBsb29rIHRocm91Z2ggdGhlIGJhc2UgY2xhc3NlcyBsb29raW5nCisgICAgICAgICAgICAgICBmb3IgYSBzdGF0aWMgYmFzZSBhbmQgY2FsbCBpdHMgdHBfbmV3ICh1c3VhbGx5CisgICAgICAgICAgICAgICBQeVR5cGVfR2VuZXJpY05ldyksIGFmdGVyIHBlcmZvcm1pbmcgdmFyaW91cworICAgICAgICAgICAgICAgc2FuaXR5IGNoZWNrcyBhbmQgY29uc3RydWN0aW5nIGEgbmV3IGFyZ3VtZW50CisgICAgICAgICAgICAgICBsaXN0LiAgQ3V0IGFsbCB0aGF0IG5vbnNlbnNlIHNob3J0IC0tIHRoaXMgc3BlZWRzCisgICAgICAgICAgICAgICB1cCBpbnN0YW5jZSBjcmVhdGlvbiB0cmVtZW5kb3VzbHkuICovCisgICAgICAgICAgICBzcGVjaWZpYyA9ICh2b2lkICopdHlwZS0+dHBfbmV3OworICAgICAgICAgICAgLyogWFhYIEknbSBub3QgMTAwJSBzdXJlIHRoYXQgdGhlcmUgaXNuJ3QgYSBob2xlCisgICAgICAgICAgICAgICBpbiB0aGlzIHJlYXNvbmluZyB0aGF0IHJlcXVpcmVzIGFkZGl0aW9uYWwKKyAgICAgICAgICAgICAgIHNhbml0eSBjaGVja3MuICBJJ2xsIGJ1eSB0aGUgZmlyc3QgcGVyc29uIHRvCisgICAgICAgICAgICAgICBwb2ludCBvdXQgYSBidWcgaW4gdGhpcyByZWFzb25pbmcgYSBiZWVyLiAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGRlc2NyID09IFB5X05vbmUgJiYKKyAgICAgICAgICAgICAgICAgcHRyID09ICh2b2lkKiopJnR5cGUtPnRwX2hhc2gpIHsKKyAgICAgICAgICAgIC8qIFdlIHNwZWNpZmljYWxseSBhbGxvdyBfX2hhc2hfXyB0byBiZSBzZXQgdG8gTm9uZQorICAgICAgICAgICAgICAgdG8gcHJldmVudCBpbmhlcml0YW5jZSBvZiB0aGUgZGVmYXVsdAorICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gZnJvbSBvYmplY3QuX19oYXNoX18gKi8KKyAgICAgICAgICAgIHNwZWNpZmljID0gUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdXNlX2dlbmVyaWMgPSAxOworICAgICAgICAgICAgZ2VuZXJpYyA9IHAtPmZ1bmN0aW9uOworICAgICAgICB9CisgICAgfSB3aGlsZSAoKCsrcCktPm9mZnNldCA9PSBvZmZzZXQpOworICAgIGlmIChzcGVjaWZpYyAmJiAhdXNlX2dlbmVyaWMpCisgICAgICAgICpwdHIgPSBzcGVjaWZpYzsKKyAgICBlbHNlCisgICAgICAgICpwdHIgPSBnZW5lcmljOworICAgIHJldHVybiBwOwogfQogCiAvKiBJbiB0aGUgdHlwZSwgdXBkYXRlIHRoZSBzbG90cyB3aG9zZSBzbG90ZGVmcyBhcmUgZ2F0aGVyZWQgaW4gdGhlIHBwIGFycmF5LgpAQCAtNjE4OSwxMSArNjE4OSwxMSBAQAogc3RhdGljIGludAogdXBkYXRlX3Nsb3RzX2NhbGxiYWNrKFB5VHlwZU9iamVjdCAqdHlwZSwgdm9pZCAqZGF0YSkKIHsKLQlzbG90ZGVmICoqcHAgPSAoc2xvdGRlZiAqKilkYXRhOworICAgIHNsb3RkZWYgKipwcCA9IChzbG90ZGVmICoqKWRhdGE7CiAKLQlmb3IgKDsgKnBwOyBwcCsrKQotCQl1cGRhdGVfb25lX3Nsb3QodHlwZSwgKnBwKTsKLQlyZXR1cm4gMDsKKyAgICBmb3IgKDsgKnBwOyBwcCsrKQorICAgICAgICB1cGRhdGVfb25lX3Nsb3QodHlwZSwgKnBwKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgcXNvcnQoKSB0byBjb21wYXJlIHNsb3RkZWZzIGJ5IHRoZWlyIG9mZnNldCwgYW5kCkBAIC02MjAxLDE0ICs2MjAxLDE0IEBACiBzdGF0aWMgaW50CiBzbG90ZGVmX2NtcChjb25zdCB2b2lkICphYSwgY29uc3Qgdm9pZCAqYmIpCiB7Ci0JY29uc3Qgc2xvdGRlZiAqYSA9IChjb25zdCBzbG90ZGVmICopYWEsICpiID0gKGNvbnN0IHNsb3RkZWYgKiliYjsKLQlpbnQgYyA9IGEtPm9mZnNldCAtIGItPm9mZnNldDsKLQlpZiAoYyAhPSAwKQotCQlyZXR1cm4gYzsKLQllbHNlCi0JCS8qIENhbm5vdCB1c2UgYS1iLCBhcyB0aGlzIGdpdmVzIG9mZl90LCAKLQkJICAgd2hpY2ggbWF5IGxvc2UgcHJlY2lzaW9uIHdoZW4gY29udmVydGVkIHRvIGludC4gKi8KLQkJcmV0dXJuIChhID4gYikgPyAxIDogKGEgPCBiKSA/IC0xIDogMDsKKyAgICBjb25zdCBzbG90ZGVmICphID0gKGNvbnN0IHNsb3RkZWYgKilhYSwgKmIgPSAoY29uc3Qgc2xvdGRlZiAqKWJiOworICAgIGludCBjID0gYS0+b2Zmc2V0IC0gYi0+b2Zmc2V0OworICAgIGlmIChjICE9IDApCisgICAgICAgIHJldHVybiBjOworICAgIGVsc2UKKyAgICAgICAgLyogQ2Fubm90IHVzZSBhLWIsIGFzIHRoaXMgZ2l2ZXMgb2ZmX3QsCisgICAgICAgICAgIHdoaWNoIG1heSBsb3NlIHByZWNpc2lvbiB3aGVuIGNvbnZlcnRlZCB0byBpbnQuICovCisgICAgICAgIHJldHVybiAoYSA+IGIpID8gMSA6IChhIDwgYikgPyAtMSA6IDA7CiB9CiAKIC8qIEluaXRpYWxpemUgdGhlIHNsb3RkZWZzIHRhYmxlIGJ5IGFkZGluZyBpbnRlcm5lZCBzdHJpbmcgb2JqZWN0cyBmb3IgdGhlCkBAIC02MjE2LDU2ICs2MjE2LDU2IEBACiBzdGF0aWMgdm9pZAogaW5pdF9zbG90ZGVmcyh2b2lkKQogewotCXNsb3RkZWYgKnA7Ci0Jc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgICAgc2xvdGRlZiAqcDsKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAotCWlmIChpbml0aWFsaXplZCkKLQkJcmV0dXJuOwotCWZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lOyBwKyspIHsKLQkJcC0+bmFtZV9zdHJvYmogPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKHAtPm5hbWUpOwotCQlpZiAoIXAtPm5hbWVfc3Ryb2JqKQotCQkJUHlfRmF0YWxFcnJvcigiT3V0IG9mIG1lbW9yeSBpbnRlcm5pbmcgc2xvdGRlZiBuYW1lcyIpOwotCX0KLQlxc29ydCgodm9pZCAqKXNsb3RkZWZzLCAoc2l6ZV90KShwLXNsb3RkZWZzKSwgc2l6ZW9mKHNsb3RkZWYpLAotCSAgICAgIHNsb3RkZWZfY21wKTsKLQlpbml0aWFsaXplZCA9IDE7CisgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisgICAgZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWU7IHArKykgeworICAgICAgICBwLT5uYW1lX3N0cm9iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcocC0+bmFtZSk7CisgICAgICAgIGlmICghcC0+bmFtZV9zdHJvYmopCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJPdXQgb2YgbWVtb3J5IGludGVybmluZyBzbG90ZGVmIG5hbWVzIik7CisgICAgfQorICAgIHFzb3J0KCh2b2lkICopc2xvdGRlZnMsIChzaXplX3QpKHAtc2xvdGRlZnMpLCBzaXplb2Yoc2xvdGRlZiksCisgICAgICAgICAgc2xvdGRlZl9jbXApOworICAgIGluaXRpYWxpemVkID0gMTsKIH0KIAogLyogVXBkYXRlIHRoZSBzbG90cyBhZnRlciBhc3NpZ25tZW50IHRvIGEgY2xhc3MgKHR5cGUpIGF0dHJpYnV0ZS4gKi8KIHN0YXRpYyBpbnQKIHVwZGF0ZV9zbG90KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKm5hbWUpCiB7Ci0Jc2xvdGRlZiAqcHRyc1tNQVhfRVFVSVZdOwotCXNsb3RkZWYgKnA7Ci0Jc2xvdGRlZiAqKnBwOwotCWludCBvZmZzZXQ7CisgICAgc2xvdGRlZiAqcHRyc1tNQVhfRVFVSVZdOworICAgIHNsb3RkZWYgKnA7CisgICAgc2xvdGRlZiAqKnBwOworICAgIGludCBvZmZzZXQ7CiAKLQkvKiBDbGVhciB0aGUgVkFMSURfVkVSU0lPTiBmbGFnIG9mICd0eXBlJyBhbmQgYWxsIGl0cwotCSAgIHN1YmNsYXNzZXMuICBUaGlzIGNvdWxkIHBvc3NpYmx5IGJlIHVuaWZpZWQgd2l0aCB0aGUKLQkgICB1cGRhdGVfc3ViY2xhc3NlcygpIHJlY3Vyc2lvbiBiZWxvdywgYnV0IGNhcmVmdWxseToKLQkgICB0aGV5IGVhY2ggaGF2ZSB0aGVpciBvd24gY29uZGl0aW9ucyBvbiB3aGljaCB0byBzdG9wCi0JICAgcmVjdXJzaW5nIGludG8gc3ViY2xhc3Nlcy4gKi8KLQlQeVR5cGVfTW9kaWZpZWQodHlwZSk7CisgICAgLyogQ2xlYXIgdGhlIFZBTElEX1ZFUlNJT04gZmxhZyBvZiAndHlwZScgYW5kIGFsbCBpdHMKKyAgICAgICBzdWJjbGFzc2VzLiAgVGhpcyBjb3VsZCBwb3NzaWJseSBiZSB1bmlmaWVkIHdpdGggdGhlCisgICAgICAgdXBkYXRlX3N1YmNsYXNzZXMoKSByZWN1cnNpb24gYmVsb3csIGJ1dCBjYXJlZnVsbHk6CisgICAgICAgdGhleSBlYWNoIGhhdmUgdGhlaXIgb3duIGNvbmRpdGlvbnMgb24gd2hpY2ggdG8gc3RvcAorICAgICAgIHJlY3Vyc2luZyBpbnRvIHN1YmNsYXNzZXMuICovCisgICAgUHlUeXBlX01vZGlmaWVkKHR5cGUpOwogCi0JaW5pdF9zbG90ZGVmcygpOwotCXBwID0gcHRyczsKLQlmb3IgKHAgPSBzbG90ZGVmczsgcC0+bmFtZTsgcCsrKSB7Ci0JCS8qIFhYWCBhc3N1bWUgbmFtZSBpcyBpbnRlcm5lZCEgKi8KLQkJaWYgKHAtPm5hbWVfc3Ryb2JqID09IG5hbWUpCi0JCQkqcHArKyA9IHA7Ci0JfQotCSpwcCA9IE5VTEw7Ci0JZm9yIChwcCA9IHB0cnM7ICpwcDsgcHArKykgewotCQlwID0gKnBwOwotCQlvZmZzZXQgPSBwLT5vZmZzZXQ7Ci0JCXdoaWxlIChwID4gc2xvdGRlZnMgJiYgKHAtMSktPm9mZnNldCA9PSBvZmZzZXQpCi0JCQktLXA7Ci0JCSpwcCA9IHA7Ci0JfQotCWlmIChwdHJzWzBdID09IE5VTEwpCi0JCXJldHVybiAwOyAvKiBOb3QgYW4gYXR0cmlidXRlIHRoYXQgYWZmZWN0cyBhbnkgc2xvdHMgKi8KLQlyZXR1cm4gdXBkYXRlX3N1YmNsYXNzZXModHlwZSwgbmFtZSwKLQkJCQkgdXBkYXRlX3Nsb3RzX2NhbGxiYWNrLCAodm9pZCAqKXB0cnMpOworICAgIGluaXRfc2xvdGRlZnMoKTsKKyAgICBwcCA9IHB0cnM7CisgICAgZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWU7IHArKykgeworICAgICAgICAvKiBYWFggYXNzdW1lIG5hbWUgaXMgaW50ZXJuZWQhICovCisgICAgICAgIGlmIChwLT5uYW1lX3N0cm9iaiA9PSBuYW1lKQorICAgICAgICAgICAgKnBwKysgPSBwOworICAgIH0KKyAgICAqcHAgPSBOVUxMOworICAgIGZvciAocHAgPSBwdHJzOyAqcHA7IHBwKyspIHsKKyAgICAgICAgcCA9ICpwcDsKKyAgICAgICAgb2Zmc2V0ID0gcC0+b2Zmc2V0OworICAgICAgICB3aGlsZSAocCA+IHNsb3RkZWZzICYmIChwLTEpLT5vZmZzZXQgPT0gb2Zmc2V0KQorICAgICAgICAgICAgLS1wOworICAgICAgICAqcHAgPSBwOworICAgIH0KKyAgICBpZiAocHRyc1swXSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsgLyogTm90IGFuIGF0dHJpYnV0ZSB0aGF0IGFmZmVjdHMgYW55IHNsb3RzICovCisgICAgcmV0dXJuIHVwZGF0ZV9zdWJjbGFzc2VzKHR5cGUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9zbG90c19jYWxsYmFjaywgKHZvaWQgKilwdHJzKTsKIH0KIAogLyogU3RvcmUgdGhlIHByb3BlciBmdW5jdGlvbnMgaW4gdGhlIHNsb3QgZGlzcGF0Y2hlcyBhdCBjbGFzcyAodHlwZSkKQEAgLTYyNzQsMjMgKzYyNzQsMjMgQEAKIHN0YXRpYyB2b2lkCiBmaXh1cF9zbG90X2Rpc3BhdGNoZXJzKFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlzbG90ZGVmICpwOworICAgIHNsb3RkZWYgKnA7CiAKLQlpbml0X3Nsb3RkZWZzKCk7Ci0JZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWU7ICkKLQkJcCA9IHVwZGF0ZV9vbmVfc2xvdCh0eXBlLCBwKTsKKyAgICBpbml0X3Nsb3RkZWZzKCk7CisgICAgZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWU7ICkKKyAgICAgICAgcCA9IHVwZGF0ZV9vbmVfc2xvdCh0eXBlLCBwKTsKIH0KIAogc3RhdGljIHZvaWQKIHVwZGF0ZV9hbGxfc2xvdHMoUHlUeXBlT2JqZWN0KiB0eXBlKQogewotCXNsb3RkZWYgKnA7CisgICAgc2xvdGRlZiAqcDsKIAotCWluaXRfc2xvdGRlZnMoKTsKLQlmb3IgKHAgPSBzbG90ZGVmczsgcC0+bmFtZTsgcCsrKSB7Ci0JCS8qIHVwZGF0ZV9zbG90IHJldHVybnMgaW50IGJ1dCBjYW4ndCBhY3R1YWxseSBmYWlsICovCi0JCXVwZGF0ZV9zbG90KHR5cGUsIHAtPm5hbWVfc3Ryb2JqKTsKLQl9CisgICAgaW5pdF9zbG90ZGVmcygpOworICAgIGZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lOyBwKyspIHsKKyAgICAgICAgLyogdXBkYXRlX3Nsb3QgcmV0dXJucyBpbnQgYnV0IGNhbid0IGFjdHVhbGx5IGZhaWwgKi8KKyAgICAgICAgdXBkYXRlX3Nsb3QodHlwZSwgcC0+bmFtZV9zdHJvYmopOworICAgIH0KIH0KIAogLyogcmVjdXJzZV9kb3duX3N1YmNsYXNzZXMoKSBhbmQgdXBkYXRlX3N1YmNsYXNzZXMoKSBhcmUgbXV0dWFsbHkKQEAgLTYyOTksNTYgKzYyOTksNTYgQEAKIAogc3RhdGljIGludAogdXBkYXRlX3N1YmNsYXNzZXMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqbmFtZSwKLQkJICB1cGRhdGVfY2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCisgICAgICAgICAgICAgICAgICB1cGRhdGVfY2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCiB7Ci0JaWYgKGNhbGxiYWNrKHR5cGUsIGRhdGEpIDwgMCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiByZWN1cnNlX2Rvd25fc3ViY2xhc3Nlcyh0eXBlLCBuYW1lLCBjYWxsYmFjaywgZGF0YSk7CisgICAgaWYgKGNhbGxiYWNrKHR5cGUsIGRhdGEpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiByZWN1cnNlX2Rvd25fc3ViY2xhc3Nlcyh0eXBlLCBuYW1lLCBjYWxsYmFjaywgZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQKIHJlY3Vyc2VfZG93bl9zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKm5hbWUsCi0JCQl1cGRhdGVfY2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfY2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCiB7Ci0JUHlUeXBlT2JqZWN0ICpzdWJjbGFzczsKLQlQeU9iamVjdCAqcmVmLCAqc3ViY2xhc3NlcywgKmRpY3Q7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5VHlwZU9iamVjdCAqc3ViY2xhc3M7CisgICAgUHlPYmplY3QgKnJlZiwgKnN1YmNsYXNzZXMsICpkaWN0OworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCXN1YmNsYXNzZXMgPSB0eXBlLT50cF9zdWJjbGFzc2VzOwotCWlmIChzdWJjbGFzc2VzID09IE5VTEwpCi0JCXJldHVybiAwOwotCWFzc2VydChQeUxpc3RfQ2hlY2soc3ViY2xhc3NlcykpOwotCW4gPSBQeUxpc3RfR0VUX1NJWkUoc3ViY2xhc3Nlcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlyZWYgPSBQeUxpc3RfR0VUX0lURU0oc3ViY2xhc3NlcywgaSk7Ci0JCWFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7Ci0JCXN1YmNsYXNzID0gKFB5VHlwZU9iamVjdCAqKVB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZik7Ci0JCWFzc2VydChzdWJjbGFzcyAhPSBOVUxMKTsKLQkJaWYgKChQeU9iamVjdCAqKXN1YmNsYXNzID09IFB5X05vbmUpCi0JCQljb250aW51ZTsKLQkJYXNzZXJ0KFB5VHlwZV9DaGVjayhzdWJjbGFzcykpOwotCQkvKiBBdm9pZCByZWN1cnNpbmcgZG93biBpbnRvIHVuYWZmZWN0ZWQgY2xhc3NlcyAqLwotCQlkaWN0ID0gc3ViY2xhc3MtPnRwX2RpY3Q7Ci0JCWlmIChkaWN0ICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGRpY3QpICYmCi0JCSAgICBQeURpY3RfR2V0SXRlbShkaWN0LCBuYW1lKSAhPSBOVUxMKQotCQkJY29udGludWU7Ci0JCWlmICh1cGRhdGVfc3ViY2xhc3NlcyhzdWJjbGFzcywgbmFtZSwgY2FsbGJhY2ssIGRhdGEpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgc3ViY2xhc3NlcyA9IHR5cGUtPnRwX3N1YmNsYXNzZXM7CisgICAgaWYgKHN1YmNsYXNzZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhzdWJjbGFzc2VzKSk7CisgICAgbiA9IFB5TGlzdF9HRVRfU0laRShzdWJjbGFzc2VzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHJlZiA9IFB5TGlzdF9HRVRfSVRFTShzdWJjbGFzc2VzLCBpKTsKKyAgICAgICAgYXNzZXJ0KFB5V2Vha3JlZl9DaGVja1JlZihyZWYpKTsKKyAgICAgICAgc3ViY2xhc3MgPSAoUHlUeXBlT2JqZWN0ICopUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKTsKKyAgICAgICAgYXNzZXJ0KHN1YmNsYXNzICE9IE5VTEwpOworICAgICAgICBpZiAoKFB5T2JqZWN0ICopc3ViY2xhc3MgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBhc3NlcnQoUHlUeXBlX0NoZWNrKHN1YmNsYXNzKSk7CisgICAgICAgIC8qIEF2b2lkIHJlY3Vyc2luZyBkb3duIGludG8gdW5hZmZlY3RlZCBjbGFzc2VzICovCisgICAgICAgIGRpY3QgPSBzdWJjbGFzcy0+dHBfZGljdDsKKyAgICAgICAgaWYgKGRpY3QgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soZGljdCkgJiYKKyAgICAgICAgICAgIFB5RGljdF9HZXRJdGVtKGRpY3QsIG5hbWUpICE9IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHVwZGF0ZV9zdWJjbGFzc2VzKHN1YmNsYXNzLCBuYW1lLCBjYWxsYmFjaywgZGF0YSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgUHlUeXBlX1JlYWR5KCkgdG8gcG9wdWxhdGUgdGhlIHR5cGUncwogICAgZGljdGlvbmFyeSB3aXRoIG1ldGhvZCBkZXNjcmlwdG9ycyBmb3IgZnVuY3Rpb24gc2xvdHMuICBGb3IgZWFjaAogICAgZnVuY3Rpb24gc2xvdCAobGlrZSB0cF9yZXByKSB0aGF0J3MgZGVmaW5lZCBpbiB0aGUgdHlwZSwgb25lIG9yIG1vcmUKICAgIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRvcnMgYXJlIGFkZGVkIGluIHRoZSB0eXBlJ3MgdHBfZGljdCBkaWN0aW9uYXJ5Ci0gICB1bmRlciB0aGUgYXBwcm9wcmlhdGUgbmFtZSAobGlrZSBfX3JlcHJfXykuCVNvbWUgZnVuY3Rpb24gc2xvdHMKKyAgIHVuZGVyIHRoZSBhcHByb3ByaWF0ZSBuYW1lIChsaWtlIF9fcmVwcl9fKS4gIFNvbWUgZnVuY3Rpb24gc2xvdHMKICAgIGNhdXNlIG1vcmUgdGhhbiBvbmUgZGVzY3JpcHRvciB0byBiZSBhZGRlZCAoZm9yIGV4YW1wbGUsIHRoZSBuYl9hZGQKICAgIHNsb3QgYWRkcyBib3RoIF9fYWRkX18gYW5kIF9fcmFkZF9fIGRlc2NyaXB0b3JzKSBhbmQgc29tZSBmdW5jdGlvbgogICAgc2xvdHMgY29tcGV0ZSBmb3IgdGhlIHNhbWUgZGVzY3JpcHRvciAoZm9yIGV4YW1wbGUgYm90aCBzcV9pdGVtIGFuZAogICAgbXBfc3Vic2NyaXB0IGdlbmVyYXRlIGEgX19nZXRpdGVtX18gZGVzY3JpcHRvcikuCiAKLSAgIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIGZpcnN0IHNsb3RkZWYgZW50cnkgZW5jb3V0ZXJlZCB3aW5zLgkgU2luY2UKKyAgIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIGZpcnN0IHNsb3RkZWYgZW50cnkgZW5jb3V0ZXJlZCB3aW5zLiAgU2luY2UKICAgIHNsb3RkZWYgZW50cmllcyBhcmUgc29ydGVkIGJ5IHRoZSBvZmZzZXQgb2YgdGhlIHNsb3QgaW4gdGhlCiAgICBQeUhlYXBUeXBlT2JqZWN0LCB0aGlzIGdpdmVzIHVzIHNvbWUgY29udHJvbCBvdmVyIGRpc2FtYmlndWF0aW5nCiAgICBiZXR3ZWVuIGNvbXBldGluZyBzbG90czogdGhlIG1lbWJlcnMgb2YgUHlIZWFwVHlwZU9iamVjdCBhcmUgbGlzdGVkCkBAIC02MzcxLDI4MiArNjM3MSwyODIgQEAKIHN0YXRpYyBpbnQKIGFkZF9vcGVyYXRvcnMoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKLQlzbG90ZGVmICpwOwotCVB5T2JqZWN0ICpkZXNjcjsKLQl2b2lkICoqcHRyOworICAgIFB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKKyAgICBzbG90ZGVmICpwOworICAgIFB5T2JqZWN0ICpkZXNjcjsKKyAgICB2b2lkICoqcHRyOwogCi0JaW5pdF9zbG90ZGVmcygpOwotCWZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lOyBwKyspIHsKLQkJaWYgKHAtPndyYXBwZXIgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlwdHIgPSBzbG90cHRyKHR5cGUsIHAtPm9mZnNldCk7Ci0JCWlmICghcHRyIHx8ICEqcHRyKQotCQkJY29udGludWU7Ci0JCWlmIChQeURpY3RfR2V0SXRlbShkaWN0LCBwLT5uYW1lX3N0cm9iaikpCi0JCQljb250aW51ZTsKLQkJaWYgKCpwdHIgPT0gUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKSB7Ci0JCQkvKiBDbGFzc2VzIG1heSBwcmV2ZW50IHRoZSBpbmhlcml0YW5jZSBvZiB0aGUgdHBfaGFzaAotCQkJICAgc2xvdCBieSBzdG9yaW5nIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCBpbiBpdC4gTWFrZSBpdAotIAkJCSAgIHZpc2libGUgYXMgYSBOb25lIHZhbHVlIGZvciB0aGUgX19oYXNoX18gYXR0cmlidXRlLiAqLwotCQkJaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIHAtPm5hbWVfc3Ryb2JqLCBQeV9Ob25lKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgewotCQkJZGVzY3IgPSBQeURlc2NyX05ld1dyYXBwZXIodHlwZSwgcCwgKnB0cik7Ci0JCQlpZiAoZGVzY3IgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgcC0+bmFtZV9zdHJvYmosIGRlc2NyKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJUHlfREVDUkVGKGRlc2NyKTsKLQkJfQotCX0KLQlpZiAodHlwZS0+dHBfbmV3ICE9IE5VTEwpIHsKLQkJaWYgKGFkZF90cF9uZXdfd3JhcHBlcih0eXBlKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGluaXRfc2xvdGRlZnMoKTsKKyAgICBmb3IgKHAgPSBzbG90ZGVmczsgcC0+bmFtZTsgcCsrKSB7CisgICAgICAgIGlmIChwLT53cmFwcGVyID09IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcHRyID0gc2xvdHB0cih0eXBlLCBwLT5vZmZzZXQpOworICAgICAgICBpZiAoIXB0ciB8fCAhKnB0cikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW0oZGljdCwgcC0+bmFtZV9zdHJvYmopKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgqcHRyID09IFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCkgeworICAgICAgICAgICAgLyogQ2xhc3NlcyBtYXkgcHJldmVudCB0aGUgaW5oZXJpdGFuY2Ugb2YgdGhlIHRwX2hhc2gKKyAgICAgICAgICAgICAgIHNsb3QgYnkgc3RvcmluZyBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQgaW4gaXQuIE1ha2UgaXQKKyAgICAgICAgICAgICAgIHZpc2libGUgYXMgYSBOb25lIHZhbHVlIGZvciB0aGUgX19oYXNoX18gYXR0cmlidXRlLiAqLworICAgICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIHAtPm5hbWVfc3Ryb2JqLCBQeV9Ob25lKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZGVzY3IgPSBQeURlc2NyX05ld1dyYXBwZXIodHlwZSwgcCwgKnB0cik7CisgICAgICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgcC0+bmFtZV9zdHJvYmosIGRlc2NyKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgUHlfREVDUkVGKGRlc2NyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodHlwZS0+dHBfbmV3ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGFkZF90cF9uZXdfd3JhcHBlcih0eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAKIC8qIENvb3BlcmF0aXZlICdzdXBlcicgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeVR5cGVPYmplY3QgKnR5cGU7Ci0JUHlPYmplY3QgKm9iajsKLQlQeVR5cGVPYmplY3QgKm9ial90eXBlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeVR5cGVPYmplY3QgKnR5cGU7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBQeVR5cGVPYmplY3QgKm9ial90eXBlOwogfSBzdXBlcm9iamVjdDsKIAogc3RhdGljIFB5TWVtYmVyRGVmIHN1cGVyX21lbWJlcnNbXSA9IHsKLQl7Il9fdGhpc2NsYXNzX18iLCBUX09CSkVDVCwgb2Zmc2V0b2Yoc3VwZXJvYmplY3QsIHR5cGUpLCBSRUFET05MWSwKLQkgInRoZSBjbGFzcyBpbnZva2luZyBzdXBlcigpIn0sCi0JeyJfX3NlbGZfXyIsICBUX09CSkVDVCwgb2Zmc2V0b2Yoc3VwZXJvYmplY3QsIG9iaiksIFJFQURPTkxZLAotCSAidGhlIGluc3RhbmNlIGludm9raW5nIHN1cGVyKCk7IG1heSBiZSBOb25lIn0sCi0JeyJfX3NlbGZfY2xhc3NfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihzdXBlcm9iamVjdCwgb2JqX3R5cGUpLCBSRUFET05MWSwKLQkgInRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSBpbnZva2luZyBzdXBlcigpOyBtYXkgYmUgTm9uZSJ9LAotCXswfQorICAgIHsiX190aGlzY2xhc3NfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihzdXBlcm9iamVjdCwgdHlwZSksIFJFQURPTkxZLAorICAgICAidGhlIGNsYXNzIGludm9raW5nIHN1cGVyKCkifSwKKyAgICB7Il9fc2VsZl9fIiwgIFRfT0JKRUNULCBvZmZzZXRvZihzdXBlcm9iamVjdCwgb2JqKSwgUkVBRE9OTFksCisgICAgICJ0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmUifSwKKyAgICB7Il9fc2VsZl9jbGFzc19fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHN1cGVyb2JqZWN0LCBvYmpfdHlwZSksIFJFQURPTkxZLAorICAgICAidGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIGludm9raW5nIHN1cGVyKCk7IG1heSBiZSBOb25lIn0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgdm9pZAogc3VwZXJfZGVhbGxvYyhQeU9iamVjdCAqc2VsZikKIHsKLQlzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOworICAgIHN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7CiAKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhzZWxmKTsKLQlQeV9YREVDUkVGKHN1LT5vYmopOwotCVB5X1hERUNSRUYoc3UtPnR5cGUpOwotCVB5X1hERUNSRUYoc3UtPm9ial90eXBlKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKHNlbGYpOworICAgIFB5X1hERUNSRUYoc3UtPm9iaik7CisgICAgUHlfWERFQ1JFRihzdS0+dHlwZSk7CisgICAgUHlfWERFQ1JFRihzdS0+b2JqX3R5cGUpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdXBlcl9yZXByKFB5T2JqZWN0ICpzZWxmKQogewotCXN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7CisgICAgc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKIAotCWlmIChzdS0+b2JqX3R5cGUpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KAotCQkJIjxzdXBlcjogPGNsYXNzICclcyc+LCA8JXMgb2JqZWN0Pj4iLAotCQkJc3UtPnR5cGUgPyBzdS0+dHlwZS0+dHBfbmFtZSA6ICJOVUxMIiwKLQkJCXN1LT5vYmpfdHlwZS0+dHBfbmFtZSk7Ci0JZWxzZQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgKLQkJCSI8c3VwZXI6IDxjbGFzcyAnJXMnPiwgTlVMTD4iLAotCQkJc3UtPnR5cGUgPyBzdS0+dHlwZS0+dHBfbmFtZSA6ICJOVUxMIik7CisgICAgaWYgKHN1LT5vYmpfdHlwZSkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoCisgICAgICAgICAgICAiPHN1cGVyOiA8Y2xhc3MgJyVzJz4sIDwlcyBvYmplY3Q+PiIsCisgICAgICAgICAgICBzdS0+dHlwZSA/IHN1LT50eXBlLT50cF9uYW1lIDogIk5VTEwiLAorICAgICAgICAgICAgc3UtPm9ial90eXBlLT50cF9uYW1lKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KAorICAgICAgICAgICAgIjxzdXBlcjogPGNsYXNzICclcyc+LCBOVUxMPiIsCisgICAgICAgICAgICBzdS0+dHlwZSA/IHN1LT50eXBlLT50cF9uYW1lIDogIk5VTEwiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN1cGVyX2dldGF0dHJvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbmFtZSkKIHsKLQlzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOwotCWludCBza2lwID0gc3UtPm9ial90eXBlID09IE5VTEw7CisgICAgc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKKyAgICBpbnQgc2tpcCA9IHN1LT5vYmpfdHlwZSA9PSBOVUxMOwogCi0JaWYgKCFza2lwKSB7Ci0JCS8qIFdlIHdhbnQgX19jbGFzc19fIHRvIHJldHVybiB0aGUgY2xhc3Mgb2YgdGhlIHN1cGVyIG9iamVjdAotCQkgICAoaS5lLiBzdXBlciwgb3IgYSBzdWJjbGFzcyksIG5vdCB0aGUgY2xhc3Mgb2Ygc3UtPm9iai4gKi8KLQkJc2tpcCA9IChQeVN0cmluZ19DaGVjayhuYW1lKSAmJgotCQkJUHlTdHJpbmdfR0VUX1NJWkUobmFtZSkgPT0gOSAmJgotCQkJc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgIl9fY2xhc3NfXyIpID09IDApOwotCX0KKyAgICBpZiAoIXNraXApIHsKKyAgICAgICAgLyogV2Ugd2FudCBfX2NsYXNzX18gdG8gcmV0dXJuIHRoZSBjbGFzcyBvZiB0aGUgc3VwZXIgb2JqZWN0CisgICAgICAgICAgIChpLmUuIHN1cGVyLCBvciBhIHN1YmNsYXNzKSwgbm90IHRoZSBjbGFzcyBvZiBzdS0+b2JqLiAqLworICAgICAgICBza2lwID0gKFB5U3RyaW5nX0NoZWNrKG5hbWUpICYmCisgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShuYW1lKSA9PSA5ICYmCisgICAgICAgICAgICBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLCAiX19jbGFzc19fIikgPT0gMCk7CisgICAgfQogCi0JaWYgKCFza2lwKSB7Ci0JCVB5T2JqZWN0ICptcm8sICpyZXMsICp0bXAsICpkaWN0OwotCQlQeVR5cGVPYmplY3QgKnN0YXJ0dHlwZTsKLQkJZGVzY3JnZXRmdW5jIGY7Ci0JCVB5X3NzaXplX3QgaSwgbjsKKyAgICBpZiAoIXNraXApIHsKKyAgICAgICAgUHlPYmplY3QgKm1ybywgKnJlcywgKnRtcCwgKmRpY3Q7CisgICAgICAgIFB5VHlwZU9iamVjdCAqc3RhcnR0eXBlOworICAgICAgICBkZXNjcmdldGZ1bmMgZjsKKyAgICAgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JCXN0YXJ0dHlwZSA9IHN1LT5vYmpfdHlwZTsKLQkJbXJvID0gc3RhcnR0eXBlLT50cF9tcm87CisgICAgICAgIHN0YXJ0dHlwZSA9IHN1LT5vYmpfdHlwZTsKKyAgICAgICAgbXJvID0gc3RhcnR0eXBlLT50cF9tcm87CiAKLQkJaWYgKG1ybyA9PSBOVUxMKQotCQkJbiA9IDA7Ci0JCWVsc2UgewotCQkJYXNzZXJ0KFB5VHVwbGVfQ2hlY2sobXJvKSk7Ci0JCQluID0gUHlUdXBsZV9HRVRfU0laRShtcm8pOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWlmICgoUHlPYmplY3QgKikoc3UtPnR5cGUpID09IFB5VHVwbGVfR0VUX0lURU0obXJvLCBpKSkKLQkJCQlicmVhazsKLQkJfQotCQlpKys7Ci0JCXJlcyA9IE5VTEw7Ci0JCWZvciAoOyBpIDwgbjsgaSsrKSB7Ci0JCQl0bXAgPSBQeVR1cGxlX0dFVF9JVEVNKG1ybywgaSk7Ci0JCQlpZiAoUHlUeXBlX0NoZWNrKHRtcCkpCi0JCQkJZGljdCA9ICgoUHlUeXBlT2JqZWN0ICopdG1wKS0+dHBfZGljdDsKLQkJCWVsc2UgaWYgKFB5Q2xhc3NfQ2hlY2sodG1wKSkKLQkJCQlkaWN0ID0gKChQeUNsYXNzT2JqZWN0ICopdG1wKS0+Y2xfZGljdDsKLQkJCWVsc2UKLQkJCQljb250aW51ZTsKLQkJCXJlcyA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIG5hbWUpOwotCQkJaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCQkJUHlfSU5DUkVGKHJlcyk7Ci0JCQkJZiA9IFB5X1RZUEUocmVzKS0+dHBfZGVzY3JfZ2V0OwotCQkJCWlmIChmICE9IE5VTEwpIHsKLQkJCQkJdG1wID0gZihyZXMsCi0JCQkJCQkvKiBPbmx5IHBhc3MgJ29iaicgcGFyYW0gaWYKLQkJCQkJCSAgIHRoaXMgaXMgaW5zdGFuY2UtbW9kZSBzdXBlciAKLQkJCQkJCSAgIChTZWUgU0YgSUQgIzc0MzYyNykKLQkJCQkJCSovCi0JCQkJCQkoc3UtPm9iaiA9PSAoUHlPYmplY3QgKikKLQkJCQkJCQkgICAgc3UtPm9ial90eXBlIAotCQkJCQkJCT8gKFB5T2JqZWN0ICopTlVMTCAKLQkJCQkJCQk6IHN1LT5vYmopLAotCQkJCQkJKFB5T2JqZWN0ICopc3RhcnR0eXBlKTsKLQkJCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQkJCXJlcyA9IHRtcDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlczsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoc2VsZiwgbmFtZSk7CisgICAgICAgIGlmIChtcm8gPT0gTlVMTCkKKyAgICAgICAgICAgIG4gPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKG1ybykpOworICAgICAgICAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUobXJvKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKFB5T2JqZWN0ICopKHN1LT50eXBlKSA9PSBQeVR1cGxlX0dFVF9JVEVNKG1ybywgaSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgICAgICByZXMgPSBOVUxMOworICAgICAgICBmb3IgKDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdG1wID0gUHlUdXBsZV9HRVRfSVRFTShtcm8sIGkpOworICAgICAgICAgICAgaWYgKFB5VHlwZV9DaGVjayh0bXApKQorICAgICAgICAgICAgICAgIGRpY3QgPSAoKFB5VHlwZU9iamVjdCAqKXRtcCktPnRwX2RpY3Q7CisgICAgICAgICAgICBlbHNlIGlmIChQeUNsYXNzX0NoZWNrKHRtcCkpCisgICAgICAgICAgICAgICAgZGljdCA9ICgoUHlDbGFzc09iamVjdCAqKXRtcCktPmNsX2RpY3Q7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICByZXMgPSBQeURpY3RfR2V0SXRlbShkaWN0LCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICAgICAgICAgIGYgPSBQeV9UWVBFKHJlcyktPnRwX2Rlc2NyX2dldDsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGYocmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogT25seSBwYXNzICdvYmonIHBhcmFtIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIGluc3RhbmNlLW1vZGUgc3VwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChTZWUgU0YgSUQgIzc0MzYyNykKKyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAoc3UtPm9iaiA9PSAoUHlPYmplY3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1LT5vYmpfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKFB5T2JqZWN0ICopTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3UtPm9iaiksCisgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilzdGFydHR5cGUpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gdG1wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cihzZWxmLCBuYW1lKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCAqCiBzdXBlcmNoZWNrKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKm9iaikKIHsKLQkvKiBDaGVjayB0aGF0IGEgc3VwZXIoKSBjYWxsIG1ha2VzIHNlbnNlLiAgUmV0dXJuIGEgdHlwZSBvYmplY3QuCisgICAgLyogQ2hlY2sgdGhhdCBhIHN1cGVyKCkgY2FsbCBtYWtlcyBzZW5zZS4gIFJldHVybiBhIHR5cGUgb2JqZWN0LgogCi0JICAgb2JqIGNhbiBiZSBhIG5ldy1zdHlsZSBjbGFzcywgb3IgYW4gaW5zdGFuY2Ugb2Ygb25lOgorICAgICAgIG9iaiBjYW4gYmUgYSBuZXctc3R5bGUgY2xhc3MsIG9yIGFuIGluc3RhbmNlIG9mIG9uZToKIAotCSAgIC0gSWYgaXQgaXMgYSBjbGFzcywgaXQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mICd0eXBlJy4JIFRoaXMgY2FzZSBpcwotCSAgICAgdXNlZCBmb3IgY2xhc3MgbWV0aG9kczsgdGhlIHJldHVybiB2YWx1ZSBpcyBvYmouCisgICAgICAgLSBJZiBpdCBpcyBhIGNsYXNzLCBpdCBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgJ3R5cGUnLiAgICAgIFRoaXMgY2FzZSBpcworICAgICAgICAgdXNlZCBmb3IgY2xhc3MgbWV0aG9kczsgdGhlIHJldHVybiB2YWx1ZSBpcyBvYmouCiAKLQkgICAtIElmIGl0IGlzIGFuIGluc3RhbmNlLCBpdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mICd0eXBlJy4gIFRoaXMgaXMKLQkgICAgIHRoZSBub3JtYWwgY2FzZTsgdGhlIHJldHVybiB2YWx1ZSBpcyBvYmouX19jbGFzc19fLgorICAgICAgIC0gSWYgaXQgaXMgYW4gaW5zdGFuY2UsIGl0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgJ3R5cGUnLiAgVGhpcyBpcworICAgICAgICAgdGhlIG5vcm1hbCBjYXNlOyB0aGUgcmV0dXJuIHZhbHVlIGlzIG9iai5fX2NsYXNzX18uCiAKLQkgICBCdXQuLi4gd2hlbiBvYmogaXMgYW4gaW5zdGFuY2UsIHdlIHdhbnQgdG8gYWxsb3cgZm9yIHRoZSBjYXNlIHdoZXJlCi0JICAgUHlfVFlQRShvYmopIGlzIG5vdCBhIHN1YmNsYXNzIG9mIHR5cGUsIGJ1dCBvYmouX19jbGFzc19fIGlzIQotCSAgIFRoaXMgd2lsbCBhbGxvdyB1c2luZyBzdXBlcigpIHdpdGggYSBwcm94eSBmb3Igb2JqLgotCSovCisgICAgICAgQnV0Li4uIHdoZW4gb2JqIGlzIGFuIGluc3RhbmNlLCB3ZSB3YW50IHRvIGFsbG93IGZvciB0aGUgY2FzZSB3aGVyZQorICAgICAgIFB5X1RZUEUob2JqKSBpcyBub3QgYSBzdWJjbGFzcyBvZiB0eXBlLCBidXQgb2JqLl9fY2xhc3NfXyBpcyEKKyAgICAgICBUaGlzIHdpbGwgYWxsb3cgdXNpbmcgc3VwZXIoKSB3aXRoIGEgcHJveHkgZm9yIG9iai4KKyAgICAqLwogCi0JLyogQ2hlY2sgZm9yIGZpcnN0IGJ1bGxldCBhYm92ZSAoc3BlY2lhbCBjYXNlKSAqLwotCWlmIChQeVR5cGVfQ2hlY2sob2JqKSAmJiBQeVR5cGVfSXNTdWJ0eXBlKChQeVR5cGVPYmplY3QgKilvYmosIHR5cGUpKSB7Ci0JCVB5X0lOQ1JFRihvYmopOwotCQlyZXR1cm4gKFB5VHlwZU9iamVjdCAqKW9iajsKLQl9CisgICAgLyogQ2hlY2sgZm9yIGZpcnN0IGJ1bGxldCBhYm92ZSAoc3BlY2lhbCBjYXNlKSAqLworICAgIGlmIChQeVR5cGVfQ2hlY2sob2JqKSAmJiBQeVR5cGVfSXNTdWJ0eXBlKChQeVR5cGVPYmplY3QgKilvYmosIHR5cGUpKSB7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgICAgICByZXR1cm4gKFB5VHlwZU9iamVjdCAqKW9iajsKKyAgICB9CiAKLQkvKiBOb3JtYWwgY2FzZSAqLwotCWlmIChQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2JqKSwgdHlwZSkpIHsKLQkJUHlfSU5DUkVGKFB5X1RZUEUob2JqKSk7Ci0JCXJldHVybiBQeV9UWVBFKG9iaik7Ci0JfQotCWVsc2UgewotCQkvKiBUcnkgdGhlIHNsb3cgd2F5ICovCi0JCXN0YXRpYyBQeU9iamVjdCAqY2xhc3Nfc3RyID0gTlVMTDsKLQkJUHlPYmplY3QgKmNsYXNzX2F0dHI7CisgICAgLyogTm9ybWFsIGNhc2UgKi8KKyAgICBpZiAoUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iaiksIHR5cGUpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9UWVBFKG9iaikpOworICAgICAgICByZXR1cm4gUHlfVFlQRShvYmopOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogVHJ5IHRoZSBzbG93IHdheSAqLworICAgICAgICBzdGF0aWMgUHlPYmplY3QgKmNsYXNzX3N0ciA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICpjbGFzc19hdHRyOwogCi0JCWlmIChjbGFzc19zdHIgPT0gTlVMTCkgewotCQkJY2xhc3Nfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX19jbGFzc19fIik7Ci0JCQlpZiAoY2xhc3Nfc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKGNsYXNzX3N0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBjbGFzc19zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJfX2NsYXNzX18iKTsKKyAgICAgICAgICAgIGlmIChjbGFzc19zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCWNsYXNzX2F0dHIgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgY2xhc3Nfc3RyKTsKKyAgICAgICAgY2xhc3NfYXR0ciA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBjbGFzc19zdHIpOwogCi0JCWlmIChjbGFzc19hdHRyICE9IE5VTEwgJiYKLQkJICAgIFB5VHlwZV9DaGVjayhjbGFzc19hdHRyKSAmJgotCQkgICAgKFB5VHlwZU9iamVjdCAqKWNsYXNzX2F0dHIgIT0gUHlfVFlQRShvYmopKQotCQl7Ci0JCQlpbnQgb2sgPSBQeVR5cGVfSXNTdWJ0eXBlKAotCQkJCShQeVR5cGVPYmplY3QgKiljbGFzc19hdHRyLCB0eXBlKTsKLQkJCWlmIChvaykKLQkJCQlyZXR1cm4gKFB5VHlwZU9iamVjdCAqKWNsYXNzX2F0dHI7Ci0JCX0KKyAgICAgICAgaWYgKGNsYXNzX2F0dHIgIT0gTlVMTCAmJgorICAgICAgICAgICAgUHlUeXBlX0NoZWNrKGNsYXNzX2F0dHIpICYmCisgICAgICAgICAgICAoUHlUeXBlT2JqZWN0ICopY2xhc3NfYXR0ciAhPSBQeV9UWVBFKG9iaikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvayA9IFB5VHlwZV9Jc1N1YnR5cGUoCisgICAgICAgICAgICAgICAgKFB5VHlwZU9iamVjdCAqKWNsYXNzX2F0dHIsIHR5cGUpOworICAgICAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgICAgIHJldHVybiAoUHlUeXBlT2JqZWN0ICopY2xhc3NfYXR0cjsKKyAgICAgICAgfQogCi0JCWlmIChjbGFzc19hdHRyID09IE5VTEwpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlCi0JCQlQeV9ERUNSRUYoY2xhc3NfYXR0cik7Ci0JfQorICAgICAgICBpZiAoY2xhc3NfYXR0ciA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfREVDUkVGKGNsYXNzX2F0dHIpOworICAgIH0KIAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkic3VwZXIodHlwZSwgb2JqKTogIgotCQkJIm9iaiBtdXN0IGJlIGFuIGluc3RhbmNlIG9yIHN1YnR5cGUgb2YgdHlwZSIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJzdXBlcih0eXBlLCBvYmopOiAiCisgICAgICAgICAgICAgICAgICAgICJvYmogbXVzdCBiZSBhbiBpbnN0YW5jZSBvciBzdWJ0eXBlIG9mIHR5cGUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN1cGVyX2Rlc2NyX2dldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0Jc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKLQlzdXBlcm9iamVjdCAqbmV3b2JqOworICAgIHN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7CisgICAgc3VwZXJvYmplY3QgKm5ld29iajsKIAotCWlmIChvYmogPT0gTlVMTCB8fCBvYmogPT0gUHlfTm9uZSB8fCBzdS0+b2JqICE9IE5VTEwpIHsKLQkJLyogTm90IGJpbmRpbmcgdG8gYW4gb2JqZWN0LCBvciBhbHJlYWR5IGJvdW5kICovCi0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJcmV0dXJuIHNlbGY7Ci0JfQotCWlmIChQeV9UWVBFKHN1KSAhPSAmUHlTdXBlcl9UeXBlKQotCQkvKiBJZiBzdSBpcyBhbiBpbnN0YW5jZSBvZiBhIChzdHJpY3QpIHN1YmNsYXNzIG9mIHN1cGVyLAotCQkgICBjYWxsIGl0cyB0eXBlICovCi0JCXJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCAqKVB5X1RZUEUoc3UpLAotCQkJCQkJICAgIHN1LT50eXBlLCBvYmosIE5VTEwpOwotCWVsc2UgewotCQkvKiBJbmxpbmUgdGhlIGNvbW1vbiBjYXNlICovCi0JCVB5VHlwZU9iamVjdCAqb2JqX3R5cGUgPSBzdXBlcmNoZWNrKHN1LT50eXBlLCBvYmopOwotCQlpZiAob2JqX3R5cGUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQluZXdvYmogPSAoc3VwZXJvYmplY3QgKilQeVN1cGVyX1R5cGUudHBfbmV3KCZQeVN1cGVyX1R5cGUsCi0JCQkJCQkJIE5VTEwsIE5VTEwpOwotCQlpZiAobmV3b2JqID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlfSU5DUkVGKHN1LT50eXBlKTsKLQkJUHlfSU5DUkVGKG9iaik7Ci0JCW5ld29iai0+dHlwZSA9IHN1LT50eXBlOwotCQluZXdvYmotPm9iaiA9IG9iajsKLQkJbmV3b2JqLT5vYmpfdHlwZSA9IG9ial90eXBlOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3b2JqOwotCX0KKyAgICBpZiAob2JqID09IE5VTEwgfHwgb2JqID09IFB5X05vbmUgfHwgc3UtPm9iaiAhPSBOVUxMKSB7CisgICAgICAgIC8qIE5vdCBiaW5kaW5nIHRvIGFuIG9iamVjdCwgb3IgYWxyZWFkeSBib3VuZCAqLworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKyAgICBpZiAoUHlfVFlQRShzdSkgIT0gJlB5U3VwZXJfVHlwZSkKKyAgICAgICAgLyogSWYgc3UgaXMgYW4gaW5zdGFuY2Ugb2YgYSAoc3RyaWN0KSBzdWJjbGFzcyBvZiBzdXBlciwKKyAgICAgICAgICAgY2FsbCBpdHMgdHlwZSAqLworICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygoUHlPYmplY3QgKilQeV9UWVBFKHN1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3UtPnR5cGUsIG9iaiwgTlVMTCk7CisgICAgZWxzZSB7CisgICAgICAgIC8qIElubGluZSB0aGUgY29tbW9uIGNhc2UgKi8KKyAgICAgICAgUHlUeXBlT2JqZWN0ICpvYmpfdHlwZSA9IHN1cGVyY2hlY2soc3UtPnR5cGUsIG9iaik7CisgICAgICAgIGlmIChvYmpfdHlwZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG5ld29iaiA9IChzdXBlcm9iamVjdCAqKVB5U3VwZXJfVHlwZS50cF9uZXcoJlB5U3VwZXJfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0lOQ1JFRihzdS0+dHlwZSk7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgICAgICBuZXdvYmotPnR5cGUgPSBzdS0+dHlwZTsKKyAgICAgICAgbmV3b2JqLT5vYmogPSBvYmo7CisgICAgICAgIG5ld29iai0+b2JqX3R5cGUgPSBvYmpfdHlwZTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld29iajsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIHN1cGVyX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOwotCVB5VHlwZU9iamVjdCAqdHlwZTsKLQlQeU9iamVjdCAqb2JqID0gTlVMTDsKLQlQeVR5cGVPYmplY3QgKm9ial90eXBlID0gTlVMTDsKKyAgICBzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOworICAgIFB5VHlwZU9iamVjdCAqdHlwZTsKKyAgICBQeU9iamVjdCAqb2JqID0gTlVMTDsKKyAgICBQeVR5cGVPYmplY3QgKm9ial90eXBlID0gTlVMTDsKIAotCWlmICghX1B5QXJnX05vS2V5d29yZHMoInN1cGVyIiwga3dkcykpCi0JCXJldHVybiAtMTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86c3VwZXIiLCAmUHlUeXBlX1R5cGUsICZ0eXBlLCAmb2JqKSkKLQkJcmV0dXJuIC0xOwotCWlmIChvYmogPT0gUHlfTm9uZSkKLQkJb2JqID0gTlVMTDsKLQlpZiAob2JqICE9IE5VTEwpIHsKLQkJb2JqX3R5cGUgPSBzdXBlcmNoZWNrKHR5cGUsIG9iaik7Ci0JCWlmIChvYmpfdHlwZSA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlQeV9JTkNSRUYob2JqKTsKLQl9Ci0JUHlfSU5DUkVGKHR5cGUpOwotCXN1LT50eXBlID0gdHlwZTsKLQlzdS0+b2JqID0gb2JqOwotCXN1LT5vYmpfdHlwZSA9IG9ial90eXBlOwotCXJldHVybiAwOworICAgIGlmICghX1B5QXJnX05vS2V5d29yZHMoInN1cGVyIiwga3dkcykpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86c3VwZXIiLCAmUHlUeXBlX1R5cGUsICZ0eXBlLCAmb2JqKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChvYmogPT0gUHlfTm9uZSkKKyAgICAgICAgb2JqID0gTlVMTDsKKyAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgb2JqX3R5cGUgPSBzdXBlcmNoZWNrKHR5cGUsIG9iaik7CisgICAgICAgIGlmIChvYmpfdHlwZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9JTkNSRUYob2JqKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKHR5cGUpOworICAgIHN1LT50eXBlID0gdHlwZTsKKyAgICBzdS0+b2JqID0gb2JqOworICAgIHN1LT5vYmpfdHlwZSA9IG9ial90eXBlOworICAgIHJldHVybiAwOwogfQogCiBQeURvY19TVFJWQVIoc3VwZXJfZG9jLApAQCAtNjY1Niw2MCArNjY1Niw2MCBAQAogIlR5cGljYWwgdXNlIHRvIGNhbGwgYSBjb29wZXJhdGl2ZSBzdXBlcmNsYXNzIG1ldGhvZDpcbiIKICJjbGFzcyBDKEIpOlxuIgogIiAgICBkZWYgbWV0aChzZWxmLCBhcmcpOlxuIgotIgkgc3VwZXIoQywgc2VsZikubWV0aChhcmcpIik7CisiICAgICAgICBzdXBlcihDLCBzZWxmKS5tZXRoKGFyZykiKTsKIAogc3RhdGljIGludAogc3VwZXJfdHJhdmVyc2UoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCXN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7CisgICAgc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKIAotCVB5X1ZJU0lUKHN1LT5vYmopOwotCVB5X1ZJU0lUKHN1LT50eXBlKTsKLQlQeV9WSVNJVChzdS0+b2JqX3R5cGUpOworICAgIFB5X1ZJU0lUKHN1LT5vYmopOworICAgIFB5X1ZJU0lUKHN1LT50eXBlKTsKKyAgICBQeV9WSVNJVChzdS0+b2JqX3R5cGUpOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5VHlwZU9iamVjdCBQeVN1cGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkic3VwZXIiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHN1cGVyb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0Jc3VwZXJfZGVhbGxvYywJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCXN1cGVyX3JlcHIsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCXN1cGVyX2dldGF0dHJvLAkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkJLyogdHBfZmxhZ3MgKi8KLQlzdXBlcl9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCXN1cGVyX3RyYXZlcnNlLAkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlzdXBlcl9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQlzdXBlcl9kZXNjcl9nZXQsCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0Jc3VwZXJfaW5pdCwJCQkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkJLyogdHBfYWxsb2MgKi8KLQlQeVR5cGVfR2VuZXJpY05ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInN1cGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHN1cGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIHN1cGVyX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICBzdXBlcl9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIHN1cGVyX2dldGF0dHJvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBzdXBlcl9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIHN1cGVyX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgc3VwZXJfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICBzdXBlcl9kZXNjcl9nZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgc3VwZXJfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwppbmRleCAxYTk5OGI2Li4wZTQ2ZDkyIDEwMDY0NAotLS0gYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYworKysgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwpAQCAtNTcsOSArNTcsOSBAQAogICAgICAgICAgICAgUHlXZWFrcmVmX0dFVF9PQkpFQ1Qoc2VsZikpOwogCiAgICAgICAgIGlmICgqbGlzdCA9PSBzZWxmKQotCSAgICAvKiBJZiAnc2VsZicgaXMgdGhlIGVuZCBvZiB0aGUgbGlzdCAoYW5kIHRodXMgc2VsZi0+d3JfbmV4dCA9PSBOVUxMKQotCSAgICAgICB0aGVuIHRoZSB3ZWFrcmVmIGxpc3QgaXRzZWxmIChhbmQgdGh1cyB0aGUgdmFsdWUgb2YgKmxpc3QpIHdpbGwKLQkgICAgICAgZW5kIHVwIGJlaW5nIHNldCB0byBOVUxMLiAqLworICAgICAgICAgICAgLyogSWYgJ3NlbGYnIGlzIHRoZSBlbmQgb2YgdGhlIGxpc3QgKGFuZCB0aHVzIHNlbGYtPndyX25leHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgIHRoZW4gdGhlIHdlYWtyZWYgbGlzdCBpdHNlbGYgKGFuZCB0aHVzIHRoZSB2YWx1ZSBvZiAqbGlzdCkgd2lsbAorICAgICAgICAgICAgICAgZW5kIHVwIGJlaW5nIHNldCB0byBOVUxMLiAqLwogICAgICAgICAgICAgKmxpc3QgPSBzZWxmLT53cl9uZXh0OwogICAgICAgICBzZWxmLT53cl9vYmplY3QgPSBQeV9Ob25lOwogICAgICAgICBpZiAoc2VsZi0+d3JfcHJldiAhPSBOVUxMKQpAQCAtMTYxLDIxICsxNjEsMjEgQEAKICAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiPHdlYWtyZWYgYXQgJXA7IGRlYWQ+Iiwgc2VsZik7CiAgICAgfQogICAgIGVsc2UgewotCWNoYXIgKm5hbWUgPSBOVUxMOwotCVB5T2JqZWN0ICpuYW1lb2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSwKLQkJCQkJCSAgICJfX25hbWVfXyIpOwotCWlmIChuYW1lb2JqID09IE5VTEwpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sobmFtZW9iaikpCi0JCW5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZW9iaik7CisgICAgICAgIGNoYXIgKm5hbWUgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqbmFtZW9iaiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoUHlXZWFrcmVmX0dFVF9PQkpFQ1Qoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19uYW1lX18iKTsKKyAgICAgICAgaWYgKG5hbWVvYmogPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhuYW1lb2JqKSkKKyAgICAgICAgICAgICAgICBuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWVvYmopOwogICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCSAgICAgIG5hbWUgPyAiPHdlYWtyZWYgYXQgJXA7IHRvICclLjUwcycgYXQgJXAgKCVzKT4iCi0JCSAgICAgICAgICAgOiAiPHdlYWtyZWYgYXQgJXA7IHRvICclLjUwcycgYXQgJXA+IiwKLQkJICAgICAgc2VsZiwKLQkJICAgICAgUHlfVFlQRShQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSktPnRwX25hbWUsCi0JCSAgICAgIFB5V2Vha3JlZl9HRVRfT0JKRUNUKHNlbGYpLAotCQkgICAgICBuYW1lKTsKLQlQeV9YREVDUkVGKG5hbWVvYmopOworICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPyAiPHdlYWtyZWYgYXQgJXA7IHRvICclLjUwcycgYXQgJXAgKCVzKT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI8d2Vha3JlZiBhdCAlcDsgdG8gJyUuNTBzJyBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgUHlXZWFrcmVmX0dFVF9PQkpFQ1Qoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIFB5X1hERUNSRUYobmFtZW9iaik7CiAgICAgfQogICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CiB9CkBAIC0zMzcsMTAgKzMzNywxMCBAQAogICAgIHNpemVvZihQeVdlYWtSZWZlcmVuY2UpLAogICAgIDAsCiAgICAgd2Vha3JlZl9kZWFsbG9jLCAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCi0gICAgMCwJICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwotICAgIDAsCSAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCiAgICAgKHJlcHJmdW5jKXdlYWtyZWZfcmVwciwgICAgIC8qdHBfcmVwciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCkBAIC0zNTYsNyArMzU2LDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgICh0cmF2ZXJzZXByb2MpZ2NfdHJhdmVyc2UsICAvKnRwX3RyYXZlcnNlKi8KICAgICAoaW5xdWlyeSlnY19jbGVhciwgICAgICAgICAgLyp0cF9jbGVhciovCi0gICAgKHJpY2hjbXBmdW5jKXdlYWtyZWZfcmljaGNvbXBhcmUsCS8qdHBfcmljaGNvbXBhcmUqLworICAgIChyaWNoY21wZnVuYyl3ZWFrcmVmX3JpY2hjb21wYXJlLCAgIC8qdHBfcmljaGNvbXBhcmUqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCkBAIC00MzYsOSArNDM2LDkgQEAKICNkZWZpbmUgV1JBUF9NRVRIT0QobWV0aG9kLCBzcGVjaWFsKSBcCiAgICAgc3RhdGljIFB5T2JqZWN0ICogXAogICAgIG1ldGhvZChQeU9iamVjdCAqcHJveHkpIHsgXAotCSAgICBVTldSQVAocHJveHkpOyBcCi0JCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHByb3h5LCBzcGVjaWFsLCAiIik7IFwKLQl9CisgICAgICAgICAgICBVTldSQVAocHJveHkpOyBcCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHJveHksIHNwZWNpYWwsICIiKTsgXAorICAgICAgICB9CiAKIAogLyogZGlyZWN0IHNsb3RzICovCkBAIC00NTIsOSArNDUyLDkgQEAKIHsKICAgICBjaGFyIGJ1ZlsxNjBdOwogICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJICAiPHdlYWtwcm94eSBhdCAlcCB0byAlLjEwMHMgYXQgJXA+IiwgcHJveHksCi0JCSAgUHlfVFlQRShQeVdlYWtyZWZfR0VUX09CSkVDVChwcm94eSkpLT50cF9uYW1lLAotCQkgIFB5V2Vha3JlZl9HRVRfT0JKRUNUKHByb3h5KSk7CisgICAgICAgICAgICAgICAgICAiPHdlYWtwcm94eSBhdCAlcCB0byAlLjEwMHMgYXQgJXA+IiwgcHJveHksCisgICAgICAgICAgICAgICAgICBQeV9UWVBFKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHByb3h5KSktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICBQeVdlYWtyZWZfR0VUX09CSkVDVChwcm94eSkpOwogICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKQEAgLTYwNCw4ICs2MDQsOCBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBwcm94eV9tZXRob2RzW10gPSB7Ci0JeyJfX3VuaWNvZGVfXyIsIChQeUNGdW5jdGlvbilwcm94eV91bmljb2RlLCBNRVRIX05PQVJHU30sCi0Je05VTEwsIE5VTEx9CisgICAgICAgIHsiX191bmljb2RlX18iLCAoUHlDRnVuY3Rpb24pcHJveHlfdW5pY29kZSwgTUVUSF9OT0FSR1N9LAorICAgICAgICB7TlVMTCwgTlVMTH0KIH07CiAKIApAQCAtNjc3LDIwICs2NzcsMjAgQEAKICAgICAwLAogICAgIC8qIG1ldGhvZHMgKi8KICAgICAoZGVzdHJ1Y3Rvcilwcm94eV9kZWFsbG9jLCAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCi0gICAgMCwJCQkJICAgICAgICAvKiB0cF9wcmludCAqLwotICAgIDAsCQkJCSAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotICAgIDAsIAkJCQkgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KLSAgICBwcm94eV9jb21wYXJlLAkJICAgICAgICAvKiB0cF9jb21wYXJlICovCi0gICAgKHJlcHJmdW5jKXByb3h5X3JlcHIsCSAgICAgICAgLyogdHBfcmVwciAqLwotICAgICZwcm94eV9hc19udW1iZXIsCQkgICAgICAgIC8qIHRwX2FzX251bWJlciAqLwotICAgICZwcm94eV9hc19zZXF1ZW5jZSwJCSAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLSAgICAmcHJveHlfYXNfbWFwcGluZywJCSAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotICAgIDAsCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwotICAgIDAsCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICBwcm94eV9jb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXByb3h5X3JlcHIsICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZwcm94eV9hc19udW1iZXIsICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZwcm94eV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJnByb3h5X2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCiAgICAgcHJveHlfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCiAgICAgcHJveHlfZ2V0YXR0ciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAoc2V0YXR0cm9mdW5jKXByb3h5X3NldGF0dHIsICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsCQkJCSAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCiAgICAgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KQEAgLTcwMCw3ICs3MDAsNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgKGdldGl0ZXJmdW5jKXByb3h5X2l0ZXIsICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIChpdGVybmV4dGZ1bmMpcHJveHlfaXRlcm5leHQsICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0JcHJveHlfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgICBwcm94eV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiB9OwogCiAKQEAgLTcxMiwyMCArNzEyLDIwIEBACiAgICAgMCwKICAgICAvKiBtZXRob2RzICovCiAgICAgKGRlc3RydWN0b3IpcHJveHlfZGVhbGxvYywgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLwotICAgIDAsCQkJCSAgICAgICAgLyogdHBfcHJpbnQgKi8KLSAgICAwLAkJCQkgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KLSAgICAwLCAJCQkJICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0gICAgcHJveHlfY29tcGFyZSwJCSAgICAgICAgLyogdHBfY29tcGFyZSAqLwotICAgICh1bmFyeWZ1bmMpcHJveHlfcmVwciwJICAgICAgICAvKiB0cF9yZXByICovCi0gICAgJnByb3h5X2FzX251bWJlciwJCSAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCi0gICAgJnByb3h5X2FzX3NlcXVlbmNlLAkJICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgICZwcm94eV9hc19tYXBwaW5nLAkJICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCi0gICAgMCwJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0gICAgcHJveHlfY2FsbCwJICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwotICAgIHByb3h5X3N0ciwJICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIHByb3h5X2NvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAodW5hcnlmdW5jKXByb3h5X3JlcHIsICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJnByb3h5X2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJnByb3h5X2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmcHJveHlfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIHByb3h5X2NhbGwsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICBwcm94eV9zdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KICAgICBwcm94eV9nZXRhdHRyLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIChzZXRhdHRyb2Z1bmMpcHJveHlfc2V0YXR0ciwgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0gICAgMCwJCQkJICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKICAgICB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUywgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwpAQCAtNzQ4LDcgKzc0OCw3IEBACiAKICAgICBpZiAoIVB5VHlwZV9TVVBQT1JUU19XRUFLUkVGUyhQeV9UWVBFKG9iKSkpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiY2Fubm90IGNyZWF0ZSB3ZWFrIHJlZmVyZW5jZSB0byAnJXMnIG9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNyZWF0ZSB3ZWFrIHJlZmVyZW5jZSB0byAnJXMnIG9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTgwNyw3ICs4MDcsNyBAQAogCiAgICAgaWYgKCFQeVR5cGVfU1VQUE9SVFNfV0VBS1JFRlMoUHlfVFlQRShvYikpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgImNhbm5vdCBjcmVhdGUgd2VhayByZWZlcmVuY2UgdG8gJyVzJyBvYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjcmVhdGUgd2VhayByZWZlcmVuY2UgdG8gJyVzJyBvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYiktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC05MzIsNyArOTMyLDcgQEAKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdHVwbGU7CiAgICAgICAgICAgICBQeV9zc2l6ZV90IGkgPSAwOwotICAgIAorCiAgICAgICAgICAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KGNvdW50ICogMik7CiAgICAgICAgICAgICBpZiAodHVwbGUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmIChyZXN0b3JlX2Vycm9yKQpkaWZmIC0tZ2l0IGEvUEMvVlM3LjEvbWFrZV9idWlsZGluZm8uYyBiL1BDL1ZTNy4xL21ha2VfYnVpbGRpbmZvLmMKaW5kZXggMjc1ODBiYi4uMmFhMmI2NiAxMDA2NDQKLS0tIGEvUEMvVlM3LjEvbWFrZV9idWlsZGluZm8uYworKysgYi9QQy9WUzcuMS9tYWtlX2J1aWxkaW5mby5jCkBAIC0yMSw3MiArMjEsNzIgQEAKIAogaW50IG1ha2VfYnVpbGRpbmZvMigpCiB7Ci0Jc3RydWN0IF9zdGF0IHN0OwotCUhLRVkgaFRvcnRvaXNlOwotCWNoYXIgY29tbWFuZFs1MDBdOwotCURXT1JEIHR5cGUsIHNpemU7Ci0JaWYgKF9zdGF0KCIuc3ZuIiwgJnN0KSA8IDApCi0JCXJldHVybiAwOwotCS8qIEFsbG93IHN1cHByZXNzaW9uIG9mIHN1YndjcmV2LmV4ZSBpbnZvY2F0aW9uIGlmIGEgbm9fc3Vid2NyZXYgZmlsZSBpcyBwcmVzZW50LiAqLwotCWlmIChfc3RhdCgibm9fc3Vid2NyZXYiLCAmc3QpID09IDApCi0JCXJldHVybiAwOwotCWlmIChSZWdPcGVuS2V5KEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MgJiYKLQkgICAgUmVnT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MpCi0JCS8qIFRvcnRvaXNlIG5vdCBpbnN0YWxsZWQgKi8KLQkJcmV0dXJuIDA7Ci0JY29tbWFuZFswXSA9ICciJzsgIC8qIHF1b3RlIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlICovCi0Jc2l6ZSA9IHNpemVvZihjb21tYW5kKSAtIDE7Ci0JaWYgKFJlZ1F1ZXJ5VmFsdWVFeChoVG9ydG9pc2UsICJEaXJlY3RvcnkiLCAwLCAmdHlwZSwgY29tbWFuZCsxLCAmc2l6ZSkgIT0gRVJST1JfU1VDQ0VTUyB8fAotCSAgICB0eXBlICE9IFJFR19TWikKLQkJLyogUmVnaXN0cnkgY29ycnVwdGVkICovCi0JCXJldHVybiAwOwotCXN0cmNhdChjb21tYW5kLCAiYmluXFxzdWJ3Y3Jldi5leGUiKTsKLQlpZiAoX3N0YXQoY29tbWFuZCsxLCAmc3QpIDwgMCkKLQkJLyogc3Vid2NyZXYuZXhlIG5vdCBwYXJ0IG9mIHRoZSByZWxlYXNlICovCi0JCXJldHVybiAwOwotCXN0cmNhdChjb21tYW5kLCAiXCIgLi5cXC4uIC4uXFwuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMgZ2V0YnVpbGRpbmZvMi5jIik7Ci0JcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7Ci0JaWYgKHN5c3RlbShjb21tYW5kKSA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgIHN0cnVjdCBfc3RhdCBzdDsKKyAgICBIS0VZIGhUb3J0b2lzZTsKKyAgICBjaGFyIGNvbW1hbmRbNTAwXTsKKyAgICBEV09SRCB0eXBlLCBzaXplOworICAgIGlmIChfc3RhdCgiLnN2biIsICZzdCkgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvKiBBbGxvdyBzdXBwcmVzc2lvbiBvZiBzdWJ3Y3Jldi5leGUgaW52b2NhdGlvbiBpZiBhIG5vX3N1YndjcmV2IGZpbGUgaXMgcHJlc2VudC4gKi8KKyAgICBpZiAoX3N0YXQoIm5vX3N1YndjcmV2IiwgJnN0KSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUmVnT3BlbktleShIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTICYmCisgICAgICAgIFJlZ09wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICAvKiBUb3J0b2lzZSBub3QgaW5zdGFsbGVkICovCisgICAgICAgIHJldHVybiAwOworICAgIGNvbW1hbmRbMF0gPSAnIic7ICAvKiBxdW90ZSB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSAqLworICAgIHNpemUgPSBzaXplb2YoY29tbWFuZCkgLSAxOworICAgIGlmIChSZWdRdWVyeVZhbHVlRXgoaFRvcnRvaXNlLCAiRGlyZWN0b3J5IiwgMCwgJnR5cGUsIGNvbW1hbmQrMSwgJnNpemUpICE9IEVSUk9SX1NVQ0NFU1MgfHwKKyAgICAgICAgdHlwZSAhPSBSRUdfU1opCisgICAgICAgIC8qIFJlZ2lzdHJ5IGNvcnJ1cHRlZCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICBzdHJjYXQoY29tbWFuZCwgImJpblxcc3Vid2NyZXYuZXhlIik7CisgICAgaWYgKF9zdGF0KGNvbW1hbmQrMSwgJnN0KSA8IDApCisgICAgICAgIC8qIHN1YndjcmV2LmV4ZSBub3QgcGFydCBvZiB0aGUgcmVsZWFzZSAqLworICAgICAgICByZXR1cm4gMDsKKyAgICBzdHJjYXQoY29tbWFuZCwgIlwiIC4uXFwuLiAuLlxcLi5cXE1vZHVsZXNcXGdldGJ1aWxkaW5mby5jIGdldGJ1aWxkaW5mbzIuYyIpOworICAgIHB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOworICAgIGlmIChzeXN0ZW0oY29tbWFuZCkgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqYXJndltdKQogewotCWNoYXIgY29tbWFuZFs1MDBdID0gImNsLmV4ZSAtYyAtRF9XSU4zMiAtRFVTRV9ETF9FWFBPUlQgLURfV0lORE9XUyAtRFdJTjMyIC1EX1dJTkRMTCAiOwotCWludCBkb191bmxpbmssIHJlc3VsdDsKLQlpZiAoYXJnYyAhPSAyKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAibWFrZV9idWlsZGluZm8gJChDb25maWd1cmF0aW9uTmFtZSlcbiIpOwotCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwotCX0KLQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlIikgPT0gMCkgewotCQlzdHJjYXQoY29tbWFuZCwgIi1NRCAiKTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJEZWJ1ZyIpID09IDApIHsKLQkJc3RyY2F0KGNvbW1hbmQsICItRF9ERUJVRyAtTURkICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VJdGFuaXVtIikgPT0gMCkgewotCQlzdHJjYXQoY29tbWFuZCwgIi1NRCAvVVNFQ0w6TVNfSVRBTklVTSAiKTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlQU1ENjQiKSA9PSAwKSB7Ci0JCXN0cmNhdChjb21tYW5kLCAiLU1EICIpOwotCQlzdHJjYXQoY29tbWFuZCwgIi1NRCAvVVNFQ0w6TVNfT1BURVJPTiAiKTsKLQl9Ci0JZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAidW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbiAlc1xuIiwgYXJndlsxXSk7Ci0JCXJldHVybiBFWElUX0ZBSUxVUkU7Ci0JfQorICAgIGNoYXIgY29tbWFuZFs1MDBdID0gImNsLmV4ZSAtYyAtRF9XSU4zMiAtRFVTRV9ETF9FWFBPUlQgLURfV0lORE9XUyAtRFdJTjMyIC1EX1dJTkRMTCAiOworICAgIGludCBkb191bmxpbmssIHJlc3VsdDsKKyAgICBpZiAoYXJnYyAhPSAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZV9idWlsZGluZm8gJChDb25maWd1cmF0aW9uTmFtZSlcbiIpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlIikgPT0gMCkgeworICAgICAgICBzdHJjYXQoY29tbWFuZCwgIi1NRCAiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJEZWJ1ZyIpID09IDApIHsKKyAgICAgICAgc3RyY2F0KGNvbW1hbmQsICItRF9ERUJVRyAtTURkICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VJdGFuaXVtIikgPT0gMCkgeworICAgICAgICBzdHJjYXQoY29tbWFuZCwgIi1NRCAvVVNFQ0w6TVNfSVRBTklVTSAiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlQU1ENjQiKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdChjb21tYW5kLCAiLU1EICIpOworICAgICAgICBzdHJjYXQoY29tbWFuZCwgIi1NRCAvVVNFQ0w6TVNfT1BURVJPTiAiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbiAlc1xuIiwgYXJndlsxXSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQogCi0JaWYgKChkb191bmxpbmsgPSBtYWtlX2J1aWxkaW5mbzIoKSkpCi0JCXN0cmNhdChjb21tYW5kLCAiZ2V0YnVpbGRpbmZvMi5jIC1EU1VCV0NSRVYgIik7Ci0JZWxzZQotCQlzdHJjYXQoY29tbWFuZCwgIi4uXFwuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMiKTsKLQlzdHJjYXQoY29tbWFuZCwgIiAtRm9nZXRidWlsZGluZm8ubyAtSS4uXFwuLlxcSW5jbHVkZSAtSS4uXFwuLlxcUEMiKTsKLQlwdXRzKGNvbW1hbmQpOyBmZmx1c2goc3Rkb3V0KTsKLQlyZXN1bHQgPSBzeXN0ZW0oY29tbWFuZCk7Ci0JaWYgKGRvX3VubGluaykKLQkJdW5saW5rKCJnZXRidWlsZGluZm8yLmMiKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoKGRvX3VubGluayA9IG1ha2VfYnVpbGRpbmZvMigpKSkKKyAgICAgICAgc3RyY2F0KGNvbW1hbmQsICJnZXRidWlsZGluZm8yLmMgLURTVUJXQ1JFViAiKTsKKyAgICBlbHNlCisgICAgICAgIHN0cmNhdChjb21tYW5kLCAiLi5cXC4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyIpOworICAgIHN0cmNhdChjb21tYW5kLCAiIC1Gb2dldGJ1aWxkaW5mby5vIC1JLi5cXC4uXFxJbmNsdWRlIC1JLi5cXC4uXFxQQyIpOworICAgIHB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOworICAgIHJlc3VsdCA9IHN5c3RlbShjb21tYW5kKTsKKyAgICBpZiAoZG9fdW5saW5rKQorICAgICAgICB1bmxpbmsoImdldGJ1aWxkaW5mbzIuYyIpOworICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvUEMvVlM4LjAvbWFrZV9idWlsZGluZm8uYyBiL1BDL1ZTOC4wL21ha2VfYnVpbGRpbmZvLmMKaW5kZXggMTMzY2ZlZS4uOGNjM2RhMiAxMDA2NDQKLS0tIGEvUEMvVlM4LjAvbWFrZV9idWlsZGluZm8uYworKysgYi9QQy9WUzguMC9tYWtlX2J1aWxkaW5mby5jCkBAIC0yMyw3MiArMjMsNzIgQEAKIAogaW50IG1ha2VfYnVpbGRpbmZvMigpCiB7Ci0Jc3RydWN0IF9zdGF0IHN0OwotCUhLRVkgaFRvcnRvaXNlOwotCWNoYXIgY29tbWFuZFtDTURfU0laRSsxXTsKLQlEV09SRCB0eXBlLCBzaXplOwotCWlmIChfc3RhdCgiLnN2biIsICZzdCkgPCAwKQotCQlyZXR1cm4gMDsKLQkvKiBBbGxvdyBzdXBwcmVzc2lvbiBvZiBzdWJ3Y3Jldi5leGUgaW52b2NhdGlvbiBpZiBhIG5vX3N1YndjcmV2IGZpbGUgaXMgcHJlc2VudC4gKi8KLQlpZiAoX3N0YXQoIm5vX3N1YndjcmV2IiwgJnN0KSA9PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoUmVnT3BlbktleShIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTICYmCi0JICAgIFJlZ09wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTKQotCQkvKiBUb3J0b2lzZSBub3QgaW5zdGFsbGVkICovCi0JCXJldHVybiAwOwotCWNvbW1hbmRbMF0gPSAnIic7ICAvKiBxdW90ZSB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSAqLwotCXNpemUgPSBzaXplb2YoY29tbWFuZCkgLSAxOwotCWlmIChSZWdRdWVyeVZhbHVlRXgoaFRvcnRvaXNlLCAiRGlyZWN0b3J5IiwgMCwgJnR5cGUsIGNvbW1hbmQrMSwgJnNpemUpICE9IEVSUk9SX1NVQ0NFU1MgfHwKLQkgICAgdHlwZSAhPSBSRUdfU1opCi0JCS8qIFJlZ2lzdHJ5IGNvcnJ1cHRlZCAqLwotCQlyZXR1cm4gMDsKLQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgImJpblxcc3Vid2NyZXYuZXhlIik7Ci0JaWYgKF9zdGF0KGNvbW1hbmQrMSwgJnN0KSA8IDApCi0JCS8qIHN1YndjcmV2LmV4ZSBub3QgcGFydCBvZiB0aGUgcmVsZWFzZSAqLwotCQlyZXR1cm4gMDsKLQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIlwiIC4uXFwuLiAuLlxcLi5cXE1vZHVsZXNcXGdldGJ1aWxkaW5mby5jIGdldGJ1aWxkaW5mbzIuYyIpOwotCXB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOwotCWlmIChzeXN0ZW0oY29tbWFuZCkgPCAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICBzdHJ1Y3QgX3N0YXQgc3Q7CisgICAgSEtFWSBoVG9ydG9pc2U7CisgICAgY2hhciBjb21tYW5kW0NNRF9TSVpFKzFdOworICAgIERXT1JEIHR5cGUsIHNpemU7CisgICAgaWYgKF9zdGF0KCIuc3ZuIiwgJnN0KSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIC8qIEFsbG93IHN1cHByZXNzaW9uIG9mIHN1YndjcmV2LmV4ZSBpbnZvY2F0aW9uIGlmIGEgbm9fc3Vid2NyZXYgZmlsZSBpcyBwcmVzZW50LiAqLworICAgIGlmIChfc3RhdCgibm9fc3Vid2NyZXYiLCAmc3QpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChSZWdPcGVuS2V5KEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MgJiYKKyAgICAgICAgUmVnT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIC8qIFRvcnRvaXNlIG5vdCBpbnN0YWxsZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgY29tbWFuZFswXSA9ICciJzsgIC8qIHF1b3RlIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlICovCisgICAgc2l6ZSA9IHNpemVvZihjb21tYW5kKSAtIDE7CisgICAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeChoVG9ydG9pc2UsICJEaXJlY3RvcnkiLCAwLCAmdHlwZSwgY29tbWFuZCsxLCAmc2l6ZSkgIT0gRVJST1JfU1VDQ0VTUyB8fAorICAgICAgICB0eXBlICE9IFJFR19TWikKKyAgICAgICAgLyogUmVnaXN0cnkgY29ycnVwdGVkICovCisgICAgICAgIHJldHVybiAwOworICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiYmluXFxzdWJ3Y3Jldi5leGUiKTsKKyAgICBpZiAoX3N0YXQoY29tbWFuZCsxLCAmc3QpIDwgMCkKKyAgICAgICAgLyogc3Vid2NyZXYuZXhlIG5vdCBwYXJ0IG9mIHRoZSByZWxlYXNlICovCisgICAgICAgIHJldHVybiAwOworICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiXCIgLi5cXC4uIC4uXFwuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMgZ2V0YnVpbGRpbmZvMi5jIik7CisgICAgcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKHN5c3RlbShjb21tYW5kKSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciphcmd2W10pCiB7Ci0JY2hhciBjb21tYW5kWzUwMF0gPSAiY2wuZXhlIC1jIC1EX1dJTjMyIC1EVVNFX0RMX0VYUE9SVCAtRF9XSU5ET1dTIC1EV0lOMzIgLURfV0lORExMICI7Ci0JaW50IGRvX3VubGluaywgcmVzdWx0OwotCWlmIChhcmdjICE9IDIpIHsKLQkJZnByaW50ZihzdGRlcnIsICJtYWtlX2J1aWxkaW5mbyAkKENvbmZpZ3VyYXRpb25OYW1lKVxuIik7Ci0JCXJldHVybiBFWElUX0ZBSUxVUkU7Ci0JfQotCWlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2UiKSA9PSAwKSB7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIkRlYnVnIikgPT0gMCkgewotCQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1EX0RFQlVHIC1NRGQgIik7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUl0YW5pdW0iKSA9PSAwKSB7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19JVEFOSVVNICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VBTUQ2NCIpID09IDApIHsKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19PUFRFUk9OICIpOwotCX0KLQllbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uICVzXG4iLCBhcmd2WzFdKTsKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQl9CisgICAgY2hhciBjb21tYW5kWzUwMF0gPSAiY2wuZXhlIC1jIC1EX1dJTjMyIC1EVVNFX0RMX0VYUE9SVCAtRF9XSU5ET1dTIC1EV0lOMzIgLURfV0lORExMICI7CisgICAgaW50IGRvX3VubGluaywgcmVzdWx0OworICAgIGlmIChhcmdjICE9IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlX2J1aWxkaW5mbyAkKENvbmZpZ3VyYXRpb25OYW1lKVxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2UiKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIkRlYnVnIikgPT0gMCkgeworICAgICAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1EX0RFQlVHIC1NRGQgIik7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUl0YW5pdW0iKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19JVEFOSVVNICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VBTUQ2NCIpID09IDApIHsKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19PUFRFUk9OICIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uICVzXG4iLCBhcmd2WzFdKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CiAKLQlpZiAoKGRvX3VubGluayA9IG1ha2VfYnVpbGRpbmZvMigpKSkKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJnZXRidWlsZGluZm8yLmMgLURTVUJXQ1JFViAiKTsKLQllbHNlCi0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLi5cXC4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyIpOwotCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiIC1Gb2dldGJ1aWxkaW5mby5vIC1JLi5cXC4uXFxJbmNsdWRlIC1JLi5cXC4uXFxQQyIpOwotCXB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOwotCXJlc3VsdCA9IHN5c3RlbShjb21tYW5kKTsKLQlpZiAoZG9fdW5saW5rKQotCQlfdW5saW5rKCJnZXRidWlsZGluZm8yLmMiKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQlyZXR1cm4gMDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgaWYgKChkb191bmxpbmsgPSBtYWtlX2J1aWxkaW5mbzIoKSkpCisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiZ2V0YnVpbGRpbmZvMi5jIC1EU1VCV0NSRVYgIik7CisgICAgZWxzZQorICAgICAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi4uXFwuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMiKTsKKyAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIiAtRm9nZXRidWlsZGluZm8ubyAtSS4uXFwuLlxcSW5jbHVkZSAtSS4uXFwuLlxcUEMiKTsKKyAgICBwdXRzKGNvbW1hbmQpOyBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXN1bHQgPSBzeXN0ZW0oY29tbWFuZCk7CisgICAgaWYgKGRvX3VubGluaykKKyAgICAgICAgX3VubGluaygiZ2V0YnVpbGRpbmZvMi5jIik7CisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9QQy9fbXNpLmMgYi9QQy9fbXNpLmMKaW5kZXggNThiMjUzMC4uNTkxZmM0YSAxMDA2NDQKLS0tIGEvUEMvX21zaS5jCisrKyBiL1BDL19tc2kuYwpAQCAtMjAsMTkgKzIwLDE5IEBACiAgICAgVVVJRCByZXN1bHQ7CiAgICAgY2hhciAqY3Jlc3VsdDsKICAgICBQeU9iamVjdCAqb3Jlc3VsdDsKLSAgICAKKwogICAgIC8qIE1heSByZXR1cm4gb2ssIGxvY2FsIG9ubHksIGFuZCBubyBhZGRyZXNzLgogICAgICAgIEZvciBsb2NhbCBvbmx5LCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIHdlIHN0aWxsIGdldCBhIHV1aWQuCiAgICAgICAgRm9yIFJQQ19TX1VVSURfTk9fQUREUkVTUywgaXQncyBub3QgY2xlYXIgd2hldGhlciB3ZSBjYW4KICAgICAgICB1c2UgdGhlIHJlc3VsdC4gKi8KICAgICBpZiAoVXVpZENyZWF0ZSgmcmVzdWx0KSA9PSBSUENfU19VVUlEX05PX0FERFJFU1MpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgInByb2Nlc3NpbmcgJ25vIGFkZHJlc3MnIHJlc3VsdCIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAicHJvY2Vzc2luZyAnbm8gYWRkcmVzcycgcmVzdWx0Iik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgaWYgKFV1aWRUb1N0cmluZygmcmVzdWx0LCAmY3Jlc3VsdCkgPT0gUlBDX1NfT1VUX09GX01FTU9SWSkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgIm91dCBvZiBtZW1vcnkgaW4gdXVpZGdlbiIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgIm91dCBvZiBtZW1vcnkgaW4gdXVpZGdlbiIpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIG9yZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGNyZXN1bHQpOwpAQCAtNTcsNyArNTcsNyBAQAogewogICAgIGludCByZXN1bHQgPSBfb3Blbihwc3pGaWxlLCBvZmxhZywgcG1vZGUpOwogICAgIGlmIChyZXN1bHQgPT0gLTEpCi0JKmVyciA9IGVycm5vOworICAgICplcnIgPSBlcnJubzsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC02NSw3ICs2NSw3IEBACiB7CiAgICAgVUlOVCByZXN1bHQgPSAoVUlOVClfcmVhZChoZiwgbWVtb3J5LCBjYik7CiAgICAgaWYgKHJlc3VsdCAhPSBjYikKLQkqZXJyID0gZXJybm87CisgICAgKmVyciA9IGVycm5vOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTczLDcgKzczLDcgQEAKIHsKICAgICBVSU5UIHJlc3VsdCA9IChVSU5UKV93cml0ZShoZiwgbWVtb3J5LCBjYik7CiAgICAgaWYgKHJlc3VsdCAhPSBjYikKLQkqZXJyID0gZXJybm87CisgICAgKmVyciA9IGVycm5vOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTgxLDcgKzgxLDcgQEAKIHsKICAgICBpbnQgcmVzdWx0ID0gX2Nsb3NlKGhmKTsKICAgICBpZiAocmVzdWx0ICE9IDApCi0JKmVyciA9IGVycm5vOworICAgICplcnIgPSBlcnJubzsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC04OSw3ICs4OSw3IEBACiB7CiAgICAgbG9uZyByZXN1bHQgPSAobG9uZylfbHNlZWsoaGYsIGRpc3QsIHNlZWt0eXBlKTsKICAgICBpZiAocmVzdWx0ID09IC0xKQotCSplcnIgPSBlcnJubzsKKyAgICAqZXJyID0gZXJybm87CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtOTcsNyArOTcsNyBAQAogewogICAgIGludCByZXN1bHQgPSByZW1vdmUocHN6RmlsZSk7CiAgICAgaWYgKHJlc3VsdCAhPSAwKQotCSplcnIgPSBlcnJubzsKKyAgICAqZXJyID0gZXJybm87CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTEwLDkgKzExMCw5IEBACiB7CiAgICAgY2hhciAqbmFtZSA9IF90ZW1wbmFtKCIiLCAidG1wIik7CiAgICAgaWYgKChuYW1lICE9IE5VTEwpICYmICgoaW50KXN0cmxlbihuYW1lKSA8IGNiVGVtcE5hbWUpKSB7Ci0Jc3RyY3B5KHBzelRlbXBOYW1lLCBuYW1lKTsKLQlmcmVlKG5hbWUpOwotCXJldHVybiBUUlVFOworICAgIHN0cmNweShwc3pUZW1wTmFtZSwgbmFtZSk7CisgICAgZnJlZShuYW1lKTsKKyAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKICAgICBpZiAobmFtZSkgZnJlZShuYW1lKTsKQEAgLTEyMiwxMCArMTIyLDEwIEBACiBzdGF0aWMgRk5GQ0lTVEFUVVMoY2Jfc3RhdHVzKQogewogICAgIGlmIChwdikgewotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHB2LCAic3RhdHVzIiwgImlpaSIsIHR5cGVTdGF0dXMsIGNiMSwgY2IyKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JICAgIHJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChwdiwgInN0YXR1cyIsICJpaWkiLCB0eXBlU3RhdHVzLCBjYjEsIGNiMik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMTMzLDE4ICsxMzMsMTggQEAKIHN0YXRpYyBGTkZDSUdFVE5FWFRDQUJJTkVUKGNiX2dldG5leHRjYWJpbmV0KQogewogICAgIGlmIChwdikgewotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHB2LCAiZ2V0bmV4dGNhYmluZXQiLCAiaSIsIHBjY2FiLT5pQ2FiKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JICAgIHJldHVybiAtMTsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKHJlc3VsdCkpIHsKLQkgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCi0JCSJJbmNvcnJlY3QgcmV0dXJuIHR5cGUgJXMgZnJvbSBnZXRuZXh0Y2FiaW5ldCIsCi0JCXJlc3VsdC0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotCSAgICByZXR1cm4gRkFMU0U7Ci0JfQotCXN0cm5jcHkocGNjYWItPnN6Q2FiLCBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpLCBzaXplb2YocGNjYWItPnN6Q2FiKSk7Ci0JcmV0dXJuIFRSVUU7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocHYsICJnZXRuZXh0Y2FiaW5ldCIsICJpIiwgcGNjYWItPmlDYWIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAiSW5jb3JyZWN0IHJldHVybiB0eXBlICVzIGZyb20gZ2V0bmV4dGNhYmluZXQiLAorICAgICAgICByZXN1bHQtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBzdHJuY3B5KHBjY2FiLT5zekNhYiwgUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KSwgc2l6ZW9mKHBjY2FiLT5zekNhYikpOworICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICByZXR1cm4gRkFMU0U7CiB9CkBAIC0xNTcsMjEgKzE1NywyMSBAQAogCiAgICAgLyogTmVlZCBXaW4zMiBoYW5kbGUgdG8gZ2V0IHRpbWUgc3RhbXBzICovCiAgICAgaGFuZGxlID0gQ3JlYXRlRmlsZShwc3pOYW1lLCBHRU5FUklDX1JFQUQsIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKLQlPUEVOX0VYSVNUSU5HLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICAgIE9QRU5fRVhJU1RJTkcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CiAgICAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogCiAgICAgaWYgKEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGhhbmRsZSwgJmJoZmkpID09IEZBTFNFKQogICAgIHsKLQlDbG9zZUhhbmRsZShoYW5kbGUpOwotCXJldHVybiAtMTsKKyAgICBDbG9zZUhhbmRsZShoYW5kbGUpOworICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICBGaWxlVGltZVRvTG9jYWxGaWxlVGltZSgmYmhmaS5mdExhc3RXcml0ZVRpbWUsICZmaWxldGltZSk7CiAgICAgRmlsZVRpbWVUb0Rvc0RhdGVUaW1lKCZmaWxldGltZSwgcGRhdGUsIHB0aW1lKTsKIAotICAgICpwYXR0cmlicyA9IChpbnQpKGJoZmkuZHdGaWxlQXR0cmlidXRlcyAmIAotCShfQV9SRE9OTFkgfCBfQV9TWVNURU0gfCBfQV9ISURERU4gfCBfQV9BUkNIKSk7CisgICAgKnBhdHRyaWJzID0gKGludCkoYmhmaS5kd0ZpbGVBdHRyaWJ1dGVzICYKKyAgICAoX0FfUkRPTkxZIHwgX0FfU1lTVEVNIHwgX0FfSElEREVOIHwgX0FfQVJDSCkpOwogCiAgICAgQ2xvc2VIYW5kbGUoaGFuZGxlKTsKIApAQCAtMTg5LDExICsxODksMTEgQEAKIAogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzTzpGQ0lDcmVhdGUiLCAmY2FibmFtZSwgJmZpbGVzKSkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmICghUHlMaXN0X0NoZWNrKGZpbGVzKSkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGQ0lDcmVhdGUgZXhwZWN0cyBhIGxpc3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRkNJQ3JlYXRlIGV4cGVjdHMgYSBsaXN0Iik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgY2NhYi5jYiA9IElOVF9NQVg7IC8qIG5vIG5lZWQgdG8gc3BsaXQgQ0FCIGludG8gbXVsdGlwbGUgbWVkaWEgKi8KQEAgLTIwOSw0OSArMjA5LDQ5IEBACiAgICAgY2NhYi5zekRpc2tbMF0gPSAnXDAnOwogCiAgICAgZm9yIChpID0gMCwgcCA9IGNhYm5hbWU7ICpwOyBwID0gQ2hhck5leHQocCkpCi0JaWYgKCpwID09ICdcXCcgfHwgKnAgPT0gJy8nKQotCSAgICBpID0gcCAtIGNhYm5hbWUgKyAxOworICAgIGlmICgqcCA9PSAnXFwnIHx8ICpwID09ICcvJykKKyAgICAgICAgaSA9IHAgLSBjYWJuYW1lICsgMTsKIAogICAgIGlmIChpID49IHNpemVvZihjY2FiLnN6Q2FiUGF0aCkgfHwKLQlzdHJsZW4oY2FibmFtZStpKSA+PSBzaXplb2YoY2NhYi5zekNhYikpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInBhdGggbmFtZSB0b28gbG9uZyIpOwotCXJldHVybiAwOworICAgIHN0cmxlbihjYWJuYW1lK2kpID49IHNpemVvZihjY2FiLnN6Q2FiKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicGF0aCBuYW1lIHRvbyBsb25nIik7CisgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgaWYgKGkgPiAwKSB7Ci0JbWVtY3B5KGNjYWIuc3pDYWJQYXRoLCBjYWJuYW1lLCBpKTsKLQljY2FiLnN6Q2FiUGF0aFtpXSA9ICdcMCc7Ci0Jc3RyY3B5KGNjYWIuc3pDYWIsIGNhYm5hbWUraSk7CisgICAgbWVtY3B5KGNjYWIuc3pDYWJQYXRoLCBjYWJuYW1lLCBpKTsKKyAgICBjY2FiLnN6Q2FiUGF0aFtpXSA9ICdcMCc7CisgICAgc3RyY3B5KGNjYWIuc3pDYWIsIGNhYm5hbWUraSk7CiAgICAgfSBlbHNlIHsKLQlzdHJjcHkoY2NhYi5zekNhYlBhdGgsICIuXFwiKTsKLQlzdHJjcHkoY2NhYi5zekNhYiwgY2FibmFtZSk7CisgICAgc3RyY3B5KGNjYWIuc3pDYWJQYXRoLCAiLlxcIik7CisgICAgc3RyY3B5KGNjYWIuc3pDYWIsIGNhYm5hbWUpOwogICAgIH0KIAogICAgIGhmY2kgPSBGQ0lDcmVhdGUoJmVyZiwgY2JfZmlsZXBsYWNlZCwgY2JfYWxsb2MsIGNiX2ZyZWUsCi0JY2Jfb3BlbiwgY2JfcmVhZCwgY2Jfd3JpdGUsIGNiX2Nsb3NlLCBjYl9zZWVrLCBjYl9kZWxldGUsCi0JY2JfZ2V0dGVtcGZpbGUsICZjY2FiLCBOVUxMKTsKKyAgICBjYl9vcGVuLCBjYl9yZWFkLCBjYl93cml0ZSwgY2JfY2xvc2UsIGNiX3NlZWssIGNiX2RlbGV0ZSwKKyAgICBjYl9nZXR0ZW1wZmlsZSwgJmNjYWIsIE5VTEwpOwogCiAgICAgaWYgKGhmY2kgPT0gTlVMTCkgewotCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiRkNJIGVycm9yICVkIiwgZXJmLmVyZk9wZXIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiRkNJIGVycm9yICVkIiwgZXJmLmVyZk9wZXIpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGZvciAoaT0wOyBpIDwgUHlMaXN0X0dFVF9TSVpFKGZpbGVzKTsgaSsrKSB7Ci0JUHlPYmplY3QgKml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oZmlsZXMsIGkpOwotCWNoYXIgKmZpbGVuYW1lLCAqY2FibmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoaXRlbSwgInNzIiwgJmZpbGVuYW1lLCAmY2FibmFtZSkpCi0JICAgIGdvdG8gZXJyOwotCWlmICghRkNJQWRkRmlsZShoZmNpLCBmaWxlbmFtZSwgY2FibmFtZSwgRkFMU0UsIAotCSAgICBjYl9nZXRuZXh0Y2FiaW5ldCwgY2Jfc3RhdHVzLCBjYl9nZXRvcGVuaW5mbywKLQkgICAgdGNvbXBUWVBFX01TWklQKSkKLQkgICAgZ290byBlcnI7CisgICAgUHlPYmplY3QgKml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oZmlsZXMsIGkpOworICAgIGNoYXIgKmZpbGVuYW1lLCAqY2FibmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoaXRlbSwgInNzIiwgJmZpbGVuYW1lLCAmY2FibmFtZSkpCisgICAgICAgIGdvdG8gZXJyOworICAgIGlmICghRkNJQWRkRmlsZShoZmNpLCBmaWxlbmFtZSwgY2FibmFtZSwgRkFMU0UsCisgICAgICAgIGNiX2dldG5leHRjYWJpbmV0LCBjYl9zdGF0dXMsIGNiX2dldG9wZW5pbmZvLAorICAgICAgICB0Y29tcFRZUEVfTVNaSVApKQorICAgICAgICBnb3RvIGVycjsKICAgICB9CiAKICAgICBpZiAoIUZDSUZsdXNoQ2FiaW5ldChoZmNpLCBGQUxTRSwgY2JfZ2V0bmV4dGNhYmluZXQsIGNiX3N0YXR1cykpCi0JZ290byBlcnI7CisgICAgZ290byBlcnI7CiAKICAgICBpZiAoIUZDSURlc3Ryb3koaGZjaSkpCi0JZ290byBlcnI7CisgICAgZ290byBlcnI7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC0yNjYsNyArMjY2LDcgQEAKICAgICBNU0lIQU5ETEUgaDsKIH1tc2lvYmo7CiAKLXN0YXRpYyB2b2lkIAorc3RhdGljIHZvaWQKIG1zaW9ial9kZWFsbG9jKG1zaW9iaiogbXNpZGIpCiB7CiAgICAgTXNpQ2xvc2VIYW5kbGUobXNpZGItPmgpOwpAQCAtMjkyLDQxICsyOTIsNDEgQEAKICAgICBNU0lIQU5ETEUgZXJyID0gTXNpR2V0TGFzdEVycm9yUmVjb3JkKCk7CiAKICAgICBpZiAoZXJyID09IDApIHsKLQlzd2l0Y2goc3RhdHVzKSB7Ci0JY2FzZSBFUlJPUl9BQ0NFU1NfREVOSUVEOgotCSAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJhY2Nlc3MgZGVuaWVkIik7Ci0JICAgIHJldHVybiBOVUxMOwotCWNhc2UgRVJST1JfRlVOQ1RJT05fRkFJTEVEOgotCSAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJmdW5jdGlvbiBmYWlsZWQiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JY2FzZSBFUlJPUl9JTlZBTElEX0RBVEE6Ci0JICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgZGF0YSIpOwotCSAgICByZXR1cm4gTlVMTDsKLQljYXNlIEVSUk9SX0lOVkFMSURfSEFORExFOgotCSAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJpbnZhbGlkIGhhbmRsZSIpOwotCSAgICByZXR1cm4gTlVMTDsKLQljYXNlIEVSUk9SX0lOVkFMSURfU1RBVEU6Ci0JICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgc3RhdGUiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JY2FzZSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjoKLQkgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiaW52YWxpZCBwYXJhbWV0ZXIiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JZGVmYXVsdDoKLQkgICAgUHlFcnJfRm9ybWF0KE1TSUVycm9yLCAidW5rbm93biBlcnJvciAleCIsIHN0YXR1cyk7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KKyAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgY2FzZSBFUlJPUl9BQ0NFU1NfREVOSUVEOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJhY2Nlc3MgZGVuaWVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgRVJST1JfRlVOQ1RJT05fRkFJTEVEOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJmdW5jdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSBFUlJPUl9JTlZBTElEX0RBVEE6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgZGF0YSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYXNlIEVSUk9SX0lOVkFMSURfSEFORExFOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJpbnZhbGlkIGhhbmRsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYXNlIEVSUk9SX0lOVkFMSURfU1RBVEU6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiaW52YWxpZCBwYXJhbWV0ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KE1TSUVycm9yLCAidW5rbm93biBlcnJvciAleCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICB9CiAKICAgICBjb2RlID0gTXNpUmVjb3JkR2V0SW50ZWdlcihlcnIsIDEpOyAvKiBYWFggY29kZSAqLwogICAgIGlmIChNc2lGb3JtYXRSZWNvcmQoMCwgZXJyLCByZXMsICZzaXplKSA9PSBFUlJPUl9NT1JFX0RBVEEpIHsKLQlyZXMgPSBtYWxsb2Moc2l6ZSsxKTsKLQlNc2lGb3JtYXRSZWNvcmQoMCwgZXJyLCByZXMsICZzaXplKTsKLQlyZXNbc2l6ZV09J1wwJzsKKyAgICByZXMgPSBtYWxsb2Moc2l6ZSsxKTsKKyAgICBNc2lGb3JtYXRSZWNvcmQoMCwgZXJyLCByZXMsICZzaXplKTsKKyAgICByZXNbc2l6ZV09J1wwJzsKICAgICB9CiAgICAgTXNpQ2xvc2VIYW5kbGUoZXJyKTsKICAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsIHJlcyk7CiAgICAgaWYgKHJlcyAhPSBidWYpCi0JZnJlZShyZXMpOworICAgIGZyZWUocmVzKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMzQzLDEzICszNDMsMTMgQEAKIHsKICAgICB1bnNpZ25lZCBpbnQgZmllbGQ7CiAgICAgaW50IHN0YXR1czsKLSAgICAKKwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSTpHZXRJbnRlZ2VyIiwgJmZpZWxkKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgc3RhdHVzID0gTXNpUmVjb3JkR2V0SW50ZWdlcihyZWNvcmQtPmgsIGZpZWxkKTsKICAgICBpZiAoc3RhdHVzID09IE1TSV9OVUxMX0lOVEVHRVIpewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJjb3VsZCBub3QgY29udmVydCByZWNvcmQgZmllbGQgdG8gaW50ZWdlciIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJjb3VsZCBub3QgY29udmVydCByZWNvcmQgZmllbGQgdG8gaW50ZWdlciIpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHN0YXR1cyk7CiB9CkBAIC0zNjMsMjEgKzM2MywyMSBAQAogICAgIGNoYXIgKnJlcyA9IGJ1ZjsKICAgICBEV09SRCBzaXplID0gc2l6ZW9mKGJ1Zik7CiAgICAgUHlPYmplY3QqIHN0cmluZzsKLSAgICAKKwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSTpHZXRTdHJpbmciLCAmZmllbGQpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgICBzdGF0dXMgPSBNc2lSZWNvcmRHZXRTdHJpbmcocmVjb3JkLT5oLCBmaWVsZCwgcmVzLCAmc2l6ZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9NT1JFX0RBVEEpIHsKLSAgICAgICAgcmVzID0gKGNoYXIqKSBtYWxsb2Moc2l6ZSArIDEpOwotICAgICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgc3RhdHVzID0gTXNpUmVjb3JkR2V0U3RyaW5nKHJlY29yZC0+aCwgZmllbGQsIHJlcywgJnNpemUpOworICAgIHJlcyA9IChjaGFyKikgbWFsbG9jKHNpemUgKyAxKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIHN0YXR1cyA9IE1zaVJlY29yZEdldFN0cmluZyhyZWNvcmQtPmgsIGZpZWxkLCByZXMsICZzaXplKTsKICAgICB9CiAgICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gbXNpZXJyb3IoKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gbXNpZXJyb3IoKGludCkgc3RhdHVzKTsKICAgICBzdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHJlcyk7CiAgICAgaWYgKGJ1ZiAhPSByZXMpCi0gICAgICAgIGZyZWUocmVzKTsKKyAgICBmcmVlKHJlcyk7CiAgICAgcmV0dXJuIHN0cmluZzsKIH0KIApAQCAtMzg2LDcgKzM4Niw3IEBACiB7CiAgICAgaW50IHN0YXR1cyA9IE1zaVJlY29yZENsZWFyRGF0YShyZWNvcmQtPmgpOwogICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTQwMCwxMCArNDAwLDEwIEBACiAgICAgY2hhciAqZGF0YTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXM6U2V0U3RyaW5nIiwgJmZpZWxkLCAmZGF0YSkpCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaVJlY29yZFNldFN0cmluZyhyZWNvcmQtPmgsIGZpZWxkLCBkYXRhKSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTQxNywxMCArNDE3LDEwIEBACiAgICAgY2hhciAqZGF0YTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXM6U2V0U3RyZWFtIiwgJmZpZWxkLCAmZGF0YSkpCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaVJlY29yZFNldFN0cmVhbShyZWNvcmQtPmgsIGZpZWxkLCBkYXRhKSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTQzNCwxMCArNDM0LDEwIEBACiAgICAgaW50IGRhdGE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOlNldEludGVnZXIiLCAmZmllbGQsICZkYXRhKSkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmICgoc3RhdHVzID0gTXNpUmVjb3JkU2V0SW50ZWdlcihyZWNvcmQtPmgsIGZpZWxkLCBkYXRhKSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTQ0Niw2NSArNDQ2LDY1IEBACiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIHJlY29yZF9tZXRob2RzW10gPSB7Ci0gICAgeyAiR2V0RmllbGRDb3VudCIsIChQeUNGdW5jdGlvbilyZWNvcmRfZ2V0ZmllbGRjb3VudCwgTUVUSF9OT0FSR1MsIAotCVB5RG9jX1NUUigiR2V0RmllbGRDb3VudCgpIC0+IGludFxuV3JhcHMgTXNpUmVjb3JkR2V0RmllbGRDb3VudCIpfSwKKyAgICB7ICJHZXRGaWVsZENvdW50IiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9nZXRmaWVsZGNvdW50LCBNRVRIX05PQVJHUywKKyAgICBQeURvY19TVFIoIkdldEZpZWxkQ291bnQoKSAtPiBpbnRcbldyYXBzIE1zaVJlY29yZEdldEZpZWxkQ291bnQiKX0sCiAgICAgeyAiR2V0SW50ZWdlciIsIChQeUNGdW5jdGlvbilyZWNvcmRfZ2V0aW50ZWdlciwgTUVUSF9WQVJBUkdTLAogICAgIFB5RG9jX1NUUigiR2V0SW50ZWdlcihmaWVsZCkgLT4gaW50XG5XcmFwcyBNc2lSZWNvcmRHZXRJbnRlZ2VyIil9LAogICAgIHsgIkdldFN0cmluZyIsIChQeUNGdW5jdGlvbilyZWNvcmRfZ2V0c3RyaW5nLCBNRVRIX1ZBUkFSR1MsCiAgICAgUHlEb2NfU1RSKCJHZXRTdHJpbmcoZmllbGQpIC0+IHN0cmluZ1xuV3JhcHMgTXNpUmVjb3JkR2V0U3RyaW5nIil9LAotICAgIHsgIlNldFN0cmluZyIsIChQeUNGdW5jdGlvbilyZWNvcmRfc2V0c3RyaW5nLCBNRVRIX1ZBUkFSR1MsIAotCVB5RG9jX1NUUigiU2V0U3RyaW5nKGZpZWxkLHN0cikgLT4gTm9uZVxuV3JhcHMgTXNpUmVjb3JkU2V0U3RyaW5nIil9LAotICAgIHsgIlNldFN0cmVhbSIsIChQeUNGdW5jdGlvbilyZWNvcmRfc2V0c3RyZWFtLCBNRVRIX1ZBUkFSR1MsIAotCVB5RG9jX1NUUigiU2V0U3RyZWFtKGZpZWxkLGZpbGVuYW1lKSAtPiBOb25lXG5XcmFwcyBNc2lSZWNvcmRTZXRJbnRlZ2VyIil9LAotICAgIHsgIlNldEludGVnZXIiLCAoUHlDRnVuY3Rpb24pcmVjb3JkX3NldGludGVnZXIsIE1FVEhfVkFSQVJHUywgCi0JUHlEb2NfU1RSKCJTZXRJbnRlZ2VyKGZpZWxkLGludCkgLT4gTm9uZVxuV3JhcHMgTXNpUmVjb3JkU2V0SW50ZWdlciIpfSwKLSAgICB7ICJDbGVhckRhdGEiLCAoUHlDRnVuY3Rpb24pcmVjb3JkX2NsZWFyZGF0YSwgTUVUSF9OT0FSR1MsIAotCVB5RG9jX1NUUigiQ2xlYXJEYXRhKCkgLT4gaW50XG5XcmFwcyBNc2lSZWNvcmRHQ2xlYXJEYXRhIil9LAorICAgIHsgIlNldFN0cmluZyIsIChQeUNGdW5jdGlvbilyZWNvcmRfc2V0c3RyaW5nLCBNRVRIX1ZBUkFSR1MsCisgICAgUHlEb2NfU1RSKCJTZXRTdHJpbmcoZmllbGQsc3RyKSAtPiBOb25lXG5XcmFwcyBNc2lSZWNvcmRTZXRTdHJpbmciKX0sCisgICAgeyAiU2V0U3RyZWFtIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9zZXRzdHJlYW0sIE1FVEhfVkFSQVJHUywKKyAgICBQeURvY19TVFIoIlNldFN0cmVhbShmaWVsZCxmaWxlbmFtZSkgLT4gTm9uZVxuV3JhcHMgTXNpUmVjb3JkU2V0SW50ZWdlciIpfSwKKyAgICB7ICJTZXRJbnRlZ2VyIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9zZXRpbnRlZ2VyLCBNRVRIX1ZBUkFSR1MsCisgICAgUHlEb2NfU1RSKCJTZXRJbnRlZ2VyKGZpZWxkLGludCkgLT4gTm9uZVxuV3JhcHMgTXNpUmVjb3JkU2V0SW50ZWdlciIpfSwKKyAgICB7ICJDbGVhckRhdGEiLCAoUHlDRnVuY3Rpb24pcmVjb3JkX2NsZWFyZGF0YSwgTUVUSF9OT0FSR1MsCisgICAgUHlEb2NfU1RSKCJDbGVhckRhdGEoKSAtPiBpbnRcbldyYXBzIE1zaVJlY29yZEdDbGVhckRhdGEiKX0sCiAgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcmVjb3JkX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9tc2kuUmVjb3JkIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKG1zaW9iaiksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvciltc2lvYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCTAsCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KLSAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCi0gICAgICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLC8qdHBfc2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0gICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgIC8qdHBfZmxhZ3MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KLSAgICAgICAgcmVjb3JkX21ldGhvZHMsICAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX21zaS5SZWNvcmQiLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YobXNpb2JqKSwgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgcmVjb3JkX21ldGhvZHMsICAgICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCoKQEAgLTUxMyw4ICs1MTMsOCBAQAogICAgIG1zaW9iaiAqcmVzdWx0ID0gUHlPYmplY3RfTkVXKHN0cnVjdCBtc2lvYmosICZyZWNvcmRfVHlwZSk7CiAKICAgICBpZiAoIXJlc3VsdCkgewotCU1zaUNsb3NlSGFuZGxlKGgpOwotCXJldHVybiBOVUxMOworICAgIE1zaUNsb3NlSGFuZGxlKGgpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHJlc3VsdC0+aCA9IGg7CkBAIC01MzcsMjcgKzUzNywyNyBAQAogICAgIERXT1JEIHNzaXplID0gc2l6ZW9mKHN2YWwpOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkdldFByb3BlcnR5IiwgJmZpZWxkKSkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAotICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCAmdHlwZSwgJml2YWwsIAotCSZmdmFsLCBzdmFsLCAmc3NpemUpOworICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCAmdHlwZSwgJml2YWwsCisgICAgJmZ2YWwsIHN2YWwsICZzc2l6ZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9NT1JFX0RBVEEpIHsKLQlzdmFsID0gbWFsbG9jKHNzaXplKTsKLSAgICAgICAgc3RhdHVzID0gTXNpU3VtbWFyeUluZm9HZXRQcm9wZXJ0eShzaS0+aCwgZmllbGQsICZ0eXBlLCAmaXZhbCwgCi0gICAgCSAgICAmZnZhbCwgc3ZhbCwgJnNzaXplKTsKKyAgICBzdmFsID0gbWFsbG9jKHNzaXplKTsKKyAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5KHNpLT5oLCBmaWVsZCwgJnR5cGUsICZpdmFsLAorICAgICAgICAmZnZhbCwgc3ZhbCwgJnNzaXplKTsKICAgICB9CiAKICAgICBzd2l0Y2godHlwZSkgewotCWNhc2UgVlRfSTI6IGNhc2UgVlRfSTQ6Ci0JICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpdmFsKTsKLQljYXNlIFZUX0ZJTEVUSU1FOgotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgIkZJTEVUSU1FIHJlc3VsdCIpOwotCSAgICByZXR1cm4gTlVMTDsKLQljYXNlIFZUX0xQU1RSOgotCSAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdmFsLCBzc2l6ZSk7Ci0JICAgIGlmIChzdmFsICE9IHNidWYpCi0JCWZyZWUoc3ZhbCk7Ci0JICAgIHJldHVybiByZXN1bHQ7CisgICAgY2FzZSBWVF9JMjogY2FzZSBWVF9JNDoKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGl2YWwpOworICAgIGNhc2UgVlRfRklMRVRJTUU6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAiRklMRVRJTUUgcmVzdWx0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgVlRfTFBTVFI6CisgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN2YWwsIHNzaXplKTsKKyAgICAgICAgaWYgKHN2YWwgIT0gc2J1ZikKKyAgICAgICAgZnJlZShzdmFsKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsICJyZXN1bHQgb2YgdHlwZSAlZCIsIHR5cGUpOwogICAgIHJldHVybiBOVUxMOwpAQCAtNTcxLDcgKzU3MSw3IEBACiAKICAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5Q291bnQoc2ktPmgsICZyZXN1bHQpOwogICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyZXN1bHQpOwogfQpAQCAtNTg0LDIxICs1ODQsMjEgQEAKICAgICBQeU9iamVjdCogZGF0YTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86U2V0UHJvcGVydHkiLCAmZmllbGQsICZkYXRhKSkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVN0cmluZ19DaGVjayhkYXRhKSkgewotCXN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvU2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCBWVF9MUFNUUiwKLQkgICAgMCwgTlVMTCwgUHlTdHJpbmdfQXNTdHJpbmcoZGF0YSkpOworICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvU2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCBWVF9MUFNUUiwKKyAgICAgICAgMCwgTlVMTCwgUHlTdHJpbmdfQXNTdHJpbmcoZGF0YSkpOwogICAgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2soZGF0YSkpIHsKLQlzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb1NldFByb3BlcnR5KHNpLT5oLCBmaWVsZCwgVlRfSTQsCi0JICAgIFB5SW50X0FzTG9uZyhkYXRhKSwgTlVMTCwgTlVMTCk7CisgICAgc3RhdHVzID0gTXNpU3VtbWFyeUluZm9TZXRQcm9wZXJ0eShzaS0+aCwgZmllbGQsIFZUX0k0LAorICAgICAgICBQeUludF9Bc0xvbmcoZGF0YSksIE5VTEwsIE5VTEwpOwogICAgIH0gZWxzZSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInVuc3VwcG9ydGVkIHR5cGUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5zdXBwb3J0ZWQgdHlwZSIpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICAKKwogICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTYxMiw2NSArNjEyLDY1IEBACiAKICAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb1BlcnNpc3Qoc2ktPmgpOwogICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzdW1tYXJ5X21ldGhvZHNbXSA9IHsKLSAgICB7ICJHZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X2dldHByb3BlcnR5LCBNRVRIX1ZBUkFSR1MsIAotCVB5RG9jX1NUUigiR2V0UHJvcGVydHkocHJvcGlkKSAtPiB2YWx1ZVxuV3JhcHMgTXNpU3VtbWFyeUluZm9HZXRQcm9wZXJ0eSIpfSwKLSAgICB7ICJHZXRQcm9wZXJ0eUNvdW50IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfZ2V0cHJvcGVydHljb3VudCwgTUVUSF9OT0FSR1MsIAotCVB5RG9jX1NUUigiR2V0UHJvcGVydHkoKSAtPiBpbnRcbldyYXBzIE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHlDb3VudCIpfSwKLSAgICB7ICJTZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X3NldHByb3BlcnR5LCBNRVRIX1ZBUkFSR1MsIAotCVB5RG9jX1NUUigiU2V0UHJvcGVydHkodmFsdWUpIC0+IE5vbmVcbldyYXBzIE1zaVN1bW1hcnlJbmZvUHJvcGVydHkiKX0sCi0gICAgeyAiUGVyc2lzdCIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X3BlcnNpc3QsIE1FVEhfTk9BUkdTLCAKLQlQeURvY19TVFIoIlBlcnNpc3QoKSAtPiBOb25lXG5XcmFwcyBNc2lTdW1tYXJ5SW5mb1BlcnNpc3QiKX0sCisgICAgeyAiR2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pc3VtbWFyeV9nZXRwcm9wZXJ0eSwgTUVUSF9WQVJBUkdTLAorICAgIFB5RG9jX1NUUigiR2V0UHJvcGVydHkocHJvcGlkKSAtPiB2YWx1ZVxuV3JhcHMgTXNpU3VtbWFyeUluZm9HZXRQcm9wZXJ0eSIpfSwKKyAgICB7ICJHZXRQcm9wZXJ0eUNvdW50IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfZ2V0cHJvcGVydHljb3VudCwgTUVUSF9OT0FSR1MsCisgICAgUHlEb2NfU1RSKCJHZXRQcm9wZXJ0eSgpIC0+IGludFxuV3JhcHMgTXNpU3VtbWFyeUluZm9HZXRQcm9wZXJ0eUNvdW50Iil9LAorICAgIHsgIlNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfc2V0cHJvcGVydHksIE1FVEhfVkFSQVJHUywKKyAgICBQeURvY19TVFIoIlNldFByb3BlcnR5KHZhbHVlKSAtPiBOb25lXG5XcmFwcyBNc2lTdW1tYXJ5SW5mb1Byb3BlcnR5Iil9LAorICAgIHsgIlBlcnNpc3QiLCAoUHlDRnVuY3Rpb24pc3VtbWFyeV9wZXJzaXN0LCBNRVRIX05PQVJHUywKKyAgICBQeURvY19TVFIoIlBlcnNpc3QoKSAtPiBOb25lXG5XcmFwcyBNc2lTdW1tYXJ5SW5mb1BlcnNpc3QiKX0sCiAgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qgc3VtbWFyeV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfbXNpLlN1bW1hcnlJbmZvcm1hdGlvbiIsCQkvKnRwX25hbWUqLwotCXNpemVvZihtc2lvYmopLAkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbXNpb2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkwLAkJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCi0gICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwotICAgICAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAvKnRwX2ZsYWdzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCi0gICAgICAgIHN1bW1hcnlfbWV0aG9kcywgICAgICAgIC8qdHBfbWV0aG9kcyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYWxsb2MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfbXNpLlN1bW1hcnlJbmZvcm1hdGlvbiIsICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YobXNpb2JqKSwgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgc3VtbWFyeV9tZXRob2RzLCAgICAgICAgLyp0cF9tZXRob2RzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZpZXcgb2JqZWN0cyAqKioqKioqKioqKioqKi8KQEAgLTY4MywxOSArNjgzLDE5IEBACiAgICAgUHlPYmplY3QgKm9wYXJhbXMgPSBQeV9Ob25lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOkV4ZWN1dGUiLCAmb3BhcmFtcykpCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAob3BhcmFtcyAhPSBQeV9Ob25lKSB7Ci0gICAgICAgIGlmIChvcGFyYW1zLT5vYl90eXBlICE9ICZyZWNvcmRfVHlwZSkgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV4ZWN1dGUgYXJndW1lbnQgbXVzdCBiZSBhIHJlY29yZCIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW1zID0gKChtc2lvYmoqKW9wYXJhbXMpLT5oOworICAgIGlmIChvcGFyYW1zLT5vYl90eXBlICE9ICZyZWNvcmRfVHlwZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXhlY3V0ZSBhcmd1bWVudCBtdXN0IGJlIGEgcmVjb3JkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwYXJhbXMgPSAoKG1zaW9iaiopb3BhcmFtcyktPmg7CiAgICAgfQogCiAgICAgc3RhdHVzID0gTXNpVmlld0V4ZWN1dGUodmlldy0+aCwgcGFyYW1zKTsKICAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CisgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC03MDgsNyArNzA4LDcgQEAKICAgICBNU0lIQU5ETEUgcmVzdWx0OwogCiAgICAgaWYgKChzdGF0dXMgPSBNc2lWaWV3RmV0Y2godmlldy0+aCwgJnJlc3VsdCkpICE9IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CisgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICByZXR1cm4gcmVjb3JkX25ldyhyZXN1bHQpOwogfQpAQCAtNzIxLDEwICs3MjEsMTAgQEAKICAgICBNU0lIQU5ETEUgcmVzdWx0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkdldENvbHVtbkluZm8iLCAma2luZCkpCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaVZpZXdHZXRDb2x1bW5JbmZvKHZpZXctPmgsIGtpbmQsICZyZXN1bHQpKSAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwogCiAgICAgcmV0dXJuIHJlY29yZF9uZXcocmVzdWx0KTsKIH0KQEAgLTczNywxNSArNzM3LDE1IEBACiAgICAgaW50IHN0YXR1czsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86TW9kaWZ5IiwgJmtpbmQsICZkYXRhKSkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChkYXRhLT5vYl90eXBlICE9ICZyZWNvcmRfVHlwZSkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNb2RpZnkgZXhwZWN0cyBhIHJlY29yZCBvYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTW9kaWZ5IGV4cGVjdHMgYSByZWNvcmQgb2JqZWN0Iik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgaWYgKChzdGF0dXMgPSBNc2lWaWV3TW9kaWZ5KHZpZXctPmgsIGtpbmQsICgobXNpb2JqKilkYXRhKS0+aCkpICE9IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CisgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC03NTcsNjggKzc1Nyw2OCBAQAogICAgIGludCBzdGF0dXM7CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaVZpZXdDbG9zZSh2aWV3LT5oKSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHZpZXdfbWV0aG9kc1tdID0gewotICAgIHsgIkV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pdmlld19leGVjdXRlLCBNRVRIX1ZBUkFSR1MsIAotCVB5RG9jX1NUUigiRXhlY3V0ZShwYXJhbXM9Tm9uZSkgLT4gTm9uZVxuV3JhcHMgTXNpVmlld0V4ZWN1dGUiKX0sCisgICAgeyAiRXhlY3V0ZSIsIChQeUNGdW5jdGlvbil2aWV3X2V4ZWN1dGUsIE1FVEhfVkFSQVJHUywKKyAgICBQeURvY19TVFIoIkV4ZWN1dGUocGFyYW1zPU5vbmUpIC0+IE5vbmVcbldyYXBzIE1zaVZpZXdFeGVjdXRlIil9LAogICAgIHsgIkdldENvbHVtbkluZm8iLCAoUHlDRnVuY3Rpb24pdmlld19nZXRjb2x1bW5pbmZvLCBNRVRIX1ZBUkFSR1MsCi0JUHlEb2NfU1RSKCJHZXRDb2x1bW5JbmZvKCkgLT4gcmVzdWx0XG5XcmFwcyBNc2lHZXRDb2x1bW5JbmZvIil9LAorICAgIFB5RG9jX1NUUigiR2V0Q29sdW1uSW5mbygpIC0+IHJlc3VsdFxuV3JhcHMgTXNpR2V0Q29sdW1uSW5mbyIpfSwKICAgICB7ICJGZXRjaCIsIChQeUNGdW5jdGlvbil2aWV3X2ZldGNoLCBNRVRIX05PQVJHUywKLQlQeURvY19TVFIoIkZldGNoKCkgLT4gcmVzdWx0XG5XcmFwcyBNc2lWaWV3RmV0Y2giKX0sCisgICAgUHlEb2NfU1RSKCJGZXRjaCgpIC0+IHJlc3VsdFxuV3JhcHMgTXNpVmlld0ZldGNoIil9LAogICAgIHsgIk1vZGlmeSIsIChQeUNGdW5jdGlvbil2aWV3X21vZGlmeSwgTUVUSF9WQVJBUkdTLAotCVB5RG9jX1NUUigiTW9kaWZ5KG1vZGUscmVjb3JkKSAtPiBOb25lXG5XcmFwcyBNc2lWaWV3TW9kaWZ5Iil9LAorICAgIFB5RG9jX1NUUigiTW9kaWZ5KG1vZGUscmVjb3JkKSAtPiBOb25lXG5XcmFwcyBNc2lWaWV3TW9kaWZ5Iil9LAogICAgIHsgIkNsb3NlIiwgKFB5Q0Z1bmN0aW9uKXZpZXdfY2xvc2UsIE1FVEhfTk9BUkdTLAotCVB5RG9jX1NUUigiQ2xvc2UoKSAtPiByZXN1bHRcbldyYXBzIE1zaVZpZXdDbG9zZSIpfSwKKyAgICBQeURvY19TVFIoIkNsb3NlKCkgLT4gcmVzdWx0XG5XcmFwcyBNc2lWaWV3Q2xvc2UiKX0sCiAgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgbXNpdmlld19UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfbXNpLlZpZXciLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YobXNpb2JqKSwJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JMCwJCQkvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwotICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KLSAgICAgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsLyp0cF9zZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KLSAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwotICAgICAgICB2aWV3X21ldGhvZHMsICAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX21zaS5WaWV3IiwgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YobXNpb2JqKSwgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgdmlld19tZXRob2RzLCAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIERhdGFiYXNlIG9iamVjdHMgKioqKioqKioqKioqKiovCkBAIC04MzIsMTUgKzgzMiwxNSBAQAogICAgIG1zaW9iaiAqcmVzdWx0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOk9wZW5WaWV3IiwgJnNxbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaURhdGFiYXNlT3BlblZpZXcobXNpZGItPmgsIHNxbCwgJmhWaWV3KSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIHJlc3VsdCA9IFB5T2JqZWN0X05FVyhzdHJ1Y3QgbXNpb2JqLCAmbXNpdmlld19UeXBlKTsKICAgICBpZiAoIXJlc3VsdCkgewotCU1zaUNsb3NlSGFuZGxlKGhWaWV3KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBNc2lDbG9zZUhhbmRsZShoVmlldyk7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmVzdWx0LT5oID0gaFZpZXc7CkBAIC04NTMsNyArODUzLDcgQEAKICAgICBpbnQgc3RhdHVzOwogCiAgICAgaWYgKChzdGF0dXMgPSBNc2lEYXRhYmFzZUNvbW1pdChtc2lkYi0+aCkpICE9IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CisgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC04NjgsMTYgKzg2OCwxNiBAQAogICAgIG1zaW9iaiAqb3Jlc3VsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpHZXRTdW1tYXJ5SW5mb3JtYXRpb24iLCAmY291bnQpKQotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgc3RhdHVzID0gTXNpR2V0U3VtbWFyeUluZm9ybWF0aW9uKGRiLT5oLCBOVUxMLCBjb3VudCwgJnJlc3VsdCk7CiAgICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwogCiAgICAgb3Jlc3VsdCA9IFB5T2JqZWN0X05FVyhzdHJ1Y3QgbXNpb2JqLCAmc3VtbWFyeV9UeXBlKTsKICAgICBpZiAoIXJlc3VsdCkgewotCU1zaUNsb3NlSGFuZGxlKHJlc3VsdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgTXNpQ2xvc2VIYW5kbGUocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBvcmVzdWx0LT5oID0gcmVzdWx0OwpAQCAtODg1LDU3ICs4ODUsNTcgQEAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGRiX21ldGhvZHNbXSA9IHsKLSAgICB7ICJPcGVuVmlldyIsIChQeUNGdW5jdGlvbiltc2lkYl9vcGVudmlldywgTUVUSF9WQVJBUkdTLCAKLQlQeURvY19TVFIoIk9wZW5WaWV3KHNxbCkgLT4gdmlld29ialxuV3JhcHMgTXNpRGF0YWJhc2VPcGVuVmlldyIpfSwKKyAgICB7ICJPcGVuVmlldyIsIChQeUNGdW5jdGlvbiltc2lkYl9vcGVudmlldywgTUVUSF9WQVJBUkdTLAorICAgIFB5RG9jX1NUUigiT3BlblZpZXcoc3FsKSAtPiB2aWV3b2JqXG5XcmFwcyBNc2lEYXRhYmFzZU9wZW5WaWV3Iil9LAogICAgIHsgIkNvbW1pdCIsIChQeUNGdW5jdGlvbiltc2lkYl9jb21taXQsIE1FVEhfTk9BUkdTLAotCVB5RG9jX1NUUigiQ29tbWl0KCkgLT4gTm9uZVxuV3JhcHMgTXNpRGF0YWJhc2VDb21taXQiKX0sCi0gICAgeyAiR2V0U3VtbWFyeUluZm9ybWF0aW9uIiwgKFB5Q0Z1bmN0aW9uKW1zaWRiX2dldHN1bW1hcnlpbmZvcm1hdGlvbiwgTUVUSF9WQVJBUkdTLCAKLQlQeURvY19TVFIoIkdldFN1bW1hcnlJbmZvcm1hdGlvbih1cGRhdGVDb3VudCkgLT4gdmlld29ialxuV3JhcHMgTXNpR2V0U3VtbWFyeUluZm9ybWF0aW9uIil9LAorICAgIFB5RG9jX1NUUigiQ29tbWl0KCkgLT4gTm9uZVxuV3JhcHMgTXNpRGF0YWJhc2VDb21taXQiKX0sCisgICAgeyAiR2V0U3VtbWFyeUluZm9ybWF0aW9uIiwgKFB5Q0Z1bmN0aW9uKW1zaWRiX2dldHN1bW1hcnlpbmZvcm1hdGlvbiwgTUVUSF9WQVJBUkdTLAorICAgIFB5RG9jX1NUUigiR2V0U3VtbWFyeUluZm9ybWF0aW9uKHVwZGF0ZUNvdW50KSAtPiB2aWV3b2JqXG5XcmFwcyBNc2lHZXRTdW1tYXJ5SW5mb3JtYXRpb24iKX0sCiAgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgbXNpZGJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX21zaS5EYXRhYmFzZSIsCQkvKnRwX25hbWUqLwotCXNpemVvZihtc2lvYmopLAkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbXNpb2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkwLAkJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCi0gICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwotICAgICAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAvKnRwX2ZsYWdzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCi0gICAgICAgIGRiX21ldGhvZHMsICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYWxsb2MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfbXNpLkRhdGFiYXNlIiwgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKG1zaW9iaiksICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvciltc2lvYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgIC8qdHBfZmxhZ3MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIGRiX21ldGhvZHMsICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmV3Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0KiBtc2lvcGVuZGIoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmFyZ3MpCkBAIC05NDUsMTggKzk0NSwxOCBAQAogICAgIGludCBwZXJzaXN0OwogICAgIE1TSUhBTkRMRSBoOwogICAgIG1zaW9iaiAqcmVzdWx0OwotICAgIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2k6TVNJT3BlbkRhdGFiYXNlIiwgJnBhdGgsICZwZXJzaXN0KSkKLQlyZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IE1zaU9wZW5EYXRhYmFzZShwYXRoLCAoTFBDU1RSKXBlcnNpc3QsICZoKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpOk1TSU9wZW5EYXRhYmFzZSIsICZwYXRoLCAmcGVyc2lzdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzdGF0dXMgPSBNc2lPcGVuRGF0YWJhc2UocGF0aCwgKExQQ1NUUilwZXJzaXN0LCAmaCk7CiAgICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwogCiAgICAgcmVzdWx0ID0gUHlPYmplY3RfTkVXKHN0cnVjdCBtc2lvYmosICZtc2lkYl9UeXBlKTsKICAgICBpZiAoIXJlc3VsdCkgewotCU1zaUNsb3NlSGFuZGxlKGgpOwotCXJldHVybiBOVUxMOworICAgIE1zaUNsb3NlSGFuZGxlKGgpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXN1bHQtPmggPSBoOwogICAgIHJldHVybiAoUHlPYmplY3QqKXJlc3VsdDsKQEAgLTk2OSwyNiArOTY5LDI2IEBACiAgICAgTVNJSEFORExFIGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Q3JlYXRlUmVjb3JkIiwgJmNvdW50KSkKLQlyZXR1cm4gTlVMTDsKLSAgICAKKyAgICByZXR1cm4gTlVMTDsKKwogICAgIGggPSBNc2lDcmVhdGVSZWNvcmQoY291bnQpOwogICAgIGlmIChoID09IDApCi0JcmV0dXJuIG1zaWVycm9yKDApOworICAgIHJldHVybiBtc2llcnJvcigwKTsKIAogICAgIHJldHVybiByZWNvcmRfbmV3KGgpOwogfQogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtc2lfbWV0aG9kc1tdID0gewotICAgICAgICB7IlV1aWRDcmVhdGUiLCAoUHlDRnVuY3Rpb24pdXVpZGNyZWF0ZSwgTUVUSF9OT0FSR1MsCi0JCVB5RG9jX1NUUigiVXVpZENyZWF0ZSgpIC0+IHN0cmluZyIpfSwKLQl7IkZDSUNyZWF0ZSIsCShQeUNGdW5jdGlvbilmY2ljcmVhdGUsCU1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJmY2ljcmVhdGUoY2FibmFtZSxmaWxlcykgLT4gTm9uZSIpfSwKLQl7Ik9wZW5EYXRhYmFzZSIsIChQeUNGdW5jdGlvbiltc2lvcGVuZGIsIE1FVEhfVkFSQVJHUywKLQlQeURvY19TVFIoIk9wZW5EYXRhYmFzZShuYW1lLCBmbGFncykgLT4gZGJvYmpcbldyYXBzIE1zaU9wZW5EYXRhYmFzZSIpfSwKLQl7IkNyZWF0ZVJlY29yZCIsIChQeUNGdW5jdGlvbiljcmVhdGVyZWNvcmQsIE1FVEhfVkFSQVJHUywKLQlQeURvY19TVFIoIk9wZW5EYXRhYmFzZShuYW1lLCBmbGFncykgLT4gZGJvYmpcbldyYXBzIE1zaUNyZWF0ZVJlY29yZCIpfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiVXVpZENyZWF0ZSIsIChQeUNGdW5jdGlvbil1dWlkY3JlYXRlLCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJVdWlkQ3JlYXRlKCkgLT4gc3RyaW5nIil9LAorICAgIHsiRkNJQ3JlYXRlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWZjaWNyZWF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoImZjaWNyZWF0ZShjYWJuYW1lLGZpbGVzKSAtPiBOb25lIil9LAorICAgIHsiT3BlbkRhdGFiYXNlIiwgKFB5Q0Z1bmN0aW9uKW1zaW9wZW5kYiwgTUVUSF9WQVJBUkdTLAorICAgIFB5RG9jX1NUUigiT3BlbkRhdGFiYXNlKG5hbWUsIGZsYWdzKSAtPiBkYm9ialxuV3JhcHMgTXNpT3BlbkRhdGFiYXNlIil9LAorICAgIHsiQ3JlYXRlUmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKWNyZWF0ZXJlY29yZCwgTUVUSF9WQVJBUkdTLAorICAgIFB5RG9jX1NUUigiT3BlbkRhdGFiYXNlKG5hbWUsIGZsYWdzKSAtPiBkYm9ialxuV3JhcHMgTXNpQ3JlYXRlUmVjb3JkIil9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgY2hhciBtc2lfZG9jW10gPSAiRG9jdW1lbnRhdGlvbiI7CkBAIC0xMDAwLDcgKzEwMDAsNyBAQAogCiAgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfbXNpIiwgbXNpX21ldGhvZHMsIG1zaV9kb2MpOwogICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuOworICAgIHJldHVybjsKIAogICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFRElSRUNUIiwgKGludClNU0lEQk9QRU5fQ1JFQVRFRElSRUNUKTsKICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0NSRUFURSIsIChpbnQpTVNJREJPUEVOX0NSRUFURSk7CkBAIC0xMDQ2LDYgKzEwNDYsNiBAQAogCiAgICAgTVNJRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24gKCJfbXNpLk1TSUVycm9yIiwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKCFNU0lFcnJvcikKLQlyZXR1cm47CisgICAgcmV0dXJuOwogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTVNJRXJyb3IiLCBNU0lFcnJvcik7CiB9CmRpZmYgLS1naXQgYS9QQy9fc3VicHJvY2Vzcy5jIGIvUEMvX3N1YnByb2Nlc3MuYwppbmRleCBiYmU3NWZmLi42NzgwMzgyIDEwMDY0NAotLS0gYS9QQy9fc3VicHJvY2Vzcy5jCisrKyBiL1BDL19zdWJwcm9jZXNzLmMKQEAgLTQ5LDggKzQ5LDggQEAKICAgIHRoZSB3cmFwcGVyIGlzIHVzZWQgdG8gcHJvdmlkZSBEZXRhY2ggYW5kIENsb3NlIG1ldGhvZHMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlIQU5ETEUgaGFuZGxlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBIQU5ETEUgaGFuZGxlOwogfSBzcF9oYW5kbGVfb2JqZWN0OwogCiBzdGF0aWNmb3J3YXJkIFB5VHlwZU9iamVjdCBzcF9oYW5kbGVfdHlwZTsKQEAgLTU4LDk3ICs1OCw5NyBAQAogc3RhdGljIFB5T2JqZWN0Kgogc3BfaGFuZGxlX25ldyhIQU5ETEUgaGFuZGxlKQogewotCXNwX2hhbmRsZV9vYmplY3QqIHNlbGY7CisgICAgc3BfaGFuZGxlX29iamVjdCogc2VsZjsKIAotCXNlbGYgPSBQeU9iamVjdF9ORVcoc3BfaGFuZGxlX29iamVjdCwgJnNwX2hhbmRsZV90eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZWxmID0gUHlPYmplY3RfTkVXKHNwX2hhbmRsZV9vYmplY3QsICZzcF9oYW5kbGVfdHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzZWxmLT5oYW5kbGUgPSBoYW5kbGU7CisgICAgc2VsZi0+aGFuZGxlID0gaGFuZGxlOwogCi0JcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CiB9CiAKICNpZiBkZWZpbmVkKE1TX1dJTjMyKSAmJiAhZGVmaW5lZChNU19XSU42NCkKLSNkZWZpbmUgSEFORExFX1RPX1BZTlVNKGhhbmRsZSkJUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGhhbmRsZSkKLSNkZWZpbmUgUFlfSEFORExFX1BBUkFNCSJsIgorI2RlZmluZSBIQU5ETEVfVE9fUFlOVU0oaGFuZGxlKSBQeUludF9Gcm9tTG9uZygobG9uZykgaGFuZGxlKQorI2RlZmluZSBQWV9IQU5ETEVfUEFSQU0gImwiCiAjZWxzZQotI2RlZmluZSBIQU5ETEVfVE9fUFlOVU0oaGFuZGxlKQlQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIGhhbmRsZSkKLSNkZWZpbmUgUFlfSEFORExFX1BBUkFNCSJMIgorI2RlZmluZSBIQU5ETEVfVE9fUFlOVU0oaGFuZGxlKSBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIGhhbmRsZSkKKyNkZWZpbmUgUFlfSEFORExFX1BBUkFNICJMIgogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCoKIHNwX2hhbmRsZV9kZXRhY2goc3BfaGFuZGxlX29iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JSEFORExFIGhhbmRsZTsKKyAgICBIQU5ETEUgaGFuZGxlOwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkRldGFjaCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6RGV0YWNoIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaGFuZGxlID0gc2VsZi0+aGFuZGxlOworICAgIGhhbmRsZSA9IHNlbGYtPmhhbmRsZTsKIAotCXNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIHNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwogCi0JLyogbm90ZTogcmV0dXJuIHRoZSBjdXJyZW50IGhhbmRsZSwgYXMgYW4gaW50ZWdlciAqLwotCXJldHVybiBIQU5ETEVfVE9fUFlOVU0oaGFuZGxlKTsKKyAgICAvKiBub3RlOiByZXR1cm4gdGhlIGN1cnJlbnQgaGFuZGxlLCBhcyBhbiBpbnRlZ2VyICovCisgICAgcmV0dXJuIEhBTkRMRV9UT19QWU5VTShoYW5kbGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBzcF9oYW5kbGVfY2xvc2Uoc3BfaGFuZGxlX29iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkNsb3NlIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpDbG9zZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzZWxmLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJQ2xvc2VIYW5kbGUoc2VsZi0+aGFuZGxlKTsKLQkJc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoc2VsZi0+aGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIENsb3NlSGFuZGxlKHNlbGYtPmhhbmRsZSk7CisgICAgICAgIHNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyB2b2lkCiBzcF9oYW5kbGVfZGVhbGxvYyhzcF9oYW5kbGVfb2JqZWN0KiBzZWxmKQogewotCWlmIChzZWxmLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0JCUNsb3NlSGFuZGxlKHNlbGYtPmhhbmRsZSk7Ci0JUHlPYmplY3RfRlJFRShzZWxmKTsKKyAgICBpZiAoc2VsZi0+aGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICBDbG9zZUhhbmRsZShzZWxmLT5oYW5kbGUpOworICAgIFB5T2JqZWN0X0ZSRUUoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzcF9oYW5kbGVfbWV0aG9kc1tdID0gewotCXsiRGV0YWNoIiwgKFB5Q0Z1bmN0aW9uKSBzcF9oYW5kbGVfZGV0YWNoLCBNRVRIX1ZBUkFSR1N9LAotCXsiQ2xvc2UiLCAgKFB5Q0Z1bmN0aW9uKSBzcF9oYW5kbGVfY2xvc2UsICBNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLCBOVUxMfQorICAgIHsiRGV0YWNoIiwgKFB5Q0Z1bmN0aW9uKSBzcF9oYW5kbGVfZGV0YWNoLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiQ2xvc2UiLCAgKFB5Q0Z1bmN0aW9uKSBzcF9oYW5kbGVfY2xvc2UsICBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCBOVUxMfQogfTsKIAogc3RhdGljIFB5T2JqZWN0Kgogc3BfaGFuZGxlX2dldGF0dHIoc3BfaGFuZGxlX29iamVjdCogc2VsZiwgY2hhciogbmFtZSkKIHsKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChzcF9oYW5kbGVfbWV0aG9kcywgKFB5T2JqZWN0Kikgc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc3BfaGFuZGxlX21ldGhvZHMsIChQeU9iamVjdCopIHNlbGYsIG5hbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBzcF9oYW5kbGVfYXNfaW50KHNwX2hhbmRsZV9vYmplY3QqIHNlbGYpCiB7Ci0JcmV0dXJuIEhBTkRMRV9UT19QWU5VTShzZWxmLT5oYW5kbGUpOworICAgIHJldHVybiBIQU5ETEVfVE9fUFlOVU0oc2VsZi0+aGFuZGxlKTsKIH0KIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBzcF9oYW5kbGVfYXNfbnVtYmVyOwogCiBzdGF0aWNoZXJlIFB5VHlwZU9iamVjdCBzcF9oYW5kbGVfdHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJfc3VicHJvY2Vzc19oYW5kbGUiLCBzaXplb2Yoc3BfaGFuZGxlX29iamVjdCksIDAsCi0JKGRlc3RydWN0b3IpIHNwX2hhbmRsZV9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykgc3BfaGFuZGxlX2dldGF0dHIsLyp0cF9nZXRhdHRyKi8KLQkwLAkJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkJLyp0cF9yZXByKi8KLQkmc3BfaGFuZGxlX2FzX251bWJlciwJCS8qdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyp0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qdHBfYXNfbWFwcGluZyAqLwotCTAJCQkJLyp0cF9oYXNoKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJfc3VicHJvY2Vzc19oYW5kbGUiLCBzaXplb2Yoc3BfaGFuZGxlX29iamVjdCksIDAsCisgICAgKGRlc3RydWN0b3IpIHNwX2hhbmRsZV9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykgc3BfaGFuZGxlX2dldGF0dHIsLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAmc3BfaGFuZGxlX2FzX251bWJlciwgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcgKi8KKyAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE2NCwyNiArMTY0LDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3BfR2V0U3RkSGFuZGxlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlIQU5ETEUgaGFuZGxlOwotCWludCBzdGRfaGFuZGxlOworICAgIEhBTkRMRSBoYW5kbGU7CisgICAgaW50IHN0ZF9oYW5kbGU7CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkdldFN0ZEhhbmRsZSIsICZzdGRfaGFuZGxlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpHZXRTdGRIYW5kbGUiLCAmc3RkX2hhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWhhbmRsZSA9IEdldFN0ZEhhbmRsZSgoRFdPUkQpIHN0ZF9oYW5kbGUpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGhhbmRsZSA9IEdldFN0ZEhhbmRsZSgoRFdPUkQpIHN0ZF9oYW5kbGUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CiAKLQlpZiAoISBoYW5kbGUpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgaWYgKCEgaGFuZGxlKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogCi0JLyogbm90ZTogcmV0dXJucyBpbnRlZ2VyLCBub3QgaGFuZGxlIG9iamVjdCAqLwotCXJldHVybiBIQU5ETEVfVE9fUFlOVU0oaGFuZGxlKTsKKyAgICAvKiBub3RlOiByZXR1cm5zIGludGVnZXIsIG5vdCBoYW5kbGUgb2JqZWN0ICovCisgICAgcmV0dXJuIEhBTkRMRV9UT19QWU5VTShoYW5kbGUpOwogfQogCiBQeURvY19TVFJWQVIoR2V0Q3VycmVudFByb2Nlc3NfZG9jLApAQCAtMTk0LDEwICsxOTQsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcF9HZXRDdXJyZW50UHJvY2VzcyhQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEN1cnJlbnRQcm9jZXNzIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRDdXJyZW50UHJvY2VzcyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBzcF9oYW5kbGVfbmV3KEdldEN1cnJlbnRQcm9jZXNzKCkpOworICAgIHJldHVybiBzcF9oYW5kbGVfbmV3KEdldEN1cnJlbnRQcm9jZXNzKCkpOwogfQogCiBQeURvY19TVFJWQVIoRHVwbGljYXRlSGFuZGxlX2RvYywKQEAgLTIxNCw0MyArMjE0LDQzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3BfRHVwbGljYXRlSGFuZGxlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlIQU5ETEUgdGFyZ2V0X2hhbmRsZTsKLQlCT09MIHJlc3VsdDsKKyAgICBIQU5ETEUgdGFyZ2V0X2hhbmRsZTsKKyAgICBCT09MIHJlc3VsdDsKIAotCUhBTkRMRSBzb3VyY2VfcHJvY2Vzc19oYW5kbGU7Ci0JSEFORExFIHNvdXJjZV9oYW5kbGU7Ci0JSEFORExFIHRhcmdldF9wcm9jZXNzX2hhbmRsZTsKLQlpbnQgZGVzaXJlZF9hY2Nlc3M7Ci0JaW50IGluaGVyaXRfaGFuZGxlOwotCWludCBvcHRpb25zID0gMDsKKyAgICBIQU5ETEUgc291cmNlX3Byb2Nlc3NfaGFuZGxlOworICAgIEhBTkRMRSBzb3VyY2VfaGFuZGxlOworICAgIEhBTkRMRSB0YXJnZXRfcHJvY2Vzc19oYW5kbGU7CisgICAgaW50IGRlc2lyZWRfYWNjZXNzOworICAgIGludCBpbmhlcml0X2hhbmRsZTsKKyAgICBpbnQgb3B0aW9ucyA9IDA7CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkgICAgICAgUFlfSEFORExFX1BBUkFNIFBZX0hBTkRMRV9QQVJBTSBQWV9IQU5ETEVfUEFSQU0KLQkJCSAgICAgICAiaWl8aTpEdXBsaWNhdGVIYW5kbGUiLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZV9wcm9jZXNzX2hhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VfaGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldF9wcm9jZXNzX2hhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkZXNpcmVkX2FjY2VzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICZpbmhlcml0X2hhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUFlfSEFORExFX1BBUkFNIFBZX0hBTkRMRV9QQVJBTSBQWV9IQU5ETEVfUEFSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpaXxpOkR1cGxpY2F0ZUhhbmRsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlX3Byb2Nlc3NfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0X3Byb2Nlc3NfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2lyZWRfYWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaGVyaXRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXN1bHQgPSBEdXBsaWNhdGVIYW5kbGUoCi0JCXNvdXJjZV9wcm9jZXNzX2hhbmRsZSwKLQkJc291cmNlX2hhbmRsZSwKLQkJdGFyZ2V0X3Byb2Nlc3NfaGFuZGxlLAotCQkmdGFyZ2V0X2hhbmRsZSwKLQkJZGVzaXJlZF9hY2Nlc3MsCi0JCWluaGVyaXRfaGFuZGxlLAotCQlvcHRpb25zCi0JKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXN1bHQgPSBEdXBsaWNhdGVIYW5kbGUoCisgICAgICAgIHNvdXJjZV9wcm9jZXNzX2hhbmRsZSwKKyAgICAgICAgc291cmNlX2hhbmRsZSwKKyAgICAgICAgdGFyZ2V0X3Byb2Nlc3NfaGFuZGxlLAorICAgICAgICAmdGFyZ2V0X2hhbmRsZSwKKyAgICAgICAgZGVzaXJlZF9hY2Nlc3MsCisgICAgICAgIGluaGVyaXRfaGFuZGxlLAorICAgICAgICBvcHRpb25zCisgICAgKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKCEgcmVzdWx0KQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIGlmICghIHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKIAotCXJldHVybiBzcF9oYW5kbGVfbmV3KHRhcmdldF9oYW5kbGUpOworICAgIHJldHVybiBzcF9oYW5kbGVfbmV3KHRhcmdldF9oYW5kbGUpOwogfQogCiBQeURvY19TVFJWQVIoQ3JlYXRlUGlwZV9kb2MsCkBAIC0yNjQsMjUgKzI2NCwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwX0NyZWF0ZVBpcGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUhBTkRMRSByZWFkX3BpcGU7Ci0JSEFORExFIHdyaXRlX3BpcGU7Ci0JQk9PTCByZXN1bHQ7CisgICAgSEFORExFIHJlYWRfcGlwZTsKKyAgICBIQU5ETEUgd3JpdGVfcGlwZTsKKyAgICBCT09MIHJlc3VsdDsKIAotCVB5T2JqZWN0KiBwaXBlX2F0dHJpYnV0ZXM7IC8qIGlnbm9yZWQgKi8KLQlpbnQgc2l6ZTsKKyAgICBQeU9iamVjdCogcGlwZV9hdHRyaWJ1dGVzOyAvKiBpZ25vcmVkICovCisgICAgaW50IHNpemU7CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpDcmVhdGVQaXBlIiwgJnBpcGVfYXR0cmlidXRlcywgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpDcmVhdGVQaXBlIiwgJnBpcGVfYXR0cmlidXRlcywgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXN1bHQgPSBDcmVhdGVQaXBlKCZyZWFkX3BpcGUsICZ3cml0ZV9waXBlLCBOVUxMLCBzaXplKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXN1bHQgPSBDcmVhdGVQaXBlKCZyZWFkX3BpcGUsICZ3cml0ZV9waXBlLCBOVUxMLCBzaXplKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKCEgcmVzdWx0KQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIGlmICghIHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKAotCQkiTk4iLCBzcF9oYW5kbGVfbmV3KHJlYWRfcGlwZSksIHNwX2hhbmRsZV9uZXcod3JpdGVfcGlwZSkpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKAorICAgICAgICAiTk4iLCBzcF9oYW5kbGVfbmV3KHJlYWRfcGlwZSksIHNwX2hhbmRsZV9uZXcod3JpdGVfcGlwZSkpOwogfQogCiAvKiBoZWxwZXJzIGZvciBjcmVhdGVwcm9jZXNzICovCkBAIC0yOTAsMTEwICsyOTAsMTEwIEBACiBzdGF0aWMgaW50CiBnZXRpbnQoUHlPYmplY3QqIG9iaiwgY2hhciogbmFtZSkKIHsKLQlQeU9iamVjdCogdmFsdWU7Ci0JaW50IHJldDsKKyAgICBQeU9iamVjdCogdmFsdWU7CisgICAgaW50IHJldDsKIAotCXZhbHVlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosIG5hbWUpOwotCWlmICghIHZhbHVlKSB7Ci0JCVB5RXJyX0NsZWFyKCk7IC8qIEZJWE1FOiBwcm9wYWdhdGUgZXJyb3I/ICovCi0JCXJldHVybiAwOwotCX0KLQlyZXQgPSAoaW50KSBQeUludF9Bc0xvbmcodmFsdWUpOwotCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JcmV0dXJuIHJldDsKKyAgICB2YWx1ZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCBuYW1lKTsKKyAgICBpZiAoISB2YWx1ZSkgeworICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBGSVhNRTogcHJvcGFnYXRlIGVycm9yPyAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0ID0gKGludCkgUHlJbnRfQXNMb25nKHZhbHVlKTsKKyAgICBQeV9ERUNSRUYodmFsdWUpOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBIQU5ETEUKIGdldGhhbmRsZShQeU9iamVjdCogb2JqLCBjaGFyKiBuYW1lKQogewotCXNwX2hhbmRsZV9vYmplY3QqIHZhbHVlOwotCUhBTkRMRSByZXQ7CisgICAgc3BfaGFuZGxlX29iamVjdCogdmFsdWU7CisgICAgSEFORExFIHJldDsKIAotCXZhbHVlID0gKHNwX2hhbmRsZV9vYmplY3QqKSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgbmFtZSk7Ci0JaWYgKCEgdmFsdWUpIHsKLQkJUHlFcnJfQ2xlYXIoKTsgLyogRklYTUU6IHByb3BhZ2F0ZSBlcnJvcj8gKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh2YWx1ZS0+b2JfdHlwZSAhPSAmc3BfaGFuZGxlX3R5cGUpCi0JCXJldCA9IE5VTEw7Ci0JZWxzZQotCQlyZXQgPSB2YWx1ZS0+aGFuZGxlOwotCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JcmV0dXJuIHJldDsKKyAgICB2YWx1ZSA9IChzcF9oYW5kbGVfb2JqZWN0KikgUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosIG5hbWUpOworICAgIGlmICghIHZhbHVlKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIEZJWE1FOiBwcm9wYWdhdGUgZXJyb3I/ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAodmFsdWUtPm9iX3R5cGUgIT0gJnNwX2hhbmRsZV90eXBlKQorICAgICAgICByZXQgPSBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gdmFsdWUtPmhhbmRsZTsKKyAgICBQeV9ERUNSRUYodmFsdWUpOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGdldGVudmlyb25tZW50KFB5T2JqZWN0KiBlbnZpcm9ubWVudCkKIHsKLQlpbnQgaSwgZW52c2l6ZTsKLQlQeU9iamVjdCogb3V0ID0gTlVMTDsKLQlQeU9iamVjdCoga2V5czsKLQlQeU9iamVjdCogdmFsdWVzOwotCWNoYXIqIHA7CisgICAgaW50IGksIGVudnNpemU7CisgICAgUHlPYmplY3QqIG91dCA9IE5VTEw7CisgICAgUHlPYmplY3QqIGtleXM7CisgICAgUHlPYmplY3QqIHZhbHVlczsKKyAgICBjaGFyKiBwOwogCi0JLyogY29udmVydCBlbnZpcm9ubWVudCBkaWN0aW9uYXJ5IHRvIHdpbmRvd3MgZW52aXJvbWVudCBzdHJpbmcgKi8KLQlpZiAoISBQeU1hcHBpbmdfQ2hlY2soZW52aXJvbm1lbnQpKSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJICAgIFB5RXhjX1R5cGVFcnJvciwgImVudmlyb25tZW50IG11c3QgYmUgZGljdGlvbmFyeSBvciBOb25lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBjb252ZXJ0IGVudmlyb25tZW50IGRpY3Rpb25hcnkgdG8gd2luZG93cyBlbnZpcm9tZW50IHN0cmluZyAqLworICAgIGlmICghIFB5TWFwcGluZ19DaGVjayhlbnZpcm9ubWVudCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLCAiZW52aXJvbm1lbnQgbXVzdCBiZSBkaWN0aW9uYXJ5IG9yIE5vbmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZW52c2l6ZSA9IFB5TWFwcGluZ19MZW5ndGgoZW52aXJvbm1lbnQpOworICAgIGVudnNpemUgPSBQeU1hcHBpbmdfTGVuZ3RoKGVudmlyb25tZW50KTsKIAotCWtleXMgPSBQeU1hcHBpbmdfS2V5cyhlbnZpcm9ubWVudCk7Ci0JdmFsdWVzID0gUHlNYXBwaW5nX1ZhbHVlcyhlbnZpcm9ubWVudCk7Ci0JaWYgKCFrZXlzIHx8ICF2YWx1ZXMpCi0JCWdvdG8gZXJyb3I7CisgICAga2V5cyA9IFB5TWFwcGluZ19LZXlzKGVudmlyb25tZW50KTsKKyAgICB2YWx1ZXMgPSBQeU1hcHBpbmdfVmFsdWVzKGVudmlyb25tZW50KTsKKyAgICBpZiAoIWtleXMgfHwgIXZhbHVlcykKKyAgICAgICAgZ290byBlcnJvcjsKIAotCW91dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDIwNDgpOwotCWlmICghIG91dCkKLQkJZ290byBlcnJvcjsKKyAgICBvdXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAyMDQ4KTsKKyAgICBpZiAoISBvdXQpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlwID0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCk7CisgICAgcCA9IFB5U3RyaW5nX0FTX1NUUklORyhvdXQpOwogCi0JZm9yIChpID0gMDsgaSA8IGVudnNpemU7IGkrKykgewotCQlpbnQga3NpemUsIHZzaXplLCB0b3RhbHNpemU7Ci0JCVB5T2JqZWN0KiBrZXkgPSBQeUxpc3RfR0VUX0lURU0oa2V5cywgaSk7Ci0JCVB5T2JqZWN0KiB2YWx1ZSA9IFB5TGlzdF9HRVRfSVRFTSh2YWx1ZXMsIGkpOworICAgIGZvciAoaSA9IDA7IGkgPCBlbnZzaXplOyBpKyspIHsKKyAgICAgICAgaW50IGtzaXplLCB2c2l6ZSwgdG90YWxzaXplOworICAgICAgICBQeU9iamVjdCoga2V5ID0gUHlMaXN0X0dFVF9JVEVNKGtleXMsIGkpOworICAgICAgICBQeU9iamVjdCogdmFsdWUgPSBQeUxpc3RfR0VUX0lURU0odmFsdWVzLCBpKTsKIAotCQlpZiAoISBQeVN0cmluZ19DaGVjayhrZXkpIHx8ICEgUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJlbnZpcm9ubWVudCBjYW4gb25seSBjb250YWluIHN0cmluZ3MiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJa3NpemUgPSBQeVN0cmluZ19HRVRfU0laRShrZXkpOwotCQl2c2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKTsKLQkJdG90YWxzaXplID0gKHAgLSBQeVN0cmluZ19BU19TVFJJTkcob3V0KSkgKyBrc2l6ZSArIDEgKwotCQkJCQkJCSAgICAgdnNpemUgKyAxICsgMTsKLQkJaWYgKHRvdGFsc2l6ZSA+IFB5U3RyaW5nX0dFVF9TSVpFKG91dCkpIHsKLQkJCWludCBvZmZzZXQgPSBwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCk7Ci0JCQlfUHlTdHJpbmdfUmVzaXplKCZvdXQsIHRvdGFsc2l6ZSArIDEwMjQpOwotCQkJcCA9IFB5U3RyaW5nX0FTX1NUUklORyhvdXQpICsgb2Zmc2V0OwotCQl9Ci0JCW1lbWNweShwLCBQeVN0cmluZ19BU19TVFJJTkcoa2V5KSwga3NpemUpOwotCQlwICs9IGtzaXplOwotCQkqcCsrID0gJz0nOwotCQltZW1jcHkocCwgUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSwgdnNpemUpOwotCQlwICs9IHZzaXplOwotCQkqcCsrID0gJ1wwJzsKLQl9CisgICAgICAgIGlmICghIFB5U3RyaW5nX0NoZWNrKGtleSkgfHwgISBQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImVudmlyb25tZW50IGNhbiBvbmx5IGNvbnRhaW4gc3RyaW5ncyIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBrc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGtleSk7CisgICAgICAgIHZzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUodmFsdWUpOworICAgICAgICB0b3RhbHNpemUgPSAocCAtIFB5U3RyaW5nX0FTX1NUUklORyhvdXQpKSArIGtzaXplICsgMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzaXplICsgMSArIDE7CisgICAgICAgIGlmICh0b3RhbHNpemUgPiBQeVN0cmluZ19HRVRfU0laRShvdXQpKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gcCAtIFB5U3RyaW5nX0FTX1NUUklORyhvdXQpOworICAgICAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmb3V0LCB0b3RhbHNpemUgKyAxMDI0KTsKKyAgICAgICAgICAgIHAgPSBQeVN0cmluZ19BU19TVFJJTkcob3V0KSArIG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocCwgUHlTdHJpbmdfQVNfU1RSSU5HKGtleSksIGtzaXplKTsKKyAgICAgICAgcCArPSBrc2l6ZTsKKyAgICAgICAgKnArKyA9ICc9JzsKKyAgICAgICAgbWVtY3B5KHAsIFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSksIHZzaXplKTsKKyAgICAgICAgcCArPSB2c2l6ZTsKKyAgICAgICAgKnArKyA9ICdcMCc7CisgICAgfQogCi0JLyogYWRkIHRyYWlsaW5nIG51bGwgYnl0ZSAqLwotCSpwKysgPSAnXDAnOwotCV9QeVN0cmluZ19SZXNpemUoJm91dCwgcCAtIFB5U3RyaW5nX0FTX1NUUklORyhvdXQpKTsKKyAgICAvKiBhZGQgdHJhaWxpbmcgbnVsbCBieXRlICovCisgICAgKnArKyA9ICdcMCc7CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmb3V0LCBwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCkpOwogCi0JLyogUHlPYmplY3RfUHJpbnQob3V0LCBzdGRvdXQsIDApOyAqLworICAgIC8qIFB5T2JqZWN0X1ByaW50KG91dCwgc3Rkb3V0LCAwKTsgKi8KIAotCVB5X1hERUNSRUYoa2V5cyk7Ci0JUHlfWERFQ1JFRih2YWx1ZXMpOworICAgIFB5X1hERUNSRUYoa2V5cyk7CisgICAgUHlfWERFQ1JFRih2YWx1ZXMpOwogCi0JcmV0dXJuIG91dDsKKyAgICByZXR1cm4gb3V0OwogCiAgZXJyb3I6Ci0JUHlfWERFQ1JFRihvdXQpOwotCVB5X1hERUNSRUYoa2V5cyk7Ci0JUHlfWERFQ1JFRih2YWx1ZXMpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYob3V0KTsKKyAgICBQeV9YREVDUkVGKGtleXMpOworICAgIFB5X1hERUNSRUYodmFsdWVzKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKENyZWF0ZVByb2Nlc3NfZG9jLApAQCAtNDExLDc3ICs0MTEsNzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcF9DcmVhdGVQcm9jZXNzKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlCT09MIHJlc3VsdDsKLQlQUk9DRVNTX0lORk9STUFUSU9OIHBpOwotCVNUQVJUVVBJTkZPIHNpOwotCVB5T2JqZWN0KiBlbnZpcm9ubWVudDsKKyAgICBCT09MIHJlc3VsdDsKKyAgICBQUk9DRVNTX0lORk9STUFUSU9OIHBpOworICAgIFNUQVJUVVBJTkZPIHNpOworICAgIFB5T2JqZWN0KiBlbnZpcm9ubWVudDsKIAotCWNoYXIqIGFwcGxpY2F0aW9uX25hbWU7Ci0JY2hhciogY29tbWFuZF9saW5lOwotCVB5T2JqZWN0KiBwcm9jZXNzX2F0dHJpYnV0ZXM7IC8qIGlnbm9yZWQgKi8KLQlQeU9iamVjdCogdGhyZWFkX2F0dHJpYnV0ZXM7IC8qIGlnbm9yZWQgKi8KLQlpbnQgaW5oZXJpdF9oYW5kbGVzOwotCWludCBjcmVhdGlvbl9mbGFnczsKLQlQeU9iamVjdCogZW52X21hcHBpbmc7Ci0JY2hhciogY3VycmVudF9kaXJlY3Rvcnk7Ci0JUHlPYmplY3QqIHN0YXJ0dXBfaW5mbzsKKyAgICBjaGFyKiBhcHBsaWNhdGlvbl9uYW1lOworICAgIGNoYXIqIGNvbW1hbmRfbGluZTsKKyAgICBQeU9iamVjdCogcHJvY2Vzc19hdHRyaWJ1dGVzOyAvKiBpZ25vcmVkICovCisgICAgUHlPYmplY3QqIHRocmVhZF9hdHRyaWJ1dGVzOyAvKiBpZ25vcmVkICovCisgICAgaW50IGluaGVyaXRfaGFuZGxlczsKKyAgICBpbnQgY3JlYXRpb25fZmxhZ3M7CisgICAgUHlPYmplY3QqIGVudl9tYXBwaW5nOworICAgIGNoYXIqIGN1cnJlbnRfZGlyZWN0b3J5OworICAgIFB5T2JqZWN0KiBzdGFydHVwX2luZm87CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6ek9PaWlPek86Q3JlYXRlUHJvY2VzcyIsCi0JCQkgICAgICAgJmFwcGxpY2F0aW9uX25hbWUsCi0JCQkgICAgICAgJmNvbW1hbmRfbGluZSwKLQkJCSAgICAgICAmcHJvY2Vzc19hdHRyaWJ1dGVzLAotCQkJICAgICAgICZ0aHJlYWRfYXR0cmlidXRlcywKLQkJCSAgICAgICAmaW5oZXJpdF9oYW5kbGVzLAotCQkJICAgICAgICZjcmVhdGlvbl9mbGFncywKLQkJCSAgICAgICAmZW52X21hcHBpbmcsCi0JCQkgICAgICAgJmN1cnJlbnRfZGlyZWN0b3J5LAotCQkJICAgICAgICZzdGFydHVwX2luZm8pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6ek9PaWlPek86Q3JlYXRlUHJvY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXBwbGljYXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY2Vzc19hdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRocmVhZF9hdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaGVyaXRfaGFuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGlvbl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnZfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50X2RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydHVwX2luZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVplcm9NZW1vcnkoJnNpLCBzaXplb2Yoc2kpKTsKLQlzaS5jYiA9IHNpemVvZihzaSk7CisgICAgWmVyb01lbW9yeSgmc2ksIHNpemVvZihzaSkpOworICAgIHNpLmNiID0gc2l6ZW9mKHNpKTsKIAotCS8qIG5vdGU6IHdlIG9ubHkgc3VwcG9ydCBhIHNtYWxsIHN1YnNldCBvZiBhbGwgU0kgYXR0cmlidXRlcyAqLwotCXNpLmR3RmxhZ3MgPSBnZXRpbnQoc3RhcnR1cF9pbmZvLCAiZHdGbGFncyIpOwotCXNpLndTaG93V2luZG93ID0gZ2V0aW50KHN0YXJ0dXBfaW5mbywgIndTaG93V2luZG93Iik7Ci0Jc2kuaFN0ZElucHV0ID0gZ2V0aGFuZGxlKHN0YXJ0dXBfaW5mbywgImhTdGRJbnB1dCIpOwotCXNpLmhTdGRPdXRwdXQgPSBnZXRoYW5kbGUoc3RhcnR1cF9pbmZvLCAiaFN0ZE91dHB1dCIpOwotCXNpLmhTdGRFcnJvciA9IGdldGhhbmRsZShzdGFydHVwX2luZm8sICJoU3RkRXJyb3IiKTsKKyAgICAvKiBub3RlOiB3ZSBvbmx5IHN1cHBvcnQgYSBzbWFsbCBzdWJzZXQgb2YgYWxsIFNJIGF0dHJpYnV0ZXMgKi8KKyAgICBzaS5kd0ZsYWdzID0gZ2V0aW50KHN0YXJ0dXBfaW5mbywgImR3RmxhZ3MiKTsKKyAgICBzaS53U2hvd1dpbmRvdyA9IGdldGludChzdGFydHVwX2luZm8sICJ3U2hvd1dpbmRvdyIpOworICAgIHNpLmhTdGRJbnB1dCA9IGdldGhhbmRsZShzdGFydHVwX2luZm8sICJoU3RkSW5wdXQiKTsKKyAgICBzaS5oU3RkT3V0cHV0ID0gZ2V0aGFuZGxlKHN0YXJ0dXBfaW5mbywgImhTdGRPdXRwdXQiKTsKKyAgICBzaS5oU3RkRXJyb3IgPSBnZXRoYW5kbGUoc3RhcnR1cF9pbmZvLCAiaFN0ZEVycm9yIik7CiAKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGVudl9tYXBwaW5nID09IFB5X05vbmUpCi0JCWVudmlyb25tZW50ID0gTlVMTDsKLQllbHNlIHsKLQkJZW52aXJvbm1lbnQgPSBnZXRlbnZpcm9ubWVudChlbnZfbWFwcGluZyk7Ci0JCWlmICghIGVudmlyb25tZW50KQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChlbnZfbWFwcGluZyA9PSBQeV9Ob25lKQorICAgICAgICBlbnZpcm9ubWVudCA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIGVudmlyb25tZW50ID0gZ2V0ZW52aXJvbm1lbnQoZW52X21hcHBpbmcpOworICAgICAgICBpZiAoISBlbnZpcm9ubWVudCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXN1bHQgPSBDcmVhdGVQcm9jZXNzKGFwcGxpY2F0aW9uX25hbWUsCi0JCQkgICAgICAgY29tbWFuZF9saW5lLAotCQkJICAgICAgIE5VTEwsCi0JCQkgICAgICAgTlVMTCwKLQkJCSAgICAgICBpbmhlcml0X2hhbmRsZXMsCi0JCQkgICAgICAgY3JlYXRpb25fZmxhZ3MsCi0JCQkgICAgICAgZW52aXJvbm1lbnQgPyBQeVN0cmluZ19BU19TVFJJTkcoZW52aXJvbm1lbnQpIDogTlVMTCwKLQkJCSAgICAgICBjdXJyZW50X2RpcmVjdG9yeSwKLQkJCSAgICAgICAmc2ksCi0JCQkgICAgICAgJnBpKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXN1bHQgPSBDcmVhdGVQcm9jZXNzKGFwcGxpY2F0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRfaGFuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgPyBQeVN0cmluZ19BU19TVFJJTkcoZW52aXJvbm1lbnQpIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JUHlfWERFQ1JFRihlbnZpcm9ubWVudCk7CisgICAgUHlfWERFQ1JFRihlbnZpcm9ubWVudCk7CiAKLQlpZiAoISByZXN1bHQpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CisgICAgaWYgKCEgcmVzdWx0KQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk5OaWkiLAotCQkJICAgICBzcF9oYW5kbGVfbmV3KHBpLmhQcm9jZXNzKSwKLQkJCSAgICAgc3BfaGFuZGxlX25ldyhwaS5oVGhyZWFkKSwKLQkJCSAgICAgcGkuZHdQcm9jZXNzSWQsCi0JCQkgICAgIHBpLmR3VGhyZWFkSWQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOTmlpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcF9oYW5kbGVfbmV3KHBpLmhQcm9jZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcF9oYW5kbGVfbmV3KHBpLmhUaHJlYWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBpLmR3UHJvY2Vzc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBpLmR3VGhyZWFkSWQpOwogfQogCiBQeURvY19TVFJWQVIoVGVybWluYXRlUHJvY2Vzc19kb2MsCkBAIC00OTIsMjEgKzQ5MiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwX1Rlcm1pbmF0ZVByb2Nlc3MoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUJPT0wgcmVzdWx0OworICAgIEJPT0wgcmVzdWx0OwogCi0JSEFORExFIHByb2Nlc3M7Ci0JaW50IGV4aXRfY29kZTsKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIFBZX0hBTkRMRV9QQVJBTSAiaTpUZXJtaW5hdGVQcm9jZXNzIiwKLQkJCSAgICAgICAmcHJvY2VzcywgJmV4aXRfY29kZSkpCi0JCXJldHVybiBOVUxMOworICAgIEhBTkRMRSBwcm9jZXNzOworICAgIGludCBleGl0X2NvZGU7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBQWV9IQU5ETEVfUEFSQU0gImk6VGVybWluYXRlUHJvY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY2VzcywgJmV4aXRfY29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gVGVybWluYXRlUHJvY2Vzcyhwcm9jZXNzLCBleGl0X2NvZGUpOworICAgIHJlc3VsdCA9IFRlcm1pbmF0ZVByb2Nlc3MocHJvY2VzcywgZXhpdF9jb2RlKTsKIAotCWlmICghIHJlc3VsdCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKKyAgICBpZiAoISByZXN1bHQpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoR2V0RXhpdENvZGVQcm9jZXNzX2RvYywKQEAgLTUxNywxOSArNTE3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3BfR2V0RXhpdENvZGVQcm9jZXNzKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlEV09SRCBleGl0X2NvZGU7Ci0JQk9PTCByZXN1bHQ7CisgICAgRFdPUkQgZXhpdF9jb2RlOworICAgIEJPT0wgcmVzdWx0OwogCi0JSEFORExFIHByb2Nlc3M7Ci0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBQWV9IQU5ETEVfUEFSQU0gIjpHZXRFeGl0Q29kZVByb2Nlc3MiLCAmcHJvY2VzcykpCi0JCXJldHVybiBOVUxMOworICAgIEhBTkRMRSBwcm9jZXNzOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgUFlfSEFORExFX1BBUkFNICI6R2V0RXhpdENvZGVQcm9jZXNzIiwgJnByb2Nlc3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IEdldEV4aXRDb2RlUHJvY2Vzcyhwcm9jZXNzLCAmZXhpdF9jb2RlKTsKKyAgICByZXN1bHQgPSBHZXRFeGl0Q29kZVByb2Nlc3MocHJvY2VzcywgJmV4aXRfY29kZSk7CiAKLQlpZiAoISByZXN1bHQpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CisgICAgaWYgKCEgcmVzdWx0KQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGV4aXRfY29kZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGV4aXRfY29kZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihXYWl0Rm9yU2luZ2xlT2JqZWN0X2RvYywKQEAgLTU0MiwyMyArNTQyLDIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3BfV2FpdEZvclNpbmdsZU9iamVjdChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JRFdPUkQgcmVzdWx0OworICAgIERXT1JEIHJlc3VsdDsKIAotCUhBTkRMRSBoYW5kbGU7Ci0JaW50IG1pbGxpc2Vjb25kczsKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIFBZX0hBTkRMRV9QQVJBTSAiaTpXYWl0Rm9yU2luZ2xlT2JqZWN0IiwKLQkgICAgICAgICAgICAgICAgICAJICAgICAmaGFuZGxlLAotCSAgICAgICAgICAgICAgICAgIAkgICAgICZtaWxsaXNlY29uZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBIQU5ETEUgaGFuZGxlOworICAgIGludCBtaWxsaXNlY29uZHM7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBQWV9IQU5ETEVfUEFSQU0gImk6V2FpdEZvclNpbmdsZU9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpc2Vjb25kcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QoaGFuZGxlLCAoRFdPUkQpIG1pbGxpc2Vjb25kcyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChoYW5kbGUsIChEV09SRCkgbWlsbGlzZWNvbmRzKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHJlc3VsdCA9PSBXQUlUX0ZBSUxFRCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKKyAgICBpZiAocmVzdWx0ID09IFdBSVRfRkFJTEVEKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChpbnQpIHJlc3VsdCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChpbnQpIHJlc3VsdCk7CiB9CiAKIFB5RG9jX1NUUlZBUihHZXRWZXJzaW9uX2RvYywKQEAgLTU2OSwxMCArNTY5LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3BfR2V0VmVyc2lvbihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldFZlcnNpb24iKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldFZlcnNpb24iKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGludCkgR2V0VmVyc2lvbigpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGludCkgR2V0VmVyc2lvbigpKTsKIH0KIAogUHlEb2NfU1RSVkFSKEdldE1vZHVsZUZpbGVOYW1lX2RvYywKQEAgLTU5MCw0MSArNTkwLDQxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3BfR2V0TW9kdWxlRmlsZU5hbWUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUJPT0wgcmVzdWx0OwotCUhNT0RVTEUgbW9kdWxlOwotCVRDSEFSIGZpbGVuYW1lW01BWF9QQVRIXTsKKyAgICBCT09MIHJlc3VsdDsKKyAgICBITU9EVUxFIG1vZHVsZTsKKyAgICBUQ0hBUiBmaWxlbmFtZVtNQVhfUEFUSF07CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIFBZX0hBTkRMRV9QQVJBTSAiOkdldE1vZHVsZUZpbGVOYW1lIiwKLQkJCSAgICAgICAmbW9kdWxlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBQWV9IQU5ETEVfUEFSQU0gIjpHZXRNb2R1bGVGaWxlTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kdWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXN1bHQgPSBHZXRNb2R1bGVGaWxlTmFtZShtb2R1bGUsIGZpbGVuYW1lLCBNQVhfUEFUSCk7Ci0JZmlsZW5hbWVbTUFYX1BBVEgtMV0gPSAnXDAnOworICAgIHJlc3VsdCA9IEdldE1vZHVsZUZpbGVOYW1lKG1vZHVsZSwgZmlsZW5hbWUsIE1BWF9QQVRIKTsKKyAgICBmaWxlbmFtZVtNQVhfUEFUSC0xXSA9ICdcMCc7CiAKLQlpZiAoISByZXN1bHQpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CisgICAgaWYgKCEgcmVzdWx0KQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOwogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHNwX2Z1bmN0aW9uc1tdID0gewotCXsiR2V0U3RkSGFuZGxlIiwgc3BfR2V0U3RkSGFuZGxlLCBNRVRIX1ZBUkFSR1MsIEdldFN0ZEhhbmRsZV9kb2N9LAotCXsiR2V0Q3VycmVudFByb2Nlc3MiLCBzcF9HZXRDdXJyZW50UHJvY2VzcywJTUVUSF9WQVJBUkdTLCAKLQkJCQkJCSAgR2V0Q3VycmVudFByb2Nlc3NfZG9jfSwKLQl7IkR1cGxpY2F0ZUhhbmRsZSIsCXNwX0R1cGxpY2F0ZUhhbmRsZSwJTUVUSF9WQVJBUkdTLCAKLQkJCQkJCUR1cGxpY2F0ZUhhbmRsZV9kb2N9LAotCXsiQ3JlYXRlUGlwZSIsIHNwX0NyZWF0ZVBpcGUsIE1FVEhfVkFSQVJHUywgQ3JlYXRlUGlwZV9kb2N9LAotCXsiQ3JlYXRlUHJvY2VzcyIsIHNwX0NyZWF0ZVByb2Nlc3MsIE1FVEhfVkFSQVJHUywgQ3JlYXRlUHJvY2Vzc19kb2N9LAotCXsiVGVybWluYXRlUHJvY2VzcyIsIHNwX1Rlcm1pbmF0ZVByb2Nlc3MsIE1FVEhfVkFSQVJHUywKLQkJCQkJCSBUZXJtaW5hdGVQcm9jZXNzX2RvY30sCi0JeyJHZXRFeGl0Q29kZVByb2Nlc3MiLCBzcF9HZXRFeGl0Q29kZVByb2Nlc3MsIE1FVEhfVkFSQVJHUywKLQkJCQkJCSAgIEdldEV4aXRDb2RlUHJvY2Vzc19kb2N9LAotCXsiV2FpdEZvclNpbmdsZU9iamVjdCIsIHNwX1dhaXRGb3JTaW5nbGVPYmplY3QsIE1FVEhfVkFSQVJHUywKLQkJCQkJCQlXYWl0Rm9yU2luZ2xlT2JqZWN0X2RvY30sCi0JeyJHZXRWZXJzaW9uIiwgc3BfR2V0VmVyc2lvbiwgTUVUSF9WQVJBUkdTLCBHZXRWZXJzaW9uX2RvY30sCi0JeyJHZXRNb2R1bGVGaWxlTmFtZSIsIHNwX0dldE1vZHVsZUZpbGVOYW1lLCBNRVRIX1ZBUkFSR1MsCi0JCQkJCQkgIEdldE1vZHVsZUZpbGVOYW1lX2RvY30sCi0Je05VTEwsIE5VTEx9CisgICAgeyJHZXRTdGRIYW5kbGUiLCBzcF9HZXRTdGRIYW5kbGUsIE1FVEhfVkFSQVJHUywgR2V0U3RkSGFuZGxlX2RvY30sCisgICAgeyJHZXRDdXJyZW50UHJvY2VzcyIsIHNwX0dldEN1cnJlbnRQcm9jZXNzLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2Vzc19kb2N9LAorICAgIHsiRHVwbGljYXRlSGFuZGxlIiwgICAgICAgICBzcF9EdXBsaWNhdGVIYW5kbGUsICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1cGxpY2F0ZUhhbmRsZV9kb2N9LAorICAgIHsiQ3JlYXRlUGlwZSIsIHNwX0NyZWF0ZVBpcGUsIE1FVEhfVkFSQVJHUywgQ3JlYXRlUGlwZV9kb2N9LAorICAgIHsiQ3JlYXRlUHJvY2VzcyIsIHNwX0NyZWF0ZVByb2Nlc3MsIE1FVEhfVkFSQVJHUywgQ3JlYXRlUHJvY2Vzc19kb2N9LAorICAgIHsiVGVybWluYXRlUHJvY2VzcyIsIHNwX1Rlcm1pbmF0ZVByb2Nlc3MsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlcm1pbmF0ZVByb2Nlc3NfZG9jfSwKKyAgICB7IkdldEV4aXRDb2RlUHJvY2VzcyIsIHNwX0dldEV4aXRDb2RlUHJvY2VzcywgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRFeGl0Q29kZVByb2Nlc3NfZG9jfSwKKyAgICB7IldhaXRGb3JTaW5nbGVPYmplY3QiLCBzcF9XYWl0Rm9yU2luZ2xlT2JqZWN0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdF9kb2N9LAorICAgIHsiR2V0VmVyc2lvbiIsIHNwX0dldFZlcnNpb24sIE1FVEhfVkFSQVJHUywgR2V0VmVyc2lvbl9kb2N9LAorICAgIHsiR2V0TW9kdWxlRmlsZU5hbWUiLCBzcF9HZXRNb2R1bGVGaWxlTmFtZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE1vZHVsZUZpbGVOYW1lX2RvY30sCisgICAge05VTEwsIE5VTEx9CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNjMyLDExICs2MzIsMTEgQEAKIHN0YXRpYyB2b2lkCiBkZWZpbnQoUHlPYmplY3QqIGQsIGNvbnN0IGNoYXIqIG5hbWUsIGludCB2YWx1ZSkKIHsKLQlQeU9iamVjdCogdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7Ci0JaWYgKHYpIHsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgKGNoYXIqKSBuYW1lLCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCX0KKyAgICBQeU9iamVjdCogdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7CisgICAgaWYgKHYpIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgKGNoYXIqKSBuYW1lLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIH0KIAogI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMzAwMDAKQEAgLTY0NiwyOCArNjQ2LDI4IEBACiAjZW5kaWYKIGluaXRfc3VicHJvY2VzcygpCiB7Ci0JUHlPYmplY3QgKmQ7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm07CiAKLQkvKiBwYXRjaCB1cCBvYmplY3QgZGVzY3JpcHRvcnMgKi8KLQlzcF9oYW5kbGVfdHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCXNwX2hhbmRsZV9hc19udW1iZXIubmJfaW50ID0gKHVuYXJ5ZnVuYykgc3BfaGFuZGxlX2FzX2ludDsKKyAgICAvKiBwYXRjaCB1cCBvYmplY3QgZGVzY3JpcHRvcnMgKi8KKyAgICBzcF9oYW5kbGVfdHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIHNwX2hhbmRsZV9hc19udW1iZXIubmJfaW50ID0gKHVuYXJ5ZnVuYykgc3BfaGFuZGxlX2FzX2ludDsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfc3VicHJvY2VzcyIsIHNwX2Z1bmN0aW9ucyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfc3VicHJvY2VzcyIsIHNwX2Z1bmN0aW9ucyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogCi0JLyogY29uc3RhbnRzICovCi0JZGVmaW50KGQsICJTVERfSU5QVVRfSEFORExFIiwgU1REX0lOUFVUX0hBTkRMRSk7Ci0JZGVmaW50KGQsICJTVERfT1VUUFVUX0hBTkRMRSIsIFNURF9PVVRQVVRfSEFORExFKTsKLQlkZWZpbnQoZCwgIlNURF9FUlJPUl9IQU5ETEUiLCBTVERfRVJST1JfSEFORExFKTsKLQlkZWZpbnQoZCwgIkRVUExJQ0FURV9TQU1FX0FDQ0VTUyIsIERVUExJQ0FURV9TQU1FX0FDQ0VTUyk7Ci0JZGVmaW50KGQsICJTVEFSVEZfVVNFU1RESEFORExFUyIsIFNUQVJURl9VU0VTVERIQU5ETEVTKTsKLQlkZWZpbnQoZCwgIlNUQVJURl9VU0VTSE9XV0lORE9XIiwgU1RBUlRGX1VTRVNIT1dXSU5ET1cpOwotCWRlZmludChkLCAiU1dfSElERSIsIFNXX0hJREUpOwotCWRlZmludChkLCAiSU5GSU5JVEUiLCBJTkZJTklURSk7Ci0JZGVmaW50KGQsICJXQUlUX09CSkVDVF8wIiwgV0FJVF9PQkpFQ1RfMCk7Ci0JZGVmaW50KGQsICJDUkVBVEVfTkVXX0NPTlNPTEUiLCBDUkVBVEVfTkVXX0NPTlNPTEUpOwotCWRlZmludChkLCAiQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQIiwgQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQKTsKKyAgICAvKiBjb25zdGFudHMgKi8KKyAgICBkZWZpbnQoZCwgIlNURF9JTlBVVF9IQU5ETEUiLCBTVERfSU5QVVRfSEFORExFKTsKKyAgICBkZWZpbnQoZCwgIlNURF9PVVRQVVRfSEFORExFIiwgU1REX09VVFBVVF9IQU5ETEUpOworICAgIGRlZmludChkLCAiU1REX0VSUk9SX0hBTkRMRSIsIFNURF9FUlJPUl9IQU5ETEUpOworICAgIGRlZmludChkLCAiRFVQTElDQVRFX1NBTUVfQUNDRVNTIiwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKKyAgICBkZWZpbnQoZCwgIlNUQVJURl9VU0VTVERIQU5ETEVTIiwgU1RBUlRGX1VTRVNUREhBTkRMRVMpOworICAgIGRlZmludChkLCAiU1RBUlRGX1VTRVNIT1dXSU5ET1ciLCBTVEFSVEZfVVNFU0hPV1dJTkRPVyk7CisgICAgZGVmaW50KGQsICJTV19ISURFIiwgU1dfSElERSk7CisgICAgZGVmaW50KGQsICJJTkZJTklURSIsIElORklOSVRFKTsKKyAgICBkZWZpbnQoZCwgIldBSVRfT0JKRUNUXzAiLCBXQUlUX09CSkVDVF8wKTsKKyAgICBkZWZpbnQoZCwgIkNSRUFURV9ORVdfQ09OU09MRSIsIENSRUFURV9ORVdfQ09OU09MRSk7CisgICAgZGVmaW50KGQsICJDUkVBVEVfTkVXX1BST0NFU1NfR1JPVVAiLCBDUkVBVEVfTkVXX1BST0NFU1NfR1JPVVApOwogfQpkaWZmIC0tZ2l0IGEvUEMvX3dpbnJlZy5jIGIvUEMvX3dpbnJlZy5jCmluZGV4IDU3ZmUyMmIuLjY4NzI2MDMgMTAwNjQ0Ci0tLSBhL1BDL193aW5yZWcuYworKysgYi9QQy9fd2lucmVnLmMKQEAgLTQsNyArNCw3IEBACiAgIFdpbmRvd3MgUmVnaXN0cnkgYWNjZXNzIG1vZHVsZSBmb3IgUHl0aG9uLgogCiAgICogU2ltcGxlIHJlZ2lzdHJ5IGFjY2VzcyB3cml0dGVuIGJ5IE1hcmsgSGFtbW9uZCBpbiB3aW4zMmFwaQotCW1vZHVsZSBjaXJjYSAxOTk1LgorICAgIG1vZHVsZSBjaXJjYSAxOTk1LgogICAqIEJpbGwgVHV0dCBleHBhbmRlZCB0aGUgc3VwcG9ydCBzaWduaWZpY2FudGx5IG5vdCBsb25nIGFmdGVyLgogICAqIE51bWVyb3VzIG90aGVyIHBlb3BsZSBoYXZlIHN1Ym1pdHRlZCBwYXRjaGVzIHNpbmNlIHRoZW4uCiAgICogUmlwcGVkIGZyb20gd2luMzJhcGkgbW9kdWxlIDAzLUZlYi0yMDAwIGJ5IE1hcmsgSGFtbW9uZCwgYW5kCkBAIC0yOSw3ICsyOSw3IEBACiAgICB3YW50IHRvIGxvc2UgdGhpcyBpbmZvLi4uCiAqLwogI2RlZmluZSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgZm5uYW1lKSBcCi0JUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIocmMpCisgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIocmMpCiAKIC8qIEZvcndhcmQgZGVjbGFyZXMgKi8KIApAQCAtMzg0LDggKzM4NCw4IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9WQVJfSEVBRAotCUhLRVkgaGtleTsKKyAgICBQeU9iamVjdF9WQVJfSEVBRAorICAgIEhLRVkgaGtleTsKIH0gUHlIS0VZT2JqZWN0OwogCiAjZGVmaW5lIFB5SEtFWV9DaGVjayhvcCkgKChvcCktPm9iX3R5cGUgPT0gJlB5SEtFWV9UeXBlKQpAQCAtMzk1LDQ2ICszOTUsNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYyhQeU9iamVjdCAqb2IpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZmFpbE1zZyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZmFpbE1zZyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiBzdGF0aWMgUHlPYmplY3QgKgogUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jKFB5T2JqZWN0ICpvYjEsIFB5T2JqZWN0ICpvYjIpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZmFpbE1zZyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZmFpbE1zZyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiBzdGF0aWMgUHlPYmplY3QgKgogUHlIS0VZX3Rlcm5hcnlGYWlsdXJlRnVuYyhQeU9iamVjdCAqb2IxLCBQeU9iamVjdCAqb2IyLCBQeU9iamVjdCAqb2IzKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGZhaWxNc2cpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGZhaWxNc2cpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAogUHlIS0VZX2RlYWxsb2NGdW5jKFB5T2JqZWN0ICpvYikKIHsKLQkvKiBDYW4gbm90IGNhbGwgUHlIS0VZX0Nsb3NlLCBhcyB0aGUgb2ItPnRwX3R5cGUKLQkgICBoYXMgYWxyZWFkeSBiZWVuIGNsZWFyZWQsIHRodXMgY2F1c2luZyB0aGUgdHlwZQotCSAgIGNoZWNrIHRvIGZhaWwhCi0JKi8KLQlQeUhLRVlPYmplY3QgKm9ia2V5ID0gKFB5SEtFWU9iamVjdCAqKW9iOwotCWlmIChvYmtleS0+aGtleSkKLQkJUmVnQ2xvc2VLZXkoKEhLRVkpb2JrZXktPmhrZXkpOwotCVB5T2JqZWN0X0RFTChvYik7CisgICAgLyogQ2FuIG5vdCBjYWxsIFB5SEtFWV9DbG9zZSwgYXMgdGhlIG9iLT50cF90eXBlCisgICAgICAgaGFzIGFscmVhZHkgYmVlbiBjbGVhcmVkLCB0aHVzIGNhdXNpbmcgdGhlIHR5cGUKKyAgICAgICBjaGVjayB0byBmYWlsIQorICAgICovCisgICAgUHlIS0VZT2JqZWN0ICpvYmtleSA9IChQeUhLRVlPYmplY3QgKilvYjsKKyAgICBpZiAob2JrZXktPmhrZXkpCisgICAgICAgIFJlZ0Nsb3NlS2V5KChIS0VZKW9ia2V5LT5oa2V5KTsKKyAgICBQeU9iamVjdF9ERUwob2IpOwogfQogCiBzdGF0aWMgaW50CiBQeUhLRVlfbm9uemVyb0Z1bmMoUHlPYmplY3QgKm9iKQogewotCXJldHVybiAoKFB5SEtFWU9iamVjdCAqKW9iKS0+aGtleSAhPSAwOworICAgIHJldHVybiAoKFB5SEtFWU9iamVjdCAqKW9iKS0+aGtleSAhPSAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlIS0VZX2ludEZ1bmMoUHlPYmplY3QgKm9iKQogewotCVB5SEtFWU9iamVjdCAqcHloa2V5ID0gKFB5SEtFWU9iamVjdCAqKW9iOwotCXJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIocHloa2V5LT5oa2V5KTsKKyAgICBQeUhLRVlPYmplY3QgKnB5aGtleSA9IChQeUhLRVlPYmplY3QgKilvYjsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHB5aGtleS0+aGtleSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQ0Miw3ICs0NDIsNyBAQAogewogICAgIFB5SEtFWU9iamVjdCAqcHloa2V5ID0gKFB5SEtFWU9iamVjdCAqKW9iOwogICAgIGZwcmludGYoZnAsICI8UHlIS0VZIGF0ICVwICglcCk+IiwKLSAgICAgICAgICAgIG9iLCBweWhrZXktPmhrZXkpOworICAgICAgICBvYiwgcHloa2V5LT5oa2V5KTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDU2LDQ3ICs0NTYsNDcgQEAKIHN0YXRpYyBpbnQKIFB5SEtFWV9jb21wYXJlRnVuYyhQeU9iamVjdCAqb2IxLCBQeU9iamVjdCAqb2IyKQogewotCVB5SEtFWU9iamVjdCAqcHloa2V5MSA9IChQeUhLRVlPYmplY3QgKilvYjE7Ci0JUHlIS0VZT2JqZWN0ICpweWhrZXkyID0gKFB5SEtFWU9iamVjdCAqKW9iMjsKLQlyZXR1cm4gcHloa2V5MSA9PSBweWhrZXkyID8gMCA6Ci0JCSAocHloa2V5MSA8IHB5aGtleTIgPyAtMSA6IDEpOworICAgIFB5SEtFWU9iamVjdCAqcHloa2V5MSA9IChQeUhLRVlPYmplY3QgKilvYjE7CisgICAgUHlIS0VZT2JqZWN0ICpweWhrZXkyID0gKFB5SEtFWU9iamVjdCAqKW9iMjsKKyAgICByZXR1cm4gcHloa2V5MSA9PSBweWhrZXkyID8gMCA6CisgICAgICAgICAocHloa2V5MSA8IHB5aGtleTIgPyAtMSA6IDEpOwogfQogCiBzdGF0aWMgbG9uZwogUHlIS0VZX2hhc2hGdW5jKFB5T2JqZWN0ICpvYikKIHsKLQkvKiBKdXN0IHVzZSB0aGUgYWRkcmVzcy4KLQkgICBYWFggLSBzaG91bGQgd2UgdXNlIHRoZSBoYW5kbGUgdmFsdWU/Ci0JKi8KLQlyZXR1cm4gX1B5X0hhc2hQb2ludGVyKG9iKTsKKyAgICAvKiBKdXN0IHVzZSB0aGUgYWRkcmVzcy4KKyAgICAgICBYWFggLSBzaG91bGQgd2UgdXNlIHRoZSBoYW5kbGUgdmFsdWU/CisgICAgKi8KKyAgICByZXR1cm4gX1B5X0hhc2hQb2ludGVyKG9iKTsKIH0KIAogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIFB5SEtFWV9OdW1iZXJNZXRob2RzID0KIHsKLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX2FkZCAqLwotCVB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywJLyogbmJfc3VidHJhY3QgKi8KLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX211bHRpcGx5ICovCi0JUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9kaXZpZGUgKi8KLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX3JlbWFpbmRlciAqLwotCVB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywJLyogbmJfZGl2bW9kICovCi0JUHlIS0VZX3Rlcm5hcnlGYWlsdXJlRnVuYywJLyogbmJfcG93ZXIgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfbmVnYXRpdmUgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfcG9zaXRpdmUgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfYWJzb2x1dGUgKi8KLQlQeUhLRVlfbm9uemVyb0Z1bmMsCQkvKiBuYl9ub256ZXJvICovCi0JUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX2ludmVydCAqLwotCVB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywJLyogbmJfbHNoaWZ0ICovCi0JUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9yc2hpZnQgKi8KLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX2FuZCAqLwotCVB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywJLyogbmJfeG9yICovCi0JUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9vciAqLwotCTAsCQkvKiBuYl9jb2VyY2UgKGFsbG93ZWQgdG8gYmUgemVybykgKi8KLQlQeUhLRVlfaW50RnVuYywJCQkvKiBuYl9pbnQgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfbG9uZyAqLwotCVB5SEtFWV91bmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9mbG9hdCAqLwotCVB5SEtFWV91bmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9vY3QgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfaGV4ICovCisgICAgUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAgLyogbmJfYWRkICovCisgICAgUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAgLyogbmJfc3VidHJhY3QgKi8KKyAgICBQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX2RpdmlkZSAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX3JlbWFpbmRlciAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIFB5SEtFWV90ZXJuYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgIC8qIG5iX3Bvd2VyICovCisgICAgUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAgLyogbmJfbmVnYXRpdmUgKi8KKyAgICBQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgIFB5SEtFWV91bmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAgIC8qIG5iX2Fic29sdXRlICovCisgICAgUHlIS0VZX25vbnplcm9GdW5jLCAgICAgICAgICAgICAgICAgLyogbmJfbm9uemVybyAqLworICAgIFB5SEtFWV91bmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAgIC8qIG5iX2ludmVydCAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX2xzaGlmdCAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX3JzaGlmdCAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX2FuZCAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX3hvciAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX29yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9jb2VyY2UgKGFsbG93ZWQgdG8gYmUgemVybykgKi8KKyAgICBQeUhLRVlfaW50RnVuYywgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnQgKi8KKyAgICBQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgICAvKiBuYl9sb25nICovCisgICAgUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAgLyogbmJfZmxvYXQgKi8KKyAgICBQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgICAvKiBuYl9vY3QgKi8KKyAgICBQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgICAvKiBuYl9oZXggKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqUHlIS0VZX0Nsb3NlTWV0aG9kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncyk7CkBAIC01MDUsNTAgKzUwNSw1MCBAQAogc3RhdGljIFB5T2JqZWN0ICpQeUhLRVlfRXhpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpOwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIFB5SEtFWV9tZXRob2RzW10gPSB7Ci0JeyJDbG9zZSIsICBQeUhLRVlfQ2xvc2VNZXRob2QsIE1FVEhfVkFSQVJHUywgUHlIS0VZX0Nsb3NlX2RvY30sCi0JeyJEZXRhY2giLCBQeUhLRVlfRGV0YWNoTWV0aG9kLCBNRVRIX1ZBUkFSR1MsIFB5SEtFWV9EZXRhY2hfZG9jfSwKLQl7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilQeUhLRVlfRW50ZXIsIE1FVEhfTk9BUkdTLCBOVUxMfSwKLQl7Il9fZXhpdF9fIiwgUHlIS0VZX0V4aXQsIE1FVEhfVkFSQVJHUywgTlVMTH0sCi0Je05VTEx9CisgICAgeyJDbG9zZSIsICBQeUhLRVlfQ2xvc2VNZXRob2QsIE1FVEhfVkFSQVJHUywgUHlIS0VZX0Nsb3NlX2RvY30sCisgICAgeyJEZXRhY2giLCBQeUhLRVlfRGV0YWNoTWV0aG9kLCBNRVRIX1ZBUkFSR1MsIFB5SEtFWV9EZXRhY2hfZG9jfSwKKyAgICB7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilQeUhLRVlfRW50ZXIsIE1FVEhfTk9BUkdTLCBOVUxMfSwKKyAgICB7Il9fZXhpdF9fIiwgUHlIS0VZX0V4aXQsIE1FVEhfVkFSQVJHUywgTlVMTH0sCisgICAge05VTEx9CiB9OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgUHlIS0VZX21lbWJlcmxpc3RbXSA9IHsKLQl7ImhhbmRsZSIsIFRfUFlTU0laRVQsIG9mZnNldG9mKFB5SEtFWU9iamVjdCwgaGtleSksIFJFQURPTkxZfSwKLQl7TlVMTH0gICAgLyogU2VudGluZWwgKi8KKyAgICB7ImhhbmRsZSIsIFRfUFlTU0laRVQsIG9mZnNldG9mKFB5SEtFWU9iamVjdCwgaGtleSksIFJFQURPTkxZfSwKKyAgICB7TlVMTH0gICAgLyogU2VudGluZWwgKi8KIH07CiAKIC8qIFRoZSB0eXBlIGl0c2VsZiAqLwogUHlUeXBlT2JqZWN0IFB5SEtFWV9UeXBlID0KIHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkgLyogZmlsbCBpbiB0eXBlIGF0IG1vZHVsZSBpbml0ICovCi0JIlB5SEtFWSIsCi0Jc2l6ZW9mKFB5SEtFWU9iamVjdCksCi0JMCwKLQlQeUhLRVlfZGVhbGxvY0Z1bmMsCQkvKiB0cF9kZWFsbG9jICovCi0JUHlIS0VZX3ByaW50RnVuYywJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQlQeUhLRVlfY29tcGFyZUZ1bmMsCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCSZQeUhLRVlfTnVtYmVyTWV0aG9kcywJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCVB5SEtFWV9oYXNoRnVuYywJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JUHlIS0VZX3N0ckZ1bmMsCQkJLyogdHBfc3RyICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCi0JUHlIS0VZX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCVB5SEtFWV9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQlQeUhLRVlfbWVtYmVybGlzdCwJCS8qIHRwX21lbWJlcnMgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkgLyogZmlsbCBpbiB0eXBlIGF0IG1vZHVsZSBpbml0ICovCisgICAgIlB5SEtFWSIsCisgICAgc2l6ZW9mKFB5SEtFWU9iamVjdCksCisgICAgMCwKKyAgICBQeUhLRVlfZGVhbGxvY0Z1bmMsICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgUHlIS0VZX3ByaW50RnVuYywgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIFB5SEtFWV9jb21wYXJlRnVuYywgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJlB5SEtFWV9OdW1iZXJNZXRob2RzLCAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgUHlIS0VZX2hhc2hGdW5jLCAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICBQeUhLRVlfc3RyRnVuYywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBQeUhLRVlfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIFB5SEtFWV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBQeUhLRVlfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01NTksMzkgKzU1OSwzOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5SEtFWV9DbG9zZU1ldGhvZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Q2xvc2UiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQ2xvc2Uoc2VsZikpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpDbG9zZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9DbG9zZShzZWxmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlIS0VZX0RldGFjaE1ldGhvZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jdm9pZCogcmV0OwotCVB5SEtFWU9iamVjdCAqcFRoaXMgPSAoUHlIS0VZT2JqZWN0ICopc2VsZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpEZXRhY2giKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0ID0gKHZvaWQqKXBUaGlzLT5oa2V5OwotCXBUaGlzLT5oa2V5ID0gMDsKLQlyZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHJldCk7CisgICAgdm9pZCogcmV0OworICAgIFB5SEtFWU9iamVjdCAqcFRoaXMgPSAoUHlIS0VZT2JqZWN0ICopc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpEZXRhY2giKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0ID0gKHZvaWQqKXBUaGlzLT5oa2V5OworICAgIHBUaGlzLT5oa2V5ID0gMDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHJldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUhLRVlfRW50ZXIoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlfWElOQ1JFRihzZWxmKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeV9YSU5DUkVGKHNlbGYpOworICAgIHJldHVybiBzZWxmOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlIS0VZX0V4aXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlIS0VZX0Nsb3NlKHNlbGYpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAoIVB5SEtFWV9DbG9zZShzZWxmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIApAQCAtNjAxLDc0ICs2MDEsNzQgQEAKIFB5T2JqZWN0ICoKIFB5SEtFWV9OZXcoSEtFWSBoSW5pdCkKIHsKLQlQeUhLRVlPYmplY3QgKmtleSA9IFB5T2JqZWN0X05FVyhQeUhLRVlPYmplY3QsICZQeUhLRVlfVHlwZSk7Ci0JaWYgKGtleSkKLQkJa2V5LT5oa2V5ID0gaEluaXQ7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWtleTsKKyAgICBQeUhLRVlPYmplY3QgKmtleSA9IFB5T2JqZWN0X05FVyhQeUhLRVlPYmplY3QsICZQeUhLRVlfVHlwZSk7CisgICAgaWYgKGtleSkKKyAgICAgICAga2V5LT5oa2V5ID0gaEluaXQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWtleTsKIH0KIAogQk9PTAogUHlIS0VZX0Nsb3NlKFB5T2JqZWN0ICpvYl9oYW5kbGUpCiB7Ci0JTE9ORyByYzsKLQlQeUhLRVlPYmplY3QgKmtleTsKKyAgICBMT05HIHJjOworICAgIFB5SEtFWU9iamVjdCAqa2V5OwogCi0JaWYgKCFQeUhLRVlfQ2hlY2sob2JfaGFuZGxlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIG9wZXJhbmQgdHlwZSIpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWtleSA9IChQeUhLRVlPYmplY3QgKilvYl9oYW5kbGU7Ci0JcmMgPSBrZXktPmhrZXkgPyBSZWdDbG9zZUtleSgoSEtFWSlrZXktPmhrZXkpIDogRVJST1JfU1VDQ0VTUzsKLQlrZXktPmhrZXkgPSAwOwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0Nsb3NlS2V5Iik7Ci0JcmV0dXJuIHJjID09IEVSUk9SX1NVQ0NFU1M7CisgICAgaWYgKCFQeUhLRVlfQ2hlY2sob2JfaGFuZGxlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIG9wZXJhbmQgdHlwZSIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGtleSA9IChQeUhLRVlPYmplY3QgKilvYl9oYW5kbGU7CisgICAgcmMgPSBrZXktPmhrZXkgPyBSZWdDbG9zZUtleSgoSEtFWSlrZXktPmhrZXkpIDogRVJST1JfU1VDQ0VTUzsKKyAgICBrZXktPmhrZXkgPSAwOworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0Nsb3NlS2V5Iik7CisgICAgcmV0dXJuIHJjID09IEVSUk9SX1NVQ0NFU1M7CiB9CiAKIEJPT0wKIFB5SEtFWV9Bc0hLRVkoUHlPYmplY3QgKm9iLCBIS0VZICpwSEFORExFLCBCT09MIGJOb25lT0spCiB7Ci0JaWYgKG9iID09IFB5X05vbmUpIHsKLQkJaWYgKCFiTm9uZU9LKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJICBQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAiTm9uZSBpcyBub3QgYSB2YWxpZCBIS0VZIGluIHRoaXMgY29udGV4dCIpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCSpwSEFORExFID0gKEhLRVkpMDsKLQl9Ci0JZWxzZSBpZiAoUHlIS0VZX0NoZWNrKG9iKSkgewotCQlQeUhLRVlPYmplY3QgKnBIID0gKFB5SEtFWU9iamVjdCAqKW9iOwotCQkqcEhBTkRMRSA9IHBILT5oa2V5OwotCX0KLQllbHNlIGlmIChQeUludF9DaGVjayhvYikgfHwgUHlMb25nX0NoZWNrKG9iKSkgewotCQkvKiBXZSBhbHNvIHN1cHBvcnQgaW50ZWdlcnMgKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJKnBIQU5ETEUgPSAoSEtFWSlQeUxvbmdfQXNWb2lkUHRyKG9iKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJIlRoZSBvYmplY3QgaXMgbm90IGEgUHlIS0VZIG9iamVjdCIpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCXJldHVybiBUUlVFOworICAgIGlmIChvYiA9PSBQeV9Ob25lKSB7CisgICAgICAgIGlmICghYk5vbmVPSykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAiTm9uZSBpcyBub3QgYSB2YWxpZCBIS0VZIGluIHRoaXMgY29udGV4dCIpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICpwSEFORExFID0gKEhLRVkpMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlIS0VZX0NoZWNrKG9iKSkgeworICAgICAgICBQeUhLRVlPYmplY3QgKnBIID0gKFB5SEtFWU9iamVjdCAqKW9iOworICAgICAgICAqcEhBTkRMRSA9IHBILT5oa2V5OworICAgIH0KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayhvYikgfHwgUHlMb25nX0NoZWNrKG9iKSkgeworICAgICAgICAvKiBXZSBhbHNvIHN1cHBvcnQgaW50ZWdlcnMgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgKnBIQU5ETEUgPSAoSEtFWSlQeUxvbmdfQXNWb2lkUHRyKG9iKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiVGhlIG9iamVjdCBpcyBub3QgYSBQeUhLRVkgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIFB5T2JqZWN0ICoKIFB5SEtFWV9Gcm9tSEtFWShIS0VZIGgpCiB7Ci0JUHlIS0VZT2JqZWN0ICpvcDsKKyAgICBQeUhLRVlPYmplY3QgKm9wOwogCi0JLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLwotCW9wID0gKFB5SEtFWU9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5SEtFWU9iamVjdCkpOwotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlQeU9iamVjdF9JTklUKG9wLCAmUHlIS0VZX1R5cGUpOwotCW9wLT5oa2V5ID0gaDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopb3A7CisgICAgLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLworICAgIG9wID0gKFB5SEtFWU9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5SEtFWU9iamVjdCkpOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeU9iamVjdF9JTklUKG9wLCAmUHlIS0VZX1R5cGUpOworICAgIG9wLT5oa2V5ID0gaDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb3A7CiB9CiAKIApAQCAtNjc4LDMyICs2NzgsMzIgQEAKIEJPT0wKIFB5V2luT2JqZWN0X0Nsb3NlSEtFWShQeU9iamVjdCAqb2JIYW5kbGUpCiB7Ci0JQk9PTCBvazsKLQlpZiAoUHlIS0VZX0NoZWNrKG9iSGFuZGxlKSkgewotCQlvayA9IFB5SEtFWV9DbG9zZShvYkhhbmRsZSk7Ci0JfQorICAgIEJPT0wgb2s7CisgICAgaWYgKFB5SEtFWV9DaGVjayhvYkhhbmRsZSkpIHsKKyAgICAgICAgb2sgPSBQeUhLRVlfQ2xvc2Uob2JIYW5kbGUpOworICAgIH0KICNpZiBTSVpFT0ZfTE9ORyA+PSBTSVpFT0ZfSEtFWQotCWVsc2UgaWYgKFB5SW50X0NoZWNrKG9iSGFuZGxlKSkgewotCQlsb25nIHJjID0gUmVnQ2xvc2VLZXkoKEhLRVkpUHlJbnRfQXNMb25nKG9iSGFuZGxlKSk7Ci0JCW9rID0gKHJjID09IEVSUk9SX1NVQ0NFU1MpOwotCQlpZiAoIW9rKQotCQkJUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdDbG9zZUtleSIpOwotCX0KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayhvYkhhbmRsZSkpIHsKKyAgICAgICAgbG9uZyByYyA9IFJlZ0Nsb3NlS2V5KChIS0VZKVB5SW50X0FzTG9uZyhvYkhhbmRsZSkpOworICAgICAgICBvayA9IChyYyA9PSBFUlJPUl9TVUNDRVNTKTsKKyAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnQ2xvc2VLZXkiKTsKKyAgICB9CiAjZWxzZQotCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhvYkhhbmRsZSkpIHsKLQkJbG9uZyByYyA9IFJlZ0Nsb3NlS2V5KChIS0VZKVB5TG9uZ19Bc1ZvaWRQdHIob2JIYW5kbGUpKTsKLQkJb2sgPSAocmMgPT0gRVJST1JfU1VDQ0VTUyk7Ci0JCWlmICghb2spCi0JCQlQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0Nsb3NlS2V5Iik7Ci0JfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayhvYkhhbmRsZSkpIHsKKyAgICAgICAgbG9uZyByYyA9IFJlZ0Nsb3NlS2V5KChIS0VZKVB5TG9uZ19Bc1ZvaWRQdHIob2JIYW5kbGUpKTsKKyAgICAgICAgb2sgPSAocmMgPT0gRVJST1JfU1VDQ0VTUyk7CisgICAgICAgIGlmICghb2spCisgICAgICAgICAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0Nsb3NlS2V5Iik7CisgICAgfQogI2VuZGlmCi0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCSJBIGhhbmRsZSBtdXN0IGJlIGEgSEtFWSBvYmplY3Qgb3IgYW4gaW50ZWdlciIpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCXJldHVybiBvazsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIkEgaGFuZGxlIG11c3QgYmUgYSBIS0VZIG9iamVjdCBvciBhbiBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIG9rOwogfQogCiAKQEAgLTcyMCwyOSArNzIwLDI5IEBACiBzdGF0aWMgdm9pZAogZml4dXBNdWx0aVNaKGNoYXIgKipzdHIsIGNoYXIgKmRhdGEsIGludCBsZW4pCiB7Ci0JY2hhciAqUDsKLQlpbnQgaTsKLQljaGFyICpROworICAgIGNoYXIgKlA7CisgICAgaW50IGk7CisgICAgY2hhciAqUTsKIAotCVEgPSBkYXRhICsgbGVuOwotCWZvciAoUCA9IGRhdGEsIGkgPSAwOyBQIDwgUSAmJiAqUCAhPSAnXDAnOyBQKyssIGkrKykgewotCQlzdHJbaV0gPSBQOwotCQlmb3IoOyAqUCAhPSAnXDAnOyBQKyspCi0JCQk7Ci0JfQorICAgIFEgPSBkYXRhICsgbGVuOworICAgIGZvciAoUCA9IGRhdGEsIGkgPSAwOyBQIDwgUSAmJiAqUCAhPSAnXDAnOyBQKyssIGkrKykgeworICAgICAgICBzdHJbaV0gPSBQOworICAgICAgICBmb3IoOyAqUCAhPSAnXDAnOyBQKyspCisgICAgICAgICAgICA7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBjb3VudFN0cmluZ3MoY2hhciAqZGF0YSwgaW50IGxlbikKIHsKLQlpbnQgc3RyaW5nczsKLQljaGFyICpQOwotCWNoYXIgKlEgPSBkYXRhICsgbGVuOworICAgIGludCBzdHJpbmdzOworICAgIGNoYXIgKlA7CisgICAgY2hhciAqUSA9IGRhdGEgKyBsZW47CiAKLQlmb3IgKFAgPSBkYXRhLCBzdHJpbmdzID0gMDsgUCA8IFEgJiYgKlAgIT0gJ1wwJzsgUCsrLCBzdHJpbmdzKyspCi0JCWZvciAoOyBQIDwgUSAmJiAqUCAhPSAnXDAnOyBQKyspCi0JCQk7Ci0JcmV0dXJuIHN0cmluZ3M7CisgICAgZm9yIChQID0gZGF0YSwgc3RyaW5ncyA9IDA7IFAgPCBRICYmICpQICE9ICdcMCc7IFArKywgc3RyaW5ncysrKQorICAgICAgICBmb3IgKDsgUCA8IFEgJiYgKlAgIT0gJ1wwJzsgUCsrKQorICAgICAgICAgICAgOworICAgIHJldHVybiBzdHJpbmdzOwogfQogCiAvKiBDb252ZXJ0IFB5T2JqZWN0IGludG8gUmVnaXN0cnkgZGF0YS4KQEAgLTc1MCwyNDQgKzc1MCwyNDQgQEAKIHN0YXRpYyBCT09MCiBQeTJSZWcoUHlPYmplY3QgKnZhbHVlLCBEV09SRCB0eXAsIEJZVEUgKipyZXREYXRhQnVmLCBEV09SRCAqcmV0RGF0YVNpemUpCiB7Ci0JUHlfc3NpemVfdCBpLGo7Ci0Jc3dpdGNoICh0eXApIHsKLQkJY2FzZSBSRUdfRFdPUkQ6Ci0JCQlpZiAodmFsdWUgIT0gUHlfTm9uZSAmJiAhUHlJbnRfQ2hlY2sodmFsdWUpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCSpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoRFdPUkQsIDEpOwotCQkJaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQkJCSpyZXREYXRhU2l6ZSA9IHNpemVvZihEV09SRCk7Ci0JCQlpZiAodmFsdWUgPT0gUHlfTm9uZSkgewotCQkJCURXT1JEIHplcm8gPSAwOwotCQkJCW1lbWNweSgqcmV0RGF0YUJ1ZiwgJnplcm8sIHNpemVvZihEV09SRCkpOwotCQkJfQotCQkJZWxzZQotCQkJCW1lbWNweSgqcmV0RGF0YUJ1ZiwKLQkJCQkgICAgICAgJlB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopdmFsdWUpLAotCQkJCSAgICAgICBzaXplb2YoRFdPUkQpKTsKLQkJCWJyZWFrOwotCQljYXNlIFJFR19TWjoKLQkJY2FzZSBSRUdfRVhQQU5EX1NaOgotCQkJewotCQkJaW50IG5lZWRfZGVjcmVmID0gMDsKLQkJCWlmICh2YWx1ZSA9PSBQeV9Ob25lKQotCQkJCSpyZXREYXRhU2l6ZSA9IDE7Ci0JCQllbHNlIHsKLQkJCQlpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCi0JCQkJCQkgICAgICB2YWx1ZSwKLQkJCQkJCSAgICAgICJtYmNzIiwKLQkJCQkJCSAgICAgIE5VTEwpOwotCQkJCQlpZiAodmFsdWU9PU5VTEwpCi0JCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJCW5lZWRfZGVjcmVmID0gMTsKLQkJCQl9Ci0JCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpCi0JCQkJCXJldHVybiBGQUxTRTsKLQkJCQkqcmV0RGF0YVNpemUgPSAxICsgc3RybGVuKAotCQkJCQlQeVN0cmluZ19BU19TVFJJTkcoCi0JCQkJCQkoUHlTdHJpbmdPYmplY3QgKil2YWx1ZSkpOwotCQkJfQotCQkJKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhEV09SRCwgKnJldERhdGFTaXplKTsKLQkJCWlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7Ci0JCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0JCQlpZiAodmFsdWUgPT0gUHlfTm9uZSkKLQkJCQlzdHJjcHkoKGNoYXIgKikqcmV0RGF0YUJ1ZiwgIiIpOwotCQkJZWxzZQotCQkJCXN0cmNweSgoY2hhciAqKSpyZXREYXRhQnVmLAotCQkJCSAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoCi0JCQkJICAgICAgIAkJKFB5U3RyaW5nT2JqZWN0ICopdmFsdWUpKTsKLQkJCWlmIChuZWVkX2RlY3JlZikKLQkJCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgUkVHX01VTFRJX1NaOgotCQkJewotCQkJCURXT1JEIHNpemUgPSAwOwotCQkJCWNoYXIgKlA7Ci0JCQkJUHlPYmplY3QgKipvYnMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaSxqOworICAgIHN3aXRjaCAodHlwKSB7CisgICAgICAgIGNhc2UgUkVHX0RXT1JEOgorICAgICAgICAgICAgaWYgKHZhbHVlICE9IFB5X05vbmUgJiYgIVB5SW50X0NoZWNrKHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKERXT1JELCAxKTsKKyAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcmV0RGF0YVNpemUgPSBzaXplb2YoRFdPUkQpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBEV09SRCB6ZXJvID0gMDsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKnJldERhdGFCdWYsICZ6ZXJvLCBzaXplb2YoRFdPUkQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZW1jcHkoKnJldERhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICZQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKXZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERXT1JEKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfU1o6CisgICAgICAgIGNhc2UgUkVHX0VYUEFORF9TWjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuZWVkX2RlY3JlZiA9IDA7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICAqcmV0RGF0YVNpemUgPSAxOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYmNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlPT1OVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICBuZWVkX2RlY3JlZiA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgKnJldERhdGFTaXplID0gMSArIHN0cmxlbigKKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgICAgICAgICAgKFB5U3RyaW5nT2JqZWN0ICopdmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoRFdPUkQsICpyZXREYXRhU2l6ZSk7CisgICAgICAgICAgICBpZiAoKnJldERhdGFCdWY9PU5VTEwpeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgc3RyY3B5KChjaGFyICopKnJldERhdGFCdWYsICIiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdHJjcHkoKGNoYXIgKikqcmV0RGF0YUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlTdHJpbmdPYmplY3QgKil2YWx1ZSkpOworICAgICAgICAgICAgaWYgKG5lZWRfZGVjcmVmKQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBSRUdfTVVMVElfU1o6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFdPUkQgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgY2hhciAqUDsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqKm9icyA9IE5VTEw7CiAKLQkJCQlpZiAodmFsdWUgPT0gUHlfTm9uZSkKLQkJCQkJaSA9IDA7Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICghUHlMaXN0X0NoZWNrKHZhbHVlKSkKLQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQkJaSA9IFB5TGlzdF9TaXplKHZhbHVlKTsKLQkJCQl9Ci0JCQkJb2JzID0gbWFsbG9jKHNpemVvZihQeU9iamVjdCAqKSAqIGkpOwotCQkJCW1lbXNldChvYnMsIDAsIHNpemVvZihQeU9iamVjdCAqKSAqIGkpOwotCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJewotCQkJCQlQeU9iamVjdCAqdDsKLQkJCQkJdCA9IFB5TGlzdF9HRVRfSVRFTSgKLQkJCQkJCShQeUxpc3RPYmplY3QgKil2YWx1ZSxqKTsKLQkJCQkJaWYgKFB5U3RyaW5nX0NoZWNrKHQpKSB7Ci0JCQkJCQlvYnNbal0gPSB0OwotCQkJCQkJUHlfSU5DUkVGKHQpOwotCQkJCQl9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh0KSkgewotCQkJCQkJb2JzW2pdID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZygKLQkJCQkJCQkJdCwKLQkJCQkJCQkJIm1iY3MiLAotCQkJCQkJCQlOVUxMKTsKLQkJCQkJCWlmIChvYnNbal09PU5VTEwpCi0JCQkJCQkJZ290byByZWdfbXVsdGlfZmFpbDsKLQkJCQkJfSBlbHNlCi0JCQkJCQlnb3RvIHJlZ19tdWx0aV9mYWlsOwotCQkJCQlzaXplICs9IDEgKyBzdHJsZW4oCi0JCQkJCQlQeVN0cmluZ19BU19TVFJJTkcoCi0JCQkJCQkJKFB5U3RyaW5nT2JqZWN0ICopb2JzW2pdKSk7Ci0JCQkJfQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUxpc3RfQ2hlY2sodmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICBpID0gUHlMaXN0X1NpemUodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvYnMgPSBtYWxsb2Moc2l6ZW9mKFB5T2JqZWN0ICopICogaSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG9icywgMCwgc2l6ZW9mKFB5T2JqZWN0ICopICogaSk7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0OworICAgICAgICAgICAgICAgICAgICB0ID0gUHlMaXN0X0dFVF9JVEVNKAorICAgICAgICAgICAgICAgICAgICAgICAgKFB5TGlzdE9iamVjdCAqKXZhbHVlLGopOworICAgICAgICAgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9ic1tqXSA9IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYodCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvYnNbal0gPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iY3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9ic1tqXT09TlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlZ19tdWx0aV9mYWlsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVnX211bHRpX2ZhaWw7CisgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gMSArIHN0cmxlbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlTdHJpbmdPYmplY3QgKilvYnNbal0pKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQkqcmV0RGF0YVNpemUgPSBzaXplICsgMTsKLQkJCQkqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKGNoYXIsCi0JCQkJCQkJICAgICAgICAqcmV0RGF0YVNpemUpOwotCQkJCWlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7Ci0JCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJCWdvdG8gcmVnX211bHRpX2ZhaWw7Ci0JCQkJfQotCQkJCVAgPSAoY2hhciAqKSpyZXREYXRhQnVmOworICAgICAgICAgICAgICAgICpyZXREYXRhU2l6ZSA9IHNpemUgKyAxOworICAgICAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXREYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byByZWdfbXVsdGlfZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUCA9IChjaGFyICopKnJldERhdGFCdWY7CiAKLQkJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQkJCXsKLQkJCQkJUHlPYmplY3QgKnQ7Ci0JCQkJCXQgPSBvYnNbal07Ci0JCQkJCXN0cmNweShQLAotCQkJCQkgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAotCQkJCQkgICAgICAgCQkoUHlTdHJpbmdPYmplY3QgKil0KSk7Ci0JCQkJCVAgKz0gMSArIHN0cmxlbigKLQkJCQkJCVB5U3RyaW5nX0FTX1NUUklORygKLQkJCQkJCQkoUHlTdHJpbmdPYmplY3QgKil0KSk7Ci0JCQkJCVB5X0RFQ1JFRihvYnNbal0pOwotCQkJCX0KLQkJCQkvKiBBbmQgZG91Ymx5LXRlcm1pbmF0ZSB0aGUgbGlzdC4uLiAqLwotCQkJCSpQID0gJ1wwJzsKLQkJCQlmcmVlKG9icyk7Ci0JCQkJYnJlYWs7Ci0JCQlyZWdfbXVsdGlfZmFpbDoKLQkJCQlpZiAob2JzKSB7Ci0JCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJCQlQeV9YREVDUkVGKG9ic1tqXSk7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0OworICAgICAgICAgICAgICAgICAgICB0ID0gb2JzW2pdOworICAgICAgICAgICAgICAgICAgICBzdHJjcHkoUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeVN0cmluZ09iamVjdCAqKXQpKTsKKyAgICAgICAgICAgICAgICAgICAgUCArPSAxICsgc3RybGVuKAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeVN0cmluZ09iamVjdCAqKXQpKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9ic1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEFuZCBkb3VibHktdGVybWluYXRlIHRoZSBsaXN0Li4uICovCisgICAgICAgICAgICAgICAgKlAgPSAnXDAnOworICAgICAgICAgICAgICAgIGZyZWUob2JzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJlZ19tdWx0aV9mYWlsOgorICAgICAgICAgICAgICAgIGlmIChvYnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYob2JzW2pdKTsKIAotCQkJCQlmcmVlKG9icyk7Ci0JCQkJfQotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQkJY2FzZSBSRUdfQklOQVJZOgotCQkvKiBBTFNPIGhhbmRsZSBBTEwgdW5rbm93biBkYXRhIHR5cGVzIGhlcmUuICBFdmVuIGlmIHdlIGNhbid0Ci0JCSAgIHN1cHBvcnQgaXQgbmF0aXZlbHksIHdlIHNob3VsZCBoYW5kbGUgdGhlIGJpdHMuICovCi0JCWRlZmF1bHQ6Ci0JCQlpZiAodmFsdWUgPT0gUHlfTm9uZSkKLQkJCQkqcmV0RGF0YVNpemUgPSAwOwotCQkJZWxzZSB7Ci0JCQkJdm9pZCAqc3JjX2J1ZjsKLQkJCQlQeUJ1ZmZlclByb2NzICpwYiA9IHZhbHVlLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JCQkJaWYgKHBiPT1OVUxMKSB7Ci0JCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkiT2JqZWN0cyBvZiB0eXBlICclcycgY2FuIG5vdCAiCi0JCQkJCQkiYmUgdXNlZCBhcyBiaW5hcnkgcmVnaXN0cnkgdmFsdWVzIiwKLQkJCQkJCXZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCX0KLQkJCQkqcmV0RGF0YVNpemUgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKSh2YWx1ZSwgMCwgJnNyY19idWYpOwotCQkJCSpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoY2hhciwKLQkJCQkJCQkJKnJldERhdGFTaXplKTsKLQkJCQlpZiAoKnJldERhdGFCdWY9PU5VTEwpewotCQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJfQotCQkJCW1lbWNweSgqcmV0RGF0YUJ1Ziwgc3JjX2J1ZiwgKnJldERhdGFTaXplKTsKLQkJCX0KLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShvYnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgUkVHX0JJTkFSWToKKyAgICAgICAgLyogQUxTTyBoYW5kbGUgQUxMIHVua25vd24gZGF0YSB0eXBlcyBoZXJlLiAgRXZlbiBpZiB3ZSBjYW4ndAorICAgICAgICAgICBzdXBwb3J0IGl0IG5hdGl2ZWx5LCB3ZSBzaG91bGQgaGFuZGxlIHRoZSBiaXRzLiAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgKnJldERhdGFTaXplID0gMDsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHZvaWQgKnNyY19idWY7CisgICAgICAgICAgICAgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSB2YWx1ZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgICAgICAgICAgICAgIGlmIChwYj09TlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdHMgb2YgdHlwZSAnJXMnIGNhbiBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJlIHVzZWQgYXMgYmluYXJ5IHJlZ2lzdHJ5IHZhbHVlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnJldERhdGFTaXplID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikodmFsdWUsIDAsICZzcmNfYnVmKTsKKyAgICAgICAgICAgICAgICAqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmV0RGF0YVNpemUpOworICAgICAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KCpyZXREYXRhQnVmLCBzcmNfYnVmLCAqcmV0RGF0YVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQogCiAvKiBDb252ZXJ0IFJlZ2lzdHJ5IGRhdGEgaW50byBQeU9iamVjdCovCiBzdGF0aWMgUHlPYmplY3QgKgogUmVnMlB5KGNoYXIgKnJldERhdGFCdWYsIERXT1JEIHJldERhdGFTaXplLCBEV09SRCB0eXApCiB7Ci0JUHlPYmplY3QgKm9iRGF0YTsKKyAgICBQeU9iamVjdCAqb2JEYXRhOwogCi0Jc3dpdGNoICh0eXApIHsKLQkJY2FzZSBSRUdfRFdPUkQ6Ci0JCQlpZiAocmV0RGF0YVNpemUgPT0gMCkKLQkJCQlvYkRhdGEgPSBQeV9CdWlsZFZhbHVlKCJpIiwgMCk7Ci0JCQllbHNlCi0JCQkJb2JEYXRhID0gUHlfQnVpbGRWYWx1ZSgiaSIsCi0JCQkJCQkgICAgICAgKihpbnQgKilyZXREYXRhQnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIFJFR19TWjoKLQkJY2FzZSBSRUdfRVhQQU5EX1NaOgotCQkJLyogcmV0RGF0YUJ1ZiBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgdHJhaWxpbmcgTlVMTCBpbgotCQkJICAgdGhlIGJ1ZmZlci4gKi8KLQkJCWlmIChyZXREYXRhU2l6ZSAmJiByZXREYXRhQnVmW3JldERhdGFTaXplLTFdID09ICdcMCcpCi0JCQkJLS1yZXREYXRhU2l6ZTsKLQkJCWlmIChyZXREYXRhU2l6ZSA9PTApCi0JCQkJcmV0RGF0YUJ1ZiA9ICIiOwotCQkJb2JEYXRhID0gUHlVbmljb2RlX0RlY29kZU1CQ1MocmV0RGF0YUJ1ZiwKLQkJCQkJCSAgICAgIHJldERhdGFTaXplLAotCQkJCQkJICAgICAgTlVMTCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRUdfTVVMVElfU1o6Ci0JCQlpZiAocmV0RGF0YVNpemUgPT0gMCkKLQkJCQlvYkRhdGEgPSBQeUxpc3RfTmV3KDApOwotCQkJZWxzZQotCQkJewotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJaW50IHMgPSBjb3VudFN0cmluZ3MocmV0RGF0YUJ1ZiwgcmV0RGF0YVNpemUpOwotCQkJCWNoYXIgKipzdHIgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikqcyk7Ci0JCQkJaWYgKHN0ciA9PSBOVUxMKQotCQkJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBzd2l0Y2ggKHR5cCkgeworICAgICAgICBjYXNlIFJFR19EV09SRDoKKyAgICAgICAgICAgIGlmIChyZXREYXRhU2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5X0J1aWxkVmFsdWUoImkiLCAwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeV9CdWlsZFZhbHVlKCJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50ICopcmV0RGF0YUJ1Zik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfU1o6CisgICAgICAgIGNhc2UgUkVHX0VYUEFORF9TWjoKKyAgICAgICAgICAgIC8qIHJldERhdGFCdWYgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHRyYWlsaW5nIE5VTEwgaW4KKyAgICAgICAgICAgICAgIHRoZSBidWZmZXIuICovCisgICAgICAgICAgICBpZiAocmV0RGF0YVNpemUgJiYgcmV0RGF0YUJ1ZltyZXREYXRhU2l6ZS0xXSA9PSAnXDAnKQorICAgICAgICAgICAgICAgIC0tcmV0RGF0YVNpemU7CisgICAgICAgICAgICBpZiAocmV0RGF0YVNpemUgPT0wKQorICAgICAgICAgICAgICAgIHJldERhdGFCdWYgPSAiIjsKKyAgICAgICAgICAgIG9iRGF0YSA9IFB5VW5pY29kZV9EZWNvZGVNQkNTKHJldERhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXREYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX01VTFRJX1NaOgorICAgICAgICAgICAgaWYgKHJldERhdGFTaXplID09IDApCisgICAgICAgICAgICAgICAgb2JEYXRhID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgICAgIGludCBzID0gY291bnRTdHJpbmdzKHJldERhdGFCdWYsIHJldERhdGFTaXplKTsKKyAgICAgICAgICAgICAgICBjaGFyICoqc3RyID0gKGNoYXIgKiopbWFsbG9jKHNpemVvZihjaGFyICopKnMpOworICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQkJCQlmaXh1cE11bHRpU1ooc3RyLCByZXREYXRhQnVmLCByZXREYXRhU2l6ZSk7Ci0JCQkJb2JEYXRhID0gUHlMaXN0X05ldyhzKTsKLQkJCQlpZiAob2JEYXRhID09IE5VTEwpCi0JCQkJCXJldHVybiBOVUxMOwotCQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHM7IGluZGV4KyspCi0JCQkJewotCQkJCQlzaXplX3QgbGVuID0gX21ic3RybGVuKHN0cltpbmRleF0pOwotCQkJCQlpZiAobGVuID4gSU5UX01BWCkgewotCQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCQkJInJlZ2lzdHJ5IHN0cmluZyBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7Ci0JCQkJCQlQeV9ERUNSRUYob2JEYXRhKTsKLQkJCQkJCXJldHVybiBOVUxMOwotCQkJCQl9Ci0JCQkJCVB5TGlzdF9TZXRJdGVtKG9iRGF0YSwKLQkJCQkJCSAgICAgICBpbmRleCwKLQkJCQkJCSAgICAgICBQeVVuaWNvZGVfRGVjb2RlTUJDUygKLQkJCQkJCSAgICAgICAgICAgIChjb25zdCBjaGFyICopc3RyW2luZGV4XSwKLQkJCQkJCQkgICAoaW50KWxlbiwKLQkJCQkJCQkgICAgTlVMTCkKLQkJCQkJCSAgICAgICApOwotCQkJCX0KLQkJCQlmcmVlKHN0cik7CisgICAgICAgICAgICAgICAgZml4dXBNdWx0aVNaKHN0ciwgcmV0RGF0YUJ1ZiwgcmV0RGF0YVNpemUpOworICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5TGlzdF9OZXcocyk7CisgICAgICAgICAgICAgICAgaWYgKG9iRGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzOyBpbmRleCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiA9IF9tYnN0cmxlbihzdHJbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RyeSBzdHJpbmcgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShvYkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfRGVjb2RlTUJDUygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXN0cltpbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmVlKHN0cik7CiAKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBSRUdfQklOQVJZOgotCQkvKiBBTFNPIGhhbmRsZSBBTEwgdW5rbm93biBkYXRhIHR5cGVzIGhlcmUuICBFdmVuIGlmIHdlIGNhbid0Ci0JCSAgIHN1cHBvcnQgaXQgbmF0aXZlbHksIHdlIHNob3VsZCBoYW5kbGUgdGhlIGJpdHMuICovCi0JCWRlZmF1bHQ6Ci0JCQlpZiAocmV0RGF0YVNpemUgPT0gMCkgewotCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCQlvYkRhdGEgPSBQeV9Ob25lOwotCQkJfQotCQkJZWxzZQotCQkJCW9iRGF0YSA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkJCQkJIAkgICAgICAgKGNoYXIgKilyZXREYXRhQnVmLAotCQkJCQkgCSAgICAgICByZXREYXRhU2l6ZSk7Ci0JCQlicmVhazsKLQl9Ci0JaWYgKG9iRGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBvYkRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgUkVHX0JJTkFSWToKKyAgICAgICAgLyogQUxTTyBoYW5kbGUgQUxMIHVua25vd24gZGF0YSB0eXBlcyBoZXJlLiAgRXZlbiBpZiB3ZSBjYW4ndAorICAgICAgICAgICBzdXBwb3J0IGl0IG5hdGl2ZWx5LCB3ZSBzaG91bGQgaGFuZGxlIHRoZSBiaXRzLiAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHJldERhdGFTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgb2JEYXRhID0gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXJldERhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXREYXRhU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG9iRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBvYkRhdGE7CiB9CiAKIC8qIFRoZSBQeXRob24gbWV0aG9kcyAqLwpAQCAtOTk1LDM0NCArOTk1LDM0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q2xvc2VLZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpvYktleTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86Q2xvc2VLZXkiLCAmb2JLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9DbG9zZShvYktleSkpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOkNsb3NlS2V5IiwgJm9iS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQ2xvc2Uob2JLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNvbm5lY3RSZWdpc3RyeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpzekNvbXBOYW1lID0gTlVMTDsKLQlIS0VZIHJldEtleTsKLQlsb25nIHJjOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiek86Q29ubmVjdFJlZ2lzdHJ5IiwgJnN6Q29tcE5hbWUsICZvYktleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gUmVnQ29ubmVjdFJlZ2lzdHJ5KHN6Q29tcE5hbWUsIGhLZXksICZyZXRLZXkpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKLQkJCQkJCQkgICAiQ29ubmVjdFJlZ2lzdHJ5Iik7Ci0JcmV0dXJuIFB5SEtFWV9Gcm9tSEtFWShyZXRLZXkpOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgY2hhciAqc3pDb21wTmFtZSA9IE5VTEw7CisgICAgSEtFWSByZXRLZXk7CisgICAgbG9uZyByYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInpPOkNvbm5lY3RSZWdpc3RyeSIsICZzekNvbXBOYW1lLCAmb2JLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ0Nvbm5lY3RSZWdpc3RyeShzekNvbXBOYW1lLCBoS2V5LCAmcmV0S2V5KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdFJlZ2lzdHJ5Iik7CisgICAgcmV0dXJuIFB5SEtFWV9Gcm9tSEtFWShyZXRLZXkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlDcmVhdGVLZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JY2hhciAqc3ViS2V5OwotCUhLRVkgcmV0S2V5OwotCWxvbmcgcmM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPejpDcmVhdGVLZXkiLCAmb2JLZXksICZzdWJLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOwotCXJjID0gUmVnQ3JlYXRlS2V5KGhLZXksIHN1YktleSwgJnJldEtleSk7Ci0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIkNyZWF0ZUtleSIpOwotCXJldHVybiBQeUhLRVlfRnJvbUhLRVkocmV0S2V5KTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnN1YktleTsKKyAgICBIS0VZIHJldEtleTsKKyAgICBsb25nIHJjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6Q3JlYXRlS2V5IiwgJm9iS2V5LCAmc3ViS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByYyA9IFJlZ0NyZWF0ZUtleShoS2V5LCBzdWJLZXksICZyZXRLZXkpOworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJDcmVhdGVLZXkiKTsKKyAgICByZXR1cm4gUHlIS0VZX0Zyb21IS0VZKHJldEtleSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNyZWF0ZUtleUV4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWNoYXIgKnN1YktleTsKLQlIS0VZIHJldEtleTsKLQlpbnQgcmVzID0gMDsKLQlSRUdTQU0gc2FtID0gS0VZX1dSSVRFOwotCWxvbmcgcmM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPenxpaTpDcmVhdGVLZXlFeCIsICZvYktleSwgJnN1YktleSwKLQkJCQkJCSAgJnJlcywgJnNhbSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBjaGFyICpzdWJLZXk7CisgICAgSEtFWSByZXRLZXk7CisgICAgaW50IHJlcyA9IDA7CisgICAgUkVHU0FNIHNhbSA9IEtFWV9XUklURTsKKyAgICBsb25nIHJjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3p8aWk6Q3JlYXRlS2V5RXgiLCAmb2JLZXksICZzdWJLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcywgJnNhbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyYyA9IFJlZ0NyZWF0ZUtleUV4KGhLZXksIHN1YktleSwgcmVzLCBOVUxMLCAoRFdPUkQpTlVMTCwgCi0JCQkJCQlzYW0sIE5VTEwsICZyZXRLZXksIE5VTEwpOwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJDcmVhdGVLZXlFeCIpOwotCXJldHVybiBQeUhLRVlfRnJvbUhLRVkocmV0S2V5KTsKKyAgICByYyA9IFJlZ0NyZWF0ZUtleUV4KGhLZXksIHN1YktleSwgcmVzLCBOVUxMLCAoRFdPUkQpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtLCBOVUxMLCAmcmV0S2V5LCBOVUxMKTsKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiQ3JlYXRlS2V5RXgiKTsKKyAgICByZXR1cm4gUHlIS0VZX0Zyb21IS0VZKHJldEtleSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeURlbGV0ZUtleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpzdWJLZXk7Ci0JbG9uZyByYzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zOkRlbGV0ZUtleSIsICZvYktleSwgJnN1YktleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmMgPSBSZWdEZWxldGVLZXkoaEtleSwgc3ViS2V5ICk7Ci0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0RlbGV0ZUtleSIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnN1YktleTsKKyAgICBsb25nIHJjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3M6RGVsZXRlS2V5IiwgJm9iS2V5LCAmc3ViS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByYyA9IFJlZ0RlbGV0ZUtleShoS2V5LCBzdWJLZXkgKTsKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnRGVsZXRlS2V5Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlEZWxldGVLZXlFeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQlITU9EVUxFIGhNb2Q7Ci0JdHlwZWRlZiBMT05HIChXSU5BUEkgKlJES0VGdW5jKShIS0VZLCBjb25zdCBjaGFyKiwgUkVHU0FNLCBpbnQpOwotCVJES0VGdW5jIHBmbiA9IE5VTEw7Ci0JY2hhciAqc3ViS2V5OwotCWxvbmcgcmM7Ci0JaW50IHJlcyA9IDA7Ci0JUkVHU0FNIHNhbSA9IEtFWV9XT1c2NF82NEtFWTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIEhNT0RVTEUgaE1vZDsKKyAgICB0eXBlZGVmIExPTkcgKFdJTkFQSSAqUkRLRUZ1bmMpKEhLRVksIGNvbnN0IGNoYXIqLCBSRUdTQU0sIGludCk7CisgICAgUkRLRUZ1bmMgcGZuID0gTlVMTDsKKyAgICBjaGFyICpzdWJLZXk7CisgICAgbG9uZyByYzsKKyAgICBpbnQgcmVzID0gMDsKKyAgICBSRUdTQU0gc2FtID0gS0VZX1dPVzY0XzY0S0VZOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPc3xpaTpEZWxldGVLZXlFeCIsCi0JCQkJCQkgICZvYktleSwgJnN1YktleSwgJnNhbSwgJnJlcykpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPc3xpaTpEZWxldGVLZXlFeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iS2V5LCAmc3ViS2V5LCAmc2FtLCAmcmVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIE9ubHkgYXZhaWxhYmxlIG9uIDY0Yml0IHBsYXRmb3Jtcywgc28gd2UgbXVzdCBsb2FkIGl0Ci0JICAgZHluYW1pY2FsbHkuICovCi0JaE1vZCA9IEdldE1vZHVsZUhhbmRsZSgiYWR2YXBpMzIuZGxsIik7Ci0JaWYgKGhNb2QpCi0JCXBmbiA9IChSREtFRnVuYylHZXRQcm9jQWRkcmVzcyhoTW9kLAotCQkJCQkJCQkJICAgIlJlZ0RlbGV0ZUtleUV4QSIpOwotCWlmICghcGZuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLAotCQkJCQkJIm5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSAoKnBmbikoaEtleSwgc3ViS2V5LCBzYW0sIHJlcyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAvKiBPbmx5IGF2YWlsYWJsZSBvbiA2NGJpdCBwbGF0Zm9ybXMsIHNvIHdlIG11c3QgbG9hZCBpdAorICAgICAgIGR5bmFtaWNhbGx5LiAqLworICAgIGhNb2QgPSBHZXRNb2R1bGVIYW5kbGUoImFkdmFwaTMyLmRsbCIpOworICAgIGlmIChoTW9kKQorICAgICAgICBwZm4gPSAoUkRLRUZ1bmMpR2V0UHJvY0FkZHJlc3MoaE1vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnRGVsZXRlS2V5RXhBIik7CisgICAgaWYgKCFwZm4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSAoKnBmbikoaEtleSwgc3ViS2V5LCBzYW0sIHJlcyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdEZWxldGVLZXlFeCIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnRGVsZXRlS2V5RXgiKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeURlbGV0ZVZhbHVlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWNoYXIgKnN1YktleTsKLQlsb25nIHJjOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6RGVsZXRlVmFsdWUiLCAmb2JLZXksICZzdWJLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9IFJlZ0RlbGV0ZVZhbHVlKGhLZXksIHN1YktleSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT1FUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCi0JCQkJCQkJICAgIlJlZ0RlbGV0ZVZhbHVlIik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgY2hhciAqc3ViS2V5OworICAgIGxvbmcgcmM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPejpEZWxldGVWYWx1ZSIsICZvYktleSwgJnN1YktleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gUmVnRGVsZXRlVmFsdWUoaEtleSwgc3ViS2V5KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPUVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdEZWxldGVWYWx1ZSIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5RW51bUtleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQlpbnQgaW5kZXg7Ci0JbG9uZyByYzsKLQlQeU9iamVjdCAqcmV0U3RyOwotCWNoYXIgdG1wYnVmWzI1Nl07IC8qIG1heCBrZXkgbmFtZSBsZW5ndGggaXMgMjU1ICovCi0JRFdPUkQgbGVuID0gc2l6ZW9mKHRtcGJ1Zik7IC8qIGluY2x1ZGVzIE5VTEwgdGVybWluYXRvciAqLworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgaW50IGluZGV4OworICAgIGxvbmcgcmM7CisgICAgUHlPYmplY3QgKnJldFN0cjsKKyAgICBjaGFyIHRtcGJ1ZlsyNTZdOyAvKiBtYXgga2V5IG5hbWUgbGVuZ3RoIGlzIDI1NSAqLworICAgIERXT1JEIGxlbiA9IHNpemVvZih0bXBidWYpOyAvKiBpbmNsdWRlcyBOVUxMIHRlcm1pbmF0b3IgKi8KIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6RW51bUtleSIsICZvYktleSwgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pOkVudW1LZXkiLCAmb2JLZXksICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSBSZWdFbnVtS2V5RXgoaEtleSwgaW5kZXgsIHRtcGJ1ZiwgJmxlbiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnRW51bUtleUV4Iik7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gUmVnRW51bUtleUV4KGhLZXksIGluZGV4LCB0bXBidWYsICZsZW4sIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0VudW1LZXlFeCIpOwogCi0JcmV0U3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodG1wYnVmLCBsZW4pOwotCXJldHVybiByZXRTdHI7ICAvKiBjYW4gYmUgTlVMTCAqLworICAgIHJldFN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHRtcGJ1ZiwgbGVuKTsKKyAgICByZXR1cm4gcmV0U3RyOyAgLyogY2FuIGJlIE5VTEwgKi8KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5RW51bVZhbHVlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWludCBpbmRleDsKLQlsb25nIHJjOwotCWNoYXIgKnJldFZhbHVlQnVmOwotCWNoYXIgKnJldERhdGFCdWY7Ci0JRFdPUkQgcmV0VmFsdWVTaXplOwotCURXT1JEIHJldERhdGFTaXplOwotCURXT1JEIHR5cDsKLQlQeU9iamVjdCAqb2JEYXRhOwotCVB5T2JqZWN0ICpyZXRWYWw7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBpbnQgaW5kZXg7CisgICAgbG9uZyByYzsKKyAgICBjaGFyICpyZXRWYWx1ZUJ1ZjsKKyAgICBjaGFyICpyZXREYXRhQnVmOworICAgIERXT1JEIHJldFZhbHVlU2l6ZTsKKyAgICBEV09SRCByZXREYXRhU2l6ZTsKKyAgICBEV09SRCB0eXA7CisgICAgUHlPYmplY3QgKm9iRGF0YTsKKyAgICBQeU9iamVjdCAqcmV0VmFsOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpFbnVtVmFsdWUiLCAmb2JLZXksICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpFbnVtVmFsdWUiLCAmb2JLZXksICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKHJjID0gUmVnUXVlcnlJbmZvS2V5KGhLZXksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJICBOVUxMLAotCQkJCSAgJnJldFZhbHVlU2l6ZSwgJnJldERhdGFTaXplLCBOVUxMLCBOVUxMKSkKLQkgICAgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJSZWdRdWVyeUluZm9LZXkiKTsKLQkrK3JldFZhbHVlU2l6ZTsgICAgLyogaW5jbHVkZSBudWxsIHRlcm1pbmF0b3JzICovCi0JKytyZXREYXRhU2l6ZTsKLQlyZXRWYWx1ZUJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKHJldFZhbHVlU2l6ZSk7Ci0JaWYgKHJldFZhbHVlQnVmID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCXJldERhdGFCdWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhyZXREYXRhU2l6ZSk7Ci0JaWYgKHJldERhdGFCdWYgPT0gTlVMTCkgewotCQlQeU1lbV9GcmVlKHJldFZhbHVlQnVmKTsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQorICAgIGlmICgocmMgPSBSZWdRdWVyeUluZm9LZXkoaEtleSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0VmFsdWVTaXplLCAmcmV0RGF0YVNpemUsIE5VTEwsIE5VTEwpKQorICAgICAgICAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlJbmZvS2V5Iik7CisgICAgKytyZXRWYWx1ZVNpemU7ICAgIC8qIGluY2x1ZGUgbnVsbCB0ZXJtaW5hdG9ycyAqLworICAgICsrcmV0RGF0YVNpemU7CisgICAgcmV0VmFsdWVCdWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhyZXRWYWx1ZVNpemUpOworICAgIGlmIChyZXRWYWx1ZUJ1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICByZXREYXRhQnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2MocmV0RGF0YVNpemUpOworICAgIGlmIChyZXREYXRhQnVmID09IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fRnJlZShyZXRWYWx1ZUJ1Zik7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9IFJlZ0VudW1WYWx1ZShoS2V5LAotCQkJICBpbmRleCwKLQkJCSAgcmV0VmFsdWVCdWYsCi0JCQkgICZyZXRWYWx1ZVNpemUsCi0JCQkgIE5VTEwsCi0JCQkgICZ0eXAsCi0JCQkgIChCWVRFICopcmV0RGF0YUJ1ZiwKLQkJCSAgJnJldERhdGFTaXplKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ0VudW1WYWx1ZShoS2V5LAorICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIHJldFZhbHVlQnVmLAorICAgICAgICAgICAgICAgICAgICAgICZyZXRWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAmdHlwLAorICAgICAgICAgICAgICAgICAgICAgIChCWVRFICopcmV0RGF0YUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAmcmV0RGF0YVNpemUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykgewotCQlyZXRWYWwgPSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKLQkJCQkJCQkgICAgICJQeVJlZ0VudW1WYWx1ZSIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCW9iRGF0YSA9IFJlZzJQeShyZXREYXRhQnVmLCByZXREYXRhU2l6ZSwgdHlwKTsKLQlpZiAob2JEYXRhID09IE5VTEwpIHsKLQkJcmV0VmFsID0gTlVMTDsKLQkJZ290byBmYWlsOwotCX0KLQlyZXRWYWwgPSBQeV9CdWlsZFZhbHVlKCJzT2kiLCByZXRWYWx1ZUJ1Ziwgb2JEYXRhLCB0eXApOwotCVB5X0RFQ1JFRihvYkRhdGEpOworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIHJldFZhbCA9IFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHlSZWdFbnVtVmFsdWUiKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBvYkRhdGEgPSBSZWcyUHkocmV0RGF0YUJ1ZiwgcmV0RGF0YVNpemUsIHR5cCk7CisgICAgaWYgKG9iRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldFZhbCA9IE5VTEw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcmV0VmFsID0gUHlfQnVpbGRWYWx1ZSgic09pIiwgcmV0VmFsdWVCdWYsIG9iRGF0YSwgdHlwKTsKKyAgICBQeV9ERUNSRUYob2JEYXRhKTsKICAgZmFpbDoKLQlQeU1lbV9GcmVlKHJldFZhbHVlQnVmKTsKLQlQeU1lbV9GcmVlKHJldERhdGFCdWYpOwotCXJldHVybiByZXRWYWw7CisgICAgUHlNZW1fRnJlZShyZXRWYWx1ZUJ1Zik7CisgICAgUHlNZW1fRnJlZShyZXREYXRhQnVmKTsKKyAgICByZXR1cm4gcmV0VmFsOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X1VOSUNPREUgKnJldFZhbHVlID0gTlVMTDsKLQlQeV9VTklDT0RFICpzcmM7Ci0JRFdPUkQgcmV0VmFsdWVTaXplOwotCURXT1JEIHJjOwotCVB5T2JqZWN0ICpvOworICAgIFB5X1VOSUNPREUgKnJldFZhbHVlID0gTlVMTDsKKyAgICBQeV9VTklDT0RFICpzcmM7CisgICAgRFdPUkQgcmV0VmFsdWVTaXplOworICAgIERXT1JEIHJjOworICAgIFB5T2JqZWN0ICpvOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1OkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyIsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInU6RXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzIiwgJnNyYykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0VmFsdWVTaXplID0gRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzVyhzcmMsIHJldFZhbHVlLCAwKTsKLQlpZiAocmV0VmFsdWVTaXplID09IDApIHsKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJldFZhbHVlU2l6ZSwKLQkJCQkJCSJFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiKTsKLQl9Ci0JcmV0VmFsdWUgPSAoUHlfVU5JQ09ERSAqKVB5TWVtX01hbGxvYyhyZXRWYWx1ZVNpemUgKiBzaXplb2YoUHlfVU5JQ09ERSkpOwotCWlmIChyZXRWYWx1ZSA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KKyAgICByZXRWYWx1ZVNpemUgPSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NXKHNyYywgcmV0VmFsdWUsIDApOworICAgIGlmIChyZXRWYWx1ZVNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmV0VmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiKTsKKyAgICB9CisgICAgcmV0VmFsdWUgPSAoUHlfVU5JQ09ERSAqKVB5TWVtX01hbGxvYyhyZXRWYWx1ZVNpemUgKiBzaXplb2YoUHlfVU5JQ09ERSkpOworICAgIGlmIChyZXRWYWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KIAotCXJjID0gRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzVyhzcmMsIHJldFZhbHVlLCByZXRWYWx1ZVNpemUpOwotCWlmIChyYyA9PSAwKSB7Ci0JCVB5TWVtX0ZyZWUocmV0VmFsdWUpOwotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmV0VmFsdWVTaXplLAotCQkJCQkJIkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyIpOwotCX0KLQlvID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHJldFZhbHVlLCB3Y3NsZW4ocmV0VmFsdWUpKTsKLQlQeU1lbV9GcmVlKHJldFZhbHVlKTsKLQlyZXR1cm4gbzsKKyAgICByYyA9IEV4cGFuZEVudmlyb25tZW50U3RyaW5nc1coc3JjLCByZXRWYWx1ZSwgcmV0VmFsdWVTaXplKTsKKyAgICBpZiAocmMgPT0gMCkgeworICAgICAgICBQeU1lbV9GcmVlKHJldFZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJldFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzIik7CisgICAgfQorICAgIG8gPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUocmV0VmFsdWUsIHdjc2xlbihyZXRWYWx1ZSkpOworICAgIFB5TWVtX0ZyZWUocmV0VmFsdWUpOworICAgIHJldHVybiBvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlGbHVzaEtleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQlsb25nIHJjOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpGbHVzaEtleSIsICZvYktleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gUmVnRmx1c2hLZXkoaEtleSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnRmx1c2hLZXkiKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBsb25nIHJjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpGbHVzaEtleSIsICZvYktleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gUmVnRmx1c2hLZXkoaEtleSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnRmx1c2hLZXkiKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiBzdGF0aWMgUHlPYmplY3QgKgogUHlMb2FkS2V5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWNoYXIgKnN1YktleTsKLQljaGFyICpmaWxlTmFtZTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnN1YktleTsKKyAgICBjaGFyICpmaWxlTmFtZTsKIAotCWxvbmcgcmM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPc3M6TG9hZEtleSIsICZvYktleSwgJnN1YktleSwgJmZpbGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSBSZWdMb2FkS2V5KGhLZXksIHN1YktleSwgZmlsZU5hbWUgKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdMb2FkS2V5Iik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgcmM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPc3M6TG9hZEtleSIsICZvYktleSwgJnN1YktleSwgJmZpbGVOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBSZWdMb2FkS2V5KGhLZXksIHN1YktleSwgZmlsZU5hbWUgKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdMb2FkS2V5Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlPcGVuS2V5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CiAKLQljaGFyICpzdWJLZXk7Ci0JaW50IHJlcyA9IDA7Ci0JSEtFWSByZXRLZXk7Ci0JbG9uZyByYzsKLQlSRUdTQU0gc2FtID0gS0VZX1JFQUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPenxpaTpPcGVuS2V5IiwgJm9iS2V5LCAmc3ViS2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzLCAmc2FtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjaGFyICpzdWJLZXk7CisgICAgaW50IHJlcyA9IDA7CisgICAgSEtFWSByZXRLZXk7CisgICAgbG9uZyByYzsKKyAgICBSRUdTQU0gc2FtID0gS0VZX1JFQUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPenxpaTpPcGVuS2V5IiwgJm9iS2V5LCAmc3ViS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzLCAmc2FtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9IFJlZ09wZW5LZXlFeChoS2V5LCBzdWJLZXksIHJlcywgc2FtLCAmcmV0S2V5KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdPcGVuS2V5RXgiKTsKLQlyZXR1cm4gUHlIS0VZX0Zyb21IS0VZKHJldEtleSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gUmVnT3BlbktleUV4KGhLZXksIHN1YktleSwgcmVzLCBzYW0sICZyZXRLZXkpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ09wZW5LZXlFeCIpOworICAgIHJldHVybiBQeUhLRVlfRnJvbUhLRVkocmV0S2V5KTsKIH0KIAogCkBAIC0xMzQ4LDE4ICsxMzQ4LDE4IEBACiAgIFB5T2JqZWN0ICpsOwogICBQeU9iamVjdCAqcmV0OwogICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86UXVlcnlJbmZvS2V5IiwgJm9iS2V5KSkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICBpZiAoKHJjID0gUmVnUXVlcnlJbmZvS2V5KGhLZXksIE5VTEwsIE5VTEwsIDAsICZuU3ViS2V5cywgTlVMTCwgTlVMTCwKLQkJCSAgICAmblZhbHVlcywgIE5VTEwsICBOVUxMLCBOVUxMLCAmZnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuVmFsdWVzLCAgTlVMTCwgIE5VTEwsIE5VTEwsICZmdCkpCiAgICAgICAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ1F1ZXJ5SW5mb0tleSIpOworICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ1F1ZXJ5SW5mb0tleSIpOwogICBsaS5Mb3dQYXJ0ID0gZnQuZHdMb3dEYXRlVGltZTsKICAgbGkuSGlnaFBhcnQgPSBmdC5kd0hpZ2hEYXRlVGltZTsKICAgbCA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcobGkuUXVhZFBhcnQpOwogICBpZiAobCA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICByZXQgPSBQeV9CdWlsZFZhbHVlKCJpaU8iLCBuU3ViS2V5cywgblZhbHVlcywgbCk7CiAgIFB5X0RFQ1JFRihsKTsKICAgcmV0dXJuIHJldDsKQEAgLTEzNjgsMzM4ICsxMzY4LDMzOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5UXVlcnlWYWx1ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpzdWJLZXk7Ci0JbG9uZyByYzsKLQlQeU9iamVjdCAqcmV0U3RyOwotCWNoYXIgKnJldEJ1ZjsKLQlsb25nIGJ1ZlNpemUgPSAwOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgY2hhciAqc3ViS2V5OworICAgIGxvbmcgcmM7CisgICAgUHlPYmplY3QgKnJldFN0cjsKKyAgICBjaGFyICpyZXRCdWY7CisgICAgbG9uZyBidWZTaXplID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6UXVlcnlWYWx1ZSIsICZvYktleSwgJnN1YktleSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6UXVlcnlWYWx1ZSIsICZvYktleSwgJnN1YktleSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHJjID0gUmVnUXVlcnlWYWx1ZShoS2V5LCBzdWJLZXksIE5VTEwsICZidWZTaXplKSkKLQkgICAgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJSZWdRdWVyeVZhbHVlIik7Ci0JcmV0U3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnVmU2l6ZSk7Ci0JaWYgKHJldFN0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXRCdWYgPSBQeVN0cmluZ19BU19TVFJJTkcocmV0U3RyKTsKLQlpZiAoKHJjID0gUmVnUXVlcnlWYWx1ZShoS2V5LCBzdWJLZXksIHJldEJ1ZiwgJmJ1ZlNpemUpKQotCSAgICAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0JCVB5X0RFQ1JFRihyZXRTdHIpOwotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCi0JCQkJCQkJICAgIlJlZ1F1ZXJ5VmFsdWUiKTsKLQl9Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0U3RyLCBzdHJsZW4ocmV0QnVmKSk7Ci0JcmV0dXJuIHJldFN0cjsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgocmMgPSBSZWdRdWVyeVZhbHVlKGhLZXksIHN1YktleSwgTlVMTCwgJmJ1ZlNpemUpKQorICAgICAgICAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlWYWx1ZSIpOworICAgIHJldFN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZlNpemUpOworICAgIGlmIChyZXRTdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0QnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJldFN0cik7CisgICAgaWYgKChyYyA9IFJlZ1F1ZXJ5VmFsdWUoaEtleSwgc3ViS2V5LCByZXRCdWYsICZidWZTaXplKSkKKyAgICAgICAgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBQeV9ERUNSRUYocmV0U3RyKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ1F1ZXJ5VmFsdWUiKTsKKyAgICB9CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0U3RyLCBzdHJsZW4ocmV0QnVmKSk7CisgICAgcmV0dXJuIHJldFN0cjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5UXVlcnlWYWx1ZUV4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWNoYXIgKnZhbHVlTmFtZTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnZhbHVlTmFtZTsKIAotCWxvbmcgcmM7Ci0JY2hhciAqcmV0QnVmOwotCURXT1JEIGJ1ZlNpemUgPSAwOwotCURXT1JEIHR5cDsKLQlQeU9iamVjdCAqb2JEYXRhOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgbG9uZyByYzsKKyAgICBjaGFyICpyZXRCdWY7CisgICAgRFdPUkQgYnVmU2l6ZSA9IDA7CisgICAgRFdPUkQgdHlwOworICAgIFB5T2JqZWN0ICpvYkRhdGE7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6UXVlcnlWYWx1ZUV4IiwgJm9iS2V5LCAmdmFsdWVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPejpRdWVyeVZhbHVlRXgiLCAmb2JLZXksICZ2YWx1ZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChyYyA9IFJlZ1F1ZXJ5VmFsdWVFeChoS2V5LCB2YWx1ZU5hbWUsCi0JCQkJICBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSAgJmJ1ZlNpemUpKQotCSAgICAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCi0JCQkJCQkJICAgIlJlZ1F1ZXJ5VmFsdWVFeCIpOwotCXJldEJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKGJ1ZlNpemUpOwotCWlmIChyZXRCdWYgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKChyYyA9IFJlZ1F1ZXJ5VmFsdWVFeChoS2V5LCB2YWx1ZU5hbWUsIE5VTEwsCi0JCQkJICAmdHlwLCAoQllURSAqKXJldEJ1ZiwgJmJ1ZlNpemUpKQotCSAgICAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0JCVB5TWVtX0ZyZWUocmV0QnVmKTsKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJSZWdRdWVyeVZhbHVlRXgiKTsKLQl9Ci0Jb2JEYXRhID0gUmVnMlB5KHJldEJ1ZiwgYnVmU2l6ZSwgdHlwKTsKLQlQeU1lbV9GcmVlKCh2b2lkICopcmV0QnVmKTsKLQlpZiAob2JEYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk9pIiwgb2JEYXRhLCB0eXApOwotCVB5X0RFQ1JFRihvYkRhdGEpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHJjID0gUmVnUXVlcnlWYWx1ZUV4KGhLZXksIHZhbHVlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmU2l6ZSkpCisgICAgICAgICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdRdWVyeVZhbHVlRXgiKTsKKyAgICByZXRCdWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhidWZTaXplKTsKKyAgICBpZiAocmV0QnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICgocmMgPSBSZWdRdWVyeVZhbHVlRXgoaEtleSwgdmFsdWVOYW1lLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cCwgKEJZVEUgKilyZXRCdWYsICZidWZTaXplKSkKKyAgICAgICAgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBQeU1lbV9GcmVlKHJldEJ1Zik7CisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdRdWVyeVZhbHVlRXgiKTsKKyAgICB9CisgICAgb2JEYXRhID0gUmVnMlB5KHJldEJ1ZiwgYnVmU2l6ZSwgdHlwKTsKKyAgICBQeU1lbV9GcmVlKCh2b2lkICopcmV0QnVmKTsKKyAgICBpZiAob2JEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk9pIiwgb2JEYXRhLCB0eXApOworICAgIFB5X0RFQ1JFRihvYkRhdGEpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5U2F2ZUtleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpmaWxlTmFtZTsKLQlMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcFNBID0gTlVMTDsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKmZpbGVOYW1lOworICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBwU0EgPSBOVUxMOwogCi0JbG9uZyByYzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zOlNhdmVLZXkiLCAmb2JLZXksICZmaWxlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgbG9uZyByYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zOlNhdmVLZXkiLCAmb2JLZXksICZmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAvKiAgT25lIGRheSB3ZSBtYXkgZ2V0IHNlY3VyaXR5IGludG8gdGhlIGNvcmU/Ci0JaWYgKCFQeVdpbk9iamVjdF9Bc1NFQ1VSSVRZX0FUVFJJQlVURVMob2JTQSwgJnBTQSwgVFJVRSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlXaW5PYmplY3RfQXNTRUNVUklUWV9BVFRSSUJVVEVTKG9iU0EsICZwU0EsIFRSVUUpKQorICAgICAgICByZXR1cm4gTlVMTDsKICovCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gUmVnU2F2ZUtleShoS2V5LCBmaWxlTmFtZSwgcFNBICk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnU2F2ZUtleSIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBSZWdTYXZlS2V5KGhLZXksIGZpbGVOYW1lLCBwU0EgKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdTYXZlS2V5Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlTZXRWYWx1ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpzdWJLZXk7Ci0JY2hhciAqc3RyOwotCURXT1JEIHR5cDsKLQlEV09SRCBsZW47Ci0JbG9uZyByYzsKLQlQeU9iamVjdCAqb2JTdHJWYWw7Ci0JUHlPYmplY3QgKm9iU3ViS2V5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09pTzpTZXRWYWx1ZSIsCi0JCQkgICAgICAmb2JLZXksCi0JCQkgICAgICAmb2JTdWJLZXksCi0JCQkgICAgICAmdHlwLAotCQkJICAgICAgJm9iU3RyVmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodHlwICE9IFJFR19TWikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJUeXBlIG11c3QgYmUgX3dpbnJlZy5SRUdfU1oiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFhYWCAtIG5lZWQgVW5pY29kZSBzdXBwb3J0ICovCi0Jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob2JTdHJWYWwpOwotCWlmIChzdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbGVuID0gUHlTdHJpbmdfU2l6ZShvYlN0clZhbCk7Ci0JaWYgKG9iU3ViS2V5ID09IFB5X05vbmUpCi0JCXN1YktleSA9IE5VTEw7Ci0JZWxzZSB7Ci0JCXN1YktleSA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iU3ViS2V5KTsKLQkJaWYgKHN1YktleSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9IFJlZ1NldFZhbHVlKGhLZXksIHN1YktleSwgUkVHX1NaLCBzdHIsIGxlbisxKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdTZXRWYWx1ZSIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnN1YktleTsKKyAgICBjaGFyICpzdHI7CisgICAgRFdPUkQgdHlwOworICAgIERXT1JEIGxlbjsKKyAgICBsb25nIHJjOworICAgIFB5T2JqZWN0ICpvYlN0clZhbDsKKyAgICBQeU9iamVjdCAqb2JTdWJLZXk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT2lPOlNldFZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JTdWJLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvYlN0clZhbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cCAhPSBSRUdfU1opIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlIG11c3QgYmUgX3dpbnJlZy5SRUdfU1oiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIFhYWCAtIG5lZWQgVW5pY29kZSBzdXBwb3J0ICovCisgICAgc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob2JTdHJWYWwpOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGVuID0gUHlTdHJpbmdfU2l6ZShvYlN0clZhbCk7CisgICAgaWYgKG9iU3ViS2V5ID09IFB5X05vbmUpCisgICAgICAgIHN1YktleSA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHN1YktleSA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iU3ViS2V5KTsKKyAgICAgICAgaWYgKHN1YktleSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ1NldFZhbHVlKGhLZXksIHN1YktleSwgUkVHX1NaLCBzdHIsIGxlbisxKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdTZXRWYWx1ZSIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5U2V0VmFsdWVFeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICp2YWx1ZU5hbWU7Ci0JUHlPYmplY3QgKm9iUmVzOwotCVB5T2JqZWN0ICp2YWx1ZTsKLQlCWVRFICpkYXRhOwotCURXT1JEIGxlbjsKLQlEV09SRCB0eXA7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBjaGFyICp2YWx1ZU5hbWU7CisgICAgUHlPYmplY3QgKm9iUmVzOworICAgIFB5T2JqZWN0ICp2YWx1ZTsKKyAgICBCWVRFICpkYXRhOworICAgIERXT1JEIGxlbjsKKyAgICBEV09SRCB0eXA7CiAKLQlMT05HIHJjOworICAgIExPTkcgcmM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk96T2lPOlNldFZhbHVlRXgiLAotCQkJICAgICAgJm9iS2V5LAotCQkJICAgICAgJnZhbHVlTmFtZSwKLQkJCSAgICAgICZvYlJlcywKLQkJCSAgICAgICZ0eXAsCi0JCQkgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHkyUmVnKHZhbHVlLCB0eXAsICZkYXRhLCAmbGVuKSkKLQl7Ci0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAiQ291bGQgbm90IGNvbnZlcnQgdGhlIGRhdGEgdG8gdGhlIHNwZWNpZmllZCB0eXBlLiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gUmVnU2V0VmFsdWVFeChoS2V5LCB2YWx1ZU5hbWUsIDAsIHR5cCwgZGF0YSwgbGVuKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVB5TWVtX0RFTChkYXRhKTsKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJSZWdTZXRWYWx1ZUV4Iik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3pPaU86U2V0VmFsdWVFeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvYktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHkyUmVnKHZhbHVlLCB0eXAsICZkYXRhLCAmbGVuKSkKKyAgICB7CisgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjb252ZXJ0IHRoZSBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ1NldFZhbHVlRXgoaEtleSwgdmFsdWVOYW1lLCAwLCB0eXAsIGRhdGEsIGxlbik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeU1lbV9ERUwoZGF0YSk7CisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdTZXRWYWx1ZUV4Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlEaXNhYmxlUmVmbGVjdGlvbktleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQlITU9EVUxFIGhNb2Q7Ci0JdHlwZWRlZiBMT05HIChXSU5BUEkgKlJEUktGdW5jKShIS0VZKTsKLQlSRFJLRnVuYyBwZm4gPSBOVUxMOwotCUxPTkcgcmM7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBITU9EVUxFIGhNb2Q7CisgICAgdHlwZWRlZiBMT05HIChXSU5BUEkgKlJEUktGdW5jKShIS0VZKTsKKyAgICBSRFJLRnVuYyBwZm4gPSBOVUxMOworICAgIExPTkcgcmM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86RGlzYWJsZVJlZmxlY3Rpb25LZXkiLCAmb2JLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpEaXNhYmxlUmVmbGVjdGlvbktleSIsICZvYktleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBPbmx5IGF2YWlsYWJsZSBvbiA2NGJpdCBwbGF0Zm9ybXMsIHNvIHdlIG11c3QgbG9hZCBpdAotCSAgIGR5bmFtaWNhbGx5LiAqLwotCWhNb2QgPSBHZXRNb2R1bGVIYW5kbGUoImFkdmFwaTMyLmRsbCIpOwotCWlmIChoTW9kKQotCQlwZm4gPSAoUkRSS0Z1bmMpR2V0UHJvY0FkZHJlc3MoaE1vZCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdEaXNhYmxlUmVmbGVjdGlvbktleSIpOwotCWlmICghcGZuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLAotCQkgICAgICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSAoKnBmbikoaEtleSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ0Rpc2FibGVSZWZsZWN0aW9uS2V5Iik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIC8qIE9ubHkgYXZhaWxhYmxlIG9uIDY0Yml0IHBsYXRmb3Jtcywgc28gd2UgbXVzdCBsb2FkIGl0CisgICAgICAgZHluYW1pY2FsbHkuICovCisgICAgaE1vZCA9IEdldE1vZHVsZUhhbmRsZSgiYWR2YXBpMzIuZGxsIik7CisgICAgaWYgKGhNb2QpCisgICAgICAgIHBmbiA9IChSRFJLRnVuYylHZXRQcm9jQWRkcmVzcyhoTW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ0Rpc2FibGVSZWZsZWN0aW9uS2V5Iik7CisgICAgaWYgKCFwZm4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9ICgqcGZuKShoS2V5KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnRGlzYWJsZVJlZmxlY3Rpb25LZXkiKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUVuYWJsZVJlZmxlY3Rpb25LZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JSE1PRFVMRSBoTW9kOwotCXR5cGVkZWYgTE9ORyAoV0lOQVBJICpSRVJLRnVuYykoSEtFWSk7Ci0JUkVSS0Z1bmMgcGZuID0gTlVMTDsKLQlMT05HIHJjOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgSE1PRFVMRSBoTW9kOworICAgIHR5cGVkZWYgTE9ORyAoV0lOQVBJICpSRVJLRnVuYykoSEtFWSk7CisgICAgUkVSS0Z1bmMgcGZuID0gTlVMTDsKKyAgICBMT05HIHJjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOkVuYWJsZVJlZmxlY3Rpb25LZXkiLCAmb2JLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpFbmFibGVSZWZsZWN0aW9uS2V5IiwgJm9iS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIE9ubHkgYXZhaWxhYmxlIG9uIDY0Yml0IHBsYXRmb3Jtcywgc28gd2UgbXVzdCBsb2FkIGl0Ci0JICAgZHluYW1pY2FsbHkuICovCi0JaE1vZCA9IEdldE1vZHVsZUhhbmRsZSgiYWR2YXBpMzIuZGxsIik7Ci0JaWYgKGhNb2QpCi0JCXBmbiA9IChSRVJLRnVuYylHZXRQcm9jQWRkcmVzcyhoTW9kLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ0VuYWJsZVJlZmxlY3Rpb25LZXkiKTsKLQlpZiAoIXBmbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKLQkJICAgICAgICAgICAgICAgICJub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gKCpwZm4pKGhLZXkpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdFbmFibGVSZWZsZWN0aW9uS2V5Iik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIC8qIE9ubHkgYXZhaWxhYmxlIG9uIDY0Yml0IHBsYXRmb3Jtcywgc28gd2UgbXVzdCBsb2FkIGl0CisgICAgICAgZHluYW1pY2FsbHkuICovCisgICAgaE1vZCA9IEdldE1vZHVsZUhhbmRsZSgiYWR2YXBpMzIuZGxsIik7CisgICAgaWYgKGhNb2QpCisgICAgICAgIHBmbiA9IChSRVJLRnVuYylHZXRQcm9jQWRkcmVzcyhoTW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ0VuYWJsZVJlZmxlY3Rpb25LZXkiKTsKKyAgICBpZiAoIXBmbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gKCpwZm4pKGhLZXkpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdFbmFibGVSZWZsZWN0aW9uS2V5Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlRdWVyeVJlZmxlY3Rpb25LZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JSE1PRFVMRSBoTW9kOwotCXR5cGVkZWYgTE9ORyAoV0lOQVBJICpSUVJLRnVuYykoSEtFWSwgQk9PTCAqKTsKLQlSUVJLRnVuYyBwZm4gPSBOVUxMOwotCUJPT0wgcmVzdWx0OwotCUxPTkcgcmM7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBITU9EVUxFIGhNb2Q7CisgICAgdHlwZWRlZiBMT05HIChXSU5BUEkgKlJRUktGdW5jKShIS0VZLCBCT09MICopOworICAgIFJRUktGdW5jIHBmbiA9IE5VTEw7CisgICAgQk9PTCByZXN1bHQ7CisgICAgTE9ORyByYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpRdWVyeVJlZmxlY3Rpb25LZXkiLCAmb2JLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpRdWVyeVJlZmxlY3Rpb25LZXkiLCAmb2JLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogT25seSBhdmFpbGFibGUgb24gNjRiaXQgcGxhdGZvcm1zLCBzbyB3ZSBtdXN0IGxvYWQgaXQKLQkgICBkeW5hbWljYWxseS4gKi8KLQloTW9kID0gR2V0TW9kdWxlSGFuZGxlKCJhZHZhcGkzMi5kbGwiKTsKLQlpZiAoaE1vZCkKLQkJcGZuID0gKFJRUktGdW5jKUdldFByb2NBZGRyZXNzKGhNb2QsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlSZWZsZWN0aW9uS2V5Iik7Ci0JaWYgKCFwZm4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCi0JCSAgICAgICAgICAgICAgICAibm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9ICgqcGZuKShoS2V5LCAmcmVzdWx0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlSZWZsZWN0aW9uS2V5Iik7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIC8qIE9ubHkgYXZhaWxhYmxlIG9uIDY0Yml0IHBsYXRmb3Jtcywgc28gd2UgbXVzdCBsb2FkIGl0CisgICAgICAgZHluYW1pY2FsbHkuICovCisgICAgaE1vZCA9IEdldE1vZHVsZUhhbmRsZSgiYWR2YXBpMzIuZGxsIik7CisgICAgaWYgKGhNb2QpCisgICAgICAgIHBmbiA9IChSUVJLRnVuYylHZXRQcm9jQWRkcmVzcyhoTW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ1F1ZXJ5UmVmbGVjdGlvbktleSIpOworICAgIGlmICghcGZuKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSAoKnBmbikoaEtleSwgJnJlc3VsdCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ1F1ZXJ5UmVmbGVjdGlvbktleSIpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiB3aW5yZWdfbWV0aG9kc1tdID0gewotCXsiQ2xvc2VLZXkiLCAgICAgICAgIFB5Q2xvc2VLZXksICAgICAgICBNRVRIX1ZBUkFSR1MsIENsb3NlS2V5X2RvY30sCi0JeyJDb25uZWN0UmVnaXN0cnkiLCAgUHlDb25uZWN0UmVnaXN0cnksIE1FVEhfVkFSQVJHUywgQ29ubmVjdFJlZ2lzdHJ5X2RvY30sCi0JeyJDcmVhdGVLZXkiLCAgICAgICAgUHlDcmVhdGVLZXksICAgICAgIE1FVEhfVkFSQVJHUywgQ3JlYXRlS2V5X2RvY30sCi0JeyJDcmVhdGVLZXlFeCIsICAgICAgUHlDcmVhdGVLZXlFeCwgICAgIE1FVEhfVkFSQVJHUywgQ3JlYXRlS2V5RXhfZG9jfSwKLQl7IkRlbGV0ZUtleSIsICAgICAgICBQeURlbGV0ZUtleSwgICAgICAgTUVUSF9WQVJBUkdTLCBEZWxldGVLZXlfZG9jfSwKLQl7IkRlbGV0ZUtleUV4IiwgICAgICBQeURlbGV0ZUtleUV4LCAgICAgTUVUSF9WQVJBUkdTLCBEZWxldGVLZXlFeF9kb2N9LAotCXsiRGVsZXRlVmFsdWUiLCAgICAgIFB5RGVsZXRlVmFsdWUsICAgICBNRVRIX1ZBUkFSR1MsIERlbGV0ZVZhbHVlX2RvY30sCi0JeyJEaXNhYmxlUmVmbGVjdGlvbktleSIsIFB5RGlzYWJsZVJlZmxlY3Rpb25LZXksIE1FVEhfVkFSQVJHUywgRGlzYWJsZVJlZmxlY3Rpb25LZXlfZG9jfSwKLQl7IkVuYWJsZVJlZmxlY3Rpb25LZXkiLCAgUHlFbmFibGVSZWZsZWN0aW9uS2V5LCAgTUVUSF9WQVJBUkdTLCBFbmFibGVSZWZsZWN0aW9uS2V5X2RvY30sCi0JeyJFbnVtS2V5IiwgICAgICAgICAgUHlFbnVtS2V5LCAgICAgICAgIE1FVEhfVkFSQVJHUywgRW51bUtleV9kb2N9LAotCXsiRW51bVZhbHVlIiwgICAgICAgIFB5RW51bVZhbHVlLCAgICAgICBNRVRIX1ZBUkFSR1MsIEVudW1WYWx1ZV9kb2N9LAotCXsiRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzIiwgUHlFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MsIE1FVEhfVkFSQVJHUywKLQkJRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzX2RvYyB9LAotCXsiRmx1c2hLZXkiLCAgICAgICAgIFB5Rmx1c2hLZXksICAgICAgICBNRVRIX1ZBUkFSR1MsIEZsdXNoS2V5X2RvY30sCi0JeyJMb2FkS2V5IiwgICAgICAgICAgUHlMb2FkS2V5LCAgICAgICAgIE1FVEhfVkFSQVJHUywgTG9hZEtleV9kb2N9LAotCXsiT3BlbktleSIsICAgICAgICAgIFB5T3BlbktleSwgICAgICAgICBNRVRIX1ZBUkFSR1MsIE9wZW5LZXlfZG9jfSwKLQl7Ik9wZW5LZXlFeCIsICAgICAgICBQeU9wZW5LZXksICAgICAgICAgTUVUSF9WQVJBUkdTLCBPcGVuS2V5RXhfZG9jfSwKLQl7IlF1ZXJ5VmFsdWUiLCAgICAgICBQeVF1ZXJ5VmFsdWUsICAgICAgTUVUSF9WQVJBUkdTLCBRdWVyeVZhbHVlX2RvY30sCi0JeyJRdWVyeVZhbHVlRXgiLCAgICAgUHlRdWVyeVZhbHVlRXgsICAgIE1FVEhfVkFSQVJHUywgUXVlcnlWYWx1ZUV4X2RvY30sCi0JeyJRdWVyeUluZm9LZXkiLCAgICAgUHlRdWVyeUluZm9LZXksICAgIE1FVEhfVkFSQVJHUywgUXVlcnlJbmZvS2V5X2RvY30sCi0JeyJRdWVyeVJlZmxlY3Rpb25LZXkiLFB5UXVlcnlSZWZsZWN0aW9uS2V5LE1FVEhfVkFSQVJHUywgUXVlcnlSZWZsZWN0aW9uS2V5X2RvY30sCi0JeyJTYXZlS2V5IiwgICAgICAgICAgUHlTYXZlS2V5LCAgICAgICAgIE1FVEhfVkFSQVJHUywgU2F2ZUtleV9kb2N9LAotCXsiU2V0VmFsdWUiLCAgICAgICAgIFB5U2V0VmFsdWUsICAgICAgICBNRVRIX1ZBUkFSR1MsIFNldFZhbHVlX2RvY30sCi0JeyJTZXRWYWx1ZUV4IiwgICAgICAgUHlTZXRWYWx1ZUV4LCAgICAgIE1FVEhfVkFSQVJHUywgU2V0VmFsdWVFeF9kb2N9LAotCU5VTEwsCisgICAgeyJDbG9zZUtleSIsICAgICAgICAgUHlDbG9zZUtleSwgICAgICAgIE1FVEhfVkFSQVJHUywgQ2xvc2VLZXlfZG9jfSwKKyAgICB7IkNvbm5lY3RSZWdpc3RyeSIsICBQeUNvbm5lY3RSZWdpc3RyeSwgTUVUSF9WQVJBUkdTLCBDb25uZWN0UmVnaXN0cnlfZG9jfSwKKyAgICB7IkNyZWF0ZUtleSIsICAgICAgICBQeUNyZWF0ZUtleSwgICAgICAgTUVUSF9WQVJBUkdTLCBDcmVhdGVLZXlfZG9jfSwKKyAgICB7IkNyZWF0ZUtleUV4IiwgICAgICBQeUNyZWF0ZUtleUV4LCAgICAgTUVUSF9WQVJBUkdTLCBDcmVhdGVLZXlFeF9kb2N9LAorICAgIHsiRGVsZXRlS2V5IiwgICAgICAgIFB5RGVsZXRlS2V5LCAgICAgICBNRVRIX1ZBUkFSR1MsIERlbGV0ZUtleV9kb2N9LAorICAgIHsiRGVsZXRlS2V5RXgiLCAgICAgIFB5RGVsZXRlS2V5RXgsICAgICBNRVRIX1ZBUkFSR1MsIERlbGV0ZUtleUV4X2RvY30sCisgICAgeyJEZWxldGVWYWx1ZSIsICAgICAgUHlEZWxldGVWYWx1ZSwgICAgIE1FVEhfVkFSQVJHUywgRGVsZXRlVmFsdWVfZG9jfSwKKyAgICB7IkRpc2FibGVSZWZsZWN0aW9uS2V5IiwgUHlEaXNhYmxlUmVmbGVjdGlvbktleSwgTUVUSF9WQVJBUkdTLCBEaXNhYmxlUmVmbGVjdGlvbktleV9kb2N9LAorICAgIHsiRW5hYmxlUmVmbGVjdGlvbktleSIsICBQeUVuYWJsZVJlZmxlY3Rpb25LZXksICBNRVRIX1ZBUkFSR1MsIEVuYWJsZVJlZmxlY3Rpb25LZXlfZG9jfSwKKyAgICB7IkVudW1LZXkiLCAgICAgICAgICBQeUVudW1LZXksICAgICAgICAgTUVUSF9WQVJBUkdTLCBFbnVtS2V5X2RvY30sCisgICAgeyJFbnVtVmFsdWUiLCAgICAgICAgUHlFbnVtVmFsdWUsICAgICAgIE1FVEhfVkFSQVJHUywgRW51bVZhbHVlX2RvY30sCisgICAgeyJFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiLCBQeUV4cGFuZEVudmlyb25tZW50U3RyaW5ncywgTUVUSF9WQVJBUkdTLAorICAgICAgICBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NfZG9jIH0sCisgICAgeyJGbHVzaEtleSIsICAgICAgICAgUHlGbHVzaEtleSwgICAgICAgIE1FVEhfVkFSQVJHUywgRmx1c2hLZXlfZG9jfSwKKyAgICB7IkxvYWRLZXkiLCAgICAgICAgICBQeUxvYWRLZXksICAgICAgICAgTUVUSF9WQVJBUkdTLCBMb2FkS2V5X2RvY30sCisgICAgeyJPcGVuS2V5IiwgICAgICAgICAgUHlPcGVuS2V5LCAgICAgICAgIE1FVEhfVkFSQVJHUywgT3BlbktleV9kb2N9LAorICAgIHsiT3BlbktleUV4IiwgICAgICAgIFB5T3BlbktleSwgICAgICAgICBNRVRIX1ZBUkFSR1MsIE9wZW5LZXlFeF9kb2N9LAorICAgIHsiUXVlcnlWYWx1ZSIsICAgICAgIFB5UXVlcnlWYWx1ZSwgICAgICBNRVRIX1ZBUkFSR1MsIFF1ZXJ5VmFsdWVfZG9jfSwKKyAgICB7IlF1ZXJ5VmFsdWVFeCIsICAgICBQeVF1ZXJ5VmFsdWVFeCwgICAgTUVUSF9WQVJBUkdTLCBRdWVyeVZhbHVlRXhfZG9jfSwKKyAgICB7IlF1ZXJ5SW5mb0tleSIsICAgICBQeVF1ZXJ5SW5mb0tleSwgICAgTUVUSF9WQVJBUkdTLCBRdWVyeUluZm9LZXlfZG9jfSwKKyAgICB7IlF1ZXJ5UmVmbGVjdGlvbktleSIsUHlRdWVyeVJlZmxlY3Rpb25LZXksTUVUSF9WQVJBUkdTLCBRdWVyeVJlZmxlY3Rpb25LZXlfZG9jfSwKKyAgICB7IlNhdmVLZXkiLCAgICAgICAgICBQeVNhdmVLZXksICAgICAgICAgTUVUSF9WQVJBUkdTLCBTYXZlS2V5X2RvY30sCisgICAgeyJTZXRWYWx1ZSIsICAgICAgICAgUHlTZXRWYWx1ZSwgICAgICAgIE1FVEhfVkFSQVJHUywgU2V0VmFsdWVfZG9jfSwKKyAgICB7IlNldFZhbHVlRXgiLCAgICAgICBQeVNldFZhbHVlRXgsICAgICAgTUVUSF9WQVJBUkdTLCBTZXRWYWx1ZUV4X2RvY30sCisgICAgTlVMTCwKIH07CiAKIHN0YXRpYyB2b2lkCiBpbnNpbnQoUHlPYmplY3QgKiBkLCBjaGFyICogbmFtZSwgbG9uZyB2YWx1ZSkKIHsKLQlQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKLQlpZiAoIXYgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdikpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JUHlfWERFQ1JFRih2KTsKKyAgICBQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKKyAgICBpZiAoIXYgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdikpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgUHlfWERFQ1JFRih2KTsKIH0KIAogI2RlZmluZSBBRERfSU5UKHZhbCkgaW5zaW50KGQsICN2YWwsIHZhbCkKQEAgLTE3MDcsODkgKzE3MDcsODkgQEAKIHN0YXRpYyB2b2lkCiBpbnNrZXkoUHlPYmplY3QgKiBkLCBjaGFyICogbmFtZSwgSEtFWSBrZXkpCiB7Ci0JUHlPYmplY3QgKnYgPSBQeUxvbmdfRnJvbVZvaWRQdHIoa2V5KTsKLQlpZiAoIXYgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdikpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JUHlfWERFQ1JFRih2KTsKKyAgICBQeU9iamVjdCAqdiA9IFB5TG9uZ19Gcm9tVm9pZFB0cihrZXkpOworICAgIGlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9YREVDUkVGKHYpOwogfQogCiAjZGVmaW5lIEFERF9LRVkodmFsKSBpbnNrZXkoZCwgI3ZhbCwgdmFsKQogCiBQeU1PRElOSVRfRlVOQyBpbml0X3dpbnJlZyh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQltID0gUHlfSW5pdE1vZHVsZTMoIl93aW5yZWciLCB3aW5yZWdfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWlmIChQeVR5cGVfUmVhZHkoJlB5SEtFWV9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeUhLRVlfVHlwZS50cF9kb2MgPSBQeUhLRVlfZG9jOwotCVB5X0lOQ1JFRigmUHlIS0VZX1R5cGUpOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSEtFWVR5cGUiLAotCQkJCSAoUHlPYmplY3QgKikmUHlIS0VZX1R5cGUpICE9IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoUHlFeGNfV2luZG93c0Vycm9yKTsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwKLQkJCQkgUHlFeGNfV2luZG93c0Vycm9yKSAhPSAwKQotCQlyZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpkOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiX3dpbnJlZyIsIHdpbnJlZ19tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlIS0VZX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5SEtFWV9UeXBlLnRwX2RvYyA9IFB5SEtFWV9kb2M7CisgICAgUHlfSU5DUkVGKCZQeUhLRVlfVHlwZSk7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIS0VZVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSZQeUhLRVlfVHlwZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRihQeUV4Y19XaW5kb3dzRXJyb3IpOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19XaW5kb3dzRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCB0aGUgcmVsZXZhbnQgY29uc3RhbnRzICovCi0JQUREX0tFWShIS0VZX0NMQVNTRVNfUk9PVCk7Ci0JQUREX0tFWShIS0VZX0NVUlJFTlRfVVNFUik7Ci0JQUREX0tFWShIS0VZX0xPQ0FMX01BQ0hJTkUpOwotCUFERF9LRVkoSEtFWV9VU0VSUyk7Ci0JQUREX0tFWShIS0VZX1BFUkZPUk1BTkNFX0RBVEEpOworICAgIC8qIEFkZCB0aGUgcmVsZXZhbnQgY29uc3RhbnRzICovCisgICAgQUREX0tFWShIS0VZX0NMQVNTRVNfUk9PVCk7CisgICAgQUREX0tFWShIS0VZX0NVUlJFTlRfVVNFUik7CisgICAgQUREX0tFWShIS0VZX0xPQ0FMX01BQ0hJTkUpOworICAgIEFERF9LRVkoSEtFWV9VU0VSUyk7CisgICAgQUREX0tFWShIS0VZX1BFUkZPUk1BTkNFX0RBVEEpOwogI2lmZGVmIEhLRVlfQ1VSUkVOVF9DT05GSUcKLQlBRERfS0VZKEhLRVlfQ1VSUkVOVF9DT05GSUcpOworICAgIEFERF9LRVkoSEtFWV9DVVJSRU5UX0NPTkZJRyk7CiAjZW5kaWYKICNpZmRlZiBIS0VZX0RZTl9EQVRBCi0JQUREX0tFWShIS0VZX0RZTl9EQVRBKTsKKyAgICBBRERfS0VZKEhLRVlfRFlOX0RBVEEpOwogI2VuZGlmCi0JQUREX0lOVChLRVlfUVVFUllfVkFMVUUpOwotCUFERF9JTlQoS0VZX1NFVF9WQUxVRSk7Ci0JQUREX0lOVChLRVlfQ1JFQVRFX1NVQl9LRVkpOwotCUFERF9JTlQoS0VZX0VOVU1FUkFURV9TVUJfS0VZUyk7Ci0JQUREX0lOVChLRVlfTk9USUZZKTsKLQlBRERfSU5UKEtFWV9DUkVBVEVfTElOSyk7Ci0JQUREX0lOVChLRVlfUkVBRCk7Ci0JQUREX0lOVChLRVlfV1JJVEUpOwotCUFERF9JTlQoS0VZX0VYRUNVVEUpOwotCUFERF9JTlQoS0VZX0FMTF9BQ0NFU1MpOworICAgIEFERF9JTlQoS0VZX1FVRVJZX1ZBTFVFKTsKKyAgICBBRERfSU5UKEtFWV9TRVRfVkFMVUUpOworICAgIEFERF9JTlQoS0VZX0NSRUFURV9TVUJfS0VZKTsKKyAgICBBRERfSU5UKEtFWV9FTlVNRVJBVEVfU1VCX0tFWVMpOworICAgIEFERF9JTlQoS0VZX05PVElGWSk7CisgICAgQUREX0lOVChLRVlfQ1JFQVRFX0xJTkspOworICAgIEFERF9JTlQoS0VZX1JFQUQpOworICAgIEFERF9JTlQoS0VZX1dSSVRFKTsKKyAgICBBRERfSU5UKEtFWV9FWEVDVVRFKTsKKyAgICBBRERfSU5UKEtFWV9BTExfQUNDRVNTKTsKICNpZmRlZiBLRVlfV09XNjRfNjRLRVkKLQlBRERfSU5UKEtFWV9XT1c2NF82NEtFWSk7CisgICAgQUREX0lOVChLRVlfV09XNjRfNjRLRVkpOwogI2VuZGlmCiAjaWZkZWYgS0VZX1dPVzY0XzMyS0VZCi0JQUREX0lOVChLRVlfV09XNjRfMzJLRVkpOworICAgIEFERF9JTlQoS0VZX1dPVzY0XzMyS0VZKTsKICNlbmRpZgotCUFERF9JTlQoUkVHX09QVElPTl9SRVNFUlZFRCk7Ci0JQUREX0lOVChSRUdfT1BUSU9OX05PTl9WT0xBVElMRSk7Ci0JQUREX0lOVChSRUdfT1BUSU9OX1ZPTEFUSUxFKTsKLQlBRERfSU5UKFJFR19PUFRJT05fQ1JFQVRFX0xJTkspOwotCUFERF9JTlQoUkVHX09QVElPTl9CQUNLVVBfUkVTVE9SRSk7Ci0JQUREX0lOVChSRUdfT1BUSU9OX09QRU5fTElOSyk7Ci0JQUREX0lOVChSRUdfTEVHQUxfT1BUSU9OKTsKLQlBRERfSU5UKFJFR19DUkVBVEVEX05FV19LRVkpOwotCUFERF9JTlQoUkVHX09QRU5FRF9FWElTVElOR19LRVkpOwotCUFERF9JTlQoUkVHX1dIT0xFX0hJVkVfVk9MQVRJTEUpOwotCUFERF9JTlQoUkVHX1JFRlJFU0hfSElWRSk7Ci0JQUREX0lOVChSRUdfTk9fTEFaWV9GTFVTSCk7Ci0JQUREX0lOVChSRUdfTk9USUZZX0NIQU5HRV9OQU1FKTsKLQlBRERfSU5UKFJFR19OT1RJRllfQ0hBTkdFX0FUVFJJQlVURVMpOwotCUFERF9JTlQoUkVHX05PVElGWV9DSEFOR0VfTEFTVF9TRVQpOwotCUFERF9JTlQoUkVHX05PVElGWV9DSEFOR0VfU0VDVVJJVFkpOwotCUFERF9JTlQoUkVHX0xFR0FMX0NIQU5HRV9GSUxURVIpOwotCUFERF9JTlQoUkVHX05PTkUpOwotCUFERF9JTlQoUkVHX1NaKTsKLQlBRERfSU5UKFJFR19FWFBBTkRfU1opOwotCUFERF9JTlQoUkVHX0JJTkFSWSk7Ci0JQUREX0lOVChSRUdfRFdPUkQpOwotCUFERF9JTlQoUkVHX0RXT1JEX0xJVFRMRV9FTkRJQU4pOwotCUFERF9JTlQoUkVHX0RXT1JEX0JJR19FTkRJQU4pOwotCUFERF9JTlQoUkVHX0xJTkspOwotCUFERF9JTlQoUkVHX01VTFRJX1NaKTsKLQlBRERfSU5UKFJFR19SRVNPVVJDRV9MSVNUKTsKLQlBRERfSU5UKFJFR19GVUxMX1JFU09VUkNFX0RFU0NSSVBUT1IpOwotCUFERF9JTlQoUkVHX1JFU09VUkNFX1JFUVVJUkVNRU5UU19MSVNUKTsKKyAgICBBRERfSU5UKFJFR19PUFRJT05fUkVTRVJWRUQpOworICAgIEFERF9JTlQoUkVHX09QVElPTl9OT05fVk9MQVRJTEUpOworICAgIEFERF9JTlQoUkVHX09QVElPTl9WT0xBVElMRSk7CisgICAgQUREX0lOVChSRUdfT1BUSU9OX0NSRUFURV9MSU5LKTsKKyAgICBBRERfSU5UKFJFR19PUFRJT05fQkFDS1VQX1JFU1RPUkUpOworICAgIEFERF9JTlQoUkVHX09QVElPTl9PUEVOX0xJTkspOworICAgIEFERF9JTlQoUkVHX0xFR0FMX09QVElPTik7CisgICAgQUREX0lOVChSRUdfQ1JFQVRFRF9ORVdfS0VZKTsKKyAgICBBRERfSU5UKFJFR19PUEVORURfRVhJU1RJTkdfS0VZKTsKKyAgICBBRERfSU5UKFJFR19XSE9MRV9ISVZFX1ZPTEFUSUxFKTsKKyAgICBBRERfSU5UKFJFR19SRUZSRVNIX0hJVkUpOworICAgIEFERF9JTlQoUkVHX05PX0xBWllfRkxVU0gpOworICAgIEFERF9JTlQoUkVHX05PVElGWV9DSEFOR0VfTkFNRSk7CisgICAgQUREX0lOVChSRUdfTk9USUZZX0NIQU5HRV9BVFRSSUJVVEVTKTsKKyAgICBBRERfSU5UKFJFR19OT1RJRllfQ0hBTkdFX0xBU1RfU0VUKTsKKyAgICBBRERfSU5UKFJFR19OT1RJRllfQ0hBTkdFX1NFQ1VSSVRZKTsKKyAgICBBRERfSU5UKFJFR19MRUdBTF9DSEFOR0VfRklMVEVSKTsKKyAgICBBRERfSU5UKFJFR19OT05FKTsKKyAgICBBRERfSU5UKFJFR19TWik7CisgICAgQUREX0lOVChSRUdfRVhQQU5EX1NaKTsKKyAgICBBRERfSU5UKFJFR19CSU5BUlkpOworICAgIEFERF9JTlQoUkVHX0RXT1JEKTsKKyAgICBBRERfSU5UKFJFR19EV09SRF9MSVRUTEVfRU5ESUFOKTsKKyAgICBBRERfSU5UKFJFR19EV09SRF9CSUdfRU5ESUFOKTsKKyAgICBBRERfSU5UKFJFR19MSU5LKTsKKyAgICBBRERfSU5UKFJFR19NVUxUSV9TWik7CisgICAgQUREX0lOVChSRUdfUkVTT1VSQ0VfTElTVCk7CisgICAgQUREX0lOVChSRUdfRlVMTF9SRVNPVVJDRV9ERVNDUklQVE9SKTsKKyAgICBBRERfSU5UKFJFR19SRVNPVVJDRV9SRVFVSVJFTUVOVFNfTElTVCk7CiB9CiAKZGlmZiAtLWdpdCBhL1BDL2JkaXN0X3dpbmluc3QvYXJjaGl2ZS5oIGIvUEMvYmRpc3Rfd2luaW5zdC9hcmNoaXZlLmgKaW5kZXggMzVkMmZkNi4uMzFhNzgwNSAxMDA2NDQKLS0tIGEvUEMvYmRpc3Rfd2luaW5zdC9hcmNoaXZlLmgKKysrIGIvUEMvYmRpc3Rfd2luaW5zdC9hcmNoaXZlLmgKQEAgLTE0LDU1ICsxNCw1NSBAQAogICovCiAKIHN0cnVjdCBlb2ZfY2RpciB7Ci0JbG9uZyB0YWc7CS8qIG11c3QgYmUgMHgwNjA1NGI1MCAqLwotCXNob3J0IGRpc2tudW07Ci0Jc2hvcnQgZmlyc3RkaXNrOwotCXNob3J0IG5Ub3RhbENEaXJUaGlzOwotCXNob3J0IG5Ub3RhbENEaXI7Ci0JbG9uZyBuQnl0ZXNDRGlyOwotCWxvbmcgb2ZzQ0RpcjsKLQlzaG9ydCBjb21tZW50bGVuOworICAgIGxvbmcgdGFnOyAgICAgICAgICAgLyogbXVzdCBiZSAweDA2MDU0YjUwICovCisgICAgc2hvcnQgZGlza251bTsKKyAgICBzaG9ydCBmaXJzdGRpc2s7CisgICAgc2hvcnQgblRvdGFsQ0RpclRoaXM7CisgICAgc2hvcnQgblRvdGFsQ0RpcjsKKyAgICBsb25nIG5CeXRlc0NEaXI7CisgICAgbG9uZyBvZnNDRGlyOworICAgIHNob3J0IGNvbW1lbnRsZW47CiB9OwogCiBzdHJ1Y3QgY2RpciB7Ci0JbG9uZyB0YWc7CS8qIG11c3QgYmUgMHgwMjAxNGI1MCAqLwotCXNob3J0IHZlcnNpb25fbWFkZTsKLQlzaG9ydCB2ZXJzaW9uX2V4dHJhY3Q7Ci0Jc2hvcnQgZ3BfYml0ZmxhZzsKLQlzaG9ydCBjb21wX21ldGhvZDsKLQlzaG9ydCBsYXN0X21vZF9maWxlX3RpbWU7Ci0Jc2hvcnQgbGFzdF9tb2RfZmlsZV9kYXRlOwotCWxvbmcgY3JjMzI7Ci0JbG9uZyBjb21wX3NpemU7Ci0JbG9uZyB1bmNvbXBfc2l6ZTsKLQlzaG9ydCBmbmFtZV9sZW5ndGg7Ci0Jc2hvcnQgZXh0cmFfbGVuZ3RoOwotCXNob3J0IGNvbW1lbnRfbGVuZ3RoOwotCXNob3J0IGRpc2tudW1fc3RhcnQ7Ci0Jc2hvcnQgaW50X2ZpbGVfYXR0cjsKLQlsb25nIGV4dF9maWxlX2F0dHI7Ci0JbG9uZyBvZnNfbG9jYWxfaGVhZGVyOworICAgIGxvbmcgdGFnOyAgICAgICAgICAgLyogbXVzdCBiZSAweDAyMDE0YjUwICovCisgICAgc2hvcnQgdmVyc2lvbl9tYWRlOworICAgIHNob3J0IHZlcnNpb25fZXh0cmFjdDsKKyAgICBzaG9ydCBncF9iaXRmbGFnOworICAgIHNob3J0IGNvbXBfbWV0aG9kOworICAgIHNob3J0IGxhc3RfbW9kX2ZpbGVfdGltZTsKKyAgICBzaG9ydCBsYXN0X21vZF9maWxlX2RhdGU7CisgICAgbG9uZyBjcmMzMjsKKyAgICBsb25nIGNvbXBfc2l6ZTsKKyAgICBsb25nIHVuY29tcF9zaXplOworICAgIHNob3J0IGZuYW1lX2xlbmd0aDsKKyAgICBzaG9ydCBleHRyYV9sZW5ndGg7CisgICAgc2hvcnQgY29tbWVudF9sZW5ndGg7CisgICAgc2hvcnQgZGlza251bV9zdGFydDsKKyAgICBzaG9ydCBpbnRfZmlsZV9hdHRyOworICAgIGxvbmcgZXh0X2ZpbGVfYXR0cjsKKyAgICBsb25nIG9mc19sb2NhbF9oZWFkZXI7CiB9OwogCiBzdHJ1Y3QgZmhkciB7Ci0JbG9uZyB0YWc7CS8qIG11c3QgYmUgMHgwNDAzNGI1MCAqLwotCXNob3J0IHZlcnNpb25fbmVlZGVkOwotCXNob3J0IGZsYWdzOwotCXNob3J0IG1ldGhvZDsKLQlzaG9ydCBsYXN0X21vZF9maWxlX3RpbWU7Ci0Jc2hvcnQgbGFzdF9tb2RfZmlsZV9kYXRlOwotCWxvbmcgY3JjMzI7Ci0JbG9uZyBjb21wX3NpemU7Ci0JbG9uZyB1bmNvbXBfc2l6ZTsKLQlzaG9ydCBmbmFtZV9sZW5ndGg7Ci0Jc2hvcnQgZXh0cmFfbGVuZ3RoOworICAgIGxvbmcgdGFnOyAgICAgICAgICAgLyogbXVzdCBiZSAweDA0MDM0YjUwICovCisgICAgc2hvcnQgdmVyc2lvbl9uZWVkZWQ7CisgICAgc2hvcnQgZmxhZ3M7CisgICAgc2hvcnQgbWV0aG9kOworICAgIHNob3J0IGxhc3RfbW9kX2ZpbGVfdGltZTsKKyAgICBzaG9ydCBsYXN0X21vZF9maWxlX2RhdGU7CisgICAgbG9uZyBjcmMzMjsKKyAgICBsb25nIGNvbXBfc2l6ZTsKKyAgICBsb25nIHVuY29tcF9zaXplOworICAgIHNob3J0IGZuYW1lX2xlbmd0aDsKKyAgICBzaG9ydCBleHRyYV9sZW5ndGg7CiB9OwogCiAKIHN0cnVjdCBtZXRhX2RhdGFfaGRyIHsKLQlpbnQgdGFnOwotCWludCB1bmNvbXBfc2l6ZTsKLQlpbnQgYml0bWFwX3NpemU7CisgICAgaW50IHRhZzsKKyAgICBpbnQgdW5jb21wX3NpemU7CisgICAgaW50IGJpdG1hcF9zaXplOwogfTsKIAogI3ByYWdtYSBwYWNrKCkKQEAgLTcwLDI5ICs3MCwyOSBAQAogLyogaW5zdGFsbGF0aW9uIHNjaGVtZSAqLwogCiB0eXBlZGVmIHN0cnVjdCB0YWdTQ0hFTUUgewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqcHJlZml4OworICAgIGNoYXIgKm5hbWU7CisgICAgY2hhciAqcHJlZml4OwogfSBTQ0hFTUU7CiAKIHR5cGVkZWYgaW50ICgqTk9USUZZUFJPQykoaW50IGNvZGUsIExQU1RSIHRleHQsIC4uLik7CiAKIGV4dGVybiBCT09MCiBleHRyYWN0X2ZpbGUoY2hhciAqZHN0LCBjaGFyICpzcmMsIGludCBtZXRob2QsIGludCBjb21wX3NpemUsCi0JICAgICBpbnQgdW5jb21wX3NpemUsIE5PVElGWVBST0Mgbm90aWZ5KTsKKyAgICAgICAgICAgICBpbnQgdW5jb21wX3NpemUsIE5PVElGWVBST0Mgbm90aWZ5KTsKIAogZXh0ZXJuIEJPT0wKIHVuemlwX2FyY2hpdmUoU0NIRU1FICpzY2hlbWUsIGNoYXIgKmRpcm5hbWUsIGNoYXIgKmRhdGEsCi0JICAgICAgRFdPUkQgc2l6ZSwgIE5PVElGWVBST0Mgbm90aWZ5KTsKKyAgICAgICAgICAgICAgRFdPUkQgc2l6ZSwgIE5PVElGWVBST0Mgbm90aWZ5KTsKIAogZXh0ZXJuIGNoYXIgKgogbWFwX25ld19maWxlKERXT1JEIGZsYWdzLCBjaGFyICpmaWxlbmFtZSwgY2hhcgotCSAgICAgKnBhdGhuYW1lX3BhcnQsIGludCBzaXplLAotCSAgICAgV09SRCB3RmF0RGF0ZSwgV09SRCB3RmF0VGltZSwKLQkgICAgIE5PVElGWVBST0MgY2FsbGJhY2spOworICAgICAgICAgICAgICpwYXRobmFtZV9wYXJ0LCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICBXT1JEIHdGYXREYXRlLCBXT1JEIHdGYXRUaW1lLAorICAgICAgICAgICAgIE5PVElGWVBST0MgY2FsbGJhY2spOwogCiBleHRlcm4gQk9PTAogZW5zdXJlX2RpcmVjdG9yeSAoY2hhciAqcGF0aG5hbWUsIGNoYXIgKm5ld19wYXJ0LAotCQkgIE5PVElGWVBST0MgY2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgTk9USUZZUFJPQyBjYWxsYmFjayk7CiAKIC8qIGNvZGVzIGZvciBOT0lUSUZZUFJPQyAqLwogI2RlZmluZSBESVJfQ1JFQVRFRCAxCmRpZmYgLS1naXQgYS9QQy9iZGlzdF93aW5pbnN0L2V4dHJhY3QuYyBiL1BDL2JkaXN0X3dpbmluc3QvZXh0cmFjdC5jCmluZGV4IGI0OTVlMWMuLmZjMmQyYjkgMTAwNjQ0Ci0tLSBhL1BDL2JkaXN0X3dpbmluc3QvZXh0cmFjdC5jCisrKyBiL1BDL2JkaXN0X3dpbmluc3QvZXh0cmFjdC5jCkBAIC0xOSwxODEgKzE5LDE4MSBAQAogLyogQ29udmVydCB1bml4LXBhdGggdG8gZG9zLXBhdGggKi8KIHN0YXRpYyB2b2lkIG5vcm1wYXRoKGNoYXIgKnBhdGgpCiB7Ci0Jd2hpbGUgKHBhdGggJiYgKnBhdGgpIHsKLQkJaWYgKCpwYXRoID09ICcvJykKLQkJCSpwYXRoID0gJ1xcJzsKLQkJKytwYXRoOwotCX0KKyAgICB3aGlsZSAocGF0aCAmJiAqcGF0aCkgeworICAgICAgICBpZiAoKnBhdGggPT0gJy8nKQorICAgICAgICAgICAgKnBhdGggPSAnXFwnOworICAgICAgICArK3BhdGg7CisgICAgfQogfQogCiBCT09MIGVuc3VyZV9kaXJlY3RvcnkoY2hhciAqcGF0aG5hbWUsIGNoYXIgKm5ld19wYXJ0LCBOT1RJRllQUk9DIG5vdGlmeSkKIHsKLQl3aGlsZSAobmV3X3BhcnQgJiYgKm5ld19wYXJ0ICYmIChuZXdfcGFydCA9IHN0cmNocihuZXdfcGFydCwgJ1xcJykpKSB7Ci0JCURXT1JEIGF0dHI7Ci0JCSpuZXdfcGFydCA9ICdcMCc7Ci0JCWF0dHIgPSBHZXRGaWxlQXR0cmlidXRlcyhwYXRobmFtZSk7Ci0JCWlmIChhdHRyID09IC0xKSB7Ci0JCQkvKiBub3RoaW5nIGZvdW5kICovCi0JCQlpZiAoIUNyZWF0ZURpcmVjdG9yeShwYXRobmFtZSwgTlVMTCkgJiYgbm90aWZ5KQotCQkJCW5vdGlmeShTWVNURU1fRVJST1IsCi0JCQkJICAgICAgICJDcmVhdGVEaXJlY3RvcnkgKCVzKSIsIHBhdGhuYW1lKTsKLQkJCWVsc2UKLQkJCQlub3RpZnkoRElSX0NSRUFURUQsIHBhdGhuYW1lKTsKLQkJfQotCQlpZiAoYXR0ciAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgewotCQkJOwotCQl9IGVsc2UgewotCQkJU2V0TGFzdEVycm9yKDE4Myk7Ci0JCQlpZiAobm90aWZ5KQotCQkJCW5vdGlmeShTWVNURU1fRVJST1IsCi0JCQkJICAgICAgICJDcmVhdGVEaXJlY3RvcnkgKCVzKSIsIHBhdGhuYW1lKTsKLQkJfQotCQkqbmV3X3BhcnQgPSAnXFwnOwotCQkrK25ld19wYXJ0OwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgICB3aGlsZSAobmV3X3BhcnQgJiYgKm5ld19wYXJ0ICYmIChuZXdfcGFydCA9IHN0cmNocihuZXdfcGFydCwgJ1xcJykpKSB7CisgICAgICAgIERXT1JEIGF0dHI7CisgICAgICAgICpuZXdfcGFydCA9ICdcMCc7CisgICAgICAgIGF0dHIgPSBHZXRGaWxlQXR0cmlidXRlcyhwYXRobmFtZSk7CisgICAgICAgIGlmIChhdHRyID09IC0xKSB7CisgICAgICAgICAgICAvKiBub3RoaW5nIGZvdW5kICovCisgICAgICAgICAgICBpZiAoIUNyZWF0ZURpcmVjdG9yeShwYXRobmFtZSwgTlVMTCkgJiYgbm90aWZ5KQorICAgICAgICAgICAgICAgIG5vdGlmeShTWVNURU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGVEaXJlY3RvcnkgKCVzKSIsIHBhdGhuYW1lKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBub3RpZnkoRElSX0NSRUFURUQsIHBhdGhuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXR0ciAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgeworICAgICAgICAgICAgOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU2V0TGFzdEVycm9yKDE4Myk7CisgICAgICAgICAgICBpZiAobm90aWZ5KQorICAgICAgICAgICAgICAgIG5vdGlmeShTWVNURU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGVEaXJlY3RvcnkgKCVzKSIsIHBhdGhuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAqbmV3X3BhcnQgPSAnXFwnOworICAgICAgICArK25ld19wYXJ0OworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKIH0KIAogLyogWFhYIFNob3VsZCBiZXR0ZXIgZXhwbGljaXRlbHkgc3BlY2lmeQogICogdW5jb21wX3NpemUgYW5kIGZpbGVfdGltZXMgaW5zdGVhZCBvZiBwZmhkciEKICAqLwogY2hhciAqbWFwX25ld19maWxlKERXT1JEIGZsYWdzLCBjaGFyICpmaWxlbmFtZSwKLQkJICAgY2hhciAqcGF0aG5hbWVfcGFydCwgaW50IHNpemUsCi0JCSAgIFdPUkQgd0ZhdERhdGUsIFdPUkQgd0ZhdFRpbWUsCi0JCSAgIE5PVElGWVBST0Mgbm90aWZ5KQorICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhdGhuYW1lX3BhcnQsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgIFdPUkQgd0ZhdERhdGUsIFdPUkQgd0ZhdFRpbWUsCisgICAgICAgICAgICAgICAgICAgTk9USUZZUFJPQyBub3RpZnkpCiB7Ci0JSEFORExFIGhGaWxlLCBoRmlsZU1hcHBpbmc7Ci0JY2hhciAqZHN0OwotCUZJTEVUSU1FIGZ0OworICAgIEhBTkRMRSBoRmlsZSwgaEZpbGVNYXBwaW5nOworICAgIGNoYXIgKmRzdDsKKyAgICBGSUxFVElNRSBmdDsKIAogICB0cnlfYWdhaW46Ci0JaWYgKCFmbGFncykKLQkJZmxhZ3MgPSBDUkVBVEVfTkVXOwotCWhGaWxlID0gQ3JlYXRlRmlsZShmaWxlbmFtZSwKLQkJCSAgIEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQsCi0JCQkgICAwLCBOVUxMLAotCQkJICAgZmxhZ3MsCi0JCQkgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOwotCWlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQlEV09SRCB4ID0gR2V0TGFzdEVycm9yKCk7Ci0JCXN3aXRjaCAoeCkgewotCQljYXNlIEVSUk9SX0ZJTEVfRVhJU1RTOgotCQkJaWYgKG5vdGlmeSAmJiBub3RpZnkoQ0FOX09WRVJXUklURSwgZmlsZW5hbWUpKQotCQkJCWhGaWxlID0gQ3JlYXRlRmlsZShmaWxlbmFtZSwKLQkJCQkJCSAgIEdFTkVSSUNfV1JJVEV8R0VORVJJQ19SRUFELAotCQkJCQkJICAgMCwgTlVMTCwKLQkJCQkJCSAgIENSRUFURV9BTFdBWVMsCi0JCQkJCQkgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCi0JCQkJCQkgICBOVUxMKTsKLQkJCWVsc2UgewotCQkJCWlmIChub3RpZnkpCi0JCQkJCW5vdGlmeShGSUxFX09WRVJXUklUVEVOLCBmaWxlbmFtZSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBFUlJPUl9QQVRIX05PVF9GT1VORDoKLQkJCWlmIChlbnN1cmVfZGlyZWN0b3J5KGZpbGVuYW1lLCBwYXRobmFtZV9wYXJ0LCBub3RpZnkpKQotCQkJCWdvdG8gdHJ5X2FnYWluOwotCQkJZWxzZQotCQkJCXJldHVybiBGQUxTRTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJU2V0TGFzdEVycm9yKHgpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JCWlmIChub3RpZnkpCi0JCQlub3RpZnkgKFNZU1RFTV9FUlJPUiwgIkNyZWF0ZUZpbGUgKCVzKSIsIGZpbGVuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghZmxhZ3MpCisgICAgICAgIGZsYWdzID0gQ1JFQVRFX05FVzsKKyAgICBoRmlsZSA9IENyZWF0ZUZpbGUoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICAgIGlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBEV09SRCB4ID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIHN3aXRjaCAoeCkgeworICAgICAgICBjYXNlIEVSUk9SX0ZJTEVfRVhJU1RTOgorICAgICAgICAgICAgaWYgKG5vdGlmeSAmJiBub3RpZnkoQ0FOX09WRVJXUklURSwgZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgIGhGaWxlID0gQ3JlYXRlRmlsZShmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19XUklURXxHRU5FUklDX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURV9BTFdBWVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobm90aWZ5KQorICAgICAgICAgICAgICAgICAgICBub3RpZnkoRklMRV9PVkVSV1JJVFRFTiwgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfUEFUSF9OT1RfRk9VTkQ6CisgICAgICAgICAgICBpZiAoZW5zdXJlX2RpcmVjdG9yeShmaWxlbmFtZSwgcGF0aG5hbWVfcGFydCwgbm90aWZ5KSkKKyAgICAgICAgICAgICAgICBnb3RvIHRyeV9hZ2FpbjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFNldExhc3RFcnJvcih4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBpZiAobm90aWZ5KQorICAgICAgICAgICAgbm90aWZ5IChTWVNURU1fRVJST1IsICJDcmVhdGVGaWxlICglcykiLCBmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChub3RpZnkpCi0JCW5vdGlmeShGSUxFX0NSRUFURUQsIGZpbGVuYW1lKTsKKyAgICBpZiAobm90aWZ5KQorICAgICAgICBub3RpZnkoRklMRV9DUkVBVEVELCBmaWxlbmFtZSk7CiAKLQlEb3NEYXRlVGltZVRvRmlsZVRpbWUod0ZhdERhdGUsIHdGYXRUaW1lLCAmZnQpOwotCVNldEZpbGVUaW1lKGhGaWxlLCAmZnQsICZmdCwgJmZ0KTsKKyAgICBEb3NEYXRlVGltZVRvRmlsZVRpbWUod0ZhdERhdGUsIHdGYXRUaW1lLCAmZnQpOworICAgIFNldEZpbGVUaW1lKGhGaWxlLCAmZnQsICZmdCwgJmZ0KTsKIAogCi0JaWYgKHNpemUgPT0gMCkgewotCQkvKiBXZSBjYW5ub3QgbWFwIGEgemVyby1sZW5ndGggZmlsZSAoQWxzbyBpdCBtYWtlcwotCQkgICBubyBzZW5zZSAqLwotCQlDbG9zZUhhbmRsZShoRmlsZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qIFdlIGNhbm5vdCBtYXAgYSB6ZXJvLWxlbmd0aCBmaWxlIChBbHNvIGl0IG1ha2VzCisgICAgICAgICAgIG5vIHNlbnNlICovCisgICAgICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaEZpbGVNYXBwaW5nID0gQ3JlYXRlRmlsZU1hcHBpbmcoaEZpbGUsCi0JCQkJCSBOVUxMLCBQQUdFX1JFQURXUklURSwgMCwgc2l6ZSwgTlVMTCk7CisgICAgaEZpbGVNYXBwaW5nID0gQ3JlYXRlRmlsZU1hcHBpbmcoaEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgUEFHRV9SRUFEV1JJVEUsIDAsIHNpemUsIE5VTEwpOwogCi0JQ2xvc2VIYW5kbGUoaEZpbGUpOworICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKIAotCWlmIChoRmlsZU1hcHBpbmcgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJaWYgKG5vdGlmeSkKLQkJCW5vdGlmeShTWVNURU1fRVJST1IsCi0JCQkgICAgICAgIkNyZWF0ZUZpbGVNYXBwaW5nICglcykiLCBmaWxlbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoaEZpbGVNYXBwaW5nID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIGlmIChub3RpZnkpCisgICAgICAgICAgICBub3RpZnkoU1lTVEVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDcmVhdGVGaWxlTWFwcGluZyAoJXMpIiwgZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlkc3QgPSBNYXBWaWV3T2ZGaWxlKGhGaWxlTWFwcGluZywKLQkJCSAgICBGSUxFX01BUF9XUklURSwgMCwgMCwgMCk7CisgICAgZHN0ID0gTWFwVmlld09mRmlsZShoRmlsZU1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX01BUF9XUklURSwgMCwgMCwgMCk7CiAKLQlDbG9zZUhhbmRsZShoRmlsZU1hcHBpbmcpOworICAgIENsb3NlSGFuZGxlKGhGaWxlTWFwcGluZyk7CiAKLQlpZiAoIWRzdCkgewotCQlpZiAobm90aWZ5KQotCQkJbm90aWZ5KFNZU1RFTV9FUlJPUiwgIk1hcFZpZXdPZkZpbGUgKCVzKSIsIGZpbGVuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBkc3Q7CisgICAgaWYgKCFkc3QpIHsKKyAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgIG5vdGlmeShTWVNURU1fRVJST1IsICJNYXBWaWV3T2ZGaWxlICglcykiLCBmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZHN0OwogfQogCiAKIEJPT0wKIGV4dHJhY3RfZmlsZShjaGFyICpkc3QsIGNoYXIgKnNyYywgaW50IG1ldGhvZCwgaW50IGNvbXBfc2l6ZSwKLQkgICAgIGludCB1bmNvbXBfc2l6ZSwgTk9USUZZUFJPQyBub3RpZnkpCisgICAgICAgICAgICAgaW50IHVuY29tcF9zaXplLCBOT1RJRllQUk9DIG5vdGlmeSkKIHsKLQl6X3N0cmVhbSB6c3RyZWFtOwotCWludCByZXN1bHQ7CisgICAgel9zdHJlYW0genN0cmVhbTsKKyAgICBpbnQgcmVzdWx0OwogCi0JaWYgKG1ldGhvZCA9PSBaX0RFRkxBVEVEKSB7Ci0JCWludCB4OwotCQltZW1zZXQoJnpzdHJlYW0sIDAsIHNpemVvZih6c3RyZWFtKSk7Ci0JCXpzdHJlYW0ubmV4dF9pbiA9IHNyYzsKLQkJenN0cmVhbS5hdmFpbF9pbiA9IGNvbXBfc2l6ZSsxOwotCQl6c3RyZWFtLm5leHRfb3V0ID0gZHN0OwotCQl6c3RyZWFtLmF2YWlsX291dCA9IHVuY29tcF9zaXplOworICAgIGlmIChtZXRob2QgPT0gWl9ERUZMQVRFRCkgeworICAgICAgICBpbnQgeDsKKyAgICAgICAgbWVtc2V0KCZ6c3RyZWFtLCAwLCBzaXplb2YoenN0cmVhbSkpOworICAgICAgICB6c3RyZWFtLm5leHRfaW4gPSBzcmM7CisgICAgICAgIHpzdHJlYW0uYXZhaWxfaW4gPSBjb21wX3NpemUrMTsKKyAgICAgICAgenN0cmVhbS5uZXh0X291dCA9IGRzdDsKKyAgICAgICAgenN0cmVhbS5hdmFpbF9vdXQgPSB1bmNvbXBfc2l6ZTsKIAogLyogQXBwYXJlbnRseSBhbiB1bmRvY3VtZW50ZWQgZmVhdHVyZSBvZiB6bGliOiBTZXQgd2luZG93c2l6ZQogICAgdG8gbmVnYXRpdmUgdmFsdWVzIHRvIHN1cHJlc3MgdGhlIGd6aXAgaGVhZGVyIGFuZCBiZSBjb21wYXRpYmxlIHdpdGgKICAgIHppcCEgKi8KLQkJcmVzdWx0ID0gVFJVRTsKLQkJaWYgKFpfT0sgIT0gKHggPSBpbmZsYXRlSW5pdDIoJnpzdHJlYW0sIC0xNSkpKSB7Ci0JCQlpZiAobm90aWZ5KQotCQkJCW5vdGlmeShaTElCX0VSUk9SLAotCQkJCSAgICAgICAiaW5mbGF0ZUluaXQyIHJldHVybnMgJWQiLCB4KTsKLQkJCXJlc3VsdCA9IEZBTFNFOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JCWlmIChaX1NUUkVBTV9FTkQgIT0gKHggPSBpbmZsYXRlKCZ6c3RyZWFtLCBaX0ZJTklTSCkpKSB7Ci0JCQlpZiAobm90aWZ5KQotCQkJCW5vdGlmeShaTElCX0VSUk9SLAotCQkJCSAgICAgICAiaW5mbGF0ZSByZXR1cm5zICVkIiwgeCk7Ci0JCQlyZXN1bHQgPSBGQUxTRTsKLQkJfQotCSAgY2xlYW51cDoKLQkJaWYgKFpfT0sgIT0gKHggPSBpbmZsYXRlRW5kKCZ6c3RyZWFtKSkpIHsKLQkJCWlmIChub3RpZnkpCi0JCQkJbm90aWZ5IChaTElCX0VSUk9SLAotCQkJCQkiaW5mbGF0ZUVuZCByZXR1cm5zICVkIiwgeCk7Ci0JCQlyZXN1bHQgPSBGQUxTRTsKLQkJfQotCX0gZWxzZSBpZiAobWV0aG9kID09IDApIHsKLQkJbWVtY3B5KGRzdCwgc3JjLCB1bmNvbXBfc2l6ZSk7Ci0JCXJlc3VsdCA9IFRSVUU7Ci0JfSBlbHNlCi0JCXJlc3VsdCA9IEZBTFNFOwotCVVubWFwVmlld09mRmlsZShkc3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICAgIGlmIChaX09LICE9ICh4ID0gaW5mbGF0ZUluaXQyKCZ6c3RyZWFtLCAtMTUpKSkgeworICAgICAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgICAgICBub3RpZnkoWkxJQl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGVJbml0MiByZXR1cm5zICVkIiwgeCk7CisgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgICAgICBpZiAoWl9TVFJFQU1fRU5EICE9ICh4ID0gaW5mbGF0ZSgmenN0cmVhbSwgWl9GSU5JU0gpKSkgeworICAgICAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgICAgICBub3RpZnkoWkxJQl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGUgcmV0dXJucyAlZCIsIHgpOworICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGNsZWFudXA6CisgICAgICAgIGlmIChaX09LICE9ICh4ID0gaW5mbGF0ZUVuZCgmenN0cmVhbSkpKSB7CisgICAgICAgICAgICBpZiAobm90aWZ5KQorICAgICAgICAgICAgICAgIG5vdGlmeSAoWkxJQl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgImluZmxhdGVFbmQgcmV0dXJucyAlZCIsIHgpOworICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PSAwKSB7CisgICAgICAgIG1lbWNweShkc3QsIHNyYywgdW5jb21wX3NpemUpOworICAgICAgICByZXN1bHQgPSBUUlVFOworICAgIH0gZWxzZQorICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICBVbm1hcFZpZXdPZkZpbGUoZHN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBPcGVuIGEgemlwLWNvbXBhdGlibGUgYXJjaGl2ZSBhbmQgZXh0cmFjdCBhbGwgZmlsZXMKQEAgLTIwMSwxMjEgKzIwMSwxMjEgQEAKICAqLwogQk9PTAogdW56aXBfYXJjaGl2ZShTQ0hFTUUgKnNjaGVtZSwgY2hhciAqZGlybmFtZSwgY2hhciAqZGF0YSwgRFdPUkQgc2l6ZSwKLQkgICAgICBOT1RJRllQUk9DIG5vdGlmeSkKKyAgICAgICAgICAgICAgTk9USUZZUFJPQyBub3RpZnkpCiB7Ci0JaW50IG47Ci0JY2hhciBwYXRobmFtZVtNQVhfUEFUSF07Ci0JY2hhciAqbmV3X3BhcnQ7CisgICAgaW50IG47CisgICAgY2hhciBwYXRobmFtZVtNQVhfUEFUSF07CisgICAgY2hhciAqbmV3X3BhcnQ7CiAKLQkvKiByZWFkIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICovCi0Jc3RydWN0IGVvZl9jZGlyICpwZSA9IChzdHJ1Y3QgZW9mX2NkaXIgKikmZGF0YVtzaXplIC0gc2l6ZW9mCi0JCQkJCQkgICAgICAgKHN0cnVjdCBlb2ZfY2RpcildOworICAgIC8qIHJlYWQgdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgKi8KKyAgICBzdHJ1Y3QgZW9mX2NkaXIgKnBlID0gKHN0cnVjdCBlb2ZfY2RpciAqKSZkYXRhW3NpemUgLSBzaXplb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgZW9mX2NkaXIpXTsKIAotCWludCBhcmNfc3RhcnQgPSBzaXplIC0gc2l6ZW9mIChzdHJ1Y3QgZW9mX2NkaXIpIC0gcGUtPm5CeXRlc0NEaXIgLQotCQlwZS0+b2ZzQ0RpcjsKKyAgICBpbnQgYXJjX3N0YXJ0ID0gc2l6ZSAtIHNpemVvZiAoc3RydWN0IGVvZl9jZGlyKSAtIHBlLT5uQnl0ZXNDRGlyIC0KKyAgICAgICAgcGUtPm9mc0NEaXI7CiAKLQkvKiBzZXQgcG9zaXRpb24gdG8gc3RhcnQgb2YgY2VudHJhbCBkaXJlY3RvcnkgKi8KLQlpbnQgcG9zID0gYXJjX3N0YXJ0ICsgcGUtPm9mc0NEaXI7CisgICAgLyogc2V0IHBvc2l0aW9uIHRvIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgaW50IHBvcyA9IGFyY19zdGFydCArIHBlLT5vZnNDRGlyOwogCi0JLyogbWFrZSBzdXJlIHRoaXMgaXMgYSB6aXAgZmlsZSAqLwotCWlmIChwZS0+dGFnICE9IDB4MDYwNTRiNTApCi0JCXJldHVybiBGQUxTRTsKLSAgICAKLQkvKiBMb29wIHRocm91Z2ggdGhlIGNlbnRyYWwgZGlyZWN0b3J5LCByZWFkaW5nIGFsbCBlbnRyaWVzICovCi0JZm9yIChuID0gMDsgbiA8IHBlLT5uVG90YWxDRGlyOyArK24pIHsKLQkJaW50IGk7Ci0JCWNoYXIgKmZuYW1lOwotCQljaGFyICpwY29tcDsKLQkJY2hhciAqZHN0OwotCQlzdHJ1Y3QgY2RpciAqcGNkaXI7Ci0JCXN0cnVjdCBmaGRyICpwZmhkcjsKKyAgICAvKiBtYWtlIHN1cmUgdGhpcyBpcyBhIHppcCBmaWxlICovCisgICAgaWYgKHBlLT50YWcgIT0gMHgwNjA1NGI1MCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCXBjZGlyID0gKHN0cnVjdCBjZGlyICopJmRhdGFbcG9zXTsKLQkJcGZoZHIgPSAoc3RydWN0IGZoZHIgKikmZGF0YVtwY2Rpci0+b2ZzX2xvY2FsX2hlYWRlciArCi0JCQkJCSAgICAgYXJjX3N0YXJ0XTsKKyAgICAvKiBMb29wIHRocm91Z2ggdGhlIGNlbnRyYWwgZGlyZWN0b3J5LCByZWFkaW5nIGFsbCBlbnRyaWVzICovCisgICAgZm9yIChuID0gMDsgbiA8IHBlLT5uVG90YWxDRGlyOyArK24pIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGNoYXIgKmZuYW1lOworICAgICAgICBjaGFyICpwY29tcDsKKyAgICAgICAgY2hhciAqZHN0OworICAgICAgICBzdHJ1Y3QgY2RpciAqcGNkaXI7CisgICAgICAgIHN0cnVjdCBmaGRyICpwZmhkcjsKIAotCQlpZiAocGNkaXItPnRhZyAhPSAweDAyMDE0YjUwKQotCQkJcmV0dXJuIEZBTFNFOwotCQlpZiAocGZoZHItPnRhZyAhPSAweDA0MDM0YjUwKQotCQkJcmV0dXJuIEZBTFNFOwotCQlwb3MgKz0gc2l6ZW9mKHN0cnVjdCBjZGlyKTsKLQkJZm5hbWUgPSAoY2hhciAqKSZkYXRhW3Bvc107IC8qIFRoaXMgaXMgbm90IG51bGwgdGVybWluYXRlZCEgKi8KLQkJcG9zICs9IHBjZGlyLT5mbmFtZV9sZW5ndGggKyBwY2Rpci0+ZXh0cmFfbGVuZ3RoICsKLQkJCXBjZGlyLT5jb21tZW50X2xlbmd0aDsKKyAgICAgICAgcGNkaXIgPSAoc3RydWN0IGNkaXIgKikmZGF0YVtwb3NdOworICAgICAgICBwZmhkciA9IChzdHJ1Y3QgZmhkciAqKSZkYXRhW3BjZGlyLT5vZnNfbG9jYWxfaGVhZGVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNfc3RhcnRdOwogCi0JCXBjb21wID0gJmRhdGFbcGNkaXItPm9mc19sb2NhbF9oZWFkZXIKLQkJCSAgICAgICsgc2l6ZW9mKHN0cnVjdCBmaGRyKQotCQkJICAgICAgKyBhcmNfc3RhcnQKLQkJCSAgICAgICsgcGZoZHItPmZuYW1lX2xlbmd0aAotCQkJICAgICAgKyBwZmhkci0+ZXh0cmFfbGVuZ3RoXTsKKyAgICAgICAgaWYgKHBjZGlyLT50YWcgIT0gMHgwMjAxNGI1MCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKHBmaGRyLT50YWcgIT0gMHgwNDAzNGI1MCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcG9zICs9IHNpemVvZihzdHJ1Y3QgY2Rpcik7CisgICAgICAgIGZuYW1lID0gKGNoYXIgKikmZGF0YVtwb3NdOyAvKiBUaGlzIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQhICovCisgICAgICAgIHBvcyArPSBwY2Rpci0+Zm5hbWVfbGVuZ3RoICsgcGNkaXItPmV4dHJhX2xlbmd0aCArCisgICAgICAgICAgICBwY2Rpci0+Y29tbWVudF9sZW5ndGg7CiAKLQkJLyogZGlybmFtZSBpcyB0aGUgUHl0aG9uIGhvbWUgZGlyZWN0b3J5IChwcmVmaXgpICovCi0JCXN0cmNweShwYXRobmFtZSwgZGlybmFtZSk7Ci0JCWlmIChwYXRobmFtZVtzdHJsZW4ocGF0aG5hbWUpLTFdICE9ICdcXCcpCi0JCQlzdHJjYXQocGF0aG5hbWUsICJcXCIpOwotCQluZXdfcGFydCA9ICZwYXRobmFtZVtsc3RybGVuKHBhdGhuYW1lKV07Ci0JCS8qIHdlIG11c3Qgbm93IG1hdGNoIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBwYXRobmFtZQotCQkgKiBpbiB0aGUgYXJjaGl2ZSB0byBhIGNvbXBvbmVudCBpbiB0aGUgaW5zdGFsbGF0aW9uCi0JCSAqIHNjaGVtZSAoUFVSRUxJQiwgUExBVExJQiwgSEVBREVSUywgU0NSSVBUUywgb3IgREFUQSkKLQkJICogYW5kIHJlcGxhY2UgdGhpcyBwYXJ0IGJ5IHRoZSBvbmUgaW4gdGhlIHNjaGVtZSB0byB1c2UKLQkJICovCi0JCWZvciAoaSA9IDA7IHNjaGVtZVtpXS5uYW1lOyArK2kpIHsKLQkJCWlmICgwID09IHN0cm5pY21wKHNjaGVtZVtpXS5uYW1lLCBmbmFtZSwKLQkJCQkJICBzdHJsZW4oc2NoZW1lW2ldLm5hbWUpKSkgewotCQkJCWNoYXIgKnJlc3Q7Ci0JCQkJaW50IGxlbjsKLQkJCQkKLQkJCQkvKiBsZW5ndGggb2YgdGhlIHJlcGxhY2VkIHBhcnQgKi8KLQkJCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihzY2hlbWVbaV0ubmFtZSk7Ci0JCQkJCi0JCQkJc3RyY2F0KHBhdGhuYW1lLCBzY2hlbWVbaV0ucHJlZml4KTsKLQkJCQkKLQkJCQlyZXN0ID0gZm5hbWUgKyBuYW1lbGVuOwotCQkJCWxlbiA9IHBmaGRyLT5mbmFtZV9sZW5ndGggLSBuYW1lbGVuOwotCQkJCQotCQkJCWlmICgocGF0aG5hbWVbc3RybGVuKHBhdGhuYW1lKS0xXSAhPSAnXFwnKQotCQkJCSAgICAmJiAocGF0aG5hbWVbc3RybGVuKHBhdGhuYW1lKS0xXSAhPSAnLycpKQotCQkJCQlzdHJjYXQocGF0aG5hbWUsICJcXCIpOwotCQkJCS8qIE5vdyB0aGF0IHBhdGhuYW1lIGVuZHMgd2l0aCBhIHNlcGFyYXRvciwKLQkJCQkgKiB3ZSBtdXN0IG1ha2Ugc3VyZSByZXN0IGRvZXMgbm90IHN0YXJ0IHdpdGgKLQkJCQkgKiBhbiBhZGRpdGlvbmFsIG9uZS4KLQkJCQkgKi8KLQkJCQlpZiAoKHJlc3RbMF0gPT0gJ1xcJykgfHwgKHJlc3RbMF0gPT0gJy8nKSkgewotCQkJCQkrK3Jlc3Q7Ci0JCQkJCS0tbGVuOwotCQkJCX0KKyAgICAgICAgcGNvbXAgPSAmZGF0YVtwY2Rpci0+b2ZzX2xvY2FsX2hlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCBmaGRyKQorICAgICAgICAgICAgICAgICAgICAgICsgYXJjX3N0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgKyBwZmhkci0+Zm5hbWVfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgKyBwZmhkci0+ZXh0cmFfbGVuZ3RoXTsKIAotCQkJCXN0cm5jYXQocGF0aG5hbWUsIHJlc3QsIGxlbik7Ci0JCQkJZ290byBEb25lOwotCQkJfQotCQl9Ci0JCS8qIG5vIHByZWZpeCB0byByZXBsYWNlIGZvdW5kLCBnbyB1bmNoYW5nZWQgKi8KLQkJc3RybmNhdChwYXRobmFtZSwgZm5hbWUsIHBmaGRyLT5mbmFtZV9sZW5ndGgpOwotCSAgRG9uZToKLQkJbm9ybXBhdGgocGF0aG5hbWUpOwotCQlpZiAocGF0aG5hbWVbc3RybGVuKHBhdGhuYW1lKS0xXSAhPSAnXFwnKSB7Ci0JCQkvKgotCQkJICogVGhlIGxvY2FsIGZpbGUgaGVhZGVyIChwZmhkcikgZG9lcyBub3QgYWx3YXlzCi0JCQkgKiBjb250YWluIHRoZSBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgc2l6ZXMgb2YKLQkJCSAqIHRoZSBkYXRhIGRlcGVuZGluZyBvbiBiaXQgMyBvZiB0aGUgZmxhZ3MgZmllbGQuICBTbwotCQkJICogaXQgc2VlbXMgYmV0dGVyIHRvIHVzZSB0aGUgZGF0YSBmcm9tIHRoZSBjZW50cmFsCi0JCQkgKiBkaXJlY3RvcnkgKHBjZGlyKS4KLQkJCSAqLwotCQkJZHN0ID0gbWFwX25ld19maWxlKDAsIHBhdGhuYW1lLCBuZXdfcGFydCwKLQkJCQkJICAgcGNkaXItPnVuY29tcF9zaXplLAotCQkJCQkgICBwY2Rpci0+bGFzdF9tb2RfZmlsZV9kYXRlLAotCQkJCQkgICBwY2Rpci0+bGFzdF9tb2RfZmlsZV90aW1lLCBub3RpZnkpOwotCQkJaWYgKGRzdCkgewotCQkJCWlmICghZXh0cmFjdF9maWxlKGRzdCwgcGNvbXAsIHBmaGRyLT5tZXRob2QsCi0JCQkJCQkgIHBjZGlyLT5jb21wX3NpemUsCi0JCQkJCQkgIHBjZGlyLT51bmNvbXBfc2l6ZSwKLQkJCQkJCSAgbm90aWZ5KSkKLQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJfSAvKiBlbHNlID8/PyAqLwotCQl9Ci0JCWlmIChub3RpZnkpCi0JCQlub3RpZnkoTlVNX0ZJTEVTLCBuZXdfcGFydCwgKGludClwZS0+blRvdGFsQ0RpciwKLQkJCSAgICAgICAoaW50KW4rMSk7Ci0JfQotCXJldHVybiBUUlVFOworICAgICAgICAvKiBkaXJuYW1lIGlzIHRoZSBQeXRob24gaG9tZSBkaXJlY3RvcnkgKHByZWZpeCkgKi8KKyAgICAgICAgc3RyY3B5KHBhdGhuYW1lLCBkaXJuYW1lKTsKKyAgICAgICAgaWYgKHBhdGhuYW1lW3N0cmxlbihwYXRobmFtZSktMV0gIT0gJ1xcJykKKyAgICAgICAgICAgIHN0cmNhdChwYXRobmFtZSwgIlxcIik7CisgICAgICAgIG5ld19wYXJ0ID0gJnBhdGhuYW1lW2xzdHJsZW4ocGF0aG5hbWUpXTsKKyAgICAgICAgLyogd2UgbXVzdCBub3cgbWF0Y2ggdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBhdGhuYW1lCisgICAgICAgICAqIGluIHRoZSBhcmNoaXZlIHRvIGEgY29tcG9uZW50IGluIHRoZSBpbnN0YWxsYXRpb24KKyAgICAgICAgICogc2NoZW1lIChQVVJFTElCLCBQTEFUTElCLCBIRUFERVJTLCBTQ1JJUFRTLCBvciBEQVRBKQorICAgICAgICAgKiBhbmQgcmVwbGFjZSB0aGlzIHBhcnQgYnkgdGhlIG9uZSBpbiB0aGUgc2NoZW1lIHRvIHVzZQorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgc2NoZW1lW2ldLm5hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKDAgPT0gc3RybmljbXAoc2NoZW1lW2ldLm5hbWUsIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHNjaGVtZVtpXS5uYW1lKSkpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpyZXN0OworICAgICAgICAgICAgICAgIGludCBsZW47CisKKyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgdGhlIHJlcGxhY2VkIHBhcnQgKi8KKyAgICAgICAgICAgICAgICBpbnQgbmFtZWxlbiA9IHN0cmxlbihzY2hlbWVbaV0ubmFtZSk7CisKKyAgICAgICAgICAgICAgICBzdHJjYXQocGF0aG5hbWUsIHNjaGVtZVtpXS5wcmVmaXgpOworCisgICAgICAgICAgICAgICAgcmVzdCA9IGZuYW1lICsgbmFtZWxlbjsKKyAgICAgICAgICAgICAgICBsZW4gPSBwZmhkci0+Zm5hbWVfbGVuZ3RoIC0gbmFtZWxlbjsKKworICAgICAgICAgICAgICAgIGlmICgocGF0aG5hbWVbc3RybGVuKHBhdGhuYW1lKS0xXSAhPSAnXFwnKQorICAgICAgICAgICAgICAgICAgICAmJiAocGF0aG5hbWVbc3RybGVuKHBhdGhuYW1lKS0xXSAhPSAnLycpKQorICAgICAgICAgICAgICAgICAgICBzdHJjYXQocGF0aG5hbWUsICJcXCIpOworICAgICAgICAgICAgICAgIC8qIE5vdyB0aGF0IHBhdGhuYW1lIGVuZHMgd2l0aCBhIHNlcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgKiB3ZSBtdXN0IG1ha2Ugc3VyZSByZXN0IGRvZXMgbm90IHN0YXJ0IHdpdGgKKyAgICAgICAgICAgICAgICAgKiBhbiBhZGRpdGlvbmFsIG9uZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHJlc3RbMF0gPT0gJ1xcJykgfHwgKHJlc3RbMF0gPT0gJy8nKSkgeworICAgICAgICAgICAgICAgICAgICArK3Jlc3Q7CisgICAgICAgICAgICAgICAgICAgIC0tbGVuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0cm5jYXQocGF0aG5hbWUsIHJlc3QsIGxlbik7CisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIG5vIHByZWZpeCB0byByZXBsYWNlIGZvdW5kLCBnbyB1bmNoYW5nZWQgKi8KKyAgICAgICAgc3RybmNhdChwYXRobmFtZSwgZm5hbWUsIHBmaGRyLT5mbmFtZV9sZW5ndGgpOworICAgICAgRG9uZToKKyAgICAgICAgbm9ybXBhdGgocGF0aG5hbWUpOworICAgICAgICBpZiAocGF0aG5hbWVbc3RybGVuKHBhdGhuYW1lKS0xXSAhPSAnXFwnKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGxvY2FsIGZpbGUgaGVhZGVyIChwZmhkcikgZG9lcyBub3QgYWx3YXlzCisgICAgICAgICAgICAgKiBjb250YWluIHRoZSBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgc2l6ZXMgb2YKKyAgICAgICAgICAgICAqIHRoZSBkYXRhIGRlcGVuZGluZyBvbiBiaXQgMyBvZiB0aGUgZmxhZ3MgZmllbGQuICBTbworICAgICAgICAgICAgICogaXQgc2VlbXMgYmV0dGVyIHRvIHVzZSB0aGUgZGF0YSBmcm9tIHRoZSBjZW50cmFsCisgICAgICAgICAgICAgKiBkaXJlY3RvcnkgKHBjZGlyKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZHN0ID0gbWFwX25ld19maWxlKDAsIHBhdGhuYW1lLCBuZXdfcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2Rpci0+dW5jb21wX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNkaXItPmxhc3RfbW9kX2ZpbGVfZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2Rpci0+bGFzdF9tb2RfZmlsZV90aW1lLCBub3RpZnkpOworICAgICAgICAgICAgaWYgKGRzdCkgeworICAgICAgICAgICAgICAgIGlmICghZXh0cmFjdF9maWxlKGRzdCwgcGNvbXAsIHBmaGRyLT5tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNkaXItPmNvbXBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2Rpci0+dW5jb21wX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfSAvKiBlbHNlID8/PyAqLworICAgICAgICB9CisgICAgICAgIGlmIChub3RpZnkpCisgICAgICAgICAgICBub3RpZnkoTlVNX0ZJTEVTLCBuZXdfcGFydCwgKGludClwZS0+blRvdGFsQ0RpciwKKyAgICAgICAgICAgICAgICAgICAoaW50KW4rMSk7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMgYi9QQy9iZGlzdF93aW5pbnN0L2luc3RhbGwuYwppbmRleCBhZThkMGRiLi5kNTQ3MmVmIDEwMDY0NAotLS0gYS9QQy9iZGlzdF93aW5pbnN0L2luc3RhbGwuYworKysgYi9QQy9iZGlzdF93aW5pbnN0L2luc3RhbGwuYwpAQCAtMjAsMjEgKzIwLDIxIEBACiAgKgogICogQXQgcnVudGltZSwgdGhlIGV4ZWZpbGUgaGFzIGFwcGVuZGVkOgogICogLSBjb21wcmVzc2VkIHNldHVwLWRhdGEgaW4gaW5pLWZvcm1hdCwgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgotICoJW21ldGFkYXRhXQotICoJYXV0aG9yPUdyZWcgV2FyZAotICoJYXV0aG9yX2VtYWlsPWd3YXJkQHB5dGhvbi5uZXQKLSAqCWRlc2NyaXB0aW9uPVB5dGhvbiBEaXN0cmlidXRpb24gVXRpbGl0aWVzCi0gKglsaWNlbmNlPVB5dGhvbgotICoJbmFtZT1EaXN0dXRpbHMKLSAqCXVybD1odHRwOi8vd3d3LnB5dGhvbi5vcmcvc2lncy9kaXN0dXRpbHMtc2lnLwotICoJdmVyc2lvbj0wLjlwcmUKKyAqICAgICAgW21ldGFkYXRhXQorICogICAgICBhdXRob3I9R3JlZyBXYXJkCisgKiAgICAgIGF1dGhvcl9lbWFpbD1nd2FyZEBweXRob24ubmV0CisgKiAgICAgIGRlc2NyaXB0aW9uPVB5dGhvbiBEaXN0cmlidXRpb24gVXRpbGl0aWVzCisgKiAgICAgIGxpY2VuY2U9UHl0aG9uCisgKiAgICAgIG5hbWU9RGlzdHV0aWxzCisgKiAgICAgIHVybD1odHRwOi8vd3d3LnB5dGhvbi5vcmcvc2lncy9kaXN0dXRpbHMtc2lnLworICogICAgICB2ZXJzaW9uPTAuOXByZQogICoKLSAqCVtTZXR1cF0KLSAqCWluZm89IHRleHQgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBlZGl0LWJveAotICoJdGl0bGU9IHRvIGJlIGRpc3BsYXllZCBieSB0aGlzIHByb2dyYW0KLSAqCXRhcmdldF92ZXJzaW9uID0gaWYgcHJlc2VudCwgcHl0aG9uIHZlcnNpb24gcmVxdWlyZWQKLSAqCXB5Y19jb21waWxlID0gaWYgMCwgZG8gbm90IGNvbXBpbGUgcHkgdG8gcHljCi0gKglweW9fY29tcGlsZSA9IGlmIDAsIGRvIG5vdCBjb21waWxlIHB5IHRvIHB5bworICogICAgICBbU2V0dXBdCisgKiAgICAgIGluZm89IHRleHQgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBlZGl0LWJveAorICogICAgICB0aXRsZT0gdG8gYmUgZGlzcGxheWVkIGJ5IHRoaXMgcHJvZ3JhbQorICogICAgICB0YXJnZXRfdmVyc2lvbiA9IGlmIHByZXNlbnQsIHB5dGhvbiB2ZXJzaW9uIHJlcXVpcmVkCisgKiAgICAgIHB5Y19jb21waWxlID0gaWYgMCwgZG8gbm90IGNvbXBpbGUgcHkgdG8gcHljCisgKiAgICAgIHB5b19jb21waWxlID0gaWYgMCwgZG8gbm90IGNvbXBpbGUgcHkgdG8gcHlvCiAgKgogICogLSBhIHN0cnVjdCBtZXRhX2RhdGFfaGRyLCBkZXNjcmliaW5nIHRoZSBhYm92ZQogICogLSBhIHppcC1maWxlLCBjb250YWluaW5nIHRoZSBtb2R1bGVzIHRvIGJlIGluc3RhbGxlZC4KQEAgLTExOCwyOCArMTE4LDI4IEBACiBIV05EIGh3bmRNYWluOwogSFdORCBoRGlhbG9nOwogCi1jaGFyICppbmlfZmlsZTsJCQkvKiBGdWxsIHBhdGhuYW1lIG9mIGluaS1maWxlICovCitjaGFyICppbmlfZmlsZTsgICAgICAgICAgICAgICAgIC8qIEZ1bGwgcGF0aG5hbWUgb2YgaW5pLWZpbGUgKi8KIC8qIEZyb20gaW5pLWZpbGUgKi8KLWNoYXIgaW5mb1s0MDk2XTsJCS8qIFtTZXR1cF0gaW5mbz0gKi8KLWNoYXIgdGl0bGVbODBdOwkJCS8qIFtTZXR1cF0gdGl0bGU9LCBjb250YWlucyBwYWNrYWdlIG5hbWUKLQkJCQkgICBpbmNsdWRpbmcgdmVyc2lvbjogIkRpc3R1dGlscy0xLjAuMSIgKi8KLWNoYXIgdGFyZ2V0X3ZlcnNpb25bMTBdOwkvKiBbU2V0dXBdIHRhcmdldF92ZXJzaW9uPSwgcmVxdWlyZWQgcHl0aG9uCi0JCQkJICAgdmVyc2lvbiBvciBlbXB0eSBzdHJpbmcgKi8KLWNoYXIgYnVpbGRfaW5mb1s4MF07CQkvKiBbU2V0dXBdIGJ1aWxkX2luZm89LCBkaXN0dXRpbHMgdmVyc2lvbgotCQkJCSAgIGFuZCBidWlsZCBkYXRlICovCitjaGFyIGluZm9bNDA5Nl07ICAgICAgICAgICAgICAgIC8qIFtTZXR1cF0gaW5mbz0gKi8KK2NoYXIgdGl0bGVbODBdOyAgICAgICAgICAgICAgICAgLyogW1NldHVwXSB0aXRsZT0sIGNvbnRhaW5zIHBhY2thZ2UgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgdmVyc2lvbjogIkRpc3R1dGlscy0xLjAuMSIgKi8KK2NoYXIgdGFyZ2V0X3ZlcnNpb25bMTBdOyAgICAgICAgLyogW1NldHVwXSB0YXJnZXRfdmVyc2lvbj0sIHJlcXVpcmVkIHB5dGhvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIG9yIGVtcHR5IHN0cmluZyAqLworY2hhciBidWlsZF9pbmZvWzgwXTsgICAgICAgICAgICAvKiBbU2V0dXBdIGJ1aWxkX2luZm89LCBkaXN0dXRpbHMgdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYnVpbGQgZGF0ZSAqLwogCi1jaGFyIG1ldGFfbmFtZVs4MF07CQkvKiBwYWNrYWdlIG5hbWUgd2l0aG91dCB2ZXJzaW9uIGxpa2UKLQkJCQkgICAnRGlzdHV0aWxzJyAqLworY2hhciBtZXRhX25hbWVbODBdOyAgICAgICAgICAgICAvKiBwYWNrYWdlIG5hbWUgd2l0aG91dCB2ZXJzaW9uIGxpa2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Rpc3R1dGlscycgKi8KIGNoYXIgaW5zdGFsbF9zY3JpcHRbTUFYX1BBVEhdOwogY2hhciAqcHJlX2luc3RhbGxfc2NyaXB0OyAvKiBydW4gYmVmb3JlIHdlIGluc3RhbGwgYSBzaW5nbGUgZmlsZSAqLwogCiBjaGFyIHVzZXJfYWNjZXNzX2NvbnRyb2xbMTBdOyAvLyBvbmUgb2YgJ2F1dG8nLCAnZm9yY2UnLCBvdGhlcndpc2Ugbm9uZS4KIAotaW50IHB5X21ham9yLCBweV9taW5vcjsJCS8qIFB5dGhvbiB2ZXJzaW9uIHNlbGVjdGVkIGZvciBpbnN0YWxsYXRpb24gKi8KK2ludCBweV9tYWpvciwgcHlfbWlub3I7ICAgICAgICAgLyogUHl0aG9uIHZlcnNpb24gc2VsZWN0ZWQgZm9yIGluc3RhbGxhdGlvbiAqLwogCi1jaGFyICphcmNfZGF0YTsJCQkvKiBtZW1vcnkgbWFwcGVkIGFyY2hpdmUgKi8KLURXT1JEIGFyY19zaXplOwkJCS8qIG51bWJlciBvZiBieXRlcyBpbiBhcmNoaXZlICovCi1pbnQgZXhlX3NpemU7CQkJLyogbnVtYmVyIG9mIGJ5dGVzIGZvciBleGUtZmlsZSBwb3J0aW9uICovCitjaGFyICphcmNfZGF0YTsgICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBtYXBwZWQgYXJjaGl2ZSAqLworRFdPUkQgYXJjX3NpemU7ICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gYXJjaGl2ZSAqLworaW50IGV4ZV9zaXplOyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgZm9yIGV4ZS1maWxlIHBvcnRpb24gKi8KIGNoYXIgcHl0aG9uX2RpcltNQVhfUEFUSF07CiBjaGFyIHB5dGhvbmRsbFtNQVhfUEFUSF07CiBCT09MIHB5Y19jb21waWxlLCBweW9fY29tcGlsZTsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBjdXJyZW50IHVzZXIuICovCiBIS0VZIGhrZXlfcm9vdCA9IChIS0VZKS0xOwogCi1CT09MIHN1Y2Nlc3M7CQkJLyogSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWxsPyAqLworQk9PTCBzdWNjZXNzOyAgICAgICAgICAgICAgICAgICAvKiBJbnN0YWxsYXRpb24gc3VjY2Vzc2Z1bGw/ICovCiBjaGFyICpmYWlsdXJlX3JlYXNvbiA9IE5VTEw7CiAKIEhBTkRMRSBoQml0bWFwOwpAQCAtMTY1LDEyOCArMTY1LDEyOCBAQAogLyogTm90ZTogSWYgc2NoZW1lLnByZWZpeCBpcyBub25lbXB0eSwgaXQgbXVzdCBlbmQgd2l0aCBhICdcJyEgKi8KIC8qIE5vdGU6IHB1cmVsaWIgbXVzdCBiZSB0aGUgRklSU1QgZW50cnkhICovCiBTQ0hFTUUgb2xkX3NjaGVtZVtdID0gewotCXsgIlBVUkVMSUIiLCAiIiB9LAotCXsgIlBMQVRMSUIiLCAiIiB9LAotCXsgIkhFQURFUlMiLCAiIiB9LCAvKiAnSW5jbHVkZS9kaXN0X25hbWUnIHBhcnQgYWxyZWFkeSBpbiBhcmNoaXZlICovCi0JeyAiU0NSSVBUUyIsICJTY3JpcHRzXFwiIH0sCi0JeyAiREFUQSIsICIiIH0sCi0JeyBOVUxMLCBOVUxMIH0sCisgICAgeyAiUFVSRUxJQiIsICIiIH0sCisgICAgeyAiUExBVExJQiIsICIiIH0sCisgICAgeyAiSEVBREVSUyIsICIiIH0sIC8qICdJbmNsdWRlL2Rpc3RfbmFtZScgcGFydCBhbHJlYWR5IGluIGFyY2hpdmUgKi8KKyAgICB7ICJTQ1JJUFRTIiwgIlNjcmlwdHNcXCIgfSwKKyAgICB7ICJEQVRBIiwgIiIgfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIFNDSEVNRSBuZXdfc2NoZW1lW10gPSB7Ci0JeyAiUFVSRUxJQiIsICJMaWJcXHNpdGUtcGFja2FnZXNcXCIgfSwKLQl7ICJQTEFUTElCIiwgIkxpYlxcc2l0ZS1wYWNrYWdlc1xcIiB9LAotCXsgIkhFQURFUlMiLCAiIiB9LCAvKiAnSW5jbHVkZS9kaXN0X25hbWUnIHBhcnQgYWxyZWFkeSBpbiBhcmNoaXZlICovCi0JeyAiU0NSSVBUUyIsICJTY3JpcHRzXFwiIH0sCi0JeyAiREFUQSIsICIiIH0sCi0JeyBOVUxMLCBOVUxMIH0sCisgICAgeyAiUFVSRUxJQiIsICJMaWJcXHNpdGUtcGFja2FnZXNcXCIgfSwKKyAgICB7ICJQTEFUTElCIiwgIkxpYlxcc2l0ZS1wYWNrYWdlc1xcIiB9LAorICAgIHsgIkhFQURFUlMiLCAiIiB9LCAvKiAnSW5jbHVkZS9kaXN0X25hbWUnIHBhcnQgYWxyZWFkeSBpbiBhcmNoaXZlICovCisgICAgeyAiU0NSSVBUUyIsICJTY3JpcHRzXFwiIH0sCisgICAgeyAiREFUQSIsICIiIH0sCisgICAgeyBOVUxMLCBOVUxMIH0sCiB9OwogCiBzdGF0aWMgdm9pZCB1bmVzY2FwZShjaGFyICpkc3QsIGNoYXIgKnNyYywgdW5zaWduZWQgc2l6ZSkKIHsKLQljaGFyICplb247Ci0JY2hhciBjaDsKKyAgICBjaGFyICplb247CisgICAgY2hhciBjaDsKIAotCXdoaWxlIChzcmMgJiYgKnNyYyAmJiAoc2l6ZSA+IDIpKSB7Ci0JCWlmICgqc3JjID09ICdcXCcpIHsKLQkJCXN3aXRjaCAoKisrc3JjKSB7Ci0JCQljYXNlICduJzoKLQkJCQkrK3NyYzsKLQkJCQkqZHN0KysgPSAnXHInOwotCQkJCSpkc3QrKyA9ICdcbic7Ci0JCQkJc2l6ZSAtPSAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSAncic6Ci0JCQkJKytzcmM7Ci0JCQkJKmRzdCsrID0gJ1xyJzsKLQkJCQktLXNpemU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzoKLQkJCQljaCA9IChjaGFyKXN0cnRvbChzcmMsICZlb24sIDgpOwotCQkJCWlmIChjaCA9PSAnXG4nKSB7Ci0JCQkJCSpkc3QrKyA9ICdccic7Ci0JCQkJCS0tc2l6ZTsKLQkJCQl9Ci0JCQkJKmRzdCsrID0gY2g7Ci0JCQkJLS1zaXplOwotCQkJCXNyYyA9IGVvbjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCSpkc3QrKyA9ICpzcmMrKzsKLQkJCS0tc2l6ZTsKLQkJfQotCX0KLQkqZHN0ID0gJ1wwJzsKKyAgICB3aGlsZSAoc3JjICYmICpzcmMgJiYgKHNpemUgPiAyKSkgeworICAgICAgICBpZiAoKnNyYyA9PSAnXFwnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKCorK3NyYykgeworICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgKytzcmM7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gJ1xyJzsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSAnXG4nOworICAgICAgICAgICAgICAgIHNpemUgLT0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAgICsrc3JjOworICAgICAgICAgICAgICAgICpkc3QrKyA9ICdccic7CisgICAgICAgICAgICAgICAgLS1zaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6CisgICAgICAgICAgICAgICAgY2ggPSAoY2hhcilzdHJ0b2woc3JjLCAmZW9uLCA4KTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAnXHInOworICAgICAgICAgICAgICAgICAgICAtLXNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpkc3QrKyA9IGNoOworICAgICAgICAgICAgICAgIC0tc2l6ZTsKKyAgICAgICAgICAgICAgICBzcmMgPSBlb247CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgICAgICAgICAtLXNpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgKmRzdCA9ICdcMCc7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGFnRmlsZSB7Ci0JY2hhciAqcGF0aDsKLQlzdHJ1Y3QgdGFnRmlsZSAqbmV4dDsKKyAgICBjaGFyICpwYXRoOworICAgIHN0cnVjdCB0YWdGaWxlICpuZXh0OwogfSAqZmlsZV9saXN0ID0gTlVMTDsKIAogc3RhdGljIHZvaWQgc2V0X2ZhaWx1cmVfcmVhc29uKGNoYXIgKnJlYXNvbikKIHsKICAgICBpZiAoZmFpbHVyZV9yZWFzb24pCi0JZnJlZShmYWlsdXJlX3JlYXNvbik7CisgICAgZnJlZShmYWlsdXJlX3JlYXNvbik7CiAgICAgZmFpbHVyZV9yZWFzb24gPSBzdHJkdXAocmVhc29uKTsKICAgICBzdWNjZXNzID0gRkFMU0U7CiB9CiBzdGF0aWMgY2hhciAqZ2V0X2ZhaWx1cmVfcmVhc29uKCkKIHsKICAgICBpZiAoIWZhaWx1cmVfcmVhc29uKQotCXJldHVybiAiSW5zdGFsbGF0aW9uIGZhaWxlZC4iOworICAgIHJldHVybiAiSW5zdGFsbGF0aW9uIGZhaWxlZC4iOwogICAgIHJldHVybiBmYWlsdXJlX3JlYXNvbjsKIH0KIAogc3RhdGljIHZvaWQgYWRkX3RvX2ZpbGVsaXN0KGNoYXIgKnBhdGgpCiB7Ci0Jc3RydWN0IHRhZ0ZpbGUgKnA7Ci0JcCA9IChzdHJ1Y3QgdGFnRmlsZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHRhZ0ZpbGUpKTsKLQlwLT5wYXRoID0gc3RyZHVwKHBhdGgpOwotCXAtPm5leHQgPSBmaWxlX2xpc3Q7Ci0JZmlsZV9saXN0ID0gcDsKKyAgICBzdHJ1Y3QgdGFnRmlsZSAqcDsKKyAgICBwID0gKHN0cnVjdCB0YWdGaWxlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGFnRmlsZSkpOworICAgIHAtPnBhdGggPSBzdHJkdXAocGF0aCk7CisgICAgcC0+bmV4dCA9IGZpbGVfbGlzdDsKKyAgICBmaWxlX2xpc3QgPSBwOwogfQogCiBzdGF0aWMgaW50IGRvX2NvbXBpbGVfZmlsZXMoaW50IChfX2NkZWNsICogUHlSdW5fU2ltcGxlU3RyaW5nKShjaGFyICopLAotCQkJICAgICBpbnQgb3B0aW1pemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRpbWl6ZSkKIHsKLQlzdHJ1Y3QgdGFnRmlsZSAqcDsKLQlpbnQgdG90YWwsIG47Ci0JY2hhciBCdWZmZXJbTUFYX1BBVEggKyA2NF07Ci0JaW50IGVycm9ycyA9IDA7CisgICAgc3RydWN0IHRhZ0ZpbGUgKnA7CisgICAgaW50IHRvdGFsLCBuOworICAgIGNoYXIgQnVmZmVyW01BWF9QQVRIICsgNjRdOworICAgIGludCBlcnJvcnMgPSAwOwogCi0JdG90YWwgPSAwOwotCXAgPSBmaWxlX2xpc3Q7Ci0Jd2hpbGUgKHApIHsKLQkJKyt0b3RhbDsKLQkJcCA9IHAtPm5leHQ7Ci0JfQotCVNlbmREbGdJdGVtTWVzc2FnZShoRGlhbG9nLCBJRENfUFJPR1JFU1MsIFBCTV9TRVRSQU5HRSwgMCwKLQkJCSAgICBNQUtFTFBBUkFNKDAsIHRvdGFsKSk7Ci0JU2VuZERsZ0l0ZW1NZXNzYWdlKGhEaWFsb2csIElEQ19QUk9HUkVTUywgUEJNX1NFVFBPUywgMCwgMCk7CisgICAgdG90YWwgPSAwOworICAgIHAgPSBmaWxlX2xpc3Q7CisgICAgd2hpbGUgKHApIHsKKyAgICAgICAgKyt0b3RhbDsKKyAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgfQorICAgIFNlbmREbGdJdGVtTWVzc2FnZShoRGlhbG9nLCBJRENfUFJPR1JFU1MsIFBCTV9TRVRSQU5HRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMUEFSQU0oMCwgdG90YWwpKTsKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaERpYWxvZywgSURDX1BST0dSRVNTLCBQQk1fU0VUUE9TLCAwLCAwKTsKIAotCW4gPSAwOwotCXAgPSBmaWxlX2xpc3Q7Ci0Jd2hpbGUgKHApIHsKLQkJKytuOwotCQl3c3ByaW50ZihCdWZmZXIsCi0JCQkgICJpbXBvcnQgcHlfY29tcGlsZTsgcHlfY29tcGlsZS5jb21waWxlIChyJyVzJykiLAotCQkJICBwLT5wYXRoKTsKLQkJaWYgKFB5UnVuX1NpbXBsZVN0cmluZyhCdWZmZXIpKSB7Ci0JCQkrK2Vycm9yczsKLQkJfQotCQkvKiBXZSBzZW5kIHRoZSBub3RpZmljYXRpb24gZXZlbiBpZiB0aGUgZmlsZXMgY291bGQgbm90Ci0JCSAqIGJlIGNyZWF0ZWQgc28gdGhhdCB0aGUgdW5pbnN0YWxsZXIgd2lsbCByZW1vdmUgdGhlbQotCQkgKiBpbiBjYXNlIHRoZXkgYXJlIGNyZWF0ZWQgbGF0ZXIuCi0JCSAqLwotCQl3c3ByaW50ZihCdWZmZXIsICIlcyVjIiwgcC0+cGF0aCwgb3B0aW1pemUgPyAnbycgOiAnYycpOwotCQlub3RpZnkoRklMRV9DUkVBVEVELCBCdWZmZXIpOworICAgIG4gPSAwOworICAgIHAgPSBmaWxlX2xpc3Q7CisgICAgd2hpbGUgKHApIHsKKyAgICAgICAgKytuOworICAgICAgICB3c3ByaW50ZihCdWZmZXIsCisgICAgICAgICAgICAgICAgICAiaW1wb3J0IHB5X2NvbXBpbGU7IHB5X2NvbXBpbGUuY29tcGlsZSAociclcycpIiwKKyAgICAgICAgICAgICAgICAgIHAtPnBhdGgpOworICAgICAgICBpZiAoUHlSdW5fU2ltcGxlU3RyaW5nKEJ1ZmZlcikpIHsKKyAgICAgICAgICAgICsrZXJyb3JzOworICAgICAgICB9CisgICAgICAgIC8qIFdlIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBldmVuIGlmIHRoZSBmaWxlcyBjb3VsZCBub3QKKyAgICAgICAgICogYmUgY3JlYXRlZCBzbyB0aGF0IHRoZSB1bmluc3RhbGxlciB3aWxsIHJlbW92ZSB0aGVtCisgICAgICAgICAqIGluIGNhc2UgdGhleSBhcmUgY3JlYXRlZCBsYXRlci4KKyAgICAgICAgICovCisgICAgICAgIHdzcHJpbnRmKEJ1ZmZlciwgIiVzJWMiLCBwLT5wYXRoLCBvcHRpbWl6ZSA/ICdvJyA6ICdjJyk7CisgICAgICAgIG5vdGlmeShGSUxFX0NSRUFURUQsIEJ1ZmZlcik7CiAKLQkJU2VuZERsZ0l0ZW1NZXNzYWdlKGhEaWFsb2csIElEQ19QUk9HUkVTUywgUEJNX1NFVFBPUywgbiwgMCk7Ci0JCVNldERsZ0l0ZW1UZXh0KGhEaWFsb2csIElEQ19JTkZPLCBwLT5wYXRoKTsKLQkJcCA9IHAtPm5leHQ7Ci0JfQotCXJldHVybiBlcnJvcnM7CisgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShoRGlhbG9nLCBJRENfUFJPR1JFU1MsIFBCTV9TRVRQT1MsIG4sIDApOworICAgICAgICBTZXREbGdJdGVtVGV4dChoRGlhbG9nLCBJRENfSU5GTywgcC0+cGF0aCk7CisgICAgICAgIHAgPSBwLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gZXJyb3JzOwogfQogCiAjZGVmaW5lIERFQ0xQUk9DKGRsbCwgcmVzdWx0LCBuYW1lLCBhcmdzKVwKQEAgLTMwNiw0NyArMzA2LDQ3IEBACiAgKi8KIHN0YXRpYyBpbnQgY29tcGlsZV9maWxlbGlzdChISU5TVEFOQ0UgaFB5dGhvbiwgQk9PTCBvcHRpbWl6ZV9mbGFnKQogewotCURFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0luaXRpYWxpemUsICh2b2lkKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfU2V0UHJvZ3JhbU5hbWUsIChjaGFyICopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9GaW5hbGl6ZSwgKHZvaWQpKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5UnVuX1NpbXBsZVN0cmluZywgKGNoYXIgKikpOwotCURFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5U3lzX0dldE9iamVjdCwgKGNoYXIgKikpOwotCURFQ0xWQVIoaFB5dGhvbiwgaW50LCBQeV9PcHRpbWl6ZUZsYWcpOworICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0luaXRpYWxpemUsICh2b2lkKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfU2V0UHJvZ3JhbU5hbWUsIChjaGFyICopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9GaW5hbGl6ZSwgKHZvaWQpKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5UnVuX1NpbXBsZVN0cmluZywgKGNoYXIgKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5U3lzX0dldE9iamVjdCwgKGNoYXIgKikpOworICAgIERFQ0xWQVIoaFB5dGhvbiwgaW50LCBQeV9PcHRpbWl6ZUZsYWcpOwogCi0JaW50IGVycm9ycyA9IDA7Ci0Jc3RydWN0IHRhZ0ZpbGUgKnAgPSBmaWxlX2xpc3Q7CisgICAgaW50IGVycm9ycyA9IDA7CisgICAgc3RydWN0IHRhZ0ZpbGUgKnAgPSBmaWxlX2xpc3Q7CiAKLQlpZiAoIXApCi0JCXJldHVybiAwOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5X1NldFByb2dyYW1OYW1lIHx8ICFQeV9GaW5hbGl6ZSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghUHlfSW5pdGlhbGl6ZSB8fCAhUHlfU2V0UHJvZ3JhbU5hbWUgfHwgIVB5X0ZpbmFsaXplKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoIVB5UnVuX1NpbXBsZVN0cmluZyB8fCAhUHlTeXNfR2V0T2JqZWN0IHx8ICFQeV9PcHRpbWl6ZUZsYWcpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5UnVuX1NpbXBsZVN0cmluZyB8fCAhUHlTeXNfR2V0T2JqZWN0IHx8ICFQeV9PcHRpbWl6ZUZsYWcpCisgICAgICAgIHJldHVybiAtMTsKIAotCSpQeV9PcHRpbWl6ZUZsYWcgPSBvcHRpbWl6ZV9mbGFnID8gMSA6IDA7Ci0JUHlfU2V0UHJvZ3JhbU5hbWUobW9kdWxlbmFtZSk7Ci0JUHlfSW5pdGlhbGl6ZSgpOworICAgICpQeV9PcHRpbWl6ZUZsYWcgPSBvcHRpbWl6ZV9mbGFnID8gMSA6IDA7CisgICAgUHlfU2V0UHJvZ3JhbU5hbWUobW9kdWxlbmFtZSk7CisgICAgUHlfSW5pdGlhbGl6ZSgpOwogCi0JZXJyb3JzICs9IGRvX2NvbXBpbGVfZmlsZXMoUHlSdW5fU2ltcGxlU3RyaW5nLCBvcHRpbWl6ZV9mbGFnKTsKLQlQeV9GaW5hbGl6ZSgpOworICAgIGVycm9ycyArPSBkb19jb21waWxlX2ZpbGVzKFB5UnVuX1NpbXBsZVN0cmluZywgb3B0aW1pemVfZmxhZyk7CisgICAgUHlfRmluYWxpemUoKTsKIAotCXJldHVybiBlcnJvcnM7CisgICAgcmV0dXJuIGVycm9yczsKIH0KIAogdHlwZWRlZiBQeU9iamVjdCAqKCpQeUNGdW5jdGlvbikoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKIHN0cnVjdCBQeU1ldGhvZERlZiB7Ci0JY2hhcgkqbWxfbmFtZTsKLQlQeUNGdW5jdGlvbiAgbWxfbWV0aDsKLQlpbnQJCSBtbF9mbGFnczsKLQljaGFyCSptbF9kb2M7CisgICAgY2hhciAgICAgICAgKm1sX25hbWU7CisgICAgUHlDRnVuY3Rpb24gIG1sX21ldGg7CisgICAgaW50ICAgICAgICAgICAgICAgICAgbWxfZmxhZ3M7CisgICAgY2hhciAgICAgICAgKm1sX2RvYzsKIH07CiB0eXBlZGVmIHN0cnVjdCBQeU1ldGhvZERlZiBQeU1ldGhvZERlZjsKIAogLy8gWFhYIC0gYWxsIG9mIHRoZXNlIGFyZSBwb3RlbnRpYWxseSBmcmFnaWxlISAgV2UgbG9hZCBhbmQgdW5sb2FkCi0vLyB0aGUgUHl0aG9uIERMTCBtdWx0aXBsZSB0aW1lcyAtIHNvIHN0b3JpbmcgZnVuY3Rpb25zIHBvaW50ZXJzIAorLy8gdGhlIFB5dGhvbiBETEwgbXVsdGlwbGUgdGltZXMgLSBzbyBzdG9yaW5nIGZ1bmN0aW9ucyBwb2ludGVycwogLy8gaXMgZGFuZ2Vyb3VzIChhbHRob3VnaCB0aGluZ3MgKmxvb2sqIE9LIGF0IHByZXNlbnQpCiAvLyBCZXR0ZXIgbWlnaHQgYmUgdG8gcm9sbCBwcmVwYXJlX3NjcmlwdF9lbnZpcm9ubWVudCgpIGludG8KIC8vIExvYWRQeXRob25EbGwoKSwgYW5kIGNyZWF0ZSBhIG5ldyBVbmxvYWRQeXRob25ETEwoKSB3aGljaCBhbHNvCkBAIC0zNjMsMjQ5ICszNjMsMjQ5IEBACiAjZGVmaW5lIERFRl9DU0lETChuYW1lKSB7IG5hbWUsICNuYW1lIH0KIAogc3RydWN0IHsKLQlpbnQgbkZvbGRlcjsKLQljaGFyICpuYW1lOworICAgIGludCBuRm9sZGVyOworICAgIGNoYXIgKm5hbWU7CiB9IGNzaWRsX25hbWVzW10gPSB7Ci0JLyogU3RhcnR1cCBtZW51IGZvciBhbGwgdXNlcnMuCi0JICAgTlQgb25seSAqLwotCURFRl9DU0lETChDU0lETF9DT01NT05fU1RBUlRNRU5VKSwKLQkvKiBTdGFydHVwIG1lbnUuICovCi0JREVGX0NTSURMKENTSURMX1NUQVJUTUVOVSksCisgICAgLyogU3RhcnR1cCBtZW51IGZvciBhbGwgdXNlcnMuCisgICAgICAgTlQgb25seSAqLworICAgIERFRl9DU0lETChDU0lETF9DT01NT05fU1RBUlRNRU5VKSwKKyAgICAvKiBTdGFydHVwIG1lbnUuICovCisgICAgREVGX0NTSURMKENTSURMX1NUQVJUTUVOVSksCiAKIC8qICAgIERFRl9DU0lETChDU0lETF9DT01NT05fQVBQREFUQSksICovCiAvKiAgICBERUZfQ1NJREwoQ1NJRExfTE9DQUxfQVBQREFUQSksICovCi0JLyogUmVwb3NpdG9yeSBmb3IgYXBwbGljYXRpb24tc3BlY2lmaWMgZGF0YS4KLQkgICBOZWVkcyBJbnRlcm5ldCBFeHBsb3JlciA0LjAgKi8KLQlERUZfQ1NJREwoQ1NJRExfQVBQREFUQSksCisgICAgLyogUmVwb3NpdG9yeSBmb3IgYXBwbGljYXRpb24tc3BlY2lmaWMgZGF0YS4KKyAgICAgICBOZWVkcyBJbnRlcm5ldCBFeHBsb3JlciA0LjAgKi8KKyAgICBERUZfQ1NJREwoQ1NJRExfQVBQREFUQSksCiAKLQkvKiBUaGUgZGVza3RvcCBmb3IgYWxsIHVzZXJzLgotCSAgIE5UIG9ubHkgKi8KLQlERUZfQ1NJREwoQ1NJRExfQ09NTU9OX0RFU0tUT1BESVJFQ1RPUlkpLAotCS8qIFRoZSBkZXNrdG9wLiAqLwotCURFRl9DU0lETChDU0lETF9ERVNLVE9QRElSRUNUT1JZKSwKKyAgICAvKiBUaGUgZGVza3RvcCBmb3IgYWxsIHVzZXJzLgorICAgICAgIE5UIG9ubHkgKi8KKyAgICBERUZfQ1NJREwoQ1NJRExfQ09NTU9OX0RFU0tUT1BESVJFQ1RPUlkpLAorICAgIC8qIFRoZSBkZXNrdG9wLiAqLworICAgIERFRl9DU0lETChDU0lETF9ERVNLVE9QRElSRUNUT1JZKSwKIAotCS8qIFN0YXJ0dXAgZm9sZGVyIGZvciBhbGwgdXNlcnMuCi0JICAgTlQgb25seSAqLwotCURFRl9DU0lETChDU0lETF9DT01NT05fU1RBUlRVUCksCi0JLyogU3RhcnR1cCBmb2xkZXIuICovCi0JREVGX0NTSURMKENTSURMX1NUQVJUVVApLAorICAgIC8qIFN0YXJ0dXAgZm9sZGVyIGZvciBhbGwgdXNlcnMuCisgICAgICAgTlQgb25seSAqLworICAgIERFRl9DU0lETChDU0lETF9DT01NT05fU1RBUlRVUCksCisgICAgLyogU3RhcnR1cCBmb2xkZXIuICovCisgICAgREVGX0NTSURMKENTSURMX1NUQVJUVVApLAogCi0JLyogUHJvZ3JhbXMgaXRlbSBpbiB0aGUgc3RhcnQgbWVudSBmb3IgYWxsIHVzZXJzLgotCSAgIE5UIG9ubHkgKi8KLQlERUZfQ1NJREwoQ1NJRExfQ09NTU9OX1BST0dSQU1TKSwKLQkvKiBQcm9ncmFtIGl0ZW0gaW4gdGhlIHVzZXIncyBzdGFydCBtZW51LiAqLwotCURFRl9DU0lETChDU0lETF9QUk9HUkFNUyksCisgICAgLyogUHJvZ3JhbXMgaXRlbSBpbiB0aGUgc3RhcnQgbWVudSBmb3IgYWxsIHVzZXJzLgorICAgICAgIE5UIG9ubHkgKi8KKyAgICBERUZfQ1NJREwoQ1NJRExfQ09NTU9OX1BST0dSQU1TKSwKKyAgICAvKiBQcm9ncmFtIGl0ZW0gaW4gdGhlIHVzZXIncyBzdGFydCBtZW51LiAqLworICAgIERFRl9DU0lETChDU0lETF9QUk9HUkFNUyksCiAKIC8qICAgIERFRl9DU0lETChDU0lETF9QUk9HUkFNX0ZJTEVTX0NPTU1PTiksICovCiAvKiAgICBERUZfQ1NJREwoQ1NJRExfUFJPR1JBTV9GSUxFUyksICovCiAKLQkvKiBWaXJ0dWFsIGZvbGRlciBjb250YWluaW5nIGZvbnRzLiAqLwotCURFRl9DU0lETChDU0lETF9GT05UUyksCisgICAgLyogVmlydHVhbCBmb2xkZXIgY29udGFpbmluZyBmb250cy4gKi8KKyAgICBERUZfQ1NJREwoQ1NJRExfRk9OVFMpLAogfTsKIAogI2RlZmluZSBESU0oYSkgKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVDcmVhdGVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoOwotCWlmICghZ19QeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnBhdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlub3RpZnkoRklMRV9DUkVBVEVELCBwYXRoKTsKLQlyZXR1cm4gZ19QeV9CdWlsZFZhbHVlKCIiKTsKKyAgICBjaGFyICpwYXRoOworICAgIGlmICghZ19QeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBub3RpZnkoRklMRV9DUkVBVEVELCBwYXRoKTsKKyAgICByZXR1cm4gZ19QeV9CdWlsZFZhbHVlKCIiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEaXJlY3RvcnlDcmVhdGVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoOwotCWlmICghZ19QeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnBhdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlub3RpZnkoRElSX0NSRUFURUQsIHBhdGgpOwotCXJldHVybiBnX1B5X0J1aWxkVmFsdWUoIiIpOworICAgIGNoYXIgKnBhdGg7CisgICAgaWYgKCFnX1B5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmcGF0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5vdGlmeShESVJfQ1JFQVRFRCwgcGF0aCk7CisgICAgcmV0dXJuIGdfUHlfQnVpbGRWYWx1ZSgiIik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR2V0U3BlY2lhbEZvbGRlclBhdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JY2hhciBscHN6UGF0aFtNQVhfUEFUSF07Ci0JaW50IGk7Ci0Jc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqTXlfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aCkoSFdORCBod25kLAotCQkJCQkJCSAgIExQVFNUUiBscHN6UGF0aCwKLQkJCQkJCQkgICBpbnQgbkZvbGRlciwKLQkJCQkJCQkgICBCT09MIGZDcmVhdGUpOworICAgIGNoYXIgKm5hbWU7CisgICAgY2hhciBscHN6UGF0aFtNQVhfUEFUSF07CisgICAgaW50IGk7CisgICAgc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqTXlfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aCkoSFdORCBod25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVFNUUiBscHN6UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIGZDcmVhdGUpOwogCi0JaWYgKCFNeV9TSEdldFNwZWNpYWxGb2xkZXJQYXRoKSB7Ci0JCUhJTlNUQU5DRSBoTGliID0gTG9hZExpYnJhcnkoInNoZWxsMzIuZGxsIik7Ci0JCWlmICghaExpYikgewotCQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAotCQkJCSAgICAgICAiZnVuY3Rpb24gbm90IGF2YWlsYWJsZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJTXlfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aCA9IChCT09MIChXSU5BUEkgKikoSFdORCwgTFBUU1RSLAotCQkJCQkJCSAgICAgaW50LCBCT09MKSkKLQkJCUdldFByb2NBZGRyZXNzKGhMaWIsCi0JCQkJICAgICAgICJTSEdldFNwZWNpYWxGb2xkZXJQYXRoQSIpOwotCX0KKyAgICBpZiAoIU15X1NIR2V0U3BlY2lhbEZvbGRlclBhdGgpIHsKKyAgICAgICAgSElOU1RBTkNFIGhMaWIgPSBMb2FkTGlicmFyeSgic2hlbGwzMi5kbGwiKTsKKyAgICAgICAgaWYgKCFoTGliKSB7CisgICAgICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gbm90IGF2YWlsYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgTXlfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aCA9IChCT09MIChXSU5BUEkgKikoSFdORCwgTFBUU1RSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIEJPT0wpKQorICAgICAgICAgICAgR2V0UHJvY0FkZHJlc3MoaExpYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTSEdldFNwZWNpYWxGb2xkZXJQYXRoQSIpOworICAgIH0KIAotCWlmICghZ19QeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLSAgICAKLQlpZiAoIU15X1NIR2V0U3BlY2lhbEZvbGRlclBhdGgpIHsKLQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLCAiZnVuY3Rpb24gbm90IGF2YWlsYWJsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFnX1B5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpID0gMDsgaSA8IERJTShjc2lkbF9uYW1lcyk7ICsraSkgewotCQlpZiAoMCA9PSBzdHJjbXBpKGNzaWRsX25hbWVzW2ldLm5hbWUsIG5hbWUpKSB7Ci0JCQlpbnQgbkZvbGRlcjsKLQkJCW5Gb2xkZXIgPSBjc2lkbF9uYW1lc1tpXS5uRm9sZGVyOwotCQkJaWYgKE15X1NIR2V0U3BlY2lhbEZvbGRlclBhdGgoTlVMTCwgbHBzelBhdGgsCi0JCQkJCQkgICAgICBuRm9sZGVyLCAwKSkKLQkJCQlyZXR1cm4gZ19QeV9CdWlsZFZhbHVlKCJzIiwgbHBzelBhdGgpOwotCQkJZWxzZSB7Ci0JCQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAotCQkJCQkgICAgICAgIm5vIHN1Y2ggZm9sZGVyICglcykiLCBuYW1lKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCi0JCX0KLQl9OwotCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfVmFsdWVFcnJvciwgInVua25vd24gQ1NJREwgKCVzKSIsIG5hbWUpOwotCXJldHVybiBOVUxMOworICAgIGlmICghTXlfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aCkgeworICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsICJmdW5jdGlvbiBub3QgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBESU0oY3NpZGxfbmFtZXMpOyArK2kpIHsKKyAgICAgICAgaWYgKDAgPT0gc3RyY21waShjc2lkbF9uYW1lc1tpXS5uYW1lLCBuYW1lKSkgeworICAgICAgICAgICAgaW50IG5Gb2xkZXI7CisgICAgICAgICAgICBuRm9sZGVyID0gY3NpZGxfbmFtZXNbaV0ubkZvbGRlcjsKKyAgICAgICAgICAgIGlmIChNeV9TSEdldFNwZWNpYWxGb2xkZXJQYXRoKE5VTEwsIGxwc3pQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkZvbGRlciwgMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGdfUHlfQnVpbGRWYWx1ZSgicyIsIGxwc3pQYXRoKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gc3VjaCBmb2xkZXIgKCVzKSIsIG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9OworICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfVmFsdWVFcnJvciwgInVua25vd24gQ1NJREwgKCVzKSIsIG5hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNyZWF0ZVNob3J0Y3V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoOyAvKiBwYXRoIGFuZCBmaWxlbmFtZSAqLwotCWNoYXIgKmRlc2NyaXB0aW9uOwotCWNoYXIgKmZpbGVuYW1lOworICAgIGNoYXIgKnBhdGg7IC8qIHBhdGggYW5kIGZpbGVuYW1lICovCisgICAgY2hhciAqZGVzY3JpcHRpb247CisgICAgY2hhciAqZmlsZW5hbWU7CiAKLQljaGFyICphcmd1bWVudHMgPSBOVUxMOwotCWNoYXIgKmljb25wYXRoID0gTlVMTDsKLQlpbnQgaWNvbmluZGV4ID0gMDsKLQljaGFyICp3b3JrZGlyID0gTlVMTDsKKyAgICBjaGFyICphcmd1bWVudHMgPSBOVUxMOworICAgIGNoYXIgKmljb25wYXRoID0gTlVMTDsKKyAgICBpbnQgaWNvbmluZGV4ID0gMDsKKyAgICBjaGFyICp3b3JrZGlyID0gTlVMTDsKIAotCVdDSEFSIHdzekZpbGVuYW1lW01BWF9QQVRIXTsKKyAgICBXQ0hBUiB3c3pGaWxlbmFtZVtNQVhfUEFUSF07CiAKLQlJU2hlbGxMaW5rICpwczEgPSBOVUxMOwotCUlQZXJzaXN0RmlsZSAqcFBmID0gTlVMTDsKKyAgICBJU2hlbGxMaW5rICpwczEgPSBOVUxMOworICAgIElQZXJzaXN0RmlsZSAqcFBmID0gTlVMTDsKIAotCUhSRVNVTFQgaHI7CisgICAgSFJFU1VMVCBocjsKIAotCWhyID0gQ29Jbml0aWFsaXplKE5VTEwpOwotCWlmIChGQUlMRUQoaHIpKSB7Ci0JCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKLQkJCSAgICAgICAiQ29Jbml0aWFsaXplIGZhaWxlZCwgZXJyb3IgMHgleCIsIGhyKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgaHIgPSBDb0luaXRpYWxpemUoTlVMTCk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiQ29Jbml0aWFsaXplIGZhaWxlZCwgZXJyb3IgMHgleCIsIGhyKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlpZiAoIWdfUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3NzfHNzc2kiLAotCQkJCSZwYXRoLCAmZGVzY3JpcHRpb24sICZmaWxlbmFtZSwKLQkJCQkmYXJndW1lbnRzLCAmd29ya2RpciwgJmljb25wYXRoLCAmaWNvbmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnX1B5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzc3xzc3NpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwgJmRlc2NyaXB0aW9uLCAmZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3VtZW50cywgJndvcmtkaXIsICZpY29ucGF0aCwgJmljb25pbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaHIgPSBDb0NyZWF0ZUluc3RhbmNlKCZDTFNJRF9TaGVsbExpbmssCi0JCQkgICAgICBOVUxMLAotCQkJICAgICAgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsCi0JCQkgICAgICAmSUlEX0lTaGVsbExpbmssCi0JCQkgICAgICAmcHMxKTsKLQlpZiAoRkFJTEVEKGhyKSkgewotCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCi0JCQkgICAgICAgIkNvQ3JlYXRlSW5zdGFuY2UgZmFpbGVkLCBlcnJvciAweCV4IiwgaHIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBociA9IENvQ3JlYXRlSW5zdGFuY2UoJkNMU0lEX1NoZWxsTGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZJSURfSVNoZWxsTGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzMSk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiQ29DcmVhdGVJbnN0YW5jZSBmYWlsZWQsIGVycm9yIDB4JXgiLCBocik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JaHIgPSBwczEtPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocHMxLCAmSUlEX0lQZXJzaXN0RmlsZSwKLQkJCQkJICh2b2lkICoqKSZwUGYpOwotCWlmIChGQUlMRUQoaHIpKSB7Ci0JCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKLQkJCSAgICAgICAiUXVlcnlJbnRlcmZhY2UoSVBlcnNpc3RGaWxlKSBlcnJvciAweCV4IiwgaHIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBociA9IHBzMS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwczEsICZJSURfSVBlcnNpc3RGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZwUGYpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5SW50ZXJmYWNlKElQZXJzaXN0RmlsZSkgZXJyb3IgMHgleCIsIGhyKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKIAotCWhyID0gcHMxLT5scFZ0YmwtPlNldFBhdGgocHMxLCBwYXRoKTsKLQlpZiAoRkFJTEVEKGhyKSkgewotCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCi0JCQkgICAgICAgIlNldFBhdGgoKSBmYWlsZWQsIGVycm9yIDB4JXgiLCBocik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGhyID0gcHMxLT5scFZ0YmwtPlNldFBhdGgocHMxLCBwYXRoKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJTZXRQYXRoKCkgZmFpbGVkLCBlcnJvciAweCV4IiwgaHIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWhyID0gcHMxLT5scFZ0YmwtPlNldERlc2NyaXB0aW9uKHBzMSwgZGVzY3JpcHRpb24pOwotCWlmIChGQUlMRUQoaHIpKSB7Ci0JCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKLQkJCSAgICAgICAiU2V0RGVzY3JpcHRpb24oKSBmYWlsZWQsIGVycm9yIDB4JXgiLCBocik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGhyID0gcHMxLT5scFZ0YmwtPlNldERlc2NyaXB0aW9uKHBzMSwgZGVzY3JpcHRpb24pOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIlNldERlc2NyaXB0aW9uKCkgZmFpbGVkLCBlcnJvciAweCV4IiwgaHIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWlmIChhcmd1bWVudHMpIHsKLQkJaHIgPSBwczEtPmxwVnRibC0+U2V0QXJndW1lbnRzKHBzMSwgYXJndW1lbnRzKTsKLQkJaWYgKEZBSUxFRChocikpIHsKLQkJCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKLQkJCQkgICAgICAgIlNldEFyZ3VtZW50cygpIGVycm9yIDB4JXgiLCBocik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQorICAgIGlmIChhcmd1bWVudHMpIHsKKyAgICAgICAgaHIgPSBwczEtPmxwVnRibC0+U2V0QXJndW1lbnRzKHBzMSwgYXJndW1lbnRzKTsKKyAgICAgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXRBcmd1bWVudHMoKSBlcnJvciAweCV4IiwgaHIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChpY29ucGF0aCkgewotCQlociA9IHBzMS0+bHBWdGJsLT5TZXRJY29uTG9jYXRpb24ocHMxLCBpY29ucGF0aCwgaWNvbmluZGV4KTsKLQkJaWYgKEZBSUxFRChocikpIHsKLQkJCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKLQkJCQkgICAgICAgIlNldEljb25Mb2NhdGlvbigpIGVycm9yIDB4JXgiLCBocik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQorICAgIGlmIChpY29ucGF0aCkgeworICAgICAgICBociA9IHBzMS0+bHBWdGJsLT5TZXRJY29uTG9jYXRpb24ocHMxLCBpY29ucGF0aCwgaWNvbmluZGV4KTsKKyAgICAgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXRJY29uTG9jYXRpb24oKSBlcnJvciAweCV4IiwgaHIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KIAotCWlmICh3b3JrZGlyKSB7Ci0JCWhyID0gcHMxLT5scFZ0YmwtPlNldFdvcmtpbmdEaXJlY3RvcnkocHMxLCB3b3JrZGlyKTsKLQkJaWYgKEZBSUxFRChocikpIHsKLQkJCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKLQkJCQkgICAgICAgIlNldFdvcmtpbmdEaXJlY3RvcnkoKSBlcnJvciAweCV4IiwgaHIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCX0KKyAgICBpZiAod29ya2RpcikgeworICAgICAgICBociA9IHBzMS0+bHBWdGJsLT5TZXRXb3JraW5nRGlyZWN0b3J5KHBzMSwgd29ya2Rpcik7CisgICAgICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0V29ya2luZ0RpcmVjdG9yeSgpIGVycm9yIDB4JXgiLCBocik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQogCi0JTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsCi0JCQkgICAgZmlsZW5hbWUsIC0xLAotCQkJICAgIHdzekZpbGVuYW1lLCBNQVhfUEFUSCk7Ci0JCQkKLQlociA9IHBQZi0+bHBWdGJsLT5TYXZlKHBQZiwgd3N6RmlsZW5hbWUsIFRSVUUpOwotCWlmIChGQUlMRUQoaHIpKSB7Ci0JCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKLQkJCSAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBzaG9ydGN1dCAnJXMnIC0gZXJyb3IgMHgleCIsIGZpbGVuYW1lLCBocik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotICAgIAotCXBQZi0+bHBWdGJsLT5SZWxlYXNlKHBQZik7Ci0JcHMxLT5scFZ0YmwtPlJlbGVhc2UocHMxKTsKLQlDb1VuaW5pdGlhbGl6ZSgpOwotCXJldHVybiBnX1B5X0J1aWxkVmFsdWUoIiIpOwotICAgIAorICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgd3N6RmlsZW5hbWUsIE1BWF9QQVRIKTsKKworICAgIGhyID0gcFBmLT5scFZ0YmwtPlNhdmUocFBmLCB3c3pGaWxlbmFtZSwgVFJVRSk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBzaG9ydGN1dCAnJXMnIC0gZXJyb3IgMHgleCIsIGZpbGVuYW1lLCBocik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcFBmLT5scFZ0YmwtPlJlbGVhc2UocFBmKTsKKyAgICBwczEtPmxwVnRibC0+UmVsZWFzZShwczEpOworICAgIENvVW5pbml0aWFsaXplKCk7CisgICAgcmV0dXJuIGdfUHlfQnVpbGRWYWx1ZSgiIik7CisKICAgZXJyb3I6Ci0JaWYgKHBQZikKLQkJcFBmLT5scFZ0YmwtPlJlbGVhc2UocFBmKTsKKyAgICBpZiAocFBmKQorICAgICAgICBwUGYtPmxwVnRibC0+UmVsZWFzZShwUGYpOwogCi0JaWYgKHBzMSkKLQkJcHMxLT5scFZ0YmwtPlJlbGVhc2UocHMxKTsKKyAgICBpZiAocHMxKQorICAgICAgICBwczEtPmxwVnRibC0+UmVsZWFzZShwczEpOwogCi0JQ29VbmluaXRpYWxpemUoKTsKKyAgICBDb1VuaW5pdGlhbGl6ZSgpOwogCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUHlNZXNzYWdlQm94KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmM7Ci0JY2hhciAqdGV4dCwgKmNhcHRpb247Ci0JaW50IGZsYWdzOwotCWlmICghZ19QeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc2kiLCAmdGV4dCwgJmNhcHRpb24sICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCXJjID0gTWVzc2FnZUJveChHZXRGb2N1cygpLCB0ZXh0LCBjYXB0aW9uLCBmbGFncyk7Ci0JcmV0dXJuIGdfUHlfQnVpbGRWYWx1ZSgiaSIsIHJjKTsKKyAgICBpbnQgcmM7CisgICAgY2hhciAqdGV4dCwgKmNhcHRpb247CisgICAgaW50IGZsYWdzOworICAgIGlmICghZ19QeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc2kiLCAmdGV4dCwgJmNhcHRpb24sICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJjID0gTWVzc2FnZUJveChHZXRGb2N1cygpLCB0ZXh0LCBjYXB0aW9uLCBmbGFncyk7CisgICAgcmV0dXJuIGdfUHlfQnVpbGRWYWx1ZSgiaSIsIHJjKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHZXRSb290SEtleShQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gZ19QeUxvbmdfRnJvbVZvaWRQdHIoaGtleV9yb290KTsKKyAgICByZXR1cm4gZ19QeUxvbmdfRnJvbVZvaWRQdHIoaGtleV9yb290KTsKIH0KIAogI2RlZmluZSBNRVRIX1ZBUkFSR1MgMHgwMDAxCkBAIC02MTMsNzQgKzYxMyw3NCBAQAogdHlwZWRlZiBQeU9iamVjdCAqKCpQeUNGdW5jdGlvbikoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKIFB5TWV0aG9kRGVmIG1ldGhbXSA9IHsKLQl7ImNyZWF0ZV9zaG9ydGN1dCIsIENyZWF0ZVNob3J0Y3V0LCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAotCXsiZ2V0X3NwZWNpYWxfZm9sZGVyX3BhdGgiLCBHZXRTcGVjaWFsRm9sZGVyUGF0aCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKLQl7ImdldF9yb290X2hrZXkiLCAoUHlDRnVuY3Rpb24pR2V0Um9vdEhLZXksIE1FVEhfTk9BUkdTLCBOVUxMfSwKLQl7ImZpbGVfY3JlYXRlZCIsIEZpbGVDcmVhdGVkLCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAotCXsiZGlyZWN0b3J5X2NyZWF0ZWQiLCBEaXJlY3RvcnlDcmVhdGVkLCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAotCXsibWVzc2FnZV9ib3giLCBQeU1lc3NhZ2VCb3gsIE1FVEhfVkFSQVJHUywgTlVMTH0sCisgICAgeyJjcmVhdGVfc2hvcnRjdXQiLCBDcmVhdGVTaG9ydGN1dCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKKyAgICB7ImdldF9zcGVjaWFsX2ZvbGRlcl9wYXRoIiwgR2V0U3BlY2lhbEZvbGRlclBhdGgsIE1FVEhfVkFSQVJHUywgTlVMTH0sCisgICAgeyJnZXRfcm9vdF9oa2V5IiwgKFB5Q0Z1bmN0aW9uKUdldFJvb3RIS2V5LCBNRVRIX05PQVJHUywgTlVMTH0sCisgICAgeyJmaWxlX2NyZWF0ZWQiLCBGaWxlQ3JlYXRlZCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKKyAgICB7ImRpcmVjdG9yeV9jcmVhdGVkIiwgRGlyZWN0b3J5Q3JlYXRlZCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKKyAgICB7Im1lc3NhZ2VfYm94IiwgUHlNZXNzYWdlQm94LCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAogfTsKIAogc3RhdGljIEhJTlNUQU5DRSBMb2FkUHl0aG9uRGxsKGNoYXIgKmZuYW1lKQogewotCWNoYXIgZnVsbHBhdGhbX01BWF9QQVRIXTsKLQlMT05HIHNpemUgPSBzaXplb2YoZnVsbHBhdGgpOwotCWNoYXIgc3Via2V5X25hbWVbODBdOwotCWNoYXIgYnVmZmVyWzI2MCArIDEyXTsKLQlISU5TVEFOQ0UgaDsKKyAgICBjaGFyIGZ1bGxwYXRoW19NQVhfUEFUSF07CisgICAgTE9ORyBzaXplID0gc2l6ZW9mKGZ1bGxwYXRoKTsKKyAgICBjaGFyIHN1YmtleV9uYW1lWzgwXTsKKyAgICBjaGFyIGJ1ZmZlclsyNjAgKyAxMl07CisgICAgSElOU1RBTkNFIGg7CiAKLQkvKiBtYWtlIHN1cmUgUFlUSE9OSE9NRSBpcyBzZXQsIHRvIHRoYXQgc3lzLnBhdGggaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5ICovCi0Jd3NwcmludGYoYnVmZmVyLCAiUFlUSE9OSE9NRT0lcyIsIHB5dGhvbl9kaXIpOwotCV9wdXRlbnYoYnVmZmVyKTsKLQloID0gTG9hZExpYnJhcnkoZm5hbWUpOwotCWlmIChoKQotCQlyZXR1cm4gaDsKLQl3c3ByaW50ZihzdWJrZXlfbmFtZSwKLQkJICJTT0ZUV0FSRVxcUHl0aG9uXFxQeXRob25Db3JlXFwlZC4lZFxcSW5zdGFsbFBhdGgiLAotCQkgcHlfbWFqb3IsIHB5X21pbm9yKTsKLQlpZiAoRVJST1JfU1VDQ0VTUyAhPSBSZWdRdWVyeVZhbHVlKEhLRVlfQ1VSUkVOVF9VU0VSLCBzdWJrZXlfbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoLCAmc2l6ZSkgJiYKLQkgICAgRVJST1JfU1VDQ0VTUyAhPSBSZWdRdWVyeVZhbHVlKEhLRVlfTE9DQUxfTUFDSElORSwgc3Via2V5X25hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlzdHJjYXQoZnVsbHBhdGgsICJcXCIpOwotCXN0cmNhdChmdWxscGF0aCwgZm5hbWUpOwotCXJldHVybiBMb2FkTGlicmFyeShmdWxscGF0aCk7CisgICAgLyogbWFrZSBzdXJlIFBZVEhPTkhPTUUgaXMgc2V0LCB0byB0aGF0IHN5cy5wYXRoIGlzIGluaXRpYWxpemVkIGNvcnJlY3RseSAqLworICAgIHdzcHJpbnRmKGJ1ZmZlciwgIlBZVEhPTkhPTUU9JXMiLCBweXRob25fZGlyKTsKKyAgICBfcHV0ZW52KGJ1ZmZlcik7CisgICAgaCA9IExvYWRMaWJyYXJ5KGZuYW1lKTsKKyAgICBpZiAoaCkKKyAgICAgICAgcmV0dXJuIGg7CisgICAgd3NwcmludGYoc3Via2V5X25hbWUsCisgICAgICAgICAgICAgIlNPRlRXQVJFXFxQeXRob25cXFB5dGhvbkNvcmVcXCVkLiVkXFxJbnN0YWxsUGF0aCIsCisgICAgICAgICAgICAgcHlfbWFqb3IsIHB5X21pbm9yKTsKKyAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBSZWdRdWVyeVZhbHVlKEhLRVlfQ1VSUkVOVF9VU0VSLCBzdWJrZXlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoLCAmc2l6ZSkgJiYKKyAgICAgICAgRVJST1JfU1VDQ0VTUyAhPSBSZWdRdWVyeVZhbHVlKEhLRVlfTE9DQUxfTUFDSElORSwgc3Via2V5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdHJjYXQoZnVsbHBhdGgsICJcXCIpOworICAgIHN0cmNhdChmdWxscGF0aCwgZm5hbWUpOworICAgIHJldHVybiBMb2FkTGlicmFyeShmdWxscGF0aCk7CiB9CiAKIHN0YXRpYyBpbnQgcHJlcGFyZV9zY3JpcHRfZW52aXJvbm1lbnQoSElOU1RBTkNFIGhQeXRob24pCiB7Ci0JUHlPYmplY3QgKm1vZDsKLQlERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUltcG9ydF9JbXBvcnRNb2R1bGUsIChjaGFyICopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcsIChQeU9iamVjdCAqLCBjaGFyICosIFB5T2JqZWN0ICopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeU9iamVjdF9HZXRBdHRyU3RyaW5nLCAoUHlPYmplY3QgKiwgY2hhciAqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlDRnVuY3Rpb25fTmV3LCAoUHlNZXRob2REZWYgKiwgUHlPYmplY3QgKikpOwotCURFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5X0J1aWxkVmFsdWUsIChjaGFyICosIC4uLikpOwotCURFQ0xQUk9DKGhQeXRob24sIGludCwgUHlBcmdfUGFyc2VUdXBsZSwgKFB5T2JqZWN0ICosIGNoYXIgKiwgLi4uKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlFcnJfRm9ybWF0LCAoUHlPYmplY3QgKiwgY2hhciAqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlMb25nX0Zyb21Wb2lkUHRyLCAodm9pZCAqKSk7Ci0JaWYgKCFQeUltcG9ydF9JbXBvcnRNb2R1bGUgfHwgIVB5T2JqZWN0X0dldEF0dHJTdHJpbmcgfHwgCi0JICAgICFQeU9iamVjdF9TZXRBdHRyU3RyaW5nIHx8ICFQeUNGdW5jdGlvbl9OZXcpCi0JCXJldHVybiAxOwotCWlmICghUHlfQnVpbGRWYWx1ZSB8fCAhUHlBcmdfUGFyc2VUdXBsZSB8fCAhUHlFcnJfRm9ybWF0KQotCQlyZXR1cm4gMTsKKyAgICBQeU9iamVjdCAqbW9kOworICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5SW1wb3J0X0ltcG9ydE1vZHVsZSwgKGNoYXIgKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlPYmplY3RfU2V0QXR0clN0cmluZywgKFB5T2JqZWN0ICosIGNoYXIgKiwgUHlPYmplY3QgKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcsIChQeU9iamVjdCAqLCBjaGFyICopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUNGdW5jdGlvbl9OZXcsIChQeU1ldGhvZERlZiAqLCBQeU9iamVjdCAqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlfQnVpbGRWYWx1ZSwgKGNoYXIgKiwgLi4uKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeUFyZ19QYXJzZVR1cGxlLCAoUHlPYmplY3QgKiwgY2hhciAqLCAuLi4pKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUVycl9Gb3JtYXQsIChQeU9iamVjdCAqLCBjaGFyICopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUxvbmdfRnJvbVZvaWRQdHIsICh2b2lkICopKTsKKyAgICBpZiAoIVB5SW1wb3J0X0ltcG9ydE1vZHVsZSB8fCAhUHlPYmplY3RfR2V0QXR0clN0cmluZyB8fAorICAgICAgICAhUHlPYmplY3RfU2V0QXR0clN0cmluZyB8fCAhUHlDRnVuY3Rpb25fTmV3KQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoIVB5X0J1aWxkVmFsdWUgfHwgIVB5QXJnX1BhcnNlVHVwbGUgfHwgIVB5RXJyX0Zvcm1hdCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQltb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoIl9fYnVpbHRpbl9fIik7Ci0JaWYgKG1vZCkgewotCQlpbnQgaTsKLQkJZ19QeUV4Y19WYWx1ZUVycm9yID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsICJWYWx1ZUVycm9yIik7Ci0JCWdfUHlFeGNfT1NFcnJvciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiT1NFcnJvciIpOwotCQlmb3IgKGkgPSAwOyBpIDwgRElNKG1ldGgpOyArK2kpIHsKLQkJCVB5T2JqZWN0X1NldEF0dHJTdHJpbmcobW9kLCBtZXRoW2ldLm1sX25hbWUsCi0JCQkJCSAgICAgICBQeUNGdW5jdGlvbl9OZXcoJm1ldGhbaV0sIE5VTEwpKTsKLQkJfQotCX0KLQlnX1B5X0J1aWxkVmFsdWUgPSBQeV9CdWlsZFZhbHVlOwotCWdfUHlBcmdfUGFyc2VUdXBsZSA9IFB5QXJnX1BhcnNlVHVwbGU7Ci0JZ19QeUVycl9Gb3JtYXQgPSBQeUVycl9Gb3JtYXQ7Ci0JZ19QeUxvbmdfRnJvbVZvaWRQdHIgPSBQeUxvbmdfRnJvbVZvaWRQdHI7CisgICAgbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJfX2J1aWx0aW5fXyIpOworICAgIGlmIChtb2QpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGdfUHlFeGNfVmFsdWVFcnJvciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiVmFsdWVFcnJvciIpOworICAgICAgICBnX1B5RXhjX09TRXJyb3IgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIk9TRXJyb3IiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IERJTShtZXRoKTsgKytpKSB7CisgICAgICAgICAgICBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKG1vZCwgbWV0aFtpXS5tbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNGdW5jdGlvbl9OZXcoJm1ldGhbaV0sIE5VTEwpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBnX1B5X0J1aWxkVmFsdWUgPSBQeV9CdWlsZFZhbHVlOworICAgIGdfUHlBcmdfUGFyc2VUdXBsZSA9IFB5QXJnX1BhcnNlVHVwbGU7CisgICAgZ19QeUVycl9Gb3JtYXQgPSBQeUVycl9Gb3JtYXQ7CisgICAgZ19QeUxvbmdfRnJvbVZvaWRQdHIgPSBQeUxvbmdfRnJvbVZvaWRQdHI7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTY5Niw0NzMgKzY5Niw0NzMgQEAKIHN0YXRpYyBpbnQKIGRvX3J1bl9pbnN0YWxsc2NyaXB0KEhJTlNUQU5DRSBoUHl0aG9uLCBjaGFyICpwYXRobmFtZSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCWludCBmaCwgcmVzdWx0OwotCURFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0luaXRpYWxpemUsICh2b2lkKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVN5c19TZXRBcmd2LCAoaW50LCBjaGFyICoqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVJ1bl9TaW1wbGVTdHJpbmcsIChjaGFyICopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9GaW5hbGl6ZSwgKHZvaWQpKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeV9CdWlsZFZhbHVlLCAoY2hhciAqLCAuLi4pKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUNGdW5jdGlvbl9OZXcsCi0JCSAoUHlNZXRob2REZWYgKiwgUHlPYmplY3QgKikpOwotCURFQ0xQUk9DKGhQeXRob24sIGludCwgUHlBcmdfUGFyc2VUdXBsZSwgKFB5T2JqZWN0ICosIGNoYXIgKiwgLi4uKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlFcnJfRm9ybWF0LCAoUHlPYmplY3QgKiwgY2hhciAqKSk7CisgICAgaW50IGZoLCByZXN1bHQ7CisgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfSW5pdGlhbGl6ZSwgKHZvaWQpKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5U3lzX1NldEFyZ3YsIChpbnQsIGNoYXIgKiopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5UnVuX1NpbXBsZVN0cmluZywgKGNoYXIgKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0ZpbmFsaXplLCAodm9pZCkpOworICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5X0J1aWxkVmFsdWUsIChjaGFyICosIC4uLikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5Q0Z1bmN0aW9uX05ldywKKyAgICAgICAgICAgICAoUHlNZXRob2REZWYgKiwgUHlPYmplY3QgKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlBcmdfUGFyc2VUdXBsZSwgKFB5T2JqZWN0ICosIGNoYXIgKiwgLi4uKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlFcnJfRm9ybWF0LCAoUHlPYmplY3QgKiwgY2hhciAqKSk7CiAKLQlpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5U3lzX1NldEFyZ3YKLQkgICAgfHwgIVB5UnVuX1NpbXBsZVN0cmluZyB8fCAhUHlfRmluYWxpemUpCi0JCXJldHVybiAxOwotCQotCWlmICghUHlfQnVpbGRWYWx1ZSB8fCAhUHlBcmdfUGFyc2VUdXBsZSB8fCAhUHlFcnJfRm9ybWF0KQotCQlyZXR1cm4gMTsKKyAgICBpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5U3lzX1NldEFyZ3YKKyAgICAgICAgfHwgIVB5UnVuX1NpbXBsZVN0cmluZyB8fCAhUHlfRmluYWxpemUpCisgICAgICAgIHJldHVybiAxOwogCi0JaWYgKCFQeUNGdW5jdGlvbl9OZXcgfHwgIVB5QXJnX1BhcnNlVHVwbGUgfHwgIVB5RXJyX0Zvcm1hdCkKLQkJcmV0dXJuIDE7CisgICAgaWYgKCFQeV9CdWlsZFZhbHVlIHx8ICFQeUFyZ19QYXJzZVR1cGxlIHx8ICFQeUVycl9Gb3JtYXQpCisgICAgICAgIHJldHVybiAxOwogCi0JaWYgKHBhdGhuYW1lID09IE5VTEwgfHwgcGF0aG5hbWVbMF0gPT0gJ1wwJykKLQkJcmV0dXJuIDI7CisgICAgaWYgKCFQeUNGdW5jdGlvbl9OZXcgfHwgIVB5QXJnX1BhcnNlVHVwbGUgfHwgIVB5RXJyX0Zvcm1hdCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlmaCA9IG9wZW4ocGF0aG5hbWUsIF9PX1JET05MWSk7Ci0JaWYgKC0xID09IGZoKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gcG9zdGluc3RhbGwtc2NyaXB0ICVzXG4iLAotCQkJcGF0aG5hbWUpOwotCQlyZXR1cm4gMzsKLQl9CisgICAgaWYgKHBhdGhuYW1lID09IE5VTEwgfHwgcGF0aG5hbWVbMF0gPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIDI7CiAKLQlTZXREbGdJdGVtVGV4dChoRGlhbG9nLCBJRENfSU5GTywgIlJ1bm5pbmcgU2NyaXB0Li4uIik7CisgICAgZmggPSBvcGVuKHBhdGhuYW1lLCBfT19SRE9OTFkpOworICAgIGlmICgtMSA9PSBmaCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHBvc3RpbnN0YWxsLXNjcmlwdCAlc1xuIiwKKyAgICAgICAgICAgIHBhdGhuYW1lKTsKKyAgICAgICAgcmV0dXJuIDM7CisgICAgfQogCi0JUHlfSW5pdGlhbGl6ZSgpOworICAgIFNldERsZ0l0ZW1UZXh0KGhEaWFsb2csIElEQ19JTkZPLCAiUnVubmluZyBTY3JpcHQuLi4iKTsKIAotCXByZXBhcmVfc2NyaXB0X2Vudmlyb25tZW50KGhQeXRob24pOwotCVB5U3lzX1NldEFyZ3YoYXJnYywgYXJndik7Ci0JcmVzdWx0ID0gMzsKLQl7Ci0JCXN0cnVjdCBfc3RhdCBzdGF0YnVmOwotCQlpZigwID09IF9mc3RhdChmaCwgJnN0YXRidWYpKSB7Ci0JCQljaGFyICpzY3JpcHQgPSBhbGxvY2Eoc3RhdGJ1Zi5zdF9zaXplICsgNSk7Ci0JCQlpbnQgbiA9IHJlYWQoZmgsIHNjcmlwdCwgc3RhdGJ1Zi5zdF9zaXplKTsKLQkJCWlmIChuID4gMCkgewotCQkJCXNjcmlwdFtuXSA9ICdcbic7Ci0JCQkJc2NyaXB0W24rMV0gPSAwOwotCQkJCXJlc3VsdCA9IFB5UnVuX1NpbXBsZVN0cmluZyhzY3JpcHQpOwotCQkJfQotCQl9Ci0JfQotCVB5X0ZpbmFsaXplKCk7CisgICAgUHlfSW5pdGlhbGl6ZSgpOwogCi0JY2xvc2UoZmgpOwotCXJldHVybiByZXN1bHQ7CisgICAgcHJlcGFyZV9zY3JpcHRfZW52aXJvbm1lbnQoaFB5dGhvbik7CisgICAgUHlTeXNfU2V0QXJndihhcmdjLCBhcmd2KTsKKyAgICByZXN1bHQgPSAzOworICAgIHsKKyAgICAgICAgc3RydWN0IF9zdGF0IHN0YXRidWY7CisgICAgICAgIGlmKDAgPT0gX2ZzdGF0KGZoLCAmc3RhdGJ1ZikpIHsKKyAgICAgICAgICAgIGNoYXIgKnNjcmlwdCA9IGFsbG9jYShzdGF0YnVmLnN0X3NpemUgKyA1KTsKKyAgICAgICAgICAgIGludCBuID0gcmVhZChmaCwgc2NyaXB0LCBzdGF0YnVmLnN0X3NpemUpOworICAgICAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICAgICAgc2NyaXB0W25dID0gJ1xuJzsKKyAgICAgICAgICAgICAgICBzY3JpcHRbbisxXSA9IDA7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlSdW5fU2ltcGxlU3RyaW5nKHNjcmlwdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfRmluYWxpemUoKTsKKworICAgIGNsb3NlKGZoKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBydW5faW5zdGFsbHNjcmlwdChjaGFyICpwYXRobmFtZSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICoqcE91dHB1dCkKIHsKLQlISU5TVEFOQ0UgaFB5dGhvbjsKLQlpbnQgcmVzdWx0ID0gMTsKLQlpbnQgb3V0X2J1Zl9zaXplOwotCUhBTkRMRSByZWRpcmVjdGVkLCBvbGRfc3RkZXJyLCBvbGRfc3Rkb3V0OwotCWNoYXIgKnRlbXBuYW1lOworICAgIEhJTlNUQU5DRSBoUHl0aG9uOworICAgIGludCByZXN1bHQgPSAxOworICAgIGludCBvdXRfYnVmX3NpemU7CisgICAgSEFORExFIHJlZGlyZWN0ZWQsIG9sZF9zdGRlcnIsIG9sZF9zdGRvdXQ7CisgICAgY2hhciAqdGVtcG5hbWU7CiAKLQkqcE91dHB1dCA9IE5VTEw7CisgICAgKnBPdXRwdXQgPSBOVUxMOwogCi0JdGVtcG5hbWUgPSB0ZW1wbmFtKE5VTEwsIE5VTEwpOwotCS8vIFdlIHVzZSBhIHN0YXRpYyBDUlQgd2hpbGUgdGhlIFB5dGhvbiB2ZXJzaW9uIHdlIGxvYWQgdXNlcwotCS8vIHRoZSBDUlQgZnJvbSBvbmUgb2YgdmFyaW91cyBwb3NzaWJpbGUgRExMcy4gIEFzIGEgcmVzdWx0IHdlCi0JLy8gbmVlZCB0byByZWRpcmVjdCB0aGUgc3RhbmRhcmQgaGFuZGxlcyB1c2luZyB0aGUgQVBJIHJhdGhlcgotCS8vIHRoYW4gdGhlIENSVC4KLQlyZWRpcmVjdGVkID0gQ3JlYXRlRmlsZSgKLQkJCQkJdGVtcG5hbWUsCi0JCQkJCUdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQsCi0JCQkJCUZJTEVfU0hBUkVfUkVBRCwKLQkJCQkJTlVMTCwKLQkJCQkJQ1JFQVRFX0FMV0FZUywKLQkJCQkJRklMRV9BVFRSSUJVVEVfTk9STUFMIHwgRklMRV9GTEFHX1dSSVRFX1RIUk9VR0gsCi0JCQkJCU5VTEwpOwotCW9sZF9zdGRvdXQgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOwotCW9sZF9zdGRlcnIgPSBHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7Ci0JU2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFLCByZWRpcmVjdGVkKTsKLQlTZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSwgcmVkaXJlY3RlZCk7CisgICAgdGVtcG5hbWUgPSB0ZW1wbmFtKE5VTEwsIE5VTEwpOworICAgIC8vIFdlIHVzZSBhIHN0YXRpYyBDUlQgd2hpbGUgdGhlIFB5dGhvbiB2ZXJzaW9uIHdlIGxvYWQgdXNlcworICAgIC8vIHRoZSBDUlQgZnJvbSBvbmUgb2YgdmFyaW91cyBwb3NzaWJpbGUgRExMcy4gIEFzIGEgcmVzdWx0IHdlCisgICAgLy8gbmVlZCB0byByZWRpcmVjdCB0aGUgc3RhbmRhcmQgaGFuZGxlcyB1c2luZyB0aGUgQVBJIHJhdGhlcgorICAgIC8vIHRoYW4gdGhlIENSVC4KKyAgICByZWRpcmVjdGVkID0gQ3JlYXRlRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEVfQUxXQVlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMIHwgRklMRV9GTEFHX1dSSVRFX1RIUk9VR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBvbGRfc3Rkb3V0ID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKKyAgICBvbGRfc3RkZXJyID0gR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpOworICAgIFNldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSwgcmVkaXJlY3RlZCk7CisgICAgU2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUsIHJlZGlyZWN0ZWQpOwogCi0JaFB5dGhvbiA9IExvYWRQeXRob25EbGwocHl0aG9uZGxsKTsKLQlpZiAoaFB5dGhvbikgewotCQlyZXN1bHQgPSBkb19ydW5faW5zdGFsbHNjcmlwdChoUHl0aG9uLCBwYXRobmFtZSwgYXJnYywgYXJndik7Ci0JCUZyZWVMaWJyYXJ5KGhQeXRob24pOwotCX0gZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiKioqIENvdWxkIG5vdCBsb2FkIFB5dGhvbiAqKioiKTsKLQl9Ci0JU2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFLCBvbGRfc3Rkb3V0KTsKLQlTZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSwgb2xkX3N0ZGVycik7Ci0Jb3V0X2J1Zl9zaXplID0gbWluKEdldEZpbGVTaXplKHJlZGlyZWN0ZWQsIE5VTEwpLCA0MDk2KTsKLQkqcE91dHB1dCA9IG1hbGxvYyhvdXRfYnVmX3NpemUrMSk7Ci0JaWYgKCpwT3V0cHV0KSB7Ci0JCURXT1JEIG5yZWFkID0gMDsKLQkJU2V0RmlsZVBvaW50ZXIocmVkaXJlY3RlZCwgMCwgMCwgRklMRV9CRUdJTik7Ci0JCVJlYWRGaWxlKHJlZGlyZWN0ZWQsICpwT3V0cHV0LCBvdXRfYnVmX3NpemUsICZucmVhZCwgTlVMTCk7Ci0JCSgqcE91dHB1dClbbnJlYWRdID0gJ1wwJzsKLQl9Ci0JQ2xvc2VIYW5kbGUocmVkaXJlY3RlZCk7Ci0JRGVsZXRlRmlsZSh0ZW1wbmFtZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBoUHl0aG9uID0gTG9hZFB5dGhvbkRsbChweXRob25kbGwpOworICAgIGlmIChoUHl0aG9uKSB7CisgICAgICAgIHJlc3VsdCA9IGRvX3J1bl9pbnN0YWxsc2NyaXB0KGhQeXRob24sIHBhdGhuYW1lLCBhcmdjLCBhcmd2KTsKKyAgICAgICAgRnJlZUxpYnJhcnkoaFB5dGhvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIqKiogQ291bGQgbm90IGxvYWQgUHl0aG9uICoqKiIpOworICAgIH0KKyAgICBTZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUsIG9sZF9zdGRvdXQpOworICAgIFNldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFLCBvbGRfc3RkZXJyKTsKKyAgICBvdXRfYnVmX3NpemUgPSBtaW4oR2V0RmlsZVNpemUocmVkaXJlY3RlZCwgTlVMTCksIDQwOTYpOworICAgICpwT3V0cHV0ID0gbWFsbG9jKG91dF9idWZfc2l6ZSsxKTsKKyAgICBpZiAoKnBPdXRwdXQpIHsKKyAgICAgICAgRFdPUkQgbnJlYWQgPSAwOworICAgICAgICBTZXRGaWxlUG9pbnRlcihyZWRpcmVjdGVkLCAwLCAwLCBGSUxFX0JFR0lOKTsKKyAgICAgICAgUmVhZEZpbGUocmVkaXJlY3RlZCwgKnBPdXRwdXQsIG91dF9idWZfc2l6ZSwgJm5yZWFkLCBOVUxMKTsKKyAgICAgICAgKCpwT3V0cHV0KVtucmVhZF0gPSAnXDAnOworICAgIH0KKyAgICBDbG9zZUhhbmRsZShyZWRpcmVjdGVkKTsKKyAgICBEZWxldGVGaWxlKHRlbXBuYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50IGRvX3J1bl9zaW1wbGVfc2NyaXB0KEhJTlNUQU5DRSBoUHl0aG9uLCBjaGFyICpzY3JpcHQpCiB7Ci0JaW50IHJjOwotCURFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0luaXRpYWxpemUsICh2b2lkKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfU2V0UHJvZ3JhbU5hbWUsIChjaGFyICopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9GaW5hbGl6ZSwgKHZvaWQpKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5UnVuX1NpbXBsZVN0cmluZywgKGNoYXIgKikpOwotCURFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5RXJyX1ByaW50LCAodm9pZCkpOworICAgIGludCByYzsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9Jbml0aWFsaXplLCAodm9pZCkpOworICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X1NldFByb2dyYW1OYW1lLCAoY2hhciAqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfRmluYWxpemUsICh2b2lkKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVJ1bl9TaW1wbGVTdHJpbmcsIChjaGFyICopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeUVycl9QcmludCwgKHZvaWQpKTsKIAotCWlmICghUHlfSW5pdGlhbGl6ZSB8fCAhUHlfU2V0UHJvZ3JhbU5hbWUgfHwgIVB5X0ZpbmFsaXplIHx8IAotCSAgICAhUHlSdW5fU2ltcGxlU3RyaW5nIHx8ICFQeUVycl9QcmludCkKLQkJcmV0dXJuIC0xOworICAgIGlmICghUHlfSW5pdGlhbGl6ZSB8fCAhUHlfU2V0UHJvZ3JhbU5hbWUgfHwgIVB5X0ZpbmFsaXplIHx8CisgICAgICAgICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5RXJyX1ByaW50KQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9TZXRQcm9ncmFtTmFtZShtb2R1bGVuYW1lKTsKLQlQeV9Jbml0aWFsaXplKCk7Ci0JcHJlcGFyZV9zY3JpcHRfZW52aXJvbm1lbnQoaFB5dGhvbik7Ci0JcmMgPSBQeVJ1bl9TaW1wbGVTdHJpbmcoc2NyaXB0KTsKLQlpZiAocmMpCi0JCVB5RXJyX1ByaW50KCk7Ci0JUHlfRmluYWxpemUoKTsKLQlyZXR1cm4gcmM7CisgICAgUHlfU2V0UHJvZ3JhbU5hbWUobW9kdWxlbmFtZSk7CisgICAgUHlfSW5pdGlhbGl6ZSgpOworICAgIHByZXBhcmVfc2NyaXB0X2Vudmlyb25tZW50KGhQeXRob24pOworICAgIHJjID0gUHlSdW5fU2ltcGxlU3RyaW5nKHNjcmlwdCk7CisgICAgaWYgKHJjKQorICAgICAgICBQeUVycl9QcmludCgpOworICAgIFB5X0ZpbmFsaXplKCk7CisgICAgcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IHJ1bl9zaW1wbGVfc2NyaXB0KGNoYXIgKnNjcmlwdCkKIHsKLQlpbnQgcmM7Ci0JSElOU1RBTkNFIGhQeXRob247Ci0JY2hhciAqdGVtcG5hbWUgPSB0ZW1wbmFtKE5VTEwsIE5VTEwpOwotCS8vIFJlZGlyZWN0IG91dHB1dCB1c2luZyB3aW4zMiBBUEkgLSBzZWUgY29tbWVudHMgYWJvdmUuLi4KLQlIQU5ETEUgcmVkaXJlY3RlZCA9IENyZWF0ZUZpbGUoCi0JCQkJCXRlbXBuYW1lLAotCQkJCQlHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19SRUFELAotCQkJCQlGSUxFX1NIQVJFX1JFQUQsCi0JCQkJCU5VTEwsCi0JCQkJCUNSRUFURV9BTFdBWVMsCi0JCQkJCUZJTEVfQVRUUklCVVRFX05PUk1BTCB8IEZJTEVfRkxBR19XUklURV9USFJPVUdILAotCQkJCQlOVUxMKTsKLQlIQU5ETEUgb2xkX3N0ZG91dCA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7Ci0JSEFORExFIG9sZF9zdGRlcnIgPSBHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7Ci0JU2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFLCByZWRpcmVjdGVkKTsKLQlTZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSwgcmVkaXJlY3RlZCk7CisgICAgaW50IHJjOworICAgIEhJTlNUQU5DRSBoUHl0aG9uOworICAgIGNoYXIgKnRlbXBuYW1lID0gdGVtcG5hbShOVUxMLCBOVUxMKTsKKyAgICAvLyBSZWRpcmVjdCBvdXRwdXQgdXNpbmcgd2luMzIgQVBJIC0gc2VlIGNvbW1lbnRzIGFib3ZlLi4uCisgICAgSEFORExFIHJlZGlyZWN0ZWQgPSBDcmVhdGVGaWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9TSEFSRV9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURV9BTFdBWVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwgfCBGSUxFX0ZMQUdfV1JJVEVfVEhST1VHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIEhBTkRMRSBvbGRfc3Rkb3V0ID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKKyAgICBIQU5ETEUgb2xkX3N0ZGVyciA9IEdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKKyAgICBTZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUsIHJlZGlyZWN0ZWQpOworICAgIFNldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFLCByZWRpcmVjdGVkKTsKIAotCWhQeXRob24gPSBMb2FkUHl0aG9uRGxsKHB5dGhvbmRsbCk7Ci0JaWYgKCFoUHl0aG9uKSB7Ci0JCWNoYXIgcmVhc29uWzEyOF07Ci0JCXdzcHJpbnRmKHJlYXNvbiwgIkNhbid0IGxvYWQgUHl0aG9uIGZvciBwcmUtaW5zdGFsbCBzY3JpcHQgKCVkKSIsIEdldExhc3RFcnJvcigpKTsKLQkJc2V0X2ZhaWx1cmVfcmVhc29uKHJlYXNvbik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmMgPSBkb19ydW5fc2ltcGxlX3NjcmlwdChoUHl0aG9uLCBzY3JpcHQpOwotCUZyZWVMaWJyYXJ5KGhQeXRob24pOwotCVNldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSwgb2xkX3N0ZG91dCk7Ci0JU2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUsIG9sZF9zdGRlcnIpOwotCS8qIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgb3V0cHV0IHdoZW4gd2UgZmFpbC4gIElmIHRoZSBzY3JpcHQgd29ya3MKLQkgICBPSywgdGhlbiB3ZSBkaXNjYXJkIGl0Ci0JKi8KLQlpZiAocmMpIHsKLQkJaW50IGVycl9idWZfc2l6ZTsKLQkJY2hhciAqZXJyX2J1ZjsKLQkJY29uc3QgY2hhciAqcHJlZml4ID0gIlJ1bm5pbmcgdGhlIHByZS1pbnN0YWxsYXRpb24gc2NyaXB0IGZhaWxlZFxyXG4iOwotCQlpbnQgcHJlZml4X2xlbiA9IHN0cmxlbihwcmVmaXgpOwotCQllcnJfYnVmX3NpemUgPSBHZXRGaWxlU2l6ZShyZWRpcmVjdGVkLCBOVUxMKTsKLQkJaWYgKGVycl9idWZfc2l6ZT09SU5WQUxJRF9GSUxFX1NJWkUpIC8vIGFuIGVycm9yIC0gbGV0J3MgdHJ5IGFueXdheS4uLgotCQkJZXJyX2J1Zl9zaXplID0gNDA5NjsKLQkJZXJyX2J1ZiA9IG1hbGxvYyhwcmVmaXhfbGVuICsgZXJyX2J1Zl9zaXplICsgMSk7Ci0JCWlmIChlcnJfYnVmKSB7Ci0JCQlEV09SRCBuID0gMDsKLQkJCXN0cmNweShlcnJfYnVmLCBwcmVmaXgpOwotCQkJU2V0RmlsZVBvaW50ZXIocmVkaXJlY3RlZCwgMCwgMCwgRklMRV9CRUdJTik7Ci0JCQlSZWFkRmlsZShyZWRpcmVjdGVkLCBlcnJfYnVmK3ByZWZpeF9sZW4sIGVycl9idWZfc2l6ZSwgJm4sIE5VTEwpOwotCQkJZXJyX2J1ZltwcmVmaXhfbGVuK25dID0gJ1wwJzsKLQkJCXNldF9mYWlsdXJlX3JlYXNvbihlcnJfYnVmKTsKLQkJCWZyZWUoZXJyX2J1Zik7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRfZmFpbHVyZV9yZWFzb24oIk91dCBvZiBtZW1vcnkhIik7Ci0JCX0KLQl9Ci0JQ2xvc2VIYW5kbGUocmVkaXJlY3RlZCk7Ci0JRGVsZXRlRmlsZSh0ZW1wbmFtZSk7Ci0JcmV0dXJuIHJjOworICAgIGhQeXRob24gPSBMb2FkUHl0aG9uRGxsKHB5dGhvbmRsbCk7CisgICAgaWYgKCFoUHl0aG9uKSB7CisgICAgICAgIGNoYXIgcmVhc29uWzEyOF07CisgICAgICAgIHdzcHJpbnRmKHJlYXNvbiwgIkNhbid0IGxvYWQgUHl0aG9uIGZvciBwcmUtaW5zdGFsbCBzY3JpcHQgKCVkKSIsIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgc2V0X2ZhaWx1cmVfcmVhc29uKHJlYXNvbik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmMgPSBkb19ydW5fc2ltcGxlX3NjcmlwdChoUHl0aG9uLCBzY3JpcHQpOworICAgIEZyZWVMaWJyYXJ5KGhQeXRob24pOworICAgIFNldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSwgb2xkX3N0ZG91dCk7CisgICAgU2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUsIG9sZF9zdGRlcnIpOworICAgIC8qIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgb3V0cHV0IHdoZW4gd2UgZmFpbC4gIElmIHRoZSBzY3JpcHQgd29ya3MKKyAgICAgICBPSywgdGhlbiB3ZSBkaXNjYXJkIGl0CisgICAgKi8KKyAgICBpZiAocmMpIHsKKyAgICAgICAgaW50IGVycl9idWZfc2l6ZTsKKyAgICAgICAgY2hhciAqZXJyX2J1ZjsKKyAgICAgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIlJ1bm5pbmcgdGhlIHByZS1pbnN0YWxsYXRpb24gc2NyaXB0IGZhaWxlZFxyXG4iOworICAgICAgICBpbnQgcHJlZml4X2xlbiA9IHN0cmxlbihwcmVmaXgpOworICAgICAgICBlcnJfYnVmX3NpemUgPSBHZXRGaWxlU2l6ZShyZWRpcmVjdGVkLCBOVUxMKTsKKyAgICAgICAgaWYgKGVycl9idWZfc2l6ZT09SU5WQUxJRF9GSUxFX1NJWkUpIC8vIGFuIGVycm9yIC0gbGV0J3MgdHJ5IGFueXdheS4uLgorICAgICAgICAgICAgZXJyX2J1Zl9zaXplID0gNDA5NjsKKyAgICAgICAgZXJyX2J1ZiA9IG1hbGxvYyhwcmVmaXhfbGVuICsgZXJyX2J1Zl9zaXplICsgMSk7CisgICAgICAgIGlmIChlcnJfYnVmKSB7CisgICAgICAgICAgICBEV09SRCBuID0gMDsKKyAgICAgICAgICAgIHN0cmNweShlcnJfYnVmLCBwcmVmaXgpOworICAgICAgICAgICAgU2V0RmlsZVBvaW50ZXIocmVkaXJlY3RlZCwgMCwgMCwgRklMRV9CRUdJTik7CisgICAgICAgICAgICBSZWFkRmlsZShyZWRpcmVjdGVkLCBlcnJfYnVmK3ByZWZpeF9sZW4sIGVycl9idWZfc2l6ZSwgJm4sIE5VTEwpOworICAgICAgICAgICAgZXJyX2J1ZltwcmVmaXhfbGVuK25dID0gJ1wwJzsKKyAgICAgICAgICAgIHNldF9mYWlsdXJlX3JlYXNvbihlcnJfYnVmKTsKKyAgICAgICAgICAgIGZyZWUoZXJyX2J1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRfZmFpbHVyZV9yZWFzb24oIk91dCBvZiBtZW1vcnkhIik7CisgICAgICAgIH0KKyAgICB9CisgICAgQ2xvc2VIYW5kbGUocmVkaXJlY3RlZCk7CisgICAgRGVsZXRlRmlsZSh0ZW1wbmFtZSk7CisgICAgcmV0dXJuIHJjOwogfQogCiAKIHN0YXRpYyBCT09MIFN5c3RlbUVycm9yKGludCBlcnJvciwgY2hhciAqbXNnKQogewotCWNoYXIgQnVmZmVyWzEwMjRdOwotCWludCBuOworICAgIGNoYXIgQnVmZmVyWzEwMjRdOworICAgIGludCBuOwogCi0JaWYgKGVycm9yKSB7Ci0JCUxQVk9JRCBscE1zZ0J1ZjsKLQkJRm9ybWF0TWVzc2FnZSggCi0JCQlGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCAKLQkJCUZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAotCQkJTlVMTCwKLQkJCWVycm9yLAotCQkJTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCi0JCQkoTFBTVFIpJmxwTXNnQnVmLAotCQkJMCwKLQkJCU5VTEwgCi0JCQkpOwotCQlzdHJuY3B5KEJ1ZmZlciwgbHBNc2dCdWYsIHNpemVvZihCdWZmZXIpKTsKLQkJTG9jYWxGcmVlKGxwTXNnQnVmKTsKLQl9IGVsc2UKLQkJQnVmZmVyWzBdID0gJ1wwJzsKLQluID0gbHN0cmxlbihCdWZmZXIpOwotCV9zbnByaW50ZihCdWZmZXIrbiwgc2l6ZW9mKEJ1ZmZlciktbiwgbXNnKTsKLQlNZXNzYWdlQm94KGh3bmRNYWluLCBCdWZmZXIsICJSdW50aW1lIEVycm9yIiwgTUJfT0sgfCBNQl9JQ09OU1RPUCk7Ci0JcmV0dXJuIEZBTFNFOworICAgIGlmIChlcnJvcikgeworICAgICAgICBMUFZPSUQgbHBNc2dCdWY7CisgICAgICAgIEZvcm1hdE1lc3NhZ2UoCisgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAorICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwKKyAgICAgICAgICAgIChMUFNUUikmbHBNc2dCdWYsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgKTsKKyAgICAgICAgc3RybmNweShCdWZmZXIsIGxwTXNnQnVmLCBzaXplb2YoQnVmZmVyKSk7CisgICAgICAgIExvY2FsRnJlZShscE1zZ0J1Zik7CisgICAgfSBlbHNlCisgICAgICAgIEJ1ZmZlclswXSA9ICdcMCc7CisgICAgbiA9IGxzdHJsZW4oQnVmZmVyKTsKKyAgICBfc25wcmludGYoQnVmZmVyK24sIHNpemVvZihCdWZmZXIpLW4sIG1zZyk7CisgICAgTWVzc2FnZUJveChod25kTWFpbiwgQnVmZmVyLCAiUnVudGltZSBFcnJvciIsIE1CX09LIHwgTUJfSUNPTlNUT1ApOworICAgIHJldHVybiBGQUxTRTsKIH0KIAogc3RhdGljIEJPT0wgbm90aWZ5IChpbnQgY29kZSwgY2hhciAqZm10LCAuLi4pCiB7Ci0JY2hhciBCdWZmZXJbMTAyNF07Ci0JdmFfbGlzdCBtYXJrZXI7Ci0JQk9PTCByZXN1bHQgPSBUUlVFOwotCWludCBhLCBiOwotCWNoYXIgKmNwOworICAgIGNoYXIgQnVmZmVyWzEwMjRdOworICAgIHZhX2xpc3QgbWFya2VyOworICAgIEJPT0wgcmVzdWx0ID0gVFJVRTsKKyAgICBpbnQgYSwgYjsKKyAgICBjaGFyICpjcDsKIAotCXZhX3N0YXJ0KG1hcmtlciwgZm10KTsKLQlfdnNucHJpbnRmKEJ1ZmZlciwgc2l6ZW9mKEJ1ZmZlciksIGZtdCwgbWFya2VyKTsKKyAgICB2YV9zdGFydChtYXJrZXIsIGZtdCk7CisgICAgX3ZzbnByaW50ZihCdWZmZXIsIHNpemVvZihCdWZmZXIpLCBmbXQsIG1hcmtlcik7CiAKLQlzd2l0Y2ggKGNvZGUpIHsKKyAgICBzd2l0Y2ggKGNvZGUpIHsKIC8qIFF1ZXN0aW9ucyAqLwotCWNhc2UgQ0FOX09WRVJXUklURToKLQkJYnJlYWs7CisgICAgY2FzZSBDQU5fT1ZFUldSSVRFOgorICAgICAgICBicmVhazsKIAogLyogSW5mb3JtYXRpb24gbm90aWZpY2F0aW9uICovCi0JY2FzZSBESVJfQ1JFQVRFRDoKLQkJaWYgKGxvZ2ZpbGUpCi0JCQlmcHJpbnRmKGxvZ2ZpbGUsICIxMDAgTWFkZSBEaXI6ICVzXG4iLCBmbXQpOwotCQlicmVhazsKKyAgICBjYXNlIERJUl9DUkVBVEVEOgorICAgICAgICBpZiAobG9nZmlsZSkKKyAgICAgICAgICAgIGZwcmludGYobG9nZmlsZSwgIjEwMCBNYWRlIERpcjogJXNcbiIsIGZtdCk7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBGSUxFX0NSRUFURUQ6Ci0JCWlmIChsb2dmaWxlKQotCQkJZnByaW50Zihsb2dmaWxlLCAiMjAwIEZpbGUgQ29weTogJXNcbiIsIGZtdCk7Ci0JCWdvdG8gYWRkX3RvX2ZpbGVsaXN0X2xhYmVsOwotCQlicmVhazsKKyAgICBjYXNlIEZJTEVfQ1JFQVRFRDoKKyAgICAgICAgaWYgKGxvZ2ZpbGUpCisgICAgICAgICAgICBmcHJpbnRmKGxvZ2ZpbGUsICIyMDAgRmlsZSBDb3B5OiAlc1xuIiwgZm10KTsKKyAgICAgICAgZ290byBhZGRfdG9fZmlsZWxpc3RfbGFiZWw7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBGSUxFX09WRVJXUklUVEVOOgotCQlpZiAobG9nZmlsZSkKLQkJCWZwcmludGYobG9nZmlsZSwgIjIwMCBGaWxlIE92ZXJ3cml0ZTogJXNcbiIsIGZtdCk7Ci0JICBhZGRfdG9fZmlsZWxpc3RfbGFiZWw6Ci0JCWlmICgoY3AgPSBzdHJyY2hyKGZtdCwgJy4nKSkgJiYgKDAgPT0gc3RyY21wIChjcCwgIi5weSIpKSkKLQkJCWFkZF90b19maWxlbGlzdChmbXQpOwotCQlicmVhazsKKyAgICBjYXNlIEZJTEVfT1ZFUldSSVRURU46CisgICAgICAgIGlmIChsb2dmaWxlKQorICAgICAgICAgICAgZnByaW50Zihsb2dmaWxlLCAiMjAwIEZpbGUgT3ZlcndyaXRlOiAlc1xuIiwgZm10KTsKKyAgICAgIGFkZF90b19maWxlbGlzdF9sYWJlbDoKKyAgICAgICAgaWYgKChjcCA9IHN0cnJjaHIoZm10LCAnLicpKSAmJiAoMCA9PSBzdHJjbXAgKGNwLCAiLnB5IikpKQorICAgICAgICAgICAgYWRkX3RvX2ZpbGVsaXN0KGZtdCk7CisgICAgICAgIGJyZWFrOwogCiAvKiBFcnJvciBNZXNzYWdlcyAqLwotCWNhc2UgWkxJQl9FUlJPUjoKLQkJTWVzc2FnZUJveChHZXRGb2N1cygpLCBCdWZmZXIsICJFcnJvciIsCi0JCQkgICAgTUJfT0sgfCBNQl9JQ09OV0FSTklORyk7Ci0JCWJyZWFrOworICAgIGNhc2UgWkxJQl9FUlJPUjoKKyAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBCdWZmZXIsICJFcnJvciIsCisgICAgICAgICAgICAgICAgICAgIE1CX09LIHwgTUJfSUNPTldBUk5JTkcpOworICAgICAgICBicmVhazsKIAotCWNhc2UgU1lTVEVNX0VSUk9SOgotCQlTeXN0ZW1FcnJvcihHZXRMYXN0RXJyb3IoKSwgQnVmZmVyKTsKLQkJYnJlYWs7CisgICAgY2FzZSBTWVNURU1fRVJST1I6CisgICAgICAgIFN5c3RlbUVycm9yKEdldExhc3RFcnJvcigpLCBCdWZmZXIpOworICAgICAgICBicmVhazsKIAotCWNhc2UgTlVNX0ZJTEVTOgotCQlhID0gdmFfYXJnKG1hcmtlciwgaW50KTsKLQkJYiA9IHZhX2FyZyhtYXJrZXIsIGludCk7Ci0JCVNlbmRNZXNzYWdlKGhEaWFsb2csIFdNX05VTUZJTEVTLCAwLCBNQUtFTFBBUkFNKDAsIGEpKTsKLQkJU2VuZE1lc3NhZ2UoaERpYWxvZywgV01fTkVYVEZJTEUsIGIsKExQQVJBTSlmbXQpOwotCX0KLQl2YV9lbmQobWFya2VyKTsKLSAgICAKLQlyZXR1cm4gcmVzdWx0OworICAgIGNhc2UgTlVNX0ZJTEVTOgorICAgICAgICBhID0gdmFfYXJnKG1hcmtlciwgaW50KTsKKyAgICAgICAgYiA9IHZhX2FyZyhtYXJrZXIsIGludCk7CisgICAgICAgIFNlbmRNZXNzYWdlKGhEaWFsb2csIFdNX05VTUZJTEVTLCAwLCBNQUtFTFBBUkFNKDAsIGEpKTsKKyAgICAgICAgU2VuZE1lc3NhZ2UoaERpYWxvZywgV01fTkVYVEZJTEUsIGIsKExQQVJBTSlmbXQpOworICAgIH0KKyAgICB2YV9lbmQobWFya2VyKTsKKworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBjaGFyICpNYXBFeGlzdGluZ0ZpbGUoY2hhciAqcGF0aG5hbWUsIERXT1JEICpwc2l6ZSkKIHsKLQlIQU5ETEUgaEZpbGUsIGhGaWxlTWFwcGluZzsKLQlEV09SRCBuU2l6ZUxvdywgblNpemVIaWdoOwotCWNoYXIgKmRhdGE7CisgICAgSEFORExFIGhGaWxlLCBoRmlsZU1hcHBpbmc7CisgICAgRFdPUkQgblNpemVMb3csIG5TaXplSGlnaDsKKyAgICBjaGFyICpkYXRhOwogCi0JaEZpbGUgPSBDcmVhdGVGaWxlKHBhdGhuYW1lLAotCQkJICAgIEdFTkVSSUNfUkVBRCwgRklMRV9TSEFSRV9SRUFELCBOVUxMLAotCQkJICAgIE9QRU5fRVhJU1RJTkcsCi0JCQkgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKLQlpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0JCXJldHVybiBOVUxMOwotCW5TaXplTG93ID0gR2V0RmlsZVNpemUoaEZpbGUsICZuU2l6ZUhpZ2gpOwotCWhGaWxlTWFwcGluZyA9IENyZWF0ZUZpbGVNYXBwaW5nKGhGaWxlLAotCQkJCQkgIE5VTEwsIFBBR0VfUkVBRE9OTFksIDAsIDAsIE5VTEwpOwotCUNsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICBoRmlsZSA9IENyZWF0ZUZpbGUocGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUQsIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QRU5fRVhJU1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICAgIGlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgblNpemVMb3cgPSBHZXRGaWxlU2l6ZShoRmlsZSwgJm5TaXplSGlnaCk7CisgICAgaEZpbGVNYXBwaW5nID0gQ3JlYXRlRmlsZU1hcHBpbmcoaEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIFBBR0VfUkVBRE9OTFksIDAsIDAsIE5VTEwpOworICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKIAotCWlmIChoRmlsZU1hcHBpbmcgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0JCXJldHVybiBOVUxMOwotICAgIAotCWRhdGEgPSBNYXBWaWV3T2ZGaWxlKGhGaWxlTWFwcGluZywKLQkJCSAgICAgIEZJTEVfTUFQX1JFQUQsIDAsIDAsIDApOworICAgIGlmIChoRmlsZU1hcHBpbmcgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQ2xvc2VIYW5kbGUoaEZpbGVNYXBwaW5nKTsKLQkqcHNpemUgPSBuU2l6ZUxvdzsKLQlyZXR1cm4gZGF0YTsKKyAgICBkYXRhID0gTWFwVmlld09mRmlsZShoRmlsZU1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfTUFQX1JFQUQsIDAsIDAsIDApOworCisgICAgQ2xvc2VIYW5kbGUoaEZpbGVNYXBwaW5nKTsKKyAgICAqcHNpemUgPSBuU2l6ZUxvdzsKKyAgICByZXR1cm4gZGF0YTsKIH0KIAogCiBzdGF0aWMgdm9pZCBjcmVhdGVfYml0bWFwKEhXTkQgaHduZCkKIHsKLQlCSVRNQVBGSUxFSEVBREVSICpiZmg7Ci0JQklUTUFQSU5GTyAqYmk7Ci0JSERDIGhkYzsKKyAgICBCSVRNQVBGSUxFSEVBREVSICpiZmg7CisgICAgQklUTUFQSU5GTyAqYmk7CisgICAgSERDIGhkYzsKIAotCWlmICghYml0bWFwX2J5dGVzKQotCQlyZXR1cm47CisgICAgaWYgKCFiaXRtYXBfYnl0ZXMpCisgICAgICAgIHJldHVybjsKIAotCWlmIChoQml0bWFwKQotCQlyZXR1cm47CisgICAgaWYgKGhCaXRtYXApCisgICAgICAgIHJldHVybjsKIAotCWhkYyA9IEdldERDKGh3bmQpOworICAgIGhkYyA9IEdldERDKGh3bmQpOwogCi0JYmZoID0gKEJJVE1BUEZJTEVIRUFERVIgKiliaXRtYXBfYnl0ZXM7Ci0JYmkgPSAoQklUTUFQSU5GTyAqKShiaXRtYXBfYnl0ZXMgKyBzaXplb2YoQklUTUFQRklMRUhFQURFUikpOworICAgIGJmaCA9IChCSVRNQVBGSUxFSEVBREVSICopYml0bWFwX2J5dGVzOworICAgIGJpID0gKEJJVE1BUElORk8gKikoYml0bWFwX2J5dGVzICsgc2l6ZW9mKEJJVE1BUEZJTEVIRUFERVIpKTsKIAotCWhCaXRtYXAgPSBDcmVhdGVESUJpdG1hcChoZGMsCi0JCQkJICZiaS0+Ym1pSGVhZGVyLAotCQkJCSBDQk1fSU5JVCwKLQkJCQkgYml0bWFwX2J5dGVzICsgYmZoLT5iZk9mZkJpdHMsCi0JCQkJIGJpLAotCQkJCSBESUJfUkdCX0NPTE9SUyk7Ci0JUmVsZWFzZURDKGh3bmQsIGhkYyk7CisgICAgaEJpdG1hcCA9IENyZWF0ZURJQml0bWFwKGhkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJpLT5ibWlIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCTV9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBfYnl0ZXMgKyBiZmgtPmJmT2ZmQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQl9SR0JfQ09MT1JTKTsKKyAgICBSZWxlYXNlREMoaHduZCwgaGRjKTsKIH0KIAogLyogRXh0cmFjdCBldmVyeXRoaW5nIHdlIG5lZWQgdG8gYmVnaW4gdGhlIGluc3RhbGxhdGlvbi4gIEN1cnJlbnRseSB0aGlzCiAgICBpcyB0aGUgSU5JIGZpbGVuYW1lIHdpdGggaW5zdGFsbCBkYXRhLCBhbmQgdGhlIHJhdyBwcmUtaW5zdGFsbCBzY3JpcHQKICovCiBzdGF0aWMgQk9PTCBFeHRyYWN0SW5zdGFsbERhdGEoY2hhciAqZGF0YSwgRFdPUkQgc2l6ZSwgaW50ICpwZXhlX3NpemUsCi0JCQkgICAgICAgY2hhciAqKm91dF9pbmlfZmlsZSwgY2hhciAqKm91dF9wcmVpbnN0YWxsX3NjcmlwdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqb3V0X2luaV9maWxlLCBjaGFyICoqb3V0X3ByZWluc3RhbGxfc2NyaXB0KQogewotCS8qIHJlYWQgdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgKi8KLQlzdHJ1Y3QgZW9mX2NkaXIgKnBlID0gKHN0cnVjdCBlb2ZfY2RpciAqKSZkYXRhW3NpemUgLSBzaXplb2YKLQkJCQkJCSAgICAgICAoc3RydWN0IGVvZl9jZGlyKV07Ci0gICAgCi0JaW50IGFyY19zdGFydCA9IHNpemUgLSBzaXplb2YgKHN0cnVjdCBlb2ZfY2RpcikgLSBwZS0+bkJ5dGVzQ0RpciAtCi0JCXBlLT5vZnNDRGlyOworICAgIC8qIHJlYWQgdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgKi8KKyAgICBzdHJ1Y3QgZW9mX2NkaXIgKnBlID0gKHN0cnVjdCBlb2ZfY2RpciAqKSZkYXRhW3NpemUgLSBzaXplb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgZW9mX2NkaXIpXTsKIAotCWludCBvZnMgPSBhcmNfc3RhcnQgLSBzaXplb2YgKHN0cnVjdCBtZXRhX2RhdGFfaGRyKTsKKyAgICBpbnQgYXJjX3N0YXJ0ID0gc2l6ZSAtIHNpemVvZiAoc3RydWN0IGVvZl9jZGlyKSAtIHBlLT5uQnl0ZXNDRGlyIC0KKyAgICAgICAgcGUtPm9mc0NEaXI7CiAKLQkvKiByZWFkIG1ldGFfZGF0YSBpbmZvICovCi0Jc3RydWN0IG1ldGFfZGF0YV9oZHIgKnBtZCA9IChzdHJ1Y3QgbWV0YV9kYXRhX2hkciAqKSZkYXRhW29mc107Ci0JY2hhciAqc3JjLCAqZHN0OwotCWNoYXIgKmluaV9maWxlOwotCWNoYXIgdGVtcGRpcltNQVhfUEFUSF07CisgICAgaW50IG9mcyA9IGFyY19zdGFydCAtIHNpemVvZiAoc3RydWN0IG1ldGFfZGF0YV9oZHIpOwogCi0JLyogZW5zdXJlIHRoYXQgaWYgd2UgZmFpbCwgd2UgZG9uJ3QgaGF2ZSBnYXJiYWdlIG91dCBwb2ludGVycyAqLwotCSpvdXRfaW5pX2ZpbGUgPSAqb3V0X3ByZWluc3RhbGxfc2NyaXB0ID0gTlVMTDsKKyAgICAvKiByZWFkIG1ldGFfZGF0YSBpbmZvICovCisgICAgc3RydWN0IG1ldGFfZGF0YV9oZHIgKnBtZCA9IChzdHJ1Y3QgbWV0YV9kYXRhX2hkciAqKSZkYXRhW29mc107CisgICAgY2hhciAqc3JjLCAqZHN0OworICAgIGNoYXIgKmluaV9maWxlOworICAgIGNoYXIgdGVtcGRpcltNQVhfUEFUSF07CiAKLQlpZiAocGUtPnRhZyAhPSAweDA2MDU0YjUwKSB7Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgICAgLyogZW5zdXJlIHRoYXQgaWYgd2UgZmFpbCwgd2UgZG9uJ3QgaGF2ZSBnYXJiYWdlIG91dCBwb2ludGVycyAqLworICAgICpvdXRfaW5pX2ZpbGUgPSAqb3V0X3ByZWluc3RhbGxfc2NyaXB0ID0gTlVMTDsKIAotCWlmIChwbWQtPnRhZyAhPSAweDEyMzQ1NjdCKSB7Ci0JCXJldHVybiBTeXN0ZW1FcnJvcigwLAotCQkJICAgIkludmFsaWQgY2ZnZGF0YSBtYWdpYyBudW1iZXIgKHNlZSBiZGlzdF93aW5pbnN0LnB5KSIpOwotCX0KLQlpZiAob2ZzIDwgMCkgewotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICAgIGlmIChwZS0+dGFnICE9IDB4MDYwNTRiNTApIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KIAotCWlmIChwbWQtPmJpdG1hcF9zaXplKSB7Ci0JCS8qIFN0b3JlIHBvaW50ZXIgdG8gYml0bWFwIGJ5dGVzICovCi0JCWJpdG1hcF9ieXRlcyA9IChjaGFyICopcG1kIC0gcG1kLT51bmNvbXBfc2l6ZSAtIHBtZC0+Yml0bWFwX3NpemU7Ci0JfQorICAgIGlmIChwbWQtPnRhZyAhPSAweDEyMzQ1NjdCKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW1FcnJvcigwLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNmZ2RhdGEgbWFnaWMgbnVtYmVyIChzZWUgYmRpc3Rfd2luaW5zdC5weSkiKTsKKyAgICB9CisgICAgaWYgKG9mcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KIAotCSpwZXhlX3NpemUgPSBvZnMgLSBwbWQtPnVuY29tcF9zaXplIC0gcG1kLT5iaXRtYXBfc2l6ZTsKKyAgICBpZiAocG1kLT5iaXRtYXBfc2l6ZSkgeworICAgICAgICAvKiBTdG9yZSBwb2ludGVyIHRvIGJpdG1hcCBieXRlcyAqLworICAgICAgICBiaXRtYXBfYnl0ZXMgPSAoY2hhciAqKXBtZCAtIHBtZC0+dW5jb21wX3NpemUgLSBwbWQtPmJpdG1hcF9zaXplOworICAgIH0KIAotCXNyYyA9ICgoY2hhciAqKXBtZCkgLSBwbWQtPnVuY29tcF9zaXplOwotCWluaV9maWxlID0gbWFsbG9jKE1BWF9QQVRIKTsgLyogd2lsbCBiZSByZXR1cm5lZCwgc28gZG8gbm90IGZyZWUgaXQgKi8KLQlpZiAoIWluaV9maWxlKQotCQlyZXR1cm4gRkFMU0U7Ci0JaWYgKCFHZXRUZW1wUGF0aChzaXplb2YodGVtcGRpciksIHRlbXBkaXIpCi0JICAgIHx8ICFHZXRUZW1wRmlsZU5hbWUodGVtcGRpciwgIn5kdSIsIDAsIGluaV9maWxlKSkgewotCQlTeXN0ZW1FcnJvcihHZXRMYXN0RXJyb3IoKSwKLQkJCSAgICAgIkNvdWxkIG5vdCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUiKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLSAgICAKLQlkc3QgPSBtYXBfbmV3X2ZpbGUoQ1JFQVRFX0FMV0FZUywgaW5pX2ZpbGUsIE5VTEwsIHBtZC0+dW5jb21wX3NpemUsCi0JCQkgICAgMCwgMCwgTlVMTC8qbm90aWZ5Ki8pOwotCWlmICghZHN0KQotCQlyZXR1cm4gRkFMU0U7Ci0JLyogVXAgdG8gdGhlIGZpcnN0IFwwIGlzIHRoZSBJTkkgZmlsZSBkYXRhLiAqLwotCXN0cm5jcHkoZHN0LCBzcmMsIHBtZC0+dW5jb21wX3NpemUpOwotCXNyYyArPSBzdHJsZW4oZHN0KSArIDE7Ci0JLyogVXAgdG8gbmV4dCBcMCBpcyB0aGUgcHJlLWluc3RhbGwgc2NyaXB0ICovCi0JKm91dF9wcmVpbnN0YWxsX3NjcmlwdCA9IHN0cmR1cChzcmMpOwotCSpvdXRfaW5pX2ZpbGUgPSBpbmlfZmlsZTsKLQlVbm1hcFZpZXdPZkZpbGUoZHN0KTsKLQlyZXR1cm4gVFJVRTsKKyAgICAqcGV4ZV9zaXplID0gb2ZzIC0gcG1kLT51bmNvbXBfc2l6ZSAtIHBtZC0+Yml0bWFwX3NpemU7CisKKyAgICBzcmMgPSAoKGNoYXIgKilwbWQpIC0gcG1kLT51bmNvbXBfc2l6ZTsKKyAgICBpbmlfZmlsZSA9IG1hbGxvYyhNQVhfUEFUSCk7IC8qIHdpbGwgYmUgcmV0dXJuZWQsIHNvIGRvIG5vdCBmcmVlIGl0ICovCisgICAgaWYgKCFpbmlfZmlsZSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICghR2V0VGVtcFBhdGgoc2l6ZW9mKHRlbXBkaXIpLCB0ZW1wZGlyKQorICAgICAgICB8fCAhR2V0VGVtcEZpbGVOYW1lKHRlbXBkaXIsICJ+ZHUiLCAwLCBpbmlfZmlsZSkpIHsKKyAgICAgICAgU3lzdGVtRXJyb3IoR2V0TGFzdEVycm9yKCksCisgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgZHN0ID0gbWFwX25ld19maWxlKENSRUFURV9BTFdBWVMsIGluaV9maWxlLCBOVUxMLCBwbWQtPnVuY29tcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgTlVMTC8qbm90aWZ5Ki8pOworICAgIGlmICghZHN0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogVXAgdG8gdGhlIGZpcnN0IFwwIGlzIHRoZSBJTkkgZmlsZSBkYXRhLiAqLworICAgIHN0cm5jcHkoZHN0LCBzcmMsIHBtZC0+dW5jb21wX3NpemUpOworICAgIHNyYyArPSBzdHJsZW4oZHN0KSArIDE7CisgICAgLyogVXAgdG8gbmV4dCBcMCBpcyB0aGUgcHJlLWluc3RhbGwgc2NyaXB0ICovCisgICAgKm91dF9wcmVpbnN0YWxsX3NjcmlwdCA9IHN0cmR1cChzcmMpOworICAgICpvdXRfaW5pX2ZpbGUgPSBpbmlfZmlsZTsKKyAgICBVbm1hcFZpZXdPZkZpbGUoZHN0KTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogc3RhdGljIHZvaWQgUHVtcE1lc3NhZ2VzKHZvaWQpCiB7Ci0JTVNHIG1zZzsKLQl3aGlsZSAoUGVla01lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCwgUE1fUkVNT1ZFKSkgewotCQlUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOwotCQlEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7Ci0JfQorICAgIE1TRyBtc2c7CisgICAgd2hpbGUgKFBlZWtNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDAsIFBNX1JFTU9WRSkpIHsKKyAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKKyAgICAgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworICAgIH0KIH0KIAogTFJFU1VMVCBDQUxMQkFDSwogV2luZG93UHJvYyhIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCUhEQyBoZGM7Ci0JSEZPTlQgaEZvbnQ7Ci0JaW50IGg7Ci0JUEFJTlRTVFJVQ1QgcHM7Ci0Jc3dpdGNoIChtc2cpIHsKLQljYXNlIFdNX1BBSU5UOgotCQloZGMgPSBCZWdpblBhaW50KGh3bmQsICZwcyk7Ci0JCWggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKSAvIDEwOwotCQloRm9udCA9IENyZWF0ZUZvbnQoaCwgMCwgMCwgMCwgNzAwLCBUUlVFLAotCQkJCSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAiVGltZXMgUm9tYW4iKTsKLQkJaEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBoRm9udCk7Ci0JCVNldEJrTW9kZShoZGMsIFRSQU5TUEFSRU5UKTsKLQkJVGV4dE91dChoZGMsIDE1LCAxNSwgdGl0bGUsIHN0cmxlbih0aXRsZSkpOwotCQlTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMjU1LCAyNTUsIDI1NSkpOwotCQlUZXh0T3V0KGhkYywgMTAsIDEwLCB0aXRsZSwgc3RybGVuKHRpdGxlKSk7Ci0JCURlbGV0ZU9iamVjdChTZWxlY3RPYmplY3QoaGRjLCBoRm9udCkpOwotCQlFbmRQYWludChod25kLCAmcHMpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgSERDIGhkYzsKKyAgICBIRk9OVCBoRm9udDsKKyAgICBpbnQgaDsKKyAgICBQQUlOVFNUUlVDVCBwczsKKyAgICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgV01fUEFJTlQ6CisgICAgICAgIGhkYyA9IEJlZ2luUGFpbnQoaHduZCwgJnBzKTsKKyAgICAgICAgaCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pIC8gMTA7CisgICAgICAgIGhGb250ID0gQ3JlYXRlRm9udChoLCAwLCAwLCAwLCA3MDAsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIlRpbWVzIFJvbWFuIik7CisgICAgICAgIGhGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgaEZvbnQpOworICAgICAgICBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7CisgICAgICAgIFRleHRPdXQoaGRjLCAxNSwgMTUsIHRpdGxlLCBzdHJsZW4odGl0bGUpKTsKKyAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKDI1NSwgMjU1LCAyNTUpKTsKKyAgICAgICAgVGV4dE91dChoZGMsIDEwLCAxMCwgdGl0bGUsIHN0cmxlbih0aXRsZSkpOworICAgICAgICBEZWxldGVPYmplY3QoU2VsZWN0T2JqZWN0KGhkYywgaEZvbnQpKTsKKyAgICAgICAgRW5kUGFpbnQoaHduZCwgJnBzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwogfQogCiBzdGF0aWMgSFdORCBDcmVhdGVCYWNrZ3JvdW5kKGNoYXIgKnRpdGxlKQogewotCVdORENMQVNTIHdjOwotCUhXTkQgaHduZDsKLQljaGFyIGJ1ZmZlcls0MDk2XTsKKyAgICBXTkRDTEFTUyB3YzsKKyAgICBIV05EIGh3bmQ7CisgICAgY2hhciBidWZmZXJbNDA5Nl07CiAKLQl3Yy5zdHlsZSA9IENTX1ZSRURSQVcgfCBDU19IUkVEUkFXOwotCXdjLmxwZm5XbmRQcm9jID0gV2luZG93UHJvYzsKLQl3Yy5jYlduZEV4dHJhID0gMDsKLQl3Yy5jYkNsc0V4dHJhID0gMDsKLQl3Yy5oSW5zdGFuY2UgPSBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7Ci0Jd2MuaEljb24gPSBOVUxMOwotCXdjLmhDdXJzb3IgPSBMb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyk7Ci0Jd2MuaGJyQmFja2dyb3VuZCA9IENyZWF0ZVNvbGlkQnJ1c2goUkdCKDAsIDAsIDEyOCkpOwotCXdjLmxwc3pNZW51TmFtZSA9IE5VTEw7Ci0Jd2MubHBzekNsYXNzTmFtZSA9ICJTZXR1cFdpbmRvd0NsYXNzIjsKKyAgICB3Yy5zdHlsZSA9IENTX1ZSRURSQVcgfCBDU19IUkVEUkFXOworICAgIHdjLmxwZm5XbmRQcm9jID0gV2luZG93UHJvYzsKKyAgICB3Yy5jYlduZEV4dHJhID0gMDsKKyAgICB3Yy5jYkNsc0V4dHJhID0gMDsKKyAgICB3Yy5oSW5zdGFuY2UgPSBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7CisgICAgd2MuaEljb24gPSBOVUxMOworICAgIHdjLmhDdXJzb3IgPSBMb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyk7CisgICAgd2MuaGJyQmFja2dyb3VuZCA9IENyZWF0ZVNvbGlkQnJ1c2goUkdCKDAsIDAsIDEyOCkpOworICAgIHdjLmxwc3pNZW51TmFtZSA9IE5VTEw7CisgICAgd2MubHBzekNsYXNzTmFtZSA9ICJTZXR1cFdpbmRvd0NsYXNzIjsKIAotCWlmICghUmVnaXN0ZXJDbGFzcygmd2MpKQotCQlNZXNzYWdlQm94KGh3bmRNYWluLAotCQkJICAgICJDb3VsZCBub3QgcmVnaXN0ZXIgd2luZG93IGNsYXNzIiwKLQkJCSAgICAiU2V0dXAuZXhlIiwgTUJfT0spOworICAgIGlmICghUmVnaXN0ZXJDbGFzcygmd2MpKQorICAgICAgICBNZXNzYWdlQm94KGh3bmRNYWluLAorICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlZ2lzdGVyIHdpbmRvdyBjbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICJTZXR1cC5leGUiLCBNQl9PSyk7CiAKLQl3c3ByaW50ZihidWZmZXIsICJTZXR1cCAlcyIsIHRpdGxlKTsKLQlod25kID0gQ3JlYXRlV2luZG93KCJTZXR1cFdpbmRvd0NsYXNzIiwKLQkJCSAgICAgYnVmZmVyLAotCQkJICAgICAwLAotCQkJICAgICAwLCAwLAotCQkJICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRlVMTFNDUkVFTiksCi0JCQkgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lGVUxMU0NSRUVOKSwKLQkJCSAgICAgTlVMTCwKLQkJCSAgICAgTlVMTCwKLQkJCSAgICAgR2V0TW9kdWxlSGFuZGxlKE5VTEwpLAotCQkJICAgICBOVUxMKTsKLQlTaG93V2luZG93KGh3bmQsIFNXX1NIT1dNQVhJTUlaRUQpOwotCVVwZGF0ZVdpbmRvdyhod25kKTsKLQlyZXR1cm4gaHduZDsKKyAgICB3c3ByaW50ZihidWZmZXIsICJTZXR1cCAlcyIsIHRpdGxlKTsKKyAgICBod25kID0gQ3JlYXRlV2luZG93KCJTZXR1cFdpbmRvd0NsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1hGVUxMU0NSRUVOKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRlVMTFNDUkVFTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZShOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBTaG93V2luZG93KGh3bmQsIFNXX1NIT1dNQVhJTUlaRUQpOworICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKKyAgICByZXR1cm4gaHduZDsKIH0KIAogLyoKQEAgLTExNzAsMTYgKzExNzAsMTYgQEAKICAqLwogc3RhdGljIHZvaWQgQ2VudGVyV2luZG93KEhXTkQgaHduZCkKIHsKLQlSRUNUIHJjOwotCWludCB3LCBoOworICAgIFJFQ1QgcmM7CisgICAgaW50IHcsIGg7CiAKLQlHZXRXaW5kb3dSZWN0KGh3bmQsICZyYyk7Ci0JdyA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pOwotCWggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKLQlNb3ZlV2luZG93KGh3bmQsCi0JCSAgICh3IC0gKHJjLnJpZ2h0LXJjLmxlZnQpKS8yLAotCQkgICAoaCAtIChyYy5ib3R0b20tcmMudG9wKSkvMiwKLQkJICAgIHJjLnJpZ2h0LXJjLmxlZnQsIHJjLmJvdHRvbS1yYy50b3AsIEZBTFNFKTsKKyAgICBHZXRXaW5kb3dSZWN0KGh3bmQsICZyYyk7CisgICAgdyA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pOworICAgIGggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKKyAgICBNb3ZlV2luZG93KGh3bmQsCisgICAgICAgICAgICAgICAodyAtIChyYy5yaWdodC1yYy5sZWZ0KSkvMiwKKyAgICAgICAgICAgICAgIChoIC0gKHJjLmJvdHRvbS1yYy50b3ApKS8yLAorICAgICAgICAgICAgICAgIHJjLnJpZ2h0LXJjLmxlZnQsIHJjLmJvdHRvbS1yYy50b3AsIEZBTFNFKTsKIH0KIAogI2luY2x1ZGUgPHByc2h0Lmg+CkBAIC0xMTg3LDQ1ICsxMTg3LDQ1IEBACiBCT09MIENBTExCQUNLCiBJbnRyb0RsZ1Byb2MoSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlMUE5NSERSIGxwbm07Ci0JY2hhciBCdWZmZXJbNDA5Nl07CisgICAgTFBOTUhEUiBscG5tOworICAgIGNoYXIgQnVmZmVyWzQwOTZdOwogCi0Jc3dpdGNoIChtc2cpIHsKLQljYXNlIFdNX0lOSVRESUFMT0c6Ci0JCWNyZWF0ZV9iaXRtYXAoaHduZCk7Ci0JCWlmKGhCaXRtYXApCi0JCQlTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX0JJVE1BUCwgU1RNX1NFVElNQUdFLAotCQkJCQkgICBJTUFHRV9CSVRNQVAsIChMUEFSQU0paEJpdG1hcCk7Ci0JCUNlbnRlcldpbmRvdyhHZXRQYXJlbnQoaHduZCkpOwotCQl3c3ByaW50ZihCdWZmZXIsCi0JCQkgICJUaGlzIFdpemFyZCB3aWxsIGluc3RhbGwgJXMgb24geW91ciBjb21wdXRlci4gIgotCQkJICAiQ2xpY2sgTmV4dCB0byBjb250aW51ZSAiCi0JCQkgICJvciBDYW5jZWwgdG8gZXhpdCB0aGUgU2V0dXAgV2l6YXJkLiIsCi0JCQkgIG1ldGFfbmFtZSk7Ci0JCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwgQnVmZmVyKTsKLQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lOVFJPX1RFWFQsIGluZm8pOwotCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfQlVJTERfSU5GTywgYnVpbGRfaW5mbyk7Ci0JCXJldHVybiBGQUxTRTsKKyAgICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgV01fSU5JVERJQUxPRzoKKyAgICAgICAgY3JlYXRlX2JpdG1hcChod25kKTsKKyAgICAgICAgaWYoaEJpdG1hcCkKKyAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfQklUTUFQLCBTVE1fU0VUSU1BR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BR0VfQklUTUFQLCAoTFBBUkFNKWhCaXRtYXApOworICAgICAgICBDZW50ZXJXaW5kb3coR2V0UGFyZW50KGh3bmQpKTsKKyAgICAgICAgd3NwcmludGYoQnVmZmVyLAorICAgICAgICAgICAgICAgICAgIlRoaXMgV2l6YXJkIHdpbGwgaW5zdGFsbCAlcyBvbiB5b3VyIGNvbXB1dGVyLiAiCisgICAgICAgICAgICAgICAgICAiQ2xpY2sgTmV4dCB0byBjb250aW51ZSAiCisgICAgICAgICAgICAgICAgICAib3IgQ2FuY2VsIHRvIGV4aXQgdGhlIFNldHVwIFdpemFyZC4iLAorICAgICAgICAgICAgICAgICAgbWV0YV9uYW1lKTsKKyAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLCBCdWZmZXIpOworICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5UUk9fVEVYVCwgaW5mbyk7CisgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19CVUlMRF9JTkZPLCBidWlsZF9pbmZvKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0JY2FzZSBXTV9OT1RJRlk6Ci0JCWxwbm0gPSAoTFBOTUhEUikgbFBhcmFtOworICAgIGNhc2UgV01fTk9USUZZOgorICAgICAgICBscG5tID0gKExQTk1IRFIpIGxQYXJhbTsKIAotCQlzd2l0Y2ggKGxwbm0tPmNvZGUpIHsKLQkJY2FzZSBQU05fU0VUQUNUSVZFOgotCQkJUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLCBQU1dJWkJfTkVYVCk7Ci0JCQlicmVhazsKKyAgICAgICAgc3dpdGNoIChscG5tLT5jb2RlKSB7CisgICAgICAgIGNhc2UgUFNOX1NFVEFDVElWRToKKyAgICAgICAgICAgIFByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwgUFNXSVpCX05FWFQpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQU05fV0laTkVYVDoKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFBTTl9XSVpORVhUOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQU05fUkVTRVQ6Ci0JCQlicmVhazsKLQkJCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gRkFMU0U7CisgICAgICAgIGNhc2UgUFNOX1JFU0VUOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKIH0KIAogI2lmZGVmIFVTRV9PVEhFUl9QWVRIT05fVkVSU0lPTlMKQEAgLTEyMzcsMTMzICsxMjM3LDEzMyBAQAogaW50IGJvdW5kX2ltYWdlX21pbm9yOwogCiBzdGF0aWMgQk9PTCBfX3N0ZGNhbGwgU3RhdHVzUm91dGluZShJTUFHRUhMUF9TVEFUVVNfUkVBU09OIHJlYXNvbiwKLQkJCQkgICAgUFNUUiBJbWFnZU5hbWUsCi0JCQkJICAgIFBTVFIgRGxsTmFtZSwKLQkJCQkgICAgVUxPTkcgVmEsCi0JCQkJICAgIFVMT05HIFBhcmFtZXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTVFIgSW1hZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNUUiBEbGxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgVmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBQYXJhbWV0ZXIpCiB7Ci0JY2hhciBmbmFtZVtfTUFYX1BBVEhdOwotCWludCBpbnRfdmVyc2lvbjsKKyAgICBjaGFyIGZuYW1lW19NQVhfUEFUSF07CisgICAgaW50IGludF92ZXJzaW9uOwogCi0Jc3dpdGNoKHJlYXNvbikgewotCWNhc2UgQmluZE91dE9mTWVtb3J5OgotCWNhc2UgQmluZFJ2YVRvVmFGYWlsZWQ6Ci0JY2FzZSBCaW5kTm9Sb29tSW5JbWFnZToKLQljYXNlIEJpbmRJbXBvcnRQcm9jZWR1cmVGYWlsZWQ6Ci0JCWJyZWFrOworICAgIHN3aXRjaChyZWFzb24pIHsKKyAgICBjYXNlIEJpbmRPdXRPZk1lbW9yeToKKyAgICBjYXNlIEJpbmRSdmFUb1ZhRmFpbGVkOgorICAgIGNhc2UgQmluZE5vUm9vbUluSW1hZ2U6CisgICAgY2FzZSBCaW5kSW1wb3J0UHJvY2VkdXJlRmFpbGVkOgorICAgICAgICBicmVhazsKIAotCWNhc2UgQmluZEltcG9ydFByb2NlZHVyZToKLQljYXNlIEJpbmRGb3J3YXJkZXI6Ci0JY2FzZSBCaW5kRm9yd2FyZGVyTk9UOgotCWNhc2UgQmluZEltYWdlTW9kaWZpZWQ6Ci0JY2FzZSBCaW5kRXhwYW5kRmlsZUhlYWRlcnM6Ci0JY2FzZSBCaW5kSW1hZ2VDb21wbGV0ZToKLQljYXNlIEJpbmRTeW1ib2xzTm90VXBkYXRlZDoKLQljYXNlIEJpbmRNaXNtYXRjaGVkU3ltYm9sczoKLQljYXNlIEJpbmRJbXBvcnRNb2R1bGVGYWlsZWQ6Ci0JCWJyZWFrOworICAgIGNhc2UgQmluZEltcG9ydFByb2NlZHVyZToKKyAgICBjYXNlIEJpbmRGb3J3YXJkZXI6CisgICAgY2FzZSBCaW5kRm9yd2FyZGVyTk9UOgorICAgIGNhc2UgQmluZEltYWdlTW9kaWZpZWQ6CisgICAgY2FzZSBCaW5kRXhwYW5kRmlsZUhlYWRlcnM6CisgICAgY2FzZSBCaW5kSW1hZ2VDb21wbGV0ZToKKyAgICBjYXNlIEJpbmRTeW1ib2xzTm90VXBkYXRlZDoKKyAgICBjYXNlIEJpbmRNaXNtYXRjaGVkU3ltYm9sczoKKyAgICBjYXNlIEJpbmRJbXBvcnRNb2R1bGVGYWlsZWQ6CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBCaW5kSW1wb3J0TW9kdWxlOgotCQlpZiAoMSA9PSBzc2NhbmYoRGxsTmFtZSwgInB5dGhvbiVkIiwgJmludF92ZXJzaW9uKSkgewotCQkJU2VhcmNoUGF0aChOVUxMLCBEbGxOYW1lLCBOVUxMLCBzaXplb2YoZm5hbWUpLAotCQkJCSAgIGZuYW1lLCBOVUxMKTsKLQkJCXN0cmNweShib3VuZF9pbWFnZV9kbGwsIGZuYW1lKTsKLQkJCWJvdW5kX2ltYWdlX21ham9yID0gaW50X3ZlcnNpb24gLyAxMDsKLQkJCWJvdW5kX2ltYWdlX21pbm9yID0gaW50X3ZlcnNpb24gJSAxMDsKLQkJCU91dHB1dERlYnVnU3RyaW5nKCJCT1VORCAiKTsKLQkJCU91dHB1dERlYnVnU3RyaW5nKGZuYW1lKTsKLQkJCU91dHB1dERlYnVnU3RyaW5nKCJcbiIpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgICBjYXNlIEJpbmRJbXBvcnRNb2R1bGU6CisgICAgICAgIGlmICgxID09IHNzY2FuZihEbGxOYW1lLCAicHl0aG9uJWQiLCAmaW50X3ZlcnNpb24pKSB7CisgICAgICAgICAgICBTZWFyY2hQYXRoKE5VTEwsIERsbE5hbWUsIE5VTEwsIHNpemVvZihmbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCBOVUxMKTsKKyAgICAgICAgICAgIHN0cmNweShib3VuZF9pbWFnZV9kbGwsIGZuYW1lKTsKKyAgICAgICAgICAgIGJvdW5kX2ltYWdlX21ham9yID0gaW50X3ZlcnNpb24gLyAxMDsKKyAgICAgICAgICAgIGJvdW5kX2ltYWdlX21pbm9yID0gaW50X3ZlcnNpb24gJSAxMDsKKyAgICAgICAgICAgIE91dHB1dERlYnVnU3RyaW5nKCJCT1VORCAiKTsKKyAgICAgICAgICAgIE91dHB1dERlYnVnU3RyaW5nKGZuYW1lKTsKKyAgICAgICAgICAgIE91dHB1dERlYnVnU3RyaW5nKCJcbiIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKIH0KIAogLyoKICAqLwogc3RhdGljIExQU1RSIGdldF9zeXNfcHJlZml4KExQU1RSIGV4ZSwgTFBTVFIgZGxsKQogewotCXZvaWQgKF9fY2RlY2wgKiBQeV9Jbml0aWFsaXplKSh2b2lkKTsKLQl2b2lkIChfX2NkZWNsICogUHlfU2V0UHJvZ3JhbU5hbWUpKGNoYXIgKik7Ci0Jdm9pZCAoX19jZGVjbCAqIFB5X0ZpbmFsaXplKSh2b2lkKTsKLQl2b2lkKiAoX19jZGVjbCAqIFB5U3lzX0dldE9iamVjdCkoY2hhciAqKTsKLQl2b2lkIChfX2NkZWNsICogUHlTeXNfU2V0QXJndikoaW50LCBjaGFyICoqKTsKLQljaGFyKiAoX19jZGVjbCAqIFB5X0dldFByZWZpeCkodm9pZCk7Ci0JY2hhciogKF9fY2RlY2wgKiBQeV9HZXRQYXRoKSh2b2lkKTsKLQlISU5TVEFOQ0UgaFB5dGhvbjsKLQlMUFNUUiBwcmVmaXggPSBOVUxMOwotCWludCAoX19jZGVjbCAqIFB5UnVuX1NpbXBsZVN0cmluZykoY2hhciAqKTsKKyAgICB2b2lkIChfX2NkZWNsICogUHlfSW5pdGlhbGl6ZSkodm9pZCk7CisgICAgdm9pZCAoX19jZGVjbCAqIFB5X1NldFByb2dyYW1OYW1lKShjaGFyICopOworICAgIHZvaWQgKF9fY2RlY2wgKiBQeV9GaW5hbGl6ZSkodm9pZCk7CisgICAgdm9pZCogKF9fY2RlY2wgKiBQeVN5c19HZXRPYmplY3QpKGNoYXIgKik7CisgICAgdm9pZCAoX19jZGVjbCAqIFB5U3lzX1NldEFyZ3YpKGludCwgY2hhciAqKik7CisgICAgY2hhciogKF9fY2RlY2wgKiBQeV9HZXRQcmVmaXgpKHZvaWQpOworICAgIGNoYXIqIChfX2NkZWNsICogUHlfR2V0UGF0aCkodm9pZCk7CisgICAgSElOU1RBTkNFIGhQeXRob247CisgICAgTFBTVFIgcHJlZml4ID0gTlVMTDsKKyAgICBpbnQgKF9fY2RlY2wgKiBQeVJ1bl9TaW1wbGVTdHJpbmcpKGNoYXIgKik7CiAKLQl7Ci0JCWNoYXIgQnVmZmVyWzI1Nl07Ci0JCXdzcHJpbnRmKEJ1ZmZlciwgIlBZVEhPTkhPTUU9JXMiLCBleGUpOwotCQkqc3RycmNocihCdWZmZXIsICdcXCcpID0gJ1wwJzsKLS8vCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgQnVmZmVyLCAiUFlUSE9OSE9NRSIsIE1CX09LKTsKLQkJX3B1dGVudihCdWZmZXIpOwotCQlfcHV0ZW52KCJQWVRIT05QQVRIPSIpOwotCX0KKyAgICB7CisgICAgICAgIGNoYXIgQnVmZmVyWzI1Nl07CisgICAgICAgIHdzcHJpbnRmKEJ1ZmZlciwgIlBZVEhPTkhPTUU9JXMiLCBleGUpOworICAgICAgICAqc3RycmNocihCdWZmZXIsICdcXCcpID0gJ1wwJzsKKy8vICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBCdWZmZXIsICJQWVRIT05IT01FIiwgTUJfT0spOworICAgICAgICAgICAgICAgIF9wdXRlbnYoQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBfcHV0ZW52KCJQWVRIT05QQVRIPSIpOworICAgIH0KIAotCWhQeXRob24gPSBMb2FkTGlicmFyeShkbGwpOwotCWlmICghaFB5dGhvbikKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSW5pdGlhbGl6ZSA9ICh2b2lkICgqKSh2b2lkKSlHZXRQcm9jQWRkcmVzcwotCQkoaFB5dGhvbiwiUHlfSW5pdGlhbGl6ZSIpOworICAgIGhQeXRob24gPSBMb2FkTGlicmFyeShkbGwpOworICAgIGlmICghaFB5dGhvbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSW5pdGlhbGl6ZSA9ICh2b2lkICgqKSh2b2lkKSlHZXRQcm9jQWRkcmVzcworICAgICAgICAoaFB5dGhvbiwiUHlfSW5pdGlhbGl6ZSIpOwogCi0JUHlTeXNfU2V0QXJndiA9ICh2b2lkICgqKShpbnQsIGNoYXIgKiopKUdldFByb2NBZGRyZXNzCi0JCShoUHl0aG9uLCJQeVN5c19TZXRBcmd2Iik7CisgICAgUHlTeXNfU2V0QXJndiA9ICh2b2lkICgqKShpbnQsIGNoYXIgKiopKUdldFByb2NBZGRyZXNzCisgICAgICAgIChoUHl0aG9uLCJQeVN5c19TZXRBcmd2Iik7CiAKLQlQeVJ1bl9TaW1wbGVTdHJpbmcgPSAoaW50ICgqKShjaGFyICopKUdldFByb2NBZGRyZXNzCi0JCShoUHl0aG9uLCJQeVJ1bl9TaW1wbGVTdHJpbmciKTsKKyAgICBQeVJ1bl9TaW1wbGVTdHJpbmcgPSAoaW50ICgqKShjaGFyICopKUdldFByb2NBZGRyZXNzCisgICAgICAgIChoUHl0aG9uLCJQeVJ1bl9TaW1wbGVTdHJpbmciKTsKIAotCVB5X1NldFByb2dyYW1OYW1lID0gKHZvaWQgKCopKGNoYXIgKikpR2V0UHJvY0FkZHJlc3MKLQkJKGhQeXRob24sIlB5X1NldFByb2dyYW1OYW1lIik7CisgICAgUHlfU2V0UHJvZ3JhbU5hbWUgPSAodm9pZCAoKikoY2hhciAqKSlHZXRQcm9jQWRkcmVzcworICAgICAgICAoaFB5dGhvbiwiUHlfU2V0UHJvZ3JhbU5hbWUiKTsKIAotCVB5U3lzX0dldE9iamVjdCA9ICh2b2lkKiAoKikoY2hhciAqKSlHZXRQcm9jQWRkcmVzcwotCQkoaFB5dGhvbiwiUHlTeXNfR2V0T2JqZWN0Iik7CisgICAgUHlTeXNfR2V0T2JqZWN0ID0gKHZvaWQqICgqKShjaGFyICopKUdldFByb2NBZGRyZXNzCisgICAgICAgIChoUHl0aG9uLCJQeVN5c19HZXRPYmplY3QiKTsKIAotCVB5X0dldFByZWZpeCA9IChjaGFyICogKCopKHZvaWQpKUdldFByb2NBZGRyZXNzCi0JCShoUHl0aG9uLCJQeV9HZXRQcmVmaXgiKTsKKyAgICBQeV9HZXRQcmVmaXggPSAoY2hhciAqICgqKSh2b2lkKSlHZXRQcm9jQWRkcmVzcworICAgICAgICAoaFB5dGhvbiwiUHlfR2V0UHJlZml4Iik7CiAKLQlQeV9HZXRQYXRoID0gKGNoYXIgKiAoKikodm9pZCkpR2V0UHJvY0FkZHJlc3MKLQkJKGhQeXRob24sIlB5X0dldFBhdGgiKTsKKyAgICBQeV9HZXRQYXRoID0gKGNoYXIgKiAoKikodm9pZCkpR2V0UHJvY0FkZHJlc3MKKyAgICAgICAgKGhQeXRob24sIlB5X0dldFBhdGgiKTsKIAotCVB5X0ZpbmFsaXplID0gKHZvaWQgKCopKHZvaWQpKUdldFByb2NBZGRyZXNzKGhQeXRob24sCi0JCQkJCQkgICAgICAiUHlfRmluYWxpemUiKTsKLQlQeV9TZXRQcm9ncmFtTmFtZShleGUpOwotCVB5X0luaXRpYWxpemUoKTsKLQlQeVN5c19TZXRBcmd2KDEsICZleGUpOworICAgIFB5X0ZpbmFsaXplID0gKHZvaWQgKCopKHZvaWQpKUdldFByb2NBZGRyZXNzKGhQeXRob24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeV9GaW5hbGl6ZSIpOworICAgIFB5X1NldFByb2dyYW1OYW1lKGV4ZSk7CisgICAgUHlfSW5pdGlhbGl6ZSgpOworICAgIFB5U3lzX1NldEFyZ3YoMSwgJmV4ZSk7CiAKLQlNZXNzYWdlQm94KEdldEZvY3VzKCksIFB5X0dldFByZWZpeCgpLCAiUFJFRklYIiwgTUJfT0spOwotCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgUHlfR2V0UGF0aCgpLCAiUEFUSCIsIE1CX09LKTsKKyAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIFB5X0dldFByZWZpeCgpLCAiUFJFRklYIiwgTUJfT0spOworICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgUHlfR2V0UGF0aCgpLCAiUEFUSCIsIE1CX09LKTsKIAotCVB5X0ZpbmFsaXplKCk7Ci0JRnJlZUxpYnJhcnkoaFB5dGhvbik7CisgICAgUHlfRmluYWxpemUoKTsKKyAgICBGcmVlTGlicmFyeShoUHl0aG9uKTsKIAotCXJldHVybiBwcmVmaXg7CisgICAgcmV0dXJuIHByZWZpeDsKIH0KIAogc3RhdGljIEJPT0wKIENoZWNrUHl0aG9uRXhlKExQU1RSIHBhdGhuYW1lLCBMUFNUUiB2ZXJzaW9uLCBpbnQgKnBtYWpvciwgaW50ICpwbWlub3IpCiB7Ci0JYm91bmRfaW1hZ2VfZGxsWzBdID0gJ1wwJzsKLQlpZiAoIUJpbmRJbWFnZUV4KEJJTkRfTk9fQk9VTkRfSU1QT1JUUyB8IEJJTkRfTk9fVVBEQVRFIHwgQklORF9BTExfSU1BR0VTLAotCQkJIHBhdGhuYW1lLAotCQkJIE5VTEwsCi0JCQkgTlVMTCwKLQkJCSBTdGF0dXNSb3V0aW5lKSkKLQkJcmV0dXJuIFN5c3RlbUVycm9yKDAsICJDb3VsZCBub3QgYmluZCBpbWFnZSIpOwotCWlmIChib3VuZF9pbWFnZV9kbGxbMF0gPT0gJ1wwJykKLQkJcmV0dXJuIFN5c3RlbUVycm9yKDAsICJEb2VzIG5vdCBzZWVtIHRvIGJlIGEgcHl0aG9uIGV4ZWN1dGFibGUiKTsKLQkqcG1ham9yID0gYm91bmRfaW1hZ2VfbWFqb3I7Ci0JKnBtaW5vciA9IGJvdW5kX2ltYWdlX21pbm9yOwotCWlmICh2ZXJzaW9uICYmICp2ZXJzaW9uKSB7Ci0JCWNoYXIgY29yZV92ZXJzaW9uWzEyXTsKLQkJd3NwcmludGYoY29yZV92ZXJzaW9uLCAiJWQuJWQiLCBib3VuZF9pbWFnZV9tYWpvciwgYm91bmRfaW1hZ2VfbWlub3IpOwotCQlpZiAoc3RyY21wKHZlcnNpb24sIGNvcmVfdmVyc2lvbikpCi0JCQlyZXR1cm4gU3lzdGVtRXJyb3IoMCwgIldyb25nIFB5dGhvbiB2ZXJzaW9uIik7Ci0JfQotCWdldF9zeXNfcHJlZml4KHBhdGhuYW1lLCBib3VuZF9pbWFnZV9kbGwpOwotCXJldHVybiBUUlVFOworICAgIGJvdW5kX2ltYWdlX2RsbFswXSA9ICdcMCc7CisgICAgaWYgKCFCaW5kSW1hZ2VFeChCSU5EX05PX0JPVU5EX0lNUE9SVFMgfCBCSU5EX05PX1VQREFURSB8IEJJTkRfQUxMX0lNQUdFUywKKyAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICBTdGF0dXNSb3V0aW5lKSkKKyAgICAgICAgcmV0dXJuIFN5c3RlbUVycm9yKDAsICJDb3VsZCBub3QgYmluZCBpbWFnZSIpOworICAgIGlmIChib3VuZF9pbWFnZV9kbGxbMF0gPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIFN5c3RlbUVycm9yKDAsICJEb2VzIG5vdCBzZWVtIHRvIGJlIGEgcHl0aG9uIGV4ZWN1dGFibGUiKTsKKyAgICAqcG1ham9yID0gYm91bmRfaW1hZ2VfbWFqb3I7CisgICAgKnBtaW5vciA9IGJvdW5kX2ltYWdlX21pbm9yOworICAgIGlmICh2ZXJzaW9uICYmICp2ZXJzaW9uKSB7CisgICAgICAgIGNoYXIgY29yZV92ZXJzaW9uWzEyXTsKKyAgICAgICAgd3NwcmludGYoY29yZV92ZXJzaW9uLCAiJWQuJWQiLCBib3VuZF9pbWFnZV9tYWpvciwgYm91bmRfaW1hZ2VfbWlub3IpOworICAgICAgICBpZiAoc3RyY21wKHZlcnNpb24sIGNvcmVfdmVyc2lvbikpCisgICAgICAgICAgICByZXR1cm4gU3lzdGVtRXJyb3IoMCwgIldyb25nIFB5dGhvbiB2ZXJzaW9uIik7CisgICAgfQorICAgIGdldF9zeXNfcHJlZml4KHBhdGhuYW1lLCBib3VuZF9pbWFnZV9kbGwpOworICAgIHJldHVybiBUUlVFOwogfQogCiAvKgpAQCAtMTM3Miw0OCArMTM3Miw0OCBAQAogICovCiBzdGF0aWMgQk9PTCBHZXRPdGhlclB5dGhvblZlcnNpb24oSFdORCBod25kLCBMUFNUUiB2ZXJzaW9uKQogewotCWNoYXIgdmVyc19uYW1lW19NQVhfUEFUSCArIDgwXTsKLQlEV09SRCBpdGVtaW5kZXg7Ci0JT1BFTkZJTEVOQU1FIG9mOwotCWNoYXIgcGF0aG5hbWVbX01BWF9QQVRIXTsKLQlEV09SRCByZXN1bHQ7CisgICAgY2hhciB2ZXJzX25hbWVbX01BWF9QQVRIICsgODBdOworICAgIERXT1JEIGl0ZW1pbmRleDsKKyAgICBPUEVORklMRU5BTUUgb2Y7CisgICAgY2hhciBwYXRobmFtZVtfTUFYX1BBVEhdOworICAgIERXT1JEIHJlc3VsdDsKIAotCXN0cmNweShwYXRobmFtZSwgInB5dGhvbi5leGUiKTsKKyAgICBzdHJjcHkocGF0aG5hbWUsICJweXRob24uZXhlIik7CiAKLQltZW1zZXQoJm9mLCAwLCBzaXplb2Yob2YpKTsKLQlvZi5sU3RydWN0U2l6ZSA9IHNpemVvZihPUEVORklMRU5BTUUpOwotCW9mLmh3bmRPd25lciA9IEdldFBhcmVudChod25kKTsKLQlvZi5oSW5zdGFuY2UgPSBOVUxMOwotCW9mLmxwc3RyRmlsdGVyID0gInB5dGhvbi5leGVcMHB5dGhvbi5leGVcMCI7Ci0Jb2YubHBzdHJDdXN0b21GaWx0ZXIgPSBOVUxMOwotCW9mLm5NYXhDdXN0RmlsdGVyID0gMDsKLQlvZi5uRmlsdGVySW5kZXggPSAxOwotCW9mLmxwc3RyRmlsZSA9IHBhdGhuYW1lOwotCW9mLm5NYXhGaWxlID0gc2l6ZW9mKHBhdGhuYW1lKTsKLQlvZi5scHN0ckZpbGVUaXRsZSA9IE5VTEw7Ci0Jb2Yubk1heEZpbGVUaXRsZSA9IDA7Ci0Jb2YubHBzdHJJbml0aWFsRGlyID0gTlVMTDsKLQlvZi5scHN0clRpdGxlID0gIlB5dGhvbiBleGVjdXRhYmxlIjsKLQlvZi5GbGFncyA9IE9GTl9GSUxFTVVTVEVYSVNUIHwgT0ZOX1BBVEhNVVNURVhJU1Q7Ci0Jb2YubHBzdHJEZWZFeHQgPSAiZXhlIjsKKyAgICBtZW1zZXQoJm9mLCAwLCBzaXplb2Yob2YpKTsKKyAgICBvZi5sU3RydWN0U2l6ZSA9IHNpemVvZihPUEVORklMRU5BTUUpOworICAgIG9mLmh3bmRPd25lciA9IEdldFBhcmVudChod25kKTsKKyAgICBvZi5oSW5zdGFuY2UgPSBOVUxMOworICAgIG9mLmxwc3RyRmlsdGVyID0gInB5dGhvbi5leGVcMHB5dGhvbi5leGVcMCI7CisgICAgb2YubHBzdHJDdXN0b21GaWx0ZXIgPSBOVUxMOworICAgIG9mLm5NYXhDdXN0RmlsdGVyID0gMDsKKyAgICBvZi5uRmlsdGVySW5kZXggPSAxOworICAgIG9mLmxwc3RyRmlsZSA9IHBhdGhuYW1lOworICAgIG9mLm5NYXhGaWxlID0gc2l6ZW9mKHBhdGhuYW1lKTsKKyAgICBvZi5scHN0ckZpbGVUaXRsZSA9IE5VTEw7CisgICAgb2Yubk1heEZpbGVUaXRsZSA9IDA7CisgICAgb2YubHBzdHJJbml0aWFsRGlyID0gTlVMTDsKKyAgICBvZi5scHN0clRpdGxlID0gIlB5dGhvbiBleGVjdXRhYmxlIjsKKyAgICBvZi5GbGFncyA9IE9GTl9GSUxFTVVTVEVYSVNUIHwgT0ZOX1BBVEhNVVNURVhJU1Q7CisgICAgb2YubHBzdHJEZWZFeHQgPSAiZXhlIjsKIAotCXJlc3VsdCA9IEdldE9wZW5GaWxlTmFtZSgmb2YpOwotCWlmIChyZXN1bHQpIHsKLQkJaW50IG1ham9yLCBtaW5vcjsKLQkJaWYgKCFDaGVja1B5dGhvbkV4ZShwYXRobmFtZSwgdmVyc2lvbiwgJm1ham9yLCAmbWlub3IpKSB7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQkJKnN0cnJjaHIocGF0aG5hbWUsICdcXCcpID0gJ1wwJzsKLQkJd3NwcmludGYodmVyc19uYW1lLCAiUHl0aG9uIFZlcnNpb24gJWQuJWQgaW4gJXMiLAotCQkJICBtYWpvciwgbWlub3IsIHBhdGhuYW1lKTsKLQkJaXRlbWluZGV4ID0gU2VuZE1lc3NhZ2UoaHduZCwgTEJfSU5TRVJUU1RSSU5HLCAtMSwKLQkJCQkJKExQQVJBTSkoTFBTVFIpdmVyc19uYW1lKTsKLQkJU2VuZE1lc3NhZ2UoaHduZCwgTEJfU0VUQ1VSU0VMLCBpdGVtaW5kZXgsIDApOwotCQlTZW5kTWVzc2FnZShod25kLCBMQl9TRVRJVEVNREFUQSwgaXRlbWluZGV4LAotCQkJICAgIChMUEFSQU0pKExQU1RSKXN0cmR1cChwYXRobmFtZSkpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworICAgIHJlc3VsdCA9IEdldE9wZW5GaWxlTmFtZSgmb2YpOworICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgaW50IG1ham9yLCBtaW5vcjsKKyAgICAgICAgaWYgKCFDaGVja1B5dGhvbkV4ZShwYXRobmFtZSwgdmVyc2lvbiwgJm1ham9yLCAmbWlub3IpKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgKnN0cnJjaHIocGF0aG5hbWUsICdcXCcpID0gJ1wwJzsKKyAgICAgICAgd3NwcmludGYodmVyc19uYW1lLCAiUHl0aG9uIFZlcnNpb24gJWQuJWQgaW4gJXMiLAorICAgICAgICAgICAgICAgICAgbWFqb3IsIG1pbm9yLCBwYXRobmFtZSk7CisgICAgICAgIGl0ZW1pbmRleCA9IFNlbmRNZXNzYWdlKGh3bmQsIExCX0lOU0VSVFNUUklORywgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pKExQU1RSKXZlcnNfbmFtZSk7CisgICAgICAgIFNlbmRNZXNzYWdlKGh3bmQsIExCX1NFVENVUlNFTCwgaXRlbWluZGV4LCAwKTsKKyAgICAgICAgU2VuZE1lc3NhZ2UoaHduZCwgTEJfU0VUSVRFTURBVEEsIGl0ZW1pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkoTFBTVFIpc3RyZHVwKHBhdGhuYW1lKSk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CiB9CiAjZW5kaWYgLyogVVNFX09USEVSX1BZVEhPTl9WRVJTSU9OUyAqLwogCkBAIC0xNDMwLDcxICsxNDMwLDcxIEBACiAgKi8KIHN0YXRpYyBCT09MIEdldFB5dGhvblZlcnNpb25zKEhXTkQgaHduZCwgSEtFWSBoa1Jvb3QsIExQU1RSIHZlcnNpb24pCiB7Ci0JRFdPUkQgaW5kZXggPSAwOwotCWNoYXIgY29yZV92ZXJzaW9uWzgwXTsKLQlIS0VZIGhLZXk7Ci0JQk9PTCByZXN1bHQgPSBUUlVFOwotCURXT1JEIGJ1ZnNpemU7CisgICAgRFdPUkQgaW5kZXggPSAwOworICAgIGNoYXIgY29yZV92ZXJzaW9uWzgwXTsKKyAgICBIS0VZIGhLZXk7CisgICAgQk9PTCByZXN1bHQgPSBUUlVFOworICAgIERXT1JEIGJ1ZnNpemU7CiAKLQlpZiAoRVJST1JfU1VDQ0VTUyAhPSBSZWdPcGVuS2V5RXgoaGtSb290LAotCQkJCQkgICAiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZSIsCi0JCQkJCSAgIDAsCUtFWV9SRUFELCAmaEtleSkpCi0JCXJldHVybiBGQUxTRTsKLQlidWZzaXplID0gc2l6ZW9mKGNvcmVfdmVyc2lvbik7Ci0Jd2hpbGUgKEVSUk9SX1NVQ0NFU1MgPT0gUmVnRW51bUtleUV4KGhLZXksIGluZGV4LAotCQkJCQkgICAgICBjb3JlX3ZlcnNpb24sICZidWZzaXplLCBOVUxMLAotCQkJCQkgICAgICBOVUxMLCBOVUxMLCBOVUxMKSkgewotCQljaGFyIHN1YmtleV9uYW1lWzgwXSwgdmVyc19uYW1lWzgwXTsKLQkJaW50IGl0ZW1pbmRleDsKLQkJRFdPUkQgdmFsdWVfc2l6ZTsKLQkJSEtFWSBoazsKKyAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBSZWdPcGVuS2V5RXgoaGtSb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgS0VZX1JFQUQsICZoS2V5KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGJ1ZnNpemUgPSBzaXplb2YoY29yZV92ZXJzaW9uKTsKKyAgICB3aGlsZSAoRVJST1JfU1VDQ0VTUyA9PSBSZWdFbnVtS2V5RXgoaEtleSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX3ZlcnNpb24sICZidWZzaXplLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCkpIHsKKyAgICAgICAgY2hhciBzdWJrZXlfbmFtZVs4MF0sIHZlcnNfbmFtZVs4MF07CisgICAgICAgIGludCBpdGVtaW5kZXg7CisgICAgICAgIERXT1JEIHZhbHVlX3NpemU7CisgICAgICAgIEhLRVkgaGs7CiAKLQkJYnVmc2l6ZSA9IHNpemVvZihjb3JlX3ZlcnNpb24pOwotCQkrK2luZGV4OwotCQlpZiAodmVyc2lvbiAmJiAqdmVyc2lvbiAmJiBzdHJjbXAodmVyc2lvbiwgY29yZV92ZXJzaW9uKSkKLQkJCWNvbnRpbnVlOworICAgICAgICBidWZzaXplID0gc2l6ZW9mKGNvcmVfdmVyc2lvbik7CisgICAgICAgICsraW5kZXg7CisgICAgICAgIGlmICh2ZXJzaW9uICYmICp2ZXJzaW9uICYmIHN0cmNtcCh2ZXJzaW9uLCBjb3JlX3ZlcnNpb24pKQorICAgICAgICAgICAgY29udGludWU7CiAKLQkJd3NwcmludGYodmVyc19uYW1lLCAiUHl0aG9uIFZlcnNpb24gJXMgKGZvdW5kIGluIHJlZ2lzdHJ5KSIsCi0JCQkgIGNvcmVfdmVyc2lvbik7Ci0JCXdzcHJpbnRmKHN1YmtleV9uYW1lLAotCQkJICAiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZVxcJXNcXEluc3RhbGxQYXRoIiwKLQkJCSAgY29yZV92ZXJzaW9uKTsKLQkJaWYgKEVSUk9SX1NVQ0NFU1MgPT0gUmVnT3BlbktleUV4KGhrUm9vdCwgc3Via2V5X25hbWUsIDAsIEtFWV9SRUFELCAmaGspKSB7Ci0JCQlJbnN0YWxsZWRWZXJzaW9uSW5mbyAqaXZpID0gCi0JCQkgICAgICAoSW5zdGFsbGVkVmVyc2lvbkluZm8gKiltYWxsb2Moc2l6ZW9mKEluc3RhbGxlZFZlcnNpb25JbmZvKSk7Ci0JCQl2YWx1ZV9zaXplID0gc2l6ZW9mKGl2aS0+cHJlZml4KTsKLQkJCWlmIChpdmkgJiYgCi0JCQkgICAgRVJST1JfU1VDQ0VTUyA9PSBSZWdRdWVyeVZhbHVlRXgoaGssIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZpLT5wcmVmaXgsICZ2YWx1ZV9zaXplKSkgewotCQkJCWl0ZW1pbmRleCA9IFNlbmRNZXNzYWdlKGh3bmQsIExCX0FERFNUUklORywgMCwKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKShMUFNUUil2ZXJzX25hbWUpOwotCQkJCWl2aS0+aGtleSA9IGhrUm9vdDsKLQkJCQlTZW5kTWVzc2FnZShod25kLCBMQl9TRVRJVEVNREFUQSwgaXRlbWluZGV4LAotCQkJCSAgICAgICAgICAgIChMUEFSQU0pKExQU1RSKWl2aSk7Ci0JCQl9Ci0JCQlSZWdDbG9zZUtleShoayk7Ci0JCX0KLQl9Ci0JUmVnQ2xvc2VLZXkoaEtleSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgd3NwcmludGYodmVyc19uYW1lLCAiUHl0aG9uIFZlcnNpb24gJXMgKGZvdW5kIGluIHJlZ2lzdHJ5KSIsCisgICAgICAgICAgICAgICAgICBjb3JlX3ZlcnNpb24pOworICAgICAgICB3c3ByaW50ZihzdWJrZXlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwlc1xcSW5zdGFsbFBhdGgiLAorICAgICAgICAgICAgICAgICAgY29yZV92ZXJzaW9uKTsKKyAgICAgICAgaWYgKEVSUk9SX1NVQ0NFU1MgPT0gUmVnT3BlbktleUV4KGhrUm9vdCwgc3Via2V5X25hbWUsIDAsIEtFWV9SRUFELCAmaGspKSB7CisgICAgICAgICAgICBJbnN0YWxsZWRWZXJzaW9uSW5mbyAqaXZpID0KKyAgICAgICAgICAgICAgICAgIChJbnN0YWxsZWRWZXJzaW9uSW5mbyAqKW1hbGxvYyhzaXplb2YoSW5zdGFsbGVkVmVyc2lvbkluZm8pKTsKKyAgICAgICAgICAgIHZhbHVlX3NpemUgPSBzaXplb2YoaXZpLT5wcmVmaXgpOworICAgICAgICAgICAgaWYgKGl2aSAmJgorICAgICAgICAgICAgICAgIEVSUk9SX1NVQ0NFU1MgPT0gUmVnUXVlcnlWYWx1ZUV4KGhrLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2aS0+cHJlZml4LCAmdmFsdWVfc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVtaW5kZXggPSBTZW5kTWVzc2FnZShod25kLCBMQl9BRERTVFJJTkcsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkoTFBTVFIpdmVyc19uYW1lKTsKKyAgICAgICAgICAgICAgICBpdmktPmhrZXkgPSBoa1Jvb3Q7CisgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoaHduZCwgTEJfU0VUSVRFTURBVEEsIGl0ZW1pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKShMUFNUUilpdmkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVnQ2xvc2VLZXkoaGspOworICAgICAgICB9CisgICAgfQorICAgIFJlZ0Nsb3NlS2V5KGhLZXkpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIERldGVybWluZSBpZiB0aGUgY3VycmVudCB1c2VyIGNhbiB3cml0ZSB0byBIS0VZX0xPQ0FMX01BQ0hJTkUgKi8KIEJPT0wgSGFzTG9jYWxNYWNoaW5lUHJpdnMoKQogewotCQlIS0VZIGhLZXk7Ci0JCURXT1JEIHJlc3VsdDsKLQkJc3RhdGljIGNoYXIgS2V5TmFtZVtdID0gCi0JCQkiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbCI7CisgICAgICAgICAgICAgICAgSEtFWSBoS2V5OworICAgICAgICAgICAgICAgIERXT1JEIHJlc3VsdDsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY2hhciBLZXlOYW1lW10gPQorICAgICAgICAgICAgICAgICAgICAgICAgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGwiOwogCi0JCXJlc3VsdCA9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsCi0JCQkJCSAgS2V5TmFtZSwKLQkJCQkJICAwLAotCQkJCQkgIEtFWV9DUkVBVEVfU1VCX0tFWSwKLQkJCQkJICAmaEtleSk7Ci0JCWlmIChyZXN1bHQ9PTApCi0JCQlSZWdDbG9zZUtleShoS2V5KTsKLQkJcmV0dXJuIHJlc3VsdD09MDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfQ1JFQVRFX1NVQl9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEtleSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD09MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KGhLZXkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ9PTA7CiB9CiAKIC8vIENoZWNrIHRoZSByb290IHJlZ2lzdHJ5IGtleSB0byB1c2UgLSBlaXRoZXIgSEtMTSBvciBIS0NVLgpAQCAtMTUwNyw4NiArMTUwNyw4NiBAQAogLy8gV2UgYXNzdW1lIGhrZXlfcm9vdCBpcyBhbHJlYWR5IHNldCB0byB3aGVyZSBQeXRob24gaXRzZWxmIGlzIGluc3RhbGxlZC4KIHZvaWQgQ2hlY2tSb290S2V5KEhXTkQgaHduZCkKIHsKLQlpZiAoaGtleV9yb290PT1IS0VZX0NVUlJFTlRfVVNFUikgewotCQk7IC8vIGFzIGFib3ZlLCBhbHdheXMgaW5zdGFsbCBvdXJzZWxmIGluIEhLQ1UgdG9vLgotCX0gZWxzZSBpZiAoaGtleV9yb290PT1IS0VZX0xPQ0FMX01BQ0hJTkUpIHsKLQkJLy8gUHl0aG9uIGluIEhLTE0sIGJ1dCB3ZSBtYXkgb3IgbWF5IG5vdCBoYXZlIHBlcm1pc3Npb25zIHRoZXJlLgotCQkvLyBPcGVuIHRoZSB1bmluc3RhbGwga2V5IHdpdGggJ2NyZWF0ZScgcGVybWlzc2lvbnMgLSBpZiB0aGlzIGZhaWxzLAotCQkvLyB3ZSBkb24ndCBoYXZlIHBlcm1pc3Npb24uCi0JCWlmICghSGFzTG9jYWxNYWNoaW5lUHJpdnMoKSkKLQkJCWhrZXlfcm9vdCA9IEhLRVlfQ1VSUkVOVF9VU0VSOwotCX0gZWxzZSB7Ci0JCU1lc3NhZ2VCb3goaHduZCwgIkRvbid0IGtub3cgUHl0aG9uJ3MgaW5zdGFsbGF0aW9uIHR5cGUiLAotCQkJCSAgICJTdHJhbmdlIiwgTUJfT0sgfCBNQl9JQ09OU1RPUCk7Ci0JCS8qIERlZmF1bHQgdG8gd2hlcmV2ZXIgdGhleSBjYW4sIGJ1dCBwcmVmZXJyaW5nIEhLTE0gKi8KLQkJaGtleV9yb290ID0gSGFzTG9jYWxNYWNoaW5lUHJpdnMoKSA/IEhLRVlfTE9DQUxfTUFDSElORSA6IEhLRVlfQ1VSUkVOVF9VU0VSOwotCX0KKyAgICBpZiAoaGtleV9yb290PT1IS0VZX0NVUlJFTlRfVVNFUikgeworICAgICAgICA7IC8vIGFzIGFib3ZlLCBhbHdheXMgaW5zdGFsbCBvdXJzZWxmIGluIEhLQ1UgdG9vLgorICAgIH0gZWxzZSBpZiAoaGtleV9yb290PT1IS0VZX0xPQ0FMX01BQ0hJTkUpIHsKKyAgICAgICAgLy8gUHl0aG9uIGluIEhLTE0sIGJ1dCB3ZSBtYXkgb3IgbWF5IG5vdCBoYXZlIHBlcm1pc3Npb25zIHRoZXJlLgorICAgICAgICAvLyBPcGVuIHRoZSB1bmluc3RhbGwga2V5IHdpdGggJ2NyZWF0ZScgcGVybWlzc2lvbnMgLSBpZiB0aGlzIGZhaWxzLAorICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHBlcm1pc3Npb24uCisgICAgICAgIGlmICghSGFzTG9jYWxNYWNoaW5lUHJpdnMoKSkKKyAgICAgICAgICAgIGhrZXlfcm9vdCA9IEhLRVlfQ1VSUkVOVF9VU0VSOworICAgIH0gZWxzZSB7CisgICAgICAgIE1lc3NhZ2VCb3goaHduZCwgIkRvbid0IGtub3cgUHl0aG9uJ3MgaW5zdGFsbGF0aW9uIHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmFuZ2UiLCBNQl9PSyB8IE1CX0lDT05TVE9QKTsKKyAgICAgICAgLyogRGVmYXVsdCB0byB3aGVyZXZlciB0aGV5IGNhbiwgYnV0IHByZWZlcnJpbmcgSEtMTSAqLworICAgICAgICBoa2V5X3Jvb3QgPSBIYXNMb2NhbE1hY2hpbmVQcml2cygpID8gSEtFWV9MT0NBTF9NQUNISU5FIDogSEtFWV9DVVJSRU5UX1VTRVI7CisgICAgfQogfQogCiAvKiBSZXR1cm4gdGhlIGluc3RhbGxhdGlvbiBzY2hlbWUgZGVwZW5kaW5nIG9uIFB5dGhvbiB2ZXJzaW9uIG51bWJlciAqLwogU0NIRU1FICpHZXRTY2hlbWUoaW50IG1ham9yLCBpbnQgbWlub3IpCiB7Ci0JaWYgKG1ham9yID4gMikKLQkJcmV0dXJuIG5ld19zY2hlbWU7Ci0JZWxzZSBpZigobWFqb3IgPT0gMikgJiYgKG1pbm9yID49IDIpKQotCQlyZXR1cm4gbmV3X3NjaGVtZTsKLQlyZXR1cm4gb2xkX3NjaGVtZTsKKyAgICBpZiAobWFqb3IgPiAyKQorICAgICAgICByZXR1cm4gbmV3X3NjaGVtZTsKKyAgICBlbHNlIGlmKChtYWpvciA9PSAyKSAmJiAobWlub3IgPj0gMikpCisgICAgICAgIHJldHVybiBuZXdfc2NoZW1lOworICAgIHJldHVybiBvbGRfc2NoZW1lOwogfQogCiBCT09MIENBTExCQUNLCiBTZWxlY3RQeXRob25EbGdQcm9jKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JTFBOTUhEUiBscG5tOworICAgIExQTk1IRFIgbHBubTsKIAotCXN3aXRjaCAobXNnKSB7Ci0JY2FzZSBXTV9JTklURElBTE9HOgotCQlpZiAoaEJpdG1hcCkKLQkJCVNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfQklUTUFQLCBTVE1fU0VUSU1BR0UsCi0JCQkJCSAgIElNQUdFX0JJVE1BUCwgKExQQVJBTSloQml0bWFwKTsKLQkJR2V0UHl0aG9uVmVyc2lvbnMoR2V0RGxnSXRlbShod25kLCBJRENfVkVSU0lPTlNfTElTVCksCi0JCQkJICAgSEtFWV9MT0NBTF9NQUNISU5FLCB0YXJnZXRfdmVyc2lvbik7Ci0JCUdldFB5dGhvblZlcnNpb25zKEdldERsZ0l0ZW0oaHduZCwgSURDX1ZFUlNJT05TX0xJU1QpLAotCQkJCSAgIEhLRVlfQ1VSUkVOVF9VU0VSLCB0YXJnZXRfdmVyc2lvbik7Ci0JCXsJLyogc2VsZWN0IHRoZSBsYXN0IGVudHJ5IHdoaWNoIGlzIHRoZSBoaWdoZXN0IHB5dGhvbgotCQkJICAgdmVyc2lvbiBmb3VuZCAqLwotCQkJaW50IGNvdW50OwotCQkJY291bnQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsCi0JCQkJCQkgICAgTEJfR0VUQ09VTlQsIDAsIDApOwotCQkJaWYgKGNvdW50ICYmIGNvdW50ICE9IExCX0VSUikKLQkJCQlTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsIExCX1NFVENVUlNFTCwKLQkJCQkJCSAgICBjb3VudC0xLCAwKTsKLQkgICAgCi0JCQkvKiBJZiBhIHNwZWNpZmljIFB5dGhvbiB2ZXJzaW9uIGlzIHJlcXVpcmVkLAotCQkJICogZGlzcGxheSBhIHByb21pbmVudCBub3RpY2Ugc2hvd2luZyB0aGlzIGZhY3QuCi0JCQkgKi8KLQkJCWlmICh0YXJnZXRfdmVyc2lvbiAmJiB0YXJnZXRfdmVyc2lvblswXSkgewotCQkJCWNoYXIgYnVmZmVyWzQwOTZdOwotCQkJCXdzcHJpbnRmKGJ1ZmZlciwKLQkJCQkJICJQeXRob24gJXMgaXMgcmVxdWlyZWQgZm9yIHRoaXMgcGFja2FnZS4gIgotCQkJCQkgIlNlbGVjdCBpbnN0YWxsYXRpb24gdG8gdXNlOiIsCi0JCQkJCSB0YXJnZXRfdmVyc2lvbik7Ci0JCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLCBidWZmZXIpOwotCQkJfQorICAgIHN3aXRjaCAobXNnKSB7CisgICAgY2FzZSBXTV9JTklURElBTE9HOgorICAgICAgICBpZiAoaEJpdG1hcCkKKyAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfQklUTUFQLCBTVE1fU0VUSU1BR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BR0VfQklUTUFQLCAoTFBBUkFNKWhCaXRtYXApOworICAgICAgICBHZXRQeXRob25WZXJzaW9ucyhHZXREbGdJdGVtKGh3bmQsIElEQ19WRVJTSU9OU19MSVNUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhLRVlfTE9DQUxfTUFDSElORSwgdGFyZ2V0X3ZlcnNpb24pOworICAgICAgICBHZXRQeXRob25WZXJzaW9ucyhHZXREbGdJdGVtKGh3bmQsIElEQ19WRVJTSU9OU19MSVNUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhLRVlfQ1VSUkVOVF9VU0VSLCB0YXJnZXRfdmVyc2lvbik7CisgICAgICAgIHsgICAgICAgICAgICAgICAvKiBzZWxlY3QgdGhlIGxhc3QgZW50cnkgd2hpY2ggaXMgdGhlIGhpZ2hlc3QgcHl0aG9uCisgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBmb3VuZCAqLworICAgICAgICAgICAgaW50IGNvdW50OworICAgICAgICAgICAgY291bnQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEJfR0VUQ09VTlQsIDAsIDApOworICAgICAgICAgICAgaWYgKGNvdW50ICYmIGNvdW50ICE9IExCX0VSUikKKyAgICAgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsIExCX1NFVENVUlNFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LTEsIDApOwogCi0JCQlpZiAoY291bnQgPT0gMCkgewotCQkJCWNoYXIgQnVmZmVyWzQwOTZdOwotCQkJCWNoYXIgKm1zZzsKLQkJCQlpZiAodGFyZ2V0X3ZlcnNpb24gJiYgdGFyZ2V0X3ZlcnNpb25bMF0pIHsKLQkJCQkJd3NwcmludGYoQnVmZmVyLAotCQkJCQkJICJQeXRob24gdmVyc2lvbiAlcyByZXF1aXJlZCwgd2hpY2ggd2FzIG5vdCBmb3VuZCIKLQkJCQkJCSAiIGluIHRoZSByZWdpc3RyeS4iLCB0YXJnZXRfdmVyc2lvbik7Ci0JCQkJCW1zZyA9IEJ1ZmZlcjsKLQkJCQl9IGVsc2UKLQkJCQkJbXNnID0gIk5vIFB5dGhvbiBpbnN0YWxsYXRpb24gZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiI7Ci0JCQkJTWVzc2FnZUJveChod25kLCBtc2csICJDYW5ub3QgaW5zdGFsbCIsCi0JCQkJCSAgIE1CX09LIHwgTUJfSUNPTlNUT1ApOwotCQkJfQotCQl9Ci0JCWdvdG8gVXBkYXRlSW5zdGFsbERpcjsKLQkJYnJlYWs7CisgICAgICAgICAgICAvKiBJZiBhIHNwZWNpZmljIFB5dGhvbiB2ZXJzaW9uIGlzIHJlcXVpcmVkLAorICAgICAgICAgICAgICogZGlzcGxheSBhIHByb21pbmVudCBub3RpY2Ugc2hvd2luZyB0aGlzIGZhY3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh0YXJnZXRfdmVyc2lvbiAmJiB0YXJnZXRfdmVyc2lvblswXSkgeworICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzQwOTZdOworICAgICAgICAgICAgICAgIHdzcHJpbnRmKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uICVzIGlzIHJlcXVpcmVkIGZvciB0aGlzIHBhY2thZ2UuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiU2VsZWN0IGluc3RhbGxhdGlvbiB0byB1c2U6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbik7CisgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLCBidWZmZXIpOworICAgICAgICAgICAgfQogCi0JY2FzZSBXTV9DT01NQU5EOgotCQlzd2l0Y2ggKExPV09SRCh3UGFyYW0pKSB7CisgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgQnVmZmVyWzQwOTZdOworICAgICAgICAgICAgICAgIGNoYXIgKm1zZzsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0X3ZlcnNpb24gJiYgdGFyZ2V0X3ZlcnNpb25bMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgd3NwcmludGYoQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIHZlcnNpb24gJXMgcmVxdWlyZWQsIHdoaWNoIHdhcyBub3QgZm91bmQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gdGhlIHJlZ2lzdHJ5LiIsIHRhcmdldF92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gQnVmZmVyOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBtc2cgPSAiTm8gUHl0aG9uIGluc3RhbGxhdGlvbiBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuIjsKKyAgICAgICAgICAgICAgICBNZXNzYWdlQm94KGh3bmQsIG1zZywgIkNhbm5vdCBpbnN0YWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX09LIHwgTUJfSUNPTlNUT1ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdvdG8gVXBkYXRlSW5zdGFsbERpcjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdNX0NPTU1BTkQ6CisgICAgICAgIHN3aXRjaCAoTE9XT1JEKHdQYXJhbSkpIHsKIC8qCiAgIGNhc2UgSURDX09USEVSUFlUSE9OOgogICBpZiAoR2V0T3RoZXJQeXRob25WZXJzaW9uKEdldERsZ0l0ZW0oaHduZCwgSURDX1ZFUlNJT05TX0xJU1QpLApAQCAtMTU5NCwzMDcgKzE1OTQsMzA3IEBACiAgIGdvdG8gVXBkYXRlSW5zdGFsbERpcjsKICAgYnJlYWs7CiAqLwotCQljYXNlIElEQ19WRVJTSU9OU19MSVNUOgotCQkJc3dpdGNoIChISVdPUkQod1BhcmFtKSkgewotCQkJCWludCBpZDsKLQkJCWNhc2UgTEJOX1NFTENIQU5HRToKLQkJCSAgVXBkYXRlSW5zdGFsbERpcjoKLQkJCQlQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCi0JCQkJCQkJUFNXSVpCX0JBQ0sgfCBQU1dJWkJfTkVYVCk7Ci0JCQkJaWQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsCi0JCQkJCQkJIExCX0dFVENVUlNFTCwgMCwgMCk7Ci0JCQkJaWYgKGlkID09IExCX0VSUikgewotCQkJCQlQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCi0JCQkJCQkJCVBTV0laQl9CQUNLKTsKLQkJCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1BBVEgsICIiKTsKLQkJCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lOU1RBTExfUEFUSCwgIiIpOwotCQkJCQlzdHJjcHkocHl0aG9uX2RpciwgIiIpOwotCQkJCQlzdHJjcHkocHl0aG9uZGxsLCAiIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2hhciAqcGJ1ZjsKLQkJCQkJaW50IHJlc3VsdDsKLQkJCQkJSW5zdGFsbGVkVmVyc2lvbkluZm8gKml2aTsKLQkJCQkJUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAotCQkJCQkJCQlQU1dJWkJfQkFDSyB8IFBTV0laQl9ORVhUKTsKLQkJCQkJLyogR2V0IHRoZSBweXRob24gZGlyZWN0b3J5ICovCi0gICAgICAgICAgICAgICAgICAgIGl2aSA9IChJbnN0YWxsZWRWZXJzaW9uSW5mbyAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwKLQkJCQkJCQkJCUlEQ19WRVJTSU9OU19MSVNULAotCQkJCQkJCQkJTEJfR0VUSVRFTURBVEEsCi0JCQkJCQkJCQlpZCwKLQkJCQkJCQkJCTApOwotICAgICAgICAgICAgICAgICAgICBoa2V5X3Jvb3QgPSBpdmktPmhrZXk7Ci0JCQkJCXN0cmNweShweXRob25fZGlyLCBpdmktPnByZWZpeCk7Ci0JCQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19QQVRILCBweXRob25fZGlyKTsKLQkJCQkJLyogcmV0cmlldmUgdGhlIHB5dGhvbiB2ZXJzaW9uIGFuZCBweXRob25kbGwgdG8gdXNlICovCi0JCQkJCXJlc3VsdCA9IFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwKLQkJCQkJCQkJICAgICBMQl9HRVRURVhUTEVOLCAoV1BBUkFNKWlkLCAwKTsKLQkJCQkJcGJ1ZiA9IChjaGFyICopbWFsbG9jKHJlc3VsdCArIDEpOwotCQkJCQlpZiAocGJ1ZikgewotCQkJCQkJLyogZ3Vlc3MgdGhlIG5hbWUgb2YgdGhlIHB5dGhvbi1kbGwgKi8KLQkJCQkJCVNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwKLQkJCQkJCQkJICAgIExCX0dFVFRFWFQsIChXUEFSQU0paWQsCi0JCQkJCQkJCSAgICAoTFBBUkFNKXBidWYpOwotCQkJCQkJcmVzdWx0ID0gc3NjYW5mKHBidWYsICJQeXRob24gVmVyc2lvbiAlZC4lZCIsCi0JCQkJCQkJCSAmcHlfbWFqb3IsICZweV9taW5vcik7Ci0JCQkJCQlpZiAocmVzdWx0ID09IDIpIHsKKyAgICAgICAgY2FzZSBJRENfVkVSU0lPTlNfTElTVDoKKyAgICAgICAgICAgIHN3aXRjaCAoSElXT1JEKHdQYXJhbSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgaWQ7CisgICAgICAgICAgICBjYXNlIExCTl9TRUxDSEFOR0U6CisgICAgICAgICAgICAgIFVwZGF0ZUluc3RhbGxEaXI6CisgICAgICAgICAgICAgICAgUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTV0laQl9CQUNLIHwgUFNXSVpCX05FWFQpOworICAgICAgICAgICAgICAgIGlkID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQl9HRVRDVVJTRUwsIDAsIDApOworICAgICAgICAgICAgICAgIGlmIChpZCA9PSBMQl9FUlIpIHsKKyAgICAgICAgICAgICAgICAgICAgUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1dJWkJfQkFDSyk7CisgICAgICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19QQVRILCAiIik7CisgICAgICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTlNUQUxMX1BBVEgsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHB5dGhvbl9kaXIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHB5dGhvbmRsbCwgIiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBidWY7CisgICAgICAgICAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIEluc3RhbGxlZFZlcnNpb25JbmZvICppdmk7CisgICAgICAgICAgICAgICAgICAgIFByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNXSVpCX0JBQ0sgfCBQU1dJWkJfTkVYVCk7CisgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgcHl0aG9uIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgaXZpID0gKEluc3RhbGxlZFZlcnNpb25JbmZvICopCisgICAgICAgICAgICAgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRENfVkVSU0lPTlNfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQl9HRVRJVEVNREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIGhrZXlfcm9vdCA9IGl2aS0+aGtleTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHB5dGhvbl9kaXIsIGl2aS0+cHJlZml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1BBVEgsIHB5dGhvbl9kaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZSB0aGUgcHl0aG9uIHZlcnNpb24gYW5kIHB5dGhvbmRsbCB0byB1c2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExCX0dFVFRFWFRMRU4sIChXUEFSQU0paWQsIDApOworICAgICAgICAgICAgICAgICAgICBwYnVmID0gKGNoYXIgKiltYWxsb2MocmVzdWx0ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBndWVzcyB0aGUgbmFtZSBvZiB0aGUgcHl0aG9uLWRsbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQl9HRVRURVhULCAoV1BBUkFNKWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKXBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3NjYW5mKHBidWYsICJQeXRob24gVmVyc2lvbiAlZC4lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZweV9tYWpvciwgJnB5X21pbm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMikgewogI2lmZGVmIF9ERUJVRwotCQkJCQkJCXdzcHJpbnRmKHB5dGhvbmRsbCwgInB5dGhvbiVkJWRfZC5kbGwiLAotCQkJCQkJCQkgcHlfbWFqb3IsIHB5X21pbm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c3ByaW50ZihweXRob25kbGwsICJweXRob24lZCVkX2QuZGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweV9tYWpvciwgcHlfbWlub3IpOwogI2Vsc2UKLQkJCQkJCQl3c3ByaW50ZihweXRob25kbGwsICJweXRob24lZCVkLmRsbCIsCi0JCQkJCQkJCSBweV9tYWpvciwgcHlfbWlub3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzcHJpbnRmKHB5dGhvbmRsbCwgInB5dGhvbiVkJWQuZGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweV9tYWpvciwgcHlfbWlub3IpOwogI2VuZGlmCi0JCQkJCQl9Ci0JCQkJCQlmcmVlKHBidWYpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXN0cmNweShweXRob25kbGwsICIiKTsKLQkJCQkJLyogcmV0cmlldmUgdGhlIHNjaGVtZSBmb3IgdGhpcyB2ZXJzaW9uICovCi0JCQkJCXsKLQkJCQkJCWNoYXIgaW5zdGFsbF9wYXRoW19NQVhfUEFUSF07Ci0JCQkJCQlTQ0hFTUUgKnNjaGVtZSA9IEdldFNjaGVtZShweV9tYWpvciwgcHlfbWlub3IpOwotCQkJCQkJc3RyY3B5KGluc3RhbGxfcGF0aCwgcHl0aG9uX2Rpcik7Ci0JCQkJCQlpZiAoaW5zdGFsbF9wYXRoW3N0cmxlbihpbnN0YWxsX3BhdGgpLTFdICE9ICdcXCcpCi0JCQkJCQkJc3RyY2F0KGluc3RhbGxfcGF0aCwgIlxcIik7Ci0JCQkJCQlzdHJjYXQoaW5zdGFsbF9wYXRoLCBzY2hlbWVbMF0ucHJlZml4KTsKLQkJCQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTlNUQUxMX1BBVEgsIGluc3RhbGxfcGF0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHB5dGhvbmRsbCwgIiIpOworICAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZSB0aGUgc2NoZW1lIGZvciB0aGlzIHZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBpbnN0YWxsX3BhdGhbX01BWF9QQVRIXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNDSEVNRSAqc2NoZW1lID0gR2V0U2NoZW1lKHB5X21ham9yLCBweV9taW5vcik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaW5zdGFsbF9wYXRoLCBweXRob25fZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YWxsX3BhdGhbc3RybGVuKGluc3RhbGxfcGF0aCktMV0gIT0gJ1xcJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXQoaW5zdGFsbF9wYXRoLCAiXFwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhdChpbnN0YWxsX3BhdGgsIHNjaGVtZVswXS5wcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lOU1RBTExfUEFUSCwgaW5zdGFsbF9wYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOwogCi0JY2FzZSBXTV9OT1RJRlk6Ci0JCWxwbm0gPSAoTFBOTUhEUikgbFBhcmFtOworICAgIGNhc2UgV01fTk9USUZZOgorICAgICAgICBscG5tID0gKExQTk1IRFIpIGxQYXJhbTsKIAotCQlzd2l0Y2ggKGxwbm0tPmNvZGUpIHsKLQkJCWludCBpZDsKLQkJY2FzZSBQU05fU0VUQUNUSVZFOgotCQkJaWQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsCi0JCQkJCQkgTEJfR0VUQ1VSU0VMLCAwLCAwKTsKLQkJCWlmIChpZCA9PSBMQl9FUlIpCi0JCQkJUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAotCQkJCQkJCVBTV0laQl9CQUNLKTsKLQkJCWVsc2UKLQkJCQlQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCi0JCQkJCQkJUFNXSVpCX0JBQ0sgfCBQU1dJWkJfTkVYVCk7Ci0JCQlicmVhazsKKyAgICAgICAgc3dpdGNoIChscG5tLT5jb2RlKSB7CisgICAgICAgICAgICBpbnQgaWQ7CisgICAgICAgIGNhc2UgUFNOX1NFVEFDVElWRToKKyAgICAgICAgICAgIGlkID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExCX0dFVENVUlNFTCwgMCwgMCk7CisgICAgICAgICAgICBpZiAoaWQgPT0gTEJfRVJSKQorICAgICAgICAgICAgICAgIFByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1dJWkJfQkFDSyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTV0laQl9CQUNLIHwgUFNXSVpCX05FWFQpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQU05fV0laTkVYVDoKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFBTTl9XSVpORVhUOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQU05fV0laRklOSVNIOgotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUFNOX1dJWkZJTklTSDoKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFNOX1JFU0VUOgotCQkJYnJlYWs7Ci0JCQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGNhc2UgUFNOX1JFU0VUOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgQk9PTCBPcGVuTG9nZmlsZShjaGFyICpkaXIpCiB7Ci0JY2hhciBidWZmZXJbX01BWF9QQVRIKzFdOwotCXRpbWVfdCBsdGltZTsKLQlzdHJ1Y3QgdG0gKm5vdzsKLQlsb25nIHJlc3VsdDsKLQlIS0VZIGhLZXksIGhTdWJrZXk7Ci0JY2hhciBzdWJrZXlfbmFtZVsyNTZdOwotCXN0YXRpYyBjaGFyIEtleU5hbWVbXSA9IAotCQkiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbCI7Ci0JY29uc3QgY2hhciAqcm9vdF9uYW1lID0gKGhrZXlfcm9vdD09SEtFWV9MT0NBTF9NQUNISU5FID8KLQkgICAgICAgICAgICAgICAgICAgICAgICAiSEtFWV9MT0NBTF9NQUNISU5FIiA6ICJIS0VZX0NVUlJFTlRfVVNFUiIpOwotCURXT1JEIGRpc3Bvc2l0aW9uOworICAgIGNoYXIgYnVmZmVyW19NQVhfUEFUSCsxXTsKKyAgICB0aW1lX3QgbHRpbWU7CisgICAgc3RydWN0IHRtICpub3c7CisgICAgbG9uZyByZXN1bHQ7CisgICAgSEtFWSBoS2V5LCBoU3Via2V5OworICAgIGNoYXIgc3Via2V5X25hbWVbMjU2XTsKKyAgICBzdGF0aWMgY2hhciBLZXlOYW1lW10gPQorICAgICAgICAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbCI7CisgICAgY29uc3QgY2hhciAqcm9vdF9uYW1lID0gKGhrZXlfcm9vdD09SEtFWV9MT0NBTF9NQUNISU5FID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSEtFWV9MT0NBTF9NQUNISU5FIiA6ICJIS0VZX0NVUlJFTlRfVVNFUiIpOworICAgIERXT1JEIGRpc3Bvc2l0aW9uOwogCi0JLyogVXNlIENyZWF0ZSwgYXMgdGhlIFVuaW5zdGFsbCBzdWJrZXkgbWF5IG5vdCBleGlzdCB1bmRlciBIS0NVLgotCSAgIFVzZSBDcmVhdGVLZXlFeCwgc28gd2UgY2FuIHNwZWNpZnkgYSBTQU0gc3BlY2lmeWluZyB3cml0ZSBhY2Nlc3MKLQkqLwotCQlyZXN1bHQgPSBSZWdDcmVhdGVLZXlFeChoa2V5X3Jvb3QsCi0JCQkgICAgICBLZXlOYW1lLAotCQkJICAgICAgMCwgLyogcmVzZXJ2ZWQgKi8KLQkJCSAgICAgIE5VTEwsIC8qIGNsYXNzICovCi0JCQkgICAgICAwLCAvKiBvcHRpb25zICovCi0JCQkgICAgICBLRVlfQ1JFQVRFX1NVQl9LRVksIC8qIHNhbSAqLwotCQkJICAgICAgTlVMTCwgLyogc2VjdXJpdHkgKi8KLQkJCSAgICAgICZoS2V5LCAvKiByZXN1bHQga2V5ICovCi0JCQkgICAgICBOVUxMKTsgLyogZGlzcG9zaXRpb24gKi8KLQlpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkJaWYgKHJlc3VsdCA9PSBFUlJPUl9BQ0NFU1NfREVOSUVEKSB7Ci0JCQkvKiBUaGlzIHNob3VsZCBubyBsb25nZXIgYmUgYWJsZSB0byBoYXBwZW4gLSB3ZSBoYXZlIGFscmVhZHkKLQkJCSAgIGNoZWNrZWQgaWYgdGhleSBoYXZlIHBlcm1pc3Npb25zIGluIEhLTE0sIGFuZCBhbGwgdXNlcnMKLQkJCSAgIHNob3VsZCBoYXZlIHdyaXRlIGFjY2VzcyB0byBIS0NVLgotCQkJKi8KLQkJCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwKLQkJCQkgICAiWW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgc3VmZmljaWVudCBhY2Nlc3MgcmlnaHRzXG4iCi0JCQkJICAgIm9uIHRoaXMgbWFjaGluZSB0byBpbnN0YWxsIHRoaXMgc29mdHdhcmUiLAotCQkJCSAgIE5VTEwsCi0JCQkJICAgTUJfT0sgfCBNQl9JQ09OU1RPUCk7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0gZWxzZSB7Ci0JCQlNZXNzYWdlQm94KEdldEZvY3VzKCksIEtleU5hbWUsICJDb3VsZCBub3Qgb3BlbiBrZXkiLCBNQl9PSyk7Ci0JCX0KLQl9CisgICAgLyogVXNlIENyZWF0ZSwgYXMgdGhlIFVuaW5zdGFsbCBzdWJrZXkgbWF5IG5vdCBleGlzdCB1bmRlciBIS0NVLgorICAgICAgIFVzZSBDcmVhdGVLZXlFeCwgc28gd2UgY2FuIHNwZWNpZnkgYSBTQU0gc3BlY2lmeWluZyB3cml0ZSBhY2Nlc3MKKyAgICAqLworICAgICAgICByZXN1bHQgPSBSZWdDcmVhdGVLZXlFeChoa2V5X3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgS2V5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAvKiByZXNlcnZlZCAqLworICAgICAgICAgICAgICAgICAgTlVMTCwgLyogY2xhc3MgKi8KKyAgICAgICAgICAgICAgICAgIDAsIC8qIG9wdGlvbnMgKi8KKyAgICAgICAgICAgICAgICAgIEtFWV9DUkVBVEVfU1VCX0tFWSwgLyogc2FtICovCisgICAgICAgICAgICAgICAgICBOVUxMLCAvKiBzZWN1cml0eSAqLworICAgICAgICAgICAgICAgICAgJmhLZXksIC8qIHJlc3VsdCBrZXkgKi8KKyAgICAgICAgICAgICAgICAgIE5VTEwpOyAvKiBkaXNwb3NpdGlvbiAqLworICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBpZiAocmVzdWx0ID09IEVSUk9SX0FDQ0VTU19ERU5JRUQpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBhYmxlIHRvIGhhcHBlbiAtIHdlIGhhdmUgYWxyZWFkeQorICAgICAgICAgICAgICAgY2hlY2tlZCBpZiB0aGV5IGhhdmUgcGVybWlzc2lvbnMgaW4gSEtMTSwgYW5kIGFsbCB1c2VycworICAgICAgICAgICAgICAgc2hvdWxkIGhhdmUgd3JpdGUgYWNjZXNzIHRvIEhLQ1UuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLAorICAgICAgICAgICAgICAgICAgICAgICAiWW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgc3VmZmljaWVudCBhY2Nlc3MgcmlnaHRzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJvbiB0aGlzIG1hY2hpbmUgdG8gaW5zdGFsbCB0aGlzIHNvZnR3YXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgTUJfT0sgfCBNQl9JQ09OU1RPUCk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIEtleU5hbWUsICJDb3VsZCBub3Qgb3BlbiBrZXkiLCBNQl9PSyk7CisgICAgICAgIH0KKyAgICB9CiAKLQlzcHJpbnRmKGJ1ZmZlciwgIiVzXFwlcy13aW5pbnN0LmxvZyIsIGRpciwgbWV0YV9uYW1lKTsKLQlsb2dmaWxlID0gZm9wZW4oYnVmZmVyLCAiYSIpOwotCXRpbWUoJmx0aW1lKTsKLQlub3cgPSBsb2NhbHRpbWUoJmx0aW1lKTsKLQlzdHJmdGltZShidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkgIioqKiBJbnN0YWxsYXRpb24gc3RhcnRlZCAlWS8lbS8lZCAlSDolTSAqKipcbiIsCi0JCSBsb2NhbHRpbWUoJmx0aW1lKSk7Ci0JZnByaW50Zihsb2dmaWxlLCBidWZmZXIpOwotCWZwcmludGYobG9nZmlsZSwgIlNvdXJjZTogJXNcbiIsIG1vZHVsZW5hbWUpOworICAgIHNwcmludGYoYnVmZmVyLCAiJXNcXCVzLXdpbmluc3QubG9nIiwgZGlyLCBtZXRhX25hbWUpOworICAgIGxvZ2ZpbGUgPSBmb3BlbihidWZmZXIsICJhIik7CisgICAgdGltZSgmbHRpbWUpOworICAgIG5vdyA9IGxvY2FsdGltZSgmbHRpbWUpOworICAgIHN0cmZ0aW1lKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgIioqKiBJbnN0YWxsYXRpb24gc3RhcnRlZCAlWS8lbS8lZCAlSDolTSAqKipcbiIsCisgICAgICAgICAgICAgbG9jYWx0aW1lKCZsdGltZSkpOworICAgIGZwcmludGYobG9nZmlsZSwgYnVmZmVyKTsKKyAgICBmcHJpbnRmKGxvZ2ZpbGUsICJTb3VyY2U6ICVzXG4iLCBtb2R1bGVuYW1lKTsKIAotCS8qIFJvb3Qga2V5IG11c3QgYmUgZmlyc3QgZW50cnkgcHJvY2Vzc2VkIGJ5IHVuaW5zdGFsbGVyLiAqLwotCWZwcmludGYobG9nZmlsZSwgIjk5OSBSb290IEtleTogJXNcbiIsIHJvb3RfbmFtZSk7CisgICAgLyogUm9vdCBrZXkgbXVzdCBiZSBmaXJzdCBlbnRyeSBwcm9jZXNzZWQgYnkgdW5pbnN0YWxsZXIuICovCisgICAgZnByaW50Zihsb2dmaWxlLCAiOTk5IFJvb3QgS2V5OiAlc1xuIiwgcm9vdF9uYW1lKTsKIAotCXNwcmludGYoc3Via2V5X25hbWUsICIlcy1weSVkLiVkIiwgbWV0YV9uYW1lLCBweV9tYWpvciwgcHlfbWlub3IpOworICAgIHNwcmludGYoc3Via2V5X25hbWUsICIlcy1weSVkLiVkIiwgbWV0YV9uYW1lLCBweV9tYWpvciwgcHlfbWlub3IpOwogCi0JcmVzdWx0ID0gUmVnQ3JlYXRlS2V5RXgoaEtleSwgc3Via2V5X25hbWUsCi0JCQkJMCwgTlVMTCwgMCwKLQkJCQlLRVlfV1JJVEUsCi0JCQkJTlVMTCwKLQkJCQkmaFN1YmtleSwKLQkJCQkmZGlzcG9zaXRpb24pOworICAgIHJlc3VsdCA9IFJlZ0NyZWF0ZUtleUV4KGhLZXksIHN1YmtleV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTdWJrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3Bvc2l0aW9uKTsKIAotCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLQkJTWVzc2FnZUJveChHZXRGb2N1cygpLCBzdWJrZXlfbmFtZSwgIkNvdWxkIG5vdCBjcmVhdGUga2V5IiwgTUJfT0spOworICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBzdWJrZXlfbmFtZSwgIkNvdWxkIG5vdCBjcmVhdGUga2V5IiwgTUJfT0spOwogCi0JUmVnQ2xvc2VLZXkoaEtleSk7CisgICAgUmVnQ2xvc2VLZXkoaEtleSk7CiAKLQlpZiAoZGlzcG9zaXRpb24gPT0gUkVHX0NSRUFURURfTkVXX0tFWSkKLQkJZnByaW50Zihsb2dmaWxlLCAiMDIwIFJlZyBEQiBLZXk6IFslc10lc1xuIiwgS2V5TmFtZSwgc3Via2V5X25hbWUpOworICAgIGlmIChkaXNwb3NpdGlvbiA9PSBSRUdfQ1JFQVRFRF9ORVdfS0VZKQorICAgICAgICBmcHJpbnRmKGxvZ2ZpbGUsICIwMjAgUmVnIERCIEtleTogWyVzXSVzXG4iLCBLZXlOYW1lLCBzdWJrZXlfbmFtZSk7CiAKLQlzcHJpbnRmKGJ1ZmZlciwgIlB5dGhvbiAlZC4lZCAlcyIsIHB5X21ham9yLCBweV9taW5vciwgdGl0bGUpOworICAgIHNwcmludGYoYnVmZmVyLCAiUHl0aG9uICVkLiVkICVzIiwgcHlfbWFqb3IsIHB5X21pbm9yLCB0aXRsZSk7CiAKLQlyZXN1bHQgPSBSZWdTZXRWYWx1ZUV4KGhTdWJrZXksICJEaXNwbGF5TmFtZSIsCi0JCQkgICAgICAgMCwKLQkJCSAgICAgICBSRUdfU1osCi0JCQkgICAgICAgYnVmZmVyLAotCQkJICAgICAgIHN0cmxlbihidWZmZXIpKzEpOworICAgIHJlc3VsdCA9IFJlZ1NldFZhbHVlRXgoaFN1YmtleSwgIkRpc3BsYXlOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfU1osCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYnVmZmVyKSsxKTsKIAotCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLQkJTWVzc2FnZUJveChHZXRGb2N1cygpLCBidWZmZXIsICJDb3VsZCBub3Qgc2V0IGtleSB2YWx1ZSIsIE1CX09LKTsKKyAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgYnVmZmVyLCAiQ291bGQgbm90IHNldCBrZXkgdmFsdWUiLCBNQl9PSyk7CiAKLQlmcHJpbnRmKGxvZ2ZpbGUsICIwNDAgUmVnIERCIFZhbHVlOiBbJXNcXCVzXSVzPSVzXG4iLAotCQlLZXlOYW1lLCBzdWJrZXlfbmFtZSwgIkRpc3BsYXlOYW1lIiwgYnVmZmVyKTsKKyAgICBmcHJpbnRmKGxvZ2ZpbGUsICIwNDAgUmVnIERCIFZhbHVlOiBbJXNcXCVzXSVzPSVzXG4iLAorICAgICAgICBLZXlOYW1lLCBzdWJrZXlfbmFtZSwgIkRpc3BsYXlOYW1lIiwgYnVmZmVyKTsKIAotCXsKLQkJRklMRSAqZnA7Ci0JCXNwcmludGYoYnVmZmVyLCAiJXNcXFJlbW92ZSVzLmV4ZSIsIGRpciwgbWV0YV9uYW1lKTsKLQkJZnAgPSBmb3BlbihidWZmZXIsICJ3YiIpOwotCQlmd3JpdGUoYXJjX2RhdGEsIGV4ZV9zaXplLCAxLCBmcCk7Ci0JCWZjbG9zZShmcCk7CisgICAgeworICAgICAgICBGSUxFICpmcDsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICIlc1xcUmVtb3ZlJXMuZXhlIiwgZGlyLCBtZXRhX25hbWUpOworICAgICAgICBmcCA9IGZvcGVuKGJ1ZmZlciwgIndiIik7CisgICAgICAgIGZ3cml0ZShhcmNfZGF0YSwgZXhlX3NpemUsIDEsIGZwKTsKKyAgICAgICAgZmNsb3NlKGZwKTsKIAotCQlzcHJpbnRmKGJ1ZmZlciwgIlwiJXNcXFJlbW92ZSVzLmV4ZVwiIC11IFwiJXNcXCVzLXdpbmluc3QubG9nXCIiLAotCQkJZGlyLCBtZXRhX25hbWUsIGRpciwgbWV0YV9uYW1lKTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICJcIiVzXFxSZW1vdmUlcy5leGVcIiAtdSBcIiVzXFwlcy13aW5pbnN0LmxvZ1wiIiwKKyAgICAgICAgICAgIGRpciwgbWV0YV9uYW1lLCBkaXIsIG1ldGFfbmFtZSk7CiAKLQkJcmVzdWx0ID0gUmVnU2V0VmFsdWVFeChoU3Via2V5LCAiVW5pbnN0YWxsU3RyaW5nIiwKLQkJCQkgICAgICAgMCwKLQkJCQkgICAgICAgUkVHX1NaLAotCQkJCSAgICAgICBidWZmZXIsCi0JCQkJICAgICAgIHN0cmxlbihidWZmZXIpKzEpOwotCQotCQlpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCi0JCQlNZXNzYWdlQm94KEdldEZvY3VzKCksIGJ1ZmZlciwgIkNvdWxkIG5vdCBzZXQga2V5IHZhbHVlIiwgTUJfT0spOworICAgICAgICByZXN1bHQgPSBSZWdTZXRWYWx1ZUV4KGhTdWJrZXksICJVbmluc3RhbGxTdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX1NaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYnVmZmVyKSsxKTsKIAotCQlmcHJpbnRmKGxvZ2ZpbGUsICIwNDAgUmVnIERCIFZhbHVlOiBbJXNcXCVzXSVzPSVzXG4iLAotCQkJS2V5TmFtZSwgc3Via2V5X25hbWUsICJVbmluc3RhbGxTdHJpbmciLCBidWZmZXIpOwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBidWZmZXIsICJDb3VsZCBub3Qgc2V0IGtleSB2YWx1ZSIsIE1CX09LKTsKKworICAgICAgICBmcHJpbnRmKGxvZ2ZpbGUsICIwNDAgUmVnIERCIFZhbHVlOiBbJXNcXCVzXSVzPSVzXG4iLAorICAgICAgICAgICAgS2V5TmFtZSwgc3Via2V5X25hbWUsICJVbmluc3RhbGxTdHJpbmciLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKIH0KIAogc3RhdGljIHZvaWQgQ2xvc2VMb2dmaWxlKHZvaWQpCiB7Ci0JY2hhciBidWZmZXJbX01BWF9QQVRIKzFdOwotCXRpbWVfdCBsdGltZTsKLQlzdHJ1Y3QgdG0gKm5vdzsKKyAgICBjaGFyIGJ1ZmZlcltfTUFYX1BBVEgrMV07CisgICAgdGltZV90IGx0aW1lOworICAgIHN0cnVjdCB0bSAqbm93OwogCi0JdGltZSgmbHRpbWUpOwotCW5vdyA9IGxvY2FsdGltZSgmbHRpbWUpOwotCXN0cmZ0aW1lKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCSAiKioqIEluc3RhbGxhdGlvbiBmaW5pc2hlZCAlWS8lbS8lZCAlSDolTSAqKipcbiIsCi0JCSBsb2NhbHRpbWUoJmx0aW1lKSk7Ci0JZnByaW50Zihsb2dmaWxlLCBidWZmZXIpOwotCWlmIChsb2dmaWxlKQotCQlmY2xvc2UobG9nZmlsZSk7CisgICAgdGltZSgmbHRpbWUpOworICAgIG5vdyA9IGxvY2FsdGltZSgmbHRpbWUpOworICAgIHN0cmZ0aW1lKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgIioqKiBJbnN0YWxsYXRpb24gZmluaXNoZWQgJVkvJW0vJWQgJUg6JU0gKioqXG4iLAorICAgICAgICAgICAgIGxvY2FsdGltZSgmbHRpbWUpKTsKKyAgICBmcHJpbnRmKGxvZ2ZpbGUsIGJ1ZmZlcik7CisgICAgaWYgKGxvZ2ZpbGUpCisgICAgICAgIGZjbG9zZShsb2dmaWxlKTsKIH0KIAogQk9PTCBDQUxMQkFDSwogSW5zdGFsbEZpbGVzRGxnUHJvYyhIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCUxQTk1IRFIgbHBubTsKLQljaGFyIEJ1ZmZlcls0MDk2XTsKLQlTQ0hFTUUgKnNjaGVtZTsKKyAgICBMUE5NSERSIGxwbm07CisgICAgY2hhciBCdWZmZXJbNDA5Nl07CisgICAgU0NIRU1FICpzY2hlbWU7CiAKLQlzd2l0Y2ggKG1zZykgewotCWNhc2UgV01fSU5JVERJQUxPRzoKLQkJaWYgKGhCaXRtYXApCi0JCQlTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX0JJVE1BUCwgU1RNX1NFVElNQUdFLAotCQkJCQkgICBJTUFHRV9CSVRNQVAsIChMUEFSQU0paEJpdG1hcCk7Ci0JCXdzcHJpbnRmKEJ1ZmZlciwKLQkJCSAgIkNsaWNrIE5leHQgdG8gYmVnaW4gdGhlIGluc3RhbGxhdGlvbiBvZiAlcy4gIgotCQkJICAiSWYgeW91IHdhbnQgdG8gcmV2aWV3IG9yIGNoYW5nZSBhbnkgb2YgeW91ciAiCi0JCQkgICIgaW5zdGFsbGF0aW9uIHNldHRpbmdzLCBjbGljayBCYWNrLiAiCi0JCQkgICJDbGljayBDYW5jZWwgdG8gZXhpdCB0aGUgd2l6YXJkLiIsCi0JCQkgIG1ldGFfbmFtZSk7Ci0JCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwgQnVmZmVyKTsKLQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lORk8sICJSZWFkeSB0byBpbnN0YWxsIik7Ci0JCWJyZWFrOworICAgIHN3aXRjaCAobXNnKSB7CisgICAgY2FzZSBXTV9JTklURElBTE9HOgorICAgICAgICBpZiAoaEJpdG1hcCkKKyAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfQklUTUFQLCBTVE1fU0VUSU1BR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1BR0VfQklUTUFQLCAoTFBBUkFNKWhCaXRtYXApOworICAgICAgICB3c3ByaW50ZihCdWZmZXIsCisgICAgICAgICAgICAgICAgICAiQ2xpY2sgTmV4dCB0byBiZWdpbiB0aGUgaW5zdGFsbGF0aW9uIG9mICVzLiAiCisgICAgICAgICAgICAgICAgICAiSWYgeW91IHdhbnQgdG8gcmV2aWV3IG9yIGNoYW5nZSBhbnkgb2YgeW91ciAiCisgICAgICAgICAgICAgICAgICAiIGluc3RhbGxhdGlvbiBzZXR0aW5ncywgY2xpY2sgQmFjay4gIgorICAgICAgICAgICAgICAgICAgIkNsaWNrIENhbmNlbCB0byBleGl0IHRoZSB3aXphcmQuIiwKKyAgICAgICAgICAgICAgICAgIG1ldGFfbmFtZSk7CisgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwgQnVmZmVyKTsKKyAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lORk8sICJSZWFkeSB0byBpbnN0YWxsIik7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBXTV9OVU1GSUxFUzoKLQkJU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19QUk9HUkVTUywgUEJNX1NFVFJBTkdFLCAwLCBsUGFyYW0pOwotCQlQdW1wTWVzc2FnZXMoKTsKLQkJcmV0dXJuIFRSVUU7CisgICAgY2FzZSBXTV9OVU1GSUxFUzoKKyAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19QUk9HUkVTUywgUEJNX1NFVFJBTkdFLCAwLCBsUGFyYW0pOworICAgICAgICBQdW1wTWVzc2FnZXMoKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAKLQljYXNlIFdNX05FWFRGSUxFOgotCQlTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1BST0dSRVNTLCBQQk1fU0VUUE9TLCB3UGFyYW0sCi0JCQkJICAgIDApOwotCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5GTywgKExQU1RSKWxQYXJhbSk7Ci0JCVB1bXBNZXNzYWdlcygpOwotCQlyZXR1cm4gVFJVRTsKKyAgICBjYXNlIFdNX05FWFRGSUxFOgorICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1BST0dSRVNTLCBQQk1fU0VUUE9TLCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTkZPLCAoTFBTVFIpbFBhcmFtKTsKKyAgICAgICAgUHVtcE1lc3NhZ2VzKCk7CisgICAgICAgIHJldHVybiBUUlVFOwogCi0JY2FzZSBXTV9OT1RJRlk6Ci0JCWxwbm0gPSAoTFBOTUhEUikgbFBhcmFtOworICAgIGNhc2UgV01fTk9USUZZOgorICAgICAgICBscG5tID0gKExQTk1IRFIpIGxQYXJhbTsKIAotCQlzd2l0Y2ggKGxwbm0tPmNvZGUpIHsKLQkJY2FzZSBQU05fU0VUQUNUSVZFOgotCQkJUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAotCQkJCQkJUFNXSVpCX0JBQ0sgfCBQU1dJWkJfTkVYVCk7Ci0JCQlicmVhazsKKyAgICAgICAgc3dpdGNoIChscG5tLT5jb2RlKSB7CisgICAgICAgIGNhc2UgUFNOX1NFVEFDVElWRToKKyAgICAgICAgICAgIFByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTV0laQl9CQUNLIHwgUFNXSVpCX05FWFQpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQU05fV0laRklOSVNIOgotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUFNOX1dJWkZJTklTSDoKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFNOX1dJWk5FWFQ6Ci0JCQkvKiBIYW5kbGUgYSBOZXh0IGJ1dHRvbiBjbGljayBoZXJlICovCi0JCQloRGlhbG9nID0gaHduZDsKLQkJCXN1Y2Nlc3MgPSBUUlVFOworICAgICAgICBjYXNlIFBTTl9XSVpORVhUOgorICAgICAgICAgICAgLyogSGFuZGxlIGEgTmV4dCBidXR0b24gY2xpY2sgaGVyZSAqLworICAgICAgICAgICAgaERpYWxvZyA9IGh3bmQ7CisgICAgICAgICAgICBzdWNjZXNzID0gVFJVRTsKIAotCQkJLyogRGlzYWJsZSB0aGUgYnV0dG9ucyB3aGlsZSB3ZSB3b3JrLiAgU2VuZGluZyBDQU5DRUxUT0NMT1NFIGhhcwotCQkJICB0aGUgZWZmZWN0IG9mIGRpc2FibGluZyB0aGUgY2FuY2VsIGJ1dHRvbiwgd2hpY2ggaXMgYSkgYXMgd2UKLQkJCSAgZG8gZXZlcnl0aGluZyBzeW5jaHJvbm91c2x5IHdlIGNhbid0IGNhbmNlbCwgYW5kIGIpIHRoZSBuZXh0Ci0JCQkgIHN0ZXAgaXMgJ2ZpbmlzaGVkJywgd2hlbiBpdCBpcyB0b28gbGF0ZSB0byBjYW5jZWwgYW55d2F5LgotCQkJICBUaGUgbmV4dCBzdGVwIGJlaW5nICdGaW5pc2hlZCcgbWVhbnMgd2UgYWxzbyBkb24ndCBuZWVkIHRvCi0JCQkgIHJlc3RvcmUgdGhlIGJ1dHRvbiBzdGF0ZSBiYWNrICovCi0JCQlQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksIDApOwotCQkJU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGh3bmQpLCBQU01fQ0FOQ0VMVE9DTE9TRSwgMCwgMCk7Ci0JCQkvKiBNYWtlIHN1cmUgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgbmFtZSBlbmRzIGluIGEgKi8KLQkJCS8qIGJhY2tzbGFzaCAqLwotCQkJaWYgKHB5dGhvbl9kaXJbc3RybGVuKHB5dGhvbl9kaXIpLTFdICE9ICdcXCcpCi0JCQkJc3RyY2F0KHB5dGhvbl9kaXIsICJcXCIpOwotCQkJLyogU3RyaXAgdGhlIHRyYWlsaW5nIGJhY2tzbGFzaCBhZ2FpbiAqLwotCQkJcHl0aG9uX2RpcltzdHJsZW4ocHl0aG9uX2RpciktMV0gPSAnXDAnOwotICAgICAgICAgICAgCi0JCQlDaGVja1Jvb3RLZXkoaHduZCk7Ci0JICAgIAotCQkJaWYgKCFPcGVuTG9nZmlsZShweXRob25fZGlyKSkKLQkJCQlicmVhazsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIGJ1dHRvbnMgd2hpbGUgd2Ugd29yay4gIFNlbmRpbmcgQ0FOQ0VMVE9DTE9TRSBoYXMKKyAgICAgICAgICAgICAgdGhlIGVmZmVjdCBvZiBkaXNhYmxpbmcgdGhlIGNhbmNlbCBidXR0b24sIHdoaWNoIGlzIGEpIGFzIHdlCisgICAgICAgICAgICAgIGRvIGV2ZXJ5dGhpbmcgc3luY2hyb25vdXNseSB3ZSBjYW4ndCBjYW5jZWwsIGFuZCBiKSB0aGUgbmV4dAorICAgICAgICAgICAgICBzdGVwIGlzICdmaW5pc2hlZCcsIHdoZW4gaXQgaXMgdG9vIGxhdGUgdG8gY2FuY2VsIGFueXdheS4KKyAgICAgICAgICAgICAgVGhlIG5leHQgc3RlcCBiZWluZyAnRmluaXNoZWQnIG1lYW5zIHdlIGFsc28gZG9uJ3QgbmVlZCB0bworICAgICAgICAgICAgICByZXN0b3JlIHRoZSBidXR0b24gc3RhdGUgYmFjayAqLworICAgICAgICAgICAgUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLCAwKTsKKyAgICAgICAgICAgIFNlbmRNZXNzYWdlKEdldFBhcmVudChod25kKSwgUFNNX0NBTkNFTFRPQ0xPU0UsIDAsIDApOworICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG5hbWUgZW5kcyBpbiBhICovCisgICAgICAgICAgICAvKiBiYWNrc2xhc2ggKi8KKyAgICAgICAgICAgIGlmIChweXRob25fZGlyW3N0cmxlbihweXRob25fZGlyKS0xXSAhPSAnXFwnKQorICAgICAgICAgICAgICAgIHN0cmNhdChweXRob25fZGlyLCAiXFwiKTsKKyAgICAgICAgICAgIC8qIFN0cmlwIHRoZSB0cmFpbGluZyBiYWNrc2xhc2ggYWdhaW4gKi8KKyAgICAgICAgICAgIHB5dGhvbl9kaXJbc3RybGVuKHB5dGhvbl9kaXIpLTFdID0gJ1wwJzsKKworICAgICAgICAgICAgQ2hlY2tSb290S2V5KGh3bmQpOworCisgICAgICAgICAgICBpZiAoIU9wZW5Mb2dmaWxlKHB5dGhvbl9kaXIpKQorICAgICAgICAgICAgICAgIGJyZWFrOwogCiAvKgogICogVGhlIHNjaGVtZSB3ZSBoYXZlIHRvIHVzZSBkZXBlbmRzIG9uIHRoZSBQeXRob24gdmVyc2lvbi4uLgpAQCAtMTkxNSwyMDIgKzE5MTUsMjAyIEBACiAgJ2RhdGEnICAgOiAnJGJhc2UnLAogIH0KICovCi0JCQlzY2hlbWUgPSBHZXRTY2hlbWUocHlfbWFqb3IsIHB5X21pbm9yKTsKLQkJCS8qIFJ1biB0aGUgcHJlLWluc3RhbGwgc2NyaXB0LiAqLwotCQkJaWYgKHByZV9pbnN0YWxsX3NjcmlwdCAmJiAqcHJlX2luc3RhbGxfc2NyaXB0KSB7Ci0JCQkJU2V0RGxnSXRlbVRleHQgKGh3bmQsIElEQ19USVRMRSwKLQkJCQkJCSJSdW5uaW5nIHByZS1pbnN0YWxsYXRpb24gc2NyaXB0Iik7Ci0JCQkJcnVuX3NpbXBsZV9zY3JpcHQocHJlX2luc3RhbGxfc2NyaXB0KTsKLQkJCX0KLQkJCWlmICghc3VjY2VzcykgewotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogRXh0cmFjdCBhbGwgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSAqLwotCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLCAiSW5zdGFsbGluZyBmaWxlcy4uLiIpOwotCQkJaWYgKCF1bnppcF9hcmNoaXZlIChzY2hlbWUsCi0JCQkJCSAgICBweXRob25fZGlyLCBhcmNfZGF0YSwKLQkJCQkJICAgIGFyY19zaXplLCBub3RpZnkpKQotCQkJCXNldF9mYWlsdXJlX3JlYXNvbigiRmFpbGVkIHRvIHVuemlwIGluc3RhbGxhdGlvbiBmaWxlcyIpOwotCQkJLyogQ29tcGlsZSB0aGUgcHktZmlsZXMgKi8KLQkJCWlmIChzdWNjZXNzICYmIHB5Y19jb21waWxlKSB7Ci0JCQkJaW50IGVycm9yczsKLQkJCQlISU5TVEFOQ0UgaFB5dGhvbjsKLQkJCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsCi0JCQkJCQkiQ29tcGlsaW5nIGZpbGVzIHRvIC5weWMuLi4iKTsKKyAgICAgICAgICAgIHNjaGVtZSA9IEdldFNjaGVtZShweV9tYWpvciwgcHlfbWlub3IpOworICAgICAgICAgICAgLyogUnVuIHRoZSBwcmUtaW5zdGFsbCBzY3JpcHQuICovCisgICAgICAgICAgICBpZiAocHJlX2luc3RhbGxfc2NyaXB0ICYmICpwcmVfaW5zdGFsbF9zY3JpcHQpIHsKKyAgICAgICAgICAgICAgICBTZXREbGdJdGVtVGV4dCAoaHduZCwgSURDX1RJVExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVubmluZyBwcmUtaW5zdGFsbGF0aW9uIHNjcmlwdCIpOworICAgICAgICAgICAgICAgIHJ1bl9zaW1wbGVfc2NyaXB0KHByZV9pbnN0YWxsX3NjcmlwdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEV4dHJhY3QgYWxsIGZpbGVzIGZyb20gdGhlIGFyY2hpdmUgKi8KKyAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwgIkluc3RhbGxpbmcgZmlsZXMuLi4iKTsKKyAgICAgICAgICAgIGlmICghdW56aXBfYXJjaGl2ZSAoc2NoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweXRob25fZGlyLCBhcmNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjX3NpemUsIG5vdGlmeSkpCisgICAgICAgICAgICAgICAgc2V0X2ZhaWx1cmVfcmVhc29uKCJGYWlsZWQgdG8gdW56aXAgaW5zdGFsbGF0aW9uIGZpbGVzIik7CisgICAgICAgICAgICAvKiBDb21waWxlIHRoZSBweS1maWxlcyAqLworICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgcHljX2NvbXBpbGUpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyb3JzOworICAgICAgICAgICAgICAgIEhJTlNUQU5DRSBoUHl0aG9uOworICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBpbGluZyBmaWxlcyB0byAucHljLi4uIik7CiAKLQkJCQlTZXREbGdJdGVtVGV4dChoRGlhbG9nLCBJRENfSU5GTywgIkxvYWRpbmcgcHl0aG9uLi4uIik7Ci0JCQkJaFB5dGhvbiA9IExvYWRQeXRob25EbGwocHl0aG9uZGxsKTsKLQkJCQlpZiAoaFB5dGhvbikgewotCQkJCQllcnJvcnMgPSBjb21waWxlX2ZpbGVsaXN0KGhQeXRob24sIEZBTFNFKTsKLQkJCQkJRnJlZUxpYnJhcnkoaFB5dGhvbik7Ci0JCQkJfQotCQkJCS8qIENvbXBpbGF0aW9uIGVycm9ycyBhcmUgaW50ZW50aW9uYWxseSBpZ25vcmVkOgotCQkJCSAqIFB5dGhvbjIuMCBjb250YWlucyBhIGJ1ZyB3aGljaCB3aWxsIHJlc3VsdAotCQkJCSAqIGluIHN5cy5wYXRoIGNvbnRhaW5pbmcgZ2FyYmFnZSB1bmRlciBjZXJ0YWluCi0JCQkJICogY2lyY3Vtc3RhbmNlcywgYW5kIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBvbmx5Ci0JCQkJICogY29uZnVzZSB0aGUgdXNlci4KLQkJCQkgKi8KLQkJCX0KLQkJCWlmIChzdWNjZXNzICYmIHB5b19jb21waWxlKSB7Ci0JCQkJaW50IGVycm9yczsKLQkJCQlISU5TVEFOQ0UgaFB5dGhvbjsKLQkJCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsCi0JCQkJCQkiQ29tcGlsaW5nIGZpbGVzIHRvIC5weW8uLi4iKTsKKyAgICAgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChoRGlhbG9nLCBJRENfSU5GTywgIkxvYWRpbmcgcHl0aG9uLi4uIik7CisgICAgICAgICAgICAgICAgaFB5dGhvbiA9IExvYWRQeXRob25EbGwocHl0aG9uZGxsKTsKKyAgICAgICAgICAgICAgICBpZiAoaFB5dGhvbikgeworICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBjb21waWxlX2ZpbGVsaXN0KGhQeXRob24sIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgRnJlZUxpYnJhcnkoaFB5dGhvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIENvbXBpbGF0aW9uIGVycm9ycyBhcmUgaW50ZW50aW9uYWxseSBpZ25vcmVkOgorICAgICAgICAgICAgICAgICAqIFB5dGhvbjIuMCBjb250YWlucyBhIGJ1ZyB3aGljaCB3aWxsIHJlc3VsdAorICAgICAgICAgICAgICAgICAqIGluIHN5cy5wYXRoIGNvbnRhaW5pbmcgZ2FyYmFnZSB1bmRlciBjZXJ0YWluCisgICAgICAgICAgICAgICAgICogY2lyY3Vtc3RhbmNlcywgYW5kIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBvbmx5CisgICAgICAgICAgICAgICAgICogY29uZnVzZSB0aGUgdXNlci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdWNjZXNzICYmIHB5b19jb21waWxlKSB7CisgICAgICAgICAgICAgICAgaW50IGVycm9yczsKKyAgICAgICAgICAgICAgICBISU5TVEFOQ0UgaFB5dGhvbjsKKyAgICAgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21waWxpbmcgZmlsZXMgdG8gLnB5by4uLiIpOwogCi0JCQkJU2V0RGxnSXRlbVRleHQoaERpYWxvZywgSURDX0lORk8sICJMb2FkaW5nIHB5dGhvbi4uLiIpOwotCQkJCWhQeXRob24gPSBMb2FkUHl0aG9uRGxsKHB5dGhvbmRsbCk7Ci0JCQkJaWYgKGhQeXRob24pIHsKLQkJCQkJZXJyb3JzID0gY29tcGlsZV9maWxlbGlzdChoUHl0aG9uLCBUUlVFKTsKLQkJCQkJRnJlZUxpYnJhcnkoaFB5dGhvbik7Ci0JCQkJfQotCQkJCS8qIEVycm9ycyBpZ25vcmVkOiBzZWUgYWJvdmUgKi8KLQkJCX0KKyAgICAgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChoRGlhbG9nLCBJRENfSU5GTywgIkxvYWRpbmcgcHl0aG9uLi4uIik7CisgICAgICAgICAgICAgICAgaFB5dGhvbiA9IExvYWRQeXRob25EbGwocHl0aG9uZGxsKTsKKyAgICAgICAgICAgICAgICBpZiAoaFB5dGhvbikgeworICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBjb21waWxlX2ZpbGVsaXN0KGhQeXRob24sIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBGcmVlTGlicmFyeShoUHl0aG9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRXJyb3JzIGlnbm9yZWQ6IHNlZSBhYm92ZSAqLworICAgICAgICAgICAgfQogCiAKLQkJCWJyZWFrOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQU05fUkVTRVQ6Ci0JCQlicmVhazsKLQkJCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBQU05fUkVTRVQ6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIAogQk9PTCBDQUxMQkFDSwogRmluaXNoZWREbGdQcm9jKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JTFBOTUhEUiBscG5tOworICAgIExQTk1IRFIgbHBubTsKIAotCXN3aXRjaCAobXNnKSB7Ci0JY2FzZSBXTV9JTklURElBTE9HOgotCQlpZiAoaEJpdG1hcCkKLQkJCVNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfQklUTUFQLCBTVE1fU0VUSU1BR0UsCi0JCQkJCSAgIElNQUdFX0JJVE1BUCwgKExQQVJBTSloQml0bWFwKTsKLQkJaWYgKCFzdWNjZXNzKQotCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lORk8sIGdldF9mYWlsdXJlX3JlYXNvbigpKTsKKyAgICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgV01fSU5JVERJQUxPRzoKKyAgICAgICAgaWYgKGhCaXRtYXApCisgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX0JJVE1BUCwgU1RNX1NFVElNQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX0JJVE1BUCwgKExQQVJBTSloQml0bWFwKTsKKyAgICAgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lORk8sIGdldF9mYWlsdXJlX3JlYXNvbigpKTsKIAotCQkvKiBhc3luYyBkZWxheTogd2lsbCBzaG93IHRoZSBkaWFsb2cgYm94IGNvbXBsZXRlbHkgYmVmb3JlCi0JCSAgIHRoZSBpbnN0YWxsX3NjcmlwdCBpcyBzdGFydGVkICovCi0JCVBvc3RNZXNzYWdlKGh3bmQsIFdNX1VTRVIsIDAsIDBMKTsKLQkJcmV0dXJuIFRSVUU7CisgICAgICAgIC8qIGFzeW5jIGRlbGF5OiB3aWxsIHNob3cgdGhlIGRpYWxvZyBib3ggY29tcGxldGVseSBiZWZvcmUKKyAgICAgICAgICAgdGhlIGluc3RhbGxfc2NyaXB0IGlzIHN0YXJ0ZWQgKi8KKyAgICAgICAgUG9zdE1lc3NhZ2UoaHduZCwgV01fVVNFUiwgMCwgMEwpOworICAgICAgICByZXR1cm4gVFJVRTsKIAotCWNhc2UgV01fVVNFUjoKKyAgICBjYXNlIFdNX1VTRVI6CiAKLQkJaWYgKHN1Y2Nlc3MgJiYgaW5zdGFsbF9zY3JpcHQgJiYgaW5zdGFsbF9zY3JpcHRbMF0pIHsKLQkJCWNoYXIgZm5hbWVbTUFYX1BBVEhdOwotCQkJY2hhciAqYnVmZmVyOwotCQkJSENVUlNPUiBoQ3Vyc29yOwotCQkJaW50IHJlc3VsdDsKKyAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgaW5zdGFsbF9zY3JpcHQgJiYgaW5zdGFsbF9zY3JpcHRbMF0pIHsKKyAgICAgICAgICAgIGNoYXIgZm5hbWVbTUFYX1BBVEhdOworICAgICAgICAgICAgY2hhciAqYnVmZmVyOworICAgICAgICAgICAgSENVUlNPUiBoQ3Vyc29yOworICAgICAgICAgICAgaW50IHJlc3VsdDsKIAotCQkJY2hhciAqYXJndlszXSA9IHtOVUxMLCAiLWluc3RhbGwiLCBOVUxMfTsKKyAgICAgICAgICAgIGNoYXIgKmFyZ3ZbM10gPSB7TlVMTCwgIi1pbnN0YWxsIiwgTlVMTH07CiAKLQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwKLQkJCQkJIlBsZWFzZSB3YWl0IHdoaWxlIHJ1bm5pbmcgcG9zdGluc3RhbGwgc2NyaXB0Li4uIik7Ci0JCQlzdHJjcHkoZm5hbWUsIHB5dGhvbl9kaXIpOwotCQkJc3RyY2F0KGZuYW1lLCAiXFxTY3JpcHRzXFwiKTsKLQkJCXN0cmNhdChmbmFtZSwgaW5zdGFsbF9zY3JpcHQpOworICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2Ugd2FpdCB3aGlsZSBydW5uaW5nIHBvc3RpbnN0YWxsIHNjcmlwdC4uLiIpOworICAgICAgICAgICAgc3RyY3B5KGZuYW1lLCBweXRob25fZGlyKTsKKyAgICAgICAgICAgIHN0cmNhdChmbmFtZSwgIlxcU2NyaXB0c1xcIik7CisgICAgICAgICAgICBzdHJjYXQoZm5hbWUsIGluc3RhbGxfc2NyaXB0KTsKIAotCQkJaWYgKGxvZ2ZpbGUpCi0JCQkJZnByaW50Zihsb2dmaWxlLCAiMzAwIFJ1biBTY3JpcHQ6IFslc10lc1xuIiwgcHl0aG9uZGxsLCBmbmFtZSk7CisgICAgICAgICAgICBpZiAobG9nZmlsZSkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGxvZ2ZpbGUsICIzMDAgUnVuIFNjcmlwdDogWyVzXSVzXG4iLCBweXRob25kbGwsIGZuYW1lKTsKIAotCQkJaEN1cnNvciA9IFNldEN1cnNvcihMb2FkQ3Vyc29yKE5VTEwsIElEQ19XQUlUKSk7CisgICAgICAgICAgICBoQ3Vyc29yID0gU2V0Q3Vyc29yKExvYWRDdXJzb3IoTlVMTCwgSURDX1dBSVQpKTsKIAotCQkJYXJndlswXSA9IGZuYW1lOworICAgICAgICAgICAgYXJndlswXSA9IGZuYW1lOwogCi0JCQlyZXN1bHQgPSBydW5faW5zdGFsbHNjcmlwdChmbmFtZSwgMiwgYXJndiwgJmJ1ZmZlcik7Ci0JCQlpZiAoMCAhPSByZXN1bHQpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIioqKiBydW5faW5zdGFsbHNjcmlwdDogaW50ZXJuYWwgZXJyb3IgMHglWCAqKipcbiIsIHJlc3VsdCk7Ci0JCQl9Ci0JCQlpZiAoYnVmZmVyKQotCQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTkZPLCBidWZmZXIpOwotCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLAotCQkJCQkiUG9zdGluc3RhbGwgc2NyaXB0IGZpbmlzaGVkLlxuIgotCQkJCQkiQ2xpY2sgdGhlIEZpbmlzaCBidXR0b24gdG8gZXhpdCB0aGUgU2V0dXAgd2l6YXJkLiIpOworICAgICAgICAgICAgcmVzdWx0ID0gcnVuX2luc3RhbGxzY3JpcHQoZm5hbWUsIDIsIGFyZ3YsICZidWZmZXIpOworICAgICAgICAgICAgaWYgKDAgIT0gcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIqKiogcnVuX2luc3RhbGxzY3JpcHQ6IGludGVybmFsIGVycm9yIDB4JVggKioqXG4iLCByZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5GTywgYnVmZmVyKTsKKyAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9zdGluc3RhbGwgc2NyaXB0IGZpbmlzaGVkLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGljayB0aGUgRmluaXNoIGJ1dHRvbiB0byBleGl0IHRoZSBTZXR1cCB3aXphcmQuIik7CiAKLQkJCWZyZWUoYnVmZmVyKTsKLQkJCVNldEN1cnNvcihoQ3Vyc29yKTsKLQkJCUNsb3NlTG9nZmlsZSgpOwotCQl9CisgICAgICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgICAgICAgICBTZXRDdXJzb3IoaEN1cnNvcik7CisgICAgICAgICAgICBDbG9zZUxvZ2ZpbGUoKTsKKyAgICAgICAgfQogCi0JCXJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gVFJVRTsKIAotCWNhc2UgV01fTk9USUZZOgotCQlscG5tID0gKExQTk1IRFIpIGxQYXJhbTsKKyAgICBjYXNlIFdNX05PVElGWToKKyAgICAgICAgbHBubSA9IChMUE5NSERSKSBsUGFyYW07CiAKLQkJc3dpdGNoIChscG5tLT5jb2RlKSB7Ci0JCWNhc2UgUFNOX1NFVEFDVElWRTogLyogRW5hYmxlIHRoZSBGaW5pc2ggYnV0dG9uICovCi0JCQlQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksIFBTV0laQl9GSU5JU0gpOwotCQkJYnJlYWs7CisgICAgICAgIHN3aXRjaCAobHBubS0+Y29kZSkgeworICAgICAgICBjYXNlIFBTTl9TRVRBQ1RJVkU6IC8qIEVuYWJsZSB0aGUgRmluaXNoIGJ1dHRvbiAqLworICAgICAgICAgICAgUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLCBQU1dJWkJfRklOSVNIKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFNOX1dJWk5FWFQ6Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBQU05fV0laTkVYVDoKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFNOX1dJWkZJTklTSDoKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFBTTl9XSVpGSU5JU0g6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBTTl9SRVNFVDoKLQkJCWJyZWFrOwotCQkKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAwOworICAgICAgICBjYXNlIFBTTl9SRVNFVDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogdm9pZCBSdW5XaXphcmQoSFdORCBod25kKQogewotCVBST1BTSEVFVFBBR0UgICBwc3AgPSAgICAgICB7MH07Ci0JSFBST1BTSEVFVFBBR0UgIGFocHNwWzRdID0gIHswfTsKLQlQUk9QU0hFRVRIRUFERVIgcHNoID0gICAgICAgezB9OworICAgIFBST1BTSEVFVFBBR0UgICBwc3AgPSAgICAgICB7MH07CisgICAgSFBST1BTSEVFVFBBR0UgIGFocHNwWzRdID0gIHswfTsKKyAgICBQUk9QU0hFRVRIRUFERVIgcHNoID0gICAgICAgezB9OwogCi0JLyogRGlzcGxheSBtb2R1bGUgaW5mb3JtYXRpb24gKi8KLQlwc3AuZHdTaXplID0gICAgICAgIHNpemVvZihwc3ApOwotCXBzcC5kd0ZsYWdzID0gICAgICAgUFNQX0RFRkFVTFR8UFNQX0hJREVIRUFERVI7Ci0JcHNwLmhJbnN0YW5jZSA9ICAgICBHZXRNb2R1bGVIYW5kbGUgKE5VTEwpOwotCXBzcC5sUGFyYW0gPSAgICAgICAgMDsKLQlwc3AucGZuRGxnUHJvYyA9ICAgIEludHJvRGxnUHJvYzsKLQlwc3AucHN6VGVtcGxhdGUgPSAgIE1BS0VJTlRSRVNPVVJDRShJRERfSU5UUk8pOworICAgIC8qIERpc3BsYXkgbW9kdWxlIGluZm9ybWF0aW9uICovCisgICAgcHNwLmR3U2l6ZSA9ICAgICAgICBzaXplb2YocHNwKTsKKyAgICBwc3AuZHdGbGFncyA9ICAgICAgIFBTUF9ERUZBVUxUfFBTUF9ISURFSEVBREVSOworICAgIHBzcC5oSW5zdGFuY2UgPSAgICAgR2V0TW9kdWxlSGFuZGxlIChOVUxMKTsKKyAgICBwc3AubFBhcmFtID0gICAgICAgIDA7CisgICAgcHNwLnBmbkRsZ1Byb2MgPSAgICBJbnRyb0RsZ1Byb2M7CisgICAgcHNwLnBzelRlbXBsYXRlID0gICBNQUtFSU5UUkVTT1VSQ0UoSUREX0lOVFJPKTsKIAotCWFocHNwWzBdID0gICAgICAgICAgQ3JlYXRlUHJvcGVydHlTaGVldFBhZ2UoJnBzcCk7CisgICAgYWhwc3BbMF0gPSAgICAgICAgICBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZSgmcHNwKTsKIAotCS8qIFNlbGVjdCBweXRob24gdmVyc2lvbiB0byB1c2UgKi8KLQlwc3AuZHdGbGFncyA9ICAgICAgIFBTUF9ERUZBVUxUfFBTUF9ISURFSEVBREVSOwotCXBzcC5wc3pUZW1wbGF0ZSA9ICAgICAgIE1BS0VJTlRSRVNPVVJDRShJRERfU0VMRUNUUFlUSE9OKTsKLQlwc3AucGZuRGxnUHJvYyA9ICAgICAgICBTZWxlY3RQeXRob25EbGdQcm9jOworICAgIC8qIFNlbGVjdCBweXRob24gdmVyc2lvbiB0byB1c2UgKi8KKyAgICBwc3AuZHdGbGFncyA9ICAgICAgIFBTUF9ERUZBVUxUfFBTUF9ISURFSEVBREVSOworICAgIHBzcC5wc3pUZW1wbGF0ZSA9ICAgICAgIE1BS0VJTlRSRVNPVVJDRShJRERfU0VMRUNUUFlUSE9OKTsKKyAgICBwc3AucGZuRGxnUHJvYyA9ICAgICAgICBTZWxlY3RQeXRob25EbGdQcm9jOwogCi0JYWhwc3BbMV0gPSAgICAgICAgICAgICAgQ3JlYXRlUHJvcGVydHlTaGVldFBhZ2UoJnBzcCk7CisgICAgYWhwc3BbMV0gPSAgICAgICAgICAgICAgQ3JlYXRlUHJvcGVydHlTaGVldFBhZ2UoJnBzcCk7CiAKLQkvKiBJbnN0YWxsIHRoZSBmaWxlcyAqLwotCXBzcC5kd0ZsYWdzID0JICAgIFBTUF9ERUZBVUxUfFBTUF9ISURFSEVBREVSOwotCXBzcC5wc3pUZW1wbGF0ZSA9ICAgICAgIE1BS0VJTlRSRVNPVVJDRShJRERfSU5TVEFMTEZJTEVTKTsKLQlwc3AucGZuRGxnUHJvYyA9ICAgICAgICBJbnN0YWxsRmlsZXNEbGdQcm9jOworICAgIC8qIEluc3RhbGwgdGhlIGZpbGVzICovCisgICAgcHNwLmR3RmxhZ3MgPSAgICAgICAgICAgUFNQX0RFRkFVTFR8UFNQX0hJREVIRUFERVI7CisgICAgcHNwLnBzelRlbXBsYXRlID0gICAgICAgTUFLRUlOVFJFU09VUkNFKElERF9JTlNUQUxMRklMRVMpOworICAgIHBzcC5wZm5EbGdQcm9jID0gICAgICAgIEluc3RhbGxGaWxlc0RsZ1Byb2M7CiAKLQlhaHBzcFsyXSA9ICAgICAgICAgICAgICBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZSgmcHNwKTsKKyAgICBhaHBzcFsyXSA9ICAgICAgICAgICAgICBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZSgmcHNwKTsKIAotCS8qIFNob3cgc3VjY2VzcyBvciBmYWlsdXJlICovCi0JcHNwLmR3RmxhZ3MgPSAgICAgICAgICAgUFNQX0RFRkFVTFR8UFNQX0hJREVIRUFERVI7Ci0JcHNwLnBzelRlbXBsYXRlID0gICAgICAgTUFLRUlOVFJFU09VUkNFKElERF9GSU5JU0hFRCk7Ci0JcHNwLnBmbkRsZ1Byb2MgPSAgICAgICAgRmluaXNoZWREbGdQcm9jOworICAgIC8qIFNob3cgc3VjY2VzcyBvciBmYWlsdXJlICovCisgICAgcHNwLmR3RmxhZ3MgPSAgICAgICAgICAgUFNQX0RFRkFVTFR8UFNQX0hJREVIRUFERVI7CisgICAgcHNwLnBzelRlbXBsYXRlID0gICAgICAgTUFLRUlOVFJFU09VUkNFKElERF9GSU5JU0hFRCk7CisgICAgcHNwLnBmbkRsZ1Byb2MgPSAgICAgICAgRmluaXNoZWREbGdQcm9jOwogCi0JYWhwc3BbM10gPSAgICAgICAgICAgICAgQ3JlYXRlUHJvcGVydHlTaGVldFBhZ2UoJnBzcCk7CisgICAgYWhwc3BbM10gPSAgICAgICAgICAgICAgQ3JlYXRlUHJvcGVydHlTaGVldFBhZ2UoJnBzcCk7CiAKLQkvKiBDcmVhdGUgdGhlIHByb3BlcnR5IHNoZWV0ICovCi0JcHNoLmR3U2l6ZSA9ICAgICAgICAgICAgc2l6ZW9mKHBzaCk7Ci0JcHNoLmhJbnN0YW5jZSA9ICAgICAgICAgR2V0TW9kdWxlSGFuZGxlKE5VTEwpOwotCXBzaC5od25kUGFyZW50ID0gICAgICAgIGh3bmQ7Ci0JcHNoLnBocGFnZSA9ICAgICAgICAgICAgYWhwc3A7Ci0JcHNoLmR3RmxhZ3MgPSAgICAgICAgICAgUFNIX1dJWkFSRC8qOTcqLy8qfFBTSF9XQVRFUk1BUkt8UFNIX0hFQURFUiovOwotCQlwc2gucHN6Ym1XYXRlcm1hcmsgPSAgICBOVUxMOwotCQlwc2gucHN6Ym1IZWFkZXIgPSAgICAgICBOVUxMOwotCQlwc2gublN0YXJ0UGFnZSA9ICAgICAgICAwOwotCQlwc2gublBhZ2VzID0gICAgICAgICAgICA0OworICAgIC8qIENyZWF0ZSB0aGUgcHJvcGVydHkgc2hlZXQgKi8KKyAgICBwc2guZHdTaXplID0gICAgICAgICAgICBzaXplb2YocHNoKTsKKyAgICBwc2guaEluc3RhbmNlID0gICAgICAgICBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7CisgICAgcHNoLmh3bmRQYXJlbnQgPSAgICAgICAgaHduZDsKKyAgICBwc2gucGhwYWdlID0gICAgICAgICAgICBhaHBzcDsKKyAgICBwc2guZHdGbGFncyA9ICAgICAgICAgICBQU0hfV0laQVJELyo5NyovLyp8UFNIX1dBVEVSTUFSS3xQU0hfSEVBREVSKi87CisgICAgICAgIHBzaC5wc3pibVdhdGVybWFyayA9ICAgIE5VTEw7CisgICAgICAgIHBzaC5wc3pibUhlYWRlciA9ICAgICAgIE5VTEw7CisgICAgICAgIHBzaC5uU3RhcnRQYWdlID0gICAgICAgIDA7CisgICAgICAgIHBzaC5uUGFnZXMgPSAgICAgICAgICAgIDQ7CiAKLQkJUHJvcGVydHlTaGVldCgmcHNoKTsKKyAgICAgICAgUHJvcGVydHlTaGVldCgmcHNoKTsKIH0KIAogLy8gc3VidGx5IGRpZmZlcmVudCBmcm9tIEhhc0xvY2FsTWFjaGluZVByaXZzKCksIGluIHRoYXQgYWZ0ZXIgZXhlY3V0aW5nCkBAIC0yMTE4LDE2ICsyMTE4LDE2IEBACiAvLyBzdWNoIGltcGxpY2F0aW9uIGZvciBIYXNMb2NhbE1hY2hpbmVQcml2cwogQk9PTCBNeUlzVXNlckFuQWRtaW4oKQogewotCXR5cGVkZWYgQk9PTCAoV0lOQVBJICpQRk5Jc1VzZXJBbkFkbWluKSgpOwotCXN0YXRpYyBQRk5Jc1VzZXJBbkFkbWluIHBmbklzVXNlckFuQWRtaW4gPSBOVUxMOwotCUhNT0RVTEUgc2hlbGwzMjsKLQkvLyBUaGlzIGZ1bmN0aW9uIGlzbid0IGd1YXJhbnRlZWQgdG8gYmUgYXZhaWxhYmxlIChhbmQgaXQgY2FuJ3QgaHVydCAKLQkvLyB0byBsZWF2ZSB0aGUgbGlicmFyeSBsb2FkZWQpCi0JaWYgKDAgPT0gKHNoZWxsMzI9TG9hZExpYnJhcnkoInNoZWxsMzIuZGxsIikpKQotCQlyZXR1cm4gRkFMU0U7Ci0JaWYgKDAgPT0gKHBmbklzVXNlckFuQWRtaW49KFBGTklzVXNlckFuQWRtaW4pR2V0UHJvY0FkZHJlc3Moc2hlbGwzMiwgIklzVXNlckFuQWRtaW4iKSkpCi0JCXJldHVybiBGQUxTRTsKLQlyZXR1cm4gKCpwZm5Jc1VzZXJBbkFkbWluKSgpOworICAgIHR5cGVkZWYgQk9PTCAoV0lOQVBJICpQRk5Jc1VzZXJBbkFkbWluKSgpOworICAgIHN0YXRpYyBQRk5Jc1VzZXJBbkFkbWluIHBmbklzVXNlckFuQWRtaW4gPSBOVUxMOworICAgIEhNT0RVTEUgc2hlbGwzMjsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzbid0IGd1YXJhbnRlZWQgdG8gYmUgYXZhaWxhYmxlIChhbmQgaXQgY2FuJ3QgaHVydAorICAgIC8vIHRvIGxlYXZlIHRoZSBsaWJyYXJ5IGxvYWRlZCkKKyAgICBpZiAoMCA9PSAoc2hlbGwzMj1Mb2FkTGlicmFyeSgic2hlbGwzMi5kbGwiKSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoMCA9PSAocGZuSXNVc2VyQW5BZG1pbj0oUEZOSXNVc2VyQW5BZG1pbilHZXRQcm9jQWRkcmVzcyhzaGVsbDMyLCAiSXNVc2VyQW5BZG1pbiIpKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiAoKnBmbklzVXNlckFuQWRtaW4pKCk7CiB9CiAKIC8vIFNvbWUgbWFnaWMgZm9yIFZpc3RhJ3MgVUFDLiAgSWYgdGhlcmUgaXMgYSB0YXJnZXRfdmVyc2lvbiwgYW5kCkBAIC0yMTM5LDM4ICsyMTM5LDM4IEBACiAvLyBSZXR1cm5zIFRSVUUgaWYgd2Ugc2hvdWxkIHNwYXduIGFuIGVsZXZhdGVkIGNoaWxkCiBCT09MIE5lZWRBdXRvVUFDKCkKIHsKLQlIS0VZIGhrOwotCWNoYXIga2V5X25hbWVbODBdOwotCS8vIG5vIFB5dGhvbiB2ZXJzaW9uIGluZm8gPT0gd2UgY2FuJ3Qga25vdyB5ZXQuCi0JaWYgKHRhcmdldF92ZXJzaW9uWzBdID09ICdcMCcpCi0JCXJldHVybiBGQUxTRTsKLQkvLyBzZWUgaG93IHB5dGhvbiBpcyBjdXJyZW50IGluc3RhbGxlZAotCXdzcHJpbnRmKGtleV9uYW1lLAotCQkJICJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwlc1xcSW5zdGFsbFBhdGgiLAotCQkJIHRhcmdldF92ZXJzaW9uKTsKLQlpZiAoRVJST1JfU1VDQ0VTUyAhPSBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X25hbWUsIDAsIEtFWV9SRUFELCAmaGspKQotCQlyZXR1cm4gRkFMU0U7Ci0JUmVnQ2xvc2VLZXkoaGspOwotCS8vIFB5dGhvbiBpcyBpbnN0YWxsZWQgaW4gSEtMTSAtIHdlIG11c3QgZWxldmF0ZS4KLQlyZXR1cm4gVFJVRTsKKyAgICBIS0VZIGhrOworICAgIGNoYXIga2V5X25hbWVbODBdOworICAgIC8vIG5vIFB5dGhvbiB2ZXJzaW9uIGluZm8gPT0gd2UgY2FuJ3Qga25vdyB5ZXQuCisgICAgaWYgKHRhcmdldF92ZXJzaW9uWzBdID09ICdcMCcpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvLyBzZWUgaG93IHB5dGhvbiBpcyBjdXJyZW50IGluc3RhbGxlZAorICAgIHdzcHJpbnRmKGtleV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCVzXFxJbnN0YWxsUGF0aCIsCisgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbik7CisgICAgaWYgKEVSUk9SX1NVQ0NFU1MgIT0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X25hbWUsIDAsIEtFWV9SRUFELCAmaGspKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgUmVnQ2xvc2VLZXkoaGspOworICAgIC8vIFB5dGhvbiBpcyBpbnN0YWxsZWQgaW4gSEtMTSAtIHdlIG11c3QgZWxldmF0ZS4KKyAgICByZXR1cm4gVFJVRTsKIH0KIAogLy8gUmV0dXJucyBUUlVFIGlmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBVQUMuCiBCT09MIFBsYXRmb3JtU3VwcG9ydHNVQUMoKQogewotCS8vIE5vdGUgdGhhdCB3aW4yayBkb2VzIHNlZW0gdG8gc3VwcG9ydCBTaGVsbEV4ZWN1dGUgd2l0aCAncnVuYXMnLAotCS8vIGJ1dCBkb2VzICpub3QqIHN1cHBvcnQgSXNVc2VyQW5BZG1pbiAtIHNvIHdlIGp1c3QgcHJldGVuZCB0aGluZ3MKLQkvLyBvbmx5IHdvcmsgb24gWFAgYW5kIGxhdGVyLgotCUJPT0wgYklzV2luZG93c1hQb3JMYXRlcjsKLQlPU1ZFUlNJT05JTkZPIHdpbnZlcmluZm87Ci0Jd2ludmVyaW5mby5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKHdpbnZlcmluZm8pOwotCWlmICghR2V0VmVyc2lvbkV4KCZ3aW52ZXJpbmZvKSkKLQkJcmV0dXJuIEZBTFNFOyAvLyBzb21ldGhpbmcgYmFkIGhhcyBnb25lIHdyb25nCi0JYklzV2luZG93c1hQb3JMYXRlciA9IAorICAgIC8vIE5vdGUgdGhhdCB3aW4yayBkb2VzIHNlZW0gdG8gc3VwcG9ydCBTaGVsbEV4ZWN1dGUgd2l0aCAncnVuYXMnLAorICAgIC8vIGJ1dCBkb2VzICpub3QqIHN1cHBvcnQgSXNVc2VyQW5BZG1pbiAtIHNvIHdlIGp1c3QgcHJldGVuZCB0aGluZ3MKKyAgICAvLyBvbmx5IHdvcmsgb24gWFAgYW5kIGxhdGVyLgorICAgIEJPT0wgYklzV2luZG93c1hQb3JMYXRlcjsKKyAgICBPU1ZFUlNJT05JTkZPIHdpbnZlcmluZm87CisgICAgd2ludmVyaW5mby5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKHdpbnZlcmluZm8pOworICAgIGlmICghR2V0VmVyc2lvbkV4KCZ3aW52ZXJpbmZvKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOyAvLyBzb21ldGhpbmcgYmFkIGhhcyBnb25lIHdyb25nCisgICAgYklzV2luZG93c1hQb3JMYXRlciA9CiAgICAgICAgKCAod2ludmVyaW5mby5kd01ham9yVmVyc2lvbiA+IDUpIHx8CiAgICAgICAgKCAod2ludmVyaW5mby5kd01ham9yVmVyc2lvbiA9PSA1KSAmJiAod2ludmVyaW5mby5kd01pbm9yVmVyc2lvbiA+PSAxKSApKTsKLQlyZXR1cm4gYklzV2luZG93c1hQb3JMYXRlcjsKKyAgICByZXR1cm4gYklzV2luZG93c1hQb3JMYXRlcjsKIH0KIAogLy8gU3Bhd24gb3Vyc2VsZiBhcyBhbiBlbGV2YXRlZCBhcHBsaWNhdGlvbi4gIE9uIGZhaWx1cmUsIGEgbWVzc2FnZSBpcwpAQCAtMjE3OCw5NyArMjE3OCw5NyBAQAogLy8gb24gZXJyb3IuCiB2b2lkIFNwYXduVUFDKCkKIHsKLQkvLyBpbnRlcmVzdGluZyBmYWlsdXJlIHNjZW5hcmlvIHRoYXQgaGFzIGJlZW4gc2VlbjogaW5pdGlhbCBleGVjdXRhYmxlCi0JLy8gcnVucyBmcm9tIGEgbmV0d29yayBkcml2ZSAtIGJ1dCBvbmNlIGVsZXZhdGVkLCB0aGF0IG5ldHdvcmsgc2hhcmUKLQkvLyBpc24ndCBzZWVuLCBhbmQgU2hlbGxFeGVjdXRlIGZhaWxzIHdpdGggU0VfRVJSX0FDQ0VTU0RFTklFRC4KLQlpbnQgcmV0ID0gKGludClTaGVsbEV4ZWN1dGUoMCwgInJ1bmFzIiwgbW9kdWxlbmFtZSwgIiIsIE5VTEwsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV19TSE9XTk9STUFMKTsKLQlpZiAocmV0IDw9IDMyKSB7Ci0JCWNoYXIgbXNnWzEyOF07Ci0JCXdzcHJpbnRmKG1zZywgIkZhaWxlZCB0byBzdGFydCBlbGV2YXRlZCBwcm9jZXNzIChTaGVsbEV4ZWN1dGUgcmV0dXJuZWQgJWQpIiwgcmV0KTsKLQkJTWVzc2FnZUJveCgwLCBtc2csICJTZXR1cCIsIE1CX09LIHwgTUJfSUNPTkVSUk9SKTsKLQl9CisgICAgLy8gaW50ZXJlc3RpbmcgZmFpbHVyZSBzY2VuYXJpbyB0aGF0IGhhcyBiZWVuIHNlZW46IGluaXRpYWwgZXhlY3V0YWJsZQorICAgIC8vIHJ1bnMgZnJvbSBhIG5ldHdvcmsgZHJpdmUgLSBidXQgb25jZSBlbGV2YXRlZCwgdGhhdCBuZXR3b3JrIHNoYXJlCisgICAgLy8gaXNuJ3Qgc2VlbiwgYW5kIFNoZWxsRXhlY3V0ZSBmYWlscyB3aXRoIFNFX0VSUl9BQ0NFU1NERU5JRUQuCisgICAgaW50IHJldCA9IChpbnQpU2hlbGxFeGVjdXRlKDAsICJydW5hcyIsIG1vZHVsZW5hbWUsICIiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV19TSE9XTk9STUFMKTsKKyAgICBpZiAocmV0IDw9IDMyKSB7CisgICAgICAgIGNoYXIgbXNnWzEyOF07CisgICAgICAgIHdzcHJpbnRmKG1zZywgIkZhaWxlZCB0byBzdGFydCBlbGV2YXRlZCBwcm9jZXNzIChTaGVsbEV4ZWN1dGUgcmV0dXJuZWQgJWQpIiwgcmV0KTsKKyAgICAgICAgTWVzc2FnZUJveCgwLCBtc2csICJTZXR1cCIsIE1CX09LIHwgTUJfSUNPTkVSUk9SKTsKKyAgICB9CiB9CiAKIGludCBEb0luc3RhbGwodm9pZCkKIHsKLQljaGFyIGluaV9idWZmZXJbNDA5Nl07CisgICAgY2hhciBpbmlfYnVmZmVyWzQwOTZdOwogCi0JLyogUmVhZCBpbnN0YWxsYXRpb24gaW5mb3JtYXRpb24gKi8KLQlHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAidGl0bGUiLCAiIiwgaW5pX2J1ZmZlciwKLQkJCQkgc2l6ZW9mKGluaV9idWZmZXIpLCBpbmlfZmlsZSk7Ci0JdW5lc2NhcGUodGl0bGUsIGluaV9idWZmZXIsIHNpemVvZih0aXRsZSkpOworICAgIC8qIFJlYWQgaW5zdGFsbGF0aW9uIGluZm9ybWF0aW9uICovCisgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgInRpdGxlIiwgIiIsIGluaV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbmlfYnVmZmVyKSwgaW5pX2ZpbGUpOworICAgIHVuZXNjYXBlKHRpdGxlLCBpbmlfYnVmZmVyLCBzaXplb2YodGl0bGUpKTsKIAotCUdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJpbmZvIiwgIiIsIGluaV9idWZmZXIsCi0JCQkJIHNpemVvZihpbmlfYnVmZmVyKSwgaW5pX2ZpbGUpOwotCXVuZXNjYXBlKGluZm8sIGluaV9idWZmZXIsIHNpemVvZihpbmZvKSk7CisgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgImluZm8iLCAiIiwgaW5pX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGluaV9idWZmZXIpLCBpbmlfZmlsZSk7CisgICAgdW5lc2NhcGUoaW5mbywgaW5pX2J1ZmZlciwgc2l6ZW9mKGluZm8pKTsKIAotCUdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJidWlsZF9pbmZvIiwgIiIsIGJ1aWxkX2luZm8sCi0JCQkJIHNpemVvZihidWlsZF9pbmZvKSwgaW5pX2ZpbGUpOworICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJidWlsZF9pbmZvIiwgIiIsIGJ1aWxkX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidWlsZF9pbmZvKSwgaW5pX2ZpbGUpOwogCi0JcHljX2NvbXBpbGUgPSBHZXRQcml2YXRlUHJvZmlsZUludCgiU2V0dXAiLCAidGFyZ2V0X2NvbXBpbGUiLCAxLAotCQkJCQkgICAgaW5pX2ZpbGUpOwotCXB5b19jb21waWxlID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIlNldHVwIiwgInRhcmdldF9vcHRpbWl6ZSIsIDEsCi0JCQkJCSAgICBpbmlfZmlsZSk7CisgICAgcHljX2NvbXBpbGUgPSBHZXRQcml2YXRlUHJvZmlsZUludCgiU2V0dXAiLCAidGFyZ2V0X2NvbXBpbGUiLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaV9maWxlKTsKKyAgICBweW9fY29tcGlsZSA9IEdldFByaXZhdGVQcm9maWxlSW50KCJTZXR1cCIsICJ0YXJnZXRfb3B0aW1pemUiLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaV9maWxlKTsKIAotCUdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJ0YXJnZXRfdmVyc2lvbiIsICIiLAotCQkJCSB0YXJnZXRfdmVyc2lvbiwgc2l6ZW9mKHRhcmdldF92ZXJzaW9uKSwKLQkJCQkgaW5pX2ZpbGUpOworICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJ0YXJnZXRfdmVyc2lvbiIsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiwgc2l6ZW9mKHRhcmdldF92ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pX2ZpbGUpOwogCi0JR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIm1ldGFkYXRhIiwgIm5hbWUiLCAiIiwKLQkJCQkgbWV0YV9uYW1lLCBzaXplb2YobWV0YV9uYW1lKSwKLQkJCQkgaW5pX2ZpbGUpOworICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJtZXRhZGF0YSIsICJuYW1lIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFfbmFtZSwgc2l6ZW9mKG1ldGFfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaV9maWxlKTsKIAotCUdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJpbnN0YWxsX3NjcmlwdCIsICIiLAotCQkJCSBpbnN0YWxsX3NjcmlwdCwgc2l6ZW9mKGluc3RhbGxfc2NyaXB0KSwKLQkJCQkgaW5pX2ZpbGUpOworICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJpbnN0YWxsX3NjcmlwdCIsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsX3NjcmlwdCwgc2l6ZW9mKGluc3RhbGxfc2NyaXB0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pX2ZpbGUpOwogCi0JR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgInVzZXJfYWNjZXNzX2NvbnRyb2wiLCAiIiwKLQkJCQkgdXNlcl9hY2Nlc3NfY29udHJvbCwgc2l6ZW9mKHVzZXJfYWNjZXNzX2NvbnRyb2wpLCBpbmlfZmlsZSk7CisgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgInVzZXJfYWNjZXNzX2NvbnRyb2wiLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9hY2Nlc3NfY29udHJvbCwgc2l6ZW9mKHVzZXJfYWNjZXNzX2NvbnRyb2wpLCBpbmlfZmlsZSk7CiAKLQkvLyBTZWUgaWYgd2UgbmVlZCB0byBkbyB0aGUgVmlzdGEgVUFDIG1hZ2ljLgotCWlmIChzdHJjbXAodXNlcl9hY2Nlc3NfY29udHJvbCwgImZvcmNlIik9PTApIHsKLQkJaWYgKFBsYXRmb3JtU3VwcG9ydHNVQUMoKSAmJiAhTXlJc1VzZXJBbkFkbWluKCkpIHsKLQkJCVNwYXduVUFDKCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkvLyBhbHJlYWR5IGFkbWluIC0ga2VlcCBnb2luZwotCX0gZWxzZSBpZiAoc3RyY21wKHVzZXJfYWNjZXNzX2NvbnRyb2wsICJhdXRvIik9PTApIHsKLQkJLy8gQ2hlY2sgaWYgaXQgbG9va3MgbGlrZSB3ZSBuZWVkIFVBQyBjb250cm9sLCBiYXNlZAotCQkvLyBvbiBob3cgUHl0aG9uIGl0c2VsZiB3YXMgaW5zdGFsbGVkLgotCQlpZiAoUGxhdGZvcm1TdXBwb3J0c1VBQygpICYmICFNeUlzVXNlckFuQWRtaW4oKSAmJiBOZWVkQXV0b1VBQygpKSB7Ci0JCQlTcGF3blVBQygpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgewotCQkvLyBkaXNwbGF5IGEgd2FybmluZyBhYm91dCB1bmtub3duIHZhbHVlcyAtIG9ubHkgdGhlIGRldmVsb3BlcgotCQkvLyBvZiB0aGUgZXh0ZW5zaW9uIHdpbGwgc2VlIGl0ICh1bnRpbCB0aGV5IGZpeCBpdCEpCi0JCWlmICh1c2VyX2FjY2Vzc19jb250cm9sWzBdICYmIHN0cmNtcCh1c2VyX2FjY2Vzc19jb250cm9sLCAibm9uZSIpICE9IDApIHsKLQkJCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgIkJhZCB1c2VyX2FjY2Vzc19jb250cm9sIHZhbHVlIiwgIm9vcHMiLCBNQl9PSyk7Ci0JCS8vIG5vdGhpbmcgdG8gZG8uCi0JCX0KLQl9CisgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gZG8gdGhlIFZpc3RhIFVBQyBtYWdpYy4KKyAgICBpZiAoc3RyY21wKHVzZXJfYWNjZXNzX2NvbnRyb2wsICJmb3JjZSIpPT0wKSB7CisgICAgICAgIGlmIChQbGF0Zm9ybVN1cHBvcnRzVUFDKCkgJiYgIU15SXNVc2VyQW5BZG1pbigpKSB7CisgICAgICAgICAgICBTcGF3blVBQygpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWxyZWFkeSBhZG1pbiAtIGtlZXAgZ29pbmcKKyAgICB9IGVsc2UgaWYgKHN0cmNtcCh1c2VyX2FjY2Vzc19jb250cm9sLCAiYXV0byIpPT0wKSB7CisgICAgICAgIC8vIENoZWNrIGlmIGl0IGxvb2tzIGxpa2Ugd2UgbmVlZCBVQUMgY29udHJvbCwgYmFzZWQKKyAgICAgICAgLy8gb24gaG93IFB5dGhvbiBpdHNlbGYgd2FzIGluc3RhbGxlZC4KKyAgICAgICAgaWYgKFBsYXRmb3JtU3VwcG9ydHNVQUMoKSAmJiAhTXlJc1VzZXJBbkFkbWluKCkgJiYgTmVlZEF1dG9VQUMoKSkgeworICAgICAgICAgICAgU3Bhd25VQUMoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZGlzcGxheSBhIHdhcm5pbmcgYWJvdXQgdW5rbm93biB2YWx1ZXMgLSBvbmx5IHRoZSBkZXZlbG9wZXIKKyAgICAgICAgLy8gb2YgdGhlIGV4dGVuc2lvbiB3aWxsIHNlZSBpdCAodW50aWwgdGhleSBmaXggaXQhKQorICAgICAgICBpZiAodXNlcl9hY2Nlc3NfY29udHJvbFswXSAmJiBzdHJjbXAodXNlcl9hY2Nlc3NfY29udHJvbCwgIm5vbmUiKSAhPSAwKSB7CisgICAgICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksICJCYWQgdXNlcl9hY2Nlc3NfY29udHJvbCB2YWx1ZSIsICJvb3BzIiwgTUJfT0spOworICAgICAgICAvLyBub3RoaW5nIHRvIGRvLgorICAgICAgICB9CisgICAgfQogCi0JaHduZE1haW4gPSBDcmVhdGVCYWNrZ3JvdW5kKHRpdGxlKTsKKyAgICBod25kTWFpbiA9IENyZWF0ZUJhY2tncm91bmQodGl0bGUpOwogCi0JUnVuV2l6YXJkKGh3bmRNYWluKTsKKyAgICBSdW5XaXphcmQoaHduZE1haW4pOwogCi0JLyogQ2xlYW4gdXAgKi8KLQlVbm1hcFZpZXdPZkZpbGUoYXJjX2RhdGEpOwotCWlmIChpbmlfZmlsZSkKLQkJRGVsZXRlRmlsZShpbmlfZmlsZSk7CisgICAgLyogQ2xlYW4gdXAgKi8KKyAgICBVbm1hcFZpZXdPZkZpbGUoYXJjX2RhdGEpOworICAgIGlmIChpbmlfZmlsZSkKKyAgICAgICAgRGVsZXRlRmlsZShpbmlfZmlsZSk7CiAKLQlpZiAoaEJpdG1hcCkKLQkJRGVsZXRlT2JqZWN0KGhCaXRtYXApOworICAgIGlmIChoQml0bWFwKQorICAgICAgICBEZWxldGVPYmplY3QoaEJpdG1hcCk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqIHVuaW5zdGFsbCBzZWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGludCBjb21wYXJlKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKIHsKLQlyZXR1cm4gc3RyY21wKCooY2hhciAqKilwMiwgKihjaGFyICoqKXAxKTsKKyAgICByZXR1cm4gc3RyY21wKCooY2hhciAqKilwMiwgKihjaGFyICoqKXAxKTsKIH0KIAogLyoKQEAgLTIyODIsMzc5ICsyMjgyLDM3OSBAQAogICovCiB2b2lkIHJlbW92ZV9leGUodm9pZCkKIHsKLQljaGFyIGV4ZW5hbWVbX01BWF9QQVRIXTsKLQljaGFyIGJhdG5hbWVbX01BWF9QQVRIXTsKLQlGSUxFICpmcDsKLQlTVEFSVFVQSU5GTyBzaTsKLQlQUk9DRVNTX0lORk9STUFUSU9OIHBpOworICAgIGNoYXIgZXhlbmFtZVtfTUFYX1BBVEhdOworICAgIGNoYXIgYmF0bmFtZVtfTUFYX1BBVEhdOworICAgIEZJTEUgKmZwOworICAgIFNUQVJUVVBJTkZPIHNpOworICAgIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7CiAKLQlHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBleGVuYW1lLCBzaXplb2YoZXhlbmFtZSkpOwotCXNwcmludGYoYmF0bmFtZSwgIiVzLmJhdCIsIGV4ZW5hbWUpOwotCWZwID0gZm9wZW4oYmF0bmFtZSwgInciKTsKLQlmcHJpbnRmKGZwLCAiOlJlcGVhdFxuIik7Ci0JZnByaW50ZihmcCwgImRlbCBcIiVzXCJcbiIsIGV4ZW5hbWUpOwotCWZwcmludGYoZnAsICJpZiBleGlzdCBcIiVzXCIgZ290byBSZXBlYXRcbiIsIGV4ZW5hbWUpOwotCWZwcmludGYoZnAsICJkZWwgXCIlc1wiXG4iLCBiYXRuYW1lKTsKLQlmY2xvc2UoZnApOwotICAgIAotCVplcm9NZW1vcnkoJnNpLCBzaXplb2Yoc2kpKTsKLQlzaS5jYiA9IHNpemVvZihzaSk7Ci0Jc2kuZHdGbGFncyA9IFNUQVJURl9VU0VTSE9XV0lORE9XOwotCXNpLndTaG93V2luZG93ID0gU1dfSElERTsKLQlpZiAoQ3JlYXRlUHJvY2VzcyhOVUxMLAotCQkJICBiYXRuYW1lLAotCQkJICBOVUxMLAotCQkJICBOVUxMLAotCQkJICBGQUxTRSwKLQkJCSAgQ1JFQVRFX1NVU1BFTkRFRCB8IElETEVfUFJJT1JJVFlfQ0xBU1MsCi0JCQkgIE5VTEwsCi0JCQkgICJcXCIsCi0JCQkgICZzaSwKLQkJCSAgJnBpKSkgewotCQlTZXRUaHJlYWRQcmlvcml0eShwaS5oVGhyZWFkLCBUSFJFQURfUFJJT1JJVFlfSURMRSk7Ci0JCVNldFRocmVhZFByaW9yaXR5KEdldEN1cnJlbnRUaHJlYWQoKSwgVEhSRUFEX1BSSU9SSVRZX1RJTUVfQ1JJVElDQUwpOwotCQlTZXRQcmlvcml0eUNsYXNzKEdldEN1cnJlbnRQcm9jZXNzKCksIEhJR0hfUFJJT1JJVFlfQ0xBU1MpOwotCQlDbG9zZUhhbmRsZShwaS5oUHJvY2Vzcyk7Ci0JCVJlc3VtZVRocmVhZChwaS5oVGhyZWFkKTsKLQkJQ2xvc2VIYW5kbGUocGkuaFRocmVhZCk7Ci0JfQorICAgIEdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIGV4ZW5hbWUsIHNpemVvZihleGVuYW1lKSk7CisgICAgc3ByaW50ZihiYXRuYW1lLCAiJXMuYmF0IiwgZXhlbmFtZSk7CisgICAgZnAgPSBmb3BlbihiYXRuYW1lLCAidyIpOworICAgIGZwcmludGYoZnAsICI6UmVwZWF0XG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiZGVsIFwiJXNcIlxuIiwgZXhlbmFtZSk7CisgICAgZnByaW50ZihmcCwgImlmIGV4aXN0IFwiJXNcIiBnb3RvIFJlcGVhdFxuIiwgZXhlbmFtZSk7CisgICAgZnByaW50ZihmcCwgImRlbCBcIiVzXCJcbiIsIGJhdG5hbWUpOworICAgIGZjbG9zZShmcCk7CisKKyAgICBaZXJvTWVtb3J5KCZzaSwgc2l6ZW9mKHNpKSk7CisgICAgc2kuY2IgPSBzaXplb2Yoc2kpOworICAgIHNpLmR3RmxhZ3MgPSBTVEFSVEZfVVNFU0hPV1dJTkRPVzsKKyAgICBzaS53U2hvd1dpbmRvdyA9IFNXX0hJREU7CisgICAgaWYgKENyZWF0ZVByb2Nlc3MoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICBDUkVBVEVfU1VTUEVOREVEIHwgSURMRV9QUklPUklUWV9DTEFTUywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICJcXCIsCisgICAgICAgICAgICAgICAgICAgICAgJnNpLAorICAgICAgICAgICAgICAgICAgICAgICZwaSkpIHsKKyAgICAgICAgU2V0VGhyZWFkUHJpb3JpdHkocGkuaFRocmVhZCwgVEhSRUFEX1BSSU9SSVRZX0lETEUpOworICAgICAgICBTZXRUaHJlYWRQcmlvcml0eShHZXRDdXJyZW50VGhyZWFkKCksIFRIUkVBRF9QUklPUklUWV9USU1FX0NSSVRJQ0FMKTsKKyAgICAgICAgU2V0UHJpb3JpdHlDbGFzcyhHZXRDdXJyZW50UHJvY2VzcygpLCBISUdIX1BSSU9SSVRZX0NMQVNTKTsKKyAgICAgICAgQ2xvc2VIYW5kbGUocGkuaFByb2Nlc3MpOworICAgICAgICBSZXN1bWVUaHJlYWQocGkuaFRocmVhZCk7CisgICAgICAgIENsb3NlSGFuZGxlKHBpLmhUaHJlYWQpOworICAgIH0KIH0KIAogdm9pZCBEZWxldGVSZWdpc3RyeUtleShjaGFyICpzdHJpbmcpCiB7Ci0JY2hhciAqa2V5bmFtZTsKLQljaGFyICpzdWJrZXluYW1lOwotCWNoYXIgKmRlbGltOwotCUhLRVkgaEtleTsKLQlsb25nIHJlc3VsdDsKLQljaGFyICpsaW5lOworICAgIGNoYXIgKmtleW5hbWU7CisgICAgY2hhciAqc3Via2V5bmFtZTsKKyAgICBjaGFyICpkZWxpbTsKKyAgICBIS0VZIGhLZXk7CisgICAgbG9uZyByZXN1bHQ7CisgICAgY2hhciAqbGluZTsKIAotCWxpbmUgPSBzdHJkdXAoc3RyaW5nKTsgLyogc28gd2UgY2FuIGNoYW5nZSBpdCAqLworICAgIGxpbmUgPSBzdHJkdXAoc3RyaW5nKTsgLyogc28gd2UgY2FuIGNoYW5nZSBpdCAqLwogCi0Ja2V5bmFtZSA9IHN0cmNocihsaW5lLCAnWycpOwotCWlmICgha2V5bmFtZSkKLQkJcmV0dXJuOwotCSsra2V5bmFtZTsKKyAgICBrZXluYW1lID0gc3RyY2hyKGxpbmUsICdbJyk7CisgICAgaWYgKCFrZXluYW1lKQorICAgICAgICByZXR1cm47CisgICAgKytrZXluYW1lOwogCi0Jc3Via2V5bmFtZSA9IHN0cmNocihrZXluYW1lLCAnXScpOwotCWlmICghc3Via2V5bmFtZSkKLQkJcmV0dXJuOwotCSpzdWJrZXluYW1lKys9J1wwJzsKLQlkZWxpbSA9IHN0cmNocihzdWJrZXluYW1lLCAnXG4nKTsKLQlpZiAoZGVsaW0pCi0JCSpkZWxpbSA9ICdcMCc7CisgICAgc3Via2V5bmFtZSA9IHN0cmNocihrZXluYW1lLCAnXScpOworICAgIGlmICghc3Via2V5bmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgICpzdWJrZXluYW1lKys9J1wwJzsKKyAgICBkZWxpbSA9IHN0cmNocihzdWJrZXluYW1lLCAnXG4nKTsKKyAgICBpZiAoZGVsaW0pCisgICAgICAgICpkZWxpbSA9ICdcMCc7CiAKLQlyZXN1bHQgPSBSZWdPcGVuS2V5RXgoaGtleV9yb290LAotCQkJICAgICAga2V5bmFtZSwKLQkJCSAgICAgIDAsCi0JCQkgICAgICBLRVlfV1JJVEUsCi0JCQkgICAgICAmaEtleSk7Ci0gICAgCi0JaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQotCQlNZXNzYWdlQm94KEdldEZvY3VzKCksIHN0cmluZywgIkNvdWxkIG5vdCBvcGVuIGtleSIsIE1CX09LKTsKLQllbHNlIHsKLQkJcmVzdWx0ID0gUmVnRGVsZXRlS2V5KGhLZXksIHN1YmtleW5hbWUpOwotCQlpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MgJiYgcmVzdWx0ICE9IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKQotCQkJTWVzc2FnZUJveChHZXRGb2N1cygpLCBzdHJpbmcsICJDb3VsZCBub3QgZGVsZXRlIGtleSIsIE1CX09LKTsKLQkJUmVnQ2xvc2VLZXkoaEtleSk7Ci0JfQotCWZyZWUobGluZSk7CisgICAgcmVzdWx0ID0gUmVnT3BlbktleUV4KGhrZXlfcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaEtleSk7CisKKyAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgc3RyaW5nLCAiQ291bGQgbm90IG9wZW4ga2V5IiwgTUJfT0spOworICAgIGVsc2UgeworICAgICAgICByZXN1bHQgPSBSZWdEZWxldGVLZXkoaEtleSwgc3Via2V5bmFtZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUyAmJiByZXN1bHQgIT0gRVJST1JfRklMRV9OT1RfRk9VTkQpCisgICAgICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIHN0cmluZywgIkNvdWxkIG5vdCBkZWxldGUga2V5IiwgTUJfT0spOworICAgICAgICBSZWdDbG9zZUtleShoS2V5KTsKKyAgICB9CisgICAgZnJlZShsaW5lKTsKIH0KIAogdm9pZCBEZWxldGVSZWdpc3RyeVZhbHVlKGNoYXIgKnN0cmluZykKIHsKLQljaGFyICprZXluYW1lOwotCWNoYXIgKnZhbHVlbmFtZTsKLQljaGFyICp2YWx1ZTsKLQlIS0VZIGhLZXk7Ci0JbG9uZyByZXN1bHQ7Ci0JY2hhciAqbGluZTsKKyAgICBjaGFyICprZXluYW1lOworICAgIGNoYXIgKnZhbHVlbmFtZTsKKyAgICBjaGFyICp2YWx1ZTsKKyAgICBIS0VZIGhLZXk7CisgICAgbG9uZyByZXN1bHQ7CisgICAgY2hhciAqbGluZTsKIAotCWxpbmUgPSBzdHJkdXAoc3RyaW5nKTsgLyogc28gd2UgY2FuIGNoYW5nZSBpdCAqLworICAgIGxpbmUgPSBzdHJkdXAoc3RyaW5nKTsgLyogc28gd2UgY2FuIGNoYW5nZSBpdCAqLwogCiAvKiBGb3JtYXQgaXMgJ1JlZyBEQiBWYWx1ZTogW2tleV1uYW1lPXZhbHVlJyAqLwotCWtleW5hbWUgPSBzdHJjaHIobGluZSwgJ1snKTsKLQlpZiAoIWtleW5hbWUpCi0JCXJldHVybjsKLQkrK2tleW5hbWU7Ci0JdmFsdWVuYW1lID0gc3RyY2hyKGtleW5hbWUsICddJyk7Ci0JaWYgKCF2YWx1ZW5hbWUpCi0JCXJldHVybjsKLQkqdmFsdWVuYW1lKysgPSAnXDAnOwotCXZhbHVlID0gc3RyY2hyKHZhbHVlbmFtZSwgJz0nKTsKLQlpZiAoIXZhbHVlKQotCQlyZXR1cm47CisgICAga2V5bmFtZSA9IHN0cmNocihsaW5lLCAnWycpOworICAgIGlmICgha2V5bmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgICsra2V5bmFtZTsKKyAgICB2YWx1ZW5hbWUgPSBzdHJjaHIoa2V5bmFtZSwgJ10nKTsKKyAgICBpZiAoIXZhbHVlbmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgICp2YWx1ZW5hbWUrKyA9ICdcMCc7CisgICAgdmFsdWUgPSBzdHJjaHIodmFsdWVuYW1lLCAnPScpOworICAgIGlmICghdmFsdWUpCisgICAgICAgIHJldHVybjsKIAotCSp2YWx1ZSsrID0gJ1wwJzsKKyAgICAqdmFsdWUrKyA9ICdcMCc7CiAKLQlyZXN1bHQgPSBSZWdPcGVuS2V5RXgoaGtleV9yb290LAotCQkJICAgICAga2V5bmFtZSwKLQkJCSAgICAgIDAsCi0JCQkgICAgICBLRVlfV1JJVEUsCi0JCQkgICAgICAmaEtleSk7Ci0JaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQotCQlNZXNzYWdlQm94KEdldEZvY3VzKCksIHN0cmluZywgIkNvdWxkIG5vdCBvcGVuIGtleSIsIE1CX09LKTsKLQllbHNlIHsKLQkJcmVzdWx0ID0gUmVnRGVsZXRlVmFsdWUoaEtleSwgdmFsdWVuYW1lKTsKLQkJaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTICYmIHJlc3VsdCAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkKLQkJCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgc3RyaW5nLCAiQ291bGQgbm90IGRlbGV0ZSB2YWx1ZSIsIE1CX09LKTsKLQkJUmVnQ2xvc2VLZXkoaEtleSk7Ci0JfQotCWZyZWUobGluZSk7CisgICAgcmVzdWx0ID0gUmVnT3BlbktleUV4KGhrZXlfcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaEtleSk7CisgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIHN0cmluZywgIkNvdWxkIG5vdCBvcGVuIGtleSIsIE1CX09LKTsKKyAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUmVnRGVsZXRlVmFsdWUoaEtleSwgdmFsdWVuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTICYmIHJlc3VsdCAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkKKyAgICAgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgc3RyaW5nLCAiQ291bGQgbm90IGRlbGV0ZSB2YWx1ZSIsIE1CX09LKTsKKyAgICAgICAgUmVnQ2xvc2VLZXkoaEtleSk7CisgICAgfQorICAgIGZyZWUobGluZSk7CiB9CiAKIEJPT0wgTXlEZWxldGVGaWxlKGNoYXIgKmxpbmUpCiB7Ci0JY2hhciAqcGF0aG5hbWUgPSBzdHJjaHIobGluZSwgJzonKTsKLQlpZiAoIXBhdGhuYW1lKQotCQlyZXR1cm4gRkFMU0U7Ci0JKytwYXRobmFtZTsKLQl3aGlsZSAoaXNzcGFjZSgqcGF0aG5hbWUpKQotCQkrK3BhdGhuYW1lOwotCXJldHVybiBEZWxldGVGaWxlKHBhdGhuYW1lKTsKKyAgICBjaGFyICpwYXRobmFtZSA9IHN0cmNocihsaW5lLCAnOicpOworICAgIGlmICghcGF0aG5hbWUpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICArK3BhdGhuYW1lOworICAgIHdoaWxlIChpc3NwYWNlKCpwYXRobmFtZSkpCisgICAgICAgICsrcGF0aG5hbWU7CisgICAgcmV0dXJuIERlbGV0ZUZpbGUocGF0aG5hbWUpOwogfQogCiBCT09MIE15UmVtb3ZlRGlyZWN0b3J5KGNoYXIgKmxpbmUpCiB7Ci0JY2hhciAqcGF0aG5hbWUgPSBzdHJjaHIobGluZSwgJzonKTsKLQlpZiAoIXBhdGhuYW1lKQotCQlyZXR1cm4gRkFMU0U7Ci0JKytwYXRobmFtZTsKLQl3aGlsZSAoaXNzcGFjZSgqcGF0aG5hbWUpKQotCQkrK3BhdGhuYW1lOwotCXJldHVybiBSZW1vdmVEaXJlY3RvcnkocGF0aG5hbWUpOworICAgIGNoYXIgKnBhdGhuYW1lID0gc3RyY2hyKGxpbmUsICc6Jyk7CisgICAgaWYgKCFwYXRobmFtZSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICsrcGF0aG5hbWU7CisgICAgd2hpbGUgKGlzc3BhY2UoKnBhdGhuYW1lKSkKKyAgICAgICAgKytwYXRobmFtZTsKKyAgICByZXR1cm4gUmVtb3ZlRGlyZWN0b3J5KHBhdGhuYW1lKTsKIH0KIAogQk9PTCBSdW5fUmVtb3ZlU2NyaXB0KGNoYXIgKmxpbmUpCiB7Ci0JY2hhciAqZGxsbmFtZTsKLQljaGFyICpzY3JpcHRuYW1lOwotCXN0YXRpYyBjaGFyIGxhc3RzY3JpcHRbTUFYX1BBVEhdOworICAgIGNoYXIgKmRsbG5hbWU7CisgICAgY2hhciAqc2NyaXB0bmFtZTsKKyAgICBzdGF0aWMgY2hhciBsYXN0c2NyaXB0W01BWF9QQVRIXTsKIAogLyogRm9ybWF0IGlzICdSdW4gU2NyaXB0czogW3B5dGhvbmRsbF1zY3JpcHRuYW1lJyAqLwogLyogWFhYIEN1cnJlbnRseSwgcHl0aG9uZGxsIGNhcnJpZXMgbm8gcGF0aCEhISAqLwotCWRsbG5hbWUgPSBzdHJjaHIobGluZSwgJ1snKTsKLQlpZiAoIWRsbG5hbWUpCi0JCXJldHVybiBGQUxTRTsKLQkrK2RsbG5hbWU7Ci0Jc2NyaXB0bmFtZSA9IHN0cmNocihkbGxuYW1lLCAnXScpOwotCWlmICghc2NyaXB0bmFtZSkKLQkJcmV0dXJuIEZBTFNFOwotCSpzY3JpcHRuYW1lKysgPSAnXDAnOwotCS8qIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25lIHRpbWUgd2l0aCB0aGUgc2FtZQotCSAgIHNjcmlwdCwgb25seSBydW4gaXQgb25lIHRpbWUgKi8KLQlpZiAoc3RyY21wKGxhc3RzY3JpcHQsIHNjcmlwdG5hbWUpKSB7Ci0JCWNoYXIgKmFyZ3ZbM10gPSB7TlVMTCwgIi1yZW1vdmUiLCBOVUxMfTsKLQkJY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICBkbGxuYW1lID0gc3RyY2hyKGxpbmUsICdbJyk7CisgICAgaWYgKCFkbGxuYW1lKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgKytkbGxuYW1lOworICAgIHNjcmlwdG5hbWUgPSBzdHJjaHIoZGxsbmFtZSwgJ10nKTsKKyAgICBpZiAoIXNjcmlwdG5hbWUpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAqc2NyaXB0bmFtZSsrID0gJ1wwJzsKKyAgICAvKiB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uZSB0aW1lIHdpdGggdGhlIHNhbWUKKyAgICAgICBzY3JpcHQsIG9ubHkgcnVuIGl0IG9uZSB0aW1lICovCisgICAgaWYgKHN0cmNtcChsYXN0c2NyaXB0LCBzY3JpcHRuYW1lKSkgeworICAgICAgICBjaGFyICphcmd2WzNdID0ge05VTEwsICItcmVtb3ZlIiwgTlVMTH07CisgICAgICAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CiAKLQkJYXJndlswXSA9IHNjcmlwdG5hbWU7CisgICAgICAgIGFyZ3ZbMF0gPSBzY3JpcHRuYW1lOwogCi0JCWlmICgwICE9IHJ1bl9pbnN0YWxsc2NyaXB0KHNjcmlwdG5hbWUsIDIsIGFyZ3YsICZidWZmZXIpKQotCQkJZnByaW50ZihzdGRlcnIsICIqKiogQ291bGQgbm90IHJ1biBpbnN0YWxsYXRpb24gc2NyaXB0ICoqKiIpOworICAgICAgICBpZiAoMCAhPSBydW5faW5zdGFsbHNjcmlwdChzY3JpcHRuYW1lLCAyLCBhcmd2LCAmYnVmZmVyKSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKioqIENvdWxkIG5vdCBydW4gaW5zdGFsbGF0aW9uIHNjcmlwdCAqKioiKTsKIAotCQlpZiAoYnVmZmVyICYmIGJ1ZmZlclswXSkKLQkJCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgYnVmZmVyLCAidW5pbnN0YWxsLXNjcmlwdCIsIE1CX09LKTsKLQkJZnJlZShidWZmZXIpOworICAgICAgICBpZiAoYnVmZmVyICYmIGJ1ZmZlclswXSkKKyAgICAgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgYnVmZmVyLCAidW5pbnN0YWxsLXNjcmlwdCIsIE1CX09LKTsKKyAgICAgICAgZnJlZShidWZmZXIpOwogCi0JCXN0cmNweShsYXN0c2NyaXB0LCBzY3JpcHRuYW1lKTsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgICAgIHN0cmNweShsYXN0c2NyaXB0LCBzY3JpcHRuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIGludCBEb1VuaW5zdGFsbChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JRklMRSAqbG9nZmlsZTsKLQljaGFyIGJ1ZmZlcls0MDk2XTsKLQlpbnQgbkxpbmVzID0gMDsKLQlpbnQgaTsKLQljaGFyICpjcDsKLQlpbnQgbkZpbGVzID0gMDsKLQlpbnQgbkRpcnMgPSAwOwotCWludCBuRXJyb3JzID0gMDsKLQljaGFyICoqbGluZXM7Ci0JaW50IGxpbmVzX2J1ZmZlcl9zaXplID0gMTA7Ci0gICAgCi0JaWYgKGFyZ2MgIT0gMykgewotCQlNZXNzYWdlQm94KE5VTEwsCi0JCQkgICAiV3JvbmcgbnVtYmVyIG9mIGFyZ3MiLAotCQkJICAgTlVMTCwKLQkJCSAgIE1CX09LKTsKLQkJcmV0dXJuIDE7IC8qIEVycm9yICovCi0JfQotCWlmIChzdHJjbXAoYXJndlsxXSwgIi11IikpIHsKLQkJTWVzc2FnZUJveChOVUxMLAotCQkJICAgIjIuIGFyZyBpcyBub3QgLXUiLAotCQkJICAgTlVMTCwKLQkJCSAgIE1CX09LKTsKLQkJcmV0dXJuIDE7IC8qIEVycm9yICovCi0JfQorICAgIEZJTEUgKmxvZ2ZpbGU7CisgICAgY2hhciBidWZmZXJbNDA5Nl07CisgICAgaW50IG5MaW5lcyA9IDA7CisgICAgaW50IGk7CisgICAgY2hhciAqY3A7CisgICAgaW50IG5GaWxlcyA9IDA7CisgICAgaW50IG5EaXJzID0gMDsKKyAgICBpbnQgbkVycm9ycyA9IDA7CisgICAgY2hhciAqKmxpbmVzOworICAgIGludCBsaW5lc19idWZmZXJfc2l6ZSA9IDEwOwogCi0JbG9nZmlsZSA9IGZvcGVuKGFyZ3ZbMl0sICJyIik7Ci0JaWYgKCFsb2dmaWxlKSB7Ci0JCU1lc3NhZ2VCb3goTlVMTCwKLQkJCSAgICJjb3VsZCBub3Qgb3BlbiBsb2dmaWxlIiwKLQkJCSAgIE5VTEwsCi0JCQkgICBNQl9PSyk7Ci0JCXJldHVybiAxOyAvKiBFcnJvciAqLwotCX0KLSAgICAKLQlsaW5lcyA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSAqIGxpbmVzX2J1ZmZlcl9zaXplKTsKLQlpZiAoIWxpbmVzKQotCQlyZXR1cm4gU3lzdGVtRXJyb3IoMCwgIk91dCBvZiBtZW1vcnkiKTsKKyAgICBpZiAoYXJnYyAhPSAzKSB7CisgICAgICAgIE1lc3NhZ2VCb3goTlVMTCwKKyAgICAgICAgICAgICAgICAgICAiV3JvbmcgbnVtYmVyIG9mIGFyZ3MiLAorICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgTUJfT0spOworICAgICAgICByZXR1cm4gMTsgLyogRXJyb3IgKi8KKyAgICB9CisgICAgaWYgKHN0cmNtcChhcmd2WzFdLCAiLXUiKSkgeworICAgICAgICBNZXNzYWdlQm94KE5VTEwsCisgICAgICAgICAgICAgICAgICAgIjIuIGFyZyBpcyBub3QgLXUiLAorICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgTUJfT0spOworICAgICAgICByZXR1cm4gMTsgLyogRXJyb3IgKi8KKyAgICB9CiAKLQkvKiBSZWFkIHRoZSB3aG9sZSBsb2dmaWxlLCByZWFsbG9hY3RpbmcgdGhlIGJ1ZmZlciAqLwotCXdoaWxlIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBsb2dmaWxlKSkgewotCQlpbnQgbGVuID0gc3RybGVuKGJ1ZmZlcik7Ci0JCS8qIHJlbW92ZSB0cmFpbGluZyB3aGl0ZSBzcGFjZSAqLwotCQl3aGlsZSAoaXNzcGFjZShidWZmZXJbbGVuLTFdKSkKLQkJCWxlbiAtPSAxOwotCQlidWZmZXJbbGVuXSA9ICdcMCc7Ci0JCWxpbmVzW25MaW5lcysrXSA9IHN0cmR1cChidWZmZXIpOwotCQlpZiAobkxpbmVzID49IGxpbmVzX2J1ZmZlcl9zaXplKSB7Ci0JCQlsaW5lc19idWZmZXJfc2l6ZSArPSAxMDsKLQkJCWxpbmVzID0gKGNoYXIgKiopcmVhbGxvYyhsaW5lcywKLQkJCQkJCSBzaXplb2YoY2hhciAqKSAqIGxpbmVzX2J1ZmZlcl9zaXplKTsKLQkJCWlmICghbGluZXMpCi0JCQkJcmV0dXJuIFN5c3RlbUVycm9yKDAsICJPdXQgb2YgbWVtb3J5Iik7Ci0JCX0KLQl9Ci0JZmNsb3NlKGxvZ2ZpbGUpOworICAgIGxvZ2ZpbGUgPSBmb3Blbihhcmd2WzJdLCAiciIpOworICAgIGlmICghbG9nZmlsZSkgeworICAgICAgICBNZXNzYWdlQm94KE5VTEwsCisgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBvcGVuIGxvZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgTUJfT0spOworICAgICAgICByZXR1cm4gMTsgLyogRXJyb3IgKi8KKyAgICB9CiAKLQkvKiBTb3J0IGFsbCB0aGUgbGluZXMsIHNvIHRoYXQgaGlnaGVzdCAzLWRpZ2l0IGNvZGVzIGFyZSBmaXJzdCAqLwotCXFzb3J0KCZsaW5lc1swXSwgbkxpbmVzLCBzaXplb2YoY2hhciAqKSwKLQkgICAgICBjb21wYXJlKTsKKyAgICBsaW5lcyA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSAqIGxpbmVzX2J1ZmZlcl9zaXplKTsKKyAgICBpZiAoIWxpbmVzKQorICAgICAgICByZXR1cm4gU3lzdGVtRXJyb3IoMCwgIk91dCBvZiBtZW1vcnkiKTsKIAotCWlmIChJRFlFUyAhPSBNZXNzYWdlQm94KE5VTEwsCi0JCQkJIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmVcbiIKLQkJCQkidGhpcyBwYWNrYWdlIGZyb20geW91ciBjb21wdXRlcj8iLAotCQkJCSJQbGVhc2UgY29uZmlybSIsCi0JCQkJTUJfWUVTTk8gfCBNQl9JQ09OUVVFU1RJT04pKQotCQlyZXR1cm4gMDsKKyAgICAvKiBSZWFkIHRoZSB3aG9sZSBsb2dmaWxlLCByZWFsbG9hY3RpbmcgdGhlIGJ1ZmZlciAqLworICAgIHdoaWxlIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBsb2dmaWxlKSkgeworICAgICAgICBpbnQgbGVuID0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgIC8qIHJlbW92ZSB0cmFpbGluZyB3aGl0ZSBzcGFjZSAqLworICAgICAgICB3aGlsZSAoaXNzcGFjZShidWZmZXJbbGVuLTFdKSkKKyAgICAgICAgICAgIGxlbiAtPSAxOworICAgICAgICBidWZmZXJbbGVuXSA9ICdcMCc7CisgICAgICAgIGxpbmVzW25MaW5lcysrXSA9IHN0cmR1cChidWZmZXIpOworICAgICAgICBpZiAobkxpbmVzID49IGxpbmVzX2J1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICBsaW5lc19idWZmZXJfc2l6ZSArPSAxMDsKKyAgICAgICAgICAgIGxpbmVzID0gKGNoYXIgKiopcmVhbGxvYyhsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhciAqKSAqIGxpbmVzX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgICAgIGlmICghbGluZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFN5c3RlbUVycm9yKDAsICJPdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGxvZ2ZpbGUpOwogCi0JaGtleV9yb290ID0gSEtFWV9MT0NBTF9NQUNISU5FOwotCWNwID0gIiI7Ci0JZm9yIChpID0gMDsgaSA8IG5MaW5lczsgKytpKSB7Ci0JCS8qIElnbm9yZSBkdXBsaWNhdGUgbGluZXMgKi8KLQkJaWYgKHN0cmNtcChjcCwgbGluZXNbaV0pKSB7Ci0JCQlpbnQgaWduOwotCQkJY3AgPSBsaW5lc1tpXTsKLQkJCS8qIFBhcnNlIHRoZSBsaW5lcyAqLwotCQkJaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgUm9vdCBLZXk6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKLQkJCQlpZiAoc3RyY21wKGJ1ZmZlciwgIkhLRVlfQ1VSUkVOVF9VU0VSIik9PTApCi0JCQkJCWhrZXlfcm9vdCA9IEhLRVlfQ1VSUkVOVF9VU0VSOwotCQkJCWVsc2UgewotCQkJCQkvLyBIS0xNIC0gY2hlY2sgdGhleSBoYXZlIHBlcm1pc3Npb25zLgotCQkJCQlpZiAoIUhhc0xvY2FsTWFjaGluZVByaXZzKCkpIHsKLQkJCQkJCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwKLQkJCQkJCQkgICAiWW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgc3VmZmljaWVudCBhY2Nlc3MgcmlnaHRzXG4iCi0JCQkJCQkJICAgIm9uIHRoaXMgbWFjaGluZSB0byB1bmluc3RhbGwgdGhpcyBzb2Z0d2FyZSIsCi0JCQkJCQkJICAgTlVMTCwKLQkJCQkJCQkgICBNQl9PSyB8IE1CX0lDT05TVE9QKTsKLQkJCQkJCXJldHVybiAxOyAvKiBFcnJvciAqLwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIE1hZGUgRGlyOiAlcyIsICZpZ24sICZidWZmZXIpKSB7Ci0JCQkJaWYgKE15UmVtb3ZlRGlyZWN0b3J5KGNwKSkKLQkJCQkJKytuRGlyczsKLQkJCQllbHNlIHsKLQkJCQkJaW50IGNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKLQkJCQkJaWYgKGNvZGUgIT0gMiAmJiBjb2RlICE9IDMpIHsgLyogZmlsZSBvciBwYXRoIG5vdCBmb3VuZCAqLwotCQkJCQkJKytuRXJyb3JzOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIEZpbGUgQ29weTogJXMiLCAmaWduLCAmYnVmZmVyKSkgewotCQkJCWlmIChNeURlbGV0ZUZpbGUoY3ApKQotCQkJCQkrK25GaWxlczsKLQkJCQllbHNlIHsKLQkJCQkJaW50IGNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKLQkJCQkJaWYgKGNvZGUgIT0gMiAmJiBjb2RlICE9IDMpIHsgLyogZmlsZSBvciBwYXRoIG5vdCBmb3VuZCAqLwotCQkJCQkJKytuRXJyb3JzOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIEZpbGUgT3ZlcndyaXRlOiAlcyIsICZpZ24sICZidWZmZXIpKSB7Ci0JCQkJaWYgKE15RGVsZXRlRmlsZShjcCkpCi0JCQkJCSsrbkZpbGVzOwotCQkJCWVsc2UgewotCQkJCQlpbnQgY29kZSA9IEdldExhc3RFcnJvcigpOwotCQkJCQlpZiAoY29kZSAhPSAyICYmIGNvZGUgIT0gMykgeyAvKiBmaWxlIG9yIHBhdGggbm90IGZvdW5kICovCi0JCQkJCQkrK25FcnJvcnM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgUmVnIERCIEtleTogJXMiLCAmaWduLCAmYnVmZmVyKSkgewotCQkJCURlbGV0ZVJlZ2lzdHJ5S2V5KGNwKTsKLQkJCX0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBSZWcgREIgVmFsdWU6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKLQkJCQlEZWxldGVSZWdpc3RyeVZhbHVlKGNwKTsKLQkJCX0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBSdW4gU2NyaXB0OiAlcyIsICZpZ24sICZidWZmZXIpKSB7Ci0JCQkJUnVuX1JlbW92ZVNjcmlwdChjcCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogU29ydCBhbGwgdGhlIGxpbmVzLCBzbyB0aGF0IGhpZ2hlc3QgMy1kaWdpdCBjb2RlcyBhcmUgZmlyc3QgKi8KKyAgICBxc29ydCgmbGluZXNbMF0sIG5MaW5lcywgc2l6ZW9mKGNoYXIgKiksCisgICAgICAgICAgY29tcGFyZSk7CiAKLQlpZiAoRGVsZXRlRmlsZShhcmd2WzJdKSkgewotCQkrK25GaWxlczsKLQl9IGVsc2UgewotCQkrK25FcnJvcnM7Ci0JCVN5c3RlbUVycm9yKEdldExhc3RFcnJvcigpLCBhcmd2WzJdKTsKLQl9Ci0JaWYgKG5FcnJvcnMpCi0JCXdzcHJpbnRmKGJ1ZmZlciwKLQkJCSAiJWQgZmlsZXMgYW5kICVkIGRpcmVjdG9yaWVzIHJlbW92ZWRcbiIKLQkJCSAiJWQgZmlsZXMgb3IgZGlyZWN0b3JpZXMgY291bGQgbm90IGJlIHJlbW92ZWQiLAotCQkJIG5GaWxlcywgbkRpcnMsIG5FcnJvcnMpOwotCWVsc2UKLQkJd3NwcmludGYoYnVmZmVyLCAiJWQgZmlsZXMgYW5kICVkIGRpcmVjdG9yaWVzIHJlbW92ZWQiLAotCQkJIG5GaWxlcywgbkRpcnMpOwotCU1lc3NhZ2VCb3goTlVMTCwgYnVmZmVyLCAiVW5pbnN0YWxsIEZpbmlzaGVkISIsCi0JCSAgIE1CX09LIHwgTUJfSUNPTklORk9STUFUSU9OKTsKLQlyZW1vdmVfZXhlKCk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKElEWUVTICE9IE1lc3NhZ2VCb3goTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHBhY2thZ2UgZnJvbSB5b3VyIGNvbXB1dGVyPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBjb25maXJtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9ZRVNOTyB8IE1CX0lDT05RVUVTVElPTikpCisgICAgICAgIHJldHVybiAwOworCisgICAgaGtleV9yb290ID0gSEtFWV9MT0NBTF9NQUNISU5FOworICAgIGNwID0gIiI7CisgICAgZm9yIChpID0gMDsgaSA8IG5MaW5lczsgKytpKSB7CisgICAgICAgIC8qIElnbm9yZSBkdXBsaWNhdGUgbGluZXMgKi8KKyAgICAgICAgaWYgKHN0cmNtcChjcCwgbGluZXNbaV0pKSB7CisgICAgICAgICAgICBpbnQgaWduOworICAgICAgICAgICAgY3AgPSBsaW5lc1tpXTsKKyAgICAgICAgICAgIC8qIFBhcnNlIHRoZSBsaW5lcyAqLworICAgICAgICAgICAgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgUm9vdCBLZXk6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGJ1ZmZlciwgIkhLRVlfQ1VSUkVOVF9VU0VSIik9PTApCisgICAgICAgICAgICAgICAgICAgIGhrZXlfcm9vdCA9IEhLRVlfQ1VSUkVOVF9VU0VSOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBIS0xNIC0gY2hlY2sgdGhleSBoYXZlIHBlcm1pc3Npb25zLgorICAgICAgICAgICAgICAgICAgICBpZiAoIUhhc0xvY2FsTWFjaGluZVByaXZzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBkbyBub3Qgc2VlbSB0byBoYXZlIHN1ZmZpY2llbnQgYWNjZXNzIHJpZ2h0c1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib24gdGhpcyBtYWNoaW5lIHRvIHVuaW5zdGFsbCB0aGlzIHNvZnR3YXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfT0sgfCBNQl9JQ09OU1RPUCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogRXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBNYWRlIERpcjogJXMiLCAmaWduLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIGlmIChNeVJlbW92ZURpcmVjdG9yeShjcCkpCisgICAgICAgICAgICAgICAgICAgICsrbkRpcnM7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IDIgJiYgY29kZSAhPSAzKSB7IC8qIGZpbGUgb3IgcGF0aCBub3QgZm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICsrbkVycm9yczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBGaWxlIENvcHk6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBpZiAoTXlEZWxldGVGaWxlKGNwKSkKKyAgICAgICAgICAgICAgICAgICAgKytuRmlsZXM7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IDIgJiYgY29kZSAhPSAzKSB7IC8qIGZpbGUgb3IgcGF0aCBub3QgZm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICsrbkVycm9yczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBGaWxlIE92ZXJ3cml0ZTogJXMiLCAmaWduLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIGlmIChNeURlbGV0ZUZpbGUoY3ApKQorICAgICAgICAgICAgICAgICAgICArK25GaWxlczsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gMiAmJiBjb2RlICE9IDMpIHsgLyogZmlsZSBvciBwYXRoIG5vdCBmb3VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKytuRXJyb3JzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIFJlZyBEQiBLZXk6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBEZWxldGVSZWdpc3RyeUtleShjcCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgUmVnIERCIFZhbHVlOiAlcyIsICZpZ24sICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgRGVsZXRlUmVnaXN0cnlWYWx1ZShjcCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgUnVuIFNjcmlwdDogJXMiLCAmaWduLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIFJ1bl9SZW1vdmVTY3JpcHQoY3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKERlbGV0ZUZpbGUoYXJndlsyXSkpIHsKKyAgICAgICAgKytuRmlsZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKytuRXJyb3JzOworICAgICAgICBTeXN0ZW1FcnJvcihHZXRMYXN0RXJyb3IoKSwgYXJndlsyXSk7CisgICAgfQorICAgIGlmIChuRXJyb3JzKQorICAgICAgICB3c3ByaW50ZihidWZmZXIsCisgICAgICAgICAgICAgICAgICIlZCBmaWxlcyBhbmQgJWQgZGlyZWN0b3JpZXMgcmVtb3ZlZFxuIgorICAgICAgICAgICAgICAgICAiJWQgZmlsZXMgb3IgZGlyZWN0b3JpZXMgY291bGQgbm90IGJlIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgICBuRmlsZXMsIG5EaXJzLCBuRXJyb3JzKTsKKyAgICBlbHNlCisgICAgICAgIHdzcHJpbnRmKGJ1ZmZlciwgIiVkIGZpbGVzIGFuZCAlZCBkaXJlY3RvcmllcyByZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgbkZpbGVzLCBuRGlycyk7CisgICAgTWVzc2FnZUJveChOVUxMLCBidWZmZXIsICJVbmluc3RhbGwgRmluaXNoZWQhIiwKKyAgICAgICAgICAgICAgIE1CX09LIHwgTUJfSUNPTklORk9STUFUSU9OKTsKKyAgICByZW1vdmVfZXhlKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludCBXSU5BUEkgV2luTWFpbihISU5TVEFOQ0UgaEluc3QsIEhJTlNUQU5DRSBoUHJldkluc3QsCi0JCSAgICBMUFNUUiBscHN6Q21kTGluZSwgSU5UIG5DbWRTaG93KQorICAgICAgICAgICAgICAgICAgICBMUFNUUiBscHN6Q21kTGluZSwgSU5UIG5DbWRTaG93KQogewotCWV4dGVybiBpbnQgX19hcmdjOwotCWV4dGVybiBjaGFyICoqX19hcmd2OwotCWNoYXIgKmJhc2VuYW1lOworICAgIGV4dGVybiBpbnQgX19hcmdjOworICAgIGV4dGVybiBjaGFyICoqX19hcmd2OworICAgIGNoYXIgKmJhc2VuYW1lOwogCi0JR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgbW9kdWxlbmFtZSwgc2l6ZW9mKG1vZHVsZW5hbWUpKTsKKyAgICBHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBtb2R1bGVuYW1lLCBzaXplb2YobW9kdWxlbmFtZSkpOwogCi0JLyogTWFwIHRoZSBleGVjdXRhYmxlIGZpbGUgdG8gbWVtb3J5ICovCi0JYXJjX2RhdGEgPSBNYXBFeGlzdGluZ0ZpbGUobW9kdWxlbmFtZSwgJmFyY19zaXplKTsKLQlpZiAoIWFyY19kYXRhKSB7Ci0JCVN5c3RlbUVycm9yKEdldExhc3RFcnJvcigpLCAiQ291bGQgbm90IG9wZW4gYXJjaGl2ZSIpOwotCQlyZXR1cm4gMTsKLQl9CisgICAgLyogTWFwIHRoZSBleGVjdXRhYmxlIGZpbGUgdG8gbWVtb3J5ICovCisgICAgYXJjX2RhdGEgPSBNYXBFeGlzdGluZ0ZpbGUobW9kdWxlbmFtZSwgJmFyY19zaXplKTsKKyAgICBpZiAoIWFyY19kYXRhKSB7CisgICAgICAgIFN5c3RlbUVycm9yKEdldExhc3RFcnJvcigpLCAiQ291bGQgbm90IG9wZW4gYXJjaGl2ZSIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQkvKiBPSy4gU28gdGhpcyBwcm9ncmFtIGNhbiBhY3QgYXMgaW5zdGFsbGVyIChzZWxmLWV4dHJhY3RpbmcKLQkgKiB6aXAtZmlsZSwgb3IgYXMgdW5pbnN0YWxsZXIgd2hlbiBzdGFydGVkIHdpdGggJy11IGxvZ2ZpbGUnCi0JICogY29tbWFuZCBsaW5lIGZsYWdzLgotCSAqCi0JICogVGhlIGluc3RhbGxlciBpcyB1c3VhbGx5IHN0YXJ0ZWQgd2l0aG91dCBjb21tYW5kIGxpbmUgZmxhZ3MsCi0JICogYW5kIHRoZSB1bmluc3RhbGxlciBpcyB1c3VhbGx5IHN0YXJ0ZWQgd2l0aCB0aGUgJy11IGxvZ2ZpbGUnCi0JICogZmxhZy4gV2hhdCB0byBkbyBpZiBzb21lIGlubm9jZW50IHVzZXIgZG91YmxlLWNsaWNrcyB0aGUKLQkgKiBleGUtZmlsZT8KLQkgKiBUaGUgZm9sbG93aW5nIGltcGxlbWVudHMgYSBkZWZlbnNpdmUgc3RyYXRlZ3kuLi4KLQkgKi8KKyAgICAvKiBPSy4gU28gdGhpcyBwcm9ncmFtIGNhbiBhY3QgYXMgaW5zdGFsbGVyIChzZWxmLWV4dHJhY3RpbmcKKyAgICAgKiB6aXAtZmlsZSwgb3IgYXMgdW5pbnN0YWxsZXIgd2hlbiBzdGFydGVkIHdpdGggJy11IGxvZ2ZpbGUnCisgICAgICogY29tbWFuZCBsaW5lIGZsYWdzLgorICAgICAqCisgICAgICogVGhlIGluc3RhbGxlciBpcyB1c3VhbGx5IHN0YXJ0ZWQgd2l0aG91dCBjb21tYW5kIGxpbmUgZmxhZ3MsCisgICAgICogYW5kIHRoZSB1bmluc3RhbGxlciBpcyB1c3VhbGx5IHN0YXJ0ZWQgd2l0aCB0aGUgJy11IGxvZ2ZpbGUnCisgICAgICogZmxhZy4gV2hhdCB0byBkbyBpZiBzb21lIGlubm9jZW50IHVzZXIgZG91YmxlLWNsaWNrcyB0aGUKKyAgICAgKiBleGUtZmlsZT8KKyAgICAgKiBUaGUgZm9sbG93aW5nIGltcGxlbWVudHMgYSBkZWZlbnNpdmUgc3RyYXRlZ3kuLi4KKyAgICAgKi8KIAotCS8qIFRyeSB0byBleHRyYWN0IHRoZSBjb25maWd1cmF0aW9uIGRhdGEgaW50byBhIHRlbXBvcmFyeSBmaWxlICovCi0JaWYgKEV4dHJhY3RJbnN0YWxsRGF0YShhcmNfZGF0YSwgYXJjX3NpemUsICZleGVfc2l6ZSwKLQkJCSAgICAgICAmaW5pX2ZpbGUsICZwcmVfaW5zdGFsbF9zY3JpcHQpKQotCQlyZXR1cm4gRG9JbnN0YWxsKCk7CisgICAgLyogVHJ5IHRvIGV4dHJhY3QgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBpbnRvIGEgdGVtcG9yYXJ5IGZpbGUgKi8KKyAgICBpZiAoRXh0cmFjdEluc3RhbGxEYXRhKGFyY19kYXRhLCBhcmNfc2l6ZSwgJmV4ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaV9maWxlLCAmcHJlX2luc3RhbGxfc2NyaXB0KSkKKyAgICAgICAgcmV0dXJuIERvSW5zdGFsbCgpOwogCi0JaWYgKCFpbmlfZmlsZSAmJiBfX2FyZ2MgPiAxKSB7Ci0JCXJldHVybiBEb1VuaW5zdGFsbChfX2FyZ2MsIF9fYXJndik7Ci0JfQorICAgIGlmICghaW5pX2ZpbGUgJiYgX19hcmdjID4gMSkgeworICAgICAgICByZXR1cm4gRG9Vbmluc3RhbGwoX19hcmdjLCBfX2FyZ3YpOworICAgIH0KIAogCi0JYmFzZW5hbWUgPSBzdHJyY2hyKG1vZHVsZW5hbWUsICdcXCcpOwotCWlmIChiYXNlbmFtZSkKLQkJKytiYXNlbmFtZTsKKyAgICBiYXNlbmFtZSA9IHN0cnJjaHIobW9kdWxlbmFtZSwgJ1xcJyk7CisgICAgaWYgKGJhc2VuYW1lKQorICAgICAgICArK2Jhc2VuYW1lOwogCi0JLyogTGFzdCBndWVzcyBhYm91dCB0aGUgcHVycG9zZSBvZiB0aGlzIHByb2dyYW0gKi8KLQlpZiAoYmFzZW5hbWUgJiYgKDAgPT0gc3RybmNtcChiYXNlbmFtZSwgIlJlbW92ZSIsIDYpKSkKLQkJU3lzdGVtRXJyb3IoMCwgIlRoaXMgcHJvZ3JhbSBpcyBub3JtYWxseSBzdGFydGVkIGJ5IHdpbmRvd3MiKTsKLQllbHNlCi0JCVN5c3RlbUVycm9yKDAsICJTZXR1cCBwcm9ncmFtIGludmFsaWQgb3IgZGFtYWdlZCIpOwotCXJldHVybiAxOworICAgIC8qIExhc3QgZ3Vlc3MgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBwcm9ncmFtICovCisgICAgaWYgKGJhc2VuYW1lICYmICgwID09IHN0cm5jbXAoYmFzZW5hbWUsICJSZW1vdmUiLCA2KSkpCisgICAgICAgIFN5c3RlbUVycm9yKDAsICJUaGlzIHByb2dyYW0gaXMgbm9ybWFsbHkgc3RhcnRlZCBieSB3aW5kb3dzIik7CisgICAgZWxzZQorICAgICAgICBTeXN0ZW1FcnJvcigwLCAiU2V0dXAgcHJvZ3JhbSBpbnZhbGlkIG9yIGRhbWFnZWQiKTsKKyAgICByZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL1BDL2NvbmZpZy5jIGIvUEMvY29uZmlnLmMKaW5kZXggNDFmMDU3My4uMzVjNjYwOCAxMDA2NDQKLS0tIGEvUEMvY29uZmlnLmMKKysrIGIvUEMvY29uZmlnLmMKQEAgLTc3LDk0ICs3Nyw5NCBAQAogCiBzdHJ1Y3QgX2luaXR0YWIgX1B5SW1wb3J0X0luaXR0YWJbXSA9IHsKIAotICAgICAgICB7ImFycmF5IiwgaW5pdGFycmF5fSwKLQl7Il9hc3QiLCBpbml0X2FzdH0sCisgICAgeyJhcnJheSIsIGluaXRhcnJheX0sCisgICAgeyJfYXN0IiwgaW5pdF9hc3R9LAogI2lmZGVmIE1TX1dJTkRPV1MKICNpZm5kZWYgTVNfV0lOSTY0Ci0gICAgICAgIHsiYXVkaW9vcCIsIGluaXRhdWRpb29wfSwKKyAgICB7ImF1ZGlvb3AiLCBpbml0YXVkaW9vcH0sCiAjZW5kaWYKICNlbmRpZgotICAgICAgICB7ImJpbmFzY2lpIiwgaW5pdGJpbmFzY2lpfSwKLSAgICAgICAgeyJjbWF0aCIsIGluaXRjbWF0aH0sCi0gICAgICAgIHsiZXJybm8iLCBpbml0ZXJybm99LAotICAgICAgICB7ImZ1dHVyZV9idWlsdGlucyIsIGluaXRmdXR1cmVfYnVpbHRpbnN9LAotICAgICAgICB7ImdjIiwgaW5pdGdjfSwKKyAgICB7ImJpbmFzY2lpIiwgaW5pdGJpbmFzY2lpfSwKKyAgICB7ImNtYXRoIiwgaW5pdGNtYXRofSwKKyAgICB7ImVycm5vIiwgaW5pdGVycm5vfSwKKyAgICB7ImZ1dHVyZV9idWlsdGlucyIsIGluaXRmdXR1cmVfYnVpbHRpbnN9LAorICAgIHsiZ2MiLCBpbml0Z2N9LAogI2lmbmRlZiBNU19XSU5JNjQKLSAgICAgICAgeyJpbWFnZW9wIiwgaW5pdGltYWdlb3B9LAorICAgIHsiaW1hZ2VvcCIsIGluaXRpbWFnZW9wfSwKICNlbmRpZgotICAgICAgICB7Im1hdGgiLCBpbml0bWF0aH0sCi0gICAgICAgIHsiX21kNSIsIGluaXRfbWQ1fSwKLSAgICAgICAgeyJudCIsIGluaXRudH0sIC8qIFVzZSB0aGUgTlQgb3MgZnVuY3Rpb25zLCBub3QgcG9zaXggKi8KLSAgICAgICAgeyJvcGVyYXRvciIsIGluaXRvcGVyYXRvcn0sCi0gICAgICAgIHsic2lnbmFsIiwgaW5pdHNpZ25hbH0sCi0gICAgICAgIHsiX3NoYSIsIGluaXRfc2hhfSwKLSAgICAgICAgeyJfc2hhMjU2IiwgaW5pdF9zaGEyNTZ9LAotICAgICAgICB7Il9zaGE1MTIiLCBpbml0X3NoYTUxMn0sCi0gICAgICAgIHsic3Ryb3AiLCBpbml0c3Ryb3B9LAotICAgICAgICB7InRpbWUiLCBpbml0dGltZX0sCisgICAgeyJtYXRoIiwgaW5pdG1hdGh9LAorICAgIHsiX21kNSIsIGluaXRfbWQ1fSwKKyAgICB7Im50IiwgaW5pdG50fSwgLyogVXNlIHRoZSBOVCBvcyBmdW5jdGlvbnMsIG5vdCBwb3NpeCAqLworICAgIHsib3BlcmF0b3IiLCBpbml0b3BlcmF0b3J9LAorICAgIHsic2lnbmFsIiwgaW5pdHNpZ25hbH0sCisgICAgeyJfc2hhIiwgaW5pdF9zaGF9LAorICAgIHsiX3NoYTI1NiIsIGluaXRfc2hhMjU2fSwKKyAgICB7Il9zaGE1MTIiLCBpbml0X3NoYTUxMn0sCisgICAgeyJzdHJvcCIsIGluaXRzdHJvcH0sCisgICAgeyJ0aW1lIiwgaW5pdHRpbWV9LAogI2lmZGVmIFdJVEhfVEhSRUFECi0gICAgICAgIHsidGhyZWFkIiwgaW5pdHRocmVhZH0sCisgICAgeyJ0aHJlYWQiLCBpbml0dGhyZWFkfSwKICNlbmRpZgotICAgICAgICB7ImNTdHJpbmdJTyIsIGluaXRjU3RyaW5nSU99LAotICAgICAgICB7ImNQaWNrbGUiLCBpbml0Y1BpY2tsZX0sCisgICAgeyJjU3RyaW5nSU8iLCBpbml0Y1N0cmluZ0lPfSwKKyAgICB7ImNQaWNrbGUiLCBpbml0Y1BpY2tsZX0sCiAjaWZkZWYgV0lOMzIKLSAgICAgICAgeyJtc3ZjcnQiLCBpbml0bXN2Y3J0fSwKLSAgICAgICAgeyJfbG9jYWxlIiwgaW5pdF9sb2NhbGV9LAorICAgIHsibXN2Y3J0IiwgaW5pdG1zdmNydH0sCisgICAgeyJfbG9jYWxlIiwgaW5pdF9sb2NhbGV9LAogI2VuZGlmCi0JLyogWFhYIFNob3VsZCBfc3VicHJvY2VzcyBnbyBpbiBhIFdJTjMyIGJsb2NrPyAgbm90IFdJTjY0PyAqLwotCXsiX3N1YnByb2Nlc3MiLCBpbml0X3N1YnByb2Nlc3N9LAorICAgIC8qIFhYWCBTaG91bGQgX3N1YnByb2Nlc3MgZ28gaW4gYSBXSU4zMiBibG9jaz8gIG5vdCBXSU42ND8gKi8KKyAgICB7Il9zdWJwcm9jZXNzIiwgaW5pdF9zdWJwcm9jZXNzfSwKIAotICAgICAgICB7Il9jb2RlY3MiLCBpbml0X2NvZGVjc30sCi0JeyJfd2Vha3JlZiIsIGluaXRfd2Vha3JlZn0sCi0JeyJfaG90c2hvdCIsIGluaXRfaG90c2hvdH0sCi0JeyJfcmFuZG9tIiwgaW5pdF9yYW5kb219LAotICAgICAgICB7Il9iaXNlY3QiLCBpbml0X2Jpc2VjdH0sCi0gICAgICAgIHsiX2hlYXBxIiwgaW5pdF9oZWFwcX0sCi0JeyJfbHNwcm9mIiwgaW5pdF9sc3Byb2Z9LAotCXsiaXRlcnRvb2xzIiwgaW5pdGl0ZXJ0b29sc30sCi0gICAgICAgIHsiX2NvbGxlY3Rpb25zIiwgaW5pdF9jb2xsZWN0aW9uc30sCi0JeyJfc3ltdGFibGUiLCBpbml0X3N5bXRhYmxlfSwKLQl7Im1tYXAiLCBpbml0bW1hcH0sCi0JeyJfY3N2IiwgaW5pdF9jc3Z9LAotCXsiX3NyZSIsIGluaXRfc3JlfSwKLQl7InBhcnNlciIsIGluaXRwYXJzZXJ9LAotCXsiX3dpbnJlZyIsIGluaXRfd2lucmVnfSwKLQl7Il9zdHJ1Y3QiLCBpbml0X3N0cnVjdH0sCi0JeyJkYXRldGltZSIsIGluaXRkYXRldGltZX0sCi0JeyJfZnVuY3Rvb2xzIiwgaW5pdF9mdW5jdG9vbHN9LAotCXsiX2pzb24iLCBpbml0X2pzb259LAorICAgIHsiX2NvZGVjcyIsIGluaXRfY29kZWNzfSwKKyAgICB7Il93ZWFrcmVmIiwgaW5pdF93ZWFrcmVmfSwKKyAgICB7Il9ob3RzaG90IiwgaW5pdF9ob3RzaG90fSwKKyAgICB7Il9yYW5kb20iLCBpbml0X3JhbmRvbX0sCisgICAgeyJfYmlzZWN0IiwgaW5pdF9iaXNlY3R9LAorICAgIHsiX2hlYXBxIiwgaW5pdF9oZWFwcX0sCisgICAgeyJfbHNwcm9mIiwgaW5pdF9sc3Byb2Z9LAorICAgIHsiaXRlcnRvb2xzIiwgaW5pdGl0ZXJ0b29sc30sCisgICAgeyJfY29sbGVjdGlvbnMiLCBpbml0X2NvbGxlY3Rpb25zfSwKKyAgICB7Il9zeW10YWJsZSIsIGluaXRfc3ltdGFibGV9LAorICAgIHsibW1hcCIsIGluaXRtbWFwfSwKKyAgICB7Il9jc3YiLCBpbml0X2Nzdn0sCisgICAgeyJfc3JlIiwgaW5pdF9zcmV9LAorICAgIHsicGFyc2VyIiwgaW5pdHBhcnNlcn0sCisgICAgeyJfd2lucmVnIiwgaW5pdF93aW5yZWd9LAorICAgIHsiX3N0cnVjdCIsIGluaXRfc3RydWN0fSwKKyAgICB7ImRhdGV0aW1lIiwgaW5pdGRhdGV0aW1lfSwKKyAgICB7Il9mdW5jdG9vbHMiLCBpbml0X2Z1bmN0b29sc30sCisgICAgeyJfanNvbiIsIGluaXRfanNvbn0sCiAKLQl7Inh4c3VidHlwZSIsIGluaXR4eHN1YnR5cGV9LAotCXsiemlwaW1wb3J0IiwgaW5pdHppcGltcG9ydH0sCi0JeyJ6bGliIiwgaW5pdHpsaWJ9LAotCQotCS8qIENKSyBjb2RlY3MgKi8KLQl7Il9tdWx0aWJ5dGVjb2RlYyIsIGluaXRfbXVsdGlieXRlY29kZWN9LAotCXsiX2NvZGVjc19jbiIsIGluaXRfY29kZWNzX2NufSwKLQl7Il9jb2RlY3NfaGsiLCBpbml0X2NvZGVjc19oa30sCi0JeyJfY29kZWNzX2lzbzIwMjIiLCBpbml0X2NvZGVjc19pc28yMDIyfSwKLQl7Il9jb2RlY3NfanAiLCBpbml0X2NvZGVjc19qcH0sCi0JeyJfY29kZWNzX2tyIiwgaW5pdF9jb2RlY3Nfa3J9LAotCXsiX2NvZGVjc190dyIsIGluaXRfY29kZWNzX3R3fSwKKyAgICB7Inh4c3VidHlwZSIsIGluaXR4eHN1YnR5cGV9LAorICAgIHsiemlwaW1wb3J0IiwgaW5pdHppcGltcG9ydH0sCisgICAgeyJ6bGliIiwgaW5pdHpsaWJ9LAorCisgICAgLyogQ0pLIGNvZGVjcyAqLworICAgIHsiX211bHRpYnl0ZWNvZGVjIiwgaW5pdF9tdWx0aWJ5dGVjb2RlY30sCisgICAgeyJfY29kZWNzX2NuIiwgaW5pdF9jb2RlY3NfY259LAorICAgIHsiX2NvZGVjc19oayIsIGluaXRfY29kZWNzX2hrfSwKKyAgICB7Il9jb2RlY3NfaXNvMjAyMiIsIGluaXRfY29kZWNzX2lzbzIwMjJ9LAorICAgIHsiX2NvZGVjc19qcCIsIGluaXRfY29kZWNzX2pwfSwKKyAgICB7Il9jb2RlY3Nfa3IiLCBpbml0X2NvZGVjc19rcn0sCisgICAgeyJfY29kZWNzX3R3IiwgaW5pdF9jb2RlY3NfdHd9LAogCiAvKiB0b29scy9mcmVlemUvbWFrZWNvbmZpZy5weSBtYXJrZXIgZm9yIGFkZGl0aW9uYWwgIl9pbml0dGFiIiBlbnRyaWVzICovCiAvKiAtLSBBRERNT0RVTEUgTUFSS0VSIDIgLS0gKi8KIAotICAgICAgICAvKiBUaGlzIG1vZHVsZSAibGl2ZXMgaW4iIHdpdGggbWFyc2hhbC5jICovCi0gICAgICAgIHsibWFyc2hhbCIsIFB5TWFyc2hhbF9Jbml0fSwKKyAgICAvKiBUaGlzIG1vZHVsZSAibGl2ZXMgaW4iIHdpdGggbWFyc2hhbC5jICovCisgICAgeyJtYXJzaGFsIiwgUHlNYXJzaGFsX0luaXR9LAogCi0gICAgICAgIC8qIFRoaXMgbGl2ZXMgaXQgd2l0aCBpbXBvcnQuYyAqLwotICAgICAgICB7ImltcCIsIGluaXRpbXB9LAorICAgIC8qIFRoaXMgbGl2ZXMgaXQgd2l0aCBpbXBvcnQuYyAqLworICAgIHsiaW1wIiwgaW5pdGltcH0sCiAKLSAgICAgICAgLyogVGhlc2UgZW50cmllcyBhcmUgaGVyZSBmb3Igc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzICovCi0gICAgICAgIHsiX19tYWluX18iLCBOVUxMfSwKLSAgICAgICAgeyJfX2J1aWx0aW5fXyIsIE5VTEx9LAotICAgICAgICB7InN5cyIsIE5VTEx9LAotCXsiZXhjZXB0aW9ucyIsIE5VTEx9LAotICAgICAgICB7Il93YXJuaW5ncyIsIF9QeVdhcm5pbmdzX0luaXR9LAorICAgIC8qIFRoZXNlIGVudHJpZXMgYXJlIGhlcmUgZm9yIHN5cy5idWlsdGluX21vZHVsZV9uYW1lcyAqLworICAgIHsiX19tYWluX18iLCBOVUxMfSwKKyAgICB7Il9fYnVpbHRpbl9fIiwgTlVMTH0sCisgICAgeyJzeXMiLCBOVUxMfSwKKyAgICB7ImV4Y2VwdGlvbnMiLCBOVUxMfSwKKyAgICB7Il93YXJuaW5ncyIsIF9QeVdhcm5pbmdzX0luaXR9LAogCi0gICAgICAgIHsiX2lvIiwgaW5pdF9pb30sCisgICAgeyJfaW8iLCBpbml0X2lvfSwKIAotICAgICAgICAvKiBTZW50aW5lbCAqLwotICAgICAgICB7MCwgMH0KKyAgICAvKiBTZW50aW5lbCAqLworICAgIHswLCAwfQogfTsKZGlmZiAtLWdpdCBhL1BDL2RsX250LmMgYi9QQy9kbF9udC5jCmluZGV4IGY4YWY4MDIuLmVmMWNlMDkgMTAwNjQ0Ci0tLSBhL1BDL2RsX250LmMKKysrIGIvUEMvZGxfbnQuYwpAQCAtMyw3ICszLDcgQEAKIEVudHJ5IHBvaW50IGZvciB0aGUgV2luZG93cyBOVCBETEwuCiAKIEFib3V0IHRoZSBvbmx5IHJlYXNvbiBmb3IgaGF2aW5nIHRoaXMsIGlzIHNvIGluaXRhbGwoKSBjYW4gYXV0b21hdGljYWxseQotYmUgY2FsbGVkLCByZW1vdmluZyB0aGF0IGJ1cmRlbiAoYW5kIHBvc3NpYmxlIHNvdXJjZSBvZiBmcnVzdHJhdGlvbiBpZiAKK2JlIGNhbGxlZCwgcmVtb3ZpbmcgdGhhdCBidXJkZW4gKGFuZCBwb3NzaWJsZSBzb3VyY2Ugb2YgZnJ1c3RyYXRpb24gaWYKIGZvcmdvdHRlbikgZnJvbSB0aGUgcHJvZ3JhbW1lci4KIAogKi8KQEAgLTQ2LDYxICs0Niw2MSBAQAogCiB2b2lkIF9Mb2FkQWN0Q3R4UG9pbnRlcnMoKQogewotCUhJTlNUQU5DRSBoS2VybmVsMzIgPSBHZXRNb2R1bGVIYW5kbGVXKEwia2VybmVsMzIuZGxsIik7Ci0JaWYgKGhLZXJuZWwzMikKLQkJcGZuR2V0Q3VycmVudEFjdEN0eCA9IChQRk5fR0VUQ1VSUkVOVEFDVENUWCkgR2V0UHJvY0FkZHJlc3MoaEtlcm5lbDMyLCAiR2V0Q3VycmVudEFjdEN0eCIpOwotCS8vIElmIHdlIGNhbid0IGxvYWQgR2V0Q3VycmVudEFjdEN0eCAoaWUsIHByZSBYUCkgLCBkb24ndCBib3RoZXIgd2l0aCB0aGUgcmVzdC4KLQlpZiAocGZuR2V0Q3VycmVudEFjdEN0eCkgewotCQlwZm5BY3RpdmF0ZUFjdEN0eCA9IChQRk5fQUNUSVZBVEVBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkFjdGl2YXRlQWN0Q3R4Iik7Ci0JCXBmbkRlYWN0aXZhdGVBY3RDdHggPSAoUEZOX0RFQUNUSVZBVEVBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkRlYWN0aXZhdGVBY3RDdHgiKTsKLQkJcGZuQWRkUmVmQWN0Q3R4ID0gKFBGTl9BRERSRUZBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkFkZFJlZkFjdEN0eCIpOwotCQlwZm5SZWxlYXNlQWN0Q3R4ID0gKFBGTl9SRUxFQVNFQUNUQ1RYKSBHZXRQcm9jQWRkcmVzcyhoS2VybmVsMzIsICJSZWxlYXNlQWN0Q3R4Iik7Ci0JfQorICAgIEhJTlNUQU5DRSBoS2VybmVsMzIgPSBHZXRNb2R1bGVIYW5kbGVXKEwia2VybmVsMzIuZGxsIik7CisgICAgaWYgKGhLZXJuZWwzMikKKyAgICAgICAgcGZuR2V0Q3VycmVudEFjdEN0eCA9IChQRk5fR0VUQ1VSUkVOVEFDVENUWCkgR2V0UHJvY0FkZHJlc3MoaEtlcm5lbDMyLCAiR2V0Q3VycmVudEFjdEN0eCIpOworICAgIC8vIElmIHdlIGNhbid0IGxvYWQgR2V0Q3VycmVudEFjdEN0eCAoaWUsIHByZSBYUCkgLCBkb24ndCBib3RoZXIgd2l0aCB0aGUgcmVzdC4KKyAgICBpZiAocGZuR2V0Q3VycmVudEFjdEN0eCkgeworICAgICAgICBwZm5BY3RpdmF0ZUFjdEN0eCA9IChQRk5fQUNUSVZBVEVBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkFjdGl2YXRlQWN0Q3R4Iik7CisgICAgICAgIHBmbkRlYWN0aXZhdGVBY3RDdHggPSAoUEZOX0RFQUNUSVZBVEVBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkRlYWN0aXZhdGVBY3RDdHgiKTsKKyAgICAgICAgcGZuQWRkUmVmQWN0Q3R4ID0gKFBGTl9BRERSRUZBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIkFkZFJlZkFjdEN0eCIpOworICAgICAgICBwZm5SZWxlYXNlQWN0Q3R4ID0gKFBGTl9SRUxFQVNFQUNUQ1RYKSBHZXRQcm9jQWRkcmVzcyhoS2VybmVsMzIsICJSZWxlYXNlQWN0Q3R4Iik7CisgICAgfQogfQogCiBVTE9OR19QVFIgX1B5X0FjdGl2YXRlQWN0Q3R4KCkKIHsKLQlVTE9OR19QVFIgcmV0ID0gMDsKLQlpZiAoUHlXaW5fRExMaEFjdGl2YXRpb25Db250ZXh0ICYmIHBmbkFjdGl2YXRlQWN0Q3R4KQotCQlpZiAoISgqcGZuQWN0aXZhdGVBY3RDdHgpKFB5V2luX0RMTGhBY3RpdmF0aW9uQ29udGV4dCwgJnJldCkpIHsKLQkJCU91dHB1dERlYnVnU3RyaW5nKCJQeXRob24gZmFpbGVkIHRvIGFjdGl2YXRlIHRoZSBhY3RpdmF0aW9uIGNvbnRleHQgYmVmb3JlIGxvYWRpbmcgYSBETExcbiIpOwotCQkJcmV0ID0gMDsgLy8gbm8gcHJvbWlzZSB0aGUgZmFpbGluZyBmdW5jdGlvbiBkaWRuJ3QgY2hhbmdlIGl0IQotCQl9Ci0JcmV0dXJuIHJldDsKKyAgICBVTE9OR19QVFIgcmV0ID0gMDsKKyAgICBpZiAoUHlXaW5fRExMaEFjdGl2YXRpb25Db250ZXh0ICYmIHBmbkFjdGl2YXRlQWN0Q3R4KQorICAgICAgICBpZiAoISgqcGZuQWN0aXZhdGVBY3RDdHgpKFB5V2luX0RMTGhBY3RpdmF0aW9uQ29udGV4dCwgJnJldCkpIHsKKyAgICAgICAgICAgIE91dHB1dERlYnVnU3RyaW5nKCJQeXRob24gZmFpbGVkIHRvIGFjdGl2YXRlIHRoZSBhY3RpdmF0aW9uIGNvbnRleHQgYmVmb3JlIGxvYWRpbmcgYSBETExcbiIpOworICAgICAgICAgICAgcmV0ID0gMDsgLy8gbm8gcHJvbWlzZSB0aGUgZmFpbGluZyBmdW5jdGlvbiBkaWRuJ3QgY2hhbmdlIGl0IQorICAgICAgICB9CisgICAgcmV0dXJuIHJldDsKIH0KIAogdm9pZCBfUHlfRGVhY3RpdmF0ZUFjdEN0eChVTE9OR19QVFIgY29va2llKQogewotCWlmIChjb29raWUgJiYgcGZuRGVhY3RpdmF0ZUFjdEN0eCkKLQkJaWYgKCEoKnBmbkRlYWN0aXZhdGVBY3RDdHgpKDAsIGNvb2tpZSkpCi0JCQlPdXRwdXREZWJ1Z1N0cmluZygiUHl0aG9uIGZhaWxlZCB0byBkZS1hY3RpdmF0ZSB0aGUgYWN0aXZhdGlvbiBjb250ZXh0XG4iKTsKKyAgICBpZiAoY29va2llICYmIHBmbkRlYWN0aXZhdGVBY3RDdHgpCisgICAgICAgIGlmICghKCpwZm5EZWFjdGl2YXRlQWN0Q3R4KSgwLCBjb29raWUpKQorICAgICAgICAgICAgT3V0cHV0RGVidWdTdHJpbmcoIlB5dGhvbiBmYWlsZWQgdG8gZGUtYWN0aXZhdGUgdGhlIGFjdGl2YXRpb24gY29udGV4dFxuIik7CiB9CiAKLUJPT0wJV0lOQVBJCURsbE1haW4gKEhBTkRMRSBoSW5zdCwgCi0JCQkJCQlVTE9ORyB1bF9yZWFzb25fZm9yX2NhbGwsCi0JCQkJCQlMUFZPSUQgbHBSZXNlcnZlZCkKK0JPT0wgICAgV0lOQVBJICBEbGxNYWluIChIQU5ETEUgaEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyB1bF9yZWFzb25fZm9yX2NhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBSZXNlcnZlZCkKIHsKLQlzd2l0Y2ggKHVsX3JlYXNvbl9mb3JfY2FsbCkKLQl7Ci0JCWNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgotCQkJUHlXaW5fRExMaE1vZHVsZSA9IGhJbnN0OwotCQkJLy8gMTAwMCBpcyBhIG1hZ2ljIG51bWJlciBJIHBpY2tlZCBvdXQgb2YgdGhlIGFpci4gIENvdWxkIGRvIHdpdGggYSAjZGVmaW5lLCBJIHNwb3NlLi4uCi0JCQlMb2FkU3RyaW5nKGhJbnN0LCAxMDAwLCBkbGxWZXJzaW9uQnVmZmVyLCBzaXplb2YoZGxsVmVyc2lvbkJ1ZmZlcikpOworICAgIHN3aXRjaCAodWxfcmVhc29uX2Zvcl9jYWxsKQorICAgIHsKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgICAgICBQeVdpbl9ETExoTW9kdWxlID0gaEluc3Q7CisgICAgICAgICAgICAvLyAxMDAwIGlzIGEgbWFnaWMgbnVtYmVyIEkgcGlja2VkIG91dCBvZiB0aGUgYWlyLiAgQ291bGQgZG8gd2l0aCBhICNkZWZpbmUsIEkgc3Bvc2UuLi4KKyAgICAgICAgICAgIExvYWRTdHJpbmcoaEluc3QsIDEwMDAsIGRsbFZlcnNpb25CdWZmZXIsIHNpemVvZihkbGxWZXJzaW9uQnVmZmVyKSk7CiAKLQkJCS8vIGFuZCBjYXB0dXJlIG91ciBhY3RpdmF0aW9uIGNvbnRleHQgZm9yIHVzZSB3aGVuIGxvYWRpbmcgZXh0ZW5zaW9ucy4KLQkJCV9Mb2FkQWN0Q3R4UG9pbnRlcnMoKTsKLQkJCWlmIChwZm5HZXRDdXJyZW50QWN0Q3R4ICYmIHBmbkFkZFJlZkFjdEN0eCkKLQkJCQlpZiAoKCpwZm5HZXRDdXJyZW50QWN0Q3R4KSgmUHlXaW5fRExMaEFjdGl2YXRpb25Db250ZXh0KSkKLQkJCQkJaWYgKCEoKnBmbkFkZFJlZkFjdEN0eCkoUHlXaW5fRExMaEFjdGl2YXRpb25Db250ZXh0KSkKLQkJCQkJCU91dHB1dERlYnVnU3RyaW5nKCJQeXRob24gZmFpbGVkIHRvIGxvYWQgdGhlIGRlZmF1bHQgYWN0aXZhdGlvbiBjb250ZXh0XG4iKTsKLQkJCWJyZWFrOworICAgICAgICAgICAgLy8gYW5kIGNhcHR1cmUgb3VyIGFjdGl2YXRpb24gY29udGV4dCBmb3IgdXNlIHdoZW4gbG9hZGluZyBleHRlbnNpb25zLgorICAgICAgICAgICAgX0xvYWRBY3RDdHhQb2ludGVycygpOworICAgICAgICAgICAgaWYgKHBmbkdldEN1cnJlbnRBY3RDdHggJiYgcGZuQWRkUmVmQWN0Q3R4KQorICAgICAgICAgICAgICAgIGlmICgoKnBmbkdldEN1cnJlbnRBY3RDdHgpKCZQeVdpbl9ETExoQWN0aXZhdGlvbkNvbnRleHQpKQorICAgICAgICAgICAgICAgICAgICBpZiAoISgqcGZuQWRkUmVmQWN0Q3R4KShQeVdpbl9ETExoQWN0aXZhdGlvbkNvbnRleHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0RGVidWdTdHJpbmcoIlB5dGhvbiBmYWlsZWQgdG8gbG9hZCB0aGUgZGVmYXVsdCBhY3RpdmF0aW9uIGNvbnRleHRcbiIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6Ci0JCQlpZiAocGZuUmVsZWFzZUFjdEN0eCkKLQkJCQkoKnBmblJlbGVhc2VBY3RDdHgpKFB5V2luX0RMTGhBY3RpdmF0aW9uQ29udGV4dCk7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgICAgICAgICAgaWYgKHBmblJlbGVhc2VBY3RDdHgpCisgICAgICAgICAgICAgICAgKCpwZm5SZWxlYXNlQWN0Q3R4KShQeVdpbl9ETExoQWN0aXZhdGlvbkNvbnRleHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQogCiAjZW5kaWYgLyogUHlfRU5BQkxFX1NIQVJFRCAqLwpkaWZmIC0tZ2l0IGEvUEMvZXJybWFwLmggYi9QQy9lcnJtYXAuaAppbmRleCA1OWFlZWExLi5kMjI1YWE0IDEwMDY0NAotLS0gYS9QQy9lcnJtYXAuaAorKysgYi9QQy9lcnJtYXAuaApAQCAtMSw3OCArMSw3OCBAQAogLyogR2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0LiAqLwogaW50IHdpbmVycm9yX3RvX2Vycm5vKGludCB3aW5lcnJvcikKIHsKLQlzd2l0Y2god2luZXJyb3IpIHsKLQkJY2FzZSAyOiByZXR1cm4gMjsKLQkJY2FzZSAzOiByZXR1cm4gMjsKLQkJY2FzZSA0OiByZXR1cm4gMjQ7Ci0JCWNhc2UgNTogcmV0dXJuIDEzOwotCQljYXNlIDY6IHJldHVybiA5OwotCQljYXNlIDc6IHJldHVybiAxMjsKLQkJY2FzZSA4OiByZXR1cm4gMTI7Ci0JCWNhc2UgOTogcmV0dXJuIDEyOwotCQljYXNlIDEwOiByZXR1cm4gNzsKLQkJY2FzZSAxMTogcmV0dXJuIDg7Ci0JCWNhc2UgMTU6IHJldHVybiAyOwotCQljYXNlIDE2OiByZXR1cm4gMTM7Ci0JCWNhc2UgMTc6IHJldHVybiAxODsKLQkJY2FzZSAxODogcmV0dXJuIDI7Ci0JCWNhc2UgMTk6IHJldHVybiAxMzsKLQkJY2FzZSAyMDogcmV0dXJuIDEzOwotCQljYXNlIDIxOiByZXR1cm4gMTM7Ci0JCWNhc2UgMjI6IHJldHVybiAxMzsKLQkJY2FzZSAyMzogcmV0dXJuIDEzOwotCQljYXNlIDI0OiByZXR1cm4gMTM7Ci0JCWNhc2UgMjU6IHJldHVybiAxMzsKLQkJY2FzZSAyNjogcmV0dXJuIDEzOwotCQljYXNlIDI3OiByZXR1cm4gMTM7Ci0JCWNhc2UgMjg6IHJldHVybiAxMzsKLQkJY2FzZSAyOTogcmV0dXJuIDEzOwotCQljYXNlIDMwOiByZXR1cm4gMTM7Ci0JCWNhc2UgMzE6IHJldHVybiAxMzsKLQkJY2FzZSAzMjogcmV0dXJuIDEzOwotCQljYXNlIDMzOiByZXR1cm4gMTM7Ci0JCWNhc2UgMzQ6IHJldHVybiAxMzsKLQkJY2FzZSAzNTogcmV0dXJuIDEzOwotCQljYXNlIDM2OiByZXR1cm4gMTM7Ci0JCWNhc2UgNTM6IHJldHVybiAyOwotCQljYXNlIDY1OiByZXR1cm4gMTM7Ci0JCWNhc2UgNjc6IHJldHVybiAyOwotCQljYXNlIDgwOiByZXR1cm4gMTc7Ci0JCWNhc2UgODI6IHJldHVybiAxMzsKLQkJY2FzZSA4MzogcmV0dXJuIDEzOwotCQljYXNlIDg5OiByZXR1cm4gMTE7Ci0JCWNhc2UgMTA4OiByZXR1cm4gMTM7Ci0JCWNhc2UgMTA5OiByZXR1cm4gMzI7Ci0JCWNhc2UgMTEyOiByZXR1cm4gMjg7Ci0JCWNhc2UgMTE0OiByZXR1cm4gOTsKLQkJY2FzZSAxMjg6IHJldHVybiAxMDsKLQkJY2FzZSAxMjk6IHJldHVybiAxMDsKLQkJY2FzZSAxMzA6IHJldHVybiA5OwotCQljYXNlIDEzMjogcmV0dXJuIDEzOwotCQljYXNlIDE0NTogcmV0dXJuIDQxOwotCQljYXNlIDE1ODogcmV0dXJuIDEzOwotCQljYXNlIDE2MTogcmV0dXJuIDI7Ci0JCWNhc2UgMTY0OiByZXR1cm4gMTE7Ci0JCWNhc2UgMTY3OiByZXR1cm4gMTM7Ci0JCWNhc2UgMTgzOiByZXR1cm4gMTc7Ci0JCWNhc2UgMTg4OiByZXR1cm4gODsKLQkJY2FzZSAxODk6IHJldHVybiA4OwotCQljYXNlIDE5MDogcmV0dXJuIDg7Ci0JCWNhc2UgMTkxOiByZXR1cm4gODsKLQkJY2FzZSAxOTI6IHJldHVybiA4OwotCQljYXNlIDE5MzogcmV0dXJuIDg7Ci0JCWNhc2UgMTk0OiByZXR1cm4gODsKLQkJY2FzZSAxOTU6IHJldHVybiA4OwotCQljYXNlIDE5NjogcmV0dXJuIDg7Ci0JCWNhc2UgMTk3OiByZXR1cm4gODsKLQkJY2FzZSAxOTg6IHJldHVybiA4OwotCQljYXNlIDE5OTogcmV0dXJuIDg7Ci0JCWNhc2UgMjAwOiByZXR1cm4gODsKLQkJY2FzZSAyMDE6IHJldHVybiA4OwotCQljYXNlIDIwMjogcmV0dXJuIDg7Ci0JCWNhc2UgMjA2OiByZXR1cm4gMjsKLQkJY2FzZSAyMTU6IHJldHVybiAxMTsKLQkJY2FzZSAxODE2OiByZXR1cm4gMTI7Ci0JCWRlZmF1bHQ6IHJldHVybiBFSU5WQUw7Ci0JfQorICAgIHN3aXRjaCh3aW5lcnJvcikgeworICAgICAgICBjYXNlIDI6IHJldHVybiAyOworICAgICAgICBjYXNlIDM6IHJldHVybiAyOworICAgICAgICBjYXNlIDQ6IHJldHVybiAyNDsKKyAgICAgICAgY2FzZSA1OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgNjogcmV0dXJuIDk7CisgICAgICAgIGNhc2UgNzogcmV0dXJuIDEyOworICAgICAgICBjYXNlIDg6IHJldHVybiAxMjsKKyAgICAgICAgY2FzZSA5OiByZXR1cm4gMTI7CisgICAgICAgIGNhc2UgMTA6IHJldHVybiA3OworICAgICAgICBjYXNlIDExOiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxNTogcmV0dXJuIDI7CisgICAgICAgIGNhc2UgMTY6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAxNzogcmV0dXJuIDE4OworICAgICAgICBjYXNlIDE4OiByZXR1cm4gMjsKKyAgICAgICAgY2FzZSAxOTogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDIwOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMjE6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAyMjogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDIzOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMjQ6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAyNTogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDI2OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMjc6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAyODogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDI5OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMzA6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAzMTogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDMyOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMzM6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAzNDogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDM1OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMzY6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSA1MzogcmV0dXJuIDI7CisgICAgICAgIGNhc2UgNjU6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSA2NzogcmV0dXJuIDI7CisgICAgICAgIGNhc2UgODA6IHJldHVybiAxNzsKKyAgICAgICAgY2FzZSA4MjogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDgzOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgODk6IHJldHVybiAxMTsKKyAgICAgICAgY2FzZSAxMDg6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAxMDk6IHJldHVybiAzMjsKKyAgICAgICAgY2FzZSAxMTI6IHJldHVybiAyODsKKyAgICAgICAgY2FzZSAxMTQ6IHJldHVybiA5OworICAgICAgICBjYXNlIDEyODogcmV0dXJuIDEwOworICAgICAgICBjYXNlIDEyOTogcmV0dXJuIDEwOworICAgICAgICBjYXNlIDEzMDogcmV0dXJuIDk7CisgICAgICAgIGNhc2UgMTMyOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMTQ1OiByZXR1cm4gNDE7CisgICAgICAgIGNhc2UgMTU4OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMTYxOiByZXR1cm4gMjsKKyAgICAgICAgY2FzZSAxNjQ6IHJldHVybiAxMTsKKyAgICAgICAgY2FzZSAxNjc6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAxODM6IHJldHVybiAxNzsKKyAgICAgICAgY2FzZSAxODg6IHJldHVybiA4OworICAgICAgICBjYXNlIDE4OTogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTkwOiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxOTE6IHJldHVybiA4OworICAgICAgICBjYXNlIDE5MjogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTkzOiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxOTQ6IHJldHVybiA4OworICAgICAgICBjYXNlIDE5NTogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTk2OiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxOTc6IHJldHVybiA4OworICAgICAgICBjYXNlIDE5ODogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTk5OiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAyMDA6IHJldHVybiA4OworICAgICAgICBjYXNlIDIwMTogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMjAyOiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAyMDY6IHJldHVybiAyOworICAgICAgICBjYXNlIDIxNTogcmV0dXJuIDExOworICAgICAgICBjYXNlIDE4MTY6IHJldHVybiAxMjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIEVJTlZBTDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9QQy9mcm96ZW5fZGxsbWFpbi5jIGIvUEMvZnJvemVuX2RsbG1haW4uYwppbmRleCBmYmI0NzEzLi5hOGNjODg1IDEwMDY0NAotLS0gYS9QQy9mcm96ZW5fZGxsbWFpbi5jCisrKyBiL1BDL2Zyb3plbl9kbGxtYWluLmMKQEAgLTksNyArOSw3IEBACiAKIFRoZSBzb2x1dGlvbiBpczoKICogRWFjaCBtb2R1bGUgY2hlY2tzIGZvciBhIGZyb3plbiBidWlsZCwgYW5kIGlmIHNvLCBkZWZpbmVzIGl0cyBETExNYWluCi0gIGZ1bmN0aW9uIGFzICJfX2RlY2xzcGVjKGRsbGV4cG9ydCkgRGxsTWFpbiVtb2R1bGUlIiAKKyAgZnVuY3Rpb24gYXMgIl9fZGVjbHNwZWMoZGxsZXhwb3J0KSBEbGxNYWluJW1vZHVsZSUiCiAgIChlZywgRGxsTWFpbnB5dGhvbmNvbSwgb3IgRGxsTWFpbnB5d2ludHlwZXMpCiAKICogVGhlIGZyb3plbiAuRVhFLy5ETEwgbGlua3MgYWdhaW5zdCB0aGlzIG1vZHVsZSwgd2hpY2ggcHJvdmlkZXMKQEAgLTQ3LDEwICs0NywxMCBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKIAogc3RhdGljIGNoYXIgKnBvc3NpYmxlTW9kdWxlc1tdID0gewotCSJweXdpbnR5cGVzIiwKLQkicHl0aG9uY29tIiwKLQkid2luMzJ1aSIsCi0JTlVMTCwKKyAgICAicHl3aW50eXBlcyIsCisgICAgInB5dGhvbmNvbSIsCisgICAgIndpbjMydWkiLAorICAgIE5VTEwsCiB9OwogCiBCT09MIENhbGxNb2R1bGVEbGxNYWluKGNoYXIgKm1vZE5hbWUsIERXT1JEIGR3UmVhc29uKTsKQEAgLTYyLDczICs2Miw3MyBAQAogKi8KIHZvaWQgUHlXaW5GcmVlemVfRXhlSW5pdCh2b2lkKQogewotCWNoYXIgKiptb2ROYW1lOwotCWZvciAobW9kTmFtZSA9IHBvc3NpYmxlTW9kdWxlczsqbW9kTmFtZTsqbW9kTmFtZSsrKSB7Ci0vKgkJcHJpbnRmKCJJbml0aWFsaXNpbmcgJyVzJ1xuIiwgKm1vZE5hbWUpOyAqLwotCQlDYWxsTW9kdWxlRGxsTWFpbigqbW9kTmFtZSwgRExMX1BST0NFU1NfQVRUQUNIKTsKLQl9CisgICAgY2hhciAqKm1vZE5hbWU7CisgICAgZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzOyptb2ROYW1lOyptb2ROYW1lKyspIHsKKy8qICAgICAgICAgICAgICBwcmludGYoIkluaXRpYWxpc2luZyAnJXMnXG4iLCAqbW9kTmFtZSk7ICovCisgICAgICAgIENhbGxNb2R1bGVEbGxNYWluKCptb2ROYW1lLCBETExfUFJPQ0VTU19BVFRBQ0gpOworICAgIH0KIH0KIAogLyoKICAgQ2FsbGVkIGJ5IGEgZnJvemVuIC5FWEUgb25seSwgc28gdGhhdCBidWlsdC1pbiBleHRlbnNpb24KLSAgbW9kdWxlcyBhcmUgY2xlYW5lZCB1cCAKKyAgbW9kdWxlcyBhcmUgY2xlYW5lZCB1cAogKi8KIHZvaWQgUHlXaW5GcmVlemVfRXhlVGVybSh2b2lkKQogewotCS8vIE11c3QgZ28gYmFja3dhcmRzCi0JY2hhciAqKm1vZE5hbWU7Ci0JZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzKyhzaXplb2YocG9zc2libGVNb2R1bGVzKSAvIHNpemVvZihjaGFyICopKS0yOwotCSAgICAgbW9kTmFtZSA+PSBwb3NzaWJsZU1vZHVsZXM7Ci0JICAgICAqbW9kTmFtZS0tKSB7Ci0vKgkJcHJpbnRmKCJUZXJtaW5hdGluZyAnJXMnXG4iLCAqbW9kTmFtZSk7Ki8KLQkJQ2FsbE1vZHVsZURsbE1haW4oKm1vZE5hbWUsIERMTF9QUk9DRVNTX0RFVEFDSCk7Ci0JfQorICAgIC8vIE11c3QgZ28gYmFja3dhcmRzCisgICAgY2hhciAqKm1vZE5hbWU7CisgICAgZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzKyhzaXplb2YocG9zc2libGVNb2R1bGVzKSAvIHNpemVvZihjaGFyICopKS0yOworICAgICAgICAgbW9kTmFtZSA+PSBwb3NzaWJsZU1vZHVsZXM7CisgICAgICAgICAqbW9kTmFtZS0tKSB7CisvKiAgICAgICAgICAgICAgcHJpbnRmKCJUZXJtaW5hdGluZyAnJXMnXG4iLCAqbW9kTmFtZSk7Ki8KKyAgICAgICAgQ2FsbE1vZHVsZURsbE1haW4oKm1vZE5hbWUsIERMTF9QUk9DRVNTX0RFVEFDSCk7CisgICAgfQogfQogCiBCT09MIFdJTkFQSSBEbGxNYWluKEhJTlNUQU5DRSBoSW5zdGFuY2UsIERXT1JEIGR3UmVhc29uLCBMUFZPSUQgbHBSZXNlcnZlZCkKIHsKLQlCT09MIHJldCA9IFRSVUU7Ci0Jc3dpdGNoIChkd1JlYXNvbikgewotCQljYXNlIERMTF9QUk9DRVNTX0FUVEFDSDogCi0JCXsKLQkJCWNoYXIgKiptb2ROYW1lOwotCQkJZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzOyptb2ROYW1lOyptb2ROYW1lKyspIHsKLQkJCQlCT09MIG9rID0gQ2FsbE1vZHVsZURsbE1haW4oKm1vZE5hbWUsIGR3UmVhc29uKTsKLQkJCQlpZiAoIW9rKQotCQkJCQlyZXQgPSBGQUxTRTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgRExMX1BST0NFU1NfREVUQUNIOiAKLQkJewotCQkJLy8gTXVzdCBnbyBiYWNrd2FyZHMKLQkJCWNoYXIgKiptb2ROYW1lOwotCQkJZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzKyhzaXplb2YocG9zc2libGVNb2R1bGVzKSAvIHNpemVvZihjaGFyICopKS0yOwotCQkJICAgICBtb2ROYW1lID49IHBvc3NpYmxlTW9kdWxlczsKLQkJCSAgICAgKm1vZE5hbWUtLSkKLQkJCQlDYWxsTW9kdWxlRGxsTWFpbigqbW9kTmFtZSwgRExMX1BST0NFU1NfREVUQUNIKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByZXQ7CisgICAgQk9PTCByZXQgPSBUUlVFOworICAgIHN3aXRjaCAoZHdSZWFzb24pIHsKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKiptb2ROYW1lOworICAgICAgICAgICAgZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzOyptb2ROYW1lOyptb2ROYW1lKyspIHsKKyAgICAgICAgICAgICAgICBCT09MIG9rID0gQ2FsbE1vZHVsZURsbE1haW4oKm1vZE5hbWUsIGR3UmVhc29uKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBNdXN0IGdvIGJhY2t3YXJkcworICAgICAgICAgICAgY2hhciAqKm1vZE5hbWU7CisgICAgICAgICAgICBmb3IgKG1vZE5hbWUgPSBwb3NzaWJsZU1vZHVsZXMrKHNpemVvZihwb3NzaWJsZU1vZHVsZXMpIC8gc2l6ZW9mKGNoYXIgKikpLTI7CisgICAgICAgICAgICAgICAgIG1vZE5hbWUgPj0gcG9zc2libGVNb2R1bGVzOworICAgICAgICAgICAgICAgICAqbW9kTmFtZS0tKQorICAgICAgICAgICAgICAgIENhbGxNb2R1bGVEbGxNYWluKCptb2ROYW1lLCBETExfUFJPQ0VTU19ERVRBQ0gpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKIH0KIAogQk9PTCBDYWxsTW9kdWxlRGxsTWFpbihjaGFyICptb2ROYW1lLCBEV09SRCBkd1JlYXNvbikKIHsKLQlCT09MIChXSU5BUEkgKiBwZm5kbGxtYWluKShISU5TVEFOQ0UsIERXT1JELCBMUFZPSUQpOworICAgIEJPT0wgKFdJTkFQSSAqIHBmbmRsbG1haW4pKEhJTlNUQU5DRSwgRFdPUkQsIExQVk9JRCk7CiAKLQljaGFyIGZ1bmNOYW1lWzI1NV07Ci0JSE1PRFVMRSBobW9kID0gR2V0TW9kdWxlSGFuZGxlKE5VTEwpOwotCXN0cmNweShmdW5jTmFtZSwgIl9EbGxNYWluIik7Ci0Jc3RyY2F0KGZ1bmNOYW1lLCBtb2ROYW1lKTsKLQlzdHJjYXQoZnVuY05hbWUsICJAMTIiKTsgLy8gc3RkY2FsbCBjb252ZW50aW9uLgotCXBmbmRsbG1haW4gPSAoQk9PTCAoV0lOQVBJICopKEhJTlNUQU5DRSwgRFdPUkQsIExQVk9JRCkpR2V0UHJvY0FkZHJlc3MoaG1vZCwgZnVuY05hbWUpOwotCWlmIChwZm5kbGxtYWluPT1OVUxMKSB7Ci0JCS8qIE5vIGZ1bmN0aW9uIGJ5IHRoYXQgbmFtZSBleHBvcnRlZCAtIHRoZW4gdGhhdCBtb2R1bGUgZG9lcwotIAkJICAgbm90IGFwcGVhciBpbiBvdXIgZnJvemVuIHByb2dyYW0gLSByZXR1cm4gT0sKLSAgICAgICAgICAgICAgICAqLwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuICgqcGZuZGxsbWFpbikoaG1vZCwgZHdSZWFzb24sIE5VTEwpOworICAgIGNoYXIgZnVuY05hbWVbMjU1XTsKKyAgICBITU9EVUxFIGhtb2QgPSBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7CisgICAgc3RyY3B5KGZ1bmNOYW1lLCAiX0RsbE1haW4iKTsKKyAgICBzdHJjYXQoZnVuY05hbWUsIG1vZE5hbWUpOworICAgIHN0cmNhdChmdW5jTmFtZSwgIkAxMiIpOyAvLyBzdGRjYWxsIGNvbnZlbnRpb24uCisgICAgcGZuZGxsbWFpbiA9IChCT09MIChXSU5BUEkgKikoSElOU1RBTkNFLCBEV09SRCwgTFBWT0lEKSlHZXRQcm9jQWRkcmVzcyhobW9kLCBmdW5jTmFtZSk7CisgICAgaWYgKHBmbmRsbG1haW49PU5VTEwpIHsKKyAgICAgICAgLyogTm8gZnVuY3Rpb24gYnkgdGhhdCBuYW1lIGV4cG9ydGVkIC0gdGhlbiB0aGF0IG1vZHVsZSBkb2VzCisgICAgICAgICAgIG5vdCBhcHBlYXIgaW4gb3VyIGZyb3plbiBwcm9ncmFtIC0gcmV0dXJuIE9LCisgICAgICAgICovCisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gKCpwZm5kbGxtYWluKShobW9kLCBkd1JlYXNvbiwgTlVMTCk7CiB9CiAKZGlmZiAtLWdpdCBhL1BDL2dlbmVycm1hcC5jIGIvUEMvZ2VuZXJybWFwLmMKaW5kZXggMmIyNTA2My4uYmYxMDgxYiAxMDA2NDQKLS0tIGEvUEMvZ2VuZXJybWFwLmMKKysrIGIvUEMvZ2VuZXJybWFwLmMKQEAgLTUsMTYgKzUsMTYgQEAKIAogaW50IG1haW4oKQogewotCWludCBpOwotCXByaW50ZigiLyogR2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0LiAqL1xuIik7Ci0JcHJpbnRmKCJpbnQgd2luZXJyb3JfdG9fZXJybm8oaW50IHdpbmVycm9yKVxuIik7Ci0JcHJpbnRmKCJ7XG5cdHN3aXRjaCh3aW5lcnJvcikge1xuIik7Ci0JZm9yKGk9MTsgaSA8IDY1MDAwOyBpKyspIHsKLQkJX2Rvc21hcGVycihpKTsKLQkJaWYgKGVycm5vID09IEVJTlZBTCkKLQkJCWNvbnRpbnVlOwotCQlwcmludGYoIlx0XHRjYXNlICVkOiByZXR1cm4gJWQ7XG4iLCBpLCBlcnJubyk7Ci0JfQotCXByaW50ZigiXHRcdGRlZmF1bHQ6IHJldHVybiBFSU5WQUw7XG4iKTsKLQlwcmludGYoIlx0fVxufVxuIik7CisgICAgaW50IGk7CisgICAgcHJpbnRmKCIvKiBHZW5lcmF0ZWQgZmlsZS4gRG8gbm90IGVkaXQuICovXG4iKTsKKyAgICBwcmludGYoImludCB3aW5lcnJvcl90b19lcnJubyhpbnQgd2luZXJyb3IpXG4iKTsKKyAgICBwcmludGYoIntcblx0c3dpdGNoKHdpbmVycm9yKSB7XG4iKTsKKyAgICBmb3IoaT0xOyBpIDwgNjUwMDA7IGkrKykgeworICAgICAgICBfZG9zbWFwZXJyKGkpOworICAgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHByaW50ZigiXHRcdGNhc2UgJWQ6IHJldHVybiAlZDtcbiIsIGksIGVycm5vKTsKKyAgICB9CisgICAgcHJpbnRmKCJcdFx0ZGVmYXVsdDogcmV0dXJuIEVJTlZBTDtcbiIpOworICAgIHByaW50ZigiXHR9XG59XG4iKTsKIH0KZGlmZiAtLWdpdCBhL1BDL2dldHBhdGhwLmMgYi9QQy9nZXRwYXRocC5jCmluZGV4IDc4ZjQ0NjUuLjQ2MWY5ZmMgMTAwNjQ0Ci0tLSBhL1BDL2dldHBhdGhwLmMKKysrIGIvUEMvZ2V0cGF0aHAuYwpAQCAtNCw4ICs0LDggQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUEFUSCBSVUxFUyBGT1IgV0lORE9XUzoKLSAgIFRoaXMgZGVzY3JpYmVzIGhvdyBzeXMucGF0aCBpcyBmb3JtZWQgb24gV2luZG93cy4gIEl0IGRlc2NyaWJlcyB0aGUgCi0gICBmdW5jdGlvbmFsaXR5LCBub3QgdGhlIGltcGxlbWVudGF0aW9uIChpZSwgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXNlIAorICAgVGhpcyBkZXNjcmliZXMgaG93IHN5cy5wYXRoIGlzIGZvcm1lZCBvbiBXaW5kb3dzLiAgSXQgZGVzY3JpYmVzIHRoZQorICAgZnVuY3Rpb25hbGl0eSwgbm90IHRoZSBpbXBsZW1lbnRhdGlvbiAoaWUsIHRoZSBvcmRlciBpbiB3aGljaCB0aGVzZQogICAgYXJlIGFjdHVhbGx5IGZldGNoZWQgaXMgZGlmZmVyZW50KQogCiAgICAqIFB5dGhvbiBhbHdheXMgYWRkcyBhbiBlbXB0eSBlbnRyeSBhdCB0aGUgc3RhcnQsIHdoaWNoIGNvcnJlc3BvbmRzCkBAIC0yNCwxNSArMjQsMTUgQEAKICAgICogV2UgYXR0ZW1wdCB0byBsb2NhdGUgdGhlICJQeXRob24gSG9tZSIgLSBpZiB0aGUgUFlUSE9OSE9NRSBlbnYgdmFyCiAgICAgIGlzIHNldCwgd2UgYmVsaWV2ZSBpdC4gIE90aGVyd2lzZSwgd2UgdXNlIHRoZSBwYXRoIG9mIG91ciBob3N0IC5FWEUncwogICAgICB0byB0cnkgYW5kIGxvY2F0ZSBvdXIgImxhbmRtYXJrIiAobGliXFxvcy5weSkgYW5kIGRlZHVjZSBvdXIgaG9tZS4KLSAgICAgLSBJZiB3ZSBETyBoYXZlIGEgUHl0aG9uIEhvbWU6IFRoZSByZWxldmFudCBzdWItZGlyZWN0b3JpZXMgKExpYiwgCisgICAgIC0gSWYgd2UgRE8gaGF2ZSBhIFB5dGhvbiBIb21lOiBUaGUgcmVsZXZhbnQgc3ViLWRpcmVjdG9yaWVzIChMaWIsCiAgICAgICAgcGxhdC13aW4sIGxpYi10aywgZXRjKSBhcmUgYmFzZWQgb24gdGhlIFB5dGhvbiBIb21lCiAgICAgIC0gSWYgd2UgRE8gTk9UIGhhdmUgYSBQeXRob24gSG9tZSwgdGhlIGNvcmUgUHl0aG9uIFBhdGggaXMKLSAgICAgICBsb2FkZWQgZnJvbSB0aGUgcmVnaXN0cnkuICBUaGlzIGlzIHRoZSBtYWluIFB5dGhvblBhdGgga2V5LCAKKyAgICAgICBsb2FkZWQgZnJvbSB0aGUgcmVnaXN0cnkuICBUaGlzIGlzIHRoZSBtYWluIFB5dGhvblBhdGgga2V5LAogICAgICAgIGFuZCBib3RoIEhLTE0gYW5kIEhLQ1UgYXJlIGNvbWJpbmVkIHRvIGZvcm0gdGhlIHBhdGgpCiAKICAgICogSWZmIC0gd2UgY2FuIG5vdCBsb2NhdGUgdGhlIFB5dGhvbiBIb21lLCBoYXZlIG5vdCBoYWQgYSBQWVRIT05QQVRICiAgICAgIHNwZWNpZmllZCwgYW5kIGNhbid0IGxvY2F0ZSBhbnkgUmVnaXN0cnkgZW50cmllcyAoaWUsIHdlIGhhdmUgX25vdGhpbmdfCi0gICAgIHdlIGNhbiBhc3N1bWUgaXMgYSBnb29kIHBhdGgpLCBhIGRlZmF1bHQgcGF0aCB3aXRoIHJlbGF0aXZlIGVudHJpZXMgaXMgCisgICAgIHdlIGNhbiBhc3N1bWUgaXMgYSBnb29kIHBhdGgpLCBhIGRlZmF1bHQgcGF0aCB3aXRoIHJlbGF0aXZlIGVudHJpZXMgaXMKICAgICAgdXNlZCAoZWcuIC5cTGliOy5ccGxhdC13aW4sIGV0YykKIAogCkBAIC00Miw5ICs0Miw5IEBACiAgICAgdGhlIGNvcmUgcGF0aCBpcyBkZWR1Y2VkLCBhbmQgdGhlIGNvcmUgcGF0aHMgaW4gdGhlIHJlZ2lzdHJ5IGFyZQogICAgIGlnbm9yZWQuICBPdGhlciAiYXBwbGljYXRpb24gcGF0aHMiIGluIHRoZSByZWdpc3RyeSBhcmUgYWx3YXlzIHJlYWQuCiAKLSAgKiBXaGVuIFB5dGhvbiBpcyBob3N0ZWQgaW4gYW5vdGhlciBleGUgKGRpZmZlcmVudCBkaXJlY3RvcnksIGVtYmVkZGVkIHZpYSAKKyAgKiBXaGVuIFB5dGhvbiBpcyBob3N0ZWQgaW4gYW5vdGhlciBleGUgKGRpZmZlcmVudCBkaXJlY3RvcnksIGVtYmVkZGVkIHZpYQogICAgIENPTSwgZXRjKSwgdGhlIFB5dGhvbiBIb21lIHdpbGwgbm90IGJlIGRlZHVjZWQsIHNvIHRoZSBjb3JlIHBhdGggZnJvbQotICAgIHRoZSByZWdpc3RyeSBpcyB1c2VkLiAgT3RoZXIgImFwcGxpY2F0aW9uIHBhdGhzIiBpbiB0aGUgcmVnaXN0cnkgYXJlIAorICAgIHRoZSByZWdpc3RyeSBpcyB1c2VkLiAgT3RoZXIgImFwcGxpY2F0aW9uIHBhdGhzIiBpbiB0aGUgcmVnaXN0cnkgYXJlCiAgICAgYWx3YXlzIHJlYWQuCiAKICAgKiBJZiBQeXRob24gY2FuJ3QgZmluZCBpdHMgaG9tZSBhbmQgdGhlcmUgaXMgbm8gcmVnaXN0cnkgKGVnLCBmcm96ZW4KQEAgLTkyLDEyICs5MiwxMiBAQAogCiAKIHN0YXRpYyBpbnQKLWlzX3NlcChjaGFyIGNoKQkvKiBkZXRlcm1pbmUgaWYgImNoIiBpcyBhIHNlcGFyYXRvciBjaGFyYWN0ZXIgKi8KK2lzX3NlcChjaGFyIGNoKSAvKiBkZXRlcm1pbmUgaWYgImNoIiBpcyBhIHNlcGFyYXRvciBjaGFyYWN0ZXIgKi8KIHsKICNpZmRlZiBBTFRTRVAKLQlyZXR1cm4gY2ggPT0gU0VQIHx8IGNoID09IEFMVFNFUDsKKyAgICByZXR1cm4gY2ggPT0gU0VQIHx8IGNoID09IEFMVFNFUDsKICNlbHNlCi0JcmV0dXJuIGNoID09IFNFUDsKKyAgICByZXR1cm4gY2ggPT0gU0VQOwogI2VuZGlmCiB9CiAKQEAgLTEwNywzNiArMTA3LDM2IEBACiBzdGF0aWMgdm9pZAogcmVkdWNlKGNoYXIgKmRpcikKIHsKLQlzaXplX3QgaSA9IHN0cmxlbihkaXIpOwotCXdoaWxlIChpID4gMCAmJiAhaXNfc2VwKGRpcltpXSkpCi0JCS0taTsKLQlkaXJbaV0gPSAnXDAnOworICAgIHNpemVfdCBpID0gc3RybGVuKGRpcik7CisgICAgd2hpbGUgKGkgPiAwICYmICFpc19zZXAoZGlyW2ldKSkKKyAgICAgICAgLS1pOworICAgIGRpcltpXSA9ICdcMCc7CiB9Ci0JCisKIAogc3RhdGljIGludAogZXhpc3RzKGNoYXIgKmZpbGVuYW1lKQogewotCXN0cnVjdCBzdGF0IGJ1ZjsKLQlyZXR1cm4gc3RhdChmaWxlbmFtZSwgJmJ1ZikgPT0gMDsKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgcmV0dXJuIHN0YXQoZmlsZW5hbWUsICZidWYpID09IDA7CiB9CiAKLS8qIEFzc3VtZXMgJ2ZpbGVuYW1lJyBNQVhQQVRITEVOKzEgYnl0ZXMgbG9uZyAtIAorLyogQXNzdW1lcyAnZmlsZW5hbWUnIE1BWFBBVEhMRU4rMSBieXRlcyBsb25nIC0KICAgIG1heSBleHRlbmQgJ2ZpbGVuYW1lJyBieSBvbmUgY2hhcmFjdGVyLgogKi8KIHN0YXRpYyBpbnQKLWlzbW9kdWxlKGNoYXIgKmZpbGVuYW1lKQkvKiBJcyBtb2R1bGUgLS0gY2hlY2sgZm9yIC5weWMvLnB5byB0b28gKi8KK2lzbW9kdWxlKGNoYXIgKmZpbGVuYW1lKSAgICAgICAgLyogSXMgbW9kdWxlIC0tIGNoZWNrIGZvciAucHljLy5weW8gdG9vICovCiB7Ci0JaWYgKGV4aXN0cyhmaWxlbmFtZSkpCi0JCXJldHVybiAxOworICAgIGlmIChleGlzdHMoZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gMTsKIAotCS8qIENoZWNrIGZvciB0aGUgY29tcGlsZWQgdmVyc2lvbiBvZiBwcmVmaXguICovCi0JaWYgKHN0cmxlbihmaWxlbmFtZSkgPCBNQVhQQVRITEVOKSB7Ci0JCXN0cmNhdChmaWxlbmFtZSwgUHlfT3B0aW1pemVGbGFnID8gIm8iIDogImMiKTsKLQkJaWYgKGV4aXN0cyhmaWxlbmFtZSkpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBjb21waWxlZCB2ZXJzaW9uIG9mIHByZWZpeC4gKi8KKyAgICBpZiAoc3RybGVuKGZpbGVuYW1lKSA8IE1BWFBBVEhMRU4pIHsKKyAgICAgICAgc3RyY2F0KGZpbGVuYW1lLCBQeV9PcHRpbWl6ZUZsYWcgPyAibyIgOiAiYyIpOworICAgICAgICBpZiAoZXhpc3RzKGZpbGVuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogQWRkIGEgcGF0aCBjb21wb25lbnQsIGJ5IGFwcGVuZGluZyBzdHVmZiB0byBidWZmZXIuCkBAIC0xNTEsMjEgKzE1MSwyMSBAQAogc3RhdGljIHZvaWQKIGpvaW4oY2hhciAqYnVmZmVyLCBjaGFyICpzdHVmZikKIHsKLQlzaXplX3QgbiwgazsKLQlpZiAoaXNfc2VwKHN0dWZmWzBdKSkKLQkJbiA9IDA7Ci0JZWxzZSB7Ci0JCW4gPSBzdHJsZW4oYnVmZmVyKTsKLQkJaWYgKG4gPiAwICYmICFpc19zZXAoYnVmZmVyW24tMV0pICYmIG4gPCBNQVhQQVRITEVOKQotCQkJYnVmZmVyW24rK10gPSBTRVA7Ci0JfQotCWlmIChuID4gTUFYUEFUSExFTikKLQkJUHlfRmF0YWxFcnJvcigiYnVmZmVyIG92ZXJmbG93IGluIGdldHBhdGhwLmMncyBqb2lucGF0aCgpIik7Ci0JayA9IHN0cmxlbihzdHVmZik7Ci0JaWYgKG4gKyBrID4gTUFYUEFUSExFTikKLQkJayA9IE1BWFBBVEhMRU4gLSBuOwotCXN0cm5jcHkoYnVmZmVyK24sIHN0dWZmLCBrKTsKLQlidWZmZXJbbitrXSA9ICdcMCc7CisgICAgc2l6ZV90IG4sIGs7CisgICAgaWYgKGlzX3NlcChzdHVmZlswXSkpCisgICAgICAgIG4gPSAwOworICAgIGVsc2UgeworICAgICAgICBuID0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgIGlmIChuID4gMCAmJiAhaXNfc2VwKGJ1ZmZlcltuLTFdKSAmJiBuIDwgTUFYUEFUSExFTikKKyAgICAgICAgICAgIGJ1ZmZlcltuKytdID0gU0VQOworICAgIH0KKyAgICBpZiAobiA+IE1BWFBBVEhMRU4pCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImJ1ZmZlciBvdmVyZmxvdyBpbiBnZXRwYXRocC5jJ3Mgam9pbnBhdGgoKSIpOworICAgIGsgPSBzdHJsZW4oc3R1ZmYpOworICAgIGlmIChuICsgayA+IE1BWFBBVEhMRU4pCisgICAgICAgIGsgPSBNQVhQQVRITEVOIC0gbjsKKyAgICBzdHJuY3B5KGJ1ZmZlcituLCBzdHVmZiwgayk7CisgICAgYnVmZmVyW24ra10gPSAnXDAnOwogfQogCiAvKiBnb3RsYW5kbWFyayBvbmx5IGNhbGxlZCBieSBzZWFyY2hfZm9yX3ByZWZpeCwgd2hpY2ggZW5zdXJlcwpAQCAtMTc1LDI5ICsxNzUsMjkgQEAKIHN0YXRpYyBpbnQKIGdvdGxhbmRtYXJrKGNoYXIgKmxhbmRtYXJrKQogewotCWludCBvazsKLQlQeV9zc2l6ZV90IG47CisgICAgaW50IG9rOworICAgIFB5X3NzaXplX3QgbjsKIAotCW4gPSBzdHJsZW4ocHJlZml4KTsKLQlqb2luKHByZWZpeCwgbGFuZG1hcmspOwotCW9rID0gaXNtb2R1bGUocHJlZml4KTsKLQlwcmVmaXhbbl0gPSAnXDAnOwotCXJldHVybiBvazsKKyAgICBuID0gc3RybGVuKHByZWZpeCk7CisgICAgam9pbihwcmVmaXgsIGxhbmRtYXJrKTsKKyAgICBvayA9IGlzbW9kdWxlKHByZWZpeCk7CisgICAgcHJlZml4W25dID0gJ1wwJzsKKyAgICByZXR1cm4gb2s7CiB9CiAKLS8qIGFzc3VtZXMgYXJndjBfcGF0aCBpcyBNQVhQQVRITEVOKzEgYnl0ZXMgbG9uZywgYWxyZWFkeSBcMCB0ZXJtJ2QuIAorLyogYXNzdW1lcyBhcmd2MF9wYXRoIGlzIE1BWFBBVEhMRU4rMSBieXRlcyBsb25nLCBhbHJlYWR5IFwwIHRlcm0nZC4KICAgIGFzc3VtcHRpb24gcHJvdmlkZWQgYnkgb25seSBjYWxsZXIsIGNhbGN1bGF0ZV9wYXRoKCkgKi8KIHN0YXRpYyBpbnQKIHNlYXJjaF9mb3JfcHJlZml4KGNoYXIgKmFyZ3YwX3BhdGgsIGNoYXIgKmxhbmRtYXJrKQogewotCS8qIFNlYXJjaCBmcm9tIGFyZ3YwX3BhdGgsIHVudGlsIGxhbmRtYXJrIGlzIGZvdW5kICovCi0Jc3RyY3B5KHByZWZpeCwgYXJndjBfcGF0aCk7Ci0JZG8gewotCQlpZiAoZ290bGFuZG1hcmsobGFuZG1hcmspKQotCQkJcmV0dXJuIDE7Ci0JCXJlZHVjZShwcmVmaXgpOwotCX0gd2hpbGUgKHByZWZpeFswXSk7Ci0JcmV0dXJuIDA7CisgICAgLyogU2VhcmNoIGZyb20gYXJndjBfcGF0aCwgdW50aWwgbGFuZG1hcmsgaXMgZm91bmQgKi8KKyAgICBzdHJjcHkocHJlZml4LCBhcmd2MF9wYXRoKTsKKyAgICBkbyB7CisgICAgICAgIGlmIChnb3RsYW5kbWFyayhsYW5kbWFyaykpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmVkdWNlKHByZWZpeCk7CisgICAgfSB3aGlsZSAocHJlZml4WzBdKTsKKyAgICByZXR1cm4gMDsKIH0KIAogI2lmZGVmIE1TX1dJTkRPV1MKQEAgLTIyMywxNDYgKzIyMywxNDYgQEAKIHN0YXRpYyBjaGFyICoKIGdldHB5dGhvbnJlZ3BhdGgoSEtFWSBrZXlCYXNlLCBpbnQgc2tpcGNvcmUpCiB7Ci0JSEtFWSBuZXdLZXkgPSAwOwotCURXT1JEIGRhdGFTaXplID0gMDsKLQlEV09SRCBudW1LZXlzID0gMDsKLQlMT05HIHJjOwotCWNoYXIgKnJldHZhbCA9IE5VTEw7Ci0JVENIQVIgKmRhdGFCdWYgPSBOVUxMOwotCXN0YXRpYyBjb25zdCBUQ0hBUiBrZXlQcmVmaXhbXSA9IF9UKCJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwiKTsKLQlzdGF0aWMgY29uc3QgVENIQVIga2V5U3VmZml4W10gPSBfVCgiXFxQeXRob25QYXRoIik7Ci0Jc2l6ZV90IHZlcnNpb25MZW47Ci0JRFdPUkQgaW5kZXg7Ci0JVENIQVIgKmtleUJ1ZiA9IE5VTEw7Ci0JVENIQVIgKmtleUJ1ZlB0cjsKLQlUQ0hBUiAqKnBwUGF0aHMgPSBOVUxMOworICAgIEhLRVkgbmV3S2V5ID0gMDsKKyAgICBEV09SRCBkYXRhU2l6ZSA9IDA7CisgICAgRFdPUkQgbnVtS2V5cyA9IDA7CisgICAgTE9ORyByYzsKKyAgICBjaGFyICpyZXR2YWwgPSBOVUxMOworICAgIFRDSEFSICpkYXRhQnVmID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgVENIQVIga2V5UHJlZml4W10gPSBfVCgiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZVxcIik7CisgICAgc3RhdGljIGNvbnN0IFRDSEFSIGtleVN1ZmZpeFtdID0gX1QoIlxcUHl0aG9uUGF0aCIpOworICAgIHNpemVfdCB2ZXJzaW9uTGVuOworICAgIERXT1JEIGluZGV4OworICAgIFRDSEFSICprZXlCdWYgPSBOVUxMOworICAgIFRDSEFSICprZXlCdWZQdHI7CisgICAgVENIQVIgKipwcFBhdGhzID0gTlVMTDsKIAotCS8qIFRyaWVkIHRvIHVzZSBzeXNnZXQoIndpbnZlciIpIGJ1dCBoZXJlIGlzIHRvbyBlYXJseSA6LSggKi8KLQl2ZXJzaW9uTGVuID0gX3Rjc2xlbihQeVdpbl9ETExWZXJzaW9uU3RyaW5nKTsKLQkvKiBTcGFjZSBmb3IgYWxsIHRoZSBjaGFycywgcGx1cyBvbmUgXDAgKi8KLQlrZXlCdWYgPSBrZXlCdWZQdHIgPSBtYWxsb2Moc2l6ZW9mKGtleVByZWZpeCkgKyAKLQkJICAgICAgICAgICAgICAgICAgICBzaXplb2YoVENIQVIpKih2ZXJzaW9uTGVuLTEpICsgCi0JCQkJICAgIHNpemVvZihrZXlTdWZmaXgpKTsKLQlpZiAoa2V5QnVmPT1OVUxMKSBnb3RvIGRvbmU7CisgICAgLyogVHJpZWQgdG8gdXNlIHN5c2dldCgid2ludmVyIikgYnV0IGhlcmUgaXMgdG9vIGVhcmx5IDotKCAqLworICAgIHZlcnNpb25MZW4gPSBfdGNzbGVuKFB5V2luX0RMTFZlcnNpb25TdHJpbmcpOworICAgIC8qIFNwYWNlIGZvciBhbGwgdGhlIGNoYXJzLCBwbHVzIG9uZSBcMCAqLworICAgIGtleUJ1ZiA9IGtleUJ1ZlB0ciA9IG1hbGxvYyhzaXplb2Yoa2V5UHJlZml4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihUQ0hBUikqKHZlcnNpb25MZW4tMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa2V5U3VmZml4KSk7CisgICAgaWYgKGtleUJ1Zj09TlVMTCkgZ290byBkb25lOwogCi0JbWVtY3B5KGtleUJ1ZlB0ciwga2V5UHJlZml4LCBzaXplb2Yoa2V5UHJlZml4KS1zaXplb2YoVENIQVIpKTsKLQlrZXlCdWZQdHIgKz0gc2l6ZW9mKGtleVByZWZpeCkvc2l6ZW9mKFRDSEFSKSAtIDE7Ci0JbWVtY3B5KGtleUJ1ZlB0ciwgUHlXaW5fRExMVmVyc2lvblN0cmluZywgdmVyc2lvbkxlbiAqIHNpemVvZihUQ0hBUikpOwotCWtleUJ1ZlB0ciArPSB2ZXJzaW9uTGVuOwotCS8qIE5VTEwgY29tZXMgd2l0aCB0aGlzIG9uZSEgKi8KLQltZW1jcHkoa2V5QnVmUHRyLCBrZXlTdWZmaXgsIHNpemVvZihrZXlTdWZmaXgpKTsKLQkvKiBPcGVuIHRoZSByb290IFB5dGhvbiBrZXkgKi8KLQlyYz1SZWdPcGVuS2V5RXgoa2V5QmFzZSwKLQkgICAgICAgICAgICAgICAga2V5QnVmLCAvKiBzdWJrZXkgKi8KLQkgICAgICAgICAgICAgICAgMCwgLyogcmVzZXJ2ZWQgKi8KLQkgICAgICAgICAgICAgICAgS0VZX1JFQUQsCi0JICAgICAgICAgICAgICAgICZuZXdLZXkpOwotCWlmIChyYyE9RVJST1JfU1VDQ0VTUykgZ290byBkb25lOwotCS8qIEZpbmQgb3V0IGhvdyBiaWcgb3VyIGNvcmUgYnVmZmVyIGlzLCBhbmQgaG93IG1hbnkgc3Via2V5cyB3ZSBoYXZlICovCi0JcmMgPSBSZWdRdWVyeUluZm9LZXkobmV3S2V5LCBOVUxMLCBOVUxMLCBOVUxMLCAmbnVtS2V5cywgTlVMTCwgTlVMTCwgCi0JICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsICZkYXRhU2l6ZSwgTlVMTCwgTlVMTCk7Ci0JaWYgKHJjIT1FUlJPUl9TVUNDRVNTKSBnb3RvIGRvbmU7Ci0JaWYgKHNraXBjb3JlKSBkYXRhU2l6ZSA9IDA7IC8qIE9ubHkgY291bnQgY29yZSBvbmVzIGlmIHdlIHdhbnQgdGhlbSEgKi8KLQkvKiBBbGxvY2F0ZSBhIHRlbXAgYXJyYXkgb2YgY2hhciBidWZmZXJzLCBzbyB3ZSBvbmx5IG5lZWQgdG8gbG9vcCAKLQkgICByZWFkaW5nIHRoZSByZWdpc3RyeSBvbmNlCi0JKi8KLQlwcFBhdGhzID0gbWFsbG9jKCBzaXplb2YoVENIQVIgKikgKiBudW1LZXlzICk7Ci0JaWYgKHBwUGF0aHM9PU5VTEwpIGdvdG8gZG9uZTsKLQltZW1zZXQocHBQYXRocywgMCwgc2l6ZW9mKFRDSEFSICopICogbnVtS2V5cyk7Ci0JLyogTG9vcCBvdmVyIGFsbCBzdWJrZXlzLCBhbGxvY2F0aW5nIGEgdGVtcCBzdWItYnVmZmVyLiAqLwotCWZvcihpbmRleD0wO2luZGV4PG51bUtleXM7aW5kZXgrKykgewotCQlUQ0hBUiBrZXlCdWZbTUFYX1BBVEgrMV07Ci0JCUhLRVkgc3ViS2V5ID0gMDsKLQkJRFdPUkQgcmVxZFNpemUgPSBNQVhfUEFUSCsxOwotCQkvKiBHZXQgdGhlIHN1Yi1rZXkgbmFtZSAqLwotCQlEV09SRCByYyA9IFJlZ0VudW1LZXlFeChuZXdLZXksIGluZGV4LCBrZXlCdWYsICZyZXFkU2l6ZSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCApOwotCQlpZiAocmMhPUVSUk9SX1NVQ0NFU1MpIGdvdG8gZG9uZTsKLQkJLyogT3BlbiB0aGUgc3ViLWtleSAqLwotCQlyYz1SZWdPcGVuS2V5RXgobmV3S2V5LAotCQkJCQkJa2V5QnVmLCAvKiBzdWJrZXkgKi8KLQkJCQkJCTAsIC8qIHJlc2VydmVkICovCi0JCQkJCQlLRVlfUkVBRCwKLQkJCQkJCSZzdWJLZXkpOwotCQlpZiAocmMhPUVSUk9SX1NVQ0NFU1MpIGdvdG8gZG9uZTsKLQkJLyogRmluZCB0aGUgdmFsdWUgb2YgdGhlIGJ1ZmZlciBzaXplLCBtYWxsb2MsIHRoZW4gcmVhZCBpdCAqLwotCQlSZWdRdWVyeVZhbHVlRXgoc3ViS2V5LCBOVUxMLCAwLCBOVUxMLCBOVUxMLCAmcmVxZFNpemUpOwotCQlpZiAocmVxZFNpemUpIHsKLQkJCXBwUGF0aHNbaW5kZXhdID0gbWFsbG9jKHJlcWRTaXplKTsKLQkJCWlmIChwcFBhdGhzW2luZGV4XSkgewotCQkJCVJlZ1F1ZXJ5VmFsdWVFeChzdWJLZXksIE5VTEwsIDAsIE5VTEwsIAotCQkJCSAgICAgICAgICAgICAgICAoTFBCWVRFKXBwUGF0aHNbaW5kZXhdLCAKLQkJCQkgICAgICAgICAgICAgICAgJnJlcWRTaXplKTsKLQkJCQlkYXRhU2l6ZSArPSByZXFkU2l6ZSArIDE7IC8qIDEgZm9yIHRoZSAiOyIgKi8KLQkJCX0KLQkJfQotCQlSZWdDbG9zZUtleShzdWJLZXkpOwotCX0KKyAgICBtZW1jcHkoa2V5QnVmUHRyLCBrZXlQcmVmaXgsIHNpemVvZihrZXlQcmVmaXgpLXNpemVvZihUQ0hBUikpOworICAgIGtleUJ1ZlB0ciArPSBzaXplb2Yoa2V5UHJlZml4KS9zaXplb2YoVENIQVIpIC0gMTsKKyAgICBtZW1jcHkoa2V5QnVmUHRyLCBQeVdpbl9ETExWZXJzaW9uU3RyaW5nLCB2ZXJzaW9uTGVuICogc2l6ZW9mKFRDSEFSKSk7CisgICAga2V5QnVmUHRyICs9IHZlcnNpb25MZW47CisgICAgLyogTlVMTCBjb21lcyB3aXRoIHRoaXMgb25lISAqLworICAgIG1lbWNweShrZXlCdWZQdHIsIGtleVN1ZmZpeCwgc2l6ZW9mKGtleVN1ZmZpeCkpOworICAgIC8qIE9wZW4gdGhlIHJvb3QgUHl0aG9uIGtleSAqLworICAgIHJjPVJlZ09wZW5LZXlFeChrZXlCYXNlLAorICAgICAgICAgICAgICAgICAgICBrZXlCdWYsIC8qIHN1YmtleSAqLworICAgICAgICAgICAgMCwgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgIEtFWV9SRUFELAorICAgICAgICAgICAgJm5ld0tleSk7CisgICAgaWYgKHJjIT1FUlJPUl9TVUNDRVNTKSBnb3RvIGRvbmU7CisgICAgLyogRmluZCBvdXQgaG93IGJpZyBvdXIgY29yZSBidWZmZXIgaXMsIGFuZCBob3cgbWFueSBzdWJrZXlzIHdlIGhhdmUgKi8KKyAgICByYyA9IFJlZ1F1ZXJ5SW5mb0tleShuZXdLZXksIE5VTEwsIE5VTEwsIE5VTEwsICZudW1LZXlzLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAmZGF0YVNpemUsIE5VTEwsIE5VTEwpOworICAgIGlmIChyYyE9RVJST1JfU1VDQ0VTUykgZ290byBkb25lOworICAgIGlmIChza2lwY29yZSkgZGF0YVNpemUgPSAwOyAvKiBPbmx5IGNvdW50IGNvcmUgb25lcyBpZiB3ZSB3YW50IHRoZW0hICovCisgICAgLyogQWxsb2NhdGUgYSB0ZW1wIGFycmF5IG9mIGNoYXIgYnVmZmVycywgc28gd2Ugb25seSBuZWVkIHRvIGxvb3AKKyAgICAgICByZWFkaW5nIHRoZSByZWdpc3RyeSBvbmNlCisgICAgKi8KKyAgICBwcFBhdGhzID0gbWFsbG9jKCBzaXplb2YoVENIQVIgKikgKiBudW1LZXlzICk7CisgICAgaWYgKHBwUGF0aHM9PU5VTEwpIGdvdG8gZG9uZTsKKyAgICBtZW1zZXQocHBQYXRocywgMCwgc2l6ZW9mKFRDSEFSICopICogbnVtS2V5cyk7CisgICAgLyogTG9vcCBvdmVyIGFsbCBzdWJrZXlzLCBhbGxvY2F0aW5nIGEgdGVtcCBzdWItYnVmZmVyLiAqLworICAgIGZvcihpbmRleD0wO2luZGV4PG51bUtleXM7aW5kZXgrKykgeworICAgICAgICBUQ0hBUiBrZXlCdWZbTUFYX1BBVEgrMV07CisgICAgICAgIEhLRVkgc3ViS2V5ID0gMDsKKyAgICAgICAgRFdPUkQgcmVxZFNpemUgPSBNQVhfUEFUSCsxOworICAgICAgICAvKiBHZXQgdGhlIHN1Yi1rZXkgbmFtZSAqLworICAgICAgICBEV09SRCByYyA9IFJlZ0VudW1LZXlFeChuZXdLZXksIGluZGV4LCBrZXlCdWYsICZyZXFkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCApOworICAgICAgICBpZiAocmMhPUVSUk9SX1NVQ0NFU1MpIGdvdG8gZG9uZTsKKyAgICAgICAgLyogT3BlbiB0aGUgc3ViLWtleSAqLworICAgICAgICByYz1SZWdPcGVuS2V5RXgobmV3S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUJ1ZiwgLyogc3Via2V5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiByZXNlcnZlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAmc3ViS2V5KTsKKyAgICAgICAgaWYgKHJjIT1FUlJPUl9TVUNDRVNTKSBnb3RvIGRvbmU7CisgICAgICAgIC8qIEZpbmQgdGhlIHZhbHVlIG9mIHRoZSBidWZmZXIgc2l6ZSwgbWFsbG9jLCB0aGVuIHJlYWQgaXQgKi8KKyAgICAgICAgUmVnUXVlcnlWYWx1ZUV4KHN1YktleSwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgJnJlcWRTaXplKTsKKyAgICAgICAgaWYgKHJlcWRTaXplKSB7CisgICAgICAgICAgICBwcFBhdGhzW2luZGV4XSA9IG1hbGxvYyhyZXFkU2l6ZSk7CisgICAgICAgICAgICBpZiAocHBQYXRoc1tpbmRleF0pIHsKKyAgICAgICAgICAgICAgICBSZWdRdWVyeVZhbHVlRXgoc3ViS2V5LCBOVUxMLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBCWVRFKXBwUGF0aHNbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxZFNpemUpOworICAgICAgICAgICAgICAgIGRhdGFTaXplICs9IHJlcWRTaXplICsgMTsgLyogMSBmb3IgdGhlICI7IiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFJlZ0Nsb3NlS2V5KHN1YktleSk7CisgICAgfQogCi0JLyogcmV0dXJuIG51bGwgaWYgbm8gcGF0aCB0byByZXR1cm4gKi8KLQlpZiAoZGF0YVNpemUgPT0gMCkgZ290byBkb25lOworICAgIC8qIHJldHVybiBudWxsIGlmIG5vIHBhdGggdG8gcmV0dXJuICovCisgICAgaWYgKGRhdGFTaXplID09IDApIGdvdG8gZG9uZTsKIAotCS8qIG9yaWdpbmFsIGRhdGFzaXplIGZyb20gUmVnUXVlcnlJbmZvIGRvZXNuJ3QgaW5jbHVkZSB0aGUgXDAgKi8KLQlkYXRhQnVmID0gbWFsbG9jKChkYXRhU2l6ZSsxKSAqIHNpemVvZihUQ0hBUikpOwotCWlmIChkYXRhQnVmKSB7Ci0JCVRDSEFSICpzekN1ciA9IGRhdGFCdWY7Ci0JCURXT1JEIHJlcWRTaXplID0gZGF0YVNpemU7Ci0JCS8qIENvcHkgb3VyIGNvbGxlY3RlZCBzdHJpbmdzICovCi0JCWZvciAoaW5kZXg9MDtpbmRleDxudW1LZXlzO2luZGV4KyspIHsKLQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkqKHN6Q3VyKyspID0gX1QoJzsnKTsKLQkJCQlkYXRhU2l6ZS0tOwotCQkJfQotCQkJaWYgKHBwUGF0aHNbaW5kZXhdKSB7Ci0JCQkJUHlfc3NpemVfdCBsZW4gPSBfdGNzbGVuKHBwUGF0aHNbaW5kZXhdKTsKLQkJCQlfdGNzbmNweShzekN1ciwgcHBQYXRoc1tpbmRleF0sIGxlbik7Ci0JCQkJc3pDdXIgKz0gbGVuOwotCQkJCWFzc2VydChkYXRhU2l6ZSA+IChEV09SRClsZW4pOwotCQkJCWRhdGFTaXplIC09IChEV09SRClsZW47Ci0JCQl9Ci0JCX0KLQkJaWYgKHNraXBjb3JlKQotCQkJKnN6Q3VyID0gJ1wwJzsKLQkJZWxzZSB7Ci0JCQkvKiBJZiB3ZSBoYXZlIG5vIHZhbHVlcywgd2UgZG9udCBuZWVkIGEgJzsnICovCi0JCQlpZiAobnVtS2V5cykgewotCQkJCSooc3pDdXIrKykgPSBfVCgnOycpOwotCQkJCWRhdGFTaXplLS07Ci0JCQl9Ci0JCQkvKiBOb3cgYXBwZW5kIHRoZSBjb3JlIHBhdGggZW50cmllcyAtIAotCQkJICAgdGhpcyB3aWxsIGluY2x1ZGUgdGhlIE5VTEwgCi0JCQkqLwotCQkJcmMgPSBSZWdRdWVyeVZhbHVlRXgobmV3S2V5LCBOVUxMLCAwLCBOVUxMLCAKLQkJCSAgICAgICAgICAgICAgICAgICAgIChMUEJZVEUpc3pDdXIsICZkYXRhU2l6ZSk7Ci0JCX0KLQkJLyogQW5kIHNldCB0aGUgcmVzdWx0IC0gY2FsbGVyIG11c3QgZnJlZSAKLQkJICAgSWYgTUJDUywgaXQgaXMgZmluZSBhcyBpcy4gIElmIFVuaWNvZGUsIGFsbG9jYXRlIG5ldwotCQkgICBidWZmZXIgYW5kIGNvbnZlcnQuCi0JCSovCisgICAgLyogb3JpZ2luYWwgZGF0YXNpemUgZnJvbSBSZWdRdWVyeUluZm8gZG9lc24ndCBpbmNsdWRlIHRoZSBcMCAqLworICAgIGRhdGFCdWYgPSBtYWxsb2MoKGRhdGFTaXplKzEpICogc2l6ZW9mKFRDSEFSKSk7CisgICAgaWYgKGRhdGFCdWYpIHsKKyAgICAgICAgVENIQVIgKnN6Q3VyID0gZGF0YUJ1ZjsKKyAgICAgICAgRFdPUkQgcmVxZFNpemUgPSBkYXRhU2l6ZTsKKyAgICAgICAgLyogQ29weSBvdXIgY29sbGVjdGVkIHN0cmluZ3MgKi8KKyAgICAgICAgZm9yIChpbmRleD0wO2luZGV4PG51bUtleXM7aW5kZXgrKykgeworICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgICooc3pDdXIrKykgPSBfVCgnOycpOworICAgICAgICAgICAgICAgIGRhdGFTaXplLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHBQYXRoc1tpbmRleF0pIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IF90Y3NsZW4ocHBQYXRoc1tpbmRleF0pOworICAgICAgICAgICAgICAgIF90Y3NuY3B5KHN6Q3VyLCBwcFBhdGhzW2luZGV4XSwgbGVuKTsKKyAgICAgICAgICAgICAgICBzekN1ciArPSBsZW47CisgICAgICAgICAgICAgICAgYXNzZXJ0KGRhdGFTaXplID4gKERXT1JEKWxlbik7CisgICAgICAgICAgICAgICAgZGF0YVNpemUgLT0gKERXT1JEKWxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2tpcGNvcmUpCisgICAgICAgICAgICAqc3pDdXIgPSAnXDAnOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgbm8gdmFsdWVzLCB3ZSBkb250IG5lZWQgYSAnOycgKi8KKyAgICAgICAgICAgIGlmIChudW1LZXlzKSB7CisgICAgICAgICAgICAgICAgKihzekN1cisrKSA9IF9UKCc7Jyk7CisgICAgICAgICAgICAgICAgZGF0YVNpemUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdyBhcHBlbmQgdGhlIGNvcmUgcGF0aCBlbnRyaWVzIC0KKyAgICAgICAgICAgICAgIHRoaXMgd2lsbCBpbmNsdWRlIHRoZSBOVUxMCisgICAgICAgICAgICAqLworICAgICAgICAgICAgcmMgPSBSZWdRdWVyeVZhbHVlRXgobmV3S2V5LCBOVUxMLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQllURSlzekN1ciwgJmRhdGFTaXplKTsKKyAgICAgICAgfQorICAgICAgICAvKiBBbmQgc2V0IHRoZSByZXN1bHQgLSBjYWxsZXIgbXVzdCBmcmVlCisgICAgICAgICAgIElmIE1CQ1MsIGl0IGlzIGZpbmUgYXMgaXMuICBJZiBVbmljb2RlLCBhbGxvY2F0ZSBuZXcKKyAgICAgICAgICAgYnVmZmVyIGFuZCBjb252ZXJ0LgorICAgICAgICAqLwogI2lmZGVmIFVOSUNPREUKLQkJcmV0dmFsID0gKGNoYXIgKiltYWxsb2MocmVxZFNpemUrMSk7Ci0JCWlmIChyZXR2YWwpCi0JCQlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgCi0JCQkJCWRhdGFCdWYsIC0xLCAvKiBzb3VyY2UgKi8gCi0JCQkJCXJldHZhbCwgcmVxZFNpemUrMSwgLyogZGVzdCAqLwotCQkJCQlOVUxMLCBOVUxMKTsKLQkJZnJlZShkYXRhQnVmKTsKKyAgICAgICAgcmV0dmFsID0gKGNoYXIgKiltYWxsb2MocmVxZFNpemUrMSk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQnVmLCAtMSwgLyogc291cmNlICovCisgICAgICAgICAgICAgICAgICAgIHJldHZhbCwgcmVxZFNpemUrMSwgLyogZGVzdCAqLworICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgICAgZnJlZShkYXRhQnVmKTsKICNlbHNlCi0JCXJldHZhbCA9IGRhdGFCdWY7CisgICAgICAgIHJldHZhbCA9IGRhdGFCdWY7CiAjZW5kaWYKLQl9CisgICAgfQogZG9uZToKLQkvKiBMb29wIGZyZWVpbmcgbXkgdGVtcCBidWZmZXJzICovCi0JaWYgKHBwUGF0aHMpIHsKLQkJZm9yKGluZGV4PTA7aW5kZXg8bnVtS2V5cztpbmRleCsrKQotCQkJaWYgKHBwUGF0aHNbaW5kZXhdKSBmcmVlKHBwUGF0aHNbaW5kZXhdKTsKLQkJZnJlZShwcFBhdGhzKTsKLQl9Ci0JaWYgKG5ld0tleSkKLQkJUmVnQ2xvc2VLZXkobmV3S2V5KTsKLQlpZiAoa2V5QnVmKQotCQlmcmVlKGtleUJ1Zik7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICAvKiBMb29wIGZyZWVpbmcgbXkgdGVtcCBidWZmZXJzICovCisgICAgaWYgKHBwUGF0aHMpIHsKKyAgICAgICAgZm9yKGluZGV4PTA7aW5kZXg8bnVtS2V5cztpbmRleCsrKQorICAgICAgICAgICAgaWYgKHBwUGF0aHNbaW5kZXhdKSBmcmVlKHBwUGF0aHNbaW5kZXhdKTsKKyAgICAgICAgZnJlZShwcFBhdGhzKTsKKyAgICB9CisgICAgaWYgKG5ld0tleSkKKyAgICAgICAgUmVnQ2xvc2VLZXkobmV3S2V5KTsKKyAgICBpZiAoa2V5QnVmKQorICAgICAgICBmcmVlKGtleUJ1Zik7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KICNlbmRpZiAvKiBQeV9FTkFCTEVfU0hBUkVEICovCiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwpAQCAtMzcwLDMxNCArMzcwLDMxNCBAQAogc3RhdGljIHZvaWQKIGdldF9wcm9ncGF0aCh2b2lkKQogewotCWV4dGVybiBjaGFyICpQeV9HZXRQcm9ncmFtTmFtZSh2b2lkKTsKLQljaGFyICpwYXRoID0gZ2V0ZW52KCJQQVRIIik7Ci0JY2hhciAqcHJvZyA9IFB5X0dldFByb2dyYW1OYW1lKCk7CisgICAgZXh0ZXJuIGNoYXIgKlB5X0dldFByb2dyYW1OYW1lKHZvaWQpOworICAgIGNoYXIgKnBhdGggPSBnZXRlbnYoIlBBVEgiKTsKKyAgICBjaGFyICpwcm9nID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQlleHRlcm4gSEFORExFIFB5V2luX0RMTGhNb2R1bGU7CisgICAgZXh0ZXJuIEhBTkRMRSBQeVdpbl9ETExoTW9kdWxlOwogI2lmZGVmIFVOSUNPREUKLQlXQ0hBUiB3cHJvZ3BhdGhbTUFYUEFUSExFTisxXTsKLQkvKiBXaW5kb3dzIGRvY3VtZW50cyB0aGF0IEdldE1vZHVsZUZpbGVOYW1lKCkgd2lsbCAidHJ1bmNhdGUiLAotCSAgIGJ1dCBtYWtlcyBubyBtZW50aW9uIG9mIHRoZSBudWxsIHRlcm1pbmF0b3IuICBQbGF5IGl0IHNhZmUuCi0JICAgUExVUyBXaW5kb3dzIGl0c2VsZiBkZWZpbmVzIE1BWF9QQVRIIGFzIHRoZSBzYW1lLCBidXQgYW55d2F5Li4uCi0JKi8KKyAgICBXQ0hBUiB3cHJvZ3BhdGhbTUFYUEFUSExFTisxXTsKKyAgICAvKiBXaW5kb3dzIGRvY3VtZW50cyB0aGF0IEdldE1vZHVsZUZpbGVOYW1lKCkgd2lsbCAidHJ1bmNhdGUiLAorICAgICAgIGJ1dCBtYWtlcyBubyBtZW50aW9uIG9mIHRoZSBudWxsIHRlcm1pbmF0b3IuICBQbGF5IGl0IHNhZmUuCisgICAgICAgUExVUyBXaW5kb3dzIGl0c2VsZiBkZWZpbmVzIE1BWF9QQVRIIGFzIHRoZSBzYW1lLCBidXQgYW55d2F5Li4uCisgICAgKi8KICNpZmRlZiBQeV9FTkFCTEVfU0hBUkVECi0Jd3Byb2dwYXRoW01BWFBBVEhMRU5dPV9UKCdcMCcpOwotCWlmIChQeVdpbl9ETExoTW9kdWxlICYmCi0JICAgIEdldE1vZHVsZUZpbGVOYW1lKFB5V2luX0RMTGhNb2R1bGUsIHdwcm9ncGF0aCwgTUFYUEFUSExFTikpIHsKLQkJV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIAotCQkgICAgICAgICAgICAgICAgICAgIHdwcm9ncGF0aCwgLTEsIAotCQkgICAgICAgICAgICAgICAgICAgIGRsbHBhdGgsIE1BWFBBVEhMRU4rMSwgCi0JCSAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7Ci0JfQorICAgIHdwcm9ncGF0aFtNQVhQQVRITEVOXT1fVCgnXDAnKTsKKyAgICBpZiAoUHlXaW5fRExMaE1vZHVsZSAmJgorICAgICAgICBHZXRNb2R1bGVGaWxlTmFtZShQeVdpbl9ETExoTW9kdWxlLCB3cHJvZ3BhdGgsIE1BWFBBVEhMRU4pKSB7CisgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwcm9ncGF0aCwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGxscGF0aCwgTUFYUEFUSExFTisxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgIH0KICNlbHNlCi0JZGxscGF0aFswXSA9IDA7CisgICAgZGxscGF0aFswXSA9IDA7CiAjZW5kaWYKLQl3cHJvZ3BhdGhbTUFYUEFUSExFTl09X1QoJ1wwJyk7Ci0JaWYgKEdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIHdwcm9ncGF0aCwgTUFYUEFUSExFTikpIHsKLQkJV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIAotCQkgICAgICAgICAgICAgICAgICAgIHdwcm9ncGF0aCwgLTEsIAotCQkgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBNQVhQQVRITEVOKzEsIAotCQkgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwotCQlyZXR1cm47Ci0JfQorICAgIHdwcm9ncGF0aFtNQVhQQVRITEVOXT1fVCgnXDAnKTsKKyAgICBpZiAoR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgd3Byb2dwYXRoLCBNQVhQQVRITEVOKSkgeworICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cHJvZ3BhdGgsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBNQVhQQVRITEVOKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAjZWxzZQotCS8qIHN0YXRpYyBpbml0IG9mIHByb2dwYXRoIGVuc3VyZXMgZmluYWwgY2hhciByZW1haW5zIFwwICovCisgICAgLyogc3RhdGljIGluaXQgb2YgcHJvZ3BhdGggZW5zdXJlcyBmaW5hbCBjaGFyIHJlbWFpbnMgXDAgKi8KICNpZmRlZiBQeV9FTkFCTEVfU0hBUkVECi0JaWYgKFB5V2luX0RMTGhNb2R1bGUpCi0JCWlmICghR2V0TW9kdWxlRmlsZU5hbWUoUHlXaW5fRExMaE1vZHVsZSwgZGxscGF0aCwgTUFYUEFUSExFTikpCi0JCQlkbGxwYXRoWzBdID0gMDsKKyAgICBpZiAoUHlXaW5fRExMaE1vZHVsZSkKKyAgICAgICAgaWYgKCFHZXRNb2R1bGVGaWxlTmFtZShQeVdpbl9ETExoTW9kdWxlLCBkbGxwYXRoLCBNQVhQQVRITEVOKSkKKyAgICAgICAgICAgIGRsbHBhdGhbMF0gPSAwOwogI2Vsc2UKLQlkbGxwYXRoWzBdID0gMDsKKyAgICBkbGxwYXRoWzBdID0gMDsKICNlbmRpZgotCWlmIChHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBwcm9ncGF0aCwgTUFYUEFUSExFTikpCi0JCXJldHVybjsKKyAgICBpZiAoR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pKQorICAgICAgICByZXR1cm47CiAjZW5kaWYKICNlbmRpZgotCWlmIChwcm9nID09IE5VTEwgfHwgKnByb2cgPT0gJ1wwJykKLQkJcHJvZyA9ICJweXRob24iOworICAgIGlmIChwcm9nID09IE5VTEwgfHwgKnByb2cgPT0gJ1wwJykKKyAgICAgICAgcHJvZyA9ICJweXRob24iOwogCi0JLyogSWYgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIGFyZ3YwIHBhdGgsIHRoZW4gd2UgaGF2ZSB0bwotCSAqIGFzc3VtZSBweXRob24gaXMgb24gdGhlIHVzZXIncyAkUEFUSCwgc2luY2UgdGhlcmUncyBubwotCSAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCi0JICogJFBBVEggaXNuJ3QgZXhwb3J0ZWQsIHlvdSBsb3NlLgotCSAqLworICAgIC8qIElmIHRoZXJlIGlzIG5vIHNsYXNoIGluIHRoZSBhcmd2MCBwYXRoLCB0aGVuIHdlIGhhdmUgdG8KKyAgICAgKiBhc3N1bWUgcHl0aG9uIGlzIG9uIHRoZSB1c2VyJ3MgJFBBVEgsIHNpbmNlIHRoZXJlJ3Mgbm8KKyAgICAgKiBvdGhlciB3YXkgdG8gZmluZCBhIGRpcmVjdG9yeSB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uICBJZgorICAgICAqICRQQVRIIGlzbid0IGV4cG9ydGVkLCB5b3UgbG9zZS4KKyAgICAgKi8KICNpZmRlZiBBTFRTRVAKLQlpZiAoc3RyY2hyKHByb2csIFNFUCkgfHwgc3RyY2hyKHByb2csIEFMVFNFUCkpCisgICAgaWYgKHN0cmNocihwcm9nLCBTRVApIHx8IHN0cmNocihwcm9nLCBBTFRTRVApKQogI2Vsc2UKLQlpZiAoc3RyY2hyKHByb2csIFNFUCkpCisgICAgaWYgKHN0cmNocihwcm9nLCBTRVApKQogI2VuZGlmCi0JCXN0cm5jcHkocHJvZ3BhdGgsIHByb2csIE1BWFBBVEhMRU4pOwotCWVsc2UgaWYgKHBhdGgpIHsKLQkJd2hpbGUgKDEpIHsKLQkJCWNoYXIgKmRlbGltID0gc3RyY2hyKHBhdGgsIERFTElNKTsKKyAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcHJvZywgTUFYUEFUSExFTik7CisgICAgZWxzZSBpZiAocGF0aCkgeworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgY2hhciAqZGVsaW0gPSBzdHJjaHIocGF0aCwgREVMSU0pOwogCi0JCQlpZiAoZGVsaW0pIHsKLQkJCQlzaXplX3QgbGVuID0gZGVsaW0gLSBwYXRoOwotCQkJCS8qIGVuc3VyZSB3ZSBjYW4ndCBvdmVyd3JpdGUgYnVmZmVyICovCi0JCQkJbGVuID0gbWluKE1BWFBBVEhMRU4sbGVuKTsKLQkJCQlzdHJuY3B5KHByb2dwYXRoLCBwYXRoLCBsZW4pOwotCQkJCSoocHJvZ3BhdGggKyBsZW4pID0gJ1wwJzsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzdHJuY3B5KHByb2dwYXRoLCBwYXRoLCBNQVhQQVRITEVOKTsKKyAgICAgICAgICAgIGlmIChkZWxpbSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSBkZWxpbSAtIHBhdGg7CisgICAgICAgICAgICAgICAgLyogZW5zdXJlIHdlIGNhbid0IG92ZXJ3cml0ZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBsZW4gPSBtaW4oTUFYUEFUSExFTixsZW4pOworICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7CisgICAgICAgICAgICAgICAgKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIE1BWFBBVEhMRU4pOwogCi0JCQkvKiBqb2luKCkgaXMgc2FmZSBmb3IgTUFYUEFUSExFTisxIHNpemUgYnVmZmVyICovCi0JCQlqb2luKHByb2dwYXRoLCBwcm9nKTsKLQkJCWlmIChleGlzdHMocHJvZ3BhdGgpKQotCQkJCWJyZWFrOworICAgICAgICAgICAgLyogam9pbigpIGlzIHNhZmUgZm9yIE1BWFBBVEhMRU4rMSBzaXplIGJ1ZmZlciAqLworICAgICAgICAgICAgam9pbihwcm9ncGF0aCwgcHJvZyk7CisgICAgICAgICAgICBpZiAoZXhpc3RzKHByb2dwYXRoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJaWYgKCFkZWxpbSkgewotCQkJCXByb2dwYXRoWzBdID0gJ1wwJzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBhdGggPSBkZWxpbSArIDE7Ci0JCX0KLQl9Ci0JZWxzZQotCQlwcm9ncGF0aFswXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAoIWRlbGltKSB7CisgICAgICAgICAgICAgICAgcHJvZ3BhdGhbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0aCA9IGRlbGltICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIHByb2dwYXRoWzBdID0gJ1wwJzsKIH0KIAogc3RhdGljIHZvaWQKIGNhbGN1bGF0ZV9wYXRoKHZvaWQpCiB7Ci0JY2hhciBhcmd2MF9wYXRoW01BWFBBVEhMRU4rMV07Ci0JY2hhciAqYnVmOwotCXNpemVfdCBidWZzejsKLQljaGFyICpweXRob25ob21lID0gUHlfR2V0UHl0aG9uSG9tZSgpOwotCWNoYXIgKmVudnBhdGggPSBQeV9HRVRFTlYoIlBZVEhPTlBBVEgiKTsKKyAgICBjaGFyIGFyZ3YwX3BhdGhbTUFYUEFUSExFTisxXTsKKyAgICBjaGFyICpidWY7CisgICAgc2l6ZV90IGJ1ZnN6OworICAgIGNoYXIgKnB5dGhvbmhvbWUgPSBQeV9HZXRQeXRob25Ib21lKCk7CisgICAgY2hhciAqZW52cGF0aCA9IFB5X0dFVEVOVigiUFlUSE9OUEFUSCIpOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCWludCBza2lwaG9tZSwgc2tpcGRlZmF1bHQ7Ci0JY2hhciAqbWFjaGluZXBhdGggPSBOVUxMOwotCWNoYXIgKnVzZXJwYXRoID0gTlVMTDsKLQljaGFyIHppcF9wYXRoW01BWFBBVEhMRU4rMV07Ci0Jc2l6ZV90IGxlbjsKKyAgICBpbnQgc2tpcGhvbWUsIHNraXBkZWZhdWx0OworICAgIGNoYXIgKm1hY2hpbmVwYXRoID0gTlVMTDsKKyAgICBjaGFyICp1c2VycGF0aCA9IE5VTEw7CisgICAgY2hhciB6aXBfcGF0aFtNQVhQQVRITEVOKzFdOworICAgIHNpemVfdCBsZW47CiAjZW5kaWYKIAotCWdldF9wcm9ncGF0aCgpOwotCS8qIHByb2dwYXRoIGd1YXJhbnRlZWQgXDAgdGVybWluYXRlZCBpbiBNQVhQQVRIKzEgYnl0ZXMuICovCi0Jc3RyY3B5KGFyZ3YwX3BhdGgsIHByb2dwYXRoKTsKLQlyZWR1Y2UoYXJndjBfcGF0aCk7Ci0JaWYgKHB5dGhvbmhvbWUgPT0gTlVMTCB8fCAqcHl0aG9uaG9tZSA9PSAnXDAnKSB7Ci0JCWlmIChzZWFyY2hfZm9yX3ByZWZpeChhcmd2MF9wYXRoLCBMQU5ETUFSSykpCi0JCQlweXRob25ob21lID0gcHJlZml4OwotCQllbHNlCi0JCQlweXRob25ob21lID0gTlVMTDsKLQl9Ci0JZWxzZQotCQlzdHJuY3B5KHByZWZpeCwgcHl0aG9uaG9tZSwgTUFYUEFUSExFTik7CisgICAgZ2V0X3Byb2dwYXRoKCk7CisgICAgLyogcHJvZ3BhdGggZ3VhcmFudGVlZCBcMCB0ZXJtaW5hdGVkIGluIE1BWFBBVEgrMSBieXRlcy4gKi8KKyAgICBzdHJjcHkoYXJndjBfcGF0aCwgcHJvZ3BhdGgpOworICAgIHJlZHVjZShhcmd2MF9wYXRoKTsKKyAgICBpZiAocHl0aG9uaG9tZSA9PSBOVUxMIHx8ICpweXRob25ob21lID09ICdcMCcpIHsKKyAgICAgICAgaWYgKHNlYXJjaF9mb3JfcHJlZml4KGFyZ3YwX3BhdGgsIExBTkRNQVJLKSkKKyAgICAgICAgICAgIHB5dGhvbmhvbWUgPSBwcmVmaXg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHB5dGhvbmhvbWUgPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHN0cm5jcHkocHJlZml4LCBweXRob25ob21lLCBNQVhQQVRITEVOKTsKIAotCWlmIChlbnZwYXRoICYmICplbnZwYXRoID09ICdcMCcpCi0JCWVudnBhdGggPSBOVUxMOworICAgIGlmIChlbnZwYXRoICYmICplbnZwYXRoID09ICdcMCcpCisgICAgICAgIGVudnBhdGggPSBOVUxMOwogCiAKICNpZmRlZiBNU19XSU5ET1dTCi0JLyogQ2FsY3VsYXRlIHppcCBhcmNoaXZlIHBhdGggKi8KLQlpZiAoZGxscGF0aFswXSkJCS8qIHVzZSBuYW1lIG9mIHB5dGhvbiBETEwgKi8KLQkJc3RybmNweSh6aXBfcGF0aCwgZGxscGF0aCwgTUFYUEFUSExFTik7Ci0JZWxzZQkJCS8qIHVzZSBuYW1lIG9mIGV4ZWN1dGFibGUgcHJvZ3JhbSAqLwotCQlzdHJuY3B5KHppcF9wYXRoLCBwcm9ncGF0aCwgTUFYUEFUSExFTik7Ci0JemlwX3BhdGhbTUFYUEFUSExFTl0gPSAnXDAnOwotCWxlbiA9IHN0cmxlbih6aXBfcGF0aCk7Ci0JaWYgKGxlbiA+IDQpIHsKLQkJemlwX3BhdGhbbGVuLTNdID0gJ3onOwkvKiBjaGFuZ2UgZW5kaW5nIHRvICJ6aXAiICovCi0JCXppcF9wYXRoW2xlbi0yXSA9ICdpJzsKLQkJemlwX3BhdGhbbGVuLTFdID0gJ3AnOwotCX0KLQllbHNlIHsKLQkJemlwX3BhdGhbMF0gPSAwOwotCX0KLSAKLQlza2lwaG9tZSA9IHB5dGhvbmhvbWU9PU5VTEwgPyAwIDogMTsKKyAgICAvKiBDYWxjdWxhdGUgemlwIGFyY2hpdmUgcGF0aCAqLworICAgIGlmIChkbGxwYXRoWzBdKSAgICAgICAgICAgICAvKiB1c2UgbmFtZSBvZiBweXRob24gRExMICovCisgICAgICAgIHN0cm5jcHkoemlwX3BhdGgsIGRsbHBhdGgsIE1BWFBBVEhMRU4pOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgbmFtZSBvZiBleGVjdXRhYmxlIHByb2dyYW0gKi8KKyAgICAgICAgc3RybmNweSh6aXBfcGF0aCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pOworICAgIHppcF9wYXRoW01BWFBBVEhMRU5dID0gJ1wwJzsKKyAgICBsZW4gPSBzdHJsZW4oemlwX3BhdGgpOworICAgIGlmIChsZW4gPiA0KSB7CisgICAgICAgIHppcF9wYXRoW2xlbi0zXSA9ICd6JzsgICAgICAgICAgLyogY2hhbmdlIGVuZGluZyB0byAiemlwIiAqLworICAgICAgICB6aXBfcGF0aFtsZW4tMl0gPSAnaSc7CisgICAgICAgIHppcF9wYXRoW2xlbi0xXSA9ICdwJzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHppcF9wYXRoWzBdID0gMDsKKyAgICB9CisKKyAgICBza2lwaG9tZSA9IHB5dGhvbmhvbWU9PU5VTEwgPyAwIDogMTsKICNpZmRlZiBQeV9FTkFCTEVfU0hBUkVECi0JbWFjaGluZXBhdGggPSBnZXRweXRob25yZWdwYXRoKEhLRVlfTE9DQUxfTUFDSElORSwgc2tpcGhvbWUpOwotCXVzZXJwYXRoID0gZ2V0cHl0aG9ucmVncGF0aChIS0VZX0NVUlJFTlRfVVNFUiwgc2tpcGhvbWUpOworICAgIG1hY2hpbmVwYXRoID0gZ2V0cHl0aG9ucmVncGF0aChIS0VZX0xPQ0FMX01BQ0hJTkUsIHNraXBob21lKTsKKyAgICB1c2VycGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9DVVJSRU5UX1VTRVIsIHNraXBob21lKTsKICNlbmRpZgotCS8qIFdlIG9ubHkgdXNlIHRoZSBkZWZhdWx0IHJlbGF0aXZlIFBZVEhPTlBBVEggaWYgd2UgaGF2ZW50Ci0JICAgYW55dGhpbmcgYmV0dGVyIHRvIHVzZSEgKi8KLQlza2lwZGVmYXVsdCA9IGVudnBhdGghPU5VTEwgfHwgcHl0aG9uaG9tZSE9TlVMTCB8fCBcCi0JCSAgICAgIG1hY2hpbmVwYXRoIT1OVUxMIHx8IHVzZXJwYXRoIT1OVUxMOworICAgIC8qIFdlIG9ubHkgdXNlIHRoZSBkZWZhdWx0IHJlbGF0aXZlIFBZVEhPTlBBVEggaWYgd2UgaGF2ZW50CisgICAgICAgYW55dGhpbmcgYmV0dGVyIHRvIHVzZSEgKi8KKyAgICBza2lwZGVmYXVsdCA9IGVudnBhdGghPU5VTEwgfHwgcHl0aG9uaG9tZSE9TlVMTCB8fCBcCisgICAgICAgICAgICAgICAgICBtYWNoaW5lcGF0aCE9TlVMTCB8fCB1c2VycGF0aCE9TlVMTDsKICNlbmRpZgogCi0JLyogV2UgbmVlZCB0byBjb25zdHJ1Y3QgYSBwYXRoIGZyb20gdGhlIGZvbGxvd2luZyBwYXJ0cy4KLQkgICAoMSkgdGhlIFBZVEhPTlBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmIHNldDsKLQkgICAoMikgZm9yIFdpbjMyLCB0aGUgemlwIGFyY2hpdmUgZmlsZSBwYXRoOwotCSAgICgzKSBmb3IgV2luMzIsIHRoZSBtYWNoaW5lcGF0aCBhbmQgdXNlcnBhdGgsIGlmIHNldDsKLQkgICAoNCkgdGhlIFBZVEhPTlBBVEggY29uZmlnIG1hY3JvLCB3aXRoIHRoZSBsZWFkaW5nICIuIgotCSAgICAgICBvZiBlYWNoIGNvbXBvbmVudCByZXBsYWNlZCB3aXRoIHB5dGhvbmhvbWUsIGlmIHNldDsKLQkgICAoNSkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIChhcmd2MF9wYXRoKS4KLQkgICBUaGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGNhbGN1bGF0ZXMgIzQgZmlyc3QuCi0JICAgRXh0cmEgcnVsZXM6Ci0JICAgLSBJZiBQWVRIT05IT01FIGlzIHNldCAoaW4gYW55IHdheSkgaXRlbSAoMykgaXMgaWdub3JlZC4KLQkgICAtIElmIHJlZ2lzdHJ5IHZhbHVlcyBhcmUgdXNlZCwgKDQpIGFuZCAoNSkgYXJlIGlnbm9yZWQuCi0JKi8KKyAgICAvKiBXZSBuZWVkIHRvIGNvbnN0cnVjdCBhIHBhdGggZnJvbSB0aGUgZm9sbG93aW5nIHBhcnRzLgorICAgICAgICgxKSB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0OworICAgICAgICgyKSBmb3IgV2luMzIsIHRoZSB6aXAgYXJjaGl2ZSBmaWxlIHBhdGg7CisgICAgICAgKDMpIGZvciBXaW4zMiwgdGhlIG1hY2hpbmVwYXRoIGFuZCB1c2VycGF0aCwgaWYgc2V0OworICAgICAgICg0KSB0aGUgUFlUSE9OUEFUSCBjb25maWcgbWFjcm8sIHdpdGggdGhlIGxlYWRpbmcgIi4iCisgICAgICAgICAgIG9mIGVhY2ggY29tcG9uZW50IHJlcGxhY2VkIHdpdGggcHl0aG9uaG9tZSwgaWYgc2V0OworICAgICAgICg1KSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGV4ZWN1dGFibGUgKGFyZ3YwX3BhdGgpLgorICAgICAgIFRoZSBsZW5ndGggY2FsY3VsYXRpb24gY2FsY3VsYXRlcyAjNCBmaXJzdC4KKyAgICAgICBFeHRyYSBydWxlczoKKyAgICAgICAtIElmIFBZVEhPTkhPTUUgaXMgc2V0IChpbiBhbnkgd2F5KSBpdGVtICgzKSBpcyBpZ25vcmVkLgorICAgICAgIC0gSWYgcmVnaXN0cnkgdmFsdWVzIGFyZSB1c2VkLCAoNCkgYW5kICg1KSBhcmUgaWdub3JlZC4KKyAgICAqLwogCi0JLyogQ2FsY3VsYXRlIHNpemUgb2YgcmV0dXJuIGJ1ZmZlciAqLwotCWlmIChweXRob25ob21lICE9IE5VTEwpIHsKLQkJY2hhciAqcDsKLQkJYnVmc3ogPSAxOwkKLQkJZm9yIChwID0gUFlUSE9OUEFUSDsgKnA7IHArKykgewotCQkJaWYgKCpwID09IERFTElNKQotCQkJCWJ1ZnN6Kys7IC8qIG51bWJlciBvZiBERUxJTSBwbHVzIG9uZSAqLwotCQl9Ci0JCWJ1ZnN6ICo9IHN0cmxlbihweXRob25ob21lKTsKLQl9Ci0JZWxzZQotCQlidWZzeiA9IDA7Ci0JYnVmc3ogKz0gc3RybGVuKFBZVEhPTlBBVEgpICsgMTsKLQlidWZzeiArPSBzdHJsZW4oYXJndjBfcGF0aCkgKyAxOworICAgIC8qIENhbGN1bGF0ZSBzaXplIG9mIHJldHVybiBidWZmZXIgKi8KKyAgICBpZiAocHl0aG9uaG9tZSAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKnA7CisgICAgICAgIGJ1ZnN6ID0gMTsKKyAgICAgICAgZm9yIChwID0gUFlUSE9OUEFUSDsgKnA7IHArKykgeworICAgICAgICAgICAgaWYgKCpwID09IERFTElNKQorICAgICAgICAgICAgICAgIGJ1ZnN6Kys7IC8qIG51bWJlciBvZiBERUxJTSBwbHVzIG9uZSAqLworICAgICAgICB9CisgICAgICAgIGJ1ZnN6ICo9IHN0cmxlbihweXRob25ob21lKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBidWZzeiA9IDA7CisgICAgYnVmc3ogKz0gc3RybGVuKFBZVEhPTlBBVEgpICsgMTsKKyAgICBidWZzeiArPSBzdHJsZW4oYXJndjBfcGF0aCkgKyAxOwogI2lmZGVmIE1TX1dJTkRPV1MKLQlpZiAodXNlcnBhdGgpCi0JCWJ1ZnN6ICs9IHN0cmxlbih1c2VycGF0aCkgKyAxOwotCWlmIChtYWNoaW5lcGF0aCkKLQkJYnVmc3ogKz0gc3RybGVuKG1hY2hpbmVwYXRoKSArIDE7Ci0JYnVmc3ogKz0gc3RybGVuKHppcF9wYXRoKSArIDE7CisgICAgaWYgKHVzZXJwYXRoKQorICAgICAgICBidWZzeiArPSBzdHJsZW4odXNlcnBhdGgpICsgMTsKKyAgICBpZiAobWFjaGluZXBhdGgpCisgICAgICAgIGJ1ZnN6ICs9IHN0cmxlbihtYWNoaW5lcGF0aCkgKyAxOworICAgIGJ1ZnN6ICs9IHN0cmxlbih6aXBfcGF0aCkgKyAxOwogI2VuZGlmCi0JaWYgKGVudnBhdGggIT0gTlVMTCkKLQkJYnVmc3ogKz0gc3RybGVuKGVudnBhdGgpICsgMTsKKyAgICBpZiAoZW52cGF0aCAhPSBOVUxMKQorICAgICAgICBidWZzeiArPSBzdHJsZW4oZW52cGF0aCkgKyAxOwogCi0JbW9kdWxlX3NlYXJjaF9wYXRoID0gYnVmID0gbWFsbG9jKGJ1ZnN6KTsKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJLyogV2UgY2FuJ3QgZXhpdCwgc28gcHJpbnQgYSB3YXJuaW5nIGFuZCBsaW1wIGFsb25nICovCi0JCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgbWFsbG9jIGR5bmFtaWMgUFlUSE9OUEFUSC5cbiIpOwotCQlpZiAoZW52cGF0aCkgewotCQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBlbnZpcm9ubWVudCAkUFlUSE9OUEFUSC5cbiIpOwotCQkJbW9kdWxlX3NlYXJjaF9wYXRoID0gZW52cGF0aDsKLQkJfQotCQllbHNlIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgZGVmYXVsdCBzdGF0aWMgcGF0aC5cbiIpOwotCQkJbW9kdWxlX3NlYXJjaF9wYXRoID0gUFlUSE9OUEFUSDsKLQkJfQorICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IGJ1ZiA9IG1hbGxvYyhidWZzeik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIC8qIFdlIGNhbid0IGV4aXQsIHNvIHByaW50IGEgd2FybmluZyBhbmQgbGltcCBhbG9uZyAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG1hbGxvYyBkeW5hbWljIFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgaWYgKGVudnBhdGgpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNpbmcgZW52aXJvbm1lbnQgJFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IGVudnBhdGg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGRlZmF1bHQgc3RhdGljIHBhdGguXG4iKTsKKyAgICAgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IFBZVEhPTlBBVEg7CisgICAgICAgIH0KICNpZmRlZiBNU19XSU5ET1dTCi0JCWlmIChtYWNoaW5lcGF0aCkKLQkJCWZyZWUobWFjaGluZXBhdGgpOwotCQlpZiAodXNlcnBhdGgpCi0JCQlmcmVlKHVzZXJwYXRoKTsKKyAgICAgICAgaWYgKG1hY2hpbmVwYXRoKQorICAgICAgICAgICAgZnJlZShtYWNoaW5lcGF0aCk7CisgICAgICAgIGlmICh1c2VycGF0aCkKKyAgICAgICAgICAgIGZyZWUodXNlcnBhdGgpOwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KLQkJcmV0dXJuOwotCX0KKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCWlmIChlbnZwYXRoKSB7Ci0JCXN0cmNweShidWYsIGVudnBhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJKmJ1ZisrID0gREVMSU07Ci0JfQorICAgIGlmIChlbnZwYXRoKSB7CisgICAgICAgIHN0cmNweShidWYsIGVudnBhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgfQogI2lmZGVmIE1TX1dJTkRPV1MKLQlpZiAoemlwX3BhdGhbMF0pIHsKLQkJc3RyY3B5KGJ1ZiwgemlwX3BhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJKmJ1ZisrID0gREVMSU07Ci0JfQotCWlmICh1c2VycGF0aCkgewotCQlzdHJjcHkoYnVmLCB1c2VycGF0aCk7Ci0JCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkqYnVmKysgPSBERUxJTTsKLQkJZnJlZSh1c2VycGF0aCk7Ci0JfQotCWlmIChtYWNoaW5lcGF0aCkgewotCQlzdHJjcHkoYnVmLCBtYWNoaW5lcGF0aCk7Ci0JCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkqYnVmKysgPSBERUxJTTsKLQkJZnJlZShtYWNoaW5lcGF0aCk7Ci0JfQotCWlmIChweXRob25ob21lID09IE5VTEwpIHsKLQkJaWYgKCFza2lwZGVmYXVsdCkgewotCQkJc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7Ci0JCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJfQotCX0KKyAgICBpZiAoemlwX3BhdGhbMF0pIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgemlwX3BhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgfQorICAgIGlmICh1c2VycGF0aCkgeworICAgICAgICBzdHJjcHkoYnVmLCB1c2VycGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICAgICAgZnJlZSh1c2VycGF0aCk7CisgICAgfQorICAgIGlmIChtYWNoaW5lcGF0aCkgeworICAgICAgICBzdHJjcHkoYnVmLCBtYWNoaW5lcGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICAgICAgZnJlZShtYWNoaW5lcGF0aCk7CisgICAgfQorICAgIGlmIChweXRob25ob21lID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFza2lwZGVmYXVsdCkgeworICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7CisgICAgICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgfQorICAgIH0KICNlbHNlCi0JaWYgKHB5dGhvbmhvbWUgPT0gTlVMTCkgewotCQlzdHJjcHkoYnVmLCBQWVRIT05QQVRIKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JfQorICAgIGlmIChweXRob25ob21lID09IE5VTEwpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgIH0KICNlbmRpZiAvKiBNU19XSU5ET1dTICovCi0JZWxzZSB7Ci0JCWNoYXIgKnAgPSBQWVRIT05QQVRIOwotCQljaGFyICpxOwotCQlzaXplX3QgbjsKLQkJZm9yICg7OykgewotCQkJcSA9IHN0cmNocihwLCBERUxJTSk7Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCW4gPSBzdHJsZW4ocCk7Ci0JCQllbHNlCi0JCQkJbiA9IHEtcDsKLQkJCWlmIChwWzBdID09ICcuJyAmJiBpc19zZXAocFsxXSkpIHsKLQkJCQlzdHJjcHkoYnVmLCBweXRob25ob21lKTsKLQkJCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJCQlwKys7Ci0JCQkJbi0tOwotCQkJfQotCQkJc3RybmNweShidWYsIHAsIG4pOwotCQkJYnVmICs9IG47Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJKmJ1ZisrID0gREVMSU07Ci0JCQlwID0gcSsxOwotCQl9Ci0JfQotCWlmIChhcmd2MF9wYXRoKSB7Ci0JCSpidWYrKyA9IERFTElNOwotCQlzdHJjcHkoYnVmLCBhcmd2MF9wYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JfQotCSpidWYgPSAnXDAnOwotCS8qIE5vdyB0byBwdWxsIG9uZSBsYXN0IGhhY2svdHJpY2suICBJZiBzeXMucHJlZml4IGlzCi0JICAgZW1wdHksIHRoZW4gdHJ5IGFuZCBmaW5kIGl0IHNvbWV3aGVyZSBvbiB0aGUgcGF0aHMKLQkgICB3ZSBjYWxjdWxhdGVkLiAgV2Ugc2NhbiBiYWNrd2FyZHMsIGFzIG91ciBnZW5lcmFsIHBvbGljeQotCSAgIGlzIHRoYXQgUHl0aG9uIGNvcmUgZGlyZWN0b3JpZXMgYXJlIGF0IHRoZSAqZW5kKiBvZgotCSAgIHN5cy5wYXRoLiAgV2UgYXNzdW1lIHRoYXQgb3VyICJsaWIiIGRpcmVjdG9yeSBpcwotCSAgIG9uIHRoZSBwYXRoLCBhbmQgdGhhdCBvdXIgJ3ByZWZpeCcgZGlyZWN0b3J5IGlzCi0JICAgdGhlIHBhcmVudCBvZiB0aGF0LgotCSovCi0JaWYgKCpwcmVmaXg9PSdcMCcpIHsKLQkJY2hhciBsb29rQnVmW01BWFBBVEhMRU4rMV07Ci0JCWNoYXIgKmxvb2sgPSBidWYgLSAxOyAvKiAnYnVmJyBpcyBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KLQkJd2hpbGUgKDEpIHsKLQkJCVB5X3NzaXplX3QgbmNoYXJzOwotCQkJY2hhciAqbG9va0VuZCA9IGxvb2s7Ci0JCQkvKiAnbG9vaycgd2lsbCBlbmQgdXAgb25lIGNoYXJhY3RlciBiZWZvcmUgdGhlCi0JCQkgICBzdGFydCBvZiB0aGUgcGF0aCBpbiBxdWVzdGlvbiAtIGV2ZW4gaWYgdGhpcwotCQkJICAgaXMgb25lIGNoYXJhY3RlciBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIKLQkJCSovCi0JCQl3aGlsZSAobG9vayA+PSBtb2R1bGVfc2VhcmNoX3BhdGggJiYgKmxvb2sgIT0gREVMSU0pCi0JCQkJbG9vay0tOwotCQkJbmNoYXJzID0gbG9va0VuZC1sb29rOwotCQkJc3RybmNweShsb29rQnVmLCBsb29rKzEsIG5jaGFycyk7Ci0JCQlsb29rQnVmW25jaGFyc10gPSAnXDAnOwotCQkJLyogVXAgb25lIGxldmVsIHRvIHRoZSBwYXJlbnQgKi8KLQkJCXJlZHVjZShsb29rQnVmKTsKLQkJCWlmIChzZWFyY2hfZm9yX3ByZWZpeChsb29rQnVmLCBMQU5ETUFSSykpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIElmIHdlIGFyZSBvdXQgb2YgcGF0aHMgdG8gc2VhcmNoIC0gZ2l2ZSB1cCAqLwotCQkJaWYgKGxvb2sgPCBtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCQkJYnJlYWs7Ci0JCQlsb29rLS07Ci0JCX0KLQl9CisgICAgZWxzZSB7CisgICAgICAgIGNoYXIgKnAgPSBQWVRIT05QQVRIOworICAgICAgICBjaGFyICpxOworICAgICAgICBzaXplX3QgbjsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgcSA9IHN0cmNocihwLCBERUxJTSk7CisgICAgICAgICAgICBpZiAocSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIG4gPSBzdHJsZW4ocCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbiA9IHEtcDsKKyAgICAgICAgICAgIGlmIChwWzBdID09ICcuJyAmJiBpc19zZXAocFsxXSkpIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkoYnVmLCBweXRob25ob21lKTsKKyAgICAgICAgICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybmNweShidWYsIHAsIG4pOworICAgICAgICAgICAgYnVmICs9IG47CisgICAgICAgICAgICBpZiAocSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgICAgICAgICBwID0gcSsxOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhcmd2MF9wYXRoKSB7CisgICAgICAgICpidWYrKyA9IERFTElNOworICAgICAgICBzdHJjcHkoYnVmLCBhcmd2MF9wYXRoKTsKKyAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgfQorICAgICpidWYgPSAnXDAnOworICAgIC8qIE5vdyB0byBwdWxsIG9uZSBsYXN0IGhhY2svdHJpY2suICBJZiBzeXMucHJlZml4IGlzCisgICAgICAgZW1wdHksIHRoZW4gdHJ5IGFuZCBmaW5kIGl0IHNvbWV3aGVyZSBvbiB0aGUgcGF0aHMKKyAgICAgICB3ZSBjYWxjdWxhdGVkLiAgV2Ugc2NhbiBiYWNrd2FyZHMsIGFzIG91ciBnZW5lcmFsIHBvbGljeQorICAgICAgIGlzIHRoYXQgUHl0aG9uIGNvcmUgZGlyZWN0b3JpZXMgYXJlIGF0IHRoZSAqZW5kKiBvZgorICAgICAgIHN5cy5wYXRoLiAgV2UgYXNzdW1lIHRoYXQgb3VyICJsaWIiIGRpcmVjdG9yeSBpcworICAgICAgIG9uIHRoZSBwYXRoLCBhbmQgdGhhdCBvdXIgJ3ByZWZpeCcgZGlyZWN0b3J5IGlzCisgICAgICAgdGhlIHBhcmVudCBvZiB0aGF0LgorICAgICovCisgICAgaWYgKCpwcmVmaXg9PSdcMCcpIHsKKyAgICAgICAgY2hhciBsb29rQnVmW01BWFBBVEhMRU4rMV07CisgICAgICAgIGNoYXIgKmxvb2sgPSBidWYgLSAxOyAvKiAnYnVmJyBpcyBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbmNoYXJzOworICAgICAgICAgICAgY2hhciAqbG9va0VuZCA9IGxvb2s7CisgICAgICAgICAgICAvKiAnbG9vaycgd2lsbCBlbmQgdXAgb25lIGNoYXJhY3RlciBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgcGF0aCBpbiBxdWVzdGlvbiAtIGV2ZW4gaWYgdGhpcworICAgICAgICAgICAgICAgaXMgb25lIGNoYXJhY3RlciBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICovCisgICAgICAgICAgICB3aGlsZSAobG9vayA+PSBtb2R1bGVfc2VhcmNoX3BhdGggJiYgKmxvb2sgIT0gREVMSU0pCisgICAgICAgICAgICAgICAgbG9vay0tOworICAgICAgICAgICAgbmNoYXJzID0gbG9va0VuZC1sb29rOworICAgICAgICAgICAgc3RybmNweShsb29rQnVmLCBsb29rKzEsIG5jaGFycyk7CisgICAgICAgICAgICBsb29rQnVmW25jaGFyc10gPSAnXDAnOworICAgICAgICAgICAgLyogVXAgb25lIGxldmVsIHRvIHRoZSBwYXJlbnQgKi8KKyAgICAgICAgICAgIHJlZHVjZShsb29rQnVmKTsKKyAgICAgICAgICAgIGlmIChzZWFyY2hfZm9yX3ByZWZpeChsb29rQnVmLCBMQU5ETUFSSykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIElmIHdlIGFyZSBvdXQgb2YgcGF0aHMgdG8gc2VhcmNoIC0gZ2l2ZSB1cCAqLworICAgICAgICAgICAgaWYgKGxvb2sgPCBtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBsb29rLS07CisgICAgICAgIH0KKyAgICB9CiB9CiAKIApAQCAtNjg2LDI5ICs2ODYsMjkgQEAKIGNoYXIgKgogUHlfR2V0UGF0aCh2b2lkKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOwotCXJldHVybiBtb2R1bGVfc2VhcmNoX3BhdGg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIG1vZHVsZV9zZWFyY2hfcGF0aDsKIH0KIAogY2hhciAqCiBQeV9HZXRQcmVmaXgodm9pZCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKLQlyZXR1cm4gcHJlZml4OworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOworICAgIHJldHVybiBwcmVmaXg7CiB9CiAKIGNoYXIgKgogUHlfR2V0RXhlY1ByZWZpeCh2b2lkKQogewotCXJldHVybiBQeV9HZXRQcmVmaXgoKTsKKyAgICByZXR1cm4gUHlfR2V0UHJlZml4KCk7CiB9CiAKIGNoYXIgKgogUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKHZvaWQpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7Ci0JcmV0dXJuIHByb2dwYXRoOworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOworICAgIHJldHVybiBwcm9ncGF0aDsKIH0KZGlmZiAtLWdpdCBhL1BDL2ltcG9ydF9udC5jIGIvUEMvaW1wb3J0X250LmMKaW5kZXggZTdkMTUyYS4uMTk2YTc3NCAxMDA2NDQKLS0tIGEvUEMvaW1wb3J0X250LmMKKysrIGIvUEMvaW1wb3J0X250LmMKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotIGltcG9ydF9udC5jIAorIGltcG9ydF9udC5jCiAKICAgV2luMzIgc3BlY2lmaWMgaW1wb3J0IGNvZGUuCiAKQEAgLTE2LDcxICsxNiw3MSBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKlB5V2luX0RMTFZlcnNpb25TdHJpbmc7CiAKIEZJTEUgKlB5V2luX0ZpbmRSZWdpc3RlcmVkTW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCi0JCQkJIHN0cnVjdCBmaWxlZGVzY3IgKipwcEZpbGVEZXNjLAotCQkJCSBjaGFyICpwYXRoQnVmLAotCQkJCSBQeV9zc2l6ZV90IHBhdGhMZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZWRlc2NyICoqcHBGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhdGhCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHBhdGhMZW4pCiB7Ci0JY2hhciAqbW9kdWxlS2V5OwotCWNvbnN0IGNoYXIga2V5UHJlZml4W10gPSAiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZVxcIjsKLQljb25zdCBjaGFyIGtleVN1ZmZpeFtdID0gIlxcTW9kdWxlc1xcIjsKKyAgICBjaGFyICptb2R1bGVLZXk7CisgICAgY29uc3QgY2hhciBrZXlQcmVmaXhbXSA9ICJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwiOworICAgIGNvbnN0IGNoYXIga2V5U3VmZml4W10gPSAiXFxNb2R1bGVzXFwiOwogI2lmZGVmIF9ERUJVRwotCS8qIEluIGRlYnVnZ2luZyBidWlsZHMsIHdlIF9tdXN0XyBoYXZlIHRoZSBkZWJ1ZyB2ZXJzaW9uCi0JICogcmVnaXN0ZXJlZC4KLQkgKi8KLQljb25zdCBjaGFyIGRlYnVnU3RyaW5nW10gPSAiXFxEZWJ1ZyI7CisgICAgLyogSW4gZGVidWdnaW5nIGJ1aWxkcywgd2UgX211c3RfIGhhdmUgdGhlIGRlYnVnIHZlcnNpb24KKyAgICAgKiByZWdpc3RlcmVkLgorICAgICAqLworICAgIGNvbnN0IGNoYXIgZGVidWdTdHJpbmdbXSA9ICJcXERlYnVnIjsKICNlbHNlCi0JY29uc3QgY2hhciBkZWJ1Z1N0cmluZ1tdID0gIiI7CisgICAgY29uc3QgY2hhciBkZWJ1Z1N0cmluZ1tdID0gIiI7CiAjZW5kaWYKLQlzdHJ1Y3QgZmlsZWRlc2NyICpmZHAgPSBOVUxMOwotCUZJTEUgKmZwOwotCUhLRVkga2V5QmFzZSA9IEhLRVlfQ1VSUkVOVF9VU0VSOwotCWludCBtb2ROYW1lU2l6ZTsKLQlsb25nIHJlZ1N0YXQ7CisgICAgc3RydWN0IGZpbGVkZXNjciAqZmRwID0gTlVMTDsKKyAgICBGSUxFICpmcDsKKyAgICBIS0VZIGtleUJhc2UgPSBIS0VZX0NVUlJFTlRfVVNFUjsKKyAgICBpbnQgbW9kTmFtZVNpemU7CisgICAgbG9uZyByZWdTdGF0OwogCi0JLyogQ2FsY3VsYXRlIHRoZSBzaXplIGZvciB0aGUgc3ByaW50ZiBidWZmZXIuCi0JICogR2V0IHRoZSBzaXplIG9mIHRoZSBjaGFycyBvbmx5LCBwbHVzIDEgTlVMTC4KLQkgKi8KLQlzaXplX3QgYnVmU2l6ZSA9IHNpemVvZihrZXlQcmVmaXgpLTEgKwotCSAgICAgICAgICAgICAgICAgc3RybGVuKFB5V2luX0RMTFZlcnNpb25TdHJpbmcpICsKLQkgICAgICAgICAgICAgICAgIHNpemVvZihrZXlTdWZmaXgpICsKLQkgICAgICAgICAgICAgICAgIHN0cmxlbihtb2R1bGVOYW1lKSArCi0JICAgICAgICAgICAgICAgICBzaXplb2YoZGVidWdTdHJpbmcpIC0gMTsKLQkvKiBhbGxvY2EgPT0gbm8gZnJlZSByZXF1aXJlZCwgYnV0IG1lbW9yeSBvbmx5IGxvY2FsIHRvIGZuLAotCSAqIGFsc28gbm8gaGVhcCBmcmFnbWVudGF0aW9uIQotCSAqLwotCW1vZHVsZUtleSA9IGFsbG9jYShidWZTaXplKTsgCi0JUHlPU19zbnByaW50Zihtb2R1bGVLZXksIGJ1ZlNpemUsCi0JCSAgICAgICJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwlc1xcTW9kdWxlc1xcJXMlcyIsCi0JCSAgICAgIFB5V2luX0RMTFZlcnNpb25TdHJpbmcsIG1vZHVsZU5hbWUsIGRlYnVnU3RyaW5nKTsKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHNpemUgZm9yIHRoZSBzcHJpbnRmIGJ1ZmZlci4KKyAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIGNoYXJzIG9ubHksIHBsdXMgMSBOVUxMLgorICAgICAqLworICAgIHNpemVfdCBidWZTaXplID0gc2l6ZW9mKGtleVByZWZpeCktMSArCisgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oUHlXaW5fRExMVmVyc2lvblN0cmluZykgKworICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtleVN1ZmZpeCkgKworICAgICAgICAgICAgICAgICAgICAgc3RybGVuKG1vZHVsZU5hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZWJ1Z1N0cmluZykgLSAxOworICAgIC8qIGFsbG9jYSA9PSBubyBmcmVlIHJlcXVpcmVkLCBidXQgbWVtb3J5IG9ubHkgbG9jYWwgdG8gZm4sCisgICAgICogYWxzbyBubyBoZWFwIGZyYWdtZW50YXRpb24hCisgICAgICovCisgICAgbW9kdWxlS2V5ID0gYWxsb2NhKGJ1ZlNpemUpOworICAgIFB5T1Nfc25wcmludGYobW9kdWxlS2V5LCBidWZTaXplLAorICAgICAgICAgICAgICAgICAgIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCVzXFxNb2R1bGVzXFwlcyVzIiwKKyAgICAgICAgICAgICAgICAgIFB5V2luX0RMTFZlcnNpb25TdHJpbmcsIG1vZHVsZU5hbWUsIGRlYnVnU3RyaW5nKTsKIAotCWFzc2VydChwYXRoTGVuIDwgSU5UX01BWCk7Ci0JbW9kTmFtZVNpemUgPSAoaW50KXBhdGhMZW47Ci0JcmVnU3RhdCA9IFJlZ1F1ZXJ5VmFsdWUoa2V5QmFzZSwgbW9kdWxlS2V5LCBwYXRoQnVmLCAmbW9kTmFtZVNpemUpOwotCWlmIChyZWdTdGF0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkJLyogTm8gdXNlciBzZXR0aW5nIC0gbG9va3VwIGluIG1hY2hpbmUgc2V0dGluZ3MgKi8KLQkJa2V5QmFzZSA9IEhLRVlfTE9DQUxfTUFDSElORTsKLQkJLyogYmUgYW5hbCAtIGZhaWx1cmUgbWF5IGhhdmUgcmVzZXQgc2l6ZSBwYXJhbSAqLwotCQltb2ROYW1lU2l6ZSA9IChpbnQpcGF0aExlbjsKLQkJcmVnU3RhdCA9IFJlZ1F1ZXJ5VmFsdWUoa2V5QmFzZSwgbW9kdWxlS2V5LCAKLQkJICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEJ1ZiwgJm1vZE5hbWVTaXplKTsKKyAgICBhc3NlcnQocGF0aExlbiA8IElOVF9NQVgpOworICAgIG1vZE5hbWVTaXplID0gKGludClwYXRoTGVuOworICAgIHJlZ1N0YXQgPSBSZWdRdWVyeVZhbHVlKGtleUJhc2UsIG1vZHVsZUtleSwgcGF0aEJ1ZiwgJm1vZE5hbWVTaXplKTsKKyAgICBpZiAocmVnU3RhdCAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIC8qIE5vIHVzZXIgc2V0dGluZyAtIGxvb2t1cCBpbiBtYWNoaW5lIHNldHRpbmdzICovCisgICAgICAgIGtleUJhc2UgPSBIS0VZX0xPQ0FMX01BQ0hJTkU7CisgICAgICAgIC8qIGJlIGFuYWwgLSBmYWlsdXJlIG1heSBoYXZlIHJlc2V0IHNpemUgcGFyYW0gKi8KKyAgICAgICAgbW9kTmFtZVNpemUgPSAoaW50KXBhdGhMZW47CisgICAgICAgIHJlZ1N0YXQgPSBSZWdRdWVyeVZhbHVlKGtleUJhc2UsIG1vZHVsZUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEJ1ZiwgJm1vZE5hbWVTaXplKTsKIAotCQlpZiAocmVnU3RhdCAhPSBFUlJPUl9TVUNDRVNTKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIHVzZSB0aGUgZmlsZSBleHRlbnNpb24gdG8gbG9jYXRlIHRoZSB0eXBlIGVudHJ5LiAqLwotCWZvciAoZmRwID0gX1B5SW1wb3J0X0ZpbGV0YWI7IGZkcC0+c3VmZml4ICE9IE5VTEw7IGZkcCsrKSB7Ci0JCXNpemVfdCBleHRMZW4gPSBzdHJsZW4oZmRwLT5zdWZmaXgpOwotCQlhc3NlcnQobW9kTmFtZVNpemUgPj0gMCk7IC8qIGVsc2UgY2FzdCB0byBzaXplX3QgaXMgd3JvbmcgKi8KLQkJaWYgKChzaXplX3QpbW9kTmFtZVNpemUgPiBleHRMZW4gJiYKLQkJICAgIHN0cm5pY21wKHBhdGhCdWYgKyAoKHNpemVfdCltb2ROYW1lU2l6ZS1leHRMZW4tMSksCi0JCSAgICAgICAgICAgICBmZHAtPnN1ZmZpeCwKLQkJICAgICAgICAgICAgIGV4dExlbikgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoZmRwLT5zdWZmaXggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZnAgPSBmb3BlbihwYXRoQnVmLCBmZHAtPm1vZGUpOwotCWlmIChmcCAhPSBOVUxMKQotCQkqcHBGaWxlRGVzYyA9IGZkcDsKLQlyZXR1cm4gZnA7CisgICAgICAgIGlmIChyZWdTdGF0ICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogdXNlIHRoZSBmaWxlIGV4dGVuc2lvbiB0byBsb2NhdGUgdGhlIHR5cGUgZW50cnkuICovCisgICAgZm9yIChmZHAgPSBfUHlJbXBvcnRfRmlsZXRhYjsgZmRwLT5zdWZmaXggIT0gTlVMTDsgZmRwKyspIHsKKyAgICAgICAgc2l6ZV90IGV4dExlbiA9IHN0cmxlbihmZHAtPnN1ZmZpeCk7CisgICAgICAgIGFzc2VydChtb2ROYW1lU2l6ZSA+PSAwKTsgLyogZWxzZSBjYXN0IHRvIHNpemVfdCBpcyB3cm9uZyAqLworICAgICAgICBpZiAoKHNpemVfdCltb2ROYW1lU2l6ZSA+IGV4dExlbiAmJgorICAgICAgICAgICAgc3RybmljbXAocGF0aEJ1ZiArICgoc2l6ZV90KW1vZE5hbWVTaXplLWV4dExlbi0xKSwKKyAgICAgICAgICAgICAgICAgICAgIGZkcC0+c3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgZXh0TGVuKSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChmZHAtPnN1ZmZpeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcCA9IGZvcGVuKHBhdGhCdWYsIGZkcC0+bW9kZSk7CisgICAgaWYgKGZwICE9IE5VTEwpCisgICAgICAgICpwcEZpbGVEZXNjID0gZmRwOworICAgIHJldHVybiBmcDsKIH0KZGlmZiAtLWdpdCBhL1BDL21ha2VfdmVyc2lvbmluZm8uYyBiL1BDL21ha2VfdmVyc2lvbmluZm8uYwppbmRleCBiOWY5Yjg4Li5lOTY5NjcxIDEwMDY0NAotLS0gYS9QQy9tYWtlX3ZlcnNpb25pbmZvLmMKKysrIGIvUEMvbWFrZV92ZXJzaW9uaW5mby5jCkBAIC0yMiwxNyArMjIsMTcgQEAKICAqLwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCXByaW50ZigiLyogVGhpcyBmaWxlIGNyZWF0ZWQgYnkgbWFrZV92ZXJzaW9uaW5mby5leGUgKi9cbiIpOwotCXByaW50ZigiI2RlZmluZSBGSUVMRDMgJWRcbiIsCi0JCVBZX01JQ1JPX1ZFUlNJT04qMTAwMCArIFBZX1JFTEVBU0VfTEVWRUwqMTAgKyBQWV9SRUxFQVNFX1NFUklBTCk7Ci0JcHJpbnRmKCIjZGVmaW5lIE1TX0RMTF9JRCBcIiVkLiVkXCJcbiIsCi0JICAgICAgIFBZX01BSk9SX1ZFUlNJT04sIFBZX01JTk9SX1ZFUlNJT04pOwotCXByaW50ZigiI2lmbmRlZiBfREVCVUdcbiIpOwotCXByaW50ZigiI2RlZmluZSBQWVRIT05fRExMX05BTUUgXCJweXRob24lZCVkLmRsbFwiXG4iLAotCSAgICAgICBQWV9NQUpPUl9WRVJTSU9OLCBQWV9NSU5PUl9WRVJTSU9OKTsKLQlwcmludGYoIiNlbHNlXG4iKTsKLQlwcmludGYoIiNkZWZpbmUgUFlUSE9OX0RMTF9OQU1FIFwicHl0aG9uJWQlZF9kLmRsbFwiXG4iLAotCSAgICAgICBQWV9NQUpPUl9WRVJTSU9OLCBQWV9NSU5PUl9WRVJTSU9OKTsKLQlwcmludGYoIiNlbmRpZlxuIik7Ci0JcmV0dXJuIDA7CisgICAgcHJpbnRmKCIvKiBUaGlzIGZpbGUgY3JlYXRlZCBieSBtYWtlX3ZlcnNpb25pbmZvLmV4ZSAqL1xuIik7CisgICAgcHJpbnRmKCIjZGVmaW5lIEZJRUxEMyAlZFxuIiwKKyAgICAgICAgUFlfTUlDUk9fVkVSU0lPTioxMDAwICsgUFlfUkVMRUFTRV9MRVZFTCoxMCArIFBZX1JFTEVBU0VfU0VSSUFMKTsKKyAgICBwcmludGYoIiNkZWZpbmUgTVNfRExMX0lEIFwiJWQuJWRcIlxuIiwKKyAgICAgICAgICAgUFlfTUFKT1JfVkVSU0lPTiwgUFlfTUlOT1JfVkVSU0lPTik7CisgICAgcHJpbnRmKCIjaWZuZGVmIF9ERUJVR1xuIik7CisgICAgcHJpbnRmKCIjZGVmaW5lIFBZVEhPTl9ETExfTkFNRSBcInB5dGhvbiVkJWQuZGxsXCJcbiIsCisgICAgICAgICAgIFBZX01BSk9SX1ZFUlNJT04sIFBZX01JTk9SX1ZFUlNJT04pOworICAgIHByaW50ZigiI2Vsc2VcbiIpOworICAgIHByaW50ZigiI2RlZmluZSBQWVRIT05fRExMX05BTUUgXCJweXRob24lZCVkX2QuZGxsXCJcbiIsCisgICAgICAgICAgIFBZX01BSk9SX1ZFUlNJT04sIFBZX01JTk9SX1ZFUlNJT04pOworICAgIHByaW50ZigiI2VuZGlmXG4iKTsKKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL1BDL21zdmNydG1vZHVsZS5jIGIvUEMvbXN2Y3J0bW9kdWxlLmMKaW5kZXggOTc2NGEwMi4uNjhiN2QyNCAxMDA3NTUKLS0tIGEvUEMvbXN2Y3J0bW9kdWxlLmMKKysrIGIvUEMvbXN2Y3J0bW9kdWxlLmMKQEAgLTEsMTggKzEsMTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotCW1zdmNydG1vZHVsZS5jCisgICAgbXN2Y3J0bW9kdWxlLmMKIAotCUEgUHl0aG9uIGludGVyZmFjZSB0byB0aGUgTWljcm9zb2Z0IFZpc3VhbCBDIFJ1bnRpbWUKLQlMaWJyYXJ5LCBwcm92aWRpbmcgYWNjZXNzIHRvIHRob3NlIG5vbi1wb3J0YWJsZSwgYnV0Ci0Jc3RpbGwgdXNlZnVsIHJvdXRpbmVzLgorICAgIEEgUHl0aG9uIGludGVyZmFjZSB0byB0aGUgTWljcm9zb2Z0IFZpc3VhbCBDIFJ1bnRpbWUKKyAgICBMaWJyYXJ5LCBwcm92aWRpbmcgYWNjZXNzIHRvIHRob3NlIG5vbi1wb3J0YWJsZSwgYnV0CisgICAgc3RpbGwgdXNlZnVsIHJvdXRpbmVzLgogCi0JT25seSBldmVyIGNvbXBpbGVkIHdpdGggYW4gTVMgY29tcGlsZXIsIHNvIG5vIGF0dGVtcHQKLQloYXMgYmVlbiBtYWRlIHRvIGF2b2lkIE1TIGxhbmd1YWdlIGV4dGVuc2lvbnMsIGV0Yy4uLgorICAgIE9ubHkgZXZlciBjb21waWxlZCB3aXRoIGFuIE1TIGNvbXBpbGVyLCBzbyBubyBhdHRlbXB0CisgICAgaGFzIGJlZW4gbWFkZSB0byBhdm9pZCBNUyBsYW5ndWFnZSBleHRlbnNpb25zLCBldGMuLi4KIAotCVRoaXMgbWF5IG9ubHkgd29yayBvbiBOVCBvciA5NS4uLgorICAgIFRoaXMgbWF5IG9ubHkgd29yayBvbiBOVCBvciA5NS4uLgogCi0JQXV0aG9yOiBNYXJrIEhhbW1vbmQgYW5kIEd1aWRvIHZhbiBSb3NzdW0uCi0JTWFpbnRlbmFuY2U6IEd1aWRvIHZhbiBSb3NzdW0uCisgICAgQXV0aG9yOiBNYXJrIEhhbW1vbmQgYW5kIEd1aWRvIHZhbiBSb3NzdW0uCisgICAgTWFpbnRlbmFuY2U6IEd1aWRvIHZhbiBSb3NzdW0uCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0zMywxNCArMzMsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfaGVhcG1pbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6aGVhcG1pbiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpoZWFwbWluIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKF9oZWFwbWluKCkgIT0gMCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICBpZiAoX2hlYXBtaW4oKSAhPSAwKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBtaW5fZG9jLApAQCAtNTMsMjIgKzUzLDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X2xvY2tpbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZDsKLQlpbnQgbW9kZTsKLQlsb25nIG5ieXRlczsKLQlpbnQgZXJyOworICAgIGludCBmZDsKKyAgICBpbnQgbW9kZTsKKyAgICBsb25nIG5ieXRlczsKKyAgICBpbnQgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWw6bG9ja2luZyIsICZmZCwgJm1vZGUsICZuYnl0ZXMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpbDpsb2NraW5nIiwgJmZkLCAmbW9kZSwgJm5ieXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWVyciA9IF9sb2NraW5nKGZkLCBtb2RlLCBuYnl0ZXMpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKGVyciAhPSAwKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBlcnIgPSBfbG9ja2luZyhmZCwgbW9kZSwgbmJ5dGVzKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihsb2NraW5nX2RvYywKQEAgLTg2LDE2ICs4NiwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9zZXRtb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQ7Ci0JaW50IGZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJpaTpzZXRtb2RlIiwgJmZkLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpbnQgZmQ7CisgICAgaW50IGZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJpaTpzZXRtb2RlIiwgJmZkLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZsYWdzID0gX3NldG1vZGUoZmQsIGZsYWdzKTsKLQlpZiAoZmxhZ3MgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgZmxhZ3MgPSBfc2V0bW9kZShmZCwgZmxhZ3MpOworICAgIGlmIChmbGFncyA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhmbGFncyk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZsYWdzKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldG1vZGVfZG9jLApAQCAtMTA5LDE4ICsxMDksMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfb3Blbl9vc2ZoYW5kbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgaGFuZGxlOwotCWludCBmbGFnczsKLQlpbnQgZmQ7CisgICAgbG9uZyBoYW5kbGU7CisgICAgaW50IGZsYWdzOworICAgIGludCBmZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGk6b3Blbl9vc2ZoYW5kbGUiLCAmaGFuZGxlLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpOm9wZW5fb3NmaGFuZGxlIiwgJmhhbmRsZSwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmZCA9IF9vcGVuX29zZmhhbmRsZShoYW5kbGUsIGZsYWdzKTsKLQlpZiAoZmQgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgZmQgPSBfb3Blbl9vc2ZoYW5kbGUoaGFuZGxlLCBmbGFncyk7CisgICAgaWYgKGZkID09IC0xKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZkKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZmQpOwogfQogCiBQeURvY19TVFJWQVIob3Blbl9vc2ZoYW5kbGVfZG9jLApAQCAtMTM1LDIwICsxMzUsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfZ2V0X29zZmhhbmRsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkOwotCVB5X2ludHB0cl90IGhhbmRsZTsKKyAgICBpbnQgZmQ7CisgICAgUHlfaW50cHRyX3QgaGFuZGxlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsImk6Z2V0X29zZmhhbmRsZSIsICZmZCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJpOmdldF9vc2ZoYW5kbGUiLCAmZmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWhhbmRsZSA9IF9nZXRfb3NmaGFuZGxlKGZkKTsKLQlpZiAoaGFuZGxlID09IC0xKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIGhhbmRsZSA9IF9nZXRfb3NmaGFuZGxlKGZkKTsKKyAgICBpZiAoaGFuZGxlID09IC0xKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwogCi0JLyogdGVjaG5pY2FsbHkgJ2hhbmRsZScgaXMgbm90IGEgcG9pbnRlciwgYnV0IGEgaW50ZWdlciBhcwotCSAgIGxhcmdlIGFzIGEgcG9pbnRlciwgUHl0aG9uJ3MgKlZvaWRQdHIgaW50ZXJmYWNlIGlzIHRoZQotCSAgIG1vc3QgYXBwcm9wcmlhdGUgaGVyZSAqLwotCXJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQqKWhhbmRsZSk7CisgICAgLyogdGVjaG5pY2FsbHkgJ2hhbmRsZScgaXMgbm90IGEgcG9pbnRlciwgYnV0IGEgaW50ZWdlciBhcworICAgICAgIGxhcmdlIGFzIGEgcG9pbnRlciwgUHl0aG9uJ3MgKlZvaWRQdHIgaW50ZXJmYWNlIGlzIHRoZQorICAgICAgIG1vc3QgYXBwcm9wcmlhdGUgaGVyZSAqLworICAgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQqKWhhbmRsZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRfb3NmaGFuZGxlX2RvYywKQEAgLTE2MiwxMyArMTYyLDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X2tiaGl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgb2s7CisgICAgaW50IG9rOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6a2JoaXQiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6a2JoaXQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlvayA9IF9rYmhpdCgpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhvayk7CisgICAgb2sgPSBfa2JoaXQoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcob2spOwogfQogCiBQeURvY19TVFJWQVIoa2JoaXRfZG9jLApAQCAtMTc5LDE3ICsxNzksMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfZ2V0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBjaDsKLQljaGFyIHNbMV07CisgICAgaW50IGNoOworICAgIGNoYXIgc1sxXTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldGNoIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldGNoIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWNoID0gX2dldGNoKCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlzWzBdID0gY2g7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIDEpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBjaCA9IF9nZXRjaCgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgc1swXSA9IGNoOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAxKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldGNoX2RvYywKQEAgLTIwNiwxNyArMjA2LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X2dldHdjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfVU5JQ09ERSBjaDsKLQlQeV9VTklDT0RFIHVbMV07CisgICAgUHlfVU5JQ09ERSBjaDsKKyAgICBQeV9VTklDT0RFIHVbMV07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXR3Y2giKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0d2NoIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWNoID0gX2dldHdjaCgpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JdVswXSA9IGNoOwotCXJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUodSwgMSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGNoID0gX2dldHdjaCgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgdVswXSA9IGNoOworICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUodSwgMSk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXR3Y2hfZG9jLApAQCAtMjI4LDE3ICsyMjgsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfZ2V0Y2hlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgY2g7Ci0JY2hhciBzWzFdOworICAgIGludCBjaDsKKyAgICBjaGFyIHNbMV07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRjaGUiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0Y2hlIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWNoID0gX2dldGNoZSgpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0Jc1swXSA9IGNoOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAxKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgY2ggPSBfZ2V0Y2hlKCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBzWzBdID0gY2g7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIDEpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0Y2hlX2RvYywKQEAgLTI1MSwxNyArMjUxLDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X2dldHdjaGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X1VOSUNPREUgY2g7Ci0JUHlfVU5JQ09ERSBzWzFdOworICAgIFB5X1VOSUNPREUgY2g7CisgICAgUHlfVU5JQ09ERSBzWzFdOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0d2NoZSIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXR3Y2hlIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWNoID0gX2dldHdjaGUoKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXNbMF0gPSBjaDsKLQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHMsIDEpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBjaCA9IF9nZXR3Y2hlKCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBzWzBdID0gY2g7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShzLCAxKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHdjaGVfZG9jLApAQCAtMjczLDE0ICsyNzMsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfcHV0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgY2g7CisgICAgY2hhciBjaDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiYzpwdXRjaCIsICZjaCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiYzpwdXRjaCIsICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JX3B1dGNoKGNoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgX3B1dGNoKGNoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihwdXRjaF9kb2MsCkBAIC0yOTIsMTkgKzI5MiwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9wdXR3Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X1VOSUNPREUgKmNoOwotCWludCBzaXplOworICAgIFB5X1VOSUNPREUgKmNoOworICAgIGludCBzaXplOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1IzpwdXR3Y2giLCAmY2gsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1IzpwdXR3Y2giLCAmY2gsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJIkV4cGVjdGVkIHVuaWNvZGUgc3RyaW5nIG9mIGxlbmd0aCAxIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlfcHV0d2NoKCpjaCk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJFeHBlY3RlZCB1bmljb2RlIHN0cmluZyBvZiBsZW5ndGggMSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgX3B1dHdjaCgqY2gpOworICAgIFB5X1JFVFVSTl9OT05FOwogCiB9CiAKQEAgLTMxNywxNSArMzE3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X3VuZ2V0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgY2g7CisgICAgY2hhciBjaDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiYzp1bmdldGNoIiwgJmNoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJjOnVuZ2V0Y2giLCAmY2gpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChfdW5nZXRjaChjaCkgPT0gRU9GKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoX3VuZ2V0Y2goY2gpID09IEVPRikKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUih1bmdldGNoX2RvYywKQEAgLTMzOCwxNSArMzM4LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X3VuZ2V0d2NoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9VTklDT0RFIGNoOworICAgIFB5X1VOSUNPREUgY2g7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInU6dW5nZXR3Y2giLCAmY2gpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInU6dW5nZXR3Y2giLCAmY2gpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChfdW5nZXRjaChjaCkgPT0gRU9GKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoX3VuZ2V0Y2goY2gpID09IEVPRikKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUih1bmdldHdjaF9kb2MsCkBAIC0zNTgsNzAgKzM1OCw3MCBAQAogc3RhdGljIHZvaWQKIGluc2VydGludChQeU9iamVjdCAqZCwgY2hhciAqbmFtZSwgaW50IHZhbHVlKQogewotCVB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCS8qIERvbid0IGJvdGhlciByZXBvcnRpbmcgdGhpcyBlcnJvciAqLwotCQlQeUVycl9DbGVhcigpOwotCX0KLQllbHNlIHsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgLyogRG9uJ3QgYm90aGVyIHJlcG9ydGluZyB0aGlzIGVycm9yICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIH0KIAogCiAvKiBMaXN0IG9mIGZ1bmN0aW9ucyBleHBvcnRlZCBieSB0aGlzIG1vZHVsZSAqLwogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtc3ZjcnRfZnVuY3Rpb25zW10gPSB7Ci0JeyJoZWFwbWluIiwJCW1zdmNydF9oZWFwbWluLCBNRVRIX1ZBUkFSR1MsIGhlYXBtaW5fZG9jfSwKLQl7ImxvY2tpbmciLCAgICAgICAgICAgICBtc3ZjcnRfbG9ja2luZywgTUVUSF9WQVJBUkdTLCBsb2NraW5nX2RvY30sCi0JeyJzZXRtb2RlIiwJCW1zdmNydF9zZXRtb2RlLCBNRVRIX1ZBUkFSR1MsIHNldG1vZGVfZG9jfSwKLQl7Im9wZW5fb3NmaGFuZGxlIiwJbXN2Y3J0X29wZW5fb3NmaGFuZGxlLCBNRVRIX1ZBUkFSR1MsIG9wZW5fb3NmaGFuZGxlX2RvY30sCi0JeyJnZXRfb3NmaGFuZGxlIiwJbXN2Y3J0X2dldF9vc2ZoYW5kbGUsIE1FVEhfVkFSQVJHUywgZ2V0X29zZmhhbmRsZV9kb2N9LAotCXsia2JoaXQiLAkJbXN2Y3J0X2tiaGl0LCBNRVRIX1ZBUkFSR1MsIGtiaGl0X2RvY30sCi0JeyJnZXRjaCIsCQltc3ZjcnRfZ2V0Y2gsIE1FVEhfVkFSQVJHUywgZ2V0Y2hfZG9jfSwKLQl7ImdldGNoZSIsCQltc3ZjcnRfZ2V0Y2hlLCBNRVRIX1ZBUkFSR1MsIGdldGNoZV9kb2N9LAotCXsicHV0Y2giLAkJbXN2Y3J0X3B1dGNoLCBNRVRIX1ZBUkFSR1MsIHB1dGNoX2RvY30sCi0JeyJ1bmdldGNoIiwJCW1zdmNydF91bmdldGNoLCBNRVRIX1ZBUkFSR1MsIHVuZ2V0Y2hfZG9jfSwKKyAgICB7ImhlYXBtaW4iLCAgICAgICAgICAgICAgICAgbXN2Y3J0X2hlYXBtaW4sIE1FVEhfVkFSQVJHUywgaGVhcG1pbl9kb2N9LAorICAgIHsibG9ja2luZyIsICAgICAgICAgICAgIG1zdmNydF9sb2NraW5nLCBNRVRIX1ZBUkFSR1MsIGxvY2tpbmdfZG9jfSwKKyAgICB7InNldG1vZGUiLCAgICAgICAgICAgICAgICAgbXN2Y3J0X3NldG1vZGUsIE1FVEhfVkFSQVJHUywgc2V0bW9kZV9kb2N9LAorICAgIHsib3Blbl9vc2ZoYW5kbGUiLCAgICAgICAgICBtc3ZjcnRfb3Blbl9vc2ZoYW5kbGUsIE1FVEhfVkFSQVJHUywgb3Blbl9vc2ZoYW5kbGVfZG9jfSwKKyAgICB7ImdldF9vc2ZoYW5kbGUiLCAgICAgICAgICAgbXN2Y3J0X2dldF9vc2ZoYW5kbGUsIE1FVEhfVkFSQVJHUywgZ2V0X29zZmhhbmRsZV9kb2N9LAorICAgIHsia2JoaXQiLCAgICAgICAgICAgICAgICAgICBtc3ZjcnRfa2JoaXQsIE1FVEhfVkFSQVJHUywga2JoaXRfZG9jfSwKKyAgICB7ImdldGNoIiwgICAgICAgICAgICAgICAgICAgbXN2Y3J0X2dldGNoLCBNRVRIX1ZBUkFSR1MsIGdldGNoX2RvY30sCisgICAgeyJnZXRjaGUiLCAgICAgICAgICAgICAgICAgIG1zdmNydF9nZXRjaGUsIE1FVEhfVkFSQVJHUywgZ2V0Y2hlX2RvY30sCisgICAgeyJwdXRjaCIsICAgICAgICAgICAgICAgICAgIG1zdmNydF9wdXRjaCwgTUVUSF9WQVJBUkdTLCBwdXRjaF9kb2N9LAorICAgIHsidW5nZXRjaCIsICAgICAgICAgICAgICAgICBtc3ZjcnRfdW5nZXRjaCwgTUVUSF9WQVJBUkdTLCB1bmdldGNoX2RvY30sCiAjaWZkZWYgX1dDT05JT19ERUZJTkVECi0JeyJnZXR3Y2giLAkJbXN2Y3J0X2dldHdjaCwgTUVUSF9WQVJBUkdTLCBnZXR3Y2hfZG9jfSwKLQl7ImdldHdjaGUiLAkJbXN2Y3J0X2dldHdjaGUsIE1FVEhfVkFSQVJHUywgZ2V0d2NoZV9kb2N9LAotCXsicHV0d2NoIiwJCW1zdmNydF9wdXR3Y2gsIE1FVEhfVkFSQVJHUywgcHV0d2NoX2RvY30sCi0JeyJ1bmdldHdjaCIsCQltc3ZjcnRfdW5nZXR3Y2gsIE1FVEhfVkFSQVJHUywgdW5nZXR3Y2hfZG9jfSwKKyAgICB7ImdldHdjaCIsICAgICAgICAgICAgICAgICAgbXN2Y3J0X2dldHdjaCwgTUVUSF9WQVJBUkdTLCBnZXR3Y2hfZG9jfSwKKyAgICB7ImdldHdjaGUiLCAgICAgICAgICAgICAgICAgbXN2Y3J0X2dldHdjaGUsIE1FVEhfVkFSQVJHUywgZ2V0d2NoZV9kb2N9LAorICAgIHsicHV0d2NoIiwgICAgICAgICAgICAgICAgICBtc3ZjcnRfcHV0d2NoLCBNRVRIX1ZBUkFSR1MsIHB1dHdjaF9kb2N9LAorICAgIHsidW5nZXR3Y2giLCAgICAgICAgICAgICAgICBtc3ZjcnRfdW5nZXR3Y2gsIE1FVEhfVkFSQVJHUywgdW5nZXR3Y2hfZG9jfSwKICNlbmRpZgotCXtOVUxMLAkJCU5VTEx9CisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9CiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdG1zdmNydCh2b2lkKQogewotCWludCBzdDsKLQlQeU9iamVjdCAqZDsKLQlQeU9iamVjdCAqbSA9IFB5X0luaXRNb2R1bGUoIm1zdmNydCIsIG1zdmNydF9mdW5jdGlvbnMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpbnQgc3Q7CisgICAgUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm0gPSBQeV9Jbml0TW9kdWxlKCJtc3ZjcnQiLCBtc3ZjcnRfZnVuY3Rpb25zKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CiAKLQkvKiBjb25zdGFudHMgZm9yIHRoZSBsb2NraW5nKCkgZnVuY3Rpb24ncyBtb2RlIGFyZ3VtZW50ICovCi0JaW5zZXJ0aW50KGQsICJMS19MT0NLIiwgX0xLX0xPQ0spOwotCWluc2VydGludChkLCAiTEtfTkJMQ0siLCBfTEtfTkJMQ0spOwotCWluc2VydGludChkLCAiTEtfTkJSTENLIiwgX0xLX05CUkxDSyk7Ci0JaW5zZXJ0aW50KGQsICJMS19STENLIiwgX0xLX1JMQ0spOwotCWluc2VydGludChkLCAiTEtfVU5MQ0siLCBfTEtfVU5MQ0spOworICAgIC8qIGNvbnN0YW50cyBmb3IgdGhlIGxvY2tpbmcoKSBmdW5jdGlvbidzIG1vZGUgYXJndW1lbnQgKi8KKyAgICBpbnNlcnRpbnQoZCwgIkxLX0xPQ0siLCBfTEtfTE9DSyk7CisgICAgaW5zZXJ0aW50KGQsICJMS19OQkxDSyIsIF9MS19OQkxDSyk7CisgICAgaW5zZXJ0aW50KGQsICJMS19OQlJMQ0siLCBfTEtfTkJSTENLKTsKKyAgICBpbnNlcnRpbnQoZCwgIkxLX1JMQ0siLCBfTEtfUkxDSyk7CisgICAgaW5zZXJ0aW50KGQsICJMS19VTkxDSyIsIF9MS19VTkxDSyk7CiAKLQkvKiBjb25zdGFudHMgZm9yIHRoZSBjcnQgdmVyc2lvbnMgKi8KKyAgICAvKiBjb25zdGFudHMgZm9yIHRoZSBjcnQgdmVyc2lvbnMgKi8KICNpZmRlZiBfVkNfQVNTRU1CTFlfUFVCTElDS0VZVE9LRU4KLQlzdCA9IFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJWQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTiIsCi0JCQkJCV9WQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTik7Ci0JaWYgKHN0IDwgMClyZXR1cm47CisgICAgc3QgPSBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiVkNfQVNTRU1CTFlfUFVCTElDS0VZVE9LRU4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZDX0FTU0VNQkxZX1BVQkxJQ0tFWVRPS0VOKTsKKyAgICBpZiAoc3QgPCAwKXJldHVybjsKICNlbmRpZgogI2lmZGVmIF9DUlRfQVNTRU1CTFlfVkVSU0lPTgotCXN0ID0gUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIkNSVF9BU1NFTUJMWV9WRVJTSU9OIiwKLQkJCQkJX0NSVF9BU1NFTUJMWV9WRVJTSU9OKTsKLQlpZiAoc3QgPCAwKXJldHVybjsKKyAgICBzdCA9IFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJDUlRfQVNTRU1CTFlfVkVSU0lPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ1JUX0FTU0VNQkxZX1ZFUlNJT04pOworICAgIGlmIChzdCA8IDApcmV0dXJuOwogI2VuZGlmCiAjaWZkZWYgX19MSUJSQVJJRVNfQVNTRU1CTFlfTkFNRV9QUkVGSVgKLQlzdCA9IFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJMSUJSQVJJRVNfQVNTRU1CTFlfTkFNRV9QUkVGSVgiLAotCQkJCQlfX0xJQlJBUklFU19BU1NFTUJMWV9OQU1FX1BSRUZJWCk7Ci0JaWYgKHN0IDwgMClyZXR1cm47CisgICAgc3QgPSBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiTElCUkFSSUVTX0FTU0VNQkxZX05BTUVfUFJFRklYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElCUkFSSUVTX0FTU0VNQkxZX05BTUVfUFJFRklYKTsKKyAgICBpZiAoc3QgPCAwKXJldHVybjsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L2NvbmZpZy5jIGIvUEMvb3MyZW14L2NvbmZpZy5jCmluZGV4IDQwODM4MWMuLmNiYWIyNWMgMTAwNjQ0Ci0tLSBhL1BDL29zMmVteC9jb25maWcuYworKysgYi9QQy9vczJlbXgvY29uZmlnLmMKQEAgLTEwMiw4MSArMTAyLDgxIEBACiAKIHN0cnVjdCBfaW5pdHRhYiBfUHlJbXBvcnRfSW5pdHRhYltdID0gewogCi0JeyJvczIiLCBpbml0b3MyfSwKLQl7InNpZ25hbCIsIGluaXRzaWduYWx9LAorICAgIHsib3MyIiwgaW5pdG9zMn0sCisgICAgeyJzaWduYWwiLCBpbml0c2lnbmFsfSwKICNpZmRlZiBXSVRIX1RIUkVBRAotCXsidGhyZWFkIiwgaW5pdHRocmVhZH0sCisgICAgeyJ0aHJlYWQiLCBpbml0dGhyZWFkfSwKICNlbmRpZgotCXsiX2NvZGVjcyIsIGluaXRfY29kZWNzfSwKLQl7Il9jc3YiLCBpbml0X2Nzdn0sCi0JeyJfbG9jYWxlIiwgaW5pdF9sb2NhbGV9LAotCXsiX3JhbmRvbSIsIGluaXRfcmFuZG9tfSwKLQl7Il9zcmUiLCBpbml0X3NyZX0sCi0JeyJfc3ltdGFibGUiLCBpbml0X3N5bXRhYmxlfSwKLQl7Il93ZWFrcmVmIiwgaW5pdF93ZWFrcmVmfSwKLQl7ImFycmF5IiwgaW5pdGFycmF5fSwKLQl7ImJpbmFzY2lpIiwgaW5pdGJpbmFzY2lpfSwKLQl7ImNQaWNrbGUiLCBpbml0Y1BpY2tsZX0sCi0JeyJjU3RyaW5nSU8iLCBpbml0Y1N0cmluZ0lPfSwKLQl7Il9jb2xsZWN0aW9ucyIsIGluaXRfY29sbGVjdGlvbnN9LAotCXsiY21hdGgiLCBpbml0Y21hdGh9LAotCXsiZGF0ZXRpbWUiLCBpbml0ZGF0ZXRpbWV9LAotCXsiZGwiLCBpbml0ZGx9LAotCXsiZXJybm8iLCBpbml0ZXJybm99LAotCXsiZmNudGwiLCBpbml0ZmNudGx9LAotCXsiX2ZpbGVpbyIsIGluaXRfZmlsZWlvfSwKLQl7Il9mdW5jdG9vbHMiLCBpbml0X2Z1bmN0b29sc30sCi0JeyJfaGVhcHEiLCBpbml0X2hlYXBxfSwKLQl7ImltYWdlb3AiLCBpbml0aW1hZ2VvcH0sCi0JeyJpdGVydG9vbHMiLCBpbml0aXRlcnRvb2xzfSwKLQl7Im1hdGgiLCBpbml0bWF0aH0sCi0JeyJfbWQ1IiwgaW5pdF9tZDV9LAotCXsib3BlcmF0b3IiLCBpbml0b3BlcmF0b3J9LAotCXsiX3NoYSIsIGluaXRfc2hhfSwKLQl7Il9zaGEyNTYiLCBpbml0X3NoYTI1Nn0sCi0JeyJfc2hhNTEyIiwgaW5pdF9zaGE1MTJ9LAotCXsic3Ryb3AiLCBpbml0c3Ryb3B9LAotCXsiX3N0cnVjdCIsIGluaXRfc3RydWN0fSwKLQl7InRlcm1pb3MiLCBpbml0dGVybWlvc30sCi0JeyJ0aW1lIiwgaW5pdHRpbWV9LAotCXsidGltaW5nIiwgaW5pdHRpbWluZ30sCi0JeyJ4eHN1YnR5cGUiLCBpbml0eHhzdWJ0eXBlfSwKLQl7InppcGltcG9ydCIsIGluaXR6aXBpbXBvcnR9LAorICAgIHsiX2NvZGVjcyIsIGluaXRfY29kZWNzfSwKKyAgICB7Il9jc3YiLCBpbml0X2Nzdn0sCisgICAgeyJfbG9jYWxlIiwgaW5pdF9sb2NhbGV9LAorICAgIHsiX3JhbmRvbSIsIGluaXRfcmFuZG9tfSwKKyAgICB7Il9zcmUiLCBpbml0X3NyZX0sCisgICAgeyJfc3ltdGFibGUiLCBpbml0X3N5bXRhYmxlfSwKKyAgICB7Il93ZWFrcmVmIiwgaW5pdF93ZWFrcmVmfSwKKyAgICB7ImFycmF5IiwgaW5pdGFycmF5fSwKKyAgICB7ImJpbmFzY2lpIiwgaW5pdGJpbmFzY2lpfSwKKyAgICB7ImNQaWNrbGUiLCBpbml0Y1BpY2tsZX0sCisgICAgeyJjU3RyaW5nSU8iLCBpbml0Y1N0cmluZ0lPfSwKKyAgICB7Il9jb2xsZWN0aW9ucyIsIGluaXRfY29sbGVjdGlvbnN9LAorICAgIHsiY21hdGgiLCBpbml0Y21hdGh9LAorICAgIHsiZGF0ZXRpbWUiLCBpbml0ZGF0ZXRpbWV9LAorICAgIHsiZGwiLCBpbml0ZGx9LAorICAgIHsiZXJybm8iLCBpbml0ZXJybm99LAorICAgIHsiZmNudGwiLCBpbml0ZmNudGx9LAorICAgIHsiX2ZpbGVpbyIsIGluaXRfZmlsZWlvfSwKKyAgICB7Il9mdW5jdG9vbHMiLCBpbml0X2Z1bmN0b29sc30sCisgICAgeyJfaGVhcHEiLCBpbml0X2hlYXBxfSwKKyAgICB7ImltYWdlb3AiLCBpbml0aW1hZ2VvcH0sCisgICAgeyJpdGVydG9vbHMiLCBpbml0aXRlcnRvb2xzfSwKKyAgICB7Im1hdGgiLCBpbml0bWF0aH0sCisgICAgeyJfbWQ1IiwgaW5pdF9tZDV9LAorICAgIHsib3BlcmF0b3IiLCBpbml0b3BlcmF0b3J9LAorICAgIHsiX3NoYSIsIGluaXRfc2hhfSwKKyAgICB7Il9zaGEyNTYiLCBpbml0X3NoYTI1Nn0sCisgICAgeyJfc2hhNTEyIiwgaW5pdF9zaGE1MTJ9LAorICAgIHsic3Ryb3AiLCBpbml0c3Ryb3B9LAorICAgIHsiX3N0cnVjdCIsIGluaXRfc3RydWN0fSwKKyAgICB7InRlcm1pb3MiLCBpbml0dGVybWlvc30sCisgICAgeyJ0aW1lIiwgaW5pdHRpbWV9LAorICAgIHsidGltaW5nIiwgaW5pdHRpbWluZ30sCisgICAgeyJ4eHN1YnR5cGUiLCBpbml0eHhzdWJ0eXBlfSwKKyAgICB7InppcGltcG9ydCIsIGluaXR6aXBpbXBvcnR9LAogI2lmICFIQVZFX0RZTkFNSUNfTE9BRElORwotCXsiX2N1cnNlcyIsIGluaXRfY3Vyc2VzfSwKLQl7Il9jdXJzZXNfcGFuZWwiLCBpbml0X2N1cnNlc19wYW5lbH0sCi0JeyJfaG90c2hvdCIsIGluaXRfaG90c2hvdH0sCi0JeyJfdGVzdGNhcGkiLCBpbml0X3Rlc3RjYXBpfSwKLQl7ImJzZGRiMTg1IiwgaW5pdGJzZGRiMTg1fSwKLQl7ImJ6MiIsIGluaXRiejJ9LAotCXsiZnBlY3RsIiwgaW5pdGZwZWN0bH0sCi0JeyJmcGV0ZXN0IiwgaW5pdGZwZXRlc3R9LAotCXsicGFyc2VyIiwgaW5pdHBhcnNlcn0sCi0JeyJwd2QiLCBpbml0cHdkfSwKLQl7InVuaWNvZGVkYXRhIiwgaW5pdHVuaWNvZGVkYXRhfSwKLQl7InpsaWIiLCBpbml0emxpYn0sCisgICAgeyJfY3Vyc2VzIiwgaW5pdF9jdXJzZXN9LAorICAgIHsiX2N1cnNlc19wYW5lbCIsIGluaXRfY3Vyc2VzX3BhbmVsfSwKKyAgICB7Il9ob3RzaG90IiwgaW5pdF9ob3RzaG90fSwKKyAgICB7Il90ZXN0Y2FwaSIsIGluaXRfdGVzdGNhcGl9LAorICAgIHsiYnNkZGIxODUiLCBpbml0YnNkZGIxODV9LAorICAgIHsiYnoyIiwgaW5pdGJ6Mn0sCisgICAgeyJmcGVjdGwiLCBpbml0ZnBlY3RsfSwKKyAgICB7ImZwZXRlc3QiLCBpbml0ZnBldGVzdH0sCisgICAgeyJwYXJzZXIiLCBpbml0cGFyc2VyfSwKKyAgICB7InB3ZCIsIGluaXRwd2R9LAorICAgIHsidW5pY29kZWRhdGEiLCBpbml0dW5pY29kZWRhdGF9LAorICAgIHsiemxpYiIsIGluaXR6bGlifSwKICNpZmRlZiBVU0VfU09DS0VUCi0JeyJfc29ja2V0IiwgaW5pdF9zb2NrZXR9LAotCXsic2VsZWN0IiwgaW5pdHNlbGVjdH0sCisgICAgeyJfc29ja2V0IiwgaW5pdF9zb2NrZXR9LAorICAgIHsic2VsZWN0IiwgaW5pdHNlbGVjdH0sCiAjZW5kaWYKICNlbmRpZgogLyogLS0gQURETU9EVUxFIE1BUktFUiAyIC0tICovCiAKLQkvKiBUaGlzIG1vZHVsZSAibGl2ZXMgaW4iIHdpdGggbWFyc2hhbC5jICovCi0JeyJtYXJzaGFsIiwgUHlNYXJzaGFsX0luaXR9LAorICAgIC8qIFRoaXMgbW9kdWxlICJsaXZlcyBpbiIgd2l0aCBtYXJzaGFsLmMgKi8KKyAgICB7Im1hcnNoYWwiLCBQeU1hcnNoYWxfSW5pdH0sCiAKLQkvKiBUaGlzIGxpdmVzIGl0IHdpdGggaW1wb3J0LmMgKi8KLQl7ImltcCIsIGluaXRpbXB9LAorICAgIC8qIFRoaXMgbGl2ZXMgaXQgd2l0aCBpbXBvcnQuYyAqLworICAgIHsiaW1wIiwgaW5pdGltcH0sCiAKLQkvKiBUaGVzZSBlbnRyaWVzIGFyZSBoZXJlIGZvciBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMgKi8KLQl7Il9fbWFpbl9fIiwgTlVMTH0sCi0JeyJfX2J1aWx0aW5fXyIsIE5VTEx9LAotCXsic3lzIiwgTlVMTH0sCi0JeyJleGNlcHRpb25zIiwgTlVMTH0sCisgICAgLyogVGhlc2UgZW50cmllcyBhcmUgaGVyZSBmb3Igc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzICovCisgICAgeyJfX21haW5fXyIsIE5VTEx9LAorICAgIHsiX19idWlsdGluX18iLCBOVUxMfSwKKyAgICB7InN5cyIsIE5VTEx9LAorICAgIHsiZXhjZXB0aW9ucyIsIE5VTEx9LAogCi0JLyogVGhpcyBsaXZlcyBpbiBnY21vZHVsZS5jICovCi0JeyJnYyIsIGluaXRnY30sCisgICAgLyogVGhpcyBsaXZlcyBpbiBnY21vZHVsZS5jICovCisgICAgeyJnYyIsIGluaXRnY30sCiAKLQkvKiBTZW50aW5lbCAqLwotCXswLCAwfQorICAgIC8qIFNlbnRpbmVsICovCisgICAgezAsIDB9CiB9OwpkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L2RsZmNuLmMgYi9QQy9vczJlbXgvZGxmY24uYwppbmRleCA5ZTg4ZDVlLi40N2MwNDZjIDEwMDY0NAotLS0gYS9QQy9vczJlbXgvZGxmY24uYworKysgYi9QQy9vczJlbXgvZGxmY24uYwpAQCAtNDYsMTc4ICs0NiwxNzggQEAKICNpbmNsdWRlIDxtYWxsb2MuaD4KIAogdHlwZWRlZiBzdHJ1Y3QgX3RyYWNrX3JlYyB7Ci0JY2hhciAqbmFtZTsKLQlITU9EVUxFIGhhbmRsZTsKLQl2b2lkICppZDsKLQlzdHJ1Y3QgX3RyYWNrX3JlYyAqbmV4dDsKKyAgICBjaGFyICpuYW1lOworICAgIEhNT0RVTEUgaGFuZGxlOworICAgIHZvaWQgKmlkOworICAgIHN0cnVjdCBfdHJhY2tfcmVjICpuZXh0OwogfSB0RExMY2hhaW4sICpETExjaGFpbjsKIAotc3RhdGljIERMTGNoYWluIGRsbG9hZCA9IE5VTEw7CS8qIEEgc2ltcGxlIGNoYWluZWQgbGlzdCBvZiBETEwgbmFtZXMgKi8KLXN0YXRpYyBjaGFyIGRsZXJyIFsyNTZdOwkvKiBsYXN0IGVycm9yIHRleHQgc3RyaW5nICovCitzdGF0aWMgRExMY2hhaW4gZGxsb2FkID0gTlVMTDsgIC8qIEEgc2ltcGxlIGNoYWluZWQgbGlzdCBvZiBETEwgbmFtZXMgKi8KK3N0YXRpYyBjaGFyIGRsZXJyIFsyNTZdOyAgICAgICAgLyogbGFzdCBlcnJvciB0ZXh0IHN0cmluZyAqLwogc3RhdGljIHZvaWQgKmxhc3RfaWQ7CiAKIHN0YXRpYyBETExjaGFpbiBmaW5kX2lkKHZvaWQgKmlkKQogewotCURMTGNoYWluIHRtcDsKKyAgICBETExjaGFpbiB0bXA7CiAKLQlmb3IgKHRtcCA9IGRsbG9hZDsgdG1wOyB0bXAgPSB0bXAtPm5leHQpCi0JCWlmIChpZCA9PSB0bXAtPmlkKQotCQkJcmV0dXJuIHRtcDsKKyAgICBmb3IgKHRtcCA9IGRsbG9hZDsgdG1wOyB0bXAgPSB0bXAtPm5leHQpCisgICAgICAgIGlmIChpZCA9PSB0bXAtPmlkKQorICAgICAgICAgICAgcmV0dXJuIHRtcDsKIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBsb2FkIGEgZHluYW1pYy1saW5rIGxpYnJhcnkgYW5kIHJldHVybiBoYW5kbGUgKi8KIHZvaWQgKmRsb3BlbihjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzKQogewotCUhNT0RVTEUgaG07Ci0JRExMY2hhaW4gdG1wOwotCWNoYXIgZXJyWzI1Nl07Ci0JY2hhciAqZXJydHh0OwotCWludCByYyA9IDAsIHNldF9jaGFpbiA9IDA7CisgICAgSE1PRFVMRSBobTsKKyAgICBETExjaGFpbiB0bXA7CisgICAgY2hhciBlcnJbMjU2XTsKKyAgICBjaGFyICplcnJ0eHQ7CisgICAgaW50IHJjID0gMCwgc2V0X2NoYWluID0gMDsKIAotCWZvciAodG1wID0gZGxsb2FkOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkKLQkJaWYgKHN0cm5pY21wKHRtcC0+bmFtZSwgZmlsZW5hbWUsIDk5OSkgPT0gMCkKLQkJCWJyZWFrOworICAgIGZvciAodG1wID0gZGxsb2FkOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkKKyAgICAgICAgaWYgKHN0cm5pY21wKHRtcC0+bmFtZSwgZmlsZW5hbWUsIDk5OSkgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JaWYgKCF0bXApCi0JewotCQl0bXAgPSAoRExMY2hhaW4pIG1hbGxvYyhzaXplb2YodERMTGNoYWluKSk7Ci0JCWlmICghdG1wKQotCQkJZ290byBub21lbTsKLQkJdG1wLT5uYW1lID0gc3RyZHVwKGZpbGVuYW1lKTsKLQkJdG1wLT5uZXh0ID0gZGxsb2FkOwotCQlzZXRfY2hhaW4gPSAxOwotCX0KKyAgICBpZiAoIXRtcCkKKyAgICB7CisgICAgICAgIHRtcCA9IChETExjaGFpbikgbWFsbG9jKHNpemVvZih0RExMY2hhaW4pKTsKKyAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB0bXAtPm5hbWUgPSBzdHJkdXAoZmlsZW5hbWUpOworICAgICAgICB0bXAtPm5leHQgPSBkbGxvYWQ7CisgICAgICAgIHNldF9jaGFpbiA9IDE7CisgICAgfQogCi0Jc3dpdGNoIChyYyA9IERvc0xvYWRNb2R1bGUoKFBTWikmZXJyLCBzaXplb2YoZXJyKSwgZmlsZW5hbWUsICZobSkpCi0JewotCQljYXNlIE5PX0VSUk9SOgotCQkJdG1wLT5oYW5kbGUgPSBobTsKLQkJCWlmIChzZXRfY2hhaW4pCi0JCQl7Ci0JCQkJZG8KLQkJCQkJbGFzdF9pZCsrOwotCQkJCXdoaWxlICgobGFzdF9pZCA9PSAwKSB8fCAoZmluZF9pZChsYXN0X2lkKSkpOwotCQkJCXRtcC0+aWQgPSBsYXN0X2lkOwotCQkJCWRsbG9hZCA9IHRtcDsKLQkJCX0KLQkJCXJldHVybiB0bXAtPmlkOwotCQljYXNlIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOgotCQljYXNlIEVSUk9SX1BBVEhfTk9UX0ZPVU5EOgotCQkJZXJydHh0ID0gIm1vZHVsZSBgJXMnIG5vdCBmb3VuZCI7Ci0JCQlicmVhazsKLQkJY2FzZSBFUlJPUl9UT09fTUFOWV9PUEVOX0ZJTEVTOgotCQljYXNlIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZOgotCQljYXNlIEVSUk9SX1NIQVJJTkdfQlVGRkVSX0VYQ0VFREVEOgorICAgIHN3aXRjaCAocmMgPSBEb3NMb2FkTW9kdWxlKChQU1opJmVyciwgc2l6ZW9mKGVyciksIGZpbGVuYW1lLCAmaG0pKQorICAgIHsKKyAgICAgICAgY2FzZSBOT19FUlJPUjoKKyAgICAgICAgICAgIHRtcC0+aGFuZGxlID0gaG07CisgICAgICAgICAgICBpZiAoc2V0X2NoYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIGxhc3RfaWQrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGxhc3RfaWQgPT0gMCkgfHwgKGZpbmRfaWQobGFzdF9pZCkpKTsKKyAgICAgICAgICAgICAgICB0bXAtPmlkID0gbGFzdF9pZDsKKyAgICAgICAgICAgICAgICBkbGxvYWQgPSB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdG1wLT5pZDsKKyAgICAgICAgY2FzZSBFUlJPUl9GSUxFX05PVF9GT1VORDoKKyAgICAgICAgY2FzZSBFUlJPUl9QQVRIX05PVF9GT1VORDoKKyAgICAgICAgICAgIGVycnR4dCA9ICJtb2R1bGUgYCVzJyBub3QgZm91bmQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfVE9PX01BTllfT1BFTl9GSUxFUzoKKyAgICAgICAgY2FzZSBFUlJPUl9OT1RfRU5PVUdIX01FTU9SWToKKyAgICAgICAgY2FzZSBFUlJPUl9TSEFSSU5HX0JVRkZFUl9FWENFRURFRDoKIG5vbWVtOgotCQkJZXJydHh0ID0gIm91dCBvZiBzeXN0ZW0gcmVzb3VyY2VzIjsKLQkJCWJyZWFrOwotCQljYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6Ci0JCQllcnJ0eHQgPSAiYWNjZXNzIGRlbmllZCI7Ci0JCQlicmVhazsKLQkJY2FzZSBFUlJPUl9CQURfRk9STUFUOgotCQljYXNlIEVSUk9SX0lOVkFMSURfU0VHTUVOVF9OVU1CRVI6Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9PUkRJTkFMOgotCQljYXNlIEVSUk9SX0lOVkFMSURfTU9EVUxFVFlQRToKLQkJY2FzZSBFUlJPUl9JTlZBTElEX0VYRV9TSUdOQVRVUkU6Ci0JCWNhc2UgRVJST1JfRVhFX01BUktFRF9JTlZBTElEOgotCQljYXNlIEVSUk9SX0lURVJBVEVEX0RBVEFfRVhDRUVEU182NEs6Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9NSU5BTExPQ1NJWkU6Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9TRUdEUEw6Ci0JCWNhc2UgRVJST1JfQVVUT0RBVEFTRUdfRVhDRUVEU182NEs6Ci0JCWNhc2UgRVJST1JfUkVMT0NTUkNfQ0hBSU5fRVhDRUVEU19TRUdMSU1JVDoKLQkJCWVycnR4dCA9ICJpbnZhbGlkIG1vZHVsZSBmb3JtYXQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9OQU1FOgotCQkJZXJydHh0ID0gImZpbGVuYW1lIGRvZXNuJ3QgbWF0Y2ggbW9kdWxlIG5hbWUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVJST1JfU0hBUklOR19WSU9MQVRJT046Ci0JCWNhc2UgRVJST1JfTE9DS19WSU9MQVRJT046Ci0JCQllcnJ0eHQgPSAic2hhcmluZyB2aW9sYXRpb24iOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVJST1JfSU5JVF9ST1VUSU5FX0ZBSUxFRDoKLQkJCWVycnR4dCA9ICJtb2R1bGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZXJydHh0ID0gImNhdXNlIGAlcycsIGVycm9yIGNvZGUgPSAlZCI7Ci0JCQlicmVhazsKLQl9Ci0Jc25wcmludGYoZGxlcnIsIHNpemVvZihkbGVyciksIGVycnR4dCwgJmVyciwgcmMpOwotCWlmICh0bXApCi0JewotCQlpZiAodG1wLT5uYW1lKQotCQkJZnJlZSh0bXAtPm5hbWUpOwotCQlmcmVlKHRtcCk7Ci0JfQotCXJldHVybiAwOworICAgICAgICAgICAgZXJydHh0ID0gIm91dCBvZiBzeXN0ZW0gcmVzb3VyY2VzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6CisgICAgICAgICAgICBlcnJ0eHQgPSAiYWNjZXNzIGRlbmllZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFUlJPUl9CQURfRk9STUFUOgorICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfU0VHTUVOVF9OVU1CRVI6CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9PUkRJTkFMOgorICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfTU9EVUxFVFlQRToKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX0VYRV9TSUdOQVRVUkU6CisgICAgICAgIGNhc2UgRVJST1JfRVhFX01BUktFRF9JTlZBTElEOgorICAgICAgICBjYXNlIEVSUk9SX0lURVJBVEVEX0RBVEFfRVhDRUVEU182NEs6CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9NSU5BTExPQ1NJWkU6CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9TRUdEUEw6CisgICAgICAgIGNhc2UgRVJST1JfQVVUT0RBVEFTRUdfRVhDRUVEU182NEs6CisgICAgICAgIGNhc2UgRVJST1JfUkVMT0NTUkNfQ0hBSU5fRVhDRUVEU19TRUdMSU1JVDoKKyAgICAgICAgICAgIGVycnR4dCA9ICJpbnZhbGlkIG1vZHVsZSBmb3JtYXQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9OQU1FOgorICAgICAgICAgICAgZXJydHh0ID0gImZpbGVuYW1lIGRvZXNuJ3QgbWF0Y2ggbW9kdWxlIG5hbWUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfU0hBUklOR19WSU9MQVRJT046CisgICAgICAgIGNhc2UgRVJST1JfTE9DS19WSU9MQVRJT046CisgICAgICAgICAgICBlcnJ0eHQgPSAic2hhcmluZyB2aW9sYXRpb24iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfSU5JVF9ST1VUSU5FX0ZBSUxFRDoKKyAgICAgICAgICAgIGVycnR4dCA9ICJtb2R1bGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJydHh0ID0gImNhdXNlIGAlcycsIGVycm9yIGNvZGUgPSAlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgc25wcmludGYoZGxlcnIsIHNpemVvZihkbGVyciksIGVycnR4dCwgJmVyciwgcmMpOworICAgIGlmICh0bXApCisgICAgeworICAgICAgICBpZiAodG1wLT5uYW1lKQorICAgICAgICAgICAgZnJlZSh0bXAtPm5hbWUpOworICAgICAgICBmcmVlKHRtcCk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBgc3ltYm9sJyBpbiBETEwgKi8KIHZvaWQgKmRsc3ltKHZvaWQgKmhhbmRsZSwgY2hhciAqc3ltYm9sKQogewotCWludCByYyA9IDA7Ci0JUEZOIGFkZHI7Ci0JY2hhciAqZXJydHh0OwotCWludCBzeW1vcmQgPSAwOwotCURMTGNoYWluIHRtcCA9IGZpbmRfaWQoaGFuZGxlKTsKKyAgICBpbnQgcmMgPSAwOworICAgIFBGTiBhZGRyOworICAgIGNoYXIgKmVycnR4dDsKKyAgICBpbnQgc3ltb3JkID0gMDsKKyAgICBETExjaGFpbiB0bXAgPSBmaW5kX2lkKGhhbmRsZSk7CiAKLQlpZiAoIXRtcCkKLQkJZ290byBpbnZfaGFuZGxlOworICAgIGlmICghdG1wKQorICAgICAgICBnb3RvIGludl9oYW5kbGU7CiAKLQlpZiAoKnN5bWJvbCA9PSAnIycpCi0JCXN5bW9yZCA9IGF0b2koc3ltYm9sICsgMSk7CisgICAgaWYgKCpzeW1ib2wgPT0gJyMnKQorICAgICAgICBzeW1vcmQgPSBhdG9pKHN5bWJvbCArIDEpOwogCi0Jc3dpdGNoIChyYyA9IERvc1F1ZXJ5UHJvY0FkZHIodG1wLT5oYW5kbGUsIHN5bW9yZCwgc3ltYm9sLCAmYWRkcikpCi0JewotCQljYXNlIE5PX0VSUk9SOgotCQkJcmV0dXJuICh2b2lkICopYWRkcjsKLQkJY2FzZSBFUlJPUl9JTlZBTElEX0hBTkRMRToKKyAgICBzd2l0Y2ggKHJjID0gRG9zUXVlcnlQcm9jQWRkcih0bXAtPmhhbmRsZSwgc3ltb3JkLCBzeW1ib2wsICZhZGRyKSkKKyAgICB7CisgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgICAgICByZXR1cm4gKHZvaWQgKilhZGRyOworICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfSEFORExFOgogaW52X2hhbmRsZToKLQkJCWVycnR4dCA9ICJpbnZhbGlkIG1vZHVsZSBoYW5kbGUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVJST1JfUFJPQ19OT1RfRk9VTkQ6Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9OQU1FOgotCQkJZXJydHh0ID0gIm5vIHN5bWJvbCBgJXMnIGluIG1vZHVsZSI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWVycnR4dCA9ICJzeW1ib2wgYCVzJywgZXJyb3IgY29kZSA9ICVkIjsKLQkJCWJyZWFrOwotCX0KLQlzbnByaW50ZihkbGVyciwgc2l6ZW9mKGRsZXJyKSwgZXJydHh0LCBzeW1ib2wsIHJjKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGVycnR4dCA9ICJpbnZhbGlkIG1vZHVsZSBoYW5kbGUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfUFJPQ19OT1RfRk9VTkQ6CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9OQU1FOgorICAgICAgICAgICAgZXJydHh0ID0gIm5vIHN5bWJvbCBgJXMnIGluIG1vZHVsZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVycnR4dCA9ICJzeW1ib2wgYCVzJywgZXJyb3IgY29kZSA9ICVkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzbnByaW50ZihkbGVyciwgc2l6ZW9mKGRsZXJyKSwgZXJydHh0LCBzeW1ib2wsIHJjKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogZnJlZSBkeW5hbWljYWx5LWxpbmtlZCBsaWJyYXJ5ICovCiBpbnQgZGxjbG9zZSh2b2lkICpoYW5kbGUpCiB7Ci0JaW50IHJjOwotCURMTGNoYWluIHRtcCA9IGZpbmRfaWQoaGFuZGxlKTsKKyAgICBpbnQgcmM7CisgICAgRExMY2hhaW4gdG1wID0gZmluZF9pZChoYW5kbGUpOwogCi0JaWYgKCF0bXApCi0JCWdvdG8gaW52X2hhbmRsZTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgZ290byBpbnZfaGFuZGxlOwogCi0Jc3dpdGNoIChyYyA9IERvc0ZyZWVNb2R1bGUodG1wLT5oYW5kbGUpKQotCXsKLQkJY2FzZSBOT19FUlJPUjoKLQkJCWZyZWUodG1wLT5uYW1lKTsKLQkJCWRsbG9hZCA9IHRtcC0+bmV4dDsKLQkJCWZyZWUodG1wKTsKLQkJCXJldHVybiAwOwotCQljYXNlIEVSUk9SX0lOVkFMSURfSEFORExFOgorICAgIHN3aXRjaCAocmMgPSBEb3NGcmVlTW9kdWxlKHRtcC0+aGFuZGxlKSkKKyAgICB7CisgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgICAgICBmcmVlKHRtcC0+bmFtZSk7CisgICAgICAgICAgICBkbGxvYWQgPSB0bXAtPm5leHQ7CisgICAgICAgICAgICBmcmVlKHRtcCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX0hBTkRMRToKIGludl9oYW5kbGU6Ci0JCQlzdHJjcHkoZGxlcnIsICJpbnZhbGlkIG1vZHVsZSBoYW5kbGUiKTsKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBFUlJPUl9JTlZBTElEX0FDQ0VTUzoKLQkJCXN0cmNweShkbGVyciwgImFjY2VzcyBkZW5pZWQiKTsKLQkJCXJldHVybiAtMTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtMTsKLQl9CisgICAgICAgICAgICBzdHJjcHkoZGxlcnIsICJpbnZhbGlkIG1vZHVsZSBoYW5kbGUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX0FDQ0VTUzoKKyAgICAgICAgICAgIHN0cmNweShkbGVyciwgImFjY2VzcyBkZW5pZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIC8qIHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIGxhc3Qgb2NjdXJyZWQgZGwgZXJyb3IgKi8KIGNoYXIgKmRsZXJyb3IoKQogewotCXJldHVybiBkbGVycjsKKyAgICByZXR1cm4gZGxlcnI7CiB9CmRpZmYgLS1naXQgYS9QQy9vczJlbXgvZGxsZW50cnkuYyBiL1BDL29zMmVteC9kbGxlbnRyeS5jCmluZGV4IGRiZjljOTguLjljY2NhMWMgMTAwNjQ0Ci0tLSBhL1BDL29zMmVteC9kbGxlbnRyeS5jCisrKyBiL1BDL29zMmVteC9kbGxlbnRyeS5jCkBAIC00LDcgKzQsNyBAQAogCiAjZGVmaW5lIE5VTEwgMAogCi0jZGVmaW5lIFJFRihzKQlleHRlcm4gdm9pZCBzKCk7IHZvaWQgKl9fX19yZWZfIyNzID0gJnM7CisjZGVmaW5lIFJFRihzKSAgZXh0ZXJuIHZvaWQgcygpOyB2b2lkICpfX19fcmVmXyMjcyA9ICZzOwogCiAvKiBNYWtlIHJlZmVyZW5jZXMgdG8gaW1wb3J0ZWQgc3ltYm9scyB0byBwdWxsIHRoZW0gZnJvbSBzdGF0aWMgbGlicmFyeSAqLwogUkVGKFB5X01haW4pOwpAQCAtMTgsMjUgKzE4LDI1IEBACiAKIHVuc2lnbmVkIGxvbmcgX0RMTF9Jbml0VGVybSh1bnNpZ25lZCBsb25nIG1vZF9oYW5kbGUsIHVuc2lnbmVkIGxvbmcgZmxhZykKIHsKLQlzd2l0Y2ggKGZsYWcpCi0JewotCQljYXNlIDA6Ci0JCQlpZiAoX0NSVF9pbml0KCkpCi0JCQkJcmV0dXJuIDA7Ci0JCQlfX2N0b3JkdG9ySW5pdCgpOworICAgIHN3aXRjaCAoZmxhZykKKyAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGlmIChfQ1JUX2luaXQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIF9fY3RvcmR0b3JJbml0KCk7CiAKLQkJCS8qIElnbm9yZSBmYXRhbCBzaWduYWxzICovCi0JCQlzaWduYWwoU0lHU0VHViwgU0lHX0lHTik7Ci0JCQlzaWduYWwoU0lHRlBFLCBTSUdfSUdOKTsKKyAgICAgICAgICAgIC8qIElnbm9yZSBmYXRhbCBzaWduYWxzICovCisgICAgICAgICAgICBzaWduYWwoU0lHU0VHViwgU0lHX0lHTik7CisgICAgICAgICAgICBzaWduYWwoU0lHRlBFLCBTSUdfSUdOKTsKIAotCQkJcmV0dXJuIDE7CisgICAgICAgICAgICByZXR1cm4gMTsKIAotCQljYXNlIDE6Ci0JCQlfX2N0b3JkdG9yVGVybSgpOwotCQkJX0NSVF90ZXJtKCk7Ci0JCQlyZXR1cm4gMTsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgX19jdG9yZHRvclRlcm0oKTsKKyAgICAgICAgICAgIF9DUlRfdGVybSgpOworICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL1BDL29zMmVteC9nZXRwYXRocC5jIGIvUEMvb3MyZW14L2dldHBhdGhwLmMKaW5kZXggNTgzOWVhYi4uNGZhYTUwNSAxMDA2NDQKLS0tIGEvUEMvb3MyZW14L2dldHBhdGhwLmMKKysrIGIvUEMvb3MyZW14L2dldHBhdGhwLmMKQEAgLTQsOCArNCw4IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFBBVEggUlVMRVMgRk9SIE9TLzIrRU1YOgotICAgVGhpcyBkZXNjcmliZXMgaG93IHN5cy5wYXRoIGlzIGZvcm1lZCBvbiBPUy8yK0VNWC4gIEl0IGRlc2NyaWJlcyB0aGUgCi0gICBmdW5jdGlvbmFsaXR5LCBub3QgdGhlIGltcGxlbWVudGF0aW9uIChpZSwgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXNlIAorICAgVGhpcyBkZXNjcmliZXMgaG93IHN5cy5wYXRoIGlzIGZvcm1lZCBvbiBPUy8yK0VNWC4gIEl0IGRlc2NyaWJlcyB0aGUKKyAgIGZ1bmN0aW9uYWxpdHksIG5vdCB0aGUgaW1wbGVtZW50YXRpb24gKGllLCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlc2UKICAgIGFyZSBhY3R1YWxseSBmZXRjaGVkIGlzIGRpZmZlcmVudCkKIAogICAgKiBQeXRob24gYWx3YXlzIGFkZHMgYW4gZW1wdHkgZW50cnkgYXQgdGhlIHN0YXJ0LCB3aGljaCBjb3JyZXNwb25kcwpAQCAtMTYsMTAgKzE2LDEwIEBACiAgICAqIFdlIGF0dGVtcHQgdG8gbG9jYXRlIHRoZSAiUHl0aG9uIEhvbWUiIC0gaWYgdGhlIFBZVEhPTkhPTUUgZW52IHZhcgogICAgICBpcyBzZXQsIHdlIGJlbGlldmUgaXQuICBPdGhlcndpc2UsIHdlIHVzZSB0aGUgcGF0aCBvZiBvdXIgaG9zdCAuRVhFJ3MKICAgICAgdG8gdHJ5IGFuZCBsb2NhdGUgb3VyICJsYW5kbWFyayIgKGxpYlxcb3MucHkpIGFuZCBkZWR1Y2Ugb3VyIGhvbWUuCi0gICAgIC0gSWYgd2UgRE8gaGF2ZSBhIFB5dGhvbiBIb21lOiBUaGUgcmVsZXZhbnQgc3ViLWRpcmVjdG9yaWVzIChMaWIsIAorICAgICAtIElmIHdlIERPIGhhdmUgYSBQeXRob24gSG9tZTogVGhlIHJlbGV2YW50IHN1Yi1kaXJlY3RvcmllcyAoTGliLAogICAgICAgIHBsYXQtd2luLCBsaWItdGssIGV0YykgYXJlIGJhc2VkIG9uIHRoZSBQeXRob24gSG9tZQogICAgICAtIElmIHdlIERPIE5PVCBoYXZlIGEgUHl0aG9uIEhvbWUsIHRoZSBjb3JlIFB5dGhvbiBQYXRoIGlzCi0gICAgICAgbG9hZGVkIGZyb20gdGhlIHJlZ2lzdHJ5LiAgVGhpcyBpcyB0aGUgbWFpbiBQeXRob25QYXRoIGtleSwgCisgICAgICAgbG9hZGVkIGZyb20gdGhlIHJlZ2lzdHJ5LiAgVGhpcyBpcyB0aGUgbWFpbiBQeXRob25QYXRoIGtleSwKICAgICAgICBhbmQgYm90aCBIS0xNIGFuZCBIS0NVIGFyZSBjb21iaW5lZCB0byBmb3JtIHRoZSBwYXRoKQogCiAgICAqIElmZiAtIHdlIGNhbiBub3QgbG9jYXRlIHRoZSBQeXRob24gSG9tZSwgYW5kIGhhdmUgbm90IGhhZCBhIFBZVEhPTlBBVEgKQEAgLTMyLDkgKzMyLDkgQEAKICAgICAoZWl0aGVyIGFuIGluc3RhbGxlZCB2ZXJzaW9uLCBvciBkaXJlY3RseSBmcm9tIHRoZSBQQ2J1aWxkIGRpcmVjdG9yeSksCiAgICAgdGhlIGNvcmUgcGF0aCBpcyBkZWR1Y2VkLgogCi0gICogV2hlbiBQeXRob24gaXMgaG9zdGVkIGluIGFub3RoZXIgZXhlIChkaWZmZXJlbnQgZGlyZWN0b3J5LCBlbWJlZGRlZCB2aWEgCisgICogV2hlbiBQeXRob24gaXMgaG9zdGVkIGluIGFub3RoZXIgZXhlIChkaWZmZXJlbnQgZGlyZWN0b3J5LCBlbWJlZGRlZCB2aWEKICAgICBDT00sIGV0YyksIHRoZSBQeXRob24gSG9tZSB3aWxsIG5vdCBiZSBkZWR1Y2VkLCBzbyB0aGUgY29yZSBwYXRoIGZyb20KLSAgICB0aGUgcmVnaXN0cnkgaXMgdXNlZC4gIE90aGVyICJhcHBsaWNhdGlvbiBwYXRocyAiaW4gdGhlIHJlZ2lzdHJ5IGFyZSAKKyAgICB0aGUgcmVnaXN0cnkgaXMgdXNlZC4gIE90aGVyICJhcHBsaWNhdGlvbiBwYXRocyAiaW4gdGhlIHJlZ2lzdHJ5IGFyZQogICAgIGFsd2F5cyByZWFkLgogCiAgICogSWYgUHl0aG9uIGNhbid0IGZpbmQgaXRzIGhvbWUgYW5kIHRoZXJlIGlzIG5vIHJlZ2lzdHJ5IChlZywgZnJvemVuCkBAIC04NSwxMiArODUsMTIgQEAKIAogCiBzdGF0aWMgaW50Ci1pc19zZXAoY2hhciBjaCkJLyogZGV0ZXJtaW5lIGlmICJjaCIgaXMgYSBzZXBhcmF0b3IgY2hhcmFjdGVyICovCitpc19zZXAoY2hhciBjaCkgLyogZGV0ZXJtaW5lIGlmICJjaCIgaXMgYSBzZXBhcmF0b3IgY2hhcmFjdGVyICovCiB7CiAjaWZkZWYgQUxUU0VQCi0JcmV0dXJuIGNoID09IFNFUCB8fCBjaCA9PSBBTFRTRVA7CisgICAgcmV0dXJuIGNoID09IFNFUCB8fCBjaCA9PSBBTFRTRVA7CiAjZWxzZQotCXJldHVybiBjaCA9PSBTRVA7CisgICAgcmV0dXJuIGNoID09IFNFUDsKICNlbmRpZgogfQogCkBAIC0xMDAsMzYgKzEwMCwzNiBAQAogc3RhdGljIHZvaWQKIHJlZHVjZShjaGFyICpkaXIpCiB7Ci0Jc2l6ZV90IGkgPSBzdHJsZW4oZGlyKTsKLQl3aGlsZSAoaSA+IDAgJiYgIWlzX3NlcChkaXJbaV0pKQotCQktLWk7Ci0JZGlyW2ldID0gJ1wwJzsKKyAgICBzaXplX3QgaSA9IHN0cmxlbihkaXIpOworICAgIHdoaWxlIChpID4gMCAmJiAhaXNfc2VwKGRpcltpXSkpCisgICAgICAgIC0taTsKKyAgICBkaXJbaV0gPSAnXDAnOwogfQotCQorCiBzdGF0aWMgaW50CiBleGlzdHMoY2hhciAqZmlsZW5hbWUpCiB7Ci0Jc3RydWN0IHN0YXQgYnVmOwotCXJldHVybiBzdGF0KGZpbGVuYW1lLCAmYnVmKSA9PSAwOworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICByZXR1cm4gc3RhdChmaWxlbmFtZSwgJmJ1ZikgPT0gMDsKIH0KIAogLyogSXMgbW9kdWxlICAoY2hlY2sgZm9yIC5weWMvLnB5byB0b28pCi0gKiBBc3N1bWVzICdmaWxlbmFtZScgTUFYUEFUSExFTisxIGJ5dGVzIGxvbmcgLSAKKyAqIEFzc3VtZXMgJ2ZpbGVuYW1lJyBNQVhQQVRITEVOKzEgYnl0ZXMgbG9uZyAtCiAgKiBtYXkgZXh0ZW5kICdmaWxlbmFtZScgYnkgb25lIGNoYXJhY3Rlci4KICAqLwogc3RhdGljIGludAogaXNtb2R1bGUoY2hhciAqZmlsZW5hbWUpCiB7Ci0JaWYgKGV4aXN0cyhmaWxlbmFtZSkpCi0JCXJldHVybiAxOworICAgIGlmIChleGlzdHMoZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gMTsKIAotCS8qIENoZWNrIGZvciB0aGUgY29tcGlsZWQgdmVyc2lvbiBvZiBwcmVmaXguICovCi0JaWYgKHN0cmxlbihmaWxlbmFtZSkgPCBNQVhQQVRITEVOKSB7Ci0JCXN0cmNhdChmaWxlbmFtZSwgUHlfT3B0aW1pemVGbGFnID8gIm8iIDogImMiKTsKLQkJaWYgKGV4aXN0cyhmaWxlbmFtZSkpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBjb21waWxlZCB2ZXJzaW9uIG9mIHByZWZpeC4gKi8KKyAgICBpZiAoc3RybGVuKGZpbGVuYW1lKSA8IE1BWFBBVEhMRU4pIHsKKyAgICAgICAgc3RyY2F0KGZpbGVuYW1lLCBQeV9PcHRpbWl6ZUZsYWcgPyAibyIgOiAiYyIpOworICAgICAgICBpZiAoZXhpc3RzKGZpbGVuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogQWRkIGEgcGF0aCBjb21wb25lbnQsIGJ5IGFwcGVuZGluZyBzdHVmZiB0byBidWZmZXIuCkBAIC0xNDUsMjEgKzE0NSwyMSBAQAogc3RhdGljIHZvaWQKIGpvaW4oY2hhciAqYnVmZmVyLCBjaGFyICpzdHVmZikKIHsKLQlzaXplX3QgbiwgazsKLQlpZiAoaXNfc2VwKHN0dWZmWzBdKSkKLQkJbiA9IDA7Ci0JZWxzZSB7Ci0JCW4gPSBzdHJsZW4oYnVmZmVyKTsKLQkJaWYgKG4gPiAwICYmICFpc19zZXAoYnVmZmVyW24tMV0pICYmIG4gPCBNQVhQQVRITEVOKQotCQkJYnVmZmVyW24rK10gPSBTRVA7Ci0JfQotCWlmIChuID4gTUFYUEFUSExFTikKLQkJUHlfRmF0YWxFcnJvcigiYnVmZmVyIG92ZXJmbG93IGluIGdldHBhdGhwLmMncyBqb2lucGF0aCgpIik7Ci0JayA9IHN0cmxlbihzdHVmZik7Ci0JaWYgKG4gKyBrID4gTUFYUEFUSExFTikKLQkJayA9IE1BWFBBVEhMRU4gLSBuOwotCXN0cm5jcHkoYnVmZmVyK24sIHN0dWZmLCBrKTsKLQlidWZmZXJbbitrXSA9ICdcMCc7CisgICAgc2l6ZV90IG4sIGs7CisgICAgaWYgKGlzX3NlcChzdHVmZlswXSkpCisgICAgICAgIG4gPSAwOworICAgIGVsc2UgeworICAgICAgICBuID0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgIGlmIChuID4gMCAmJiAhaXNfc2VwKGJ1ZmZlcltuLTFdKSAmJiBuIDwgTUFYUEFUSExFTikKKyAgICAgICAgICAgIGJ1ZmZlcltuKytdID0gU0VQOworICAgIH0KKyAgICBpZiAobiA+IE1BWFBBVEhMRU4pCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImJ1ZmZlciBvdmVyZmxvdyBpbiBnZXRwYXRocC5jJ3Mgam9pbnBhdGgoKSIpOworICAgIGsgPSBzdHJsZW4oc3R1ZmYpOworICAgIGlmIChuICsgayA+IE1BWFBBVEhMRU4pCisgICAgICAgIGsgPSBNQVhQQVRITEVOIC0gbjsKKyAgICBzdHJuY3B5KGJ1ZmZlcituLCBzdHVmZiwgayk7CisgICAgYnVmZmVyW24ra10gPSAnXDAnOwogfQogCiAvKiBnb3RsYW5kbWFyayBvbmx5IGNhbGxlZCBieSBzZWFyY2hfZm9yX3ByZWZpeCwgd2hpY2ggZW5zdXJlcwpAQCAtMTY5LDIxOSArMTY5LDIxOSBAQAogc3RhdGljIGludAogZ290bGFuZG1hcmsoY2hhciAqbGFuZG1hcmspCiB7Ci0JaW50IG4sIG9rOworICAgIGludCBuLCBvazsKIAotCW4gPSBzdHJsZW4ocHJlZml4KTsKLQlqb2luKHByZWZpeCwgbGFuZG1hcmspOwotCW9rID0gaXNtb2R1bGUocHJlZml4KTsKLQlwcmVmaXhbbl0gPSAnXDAnOwotCXJldHVybiBvazsKKyAgICBuID0gc3RybGVuKHByZWZpeCk7CisgICAgam9pbihwcmVmaXgsIGxhbmRtYXJrKTsKKyAgICBvayA9IGlzbW9kdWxlKHByZWZpeCk7CisgICAgcHJlZml4W25dID0gJ1wwJzsKKyAgICByZXR1cm4gb2s7CiB9CiAKLS8qIGFzc3VtZXMgYXJndjBfcGF0aCBpcyBNQVhQQVRITEVOKzEgYnl0ZXMgbG9uZywgYWxyZWFkeSBcMCB0ZXJtJ2QuIAorLyogYXNzdW1lcyBhcmd2MF9wYXRoIGlzIE1BWFBBVEhMRU4rMSBieXRlcyBsb25nLCBhbHJlYWR5IFwwIHRlcm0nZC4KICAqIGFzc3VtcHRpb24gcHJvdmlkZWQgYnkgb25seSBjYWxsZXIsIGNhbGN1bGF0ZV9wYXRoKCkKICAqLwogc3RhdGljIGludAogc2VhcmNoX2Zvcl9wcmVmaXgoY2hhciAqYXJndjBfcGF0aCwgY2hhciAqbGFuZG1hcmspCiB7Ci0JLyogU2VhcmNoIGZyb20gYXJndjBfcGF0aCwgdW50aWwgbGFuZG1hcmsgaXMgZm91bmQgKi8KLQlzdHJjcHkocHJlZml4LCBhcmd2MF9wYXRoKTsKLQlkbyB7Ci0JCWlmIChnb3RsYW5kbWFyayhsYW5kbWFyaykpCi0JCQlyZXR1cm4gMTsKLQkJcmVkdWNlKHByZWZpeCk7Ci0JfSB3aGlsZSAocHJlZml4WzBdKTsKLQlyZXR1cm4gMDsKKyAgICAvKiBTZWFyY2ggZnJvbSBhcmd2MF9wYXRoLCB1bnRpbCBsYW5kbWFyayBpcyBmb3VuZCAqLworICAgIHN0cmNweShwcmVmaXgsIGFyZ3YwX3BhdGgpOworICAgIGRvIHsKKyAgICAgICAgaWYgKGdvdGxhbmRtYXJrKGxhbmRtYXJrKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZWR1Y2UocHJlZml4KTsKKyAgICB9IHdoaWxlIChwcmVmaXhbMF0pOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyB2b2lkCiBnZXRfcHJvZ3BhdGgodm9pZCkKIHsKLQlleHRlcm4gY2hhciAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7Ci0JY2hhciAqcGF0aCA9IGdldGVudigiUEFUSCIpOwotCWNoYXIgKnByb2cgPSBQeV9HZXRQcm9ncmFtTmFtZSgpOworICAgIGV4dGVybiBjaGFyICpQeV9HZXRQcm9ncmFtTmFtZSh2b2lkKTsKKyAgICBjaGFyICpwYXRoID0gZ2V0ZW52KCJQQVRIIik7CisgICAgY2hhciAqcHJvZyA9IFB5X0dldFByb2dyYW1OYW1lKCk7CiAKLQlQUElCIHBpYjsKLQlpZiAoKERvc0dldEluZm9CbG9ja3MoTlVMTCwgJnBpYikgPT0gMCkgJiYKLQkgICAgKERvc1F1ZXJ5TW9kdWxlTmFtZShwaWItPnBpYl9obXRlLCBzaXplb2YocHJvZ3BhdGgpLCBwcm9ncGF0aCkgPT0gMCkpCi0JCXJldHVybjsKKyAgICBQUElCIHBpYjsKKyAgICBpZiAoKERvc0dldEluZm9CbG9ja3MoTlVMTCwgJnBpYikgPT0gMCkgJiYKKyAgICAgICAgKERvc1F1ZXJ5TW9kdWxlTmFtZShwaWItPnBpYl9obXRlLCBzaXplb2YocHJvZ3BhdGgpLCBwcm9ncGF0aCkgPT0gMCkpCisgICAgICAgIHJldHVybjsKIAotCWlmIChwcm9nID09IE5VTEwgfHwgKnByb2cgPT0gJ1wwJykKLQkJcHJvZyA9ICJweXRob24iOworICAgIGlmIChwcm9nID09IE5VTEwgfHwgKnByb2cgPT0gJ1wwJykKKyAgICAgICAgcHJvZyA9ICJweXRob24iOwogCi0JLyogSWYgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIGFyZ3YwIHBhdGgsIHRoZW4gd2UgaGF2ZSB0bwotCSAqIGFzc3VtZSBweXRob24gaXMgb24gdGhlIHVzZXIncyAkUEFUSCwgc2luY2UgdGhlcmUncyBubwotCSAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCi0JICogJFBBVEggaXNuJ3QgZXhwb3J0ZWQsIHlvdSBsb3NlLgotCSAqLworICAgIC8qIElmIHRoZXJlIGlzIG5vIHNsYXNoIGluIHRoZSBhcmd2MCBwYXRoLCB0aGVuIHdlIGhhdmUgdG8KKyAgICAgKiBhc3N1bWUgcHl0aG9uIGlzIG9uIHRoZSB1c2VyJ3MgJFBBVEgsIHNpbmNlIHRoZXJlJ3Mgbm8KKyAgICAgKiBvdGhlciB3YXkgdG8gZmluZCBhIGRpcmVjdG9yeSB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uICBJZgorICAgICAqICRQQVRIIGlzbid0IGV4cG9ydGVkLCB5b3UgbG9zZS4KKyAgICAgKi8KICNpZmRlZiBBTFRTRVAKLQlpZiAoc3RyY2hyKHByb2csIFNFUCkgfHwgc3RyY2hyKHByb2csIEFMVFNFUCkpCisgICAgaWYgKHN0cmNocihwcm9nLCBTRVApIHx8IHN0cmNocihwcm9nLCBBTFRTRVApKQogI2Vsc2UKLQlpZiAoc3RyY2hyKHByb2csIFNFUCkpCisgICAgaWYgKHN0cmNocihwcm9nLCBTRVApKQogI2VuZGlmCi0JCXN0cm5jcHkocHJvZ3BhdGgsIHByb2csIE1BWFBBVEhMRU4pOwotCWVsc2UgaWYgKHBhdGgpIHsKLQkJd2hpbGUgKDEpIHsKLQkJCWNoYXIgKmRlbGltID0gc3RyY2hyKHBhdGgsIERFTElNKTsKKyAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcHJvZywgTUFYUEFUSExFTik7CisgICAgZWxzZSBpZiAocGF0aCkgeworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgY2hhciAqZGVsaW0gPSBzdHJjaHIocGF0aCwgREVMSU0pOwogCi0JCQlpZiAoZGVsaW0pIHsKLQkJCQlzaXplX3QgbGVuID0gZGVsaW0gLSBwYXRoOwotCQkJCS8qIGVuc3VyZSB3ZSBjYW4ndCBvdmVyd3JpdGUgYnVmZmVyICovCisgICAgICAgICAgICBpZiAoZGVsaW0pIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuID0gZGVsaW0gLSBwYXRoOworICAgICAgICAgICAgICAgIC8qIGVuc3VyZSB3ZSBjYW4ndCBvdmVyd3JpdGUgYnVmZmVyICovCiAjaWYgIWRlZmluZWQoUFlDQ19HQ0MpCi0JCQkJbGVuID0gbWluKE1BWFBBVEhMRU4sbGVuKTsKKyAgICAgICAgICAgICAgICBsZW4gPSBtaW4oTUFYUEFUSExFTixsZW4pOwogI2Vsc2UKLQkJCQlsZW4gPSBNQVhQQVRITEVOIDwgbGVuID8gTUFYUEFUSExFTiA6IGxlbjsKKyAgICAgICAgICAgICAgICBsZW4gPSBNQVhQQVRITEVOIDwgbGVuID8gTUFYUEFUSExFTiA6IGxlbjsKICNlbmRpZgotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7Ci0JCQkJKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOwotCQkJfQotCQkJZWxzZQotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIE1BWFBBVEhMRU4pOworICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7CisgICAgICAgICAgICAgICAgKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIE1BWFBBVEhMRU4pOwogCi0JCQkvKiBqb2luKCkgaXMgc2FmZSBmb3IgTUFYUEFUSExFTisxIHNpemUgYnVmZmVyICovCi0JCQlqb2luKHByb2dwYXRoLCBwcm9nKTsKLQkJCWlmIChleGlzdHMocHJvZ3BhdGgpKQotCQkJCWJyZWFrOworICAgICAgICAgICAgLyogam9pbigpIGlzIHNhZmUgZm9yIE1BWFBBVEhMRU4rMSBzaXplIGJ1ZmZlciAqLworICAgICAgICAgICAgam9pbihwcm9ncGF0aCwgcHJvZyk7CisgICAgICAgICAgICBpZiAoZXhpc3RzKHByb2dwYXRoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJaWYgKCFkZWxpbSkgewotCQkJCXByb2dwYXRoWzBdID0gJ1wwJzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBhdGggPSBkZWxpbSArIDE7Ci0JCX0KLQl9Ci0JZWxzZQotCQlwcm9ncGF0aFswXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAoIWRlbGltKSB7CisgICAgICAgICAgICAgICAgcHJvZ3BhdGhbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0aCA9IGRlbGltICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIHByb2dwYXRoWzBdID0gJ1wwJzsKIH0KIAogc3RhdGljIHZvaWQKIGNhbGN1bGF0ZV9wYXRoKHZvaWQpCiB7Ci0JY2hhciBhcmd2MF9wYXRoW01BWFBBVEhMRU4rMV07Ci0JY2hhciAqYnVmOwotCXNpemVfdCBidWZzejsKLQljaGFyICpweXRob25ob21lID0gUHlfR2V0UHl0aG9uSG9tZSgpOwotCWNoYXIgKmVudnBhdGggPSBnZXRlbnYoIlBZVEhPTlBBVEgiKTsKLQljaGFyIHppcF9wYXRoW01BWFBBVEhMRU4rMV07Ci0Jc2l6ZV90IGxlbjsKKyAgICBjaGFyIGFyZ3YwX3BhdGhbTUFYUEFUSExFTisxXTsKKyAgICBjaGFyICpidWY7CisgICAgc2l6ZV90IGJ1ZnN6OworICAgIGNoYXIgKnB5dGhvbmhvbWUgPSBQeV9HZXRQeXRob25Ib21lKCk7CisgICAgY2hhciAqZW52cGF0aCA9IGdldGVudigiUFlUSE9OUEFUSCIpOworICAgIGNoYXIgemlwX3BhdGhbTUFYUEFUSExFTisxXTsKKyAgICBzaXplX3QgbGVuOwogCi0JZ2V0X3Byb2dwYXRoKCk7Ci0JLyogcHJvZ3BhdGggZ3VhcmFudGVlZCBcMCB0ZXJtaW5hdGVkIGluIE1BWFBBVEgrMSBieXRlcy4gKi8KLQlzdHJjcHkoYXJndjBfcGF0aCwgcHJvZ3BhdGgpOwotCXJlZHVjZShhcmd2MF9wYXRoKTsKLQlpZiAocHl0aG9uaG9tZSA9PSBOVUxMIHx8ICpweXRob25ob21lID09ICdcMCcpIHsKLQkJaWYgKHNlYXJjaF9mb3JfcHJlZml4KGFyZ3YwX3BhdGgsIExBTkRNQVJLKSkKLQkJCXB5dGhvbmhvbWUgPSBwcmVmaXg7Ci0JCWVsc2UKLQkJCXB5dGhvbmhvbWUgPSBOVUxMOwotCX0KLQllbHNlCi0JCXN0cm5jcHkocHJlZml4LCBweXRob25ob21lLCBNQVhQQVRITEVOKTsKKyAgICBnZXRfcHJvZ3BhdGgoKTsKKyAgICAvKiBwcm9ncGF0aCBndWFyYW50ZWVkIFwwIHRlcm1pbmF0ZWQgaW4gTUFYUEFUSCsxIGJ5dGVzLiAqLworICAgIHN0cmNweShhcmd2MF9wYXRoLCBwcm9ncGF0aCk7CisgICAgcmVkdWNlKGFyZ3YwX3BhdGgpOworICAgIGlmIChweXRob25ob21lID09IE5VTEwgfHwgKnB5dGhvbmhvbWUgPT0gJ1wwJykgeworICAgICAgICBpZiAoc2VhcmNoX2Zvcl9wcmVmaXgoYXJndjBfcGF0aCwgTEFORE1BUkspKQorICAgICAgICAgICAgcHl0aG9uaG9tZSA9IHByZWZpeDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHl0aG9uaG9tZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3RybmNweShwcmVmaXgsIHB5dGhvbmhvbWUsIE1BWFBBVEhMRU4pOwogCi0JaWYgKGVudnBhdGggJiYgKmVudnBhdGggPT0gJ1wwJykKLQkJZW52cGF0aCA9IE5VTEw7CisgICAgaWYgKGVudnBhdGggJiYgKmVudnBhdGggPT0gJ1wwJykKKyAgICAgICAgZW52cGF0aCA9IE5VTEw7CiAKLQkvKiBDYWxjdWxhdGUgemlwIGFyY2hpdmUgcGF0aCAqLwotCXN0cm5jcHkoemlwX3BhdGgsIHByb2dwYXRoLCBNQVhQQVRITEVOKTsKLQl6aXBfcGF0aFtNQVhQQVRITEVOXSA9ICdcMCc7Ci0JbGVuID0gc3RybGVuKHppcF9wYXRoKTsKLQlpZiAobGVuID4gNCkgewotCQl6aXBfcGF0aFtsZW4tM10gPSAneic7ICAvKiBjaGFuZ2UgZW5kaW5nIHRvICJ6aXAiICovCi0JCXppcF9wYXRoW2xlbi0yXSA9ICdpJzsKLQkJemlwX3BhdGhbbGVuLTFdID0gJ3AnOwotCX0KLQllbHNlIHsKLQkJemlwX3BhdGhbMF0gPSAwOwotCX0KKyAgICAvKiBDYWxjdWxhdGUgemlwIGFyY2hpdmUgcGF0aCAqLworICAgIHN0cm5jcHkoemlwX3BhdGgsIHByb2dwYXRoLCBNQVhQQVRITEVOKTsKKyAgICB6aXBfcGF0aFtNQVhQQVRITEVOXSA9ICdcMCc7CisgICAgbGVuID0gc3RybGVuKHppcF9wYXRoKTsKKyAgICBpZiAobGVuID4gNCkgeworICAgICAgICB6aXBfcGF0aFtsZW4tM10gPSAneic7ICAvKiBjaGFuZ2UgZW5kaW5nIHRvICJ6aXAiICovCisgICAgICAgIHppcF9wYXRoW2xlbi0yXSA9ICdpJzsKKyAgICAgICAgemlwX3BhdGhbbGVuLTFdID0gJ3AnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgemlwX3BhdGhbMF0gPSAwOworICAgIH0KIAotCS8qIFdlIG5lZWQgdG8gY29uc3RydWN0IGEgcGF0aCBmcm9tIHRoZSBmb2xsb3dpbmcgcGFydHMuCi0JICogKDEpIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZiBzZXQ7Ci0JICogKDIpIHRoZSB6aXAgYXJjaGl2ZSBmaWxlIHBhdGg7Ci0JICogKDMpIHRoZSBQWVRIT05QQVRIIGNvbmZpZyBtYWNybywgd2l0aCB0aGUgbGVhZGluZyAiLiIKLQkgKiAgICAgb2YgZWFjaCBjb21wb25lbnQgcmVwbGFjZWQgd2l0aCBweXRob25ob21lLCBpZiBzZXQ7Ci0JICogKDQpIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZXhlY3V0YWJsZSAoYXJndjBfcGF0aCkuCi0JICogVGhlIGxlbmd0aCBjYWxjdWxhdGlvbiBjYWxjdWxhdGVzICMzIGZpcnN0LgotCSAqLworICAgIC8qIFdlIG5lZWQgdG8gY29uc3RydWN0IGEgcGF0aCBmcm9tIHRoZSBmb2xsb3dpbmcgcGFydHMuCisgICAgICogKDEpIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZiBzZXQ7CisgICAgICogKDIpIHRoZSB6aXAgYXJjaGl2ZSBmaWxlIHBhdGg7CisgICAgICogKDMpIHRoZSBQWVRIT05QQVRIIGNvbmZpZyBtYWNybywgd2l0aCB0aGUgbGVhZGluZyAiLiIKKyAgICAgKiAgICAgb2YgZWFjaCBjb21wb25lbnQgcmVwbGFjZWQgd2l0aCBweXRob25ob21lLCBpZiBzZXQ7CisgICAgICogKDQpIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZXhlY3V0YWJsZSAoYXJndjBfcGF0aCkuCisgICAgICogVGhlIGxlbmd0aCBjYWxjdWxhdGlvbiBjYWxjdWxhdGVzICMzIGZpcnN0LgorICAgICAqLwogCi0JLyogQ2FsY3VsYXRlIHNpemUgb2YgcmV0dXJuIGJ1ZmZlciAqLwotCWlmIChweXRob25ob21lICE9IE5VTEwpIHsKLQkJY2hhciAqcDsKLQkJYnVmc3ogPSAxOwkKLQkJZm9yIChwID0gUFlUSE9OUEFUSDsgKnA7IHArKykgewotCQkJaWYgKCpwID09IERFTElNKQotCQkJCWJ1ZnN6Kys7IC8qIG51bWJlciBvZiBERUxJTSBwbHVzIG9uZSAqLwotCQl9Ci0JCWJ1ZnN6ICo9IHN0cmxlbihweXRob25ob21lKTsKLQl9Ci0JZWxzZQotCQlidWZzeiA9IDA7Ci0JYnVmc3ogKz0gc3RybGVuKFBZVEhPTlBBVEgpICsgMTsKLQlidWZzeiArPSBzdHJsZW4oYXJndjBfcGF0aCkgKyAxOwotCWJ1ZnN6ICs9IHN0cmxlbih6aXBfcGF0aCkgKyAxOwotCWlmIChlbnZwYXRoICE9IE5VTEwpCi0JCWJ1ZnN6ICs9IHN0cmxlbihlbnZwYXRoKSArIDE7CisgICAgLyogQ2FsY3VsYXRlIHNpemUgb2YgcmV0dXJuIGJ1ZmZlciAqLworICAgIGlmIChweXRob25ob21lICE9IE5VTEwpIHsKKyAgICAgICAgY2hhciAqcDsKKyAgICAgICAgYnVmc3ogPSAxOworICAgICAgICBmb3IgKHAgPSBQWVRIT05QQVRIOyAqcDsgcCsrKSB7CisgICAgICAgICAgICBpZiAoKnAgPT0gREVMSU0pCisgICAgICAgICAgICAgICAgYnVmc3orKzsgLyogbnVtYmVyIG9mIERFTElNIHBsdXMgb25lICovCisgICAgICAgIH0KKyAgICAgICAgYnVmc3ogKj0gc3RybGVuKHB5dGhvbmhvbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGJ1ZnN6ID0gMDsKKyAgICBidWZzeiArPSBzdHJsZW4oUFlUSE9OUEFUSCkgKyAxOworICAgIGJ1ZnN6ICs9IHN0cmxlbihhcmd2MF9wYXRoKSArIDE7CisgICAgYnVmc3ogKz0gc3RybGVuKHppcF9wYXRoKSArIDE7CisgICAgaWYgKGVudnBhdGggIT0gTlVMTCkKKyAgICAgICAgYnVmc3ogKz0gc3RybGVuKGVudnBhdGgpICsgMTsKIAotCW1vZHVsZV9zZWFyY2hfcGF0aCA9IGJ1ZiA9IG1hbGxvYyhidWZzeik7Ci0JaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCS8qIFdlIGNhbid0IGV4aXQsIHNvIHByaW50IGEgd2FybmluZyBhbmQgbGltcCBhbG9uZyAqLwotCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG1hbGxvYyBkeW5hbWljIFBZVEhPTlBBVEguXG4iKTsKLQkJaWYgKGVudnBhdGgpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgZW52aXJvbm1lbnQgJFBZVEhPTlBBVEguXG4iKTsKLQkJCW1vZHVsZV9zZWFyY2hfcGF0aCA9IGVudnBhdGg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGRlZmF1bHQgc3RhdGljIHBhdGguXG4iKTsKLQkJCW1vZHVsZV9zZWFyY2hfcGF0aCA9IFBZVEhPTlBBVEg7Ci0JCX0KLQkJcmV0dXJuOwotCX0KKyAgICBtb2R1bGVfc2VhcmNoX3BhdGggPSBidWYgPSBtYWxsb2MoYnVmc3opOworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAvKiBXZSBjYW4ndCBleGl0LCBzbyBwcmludCBhIHdhcm5pbmcgYW5kIGxpbXAgYWxvbmcgKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBtYWxsb2MgZHluYW1pYyBQWVRIT05QQVRILlxuIik7CisgICAgICAgIGlmIChlbnZwYXRoKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGVudmlyb25tZW50ICRQWVRIT05QQVRILlxuIik7CisgICAgICAgICAgICBtb2R1bGVfc2VhcmNoX3BhdGggPSBlbnZwYXRoOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2luZyBkZWZhdWx0IHN0YXRpYyBwYXRoLlxuIik7CisgICAgICAgICAgICBtb2R1bGVfc2VhcmNoX3BhdGggPSBQWVRIT05QQVRIOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlpZiAoZW52cGF0aCkgewotCQlzdHJjcHkoYnVmLCBlbnZwYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JCSpidWYrKyA9IERFTElNOwotCX0KLQlpZiAoemlwX3BhdGhbMF0pIHsKLQkJc3RyY3B5KGJ1ZiwgemlwX3BhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJKmJ1ZisrID0gREVMSU07Ci0JfQorICAgIGlmIChlbnZwYXRoKSB7CisgICAgICAgIHN0cmNweShidWYsIGVudnBhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgfQorICAgIGlmICh6aXBfcGF0aFswXSkgeworICAgICAgICBzdHJjcHkoYnVmLCB6aXBfcGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICB9CiAKLQlpZiAocHl0aG9uaG9tZSA9PSBOVUxMKSB7Ci0JCXN0cmNweShidWYsIFBZVEhPTlBBVEgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQl9Ci0JZWxzZSB7Ci0JCWNoYXIgKnAgPSBQWVRIT05QQVRIOwotCQljaGFyICpxOwotCQlzaXplX3QgbjsKLQkJZm9yICg7OykgewotCQkJcSA9IHN0cmNocihwLCBERUxJTSk7Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCW4gPSBzdHJsZW4ocCk7Ci0JCQllbHNlCi0JCQkJbiA9IHEtcDsKLQkJCWlmIChwWzBdID09ICcuJyAmJiBpc19zZXAocFsxXSkpIHsKLQkJCQlzdHJjcHkoYnVmLCBweXRob25ob21lKTsKLQkJCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJCQlwKys7Ci0JCQkJbi0tOwotCQkJfQotCQkJc3RybmNweShidWYsIHAsIG4pOwotCQkJYnVmICs9IG47Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJKmJ1ZisrID0gREVMSU07Ci0JCQlwID0gcSsxOwotCQl9Ci0JfQotCWlmIChhcmd2MF9wYXRoKSB7Ci0JCSpidWYrKyA9IERFTElNOwotCQlzdHJjcHkoYnVmLCBhcmd2MF9wYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JfQotCSpidWYgPSAnXDAnOworICAgIGlmIChweXRob25ob21lID09IE5VTEwpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2hhciAqcCA9IFBZVEhPTlBBVEg7CisgICAgICAgIGNoYXIgKnE7CisgICAgICAgIHNpemVfdCBuOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBxID0gc3RyY2hyKHAsIERFTElNKTsKKyAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgbiA9IHN0cmxlbihwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuID0gcS1wOworICAgICAgICAgICAgaWYgKHBbMF0gPT0gJy4nICYmIGlzX3NlcChwWzFdKSkgeworICAgICAgICAgICAgICAgIHN0cmNweShidWYsIHB5dGhvbmhvbWUpOworICAgICAgICAgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBuLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJuY3B5KGJ1ZiwgcCwgbik7CisgICAgICAgICAgICBidWYgKz0gbjsKKyAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICAgICAgICAgIHAgPSBxKzE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZ3YwX3BhdGgpIHsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgICAgIHN0cmNweShidWYsIGFyZ3YwX3BhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICB9CisgICAgKmJ1ZiA9ICdcMCc7CiB9CiAKIApAQCAtMzkwLDI5ICszOTAsMjkgQEAKIGNoYXIgKgogUHlfR2V0UGF0aCh2b2lkKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOwotCXJldHVybiBtb2R1bGVfc2VhcmNoX3BhdGg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIG1vZHVsZV9zZWFyY2hfcGF0aDsKIH0KIAogY2hhciAqCiBQeV9HZXRQcmVmaXgodm9pZCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKLQlyZXR1cm4gcHJlZml4OworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOworICAgIHJldHVybiBwcmVmaXg7CiB9CiAKIGNoYXIgKgogUHlfR2V0RXhlY1ByZWZpeCh2b2lkKQogewotCXJldHVybiBQeV9HZXRQcmVmaXgoKTsKKyAgICByZXR1cm4gUHlfR2V0UHJlZml4KCk7CiB9CiAKIGNoYXIgKgogUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKHZvaWQpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7Ci0JcmV0dXJuIHByb2dwYXRoOworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOworICAgIHJldHVybiBwcm9ncGF0aDsKIH0KZGlmZiAtLWdpdCBhL1BDL29zMmVteC9weXRob25wbS5jIGIvUEMvb3MyZW14L3B5dGhvbnBtLmMKaW5kZXggNWFjY2JiZC4uYmE0N2Y0YiAxMDA2NDQKLS0tIGEvUEMvb3MyZW14L3B5dGhvbnBtLmMKKysrIGIvUEMvb3MyZW14L3B5dGhvbnBtLmMKQEAgLTI3LDEwICsyNywxMCBAQAogLyogdXNlIHN0cnVjdHVyZSB0byBwYXNzIGNvbW1hbmQgbGluZSB0byBQeXRob24gdGhyZWFkICovCiB0eXBlZGVmIHN0cnVjdAogewotCWludCBhcmdjOwotCWNoYXIgKiphcmd2OwotCUhXTkQgRnJhbWU7Ci0JaW50IHJ1bm5pbmc7CisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqKmFyZ3Y7CisgICAgSFdORCBGcmFtZTsKKyAgICBpbnQgcnVubmluZzsKIH0gYXJnbGlzdDsKIAogLyogbWFrZSB0aGlzIGEgZ2xvYmFsIHRvIHNpbXBsaWZ5IGFjY2Vzcy4KQEAgLTQ1LDgwICs0NSw4MCBAQAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQlVTE9ORyBGcmFtZUZsYWdzID0gRkNGX1RJVExFQkFSIHwKLQkJCSAgIEZDRl9TWVNNRU5VIHwKLQkJCSAgIEZDRl9TSVpFQk9SREVSIHwKLQkJCSAgIEZDRl9ISURFQlVUVE9OIHwKLQkJCSAgIEZDRl9TSEVMTFBPU0lUSU9OIHwKLQkJCSAgIEZDRl9UQVNLTElTVDsKLQlIQUIgaGFiOwotCUhNUSBobXE7Ci0JSFdORCBDbGllbnQ7Ci0JUU1TRyBxbXNnOwotCWFyZ2xpc3QgYXJnczsKLQlpbnQgcHl0aG9uX3RpZDsKKyAgICBVTE9ORyBGcmFtZUZsYWdzID0gRkNGX1RJVExFQkFSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgRkNGX1NZU01FTlUgfAorICAgICAgICAgICAgICAgICAgICAgICBGQ0ZfU0laRUJPUkRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgIEZDRl9ISURFQlVUVE9OIHwKKyAgICAgICAgICAgICAgICAgICAgICAgRkNGX1NIRUxMUE9TSVRJT04gfAorICAgICAgICAgICAgICAgICAgICAgICBGQ0ZfVEFTS0xJU1Q7CisgICAgSEFCIGhhYjsKKyAgICBITVEgaG1xOworICAgIEhXTkQgQ2xpZW50OworICAgIFFNU0cgcW1zZzsKKyAgICBhcmdsaXN0IGFyZ3M7CisgICAgaW50IHB5dGhvbl90aWQ7CiAKLQkvKiBpbml0IFBNIGFuZCBjcmVhdGUgbWVzc2FnZSBxdWV1ZSAqLwotCWhhYiA9IFdpbkluaXRpYWxpemUoMCk7Ci0JaG1xID0gV2luQ3JlYXRlTXNnUXVldWUoaGFiLCAwKTsKKyAgICAvKiBpbml0IFBNIGFuZCBjcmVhdGUgbWVzc2FnZSBxdWV1ZSAqLworICAgIGhhYiA9IFdpbkluaXRpYWxpemUoMCk7CisgICAgaG1xID0gV2luQ3JlYXRlTXNnUXVldWUoaGFiLCAwKTsKIAotCS8qIGNyZWF0ZSBhIChoaWRkZW4pIFdpbmRvdyB0byBob3VzZSB0aGUgd2luZG93IHByb2NlZHVyZSAqLwotCWFyZ3MuRnJhbWUgPSBXaW5DcmVhdGVTdGRXaW5kb3coSFdORF9ERVNLVE9QLAotCQkJCQkwLAotCQkJCQkmRnJhbWVGbGFncywKLQkJCQkJTlVMTCwKLQkJCQkJIlB5dGhvblBNIiwKLQkJCQkJMEwsCi0JCQkJCTAsCi0JCQkJCTAsCi0JCQkJCSZDbGllbnQpOworICAgIC8qIGNyZWF0ZSBhIChoaWRkZW4pIFdpbmRvdyB0byBob3VzZSB0aGUgd2luZG93IHByb2NlZHVyZSAqLworICAgIGFyZ3MuRnJhbWUgPSBXaW5DcmVhdGVTdGRXaW5kb3coSFdORF9ERVNLVE9QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZGcmFtZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob25QTSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsaWVudCk7CiAKLQkvKiBydW4gUHl0aG9uIGludGVycHJldGVyIGluIGEgdGhyZWFkICovCi0JYXJncy5hcmdjID0gYXJnYzsKLQlhcmdzLmFyZ3YgPSBhcmd2OwotCWFyZ3MucnVubmluZyA9IDA7Ci0JaWYgKC0xID09IChweXRob25fdGlkID0gX2JlZ2ludGhyZWFkKFB5dGhvblRocmVhZCwgTlVMTCwgMTAyNCAqIDEwMjQsICZhcmdzKSkpCi0JewotCQkvKiBjb3VsZG4ndCBzdGFydCB0aHJlYWQgKi8KLQkJV2luQWxhcm0oSFdORF9ERVNLVE9QLCBXQV9FUlJPUik7Ci0JCVB5dGhvblJDID0gMTsKLQl9Ci0JZWxzZQotCXsKLQkJLyogcHJvY2VzcyBQTSBtZXNzYWdlcywgdW50aWwgUHl0aG9uIGV4aXRzICovCi0JCXdoaWxlIChXaW5HZXRNc2coaGFiLCAmcW1zZywgTlVMTEhBTkRMRSwgMCwgMCkpCi0JCQlXaW5EaXNwYXRjaE1zZyhoYWIsICZxbXNnKTsKLQkJaWYgKGFyZ3MucnVubmluZyA+IDApCi0JCQlEb3NLaWxsVGhyZWFkKHB5dGhvbl90aWQpOwotCX0KLQkJCi0JLyogZGVzdHJveSB3aW5kb3csIHNodXRkb3duIG1lc3NhZ2UgcXVldWUgYW5kIFBNICovCi0JV2luRGVzdHJveVdpbmRvdyhhcmdzLkZyYW1lKTsKLQlXaW5EZXN0cm95TXNnUXVldWUoaG1xKTsKLQlXaW5UZXJtaW5hdGUoaGFiKTsKKyAgICAvKiBydW4gUHl0aG9uIGludGVycHJldGVyIGluIGEgdGhyZWFkICovCisgICAgYXJncy5hcmdjID0gYXJnYzsKKyAgICBhcmdzLmFyZ3YgPSBhcmd2OworICAgIGFyZ3MucnVubmluZyA9IDA7CisgICAgaWYgKC0xID09IChweXRob25fdGlkID0gX2JlZ2ludGhyZWFkKFB5dGhvblRocmVhZCwgTlVMTCwgMTAyNCAqIDEwMjQsICZhcmdzKSkpCisgICAgeworICAgICAgICAvKiBjb3VsZG4ndCBzdGFydCB0aHJlYWQgKi8KKyAgICAgICAgV2luQWxhcm0oSFdORF9ERVNLVE9QLCBXQV9FUlJPUik7CisgICAgICAgIFB5dGhvblJDID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogcHJvY2VzcyBQTSBtZXNzYWdlcywgdW50aWwgUHl0aG9uIGV4aXRzICovCisgICAgICAgIHdoaWxlIChXaW5HZXRNc2coaGFiLCAmcW1zZywgTlVMTEhBTkRMRSwgMCwgMCkpCisgICAgICAgICAgICBXaW5EaXNwYXRjaE1zZyhoYWIsICZxbXNnKTsKKyAgICAgICAgaWYgKGFyZ3MucnVubmluZyA+IDApCisgICAgICAgICAgICBEb3NLaWxsVGhyZWFkKHB5dGhvbl90aWQpOworICAgIH0KIAotCXJldHVybiBQeXRob25SQzsKKyAgICAvKiBkZXN0cm95IHdpbmRvdywgc2h1dGRvd24gbWVzc2FnZSBxdWV1ZSBhbmQgUE0gKi8KKyAgICBXaW5EZXN0cm95V2luZG93KGFyZ3MuRnJhbWUpOworICAgIFdpbkRlc3Ryb3lNc2dRdWV1ZShobXEpOworICAgIFdpblRlcm1pbmF0ZShoYWIpOworCisgICAgcmV0dXJuIFB5dGhvblJDOwogfQogCiB2b2lkIFB5dGhvblRocmVhZCh2b2lkICphcmdsKQogewotCUhBQiBoYWI7Ci0JYXJnbGlzdCAqYXJnczsKKyAgICBIQUIgaGFiOworICAgIGFyZ2xpc3QgKmFyZ3M7CiAKLQkvKiBQTSBpbml0aWFsaXNhdGlvbiAqLwotCWhhYiA9IFdpbkluaXRpYWxpemUoMCk7CisgICAgLyogUE0gaW5pdGlhbGlzYXRpb24gKi8KKyAgICBoYWIgPSBXaW5Jbml0aWFsaXplKDApOwogCi0JLyogc3RhcnQgUHl0aG9uICovCi0JYXJncyA9IChhcmdsaXN0ICopYXJnbDsKLQlhcmdzLT5ydW5uaW5nID0gMTsKLQlQeXRob25SQyA9IFB5X01haW4oYXJncy0+YXJnYywgYXJncy0+YXJndik7CisgICAgLyogc3RhcnQgUHl0aG9uICovCisgICAgYXJncyA9IChhcmdsaXN0ICopYXJnbDsKKyAgICBhcmdzLT5ydW5uaW5nID0gMTsKKyAgICBQeXRob25SQyA9IFB5X01haW4oYXJncy0+YXJnYywgYXJncy0+YXJndik7CiAKLQkvKiBlbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIHNlbmQgdGhlIHRlcm1pbmF0aW9uIG1lc3NhZ2UgKi8KLQlEb3NFbnRlckNyaXRTZWMoKTsKLQlhcmdzLT5ydW5uaW5nID0gMDsKLQlXaW5Qb3N0TXNnKGFyZ3MtPkZyYW1lLCBXTV9RVUlULCBOVUxMLCBOVUxMKTsKKyAgICAvKiBlbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIHNlbmQgdGhlIHRlcm1pbmF0aW9uIG1lc3NhZ2UgKi8KKyAgICBEb3NFbnRlckNyaXRTZWMoKTsKKyAgICBhcmdzLT5ydW5uaW5nID0gMDsKKyAgICBXaW5Qb3N0TXNnKGFyZ3MtPkZyYW1lLCBXTV9RVUlULCBOVUxMLCBOVUxMKTsKIAotCS8qIHNodXRkb3duIFBNIGFuZCB0ZXJtaW5hdGUgdGhyZWFkICovCi0JV2luVGVybWluYXRlKGhhYik7Ci0JX2VuZHRocmVhZCgpOworICAgIC8qIHNodXRkb3duIFBNIGFuZCB0ZXJtaW5hdGUgdGhyZWFkICovCisgICAgV2luVGVybWluYXRlKGhhYik7CisgICAgX2VuZHRocmVhZCgpOwogfQpkaWZmIC0tZ2l0IGEvUEMvb3MydmFjcHAvZ2V0cGF0aHAuYyBiL1BDL29zMnZhY3BwL2dldHBhdGhwLmMKaW5kZXggNjA3ZjJhMS4uNWJjMjgyNyAxMDA2NDQKLS0tIGEvUEMvb3MydmFjcHAvZ2V0cGF0aHAuYworKysgYi9QQy9vczJ2YWNwcC9nZXRwYXRocC5jCkBAIC01NSwxMiArNTUsMTIgQEAKIAogCiBzdGF0aWMgaW50Ci1pc19zZXAoY2hhciBjaCkJLyogZGV0ZXJtaW5lIGlmICJjaCIgaXMgYSBzZXBhcmF0b3IgY2hhcmFjdGVyICovCitpc19zZXAoY2hhciBjaCkgLyogZGV0ZXJtaW5lIGlmICJjaCIgaXMgYSBzZXBhcmF0b3IgY2hhcmFjdGVyICovCiB7CiAjaWZkZWYgQUxUU0VQCi0JcmV0dXJuIGNoID09IFNFUCB8fCBjaCA9PSBBTFRTRVA7CisgICAgcmV0dXJuIGNoID09IFNFUCB8fCBjaCA9PSBBTFRTRVA7CiAjZWxzZQotCXJldHVybiBjaCA9PSBTRVA7CisgICAgcmV0dXJuIGNoID09IFNFUDsKICNlbmRpZgogfQogCkBAIC02OCwxOCArNjgsMTggQEAKIHN0YXRpYyB2b2lkCiByZWR1Y2UoY2hhciAqZGlyKQogewotCWludCBpID0gc3RybGVuKGRpcik7Ci0Jd2hpbGUgKGkgPiAwICYmICFpc19zZXAoZGlyW2ldKSkKLQkJLS1pOwotCWRpcltpXSA9ICdcMCc7CisgICAgaW50IGkgPSBzdHJsZW4oZGlyKTsKKyAgICB3aGlsZSAoaSA+IDAgJiYgIWlzX3NlcChkaXJbaV0pKQorICAgICAgICAtLWk7CisgICAgZGlyW2ldID0gJ1wwJzsKIH0KLQkKKwogCiBzdGF0aWMgaW50CiBleGlzdHMoY2hhciAqZmlsZW5hbWUpCiB7Ci0Jc3RydWN0IHN0YXQgYnVmOwotCXJldHVybiBzdGF0KGZpbGVuYW1lLCAmYnVmKSA9PSAwOworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICByZXR1cm4gc3RhdChmaWxlbmFtZSwgJmJ1ZikgPT0gMDsKIH0KIAogCkBAIC05NSw0MiArOTUsNDIgQEAKIHN0YXRpYyB2b2lkCiBqb2luKGNoYXIgKmJ1ZmZlciwgY2hhciAqc3R1ZmYpCiB7Ci0JaW50IG4sIGs7Ci0JaWYgKGlzX3NlcChzdHVmZlswXSkpCi0JCW4gPSAwOwotCWVsc2UgewotCQluID0gc3RybGVuKGJ1ZmZlcik7Ci0JCWlmIChuID4gMCAmJiAhaXNfc2VwKGJ1ZmZlcltuLTFdKSAmJiBuIDwgTUFYUEFUSExFTikKLQkJCWJ1ZmZlcltuKytdID0gU0VQOwotCX0KLQlpZiAobiA+IE1BWFBBVEhMRU4pCi0JCVB5X0ZhdGFsRXJyb3IoImJ1ZmZlciBvdmVyZmxvdyBpbiBnZXRwYXRocC5jJ3Mgam9pbnBhdGgoKSIpOwotCWsgPSBzdHJsZW4oc3R1ZmYpOwotCWlmIChuICsgayA+IE1BWFBBVEhMRU4pCi0JCWsgPSBNQVhQQVRITEVOIC0gbjsKLQlzdHJuY3B5KGJ1ZmZlcituLCBzdHVmZiwgayk7Ci0JYnVmZmVyW24ra10gPSAnXDAnOworICAgIGludCBuLCBrOworICAgIGlmIChpc19zZXAoc3R1ZmZbMF0pKQorICAgICAgICBuID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgbiA9IHN0cmxlbihidWZmZXIpOworICAgICAgICBpZiAobiA+IDAgJiYgIWlzX3NlcChidWZmZXJbbi0xXSkgJiYgbiA8IE1BWFBBVEhMRU4pCisgICAgICAgICAgICBidWZmZXJbbisrXSA9IFNFUDsKKyAgICB9CisgICAgaWYgKG4gPiBNQVhQQVRITEVOKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJidWZmZXIgb3ZlcmZsb3cgaW4gZ2V0cGF0aHAuYydzIGpvaW5wYXRoKCkiKTsKKyAgICBrID0gc3RybGVuKHN0dWZmKTsKKyAgICBpZiAobiArIGsgPiBNQVhQQVRITEVOKQorICAgICAgICBrID0gTUFYUEFUSExFTiAtIG47CisgICAgc3RybmNweShidWZmZXIrbiwgc3R1ZmYsIGspOworICAgIGJ1ZmZlcltuK2tdID0gJ1wwJzsKIH0KIAogCiBzdGF0aWMgaW50CiBzZWFyY2hfZm9yX3ByZWZpeChjaGFyICphcmd2MF9wYXRoLCBjaGFyICpsYW5kbWFyaykKIHsKLQlpbnQgbjsKKyAgICBpbnQgbjsKIAotCS8qIFNlYXJjaCBmcm9tIGFyZ3YwX3BhdGgsIHVudGlsIHJvb3QgaXMgZm91bmQgKi8KLQlzdHJjcHkocHJlZml4LCBhcmd2MF9wYXRoKTsKLQlkbyB7Ci0JCW4gPSBzdHJsZW4ocHJlZml4KTsKLQkJam9pbihwcmVmaXgsIGxhbmRtYXJrKTsKLQkJaWYgKGV4aXN0cyhwcmVmaXgpKSB7Ci0JCQlwcmVmaXhbbl0gPSAnXDAnOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcHJlZml4W25dID0gJ1wwJzsKLQkJcmVkdWNlKHByZWZpeCk7Ci0JfSB3aGlsZSAocHJlZml4WzBdKTsKLQlyZXR1cm4gMDsKKyAgICAvKiBTZWFyY2ggZnJvbSBhcmd2MF9wYXRoLCB1bnRpbCByb290IGlzIGZvdW5kICovCisgICAgc3RyY3B5KHByZWZpeCwgYXJndjBfcGF0aCk7CisgICAgZG8geworICAgICAgICBuID0gc3RybGVuKHByZWZpeCk7CisgICAgICAgIGpvaW4ocHJlZml4LCBsYW5kbWFyayk7CisgICAgICAgIGlmIChleGlzdHMocHJlZml4KSkgeworICAgICAgICAgICAgcHJlZml4W25dID0gJ1wwJzsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHByZWZpeFtuXSA9ICdcMCc7CisgICAgICAgIHJlZHVjZShwcmVmaXgpOworICAgIH0gd2hpbGUgKHByZWZpeFswXSk7CisgICAgcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBNU19XSU4zMgpAQCAtMTQ3LDI5OSArMTQ3LDI5OSBAQAogc3RhdGljIGNoYXIgKgogZ2V0cHl0aG9ucmVncGF0aChIS0VZIGtleUJhc2UsIEJPT0wgYldpbjMycykKIHsKLQlIS0VZIG5ld0tleSA9IDA7Ci0JRFdPUkQgbmFtZVNpemUgPSAwOwotCURXT1JEIGRhdGFTaXplID0gMDsKLQlEV09SRCBudW1FbnRyaWVzID0gMDsKLQlMT05HIHJjOwotCWNoYXIgKnJldHZhbCA9IE5VTEw7Ci0JY2hhciAqZGF0YUJ1ZjsKLQljb25zdCBjaGFyIGtleVByZWZpeFtdID0gIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCI7Ci0JY29uc3QgY2hhciBrZXlTdWZmaXhbXSA9ICJcXFB5dGhvblBhdGgiOwotCWludCB2ZXJzaW9uTGVuOwotCWNoYXIgKmtleUJ1ZjsKKyAgICBIS0VZIG5ld0tleSA9IDA7CisgICAgRFdPUkQgbmFtZVNpemUgPSAwOworICAgIERXT1JEIGRhdGFTaXplID0gMDsKKyAgICBEV09SRCBudW1FbnRyaWVzID0gMDsKKyAgICBMT05HIHJjOworICAgIGNoYXIgKnJldHZhbCA9IE5VTEw7CisgICAgY2hhciAqZGF0YUJ1ZjsKKyAgICBjb25zdCBjaGFyIGtleVByZWZpeFtdID0gIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCI7CisgICAgY29uc3QgY2hhciBrZXlTdWZmaXhbXSA9ICJcXFB5dGhvblBhdGgiOworICAgIGludCB2ZXJzaW9uTGVuOworICAgIGNoYXIgKmtleUJ1ZjsKIAotCS8vIFRyaWVkIHRvIHVzZSBzeXNnZXQoIndpbnZlciIpIGJ1dCBoZXJlIGlzIHRvbyBlYXJseSA6LSgKLQl2ZXJzaW9uTGVuID0gc3RybGVuKFB5V2luX0RMTFZlcnNpb25TdHJpbmcpOwotCS8vIGFsbG9jYSA9PSBubyBmcmVlIHJlcXVpcmVkLCBidXQgbWVtb3J5IG9ubHkgbG9jYWwgdG8gZm4uCi0JLy8gYWxzbyBubyBoZWFwIGZyYWdtZW50YXRpb24hICBBbSBJIGJlaW5nIHNpbGx5PwotCWtleUJ1ZiA9IGFsbG9jYShzaXplb2Yoa2V5UHJlZml4KS0xICsgdmVyc2lvbkxlbiArIHNpemVvZihrZXlTdWZmaXgpKTsgLy8gY2hhcnMgb25seSwgcGx1cyAxIE5VTEwuCi0JLy8gbG90cyBvZiBjb25zdGFudHMgaGVyZSBmb3IgdGhlIGNvbXBpbGVyIHRvIG9wdGltaXplIGF3YXkgOi0pCi0JbWVtY3B5KGtleUJ1Ziwga2V5UHJlZml4LCBzaXplb2Yoa2V5UHJlZml4KS0xKTsKLQltZW1jcHkoa2V5QnVmK3NpemVvZihrZXlQcmVmaXgpLTEsIFB5V2luX0RMTFZlcnNpb25TdHJpbmcsIHZlcnNpb25MZW4pOwotCW1lbWNweShrZXlCdWYrc2l6ZW9mKGtleVByZWZpeCktMSt2ZXJzaW9uTGVuLCBrZXlTdWZmaXgsIHNpemVvZihrZXlTdWZmaXgpKTsgLy8gTlVMTCBjb21lcyB3aXRoIHRoaXMgb25lIQorICAgIC8vIFRyaWVkIHRvIHVzZSBzeXNnZXQoIndpbnZlciIpIGJ1dCBoZXJlIGlzIHRvbyBlYXJseSA6LSgKKyAgICB2ZXJzaW9uTGVuID0gc3RybGVuKFB5V2luX0RMTFZlcnNpb25TdHJpbmcpOworICAgIC8vIGFsbG9jYSA9PSBubyBmcmVlIHJlcXVpcmVkLCBidXQgbWVtb3J5IG9ubHkgbG9jYWwgdG8gZm4uCisgICAgLy8gYWxzbyBubyBoZWFwIGZyYWdtZW50YXRpb24hICBBbSBJIGJlaW5nIHNpbGx5PworICAgIGtleUJ1ZiA9IGFsbG9jYShzaXplb2Yoa2V5UHJlZml4KS0xICsgdmVyc2lvbkxlbiArIHNpemVvZihrZXlTdWZmaXgpKTsgLy8gY2hhcnMgb25seSwgcGx1cyAxIE5VTEwuCisgICAgLy8gbG90cyBvZiBjb25zdGFudHMgaGVyZSBmb3IgdGhlIGNvbXBpbGVyIHRvIG9wdGltaXplIGF3YXkgOi0pCisgICAgbWVtY3B5KGtleUJ1Ziwga2V5UHJlZml4LCBzaXplb2Yoa2V5UHJlZml4KS0xKTsKKyAgICBtZW1jcHkoa2V5QnVmK3NpemVvZihrZXlQcmVmaXgpLTEsIFB5V2luX0RMTFZlcnNpb25TdHJpbmcsIHZlcnNpb25MZW4pOworICAgIG1lbWNweShrZXlCdWYrc2l6ZW9mKGtleVByZWZpeCktMSt2ZXJzaW9uTGVuLCBrZXlTdWZmaXgsIHNpemVvZihrZXlTdWZmaXgpKTsgLy8gTlVMTCBjb21lcyB3aXRoIHRoaXMgb25lIQogCi0JcmM9UmVnT3BlbktleShrZXlCYXNlLAotCQkgICAgICBrZXlCdWYsCi0JCSAgICAgICZuZXdLZXkpOwotCWlmIChyYz09RVJST1JfU1VDQ0VTUykgewotCQlSZWdRdWVyeUluZm9LZXkobmV3S2V5LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKLQkJICAgICAgICAgICAgICAgICZudW1FbnRyaWVzLCAmbmFtZVNpemUsICZkYXRhU2l6ZSwgTlVMTCwgTlVMTCk7Ci0JfQotCWlmIChiV2luMzJzICYmIG51bUVudHJpZXM9PTAgJiYgZGF0YVNpemU9PTApIHsKLQkJLyogbXVzdCBoYXJkY29kZSBmb3IgV2luMzJzICovCi0JCW51bUVudHJpZXMgPSAxOwotCQlkYXRhU2l6ZSA9IDUxMTsKLQl9Ci0JaWYgKG51bUVudHJpZXMpIHsKLQkJLyogTG9vcCBvdmVyIGFsbCBzdWJrZXlzLiAqLwotCQkvKiBXaW4zMnMgZG9lc250IGtub3cgaG93IG1hbnkgc3Via2V5cywgc28gd2UgZG8KLQkJICAgaXQgdHdpY2UgKi8KLQkJY2hhciBrZXlCdWZbTUFYX1BBVEgrMV07Ci0JCWludCBpbmRleCA9IDA7Ci0JCWludCBvZmYgPSAwOwotCQlmb3IoaW5kZXg9MDs7aW5kZXgrKykgewotCQkJbG9uZyByZXFkU2l6ZSA9IDA7Ci0JCQlEV09SRCByYyA9IFJlZ0VudW1LZXkobmV3S2V5LAotCQkJCQkgICAgICBpbmRleCwga2V5QnVmLCBNQVhfUEFUSCsxKTsKLQkJCWlmIChyYykgYnJlYWs7Ci0JCQlyYyA9IFJlZ1F1ZXJ5VmFsdWUobmV3S2V5LCBrZXlCdWYsIE5VTEwsICZyZXFkU2l6ZSk7Ci0JCQlpZiAocmMpIGJyZWFrOwotCQkJaWYgKGJXaW4zMnMgJiYgcmVxZFNpemU9PTApIHJlcWRTaXplID0gNTEyOwotCQkJZGF0YVNpemUgKz0gcmVxZFNpemUgKyAxOyAvKiAxIGZvciB0aGUgIjsiICovCi0JCX0KLQkJZGF0YUJ1ZiA9IG1hbGxvYyhkYXRhU2l6ZSsxKTsKLQkJaWYgKGRhdGFCdWY9PU5VTEwpCi0JCQlyZXR1cm4gTlVMTDsgLyogcHJldHR5IHNlcmlvdXM/ICBSYWlzZSBlcnJvcj8gKi8KLQkJLyogTm93IGxvb3Agb3ZlciwgZ3JhYmJpbmcgdGhlIHBhdGhzLgotCQkgICBTdWJrZXlzIGJlZm9yZSBtYWluIGxpYnJhcnkgKi8KLQkJZm9yKGluZGV4PTA7O2luZGV4KyspIHsKLQkJCWludCBhZGp1c3Q7Ci0JCQlsb25nIHJlcWRTaXplID0gZGF0YVNpemU7Ci0JCQlEV09SRCByYyA9IFJlZ0VudW1LZXkobmV3S2V5LAotCQkJCQkgICAgICBpbmRleCwga2V5QnVmLE1BWF9QQVRIKzEpOwotCQkJaWYgKHJjKSBicmVhazsKLQkJCXJjID0gUmVnUXVlcnlWYWx1ZShuZXdLZXksCi0JCQkJCSAgIGtleUJ1ZiwgZGF0YUJ1ZitvZmYsICZyZXFkU2l6ZSk7Ci0JCQlpZiAocmMpIGJyZWFrOwotCQkJaWYgKHJlcWRTaXplPjEpIHsKLQkJCQkvKiBJZiBOb3RoaW5nLCBvciBvbmx5ICdcMCcgY29waWVkLiAqLwotCQkJCWFkanVzdCA9IHN0cmxlbihkYXRhQnVmK29mZik7Ci0JCQkJZGF0YVNpemUgLT0gYWRqdXN0OwotCQkJCW9mZiArPSBhZGp1c3Q7Ci0JCQkJZGF0YUJ1ZltvZmYrK10gPSAnOyc7Ci0JCQkJZGF0YUJ1ZltvZmZdID0gJ1wwJzsKLQkJCQlkYXRhU2l6ZS0tOwotCQkJfQotCQl9Ci0JCS8qIEFkZGl0aW9uYWxseSwgd2luMzJzIGRvZXNudCB3b3JrIGFzIGV4cGVjdGVkLCBzbwotCQkgICB0aGUgc3BlY2lmaWMgc3RybGVuKCkgaXMgcmVxdWlyZWQgZm9yIDMuMS4gKi8KLQkJcmMgPSBSZWdRdWVyeVZhbHVlKG5ld0tleSwgIiIsIGRhdGFCdWYrb2ZmLCAmZGF0YVNpemUpOwotCQlpZiAocmM9PUVSUk9SX1NVQ0NFU1MpIHsKLQkJCWlmIChzdHJsZW4oZGF0YUJ1Zik9PTApCi0JCQkJZnJlZShkYXRhQnVmKTsKLQkJCWVsc2UKLQkJCQlyZXR2YWwgPSBkYXRhQnVmOyAvKiBjYWxsZXIgd2lsbCBmcmVlICovCi0JCX0KLQkJZWxzZQotCQkJZnJlZShkYXRhQnVmKTsKLQl9CisgICAgcmM9UmVnT3BlbktleShrZXlCYXNlLAorICAgICAgICAgICAgICAgICAga2V5QnVmLAorICAgICAgICAgICAgICAgICAgJm5ld0tleSk7CisgICAgaWYgKHJjPT1FUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIFJlZ1F1ZXJ5SW5mb0tleShuZXdLZXksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRW50cmllcywgJm5hbWVTaXplLCAmZGF0YVNpemUsIE5VTEwsIE5VTEwpOworICAgIH0KKyAgICBpZiAoYldpbjMycyAmJiBudW1FbnRyaWVzPT0wICYmIGRhdGFTaXplPT0wKSB7CisgICAgICAgIC8qIG11c3QgaGFyZGNvZGUgZm9yIFdpbjMycyAqLworICAgICAgICBudW1FbnRyaWVzID0gMTsKKyAgICAgICAgZGF0YVNpemUgPSA1MTE7CisgICAgfQorICAgIGlmIChudW1FbnRyaWVzKSB7CisgICAgICAgIC8qIExvb3Agb3ZlciBhbGwgc3Via2V5cy4gKi8KKyAgICAgICAgLyogV2luMzJzIGRvZXNudCBrbm93IGhvdyBtYW55IHN1YmtleXMsIHNvIHdlIGRvCisgICAgICAgICAgIGl0IHR3aWNlICovCisgICAgICAgIGNoYXIga2V5QnVmW01BWF9QQVRIKzFdOworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgb2ZmID0gMDsKKyAgICAgICAgZm9yKGluZGV4PTA7O2luZGV4KyspIHsKKyAgICAgICAgICAgIGxvbmcgcmVxZFNpemUgPSAwOworICAgICAgICAgICAgRFdPUkQgcmMgPSBSZWdFbnVtS2V5KG5ld0tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwga2V5QnVmLCBNQVhfUEFUSCsxKTsKKyAgICAgICAgICAgIGlmIChyYykgYnJlYWs7CisgICAgICAgICAgICByYyA9IFJlZ1F1ZXJ5VmFsdWUobmV3S2V5LCBrZXlCdWYsIE5VTEwsICZyZXFkU2l6ZSk7CisgICAgICAgICAgICBpZiAocmMpIGJyZWFrOworICAgICAgICAgICAgaWYgKGJXaW4zMnMgJiYgcmVxZFNpemU9PTApIHJlcWRTaXplID0gNTEyOworICAgICAgICAgICAgZGF0YVNpemUgKz0gcmVxZFNpemUgKyAxOyAvKiAxIGZvciB0aGUgIjsiICovCisgICAgICAgIH0KKyAgICAgICAgZGF0YUJ1ZiA9IG1hbGxvYyhkYXRhU2l6ZSsxKTsKKyAgICAgICAgaWYgKGRhdGFCdWY9PU5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgLyogcHJldHR5IHNlcmlvdXM/ICBSYWlzZSBlcnJvcj8gKi8KKyAgICAgICAgLyogTm93IGxvb3Agb3ZlciwgZ3JhYmJpbmcgdGhlIHBhdGhzLgorICAgICAgICAgICBTdWJrZXlzIGJlZm9yZSBtYWluIGxpYnJhcnkgKi8KKyAgICAgICAgZm9yKGluZGV4PTA7O2luZGV4KyspIHsKKyAgICAgICAgICAgIGludCBhZGp1c3Q7CisgICAgICAgICAgICBsb25nIHJlcWRTaXplID0gZGF0YVNpemU7CisgICAgICAgICAgICBEV09SRCByYyA9IFJlZ0VudW1LZXkobmV3S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBrZXlCdWYsTUFYX1BBVEgrMSk7CisgICAgICAgICAgICBpZiAocmMpIGJyZWFrOworICAgICAgICAgICAgcmMgPSBSZWdRdWVyeVZhbHVlKG5ld0tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlCdWYsIGRhdGFCdWYrb2ZmLCAmcmVxZFNpemUpOworICAgICAgICAgICAgaWYgKHJjKSBicmVhazsKKyAgICAgICAgICAgIGlmIChyZXFkU2l6ZT4xKSB7CisgICAgICAgICAgICAgICAgLyogSWYgTm90aGluZywgb3Igb25seSAnXDAnIGNvcGllZC4gKi8KKyAgICAgICAgICAgICAgICBhZGp1c3QgPSBzdHJsZW4oZGF0YUJ1ZitvZmYpOworICAgICAgICAgICAgICAgIGRhdGFTaXplIC09IGFkanVzdDsKKyAgICAgICAgICAgICAgICBvZmYgKz0gYWRqdXN0OworICAgICAgICAgICAgICAgIGRhdGFCdWZbb2ZmKytdID0gJzsnOworICAgICAgICAgICAgICAgIGRhdGFCdWZbb2ZmXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgZGF0YVNpemUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBBZGRpdGlvbmFsbHksIHdpbjMycyBkb2VzbnQgd29yayBhcyBleHBlY3RlZCwgc28KKyAgICAgICAgICAgdGhlIHNwZWNpZmljIHN0cmxlbigpIGlzIHJlcXVpcmVkIGZvciAzLjEuICovCisgICAgICAgIHJjID0gUmVnUXVlcnlWYWx1ZShuZXdLZXksICIiLCBkYXRhQnVmK29mZiwgJmRhdGFTaXplKTsKKyAgICAgICAgaWYgKHJjPT1FUlJPUl9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAoc3RybGVuKGRhdGFCdWYpPT0wKQorICAgICAgICAgICAgICAgIGZyZWUoZGF0YUJ1Zik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dmFsID0gZGF0YUJ1ZjsgLyogY2FsbGVyIHdpbGwgZnJlZSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZyZWUoZGF0YUJ1Zik7CisgICAgfQogCi0JaWYgKG5ld0tleSkKLQkJUmVnQ2xvc2VLZXkobmV3S2V5KTsKLQlyZXR1cm4gcmV0dmFsOworICAgIGlmIChuZXdLZXkpCisgICAgICAgIFJlZ0Nsb3NlS2V5KG5ld0tleSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KICNlbmRpZiAvKiBNU19XSU4zMiAqLwogCiBzdGF0aWMgdm9pZAogZ2V0X3Byb2dwYXRoKHZvaWQpCiB7Ci0JZXh0ZXJuIGNoYXIgKlB5X0dldFByb2dyYW1OYW1lKHZvaWQpOwotCWNoYXIgKnBhdGggPSBnZXRlbnYoIlBBVEgiKTsKLQljaGFyICpwcm9nID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKKyAgICBleHRlcm4gY2hhciAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7CisgICAgY2hhciAqcGF0aCA9IGdldGVudigiUEFUSCIpOworICAgIGNoYXIgKnByb2cgPSBQeV9HZXRQcm9ncmFtTmFtZSgpOwogCiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pKQotCQlyZXR1cm47CisgICAgaWYgKEdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIHByb2dwYXRoLCBNQVhQQVRITEVOKSkKKyAgICAgICAgcmV0dXJuOwogI2VuZGlmCi0JaWYgKHByb2cgPT0gTlVMTCB8fCAqcHJvZyA9PSAnXDAnKQotCQlwcm9nID0gInB5dGhvbiI7CisgICAgaWYgKHByb2cgPT0gTlVMTCB8fCAqcHJvZyA9PSAnXDAnKQorICAgICAgICBwcm9nID0gInB5dGhvbiI7CiAKLQkvKiBJZiB0aGVyZSBpcyBubyBzbGFzaCBpbiB0aGUgYXJndjAgcGF0aCwgdGhlbiB3ZSBoYXZlIHRvCi0JICogYXNzdW1lIHB5dGhvbiBpcyBvbiB0aGUgdXNlcidzICRQQVRILCBzaW5jZSB0aGVyZSdzIG5vCi0JICogb3RoZXIgd2F5IHRvIGZpbmQgYSBkaXJlY3RvcnkgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLiAgSWYKLQkgKiAkUEFUSCBpc24ndCBleHBvcnRlZCwgeW91IGxvc2UuCi0JICovCisgICAgLyogSWYgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIGFyZ3YwIHBhdGgsIHRoZW4gd2UgaGF2ZSB0bworICAgICAqIGFzc3VtZSBweXRob24gaXMgb24gdGhlIHVzZXIncyAkUEFUSCwgc2luY2UgdGhlcmUncyBubworICAgICAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCisgICAgICogJFBBVEggaXNuJ3QgZXhwb3J0ZWQsIHlvdSBsb3NlLgorICAgICAqLwogI2lmZGVmIEFMVFNFUAotCWlmIChzdHJjaHIocHJvZywgU0VQKSB8fCBzdHJjaHIocHJvZywgQUxUU0VQKSkKKyAgICBpZiAoc3RyY2hyKHByb2csIFNFUCkgfHwgc3RyY2hyKHByb2csIEFMVFNFUCkpCiAjZWxzZQotCWlmIChzdHJjaHIocHJvZywgU0VQKSkKKyAgICBpZiAoc3RyY2hyKHByb2csIFNFUCkpCiAjZW5kaWYKLQkJc3RyY3B5KHByb2dwYXRoLCBwcm9nKTsKLQllbHNlIGlmIChwYXRoKSB7Ci0JCXdoaWxlICgxKSB7Ci0JCQljaGFyICpkZWxpbSA9IHN0cmNocihwYXRoLCBERUxJTSk7CisgICAgICAgIHN0cmNweShwcm9ncGF0aCwgcHJvZyk7CisgICAgZWxzZSBpZiAocGF0aCkgeworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgY2hhciAqZGVsaW0gPSBzdHJjaHIocGF0aCwgREVMSU0pOwogCi0JCQlpZiAoZGVsaW0pIHsKLQkJCQlpbnQgbGVuID0gZGVsaW0gLSBwYXRoOwotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7Ci0JCQkJKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOwotCQkJfQotCQkJZWxzZQotCQkJCXN0cmNweShwcm9ncGF0aCwgcGF0aCk7CisgICAgICAgICAgICBpZiAoZGVsaW0pIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gZGVsaW0gLSBwYXRoOworICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7CisgICAgICAgICAgICAgICAgKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0cmNweShwcm9ncGF0aCwgcGF0aCk7CiAKLQkJCWpvaW4ocHJvZ3BhdGgsIHByb2cpOwotCQkJaWYgKGV4aXN0cyhwcm9ncGF0aCkpCi0JCQkJYnJlYWs7CisgICAgICAgICAgICBqb2luKHByb2dwYXRoLCBwcm9nKTsKKyAgICAgICAgICAgIGlmIChleGlzdHMocHJvZ3BhdGgpKQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQlpZiAoIWRlbGltKSB7Ci0JCQkJcHJvZ3BhdGhbMF0gPSAnXDAnOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcGF0aCA9IGRlbGltICsgMTsKLQkJfQotCX0KLQllbHNlCi0JCXByb2dwYXRoWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIGlmICghZGVsaW0pIHsKKyAgICAgICAgICAgICAgICBwcm9ncGF0aFswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRoID0gZGVsaW0gKyAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcHJvZ3BhdGhbMF0gPSAnXDAnOwogfQogCiBzdGF0aWMgdm9pZAogY2FsY3VsYXRlX3BhdGgodm9pZCkKIHsKLQljaGFyIGFyZ3YwX3BhdGhbTUFYUEFUSExFTisxXTsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnN6OwotCWNoYXIgKnB5dGhvbmhvbWUgPSBQeV9HZXRQeXRob25Ib21lKCk7Ci0JY2hhciAqZW52cGF0aCA9IFB5X0dFVEVOVigiUFlUSE9OUEFUSCIpOworICAgIGNoYXIgYXJndjBfcGF0aFtNQVhQQVRITEVOKzFdOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgYnVmc3o7CisgICAgY2hhciAqcHl0aG9uaG9tZSA9IFB5X0dldFB5dGhvbkhvbWUoKTsKKyAgICBjaGFyICplbnZwYXRoID0gUHlfR0VURU5WKCJQWVRIT05QQVRIIik7CiAjaWZkZWYgTVNfV0lOMzIKLQljaGFyICptYWNoaW5lcGF0aCwgKnVzZXJwYXRoOworICAgIGNoYXIgKm1hY2hpbmVwYXRoLCAqdXNlcnBhdGg7CiAKLQkvKiBBcmUgd2UgcnVubmluZyB1bmRlciBXaW5kb3dzIDMuMSgxKSBXaW4zMnM/ICovCi0JaWYgKFB5V2luX0lzV2luMzJzKCkpIHsKLQkJLyogT25seSBDTEFTU0VTX1JPT1QgaXMgc3VwcG9ydGVkICovCi0JCW1hY2hpbmVwYXRoID0gZ2V0cHl0aG9ucmVncGF0aChIS0VZX0NMQVNTRVNfUk9PVCwgVFJVRSk7IAotCQl1c2VycGF0aCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJbWFjaGluZXBhdGggPSBnZXRweXRob25yZWdwYXRoKEhLRVlfTE9DQUxfTUFDSElORSwgRkFMU0UpOwotCQl1c2VycGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9DVVJSRU5UX1VTRVIsIEZBTFNFKTsKLQl9CisgICAgLyogQXJlIHdlIHJ1bm5pbmcgdW5kZXIgV2luZG93cyAzLjEoMSkgV2luMzJzPyAqLworICAgIGlmIChQeVdpbl9Jc1dpbjMycygpKSB7CisgICAgICAgIC8qIE9ubHkgQ0xBU1NFU19ST09UIGlzIHN1cHBvcnRlZCAqLworICAgICAgICBtYWNoaW5lcGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9DTEFTU0VTX1JPT1QsIFRSVUUpOworICAgICAgICB1c2VycGF0aCA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWFjaGluZXBhdGggPSBnZXRweXRob25yZWdwYXRoKEhLRVlfTE9DQUxfTUFDSElORSwgRkFMU0UpOworICAgICAgICB1c2VycGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9DVVJSRU5UX1VTRVIsIEZBTFNFKTsKKyAgICB9CiAjZW5kaWYKIAotCWdldF9wcm9ncGF0aCgpOwotCXN0cmNweShhcmd2MF9wYXRoLCBwcm9ncGF0aCk7Ci0JcmVkdWNlKGFyZ3YwX3BhdGgpOwotCWlmIChweXRob25ob21lID09IE5VTEwgfHwgKnB5dGhvbmhvbWUgPT0gJ1wwJykgewotCQlpZiAoc2VhcmNoX2Zvcl9wcmVmaXgoYXJndjBfcGF0aCwgTEFORE1BUkspKQotCQkJcHl0aG9uaG9tZSA9IHByZWZpeDsKLQkJZWxzZQotCQkJcHl0aG9uaG9tZSA9IE5VTEw7Ci0JfQotCWVsc2UgewotICAgICAgICBjaGFyICpkZWxpbTsKKyAgICBnZXRfcHJvZ3BhdGgoKTsKKyAgICBzdHJjcHkoYXJndjBfcGF0aCwgcHJvZ3BhdGgpOworICAgIHJlZHVjZShhcmd2MF9wYXRoKTsKKyAgICBpZiAocHl0aG9uaG9tZSA9PSBOVUxMIHx8ICpweXRob25ob21lID09ICdcMCcpIHsKKyAgICAgICAgaWYgKHNlYXJjaF9mb3JfcHJlZml4KGFyZ3YwX3BhdGgsIExBTkRNQVJLKSkKKyAgICAgICAgICAgIHB5dGhvbmhvbWUgPSBwcmVmaXg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHB5dGhvbmhvbWUgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICBjaGFyICpkZWxpbTsKIAotCQlzdHJjcHkocHJlZml4LCBweXRob25ob21lKTsKKyAgICAgICAgc3RyY3B5KHByZWZpeCwgcHl0aG9uaG9tZSk7CiAKLSAgICAgICAgLyogRXh0cmFjdCBBbnkgT3B0aW9uYWwgVHJhaWxpbmcgRVhFQ19QUkVGSVggKi8KLSAgICAgICAgLyogZS5nLiBQWVRIT05IT01FPTxwcmVmaXg+OjxleGVjX3ByZWZpeD4gICAqLwotICAgICAgICBkZWxpbSA9IHN0cmNocihwcmVmaXgsIERFTElNKTsKLSAgICAgICAgaWYgKGRlbGltKSB7Ci0gICAgICAgICAgICAqZGVsaW0gPSAnXDAnOwotICAgICAgICAgICAgc3RyY3B5KGV4ZWNfcHJlZml4LCBkZWxpbSsxKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzdHJjcHkoZXhlY19wcmVmaXgsIEVYRUNfUFJFRklYKTsKKyAgICAvKiBFeHRyYWN0IEFueSBPcHRpb25hbCBUcmFpbGluZyBFWEVDX1BSRUZJWCAqLworICAgIC8qIGUuZy4gUFlUSE9OSE9NRT08cHJlZml4Pjo8ZXhlY19wcmVmaXg+ICAgKi8KKyAgICBkZWxpbSA9IHN0cmNocihwcmVmaXgsIERFTElNKTsKKyAgICBpZiAoZGVsaW0pIHsKKyAgICAgICAgKmRlbGltID0gJ1wwJzsKKyAgICAgICAgc3RyY3B5KGV4ZWNfcHJlZml4LCBkZWxpbSsxKTsKKyAgICB9IGVsc2UKKyAgICAgICAgc3RyY3B5KGV4ZWNfcHJlZml4LCBFWEVDX1BSRUZJWCk7CiAgICAgfQogCi0JaWYgKGVudnBhdGggJiYgKmVudnBhdGggPT0gJ1wwJykKLQkJZW52cGF0aCA9IE5VTEw7CisgICAgaWYgKGVudnBhdGggJiYgKmVudnBhdGggPT0gJ1wwJykKKyAgICAgICAgZW52cGF0aCA9IE5VTEw7CiAKLQkvKiBXZSBuZWVkIHRvIGNvbnN0cnVjdCBhIHBhdGggZnJvbSB0aGUgZm9sbG93aW5nIHBhcnRzOgotCSAgICgxKSB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0OwotCSAgICgyKSBmb3IgV2luMzIsIHRoZSBtYWNoaW5lcGF0aCBhbmQgdXNlcnBhdGgsIGlmIHNldDsKLQkgICAoMykgdGhlIFBZVEhPTlBBVEggY29uZmlnIG1hY3JvLCB3aXRoIHRoZSBsZWFkaW5nICIuIgotCSAgICAgICBvZiBlYWNoIGNvbXBvbmVudCByZXBsYWNlZCB3aXRoIHB5dGhvbmhvbWUsIGlmIHNldDsKLQkgICAoNCkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIChhcmd2MF9wYXRoKS4KLQkgICBUaGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGNhbGN1bGF0ZXMgIzMgZmlyc3QuCi0JKi8KKyAgICAvKiBXZSBuZWVkIHRvIGNvbnN0cnVjdCBhIHBhdGggZnJvbSB0aGUgZm9sbG93aW5nIHBhcnRzOgorICAgICAgICgxKSB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0OworICAgICAgICgyKSBmb3IgV2luMzIsIHRoZSBtYWNoaW5lcGF0aCBhbmQgdXNlcnBhdGgsIGlmIHNldDsKKyAgICAgICAoMykgdGhlIFBZVEhPTlBBVEggY29uZmlnIG1hY3JvLCB3aXRoIHRoZSBsZWFkaW5nICIuIgorICAgICAgICAgICBvZiBlYWNoIGNvbXBvbmVudCByZXBsYWNlZCB3aXRoIHB5dGhvbmhvbWUsIGlmIHNldDsKKyAgICAgICAoNCkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIChhcmd2MF9wYXRoKS4KKyAgICAgICBUaGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGNhbGN1bGF0ZXMgIzMgZmlyc3QuCisgICAgKi8KIAotCS8qIENhbGN1bGF0ZSBzaXplIG9mIHJldHVybiBidWZmZXIgKi8KLQlpZiAocHl0aG9uaG9tZSAhPSBOVUxMKSB7Ci0JCWNoYXIgKnA7Ci0JCWJ1ZnN6ID0gMTsJCi0JCWZvciAocCA9IFBZVEhPTlBBVEg7ICpwOyBwKyspIHsKLQkJCWlmICgqcCA9PSBERUxJTSkKLQkJCQlidWZzeisrOyAvKiBudW1iZXIgb2YgREVMSU0gcGx1cyBvbmUgKi8KLQkJfQotCQlidWZzeiAqPSBzdHJsZW4ocHl0aG9uaG9tZSk7Ci0JfQotCWVsc2UKLQkJYnVmc3ogPSAwOwotCWJ1ZnN6ICs9IHN0cmxlbihQWVRIT05QQVRIKSArIDE7Ci0JaWYgKGVudnBhdGggIT0gTlVMTCkKLQkJYnVmc3ogKz0gc3RybGVuKGVudnBhdGgpICsgMTsKLQlidWZzeiArPSBzdHJsZW4oYXJndjBfcGF0aCkgKyAxOworICAgIC8qIENhbGN1bGF0ZSBzaXplIG9mIHJldHVybiBidWZmZXIgKi8KKyAgICBpZiAocHl0aG9uaG9tZSAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKnA7CisgICAgICAgIGJ1ZnN6ID0gMTsKKyAgICAgICAgZm9yIChwID0gUFlUSE9OUEFUSDsgKnA7IHArKykgeworICAgICAgICAgICAgaWYgKCpwID09IERFTElNKQorICAgICAgICAgICAgICAgIGJ1ZnN6Kys7IC8qIG51bWJlciBvZiBERUxJTSBwbHVzIG9uZSAqLworICAgICAgICB9CisgICAgICAgIGJ1ZnN6ICo9IHN0cmxlbihweXRob25ob21lKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBidWZzeiA9IDA7CisgICAgYnVmc3ogKz0gc3RybGVuKFBZVEhPTlBBVEgpICsgMTsKKyAgICBpZiAoZW52cGF0aCAhPSBOVUxMKQorICAgICAgICBidWZzeiArPSBzdHJsZW4oZW52cGF0aCkgKyAxOworICAgIGJ1ZnN6ICs9IHN0cmxlbihhcmd2MF9wYXRoKSArIDE7CiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAobWFjaGluZXBhdGgpCi0JCWJ1ZnN6ICs9IHN0cmxlbihtYWNoaW5lcGF0aCkgKyAxOwotCWlmICh1c2VycGF0aCkKLQkJYnVmc3ogKz0gc3RybGVuKHVzZXJwYXRoKSArIDE7CisgICAgaWYgKG1hY2hpbmVwYXRoKQorICAgICAgICBidWZzeiArPSBzdHJsZW4obWFjaGluZXBhdGgpICsgMTsKKyAgICBpZiAodXNlcnBhdGgpCisgICAgICAgIGJ1ZnN6ICs9IHN0cmxlbih1c2VycGF0aCkgKyAxOwogI2VuZGlmCiAKLQltb2R1bGVfc2VhcmNoX3BhdGggPSBidWYgPSBtYWxsb2MoYnVmc3opOwotCWlmIChidWYgPT0gTlVMTCkgewotCQkvKiBXZSBjYW4ndCBleGl0LCBzbyBwcmludCBhIHdhcm5pbmcgYW5kIGxpbXAgYWxvbmcgKi8KLQkJZnByaW50ZihzdGRlcnIsICJDYW4ndCBtYWxsb2MgZHluYW1pYyBQWVRIT05QQVRILlxuIik7Ci0JCWlmIChlbnZwYXRoKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGRlZmF1bHQgc3RhdGljICRQWVRIT05QQVRILlxuIik7Ci0JCQltb2R1bGVfc2VhcmNoX3BhdGggPSBlbnZwYXRoOwotCQl9Ci0JCWVsc2UgewotCQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBlbnZpcm9ubWVudCAkUFlUSE9OUEFUSC5cbiIpOwotCQkJbW9kdWxlX3NlYXJjaF9wYXRoID0gUFlUSE9OUEFUSDsKLQkJfQotCQlyZXR1cm47Ci0JfQorICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IGJ1ZiA9IG1hbGxvYyhidWZzeik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIC8qIFdlIGNhbid0IGV4aXQsIHNvIHByaW50IGEgd2FybmluZyBhbmQgbGltcCBhbG9uZyAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG1hbGxvYyBkeW5hbWljIFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgaWYgKGVudnBhdGgpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNpbmcgZGVmYXVsdCBzdGF0aWMgJFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IGVudnBhdGg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGVudmlyb25tZW50ICRQWVRIT05QQVRILlxuIik7CisgICAgICAgICAgICBtb2R1bGVfc2VhcmNoX3BhdGggPSBQWVRIT05QQVRIOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlpZiAoZW52cGF0aCkgewotCQlzdHJjcHkoYnVmLCBlbnZwYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JCSpidWYrKyA9IERFTElNOwotCX0KKyAgICBpZiAoZW52cGF0aCkgeworICAgICAgICBzdHJjcHkoYnVmLCBlbnZwYXRoKTsKKyAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgICAgICpidWYrKyA9IERFTElNOworICAgIH0KICNpZmRlZiBNU19XSU4zMgotCWlmIChtYWNoaW5lcGF0aCkgewotCQlzdHJjcHkoYnVmLCBtYWNoaW5lcGF0aCk7Ci0JCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkqYnVmKysgPSBERUxJTTsKLQl9Ci0JaWYgKHVzZXJwYXRoKSB7Ci0JCXN0cmNweShidWYsIHVzZXJwYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JCSpidWYrKyA9IERFTElNOwotCX0KKyAgICBpZiAobWFjaGluZXBhdGgpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgbWFjaGluZXBhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgfQorICAgIGlmICh1c2VycGF0aCkgeworICAgICAgICBzdHJjcHkoYnVmLCB1c2VycGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICB9CiAjZW5kaWYKLQlpZiAocHl0aG9uaG9tZSA9PSBOVUxMKSB7Ci0JCXN0cmNweShidWYsIFBZVEhPTlBBVEgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQl9Ci0JZWxzZSB7Ci0JCWNoYXIgKnAgPSBQWVRIT05QQVRIOwotCQljaGFyICpxOwotCQlpbnQgbjsKLQkJZm9yICg7OykgewotCQkJcSA9IHN0cmNocihwLCBERUxJTSk7Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCW4gPSBzdHJsZW4ocCk7Ci0JCQllbHNlCi0JCQkJbiA9IHEtcDsKLQkJCWlmIChwWzBdID09ICcuJyAmJiBpc19zZXAocFsxXSkpIHsKLQkJCQlzdHJjcHkoYnVmLCBweXRob25ob21lKTsKLQkJCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJCQlwKys7Ci0JCQkJbi0tOwotCQkJfQotCQkJc3RybmNweShidWYsIHAsIG4pOwotCQkJYnVmICs9IG47Ci0JCQlpZiAocSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJKmJ1ZisrID0gREVMSU07Ci0JCQlwID0gcSsxOwotCQl9Ci0JfQotCWlmIChhcmd2MF9wYXRoKSB7Ci0JCSpidWYrKyA9IERFTElNOwotCQlzdHJjcHkoYnVmLCBhcmd2MF9wYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JfQotCSpidWYgPSAnXDAnOworICAgIGlmIChweXRob25ob21lID09IE5VTEwpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2hhciAqcCA9IFBZVEhPTlBBVEg7CisgICAgICAgIGNoYXIgKnE7CisgICAgICAgIGludCBuOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBxID0gc3RyY2hyKHAsIERFTElNKTsKKyAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgbiA9IHN0cmxlbihwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuID0gcS1wOworICAgICAgICAgICAgaWYgKHBbMF0gPT0gJy4nICYmIGlzX3NlcChwWzFdKSkgeworICAgICAgICAgICAgICAgIHN0cmNweShidWYsIHB5dGhvbmhvbWUpOworICAgICAgICAgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBuLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJuY3B5KGJ1ZiwgcCwgbik7CisgICAgICAgICAgICBidWYgKz0gbjsKKyAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICAgICAgICAgIHAgPSBxKzE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZ3YwX3BhdGgpIHsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgICAgIHN0cmNweShidWYsIGFyZ3YwX3BhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICB9CisgICAgKmJ1ZiA9ICdcMCc7CiB9CiAKIApAQCAtNDQ4LDM1ICs0NDgsMzUgQEAKIGNoYXIgKgogUHlfR2V0UGF0aCh2b2lkKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOwogCi0JcmV0dXJuIG1vZHVsZV9zZWFyY2hfcGF0aDsKKyAgICByZXR1cm4gbW9kdWxlX3NlYXJjaF9wYXRoOwogfQogCiBjaGFyICoKIFB5X0dldFByZWZpeCh2b2lkKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOwogCi0JcmV0dXJuIHByZWZpeDsKKyAgICByZXR1cm4gcHJlZml4OwogfQogCiBjaGFyICoKIFB5X0dldEV4ZWNQcmVmaXgodm9pZCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKKyAgICBpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKKyAgICAgICAgY2FsY3VsYXRlX3BhdGgoKTsKIAotCXJldHVybiBleGVjX3ByZWZpeDsKKyAgICByZXR1cm4gZXhlY19wcmVmaXg7CiB9CiAKIGNoYXIgKgogUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKHZvaWQpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CiAKLQlyZXR1cm4gcHJvZ3BhdGg7CisgICAgcmV0dXJuIHByb2dwYXRoOwogfQpkaWZmIC0tZ2l0IGEvUEMvd2luc291bmQuYyBiL1BDL3dpbnNvdW5kLmMKaW5kZXggZTZmZjIyNi4uMDUzMDVkMiAxMDA2NDQKLS0tIGEvUEMvd2luc291bmQuYworKysgYi9QQy93aW5zb3VuZC5jCkBAIC03OCwxNCArNzgsMTQgQEAKICAgICBpbnQgb2s7CiAKICAgICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJ6I2k6UGxheVNvdW5kIiwmc291bmQsJmxlbmd0aCwmZmxhZ3MpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGlmKGZsYWdzJlNORF9BU1lOQyAmJiBmbGFncyAmU05EX01FTU9SWSkgewotCS8qIFNpZGVzdGVwIHJlZmVyZW5jZSBjb3VudGluZyBoZWFkYWNoZTsgdW5mb3J0dW5hdGVseSB0aGlzIGFsc28KLQkgICBwcmV2ZW50IFNORF9MT09QIGZyb20gbWVtb3J5LiAqLwotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCJDYW5ub3QgcGxheSBhc3luY2hyb25vdXNseSBmcm9tIG1lbW9yeSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBTaWRlc3RlcCByZWZlcmVuY2UgY291bnRpbmcgaGVhZGFjaGU7IHVuZm9ydHVuYXRlbHkgdGhpcyBhbHNvCisgICAgICAgcHJldmVudCBTTkRfTE9PUCBmcm9tIG1lbW9yeS4gKi8KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCJDYW5ub3QgcGxheSBhc3luY2hyb25vdXNseSBmcm9tIG1lbW9yeSIpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKQEAgLTkzLDggKzkzLDggQEAKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgIGlmKCFvaykKICAgICB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIkZhaWxlZCB0byBwbGF5IHNvdW5kIik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIkZhaWxlZCB0byBwbGF5IHNvdW5kIik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwpAQCAtMTA0LDQwICsxMDQsNDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb3VuZF9iZWVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZnJlcTsKLQlpbnQgZHVyOwotCUJPT0wgb2s7CisgICAgaW50IGZyZXE7CisgICAgaW50IGR1cjsKKyAgICBCT09MIG9rOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpCZWVwIiwgJmZyZXEsICAmZHVyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpCZWVwIiwgJmZyZXEsICAmZHVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZnJlcSA8IDM3IHx8IGZyZXEgPiAzMjc2NykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiZnJlcXVlbmN5IG11c3QgYmUgaW4gMzcgdGhydSAzMjc2NyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGZyZXEgPCAzNyB8fCBmcmVxID4gMzI3NjcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IG11c3QgYmUgaW4gMzcgdGhydSAzMjc2NyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jb2sgPSBCZWVwKGZyZXEsIGR1cik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAoIW9rKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIkZhaWxlZCB0byBiZWVwIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgb2sgPSBCZWVwKGZyZXEsIGR1cik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIkZhaWxlZCB0byBiZWVwIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb3VuZF9tc2diZWVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeCA9IE1CX09LOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6TWVzc2FnZUJlZXAiLCAmeCkpCi0JCXJldHVybiBOVUxMOwotCU1lc3NhZ2VCZWVwKHgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbnQgeCA9IE1CX09LOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6TWVzc2FnZUJlZXAiLCAmeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1lc3NhZ2VCZWVwKHgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBzb3VuZF9tZXRob2RzW10gPQpAQCAtMTU1LDcgKzE1NSw3IEBACiAgICAgUHlPYmplY3QgKnY9UHlMb25nX0Zyb21Mb25nKHZhbHVlKTsKICAgICBpZih2JiZrKQogICAgIHsKLSAgICAgICAgUHlEaWN0X1NldEl0ZW0oZGljdCxrLHYpOworICAgIFB5RGljdF9TZXRJdGVtKGRpY3Qsayx2KTsKICAgICB9CiAgICAgUHlfWERFQ1JFRihrKTsKICAgICBQeV9YREVDUkVGKHYpOwpAQCAtMTY2LDI4ICsxNjYsMjggQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0d2luc291bmQodm9pZCkKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlQeU9iamVjdCAqbW9kdWxlID0gUHlfSW5pdE1vZHVsZTMoIndpbnNvdW5kIiwKLQkJCQkJICBzb3VuZF9tZXRob2RzLAotCQkJCQkgIHNvdW5kX21vZHVsZV9kb2MpOwotCWlmIChtb2R1bGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSk7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKm1vZHVsZSA9IFB5X0luaXRNb2R1bGUzKCJ3aW5zb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZHVsZV9kb2MpOworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSk7CiAKLQlBRERfREVGSU5FKFNORF9BU1lOQyk7Ci0JQUREX0RFRklORShTTkRfTk9ERUZBVUxUKTsKLQlBRERfREVGSU5FKFNORF9OT1NUT1ApOwotCUFERF9ERUZJTkUoU05EX05PV0FJVCk7Ci0JQUREX0RFRklORShTTkRfQUxJQVMpOwotCUFERF9ERUZJTkUoU05EX0ZJTEVOQU1FKTsKLQlBRERfREVGSU5FKFNORF9NRU1PUlkpOwotCUFERF9ERUZJTkUoU05EX1BVUkdFKTsKLQlBRERfREVGSU5FKFNORF9MT09QKTsKLQlBRERfREVGSU5FKFNORF9BUFBMSUNBVElPTik7CisgICAgQUREX0RFRklORShTTkRfQVNZTkMpOworICAgIEFERF9ERUZJTkUoU05EX05PREVGQVVMVCk7CisgICAgQUREX0RFRklORShTTkRfTk9TVE9QKTsKKyAgICBBRERfREVGSU5FKFNORF9OT1dBSVQpOworICAgIEFERF9ERUZJTkUoU05EX0FMSUFTKTsKKyAgICBBRERfREVGSU5FKFNORF9GSUxFTkFNRSk7CisgICAgQUREX0RFRklORShTTkRfTUVNT1JZKTsKKyAgICBBRERfREVGSU5FKFNORF9QVVJHRSk7CisgICAgQUREX0RFRklORShTTkRfTE9PUCk7CisgICAgQUREX0RFRklORShTTkRfQVBQTElDQVRJT04pOwogCi0JQUREX0RFRklORShNQl9PSyk7Ci0JQUREX0RFRklORShNQl9JQ09OQVNURVJJU0spOwotCUFERF9ERUZJTkUoTUJfSUNPTkVYQ0xBTUFUSU9OKTsKLQlBRERfREVGSU5FKE1CX0lDT05IQU5EKTsKLQlBRERfREVGSU5FKE1CX0lDT05RVUVTVElPTik7CisgICAgQUREX0RFRklORShNQl9PSyk7CisgICAgQUREX0RFRklORShNQl9JQ09OQVNURVJJU0spOworICAgIEFERF9ERUZJTkUoTUJfSUNPTkVYQ0xBTUFUSU9OKTsKKyAgICBBRERfREVGSU5FKE1CX0lDT05IQU5EKTsKKyAgICBBRERfREVGSU5FKE1CX0lDT05RVUVTVElPTik7CiB9CmRpZmYgLS1naXQgYS9QQ2J1aWxkL21ha2VfYnVpbGRpbmZvLmMgYi9QQ2J1aWxkL21ha2VfYnVpbGRpbmZvLmMKaW5kZXggMjJiOTg4Mi4uNWEzZDM4NSAxMDA2NDQKLS0tIGEvUENidWlsZC9tYWtlX2J1aWxkaW5mby5jCisrKyBiL1BDYnVpbGQvbWFrZV9idWlsZGluZm8uYwpAQCAtMjMsNzIgKzIzLDcyIEBACiAKIGludCBtYWtlX2J1aWxkaW5mbzIoKQogewotCXN0cnVjdCBfc3RhdCBzdDsKLQlIS0VZIGhUb3J0b2lzZTsKLQljaGFyIGNvbW1hbmRbQ01EX1NJWkUrMV07Ci0JRFdPUkQgdHlwZSwgc2l6ZTsKLQlpZiAoX3N0YXQoIi5zdm4iLCAmc3QpIDwgMCkKLQkJcmV0dXJuIDA7Ci0JLyogQWxsb3cgc3VwcHJlc3Npb24gb2Ygc3Vid2NyZXYuZXhlIGludm9jYXRpb24gaWYgYSBub19zdWJ3Y3JldiBmaWxlIGlzIHByZXNlbnQuICovCi0JaWYgKF9zdGF0KCJub19zdWJ3Y3JldiIsICZzdCkgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKFJlZ09wZW5LZXkoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUyAmJgotCSAgICBSZWdPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUykKLQkJLyogVG9ydG9pc2Ugbm90IGluc3RhbGxlZCAqLwotCQlyZXR1cm4gMDsKLQljb21tYW5kWzBdID0gJyInOyAgLyogcXVvdGUgdGhlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUgKi8KLQlzaXplID0gc2l6ZW9mKGNvbW1hbmQpIC0gMTsKLQlpZiAoUmVnUXVlcnlWYWx1ZUV4KGhUb3J0b2lzZSwgIkRpcmVjdG9yeSIsIDAsICZ0eXBlLCBjb21tYW5kKzEsICZzaXplKSAhPSBFUlJPUl9TVUNDRVNTIHx8Ci0JICAgIHR5cGUgIT0gUkVHX1NaKQotCQkvKiBSZWdpc3RyeSBjb3JydXB0ZWQgKi8KLQkJcmV0dXJuIDA7Ci0Jc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJiaW5cXHN1YndjcmV2LmV4ZSIpOwotCWlmIChfc3RhdChjb21tYW5kKzEsICZzdCkgPCAwKQotCQkvKiBzdWJ3Y3Jldi5leGUgbm90IHBhcnQgb2YgdGhlIHJlbGVhc2UgKi8KLQkJcmV0dXJuIDA7Ci0Jc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJcIiAuLiAuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMgZ2V0YnVpbGRpbmZvMi5jIik7Ci0JcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7Ci0JaWYgKHN5c3RlbShjb21tYW5kKSA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgIHN0cnVjdCBfc3RhdCBzdDsKKyAgICBIS0VZIGhUb3J0b2lzZTsKKyAgICBjaGFyIGNvbW1hbmRbQ01EX1NJWkUrMV07CisgICAgRFdPUkQgdHlwZSwgc2l6ZTsKKyAgICBpZiAoX3N0YXQoIi5zdm4iLCAmc3QpIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLyogQWxsb3cgc3VwcHJlc3Npb24gb2Ygc3Vid2NyZXYuZXhlIGludm9jYXRpb24gaWYgYSBub19zdWJ3Y3JldiBmaWxlIGlzIHByZXNlbnQuICovCisgICAgaWYgKF9zdGF0KCJub19zdWJ3Y3JldiIsICZzdCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFJlZ09wZW5LZXkoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUyAmJgorICAgICAgICBSZWdPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgLyogVG9ydG9pc2Ugbm90IGluc3RhbGxlZCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICBjb21tYW5kWzBdID0gJyInOyAgLyogcXVvdGUgdGhlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUgKi8KKyAgICBzaXplID0gc2l6ZW9mKGNvbW1hbmQpIC0gMTsKKyAgICBpZiAoUmVnUXVlcnlWYWx1ZUV4KGhUb3J0b2lzZSwgIkRpcmVjdG9yeSIsIDAsICZ0eXBlLCBjb21tYW5kKzEsICZzaXplKSAhPSBFUlJPUl9TVUNDRVNTIHx8CisgICAgICAgIHR5cGUgIT0gUkVHX1NaKQorICAgICAgICAvKiBSZWdpc3RyeSBjb3JydXB0ZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJiaW5cXHN1YndjcmV2LmV4ZSIpOworICAgIGlmIChfc3RhdChjb21tYW5kKzEsICZzdCkgPCAwKQorICAgICAgICAvKiBzdWJ3Y3Jldi5leGUgbm90IHBhcnQgb2YgdGhlIHJlbGVhc2UgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJcIiAuLiAuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMgZ2V0YnVpbGRpbmZvMi5jIik7CisgICAgcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKHN5c3RlbShjb21tYW5kKSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciphcmd2W10pCiB7Ci0JY2hhciBjb21tYW5kWzUwMF0gPSAiY2wuZXhlIC1jIC1EX1dJTjMyIC1EVVNFX0RMX0VYUE9SVCAtRF9XSU5ET1dTIC1EV0lOMzIgLURfV0lORExMICI7Ci0JaW50IGRvX3VubGluaywgcmVzdWx0OwotCWlmIChhcmdjICE9IDIpIHsKLQkJZnByaW50ZihzdGRlcnIsICJtYWtlX2J1aWxkaW5mbyAkKENvbmZpZ3VyYXRpb25OYW1lKVxuIik7Ci0JCXJldHVybiBFWElUX0ZBSUxVUkU7Ci0JfQotCWlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2UiKSA9PSAwKSB7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIkRlYnVnIikgPT0gMCkgewotCQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1EX0RFQlVHIC1NRGQgIik7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUl0YW5pdW0iKSA9PSAwKSB7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19JVEFOSVVNICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VBTUQ2NCIpID09IDApIHsKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19PUFRFUk9OICIpOwotCX0KLQllbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uICVzXG4iLCBhcmd2WzFdKTsKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQl9CisgICAgY2hhciBjb21tYW5kWzUwMF0gPSAiY2wuZXhlIC1jIC1EX1dJTjMyIC1EVVNFX0RMX0VYUE9SVCAtRF9XSU5ET1dTIC1EV0lOMzIgLURfV0lORExMICI7CisgICAgaW50IGRvX3VubGluaywgcmVzdWx0OworICAgIGlmIChhcmdjICE9IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlX2J1aWxkaW5mbyAkKENvbmZpZ3VyYXRpb25OYW1lKVxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2UiKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIkRlYnVnIikgPT0gMCkgeworICAgICAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1EX0RFQlVHIC1NRGQgIik7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUl0YW5pdW0iKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19JVEFOSVVNICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VBTUQ2NCIpID09IDApIHsKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLU1EIC9VU0VDTDpNU19PUFRFUk9OICIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uICVzXG4iLCBhcmd2WzFdKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CiAKLQlpZiAoKGRvX3VubGluayA9IG1ha2VfYnVpbGRpbmZvMigpKSkKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJnZXRidWlsZGluZm8yLmMgLURTVUJXQ1JFViAiKTsKLQllbHNlCi0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLi5cXE1vZHVsZXNcXGdldGJ1aWxkaW5mby5jIik7Ci0Jc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICIgLUZvZ2V0YnVpbGRpbmZvLm8gLUkuLlxcSW5jbHVkZSAtSS4uXFxQQyIpOwotCXB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOwotCXJlc3VsdCA9IHN5c3RlbShjb21tYW5kKTsKLQlpZiAoZG9fdW5saW5rKQotCQlfdW5saW5rKCJnZXRidWlsZGluZm8yLmMiKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQlyZXR1cm4gMDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgaWYgKChkb191bmxpbmsgPSBtYWtlX2J1aWxkaW5mbzIoKSkpCisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiZ2V0YnVpbGRpbmZvMi5jIC1EU1VCV0NSRVYgIik7CisgICAgZWxzZQorICAgICAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyIpOworICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiIC1Gb2dldGJ1aWxkaW5mby5vIC1JLi5cXEluY2x1ZGUgLUkuLlxcUEMiKTsKKyAgICBwdXRzKGNvbW1hbmQpOyBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXN1bHQgPSBzeXN0ZW0oY29tbWFuZCk7CisgICAgaWYgKGRvX3VubGluaykKKyAgICAgICAgX3VubGluaygiZ2V0YnVpbGRpbmZvMi5jIik7CisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9QYXJzZXIvYWNjZWxlci5jIGIvUGFyc2VyL2FjY2VsZXIuYwppbmRleCBiNDFiMjY1Li45YjE0MjYzIDEwMDY0NAotLS0gYS9QYXJzZXIvYWNjZWxlci5jCisrKyBiL1BhcnNlci9hY2NlbGVyLmMKQEAgLTIzLDEwMyArMjMsMTAzIEBACiB2b2lkCiBQeUdyYW1tYXJfQWRkQWNjZWxlcmF0b3JzKGdyYW1tYXIgKmcpCiB7Ci0JZGZhICpkOwotCWludCBpOwotCWQgPSBnLT5nX2RmYTsKLQlmb3IgKGkgPSBnLT5nX25kZmFzOyAtLWkgPj0gMDsgZCsrKQotCQlmaXhkZmEoZywgZCk7Ci0JZy0+Z19hY2NlbCA9IDE7CisgICAgZGZhICpkOworICAgIGludCBpOworICAgIGQgPSBnLT5nX2RmYTsKKyAgICBmb3IgKGkgPSBnLT5nX25kZmFzOyAtLWkgPj0gMDsgZCsrKQorICAgICAgICBmaXhkZmEoZywgZCk7CisgICAgZy0+Z19hY2NlbCA9IDE7CiB9CiAKIHZvaWQKIFB5R3JhbW1hcl9SZW1vdmVBY2NlbGVyYXRvcnMoZ3JhbW1hciAqZykKIHsKLQlkZmEgKmQ7Ci0JaW50IGk7Ci0JZy0+Z19hY2NlbCA9IDA7Ci0JZCA9IGctPmdfZGZhOwotCWZvciAoaSA9IGctPmdfbmRmYXM7IC0taSA+PSAwOyBkKyspIHsKLQkJc3RhdGUgKnM7Ci0JCWludCBqOwotCQlzID0gZC0+ZF9zdGF0ZTsKLQkJZm9yIChqID0gMDsgaiA8IGQtPmRfbnN0YXRlczsgaisrLCBzKyspIHsKLQkJCWlmIChzLT5zX2FjY2VsKQotCQkJCVB5T2JqZWN0X0ZSRUUocy0+c19hY2NlbCk7Ci0JCQlzLT5zX2FjY2VsID0gTlVMTDsKLQkJfQotCX0KKyAgICBkZmEgKmQ7CisgICAgaW50IGk7CisgICAgZy0+Z19hY2NlbCA9IDA7CisgICAgZCA9IGctPmdfZGZhOworICAgIGZvciAoaSA9IGctPmdfbmRmYXM7IC0taSA+PSAwOyBkKyspIHsKKyAgICAgICAgc3RhdGUgKnM7CisgICAgICAgIGludCBqOworICAgICAgICBzID0gZC0+ZF9zdGF0ZTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGQtPmRfbnN0YXRlczsgaisrLCBzKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5zX2FjY2VsKQorICAgICAgICAgICAgICAgIFB5T2JqZWN0X0ZSRUUocy0+c19hY2NlbCk7CisgICAgICAgICAgICBzLT5zX2FjY2VsID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGZpeGRmYShncmFtbWFyICpnLCBkZmEgKmQpCiB7Ci0Jc3RhdGUgKnM7Ci0JaW50IGo7Ci0JcyA9IGQtPmRfc3RhdGU7Ci0JZm9yIChqID0gMDsgaiA8IGQtPmRfbnN0YXRlczsgaisrLCBzKyspCi0JCWZpeHN0YXRlKGcsIHMpOworICAgIHN0YXRlICpzOworICAgIGludCBqOworICAgIHMgPSBkLT5kX3N0YXRlOworICAgIGZvciAoaiA9IDA7IGogPCBkLT5kX25zdGF0ZXM7IGorKywgcysrKQorICAgICAgICBmaXhzdGF0ZShnLCBzKTsKIH0KIAogc3RhdGljIHZvaWQKIGZpeHN0YXRlKGdyYW1tYXIgKmcsIHN0YXRlICpzKQogewotCWFyYyAqYTsKLQlpbnQgazsKLQlpbnQgKmFjY2VsOwotCWludCBubCA9IGctPmdfbGwubGxfbmxhYmVsczsKLQlzLT5zX2FjY2VwdCA9IDA7Ci0JYWNjZWwgPSAoaW50ICopIFB5T2JqZWN0X01BTExPQyhubCAqIHNpemVvZihpbnQpKTsKLQlpZiAoYWNjZWwgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSB0byBidWlsZCBwYXJzZXIgYWNjZWxlcmF0b3JzXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0JZm9yIChrID0gMDsgayA8IG5sOyBrKyspCi0JCWFjY2VsW2tdID0gLTE7Ci0JYSA9IHMtPnNfYXJjOwotCWZvciAoayA9IHMtPnNfbmFyY3M7IC0tayA+PSAwOyBhKyspIHsKLQkJaW50IGxibCA9IGEtPmFfbGJsOwotCQlsYWJlbCAqbCA9ICZnLT5nX2xsLmxsX2xhYmVsW2xibF07Ci0JCWludCB0eXBlID0gbC0+bGJfdHlwZTsKLQkJaWYgKGEtPmFfYXJyb3cgPj0gKDEgPDwgNykpIHsKLQkJCXByaW50ZigiWFhYIHRvbyBtYW55IHN0YXRlcyFcbiIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKElTTk9OVEVSTUlOQUwodHlwZSkpIHsKLQkJCWRmYSAqZDEgPSBQeUdyYW1tYXJfRmluZERGQShnLCB0eXBlKTsKLQkJCWludCBpYml0OwotCQkJaWYgKHR5cGUgLSBOVF9PRkZTRVQgPj0gKDEgPDwgNykpIHsKLQkJCQlwcmludGYoIlhYWCB0b28gaGlnaCBub250ZXJtaW5hbCBudW1iZXIhXG4iKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWZvciAoaWJpdCA9IDA7IGliaXQgPCBnLT5nX2xsLmxsX25sYWJlbHM7IGliaXQrKykgewotCQkJCWlmICh0ZXN0Yml0KGQxLT5kX2ZpcnN0LCBpYml0KSkgewotCQkJCQlpZiAoYWNjZWxbaWJpdF0gIT0gLTEpCi0JCQkJCQlwcmludGYoIlhYWCBhbWJpZ3VpdHkhXG4iKTsKLQkJCQkJYWNjZWxbaWJpdF0gPSBhLT5hX2Fycm93IHwgKDEgPDwgNykgfAotCQkJCQkJKCh0eXBlIC0gTlRfT0ZGU0VUKSA8PCA4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobGJsID09IEVNUFRZKQotCQkJcy0+c19hY2NlcHQgPSAxOwotCQllbHNlIGlmIChsYmwgPj0gMCAmJiBsYmwgPCBubCkKLQkJCWFjY2VsW2xibF0gPSBhLT5hX2Fycm93OwotCX0KLQl3aGlsZSAobmwgPiAwICYmIGFjY2VsW25sLTFdID09IC0xKQotCQlubC0tOwotCWZvciAoayA9IDA7IGsgPCBubCAmJiBhY2NlbFtrXSA9PSAtMTspCi0JCWsrKzsKLQlpZiAoayA8IG5sKSB7Ci0JCWludCBpOwotCQlzLT5zX2FjY2VsID0gKGludCAqKSBQeU9iamVjdF9NQUxMT0MoKG5sLWspICogc2l6ZW9mKGludCkpOwotCQlpZiAocy0+c19hY2NlbCA9PSBOVUxMKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSB0byBhZGQgcGFyc2VyIGFjY2VsZXJhdG9yc1xuIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCXMtPnNfbG93ZXIgPSBrOwotCQlzLT5zX3VwcGVyID0gbmw7Ci0JCWZvciAoaSA9IDA7IGsgPCBubDsgaSsrLCBrKyspCi0JCQlzLT5zX2FjY2VsW2ldID0gYWNjZWxba107Ci0JfQotCVB5T2JqZWN0X0ZSRUUoYWNjZWwpOworICAgIGFyYyAqYTsKKyAgICBpbnQgazsKKyAgICBpbnQgKmFjY2VsOworICAgIGludCBubCA9IGctPmdfbGwubGxfbmxhYmVsczsKKyAgICBzLT5zX2FjY2VwdCA9IDA7CisgICAgYWNjZWwgPSAoaW50ICopIFB5T2JqZWN0X01BTExPQyhubCAqIHNpemVvZihpbnQpKTsKKyAgICBpZiAoYWNjZWwgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSB0byBidWlsZCBwYXJzZXIgYWNjZWxlcmF0b3JzXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZm9yIChrID0gMDsgayA8IG5sOyBrKyspCisgICAgICAgIGFjY2VsW2tdID0gLTE7CisgICAgYSA9IHMtPnNfYXJjOworICAgIGZvciAoayA9IHMtPnNfbmFyY3M7IC0tayA+PSAwOyBhKyspIHsKKyAgICAgICAgaW50IGxibCA9IGEtPmFfbGJsOworICAgICAgICBsYWJlbCAqbCA9ICZnLT5nX2xsLmxsX2xhYmVsW2xibF07CisgICAgICAgIGludCB0eXBlID0gbC0+bGJfdHlwZTsKKyAgICAgICAgaWYgKGEtPmFfYXJyb3cgPj0gKDEgPDwgNykpIHsKKyAgICAgICAgICAgIHByaW50ZigiWFhYIHRvbyBtYW55IHN0YXRlcyFcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKElTTk9OVEVSTUlOQUwodHlwZSkpIHsKKyAgICAgICAgICAgIGRmYSAqZDEgPSBQeUdyYW1tYXJfRmluZERGQShnLCB0eXBlKTsKKyAgICAgICAgICAgIGludCBpYml0OworICAgICAgICAgICAgaWYgKHR5cGUgLSBOVF9PRkZTRVQgPj0gKDEgPDwgNykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlhYWCB0b28gaGlnaCBub250ZXJtaW5hbCBudW1iZXIhXG4iKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaWJpdCA9IDA7IGliaXQgPCBnLT5nX2xsLmxsX25sYWJlbHM7IGliaXQrKykgeworICAgICAgICAgICAgICAgIGlmICh0ZXN0Yml0KGQxLT5kX2ZpcnN0LCBpYml0KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZWxbaWJpdF0gIT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlhYWCBhbWJpZ3VpdHkhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjZWxbaWJpdF0gPSBhLT5hX2Fycm93IHwgKDEgPDwgNykgfAorICAgICAgICAgICAgICAgICAgICAgICAgKCh0eXBlIC0gTlRfT0ZGU0VUKSA8PCA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGJsID09IEVNUFRZKQorICAgICAgICAgICAgcy0+c19hY2NlcHQgPSAxOworICAgICAgICBlbHNlIGlmIChsYmwgPj0gMCAmJiBsYmwgPCBubCkKKyAgICAgICAgICAgIGFjY2VsW2xibF0gPSBhLT5hX2Fycm93OworICAgIH0KKyAgICB3aGlsZSAobmwgPiAwICYmIGFjY2VsW25sLTFdID09IC0xKQorICAgICAgICBubC0tOworICAgIGZvciAoayA9IDA7IGsgPCBubCAmJiBhY2NlbFtrXSA9PSAtMTspCisgICAgICAgIGsrKzsKKyAgICBpZiAoayA8IG5sKSB7CisgICAgICAgIGludCBpOworICAgICAgICBzLT5zX2FjY2VsID0gKGludCAqKSBQeU9iamVjdF9NQUxMT0MoKG5sLWspICogc2l6ZW9mKGludCkpOworICAgICAgICBpZiAocy0+c19hY2NlbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSB0byBhZGQgcGFyc2VyIGFjY2VsZXJhdG9yc1xuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIHMtPnNfbG93ZXIgPSBrOworICAgICAgICBzLT5zX3VwcGVyID0gbmw7CisgICAgICAgIGZvciAoaSA9IDA7IGsgPCBubDsgaSsrLCBrKyspCisgICAgICAgICAgICBzLT5zX2FjY2VsW2ldID0gYWNjZWxba107CisgICAgfQorICAgIFB5T2JqZWN0X0ZSRUUoYWNjZWwpOwogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2JpdHNldC5jIGIvUGFyc2VyL2JpdHNldC5jCmluZGV4IGI1NTQzYjguLmY1YmZkNDEgMTAwNjQ0Ci0tLSBhL1BhcnNlci9iaXRzZXQuYworKysgYi9QYXJzZXIvYml0c2V0LmMKQEAgLTcsNjAgKzcsNjAgQEAKIGJpdHNldAogbmV3Yml0c2V0KGludCBuYml0cykKIHsKLQlpbnQgbmJ5dGVzID0gTkJZVEVTKG5iaXRzKTsKLQliaXRzZXQgc3MgPSAoY2hhciAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoQllURSkgKiAgbmJ5dGVzKTsKLQkKLQlpZiAoc3MgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBiaXRzZXQiKTsKLQkKLQlzcyArPSBuYnl0ZXM7Ci0Jd2hpbGUgKC0tbmJ5dGVzID49IDApCi0JCSotLXNzID0gMDsKLQlyZXR1cm4gc3M7CisgICAgaW50IG5ieXRlcyA9IE5CWVRFUyhuYml0cyk7CisgICAgYml0c2V0IHNzID0gKGNoYXIgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKEJZVEUpICogIG5ieXRlcyk7CisKKyAgICBpZiAoc3MgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBiaXRzZXQiKTsKKworICAgIHNzICs9IG5ieXRlczsKKyAgICB3aGlsZSAoLS1uYnl0ZXMgPj0gMCkKKyAgICAgICAgKi0tc3MgPSAwOworICAgIHJldHVybiBzczsKIH0KIAogdm9pZAogZGVsYml0c2V0KGJpdHNldCBzcykKIHsKLQlQeU9iamVjdF9GUkVFKHNzKTsKKyAgICBQeU9iamVjdF9GUkVFKHNzKTsKIH0KIAogaW50CiBhZGRiaXQoYml0c2V0IHNzLCBpbnQgaWJpdCkKIHsKLQlpbnQgaWJ5dGUgPSBCSVQyQllURShpYml0KTsKLQlCWVRFIG1hc2sgPSBCSVQyTUFTSyhpYml0KTsKLQkKLQlpZiAoc3NbaWJ5dGVdICYgbWFzaykKLQkJcmV0dXJuIDA7IC8qIEJpdCBhbHJlYWR5IHNldCAqLwotCXNzW2lieXRlXSB8PSBtYXNrOwotCXJldHVybiAxOworICAgIGludCBpYnl0ZSA9IEJJVDJCWVRFKGliaXQpOworICAgIEJZVEUgbWFzayA9IEJJVDJNQVNLKGliaXQpOworCisgICAgaWYgKHNzW2lieXRlXSAmIG1hc2spCisgICAgICAgIHJldHVybiAwOyAvKiBCaXQgYWxyZWFkeSBzZXQgKi8KKyAgICBzc1tpYnl0ZV0gfD0gbWFzazsKKyAgICByZXR1cm4gMTsKIH0KIAogI2lmIDAgLyogTm93IGEgbWFjcm8gKi8KIGludAogdGVzdGJpdChiaXRzZXQgc3MsIGludCBpYml0KQogewotCXJldHVybiAoc3NbQklUMkJZVEUoaWJpdCldICYgQklUMk1BU0soaWJpdCkpICE9IDA7CisgICAgcmV0dXJuIChzc1tCSVQyQllURShpYml0KV0gJiBCSVQyTUFTSyhpYml0KSkgIT0gMDsKIH0KICNlbmRpZgogCiBpbnQKIHNhbWViaXRzZXQoYml0c2V0IHNzMSwgYml0c2V0IHNzMiwgaW50IG5iaXRzKQogewotCWludCBpOwotCQotCWZvciAoaSA9IE5CWVRFUyhuYml0cyk7IC0taSA+PSAwOyApCi0JCWlmICgqc3MxKysgIT0gKnNzMisrKQotCQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSBOQllURVMobmJpdHMpOyAtLWkgPj0gMDsgKQorICAgICAgICBpZiAoKnNzMSsrICE9ICpzczIrKykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiB2b2lkCiBtZXJnZWJpdHNldChiaXRzZXQgc3MxLCBiaXRzZXQgc3MyLCBpbnQgbmJpdHMpCiB7Ci0JaW50IGk7Ci0JCi0JZm9yIChpID0gTkJZVEVTKG5iaXRzKTsgLS1pID49IDA7ICkKLQkJKnNzMSsrIHw9ICpzczIrKzsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IE5CWVRFUyhuYml0cyk7IC0taSA+PSAwOyApCisgICAgICAgICpzczErKyB8PSAqc3MyKys7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvZmlyc3RzZXRzLmMgYi9QYXJzZXIvZmlyc3RzZXRzLmMKaW5kZXggMDA0NjdiMy4uZWU3NWQxYiAxMDA2NDQKLS0tIGEvUGFyc2VyL2ZpcnN0c2V0cy5jCisrKyBiL1BhcnNlci9maXJzdHNldHMuYwpAQCAtMTMsMTAxICsxMywxMDEgQEAKIHZvaWQKIGFkZGZpcnN0c2V0cyhncmFtbWFyICpnKQogewotCWludCBpOwotCWRmYSAqZDsKKyAgICBpbnQgaTsKKyAgICBkZmEgKmQ7CiAKLQlpZiAoUHlfRGVidWdGbGFnKQotCQlwcmludGYoIkFkZGluZyBGSVJTVCBzZXRzIC4uLlxuIik7Ci0JZm9yIChpID0gMDsgaSA8IGctPmdfbmRmYXM7IGkrKykgewotCQlkID0gJmctPmdfZGZhW2ldOwotCQlpZiAoZC0+ZF9maXJzdCA9PSBOVUxMKQotCQkJY2FsY2ZpcnN0c2V0KGcsIGQpOwotCX0KKyAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICBwcmludGYoIkFkZGluZyBGSVJTVCBzZXRzIC4uLlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IGctPmdfbmRmYXM7IGkrKykgeworICAgICAgICBkID0gJmctPmdfZGZhW2ldOworICAgICAgICBpZiAoZC0+ZF9maXJzdCA9PSBOVUxMKQorICAgICAgICAgICAgY2FsY2ZpcnN0c2V0KGcsIGQpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGNhbGNmaXJzdHNldChncmFtbWFyICpnLCBkZmEgKmQpCiB7Ci0JaW50IGksIGo7Ci0Jc3RhdGUgKnM7Ci0JYXJjICphOwotCWludCBuc3ltczsKLQlpbnQgKnN5bTsKLQlpbnQgbmJpdHM7Ci0Jc3RhdGljIGJpdHNldCBkdW1teTsKLQliaXRzZXQgcmVzdWx0OwotCWludCB0eXBlOwotCWRmYSAqZDE7Ci0JbGFiZWwgKmwwOwotCQotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50ZigiQ2FsY3VsYXRlIEZJUlNUIHNldCBmb3IgJyVzJ1xuIiwgZC0+ZF9uYW1lKTsKLQkKLQlpZiAoZHVtbXkgPT0gTlVMTCkKLQkJZHVtbXkgPSBuZXdiaXRzZXQoMSk7Ci0JaWYgKGQtPmRfZmlyc3QgPT0gZHVtbXkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJMZWZ0LXJlY3Vyc2lvbiBmb3IgJyVzJ1xuIiwgZC0+ZF9uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoZC0+ZF9maXJzdCAhPSBOVUxMKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiUmUtY2FsY3VsYXRpbmcgRklSU1Qgc2V0IGZvciAnJXMnID8/P1xuIiwKLQkJCWQtPmRfbmFtZSk7Ci0JfQotCWQtPmRfZmlyc3QgPSBkdW1teTsKLQkKLQlsMCA9IGctPmdfbGwubGxfbGFiZWw7Ci0JbmJpdHMgPSBnLT5nX2xsLmxsX25sYWJlbHM7Ci0JcmVzdWx0ID0gbmV3Yml0c2V0KG5iaXRzKTsKLQkKLQlzeW0gPSAoaW50ICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihpbnQpKTsKLQlpZiAoc3ltID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IHN5bSBpbiBjYWxjZmlyc3RzZXQiKTsKLQluc3ltcyA9IDE7Ci0Jc3ltWzBdID0gZmluZGxhYmVsKCZnLT5nX2xsLCBkLT5kX3R5cGUsIChjaGFyICopTlVMTCk7Ci0JCi0JcyA9ICZkLT5kX3N0YXRlW2QtPmRfaW5pdGlhbF07Ci0JZm9yIChpID0gMDsgaSA8IHMtPnNfbmFyY3M7IGkrKykgewotCQlhID0gJnMtPnNfYXJjW2ldOwotCQlmb3IgKGogPSAwOyBqIDwgbnN5bXM7IGorKykgewotCQkJaWYgKHN5bVtqXSA9PSBhLT5hX2xibCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaiA+PSBuc3ltcykgeyAvKiBOZXcgbGFiZWwgKi8KLQkJCXN5bSA9IChpbnQgKilQeU9iamVjdF9SRUFMTE9DKHN5bSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIChuc3ltcyArIDEpKTsKLQkJCWlmIChzeW0gPT0gTlVMTCkKLQkJCQlQeV9GYXRhbEVycm9yKAotCQkJCSAgICAibm8gbWVtIHRvIHJlc2l6ZSBzeW0gaW4gY2FsY2ZpcnN0c2V0Iik7Ci0JCQlzeW1bbnN5bXMrK10gPSBhLT5hX2xibDsKLQkJCXR5cGUgPSBsMFthLT5hX2xibF0ubGJfdHlwZTsKLQkJCWlmIChJU05PTlRFUk1JTkFMKHR5cGUpKSB7Ci0JCQkJZDEgPSBQeUdyYW1tYXJfRmluZERGQShnLCB0eXBlKTsKLQkJCQlpZiAoZDEtPmRfZmlyc3QgPT0gZHVtbXkpIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCQkiTGVmdC1yZWN1cnNpb24gYmVsb3cgJyVzJ1xuIiwKLQkJCQkJCWQtPmRfbmFtZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZDEtPmRfZmlyc3QgPT0gTlVMTCkKLQkJCQkJCWNhbGNmaXJzdHNldChnLCBkMSk7Ci0JCQkJCW1lcmdlYml0c2V0KHJlc3VsdCwKLQkJCQkJCSAgICBkMS0+ZF9maXJzdCwgbmJpdHMpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKElTVEVSTUlOQUwodHlwZSkpIHsKLQkJCQlhZGRiaXQocmVzdWx0LCBhLT5hX2xibCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZC0+ZF9maXJzdCA9IHJlc3VsdDsKLQlpZiAoUHlfRGVidWdGbGFnKSB7Ci0JCXByaW50ZigiRklSU1Qgc2V0IGZvciAnJXMnOiB7IiwgZC0+ZF9uYW1lKTsKLQkJZm9yIChpID0gMDsgaSA8IG5iaXRzOyBpKyspIHsKLQkJCWlmICh0ZXN0Yml0KHJlc3VsdCwgaSkpCi0JCQkJcHJpbnRmKCIgJXMiLCBQeUdyYW1tYXJfTGFiZWxSZXByKCZsMFtpXSkpOwotCQl9Ci0JCXByaW50ZigiIH1cbiIpOwotCX0KKyAgICBpbnQgaSwgajsKKyAgICBzdGF0ZSAqczsKKyAgICBhcmMgKmE7CisgICAgaW50IG5zeW1zOworICAgIGludCAqc3ltOworICAgIGludCBuYml0czsKKyAgICBzdGF0aWMgYml0c2V0IGR1bW15OworICAgIGJpdHNldCByZXN1bHQ7CisgICAgaW50IHR5cGU7CisgICAgZGZhICpkMTsKKyAgICBsYWJlbCAqbDA7CiAKLQlQeU9iamVjdF9GUkVFKHN5bSk7CisgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgcHJpbnRmKCJDYWxjdWxhdGUgRklSU1Qgc2V0IGZvciAnJXMnXG4iLCBkLT5kX25hbWUpOworCisgICAgaWYgKGR1bW15ID09IE5VTEwpCisgICAgICAgIGR1bW15ID0gbmV3Yml0c2V0KDEpOworICAgIGlmIChkLT5kX2ZpcnN0ID09IGR1bW15KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTGVmdC1yZWN1cnNpb24gZm9yICclcydcbiIsIGQtPmRfbmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGQtPmRfZmlyc3QgIT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlLWNhbGN1bGF0aW5nIEZJUlNUIHNldCBmb3IgJyVzJyA/Pz9cbiIsCisgICAgICAgICAgICBkLT5kX25hbWUpOworICAgIH0KKyAgICBkLT5kX2ZpcnN0ID0gZHVtbXk7CisKKyAgICBsMCA9IGctPmdfbGwubGxfbGFiZWw7CisgICAgbmJpdHMgPSBnLT5nX2xsLmxsX25sYWJlbHM7CisgICAgcmVzdWx0ID0gbmV3Yml0c2V0KG5iaXRzKTsKKworICAgIHN5bSA9IChpbnQgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKGludCkpOworICAgIGlmIChzeW0gPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgc3ltIGluIGNhbGNmaXJzdHNldCIpOworICAgIG5zeW1zID0gMTsKKyAgICBzeW1bMF0gPSBmaW5kbGFiZWwoJmctPmdfbGwsIGQtPmRfdHlwZSwgKGNoYXIgKilOVUxMKTsKKworICAgIHMgPSAmZC0+ZF9zdGF0ZVtkLT5kX2luaXRpYWxdOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zX25hcmNzOyBpKyspIHsKKyAgICAgICAgYSA9ICZzLT5zX2FyY1tpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG5zeW1zOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChzeW1bal0gPT0gYS0+YV9sYmwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPj0gbnN5bXMpIHsgLyogTmV3IGxhYmVsICovCisgICAgICAgICAgICBzeW0gPSAoaW50ICopUHlPYmplY3RfUkVBTExPQyhzeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSAqIChuc3ltcyArIDEpKTsKKyAgICAgICAgICAgIGlmIChzeW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKAorICAgICAgICAgICAgICAgICAgICAibm8gbWVtIHRvIHJlc2l6ZSBzeW0gaW4gY2FsY2ZpcnN0c2V0Iik7CisgICAgICAgICAgICBzeW1bbnN5bXMrK10gPSBhLT5hX2xibDsKKyAgICAgICAgICAgIHR5cGUgPSBsMFthLT5hX2xibF0ubGJfdHlwZTsKKyAgICAgICAgICAgIGlmIChJU05PTlRFUk1JTkFMKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgZDEgPSBQeUdyYW1tYXJfRmluZERGQShnLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoZDEtPmRfZmlyc3QgPT0gZHVtbXkpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTGVmdC1yZWN1cnNpb24gYmVsb3cgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPmRfbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZDEtPmRfZmlyc3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNmaXJzdHNldChnLCBkMSk7CisgICAgICAgICAgICAgICAgICAgIG1lcmdlYml0c2V0KHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEtPmRfZmlyc3QsIG5iaXRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChJU1RFUk1JTkFMKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgYWRkYml0KHJlc3VsdCwgYS0+YV9sYmwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGQtPmRfZmlyc3QgPSByZXN1bHQ7CisgICAgaWYgKFB5X0RlYnVnRmxhZykgeworICAgICAgICBwcmludGYoIkZJUlNUIHNldCBmb3IgJyVzJzogeyIsIGQtPmRfbmFtZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYml0czsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGVzdGJpdChyZXN1bHQsIGkpKQorICAgICAgICAgICAgICAgIHByaW50ZigiICVzIiwgUHlHcmFtbWFyX0xhYmVsUmVwcigmbDBbaV0pKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIiB9XG4iKTsKKyAgICB9CisKKyAgICBQeU9iamVjdF9GUkVFKHN5bSk7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvZ3JhbW1hci5jIGIvUGFyc2VyL2dyYW1tYXIuYwppbmRleCA5ZTdjNDlhLi5mYTFkZDdjIDEwMDY0NAotLS0gYS9QYXJzZXIvZ3JhbW1hci5jCisrKyBiL1BhcnNlci9ncmFtbWFyLmMKQEAgLTE4LDk4ICsxOCw5OCBAQAogZ3JhbW1hciAqCiBuZXdncmFtbWFyKGludCBzdGFydCkKIHsKLQlncmFtbWFyICpnOwotCQotCWcgPSAoZ3JhbW1hciAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoZ3JhbW1hcikpOwotCWlmIChnID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IGdyYW1tYXIiKTsKLQlnLT5nX25kZmFzID0gMDsKLQlnLT5nX2RmYSA9IE5VTEw7Ci0JZy0+Z19zdGFydCA9IHN0YXJ0OwotCWctPmdfbGwubGxfbmxhYmVscyA9IDA7Ci0JZy0+Z19sbC5sbF9sYWJlbCA9IE5VTEw7Ci0JZy0+Z19hY2NlbCA9IDA7Ci0JcmV0dXJuIGc7CisgICAgZ3JhbW1hciAqZzsKKworICAgIGcgPSAoZ3JhbW1hciAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoZ3JhbW1hcikpOworICAgIGlmIChnID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IGdyYW1tYXIiKTsKKyAgICBnLT5nX25kZmFzID0gMDsKKyAgICBnLT5nX2RmYSA9IE5VTEw7CisgICAgZy0+Z19zdGFydCA9IHN0YXJ0OworICAgIGctPmdfbGwubGxfbmxhYmVscyA9IDA7CisgICAgZy0+Z19sbC5sbF9sYWJlbCA9IE5VTEw7CisgICAgZy0+Z19hY2NlbCA9IDA7CisgICAgcmV0dXJuIGc7CiB9CiAKIGRmYSAqCiBhZGRkZmEoZ3JhbW1hciAqZywgaW50IHR5cGUsIGNoYXIgKm5hbWUpCiB7Ci0JZGZhICpkOwotCQotCWctPmdfZGZhID0gKGRmYSAqKVB5T2JqZWN0X1JFQUxMT0MoZy0+Z19kZmEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGZhKSAqIChnLT5nX25kZmFzICsgMSkpOwotCWlmIChnLT5nX2RmYSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gdG8gcmVzaXplIGRmYSBpbiBhZGRkZmEiKTsKLQlkID0gJmctPmdfZGZhW2ctPmdfbmRmYXMrK107Ci0JZC0+ZF90eXBlID0gdHlwZTsKLQlkLT5kX25hbWUgPSBzdHJkdXAobmFtZSk7Ci0JZC0+ZF9uc3RhdGVzID0gMDsKLQlkLT5kX3N0YXRlID0gTlVMTDsKLQlkLT5kX2luaXRpYWwgPSAtMTsKLQlkLT5kX2ZpcnN0ID0gTlVMTDsKLQlyZXR1cm4gZDsgLyogT25seSB1c2Ugd2hpbGUgZnJlc2ghICovCisgICAgZGZhICpkOworCisgICAgZy0+Z19kZmEgPSAoZGZhICopUHlPYmplY3RfUkVBTExPQyhnLT5nX2RmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGZhKSAqIChnLT5nX25kZmFzICsgMSkpOworICAgIGlmIChnLT5nX2RmYSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJubyBtZW0gdG8gcmVzaXplIGRmYSBpbiBhZGRkZmEiKTsKKyAgICBkID0gJmctPmdfZGZhW2ctPmdfbmRmYXMrK107CisgICAgZC0+ZF90eXBlID0gdHlwZTsKKyAgICBkLT5kX25hbWUgPSBzdHJkdXAobmFtZSk7CisgICAgZC0+ZF9uc3RhdGVzID0gMDsKKyAgICBkLT5kX3N0YXRlID0gTlVMTDsKKyAgICBkLT5kX2luaXRpYWwgPSAtMTsKKyAgICBkLT5kX2ZpcnN0ID0gTlVMTDsKKyAgICByZXR1cm4gZDsgLyogT25seSB1c2Ugd2hpbGUgZnJlc2ghICovCiB9CiAKIGludAogYWRkc3RhdGUoZGZhICpkKQogewotCXN0YXRlICpzOwotCQotCWQtPmRfc3RhdGUgPSAoc3RhdGUgKilQeU9iamVjdF9SRUFMTE9DKGQtPmRfc3RhdGUsCi0JCQkJICAgICAgc2l6ZW9mKHN0YXRlKSAqIChkLT5kX25zdGF0ZXMgKyAxKSk7Ci0JaWYgKGQtPmRfc3RhdGUgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBzdGF0ZSBpbiBhZGRzdGF0ZSIpOwotCXMgPSAmZC0+ZF9zdGF0ZVtkLT5kX25zdGF0ZXMrK107Ci0Jcy0+c19uYXJjcyA9IDA7Ci0Jcy0+c19hcmMgPSBOVUxMOwotCXMtPnNfbG93ZXIgPSAwOwotCXMtPnNfdXBwZXIgPSAwOwotCXMtPnNfYWNjZWwgPSBOVUxMOwotCXMtPnNfYWNjZXB0ID0gMDsKLQlyZXR1cm4gcyAtIGQtPmRfc3RhdGU7CisgICAgc3RhdGUgKnM7CisKKyAgICBkLT5kX3N0YXRlID0gKHN0YXRlICopUHlPYmplY3RfUkVBTExPQyhkLT5kX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdGF0ZSkgKiAoZC0+ZF9uc3RhdGVzICsgMSkpOworICAgIGlmIChkLT5kX3N0YXRlID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgc3RhdGUgaW4gYWRkc3RhdGUiKTsKKyAgICBzID0gJmQtPmRfc3RhdGVbZC0+ZF9uc3RhdGVzKytdOworICAgIHMtPnNfbmFyY3MgPSAwOworICAgIHMtPnNfYXJjID0gTlVMTDsKKyAgICBzLT5zX2xvd2VyID0gMDsKKyAgICBzLT5zX3VwcGVyID0gMDsKKyAgICBzLT5zX2FjY2VsID0gTlVMTDsKKyAgICBzLT5zX2FjY2VwdCA9IDA7CisgICAgcmV0dXJuIHMgLSBkLT5kX3N0YXRlOwogfQogCiB2b2lkCiBhZGRhcmMoZGZhICpkLCBpbnQgZnJvbSwgaW50IHRvLCBpbnQgbGJsKQogewotCXN0YXRlICpzOwotCWFyYyAqYTsKLQkKLQlhc3NlcnQoMCA8PSBmcm9tICYmIGZyb20gPCBkLT5kX25zdGF0ZXMpOwotCWFzc2VydCgwIDw9IHRvICYmIHRvIDwgZC0+ZF9uc3RhdGVzKTsKLQkKLQlzID0gJmQtPmRfc3RhdGVbZnJvbV07Ci0Jcy0+c19hcmMgPSAoYXJjICopUHlPYmplY3RfUkVBTExPQyhzLT5zX2FyYywgc2l6ZW9mKGFyYykgKiAocy0+c19uYXJjcyArIDEpKTsKLQlpZiAocy0+c19hcmMgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBhcmMgbGlzdCBpbiBhZGRhcmMiKTsKLQlhID0gJnMtPnNfYXJjW3MtPnNfbmFyY3MrK107Ci0JYS0+YV9sYmwgPSBsYmw7Ci0JYS0+YV9hcnJvdyA9IHRvOworICAgIHN0YXRlICpzOworICAgIGFyYyAqYTsKKworICAgIGFzc2VydCgwIDw9IGZyb20gJiYgZnJvbSA8IGQtPmRfbnN0YXRlcyk7CisgICAgYXNzZXJ0KDAgPD0gdG8gJiYgdG8gPCBkLT5kX25zdGF0ZXMpOworCisgICAgcyA9ICZkLT5kX3N0YXRlW2Zyb21dOworICAgIHMtPnNfYXJjID0gKGFyYyAqKVB5T2JqZWN0X1JFQUxMT0Mocy0+c19hcmMsIHNpemVvZihhcmMpICogKHMtPnNfbmFyY3MgKyAxKSk7CisgICAgaWYgKHMtPnNfYXJjID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgYXJjIGxpc3QgaW4gYWRkYXJjIik7CisgICAgYSA9ICZzLT5zX2FyY1tzLT5zX25hcmNzKytdOworICAgIGEtPmFfbGJsID0gbGJsOworICAgIGEtPmFfYXJyb3cgPSB0bzsKIH0KIAogaW50CiBhZGRsYWJlbChsYWJlbGxpc3QgKmxsLCBpbnQgdHlwZSwgY2hhciAqc3RyKQogewotCWludCBpOwotCWxhYmVsICpsYjsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgbGwtPmxsX25sYWJlbHM7IGkrKykgewotCQlpZiAobGwtPmxsX2xhYmVsW2ldLmxiX3R5cGUgPT0gdHlwZSAmJgotCQkJc3RyY21wKGxsLT5sbF9sYWJlbFtpXS5sYl9zdHIsIHN0cikgPT0gMCkKLQkJCXJldHVybiBpOwotCX0KLQlsbC0+bGxfbGFiZWwgPSAobGFiZWwgKilQeU9iamVjdF9SRUFMTE9DKGxsLT5sbF9sYWJlbCwKLQkJCQkJc2l6ZW9mKGxhYmVsKSAqIChsbC0+bGxfbmxhYmVscyArIDEpKTsKLQlpZiAobGwtPmxsX2xhYmVsID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgbGFiZWxsaXN0IGluIGFkZGxhYmVsIik7Ci0JbGIgPSAmbGwtPmxsX2xhYmVsW2xsLT5sbF9ubGFiZWxzKytdOwotCWxiLT5sYl90eXBlID0gdHlwZTsKLQlsYi0+bGJfc3RyID0gc3RyZHVwKHN0cik7Ci0JaWYgKFB5X0RlYnVnRmxhZykKLQkJcHJpbnRmKCJMYWJlbCBAICU4cCwgJWQ6ICVzXG4iLCBsbCwgbGwtPmxsX25sYWJlbHMsCi0JCSAgICAgICBQeUdyYW1tYXJfTGFiZWxSZXByKGxiKSk7Ci0JcmV0dXJuIGxiIC0gbGwtPmxsX2xhYmVsOworICAgIGludCBpOworICAgIGxhYmVsICpsYjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsbC0+bGxfbmxhYmVsczsgaSsrKSB7CisgICAgICAgIGlmIChsbC0+bGxfbGFiZWxbaV0ubGJfdHlwZSA9PSB0eXBlICYmCisgICAgICAgICAgICBzdHJjbXAobGwtPmxsX2xhYmVsW2ldLmxiX3N0ciwgc3RyKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIGxsLT5sbF9sYWJlbCA9IChsYWJlbCAqKVB5T2JqZWN0X1JFQUxMT0MobGwtPmxsX2xhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhYmVsKSAqIChsbC0+bGxfbmxhYmVscyArIDEpKTsKKyAgICBpZiAobGwtPmxsX2xhYmVsID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgbGFiZWxsaXN0IGluIGFkZGxhYmVsIik7CisgICAgbGIgPSAmbGwtPmxsX2xhYmVsW2xsLT5sbF9ubGFiZWxzKytdOworICAgIGxiLT5sYl90eXBlID0gdHlwZTsKKyAgICBsYi0+bGJfc3RyID0gc3RyZHVwKHN0cik7CisgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgcHJpbnRmKCJMYWJlbCBAICU4cCwgJWQ6ICVzXG4iLCBsbCwgbGwtPmxsX25sYWJlbHMsCisgICAgICAgICAgICAgICBQeUdyYW1tYXJfTGFiZWxSZXByKGxiKSk7CisgICAgcmV0dXJuIGxiIC0gbGwtPmxsX2xhYmVsOwogfQogCiAvKiBTYW1lLCBidXQgcmF0aGVyIGRpZXMgdGhhbiBhZGRzICovCkBAIC0xMTcsMTYgKzExNywxNiBAQAogaW50CiBmaW5kbGFiZWwobGFiZWxsaXN0ICpsbCwgaW50IHR5cGUsIGNoYXIgKnN0cikKIHsKLQlpbnQgaTsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgbGwtPmxsX25sYWJlbHM7IGkrKykgewotCQlpZiAobGwtPmxsX2xhYmVsW2ldLmxiX3R5cGUgPT0gdHlwZSAvKiYmCi0JCQlzdHJjbXAobGwtPmxsX2xhYmVsW2ldLmxiX3N0ciwgc3RyKSA9PSAwKi8pCi0JCQlyZXR1cm4gaTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJMYWJlbCAlZC8nJXMnIG5vdCBmb3VuZFxuIiwgdHlwZSwgc3RyKTsKLQlQeV9GYXRhbEVycm9yKCJncmFtbWFyLmM6ZmluZGxhYmVsKCkiKTsKLQlyZXR1cm4gMDsgLyogTWFrZSBnY2MgLVdhbGwgaGFwcHkgKi8KKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsbC0+bGxfbmxhYmVsczsgaSsrKSB7CisgICAgICAgIGlmIChsbC0+bGxfbGFiZWxbaV0ubGJfdHlwZSA9PSB0eXBlIC8qJiYKKyAgICAgICAgICAgIHN0cmNtcChsbC0+bGxfbGFiZWxbaV0ubGJfc3RyLCBzdHIpID09IDAqLykKKyAgICAgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxhYmVsICVkLyclcycgbm90IGZvdW5kXG4iLCB0eXBlLCBzdHIpOworICAgIFB5X0ZhdGFsRXJyb3IoImdyYW1tYXIuYzpmaW5kbGFiZWwoKSIpOworICAgIHJldHVybiAwOyAvKiBNYWtlIGdjYyAtV2FsbCBoYXBweSAqLwogfQogCiAvKiBGb3J3YXJkICovCkBAIC0xMzUsMTIwICsxMzUsMTIwIEBACiB2b2lkCiB0cmFuc2xhdGVsYWJlbHMoZ3JhbW1hciAqZykKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAogI2lmZGVmIFB5X0RFQlVHCi0JcHJpbnRmKCJUcmFuc2xhdGluZyBsYWJlbHMgLi4uXG4iKTsKKyAgICBwcmludGYoIlRyYW5zbGF0aW5nIGxhYmVscyAuLi5cbiIpOwogI2VuZGlmCi0JLyogRG9uJ3QgdHJhbnNsYXRlIEVNUFRZICovCi0JZm9yIChpID0gRU1QVFkrMTsgaSA8IGctPmdfbGwubGxfbmxhYmVsczsgaSsrKQotCQl0cmFuc2xhYmVsKGcsICZnLT5nX2xsLmxsX2xhYmVsW2ldKTsKKyAgICAvKiBEb24ndCB0cmFuc2xhdGUgRU1QVFkgKi8KKyAgICBmb3IgKGkgPSBFTVBUWSsxOyBpIDwgZy0+Z19sbC5sbF9ubGFiZWxzOyBpKyspCisgICAgICAgIHRyYW5zbGFiZWwoZywgJmctPmdfbGwubGxfbGFiZWxbaV0pOwogfQogCiBzdGF0aWMgdm9pZAogdHJhbnNsYWJlbChncmFtbWFyICpnLCBsYWJlbCAqbGIpCiB7Ci0JaW50IGk7Ci0JCi0JaWYgKFB5X0RlYnVnRmxhZykKLQkJcHJpbnRmKCJUcmFuc2xhdGluZyBsYWJlbCAlcyAuLi5cbiIsIFB5R3JhbW1hcl9MYWJlbFJlcHIobGIpKTsKLQkKLQlpZiAobGItPmxiX3R5cGUgPT0gTkFNRSkgewotCQlmb3IgKGkgPSAwOyBpIDwgZy0+Z19uZGZhczsgaSsrKSB7Ci0JCQlpZiAoc3RyY21wKGxiLT5sYl9zdHIsIGctPmdfZGZhW2ldLmRfbmFtZSkgPT0gMCkgewotCQkJCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCQkJCXByaW50ZigKLQkJCQkJICAgICJMYWJlbCAlcyBpcyBub24tdGVybWluYWwgJWQuXG4iLAotCQkJCQkgICAgbGItPmxiX3N0ciwKLQkJCQkJICAgIGctPmdfZGZhW2ldLmRfdHlwZSk7Ci0JCQkJbGItPmxiX3R5cGUgPSBnLT5nX2RmYVtpXS5kX3R5cGU7Ci0JCQkJZnJlZShsYi0+bGJfc3RyKTsKLQkJCQlsYi0+bGJfc3RyID0gTlVMTDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IChpbnQpTl9UT0tFTlM7IGkrKykgewotCQkJaWYgKHN0cmNtcChsYi0+bGJfc3RyLCBfUHlQYXJzZXJfVG9rZW5OYW1lc1tpXSkgPT0gMCkgewotCQkJCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCQkJCXByaW50ZigiTGFiZWwgJXMgaXMgdGVybWluYWwgJWQuXG4iLAotCQkJCQkJbGItPmxiX3N0ciwgaSk7Ci0JCQkJbGItPmxiX3R5cGUgPSBpOwotCQkJCWZyZWUobGItPmxiX3N0cik7Ci0JCQkJbGItPmxiX3N0ciA9IE5VTEw7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXByaW50ZigiQ2FuJ3QgdHJhbnNsYXRlIE5BTUUgbGFiZWwgJyVzJ1xuIiwgbGItPmxiX3N0cik7Ci0JCXJldHVybjsKLQl9Ci0JCi0JaWYgKGxiLT5sYl90eXBlID09IFNUUklORykgewotCQlpZiAoaXNhbHBoYShQeV9DSEFSTUFTSyhsYi0+bGJfc3RyWzFdKSkgfHwKLQkJICAgIGxiLT5sYl9zdHJbMV0gPT0gJ18nKSB7Ci0JCQljaGFyICpwOwotCQkJY2hhciAqc3JjOwotCQkJY2hhciAqZGVzdDsKLQkJCXNpemVfdCBuYW1lX2xlbjsKLQkJCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCQkJcHJpbnRmKCJMYWJlbCAlcyBpcyBhIGtleXdvcmRcbiIsIGxiLT5sYl9zdHIpOwotCQkJbGItPmxiX3R5cGUgPSBOQU1FOwotCQkJc3JjID0gbGItPmxiX3N0ciArIDE7Ci0JCQlwID0gc3RyY2hyKHNyYywgJ1wnJyk7Ci0JCQlpZiAocCkKLQkJCQluYW1lX2xlbiA9IHAgLSBzcmM7Ci0JCQllbHNlCi0JCQkJbmFtZV9sZW4gPSBzdHJsZW4oc3JjKTsKLQkJCWRlc3QgPSAoY2hhciAqKW1hbGxvYyhuYW1lX2xlbiArIDEpOwotCQkJaWYgKCFkZXN0KSB7Ci0JCQkJcHJpbnRmKCJDYW4ndCBhbGxvYyBkZXN0ICclcydcbiIsIHNyYyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJc3RybmNweShkZXN0LCBzcmMsIG5hbWVfbGVuKTsKLQkJCWRlc3RbbmFtZV9sZW5dID0gJ1wwJzsKLQkJCWZyZWUobGItPmxiX3N0cik7Ci0JCQlsYi0+bGJfc3RyID0gZGVzdDsKLQkJfQotCQllbHNlIGlmIChsYi0+bGJfc3RyWzJdID09IGxiLT5sYl9zdHJbMF0pIHsKLQkJCWludCB0eXBlID0gKGludCkgUHlUb2tlbl9PbmVDaGFyKGxiLT5sYl9zdHJbMV0pOwotCQkJaWYgKHR5cGUgIT0gT1ApIHsKLQkJCQlsYi0+bGJfdHlwZSA9IHR5cGU7Ci0JCQkJZnJlZShsYi0+bGJfc3RyKTsKLQkJCQlsYi0+bGJfc3RyID0gTlVMTDsKLQkJCX0KLQkJCWVsc2UKLQkJCQlwcmludGYoIlVua25vd24gT1AgbGFiZWwgJXNcbiIsCi0JCQkJCWxiLT5sYl9zdHIpOwotCQl9Ci0JCWVsc2UgaWYgKGxiLT5sYl9zdHJbMl0gJiYgbGItPmxiX3N0clszXSA9PSBsYi0+bGJfc3RyWzBdKSB7Ci0JCQlpbnQgdHlwZSA9IChpbnQpIFB5VG9rZW5fVHdvQ2hhcnMobGItPmxiX3N0clsxXSwKLQkJCQkJCSAgIGxiLT5sYl9zdHJbMl0pOwotCQkJaWYgKHR5cGUgIT0gT1ApIHsKLQkJCQlsYi0+bGJfdHlwZSA9IHR5cGU7Ci0JCQkJZnJlZShsYi0+bGJfc3RyKTsKLQkJCQlsYi0+bGJfc3RyID0gTlVMTDsKLQkJCX0KLQkJCWVsc2UKLQkJCQlwcmludGYoIlVua25vd24gT1AgbGFiZWwgJXNcbiIsCi0JCQkJCWxiLT5sYl9zdHIpOwotCQl9Ci0JCWVsc2UgaWYgKGxiLT5sYl9zdHJbMl0gJiYgbGItPmxiX3N0clszXSAmJiBsYi0+bGJfc3RyWzRdID09IGxiLT5sYl9zdHJbMF0pIHsKLQkJCWludCB0eXBlID0gKGludCkgUHlUb2tlbl9UaHJlZUNoYXJzKGxiLT5sYl9zdHJbMV0sCi0JCQkJCQkJICAgIGxiLT5sYl9zdHJbMl0sCi0JCQkJCQkJICAgIGxiLT5sYl9zdHJbM10pOwotCQkJaWYgKHR5cGUgIT0gT1ApIHsKLQkJCQlsYi0+bGJfdHlwZSA9IHR5cGU7Ci0JCQkJZnJlZShsYi0+bGJfc3RyKTsKLQkJCQlsYi0+bGJfc3RyID0gTlVMTDsKLQkJCX0KLQkJCWVsc2UKLQkJCQlwcmludGYoIlVua25vd24gT1AgbGFiZWwgJXNcbiIsCi0JCQkJCWxiLT5sYl9zdHIpOwotCQl9Ci0JCWVsc2UKLQkJCXByaW50ZigiQ2FuJ3QgdHJhbnNsYXRlIFNUUklORyBsYWJlbCAlc1xuIiwKLQkJCQlsYi0+bGJfc3RyKTsKLQl9Ci0JZWxzZQotCQlwcmludGYoIkNhbid0IHRyYW5zbGF0ZSBsYWJlbCAnJXMnXG4iLAotCQkgICAgICAgUHlHcmFtbWFyX0xhYmVsUmVwcihsYikpOworICAgIGludCBpOworCisgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgcHJpbnRmKCJUcmFuc2xhdGluZyBsYWJlbCAlcyAuLi5cbiIsIFB5R3JhbW1hcl9MYWJlbFJlcHIobGIpKTsKKworICAgIGlmIChsYi0+bGJfdHlwZSA9PSBOQU1FKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnLT5nX25kZmFzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAobGItPmxiX3N0ciwgZy0+Z19kZmFbaV0uZF9uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgIkxhYmVsICVzIGlzIG5vbi10ZXJtaW5hbCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBsYi0+bGJfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgZy0+Z19kZmFbaV0uZF90eXBlKTsKKyAgICAgICAgICAgICAgICBsYi0+bGJfdHlwZSA9IGctPmdfZGZhW2ldLmRfdHlwZTsKKyAgICAgICAgICAgICAgICBmcmVlKGxiLT5sYl9zdHIpOworICAgICAgICAgICAgICAgIGxiLT5sYl9zdHIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClOX1RPS0VOUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKGxiLT5sYl9zdHIsIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW2ldKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJMYWJlbCAlcyBpcyB0ZXJtaW5hbCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBsYi0+bGJfc3RyLCBpKTsKKyAgICAgICAgICAgICAgICBsYi0+bGJfdHlwZSA9IGk7CisgICAgICAgICAgICAgICAgZnJlZShsYi0+bGJfc3RyKTsKKyAgICAgICAgICAgICAgICBsYi0+bGJfc3RyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJDYW4ndCB0cmFuc2xhdGUgTkFNRSBsYWJlbCAnJXMnXG4iLCBsYi0+bGJfc3RyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChsYi0+bGJfdHlwZSA9PSBTVFJJTkcpIHsKKyAgICAgICAgaWYgKGlzYWxwaGEoUHlfQ0hBUk1BU0sobGItPmxiX3N0clsxXSkpIHx8CisgICAgICAgICAgICBsYi0+bGJfc3RyWzFdID09ICdfJykgeworICAgICAgICAgICAgY2hhciAqcDsKKyAgICAgICAgICAgIGNoYXIgKnNyYzsKKyAgICAgICAgICAgIGNoYXIgKmRlc3Q7CisgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW47CisgICAgICAgICAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiTGFiZWwgJXMgaXMgYSBrZXl3b3JkXG4iLCBsYi0+bGJfc3RyKTsKKyAgICAgICAgICAgIGxiLT5sYl90eXBlID0gTkFNRTsKKyAgICAgICAgICAgIHNyYyA9IGxiLT5sYl9zdHIgKyAxOworICAgICAgICAgICAgcCA9IHN0cmNocihzcmMsICdcJycpOworICAgICAgICAgICAgaWYgKHApCisgICAgICAgICAgICAgICAgbmFtZV9sZW4gPSBwIC0gc3JjOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5hbWVfbGVuID0gc3RybGVuKHNyYyk7CisgICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiltYWxsb2MobmFtZV9sZW4gKyAxKTsKKyAgICAgICAgICAgIGlmICghZGVzdCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiQ2FuJ3QgYWxsb2MgZGVzdCAnJXMnXG4iLCBzcmMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm5jcHkoZGVzdCwgc3JjLCBuYW1lX2xlbik7CisgICAgICAgICAgICBkZXN0W25hbWVfbGVuXSA9ICdcMCc7CisgICAgICAgICAgICBmcmVlKGxiLT5sYl9zdHIpOworICAgICAgICAgICAgbGItPmxiX3N0ciA9IGRlc3Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGItPmxiX3N0clsyXSA9PSBsYi0+bGJfc3RyWzBdKSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IChpbnQpIFB5VG9rZW5fT25lQ2hhcihsYi0+bGJfc3RyWzFdKTsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IE9QKSB7CisgICAgICAgICAgICAgICAgbGItPmxiX3R5cGUgPSB0eXBlOworICAgICAgICAgICAgICAgIGZyZWUobGItPmxiX3N0cik7CisgICAgICAgICAgICAgICAgbGItPmxiX3N0ciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJVbmtub3duIE9QIGxhYmVsICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBsYi0+bGJfc3RyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsYi0+bGJfc3RyWzJdICYmIGxiLT5sYl9zdHJbM10gPT0gbGItPmxiX3N0clswXSkgeworICAgICAgICAgICAgaW50IHR5cGUgPSAoaW50KSBQeVRva2VuX1R3b0NoYXJzKGxiLT5sYl9zdHJbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYi0+bGJfc3RyWzJdKTsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IE9QKSB7CisgICAgICAgICAgICAgICAgbGItPmxiX3R5cGUgPSB0eXBlOworICAgICAgICAgICAgICAgIGZyZWUobGItPmxiX3N0cik7CisgICAgICAgICAgICAgICAgbGItPmxiX3N0ciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJVbmtub3duIE9QIGxhYmVsICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBsYi0+bGJfc3RyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsYi0+bGJfc3RyWzJdICYmIGxiLT5sYl9zdHJbM10gJiYgbGItPmxiX3N0cls0XSA9PSBsYi0+bGJfc3RyWzBdKSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IChpbnQpIFB5VG9rZW5fVGhyZWVDaGFycyhsYi0+bGJfc3RyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGItPmxiX3N0clsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxiLT5sYl9zdHJbM10pOworICAgICAgICAgICAgaWYgKHR5cGUgIT0gT1ApIHsKKyAgICAgICAgICAgICAgICBsYi0+bGJfdHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgZnJlZShsYi0+bGJfc3RyKTsKKyAgICAgICAgICAgICAgICBsYi0+bGJfc3RyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIlVua25vd24gT1AgbGFiZWwgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGxiLT5sYl9zdHIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiQ2FuJ3QgdHJhbnNsYXRlIFNUUklORyBsYWJlbCAlc1xuIiwKKyAgICAgICAgICAgICAgICBsYi0+bGJfc3RyKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcmludGYoIkNhbid0IHRyYW5zbGF0ZSBsYWJlbCAnJXMnXG4iLAorICAgICAgICAgICAgICAgUHlHcmFtbWFyX0xhYmVsUmVwcihsYikpOwogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2dyYW1tYXIxLmMgYi9QYXJzZXIvZ3JhbW1hcjEuYwppbmRleCBiNzY3MTlhLi4xZjdkMjY0IDEwMDY0NAotLS0gYS9QYXJzZXIvZ3JhbW1hcjEuYworKysgYi9QYXJzZXIvZ3JhbW1hcjEuYwpAQCAtMTEsNDcgKzExLDQ3IEBACiBkZmEgKgogUHlHcmFtbWFyX0ZpbmRERkEoZ3JhbW1hciAqZywgcmVnaXN0ZXIgaW50IHR5cGUpCiB7Ci0JcmVnaXN0ZXIgZGZhICpkOworICAgIHJlZ2lzdGVyIGRmYSAqZDsKICNpZiAxCi0JLyogTWFzc2l2ZSBzcGVlZC11cCAqLwotCWQgPSAmZy0+Z19kZmFbdHlwZSAtIE5UX09GRlNFVF07Ci0JYXNzZXJ0KGQtPmRfdHlwZSA9PSB0eXBlKTsKLQlyZXR1cm4gZDsKKyAgICAvKiBNYXNzaXZlIHNwZWVkLXVwICovCisgICAgZCA9ICZnLT5nX2RmYVt0eXBlIC0gTlRfT0ZGU0VUXTsKKyAgICBhc3NlcnQoZC0+ZF90eXBlID09IHR5cGUpOworICAgIHJldHVybiBkOwogI2Vsc2UKLQkvKiBPbGQsIHNsb3cgdmVyc2lvbiAqLwotCXJlZ2lzdGVyIGludCBpOwotCQotCWZvciAoaSA9IGctPmdfbmRmYXMsIGQgPSBnLT5nX2RmYTsgLS1pID49IDA7IGQrKykgewotCQlpZiAoZC0+ZF90eXBlID09IHR5cGUpCi0JCQlyZXR1cm4gZDsKLQl9Ci0JYXNzZXJ0KDApOwotCS8qIE5PVFJFQUNIRUQgKi8KKyAgICAvKiBPbGQsIHNsb3cgdmVyc2lvbiAqLworICAgIHJlZ2lzdGVyIGludCBpOworCisgICAgZm9yIChpID0gZy0+Z19uZGZhcywgZCA9IGctPmdfZGZhOyAtLWkgPj0gMDsgZCsrKSB7CisgICAgICAgIGlmIChkLT5kX3R5cGUgPT0gdHlwZSkKKyAgICAgICAgICAgIHJldHVybiBkOworICAgIH0KKyAgICBhc3NlcnQoMCk7CisgICAgLyogTk9UUkVBQ0hFRCAqLwogI2VuZGlmCiB9CiAKIGNoYXIgKgogUHlHcmFtbWFyX0xhYmVsUmVwcihsYWJlbCAqbGIpCiB7Ci0Jc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0JCi0JaWYgKGxiLT5sYl90eXBlID09IEVORE1BUktFUikKLQkJcmV0dXJuICJFTVBUWSI7Ci0JZWxzZSBpZiAoSVNOT05URVJNSU5BTChsYi0+bGJfdHlwZSkpIHsKLQkJaWYgKGxiLT5sYl9zdHIgPT0gTlVMTCkgewotCQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiTlQlZCIsIGxiLT5sYl90eXBlKTsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGxiLT5sYl9zdHI7Ci0JfQotCWVsc2UgewotCQlpZiAobGItPmxiX3N0ciA9PSBOVUxMKQotCQkJcmV0dXJuIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW2xiLT5sYl90eXBlXTsKLQkJZWxzZSB7Ci0JCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlLjMycyglLjMycykiLAotCQkJCV9QeVBhcnNlcl9Ub2tlbk5hbWVzW2xiLT5sYl90eXBlXSwgbGItPmxiX3N0cik7Ci0JCQlyZXR1cm4gYnVmOwotCQl9Ci0JfQorICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDBdOworCisgICAgaWYgKGxiLT5sYl90eXBlID09IEVORE1BUktFUikKKyAgICAgICAgcmV0dXJuICJFTVBUWSI7CisgICAgZWxzZSBpZiAoSVNOT05URVJNSU5BTChsYi0+bGJfdHlwZSkpIHsKKyAgICAgICAgaWYgKGxiLT5sYl9zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiTlQlZCIsIGxiLT5sYl90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGxiLT5sYl9zdHI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobGItPmxiX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW2xiLT5sYl90eXBlXTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlLjMycyglLjMycykiLAorICAgICAgICAgICAgICAgIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW2xiLT5sYl90eXBlXSwgbGItPmxiX3N0cik7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2ludHJjaGVjay5jIGIvUGFyc2VyL2ludHJjaGVjay5jCmluZGV4IDEzNTYxOTEuLjFjODg4YTUgMTAwNjQ0Ci0tLSBhL1BhcnNlci9pbnRyY2hlY2suYworKysgYi9QYXJzZXIvaW50cmNoZWNrLmMKQEAgLTIxLDcgKzIxLDcgQEAKIGludAogUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCh2b2lkKQogewotCV93eWllbGQoKTsKKyAgICBfd3lpZWxkKCk7CiB9CiAKICNkZWZpbmUgT0sKQEAgLTQ3LDcgKzQ3LDcgQEAKIHZvaWQKIFB5T1NfSW5pdEludGVycnVwdHModm9pZCkKIHsKLQlfZ28zMl93YW50X2N0cmxfYnJlYWsoMSAvKiBUUlVFICovKTsKKyAgICBfZ28zMl93YW50X2N0cmxfYnJlYWsoMSAvKiBUUlVFICovKTsKIH0KIAogdm9pZApAQCAtNTgsNyArNTgsNyBAQAogaW50CiBQeU9TX0ludGVycnVwdE9jY3VycmVkKHZvaWQpCiB7Ci0JcmV0dXJuIF9nbzMyX3dhc19jdHJsX2JyZWFrX2hpdCgpOworICAgIHJldHVybiBfZ28zMl93YXNfY3RybF9icmVha19oaXQoKTsKIH0KIAogI2Vsc2UgLyogIV9fR05VQ19fICovCkBAIC03OCwxMiArNzgsMTIgQEAKIGludAogUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCh2b2lkKQogewotCWludCBpbnRlcnJ1cHRlZCA9IDA7Ci0Jd2hpbGUgKGtiaGl0KCkpIHsKLQkJaWYgKGdldGNoKCkgPT0gJ1wwMDMnKQotCQkJaW50ZXJydXB0ZWQgPSAxOwotCX0KLQlyZXR1cm4gaW50ZXJydXB0ZWQ7CisgICAgaW50IGludGVycnVwdGVkID0gMDsKKyAgICB3aGlsZSAoa2JoaXQoKSkgeworICAgICAgICBpZiAoZ2V0Y2goKSA9PSAnXDAwMycpCisgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IDE7CisgICAgfQorICAgIHJldHVybiBpbnRlcnJ1cHRlZDsKIH0KIAogI2VuZGlmIC8qIF9fR05VQ19fICovCkBAIC0xMDYsNyArMTA2LDcgQEAKIHZvaWQKIFB5RXJyX1NldEludGVycnVwdCh2b2lkKQogewotCWludGVycnVwdGVkID0gMTsKKyAgICBpbnRlcnJ1cHRlZCA9IDE7CiB9CiAKIGV4dGVybiBpbnQgUHlFcnJfQ2hlY2tTaWduYWxzKHZvaWQpOwpAQCAtMTE0LDMyICsxMTQsMzIgQEAKIHN0YXRpYyBpbnQKIGNoZWNrc2lnbmFsc193aXRoYXJnKHZvaWQgKiBhcmcpCiB7Ci0JcmV0dXJuIFB5RXJyX0NoZWNrU2lnbmFscygpOworICAgIHJldHVybiBQeUVycl9DaGVja1NpZ25hbHMoKTsKIH0KIAogc3RhdGljIHZvaWQKIGludGNhdGNoZXIoaW50IHNpZykKIHsKLQlleHRlcm4gdm9pZCBQeV9FeGl0KGludCk7Ci0Jc3RhdGljIGNoYXIgbWVzc2FnZVtdID0KKyAgICBleHRlcm4gdm9pZCBQeV9FeGl0KGludCk7CisgICAgc3RhdGljIGNoYXIgbWVzc2FnZVtdID0KICJweXRob246IHRvIGludGVycnVwdCBhIHRydWx5IGhhbmdpbmcgUHl0aG9uIHByb2dyYW0sIGludGVycnVwdCBvbmNlIG1vcmUuXG4iOwotCXN3aXRjaCAoaW50ZXJydXB0ZWQrKykgewotCWNhc2UgMDoKLQkJYnJlYWs7Ci0JY2FzZSAxOgorICAgIHN3aXRjaCAoaW50ZXJydXB0ZWQrKykgeworICAgIGNhc2UgMDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgogI2lmZGVmIFJJU0NPUwotCQlmcHJpbnRmKHN0ZGVyciwgbWVzc2FnZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCBtZXNzYWdlKTsKICNlbHNlCi0JCXdyaXRlKDIsIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSk7CisgICAgICAgIHdyaXRlKDIsIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSk7CiAjZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpbnRlcnJ1cHRlZCA9IDA7Ci0JCVB5X0V4aXQoMSk7Ci0JCWJyZWFrOwotCX0KLQlQeU9TX3NldHNpZyhTSUdJTlQsIGludGNhdGNoZXIpOwotCVB5X0FkZFBlbmRpbmdDYWxsKGNoZWNrc2lnbmFsc193aXRoYXJnLCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpbnRlcnJ1cHRlZCA9IDA7CisgICAgICAgIFB5X0V4aXQoMSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBQeU9TX3NldHNpZyhTSUdJTlQsIGludGNhdGNoZXIpOworICAgIFB5X0FkZFBlbmRpbmdDYWxsKGNoZWNrc2lnbmFsc193aXRoYXJnLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgKCpvbGRfc2lnaW50aGFuZGxlcikoaW50KSA9IFNJR19ERkw7CkBAIC0xNDcsMjMgKzE0NywyMyBAQAogdm9pZAogUHlPU19Jbml0SW50ZXJydXB0cyh2b2lkKQogewotCWlmICgob2xkX3NpZ2ludGhhbmRsZXIgPSBQeU9TX3NldHNpZyhTSUdJTlQsIFNJR19JR04pKSAhPSBTSUdfSUdOKQotCQlQeU9TX3NldHNpZyhTSUdJTlQsIGludGNhdGNoZXIpOworICAgIGlmICgob2xkX3NpZ2ludGhhbmRsZXIgPSBQeU9TX3NldHNpZyhTSUdJTlQsIFNJR19JR04pKSAhPSBTSUdfSUdOKQorICAgICAgICBQeU9TX3NldHNpZyhTSUdJTlQsIGludGNhdGNoZXIpOwogfQogCiB2b2lkCiBQeU9TX0ZpbmlJbnRlcnJ1cHRzKHZvaWQpCiB7Ci0JUHlPU19zZXRzaWcoU0lHSU5ULCBvbGRfc2lnaW50aGFuZGxlcik7CisgICAgUHlPU19zZXRzaWcoU0lHSU5ULCBvbGRfc2lnaW50aGFuZGxlcik7CiB9CiAKIGludAogUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCh2b2lkKQogewotCWlmICghaW50ZXJydXB0ZWQpCi0JCXJldHVybiAwOwotCWludGVycnVwdGVkID0gMDsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIWludGVycnVwdGVkKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpbnRlcnJ1cHRlZCA9IDA7CisgICAgcmV0dXJuIDE7CiB9CiAKICNlbmRpZiAvKiAhT0sgKi8KQEAgLTE3Miw3ICsxNzIsNyBAQAogUHlPU19BZnRlckZvcmsodm9pZCkKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5RXZhbF9SZUluaXRUaHJlYWRzKCk7Ci0JUHlUaHJlYWRfUmVJbml0VExTKCk7CisgICAgUHlFdmFsX1JlSW5pdFRocmVhZHMoKTsKKyAgICBQeVRocmVhZF9SZUluaXRUTFMoKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2xpc3Rub2RlLmMgYi9QYXJzZXIvbGlzdG5vZGUuYwppbmRleCBjMGIzYjY2Li5iNWY4YWQyIDEwMDY0NAotLS0gYS9QYXJzZXIvbGlzdG5vZGUuYworKysgYi9QYXJzZXIvbGlzdG5vZGUuYwpAQCAtMTIsNyArMTIsNyBAQAogdm9pZAogUHlOb2RlX0xpc3RUcmVlKG5vZGUgKm4pCiB7Ci0JbGlzdG5vZGUoc3Rkb3V0LCBuKTsKKyAgICBsaXN0bm9kZShzdGRvdXQsIG4pOwogfQogCiBzdGF0aWMgaW50IGxldmVsLCBhdGJvbDsKQEAgLTIwLDQ3ICsyMCw0NyBAQAogc3RhdGljIHZvaWQKIGxpc3Rub2RlKEZJTEUgKmZwLCBub2RlICpuKQogewotCWxldmVsID0gMDsKLQlhdGJvbCA9IDE7Ci0JbGlzdDFub2RlKGZwLCBuKTsKKyAgICBsZXZlbCA9IDA7CisgICAgYXRib2wgPSAxOworICAgIGxpc3Qxbm9kZShmcCwgbik7CiB9CiAKIHN0YXRpYyB2b2lkCiBsaXN0MW5vZGUoRklMRSAqZnAsIG5vZGUgKm4pCiB7Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuOwotCWlmIChJU05PTlRFUk1JTkFMKFRZUEUobikpKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgTkNIKG4pOyBpKyspCi0JCQlsaXN0MW5vZGUoZnAsIENISUxEKG4sIGkpKTsKLQl9Ci0JZWxzZSBpZiAoSVNURVJNSU5BTChUWVBFKG4pKSkgewotCQlzd2l0Y2ggKFRZUEUobikpIHsKLQkJY2FzZSBJTkRFTlQ6Ci0JCQkrK2xldmVsOwotCQkJYnJlYWs7Ci0JCWNhc2UgREVERU5UOgotCQkJLS1sZXZlbDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKGF0Ym9sKSB7Ci0JCQkJaW50IGk7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGxldmVsOyArK2kpCi0JCQkJCWZwcmludGYoZnAsICJcdCIpOwotCQkJCWF0Ym9sID0gMDsKLQkJCX0KLQkJCWlmIChUWVBFKG4pID09IE5FV0xJTkUpIHsKLQkJCQlpZiAoU1RSKG4pICE9IE5VTEwpCi0JCQkJCWZwcmludGYoZnAsICIlcyIsIFNUUihuKSk7Ci0JCQkJZnByaW50ZihmcCwgIlxuIik7Ci0JCQkJYXRib2wgPSAxOwotCQkJfQotCQkJZWxzZQotCQkJCWZwcmludGYoZnAsICIlcyAiLCBTVFIobikpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZWxzZQotCQlmcHJpbnRmKGZwLCAiPyAiKTsKKyAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKElTTk9OVEVSTUlOQUwoVFlQRShuKSkpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQ0gobik7IGkrKykKKyAgICAgICAgICAgIGxpc3Qxbm9kZShmcCwgQ0hJTEQobiwgaSkpOworICAgIH0KKyAgICBlbHNlIGlmIChJU1RFUk1JTkFMKFRZUEUobikpKSB7CisgICAgICAgIHN3aXRjaCAoVFlQRShuKSkgeworICAgICAgICBjYXNlIElOREVOVDoKKyAgICAgICAgICAgICsrbGV2ZWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBERURFTlQ6CisgICAgICAgICAgICAtLWxldmVsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoYXRib2wpIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGV2ZWw7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0Iik7CisgICAgICAgICAgICAgICAgYXRib2wgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRZUEUobikgPT0gTkVXTElORSkgeworICAgICAgICAgICAgICAgIGlmIChTVFIobikgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiVzIiwgU1RSKG4pKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXG4iKTsKKyAgICAgICAgICAgICAgICBhdGJvbCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiVzICIsIFNUUihuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIGZwcmludGYoZnAsICI/ICIpOwogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL21ldGFncmFtbWFyLmMgYi9QYXJzZXIvbWV0YWdyYW1tYXIuYwppbmRleCBiNjFiYzZkLi41MzgxMGI4IDEwMDY0NAotLS0gYS9QYXJzZXIvbWV0YWdyYW1tYXIuYworKysgYi9QYXJzZXIvbWV0YWdyYW1tYXIuYwpAQCAtNCwxNTIgKzQsMTUyIEBACiAjaW5jbHVkZSAiZ3JhbW1hci5oIgogI2luY2x1ZGUgInBnZW4uaCIKIHN0YXRpYyBhcmMgYXJjc18wXzBbM10gPSB7Ci0JezIsIDB9LAotCXszLCAwfSwKLQl7NCwgMX0sCisgICAgezIsIDB9LAorICAgIHszLCAwfSwKKyAgICB7NCwgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzBfMVsxXSA9IHsKLQl7MCwgMX0sCisgICAgezAsIDF9LAogfTsKIHN0YXRpYyBzdGF0ZSBzdGF0ZXNfMFsyXSA9IHsKLQl7MywgYXJjc18wXzB9LAotCXsxLCBhcmNzXzBfMX0sCisgICAgezMsIGFyY3NfMF8wfSwKKyAgICB7MSwgYXJjc18wXzF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xXzBbMV0gPSB7Ci0JezUsIDF9LAorICAgIHs1LCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMV8xWzFdID0gewotCXs2LCAyfSwKKyAgICB7NiwgMn0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzFfMlsxXSA9IHsKLQl7NywgM30sCisgICAgezcsIDN9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xXzNbMV0gPSB7Ci0JezMsIDR9LAorICAgIHszLCA0fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMV80WzFdID0gewotCXswLCA0fSwKKyAgICB7MCwgNH0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc18xWzVdID0gewotCXsxLCBhcmNzXzFfMH0sCi0JezEsIGFyY3NfMV8xfSwKLQl7MSwgYXJjc18xXzJ9LAotCXsxLCBhcmNzXzFfM30sCi0JezEsIGFyY3NfMV80fSwKKyAgICB7MSwgYXJjc18xXzB9LAorICAgIHsxLCBhcmNzXzFfMX0sCisgICAgezEsIGFyY3NfMV8yfSwKKyAgICB7MSwgYXJjc18xXzN9LAorICAgIHsxLCBhcmNzXzFfNH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzJfMFsxXSA9IHsKLQl7OCwgMX0sCisgICAgezgsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18yXzFbMl0gPSB7Ci0JezksIDB9LAotCXswLCAxfSwKKyAgICB7OSwgMH0sCisgICAgezAsIDF9LAogfTsKIHN0YXRpYyBzdGF0ZSBzdGF0ZXNfMlsyXSA9IHsKLQl7MSwgYXJjc18yXzB9LAotCXsyLCBhcmNzXzJfMX0sCisgICAgezEsIGFyY3NfMl8wfSwKKyAgICB7MiwgYXJjc18yXzF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18zXzBbMV0gPSB7Ci0JezEwLCAxfSwKKyAgICB7MTAsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18zXzFbMl0gPSB7Ci0JezEwLCAxfSwKLQl7MCwgMX0sCisgICAgezEwLCAxfSwKKyAgICB7MCwgMX0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc18zWzJdID0gewotCXsxLCBhcmNzXzNfMH0sCi0JezIsIGFyY3NfM18xfSwKKyAgICB7MSwgYXJjc18zXzB9LAorICAgIHsyLCBhcmNzXzNfMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzRfMFsyXSA9IHsKLQl7MTEsIDF9LAotCXsxMywgMn0sCisgICAgezExLCAxfSwKKyAgICB7MTMsIDJ9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180XzFbMV0gPSB7Ci0JezcsIDN9LAorICAgIHs3LCAzfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNF8yWzNdID0gewotCXsxNCwgNH0sCi0JezE1LCA0fSwKLQl7MCwgMn0sCisgICAgezE0LCA0fSwKKyAgICB7MTUsIDR9LAorICAgIHswLCAyfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNF8zWzFdID0gewotCXsxMiwgNH0sCisgICAgezEyLCA0fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNF80WzFdID0gewotCXswLCA0fSwKKyAgICB7MCwgNH0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc180WzVdID0gewotCXsyLCBhcmNzXzRfMH0sCi0JezEsIGFyY3NfNF8xfSwKLQl7MywgYXJjc180XzJ9LAotCXsxLCBhcmNzXzRfM30sCi0JezEsIGFyY3NfNF80fSwKKyAgICB7MiwgYXJjc180XzB9LAorICAgIHsxLCBhcmNzXzRfMX0sCisgICAgezMsIGFyY3NfNF8yfSwKKyAgICB7MSwgYXJjc180XzN9LAorICAgIHsxLCBhcmNzXzRfNH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzVfMFszXSA9IHsKLQl7NSwgMX0sCi0JezE2LCAxfSwKLQl7MTcsIDJ9LAorICAgIHs1LCAxfSwKKyAgICB7MTYsIDF9LAorICAgIHsxNywgMn0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzVfMVsxXSA9IHsKLQl7MCwgMX0sCisgICAgezAsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc181XzJbMV0gPSB7Ci0JezcsIDN9LAorICAgIHs3LCAzfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNV8zWzFdID0gewotCXsxOCwgMX0sCisgICAgezE4LCAxfSwKIH07CiBzdGF0aWMgc3RhdGUgc3RhdGVzXzVbNF0gPSB7Ci0JezMsIGFyY3NfNV8wfSwKLQl7MSwgYXJjc181XzF9LAotCXsxLCBhcmNzXzVfMn0sCi0JezEsIGFyY3NfNV8zfSwKKyAgICB7MywgYXJjc181XzB9LAorICAgIHsxLCBhcmNzXzVfMX0sCisgICAgezEsIGFyY3NfNV8yfSwKKyAgICB7MSwgYXJjc181XzN9LAogfTsKIHN0YXRpYyBkZmEgZGZhc1s2XSA9IHsKLQl7MjU2LCAiTVNUQVJUIiwgMCwgMiwgc3RhdGVzXzAsCi0JICJcMDcwXDAwMFwwMDAifSwKLQl7MjU3LCAiUlVMRSIsIDAsIDUsIHN0YXRlc18xLAotCSAiXDA0MFwwMDBcMDAwIn0sCi0JezI1OCwgIlJIUyIsIDAsIDIsIHN0YXRlc18yLAotCSAiXDA0MFwwMTBcMDAzIn0sCi0JezI1OSwgIkFMVCIsIDAsIDIsIHN0YXRlc18zLAotCSAiXDA0MFwwMTBcMDAzIn0sCi0JezI2MCwgIklURU0iLCAwLCA1LCBzdGF0ZXNfNCwKLQkgIlwwNDBcMDEwXDAwMyJ9LAotCXsyNjEsICJBVE9NIiwgMCwgNCwgc3RhdGVzXzUsCi0JICJcMDQwXDAwMFwwMDMifSwKKyAgICB7MjU2LCAiTVNUQVJUIiwgMCwgMiwgc3RhdGVzXzAsCisgICAgICJcMDcwXDAwMFwwMDAifSwKKyAgICB7MjU3LCAiUlVMRSIsIDAsIDUsIHN0YXRlc18xLAorICAgICAiXDA0MFwwMDBcMDAwIn0sCisgICAgezI1OCwgIlJIUyIsIDAsIDIsIHN0YXRlc18yLAorICAgICAiXDA0MFwwMTBcMDAzIn0sCisgICAgezI1OSwgIkFMVCIsIDAsIDIsIHN0YXRlc18zLAorICAgICAiXDA0MFwwMTBcMDAzIn0sCisgICAgezI2MCwgIklURU0iLCAwLCA1LCBzdGF0ZXNfNCwKKyAgICAgIlwwNDBcMDEwXDAwMyJ9LAorICAgIHsyNjEsICJBVE9NIiwgMCwgNCwgc3RhdGVzXzUsCisgICAgICJcMDQwXDAwMFwwMDMifSwKIH07CiBzdGF0aWMgbGFiZWwgbGFiZWxzWzE5XSA9IHsKLQl7MCwgIkVNUFRZIn0sCi0JezI1NiwgMH0sCi0JezI1NywgMH0sCi0JezQsIDB9LAotCXswLCAwfSwKLQl7MSwgMH0sCi0JezExLCAwfSwKLQl7MjU4LCAwfSwKLQl7MjU5LCAwfSwKLQl7MTgsIDB9LAotCXsyNjAsIDB9LAotCXs5LCAwfSwKLQl7MTAsIDB9LAotCXsyNjEsIDB9LAotCXsxNiwgMH0sCi0JezE0LCAwfSwKLQl7MywgMH0sCi0JezcsIDB9LAotCXs4LCAwfSwKKyAgICB7MCwgIkVNUFRZIn0sCisgICAgezI1NiwgMH0sCisgICAgezI1NywgMH0sCisgICAgezQsIDB9LAorICAgIHswLCAwfSwKKyAgICB7MSwgMH0sCisgICAgezExLCAwfSwKKyAgICB7MjU4LCAwfSwKKyAgICB7MjU5LCAwfSwKKyAgICB7MTgsIDB9LAorICAgIHsyNjAsIDB9LAorICAgIHs5LCAwfSwKKyAgICB7MTAsIDB9LAorICAgIHsyNjEsIDB9LAorICAgIHsxNiwgMH0sCisgICAgezE0LCAwfSwKKyAgICB7MywgMH0sCisgICAgezcsIDB9LAorICAgIHs4LCAwfSwKIH07CiBzdGF0aWMgZ3JhbW1hciBfUHlQYXJzZXJfR3JhbW1hciA9IHsKLQk2LAotCWRmYXMsCi0JezE5LCBsYWJlbHN9LAotCTI1NgorICAgIDYsCisgICAgZGZhcywKKyAgICB7MTksIGxhYmVsc30sCisgICAgMjU2CiB9OwogCiBncmFtbWFyICoKIG1ldGFfZ3JhbW1hcih2b2lkKQogewotCXJldHVybiAmX1B5UGFyc2VyX0dyYW1tYXI7CisgICAgcmV0dXJuICZfUHlQYXJzZXJfR3JhbW1hcjsKIH0KIAogZ3JhbW1hciAqCmRpZmYgLS1naXQgYS9QYXJzZXIvbXlyZWFkbGluZS5jIGIvUGFyc2VyL215cmVhZGxpbmUuYwppbmRleCA0MzNmOTk1Li42ZDkwZDIwIDEwMDY0NAotLS0gYS9QYXJzZXIvbXlyZWFkbGluZS5jCisrKyBiL1BhcnNlci9teXJlYWRsaW5lLmMKQEAgLTM5LDY0ICszOSw2NCBAQAogc3RhdGljIGludAogbXlfZmdldHMoY2hhciAqYnVmLCBpbnQgbGVuLCBGSUxFICpmcCkKIHsKLQljaGFyICpwOwotCWlmIChQeU9TX0lucHV0SG9vayAhPSBOVUxMKQotCQkodm9pZCkoUHlPU19JbnB1dEhvb2spKCk7Ci0JZXJybm8gPSAwOwotCXAgPSBmZ2V0cyhidWYsIGxlbiwgZnApOwotCWlmIChwICE9IE5VTEwpCi0JCXJldHVybiAwOyAvKiBObyBlcnJvciAqLworICAgIGNoYXIgKnA7CisgICAgaWYgKFB5T1NfSW5wdXRIb29rICE9IE5VTEwpCisgICAgICAgICh2b2lkKShQeU9TX0lucHV0SG9vaykoKTsKKyAgICBlcnJubyA9IDA7CisgICAgcCA9IGZnZXRzKGJ1ZiwgbGVuLCBmcCk7CisgICAgaWYgKHAgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7IC8qIE5vIGVycm9yICovCiAjaWZkZWYgTVNfV0lORE9XUwotCS8qIEluIHRoZSBjYXNlIG9mIGEgQ3RybCtDIG9yIHNvbWUgb3RoZXIgZXh0ZXJuYWwgZXZlbnQgCi0JICAgaW50ZXJydXB0aW5nIHRoZSBvcGVyYXRpb246Ci0JICAgV2luMmsvTlQ6IEVSUk9SX09QRVJBVElPTl9BQk9SVEVEIGlzIHRoZSBtb3N0IHJlY2VudCBXaW4zMiAKLQkgICBlcnJvciBjb2RlIChhbmQgZmVvZigpIHJldHVybnMgVFJVRSkuCi0JICAgV2luOXg6IEN0cmwrQyBzZWVtcyB0byBoYXZlIG5vIGVmZmVjdCBvbiBmZ2V0cygpIHJldHVybmluZwotCSAgIGVhcmx5IC0gdGhlIHNpZ25hbCBoYW5kbGVyIGlzIGNhbGxlZCwgYnV0IHRoZSBmZ2V0cygpCi0JICAgb25seSByZXR1cm5zICJub3JtYWxseSIgKGllLCB3aGVuIEVudGVyIGhpdCBvciBmZW9mKCkpCi0JKi8KLQlpZiAoR2V0TGFzdEVycm9yKCk9PUVSUk9SX09QRVJBVElPTl9BQk9SVEVEKSB7Ci0JCS8qIFNpZ25hbHMgY29tZSBhc3luY2hyb25vdXNseSwgc28gd2Ugc2xlZXAgYSBicmllZiAKLQkJICAgbW9tZW50IGJlZm9yZSBjaGVja2luZyBpZiB0aGUgaGFuZGxlciBoYXMgYmVlbiAKLQkJICAgdHJpZ2dlcmVkICh3ZSBjYW50IGp1c3QgcmV0dXJuIDEgYmVmb3JlIHRoZSAKLQkJICAgc2lnbmFsIGhhbmRsZXIgaGFzIGJlZW4gY2FsbGVkLCBhcyB0aGUgbGF0ZXIgCi0JCSAgIHNpZ25hbCBtYXkgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIGludGVycnVwdCkuCi0JCSovCi0JCVNsZWVwKDEpOwotCQlpZiAoUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCgpKSB7Ci0JCQlyZXR1cm4gMTsgLyogSW50ZXJydXB0ICovCi0JCX0KLQkJLyogRWl0aGVyIHRoZSBzbGVlcCB3YXNuJ3QgbG9uZyBlbm91Z2ggKG5lZWQgYQotCQkgICBzaG9ydCBsb29wIHJldHJ5aW5nPykgb3Igbm90IGludGVycnVwdGVkIGF0IGFsbAotCQkgICAoaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgcmV2aXNpdCB0aGUgd2hvbGUgdGhpbmchKQotCQkgICBMb2dnaW5nIHNvbWUgd2FybmluZyB3b3VsZCBiZSBuaWNlLiAgYXNzZXJ0IGlzIG5vdAotCQkgICB2aWFibGUgYXMgdW5kZXIgdGhlIGRlYnVnZ2VyLCB0aGUgdmFyaW91cyBkaWFsb2dzCi0JCSAgIG1lYW4gdGhlIGNvbmRpdGlvbiBpcyBub3QgdHJ1ZS4KLQkJKi8KLQl9CisgICAgLyogSW4gdGhlIGNhc2Ugb2YgYSBDdHJsK0Mgb3Igc29tZSBvdGhlciBleHRlcm5hbCBldmVudAorICAgICAgIGludGVycnVwdGluZyB0aGUgb3BlcmF0aW9uOgorICAgICAgIFdpbjJrL05UOiBFUlJPUl9PUEVSQVRJT05fQUJPUlRFRCBpcyB0aGUgbW9zdCByZWNlbnQgV2luMzIKKyAgICAgICBlcnJvciBjb2RlIChhbmQgZmVvZigpIHJldHVybnMgVFJVRSkuCisgICAgICAgV2luOXg6IEN0cmwrQyBzZWVtcyB0byBoYXZlIG5vIGVmZmVjdCBvbiBmZ2V0cygpIHJldHVybmluZworICAgICAgIGVhcmx5IC0gdGhlIHNpZ25hbCBoYW5kbGVyIGlzIGNhbGxlZCwgYnV0IHRoZSBmZ2V0cygpCisgICAgICAgb25seSByZXR1cm5zICJub3JtYWxseSIgKGllLCB3aGVuIEVudGVyIGhpdCBvciBmZW9mKCkpCisgICAgKi8KKyAgICBpZiAoR2V0TGFzdEVycm9yKCk9PUVSUk9SX09QRVJBVElPTl9BQk9SVEVEKSB7CisgICAgICAgIC8qIFNpZ25hbHMgY29tZSBhc3luY2hyb25vdXNseSwgc28gd2Ugc2xlZXAgYSBicmllZgorICAgICAgICAgICBtb21lbnQgYmVmb3JlIGNoZWNraW5nIGlmIHRoZSBoYW5kbGVyIGhhcyBiZWVuCisgICAgICAgICAgIHRyaWdnZXJlZCAod2UgY2FudCBqdXN0IHJldHVybiAxIGJlZm9yZSB0aGUKKyAgICAgICAgICAgc2lnbmFsIGhhbmRsZXIgaGFzIGJlZW4gY2FsbGVkLCBhcyB0aGUgbGF0ZXIKKyAgICAgICAgICAgc2lnbmFsIG1heSBiZSB0cmVhdGVkIGFzIGEgc2VwYXJhdGUgaW50ZXJydXB0KS4KKyAgICAgICAgKi8KKyAgICAgICAgU2xlZXAoMSk7CisgICAgICAgIGlmIChQeU9TX0ludGVycnVwdE9jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAxOyAvKiBJbnRlcnJ1cHQgKi8KKyAgICAgICAgfQorICAgICAgICAvKiBFaXRoZXIgdGhlIHNsZWVwIHdhc24ndCBsb25nIGVub3VnaCAobmVlZCBhCisgICAgICAgICAgIHNob3J0IGxvb3AgcmV0cnlpbmc/KSBvciBub3QgaW50ZXJydXB0ZWQgYXQgYWxsCisgICAgICAgICAgIChpbiB3aGljaCBjYXNlIHdlIHNob3VsZCByZXZpc2l0IHRoZSB3aG9sZSB0aGluZyEpCisgICAgICAgICAgIExvZ2dpbmcgc29tZSB3YXJuaW5nIHdvdWxkIGJlIG5pY2UuICBhc3NlcnQgaXMgbm90CisgICAgICAgICAgIHZpYWJsZSBhcyB1bmRlciB0aGUgZGVidWdnZXIsIHRoZSB2YXJpb3VzIGRpYWxvZ3MKKyAgICAgICAgICAgbWVhbiB0aGUgY29uZGl0aW9uIGlzIG5vdCB0cnVlLgorICAgICAgICAqLworICAgIH0KICNlbmRpZiAvKiBNU19XSU5ET1dTICovCi0JaWYgKGZlb2YoZnApKSB7Ci0JCXJldHVybiAtMTsgLyogRU9GICovCi0JfQorICAgIGlmIChmZW9mKGZwKSkgeworICAgICAgICByZXR1cm4gLTE7IC8qIEVPRiAqLworICAgIH0KICNpZmRlZiBFSU5UUgotCWlmIChlcnJubyA9PSBFSU5UUikgewotCQlpbnQgczsKKyAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgaW50IHM7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlFdmFsX1Jlc3RvcmVUaHJlYWQoX1B5T1NfUmVhZGxpbmVUU3RhdGUpOworICAgICAgICBQeUV2YWxfUmVzdG9yZVRocmVhZChfUHlPU19SZWFkbGluZVRTdGF0ZSk7CiAjZW5kaWYKLQkJcyA9IFB5RXJyX0NoZWNrU2lnbmFscygpOworICAgICAgICBzID0gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlFdmFsX1NhdmVUaHJlYWQoKTsKKyAgICAgICAgUHlFdmFsX1NhdmVUaHJlYWQoKTsKICNlbmRpZgotCQlpZiAocyA8IDApIHsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQorICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQogI2VuZGlmCi0JaWYgKFB5T1NfSW50ZXJydXB0T2NjdXJyZWQoKSkgewotCQlyZXR1cm4gMTsgLyogSW50ZXJydXB0ICovCi0JfQotCXJldHVybiAtMjsgLyogRXJyb3IgKi8KKyAgICBpZiAoUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiAxOyAvKiBJbnRlcnJ1cHQgKi8KKyAgICB9CisgICAgcmV0dXJuIC0yOyAvKiBFcnJvciAqLwogfQogCiAKQEAgLTEwNSw1MCArMTA1LDUwIEBACiBjaGFyICoKIFB5T1NfU3RkaW9SZWFkbGluZShGSUxFICpzeXNfc3RkaW4sIEZJTEUgKnN5c19zdGRvdXQsIGNoYXIgKnByb21wdCkKIHsKLQlzaXplX3QgbjsKLQljaGFyICpwOwotCW4gPSAxMDA7Ci0JaWYgKChwID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZmbHVzaChzeXNfc3Rkb3V0KTsKKyAgICBzaXplX3QgbjsKKyAgICBjaGFyICpwOworICAgIG4gPSAxMDA7CisgICAgaWYgKChwID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobikpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZmbHVzaChzeXNfc3Rkb3V0KTsKICNpZm5kZWYgUklTQ09TCi0JaWYgKHByb21wdCkKLQkJZnByaW50ZihzdGRlcnIsICIlcyIsIHByb21wdCk7CisgICAgaWYgKHByb21wdCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIHByb21wdCk7CiAjZWxzZQotCWlmIChwcm9tcHQpIHsKLQkJaWYoUHlfUklTQ09TV2ltcEZsYWcpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIlx4MGNyJXNceDBjIiwgcHJvbXB0KTsKLQkJZWxzZQotCQkJZnByaW50ZihzdGRlcnIsICIlcyIsIHByb21wdCk7Ci0JfQorICAgIGlmIChwcm9tcHQpIHsKKyAgICAgICAgaWYoUHlfUklTQ09TV2ltcEZsYWcpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlx4MGNyJXNceDBjIiwgcHJvbXB0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIHByb21wdCk7CisgICAgfQogI2VuZGlmCi0JZmZsdXNoKHN0ZGVycik7Ci0Jc3dpdGNoIChteV9mZ2V0cyhwLCAoaW50KW4sIHN5c19zdGRpbikpIHsKLQljYXNlIDA6IC8qIE5vcm1hbCBjYXNlICovCi0JCWJyZWFrOwotCWNhc2UgMTogLyogSW50ZXJydXB0ICovCi0JCVB5TWVtX0ZSRUUocCk7Ci0JCXJldHVybiBOVUxMOwotCWNhc2UgLTE6IC8qIEVPRiAqLwotCWNhc2UgLTI6IC8qIEVycm9yICovCi0JZGVmYXVsdDogLyogU2hvdWxkbid0IGhhcHBlbiAqLwotCQkqcCA9ICdcMCc7Ci0JCWJyZWFrOwotCX0KLQluID0gc3RybGVuKHApOwotCXdoaWxlIChuID4gMCAmJiBwW24tMV0gIT0gJ1xuJykgewotCQlzaXplX3QgaW5jciA9IG4rMjsKLQkJcCA9IChjaGFyICopUHlNZW1fUkVBTExPQyhwLCBuICsgaW5jcik7Ci0JCWlmIChwID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKGluY3IgPiBJTlRfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImlucHV0IGxpbmUgdG9vIGxvbmciKTsKLQkJfQotCQlpZiAobXlfZmdldHMocCtuLCAoaW50KWluY3IsIHN5c19zdGRpbikgIT0gMCkKLQkJCWJyZWFrOwotCQluICs9IHN0cmxlbihwK24pOwotCX0KLQlyZXR1cm4gKGNoYXIgKilQeU1lbV9SRUFMTE9DKHAsIG4rMSk7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgc3dpdGNoIChteV9mZ2V0cyhwLCAoaW50KW4sIHN5c19zdGRpbikpIHsKKyAgICBjYXNlIDA6IC8qIE5vcm1hbCBjYXNlICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTogLyogSW50ZXJydXB0ICovCisgICAgICAgIFB5TWVtX0ZSRUUocCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgLTE6IC8qIEVPRiAqLworICAgIGNhc2UgLTI6IC8qIEVycm9yICovCisgICAgZGVmYXVsdDogLyogU2hvdWxkbid0IGhhcHBlbiAqLworICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBuID0gc3RybGVuKHApOworICAgIHdoaWxlIChuID4gMCAmJiBwW24tMV0gIT0gJ1xuJykgeworICAgICAgICBzaXplX3QgaW5jciA9IG4rMjsKKyAgICAgICAgcCA9IChjaGFyICopUHlNZW1fUkVBTExPQyhwLCBuICsgaW5jcik7CisgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGluY3IgPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImlucHV0IGxpbmUgdG9vIGxvbmciKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobXlfZmdldHMocCtuLCAoaW50KWluY3IsIHN5c19zdGRpbikgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuICs9IHN0cmxlbihwK24pOworICAgIH0KKyAgICByZXR1cm4gKGNoYXIgKilQeU1lbV9SRUFMTE9DKHAsIG4rMSk7CiB9CiAKIApAQCAtMTY1LDUyICsxNjUsNTIgQEAKIGNoYXIgKgogUHlPU19SZWFkbGluZShGSUxFICpzeXNfc3RkaW4sIEZJTEUgKnN5c19zdGRvdXQsIGNoYXIgKnByb21wdCkKIHsKLQljaGFyICpydjsKKyAgICBjaGFyICpydjsKIAotCWlmIChfUHlPU19SZWFkbGluZVRTdGF0ZSA9PSBQeVRocmVhZFN0YXRlX0dFVCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImNhbid0IHJlLWVudGVyIHJlYWRsaW5lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKKyAgICBpZiAoX1B5T1NfUmVhZGxpbmVUU3RhdGUgPT0gUHlUaHJlYWRTdGF0ZV9HRVQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHJlLWVudGVyIHJlYWRsaW5lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyID09IE5VTEwpIHsKKworICAgIGlmIChQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyID09IE5VTEwpIHsKICNpZmRlZiBfX1ZNUwotICAgICAgICAgICAgICAgIFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgPSB2bXNfX1N0ZGlvUmVhZGxpbmU7CisgICAgICAgIFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgPSB2bXNfX1N0ZGlvUmVhZGxpbmU7CiAjZWxzZQotICAgICAgICAgICAgICAgIFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgPSBQeU9TX1N0ZGlvUmVhZGxpbmU7CisgICAgICAgIFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgPSBQeU9TX1N0ZGlvUmVhZGxpbmU7CiAjZW5kaWYKLQl9Ci0JCi0jaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoX1B5T1NfUmVhZGxpbmVMb2NrID09IE5VTEwpIHsKLQkJX1B5T1NfUmVhZGxpbmVMb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwkJCi0JfQotI2VuZGlmCi0KLQlfUHlPU19SZWFkbGluZVRTdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKF9QeU9TX1JlYWRsaW5lTG9jaywgMSk7Ci0jZW5kaWYKLQotICAgICAgICAvKiBUaGlzIGlzIG5lZWRlZCB0byBoYW5kbGUgdGhlIHVubGlrZWx5IGNhc2UgdGhhdCB0aGUKLSAgICAgICAgICogaW50ZXJwcmV0ZXIgaXMgaW4gaW50ZXJhY3RpdmUgbW9kZSAqYW5kKiBzdGRpbi9vdXQgYXJlIG5vdAotICAgICAgICAgKiBhIHR0eS4gIFRoaXMgY2FuIGhhcHBlbiwgZm9yIGV4YW1wbGUgaWYgcHl0aG9uIGlzIHJ1biBsaWtlCi0gICAgICAgICAqIHRoaXM6IHB5dGhvbiAtaSA8IHRlc3QxLnB5Ci0gICAgICAgICAqLwotICAgICAgICBpZiAoIWlzYXR0eSAoZmlsZW5vIChzeXNfc3RkaW4pKSB8fCAhaXNhdHR5IChmaWxlbm8gKHN5c19zdGRvdXQpKSkKLSAgICAgICAgICAgICAgICBydiA9IFB5T1NfU3RkaW9SZWFkbGluZSAoc3lzX3N0ZGluLCBzeXNfc3Rkb3V0LCBwcm9tcHQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcnYgPSAoKlB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIpKHN5c19zdGRpbiwgc3lzX3N0ZG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKF9QeU9TX1JlYWRsaW5lTG9jayk7CisgICAgaWYgKF9QeU9TX1JlYWRsaW5lTG9jayA9PSBOVUxMKSB7CisgICAgICAgIF9QeU9TX1JlYWRsaW5lTG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICB9CiAjZW5kaWYKIAotCV9QeU9TX1JlYWRsaW5lVFN0YXRlID0gTlVMTDsKKyAgICBfUHlPU19SZWFkbGluZVRTdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKF9QeU9TX1JlYWRsaW5lTG9jaywgMSk7CisjZW5kaWYKIAotCXJldHVybiBydjsKKyAgICAvKiBUaGlzIGlzIG5lZWRlZCB0byBoYW5kbGUgdGhlIHVubGlrZWx5IGNhc2UgdGhhdCB0aGUKKyAgICAgKiBpbnRlcnByZXRlciBpcyBpbiBpbnRlcmFjdGl2ZSBtb2RlICphbmQqIHN0ZGluL291dCBhcmUgbm90CisgICAgICogYSB0dHkuICBUaGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlIGlmIHB5dGhvbiBpcyBydW4gbGlrZQorICAgICAqIHRoaXM6IHB5dGhvbiAtaSA8IHRlc3QxLnB5CisgICAgICovCisgICAgaWYgKCFpc2F0dHkgKGZpbGVubyAoc3lzX3N0ZGluKSkgfHwgIWlzYXR0eSAoZmlsZW5vIChzeXNfc3Rkb3V0KSkpCisgICAgICAgIHJ2ID0gUHlPU19TdGRpb1JlYWRsaW5lIChzeXNfc3RkaW4sIHN5c19zdGRvdXQsIHByb21wdCk7CisgICAgZWxzZQorICAgICAgICBydiA9ICgqUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlcikoc3lzX3N0ZGluLCBzeXNfc3Rkb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soX1B5T1NfUmVhZGxpbmVMb2NrKTsKKyNlbmRpZgorCisgICAgX1B5T1NfUmVhZGxpbmVUU3RhdGUgPSBOVUxMOworCisgICAgcmV0dXJuIHJ2OwogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL25vZGUuYyBiL1BhcnNlci9ub2RlLmMKaW5kZXggZjRjODZjYi4uOWViYTc2YiAxMDA2NDQKLS0tIGEvUGFyc2VyL25vZGUuYworKysgYi9QYXJzZXIvbm9kZS5jCkBAIC03LDMwICs3LDMwIEBACiBub2RlICoKIFB5Tm9kZV9OZXcoaW50IHR5cGUpCiB7Ci0Jbm9kZSAqbiA9IChub2RlICopIFB5T2JqZWN0X01BTExPQygxICogc2l6ZW9mKG5vZGUpKTsKLQlpZiAobiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQluLT5uX3R5cGUgPSB0eXBlOwotCW4tPm5fc3RyID0gTlVMTDsKLQluLT5uX2xpbmVubyA9IDA7Ci0Jbi0+bl9uY2hpbGRyZW4gPSAwOwotCW4tPm5fY2hpbGQgPSBOVUxMOwotCXJldHVybiBuOworICAgIG5vZGUgKm4gPSAobm9kZSAqKSBQeU9iamVjdF9NQUxMT0MoMSAqIHNpemVvZihub2RlKSk7CisgICAgaWYgKG4gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbi0+bl90eXBlID0gdHlwZTsKKyAgICBuLT5uX3N0ciA9IE5VTEw7CisgICAgbi0+bl9saW5lbm8gPSAwOworICAgIG4tPm5fbmNoaWxkcmVuID0gMDsKKyAgICBuLT5uX2NoaWxkID0gTlVMTDsKKyAgICByZXR1cm4gbjsKIH0KIAogLyogU2VlIGNvbW1lbnRzIGF0IFhYWFJPVU5EVVAgYmVsb3cuICBSZXR1cm5zIC0xIG9uIG92ZXJmbG93LiAqLwogc3RhdGljIGludAogZmFuY3lfcm91bmR1cChpbnQgbikKIHsKLQkvKiBSb3VuZCB1cCB0byB0aGUgY2xvc2VzdCBwb3dlciBvZiAyID49IG4uICovCi0JaW50IHJlc3VsdCA9IDI1NjsKLQlhc3NlcnQobiA+IDEyOCk7Ci0Jd2hpbGUgKHJlc3VsdCA8IG4pIHsKLQkJcmVzdWx0IDw8PSAxOwotCQlpZiAocmVzdWx0IDw9IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgLyogUm91bmQgdXAgdG8gdGhlIGNsb3Nlc3QgcG93ZXIgb2YgMiA+PSBuLiAqLworICAgIGludCByZXN1bHQgPSAyNTY7CisgICAgYXNzZXJ0KG4gPiAxMjgpOworICAgIHdoaWxlIChyZXN1bHQgPCBuKSB7CisgICAgICAgIHJlc3VsdCA8PD0gMTsKKyAgICAgICAgaWYgKHJlc3VsdCA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBBIGdpbW1pY2sgdG8gbWFrZSBtYXNzaXZlIG51bWJlcnMgb2YgcmVhbGxvY3MgcXVpY2tlci4gIFRoZSByZXN1bHQgaXMKQEAgLTcwLDQ2ICs3MCw0NiBAQAogICogTm90ZSB0aGF0IHRoaXMgd291bGQgYmUgc3RyYWlnaHRmb3J3YXJkIGlmIGEgbm9kZSBzdG9yZWQgaXRzIGN1cnJlbnQKICAqIGNhcGFjaXR5LiAgVGhlIGNvZGUgaXMgdHJpY2t5IHRvIGF2b2lkIHRoYXQuCiAgKi8KLSNkZWZpbmUgWFhYUk9VTkRVUChuKSAoKG4pIDw9IDEgPyAobikgOiAJCVwKLQkJICAgICAgIChuKSA8PSAxMjggPyAoKChuKSArIDMpICYgfjMpIDoJXAotCQkgICAgICAgZmFuY3lfcm91bmR1cChuKSkKKyNkZWZpbmUgWFhYUk9VTkRVUChuKSAoKG4pIDw9IDEgPyAobikgOiAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKG4pIDw9IDEyOCA/ICgoKG4pICsgMykgJiB+MykgOiAgICAgICAgICBcCisgICAgICAgICAgICAgICBmYW5jeV9yb3VuZHVwKG4pKQogCiAKIGludAogUHlOb2RlX0FkZENoaWxkKHJlZ2lzdGVyIG5vZGUgKm4xLCBpbnQgdHlwZSwgY2hhciAqc3RyLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCkKIHsKLQljb25zdCBpbnQgbmNoID0gbjEtPm5fbmNoaWxkcmVuOwotCWludCBjdXJyZW50X2NhcGFjaXR5OwotCWludCByZXF1aXJlZF9jYXBhY2l0eTsKLQlub2RlICpuOworICAgIGNvbnN0IGludCBuY2ggPSBuMS0+bl9uY2hpbGRyZW47CisgICAgaW50IGN1cnJlbnRfY2FwYWNpdHk7CisgICAgaW50IHJlcXVpcmVkX2NhcGFjaXR5OworICAgIG5vZGUgKm47CiAKLQlpZiAobmNoID09IElOVF9NQVggfHwgbmNoIDwgMCkKLQkJcmV0dXJuIEVfT1ZFUkZMT1c7CisgICAgaWYgKG5jaCA9PSBJTlRfTUFYIHx8IG5jaCA8IDApCisgICAgICAgIHJldHVybiBFX09WRVJGTE9XOwogCi0JY3VycmVudF9jYXBhY2l0eSA9IFhYWFJPVU5EVVAobmNoKTsKLQlyZXF1aXJlZF9jYXBhY2l0eSA9IFhYWFJPVU5EVVAobmNoICsgMSk7Ci0JaWYgKGN1cnJlbnRfY2FwYWNpdHkgPCAwIHx8IHJlcXVpcmVkX2NhcGFjaXR5IDwgMCkKLQkJcmV0dXJuIEVfT1ZFUkZMT1c7Ci0JaWYgKGN1cnJlbnRfY2FwYWNpdHkgPCByZXF1aXJlZF9jYXBhY2l0eSkgewotCQlpZiAocmVxdWlyZWRfY2FwYWNpdHkgPiBQWV9TSVpFX01BWCAvIHNpemVvZihub2RlKSkgewotCQkJcmV0dXJuIEVfTk9NRU07Ci0JCX0KLQkJbiA9IG4xLT5uX2NoaWxkOwotCQluID0gKG5vZGUgKikgUHlPYmplY3RfUkVBTExPQyhuLAotCQkJCQkgICAgICByZXF1aXJlZF9jYXBhY2l0eSAqIHNpemVvZihub2RlKSk7Ci0JCWlmIChuID09IE5VTEwpCi0JCQlyZXR1cm4gRV9OT01FTTsKLQkJbjEtPm5fY2hpbGQgPSBuOwotCX0KKyAgICBjdXJyZW50X2NhcGFjaXR5ID0gWFhYUk9VTkRVUChuY2gpOworICAgIHJlcXVpcmVkX2NhcGFjaXR5ID0gWFhYUk9VTkRVUChuY2ggKyAxKTsKKyAgICBpZiAoY3VycmVudF9jYXBhY2l0eSA8IDAgfHwgcmVxdWlyZWRfY2FwYWNpdHkgPCAwKQorICAgICAgICByZXR1cm4gRV9PVkVSRkxPVzsKKyAgICBpZiAoY3VycmVudF9jYXBhY2l0eSA8IHJlcXVpcmVkX2NhcGFjaXR5KSB7CisgICAgICAgIGlmIChyZXF1aXJlZF9jYXBhY2l0eSA+IFBZX1NJWkVfTUFYIC8gc2l6ZW9mKG5vZGUpKSB7CisgICAgICAgICAgICByZXR1cm4gRV9OT01FTTsKKyAgICAgICAgfQorICAgICAgICBuID0gbjEtPm5fY2hpbGQ7CisgICAgICAgIG4gPSAobm9kZSAqKSBQeU9iamVjdF9SRUFMTE9DKG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkX2NhcGFjaXR5ICogc2l6ZW9mKG5vZGUpKTsKKyAgICAgICAgaWYgKG4gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBFX05PTUVNOworICAgICAgICBuMS0+bl9jaGlsZCA9IG47CisgICAgfQogCi0JbiA9ICZuMS0+bl9jaGlsZFtuMS0+bl9uY2hpbGRyZW4rK107Ci0Jbi0+bl90eXBlID0gdHlwZTsKLQluLT5uX3N0ciA9IHN0cjsKLQluLT5uX2xpbmVubyA9IGxpbmVubzsKLQluLT5uX2NvbF9vZmZzZXQgPSBjb2xfb2Zmc2V0OwotCW4tPm5fbmNoaWxkcmVuID0gMDsKLQluLT5uX2NoaWxkID0gTlVMTDsKLQlyZXR1cm4gMDsKKyAgICBuID0gJm4xLT5uX2NoaWxkW24xLT5uX25jaGlsZHJlbisrXTsKKyAgICBuLT5uX3R5cGUgPSB0eXBlOworICAgIG4tPm5fc3RyID0gc3RyOworICAgIG4tPm5fbGluZW5vID0gbGluZW5vOworICAgIG4tPm5fY29sX29mZnNldCA9IGNvbF9vZmZzZXQ7CisgICAgbi0+bl9uY2hpbGRyZW4gPSAwOworICAgIG4tPm5fY2hpbGQgPSBOVUxMOworICAgIHJldHVybiAwOwogfQogCiAvKiBGb3J3YXJkICovCkBAIC0xMTksMjAgKzExOSwyMCBAQAogdm9pZAogUHlOb2RlX0ZyZWUobm9kZSAqbikKIHsKLQlpZiAobiAhPSBOVUxMKSB7Ci0JCWZyZWVjaGlsZHJlbihuKTsKLQkJUHlPYmplY3RfRlJFRShuKTsKLQl9CisgICAgaWYgKG4gIT0gTlVMTCkgeworICAgICAgICBmcmVlY2hpbGRyZW4obik7CisgICAgICAgIFB5T2JqZWN0X0ZSRUUobik7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogZnJlZWNoaWxkcmVuKG5vZGUgKm4pCiB7Ci0JaW50IGk7Ci0JZm9yIChpID0gTkNIKG4pOyAtLWkgPj0gMDsgKQotCQlmcmVlY2hpbGRyZW4oQ0hJTEQobiwgaSkpOwotCWlmIChuLT5uX2NoaWxkICE9IE5VTEwpCi0JCVB5T2JqZWN0X0ZSRUUobi0+bl9jaGlsZCk7Ci0JaWYgKFNUUihuKSAhPSBOVUxMKQotCQlQeU9iamVjdF9GUkVFKFNUUihuKSk7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gTkNIKG4pOyAtLWkgPj0gMDsgKQorICAgICAgICBmcmVlY2hpbGRyZW4oQ0hJTEQobiwgaSkpOworICAgIGlmIChuLT5uX2NoaWxkICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0ZSRUUobi0+bl9jaGlsZCk7CisgICAgaWYgKFNUUihuKSAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9GUkVFKFNUUihuKSk7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvcGFyc2VyLmMgYi9QYXJzZXIvcGFyc2VyLmMKaW5kZXggZTU5N2VhMi4uYjc1M2ExNyAxMDA2NDQKLS0tIGEvUGFyc2VyL3BhcnNlci5jCisrKyBiL1BhcnNlci9wYXJzZXIuYwpAQCAtMjksNyArMjksNyBAQAogc3RhdGljIHZvaWQKIHNfcmVzZXQoc3RhY2sgKnMpCiB7Ci0Jcy0+c190b3AgPSAmcy0+c19iYXNlW01BWFNUQUNLXTsKKyAgICBzLT5zX3RvcCA9ICZzLT5zX2Jhc2VbTUFYU1RBQ0tdOwogfQogCiAjZGVmaW5lIHNfZW1wdHkocykgKChzKS0+c190b3AgPT0gJihzKS0+c19iYXNlW01BWFNUQUNLXSkKQEAgLTM3LDE2ICszNywxNiBAQAogc3RhdGljIGludAogc19wdXNoKHJlZ2lzdGVyIHN0YWNrICpzLCBkZmEgKmQsIG5vZGUgKnBhcmVudCkKIHsKLQlyZWdpc3RlciBzdGFja2VudHJ5ICp0b3A7Ci0JaWYgKHMtPnNfdG9wID09IHMtPnNfYmFzZSkgewotCQlmcHJpbnRmKHN0ZGVyciwgInNfcHVzaDogcGFyc2VyIHN0YWNrIG92ZXJmbG93XG4iKTsKLQkJcmV0dXJuIEVfTk9NRU07Ci0JfQotCXRvcCA9IC0tcy0+c190b3A7Ci0JdG9wLT5zX2RmYSA9IGQ7Ci0JdG9wLT5zX3BhcmVudCA9IHBhcmVudDsKLQl0b3AtPnNfc3RhdGUgPSAwOwotCXJldHVybiAwOworICAgIHJlZ2lzdGVyIHN0YWNrZW50cnkgKnRvcDsKKyAgICBpZiAocy0+c190b3AgPT0gcy0+c19iYXNlKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAic19wdXNoOiBwYXJzZXIgc3RhY2sgb3ZlcmZsb3dcbiIpOworICAgICAgICByZXR1cm4gRV9OT01FTTsKKyAgICB9CisgICAgdG9wID0gLS1zLT5zX3RvcDsKKyAgICB0b3AtPnNfZGZhID0gZDsKKyAgICB0b3AtPnNfcGFyZW50ID0gcGFyZW50OworICAgIHRvcC0+c19zdGF0ZSA9IDA7CisgICAgcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBQeV9ERUJVRwpAQCAtNTQsOSArNTQsOSBAQAogc3RhdGljIHZvaWQKIHNfcG9wKHJlZ2lzdGVyIHN0YWNrICpzKQogewotCWlmIChzX2VtcHR5KHMpKQotCQlQeV9GYXRhbEVycm9yKCJzX3BvcDogcGFyc2VyIHN0YWNrIHVuZGVyZmxvdyAtLSBGQVRBTCIpOwotCXMtPnNfdG9wKys7CisgICAgaWYgKHNfZW1wdHkocykpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoInNfcG9wOiBwYXJzZXIgc3RhY2sgdW5kZXJmbG93IC0tIEZBVEFMIik7CisgICAgcy0+c190b3ArKzsKIH0KIAogI2Vsc2UgLyogIVB5X0RFQlVHICovCkBAIC03MSwzNCArNzEsMzQgQEAKIHBhcnNlcl9zdGF0ZSAqCiBQeVBhcnNlcl9OZXcoZ3JhbW1hciAqZywgaW50IHN0YXJ0KQogewotCXBhcnNlcl9zdGF0ZSAqcHM7Ci0JCi0JaWYgKCFnLT5nX2FjY2VsKQotCQlQeUdyYW1tYXJfQWRkQWNjZWxlcmF0b3JzKGcpOwotCXBzID0gKHBhcnNlcl9zdGF0ZSAqKVB5TWVtX01BTExPQyhzaXplb2YocGFyc2VyX3N0YXRlKSk7Ci0JaWYgKHBzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXBzLT5wX2dyYW1tYXIgPSBnOworICAgIHBhcnNlcl9zdGF0ZSAqcHM7CisKKyAgICBpZiAoIWctPmdfYWNjZWwpCisgICAgICAgIFB5R3JhbW1hcl9BZGRBY2NlbGVyYXRvcnMoZyk7CisgICAgcHMgPSAocGFyc2VyX3N0YXRlICopUHlNZW1fTUFMTE9DKHNpemVvZihwYXJzZXJfc3RhdGUpKTsKKyAgICBpZiAocHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHMtPnBfZ3JhbW1hciA9IGc7CiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECi0JcHMtPnBfZmxhZ3MgPSAwOworICAgIHBzLT5wX2ZsYWdzID0gMDsKICNlbmRpZgotCXBzLT5wX3RyZWUgPSBQeU5vZGVfTmV3KHN0YXJ0KTsKLQlpZiAocHMtPnBfdHJlZSA9PSBOVUxMKSB7Ci0JCVB5TWVtX0ZSRUUocHMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc19yZXNldCgmcHMtPnBfc3RhY2spOwotCSh2b2lkKSBzX3B1c2goJnBzLT5wX3N0YWNrLCBQeUdyYW1tYXJfRmluZERGQShnLCBzdGFydCksIHBzLT5wX3RyZWUpOwotCXJldHVybiBwczsKKyAgICBwcy0+cF90cmVlID0gUHlOb2RlX05ldyhzdGFydCk7CisgICAgaWYgKHBzLT5wX3RyZWUgPT0gTlVMTCkgeworICAgICAgICBQeU1lbV9GUkVFKHBzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNfcmVzZXQoJnBzLT5wX3N0YWNrKTsKKyAgICAodm9pZCkgc19wdXNoKCZwcy0+cF9zdGFjaywgUHlHcmFtbWFyX0ZpbmRERkEoZywgc3RhcnQpLCBwcy0+cF90cmVlKTsKKyAgICByZXR1cm4gcHM7CiB9CiAKIHZvaWQKIFB5UGFyc2VyX0RlbGV0ZShwYXJzZXJfc3RhdGUgKnBzKQogewotCS8qIE5CIElmIHlvdSB3YW50IHRvIHNhdmUgdGhlIHBhcnNlIHRyZWUsCi0JICAgeW91IG11c3Qgc2V0IHBfdHJlZSB0byBOVUxMIGJlZm9yZSBjYWxsaW5nIGRlbHBhcnNlciEgKi8KLQlQeU5vZGVfRnJlZShwcy0+cF90cmVlKTsKLQlQeU1lbV9GUkVFKHBzKTsKKyAgICAvKiBOQiBJZiB5b3Ugd2FudCB0byBzYXZlIHRoZSBwYXJzZSB0cmVlLAorICAgICAgIHlvdSBtdXN0IHNldCBwX3RyZWUgdG8gTlVMTCBiZWZvcmUgY2FsbGluZyBkZWxwYXJzZXIhICovCisgICAgUHlOb2RlX0ZyZWUocHMtPnBfdHJlZSk7CisgICAgUHlNZW1fRlJFRShwcyk7CiB9CiAKIApAQCAtMTA3LDI3ICsxMDcsMjcgQEAKIHN0YXRpYyBpbnQKIHNoaWZ0KHJlZ2lzdGVyIHN0YWNrICpzLCBpbnQgdHlwZSwgY2hhciAqc3RyLCBpbnQgbmV3c3RhdGUsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0KQogewotCWludCBlcnI7Ci0JYXNzZXJ0KCFzX2VtcHR5KHMpKTsKLQllcnIgPSBQeU5vZGVfQWRkQ2hpbGQocy0+c190b3AtPnNfcGFyZW50LCB0eXBlLCBzdHIsIGxpbmVubywgY29sX29mZnNldCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQlzLT5zX3RvcC0+c19zdGF0ZSA9IG5ld3N0YXRlOwotCXJldHVybiAwOworICAgIGludCBlcnI7CisgICAgYXNzZXJ0KCFzX2VtcHR5KHMpKTsKKyAgICBlcnIgPSBQeU5vZGVfQWRkQ2hpbGQocy0+c190b3AtPnNfcGFyZW50LCB0eXBlLCBzdHIsIGxpbmVubywgY29sX29mZnNldCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICBzLT5zX3RvcC0+c19zdGF0ZSA9IG5ld3N0YXRlOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBwdXNoKHJlZ2lzdGVyIHN0YWNrICpzLCBpbnQgdHlwZSwgZGZhICpkLCBpbnQgbmV3c3RhdGUsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0KQogewotCWludCBlcnI7Ci0JcmVnaXN0ZXIgbm9kZSAqbjsKLQluID0gcy0+c190b3AtPnNfcGFyZW50OwotCWFzc2VydCghc19lbXB0eShzKSk7Ci0JZXJyID0gUHlOb2RlX0FkZENoaWxkKG4sIHR5cGUsIChjaGFyICopTlVMTCwgbGluZW5vLCBjb2xfb2Zmc2V0KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCXMtPnNfdG9wLT5zX3N0YXRlID0gbmV3c3RhdGU7Ci0JcmV0dXJuIHNfcHVzaChzLCBkLCBDSElMRChuLCBOQ0gobiktMSkpOworICAgIGludCBlcnI7CisgICAgcmVnaXN0ZXIgbm9kZSAqbjsKKyAgICBuID0gcy0+c190b3AtPnNfcGFyZW50OworICAgIGFzc2VydCghc19lbXB0eShzKSk7CisgICAgZXJyID0gUHlOb2RlX0FkZENoaWxkKG4sIHR5cGUsIChjaGFyICopTlVMTCwgbGluZW5vLCBjb2xfb2Zmc2V0KTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIHMtPnNfdG9wLT5zX3N0YXRlID0gbmV3c3RhdGU7CisgICAgcmV0dXJuIHNfcHVzaChzLCBkLCBDSElMRChuLCBOQ0gobiktMSkpOwogfQogCiAKQEAgLTEzNiwxODkgKzEzNiwxODkgQEAKIHN0YXRpYyBpbnQKIGNsYXNzaWZ5KHBhcnNlcl9zdGF0ZSAqcHMsIGludCB0eXBlLCBjaGFyICpzdHIpCiB7Ci0JZ3JhbW1hciAqZyA9IHBzLT5wX2dyYW1tYXI7Ci0JcmVnaXN0ZXIgaW50IG4gPSBnLT5nX2xsLmxsX25sYWJlbHM7Ci0JCi0JaWYgKHR5cGUgPT0gTkFNRSkgewotCQlyZWdpc3RlciBjaGFyICpzID0gc3RyOwotCQlyZWdpc3RlciBsYWJlbCAqbCA9IGctPmdfbGwubGxfbGFiZWw7Ci0JCXJlZ2lzdGVyIGludCBpOwotCQlmb3IgKGkgPSBuOyBpID4gMDsgaS0tLCBsKyspIHsKLQkJCWlmIChsLT5sYl90eXBlICE9IE5BTUUgfHwgbC0+bGJfc3RyID09IE5VTEwgfHwKLQkJCSAgICBsLT5sYl9zdHJbMF0gIT0gc1swXSB8fAotCQkJICAgIHN0cmNtcChsLT5sYl9zdHIsIHMpICE9IDApCi0JCQkJY29udGludWU7CisgICAgZ3JhbW1hciAqZyA9IHBzLT5wX2dyYW1tYXI7CisgICAgcmVnaXN0ZXIgaW50IG4gPSBnLT5nX2xsLmxsX25sYWJlbHM7CisKKyAgICBpZiAodHlwZSA9PSBOQU1FKSB7CisgICAgICAgIHJlZ2lzdGVyIGNoYXIgKnMgPSBzdHI7CisgICAgICAgIHJlZ2lzdGVyIGxhYmVsICpsID0gZy0+Z19sbC5sbF9sYWJlbDsKKyAgICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICAgIGZvciAoaSA9IG47IGkgPiAwOyBpLS0sIGwrKykgeworICAgICAgICAgICAgaWYgKGwtPmxiX3R5cGUgIT0gTkFNRSB8fCBsLT5sYl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIGwtPmxiX3N0clswXSAhPSBzWzBdIHx8CisgICAgICAgICAgICAgICAgc3RyY21wKGwtPmxiX3N0ciwgcykgIT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcy0+cF9mbGFncyAmIENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbMF0gPT0gJ3AnICYmIHN0cmNtcChzLCAicHJpbnQiKSA9PSAwKSB7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogbm8gbG9uZ2VyIGEga2V5d29yZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBzLT5wX2ZsYWdzICYgQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OICYmCisgICAgICAgICAgICAgICAgc1swXSA9PSAncCcgJiYgc3RyY21wKHMsICJwcmludCIpID09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsgLyogbm8gbG9uZ2VyIGEga2V5d29yZCAqLworICAgICAgICAgICAgfQogI2VuZGlmCi0JCQlEKHByaW50ZigiSXQncyBhIGtleXdvcmRcbiIpKTsKLQkJCXJldHVybiBuIC0gaTsKLQkJfQotCX0KLQkKLQl7Ci0JCXJlZ2lzdGVyIGxhYmVsICpsID0gZy0+Z19sbC5sbF9sYWJlbDsKLQkJcmVnaXN0ZXIgaW50IGk7Ci0JCWZvciAoaSA9IG47IGkgPiAwOyBpLS0sIGwrKykgewotCQkJaWYgKGwtPmxiX3R5cGUgPT0gdHlwZSAmJiBsLT5sYl9zdHIgPT0gTlVMTCkgewotCQkJCUQocHJpbnRmKCJJdCdzIGEgdG9rZW4gd2Uga25vd1xuIikpOwotCQkJCXJldHVybiBuIC0gaTsKLQkJCX0KLQkJfQotCX0KLQkKLQlEKHByaW50ZigiSWxsZWdhbCB0b2tlblxuIikpOwotCXJldHVybiAtMTsKKyAgICAgICAgICAgIEQocHJpbnRmKCJJdCdzIGEga2V5d29yZFxuIikpOworICAgICAgICAgICAgcmV0dXJuIG4gLSBpOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICByZWdpc3RlciBsYWJlbCAqbCA9IGctPmdfbGwubGxfbGFiZWw7CisgICAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgICBmb3IgKGkgPSBuOyBpID4gMDsgaS0tLCBsKyspIHsKKyAgICAgICAgICAgIGlmIChsLT5sYl90eXBlID09IHR5cGUgJiYgbC0+bGJfc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBEKHByaW50ZigiSXQncyBhIHRva2VuIHdlIGtub3dcbiIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbiAtIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEKHByaW50ZigiSWxsZWdhbCB0b2tlblxuIikpOworICAgIHJldHVybiAtMTsKIH0KIAogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAogc3RhdGljIHZvaWQKIGZ1dHVyZV9oYWNrKHBhcnNlcl9zdGF0ZSAqcHMpCiB7Ci0Jbm9kZSAqbiA9IHBzLT5wX3N0YWNrLnNfdG9wLT5zX3BhcmVudDsKLQlub2RlICpjaCwgKmNjaDsKLQlpbnQgaTsKKyAgICBub2RlICpuID0gcHMtPnBfc3RhY2suc190b3AtPnNfcGFyZW50OworICAgIG5vZGUgKmNoLCAqY2NoOworICAgIGludCBpOwogCi0JLyogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAuLi4sIG11c3QgaGF2ZSBhdCBsZWFzdCA0IGNoaWxkcmVuICovCi0JbiA9IENISUxEKG4sIDApOwotCWlmIChOQ0gobikgPCA0KQotCQlyZXR1cm47Ci0JY2ggPSBDSElMRChuLCAwKTsKLQlpZiAoU1RSKGNoKSA9PSBOVUxMIHx8IHN0cmNtcChTVFIoY2gpLCAiZnJvbSIpICE9IDApCi0JCXJldHVybjsKLQljaCA9IENISUxEKG4sIDEpOwotCWlmIChOQ0goY2gpID09IDEgJiYgU1RSKENISUxEKGNoLCAwKSkgJiYKLQkgICAgc3RyY21wKFNUUihDSElMRChjaCwgMCkpLCAiX19mdXR1cmVfXyIpICE9IDApCi0JCXJldHVybjsKLQljaCA9IENISUxEKG4sIDMpOwotCS8qIGNoIGNhbiBiZSBhIHN0YXIsIGEgcGFyZW50aGVzaXMgb3IgaW1wb3J0X2FzX25hbWVzICovCi0JaWYgKFRZUEUoY2gpID09IFNUQVIpCi0JCXJldHVybjsKLQlpZiAoVFlQRShjaCkgPT0gTFBBUikKLQkJY2ggPSBDSElMRChuLCA0KTsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgTkNIKGNoKTsgaSArPSAyKSB7Ci0JCWNjaCA9IENISUxEKGNoLCBpKTsKLQkJaWYgKE5DSChjY2gpID49IDEgJiYgVFlQRShDSElMRChjY2gsIDApKSA9PSBOQU1FKSB7Ci0JCQljaGFyICpzdHJfY2ggPSBTVFIoQ0hJTEQoY2NoLCAwKSk7Ci0JCQlpZiAoc3RyY21wKHN0cl9jaCwgRlVUVVJFX1dJVEhfU1RBVEVNRU5UKSA9PSAwKSB7Ci0JCQkJcHMtPnBfZmxhZ3MgfD0gQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoc3RyX2NoLCBGVVRVUkVfUFJJTlRfRlVOQ1RJT04pID09IDApIHsKLQkJCQlwcy0+cF9mbGFncyB8PSBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT047Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChzdHJfY2gsIEZVVFVSRV9VTklDT0RFX0xJVEVSQUxTKSA9PSAwKSB7Ci0JCQkJcHMtPnBfZmxhZ3MgfD0gQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFM7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAuLi4sIG11c3QgaGF2ZSBhdCBsZWFzdCA0IGNoaWxkcmVuICovCisgICAgbiA9IENISUxEKG4sIDApOworICAgIGlmIChOQ0gobikgPCA0KQorICAgICAgICByZXR1cm47CisgICAgY2ggPSBDSElMRChuLCAwKTsKKyAgICBpZiAoU1RSKGNoKSA9PSBOVUxMIHx8IHN0cmNtcChTVFIoY2gpLCAiZnJvbSIpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBjaCA9IENISUxEKG4sIDEpOworICAgIGlmIChOQ0goY2gpID09IDEgJiYgU1RSKENISUxEKGNoLCAwKSkgJiYKKyAgICAgICAgc3RyY21wKFNUUihDSElMRChjaCwgMCkpLCAiX19mdXR1cmVfXyIpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBjaCA9IENISUxEKG4sIDMpOworICAgIC8qIGNoIGNhbiBiZSBhIHN0YXIsIGEgcGFyZW50aGVzaXMgb3IgaW1wb3J0X2FzX25hbWVzICovCisgICAgaWYgKFRZUEUoY2gpID09IFNUQVIpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoVFlQRShjaCkgPT0gTFBBUikKKyAgICAgICAgY2ggPSBDSElMRChuLCA0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOQ0goY2gpOyBpICs9IDIpIHsKKyAgICAgICAgY2NoID0gQ0hJTEQoY2gsIGkpOworICAgICAgICBpZiAoTkNIKGNjaCkgPj0gMSAmJiBUWVBFKENISUxEKGNjaCwgMCkpID09IE5BTUUpIHsKKyAgICAgICAgICAgIGNoYXIgKnN0cl9jaCA9IFNUUihDSElMRChjY2gsIDApKTsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoc3RyX2NoLCBGVVRVUkVfV0lUSF9TVEFURU1FTlQpID09IDApIHsKKyAgICAgICAgICAgICAgICBwcy0+cF9mbGFncyB8PSBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChzdHJfY2gsIEZVVFVSRV9QUklOVF9GVU5DVElPTikgPT0gMCkgeworICAgICAgICAgICAgICAgIHBzLT5wX2ZsYWdzIHw9IENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHN0cl9jaCwgRlVUVVJFX1VOSUNPREVfTElURVJBTFMpID09IDApIHsKKyAgICAgICAgICAgICAgICBwcy0+cF9mbGFncyB8PSBDT19GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KICNlbmRpZiAvKiBmdXR1cmUga2V5d29yZCAqLwogCiBpbnQKIFB5UGFyc2VyX0FkZFRva2VuKHJlZ2lzdGVyIHBhcnNlcl9zdGF0ZSAqcHMsIHJlZ2lzdGVyIGludCB0eXBlLCBjaGFyICpzdHIsCi0JICAgICAgICAgIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBpbnQgKmV4cGVjdGVkX3JldCkKKyAgICAgICAgICAgICAgICAgIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBpbnQgKmV4cGVjdGVkX3JldCkKIHsKLQlyZWdpc3RlciBpbnQgaWxhYmVsOwotCWludCBlcnI7Ci0JCi0JRChwcmludGYoIlRva2VuICVzLyclcycgLi4uICIsIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW3R5cGVdLCBzdHIpKTsKLQkKLQkvKiBGaW5kIG91dCB3aGljaCBsYWJlbCB0aGlzIHRva2VuIGlzICovCi0JaWxhYmVsID0gY2xhc3NpZnkocHMsIHR5cGUsIHN0cik7Ci0JaWYgKGlsYWJlbCA8IDApCi0JCXJldHVybiBFX1NZTlRBWDsKLQkKLQkvKiBMb29wIHVudGlsIHRoZSB0b2tlbiBpcyBzaGlmdGVkIG9yIGFuIGVycm9yIG9jY3VycmVkICovCi0JZm9yICg7OykgewotCQkvKiBGZXRjaCB0aGUgY3VycmVudCBkZmEgYW5kIHN0YXRlICovCi0JCXJlZ2lzdGVyIGRmYSAqZCA9IHBzLT5wX3N0YWNrLnNfdG9wLT5zX2RmYTsKLQkJcmVnaXN0ZXIgc3RhdGUgKnMgPSAmZC0+ZF9zdGF0ZVtwcy0+cF9zdGFjay5zX3RvcC0+c19zdGF0ZV07Ci0JCQotCQlEKHByaW50ZigiIERGQSAnJXMnLCBzdGF0ZSAlZDoiLAotCQkJZC0+ZF9uYW1lLCBwcy0+cF9zdGFjay5zX3RvcC0+c19zdGF0ZSkpOwotCQkKLQkJLyogQ2hlY2sgYWNjZWxlcmF0b3IgKi8KLQkJaWYgKHMtPnNfbG93ZXIgPD0gaWxhYmVsICYmIGlsYWJlbCA8IHMtPnNfdXBwZXIpIHsKLQkJCXJlZ2lzdGVyIGludCB4ID0gcy0+c19hY2NlbFtpbGFiZWwgLSBzLT5zX2xvd2VyXTsKLQkJCWlmICh4ICE9IC0xKSB7Ci0JCQkJaWYgKHggJiAoMTw8NykpIHsKLQkJCQkJLyogUHVzaCBub24tdGVybWluYWwgKi8KLQkJCQkJaW50IG50ID0gKHggPj4gOCkgKyBOVF9PRkZTRVQ7Ci0JCQkJCWludCBhcnJvdyA9IHggJiAoKDE8PDcpLTEpOwotCQkJCQlkZmEgKmQxID0gUHlHcmFtbWFyX0ZpbmRERkEoCi0JCQkJCQlwcy0+cF9ncmFtbWFyLCBudCk7Ci0JCQkJCWlmICgoZXJyID0gcHVzaCgmcHMtPnBfc3RhY2ssIG50LCBkMSwKLQkJCQkJCWFycm93LCBsaW5lbm8sIGNvbF9vZmZzZXQpKSA+IDApIHsKLQkJCQkJCUQocHJpbnRmKCIgTWVtRXJyb3I6IHB1c2hcbiIpKTsKLQkJCQkJCXJldHVybiBlcnI7Ci0JCQkJCX0KLQkJCQkJRChwcmludGYoIiBQdXNoIC4uLlxuIikpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogU2hpZnQgdGhlIHRva2VuICovCi0JCQkJaWYgKChlcnIgPSBzaGlmdCgmcHMtPnBfc3RhY2ssIHR5cGUsIHN0ciwKLQkJCQkJCXgsIGxpbmVubywgY29sX29mZnNldCkpID4gMCkgewotCQkJCQlEKHByaW50ZigiIE1lbUVycm9yOiBzaGlmdC5cbiIpKTsKLQkJCQkJcmV0dXJuIGVycjsKLQkJCQl9Ci0JCQkJRChwcmludGYoIiBTaGlmdC5cbiIpKTsKLQkJCQkvKiBQb3Agd2hpbGUgd2UgYXJlIGluIGFuIGFjY2VwdC1vbmx5IHN0YXRlICovCi0JCQkJd2hpbGUgKHMgPSAmZC0+ZF9zdGF0ZQotCQkJCQkJW3BzLT5wX3N0YWNrLnNfdG9wLT5zX3N0YXRlXSwKLQkJCQkJcy0+c19hY2NlcHQgJiYgcy0+c19uYXJjcyA9PSAxKSB7Ci0JCQkJCUQocHJpbnRmKCIgIERGQSAnJXMnLCBzdGF0ZSAlZDogIgotCQkJCQkJICJEaXJlY3QgcG9wLlxuIiwKLQkJCQkJCSBkLT5kX25hbWUsCi0JCQkJCQkgcHMtPnBfc3RhY2suc190b3AtPnNfc3RhdGUpKTsKKyAgICByZWdpc3RlciBpbnQgaWxhYmVsOworICAgIGludCBlcnI7CisKKyAgICBEKHByaW50ZigiVG9rZW4gJXMvJyVzJyAuLi4gIiwgX1B5UGFyc2VyX1Rva2VuTmFtZXNbdHlwZV0sIHN0cikpOworCisgICAgLyogRmluZCBvdXQgd2hpY2ggbGFiZWwgdGhpcyB0b2tlbiBpcyAqLworICAgIGlsYWJlbCA9IGNsYXNzaWZ5KHBzLCB0eXBlLCBzdHIpOworICAgIGlmIChpbGFiZWwgPCAwKQorICAgICAgICByZXR1cm4gRV9TWU5UQVg7CisKKyAgICAvKiBMb29wIHVudGlsIHRoZSB0b2tlbiBpcyBzaGlmdGVkIG9yIGFuIGVycm9yIG9jY3VycmVkICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBGZXRjaCB0aGUgY3VycmVudCBkZmEgYW5kIHN0YXRlICovCisgICAgICAgIHJlZ2lzdGVyIGRmYSAqZCA9IHBzLT5wX3N0YWNrLnNfdG9wLT5zX2RmYTsKKyAgICAgICAgcmVnaXN0ZXIgc3RhdGUgKnMgPSAmZC0+ZF9zdGF0ZVtwcy0+cF9zdGFjay5zX3RvcC0+c19zdGF0ZV07CisKKyAgICAgICAgRChwcmludGYoIiBERkEgJyVzJywgc3RhdGUgJWQ6IiwKKyAgICAgICAgICAgIGQtPmRfbmFtZSwgcHMtPnBfc3RhY2suc190b3AtPnNfc3RhdGUpKTsKKworICAgICAgICAvKiBDaGVjayBhY2NlbGVyYXRvciAqLworICAgICAgICBpZiAocy0+c19sb3dlciA8PSBpbGFiZWwgJiYgaWxhYmVsIDwgcy0+c191cHBlcikgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IHggPSBzLT5zX2FjY2VsW2lsYWJlbCAtIHMtPnNfbG93ZXJdOworICAgICAgICAgICAgaWYgKHggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAoeCAmICgxPDw3KSkgeworICAgICAgICAgICAgICAgICAgICAvKiBQdXNoIG5vbi10ZXJtaW5hbCAqLworICAgICAgICAgICAgICAgICAgICBpbnQgbnQgPSAoeCA+PiA4KSArIE5UX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFycm93ID0geCAmICgoMTw8NyktMSk7CisgICAgICAgICAgICAgICAgICAgIGRmYSAqZDEgPSBQeUdyYW1tYXJfRmluZERGQSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzLT5wX2dyYW1tYXIsIG50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBwdXNoKCZwcy0+cF9zdGFjaywgbnQsIGQxLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3csIGxpbmVubywgY29sX29mZnNldCkpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRChwcmludGYoIiBNZW1FcnJvcjogcHVzaFxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBEKHByaW50ZigiIFB1c2ggLi4uXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFNoaWZ0IHRoZSB0b2tlbiAqLworICAgICAgICAgICAgICAgIGlmICgoZXJyID0gc2hpZnQoJnBzLT5wX3N0YWNrLCB0eXBlLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIGxpbmVubywgY29sX29mZnNldCkpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBEKHByaW50ZigiIE1lbUVycm9yOiBzaGlmdC5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRChwcmludGYoIiBTaGlmdC5cbiIpKTsKKyAgICAgICAgICAgICAgICAvKiBQb3Agd2hpbGUgd2UgYXJlIGluIGFuIGFjY2VwdC1vbmx5IHN0YXRlICovCisgICAgICAgICAgICAgICAgd2hpbGUgKHMgPSAmZC0+ZF9zdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHMtPnBfc3RhY2suc190b3AtPnNfc3RhdGVdLAorICAgICAgICAgICAgICAgICAgICBzLT5zX2FjY2VwdCAmJiBzLT5zX25hcmNzID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgRChwcmludGYoIiAgREZBICclcycsIHN0YXRlICVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXJlY3QgcG9wLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+ZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcy0+cF9zdGFjay5zX3RvcC0+c19zdGF0ZSkpOwogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAotCQkJCQlpZiAoZC0+ZF9uYW1lWzBdID09ICdpJyAmJgotCQkJCQkgICAgc3RyY21wKGQtPmRfbmFtZSwKLQkJCQkJCSAgICJpbXBvcnRfc3RtdCIpID09IDApCi0JCQkJCQlmdXR1cmVfaGFjayhwcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkLT5kX25hbWVbMF0gPT0gJ2knICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoZC0+ZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydF9zdG10IikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZV9oYWNrKHBzKTsKICNlbmRpZgotCQkJCQlzX3BvcCgmcHMtPnBfc3RhY2spOwotCQkJCQlpZiAoc19lbXB0eSgmcHMtPnBfc3RhY2spKSB7Ci0JCQkJCQlEKHByaW50ZigiICBBQ0NFUFQuXG4iKSk7Ci0JCQkJCQlyZXR1cm4gRV9ET05FOwotCQkJCQl9Ci0JCQkJCWQgPSBwcy0+cF9zdGFjay5zX3RvcC0+c19kZmE7Ci0JCQkJfQotCQkJCXJldHVybiBFX09LOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocy0+c19hY2NlcHQpIHsKKyAgICAgICAgICAgICAgICAgICAgc19wb3AoJnBzLT5wX3N0YWNrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNfZW1wdHkoJnBzLT5wX3N0YWNrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRChwcmludGYoIiAgQUNDRVBULlxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVfRE9ORTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkID0gcHMtPnBfc3RhY2suc190b3AtPnNfZGZhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRV9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5zX2FjY2VwdCkgewogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAotCQkJaWYgKGQtPmRfbmFtZVswXSA9PSAnaScgJiYKLQkJCSAgICBzdHJjbXAoZC0+ZF9uYW1lLCAiaW1wb3J0X3N0bXQiKSA9PSAwKQotCQkJCWZ1dHVyZV9oYWNrKHBzKTsKKyAgICAgICAgICAgIGlmIChkLT5kX25hbWVbMF0gPT0gJ2knICYmCisgICAgICAgICAgICAgICAgc3RyY21wKGQtPmRfbmFtZSwgImltcG9ydF9zdG10IikgPT0gMCkKKyAgICAgICAgICAgICAgICBmdXR1cmVfaGFjayhwcyk7CiAjZW5kaWYKLQkJCS8qIFBvcCB0aGlzIGRmYSBhbmQgdHJ5IGFnYWluICovCi0JCQlzX3BvcCgmcHMtPnBfc3RhY2spOwotCQkJRChwcmludGYoIiBQb3AgLi4uXG4iKSk7Ci0JCQlpZiAoc19lbXB0eSgmcHMtPnBfc3RhY2spKSB7Ci0JCQkJRChwcmludGYoIiBFcnJvcjogYm90dG9tIG9mIHN0YWNrLlxuIikpOwotCQkJCXJldHVybiBFX1NZTlRBWDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCQotCQkvKiBTdHVjaywgcmVwb3J0IHN5bnRheCBlcnJvciAqLwotCQlEKHByaW50ZigiIEVycm9yLlxuIikpOwotCQlpZiAoZXhwZWN0ZWRfcmV0KSB7Ci0JCQlpZiAocy0+c19sb3dlciA9PSBzLT5zX3VwcGVyIC0gMSkgewotCQkJCS8qIE9ubHkgb25lIHBvc3NpYmxlIGV4cGVjdGVkIHRva2VuICovCi0JCQkJKmV4cGVjdGVkX3JldCA9IHBzLT5wX2dyYW1tYXItPgotCQkJCSAgICBnX2xsLmxsX2xhYmVsW3MtPnNfbG93ZXJdLmxiX3R5cGU7Ci0JCQl9Ci0JCQllbHNlIAotCQkgICAgICAgIAkqZXhwZWN0ZWRfcmV0ID0gLTE7Ci0JCX0KLQkJcmV0dXJuIEVfU1lOVEFYOwotCX0KKyAgICAgICAgICAgIC8qIFBvcCB0aGlzIGRmYSBhbmQgdHJ5IGFnYWluICovCisgICAgICAgICAgICBzX3BvcCgmcHMtPnBfc3RhY2spOworICAgICAgICAgICAgRChwcmludGYoIiBQb3AgLi4uXG4iKSk7CisgICAgICAgICAgICBpZiAoc19lbXB0eSgmcHMtPnBfc3RhY2spKSB7CisgICAgICAgICAgICAgICAgRChwcmludGYoIiBFcnJvcjogYm90dG9tIG9mIHN0YWNrLlxuIikpOworICAgICAgICAgICAgICAgIHJldHVybiBFX1NZTlRBWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogU3R1Y2ssIHJlcG9ydCBzeW50YXggZXJyb3IgKi8KKyAgICAgICAgRChwcmludGYoIiBFcnJvci5cbiIpKTsKKyAgICAgICAgaWYgKGV4cGVjdGVkX3JldCkgeworICAgICAgICAgICAgaWYgKHMtPnNfbG93ZXIgPT0gcy0+c191cHBlciAtIDEpIHsKKyAgICAgICAgICAgICAgICAvKiBPbmx5IG9uZSBwb3NzaWJsZSBleHBlY3RlZCB0b2tlbiAqLworICAgICAgICAgICAgICAgICpleHBlY3RlZF9yZXQgPSBwcy0+cF9ncmFtbWFyLT4KKyAgICAgICAgICAgICAgICAgICAgZ19sbC5sbF9sYWJlbFtzLT5zX2xvd2VyXS5sYl90eXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpleHBlY3RlZF9yZXQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRV9TWU5UQVg7CisgICAgfQogfQogCiAKQEAgLTMyOSw2MiArMzI5LDYyIEBACiB2b2lkCiBkdW1wdHJlZShncmFtbWFyICpnLCBub2RlICpuKQogewotCWludCBpOwotCQotCWlmIChuID09IE5VTEwpCi0JCXByaW50ZigiTklMIik7Ci0JZWxzZSB7Ci0JCWxhYmVsIGw7Ci0JCWwubGJfdHlwZSA9IFRZUEUobik7Ci0JCWwubGJfc3RyID0gU1RSKG4pOwotCQlwcmludGYoIiVzIiwgUHlHcmFtbWFyX0xhYmVsUmVwcigmbCkpOwotCQlpZiAoSVNOT05URVJNSU5BTChUWVBFKG4pKSkgewotCQkJcHJpbnRmKCIoIik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgTkNIKG4pOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApCi0JCQkJCXByaW50ZigiLCIpOwotCQkJCWR1bXB0cmVlKGcsIENISUxEKG4sIGkpKTsKLQkJCX0KLQkJCXByaW50ZigiKSIpOwotCQl9Ci0JfQorICAgIGludCBpOworCisgICAgaWYgKG4gPT0gTlVMTCkKKyAgICAgICAgcHJpbnRmKCJOSUwiKTsKKyAgICBlbHNlIHsKKyAgICAgICAgbGFiZWwgbDsKKyAgICAgICAgbC5sYl90eXBlID0gVFlQRShuKTsKKyAgICAgICAgbC5sYl9zdHIgPSBTVFIobik7CisgICAgICAgIHByaW50ZigiJXMiLCBQeUdyYW1tYXJfTGFiZWxSZXByKCZsKSk7CisgICAgICAgIGlmIChJU05PTlRFUk1JTkFMKFRZUEUobikpKSB7CisgICAgICAgICAgICBwcmludGYoIigiKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQ0gobik7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIik7CisgICAgICAgICAgICAgICAgZHVtcHRyZWUoZywgQ0hJTEQobiwgaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIpIik7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHZvaWQKIHNob3d0cmVlKGdyYW1tYXIgKmcsIG5vZGUgKm4pCiB7Ci0JaW50IGk7Ci0JCi0JaWYgKG4gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWlmIChJU05PTlRFUk1JTkFMKFRZUEUobikpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBOQ0gobik7IGkrKykKLQkJCXNob3d0cmVlKGcsIENISUxEKG4sIGkpKTsKLQl9Ci0JZWxzZSBpZiAoSVNURVJNSU5BTChUWVBFKG4pKSkgewotCQlwcmludGYoIiVzIiwgX1B5UGFyc2VyX1Rva2VuTmFtZXNbVFlQRShuKV0pOwotCQlpZiAoVFlQRShuKSA9PSBOVU1CRVIgfHwgVFlQRShuKSA9PSBOQU1FKQotCQkJcHJpbnRmKCIoJXMpIiwgU1RSKG4pKTsKLQkJcHJpbnRmKCIgIik7Ci0JfQotCWVsc2UKLQkJcHJpbnRmKCI/ICIpOworICAgIGludCBpOworCisgICAgaWYgKG4gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChJU05PTlRFUk1JTkFMKFRZUEUobikpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQ0gobik7IGkrKykKKyAgICAgICAgICAgIHNob3d0cmVlKGcsIENISUxEKG4sIGkpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoSVNURVJNSU5BTChUWVBFKG4pKSkgeworICAgICAgICBwcmludGYoIiVzIiwgX1B5UGFyc2VyX1Rva2VuTmFtZXNbVFlQRShuKV0pOworICAgICAgICBpZiAoVFlQRShuKSA9PSBOVU1CRVIgfHwgVFlQRShuKSA9PSBOQU1FKQorICAgICAgICAgICAgcHJpbnRmKCIoJXMpIiwgU1RSKG4pKTsKKyAgICAgICAgcHJpbnRmKCIgIik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcHJpbnRmKCI/ICIpOwogfQogCiB2b2lkCiBwcmludHRyZWUocGFyc2VyX3N0YXRlICpwcykKIHsKLQlpZiAoUHlfRGVidWdGbGFnKSB7Ci0JCXByaW50ZigiUGFyc2UgdHJlZTpcbiIpOwotCQlkdW1wdHJlZShwcy0+cF9ncmFtbWFyLCBwcy0+cF90cmVlKTsKLQkJcHJpbnRmKCJcbiIpOwotCQlwcmludGYoIlRva2VuczpcbiIpOwotCQlzaG93dHJlZShwcy0+cF9ncmFtbWFyLCBwcy0+cF90cmVlKTsKLQkJcHJpbnRmKCJcbiIpOwotCX0KLQlwcmludGYoIkxpc3Rpbmc6XG4iKTsKLQlQeU5vZGVfTGlzdFRyZWUocHMtPnBfdHJlZSk7Ci0JcHJpbnRmKCJcbiIpOworICAgIGlmIChQeV9EZWJ1Z0ZsYWcpIHsKKyAgICAgICAgcHJpbnRmKCJQYXJzZSB0cmVlOlxuIik7CisgICAgICAgIGR1bXB0cmVlKHBzLT5wX2dyYW1tYXIsIHBzLT5wX3RyZWUpOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIHByaW50ZigiVG9rZW5zOlxuIik7CisgICAgICAgIHNob3d0cmVlKHBzLT5wX2dyYW1tYXIsIHBzLT5wX3RyZWUpOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorICAgIHByaW50ZigiTGlzdGluZzpcbiIpOworICAgIFB5Tm9kZV9MaXN0VHJlZShwcy0+cF90cmVlKTsKKyAgICBwcmludGYoIlxuIik7CiB9CiAKICNlbmRpZiAvKiBQeV9ERUJVRyAqLwpAQCAtNDE5LDE1ICs0MTksMTUgQEAKIAogQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBncmFtbWFyOgogCi1leHByOgl0ZXJtIChPUCB0ZXJtKSoKLXRlcm06CUNPTlNUQU5UIHwgJygnIGV4cHIgJyknCitleHByOiAgIHRlcm0gKE9QIHRlcm0pKgordGVybTogICBDT05TVEFOVCB8ICcoJyBleHByICcpJwogCiBUaGUgREZBIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bGUgZm9yIGV4cHIgaXM6CiAKIC0tLS0tLS0+Li0tLXRlcm0tLT4uLS0tLS0tLT4KLQleICAgICAgICAgIHwKLQl8ICAgICAgICAgIHwKLQlcLS0tLU9QLS0tLS8KKyAgICBeICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgIHwKKyAgICBcLS0tLU9QLS0tLS8KIAogVGhlIHBhcnNlIHRyZWUgZ2VuZXJhdGVkIGZvciB0aGUgaW5wdXQgYStiIGlzOgogCmRpZmYgLS1naXQgYS9QYXJzZXIvcGFyc2V0b2suYyBiL1BhcnNlci9wYXJzZXRvay5jCmluZGV4IDdmMmZiMzYuLmU4ZDM5NmEgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wYXJzZXRvay5jCisrKyBiL1BhcnNlci9wYXJzZXRvay5jCkBAIC0yMSw4OSArMjEsODkgQEAKIG5vZGUgKgogUHlQYXJzZXJfUGFyc2VTdHJpbmcoY29uc3QgY2hhciAqcywgZ3JhbW1hciAqZywgaW50IHN0YXJ0LCBwZXJyZGV0YWlsICplcnJfcmV0KQogewotCXJldHVybiBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUocywgTlVMTCwgZywgc3RhcnQsIGVycl9yZXQsIDApOworICAgIHJldHVybiBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUocywgTlVMTCwgZywgc3RhcnQsIGVycl9yZXQsIDApOwogfQogCiBub2RlICoKIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqcywgZ3JhbW1hciAqZywgaW50IHN0YXJ0LAotCQkgICAgICAgICAgcGVycmRldGFpbCAqZXJyX3JldCwgaW50IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJyZGV0YWlsICplcnJfcmV0LCBpbnQgZmxhZ3MpCiB7Ci0JcmV0dXJuIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZShzLCBOVUxMLAotCQkJCQkJIGcsIHN0YXJ0LCBlcnJfcmV0LCBmbGFncyk7CisgICAgcmV0dXJuIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZShzLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZywgc3RhcnQsIGVycl9yZXQsIGZsYWdzKTsKIH0KIAogbm9kZSAqCiBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkgIGdyYW1tYXIgKmcsIGludCBzdGFydCwKLQkJICAgICAgICAgIHBlcnJkZXRhaWwgKmVycl9yZXQsIGludCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hciAqZywgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJyZGV0YWlsICplcnJfcmV0LCBpbnQgZmxhZ3MpCiB7Ci0JaW50IGlmbGFncyA9IGZsYWdzOwotCXJldHVybiBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWVFeChzLCBmaWxlbmFtZSwgZywgc3RhcnQsCi0JCQkJCQkgICBlcnJfcmV0LCAmaWZsYWdzKTsKKyAgICBpbnQgaWZsYWdzID0gZmxhZ3M7CisgICAgcmV0dXJuIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZUV4KHMsIGZpbGVuYW1lLCBnLCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX3JldCwgJmlmbGFncyk7CiB9CiAKIG5vZGUgKgogUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lRXgoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkgIGdyYW1tYXIgKmcsIGludCBzdGFydCwKLQkJICAgICAgICAgIHBlcnJkZXRhaWwgKmVycl9yZXQsIGludCAqZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXIgKmcsIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGVycmRldGFpbCAqZXJyX3JldCwgaW50ICpmbGFncykKIHsKLQlzdHJ1Y3QgdG9rX3N0YXRlICp0b2s7CisgICAgc3RydWN0IHRva19zdGF0ZSAqdG9rOwogCi0JaW5pdGVycihlcnJfcmV0LCBmaWxlbmFtZSk7CisgICAgaW5pdGVycihlcnJfcmV0LCBmaWxlbmFtZSk7CiAKLQlpZiAoKHRvayA9IFB5VG9rZW5pemVyX0Zyb21TdHJpbmcocywgc3RhcnQgPT0gZmlsZV9pbnB1dCkpID09IE5VTEwpIHsKLQkJZXJyX3JldC0+ZXJyb3IgPSBQeUVycl9PY2N1cnJlZCgpID8gRV9ERUNPREUgOiBFX05PTUVNOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCh0b2sgPSBQeVRva2VuaXplcl9Gcm9tU3RyaW5nKHMsIHN0YXJ0ID09IGZpbGVfaW5wdXQpKSA9PSBOVUxMKSB7CisgICAgICAgIGVycl9yZXQtPmVycm9yID0gUHlFcnJfT2NjdXJyZWQoKSA/IEVfREVDT0RFIDogRV9OT01FTTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gICAgICAgIHRvay0+ZmlsZW5hbWUgPSBmaWxlbmFtZSA/IGZpbGVuYW1lIDogIjxzdHJpbmc+IjsKLQlpZiAoUHlfVGFiY2hlY2tGbGFnIHx8IFB5X1ZlcmJvc2VGbGFnKSB7Ci0JCXRvay0+YWx0d2FybmluZyA9ICh0b2stPmZpbGVuYW1lICE9IE5VTEwpOwotCQlpZiAoUHlfVGFiY2hlY2tGbGFnID49IDIpCi0JCQl0b2stPmFsdGVycm9yKys7Ci0JfQorICAgIHRvay0+ZmlsZW5hbWUgPSBmaWxlbmFtZSA/IGZpbGVuYW1lIDogIjxzdHJpbmc+IjsKKyAgICBpZiAoUHlfVGFiY2hlY2tGbGFnIHx8IFB5X1ZlcmJvc2VGbGFnKSB7CisgICAgICAgIHRvay0+YWx0d2FybmluZyA9ICh0b2stPmZpbGVuYW1lICE9IE5VTEwpOworICAgICAgICBpZiAoUHlfVGFiY2hlY2tGbGFnID49IDIpCisgICAgICAgICAgICB0b2stPmFsdGVycm9yKys7CisgICAgfQogCi0JcmV0dXJuIHBhcnNldG9rKHRvaywgZywgc3RhcnQsIGVycl9yZXQsIGZsYWdzKTsKKyAgICByZXR1cm4gcGFyc2V0b2sodG9rLCBnLCBzdGFydCwgZXJyX3JldCwgZmxhZ3MpOwogfQogCiAvKiBQYXJzZSBpbnB1dCBjb21pbmcgZnJvbSBhIGZpbGUuICBSZXR1cm4gZXJyb3IgY29kZSwgcHJpbnQgc29tZSBlcnJvcnMuICovCiAKIG5vZGUgKgogUHlQYXJzZXJfUGFyc2VGaWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgZ3JhbW1hciAqZywgaW50IHN0YXJ0LAotCQkgICBjaGFyICpwczEsIGNoYXIgKnBzMiwgcGVycmRldGFpbCAqZXJyX3JldCkKKyAgICAgICAgICAgICAgICAgICBjaGFyICpwczEsIGNoYXIgKnBzMiwgcGVycmRldGFpbCAqZXJyX3JldCkKIHsKLQlyZXR1cm4gUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3MoZnAsIGZpbGVuYW1lLCBnLCBzdGFydCwgcHMxLCBwczIsCi0JCQkJICAgICAgIGVycl9yZXQsIDApOworICAgIHJldHVybiBQeVBhcnNlcl9QYXJzZUZpbGVGbGFncyhmcCwgZmlsZW5hbWUsIGcsIHN0YXJ0LCBwczEsIHBzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX3JldCwgMCk7CiB9CiAKIG5vZGUgKgogUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBncmFtbWFyICpnLCBpbnQgc3RhcnQsCi0JCQljaGFyICpwczEsIGNoYXIgKnBzMiwgcGVycmRldGFpbCAqZXJyX3JldCwgaW50IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHMxLCBjaGFyICpwczIsIHBlcnJkZXRhaWwgKmVycl9yZXQsIGludCBmbGFncykKIHsKLQlpbnQgaWZsYWdzID0gZmxhZ3M7Ci0JcmV0dXJuIFB5UGFyc2VyX1BhcnNlRmlsZUZsYWdzRXgoZnAsIGZpbGVuYW1lLCBnLCBzdGFydCwgcHMxLCBwczIsIGVycl9yZXQsICZpZmxhZ3MpOworICAgIGludCBpZmxhZ3MgPSBmbGFnczsKKyAgICByZXR1cm4gUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3NFeChmcCwgZmlsZW5hbWUsIGcsIHN0YXJ0LCBwczEsIHBzMiwgZXJyX3JldCwgJmlmbGFncyk7CiB9CiAKIG5vZGUgKgogUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3NFeChGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGdyYW1tYXIgKmcsIGludCBzdGFydCwKLQkJCSAgY2hhciAqcHMxLCBjaGFyICpwczIsIHBlcnJkZXRhaWwgKmVycl9yZXQsIGludCAqZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBzMSwgY2hhciAqcHMyLCBwZXJyZGV0YWlsICplcnJfcmV0LCBpbnQgKmZsYWdzKQogewotCXN0cnVjdCB0b2tfc3RhdGUgKnRvazsKKyAgICBzdHJ1Y3QgdG9rX3N0YXRlICp0b2s7CiAKLQlpbml0ZXJyKGVycl9yZXQsIGZpbGVuYW1lKTsKKyAgICBpbml0ZXJyKGVycl9yZXQsIGZpbGVuYW1lKTsKIAotCWlmICgodG9rID0gUHlUb2tlbml6ZXJfRnJvbUZpbGUoZnAsIHBzMSwgcHMyKSkgPT0gTlVMTCkgewotCQllcnJfcmV0LT5lcnJvciA9IEVfTk9NRU07Ci0JCXJldHVybiBOVUxMOwotCX0KLQl0b2stPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JaWYgKFB5X1RhYmNoZWNrRmxhZyB8fCBQeV9WZXJib3NlRmxhZykgewotCQl0b2stPmFsdHdhcm5pbmcgPSAoZmlsZW5hbWUgIT0gTlVMTCk7Ci0JCWlmIChQeV9UYWJjaGVja0ZsYWcgPj0gMikKLQkJCXRvay0+YWx0ZXJyb3IrKzsKLQl9CisgICAgaWYgKCh0b2sgPSBQeVRva2VuaXplcl9Gcm9tRmlsZShmcCwgcHMxLCBwczIpKSA9PSBOVUxMKSB7CisgICAgICAgIGVycl9yZXQtPmVycm9yID0gRV9OT01FTTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHRvay0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgICBpZiAoUHlfVGFiY2hlY2tGbGFnIHx8IFB5X1ZlcmJvc2VGbGFnKSB7CisgICAgICAgIHRvay0+YWx0d2FybmluZyA9IChmaWxlbmFtZSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKFB5X1RhYmNoZWNrRmxhZyA+PSAyKQorICAgICAgICAgICAgdG9rLT5hbHRlcnJvcisrOworICAgIH0KIAotCXJldHVybiBwYXJzZXRvayh0b2ssIGcsIHN0YXJ0LCBlcnJfcmV0LCBmbGFncyk7CisgICAgcmV0dXJuIHBhcnNldG9rKHRvaywgZywgc3RhcnQsIGVycl9yZXQsIGZsYWdzKTsKIH0KIAogI2lmIDAKQEAgLTExNiw5ICsxMTYsOSBAQAogc3RhdGljIHZvaWQKIHdhcm4oY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykKIHsKLQlpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLQkJZmlsZW5hbWUgPSAiPHN0cmluZz4iOwotCVB5U3lzX1dyaXRlU3RkZXJyKG1zZywgZmlsZW5hbWUsIGxpbmVubyk7CisgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCisgICAgICAgIGZpbGVuYW1lID0gIjxzdHJpbmc+IjsKKyAgICBQeVN5c19Xcml0ZVN0ZGVycihtc2csIGZpbGVuYW1lLCBsaW5lbm8pOwogfQogI2VuZGlmCiAKQEAgLTEyNywxNTcgKzEyNywxNTcgQEAKIAogc3RhdGljIG5vZGUgKgogcGFyc2V0b2soc3RydWN0IHRva19zdGF0ZSAqdG9rLCBncmFtbWFyICpnLCBpbnQgc3RhcnQsIHBlcnJkZXRhaWwgKmVycl9yZXQsCi0JIGludCAqZmxhZ3MpCisgICAgICAgICBpbnQgKmZsYWdzKQogewotCXBhcnNlcl9zdGF0ZSAqcHM7Ci0Jbm9kZSAqbjsKLQlpbnQgc3RhcnRlZCA9IDAsIGhhbmRsaW5nX2ltcG9ydCA9IDAsIGhhbmRsaW5nX3dpdGggPSAwOworICAgIHBhcnNlcl9zdGF0ZSAqcHM7CisgICAgbm9kZSAqbjsKKyAgICBpbnQgc3RhcnRlZCA9IDAsIGhhbmRsaW5nX2ltcG9ydCA9IDAsIGhhbmRsaW5nX3dpdGggPSAwOwogCi0JaWYgKChwcyA9IFB5UGFyc2VyX05ldyhnLCBzdGFydCkpID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJubyBtZW0gZm9yIG5ldyBwYXJzZXJcbiIpOwotCQllcnJfcmV0LT5lcnJvciA9IEVfTk9NRU07Ci0JCVB5VG9rZW5pemVyX0ZyZWUodG9rKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgocHMgPSBQeVBhcnNlcl9OZXcoZywgc3RhcnQpKSA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm8gbWVtIGZvciBuZXcgcGFyc2VyXG4iKTsKKyAgICAgICAgZXJyX3JldC0+ZXJyb3IgPSBFX05PTUVNOworICAgICAgICBQeVRva2VuaXplcl9GcmVlKHRvayk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKLQlpZiAoKmZsYWdzICYgUHlQQVJTRV9QUklOVF9JU19GVU5DVElPTikgewotCQlwcy0+cF9mbGFncyB8PSBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT047Ci0JfQotCWlmICgqZmxhZ3MgJiBQeVBBUlNFX1VOSUNPREVfTElURVJBTFMpIHsKLQkJcHMtPnBfZmxhZ3MgfD0gQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFM7Ci0JfQorICAgIGlmICgqZmxhZ3MgJiBQeVBBUlNFX1BSSU5UX0lTX0ZVTkNUSU9OKSB7CisgICAgICAgIHBzLT5wX2ZsYWdzIHw9IENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTjsKKyAgICB9CisgICAgaWYgKCpmbGFncyAmIFB5UEFSU0VfVU5JQ09ERV9MSVRFUkFMUykgeworICAgICAgICBwcy0+cF9mbGFncyB8PSBDT19GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUzsKKyAgICB9CiAKICNlbmRpZgogCi0JZm9yICg7OykgewotCQljaGFyICphLCAqYjsKLQkJaW50IHR5cGU7Ci0JCXNpemVfdCBsZW47Ci0JCWNoYXIgKnN0cjsKLQkJaW50IGNvbF9vZmZzZXQ7CisgICAgZm9yICg7OykgeworICAgICAgICBjaGFyICphLCAqYjsKKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIHNpemVfdCBsZW47CisgICAgICAgIGNoYXIgKnN0cjsKKyAgICAgICAgaW50IGNvbF9vZmZzZXQ7CiAKLQkJdHlwZSA9IFB5VG9rZW5pemVyX0dldCh0b2ssICZhLCAmYik7Ci0JCWlmICh0eXBlID09IEVSUk9SVE9LRU4pIHsKLQkJCWVycl9yZXQtPmVycm9yID0gdG9rLT5kb25lOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gRU5ETUFSS0VSICYmIHN0YXJ0ZWQpIHsKLQkJCXR5cGUgPSBORVdMSU5FOyAvKiBBZGQgYW4gZXh0cmEgbmV3bGluZSAqLwotCQkJaGFuZGxpbmdfd2l0aCA9IGhhbmRsaW5nX2ltcG9ydCA9IDA7Ci0JCQlzdGFydGVkID0gMDsKLQkJCS8qIEFkZCB0aGUgcmlnaHQgbnVtYmVyIG9mIGRlZGVudCB0b2tlbnMsCi0JCQkgICBleGNlcHQgaWYgYSBjZXJ0YWluIGZsYWcgaXMgZ2l2ZW4gLS0KLQkJCSAgIGNvZGVvcC5weSB1c2VzIHRoaXMuICovCi0JCQlpZiAodG9rLT5pbmRlbnQgJiYKLQkJCSAgICAhKCpmbGFncyAmIFB5UEFSU0VfRE9OVF9JTVBMWV9ERURFTlQpKQotCQkJewotCQkJCXRvay0+cGVuZGluID0gLXRvay0+aW5kZW50OwotCQkJCXRvay0+aW5kZW50ID0gMDsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQlzdGFydGVkID0gMTsKLQkJbGVuID0gYiAtIGE7IC8qIFhYWCB0aGlzIG1heSBjb21wdXRlIE5VTEwgLSBOVUxMICovCi0JCXN0ciA9IChjaGFyICopIFB5T2JqZWN0X01BTExPQyhsZW4gKyAxKTsKLQkJaWYgKHN0ciA9PSBOVUxMKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSBmb3IgbmV4dCB0b2tlblxuIik7Ci0JCQllcnJfcmV0LT5lcnJvciA9IEVfTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCQlpZiAobGVuID4gMCkKLQkJCXN0cm5jcHkoc3RyLCBhLCBsZW4pOwotCQlzdHJbbGVuXSA9ICdcMCc7CisgICAgICAgIHR5cGUgPSBQeVRva2VuaXplcl9HZXQodG9rLCAmYSwgJmIpOworICAgICAgICBpZiAodHlwZSA9PSBFUlJPUlRPS0VOKSB7CisgICAgICAgICAgICBlcnJfcmV0LT5lcnJvciA9IHRvay0+ZG9uZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IEVORE1BUktFUiAmJiBzdGFydGVkKSB7CisgICAgICAgICAgICB0eXBlID0gTkVXTElORTsgLyogQWRkIGFuIGV4dHJhIG5ld2xpbmUgKi8KKyAgICAgICAgICAgIGhhbmRsaW5nX3dpdGggPSBoYW5kbGluZ19pbXBvcnQgPSAwOworICAgICAgICAgICAgc3RhcnRlZCA9IDA7CisgICAgICAgICAgICAvKiBBZGQgdGhlIHJpZ2h0IG51bWJlciBvZiBkZWRlbnQgdG9rZW5zLAorICAgICAgICAgICAgICAgZXhjZXB0IGlmIGEgY2VydGFpbiBmbGFnIGlzIGdpdmVuIC0tCisgICAgICAgICAgICAgICBjb2Rlb3AucHkgdXNlcyB0aGlzLiAqLworICAgICAgICAgICAgaWYgKHRvay0+aW5kZW50ICYmCisgICAgICAgICAgICAgICAgISgqZmxhZ3MgJiBQeVBBUlNFX0RPTlRfSU1QTFlfREVERU5UKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b2stPnBlbmRpbiA9IC10b2stPmluZGVudDsKKyAgICAgICAgICAgICAgICB0b2stPmluZGVudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhcnRlZCA9IDE7CisgICAgICAgIGxlbiA9IGIgLSBhOyAvKiBYWFggdGhpcyBtYXkgY29tcHV0ZSBOVUxMIC0gTlVMTCAqLworICAgICAgICBzdHIgPSAoY2hhciAqKSBQeU9iamVjdF9NQUxMT0MobGVuICsgMSk7CisgICAgICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJubyBtZW0gZm9yIG5leHQgdG9rZW5cbiIpOworICAgICAgICAgICAgZXJyX3JldC0+ZXJyb3IgPSBFX05PTUVNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICBzdHJuY3B5KHN0ciwgYSwgbGVuKTsKKyAgICAgICAgc3RyW2xlbl0gPSAnXDAnOwogCiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECiAjZW5kaWYKLQkJaWYgKGEgPj0gdG9rLT5saW5lX3N0YXJ0KQotCQkJY29sX29mZnNldCA9IGEgLSB0b2stPmxpbmVfc3RhcnQ7Ci0JCWVsc2UKLQkJCWNvbF9vZmZzZXQgPSAtMTsKLQkJCQotCQlpZiAoKGVycl9yZXQtPmVycm9yID0KLQkJICAgICBQeVBhcnNlcl9BZGRUb2tlbihwcywgKGludCl0eXBlLCBzdHIsIHRvay0+bGluZW5vLCBjb2xfb2Zmc2V0LAotCQkJCSAgICAgICAmKGVycl9yZXQtPmV4cGVjdGVkKSkpICE9IEVfT0spIHsKLQkJCWlmIChlcnJfcmV0LT5lcnJvciAhPSBFX0RPTkUpIHsKLQkJCQlQeU9iamVjdF9GUkVFKHN0cik7Ci0JCQkJZXJyX3JldC0+dG9rZW4gPSB0eXBlOwotCQkJfQkJCQkKLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgICAgICBpZiAoYSA+PSB0b2stPmxpbmVfc3RhcnQpCisgICAgICAgICAgICBjb2xfb2Zmc2V0ID0gYSAtIHRvay0+bGluZV9zdGFydDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29sX29mZnNldCA9IC0xOwogCi0JaWYgKGVycl9yZXQtPmVycm9yID09IEVfRE9ORSkgewotCQluID0gcHMtPnBfdHJlZTsKLQkJcHMtPnBfdHJlZSA9IE5VTEw7Ci0JfQotCWVsc2UKLQkJbiA9IE5VTEw7CisgICAgICAgIGlmICgoZXJyX3JldC0+ZXJyb3IgPQorICAgICAgICAgICAgIFB5UGFyc2VyX0FkZFRva2VuKHBzLCAoaW50KXR5cGUsIHN0ciwgdG9rLT5saW5lbm8sIGNvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihlcnJfcmV0LT5leHBlY3RlZCkpKSAhPSBFX09LKSB7CisgICAgICAgICAgICBpZiAoZXJyX3JldC0+ZXJyb3IgIT0gRV9ET05FKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3RfRlJFRShzdHIpOworICAgICAgICAgICAgICAgIGVycl9yZXQtPnRva2VuID0gdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVycl9yZXQtPmVycm9yID09IEVfRE9ORSkgeworICAgICAgICBuID0gcHMtPnBfdHJlZTsKKyAgICAgICAgcHMtPnBfdHJlZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbiA9IE5VTEw7CiAKICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKLQkqZmxhZ3MgPSBwcy0+cF9mbGFnczsKKyAgICAqZmxhZ3MgPSBwcy0+cF9mbGFnczsKICNlbmRpZgotCVB5UGFyc2VyX0RlbGV0ZShwcyk7CisgICAgUHlQYXJzZXJfRGVsZXRlKHBzKTsKIAotCWlmIChuID09IE5VTEwpIHsKLQkJaWYgKHRvay0+bGluZW5vIDw9IDEgJiYgdG9rLT5kb25lID09IEVfRU9GKQotCQkJZXJyX3JldC0+ZXJyb3IgPSBFX0VPRjsKLQkJZXJyX3JldC0+bGluZW5vID0gdG9rLT5saW5lbm87Ci0JCWlmICh0b2stPmJ1ZiAhPSBOVUxMKSB7Ci0JCQljaGFyICp0ZXh0ID0gTlVMTDsKLQkJCXNpemVfdCBsZW47Ci0JCQlhc3NlcnQodG9rLT5jdXIgLSB0b2stPmJ1ZiA8IElOVF9NQVgpOwotCQkJZXJyX3JldC0+b2Zmc2V0ID0gKGludCkodG9rLT5jdXIgLSB0b2stPmJ1Zik7Ci0JCQlsZW4gPSB0b2stPmlucCAtIHRvay0+YnVmOworICAgIGlmIChuID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHRvay0+bGluZW5vIDw9IDEgJiYgdG9rLT5kb25lID09IEVfRU9GKQorICAgICAgICAgICAgZXJyX3JldC0+ZXJyb3IgPSBFX0VPRjsKKyAgICAgICAgZXJyX3JldC0+bGluZW5vID0gdG9rLT5saW5lbm87CisgICAgICAgIGlmICh0b2stPmJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICBjaGFyICp0ZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIHNpemVfdCBsZW47CisgICAgICAgICAgICBhc3NlcnQodG9rLT5jdXIgLSB0b2stPmJ1ZiA8IElOVF9NQVgpOworICAgICAgICAgICAgZXJyX3JldC0+b2Zmc2V0ID0gKGludCkodG9rLT5jdXIgLSB0b2stPmJ1Zik7CisgICAgICAgICAgICBsZW4gPSB0b2stPmlucCAtIHRvay0+YnVmOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCXRleHQgPSBQeVRva2VuaXplcl9SZXN0b3JlRW5jb2RpbmcodG9rLCBsZW4sICZlcnJfcmV0LT5vZmZzZXQpOworICAgICAgICAgICAgdGV4dCA9IFB5VG9rZW5pemVyX1Jlc3RvcmVFbmNvZGluZyh0b2ssIGxlbiwgJmVycl9yZXQtPm9mZnNldCk7CiAKICNlbmRpZgotCQkJaWYgKHRleHQgPT0gTlVMTCkgewotCQkJCXRleHQgPSAoY2hhciAqKSBQeU9iamVjdF9NQUxMT0MobGVuICsgMSk7Ci0JCQkJaWYgKHRleHQgIT0gTlVMTCkgewotCQkJCQlpZiAobGVuID4gMCkKLQkJCQkJCXN0cm5jcHkodGV4dCwgdG9rLT5idWYsIGxlbik7Ci0JCQkJCXRleHRbbGVuXSA9ICdcMCc7Ci0JCQkJfQotCQkJfQotCQkJZXJyX3JldC0+dGV4dCA9IHRleHQ7Ci0JCX0KLQl9IGVsc2UgaWYgKHRvay0+ZW5jb2RpbmcgIT0gTlVMTCkgewotCQkvKiAnbm9kZXMtPm5fc3RyJyB1c2VzIFB5T2JqZWN0XyosIHdoaWxlICd0b2stPmVuY29kaW5nJyB3YXMKLQkJICogYWxsb2NhdGVkIHVzaW5nIFB5TWVtXwotCQkgKi8KLQkJbm9kZSogciA9IFB5Tm9kZV9OZXcoZW5jb2RpbmdfZGVjbCk7Ci0JCWlmIChyKQotCQkJci0+bl9zdHIgPSBQeU9iamVjdF9NQUxMT0Moc3RybGVuKHRvay0+ZW5jb2RpbmcpKzEpOwotCQlpZiAoIXIgfHwgIXItPm5fc3RyKSB7Ci0JCQllcnJfcmV0LT5lcnJvciA9IEVfTk9NRU07Ci0JCQlpZiAocikKLQkJCQlQeU9iamVjdF9GUkVFKHIpOwotCQkJbiA9IE5VTEw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJc3RyY3B5KHItPm5fc3RyLCB0b2stPmVuY29kaW5nKTsKLQkJUHlNZW1fRlJFRSh0b2stPmVuY29kaW5nKTsKLQkJdG9rLT5lbmNvZGluZyA9IE5VTEw7Ci0JCXItPm5fbmNoaWxkcmVuID0gMTsKLQkJci0+bl9jaGlsZCA9IG47Ci0JCW4gPSByOwotCX0KKyAgICAgICAgICAgIGlmICh0ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gKGNoYXIgKikgUHlPYmplY3RfTUFMTE9DKGxlbiArIDEpOworICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KHRleHQsIHRvay0+YnVmLCBsZW4pOworICAgICAgICAgICAgICAgICAgICB0ZXh0W2xlbl0gPSAnXDAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycl9yZXQtPnRleHQgPSB0ZXh0OworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpIHsKKyAgICAgICAgLyogJ25vZGVzLT5uX3N0cicgdXNlcyBQeU9iamVjdF8qLCB3aGlsZSAndG9rLT5lbmNvZGluZycgd2FzCisgICAgICAgICAqIGFsbG9jYXRlZCB1c2luZyBQeU1lbV8KKyAgICAgICAgICovCisgICAgICAgIG5vZGUqIHIgPSBQeU5vZGVfTmV3KGVuY29kaW5nX2RlY2wpOworICAgICAgICBpZiAocikKKyAgICAgICAgICAgIHItPm5fc3RyID0gUHlPYmplY3RfTUFMTE9DKHN0cmxlbih0b2stPmVuY29kaW5nKSsxKTsKKyAgICAgICAgaWYgKCFyIHx8ICFyLT5uX3N0cikgeworICAgICAgICAgICAgZXJyX3JldC0+ZXJyb3IgPSBFX05PTUVNOworICAgICAgICAgICAgaWYgKHIpCisgICAgICAgICAgICAgICAgUHlPYmplY3RfRlJFRShyKTsKKyAgICAgICAgICAgIG4gPSBOVUxMOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgICAgIHN0cmNweShyLT5uX3N0ciwgdG9rLT5lbmNvZGluZyk7CisgICAgICAgIFB5TWVtX0ZSRUUodG9rLT5lbmNvZGluZyk7CisgICAgICAgIHRvay0+ZW5jb2RpbmcgPSBOVUxMOworICAgICAgICByLT5uX25jaGlsZHJlbiA9IDE7CisgICAgICAgIHItPm5fY2hpbGQgPSBuOworICAgICAgICBuID0gcjsKKyAgICB9CiAKIGRvbmU6Ci0JUHlUb2tlbml6ZXJfRnJlZSh0b2spOworICAgIFB5VG9rZW5pemVyX0ZyZWUodG9rKTsKIAotCXJldHVybiBuOworICAgIHJldHVybiBuOwogfQogCiBzdGF0aWMgdm9pZAogaW5pdGVycihwZXJyZGV0YWlsICplcnJfcmV0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQllcnJfcmV0LT5lcnJvciA9IEVfT0s7Ci0JZXJyX3JldC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQllcnJfcmV0LT5saW5lbm8gPSAwOwotCWVycl9yZXQtPm9mZnNldCA9IDA7Ci0JZXJyX3JldC0+dGV4dCA9IE5VTEw7Ci0JZXJyX3JldC0+dG9rZW4gPSAtMTsKLQllcnJfcmV0LT5leHBlY3RlZCA9IC0xOworICAgIGVycl9yZXQtPmVycm9yID0gRV9PSzsKKyAgICBlcnJfcmV0LT5maWxlbmFtZSA9IGZpbGVuYW1lOworICAgIGVycl9yZXQtPmxpbmVubyA9IDA7CisgICAgZXJyX3JldC0+b2Zmc2V0ID0gMDsKKyAgICBlcnJfcmV0LT50ZXh0ID0gTlVMTDsKKyAgICBlcnJfcmV0LT50b2tlbiA9IC0xOworICAgIGVycl9yZXQtPmV4cGVjdGVkID0gLTE7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvcGdlbi5jIGIvUGFyc2VyL3BnZW4uYwppbmRleCA5NTlhNWQzLi5iZWFmNTNiIDEwMDY0NAotLS0gYS9QYXJzZXIvcGdlbi5jCisrKyBiL1BhcnNlci9wZ2VuLmMKQEAgLTE3LDg1ICsxNyw4NSBAQAogLyogUEFSVCBPTkUgLS0gQ09OU1RSVUNUIE5GQSAtLSBDZi4gQWxnb3JpdGhtIDMuMiBmcm9tIFtBaG8mVWxsbWFuIDc3XSAqLwogCiB0eXBlZGVmIHN0cnVjdCBfbmZhYXJjIHsKLQlpbnQJYXJfbGFiZWw7Ci0JaW50CWFyX2Fycm93OworICAgIGludCAgICAgICAgIGFyX2xhYmVsOworICAgIGludCAgICAgICAgIGFyX2Fycm93OwogfSBuZmFhcmM7CiAKIHR5cGVkZWYgc3RydWN0IF9uZmFzdGF0ZSB7Ci0JaW50CXN0X25hcmNzOwotCW5mYWFyYwkqc3RfYXJjOworICAgIGludCAgICAgICAgIHN0X25hcmNzOworICAgIG5mYWFyYyAgICAgICpzdF9hcmM7CiB9IG5mYXN0YXRlOwogCiB0eXBlZGVmIHN0cnVjdCBfbmZhIHsKLQlpbnQJCW5mX3R5cGU7Ci0JY2hhcgkJKm5mX25hbWU7Ci0JaW50CQluZl9uc3RhdGVzOwotCW5mYXN0YXRlCSpuZl9zdGF0ZTsKLQlpbnQJCW5mX3N0YXJ0LCBuZl9maW5pc2g7CisgICAgaW50ICAgICAgICAgICAgICAgICBuZl90eXBlOworICAgIGNoYXIgICAgICAgICAgICAgICAgKm5mX25hbWU7CisgICAgaW50ICAgICAgICAgICAgICAgICBuZl9uc3RhdGVzOworICAgIG5mYXN0YXRlICAgICAgICAgICAgKm5mX3N0YXRlOworICAgIGludCAgICAgICAgICAgICAgICAgbmZfc3RhcnQsIG5mX2ZpbmlzaDsKIH0gbmZhOwogCiAvKiBGb3J3YXJkICovCiBzdGF0aWMgdm9pZCBjb21waWxlX3JocyhsYWJlbGxpc3QgKmxsLAotCQkJbmZhICpuZiwgbm9kZSAqbiwgaW50ICpwYSwgaW50ICpwYik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKTsKIHN0YXRpYyB2b2lkIGNvbXBpbGVfYWx0KGxhYmVsbGlzdCAqbGwsCi0JCQluZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpOwogc3RhdGljIHZvaWQgY29tcGlsZV9pdGVtKGxhYmVsbGlzdCAqbGwsCi0JCQkgbmZhICpuZiwgbm9kZSAqbiwgaW50ICpwYSwgaW50ICpwYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgbmZhICpuZiwgbm9kZSAqbiwgaW50ICpwYSwgaW50ICpwYik7CiBzdGF0aWMgdm9pZCBjb21waWxlX2F0b20obGFiZWxsaXN0ICpsbCwKLQkJCSBuZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKTsKIAogc3RhdGljIGludAogYWRkbmZhc3RhdGUobmZhICpuZikKIHsKLQluZmFzdGF0ZSAqc3Q7Ci0JCi0JbmYtPm5mX3N0YXRlID0gKG5mYXN0YXRlICopUHlPYmplY3RfUkVBTExPQyhuZi0+bmZfc3RhdGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5mYXN0YXRlKSAqIChuZi0+bmZfbnN0YXRlcyArIDEpKTsKLQlpZiAobmYtPm5mX3N0YXRlID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm91dCBvZiBtZW0iKTsKLQlzdCA9ICZuZi0+bmZfc3RhdGVbbmYtPm5mX25zdGF0ZXMrK107Ci0Jc3QtPnN0X25hcmNzID0gMDsKLQlzdC0+c3RfYXJjID0gTlVMTDsKLQlyZXR1cm4gc3QgLSBuZi0+bmZfc3RhdGU7CisgICAgbmZhc3RhdGUgKnN0OworCisgICAgbmYtPm5mX3N0YXRlID0gKG5mYXN0YXRlICopUHlPYmplY3RfUkVBTExPQyhuZi0+bmZfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZmFzdGF0ZSkgKiAobmYtPm5mX25zdGF0ZXMgKyAxKSk7CisgICAgaWYgKG5mLT5uZl9zdGF0ZSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7CisgICAgc3QgPSAmbmYtPm5mX3N0YXRlW25mLT5uZl9uc3RhdGVzKytdOworICAgIHN0LT5zdF9uYXJjcyA9IDA7CisgICAgc3QtPnN0X2FyYyA9IE5VTEw7CisgICAgcmV0dXJuIHN0IC0gbmYtPm5mX3N0YXRlOwogfQogCiBzdGF0aWMgdm9pZAogYWRkbmZhYXJjKG5mYSAqbmYsIGludCBmcm9tLCBpbnQgdG8sIGludCBsYmwpCiB7Ci0JbmZhc3RhdGUgKnN0OwotCW5mYWFyYyAqYXI7Ci0JCi0Jc3QgPSAmbmYtPm5mX3N0YXRlW2Zyb21dOwotCXN0LT5zdF9hcmMgPSAobmZhYXJjICopUHlPYmplY3RfUkVBTExPQyhzdC0+c3RfYXJjLAotCQkJCSAgICAgIHNpemVvZihuZmFhcmMpICogKHN0LT5zdF9uYXJjcyArIDEpKTsKLQlpZiAoc3QtPnN0X2FyYyA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7Ci0JYXIgPSAmc3QtPnN0X2FyY1tzdC0+c3RfbmFyY3MrK107Ci0JYXItPmFyX2xhYmVsID0gbGJsOwotCWFyLT5hcl9hcnJvdyA9IHRvOworICAgIG5mYXN0YXRlICpzdDsKKyAgICBuZmFhcmMgKmFyOworCisgICAgc3QgPSAmbmYtPm5mX3N0YXRlW2Zyb21dOworICAgIHN0LT5zdF9hcmMgPSAobmZhYXJjICopUHlPYmplY3RfUkVBTExPQyhzdC0+c3RfYXJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZmFhcmMpICogKHN0LT5zdF9uYXJjcyArIDEpKTsKKyAgICBpZiAoc3QtPnN0X2FyYyA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7CisgICAgYXIgPSAmc3QtPnN0X2FyY1tzdC0+c3RfbmFyY3MrK107CisgICAgYXItPmFyX2xhYmVsID0gbGJsOworICAgIGFyLT5hcl9hcnJvdyA9IHRvOwogfQogCiBzdGF0aWMgbmZhICoKIG5ld25mYShjaGFyICpuYW1lKQogewotCW5mYSAqbmY7Ci0Jc3RhdGljIGludCB0eXBlID0gTlRfT0ZGU0VUOyAvKiBBbGwgdHlwZXMgd2lsbCBiZSBkaXNqdW5jdCAqLwotCQotCW5mID0gKG5mYSAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YobmZhKSk7Ci0JaWYgKG5mID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IG5mYSIpOwotCW5mLT5uZl90eXBlID0gdHlwZSsrOwotCW5mLT5uZl9uYW1lID0gbmFtZTsgLyogWFhYIHN0cmR1cChuYW1lKSA/Pz8gKi8KLQluZi0+bmZfbnN0YXRlcyA9IDA7Ci0JbmYtPm5mX3N0YXRlID0gTlVMTDsKLQluZi0+bmZfc3RhcnQgPSBuZi0+bmZfZmluaXNoID0gLTE7Ci0JcmV0dXJuIG5mOworICAgIG5mYSAqbmY7CisgICAgc3RhdGljIGludCB0eXBlID0gTlRfT0ZGU0VUOyAvKiBBbGwgdHlwZXMgd2lsbCBiZSBkaXNqdW5jdCAqLworCisgICAgbmYgPSAobmZhICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihuZmEpKTsKKyAgICBpZiAobmYgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgbmZhIik7CisgICAgbmYtPm5mX3R5cGUgPSB0eXBlKys7CisgICAgbmYtPm5mX25hbWUgPSBuYW1lOyAvKiBYWFggc3RyZHVwKG5hbWUpID8/PyAqLworICAgIG5mLT5uZl9uc3RhdGVzID0gMDsKKyAgICBuZi0+bmZfc3RhdGUgPSBOVUxMOworICAgIG5mLT5uZl9zdGFydCA9IG5mLT5uZl9maW5pc2ggPSAtMTsKKyAgICByZXR1cm4gbmY7CiB9CiAKIHR5cGVkZWYgc3RydWN0IF9uZmFncmFtbWFyIHsKLQlpbnQJCWdyX25uZmFzOwotCW5mYQkJKipncl9uZmE7Ci0JbGFiZWxsaXN0CWdyX2xsOworICAgIGludCAgICAgICAgICAgICAgICAgZ3Jfbm5mYXM7CisgICAgbmZhICAgICAgICAgICAgICAgICAqKmdyX25mYTsKKyAgICBsYWJlbGxpc3QgICAgICAgICAgIGdyX2xsOwogfSBuZmFncmFtbWFyOwogCiAvKiBGb3J3YXJkICovCkBAIC0xMDQsMzIgKzEwNCwzMiBAQAogc3RhdGljIG5mYWdyYW1tYXIgKgogbmV3bmZhZ3JhbW1hcih2b2lkKQogewotCW5mYWdyYW1tYXIgKmdyOwotCQotCWdyID0gKG5mYWdyYW1tYXIgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKG5mYWdyYW1tYXIpKTsKLQlpZiAoZ3IgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgbmZhIGdyYW1tYXIiKTsKLQlnci0+Z3Jfbm5mYXMgPSAwOwotCWdyLT5ncl9uZmEgPSBOVUxMOwotCWdyLT5ncl9sbC5sbF9ubGFiZWxzID0gMDsKLQlnci0+Z3JfbGwubGxfbGFiZWwgPSBOVUxMOwotCWFkZGxhYmVsKCZnci0+Z3JfbGwsIEVORE1BUktFUiwgIkVNUFRZIik7Ci0JcmV0dXJuIGdyOworICAgIG5mYWdyYW1tYXIgKmdyOworCisgICAgZ3IgPSAobmZhZ3JhbW1hciAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YobmZhZ3JhbW1hcikpOworICAgIGlmIChnciA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIG5ldyBuZmEgZ3JhbW1hciIpOworICAgIGdyLT5ncl9ubmZhcyA9IDA7CisgICAgZ3ItPmdyX25mYSA9IE5VTEw7CisgICAgZ3ItPmdyX2xsLmxsX25sYWJlbHMgPSAwOworICAgIGdyLT5ncl9sbC5sbF9sYWJlbCA9IE5VTEw7CisgICAgYWRkbGFiZWwoJmdyLT5ncl9sbCwgRU5ETUFSS0VSLCAiRU1QVFkiKTsKKyAgICByZXR1cm4gZ3I7CiB9CiAKIHN0YXRpYyBuZmEgKgogYWRkbmZhKG5mYWdyYW1tYXIgKmdyLCBjaGFyICpuYW1lKQogewotCW5mYSAqbmY7Ci0JCi0JbmYgPSBuZXduZmEobmFtZSk7Ci0JZ3ItPmdyX25mYSA9IChuZmEgKiopUHlPYmplY3RfUkVBTExPQyhnci0+Z3JfbmZhLAotCQkJCSAgICAgIHNpemVvZihuZmEqKSAqIChnci0+Z3Jfbm5mYXMgKyAxKSk7Ci0JaWYgKGdyLT5ncl9uZmEgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOwotCWdyLT5ncl9uZmFbZ3ItPmdyX25uZmFzKytdID0gbmY7Ci0JYWRkbGFiZWwoJmdyLT5ncl9sbCwgTkFNRSwgbmYtPm5mX25hbWUpOwotCXJldHVybiBuZjsKKyAgICBuZmEgKm5mOworCisgICAgbmYgPSBuZXduZmEobmFtZSk7CisgICAgZ3ItPmdyX25mYSA9IChuZmEgKiopUHlPYmplY3RfUkVBTExPQyhnci0+Z3JfbmZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZmEqKSAqIChnci0+Z3Jfbm5mYXMgKyAxKSk7CisgICAgaWYgKGdyLT5ncl9uZmEgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOworICAgIGdyLT5ncl9uZmFbZ3ItPmdyX25uZmFzKytdID0gbmY7CisgICAgYWRkbGFiZWwoJmdyLT5ncl9sbCwgTkFNRSwgbmYtPm5mX25hbWUpOworICAgIHJldHVybiBuZjsKIH0KIAogI2lmZGVmIFB5X0RFQlVHCkBAIC0xMzcsMjAzICsxMzcsMjAzIEBACiBzdGF0aWMgY2hhciBSRVFORk1UW10gPSAibWV0YWNvbXBpbGU6IGxlc3MgdGhhbiAlZCBjaGlsZHJlblxuIjsKIAogI2RlZmluZSBSRVFOKGksIGNvdW50KSBcCi0gCWlmIChpIDwgY291bnQpIHsgXAotCQlmcHJpbnRmKHN0ZGVyciwgUkVRTkZNVCwgY291bnQpOyBcCi0JCVB5X0ZhdGFsRXJyb3IoIlJFUU4iKTsgXAotCX0gZWxzZQorICAgIGlmIChpIDwgY291bnQpIHsgXAorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUkVRTkZNVCwgY291bnQpOyBcCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlJFUU4iKTsgXAorICAgIH0gZWxzZQogCiAjZWxzZQotI2RlZmluZSBSRVFOKGksIGNvdW50KQkvKiBlbXB0eSAqLworI2RlZmluZSBSRVFOKGksIGNvdW50KSAgLyogZW1wdHkgKi8KICNlbmRpZgogCiBzdGF0aWMgbmZhZ3JhbW1hciAqCiBtZXRhY29tcGlsZShub2RlICpuKQogewotCW5mYWdyYW1tYXIgKmdyOwotCWludCBpOworICAgIG5mYWdyYW1tYXIgKmdyOworICAgIGludCBpOwogCi0JaWYgKFB5X0RlYnVnRmxhZykKLQkJcHJpbnRmKCJDb21waWxpbmcgKG1ldGEtKSBwYXJzZSB0cmVlIGludG8gTkZBIGdyYW1tYXJcbiIpOwotCWdyID0gbmV3bmZhZ3JhbW1hcigpOwotCVJFUShuLCBNU1RBUlQpOwotCWkgPSBuLT5uX25jaGlsZHJlbiAtIDE7IC8qIExhc3QgY2hpbGQgaXMgRU5ETUFSS0VSICovCi0JbiA9IG4tPm5fY2hpbGQ7Ci0JZm9yICg7IC0taSA+PSAwOyBuKyspIHsKLQkJaWYgKG4tPm5fdHlwZSAhPSBORVdMSU5FKQotCQkJY29tcGlsZV9ydWxlKGdyLCBuKTsKLQl9Ci0JcmV0dXJuIGdyOworICAgIGlmIChQeV9EZWJ1Z0ZsYWcpCisgICAgICAgIHByaW50ZigiQ29tcGlsaW5nIChtZXRhLSkgcGFyc2UgdHJlZSBpbnRvIE5GQSBncmFtbWFyXG4iKTsKKyAgICBnciA9IG5ld25mYWdyYW1tYXIoKTsKKyAgICBSRVEobiwgTVNUQVJUKTsKKyAgICBpID0gbi0+bl9uY2hpbGRyZW4gLSAxOyAvKiBMYXN0IGNoaWxkIGlzIEVORE1BUktFUiAqLworICAgIG4gPSBuLT5uX2NoaWxkOworICAgIGZvciAoOyAtLWkgPj0gMDsgbisrKSB7CisgICAgICAgIGlmIChuLT5uX3R5cGUgIT0gTkVXTElORSkKKyAgICAgICAgICAgIGNvbXBpbGVfcnVsZShnciwgbik7CisgICAgfQorICAgIHJldHVybiBncjsKIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVfcnVsZShuZmFncmFtbWFyICpnciwgbm9kZSAqbikKIHsKLQluZmEgKm5mOwotCQotCVJFUShuLCBSVUxFKTsKLQlSRVFOKG4tPm5fbmNoaWxkcmVuLCA0KTsKLQluID0gbi0+bl9jaGlsZDsKLQlSRVEobiwgTkFNRSk7Ci0JbmYgPSBhZGRuZmEoZ3IsIG4tPm5fc3RyKTsKLQluKys7Ci0JUkVRKG4sIENPTE9OKTsKLQluKys7Ci0JUkVRKG4sIFJIUyk7Ci0JY29tcGlsZV9yaHMoJmdyLT5ncl9sbCwgbmYsIG4sICZuZi0+bmZfc3RhcnQsICZuZi0+bmZfZmluaXNoKTsKLQluKys7Ci0JUkVRKG4sIE5FV0xJTkUpOworICAgIG5mYSAqbmY7CisKKyAgICBSRVEobiwgUlVMRSk7CisgICAgUkVRTihuLT5uX25jaGlsZHJlbiwgNCk7CisgICAgbiA9IG4tPm5fY2hpbGQ7CisgICAgUkVRKG4sIE5BTUUpOworICAgIG5mID0gYWRkbmZhKGdyLCBuLT5uX3N0cik7CisgICAgbisrOworICAgIFJFUShuLCBDT0xPTik7CisgICAgbisrOworICAgIFJFUShuLCBSSFMpOworICAgIGNvbXBpbGVfcmhzKCZnci0+Z3JfbGwsIG5mLCBuLCAmbmYtPm5mX3N0YXJ0LCAmbmYtPm5mX2ZpbmlzaCk7CisgICAgbisrOworICAgIFJFUShuLCBORVdMSU5FKTsKIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVfcmhzKGxhYmVsbGlzdCAqbGwsIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpCiB7Ci0JaW50IGk7Ci0JaW50IGEsIGI7Ci0JCi0JUkVRKG4sIFJIUyk7Ci0JaSA9IG4tPm5fbmNoaWxkcmVuOwotCVJFUU4oaSwgMSk7Ci0JbiA9IG4tPm5fY2hpbGQ7Ci0JUkVRKG4sIEFMVCk7Ci0JY29tcGlsZV9hbHQobGwsIG5mLCBuLCBwYSwgcGIpOwotCWlmICgtLWkgPD0gMCkKLQkJcmV0dXJuOwotCW4rKzsKLQlhID0gKnBhOwotCWIgPSAqcGI7Ci0JKnBhID0gYWRkbmZhc3RhdGUobmYpOwotCSpwYiA9IGFkZG5mYXN0YXRlKG5mKTsKLQlhZGRuZmFhcmMobmYsICpwYSwgYSwgRU1QVFkpOwotCWFkZG5mYWFyYyhuZiwgYiwgKnBiLCBFTVBUWSk7Ci0JZm9yICg7IC0taSA+PSAwOyBuKyspIHsKLQkJUkVRKG4sIFZCQVIpOwotCQlSRVFOKGksIDEpOwotCQktLWk7Ci0JCW4rKzsKLQkJUkVRKG4sIEFMVCk7Ci0JCWNvbXBpbGVfYWx0KGxsLCBuZiwgbiwgJmEsICZiKTsKLQkJYWRkbmZhYXJjKG5mLCAqcGEsIGEsIEVNUFRZKTsKLQkJYWRkbmZhYXJjKG5mLCBiLCAqcGIsIEVNUFRZKTsKLQl9CisgICAgaW50IGk7CisgICAgaW50IGEsIGI7CisKKyAgICBSRVEobiwgUkhTKTsKKyAgICBpID0gbi0+bl9uY2hpbGRyZW47CisgICAgUkVRTihpLCAxKTsKKyAgICBuID0gbi0+bl9jaGlsZDsKKyAgICBSRVEobiwgQUxUKTsKKyAgICBjb21waWxlX2FsdChsbCwgbmYsIG4sIHBhLCBwYik7CisgICAgaWYgKC0taSA8PSAwKQorICAgICAgICByZXR1cm47CisgICAgbisrOworICAgIGEgPSAqcGE7CisgICAgYiA9ICpwYjsKKyAgICAqcGEgPSBhZGRuZmFzdGF0ZShuZik7CisgICAgKnBiID0gYWRkbmZhc3RhdGUobmYpOworICAgIGFkZG5mYWFyYyhuZiwgKnBhLCBhLCBFTVBUWSk7CisgICAgYWRkbmZhYXJjKG5mLCBiLCAqcGIsIEVNUFRZKTsKKyAgICBmb3IgKDsgLS1pID49IDA7IG4rKykgeworICAgICAgICBSRVEobiwgVkJBUik7CisgICAgICAgIFJFUU4oaSwgMSk7CisgICAgICAgIC0taTsKKyAgICAgICAgbisrOworICAgICAgICBSRVEobiwgQUxUKTsKKyAgICAgICAgY29tcGlsZV9hbHQobGwsIG5mLCBuLCAmYSwgJmIpOworICAgICAgICBhZGRuZmFhcmMobmYsICpwYSwgYSwgRU1QVFkpOworICAgICAgICBhZGRuZmFhcmMobmYsIGIsICpwYiwgRU1QVFkpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVfYWx0KGxhYmVsbGlzdCAqbGwsIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpCiB7Ci0JaW50IGk7Ci0JaW50IGEsIGI7Ci0JCi0JUkVRKG4sIEFMVCk7Ci0JaSA9IG4tPm5fbmNoaWxkcmVuOwotCVJFUU4oaSwgMSk7Ci0JbiA9IG4tPm5fY2hpbGQ7Ci0JUkVRKG4sIElURU0pOwotCWNvbXBpbGVfaXRlbShsbCwgbmYsIG4sIHBhLCBwYik7Ci0JLS1pOwotCW4rKzsKLQlmb3IgKDsgLS1pID49IDA7IG4rKykgewotCQlSRVEobiwgSVRFTSk7Ci0JCWNvbXBpbGVfaXRlbShsbCwgbmYsIG4sICZhLCAmYik7Ci0JCWFkZG5mYWFyYyhuZiwgKnBiLCBhLCBFTVBUWSk7Ci0JCSpwYiA9IGI7Ci0JfQorICAgIGludCBpOworICAgIGludCBhLCBiOworCisgICAgUkVRKG4sIEFMVCk7CisgICAgaSA9IG4tPm5fbmNoaWxkcmVuOworICAgIFJFUU4oaSwgMSk7CisgICAgbiA9IG4tPm5fY2hpbGQ7CisgICAgUkVRKG4sIElURU0pOworICAgIGNvbXBpbGVfaXRlbShsbCwgbmYsIG4sIHBhLCBwYik7CisgICAgLS1pOworICAgIG4rKzsKKyAgICBmb3IgKDsgLS1pID49IDA7IG4rKykgeworICAgICAgICBSRVEobiwgSVRFTSk7CisgICAgICAgIGNvbXBpbGVfaXRlbShsbCwgbmYsIG4sICZhLCAmYik7CisgICAgICAgIGFkZG5mYWFyYyhuZiwgKnBiLCBhLCBFTVBUWSk7CisgICAgICAgICpwYiA9IGI7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogY29tcGlsZV9pdGVtKGxhYmVsbGlzdCAqbGwsIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpCiB7Ci0JaW50IGk7Ci0JaW50IGEsIGI7Ci0JCi0JUkVRKG4sIElURU0pOwotCWkgPSBuLT5uX25jaGlsZHJlbjsKLQlSRVFOKGksIDEpOwotCW4gPSBuLT5uX2NoaWxkOwotCWlmIChuLT5uX3R5cGUgPT0gTFNRQikgewotCQlSRVFOKGksIDMpOwotCQluKys7Ci0JCVJFUShuLCBSSFMpOwotCQkqcGEgPSBhZGRuZmFzdGF0ZShuZik7Ci0JCSpwYiA9IGFkZG5mYXN0YXRlKG5mKTsKLQkJYWRkbmZhYXJjKG5mLCAqcGEsICpwYiwgRU1QVFkpOwotCQljb21waWxlX3JocyhsbCwgbmYsIG4sICZhLCAmYik7Ci0JCWFkZG5mYWFyYyhuZiwgKnBhLCBhLCBFTVBUWSk7Ci0JCWFkZG5mYWFyYyhuZiwgYiwgKnBiLCBFTVBUWSk7Ci0JCVJFUU4oaSwgMSk7Ci0JCW4rKzsKLQkJUkVRKG4sIFJTUUIpOwotCX0KLQllbHNlIHsKLQkJY29tcGlsZV9hdG9tKGxsLCBuZiwgbiwgcGEsIHBiKTsKLQkJaWYgKC0taSA8PSAwKQotCQkJcmV0dXJuOwotCQluKys7Ci0JCWFkZG5mYWFyYyhuZiwgKnBiLCAqcGEsIEVNUFRZKTsKLQkJaWYgKG4tPm5fdHlwZSA9PSBTVEFSKQotCQkJKnBiID0gKnBhOwotCQllbHNlCi0JCQlSRVEobiwgUExVUyk7Ci0JfQorICAgIGludCBpOworICAgIGludCBhLCBiOworCisgICAgUkVRKG4sIElURU0pOworICAgIGkgPSBuLT5uX25jaGlsZHJlbjsKKyAgICBSRVFOKGksIDEpOworICAgIG4gPSBuLT5uX2NoaWxkOworICAgIGlmIChuLT5uX3R5cGUgPT0gTFNRQikgeworICAgICAgICBSRVFOKGksIDMpOworICAgICAgICBuKys7CisgICAgICAgIFJFUShuLCBSSFMpOworICAgICAgICAqcGEgPSBhZGRuZmFzdGF0ZShuZik7CisgICAgICAgICpwYiA9IGFkZG5mYXN0YXRlKG5mKTsKKyAgICAgICAgYWRkbmZhYXJjKG5mLCAqcGEsICpwYiwgRU1QVFkpOworICAgICAgICBjb21waWxlX3JocyhsbCwgbmYsIG4sICZhLCAmYik7CisgICAgICAgIGFkZG5mYWFyYyhuZiwgKnBhLCBhLCBFTVBUWSk7CisgICAgICAgIGFkZG5mYWFyYyhuZiwgYiwgKnBiLCBFTVBUWSk7CisgICAgICAgIFJFUU4oaSwgMSk7CisgICAgICAgIG4rKzsKKyAgICAgICAgUkVRKG4sIFJTUUIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY29tcGlsZV9hdG9tKGxsLCBuZiwgbiwgcGEsIHBiKTsKKyAgICAgICAgaWYgKC0taSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBuKys7CisgICAgICAgIGFkZG5mYWFyYyhuZiwgKnBiLCAqcGEsIEVNUFRZKTsKKyAgICAgICAgaWYgKG4tPm5fdHlwZSA9PSBTVEFSKQorICAgICAgICAgICAgKnBiID0gKnBhOworICAgICAgICBlbHNlCisgICAgICAgICAgICBSRVEobiwgUExVUyk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogY29tcGlsZV9hdG9tKGxhYmVsbGlzdCAqbGwsIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpCiB7Ci0JaW50IGk7Ci0JCi0JUkVRKG4sIEFUT00pOwotCWkgPSBuLT5uX25jaGlsZHJlbjsKLQlSRVFOKGksIDEpOwotCW4gPSBuLT5uX2NoaWxkOwotCWlmIChuLT5uX3R5cGUgPT0gTFBBUikgewotCQlSRVFOKGksIDMpOwotCQluKys7Ci0JCVJFUShuLCBSSFMpOwotCQljb21waWxlX3JocyhsbCwgbmYsIG4sIHBhLCBwYik7Ci0JCW4rKzsKLQkJUkVRKG4sIFJQQVIpOwotCX0KLQllbHNlIGlmIChuLT5uX3R5cGUgPT0gTkFNRSB8fCBuLT5uX3R5cGUgPT0gU1RSSU5HKSB7Ci0JCSpwYSA9IGFkZG5mYXN0YXRlKG5mKTsKLQkJKnBiID0gYWRkbmZhc3RhdGUobmYpOwotCQlhZGRuZmFhcmMobmYsICpwYSwgKnBiLCBhZGRsYWJlbChsbCwgbi0+bl90eXBlLCBuLT5uX3N0cikpOwotCX0KLQllbHNlCi0JCVJFUShuLCBOQU1FKTsKKyAgICBpbnQgaTsKKworICAgIFJFUShuLCBBVE9NKTsKKyAgICBpID0gbi0+bl9uY2hpbGRyZW47CisgICAgUkVRTihpLCAxKTsKKyAgICBuID0gbi0+bl9jaGlsZDsKKyAgICBpZiAobi0+bl90eXBlID09IExQQVIpIHsKKyAgICAgICAgUkVRTihpLCAzKTsKKyAgICAgICAgbisrOworICAgICAgICBSRVEobiwgUkhTKTsKKyAgICAgICAgY29tcGlsZV9yaHMobGwsIG5mLCBuLCBwYSwgcGIpOworICAgICAgICBuKys7CisgICAgICAgIFJFUShuLCBSUEFSKTsKKyAgICB9CisgICAgZWxzZSBpZiAobi0+bl90eXBlID09IE5BTUUgfHwgbi0+bl90eXBlID09IFNUUklORykgeworICAgICAgICAqcGEgPSBhZGRuZmFzdGF0ZShuZik7CisgICAgICAgICpwYiA9IGFkZG5mYXN0YXRlKG5mKTsKKyAgICAgICAgYWRkbmZhYXJjKG5mLCAqcGEsICpwYiwgYWRkbGFiZWwobGwsIG4tPm5fdHlwZSwgbi0+bl9zdHIpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBSRVEobiwgTkFNRSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBkdW1wc3RhdGUobGFiZWxsaXN0ICpsbCwgbmZhICpuZiwgaW50IGlzdGF0ZSkKIHsKLQluZmFzdGF0ZSAqc3Q7Ci0JaW50IGk7Ci0JbmZhYXJjICphcjsKLQkKLQlwcmludGYoIiVjJTJkJWMiLAotCQlpc3RhdGUgPT0gbmYtPm5mX3N0YXJ0ID8gJyonIDogJyAnLAotCQlpc3RhdGUsCi0JCWlzdGF0ZSA9PSBuZi0+bmZfZmluaXNoID8gJy4nIDogJyAnKTsKLQlzdCA9ICZuZi0+bmZfc3RhdGVbaXN0YXRlXTsKLQlhciA9IHN0LT5zdF9hcmM7Ci0JZm9yIChpID0gMDsgaSA8IHN0LT5zdF9uYXJjczsgaSsrKSB7Ci0JCWlmIChpID4gMCkKLQkJCXByaW50ZigiXG4gICAgIik7Ci0JCXByaW50ZigiLT4gJTJkICAlcyIsIGFyLT5hcl9hcnJvdywKLQkJCVB5R3JhbW1hcl9MYWJlbFJlcHIoJmxsLT5sbF9sYWJlbFthci0+YXJfbGFiZWxdKSk7Ci0JCWFyKys7Ci0JfQotCXByaW50ZigiXG4iKTsKKyAgICBuZmFzdGF0ZSAqc3Q7CisgICAgaW50IGk7CisgICAgbmZhYXJjICphcjsKKworICAgIHByaW50ZigiJWMlMmQlYyIsCisgICAgICAgIGlzdGF0ZSA9PSBuZi0+bmZfc3RhcnQgPyAnKicgOiAnICcsCisgICAgICAgIGlzdGF0ZSwKKyAgICAgICAgaXN0YXRlID09IG5mLT5uZl9maW5pc2ggPyAnLicgOiAnICcpOworICAgIHN0ID0gJm5mLT5uZl9zdGF0ZVtpc3RhdGVdOworICAgIGFyID0gc3QtPnN0X2FyYzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPnN0X25hcmNzOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgcHJpbnRmKCJcbiAgICAiKTsKKyAgICAgICAgcHJpbnRmKCItPiAlMmQgICVzIiwgYXItPmFyX2Fycm93LAorICAgICAgICAgICAgUHlHcmFtbWFyX0xhYmVsUmVwcigmbGwtPmxsX2xhYmVsW2FyLT5hcl9sYWJlbF0pKTsKKyAgICAgICAgYXIrKzsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOwogfQogCiBzdGF0aWMgdm9pZAogZHVtcG5mYShsYWJlbGxpc3QgKmxsLCBuZmEgKm5mKQogewotCWludCBpOwotCQotCXByaW50ZigiTkZBICclcycgaGFzICVkIHN0YXRlczsgc3RhcnQgJWQsIGZpbmlzaCAlZFxuIiwKLQkJbmYtPm5mX25hbWUsIG5mLT5uZl9uc3RhdGVzLCBuZi0+bmZfc3RhcnQsIG5mLT5uZl9maW5pc2gpOwotCWZvciAoaSA9IDA7IGkgPCBuZi0+bmZfbnN0YXRlczsgaSsrKQotCQlkdW1wc3RhdGUobGwsIG5mLCBpKTsKKyAgICBpbnQgaTsKKworICAgIHByaW50ZigiTkZBICclcycgaGFzICVkIHN0YXRlczsgc3RhcnQgJWQsIGZpbmlzaCAlZFxuIiwKKyAgICAgICAgbmYtPm5mX25hbWUsIG5mLT5uZl9uc3RhdGVzLCBuZi0+bmZfc3RhcnQsIG5mLT5uZl9maW5pc2gpOworICAgIGZvciAoaSA9IDA7IGkgPCBuZi0+bmZfbnN0YXRlczsgaSsrKQorICAgICAgICBkdW1wc3RhdGUobGwsIG5mLCBpKTsKIH0KIAogCkBAIC0zNDIsMTg0ICszNDIsMTg0IEBACiBzdGF0aWMgdm9pZAogYWRkY2xvc3VyZShiaXRzZXQgc3MsIG5mYSAqbmYsIGludCBpc3RhdGUpCiB7Ci0JaWYgKGFkZGJpdChzcywgaXN0YXRlKSkgewotCQluZmFzdGF0ZSAqc3QgPSAmbmYtPm5mX3N0YXRlW2lzdGF0ZV07Ci0JCW5mYWFyYyAqYXIgPSBzdC0+c3RfYXJjOwotCQlpbnQgaTsKLQkJCi0JCWZvciAoaSA9IHN0LT5zdF9uYXJjczsgLS1pID49IDA7ICkgewotCQkJaWYgKGFyLT5hcl9sYWJlbCA9PSBFTVBUWSkKLQkJCQlhZGRjbG9zdXJlKHNzLCBuZiwgYXItPmFyX2Fycm93KTsKLQkJCWFyKys7Ci0JCX0KLQl9CisgICAgaWYgKGFkZGJpdChzcywgaXN0YXRlKSkgeworICAgICAgICBuZmFzdGF0ZSAqc3QgPSAmbmYtPm5mX3N0YXRlW2lzdGF0ZV07CisgICAgICAgIG5mYWFyYyAqYXIgPSBzdC0+c3RfYXJjOworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSBzdC0+c3RfbmFyY3M7IC0taSA+PSAwOyApIHsKKyAgICAgICAgICAgIGlmIChhci0+YXJfbGFiZWwgPT0gRU1QVFkpCisgICAgICAgICAgICAgICAgYWRkY2xvc3VyZShzcywgbmYsIGFyLT5hcl9hcnJvdyk7CisgICAgICAgICAgICBhcisrOworICAgICAgICB9CisgICAgfQogfQogCiB0eXBlZGVmIHN0cnVjdCBfc3NfYXJjIHsKLQliaXRzZXQJc2FfYml0c2V0OwotCWludAlzYV9hcnJvdzsKLQlpbnQJc2FfbGFiZWw7CisgICAgYml0c2V0ICAgICAgc2FfYml0c2V0OworICAgIGludCAgICAgICAgIHNhX2Fycm93OworICAgIGludCAgICAgICAgIHNhX2xhYmVsOwogfSBzc19hcmM7CiAKIHR5cGVkZWYgc3RydWN0IF9zc19zdGF0ZSB7Ci0JYml0c2V0CXNzX3NzOwotCWludAlzc19uYXJjczsKLQlzdHJ1Y3QgX3NzX2FyYwkqc3NfYXJjOwotCWludAlzc19kZWxldGVkOwotCWludAlzc19maW5pc2g7Ci0JaW50CXNzX3JlbmFtZTsKKyAgICBiaXRzZXQgICAgICBzc19zczsKKyAgICBpbnQgICAgICAgICBzc19uYXJjczsKKyAgICBzdHJ1Y3QgX3NzX2FyYyAgICAgICpzc19hcmM7CisgICAgaW50ICAgICAgICAgc3NfZGVsZXRlZDsKKyAgICBpbnQgICAgICAgICBzc19maW5pc2g7CisgICAgaW50ICAgICAgICAgc3NfcmVuYW1lOwogfSBzc19zdGF0ZTsKIAogdHlwZWRlZiBzdHJ1Y3QgX3NzX2RmYSB7Ci0JaW50CXNkX25zdGF0ZXM7Ci0Jc3Nfc3RhdGUgKnNkX3N0YXRlOworICAgIGludCAgICAgICAgIHNkX25zdGF0ZXM7CisgICAgc3Nfc3RhdGUgKnNkX3N0YXRlOwogfSBzc19kZmE7CiAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyB2b2lkIHByaW50c3NkZmEoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSwgaW50IG5iaXRzLAotCQkgICAgICAgbGFiZWxsaXN0ICpsbCwgY2hhciAqbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY2hhciAqbXNnKTsKIHN0YXRpYyB2b2lkIHNpbXBsaWZ5KGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUpOwogc3RhdGljIHZvaWQgY29udmVydChkZmEgKmQsIGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUpOwogCiBzdGF0aWMgdm9pZAogbWFrZWRmYShuZmFncmFtbWFyICpnciwgbmZhICpuZiwgZGZhICpkKQogewotCWludCBuYml0cyA9IG5mLT5uZl9uc3RhdGVzOwotCWJpdHNldCBzczsKLQlpbnQgeHhfbnN0YXRlczsKLQlzc19zdGF0ZSAqeHhfc3RhdGUsICp5eTsKLQlzc19hcmMgKnp6OwotCWludCBpc3RhdGUsIGpzdGF0ZSwgaWFyYywgamFyYywgaWJpdDsKLQluZmFzdGF0ZSAqc3Q7Ci0JbmZhYXJjICphcjsKLQkKLQlzcyA9IG5ld2JpdHNldChuYml0cyk7Ci0JYWRkY2xvc3VyZShzcywgbmYsIG5mLT5uZl9zdGFydCk7Ci0JeHhfc3RhdGUgPSAoc3Nfc3RhdGUgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKHNzX3N0YXRlKSk7Ci0JaWYgKHh4X3N0YXRlID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgeHhfc3RhdGUgaW4gbWFrZWRmYSIpOwotCXh4X25zdGF0ZXMgPSAxOwotCXl5ID0gJnh4X3N0YXRlWzBdOwotCXl5LT5zc19zcyA9IHNzOwotCXl5LT5zc19uYXJjcyA9IDA7Ci0JeXktPnNzX2FyYyA9IE5VTEw7Ci0JeXktPnNzX2RlbGV0ZWQgPSAwOwotCXl5LT5zc19maW5pc2ggPSB0ZXN0Yml0KHNzLCBuZi0+bmZfZmluaXNoKTsKLQlpZiAoeXktPnNzX2ZpbmlzaCkKLQkJcHJpbnRmKCJFcnJvcjogbm9udGVybWluYWwgJyVzJyBtYXkgcHJvZHVjZSBlbXB0eS5cbiIsCi0JCQluZi0+bmZfbmFtZSk7Ci0JCi0JLyogVGhpcyBhbGdvcml0aG0gaXMgZnJvbSBhIGJvb2sgd3JpdHRlbiBiZWZvcmUKLQkgICB0aGUgaW52ZW50aW9uIG9mIHN0cnVjdHVyZWQgcHJvZ3JhbW1pbmcuLi4gKi8KKyAgICBpbnQgbmJpdHMgPSBuZi0+bmZfbnN0YXRlczsKKyAgICBiaXRzZXQgc3M7CisgICAgaW50IHh4X25zdGF0ZXM7CisgICAgc3Nfc3RhdGUgKnh4X3N0YXRlLCAqeXk7CisgICAgc3NfYXJjICp6ejsKKyAgICBpbnQgaXN0YXRlLCBqc3RhdGUsIGlhcmMsIGphcmMsIGliaXQ7CisgICAgbmZhc3RhdGUgKnN0OworICAgIG5mYWFyYyAqYXI7CiAKLQkvKiBGb3IgZWFjaCB1bm1hcmtlZCBzdGF0ZS4uLiAqLwotCWZvciAoaXN0YXRlID0gMDsgaXN0YXRlIDwgeHhfbnN0YXRlczsgKytpc3RhdGUpIHsKLQkJc2l6ZV90IHNpemU7Ci0JCXl5ID0gJnh4X3N0YXRlW2lzdGF0ZV07Ci0JCXNzID0geXktPnNzX3NzOwotCQkvKiBGb3IgYWxsIGl0cyBzdGF0ZXMuLi4gKi8KLQkJZm9yIChpYml0ID0gMDsgaWJpdCA8IG5mLT5uZl9uc3RhdGVzOyArK2liaXQpIHsKLQkJCWlmICghdGVzdGJpdChzcywgaWJpdCkpCi0JCQkJY29udGludWU7Ci0JCQlzdCA9ICZuZi0+bmZfc3RhdGVbaWJpdF07Ci0JCQkvKiBGb3IgYWxsIG5vbi1lbXB0eSBhcmNzIGZyb20gdGhpcyBzdGF0ZS4uLiAqLwotCQkJZm9yIChpYXJjID0gMDsgaWFyYyA8IHN0LT5zdF9uYXJjczsgaWFyYysrKSB7Ci0JCQkJYXIgPSAmc3QtPnN0X2FyY1tpYXJjXTsKLQkJCQlpZiAoYXItPmFyX2xhYmVsID09IEVNUFRZKQotCQkJCQljb250aW51ZTsKLQkJCQkvKiBMb29rIHVwIGluIGxpc3Qgb2YgYXJjcyBmcm9tIHRoaXMgc3RhdGUgKi8KLQkJCQlmb3IgKGphcmMgPSAwOyBqYXJjIDwgeXktPnNzX25hcmNzOyArK2phcmMpIHsKLQkJCQkJenogPSAmeXktPnNzX2FyY1tqYXJjXTsKLQkJCQkJaWYgKGFyLT5hcl9sYWJlbCA9PSB6ei0+c2FfbGFiZWwpCi0JCQkJCQlnb3RvIGZvdW5kOwotCQkJCX0KLQkJCQkvKiBBZGQgbmV3IGFyYyBmb3IgdGhpcyBzdGF0ZSAqLwotCQkJCXNpemUgPSBzaXplb2Yoc3NfYXJjKSAqICh5eS0+c3NfbmFyY3MgKyAxKTsKLQkJCQl5eS0+c3NfYXJjID0gKHNzX2FyYyAqKVB5T2JqZWN0X1JFQUxMT0MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eS0+c3NfYXJjLCBzaXplKTsKLQkJCQlpZiAoeXktPnNzX2FyYyA9PSBOVUxMKQotCQkJCQlQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7Ci0JCQkJenogPSAmeXktPnNzX2FyY1t5eS0+c3NfbmFyY3MrK107Ci0JCQkJenotPnNhX2xhYmVsID0gYXItPmFyX2xhYmVsOwotCQkJCXp6LT5zYV9iaXRzZXQgPSBuZXdiaXRzZXQobmJpdHMpOwotCQkJCXp6LT5zYV9hcnJvdyA9IC0xOwotCQkJIGZvdW5kOgk7Ci0JCQkJLyogQWRkIGRlc3RpbmF0aW9uICovCi0JCQkJYWRkY2xvc3VyZSh6ei0+c2FfYml0c2V0LCBuZiwgYXItPmFyX2Fycm93KTsKLQkJCX0KLQkJfQotCQkvKiBOb3cgbG9vayB1cCBhbGwgdGhlIGFycm93IHN0YXRlcyAqLwotCQlmb3IgKGphcmMgPSAwOyBqYXJjIDwgeHhfc3RhdGVbaXN0YXRlXS5zc19uYXJjczsgamFyYysrKSB7Ci0JCQl6eiA9ICZ4eF9zdGF0ZVtpc3RhdGVdLnNzX2FyY1tqYXJjXTsKLQkJCWZvciAoanN0YXRlID0gMDsganN0YXRlIDwgeHhfbnN0YXRlczsganN0YXRlKyspIHsKLQkJCQlpZiAoc2FtZWJpdHNldCh6ei0+c2FfYml0c2V0LAotCQkJCQl4eF9zdGF0ZVtqc3RhdGVdLnNzX3NzLCBuYml0cykpIHsKLQkJCQkJenotPnNhX2Fycm93ID0ganN0YXRlOwotCQkJCQlnb3RvIGRvbmU7Ci0JCQkJfQotCQkJfQotCQkJc2l6ZSA9IHNpemVvZihzc19zdGF0ZSkgKiAoeHhfbnN0YXRlcyArIDEpOwotCQkJeHhfc3RhdGUgPSAoc3Nfc3RhdGUgKilQeU9iamVjdF9SRUFMTE9DKHh4X3N0YXRlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0JCQlpZiAoeHhfc3RhdGUgPT0gTlVMTCkKLQkJCQlQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7Ci0JCQl6ei0+c2FfYXJyb3cgPSB4eF9uc3RhdGVzOwotCQkJeXkgPSAmeHhfc3RhdGVbeHhfbnN0YXRlcysrXTsKLQkJCXl5LT5zc19zcyA9IHp6LT5zYV9iaXRzZXQ7Ci0JCQl5eS0+c3NfbmFyY3MgPSAwOwotCQkJeXktPnNzX2FyYyA9IE5VTEw7Ci0JCQl5eS0+c3NfZGVsZXRlZCA9IDA7Ci0JCQl5eS0+c3NfZmluaXNoID0gdGVzdGJpdCh5eS0+c3Nfc3MsIG5mLT5uZl9maW5pc2gpOwotCQkgZG9uZToJOwotCQl9Ci0JfQotCQotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50c3NkZmEoeHhfbnN0YXRlcywgeHhfc3RhdGUsIG5iaXRzLCAmZ3ItPmdyX2xsLAotCQkJCQkJImJlZm9yZSBtaW5pbWl6aW5nIik7Ci0JCi0Jc2ltcGxpZnkoeHhfbnN0YXRlcywgeHhfc3RhdGUpOwotCQotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50c3NkZmEoeHhfbnN0YXRlcywgeHhfc3RhdGUsIG5iaXRzLCAmZ3ItPmdyX2xsLAotCQkJCQkJImFmdGVyIG1pbmltaXppbmciKTsKLQkKLQljb252ZXJ0KGQsIHh4X25zdGF0ZXMsIHh4X3N0YXRlKTsKLQkKLQkvKiBYWFggY2xlYW51cCAqLwotCVB5T2JqZWN0X0ZSRUUoeHhfc3RhdGUpOworICAgIHNzID0gbmV3Yml0c2V0KG5iaXRzKTsKKyAgICBhZGRjbG9zdXJlKHNzLCBuZiwgbmYtPm5mX3N0YXJ0KTsKKyAgICB4eF9zdGF0ZSA9IChzc19zdGF0ZSAqKVB5T2JqZWN0X01BTExPQyhzaXplb2Yoc3Nfc3RhdGUpKTsKKyAgICBpZiAoeHhfc3RhdGUgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciB4eF9zdGF0ZSBpbiBtYWtlZGZhIik7CisgICAgeHhfbnN0YXRlcyA9IDE7CisgICAgeXkgPSAmeHhfc3RhdGVbMF07CisgICAgeXktPnNzX3NzID0gc3M7CisgICAgeXktPnNzX25hcmNzID0gMDsKKyAgICB5eS0+c3NfYXJjID0gTlVMTDsKKyAgICB5eS0+c3NfZGVsZXRlZCA9IDA7CisgICAgeXktPnNzX2ZpbmlzaCA9IHRlc3RiaXQoc3MsIG5mLT5uZl9maW5pc2gpOworICAgIGlmICh5eS0+c3NfZmluaXNoKQorICAgICAgICBwcmludGYoIkVycm9yOiBub250ZXJtaW5hbCAnJXMnIG1heSBwcm9kdWNlIGVtcHR5LlxuIiwKKyAgICAgICAgICAgIG5mLT5uZl9uYW1lKTsKKworICAgIC8qIFRoaXMgYWxnb3JpdGhtIGlzIGZyb20gYSBib29rIHdyaXR0ZW4gYmVmb3JlCisgICAgICAgdGhlIGludmVudGlvbiBvZiBzdHJ1Y3R1cmVkIHByb2dyYW1taW5nLi4uICovCisKKyAgICAvKiBGb3IgZWFjaCB1bm1hcmtlZCBzdGF0ZS4uLiAqLworICAgIGZvciAoaXN0YXRlID0gMDsgaXN0YXRlIDwgeHhfbnN0YXRlczsgKytpc3RhdGUpIHsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIHl5ID0gJnh4X3N0YXRlW2lzdGF0ZV07CisgICAgICAgIHNzID0geXktPnNzX3NzOworICAgICAgICAvKiBGb3IgYWxsIGl0cyBzdGF0ZXMuLi4gKi8KKyAgICAgICAgZm9yIChpYml0ID0gMDsgaWJpdCA8IG5mLT5uZl9uc3RhdGVzOyArK2liaXQpIHsKKyAgICAgICAgICAgIGlmICghdGVzdGJpdChzcywgaWJpdCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzdCA9ICZuZi0+bmZfc3RhdGVbaWJpdF07CisgICAgICAgICAgICAvKiBGb3IgYWxsIG5vbi1lbXB0eSBhcmNzIGZyb20gdGhpcyBzdGF0ZS4uLiAqLworICAgICAgICAgICAgZm9yIChpYXJjID0gMDsgaWFyYyA8IHN0LT5zdF9uYXJjczsgaWFyYysrKSB7CisgICAgICAgICAgICAgICAgYXIgPSAmc3QtPnN0X2FyY1tpYXJjXTsKKyAgICAgICAgICAgICAgICBpZiAoYXItPmFyX2xhYmVsID09IEVNUFRZKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvKiBMb29rIHVwIGluIGxpc3Qgb2YgYXJjcyBmcm9tIHRoaXMgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGphcmMgPSAwOyBqYXJjIDwgeXktPnNzX25hcmNzOyArK2phcmMpIHsKKyAgICAgICAgICAgICAgICAgICAgenogPSAmeXktPnNzX2FyY1tqYXJjXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyLT5hcl9sYWJlbCA9PSB6ei0+c2FfbGFiZWwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBBZGQgbmV3IGFyYyBmb3IgdGhpcyBzdGF0ZSAqLworICAgICAgICAgICAgICAgIHNpemUgPSBzaXplb2Yoc3NfYXJjKSAqICh5eS0+c3NfbmFyY3MgKyAxKTsKKyAgICAgICAgICAgICAgICB5eS0+c3NfYXJjID0gKHNzX2FyYyAqKVB5T2JqZWN0X1JFQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5LT5zc19hcmMsIHNpemUpOworICAgICAgICAgICAgICAgIGlmICh5eS0+c3NfYXJjID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm91dCBvZiBtZW0iKTsKKyAgICAgICAgICAgICAgICB6eiA9ICZ5eS0+c3NfYXJjW3l5LT5zc19uYXJjcysrXTsKKyAgICAgICAgICAgICAgICB6ei0+c2FfbGFiZWwgPSBhci0+YXJfbGFiZWw7CisgICAgICAgICAgICAgICAgenotPnNhX2JpdHNldCA9IG5ld2JpdHNldChuYml0cyk7CisgICAgICAgICAgICAgICAgenotPnNhX2Fycm93ID0gLTE7CisgICAgICAgICAgICAgZm91bmQ6ICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAvKiBBZGQgZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICBhZGRjbG9zdXJlKHp6LT5zYV9iaXRzZXQsIG5mLCBhci0+YXJfYXJyb3cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIE5vdyBsb29rIHVwIGFsbCB0aGUgYXJyb3cgc3RhdGVzICovCisgICAgICAgIGZvciAoamFyYyA9IDA7IGphcmMgPCB4eF9zdGF0ZVtpc3RhdGVdLnNzX25hcmNzOyBqYXJjKyspIHsKKyAgICAgICAgICAgIHp6ID0gJnh4X3N0YXRlW2lzdGF0ZV0uc3NfYXJjW2phcmNdOworICAgICAgICAgICAgZm9yIChqc3RhdGUgPSAwOyBqc3RhdGUgPCB4eF9uc3RhdGVzOyBqc3RhdGUrKykgeworICAgICAgICAgICAgICAgIGlmIChzYW1lYml0c2V0KHp6LT5zYV9iaXRzZXQsCisgICAgICAgICAgICAgICAgICAgIHh4X3N0YXRlW2pzdGF0ZV0uc3Nfc3MsIG5iaXRzKSkgeworICAgICAgICAgICAgICAgICAgICB6ei0+c2FfYXJyb3cgPSBqc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKHNzX3N0YXRlKSAqICh4eF9uc3RhdGVzICsgMSk7CisgICAgICAgICAgICB4eF9zdGF0ZSA9IChzc19zdGF0ZSAqKVB5T2JqZWN0X1JFQUxMT0MoeHhfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgICAgICAgICAgaWYgKHh4X3N0YXRlID09IE5VTEwpCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOworICAgICAgICAgICAgenotPnNhX2Fycm93ID0geHhfbnN0YXRlczsKKyAgICAgICAgICAgIHl5ID0gJnh4X3N0YXRlW3h4X25zdGF0ZXMrK107CisgICAgICAgICAgICB5eS0+c3Nfc3MgPSB6ei0+c2FfYml0c2V0OworICAgICAgICAgICAgeXktPnNzX25hcmNzID0gMDsKKyAgICAgICAgICAgIHl5LT5zc19hcmMgPSBOVUxMOworICAgICAgICAgICAgeXktPnNzX2RlbGV0ZWQgPSAwOworICAgICAgICAgICAgeXktPnNzX2ZpbmlzaCA9IHRlc3RiaXQoeXktPnNzX3NzLCBuZi0+bmZfZmluaXNoKTsKKyAgICAgICAgIGRvbmU6ICAgICAgICAgIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChQeV9EZWJ1Z0ZsYWcpCisgICAgICAgIHByaW50c3NkZmEoeHhfbnN0YXRlcywgeHhfc3RhdGUsIG5iaXRzLCAmZ3ItPmdyX2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmUgbWluaW1pemluZyIpOworCisgICAgc2ltcGxpZnkoeHhfbnN0YXRlcywgeHhfc3RhdGUpOworCisgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgcHJpbnRzc2RmYSh4eF9uc3RhdGVzLCB4eF9zdGF0ZSwgbmJpdHMsICZnci0+Z3JfbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyIG1pbmltaXppbmciKTsKKworICAgIGNvbnZlcnQoZCwgeHhfbnN0YXRlcywgeHhfc3RhdGUpOworCisgICAgLyogWFhYIGNsZWFudXAgKi8KKyAgICBQeU9iamVjdF9GUkVFKHh4X3N0YXRlKTsKIH0KIAogc3RhdGljIHZvaWQKIHByaW50c3NkZmEoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSwgaW50IG5iaXRzLAotCSAgIGxhYmVsbGlzdCAqbGwsIGNoYXIgKm1zZykKKyAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY2hhciAqbXNnKQogewotCWludCBpLCBpYml0LCBpYXJjOwotCXNzX3N0YXRlICp5eTsKLQlzc19hcmMgKnp6OwotCQotCXByaW50ZigiU3Vic2V0IERGQSAlc1xuIiwgbXNnKTsKLQlmb3IgKGkgPSAwOyBpIDwgeHhfbnN0YXRlczsgaSsrKSB7Ci0JCXl5ID0gJnh4X3N0YXRlW2ldOwotCQlpZiAoeXktPnNzX2RlbGV0ZWQpCi0JCQljb250aW51ZTsKLQkJcHJpbnRmKCIgU3Vic2V0ICVkIiwgaSk7Ci0JCWlmICh5eS0+c3NfZmluaXNoKQotCQkJcHJpbnRmKCIgKGZpbmlzaCkiKTsKLQkJcHJpbnRmKCIgeyAiKTsKLQkJZm9yIChpYml0ID0gMDsgaWJpdCA8IG5iaXRzOyBpYml0KyspIHsKLQkJCWlmICh0ZXN0Yml0KHl5LT5zc19zcywgaWJpdCkpCi0JCQkJcHJpbnRmKCIlZCAiLCBpYml0KTsKLQkJfQotCQlwcmludGYoIn1cbiIpOwotCQlmb3IgKGlhcmMgPSAwOyBpYXJjIDwgeXktPnNzX25hcmNzOyBpYXJjKyspIHsKLQkJCXp6ID0gJnl5LT5zc19hcmNbaWFyY107Ci0JCQlwcmludGYoIiAgQXJjIHRvIHN0YXRlICVkLCBsYWJlbCAlc1xuIiwKLQkJCQl6ei0+c2FfYXJyb3csCi0JCQkJUHlHcmFtbWFyX0xhYmVsUmVwcigKLQkJCQkJJmxsLT5sbF9sYWJlbFt6ei0+c2FfbGFiZWxdKSk7Ci0JCX0KLQl9CisgICAgaW50IGksIGliaXQsIGlhcmM7CisgICAgc3Nfc3RhdGUgKnl5OworICAgIHNzX2FyYyAqeno7CisKKyAgICBwcmludGYoIlN1YnNldCBERkEgJXNcbiIsIG1zZyk7CisgICAgZm9yIChpID0gMDsgaSA8IHh4X25zdGF0ZXM7IGkrKykgeworICAgICAgICB5eSA9ICZ4eF9zdGF0ZVtpXTsKKyAgICAgICAgaWYgKHl5LT5zc19kZWxldGVkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHByaW50ZigiIFN1YnNldCAlZCIsIGkpOworICAgICAgICBpZiAoeXktPnNzX2ZpbmlzaCkKKyAgICAgICAgICAgIHByaW50ZigiIChmaW5pc2gpIik7CisgICAgICAgIHByaW50ZigiIHsgIik7CisgICAgICAgIGZvciAoaWJpdCA9IDA7IGliaXQgPCBuYml0czsgaWJpdCsrKSB7CisgICAgICAgICAgICBpZiAodGVzdGJpdCh5eS0+c3Nfc3MsIGliaXQpKQorICAgICAgICAgICAgICAgIHByaW50ZigiJWQgIiwgaWJpdCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJ9XG4iKTsKKyAgICAgICAgZm9yIChpYXJjID0gMDsgaWFyYyA8IHl5LT5zc19uYXJjczsgaWFyYysrKSB7CisgICAgICAgICAgICB6eiA9ICZ5eS0+c3NfYXJjW2lhcmNdOworICAgICAgICAgICAgcHJpbnRmKCIgIEFyYyB0byBzdGF0ZSAlZCwgbGFiZWwgJXNcbiIsCisgICAgICAgICAgICAgICAgenotPnNhX2Fycm93LAorICAgICAgICAgICAgICAgIFB5R3JhbW1hcl9MYWJlbFJlcHIoCisgICAgICAgICAgICAgICAgICAgICZsbC0+bGxfbGFiZWxbenotPnNhX2xhYmVsXSkpOworICAgICAgICB9CisgICAgfQogfQogCiAKQEAgLTUzNSw1OSArNTM1LDU5IEBACiBzdGF0aWMgaW50CiBzYW1lc3RhdGUoc3Nfc3RhdGUgKnMxLCBzc19zdGF0ZSAqczIpCiB7Ci0JaW50IGk7Ci0JCi0JaWYgKHMxLT5zc19uYXJjcyAhPSBzMi0+c3NfbmFyY3MgfHwgczEtPnNzX2ZpbmlzaCAhPSBzMi0+c3NfZmluaXNoKQotCQlyZXR1cm4gMDsKLQlmb3IgKGkgPSAwOyBpIDwgczEtPnNzX25hcmNzOyBpKyspIHsKLQkJaWYgKHMxLT5zc19hcmNbaV0uc2FfYXJyb3cgIT0gczItPnNzX2FyY1tpXS5zYV9hcnJvdyB8fAotCQkJczEtPnNzX2FyY1tpXS5zYV9sYWJlbCAhPSBzMi0+c3NfYXJjW2ldLnNhX2xhYmVsKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIGludCBpOworCisgICAgaWYgKHMxLT5zc19uYXJjcyAhPSBzMi0+c3NfbmFyY3MgfHwgczEtPnNzX2ZpbmlzaCAhPSBzMi0+c3NfZmluaXNoKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgczEtPnNzX25hcmNzOyBpKyspIHsKKyAgICAgICAgaWYgKHMxLT5zc19hcmNbaV0uc2FfYXJyb3cgIT0gczItPnNzX2FyY1tpXS5zYV9hcnJvdyB8fAorICAgICAgICAgICAgczEtPnNzX2FyY1tpXS5zYV9sYWJlbCAhPSBzMi0+c3NfYXJjW2ldLnNhX2xhYmVsKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogcmVuYW1lc3RhdGVzKGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUsIGludCBmcm9tLCBpbnQgdG8pCiB7Ci0JaW50IGksIGo7Ci0JCi0JaWYgKFB5X0RlYnVnRmxhZykKLQkJcHJpbnRmKCJSZW5hbWUgc3RhdGUgJWQgdG8gJWQuXG4iLCBmcm9tLCB0byk7Ci0JZm9yIChpID0gMDsgaSA8IHh4X25zdGF0ZXM7IGkrKykgewotCQlpZiAoeHhfc3RhdGVbaV0uc3NfZGVsZXRlZCkKLQkJCWNvbnRpbnVlOwotCQlmb3IgKGogPSAwOyBqIDwgeHhfc3RhdGVbaV0uc3NfbmFyY3M7IGorKykgewotCQkJaWYgKHh4X3N0YXRlW2ldLnNzX2FyY1tqXS5zYV9hcnJvdyA9PSBmcm9tKQotCQkJCXh4X3N0YXRlW2ldLnNzX2FyY1tqXS5zYV9hcnJvdyA9IHRvOwotCQl9Ci0JfQorICAgIGludCBpLCBqOworCisgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgcHJpbnRmKCJSZW5hbWUgc3RhdGUgJWQgdG8gJWQuXG4iLCBmcm9tLCB0byk7CisgICAgZm9yIChpID0gMDsgaSA8IHh4X25zdGF0ZXM7IGkrKykgeworICAgICAgICBpZiAoeHhfc3RhdGVbaV0uc3NfZGVsZXRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgeHhfc3RhdGVbaV0uc3NfbmFyY3M7IGorKykgeworICAgICAgICAgICAgaWYgKHh4X3N0YXRlW2ldLnNzX2FyY1tqXS5zYV9hcnJvdyA9PSBmcm9tKQorICAgICAgICAgICAgICAgIHh4X3N0YXRlW2ldLnNzX2FyY1tqXS5zYV9hcnJvdyA9IHRvOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogc2ltcGxpZnkoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSkKIHsKLQlpbnQgY2hhbmdlczsKLQlpbnQgaSwgajsKLQkKLQlkbyB7Ci0JCWNoYW5nZXMgPSAwOwotCQlmb3IgKGkgPSAxOyBpIDwgeHhfbnN0YXRlczsgaSsrKSB7Ci0JCQlpZiAoeHhfc3RhdGVbaV0uc3NfZGVsZXRlZCkKLQkJCQljb250aW51ZTsKLQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCQlpZiAoeHhfc3RhdGVbal0uc3NfZGVsZXRlZCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHNhbWVzdGF0ZSgmeHhfc3RhdGVbaV0sICZ4eF9zdGF0ZVtqXSkpIHsKLQkJCQkJeHhfc3RhdGVbaV0uc3NfZGVsZXRlZCsrOwotCQkJCQlyZW5hbWVzdGF0ZXMoeHhfbnN0YXRlcywgeHhfc3RhdGUsCi0JCQkJCQkgICAgIGksIGopOwotCQkJCQljaGFuZ2VzKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gd2hpbGUgKGNoYW5nZXMpOworICAgIGludCBjaGFuZ2VzOworICAgIGludCBpLCBqOworCisgICAgZG8geworICAgICAgICBjaGFuZ2VzID0gMDsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IHh4X25zdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHh4X3N0YXRlW2ldLnNzX2RlbGV0ZWQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHh4X3N0YXRlW2pdLnNzX2RlbGV0ZWQpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChzYW1lc3RhdGUoJnh4X3N0YXRlW2ldLCAmeHhfc3RhdGVbal0pKSB7CisgICAgICAgICAgICAgICAgICAgIHh4X3N0YXRlW2ldLnNzX2RlbGV0ZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVuYW1lc3RhdGVzKHh4X25zdGF0ZXMsIHh4X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaik7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoY2hhbmdlcyk7CiB9CiAKIApAQCAtNTk4LDMyICs1OTgsMzIgQEAKIHN0YXRpYyB2b2lkCiBjb252ZXJ0KGRmYSAqZCwgaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSkKIHsKLQlpbnQgaSwgajsKLQlzc19zdGF0ZSAqeXk7Ci0Jc3NfYXJjICp6ejsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgeHhfbnN0YXRlczsgaSsrKSB7Ci0JCXl5ID0gJnh4X3N0YXRlW2ldOwotCQlpZiAoeXktPnNzX2RlbGV0ZWQpCi0JCQljb250aW51ZTsKLQkJeXktPnNzX3JlbmFtZSA9IGFkZHN0YXRlKGQpOwotCX0KLQkKLQlmb3IgKGkgPSAwOyBpIDwgeHhfbnN0YXRlczsgaSsrKSB7Ci0JCXl5ID0gJnh4X3N0YXRlW2ldOwotCQlpZiAoeXktPnNzX2RlbGV0ZWQpCi0JCQljb250aW51ZTsKLQkJZm9yIChqID0gMDsgaiA8IHl5LT5zc19uYXJjczsgaisrKSB7Ci0JCQl6eiA9ICZ5eS0+c3NfYXJjW2pdOwotCQkJYWRkYXJjKGQsIHl5LT5zc19yZW5hbWUsCi0JCQkJeHhfc3RhdGVbenotPnNhX2Fycm93XS5zc19yZW5hbWUsCi0JCQkJenotPnNhX2xhYmVsKTsKLQkJfQotCQlpZiAoeXktPnNzX2ZpbmlzaCkKLQkJCWFkZGFyYyhkLCB5eS0+c3NfcmVuYW1lLCB5eS0+c3NfcmVuYW1lLCAwKTsKLQl9Ci0JCi0JZC0+ZF9pbml0aWFsID0gMDsKKyAgICBpbnQgaSwgajsKKyAgICBzc19zdGF0ZSAqeXk7CisgICAgc3NfYXJjICp6ejsKKworICAgIGZvciAoaSA9IDA7IGkgPCB4eF9uc3RhdGVzOyBpKyspIHsKKyAgICAgICAgeXkgPSAmeHhfc3RhdGVbaV07CisgICAgICAgIGlmICh5eS0+c3NfZGVsZXRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB5eS0+c3NfcmVuYW1lID0gYWRkc3RhdGUoZCk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHh4X25zdGF0ZXM7IGkrKykgeworICAgICAgICB5eSA9ICZ4eF9zdGF0ZVtpXTsKKyAgICAgICAgaWYgKHl5LT5zc19kZWxldGVkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB5eS0+c3NfbmFyY3M7IGorKykgeworICAgICAgICAgICAgenogPSAmeXktPnNzX2FyY1tqXTsKKyAgICAgICAgICAgIGFkZGFyYyhkLCB5eS0+c3NfcmVuYW1lLAorICAgICAgICAgICAgICAgIHh4X3N0YXRlW3p6LT5zYV9hcnJvd10uc3NfcmVuYW1lLAorICAgICAgICAgICAgICAgIHp6LT5zYV9sYWJlbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHl5LT5zc19maW5pc2gpCisgICAgICAgICAgICBhZGRhcmMoZCwgeXktPnNzX3JlbmFtZSwgeXktPnNzX3JlbmFtZSwgMCk7CisgICAgfQorCisgICAgZC0+ZF9pbml0aWFsID0gMDsKIH0KIAogCkBAIC02MzIsNDMgKzYzMiw0MyBAQAogc3RhdGljIGdyYW1tYXIgKgogbWFrZXRhYmxlcyhuZmFncmFtbWFyICpncikKIHsKLQlpbnQgaTsKLQluZmEgKm5mOwotCWRmYSAqZDsKLQlncmFtbWFyICpnOwotCQotCWlmIChnci0+Z3Jfbm5mYXMgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JZyA9IG5ld2dyYW1tYXIoZ3ItPmdyX25mYVswXS0+bmZfdHlwZSk7Ci0JCQkvKiBYWFggZmlyc3QgcnVsZSBtdXN0IGJlIHN0YXJ0IHJ1bGUgKi8KLQlnLT5nX2xsID0gZ3ItPmdyX2xsOwotCQotCWZvciAoaSA9IDA7IGkgPCBnci0+Z3Jfbm5mYXM7IGkrKykgewotCQluZiA9IGdyLT5ncl9uZmFbaV07Ci0JCWlmIChQeV9EZWJ1Z0ZsYWcpIHsKLQkJCXByaW50ZigiRHVtcCBvZiBORkEgZm9yICclcycgLi4uXG4iLCBuZi0+bmZfbmFtZSk7Ci0JCQlkdW1wbmZhKCZnci0+Z3JfbGwsIG5mKTsKLQkJCXByaW50ZigiTWFraW5nIERGQSBmb3IgJyVzJyAuLi5cbiIsIG5mLT5uZl9uYW1lKTsKLQkJfQotCQlkID0gYWRkZGZhKGcsIG5mLT5uZl90eXBlLCBuZi0+bmZfbmFtZSk7Ci0JCW1ha2VkZmEoZ3IsIGdyLT5ncl9uZmFbaV0sIGQpOwotCX0KLQkKLQlyZXR1cm4gZzsKKyAgICBpbnQgaTsKKyAgICBuZmEgKm5mOworICAgIGRmYSAqZDsKKyAgICBncmFtbWFyICpnOworCisgICAgaWYgKGdyLT5ncl9ubmZhcyA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBnID0gbmV3Z3JhbW1hcihnci0+Z3JfbmZhWzBdLT5uZl90eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgLyogWFhYIGZpcnN0IHJ1bGUgbXVzdCBiZSBzdGFydCBydWxlICovCisgICAgZy0+Z19sbCA9IGdyLT5ncl9sbDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnci0+Z3Jfbm5mYXM7IGkrKykgeworICAgICAgICBuZiA9IGdyLT5ncl9uZmFbaV07CisgICAgICAgIGlmIChQeV9EZWJ1Z0ZsYWcpIHsKKyAgICAgICAgICAgIHByaW50ZigiRHVtcCBvZiBORkEgZm9yICclcycgLi4uXG4iLCBuZi0+bmZfbmFtZSk7CisgICAgICAgICAgICBkdW1wbmZhKCZnci0+Z3JfbGwsIG5mKTsKKyAgICAgICAgICAgIHByaW50ZigiTWFraW5nIERGQSBmb3IgJyVzJyAuLi5cbiIsIG5mLT5uZl9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBkID0gYWRkZGZhKGcsIG5mLT5uZl90eXBlLCBuZi0+bmZfbmFtZSk7CisgICAgICAgIG1ha2VkZmEoZ3IsIGdyLT5ncl9uZmFbaV0sIGQpOworICAgIH0KKworICAgIHJldHVybiBnOwogfQogCiBncmFtbWFyICoKIHBnZW4obm9kZSAqbikKIHsKLQluZmFncmFtbWFyICpncjsKLQlncmFtbWFyICpnOwotCQotCWdyID0gbWV0YWNvbXBpbGUobik7Ci0JZyA9IG1ha2V0YWJsZXMoZ3IpOwotCXRyYW5zbGF0ZWxhYmVscyhnKTsKLQlhZGRmaXJzdHNldHMoZyk7Ci0JUHlPYmplY3RfRlJFRShncik7Ci0JcmV0dXJuIGc7CisgICAgbmZhZ3JhbW1hciAqZ3I7CisgICAgZ3JhbW1hciAqZzsKKworICAgIGdyID0gbWV0YWNvbXBpbGUobik7CisgICAgZyA9IG1ha2V0YWJsZXMoZ3IpOworICAgIHRyYW5zbGF0ZWxhYmVscyhnKTsKKyAgICBhZGRmaXJzdHNldHMoZyk7CisgICAgUHlPYmplY3RfRlJFRShncik7CisgICAgcmV0dXJuIGc7CiB9CiAKIGdyYW1tYXIgKgpAQCAtNzAyLDcgKzcwMiw3IEBACiAtLS0tLS0tLS0KIAogW0FobyZVbGxtYW4gNzddCi0JQWhvJlVsbG1hbiwgUHJpbmNpcGxlcyBvZiBDb21waWxlciBEZXNpZ24sIEFkZGlzb24tV2VzbGV5IDE5NzcKLQkoZmlyc3QgZWRpdGlvbikKKyAgICBBaG8mVWxsbWFuLCBQcmluY2lwbGVzIG9mIENvbXBpbGVyIERlc2lnbiwgQWRkaXNvbi1XZXNsZXkgMTk3NworICAgIChmaXJzdCBlZGl0aW9uKQogCiAqLwpkaWZmIC0tZ2l0IGEvUGFyc2VyL3BnZW5tYWluLmMgYi9QYXJzZXIvcGdlbm1haW4uYwppbmRleCBmYzI3YTJjLi44OGZhN2YxIDEwMDY0NAotLS0gYS9QYXJzZXIvcGdlbm1haW4uYworKysgYi9QYXJzZXIvcGdlbm1haW4uYwpAQCAtMzAsMTA0ICszMCwxMDQgQEAKIHZvaWQKIFB5X0V4aXQoaW50IHN0cykKIHsKLQlleGl0KHN0cyk7CisgICAgZXhpdChzdHMpOwogfQogCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCWdyYW1tYXIgKmc7Ci0JRklMRSAqZnA7Ci0JY2hhciAqZmlsZW5hbWUsICpncmFtaW5pdF9oLCAqZ3JhbWluaXRfYzsKLQkKLQlpZiAoYXJnYyAhPSA0KSB7Ci0JCWZwcmludGYoc3RkZXJyLAotCQkJInVzYWdlOiAlcyBncmFtbWFyIGdyYW1pbml0LmggZ3JhbWluaXQuY1xuIiwgYXJndlswXSk7Ci0JCVB5X0V4aXQoMik7Ci0JfQotCWZpbGVuYW1lID0gYXJndlsxXTsKLQlncmFtaW5pdF9oID0gYXJndlsyXTsKLQlncmFtaW5pdF9jID0gYXJndlszXTsKLQlnID0gZ2V0Z3JhbW1hcihmaWxlbmFtZSk7Ci0JZnAgPSBmb3BlbihncmFtaW5pdF9jLCAidyIpOwotCWlmIChmcCA9PSBOVUxMKSB7Ci0JCXBlcnJvcihncmFtaW5pdF9jKTsKLQkJUHlfRXhpdCgxKTsKLQl9Ci0JaWYgKFB5X0RlYnVnRmxhZykKLQkJcHJpbnRmKCJXcml0aW5nICVzIC4uLlxuIiwgZ3JhbWluaXRfYyk7Ci0JcHJpbnRncmFtbWFyKGcsIGZwKTsKLQlmY2xvc2UoZnApOwotCWZwID0gZm9wZW4oZ3JhbWluaXRfaCwgInciKTsKLQlpZiAoZnAgPT0gTlVMTCkgewotCQlwZXJyb3IoZ3JhbWluaXRfaCk7Ci0JCVB5X0V4aXQoMSk7Ci0JfQotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50ZigiV3JpdGluZyAlcyAuLi5cbiIsIGdyYW1pbml0X2gpOwotCXByaW50bm9udGVybWluYWxzKGcsIGZwKTsKLQlmY2xvc2UoZnApOwotCVB5X0V4aXQoMCk7Ci0JcmV0dXJuIDA7IC8qIE1ha2UgZ2NjIC1XYWxsIGhhcHB5ICovCisgICAgZ3JhbW1hciAqZzsKKyAgICBGSUxFICpmcDsKKyAgICBjaGFyICpmaWxlbmFtZSwgKmdyYW1pbml0X2gsICpncmFtaW5pdF9jOworCisgICAgaWYgKGFyZ2MgIT0gNCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJ1c2FnZTogJXMgZ3JhbW1hciBncmFtaW5pdC5oIGdyYW1pbml0LmNcbiIsIGFyZ3ZbMF0pOworICAgICAgICBQeV9FeGl0KDIpOworICAgIH0KKyAgICBmaWxlbmFtZSA9IGFyZ3ZbMV07CisgICAgZ3JhbWluaXRfaCA9IGFyZ3ZbMl07CisgICAgZ3JhbWluaXRfYyA9IGFyZ3ZbM107CisgICAgZyA9IGdldGdyYW1tYXIoZmlsZW5hbWUpOworICAgIGZwID0gZm9wZW4oZ3JhbWluaXRfYywgInciKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZ3JhbWluaXRfYyk7CisgICAgICAgIFB5X0V4aXQoMSk7CisgICAgfQorICAgIGlmIChQeV9EZWJ1Z0ZsYWcpCisgICAgICAgIHByaW50ZigiV3JpdGluZyAlcyAuLi5cbiIsIGdyYW1pbml0X2MpOworICAgIHByaW50Z3JhbW1hcihnLCBmcCk7CisgICAgZmNsb3NlKGZwKTsKKyAgICBmcCA9IGZvcGVuKGdyYW1pbml0X2gsICJ3Iik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGdyYW1pbml0X2gpOworICAgICAgICBQeV9FeGl0KDEpOworICAgIH0KKyAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICBwcmludGYoIldyaXRpbmcgJXMgLi4uXG4iLCBncmFtaW5pdF9oKTsKKyAgICBwcmludG5vbnRlcm1pbmFscyhnLCBmcCk7CisgICAgZmNsb3NlKGZwKTsKKyAgICBQeV9FeGl0KDApOworICAgIHJldHVybiAwOyAvKiBNYWtlIGdjYyAtV2FsbCBoYXBweSAqLwogfQogCiBncmFtbWFyICoKIGdldGdyYW1tYXIoY2hhciAqZmlsZW5hbWUpCiB7Ci0JRklMRSAqZnA7Ci0Jbm9kZSAqbjsKLQlncmFtbWFyICpnMCwgKmc7Ci0JcGVycmRldGFpbCBlcnI7Ci0JCi0JZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLQlpZiAoZnAgPT0gTlVMTCkgewotCQlwZXJyb3IoZmlsZW5hbWUpOwotCQlQeV9FeGl0KDEpOwotCX0KLQlnMCA9IG1ldGFfZ3JhbW1hcigpOwotCW4gPSBQeVBhcnNlcl9QYXJzZUZpbGUoZnAsIGZpbGVuYW1lLCBnMCwgZzAtPmdfc3RhcnQsCi0JCSAgICAgIChjaGFyICopTlVMTCwgKGNoYXIgKilOVUxMLCAmZXJyKTsKLQlmY2xvc2UoZnApOwotCWlmIChuID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJQYXJzaW5nIGVycm9yICVkLCBsaW5lICVkLlxuIiwKLQkJCWVyci5lcnJvciwgZXJyLmxpbmVubyk7Ci0JCWlmIChlcnIudGV4dCAhPSBOVUxMKSB7Ci0JCQlzaXplX3QgaTsKLQkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBlcnIudGV4dCk7Ci0JCQlpID0gc3RybGVuKGVyci50ZXh0KTsKLQkJCWlmIChpID09IDAgfHwgZXJyLnRleHRbaS0xXSAhPSAnXG4nKQotCQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBlcnIub2Zmc2V0OyBpKyspIHsKLQkJCQlpZiAoZXJyLnRleHRbaV0gPT0gJ1x0JykKLQkJCQkJcHV0YygnXHQnLCBzdGRlcnIpOwotCQkJCWVsc2UKLQkJCQkJcHV0YygnICcsIHN0ZGVycik7Ci0JCQl9Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIl5cbiIpOwotCQkJUHlPYmplY3RfRlJFRShlcnIudGV4dCk7Ci0JCX0KLQkJUHlfRXhpdCgxKTsKLQl9Ci0JZyA9IHBnZW4obik7Ci0JaWYgKGcgPT0gTlVMTCkgewotCQlwcmludGYoIkJhZCBncmFtbWFyLlxuIik7Ci0JCVB5X0V4aXQoMSk7Ci0JfQotCXJldHVybiBnOworICAgIEZJTEUgKmZwOworICAgIG5vZGUgKm47CisgICAgZ3JhbW1hciAqZzAsICpnOworICAgIHBlcnJkZXRhaWwgZXJyOworCisgICAgZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZW5hbWUpOworICAgICAgICBQeV9FeGl0KDEpOworICAgIH0KKyAgICBnMCA9IG1ldGFfZ3JhbW1hcigpOworICAgIG4gPSBQeVBhcnNlcl9QYXJzZUZpbGUoZnAsIGZpbGVuYW1lLCBnMCwgZzAtPmdfc3RhcnQsCisgICAgICAgICAgICAgICAgICAoY2hhciAqKU5VTEwsIChjaGFyICopTlVMTCwgJmVycik7CisgICAgZmNsb3NlKGZwKTsKKyAgICBpZiAobiA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUGFyc2luZyBlcnJvciAlZCwgbGluZSAlZC5cbiIsCisgICAgICAgICAgICBlcnIuZXJyb3IsIGVyci5saW5lbm8pOworICAgICAgICBpZiAoZXJyLnRleHQgIT0gTlVMTCkgeworICAgICAgICAgICAgc2l6ZV90IGk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgZXJyLnRleHQpOworICAgICAgICAgICAgaSA9IHN0cmxlbihlcnIudGV4dCk7CisgICAgICAgICAgICBpZiAoaSA9PSAwIHx8IGVyci50ZXh0W2ktMV0gIT0gJ1xuJykKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXJyLm9mZnNldDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyci50ZXh0W2ldID09ICdcdCcpCisgICAgICAgICAgICAgICAgICAgIHB1dGMoJ1x0Jywgc3RkZXJyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHB1dGMoJyAnLCBzdGRlcnIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJeXG4iKTsKKyAgICAgICAgICAgIFB5T2JqZWN0X0ZSRUUoZXJyLnRleHQpOworICAgICAgICB9CisgICAgICAgIFB5X0V4aXQoMSk7CisgICAgfQorICAgIGcgPSBwZ2VuKG4pOworICAgIGlmIChnID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRmKCJCYWQgZ3JhbW1hci5cbiIpOworICAgICAgICBQeV9FeGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gZzsKIH0KIAogLyogQ2FuJ3QgaGFwcGVuIGluIHBnZW4gKi8KIFB5T2JqZWN0KgogUHlFcnJfT2NjdXJyZWQoKQogewotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiB2b2lkCiBQeV9GYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKIHsKLQlmcHJpbnRmKHN0ZGVyciwgInBnZW46IEZBVEFMIEVSUk9SOiAlc1xuIiwgbXNnKTsKLQlQeV9FeGl0KDEpOworICAgIGZwcmludGYoc3RkZXJyLCAicGdlbjogRkFUQUwgRVJST1I6ICVzXG4iLCBtc2cpOworICAgIFB5X0V4aXQoMSk7CiB9CiAKIC8qIE5vLW5vbnNlbnNlIG15X3JlYWRsaW5lKCkgZm9yIHRva2VuaXplci5jICovCkBAIC0xMzUsMjggKzEzNSwyOCBAQAogY2hhciAqCiBQeU9TX1JlYWRsaW5lKEZJTEUgKnN5c19zdGRpbiwgRklMRSAqc3lzX3N0ZG91dCwgY2hhciAqcHJvbXB0KQogewotCXNpemVfdCBuID0gMTAwMDsKLQljaGFyICpwID0gKGNoYXIgKilQeU1lbV9NQUxMT0Mobik7Ci0JY2hhciAqcTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgcHJvbXB0KTsKLQlxID0gZmdldHMocCwgbiwgc3lzX3N0ZGluKTsKLQlpZiAocSA9PSBOVUxMKSB7Ci0JCSpwID0gJ1wwJzsKLQkJcmV0dXJuIHA7Ci0JfQotCW4gPSBzdHJsZW4ocCk7Ci0JaWYgKG4gPiAwICYmIHBbbi0xXSAhPSAnXG4nKQotCQlwW24tMV0gPSAnXG4nOwotCXJldHVybiAoY2hhciAqKVB5TWVtX1JFQUxMT0MocCwgbisxKTsKKyAgICBzaXplX3QgbiA9IDEwMDA7CisgICAgY2hhciAqcCA9IChjaGFyICopUHlNZW1fTUFMTE9DKG4pOworICAgIGNoYXIgKnE7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIHByb21wdCk7CisgICAgcSA9IGZnZXRzKHAsIG4sIHN5c19zdGRpbik7CisgICAgaWYgKHEgPT0gTlVMTCkgeworICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKyAgICBuID0gc3RybGVuKHApOworICAgIGlmIChuID4gMCAmJiBwW24tMV0gIT0gJ1xuJykKKyAgICAgICAgcFtuLTFdID0gJ1xuJzsKKyAgICByZXR1cm4gKGNoYXIgKilQeU1lbV9SRUFMTE9DKHAsIG4rMSk7CiB9CiAKIC8qIE5vLW5vbnNlbnNlIGZnZXRzICovCiBjaGFyICoKIFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhjaGFyICpidWYsIGludCBuLCBGSUxFICpzdHJlYW0sIFB5T2JqZWN0ICpmb2JqKQogewotCXJldHVybiBmZ2V0cyhidWYsIG4sIHN0cmVhbSk7CisgICAgcmV0dXJuIGZnZXRzKGJ1Ziwgbiwgc3RyZWFtKTsKIH0KIAogCkBAIC0xNjUsOSArMTY1LDkgQEAKIHZvaWQKIFB5U3lzX1dyaXRlU3RkZXJyKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7CisgICAgdmFfbGlzdCB2YTsKIAotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCXZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCB2YSk7Ci0JdmFfZW5kKHZhKTsKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvcHJpbnRncmFtbWFyLmMgYi9QYXJzZXIvcHJpbnRncmFtbWFyLmMKaW5kZXggYWUxODBlMS4uM2I1NGEwNSAxMDA2NDQKLS0tIGEvUGFyc2VyL3ByaW50Z3JhbW1hci5jCisrKyBiL1BhcnNlci9wcmludGdyYW1tYXIuYwpAQCAtMTMsMTA1ICsxMywxMDUgQEAKIHZvaWQKIHByaW50Z3JhbW1hcihncmFtbWFyICpnLCBGSUxFICpmcCkKIHsKLQlmcHJpbnRmKGZwLCAiLyogR2VuZXJhdGVkIGJ5IFBhcnNlci9wZ2VuICovXG5cbiIpOwotCWZwcmludGYoZnAsICIjaW5jbHVkZSBcInBnZW5oZWFkZXJzLmhcIlxuIik7Ci0JZnByaW50ZihmcCwgIiNpbmNsdWRlIFwiZ3JhbW1hci5oXCJcbiIpOwotCWZwcmludGYoZnAsICJQeUFQSV9EQVRBKGdyYW1tYXIpIF9QeVBhcnNlcl9HcmFtbWFyO1xuIik7Ci0JcHJpbnRkZmFzKGcsIGZwKTsKLQlwcmludGxhYmVscyhnLCBmcCk7Ci0JZnByaW50ZihmcCwgImdyYW1tYXIgX1B5UGFyc2VyX0dyYW1tYXIgPSB7XG4iKTsKLQlmcHJpbnRmKGZwLCAiXHQlZCxcbiIsIGctPmdfbmRmYXMpOwotCWZwcmludGYoZnAsICJcdGRmYXMsXG4iKTsKLQlmcHJpbnRmKGZwLCAiXHR7JWQsIGxhYmVsc30sXG4iLCBnLT5nX2xsLmxsX25sYWJlbHMpOwotCWZwcmludGYoZnAsICJcdCVkXG4iLCBnLT5nX3N0YXJ0KTsKLQlmcHJpbnRmKGZwLCAifTtcbiIpOworICAgIGZwcmludGYoZnAsICIvKiBHZW5lcmF0ZWQgYnkgUGFyc2VyL3BnZW4gKi9cblxuIik7CisgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlIFwicGdlbmhlYWRlcnMuaFwiXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgXCJncmFtbWFyLmhcIlxuIik7CisgICAgZnByaW50ZihmcCwgIlB5QVBJX0RBVEEoZ3JhbW1hcikgX1B5UGFyc2VyX0dyYW1tYXI7XG4iKTsKKyAgICBwcmludGRmYXMoZywgZnApOworICAgIHByaW50bGFiZWxzKGcsIGZwKTsKKyAgICBmcHJpbnRmKGZwLCAiZ3JhbW1hciBfUHlQYXJzZXJfR3JhbW1hciA9IHtcbiIpOworICAgIGZwcmludGYoZnAsICJcdCVkLFxuIiwgZy0+Z19uZGZhcyk7CisgICAgZnByaW50ZihmcCwgIlx0ZGZhcyxcbiIpOworICAgIGZwcmludGYoZnAsICJcdHslZCwgbGFiZWxzfSxcbiIsIGctPmdfbGwubGxfbmxhYmVscyk7CisgICAgZnByaW50ZihmcCwgIlx0JWRcbiIsIGctPmdfc3RhcnQpOworICAgIGZwcmludGYoZnAsICJ9O1xuIik7CiB9CiAKIHZvaWQKIHByaW50bm9udGVybWluYWxzKGdyYW1tYXIgKmcsIEZJTEUgKmZwKQogewotCWRmYSAqZDsKLQlpbnQgaTsKLQkKLQlmcHJpbnRmKGZwLCAiLyogR2VuZXJhdGVkIGJ5IFBhcnNlci9wZ2VuICovXG5cbiIpOwotCQotCWQgPSBnLT5nX2RmYTsKLQlmb3IgKGkgPSBnLT5nX25kZmFzOyAtLWkgPj0gMDsgZCsrKQotCQlmcHJpbnRmKGZwLCAiI2RlZmluZSAlcyAlZFxuIiwgZC0+ZF9uYW1lLCBkLT5kX3R5cGUpOworICAgIGRmYSAqZDsKKyAgICBpbnQgaTsKKworICAgIGZwcmludGYoZnAsICIvKiBHZW5lcmF0ZWQgYnkgUGFyc2VyL3BnZW4gKi9cblxuIik7CisKKyAgICBkID0gZy0+Z19kZmE7CisgICAgZm9yIChpID0gZy0+Z19uZGZhczsgLS1pID49IDA7IGQrKykKKyAgICAgICAgZnByaW50ZihmcCwgIiNkZWZpbmUgJXMgJWRcbiIsIGQtPmRfbmFtZSwgZC0+ZF90eXBlKTsKIH0KIAogc3RhdGljIHZvaWQKIHByaW50YXJjcyhpbnQgaSwgZGZhICpkLCBGSUxFICpmcCkKIHsKLQlhcmMgKmE7Ci0Jc3RhdGUgKnM7Ci0JaW50IGosIGs7Ci0JCi0JcyA9IGQtPmRfc3RhdGU7Ci0JZm9yIChqID0gMDsgaiA8IGQtPmRfbnN0YXRlczsgaisrLCBzKyspIHsKLQkJZnByaW50ZihmcCwgInN0YXRpYyBhcmMgYXJjc18lZF8lZFslZF0gPSB7XG4iLAotCQkJaSwgaiwgcy0+c19uYXJjcyk7Ci0JCWEgPSBzLT5zX2FyYzsKLQkJZm9yIChrID0gMDsgayA8IHMtPnNfbmFyY3M7IGsrKywgYSsrKQotCQkJZnByaW50ZihmcCwgIlx0eyVkLCAlZH0sXG4iLCBhLT5hX2xibCwgYS0+YV9hcnJvdyk7Ci0JCWZwcmludGYoZnAsICJ9O1xuIik7Ci0JfQorICAgIGFyYyAqYTsKKyAgICBzdGF0ZSAqczsKKyAgICBpbnQgaiwgazsKKworICAgIHMgPSBkLT5kX3N0YXRlOworICAgIGZvciAoaiA9IDA7IGogPCBkLT5kX25zdGF0ZXM7IGorKywgcysrKSB7CisgICAgICAgIGZwcmludGYoZnAsICJzdGF0aWMgYXJjIGFyY3NfJWRfJWRbJWRdID0ge1xuIiwKKyAgICAgICAgICAgIGksIGosIHMtPnNfbmFyY3MpOworICAgICAgICBhID0gcy0+c19hcmM7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5zX25hcmNzOyBrKyssIGErKykKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcdHslZCwgJWR9LFxuIiwgYS0+YV9sYmwsIGEtPmFfYXJyb3cpOworICAgICAgICBmcHJpbnRmKGZwLCAifTtcbiIpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIHByaW50c3RhdGVzKGdyYW1tYXIgKmcsIEZJTEUgKmZwKQogewotCXN0YXRlICpzOwotCWRmYSAqZDsKLQlpbnQgaSwgajsKLQkKLQlkID0gZy0+Z19kZmE7Ci0JZm9yIChpID0gMDsgaSA8IGctPmdfbmRmYXM7IGkrKywgZCsrKSB7Ci0JCXByaW50YXJjcyhpLCBkLCBmcCk7Ci0JCWZwcmludGYoZnAsICJzdGF0aWMgc3RhdGUgc3RhdGVzXyVkWyVkXSA9IHtcbiIsCi0JCQlpLCBkLT5kX25zdGF0ZXMpOwotCQlzID0gZC0+ZF9zdGF0ZTsKLQkJZm9yIChqID0gMDsgaiA8IGQtPmRfbnN0YXRlczsgaisrLCBzKyspCi0JCQlmcHJpbnRmKGZwLCAiXHR7JWQsIGFyY3NfJWRfJWR9LFxuIiwKLQkJCQlzLT5zX25hcmNzLCBpLCBqKTsKLQkJZnByaW50ZihmcCwgIn07XG4iKTsKLQl9CisgICAgc3RhdGUgKnM7CisgICAgZGZhICpkOworICAgIGludCBpLCBqOworCisgICAgZCA9IGctPmdfZGZhOworICAgIGZvciAoaSA9IDA7IGkgPCBnLT5nX25kZmFzOyBpKyssIGQrKykgeworICAgICAgICBwcmludGFyY3MoaSwgZCwgZnApOworICAgICAgICBmcHJpbnRmKGZwLCAic3RhdGljIHN0YXRlIHN0YXRlc18lZFslZF0gPSB7XG4iLAorICAgICAgICAgICAgaSwgZC0+ZF9uc3RhdGVzKTsKKyAgICAgICAgcyA9IGQtPmRfc3RhdGU7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkLT5kX25zdGF0ZXM7IGorKywgcysrKQorICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0eyVkLCBhcmNzXyVkXyVkfSxcbiIsCisgICAgICAgICAgICAgICAgcy0+c19uYXJjcywgaSwgaik7CisgICAgICAgIGZwcmludGYoZnAsICJ9O1xuIik7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogcHJpbnRkZmFzKGdyYW1tYXIgKmcsIEZJTEUgKmZwKQogewotCWRmYSAqZDsKLQlpbnQgaSwgajsKLQkKLQlwcmludHN0YXRlcyhnLCBmcCk7Ci0JZnByaW50ZihmcCwgInN0YXRpYyBkZmEgZGZhc1slZF0gPSB7XG4iLCBnLT5nX25kZmFzKTsKLQlkID0gZy0+Z19kZmE7Ci0JZm9yIChpID0gMDsgaSA8IGctPmdfbmRmYXM7IGkrKywgZCsrKSB7Ci0JCWZwcmludGYoZnAsICJcdHslZCwgXCIlc1wiLCAlZCwgJWQsIHN0YXRlc18lZCxcbiIsCi0JCQlkLT5kX3R5cGUsIGQtPmRfbmFtZSwgZC0+ZF9pbml0aWFsLCBkLT5kX25zdGF0ZXMsIGkpOwotCQlmcHJpbnRmKGZwLCAiXHQgXCIiKTsKLQkJZm9yIChqID0gMDsgaiA8IE5CWVRFUyhnLT5nX2xsLmxsX25sYWJlbHMpOyBqKyspCi0JCQlmcHJpbnRmKGZwLCAiXFwlMDNvIiwgZC0+ZF9maXJzdFtqXSAmIDB4ZmYpOwotCQlmcHJpbnRmKGZwLCAiXCJ9LFxuIik7Ci0JfQotCWZwcmludGYoZnAsICJ9O1xuIik7CisgICAgZGZhICpkOworICAgIGludCBpLCBqOworCisgICAgcHJpbnRzdGF0ZXMoZywgZnApOworICAgIGZwcmludGYoZnAsICJzdGF0aWMgZGZhIGRmYXNbJWRdID0ge1xuIiwgZy0+Z19uZGZhcyk7CisgICAgZCA9IGctPmdfZGZhOworICAgIGZvciAoaSA9IDA7IGkgPCBnLT5nX25kZmFzOyBpKyssIGQrKykgeworICAgICAgICBmcHJpbnRmKGZwLCAiXHR7JWQsIFwiJXNcIiwgJWQsICVkLCBzdGF0ZXNfJWQsXG4iLAorICAgICAgICAgICAgZC0+ZF90eXBlLCBkLT5kX25hbWUsIGQtPmRfaW5pdGlhbCwgZC0+ZF9uc3RhdGVzLCBpKTsKKyAgICAgICAgZnByaW50ZihmcCwgIlx0IFwiIik7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBOQllURVMoZy0+Z19sbC5sbF9ubGFiZWxzKTsgaisrKQorICAgICAgICAgICAgZnByaW50ZihmcCwgIlxcJTAzbyIsIGQtPmRfZmlyc3Rbal0gJiAweGZmKTsKKyAgICAgICAgZnByaW50ZihmcCwgIlwifSxcbiIpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAifTtcbiIpOwogfQogCiBzdGF0aWMgdm9pZAogcHJpbnRsYWJlbHMoZ3JhbW1hciAqZywgRklMRSAqZnApCiB7Ci0JbGFiZWwgKmw7Ci0JaW50IGk7Ci0JCi0JZnByaW50ZihmcCwgInN0YXRpYyBsYWJlbCBsYWJlbHNbJWRdID0ge1xuIiwgZy0+Z19sbC5sbF9ubGFiZWxzKTsKLQlsID0gZy0+Z19sbC5sbF9sYWJlbDsKLQlmb3IgKGkgPSBnLT5nX2xsLmxsX25sYWJlbHM7IC0taSA+PSAwOyBsKyspIHsKLQkJaWYgKGwtPmxiX3N0ciA9PSBOVUxMKQotCQkJZnByaW50ZihmcCwgIlx0eyVkLCAwfSxcbiIsIGwtPmxiX3R5cGUpOwotCQllbHNlCi0JCQlmcHJpbnRmKGZwLCAiXHR7JWQsIFwiJXNcIn0sXG4iLAotCQkJCWwtPmxiX3R5cGUsIGwtPmxiX3N0cik7Ci0JfQotCWZwcmludGYoZnAsICJ9O1xuIik7CisgICAgbGFiZWwgKmw7CisgICAgaW50IGk7CisKKyAgICBmcHJpbnRmKGZwLCAic3RhdGljIGxhYmVsIGxhYmVsc1slZF0gPSB7XG4iLCBnLT5nX2xsLmxsX25sYWJlbHMpOworICAgIGwgPSBnLT5nX2xsLmxsX2xhYmVsOworICAgIGZvciAoaSA9IGctPmdfbGwubGxfbmxhYmVsczsgLS1pID49IDA7IGwrKykgeworICAgICAgICBpZiAobC0+bGJfc3RyID09IE5VTEwpCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHR7JWQsIDB9LFxuIiwgbC0+bGJfdHlwZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcdHslZCwgXCIlc1wifSxcbiIsCisgICAgICAgICAgICAgICAgbC0+bGJfdHlwZSwgbC0+bGJfc3RyKTsKKyAgICB9CisgICAgZnByaW50ZihmcCwgIn07XG4iKTsKIH0KZGlmZiAtLWdpdCBhL1BhcnNlci90b2tlbml6ZXIuYyBiL1BhcnNlci90b2tlbml6ZXIuYwppbmRleCA0OTUxODJmLi5hNjQ3ZDljIDEwMDY0NAotLS0gYS9QYXJzZXIvdG9rZW5pemVyLmMKKysrIGIvUGFyc2VyL3Rva2VuaXplci5jCkBAIC0zNSw2MSArMzUsNjEgQEAKIC8qIFRva2VuIG5hbWVzICovCiAKIGNoYXIgKl9QeVBhcnNlcl9Ub2tlbk5hbWVzW10gPSB7Ci0JIkVORE1BUktFUiIsCi0JIk5BTUUiLAotCSJOVU1CRVIiLAotCSJTVFJJTkciLAotCSJORVdMSU5FIiwKLQkiSU5ERU5UIiwKLQkiREVERU5UIiwKLQkiTFBBUiIsCi0JIlJQQVIiLAotCSJMU1FCIiwKLQkiUlNRQiIsCi0JIkNPTE9OIiwKLQkiQ09NTUEiLAotCSJTRU1JIiwKLQkiUExVUyIsCi0JIk1JTlVTIiwKLQkiU1RBUiIsCi0JIlNMQVNIIiwKLQkiVkJBUiIsCi0JIkFNUEVSIiwKLQkiTEVTUyIsCi0JIkdSRUFURVIiLAotCSJFUVVBTCIsCi0JIkRPVCIsCi0JIlBFUkNFTlQiLAotCSJCQUNLUVVPVEUiLAotCSJMQlJBQ0UiLAotCSJSQlJBQ0UiLAotCSJFUUVRVUFMIiwKLQkiTk9URVFVQUwiLAotCSJMRVNTRVFVQUwiLAotCSJHUkVBVEVSRVFVQUwiLAotCSJUSUxERSIsCi0JIkNJUkNVTUZMRVgiLAotCSJMRUZUU0hJRlQiLAotCSJSSUdIVFNISUZUIiwKLQkiRE9VQkxFU1RBUiIsCi0JIlBMVVNFUVVBTCIsCi0JIk1JTkVRVUFMIiwKLQkiU1RBUkVRVUFMIiwKLQkiU0xBU0hFUVVBTCIsCi0JIlBFUkNFTlRFUVVBTCIsCi0JIkFNUEVSRVFVQUwiLAotCSJWQkFSRVFVQUwiLAotCSJDSVJDVU1GTEVYRVFVQUwiLAotCSJMRUZUU0hJRlRFUVVBTCIsCi0JIlJJR0hUU0hJRlRFUVVBTCIsCi0JIkRPVUJMRVNUQVJFUVVBTCIsCi0JIkRPVUJMRVNMQVNIIiwKLQkiRE9VQkxFU0xBU0hFUVVBTCIsCi0JIkFUIiwKLQkvKiBUaGlzIHRhYmxlIG11c3QgbWF0Y2ggdGhlICNkZWZpbmVzIGluIHRva2VuLmghICovCi0JIk9QIiwKLQkiPEVSUk9SVE9LRU4+IiwKLQkiPE5fVE9LRU5TPiIKKyAgICAiRU5ETUFSS0VSIiwKKyAgICAiTkFNRSIsCisgICAgIk5VTUJFUiIsCisgICAgIlNUUklORyIsCisgICAgIk5FV0xJTkUiLAorICAgICJJTkRFTlQiLAorICAgICJERURFTlQiLAorICAgICJMUEFSIiwKKyAgICAiUlBBUiIsCisgICAgIkxTUUIiLAorICAgICJSU1FCIiwKKyAgICAiQ09MT04iLAorICAgICJDT01NQSIsCisgICAgIlNFTUkiLAorICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJTVEFSIiwKKyAgICAiU0xBU0giLAorICAgICJWQkFSIiwKKyAgICAiQU1QRVIiLAorICAgICJMRVNTIiwKKyAgICAiR1JFQVRFUiIsCisgICAgIkVRVUFMIiwKKyAgICAiRE9UIiwKKyAgICAiUEVSQ0VOVCIsCisgICAgIkJBQ0tRVU9URSIsCisgICAgIkxCUkFDRSIsCisgICAgIlJCUkFDRSIsCisgICAgIkVRRVFVQUwiLAorICAgICJOT1RFUVVBTCIsCisgICAgIkxFU1NFUVVBTCIsCisgICAgIkdSRUFURVJFUVVBTCIsCisgICAgIlRJTERFIiwKKyAgICAiQ0lSQ1VNRkxFWCIsCisgICAgIkxFRlRTSElGVCIsCisgICAgIlJJR0hUU0hJRlQiLAorICAgICJET1VCTEVTVEFSIiwKKyAgICAiUExVU0VRVUFMIiwKKyAgICAiTUlORVFVQUwiLAorICAgICJTVEFSRVFVQUwiLAorICAgICJTTEFTSEVRVUFMIiwKKyAgICAiUEVSQ0VOVEVRVUFMIiwKKyAgICAiQU1QRVJFUVVBTCIsCisgICAgIlZCQVJFUVVBTCIsCisgICAgIkNJUkNVTUZMRVhFUVVBTCIsCisgICAgIkxFRlRTSElGVEVRVUFMIiwKKyAgICAiUklHSFRTSElGVEVRVUFMIiwKKyAgICAiRE9VQkxFU1RBUkVRVUFMIiwKKyAgICAiRE9VQkxFU0xBU0giLAorICAgICJET1VCTEVTTEFTSEVRVUFMIiwKKyAgICAiQVQiLAorICAgIC8qIFRoaXMgdGFibGUgbXVzdCBtYXRjaCB0aGUgI2RlZmluZXMgaW4gdG9rZW4uaCEgKi8KKyAgICAiT1AiLAorICAgICI8RVJST1JUT0tFTj4iLAorICAgICI8Tl9UT0tFTlM+IgogfTsKIAogLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHRva19zdGF0ZSBzdHJ1Y3R1cmUgKi8KQEAgLTk3LDQ4ICs5Nyw0OCBAQAogc3RhdGljIHN0cnVjdCB0b2tfc3RhdGUgKgogdG9rX25ldyh2b2lkKQogewotCXN0cnVjdCB0b2tfc3RhdGUgKnRvayA9IChzdHJ1Y3QgdG9rX3N0YXRlICopUHlNZW1fTUFMTE9DKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB0b2tfc3RhdGUpKTsKLQlpZiAodG9rID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXRvay0+YnVmID0gdG9rLT5jdXIgPSB0b2stPmVuZCA9IHRvay0+aW5wID0gdG9rLT5zdGFydCA9IE5VTEw7Ci0JdG9rLT5kb25lID0gRV9PSzsKLQl0b2stPmZwID0gTlVMTDsKLQl0b2stPmlucHV0ID0gTlVMTDsKLQl0b2stPnRhYnNpemUgPSBUQUJTSVpFOwotCXRvay0+aW5kZW50ID0gMDsKLQl0b2stPmluZHN0YWNrWzBdID0gMDsKLQl0b2stPmF0Ym9sID0gMTsKLQl0b2stPnBlbmRpbiA9IDA7Ci0JdG9rLT5wcm9tcHQgPSB0b2stPm5leHRwcm9tcHQgPSBOVUxMOwotCXRvay0+bGluZW5vID0gMDsKLQl0b2stPmxldmVsID0gMDsKLQl0b2stPmZpbGVuYW1lID0gTlVMTDsKLQl0b2stPmFsdHdhcm5pbmcgPSAwOwotCXRvay0+YWx0ZXJyb3IgPSAwOwotCXRvay0+YWx0dGFic2l6ZSA9IDE7Ci0JdG9rLT5hbHRpbmRzdGFja1swXSA9IDA7Ci0JdG9rLT5kZWNvZGluZ19zdGF0ZSA9IDA7Ci0JdG9rLT5kZWNvZGluZ19lcnJlZCA9IDA7Ci0JdG9rLT5yZWFkX2NvZGluZ19zcGVjID0gMDsKLQl0b2stPmVuY29kaW5nID0gTlVMTDsKLSAgICAgICAgdG9rLT5jb250X2xpbmUgPSAwOworICAgIHN0cnVjdCB0b2tfc3RhdGUgKnRvayA9IChzdHJ1Y3QgdG9rX3N0YXRlICopUHlNZW1fTUFMTE9DKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHRva19zdGF0ZSkpOworICAgIGlmICh0b2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdG9rLT5idWYgPSB0b2stPmN1ciA9IHRvay0+ZW5kID0gdG9rLT5pbnAgPSB0b2stPnN0YXJ0ID0gTlVMTDsKKyAgICB0b2stPmRvbmUgPSBFX09LOworICAgIHRvay0+ZnAgPSBOVUxMOworICAgIHRvay0+aW5wdXQgPSBOVUxMOworICAgIHRvay0+dGFic2l6ZSA9IFRBQlNJWkU7CisgICAgdG9rLT5pbmRlbnQgPSAwOworICAgIHRvay0+aW5kc3RhY2tbMF0gPSAwOworICAgIHRvay0+YXRib2wgPSAxOworICAgIHRvay0+cGVuZGluID0gMDsKKyAgICB0b2stPnByb21wdCA9IHRvay0+bmV4dHByb21wdCA9IE5VTEw7CisgICAgdG9rLT5saW5lbm8gPSAwOworICAgIHRvay0+bGV2ZWwgPSAwOworICAgIHRvay0+ZmlsZW5hbWUgPSBOVUxMOworICAgIHRvay0+YWx0d2FybmluZyA9IDA7CisgICAgdG9rLT5hbHRlcnJvciA9IDA7CisgICAgdG9rLT5hbHR0YWJzaXplID0gMTsKKyAgICB0b2stPmFsdGluZHN0YWNrWzBdID0gMDsKKyAgICB0b2stPmRlY29kaW5nX3N0YXRlID0gMDsKKyAgICB0b2stPmRlY29kaW5nX2VycmVkID0gMDsKKyAgICB0b2stPnJlYWRfY29kaW5nX3NwZWMgPSAwOworICAgIHRvay0+ZW5jb2RpbmcgPSBOVUxMOworICAgIHRvay0+Y29udF9saW5lID0gMDsKICNpZm5kZWYgUEdFTgotCXRvay0+ZGVjb2RpbmdfcmVhZGxpbmUgPSBOVUxMOwotCXRvay0+ZGVjb2RpbmdfYnVmZmVyID0gTlVMTDsKKyAgICB0b2stPmRlY29kaW5nX3JlYWRsaW5lID0gTlVMTDsKKyAgICB0b2stPmRlY29kaW5nX2J1ZmZlciA9IE5VTEw7CiAjZW5kaWYKLQlyZXR1cm4gdG9rOworICAgIHJldHVybiB0b2s7CiB9CiAKIHN0YXRpYyBjaGFyICoKIG5ld19zdHJpbmcoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCiB7Ci0JY2hhciogcmVzdWx0ID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobGVuICsgMSk7Ci0JaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JCW1lbWNweShyZXN1bHQsIHMsIGxlbik7Ci0JCXJlc3VsdFtsZW5dID0gJ1wwJzsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBjaGFyKiByZXN1bHQgPSAoY2hhciAqKVB5TWVtX01BTExPQyhsZW4gKyAxKTsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgbWVtY3B5KHJlc3VsdCwgcywgbGVuKTsKKyAgICAgICAgcmVzdWx0W2xlbl0gPSAnXDAnOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAjaWZkZWYgUEdFTgpAQCAtMTQ2LDE5ICsxNDYsMTkgQEAKIHN0YXRpYyBjaGFyICoKIGRlY29kaW5nX2ZnZXRzKGNoYXIgKnMsIGludCBzaXplLCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7Ci0JcmV0dXJuIGZnZXRzKHMsIHNpemUsIHRvay0+ZnApOworICAgIHJldHVybiBmZ2V0cyhzLCBzaXplLCB0b2stPmZwKTsKIH0KIAogc3RhdGljIGludAogZGVjb2RpbmdfZmVvZihzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7Ci0JcmV0dXJuIGZlb2YodG9rLT5mcCk7CisgICAgcmV0dXJuIGZlb2YodG9rLT5mcCk7CiB9CiAKIHN0YXRpYyBjaGFyICoKIGRlY29kZV9zdHIoY29uc3QgY2hhciAqc3RyLCBpbnQgZXhlY19pbnB1dCwgc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewotCXJldHVybiBuZXdfc3RyaW5nKHN0ciwgc3RybGVuKHN0cikpOworICAgIHJldHVybiBuZXdfc3RyaW5nKHN0ciwgc3RybGVuKHN0cikpOwogfQogCiAjZWxzZSAvKiBQR0VOICovCkBAIC0xNjYsNDEgKzE2Niw0MSBAQAogc3RhdGljIGNoYXIgKgogZXJyb3JfcmV0KHN0cnVjdCB0b2tfc3RhdGUgKnRvaykgLyogWFhYICovCiB7Ci0JdG9rLT5kZWNvZGluZ19lcnJlZCA9IDE7Ci0JaWYgKHRvay0+ZnAgIT0gTlVMTCAmJiB0b2stPmJ1ZiAhPSBOVUxMKSAvKiBzZWUgUHlUb2tlbml6ZXJfRnJlZSAqLwotCQlQeU1lbV9GUkVFKHRvay0+YnVmKTsKLQl0b2stPmJ1ZiA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7CQkvKiBhcyBpZiBpdCB3ZXJlIEVPRiAqLworICAgIHRvay0+ZGVjb2RpbmdfZXJyZWQgPSAxOworICAgIGlmICh0b2stPmZwICE9IE5VTEwgJiYgdG9rLT5idWYgIT0gTlVMTCkgLyogc2VlIFB5VG9rZW5pemVyX0ZyZWUgKi8KKyAgICAgICAgUHlNZW1fRlJFRSh0b2stPmJ1Zik7CisgICAgdG9rLT5idWYgPSBOVUxMOworICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBhcyBpZiBpdCB3ZXJlIEVPRiAqLwogfQogCiAKIHN0YXRpYyBjaGFyICoKLWdldF9ub3JtYWxfbmFtZShjaGFyICpzKQkvKiBmb3IgdXRmLTggYW5kIGxhdGluLTEgKi8KK2dldF9ub3JtYWxfbmFtZShjaGFyICpzKSAgICAgICAgLyogZm9yIHV0Zi04IGFuZCBsYXRpbi0xICovCiB7Ci0JY2hhciBidWZbMTNdOwotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7Ci0JCWludCBjID0gc1tpXTsKLQkJaWYgKGMgPT0gJ1wwJykKLQkJCWJyZWFrOwotCQllbHNlIGlmIChjID09ICdfJykKLQkJCWJ1ZltpXSA9ICctJzsKLQkJZWxzZQotCQkJYnVmW2ldID0gdG9sb3dlcihjKTsKLQl9Ci0JYnVmW2ldID0gJ1wwJzsKLQlpZiAoc3RyY21wKGJ1ZiwgInV0Zi04IikgPT0gMCB8fAotCSAgICBzdHJuY21wKGJ1ZiwgInV0Zi04LSIsIDYpID09IDApCi0JCXJldHVybiAidXRmLTgiOwotCWVsc2UgaWYgKHN0cmNtcChidWYsICJsYXRpbi0xIikgPT0gMCB8fAotCQkgc3RyY21wKGJ1ZiwgImlzby04ODU5LTEiKSA9PSAwIHx8Ci0JCSBzdHJjbXAoYnVmLCAiaXNvLWxhdGluLTEiKSA9PSAwIHx8Ci0JCSBzdHJuY21wKGJ1ZiwgImxhdGluLTEtIiwgOCkgPT0gMCB8fAotCQkgc3RybmNtcChidWYsICJpc28tODg1OS0xLSIsIDExKSA9PSAwIHx8Ci0JCSBzdHJuY21wKGJ1ZiwgImlzby1sYXRpbi0xLSIsIDEyKSA9PSAwKQotCQlyZXR1cm4gImlzby04ODU5LTEiOwotCWVsc2UKLQkJcmV0dXJuIHM7CisgICAgY2hhciBidWZbMTNdOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisgICAgICAgIGludCBjID0gc1tpXTsKKyAgICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlIGlmIChjID09ICdfJykKKyAgICAgICAgICAgIGJ1ZltpXSA9ICctJzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmW2ldID0gdG9sb3dlcihjKTsKKyAgICB9CisgICAgYnVmW2ldID0gJ1wwJzsKKyAgICBpZiAoc3RyY21wKGJ1ZiwgInV0Zi04IikgPT0gMCB8fAorICAgICAgICBzdHJuY21wKGJ1ZiwgInV0Zi04LSIsIDYpID09IDApCisgICAgICAgIHJldHVybiAidXRmLTgiOworICAgIGVsc2UgaWYgKHN0cmNtcChidWYsICJsYXRpbi0xIikgPT0gMCB8fAorICAgICAgICAgICAgIHN0cmNtcChidWYsICJpc28tODg1OS0xIikgPT0gMCB8fAorICAgICAgICAgICAgIHN0cmNtcChidWYsICJpc28tbGF0aW4tMSIpID09IDAgfHwKKyAgICAgICAgICAgICBzdHJuY21wKGJ1ZiwgImxhdGluLTEtIiwgOCkgPT0gMCB8fAorICAgICAgICAgICAgIHN0cm5jbXAoYnVmLCAiaXNvLTg4NTktMS0iLCAxMSkgPT0gMCB8fAorICAgICAgICAgICAgIHN0cm5jbXAoYnVmLCAiaXNvLWxhdGluLTEtIiwgMTIpID09IDApCisgICAgICAgIHJldHVybiAiaXNvLTg4NTktMSI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gczsKIH0KIAogLyogUmV0dXJuIHRoZSBjb2Rpbmcgc3BlYyBpbiBTLCBvciBOVUxMIGlmIG5vbmUgaXMgZm91bmQuICAqLwpAQCAtMjA4LDQzICsyMDgsNDMgQEAKIHN0YXRpYyBjaGFyICoKIGdldF9jb2Rpbmdfc3BlYyhjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUHlfc3NpemVfdCBpOwotCS8qIENvZGluZyBzcGVjIG11c3QgYmUgaW4gYSBjb21tZW50LCBhbmQgdGhhdCBjb21tZW50IG11c3QgYmUKLSAgICAgICAgICogdGhlIG9ubHkgc3RhdGVtZW50IG9uIHRoZSBzb3VyY2UgY29kZSBsaW5lLiAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDY7IGkrKykgewotCQlpZiAoc1tpXSA9PSAnIycpCi0JCQlicmVhazsKLQkJaWYgKHNbaV0gIT0gJyAnICYmIHNbaV0gIT0gJ1x0JyAmJiBzW2ldICE9ICdcMDE0JykKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmb3IgKDsgaSA8IHNpemUgLSA2OyBpKyspIHsgLyogWFhYIGluZWZmaWNpZW50IHNlYXJjaCAqLwotCQljb25zdCBjaGFyKiB0ID0gcyArIGk7Ci0JCWlmIChzdHJuY21wKHQsICJjb2RpbmciLCA2KSA9PSAwKSB7Ci0JCQljb25zdCBjaGFyKiBiZWdpbiA9IE5VTEw7Ci0JCQl0ICs9IDY7Ci0JCQlpZiAodFswXSAhPSAnOicgJiYgdFswXSAhPSAnPScpCi0JCQkJY29udGludWU7Ci0JCQlkbyB7Ci0JCQkJdCsrOwotCQkJfSB3aGlsZSAodFswXSA9PSAnXHgyMCcgfHwgdFswXSA9PSAnXHQnKTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgLyogQ29kaW5nIHNwZWMgbXVzdCBiZSBpbiBhIGNvbW1lbnQsIGFuZCB0aGF0IGNvbW1lbnQgbXVzdCBiZQorICAgICAqIHRoZSBvbmx5IHN0YXRlbWVudCBvbiB0aGUgc291cmNlIGNvZGUgbGluZS4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDY7IGkrKykgeworICAgICAgICBpZiAoc1tpXSA9PSAnIycpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHNbaV0gIT0gJyAnICYmIHNbaV0gIT0gJ1x0JyAmJiBzW2ldICE9ICdcMDE0JykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHNpemUgLSA2OyBpKyspIHsgLyogWFhYIGluZWZmaWNpZW50IHNlYXJjaCAqLworICAgICAgICBjb25zdCBjaGFyKiB0ID0gcyArIGk7CisgICAgICAgIGlmIChzdHJuY21wKHQsICJjb2RpbmciLCA2KSA9PSAwKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBiZWdpbiA9IE5VTEw7CisgICAgICAgICAgICB0ICs9IDY7CisgICAgICAgICAgICBpZiAodFswXSAhPSAnOicgJiYgdFswXSAhPSAnPScpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdCsrOworICAgICAgICAgICAgfSB3aGlsZSAodFswXSA9PSAnXHgyMCcgfHwgdFswXSA9PSAnXHQnKTsKIAotCQkJYmVnaW4gPSB0OwotCQkJd2hpbGUgKFB5X0lTQUxOVU0odFswXSkgfHwKLQkJCSAgICAgICB0WzBdID09ICctJyB8fCB0WzBdID09ICdfJyB8fCB0WzBdID09ICcuJykKLQkJCQl0Kys7CisgICAgICAgICAgICBiZWdpbiA9IHQ7CisgICAgICAgICAgICB3aGlsZSAoUHlfSVNBTE5VTSh0WzBdKSB8fAorICAgICAgICAgICAgICAgICAgIHRbMF0gPT0gJy0nIHx8IHRbMF0gPT0gJ18nIHx8IHRbMF0gPT0gJy4nKQorICAgICAgICAgICAgICAgIHQrKzsKIAotCQkJaWYgKGJlZ2luIDwgdCkgewotCQkJCWNoYXIqIHIgPSBuZXdfc3RyaW5nKGJlZ2luLCB0IC0gYmVnaW4pOwotCQkJCWNoYXIqIHEgPSBnZXRfbm9ybWFsX25hbWUocik7Ci0JCQkJaWYgKHIgIT0gcSkgewotCQkJCQlQeU1lbV9GUkVFKHIpOwotCQkJCQlyID0gbmV3X3N0cmluZyhxLCBzdHJsZW4ocSkpOwotCQkJCX0KLQkJCQlyZXR1cm4gcjsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmIChiZWdpbiA8IHQpIHsKKyAgICAgICAgICAgICAgICBjaGFyKiByID0gbmV3X3N0cmluZyhiZWdpbiwgdCAtIGJlZ2luKTsKKyAgICAgICAgICAgICAgICBjaGFyKiBxID0gZ2V0X25vcm1hbF9uYW1lKHIpOworICAgICAgICAgICAgICAgIGlmIChyICE9IHEpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlNZW1fRlJFRShyKTsKKyAgICAgICAgICAgICAgICAgICAgciA9IG5ld19zdHJpbmcocSwgc3RybGVuKHEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIENoZWNrIHdoZXRoZXIgdGhlIGxpbmUgY29udGFpbnMgYSBjb2Rpbmcgc3BlYy4gSWYgaXQgZG9lcywKQEAgLTI1NCw1MSArMjU0LDUxIEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrX2NvZGluZ19zcGVjKGNvbnN0IGNoYXIqIGxpbmUsIFB5X3NzaXplX3Qgc2l6ZSwgc3RydWN0IHRva19zdGF0ZSAqdG9rLAotCQkgIGludCBzZXRfcmVhZGxpbmUoc3RydWN0IHRva19zdGF0ZSAqLCBjb25zdCBjaGFyICopKQorICAgICAgICAgICAgICAgICAgaW50IHNldF9yZWFkbGluZShzdHJ1Y3QgdG9rX3N0YXRlICosIGNvbnN0IGNoYXIgKikpCiB7Ci0JY2hhciAqIGNzOwotCWludCByID0gMTsKKyAgICBjaGFyICogY3M7CisgICAgaW50IHIgPSAxOwogCi0gICAgICAgIGlmICh0b2stPmNvbnRfbGluZSkKLQkJLyogSXQncyBhIGNvbnRpbnVhdGlvbiBsaW5lLCBzbyBpdCBjYW4ndCBiZSBhIGNvZGluZyBzcGVjLiAqLwotCQlyZXR1cm4gMTsKLQljcyA9IGdldF9jb2Rpbmdfc3BlYyhsaW5lLCBzaXplKTsKLQlpZiAoY3MgIT0gTlVMTCkgewotCQl0b2stPnJlYWRfY29kaW5nX3NwZWMgPSAxOwotCQlpZiAodG9rLT5lbmNvZGluZyA9PSBOVUxMKSB7Ci0JCQlhc3NlcnQodG9rLT5kZWNvZGluZ19zdGF0ZSA9PSAxKTsgLyogcmF3ICovCi0JCQlpZiAoc3RyY21wKGNzLCAidXRmLTgiKSA9PSAwIHx8Ci0JCQkgICAgc3RyY21wKGNzLCAiaXNvLTg4NTktMSIpID09IDApIHsKLQkJCQl0b2stPmVuY29kaW5nID0gY3M7Ci0JCQl9IGVsc2UgeworICAgIGlmICh0b2stPmNvbnRfbGluZSkKKyAgICAgICAgLyogSXQncyBhIGNvbnRpbnVhdGlvbiBsaW5lLCBzbyBpdCBjYW4ndCBiZSBhIGNvZGluZyBzcGVjLiAqLworICAgICAgICByZXR1cm4gMTsKKyAgICBjcyA9IGdldF9jb2Rpbmdfc3BlYyhsaW5lLCBzaXplKTsKKyAgICBpZiAoY3MgIT0gTlVMTCkgeworICAgICAgICB0b2stPnJlYWRfY29kaW5nX3NwZWMgPSAxOworICAgICAgICBpZiAodG9rLT5lbmNvZGluZyA9PSBOVUxMKSB7CisgICAgICAgICAgICBhc3NlcnQodG9rLT5kZWNvZGluZ19zdGF0ZSA9PSAxKTsgLyogcmF3ICovCisgICAgICAgICAgICBpZiAoc3RyY21wKGNzLCAidXRmLTgiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgc3RyY21wKGNzLCAiaXNvLTg4NTktMSIpID09IDApIHsKKyAgICAgICAgICAgICAgICB0b2stPmVuY29kaW5nID0gY3M7CisgICAgICAgICAgICB9IGVsc2UgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCQlyID0gc2V0X3JlYWRsaW5lKHRvaywgY3MpOwotCQkJCWlmIChyKSB7Ci0JCQkJCXRvay0+ZW5jb2RpbmcgPSBjczsKLQkJCQkJdG9rLT5kZWNvZGluZ19zdGF0ZSA9IC0xOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCVB5TWVtX0ZSRUUoY3MpOworICAgICAgICAgICAgICAgIHIgPSBzZXRfcmVhZGxpbmUodG9rLCBjcyk7CisgICAgICAgICAgICAgICAgaWYgKHIpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5lbmNvZGluZyA9IGNzOworICAgICAgICAgICAgICAgICAgICB0b2stPmRlY29kaW5nX3N0YXRlID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgUHlNZW1fRlJFRShjcyk7CiAjZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaXRob3V0IFVuaWNvZGUgc3VwcG9ydCwgd2UgY2Fubm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgdGhlIGNvZGluZyBzcGVjLiBTaW5jZSB0aGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b24ndCBiZSBhbnkgVW5pY29kZSBsaXRlcmFscywgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b24ndCBtYXR0ZXIuICovCi0JCQkJUHlNZW1fRlJFRShjcyk7CisgICAgICAgICAgICAgICAgLyogV2l0aG91dCBVbmljb2RlIHN1cHBvcnQsIHdlIGNhbm5vdAorICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgdGhlIGNvZGluZyBzcGVjLiBTaW5jZSB0aGVyZQorICAgICAgICAgICAgICAgICAgIHdvbid0IGJlIGFueSBVbmljb2RlIGxpdGVyYWxzLCB0aGF0CisgICAgICAgICAgICAgICAgICAgd29uJ3QgbWF0dGVyLiAqLworICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUoY3MpOwogI2VuZGlmCi0JCQl9Ci0JCX0gZWxzZSB7CS8qIHRoZW4sIGNvbXBhcmUgY3Mgd2l0aCBCT00gKi8KLQkJCXIgPSAoc3RyY21wKHRvay0+ZW5jb2RpbmcsIGNzKSA9PSAwKTsKLQkJCVB5TWVtX0ZSRUUoY3MpOwotCQl9Ci0JfQotCWlmICghcikgewotCQljcyA9IHRvay0+ZW5jb2Rpbmc7Ci0JCWlmICghY3MpCi0JCQljcyA9ICJ3aXRoIEJPTSI7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19TeW50YXhFcnJvciwgImVuY29kaW5nIHByb2JsZW06ICVzIiwgY3MpOwotCX0KLQlyZXR1cm4gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogdGhlbiwgY29tcGFyZSBjcyB3aXRoIEJPTSAqLworICAgICAgICAgICAgciA9IChzdHJjbXAodG9rLT5lbmNvZGluZywgY3MpID09IDApOworICAgICAgICAgICAgUHlNZW1fRlJFRShjcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFyKSB7CisgICAgICAgIGNzID0gdG9rLT5lbmNvZGluZzsKKyAgICAgICAgaWYgKCFjcykKKyAgICAgICAgICAgIGNzID0gIndpdGggQk9NIjsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLCAiZW5jb2RpbmcgcHJvYmxlbTogJXMiLCBjcyk7CisgICAgfQorICAgIHJldHVybiByOwogfQogCiAvKiBTZWUgd2hldGhlciB0aGUgZmlsZSBzdGFydHMgd2l0aCBhIEJPTS4gSWYgaXQgZG9lcywKQEAgLTMwNyw2MSArMzA3LDYxIEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrX2JvbShpbnQgZ2V0X2NoYXIoc3RydWN0IHRva19zdGF0ZSAqKSwKLQkgIHZvaWQgdW5nZXRfY2hhcihpbnQsIHN0cnVjdCB0b2tfc3RhdGUgKiksCi0JICBpbnQgc2V0X3JlYWRsaW5lKHN0cnVjdCB0b2tfc3RhdGUgKiwgY29uc3QgY2hhciAqKSwKLQkgIHN0cnVjdCB0b2tfc3RhdGUgKnRvaykKKyAgICAgICAgICB2b2lkIHVuZ2V0X2NoYXIoaW50LCBzdHJ1Y3QgdG9rX3N0YXRlICopLAorICAgICAgICAgIGludCBzZXRfcmVhZGxpbmUoc3RydWN0IHRva19zdGF0ZSAqLCBjb25zdCBjaGFyICopLAorICAgICAgICAgIHN0cnVjdCB0b2tfc3RhdGUgKnRvaykKIHsKLQlpbnQgY2gxLCBjaDIsIGNoMzsKLQljaDEgPSBnZXRfY2hhcih0b2spOwotCXRvay0+ZGVjb2Rpbmdfc3RhdGUgPSAxOwotCWlmIChjaDEgPT0gRU9GKSB7Ci0JCXJldHVybiAxOwotCX0gZWxzZSBpZiAoY2gxID09IDB4RUYpIHsKLQkJY2gyID0gZ2V0X2NoYXIodG9rKTsKLQkJaWYgKGNoMiAhPSAweEJCKSB7Ci0JCQl1bmdldF9jaGFyKGNoMiwgdG9rKTsKLQkJCXVuZ2V0X2NoYXIoY2gxLCB0b2spOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJY2gzID0gZ2V0X2NoYXIodG9rKTsKLQkJaWYgKGNoMyAhPSAweEJGKSB7Ci0JCQl1bmdldF9jaGFyKGNoMywgdG9rKTsKLQkJCXVuZ2V0X2NoYXIoY2gyLCB0b2spOwotCQkJdW5nZXRfY2hhcihjaDEsIHRvayk7Ci0JCQlyZXR1cm4gMTsKLQkJfQorICAgIGludCBjaDEsIGNoMiwgY2gzOworICAgIGNoMSA9IGdldF9jaGFyKHRvayk7CisgICAgdG9rLT5kZWNvZGluZ19zdGF0ZSA9IDE7CisgICAgaWYgKGNoMSA9PSBFT0YpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChjaDEgPT0gMHhFRikgeworICAgICAgICBjaDIgPSBnZXRfY2hhcih0b2spOworICAgICAgICBpZiAoY2gyICE9IDB4QkIpIHsKKyAgICAgICAgICAgIHVuZ2V0X2NoYXIoY2gyLCB0b2spOworICAgICAgICAgICAgdW5nZXRfY2hhcihjaDEsIHRvayk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBjaDMgPSBnZXRfY2hhcih0b2spOworICAgICAgICBpZiAoY2gzICE9IDB4QkYpIHsKKyAgICAgICAgICAgIHVuZ2V0X2NoYXIoY2gzLCB0b2spOworICAgICAgICAgICAgdW5nZXRfY2hhcihjaDIsIHRvayk7CisgICAgICAgICAgICB1bmdldF9jaGFyKGNoMSwgdG9rKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAjaWYgMAotCS8qIERpc2FibGUgc3VwcG9ydCBmb3IgVVRGLTE2IEJPTXMgdW50aWwgYSBkZWNpc2lvbgotCSAgIGlzIG1hZGUgd2hldGhlciB0aGlzIG5lZWRzIHRvIGJlIHN1cHBvcnRlZC4gICovCi0JfSBlbHNlIGlmIChjaDEgPT0gMHhGRSkgewotCQljaDIgPSBnZXRfY2hhcih0b2spOwotCQlpZiAoY2gyICE9IDB4RkYpIHsKLQkJCXVuZ2V0X2NoYXIoY2gyLCB0b2spOwotCQkJdW5nZXRfY2hhcihjaDEsIHRvayk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlpZiAoIXNldF9yZWFkbGluZSh0b2ssICJ1dGYtMTYtYmUiKSkKLQkJCXJldHVybiAwOwotCQl0b2stPmRlY29kaW5nX3N0YXRlID0gLTE7Ci0JfSBlbHNlIGlmIChjaDEgPT0gMHhGRikgewotCQljaDIgPSBnZXRfY2hhcih0b2spOwotCQlpZiAoY2gyICE9IDB4RkUpIHsKLQkJCXVuZ2V0X2NoYXIoY2gyLCB0b2spOwotCQkJdW5nZXRfY2hhcihjaDEsIHRvayk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlpZiAoIXNldF9yZWFkbGluZSh0b2ssICJ1dGYtMTYtbGUiKSkKLQkJCXJldHVybiAwOwotCQl0b2stPmRlY29kaW5nX3N0YXRlID0gLTE7CisgICAgLyogRGlzYWJsZSBzdXBwb3J0IGZvciBVVEYtMTYgQk9NcyB1bnRpbCBhIGRlY2lzaW9uCisgICAgICAgaXMgbWFkZSB3aGV0aGVyIHRoaXMgbmVlZHMgdG8gYmUgc3VwcG9ydGVkLiAgKi8KKyAgICB9IGVsc2UgaWYgKGNoMSA9PSAweEZFKSB7CisgICAgICAgIGNoMiA9IGdldF9jaGFyKHRvayk7CisgICAgICAgIGlmIChjaDIgIT0gMHhGRikgeworICAgICAgICAgICAgdW5nZXRfY2hhcihjaDIsIHRvayk7CisgICAgICAgICAgICB1bmdldF9jaGFyKGNoMSwgdG9rKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0X3JlYWRsaW5lKHRvaywgInV0Zi0xNi1iZSIpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHRvay0+ZGVjb2Rpbmdfc3RhdGUgPSAtMTsKKyAgICB9IGVsc2UgaWYgKGNoMSA9PSAweEZGKSB7CisgICAgICAgIGNoMiA9IGdldF9jaGFyKHRvayk7CisgICAgICAgIGlmIChjaDIgIT0gMHhGRSkgeworICAgICAgICAgICAgdW5nZXRfY2hhcihjaDIsIHRvayk7CisgICAgICAgICAgICB1bmdldF9jaGFyKGNoMSwgdG9rKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0X3JlYWRsaW5lKHRvaywgInV0Zi0xNi1sZSIpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHRvay0+ZGVjb2Rpbmdfc3RhdGUgPSAtMTsKICNlbmRpZgotCX0gZWxzZSB7Ci0JCXVuZ2V0X2NoYXIoY2gxLCB0b2spOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKHRvay0+ZW5jb2RpbmcgIT0gTlVMTCkKLQkJUHlNZW1fRlJFRSh0b2stPmVuY29kaW5nKTsKLQl0b2stPmVuY29kaW5nID0gbmV3X3N0cmluZygidXRmLTgiLCA1KTsJLyogcmVzdWx0aW5nIGlzIGluIHV0Zi04ICovCi0JcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdW5nZXRfY2hhcihjaDEsIHRvayk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAodG9rLT5lbmNvZGluZyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GUkVFKHRvay0+ZW5jb2RpbmcpOworICAgIHRvay0+ZW5jb2RpbmcgPSBuZXdfc3RyaW5nKCJ1dGYtOCIsIDUpOyAgICAgLyogcmVzdWx0aW5nIGlzIGluIHV0Zi04ICovCisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIFJlYWQgYSBsaW5lIG9mIHRleHQgZnJvbSBUT0sgaW50byBTLCB1c2luZyB0aGUgc3RyZWFtIGluIFRPSy4KQEAgLTM3MCw2MyArMzcwLDYzIEBACiAgICBPbiBlbnRyeSwgdG9rLT5kZWNvZGluZ19idWZmZXIgd2lsbCBiZSBvbmUgb2Y6CiAgICAgIDEpIE5VTEw6IG5lZWQgdG8gY2FsbCB0b2stPmRlY29kaW5nX3JlYWRsaW5lIHRvIGdldCBhIG5ldyBsaW5lCiAgICAgIDIpIFB5VW5pY29kZU9iamVjdCAqOiBkZWNvZGluZ19mZW9mIGhhcyBjYWxsZWQgdG9rLT5kZWNvZGluZ19yZWFkbGluZSBhbmQKLSAgICAgICAgICAgc3RvcmVkIHRoZSByZXN1bHQgaW4gdG9rLT5kZWNvZGluZ19idWZmZXIKKyAgICAgICBzdG9yZWQgdGhlIHJlc3VsdCBpbiB0b2stPmRlY29kaW5nX2J1ZmZlcgogICAgICAzKSBQeVN0cmluZ09iamVjdCAqOiBwcmV2aW91cyBjYWxsIHRvIGZwX3JlYWRsIGRpZCBub3QgaGF2ZSBlbm91Z2ggcm9vbQotICAgICAgICAgICAoaW4gdGhlIHMgYnVmZmVyKSB0byBjb3B5IGVudGlyZSBjb250ZW50cyBvZiB0aGUgbGluZSByZWFkCi0gICAgICAgICAgIGJ5IHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUuICB0b2stPmRlY29kaW5nX2J1ZmZlciBoYXMgdGhlIG92ZXJmbG93LgotICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGZwX3JlYWRsIGlzIGNhbGxlZCBpbiBhIGxvb3AgKHdpdGggYW4gZXhwYW5kZWQgYnVmZmVyKQotICAgICAgICAgICB1bnRpbCB0aGUgYnVmZmVyIGVuZHMgd2l0aCBhICdcbicgKG9yIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMKLSAgICAgICAgICAgcmVhY2hlZCk6IHNlZSB0b2tfbmV4dGMgYW5kIGl0cyBjYWxscyB0byBkZWNvZGluZ19mZ2V0cy4KKyAgICAgICAoaW4gdGhlIHMgYnVmZmVyKSB0byBjb3B5IGVudGlyZSBjb250ZW50cyBvZiB0aGUgbGluZSByZWFkCisgICAgICAgYnkgdG9rLT5kZWNvZGluZ19yZWFkbGluZS4gIHRvay0+ZGVjb2RpbmdfYnVmZmVyIGhhcyB0aGUgb3ZlcmZsb3cuCisgICAgICAgSW4gdGhpcyBjYXNlLCBmcF9yZWFkbCBpcyBjYWxsZWQgaW4gYSBsb29wICh3aXRoIGFuIGV4cGFuZGVkIGJ1ZmZlcikKKyAgICAgICB1bnRpbCB0aGUgYnVmZmVyIGVuZHMgd2l0aCBhICdcbicgKG9yIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMKKyAgICAgICByZWFjaGVkKTogc2VlIHRva19uZXh0YyBhbmQgaXRzIGNhbGxzIHRvIGRlY29kaW5nX2ZnZXRzLgogKi8KIAogc3RhdGljIGNoYXIgKgogZnBfcmVhZGwoY2hhciAqcywgaW50IHNpemUsIHN0cnVjdCB0b2tfc3RhdGUgKnRvaykKIHsKICNpZm5kZWYgUHlfVVNJTkdfVU5JQ09ERQotCS8qIEluIGEgbm9uLVVuaWNvZGUgYnVpbHQsIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4gKi8KLQlQeV9GYXRhbEVycm9yKCJmcF9yZWFkbCBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiB0aGlzIGJ1aWxkLiIpOwotCXJldHVybiBOVUxMOyAvKiBLZWVwIGNvbXBpbGVyIGhhcHB5IChub3QgcmVhY2hhYmxlKSAqLworICAgIC8qIEluIGEgbm9uLVVuaWNvZGUgYnVpbHQsIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4gKi8KKyAgICBQeV9GYXRhbEVycm9yKCJmcF9yZWFkbCBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiB0aGlzIGJ1aWxkLiIpOworICAgIHJldHVybiBOVUxMOyAvKiBLZWVwIGNvbXBpbGVyIGhhcHB5IChub3QgcmVhY2hhYmxlKSAqLwogI2Vsc2UKLQlQeU9iamVjdCogdXRmOCA9IE5VTEw7Ci0JUHlPYmplY3QqIGJ1ZiA9IHRvay0+ZGVjb2RpbmdfYnVmZmVyOwotCWNoYXIgKnN0cjsKLQlQeV9zc2l6ZV90IHV0ZjhsZW47CisgICAgUHlPYmplY3QqIHV0ZjggPSBOVUxMOworICAgIFB5T2JqZWN0KiBidWYgPSB0b2stPmRlY29kaW5nX2J1ZmZlcjsKKyAgICBjaGFyICpzdHI7CisgICAgUHlfc3NpemVfdCB1dGY4bGVuOwogCi0JLyogQXNrIGZvciBvbmUgbGVzcyBieXRlIHNvIHdlIGNhbiB0ZXJtaW5hdGUgaXQgKi8KLQlhc3NlcnQoc2l6ZSA+IDApOwotCXNpemUtLTsKKyAgICAvKiBBc2sgZm9yIG9uZSBsZXNzIGJ5dGUgc28gd2UgY2FuIHRlcm1pbmF0ZSBpdCAqLworICAgIGFzc2VydChzaXplID4gMCk7CisgICAgc2l6ZS0tOwogCi0JaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCWJ1ZiA9IFB5T2JqZWN0X0NhbGxPYmplY3QodG9rLT5kZWNvZGluZ19yZWFkbGluZSwgTlVMTCk7Ci0JCWlmIChidWYgPT0gTlVMTCkKLQkJCXJldHVybiBlcnJvcl9yZXQodG9rKTsKLQl9IGVsc2UgewotCQl0b2stPmRlY29kaW5nX2J1ZmZlciA9IE5VTEw7Ci0JCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KGJ1ZikpCi0JCQl1dGY4ID0gYnVmOwotCX0KLQlpZiAodXRmOCA9PSBOVUxMKSB7Ci0JCXV0ZjggPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGJ1Zik7Ci0JCVB5X0RFQ1JFRihidWYpOwotCQlpZiAodXRmOCA9PSBOVUxMKQotCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCX0KLQlzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyh1dGY4KTsKLQl1dGY4bGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodXRmOCk7Ci0JaWYgKHV0ZjhsZW4gPiBzaXplKSB7Ci0JCXRvay0+ZGVjb2RpbmdfYnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyK3NpemUsIHV0ZjhsZW4tc2l6ZSk7Ci0JCWlmICh0b2stPmRlY29kaW5nX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodXRmOCk7Ci0JCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7Ci0JCX0KLQkJdXRmOGxlbiA9IHNpemU7Ci0JfQotCW1lbWNweShzLCBzdHIsIHV0ZjhsZW4pOwotCXNbdXRmOGxlbl0gPSAnXDAnOwotCVB5X0RFQ1JFRih1dGY4KTsKLQlpZiAodXRmOGxlbiA9PSAwKQotCQlyZXR1cm4gTlVMTDsgLyogRU9GICovCi0JcmV0dXJuIHM7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIGJ1ZiA9IFB5T2JqZWN0X0NhbGxPYmplY3QodG9rLT5kZWNvZGluZ19yZWFkbGluZSwgTlVMTCk7CisgICAgICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcl9yZXQodG9rKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0b2stPmRlY29kaW5nX2J1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KGJ1ZikpCisgICAgICAgICAgICB1dGY4ID0gYnVmOworICAgIH0KKyAgICBpZiAodXRmOCA9PSBOVUxMKSB7CisgICAgICAgIHV0ZjggPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGJ1Zik7CisgICAgICAgIFB5X0RFQ1JFRihidWYpOworICAgICAgICBpZiAodXRmOCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yX3JldCh0b2spOworICAgIH0KKyAgICBzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyh1dGY4KTsKKyAgICB1dGY4bGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodXRmOCk7CisgICAgaWYgKHV0ZjhsZW4gPiBzaXplKSB7CisgICAgICAgIHRvay0+ZGVjb2RpbmdfYnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyK3NpemUsIHV0ZjhsZW4tc2l6ZSk7CisgICAgICAgIGlmICh0b2stPmRlY29kaW5nX2J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodXRmOCk7CisgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgICAgIH0KKyAgICAgICAgdXRmOGxlbiA9IHNpemU7CisgICAgfQorICAgIG1lbWNweShzLCBzdHIsIHV0ZjhsZW4pOworICAgIHNbdXRmOGxlbl0gPSAnXDAnOworICAgIFB5X0RFQ1JFRih1dGY4KTsKKyAgICBpZiAodXRmOGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsgLyogRU9GICovCisgICAgcmV0dXJuIHM7CiAjZW5kaWYKIH0KIApAQCAtNDQzLDM3ICs0NDMsMzcgQEAKIHN0YXRpYyBpbnQKIGZwX3NldHJlYWRsKHN0cnVjdCB0b2tfc3RhdGUgKnRvaywgY29uc3QgY2hhciogZW5jKQogewotCVB5T2JqZWN0ICpyZWFkZXIsICpzdHJlYW0sICpyZWFkbGluZTsKKyAgICBQeU9iamVjdCAqcmVhZGVyLCAqc3RyZWFtLCAqcmVhZGxpbmU7CiAKLQkvKiBYWFg6IGNvbnN0aWZ5IGZpbGVuYW1lIGFyZ3VtZW50LiAqLwotCXN0cmVhbSA9IFB5RmlsZV9Gcm9tRmlsZSh0b2stPmZwLCAoY2hhciopdG9rLT5maWxlbmFtZSwgInJiIiwgTlVMTCk7Ci0JaWYgKHN0cmVhbSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICAvKiBYWFg6IGNvbnN0aWZ5IGZpbGVuYW1lIGFyZ3VtZW50LiAqLworICAgIHN0cmVhbSA9IFB5RmlsZV9Gcm9tRmlsZSh0b2stPmZwLCAoY2hhciopdG9rLT5maWxlbmFtZSwgInJiIiwgTlVMTCk7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAotCXJlYWRlciA9IFB5Q29kZWNfU3RyZWFtUmVhZGVyKGVuYywgc3RyZWFtLCBOVUxMKTsKLQlQeV9ERUNSRUYoc3RyZWFtKTsKLQlpZiAocmVhZGVyID09IE5VTEwpCi0JCXJldHVybiAwOworICAgIHJlYWRlciA9IFB5Q29kZWNfU3RyZWFtUmVhZGVyKGVuYywgc3RyZWFtLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoc3RyZWFtKTsKKyAgICBpZiAocmVhZGVyID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCi0JcmVhZGxpbmUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHJlYWRlciwgInJlYWRsaW5lIik7Ci0JUHlfREVDUkVGKHJlYWRlcik7Ci0JaWYgKHJlYWRsaW5lID09IE5VTEwpCi0JCXJldHVybiAwOworICAgIHJlYWRsaW5lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhyZWFkZXIsICJyZWFkbGluZSIpOworICAgIFB5X0RFQ1JFRihyZWFkZXIpOworICAgIGlmIChyZWFkbGluZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAotCXRvay0+ZGVjb2RpbmdfcmVhZGxpbmUgPSByZWFkbGluZTsKLQlyZXR1cm4gMTsKKyAgICB0b2stPmRlY29kaW5nX3JlYWRsaW5lID0gcmVhZGxpbmU7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIEZldGNoIHRoZSBuZXh0IGJ5dGUgZnJvbSBUT0suICovCiAKIHN0YXRpYyBpbnQgZnBfZ2V0YyhzdHJ1Y3QgdG9rX3N0YXRlICp0b2spIHsKLQlyZXR1cm4gZ2V0Yyh0b2stPmZwKTsKKyAgICByZXR1cm4gZ2V0Yyh0b2stPmZwKTsKIH0KIAogLyogVW5mZXRjaCB0aGUgbGFzdCBieXRlIGJhY2sgaW50byBUT0suICAqLwogCiBzdGF0aWMgdm9pZCBmcF91bmdldGMoaW50IGMsIHN0cnVjdCB0b2tfc3RhdGUgKnRvaykgewotCXVuZ2V0YyhjLCB0b2stPmZwKTsKKyAgICB1bmdldGMoYywgdG9rLT5mcCk7CiB9CiAKIC8qIFJlYWQgYSBsaW5lIG9mIGlucHV0IGZyb20gVE9LLiBEZXRlcm1pbmUgZW5jb2RpbmcKQEAgLTQ4Miw5NCArNDgyLDk0IEBACiBzdGF0aWMgY2hhciAqCiBkZWNvZGluZ19mZ2V0cyhjaGFyICpzLCBpbnQgc2l6ZSwgc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewotCWNoYXIgKmxpbmUgPSBOVUxMOwotCWludCBiYWRjaGFyID0gMDsKLQlmb3IgKDs7KSB7Ci0JCWlmICh0b2stPmRlY29kaW5nX3N0YXRlIDwgMCkgewotCQkJLyogV2UgYWxyZWFkeSBoYXZlIGEgY29kZWMgYXNzb2NpYXRlZCB3aXRoCi0JCQkgICB0aGlzIGlucHV0LiAqLwotCQkJbGluZSA9IGZwX3JlYWRsKHMsIHNpemUsIHRvayk7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmICh0b2stPmRlY29kaW5nX3N0YXRlID4gMCkgewotCQkJLyogV2Ugd2FudCBhICdyYXcnIHJlYWQuICovCi0JCQlsaW5lID0gUHlfVW5pdmVyc2FsTmV3bGluZUZnZXRzKHMsIHNpemUsCi0JCQkJCQkJdG9rLT5mcCwgTlVMTCk7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCS8qIFdlIGhhdmUgbm90IHlldCBkZXRlcm1pbmVkIHRoZSBlbmNvZGluZy4KLQkJCSAgIElmIGFuIGVuY29kaW5nIGlzIGZvdW5kLCB1c2UgdGhlIGZpbGUtcG9pbnRlcgotCQkJICAgcmVhZGVyIGZ1bmN0aW9ucyBmcm9tIG5vdyBvbi4gKi8KLQkJCWlmICghY2hlY2tfYm9tKGZwX2dldGMsIGZwX3VuZ2V0YywgZnBfc2V0cmVhZGwsIHRvaykpCi0JCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCQkJYXNzZXJ0KHRvay0+ZGVjb2Rpbmdfc3RhdGUgIT0gMCk7Ci0JCX0KLQl9Ci0JaWYgKGxpbmUgIT0gTlVMTCAmJiB0b2stPmxpbmVubyA8IDIgJiYgIXRvay0+cmVhZF9jb2Rpbmdfc3BlYykgewotCQlpZiAoIWNoZWNrX2NvZGluZ19zcGVjKGxpbmUsIHN0cmxlbihsaW5lKSwgdG9rLCBmcF9zZXRyZWFkbCkpIHsKLQkJCXJldHVybiBlcnJvcl9yZXQodG9rKTsKLQkJfQotCX0KKyAgICBjaGFyICpsaW5lID0gTlVMTDsKKyAgICBpbnQgYmFkY2hhciA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAodG9rLT5kZWNvZGluZ19zdGF0ZSA8IDApIHsKKyAgICAgICAgICAgIC8qIFdlIGFscmVhZHkgaGF2ZSBhIGNvZGVjIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICAgICAgICAgdGhpcyBpbnB1dC4gKi8KKyAgICAgICAgICAgIGxpbmUgPSBmcF9yZWFkbChzLCBzaXplLCB0b2spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAodG9rLT5kZWNvZGluZ19zdGF0ZSA+IDApIHsKKyAgICAgICAgICAgIC8qIFdlIHdhbnQgYSAncmF3JyByZWFkLiAqLworICAgICAgICAgICAgbGluZSA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhzLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2stPmZwLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogV2UgaGF2ZSBub3QgeWV0IGRldGVybWluZWQgdGhlIGVuY29kaW5nLgorICAgICAgICAgICAgICAgSWYgYW4gZW5jb2RpbmcgaXMgZm91bmQsIHVzZSB0aGUgZmlsZS1wb2ludGVyCisgICAgICAgICAgICAgICByZWFkZXIgZnVuY3Rpb25zIGZyb20gbm93IG9uLiAqLworICAgICAgICAgICAgaWYgKCFjaGVja19ib20oZnBfZ2V0YywgZnBfdW5nZXRjLCBmcF9zZXRyZWFkbCwgdG9rKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgICAgICAgICBhc3NlcnQodG9rLT5kZWNvZGluZ19zdGF0ZSAhPSAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobGluZSAhPSBOVUxMICYmIHRvay0+bGluZW5vIDwgMiAmJiAhdG9rLT5yZWFkX2NvZGluZ19zcGVjKSB7CisgICAgICAgIGlmICghY2hlY2tfY29kaW5nX3NwZWMobGluZSwgc3RybGVuKGxpbmUpLCB0b2ssIGZwX3NldHJlYWRsKSkgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yX3JldCh0b2spOworICAgICAgICB9CisgICAgfQogI2lmbmRlZiBQR0VOCi0JLyogVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgQVNDSUksIHNvIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGFueQotICAgICAgICAgICBub24tQVNDSUkgYnl0ZXMgaW4gaXQuICovCi0JaWYgKGxpbmUgJiYgIXRvay0+ZW5jb2RpbmcpIHsKLQkJdW5zaWduZWQgY2hhciAqYzsKLQkJZm9yIChjID0gKHVuc2lnbmVkIGNoYXIgKilsaW5lOyAqYzsgYysrKQotCQkJaWYgKCpjID4gMTI3KSB7Ci0JCQkJYmFkY2hhciA9ICpjOwotCQkJCWJyZWFrOwotCQkJfQotCX0KLQlpZiAoYmFkY2hhcikgewotCQljaGFyIGJ1Zls1MDBdOwotCQkvKiBOZWVkIHRvIGFkZCAxIHRvIHRoZSBsaW5lIG51bWJlciwgc2luY2UgdGhpcyBsaW5lCi0JCSAgIGhhcyBub3QgYmVlbiBjb3VudGVkLCB5ZXQuICAqLwotCQlzcHJpbnRmKGJ1ZiwKLQkJCSJOb24tQVNDSUkgY2hhcmFjdGVyICdcXHglLjJ4JyAiCi0JCQkiaW4gZmlsZSAlLjIwMHMgb24gbGluZSAlaSwgIgotCQkJImJ1dCBubyBlbmNvZGluZyBkZWNsYXJlZDsgIgotCQkJInNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcGVwcy9wZXAtMDI2My5odG1sIGZvciBkZXRhaWxzIiwKLQkJCWJhZGNoYXIsIHRvay0+ZmlsZW5hbWUsIHRvay0+bGluZW5vICsgMSk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwgYnVmKTsKLQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCX0KKyAgICAvKiBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBBU0NJSSwgc28gbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYW55CisgICAgICAgbm9uLUFTQ0lJIGJ5dGVzIGluIGl0LiAqLworICAgIGlmIChsaW5lICYmICF0b2stPmVuY29kaW5nKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmM7CisgICAgICAgIGZvciAoYyA9ICh1bnNpZ25lZCBjaGFyICopbGluZTsgKmM7IGMrKykKKyAgICAgICAgICAgIGlmICgqYyA+IDEyNykgeworICAgICAgICAgICAgICAgIGJhZGNoYXIgPSAqYzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJhZGNoYXIpIHsKKyAgICAgICAgY2hhciBidWZbNTAwXTsKKyAgICAgICAgLyogTmVlZCB0byBhZGQgMSB0byB0aGUgbGluZSBudW1iZXIsIHNpbmNlIHRoaXMgbGluZQorICAgICAgICAgICBoYXMgbm90IGJlZW4gY291bnRlZCwgeWV0LiAgKi8KKyAgICAgICAgc3ByaW50ZihidWYsCisgICAgICAgICAgICAiTm9uLUFTQ0lJIGNoYXJhY3RlciAnXFx4JS4yeCcgIgorICAgICAgICAgICAgImluIGZpbGUgJS4yMDBzIG9uIGxpbmUgJWksICIKKyAgICAgICAgICAgICJidXQgbm8gZW5jb2RpbmcgZGVjbGFyZWQ7ICIKKyAgICAgICAgICAgICJzZWUgaHR0cDovL3d3dy5weXRob24ub3JnL3BlcHMvcGVwLTAyNjMuaHRtbCBmb3IgZGV0YWlscyIsCisgICAgICAgICAgICBiYWRjaGFyLCB0b2stPmZpbGVuYW1lLCB0b2stPmxpbmVubyArIDEpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsIGJ1Zik7CisgICAgICAgIHJldHVybiBlcnJvcl9yZXQodG9rKTsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gbGluZTsKKyAgICByZXR1cm4gbGluZTsKIH0KIAogc3RhdGljIGludAogZGVjb2RpbmdfZmVvZihzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7Ci0JaWYgKHRvay0+ZGVjb2Rpbmdfc3RhdGUgPj0gMCkgewotCQlyZXR1cm4gZmVvZih0b2stPmZwKTsKLQl9IGVsc2UgewotCQlQeU9iamVjdCogYnVmID0gdG9rLT5kZWNvZGluZ19idWZmZXI7Ci0JCWlmIChidWYgPT0gTlVMTCkgewotCQkJYnVmID0gUHlPYmplY3RfQ2FsbE9iamVjdCh0b2stPmRlY29kaW5nX3JlYWRsaW5lLCBOVUxMKTsKLQkJCWlmIChidWYgPT0gTlVMTCkgewotCQkJCWVycm9yX3JldCh0b2spOwotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIHsKLQkJCQl0b2stPmRlY29kaW5nX2J1ZmZlciA9IGJ1ZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gUHlPYmplY3RfTGVuZ3RoKGJ1ZikgPT0gMDsKLQl9CisgICAgaWYgKHRvay0+ZGVjb2Rpbmdfc3RhdGUgPj0gMCkgeworICAgICAgICByZXR1cm4gZmVvZih0b2stPmZwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeU9iamVjdCogYnVmID0gdG9rLT5kZWNvZGluZ19idWZmZXI7CisgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgYnVmID0gUHlPYmplY3RfQ2FsbE9iamVjdCh0b2stPmRlY29kaW5nX3JlYWRsaW5lLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVycm9yX3JldCh0b2spOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0b2stPmRlY29kaW5nX2J1ZmZlciA9IGJ1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlPYmplY3RfTGVuZ3RoKGJ1ZikgPT0gMDsKKyAgICB9CiB9CiAKIC8qIEZldGNoIGEgYnl0ZSBmcm9tIFRPSywgdXNpbmcgdGhlIHN0cmluZyBidWZmZXIuICovCiAKIHN0YXRpYyBpbnQKIGJ1Zl9nZXRjKHN0cnVjdCB0b2tfc3RhdGUgKnRvaykgewotCXJldHVybiBQeV9DSEFSTUFTSygqdG9rLT5zdHIrKyk7CisgICAgcmV0dXJuIFB5X0NIQVJNQVNLKCp0b2stPnN0cisrKTsKIH0KIAogLyogVW5mZXRjaCBhIGJ5dGUgZnJvbSBUT0ssIHVzaW5nIHRoZSBzdHJpbmcgYnVmZmVyLiAqLwogCiBzdGF0aWMgdm9pZAogYnVmX3VuZ2V0YyhpbnQgYywgc3RydWN0IHRva19zdGF0ZSAqdG9rKSB7Ci0JdG9rLT5zdHItLTsKLQlhc3NlcnQoUHlfQ0hBUk1BU0soKnRvay0+c3RyKSA9PSBjKTsJLyogdG9rLT5jdXIgbWF5IHBvaW50IHRvIHJlYWQtb25seSBzZWdtZW50ICovCisgICAgdG9rLT5zdHItLTsKKyAgICBhc3NlcnQoUHlfQ0hBUk1BU0soKnRvay0+c3RyKSA9PSBjKTsgICAgICAgIC8qIHRvay0+Y3VyIG1heSBwb2ludCB0byByZWFkLW9ubHkgc2VnbWVudCAqLwogfQogCiAvKiBTZXQgdGhlIHJlYWRsaW5lIGZ1bmN0aW9uIGZvciBUT0sgdG8gRU5DLiBGb3IgdGhlIHN0cmluZy1iYXNlZApAQCAtNTc3LDggKzU3Nyw4IEBACiAKIHN0YXRpYyBpbnQKIGJ1Zl9zZXRyZWFkbChzdHJ1Y3QgdG9rX3N0YXRlICp0b2ssIGNvbnN0IGNoYXIqIGVuYykgewotCXRvay0+ZW5jID0gZW5jOwotCXJldHVybiAxOworICAgIHRvay0+ZW5jID0gZW5jOworICAgIHJldHVybiAxOwogfQogCiAvKiBSZXR1cm4gYSBVVEYtOCBlbmNvZGluZyBQeXRob24gc3RyaW5nIG9iamVjdCBmcm9tIHRoZQpAQCAtNTg3LDU1ICs1ODcsNTUgQEAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiBzdGF0aWMgUHlPYmplY3QgKgogdHJhbnNsYXRlX2ludG9fdXRmOChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGVuYykgewotCVB5T2JqZWN0ICp1dGY4OwotCVB5T2JqZWN0KiBidWYgPSBQeVVuaWNvZGVfRGVjb2RlKHN0ciwgc3RybGVuKHN0ciksIGVuYywgTlVMTCk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl1dGY4ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhidWYpOwotCVB5X0RFQ1JFRihidWYpOwotCXJldHVybiB1dGY4OworICAgIFB5T2JqZWN0ICp1dGY4OworICAgIFB5T2JqZWN0KiBidWYgPSBQeVVuaWNvZGVfRGVjb2RlKHN0ciwgc3RybGVuKHN0ciksIGVuYywgTlVMTCk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB1dGY4ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhidWYpOworICAgIFB5X0RFQ1JFRihidWYpOworICAgIHJldHVybiB1dGY4OwogfQogI2VuZGlmCiAKIAogc3RhdGljIGNoYXIgKgogdHJhbnNsYXRlX25ld2xpbmVzKGNvbnN0IGNoYXIgKnMsIGludCBleGVjX2lucHV0LCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spIHsKLQlpbnQgc2tpcF9uZXh0X2xmID0gMCwgbmVlZGVkX2xlbmd0aCA9IHN0cmxlbihzKSArIDIsIGZpbmFsX2xlbmd0aDsKLQljaGFyICpidWYsICpjdXJyZW50OwotCWNoYXIgYyA9ICdcMCc7Ci0JYnVmID0gUHlNZW1fTUFMTE9DKG5lZWRlZF9sZW5ndGgpOwotCWlmIChidWYgPT0gTlVMTCkgewotCQl0b2stPmRvbmUgPSBFX05PTUVNOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm9yIChjdXJyZW50ID0gYnVmOyAqczsgcysrLCBjdXJyZW50KyspIHsKLQkJYyA9ICpzOwotCQlpZiAoc2tpcF9uZXh0X2xmKSB7Ci0JCQlza2lwX25leHRfbGYgPSAwOwotCQkJaWYgKGMgPT0gJ1xuJykgewotCQkJCWMgPSAqKytzOwotCQkJCWlmICghYykKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGMgPT0gJ1xyJykgewotCQkJc2tpcF9uZXh0X2xmID0gMTsKLQkJCWMgPSAnXG4nOwotCQl9Ci0JCSpjdXJyZW50ID0gYzsKLQl9Ci0JLyogSWYgdGhpcyBpcyBleGVjIGlucHV0LCBhZGQgYSBuZXdsaW5lIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBpZgotCSAgIHRoZXJlIGlzbid0IG9uZSBhbHJlYWR5LiAqLwotCWlmIChleGVjX2lucHV0ICYmIGMgIT0gJ1xuJykgewotCQkqY3VycmVudCA9ICdcbic7Ci0JCWN1cnJlbnQrKzsKLQl9Ci0JKmN1cnJlbnQgPSAnXDAnOwotCWZpbmFsX2xlbmd0aCA9IGN1cnJlbnQgLSBidWYgKyAxOwotCWlmIChmaW5hbF9sZW5ndGggPCBuZWVkZWRfbGVuZ3RoICYmIGZpbmFsX2xlbmd0aCkKLQkJLyogc2hvdWxkIG5ldmVyIGZhaWwgKi8KLQkJYnVmID0gUHlNZW1fUkVBTExPQyhidWYsIGZpbmFsX2xlbmd0aCk7Ci0JcmV0dXJuIGJ1ZjsKKyAgICBpbnQgc2tpcF9uZXh0X2xmID0gMCwgbmVlZGVkX2xlbmd0aCA9IHN0cmxlbihzKSArIDIsIGZpbmFsX2xlbmd0aDsKKyAgICBjaGFyICpidWYsICpjdXJyZW50OworICAgIGNoYXIgYyA9ICdcMCc7CisgICAgYnVmID0gUHlNZW1fTUFMTE9DKG5lZWRlZF9sZW5ndGgpOworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICB0b2stPmRvbmUgPSBFX05PTUVNOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChjdXJyZW50ID0gYnVmOyAqczsgcysrLCBjdXJyZW50KyspIHsKKyAgICAgICAgYyA9ICpzOworICAgICAgICBpZiAoc2tpcF9uZXh0X2xmKSB7CisgICAgICAgICAgICBza2lwX25leHRfbGYgPSAwOworICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGMgPSAqKytzOworICAgICAgICAgICAgICAgIGlmICghYykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gJ1xyJykgeworICAgICAgICAgICAgc2tpcF9uZXh0X2xmID0gMTsKKyAgICAgICAgICAgIGMgPSAnXG4nOworICAgICAgICB9CisgICAgICAgICpjdXJyZW50ID0gYzsKKyAgICB9CisgICAgLyogSWYgdGhpcyBpcyBleGVjIGlucHV0LCBhZGQgYSBuZXdsaW5lIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBpZgorICAgICAgIHRoZXJlIGlzbid0IG9uZSBhbHJlYWR5LiAqLworICAgIGlmIChleGVjX2lucHV0ICYmIGMgIT0gJ1xuJykgeworICAgICAgICAqY3VycmVudCA9ICdcbic7CisgICAgICAgIGN1cnJlbnQrKzsKKyAgICB9CisgICAgKmN1cnJlbnQgPSAnXDAnOworICAgIGZpbmFsX2xlbmd0aCA9IGN1cnJlbnQgLSBidWYgKyAxOworICAgIGlmIChmaW5hbF9sZW5ndGggPCBuZWVkZWRfbGVuZ3RoICYmIGZpbmFsX2xlbmd0aCkKKyAgICAgICAgLyogc2hvdWxkIG5ldmVyIGZhaWwgKi8KKyAgICAgICAgYnVmID0gUHlNZW1fUkVBTExPQyhidWYsIGZpbmFsX2xlbmd0aCk7CisgICAgcmV0dXJuIGJ1ZjsKIH0KIAogLyogRGVjb2RlIGEgYnl0ZSBzdHJpbmcgU1RSIGZvciB1c2UgYXMgdGhlIGJ1ZmZlciBvZiBUT0suCkBAIC02NDUsNjEgKzY0NSw2MSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKgogZGVjb2RlX3N0cihjb25zdCBjaGFyICppbnB1dCwgaW50IHNpbmdsZSwgc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewotCVB5T2JqZWN0KiB1dGY4ID0gTlVMTDsKLQljb25zdCBjaGFyICpzdHI7Ci0JY29uc3QgY2hhciAqczsKLQljb25zdCBjaGFyICpuZXdsWzJdID0ge05VTEwsIE5VTEx9OwotCWludCBsaW5lbm8gPSAwOwotCXRvay0+aW5wdXQgPSBzdHIgPSB0cmFuc2xhdGVfbmV3bGluZXMoaW5wdXQsIHNpbmdsZSwgdG9rKTsKLQlpZiAoc3RyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXRvay0+ZW5jID0gTlVMTDsKLQl0b2stPnN0ciA9IHN0cjsKLQlpZiAoIWNoZWNrX2JvbShidWZfZ2V0YywgYnVmX3VuZ2V0YywgYnVmX3NldHJlYWRsLCB0b2spKQotCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7Ci0Jc3RyID0gdG9rLT5zdHI7CQkvKiBzdHJpbmcgYWZ0ZXIgQk9NIGlmIGFueSAqLwotCWFzc2VydChzdHIpOworICAgIFB5T2JqZWN0KiB1dGY4ID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpzdHI7CisgICAgY29uc3QgY2hhciAqczsKKyAgICBjb25zdCBjaGFyICpuZXdsWzJdID0ge05VTEwsIE5VTEx9OworICAgIGludCBsaW5lbm8gPSAwOworICAgIHRvay0+aW5wdXQgPSBzdHIgPSB0cmFuc2xhdGVfbmV3bGluZXMoaW5wdXQsIHNpbmdsZSwgdG9rKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHRvay0+ZW5jID0gTlVMTDsKKyAgICB0b2stPnN0ciA9IHN0cjsKKyAgICBpZiAoIWNoZWNrX2JvbShidWZfZ2V0YywgYnVmX3VuZ2V0YywgYnVmX3NldHJlYWRsLCB0b2spKQorICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgc3RyID0gdG9rLT5zdHI7ICAgICAgICAgICAgIC8qIHN0cmluZyBhZnRlciBCT00gaWYgYW55ICovCisgICAgYXNzZXJ0KHN0cik7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmICh0b2stPmVuYyAhPSBOVUxMKSB7Ci0JCXV0ZjggPSB0cmFuc2xhdGVfaW50b191dGY4KHN0ciwgdG9rLT5lbmMpOwotCQlpZiAodXRmOCA9PSBOVUxMKQotCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCQlzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyh1dGY4KTsKLQl9CisgICAgaWYgKHRvay0+ZW5jICE9IE5VTEwpIHsKKyAgICAgICAgdXRmOCA9IHRyYW5zbGF0ZV9pbnRvX3V0Zjgoc3RyLCB0b2stPmVuYyk7CisgICAgICAgIGlmICh1dGY4ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgICAgIHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHV0ZjgpOworICAgIH0KICNlbmRpZgotCWZvciAocyA9IHN0cjs7IHMrKykgewotCQlpZiAoKnMgPT0gJ1wwJykgYnJlYWs7Ci0JCWVsc2UgaWYgKCpzID09ICdcbicpIHsKLQkJCWFzc2VydChsaW5lbm8gPCAyKTsKLQkJCW5ld2xbbGluZW5vXSA9IHM7Ci0JCQlsaW5lbm8rKzsKLQkJCWlmIChsaW5lbm8gPT0gMikgYnJlYWs7Ci0JCX0KLQl9Ci0JdG9rLT5lbmMgPSBOVUxMOwotCS8qIG5lZWQgdG8gY2hlY2sgbGluZSAxIGFuZCAyIHNlcGFyYXRlbHkgc2luY2UgY2hlY2tfY29kaW5nX3NwZWMKLQkgICBhc3N1bWVzIGEgc2luZ2xlIGxpbmUgYXMgaW5wdXQgKi8KLQlpZiAobmV3bFswXSkgewotCQlpZiAoIWNoZWNrX2NvZGluZ19zcGVjKHN0ciwgbmV3bFswXSAtIHN0ciwgdG9rLCBidWZfc2V0cmVhZGwpKQotCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCQlpZiAodG9rLT5lbmMgPT0gTlVMTCAmJiBuZXdsWzFdKSB7Ci0JCQlpZiAoIWNoZWNrX2NvZGluZ19zcGVjKG5ld2xbMF0rMSwgbmV3bFsxXSAtIG5ld2xbMF0sCi0JCQkJCSAgICAgICB0b2ssIGJ1Zl9zZXRyZWFkbCkpCi0JCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCQl9Ci0JfQorICAgIGZvciAocyA9IHN0cjs7IHMrKykgeworICAgICAgICBpZiAoKnMgPT0gJ1wwJykgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKCpzID09ICdcbicpIHsKKyAgICAgICAgICAgIGFzc2VydChsaW5lbm8gPCAyKTsKKyAgICAgICAgICAgIG5ld2xbbGluZW5vXSA9IHM7CisgICAgICAgICAgICBsaW5lbm8rKzsKKyAgICAgICAgICAgIGlmIChsaW5lbm8gPT0gMikgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgdG9rLT5lbmMgPSBOVUxMOworICAgIC8qIG5lZWQgdG8gY2hlY2sgbGluZSAxIGFuZCAyIHNlcGFyYXRlbHkgc2luY2UgY2hlY2tfY29kaW5nX3NwZWMKKyAgICAgICBhc3N1bWVzIGEgc2luZ2xlIGxpbmUgYXMgaW5wdXQgKi8KKyAgICBpZiAobmV3bFswXSkgeworICAgICAgICBpZiAoIWNoZWNrX2NvZGluZ19zcGVjKHN0ciwgbmV3bFswXSAtIHN0ciwgdG9rLCBidWZfc2V0cmVhZGwpKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yX3JldCh0b2spOworICAgICAgICBpZiAodG9rLT5lbmMgPT0gTlVMTCAmJiBuZXdsWzFdKSB7CisgICAgICAgICAgICBpZiAoIWNoZWNrX2NvZGluZ19zcGVjKG5ld2xbMF0rMSwgbmV3bFsxXSAtIG5ld2xbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvaywgYnVmX3NldHJlYWRsKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgICAgIH0KKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmICh0b2stPmVuYyAhPSBOVUxMKSB7Ci0JCWFzc2VydCh1dGY4ID09IE5VTEwpOwotCQl1dGY4ID0gdHJhbnNsYXRlX2ludG9fdXRmOChzdHIsIHRvay0+ZW5jKTsKLQkJaWYgKHV0ZjggPT0gTlVMTCkKLQkJCXJldHVybiBlcnJvcl9yZXQodG9rKTsKLQkJc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcodXRmOCk7Ci0JfQorICAgIGlmICh0b2stPmVuYyAhPSBOVUxMKSB7CisgICAgICAgIGFzc2VydCh1dGY4ID09IE5VTEwpOworICAgICAgICB1dGY4ID0gdHJhbnNsYXRlX2ludG9fdXRmOChzdHIsIHRvay0+ZW5jKTsKKyAgICAgICAgaWYgKHV0ZjggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcl9yZXQodG9rKTsKKyAgICAgICAgc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcodXRmOCk7CisgICAgfQogI2VuZGlmCi0JYXNzZXJ0KHRvay0+ZGVjb2RpbmdfYnVmZmVyID09IE5VTEwpOwotCXRvay0+ZGVjb2RpbmdfYnVmZmVyID0gdXRmODsgLyogQ0FVVElPTiAqLwotCXJldHVybiBzdHI7CisgICAgYXNzZXJ0KHRvay0+ZGVjb2RpbmdfYnVmZmVyID09IE5VTEwpOworICAgIHRvay0+ZGVjb2RpbmdfYnVmZmVyID0gdXRmODsgLyogQ0FVVElPTiAqLworICAgIHJldHVybiBzdHI7CiB9CiAKICNlbmRpZiAvKiBQR0VOICovCkBAIC03MDksMTggKzcwOSwxOCBAQAogc3RydWN0IHRva19zdGF0ZSAqCiBQeVRva2VuaXplcl9Gcm9tU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IGV4ZWNfaW5wdXQpCiB7Ci0Jc3RydWN0IHRva19zdGF0ZSAqdG9rID0gdG9rX25ldygpOwotCWlmICh0b2sgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3RyID0gKGNoYXIgKilkZWNvZGVfc3RyKHN0ciwgZXhlY19pbnB1dCwgdG9rKTsKLQlpZiAoc3RyID09IE5VTEwpIHsKLQkJUHlUb2tlbml6ZXJfRnJlZSh0b2spOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc3RydWN0IHRva19zdGF0ZSAqdG9rID0gdG9rX25ldygpOworICAgIGlmICh0b2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3RyID0gKGNoYXIgKilkZWNvZGVfc3RyKHN0ciwgZXhlY19pbnB1dCwgdG9rKTsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgUHlUb2tlbml6ZXJfRnJlZSh0b2spOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBYWFg6IGNvbnN0aWZ5IG1lbWJlcnMuICovCi0JdG9rLT5idWYgPSB0b2stPmN1ciA9IHRvay0+ZW5kID0gdG9rLT5pbnAgPSAoY2hhciopc3RyOwotCXJldHVybiB0b2s7CisgICAgLyogWFhYOiBjb25zdGlmeSBtZW1iZXJzLiAqLworICAgIHRvay0+YnVmID0gdG9rLT5jdXIgPSB0b2stPmVuZCA9IHRvay0+aW5wID0gKGNoYXIqKXN0cjsKKyAgICByZXR1cm4gdG9rOwogfQogCiAKQEAgLTcyOSwxOSArNzI5LDE5IEBACiBzdHJ1Y3QgdG9rX3N0YXRlICoKIFB5VG9rZW5pemVyX0Zyb21GaWxlKEZJTEUgKmZwLCBjaGFyICpwczEsIGNoYXIgKnBzMikKIHsKLQlzdHJ1Y3QgdG9rX3N0YXRlICp0b2sgPSB0b2tfbmV3KCk7Ci0JaWYgKHRvayA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHRvay0+YnVmID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoQlVGU0laKSkgPT0gTlVMTCkgewotCQlQeVRva2VuaXplcl9GcmVlKHRvayk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl0b2stPmN1ciA9IHRvay0+aW5wID0gdG9rLT5idWY7Ci0JdG9rLT5lbmQgPSB0b2stPmJ1ZiArIEJVRlNJWjsKLQl0b2stPmZwID0gZnA7Ci0JdG9rLT5wcm9tcHQgPSBwczE7Ci0JdG9rLT5uZXh0cHJvbXB0ID0gcHMyOwotCXJldHVybiB0b2s7CisgICAgc3RydWN0IHRva19zdGF0ZSAqdG9rID0gdG9rX25ldygpOworICAgIGlmICh0b2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCh0b2stPmJ1ZiA9IChjaGFyICopUHlNZW1fTUFMTE9DKEJVRlNJWikpID09IE5VTEwpIHsKKyAgICAgICAgUHlUb2tlbml6ZXJfRnJlZSh0b2spOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdG9rLT5jdXIgPSB0b2stPmlucCA9IHRvay0+YnVmOworICAgIHRvay0+ZW5kID0gdG9rLT5idWYgKyBCVUZTSVo7CisgICAgdG9rLT5mcCA9IGZwOworICAgIHRvay0+cHJvbXB0ID0gcHMxOworICAgIHRvay0+bmV4dHByb21wdCA9IHBzMjsKKyAgICByZXR1cm4gdG9rOwogfQogCiAKQEAgLTc1MCw4MCArNzUwLDgwIEBACiB2b2lkCiBQeVRva2VuaXplcl9GcmVlKHN0cnVjdCB0b2tfc3RhdGUgKnRvaykKIHsKLQlpZiAodG9rLT5lbmNvZGluZyAhPSBOVUxMKQotCQlQeU1lbV9GUkVFKHRvay0+ZW5jb2RpbmcpOworICAgIGlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZSRUUodG9rLT5lbmNvZGluZyk7CiAjaWZuZGVmIFBHRU4KLQlQeV9YREVDUkVGKHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUpOwotCVB5X1hERUNSRUYodG9rLT5kZWNvZGluZ19idWZmZXIpOworICAgIFB5X1hERUNSRUYodG9rLT5kZWNvZGluZ19yZWFkbGluZSk7CisgICAgUHlfWERFQ1JFRih0b2stPmRlY29kaW5nX2J1ZmZlcik7CiAjZW5kaWYKLQlpZiAodG9rLT5mcCAhPSBOVUxMICYmIHRvay0+YnVmICE9IE5VTEwpCi0JCVB5TWVtX0ZSRUUodG9rLT5idWYpOwotCWlmICh0b2stPmlucHV0KQotCQlQeU1lbV9GUkVFKChjaGFyICopdG9rLT5pbnB1dCk7Ci0JUHlNZW1fRlJFRSh0b2spOworICAgIGlmICh0b2stPmZwICE9IE5VTEwgJiYgdG9rLT5idWYgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRlJFRSh0b2stPmJ1Zik7CisgICAgaWYgKHRvay0+aW5wdXQpCisgICAgICAgIFB5TWVtX0ZSRUUoKGNoYXIgKil0b2stPmlucHV0KTsKKyAgICBQeU1lbV9GUkVFKHRvayk7CiB9CiAKICNpZiAhZGVmaW5lZChQR0VOKSAmJiBkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpCiBzdGF0aWMgaW50CiB0b2tfc3RkaW5fZGVjb2RlKHN0cnVjdCB0b2tfc3RhdGUgKnRvaywgY2hhciAqKmlucCkKIHsKLQlQeU9iamVjdCAqZW5jLCAqc3lzc3RkaW4sICpkZWNvZGVkLCAqdXRmODsKLQljb25zdCBjaGFyICplbmNvZGluZzsKLQljaGFyICpjb252ZXJ0ZWQ7CisgICAgUHlPYmplY3QgKmVuYywgKnN5c3N0ZGluLCAqZGVjb2RlZCwgKnV0Zjg7CisgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CisgICAgY2hhciAqY29udmVydGVkOwogCi0JaWYgKFB5U3lzX0dldEZpbGUoKGNoYXIgKikic3RkaW4iLCBOVUxMKSAhPSBzdGRpbikKLQkJcmV0dXJuIDA7Ci0Jc3lzc3RkaW4gPSBQeVN5c19HZXRPYmplY3QoInN0ZGluIik7Ci0JaWYgKHN5c3N0ZGluID09IE5VTEwgfHwgIVB5RmlsZV9DaGVjayhzeXNzdGRpbikpCi0JCXJldHVybiAwOworICAgIGlmIChQeVN5c19HZXRGaWxlKChjaGFyICopInN0ZGluIiwgTlVMTCkgIT0gc3RkaW4pCisgICAgICAgIHJldHVybiAwOworICAgIHN5c3N0ZGluID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRpbiIpOworICAgIGlmIChzeXNzdGRpbiA9PSBOVUxMIHx8ICFQeUZpbGVfQ2hlY2soc3lzc3RkaW4pKQorICAgICAgICByZXR1cm4gMDsKIAotCWVuYyA9ICgoUHlGaWxlT2JqZWN0ICopc3lzc3RkaW4pLT5mX2VuY29kaW5nOwotCWlmIChlbmMgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2soZW5jKSkKLQkJcmV0dXJuIDA7Ci0JUHlfSU5DUkVGKGVuYyk7CisgICAgZW5jID0gKChQeUZpbGVPYmplY3QgKilzeXNzdGRpbiktPmZfZW5jb2Rpbmc7CisgICAgaWYgKGVuYyA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhlbmMpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBQeV9JTkNSRUYoZW5jKTsKIAotCWVuY29kaW5nID0gUHlTdHJpbmdfQXNTdHJpbmcoZW5jKTsKLQlkZWNvZGVkID0gUHlVbmljb2RlX0RlY29kZSgqaW5wLCBzdHJsZW4oKmlucCksIGVuY29kaW5nLCBOVUxMKTsKLQlpZiAoZGVjb2RlZCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX2NsZWFyOworICAgIGVuY29kaW5nID0gUHlTdHJpbmdfQXNTdHJpbmcoZW5jKTsKKyAgICBkZWNvZGVkID0gUHlVbmljb2RlX0RlY29kZSgqaW5wLCBzdHJsZW4oKmlucCksIGVuY29kaW5nLCBOVUxMKTsKKyAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yX2NsZWFyOwogCi0JdXRmOCA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoZGVjb2RlZCwgInV0Zi04IiwgTlVMTCk7Ci0JUHlfREVDUkVGKGRlY29kZWQpOwotCWlmICh1dGY4ID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfY2xlYXI7CisgICAgdXRmOCA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoZGVjb2RlZCwgInV0Zi04IiwgTlVMTCk7CisgICAgUHlfREVDUkVGKGRlY29kZWQpOworICAgIGlmICh1dGY4ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JfY2xlYXI7CiAKLQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2sodXRmOCkpOwotCWNvbnZlcnRlZCA9IG5ld19zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHV0ZjgpLAotCQkJICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHV0ZjgpKTsKLQlQeV9ERUNSRUYodXRmOCk7Ci0JaWYgKGNvbnZlcnRlZCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX25vbWVtOworICAgIGFzc2VydChQeVN0cmluZ19DaGVjayh1dGY4KSk7CisgICAgY29udmVydGVkID0gbmV3X3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodXRmOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRSh1dGY4KSk7CisgICAgUHlfREVDUkVGKHV0ZjgpOworICAgIGlmIChjb252ZXJ0ZWQgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcl9ub21lbTsKIAotCVB5TWVtX0ZSRUUoKmlucCk7Ci0JKmlucCA9IGNvbnZlcnRlZDsKLQlpZiAodG9rLT5lbmNvZGluZyAhPSBOVUxMKQotCQlQeU1lbV9GUkVFKHRvay0+ZW5jb2RpbmcpOwotCXRvay0+ZW5jb2RpbmcgPSBuZXdfc3RyaW5nKGVuY29kaW5nLCBzdHJsZW4oZW5jb2RpbmcpKTsKLQlpZiAodG9rLT5lbmNvZGluZyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX25vbWVtOworICAgIFB5TWVtX0ZSRUUoKmlucCk7CisgICAgKmlucCA9IGNvbnZlcnRlZDsKKyAgICBpZiAodG9rLT5lbmNvZGluZyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GUkVFKHRvay0+ZW5jb2RpbmcpOworICAgIHRvay0+ZW5jb2RpbmcgPSBuZXdfc3RyaW5nKGVuY29kaW5nLCBzdHJsZW4oZW5jb2RpbmcpKTsKKyAgICBpZiAodG9rLT5lbmNvZGluZyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yX25vbWVtOwogCi0JUHlfREVDUkVGKGVuYyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKGVuYyk7CisgICAgcmV0dXJuIDA7CiAKIGVycm9yX25vbWVtOgotCVB5X0RFQ1JFRihlbmMpOwotCXRvay0+ZG9uZSA9IEVfTk9NRU07Ci0JcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihlbmMpOworICAgIHRvay0+ZG9uZSA9IEVfTk9NRU07CisgICAgcmV0dXJuIC0xOwogCiBlcnJvcl9jbGVhcjoKLQlQeV9ERUNSRUYoZW5jKTsKLQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVW5pY29kZURlY29kZUVycm9yKSkgewotCQl0b2stPmRvbmUgPSBFX0VSUk9SOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIEZhbGxiYWNrIHRvIGlzby04ODU5LTE6IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0JUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYoZW5jKTsKKyAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVW5pY29kZURlY29kZUVycm9yKSkgeworICAgICAgICB0b2stPmRvbmUgPSBFX0VSUk9SOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIEZhbGxiYWNrIHRvIGlzby04ODU5LTE6IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZgogCkBAIC04MzIsMTY5ICs4MzIsMTY5IEBACiBzdGF0aWMgaW50CiB0b2tfbmV4dGMocmVnaXN0ZXIgc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewotCWZvciAoOzspIHsKLQkJaWYgKHRvay0+Y3VyICE9IHRvay0+aW5wKSB7Ci0JCQlyZXR1cm4gUHlfQ0hBUk1BU0soKnRvay0+Y3VyKyspOyAvKiBGYXN0IHBhdGggKi8KLQkJfQotCQlpZiAodG9rLT5kb25lICE9IEVfT0spCi0JCQlyZXR1cm4gRU9GOwotCQlpZiAodG9rLT5mcCA9PSBOVUxMKSB7Ci0JCQljaGFyICplbmQgPSBzdHJjaHIodG9rLT5pbnAsICdcbicpOwotCQkJaWYgKGVuZCAhPSBOVUxMKQotCQkJCWVuZCsrOwotCQkJZWxzZSB7Ci0JCQkJZW5kID0gc3RyY2hyKHRvay0+aW5wLCAnXDAnKTsKLQkJCQlpZiAoZW5kID09IHRvay0+aW5wKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfRU9GOwotCQkJCQlyZXR1cm4gRU9GOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0b2stPnN0YXJ0ID09IE5VTEwpCi0JCQkJdG9rLT5idWYgPSB0b2stPmN1cjsKLQkJCXRvay0+bGluZV9zdGFydCA9IHRvay0+Y3VyOwotCQkJdG9rLT5saW5lbm8rKzsKLQkJCXRvay0+aW5wID0gZW5kOwotCQkJcmV0dXJuIFB5X0NIQVJNQVNLKCp0b2stPmN1cisrKTsKLQkJfQotCQlpZiAodG9rLT5wcm9tcHQgIT0gTlVMTCkgewotCQkJY2hhciAqbmV3dG9rID0gUHlPU19SZWFkbGluZShzdGRpbiwgc3Rkb3V0LCB0b2stPnByb21wdCk7Ci0JCQlpZiAodG9rLT5uZXh0cHJvbXB0ICE9IE5VTEwpCi0JCQkJdG9rLT5wcm9tcHQgPSB0b2stPm5leHRwcm9tcHQ7Ci0JCQlpZiAobmV3dG9rID09IE5VTEwpCi0JCQkJdG9rLT5kb25lID0gRV9JTlRSOwotCQkJZWxzZSBpZiAoKm5ld3RvayA9PSAnXDAnKSB7Ci0JCQkJUHlNZW1fRlJFRShuZXd0b2spOwotCQkJCXRvay0+ZG9uZSA9IEVfRU9GOwotCQkJfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKHRvay0+Y3VyICE9IHRvay0+aW5wKSB7CisgICAgICAgICAgICByZXR1cm4gUHlfQ0hBUk1BU0soKnRvay0+Y3VyKyspOyAvKiBGYXN0IHBhdGggKi8KKyAgICAgICAgfQorICAgICAgICBpZiAodG9rLT5kb25lICE9IEVfT0spCisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgICBpZiAodG9rLT5mcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBjaGFyICplbmQgPSBzdHJjaHIodG9rLT5pbnAsICdcbicpOworICAgICAgICAgICAgaWYgKGVuZCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGVuZCsrOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZW5kID0gc3RyY2hyKHRvay0+aW5wLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kID09IHRvay0+aW5wKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfRU9GOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b2stPnN0YXJ0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgdG9rLT5idWYgPSB0b2stPmN1cjsKKyAgICAgICAgICAgIHRvay0+bGluZV9zdGFydCA9IHRvay0+Y3VyOworICAgICAgICAgICAgdG9rLT5saW5lbm8rKzsKKyAgICAgICAgICAgIHRvay0+aW5wID0gZW5kOworICAgICAgICAgICAgcmV0dXJuIFB5X0NIQVJNQVNLKCp0b2stPmN1cisrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9rLT5wcm9tcHQgIT0gTlVMTCkgeworICAgICAgICAgICAgY2hhciAqbmV3dG9rID0gUHlPU19SZWFkbGluZShzdGRpbiwgc3Rkb3V0LCB0b2stPnByb21wdCk7CisgICAgICAgICAgICBpZiAodG9rLT5uZXh0cHJvbXB0ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgdG9rLT5wcm9tcHQgPSB0b2stPm5leHRwcm9tcHQ7CisgICAgICAgICAgICBpZiAobmV3dG9rID09IE5VTEwpCisgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9JTlRSOworICAgICAgICAgICAgZWxzZSBpZiAoKm5ld3RvayA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgUHlNZW1fRlJFRShuZXd0b2spOworICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfRU9GOworICAgICAgICAgICAgfQogI2lmICFkZWZpbmVkKFBHRU4pICYmIGRlZmluZWQoUHlfVVNJTkdfVU5JQ09ERSkKLQkJCWVsc2UgaWYgKHRva19zdGRpbl9kZWNvZGUodG9rLCAmbmV3dG9rKSAhPSAwKQotCQkJCVB5TWVtX0ZSRUUobmV3dG9rKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRva19zdGRpbl9kZWNvZGUodG9rLCAmbmV3dG9rKSAhPSAwKQorICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUobmV3dG9rKTsKICNlbmRpZgotCQkJZWxzZSBpZiAodG9rLT5zdGFydCAhPSBOVUxMKSB7Ci0JCQkJc2l6ZV90IHN0YXJ0ID0gdG9rLT5zdGFydCAtIHRvay0+YnVmOwotCQkJCXNpemVfdCBvbGRsZW4gPSB0b2stPmN1ciAtIHRvay0+YnVmOwotCQkJCXNpemVfdCBuZXdsZW4gPSBvbGRsZW4gKyBzdHJsZW4obmV3dG9rKTsKLQkJCQljaGFyICpidWYgPSB0b2stPmJ1ZjsKLQkJCQlidWYgPSAoY2hhciAqKVB5TWVtX1JFQUxMT0MoYnVmLCBuZXdsZW4rMSk7Ci0JCQkJdG9rLT5saW5lbm8rKzsKLQkJCQlpZiAoYnVmID09IE5VTEwpIHsKLQkJCQkJUHlNZW1fRlJFRSh0b2stPmJ1Zik7Ci0JCQkJCXRvay0+YnVmID0gTlVMTDsKLQkJCQkJUHlNZW1fRlJFRShuZXd0b2spOwotCQkJCQl0b2stPmRvbmUgPSBFX05PTUVNOwotCQkJCQlyZXR1cm4gRU9GOwotCQkJCX0KLQkJCQl0b2stPmJ1ZiA9IGJ1ZjsKLQkJCQl0b2stPmN1ciA9IHRvay0+YnVmICsgb2xkbGVuOwotCQkJCXRvay0+bGluZV9zdGFydCA9IHRvay0+Y3VyOwotCQkJCXN0cmNweSh0b2stPmJ1ZiArIG9sZGxlbiwgbmV3dG9rKTsKLQkJCQlQeU1lbV9GUkVFKG5ld3Rvayk7Ci0JCQkJdG9rLT5pbnAgPSB0b2stPmJ1ZiArIG5ld2xlbjsKLQkJCQl0b2stPmVuZCA9IHRvay0+aW5wICsgMTsKLQkJCQl0b2stPnN0YXJ0ID0gdG9rLT5idWYgKyBzdGFydDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRvay0+bGluZW5vKys7Ci0JCQkJaWYgKHRvay0+YnVmICE9IE5VTEwpCi0JCQkJCVB5TWVtX0ZSRUUodG9rLT5idWYpOwotCQkJCXRvay0+YnVmID0gbmV3dG9rOwotCQkJCXRvay0+bGluZV9zdGFydCA9IHRvay0+YnVmOwotCQkJCXRvay0+Y3VyID0gdG9rLT5idWY7Ci0JCQkJdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5idWY7Ci0JCQkJdG9rLT5pbnAgPSBzdHJjaHIodG9rLT5idWYsICdcMCcpOwotCQkJCXRvay0+ZW5kID0gdG9rLT5pbnAgKyAxOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaW50IGRvbmUgPSAwOwotCQkJUHlfc3NpemVfdCBjdXIgPSAwOwotCQkJY2hhciAqcHQ7Ci0JCQlpZiAodG9rLT5zdGFydCA9PSBOVUxMKSB7Ci0JCQkJaWYgKHRvay0+YnVmID09IE5VTEwpIHsKLQkJCQkJdG9rLT5idWYgPSAoY2hhciAqKQotCQkJCQkJUHlNZW1fTUFMTE9DKEJVRlNJWik7Ci0JCQkJCWlmICh0b2stPmJ1ZiA9PSBOVUxMKSB7Ci0JCQkJCQl0b2stPmRvbmUgPSBFX05PTUVNOwotCQkJCQkJcmV0dXJuIEVPRjsKLQkJCQkJfQotCQkJCQl0b2stPmVuZCA9IHRvay0+YnVmICsgQlVGU0laOwotCQkJCX0KLQkJCQlpZiAoZGVjb2RpbmdfZmdldHModG9rLT5idWYsIChpbnQpKHRvay0+ZW5kIC0gdG9rLT5idWYpLAotCQkJCQkgIHRvaykgPT0gTlVMTCkgewotCQkJCQl0b2stPmRvbmUgPSBFX0VPRjsKLQkJCQkJZG9uZSA9IDE7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0b2stPmRvbmUgPSBFX09LOwotCQkJCQl0b2stPmlucCA9IHN0cmNocih0b2stPmJ1ZiwgJ1wwJyk7Ci0JCQkJCWRvbmUgPSB0b2stPmlucFstMV0gPT0gJ1xuJzsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljdXIgPSB0b2stPmN1ciAtIHRvay0+YnVmOwotCQkJCWlmIChkZWNvZGluZ19mZW9mKHRvaykpIHsKLQkJCQkJdG9rLT5kb25lID0gRV9FT0Y7Ci0JCQkJCWRvbmUgPSAxOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXRvay0+ZG9uZSA9IEVfT0s7Ci0JCQl9Ci0JCQl0b2stPmxpbmVubysrOwotCQkJLyogUmVhZCB1bnRpbCAnXG4nIG9yIEVPRiAqLwotCQkJd2hpbGUgKCFkb25lKSB7Ci0JCQkJUHlfc3NpemVfdCBjdXJzdGFydCA9IHRvay0+c3RhcnQgPT0gTlVMTCA/IC0xIDoKLQkJCQkJICAgICAgICAgIHRvay0+c3RhcnQgLSB0b2stPmJ1ZjsKLQkJCQlQeV9zc2l6ZV90IGN1cnZhbGlkID0gdG9rLT5pbnAgLSB0b2stPmJ1ZjsKLQkJCQlQeV9zc2l6ZV90IG5ld3NpemUgPSBjdXJ2YWxpZCArIEJVRlNJWjsKLQkJCQljaGFyICpuZXdidWYgPSB0b2stPmJ1ZjsKLQkJCQluZXdidWYgPSAoY2hhciAqKVB5TWVtX1JFQUxMT0MobmV3YnVmLAotCQkJCQkJCSAgICAgICBuZXdzaXplKTsKLQkJCQlpZiAobmV3YnVmID09IE5VTEwpIHsKLQkJCQkJdG9rLT5kb25lID0gRV9OT01FTTsKLQkJCQkJdG9rLT5jdXIgPSB0b2stPmlucDsKLQkJCQkJcmV0dXJuIEVPRjsKLQkJCQl9Ci0JCQkJdG9rLT5idWYgPSBuZXdidWY7Ci0JCQkJdG9rLT5pbnAgPSB0b2stPmJ1ZiArIGN1cnZhbGlkOwotCQkJCXRvay0+ZW5kID0gdG9rLT5idWYgKyBuZXdzaXplOwotCQkJCXRvay0+c3RhcnQgPSBjdXJzdGFydCA8IDAgPyBOVUxMIDoKLQkJCQkJICAgICB0b2stPmJ1ZiArIGN1cnN0YXJ0OwotCQkJCWlmIChkZWNvZGluZ19mZ2V0cyh0b2stPmlucCwKLQkJCQkJICAgICAgIChpbnQpKHRvay0+ZW5kIC0gdG9rLT5pbnApLAotCQkJCQkgICAgICAgdG9rKSA9PSBOVUxMKSB7Ci0JCQkJCS8qIEJyZWFrIG91dCBlYXJseSBvbiBkZWNvZGluZwotCQkJCQkgICBlcnJvcnMsIGFzIHRvay0+YnVmIHdpbGwgYmUgTlVMTAotCQkJCQkgKi8KLQkJCQkJaWYgKHRvay0+ZGVjb2RpbmdfZXJyZWQpCi0JCQkJCQlyZXR1cm4gRU9GOwotCQkJCQkvKiBMYXN0IGxpbmUgZG9lcyBub3QgZW5kIGluIFxuLAotCQkJCQkgICBmYWtlIG9uZSAqLwotCQkJCQlzdHJjcHkodG9rLT5pbnAsICJcbiIpOwotCQkJCX0KLQkJCQl0b2stPmlucCA9IHN0cmNocih0b2stPmlucCwgJ1wwJyk7Ci0JCQkJZG9uZSA9IHRvay0+aW5wWy0xXSA9PSAnXG4nOwotCQkJfQotCQkJaWYgKHRvay0+YnVmICE9IE5VTEwpIHsKLQkJCQl0b2stPmN1ciA9IHRvay0+YnVmICsgY3VyOwotCQkJCXRvay0+bGluZV9zdGFydCA9IHRvay0+Y3VyOwotCQkJCS8qIHJlcGxhY2UgIlxyXG4iIHdpdGggIlxuIiAqLwotCQkJCS8qIEZvciBNYWMgbGVhdmUgdGhlIFxyLCBnaXZpbmcgYSBzeW50YXggZXJyb3IgKi8KLQkJCQlwdCA9IHRvay0+aW5wIC0gMjsKLQkJCQlpZiAocHQgPj0gdG9rLT5idWYgJiYgKnB0ID09ICdccicpIHsKLQkJCQkJKnB0KysgPSAnXG4nOwotCQkJCQkqcHQgPSAnXDAnOwotCQkJCQl0b2stPmlucCA9IHB0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodG9rLT5kb25lICE9IEVfT0spIHsKLQkJCWlmICh0b2stPnByb21wdCAhPSBOVUxMKQotCQkJCVB5U3lzX1dyaXRlU3RkZXJyKCJcbiIpOwotCQkJdG9rLT5jdXIgPSB0b2stPmlucDsKLQkJCXJldHVybiBFT0Y7Ci0JCX0KLQl9Ci0JLypOT1RSRUFDSEVEKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKHRvay0+c3RhcnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNpemVfdCBzdGFydCA9IHRvay0+c3RhcnQgLSB0b2stPmJ1ZjsKKyAgICAgICAgICAgICAgICBzaXplX3Qgb2xkbGVuID0gdG9rLT5jdXIgLSB0b2stPmJ1ZjsKKyAgICAgICAgICAgICAgICBzaXplX3QgbmV3bGVuID0gb2xkbGVuICsgc3RybGVuKG5ld3Rvayk7CisgICAgICAgICAgICAgICAgY2hhciAqYnVmID0gdG9rLT5idWY7CisgICAgICAgICAgICAgICAgYnVmID0gKGNoYXIgKilQeU1lbV9SRUFMTE9DKGJ1ZiwgbmV3bGVuKzEpOworICAgICAgICAgICAgICAgIHRvay0+bGluZW5vKys7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUodG9rLT5idWYpOworICAgICAgICAgICAgICAgICAgICB0b2stPmJ1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUobmV3dG9rKTsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9rLT5idWYgPSBidWY7CisgICAgICAgICAgICAgICAgdG9rLT5jdXIgPSB0b2stPmJ1ZiArIG9sZGxlbjsKKyAgICAgICAgICAgICAgICB0b2stPmxpbmVfc3RhcnQgPSB0b2stPmN1cjsKKyAgICAgICAgICAgICAgICBzdHJjcHkodG9rLT5idWYgKyBvbGRsZW4sIG5ld3Rvayk7CisgICAgICAgICAgICAgICAgUHlNZW1fRlJFRShuZXd0b2spOworICAgICAgICAgICAgICAgIHRvay0+aW5wID0gdG9rLT5idWYgKyBuZXdsZW47CisgICAgICAgICAgICAgICAgdG9rLT5lbmQgPSB0b2stPmlucCArIDE7CisgICAgICAgICAgICAgICAgdG9rLT5zdGFydCA9IHRvay0+YnVmICsgc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0b2stPmxpbmVubysrOworICAgICAgICAgICAgICAgIGlmICh0b2stPmJ1ZiAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBQeU1lbV9GUkVFKHRvay0+YnVmKTsKKyAgICAgICAgICAgICAgICB0b2stPmJ1ZiA9IG5ld3RvazsKKyAgICAgICAgICAgICAgICB0b2stPmxpbmVfc3RhcnQgPSB0b2stPmJ1ZjsKKyAgICAgICAgICAgICAgICB0b2stPmN1ciA9IHRvay0+YnVmOworICAgICAgICAgICAgICAgIHRvay0+bGluZV9zdGFydCA9IHRvay0+YnVmOworICAgICAgICAgICAgICAgIHRvay0+aW5wID0gc3RyY2hyKHRvay0+YnVmLCAnXDAnKTsKKyAgICAgICAgICAgICAgICB0b2stPmVuZCA9IHRvay0+aW5wICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBkb25lID0gMDsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgY3VyID0gMDsKKyAgICAgICAgICAgIGNoYXIgKnB0OworICAgICAgICAgICAgaWYgKHRvay0+c3RhcnQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICh0b2stPmJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+YnVmID0gKGNoYXIgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5TWVtX01BTExPQyhCVUZTSVopOworICAgICAgICAgICAgICAgICAgICBpZiAodG9rLT5idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG9rLT5lbmQgPSB0b2stPmJ1ZiArIEJVRlNJWjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlY29kaW5nX2ZnZXRzKHRvay0+YnVmLCAoaW50KSh0b2stPmVuZCAtIHRvay0+YnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfRU9GOworICAgICAgICAgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfT0s7CisgICAgICAgICAgICAgICAgICAgIHRvay0+aW5wID0gc3RyY2hyKHRvay0+YnVmLCAnXDAnKTsKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRvay0+aW5wWy0xXSA9PSAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGN1ciA9IHRvay0+Y3VyIC0gdG9rLT5idWY7CisgICAgICAgICAgICAgICAgaWYgKGRlY29kaW5nX2Zlb2YodG9rKSkgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX0VPRjsKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvay0+bGluZW5vKys7CisgICAgICAgICAgICAvKiBSZWFkIHVudGlsICdcbicgb3IgRU9GICovCisgICAgICAgICAgICB3aGlsZSAoIWRvbmUpIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGN1cnN0YXJ0ID0gdG9rLT5zdGFydCA9PSBOVUxMID8gLTEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICB0b2stPnN0YXJ0IC0gdG9rLT5idWY7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBjdXJ2YWxpZCA9IHRvay0+aW5wIC0gdG9rLT5idWY7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdzaXplID0gY3VydmFsaWQgKyBCVUZTSVo7CisgICAgICAgICAgICAgICAgY2hhciAqbmV3YnVmID0gdG9rLT5idWY7CisgICAgICAgICAgICAgICAgbmV3YnVmID0gKGNoYXIgKilQeU1lbV9SRUFMTE9DKG5ld2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3c2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfTk9NRU07CisgICAgICAgICAgICAgICAgICAgIHRvay0+Y3VyID0gdG9rLT5pbnA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvay0+YnVmID0gbmV3YnVmOworICAgICAgICAgICAgICAgIHRvay0+aW5wID0gdG9rLT5idWYgKyBjdXJ2YWxpZDsKKyAgICAgICAgICAgICAgICB0b2stPmVuZCA9IHRvay0+YnVmICsgbmV3c2l6ZTsKKyAgICAgICAgICAgICAgICB0b2stPnN0YXJ0ID0gY3Vyc3RhcnQgPCAwID8gTlVMTCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLT5idWYgKyBjdXJzdGFydDsKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RpbmdfZmdldHModG9rLT5pbnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkodG9rLT5lbmQgLSB0b2stPmlucCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEJyZWFrIG91dCBlYXJseSBvbiBkZWNvZGluZworICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMsIGFzIHRvay0+YnVmIHdpbGwgYmUgTlVMTAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvay0+ZGVjb2RpbmdfZXJyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgICAgICAgICAgICAgICAvKiBMYXN0IGxpbmUgZG9lcyBub3QgZW5kIGluIFxuLAorICAgICAgICAgICAgICAgICAgICAgICBmYWtlIG9uZSAqLworICAgICAgICAgICAgICAgICAgICBzdHJjcHkodG9rLT5pbnAsICJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b2stPmlucCA9IHN0cmNocih0b2stPmlucCwgJ1wwJyk7CisgICAgICAgICAgICAgICAgZG9uZSA9IHRvay0+aW5wWy0xXSA9PSAnXG4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRvay0+YnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB0b2stPmN1ciA9IHRvay0+YnVmICsgY3VyOworICAgICAgICAgICAgICAgIHRvay0+bGluZV9zdGFydCA9IHRvay0+Y3VyOworICAgICAgICAgICAgICAgIC8qIHJlcGxhY2UgIlxyXG4iIHdpdGggIlxuIiAqLworICAgICAgICAgICAgICAgIC8qIEZvciBNYWMgbGVhdmUgdGhlIFxyLCBnaXZpbmcgYSBzeW50YXggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBwdCA9IHRvay0+aW5wIC0gMjsKKyAgICAgICAgICAgICAgICBpZiAocHQgPj0gdG9rLT5idWYgJiYgKnB0ID09ICdccicpIHsKKyAgICAgICAgICAgICAgICAgICAgKnB0KysgPSAnXG4nOworICAgICAgICAgICAgICAgICAgICAqcHQgPSAnXDAnOworICAgICAgICAgICAgICAgICAgICB0b2stPmlucCA9IHB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodG9rLT5kb25lICE9IEVfT0spIHsKKyAgICAgICAgICAgIGlmICh0b2stPnByb21wdCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJcbiIpOworICAgICAgICAgICAgdG9rLT5jdXIgPSB0b2stPmlucDsKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgIH0KKyAgICB9CisgICAgLypOT1RSRUFDSEVEKi8KIH0KIAogCkBAIC0xMDAzLDEyICsxMDAzLDEyIEBACiBzdGF0aWMgdm9pZAogdG9rX2JhY2t1cChyZWdpc3RlciBzdHJ1Y3QgdG9rX3N0YXRlICp0b2ssIHJlZ2lzdGVyIGludCBjKQogewotCWlmIChjICE9IEVPRikgewotCQlpZiAoLS10b2stPmN1ciA8IHRvay0+YnVmKQotCQkJUHlfRmF0YWxFcnJvcigidG9rX2JhY2t1cDogYmVnaW5uaW5nIG9mIGJ1ZmZlciIpOwotCQlpZiAoKnRvay0+Y3VyICE9IGMpCi0JCQkqdG9rLT5jdXIgPSBjOwotCX0KKyAgICBpZiAoYyAhPSBFT0YpIHsKKyAgICAgICAgaWYgKC0tdG9rLT5jdXIgPCB0b2stPmJ1ZikKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoInRva19iYWNrdXA6IGJlZ2lubmluZyBvZiBidWZmZXIiKTsKKyAgICAgICAgaWYgKCp0b2stPmN1ciAhPSBjKQorICAgICAgICAgICAgKnRvay0+Y3VyID0gYzsKKyAgICB9CiB9CiAKIApAQCAtMTAxNywxNzEgKzEwMTcsMTcxIEBACiBpbnQKIFB5VG9rZW5fT25lQ2hhcihpbnQgYykKIHsKLQlzd2l0Y2ggKGMpIHsKLQljYXNlICcoJzoJcmV0dXJuIExQQVI7Ci0JY2FzZSAnKSc6CXJldHVybiBSUEFSOwotCWNhc2UgJ1snOglyZXR1cm4gTFNRQjsKLQljYXNlICddJzoJcmV0dXJuIFJTUUI7Ci0JY2FzZSAnOic6CXJldHVybiBDT0xPTjsKLQljYXNlICcsJzoJcmV0dXJuIENPTU1BOwotCWNhc2UgJzsnOglyZXR1cm4gU0VNSTsKLQljYXNlICcrJzoJcmV0dXJuIFBMVVM7Ci0JY2FzZSAnLSc6CXJldHVybiBNSU5VUzsKLQljYXNlICcqJzoJcmV0dXJuIFNUQVI7Ci0JY2FzZSAnLyc6CXJldHVybiBTTEFTSDsKLQljYXNlICd8JzoJcmV0dXJuIFZCQVI7Ci0JY2FzZSAnJic6CXJldHVybiBBTVBFUjsKLQljYXNlICc8JzoJcmV0dXJuIExFU1M7Ci0JY2FzZSAnPic6CXJldHVybiBHUkVBVEVSOwotCWNhc2UgJz0nOglyZXR1cm4gRVFVQUw7Ci0JY2FzZSAnLic6CXJldHVybiBET1Q7Ci0JY2FzZSAnJSc6CXJldHVybiBQRVJDRU5UOwotCWNhc2UgJ2AnOglyZXR1cm4gQkFDS1FVT1RFOwotCWNhc2UgJ3snOglyZXR1cm4gTEJSQUNFOwotCWNhc2UgJ30nOglyZXR1cm4gUkJSQUNFOwotCWNhc2UgJ14nOglyZXR1cm4gQ0lSQ1VNRkxFWDsKLQljYXNlICd+JzoJcmV0dXJuIFRJTERFOwotCWNhc2UgJ0AnOiAgICAgICByZXR1cm4gQVQ7Ci0JZGVmYXVsdDoJcmV0dXJuIE9QOwotCX0KKyAgICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlICcoJzogICAgICAgICAgIHJldHVybiBMUEFSOworICAgIGNhc2UgJyknOiAgICAgICAgICAgcmV0dXJuIFJQQVI7CisgICAgY2FzZSAnWyc6ICAgICAgICAgICByZXR1cm4gTFNRQjsKKyAgICBjYXNlICddJzogICAgICAgICAgIHJldHVybiBSU1FCOworICAgIGNhc2UgJzonOiAgICAgICAgICAgcmV0dXJuIENPTE9OOworICAgIGNhc2UgJywnOiAgICAgICAgICAgcmV0dXJuIENPTU1BOworICAgIGNhc2UgJzsnOiAgICAgICAgICAgcmV0dXJuIFNFTUk7CisgICAgY2FzZSAnKyc6ICAgICAgICAgICByZXR1cm4gUExVUzsKKyAgICBjYXNlICctJzogICAgICAgICAgIHJldHVybiBNSU5VUzsKKyAgICBjYXNlICcqJzogICAgICAgICAgIHJldHVybiBTVEFSOworICAgIGNhc2UgJy8nOiAgICAgICAgICAgcmV0dXJuIFNMQVNIOworICAgIGNhc2UgJ3wnOiAgICAgICAgICAgcmV0dXJuIFZCQVI7CisgICAgY2FzZSAnJic6ICAgICAgICAgICByZXR1cm4gQU1QRVI7CisgICAgY2FzZSAnPCc6ICAgICAgICAgICByZXR1cm4gTEVTUzsKKyAgICBjYXNlICc+JzogICAgICAgICAgIHJldHVybiBHUkVBVEVSOworICAgIGNhc2UgJz0nOiAgICAgICAgICAgcmV0dXJuIEVRVUFMOworICAgIGNhc2UgJy4nOiAgICAgICAgICAgcmV0dXJuIERPVDsKKyAgICBjYXNlICclJzogICAgICAgICAgIHJldHVybiBQRVJDRU5UOworICAgIGNhc2UgJ2AnOiAgICAgICAgICAgcmV0dXJuIEJBQ0tRVU9URTsKKyAgICBjYXNlICd7JzogICAgICAgICAgIHJldHVybiBMQlJBQ0U7CisgICAgY2FzZSAnfSc6ICAgICAgICAgICByZXR1cm4gUkJSQUNFOworICAgIGNhc2UgJ14nOiAgICAgICAgICAgcmV0dXJuIENJUkNVTUZMRVg7CisgICAgY2FzZSAnfic6ICAgICAgICAgICByZXR1cm4gVElMREU7CisgICAgY2FzZSAnQCc6ICAgICAgIHJldHVybiBBVDsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBPUDsKKyAgICB9CiB9CiAKIAogaW50CiBQeVRva2VuX1R3b0NoYXJzKGludCBjMSwgaW50IGMyKQogewotCXN3aXRjaCAoYzEpIHsKLQljYXNlICc9JzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc9JzoJcmV0dXJuIEVRRVFVQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnISc6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPSc6CXJldHVybiBOT1RFUVVBTDsKLQkJfQotCQlicmVhazsKLQljYXNlICc8JzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc+JzoJcmV0dXJuIE5PVEVRVUFMOwotCQljYXNlICc9JzoJcmV0dXJuIExFU1NFUVVBTDsKLQkJY2FzZSAnPCc6CXJldHVybiBMRUZUU0hJRlQ7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnPic6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPSc6CXJldHVybiBHUkVBVEVSRVFVQUw7Ci0JCWNhc2UgJz4nOglyZXR1cm4gUklHSFRTSElGVDsKLQkJfQotCQlicmVhazsKLQljYXNlICcrJzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc9JzoJcmV0dXJuIFBMVVNFUVVBTDsKLQkJfQotCQlicmVhazsKLQljYXNlICctJzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc9JzoJcmV0dXJuIE1JTkVRVUFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJyonOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJyonOglyZXR1cm4gRE9VQkxFU1RBUjsKLQkJY2FzZSAnPSc6CXJldHVybiBTVEFSRVFVQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnLyc6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnLyc6CXJldHVybiBET1VCTEVTTEFTSDsKLQkJY2FzZSAnPSc6CXJldHVybiBTTEFTSEVRVUFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJ3wnOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJz0nOglyZXR1cm4gVkJBUkVRVUFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJyUnOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJz0nOglyZXR1cm4gUEVSQ0VOVEVRVUFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJyYnOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJz0nOglyZXR1cm4gQU1QRVJFUVVBTDsKLQkJfQotCQlicmVhazsKLQljYXNlICdeJzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc9JzoJcmV0dXJuIENJUkNVTUZMRVhFUVVBTDsKLQkJfQotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE9QOworICAgIHN3aXRjaCAoYzEpIHsKKyAgICBjYXNlICc9JzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gRVFFUVVBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICchJzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gTk9URVFVQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPic6ICAgICAgICAgICAgICAgcmV0dXJuIE5PVEVRVUFMOworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gTEVTU0VRVUFMOworICAgICAgICBjYXNlICc8JzogICAgICAgICAgICAgICByZXR1cm4gTEVGVFNISUZUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBHUkVBVEVSRVFVQUw7CisgICAgICAgIGNhc2UgJz4nOiAgICAgICAgICAgICAgIHJldHVybiBSSUdIVFNISUZUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJysnOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBQTFVTRVFVQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnLSc6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIE1JTkVRVUFMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJyonOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJyonOiAgICAgICAgICAgICAgIHJldHVybiBET1VCTEVTVEFSOworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gU1RBUkVRVUFMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJy8nOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJy8nOiAgICAgICAgICAgICAgIHJldHVybiBET1VCTEVTTEFTSDsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIFNMQVNIRVFVQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnfCc6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIFZCQVJFUVVBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICclJzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gUEVSQ0VOVEVRVUFMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJyYnOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBBTVBFUkVRVUFMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ14nOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBDSVJDVU1GTEVYRVFVQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBPUDsKIH0KIAogaW50CiBQeVRva2VuX1RocmVlQ2hhcnMoaW50IGMxLCBpbnQgYzIsIGludCBjMykKIHsKLQlzd2l0Y2ggKGMxKSB7Ci0JY2FzZSAnPCc6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPCc6Ci0JCQlzd2l0Y2ggKGMzKSB7Ci0JCQljYXNlICc9JzoKLQkJCQlyZXR1cm4gTEVGVFNISUZURVFVQUw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlICc+JzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc+JzoKLQkJCXN3aXRjaCAoYzMpIHsKLQkJCWNhc2UgJz0nOgotCQkJCXJldHVybiBSSUdIVFNISUZURVFVQUw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlICcqJzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICcqJzoKLQkJCXN3aXRjaCAoYzMpIHsKLQkJCWNhc2UgJz0nOgotCQkJCXJldHVybiBET1VCTEVTVEFSRVFVQUw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlICcvJzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICcvJzoKLQkJCXN3aXRjaCAoYzMpIHsKLQkJCWNhc2UgJz0nOgotCQkJCXJldHVybiBET1VCTEVTTEFTSEVRVUFMOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCXJldHVybiBPUDsKKyAgICBzd2l0Y2ggKGMxKSB7CisgICAgY2FzZSAnPCc6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgICBzd2l0Y2ggKGMzKSB7CisgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gTEVGVFNISUZURVFVQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgIHN3aXRjaCAoYzMpIHsKKyAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICAgIHJldHVybiBSSUdIVFNISUZURVFVQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICcqJzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAgIHN3aXRjaCAoYzMpIHsKKyAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICAgIHJldHVybiBET1VCTEVTVEFSRVFVQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICcvJzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgIHN3aXRjaCAoYzMpIHsKKyAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICAgIHJldHVybiBET1VCTEVTTEFTSEVRVUFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBPUDsKIH0KIAogc3RhdGljIGludAogaW5kZW50ZXJyb3Ioc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewotCWlmICh0b2stPmFsdGVycm9yKSB7Ci0JCXRvay0+ZG9uZSA9IEVfVEFCU1BBQ0U7Ci0JCXRvay0+Y3VyID0gdG9rLT5pbnA7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAodG9rLT5hbHR3YXJuaW5nKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCIlczogaW5jb25zaXN0ZW50IHVzZSBvZiB0YWJzIGFuZCBzcGFjZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBpbmRlbnRhdGlvblxuIiwgdG9rLT5maWxlbmFtZSk7Ci0JCXRvay0+YWx0d2FybmluZyA9IDA7Ci0JfQotCXJldHVybiAwOworICAgIGlmICh0b2stPmFsdGVycm9yKSB7CisgICAgICAgIHRvay0+ZG9uZSA9IEVfVEFCU1BBQ0U7CisgICAgICAgIHRvay0+Y3VyID0gdG9rLT5pbnA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAodG9rLT5hbHR3YXJuaW5nKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIlczogaW5jb25zaXN0ZW50IHVzZSBvZiB0YWJzIGFuZCBzcGFjZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gaW5kZW50YXRpb25cbiIsIHRvay0+ZmlsZW5hbWUpOworICAgICAgICB0b2stPmFsdHdhcm5pbmcgPSAwOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogR2V0IG5leHQgdG9rZW4sIGFmdGVyIHNwYWNlIHN0cmlwcGluZyBldGMuICovCkBAIC0xMTg5LDQ2NiArMTE4OSw0NjYgQEAKIHN0YXRpYyBpbnQKIHRva19nZXQocmVnaXN0ZXIgc3RydWN0IHRva19zdGF0ZSAqdG9rLCBjaGFyICoqcF9zdGFydCwgY2hhciAqKnBfZW5kKQogewotCXJlZ2lzdGVyIGludCBjOwotCWludCBibGFua2xpbmU7CisgICAgcmVnaXN0ZXIgaW50IGM7CisgICAgaW50IGJsYW5rbGluZTsKIAotCSpwX3N0YXJ0ID0gKnBfZW5kID0gTlVMTDsKKyAgICAqcF9zdGFydCA9ICpwX2VuZCA9IE5VTEw7CiAgIG5leHRsaW5lOgotCXRvay0+c3RhcnQgPSBOVUxMOwotCWJsYW5rbGluZSA9IDA7CisgICAgdG9rLT5zdGFydCA9IE5VTEw7CisgICAgYmxhbmtsaW5lID0gMDsKIAotCS8qIEdldCBpbmRlbnRhdGlvbiBsZXZlbCAqLwotCWlmICh0b2stPmF0Ym9sKSB7Ci0JCXJlZ2lzdGVyIGludCBjb2wgPSAwOwotCQlyZWdpc3RlciBpbnQgYWx0Y29sID0gMDsKLQkJdG9rLT5hdGJvbCA9IDA7Ci0JCWZvciAoOzspIHsKLQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCWlmIChjID09ICcgJykKLQkJCQljb2wrKywgYWx0Y29sKys7Ci0JCQllbHNlIGlmIChjID09ICdcdCcpIHsKLQkJCQljb2wgPSAoY29sL3Rvay0+dGFic2l6ZSArIDEpICogdG9rLT50YWJzaXplOwotCQkJCWFsdGNvbCA9IChhbHRjb2wvdG9rLT5hbHR0YWJzaXplICsgMSkKLQkJCQkJKiB0b2stPmFsdHRhYnNpemU7Ci0JCQl9Ci0JCQllbHNlIGlmIChjID09ICdcMDE0JykgLyogQ29udHJvbC1MIChmb3JtZmVlZCkgKi8KLQkJCQljb2wgPSBhbHRjb2wgPSAwOyAvKiBGb3IgRW1hY3MgdXNlcnMgKi8KLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJfQotCQl0b2tfYmFja3VwKHRvaywgYyk7Ci0JCWlmIChjID09ICcjJyB8fCBjID09ICdcbicpIHsKLQkJCS8qIExpbmVzIHdpdGggb25seSB3aGl0ZXNwYWNlIGFuZC9vciBjb21tZW50cwotCQkJICAgc2hvdWxkbid0IGFmZmVjdCB0aGUgaW5kZW50YXRpb24gYW5kIGFyZQotCQkJICAgbm90IHBhc3NlZCB0byB0aGUgcGFyc2VyIGFzIE5FV0xJTkUgdG9rZW5zLAotCQkJICAgZXhjZXB0ICp0b3RhbGx5KiBlbXB0eSBsaW5lcyBpbiBpbnRlcmFjdGl2ZQotCQkJICAgbW9kZSwgd2hpY2ggc2lnbmFsIHRoZSBlbmQgb2YgYSBjb21tYW5kIGdyb3VwLiAqLwotCQkJaWYgKGNvbCA9PSAwICYmIGMgPT0gJ1xuJyAmJiB0b2stPnByb21wdCAhPSBOVUxMKQotCQkJCWJsYW5rbGluZSA9IDA7IC8qIExldCBpdCB0aHJvdWdoICovCi0JCQllbHNlCi0JCQkJYmxhbmtsaW5lID0gMTsgLyogSWdub3JlIGNvbXBsZXRlbHkgKi8KLQkJCS8qIFdlIGNhbid0IGp1bXAgYmFjayByaWdodCBoZXJlIHNpbmNlIHdlIHN0aWxsCi0JCQkgICBtYXkgbmVlZCB0byBza2lwIHRvIHRoZSBlbmQgb2YgYSBjb21tZW50ICovCi0JCX0KLQkJaWYgKCFibGFua2xpbmUgJiYgdG9rLT5sZXZlbCA9PSAwKSB7Ci0JCQlpZiAoY29sID09IHRvay0+aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7Ci0JCQkJLyogTm8gY2hhbmdlICovCi0JCQkJaWYgKGFsdGNvbCAhPSB0b2stPmFsdGluZHN0YWNrW3Rvay0+aW5kZW50XSkgewotCQkJCQlpZiAoaW5kZW50ZXJyb3IodG9rKSkKLQkJCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGNvbCA+IHRvay0+aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7Ci0JCQkJLyogSW5kZW50IC0tIGFsd2F5cyBvbmUgKi8KLQkJCQlpZiAodG9rLT5pbmRlbnQrMSA+PSBNQVhJTkRFTlQpIHsKLQkJCQkJdG9rLT5kb25lID0gRV9UT09ERUVQOwotCQkJCQl0b2stPmN1ciA9IHRvay0+aW5wOwotCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQl9Ci0JCQkJaWYgKGFsdGNvbCA8PSB0b2stPmFsdGluZHN0YWNrW3Rvay0+aW5kZW50XSkgewotCQkJCQlpZiAoaW5kZW50ZXJyb3IodG9rKSkKLQkJCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCX0KLQkJCQl0b2stPnBlbmRpbisrOwotCQkJCXRvay0+aW5kc3RhY2tbKyt0b2stPmluZGVudF0gPSBjb2w7Ci0JCQkJdG9rLT5hbHRpbmRzdGFja1t0b2stPmluZGVudF0gPSBhbHRjb2w7Ci0JCQl9Ci0JCQllbHNlIC8qIGNvbCA8IHRvay0+aW5kc3RhY2tbdG9rLT5pbmRlbnRdICovIHsKLQkJCQkvKiBEZWRlbnQgLS0gYW55IG51bWJlciwgbXVzdCBiZSBjb25zaXN0ZW50ICovCi0JCQkJd2hpbGUgKHRvay0+aW5kZW50ID4gMCAmJgotCQkJCQljb2wgPCB0b2stPmluZHN0YWNrW3Rvay0+aW5kZW50XSkgewotCQkJCQl0b2stPnBlbmRpbi0tOwotCQkJCQl0b2stPmluZGVudC0tOwotCQkJCX0KLQkJCQlpZiAoY29sICE9IHRvay0+aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfREVERU5UOwotCQkJCQl0b2stPmN1ciA9IHRvay0+aW5wOwotCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQl9Ci0JCQkJaWYgKGFsdGNvbCAhPSB0b2stPmFsdGluZHN0YWNrW3Rvay0+aW5kZW50XSkgewotCQkJCQlpZiAoaW5kZW50ZXJyb3IodG9rKSkKLQkJCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAvKiBHZXQgaW5kZW50YXRpb24gbGV2ZWwgKi8KKyAgICBpZiAodG9rLT5hdGJvbCkgeworICAgICAgICByZWdpc3RlciBpbnQgY29sID0gMDsKKyAgICAgICAgcmVnaXN0ZXIgaW50IGFsdGNvbCA9IDA7CisgICAgICAgIHRvay0+YXRib2wgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICBpZiAoYyA9PSAnICcpCisgICAgICAgICAgICAgICAgY29sKyssIGFsdGNvbCsrOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgY29sID0gKGNvbC90b2stPnRhYnNpemUgKyAxKSAqIHRvay0+dGFic2l6ZTsKKyAgICAgICAgICAgICAgICBhbHRjb2wgPSAoYWx0Y29sL3Rvay0+YWx0dGFic2l6ZSArIDEpCisgICAgICAgICAgICAgICAgICAgICogdG9rLT5hbHR0YWJzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXDAxNCcpIC8qIENvbnRyb2wtTCAoZm9ybWZlZWQpICovCisgICAgICAgICAgICAgICAgY29sID0gYWx0Y29sID0gMDsgLyogRm9yIEVtYWNzIHVzZXJzICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICBpZiAoYyA9PSAnIycgfHwgYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAvKiBMaW5lcyB3aXRoIG9ubHkgd2hpdGVzcGFjZSBhbmQvb3IgY29tbWVudHMKKyAgICAgICAgICAgICAgIHNob3VsZG4ndCBhZmZlY3QgdGhlIGluZGVudGF0aW9uIGFuZCBhcmUKKyAgICAgICAgICAgICAgIG5vdCBwYXNzZWQgdG8gdGhlIHBhcnNlciBhcyBORVdMSU5FIHRva2VucywKKyAgICAgICAgICAgICAgIGV4Y2VwdCAqdG90YWxseSogZW1wdHkgbGluZXMgaW4gaW50ZXJhY3RpdmUKKyAgICAgICAgICAgICAgIG1vZGUsIHdoaWNoIHNpZ25hbCB0aGUgZW5kIG9mIGEgY29tbWFuZCBncm91cC4gKi8KKyAgICAgICAgICAgIGlmIChjb2wgPT0gMCAmJiBjID09ICdcbicgJiYgdG9rLT5wcm9tcHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBibGFua2xpbmUgPSAwOyAvKiBMZXQgaXQgdGhyb3VnaCAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJsYW5rbGluZSA9IDE7IC8qIElnbm9yZSBjb21wbGV0ZWx5ICovCisgICAgICAgICAgICAvKiBXZSBjYW4ndCBqdW1wIGJhY2sgcmlnaHQgaGVyZSBzaW5jZSB3ZSBzdGlsbAorICAgICAgICAgICAgICAgbWF5IG5lZWQgdG8gc2tpcCB0byB0aGUgZW5kIG9mIGEgY29tbWVudCAqLworICAgICAgICB9CisgICAgICAgIGlmICghYmxhbmtsaW5lICYmIHRvay0+bGV2ZWwgPT0gMCkgeworICAgICAgICAgICAgaWYgKGNvbCA9PSB0b2stPmluZHN0YWNrW3Rvay0+aW5kZW50XSkgeworICAgICAgICAgICAgICAgIC8qIE5vIGNoYW5nZSAqLworICAgICAgICAgICAgICAgIGlmIChhbHRjb2wgIT0gdG9rLT5hbHRpbmRzdGFja1t0b2stPmluZGVudF0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGVudGVycm9yKHRvaykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjb2wgPiB0b2stPmluZHN0YWNrW3Rvay0+aW5kZW50XSkgeworICAgICAgICAgICAgICAgIC8qIEluZGVudCAtLSBhbHdheXMgb25lICovCisgICAgICAgICAgICAgICAgaWYgKHRvay0+aW5kZW50KzEgPj0gTUFYSU5ERU5UKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfVE9PREVFUDsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5jdXIgPSB0b2stPmlucDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhbHRjb2wgPD0gdG9rLT5hbHRpbmRzdGFja1t0b2stPmluZGVudF0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGVudGVycm9yKHRvaykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9rLT5wZW5kaW4rKzsKKyAgICAgICAgICAgICAgICB0b2stPmluZHN0YWNrWysrdG9rLT5pbmRlbnRdID0gY29sOworICAgICAgICAgICAgICAgIHRvay0+YWx0aW5kc3RhY2tbdG9rLT5pbmRlbnRdID0gYWx0Y29sOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKiBjb2wgPCB0b2stPmluZHN0YWNrW3Rvay0+aW5kZW50XSAqLyB7CisgICAgICAgICAgICAgICAgLyogRGVkZW50IC0tIGFueSBudW1iZXIsIG11c3QgYmUgY29uc2lzdGVudCAqLworICAgICAgICAgICAgICAgIHdoaWxlICh0b2stPmluZGVudCA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgY29sIDwgdG9rLT5pbmRzdGFja1t0b2stPmluZGVudF0pIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5wZW5kaW4tLTsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5pbmRlbnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbCAhPSB0b2stPmluZHN0YWNrW3Rvay0+aW5kZW50XSkgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX0RFREVOVDsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5jdXIgPSB0b2stPmlucDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhbHRjb2wgIT0gdG9rLT5hbHRpbmRzdGFja1t0b2stPmluZGVudF0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGVudGVycm9yKHRvaykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQl0b2stPnN0YXJ0ID0gdG9rLT5jdXI7CisgICAgdG9rLT5zdGFydCA9IHRvay0+Y3VyOwogCi0JLyogUmV0dXJuIHBlbmRpbmcgaW5kZW50cy9kZWRlbnRzICovCi0JaWYgKHRvay0+cGVuZGluICE9IDApIHsKLQkJaWYgKHRvay0+cGVuZGluIDwgMCkgewotCQkJdG9rLT5wZW5kaW4rKzsKLQkJCXJldHVybiBERURFTlQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0b2stPnBlbmRpbi0tOwotCQkJcmV0dXJuIElOREVOVDsKLQkJfQotCX0KKyAgICAvKiBSZXR1cm4gcGVuZGluZyBpbmRlbnRzL2RlZGVudHMgKi8KKyAgICBpZiAodG9rLT5wZW5kaW4gIT0gMCkgeworICAgICAgICBpZiAodG9rLT5wZW5kaW4gPCAwKSB7CisgICAgICAgICAgICB0b2stPnBlbmRpbisrOworICAgICAgICAgICAgcmV0dXJuIERFREVOVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRvay0+cGVuZGluLS07CisgICAgICAgICAgICByZXR1cm4gSU5ERU5UOworICAgICAgICB9CisgICAgfQogCiAgYWdhaW46Ci0JdG9rLT5zdGFydCA9IE5VTEw7Ci0JLyogU2tpcCBzcGFjZXMgKi8KLQlkbyB7Ci0JCWMgPSB0b2tfbmV4dGModG9rKTsKLQl9IHdoaWxlIChjID09ICcgJyB8fCBjID09ICdcdCcgfHwgYyA9PSAnXDAxNCcpOworICAgIHRvay0+c3RhcnQgPSBOVUxMOworICAgIC8qIFNraXAgc3BhY2VzICovCisgICAgZG8geworICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgfSB3aGlsZSAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1wwMTQnKTsKIAotCS8qIFNldCBzdGFydCBvZiBjdXJyZW50IHRva2VuICovCi0JdG9rLT5zdGFydCA9IHRvay0+Y3VyIC0gMTsKKyAgICAvKiBTZXQgc3RhcnQgb2YgY3VycmVudCB0b2tlbiAqLworICAgIHRvay0+c3RhcnQgPSB0b2stPmN1ciAtIDE7CiAKLQkvKiBTa2lwIGNvbW1lbnQsIHdoaWxlIGxvb2tpbmcgZm9yIHRhYi1zZXR0aW5nIG1hZ2ljICovCi0JaWYgKGMgPT0gJyMnKSB7Ci0JCXN0YXRpYyBjaGFyICp0YWJmb3Jtc1tdID0gewotCQkJInRhYi13aWR0aDoiLAkJLyogRW1hY3MgKi8KLQkJCSI6dGFic3RvcD0iLAkJLyogdmltLCBmdWxsIGZvcm0gKi8KLQkJCSI6dHM9IiwJCQkvKiB2aW0sIGFiYnJldmlhdGVkIGZvcm0gKi8KLQkJCSJzZXQgdGFic2l6ZT0iLAkJLyogd2lsbCB2aSBuZXZlciBkaWU/ICovCi0JCS8qIG1vcmUgdGVtcGxhdGVzIGNhbiBiZSBhZGRlZCBoZXJlIHRvIHN1cHBvcnQgb3RoZXIgZWRpdG9ycyAqLwotCQl9OwotCQljaGFyIGNidWZbODBdOwotCQljaGFyICp0cCwgKipjcDsKLQkJdHAgPSBjYnVmOwotCQlkbyB7Ci0JCQkqdHArKyA9IGMgPSB0b2tfbmV4dGModG9rKTsKLQkJfSB3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nICYmCi0JCQkgKHNpemVfdCkodHAgLSBjYnVmICsgMSkgPCBzaXplb2YoY2J1ZikpOwotCQkqdHAgPSAnXDAnOwotCQlmb3IgKGNwID0gdGFiZm9ybXM7Ci0JCSAgICAgY3AgPCB0YWJmb3JtcyArIHNpemVvZih0YWJmb3Jtcykvc2l6ZW9mKHRhYmZvcm1zWzBdKTsKLQkJICAgICBjcCsrKSB7Ci0JCQlpZiAoKHRwID0gc3Ryc3RyKGNidWYsICpjcCkpKSB7Ci0JCQkJaW50IG5ld3NpemUgPSBhdG9pKHRwICsgc3RybGVuKCpjcCkpOworICAgIC8qIFNraXAgY29tbWVudCwgd2hpbGUgbG9va2luZyBmb3IgdGFiLXNldHRpbmcgbWFnaWMgKi8KKyAgICBpZiAoYyA9PSAnIycpIHsKKyAgICAgICAgc3RhdGljIGNoYXIgKnRhYmZvcm1zW10gPSB7CisgICAgICAgICAgICAidGFiLXdpZHRoOiIsICAgICAgICAgICAgICAgICAgICAgICAvKiBFbWFjcyAqLworICAgICAgICAgICAgIjp0YWJzdG9wPSIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdmltLCBmdWxsIGZvcm0gKi8KKyAgICAgICAgICAgICI6dHM9IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpbSwgYWJicmV2aWF0ZWQgZm9ybSAqLworICAgICAgICAgICAgInNldCB0YWJzaXplPSIsICAgICAgICAgICAgICAgICAgICAgLyogd2lsbCB2aSBuZXZlciBkaWU/ICovCisgICAgICAgIC8qIG1vcmUgdGVtcGxhdGVzIGNhbiBiZSBhZGRlZCBoZXJlIHRvIHN1cHBvcnQgb3RoZXIgZWRpdG9ycyAqLworICAgICAgICB9OworICAgICAgICBjaGFyIGNidWZbODBdOworICAgICAgICBjaGFyICp0cCwgKipjcDsKKyAgICAgICAgdHAgPSBjYnVmOworICAgICAgICBkbyB7CisgICAgICAgICAgICAqdHArKyA9IGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgfSB3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nICYmCisgICAgICAgICAgICAgICAgIChzaXplX3QpKHRwIC0gY2J1ZiArIDEpIDwgc2l6ZW9mKGNidWYpKTsKKyAgICAgICAgKnRwID0gJ1wwJzsKKyAgICAgICAgZm9yIChjcCA9IHRhYmZvcm1zOworICAgICAgICAgICAgIGNwIDwgdGFiZm9ybXMgKyBzaXplb2YodGFiZm9ybXMpL3NpemVvZih0YWJmb3Jtc1swXSk7CisgICAgICAgICAgICAgY3ArKykgeworICAgICAgICAgICAgaWYgKCh0cCA9IHN0cnN0cihjYnVmLCAqY3ApKSkgeworICAgICAgICAgICAgICAgIGludCBuZXdzaXplID0gYXRvaSh0cCArIHN0cmxlbigqY3ApKTsKIAotCQkJCWlmIChuZXdzaXplID49IDEgJiYgbmV3c2l6ZSA8PSA0MCkgewotCQkJCQl0b2stPnRhYnNpemUgPSBuZXdzaXplOwotCQkJCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQkJCSAgICBQeVN5c19Xcml0ZVN0ZGVycigKLQkJCQkJCSJUYWIgc2l6ZSBzZXQgdG8gJWRcbiIsCi0JCQkJCQluZXdzaXplKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gJ1xuJykKLQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQl9CisgICAgICAgICAgICAgICAgaWYgKG5ld3NpemUgPj0gMSAmJiBuZXdzaXplIDw9IDQwKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+dGFic2l6ZSA9IG5ld3NpemU7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRhYiBzaXplIHNldCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgIH0KIAotCS8qIENoZWNrIGZvciBFT0YgYW5kIGVycm9ycyBub3cgKi8KLQlpZiAoYyA9PSBFT0YpIHsKLQkJcmV0dXJuIHRvay0+ZG9uZSA9PSBFX0VPRiA/IEVORE1BUktFUiA6IEVSUk9SVE9LRU47Ci0JfQorICAgIC8qIENoZWNrIGZvciBFT0YgYW5kIGVycm9ycyBub3cgKi8KKyAgICBpZiAoYyA9PSBFT0YpIHsKKyAgICAgICAgcmV0dXJuIHRvay0+ZG9uZSA9PSBFX0VPRiA/IEVORE1BUktFUiA6IEVSUk9SVE9LRU47CisgICAgfQogCi0JLyogSWRlbnRpZmllciAobW9zdCBmcmVxdWVudCB0b2tlbiEpICovCi0JaWYgKFB5X0lTQUxQSEEoYykgfHwgYyA9PSAnXycpIHsKLQkJLyogUHJvY2VzcyByIiIsIHUiIiBhbmQgdXIiIiAqLwotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSAnYic6Ci0JCWNhc2UgJ0InOgotCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJaWYgKGMgPT0gJ3InIHx8IGMgPT0gJ1InKQotCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCWlmIChjID09ICciJyB8fCBjID09ICdcJycpCi0JCQkJZ290byBsZXR0ZXJfcXVvdGU7Ci0JCQlicmVhazsKLQkJY2FzZSAncic6Ci0JCWNhc2UgJ1InOgotCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykKLQkJCQlnb3RvIGxldHRlcl9xdW90ZTsKLQkJCWJyZWFrOwotCQljYXNlICd1JzoKLQkJY2FzZSAnVSc6Ci0JCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQlpZiAoYyA9PSAncicgfHwgYyA9PSAnUicpCi0JCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykKLQkJCQlnb3RvIGxldHRlcl9xdW90ZTsKLQkJCWJyZWFrOwotCQl9Ci0JCXdoaWxlIChQeV9JU0FMTlVNKGMpIHx8IGMgPT0gJ18nKSB7Ci0JCQljID0gdG9rX25leHRjKHRvayk7Ci0JCX0KLQkJdG9rX2JhY2t1cCh0b2ssIGMpOwotCQkqcF9zdGFydCA9IHRvay0+c3RhcnQ7Ci0JCSpwX2VuZCA9IHRvay0+Y3VyOwotCQlyZXR1cm4gTkFNRTsKLQl9CisgICAgLyogSWRlbnRpZmllciAobW9zdCBmcmVxdWVudCB0b2tlbiEpICovCisgICAgaWYgKFB5X0lTQUxQSEEoYykgfHwgYyA9PSAnXycpIHsKKyAgICAgICAgLyogUHJvY2VzcyByIiIsIHUiIiBhbmQgdXIiIiAqLworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgaWYgKGMgPT0gJ3InIHx8IGMgPT0gJ1InKQorICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgIGlmIChjID09ICciJyB8fCBjID09ICdcJycpCisgICAgICAgICAgICAgICAgZ290byBsZXR0ZXJfcXVvdGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncic6CisgICAgICAgIGNhc2UgJ1InOgorICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykKKyAgICAgICAgICAgICAgICBnb3RvIGxldHRlcl9xdW90ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgY2FzZSAnVSc6CisgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICBpZiAoYyA9PSAncicgfHwgYyA9PSAnUicpCisgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykKKyAgICAgICAgICAgICAgICBnb3RvIGxldHRlcl9xdW90ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChQeV9JU0FMTlVNKGMpIHx8IGMgPT0gJ18nKSB7CisgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgIH0KKyAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICAqcF9zdGFydCA9IHRvay0+c3RhcnQ7CisgICAgICAgICpwX2VuZCA9IHRvay0+Y3VyOworICAgICAgICByZXR1cm4gTkFNRTsKKyAgICB9CiAKLQkvKiBOZXdsaW5lICovCi0JaWYgKGMgPT0gJ1xuJykgewotCQl0b2stPmF0Ym9sID0gMTsKLQkJaWYgKGJsYW5rbGluZSB8fCB0b2stPmxldmVsID4gMCkKLQkJCWdvdG8gbmV4dGxpbmU7Ci0JCSpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKLQkJKnBfZW5kID0gdG9rLT5jdXIgLSAxOyAvKiBMZWF2ZSAnXG4nIG91dCBvZiB0aGUgc3RyaW5nICovCi0gICAgICAgICAgICAgICAgdG9rLT5jb250X2xpbmUgPSAwOwotCQlyZXR1cm4gTkVXTElORTsKLQl9CisgICAgLyogTmV3bGluZSAqLworICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgdG9rLT5hdGJvbCA9IDE7CisgICAgICAgIGlmIChibGFua2xpbmUgfHwgdG9rLT5sZXZlbCA+IDApCisgICAgICAgICAgICBnb3RvIG5leHRsaW5lOworICAgICAgICAqcF9zdGFydCA9IHRvay0+c3RhcnQ7CisgICAgICAgICpwX2VuZCA9IHRvay0+Y3VyIC0gMTsgLyogTGVhdmUgJ1xuJyBvdXQgb2YgdGhlIHN0cmluZyAqLworICAgICAgICB0b2stPmNvbnRfbGluZSA9IDA7CisgICAgICAgIHJldHVybiBORVdMSU5FOworICAgIH0KIAotCS8qIFBlcmlvZCBvciBudW1iZXIgc3RhcnRpbmcgd2l0aCBwZXJpb2Q/ICovCi0JaWYgKGMgPT0gJy4nKSB7Ci0JCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJaWYgKGlzZGlnaXQoYykpIHsKLQkJCWdvdG8gZnJhY3Rpb247Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0b2tfYmFja3VwKHRvaywgYyk7Ci0JCQkqcF9zdGFydCA9IHRvay0+c3RhcnQ7Ci0JCQkqcF9lbmQgPSB0b2stPmN1cjsKLQkJCXJldHVybiBET1Q7Ci0JCX0KLQl9CisgICAgLyogUGVyaW9kIG9yIG51bWJlciBzdGFydGluZyB3aXRoIHBlcmlvZD8gKi8KKyAgICBpZiAoYyA9PSAnLicpIHsKKyAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICBpZiAoaXNkaWdpdChjKSkgeworICAgICAgICAgICAgZ290byBmcmFjdGlvbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRva19iYWNrdXAodG9rLCBjKTsKKyAgICAgICAgICAgICpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKKyAgICAgICAgICAgICpwX2VuZCA9IHRvay0+Y3VyOworICAgICAgICAgICAgcmV0dXJuIERPVDsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIE51bWJlciAqLwotCWlmIChpc2RpZ2l0KGMpKSB7Ci0JCWlmIChjID09ICcwJykgewotCQkJLyogSGV4LCBvY3RhbCBvciBiaW5hcnkgLS0gbWF5YmUuICovCi0JCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQlpZiAoYyA9PSAnLicpCi0JCQkJZ290byBmcmFjdGlvbjsKKyAgICAvKiBOdW1iZXIgKi8KKyAgICBpZiAoaXNkaWdpdChjKSkgeworICAgICAgICBpZiAoYyA9PSAnMCcpIHsKKyAgICAgICAgICAgIC8qIEhleCwgb2N0YWwgb3IgYmluYXJ5IC0tIG1heWJlLiAqLworICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgaWYgKGMgPT0gJy4nKQorICAgICAgICAgICAgICAgIGdvdG8gZnJhY3Rpb247CiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCQkJaWYgKGMgPT0gJ2onIHx8IGMgPT0gJ0onKQotCQkJCWdvdG8gaW1hZ2luYXJ5OworICAgICAgICAgICAgaWYgKGMgPT0gJ2onIHx8IGMgPT0gJ0onKQorICAgICAgICAgICAgICAgIGdvdG8gaW1hZ2luYXJ5OwogI2VuZGlmCi0JCQlpZiAoYyA9PSAneCcgfHwgYyA9PSAnWCcpIHsKKyAgICAgICAgICAgIGlmIChjID09ICd4JyB8fCBjID09ICdYJykgewogCi0JCQkJLyogSGV4ICovCi0JCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCWlmICghaXN4ZGlnaXQoYykpIHsKLQkJCQkJdG9rLT5kb25lID0gRV9UT0tFTjsKLQkJCQkJdG9rX2JhY2t1cCh0b2ssIGMpOwotCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQl9Ci0JCQkJZG8gewotCQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJfSB3aGlsZSAoaXN4ZGlnaXQoYykpOwotCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnbycgfHwgYyA9PSAnTycpIHsKLQkJCQkvKiBPY3RhbCAqLwotCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQlpZiAoYyA8ICcwJyB8fCBjID49ICc4JykgewotCQkJCQl0b2stPmRvbmUgPSBFX1RPS0VOOwotCQkJCQl0b2tfYmFja3VwKHRvaywgYyk7Ci0JCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCX0KLQkJCQlkbyB7Ci0JCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQl9IHdoaWxlICgnMCcgPD0gYyAmJiBjIDwgJzgnKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGMgPT0gJ2InIHx8IGMgPT0gJ0InKSB7Ci0JCQkJLyogQmluYXJ5ICovCi0JCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCWlmIChjICE9ICcwJyAmJiBjICE9ICcxJykgewotCQkJCQl0b2stPmRvbmUgPSBFX1RPS0VOOwotCQkJCQl0b2tfYmFja3VwKHRvaywgYyk7Ci0JCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCX0KLQkJCQlkbyB7Ci0JCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQl9IHdoaWxlIChjID09ICcwJyB8fCBjID09ICcxJyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgZm91bmRfZGVjaW1hbCA9IDA7Ci0JCQkJLyogT2N0YWw7IGMgaXMgZmlyc3QgY2hhciBvZiBpdCAqLwotCQkJCS8qIFRoZXJlJ3Mgbm8gJ2lzb2N0ZGlnaXQnIG1hY3JvLCBzaWdoICovCi0JCQkJd2hpbGUgKCcwJyA8PSBjICYmIGMgPCAnOCcpIHsKLQkJCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCX0KLQkJCQlpZiAoaXNkaWdpdChjKSkgewotCQkJCQlmb3VuZF9kZWNpbWFsID0gMTsKLQkJCQkJZG8gewotCQkJCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCQl9IHdoaWxlIChpc2RpZ2l0KGMpKTsKLQkJCQl9Ci0JCQkJaWYgKGMgPT0gJy4nKQotCQkJCQlnb3RvIGZyYWN0aW9uOwotCQkJCWVsc2UgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKQotCQkJCQlnb3RvIGV4cG9uZW50OworICAgICAgICAgICAgICAgIC8qIEhleCAqLworICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzeGRpZ2l0KGMpKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfVE9LRU47CisgICAgICAgICAgICAgICAgICAgIHRva19iYWNrdXAodG9rLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlzeGRpZ2l0KGMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ28nIHx8IGMgPT0gJ08nKSB7CisgICAgICAgICAgICAgICAgLyogT2N0YWwgKi8KKyAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgaWYgKGMgPCAnMCcgfHwgYyA+PSAnOCcpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9UT0tFTjsKKyAgICAgICAgICAgICAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoJzAnIDw9IGMgJiYgYyA8ICc4Jyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICdiJyB8fCBjID09ICdCJykgeworICAgICAgICAgICAgICAgIC8qIEJpbmFyeSAqLworICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSAnMCcgJiYgYyAhPSAnMScpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9UT0tFTjsKKyAgICAgICAgICAgICAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoYyA9PSAnMCcgfHwgYyA9PSAnMScpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGZvdW5kX2RlY2ltYWwgPSAwOworICAgICAgICAgICAgICAgIC8qIE9jdGFsOyBjIGlzIGZpcnN0IGNoYXIgb2YgaXQgKi8KKyAgICAgICAgICAgICAgICAvKiBUaGVyZSdzIG5vICdpc29jdGRpZ2l0JyBtYWNybywgc2lnaCAqLworICAgICAgICAgICAgICAgIHdoaWxlICgnMCcgPD0gYyAmJiBjIDwgJzgnKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzZGlnaXQoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfZGVjaW1hbCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoaXNkaWdpdChjKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjID09ICcuJykKKyAgICAgICAgICAgICAgICAgICAgZ290byBmcmFjdGlvbjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdlJyB8fCBjID09ICdFJykKKyAgICAgICAgICAgICAgICAgICAgZ290byBleHBvbmVudDsKICNpZm5kZWYgV0lUSE9VVF9DT01QTEVYCi0JCQkJZWxzZSBpZiAoYyA9PSAnaicgfHwgYyA9PSAnSicpCi0JCQkJCWdvdG8gaW1hZ2luYXJ5OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ2onIHx8IGMgPT0gJ0onKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGltYWdpbmFyeTsKICNlbmRpZgotCQkJCWVsc2UgaWYgKGZvdW5kX2RlY2ltYWwpIHsKLQkJCQkJdG9rLT5kb25lID0gRV9UT0tFTjsKLQkJCQkJdG9rX2JhY2t1cCh0b2ssIGMpOwotCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYyA9PSAnbCcgfHwgYyA9PSAnTCcpCi0JCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQl9Ci0JCWVsc2UgewotCQkJLyogRGVjaW1hbCAqLwotCQkJZG8gewotCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCX0gd2hpbGUgKGlzZGlnaXQoYykpOwotCQkJaWYgKGMgPT0gJ2wnIHx8IGMgPT0gJ0wnKQotCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCWVsc2UgewotCQkJCS8qIEFjY2VwdCBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAqLwotCQkJCWlmIChjID09ICcuJykgewotCQlmcmFjdGlvbjoKLQkJCQkJLyogRnJhY3Rpb24gKi8KLQkJCQkJZG8gewotCQkJCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCQl9IHdoaWxlIChpc2RpZ2l0KGMpKTsKLQkJCQl9Ci0JCQkJaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKSB7Ci0JCWV4cG9uZW50OgotCQkJCQkvKiBFeHBvbmVudCBwYXJ0ICovCi0JCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQkJaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQotCQkJCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCQlpZiAoIWlzZGlnaXQoYykpIHsKLQkJCQkJCXRvay0+ZG9uZSA9IEVfVE9LRU47Ci0JCQkJCQl0b2tfYmFja3VwKHRvaywgYyk7Ci0JCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQkJfQotCQkJCQlkbyB7Ci0JCQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJCX0gd2hpbGUgKGlzZGlnaXQoYykpOwotCQkJCX0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmb3VuZF9kZWNpbWFsKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfVE9LRU47CisgICAgICAgICAgICAgICAgICAgIHRva19iYWNrdXAodG9rLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gJ2wnIHx8IGMgPT0gJ0wnKQorICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIERlY2ltYWwgKi8KKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICB9IHdoaWxlIChpc2RpZ2l0KGMpKTsKKyAgICAgICAgICAgIGlmIChjID09ICdsJyB8fCBjID09ICdMJykKKyAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBBY2NlcHQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnLicpIHsKKyAgICAgICAgZnJhY3Rpb246CisgICAgICAgICAgICAgICAgICAgIC8qIEZyYWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoaXNkaWdpdChjKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjID09ICdlJyB8fCBjID09ICdFJykgeworICAgICAgICBleHBvbmVudDoKKyAgICAgICAgICAgICAgICAgICAgLyogRXhwb25lbnQgcGFydCAqLworICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcrJyB8fCBjID09ICctJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX1RPS0VOOworICAgICAgICAgICAgICAgICAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChpc2RpZ2l0KGMpKTsKKyAgICAgICAgICAgICAgICB9CiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCQkJCWlmIChjID09ICdqJyB8fCBjID09ICdKJykKLQkJCQkJLyogSW1hZ2luYXJ5IHBhcnQgKi8KLQkJaW1hZ2luYXJ5OgotCQkJCQljID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ2onIHx8IGMgPT0gJ0onKQorICAgICAgICAgICAgICAgICAgICAvKiBJbWFnaW5hcnkgcGFydCAqLworICAgICAgICBpbWFnaW5hcnk6CisgICAgICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKICNlbmRpZgotCQkJfQotCQl9Ci0JCXRva19iYWNrdXAodG9rLCBjKTsKLQkJKnBfc3RhcnQgPSB0b2stPnN0YXJ0OwotCQkqcF9lbmQgPSB0b2stPmN1cjsKLQkJcmV0dXJuIE5VTUJFUjsKLQl9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICAqcF9zdGFydCA9IHRvay0+c3RhcnQ7CisgICAgICAgICpwX2VuZCA9IHRvay0+Y3VyOworICAgICAgICByZXR1cm4gTlVNQkVSOworICAgIH0KIAogICBsZXR0ZXJfcXVvdGU6Ci0JLyogU3RyaW5nICovCi0JaWYgKGMgPT0gJ1wnJyB8fCBjID09ICciJykgewotCQlQeV9zc2l6ZV90IHF1b3RlMiA9IHRvay0+Y3VyIC0gdG9rLT5zdGFydCArIDE7Ci0JCWludCBxdW90ZSA9IGM7Ci0JCWludCB0cmlwbGUgPSAwOwotCQlpbnQgdHJpcGNvdW50ID0gMDsKLQkJZm9yICg7OykgewotCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJaWYgKGMgPT0gJ1xuJykgewotCQkJCWlmICghdHJpcGxlKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfRU9MUzsKLQkJCQkJdG9rX2JhY2t1cCh0b2ssIGMpOwotCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQl9Ci0JCQkJdHJpcGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLT5jb250X2xpbmUgPSAxOyAvKiBtdWx0aWxpbmUgc3RyaW5nLiAqLwotCQkJfQotCQkJZWxzZSBpZiAoYyA9PSBFT0YpIHsKLQkJCQlpZiAodHJpcGxlKQotCQkJCQl0b2stPmRvbmUgPSBFX0VPRlM7Ci0JCQkJZWxzZQotCQkJCQl0b2stPmRvbmUgPSBFX0VPTFM7Ci0JCQkJdG9rLT5jdXIgPSB0b2stPmlucDsKLQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCX0KLQkJCWVsc2UgaWYgKGMgPT0gcXVvdGUpIHsKLQkJCQl0cmlwY291bnQrKzsKLQkJCQlpZiAodG9rLT5jdXIgLSB0b2stPnN0YXJ0ID09IHF1b3RlMikgewotCQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJCWlmIChjID09IHF1b3RlKSB7Ci0JCQkJCQl0cmlwbGUgPSAxOwotCQkJCQkJdHJpcGNvdW50ID0gMDsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXRva19iYWNrdXAodG9rLCBjKTsKLQkJCQl9Ci0JCQkJaWYgKCF0cmlwbGUgfHwgdHJpcGNvdW50ID09IDMpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoYyA9PSAnXFwnKSB7Ci0JCQkJdHJpcGNvdW50ID0gMDsKLQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJaWYgKGMgPT0gRU9GKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfRU9MUzsKLQkJCQkJdG9rLT5jdXIgPSB0b2stPmlucDsKLQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCXRyaXBjb3VudCA9IDA7Ci0JCX0KLQkJKnBfc3RhcnQgPSB0b2stPnN0YXJ0OwotCQkqcF9lbmQgPSB0b2stPmN1cjsKLQkJcmV0dXJuIFNUUklORzsKLQl9CisgICAgLyogU3RyaW5nICovCisgICAgaWYgKGMgPT0gJ1wnJyB8fCBjID09ICciJykgeworICAgICAgICBQeV9zc2l6ZV90IHF1b3RlMiA9IHRvay0+Y3VyIC0gdG9rLT5zdGFydCArIDE7CisgICAgICAgIGludCBxdW90ZSA9IGM7CisgICAgICAgIGludCB0cmlwbGUgPSAwOworICAgICAgICBpbnQgdHJpcGNvdW50ID0gMDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGlmICghdHJpcGxlKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfRU9MUzsKKyAgICAgICAgICAgICAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJpcGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB0b2stPmNvbnRfbGluZSA9IDE7IC8qIG11bHRpbGluZSBzdHJpbmcuICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID09IEVPRikgeworICAgICAgICAgICAgICAgIGlmICh0cmlwbGUpCisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfRU9GUzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfRU9MUzsKKyAgICAgICAgICAgICAgICB0b2stPmN1ciA9IHRvay0+aW5wOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSBxdW90ZSkgeworICAgICAgICAgICAgICAgIHRyaXBjb3VudCsrOworICAgICAgICAgICAgICAgIGlmICh0b2stPmN1ciAtIHRvay0+c3RhcnQgPT0gcXVvdGUyKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gcXVvdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyaXBsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmlwY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXRyaXBsZSB8fCB0cmlwY291bnQgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICB0cmlwY291bnQgPSAwOworICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBFT0YpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9FT0xTOworICAgICAgICAgICAgICAgICAgICB0b2stPmN1ciA9IHRvay0+aW5wOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHJpcGNvdW50ID0gMDsKKyAgICAgICAgfQorICAgICAgICAqcF9zdGFydCA9IHRvay0+c3RhcnQ7CisgICAgICAgICpwX2VuZCA9IHRvay0+Y3VyOworICAgICAgICByZXR1cm4gU1RSSU5HOworICAgIH0KIAotCS8qIExpbmUgY29udGludWF0aW9uICovCi0JaWYgKGMgPT0gJ1xcJykgewotCQljID0gdG9rX25leHRjKHRvayk7Ci0JCWlmIChjICE9ICdcbicpIHsKLQkJCXRvay0+ZG9uZSA9IEVfTElORUNPTlQ7Ci0JCQl0b2stPmN1ciA9IHRvay0+aW5wOwotCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCX0KLSAgICAgICAgICAgICAgICB0b2stPmNvbnRfbGluZSA9IDE7Ci0JCWdvdG8gYWdhaW47IC8qIFJlYWQgbmV4dCBsaW5lICovCi0JfQorICAgIC8qIExpbmUgY29udGludWF0aW9uICovCisgICAgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgIGlmIChjICE9ICdcbicpIHsKKyAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfTElORUNPTlQ7CisgICAgICAgICAgICB0b2stPmN1ciA9IHRvay0+aW5wOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgIH0KKyAgICAgICAgdG9rLT5jb250X2xpbmUgPSAxOworICAgICAgICBnb3RvIGFnYWluOyAvKiBSZWFkIG5leHQgbGluZSAqLworICAgIH0KIAotCS8qIENoZWNrIGZvciB0d28tY2hhcmFjdGVyIHRva2VuICovCi0JewotCQlpbnQgYzIgPSB0b2tfbmV4dGModG9rKTsKLQkJaW50IHRva2VuID0gUHlUb2tlbl9Ud29DaGFycyhjLCBjMik7CisgICAgLyogQ2hlY2sgZm9yIHR3by1jaGFyYWN0ZXIgdG9rZW4gKi8KKyAgICB7CisgICAgICAgIGludCBjMiA9IHRva19uZXh0Yyh0b2spOworICAgICAgICBpbnQgdG9rZW4gPSBQeVRva2VuX1R3b0NoYXJzKGMsIGMyKTsKICNpZm5kZWYgUEdFTgotCQlpZiAoUHlfUHkza1dhcm5pbmdGbGFnICYmIHRva2VuID09IE5PVEVRVUFMICYmIGMgPT0gJzwnKSB7Ci0JCQlpZiAoUHlFcnJfV2FybkV4cGxpY2l0KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkJICAgICAgICI8PiBub3Qgc3VwcG9ydGVkIGluIDMueDsgdXNlICE9IiwKLQkJCQkJICAgICAgIHRvay0+ZmlsZW5hbWUsIHRvay0+bGluZW5vLAotCQkJCQkgICAgICAgTlVMTCwgTlVMTCkpIHsKLQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoUHlfUHkza1dhcm5pbmdGbGFnICYmIHRva2VuID09IE5PVEVRVUFMICYmIGMgPT0gJzwnKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkV4cGxpY2l0KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjw+IG5vdCBzdXBwb3J0ZWQgaW4gMy54OyB1c2UgIT0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2stPmZpbGVuYW1lLCB0b2stPmxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCi0JCWlmICh0b2tlbiAhPSBPUCkgewotCQkJaW50IGMzID0gdG9rX25leHRjKHRvayk7Ci0JCQlpbnQgdG9rZW4zID0gUHlUb2tlbl9UaHJlZUNoYXJzKGMsIGMyLCBjMyk7Ci0JCQlpZiAodG9rZW4zICE9IE9QKSB7Ci0JCQkJdG9rZW4gPSB0b2tlbjM7Ci0JCQl9IGVsc2UgewotCQkJCXRva19iYWNrdXAodG9rLCBjMyk7Ci0JCQl9Ci0JCQkqcF9zdGFydCA9IHRvay0+c3RhcnQ7Ci0JCQkqcF9lbmQgPSB0b2stPmN1cjsKLQkJCXJldHVybiB0b2tlbjsKLQkJfQotCQl0b2tfYmFja3VwKHRvaywgYzIpOwotCX0KKyAgICAgICAgaWYgKHRva2VuICE9IE9QKSB7CisgICAgICAgICAgICBpbnQgYzMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgIGludCB0b2tlbjMgPSBQeVRva2VuX1RocmVlQ2hhcnMoYywgYzIsIGMzKTsKKyAgICAgICAgICAgIGlmICh0b2tlbjMgIT0gT1ApIHsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuMzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9rX2JhY2t1cCh0b2ssIGMzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKKyAgICAgICAgICAgICpwX2VuZCA9IHRvay0+Y3VyOworICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICB9CisgICAgICAgIHRva19iYWNrdXAodG9rLCBjMik7CisgICAgfQogCi0JLyogS2VlcCB0cmFjayBvZiBwYXJlbnRoZXNlcyBuZXN0aW5nIGxldmVsICovCi0Jc3dpdGNoIChjKSB7Ci0JY2FzZSAnKCc6Ci0JY2FzZSAnWyc6Ci0JY2FzZSAneyc6Ci0JCXRvay0+bGV2ZWwrKzsKLQkJYnJlYWs7Ci0JY2FzZSAnKSc6Ci0JY2FzZSAnXSc6Ci0JY2FzZSAnfSc6Ci0JCXRvay0+bGV2ZWwtLTsKLQkJYnJlYWs7Ci0JfQorICAgIC8qIEtlZXAgdHJhY2sgb2YgcGFyZW50aGVzZXMgbmVzdGluZyBsZXZlbCAqLworICAgIHN3aXRjaCAoYykgeworICAgIGNhc2UgJygnOgorICAgIGNhc2UgJ1snOgorICAgIGNhc2UgJ3snOgorICAgICAgICB0b2stPmxldmVsKys7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJyknOgorICAgIGNhc2UgJ10nOgorICAgIGNhc2UgJ30nOgorICAgICAgICB0b2stPmxldmVsLS07CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCS8qIFB1bmN0dWF0aW9uIGNoYXJhY3RlciAqLwotCSpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKLQkqcF9lbmQgPSB0b2stPmN1cjsKLQlyZXR1cm4gUHlUb2tlbl9PbmVDaGFyKGMpOworICAgIC8qIFB1bmN0dWF0aW9uIGNoYXJhY3RlciAqLworICAgICpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKKyAgICAqcF9lbmQgPSB0b2stPmN1cjsKKyAgICByZXR1cm4gUHlUb2tlbl9PbmVDaGFyKGMpOwogfQogCiBpbnQKIFB5VG9rZW5pemVyX0dldChzdHJ1Y3QgdG9rX3N0YXRlICp0b2ssIGNoYXIgKipwX3N0YXJ0LCBjaGFyICoqcF9lbmQpCiB7Ci0JaW50IHJlc3VsdCA9IHRva19nZXQodG9rLCBwX3N0YXJ0LCBwX2VuZCk7Ci0JaWYgKHRvay0+ZGVjb2RpbmdfZXJyZWQpIHsKLQkJcmVzdWx0ID0gRVJST1JUT0tFTjsKLQkJdG9rLT5kb25lID0gRV9ERUNPREU7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaW50IHJlc3VsdCA9IHRva19nZXQodG9rLCBwX3N0YXJ0LCBwX2VuZCk7CisgICAgaWYgKHRvay0+ZGVjb2RpbmdfZXJyZWQpIHsKKyAgICAgICAgcmVzdWx0ID0gRVJST1JUT0tFTjsKKyAgICAgICAgdG9rLT5kb25lID0gRV9ERUNPREU7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgZnJvbSBwYXJzZXRvay4gSG93ZXZlciwgaXQgY2Fubm90IGxpdmUKQEAgLTE2NTksNTQgKzE2NTksNTQgQEAKIGNoYXIqCiBQeVRva2VuaXplcl9SZXN0b3JlRW5jb2Rpbmcoc3RydWN0IHRva19zdGF0ZSogdG9rLCBpbnQgbGVuLCBpbnQqIG9mZnNldCkKIHsKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KICNlbHNlCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogc3RhdGljIFB5T2JqZWN0ICoKIGRlY191dGY4KGNvbnN0IGNoYXIgKmVuYywgY29uc3QgY2hhciAqdGV4dCwgc2l6ZV90IGxlbikgewotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwkKLQlQeU9iamVjdCAqdW5pY29kZV90ZXh0ID0gUHlVbmljb2RlX0RlY29kZVVURjgodGV4dCwgbGVuLCAicmVwbGFjZSIpOwotCWlmICh1bmljb2RlX3RleHQpIHsKLQkJcmV0ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh1bmljb2RlX3RleHQsIGVuYywgInJlcGxhY2UiKTsKLQkJUHlfREVDUkVGKHVuaWNvZGVfdGV4dCk7Ci0JfQotCWlmICghcmV0KSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotCXJldHVybiByZXQ7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnVuaWNvZGVfdGV4dCA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHRleHQsIGxlbiwgInJlcGxhY2UiKTsKKyAgICBpZiAodW5pY29kZV90ZXh0KSB7CisgICAgICAgIHJldCA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodW5pY29kZV90ZXh0LCBlbmMsICJyZXBsYWNlIik7CisgICAgICAgIFB5X0RFQ1JFRih1bmljb2RlX3RleHQpOworICAgIH0KKyAgICBpZiAoIXJldCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gcmV0OwogfQogY2hhciAqCiBQeVRva2VuaXplcl9SZXN0b3JlRW5jb2Rpbmcoc3RydWN0IHRva19zdGF0ZSogdG9rLCBpbnQgbGVuLCBpbnQgKm9mZnNldCkKIHsKLQljaGFyICp0ZXh0ID0gTlVMTDsKLQlpZiAodG9rLT5lbmNvZGluZykgewotCQkvKiBjb252ZXJ0IHNvdXJjZSB0byBvcmlnaW5hbCBlbmNvbmRpZyAqLwotCQlQeU9iamVjdCAqbGluZW9iaiA9IGRlY191dGY4KHRvay0+ZW5jb2RpbmcsIHRvay0+YnVmLCBsZW4pOwotCQlpZiAobGluZW9iaiAhPSBOVUxMKSB7Ci0JCQlpbnQgbGluZWxlbiA9IFB5U3RyaW5nX1NpemUobGluZW9iaik7Ci0JCQljb25zdCBjaGFyICpsaW5lID0gUHlTdHJpbmdfQXNTdHJpbmcobGluZW9iaik7Ci0JCQl0ZXh0ID0gUHlPYmplY3RfTUFMTE9DKGxpbmVsZW4gKyAxKTsKLQkJCWlmICh0ZXh0ICE9IE5VTEwgJiYgbGluZSAhPSBOVUxMKSB7Ci0JCQkJaWYgKGxpbmVsZW4pCi0JCQkJCXN0cm5jcHkodGV4dCwgbGluZSwgbGluZWxlbik7Ci0JCQkJdGV4dFtsaW5lbGVuXSA9ICdcMCc7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYobGluZW9iaik7Ci0JCQkJCQotCQkJLyogYWRqdXN0IGVycm9yIG9mZnNldCAqLwotCQkJaWYgKCpvZmZzZXQgPiAxKSB7Ci0JCQkJUHlPYmplY3QgKm9mZnNldG9iaiA9IGRlY191dGY4KHRvay0+ZW5jb2RpbmcsIAotCQkJCQkJCSAgICAgICB0b2stPmJ1ZiwgKm9mZnNldC0xKTsKLQkJCQlpZiAob2Zmc2V0b2JqKSB7Ci0JCQkJCSpvZmZzZXQgPSBQeVN0cmluZ19TaXplKG9mZnNldG9iaikgKyAxOwotCQkJCQlQeV9ERUNSRUYob2Zmc2V0b2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCX0KLQlyZXR1cm4gdGV4dDsKKyAgICBjaGFyICp0ZXh0ID0gTlVMTDsKKyAgICBpZiAodG9rLT5lbmNvZGluZykgeworICAgICAgICAvKiBjb252ZXJ0IHNvdXJjZSB0byBvcmlnaW5hbCBlbmNvbmRpZyAqLworICAgICAgICBQeU9iamVjdCAqbGluZW9iaiA9IGRlY191dGY4KHRvay0+ZW5jb2RpbmcsIHRvay0+YnVmLCBsZW4pOworICAgICAgICBpZiAobGluZW9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgbGluZWxlbiA9IFB5U3RyaW5nX1NpemUobGluZW9iaik7CisgICAgICAgICAgICBjb25zdCBjaGFyICpsaW5lID0gUHlTdHJpbmdfQXNTdHJpbmcobGluZW9iaik7CisgICAgICAgICAgICB0ZXh0ID0gUHlPYmplY3RfTUFMTE9DKGxpbmVsZW4gKyAxKTsKKyAgICAgICAgICAgIGlmICh0ZXh0ICE9IE5VTEwgJiYgbGluZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmVsZW4pCisgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkodGV4dCwgbGluZSwgbGluZWxlbik7CisgICAgICAgICAgICAgICAgdGV4dFtsaW5lbGVuXSA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYobGluZW9iaik7CisKKyAgICAgICAgICAgIC8qIGFkanVzdCBlcnJvciBvZmZzZXQgKi8KKyAgICAgICAgICAgIGlmICgqb2Zmc2V0ID4gMSkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvZmZzZXRvYmogPSBkZWNfdXRmOCh0b2stPmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2stPmJ1ZiwgKm9mZnNldC0xKTsKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0b2JqKSB7CisgICAgICAgICAgICAgICAgICAgICpvZmZzZXQgPSBQeVN0cmluZ19TaXplKG9mZnNldG9iaikgKyAxOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2Zmc2V0b2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdGV4dDsKIAogfQogI2VuZGlmIC8qIGRlZmluZWQoUHlfVVNJTkdfVU5JQ09ERSkgKi8KQEAgLTE3MTgsOSArMTcxOCw5IEBACiB2b2lkCiB0b2tfZHVtcChpbnQgdHlwZSwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCkKIHsKLQlwcmludGYoIiVzIiwgX1B5UGFyc2VyX1Rva2VuTmFtZXNbdHlwZV0pOwotCWlmICh0eXBlID09IE5BTUUgfHwgdHlwZSA9PSBOVU1CRVIgfHwgdHlwZSA9PSBTVFJJTkcgfHwgdHlwZSA9PSBPUCkKLQkJcHJpbnRmKCIoJS4qcykiLCAoaW50KShlbmQgLSBzdGFydCksIHN0YXJ0KTsKKyAgICBwcmludGYoIiVzIiwgX1B5UGFyc2VyX1Rva2VuTmFtZXNbdHlwZV0pOworICAgIGlmICh0eXBlID09IE5BTUUgfHwgdHlwZSA9PSBOVU1CRVIgfHwgdHlwZSA9PSBTVFJJTkcgfHwgdHlwZSA9PSBPUCkKKyAgICAgICAgcHJpbnRmKCIoJS4qcykiLCAoaW50KShlbmQgLSBzdGFydCksIHN0YXJ0KTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9QYXJzZXIvdG9rZW5pemVyLmggYi9QYXJzZXIvdG9rZW5pemVyLmgKaW5kZXggNzljOWUyOC4uZjE1ZTI1MiAxMDA2NDQKLS0tIGEvUGFyc2VyL3Rva2VuaXplci5oCisrKyBiL1BhcnNlci90b2tlbml6ZXIuaApAQCAtOCw1MSArOCw1MSBAQAogCiAvKiBUb2tlbml6ZXIgaW50ZXJmYWNlICovCiAKLSNpbmNsdWRlICJ0b2tlbi5oIgkvKiBGb3IgdG9rZW4gdHlwZXMgKi8KKyNpbmNsdWRlICJ0b2tlbi5oIiAgICAgIC8qIEZvciB0b2tlbiB0eXBlcyAqLwogCi0jZGVmaW5lIE1BWElOREVOVCAxMDAJLyogTWF4IGluZGVudGF0aW9uIGxldmVsICovCisjZGVmaW5lIE1BWElOREVOVCAxMDAgICAvKiBNYXggaW5kZW50YXRpb24gbGV2ZWwgKi8KIAogLyogVG9rZW5pemVyIHN0YXRlICovCiBzdHJ1Y3QgdG9rX3N0YXRlIHsKLQkvKiBJbnB1dCBzdGF0ZTsgYnVmIDw9IGN1ciA8PSBpbnAgPD0gZW5kICovCi0JLyogTkIgYW4gZW50aXJlIGxpbmUgaXMgaGVsZCBpbiB0aGUgYnVmZmVyICovCi0JY2hhciAqYnVmOwkvKiBJbnB1dCBidWZmZXIsIG9yIE5VTEw7IG1hbGxvYydlZCBpZiBmcCAhPSBOVUxMICovCi0JY2hhciAqY3VyOwkvKiBOZXh0IGNoYXJhY3RlciBpbiBidWZmZXIgKi8KLQljaGFyICppbnA7CS8qIEVuZCBvZiBkYXRhIGluIGJ1ZmZlciAqLwotCWNoYXIgKmVuZDsJLyogRW5kIG9mIGlucHV0IGJ1ZmZlciBpZiBidWYgIT0gTlVMTCAqLwotCWNoYXIgKnN0YXJ0OwkvKiBTdGFydCBvZiBjdXJyZW50IHRva2VuIGlmIG5vdCBOVUxMICovCi0JaW50IGRvbmU7CS8qIEVfT0sgbm9ybWFsbHksIEVfRU9GIGF0IEVPRiwgb3RoZXJ3aXNlIGVycm9yIGNvZGUgKi8KLQkvKiBOQiBJZiBkb25lICE9IEVfT0ssIGN1ciBtdXN0IGJlID09IGlucCEhISAqLwotCUZJTEUgKmZwOwkvKiBSZXN0IG9mIGlucHV0OyBOVUxMIGlmIHRva2VuaXppbmcgYSBzdHJpbmcgKi8KLQlpbnQgdGFic2l6ZTsJLyogVGFiIHNwYWNpbmcgKi8KLQlpbnQgaW5kZW50OwkvKiBDdXJyZW50IGluZGVudGF0aW9uIGluZGV4ICovCi0JaW50IGluZHN0YWNrW01BWElOREVOVF07CS8qIFN0YWNrIG9mIGluZGVudHMgKi8KLQlpbnQgYXRib2w7CS8qIE5vbnplcm8gaWYgYXQgYmVnaW4gb2YgbmV3IGxpbmUgKi8KLQlpbnQgcGVuZGluOwkvKiBQZW5kaW5nIGluZGVudHMgKGlmID4gMCkgb3IgZGVkZW50cyAoaWYgPCAwKSAqLwotCWNoYXIgKnByb21wdCwgKm5leHRwcm9tcHQ7CS8qIEZvciBpbnRlcmFjdGl2ZSBwcm9tcHRpbmcgKi8KLQlpbnQgbGluZW5vOwkvKiBDdXJyZW50IGxpbmUgbnVtYmVyICovCi0JaW50IGxldmVsOwkvKiAoKSBbXSB7fSBQYXJlbnRoZXNlcyBuZXN0aW5nIGxldmVsICovCi0JCQkvKiBVc2VkIHRvIGFsbG93IGZyZWUgY29udGludWF0aW9ucyBpbnNpZGUgdGhlbSAqLwotCS8qIFN0dWZmIGZvciBjaGVja2luZyBvbiBkaWZmZXJlbnQgdGFiIHNpemVzICovCi0JY29uc3QgY2hhciAqZmlsZW5hbWU7CS8qIEZvciBlcnJvciBtZXNzYWdlcyAqLwotCWludCBhbHR3YXJuaW5nOwkvKiBJc3N1ZSB3YXJuaW5nIGlmIGFsdGVybmF0ZSB0YWJzIGRvbid0IG1hdGNoICovCi0JaW50IGFsdGVycm9yOwkvKiBJc3N1ZSBlcnJvciBpZiBhbHRlcm5hdGUgdGFicyBkb24ndCBtYXRjaCAqLwotCWludCBhbHR0YWJzaXplOwkvKiBBbHRlcm5hdGUgdGFiIHNwYWNpbmcgKi8KLQlpbnQgYWx0aW5kc3RhY2tbTUFYSU5ERU5UXTsJLyogU3RhY2sgb2YgYWx0ZXJuYXRlIGluZGVudHMgKi8KLQkvKiBTdHVmZiBmb3IgUEVQIDAyNjMgKi8KLQlpbnQgZGVjb2Rpbmdfc3RhdGU7CS8qIC0xOmRlY29kaW5nLCAwOmluaXQsIDE6cmF3ICovCi0JaW50IGRlY29kaW5nX2VycmVkOwkvKiB3aGV0aGVyIGVycmVkIGluIGRlY29kaW5nICAqLwotCWludCByZWFkX2NvZGluZ19zcGVjOwkvKiB3aGV0aGVyICdjb2Rpbmc6Li4uJyBoYXMgYmVlbiByZWFkICAqLwotCWNoYXIgKmVuY29kaW5nOwotCWludCBjb250X2xpbmU7ICAgICAgICAgIC8qIHdoZXRoZXIgd2UgYXJlIGluIGEgY29udGludWF0aW9uIGxpbmUuICovCi0JY29uc3QgY2hhciogbGluZV9zdGFydDsJLyogcG9pbnRlciB0byBzdGFydCBvZiBjdXJyZW50IGxpbmUgKi8KKyAgICAvKiBJbnB1dCBzdGF0ZTsgYnVmIDw9IGN1ciA8PSBpbnAgPD0gZW5kICovCisgICAgLyogTkIgYW4gZW50aXJlIGxpbmUgaXMgaGVsZCBpbiB0aGUgYnVmZmVyICovCisgICAgY2hhciAqYnVmOyAgICAgICAgICAvKiBJbnB1dCBidWZmZXIsIG9yIE5VTEw7IG1hbGxvYydlZCBpZiBmcCAhPSBOVUxMICovCisgICAgY2hhciAqY3VyOyAgICAgICAgICAvKiBOZXh0IGNoYXJhY3RlciBpbiBidWZmZXIgKi8KKyAgICBjaGFyICppbnA7ICAgICAgICAgIC8qIEVuZCBvZiBkYXRhIGluIGJ1ZmZlciAqLworICAgIGNoYXIgKmVuZDsgICAgICAgICAgLyogRW5kIG9mIGlucHV0IGJ1ZmZlciBpZiBidWYgIT0gTlVMTCAqLworICAgIGNoYXIgKnN0YXJ0OyAgICAgICAgLyogU3RhcnQgb2YgY3VycmVudCB0b2tlbiBpZiBub3QgTlVMTCAqLworICAgIGludCBkb25lOyAgICAgICAgICAgLyogRV9PSyBub3JtYWxseSwgRV9FT0YgYXQgRU9GLCBvdGhlcndpc2UgZXJyb3IgY29kZSAqLworICAgIC8qIE5CIElmIGRvbmUgIT0gRV9PSywgY3VyIG11c3QgYmUgPT0gaW5wISEhICovCisgICAgRklMRSAqZnA7ICAgICAgICAgICAvKiBSZXN0IG9mIGlucHV0OyBOVUxMIGlmIHRva2VuaXppbmcgYSBzdHJpbmcgKi8KKyAgICBpbnQgdGFic2l6ZTsgICAgICAgIC8qIFRhYiBzcGFjaW5nICovCisgICAgaW50IGluZGVudDsgICAgICAgICAvKiBDdXJyZW50IGluZGVudGF0aW9uIGluZGV4ICovCisgICAgaW50IGluZHN0YWNrW01BWElOREVOVF07ICAgICAgICAgICAgLyogU3RhY2sgb2YgaW5kZW50cyAqLworICAgIGludCBhdGJvbDsgICAgICAgICAgLyogTm9uemVybyBpZiBhdCBiZWdpbiBvZiBuZXcgbGluZSAqLworICAgIGludCBwZW5kaW47ICAgICAgICAgLyogUGVuZGluZyBpbmRlbnRzIChpZiA+IDApIG9yIGRlZGVudHMgKGlmIDwgMCkgKi8KKyAgICBjaGFyICpwcm9tcHQsICpuZXh0cHJvbXB0OyAgICAgICAgICAvKiBGb3IgaW50ZXJhY3RpdmUgcHJvbXB0aW5nICovCisgICAgaW50IGxpbmVubzsgICAgICAgICAvKiBDdXJyZW50IGxpbmUgbnVtYmVyICovCisgICAgaW50IGxldmVsOyAgICAgICAgICAvKiAoKSBbXSB7fSBQYXJlbnRoZXNlcyBuZXN0aW5nIGxldmVsICovCisgICAgICAgICAgICAvKiBVc2VkIHRvIGFsbG93IGZyZWUgY29udGludWF0aW9ucyBpbnNpZGUgdGhlbSAqLworICAgIC8qIFN0dWZmIGZvciBjaGVja2luZyBvbiBkaWZmZXJlbnQgdGFiIHNpemVzICovCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7ICAgICAgIC8qIEZvciBlcnJvciBtZXNzYWdlcyAqLworICAgIGludCBhbHR3YXJuaW5nOyAgICAgLyogSXNzdWUgd2FybmluZyBpZiBhbHRlcm5hdGUgdGFicyBkb24ndCBtYXRjaCAqLworICAgIGludCBhbHRlcnJvcjsgICAgICAgLyogSXNzdWUgZXJyb3IgaWYgYWx0ZXJuYXRlIHRhYnMgZG9uJ3QgbWF0Y2ggKi8KKyAgICBpbnQgYWx0dGFic2l6ZTsgICAgIC8qIEFsdGVybmF0ZSB0YWIgc3BhY2luZyAqLworICAgIGludCBhbHRpbmRzdGFja1tNQVhJTkRFTlRdOyAgICAgICAgIC8qIFN0YWNrIG9mIGFsdGVybmF0ZSBpbmRlbnRzICovCisgICAgLyogU3R1ZmYgZm9yIFBFUCAwMjYzICovCisgICAgaW50IGRlY29kaW5nX3N0YXRlOyAgICAgICAgIC8qIC0xOmRlY29kaW5nLCAwOmluaXQsIDE6cmF3ICovCisgICAgaW50IGRlY29kaW5nX2VycmVkOyAgICAgICAgIC8qIHdoZXRoZXIgZXJyZWQgaW4gZGVjb2RpbmcgICovCisgICAgaW50IHJlYWRfY29kaW5nX3NwZWM7ICAgICAgIC8qIHdoZXRoZXIgJ2NvZGluZzouLi4nIGhhcyBiZWVuIHJlYWQgICovCisgICAgY2hhciAqZW5jb2Rpbmc7CisgICAgaW50IGNvbnRfbGluZTsgICAgICAgICAgLyogd2hldGhlciB3ZSBhcmUgaW4gYSBjb250aW51YXRpb24gbGluZS4gKi8KKyAgICBjb25zdCBjaGFyKiBsaW5lX3N0YXJ0OyAgICAgLyogcG9pbnRlciB0byBzdGFydCBvZiBjdXJyZW50IGxpbmUgKi8KICNpZm5kZWYgUEdFTgotCVB5T2JqZWN0ICpkZWNvZGluZ19yZWFkbGluZTsgLyogY29kZWNzLm9wZW4oLi4uKS5yZWFkbGluZSAqLwotCVB5T2JqZWN0ICpkZWNvZGluZ19idWZmZXI7CisgICAgUHlPYmplY3QgKmRlY29kaW5nX3JlYWRsaW5lOyAvKiBjb2RlY3Mub3BlbiguLi4pLnJlYWRsaW5lICovCisgICAgUHlPYmplY3QgKmRlY29kaW5nX2J1ZmZlcjsKICNlbmRpZgotCWNvbnN0IGNoYXIqIGVuYzsKLQljb25zdCBjaGFyKiBzdHI7Ci0JY29uc3QgY2hhciogaW5wdXQ7IC8qIFRva2VuaXplcidzIG5ld2xpbmUgdHJhbnNsYXRlZCBjb3B5IG9mIHRoZSBzdHJpbmcuICovCisgICAgY29uc3QgY2hhciogZW5jOworICAgIGNvbnN0IGNoYXIqIHN0cjsKKyAgICBjb25zdCBjaGFyKiBpbnB1dDsgLyogVG9rZW5pemVyJ3MgbmV3bGluZSB0cmFuc2xhdGVkIGNvcHkgb2YgdGhlIHN0cmluZy4gKi8KIH07CiAKIGV4dGVybiBzdHJ1Y3QgdG9rX3N0YXRlICpQeVRva2VuaXplcl9Gcm9tU3RyaW5nKGNvbnN0IGNoYXIgKiwgaW50KTsKQEAgLTYwLDggKzYwLDggQEAKIGV4dGVybiB2b2lkIFB5VG9rZW5pemVyX0ZyZWUoc3RydWN0IHRva19zdGF0ZSAqKTsKIGV4dGVybiBpbnQgUHlUb2tlbml6ZXJfR2V0KHN0cnVjdCB0b2tfc3RhdGUgKiwgY2hhciAqKiwgY2hhciAqKik7CiAjaWYgZGVmaW5lZChQR0VOKSB8fCBkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpCi1leHRlcm4gY2hhciAqIFB5VG9rZW5pemVyX1Jlc3RvcmVFbmNvZGluZyhzdHJ1Y3QgdG9rX3N0YXRlKiB0b2ssIAotCQkJCQkgIGludCBsZW4sIGludCAqb2Zmc2V0KTsKK2V4dGVybiBjaGFyICogUHlUb2tlbml6ZXJfUmVzdG9yZUVuY29kaW5nKHN0cnVjdCB0b2tfc3RhdGUqIHRvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCAqb2Zmc2V0KTsKICNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL1B5dGhvbi9hc2RsLmMgYi9QeXRob24vYXNkbC5jCmluZGV4IDExMDVkM2EuLmMzMGQ3ZDIwIDEwMDY0NAotLS0gYS9QeXRob24vYXNkbC5jCisrKyBiL1B5dGhvbi9hc2RsLmMKQEAgLTQsNjEgKzQsNjEgQEAKIGFzZGxfc2VxICoKIGFzZGxfc2VxX25ldyhpbnQgc2l6ZSwgUHlBcmVuYSAqYXJlbmEpCiB7Ci0JYXNkbF9zZXEgKnNlcSA9IE5VTEw7Ci0Jc2l6ZV90IG4gPSAoc2l6ZSA/IChzaXplb2Yodm9pZCAqKSAqIChzaXplIC0gMSkpIDogMCk7CisgICAgYXNkbF9zZXEgKnNlcSA9IE5VTEw7CisgICAgc2l6ZV90IG4gPSAoc2l6ZSA/IChzaXplb2Yodm9pZCAqKSAqIChzaXplIC0gMSkpIDogMCk7CiAKLQkvKiBjaGVjayBzaXplIGlzIHNhbmUgKi8KLQlpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA9PSBJTlRfTUlOIHx8IAotCQkoc2l6ZSAmJiAoKHNpemUgLSAxKSA+IChQWV9TSVpFX01BWCAvIHNpemVvZih2b2lkICopKSkpKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBjaGVjayBzaXplIGlzIHNhbmUgKi8KKyAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA9PSBJTlRfTUlOIHx8CisgICAgICAgIChzaXplICYmICgoc2l6ZSAtIDEpID4gKFBZX1NJWkVfTUFYIC8gc2l6ZW9mKHZvaWQgKikpKSkpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogY2hlY2sgaWYgc2l6ZSBjYW4gYmUgYWRkZWQgc2FmZWx5ICovCi0JaWYgKG4gPiBQWV9TSVpFX01BWCAtIHNpemVvZihhc2RsX3NlcSkpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIGNoZWNrIGlmIHNpemUgY2FuIGJlIGFkZGVkIHNhZmVseSAqLworICAgIGlmIChuID4gUFlfU0laRV9NQVggLSBzaXplb2YoYXNkbF9zZXEpKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW4gKz0gc2l6ZW9mKGFzZGxfc2VxKTsKKyAgICBuICs9IHNpemVvZihhc2RsX3NlcSk7CiAKLQlzZXEgPSAoYXNkbF9zZXEgKilQeUFyZW5hX01hbGxvYyhhcmVuYSwgbik7Ci0JaWYgKCFzZXEpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbXNldChzZXEsIDAsIG4pOwotCXNlcS0+c2l6ZSA9IHNpemU7Ci0JcmV0dXJuIHNlcTsKKyAgICBzZXEgPSAoYXNkbF9zZXEgKilQeUFyZW5hX01hbGxvYyhhcmVuYSwgbik7CisgICAgaWYgKCFzZXEpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChzZXEsIDAsIG4pOworICAgIHNlcS0+c2l6ZSA9IHNpemU7CisgICAgcmV0dXJuIHNlcTsKIH0KIAogYXNkbF9pbnRfc2VxICoKIGFzZGxfaW50X3NlcV9uZXcoaW50IHNpemUsIFB5QXJlbmEgKmFyZW5hKQogewotCWFzZGxfaW50X3NlcSAqc2VxID0gTlVMTDsKLQlzaXplX3QgbiA9IChzaXplID8gKHNpemVvZih2b2lkICopICogKHNpemUgLSAxKSkgOiAwKTsKKyAgICBhc2RsX2ludF9zZXEgKnNlcSA9IE5VTEw7CisgICAgc2l6ZV90IG4gPSAoc2l6ZSA/IChzaXplb2Yodm9pZCAqKSAqIChzaXplIC0gMSkpIDogMCk7CiAKLQkvKiBjaGVjayBzaXplIGlzIHNhbmUgKi8KLQlpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA9PSBJTlRfTUlOIHx8IAotCQkoc2l6ZSAmJiAoKHNpemUgLSAxKSA+IChQWV9TSVpFX01BWCAvIHNpemVvZih2b2lkICopKSkpKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIGNoZWNrIHNpemUgaXMgc2FuZSAqLworICAgIGlmIChzaXplIDwgMCB8fCBzaXplID09IElOVF9NSU4gfHwKKyAgICAgICAgKHNpemUgJiYgKChzaXplIC0gMSkgPiAoUFlfU0laRV9NQVggLyBzaXplb2Yodm9pZCAqKSkpKSkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIGNoZWNrIGlmIHNpemUgY2FuIGJlIGFkZGVkIHNhZmVseSAqLwotCWlmIChuID4gUFlfU0laRV9NQVggLSBzaXplb2YoYXNkbF9zZXEpKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBjaGVjayBpZiBzaXplIGNhbiBiZSBhZGRlZCBzYWZlbHkgKi8KKyAgICBpZiAobiA+IFBZX1NJWkVfTUFYIC0gc2l6ZW9mKGFzZGxfc2VxKSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQluICs9IHNpemVvZihhc2RsX3NlcSk7CisgICAgbiArPSBzaXplb2YoYXNkbF9zZXEpOwogCi0Jc2VxID0gKGFzZGxfaW50X3NlcSAqKVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBuKTsKLQlpZiAoIXNlcSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtc2V0KHNlcSwgMCwgbik7Ci0Jc2VxLT5zaXplID0gc2l6ZTsKLQlyZXR1cm4gc2VxOworICAgIHNlcSA9IChhc2RsX2ludF9zZXEgKilQeUFyZW5hX01hbGxvYyhhcmVuYSwgbik7CisgICAgaWYgKCFzZXEpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChzZXEsIDAsIG4pOworICAgIHNlcS0+c2l6ZSA9IHNpemU7CisgICAgcmV0dXJuIHNlcTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9hdG9mLmMgYi9QeXRob24vYXRvZi5jCmluZGV4IDhmYmRlMzguLjU2MmZjZDYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9hdG9mLmMKKysrIGIvUHl0aG9uL2F0b2YuYwpAQCAtMTAsNDEgKzEwLDQxIEBACiAKIGRvdWJsZSBhdG9mKGNoYXIgKnMpCiB7Ci0JZG91YmxlIGEgPSAwLjA7Ci0JaW50IGUgPSAwOwotCWludCBjOwotCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcgJiYgaXNkaWdpdChjKSkgewotCQlhID0gYSoxMC4wICsgKGMgLSAnMCcpOwotCX0KLQlpZiAoYyA9PSAnLicpIHsKLQkJd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJyAmJiBpc2RpZ2l0KGMpKSB7Ci0JCQlhID0gYSoxMC4wICsgKGMgLSAnMCcpOwotCQkJZSA9IGUtMTsKLQkJfQotCX0KLQlpZiAoYyA9PSAnZScgfHwgYyA9PSAnRScpIHsKLQkJaW50IHNpZ24gPSAxOwotCQlpbnQgaSA9IDA7Ci0JCWMgPSAqcysrOwotCQlpZiAoYyA9PSAnKycpCi0JCQljID0gKnMrKzsKLQkJZWxzZSBpZiAoYyA9PSAnLScpIHsKLQkJCWMgPSAqcysrOwotCQkJc2lnbiA9IC0xOwotCQl9Ci0JCXdoaWxlIChpc2RpZ2l0KGMpKSB7Ci0JCQlpID0gaSoxMCArIChjIC0gJzAnKTsKLQkJCWMgPSAqcysrOwotCQl9Ci0JCWUgKz0gaSpzaWduOwotCX0KLQl3aGlsZSAoZSA+IDApIHsKLQkJYSAqPSAxMC4wOwotCQllLS07Ci0JfQotCXdoaWxlIChlIDwgMCkgewotCQlhICo9IDAuMTsKLQkJZSsrOwotCX0KLQlyZXR1cm4gYTsKKyAgICBkb3VibGUgYSA9IDAuMDsKKyAgICBpbnQgZSA9IDA7CisgICAgaW50IGM7CisgICAgd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJyAmJiBpc2RpZ2l0KGMpKSB7CisgICAgICAgIGEgPSBhKjEwLjAgKyAoYyAtICcwJyk7CisgICAgfQorICAgIGlmIChjID09ICcuJykgeworICAgICAgICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnICYmIGlzZGlnaXQoYykpIHsKKyAgICAgICAgICAgIGEgPSBhKjEwLjAgKyAoYyAtICcwJyk7CisgICAgICAgICAgICBlID0gZS0xOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjID09ICdlJyB8fCBjID09ICdFJykgeworICAgICAgICBpbnQgc2lnbiA9IDE7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgYyA9ICpzKys7CisgICAgICAgIGlmIChjID09ICcrJykKKyAgICAgICAgICAgIGMgPSAqcysrOworICAgICAgICBlbHNlIGlmIChjID09ICctJykgeworICAgICAgICAgICAgYyA9ICpzKys7CisgICAgICAgICAgICBzaWduID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGlzZGlnaXQoYykpIHsKKyAgICAgICAgICAgIGkgPSBpKjEwICsgKGMgLSAnMCcpOworICAgICAgICAgICAgYyA9ICpzKys7CisgICAgICAgIH0KKyAgICAgICAgZSArPSBpKnNpZ247CisgICAgfQorICAgIHdoaWxlIChlID4gMCkgeworICAgICAgICBhICo9IDEwLjA7CisgICAgICAgIGUtLTsKKyAgICB9CisgICAgd2hpbGUgKGUgPCAwKSB7CisgICAgICAgIGEgKj0gMC4xOworICAgICAgICBlKys7CisgICAgfQorICAgIHJldHVybiBhOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2JsdGlubW9kdWxlLmMgYi9QeXRob24vYmx0aW5tb2R1bGUuYwppbmRleCA0MDQ0MWQyLi43NjRhZTg3IDEwMDY0NAotLS0gYS9QeXRob24vYmx0aW5tb2R1bGUuYworKysgYi9QeXRob24vYmx0aW5tb2R1bGUuYwpAQCAtMzUsMTkgKzM1LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9fX2ltcG9ydF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJuYW1lIiwgImdsb2JhbHMiLCAibG9jYWxzIiwgImZyb21saXN0IiwKLQkJCQkgImxldmVsIiwgMH07Ci0JY2hhciAqbmFtZTsKLQlQeU9iamVjdCAqZ2xvYmFscyA9IE5VTEw7Ci0JUHlPYmplY3QgKmxvY2FscyA9IE5VTEw7Ci0JUHlPYmplY3QgKmZyb21saXN0ID0gTlVMTDsKLQlpbnQgbGV2ZWwgPSAtMTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAiZ2xvYmFscyIsICJsb2NhbHMiLCAiZnJvbWxpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGV2ZWwiLCAwfTsKKyAgICBjaGFyICpuYW1lOworICAgIFB5T2JqZWN0ICpnbG9iYWxzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbG9jYWxzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZnJvbWxpc3QgPSBOVUxMOworICAgIGludCBsZXZlbCA9IC0xOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInN8T09PaTpfX2ltcG9ydF9fIiwKLQkJCWt3bGlzdCwgJm5hbWUsICZnbG9iYWxzLCAmbG9jYWxzLCAmZnJvbWxpc3QsICZsZXZlbCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbChuYW1lLCBnbG9iYWxzLCBsb2NhbHMsCi0JCQkJCSAgZnJvbWxpc3QsIGxldmVsKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAic3xPT09pOl9faW1wb3J0X18iLAorICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZuYW1lLCAmZ2xvYmFscywgJmxvY2FscywgJmZyb21saXN0LCAmbGV2ZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwobmFtZSwgZ2xvYmFscywgbG9jYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGlzdCwgbGV2ZWwpOwogfQogCiBQeURvY19TVFJWQVIoaW1wb3J0X2RvYywKQEAgLTY4LDcgKzY4LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2FicyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5TnVtYmVyX0Fic29sdXRlKHYpOworICAgIHJldHVybiBQeU51bWJlcl9BYnNvbHV0ZSh2KTsKIH0KIAogUHlEb2NfU1RSVkFSKGFic19kb2MsCkBAIC03OSwzOCArNzksMzggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2FsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKml0LCAqaXRlbTsKLQlQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7Ci0JaW50IGNtcDsKKyAgICBQeU9iamVjdCAqaXQsICppdGVtOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBpbnQgY21wOwogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CiAKLQlmb3IgKDs7KSB7Ci0JCWl0ZW0gPSBpdGVybmV4dChpdCk7Ci0JCWlmIChpdGVtID09IE5VTEwpCi0JCQlicmVhazsKLQkJY21wID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCWlmIChjbXAgPCAwKSB7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGNtcCA9PSAwKSB7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJUHlfUkVUVVJOX0ZBTFNFOwotCQl9Ci0JfQotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfUkVUVVJOX1RSVUU7CisgICAgZm9yICg7OykgeworICAgICAgICBpdGVtID0gaXRlcm5leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNtcCA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAoY21wIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChjbXAgPT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYoaXQpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1JFVFVSTl9UUlVFOwogfQogCiBQeURvY19TVFJWQVIoYWxsX2RvYywKQEAgLTEyMSwzOCArMTIxLDM4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9hbnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICppdCwgKml0ZW07Ci0JUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOwotCWludCBjbXA7CisgICAgUHlPYmplY3QgKml0LCAqaXRlbTsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CisgICAgaW50IGNtcDsKIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OwogCi0JZm9yICg7OykgewotCQlpdGVtID0gaXRlcm5leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWNtcCA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAoY21wIDwgMCkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChjbXAgPT0gMSkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X1JFVFVSTl9UUlVFOwotCQl9Ci0JfQotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfUkVUVVJOX0ZBTFNFOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaXRlbSA9IGl0ZXJuZXh0KGl0KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjbXAgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKGNtcCA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY21wID09IDEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYoaXQpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1JFVFVSTl9GQUxTRTsKIH0KIAogUHlEb2NfU1RSVkFSKGFueV9kb2MsCkBAIC0xNjMsMzkgKzE2MywzOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fYXBwbHkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqYWxpc3QgPSBOVUxMLCAqa3dkaWN0ID0gTlVMTDsKLQlQeU9iamVjdCAqdCA9IE5VTEwsICpyZXR2YWwgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmdW5jLCAqYWxpc3QgPSBOVUxMLCAqa3dkaWN0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdCA9IE5VTEwsICpyZXR2YWwgPSBOVUxMOwogCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJhcHBseSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCi0JCQkgICAidXNlIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKSIsIDEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJhcHBseSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCisgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgZnVuYygqYXJncywgKiprd2FyZ3MpIiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImFwcGx5IiwgMSwgMywgJmZ1bmMsICZhbGlzdCwgJmt3ZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChhbGlzdCAhPSBOVUxMKSB7Ci0JCWlmICghUHlUdXBsZV9DaGVjayhhbGlzdCkpIHsKLQkJCWlmICghUHlTZXF1ZW5jZV9DaGVjayhhbGlzdCkpIHsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgImFwcGx5KCkgYXJnIDIgZXhwZWN0ZWQgc2VxdWVuY2UsIGZvdW5kICVzIiwKLQkJCQkJICAgICBhbGlzdC0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQl0ID0gUHlTZXF1ZW5jZV9UdXBsZShhbGlzdCk7Ci0JCQlpZiAodCA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJYWxpc3QgPSB0OwotCQl9Ci0JfQotCWlmIChrd2RpY3QgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGt3ZGljdCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImFwcGx5KCkgYXJnIDMgZXhwZWN0ZWQgZGljdGlvbmFyeSwgZm91bmQgJXMiLAotCQkJICAgICBrd2RpY3QtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQotCXJldHZhbCA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFsaXN0LCBrd2RpY3QpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImFwcGx5IiwgMSwgMywgJmZ1bmMsICZhbGlzdCwgJmt3ZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhbGlzdCAhPSBOVUxMKSB7CisgICAgICAgIGlmICghUHlUdXBsZV9DaGVjayhhbGlzdCkpIHsKKyAgICAgICAgICAgIGlmICghUHlTZXF1ZW5jZV9DaGVjayhhbGlzdCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImFwcGx5KCkgYXJnIDIgZXhwZWN0ZWQgc2VxdWVuY2UsIGZvdW5kICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGlzdC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ID0gUHlTZXF1ZW5jZV9UdXBsZShhbGlzdCk7CisgICAgICAgICAgICBpZiAodCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgYWxpc3QgPSB0OworICAgICAgICB9CisgICAgfQorICAgIGlmIChrd2RpY3QgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGt3ZGljdCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJhcHBseSgpIGFyZyAzIGV4cGVjdGVkIGRpY3Rpb25hcnksIGZvdW5kICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGt3ZGljdC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgcmV0dmFsID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYWxpc3QsIGt3ZGljdCk7CiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRih0KTsKLQlyZXR1cm4gcmV0dmFsOworICAgIFB5X1hERUNSRUYodCk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogUHlEb2NfU1RSVkFSKGFwcGx5X2RvYywKQEAgLTIxMiw3ICsyMTIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fYmluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLSAgICAgICAgcmV0dXJuIFB5TnVtYmVyX1RvQmFzZSh2LCAyKTsKKyAgICByZXR1cm4gUHlOdW1iZXJfVG9CYXNlKHYsIDIpOwogfQogCiBQeURvY19TVFJWQVIoYmluX2RvYywKQEAgLTIyNCwxMCArMjI0LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9jYWxsYWJsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKFB5RXJyX1dhcm5QeTNrKCJjYWxsYWJsZSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCi0JCQkgICAidXNlIGlzaW5zdGFuY2UoeCwgY29sbGVjdGlvbnMuQ2FsbGFibGUpIiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKVB5Q2FsbGFibGVfQ2hlY2sodikpOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiY2FsbGFibGUoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgorICAgICAgICAgICAgICAgICAgICAgICAidXNlIGlzaW5zdGFuY2UoeCwgY29sbGVjdGlvbnMuQ2FsbGFibGUpIiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKVB5Q2FsbGFibGVfQ2hlY2sodikpOwogfQogCiBQeURvY19TVFJWQVIoY2FsbGFibGVfZG9jLApAQCAtMjQwLDEwOSArMjQwLDEwOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fZmlsdGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZnVuYywgKnNlcSwgKnJlc3VsdCwgKml0LCAqYXJnOwotCVB5X3NzaXplX3QgbGVuOyAgIC8qIGd1ZXNzIGZvciByZXN1bHQgbGlzdCBzaXplICovCi0JcmVnaXN0ZXIgUHlfc3NpemVfdCBqOworICAgIFB5T2JqZWN0ICpmdW5jLCAqc2VxLCAqcmVzdWx0LCAqaXQsICphcmc7CisgICAgUHlfc3NpemVfdCBsZW47ICAgLyogZ3Vlc3MgZm9yIHJlc3VsdCBsaXN0IHNpemUgKi8KKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGo7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJmaWx0ZXIiLCAyLCAyLCAmZnVuYywgJnNlcSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZpbHRlciIsIDIsIDIsICZmdW5jLCAmc2VxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBTdHJpbmdzIGFuZCB0dXBsZXMgcmV0dXJuIGEgcmVzdWx0IG9mIHRoZSBzYW1lIHR5cGUuICovCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHNlcSkpCi0JCXJldHVybiBmaWx0ZXJzdHJpbmcoZnVuYywgc2VxKTsKKyAgICAvKiBTdHJpbmdzIGFuZCB0dXBsZXMgcmV0dXJuIGEgcmVzdWx0IG9mIHRoZSBzYW1lIHR5cGUuICovCisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHNlcSkpCisgICAgICAgIHJldHVybiBmaWx0ZXJzdHJpbmcoZnVuYywgc2VxKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhzZXEpKQotCQlyZXR1cm4gZmlsdGVydW5pY29kZShmdW5jLCBzZXEpOworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soc2VxKSkKKyAgICAgICAgcmV0dXJuIGZpbHRlcnVuaWNvZGUoZnVuYywgc2VxKTsKICNlbmRpZgotCWlmIChQeVR1cGxlX0NoZWNrKHNlcSkpCi0JCXJldHVybiBmaWx0ZXJ0dXBsZShmdW5jLCBzZXEpOworICAgIGlmIChQeVR1cGxlX0NoZWNrKHNlcSkpCisgICAgICAgIHJldHVybiBmaWx0ZXJ0dXBsZShmdW5jLCBzZXEpOwogCi0JLyogUHJlLWFsbG9jYXRlIGFyZ3VtZW50IGxpc3QgdHVwbGUuICovCi0JYXJnID0gUHlUdXBsZV9OZXcoMSk7Ci0JaWYgKGFyZyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBQcmUtYWxsb2NhdGUgYXJndW1lbnQgbGlzdCB0dXBsZS4gKi8KKyAgICBhcmcgPSBQeVR1cGxlX05ldygxKTsKKyAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogR2V0IGl0ZXJhdG9yLiAqLwotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCWlmIChpdCA9PSBOVUxMKQotCQlnb3RvIEZhaWxfYXJnOworICAgIC8qIEdldCBpdGVyYXRvci4gKi8KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsX2FyZzsKIAotCS8qIEd1ZXNzIGEgcmVzdWx0IGxpc3Qgc2l6ZS4gKi8KLQlsZW4gPSBfUHlPYmplY3RfTGVuZ3RoSGludChzZXEsIDgpOwotCWlmIChsZW4gPT0gLTEpCi0JCWdvdG8gRmFpbF9pdDsKKyAgICAvKiBHdWVzcyBhIHJlc3VsdCBsaXN0IHNpemUuICovCisgICAgbGVuID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQoc2VxLCA4KTsKKyAgICBpZiAobGVuID09IC0xKQorICAgICAgICBnb3RvIEZhaWxfaXQ7CiAKLQkvKiBHZXQgYSByZXN1bHQgbGlzdC4gKi8KLQlpZiAoUHlMaXN0X0NoZWNrKHNlcSkgJiYgc2VxLT5vYl9yZWZjbnQgPT0gMSkgewotCQkvKiBFd3cgLSBjYW4gbW9kaWZ5IHRoZSBsaXN0IGluLXBsYWNlLiAqLwotCQlQeV9JTkNSRUYoc2VxKTsKLQkJcmVzdWx0ID0gc2VxOwotCX0KLQllbHNlIHsKLQkJcmVzdWx0ID0gUHlMaXN0X05ldyhsZW4pOwotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQlnb3RvIEZhaWxfaXQ7Ci0JfQorICAgIC8qIEdldCBhIHJlc3VsdCBsaXN0LiAqLworICAgIGlmIChQeUxpc3RfQ2hlY2soc2VxKSAmJiBzZXEtPm9iX3JlZmNudCA9PSAxKSB7CisgICAgICAgIC8qIEV3dyAtIGNhbiBtb2RpZnkgdGhlIGxpc3QgaW4tcGxhY2UuICovCisgICAgICAgIFB5X0lOQ1JFRihzZXEpOworICAgICAgICByZXN1bHQgPSBzZXE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeUxpc3RfTmV3KGxlbik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRmFpbF9pdDsKKyAgICB9CiAKLQkvKiBCdWlsZCB0aGUgcmVzdWx0IGxpc3QuICovCi0JaiA9IDA7Ci0JZm9yICg7OykgewotCQlQeU9iamVjdCAqaXRlbTsKLQkJaW50IG9rOworICAgIC8qIEJ1aWxkIHRoZSByZXN1bHQgbGlzdC4gKi8KKyAgICBqID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtOworICAgICAgICBpbnQgb2s7CiAKLQkJaXRlbSA9IFB5SXRlcl9OZXh0KGl0KTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBGYWlsX3Jlc3VsdF9pdDsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbF9yZXN1bHRfaXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCWlmIChmdW5jID09IChQeU9iamVjdCAqKSZQeUJvb2xfVHlwZSB8fCBmdW5jID09IFB5X05vbmUpIHsKLQkJCW9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOwotCQl9Ci0JCWVsc2UgewotCQkJUHlPYmplY3QgKmdvb2Q7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKGFyZywgMCwgaXRlbSk7Ci0JCQlnb29kID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmcsIE5VTEwpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShhcmcsIDAsIE5VTEwpOwotCQkJaWYgKGdvb2QgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlnb3RvIEZhaWxfcmVzdWx0X2l0OwotCQkJfQotCQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7Ci0JCQlQeV9ERUNSRUYoZ29vZCk7Ci0JCX0KLQkJaWYgKG9rKSB7Ci0JCQlpZiAoaiA8IGxlbikKLQkJCQlQeUxpc3RfU0VUX0lURU0ocmVzdWx0LCBqLCBpdGVtKTsKLQkJCWVsc2UgewotCQkJCWludCBzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKHJlc3VsdCwgaXRlbSk7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCQlnb3RvIEZhaWxfcmVzdWx0X2l0OwotCQkJfQotCQkJKytqOwotCQl9Ci0JCWVsc2UKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQl9CisgICAgICAgIGlmIChmdW5jID09IChQeU9iamVjdCAqKSZQeUJvb2xfVHlwZSB8fCBmdW5jID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKmdvb2Q7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZywgMCwgaXRlbSk7CisgICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmcsIE5VTEwpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmcsIDAsIE5VTEwpOworICAgICAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfcmVzdWx0X2l0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZ29vZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBpZiAoaiA8IGxlbikKKyAgICAgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmVzdWx0LCBqLCBpdGVtKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCBzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKHJlc3VsdCwgaXRlbSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWxfcmVzdWx0X2l0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytqOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CiAKIAotCS8qIEN1dCBiYWNrIHJlc3VsdCBsaXN0IGlmIGxlbiBpcyB0b28gYmlnLiAqLwotCWlmIChqIDwgbGVuICYmIFB5TGlzdF9TZXRTbGljZShyZXN1bHQsIGosIGxlbiwgTlVMTCkgPCAwKQotCQlnb3RvIEZhaWxfcmVzdWx0X2l0OworICAgIC8qIEN1dCBiYWNrIHJlc3VsdCBsaXN0IGlmIGxlbiBpcyB0b28gYmlnLiAqLworICAgIGlmIChqIDwgbGVuICYmIFB5TGlzdF9TZXRTbGljZShyZXN1bHQsIGosIGxlbiwgTlVMTCkgPCAwKQorICAgICAgICBnb3RvIEZhaWxfcmVzdWx0X2l0OwogCi0JUHlfREVDUkVGKGl0KTsKLQlQeV9ERUNSRUYoYXJnKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgUHlfREVDUkVGKGFyZyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogRmFpbF9yZXN1bHRfaXQ6Ci0JUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CiBGYWlsX2l0OgotCVB5X0RFQ1JFRihpdCk7CisgICAgUHlfREVDUkVGKGl0KTsKIEZhaWxfYXJnOgotCVB5X0RFQ1JFRihhcmcpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihhcmcpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoZmlsdGVyX2RvYywKQEAgLTM1NSwxMyArMzU1LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9mb3JtYXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2YWx1ZTsKLQlQeU9iamVjdCAqZm9ybWF0X3NwZWMgPSBOVUxMOworICAgIFB5T2JqZWN0ICp2YWx1ZTsKKyAgICBQeU9iamVjdCAqZm9ybWF0X3NwZWMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE86Zm9ybWF0IiwgJnZhbHVlLCAmZm9ybWF0X3NwZWMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98Tzpmb3JtYXQiLCAmdmFsdWUsICZmb3JtYXRfc3BlYykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5T2JqZWN0X0Zvcm1hdCh2YWx1ZSwgZm9ybWF0X3NwZWMpOworICAgIHJldHVybiBQeU9iamVjdF9Gb3JtYXQodmFsdWUsIGZvcm1hdF9zcGVjKTsKIH0KIAogUHlEb2NfU1RSVkFSKGZvcm1hdF9kb2MsCkBAIC0zNzMsMTggKzM3MywxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fY2hyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHg7Ci0JY2hhciBzWzFdOworICAgIGxvbmcgeDsKKyAgICBjaGFyIHNbMV07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6Y2hyIiwgJngpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoeCA8IDAgfHwgeCA+PSAyNTYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNocigpIGFyZyBub3QgaW4gcmFuZ2UoMjU2KSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc1swXSA9IChjaGFyKXg7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIDEpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpjaHIiLCAmeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh4IDwgMCB8fCB4ID49IDI1NikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjaHIoKSBhcmcgbm90IGluIHJhbmdlKDI1NikiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNbMF0gPSAoY2hhcil4OworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAxKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNocl9kb2MsCkBAIC0zOTcsMTIgKzM5NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fdW5pY2hyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeDsKKyAgICBpbnQgeDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTp1bmljaHIiLCAmeCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTp1bmljaHIiLCAmeCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5VW5pY29kZV9Gcm9tT3JkaW5hbCh4KTsKKyAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21PcmRpbmFsKHgpOwogfQogCiBQeURvY19TVFJWQVIodW5pY2hyX2RvYywKQEAgLTQxNSwxNCArNDE1LDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9jbXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICphLCAqYjsKLQlpbnQgYzsKKyAgICBQeU9iamVjdCAqYSwgKmI7CisgICAgaW50IGM7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjbXAiLCAyLCAyLCAmYSwgJmIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlPYmplY3RfQ21wKGEsIGIsICZjKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyljKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjbXAiLCAyLCAyLCAmYSwgJmIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlPYmplY3RfQ21wKGEsIGIsICZjKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyljKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNtcF9kb2MsCkBAIC00MzQsMjAgKzQzNCwyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fY29lcmNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdiwgKnc7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqdiwgKnc7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChQeUVycl9XYXJuUHkzaygiY29lcmNlKCkgbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiY29lcmNlKCkgbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY29lcmNlIiwgMiwgMiwgJnYsICZ3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5TnVtYmVyX0NvZXJjZSgmdiwgJncpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gUHlUdXBsZV9QYWNrKDIsIHYsIHcpOwotCVB5X0RFQ1JFRih2KTsKLQlQeV9ERUNSRUYodyk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjb2VyY2UiLCAyLCAyLCAmdiwgJncpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlOdW1iZXJfQ29lcmNlKCZ2LCAmdykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBQeVR1cGxlX1BhY2soMiwgdiwgdyk7CisgICAgUHlfREVDUkVGKHYpOworICAgIFB5X0RFQ1JFRih3KTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBQeURvY19TVFJWQVIoY29lcmNlX2RvYywKQEAgLTQ2MCw5OCArNDYwLDk4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9jb21waWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JY2hhciAqc3RyOwotCWNoYXIgKmZpbGVuYW1lOwotCWNoYXIgKnN0YXJ0c3RyOwotCWludCBtb2RlID0gLTE7Ci0JaW50IGRvbnRfaW5oZXJpdCA9IDA7Ci0JaW50IHN1cHBsaWVkX2ZsYWdzID0gMDsKLQlpbnQgaXNfYXN0OwotCVB5Q29tcGlsZXJGbGFncyBjZjsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTCwgKmNtZCwgKnRtcCA9IE5VTEw7Ci0JUHlfc3NpemVfdCBsZW5ndGg7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzb3VyY2UiLCAiZmlsZW5hbWUiLCAibW9kZSIsICJmbGFncyIsCi0JCQkJICJkb250X2luaGVyaXQiLCBOVUxMfTsKLQlpbnQgc3RhcnRbXSA9IHtQeV9maWxlX2lucHV0LCBQeV9ldmFsX2lucHV0LCBQeV9zaW5nbGVfaW5wdXR9OworICAgIGNoYXIgKnN0cjsKKyAgICBjaGFyICpmaWxlbmFtZTsKKyAgICBjaGFyICpzdGFydHN0cjsKKyAgICBpbnQgbW9kZSA9IC0xOworICAgIGludCBkb250X2luaGVyaXQgPSAwOworICAgIGludCBzdXBwbGllZF9mbGFncyA9IDA7CisgICAgaW50IGlzX2FzdDsKKyAgICBQeUNvbXBpbGVyRmxhZ3MgY2Y7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEwsICpjbWQsICp0bXAgPSBOVUxMOworICAgIFB5X3NzaXplX3QgbGVuZ3RoOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic291cmNlIiwgImZpbGVuYW1lIiwgIm1vZGUiLCAiZmxhZ3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG9udF9pbmhlcml0IiwgTlVMTH07CisgICAgaW50IHN0YXJ0W10gPSB7UHlfZmlsZV9pbnB1dCwgUHlfZXZhbF9pbnB1dCwgUHlfc2luZ2xlX2lucHV0fTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPc3N8aWk6Y29tcGlsZSIsCi0JCQkJCSBrd2xpc3QsICZjbWQsICZmaWxlbmFtZSwgJnN0YXJ0c3RyLAotCQkJCQkgJnN1cHBsaWVkX2ZsYWdzLCAmZG9udF9pbmhlcml0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9zc3xpaTpjb21waWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZjbWQsICZmaWxlbmFtZSwgJnN0YXJ0c3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdXBwbGllZF9mbGFncywgJmRvbnRfaW5oZXJpdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY2YuY2ZfZmxhZ3MgPSBzdXBwbGllZF9mbGFnczsKKyAgICBjZi5jZl9mbGFncyA9IHN1cHBsaWVkX2ZsYWdzOwogCi0JaWYgKHN1cHBsaWVkX2ZsYWdzICYKLQkgICAgfihQeUNGX01BU0sgfCBQeUNGX01BU0tfT0JTT0xFVEUgfCBQeUNGX0RPTlRfSU1QTFlfREVERU5UIHwgUHlDRl9PTkxZX0FTVCkpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY29tcGlsZSgpOiB1bnJlY29nbmlzZWQgZmxhZ3MiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFhYWCBXYXJuIGlmIChzdXBwbGllZF9mbGFncyAmIFB5Q0ZfTUFTS19PQlNPTEVURSkgIT0gMD8gKi8KKyAgICBpZiAoc3VwcGxpZWRfZmxhZ3MgJgorICAgICAgICB+KFB5Q0ZfTUFTSyB8IFB5Q0ZfTUFTS19PQlNPTEVURSB8IFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQgfCBQeUNGX09OTFlfQVNUKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGUoKTogdW5yZWNvZ25pc2VkIGZsYWdzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBYWFggV2FybiBpZiAoc3VwcGxpZWRfZmxhZ3MgJiBQeUNGX01BU0tfT0JTT0xFVEUpICE9IDA/ICovCiAKLQlpZiAoIWRvbnRfaW5oZXJpdCkgewotCQlQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKCZjZik7Ci0JfQorICAgIGlmICghZG9udF9pbmhlcml0KSB7CisgICAgICAgIFB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKTsKKyAgICB9CiAKLQlpZiAoc3RyY21wKHN0YXJ0c3RyLCAiZXhlYyIpID09IDApCi0JCW1vZGUgPSAwOwotCWVsc2UgaWYgKHN0cmNtcChzdGFydHN0ciwgImV2YWwiKSA9PSAwKQotCQltb2RlID0gMTsKLQllbHNlIGlmIChzdHJjbXAoc3RhcnRzdHIsICJzaW5nbGUiKSA9PSAwKQotCQltb2RlID0gMjsKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNvbXBpbGUoKSBhcmcgMyBtdXN0IGJlICdleGVjJywgJ2V2YWwnIG9yICdzaW5nbGUnIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc3RyY21wKHN0YXJ0c3RyLCAiZXhlYyIpID09IDApCisgICAgICAgIG1vZGUgPSAwOworICAgIGVsc2UgaWYgKHN0cmNtcChzdGFydHN0ciwgImV2YWwiKSA9PSAwKQorICAgICAgICBtb2RlID0gMTsKKyAgICBlbHNlIGlmIChzdHJjbXAoc3RhcnRzdHIsICJzaW5nbGUiKSA9PSAwKQorICAgICAgICBtb2RlID0gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZSgpIGFyZyAzIG11c3QgYmUgJ2V4ZWMnLCAnZXZhbCcgb3IgJ3NpbmdsZSciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaXNfYXN0ID0gUHlBU1RfQ2hlY2soY21kKTsKLQlpZiAoaXNfYXN0ID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoaXNfYXN0KSB7Ci0JCWlmIChzdXBwbGllZF9mbGFncyAmIFB5Q0ZfT05MWV9BU1QpIHsKLQkJCVB5X0lOQ1JFRihjbWQpOwotCQkJcmVzdWx0ID0gY21kOwotCQl9Ci0JCWVsc2UgewotCQkJUHlBcmVuYSAqYXJlbmE7Ci0JCQltb2RfdHkgbW9kOworICAgIGlzX2FzdCA9IFB5QVNUX0NoZWNrKGNtZCk7CisgICAgaWYgKGlzX2FzdCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGlzX2FzdCkgeworICAgICAgICBpZiAoc3VwcGxpZWRfZmxhZ3MgJiBQeUNGX09OTFlfQVNUKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoY21kKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNtZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hOworICAgICAgICAgICAgbW9kX3R5IG1vZDsKIAotCQkJYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCQkJbW9kID0gUHlBU1Rfb2JqMm1vZChjbWQsIGFyZW5hLCBtb2RlKTsKLQkJCWlmIChtb2QgPT0gTlVMTCkgewotCQkJCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlyZXN1bHQgPSAoUHlPYmplY3QqKVB5QVNUX0NvbXBpbGUobW9kLCBmaWxlbmFtZSwKLQkJCQkJCQkgICZjZiwgYXJlbmEpOwotCQkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICAgICAgICAgIGFyZW5hID0gUHlBcmVuYV9OZXcoKTsKKyAgICAgICAgICAgIG1vZCA9IFB5QVNUX29iajJtb2QoY21kLCBhcmVuYSwgbW9kZSk7CisgICAgICAgICAgICBpZiAobW9kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gKFB5T2JqZWN0KilQeUFTVF9Db21waWxlKG1vZCwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNmLCBhcmVuYSk7CisgICAgICAgICAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2soY21kKSkgewotCQl0bXAgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGNtZCk7Ci0JCWlmICh0bXAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQljbWQgPSB0bXA7Ci0JCWNmLmNmX2ZsYWdzIHw9IFB5Q0ZfU09VUkNFX0lTX1VURjg7Ci0JfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soY21kKSkgeworICAgICAgICB0bXAgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGNtZCk7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjbWQgPSB0bXA7CisgICAgICAgIGNmLmNmX2ZsYWdzIHw9IFB5Q0ZfU09VUkNFX0lTX1VURjg7CisgICAgfQogI2VuZGlmCiAKLQlpZiAoUHlPYmplY3RfQXNSZWFkQnVmZmVyKGNtZCwgKGNvbnN0IHZvaWQgKiopJnN0ciwgJmxlbmd0aCkpCi0JCWdvdG8gY2xlYW51cDsKLQlpZiAoKHNpemVfdClsZW5ndGggIT0gc3RybGVuKHN0cikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY29tcGlsZSgpIGV4cGVjdGVkIHN0cmluZyB3aXRob3V0IG51bGwgYnl0ZXMiKTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQlyZXN1bHQgPSBQeV9Db21waWxlU3RyaW5nRmxhZ3Moc3RyLCBmaWxlbmFtZSwgc3RhcnRbbW9kZV0sICZjZik7CisgICAgaWYgKFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihjbWQsIChjb25zdCB2b2lkICoqKSZzdHIsICZsZW5ndGgpKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgaWYgKChzaXplX3QpbGVuZ3RoICE9IHN0cmxlbihzdHIpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZSgpIGV4cGVjdGVkIHN0cmluZyB3aXRob3V0IG51bGwgYnl0ZXMiKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyAgICByZXN1bHQgPSBQeV9Db21waWxlU3RyaW5nRmxhZ3Moc3RyLCBmaWxlbmFtZSwgc3RhcnRbbW9kZV0sICZjZik7CiBjbGVhbnVwOgotCVB5X1hERUNSRUYodG1wKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoY29tcGlsZV9kb2MsCkBAIC01NzIsMTEgKzU3MiwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fZGlyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqYXJnID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRpciIsIDAsIDEsICZhcmcpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlPYmplY3RfRGlyKGFyZyk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZGlyIiwgMCwgMSwgJmFyZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeU9iamVjdF9EaXIoYXJnKTsKIH0KIAogUHlEb2NfU1RSVkFSKGRpcl9kb2MsCkBAIC01OTYsMTEgKzU5NiwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fZGl2bW9kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdiwgKnc7CisgICAgUHlPYmplY3QgKnYsICp3OwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZGl2bW9kIiwgMiwgMiwgJnYsICZ3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TnVtYmVyX0Rpdm1vZCh2LCB3KTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkaXZtb2QiLCAyLCAyLCAmdiwgJncpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlOdW1iZXJfRGl2bW9kKHYsIHcpOwogfQogCiBQeURvY19TVFJWQVIoZGl2bW9kX2RvYywKQEAgLTYxMiw4MSArNjEyLDgxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9ldmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqY21kLCAqcmVzdWx0LCAqdG1wID0gTlVMTDsKLQlQeU9iamVjdCAqZ2xvYmFscyA9IFB5X05vbmUsICpsb2NhbHMgPSBQeV9Ob25lOwotCWNoYXIgKnN0cjsKLQlQeUNvbXBpbGVyRmxhZ3MgY2Y7CisgICAgUHlPYmplY3QgKmNtZCwgKnJlc3VsdCwgKnRtcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmdsb2JhbHMgPSBQeV9Ob25lLCAqbG9jYWxzID0gUHlfTm9uZTsKKyAgICBjaGFyICpzdHI7CisgICAgUHlDb21waWxlckZsYWdzIGNmOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZXZhbCIsIDEsIDMsICZjbWQsICZnbG9iYWxzLCAmbG9jYWxzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGxvY2FscyAhPSBQeV9Ob25lICYmICFQeU1hcHBpbmdfQ2hlY2sobG9jYWxzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibG9jYWxzIG11c3QgYmUgYSBtYXBwaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZ2xvYmFscyAhPSBQeV9Ob25lICYmICFQeURpY3RfQ2hlY2soZ2xvYmFscykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgUHlNYXBwaW5nX0NoZWNrKGdsb2JhbHMpID8KLQkJCSJnbG9iYWxzIG11c3QgYmUgYSByZWFsIGRpY3Q7IHRyeSBldmFsKGV4cHIsIHt9LCBtYXBwaW5nKSIKLQkJCTogImdsb2JhbHMgbXVzdCBiZSBhIGRpY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChnbG9iYWxzID09IFB5X05vbmUpIHsKLQkJZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7Ci0JCWlmIChsb2NhbHMgPT0gUHlfTm9uZSkKLQkJCWxvY2FscyA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKLQl9Ci0JZWxzZSBpZiAobG9jYWxzID09IFB5X05vbmUpCi0JCWxvY2FscyA9IGdsb2JhbHM7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZXZhbCIsIDEsIDMsICZjbWQsICZnbG9iYWxzLCAmbG9jYWxzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGxvY2FscyAhPSBQeV9Ob25lICYmICFQeU1hcHBpbmdfQ2hlY2sobG9jYWxzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibG9jYWxzIG11c3QgYmUgYSBtYXBwaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZ2xvYmFscyAhPSBQeV9Ob25lICYmICFQeURpY3RfQ2hlY2soZ2xvYmFscykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgUHlNYXBwaW5nX0NoZWNrKGdsb2JhbHMpID8KKyAgICAgICAgICAgICJnbG9iYWxzIG11c3QgYmUgYSByZWFsIGRpY3Q7IHRyeSBldmFsKGV4cHIsIHt9LCBtYXBwaW5nKSIKKyAgICAgICAgICAgIDogImdsb2JhbHMgbXVzdCBiZSBhIGRpY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChnbG9iYWxzID09IFB5X05vbmUpIHsKKyAgICAgICAgZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7CisgICAgICAgIGlmIChsb2NhbHMgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIGxvY2FscyA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKKyAgICB9CisgICAgZWxzZSBpZiAobG9jYWxzID09IFB5X05vbmUpCisgICAgICAgIGxvY2FscyA9IGdsb2JhbHM7CiAKLQlpZiAoZ2xvYmFscyA9PSBOVUxMIHx8IGxvY2FscyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotCQkJImV2YWwgbXVzdCBiZSBnaXZlbiBnbG9iYWxzIGFuZCBsb2NhbHMgIgotCQkJIndoZW4gY2FsbGVkIHdpdGhvdXQgYSBmcmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGdsb2JhbHMgPT0gTlVMTCB8fCBsb2NhbHMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImV2YWwgbXVzdCBiZSBnaXZlbiBnbG9iYWxzIGFuZCBsb2NhbHMgIgorICAgICAgICAgICAgIndoZW4gY2FsbGVkIHdpdGhvdXQgYSBmcmFtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpIHsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iLAotCQkJCQkgUHlFdmFsX0dldEJ1aWx0aW5zKCkpICE9IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRCdWlsdGlucygpKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKFB5Q29kZV9DaGVjayhjbWQpKSB7Ci0JCWlmIChQeUNvZGVfR2V0TnVtRnJlZSgoUHlDb2RlT2JqZWN0ICopY21kKSA+IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSJjb2RlIG9iamVjdCBwYXNzZWQgdG8gZXZhbCgpIG1heSBub3QgY29udGFpbiBmcmVlIHZhcmlhYmxlcyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIFB5RXZhbF9FdmFsQ29kZSgoUHlDb2RlT2JqZWN0ICopIGNtZCwgZ2xvYmFscywgbG9jYWxzKTsKLQl9CisgICAgaWYgKFB5Q29kZV9DaGVjayhjbWQpKSB7CisgICAgICAgIGlmIChQeUNvZGVfR2V0TnVtRnJlZSgoUHlDb2RlT2JqZWN0ICopY21kKSA+IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICJjb2RlIG9iamVjdCBwYXNzZWQgdG8gZXZhbCgpIG1heSBub3QgY29udGFpbiBmcmVlIHZhcmlhYmxlcyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5RXZhbF9FdmFsQ29kZSgoUHlDb2RlT2JqZWN0ICopIGNtZCwgZ2xvYmFscywgbG9jYWxzKTsKKyAgICB9CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKGNtZCkgJiYKLQkgICAgIVB5VW5pY29kZV9DaGVjayhjbWQpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAiZXZhbCgpIGFyZyAxIG11c3QgYmUgYSBzdHJpbmcgb3IgY29kZSBvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNmLmNmX2ZsYWdzID0gMDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGNtZCkgJiYKKyAgICAgICAgIVB5VW5pY29kZV9DaGVjayhjbWQpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgImV2YWwoKSBhcmcgMSBtdXN0IGJlIGEgc3RyaW5nIG9yIGNvZGUgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjZi5jZl9mbGFncyA9IDA7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhjbWQpKSB7Ci0JCXRtcCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoY21kKTsKLQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWNtZCA9IHRtcDsKLQkJY2YuY2ZfZmxhZ3MgfD0gUHlDRl9TT1VSQ0VfSVNfVVRGODsKLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhjbWQpKSB7CisgICAgICAgIHRtcCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoY21kKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNtZCA9IHRtcDsKKyAgICAgICAgY2YuY2ZfZmxhZ3MgfD0gUHlDRl9TT1VSQ0VfSVNfVVRGODsKKyAgICB9CiAjZW5kaWYKLQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGNtZCwgJnN0ciwgTlVMTCkpIHsKLQkJUHlfWERFQ1JFRih0bXApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJ1x0JykKLQkJc3RyKys7CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShjbWQsICZzdHIsIE5VTEwpKSB7CisgICAgICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICdcdCcpCisgICAgICAgIHN0cisrOwogCi0JKHZvaWQpUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpOwotCXJlc3VsdCA9IFB5UnVuX1N0cmluZ0ZsYWdzKHN0ciwgUHlfZXZhbF9pbnB1dCwgZ2xvYmFscywgbG9jYWxzLCAmY2YpOwotCVB5X1hERUNSRUYodG1wKTsKLQlyZXR1cm4gcmVzdWx0OworICAgICh2b2lkKVB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKTsKKyAgICByZXN1bHQgPSBQeVJ1bl9TdHJpbmdGbGFncyhzdHIsIFB5X2V2YWxfaW5wdXQsIGdsb2JhbHMsIGxvY2FscywgJmNmKTsKKyAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGV2YWxfZG9jLApAQCAtNzAzLDk4ICs3MDMsOTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2V4ZWNmaWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmaWxlbmFtZTsKLQlQeU9iamVjdCAqZ2xvYmFscyA9IFB5X05vbmUsICpsb2NhbHMgPSBQeV9Ob25lOwotCVB5T2JqZWN0ICpyZXM7Ci0JRklMRSogZnAgPSBOVUxMOwotCVB5Q29tcGlsZXJGbGFncyBjZjsKLQlpbnQgZXhpc3RzOworICAgIGNoYXIgKmZpbGVuYW1lOworICAgIFB5T2JqZWN0ICpnbG9iYWxzID0gUHlfTm9uZSwgKmxvY2FscyA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBGSUxFKiBmcCA9IE5VTEw7CisgICAgUHlDb21waWxlckZsYWdzIGNmOworICAgIGludCBleGlzdHM7CiAKLQlpZiAoUHlFcnJfV2FyblB5M2soImV4ZWNmaWxlKCkgbm90IHN1cHBvcnRlZCBpbiAzLng7IHVzZSBleGVjKCkiLAotCQkJICAgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImV4ZWNmaWxlKCkgbm90IHN1cHBvcnRlZCBpbiAzLng7IHVzZSBleGVjKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfE8hTzpleGVjZmlsZSIsCi0JCQkmZmlsZW5hbWUsCi0JCQkmUHlEaWN0X1R5cGUsICZnbG9iYWxzLAotCQkJJmxvY2FscykpCi0JCXJldHVybiBOVUxMOwotCWlmIChsb2NhbHMgIT0gUHlfTm9uZSAmJiAhUHlNYXBwaW5nX0NoZWNrKGxvY2FscykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxvY2FscyBtdXN0IGJlIGEgbWFwcGluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGdsb2JhbHMgPT0gUHlfTm9uZSkgewotCQlnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKLQkJaWYgKGxvY2FscyA9PSBQeV9Ob25lKQotCQkJbG9jYWxzID0gUHlFdmFsX0dldExvY2FscygpOwotCX0KLQllbHNlIGlmIChsb2NhbHMgPT0gUHlfTm9uZSkKLQkJbG9jYWxzID0gZ2xvYmFsczsKLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpIHsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iLAotCQkJCQkgUHlFdmFsX0dldEJ1aWx0aW5zKCkpICE9IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfE8hTzpleGVjZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICZmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgJlB5RGljdF9UeXBlLCAmZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgJmxvY2FscykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChsb2NhbHMgIT0gUHlfTm9uZSAmJiAhUHlNYXBwaW5nX0NoZWNrKGxvY2FscykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxvY2FscyBtdXN0IGJlIGEgbWFwcGluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGdsb2JhbHMgPT0gUHlfTm9uZSkgeworICAgICAgICBnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKKyAgICAgICAgaWYgKGxvY2FscyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgbG9jYWxzID0gUHlFdmFsX0dldExvY2FscygpOworICAgIH0KKyAgICBlbHNlIGlmIChsb2NhbHMgPT0gUHlfTm9uZSkKKyAgICAgICAgbG9jYWxzID0gZ2xvYmFsczsKKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEJ1aWx0aW5zKCkpICE9IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlleGlzdHMgPSAwOwotCS8qIFRlc3QgZm9yIGV4aXN0ZW5jZSBvciBkaXJlY3RvcnkuICovCisgICAgZXhpc3RzID0gMDsKKyAgICAvKiBUZXN0IGZvciBleGlzdGVuY2Ugb3IgZGlyZWN0b3J5LiAqLwogI2lmIGRlZmluZWQoUExBTjkpCi0JewotCQlEaXIgKmQ7CisgICAgeworICAgICAgICBEaXIgKmQ7CiAKLQkJaWYgKChkID0gZGlyc3RhdChmaWxlbmFtZSkpIT1uaWwpIHsKLQkJCWlmKGQtPm1vZGUgJiBETURJUikKLQkJCQl3ZXJyc3RyKCJpcyBhIGRpcmVjdG9yeSIpOwotCQkJZWxzZQotCQkJCWV4aXN0cyA9IDE7Ci0JCQlmcmVlKGQpOwotCQl9Ci0JfQorICAgICAgICBpZiAoKGQgPSBkaXJzdGF0KGZpbGVuYW1lKSkhPW5pbCkgeworICAgICAgICAgICAgaWYoZC0+bW9kZSAmIERNRElSKQorICAgICAgICAgICAgICAgIHdlcnJzdHIoImlzIGEgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXhpc3RzID0gMTsKKyAgICAgICAgICAgIGZyZWUoZCk7CisgICAgICAgIH0KKyAgICB9CiAjZWxpZiBkZWZpbmVkKFJJU0NPUykKLQlpZiAob2JqZWN0X2V4aXN0cyhmaWxlbmFtZSkpIHsKLQkJaWYgKGlzZGlyKGZpbGVuYW1lKSkKLQkJCWVycm5vID0gRUlTRElSOwotCQllbHNlCi0JCQlleGlzdHMgPSAxOwotCX0KLSNlbHNlCS8qIHN0YW5kYXJkIFBvc2l4ICovCi0JewotCQlzdHJ1Y3Qgc3RhdCBzOwotCQlpZiAoc3RhdChmaWxlbmFtZSwgJnMpID09IDApIHsKLQkJCWlmIChTX0lTRElSKHMuc3RfbW9kZSkpCi0jCQkJCWlmIGRlZmluZWQoUFlPU19PUzIpICYmIGRlZmluZWQoUFlDQ19WQUNQUCkKLQkJCQkJZXJybm8gPSBFT1MyRVJSOwotIwkJCQllbHNlCi0JCQkJCWVycm5vID0gRUlTRElSOwotIwkJCQllbmRpZgotCQkJZWxzZQotCQkJCWV4aXN0cyA9IDE7Ci0JCX0KLQl9CisgICAgaWYgKG9iamVjdF9leGlzdHMoZmlsZW5hbWUpKSB7CisgICAgICAgIGlmIChpc2RpcihmaWxlbmFtZSkpCisgICAgICAgICAgICBlcnJubyA9IEVJU0RJUjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpc3RzID0gMTsKKyAgICB9CisjZWxzZSAgIC8qIHN0YW5kYXJkIFBvc2l4ICovCisgICAgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBzOworICAgICAgICBpZiAoc3RhdChmaWxlbmFtZSwgJnMpID09IDApIHsKKyAgICAgICAgICAgIGlmIChTX0lTRElSKHMuc3RfbW9kZSkpCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQoUFlPU19PUzIpICYmIGRlZmluZWQoUFlDQ19WQUNQUCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyA9IEVPUzJFUlI7CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyA9IEVJU0RJUjsKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBleGlzdHMgPSAxOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKLSAgICAgICAgaWYgKGV4aXN0cykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWZwID0gZm9wZW4oZmlsZW5hbWUsICJyIiBQWV9TVERJT1RFWFRNT0RFKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoZXhpc3RzKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiIFBZX1NURElPVEVYVE1PREUpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JCWlmIChmcCA9PSBOVUxMKSB7Ci0JCQlleGlzdHMgPSAwOwotCQl9CisgICAgICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBleGlzdHMgPSAwOwogICAgICAgICB9CisgICAgfQogCi0JaWYgKCFleGlzdHMpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5RXhjX0lPRXJyb3IsIGZpbGVuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNmLmNmX2ZsYWdzID0gMDsKLQlpZiAoUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpKQotCQlyZXMgPSBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgZmlsZW5hbWUsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsCi0JCQkJICAgbG9jYWxzLCAxLCAmY2YpOwotCWVsc2UKLQkJcmVzID0gUHlSdW5fRmlsZUV4KGZwLCBmaWxlbmFtZSwgUHlfZmlsZV9pbnB1dCwgZ2xvYmFscywKLQkJCQkgICBsb2NhbHMsIDEpOwotCXJldHVybiByZXM7CisgICAgaWYgKCFleGlzdHMpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5RXhjX0lPRXJyb3IsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNmLmNmX2ZsYWdzID0gMDsKKyAgICBpZiAoUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpKQorICAgICAgICByZXMgPSBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgZmlsZW5hbWUsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHMsIDEsICZjZik7CisgICAgZWxzZQorICAgICAgICByZXMgPSBQeVJ1bl9GaWxlRXgoZnAsIGZpbGVuYW1lLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxzLCAxKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBQeURvY19TVFJWQVIoZXhlY2ZpbGVfZG9jLApAQCAtODA4LDMzICs4MDgsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2dldGF0dHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2LCAqcmVzdWx0LCAqZGZsdCA9IE5VTEw7Ci0JUHlPYmplY3QgKm5hbWU7CisgICAgUHlPYmplY3QgKnYsICpyZXN1bHQsICpkZmx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbmFtZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImdldGF0dHIiLCAyLCAzLCAmdiwgJm5hbWUsICZkZmx0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZ2V0YXR0ciIsIDIsIDMsICZ2LCAmbmFtZSwgJmRmbHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgewotCQluYW1lID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgbmFtZSA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJnZXRhdHRyKCk6IGF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHQgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOwotCWlmIChyZXN1bHQgPT0gTlVMTCAmJiBkZmx0ICE9IE5VTEwgJiYKLQkgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JewotCQlQeUVycl9DbGVhcigpOwotCQlQeV9JTkNSRUYoZGZsdCk7Ci0JCXJlc3VsdCA9IGRmbHQ7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImdldGF0dHIoKTogYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMICYmIGRmbHQgIT0gTlVMTCAmJgorICAgICAgICBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X0lOQ1JFRihkZmx0KTsKKyAgICAgICAgcmVzdWx0ID0gZGZsdDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGdldGF0dHJfZG9jLApAQCAtODQ4LDExICs4NDgsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2dsb2JhbHMoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAKLQlkID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKLQlQeV9YSU5DUkVGKGQpOwotCXJldHVybiBkOworICAgIGQgPSBQeUV2YWxfR2V0R2xvYmFscygpOworICAgIFB5X1hJTkNSRUYoZCk7CisgICAgcmV0dXJuIGQ7CiB9CiAKIFB5RG9jX1NUUlZBUihnbG9iYWxzX2RvYywKQEAgLTg2NCwzNyArODY0LDM3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9oYXNhdHRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdjsKLQlQeU9iamVjdCAqbmFtZTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqbmFtZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhhc2F0dHIiLCAyLCAyLCAmdiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoYXNhdHRyIiwgMiwgMiwgJnYsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKLQkJbmFtZSA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7CisgICAgICAgIG5hbWUgPSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcobmFtZSwgTlVMTCk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCWlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiaGFzYXR0cigpOiBhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdiA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZSk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfRXhjZXB0aW9uKSkKLQkJCXJldHVybiBOVUxMOwotCQllbHNlIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeV9JTkNSRUYoUHlfRmFsc2UpOwotCQkJcmV0dXJuIFB5X0ZhbHNlOwotCQl9Ci0JfQotCVB5X0RFQ1JFRih2KTsKLQlQeV9JTkNSRUYoUHlfVHJ1ZSk7Ci0JcmV0dXJuIFB5X1RydWU7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImhhc2F0dHIoKTogYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHYgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0V4Y2VwdGlvbikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X0ZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBQeV9GYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYodik7CisgICAgUHlfSU5DUkVGKFB5X1RydWUpOworICAgIHJldHVybiBQeV9UcnVlOwogfQogCiBQeURvY19TVFJWQVIoaGFzYXR0cl9kb2MsCkBAIC05MDcsNyArOTA3LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2lkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHYpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIodik7CiB9CiAKIFB5RG9jX1NUUlZBUihpZF9kb2MsCkBAIC05MjAsMTU0ICs5MjAsMTU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9tYXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXR5cGVkZWYgc3RydWN0IHsKLQkJUHlPYmplY3QgKml0OwkvKiB0aGUgaXRlcmF0b3Igb2JqZWN0ICovCi0JCWludCBzYXdfU3RvcEl0ZXJhdGlvbjsgIC8qIGJvb2w6ICBkaWQgdGhlIGl0ZXJhdG9yIGVuZD8gKi8KLQl9IHNlcXVlbmNlOworICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgUHlPYmplY3QgKml0OyAgICAgICAgICAgLyogdGhlIGl0ZXJhdG9yIG9iamVjdCAqLworICAgICAgICBpbnQgc2F3X1N0b3BJdGVyYXRpb247ICAvKiBib29sOiAgZGlkIHRoZSBpdGVyYXRvciBlbmQ/ICovCisgICAgfSBzZXF1ZW5jZTsKIAotCVB5T2JqZWN0ICpmdW5jLCAqcmVzdWx0OwotCXNlcXVlbmNlICpzZXFzID0gTlVMTCwgKnNxcDsKLQlQeV9zc2l6ZV90IG4sIGxlbjsKLQlyZWdpc3RlciBpbnQgaSwgajsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlc3VsdDsKKyAgICBzZXF1ZW5jZSAqc2VxcyA9IE5VTEwsICpzcXA7CisgICAgUHlfc3NpemVfdCBuLCBsZW47CisgICAgcmVnaXN0ZXIgaW50IGksIGo7CiAKLQluID0gUHlUdXBsZV9TaXplKGFyZ3MpOwotCWlmIChuIDwgMikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJtYXAoKSByZXF1aXJlcyBhdCBsZWFzdCB0d28gYXJncyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbiA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKKyAgICBpZiAobiA8IDIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXAoKSByZXF1aXJlcyBhdCBsZWFzdCB0d28gYXJncyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlmdW5jID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCW4tLTsKKyAgICBmdW5jID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOworICAgIG4tLTsKIAotCWlmIChmdW5jID09IFB5X05vbmUpIHsKLQkJaWYgKFB5RXJyX1dhcm5QeTNrKCJtYXAoTm9uZSwgLi4uKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgotCQkJCSAgICJ1c2UgbGlzdCguLi4pIiwgMSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChuID09IDEpIHsKLQkJCS8qIG1hcChOb25lLCBTKSBpcyB0aGUgc2FtZSBhcyBsaXN0KFMpLiAqLwotCQkJcmV0dXJuIFB5U2VxdWVuY2VfTGlzdChQeVR1cGxlX0dldEl0ZW0oYXJncywgMSkpOwotCQl9Ci0JfQorICAgIGlmIChmdW5jID09IFB5X05vbmUpIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJtYXAoTm9uZSwgLi4uKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZSBsaXN0KC4uLikiLCAxKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKG4gPT0gMSkgeworICAgICAgICAgICAgLyogbWFwKE5vbmUsIFMpIGlzIHRoZSBzYW1lIGFzIGxpc3QoUykuICovCisgICAgICAgICAgICByZXR1cm4gUHlTZXF1ZW5jZV9MaXN0KFB5VHVwbGVfR2V0SXRlbShhcmdzLCAxKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBHZXQgc3BhY2UgZm9yIHNlcXVlbmNlIGRlc2NyaXB0b3JzLiAgTXVzdCBOVUxMIG91dCB0aGUgaXRlcmF0b3IKLQkgKiBwb2ludGVycyBzbyB0aGF0IGp1bXBpbmcgdG8gRmFpbF8yIGxhdGVyIGRvZXNuJ3Qgc2VlIHRyYXNoLgotCSAqLwotCWlmICgoc2VxcyA9IFB5TWVtX05FVyhzZXF1ZW5jZSwgbikpID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJc2Vxc1tpXS5pdCA9IChQeU9iamVjdCopTlVMTDsKLQkJc2Vxc1tpXS5zYXdfU3RvcEl0ZXJhdGlvbiA9IDA7Ci0JfQorICAgIC8qIEdldCBzcGFjZSBmb3Igc2VxdWVuY2UgZGVzY3JpcHRvcnMuICBNdXN0IE5VTEwgb3V0IHRoZSBpdGVyYXRvcgorICAgICAqIHBvaW50ZXJzIHNvIHRoYXQganVtcGluZyB0byBGYWlsXzIgbGF0ZXIgZG9lc24ndCBzZWUgdHJhc2guCisgICAgICovCisgICAgaWYgKChzZXFzID0gUHlNZW1fTkVXKHNlcXVlbmNlLCBuKSkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBzZXFzW2ldLml0ID0gKFB5T2JqZWN0KilOVUxMOworICAgICAgICBzZXFzW2ldLnNhd19TdG9wSXRlcmF0aW9uID0gMDsKKyAgICB9CiAKLQkvKiBEbyBhIGZpcnN0IHBhc3MgdG8gb2J0YWluIGl0ZXJhdG9ycyBmb3IgdGhlIGFyZ3VtZW50cywgYW5kIHNldCBsZW4KLQkgKiB0byB0aGUgbGFyZ2VzdCBvZiB0aGVpciBsZW5ndGhzLgotCSAqLwotCWxlbiA9IDA7Ci0JZm9yIChpID0gMCwgc3FwID0gc2VxczsgaSA8IG47ICsraSwgKytzcXApIHsKLQkJUHlPYmplY3QgKmN1cnNlcTsKLQkJUHlfc3NpemVfdCBjdXJsZW47CisgICAgLyogRG8gYSBmaXJzdCBwYXNzIHRvIG9idGFpbiBpdGVyYXRvcnMgZm9yIHRoZSBhcmd1bWVudHMsIGFuZCBzZXQgbGVuCisgICAgICogdG8gdGhlIGxhcmdlc3Qgb2YgdGhlaXIgbGVuZ3Rocy4KKyAgICAgKi8KKyAgICBsZW4gPSAwOworICAgIGZvciAoaSA9IDAsIHNxcCA9IHNlcXM7IGkgPCBuOyArK2ksICsrc3FwKSB7CisgICAgICAgIFB5T2JqZWN0ICpjdXJzZXE7CisgICAgICAgIFB5X3NzaXplX3QgY3VybGVuOwogCi0JCS8qIEdldCBpdGVyYXRvci4gKi8KLQkJY3Vyc2VxID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkrMSk7Ci0JCXNxcC0+aXQgPSBQeU9iamVjdF9HZXRJdGVyKGN1cnNlcSk7Ci0JCWlmIChzcXAtPml0ID09IE5VTEwpIHsKLQkJCXN0YXRpYyBjaGFyIGVycm1zZ1tdID0KLQkJCSAgICAiYXJndW1lbnQgJWQgdG8gbWFwKCkgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiI7Ci0JCQljaGFyIGVycmJ1ZltzaXplb2YoZXJybXNnKSArIDI1XTsKLQkJCVB5T1Nfc25wcmludGYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgZXJybXNnLCBpKzIpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZXJyYnVmKTsKLQkJCWdvdG8gRmFpbF8yOwotCQl9CisgICAgICAgIC8qIEdldCBpdGVyYXRvci4gKi8KKyAgICAgICAgY3Vyc2VxID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkrMSk7CisgICAgICAgIHNxcC0+aXQgPSBQeU9iamVjdF9HZXRJdGVyKGN1cnNlcSk7CisgICAgICAgIGlmIChzcXAtPml0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjaGFyIGVycm1zZ1tdID0KKyAgICAgICAgICAgICAgICAiYXJndW1lbnQgJWQgdG8gbWFwKCkgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiI7CisgICAgICAgICAgICBjaGFyIGVycmJ1ZltzaXplb2YoZXJybXNnKSArIDI1XTsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgZXJybXNnLCBpKzIpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZXJyYnVmKTsKKyAgICAgICAgICAgIGdvdG8gRmFpbF8yOworICAgICAgICB9CiAKLQkJLyogVXBkYXRlIGxlbi4gKi8KLQkJY3VybGVuID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQoY3Vyc2VxLCA4KTsKLQkJaWYgKGN1cmxlbiA+IGxlbikKLQkJCWxlbiA9IGN1cmxlbjsKLQl9CisgICAgICAgIC8qIFVwZGF0ZSBsZW4uICovCisgICAgICAgIGN1cmxlbiA9IF9QeU9iamVjdF9MZW5ndGhIaW50KGN1cnNlcSwgOCk7CisgICAgICAgIGlmIChjdXJsZW4gPiBsZW4pCisgICAgICAgICAgICBsZW4gPSBjdXJsZW47CisgICAgfQogCi0JLyogR2V0IHNwYWNlIGZvciB0aGUgcmVzdWx0IGxpc3QuICovCi0JaWYgKChyZXN1bHQgPSAoUHlPYmplY3QgKikgUHlMaXN0X05ldyhsZW4pKSA9PSBOVUxMKQotCQlnb3RvIEZhaWxfMjsKKyAgICAvKiBHZXQgc3BhY2UgZm9yIHRoZSByZXN1bHQgbGlzdC4gKi8KKyAgICBpZiAoKHJlc3VsdCA9IChQeU9iamVjdCAqKSBQeUxpc3RfTmV3KGxlbikpID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbF8yOwogCi0JLyogSXRlcmF0ZSBvdmVyIHRoZSBzZXF1ZW5jZXMgdW50aWwgYWxsIGhhdmUgc3RvcHBlZC4gKi8KLQlmb3IgKGkgPSAwOyA7ICsraSkgewotCQlQeU9iamVjdCAqYWxpc3QsICppdGVtPU5VTEwsICp2YWx1ZTsKLQkJaW50IG51bWFjdGl2ZSA9IDA7CisgICAgLyogSXRlcmF0ZSBvdmVyIHRoZSBzZXF1ZW5jZXMgdW50aWwgYWxsIGhhdmUgc3RvcHBlZC4gKi8KKyAgICBmb3IgKGkgPSAwOyA7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqYWxpc3QsICppdGVtPU5VTEwsICp2YWx1ZTsKKyAgICAgICAgaW50IG51bWFjdGl2ZSA9IDA7CiAKLQkJaWYgKGZ1bmMgPT0gUHlfTm9uZSAmJiBuID09IDEpCi0JCQlhbGlzdCA9IE5VTEw7Ci0JCWVsc2UgaWYgKChhbGlzdCA9IFB5VHVwbGVfTmV3KG4pKSA9PSBOVUxMKQotCQkJZ290byBGYWlsXzE7CisgICAgICAgIGlmIChmdW5jID09IFB5X05vbmUgJiYgbiA9PSAxKQorICAgICAgICAgICAgYWxpc3QgPSBOVUxMOworICAgICAgICBlbHNlIGlmICgoYWxpc3QgPSBQeVR1cGxlX05ldyhuKSkgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRmFpbF8xOwogCi0JCWZvciAoaiA9IDAsIHNxcCA9IHNlcXM7IGogPCBuOyArK2osICsrc3FwKSB7Ci0JCQlpZiAoc3FwLT5zYXdfU3RvcEl0ZXJhdGlvbikgewotCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCQlpdGVtID0gUHlfTm9uZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWl0ZW0gPSBQeUl0ZXJfTmV4dChzcXAtPml0KTsKLQkJCQlpZiAoaXRlbSkKLQkJCQkJKytudW1hY3RpdmU7Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJCQlQeV9YREVDUkVGKGFsaXN0KTsKLQkJCQkJCWdvdG8gRmFpbF8xOwotCQkJCQl9Ci0JCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCQkJaXRlbSA9IFB5X05vbmU7Ci0JCQkJCXNxcC0+c2F3X1N0b3BJdGVyYXRpb24gPSAxOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhbGlzdCkKLQkJCQlQeVR1cGxlX1NFVF9JVEVNKGFsaXN0LCBqLCBpdGVtKTsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJfQorICAgICAgICBmb3IgKGogPSAwLCBzcXAgPSBzZXFzOyBqIDwgbjsgKytqLCArK3NxcCkgeworICAgICAgICAgICAgaWYgKHNxcC0+c2F3X1N0b3BJdGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgaXRlbSA9IFB5X05vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoc3FwLT5pdCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICsrbnVtYWN0aXZlOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihhbGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBQeV9Ob25lOworICAgICAgICAgICAgICAgICAgICBzcXAtPnNhd19TdG9wSXRlcmF0aW9uID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWxpc3QpCisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhbGlzdCwgaiwgaXRlbSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlpZiAoIWFsaXN0KQotCQkJYWxpc3QgPSBpdGVtOworICAgICAgICBpZiAoIWFsaXN0KQorICAgICAgICAgICAgYWxpc3QgPSBpdGVtOwogCi0JCWlmIChudW1hY3RpdmUgPT0gMCkgewotCQkJUHlfREVDUkVGKGFsaXN0KTsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGlmIChudW1hY3RpdmUgPT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGFsaXN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJaWYgKGZ1bmMgPT0gUHlfTm9uZSkKLQkJCXZhbHVlID0gYWxpc3Q7Ci0JCWVsc2UgewotCQkJdmFsdWUgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhbGlzdCk7Ci0JCQlQeV9ERUNSRUYoYWxpc3QpOwotCQkJaWYgKHZhbHVlID09IE5VTEwpCi0JCQkJZ290byBGYWlsXzE7Ci0JCX0KLQkJaWYgKGkgPj0gbGVuKSB7Ci0JCQlpbnQgc3RhdHVzID0gUHlMaXN0X0FwcGVuZChyZXN1bHQsIHZhbHVlKTsKLQkJCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQlnb3RvIEZhaWxfMTsKLQkJfQotCQllbHNlIGlmIChQeUxpc3RfU2V0SXRlbShyZXN1bHQsIGksIHZhbHVlKSA8IDApCi0JCSAJZ290byBGYWlsXzE7Ci0JfQorICAgICAgICBpZiAoZnVuYyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgdmFsdWUgPSBhbGlzdDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2YWx1ZSA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFsaXN0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhbGlzdCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA+PSBsZW4pIHsKKyAgICAgICAgICAgIGludCBzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKHJlc3VsdCwgdmFsdWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5TGlzdF9TZXRJdGVtKHJlc3VsdCwgaSwgdmFsdWUpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgIH0KIAotCWlmIChpIDwgbGVuICYmIFB5TGlzdF9TZXRTbGljZShyZXN1bHQsIGksIGxlbiwgTlVMTCkgPCAwKQotCQlnb3RvIEZhaWxfMTsKKyAgICBpZiAoaSA8IGxlbiAmJiBQeUxpc3RfU2V0U2xpY2UocmVzdWx0LCBpLCBsZW4sIE5VTEwpIDwgMCkKKyAgICAgICAgZ290byBGYWlsXzE7CiAKLQlnb3RvIFN1Y2NlZWQ7CisgICAgZ290byBTdWNjZWVkOwogCiBGYWlsXzE6Ci0JUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CiBGYWlsXzI6Ci0JcmVzdWx0ID0gTlVMTDsKKyAgICByZXN1bHQgPSBOVUxMOwogU3VjY2VlZDoKLQlhc3NlcnQoc2Vxcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47ICsraSkKLQkJUHlfWERFQ1JFRihzZXFzW2ldLml0KTsKLQlQeU1lbV9ERUwoc2Vxcyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBhc3NlcnQoc2Vxcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgUHlfWERFQ1JFRihzZXFzW2ldLml0KTsKKyAgICBQeU1lbV9ERUwoc2Vxcyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKG1hcF9kb2MsCkBAIC0xMDg0LDM1ICsxMDg0LDM1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9uZXh0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqaXQsICpyZXM7Ci0JUHlPYmplY3QgKmRlZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0LCAqcmVzOworICAgIFB5T2JqZWN0ICpkZWYgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAibmV4dCIsIDEsIDIsICZpdCwgJmRlZikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlJdGVyX0NoZWNrKGl0KSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJIiUuMjAwcyBvYmplY3QgaXMgbm90IGFuIGl0ZXJhdG9yIiwKLQkJCWl0LT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCXJlcyA9ICgqaXQtPm9iX3R5cGUtPnRwX2l0ZXJuZXh0KShpdCk7Ci0JaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCXJldHVybiByZXM7Ci0JfSBlbHNlIGlmIChkZWYgIT0gTlVMTCkgewotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotCQkJCXJldHVybiBOVUxMOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCQlQeV9JTkNSRUYoZGVmKTsKLQkJcmV0dXJuIGRlZjsKLQl9IGVsc2UgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIm5leHQiLCAxLCAyLCAmaXQsICZkZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SXRlcl9DaGVjayhpdCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICIlLjIwMHMgb2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvciIsCisgICAgICAgICAgICBpdC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJlcyA9ICgqaXQtPm9iX3R5cGUtPnRwX2l0ZXJuZXh0KShpdCk7CisgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfSBlbHNlIGlmIChkZWYgIT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoZGVmKTsKKyAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9IGVsc2UgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIobmV4dF9kb2MsCkBAIC0xMTI1LDE2ICsxMTI1LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9zZXRhdHRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdjsKLQlQeU9iamVjdCAqbmFtZTsKLQlQeU9iamVjdCAqdmFsdWU7CisgICAgUHlPYmplY3QgKnY7CisgICAgUHlPYmplY3QgKm5hbWU7CisgICAgUHlPYmplY3QgKnZhbHVlOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2V0YXR0ciIsIDMsIDMsICZ2LCAmbmFtZSwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5T2JqZWN0X1NldEF0dHIodiwgbmFtZSwgdmFsdWUpICE9IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZXRhdHRyIiwgMywgMywgJnYsICZuYW1lLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlPYmplY3RfU2V0QXR0cih2LCBuYW1lLCB2YWx1ZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2V0YXR0cl9kb2MsCkBAIC0xMTQ3LDE1ICsxMTQ3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9kZWxhdHRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdjsKLQlQeU9iamVjdCAqbmFtZTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqbmFtZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRlbGF0dHIiLCAyLCAyLCAmdiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlPYmplY3RfU2V0QXR0cih2LCBuYW1lLCAoUHlPYmplY3QgKilOVUxMKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZGVsYXR0ciIsIDIsIDIsICZ2LCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeU9iamVjdF9TZXRBdHRyKHYsIG5hbWUsIChQeU9iamVjdCAqKU5VTEwpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGRlbGF0dHJfZG9jLApAQCAtMTE2OCwxMiArMTE2OCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5faGFzaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JbG9uZyB4OworICAgIGxvbmcgeDsKIAotCXggPSBQeU9iamVjdF9IYXNoKHYpOwotCWlmICh4ID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgeCA9IFB5T2JqZWN0X0hhc2godik7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKIH0KIAogUHlEb2NfU1RSVkFSKGhhc2hfZG9jLApAQCAtMTE4NiwyNCArMTE4NiwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5faGV4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeU51bWJlck1ldGhvZHMgKm5iOwotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKChuYiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAotCSAgICBuYi0+bmJfaGV4ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICJoZXgoKSBhcmd1bWVudCBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaGV4Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXMgPSAoKm5iLT5uYl9oZXgpKHYpOwotCWlmIChyZXMgJiYgIVB5U3RyaW5nX0NoZWNrKHJlcykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIl9faGV4X18gcmV0dXJuZWQgbm9uLXN0cmluZyAodHlwZSAlLjIwMHMpIiwKLQkJCSAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcmVzOworICAgIGlmICgobmIgPSB2LT5vYl90eXBlLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKKyAgICAgICAgbmItPm5iX2hleCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgImhleCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBoZXgiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlcyA9ICgqbmItPm5iX2hleCkodik7CisgICAgaWYgKHJlcyAmJiAhUHlTdHJpbmdfQ2hlY2socmVzKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIl9faGV4X18gcmV0dXJuZWQgbm9uLXN0cmluZyAodHlwZSAlLjIwMHMpIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlEb2NfU1RSVkFSKGhleF9kb2MsCkBAIC0xMjE3LDMxICsxMjE3LDMxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9pbnB1dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmxpbmU7Ci0JY2hhciAqc3RyOwotCVB5T2JqZWN0ICpyZXM7Ci0JUHlPYmplY3QgKmdsb2JhbHMsICpsb2NhbHM7Ci0JUHlDb21waWxlckZsYWdzIGNmOworICAgIFB5T2JqZWN0ICpsaW5lOworICAgIGNoYXIgKnN0cjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpnbG9iYWxzLCAqbG9jYWxzOworICAgIFB5Q29tcGlsZXJGbGFncyBjZjsKIAotCWxpbmUgPSBidWlsdGluX3Jhd19pbnB1dChzZWxmLCBhcmdzKTsKLQlpZiAobGluZSA9PSBOVUxMKQotCQlyZXR1cm4gbGluZTsKLQlpZiAoIVB5QXJnX1BhcnNlKGxpbmUsICJzO2VtYmVkZGVkICdcXDAnIGluIGlucHV0IGxpbmUiLCAmc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJ1x0JykKLQkJCXN0cisrOwotCWdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOwotCWxvY2FscyA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpIHsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iLAotCQkJCQkgUHlFdmFsX0dldEJ1aWx0aW5zKCkpICE9IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JY2YuY2ZfZmxhZ3MgPSAwOwotCVB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKTsKLQlyZXMgPSBQeVJ1bl9TdHJpbmdGbGFncyhzdHIsIFB5X2V2YWxfaW5wdXQsIGdsb2JhbHMsIGxvY2FscywgJmNmKTsKLQlQeV9ERUNSRUYobGluZSk7Ci0JcmV0dXJuIHJlczsKKyAgICBsaW5lID0gYnVpbHRpbl9yYXdfaW5wdXQoc2VsZiwgYXJncyk7CisgICAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZShsaW5lLCAicztlbWJlZGRlZCAnXFwwJyBpbiBpbnB1dCBsaW5lIiwgJnN0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICdcdCcpCisgICAgICAgICAgICAgICAgICAgIHN0cisrOworICAgIGdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOworICAgIGxvY2FscyA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEJ1aWx0aW5zKCkpICE9IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2YuY2ZfZmxhZ3MgPSAwOworICAgIFB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKTsKKyAgICByZXMgPSBQeVJ1bl9TdHJpbmdGbGFncyhzdHIsIFB5X2V2YWxfaW5wdXQsIGdsb2JhbHMsIGxvY2FscywgJmNmKTsKKyAgICBQeV9ERUNSRUYobGluZSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlEb2NfU1RSVkFSKGlucHV0X2RvYywKQEAgLTEyNTMsMTcgKzEyNTMsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2ludGVybihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJTOmludGVybiIsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KHMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGludGVybiBzdWJjbGFzcyBvZiBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihzKTsKLQlQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZzKTsKLQlyZXR1cm4gczsKKyAgICBQeU9iamVjdCAqczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlM6aW50ZXJuIiwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3QocykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBpbnRlcm4gc3ViY2xhc3Mgb2Ygc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYocyk7CisgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmcyk7CisgICAgcmV0dXJuIHM7CiB9CiAKIFB5RG9jX1NUUlZBUihpbnRlcm5fZG9jLApAQCAtMTI3OCwxOCArMTI3OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5faXRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnYsICp3ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdiwgKncgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaXRlciIsIDEsIDIsICZ2LCAmdykpCi0JCXJldHVybiBOVUxMOwotCWlmICh3ID09IE5VTEwpCi0JCXJldHVybiBQeU9iamVjdF9HZXRJdGVyKHYpOwotCWlmICghUHlDYWxsYWJsZV9DaGVjayh2KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpdGVyKHYsIHcpOiB2IG11c3QgYmUgY2FsbGFibGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUNhbGxJdGVyX05ldyh2LCB3KTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpdGVyIiwgMSwgMiwgJnYsICZ3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0dldEl0ZXIodik7CisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcih2LCB3KTogdiBtdXN0IGJlIGNhbGxhYmxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlDYWxsSXRlcl9OZXcodiwgdyk7CiB9CiAKIFB5RG9jX1NUUlZBUihpdGVyX2RvYywKQEAgLTEzMDQsMTIgKzEzMDQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2xlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCByZXM7CisgICAgUHlfc3NpemVfdCByZXM7CiAKLQlyZXMgPSBQeU9iamVjdF9TaXplKHYpOwotCWlmIChyZXMgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOworICAgIHJlcyA9IFB5T2JqZWN0X1NpemUodik7CisgICAgaWYgKHJlcyA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5fZG9jLApAQCAtMTMyMSwxMSArMTMyMSwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fbG9jYWxzKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCi0JZCA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKLQlQeV9YSU5DUkVGKGQpOwotCXJldHVybiBkOworICAgIGQgPSBQeUV2YWxfR2V0TG9jYWxzKCk7CisgICAgUHlfWElOQ1JFRihkKTsKKyAgICByZXR1cm4gZDsKIH0KIAogUHlEb2NfU1RSVkFSKGxvY2Fsc19kb2MsCkBAIC0xMzM3LDk2ICsxMzM3LDk2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWluX21heChQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqdiwgKml0LCAqaXRlbSwgKnZhbCwgKm1heGl0ZW0sICptYXh2YWwsICprZXlmdW5jPU5VTEw7Ci0JY29uc3QgY2hhciAqbmFtZSA9IG9wID09IFB5X0xUID8gIm1pbiIgOiAibWF4IjsKKyAgICBQeU9iamVjdCAqdiwgKml0LCAqaXRlbSwgKnZhbCwgKm1heGl0ZW0sICptYXh2YWwsICprZXlmdW5jPU5VTEw7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IG9wID09IFB5X0xUID8gIm1pbiIgOiAibWF4IjsKIAotCWlmIChQeVR1cGxlX1NpemUoYXJncykgPiAxKQotCQl2ID0gYXJnczsKLQllbHNlIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgKGNoYXIgKiluYW1lLCAxLCAxLCAmdikpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeVR1cGxlX1NpemUoYXJncykgPiAxKQorICAgICAgICB2ID0gYXJnczsKKyAgICBlbHNlIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgKGNoYXIgKiluYW1lLCAxLCAxLCAmdikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGt3ZHMgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykpIHsKLQkJa2V5ZnVuYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsICJrZXkiKTsKLQkJaWYgKFB5RGljdF9TaXplKGt3ZHMpIT0xICB8fCAga2V5ZnVuYyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSIlcygpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQiLCBuYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0lOQ1JFRihrZXlmdW5jKTsKLQl9CisgICAgaWYgKGt3ZHMgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykpIHsKKyAgICAgICAga2V5ZnVuYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsICJrZXkiKTsKKyAgICAgICAgaWYgKFB5RGljdF9TaXplKGt3ZHMpIT0xICB8fCAga2V5ZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICIlcygpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQiLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihrZXlmdW5jKTsKKyAgICB9CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7Ci0JaWYgKGl0ID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRihrZXlmdW5jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgeworICAgICAgICBQeV9YREVDUkVGKGtleWZ1bmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQltYXhpdGVtID0gTlVMTDsgLyogdGhlIHJlc3VsdCAqLwotCW1heHZhbCA9IE5VTEw7ICAvKiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXN1bHQgKi8KLQl3aGlsZSAoKCBpdGVtID0gUHlJdGVyX05leHQoaXQpICkpIHsKLQkJLyogZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBrZXkgZnVuY3Rpb24gKi8KLQkJaWYgKGtleWZ1bmMgIT0gTlVMTCkgewotCQkJdmFsID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhrZXlmdW5jLCBpdGVtLCBOVUxMKTsKLQkJCWlmICh2YWwgPT0gTlVMTCkKLQkJCQlnb3RvIEZhaWxfaXRfaXRlbTsKLQkJfQotCQkvKiBubyBrZXkgZnVuY3Rpb247IHRoZSB2YWx1ZSBpcyB0aGUgaXRlbSAqLwotCQllbHNlIHsKLQkJCXZhbCA9IGl0ZW07Ci0JCQlQeV9JTkNSRUYodmFsKTsKLQkJfQorICAgIG1heGl0ZW0gPSBOVUxMOyAvKiB0aGUgcmVzdWx0ICovCisgICAgbWF4dmFsID0gTlVMTDsgIC8qIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc3VsdCAqLworICAgIHdoaWxlICgoIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkgKSkgeworICAgICAgICAvKiBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIGtleSBmdW5jdGlvbiAqLworICAgICAgICBpZiAoa2V5ZnVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgICB2YWwgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGtleWZ1bmMsIGl0ZW0sIE5VTEwpOworICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbF9pdF9pdGVtOworICAgICAgICB9CisgICAgICAgIC8qIG5vIGtleSBmdW5jdGlvbjsgdGhlIHZhbHVlIGlzIHRoZSBpdGVtICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdmFsID0gaXRlbTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2YWwpOworICAgICAgICB9CiAKLQkJLyogbWF4aW11bSB2YWx1ZSBhbmQgaXRlbSBhcmUgdW5zZXQ7IHNldCB0aGVtICovCi0JCWlmIChtYXh2YWwgPT0gTlVMTCkgewotCQkJbWF4aXRlbSA9IGl0ZW07Ci0JCQltYXh2YWwgPSB2YWw7Ci0JCX0KLQkJLyogbWF4aW11bSB2YWx1ZSBhbmQgaXRlbSBhcmUgc2V0OyB1cGRhdGUgdGhlbSBhcyBuZWNlc3NhcnkgKi8KLQkJZWxzZSB7Ci0JCQlpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHZhbCwgbWF4dmFsLCBvcCk7Ci0JCQlpZiAoY21wIDwgMCkKLQkJCQlnb3RvIEZhaWxfaXRfaXRlbV9hbmRfdmFsOwotCQkJZWxzZSBpZiAoY21wID4gMCkgewotCQkJCVB5X0RFQ1JFRihtYXh2YWwpOwotCQkJCVB5X0RFQ1JFRihtYXhpdGVtKTsKLQkJCQltYXh2YWwgPSB2YWw7Ci0JCQkJbWF4aXRlbSA9IGl0ZW07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJUHlfREVDUkVGKHZhbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCWdvdG8gRmFpbF9pdDsKLQlpZiAobWF4dmFsID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICIlcygpIGFyZyBpcyBhbiBlbXB0eSBzZXF1ZW5jZSIsIG5hbWUpOwotCQlhc3NlcnQobWF4aXRlbSA9PSBOVUxMKTsKLQl9Ci0JZWxzZQotCQlQeV9ERUNSRUYobWF4dmFsKTsKLQlQeV9ERUNSRUYoaXQpOwotCVB5X1hERUNSRUYoa2V5ZnVuYyk7Ci0JcmV0dXJuIG1heGl0ZW07CisgICAgICAgIC8qIG1heGltdW0gdmFsdWUgYW5kIGl0ZW0gYXJlIHVuc2V0OyBzZXQgdGhlbSAqLworICAgICAgICBpZiAobWF4dmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1heGl0ZW0gPSBpdGVtOworICAgICAgICAgICAgbWF4dmFsID0gdmFsOworICAgICAgICB9CisgICAgICAgIC8qIG1heGltdW0gdmFsdWUgYW5kIGl0ZW0gYXJlIHNldDsgdXBkYXRlIHRoZW0gYXMgbmVjZXNzYXJ5ICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2YWwsIG1heHZhbCwgb3ApOworICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgZ290byBGYWlsX2l0X2l0ZW1fYW5kX3ZhbDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA+IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWF4dmFsKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWF4aXRlbSk7CisgICAgICAgICAgICAgICAgbWF4dmFsID0gdmFsOworICAgICAgICAgICAgICAgIG1heGl0ZW0gPSBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIEZhaWxfaXQ7CisgICAgaWYgKG1heHZhbCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiVzKCkgYXJnIGlzIGFuIGVtcHR5IHNlcXVlbmNlIiwgbmFtZSk7CisgICAgICAgIGFzc2VydChtYXhpdGVtID09IE5VTEwpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X0RFQ1JFRihtYXh2YWwpOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgUHlfWERFQ1JFRihrZXlmdW5jKTsKKyAgICByZXR1cm4gbWF4aXRlbTsKIAogRmFpbF9pdF9pdGVtX2FuZF92YWw6Ci0JUHlfREVDUkVGKHZhbCk7CisgICAgUHlfREVDUkVGKHZhbCk7CiBGYWlsX2l0X2l0ZW06Ci0JUHlfREVDUkVGKGl0ZW0pOworICAgIFB5X0RFQ1JFRihpdGVtKTsKIEZhaWxfaXQ6Ci0JUHlfWERFQ1JFRihtYXh2YWwpOwotCVB5X1hERUNSRUYobWF4aXRlbSk7Ci0JUHlfREVDUkVGKGl0KTsKLQlQeV9YREVDUkVGKGtleWZ1bmMpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYobWF4dmFsKTsKKyAgICBQeV9YREVDUkVGKG1heGl0ZW0pOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgUHlfWERFQ1JFRihrZXlmdW5jKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fbWluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JcmV0dXJuIG1pbl9tYXgoYXJncywga3dkcywgUHlfTFQpOworICAgIHJldHVybiBtaW5fbWF4KGFyZ3MsIGt3ZHMsIFB5X0xUKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1pbl9kb2MsCkBAIC0xNDQwLDcgKzE0NDAsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fbWF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JcmV0dXJuIG1pbl9tYXgoYXJncywga3dkcywgUHlfR1QpOworICAgIHJldHVybiBtaW5fbWF4KGFyZ3MsIGt3ZHMsIFB5X0dUKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1heF9kb2MsCkBAIC0xNDU0LDI0ICsxNDU0LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9vY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU51bWJlck1ldGhvZHMgKm5iOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAodiA9PSBOVUxMIHx8IChuYiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAotCSAgICBuYi0+bmJfb2N0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICJvY3QoKSBhcmd1bWVudCBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gb2N0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXMgPSAoKm5iLT5uYl9vY3QpKHYpOwotCWlmIChyZXMgJiYgIVB5U3RyaW5nX0NoZWNrKHJlcykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIl9fb2N0X18gcmV0dXJuZWQgbm9uLXN0cmluZyAodHlwZSAlLjIwMHMpIiwKLQkJCSAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcmVzOworICAgIGlmICh2ID09IE5VTEwgfHwgKG5iID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8CisgICAgICAgIG5iLT5uYl9vY3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJvY3QoKSBhcmd1bWVudCBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gb2N0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXMgPSAoKm5iLT5uYl9vY3QpKHYpOworICAgIGlmIChyZXMgJiYgIVB5U3RyaW5nX0NoZWNrKHJlcykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJfX29jdF9fIHJldHVybmVkIG5vbi1zdHJpbmcgKHR5cGUgJS4yMDBzKSIsCisgICAgICAgICAgICAgICAgICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIFB5RG9jX1NUUlZBUihvY3RfZG9jLApAQCAtMTQ4Myw3ICsxNDgzLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX29wZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbCgoUHlPYmplY3QqKSZQeUZpbGVfVHlwZSwgYXJncywga3dkcyk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0KikmUHlGaWxlX1R5cGUsIGFyZ3MsIGt3ZHMpOwogfQogCiBQeURvY19TVFJWQVIob3Blbl9kb2MsCkBAIC0xNDk2LDQyICsxNDk2LDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9vcmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0KiBvYmopCiB7Ci0JbG9uZyBvcmQ7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIGxvbmcgb3JkOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAotCWlmIChQeVN0cmluZ19DaGVjayhvYmopKSB7Ci0JCXNpemUgPSBQeVN0cmluZ19HRVRfU0laRShvYmopOwotCQlpZiAoc2l6ZSA9PSAxKSB7Ci0JCQlvcmQgPSAobG9uZykoKHVuc2lnbmVkIGNoYXIpKlB5U3RyaW5nX0FTX1NUUklORyhvYmopKTsKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZyhvcmQpOwotCQl9Ci0JfSBlbHNlIGlmIChQeUJ5dGVBcnJheV9DaGVjayhvYmopKSB7Ci0JCXNpemUgPSBQeUJ5dGVBcnJheV9HRVRfU0laRShvYmopOwotCQlpZiAoc2l6ZSA9PSAxKSB7Ci0JCQlvcmQgPSAobG9uZykoKHVuc2lnbmVkIGNoYXIpKlB5Qnl0ZUFycmF5X0FTX1NUUklORyhvYmopKTsKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZyhvcmQpOwotCQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKG9iaik7CisgICAgICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgICAgIG9yZCA9IChsb25nKSgodW5zaWduZWQgY2hhcikqUHlTdHJpbmdfQVNfU1RSSU5HKG9iaikpOworICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9yZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFB5Qnl0ZUFycmF5X0NoZWNrKG9iaikpIHsKKyAgICAgICAgc2l6ZSA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKG9iaik7CisgICAgICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgICAgIG9yZCA9IChsb25nKSgodW5zaWduZWQgY2hhcikqUHlCeXRlQXJyYXlfQVNfU1RSSU5HKG9iaikpOworICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9yZCk7CisgICAgICAgIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQl9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKSB7Ci0JCXNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUob2JqKTsKLQkJaWYgKHNpemUgPT0gMSkgewotCQkJb3JkID0gKGxvbmcpKlB5VW5pY29kZV9BU19VTklDT0RFKG9iaik7Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcob3JkKTsKLQkJfQorICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRShvYmopOworICAgICAgICBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICBvcmQgPSAobG9uZykqUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKTsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhvcmQpOworICAgICAgICB9CiAjZW5kaWYKLQl9IGVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAib3JkKCkgZXhwZWN0ZWQgc3RyaW5nIG9mIGxlbmd0aCAxLCBidXQgIiBcCi0JCQkgICAgICIlLjIwMHMgZm91bmQiLCBvYmotPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJvcmQoKSBleHBlY3RlZCBzdHJpbmcgb2YgbGVuZ3RoIDEsIGJ1dCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMgZm91bmQiLCBvYmotPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJvcmQoKSBleHBlY3RlZCBhIGNoYXJhY3RlciwgIgotCQkgICAgICJidXQgc3RyaW5nIG9mIGxlbmd0aCAlemQgZm91bmQiLAotCQkgICAgIHNpemUpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJvcmQoKSBleHBlY3RlZCBhIGNoYXJhY3RlciwgIgorICAgICAgICAgICAgICAgICAiYnV0IHN0cmluZyBvZiBsZW5ndGggJXpkIGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihvcmRfZG9jLApAQCAtMTU0MywxMSArMTU0MywxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fcG93KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdiwgKncsICp6ID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqdiwgKncsICp6ID0gUHlfTm9uZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvdyIsIDIsIDMsICZ2LCAmdywgJnopKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlOdW1iZXJfUG93ZXIodiwgdywgeik7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicG93IiwgMiwgMywgJnYsICZ3LCAmeikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeU51bWJlcl9Qb3dlcih2LCB3LCB6KTsKIH0KIAogUHlEb2NfU1RSVkFSKHBvd19kb2MsCkBAIC0xNTYwLDEyMCArMTU2MCwxMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3ByaW50KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzZXAiLCAiZW5kIiwgImZpbGUiLCAwfTsKLQlzdGF0aWMgUHlPYmplY3QgKmR1bW15X2FyZ3MgPSBOVUxMOwotCXN0YXRpYyBQeU9iamVjdCAqdW5pY29kZV9uZXdsaW5lID0gTlVMTCwgKnVuaWNvZGVfc3BhY2UgPSBOVUxMOwotCXN0YXRpYyBQeU9iamVjdCAqc3RyX25ld2xpbmUgPSBOVUxMLCAqc3RyX3NwYWNlID0gTlVMTDsKLQlQeU9iamVjdCAqbmV3bGluZSwgKnNwYWNlOwotCVB5T2JqZWN0ICpzZXAgPSBOVUxMLCAqZW5kID0gTlVMTCwgKmZpbGUgPSBOVUxMOwotCWludCBpLCBlcnIsIHVzZV91bmljb2RlID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNlcCIsICJlbmQiLCAiZmlsZSIsIDB9OworICAgIHN0YXRpYyBQeU9iamVjdCAqZHVtbXlfYXJncyA9IE5VTEw7CisgICAgc3RhdGljIFB5T2JqZWN0ICp1bmljb2RlX25ld2xpbmUgPSBOVUxMLCAqdW5pY29kZV9zcGFjZSA9IE5VTEw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpzdHJfbmV3bGluZSA9IE5VTEwsICpzdHJfc3BhY2UgPSBOVUxMOworICAgIFB5T2JqZWN0ICpuZXdsaW5lLCAqc3BhY2U7CisgICAgUHlPYmplY3QgKnNlcCA9IE5VTEwsICplbmQgPSBOVUxMLCAqZmlsZSA9IE5VTEw7CisgICAgaW50IGksIGVyciwgdXNlX3VuaWNvZGUgPSAwOwogCi0JaWYgKGR1bW15X2FyZ3MgPT0gTlVMTCkgewotCQlpZiAoIShkdW1teV9hcmdzID0gUHlUdXBsZV9OZXcoMCkpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzdHJfbmV3bGluZSA9PSBOVUxMKSB7Ci0JCXN0cl9uZXdsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiXG4iKTsKLQkJaWYgKHN0cl9uZXdsaW5lID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJc3RyX3NwYWNlID0gUHlTdHJpbmdfRnJvbVN0cmluZygiICIpOwotCQlpZiAoc3RyX3NwYWNlID09IE5VTEwpIHsKLQkJCVB5X0NMRUFSKHN0cl9uZXdsaW5lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXVuaWNvZGVfbmV3bGluZSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJcbiIpOwotCQlpZiAodW5pY29kZV9uZXdsaW5lID09IE5VTEwpIHsKLQkJCVB5X0NMRUFSKHN0cl9uZXdsaW5lKTsKLQkJCVB5X0NMRUFSKHN0cl9zcGFjZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQl1bmljb2RlX3NwYWNlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoIiAiKTsKLQkJaWYgKHVuaWNvZGVfc3BhY2UgPT0gTlVMTCkgewotCQkJUHlfQ0xFQVIoc3RyX25ld2xpbmUpOwotCQkJUHlfQ0xFQVIoc3RyX3NwYWNlKTsKLQkJCVB5X0NMRUFSKHVuaWNvZGVfc3BhY2UpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoZHVtbXlfYXJncywga3dkcywgInxPT086cHJpbnQiLAotCQkJCQkga3dsaXN0LCAmc2VwLCAmZW5kLCAmZmlsZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChmaWxlID09IE5VTEwgfHwgZmlsZSA9PSBQeV9Ob25lKSB7Ci0JCWZpbGUgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOwotCQkvKiBzeXMuc3Rkb3V0IG1heSBiZSBOb25lIHdoZW4gRklMRSogc3Rkb3V0IGlzbid0IGNvbm5lY3RlZCAqLwotCQlpZiAoZmlsZSA9PSBQeV9Ob25lKQotCQkJUHlfUkVUVVJOX05PTkU7Ci0JfQotCWlmIChzZXAgPT0gUHlfTm9uZSkgewotCQlzZXAgPSBOVUxMOwotCX0KLQllbHNlIGlmIChzZXApIHsKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhzZXApKSB7Ci0JCQl1c2VfdW5pY29kZSA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKHNlcCkpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAic2VwIG11c3QgYmUgTm9uZSwgc3RyIG9yIHVuaWNvZGUsIG5vdCAlLjIwMHMiLAotCQkJCSAgICAgc2VwLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWlmIChlbmQgPT0gUHlfTm9uZSkKLQkJZW5kID0gTlVMTDsKLQllbHNlIGlmIChlbmQpIHsKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhlbmQpKSB7Ci0JCQl1c2VfdW5pY29kZSA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKGVuZCkpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiZW5kIG11c3QgYmUgTm9uZSwgc3RyIG9yIHVuaWNvZGUsIG5vdCAlLjIwMHMiLAotCQkJCSAgICAgZW5kLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmIChkdW1teV9hcmdzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCEoZHVtbXlfYXJncyA9IFB5VHVwbGVfTmV3KDApKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc3RyX25ld2xpbmUgPT0gTlVMTCkgeworICAgICAgICBzdHJfbmV3bGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIlxuIik7CisgICAgICAgIGlmIChzdHJfbmV3bGluZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHN0cl9zcGFjZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiAiKTsKKyAgICAgICAgaWYgKHN0cl9zcGFjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9DTEVBUihzdHJfbmV3bGluZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB1bmljb2RlX25ld2xpbmUgPSBQeVVuaWNvZGVfRnJvbVN0cmluZygiXG4iKTsKKyAgICAgICAgaWYgKHVuaWNvZGVfbmV3bGluZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9DTEVBUihzdHJfbmV3bGluZSk7CisgICAgICAgICAgICBQeV9DTEVBUihzdHJfc3BhY2UpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdW5pY29kZV9zcGFjZSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKCIgIik7CisgICAgICAgIGlmICh1bmljb2RlX3NwYWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0NMRUFSKHN0cl9uZXdsaW5lKTsKKyAgICAgICAgICAgIFB5X0NMRUFSKHN0cl9zcGFjZSk7CisgICAgICAgICAgICBQeV9DTEVBUih1bmljb2RlX3NwYWNlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGR1bW15X2FyZ3MsIGt3ZHMsICJ8T09POnByaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZzZXAsICZlbmQsICZmaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGZpbGUgPT0gTlVMTCB8fCBmaWxlID09IFB5X05vbmUpIHsKKyAgICAgICAgZmlsZSA9IFB5U3lzX0dldE9iamVjdCgic3Rkb3V0Iik7CisgICAgICAgIC8qIHN5cy5zdGRvdXQgbWF5IGJlIE5vbmUgd2hlbiBGSUxFKiBzdGRvdXQgaXNuJ3QgY29ubmVjdGVkICovCisgICAgICAgIGlmIChmaWxlID09IFB5X05vbmUpCisgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CisgICAgaWYgKHNlcCA9PSBQeV9Ob25lKSB7CisgICAgICAgIHNlcCA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKHNlcCkgeworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHNlcCkpIHsKKyAgICAgICAgICAgIHVzZV91bmljb2RlID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soc2VwKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2VwIG11c3QgYmUgTm9uZSwgc3RyIG9yIHVuaWNvZGUsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlcC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZW5kID09IFB5X05vbmUpCisgICAgICAgIGVuZCA9IE5VTEw7CisgICAgZWxzZSBpZiAoZW5kKSB7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZW5kKSkgeworICAgICAgICAgICAgdXNlX3VuaWNvZGUgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhlbmQpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJlbmQgbXVzdCBiZSBOb25lLCBzdHIgb3IgdW5pY29kZSwgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JaWYgKCF1c2VfdW5pY29kZSkgewotCQlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9TaXplKGFyZ3MpOyBpKyspIHsKLQkJCWlmIChQeVVuaWNvZGVfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKSkpIHsKLQkJCQl1c2VfdW5pY29kZSA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHVzZV91bmljb2RlKSB7Ci0JCW5ld2xpbmUgPSB1bmljb2RlX25ld2xpbmU7Ci0JCXNwYWNlID0gdW5pY29kZV9zcGFjZTsKLQl9Ci0JZWxzZSB7Ci0JCW5ld2xpbmUgPSBzdHJfbmV3bGluZTsKLQkJc3BhY2UgPSBzdHJfc3BhY2U7Ci0JfQorICAgIGlmICghdXNlX3VuaWNvZGUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfU2l6ZShhcmdzKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSkpKSB7CisgICAgICAgICAgICAgICAgdXNlX3VuaWNvZGUgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICh1c2VfdW5pY29kZSkgeworICAgICAgICBuZXdsaW5lID0gdW5pY29kZV9uZXdsaW5lOworICAgICAgICBzcGFjZSA9IHVuaWNvZGVfc3BhY2U7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuZXdsaW5lID0gc3RyX25ld2xpbmU7CisgICAgICAgIHNwYWNlID0gc3RyX3NwYWNlOworICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX1NpemUoYXJncyk7IGkrKykgewotCQlpZiAoaSA+IDApIHsKLQkJCWlmIChzZXAgPT0gTlVMTCkKLQkJCQllcnIgPSBQeUZpbGVfV3JpdGVPYmplY3Qoc3BhY2UsIGZpbGUsCi0JCQkJCQkJIFB5X1BSSU5UX1JBVyk7Ci0JCQllbHNlCi0JCQkJZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHNlcCwgZmlsZSwKLQkJCQkJCQkgUHlfUFJJTlRfUkFXKTsKLQkJCWlmIChlcnIpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKSwgZmlsZSwKLQkJCQkJIFB5X1BSSU5UX1JBVyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfU2l6ZShhcmdzKTsgaSsrKSB7CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgaWYgKHNlcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChzcGFjZSwgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfUFJJTlRfUkFXKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVPYmplY3Qoc2VwLCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9QUklOVF9SQVcpOworICAgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QoUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpLCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfUFJJTlRfUkFXKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChlbmQgPT0gTlVMTCkKLQkJZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KG5ld2xpbmUsIGZpbGUsIFB5X1BSSU5UX1JBVyk7Ci0JZWxzZQotCQllcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QoZW5kLCBmaWxlLCBQeV9QUklOVF9SQVcpOwotCWlmIChlcnIpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChlbmQgPT0gTlVMTCkKKyAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KG5ld2xpbmUsIGZpbGUsIFB5X1BSSU5UX1JBVyk7CisgICAgZWxzZQorICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QoZW5kLCBmaWxlLCBQeV9QUklOVF9SQVcpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihwcmludF9kb2MsCkBAIC0xNjk1LDU1ICsxNjk1LDU1IEBACiBzdGF0aWMgbG9uZwogZ2V0X2xlbl9vZl9yYW5nZV9sb25ncyhQeU9iamVjdCAqbG8sIFB5T2JqZWN0ICpoaSwgUHlPYmplY3QgKnN0ZXApCiB7Ci0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUFsZ29yaXRobSBpcyBlcXVhbCB0byB0aGF0IG9mIGdldF9sZW5fb2ZfcmFuZ2UoKSwgYnV0IGl0IG9wZXJhdGVzCi0Jb24gUHlPYmplY3RzICh3aGljaCBhcmUgYXNzdW1lZCB0byBiZSBQeUxvbmcgb3IgUHlJbnQgb2JqZWN0cykuCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlsb25nIG47Ci0JUHlPYmplY3QgKmRpZmYgPSBOVUxMOwotCVB5T2JqZWN0ICpvbmUgPSBOVUxMOwotCVB5T2JqZWN0ICp0bXAxID0gTlVMTCwgKnRtcDIgPSBOVUxMLCAqdG1wMyA9IE5VTEw7Ci0JCS8qIGhvbGRzIHN1Yi1leHByZXNzaW9uIGV2YWx1YXRpb25zICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFsZ29yaXRobSBpcyBlcXVhbCB0byB0aGF0IG9mIGdldF9sZW5fb2ZfcmFuZ2UoKSwgYnV0IGl0IG9wZXJhdGVzCisgICAgb24gUHlPYmplY3RzICh3aGljaCBhcmUgYXNzdW1lZCB0byBiZSBQeUxvbmcgb3IgUHlJbnQgb2JqZWN0cykuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBsb25nIG47CisgICAgUHlPYmplY3QgKmRpZmYgPSBOVUxMOworICAgIFB5T2JqZWN0ICpvbmUgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0bXAxID0gTlVMTCwgKnRtcDIgPSBOVUxMLCAqdG1wMyA9IE5VTEw7CisgICAgICAgIC8qIGhvbGRzIHN1Yi1leHByZXNzaW9uIGV2YWx1YXRpb25zICovCiAKLQkvKiBpZiAobG8gPj0gaGkpLCByZXR1cm4gbGVuZ3RoIG9mIDAuICovCi0JaWYgKFB5T2JqZWN0X0NvbXBhcmUobG8sIGhpKSA+PSAwKQotCQlyZXR1cm4gMDsKKyAgICAvKiBpZiAobG8gPj0gaGkpLCByZXR1cm4gbGVuZ3RoIG9mIDAuICovCisgICAgaWYgKFB5T2JqZWN0X0NvbXBhcmUobG8sIGhpKSA+PSAwKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICgob25lID0gUHlMb25nX0Zyb21Mb25nKDFMKSkgPT0gTlVMTCkKLQkJZ290byBGYWlsOworICAgIGlmICgob25lID0gUHlMb25nX0Zyb21Mb25nKDFMKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOwogCi0JaWYgKCh0bXAxID0gUHlOdW1iZXJfU3VidHJhY3QoaGksIGxvKSkgPT0gTlVMTCkKLQkJZ290byBGYWlsOworICAgIGlmICgodG1wMSA9IFB5TnVtYmVyX1N1YnRyYWN0KGhpLCBsbykpID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCWlmICgoZGlmZiA9IFB5TnVtYmVyX1N1YnRyYWN0KHRtcDEsIG9uZSkpID09IE5VTEwpCi0JCWdvdG8gRmFpbDsKKyAgICBpZiAoKGRpZmYgPSBQeU51bWJlcl9TdWJ0cmFjdCh0bXAxLCBvbmUpKSA9PSBOVUxMKQorICAgICAgICBnb3RvIEZhaWw7CiAKLQlpZiAoKHRtcDIgPSBQeU51bWJlcl9GbG9vckRpdmlkZShkaWZmLCBzdGVwKSkgPT0gTlVMTCkKLQkJZ290byBGYWlsOworICAgIGlmICgodG1wMiA9IFB5TnVtYmVyX0Zsb29yRGl2aWRlKGRpZmYsIHN0ZXApKSA9PSBOVUxMKQorICAgICAgICBnb3RvIEZhaWw7CiAKLQlpZiAoKHRtcDMgPSBQeU51bWJlcl9BZGQodG1wMiwgb25lKSkgPT0gTlVMTCkKLQkJZ290byBGYWlsOworICAgIGlmICgodG1wMyA9IFB5TnVtYmVyX0FkZCh0bXAyLCBvbmUpKSA9PSBOVUxMKQorICAgICAgICBnb3RvIEZhaWw7CiAKLQluID0gUHlMb25nX0FzTG9uZyh0bXAzKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeyAgLyogQ2hlY2sgZm9yIE92ZXJmbG93ICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCWdvdG8gRmFpbDsKLQl9CisgICAgbiA9IFB5TG9uZ19Bc0xvbmcodG1wMyk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsgIC8qIENoZWNrIGZvciBPdmVyZmxvdyAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQogCi0JUHlfREVDUkVGKHRtcDMpOwotCVB5X0RFQ1JFRih0bXAyKTsKLQlQeV9ERUNSRUYoZGlmZik7Ci0JUHlfREVDUkVGKHRtcDEpOwotCVB5X0RFQ1JFRihvbmUpOwotCXJldHVybiBuOworICAgIFB5X0RFQ1JFRih0bXAzKTsKKyAgICBQeV9ERUNSRUYodG1wMik7CisgICAgUHlfREVDUkVGKGRpZmYpOworICAgIFB5X0RFQ1JFRih0bXAxKTsKKyAgICBQeV9ERUNSRUYob25lKTsKKyAgICByZXR1cm4gbjsKIAogICBGYWlsOgotCVB5X1hERUNSRUYodG1wMyk7Ci0JUHlfWERFQ1JFRih0bXAyKTsKLQlQeV9YREVDUkVGKGRpZmYpOwotCVB5X1hERUNSRUYodG1wMSk7Ci0JUHlfWERFQ1JFRihvbmUpOwotCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKHRtcDMpOworICAgIFB5X1hERUNSRUYodG1wMik7CisgICAgUHlfWERFQ1JFRihkaWZmKTsKKyAgICBQeV9YREVDUkVGKHRtcDEpOworICAgIFB5X1hERUNSRUYob25lKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIEhlbHBlciBmdW5jdGlvbiBmb3IgaGFuZGxlX3JhbmdlX2xvbmdzLiAgSWYgYXJnIGlzIGludCBvciBsb25nCkBAIC0xNzU2LDI5ICsxNzU2LDI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3JhbmdlX2xvbmdfYXJndW1lbnQoUHlPYmplY3QgKmFyZywgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqdjsKLQlQeU51bWJlck1ldGhvZHMgKm5iOwotCWlmIChQeUludF9DaGVjayhhcmcpIHx8IFB5TG9uZ19DaGVjayhhcmcpKSB7Ci0JCVB5X0lOQ1JFRihhcmcpOwotCQlyZXR1cm4gYXJnOwotCX0KLQlpZiAoUHlGbG9hdF9DaGVjayhhcmcpIHx8Ci0JICAgIChuYiA9IFB5X1RZUEUoYXJnKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8Ci0JICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAicmFuZ2UoKSBpbnRlZ2VyICVzIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgJXMuIiwKLQkJCSAgICAgbmFtZSwgYXJnLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXYgPSBuYi0+bmJfaW50KGFyZyk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5SW50X0NoZWNrKHYpIHx8IFB5TG9uZ19DaGVjayh2KSkKLQkJcmV0dXJuIHY7Ci0JUHlfREVDUkVGKHYpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiX19pbnRfXyBzaG91bGQgcmV0dXJuIGludCBvYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBQeU51bWJlck1ldGhvZHMgKm5iOworICAgIGlmIChQeUludF9DaGVjayhhcmcpIHx8IFB5TG9uZ19DaGVjayhhcmcpKSB7CisgICAgICAgIFB5X0lOQ1JFRihhcmcpOworICAgICAgICByZXR1cm4gYXJnOworICAgIH0KKyAgICBpZiAoUHlGbG9hdF9DaGVjayhhcmcpIHx8CisgICAgICAgIChuYiA9IFB5X1RZUEUoYXJnKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8CisgICAgICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInJhbmdlKCkgaW50ZWdlciAlcyBhcmd1bWVudCBleHBlY3RlZCwgZ290ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lLCBhcmctPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdiA9IG5iLT5uYl9pbnQoYXJnKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlJbnRfQ2hlY2sodikgfHwgUHlMb25nX0NoZWNrKHYpKQorICAgICAgICByZXR1cm4gdjsKKyAgICBQeV9ERUNSRUYodik7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIl9faW50X18gc2hvdWxkIHJldHVybiBpbnQgb2JqZWN0Iik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIEFuIGV4dGVuc2lvbiBvZiBidWlsdGluX3JhbmdlKCkgdGhhdCBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gUHlMb25nCkBAIC0xNzg2LDEyOSArMTc4NiwxMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBoYW5kbGVfcmFuZ2VfbG9uZ3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICppbG93ID0gTlVMTDsKLQlQeU9iamVjdCAqaWhpZ2ggPSBOVUxMOwotCVB5T2JqZWN0ICppc3RlcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmlsb3cgPSBOVUxMOworICAgIFB5T2JqZWN0ICppaGlnaCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmlzdGVwID0gTlVMTDsKIAotCVB5T2JqZWN0ICpsb3cgPSBOVUxMOwotCVB5T2JqZWN0ICpoaWdoID0gTlVMTDsKLQlQeU9iamVjdCAqc3RlcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmxvdyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmhpZ2ggPSBOVUxMOworICAgIFB5T2JqZWN0ICpzdGVwID0gTlVMTDsKIAotCVB5T2JqZWN0ICpjdXJudW0gPSBOVUxMOwotCVB5T2JqZWN0ICp2ID0gTlVMTDsKLQlsb25nIGJpZ247Ci0JUHlfc3NpemVfdCBpLCBuOwotCWludCBjbXBfcmVzdWx0OworICAgIFB5T2JqZWN0ICpjdXJudW0gPSBOVUxMOworICAgIFB5T2JqZWN0ICp2ID0gTlVMTDsKKyAgICBsb25nIGJpZ247CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIGludCBjbXBfcmVzdWx0OwogCi0JUHlPYmplY3QgKnplcm8gPSBQeUxvbmdfRnJvbUxvbmcoMCk7CisgICAgUHlPYmplY3QgKnplcm8gPSBQeUxvbmdfRnJvbUxvbmcoMCk7CiAKLQlpZiAoemVybyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoemVybyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJhbmdlIiwgMSwgMywgJmlsb3csICZpaGlnaCwgJmlzdGVwKSkgewotCQlQeV9ERUNSRUYoemVybyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyYW5nZSIsIDEsIDMsICZpbG93LCAmaWhpZ2gsICZpc3RlcCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHplcm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBGaWd1cmUgb3V0IHdoaWNoIHdheSB3ZSB3ZXJlIGNhbGxlZCwgc3VwcGx5IGRlZmF1bHRzLCBhbmQgYmUKLQkgKiBzdXJlIHRvIGluY3JlZiBldmVyeXRoaW5nIHNvIHRoYXQgdGhlIGRlY3JlZnMgYXQgdGhlIGVuZAotCSAqIGFyZSBjb3JyZWN0LiBOQjogaWxvdywgaWhpZ2ggYW5kIGlzdGVwIGFyZSBib3Jyb3dlZCByZWZlcmVuY2VzLgotCSAqLwotCWFzc2VydChpbG93ICE9IE5VTEwpOwotCWlmIChpaGlnaCA9PSBOVUxMKSB7Ci0JCS8qIG9ubHkgMSBhcmcgLS0gaXQncyB0aGUgdXBwZXIgbGltaXQgKi8KLQkJaWhpZ2ggPSBpbG93OwotCQlpbG93ID0gTlVMTDsKLQl9CisgICAgLyogRmlndXJlIG91dCB3aGljaCB3YXkgd2Ugd2VyZSBjYWxsZWQsIHN1cHBseSBkZWZhdWx0cywgYW5kIGJlCisgICAgICogc3VyZSB0byBpbmNyZWYgZXZlcnl0aGluZyBzbyB0aGF0IHRoZSBkZWNyZWZzIGF0IHRoZSBlbmQKKyAgICAgKiBhcmUgY29ycmVjdC4gTkI6IGlsb3csIGloaWdoIGFuZCBpc3RlcCBhcmUgYm9ycm93ZWQgcmVmZXJlbmNlcy4KKyAgICAgKi8KKyAgICBhc3NlcnQoaWxvdyAhPSBOVUxMKTsKKyAgICBpZiAoaWhpZ2ggPT0gTlVMTCkgeworICAgICAgICAvKiBvbmx5IDEgYXJnIC0tIGl0J3MgdGhlIHVwcGVyIGxpbWl0ICovCisgICAgICAgIGloaWdoID0gaWxvdzsKKyAgICAgICAgaWxvdyA9IE5VTEw7CisgICAgfQogCi0JLyogY29udmVydCBpaGlnaCBpZiBuZWNlc3NhcnkgKi8KLQlhc3NlcnQoaWhpZ2ggIT0gTlVMTCk7Ci0JaGlnaCA9IGdldF9yYW5nZV9sb25nX2FyZ3VtZW50KGloaWdoLCAiZW5kIik7Ci0JaWYgKGhpZ2ggPT0gTlVMTCkKLQkJZ290byBGYWlsOworICAgIC8qIGNvbnZlcnQgaWhpZ2ggaWYgbmVjZXNzYXJ5ICovCisgICAgYXNzZXJ0KGloaWdoICE9IE5VTEwpOworICAgIGhpZ2ggPSBnZXRfcmFuZ2VfbG9uZ19hcmd1bWVudChpaGlnaCwgImVuZCIpOworICAgIGlmIChoaWdoID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCS8qIGloaWdoIGNvcnJlY3Qgbm93OyBkbyBpbG93ICovCi0JaWYgKGlsb3cgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoemVybyk7Ci0JCWxvdyA9IHplcm87Ci0JfQotCWVsc2UgewotCQlsb3cgPSBnZXRfcmFuZ2VfbG9uZ19hcmd1bWVudChpbG93LCAic3RhcnQiKTsKLQkJaWYgKGxvdyA9PSBOVUxMKQotCQkJZ290byBGYWlsOwotCX0KKyAgICAvKiBpaGlnaCBjb3JyZWN0IG5vdzsgZG8gaWxvdyAqLworICAgIGlmIChpbG93ID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKHplcm8pOworICAgICAgICBsb3cgPSB6ZXJvOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbG93ID0gZ2V0X3JhbmdlX2xvbmdfYXJndW1lbnQoaWxvdywgInN0YXJ0Iik7CisgICAgICAgIGlmIChsb3cgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CiAKLQkvKiBpbG93IGFuZCBpaGlnaCBjb3JyZWN0IG5vdzsgZG8gaXN0ZXAgKi8KLQlpZiAoaXN0ZXAgPT0gTlVMTCkKLQkJc3RlcCA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKLQllbHNlCi0JCXN0ZXAgPSBnZXRfcmFuZ2VfbG9uZ19hcmd1bWVudChpc3RlcCwgInN0ZXAiKTsKLQlpZiAoc3RlcCA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgLyogaWxvdyBhbmQgaWhpZ2ggY29ycmVjdCBub3c7IGRvIGlzdGVwICovCisgICAgaWYgKGlzdGVwID09IE5VTEwpCisgICAgICAgIHN0ZXAgPSBQeUxvbmdfRnJvbUxvbmcoMSk7CisgICAgZWxzZQorICAgICAgICBzdGVwID0gZ2V0X3JhbmdlX2xvbmdfYXJndW1lbnQoaXN0ZXAsICJzdGVwIik7CisgICAgaWYgKHN0ZXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOwogCi0JaWYgKFB5T2JqZWN0X0NtcChzdGVwLCB6ZXJvLCAmY21wX3Jlc3VsdCkgPT0gLTEpCi0JCWdvdG8gRmFpbDsKKyAgICBpZiAoUHlPYmplY3RfQ21wKHN0ZXAsIHplcm8sICZjbXBfcmVzdWx0KSA9PSAtMSkKKyAgICAgICAgZ290byBGYWlsOwogCi0JaWYgKGNtcF9yZXN1bHQgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkicmFuZ2UoKSBzdGVwIGFyZ3VtZW50IG11c3Qgbm90IGJlIHplcm8iKTsKLQkJZ290byBGYWlsOwotCX0KKyAgICBpZiAoY21wX3Jlc3VsdCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlKCkgc3RlcCBhcmd1bWVudCBtdXN0IG5vdCBiZSB6ZXJvIik7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CiAKLQlpZiAoY21wX3Jlc3VsdCA+IDApCi0JCWJpZ24gPSBnZXRfbGVuX29mX3JhbmdlX2xvbmdzKGxvdywgaGlnaCwgc3RlcCk7Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpuZWdfc3RlcCA9IFB5TnVtYmVyX05lZ2F0aXZlKHN0ZXApOwotCQlpZiAobmVnX3N0ZXAgPT0gTlVMTCkKLQkJCWdvdG8gRmFpbDsKLQkJYmlnbiA9IGdldF9sZW5fb2ZfcmFuZ2VfbG9uZ3MoaGlnaCwgbG93LCBuZWdfc3RlcCk7Ci0JCVB5X0RFQ1JFRihuZWdfc3RlcCk7Ci0JfQorICAgIGlmIChjbXBfcmVzdWx0ID4gMCkKKyAgICAgICAgYmlnbiA9IGdldF9sZW5fb2ZfcmFuZ2VfbG9uZ3MobG93LCBoaWdoLCBzdGVwKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKm5lZ19zdGVwID0gUHlOdW1iZXJfTmVnYXRpdmUoc3RlcCk7CisgICAgICAgIGlmIChuZWdfc3RlcCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICBiaWduID0gZ2V0X2xlbl9vZl9yYW5nZV9sb25ncyhoaWdoLCBsb3csIG5lZ19zdGVwKTsKKyAgICAgICAgUHlfREVDUkVGKG5lZ19zdGVwKTsKKyAgICB9CiAKLQluID0gKFB5X3NzaXplX3QpYmlnbjsKLQlpZiAoYmlnbiA8IDAgfHwgKGxvbmcpbiAhPSBiaWduKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJyYW5nZSgpIHJlc3VsdCBoYXMgdG9vIG1hbnkgaXRlbXMiKTsKLQkJZ290byBGYWlsOwotCX0KKyAgICBuID0gKFB5X3NzaXplX3QpYmlnbjsKKyAgICBpZiAoYmlnbiA8IDAgfHwgKGxvbmcpbiAhPSBiaWduKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlKCkgcmVzdWx0IGhhcyB0b28gbWFueSBpdGVtcyIpOworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQogCi0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJZ290byBGYWlsOworICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCWN1cm51bSA9IGxvdzsKLQlQeV9JTkNSRUYoY3VybnVtKTsKKyAgICBjdXJudW0gPSBsb3c7CisgICAgUHlfSU5DUkVGKGN1cm51bSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp3ID0gUHlOdW1iZXJfTG9uZyhjdXJudW0pOwotCQlQeU9iamVjdCAqdG1wX251bTsKLQkJaWYgKHcgPT0gTlVMTCkKLQkJCWdvdG8gRmFpbDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp3ID0gUHlOdW1iZXJfTG9uZyhjdXJudW0pOworICAgICAgICBQeU9iamVjdCAqdG1wX251bTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKIAotCQlQeUxpc3RfU0VUX0lURU0odiwgaSwgdyk7CisgICAgICAgIFB5TGlzdF9TRVRfSVRFTSh2LCBpLCB3KTsKIAotCQl0bXBfbnVtID0gUHlOdW1iZXJfQWRkKGN1cm51bSwgc3RlcCk7Ci0JCWlmICh0bXBfbnVtID09IE5VTEwpCi0JCQlnb3RvIEZhaWw7CisgICAgICAgIHRtcF9udW0gPSBQeU51bWJlcl9BZGQoY3VybnVtLCBzdGVwKTsKKyAgICAgICAgaWYgKHRtcF9udW0gPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKIAotCQlQeV9ERUNSRUYoY3VybnVtKTsKLQkJY3VybnVtID0gdG1wX251bTsKLQl9Ci0JUHlfREVDUkVGKGxvdyk7Ci0JUHlfREVDUkVGKGhpZ2gpOwotCVB5X0RFQ1JFRihzdGVwKTsKLQlQeV9ERUNSRUYoemVybyk7Ci0JUHlfREVDUkVGKGN1cm51bSk7Ci0JcmV0dXJuIHY7CisgICAgICAgIFB5X0RFQ1JFRihjdXJudW0pOworICAgICAgICBjdXJudW0gPSB0bXBfbnVtOworICAgIH0KKyAgICBQeV9ERUNSRUYobG93KTsKKyAgICBQeV9ERUNSRUYoaGlnaCk7CisgICAgUHlfREVDUkVGKHN0ZXApOworICAgIFB5X0RFQ1JFRih6ZXJvKTsKKyAgICBQeV9ERUNSRUYoY3VybnVtKTsKKyAgICByZXR1cm4gdjsKIAogICBGYWlsOgotCVB5X1hERUNSRUYobG93KTsKLQlQeV9YREVDUkVGKGhpZ2gpOwotCVB5X1hERUNSRUYoc3RlcCk7Ci0JUHlfREVDUkVGKHplcm8pOwotCVB5X1hERUNSRUYoY3VybnVtKTsKLQlQeV9YREVDUkVGKHYpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYobG93KTsKKyAgICBQeV9YREVDUkVGKGhpZ2gpOworICAgIFB5X1hERUNSRUYoc3RlcCk7CisgICAgUHlfREVDUkVGKHplcm8pOworICAgIFB5X1hERUNSRUYoY3VybnVtKTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBSZXR1cm4gbnVtYmVyIG9mIGl0ZW1zIGluIHJhbmdlL3hyYW5nZSAobG8sIGhpLCBzdGVwKS4gIHN0ZXAgPiAwCkBAIC0xOTE4LDgxICsxOTE4LDgxIEBACiBzdGF0aWMgbG9uZwogZ2V0X2xlbl9vZl9yYW5nZShsb25nIGxvLCBsb25nIGhpLCBsb25nIHN0ZXApCiB7Ci0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUlmIGxvID49IGhpLCB0aGUgcmFuZ2UgaXMgZW1wdHkuCi0JRWxzZSBpZiBuIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlLCB0aGUgbGFzdCBvbmUgaXMKLQlsbyArIChuLTEpKnN0ZXAsIHdoaWNoIG11c3QgYmUgPD0gaGktMS4gIFJlYXJyYW5naW5nLAotCW4gPD0gKGhpIC0gbG8gLSAxKS9zdGVwICsgMSwgc28gdGFraW5nIHRoZSBmbG9vciBvZiB0aGUgUkhTIGdpdmVzCi0JdGhlIHByb3BlciB2YWx1ZS4gIFNpbmNlIGxvIDwgaGkgaW4gdGhpcyBjYXNlLCBoaS1sby0xID49IDAsIHNvCi0JdGhlIFJIUyBpcyBub24tbmVnYXRpdmUgYW5kIHNvIHRydW5jYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlCi0JZmxvb3IuICBMZXR0aW5nIE0gYmUgdGhlIGxhcmdlc3QgcG9zaXRpdmUgbG9uZywgdGhlIHdvcnN0IGNhc2UKLQlmb3IgdGhlIFJIUyBudW1lcmF0b3IgaXMgaGk9TSwgbG89LU0tMSwgYW5kIHRoZW4KLQloaS1sby0xID0gTS0oLU0tMSktMSA9IDIqTS4gIFRoZXJlZm9yZSB1bnNpZ25lZCBsb25nIGhhcyBlbm91Z2gKLQlwcmVjaXNpb24gdG8gY29tcHV0ZSB0aGUgUkhTIGV4YWN0bHkuCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlsb25nIG4gPSAwOwotCWlmIChsbyA8IGhpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdWhpID0gKHVuc2lnbmVkIGxvbmcpaGk7Ci0JCXVuc2lnbmVkIGxvbmcgdWxvID0gKHVuc2lnbmVkIGxvbmcpbG87Ci0JCXVuc2lnbmVkIGxvbmcgZGlmZiA9IHVoaSAtIHVsbyAtIDE7Ci0JCW4gPSAobG9uZykoZGlmZiAvICh1bnNpZ25lZCBsb25nKXN0ZXAgKyAxKTsKLQl9Ci0JcmV0dXJuIG47CisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIElmIGxvID49IGhpLCB0aGUgcmFuZ2UgaXMgZW1wdHkuCisgICAgRWxzZSBpZiBuIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlLCB0aGUgbGFzdCBvbmUgaXMKKyAgICBsbyArIChuLTEpKnN0ZXAsIHdoaWNoIG11c3QgYmUgPD0gaGktMS4gIFJlYXJyYW5naW5nLAorICAgIG4gPD0gKGhpIC0gbG8gLSAxKS9zdGVwICsgMSwgc28gdGFraW5nIHRoZSBmbG9vciBvZiB0aGUgUkhTIGdpdmVzCisgICAgdGhlIHByb3BlciB2YWx1ZS4gIFNpbmNlIGxvIDwgaGkgaW4gdGhpcyBjYXNlLCBoaS1sby0xID49IDAsIHNvCisgICAgdGhlIFJIUyBpcyBub24tbmVnYXRpdmUgYW5kIHNvIHRydW5jYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlCisgICAgZmxvb3IuICBMZXR0aW5nIE0gYmUgdGhlIGxhcmdlc3QgcG9zaXRpdmUgbG9uZywgdGhlIHdvcnN0IGNhc2UKKyAgICBmb3IgdGhlIFJIUyBudW1lcmF0b3IgaXMgaGk9TSwgbG89LU0tMSwgYW5kIHRoZW4KKyAgICBoaS1sby0xID0gTS0oLU0tMSktMSA9IDIqTS4gIFRoZXJlZm9yZSB1bnNpZ25lZCBsb25nIGhhcyBlbm91Z2gKKyAgICBwcmVjaXNpb24gdG8gY29tcHV0ZSB0aGUgUkhTIGV4YWN0bHkuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBsb25nIG4gPSAwOworICAgIGlmIChsbyA8IGhpKSB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdWhpID0gKHVuc2lnbmVkIGxvbmcpaGk7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxvID0gKHVuc2lnbmVkIGxvbmcpbG87CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZGlmZiA9IHVoaSAtIHVsbyAtIDE7CisgICAgICAgIG4gPSAobG9uZykoZGlmZiAvICh1bnNpZ25lZCBsb25nKXN0ZXAgKyAxKTsKKyAgICB9CisgICAgcmV0dXJuIG47CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3JhbmdlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGlsb3cgPSAwLCBpaGlnaCA9IDAsIGlzdGVwID0gMTsKLQlsb25nIGJpZ247Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIGxvbmcgaWxvdyA9IDAsIGloaWdoID0gMCwgaXN0ZXAgPSAxOworICAgIGxvbmcgYmlnbjsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAKLQlQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqdjsKIAotCWlmIChQeVR1cGxlX1NpemUoYXJncykgPD0gMSkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKLQkJCQkibDtyYW5nZSgpIHJlcXVpcmVzIDEtMyBpbnQgYXJndW1lbnRzIiwKLQkJCQkmaWhpZ2gpKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJcmV0dXJuIGhhbmRsZV9yYW5nZV9sb25ncyhzZWxmLCBhcmdzKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkJImxsfGw7cmFuZ2UoKSByZXF1aXJlcyAxLTMgaW50IGFyZ3VtZW50cyIsCi0JCQkJJmlsb3csICZpaGlnaCwgJmlzdGVwKSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHVybiBoYW5kbGVfcmFuZ2VfbG9uZ3Moc2VsZiwgYXJncyk7Ci0JCX0KLQl9Ci0JaWYgKGlzdGVwID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInJhbmdlKCkgc3RlcCBhcmd1bWVudCBtdXN0IG5vdCBiZSB6ZXJvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoaXN0ZXAgPiAwKQotCQliaWduID0gZ2V0X2xlbl9vZl9yYW5nZShpbG93LCBpaGlnaCwgaXN0ZXApOwotCWVsc2UKLQkJYmlnbiA9IGdldF9sZW5fb2ZfcmFuZ2UoaWhpZ2gsIGlsb3csIC1pc3RlcCk7Ci0JbiA9IChQeV9zc2l6ZV90KWJpZ247Ci0JaWYgKGJpZ24gPCAwIHx8IChsb25nKW4gIT0gYmlnbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkicmFuZ2UoKSByZXN1bHQgaGFzIHRvbyBtYW55IGl0ZW1zIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl2ID0gUHlMaXN0X05ldyhuKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp3ID0gUHlJbnRfRnJvbUxvbmcoaWxvdyk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TRVRfSVRFTSh2LCBpLCB3KTsKLQkJaWxvdyArPSBpc3RlcDsKLQl9Ci0JcmV0dXJuIHY7CisgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA8PSAxKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgImw7cmFuZ2UoKSByZXF1aXJlcyAxLTMgaW50IGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAmaWhpZ2gpKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZV9yYW5nZV9sb25ncyhzZWxmLCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAibGx8bDtyYW5nZSgpIHJlcXVpcmVzIDEtMyBpbnQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpbG93LCAmaWhpZ2gsICZpc3RlcCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlX3JhbmdlX2xvbmdzKHNlbGYsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpc3RlcCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlKCkgc3RlcCBhcmd1bWVudCBtdXN0IG5vdCBiZSB6ZXJvIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaXN0ZXAgPiAwKQorICAgICAgICBiaWduID0gZ2V0X2xlbl9vZl9yYW5nZShpbG93LCBpaGlnaCwgaXN0ZXApOworICAgIGVsc2UKKyAgICAgICAgYmlnbiA9IGdldF9sZW5fb2ZfcmFuZ2UoaWhpZ2gsIGlsb3csIC1pc3RlcCk7CisgICAgbiA9IChQeV9zc2l6ZV90KWJpZ247CisgICAgaWYgKGJpZ24gPCAwIHx8IChsb25nKW4gIT0gYmlnbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZSgpIHJlc3VsdCBoYXMgdG9vIG1hbnkgaXRlbXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKncgPSBQeUludF9Gcm9tTG9uZyhpbG93KTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHYsIGksIHcpOworICAgICAgICBpbG93ICs9IGlzdGVwOworICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogUHlEb2NfU1RSVkFSKHJhbmdlX2RvYywKQEAgLTIwMDgsNzUgKzIwMDgsNzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3Jhd19pbnB1dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnYgPSBOVUxMOwotCVB5T2JqZWN0ICpmaW4gPSBQeVN5c19HZXRPYmplY3QoInN0ZGluIik7Ci0JUHlPYmplY3QgKmZvdXQgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOworICAgIFB5T2JqZWN0ICp2ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZmluID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRpbiIpOworICAgIFB5T2JqZWN0ICpmb3V0ID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIltyYXdfXWlucHV0IiwgMCwgMSwgJnYpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJbcmF3X11pbnB1dCIsIDAsIDEsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZmluID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIltyYXdfXWlucHV0OiBsb3N0IHN5cy5zdGRpbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGZvdXQgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiW3Jhd19daW5wdXQ6IGxvc3Qgc3lzLnN0ZG91dCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5RmlsZV9Tb2Z0U3BhY2UoZm91dCwgMCkpIHsKLQkJaWYgKFB5RmlsZV9Xcml0ZVN0cmluZygiICIsIGZvdXQpICE9IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5RmlsZV9Bc0ZpbGUoZmluKSAmJiBQeUZpbGVfQXNGaWxlKGZvdXQpCi0gICAgICAgICAgICAmJiBpc2F0dHkoZmlsZW5vKFB5RmlsZV9Bc0ZpbGUoZmluKSkpCi0gICAgICAgICAgICAmJiBpc2F0dHkoZmlsZW5vKFB5RmlsZV9Bc0ZpbGUoZm91dCkpKSkgewotCQlQeU9iamVjdCAqcG87Ci0JCWNoYXIgKnByb21wdDsKLQkJY2hhciAqczsKLQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJaWYgKHYgIT0gTlVMTCkgewotCQkJcG8gPSBQeU9iamVjdF9TdHIodik7Ci0JCQlpZiAocG8gPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCXByb21wdCA9IFB5U3RyaW5nX0FzU3RyaW5nKHBvKTsKLQkJCWlmIChwcm9tcHQgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbHNlIHsKLQkJCXBvID0gTlVMTDsKLQkJCXByb21wdCA9ICIiOwotCQl9Ci0JCXMgPSBQeU9TX1JlYWRsaW5lKFB5RmlsZV9Bc0ZpbGUoZmluKSwgUHlGaWxlX0FzRmlsZShmb3V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQpOwotCQlQeV9YREVDUkVGKHBvKTsKLQkJaWYgKHMgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJCVB5RXJyX1NldE5vbmUoUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKCpzID09ICdcMCcpIHsKLQkJCVB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotCQkJcmVzdWx0ID0gTlVMTDsKLQkJfQotCQllbHNlIHsgLyogc3RyaXAgdHJhaWxpbmcgJ1xuJyAqLwotCQkJc2l6ZV90IGxlbiA9IHN0cmxlbihzKTsKLQkJCWlmIChsZW4gPiBQWV9TU0laRV9UX01BWCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkJIltyYXdfXWlucHV0OiBpbnB1dCB0b28gbG9uZyIpOwotCQkJCXJlc3VsdCA9IE5VTEw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4tMSk7Ci0JCQl9Ci0JCX0KLQkJUHlNZW1fRlJFRShzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlpZiAoUHlGaWxlX1dyaXRlT2JqZWN0KHYsIGZvdXQsIFB5X1BSSU5UX1JBVykgIT0gMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlGaWxlX0dldExpbmUoZmluLCAtMSk7CisgICAgaWYgKGZpbiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJbcmF3X11pbnB1dDogbG9zdCBzeXMuc3RkaW4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChmb3V0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIltyYXdfXWlucHV0OiBsb3N0IHN5cy5zdGRvdXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUZpbGVfU29mdFNwYWNlKGZvdXQsIDApKSB7CisgICAgICAgIGlmIChQeUZpbGVfV3JpdGVTdHJpbmcoIiAiLCBmb3V0KSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUZpbGVfQXNGaWxlKGZpbikgJiYgUHlGaWxlX0FzRmlsZShmb3V0KQorICAgICAgICAmJiBpc2F0dHkoZmlsZW5vKFB5RmlsZV9Bc0ZpbGUoZmluKSkpCisgICAgICAgICYmIGlzYXR0eShmaWxlbm8oUHlGaWxlX0FzRmlsZShmb3V0KSkpKSB7CisgICAgICAgIFB5T2JqZWN0ICpwbzsKKyAgICAgICAgY2hhciAqcHJvbXB0OworICAgICAgICBjaGFyICpzOworICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgICAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgICAgICBwbyA9IFB5T2JqZWN0X1N0cih2KTsKKyAgICAgICAgICAgIGlmIChwbyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcHJvbXB0ID0gUHlTdHJpbmdfQXNTdHJpbmcocG8pOworICAgICAgICAgICAgaWYgKHByb21wdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcG8gPSBOVUxMOworICAgICAgICAgICAgcHJvbXB0ID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgcyA9IFB5T1NfUmVhZGxpbmUoUHlGaWxlX0FzRmlsZShmaW4pLCBQeUZpbGVfQXNGaWxlKGZvdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQpOworICAgICAgICBQeV9YREVDUkVGKHBvKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzID09ICdcMCcpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOworICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLyogc3RyaXAgdHJhaWxpbmcgJ1xuJyAqLworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW3Jhd19daW5wdXQ6IGlucHV0IHRvbyBsb25nIik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbi0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeU1lbV9GUkVFKHMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIGlmIChQeUZpbGVfV3JpdGVPYmplY3QodiwgZm91dCwgUHlfUFJJTlRfUkFXKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUZpbGVfR2V0TGluZShmaW4sIC0xKTsKIH0KIAogUHlEb2NfU1RSVkFSKHJhd19pbnB1dF9kb2MsCkBAIC0yMDkxLDIyICsyMDkxLDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9yZWR1Y2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0YXRpYyBQeU9iamVjdCAqZnVuY3Rvb2xzX3JlZHVjZSA9IE5VTEw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpmdW5jdG9vbHNfcmVkdWNlID0gTlVMTDsKIAotCWlmIChQeUVycl9XYXJuUHkzaygicmVkdWNlKCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKLQkJCSAgICJ1c2UgZnVuY3Rvb2xzLnJlZHVjZSgpIiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInJlZHVjZSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCisgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgZnVuY3Rvb2xzLnJlZHVjZSgpIiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChmdW5jdG9vbHNfcmVkdWNlID09IE5VTEwpIHsKLQkJUHlPYmplY3QgKmZ1bmN0b29scyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiZnVuY3Rvb2xzIik7Ci0JCWlmIChmdW5jdG9vbHMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlmdW5jdG9vbHNfcmVkdWNlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhmdW5jdG9vbHMsICJyZWR1Y2UiKTsKLQkJUHlfREVDUkVGKGZ1bmN0b29scyk7Ci0JCWlmIChmdW5jdG9vbHNfcmVkdWNlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGwoZnVuY3Rvb2xzX3JlZHVjZSwgYXJncywgTlVMTCk7CisgICAgaWYgKGZ1bmN0b29sc19yZWR1Y2UgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqZnVuY3Rvb2xzID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJmdW5jdG9vbHMiKTsKKyAgICAgICAgaWYgKGZ1bmN0b29scyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZ1bmN0b29sc19yZWR1Y2UgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGZ1bmN0b29scywgInJlZHVjZSIpOworICAgICAgICBQeV9ERUNSRUYoZnVuY3Rvb2xzKTsKKyAgICAgICAgaWYgKGZ1bmN0b29sc19yZWR1Y2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbChmdW5jdG9vbHNfcmVkdWNlLCBhcmdzLCBOVUxMKTsKIH0KIAogUHlEb2NfU1RSVkFSKHJlZHVjZV9kb2MsCkBAIC0yMTIzLDExICsyMTIzLDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9yZWxvYWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCByZWxvYWQoKSBpcyByZW5hbWVkIHRvIGltcC5yZWxvYWQoKSIsCi0JCQkgICAxKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCByZWxvYWQoKSBpcyByZW5hbWVkIHRvIGltcC5yZWxvYWQoKSIsCisgICAgICAgICAgICAgICAgICAgICAgIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbXBvcnRfUmVsb2FkTW9kdWxlKHYpOworICAgIHJldHVybiBQeUltcG9ydF9SZWxvYWRNb2R1bGUodik7CiB9CiAKIFB5RG9jX1NUUlZBUihyZWxvYWRfZG9jLApAQCAtMjEzOSw3ICsyMTM5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3JlcHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCXJldHVybiBQeU9iamVjdF9SZXByKHYpOworICAgIHJldHVybiBQeU9iamVjdF9SZXByKHYpOwogfQogCiBQeURvY19TVFJWQVIocmVwcl9kb2MsCkBAIC0yMTUyLDQ1ICsyMTUyLDQ1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9yb3VuZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWRvdWJsZSB4OwotCVB5T2JqZWN0ICpvX25kaWdpdHMgPSBOVUxMOwotCVB5X3NzaXplX3QgbmRpZ2l0czsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im51bWJlciIsICJuZGlnaXRzIiwgMH07CisgICAgZG91YmxlIHg7CisgICAgUHlPYmplY3QgKm9fbmRpZ2l0cyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBuZGlnaXRzOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibnVtYmVyIiwgIm5kaWdpdHMiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJkfE86cm91bmQiLAotCQlrd2xpc3QsICZ4LCAmb19uZGlnaXRzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgImR8Tzpyb3VuZCIsCisgICAgICAgIGt3bGlzdCwgJngsICZvX25kaWdpdHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChvX25kaWdpdHMgPT0gTlVMTCkgewotCQkvKiBzZWNvbmQgYXJndW1lbnQgZGVmYXVsdHMgdG8gMCAqLwotCQluZGlnaXRzID0gMDsKLQl9Ci0JZWxzZSB7Ci0JCS8qIGludGVycHJldCAybmQgYXJndW1lbnQgYXMgYSBQeV9zc2l6ZV90OyBjbGlwIG9uIG92ZXJmbG93ICovCi0JCW5kaWdpdHMgPSBQeU51bWJlcl9Bc1NzaXplX3Qob19uZGlnaXRzLCBOVUxMKTsKLQkJaWYgKG5kaWdpdHMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAob19uZGlnaXRzID09IE5VTEwpIHsKKyAgICAgICAgLyogc2Vjb25kIGFyZ3VtZW50IGRlZmF1bHRzIHRvIDAgKi8KKyAgICAgICAgbmRpZ2l0cyA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBpbnRlcnByZXQgMm5kIGFyZ3VtZW50IGFzIGEgUHlfc3NpemVfdDsgY2xpcCBvbiBvdmVyZmxvdyAqLworICAgICAgICBuZGlnaXRzID0gUHlOdW1iZXJfQXNTc2l6ZV90KG9fbmRpZ2l0cywgTlVMTCk7CisgICAgICAgIGlmIChuZGlnaXRzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBuYW5zLCBpbmZpbml0aWVzIGFuZCB6ZXJvcyByb3VuZCB0byB0aGVtc2VsdmVzICovCi0JaWYgKCFQeV9JU19GSU5JVEUoeCkgfHwgeCA9PSAwLjApCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgLyogbmFucywgaW5maW5pdGllcyBhbmQgemVyb3Mgcm91bmQgdG8gdGhlbXNlbHZlcyAqLworICAgIGlmICghUHlfSVNfRklOSVRFKHgpIHx8IHggPT0gMC4wKQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwogCi0JLyogRGVhbCB3aXRoIGV4dHJlbWUgdmFsdWVzIGZvciBuZGlnaXRzLiBGb3IgbmRpZ2l0cyA+IE5ESUdJVFNfTUFYLCB4Ci0JICAgYWx3YXlzIHJvdW5kcyB0byBpdHNlbGYuICBGb3IgbmRpZ2l0cyA8IE5ESUdJVFNfTUlOLCB4IGFsd2F5cwotCSAgIHJvdW5kcyB0byArLTAuMC4gIEhlcmUgMC4zMDEwMyBpcyBhbiB1cHBlciBib3VuZCBmb3IgbG9nMTAoMikuICovCisgICAgLyogRGVhbCB3aXRoIGV4dHJlbWUgdmFsdWVzIGZvciBuZGlnaXRzLiBGb3IgbmRpZ2l0cyA+IE5ESUdJVFNfTUFYLCB4CisgICAgICAgYWx3YXlzIHJvdW5kcyB0byBpdHNlbGYuICBGb3IgbmRpZ2l0cyA8IE5ESUdJVFNfTUlOLCB4IGFsd2F5cworICAgICAgIHJvdW5kcyB0byArLTAuMC4gIEhlcmUgMC4zMDEwMyBpcyBhbiB1cHBlciBib3VuZCBmb3IgbG9nMTAoMikuICovCiAjZGVmaW5lIE5ESUdJVFNfTUFYICgoaW50KSgoREJMX01BTlRfRElHLURCTF9NSU5fRVhQKSAqIDAuMzAxMDMpKQogI2RlZmluZSBORElHSVRTX01JTiAoLShpbnQpKChEQkxfTUFYX0VYUCArIDEpICogMC4zMDEwMykpCi0JaWYgKG5kaWdpdHMgPiBORElHSVRTX01BWCkKLQkJLyogcmV0dXJuIHggKi8KLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKLQllbHNlIGlmIChuZGlnaXRzIDwgTkRJR0lUU19NSU4pCi0JCS8qIHJldHVybiAwLjAsIGJ1dCB3aXRoIHNpZ24gb2YgeCAqLwotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKDAuMCp4KTsKLQllbHNlCi0JCS8qIGZpbml0ZSB4LCBhbmQgbmRpZ2l0cyBpcyBub3QgdW5yZWFzb25hYmx5IGxhcmdlICovCi0JCS8qIF9QeV9kb3VibGVfcm91bmQgaXMgZGVmaW5lZCBpbiBmbG9hdG9iamVjdC5jICovCi0JCXJldHVybiBfUHlfZG91YmxlX3JvdW5kKHgsIChpbnQpbmRpZ2l0cyk7CisgICAgaWYgKG5kaWdpdHMgPiBORElHSVRTX01BWCkKKyAgICAgICAgLyogcmV0dXJuIHggKi8KKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKKyAgICBlbHNlIGlmIChuZGlnaXRzIDwgTkRJR0lUU19NSU4pCisgICAgICAgIC8qIHJldHVybiAwLjAsIGJ1dCB3aXRoIHNpZ24gb2YgeCAqLworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKDAuMCp4KTsKKyAgICBlbHNlCisgICAgICAgIC8qIGZpbml0ZSB4LCBhbmQgbmRpZ2l0cyBpcyBub3QgdW5yZWFzb25hYmx5IGxhcmdlICovCisgICAgICAgIC8qIF9QeV9kb3VibGVfcm91bmQgaXMgZGVmaW5lZCBpbiBmbG9hdG9iamVjdC5jICovCisgICAgICAgIHJldHVybiBfUHlfZG91YmxlX3JvdW5kKHgsIChpbnQpbmRpZ2l0cyk7CiAjdW5kZWYgTkRJR0lUU19NQVgKICN1bmRlZiBORElHSVRTX01JTgogfQpAQCAtMjIwNCw0MiArMjIwNCw0MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fc29ydGVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKm5ld2xpc3QsICp2LCAqc2VxLCAqY29tcGFyZT1OVUxMLCAqa2V5ZnVuYz1OVUxMLCAqbmV3YXJnczsKLQlQeU9iamVjdCAqY2FsbGFibGU7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJpdGVyYWJsZSIsICJjbXAiLCAia2V5IiwgInJldmVyc2UiLCAwfTsKLQlpbnQgcmV2ZXJzZTsKKyAgICBQeU9iamVjdCAqbmV3bGlzdCwgKnYsICpzZXEsICpjb21wYXJlPU5VTEwsICprZXlmdW5jPU5VTEwsICpuZXdhcmdzOworICAgIFB5T2JqZWN0ICpjYWxsYWJsZTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Iml0ZXJhYmxlIiwgImNtcCIsICJrZXkiLCAicmV2ZXJzZSIsIDB9OworICAgIGludCByZXZlcnNlOwogCi0JLyogYXJncyAxLTQgc2hvdWxkIG1hdGNoIGxpc3Rzb3J0IGluIE9iamVjdHMvbGlzdG9iamVjdC5jICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98T09pOnNvcnRlZCIsCi0JCWt3bGlzdCwgJnNlcSwgJmNvbXBhcmUsICZrZXlmdW5jLCAmcmV2ZXJzZSkpCi0JCXJldHVybiBOVUxMOworICAgIC8qIGFyZ3MgMS00IHNob3VsZCBtYXRjaCBsaXN0c29ydCBpbiBPYmplY3RzL2xpc3RvYmplY3QuYyAqLworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE9PaTpzb3J0ZWQiLAorICAgICAgICBrd2xpc3QsICZzZXEsICZjb21wYXJlLCAma2V5ZnVuYywgJnJldmVyc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW5ld2xpc3QgPSBQeVNlcXVlbmNlX0xpc3Qoc2VxKTsKLQlpZiAobmV3bGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuZXdsaXN0ID0gUHlTZXF1ZW5jZV9MaXN0KHNlcSk7CisgICAgaWYgKG5ld2xpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljYWxsYWJsZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobmV3bGlzdCwgInNvcnQiKTsKLQlpZiAoY2FsbGFibGUgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobmV3bGlzdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBjYWxsYWJsZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobmV3bGlzdCwgInNvcnQiKTsKKyAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobmV3bGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW5ld2FyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIDQpOwotCWlmIChuZXdhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG5ld2xpc3QpOwotCQlQeV9ERUNSRUYoY2FsbGFibGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgNCk7CisgICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobmV3bGlzdCk7CisgICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXYgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBuZXdhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JUHlfREVDUkVGKGNhbGxhYmxlKTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihuZXdsaXN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gbmV3bGlzdDsKKyAgICB2ID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgbmV3YXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobmV3bGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIG5ld2xpc3Q7CiB9CiAKIFB5RG9jX1NUUlZBUihzb3J0ZWRfZG9jLApAQCAtMjI0OCwzMCArMjI0OCwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fdmFycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnYgPSBOVUxMOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICp2ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInZhcnMiLCAwLCAxLCAmdikpCi0JCXJldHVybiBOVUxMOwotCWlmICh2ID09IE5VTEwpIHsKLQkJZCA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKLQkJaWYgKGQgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJCSJ2YXJzKCk6IG5vIGxvY2FscyE/Iik7Ci0JCX0KLQkJZWxzZQotCQkJUHlfSU5DUkVGKGQpOwotCX0KLQllbHNlIHsKLQkJZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgIl9fZGljdF9fIik7Ci0JCWlmIChkID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgInZhcnMoKSBhcmd1bWVudCBtdXN0IGhhdmUgX19kaWN0X18gYXR0cmlidXRlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gZDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ2YXJzIiwgMCwgMSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIGQgPSBQeUV2YWxfR2V0TG9jYWxzKCk7CisgICAgICAgIGlmIChkID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJzKCk6IG5vIGxvY2FscyE/Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfSU5DUkVGKGQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgIl9fZGljdF9fIik7CisgICAgICAgIGlmIChkID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgInZhcnMoKSBhcmd1bWVudCBtdXN0IGhhdmUgX19kaWN0X18gYXR0cmlidXRlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZDsKIH0KIAogUHlEb2NfU1RSVkFSKHZhcnNfZG9jLApAQCAtMjI4NCwxNDAgKzIyODQsMTQwIEBACiBzdGF0aWMgUHlPYmplY3QqCiBidWlsdGluX3N1bShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNlcTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlQeU9iamVjdCAqdGVtcCwgKml0ZW0sICppdGVyOworICAgIFB5T2JqZWN0ICpzZXE7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRlbXAsICppdGVtLCAqaXRlcjsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN1bSIsIDEsIDIsICZzZXEsICZyZXN1bHQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdW0iLCAxLCAyLCAmc2VxLCAmcmVzdWx0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpdGVyID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCWlmIChpdGVyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoMCk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGl0ZXIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiByZWplY3Qgc3RyaW5nIHZhbHVlcyBmb3IgJ3N0YXJ0JyBwYXJhbWV0ZXIgKi8KLQkJaWYgKFB5T2JqZWN0X1R5cGVDaGVjayhyZXN1bHQsICZQeUJhc2VTdHJpbmdfVHlwZSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInN1bSgpIGNhbid0IHN1bSBzdHJpbmdzIFt1c2UgJycuam9pbihzZXEpIGluc3RlYWRdIik7Ci0JCQlQeV9ERUNSRUYoaXRlcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQl9CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKDApOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogcmVqZWN0IHN0cmluZyB2YWx1ZXMgZm9yICdzdGFydCcgcGFyYW1ldGVyICovCisgICAgICAgIGlmIChQeU9iamVjdF9UeXBlQ2hlY2socmVzdWx0LCAmUHlCYXNlU3RyaW5nX1R5cGUpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJzdW0oKSBjYW4ndCBzdW0gc3RyaW5ncyBbdXNlICcnLmpvaW4oc2VxKSBpbnN0ZWFkXSIpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZXIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgfQogCiAjaWZuZGVmIFNMT1dfU1VNCi0JLyogRmFzdCBhZGRpdGlvbiBieSBrZWVwaW5nIHRlbXBvcmFyeSBzdW1zIGluIEMgaW5zdGVhZCBvZiBuZXcgUHl0aG9uIG9iamVjdHMuCi0gICAgICAgICAgIEFzc3VtZXMgYWxsIGlucHV0cyBhcmUgdGhlIHNhbWUgdHlwZS4gIElmIHRoZSBhc3N1bXB0aW9uIGZhaWxzLCBkZWZhdWx0Ci0gICAgICAgICAgIHRvIHRoZSBtb3JlIGdlbmVyYWwgcm91dGluZS4KLQkqLwotCWlmIChQeUludF9DaGVja0V4YWN0KHJlc3VsdCkpIHsKLQkJbG9uZyBpX3Jlc3VsdCA9IFB5SW50X0FTX0xPTkcocmVzdWx0KTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJlc3VsdCA9IE5VTEw7Ci0JCXdoaWxlKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCQlpdGVtID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZXIpOwotCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQlyZXR1cm4gTlVMTDsKLSAgICAJCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKGlfcmVzdWx0KTsKLQkJCX0KLSAgICAgICAgCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdChpdGVtKSkgewotICAgICAgICAgICAgCQkJbG9uZyBiID0gUHlJbnRfQVNfTE9ORyhpdGVtKTsKLQkJCQlsb25nIHggPSBpX3Jlc3VsdCArIGI7Ci0JCQkJaWYgKCh4XmlfcmVzdWx0KSA+PSAwIHx8ICh4XmIpID49IDApIHsKLQkJCQkJaV9yZXN1bHQgPSB4OwotCQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCS8qIEVpdGhlciBvdmVyZmxvd2VkIG9yIGlzIG5vdCBhbiBpbnQuIFJlc3RvcmUgcmVhbCBvYmplY3RzIGFuZCBwcm9jZXNzIG5vcm1hbGx5ICovCi0JCQlyZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhpX3Jlc3VsdCk7Ci0JCQl0ZW1wID0gUHlOdW1iZXJfQWRkKHJlc3VsdCwgaXRlbSk7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCXJlc3VsdCA9IHRlbXA7Ci0JCQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlcik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogRmFzdCBhZGRpdGlvbiBieSBrZWVwaW5nIHRlbXBvcmFyeSBzdW1zIGluIEMgaW5zdGVhZCBvZiBuZXcgUHl0aG9uIG9iamVjdHMuCisgICAgICAgQXNzdW1lcyBhbGwgaW5wdXRzIGFyZSB0aGUgc2FtZSB0eXBlLiAgSWYgdGhlIGFzc3VtcHRpb24gZmFpbHMsIGRlZmF1bHQKKyAgICAgICB0byB0aGUgbW9yZSBnZW5lcmFsIHJvdXRpbmUuCisgICAgKi8KKyAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChyZXN1bHQpKSB7CisgICAgICAgIGxvbmcgaV9yZXN1bHQgPSBQeUludF9BU19MT05HKHJlc3VsdCk7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICB3aGlsZShyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXIpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGlfcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQeUludF9DaGVja0V4YWN0KGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgbG9uZyBiID0gUHlJbnRfQVNfTE9ORyhpdGVtKTsKKyAgICAgICAgICAgICAgICBsb25nIHggPSBpX3Jlc3VsdCArIGI7CisgICAgICAgICAgICAgICAgaWYgKCh4XmlfcmVzdWx0KSA+PSAwIHx8ICh4XmIpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaV9yZXN1bHQgPSB4OworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEVpdGhlciBvdmVyZmxvd2VkIG9yIGlzIG5vdCBhbiBpbnQuIFJlc3RvcmUgcmVhbCBvYmplY3RzIGFuZCBwcm9jZXNzIG5vcm1hbGx5ICovCisgICAgICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhpX3Jlc3VsdCk7CisgICAgICAgICAgICB0ZW1wID0gUHlOdW1iZXJfQWRkKHJlc3VsdCwgaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHRlbXA7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoUHlGbG9hdF9DaGVja0V4YWN0KHJlc3VsdCkpIHsKLQkJZG91YmxlIGZfcmVzdWx0ID0gUHlGbG9hdF9BU19ET1VCTEUocmVzdWx0KTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJlc3VsdCA9IE5VTEw7Ci0JCXdoaWxlKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCQlpdGVtID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZXIpOwotCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQlyZXR1cm4gTlVMTDsKLSAgICAJCQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmX3Jlc3VsdCk7Ci0JCQl9Ci0gICAgICAgIAkJaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChpdGVtKSkgewotCQkJCVB5RlBFX1NUQVJUX1BST1RFQ1QoImFkZCIsIFB5X0RFQ1JFRihpdGVtKTsgUHlfREVDUkVGKGl0ZXIpOyByZXR1cm4gMCkKLQkJCQlmX3Jlc3VsdCArPSBQeUZsb2F0X0FTX0RPVUJMRShpdGVtKTsKLQkJCQlQeUZQRV9FTkRfUFJPVEVDVChmX3Jlc3VsdCkKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0gICAgICAgIAkJaWYgKFB5SW50X0NoZWNrRXhhY3QoaXRlbSkpIHsKLQkJCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJhZGQiLCBQeV9ERUNSRUYoaXRlbSk7IFB5X0RFQ1JFRihpdGVyKTsgcmV0dXJuIDApCi0JCQkJZl9yZXN1bHQgKz0gKGRvdWJsZSlQeUludF9BU19MT05HKGl0ZW0pOwotCQkJCVB5RlBFX0VORF9QUk9URUNUKGZfcmVzdWx0KQotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZShmX3Jlc3VsdCk7Ci0JCQl0ZW1wID0gUHlOdW1iZXJfQWRkKHJlc3VsdCwgaXRlbSk7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCXJlc3VsdCA9IHRlbXA7Ci0JCQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlcik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChyZXN1bHQpKSB7CisgICAgICAgIGRvdWJsZSBmX3Jlc3VsdCA9IFB5RmxvYXRfQVNfRE9VQkxFKHJlc3VsdCk7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICB3aGlsZShyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXIpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmX3Jlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiYWRkIiwgUHlfREVDUkVGKGl0ZW0pOyBQeV9ERUNSRUYoaXRlcik7IHJldHVybiAwKQorICAgICAgICAgICAgICAgIGZfcmVzdWx0ICs9IFB5RmxvYXRfQVNfRE9VQkxFKGl0ZW0pOworICAgICAgICAgICAgICAgIFB5RlBFX0VORF9QUk9URUNUKGZfcmVzdWx0KQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQeUludF9DaGVja0V4YWN0KGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiYWRkIiwgUHlfREVDUkVGKGl0ZW0pOyBQeV9ERUNSRUYoaXRlcik7IHJldHVybiAwKQorICAgICAgICAgICAgICAgIGZfcmVzdWx0ICs9IChkb3VibGUpUHlJbnRfQVNfTE9ORyhpdGVtKTsKKyAgICAgICAgICAgICAgICBQeUZQRV9FTkRfUFJPVEVDVChmX3Jlc3VsdCkKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoZl9yZXN1bHQpOworICAgICAgICAgICAgdGVtcCA9IFB5TnVtYmVyX0FkZChyZXN1bHQsIGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICByZXN1bHQgPSB0ZW1wOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKLQlmb3IoOzspIHsKLQkJaXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQkvKiBlcnJvciwgb3IgZW5kLW9mLXNlcXVlbmNlICovCi0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJlc3VsdCA9IE5VTEw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQkvKiBJdCdzIHRlbXB0aW5nIHRvIHVzZSBQeU51bWJlcl9JblBsYWNlQWRkIGluc3RlYWQgb2YKLQkJICAgUHlOdW1iZXJfQWRkIGhlcmUsIHRvIGF2b2lkIHF1YWRyYXRpYyBydW5uaW5nIHRpbWUKLQkJICAgd2hlbiBkb2luZyAnc3VtKGxpc3Rfb2ZfbGlzdHMsIFtdKScuICBIb3dldmVyLCB0aGlzCi0JCSAgIHdvdWxkIHByb2R1Y2UgYSBjaGFuZ2UgaW4gYmVoYXZpb3VyOiBhIHNuaXBwZXQgbGlrZQorICAgIGZvcig7OykgeworICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIGVycm9yLCBvciBlbmQtb2Ytc2VxdWVuY2UgKi8KKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIEl0J3MgdGVtcHRpbmcgdG8gdXNlIFB5TnVtYmVyX0luUGxhY2VBZGQgaW5zdGVhZCBvZgorICAgICAgICAgICBQeU51bWJlcl9BZGQgaGVyZSwgdG8gYXZvaWQgcXVhZHJhdGljIHJ1bm5pbmcgdGltZQorICAgICAgICAgICB3aGVuIGRvaW5nICdzdW0obGlzdF9vZl9saXN0cywgW10pJy4gIEhvd2V2ZXIsIHRoaXMKKyAgICAgICAgICAgd291bGQgcHJvZHVjZSBhIGNoYW5nZSBpbiBiZWhhdmlvdXI6IGEgc25pcHBldCBsaWtlCiAKLQkJICAgICBlbXB0eSA9IFtdCi0JCSAgICAgc3VtKFtbeF0gZm9yIHggaW4gcmFuZ2UoMTApXSwgZW1wdHkpCisgICAgICAgICAgICAgZW1wdHkgPSBbXQorICAgICAgICAgICAgIHN1bShbW3hdIGZvciB4IGluIHJhbmdlKDEwKV0sIGVtcHR5KQogCi0JCSAgIHdvdWxkIGNoYW5nZSB0aGUgdmFsdWUgb2YgZW1wdHkuICovCi0JCXRlbXAgPSBQeU51bWJlcl9BZGQocmVzdWx0LCBpdGVtKTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQkJcmVzdWx0ID0gdGVtcDsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JfQotCVB5X0RFQ1JFRihpdGVyKTsKLQlyZXR1cm4gcmVzdWx0OworICAgICAgICAgICB3b3VsZCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGVtcHR5LiAqLworICAgICAgICB0ZW1wID0gUHlOdW1iZXJfQWRkKHJlc3VsdCwgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIHJlc3VsdCA9IHRlbXA7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHN1bV9kb2MsCkBAIC0yNDMxLDE3ICsyNDMxLDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9pc2luc3RhbmNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqaW5zdDsKLQlQeU9iamVjdCAqY2xzOwotCWludCByZXR2YWw7CisgICAgUHlPYmplY3QgKmluc3Q7CisgICAgUHlPYmplY3QgKmNsczsKKyAgICBpbnQgcmV0dmFsOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaXNpbnN0YW5jZSIsIDIsIDIsICZpbnN0LCAmY2xzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaXNpbnN0YW5jZSIsIDIsIDIsICZpbnN0LCAmY2xzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR2YWwgPSBQeU9iamVjdF9Jc0luc3RhbmNlKGluc3QsIGNscyk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcocmV0dmFsKTsKKyAgICByZXR2YWwgPSBQeU9iamVjdF9Jc0luc3RhbmNlKGluc3QsIGNscyk7CisgICAgaWYgKHJldHZhbCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmV0dmFsKTsKIH0KIAogUHlEb2NfU1RSVkFSKGlzaW5zdGFuY2VfZG9jLApAQCAtMjQ1NiwxNyArMjQ1NiwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5faXNzdWJjbGFzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmRlcml2ZWQ7Ci0JUHlPYmplY3QgKmNsczsKLQlpbnQgcmV0dmFsOworICAgIFB5T2JqZWN0ICpkZXJpdmVkOworICAgIFB5T2JqZWN0ICpjbHM7CisgICAgaW50IHJldHZhbDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImlzc3ViY2xhc3MiLCAyLCAyLCAmZGVyaXZlZCwgJmNscykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImlzc3ViY2xhc3MiLCAyLCAyLCAmZGVyaXZlZCwgJmNscykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dmFsID0gUHlPYmplY3RfSXNTdWJjbGFzcyhkZXJpdmVkLCBjbHMpOwotCWlmIChyZXR2YWwgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJldHZhbCk7CisgICAgcmV0dmFsID0gUHlPYmplY3RfSXNTdWJjbGFzcyhkZXJpdmVkLCBjbHMpOworICAgIGlmIChyZXR2YWwgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJldHZhbCk7CiB9CiAKIFB5RG9jX1NUUlZBUihpc3N1YmNsYXNzX2RvYywKQEAgLTI0ODAsMTA0ICsyNDgwLDEwNCBAQAogc3RhdGljIFB5T2JqZWN0KgogYnVpbHRpbl96aXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXQ7Ci0JY29uc3QgUHlfc3NpemVfdCBpdGVtc2l6ZSA9IFB5U2VxdWVuY2VfTGVuZ3RoKGFyZ3MpOwotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqaXRsaXN0OyAgLyogdHVwbGUgb2YgaXRlcmF0b3JzICovCi0JUHlfc3NpemVfdCBsZW47CSAgIC8qIGd1ZXNzIGF0IHJlc3VsdCBsZW5ndGggKi8KKyAgICBQeU9iamVjdCAqcmV0OworICAgIGNvbnN0IFB5X3NzaXplX3QgaXRlbXNpemUgPSBQeVNlcXVlbmNlX0xlbmd0aChhcmdzKTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKml0bGlzdDsgIC8qIHR1cGxlIG9mIGl0ZXJhdG9ycyAqLworICAgIFB5X3NzaXplX3QgbGVuOyAgICAgICAgLyogZ3Vlc3MgYXQgcmVzdWx0IGxlbmd0aCAqLwogCi0JaWYgKGl0ZW1zaXplID09IDApCi0JCXJldHVybiBQeUxpc3RfTmV3KDApOworICAgIGlmIChpdGVtc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gUHlMaXN0X05ldygwKTsKIAotCS8qIGFyZ3MgbXVzdCBiZSBhIHR1cGxlICovCi0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOworICAgIC8qIGFyZ3MgbXVzdCBiZSBhIHR1cGxlICovCisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwogCi0JLyogR3Vlc3MgYXQgcmVzdWx0IGxlbmd0aDogIHRoZSBzaG9ydGVzdCBvZiB0aGUgaW5wdXQgbGVuZ3Rocy4KLQkgICBJZiBzb21lIGFyZ3VtZW50IHJlZnVzZXMgdG8gc2F5LCB3ZSByZWZ1c2UgdG8gZ3Vlc3MgdG9vLCBsZXN0Ci0JICAgYW4gYXJndW1lbnQgbGlrZSB4cmFuZ2Uoc3lzLm1heGludCkgbGVhZCB1cyBhc3RyYXkuKi8KLQlsZW4gPSAtMTsJLyogdW5rbm93biAqLwotCWZvciAoaSA9IDA7IGkgPCBpdGVtc2l6ZTsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJUHlfc3NpemVfdCB0aGlzbGVuID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQoaXRlbSwgLTIpOwotCQlpZiAodGhpc2xlbiA8IDApIHsKLQkJCWlmICh0aGlzbGVuID09IC0xKQotCQkJCXJldHVybiBOVUxMOwotCQkJbGVuID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmIChsZW4gPCAwIHx8IHRoaXNsZW4gPCBsZW4pCi0JCQlsZW4gPSB0aGlzbGVuOwotCX0KKyAgICAvKiBHdWVzcyBhdCByZXN1bHQgbGVuZ3RoOiAgdGhlIHNob3J0ZXN0IG9mIHRoZSBpbnB1dCBsZW5ndGhzLgorICAgICAgIElmIHNvbWUgYXJndW1lbnQgcmVmdXNlcyB0byBzYXksIHdlIHJlZnVzZSB0byBndWVzcyB0b28sIGxlc3QKKyAgICAgICBhbiBhcmd1bWVudCBsaWtlIHhyYW5nZShzeXMubWF4aW50KSBsZWFkIHVzIGFzdHJheS4qLworICAgIGxlbiA9IC0xOyAgICAgICAgICAgLyogdW5rbm93biAqLworICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtc2l6ZTsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgUHlfc3NpemVfdCB0aGlzbGVuID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQoaXRlbSwgLTIpOworICAgICAgICBpZiAodGhpc2xlbiA8IDApIHsKKyAgICAgICAgICAgIGlmICh0aGlzbGVuID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgbGVuID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsZW4gPCAwIHx8IHRoaXNsZW4gPCBsZW4pCisgICAgICAgICAgICBsZW4gPSB0aGlzbGVuOworICAgIH0KIAotCS8qIGFsbG9jYXRlIHJlc3VsdCBsaXN0ICovCi0JaWYgKGxlbiA8IDApCi0JCWxlbiA9IDEwOwkvKiBhcmJpdHJhcnkgKi8KLQlpZiAoKHJldCA9IFB5TGlzdF9OZXcobGVuKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogYWxsb2NhdGUgcmVzdWx0IGxpc3QgKi8KKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgbGVuID0gMTA7ICAgICAgICAgICAgICAgLyogYXJiaXRyYXJ5ICovCisgICAgaWYgKChyZXQgPSBQeUxpc3RfTmV3KGxlbikpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogb2J0YWluIGl0ZXJhdG9ycyAqLwotCWl0bGlzdCA9IFB5VHVwbGVfTmV3KGl0ZW1zaXplKTsKLQlpZiAoaXRsaXN0ID09IE5VTEwpCi0JCWdvdG8gRmFpbF9yZXQ7Ci0JZm9yIChpID0gMDsgaSA8IGl0ZW1zaXplOyArK2kpIHsKLQkJUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlQeU9iamVjdCAqaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZW0pOwotCQlpZiAoaXQgPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAiemlwIGFyZ3VtZW50ICMlemQgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIsCi0JCQkJICAgIGkrMSk7Ci0JCQlnb3RvIEZhaWxfcmV0X2l0bGlzdDsKLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKGl0bGlzdCwgaSwgaXQpOwotCX0KKyAgICAvKiBvYnRhaW4gaXRlcmF0b3JzICovCisgICAgaXRsaXN0ID0gUHlUdXBsZV9OZXcoaXRlbXNpemUpOworICAgIGlmIChpdGxpc3QgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsX3JldDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXNpemU7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIFB5T2JqZWN0ICppdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlbSk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJ6aXAgYXJndW1lbnQgIyV6ZCBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgaSsxKTsKKyAgICAgICAgICAgIGdvdG8gRmFpbF9yZXRfaXRsaXN0OworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oaXRsaXN0LCBpLCBpdCk7CisgICAgfQogCi0JLyogYnVpbGQgcmVzdWx0IGludG8gcmV0IGxpc3QgKi8KLQlmb3IgKGkgPSAwOyA7ICsraSkgewotCQlpbnQgajsKLQkJUHlPYmplY3QgKm5leHQgPSBQeVR1cGxlX05ldyhpdGVtc2l6ZSk7Ci0JCWlmICghbmV4dCkKLQkJCWdvdG8gRmFpbF9yZXRfaXRsaXN0OworICAgIC8qIGJ1aWxkIHJlc3VsdCBpbnRvIHJldCBsaXN0ICovCisgICAgZm9yIChpID0gMDsgOyArK2kpIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIFB5T2JqZWN0ICpuZXh0ID0gUHlUdXBsZV9OZXcoaXRlbXNpemUpOworICAgICAgICBpZiAoIW5leHQpCisgICAgICAgICAgICBnb3RvIEZhaWxfcmV0X2l0bGlzdDsKIAotCQlmb3IgKGogPSAwOyBqIDwgaXRlbXNpemU7IGorKykgewotCQkJUHlPYmplY3QgKml0ID0gUHlUdXBsZV9HRVRfSVRFTShpdGxpc3QsIGopOwotCQkJUHlPYmplY3QgKml0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCQlpZiAoIWl0ZW0pIHsKLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCQlQeV9ERUNSRUYocmV0KTsKLQkJCQkJcmV0ID0gTlVMTDsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKG5leHQpOwotCQkJCVB5X0RFQ1JFRihpdGxpc3QpOwotCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJCVB5VHVwbGVfU0VUX0lURU0obmV4dCwgaiwgaXRlbSk7Ci0JCX0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGl0ZW1zaXplOyBqKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdCA9IFB5VHVwbGVfR0VUX0lURU0oaXRsaXN0LCBqKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICAgICAgaWYgKCFpdGVtKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRsaXN0KTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5leHQsIGosIGl0ZW0pOworICAgICAgICB9CiAKLQkJaWYgKGkgPCBsZW4pCi0JCQlQeUxpc3RfU0VUX0lURU0ocmV0LCBpLCBuZXh0KTsKLQkJZWxzZSB7Ci0JCQlpbnQgc3RhdHVzID0gUHlMaXN0X0FwcGVuZChyZXQsIG5leHQpOwotCQkJUHlfREVDUkVGKG5leHQpOwotCQkJKytsZW47Ci0JCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQlnb3RvIEZhaWxfcmV0X2l0bGlzdDsKLQkJfQotCX0KKyAgICAgICAgaWYgKGkgPCBsZW4pCisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmV0LCBpLCBuZXh0KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gUHlMaXN0X0FwcGVuZChyZXQsIG5leHQpOworICAgICAgICAgICAgUHlfREVDUkVGKG5leHQpOworICAgICAgICAgICAgKytsZW47CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfcmV0X2l0bGlzdDsKKyAgICAgICAgfQorICAgIH0KIAogRG9uZToKLQlpZiAocmV0ICE9IE5VTEwgJiYgaSA8IGxlbikgewotCQkvKiBUaGUgbGlzdCBpcyB0b28gYmlnLiAqLwotCQlpZiAoUHlMaXN0X1NldFNsaWNlKHJldCwgaSwgbGVuLCBOVUxMKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHJldDsKKyAgICBpZiAocmV0ICE9IE5VTEwgJiYgaSA8IGxlbikgeworICAgICAgICAvKiBUaGUgbGlzdCBpcyB0b28gYmlnLiAqLworICAgICAgICBpZiAoUHlMaXN0X1NldFNsaWNlKHJldCwgaSwgbGVuLCBOVUxMKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKIAogRmFpbF9yZXRfaXRsaXN0OgotCVB5X0RFQ1JFRihpdGxpc3QpOworICAgIFB5X0RFQ1JFRihpdGxpc3QpOwogRmFpbF9yZXQ6Ci0JUHlfREVDUkVGKHJldCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtMjU5MCw2MSArMjU5MCw2MSBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBidWlsdGluX21ldGhvZHNbXSA9IHsKLSAJeyJfX2ltcG9ydF9fIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fX19pbXBvcnRfXywgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgaW1wb3J0X2RvY30sCi0gCXsiYWJzIiwJCWJ1aWx0aW5fYWJzLCAgICAgICAgTUVUSF9PLCBhYnNfZG9jfSwKLSAJeyJhbGwiLAkJYnVpbHRpbl9hbGwsICAgICAgICBNRVRIX08sIGFsbF9kb2N9LAotIAl7ImFueSIsCQlidWlsdGluX2FueSwgICAgICAgIE1FVEhfTywgYW55X2RvY30sCi0gCXsiYXBwbHkiLAlidWlsdGluX2FwcGx5LCAgICAgIE1FVEhfVkFSQVJHUywgYXBwbHlfZG9jfSwKLQl7ImJpbiIsCQlidWlsdGluX2JpbiwJICAgIE1FVEhfTywgYmluX2RvY30sCi0gCXsiY2FsbGFibGUiLAlidWlsdGluX2NhbGxhYmxlLCAgIE1FVEhfTywgY2FsbGFibGVfZG9jfSwKLSAJeyJjaHIiLAkJYnVpbHRpbl9jaHIsICAgICAgICBNRVRIX1ZBUkFSR1MsIGNocl9kb2N9LAotIAl7ImNtcCIsCQlidWlsdGluX2NtcCwgICAgICAgIE1FVEhfVkFSQVJHUywgY21wX2RvY30sCi0gCXsiY29lcmNlIiwJYnVpbHRpbl9jb2VyY2UsICAgICBNRVRIX1ZBUkFSR1MsIGNvZXJjZV9kb2N9LAotIAl7ImNvbXBpbGUiLAkoUHlDRnVuY3Rpb24pYnVpbHRpbl9jb21waWxlLCAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjb21waWxlX2RvY30sCi0gCXsiZGVsYXR0ciIsCWJ1aWx0aW5fZGVsYXR0ciwgICAgTUVUSF9WQVJBUkdTLCBkZWxhdHRyX2RvY30sCi0gCXsiZGlyIiwJCWJ1aWx0aW5fZGlyLCAgICAgICAgTUVUSF9WQVJBUkdTLCBkaXJfZG9jfSwKLSAJeyJkaXZtb2QiLAlidWlsdGluX2Rpdm1vZCwgICAgIE1FVEhfVkFSQVJHUywgZGl2bW9kX2RvY30sCi0gCXsiZXZhbCIsCWJ1aWx0aW5fZXZhbCwgICAgICAgTUVUSF9WQVJBUkdTLCBldmFsX2RvY30sCi0gCXsiZXhlY2ZpbGUiLAlidWlsdGluX2V4ZWNmaWxlLCAgIE1FVEhfVkFSQVJHUywgZXhlY2ZpbGVfZG9jfSwKLSAJeyJmaWx0ZXIiLAlidWlsdGluX2ZpbHRlciwgICAgIE1FVEhfVkFSQVJHUywgZmlsdGVyX2RvY30sCi0gCXsiZm9ybWF0IiwJYnVpbHRpbl9mb3JtYXQsICAgICBNRVRIX1ZBUkFSR1MsIGZvcm1hdF9kb2N9LAotIAl7ImdldGF0dHIiLAlidWlsdGluX2dldGF0dHIsICAgIE1FVEhfVkFSQVJHUywgZ2V0YXR0cl9kb2N9LAotIAl7Imdsb2JhbHMiLAkoUHlDRnVuY3Rpb24pYnVpbHRpbl9nbG9iYWxzLCAgICBNRVRIX05PQVJHUywgZ2xvYmFsc19kb2N9LAotIAl7Imhhc2F0dHIiLAlidWlsdGluX2hhc2F0dHIsICAgIE1FVEhfVkFSQVJHUywgaGFzYXR0cl9kb2N9LAotIAl7Imhhc2giLAlidWlsdGluX2hhc2gsICAgICAgIE1FVEhfTywgaGFzaF9kb2N9LAotIAl7ImhleCIsCQlidWlsdGluX2hleCwgICAgICAgIE1FVEhfTywgaGV4X2RvY30sCi0gCXsiaWQiLAkJYnVpbHRpbl9pZCwgICAgICAgICBNRVRIX08sIGlkX2RvY30sCi0gCXsiaW5wdXQiLAlidWlsdGluX2lucHV0LCAgICAgIE1FVEhfVkFSQVJHUywgaW5wdXRfZG9jfSwKLSAJeyJpbnRlcm4iLAlidWlsdGluX2ludGVybiwgICAgIE1FVEhfVkFSQVJHUywgaW50ZXJuX2RvY30sCi0gCXsiaXNpbnN0YW5jZSIsICBidWlsdGluX2lzaW5zdGFuY2UsIE1FVEhfVkFSQVJHUywgaXNpbnN0YW5jZV9kb2N9LAotIAl7Imlzc3ViY2xhc3MiLCAgYnVpbHRpbl9pc3N1YmNsYXNzLCBNRVRIX1ZBUkFSR1MsIGlzc3ViY2xhc3NfZG9jfSwKLSAJeyJpdGVyIiwJYnVpbHRpbl9pdGVyLCAgICAgICBNRVRIX1ZBUkFSR1MsIGl0ZXJfZG9jfSwKLSAJeyJsZW4iLAkJYnVpbHRpbl9sZW4sICAgICAgICBNRVRIX08sIGxlbl9kb2N9LAotIAl7ImxvY2FscyIsCShQeUNGdW5jdGlvbilidWlsdGluX2xvY2FscywgICAgIE1FVEhfTk9BUkdTLCBsb2NhbHNfZG9jfSwKLSAJeyJtYXAiLAkJYnVpbHRpbl9tYXAsICAgICAgICBNRVRIX1ZBUkFSR1MsIG1hcF9kb2N9LAotIAl7Im1heCIsCQkoUHlDRnVuY3Rpb24pYnVpbHRpbl9tYXgsICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBtYXhfZG9jfSwKLSAJeyJtaW4iLAkJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fbWluLCAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgbWluX2RvY30sCi0JeyJuZXh0IiwgCWJ1aWx0aW5fbmV4dCwgICAgICAgTUVUSF9WQVJBUkdTLCBuZXh0X2RvY30sCi0gCXsib2N0IiwJCWJ1aWx0aW5fb2N0LCAgICAgICAgTUVUSF9PLCBvY3RfZG9jfSwKLSAJeyJvcGVuIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fb3BlbiwgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgb3Blbl9kb2N9LAotIAl7Im9yZCIsCQlidWlsdGluX29yZCwgICAgICAgIE1FVEhfTywgb3JkX2RvY30sCi0gCXsicG93IiwJCWJ1aWx0aW5fcG93LCAgICAgICAgTUVUSF9WQVJBUkdTLCBwb3dfZG9jfSwKLSAJeyJwcmludCIsCShQeUNGdW5jdGlvbilidWlsdGluX3ByaW50LCAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHByaW50X2RvY30sCi0gCXsicmFuZ2UiLAlidWlsdGluX3JhbmdlLCAgICAgIE1FVEhfVkFSQVJHUywgcmFuZ2VfZG9jfSwKLSAJeyJyYXdfaW5wdXQiLAlidWlsdGluX3Jhd19pbnB1dCwgIE1FVEhfVkFSQVJHUywgcmF3X2lucHV0X2RvY30sCi0gCXsicmVkdWNlIiwJYnVpbHRpbl9yZWR1Y2UsICAgICBNRVRIX1ZBUkFSR1MsIHJlZHVjZV9kb2N9LAotIAl7InJlbG9hZCIsCWJ1aWx0aW5fcmVsb2FkLCAgICAgTUVUSF9PLCByZWxvYWRfZG9jfSwKLSAJeyJyZXByIiwJYnVpbHRpbl9yZXByLCAgICAgICBNRVRIX08sIHJlcHJfZG9jfSwKLSAJeyJyb3VuZCIsCShQeUNGdW5jdGlvbilidWlsdGluX3JvdW5kLCAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHJvdW5kX2RvY30sCi0gCXsic2V0YXR0ciIsCWJ1aWx0aW5fc2V0YXR0ciwgICAgTUVUSF9WQVJBUkdTLCBzZXRhdHRyX2RvY30sCi0gCXsic29ydGVkIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fc29ydGVkLCAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgc29ydGVkX2RvY30sCi0gCXsic3VtIiwJCWJ1aWx0aW5fc3VtLCAgICAgICAgTUVUSF9WQVJBUkdTLCBzdW1fZG9jfSwKKyAgICB7Il9faW1wb3J0X18iLCAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX19faW1wb3J0X18sIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGltcG9ydF9kb2N9LAorICAgIHsiYWJzIiwgICAgICAgICAgICAgYnVpbHRpbl9hYnMsICAgICAgICBNRVRIX08sIGFic19kb2N9LAorICAgIHsiYWxsIiwgICAgICAgICAgICAgYnVpbHRpbl9hbGwsICAgICAgICBNRVRIX08sIGFsbF9kb2N9LAorICAgIHsiYW55IiwgICAgICAgICAgICAgYnVpbHRpbl9hbnksICAgICAgICBNRVRIX08sIGFueV9kb2N9LAorICAgIHsiYXBwbHkiLCAgICAgICAgICAgYnVpbHRpbl9hcHBseSwgICAgICBNRVRIX1ZBUkFSR1MsIGFwcGx5X2RvY30sCisgICAgeyJiaW4iLCAgICAgICAgICAgICBidWlsdGluX2JpbiwgICAgICAgIE1FVEhfTywgYmluX2RvY30sCisgICAgeyJjYWxsYWJsZSIsICAgICAgICBidWlsdGluX2NhbGxhYmxlLCAgIE1FVEhfTywgY2FsbGFibGVfZG9jfSwKKyAgICB7ImNociIsICAgICAgICAgICAgIGJ1aWx0aW5fY2hyLCAgICAgICAgTUVUSF9WQVJBUkdTLCBjaHJfZG9jfSwKKyAgICB7ImNtcCIsICAgICAgICAgICAgIGJ1aWx0aW5fY21wLCAgICAgICAgTUVUSF9WQVJBUkdTLCBjbXBfZG9jfSwKKyAgICB7ImNvZXJjZSIsICAgICAgICAgIGJ1aWx0aW5fY29lcmNlLCAgICAgTUVUSF9WQVJBUkdTLCBjb2VyY2VfZG9jfSwKKyAgICB7ImNvbXBpbGUiLCAgICAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX2NvbXBpbGUsICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGNvbXBpbGVfZG9jfSwKKyAgICB7ImRlbGF0dHIiLCAgICAgICAgIGJ1aWx0aW5fZGVsYXR0ciwgICAgTUVUSF9WQVJBUkdTLCBkZWxhdHRyX2RvY30sCisgICAgeyJkaXIiLCAgICAgICAgICAgICBidWlsdGluX2RpciwgICAgICAgIE1FVEhfVkFSQVJHUywgZGlyX2RvY30sCisgICAgeyJkaXZtb2QiLCAgICAgICAgICBidWlsdGluX2Rpdm1vZCwgICAgIE1FVEhfVkFSQVJHUywgZGl2bW9kX2RvY30sCisgICAgeyJldmFsIiwgICAgICAgICAgICBidWlsdGluX2V2YWwsICAgICAgIE1FVEhfVkFSQVJHUywgZXZhbF9kb2N9LAorICAgIHsiZXhlY2ZpbGUiLCAgICAgICAgYnVpbHRpbl9leGVjZmlsZSwgICBNRVRIX1ZBUkFSR1MsIGV4ZWNmaWxlX2RvY30sCisgICAgeyJmaWx0ZXIiLCAgICAgICAgICBidWlsdGluX2ZpbHRlciwgICAgIE1FVEhfVkFSQVJHUywgZmlsdGVyX2RvY30sCisgICAgeyJmb3JtYXQiLCAgICAgICAgICBidWlsdGluX2Zvcm1hdCwgICAgIE1FVEhfVkFSQVJHUywgZm9ybWF0X2RvY30sCisgICAgeyJnZXRhdHRyIiwgICAgICAgICBidWlsdGluX2dldGF0dHIsICAgIE1FVEhfVkFSQVJHUywgZ2V0YXR0cl9kb2N9LAorICAgIHsiZ2xvYmFscyIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fZ2xvYmFscywgICAgTUVUSF9OT0FSR1MsIGdsb2JhbHNfZG9jfSwKKyAgICB7Imhhc2F0dHIiLCAgICAgICAgIGJ1aWx0aW5faGFzYXR0ciwgICAgTUVUSF9WQVJBUkdTLCBoYXNhdHRyX2RvY30sCisgICAgeyJoYXNoIiwgICAgICAgICAgICBidWlsdGluX2hhc2gsICAgICAgIE1FVEhfTywgaGFzaF9kb2N9LAorICAgIHsiaGV4IiwgICAgICAgICAgICAgYnVpbHRpbl9oZXgsICAgICAgICBNRVRIX08sIGhleF9kb2N9LAorICAgIHsiaWQiLCAgICAgICAgICAgICAgYnVpbHRpbl9pZCwgICAgICAgICBNRVRIX08sIGlkX2RvY30sCisgICAgeyJpbnB1dCIsICAgICAgICAgICBidWlsdGluX2lucHV0LCAgICAgIE1FVEhfVkFSQVJHUywgaW5wdXRfZG9jfSwKKyAgICB7ImludGVybiIsICAgICAgICAgIGJ1aWx0aW5faW50ZXJuLCAgICAgTUVUSF9WQVJBUkdTLCBpbnRlcm5fZG9jfSwKKyAgICB7ImlzaW5zdGFuY2UiLCAgYnVpbHRpbl9pc2luc3RhbmNlLCBNRVRIX1ZBUkFSR1MsIGlzaW5zdGFuY2VfZG9jfSwKKyAgICB7Imlzc3ViY2xhc3MiLCAgYnVpbHRpbl9pc3N1YmNsYXNzLCBNRVRIX1ZBUkFSR1MsIGlzc3ViY2xhc3NfZG9jfSwKKyAgICB7Iml0ZXIiLCAgICAgICAgICAgIGJ1aWx0aW5faXRlciwgICAgICAgTUVUSF9WQVJBUkdTLCBpdGVyX2RvY30sCisgICAgeyJsZW4iLCAgICAgICAgICAgICBidWlsdGluX2xlbiwgICAgICAgIE1FVEhfTywgbGVuX2RvY30sCisgICAgeyJsb2NhbHMiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9sb2NhbHMsICAgICBNRVRIX05PQVJHUywgbG9jYWxzX2RvY30sCisgICAgeyJtYXAiLCAgICAgICAgICAgICBidWlsdGluX21hcCwgICAgICAgIE1FVEhfVkFSQVJHUywgbWFwX2RvY30sCisgICAgeyJtYXgiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9tYXgsICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBtYXhfZG9jfSwKKyAgICB7Im1pbiIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX21pbiwgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIG1pbl9kb2N9LAorICAgIHsibmV4dCIsICAgICAgICAgICAgYnVpbHRpbl9uZXh0LCAgICAgICBNRVRIX1ZBUkFSR1MsIG5leHRfZG9jfSwKKyAgICB7Im9jdCIsICAgICAgICAgICAgIGJ1aWx0aW5fb2N0LCAgICAgICAgTUVUSF9PLCBvY3RfZG9jfSwKKyAgICB7Im9wZW4iLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX29wZW4sICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIG9wZW5fZG9jfSwKKyAgICB7Im9yZCIsICAgICAgICAgICAgIGJ1aWx0aW5fb3JkLCAgICAgICAgTUVUSF9PLCBvcmRfZG9jfSwKKyAgICB7InBvdyIsICAgICAgICAgICAgIGJ1aWx0aW5fcG93LCAgICAgICAgTUVUSF9WQVJBUkdTLCBwb3dfZG9jfSwKKyAgICB7InByaW50IiwgICAgICAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX3ByaW50LCAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHByaW50X2RvY30sCisgICAgeyJyYW5nZSIsICAgICAgICAgICBidWlsdGluX3JhbmdlLCAgICAgIE1FVEhfVkFSQVJHUywgcmFuZ2VfZG9jfSwKKyAgICB7InJhd19pbnB1dCIsICAgICAgIGJ1aWx0aW5fcmF3X2lucHV0LCAgTUVUSF9WQVJBUkdTLCByYXdfaW5wdXRfZG9jfSwKKyAgICB7InJlZHVjZSIsICAgICAgICAgIGJ1aWx0aW5fcmVkdWNlLCAgICAgTUVUSF9WQVJBUkdTLCByZWR1Y2VfZG9jfSwKKyAgICB7InJlbG9hZCIsICAgICAgICAgIGJ1aWx0aW5fcmVsb2FkLCAgICAgTUVUSF9PLCByZWxvYWRfZG9jfSwKKyAgICB7InJlcHIiLCAgICAgICAgICAgIGJ1aWx0aW5fcmVwciwgICAgICAgTUVUSF9PLCByZXByX2RvY30sCisgICAgeyJyb3VuZCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9yb3VuZCwgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCByb3VuZF9kb2N9LAorICAgIHsic2V0YXR0ciIsICAgICAgICAgYnVpbHRpbl9zZXRhdHRyLCAgICBNRVRIX1ZBUkFSR1MsIHNldGF0dHJfZG9jfSwKKyAgICB7InNvcnRlZCIsICAgICAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX3NvcnRlZCwgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHNvcnRlZF9kb2N9LAorICAgIHsic3VtIiwgICAgICAgICAgICAgYnVpbHRpbl9zdW0sICAgICAgICBNRVRIX1ZBUkFSR1MsIHN1bV9kb2N9LAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLSAJeyJ1bmljaHIiLAlidWlsdGluX3VuaWNociwgICAgIE1FVEhfVkFSQVJHUywgdW5pY2hyX2RvY30sCisgICAgeyJ1bmljaHIiLCAgICAgICAgICBidWlsdGluX3VuaWNociwgICAgIE1FVEhfVkFSQVJHUywgdW5pY2hyX2RvY30sCiAjZW5kaWYKLSAJeyJ2YXJzIiwJYnVpbHRpbl92YXJzLCAgICAgICBNRVRIX1ZBUkFSR1MsIHZhcnNfZG9jfSwKLSAgCXsiemlwIiwgICAgICAgICBidWlsdGluX3ppcCwgICAgICAgIE1FVEhfVkFSQVJHUywgemlwX2RvY30sCi0Je05VTEwsCQlOVUxMfSwKKyAgICB7InZhcnMiLCAgICAgICAgICAgIGJ1aWx0aW5fdmFycywgICAgICAgTUVUSF9WQVJBUkdTLCB2YXJzX2RvY30sCisgICAgeyJ6aXAiLCAgICAgICAgIGJ1aWx0aW5femlwLCAgICAgICAgTUVUSF9WQVJBUkdTLCB6aXBfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9LAogfTsKIAogUHlEb2NfU1RSVkFSKGJ1aWx0aW5fZG9jLApAQCAtMjY1NSw3NiArMjY1NSw3NiBAQAogUHlPYmplY3QgKgogX1B5QnVpbHRpbl9Jbml0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm1vZCwgKmRpY3QsICpkZWJ1ZzsKLQltb2QgPSBQeV9Jbml0TW9kdWxlNCgiX19idWlsdGluX18iLCBidWlsdGluX21ldGhvZHMsCi0JCQkgICAgIGJ1aWx0aW5fZG9jLCAoUHlPYmplY3QgKilOVUxMLAotCQkJICAgICBQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtb2QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKKyAgICBQeU9iamVjdCAqbW9kLCAqZGljdCwgKmRlYnVnOworICAgIG1vZCA9IFB5X0luaXRNb2R1bGU0KCJfX2J1aWx0aW5fXyIsIGJ1aWx0aW5fbWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX2RvYywgKFB5T2JqZWN0ICopTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKIAogI2lmZGVmIFB5X1RSQUNFX1JFRlMKLQkvKiBfX2J1aWx0aW5fXyBleHBvc2VzIGEgbnVtYmVyIG9mIHN0YXRpY2FsbHkgYWxsb2NhdGVkIG9iamVjdHMKLQkgKiB0aGF0LCBiZWZvcmUgdGhpcyBjb2RlIHdhcyBhZGRlZCBpbiAyLjMsIG5ldmVyIHNob3dlZCB1cCBpbgotCSAqIHRoZSBsaXN0IG9mICJhbGwgb2JqZWN0cyIgbWFpbnRhaW5lZCBieSBQeV9UUkFDRV9SRUZTLiAgQXMgYQotCSAqIHJlc3VsdCwgcHJvZ3JhbXMgbGVha2luZyByZWZlcmVuY2VzIHRvIE5vbmUgYW5kIEZhbHNlIChldGMpCi0JICogY291bGRuJ3QgYmUgZGlhZ25vc2VkIGJ5IGV4YW1pbmluZyBzeXMuZ2V0b2JqZWN0cygwKS4KLQkgKi8KKyAgICAvKiBfX2J1aWx0aW5fXyBleHBvc2VzIGEgbnVtYmVyIG9mIHN0YXRpY2FsbHkgYWxsb2NhdGVkIG9iamVjdHMKKyAgICAgKiB0aGF0LCBiZWZvcmUgdGhpcyBjb2RlIHdhcyBhZGRlZCBpbiAyLjMsIG5ldmVyIHNob3dlZCB1cCBpbgorICAgICAqIHRoZSBsaXN0IG9mICJhbGwgb2JqZWN0cyIgbWFpbnRhaW5lZCBieSBQeV9UUkFDRV9SRUZTLiAgQXMgYQorICAgICAqIHJlc3VsdCwgcHJvZ3JhbXMgbGVha2luZyByZWZlcmVuY2VzIHRvIE5vbmUgYW5kIEZhbHNlIChldGMpCisgICAgICogY291bGRuJ3QgYmUgZGlhZ25vc2VkIGJ5IGV4YW1pbmluZyBzeXMuZ2V0b2JqZWN0cygwKS4KKyAgICAgKi8KICNkZWZpbmUgQUREX1RPX0FMTChPQkpFQ1QpIF9QeV9BZGRUb0FsbE9iamVjdHMoKFB5T2JqZWN0ICopKE9CSkVDVCksIDApCiAjZWxzZQogI2RlZmluZSBBRERfVE9fQUxMKE9CSkVDVCkgKHZvaWQpMAogI2VuZGlmCiAKICNkZWZpbmUgU0VUQlVJTFRJTihOQU1FLCBPQkpFQ1QpIFwKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgTkFNRSwgKFB5T2JqZWN0ICopT0JKRUNUKSA8IDApCVwKLQkJcmV0dXJuIE5VTEw7CQkJCQkJXAotCUFERF9UT19BTEwoT0JKRUNUKQorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBOQU1FLCAoUHlPYmplY3QgKilPQkpFQ1QpIDwgMCkgICAgICAgXAorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9UT19BTEwoT0JKRUNUKQogCi0JU0VUQlVJTFRJTigiTm9uZSIsCQlQeV9Ob25lKTsKLQlTRVRCVUlMVElOKCJFbGxpcHNpcyIsCQlQeV9FbGxpcHNpcyk7Ci0JU0VUQlVJTFRJTigiTm90SW1wbGVtZW50ZWQiLAlQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JU0VUQlVJTFRJTigiRmFsc2UiLAkJUHlfRmFsc2UpOwotCVNFVEJVSUxUSU4oIlRydWUiLAkJUHlfVHJ1ZSk7Ci0JU0VUQlVJTFRJTigiYmFzZXN0cmluZyIsCSZQeUJhc2VTdHJpbmdfVHlwZSk7Ci0JU0VUQlVJTFRJTigiYm9vbCIsCQkmUHlCb29sX1R5cGUpOwotCVNFVEJVSUxUSU4oIm1lbW9yeXZpZXciLCAgICAgICAgJlB5TWVtb3J5Vmlld19UeXBlKTsKLQlTRVRCVUlMVElOKCJieXRlYXJyYXkiLAkJJlB5Qnl0ZUFycmF5X1R5cGUpOwotCVNFVEJVSUxUSU4oImJ5dGVzIiwJCSZQeVN0cmluZ19UeXBlKTsKLQlTRVRCVUlMVElOKCJidWZmZXIiLAkJJlB5QnVmZmVyX1R5cGUpOwotCVNFVEJVSUxUSU4oImNsYXNzbWV0aG9kIiwJJlB5Q2xhc3NNZXRob2RfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiTm9uZSIsICAgICAgICAgICAgICAgICAgUHlfTm9uZSk7CisgICAgU0VUQlVJTFRJTigiRWxsaXBzaXMiLCAgICAgICAgICAgICAgUHlfRWxsaXBzaXMpOworICAgIFNFVEJVSUxUSU4oIk5vdEltcGxlbWVudGVkIiwgICAgICAgIFB5X05vdEltcGxlbWVudGVkKTsKKyAgICBTRVRCVUlMVElOKCJGYWxzZSIsICAgICAgICAgICAgICAgICBQeV9GYWxzZSk7CisgICAgU0VUQlVJTFRJTigiVHJ1ZSIsICAgICAgICAgICAgICAgICAgUHlfVHJ1ZSk7CisgICAgU0VUQlVJTFRJTigiYmFzZXN0cmluZyIsICAgICAgICAgICAgJlB5QmFzZVN0cmluZ19UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJib29sIiwgICAgICAgICAgICAgICAgICAmUHlCb29sX1R5cGUpOworICAgIFNFVEJVSUxUSU4oIm1lbW9yeXZpZXciLCAgICAgICAgJlB5TWVtb3J5Vmlld19UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJieXRlYXJyYXkiLCAgICAgICAgICAgICAmUHlCeXRlQXJyYXlfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiYnl0ZXMiLCAgICAgICAgICAgICAgICAgJlB5U3RyaW5nX1R5cGUpOworICAgIFNFVEJVSUxUSU4oImJ1ZmZlciIsICAgICAgICAgICAgICAgICZQeUJ1ZmZlcl9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJjbGFzc21ldGhvZCIsICAgICAgICAgICAmUHlDbGFzc01ldGhvZF9UeXBlKTsKICNpZm5kZWYgV0lUSE9VVF9DT01QTEVYCi0JU0VUQlVJTFRJTigiY29tcGxleCIsCQkmUHlDb21wbGV4X1R5cGUpOworICAgIFNFVEJVSUxUSU4oImNvbXBsZXgiLCAgICAgICAgICAgICAgICZQeUNvbXBsZXhfVHlwZSk7CiAjZW5kaWYKLQlTRVRCVUlMVElOKCJkaWN0IiwJCSZQeURpY3RfVHlwZSk7Ci0gCVNFVEJVSUxUSU4oImVudW1lcmF0ZSIsCQkmUHlFbnVtX1R5cGUpOwotCVNFVEJVSUxUSU4oImZpbGUiLAkJJlB5RmlsZV9UeXBlKTsKLQlTRVRCVUlMVElOKCJmbG9hdCIsCQkmUHlGbG9hdF9UeXBlKTsKLQlTRVRCVUlMVElOKCJmcm96ZW5zZXQiLAkJJlB5RnJvemVuU2V0X1R5cGUpOwotCVNFVEJVSUxUSU4oInByb3BlcnR5IiwJCSZQeVByb3BlcnR5X1R5cGUpOwotCVNFVEJVSUxUSU4oImludCIsCQkmUHlJbnRfVHlwZSk7Ci0JU0VUQlVJTFRJTigibGlzdCIsCQkmUHlMaXN0X1R5cGUpOwotCVNFVEJVSUxUSU4oImxvbmciLAkJJlB5TG9uZ19UeXBlKTsKLQlTRVRCVUlMVElOKCJvYmplY3QiLAkJJlB5QmFzZU9iamVjdF9UeXBlKTsKLQlTRVRCVUlMVElOKCJyZXZlcnNlZCIsCQkmUHlSZXZlcnNlZF9UeXBlKTsKLQlTRVRCVUlMVElOKCJzZXQiLAkJJlB5U2V0X1R5cGUpOwotCVNFVEJVSUxUSU4oInNsaWNlIiwJCSZQeVNsaWNlX1R5cGUpOwotCVNFVEJVSUxUSU4oInN0YXRpY21ldGhvZCIsCSZQeVN0YXRpY01ldGhvZF9UeXBlKTsKLQlTRVRCVUlMVElOKCJzdHIiLAkJJlB5U3RyaW5nX1R5cGUpOwotCVNFVEJVSUxUSU4oInN1cGVyIiwJCSZQeVN1cGVyX1R5cGUpOwotCVNFVEJVSUxUSU4oInR1cGxlIiwJCSZQeVR1cGxlX1R5cGUpOwotCVNFVEJVSUxUSU4oInR5cGUiLAkJJlB5VHlwZV9UeXBlKTsKLQlTRVRCVUlMVElOKCJ4cmFuZ2UiLAkJJlB5UmFuZ2VfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiZGljdCIsICAgICAgICAgICAgICAgICAgJlB5RGljdF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJlbnVtZXJhdGUiLCAgICAgICAgICAgICAmUHlFbnVtX1R5cGUpOworICAgIFNFVEJVSUxUSU4oImZpbGUiLCAgICAgICAgICAgICAgICAgICZQeUZpbGVfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiZmxvYXQiLCAgICAgICAgICAgICAgICAgJlB5RmxvYXRfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiZnJvemVuc2V0IiwgICAgICAgICAgICAgJlB5RnJvemVuU2V0X1R5cGUpOworICAgIFNFVEJVSUxUSU4oInByb3BlcnR5IiwgICAgICAgICAgICAgICZQeVByb3BlcnR5X1R5cGUpOworICAgIFNFVEJVSUxUSU4oImludCIsICAgICAgICAgICAgICAgICAgICZQeUludF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJsaXN0IiwgICAgICAgICAgICAgICAgICAmUHlMaXN0X1R5cGUpOworICAgIFNFVEJVSUxUSU4oImxvbmciLCAgICAgICAgICAgICAgICAgICZQeUxvbmdfVHlwZSk7CisgICAgU0VUQlVJTFRJTigib2JqZWN0IiwgICAgICAgICAgICAgICAgJlB5QmFzZU9iamVjdF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJyZXZlcnNlZCIsICAgICAgICAgICAgICAmUHlSZXZlcnNlZF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJzZXQiLCAgICAgICAgICAgICAgICAgICAmUHlTZXRfVHlwZSk7CisgICAgU0VUQlVJTFRJTigic2xpY2UiLCAgICAgICAgICAgICAgICAgJlB5U2xpY2VfVHlwZSk7CisgICAgU0VUQlVJTFRJTigic3RhdGljbWV0aG9kIiwgICAgICAgICAgJlB5U3RhdGljTWV0aG9kX1R5cGUpOworICAgIFNFVEJVSUxUSU4oInN0ciIsICAgICAgICAgICAgICAgICAgICZQeVN0cmluZ19UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJzdXBlciIsICAgICAgICAgICAgICAgICAmUHlTdXBlcl9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJ0dXBsZSIsICAgICAgICAgICAgICAgICAmUHlUdXBsZV9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJ0eXBlIiwgICAgICAgICAgICAgICAgICAmUHlUeXBlX1R5cGUpOworICAgIFNFVEJVSUxUSU4oInhyYW5nZSIsICAgICAgICAgICAgICAgICZQeVJhbmdlX1R5cGUpOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlTRVRCVUlMVElOKCJ1bmljb2RlIiwJCSZQeVVuaWNvZGVfVHlwZSk7CisgICAgU0VUQlVJTFRJTigidW5pY29kZSIsICAgICAgICAgICAgICAgJlB5VW5pY29kZV9UeXBlKTsKICNlbmRpZgotCWRlYnVnID0gUHlCb29sX0Zyb21Mb25nKFB5X09wdGltaXplRmxhZyA9PSAwKTsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZGVidWdfXyIsIGRlYnVnKSA8IDApIHsKLQkJUHlfWERFQ1JFRihkZWJ1Zyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9YREVDUkVGKGRlYnVnKTsKKyAgICBkZWJ1ZyA9IFB5Qm9vbF9Gcm9tTG9uZyhQeV9PcHRpbWl6ZUZsYWcgPT0gMCk7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RlYnVnX18iLCBkZWJ1ZykgPCAwKSB7CisgICAgICAgIFB5X1hERUNSRUYoZGVidWcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfWERFQ1JFRihkZWJ1Zyk7CiAKLQlyZXR1cm4gbW9kOworICAgIHJldHVybiBtb2Q7CiAjdW5kZWYgQUREX1RPX0FMTAogI3VuZGVmIFNFVEJVSUxUSU4KIH0KQEAgLTI3MzQsNjkgKzI3MzQsNjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWx0ZXJ0dXBsZShQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKnR1cGxlKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCBpLCBqOwotCVB5X3NzaXplX3QgbGVuID0gUHlUdXBsZV9TaXplKHR1cGxlKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgaSwgajsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IFB5VHVwbGVfU2l6ZSh0dXBsZSk7CiAKLQlpZiAobGVuID09IDApIHsKLQkJaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh0dXBsZSkpCi0JCQlQeV9JTkNSRUYodHVwbGUpOwotCQllbHNlCi0JCQl0dXBsZSA9IFB5VHVwbGVfTmV3KDApOwotCQlyZXR1cm4gdHVwbGU7Ci0JfQorICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHR1cGxlKSkKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0dXBsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR1cGxlID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIHJldHVybiB0dXBsZTsKKyAgICB9CiAKLQlpZiAoKHJlc3VsdCA9IFB5VHVwbGVfTmV3KGxlbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgocmVzdWx0ID0gUHlUdXBsZV9OZXcobGVuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSBqID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtLCAqZ29vZDsKLQkJaW50IG9rOworICAgIGZvciAoaSA9IGogPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0sICpnb29kOworICAgICAgICBpbnQgb2s7CiAKLQkJaWYgKHR1cGxlLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSAmJgotCQkgICAgdHVwbGUtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKSB7Ci0JCQlpdGVtID0gdHVwbGUtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKHR1cGxlLCBpKTsKLQkJCWlmIChpdGVtID09IE5VTEwpCi0JCQkJZ290byBGYWlsXzE7Ci0JCX0gZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZmlsdGVyKCk6IHVuc3Vic2NyaXB0YWJsZSB0dXBsZSIpOwotCQkJZ290byBGYWlsXzE7Ci0JCX0KLQkJaWYgKGZ1bmMgPT0gUHlfTm9uZSkgewotCQkJUHlfSU5DUkVGKGl0ZW0pOwotCQkJZ29vZCA9IGl0ZW07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeU9iamVjdCAqYXJnID0gUHlUdXBsZV9QYWNrKDEsIGl0ZW0pOwotCQkJaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbF8xOwotCQkJfQotCQkJZ29vZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JCQlQeV9ERUNSRUYoYXJnKTsKLQkJCWlmIChnb29kID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJZ290byBGYWlsXzE7Ci0JCQl9Ci0JCX0KLQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7Ci0JCVB5X0RFQ1JFRihnb29kKTsKLQkJaWYgKG9rKSB7Ci0JCQlpZiAoUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaisrLCBpdGVtKSA8IDApCi0JCQkJZ290byBGYWlsXzE7Ci0JCX0KLQkJZWxzZQotCQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KKyAgICAgICAgaWYgKHR1cGxlLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSAmJgorICAgICAgICAgICAgdHVwbGUtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKSB7CisgICAgICAgICAgICBpdGVtID0gdHVwbGUtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKHR1cGxlLCBpKTsKKyAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZmlsdGVyKCk6IHVuc3Vic2NyaXB0YWJsZSB0dXBsZSIpOworICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZ1bmMgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICAgICAgZ29vZCA9IGl0ZW07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqYXJnID0gUHlUdXBsZV9QYWNrKDEsIGl0ZW0pOworICAgICAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ29vZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgIGlmIChnb29kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CisgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBpZiAoUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaisrLCBpdGVtKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KIAotCWlmIChfUHlUdXBsZV9SZXNpemUoJnJlc3VsdCwgaikgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoX1B5VHVwbGVfUmVzaXplKCZyZXN1bHQsIGopIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiAKIEZhaWxfMToKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC0yODA1LDEyNSArMjgwNSwxMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWx0ZXJzdHJpbmcoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICpzdHJvYmopCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IGksIGo7Ci0JUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19TaXplKHN0cm9iaik7Ci0JUHlfc3NpemVfdCBvdXRsZW4gPSBsZW47CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19TaXplKHN0cm9iaik7CisgICAgUHlfc3NpemVfdCBvdXRsZW4gPSBsZW47CiAKLQlpZiAoZnVuYyA9PSBQeV9Ob25lKSB7Ci0JCS8qIElmIGl0J3MgYSByZWFsIHN0cmluZyB3ZSBjYW4gcmV0dXJuIHRoZSBvcmlnaW5hbCwKLQkJICogYXMgbm8gY2hhcmFjdGVyIGlzIGV2ZXIgZmFsc2UgYW5kIF9fZ2V0aXRlbV9fCi0JCSAqIGRvZXMgcmV0dXJuIHRoaXMgY2hhcmFjdGVyLiBJZiBpdCdzIGEgc3ViY2xhc3MKLQkJICogd2UgbXVzdCBnbyB0aHJvdWdoIHRoZSBfX2dldGl0ZW1fXyBsb29wICovCi0JCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KHN0cm9iaikpIHsKLQkJCVB5X0lOQ1JFRihzdHJvYmopOwotCQkJcmV0dXJuIHN0cm9iajsKLQkJfQotCX0KLQlpZiAoKHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChmdW5jID09IFB5X05vbmUpIHsKKyAgICAgICAgLyogSWYgaXQncyBhIHJlYWwgc3RyaW5nIHdlIGNhbiByZXR1cm4gdGhlIG9yaWdpbmFsLAorICAgICAgICAgKiBhcyBubyBjaGFyYWN0ZXIgaXMgZXZlciBmYWxzZSBhbmQgX19nZXRpdGVtX18KKyAgICAgICAgICogZG9lcyByZXR1cm4gdGhpcyBjaGFyYWN0ZXIuIElmIGl0J3MgYSBzdWJjbGFzcworICAgICAgICAgKiB3ZSBtdXN0IGdvIHRocm91Z2ggdGhlIF9fZ2V0aXRlbV9fIGxvb3AgKi8KKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3Qoc3Ryb2JqKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHN0cm9iaik7CisgICAgICAgICAgICByZXR1cm4gc3Ryb2JqOworICAgICAgICB9CisgICAgfQorICAgIGlmICgocmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSBqID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtOwotCQlpbnQgb2s7CisgICAgZm9yIChpID0gaiA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbTsKKyAgICAgICAgaW50IG9rOwogCi0JCWl0ZW0gPSAoKnN0cm9iai0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2l0ZW0pKHN0cm9iaiwgaSk7Ci0JCWlmIChpdGVtID09IE5VTEwpCi0JCQlnb3RvIEZhaWxfMTsKLQkJaWYgKGZ1bmM9PVB5X05vbmUpIHsKLQkJCW9rID0gMTsKLQkJfSBlbHNlIHsKLQkJCVB5T2JqZWN0ICphcmcsICpnb29kOwotCQkJYXJnID0gUHlUdXBsZV9QYWNrKDEsIGl0ZW0pOwotCQkJaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbF8xOwotCQkJfQotCQkJZ29vZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JCQlQeV9ERUNSRUYoYXJnKTsKLQkJCWlmIChnb29kID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJZ290byBGYWlsXzE7Ci0JCQl9Ci0JCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKLQkJCVB5X0RFQ1JFRihnb29kKTsKLQkJfQotCQlpZiAob2spIHsKLQkJCVB5X3NzaXplX3QgcmVzbGVuOwotCQkJaWYgKCFQeVN0cmluZ19DaGVjayhpdGVtKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYW4ndCBmaWx0ZXIgc3RyIHRvIHN0cjoiCi0JCQkJCSIgX19nZXRpdGVtX18gcmV0dXJuZWQgZGlmZmVyZW50IHR5cGUiKTsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJZ290byBGYWlsXzE7Ci0JCQl9Ci0JCQlyZXNsZW4gPSBQeVN0cmluZ19HRVRfU0laRShpdGVtKTsKLQkJCWlmIChyZXNsZW4gPT0gMSkgewotCQkJCVB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpW2orK10gPQotCQkJCQlQeVN0cmluZ19BU19TVFJJTkcoaXRlbSlbMF07Ci0JCQl9IGVsc2UgewotCQkJCS8qIGRvIHdlIG5lZWQgbW9yZSBzcGFjZT8gKi8KLQkJCQlQeV9zc2l6ZV90IG5lZWQgPSBqOworICAgICAgICBpdGVtID0gKCpzdHJvYmotPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKShzdHJvYmosIGkpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIGlmIChmdW5jPT1QeV9Ob25lKSB7CisgICAgICAgICAgICBvayA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqYXJnLCAqZ29vZDsKKyAgICAgICAgICAgIGFyZyA9IFB5VHVwbGVfUGFjaygxLCBpdGVtKTsKKyAgICAgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvb2QgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZ29vZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IHJlc2xlbjsKKyAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY2FuJ3QgZmlsdGVyIHN0ciB0byBzdHI6IgorICAgICAgICAgICAgICAgICAgICAiIF9fZ2V0aXRlbV9fIHJldHVybmVkIGRpZmZlcmVudCB0eXBlIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSk7CisgICAgICAgICAgICBpZiAocmVzbGVuID09IDEpIHsKKyAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KVtqKytdID0KKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pWzBdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBkbyB3ZSBuZWVkIG1vcmUgc3BhY2U/ICovCisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuZWVkID0gajsKIAotCQkJCS8qIGNhbGN1bGF0ZSBzcGFjZSByZXF1aXJlbWVudHMgd2hpbGUgY2hlY2tpbmcgZm9yIG92ZXJmbG93ICovCi0JCQkJaWYgKG5lZWQgPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbikgewotCQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJCWdvdG8gRmFpbF8xOwotCQkJCX0KKyAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgc3BhY2UgcmVxdWlyZW1lbnRzIHdoaWxlIGNoZWNraW5nIGZvciBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIGlmIChuZWVkID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQluZWVkICs9IHJlc2xlbjsKKyAgICAgICAgICAgICAgICBuZWVkICs9IHJlc2xlbjsKIAotCQkJCWlmIChuZWVkID4gUFlfU1NJWkVfVF9NQVggLSBsZW4pIHsKLQkJCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCQlnb3RvIEZhaWxfMTsKLQkJCQl9CisgICAgICAgICAgICAgICAgaWYgKG5lZWQgPiBQWV9TU0laRV9UX01BWCAtIGxlbikgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgICAgIH0KIAotCQkJCW5lZWQgKz0gbGVuOworICAgICAgICAgICAgICAgIG5lZWQgKz0gbGVuOwogCi0JCQkJaWYgKG5lZWQgPD0gaSkgewotCQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJCWdvdG8gRmFpbF8xOwotCQkJCX0KKyAgICAgICAgICAgICAgICBpZiAobmVlZCA8PSBpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJbmVlZCA9IG5lZWQgLSBpIC0gMTsKKyAgICAgICAgICAgICAgICBuZWVkID0gbmVlZCAtIGkgLSAxOwogCi0JCQkJYXNzZXJ0KG5lZWQgPj0gMCk7Ci0JCQkJYXNzZXJ0KG91dGxlbiA+PSAwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQobmVlZCA+PSAwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQob3V0bGVuID49IDApOwogCi0JCQkJaWYgKG5lZWQgPiBvdXRsZW4pIHsKLQkJCQkJLyogb3ZlcmFsbG9jYXRlLCB0byBhdm9pZCByZWFsbG9jYXRpb25zICovCi0JCQkJCWlmIChvdXRsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHsKLQkJCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQkJCXJldHVybiBOVUxMOwotCQkJCQl9CisgICAgICAgICAgICAgICAgaWYgKG5lZWQgPiBvdXRsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgLyogb3ZlcmFsbG9jYXRlLCB0byBhdm9pZCByZWFsbG9jYXRpb25zICovCisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJaWYgKG5lZWQ8MipvdXRsZW4pIHsKLQkJCQkJCW5lZWQgPSAyKm91dGxlbjsKLSAgICAgICAgICB9Ci0JCQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIG5lZWQpKSB7Ci0JCQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQkJfQotCQkJCQlvdXRsZW4gPSBuZWVkOwotCQkJCX0KLQkJCQltZW1jcHkoCi0JCQkJCVB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpICsgaiwKLQkJCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLAotCQkJCQlyZXNsZW4KLQkJCQkpOwotCQkJCWogKz0gcmVzbGVuOwotCQkJfQotCQl9Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkPDIqb3V0bGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkID0gMipvdXRsZW47CisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBuZWVkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGVuID0gbmVlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkgKyBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzbGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IHJlc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CiAKLQlpZiAoaiA8IG91dGxlbikKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBqKTsKKyAgICBpZiAoaiA8IG91dGxlbikKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBqKTsKIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogRmFpbF8xOgotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiBOVUxMOwogfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQpAQCAtMjkzMiwxMTIgKzI5MzIsMTEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsdGVydW5pY29kZShQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKnN0cm9iaikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgajsKLQlQeV9zc2l6ZV90IGxlbiA9IFB5VW5pY29kZV9HZXRTaXplKHN0cm9iaik7Ci0JUHlfc3NpemVfdCBvdXRsZW4gPSBsZW47CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIGo7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVVuaWNvZGVfR2V0U2l6ZShzdHJvYmopOworICAgIFB5X3NzaXplX3Qgb3V0bGVuID0gbGVuOwogCi0JaWYgKGZ1bmMgPT0gUHlfTm9uZSkgewotCQkvKiBJZiBpdCdzIGEgcmVhbCBzdHJpbmcgd2UgY2FuIHJldHVybiB0aGUgb3JpZ2luYWwsCi0JCSAqIGFzIG5vIGNoYXJhY3RlciBpcyBldmVyIGZhbHNlIGFuZCBfX2dldGl0ZW1fXwotCQkgKiBkb2VzIHJldHVybiB0aGlzIGNoYXJhY3Rlci4gSWYgaXQncyBhIHN1YmNsYXNzCi0JCSAqIHdlIG11c3QgZ28gdGhyb3VnaCB0aGUgX19nZXRpdGVtX18gbG9vcCAqLwotCQlpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3Ryb2JqKSkgewotCQkJUHlfSU5DUkVGKHN0cm9iaik7Ci0JCQlyZXR1cm4gc3Ryb2JqOwotCQl9Ci0JfQotCWlmICgocmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGxlbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChmdW5jID09IFB5X05vbmUpIHsKKyAgICAgICAgLyogSWYgaXQncyBhIHJlYWwgc3RyaW5nIHdlIGNhbiByZXR1cm4gdGhlIG9yaWdpbmFsLAorICAgICAgICAgKiBhcyBubyBjaGFyYWN0ZXIgaXMgZXZlciBmYWxzZSBhbmQgX19nZXRpdGVtX18KKyAgICAgICAgICogZG9lcyByZXR1cm4gdGhpcyBjaGFyYWN0ZXIuIElmIGl0J3MgYSBzdWJjbGFzcworICAgICAgICAgKiB3ZSBtdXN0IGdvIHRocm91Z2ggdGhlIF9fZ2V0aXRlbV9fIGxvb3AgKi8KKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHN0cm9iaikpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdHJvYmopOworICAgICAgICAgICAgcmV0dXJuIHN0cm9iajsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBsZW4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IGogPSAwOyBpIDwgbGVuOyArK2kpIHsKLQkJUHlPYmplY3QgKml0ZW0sICphcmcsICpnb29kOwotCQlpbnQgb2s7CisgICAgZm9yIChpID0gaiA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSwgKmFyZywgKmdvb2Q7CisgICAgICAgIGludCBvazsKIAotCQlpdGVtID0gKCpzdHJvYmotPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKShzdHJvYmosIGkpOwotCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJZ290byBGYWlsXzE7Ci0JCWlmIChmdW5jID09IFB5X05vbmUpIHsKLQkJCW9rID0gMTsKLQkJfSBlbHNlIHsKLQkJCWFyZyA9IFB5VHVwbGVfUGFjaygxLCBpdGVtKTsKLQkJCWlmIChhcmcgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlnb3RvIEZhaWxfMTsKLQkJCX0KLQkJCWdvb2QgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwotCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQlpZiAoZ29vZCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbF8xOwotCQkJfQotCQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7Ci0JCQlQeV9ERUNSRUYoZ29vZCk7Ci0JCX0KLQkJaWYgKG9rKSB7Ci0JCQlQeV9zc2l6ZV90IHJlc2xlbjsKLQkJCWlmICghUHlVbmljb2RlX0NoZWNrKGl0ZW0pKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY2FuJ3QgZmlsdGVyIHVuaWNvZGUgdG8gdW5pY29kZToiCi0JCQkJIiBfX2dldGl0ZW1fXyByZXR1cm5lZCBkaWZmZXJlbnQgdHlwZSIpOwotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlnb3RvIEZhaWxfMTsKLQkJCX0KLQkJCXJlc2xlbiA9IFB5VW5pY29kZV9HRVRfU0laRShpdGVtKTsKLQkJCWlmIChyZXNsZW4gPT0gMSkKLQkJCQlQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpW2orK10gPQotCQkJCQlQeVVuaWNvZGVfQVNfVU5JQ09ERShpdGVtKVswXTsKLQkJCWVsc2UgewotCQkJCS8qIGRvIHdlIG5lZWQgbW9yZSBzcGFjZT8gKi8KLQkJCQlQeV9zc2l6ZV90IG5lZWQgPSBqICsgcmVzbGVuICsgbGVuIC0gaSAtIDE7Ci0gICAgICAgIAotCQkJCS8qIGNoZWNrIHRoYXQgZGlkbnQgb3ZlcmZsb3cgKi8KLQkJCQlpZiAoKGogPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbikgfHwKLQkJCQkJKChqICsgcmVzbGVuKSA+IFBZX1NTSVpFX1RfTUFYIC0gbGVuKSB8fAotCQkJCQkJKChqICsgcmVzbGVuICsgbGVuKSA8IGkpIHx8Ci0JCQkJCQkJKChqICsgcmVzbGVuICsgbGVuIC0gaSkgPD0gMCkpIHsKLQkJCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9CisgICAgICAgIGl0ZW0gPSAoKnN0cm9iai0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2l0ZW0pKHN0cm9iaiwgaSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgb2sgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXJnID0gUHlUdXBsZV9QYWNrKDEsIGl0ZW0pOworICAgICAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ29vZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgIGlmIChnb29kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgcmVzbGVuOworICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJjYW4ndCBmaWx0ZXIgdW5pY29kZSB0byB1bmljb2RlOiIKKyAgICAgICAgICAgICAgICAiIF9fZ2V0aXRlbV9fIHJldHVybmVkIGRpZmZlcmVudCB0eXBlIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKGl0ZW0pOworICAgICAgICAgICAgaWYgKHJlc2xlbiA9PSAxKQorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdClbaisrXSA9CisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKGl0ZW0pWzBdOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZG8gd2UgbmVlZCBtb3JlIHNwYWNlPyAqLworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbmVlZCA9IGogKyByZXNsZW4gKyBsZW4gLSBpIC0gMTsKIAotCQkJCWFzc2VydChuZWVkID49IDApOwotCQkJCWFzc2VydChvdXRsZW4gPj0gMCk7Ci0JCQkJCi0JCQkJaWYgKG5lZWQgPiBvdXRsZW4pIHsKLQkJCQkJLyogb3ZlcmFsbG9jYXRlLAotCQkJCQkgICB0byBhdm9pZCByZWFsbG9jYXRpb25zICovCi0JCQkJCWlmIChuZWVkIDwgMiAqIG91dGxlbikgewotICAgICAgICAgICAgaWYgKG91dGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikgewotICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQluZWVkID0gMiAqIG91dGxlbjsKLQkJCQkgICAgfQotICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBjaGVjayB0aGF0IGRpZG50IG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgaWYgKChqID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4pIHx8CisgICAgICAgICAgICAgICAgICAgICgoaiArIHJlc2xlbikgPiBQWV9TU0laRV9UX01BWCAtIGxlbikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoaiArIHJlc2xlbiArIGxlbikgPCBpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaiArIHJlc2xlbiArIGxlbiAtIGkpIDw9IDApKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJCWlmIChQeVVuaWNvZGVfUmVzaXplKAotCQkJCQkJJnJlc3VsdCwgbmVlZCkgPCAwKSB7Ci0JCQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJCQlnb3RvIEZhaWxfMTsKLQkJCQkJfQotCQkJCQlvdXRsZW4gPSBuZWVkOwotCQkJCX0KLQkJCQltZW1jcHkoUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KSArIGosCi0JCQkJICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKGl0ZW0pLAotCQkJCSAgICAgICByZXNsZW4qc2l6ZW9mKFB5X1VOSUNPREUpKTsKLQkJCQlqICs9IHJlc2xlbjsKLQkJCX0KLQkJfQotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQorICAgICAgICAgICAgICAgIGFzc2VydChuZWVkID49IDApOworICAgICAgICAgICAgICAgIGFzc2VydChvdXRsZW4gPj0gMCk7CiAKLQlpZiAoaiA8IG91dGxlbikKLQkJUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBqKTsKKyAgICAgICAgICAgICAgICBpZiAobmVlZCA+IG91dGxlbikgeworICAgICAgICAgICAgICAgICAgICAvKiBvdmVyYWxsb2NhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHRvIGF2b2lkIHJlYWxsb2NhdGlvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWQgPCAyICogb3V0bGVuKSB7CisgICAgICAgIGlmIChvdXRsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHsKKyAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZCA9IDIgKiBvdXRsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX1Jlc2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwgbmVlZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsZW4gPSBuZWVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KSArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKGl0ZW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNsZW4qc2l6ZW9mKFB5X1VOSUNPREUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IHJlc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CisKKyAgICBpZiAoaiA8IG91dGxlbikKKyAgICAgICAgUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBqKTsKKworICAgIHJldHVybiByZXN1bHQ7CiAKIEZhaWxfMToKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NldmFsLmMgYi9QeXRob24vY2V2YWwuYwppbmRleCAyYjY0Y2FlLi5hMjdjZmMxIDEwMDY0NAotLS0gYS9QeXRob24vY2V2YWwuYworKysgYi9QeXRob24vY2V2YWwuYwpAQCAtMjgsMjcgKzI4LDI3IEBACiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjQ7CiAKICNpZiBkZWZpbmVkKF9fcHBjX18pIC8qIDwtIERvbid0IGtub3cgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBzeW1ib2w7IHRoaXMKLQkJCSAgIHNlY3Rpb24gc2hvdWxkIHdvcmsgZm9yIEdDQyBvbiBhbnkgUG93ZXJQQwotCQkJICAgcGxhdGZvcm0sIGlycmVzcGVjdGl2ZSBvZiBPUy4KLQkJCSAgIFBPV0VSPyAgV2hvIGtub3dzIDotKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBzaG91bGQgd29yayBmb3IgR0NDIG9uIGFueSBQb3dlclBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSwgaXJyZXNwZWN0aXZlIG9mIE9TLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9XRVI/ICBXaG8ga25vd3MgOi0pICovCiAKICNkZWZpbmUgUkVBRF9USU1FU1RBTVAodmFyKSBwcGNfZ2V0Y291bnRlcigmdmFyKQogCiBzdGF0aWMgdm9pZAogcHBjX2dldGNvdW50ZXIodWludDY0ICp2KQogewotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdGJ1LCB0YiwgdGJ1MjsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHRidSwgdGIsIHRidTI7CiAKICAgbG9vcDoKLQlhc20gdm9sYXRpbGUgKCJtZnRidSAlMCIgOiAiPXIiICh0YnUpICk7Ci0JYXNtIHZvbGF0aWxlICgibWZ0YiAgJTAiIDogIj1yIiAodGIpICApOwotCWFzbSB2b2xhdGlsZSAoIm1mdGJ1ICUwIiA6ICI9ciIgKHRidTIpKTsKLQlpZiAoX19idWlsdGluX2V4cGVjdCh0YnUgIT0gdGJ1MiwgMCkpIGdvdG8gbG9vcDsKKyAgICBhc20gdm9sYXRpbGUgKCJtZnRidSAlMCIgOiAiPXIiICh0YnUpICk7CisgICAgYXNtIHZvbGF0aWxlICgibWZ0YiAgJTAiIDogIj1yIiAodGIpICApOworICAgIGFzbSB2b2xhdGlsZSAoIm1mdGJ1ICUwIiA6ICI9ciIgKHRidTIpKTsKKyAgICBpZiAoX19idWlsdGluX2V4cGVjdCh0YnUgIT0gdGJ1MiwgMCkpIGdvdG8gbG9vcDsKIAotCS8qIFRoZSBzbGlnaHRseSBwZWN1bGlhciB3YXkgb2Ygd3JpdGluZyB0aGUgbmV4dCBsaW5lcyBpcwotCSAgIGNvbXBpbGVkIGJldHRlciBieSBHQ0MgdGhhbiBhbnkgb3RoZXIgd2F5IEkgdHJpZWQuICovCi0JKChsb25nKikodikpWzBdID0gdGJ1OwotCSgobG9uZyopKHYpKVsxXSA9IHRiOworICAgIC8qIFRoZSBzbGlnaHRseSBwZWN1bGlhciB3YXkgb2Ygd3JpdGluZyB0aGUgbmV4dCBsaW5lcyBpcworICAgICAgIGNvbXBpbGVkIGJldHRlciBieSBHQ0MgdGhhbiBhbnkgb3RoZXIgd2F5IEkgdHJpZWQuICovCisgICAgKChsb25nKikodikpWzBdID0gdGJ1OworICAgICgobG9uZyopKHYpKVsxXSA9IHRiOwogfQogCiAjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQpAQCAtNzcsMTcgKzc3LDE3IEBACiAjZW5kaWYKIAogdm9pZCBkdW1wX3RzYyhpbnQgb3Bjb2RlLCBpbnQgdGlja2VkLCB1aW50NjQgaW5zdDAsIHVpbnQ2NCBpbnN0MSwKLQkgICAgICB1aW50NjQgbG9vcDAsIHVpbnQ2NCBsb29wMSwgdWludDY0IGludHIwLCB1aW50NjQgaW50cjEpCisgICAgICAgICAgICAgIHVpbnQ2NCBsb29wMCwgdWludDY0IGxvb3AxLCB1aW50NjQgaW50cjAsIHVpbnQ2NCBpbnRyMSkKIHsKLQl1aW50NjQgaW50ciwgaW5zdCwgbG9vcDsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOwotCWlmICghdHN0YXRlLT5pbnRlcnAtPnRzY2R1bXApCi0JCXJldHVybjsKLQlpbnRyID0gaW50cjEgLSBpbnRyMDsKLQlpbnN0ID0gaW5zdDEgLSBpbnN0MCAtIGludHI7Ci0JbG9vcCA9IGxvb3AxIC0gbG9vcDAgLSBpbnRyOwotCWZwcmludGYoc3RkZXJyLCAib3Bjb2RlPSUwM2QgdD0lZCBpbnN0PSUwNmxsZCBsb29wPSUwNmxsZFxuIiwKLQkJb3Bjb2RlLCB0aWNrZWQsIGluc3QsIGxvb3ApOworICAgIHVpbnQ2NCBpbnRyLCBpbnN0LCBsb29wOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7CisgICAgaWYgKCF0c3RhdGUtPmludGVycC0+dHNjZHVtcCkKKyAgICAgICAgcmV0dXJuOworICAgIGludHIgPSBpbnRyMSAtIGludHIwOworICAgIGluc3QgPSBpbnN0MSAtIGluc3QwIC0gaW50cjsKKyAgICBsb29wID0gbG9vcDEgLSBsb29wMCAtIGludHI7CisgICAgZnByaW50ZihzdGRlcnIsICJvcGNvZGU9JTAzZCB0PSVkIGluc3Q9JTA2bGxkIGxvb3A9JTA2bGxkXG4iLAorICAgICAgICBvcGNvZGUsIHRpY2tlZCwgaW5zdCwgbG9vcCk7CiB9CiAKICNlbmRpZgpAQCAtOTcsOCArOTcsOCBAQAogCiAjaWZkZWYgUHlfREVCVUcKIC8qIEZvciBkZWJ1Z2dpbmcgdGhlIGludGVycHJldGVyOiAqLwotI2RlZmluZSBMTFRSQUNFICAxCS8qIExvdy1sZXZlbCB0cmFjZSBmZWF0dXJlICovCi0jZGVmaW5lIENIRUNLRVhDIDEJLyogRG91YmxlLWNoZWNrIGV4Y2VwdGlvbiBjaGVja2luZyAqLworI2RlZmluZSBMTFRSQUNFICAxICAgICAgLyogTG93LWxldmVsIHRyYWNlIGZlYXR1cmUgKi8KKyNkZWZpbmUgQ0hFQ0tFWEMgMSAgICAgIC8qIERvdWJsZS1jaGVjayBleGNlcHRpb24gY2hlY2tpbmcgKi8KICNlbmRpZgogCiB0eXBlZGVmIFB5T2JqZWN0ICooKmNhbGxwcm9jKShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKQEAgLTExMyw3ICsxMTMsNyBAQAogc3RhdGljIFB5T2JqZWN0ICogZG9fY2FsbChQeU9iamVjdCAqLCBQeU9iamVjdCAqKiosIGludCwgaW50KTsKIHN0YXRpYyBQeU9iamVjdCAqIGV4dF9kb19jYWxsKFB5T2JqZWN0ICosIFB5T2JqZWN0ICoqKiwgaW50LCBpbnQsIGludCk7CiBzdGF0aWMgUHlPYmplY3QgKiB1cGRhdGVfa2V5d29yZF9hcmdzKFB5T2JqZWN0ICosIGludCwgUHlPYmplY3QgKioqLAotCQkJCSAgICAgIFB5T2JqZWN0ICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKTsKIHN0YXRpYyBQeU9iamVjdCAqIHVwZGF0ZV9zdGFyX2FyZ3MoaW50LCBpbnQsIFB5T2JqZWN0ICosIFB5T2JqZWN0ICoqKik7CiBzdGF0aWMgUHlPYmplY3QgKiBsb2FkX2FyZ3MoUHlPYmplY3QgKioqLCBpbnQpOwogI2RlZmluZSBDQUxMX0ZMQUdfVkFSIDEKQEAgLTEyNCwzOSArMTI0LDM5IEBACiBzdGF0aWMgaW50IHBydHJhY2UoUHlPYmplY3QgKiwgY2hhciAqKTsKICNlbmRpZgogc3RhdGljIGludCBjYWxsX3RyYWNlKFB5X3RyYWNlZnVuYywgUHlPYmplY3QgKiwgUHlGcmFtZU9iamVjdCAqLAotCQkgICAgICBpbnQsIFB5T2JqZWN0ICopOworICAgICAgICAgICAgICAgICAgICAgIGludCwgUHlPYmplY3QgKik7CiBzdGF0aWMgaW50IGNhbGxfdHJhY2VfcHJvdGVjdGVkKFB5X3RyYWNlZnVuYywgUHlPYmplY3QgKiwKLQkJCQkgUHlGcmFtZU9iamVjdCAqLCBpbnQsIFB5T2JqZWN0ICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqLCBpbnQsIFB5T2JqZWN0ICopOwogc3RhdGljIHZvaWQgY2FsbF9leGNfdHJhY2UoUHlfdHJhY2VmdW5jLCBQeU9iamVjdCAqLCBQeUZyYW1lT2JqZWN0ICopOwogc3RhdGljIGludCBtYXliZV9jYWxsX2xpbmVfdHJhY2UoUHlfdHJhY2VmdW5jLCBQeU9iamVjdCAqLAotCQkJCSAgUHlGcmFtZU9iamVjdCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICosIGludCAqLCBpbnQgKiwgaW50ICopOwogCiBzdGF0aWMgUHlPYmplY3QgKiBhcHBseV9zbGljZShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgYXNzaWduX3NsaWNlKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCi0JCQlQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIFB5T2JqZWN0ICogY21wX291dGNvbWUoaW50LCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBQeU9iamVjdCAqIGltcG9ydF9mcm9tKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIGludCBpbXBvcnRfYWxsX2Zyb20oUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgUHlPYmplY3QgKiBidWlsZF9jbGFzcyhQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgZXhlY19zdGF0ZW1lbnQoUHlGcmFtZU9iamVjdCAqLAotCQkJICBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgdm9pZCBzZXRfZXhjX2luZm8oUHlUaHJlYWRTdGF0ZSAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyB2b2lkIHJlc2V0X2V4Y19pbmZvKFB5VGhyZWFkU3RhdGUgKik7CiBzdGF0aWMgdm9pZCBmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeU9iamVjdCAqLCBjaGFyICosIFB5T2JqZWN0ICopOwogc3RhdGljIFB5T2JqZWN0ICogc3RyaW5nX2NvbmNhdGVuYXRlKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCi0JCQkJICAgIFB5RnJhbWVPYmplY3QgKiwgdW5zaWduZWQgY2hhciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnJhbWVPYmplY3QgKiwgdW5zaWduZWQgY2hhciAqKTsKIHN0YXRpYyBQeU9iamVjdCAqIGt3ZF9hc19zdHJpbmcoUHlPYmplY3QgKik7CiBzdGF0aWMgUHlPYmplY3QgKiBzcGVjaWFsX2xvb2t1cChQeU9iamVjdCAqLCBjaGFyICosIFB5T2JqZWN0ICoqKTsKIAogI2RlZmluZSBOQU1FX0VSUk9SX01TRyBcCi0JIm5hbWUgJyUuMjAwcycgaXMgbm90IGRlZmluZWQiCisgICAgIm5hbWUgJyUuMjAwcycgaXMgbm90IGRlZmluZWQiCiAjZGVmaW5lIEdMT0JBTF9OQU1FX0VSUk9SX01TRyBcCi0JImdsb2JhbCBuYW1lICclLjIwMHMnIGlzIG5vdCBkZWZpbmVkIgorICAgICJnbG9iYWwgbmFtZSAnJS4yMDBzJyBpcyBub3QgZGVmaW5lZCIKICNkZWZpbmUgVU5CT1VORExPQ0FMX0VSUk9SX01TRyBcCi0JImxvY2FsIHZhcmlhYmxlICclLjIwMHMnIHJlZmVyZW5jZWQgYmVmb3JlIGFzc2lnbm1lbnQiCisgICAgImxvY2FsIHZhcmlhYmxlICclLjIwMHMnIHJlZmVyZW5jZWQgYmVmb3JlIGFzc2lnbm1lbnQiCiAjZGVmaW5lIFVOQk9VTkRGUkVFX0VSUk9SX01TRyBcCi0JImZyZWUgdmFyaWFibGUgJyUuMjAwcycgcmVmZXJlbmNlZCBiZWZvcmUgYXNzaWdubWVudCIgXAotICAgICAgICAiIGluIGVuY2xvc2luZyBzY29wZSIKKyAgICAiZnJlZSB2YXJpYWJsZSAnJS4yMDBzJyByZWZlcmVuY2VkIGJlZm9yZSBhc3NpZ25tZW50IiBcCisgICAgIiBpbiBlbmNsb3Npbmcgc2NvcGUiCiAKIC8qIER5bmFtaWMgZXhlY3V0aW9uIHByb2ZpbGUgKi8KICNpZmRlZiBEWU5BTUlDX0VYRUNVVElPTl9QUk9GSUxFCkBAIC0yMDgsMTAgKzIwOCwxMCBAQAogUHlPYmplY3QgKgogUHlFdmFsX0dldENhbGxTdGF0cyhQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpaWlpaWlpaWkiLAotCQkJICAgICBwY2FsbFswXSwgcGNhbGxbMV0sIHBjYWxsWzJdLCBwY2FsbFszXSwKLQkJCSAgICAgcGNhbGxbNF0sIHBjYWxsWzVdLCBwY2FsbFs2XSwgcGNhbGxbN10sCi0JCQkgICAgIHBjYWxsWzhdLCBwY2FsbFs5XSwgcGNhbGxbMTBdKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpaWlpaWlpaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBjYWxsWzBdLCBwY2FsbFsxXSwgcGNhbGxbMl0sIHBjYWxsWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBjYWxsWzRdLCBwY2FsbFs1XSwgcGNhbGxbNl0sIHBjYWxsWzddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBjYWxsWzhdLCBwY2FsbFs5XSwgcGNhbGxbMTBdKTsKIH0KICNlbHNlCiAjZGVmaW5lIFBDQUxMKE8pCkBAIC0yMTksOCArMjE5LDggQEAKIFB5T2JqZWN0ICoKIFB5RXZhbF9HZXRDYWxsU3RhdHMoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KICNlbmRpZgogCkBAIC0yMzksNTIgKzIzOSw1MiBAQAogaW50CiBQeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkKHZvaWQpCiB7Ci0JcmV0dXJuIGludGVycHJldGVyX2xvY2sgIT0gMDsKKyAgICByZXR1cm4gaW50ZXJwcmV0ZXJfbG9jayAhPSAwOwogfQogCiB2b2lkCiBQeUV2YWxfSW5pdFRocmVhZHModm9pZCkKIHsKLQlpZiAoaW50ZXJwcmV0ZXJfbG9jaykKLQkJcmV0dXJuOwotCWludGVycHJldGVyX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOwotCW1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIGlmIChpbnRlcnByZXRlcl9sb2NrKQorICAgICAgICByZXR1cm47CisgICAgaW50ZXJwcmV0ZXJfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7CisgICAgbWFpbl90aHJlYWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CiB9CiAKIHZvaWQKIFB5RXZhbF9BY3F1aXJlTG9jayh2b2lkKQogewotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7CiB9CiAKIHZvaWQKIFB5RXZhbF9SZWxlYXNlTG9jayh2b2lkKQogewotCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbnRlcnByZXRlcl9sb2NrKTsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soaW50ZXJwcmV0ZXJfbG9jayk7CiB9CiAKIHZvaWQKIFB5RXZhbF9BY3F1aXJlVGhyZWFkKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIHsKLQlpZiAodHN0YXRlID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5RXZhbF9BY3F1aXJlVGhyZWFkOiBOVUxMIG5ldyB0aHJlYWQgc3RhdGUiKTsKLQkvKiBDaGVjayBzb21lb25lIGhhcyBjYWxsZWQgUHlFdmFsX0luaXRUaHJlYWRzKCkgdG8gY3JlYXRlIHRoZSBsb2NrICovCi0JYXNzZXJ0KGludGVycHJldGVyX2xvY2spOwotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKLQlpZiAoUHlUaHJlYWRTdGF0ZV9Td2FwKHRzdGF0ZSkgIT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigKLQkJCSJQeUV2YWxfQWNxdWlyZVRocmVhZDogbm9uLU5VTEwgb2xkIHRocmVhZCBzdGF0ZSIpOworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlFdmFsX0FjcXVpcmVUaHJlYWQ6IE5VTEwgbmV3IHRocmVhZCBzdGF0ZSIpOworICAgIC8qIENoZWNrIHNvbWVvbmUgaGFzIGNhbGxlZCBQeUV2YWxfSW5pdFRocmVhZHMoKSB0byBjcmVhdGUgdGhlIGxvY2sgKi8KKyAgICBhc3NlcnQoaW50ZXJwcmV0ZXJfbG9jayk7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOworICAgIGlmIChQeVRocmVhZFN0YXRlX1N3YXAodHN0YXRlKSAhPSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKAorICAgICAgICAgICAgIlB5RXZhbF9BY3F1aXJlVGhyZWFkOiBub24tTlVMTCBvbGQgdGhyZWFkIHN0YXRlIik7CiB9CiAKIHZvaWQKIFB5RXZhbF9SZWxlYXNlVGhyZWFkKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIHsKLQlpZiAodHN0YXRlID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5RXZhbF9SZWxlYXNlVGhyZWFkOiBOVUxMIHRocmVhZCBzdGF0ZSIpOwotCWlmIChQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCkgIT0gdHN0YXRlKQotCQlQeV9GYXRhbEVycm9yKCJQeUV2YWxfUmVsZWFzZVRocmVhZDogd3JvbmcgdGhyZWFkIHN0YXRlIik7Ci0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGludGVycHJldGVyX2xvY2spOworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlFdmFsX1JlbGVhc2VUaHJlYWQ6IE5VTEwgdGhyZWFkIHN0YXRlIik7CisgICAgaWYgKFB5VGhyZWFkU3RhdGVfU3dhcChOVUxMKSAhPSB0c3RhdGUpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5RXZhbF9SZWxlYXNlVGhyZWFkOiB3cm9uZyB0aHJlYWQgc3RhdGUiKTsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soaW50ZXJwcmV0ZXJfbG9jayk7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gUHlPU19BZnRlckZvcmsgdG8gZW5zdXJlIHRoYXQgbmV3bHkKQEAgLTI5NSwzNiArMjk1LDM2IEBACiB2b2lkCiBQeUV2YWxfUmVJbml0VGhyZWFkcyh2b2lkKQogewotCVB5T2JqZWN0ICp0aHJlYWRpbmcsICpyZXN1bHQ7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworICAgIFB5T2JqZWN0ICp0aHJlYWRpbmcsICpyZXN1bHQ7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwogCi0JaWYgKCFpbnRlcnByZXRlcl9sb2NrKQotCQlyZXR1cm47Ci0JLypYWFggQ2FuJ3QgdXNlIFB5VGhyZWFkX2ZyZWVfbG9jayBoZXJlIGJlY2F1c2UgaXQgZG9lcyB0b28KLQkgIG11Y2ggZXJyb3ItY2hlY2tpbmcuICBEb2luZyB0aGlzIGNsZWFubHkgd291bGQgcmVxdWlyZQotCSAgYWRkaW5nIGEgbmV3IGZ1bmN0aW9uIHRvIGVhY2ggdGhyZWFkXyouaC4gIEluc3RlYWQsIGp1c3QKLQkgIGNyZWF0ZSBhIG5ldyBsb2NrIGFuZCB3YXN0ZSBhIGxpdHRsZSBiaXQgb2YgbWVtb3J5ICovCi0JaW50ZXJwcmV0ZXJfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKLQlwZW5kaW5nX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOwotCW1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIGlmICghaW50ZXJwcmV0ZXJfbG9jaykKKyAgICAgICAgcmV0dXJuOworICAgIC8qWFhYIENhbid0IHVzZSBQeVRocmVhZF9mcmVlX2xvY2sgaGVyZSBiZWNhdXNlIGl0IGRvZXMgdG9vCisgICAgICBtdWNoIGVycm9yLWNoZWNraW5nLiAgRG9pbmcgdGhpcyBjbGVhbmx5IHdvdWxkIHJlcXVpcmUKKyAgICAgIGFkZGluZyBhIG5ldyBmdW5jdGlvbiB0byBlYWNoIHRocmVhZF8qLmguICBJbnN0ZWFkLCBqdXN0CisgICAgICBjcmVhdGUgYSBuZXcgbG9jayBhbmQgd2FzdGUgYSBsaXR0bGUgYml0IG9mIG1lbW9yeSAqLworICAgIGludGVycHJldGVyX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgcGVuZGluZ19sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKKyAgICBtYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKIAotCS8qIFVwZGF0ZSB0aGUgdGhyZWFkaW5nIG1vZHVsZSB3aXRoIHRoZSBuZXcgc3RhdGUuCi0JICovCi0JdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQl0aHJlYWRpbmcgPSBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZyh0c3RhdGUtPmludGVycC0+bW9kdWxlcywKLQkJCQkJICAgICJ0aHJlYWRpbmciKTsKLQlpZiAodGhyZWFkaW5nID09IE5VTEwpIHsKLQkJLyogdGhyZWFkaW5nIG5vdCBpbXBvcnRlZCAqLwotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm47Ci0JfQotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGhyZWFkaW5nLCAiX2FmdGVyX2ZvcmsiLCBOVUxMKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZSh0aHJlYWRpbmcpOwotCWVsc2UKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JUHlfREVDUkVGKHRocmVhZGluZyk7CisgICAgLyogVXBkYXRlIHRoZSB0aHJlYWRpbmcgbW9kdWxlIHdpdGggdGhlIG5ldyBzdGF0ZS4KKyAgICAgKi8KKyAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIHRocmVhZGluZyA9IFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nKHRzdGF0ZS0+aW50ZXJwLT5tb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRpbmciKTsKKyAgICBpZiAodGhyZWFkaW5nID09IE5VTEwpIHsKKyAgICAgICAgLyogdGhyZWFkaW5nIG5vdCBpbXBvcnRlZCAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGhyZWFkaW5nLCAiX2FmdGVyX2ZvcmsiLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSh0aHJlYWRpbmcpOworICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKHRocmVhZGluZyk7CiB9CiAjZW5kaWYKIApAQCAtMzM1LDI5ICszMzUsMjkgQEAKIFB5VGhyZWFkU3RhdGUgKgogUHlFdmFsX1NhdmVUaHJlYWQodm9pZCkKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7Ci0JaWYgKHRzdGF0ZSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeUV2YWxfU2F2ZVRocmVhZDogTlVMTCB0c3RhdGUiKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7CisgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeUV2YWxfU2F2ZVRocmVhZDogTlVMTCB0c3RhdGUiKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChpbnRlcnByZXRlcl9sb2NrKQotCQlQeVRocmVhZF9yZWxlYXNlX2xvY2soaW50ZXJwcmV0ZXJfbG9jayk7CisgICAgaWYgKGludGVycHJldGVyX2xvY2spCisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbnRlcnByZXRlcl9sb2NrKTsKICNlbmRpZgotCXJldHVybiB0c3RhdGU7CisgICAgcmV0dXJuIHRzdGF0ZTsKIH0KIAogdm9pZAogUHlFdmFsX1Jlc3RvcmVUaHJlYWQoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotCWlmICh0c3RhdGUgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlFdmFsX1Jlc3RvcmVUaHJlYWQ6IE5VTEwgdHN0YXRlIik7CisgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeUV2YWxfUmVzdG9yZVRocmVhZDogTlVMTCB0c3RhdGUiKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChpbnRlcnByZXRlcl9sb2NrKSB7Ci0JCWludCBlcnIgPSBlcnJubzsKLQkJUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOwotCQllcnJubyA9IGVycjsKLQl9CisgICAgaWYgKGludGVycHJldGVyX2xvY2spIHsKKyAgICAgICAgaW50IGVyciA9IGVycm5vOworICAgICAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7CisgICAgICAgIGVycm5vID0gZXJyOworICAgIH0KICNlbmRpZgotCVB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpOworICAgIFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpOwogfQogCiAKQEAgLTM5NCw4ICszOTQsOCBAQAogCiAjZGVmaW5lIE5QRU5ESU5HQ0FMTFMgMzIKIHN0YXRpYyBzdHJ1Y3QgewotCWludCAoKmZ1bmMpKHZvaWQgKik7Ci0Jdm9pZCAqYXJnOworICAgIGludCAoKmZ1bmMpKHZvaWQgKik7CisgICAgdm9pZCAqYXJnOwogfSBwZW5kaW5nY2FsbHNbTlBFTkRJTkdDQUxMU107CiBzdGF0aWMgaW50IHBlbmRpbmdmaXJzdCA9IDA7CiBzdGF0aWMgaW50IHBlbmRpbmdsYXN0ID0gMDsKQEAgLTQwNSw5MyArNDA1LDkzIEBACiBpbnQKIFB5X0FkZFBlbmRpbmdDYWxsKGludCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlpbnQgaSwgaiwgcmVzdWx0PTA7Ci0JUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2sgPSBwZW5kaW5nX2xvY2s7Ci0JCi0JLyogdHJ5IGEgZmV3IHRpbWVzIGZvciB0aGUgbG9jay4gIFNpbmNlIHRoaXMgbWVjaGFuaXNtIGlzIHVzZWQKLQkgKiBmb3Igc2lnbmFsIGhhbmRsaW5nIChvbiB0aGUgbWFpbiB0aHJlYWQpLCB0aGVyZSBpcyBhIChzbGltKQotCSAqIGNoYW5jZSB0aGF0IGEgc2lnbmFsIGlzIGRlbGl2ZXJlZCBvbiB0aGUgc2FtZSB0aHJlYWQgd2hpbGUgd2UKLQkgKiBob2xkIHRoZSBsb2NrIGR1cmluZyB0aGUgUHlfTWFrZVBlbmRpbmdDYWxscygpIGZ1bmN0aW9uLgotCSAqIFRoaXMgYXZvaWRzIGEgZGVhZGxvY2sgaW4gdGhhdCBjYXNlLgotCSAqIE5vdGUgdGhhdCBzaWduYWxzIGNhbiBiZSBkZWxpdmVyZWQgb24gYW55IHRocmVhZC4gIEluIHBhcnRpY3VsYXIsCi0JICogb24gV2luZG93cywgYSBTSUdJTlQgaXMgZGVsaXZlcmVkIG9uIGEgc3lzdGVtLWNyZWF0ZWQgd29ya2VyCi0JICogdGhyZWFkLgotCSAqIFdlIGFsc28gY2hlY2sgZm9yIGxvY2sgYmVpbmcgTlVMTCwgaW4gdGhlIHVubGlrZWx5IGNhc2UgdGhhdAotCSAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBhbnkgYnl0ZWNvZGUgZXZhbHVhdGlvbiB0YWtlcyBwbGFjZS4KLQkgKi8KLQlpZiAobG9jayAhPSBOVUxMKSB7Ci0JCWZvciAoaSA9IDA7IGk8MTAwOyBpKyspIHsKLQkJCWlmIChQeVRocmVhZF9hY3F1aXJlX2xvY2sobG9jaywgTk9XQUlUX0xPQ0spKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IDEwMCkKLQkJCXJldHVybiAtMTsKLQl9CisgICAgaW50IGksIGosIHJlc3VsdD0wOworICAgIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrID0gcGVuZGluZ19sb2NrOwogCi0JaSA9IHBlbmRpbmdsYXN0OwotCWogPSAoaSArIDEpICUgTlBFTkRJTkdDQUxMUzsKLQlpZiAoaiA9PSBwZW5kaW5nZmlyc3QpIHsKLQkJcmVzdWx0ID0gLTE7IC8qIFF1ZXVlIGZ1bGwgKi8KLQl9IGVsc2UgewotCQlwZW5kaW5nY2FsbHNbaV0uZnVuYyA9IGZ1bmM7Ci0JCXBlbmRpbmdjYWxsc1tpXS5hcmcgPSBhcmc7Ci0JCXBlbmRpbmdsYXN0ID0gajsKLQl9Ci0JLyogc2lnbmFsIG1haW4gbG9vcCAqLwotCV9QeV9UaWNrZXIgPSAwOwotCXBlbmRpbmdjYWxsc190b19kbyA9IDE7Ci0JaWYgKGxvY2sgIT0gTlVMTCkKLQkJUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGxvY2spOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogdHJ5IGEgZmV3IHRpbWVzIGZvciB0aGUgbG9jay4gIFNpbmNlIHRoaXMgbWVjaGFuaXNtIGlzIHVzZWQKKyAgICAgKiBmb3Igc2lnbmFsIGhhbmRsaW5nIChvbiB0aGUgbWFpbiB0aHJlYWQpLCB0aGVyZSBpcyBhIChzbGltKQorICAgICAqIGNoYW5jZSB0aGF0IGEgc2lnbmFsIGlzIGRlbGl2ZXJlZCBvbiB0aGUgc2FtZSB0aHJlYWQgd2hpbGUgd2UKKyAgICAgKiBob2xkIHRoZSBsb2NrIGR1cmluZyB0aGUgUHlfTWFrZVBlbmRpbmdDYWxscygpIGZ1bmN0aW9uLgorICAgICAqIFRoaXMgYXZvaWRzIGEgZGVhZGxvY2sgaW4gdGhhdCBjYXNlLgorICAgICAqIE5vdGUgdGhhdCBzaWduYWxzIGNhbiBiZSBkZWxpdmVyZWQgb24gYW55IHRocmVhZC4gIEluIHBhcnRpY3VsYXIsCisgICAgICogb24gV2luZG93cywgYSBTSUdJTlQgaXMgZGVsaXZlcmVkIG9uIGEgc3lzdGVtLWNyZWF0ZWQgd29ya2VyCisgICAgICogdGhyZWFkLgorICAgICAqIFdlIGFsc28gY2hlY2sgZm9yIGxvY2sgYmVpbmcgTlVMTCwgaW4gdGhlIHVubGlrZWx5IGNhc2UgdGhhdAorICAgICAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBhbnkgYnl0ZWNvZGUgZXZhbHVhdGlvbiB0YWtlcyBwbGFjZS4KKyAgICAgKi8KKyAgICBpZiAobG9jayAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGk8MTAwOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQeVRocmVhZF9hY3F1aXJlX2xvY2sobG9jaywgTk9XQUlUX0xPQ0spKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IDEwMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpID0gcGVuZGluZ2xhc3Q7CisgICAgaiA9IChpICsgMSkgJSBOUEVORElOR0NBTExTOworICAgIGlmIChqID09IHBlbmRpbmdmaXJzdCkgeworICAgICAgICByZXN1bHQgPSAtMTsgLyogUXVldWUgZnVsbCAqLworICAgIH0gZWxzZSB7CisgICAgICAgIHBlbmRpbmdjYWxsc1tpXS5mdW5jID0gZnVuYzsKKyAgICAgICAgcGVuZGluZ2NhbGxzW2ldLmFyZyA9IGFyZzsKKyAgICAgICAgcGVuZGluZ2xhc3QgPSBqOworICAgIH0KKyAgICAvKiBzaWduYWwgbWFpbiBsb29wICovCisgICAgX1B5X1RpY2tlciA9IDA7CisgICAgcGVuZGluZ2NhbGxzX3RvX2RvID0gMTsKKyAgICBpZiAobG9jayAhPSBOVUxMKQorICAgICAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2sobG9jayk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogaW50CiBQeV9NYWtlUGVuZGluZ0NhbGxzKHZvaWQpCiB7Ci0JaW50IGk7Ci0JaW50IHIgPSAwOworICAgIGludCBpOworICAgIGludCByID0gMDsKIAotCWlmICghcGVuZGluZ19sb2NrKSB7Ci0JCS8qIGluaXRpYWwgYWxsb2NhdGlvbiBvZiB0aGUgbG9jayAqLwotCQlwZW5kaW5nX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JCWlmIChwZW5kaW5nX2xvY2sgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCFwZW5kaW5nX2xvY2spIHsKKyAgICAgICAgLyogaW5pdGlhbCBhbGxvY2F0aW9uIG9mIHRoZSBsb2NrICovCisgICAgICAgIHBlbmRpbmdfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICAgICAgaWYgKHBlbmRpbmdfbG9jayA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIG9ubHkgc2VydmljZSBwZW5kaW5nIGNhbGxzIG9uIG1haW4gdGhyZWFkICovCi0JaWYgKG1haW5fdGhyZWFkICYmIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkKLQkJcmV0dXJuIDA7IAotCS8qIGRvbid0IHBlcmZvcm0gcmVjdXJzaXZlIHBlbmRpbmcgY2FsbHMgKi8KLQlpZiAocGVuZGluZ2J1c3kpCi0JCXJldHVybiAwOwotCXBlbmRpbmdidXN5ID0gMTsKLQkvKiBwZXJmb3JtIGEgYm91bmRlZCBudW1iZXIgb2YgY2FsbHMsIGluIGNhc2Ugb2YgcmVjdXJzaW9uICovCi0JZm9yIChpPTA7IGk8TlBFTkRJTkdDQUxMUzsgaSsrKSB7Ci0JCWludCBqOyAgCi0JCWludCAoKmZ1bmMpKHZvaWQgKik7Ci0JCXZvaWQgKmFyZyA9IE5VTEw7Ci0JCQotCQkvKiBwb3Agb25lIGl0ZW0gb2ZmIHRoZSBxdWV1ZSB3aGlsZSBob2xkaW5nIHRoZSBsb2NrICovCi0JCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhwZW5kaW5nX2xvY2ssIFdBSVRfTE9DSyk7Ci0JCWogPSBwZW5kaW5nZmlyc3Q7Ci0JCWlmIChqID09IHBlbmRpbmdsYXN0KSB7Ci0JCQlmdW5jID0gTlVMTDsgLyogUXVldWUgZW1wdHkgKi8KLQkJfSBlbHNlIHsKLQkJCWZ1bmMgPSBwZW5kaW5nY2FsbHNbal0uZnVuYzsKLQkJCWFyZyA9IHBlbmRpbmdjYWxsc1tqXS5hcmc7Ci0JCQlwZW5kaW5nZmlyc3QgPSAoaiArIDEpICUgTlBFTkRJTkdDQUxMUzsKLQkJfQotCQlwZW5kaW5nY2FsbHNfdG9fZG8gPSBwZW5kaW5nZmlyc3QgIT0gcGVuZGluZ2xhc3Q7Ci0JCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhwZW5kaW5nX2xvY2spOwotCQkvKiBoYXZpbmcgcmVsZWFzZWQgdGhlIGxvY2ssIHBlcmZvcm0gdGhlIGNhbGxiYWNrICovCi0JCWlmIChmdW5jID09IE5VTEwpCi0JCQlicmVhazsKLQkJciA9IGZ1bmMoYXJnKTsKLQkJaWYgKHIpCi0JCQlicmVhazsKLQl9Ci0JcGVuZGluZ2J1c3kgPSAwOwotCXJldHVybiByOworICAgIC8qIG9ubHkgc2VydmljZSBwZW5kaW5nIGNhbGxzIG9uIG1haW4gdGhyZWFkICovCisgICAgaWYgKG1haW5fdGhyZWFkICYmIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLyogZG9uJ3QgcGVyZm9ybSByZWN1cnNpdmUgcGVuZGluZyBjYWxscyAqLworICAgIGlmIChwZW5kaW5nYnVzeSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcGVuZGluZ2J1c3kgPSAxOworICAgIC8qIHBlcmZvcm0gYSBib3VuZGVkIG51bWJlciBvZiBjYWxscywgaW4gY2FzZSBvZiByZWN1cnNpb24gKi8KKyAgICBmb3IgKGk9MDsgaTxOUEVORElOR0NBTExTOyBpKyspIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGludCAoKmZ1bmMpKHZvaWQgKik7CisgICAgICAgIHZvaWQgKmFyZyA9IE5VTEw7CisKKyAgICAgICAgLyogcG9wIG9uZSBpdGVtIG9mZiB0aGUgcXVldWUgd2hpbGUgaG9sZGluZyB0aGUgbG9jayAqLworICAgICAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2socGVuZGluZ19sb2NrLCBXQUlUX0xPQ0spOworICAgICAgICBqID0gcGVuZGluZ2ZpcnN0OworICAgICAgICBpZiAoaiA9PSBwZW5kaW5nbGFzdCkgeworICAgICAgICAgICAgZnVuYyA9IE5VTEw7IC8qIFF1ZXVlIGVtcHR5ICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmdW5jID0gcGVuZGluZ2NhbGxzW2pdLmZ1bmM7CisgICAgICAgICAgICBhcmcgPSBwZW5kaW5nY2FsbHNbal0uYXJnOworICAgICAgICAgICAgcGVuZGluZ2ZpcnN0ID0gKGogKyAxKSAlIE5QRU5ESU5HQ0FMTFM7CisgICAgICAgIH0KKyAgICAgICAgcGVuZGluZ2NhbGxzX3RvX2RvID0gcGVuZGluZ2ZpcnN0ICE9IHBlbmRpbmdsYXN0OworICAgICAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2socGVuZGluZ19sb2NrKTsKKyAgICAgICAgLyogaGF2aW5nIHJlbGVhc2VkIHRoZSBsb2NrLCBwZXJmb3JtIHRoZSBjYWxsYmFjayAqLworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHIgPSBmdW5jKGFyZyk7CisgICAgICAgIGlmIChyKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHBlbmRpbmdidXN5ID0gMDsKKyAgICByZXR1cm4gcjsKIH0KIAogI2Vsc2UgLyogaWYgISBkZWZpbmVkIFdJVEhfVEhSRUFEICovCkBAIC01MDIsMTEgKzUwMiwxMSBAQAogICAgd2l0aCBXSVRIX1RIUkVBRC4KICAgIERvbid0IHVzZSB0aGlzIGltcGxlbWVudGF0aW9uIHdoZW4gUHlfQWRkUGVuZGluZ0NhbGxzKCkgY2FuIGhhcHBlbgogICAgb24gYSBkaWZmZXJlbnQgdGhyZWFkIQotIAorCiAgICBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uczoKICAgICgxKSBuZXN0ZWQgYXN5bmNocm9ub3VzIGNhbGxzIHRvIFB5X0FkZFBlbmRpbmdDYWxsKCkKICAgICgyKSBBZGRQZW5kaW5nQ2FsbCgpIGNhbGxzIG1hZGUgd2hpbGUgcGVuZGluZyBjYWxscyBhcmUgYmVpbmcgcHJvY2Vzc2VkLgotICAgCisKICAgICgxKSBpcyB2ZXJ5IHVubGlrZWx5IGJlY2F1c2UgdHlwaWNhbGx5IHNpZ25hbCBkZWxpdmVyeQogICAgaXMgYmxvY2tlZCBkdXJpbmcgc2lnbmFsIGhhbmRsaW5nLiAgU28gaXQgc2hvdWxkIGJlIGltcG9zc2libGUuCiAgICAoMikgaXMgYSByZWFsIHBvc3NpYmlsaXR5LgpAQCAtNTIxLDggKzUyMSw4IEBACiAKICNkZWZpbmUgTlBFTkRJTkdDQUxMUyAzMgogc3RhdGljIHN0cnVjdCB7Ci0JaW50ICgqZnVuYykodm9pZCAqKTsKLQl2b2lkICphcmc7CisgICAgaW50ICgqZnVuYykodm9pZCAqKTsKKyAgICB2b2lkICphcmc7CiB9IHBlbmRpbmdjYWxsc1tOUEVORElOR0NBTExTXTsKIHN0YXRpYyB2b2xhdGlsZSBpbnQgcGVuZGluZ2ZpcnN0ID0gMDsKIHN0YXRpYyB2b2xhdGlsZSBpbnQgcGVuZGluZ2xhc3QgPSAwOwpAQCAtNTMxLDU1ICs1MzEsNTUgQEAKIGludAogUHlfQWRkUGVuZGluZ0NhbGwoaW50ICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCXN0YXRpYyB2b2xhdGlsZSBpbnQgYnVzeSA9IDA7Ci0JaW50IGksIGo7Ci0JLyogWFhYIEJlZ2luIGNyaXRpY2FsIHNlY3Rpb24gKi8KLQlpZiAoYnVzeSkKLQkJcmV0dXJuIC0xOwotCWJ1c3kgPSAxOwotCWkgPSBwZW5kaW5nbGFzdDsKLQlqID0gKGkgKyAxKSAlIE5QRU5ESU5HQ0FMTFM7Ci0JaWYgKGogPT0gcGVuZGluZ2ZpcnN0KSB7Ci0JCWJ1c3kgPSAwOwotCQlyZXR1cm4gLTE7IC8qIFF1ZXVlIGZ1bGwgKi8KLQl9Ci0JcGVuZGluZ2NhbGxzW2ldLmZ1bmMgPSBmdW5jOwotCXBlbmRpbmdjYWxsc1tpXS5hcmcgPSBhcmc7Ci0JcGVuZGluZ2xhc3QgPSBqOworICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQgYnVzeSA9IDA7CisgICAgaW50IGksIGo7CisgICAgLyogWFhYIEJlZ2luIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICBpZiAoYnVzeSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGJ1c3kgPSAxOworICAgIGkgPSBwZW5kaW5nbGFzdDsKKyAgICBqID0gKGkgKyAxKSAlIE5QRU5ESU5HQ0FMTFM7CisgICAgaWYgKGogPT0gcGVuZGluZ2ZpcnN0KSB7CisgICAgICAgIGJ1c3kgPSAwOworICAgICAgICByZXR1cm4gLTE7IC8qIFF1ZXVlIGZ1bGwgKi8KKyAgICB9CisgICAgcGVuZGluZ2NhbGxzW2ldLmZ1bmMgPSBmdW5jOworICAgIHBlbmRpbmdjYWxsc1tpXS5hcmcgPSBhcmc7CisgICAgcGVuZGluZ2xhc3QgPSBqOwogCi0JX1B5X1RpY2tlciA9IDA7Ci0JcGVuZGluZ2NhbGxzX3RvX2RvID0gMTsgLyogU2lnbmFsIG1haW4gbG9vcCAqLwotCWJ1c3kgPSAwOwotCS8qIFhYWCBFbmQgY3JpdGljYWwgc2VjdGlvbiAqLwotCXJldHVybiAwOworICAgIF9QeV9UaWNrZXIgPSAwOworICAgIHBlbmRpbmdjYWxsc190b19kbyA9IDE7IC8qIFNpZ25hbCBtYWluIGxvb3AgKi8KKyAgICBidXN5ID0gMDsKKyAgICAvKiBYWFggRW5kIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeV9NYWtlUGVuZGluZ0NhbGxzKHZvaWQpCiB7Ci0Jc3RhdGljIGludCBidXN5ID0gMDsKLQlpZiAoYnVzeSkKLQkJcmV0dXJuIDA7Ci0JYnVzeSA9IDE7Ci0JcGVuZGluZ2NhbGxzX3RvX2RvID0gMDsKLQlmb3IgKDs7KSB7Ci0JCWludCBpOwotCQlpbnQgKCpmdW5jKSh2b2lkICopOwotCQl2b2lkICphcmc7Ci0JCWkgPSBwZW5kaW5nZmlyc3Q7Ci0JCWlmIChpID09IHBlbmRpbmdsYXN0KQotCQkJYnJlYWs7IC8qIFF1ZXVlIGVtcHR5ICovCi0JCWZ1bmMgPSBwZW5kaW5nY2FsbHNbaV0uZnVuYzsKLQkJYXJnID0gcGVuZGluZ2NhbGxzW2ldLmFyZzsKLQkJcGVuZGluZ2ZpcnN0ID0gKGkgKyAxKSAlIE5QRU5ESU5HQ0FMTFM7Ci0JCWlmIChmdW5jKGFyZykgPCAwKSB7Ci0JCQlidXN5ID0gMDsKLQkJCXBlbmRpbmdjYWxsc190b19kbyA9IDE7IC8qIFdlJ3JlIG5vdCBkb25lIHlldCAqLwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWJ1c3kgPSAwOwotCXJldHVybiAwOworICAgIHN0YXRpYyBpbnQgYnVzeSA9IDA7CisgICAgaWYgKGJ1c3kpCisgICAgICAgIHJldHVybiAwOworICAgIGJ1c3kgPSAxOworICAgIHBlbmRpbmdjYWxsc190b19kbyA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50ICgqZnVuYykodm9pZCAqKTsKKyAgICAgICAgdm9pZCAqYXJnOworICAgICAgICBpID0gcGVuZGluZ2ZpcnN0OworICAgICAgICBpZiAoaSA9PSBwZW5kaW5nbGFzdCkKKyAgICAgICAgICAgIGJyZWFrOyAvKiBRdWV1ZSBlbXB0eSAqLworICAgICAgICBmdW5jID0gcGVuZGluZ2NhbGxzW2ldLmZ1bmM7CisgICAgICAgIGFyZyA9IHBlbmRpbmdjYWxsc1tpXS5hcmc7CisgICAgICAgIHBlbmRpbmdmaXJzdCA9IChpICsgMSkgJSBOUEVORElOR0NBTExTOworICAgICAgICBpZiAoZnVuYyhhcmcpIDwgMCkgeworICAgICAgICAgICAgYnVzeSA9IDA7CisgICAgICAgICAgICBwZW5kaW5nY2FsbHNfdG9fZG8gPSAxOyAvKiBXZSdyZSBub3QgZG9uZSB5ZXQgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBidXN5ID0gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogI2VuZGlmIC8qIFdJVEhfVEhSRUFEICovCkBAIC01OTYsMTQgKzU5NiwxNCBAQAogaW50CiBQeV9HZXRSZWN1cnNpb25MaW1pdCh2b2lkKQogewotCXJldHVybiByZWN1cnNpb25fbGltaXQ7CisgICAgcmV0dXJuIHJlY3Vyc2lvbl9saW1pdDsKIH0KIAogdm9pZAogUHlfU2V0UmVjdXJzaW9uTGltaXQoaW50IG5ld19saW1pdCkKIHsKLQlyZWN1cnNpb25fbGltaXQgPSBuZXdfbGltaXQ7Ci0JX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQgPSByZWN1cnNpb25fbGltaXQ7CisgICAgcmVjdXJzaW9uX2xpbWl0ID0gbmV3X2xpbWl0OworICAgIF9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0ID0gcmVjdXJzaW9uX2xpbWl0OwogfQogCiAvKiB0aGUgbWFjcm8gUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCkgb25seSBjYWxscyBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsKCkKQEAgLTYxNCwzNSArNjE0LDM1IEBACiBpbnQKIF9QeV9DaGVja1JlY3Vyc2l2ZUNhbGwoY2hhciAqd2hlcmUpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwogCiAjaWZkZWYgVVNFX1NUQUNLQ0hFQ0sKLQlpZiAoUHlPU19DaGVja1N0YWNrKCkpIHsKLQkJLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAiU3RhY2sgb3ZlcmZsb3ciKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoUHlPU19DaGVja1N0YWNrKCkpIHsKKyAgICAgICAgLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAiU3RhY2sgb3ZlcmZsb3ciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICNlbmRpZgotCWlmICh0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aCA+IHJlY3Vyc2lvbl9saW1pdCkgewotCQktLXRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgICAibWF4aW11bSByZWN1cnNpb24gZGVwdGggZXhjZWVkZWQlcyIsCi0JCQkgICAgIHdoZXJlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdCA9IHJlY3Vyc2lvbl9saW1pdDsKLQlyZXR1cm4gMDsKKyAgICBpZiAodHN0YXRlLT5yZWN1cnNpb25fZGVwdGggPiByZWN1cnNpb25fbGltaXQpIHsKKyAgICAgICAgLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCBleGNlZWRlZCVzIiwKKyAgICAgICAgICAgICAgICAgICAgIHdoZXJlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdCA9IHJlY3Vyc2lvbl9saW1pdDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogU3RhdHVzIGNvZGUgZm9yIG1haW4gbG9vcCAocmVhc29uIGZvciBzdGFjayB1bndpbmQpICovCiBlbnVtIHdoeV9jb2RlIHsKLQkJV0hZX05PVCA9CTB4MDAwMSwJLyogTm8gZXJyb3IgKi8KLQkJV0hZX0VYQ0VQVElPTiA9IDB4MDAwMiwJLyogRXhjZXB0aW9uIG9jY3VycmVkICovCi0JCVdIWV9SRVJBSVNFID0JMHgwMDA0LAkvKiBFeGNlcHRpb24gcmUtcmFpc2VkIGJ5ICdmaW5hbGx5JyAqLwotCQlXSFlfUkVUVVJOID0JMHgwMDA4LAkvKiAncmV0dXJuJyBzdGF0ZW1lbnQgKi8KLQkJV0hZX0JSRUFLID0JMHgwMDEwLAkvKiAnYnJlYWsnIHN0YXRlbWVudCAqLwotCQlXSFlfQ09OVElOVUUgPQkweDAwMjAsCS8qICdjb250aW51ZScgc3RhdGVtZW50ICovCi0JCVdIWV9ZSUVMRCA9CTB4MDA0MAkvKiAneWllbGQnIG9wZXJhdG9yICovCisgICAgICAgICAgICAgICAgV0hZX05PVCA9ICAgICAgIDB4MDAwMSwgLyogTm8gZXJyb3IgKi8KKyAgICAgICAgV0hZX0VYQ0VQVElPTiA9IDB4MDAwMiwgICAgICAgICAvKiBFeGNlcHRpb24gb2NjdXJyZWQgKi8KKyAgICAgICAgV0hZX1JFUkFJU0UgPSAgICAgICAgICAgMHgwMDA0LCAvKiBFeGNlcHRpb24gcmUtcmFpc2VkIGJ5ICdmaW5hbGx5JyAqLworICAgICAgICBXSFlfUkVUVVJOID0gICAgICAgICAgICAweDAwMDgsIC8qICdyZXR1cm4nIHN0YXRlbWVudCAqLworICAgICAgICBXSFlfQlJFQUsgPSAgICAgICAgICAgICAweDAwMTAsIC8qICdicmVhaycgc3RhdGVtZW50ICovCisgICAgICAgIFdIWV9DT05USU5VRSA9ICAgICAgICAgIDB4MDAyMCwgLyogJ2NvbnRpbnVlJyBzdGF0ZW1lbnQgKi8KKyAgICAgICAgV0hZX1lJRUxEID0gICAgICAgICAgICAgMHgwMDQwICAvKiAneWllbGQnIG9wZXJhdG9yICovCiB9OwogCiBzdGF0aWMgZW51bSB3aHlfY29kZSBkb19yYWlzZShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKQEAgLTY2MywxMiArNjYzLDEyIEBACiBQeU9iamVjdCAqCiBQeUV2YWxfRXZhbENvZGUoUHlDb2RlT2JqZWN0ICpjbywgUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMpCiB7Ci0JcmV0dXJuIFB5RXZhbF9FdmFsQ29kZUV4KGNvLAotCQkJICBnbG9iYWxzLCBsb2NhbHMsCi0JCQkgIChQeU9iamVjdCAqKilOVUxMLCAwLAotCQkJICAoUHlPYmplY3QgKiopTlVMTCwgMCwKLQkJCSAgKFB5T2JqZWN0ICoqKU5VTEwsIDAsCi0JCQkgIE5VTEwpOworICAgIHJldHVybiBQeUV2YWxfRXZhbENvZGVFeChjbywKKyAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzLCBsb2NhbHMsCisgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICoqKU5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICoqKU5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICoqKU5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiB9CiAKIApAQCAtNjc2LDUwICs2NzYsNTAgQEAKIAogUHlPYmplY3QgKgogUHlFdmFsX0V2YWxGcmFtZShQeUZyYW1lT2JqZWN0ICpmKSB7Ci0JLyogVGhpcyBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4dGVuc2lvbiBtb2R1bGVzIHRoYXQKLSAgICAgICAgICAgdXNlZCB0aGlzIEFQSTsgY29yZSBpbnRlcnByZXRlciBjb2RlIHNob3VsZCBjYWxsCi0gICAgICAgICAgIFB5RXZhbF9FdmFsRnJhbWVFeCgpICovCi0JcmV0dXJuIFB5RXZhbF9FdmFsRnJhbWVFeChmLCAwKTsKKyAgICAvKiBUaGlzIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXh0ZW5zaW9uIG1vZHVsZXMgdGhhdAorICAgICAgIHVzZWQgdGhpcyBBUEk7IGNvcmUgaW50ZXJwcmV0ZXIgY29kZSBzaG91bGQgY2FsbAorICAgICAgIFB5RXZhbF9FdmFsRnJhbWVFeCgpICovCisgICAgcmV0dXJuIFB5RXZhbF9FdmFsRnJhbWVFeChmLCAwKTsKIH0KIAogUHlPYmplY3QgKgogUHlFdmFsX0V2YWxGcmFtZUV4KFB5RnJhbWVPYmplY3QgKmYsIGludCB0aHJvd2ZsYWcpCiB7CiAjaWZkZWYgRFhQQUlSUwotCWludCBsYXN0b3Bjb2RlID0gMDsKKyAgICBpbnQgbGFzdG9wY29kZSA9IDA7CiAjZW5kaWYKLQlyZWdpc3RlciBQeU9iamVjdCAqKnN0YWNrX3BvaW50ZXI7ICAvKiBOZXh0IGZyZWUgc2xvdCBpbiB2YWx1ZSBzdGFjayAqLwotCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm5leHRfaW5zdHI7Ci0JcmVnaXN0ZXIgaW50IG9wY29kZTsJLyogQ3VycmVudCBvcGNvZGUgKi8KLQlyZWdpc3RlciBpbnQgb3Bhcmc7CS8qIEN1cnJlbnQgb3Bjb2RlIGFyZ3VtZW50LCBpZiBhbnkgKi8KLQlyZWdpc3RlciBlbnVtIHdoeV9jb2RlIHdoeTsgLyogUmVhc29uIGZvciBibG9jayBzdGFjayB1bndpbmQgKi8KLQlyZWdpc3RlciBpbnQgZXJyOwkvKiBFcnJvciBzdGF0dXMgLS0gbm9uemVybyBpZiBlcnJvciAqLwotCXJlZ2lzdGVyIFB5T2JqZWN0ICp4OwkvKiBSZXN1bHQgb2JqZWN0IC0tIE5VTEwgaWYgZXJyb3IgKi8KLQlyZWdpc3RlciBQeU9iamVjdCAqdjsJLyogVGVtcG9yYXJ5IG9iamVjdHMgcG9wcGVkIG9mZiBzdGFjayAqLwotCXJlZ2lzdGVyIFB5T2JqZWN0ICp3OwotCXJlZ2lzdGVyIFB5T2JqZWN0ICp1OwotCXJlZ2lzdGVyIFB5T2JqZWN0ICp0OwotCXJlZ2lzdGVyIFB5T2JqZWN0ICpzdHJlYW0gPSBOVUxMOyAgICAvKiBmb3IgUFJJTlQgb3Bjb2RlcyAqLwotCXJlZ2lzdGVyIFB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipmcmVldmFyczsKLQlQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsJLyogUmV0dXJuIHZhbHVlICovCi0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeUNvZGVPYmplY3QgKmNvOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICoqc3RhY2tfcG9pbnRlcjsgIC8qIE5leHQgZnJlZSBzbG90IGluIHZhbHVlIHN0YWNrICovCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqbmV4dF9pbnN0cjsKKyAgICByZWdpc3RlciBpbnQgb3Bjb2RlOyAgICAgICAgLyogQ3VycmVudCBvcGNvZGUgKi8KKyAgICByZWdpc3RlciBpbnQgb3Bhcmc7ICAgICAgICAgLyogQ3VycmVudCBvcGNvZGUgYXJndW1lbnQsIGlmIGFueSAqLworICAgIHJlZ2lzdGVyIGVudW0gd2h5X2NvZGUgd2h5OyAvKiBSZWFzb24gZm9yIGJsb2NrIHN0YWNrIHVud2luZCAqLworICAgIHJlZ2lzdGVyIGludCBlcnI7ICAgICAgICAgICAvKiBFcnJvciBzdGF0dXMgLS0gbm9uemVybyBpZiBlcnJvciAqLworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp4OyAgICAgICAvKiBSZXN1bHQgb2JqZWN0IC0tIE5VTEwgaWYgZXJyb3IgKi8KKyAgICByZWdpc3RlciBQeU9iamVjdCAqdjsgICAgICAgLyogVGVtcG9yYXJ5IG9iamVjdHMgcG9wcGVkIG9mZiBzdGFjayAqLworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp3OworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp1OworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp0OworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpzdHJlYW0gPSBOVUxMOyAgICAvKiBmb3IgUFJJTlQgb3Bjb2RlcyAqLworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipmcmVldmFyczsKKyAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsgICAgICAgICAgICAvKiBSZXR1cm4gdmFsdWUgKi8KKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5Q29kZU9iamVjdCAqY287CiAKLQkvKiB3aGVuIHRyYWNpbmcgd2Ugc2V0IHRoaW5ncyB1cCBzbyB0aGF0CisgICAgLyogd2hlbiB0cmFjaW5nIHdlIHNldCB0aGluZ3MgdXAgc28gdGhhdAogCi0gICAgICAgICAgICAgICBub3QgKGluc3RyX2xiIDw9IGN1cnJlbnRfYnl0ZWNvZGVfb2Zmc2V0IDwgaW5zdHJfdWIpCisgICAgICAgICAgIG5vdCAoaW5zdHJfbGIgPD0gY3VycmVudF9ieXRlY29kZV9vZmZzZXQgPCBpbnN0cl91YikKIAotCSAgIGlzIHRydWUgd2hlbiB0aGUgbGluZSBiZWluZyBleGVjdXRlZCBoYXMgY2hhbmdlZC4gIFRoZQotICAgICAgICAgICBpbml0aWFsIHZhbHVlcyBhcmUgc3VjaCBhcyB0byBtYWtlIHRoaXMgZmFsc2UgdGhlIGZpcnN0Ci0gICAgICAgICAgIHRpbWUgaXQgaXMgdGVzdGVkLiAqLwotCWludCBpbnN0cl91YiA9IC0xLCBpbnN0cl9sYiA9IDAsIGluc3RyX3ByZXYgPSAtMTsKKyAgICAgICBpcyB0cnVlIHdoZW4gdGhlIGxpbmUgYmVpbmcgZXhlY3V0ZWQgaGFzIGNoYW5nZWQuICBUaGUKKyAgICAgICBpbml0aWFsIHZhbHVlcyBhcmUgc3VjaCBhcyB0byBtYWtlIHRoaXMgZmFsc2UgdGhlIGZpcnN0CisgICAgICAgdGltZSBpdCBpcyB0ZXN0ZWQuICovCisgICAgaW50IGluc3RyX3ViID0gLTEsIGluc3RyX2xiID0gMCwgaW5zdHJfcHJldiA9IC0xOwogCi0JdW5zaWduZWQgY2hhciAqZmlyc3RfaW5zdHI7Ci0JUHlPYmplY3QgKm5hbWVzOwotCVB5T2JqZWN0ICpjb25zdHM7CisgICAgdW5zaWduZWQgY2hhciAqZmlyc3RfaW5zdHI7CisgICAgUHlPYmplY3QgKm5hbWVzOworICAgIFB5T2JqZWN0ICpjb25zdHM7CiAjaWYgZGVmaW5lZChQeV9ERUJVRykgfHwgZGVmaW5lZChMTFRSQUNFKQotCS8qIE1ha2UgaXQgZWFzaWVyIHRvIGZpbmQgb3V0IHdoZXJlIHdlIGFyZSB3aXRoIGEgZGVidWdnZXIgKi8KLQljaGFyICpmaWxlbmFtZTsKKyAgICAvKiBNYWtlIGl0IGVhc2llciB0byBmaW5kIG91dCB3aGVyZSB3ZSBhcmUgd2l0aCBhIGRlYnVnZ2VyICovCisgICAgY2hhciAqZmlsZW5hbWU7CiAjZW5kaWYKIAogLyogVHVwbGUgYWNjZXNzIG1hY3JvcyAqLwpAQCAtNzU5LDEwMCArNzU5LDEwMCBAQAogICAgQ0FMTF9GVU5DVElPTiAoYW5kIGZyaWVuZHMpCiAKICAqLwotCXVpbnQ2NCBpbnN0MCwgaW5zdDEsIGxvb3AwLCBsb29wMSwgaW50cjAgPSAwLCBpbnRyMSA9IDA7Ci0JaW50IHRpY2tlZCA9IDA7CisgICAgdWludDY0IGluc3QwLCBpbnN0MSwgbG9vcDAsIGxvb3AxLCBpbnRyMCA9IDAsIGludHIxID0gMDsKKyAgICBpbnQgdGlja2VkID0gMDsKIAotCVJFQURfVElNRVNUQU1QKGluc3QwKTsKLQlSRUFEX1RJTUVTVEFNUChpbnN0MSk7Ci0JUkVBRF9USU1FU1RBTVAobG9vcDApOwotCVJFQURfVElNRVNUQU1QKGxvb3AxKTsKKyAgICBSRUFEX1RJTUVTVEFNUChpbnN0MCk7CisgICAgUkVBRF9USU1FU1RBTVAoaW5zdDEpOworICAgIFJFQURfVElNRVNUQU1QKGxvb3AwKTsKKyAgICBSRUFEX1RJTUVTVEFNUChsb29wMSk7CiAKLQkvKiBzaHV0IHVwIHRoZSBjb21waWxlciAqLwotCW9wY29kZSA9IDA7CisgICAgLyogc2h1dCB1cCB0aGUgY29tcGlsZXIgKi8KKyAgICBvcGNvZGUgPSAwOwogI2VuZGlmCiAKIC8qIENvZGUgYWNjZXNzIG1hY3JvcyAqLwogCi0jZGVmaW5lIElOU1RSX09GRlNFVCgpCSgoaW50KShuZXh0X2luc3RyIC0gZmlyc3RfaW5zdHIpKQotI2RlZmluZSBORVhUT1AoKQkoKm5leHRfaW5zdHIrKykKLSNkZWZpbmUgTkVYVEFSRygpCShuZXh0X2luc3RyICs9IDIsIChuZXh0X2luc3RyWy0xXTw8OCkgKyBuZXh0X2luc3RyWy0yXSkKLSNkZWZpbmUgUEVFS0FSRygpCSgobmV4dF9pbnN0clsyXTw8OCkgKyBuZXh0X2luc3RyWzFdKQotI2RlZmluZSBKVU1QVE8oeCkJKG5leHRfaW5zdHIgPSBmaXJzdF9pbnN0ciArICh4KSkKLSNkZWZpbmUgSlVNUEJZKHgpCShuZXh0X2luc3RyICs9ICh4KSkKKyNkZWZpbmUgSU5TVFJfT0ZGU0VUKCkgICgoaW50KShuZXh0X2luc3RyIC0gZmlyc3RfaW5zdHIpKQorI2RlZmluZSBORVhUT1AoKSAgICAgICAgKCpuZXh0X2luc3RyKyspCisjZGVmaW5lIE5FWFRBUkcoKSAgICAgICAobmV4dF9pbnN0ciArPSAyLCAobmV4dF9pbnN0clstMV08PDgpICsgbmV4dF9pbnN0clstMl0pCisjZGVmaW5lIFBFRUtBUkcoKSAgICAgICAoKG5leHRfaW5zdHJbMl08PDgpICsgbmV4dF9pbnN0clsxXSkKKyNkZWZpbmUgSlVNUFRPKHgpICAgICAgIChuZXh0X2luc3RyID0gZmlyc3RfaW5zdHIgKyAoeCkpCisjZGVmaW5lIEpVTVBCWSh4KSAgICAgICAobmV4dF9pbnN0ciArPSAoeCkpCiAKIC8qIE9wQ29kZSBwcmVkaWN0aW9uIG1hY3JvcwotCVNvbWUgb3Bjb2RlcyB0ZW5kIHRvIGNvbWUgaW4gcGFpcnMgdGh1cyBtYWtpbmcgaXQgcG9zc2libGUgdG8KLQlwcmVkaWN0IHRoZSBzZWNvbmQgY29kZSB3aGVuIHRoZSBmaXJzdCBpcyBydW4uICBGb3IgZXhhbXBsZSwKLQlHRVRfSVRFUiBpcyBvZnRlbiBmb2xsb3dlZCBieSBGT1JfSVRFUi4gQW5kIEZPUl9JVEVSIGlzIG9mdGVuCi0JZm9sbG93ZWQgYnkgU1RPUkVfRkFTVCBvciBVTlBBQ0tfU0VRVUVOQ0UuCisgICAgU29tZSBvcGNvZGVzIHRlbmQgdG8gY29tZSBpbiBwYWlycyB0aHVzIG1ha2luZyBpdCBwb3NzaWJsZSB0bworICAgIHByZWRpY3QgdGhlIHNlY29uZCBjb2RlIHdoZW4gdGhlIGZpcnN0IGlzIHJ1bi4gIEZvciBleGFtcGxlLAorICAgIEdFVF9JVEVSIGlzIG9mdGVuIGZvbGxvd2VkIGJ5IEZPUl9JVEVSLiBBbmQgRk9SX0lURVIgaXMgb2Z0ZW4KKyAgICBmb2xsb3dlZCBieSBTVE9SRV9GQVNUIG9yIFVOUEFDS19TRVFVRU5DRS4KIAotCVZlcmlmeWluZyB0aGUgcHJlZGljdGlvbiBjb3N0cyBhIHNpbmdsZSBoaWdoLXNwZWVkIHRlc3Qgb2YgYSByZWdpc3RlcgotCXZhcmlhYmxlIGFnYWluc3QgYSBjb25zdGFudC4gIElmIHRoZSBwYWlyaW5nIHdhcyBnb29kLCB0aGVuIHRoZQotCXByb2Nlc3NvcidzIG93biBpbnRlcm5hbCBicmFuY2ggcHJlZGljYXRpb24gaGFzIGEgaGlnaCBsaWtlbGlob29kIG9mCi0Jc3VjY2VzcywgcmVzdWx0aW5nIGluIGEgbmVhcmx5IHplcm8tb3ZlcmhlYWQgdHJhbnNpdGlvbiB0byB0aGUKLQluZXh0IG9wY29kZS4gIEEgc3VjY2Vzc2Z1bCBwcmVkaWN0aW9uIHNhdmVzIGEgdHJpcCB0aHJvdWdoIHRoZSBldmFsLWxvb3AKLQlpbmNsdWRpbmcgaXRzIHR3byB1bnByZWRpY3RhYmxlIGJyYW5jaGVzLCB0aGUgSEFTX0FSRyB0ZXN0IGFuZCB0aGUKLQlzd2l0Y2gtY2FzZS4gIENvbWJpbmVkIHdpdGggdGhlIHByb2Nlc3NvcidzIGludGVybmFsIGJyYW5jaCBwcmVkaWN0aW9uLAotCWEgc3VjY2Vzc2Z1bCBQUkVESUNUIGhhcyB0aGUgZWZmZWN0IG9mIG1ha2luZyB0aGUgdHdvIG9wY29kZXMgcnVuIGFzIGlmCi0JdGhleSB3ZXJlIGEgc2luZ2xlIG5ldyBvcGNvZGUgd2l0aCB0aGUgYm9kaWVzIGNvbWJpbmVkLgorICAgIFZlcmlmeWluZyB0aGUgcHJlZGljdGlvbiBjb3N0cyBhIHNpbmdsZSBoaWdoLXNwZWVkIHRlc3Qgb2YgYSByZWdpc3RlcgorICAgIHZhcmlhYmxlIGFnYWluc3QgYSBjb25zdGFudC4gIElmIHRoZSBwYWlyaW5nIHdhcyBnb29kLCB0aGVuIHRoZQorICAgIHByb2Nlc3NvcidzIG93biBpbnRlcm5hbCBicmFuY2ggcHJlZGljYXRpb24gaGFzIGEgaGlnaCBsaWtlbGlob29kIG9mCisgICAgc3VjY2VzcywgcmVzdWx0aW5nIGluIGEgbmVhcmx5IHplcm8tb3ZlcmhlYWQgdHJhbnNpdGlvbiB0byB0aGUKKyAgICBuZXh0IG9wY29kZS4gIEEgc3VjY2Vzc2Z1bCBwcmVkaWN0aW9uIHNhdmVzIGEgdHJpcCB0aHJvdWdoIHRoZSBldmFsLWxvb3AKKyAgICBpbmNsdWRpbmcgaXRzIHR3byB1bnByZWRpY3RhYmxlIGJyYW5jaGVzLCB0aGUgSEFTX0FSRyB0ZXN0IGFuZCB0aGUKKyAgICBzd2l0Y2gtY2FzZS4gIENvbWJpbmVkIHdpdGggdGhlIHByb2Nlc3NvcidzIGludGVybmFsIGJyYW5jaCBwcmVkaWN0aW9uLAorICAgIGEgc3VjY2Vzc2Z1bCBQUkVESUNUIGhhcyB0aGUgZWZmZWN0IG9mIG1ha2luZyB0aGUgdHdvIG9wY29kZXMgcnVuIGFzIGlmCisgICAgdGhleSB3ZXJlIGEgc2luZ2xlIG5ldyBvcGNvZGUgd2l0aCB0aGUgYm9kaWVzIGNvbWJpbmVkLgogCiAgICAgSWYgY29sbGVjdGluZyBvcGNvZGUgc3RhdGlzdGljcywgeW91ciBjaG9pY2VzIGFyZSB0byBlaXRoZXIga2VlcCB0aGUKLQlwcmVkaWN0aW9ucyB0dXJuZWQtb24gYW5kIGludGVycHJldCB0aGUgcmVzdWx0cyBhcyBpZiBzb21lIG9wY29kZXMKLQloYWQgYmVlbiBjb21iaW5lZCBvciB0dXJuLW9mZiBwcmVkaWN0aW9ucyBzbyB0aGF0IHRoZSBvcGNvZGUgZnJlcXVlbmN5Ci0JY291bnRlciB1cGRhdGVzIGZvciBib3RoIG9wY29kZXMuCisgICAgcHJlZGljdGlvbnMgdHVybmVkLW9uIGFuZCBpbnRlcnByZXQgdGhlIHJlc3VsdHMgYXMgaWYgc29tZSBvcGNvZGVzCisgICAgaGFkIGJlZW4gY29tYmluZWQgb3IgdHVybi1vZmYgcHJlZGljdGlvbnMgc28gdGhhdCB0aGUgb3Bjb2RlIGZyZXF1ZW5jeQorICAgIGNvdW50ZXIgdXBkYXRlcyBmb3IgYm90aCBvcGNvZGVzLgogKi8KIAogI2lmZGVmIERZTkFNSUNfRVhFQ1VUSU9OX1BST0ZJTEUKLSNkZWZpbmUgUFJFRElDVChvcCkJCWlmICgwKSBnb3RvIFBSRURfIyNvcAorI2RlZmluZSBQUkVESUNUKG9wKSAgICAgICAgICAgICBpZiAoMCkgZ290byBQUkVEXyMjb3AKICNlbHNlCi0jZGVmaW5lIFBSRURJQ1Qob3ApCQlpZiAoKm5leHRfaW5zdHIgPT0gb3ApIGdvdG8gUFJFRF8jI29wCisjZGVmaW5lIFBSRURJQ1Qob3ApICAgICAgICAgICAgIGlmICgqbmV4dF9pbnN0ciA9PSBvcCkgZ290byBQUkVEXyMjb3AKICNlbmRpZgogCi0jZGVmaW5lIFBSRURJQ1RFRChvcCkJCVBSRURfIyNvcDogbmV4dF9pbnN0cisrCi0jZGVmaW5lIFBSRURJQ1RFRF9XSVRIX0FSRyhvcCkJUFJFRF8jI29wOiBvcGFyZyA9IFBFRUtBUkcoKTsgbmV4dF9pbnN0ciArPSAzCisjZGVmaW5lIFBSRURJQ1RFRChvcCkgICAgICAgICAgIFBSRURfIyNvcDogbmV4dF9pbnN0cisrCisjZGVmaW5lIFBSRURJQ1RFRF9XSVRIX0FSRyhvcCkgIFBSRURfIyNvcDogb3BhcmcgPSBQRUVLQVJHKCk7IG5leHRfaW5zdHIgKz0gMwogCiAvKiBTdGFjayBtYW5pcHVsYXRpb24gbWFjcm9zICovCiAKIC8qIFRoZSBzdGFjayBjYW4gZ3JvdyBhdCBtb3N0IE1BWElOVCBkZWVwLCBhcyBjb19ubG9jYWxzIGFuZAogICAgY29fc3RhY2tzaXplIGFyZSBpbnRzLiAqLwotI2RlZmluZSBTVEFDS19MRVZFTCgpCSgoaW50KShzdGFja19wb2ludGVyIC0gZi0+Zl92YWx1ZXN0YWNrKSkKLSNkZWZpbmUgRU1QVFkoKQkJKFNUQUNLX0xFVkVMKCkgPT0gMCkKLSNkZWZpbmUgVE9QKCkJCShzdGFja19wb2ludGVyWy0xXSkKLSNkZWZpbmUgU0VDT05EKCkJKHN0YWNrX3BvaW50ZXJbLTJdKQotI2RlZmluZSBUSElSRCgpIAkoc3RhY2tfcG9pbnRlclstM10pCi0jZGVmaW5lIEZPVVJUSCgpCShzdGFja19wb2ludGVyWy00XSkKKyNkZWZpbmUgU1RBQ0tfTEVWRUwoKSAgICgoaW50KShzdGFja19wb2ludGVyIC0gZi0+Zl92YWx1ZXN0YWNrKSkKKyNkZWZpbmUgRU1QVFkoKSAgICAgICAgIChTVEFDS19MRVZFTCgpID09IDApCisjZGVmaW5lIFRPUCgpICAgICAgICAgICAoc3RhY2tfcG9pbnRlclstMV0pCisjZGVmaW5lIFNFQ09ORCgpICAgICAgICAoc3RhY2tfcG9pbnRlclstMl0pCisjZGVmaW5lIFRISVJEKCkgICAgICAgICAoc3RhY2tfcG9pbnRlclstM10pCisjZGVmaW5lIEZPVVJUSCgpICAgICAgICAoc3RhY2tfcG9pbnRlclstNF0pCiAjZGVmaW5lIFBFRUsobikgICAgICAgICAoc3RhY2tfcG9pbnRlclstKG4pXSkKLSNkZWZpbmUgU0VUX1RPUCh2KQkoc3RhY2tfcG9pbnRlclstMV0gPSAodikpCi0jZGVmaW5lIFNFVF9TRUNPTkQodikJKHN0YWNrX3BvaW50ZXJbLTJdID0gKHYpKQotI2RlZmluZSBTRVRfVEhJUkQodikJKHN0YWNrX3BvaW50ZXJbLTNdID0gKHYpKQotI2RlZmluZSBTRVRfRk9VUlRIKHYpCShzdGFja19wb2ludGVyWy00XSA9ICh2KSkKKyNkZWZpbmUgU0VUX1RPUCh2KSAgICAgIChzdGFja19wb2ludGVyWy0xXSA9ICh2KSkKKyNkZWZpbmUgU0VUX1NFQ09ORCh2KSAgIChzdGFja19wb2ludGVyWy0yXSA9ICh2KSkKKyNkZWZpbmUgU0VUX1RISVJEKHYpICAgIChzdGFja19wb2ludGVyWy0zXSA9ICh2KSkKKyNkZWZpbmUgU0VUX0ZPVVJUSCh2KSAgIChzdGFja19wb2ludGVyWy00XSA9ICh2KSkKICNkZWZpbmUgU0VUX1ZBTFVFKG4sIHYpIChzdGFja19wb2ludGVyWy0obildID0gKHYpKQotI2RlZmluZSBCQVNJQ19TVEFDS0FESihuKQkoc3RhY2tfcG9pbnRlciArPSBuKQotI2RlZmluZSBCQVNJQ19QVVNIKHYpCSgqc3RhY2tfcG9pbnRlcisrID0gKHYpKQotI2RlZmluZSBCQVNJQ19QT1AoKQkoKi0tc3RhY2tfcG9pbnRlcikKKyNkZWZpbmUgQkFTSUNfU1RBQ0tBREoobikgICAgICAgKHN0YWNrX3BvaW50ZXIgKz0gbikKKyNkZWZpbmUgQkFTSUNfUFVTSCh2KSAgICgqc3RhY2tfcG9pbnRlcisrID0gKHYpKQorI2RlZmluZSBCQVNJQ19QT1AoKSAgICAgKCotLXN0YWNrX3BvaW50ZXIpCiAKICNpZmRlZiBMTFRSQUNFCi0jZGVmaW5lIFBVU0godikJCXsgKHZvaWQpKEJBU0lDX1BVU0godiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHRyYWNlICYmIHBydHJhY2UoVE9QKCksICJwdXNoIikpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFNUQUNLX0xFVkVMKCkgPD0gY28tPmNvX3N0YWNrc2l6ZSk7IH0KLSNkZWZpbmUgUE9QKCkJCSgodm9pZCkobGx0cmFjZSAmJiBwcnRyYWNlKFRPUCgpLCAicG9wIikpLCBcCi0JCQkgQkFTSUNfUE9QKCkpCi0jZGVmaW5lIFNUQUNLQURKKG4pCXsgKHZvaWQpKEJBU0lDX1NUQUNLQURKKG4pLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx0cmFjZSAmJiBwcnRyYWNlKFRPUCgpLCAic3RhY2thZGoiKSk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoU1RBQ0tfTEVWRUwoKSA8PSBjby0+Y29fc3RhY2tzaXplKTsgfQorI2RlZmluZSBQVVNIKHYpICAgICAgICAgeyAodm9pZCkoQkFTSUNfUFVTSCh2KSwgXAorICAgICAgICAgICAgICAgICAgIGxsdHJhY2UgJiYgcHJ0cmFjZShUT1AoKSwgInB1c2giKSk7IFwKKyAgICAgICAgICAgICAgICAgICBhc3NlcnQoU1RBQ0tfTEVWRUwoKSA8PSBjby0+Y29fc3RhY2tzaXplKTsgfQorI2RlZmluZSBQT1AoKSAgICAgICAgICAgKCh2b2lkKShsbHRyYWNlICYmIHBydHJhY2UoVE9QKCksICJwb3AiKSksIFwKKyAgICAgICAgICAgICBCQVNJQ19QT1AoKSkKKyNkZWZpbmUgU1RBQ0tBREoobikgICAgIHsgKHZvaWQpKEJBU0lDX1NUQUNLQURKKG4pLCBcCisgICAgICAgICAgICAgICAgICAgbGx0cmFjZSAmJiBwcnRyYWNlKFRPUCgpLCAic3RhY2thZGoiKSk7IFwKKyAgICAgICAgICAgICAgICAgICBhc3NlcnQoU1RBQ0tfTEVWRUwoKSA8PSBjby0+Y29fc3RhY2tzaXplKTsgfQogI2RlZmluZSBFWFRfUE9QKFNUQUNLX1BPSU5URVIpICgodm9pZCkobGx0cmFjZSAmJiBcCi0JCQkJcHJ0cmFjZSgoU1RBQ0tfUE9JTlRFUilbLTFdLCAiZXh0X3BvcCIpKSwgXAotCQkJCSotLShTVEFDS19QT0lOVEVSKSkKKyAgICAgICAgICAgICAgICBwcnRyYWNlKChTVEFDS19QT0lOVEVSKVstMV0sICJleHRfcG9wIikpLCBcCisgICAgICAgICAgICAgICAgKi0tKFNUQUNLX1BPSU5URVIpKQogI2Vsc2UKLSNkZWZpbmUgUFVTSCh2KQkJQkFTSUNfUFVTSCh2KQotI2RlZmluZSBQT1AoKQkJQkFTSUNfUE9QKCkKLSNkZWZpbmUgU1RBQ0tBREoobikJQkFTSUNfU1RBQ0tBREoobikKKyNkZWZpbmUgUFVTSCh2KSAgICAgICAgIEJBU0lDX1BVU0godikKKyNkZWZpbmUgUE9QKCkgICAgICAgICAgIEJBU0lDX1BPUCgpCisjZGVmaW5lIFNUQUNLQURKKG4pICAgICBCQVNJQ19TVEFDS0FESihuKQogI2RlZmluZSBFWFRfUE9QKFNUQUNLX1BPSU5URVIpICgqLS0oU1RBQ0tfUE9JTlRFUikpCiAjZW5kaWYKIAogLyogTG9jYWwgdmFyaWFibGUgbWFjcm9zICovCiAKLSNkZWZpbmUgR0VUTE9DQUwoaSkJKGZhc3Rsb2NhbHNbaV0pCisjZGVmaW5lIEdFVExPQ0FMKGkpICAgICAoZmFzdGxvY2Fsc1tpXSkKIAogLyogVGhlIFNFVExPQ0FMKCkgbWFjcm8gbXVzdCBub3QgREVDUkVGIHRoZSBsb2NhbCB2YXJpYWJsZSBpbi1wbGFjZSBhbmQKICAgIHRoZW4gc3RvcmUgdGhlIG5ldyB2YWx1ZTsgaXQgbXVzdCBjb3B5IHRoZSBvbGQgdmFsdWUgdG8gYSB0ZW1wb3JhcnkKQEAgLTg2MCwyMTUwICs4NjAsMjE1MCBAQAogICAgVGhpcyBpcyBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgZHVyaW5nIHRoZSBERUNSRUYgdGhlIGZyYW1lIGlzCiAgICBhY2Nlc3NlZCBieSBvdGhlciBjb2RlIChlLmcuIGEgX19kZWxfXyBtZXRob2Qgb3IgZ2MuY29sbGVjdCgpKSBhbmQgdGhlCiAgICB2YXJpYWJsZSB3b3VsZCBiZSBwb2ludGluZyB0byBhbHJlYWR5LWZyZWVkIG1lbW9yeS4gKi8KLSNkZWZpbmUgU0VUTE9DQUwoaSwgdmFsdWUpCWRvIHsgUHlPYmplY3QgKnRtcCA9IEdFVExPQ0FMKGkpOyBcCi0JCQkJICAgICBHRVRMT0NBTChpKSA9IHZhbHVlOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0bXApOyB9IHdoaWxlICgwKQorI2RlZmluZSBTRVRMT0NBTChpLCB2YWx1ZSkgICAgICBkbyB7IFB5T2JqZWN0ICp0bXAgPSBHRVRMT0NBTChpKTsgXAorICAgICAgICAgICAgICAgICAgICAgR0VUTE9DQUwoaSkgPSB2YWx1ZTsgXAorICAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0bXApOyB9IHdoaWxlICgwKQogCiAvKiBTdGFydCBvZiBjb2RlICovCiAKLQlpZiAoZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIHB1c2ggZnJhbWUgKi8KLQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogcHVzaCBmcmFtZSAqLworICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXRzdGF0ZS0+ZnJhbWUgPSBmOworICAgIHRzdGF0ZS0+ZnJhbWUgPSBmOwogCi0JaWYgKHRzdGF0ZS0+dXNlX3RyYWNpbmcpIHsKLQkJaWYgKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCkgewotCQkJLyogdHN0YXRlLT5jX3RyYWNlZnVuYywgaWYgZGVmaW5lZCwgaXMgYQotCQkJICAgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiAqZXZlcnkqIGVudHJ5Ci0JCQkgICB0byBhIGNvZGUgYmxvY2suICBJdHMgcmV0dXJuIHZhbHVlLCBpZiBub3QKLQkJCSAgIE5vbmUsIGlzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBhdAotCQkJICAgdGhlIHN0YXJ0IG9mIGVhY2ggZXhlY3V0ZWQgbGluZSBvZiBjb2RlLgotCQkJICAgKEFjdHVhbGx5LCB0aGUgZnVuY3Rpb24gbXVzdCByZXR1cm4gaXRzZWxmCi0JCQkgICBpbiBvcmRlciB0byBjb250aW51ZSB0cmFjaW5nLikgIFRoZSB0cmFjZQotCQkJICAgZnVuY3Rpb25zIGFyZSBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6Ci0JCQkgICBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZnJhbWUsIGEgc3RyaW5nCi0JCQkgICBpbmRpY2F0aW5nIHdoeSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbmQKLQkJCSAgIGFuIGFyZ3VtZW50IHdoaWNoIGRlcGVuZHMgb24gdGhlIHNpdHVhdGlvbi4KLQkJCSAgIFRoZSBnbG9iYWwgdHJhY2UgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQKLQkJCSAgIHdoZW5ldmVyIGFuIGV4Y2VwdGlvbiBpcyBkZXRlY3RlZC4gKi8KLQkJCWlmIChjYWxsX3RyYWNlX3Byb3RlY3RlZCh0c3RhdGUtPmNfdHJhY2VmdW5jLAotCQkJCQkJIHRzdGF0ZS0+Y190cmFjZW9iaiwKLQkJCQkJCSBmLCBQeVRyYWNlX0NBTEwsIFB5X05vbmUpKSB7Ci0JCQkJLyogVHJhY2UgZnVuY3Rpb24gcmFpc2VkIGFuIGVycm9yICovCi0JCQkJZ290byBleGl0X2V2YWxfZnJhbWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSB7Ci0JCQkvKiBTaW1pbGFyIGZvciBjX3Byb2ZpbGVmdW5jLCBleGNlcHQgaXQgbmVlZG4ndAotCQkJICAgcmV0dXJuIGl0c2VsZiBhbmQgaXNuJ3QgY2FsbGVkIGZvciAibGluZSIgZXZlbnRzICovCi0JCQlpZiAoY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLAotCQkJCQkJIHRzdGF0ZS0+Y19wcm9maWxlb2JqLAotCQkJCQkJIGYsIFB5VHJhY2VfQ0FMTCwgUHlfTm9uZSkpIHsKLQkJCQkvKiBQcm9maWxlIGZ1bmN0aW9uIHJhaXNlZCBhbiBlcnJvciAqLwotCQkJCWdvdG8gZXhpdF9ldmFsX2ZyYW1lOwotCQkJfQotCQl9Ci0JfQorICAgIGlmICh0c3RhdGUtPnVzZV90cmFjaW5nKSB7CisgICAgICAgIGlmICh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIHRzdGF0ZS0+Y190cmFjZWZ1bmMsIGlmIGRlZmluZWQsIGlzIGEKKyAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gKmV2ZXJ5KiBlbnRyeQorICAgICAgICAgICAgICAgdG8gYSBjb2RlIGJsb2NrLiAgSXRzIHJldHVybiB2YWx1ZSwgaWYgbm90CisgICAgICAgICAgICAgICBOb25lLCBpcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgYXQKKyAgICAgICAgICAgICAgIHRoZSBzdGFydCBvZiBlYWNoIGV4ZWN1dGVkIGxpbmUgb2YgY29kZS4KKyAgICAgICAgICAgICAgIChBY3R1YWxseSwgdGhlIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGl0c2VsZgorICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gY29udGludWUgdHJhY2luZy4pICBUaGUgdHJhY2UKKyAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdpdGggdGhyZWUgYXJndW1lbnRzOgorICAgICAgICAgICAgICAgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGZyYW1lLCBhIHN0cmluZworICAgICAgICAgICAgICAgaW5kaWNhdGluZyB3aHkgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYW5kCisgICAgICAgICAgICAgICBhbiBhcmd1bWVudCB3aGljaCBkZXBlbmRzIG9uIHRoZSBzaXR1YXRpb24uCisgICAgICAgICAgICAgICBUaGUgZ2xvYmFsIHRyYWNlIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkCisgICAgICAgICAgICAgICB3aGVuZXZlciBhbiBleGNlcHRpb24gaXMgZGV0ZWN0ZWQuICovCisgICAgICAgICAgICBpZiAoY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3RyYWNlZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmNfdHJhY2VvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgUHlUcmFjZV9DQUxMLCBQeV9Ob25lKSkgeworICAgICAgICAgICAgICAgIC8qIFRyYWNlIGZ1bmN0aW9uIHJhaXNlZCBhbiBlcnJvciAqLworICAgICAgICAgICAgICAgIGdvdG8gZXhpdF9ldmFsX2ZyYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogU2ltaWxhciBmb3IgY19wcm9maWxlZnVuYywgZXhjZXB0IGl0IG5lZWRuJ3QKKyAgICAgICAgICAgICAgIHJldHVybiBpdHNlbGYgYW5kIGlzbid0IGNhbGxlZCBmb3IgImxpbmUiIGV2ZW50cyAqLworICAgICAgICAgICAgaWYgKGNhbGxfdHJhY2VfcHJvdGVjdGVkKHRzdGF0ZS0+Y19wcm9maWxlZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmNfcHJvZmlsZW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLCBQeVRyYWNlX0NBTEwsIFB5X05vbmUpKSB7CisgICAgICAgICAgICAgICAgLyogUHJvZmlsZSBmdW5jdGlvbiByYWlzZWQgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBnb3RvIGV4aXRfZXZhbF9mcmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWNvID0gZi0+Zl9jb2RlOwotCW5hbWVzID0gY28tPmNvX25hbWVzOwotCWNvbnN0cyA9IGNvLT5jb19jb25zdHM7Ci0JZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKLQlmcmVldmFycyA9IGYtPmZfbG9jYWxzcGx1cyArIGNvLT5jb19ubG9jYWxzOwotCWZpcnN0X2luc3RyID0gKHVuc2lnbmVkIGNoYXIqKSBQeVN0cmluZ19BU19TVFJJTkcoY28tPmNvX2NvZGUpOwotCS8qIEFuIGV4cGxhbmF0aW9uIGlzIGluIG9yZGVyIGZvciB0aGUgbmV4dCBsaW5lLgorICAgIGNvID0gZi0+Zl9jb2RlOworICAgIG5hbWVzID0gY28tPmNvX25hbWVzOworICAgIGNvbnN0cyA9IGNvLT5jb19jb25zdHM7CisgICAgZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKKyAgICBmcmVldmFycyA9IGYtPmZfbG9jYWxzcGx1cyArIGNvLT5jb19ubG9jYWxzOworICAgIGZpcnN0X2luc3RyID0gKHVuc2lnbmVkIGNoYXIqKSBQeVN0cmluZ19BU19TVFJJTkcoY28tPmNvX2NvZGUpOworICAgIC8qIEFuIGV4cGxhbmF0aW9uIGlzIGluIG9yZGVyIGZvciB0aGUgbmV4dCBsaW5lLgogCi0JICAgZi0+Zl9sYXN0aSBub3cgcmVmZXJzIHRvIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBpbnN0cnVjdGlvbgotCSAgIGV4ZWN1dGVkLiAgWW91IG1pZ2h0IHRoaW5rIHRoaXMgd2FzIG9idmlvdXMgZnJvbSB0aGUgbmFtZSwgYnV0Ci0JICAgdGhpcyB3YXNuJ3QgYWx3YXlzIHRydWUgYmVmb3JlIDIuMyEgIFB5RnJhbWVfTmV3IG5vdyBzZXRzCi0JICAgZi0+Zl9sYXN0aSB0byAtMSAoaS5lLiB0aGUgaW5kZXggKmJlZm9yZSogdGhlIGZpcnN0IGluc3RydWN0aW9uKQotCSAgIGFuZCBZSUVMRF9WQUxVRSBkb2Vzbid0IGZpZGRsZSB3aXRoIGZfbGFzdGkgYW55IG1vcmUuICBTbyB0aGlzCi0JICAgZG9lcyB3b3JrLiAgUHJvbWlzZS4KKyAgICAgICBmLT5mX2xhc3RpIG5vdyByZWZlcnMgdG8gdGhlIGluZGV4IG9mIHRoZSBsYXN0IGluc3RydWN0aW9uCisgICAgICAgZXhlY3V0ZWQuICBZb3UgbWlnaHQgdGhpbmsgdGhpcyB3YXMgb2J2aW91cyBmcm9tIHRoZSBuYW1lLCBidXQKKyAgICAgICB0aGlzIHdhc24ndCBhbHdheXMgdHJ1ZSBiZWZvcmUgMi4zISAgUHlGcmFtZV9OZXcgbm93IHNldHMKKyAgICAgICBmLT5mX2xhc3RpIHRvIC0xIChpLmUuIHRoZSBpbmRleCAqYmVmb3JlKiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24pCisgICAgICAgYW5kIFlJRUxEX1ZBTFVFIGRvZXNuJ3QgZmlkZGxlIHdpdGggZl9sYXN0aSBhbnkgbW9yZS4gIFNvIHRoaXMKKyAgICAgICBkb2VzIHdvcmsuICBQcm9taXNlLgogCi0JICAgV2hlbiB0aGUgUFJFRElDVCgpIG1hY3JvcyBhcmUgZW5hYmxlZCwgc29tZSBvcGNvZGUgcGFpcnMgZm9sbG93IGluCi0gICAgICAgICAgIGRpcmVjdCBzdWNjZXNzaW9uIHdpdGhvdXQgdXBkYXRpbmcgZi0+Zl9sYXN0aS4gIEEgc3VjY2Vzc2Z1bAotICAgICAgICAgICBwcmVkaWN0aW9uIGVmZmVjdGl2ZWx5IGxpbmtzIHRoZSB0d28gY29kZXMgdG9nZXRoZXIgYXMgaWYgdGhleQotICAgICAgICAgICB3ZXJlIGEgc2luZ2xlIG5ldyBvcGNvZGU7IGFjY29yZGluZ2x5LGYtPmZfbGFzdGkgd2lsbCBwb2ludCB0bwotICAgICAgICAgICB0aGUgZmlyc3QgY29kZSBpbiB0aGUgcGFpciAoZm9yIGluc3RhbmNlLCBHRVRfSVRFUiBmb2xsb3dlZCBieQotICAgICAgICAgICBGT1JfSVRFUiBpcyBlZmZlY3RpdmVseSBhIHNpbmdsZSBvcGNvZGUgYW5kIGYtPmZfbGFzdGkgd2lsbCBwb2ludAotICAgICAgICAgICBhdCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21iaW5lZCBwYWlyLikKLQkqLwotCW5leHRfaW5zdHIgPSBmaXJzdF9pbnN0ciArIGYtPmZfbGFzdGkgKyAxOwotCXN0YWNrX3BvaW50ZXIgPSBmLT5mX3N0YWNrdG9wOwotCWFzc2VydChzdGFja19wb2ludGVyICE9IE5VTEwpOwotCWYtPmZfc3RhY2t0b3AgPSBOVUxMOwkvKiByZW1haW5zIE5VTEwgdW5sZXNzIHlpZWxkIHN1c3BlbmRzIGZyYW1lICovCisgICAgICAgV2hlbiB0aGUgUFJFRElDVCgpIG1hY3JvcyBhcmUgZW5hYmxlZCwgc29tZSBvcGNvZGUgcGFpcnMgZm9sbG93IGluCisgICAgICAgZGlyZWN0IHN1Y2Nlc3Npb24gd2l0aG91dCB1cGRhdGluZyBmLT5mX2xhc3RpLiAgQSBzdWNjZXNzZnVsCisgICAgICAgcHJlZGljdGlvbiBlZmZlY3RpdmVseSBsaW5rcyB0aGUgdHdvIGNvZGVzIHRvZ2V0aGVyIGFzIGlmIHRoZXkKKyAgICAgICB3ZXJlIGEgc2luZ2xlIG5ldyBvcGNvZGU7IGFjY29yZGluZ2x5LGYtPmZfbGFzdGkgd2lsbCBwb2ludCB0bworICAgICAgIHRoZSBmaXJzdCBjb2RlIGluIHRoZSBwYWlyIChmb3IgaW5zdGFuY2UsIEdFVF9JVEVSIGZvbGxvd2VkIGJ5CisgICAgICAgRk9SX0lURVIgaXMgZWZmZWN0aXZlbHkgYSBzaW5nbGUgb3Bjb2RlIGFuZCBmLT5mX2xhc3RpIHdpbGwgcG9pbnQKKyAgICAgICBhdCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21iaW5lZCBwYWlyLikKKyAgICAqLworICAgIG5leHRfaW5zdHIgPSBmaXJzdF9pbnN0ciArIGYtPmZfbGFzdGkgKyAxOworICAgIHN0YWNrX3BvaW50ZXIgPSBmLT5mX3N0YWNrdG9wOworICAgIGFzc2VydChzdGFja19wb2ludGVyICE9IE5VTEwpOworICAgIGYtPmZfc3RhY2t0b3AgPSBOVUxMOyAgICAgICAvKiByZW1haW5zIE5VTEwgdW5sZXNzIHlpZWxkIHN1c3BlbmRzIGZyYW1lICovCiAKICNpZmRlZiBMTFRSQUNFCi0JbGx0cmFjZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGYtPmZfZ2xvYmFscywgIl9fbGx0cmFjZV9fIikgIT0gTlVMTDsKKyAgICBsbHRyYWNlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZi0+Zl9nbG9iYWxzLCAiX19sbHRyYWNlX18iKSAhPSBOVUxMOwogI2VuZGlmCiAjaWYgZGVmaW5lZChQeV9ERUJVRykgfHwgZGVmaW5lZChMTFRSQUNFKQotCWZpbGVuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX2ZpbGVuYW1lKTsKKyAgICBmaWxlbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19maWxlbmFtZSk7CiAjZW5kaWYKIAotCXdoeSA9IFdIWV9OT1Q7Ci0JZXJyID0gMDsKLQl4ID0gUHlfTm9uZTsJLyogTm90IGEgcmVmZXJlbmNlLCBqdXN0IGFueXRoaW5nIG5vbi1OVUxMICovCi0JdyA9IE5VTEw7CisgICAgd2h5ID0gV0hZX05PVDsKKyAgICBlcnIgPSAwOworICAgIHggPSBQeV9Ob25lOyAgICAgICAgLyogTm90IGEgcmVmZXJlbmNlLCBqdXN0IGFueXRoaW5nIG5vbi1OVUxMICovCisgICAgdyA9IE5VTEw7CiAKLQlpZiAodGhyb3dmbGFnKSB7IC8qIHN1cHBvcnQgZm9yIGdlbmVyYXRvci50aHJvdygpICovCi0JCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCWdvdG8gb25fZXJyb3I7Ci0JfQorICAgIGlmICh0aHJvd2ZsYWcpIHsgLyogc3VwcG9ydCBmb3IgZ2VuZXJhdG9yLnRocm93KCkgKi8KKyAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICB9CiAKLQlmb3IgKDs7KSB7CisgICAgZm9yICg7OykgewogI2lmZGVmIFdJVEhfVFNDCi0JCWlmIChpbnN0MSA9PSAwKSB7Ci0JCQkvKiBBbG1vc3Qgc3VyZWx5LCB0aGUgb3Bjb2RlIGV4ZWN1dGVkIGEgYnJlYWsKLQkJCSAgIG9yIGEgY29udGludWUsIHByZXZlbnRpbmcgaW5zdDEgZnJvbSBiZWluZyBzZXQKLQkJCSAgIG9uIHRoZSB3YXkgb3V0IG9mIHRoZSBsb29wLgotCQkJKi8KLQkJCVJFQURfVElNRVNUQU1QKGluc3QxKTsKLQkJCWxvb3AxID0gaW5zdDE7Ci0JCX0KLQkJZHVtcF90c2Mob3Bjb2RlLCB0aWNrZWQsIGluc3QwLCBpbnN0MSwgbG9vcDAsIGxvb3AxLAotCQkJIGludHIwLCBpbnRyMSk7Ci0JCXRpY2tlZCA9IDA7Ci0JCWluc3QxID0gMDsKLQkJaW50cjAgPSAwOwotCQlpbnRyMSA9IDA7Ci0JCVJFQURfVElNRVNUQU1QKGxvb3AwKTsKKyAgICAgICAgaWYgKGluc3QxID09IDApIHsKKyAgICAgICAgICAgIC8qIEFsbW9zdCBzdXJlbHksIHRoZSBvcGNvZGUgZXhlY3V0ZWQgYSBicmVhaworICAgICAgICAgICAgICAgb3IgYSBjb250aW51ZSwgcHJldmVudGluZyBpbnN0MSBmcm9tIGJlaW5nIHNldAorICAgICAgICAgICAgICAgb24gdGhlIHdheSBvdXQgb2YgdGhlIGxvb3AuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW5zdDEpOworICAgICAgICAgICAgbG9vcDEgPSBpbnN0MTsKKyAgICAgICAgfQorICAgICAgICBkdW1wX3RzYyhvcGNvZGUsIHRpY2tlZCwgaW5zdDAsIGluc3QxLCBsb29wMCwgbG9vcDEsCisgICAgICAgICAgICAgICAgIGludHIwLCBpbnRyMSk7CisgICAgICAgIHRpY2tlZCA9IDA7CisgICAgICAgIGluc3QxID0gMDsKKyAgICAgICAgaW50cjAgPSAwOworICAgICAgICBpbnRyMSA9IDA7CisgICAgICAgIFJFQURfVElNRVNUQU1QKGxvb3AwKTsKICNlbmRpZgotCQlhc3NlcnQoc3RhY2tfcG9pbnRlciA+PSBmLT5mX3ZhbHVlc3RhY2spOyAvKiBlbHNlIHVuZGVyZmxvdyAqLwotCQlhc3NlcnQoU1RBQ0tfTEVWRUwoKSA8PSBjby0+Y29fc3RhY2tzaXplKTsgIC8qIGVsc2Ugb3ZlcmZsb3cgKi8KKyAgICAgICAgYXNzZXJ0KHN0YWNrX3BvaW50ZXIgPj0gZi0+Zl92YWx1ZXN0YWNrKTsgLyogZWxzZSB1bmRlcmZsb3cgKi8KKyAgICAgICAgYXNzZXJ0KFNUQUNLX0xFVkVMKCkgPD0gY28tPmNvX3N0YWNrc2l6ZSk7ICAvKiBlbHNlIG92ZXJmbG93ICovCiAKLQkJLyogRG8gcGVyaW9kaWMgdGhpbmdzLiAgRG9pbmcgdGhpcyBldmVyeSB0aW1lIHRocm91Z2gKLQkJICAgdGhlIGxvb3Agd291bGQgYWRkIHRvbyBtdWNoIG92ZXJoZWFkLCBzbyB3ZSBkbyBpdAotCQkgICBvbmx5IGV2ZXJ5IE50aCBpbnN0cnVjdGlvbi4gIFdlIGFsc28gZG8gaXQgaWYKLQkJICAgYGBwZW5kaW5nY2FsbHNfdG9fZG8nJyBpcyBzZXQsIGkuZS4gd2hlbiBhbiBhc3luY2hyb25vdXMKLQkJICAgZXZlbnQgbmVlZHMgYXR0ZW50aW9uIChlLmcuIGEgc2lnbmFsIGhhbmRsZXIgb3IKLQkJICAgYXN5bmMgSS9PIGhhbmRsZXIpOyBzZWUgUHlfQWRkUGVuZGluZ0NhbGwoKSBhbmQKLQkJICAgUHlfTWFrZVBlbmRpbmdDYWxscygpIGFib3ZlLiAqLworICAgICAgICAvKiBEbyBwZXJpb2RpYyB0aGluZ3MuICBEb2luZyB0aGlzIGV2ZXJ5IHRpbWUgdGhyb3VnaAorICAgICAgICAgICB0aGUgbG9vcCB3b3VsZCBhZGQgdG9vIG11Y2ggb3ZlcmhlYWQsIHNvIHdlIGRvIGl0CisgICAgICAgICAgIG9ubHkgZXZlcnkgTnRoIGluc3RydWN0aW9uLiAgV2UgYWxzbyBkbyBpdCBpZgorICAgICAgICAgICBgYHBlbmRpbmdjYWxsc190b19kbycnIGlzIHNldCwgaS5lLiB3aGVuIGFuIGFzeW5jaHJvbm91cworICAgICAgICAgICBldmVudCBuZWVkcyBhdHRlbnRpb24gKGUuZy4gYSBzaWduYWwgaGFuZGxlciBvcgorICAgICAgICAgICBhc3luYyBJL08gaGFuZGxlcik7IHNlZSBQeV9BZGRQZW5kaW5nQ2FsbCgpIGFuZAorICAgICAgICAgICBQeV9NYWtlUGVuZGluZ0NhbGxzKCkgYWJvdmUuICovCiAKLQkJaWYgKC0tX1B5X1RpY2tlciA8IDApIHsKLQkJCWlmICgqbmV4dF9pbnN0ciA9PSBTRVRVUF9GSU5BTExZKSB7Ci0JCQkJLyogTWFrZSB0aGUgbGFzdCBvcGNvZGUgYmVmb3JlCi0JCQkJICAgYSB0cnk6IGZpbmFsbHk6IGJsb2NrIHVuaW50ZXJydXB0YWJsZS4gKi8KLQkJCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7Ci0JCQl9Ci0JCQlfUHlfVGlja2VyID0gX1B5X0NoZWNrSW50ZXJ2YWw7Ci0JCQl0c3RhdGUtPnRpY2tfY291bnRlcisrOworICAgICAgICBpZiAoLS1fUHlfVGlja2VyIDwgMCkgeworICAgICAgICAgICAgaWYgKCpuZXh0X2luc3RyID09IFNFVFVQX0ZJTkFMTFkpIHsKKyAgICAgICAgICAgICAgICAvKiBNYWtlIHRoZSBsYXN0IG9wY29kZSBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICBhIHRyeTogZmluYWxseTogYmxvY2sgdW5pbnRlcnJ1cHRhYmxlLiAqLworICAgICAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9QeV9UaWNrZXIgPSBfUHlfQ2hlY2tJbnRlcnZhbDsKKyAgICAgICAgICAgIHRzdGF0ZS0+dGlja19jb3VudGVyKys7CiAjaWZkZWYgV0lUSF9UU0MKLQkJCXRpY2tlZCA9IDE7CisgICAgICAgICAgICB0aWNrZWQgPSAxOwogI2VuZGlmCi0JCQlpZiAocGVuZGluZ2NhbGxzX3RvX2RvKSB7Ci0JCQkJaWYgKFB5X01ha2VQZW5kaW5nQ2FsbHMoKSA8IDApIHsKLQkJCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCQkJZ290byBvbl9lcnJvcjsKLQkJCQl9Ci0JCQkJaWYgKHBlbmRpbmdjYWxsc190b19kbykKLQkJCQkJLyogTWFrZVBlbmRpbmdDYWxscygpIGRpZG4ndCBzdWNjZWVkLgotCQkJCQkgICBGb3JjZSBlYXJseSByZS1leGVjdXRpb24gb2YgdGhpcwotCQkJCQkgICAicGVyaW9kaWMiIGNvZGUsIHBvc3NpYmx5IGFmdGVyCi0JCQkJCSAgIGEgdGhyZWFkIHN3aXRjaCAqLwotCQkJCQlfUHlfVGlja2VyID0gMDsKLQkJCX0KKyAgICAgICAgICAgIGlmIChwZW5kaW5nY2FsbHNfdG9fZG8pIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlfTWFrZVBlbmRpbmdDYWxscygpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGVuZGluZ2NhbGxzX3RvX2RvKQorICAgICAgICAgICAgICAgICAgICAvKiBNYWtlUGVuZGluZ0NhbGxzKCkgZGlkbid0IHN1Y2NlZWQuCisgICAgICAgICAgICAgICAgICAgICAgIEZvcmNlIGVhcmx5IHJlLWV4ZWN1dGlvbiBvZiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICJwZXJpb2RpYyIgY29kZSwgcG9zc2libHkgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgYSB0aHJlYWQgc3dpdGNoICovCisgICAgICAgICAgICAgICAgICAgIF9QeV9UaWNrZXIgPSAwOworICAgICAgICAgICAgfQogI2lmZGVmIFdJVEhfVEhSRUFECi0JCQlpZiAoaW50ZXJwcmV0ZXJfbG9jaykgewotCQkJCS8qIEdpdmUgYW5vdGhlciB0aHJlYWQgYSBjaGFuY2UgKi8KKyAgICAgICAgICAgIGlmIChpbnRlcnByZXRlcl9sb2NrKSB7CisgICAgICAgICAgICAgICAgLyogR2l2ZSBhbm90aGVyIHRocmVhZCBhIGNoYW5jZSAqLwogCi0JCQkJaWYgKFB5VGhyZWFkU3RhdGVfU3dhcChOVUxMKSAhPSB0c3RhdGUpCi0JCQkJCVB5X0ZhdGFsRXJyb3IoImNldmFsOiB0c3RhdGUgbWl4LXVwIik7Ci0JCQkJUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGludGVycHJldGVyX2xvY2spOworICAgICAgICAgICAgICAgIGlmIChQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCkgIT0gdHN0YXRlKQorICAgICAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjZXZhbDogdHN0YXRlIG1peC11cCIpOworICAgICAgICAgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbnRlcnByZXRlcl9sb2NrKTsKIAotCQkJCS8qIE90aGVyIHRocmVhZHMgbWF5IHJ1biBub3cgKi8KKyAgICAgICAgICAgICAgICAvKiBPdGhlciB0aHJlYWRzIG1heSBydW4gbm93ICovCiAKLQkJCQlQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7Ci0JCQkJaWYgKFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpICE9IE5VTEwpCi0JCQkJCVB5X0ZhdGFsRXJyb3IoImNldmFsOiBvcnBoYW4gdHN0YXRlIik7CisgICAgICAgICAgICAgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOworICAgICAgICAgICAgICAgIGlmIChQeVRocmVhZFN0YXRlX1N3YXAodHN0YXRlKSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjZXZhbDogb3JwaGFuIHRzdGF0ZSIpOwogCi0JCQkJLyogQ2hlY2sgZm9yIHRocmVhZCBpbnRlcnJ1cHRzICovCisgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIHRocmVhZCBpbnRlcnJ1cHRzICovCiAKLQkJCQlpZiAodHN0YXRlLT5hc3luY19leGMgIT0gTlVMTCkgewotCQkJCQl4ID0gdHN0YXRlLT5hc3luY19leGM7Ci0JCQkJCXRzdGF0ZS0+YXN5bmNfZXhjID0gTlVMTDsKLQkJCQkJUHlFcnJfU2V0Tm9uZSh4KTsKLQkJCQkJUHlfREVDUkVGKHgpOwotCQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJCQlnb3RvIG9uX2Vycm9yOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgICAgICBpZiAodHN0YXRlLT5hc3luY19leGMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gdHN0YXRlLT5hc3luY19leGM7CisgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+YXN5bmNfZXhjID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZSh4KTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICNlbmRpZgotCQl9CisgICAgICAgIH0KIAotCWZhc3RfbmV4dF9vcGNvZGU6Ci0JCWYtPmZfbGFzdGkgPSBJTlNUUl9PRkZTRVQoKTsKKyAgICBmYXN0X25leHRfb3Bjb2RlOgorICAgICAgICBmLT5mX2xhc3RpID0gSU5TVFJfT0ZGU0VUKCk7CiAKLQkJLyogbGluZS1ieS1saW5lIHRyYWNpbmcgc3VwcG9ydCAqLworICAgICAgICAvKiBsaW5lLWJ5LWxpbmUgdHJhY2luZyBzdXBwb3J0ICovCiAKLQkJaWYgKF9QeV9UcmFjaW5nUG9zc2libGUgJiYKLQkJICAgIHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCAmJiAhdHN0YXRlLT50cmFjaW5nKSB7Ci0JCQkvKiBzZWUgbWF5YmVfY2FsbF9saW5lX3RyYWNlCi0JCQkgICBmb3IgZXhwb3NpdG9yeSBjb21tZW50cyAqLwotCQkJZi0+Zl9zdGFja3RvcCA9IHN0YWNrX3BvaW50ZXI7CisgICAgICAgIGlmIChfUHlfVHJhY2luZ1Bvc3NpYmxlICYmCisgICAgICAgICAgICB0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwgJiYgIXRzdGF0ZS0+dHJhY2luZykgeworICAgICAgICAgICAgLyogc2VlIG1heWJlX2NhbGxfbGluZV90cmFjZQorICAgICAgICAgICAgICAgZm9yIGV4cG9zaXRvcnkgY29tbWVudHMgKi8KKyAgICAgICAgICAgIGYtPmZfc3RhY2t0b3AgPSBzdGFja19wb2ludGVyOwogCi0JCQllcnIgPSBtYXliZV9jYWxsX2xpbmVfdHJhY2UodHN0YXRlLT5jX3RyYWNlZnVuYywKLQkJCQkJCSAgICB0c3RhdGUtPmNfdHJhY2VvYmosCi0JCQkJCQkgICAgZiwgJmluc3RyX2xiLCAmaW5zdHJfdWIsCi0JCQkJCQkgICAgJmluc3RyX3ByZXYpOwotCQkJLyogUmVsb2FkIHBvc3NpYmx5IGNoYW5nZWQgZnJhbWUgZmllbGRzICovCi0JCQlKVU1QVE8oZi0+Zl9sYXN0aSk7Ci0JCQlpZiAoZi0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7Ci0JCQkJc3RhY2tfcG9pbnRlciA9IGYtPmZfc3RhY2t0b3A7Ci0JCQkJZi0+Zl9zdGFja3RvcCA9IE5VTEw7Ci0JCQl9Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJLyogdHJhY2UgZnVuY3Rpb24gcmFpc2VkIGFuIGV4Y2VwdGlvbiAqLwotCQkJCWdvdG8gb25fZXJyb3I7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIGVyciA9IG1heWJlX2NhbGxfbGluZV90cmFjZSh0c3RhdGUtPmNfdHJhY2VmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+Y190cmFjZW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLCAmaW5zdHJfbGIsICZpbnN0cl91YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJfcHJldik7CisgICAgICAgICAgICAvKiBSZWxvYWQgcG9zc2libHkgY2hhbmdlZCBmcmFtZSBmaWVsZHMgKi8KKyAgICAgICAgICAgIEpVTVBUTyhmLT5mX2xhc3RpKTsKKyAgICAgICAgICAgIGlmIChmLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzdGFja19wb2ludGVyID0gZi0+Zl9zdGFja3RvcDsKKyAgICAgICAgICAgICAgICBmLT5mX3N0YWNrdG9wID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICAvKiB0cmFjZSBmdW5jdGlvbiByYWlzZWQgYW4gZXhjZXB0aW9uICovCisgICAgICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8qIEV4dHJhY3Qgb3Bjb2RlIGFuZCBhcmd1bWVudCAqLworICAgICAgICAvKiBFeHRyYWN0IG9wY29kZSBhbmQgYXJndW1lbnQgKi8KIAotCQlvcGNvZGUgPSBORVhUT1AoKTsKLQkJb3BhcmcgPSAwOyAgIC8qIGFsbG93cyBvcGFyZyB0byBiZSBzdG9yZWQgaW4gYSByZWdpc3RlciBiZWNhdXNlCi0JCQlpdCBkb2Vzbid0IGhhdmUgdG8gYmUgcmVtZW1iZXJlZCBhY3Jvc3MgYSBmdWxsIGxvb3AgKi8KLQkJaWYgKEhBU19BUkcob3Bjb2RlKSkKLQkJCW9wYXJnID0gTkVYVEFSRygpOwotCSAgZGlzcGF0Y2hfb3Bjb2RlOgorICAgICAgICBvcGNvZGUgPSBORVhUT1AoKTsKKyAgICAgICAgb3BhcmcgPSAwOyAgIC8qIGFsbG93cyBvcGFyZyB0byBiZSBzdG9yZWQgaW4gYSByZWdpc3RlciBiZWNhdXNlCisgICAgICAgICAgICBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgcmVtZW1iZXJlZCBhY3Jvc3MgYSBmdWxsIGxvb3AgKi8KKyAgICAgICAgaWYgKEhBU19BUkcob3Bjb2RlKSkKKyAgICAgICAgICAgIG9wYXJnID0gTkVYVEFSRygpOworICAgICAgZGlzcGF0Y2hfb3Bjb2RlOgogI2lmZGVmIERZTkFNSUNfRVhFQ1VUSU9OX1BST0ZJTEUKICNpZmRlZiBEWFBBSVJTCi0JCWR4cGFpcnNbbGFzdG9wY29kZV1bb3Bjb2RlXSsrOwotCQlsYXN0b3Bjb2RlID0gb3Bjb2RlOworICAgICAgICBkeHBhaXJzW2xhc3RvcGNvZGVdW29wY29kZV0rKzsKKyAgICAgICAgbGFzdG9wY29kZSA9IG9wY29kZTsKICNlbmRpZgotCQlkeHBbb3Bjb2RlXSsrOworICAgICAgICBkeHBbb3Bjb2RlXSsrOwogI2VuZGlmCiAKICNpZmRlZiBMTFRSQUNFCi0JCS8qIEluc3RydWN0aW9uIHRyYWNpbmcgKi8KKyAgICAgICAgLyogSW5zdHJ1Y3Rpb24gdHJhY2luZyAqLwogCi0JCWlmIChsbHRyYWNlKSB7Ci0JCQlpZiAoSEFTX0FSRyhvcGNvZGUpKSB7Ci0JCQkJcHJpbnRmKCIlZDogJWQsICVkXG4iLAotCQkJCSAgICAgICBmLT5mX2xhc3RpLCBvcGNvZGUsIG9wYXJnKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXByaW50ZigiJWQ6ICVkXG4iLAotCQkJCSAgICAgICBmLT5mX2xhc3RpLCBvcGNvZGUpOwotCQkJfQotCQl9CisgICAgICAgIGlmIChsbHRyYWNlKSB7CisgICAgICAgICAgICBpZiAoSEFTX0FSRyhvcGNvZGUpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlZDogJWQsICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2xhc3RpLCBvcGNvZGUsIG9wYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiJWQ6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2xhc3RpLCBvcGNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYKIAotCQkvKiBNYWluIHN3aXRjaCBvbiBvcGNvZGUgKi8KLQkJUkVBRF9USU1FU1RBTVAoaW5zdDApOworICAgICAgICAvKiBNYWluIHN3aXRjaCBvbiBvcGNvZGUgKi8KKyAgICAgICAgUkVBRF9USU1FU1RBTVAoaW5zdDApOwogCi0JCXN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CiAKLQkJLyogQkVXQVJFIQotCQkgICBJdCBpcyBlc3NlbnRpYWwgdGhhdCBhbnkgb3BlcmF0aW9uIHRoYXQgZmFpbHMgc2V0cyBlaXRoZXIKLQkJICAgeCB0byBOVUxMLCBlcnIgdG8gbm9uemVybywgb3Igd2h5IHRvIGFueXRoaW5nIGJ1dCBXSFlfTk9ULAotCQkgICBhbmQgdGhhdCBubyBvcGVyYXRpb24gdGhhdCBzdWNjZWVkcyBkb2VzIHRoaXMhICovCisgICAgICAgIC8qIEJFV0FSRSEKKyAgICAgICAgICAgSXQgaXMgZXNzZW50aWFsIHRoYXQgYW55IG9wZXJhdGlvbiB0aGF0IGZhaWxzIHNldHMgZWl0aGVyCisgICAgICAgICAgIHggdG8gTlVMTCwgZXJyIHRvIG5vbnplcm8sIG9yIHdoeSB0byBhbnl0aGluZyBidXQgV0hZX05PVCwKKyAgICAgICAgICAgYW5kIHRoYXQgbm8gb3BlcmF0aW9uIHRoYXQgc3VjY2VlZHMgZG9lcyB0aGlzISAqLwogCi0JCS8qIGNhc2UgU1RPUF9DT0RFOiB0aGlzIGlzIGFuIGVycm9yISAqLworICAgICAgICAvKiBjYXNlIFNUT1BfQ09ERTogdGhpcyBpcyBhbiBlcnJvciEgKi8KIAotCQljYXNlIE5PUDoKLQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgY2FzZSBOT1A6CisgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CiAKLQkJY2FzZSBMT0FEX0ZBU1Q6Ci0JCQl4ID0gR0VUTE9DQUwob3BhcmcpOwotCQkJaWYgKHggIT0gTlVMTCkgewotCQkJCVB5X0lOQ1JFRih4KTsKLQkJCQlQVVNIKHgpOwotCQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKLQkJCX0KLQkJCWZvcm1hdF9leGNfY2hlY2tfYXJnKFB5RXhjX1VuYm91bmRMb2NhbEVycm9yLAotCQkJCVVOQk9VTkRMT0NBTF9FUlJPUl9NU0csCi0JCQkJUHlUdXBsZV9HZXRJdGVtKGNvLT5jb192YXJuYW1lcywgb3BhcmcpKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIExPQURfRkFTVDoKKyAgICAgICAgICAgIHggPSBHRVRMT0NBTChvcGFyZyk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0X2V4Y19jaGVja19hcmcoUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IsCisgICAgICAgICAgICAgICAgVU5CT1VORExPQ0FMX0VSUk9SX01TRywKKyAgICAgICAgICAgICAgICBQeVR1cGxlX0dldEl0ZW0oY28tPmNvX3Zhcm5hbWVzLCBvcGFyZykpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBMT0FEX0NPTlNUOgotCQkJeCA9IEdFVElURU0oY29uc3RzLCBvcGFyZyk7Ci0JCQlQeV9JTkNSRUYoeCk7Ci0JCQlQVVNIKHgpOwotCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICBjYXNlIExPQURfQ09OU1Q6CisgICAgICAgICAgICB4ID0gR0VUSVRFTShjb25zdHMsIG9wYXJnKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CiAKLQkJUFJFRElDVEVEX1dJVEhfQVJHKFNUT1JFX0ZBU1QpOwotCQljYXNlIFNUT1JFX0ZBU1Q6Ci0JCQl2ID0gUE9QKCk7Ci0JCQlTRVRMT0NBTChvcGFyZywgdik7Ci0JCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhTVE9SRV9GQVNUKTsKKyAgICAgICAgY2FzZSBTVE9SRV9GQVNUOgorICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgU0VUTE9DQUwob3BhcmcsIHYpOworICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogCi0JCWNhc2UgUE9QX1RPUDoKLQkJCXYgPSBQT1AoKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgY2FzZSBQT1BfVE9QOgorICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogCi0JCWNhc2UgUk9UX1RXTzoKLQkJCXYgPSBUT1AoKTsKLQkJCXcgPSBTRUNPTkQoKTsKLQkJCVNFVF9UT1Aodyk7Ci0JCQlTRVRfU0VDT05EKHYpOwotCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICBjYXNlIFJPVF9UV086CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB3ID0gU0VDT05EKCk7CisgICAgICAgICAgICBTRVRfVE9QKHcpOworICAgICAgICAgICAgU0VUX1NFQ09ORCh2KTsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKIAotCQljYXNlIFJPVF9USFJFRToKLQkJCXYgPSBUT1AoKTsKLQkJCXcgPSBTRUNPTkQoKTsKLQkJCXggPSBUSElSRCgpOwotCQkJU0VUX1RPUCh3KTsKLQkJCVNFVF9TRUNPTkQoeCk7Ci0JCQlTRVRfVEhJUkQodik7Ci0JCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgIGNhc2UgUk9UX1RIUkVFOgorICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgdyA9IFNFQ09ORCgpOworICAgICAgICAgICAgeCA9IFRISVJEKCk7CisgICAgICAgICAgICBTRVRfVE9QKHcpOworICAgICAgICAgICAgU0VUX1NFQ09ORCh4KTsKKyAgICAgICAgICAgIFNFVF9USElSRCh2KTsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKIAotCQljYXNlIFJPVF9GT1VSOgotCQkJdSA9IFRPUCgpOwotCQkJdiA9IFNFQ09ORCgpOwotCQkJdyA9IFRISVJEKCk7Ci0JCQl4ID0gRk9VUlRIKCk7Ci0JCQlTRVRfVE9QKHYpOwotCQkJU0VUX1NFQ09ORCh3KTsKLQkJCVNFVF9USElSRCh4KTsKLQkJCVNFVF9GT1VSVEgodSk7Ci0JCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgIGNhc2UgUk9UX0ZPVVI6CisgICAgICAgICAgICB1ID0gVE9QKCk7CisgICAgICAgICAgICB2ID0gU0VDT05EKCk7CisgICAgICAgICAgICB3ID0gVEhJUkQoKTsKKyAgICAgICAgICAgIHggPSBGT1VSVEgoKTsKKyAgICAgICAgICAgIFNFVF9UT1Aodik7CisgICAgICAgICAgICBTRVRfU0VDT05EKHcpOworICAgICAgICAgICAgU0VUX1RISVJEKHgpOworICAgICAgICAgICAgU0VUX0ZPVVJUSCh1KTsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKIAotCQljYXNlIERVUF9UT1A6Ci0JCQl2ID0gVE9QKCk7Ci0JCQlQeV9JTkNSRUYodik7Ci0JCQlQVVNIKHYpOwotCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICBjYXNlIERVUF9UT1A6CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICBQVVNIKHYpOworICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogCi0JCWNhc2UgRFVQX1RPUFg6Ci0JCQlpZiAob3BhcmcgPT0gMikgewotCQkJCXggPSBUT1AoKTsKLQkJCQlQeV9JTkNSRUYoeCk7Ci0JCQkJdyA9IFNFQ09ORCgpOwotCQkJCVB5X0lOQ1JFRih3KTsKLQkJCQlTVEFDS0FESigyKTsKLQkJCQlTRVRfVE9QKHgpOwotCQkJCVNFVF9TRUNPTkQodyk7Ci0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfSBlbHNlIGlmIChvcGFyZyA9PSAzKSB7Ci0JCQkJeCA9IFRPUCgpOwotCQkJCVB5X0lOQ1JFRih4KTsKLQkJCQl3ID0gU0VDT05EKCk7Ci0JCQkJUHlfSU5DUkVGKHcpOwotCQkJCXYgPSBUSElSRCgpOwotCQkJCVB5X0lOQ1JFRih2KTsKLQkJCQlTVEFDS0FESigzKTsKLQkJCQlTRVRfVE9QKHgpOwotCQkJCVNFVF9TRUNPTkQodyk7Ci0JCQkJU0VUX1RISVJEKHYpOwotCQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKLQkJCX0KLQkJCVB5X0ZhdGFsRXJyb3IoImludmFsaWQgYXJndW1lbnQgdG8gRFVQX1RPUFgiCi0JCQkJICAgICAgIiAoYnl0ZWNvZGUgY29ycnVwdGlvbj8pIik7Ci0JCQkvKiBOZXZlciByZXR1cm5zLCBzbyBkb24ndCBib3RoZXIgdG8gc2V0IHdoeS4gKi8KLQkJCWJyZWFrOworICAgICAgICBjYXNlIERVUF9UT1BYOgorICAgICAgICAgICAgaWYgKG9wYXJnID09IDIpIHsKKyAgICAgICAgICAgICAgICB4ID0gVE9QKCk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgICAgIHcgPSBTRUNPTkQoKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodyk7CisgICAgICAgICAgICAgICAgU1RBQ0tBREooMik7CisgICAgICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgICAgICBTRVRfU0VDT05EKHcpOworICAgICAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3BhcmcgPT0gMykgeworICAgICAgICAgICAgICAgIHggPSBUT1AoKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICAgICAgdyA9IFNFQ09ORCgpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih3KTsKKyAgICAgICAgICAgICAgICB2ID0gVEhJUkQoKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICAgICAgU1RBQ0tBREooMyk7CisgICAgICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgICAgICBTRVRfU0VDT05EKHcpOworICAgICAgICAgICAgICAgIFNFVF9USElSRCh2KTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJpbnZhbGlkIGFyZ3VtZW50IHRvIERVUF9UT1BYIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIChieXRlY29kZSBjb3JydXB0aW9uPykiKTsKKyAgICAgICAgICAgIC8qIE5ldmVyIHJldHVybnMsIHNvIGRvbid0IGJvdGhlciB0byBzZXQgd2h5LiAqLworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBVTkFSWV9QT1NJVElWRToKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9Qb3NpdGl2ZSh2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFVOQVJZX1BPU0lUSVZFOgorICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX1Bvc2l0aXZlKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBVTkFSWV9ORUdBVElWRToKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9OZWdhdGl2ZSh2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFVOQVJZX05FR0FUSVZFOgorICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX05lZ2F0aXZlKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBVTkFSWV9OT1Q6Ci0JCQl2ID0gVE9QKCk7Ci0JCQllcnIgPSBQeU9iamVjdF9Jc1RydWUodik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlpZiAoZXJyID09IDApIHsKLQkJCQlQeV9JTkNSRUYoUHlfVHJ1ZSk7Ci0JCQkJU0VUX1RPUChQeV9UcnVlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGVyciA+IDApIHsKLQkJCQlQeV9JTkNSRUYoUHlfRmFsc2UpOwotCQkJCVNFVF9UT1AoUHlfRmFsc2UpOwotCQkJCWVyciA9IDA7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTVEFDS0FESigtMSk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBVTkFSWV9OT1Q6CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICBlcnIgPSBQeU9iamVjdF9Jc1RydWUodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfVHJ1ZSk7CisgICAgICAgICAgICAgICAgU0VUX1RPUChQeV9UcnVlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGVyciA+IDApIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfRmFsc2UpOworICAgICAgICAgICAgICAgIFNFVF9UT1AoUHlfRmFsc2UpOworICAgICAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTVEFDS0FESigtMSk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFVOQVJZX0NPTlZFUlQ6Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlPYmplY3RfUmVwcih2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFVOQVJZX0NPTlZFUlQ6CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlPYmplY3RfUmVwcih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgVU5BUllfSU5WRVJUOgotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0ludmVydCh2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFVOQVJZX0lOVkVSVDoKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JbnZlcnQodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9QT1dFUjoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9Qb3dlcih2LCB3LCBQeV9Ob25lKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9QT1dFUjoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9Qb3dlcih2LCB3LCBQeV9Ob25lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX01VTFRJUExZOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX011bHRpcGx5KHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX01VTFRJUExZOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX011bHRpcGx5KHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfRElWSURFOgotCQkJaWYgKCFfUHlfUW5ld0ZsYWcpIHsKLQkJCQl3ID0gUE9QKCk7Ci0JCQkJdiA9IFRPUCgpOwotCQkJCXggPSBQeU51bWJlcl9EaXZpZGUodiwgdyk7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCVB5X0RFQ1JFRih3KTsKLQkJCQlTRVRfVE9QKHgpOwotCQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogLVFuZXcgaXMgaW4gZWZmZWN0OglmYWxsIHRocm91Z2ggdG8KLQkJCSAgIEJJTkFSWV9UUlVFX0RJVklERSAqLwotCQljYXNlIEJJTkFSWV9UUlVFX0RJVklERToKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9UcnVlRGl2aWRlKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX0RJVklERToKKyAgICAgICAgICAgIGlmICghX1B5X1FuZXdGbGFnKSB7CisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgICAgICB4ID0gUHlOdW1iZXJfRGl2aWRlKHYsIHcpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIC1RbmV3IGlzIGluIGVmZmVjdDogICAgICAgICAgICAgIGZhbGwgdGhyb3VnaCB0bworICAgICAgICAgICAgICAgQklOQVJZX1RSVUVfRElWSURFICovCisgICAgICAgIGNhc2UgQklOQVJZX1RSVUVfRElWSURFOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX1RydWVEaXZpZGUodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9GTE9PUl9ESVZJREU6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfRmxvb3JEaXZpZGUodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfRkxPT1JfRElWSURFOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0Zsb29yRGl2aWRlKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfTU9EVUxPOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikpCi0JCQkJeCA9IFB5U3RyaW5nX0Zvcm1hdCh2LCB3KTsKLQkJCWVsc2UKLQkJCQl4ID0gUHlOdW1iZXJfUmVtYWluZGVyKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX01PRFVMTzoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHYpKQorICAgICAgICAgICAgICAgIHggPSBQeVN0cmluZ19Gb3JtYXQodiwgdyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeCA9IFB5TnVtYmVyX1JlbWFpbmRlcih2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX0FERDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCWlmIChQeUludF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKLQkJCQkvKiBJTkxJTkU6IGludCArIGludCAqLwotCQkJCXJlZ2lzdGVyIGxvbmcgYSwgYiwgaTsKLQkJCQlhID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJCQliID0gUHlJbnRfQVNfTE9ORyh3KTsKLQkJCQkvKiBjYXN0IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIKLQkJCQkgICBvbiBvdmVyZmxvdyAqLwotCQkJCWkgPSAobG9uZykoKHVuc2lnbmVkIGxvbmcpYSArIGIpOwotCQkJCWlmICgoaV5hKSA8IDAgJiYgKGleYikgPCAwKQotCQkJCQlnb3RvIHNsb3dfYWRkOwotCQkJCXggPSBQeUludF9Gcm9tTG9uZyhpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikgJiYKLQkJCQkgUHlTdHJpbmdfQ2hlY2tFeGFjdCh3KSkgewotCQkJCXggPSBzdHJpbmdfY29uY2F0ZW5hdGUodiwgdywgZiwgbmV4dF9pbnN0cik7Ci0JCQkJLyogc3RyaW5nX2NvbmNhdGVuYXRlIGNvbnN1bWVkIHRoZSByZWYgdG8gdiAqLwotCQkJCWdvdG8gc2tpcF9kZWNyZWZfdng7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCSAgc2xvd19hZGQ6Ci0JCQkJeCA9IFB5TnVtYmVyX0FkZCh2LCB3KTsKLQkJCX0KLQkJCVB5X0RFQ1JFRih2KTsKLQkJICBza2lwX2RlY3JlZl92eDoKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9BREQ6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSAmJiBQeUludF9DaGVja0V4YWN0KHcpKSB7CisgICAgICAgICAgICAgICAgLyogSU5MSU5FOiBpbnQgKyBpbnQgKi8KKyAgICAgICAgICAgICAgICByZWdpc3RlciBsb25nIGEsIGIsIGk7CisgICAgICAgICAgICAgICAgYSA9IFB5SW50X0FTX0xPTkcodik7CisgICAgICAgICAgICAgICAgYiA9IFB5SW50X0FTX0xPTkcodyk7CisgICAgICAgICAgICAgICAgLyogY2FzdCB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyCisgICAgICAgICAgICAgICAgICAgb24gb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBpID0gKGxvbmcpKCh1bnNpZ25lZCBsb25nKWEgKyBiKTsKKyAgICAgICAgICAgICAgICBpZiAoKGleYSkgPCAwICYmIChpXmIpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBzbG93X2FkZDsKKyAgICAgICAgICAgICAgICB4ID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHYpICYmCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19DaGVja0V4YWN0KHcpKSB7CisgICAgICAgICAgICAgICAgeCA9IHN0cmluZ19jb25jYXRlbmF0ZSh2LCB3LCBmLCBuZXh0X2luc3RyKTsKKyAgICAgICAgICAgICAgICAvKiBzdHJpbmdfY29uY2F0ZW5hdGUgY29uc3VtZWQgdGhlIHJlZiB0byB2ICovCisgICAgICAgICAgICAgICAgZ290byBza2lwX2RlY3JlZl92eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBzbG93X2FkZDoKKyAgICAgICAgICAgICAgICB4ID0gUHlOdW1iZXJfQWRkKHYsIHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgIHNraXBfZGVjcmVmX3Z4OgorICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfU1VCVFJBQ1Q6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSAmJiBQeUludF9DaGVja0V4YWN0KHcpKSB7Ci0JCQkJLyogSU5MSU5FOiBpbnQgLSBpbnQgKi8KLQkJCQlyZWdpc3RlciBsb25nIGEsIGIsIGk7Ci0JCQkJYSA9IFB5SW50X0FTX0xPTkcodik7Ci0JCQkJYiA9IFB5SW50X0FTX0xPTkcodyk7Ci0JCQkJLyogY2FzdCB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyCi0JCQkJICAgb24gb3ZlcmZsb3cgKi8KLQkJCQlpID0gKGxvbmcpKCh1bnNpZ25lZCBsb25nKWEgLSBiKTsKLQkJCQlpZiAoKGleYSkgPCAwICYmIChpXn5iKSA8IDApCi0JCQkJCWdvdG8gc2xvd19zdWI7Ci0JCQkJeCA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkgIHNsb3dfc3ViOgotCQkJCXggPSBQeU51bWJlcl9TdWJ0cmFjdCh2LCB3KTsKLQkJCX0KLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9TVUJUUkFDVDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIGlmIChQeUludF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKKyAgICAgICAgICAgICAgICAvKiBJTkxJTkU6IGludCAtIGludCAqLworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGxvbmcgYSwgYiwgaTsKKyAgICAgICAgICAgICAgICBhID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgICAgICAgICBiID0gUHlJbnRfQVNfTE9ORyh3KTsKKyAgICAgICAgICAgICAgICAvKiBjYXN0IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIKKyAgICAgICAgICAgICAgICAgICBvbiBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIGkgPSAobG9uZykoKHVuc2lnbmVkIGxvbmcpYSAtIGIpOworICAgICAgICAgICAgICAgIGlmICgoaV5hKSA8IDAgJiYgKGlefmIpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBzbG93X3N1YjsKKyAgICAgICAgICAgICAgICB4ID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgc2xvd19zdWI6CisgICAgICAgICAgICAgICAgeCA9IFB5TnVtYmVyX1N1YnRyYWN0KHYsIHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfU1VCU0NSOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJaWYgKFB5TGlzdF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKLQkJCQkvKiBJTkxJTkU6IGxpc3RbaW50XSAqLwotCQkJCVB5X3NzaXplX3QgaSA9IFB5SW50X0FzU3NpemVfdCh3KTsKLQkJCQlpZiAoaSA8IDApCi0JCQkJCWkgKz0gUHlMaXN0X0dFVF9TSVpFKHYpOwotCQkJCWlmIChpID49IDAgJiYgaSA8IFB5TGlzdF9HRVRfU0laRSh2KSkgewotCQkJCQl4ID0gUHlMaXN0X0dFVF9JVEVNKHYsIGkpOwotCQkJCQlQeV9JTkNSRUYoeCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJZ290byBzbG93X2dldDsKLQkJCX0KLQkJCWVsc2UKLQkJCSAgc2xvd19nZXQ6Ci0JCQkJeCA9IFB5T2JqZWN0X0dldEl0ZW0odiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfU1VCU0NSOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKKyAgICAgICAgICAgICAgICAvKiBJTkxJTkU6IGxpc3RbaW50XSAqLworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgaSA9IFB5SW50X0FzU3NpemVfdCh3KTsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICAgICAgICAgIGkgKz0gUHlMaXN0X0dFVF9TSVpFKHYpOworICAgICAgICAgICAgICAgIGlmIChpID49IDAgJiYgaSA8IFB5TGlzdF9HRVRfU0laRSh2KSkgeworICAgICAgICAgICAgICAgICAgICB4ID0gUHlMaXN0X0dFVF9JVEVNKHYsIGkpOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZ290byBzbG93X2dldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgc2xvd19nZXQ6CisgICAgICAgICAgICAgICAgeCA9IFB5T2JqZWN0X0dldEl0ZW0odiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9MU0hJRlQ6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfTHNoaWZ0KHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX0xTSElGVDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9Mc2hpZnQodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9SU0hJRlQ6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfUnNoaWZ0KHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX1JTSElGVDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9Sc2hpZnQodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9BTkQ6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfQW5kKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX0FORDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9BbmQodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9YT1I6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfWG9yKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX1hPUjoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9Yb3Iodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9PUjoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9Pcih2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9PUjoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9Pcih2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTElTVF9BUFBFTkQ6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gUEVFSyhvcGFyZyk7Ci0JCQllcnIgPSBQeUxpc3RfQXBwZW5kKHYsIHcpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJaWYgKGVyciA9PSAwKSB7Ci0JCQkJUFJFRElDVChKVU1QX0FCU09MVVRFKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJyZWFrOworICAgICAgICBjYXNlIExJU1RfQVBQRU5EOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFBFRUsob3BhcmcpOworICAgICAgICAgICAgZXJyID0gUHlMaXN0X0FwcGVuZCh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgICAgIFBSRURJQ1QoSlVNUF9BQlNPTFVURSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFNFVF9BREQ6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gc3RhY2tfcG9pbnRlclstb3BhcmddOwotCQkJZXJyID0gUHlTZXRfQWRkKHYsIHcpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJaWYgKGVyciA9PSAwKSB7Ci0JCQkJUFJFRElDVChKVU1QX0FCU09MVVRFKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJyZWFrOworICAgICAgICBjYXNlIFNFVF9BREQ6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gc3RhY2tfcG9pbnRlclstb3BhcmddOworICAgICAgICAgICAgZXJyID0gUHlTZXRfQWRkKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICAgICAgUFJFRElDVChKVU1QX0FCU09MVVRFKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9QT1dFUjoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9JblBsYWNlUG93ZXIodiwgdywgUHlfTm9uZSk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX1BPV0VSOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VQb3dlcih2LCB3LCBQeV9Ob25lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9NVUxUSVBMWToKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9JblBsYWNlTXVsdGlwbHkodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX01VTFRJUExZOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseSh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9ESVZJREU6Ci0JCQlpZiAoIV9QeV9RbmV3RmxhZykgewotCQkJCXcgPSBQT1AoKTsKLQkJCQl2ID0gVE9QKCk7Ci0JCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VEaXZpZGUodiwgdyk7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCVB5X0RFQ1JFRih3KTsKLQkJCQlTRVRfVE9QKHgpOwotCQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogLVFuZXcgaXMgaW4gZWZmZWN0OglmYWxsIHRocm91Z2ggdG8KLQkJCSAgIElOUExBQ0VfVFJVRV9ESVZJREUgKi8KLQkJY2FzZSBJTlBMQUNFX1RSVUVfRElWSURFOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9ESVZJREU6CisgICAgICAgICAgICBpZiAoIV9QeV9RbmV3RmxhZykgeworICAgICAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VEaXZpZGUodiwgdyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogLVFuZXcgaXMgaW4gZWZmZWN0OiAgICAgICAgICAgICAgZmFsbCB0aHJvdWdoIHRvCisgICAgICAgICAgICAgICBJTlBMQUNFX1RSVUVfRElWSURFICovCisgICAgICAgIGNhc2UgSU5QTEFDRV9UUlVFX0RJVklERToKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZSh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9GTE9PUl9ESVZJREU6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9GTE9PUl9ESVZJREU6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX01PRFVMTzoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9JblBsYWNlUmVtYWluZGVyKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9NT0RVTE86CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcih2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9BREQ6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSAmJiBQeUludF9DaGVja0V4YWN0KHcpKSB7Ci0JCQkJLyogSU5MSU5FOiBpbnQgKyBpbnQgKi8KLQkJCQlyZWdpc3RlciBsb25nIGEsIGIsIGk7Ci0JCQkJYSA9IFB5SW50X0FTX0xPTkcodik7Ci0JCQkJYiA9IFB5SW50X0FTX0xPTkcodyk7Ci0JCQkJaSA9IGEgKyBiOwotCQkJCWlmICgoaV5hKSA8IDAgJiYgKGleYikgPCAwKQotCQkJCQlnb3RvIHNsb3dfaWFkZDsKLQkJCQl4ID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHYpICYmCi0JCQkJIFB5U3RyaW5nX0NoZWNrRXhhY3QodykpIHsKLQkJCQl4ID0gc3RyaW5nX2NvbmNhdGVuYXRlKHYsIHcsIGYsIG5leHRfaW5zdHIpOwotCQkJCS8qIHN0cmluZ19jb25jYXRlbmF0ZSBjb25zdW1lZCB0aGUgcmVmIHRvIHYgKi8KLQkJCQlnb3RvIHNraXBfZGVjcmVmX3Y7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCSAgc2xvd19pYWRkOgotCQkJCXggPSBQeU51bWJlcl9JblBsYWNlQWRkKHYsIHcpOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQkgIHNraXBfZGVjcmVmX3Y6Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX0FERDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIGlmIChQeUludF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKKyAgICAgICAgICAgICAgICAvKiBJTkxJTkU6IGludCArIGludCAqLworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGxvbmcgYSwgYiwgaTsKKyAgICAgICAgICAgICAgICBhID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgICAgICAgICBiID0gUHlJbnRfQVNfTE9ORyh3KTsKKyAgICAgICAgICAgICAgICBpID0gYSArIGI7CisgICAgICAgICAgICAgICAgaWYgKChpXmEpIDwgMCAmJiAoaV5iKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gc2xvd19pYWRkOworICAgICAgICAgICAgICAgIHggPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikgJiYKKyAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0NoZWNrRXhhY3QodykpIHsKKyAgICAgICAgICAgICAgICB4ID0gc3RyaW5nX2NvbmNhdGVuYXRlKHYsIHcsIGYsIG5leHRfaW5zdHIpOworICAgICAgICAgICAgICAgIC8qIHN0cmluZ19jb25jYXRlbmF0ZSBjb25zdW1lZCB0aGUgcmVmIHRvIHYgKi8KKyAgICAgICAgICAgICAgICBnb3RvIHNraXBfZGVjcmVmX3Y7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgc2xvd19pYWRkOgorICAgICAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlQWRkKHYsIHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgIHNraXBfZGVjcmVmX3Y6CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIElOUExBQ0VfU1VCVFJBQ1Q6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSAmJiBQeUludF9DaGVja0V4YWN0KHcpKSB7Ci0JCQkJLyogSU5MSU5FOiBpbnQgLSBpbnQgKi8KLQkJCQlyZWdpc3RlciBsb25nIGEsIGIsIGk7Ci0JCQkJYSA9IFB5SW50X0FTX0xPTkcodik7Ci0JCQkJYiA9IFB5SW50X0FTX0xPTkcodyk7Ci0JCQkJaSA9IGEgLSBiOwotCQkJCWlmICgoaV5hKSA8IDAgJiYgKGlefmIpIDwgMCkKLQkJCQkJZ290byBzbG93X2lzdWI7Ci0JCQkJeCA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkgIHNsb3dfaXN1YjoKLQkJCQl4ID0gUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0KHYsIHcpOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9TVUJUUkFDVDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIGlmIChQeUludF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKKyAgICAgICAgICAgICAgICAvKiBJTkxJTkU6IGludCAtIGludCAqLworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGxvbmcgYSwgYiwgaTsKKyAgICAgICAgICAgICAgICBhID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgICAgICAgICBiID0gUHlJbnRfQVNfTE9ORyh3KTsKKyAgICAgICAgICAgICAgICBpID0gYSAtIGI7CisgICAgICAgICAgICAgICAgaWYgKChpXmEpIDwgMCAmJiAoaV5+YikgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHNsb3dfaXN1YjsKKyAgICAgICAgICAgICAgICB4ID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgc2xvd19pc3ViOgorICAgICAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlU3VidHJhY3Qodiwgdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIElOUExBQ0VfTFNISUZUOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VMc2hpZnQodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX0xTSElGVDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlTHNoaWZ0KHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX1JTSElGVDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9JblBsYWNlUnNoaWZ0KHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9SU0hJRlQ6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZVJzaGlmdCh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9BTkQ6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfSW5QbGFjZUFuZCh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIElOUExBQ0VfQU5EOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VBbmQodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIElOUExBQ0VfWE9SOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VYb3Iodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX1hPUjoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlWG9yKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX09SOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VPcih2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIElOUExBQ0VfT1I6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZU9yKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBTTElDRSswOgotCQljYXNlIFNMSUNFKzE6Ci0JCWNhc2UgU0xJQ0UrMjoKLQkJY2FzZSBTTElDRSszOgotCQkJaWYgKChvcGNvZGUtU0xJQ0UpICYgMikKLQkJCQl3ID0gUE9QKCk7Ci0JCQllbHNlCi0JCQkJdyA9IE5VTEw7Ci0JCQlpZiAoKG9wY29kZS1TTElDRSkgJiAxKQotCQkJCXYgPSBQT1AoKTsKLQkJCWVsc2UKLQkJCQl2ID0gTlVMTDsKLQkJCXUgPSBUT1AoKTsKLQkJCXggPSBhcHBseV9zbGljZSh1LCB2LCB3KTsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCVB5X1hERUNSRUYodik7Ci0JCQlQeV9YREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgU0xJQ0UrMDoKKyAgICAgICAgY2FzZSBTTElDRSsxOgorICAgICAgICBjYXNlIFNMSUNFKzI6CisgICAgICAgIGNhc2UgU0xJQ0UrMzoKKyAgICAgICAgICAgIGlmICgob3Bjb2RlLVNMSUNFKSAmIDIpCisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHcgPSBOVUxMOworICAgICAgICAgICAgaWYgKChvcGNvZGUtU0xJQ0UpICYgMSkKKyAgICAgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICB1ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gYXBwbHlfc2xpY2UodSwgdiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgU1RPUkVfU0xJQ0UrMDoKLQkJY2FzZSBTVE9SRV9TTElDRSsxOgotCQljYXNlIFNUT1JFX1NMSUNFKzI6Ci0JCWNhc2UgU1RPUkVfU0xJQ0UrMzoKLQkJCWlmICgob3Bjb2RlLVNUT1JFX1NMSUNFKSAmIDIpCi0JCQkJdyA9IFBPUCgpOwotCQkJZWxzZQotCQkJCXcgPSBOVUxMOwotCQkJaWYgKChvcGNvZGUtU1RPUkVfU0xJQ0UpICYgMSkKLQkJCQl2ID0gUE9QKCk7Ci0JCQllbHNlCi0JCQkJdiA9IE5VTEw7Ci0JCQl1ID0gUE9QKCk7Ci0JCQl0ID0gUE9QKCk7Ci0JCQllcnIgPSBhc3NpZ25fc2xpY2UodSwgdiwgdywgdCk7IC8qIHVbdjp3XSA9IHQgKi8KLQkJCVB5X0RFQ1JFRih0KTsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCVB5X1hERUNSRUYodik7Ci0JCQlQeV9YREVDUkVGKHcpOwotCQkJaWYgKGVyciA9PSAwKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFNUT1JFX1NMSUNFKzA6CisgICAgICAgIGNhc2UgU1RPUkVfU0xJQ0UrMToKKyAgICAgICAgY2FzZSBTVE9SRV9TTElDRSsyOgorICAgICAgICBjYXNlIFNUT1JFX1NMSUNFKzM6CisgICAgICAgICAgICBpZiAoKG9wY29kZS1TVE9SRV9TTElDRSkgJiAyKQorICAgICAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3ID0gTlVMTDsKKyAgICAgICAgICAgIGlmICgob3Bjb2RlLVNUT1JFX1NMSUNFKSAmIDEpCisgICAgICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICAgICAgdSA9IFBPUCgpOworICAgICAgICAgICAgdCA9IFBPUCgpOworICAgICAgICAgICAgZXJyID0gYXNzaWduX3NsaWNlKHUsIHYsIHcsIHQpOyAvKiB1W3Y6d10gPSB0ICovCisgICAgICAgICAgICBQeV9ERUNSRUYodCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIERFTEVURV9TTElDRSswOgotCQljYXNlIERFTEVURV9TTElDRSsxOgotCQljYXNlIERFTEVURV9TTElDRSsyOgotCQljYXNlIERFTEVURV9TTElDRSszOgotCQkJaWYgKChvcGNvZGUtREVMRVRFX1NMSUNFKSAmIDIpCi0JCQkJdyA9IFBPUCgpOwotCQkJZWxzZQotCQkJCXcgPSBOVUxMOwotCQkJaWYgKChvcGNvZGUtREVMRVRFX1NMSUNFKSAmIDEpCi0JCQkJdiA9IFBPUCgpOwotCQkJZWxzZQotCQkJCXYgPSBOVUxMOwotCQkJdSA9IFBPUCgpOwotCQkJZXJyID0gYXNzaWduX3NsaWNlKHUsIHYsIHcsIChQeU9iamVjdCAqKU5VTEwpOwotCQkJCQkJCS8qIGRlbCB1W3Y6d10gKi8KLQkJCVB5X0RFQ1JFRih1KTsKLQkJCVB5X1hERUNSRUYodik7Ci0JCQlQeV9YREVDUkVGKHcpOwotCQkJaWYgKGVyciA9PSAwKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIERFTEVURV9TTElDRSswOgorICAgICAgICBjYXNlIERFTEVURV9TTElDRSsxOgorICAgICAgICBjYXNlIERFTEVURV9TTElDRSsyOgorICAgICAgICBjYXNlIERFTEVURV9TTElDRSszOgorICAgICAgICAgICAgaWYgKChvcGNvZGUtREVMRVRFX1NMSUNFKSAmIDIpCisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHcgPSBOVUxMOworICAgICAgICAgICAgaWYgKChvcGNvZGUtREVMRVRFX1NMSUNFKSAmIDEpCisgICAgICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICAgICAgdSA9IFBPUCgpOworICAgICAgICAgICAgZXJyID0gYXNzaWduX3NsaWNlKHUsIHYsIHcsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWwgdVt2OnddICovCisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFNUT1JFX1NVQlNDUjoKLQkJCXcgPSBUT1AoKTsKLQkJCXYgPSBTRUNPTkQoKTsKLQkJCXUgPSBUSElSRCgpOwotCQkJU1RBQ0tBREooLTMpOwotCQkJLyogdlt3XSA9IHUgKi8KLQkJCWVyciA9IFB5T2JqZWN0X1NldEl0ZW0odiwgdywgdSk7Ci0JCQlQeV9ERUNSRUYodSk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlpZiAoZXJyID09IDApIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUkVfU1VCU0NSOgorICAgICAgICAgICAgdyA9IFRPUCgpOworICAgICAgICAgICAgdiA9IFNFQ09ORCgpOworICAgICAgICAgICAgdSA9IFRISVJEKCk7CisgICAgICAgICAgICBTVEFDS0FESigtMyk7CisgICAgICAgICAgICAvKiB2W3ddID0gdSAqLworICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfU2V0SXRlbSh2LCB3LCB1KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIERFTEVURV9TVUJTQ1I6Ci0JCQl3ID0gVE9QKCk7Ci0JCQl2ID0gU0VDT05EKCk7Ci0JCQlTVEFDS0FESigtMik7Ci0JCQkvKiBkZWwgdlt3XSAqLwotCQkJZXJyID0gUHlPYmplY3RfRGVsSXRlbSh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCWlmIChlcnIgPT0gMCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBERUxFVEVfU1VCU0NSOgorICAgICAgICAgICAgdyA9IFRPUCgpOworICAgICAgICAgICAgdiA9IFNFQ09ORCgpOworICAgICAgICAgICAgU1RBQ0tBREooLTIpOworICAgICAgICAgICAgLyogZGVsIHZbd10gKi8KKyAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X0RlbEl0ZW0odiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBpZiAoZXJyID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQUklOVF9FWFBSOgotCQkJdiA9IFBPUCgpOwotCQkJdyA9IFB5U3lzX0dldE9iamVjdCgiZGlzcGxheWhvb2siKTsKLQkJCWlmICh3ID09IE5VTEwpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkJImxvc3Qgc3lzLmRpc3BsYXlob29rIik7Ci0JCQkJZXJyID0gLTE7Ci0JCQkJeCA9IE5VTEw7Ci0JCQl9Ci0JCQlpZiAoZXJyID09IDApIHsKLQkJCQl4ID0gUHlUdXBsZV9QYWNrKDEsIHYpOwotCQkJCWlmICh4ID09IE5VTEwpCi0JCQkJCWVyciA9IC0xOwotCQkJfQotCQkJaWYgKGVyciA9PSAwKSB7Ci0JCQkJdyA9IFB5RXZhbF9DYWxsT2JqZWN0KHcsIHgpOwotCQkJCVB5X1hERUNSRUYodyk7Ci0JCQkJaWYgKHcgPT0gTlVMTCkKLQkJCQkJZXJyID0gLTE7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9YREVDUkVGKHgpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUFJJTlRfRVhQUjoKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIHcgPSBQeVN5c19HZXRPYmplY3QoImRpc3BsYXlob29rIik7CisgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvc3Qgc3lzLmRpc3BsYXlob29rIik7CisgICAgICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICAgICAgeCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgICAgICB4ID0gUHlUdXBsZV9QYWNrKDEsIHYpOworICAgICAgICAgICAgICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICAgICAgdyA9IFB5RXZhbF9DYWxsT2JqZWN0KHcsIHgpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodyk7CisgICAgICAgICAgICAgICAgaWYgKHcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9YREVDUkVGKHgpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQUklOVF9JVEVNX1RPOgotCQkJdyA9IHN0cmVhbSA9IFBPUCgpOwotCQkJLyogZmFsbCB0aHJvdWdoIHRvIFBSSU5UX0lURU0gKi8KKyAgICAgICAgY2FzZSBQUklOVF9JVEVNX1RPOgorICAgICAgICAgICAgdyA9IHN0cmVhbSA9IFBPUCgpOworICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIHRvIFBSSU5UX0lURU0gKi8KIAotCQljYXNlIFBSSU5UX0lURU06Ci0JCQl2ID0gUE9QKCk7Ci0JCQlpZiAoc3RyZWFtID09IE5VTEwgfHwgc3RyZWFtID09IFB5X05vbmUpIHsKLQkJCQl3ID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKLQkJCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJCQkJImxvc3Qgc3lzLnN0ZG91dCIpOwotCQkJCQllcnIgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCQkvKiBQeUZpbGVfU29mdFNwYWNlKCkgY2FuIGV4ZWNlY3V0ZSBhcmJpdHJhcnkgY29kZQotCQkJICAgaWYgc3lzLnN0ZG91dCBpcyBhbiBpbnN0YW5jZSB3aXRoIGEgX19nZXRhdHRyX18uCi0JCQkgICBJZiBfX2dldGF0dHJfXyByYWlzZXMgYW4gZXhjZXB0aW9uLCB3IHdpbGwKLQkJCSAgIGJlIGZyZWVkLCBzbyB3ZSBuZWVkIHRvIHByZXZlbnQgdGhhdCB0ZW1wb3JhcmlseS4gKi8KLQkJCVB5X1hJTkNSRUYodyk7Ci0JCQlpZiAodyAhPSBOVUxMICYmIFB5RmlsZV9Tb2Z0U3BhY2UodywgMCkpCi0JCQkJZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCIgIiwgdyk7Ci0JCQlpZiAoZXJyID09IDApCi0JCQkJZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHYsIHcsIFB5X1BSSU5UX1JBVyk7Ci0JCQlpZiAoZXJyID09IDApIHsKLQkJCSAgICAvKiBYWFggbW92ZSBpbnRvIHdyaXRlb2JqZWN0KCkgPyAqLwotCQkJICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSkgewotCQkJCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcodik7Ci0JCQkJUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLQkJCQlpZiAobGVuID09IDAgfHwKLQkJCQkgICAgIWlzc3BhY2UoUHlfQ0hBUk1BU0soc1tsZW4tMV0pKSB8fAotCQkJCSAgICBzW2xlbi0xXSA9PSAnICcpCi0JCQkJCVB5RmlsZV9Tb2Z0U3BhY2UodywgMSk7Ci0JCQkgICAgfQorICAgICAgICBjYXNlIFBSSU5UX0lURU06CisgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IE5VTEwgfHwgc3RyZWFtID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICB3ID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKKyAgICAgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9zdCBzeXMuc3Rkb3V0Iik7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFB5RmlsZV9Tb2Z0U3BhY2UoKSBjYW4gZXhlY2VjdXRlIGFyYml0cmFyeSBjb2RlCisgICAgICAgICAgICAgICBpZiBzeXMuc3Rkb3V0IGlzIGFuIGluc3RhbmNlIHdpdGggYSBfX2dldGF0dHJfXy4KKyAgICAgICAgICAgICAgIElmIF9fZ2V0YXR0cl9fIHJhaXNlcyBhbiBleGNlcHRpb24sIHcgd2lsbAorICAgICAgICAgICAgICAgYmUgZnJlZWQsIHNvIHdlIG5lZWQgdG8gcHJldmVudCB0aGF0IHRlbXBvcmFyaWx5LiAqLworICAgICAgICAgICAgUHlfWElOQ1JFRih3KTsKKyAgICAgICAgICAgIGlmICh3ICE9IE5VTEwgJiYgUHlGaWxlX1NvZnRTcGFjZSh3LCAwKSkKKyAgICAgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIiAiLCB3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QodiwgdywgUHlfUFJJTlRfUkFXKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIFhYWCBtb3ZlIGludG8gd3JpdGVvYmplY3QoKSA/ICovCisgICAgICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyh2KTsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAhaXNzcGFjZShQeV9DSEFSTUFTSyhzW2xlbi0xXSkpIHx8CisgICAgICAgICAgICAgICAgICAgIHNbbGVuLTFdID09ICcgJykKKyAgICAgICAgICAgICAgICAgICAgUHlGaWxlX1NvZnRTcGFjZSh3LCAxKTsKKyAgICAgICAgICAgICAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQkJCVB5X1VOSUNPREUgKnMgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KTsKLQkJCQlQeV9zc2l6ZV90IGxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh2KTsKLQkJCQlpZiAobGVuID09IDAgfHwKLQkJCQkgICAgIVB5X1VOSUNPREVfSVNTUEFDRShzW2xlbi0xXSkgfHwKLQkJCQkgICAgc1tsZW4tMV0gPT0gJyAnKQotCQkJCSAgICBQeUZpbGVfU29mdFNwYWNlKHcsIDEpOwotCQkJICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBQeV9VTklDT0RFICpzID0gUHlVbmljb2RlX0FTX1VOSUNPREUodik7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUodik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICFQeV9VTklDT0RFX0lTU1BBQ0Uoc1tsZW4tMV0pIHx8CisgICAgICAgICAgICAgICAgICAgIHNbbGVuLTFdID09ICcgJykKKyAgICAgICAgICAgICAgICAgICAgUHlGaWxlX1NvZnRTcGFjZSh3LCAxKTsKKyAgICAgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCSAgICBlbHNlCi0JCQkgICAgCVB5RmlsZV9Tb2Z0U3BhY2UodywgMSk7Ci0JCQl9Ci0JCQlQeV9YREVDUkVGKHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfWERFQ1JFRihzdHJlYW0pOwotCQkJc3RyZWFtID0gTlVMTDsKLQkJCWlmIChlcnIgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeUZpbGVfU29mdFNwYWNlKHcsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoc3RyZWFtKTsKKyAgICAgICAgICAgIHN0cmVhbSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoZXJyID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBSSU5UX05FV0xJTkVfVE86Ci0JCQl3ID0gc3RyZWFtID0gUE9QKCk7Ci0JCQkvKiBmYWxsIHRocm91Z2ggdG8gUFJJTlRfTkVXTElORSAqLworICAgICAgICBjYXNlIFBSSU5UX05FV0xJTkVfVE86CisgICAgICAgICAgICB3ID0gc3RyZWFtID0gUE9QKCk7CisgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gUFJJTlRfTkVXTElORSAqLwogCi0JCWNhc2UgUFJJTlRfTkVXTElORToKLQkJCWlmIChzdHJlYW0gPT0gTlVMTCB8fCBzdHJlYW0gPT0gUHlfTm9uZSkgewotCQkJCXcgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOwotCQkJCWlmICh3ID09IE5VTEwpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJCQkibG9zdCBzeXMuc3Rkb3V0Iik7Ci0JCQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQkJfQotCQkJfQotCQkJaWYgKHcgIT0gTlVMTCkgewotCQkJCS8qIHcud3JpdGUoKSBtYXkgcmVwbGFjZSBzeXMuc3Rkb3V0LCBzbyB3ZQotCQkJCSAqIGhhdmUgdG8ga2VlcCBvdXIgcmVmZXJlbmNlIHRvIGl0ICovCi0JCQkJUHlfSU5DUkVGKHcpOwotCQkJCWVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCB3KTsKLQkJCQlpZiAoZXJyID09IDApCi0JCQkJCVB5RmlsZV9Tb2Z0U3BhY2UodywgMCk7Ci0JCQkJUHlfREVDUkVGKHcpOwotCQkJfQotCQkJUHlfWERFQ1JFRihzdHJlYW0pOwotCQkJc3RyZWFtID0gTlVMTDsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFBSSU5UX05FV0xJTkU6CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IE5VTEwgfHwgc3RyZWFtID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICB3ID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKKyAgICAgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9zdCBzeXMuc3Rkb3V0Iik7CisgICAgICAgICAgICAgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHcgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8qIHcud3JpdGUoKSBtYXkgcmVwbGFjZSBzeXMuc3Rkb3V0LCBzbyB3ZQorICAgICAgICAgICAgICAgICAqIGhhdmUgdG8ga2VlcCBvdXIgcmVmZXJlbmNlIHRvIGl0ICovCisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHcpOworICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCB3KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IDApCisgICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Tb2Z0U3BhY2UodywgMCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRihzdHJlYW0pOworICAgICAgICAgICAgc3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOwogCiAKICNpZmRlZiBDQVNFX1RPT19CSUcKLQkJZGVmYXVsdDogc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgZGVmYXVsdDogc3dpdGNoIChvcGNvZGUpIHsKICNlbmRpZgotCQljYXNlIFJBSVNFX1ZBUkFSR1M6Ci0JCQl1ID0gdiA9IHcgPSBOVUxMOwotCQkJc3dpdGNoIChvcGFyZykgewotCQkJY2FzZSAzOgotCQkJCXUgPSBQT1AoKTsgLyogdHJhY2ViYWNrICovCi0JCQkJLyogRmFsbHRocm91Z2ggKi8KLQkJCWNhc2UgMjoKLQkJCQl2ID0gUE9QKCk7IC8qIHZhbHVlICovCi0JCQkJLyogRmFsbHRocm91Z2ggKi8KLQkJCWNhc2UgMToKLQkJCQl3ID0gUE9QKCk7IC8qIGV4YyAqLwotCQkJY2FzZSAwOiAvKiBGYWxsdGhyb3VnaCAqLwotCQkJCXdoeSA9IGRvX3JhaXNlKHcsIHYsIHUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSAgICJiYWQgUkFJU0VfVkFSQVJHUyBvcGFyZyIpOwotCQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBSQUlTRV9WQVJBUkdTOgorICAgICAgICAgICAgdSA9IHYgPSB3ID0gTlVMTDsKKyAgICAgICAgICAgIHN3aXRjaCAob3BhcmcpIHsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICB1ID0gUE9QKCk7IC8qIHRyYWNlYmFjayAqLworICAgICAgICAgICAgICAgIC8qIEZhbGx0aHJvdWdoICovCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgdiA9IFBPUCgpOyAvKiB2YWx1ZSAqLworICAgICAgICAgICAgICAgIC8qIEZhbGx0aHJvdWdoICovCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOyAvKiBleGMgKi8KKyAgICAgICAgICAgIGNhc2UgMDogLyogRmFsbHRocm91Z2ggKi8KKyAgICAgICAgICAgICAgICB3aHkgPSBkb19yYWlzZSh3LCB2LCB1KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBSQUlTRV9WQVJBUkdTIG9wYXJnIik7CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTE9BRF9MT0NBTFM6Ci0JCQlpZiAoKHggPSBmLT5mX2xvY2FscykgIT0gTlVMTCkgewotCQkJCVB5X0lOQ1JFRih4KTsKLQkJCQlQVVNIKHgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAibm8gbG9jYWxzIik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBMT0FEX0xPQ0FMUzoKKyAgICAgICAgICAgIGlmICgoeCA9IGYtPmZfbG9jYWxzKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJubyBsb2NhbHMiKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUkVUVVJOX1ZBTFVFOgotCQkJcmV0dmFsID0gUE9QKCk7Ci0JCQl3aHkgPSBXSFlfUkVUVVJOOwotCQkJZ290byBmYXN0X2Jsb2NrX2VuZDsKKyAgICAgICAgY2FzZSBSRVRVUk5fVkFMVUU6CisgICAgICAgICAgICByZXR2YWwgPSBQT1AoKTsKKyAgICAgICAgICAgIHdoeSA9IFdIWV9SRVRVUk47CisgICAgICAgICAgICBnb3RvIGZhc3RfYmxvY2tfZW5kOwogCi0JCWNhc2UgWUlFTERfVkFMVUU6Ci0JCQlyZXR2YWwgPSBQT1AoKTsKLQkJCWYtPmZfc3RhY2t0b3AgPSBzdGFja19wb2ludGVyOwotCQkJd2h5ID0gV0hZX1lJRUxEOwotCQkJZ290byBmYXN0X3lpZWxkOworICAgICAgICBjYXNlIFlJRUxEX1ZBTFVFOgorICAgICAgICAgICAgcmV0dmFsID0gUE9QKCk7CisgICAgICAgICAgICBmLT5mX3N0YWNrdG9wID0gc3RhY2tfcG9pbnRlcjsKKyAgICAgICAgICAgIHdoeSA9IFdIWV9ZSUVMRDsKKyAgICAgICAgICAgIGdvdG8gZmFzdF95aWVsZDsKIAotCQljYXNlIEVYRUNfU1RNVDoKLQkJCXcgPSBUT1AoKTsKLQkJCXYgPSBTRUNPTkQoKTsKLQkJCXUgPSBUSElSRCgpOwotCQkJU1RBQ0tBREooLTMpOwotCQkJUkVBRF9USU1FU1RBTVAoaW50cjApOwotCQkJZXJyID0gZXhlY19zdGF0ZW1lbnQoZiwgdSwgdiwgdyk7Ci0JCQlSRUFEX1RJTUVTVEFNUChpbnRyMSk7Ci0JCQlQeV9ERUNSRUYodSk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBFWEVDX1NUTVQ6CisgICAgICAgICAgICB3ID0gVE9QKCk7CisgICAgICAgICAgICB2ID0gU0VDT05EKCk7CisgICAgICAgICAgICB1ID0gVEhJUkQoKTsKKyAgICAgICAgICAgIFNUQUNLQURKKC0zKTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIwKTsKKyAgICAgICAgICAgIGVyciA9IGV4ZWNfc3RhdGVtZW50KGYsIHUsIHYsIHcpOworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjEpOworICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQT1BfQkxPQ0s6Ci0JCQl7Ci0JCQkJUHlUcnlCbG9jayAqYiA9IFB5RnJhbWVfQmxvY2tQb3AoZik7Ci0JCQkJd2hpbGUgKFNUQUNLX0xFVkVMKCkgPiBiLT5iX2xldmVsKSB7Ci0JCQkJCXYgPSBQT1AoKTsKLQkJCQkJUHlfREVDUkVGKHYpOwotCQkJCX0KLQkJCX0KLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBPUF9CTE9DSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQeVRyeUJsb2NrICpiID0gUHlGcmFtZV9CbG9ja1BvcChmKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoU1RBQ0tfTEVWRUwoKSA+IGItPmJfbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CiAKLQkJUFJFRElDVEVEKEVORF9GSU5BTExZKTsKLQkJY2FzZSBFTkRfRklOQUxMWToKLQkJCXYgPSBQT1AoKTsKLQkJCWlmIChQeUludF9DaGVjayh2KSkgewotCQkJCXdoeSA9IChlbnVtIHdoeV9jb2RlKSBQeUludF9BU19MT05HKHYpOwotCQkJCWFzc2VydCh3aHkgIT0gV0hZX1lJRUxEKTsKLQkJCQlpZiAod2h5ID09IFdIWV9SRVRVUk4gfHwKLQkJCQkgICAgd2h5ID09IFdIWV9DT05USU5VRSkKLQkJCQkJcmV0dmFsID0gUE9QKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHYpIHx8Ci0JCQkgICAgICAgICBQeVN0cmluZ19DaGVjayh2KSkgewotCQkJCXcgPSBQT1AoKTsKLQkJCQl1ID0gUE9QKCk7Ci0JCQkJUHlFcnJfUmVzdG9yZSh2LCB3LCB1KTsKLQkJCQl3aHkgPSBXSFlfUkVSQUlTRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKHYgIT0gUHlfTm9uZSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJIidmaW5hbGx5JyBwb3BzIGJhZCBleGNlcHRpb24iKTsKLQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQkJYnJlYWs7CisgICAgICAgIFBSRURJQ1RFRChFTkRfRklOQUxMWSk7CisgICAgICAgIGNhc2UgRU5EX0ZJTkFMTFk6CisgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICB3aHkgPSAoZW51bSB3aHlfY29kZSkgUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgICAgICAgICBhc3NlcnQod2h5ICE9IFdIWV9ZSUVMRCk7CisgICAgICAgICAgICAgICAgaWYgKHdoeSA9PSBXSFlfUkVUVVJOIHx8CisgICAgICAgICAgICAgICAgICAgIHdoeSA9PSBXSFlfQ09OVElOVUUpCisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFBPUCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayh2KSB8fAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgdSA9IFBPUCgpOworICAgICAgICAgICAgICAgIFB5RXJyX1Jlc3RvcmUodiwgdywgdSk7CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX1JFUkFJU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2ICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICInZmluYWxseScgcG9wcyBiYWQgZXhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlVJTERfQ0xBU1M6Ci0JCQl1ID0gVE9QKCk7Ci0JCQl2ID0gU0VDT05EKCk7Ci0JCQl3ID0gVEhJUkQoKTsKLQkJCVNUQUNLQURKKC0yKTsKLQkJCXggPSBidWlsZF9jbGFzcyh1LCB2LCB3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlQeV9ERUNSRUYodSk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCVUlMRF9DTEFTUzoKKyAgICAgICAgICAgIHUgPSBUT1AoKTsKKyAgICAgICAgICAgIHYgPSBTRUNPTkQoKTsKKyAgICAgICAgICAgIHcgPSBUSElSRCgpOworICAgICAgICAgICAgU1RBQ0tBREooLTIpOworICAgICAgICAgICAgeCA9IGJ1aWxkX2NsYXNzKHUsIHYsIHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgU1RPUkVfTkFNRToKLQkJCXcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0JCQl2ID0gUE9QKCk7Ci0JCQlpZiAoKHggPSBmLT5mX2xvY2FscykgIT0gTlVMTCkgewotCQkJCWlmIChQeURpY3RfQ2hlY2tFeGFjdCh4KSkKLQkJCQkJZXJyID0gUHlEaWN0X1NldEl0ZW0oeCwgdywgdik7Ci0JCQkJZWxzZQotCQkJCQllcnIgPSBQeU9iamVjdF9TZXRJdGVtKHgsIHcsIHYpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlpZiAoZXJyID09IDApIGNvbnRpbnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSAgICAgIm5vIGxvY2FscyBmb3VuZCB3aGVuIHN0b3JpbmcgJXMiLAotCQkJCSAgICAgUHlPYmplY3RfUkVQUih3KSk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBTVE9SRV9OQU1FOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIGlmICgoeCA9IGYtPmZfbG9jYWxzKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KHgpKQorICAgICAgICAgICAgICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbSh4LCB3LCB2KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X1NldEl0ZW0oeCwgdywgdik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGxvY2FscyBmb3VuZCB3aGVuIHN0b3JpbmcgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JFUFIodykpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBERUxFVEVfTkFNRToKLQkJCXcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0JCQlpZiAoKHggPSBmLT5mX2xvY2FscykgIT0gTlVMTCkgewotCQkJCWlmICgoZXJyID0gUHlPYmplY3RfRGVsSXRlbSh4LCB3KSkgIT0gMCkKLQkJCQkJZm9ybWF0X2V4Y19jaGVja19hcmcoUHlFeGNfTmFtZUVycm9yLAotCQkJCQkJCSAgICAgTkFNRV9FUlJPUl9NU0csCi0JCQkJCQkJICAgICB3KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkgICAgICJubyBsb2NhbHMgd2hlbiBkZWxldGluZyAlcyIsCi0JCQkJICAgICBQeU9iamVjdF9SRVBSKHcpKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIERFTEVURV9OQU1FOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIGlmICgoeCA9IGYtPmZfbG9jYWxzKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBQeU9iamVjdF9EZWxJdGVtKHgsIHcpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeUV4Y19OYW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVfRVJST1JfTVNHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibm8gbG9jYWxzIHdoZW4gZGVsZXRpbmcgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JFUFIodykpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJUFJFRElDVEVEX1dJVEhfQVJHKFVOUEFDS19TRVFVRU5DRSk7Ci0JCWNhc2UgVU5QQUNLX1NFUVVFTkNFOgotCQkJdiA9IFBPUCgpOwotCQkJaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh2KSAmJgotCQkJICAgIFB5VHVwbGVfR0VUX1NJWkUodikgPT0gb3BhcmcpIHsKLQkJCQlQeU9iamVjdCAqKml0ZW1zID0gXAotCQkJCQkoKFB5VHVwbGVPYmplY3QgKil2KS0+b2JfaXRlbTsKLQkJCQl3aGlsZSAob3BhcmctLSkgewotCQkJCQl3ID0gaXRlbXNbb3BhcmddOwotCQkJCQlQeV9JTkNSRUYodyk7Ci0JCQkJCVBVU0godyk7Ci0JCQkJfQotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAoUHlMaXN0X0NoZWNrRXhhY3QodikgJiYKLQkJCQkgICBQeUxpc3RfR0VUX1NJWkUodikgPT0gb3BhcmcpIHsKLQkJCQlQeU9iamVjdCAqKml0ZW1zID0gXAotCQkJCQkoKFB5TGlzdE9iamVjdCAqKXYpLT5vYl9pdGVtOwotCQkJCXdoaWxlIChvcGFyZy0tKSB7Ci0JCQkJCXcgPSBpdGVtc1tvcGFyZ107Ci0JCQkJCVB5X0lOQ1JFRih3KTsKLQkJCQkJUFVTSCh3KTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHVucGFja19pdGVyYWJsZSh2LCBvcGFyZywKLQkJCQkJCSAgIHN0YWNrX3BvaW50ZXIgKyBvcGFyZykpIHsKLQkJCQlTVEFDS0FESihvcGFyZyk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIHVucGFja19pdGVyYWJsZSgpIHJhaXNlZCBhbiBleGNlcHRpb24gKi8KLQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQkJYnJlYWs7CisgICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhVTlBBQ0tfU0VRVUVOQ0UpOworICAgICAgICBjYXNlIFVOUEFDS19TRVFVRU5DRToKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QodikgJiYKKyAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKHYpID09IG9wYXJnKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKippdGVtcyA9IFwKKyAgICAgICAgICAgICAgICAgICAgKChQeVR1cGxlT2JqZWN0ICopdiktPm9iX2l0ZW07CisgICAgICAgICAgICAgICAgd2hpbGUgKG9wYXJnLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgdyA9IGl0ZW1zW29wYXJnXTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHcpOworICAgICAgICAgICAgICAgICAgICBQVVNIKHcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHYpICYmCisgICAgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfU0laRSh2KSA9PSBvcGFyZykgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqaXRlbXMgPSBcCisgICAgICAgICAgICAgICAgICAgICgoUHlMaXN0T2JqZWN0ICopdiktPm9iX2l0ZW07CisgICAgICAgICAgICAgICAgd2hpbGUgKG9wYXJnLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgdyA9IGl0ZW1zW29wYXJnXTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHcpOworICAgICAgICAgICAgICAgICAgICBQVVNIKHcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodW5wYWNrX2l0ZXJhYmxlKHYsIG9wYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfcG9pbnRlciArIG9wYXJnKSkgeworICAgICAgICAgICAgICAgIFNUQUNLQURKKG9wYXJnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogdW5wYWNrX2l0ZXJhYmxlKCkgcmFpc2VkIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFNUT1JFX0FUVFI6Ci0JCQl3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwotCQkJdiA9IFRPUCgpOwotCQkJdSA9IFNFQ09ORCgpOwotCQkJU1RBQ0tBREooLTIpOwotCQkJZXJyID0gUHlPYmplY3RfU2V0QXR0cih2LCB3LCB1KTsgLyogdi53ID0gdSAqLwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHUpOwotCQkJaWYgKGVyciA9PSAwKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFNUT1JFX0FUVFI6CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgdSA9IFNFQ09ORCgpOworICAgICAgICAgICAgU1RBQ0tBREooLTIpOworICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfU2V0QXR0cih2LCB3LCB1KTsgLyogdi53ID0gdSAqLworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgREVMRVRFX0FUVFI6Ci0JCQl3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwotCQkJdiA9IFBPUCgpOwotCQkJZXJyID0gUHlPYmplY3RfU2V0QXR0cih2LCB3LCAoUHlPYmplY3QgKilOVUxMKTsKLQkJCQkJCQkvKiBkZWwgdi53ICovCi0JCQlQeV9ERUNSRUYodik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBERUxFVEVfQVRUUjoKKyAgICAgICAgICAgIHcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7CisgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBlcnIgPSBQeU9iamVjdF9TZXRBdHRyKHYsIHcsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWwgdi53ICovCisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFNUT1JFX0dMT0JBTDoKLQkJCXcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0JCQl2ID0gUE9QKCk7Ci0JCQllcnIgPSBQeURpY3RfU2V0SXRlbShmLT5mX2dsb2JhbHMsIHcsIHYpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJaWYgKGVyciA9PSAwKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFNUT1JFX0dMT0JBTDoKKyAgICAgICAgICAgIHcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7CisgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbShmLT5mX2dsb2JhbHMsIHcsIHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgREVMRVRFX0dMT0JBTDoKLQkJCXcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0JCQlpZiAoKGVyciA9IFB5RGljdF9EZWxJdGVtKGYtPmZfZ2xvYmFscywgdykpICE9IDApCi0JCQkJZm9ybWF0X2V4Y19jaGVja19hcmcoCi0JCQkJICAgIFB5RXhjX05hbWVFcnJvciwgR0xPQkFMX05BTUVfRVJST1JfTVNHLCB3KTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIERFTEVURV9HTE9CQUw6CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgaWYgKChlcnIgPSBQeURpY3RfRGVsSXRlbShmLT5mX2dsb2JhbHMsIHcpKSAhPSAwKQorICAgICAgICAgICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKAorICAgICAgICAgICAgICAgICAgICBQeUV4Y19OYW1lRXJyb3IsIEdMT0JBTF9OQU1FX0VSUk9SX01TRywgdyk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIExPQURfTkFNRToKLQkJCXcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0JCQlpZiAoKHYgPSBmLT5mX2xvY2FscykgPT0gTlVMTCkgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJICAgICAibm8gbG9jYWxzIHdoZW4gbG9hZGluZyAlcyIsCi0JCQkJCSAgICAgUHlPYmplY3RfUkVQUih3KSk7Ci0JCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChQeURpY3RfQ2hlY2tFeGFjdCh2KSkgewotCQkJCXggPSBQeURpY3RfR2V0SXRlbSh2LCB3KTsKLQkJCQlQeV9YSU5DUkVGKHgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJeCA9IFB5T2JqZWN0X0dldEl0ZW0odiwgdyk7Ci0JCQkJaWYgKHggPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcygKLQkJCQkJCQlQeUV4Y19LZXlFcnJvcikpCi0JCQkJCQlicmVhazsKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoeCA9PSBOVUxMKSB7Ci0JCQkJeCA9IFB5RGljdF9HZXRJdGVtKGYtPmZfZ2xvYmFscywgdyk7Ci0JCQkJaWYgKHggPT0gTlVMTCkgewotCQkJCQl4ID0gUHlEaWN0X0dldEl0ZW0oZi0+Zl9idWlsdGlucywgdyk7Ci0JCQkJCWlmICh4ID09IE5VTEwpIHsKLQkJCQkJCWZvcm1hdF9leGNfY2hlY2tfYXJnKAotCQkJCQkJCSAgICBQeUV4Y19OYW1lRXJyb3IsCi0JCQkJCQkJICAgIE5BTUVfRVJST1JfTVNHLCB3KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCVB5X0lOQ1JFRih4KTsKLQkJCX0KLQkJCVBVU0goeCk7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT0FEX05BTUU6CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgaWYgKCh2ID0gZi0+Zl9sb2NhbHMpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBsb2NhbHMgd2hlbiBsb2FkaW5nICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfUkVQUih3KSk7CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICAgICAgICAgIHggPSBQeURpY3RfR2V0SXRlbSh2LCB3KTsKKyAgICAgICAgICAgICAgICBQeV9YSU5DUkVGKHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgeCA9IFB5T2JqZWN0X0dldEl0ZW0odiwgdyk7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX0tleUVycm9yKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB4ID0gUHlEaWN0X0dldEl0ZW0oZi0+Zl9nbG9iYWxzLCB3KTsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSBQeURpY3RfR2V0SXRlbShmLT5mX2J1aWx0aW5zLCB3KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X2V4Y19jaGVja19hcmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19OYW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FX0VSUk9SX01TRywgdyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMT0FEX0dMT0JBTDoKLQkJCXcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0JCQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh3KSkgewotCQkJCS8qIElubGluZSB0aGUgUHlEaWN0X0dldEl0ZW0oKSBjYWxscy4KLQkJCQkgICBXQVJOSU5HOiB0aGlzIGlzIGFuIGV4dHJlbWUgc3BlZWQgaGFjay4KLQkJCQkgICBEbyBub3QgdHJ5IHRoaXMgYXQgaG9tZS4gKi8KLQkJCQlsb25nIGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopdyktPm9iX3NoYXNoOwotCQkJCWlmIChoYXNoICE9IC0xKSB7Ci0JCQkJCVB5RGljdE9iamVjdCAqZDsKLQkJCQkJUHlEaWN0RW50cnkgKmU7Ci0JCQkJCWQgPSAoUHlEaWN0T2JqZWN0ICopKGYtPmZfZ2xvYmFscyk7Ci0JCQkJCWUgPSBkLT5tYV9sb29rdXAoZCwgdywgaGFzaCk7Ci0JCQkJCWlmIChlID09IE5VTEwpIHsKLQkJCQkJCXggPSBOVUxMOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJeCA9IGUtPm1lX3ZhbHVlOwotCQkJCQlpZiAoeCAhPSBOVUxMKSB7Ci0JCQkJCQlQeV9JTkNSRUYoeCk7Ci0JCQkJCQlQVVNIKHgpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZCA9IChQeURpY3RPYmplY3QgKikoZi0+Zl9idWlsdGlucyk7Ci0JCQkJCWUgPSBkLT5tYV9sb29rdXAoZCwgdywgaGFzaCk7Ci0JCQkJCWlmIChlID09IE5VTEwpIHsKLQkJCQkJCXggPSBOVUxMOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJeCA9IGUtPm1lX3ZhbHVlOwotCQkJCQlpZiAoeCAhPSBOVUxMKSB7Ci0JCQkJCQlQeV9JTkNSRUYoeCk7Ci0JCQkJCQlQVVNIKHgpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZ290byBsb2FkX2dsb2JhbF9lcnJvcjsKLQkJCQl9Ci0JCQl9Ci0JCQkvKiBUaGlzIGlzIHRoZSB1bi1pbmxpbmVkIHZlcnNpb24gb2YgdGhlIGNvZGUgYWJvdmUgKi8KLQkJCXggPSBQeURpY3RfR2V0SXRlbShmLT5mX2dsb2JhbHMsIHcpOwotCQkJaWYgKHggPT0gTlVMTCkgewotCQkJCXggPSBQeURpY3RfR2V0SXRlbShmLT5mX2J1aWx0aW5zLCB3KTsKLQkJCQlpZiAoeCA9PSBOVUxMKSB7Ci0JCQkJICBsb2FkX2dsb2JhbF9lcnJvcjoKLQkJCQkJZm9ybWF0X2V4Y19jaGVja19hcmcoCi0JCQkJCQkgICAgUHlFeGNfTmFtZUVycm9yLAotCQkJCQkJICAgIEdMT0JBTF9OQU1FX0VSUk9SX01TRywgdyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCVB5X0lOQ1JFRih4KTsKLQkJCVBVU0goeCk7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT0FEX0dMT0JBTDoKKyAgICAgICAgICAgIHcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh3KSkgeworICAgICAgICAgICAgICAgIC8qIElubGluZSB0aGUgUHlEaWN0X0dldEl0ZW0oKSBjYWxscy4KKyAgICAgICAgICAgICAgICAgICBXQVJOSU5HOiB0aGlzIGlzIGFuIGV4dHJlbWUgc3BlZWQgaGFjay4KKyAgICAgICAgICAgICAgICAgICBEbyBub3QgdHJ5IHRoaXMgYXQgaG9tZS4gKi8KKyAgICAgICAgICAgICAgICBsb25nIGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopdyktPm9iX3NoYXNoOworICAgICAgICAgICAgICAgIGlmIChoYXNoICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RGljdE9iamVjdCAqZDsKKyAgICAgICAgICAgICAgICAgICAgUHlEaWN0RW50cnkgKmU7CisgICAgICAgICAgICAgICAgICAgIGQgPSAoUHlEaWN0T2JqZWN0ICopKGYtPmZfZ2xvYmFscyk7CisgICAgICAgICAgICAgICAgICAgIGUgPSBkLT5tYV9sb29rdXAoZCwgdywgaGFzaCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeCA9IGUtPm1lX3ZhbHVlOworICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZCA9IChQeURpY3RPYmplY3QgKikoZi0+Zl9idWlsdGlucyk7CisgICAgICAgICAgICAgICAgICAgIGUgPSBkLT5tYV9sb29rdXAoZCwgdywgaGFzaCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeCA9IGUtPm1lX3ZhbHVlOworICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZ290byBsb2FkX2dsb2JhbF9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSB1bi1pbmxpbmVkIHZlcnNpb24gb2YgdGhlIGNvZGUgYWJvdmUgKi8KKyAgICAgICAgICAgIHggPSBQeURpY3RfR2V0SXRlbShmLT5mX2dsb2JhbHMsIHcpOworICAgICAgICAgICAgaWYgKHggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHggPSBQeURpY3RfR2V0SXRlbShmLT5mX2J1aWx0aW5zLCB3KTsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICBsb2FkX2dsb2JhbF9lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0X2V4Y19jaGVja19hcmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX05hbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX05BTUVfRVJST1JfTVNHLCB3KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgREVMRVRFX0ZBU1Q6Ci0JCQl4ID0gR0VUTE9DQUwob3BhcmcpOwotCQkJaWYgKHggIT0gTlVMTCkgewotCQkJCVNFVExPQ0FMKG9wYXJnLCBOVUxMKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWZvcm1hdF9leGNfY2hlY2tfYXJnKAotCQkJCVB5RXhjX1VuYm91bmRMb2NhbEVycm9yLAotCQkJCVVOQk9VTkRMT0NBTF9FUlJPUl9NU0csCi0JCQkJUHlUdXBsZV9HZXRJdGVtKGNvLT5jb192YXJuYW1lcywgb3BhcmcpCi0JCQkJKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIERFTEVURV9GQVNUOgorICAgICAgICAgICAgeCA9IEdFVExPQ0FMKG9wYXJnKTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBTRVRMT0NBTChvcGFyZywgTlVMTCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZygKKyAgICAgICAgICAgICAgICBQeUV4Y19VbmJvdW5kTG9jYWxFcnJvciwKKyAgICAgICAgICAgICAgICBVTkJPVU5ETE9DQUxfRVJST1JfTVNHLAorICAgICAgICAgICAgICAgIFB5VHVwbGVfR2V0SXRlbShjby0+Y29fdmFybmFtZXMsIG9wYXJnKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIExPQURfQ0xPU1VSRToKLQkJCXggPSBmcmVldmFyc1tvcGFyZ107Ci0JCQlQeV9JTkNSRUYoeCk7Ci0JCQlQVVNIKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBMT0FEX0NMT1NVUkU6CisgICAgICAgICAgICB4ID0gZnJlZXZhcnNbb3BhcmddOworICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBMT0FEX0RFUkVGOgotCQkJeCA9IGZyZWV2YXJzW29wYXJnXTsKLQkJCXcgPSBQeUNlbGxfR2V0KHgpOwotCQkJaWYgKHcgIT0gTlVMTCkgewotCQkJCVBVU0godyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllcnIgPSAtMTsKLQkJCS8qIERvbid0IHN0b21wIGV4aXN0aW5nIGV4Y2VwdGlvbiAqLwotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAob3BhcmcgPCBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycykpIHsKLQkJCQl2ID0gUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fY2VsbHZhcnMsCi0JCQkJCQkgICAgICAgb3BhcmcpOwotCQkJICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKAotCQkJCSAgICAgICBQeUV4Y19VbmJvdW5kTG9jYWxFcnJvciwKLQkJCQkgICAgICAgVU5CT1VORExPQ0FMX0VSUk9SX01TRywKLQkJCQkgICAgICAgdik7Ci0JCQl9IGVsc2UgewotCQkJCXYgPSBQeVR1cGxlX0dFVF9JVEVNKGNvLT5jb19mcmVldmFycywgb3BhcmcgLQotCQkJCQlQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycykpOwotCQkJCWZvcm1hdF9leGNfY2hlY2tfYXJnKFB5RXhjX05hbWVFcnJvciwKLQkJCQkJCSAgICAgVU5CT1VOREZSRUVfRVJST1JfTVNHLCB2KTsKLQkJCX0KLQkJCWJyZWFrOworICAgICAgICBjYXNlIExPQURfREVSRUY6CisgICAgICAgICAgICB4ID0gZnJlZXZhcnNbb3BhcmddOworICAgICAgICAgICAgdyA9IFB5Q2VsbF9HZXQoeCk7CisgICAgICAgICAgICBpZiAodyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUFVTSCh3KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgLyogRG9uJ3Qgc3RvbXAgZXhpc3RpbmcgZXhjZXB0aW9uICovCisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChvcGFyZyA8IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSkgeworICAgICAgICAgICAgICAgIHYgPSBQeVR1cGxlX0dFVF9JVEVNKGNvLT5jb19jZWxsdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYXJnKTsKKyAgICAgICAgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZygKKyAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgIFVOQk9VTkRMT0NBTF9FUlJPUl9NU0csCisgICAgICAgICAgICAgICAgICAgICAgIHYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2ID0gUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fZnJlZXZhcnMsIG9wYXJnIC0KKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpKTsKKyAgICAgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeUV4Y19OYW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5CT1VOREZSRUVfRVJST1JfTVNHLCB2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgU1RPUkVfREVSRUY6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl4ID0gZnJlZXZhcnNbb3BhcmddOwotCQkJUHlDZWxsX1NldCh4LCB3KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFNUT1JFX0RFUkVGOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgeCA9IGZyZWV2YXJzW29wYXJnXTsKKyAgICAgICAgICAgIFB5Q2VsbF9TZXQoeCwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJVSUxEX1RVUExFOgotCQkJeCA9IFB5VHVwbGVfTmV3KG9wYXJnKTsKLQkJCWlmICh4ICE9IE5VTEwpIHsKLQkJCQlmb3IgKDsgLS1vcGFyZyA+PSAwOykgewotCQkJCQl3ID0gUE9QKCk7Ci0JCQkJCVB5VHVwbGVfU0VUX0lURU0oeCwgb3BhcmcsIHcpOwotCQkJCX0KLQkJCQlQVVNIKHgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlVJTERfVFVQTEU6CisgICAgICAgICAgICB4ID0gUHlUdXBsZV9OZXcob3BhcmcpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZvciAoOyAtLW9wYXJnID49IDA7KSB7CisgICAgICAgICAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh4LCBvcGFyZywgdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJVSUxEX0xJU1Q6Ci0JCQl4ID0gIFB5TGlzdF9OZXcob3BhcmcpOwotCQkJaWYgKHggIT0gTlVMTCkgewotCQkJCWZvciAoOyAtLW9wYXJnID49IDA7KSB7Ci0JCQkJCXcgPSBQT1AoKTsKLQkJCQkJUHlMaXN0X1NFVF9JVEVNKHgsIG9wYXJnLCB3KTsKLQkJCQl9Ci0JCQkJUFVTSCh4KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJVSUxEX0xJU1Q6CisgICAgICAgICAgICB4ID0gIFB5TGlzdF9OZXcob3BhcmcpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZvciAoOyAtLW9wYXJnID49IDA7KSB7CisgICAgICAgICAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHgsIG9wYXJnLCB3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlVJTERfU0VUOgotCQkJeCA9IFB5U2V0X05ldyhOVUxMKTsKLQkJCWlmICh4ICE9IE5VTEwpIHsKLQkJCQlmb3IgKDsgLS1vcGFyZyA+PSAwOykgewotCQkJCQl3ID0gUE9QKCk7Ci0JCQkJCWlmIChlcnIgPT0gMCkKLQkJCQkJCWVyciA9IFB5U2V0X0FkZCh4LCB3KTsKLQkJCQkJUHlfREVDUkVGKHcpOwotCQkJCX0KLQkJCQlpZiAoZXJyICE9IDApIHsKLQkJCQkJUHlfREVDUkVGKHgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJUFVTSCh4KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJVSUxEX1NFVDoKKyAgICAgICAgICAgIHggPSBQeVNldF9OZXcoTlVMTCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZm9yICg7IC0tb3BhcmcgPj0gMDspIHsKKyAgICAgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBQeVNldF9BZGQoeCwgdyk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAogCi0JCWNhc2UgQlVJTERfTUFQOgotCQkJeCA9IF9QeURpY3RfTmV3UHJlc2l6ZWQoKFB5X3NzaXplX3Qpb3BhcmcpOwotCQkJUFVTSCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlVJTERfTUFQOgorICAgICAgICAgICAgeCA9IF9QeURpY3RfTmV3UHJlc2l6ZWQoKFB5X3NzaXplX3Qpb3BhcmcpOworICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBTVE9SRV9NQVA6Ci0JCQl3ID0gVE9QKCk7ICAgICAvKiBrZXkgKi8KLQkJCXUgPSBTRUNPTkQoKTsgIC8qIHZhbHVlICovCi0JCQl2ID0gVEhJUkQoKTsgICAvKiBkaWN0ICovCi0JCQlTVEFDS0FESigtMik7Ci0JCQlhc3NlcnQgKFB5RGljdF9DaGVja0V4YWN0KHYpKTsKLQkJCWVyciA9IFB5RGljdF9TZXRJdGVtKHYsIHcsIHUpOyAgLyogdlt3XSA9IHUgKi8KLQkJCVB5X0RFQ1JFRih1KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCWlmIChlcnIgPT0gMCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBTVE9SRV9NQVA6CisgICAgICAgICAgICB3ID0gVE9QKCk7ICAgICAvKiBrZXkgKi8KKyAgICAgICAgICAgIHUgPSBTRUNPTkQoKTsgIC8qIHZhbHVlICovCisgICAgICAgICAgICB2ID0gVEhJUkQoKTsgICAvKiBkaWN0ICovCisgICAgICAgICAgICBTVEFDS0FESigtMik7CisgICAgICAgICAgICBhc3NlcnQgKFB5RGljdF9DaGVja0V4YWN0KHYpKTsKKyAgICAgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKHYsIHcsIHUpOyAgLyogdlt3XSA9IHUgKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIE1BUF9BREQ6Ci0JCQl3ID0gVE9QKCk7ICAgICAvKiBrZXkgKi8KLQkJCXUgPSBTRUNPTkQoKTsgIC8qIHZhbHVlICovCi0JCQlTVEFDS0FESigtMik7Ci0JCQl2ID0gc3RhY2tfcG9pbnRlclstb3BhcmddOyAgLyogZGljdCAqLwotCQkJYXNzZXJ0IChQeURpY3RfQ2hlY2tFeGFjdCh2KSk7Ci0JCQllcnIgPSBQeURpY3RfU2V0SXRlbSh2LCB3LCB1KTsgIC8qIHZbd10gPSB1ICovCi0JCQlQeV9ERUNSRUYodSk7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlpZiAoZXJyID09IDApIHsKLQkJCQlQUkVESUNUKEpVTVBfQUJTT0xVVEUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgTUFQX0FERDoKKyAgICAgICAgICAgIHcgPSBUT1AoKTsgICAgIC8qIGtleSAqLworICAgICAgICAgICAgdSA9IFNFQ09ORCgpOyAgLyogdmFsdWUgKi8KKyAgICAgICAgICAgIFNUQUNLQURKKC0yKTsKKyAgICAgICAgICAgIHYgPSBzdGFja19wb2ludGVyWy1vcGFyZ107ICAvKiBkaWN0ICovCisgICAgICAgICAgICBhc3NlcnQgKFB5RGljdF9DaGVja0V4YWN0KHYpKTsKKyAgICAgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKHYsIHcsIHUpOyAgLyogdlt3XSA9IHUgKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgICAgIFBSRURJQ1QoSlVNUF9BQlNPTFVURSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIExPQURfQVRUUjoKLQkJCXcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlPYmplY3RfR2V0QXR0cih2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIExPQURfQVRUUjoKKyAgICAgICAgICAgIHcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlPYmplY3RfR2V0QXR0cih2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQ09NUEFSRV9PUDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCWlmIChQeUludF9DaGVja0V4YWN0KHcpICYmIFB5SW50X0NoZWNrRXhhY3QodikpIHsKLQkJCQkvKiBJTkxJTkU6IGNtcChpbnQsIGludCkgKi8KLQkJCQlyZWdpc3RlciBsb25nIGEsIGI7Ci0JCQkJcmVnaXN0ZXIgaW50IHJlczsKLQkJCQlhID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJCQliID0gUHlJbnRfQVNfTE9ORyh3KTsKLQkJCQlzd2l0Y2ggKG9wYXJnKSB7Ci0JCQkJY2FzZSBQeUNtcF9MVDogcmVzID0gYSA8ICBiOyBicmVhazsKLQkJCQljYXNlIFB5Q21wX0xFOiByZXMgPSBhIDw9IGI7IGJyZWFrOwotCQkJCWNhc2UgUHlDbXBfRVE6IHJlcyA9IGEgPT0gYjsgYnJlYWs7Ci0JCQkJY2FzZSBQeUNtcF9ORTogcmVzID0gYSAhPSBiOyBicmVhazsKLQkJCQljYXNlIFB5Q21wX0dUOiByZXMgPSBhID4gIGI7IGJyZWFrOwotCQkJCWNhc2UgUHlDbXBfR0U6IHJlcyA9IGEgPj0gYjsgYnJlYWs7Ci0JCQkJY2FzZSBQeUNtcF9JUzogcmVzID0gdiA9PSB3OyBicmVhazsKLQkJCQljYXNlIFB5Q21wX0lTX05PVDogcmVzID0gdiAhPSB3OyBicmVhazsKLQkJCQlkZWZhdWx0OiBnb3RvIHNsb3dfY29tcGFyZTsKLQkJCQl9Ci0JCQkJeCA9IHJlcyA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQkJCQlQeV9JTkNSRUYoeCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCSAgc2xvd19jb21wYXJlOgotCQkJCXggPSBjbXBfb3V0Y29tZShvcGFyZywgdiwgdyk7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggPT0gTlVMTCkgYnJlYWs7Ci0JCQlQUkVESUNUKFBPUF9KVU1QX0lGX0ZBTFNFKTsKLQkJCVBSRURJQ1QoUE9QX0pVTVBfSUZfVFJVRSk7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBDT01QQVJFX09QOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QodykgJiYgUHlJbnRfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICAgICAgICAgIC8qIElOTElORTogY21wKGludCwgaW50KSAqLworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGxvbmcgYSwgYjsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBpbnQgcmVzOworICAgICAgICAgICAgICAgIGEgPSBQeUludF9BU19MT05HKHYpOworICAgICAgICAgICAgICAgIGIgPSBQeUludF9BU19MT05HKHcpOworICAgICAgICAgICAgICAgIHN3aXRjaCAob3BhcmcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFB5Q21wX0xUOiByZXMgPSBhIDwgIGI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHlDbXBfTEU6IHJlcyA9IGEgPD0gYjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQeUNtcF9FUTogcmVzID0gYSA9PSBiOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFB5Q21wX05FOiByZXMgPSBhICE9IGI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHlDbXBfR1Q6IHJlcyA9IGEgPiAgYjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQeUNtcF9HRTogcmVzID0gYSA+PSBiOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFB5Q21wX0lTOiByZXMgPSB2ID09IHc7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHlDbXBfSVNfTk9UOiByZXMgPSB2ICE9IHc7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGdvdG8gc2xvd19jb21wYXJlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4ID0gcmVzID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBzbG93X2NvbXBhcmU6CisgICAgICAgICAgICAgICAgeCA9IGNtcF9vdXRjb21lKG9wYXJnLCB2LCB3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCA9PSBOVUxMKSBicmVhazsKKyAgICAgICAgICAgIFBSRURJQ1QoUE9QX0pVTVBfSUZfRkFMU0UpOworICAgICAgICAgICAgUFJFRElDVChQT1BfSlVNUF9JRl9UUlVFKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgSU1QT1JUX05BTUU6Ci0JCQl3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwotCQkJeCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGYtPmZfYnVpbHRpbnMsICJfX2ltcG9ydF9fIik7Ci0JCQlpZiAoeCA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCQkJIl9faW1wb3J0X18gbm90IGZvdW5kIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlQeV9JTkNSRUYoeCk7Ci0JCQl2ID0gUE9QKCk7Ci0JCQl1ID0gVE9QKCk7Ci0JCQlpZiAoUHlJbnRfQXNMb25nKHUpICE9IC0xIHx8IFB5RXJyX09jY3VycmVkKCkpCi0JCQkJdyA9IFB5VHVwbGVfUGFjayg1LAotCQkJCQkgICAgdywKLQkJCQkJICAgIGYtPmZfZ2xvYmFscywKLQkJCQkJICAgIGYtPmZfbG9jYWxzID09IE5VTEwgPwotCQkJCQkJICBQeV9Ob25lIDogZi0+Zl9sb2NhbHMsCi0JCQkJCSAgICB2LAotCQkJCQkgICAgdSk7Ci0JCQllbHNlCi0JCQkJdyA9IFB5VHVwbGVfUGFjayg0LAotCQkJCQkgICAgdywKLQkJCQkJICAgIGYtPmZfZ2xvYmFscywKLQkJCQkJICAgIGYtPmZfbG9jYWxzID09IE5VTEwgPwotCQkJCQkJICBQeV9Ob25lIDogZi0+Zl9sb2NhbHMsCi0JCQkJCSAgICB2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCWlmICh3ID09IE5VTEwpIHsKLQkJCQl1ID0gUE9QKCk7Ci0JCQkJUHlfREVDUkVGKHgpOwotCQkJCXggPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUkVBRF9USU1FU1RBTVAoaW50cjApOwotCQkJdiA9IHg7Ci0JCQl4ID0gUHlFdmFsX0NhbGxPYmplY3Qodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlSRUFEX1RJTUVTVEFNUChpbnRyMSk7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTVBPUlRfTkFNRToKKyAgICAgICAgICAgIHcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7CisgICAgICAgICAgICB4ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZi0+Zl9idWlsdGlucywgIl9faW1wb3J0X18iKTsKKyAgICAgICAgICAgIGlmICh4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ltcG9ydF9fIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgdSA9IFRPUCgpOworICAgICAgICAgICAgaWYgKFB5SW50X0FzTG9uZyh1KSAhPSAtMSB8fCBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHcgPSBQeVR1cGxlX1BhY2soNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2xvY2FscyA9PSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lIDogZi0+Zl9sb2NhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3ID0gUHlUdXBsZV9QYWNrKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2dsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9sb2NhbHMgPT0gTlVMTCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSA6IGYtPmZfbG9jYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHUgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgICAgICAgICAgICAgeCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnRyMCk7CisgICAgICAgICAgICB2ID0geDsKKyAgICAgICAgICAgIHggPSBQeUV2YWxfQ2FsbE9iamVjdCh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIxKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU1QT1JUX1NUQVI6Ci0JCQl2ID0gUE9QKCk7Ci0JCQlQeUZyYW1lX0Zhc3RUb0xvY2FscyhmKTsKLQkJCWlmICgoeCA9IGYtPmZfbG9jYWxzKSA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkibm8gbG9jYWxzIGZvdW5kIGR1cmluZyAnaW1wb3J0IConIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlSRUFEX1RJTUVTVEFNUChpbnRyMCk7Ci0JCQllcnIgPSBpbXBvcnRfYWxsX2Zyb20oeCwgdik7Ci0JCQlSRUFEX1RJTUVTVEFNUChpbnRyMSk7Ci0JCQlQeUZyYW1lX0xvY2Fsc1RvRmFzdChmLCAwKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWlmIChlcnIgPT0gMCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTVBPUlRfU1RBUjoKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIFB5RnJhbWVfRmFzdFRvTG9jYWxzKGYpOworICAgICAgICAgICAgaWYgKCh4ID0gZi0+Zl9sb2NhbHMpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJubyBsb2NhbHMgZm91bmQgZHVyaW5nICdpbXBvcnQgKiciKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIwKTsKKyAgICAgICAgICAgIGVyciA9IGltcG9ydF9hbGxfZnJvbSh4LCB2KTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIxKTsKKyAgICAgICAgICAgIFB5RnJhbWVfTG9jYWxzVG9GYXN0KGYsIDApOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU1QT1JUX0ZST006Ci0JCQl3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwotCQkJdiA9IFRPUCgpOwotCQkJUkVBRF9USU1FU1RBTVAoaW50cjApOwotCQkJeCA9IGltcG9ydF9mcm9tKHYsIHcpOwotCQkJUkVBRF9USU1FU1RBTVAoaW50cjEpOwotCQkJUFVTSCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU1QT1JUX0ZST006CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjApOworICAgICAgICAgICAgeCA9IGltcG9ydF9mcm9tKHYsIHcpOworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjEpOworICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBKVU1QX0ZPUldBUkQ6Ci0JCQlKVU1QQlkob3BhcmcpOwotCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICBjYXNlIEpVTVBfRk9SV0FSRDoKKyAgICAgICAgICAgIEpVTVBCWShvcGFyZyk7CisgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CiAKLQkJUFJFRElDVEVEX1dJVEhfQVJHKFBPUF9KVU1QX0lGX0ZBTFNFKTsKLQkJY2FzZSBQT1BfSlVNUF9JRl9GQUxTRToKLQkJCXcgPSBQT1AoKTsKLQkJCWlmICh3ID09IFB5X1RydWUpIHsKLQkJCQlQeV9ERUNSRUYodyk7Ci0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfQotCQkJaWYgKHcgPT0gUHlfRmFsc2UpIHsKLQkJCQlQeV9ERUNSRUYodyk7Ci0JCQkJSlVNUFRPKG9wYXJnKTsKLQkJCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7Ci0JCQl9Ci0JCQllcnIgPSBQeU9iamVjdF9Jc1RydWUodyk7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlpZiAoZXJyID4gMCkKLQkJCQllcnIgPSAwOwotCQkJZWxzZSBpZiAoZXJyID09IDApCi0JCQkJSlVNUFRPKG9wYXJnKTsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBQUkVESUNURURfV0lUSF9BUkcoUE9QX0pVTVBfSUZfRkFMU0UpOworICAgICAgICBjYXNlIFBPUF9KVU1QX0lGX0ZBTFNFOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgaWYgKHcgPT0gUHlfVHJ1ZSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodyA9PSBQeV9GYWxzZSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgICAgICBKVU1QVE8ob3BhcmcpOworICAgICAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X0lzVHJ1ZSh3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPiAwKQorICAgICAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICBlbHNlIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgICAgICBKVU1QVE8ob3BhcmcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJUFJFRElDVEVEX1dJVEhfQVJHKFBPUF9KVU1QX0lGX1RSVUUpOwotCQljYXNlIFBPUF9KVU1QX0lGX1RSVUU6Ci0JCQl3ID0gUE9QKCk7Ci0JCQlpZiAodyA9PSBQeV9GYWxzZSkgewotCQkJCVB5X0RFQ1JFRih3KTsKLQkJCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7Ci0JCQl9Ci0JCQlpZiAodyA9PSBQeV9UcnVlKSB7Ci0JCQkJUHlfREVDUkVGKHcpOwotCQkJCUpVTVBUTyhvcGFyZyk7Ci0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfQotCQkJZXJyID0gUHlPYmplY3RfSXNUcnVlKHcpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJaWYgKGVyciA+IDApIHsKLQkJCQllcnIgPSAwOwotCQkJCUpVTVBUTyhvcGFyZyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChlcnIgPT0gMCkKLQkJCQk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKFBPUF9KVU1QX0lGX1RSVUUpOworICAgICAgICBjYXNlIFBPUF9KVU1QX0lGX1RSVUU6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICBpZiAodyA9PSBQeV9GYWxzZSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodyA9PSBQeV9UcnVlKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgICAgIEpVTVBUTyhvcGFyZyk7CisgICAgICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfSXNUcnVlKHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgaWYgKGVyciA+IDApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgICAgIEpVTVBUTyhvcGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEpVTVBfSUZfRkFMU0VfT1JfUE9QOgotCQkJdyA9IFRPUCgpOwotCQkJaWYgKHcgPT0gUHlfVHJ1ZSkgewotCQkJCVNUQUNLQURKKC0xKTsKLQkJCQlQeV9ERUNSRUYodyk7Ci0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfQotCQkJaWYgKHcgPT0gUHlfRmFsc2UpIHsKLQkJCQlKVU1QVE8ob3BhcmcpOwotCQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKLQkJCX0KLQkJCWVyciA9IFB5T2JqZWN0X0lzVHJ1ZSh3KTsKLQkJCWlmIChlcnIgPiAwKSB7Ci0JCQkJU1RBQ0tBREooLTEpOwotCQkJCVB5X0RFQ1JFRih3KTsKLQkJCQllcnIgPSAwOwotCQkJfQotCQkJZWxzZSBpZiAoZXJyID09IDApCi0JCQkJSlVNUFRPKG9wYXJnKTsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEpVTVBfSUZfRkFMU0VfT1JfUE9QOgorICAgICAgICAgICAgdyA9IFRPUCgpOworICAgICAgICAgICAgaWYgKHcgPT0gUHlfVHJ1ZSkgeworICAgICAgICAgICAgICAgIFNUQUNLQURKKC0xKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHcgPT0gUHlfRmFsc2UpIHsKKyAgICAgICAgICAgICAgICBKVU1QVE8ob3BhcmcpOworICAgICAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X0lzVHJ1ZSh3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPiAwKSB7CisgICAgICAgICAgICAgICAgU1RBQ0tBREooLTEpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZXJyID09IDApCisgICAgICAgICAgICAgICAgSlVNUFRPKG9wYXJnKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgSlVNUF9JRl9UUlVFX09SX1BPUDoKLQkJCXcgPSBUT1AoKTsKLQkJCWlmICh3ID09IFB5X0ZhbHNlKSB7Ci0JCQkJU1RBQ0tBREooLTEpOwotCQkJCVB5X0RFQ1JFRih3KTsKLQkJCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7Ci0JCQl9Ci0JCQlpZiAodyA9PSBQeV9UcnVlKSB7Ci0JCQkJSlVNUFRPKG9wYXJnKTsKLQkJCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7Ci0JCQl9Ci0JCQllcnIgPSBQeU9iamVjdF9Jc1RydWUodyk7Ci0JCQlpZiAoZXJyID4gMCkgewotCQkJCWVyciA9IDA7Ci0JCQkJSlVNUFRPKG9wYXJnKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGVyciA9PSAwKSB7Ci0JCQkJU1RBQ0tBREooLTEpOwotCQkJCVB5X0RFQ1JFRih3KTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEpVTVBfSUZfVFJVRV9PUl9QT1A6CisgICAgICAgICAgICB3ID0gVE9QKCk7CisgICAgICAgICAgICBpZiAodyA9PSBQeV9GYWxzZSkgeworICAgICAgICAgICAgICAgIFNUQUNLQURKKC0xKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHcgPT0gUHlfVHJ1ZSkgeworICAgICAgICAgICAgICAgIEpVTVBUTyhvcGFyZyk7CisgICAgICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfSXNUcnVlKHcpOworICAgICAgICAgICAgaWYgKGVyciA+IDApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgICAgIEpVTVBUTyhvcGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgICAgIFNUQUNLQURKKC0xKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQlQUkVESUNURURfV0lUSF9BUkcoSlVNUF9BQlNPTFVURSk7Ci0JCWNhc2UgSlVNUF9BQlNPTFVURToKLQkJCUpVTVBUTyhvcGFyZyk7CisgICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhKVU1QX0FCU09MVVRFKTsKKyAgICAgICAgY2FzZSBKVU1QX0FCU09MVVRFOgorICAgICAgICAgICAgSlVNUFRPKG9wYXJnKTsKICNpZiBGQVNUX0xPT1BTCi0JCQkvKiBFbmFibGluZyB0aGlzIHBhdGggc3BlZWRzLXVwIGFsbCB3aGlsZSBhbmQgZm9yLWxvb3BzIGJ5IGJ5cGFzc2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBlci1sb29wIGNoZWNrcyBmb3Igc2lnbmFscy4gIEJ5IGRlZmF1bHQsIHRoaXMgc2hvdWxkIGJlIHR1cm5lZC1vZmYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgaXQgcHJldmVudHMgZGV0ZWN0aW9uIG9mIGEgY29udHJvbC1icmVhayBpbiB0aWdodCBsb29wcyBsaWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpbGUgMTogcGFzcyIuICBDb21waWxlIHdpdGggdGhpcyBvcHRpb24gdHVybmVkLW9uIHdoZW4geW91IG5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzcGVlZC11cCBhbmQgZG8gbm90IG5lZWQgYnJlYWsgY2hlY2tpbmcgaW5zaWRlIHRpZ2h0IGxvb3BzIChvbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNvbnRhaW4gb25seSBpbnN0cnVjdGlvbnMgZW5kaW5nIHdpdGggZ290byBmYXN0X25leHRfb3Bjb2RlKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgICAgICAvKiBFbmFibGluZyB0aGlzIHBhdGggc3BlZWRzLXVwIGFsbCB3aGlsZSBhbmQgZm9yLWxvb3BzIGJ5IGJ5cGFzc2luZworICAgICAgICAgICAgICAgdGhlIHBlci1sb29wIGNoZWNrcyBmb3Igc2lnbmFscy4gIEJ5IGRlZmF1bHQsIHRoaXMgc2hvdWxkIGJlIHR1cm5lZC1vZmYKKyAgICAgICAgICAgICAgIGJlY2F1c2UgaXQgcHJldmVudHMgZGV0ZWN0aW9uIG9mIGEgY29udHJvbC1icmVhayBpbiB0aWdodCBsb29wcyBsaWtlCisgICAgICAgICAgICAgICAid2hpbGUgMTogcGFzcyIuICBDb21waWxlIHdpdGggdGhpcyBvcHRpb24gdHVybmVkLW9uIHdoZW4geW91IG5lZWQKKyAgICAgICAgICAgICAgIHRoZSBzcGVlZC11cCBhbmQgZG8gbm90IG5lZWQgYnJlYWsgY2hlY2tpbmcgaW5zaWRlIHRpZ2h0IGxvb3BzIChvbmVzCisgICAgICAgICAgICAgICB0aGF0IGNvbnRhaW4gb25seSBpbnN0cnVjdGlvbnMgZW5kaW5nIHdpdGggZ290byBmYXN0X25leHRfb3Bjb2RlKS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CiAjZWxzZQotCQkJY29udGludWU7CisgICAgICAgICAgICBjb250aW51ZTsKICNlbmRpZgogCi0JCWNhc2UgR0VUX0lURVI6Ci0JCQkvKiBiZWZvcmU6IFtvYmpdOyBhZnRlciBbZ2V0aXRlcihvYmopXSAqLwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5T2JqZWN0X0dldEl0ZXIodik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlpZiAoeCAhPSBOVUxMKSB7Ci0JCQkJU0VUX1RPUCh4KTsKLQkJCQlQUkVESUNUKEZPUl9JVEVSKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVNUQUNLQURKKC0xKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEdFVF9JVEVSOgorICAgICAgICAgICAgLyogYmVmb3JlOiBbb2JqXTsgYWZ0ZXIgW2dldGl0ZXIob2JqKV0gKi8KKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU9iamVjdF9HZXRJdGVyKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICAgICAgUFJFRElDVChGT1JfSVRFUik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTVEFDS0FESigtMSk7CisgICAgICAgICAgICBicmVhazsKIAotCQlQUkVESUNURURfV0lUSF9BUkcoRk9SX0lURVIpOwotCQljYXNlIEZPUl9JVEVSOgotCQkJLyogYmVmb3JlOiBbaXRlcl07IGFmdGVyOiBbaXRlciwgaXRlcigpXSAqb3IqIFtdICovCi0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gKCp2LT5vYl90eXBlLT50cF9pdGVybmV4dCkodik7Ci0JCQlpZiAoeCAhPSBOVUxMKSB7Ci0JCQkJUFVTSCh4KTsKLQkJCQlQUkVESUNUKFNUT1JFX0ZBU1QpOwotCQkJCVBSRURJQ1QoVU5QQUNLX1NFUVVFTkNFKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKAotCQkJCQkJUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0JCQkJCWJyZWFrOwotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQl9Ci0JCQkvKiBpdGVyYXRvciBlbmRlZCBub3JtYWxseSAqLwotIAkJCXggPSB2ID0gUE9QKCk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlKVU1QQlkob3BhcmcpOwotCQkJY29udGludWU7CisgICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhGT1JfSVRFUik7CisgICAgICAgIGNhc2UgRk9SX0lURVI6CisgICAgICAgICAgICAvKiBiZWZvcmU6IFtpdGVyXTsgYWZ0ZXI6IFtpdGVyLCBpdGVyKCldICpvciogW10gKi8KKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSAoKnYtPm9iX3R5cGUtPnRwX2l0ZXJuZXh0KSh2KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgICAgIFBSRURJQ1QoU1RPUkVfRkFTVCk7CisgICAgICAgICAgICAgICAgUFJFRElDVChVTlBBQ0tfU0VRVUVOQ0UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaXRlcmF0b3IgZW5kZWQgbm9ybWFsbHkgKi8KKyAgICAgICAgICAgIHggPSB2ID0gUE9QKCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBKVU1QQlkob3BhcmcpOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCUkVBS19MT09QOgotCQkJd2h5ID0gV0hZX0JSRUFLOwotCQkJZ290byBmYXN0X2Jsb2NrX2VuZDsKKyAgICAgICAgY2FzZSBCUkVBS19MT09QOgorICAgICAgICAgICAgd2h5ID0gV0hZX0JSRUFLOworICAgICAgICAgICAgZ290byBmYXN0X2Jsb2NrX2VuZDsKIAotCQljYXNlIENPTlRJTlVFX0xPT1A6Ci0JCQlyZXR2YWwgPSBQeUludF9Gcm9tTG9uZyhvcGFyZyk7Ci0JCQlpZiAoIXJldHZhbCkgewotCQkJCXggPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJd2h5ID0gV0hZX0NPTlRJTlVFOwotCQkJZ290byBmYXN0X2Jsb2NrX2VuZDsKKyAgICAgICAgY2FzZSBDT05USU5VRV9MT09QOgorICAgICAgICAgICAgcmV0dmFsID0gUHlJbnRfRnJvbUxvbmcob3BhcmcpOworICAgICAgICAgICAgaWYgKCFyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICB4ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoeSA9IFdIWV9DT05USU5VRTsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9ibG9ja19lbmQ7CiAKLQkJY2FzZSBTRVRVUF9MT09QOgotCQljYXNlIFNFVFVQX0VYQ0VQVDoKLQkJY2FzZSBTRVRVUF9GSU5BTExZOgotCQkJLyogTk9URTogSWYgeW91IGFkZCBhbnkgbmV3IGJsb2NrLXNldHVwIG9wY29kZXMgdGhhdAotCQkgICAgICAgICAgIGFyZSBub3QgdHJ5L2V4Y2VwdC9maW5hbGx5IGhhbmRsZXJzLCB5b3UgbWF5IG5lZWQKLQkJICAgICAgICAgICB0byB1cGRhdGUgdGhlIFB5R2VuX05lZWRzRmluYWxpemluZygpIGZ1bmN0aW9uLgotCQkgICAgICAgICAgICovCisgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKKyAgICAgICAgY2FzZSBTRVRVUF9FWENFUFQ6CisgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKKyAgICAgICAgICAgIC8qIE5PVEU6IElmIHlvdSBhZGQgYW55IG5ldyBibG9jay1zZXR1cCBvcGNvZGVzIHRoYXQKKyAgICAgICAgICAgICAgIGFyZSBub3QgdHJ5L2V4Y2VwdC9maW5hbGx5IGhhbmRsZXJzLCB5b3UgbWF5IG5lZWQKKyAgICAgICAgICAgICAgIHRvIHVwZGF0ZSB0aGUgUHlHZW5fTmVlZHNGaW5hbGl6aW5nKCkgZnVuY3Rpb24uCisgICAgICAgICAgICAgICAqLwogCi0JCQlQeUZyYW1lX0Jsb2NrU2V0dXAoZiwgb3Bjb2RlLCBJTlNUUl9PRkZTRVQoKSArIG9wYXJnLAotCQkJCQkgICBTVEFDS19MRVZFTCgpKTsKLQkJCWNvbnRpbnVlOworICAgICAgICAgICAgUHlGcmFtZV9CbG9ja1NldHVwKGYsIG9wY29kZSwgSU5TVFJfT0ZGU0VUKCkgKyBvcGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFDS19MRVZFTCgpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU0VUVVBfV0lUSDoKLSAgICAgICAgICAgICAgICB7Ci0JCQlzdGF0aWMgUHlPYmplY3QgKmV4aXQsICplbnRlcjsKLQkJCXcgPSBUT1AoKTsKLQkJCXggPSBzcGVjaWFsX2xvb2t1cCh3LCAiX19leGl0X18iLCAmZXhpdCk7Ci0JCQlpZiAoIXgpCi0JCQkJYnJlYWs7Ci0JCQlTRVRfVE9QKHgpOwotCQkgICAgICAgIHUgPSBzcGVjaWFsX2xvb2t1cCh3LCAiX19lbnRlcl9fIiwgJmVudGVyKTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCWlmICghdSkgewotCQkJCXggPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJeCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3ModSwgTlVMTCk7Ci0JCQlQeV9ERUNSRUYodSk7Ci0JCQlpZiAoIXgpCi0JCQkJYnJlYWs7Ci0JCQkvKiBTZXR1cCBhIGZpbmFsbHkgYmxvY2sgKFNFVFVQX1dJVEggYXMgYSBibG9jayBpcwotCQkJICAgZXF1aXZhbGVudCB0byBTRVRVUF9GSU5BTExZIGV4Y2VwdCBpdCBub3JtYWxpemVzCi0JCQkgICB0aGUgZXhjZXB0aW9uKSBiZWZvcmUgcHVzaGluZyB0aGUgcmVzdWx0IG9mCi0JCQkgICBfX2VudGVyX18gb24gdGhlIHN0YWNrLiAqLwotCQkJUHlGcmFtZV9CbG9ja1NldHVwKGYsIFNFVFVQX1dJVEgsIElOU1RSX09GRlNFVCgpICsgb3BhcmcsCi0JCQkJCSAgIFNUQUNLX0xFVkVMKCkpOworICAgICAgICBjYXNlIFNFVFVQX1dJVEg6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBQeU9iamVjdCAqZXhpdCwgKmVudGVyOworICAgICAgICAgICAgdyA9IFRPUCgpOworICAgICAgICAgICAgeCA9IHNwZWNpYWxfbG9va3VwKHcsICJfX2V4aXRfXyIsICZleGl0KTsKKyAgICAgICAgICAgIGlmICgheCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICB1ID0gc3BlY2lhbF9sb29rdXAodywgIl9fZW50ZXJfXyIsICZlbnRlcik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBpZiAoIXUpIHsKKyAgICAgICAgICAgICAgICB4ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHggPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHUsIE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgaWYgKCF4KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyogU2V0dXAgYSBmaW5hbGx5IGJsb2NrIChTRVRVUF9XSVRIIGFzIGEgYmxvY2sgaXMKKyAgICAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gU0VUVVBfRklOQUxMWSBleGNlcHQgaXQgbm9ybWFsaXplcworICAgICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbikgYmVmb3JlIHB1c2hpbmcgdGhlIHJlc3VsdCBvZgorICAgICAgICAgICAgICAgX19lbnRlcl9fIG9uIHRoZSBzdGFjay4gKi8KKyAgICAgICAgICAgIFB5RnJhbWVfQmxvY2tTZXR1cChmLCBTRVRVUF9XSVRILCBJTlNUUl9PRkZTRVQoKSArIG9wYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUNLX0xFVkVMKCkpOwogCi0JCQlQVVNIKHgpOwotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCWNhc2UgV0lUSF9DTEVBTlVQOgotCQl7Ci0JCQkvKiBBdCB0aGUgdG9wIG9mIHRoZSBzdGFjayBhcmUgMS0zIHZhbHVlcyBpbmRpY2F0aW5nCi0JCQkgICBob3cvd2h5IHdlIGVudGVyZWQgdGhlIGZpbmFsbHkgY2xhdXNlOgotCQkJICAgLSBUT1AgPSBOb25lCi0JCQkgICAtIChUT1AsIFNFQ09ORCkgPSAoV0hZX3tSRVRVUk4sQ09OVElOVUV9KSwgcmV0dmFsCi0JCQkgICAtIFRPUCA9IFdIWV8qOyBubyByZXR2YWwgYmVsb3cgaXQKLQkJCSAgIC0gKFRPUCwgU0VDT05ELCBUSElSRCkgPSBleGNfaW5mbygpCi0JCQkgICBCZWxvdyB0aGVtIGlzIEVYSVQsIHRoZSBjb250ZXh0Ll9fZXhpdF9fIGJvdW5kIG1ldGhvZC4KLQkJCSAgIEluIHRoZSBsYXN0IGNhc2UsIHdlIG11c3QgY2FsbAotCQkJICAgICBFWElUKFRPUCwgU0VDT05ELCBUSElSRCkKLQkJCSAgIG90aGVyd2lzZSB3ZSBtdXN0IGNhbGwKLQkJCSAgICAgRVhJVChOb25lLCBOb25lLCBOb25lKQorICAgICAgICBjYXNlIFdJVEhfQ0xFQU5VUDoKKyAgICAgICAgeworICAgICAgICAgICAgLyogQXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYXJlIDEtMyB2YWx1ZXMgaW5kaWNhdGluZworICAgICAgICAgICAgICAgaG93L3doeSB3ZSBlbnRlcmVkIHRoZSBmaW5hbGx5IGNsYXVzZToKKyAgICAgICAgICAgICAgIC0gVE9QID0gTm9uZQorICAgICAgICAgICAgICAgLSAoVE9QLCBTRUNPTkQpID0gKFdIWV97UkVUVVJOLENPTlRJTlVFfSksIHJldHZhbAorICAgICAgICAgICAgICAgLSBUT1AgPSBXSFlfKjsgbm8gcmV0dmFsIGJlbG93IGl0CisgICAgICAgICAgICAgICAtIChUT1AsIFNFQ09ORCwgVEhJUkQpID0gZXhjX2luZm8oKQorICAgICAgICAgICAgICAgQmVsb3cgdGhlbSBpcyBFWElULCB0aGUgY29udGV4dC5fX2V4aXRfXyBib3VuZCBtZXRob2QuCisgICAgICAgICAgICAgICBJbiB0aGUgbGFzdCBjYXNlLCB3ZSBtdXN0IGNhbGwKKyAgICAgICAgICAgICAgICAgRVhJVChUT1AsIFNFQ09ORCwgVEhJUkQpCisgICAgICAgICAgICAgICBvdGhlcndpc2Ugd2UgbXVzdCBjYWxsCisgICAgICAgICAgICAgICAgIEVYSVQoTm9uZSwgTm9uZSwgTm9uZSkKIAotCQkJICAgSW4gYWxsIGNhc2VzLCB3ZSByZW1vdmUgRVhJVCBmcm9tIHRoZSBzdGFjaywgbGVhdmluZwotCQkJICAgdGhlIHJlc3QgaW4gdGhlIHNhbWUgb3JkZXIuCisgICAgICAgICAgICAgICBJbiBhbGwgY2FzZXMsIHdlIHJlbW92ZSBFWElUIGZyb20gdGhlIHN0YWNrLCBsZWF2aW5nCisgICAgICAgICAgICAgICB0aGUgcmVzdCBpbiB0aGUgc2FtZSBvcmRlci4KIAotCQkJICAgSW4gYWRkaXRpb24sIGlmIHRoZSBzdGFjayByZXByZXNlbnRzIGFuIGV4Y2VwdGlvbiwKLQkJCSAgICphbmQqIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybnMgYSAndHJ1ZScgdmFsdWUsIHdlCi0JCQkgICAiemFwIiB0aGlzIGluZm9ybWF0aW9uLCB0byBwcmV2ZW50IEVORF9GSU5BTExZIGZyb20KLQkJCSAgIHJlLXJhaXNpbmcgdGhlIGV4Y2VwdGlvbi4gIChCdXQgbm9uLWxvY2FsIGdvdG9zCi0JCQkgICBzaG91bGQgc3RpbGwgYmUgcmVzdW1lZC4pCi0JCQkqLworICAgICAgICAgICAgICAgSW4gYWRkaXRpb24sIGlmIHRoZSBzdGFjayByZXByZXNlbnRzIGFuIGV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICphbmQqIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybnMgYSAndHJ1ZScgdmFsdWUsIHdlCisgICAgICAgICAgICAgICAiemFwIiB0aGlzIGluZm9ybWF0aW9uLCB0byBwcmV2ZW50IEVORF9GSU5BTExZIGZyb20KKyAgICAgICAgICAgICAgIHJlLXJhaXNpbmcgdGhlIGV4Y2VwdGlvbi4gIChCdXQgbm9uLWxvY2FsIGdvdG9zCisgICAgICAgICAgICAgICBzaG91bGQgc3RpbGwgYmUgcmVzdW1lZC4pCisgICAgICAgICAgICAqLwogCi0JCQlQeU9iamVjdCAqZXhpdF9mdW5jOworICAgICAgICAgICAgUHlPYmplY3QgKmV4aXRfZnVuYzsKIAotCQkJdSA9IFBPUCgpOwotCQkJaWYgKHUgPT0gUHlfTm9uZSkgewotCQkJICAgICAgIAlleGl0X2Z1bmMgPSBUT1AoKTsKLQkJCQlTRVRfVE9QKHUpOwotCQkJCXYgPSB3ID0gUHlfTm9uZTsKLQkJCX0KLQkJCWVsc2UgaWYgKFB5SW50X0NoZWNrKHUpKSB7Ci0JCQkJc3dpdGNoKFB5SW50X0FTX0xPTkcodSkpIHsKLQkJCQljYXNlIFdIWV9SRVRVUk46Ci0JCQkJY2FzZSBXSFlfQ09OVElOVUU6Ci0JCQkJCS8qIFJldHZhbCBpbiBUT1AuICovCi0JCQkJCWV4aXRfZnVuYyA9IFNFQ09ORCgpOwotCQkJCQlTRVRfU0VDT05EKFRPUCgpKTsKLQkJCQkJU0VUX1RPUCh1KTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJZXhpdF9mdW5jID0gVE9QKCk7Ci0JCQkJCVNFVF9UT1AodSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl1ID0gdiA9IHcgPSBQeV9Ob25lOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdiA9IFRPUCgpOwotCQkJCXcgPSBTRUNPTkQoKTsKLQkJCQlleGl0X2Z1bmMgPSBUSElSRCgpOwotCQkJCVNFVF9UT1AodSk7Ci0JCQkJU0VUX1NFQ09ORCh2KTsKLQkJCQlTRVRfVEhJUkQodyk7Ci0JCQl9Ci0JCQkvKiBYWFggTm90IHRoZSBmYXN0ZXN0IHdheSB0byBjYWxsIGl0Li4uICovCi0JCQl4ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhleGl0X2Z1bmMsIHUsIHYsIHcsCi0JCQkJCQkJIE5VTEwpOwotCQkJUHlfREVDUkVGKGV4aXRfZnVuYyk7Ci0JCQlpZiAoeCA9PSBOVUxMKQotCQkJCWJyZWFrOyAvKiBHbyB0byBlcnJvciBleGl0ICovCisgICAgICAgICAgICB1ID0gUE9QKCk7CisgICAgICAgICAgICBpZiAodSA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgZXhpdF9mdW5jID0gVE9QKCk7CisgICAgICAgICAgICAgICAgU0VUX1RPUCh1KTsKKyAgICAgICAgICAgICAgICB2ID0gdyA9IFB5X05vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChQeUludF9DaGVjayh1KSkgeworICAgICAgICAgICAgICAgIHN3aXRjaChQeUludF9BU19MT05HKHUpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBXSFlfUkVUVVJOOgorICAgICAgICAgICAgICAgIGNhc2UgV0hZX0NPTlRJTlVFOgorICAgICAgICAgICAgICAgICAgICAvKiBSZXR2YWwgaW4gVE9QLiAqLworICAgICAgICAgICAgICAgICAgICBleGl0X2Z1bmMgPSBTRUNPTkQoKTsKKyAgICAgICAgICAgICAgICAgICAgU0VUX1NFQ09ORChUT1AoKSk7CisgICAgICAgICAgICAgICAgICAgIFNFVF9UT1AodSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGV4aXRfZnVuYyA9IFRPUCgpOworICAgICAgICAgICAgICAgICAgICBTRVRfVE9QKHUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdSA9IHYgPSB3ID0gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgICAgICB3ID0gU0VDT05EKCk7CisgICAgICAgICAgICAgICAgZXhpdF9mdW5jID0gVEhJUkQoKTsKKyAgICAgICAgICAgICAgICBTRVRfVE9QKHUpOworICAgICAgICAgICAgICAgIFNFVF9TRUNPTkQodik7CisgICAgICAgICAgICAgICAgU0VUX1RISVJEKHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogWFhYIE5vdCB0aGUgZmFzdGVzdCB3YXkgdG8gY2FsbCBpdC4uLiAqLworICAgICAgICAgICAgeCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZXhpdF9mdW5jLCB1LCB2LCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXhpdF9mdW5jKTsKKyAgICAgICAgICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIEdvIHRvIGVycm9yIGV4aXQgKi8KIAotCQkJaWYgKHUgIT0gUHlfTm9uZSkKLQkJCQllcnIgPSBQeU9iamVjdF9Jc1RydWUoeCk7Ci0JCQllbHNlCi0JCQkJZXJyID0gMDsKLQkJCVB5X0RFQ1JFRih4KTsKKyAgICAgICAgICAgIGlmICh1ICE9IFB5X05vbmUpCisgICAgICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfSXNUcnVlKHgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICBQeV9ERUNSRUYoeCk7CiAKLQkJCWlmIChlcnIgPCAwKQotCQkJCWJyZWFrOyAvKiBHbyB0byBlcnJvciBleGl0ICovCi0JCQllbHNlIGlmIChlcnIgPiAwKSB7Ci0JCQkJZXJyID0gMDsKLQkJCQkvKiBUaGVyZSB3YXMgYW4gZXhjZXB0aW9uIGFuZCBhIHRydWUgcmV0dXJuICovCi0JCQkJU1RBQ0tBREooLTIpOwotCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCQlTRVRfVE9QKFB5X05vbmUpOwotCQkJCVB5X0RFQ1JFRih1KTsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJUHlfREVDUkVGKHcpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBUaGUgc3RhY2sgd2FzIHJlYXJyYW5nZWQgdG8gcmVtb3ZlIEVYSVQKLQkJCQkgICBhYm92ZS4gTGV0IEVORF9GSU5BTExZIGRvIGl0cyB0aGluZyAqLwotCQkJfQotCQkJUFJFRElDVChFTkRfRklOQUxMWSk7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIEdvIHRvIGVycm9yIGV4aXQgKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKGVyciA+IDApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgICAgIC8qIFRoZXJlIHdhcyBhbiBleGNlcHRpb24gYW5kIGEgdHJ1ZSByZXR1cm4gKi8KKyAgICAgICAgICAgICAgICBTVEFDS0FESigtMik7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIFNFVF9UT1AoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFRoZSBzdGFjayB3YXMgcmVhcnJhbmdlZCB0byByZW1vdmUgRVhJVAorICAgICAgICAgICAgICAgICAgIGFib3ZlLiBMZXQgRU5EX0ZJTkFMTFkgZG8gaXRzIHRoaW5nICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBQUkVESUNUKEVORF9GSU5BTExZKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJY2FzZSBDQUxMX0ZVTkNUSU9OOgotCQl7Ci0JCQlQeU9iamVjdCAqKnNwOwotCQkJUENBTEwoUENBTExfQUxMKTsKLQkJCXNwID0gc3RhY2tfcG9pbnRlcjsKKyAgICAgICAgY2FzZSBDQUxMX0ZVTkNUSU9OOgorICAgICAgICB7CisgICAgICAgICAgICBQeU9iamVjdCAqKnNwOworICAgICAgICAgICAgUENBTEwoUENBTExfQUxMKTsKKyAgICAgICAgICAgIHNwID0gc3RhY2tfcG9pbnRlcjsKICNpZmRlZiBXSVRIX1RTQwotCQkJeCA9IGNhbGxfZnVuY3Rpb24oJnNwLCBvcGFyZywgJmludHIwLCAmaW50cjEpOworICAgICAgICAgICAgeCA9IGNhbGxfZnVuY3Rpb24oJnNwLCBvcGFyZywgJmludHIwLCAmaW50cjEpOwogI2Vsc2UKLQkJCXggPSBjYWxsX2Z1bmN0aW9uKCZzcCwgb3BhcmcpOworICAgICAgICAgICAgeCA9IGNhbGxfZnVuY3Rpb24oJnNwLCBvcGFyZyk7CiAjZW5kaWYKLQkJCXN0YWNrX3BvaW50ZXIgPSBzcDsKLQkJCVBVU0goeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKQotCQkJCWNvbnRpbnVlOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgICAgIHN0YWNrX3BvaW50ZXIgPSBzcDsKKyAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQljYXNlIENBTExfRlVOQ1RJT05fVkFSOgotCQljYXNlIENBTExfRlVOQ1RJT05fS1c6Ci0JCWNhc2UgQ0FMTF9GVU5DVElPTl9WQVJfS1c6Ci0JCXsKLQkJICAgIGludCBuYSA9IG9wYXJnICYgMHhmZjsKLQkJICAgIGludCBuayA9IChvcGFyZz4+OCkgJiAweGZmOwotCQkgICAgaW50IGZsYWdzID0gKG9wY29kZSAtIENBTExfRlVOQ1RJT04pICYgMzsKLQkJICAgIGludCBuID0gbmEgKyAyICogbms7Ci0JCSAgICBQeU9iamVjdCAqKnBmdW5jLCAqZnVuYywgKipzcDsKLQkJICAgIFBDQUxMKFBDQUxMX0FMTCk7Ci0JCSAgICBpZiAoZmxhZ3MgJiBDQUxMX0ZMQUdfVkFSKQotCQkJICAgIG4rKzsKLQkJICAgIGlmIChmbGFncyAmIENBTExfRkxBR19LVykKLQkJCSAgICBuKys7Ci0JCSAgICBwZnVuYyA9IHN0YWNrX3BvaW50ZXIgLSBuIC0gMTsKLQkJICAgIGZ1bmMgPSAqcGZ1bmM7CisgICAgICAgIGNhc2UgQ0FMTF9GVU5DVElPTl9WQVI6CisgICAgICAgIGNhc2UgQ0FMTF9GVU5DVElPTl9LVzoKKyAgICAgICAgY2FzZSBDQUxMX0ZVTkNUSU9OX1ZBUl9LVzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG5hID0gb3BhcmcgJiAweGZmOworICAgICAgICAgICAgaW50IG5rID0gKG9wYXJnPj44KSAmIDB4ZmY7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSAob3Bjb2RlIC0gQ0FMTF9GVU5DVElPTikgJiAzOworICAgICAgICAgICAgaW50IG4gPSBuYSArIDIgKiBuazsKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqcGZ1bmMsICpmdW5jLCAqKnNwOworICAgICAgICAgICAgUENBTEwoUENBTExfQUxMKTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIENBTExfRkxBR19WQVIpCisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgaWYgKGZsYWdzICYgQ0FMTF9GTEFHX0tXKQorICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIHBmdW5jID0gc3RhY2tfcG9pbnRlciAtIG4gLSAxOworICAgICAgICAgICAgZnVuYyA9ICpwZnVuYzsKIAotCQkgICAgaWYgKFB5TWV0aG9kX0NoZWNrKGZ1bmMpCi0JCQkmJiBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKSAhPSBOVUxMKSB7Ci0JCQkgICAgUHlPYmplY3QgKnNlbGYgPSBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKTsKLQkJCSAgICBQeV9JTkNSRUYoc2VsZik7Ci0JCQkgICAgZnVuYyA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKTsKLQkJCSAgICBQeV9JTkNSRUYoZnVuYyk7Ci0JCQkgICAgUHlfREVDUkVGKCpwZnVuYyk7Ci0JCQkgICAgKnBmdW5jID0gc2VsZjsKLQkJCSAgICBuYSsrOwotCQkgICAgfSBlbHNlCi0JCQkgICAgUHlfSU5DUkVGKGZ1bmMpOwotCQkgICAgc3AgPSBzdGFja19wb2ludGVyOwotCQkgICAgUkVBRF9USU1FU1RBTVAoaW50cjApOwotCQkgICAgeCA9IGV4dF9kb19jYWxsKGZ1bmMsICZzcCwgZmxhZ3MsIG5hLCBuayk7Ci0JCSAgICBSRUFEX1RJTUVTVEFNUChpbnRyMSk7Ci0JCSAgICBzdGFja19wb2ludGVyID0gc3A7Ci0JCSAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICBpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykKKyAgICAgICAgICAgICYmIFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqc2VsZiA9IFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgICAgICAgICBmdW5jID0gUHlNZXRob2RfR0VUX0ZVTkNUSU9OKGZ1bmMpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoKnBmdW5jKTsKKyAgICAgICAgICAgICAgICAqcGZ1bmMgPSBzZWxmOworICAgICAgICAgICAgICAgIG5hKys7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgICAgICAgICBzcCA9IHN0YWNrX3BvaW50ZXI7CisgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnRyMCk7CisgICAgICAgICAgICB4ID0gZXh0X2RvX2NhbGwoZnVuYywgJnNwLCBmbGFncywgbmEsIG5rKTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIxKTsKKyAgICAgICAgICAgIHN0YWNrX3BvaW50ZXIgPSBzcDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKIAotCQkgICAgd2hpbGUgKHN0YWNrX3BvaW50ZXIgPiBwZnVuYykgewotCQkJICAgIHcgPSBQT1AoKTsKLQkJCSAgICBQeV9ERUNSRUYodyk7Ci0JCSAgICB9Ci0JCSAgICBQVVNIKHgpOwotCQkgICAgaWYgKHggIT0gTlVMTCkKLQkJCSAgICBjb250aW51ZTsKLQkJICAgIGJyZWFrOwotCQl9CisgICAgICAgICAgICB3aGlsZSAoc3RhY2tfcG9pbnRlciA+IHBmdW5jKSB7CisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQljYXNlIE1BS0VfRlVOQ1RJT046Ci0JCQl2ID0gUE9QKCk7IC8qIGNvZGUgb2JqZWN0ICovCi0JCQl4ID0gUHlGdW5jdGlvbl9OZXcodiwgZi0+Zl9nbG9iYWxzKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCS8qIFhYWCBNYXliZSB0aGlzIHNob3VsZCBiZSBhIHNlcGFyYXRlIG9wY29kZT8gKi8KLQkJCWlmICh4ICE9IE5VTEwgJiYgb3BhcmcgPiAwKSB7Ci0JCQkJdiA9IFB5VHVwbGVfTmV3KG9wYXJnKTsKLQkJCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQkJCVB5X0RFQ1JFRih4KTsKLQkJCQkJeCA9IE5VTEw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl3aGlsZSAoLS1vcGFyZyA+PSAwKSB7Ci0JCQkJCXcgPSBQT1AoKTsKLQkJCQkJUHlUdXBsZV9TRVRfSVRFTSh2LCBvcGFyZywgdyk7Ci0JCQkJfQotCQkJCWVyciA9IFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMoeCwgdik7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJfQotCQkJUFVTSCh4KTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIE1BS0VfRlVOQ1RJT046CisgICAgICAgICAgICB2ID0gUE9QKCk7IC8qIGNvZGUgb2JqZWN0ICovCisgICAgICAgICAgICB4ID0gUHlGdW5jdGlvbl9OZXcodiwgZi0+Zl9nbG9iYWxzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIC8qIFhYWCBNYXliZSB0aGlzIHNob3VsZCBiZSBhIHNlcGFyYXRlIG9wY29kZT8gKi8KKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwgJiYgb3BhcmcgPiAwKSB7CisgICAgICAgICAgICAgICAgdiA9IFB5VHVwbGVfTmV3KG9wYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoLS1vcGFyZyA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LCBvcGFyZywgdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMoeCwgdik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTUFLRV9DTE9TVVJFOgotCQl7Ci0JCQl2ID0gUE9QKCk7IC8qIGNvZGUgb2JqZWN0ICovCi0JCQl4ID0gUHlGdW5jdGlvbl9OZXcodiwgZi0+Zl9nbG9iYWxzKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWlmICh4ICE9IE5VTEwpIHsKLQkJCQl2ID0gUE9QKCk7Ci0JCQkJaWYgKFB5RnVuY3Rpb25fU2V0Q2xvc3VyZSh4LCB2KSAhPSAwKSB7Ci0JCQkJCS8qIENhbid0IGhhcHBlbiB1bmxlc3MgYnl0ZWNvZGUgaXMgY29ycnVwdC4gKi8KLQkJCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJfQotCQkJaWYgKHggIT0gTlVMTCAmJiBvcGFyZyA+IDApIHsKLQkJCQl2ID0gUHlUdXBsZV9OZXcob3BhcmcpOwotCQkJCWlmICh2ID09IE5VTEwpIHsKLQkJCQkJUHlfREVDUkVGKHgpOwotCQkJCQl4ID0gTlVMTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXdoaWxlICgtLW9wYXJnID49IDApIHsKLQkJCQkJdyA9IFBPUCgpOwotCQkJCQlQeVR1cGxlX1NFVF9JVEVNKHYsIG9wYXJnLCB3KTsKLQkJCQl9Ci0JCQkJaWYgKFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMoeCwgdikgIT0gMCkgewotCQkJCQkvKiBDYW4ndCBoYXBwZW4gdW5sZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9TZXREZWZhdWx0cyBjaGFuZ2VzLiAqLwotCQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJCX0KLQkJCQlQeV9ERUNSRUYodik7Ci0JCQl9Ci0JCQlQVVNIKHgpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgY2FzZSBNQUtFX0NMT1NVUkU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHYgPSBQT1AoKTsgLyogY29kZSBvYmplY3QgKi8KKyAgICAgICAgICAgIHggPSBQeUZ1bmN0aW9uX05ldyh2LCBmLT5mX2dsb2JhbHMpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXRDbG9zdXJlKHgsIHYpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgaGFwcGVuIHVubGVzcyBieXRlY29kZSBpcyBjb3JydXB0LiAqLworICAgICAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMICYmIG9wYXJnID4gMCkgeworICAgICAgICAgICAgICAgIHYgPSBQeVR1cGxlX05ldyhvcGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgICAgICAgICAgICAgICAgIHggPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKC0tb3BhcmcgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgb3BhcmcsIHcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXREZWZhdWx0cyh4LCB2KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGhhcHBlbiB1bmxlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9TZXREZWZhdWx0cyBjaGFuZ2VzLiAqLworICAgICAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQljYXNlIEJVSUxEX1NMSUNFOgotCQkJaWYgKG9wYXJnID09IDMpCi0JCQkJdyA9IFBPUCgpOwotCQkJZWxzZQotCQkJCXcgPSBOVUxMOwotCQkJdiA9IFBPUCgpOwotCQkJdSA9IFRPUCgpOwotCQkJeCA9IFB5U2xpY2VfTmV3KHUsIHYsIHcpOwotCQkJUHlfREVDUkVGKHUpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfWERFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJVSUxEX1NMSUNFOgorICAgICAgICAgICAgaWYgKG9wYXJnID09IDMpCisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHcgPSBOVUxMOworICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgdSA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5U2xpY2VfTmV3KHUsIHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhURU5ERURfQVJHOgotCQkJb3Bjb2RlID0gTkVYVE9QKCk7Ci0JCQlvcGFyZyA9IG9wYXJnPDwxNiB8IE5FWFRBUkcoKTsKLQkJCWdvdG8gZGlzcGF0Y2hfb3Bjb2RlOworICAgICAgICBjYXNlIEVYVEVOREVEX0FSRzoKKyAgICAgICAgICAgIG9wY29kZSA9IE5FWFRPUCgpOworICAgICAgICAgICAgb3BhcmcgPSBvcGFyZzw8MTYgfCBORVhUQVJHKCk7CisgICAgICAgICAgICBnb3RvIGRpc3BhdGNoX29wY29kZTsKIAotCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIlhYWCBsaW5lbm86ICVkLCBvcGNvZGU6ICVkXG4iLAotCQkJCVB5RnJhbWVfR2V0TGluZU51bWJlcihmKSwKLQkJCQlvcGNvZGUpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAidW5rbm93biBvcGNvZGUiKTsKLQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQlicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJYWFggbGluZW5vOiAlZCwgb3Bjb2RlOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBQeUZyYW1lX0dldExpbmVOdW1iZXIoZiksCisgICAgICAgICAgICAgICAgb3Bjb2RlKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgInVua25vd24gb3Bjb2RlIik7CisgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgYnJlYWs7CiAKICNpZmRlZiBDQVNFX1RPT19CSUcKLQkJfQorICAgICAgICB9CiAjZW5kaWYKIAotCQl9IC8qIHN3aXRjaCAqLworICAgICAgICB9IC8qIHN3aXRjaCAqLwogCi0JICAgIG9uX2Vycm9yOgorICAgICAgICBvbl9lcnJvcjoKIAotCQlSRUFEX1RJTUVTVEFNUChpbnN0MSk7CisgICAgICAgIFJFQURfVElNRVNUQU1QKGluc3QxKTsKIAotCQkvKiBRdWlja2x5IGNvbnRpbnVlIGlmIG5vIGVycm9yIG9jY3VycmVkICovCisgICAgICAgIC8qIFF1aWNrbHkgY29udGludWUgaWYgbm8gZXJyb3Igb2NjdXJyZWQgKi8KIAotCQlpZiAod2h5ID09IFdIWV9OT1QpIHsKLQkJCWlmIChlcnIgPT0gMCAmJiB4ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHdoeSA9PSBXSFlfTk9UKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IDAgJiYgeCAhPSBOVUxMKSB7CiAjaWZkZWYgQ0hFQ0tFWEMKLQkJCQkvKiBUaGlzIGNoZWNrIGlzIGV4cGVuc2l2ZSEgKi8KLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCQkiWFhYIHVuZGV0ZWN0ZWQgZXJyb3JcbiIpOwotCQkJCWVsc2UgeworICAgICAgICAgICAgICAgIC8qIFRoaXMgY2hlY2sgaXMgZXhwZW5zaXZlISAqLworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJYWFggdW5kZXRlY3RlZCBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgZWxzZSB7CiAjZW5kaWYKLQkJCQkJUkVBRF9USU1FU1RBTVAobG9vcDEpOwotCQkJCQljb250aW51ZTsgLyogTm9ybWFsLCBmYXN0IHBhdGggKi8KKyAgICAgICAgICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAobG9vcDEpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogTm9ybWFsLCBmYXN0IHBhdGggKi8KICNpZmRlZiBDSEVDS0VYQwotCQkJCX0KKyAgICAgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCX0KLQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQl4ID0gUHlfTm9uZTsKLQkJCWVyciA9IDA7Ci0JCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CisgICAgICAgICAgICB4ID0gUHlfTm9uZTsKKyAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgIH0KIAotCQkvKiBEb3VibGUtY2hlY2sgZXhjZXB0aW9uIHN0YXR1cyAqLworICAgICAgICAvKiBEb3VibGUtY2hlY2sgZXhjZXB0aW9uIHN0YXR1cyAqLwogCi0JCWlmICh3aHkgPT0gV0hZX0VYQ0VQVElPTiB8fCB3aHkgPT0gV0hZX1JFUkFJU0UpIHsKLQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJImVycm9yIHJldHVybiB3aXRob3V0IGV4Y2VwdGlvbiBzZXQiKTsKLQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJfQotCQl9CisgICAgICAgIGlmICh3aHkgPT0gV0hZX0VYQ0VQVElPTiB8fCB3aHkgPT0gV0hZX1JFUkFJU0UpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImVycm9yIHJldHVybiB3aXRob3V0IGV4Y2VwdGlvbiBzZXQiKTsKKyAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjaWZkZWYgQ0hFQ0tFWEMKLQkJZWxzZSB7Ci0JCQkvKiBUaGlzIGNoZWNrIGlzIGV4cGVuc2l2ZSEgKi8KLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJY2hhciBidWZbMTI4XTsKLQkJCQlzcHJpbnRmKGJ1ZiwgIlN0YWNrIHVud2luZCB3aXRoIGV4Y2VwdGlvbiAiCi0JCQkJCSJzZXQgYW5kIHdoeT0lZCIsIHdoeSk7Ci0JCQkJUHlfRmF0YWxFcnJvcihidWYpOwotCQkJfQotCQl9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogVGhpcyBjaGVjayBpcyBleHBlbnNpdmUhICovCisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsICJTdGFjayB1bndpbmQgd2l0aCBleGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAic2V0IGFuZCB3aHk9JWQiLCB3aHkpOworICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAKLQkJLyogTG9nIHRyYWNlYmFjayBpbmZvIGlmIHRoaXMgaXMgYSByZWFsIGV4Y2VwdGlvbiAqLworICAgICAgICAvKiBMb2cgdHJhY2ViYWNrIGluZm8gaWYgdGhpcyBpcyBhIHJlYWwgZXhjZXB0aW9uICovCiAKLQkJaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB7Ci0JCQlQeVRyYWNlQmFja19IZXJlKGYpOworICAgICAgICBpZiAod2h5ID09IFdIWV9FWENFUFRJT04pIHsKKyAgICAgICAgICAgIFB5VHJhY2VCYWNrX0hlcmUoZik7CiAKLQkJCWlmICh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCi0JCQkJY2FsbF9leGNfdHJhY2UodHN0YXRlLT5jX3RyYWNlZnVuYywKLQkJCQkJICAgICAgIHRzdGF0ZS0+Y190cmFjZW9iaiwgZik7Ci0JCX0KKyAgICAgICAgICAgIGlmICh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCisgICAgICAgICAgICAgICAgY2FsbF9leGNfdHJhY2UodHN0YXRlLT5jX3RyYWNlZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmNfdHJhY2VvYmosIGYpOworICAgICAgICB9CiAKLQkJLyogRm9yIHRoZSByZXN0LCB0cmVhdCBXSFlfUkVSQUlTRSBhcyBXSFlfRVhDRVBUSU9OICovCisgICAgICAgIC8qIEZvciB0aGUgcmVzdCwgdHJlYXQgV0hZX1JFUkFJU0UgYXMgV0hZX0VYQ0VQVElPTiAqLwogCi0JCWlmICh3aHkgPT0gV0hZX1JFUkFJU0UpCi0JCQl3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICBpZiAod2h5ID09IFdIWV9SRVJBSVNFKQorICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKIAotCQkvKiBVbndpbmQgc3RhY2tzIGlmIGEgKHBzZXVkbykgZXhjZXB0aW9uIG9jY3VycmVkICovCisgICAgICAgIC8qIFVud2luZCBzdGFja3MgaWYgYSAocHNldWRvKSBleGNlcHRpb24gb2NjdXJyZWQgKi8KIAogZmFzdF9ibG9ja19lbmQ6Ci0JCXdoaWxlICh3aHkgIT0gV0hZX05PVCAmJiBmLT5mX2libG9jayA+IDApIHsKLQkJCS8qIFBlZWsgYXQgdGhlIGN1cnJlbnQgYmxvY2suICovCi0JCQlQeVRyeUJsb2NrICpiID0gJmYtPmZfYmxvY2tzdGFja1tmLT5mX2libG9jayAtIDFdOworICAgICAgICB3aGlsZSAod2h5ICE9IFdIWV9OT1QgJiYgZi0+Zl9pYmxvY2sgPiAwKSB7CisgICAgICAgICAgICAvKiBQZWVrIGF0IHRoZSBjdXJyZW50IGJsb2NrLiAqLworICAgICAgICAgICAgUHlUcnlCbG9jayAqYiA9ICZmLT5mX2Jsb2Nrc3RhY2tbZi0+Zl9pYmxvY2sgLSAxXTsKIAotCQkJYXNzZXJ0KHdoeSAhPSBXSFlfWUlFTEQpOwotCQkJaWYgKGItPmJfdHlwZSA9PSBTRVRVUF9MT09QICYmIHdoeSA9PSBXSFlfQ09OVElOVUUpIHsKLQkJCQl3aHkgPSBXSFlfTk9UOwotCQkJCUpVTVBUTyhQeUludF9BU19MT05HKHJldHZhbCkpOwotCQkJCVB5X0RFQ1JFRihyZXR2YWwpOwotCQkJCWJyZWFrOwotCQkJfQorICAgICAgICAgICAgYXNzZXJ0KHdoeSAhPSBXSFlfWUlFTEQpOworICAgICAgICAgICAgaWYgKGItPmJfdHlwZSA9PSBTRVRVUF9MT09QICYmIHdoeSA9PSBXSFlfQ09OVElOVUUpIHsKKyAgICAgICAgICAgICAgICB3aHkgPSBXSFlfTk9UOworICAgICAgICAgICAgICAgIEpVTVBUTyhQeUludF9BU19MT05HKHJldHZhbCkpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCi0JCQkvKiBOb3cgd2UgaGF2ZSB0byBwb3AgdGhlIGJsb2NrLiAqLwotCQkJZi0+Zl9pYmxvY2stLTsKKyAgICAgICAgICAgIC8qIE5vdyB3ZSBoYXZlIHRvIHBvcCB0aGUgYmxvY2suICovCisgICAgICAgICAgICBmLT5mX2libG9jay0tOwogCi0JCQl3aGlsZSAoU1RBQ0tfTEVWRUwoKSA+IGItPmJfbGV2ZWwpIHsKLQkJCQl2ID0gUE9QKCk7Ci0JCQkJUHlfWERFQ1JFRih2KTsKLQkJCX0KLQkJCWlmIChiLT5iX3R5cGUgPT0gU0VUVVBfTE9PUCAmJiB3aHkgPT0gV0hZX0JSRUFLKSB7Ci0JCQkJd2h5ID0gV0hZX05PVDsKLQkJCQlKVU1QVE8oYi0+Yl9oYW5kbGVyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChiLT5iX3R5cGUgPT0gU0VUVVBfRklOQUxMWSB8fAotCQkJICAgIChiLT5iX3R5cGUgPT0gU0VUVVBfRVhDRVBUICYmCi0JCQkgICAgIHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB8fAotCQkJICAgIGItPmJfdHlwZSA9PSBTRVRVUF9XSVRIKSB7Ci0JCQkJaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB7Ci0JCQkJCVB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKLQkJCQkJUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKLQkJCQkJaWYgKHZhbCA9PSBOVUxMKSB7Ci0JCQkJCQl2YWwgPSBQeV9Ob25lOwotCQkJCQkJUHlfSU5DUkVGKHZhbCk7Ci0JCQkJCX0KLQkJCQkJLyogTWFrZSB0aGUgcmF3IGV4Y2VwdGlvbiBkYXRhCi0JCQkJCSAgIGF2YWlsYWJsZSB0byB0aGUgaGFuZGxlciwKLQkJCQkJICAgc28gYSBwcm9ncmFtIGNhbiBlbXVsYXRlIHRoZQotCQkJCQkgICBQeXRob24gbWFpbiBsb29wLiAgRG9uJ3QgZG8KLQkJCQkJICAgdGhpcyBmb3IgJ2ZpbmFsbHknLiAqLwotCQkJCQlpZiAoYi0+Yl90eXBlID09IFNFVFVQX0VYQ0VQVCB8fAotCQkJCQkgICAgYi0+Yl90eXBlID09IFNFVFVQX1dJVEgpIHsKLQkJCQkJCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigKLQkJCQkJCQkmZXhjLCAmdmFsLCAmdGIpOwotCQkJCQkJc2V0X2V4Y19pbmZvKHRzdGF0ZSwKLQkJCQkJCQkgICAgIGV4YywgdmFsLCB0Yik7Ci0JCQkJCX0KLQkJCQkJaWYgKHRiID09IE5VTEwpIHsKLQkJCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCQkJCVBVU0goUHlfTm9uZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJUFVTSCh0Yik7Ci0JCQkJCVBVU0godmFsKTsKLQkJCQkJUFVTSChleGMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHdoeSAmIChXSFlfUkVUVVJOIHwgV0hZX0NPTlRJTlVFKSkKLQkJCQkJCVBVU0gocmV0dmFsKTsKLQkJCQkJdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKXdoeSk7Ci0JCQkJCVBVU0godik7Ci0JCQkJfQotCQkJCXdoeSA9IFdIWV9OT1Q7Ci0JCQkJSlVNUFRPKGItPmJfaGFuZGxlcik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gLyogdW53aW5kIHN0YWNrICovCisgICAgICAgICAgICB3aGlsZSAoU1RBQ0tfTEVWRUwoKSA+IGItPmJfbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiLT5iX3R5cGUgPT0gU0VUVVBfTE9PUCAmJiB3aHkgPT0gV0hZX0JSRUFLKSB7CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX05PVDsKKyAgICAgICAgICAgICAgICBKVU1QVE8oYi0+Yl9oYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiLT5iX3R5cGUgPT0gU0VUVVBfRklOQUxMWSB8fAorICAgICAgICAgICAgICAgIChiLT5iX3R5cGUgPT0gU0VUVVBfRVhDRVBUICYmCisgICAgICAgICAgICAgICAgIHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB8fAorICAgICAgICAgICAgICAgIGItPmJfdHlwZSA9PSBTRVRVUF9XSVRIKSB7CisgICAgICAgICAgICAgICAgaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBQeV9Ob25lOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogTWFrZSB0aGUgcmF3IGV4Y2VwdGlvbiBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byB0aGUgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc28gYSBwcm9ncmFtIGNhbiBlbXVsYXRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBQeXRob24gbWFpbiBsb29wLiAgRG9uJ3QgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmb3IgJ2ZpbmFsbHknLiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoYi0+Yl90eXBlID09IFNFVFVQX0VYQ0VQVCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgYi0+Yl90eXBlID09IFNFVFVQX1dJVEgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhjLCAmdmFsLCAmdGIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2V4Y19pbmZvKHRzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMsIHZhbCwgdGIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0YiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVNIKFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVU0godGIpOworICAgICAgICAgICAgICAgICAgICBQVVNIKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIFBVU0goZXhjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3aHkgJiAoV0hZX1JFVFVSTiB8IFdIWV9DT05USU5VRSkpCisgICAgICAgICAgICAgICAgICAgICAgICBQVVNIKHJldHZhbCk7CisgICAgICAgICAgICAgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZygobG9uZyl3aHkpOworICAgICAgICAgICAgICAgICAgICBQVVNIKHYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aHkgPSBXSFlfTk9UOworICAgICAgICAgICAgICAgIEpVTVBUTyhiLT5iX2hhbmRsZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IC8qIHVud2luZCBzdGFjayAqLwogCi0JCS8qIEVuZCB0aGUgbG9vcCBpZiB3ZSBzdGlsbCBoYXZlIGFuIGVycm9yIChvciByZXR1cm4pICovCisgICAgICAgIC8qIEVuZCB0aGUgbG9vcCBpZiB3ZSBzdGlsbCBoYXZlIGFuIGVycm9yIChvciByZXR1cm4pICovCiAKLQkJaWYgKHdoeSAhPSBXSFlfTk9UKQotCQkJYnJlYWs7Ci0JCVJFQURfVElNRVNUQU1QKGxvb3AxKTsKKyAgICAgICAgaWYgKHdoeSAhPSBXSFlfTk9UKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIFJFQURfVElNRVNUQU1QKGxvb3AxKTsKIAotCX0gLyogbWFpbiBsb29wICovCisgICAgfSAvKiBtYWluIGxvb3AgKi8KIAotCWFzc2VydCh3aHkgIT0gV0hZX1lJRUxEKTsKLQkvKiBQb3AgcmVtYWluaW5nIHN0YWNrIGVudHJpZXMuICovCi0Jd2hpbGUgKCFFTVBUWSgpKSB7Ci0JCXYgPSBQT1AoKTsKLQkJUHlfWERFQ1JFRih2KTsKLQl9CisgICAgYXNzZXJ0KHdoeSAhPSBXSFlfWUlFTEQpOworICAgIC8qIFBvcCByZW1haW5pbmcgc3RhY2sgZW50cmllcy4gKi8KKyAgICB3aGlsZSAoIUVNUFRZKCkpIHsKKyAgICAgICAgdiA9IFBPUCgpOworICAgICAgICBQeV9YREVDUkVGKHYpOworICAgIH0KIAotCWlmICh3aHkgIT0gV0hZX1JFVFVSTikKLQkJcmV0dmFsID0gTlVMTDsKKyAgICBpZiAod2h5ICE9IFdIWV9SRVRVUk4pCisgICAgICAgIHJldHZhbCA9IE5VTEw7CiAKIGZhc3RfeWllbGQ6Ci0JaWYgKHRzdGF0ZS0+dXNlX3RyYWNpbmcpIHsKLQkJaWYgKHRzdGF0ZS0+Y190cmFjZWZ1bmMpIHsKLQkJCWlmICh3aHkgPT0gV0hZX1JFVFVSTiB8fCB3aHkgPT0gV0hZX1lJRUxEKSB7Ci0JCQkJaWYgKGNhbGxfdHJhY2UodHN0YXRlLT5jX3RyYWNlZnVuYywKLQkJCQkJICAgICAgIHRzdGF0ZS0+Y190cmFjZW9iaiwgZiwKLQkJCQkJICAgICAgIFB5VHJhY2VfUkVUVVJOLCByZXR2YWwpKSB7Ci0JCQkJCVB5X1hERUNSRUYocmV0dmFsKTsKLQkJCQkJcmV0dmFsID0gTlVMTDsKLQkJCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh3aHkgPT0gV0hZX0VYQ0VQVElPTikgewotCQkJCWNhbGxfdHJhY2VfcHJvdGVjdGVkKHRzdGF0ZS0+Y190cmFjZWZ1bmMsCi0JCQkJCQkgICAgIHRzdGF0ZS0+Y190cmFjZW9iaiwgZiwKLQkJCQkJCSAgICAgUHlUcmFjZV9SRVRVUk4sIE5VTEwpOwotCQkJfQotCQl9Ci0JCWlmICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMpIHsKLQkJCWlmICh3aHkgPT0gV0hZX0VYQ0VQVElPTikKLQkJCQljYWxsX3RyYWNlX3Byb3RlY3RlZCh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMsCi0JCQkJCQkgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqLCBmLAotCQkJCQkJICAgICBQeVRyYWNlX1JFVFVSTiwgTlVMTCk7Ci0JCQllbHNlIGlmIChjYWxsX3RyYWNlKHRzdGF0ZS0+Y19wcm9maWxlZnVuYywKLQkJCQkJICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqLCBmLAotCQkJCQkgICAgUHlUcmFjZV9SRVRVUk4sIHJldHZhbCkpIHsKLQkJCQlQeV9YREVDUkVGKHJldHZhbCk7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJfQotCQl9Ci0JfQorICAgIGlmICh0c3RhdGUtPnVzZV90cmFjaW5nKSB7CisgICAgICAgIGlmICh0c3RhdGUtPmNfdHJhY2VmdW5jKSB7CisgICAgICAgICAgICBpZiAod2h5ID09IFdIWV9SRVRVUk4gfHwgd2h5ID09IFdIWV9ZSUVMRCkgeworICAgICAgICAgICAgICAgIGlmIChjYWxsX3RyYWNlKHRzdGF0ZS0+Y190cmFjZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0YXRlLT5jX3RyYWNlb2JqLCBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHJhY2VfUkVUVVJOLCByZXR2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYocmV0dmFsKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh3aHkgPT0gV0hZX0VYQ0VQVElPTikgeworICAgICAgICAgICAgICAgIGNhbGxfdHJhY2VfcHJvdGVjdGVkKHRzdGF0ZS0+Y190cmFjZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0YXRlLT5jX3RyYWNlb2JqLCBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHJhY2VfUkVUVVJOLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jKSB7CisgICAgICAgICAgICBpZiAod2h5ID09IFdIWV9FWENFUFRJT04pCisgICAgICAgICAgICAgICAgY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqLCBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHJhY2VfUkVUVVJOLCBOVUxMKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNhbGxfdHJhY2UodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmNfcHJvZmlsZW9iaiwgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUcmFjZV9SRVRVUk4sIHJldHZhbCkpIHsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHJldHZhbCk7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKHRzdGF0ZS0+ZnJhbWUtPmZfZXhjX3R5cGUgIT0gTlVMTCkKLQkJcmVzZXRfZXhjX2luZm8odHN0YXRlKTsKLQllbHNlIHsKLQkJYXNzZXJ0KHRzdGF0ZS0+ZnJhbWUtPmZfZXhjX3ZhbHVlID09IE5VTEwpOwotCQlhc3NlcnQodHN0YXRlLT5mcmFtZS0+Zl9leGNfdHJhY2ViYWNrID09IE5VTEwpOwotCX0KKyAgICBpZiAodHN0YXRlLT5mcmFtZS0+Zl9leGNfdHlwZSAhPSBOVUxMKQorICAgICAgICByZXNldF9leGNfaW5mbyh0c3RhdGUpOworICAgIGVsc2UgeworICAgICAgICBhc3NlcnQodHN0YXRlLT5mcmFtZS0+Zl9leGNfdmFsdWUgPT0gTlVMTCk7CisgICAgICAgIGFzc2VydCh0c3RhdGUtPmZyYW1lLT5mX2V4Y190cmFjZWJhY2sgPT0gTlVMTCk7CisgICAgfQogCi0JLyogcG9wIGZyYW1lICovCisgICAgLyogcG9wIGZyYW1lICovCiBleGl0X2V2YWxfZnJhbWU6Ci0JUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JdHN0YXRlLT5mcmFtZSA9IGYtPmZfYmFjazsKKyAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICB0c3RhdGUtPmZyYW1lID0gZi0+Zl9iYWNrOwogCi0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAvKiBUaGlzIGlzIGdvbm5hIHNlZW0gKnJlYWwgd2VpcmQqLCBidXQgaWYgeW91IHB1dCBzb21lIG90aGVyIGNvZGUgYmV0d2VlbgpAQCAtMzAxMiwyOTEgKzMwMTIsMjkxIEBACiAKIFB5T2JqZWN0ICoKIFB5RXZhbF9FdmFsQ29kZUV4KFB5Q29kZU9iamVjdCAqY28sIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLAotCSAgIFB5T2JqZWN0ICoqYXJncywgaW50IGFyZ2NvdW50LCBQeU9iamVjdCAqKmt3cywgaW50IGt3Y291bnQsCi0JICAgUHlPYmplY3QgKipkZWZzLCBpbnQgZGVmY291bnQsIFB5T2JqZWN0ICpjbG9zdXJlKQorICAgICAgICAgICBQeU9iamVjdCAqKmFyZ3MsIGludCBhcmdjb3VudCwgUHlPYmplY3QgKiprd3MsIGludCBrd2NvdW50LAorICAgICAgICAgICBQeU9iamVjdCAqKmRlZnMsIGludCBkZWZjb3VudCwgUHlPYmplY3QgKmNsb3N1cmUpCiB7Ci0JcmVnaXN0ZXIgUHlGcmFtZU9iamVjdCAqZjsKLQlyZWdpc3RlciBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKLQlyZWdpc3RlciBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqZnJlZXZhcnM7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqeCwgKnU7CisgICAgcmVnaXN0ZXIgUHlGcmFtZU9iamVjdCAqZjsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqZnJlZXZhcnM7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeU9iamVjdCAqeCwgKnU7CiAKLQlpZiAoZ2xvYmFscyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiUHlFdmFsX0V2YWxDb2RlRXg6IE5VTEwgZ2xvYmFscyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGdsb2JhbHMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiUHlFdmFsX0V2YWxDb2RlRXg6IE5VTEwgZ2xvYmFscyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlhc3NlcnQodHN0YXRlICE9IE5VTEwpOwotCWFzc2VydChnbG9iYWxzICE9IE5VTEwpOwotCWYgPSBQeUZyYW1lX05ldyh0c3RhdGUsIGNvLCBnbG9iYWxzLCBsb2NhbHMpOwotCWlmIChmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGFzc2VydCh0c3RhdGUgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGdsb2JhbHMgIT0gTlVMTCk7CisgICAgZiA9IFB5RnJhbWVfTmV3KHRzdGF0ZSwgY28sIGdsb2JhbHMsIGxvY2Fscyk7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwotCWZyZWV2YXJzID0gZi0+Zl9sb2NhbHNwbHVzICsgY28tPmNvX25sb2NhbHM7CisgICAgZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKKyAgICBmcmVldmFycyA9IGYtPmZfbG9jYWxzcGx1cyArIGNvLT5jb19ubG9jYWxzOwogCi0JaWYgKGNvLT5jb19hcmdjb3VudCA+IDAgfHwKLQkgICAgY28tPmNvX2ZsYWdzICYgKENPX1ZBUkFSR1MgfCBDT19WQVJLRVlXT1JEUykpIHsKLQkJaW50IGk7Ci0JCWludCBuID0gYXJnY291bnQ7Ci0JCVB5T2JqZWN0ICprd2RpY3QgPSBOVUxMOwotCQlpZiAoY28tPmNvX2ZsYWdzICYgQ09fVkFSS0VZV09SRFMpIHsKLQkJCWt3ZGljdCA9IFB5RGljdF9OZXcoKTsKLQkJCWlmIChrd2RpY3QgPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQlpID0gY28tPmNvX2FyZ2NvdW50OwotCQkJaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpCi0JCQkJaSsrOwotCQkJU0VUTE9DQUwoaSwga3dkaWN0KTsKLQkJfQotCQlpZiAoYXJnY291bnQgPiBjby0+Y29fYXJnY291bnQpIHsKLQkJCWlmICghKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgIiUuMjAwcygpIHRha2VzICVzICVkICIKLQkJCQkgICAgImFyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCi0JCQkJICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKLQkJCQkgICAgZGVmY291bnQgPyAiYXQgbW9zdCIgOiAiZXhhY3RseSIsCi0JCQkJICAgIGNvLT5jb19hcmdjb3VudCwKLQkJCQkgICAgY28tPmNvX2FyZ2NvdW50ID09IDEgPyAiIiA6ICJzIiwKLQkJCQkgICAgYXJnY291bnQgKyBrd2NvdW50KTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCQluID0gY28tPmNvX2FyZ2NvdW50OwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXggPSBhcmdzW2ldOwotCQkJUHlfSU5DUkVGKHgpOwotCQkJU0VUTE9DQUwoaSwgeCk7Ci0JCX0KLQkJaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpIHsKLQkJCXUgPSBQeVR1cGxlX05ldyhhcmdjb3VudCAtIG4pOwotCQkJaWYgKHUgPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQlTRVRMT0NBTChjby0+Y29fYXJnY291bnQsIHUpOwotCQkJZm9yIChpID0gbjsgaSA8IGFyZ2NvdW50OyBpKyspIHsKLQkJCQl4ID0gYXJnc1tpXTsKLQkJCQlQeV9JTkNSRUYoeCk7Ci0JCQkJUHlUdXBsZV9TRVRfSVRFTSh1LCBpLW4sIHgpOwotCQkJfQotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBrd2NvdW50OyBpKyspIHsKLQkJCVB5T2JqZWN0ICoqY29fdmFybmFtZXM7Ci0JCQlQeU9iamVjdCAqa2V5d29yZCA9IGt3c1syKmldOwotCQkJUHlPYmplY3QgKnZhbHVlID0ga3dzWzIqaSArIDFdOwotCQkJaW50IGo7Ci0JCQlpZiAoa2V5d29yZCA9PSBOVUxMIHx8ICEoUHlTdHJpbmdfQ2hlY2soa2V5d29yZCkKKyAgICBpZiAoY28tPmNvX2FyZ2NvdW50ID4gMCB8fAorICAgICAgICBjby0+Y29fZmxhZ3MgJiAoQ09fVkFSQVJHUyB8IENPX1ZBUktFWVdPUkRTKSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IG4gPSBhcmdjb3VudDsKKyAgICAgICAgUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7CisgICAgICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJLRVlXT1JEUykgeworICAgICAgICAgICAga3dkaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKGt3ZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGkgPSBjby0+Y29fYXJnY291bnQ7CisgICAgICAgICAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBTRVRMT0NBTChpLCBrd2RpY3QpOworICAgICAgICB9CisgICAgICAgIGlmIChhcmdjb3VudCA+IGNvLT5jb19hcmdjb3VudCkgeworICAgICAgICAgICAgaWYgKCEoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgJXMgJWQgIgorICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQlcyAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX25hbWUpLAorICAgICAgICAgICAgICAgICAgICBkZWZjb3VudCA/ICJhdCBtb3N0IiA6ICJleGFjdGx5IiwKKyAgICAgICAgICAgICAgICAgICAgY28tPmNvX2FyZ2NvdW50LAorICAgICAgICAgICAgICAgICAgICBjby0+Y29fYXJnY291bnQgPT0gMSA/ICIiIDogInMiLAorICAgICAgICAgICAgICAgICAgICBhcmdjb3VudCArIGt3Y291bnQpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gPSBjby0+Y29fYXJnY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgeCA9IGFyZ3NbaV07CisgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICBTRVRMT0NBTChpLCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykgeworICAgICAgICAgICAgdSA9IFB5VHVwbGVfTmV3KGFyZ2NvdW50IC0gbik7CisgICAgICAgICAgICBpZiAodSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIFNFVExPQ0FMKGNvLT5jb19hcmdjb3VudCwgdSk7CisgICAgICAgICAgICBmb3IgKGkgPSBuOyBpIDwgYXJnY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHggPSBhcmdzW2ldOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHUsIGktbiwgeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGt3Y291bnQ7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKipjb192YXJuYW1lczsKKyAgICAgICAgICAgIFB5T2JqZWN0ICprZXl3b3JkID0ga3dzWzIqaV07CisgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWUgPSBrd3NbMippICsgMV07CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGlmIChrZXl3b3JkID09IE5VTEwgfHwgIShQeVN0cmluZ19DaGVjayhrZXl3b3JkKQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCQkJCSB8fCBQeVVuaWNvZGVfQ2hlY2soa2V5d29yZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBQeVVuaWNvZGVfQ2hlY2soa2V5d29yZCkKICNlbmRpZgotCQkJCSAgICApKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgIiUuMjAwcygpIGtleXdvcmRzIG11c3QgYmUgc3RyaW5ncyIsCi0JCQkJICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSk7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQkJLyogU3BlZWQgaGFjazogZG8gcmF3IHBvaW50ZXIgY29tcGFyZXMuIEFzIG5hbWVzIGFyZQotCQkJICAgbm9ybWFsbHkgaW50ZXJuZWQgdGhpcyBzaG91bGQgYWxtb3N0IGFsd2F5cyBoaXQuICovCi0JCQljb192YXJuYW1lcyA9ICgoUHlUdXBsZU9iamVjdCAqKShjby0+Y29fdmFybmFtZXMpKS0+b2JfaXRlbTsKLQkJCWZvciAoaiA9IDA7IGogPCBjby0+Y29fYXJnY291bnQ7IGorKykgewotCQkJCVB5T2JqZWN0ICpubSA9IGNvX3Zhcm5hbWVzW2pdOwotCQkJCWlmIChubSA9PSBrZXl3b3JkKQotCQkJCQlnb3RvIGt3X2ZvdW5kOwotCQkJfQotCQkJLyogU2xvdyBmYWxsYmFjaywganVzdCBpbiBjYXNlICovCi0JCQlmb3IgKGogPSAwOyBqIDwgY28tPmNvX2FyZ2NvdW50OyBqKyspIHsKLQkJCQlQeU9iamVjdCAqbm0gPSBjb192YXJuYW1lc1tqXTsKLQkJCQlpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKAotCQkJCQlrZXl3b3JkLCBubSwgUHlfRVEpOwotCQkJCWlmIChjbXAgPiAwKQotCQkJCQlnb3RvIGt3X2ZvdW5kOwotCQkJCWVsc2UgaWYgKGNtcCA8IDApCi0JCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCWlmIChrd2RpY3QgPT0gTlVMTCkgewotCQkJCVB5T2JqZWN0ICprd2Rfc3RyID0ga3dkX2FzX3N0cmluZyhrZXl3b3JkKTsKLQkJCQlpZiAoa3dkX3N0cikgewotCQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkJICAgICAiJS4yMDBzKCkgZ290IGFuIHVuZXhwZWN0ZWQgIgotCQkJCQkJICAgICAia2V5d29yZCBhcmd1bWVudCAnJS40MDBzJyIsCi0JCQkJCQkgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKLQkJCQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcoa3dkX3N0cikpOwotCQkJCQlQeV9ERUNSRUYoa3dkX3N0cik7Ci0JCQkJfQotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCVB5RGljdF9TZXRJdGVtKGt3ZGljdCwga2V5d29yZCwgdmFsdWUpOwotCQkJY29udGludWU7Ci0JCSAga3dfZm91bmQ6Ci0JCQlpZiAoR0VUTE9DQUwoaikgIT0gTlVMTCkgewotCQkJCVB5T2JqZWN0ICprd2Rfc3RyID0ga3dkX2FzX3N0cmluZyhrZXl3b3JkKTsKLQkJCQlpZiAoa3dkX3N0cikgewotCQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkJICAgICAiJS4yMDBzKCkgZ290IG11bHRpcGxlICIKLQkJCQkJCSAgICAgInZhbHVlcyBmb3Iga2V5d29yZCAiCi0JCQkJCQkgICAgICJhcmd1bWVudCAnJS40MDBzJyIsCi0JCQkJCQkgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKLQkJCQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcoa3dkX3N0cikpOwotCQkJCQlQeV9ERUNSRUYoa3dkX3N0cik7Ci0JCQkJfQotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlTRVRMT0NBTChqLCB2YWx1ZSk7Ci0JCX0KLQkJaWYgKGFyZ2NvdW50IDwgY28tPmNvX2FyZ2NvdW50KSB7Ci0JCQlpbnQgbSA9IGNvLT5jb19hcmdjb3VudCAtIGRlZmNvdW50OwotCQkJZm9yIChpID0gYXJnY291bnQ7IGkgPCBtOyBpKyspIHsKLQkJCQlpZiAoR0VUTE9DQUwoaSkgPT0gTlVMTCkgewotCQkJCQlpbnQgaiwgZ2l2ZW4gPSAwOwotCQkJCQlmb3IgKGogPSAwOyBqIDwgY28tPmNvX2FyZ2NvdW50OyBqKyspCi0JCQkJCQlpZiAoR0VUTE9DQUwoaikpCi0JCQkJCQkJZ2l2ZW4rKzsKLQkJCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICAgICIlLjIwMHMoKSB0YWtlcyAlcyAlZCAiCi0JCQkJCSAgICAiYXJndW1lbnQlcyAoJWQgZ2l2ZW4pIiwKLQkJCQkJICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKLQkJCQkJICAgICgoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykgfHwKLQkJCQkJICAgICBkZWZjb3VudCkgPyAiYXQgbGVhc3QiCi0JCQkJCQkgICAgICAgOiAiZXhhY3RseSIsCi0JCQkJCSAgICBtLCBtID09IDEgPyAiIiA6ICJzIiwgZ2l2ZW4pOwotCQkJCQlnb3RvIGZhaWw7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG4gPiBtKQotCQkJCWkgPSBuIC0gbTsKLQkJCWVsc2UKLQkJCQlpID0gMDsKLQkJCWZvciAoOyBpIDwgZGVmY291bnQ7IGkrKykgewotCQkJCWlmIChHRVRMT0NBTChtK2kpID09IE5VTEwpIHsKLQkJCQkJUHlPYmplY3QgKmRlZiA9IGRlZnNbaV07Ci0JCQkJCVB5X0lOQ1JFRihkZWYpOwotCQkJCQlTRVRMT0NBTChtK2ksIGRlZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWVsc2UgaWYgKGFyZ2NvdW50ID4gMCB8fCBrd2NvdW50ID4gMCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJS4yMDBzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglZCBnaXZlbikiLAotCQkJICAgICBQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fbmFtZSksCi0JCQkgICAgIGFyZ2NvdW50ICsga3djb3VudCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc3RvcmFnZSBmb3IgY2VsbCB2YXJzLCBhbmQgY29weSBmcmVlCi0JICAgdmFycyBpbnRvIGZyYW1lLiAgVGhpcyBpc24ndCB0b28gZWZmaWNpZW50IHJpZ2h0IG5vdy4gKi8KLQlpZiAoUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpKSB7Ci0JCWludCBpLCBqLCBuYXJncywgZm91bmQ7Ci0JCWNoYXIgKmNlbGxuYW1lLCAqYXJnbmFtZTsKLQkJUHlPYmplY3QgKmM7CisgICAgICAgICAgICAgICAgICAgICAgICApKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIiUuMjAwcygpIGtleXdvcmRzIG11c3QgYmUgc3RyaW5ncyIsCisgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogU3BlZWQgaGFjazogZG8gcmF3IHBvaW50ZXIgY29tcGFyZXMuIEFzIG5hbWVzIGFyZQorICAgICAgICAgICAgICAgbm9ybWFsbHkgaW50ZXJuZWQgdGhpcyBzaG91bGQgYWxtb3N0IGFsd2F5cyBoaXQuICovCisgICAgICAgICAgICBjb192YXJuYW1lcyA9ICgoUHlUdXBsZU9iamVjdCAqKShjby0+Y29fdmFybmFtZXMpKS0+b2JfaXRlbTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjby0+Y29fYXJnY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpubSA9IGNvX3Zhcm5hbWVzW2pdOworICAgICAgICAgICAgICAgIGlmIChubSA9PSBrZXl3b3JkKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGt3X2ZvdW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogU2xvdyBmYWxsYmFjaywganVzdCBpbiBjYXNlICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY28tPmNvX2FyZ2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqbm0gPSBjb192YXJuYW1lc1tqXTsKKyAgICAgICAgICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKAorICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLCBubSwgUHlfRVEpOworICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGt3X2ZvdW5kOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChrd2RpY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2Rfc3RyID0ga3dkX2FzX3N0cmluZyhrZXl3b3JkKTsKKyAgICAgICAgICAgICAgICBpZiAoa3dkX3N0cikgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcygpIGdvdCBhbiB1bmV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXl3b3JkIGFyZ3VtZW50ICclLjQwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGt3ZF9zdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGt3ZF9zdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeURpY3RfU2V0SXRlbShrd2RpY3QsIGtleXdvcmQsIHZhbHVlKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGt3X2ZvdW5kOgorICAgICAgICAgICAgaWYgKEdFVExPQ0FMKGopICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqa3dkX3N0ciA9IGt3ZF9hc19zdHJpbmcoa2V5d29yZCk7CisgICAgICAgICAgICAgICAgaWYgKGt3ZF9zdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSBnb3QgbXVsdGlwbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlcyBmb3Iga2V5d29yZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoa3dkX3N0cikpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa3dkX3N0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICBTRVRMT0NBTChqLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZ2NvdW50IDwgY28tPmNvX2FyZ2NvdW50KSB7CisgICAgICAgICAgICBpbnQgbSA9IGNvLT5jb19hcmdjb3VudCAtIGRlZmNvdW50OworICAgICAgICAgICAgZm9yIChpID0gYXJnY291bnQ7IGkgPCBtOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoR0VUTE9DQUwoaSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgaiwgZ2l2ZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY28tPmNvX2FyZ2NvdW50OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoR0VUTE9DQUwoaikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyAlcyAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQlcyAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZjb3VudCkgPyAiYXQgbGVhc3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImV4YWN0bHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbSwgbSA9PSAxID8gIiIgOiAicyIsIGdpdmVuKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuID4gbSkKKyAgICAgICAgICAgICAgICBpID0gbiAtIG07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBmb3IgKDsgaSA8IGRlZmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoR0VUTE9DQUwobStpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpkZWYgPSBkZWZzW2ldOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZGVmKTsKKyAgICAgICAgICAgICAgICAgICAgU0VUTE9DQUwobStpLCBkZWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChhcmdjb3VudCA+IDAgfHwga3djb3VudCA+IDApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBubyBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fbmFtZSksCisgICAgICAgICAgICAgICAgICAgICBhcmdjb3VudCArIGt3Y291bnQpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHN0b3JhZ2UgZm9yIGNlbGwgdmFycywgYW5kIGNvcHkgZnJlZQorICAgICAgIHZhcnMgaW50byBmcmFtZS4gIFRoaXMgaXNuJ3QgdG9vIGVmZmljaWVudCByaWdodCBub3cuICovCisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSkgeworICAgICAgICBpbnQgaSwgaiwgbmFyZ3MsIGZvdW5kOworICAgICAgICBjaGFyICpjZWxsbmFtZSwgKmFyZ25hbWU7CisgICAgICAgIFB5T2JqZWN0ICpjOwogCi0JCW5hcmdzID0gY28tPmNvX2FyZ2NvdW50OwotCQlpZiAoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykKLQkJCW5hcmdzKys7Ci0JCWlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJLRVlXT1JEUykKLQkJCW5hcmdzKys7CisgICAgICAgIG5hcmdzID0gY28tPmNvX2FyZ2NvdW50OworICAgICAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykKKyAgICAgICAgICAgIG5hcmdzKys7CisgICAgICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJLRVlXT1JEUykKKyAgICAgICAgICAgIG5hcmdzKys7CiAKLQkJLyogSW5pdGlhbGl6ZSBlYWNoIGNlbGwgdmFyLCB0YWtpbmcgaW50byBhY2NvdW50Ci0JCSAgIGNlbGwgdmFycyB0aGF0IGFyZSBpbml0aWFsaXplZCBmcm9tIGFyZ3VtZW50cy4KKyAgICAgICAgLyogSW5pdGlhbGl6ZSBlYWNoIGNlbGwgdmFyLCB0YWtpbmcgaW50byBhY2NvdW50CisgICAgICAgICAgIGNlbGwgdmFycyB0aGF0IGFyZSBpbml0aWFsaXplZCBmcm9tIGFyZ3VtZW50cy4KIAotCQkgICBTaG91bGQgYXJyYW5nZSBmb3IgdGhlIGNvbXBpbGVyIHRvIHB1dCBjZWxsdmFycwotCQkgICB0aGF0IGFyZSBhcmd1bWVudHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2VsbHZhcnMKLQkJICAgbGlzdCBzbyB0aGF0IHdlIGNhbiBtYXJjaCBvdmVyIGl0IG1vcmUgZWZmaWNpZW50bHk/Ci0JCSovCi0JCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycyk7ICsraSkgewotCQkJY2VsbG5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoCi0JCQkJUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fY2VsbHZhcnMsIGkpKTsKLQkJCWZvdW5kID0gMDsKLQkJCWZvciAoaiA9IDA7IGogPCBuYXJnczsgaisrKSB7Ci0JCQkJYXJnbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORygKLQkJCQkJUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fdmFybmFtZXMsIGopKTsKLQkJCQlpZiAoc3RyY21wKGNlbGxuYW1lLCBhcmduYW1lKSA9PSAwKSB7Ci0JCQkJCWMgPSBQeUNlbGxfTmV3KEdFVExPQ0FMKGopKTsKLQkJCQkJaWYgKGMgPT0gTlVMTCkKLQkJCQkJCWdvdG8gZmFpbDsKLQkJCQkJR0VUTE9DQUwoY28tPmNvX25sb2NhbHMgKyBpKSA9IGM7Ci0JCQkJCWZvdW5kID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kID09IDApIHsKLQkJCQljID0gUHlDZWxsX05ldyhOVUxMKTsKLQkJCQlpZiAoYyA9PSBOVUxMKQotCQkJCQlnb3RvIGZhaWw7Ci0JCQkJU0VUTE9DQUwoY28tPmNvX25sb2NhbHMgKyBpLCBjKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOyArK2kpIHsKLQkJCVB5T2JqZWN0ICpvID0gUHlUdXBsZV9HRVRfSVRFTShjbG9zdXJlLCBpKTsKLQkJCVB5X0lOQ1JFRihvKTsKLQkJCWZyZWV2YXJzW1B5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSArIGldID0gbzsKLQkJfQotCX0KKyAgICAgICAgICAgU2hvdWxkIGFycmFuZ2UgZm9yIHRoZSBjb21waWxlciB0byBwdXQgY2VsbHZhcnMKKyAgICAgICAgICAgdGhhdCBhcmUgYXJndW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNlbGx2YXJzCisgICAgICAgICAgIGxpc3Qgc28gdGhhdCB3ZSBjYW4gbWFyY2ggb3ZlciBpdCBtb3JlIGVmZmljaWVudGx5PworICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpOyArK2kpIHsKKyAgICAgICAgICAgIGNlbGxuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX2NlbGx2YXJzLCBpKSk7CisgICAgICAgICAgICBmb3VuZCA9IDA7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmFyZ3M7IGorKykgeworICAgICAgICAgICAgICAgIGFyZ25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoCisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX3Zhcm5hbWVzLCBqKSk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChjZWxsbmFtZSwgYXJnbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjID0gUHlDZWxsX05ldyhHRVRMT0NBTChqKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgICAgIEdFVExPQ0FMKGNvLT5jb19ubG9jYWxzICsgaSkgPSBjOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3VuZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgYyA9IFB5Q2VsbF9OZXcoTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIFNFVExPQ0FMKGNvLT5jb19ubG9jYWxzICsgaSwgYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2ZyZWV2YXJzKSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2ZyZWV2YXJzKTsgKytpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqbyA9IFB5VHVwbGVfR0VUX0lURU0oY2xvc3VyZSwgaSk7CisgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICBmcmVldmFyc1tQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycykgKyBpXSA9IG87CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoY28tPmNvX2ZsYWdzICYgQ09fR0VORVJBVE9SKSB7Ci0JCS8qIERvbid0IG5lZWQgdG8ga2VlcCB0aGUgcmVmZXJlbmNlIHRvIGZfYmFjaywgaXQgd2lsbCBiZSBzZXQKLQkJICogd2hlbiB0aGUgZ2VuZXJhdG9yIGlzIHJlc3VtZWQuICovCi0JCVB5X1hERUNSRUYoZi0+Zl9iYWNrKTsKLQkJZi0+Zl9iYWNrID0gTlVMTDsKKyAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fR0VORVJBVE9SKSB7CisgICAgICAgIC8qIERvbid0IG5lZWQgdG8ga2VlcCB0aGUgcmVmZXJlbmNlIHRvIGZfYmFjaywgaXQgd2lsbCBiZSBzZXQKKyAgICAgICAgICogd2hlbiB0aGUgZ2VuZXJhdG9yIGlzIHJlc3VtZWQuICovCisgICAgICAgIFB5X1hERUNSRUYoZi0+Zl9iYWNrKTsKKyAgICAgICAgZi0+Zl9iYWNrID0gTlVMTDsKIAotCQlQQ0FMTChQQ0FMTF9HRU5FUkFUT1IpOworICAgICAgICBQQ0FMTChQQ0FMTF9HRU5FUkFUT1IpOwogCi0JCS8qIENyZWF0ZSBhIG5ldyBnZW5lcmF0b3IgdGhhdCBvd25zIHRoZSByZWFkeSB0byBydW4gZnJhbWUKLQkJICogYW5kIHJldHVybiB0aGF0IGFzIHRoZSB2YWx1ZS4gKi8KLQkJcmV0dXJuIFB5R2VuX05ldyhmKTsKLQl9CisgICAgICAgIC8qIENyZWF0ZSBhIG5ldyBnZW5lcmF0b3IgdGhhdCBvd25zIHRoZSByZWFkeSB0byBydW4gZnJhbWUKKyAgICAgICAgICogYW5kIHJldHVybiB0aGF0IGFzIHRoZSB2YWx1ZS4gKi8KKyAgICAgICAgcmV0dXJuIFB5R2VuX05ldyhmKTsKKyAgICB9CiAKLQlyZXR2YWwgPSBQeUV2YWxfRXZhbEZyYW1lRXgoZiwwKTsKKyAgICByZXR2YWwgPSBQeUV2YWxfRXZhbEZyYW1lRXgoZiwwKTsKIAogZmFpbDogLyogSnVtcCBoZXJlIGZyb20gcHJlbHVkZSBvbiBmYWlsdXJlICovCiAKLQkvKiBkZWNyZWYnaW5nIHRoZSBmcmFtZSBjYW4gY2F1c2UgX19kZWxfXyBtZXRob2RzIHRvIGdldCBpbnZva2VkLAotCSAgIHdoaWNoIGNhbiBjYWxsIGJhY2sgaW50byBQeXRob24uICBXaGlsZSB3ZSdyZSBkb25lIHdpdGggdGhlCi0JICAgY3VycmVudCBQeXRob24gZnJhbWUgKGYpLCB0aGUgYXNzb2NpYXRlZCBDIHN0YWNrIGlzIHN0aWxsIGluIHVzZSwKLQkgICBzbyByZWN1cnNpb25fZGVwdGggbXVzdCBiZSBib29zdGVkIGZvciB0aGUgZHVyYXRpb24uCi0JKi8KLQlhc3NlcnQodHN0YXRlICE9IE5VTEwpOwotCSsrdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7Ci0JUHlfREVDUkVGKGYpOwotCS0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICAvKiBkZWNyZWYnaW5nIHRoZSBmcmFtZSBjYW4gY2F1c2UgX19kZWxfXyBtZXRob2RzIHRvIGdldCBpbnZva2VkLAorICAgICAgIHdoaWNoIGNhbiBjYWxsIGJhY2sgaW50byBQeXRob24uICBXaGlsZSB3ZSdyZSBkb25lIHdpdGggdGhlCisgICAgICAgY3VycmVudCBQeXRob24gZnJhbWUgKGYpLCB0aGUgYXNzb2NpYXRlZCBDIHN0YWNrIGlzIHN0aWxsIGluIHVzZSwKKyAgICAgICBzbyByZWN1cnNpb25fZGVwdGggbXVzdCBiZSBib29zdGVkIGZvciB0aGUgZHVyYXRpb24uCisgICAgKi8KKyAgICBhc3NlcnQodHN0YXRlICE9IE5VTEwpOworICAgICsrdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgUHlfREVDUkVGKGYpOworICAgIC0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogc3BlY2lhbF9sb29rdXAoUHlPYmplY3QgKm8sIGNoYXIgKm1ldGgsIFB5T2JqZWN0ICoqY2FjaGUpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlpZiAoUHlJbnN0YW5jZV9DaGVjayhvKSkgewotCQlpZiAoISpjYWNoZSkKLQkJCXJldHVybiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sIG1ldGgpOwotCQllbHNlCi0JCQlyZXR1cm4gUHlPYmplY3RfR2V0QXR0cihvLCAqY2FjaGUpOwotCX0KLQlyZXMgPSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbChvLCBtZXRoLCBjYWNoZSk7Ci0JaWYgKHJlcyA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgKmNhY2hlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXM7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayhvKSkgeworICAgICAgICBpZiAoISpjYWNoZSkKKyAgICAgICAgICAgIHJldHVybiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sIG1ldGgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlPYmplY3RfR2V0QXR0cihvLCAqY2FjaGUpOworICAgIH0KKyAgICByZXMgPSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbChvLCBtZXRoLCBjYWNoZSk7CisgICAgaWYgKHJlcyA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgKmNhY2hlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGt3ZF9hc19zdHJpbmcoUHlPYmplY3QgKmt3ZCkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlTdHJpbmdfQ2hlY2soa3dkKSkgeworICAgIGlmIChQeVN0cmluZ19DaGVjayhrd2QpKSB7CiAjZWxzZQotCQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2soa3dkKSk7CisgICAgICAgIGFzc2VydChQeVN0cmluZ19DaGVjayhrd2QpKTsKICNlbmRpZgotCQlQeV9JTkNSRUYoa3dkKTsKLQkJcmV0dXJuIGt3ZDsKKyAgICAgICAgUHlfSU5DUkVGKGt3ZCk7CisgICAgICAgIHJldHVybiBrd2Q7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCX0KLQlyZXR1cm4gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKGt3ZCwgInJlcGxhY2UiKTsKKyAgICB9CisgICAgcmV0dXJuIF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhrd2QsICJyZXBsYWNlIik7CiAjZW5kaWYKIH0KIApAQCAtMzMyNCwxMCArMzMyNCwxMCBAQAogICB0aGlzOgogCiAgICAgIHRyeToKLQkic29tZXRoaW5nIHRoYXQgbWF5IGZhaWwiCisgICAgInNvbWV0aGluZyB0aGF0IG1heSBmYWlsIgogICAgICBleGNlcHQgInNvbWUgZXhjZXB0aW9uIjoKLQkiZG8gc29tZXRoaW5nIGVsc2UgZmlyc3QiCi0JInByaW50IHRoZSBleGNlcHRpb24gZnJvbSBzeXMuZXhjX1paWi4iCisgICAgImRvIHNvbWV0aGluZyBlbHNlIGZpcnN0IgorICAgICJwcmludCB0aGUgZXhjZXB0aW9uIGZyb20gc3lzLmV4Y19aWlouIgogCiAgIGlmICJkbyBzb21ldGhpbmcgZWxzZSBmaXJzdCIgaW52b2tlZCBzb21ldGhpbmcgdGhhdCByYWlzZWQgYW5kIGNhdWdodAogICBhbiBleGNlcHRpb24sIHN5cy5leGNfWlpaIHdlcmUgb3ZlcndyaXR0ZW4uICBUaGF0IHdhcyBhIGZyZXF1ZW50CkBAIC0zMzY1LDkyICszMzY1LDkyIEBACiAKIHN0YXRpYyB2b2lkCiBzZXRfZXhjX2luZm8oUHlUaHJlYWRTdGF0ZSAqdHN0YXRlLAotCSAgICAgUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSwgUHlPYmplY3QgKnRiKQorICAgICAgICAgICAgIFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIFB5T2JqZWN0ICp0YikKIHsKLQlQeUZyYW1lT2JqZWN0ICpmcmFtZSA9IHRzdGF0ZS0+ZnJhbWU7Ci0JUHlPYmplY3QgKnRtcF90eXBlLCAqdG1wX3ZhbHVlLCAqdG1wX3RiOworICAgIFB5RnJhbWVPYmplY3QgKmZyYW1lID0gdHN0YXRlLT5mcmFtZTsKKyAgICBQeU9iamVjdCAqdG1wX3R5cGUsICp0bXBfdmFsdWUsICp0bXBfdGI7CiAKLQlhc3NlcnQodHlwZSAhPSBOVUxMKTsKLQlhc3NlcnQoZnJhbWUgIT0gTlVMTCk7Ci0JaWYgKGZyYW1lLT5mX2V4Y190eXBlID09IE5VTEwpIHsKLQkJYXNzZXJ0KGZyYW1lLT5mX2V4Y192YWx1ZSA9PSBOVUxMKTsKLQkJYXNzZXJ0KGZyYW1lLT5mX2V4Y190cmFjZWJhY2sgPT0gTlVMTCk7Ci0JCS8qIFRoaXMgZnJhbWUgZGlkbid0IGNhdGNoIGFuIGV4Y2VwdGlvbiBiZWZvcmUuICovCi0JCS8qIFNhdmUgcHJldmlvdXMgZXhjZXB0aW9uIG9mIHRoaXMgdGhyZWFkIGluIHRoaXMgZnJhbWUuICovCi0JCWlmICh0c3RhdGUtPmV4Y190eXBlID09IE5VTEwpIHsKLQkJCS8qIFhYWCBXaHkgaXMgdGhpcyBzZXQgdG8gUHlfTm9uZT8gKi8KLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXRzdGF0ZS0+ZXhjX3R5cGUgPSBQeV9Ob25lOwotCQl9Ci0JCVB5X0lOQ1JFRih0c3RhdGUtPmV4Y190eXBlKTsKLQkJUHlfWElOQ1JFRih0c3RhdGUtPmV4Y192YWx1ZSk7Ci0JCVB5X1hJTkNSRUYodHN0YXRlLT5leGNfdHJhY2ViYWNrKTsKLQkJZnJhbWUtPmZfZXhjX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOwotCQlmcmFtZS0+Zl9leGNfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKLQkJZnJhbWUtPmZfZXhjX3RyYWNlYmFjayA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKLQl9Ci0JLyogU2V0IG5ldyBleGNlcHRpb24gZm9yIHRoaXMgdGhyZWFkLiAqLwotCXRtcF90eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKLQl0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKLQl0bXBfdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7Ci0JUHlfSU5DUkVGKHR5cGUpOwotCVB5X1hJTkNSRUYodmFsdWUpOwotCVB5X1hJTkNSRUYodGIpOwotCXRzdGF0ZS0+ZXhjX3R5cGUgPSB0eXBlOwotCXRzdGF0ZS0+ZXhjX3ZhbHVlID0gdmFsdWU7Ci0JdHN0YXRlLT5leGNfdHJhY2ViYWNrID0gdGI7Ci0JUHlfWERFQ1JFRih0bXBfdHlwZSk7Ci0JUHlfWERFQ1JFRih0bXBfdmFsdWUpOwotCVB5X1hERUNSRUYodG1wX3RiKTsKLQkvKiBGb3IgYi93IGNvbXBhdGliaWxpdHkgKi8KLQlQeVN5c19TZXRPYmplY3QoImV4Y190eXBlIiwgdHlwZSk7Ci0JUHlTeXNfU2V0T2JqZWN0KCJleGNfdmFsdWUiLCB2YWx1ZSk7Ci0JUHlTeXNfU2V0T2JqZWN0KCJleGNfdHJhY2ViYWNrIiwgdGIpOworICAgIGFzc2VydCh0eXBlICE9IE5VTEwpOworICAgIGFzc2VydChmcmFtZSAhPSBOVUxMKTsKKyAgICBpZiAoZnJhbWUtPmZfZXhjX3R5cGUgPT0gTlVMTCkgeworICAgICAgICBhc3NlcnQoZnJhbWUtPmZfZXhjX3ZhbHVlID09IE5VTEwpOworICAgICAgICBhc3NlcnQoZnJhbWUtPmZfZXhjX3RyYWNlYmFjayA9PSBOVUxMKTsKKyAgICAgICAgLyogVGhpcyBmcmFtZSBkaWRuJ3QgY2F0Y2ggYW4gZXhjZXB0aW9uIGJlZm9yZS4gKi8KKyAgICAgICAgLyogU2F2ZSBwcmV2aW91cyBleGNlcHRpb24gb2YgdGhpcyB0aHJlYWQgaW4gdGhpcyBmcmFtZS4gKi8KKyAgICAgICAgaWYgKHRzdGF0ZS0+ZXhjX3R5cGUgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogWFhYIFdoeSBpcyB0aGlzIHNldCB0byBQeV9Ob25lPyAqLworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgdHN0YXRlLT5leGNfdHlwZSA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKHRzdGF0ZS0+ZXhjX3R5cGUpOworICAgICAgICBQeV9YSU5DUkVGKHRzdGF0ZS0+ZXhjX3ZhbHVlKTsKKyAgICAgICAgUHlfWElOQ1JFRih0c3RhdGUtPmV4Y190cmFjZWJhY2spOworICAgICAgICBmcmFtZS0+Zl9leGNfdHlwZSA9IHRzdGF0ZS0+ZXhjX3R5cGU7CisgICAgICAgIGZyYW1lLT5mX2V4Y192YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOworICAgICAgICBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrID0gdHN0YXRlLT5leGNfdHJhY2ViYWNrOworICAgIH0KKyAgICAvKiBTZXQgbmV3IGV4Y2VwdGlvbiBmb3IgdGhpcyB0aHJlYWQuICovCisgICAgdG1wX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOworICAgIHRtcF92YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOworICAgIHRtcF90YiA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKKyAgICBQeV9JTkNSRUYodHlwZSk7CisgICAgUHlfWElOQ1JFRih2YWx1ZSk7CisgICAgUHlfWElOQ1JFRih0Yik7CisgICAgdHN0YXRlLT5leGNfdHlwZSA9IHR5cGU7CisgICAgdHN0YXRlLT5leGNfdmFsdWUgPSB2YWx1ZTsKKyAgICB0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSB0YjsKKyAgICBQeV9YREVDUkVGKHRtcF90eXBlKTsKKyAgICBQeV9YREVDUkVGKHRtcF92YWx1ZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdGIpOworICAgIC8qIEZvciBiL3cgY29tcGF0aWJpbGl0eSAqLworICAgIFB5U3lzX1NldE9iamVjdCgiZXhjX3R5cGUiLCB0eXBlKTsKKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y192YWx1ZSIsIHZhbHVlKTsKKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y190cmFjZWJhY2siLCB0Yik7CiB9CiAKIHN0YXRpYyB2b2lkCiByZXNldF9leGNfaW5mbyhQeVRocmVhZFN0YXRlICp0c3RhdGUpCiB7Ci0JUHlGcmFtZU9iamVjdCAqZnJhbWU7Ci0JUHlPYmplY3QgKnRtcF90eXBlLCAqdG1wX3ZhbHVlLCAqdG1wX3RiOworICAgIFB5RnJhbWVPYmplY3QgKmZyYW1lOworICAgIFB5T2JqZWN0ICp0bXBfdHlwZSwgKnRtcF92YWx1ZSwgKnRtcF90YjsKIAotCS8qIEl0J3MgYSBwcmVjb25kaXRpb24gdGhhdCB0aGUgdGhyZWFkIHN0YXRlJ3MgZnJhbWUgY2F1Z2h0IGFuCi0JICogZXhjZXB0aW9uIC0tIHZlcmlmeSBpbiBhIGRlYnVnIGJ1aWxkLgotCSAqLwotCWFzc2VydCh0c3RhdGUgIT0gTlVMTCk7Ci0JZnJhbWUgPSB0c3RhdGUtPmZyYW1lOwotCWFzc2VydChmcmFtZSAhPSBOVUxMKTsKLQlhc3NlcnQoZnJhbWUtPmZfZXhjX3R5cGUgIT0gTlVMTCk7CisgICAgLyogSXQncyBhIHByZWNvbmRpdGlvbiB0aGF0IHRoZSB0aHJlYWQgc3RhdGUncyBmcmFtZSBjYXVnaHQgYW4KKyAgICAgKiBleGNlcHRpb24gLS0gdmVyaWZ5IGluIGEgZGVidWcgYnVpbGQuCisgICAgICovCisgICAgYXNzZXJ0KHRzdGF0ZSAhPSBOVUxMKTsKKyAgICBmcmFtZSA9IHRzdGF0ZS0+ZnJhbWU7CisgICAgYXNzZXJ0KGZyYW1lICE9IE5VTEwpOworICAgIGFzc2VydChmcmFtZS0+Zl9leGNfdHlwZSAhPSBOVUxMKTsKIAotCS8qIENvcHkgdGhlIGZyYW1lJ3MgZXhjZXB0aW9uIGluZm8gYmFjayB0byB0aGUgdGhyZWFkIHN0YXRlLiAqLwotCXRtcF90eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKLQl0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKLQl0bXBfdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7Ci0JUHlfSU5DUkVGKGZyYW1lLT5mX2V4Y190eXBlKTsKLQlQeV9YSU5DUkVGKGZyYW1lLT5mX2V4Y192YWx1ZSk7Ci0JUHlfWElOQ1JFRihmcmFtZS0+Zl9leGNfdHJhY2ViYWNrKTsKLQl0c3RhdGUtPmV4Y190eXBlID0gZnJhbWUtPmZfZXhjX3R5cGU7Ci0JdHN0YXRlLT5leGNfdmFsdWUgPSBmcmFtZS0+Zl9leGNfdmFsdWU7Ci0JdHN0YXRlLT5leGNfdHJhY2ViYWNrID0gZnJhbWUtPmZfZXhjX3RyYWNlYmFjazsKLQlQeV9YREVDUkVGKHRtcF90eXBlKTsKLQlQeV9YREVDUkVGKHRtcF92YWx1ZSk7Ci0JUHlfWERFQ1JFRih0bXBfdGIpOworICAgIC8qIENvcHkgdGhlIGZyYW1lJ3MgZXhjZXB0aW9uIGluZm8gYmFjayB0byB0aGUgdGhyZWFkIHN0YXRlLiAqLworICAgIHRtcF90eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKKyAgICB0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKKyAgICB0bXBfdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7CisgICAgUHlfSU5DUkVGKGZyYW1lLT5mX2V4Y190eXBlKTsKKyAgICBQeV9YSU5DUkVGKGZyYW1lLT5mX2V4Y192YWx1ZSk7CisgICAgUHlfWElOQ1JFRihmcmFtZS0+Zl9leGNfdHJhY2ViYWNrKTsKKyAgICB0c3RhdGUtPmV4Y190eXBlID0gZnJhbWUtPmZfZXhjX3R5cGU7CisgICAgdHN0YXRlLT5leGNfdmFsdWUgPSBmcmFtZS0+Zl9leGNfdmFsdWU7CisgICAgdHN0YXRlLT5leGNfdHJhY2ViYWNrID0gZnJhbWUtPmZfZXhjX3RyYWNlYmFjazsKKyAgICBQeV9YREVDUkVGKHRtcF90eXBlKTsKKyAgICBQeV9YREVDUkVGKHRtcF92YWx1ZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdGIpOwogCi0JLyogRm9yIGIvdyBjb21wYXRpYmlsaXR5ICovCi0JUHlTeXNfU2V0T2JqZWN0KCJleGNfdHlwZSIsIGZyYW1lLT5mX2V4Y190eXBlKTsKLQlQeVN5c19TZXRPYmplY3QoImV4Y192YWx1ZSIsIGZyYW1lLT5mX2V4Y192YWx1ZSk7Ci0JUHlTeXNfU2V0T2JqZWN0KCJleGNfdHJhY2ViYWNrIiwgZnJhbWUtPmZfZXhjX3RyYWNlYmFjayk7CisgICAgLyogRm9yIGIvdyBjb21wYXRpYmlsaXR5ICovCisgICAgUHlTeXNfU2V0T2JqZWN0KCJleGNfdHlwZSIsIGZyYW1lLT5mX2V4Y190eXBlKTsKKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y192YWx1ZSIsIGZyYW1lLT5mX2V4Y192YWx1ZSk7CisgICAgUHlTeXNfU2V0T2JqZWN0KCJleGNfdHJhY2ViYWNrIiwgZnJhbWUtPmZfZXhjX3RyYWNlYmFjayk7CiAKLQkvKiBDbGVhciB0aGUgZnJhbWUncyBleGNlcHRpb24gaW5mby4gKi8KLQl0bXBfdHlwZSA9IGZyYW1lLT5mX2V4Y190eXBlOwotCXRtcF92YWx1ZSA9IGZyYW1lLT5mX2V4Y192YWx1ZTsKLQl0bXBfdGIgPSBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrOwotCWZyYW1lLT5mX2V4Y190eXBlID0gTlVMTDsKLQlmcmFtZS0+Zl9leGNfdmFsdWUgPSBOVUxMOwotCWZyYW1lLT5mX2V4Y190cmFjZWJhY2sgPSBOVUxMOwotCVB5X0RFQ1JFRih0bXBfdHlwZSk7Ci0JUHlfWERFQ1JFRih0bXBfdmFsdWUpOwotCVB5X1hERUNSRUYodG1wX3RiKTsKKyAgICAvKiBDbGVhciB0aGUgZnJhbWUncyBleGNlcHRpb24gaW5mby4gKi8KKyAgICB0bXBfdHlwZSA9IGZyYW1lLT5mX2V4Y190eXBlOworICAgIHRtcF92YWx1ZSA9IGZyYW1lLT5mX2V4Y192YWx1ZTsKKyAgICB0bXBfdGIgPSBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrOworICAgIGZyYW1lLT5mX2V4Y190eXBlID0gTlVMTDsKKyAgICBmcmFtZS0+Zl9leGNfdmFsdWUgPSBOVUxMOworICAgIGZyYW1lLT5mX2V4Y190cmFjZWJhY2sgPSBOVUxMOworICAgIFB5X0RFQ1JFRih0bXBfdHlwZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdmFsdWUpOworICAgIFB5X1hERUNSRUYodG1wX3RiKTsKIH0KIAogLyogTG9naWMgZm9yIHRoZSByYWlzZSBzdGF0ZW1lbnQgKHRvbyBjb21wbGljYXRlZCBmb3IgaW5saW5pbmcpLgpAQCAtMzQ1OCwxMDggKzM0NTgsMTA4IEBACiBzdGF0aWMgZW51bSB3aHlfY29kZQogZG9fcmFpc2UoUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSwgUHlPYmplY3QgKnRiKQogewotCWlmICh0eXBlID09IE5VTEwpIHsKLQkJLyogUmVyYWlzZSAqLwotCQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCQl0eXBlID0gdHN0YXRlLT5leGNfdHlwZSA9PSBOVUxMID8gUHlfTm9uZSA6IHRzdGF0ZS0+ZXhjX3R5cGU7Ci0JCXZhbHVlID0gdHN0YXRlLT5leGNfdmFsdWU7Ci0JCXRiID0gdHN0YXRlLT5leGNfdHJhY2ViYWNrOwotCQlQeV9YSU5DUkVGKHR5cGUpOwotCQlQeV9YSU5DUkVGKHZhbHVlKTsKLQkJUHlfWElOQ1JFRih0Yik7Ci0JfQorICAgIGlmICh0eXBlID09IE5VTEwpIHsKKyAgICAgICAgLyogUmVyYWlzZSAqLworICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgICAgICB0eXBlID0gdHN0YXRlLT5leGNfdHlwZSA9PSBOVUxMID8gUHlfTm9uZSA6IHRzdGF0ZS0+ZXhjX3R5cGU7CisgICAgICAgIHZhbHVlID0gdHN0YXRlLT5leGNfdmFsdWU7CisgICAgICAgIHRiID0gdHN0YXRlLT5leGNfdHJhY2ViYWNrOworICAgICAgICBQeV9YSU5DUkVGKHR5cGUpOworICAgICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgUHlfWElOQ1JFRih0Yik7CisgICAgfQogCi0JLyogV2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIGZvcm1zIG9mIHJhaXNlOgotCSAgIHJhaXNlIDxjbGFzcz4sIDxjbGFzc2luc3RhbmNlPgotCSAgIHJhaXNlIDxjbGFzcz4sIDxhcmd1bWVudCB0dXBsZT4KLQkgICByYWlzZSA8Y2xhc3M+LCBOb25lCi0JICAgcmFpc2UgPGNsYXNzPiwgPGFyZ3VtZW50PgotCSAgIHJhaXNlIDxjbGFzc2luc3RhbmNlPiwgTm9uZQotCSAgIHJhaXNlIDxzdHJpbmc+LCA8b2JqZWN0PgotCSAgIHJhaXNlIDxzdHJpbmc+LCBOb25lCisgICAgLyogV2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIGZvcm1zIG9mIHJhaXNlOgorICAgICAgIHJhaXNlIDxjbGFzcz4sIDxjbGFzc2luc3RhbmNlPgorICAgICAgIHJhaXNlIDxjbGFzcz4sIDxhcmd1bWVudCB0dXBsZT4KKyAgICAgICByYWlzZSA8Y2xhc3M+LCBOb25lCisgICAgICAgcmFpc2UgPGNsYXNzPiwgPGFyZ3VtZW50PgorICAgICAgIHJhaXNlIDxjbGFzc2luc3RhbmNlPiwgTm9uZQorICAgICAgIHJhaXNlIDxzdHJpbmc+LCA8b2JqZWN0PgorICAgICAgIHJhaXNlIDxzdHJpbmc+LCBOb25lCiAKLQkgICBBbiBvbWl0dGVkIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgc2FtZSBhcyBOb25lLgorICAgICAgIEFuIG9taXR0ZWQgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBzYW1lIGFzIE5vbmUuCiAKLQkgICBJbiBhZGRpdGlvbiwgcmFpc2UgPHR1cGxlPiwgPGFueXRoaW5nPiBpcyB0aGUgc2FtZSBhcwotCSAgIHJhaXNpbmcgdGhlIHR1cGxlJ3MgZmlyc3QgaXRlbSAoYW5kIGl0IGJldHRlciBoYXZlIG9uZSEpOwotCSAgIHRoaXMgcnVsZSBpcyBhcHBsaWVkIHJlY3Vyc2l2ZWx5LgorICAgICAgIEluIGFkZGl0aW9uLCByYWlzZSA8dHVwbGU+LCA8YW55dGhpbmc+IGlzIHRoZSBzYW1lIGFzCisgICAgICAgcmFpc2luZyB0aGUgdHVwbGUncyBmaXJzdCBpdGVtIChhbmQgaXQgYmV0dGVyIGhhdmUgb25lISk7CisgICAgICAgdGhpcyBydWxlIGlzIGFwcGxpZWQgcmVjdXJzaXZlbHkuCiAKLQkgICBGaW5hbGx5LCBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCBjYW4gYmUgc3VwcGxpZWQsIHdoaWNoCi0JICAgZ2l2ZXMgdGhlIHRyYWNlYmFjayB0byBiZSBzdWJzdGl0dXRlZCAodXNlZnVsIHdoZW4KLQkgICByZS1yYWlzaW5nIGFuIGV4Y2VwdGlvbiBhZnRlciBleGFtaW5pbmcgaXQpLiAgKi8KKyAgICAgICBGaW5hbGx5LCBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCBjYW4gYmUgc3VwcGxpZWQsIHdoaWNoCisgICAgICAgZ2l2ZXMgdGhlIHRyYWNlYmFjayB0byBiZSBzdWJzdGl0dXRlZCAodXNlZnVsIHdoZW4KKyAgICAgICByZS1yYWlzaW5nIGFuIGV4Y2VwdGlvbiBhZnRlciBleGFtaW5pbmcgaXQpLiAgKi8KIAotCS8qIEZpcnN0LCBjaGVjayB0aGUgdHJhY2ViYWNrIGFyZ3VtZW50LCByZXBsYWNpbmcgTm9uZSB3aXRoCi0JICAgTlVMTC4gKi8KLQlpZiAodGIgPT0gUHlfTm9uZSkgewotCQlQeV9ERUNSRUYodGIpOwotCQl0YiA9IE5VTEw7Ci0JfQotCWVsc2UgaWYgKHRiICE9IE5VTEwgJiYgIVB5VHJhY2VCYWNrX0NoZWNrKHRiKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgInJhaXNlOiBhcmcgMyBtdXN0IGJlIGEgdHJhY2ViYWNrIG9yIE5vbmUiKTsKLQkJZ290byByYWlzZV9lcnJvcjsKLQl9CisgICAgLyogRmlyc3QsIGNoZWNrIHRoZSB0cmFjZWJhY2sgYXJndW1lbnQsIHJlcGxhY2luZyBOb25lIHdpdGgKKyAgICAgICBOVUxMLiAqLworICAgIGlmICh0YiA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0RFQ1JFRih0Yik7CisgICAgICAgIHRiID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAodGIgIT0gTlVMTCAmJiAhUHlUcmFjZUJhY2tfQ2hlY2sodGIpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgInJhaXNlOiBhcmcgMyBtdXN0IGJlIGEgdHJhY2ViYWNrIG9yIE5vbmUiKTsKKyAgICAgICAgZ290byByYWlzZV9lcnJvcjsKKyAgICB9CiAKLQkvKiBOZXh0LCByZXBsYWNlIGEgbWlzc2luZyB2YWx1ZSB3aXRoIE5vbmUgKi8KLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQl2YWx1ZSA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JfQorICAgIC8qIE5leHQsIHJlcGxhY2UgYSBtaXNzaW5nIHZhbHVlIHdpdGggTm9uZSAqLworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHZhbHVlID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICB9CiAKLQkvKiBOZXh0LCByZXBlYXRlZGx5LCByZXBsYWNlIGEgdHVwbGUgZXhjZXB0aW9uIHdpdGggaXRzIGZpcnN0IGl0ZW0gKi8KLQl3aGlsZSAoUHlUdXBsZV9DaGVjayh0eXBlKSAmJiBQeVR1cGxlX1NpemUodHlwZSkgPiAwKSB7Ci0JCVB5T2JqZWN0ICp0bXAgPSB0eXBlOwotCQl0eXBlID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlLCAwKTsKLQkJUHlfSU5DUkVGKHR5cGUpOwotCQlQeV9ERUNSRUYodG1wKTsKLQl9CisgICAgLyogTmV4dCwgcmVwZWF0ZWRseSwgcmVwbGFjZSBhIHR1cGxlIGV4Y2VwdGlvbiB3aXRoIGl0cyBmaXJzdCBpdGVtICovCisgICAgd2hpbGUgKFB5VHVwbGVfQ2hlY2sodHlwZSkgJiYgUHlUdXBsZV9TaXplKHR5cGUpID4gMCkgeworICAgICAgICBQeU9iamVjdCAqdG1wID0gdHlwZTsKKyAgICAgICAgdHlwZSA9IFB5VHVwbGVfR0VUX0lURU0odHlwZSwgMCk7CisgICAgICAgIFB5X0lOQ1JFRih0eXBlKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgfQogCi0JaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwZSkpCi0JCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmdHlwZSwgJnZhbHVlLCAmdGIpOworICAgIGlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHR5cGUpKQorICAgICAgICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJnR5cGUsICZ2YWx1ZSwgJnRiKTsKIAotCWVsc2UgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodHlwZSkpIHsKLQkJLyogUmFpc2luZyBhbiBpbnN0YW5jZS4gIFRoZSB2YWx1ZSBzaG91bGQgYmUgYSBkdW1teS4gKi8KLQkJaWYgKHZhbHVlICE9IFB5X05vbmUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICJpbnN0YW5jZSBleGNlcHRpb24gbWF5IG5vdCBoYXZlIGEgc2VwYXJhdGUgdmFsdWUiKTsKLQkJCWdvdG8gcmFpc2VfZXJyb3I7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBOb3JtYWxpemUgdG8gcmFpc2UgPGNsYXNzPiwgPGluc3RhbmNlPiAqLwotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCXZhbHVlID0gdHlwZTsKLQkJCXR5cGUgPSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHR5cGUpOwotCQkJUHlfSU5DUkVGKHR5cGUpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBOb3Qgc29tZXRoaW5nIHlvdSBjYW4gcmFpc2UuICBZb3UgZ2V0IGFuIGV4Y2VwdGlvbgotCQkgICBhbnl3YXksIGp1c3Qgbm90IHdoYXQgeW91IHNwZWNpZmllZCA6LSkgKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImV4Y2VwdGlvbnMgbXVzdCBiZSBvbGQtc3R5bGUgY2xhc3NlcyBvciAiCi0JCQkgICAgICJkZXJpdmVkIGZyb20gQmFzZUV4Y2VwdGlvbiwgbm90ICVzIiwKLQkJCSAgICAgdHlwZS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCWdvdG8gcmFpc2VfZXJyb3I7Ci0JfQorICAgIGVsc2UgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodHlwZSkpIHsKKyAgICAgICAgLyogUmFpc2luZyBhbiBpbnN0YW5jZS4gIFRoZSB2YWx1ZSBzaG91bGQgYmUgYSBkdW1teS4gKi8KKyAgICAgICAgaWYgKHZhbHVlICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICJpbnN0YW5jZSBleGNlcHRpb24gbWF5IG5vdCBoYXZlIGEgc2VwYXJhdGUgdmFsdWUiKTsKKyAgICAgICAgICAgIGdvdG8gcmFpc2VfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBOb3JtYWxpemUgdG8gcmFpc2UgPGNsYXNzPiwgPGluc3RhbmNlPiAqLworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHZhbHVlID0gdHlwZTsKKyAgICAgICAgICAgIHR5cGUgPSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHR5cGUpOworICAgICAgICAgICAgUHlfSU5DUkVGKHR5cGUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBOb3Qgc29tZXRoaW5nIHlvdSBjYW4gcmFpc2UuICBZb3UgZ2V0IGFuIGV4Y2VwdGlvbgorICAgICAgICAgICBhbnl3YXksIGp1c3Qgbm90IHdoYXQgeW91IHNwZWNpZmllZCA6LSkgKi8KKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb25zIG11c3QgYmUgb2xkLXN0eWxlIGNsYXNzZXMgb3IgIgorICAgICAgICAgICAgICAgICAgICAgImRlcml2ZWQgZnJvbSBCYXNlRXhjZXB0aW9uLCBub3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIGdvdG8gcmFpc2VfZXJyb3I7CisgICAgfQogCi0JYXNzZXJ0KFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwZSkpOwotCWlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYgUHlDbGFzc19DaGVjayh0eXBlKSkgewotCQlpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkiZXhjZXB0aW9ucyBtdXN0IGRlcml2ZSBmcm9tIEJhc2VFeGNlcHRpb24gIgotCQkJCSJpbiAzLngiLCAxKSA8IDApCi0JCQlnb3RvIHJhaXNlX2Vycm9yOwotCX0KKyAgICBhc3NlcnQoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0eXBlKSk7CisgICAgaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAmJiBQeUNsYXNzX0NoZWNrKHR5cGUpKSB7CisgICAgICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnMgbXVzdCBkZXJpdmUgZnJvbSBCYXNlRXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbiAzLngiLCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIHJhaXNlX2Vycm9yOworICAgIH0KIAotCVB5RXJyX1Jlc3RvcmUodHlwZSwgdmFsdWUsIHRiKTsKLQlpZiAodGIgPT0gTlVMTCkKLQkJcmV0dXJuIFdIWV9FWENFUFRJT047Ci0JZWxzZQotCQlyZXR1cm4gV0hZX1JFUkFJU0U7CisgICAgUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdGIpOworICAgIGlmICh0YiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gV0hZX0VYQ0VQVElPTjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBXSFlfUkVSQUlTRTsKICByYWlzZV9lcnJvcjoKLQlQeV9YREVDUkVGKHZhbHVlKTsKLQlQeV9YREVDUkVGKHR5cGUpOwotCVB5X1hERUNSRUYodGIpOwotCXJldHVybiBXSFlfRVhDRVBUSU9OOworICAgIFB5X1hERUNSRUYodmFsdWUpOworICAgIFB5X1hERUNSRUYodHlwZSk7CisgICAgUHlfWERFQ1JFRih0Yik7CisgICAgcmV0dXJuIFdIWV9FWENFUFRJT047CiB9CiAKIC8qIEl0ZXJhdGUgdiBhcmdjbnQgdGltZXMgYW5kIHN0b3JlIHRoZSByZXN1bHRzIG9uIHRoZSBzdGFjayAodmlhIGRlY3JlYXNpbmcKQEAgLTM1NjgsNDYgKzM1NjgsNDYgQEAKIHN0YXRpYyBpbnQKIHVucGFja19pdGVyYWJsZShQeU9iamVjdCAqdiwgaW50IGFyZ2NudCwgUHlPYmplY3QgKipzcCkKIHsKLQlpbnQgaSA9IDA7Ci0JUHlPYmplY3QgKml0OyAgLyogaXRlcih2KSAqLwotCVB5T2JqZWN0ICp3OworICAgIGludCBpID0gMDsKKyAgICBQeU9iamVjdCAqaXQ7ICAvKiBpdGVyKHYpICovCisgICAgUHlPYmplY3QgKnc7CiAKLQlhc3NlcnQodiAhPSBOVUxMKTsKKyAgICBhc3NlcnQodiAhPSBOVUxMKTsKIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJZ290byBFcnJvcjsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIGdvdG8gRXJyb3I7CiAKLQlmb3IgKDsgaSA8IGFyZ2NudDsgaSsrKSB7Ci0JCXcgPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCS8qIEl0ZXJhdG9yIGRvbmUsIHZpYSBlcnJvciBvciBleGhhdXN0aW9uLiAqLwotCQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJuZWVkIG1vcmUgdGhhbiAlZCB2YWx1ZSVzIHRvIHVucGFjayIsCi0JCQkJCWksIGkgPT0gMSA/ICIiIDogInMiKTsKLQkJCX0KLQkJCWdvdG8gRXJyb3I7Ci0JCX0KLQkJKi0tc3AgPSB3OwotCX0KKyAgICBmb3IgKDsgaSA8IGFyZ2NudDsgaSsrKSB7CisgICAgICAgIHcgPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIEl0ZXJhdG9yIGRvbmUsIHZpYSBlcnJvciBvciBleGhhdXN0aW9uLiAqLworICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJuZWVkIG1vcmUgdGhhbiAlZCB2YWx1ZSVzIHRvIHVucGFjayIsCisgICAgICAgICAgICAgICAgICAgIGksIGkgPT0gMSA/ICIiIDogInMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgKi0tc3AgPSB3OworICAgIH0KIAotCS8qIFdlIGJldHRlciBoYXZlIGV4aGF1c3RlZCB0aGUgaXRlcmF0b3Igbm93LiAqLwotCXcgPSBQeUl0ZXJfTmV4dChpdCk7Ci0JaWYgKHcgPT0gTlVMTCkgewotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gRXJyb3I7Ci0JCVB5X0RFQ1JFRihpdCk7Ci0JCXJldHVybiAxOwotCX0KLQlQeV9ERUNSRUYodyk7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ0b28gbWFueSB2YWx1ZXMgdG8gdW5wYWNrIik7Ci0JLyogZmFsbCB0aHJvdWdoICovCisgICAgLyogV2UgYmV0dGVyIGhhdmUgZXhoYXVzdGVkIHRoZSBpdGVyYXRvciBub3cuICovCisgICAgdyA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5X0RFQ1JFRih3KTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInRvbyBtYW55IHZhbHVlcyB0byB1bnBhY2siKTsKKyAgICAvKiBmYWxsIHRocm91Z2ggKi8KIEVycm9yOgotCWZvciAoOyBpID4gMDsgaS0tLCBzcCsrKQotCQlQeV9ERUNSRUYoKnNwKTsKLQlQeV9YREVDUkVGKGl0KTsKLQlyZXR1cm4gMDsKKyAgICBmb3IgKDsgaSA+IDA7IGktLSwgc3ArKykKKyAgICAgICAgUHlfREVDUkVGKCpzcCk7CisgICAgUHlfWERFQ1JFRihpdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMzYxNSwyMzggKzM2MTUsMjM4IEBACiBzdGF0aWMgaW50CiBwcnRyYWNlKFB5T2JqZWN0ICp2LCBjaGFyICpzdHIpCiB7Ci0JcHJpbnRmKCIlcyAiLCBzdHIpOwotCWlmIChQeU9iamVjdF9QcmludCh2LCBzdGRvdXQsIDApICE9IDApCi0JCVB5RXJyX0NsZWFyKCk7IC8qIERvbid0IGtub3cgd2hhdCBlbHNlIHRvIGRvICovCi0JcHJpbnRmKCJcbiIpOwotCXJldHVybiAxOworICAgIHByaW50ZigiJXMgIiwgc3RyKTsKKyAgICBpZiAoUHlPYmplY3RfUHJpbnQodiwgc3Rkb3V0LCAwKSAhPSAwKQorICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBEb24ndCBrbm93IHdoYXQgZWxzZSB0byBkbyAqLworICAgIHByaW50ZigiXG4iKTsKKyAgICByZXR1cm4gMTsKIH0KICNlbmRpZgogCiBzdGF0aWMgdm9pZAogY2FsbF9leGNfdHJhY2UoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICpzZWxmLCBQeUZyYW1lT2JqZWN0ICpmKQogewotCVB5T2JqZWN0ICp0eXBlLCAqdmFsdWUsICp0cmFjZWJhY2ssICphcmc7Ci0JaW50IGVycjsKLQlQeUVycl9GZXRjaCgmdHlwZSwgJnZhbHVlLCAmdHJhY2ViYWNrKTsKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQl2YWx1ZSA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JfQotCWFyZyA9IFB5VHVwbGVfUGFjaygzLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKLQlpZiAoYXJnID09IE5VTEwpIHsKLQkJUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKLQkJcmV0dXJuOwotCX0KLQllcnIgPSBjYWxsX3RyYWNlKGZ1bmMsIHNlbGYsIGYsIFB5VHJhY2VfRVhDRVBUSU9OLCBhcmcpOwotCVB5X0RFQ1JFRihhcmcpOwotCWlmIChlcnIgPT0gMCkKLQkJUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKLQllbHNlIHsKLQkJUHlfWERFQ1JFRih0eXBlKTsKLQkJUHlfWERFQ1JFRih2YWx1ZSk7Ci0JCVB5X1hERUNSRUYodHJhY2ViYWNrKTsKLQl9CisgICAgUHlPYmplY3QgKnR5cGUsICp2YWx1ZSwgKnRyYWNlYmFjaywgKmFyZzsKKyAgICBpbnQgZXJyOworICAgIFB5RXJyX0ZldGNoKCZ0eXBlLCAmdmFsdWUsICZ0cmFjZWJhY2spOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHZhbHVlID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICB9CisgICAgYXJnID0gUHlUdXBsZV9QYWNrKDMsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOworICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVyciA9IGNhbGxfdHJhY2UoZnVuYywgc2VsZiwgZiwgUHlUcmFjZV9FWENFUFRJT04sIGFyZyk7CisgICAgUHlfREVDUkVGKGFyZyk7CisgICAgaWYgKGVyciA9PSAwKQorICAgICAgICBQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOworICAgIGVsc2UgeworICAgICAgICBQeV9YREVDUkVGKHR5cGUpOworICAgICAgICBQeV9YREVDUkVGKHZhbHVlKTsKKyAgICAgICAgUHlfWERFQ1JFRih0cmFjZWJhY2spOworICAgIH0KIH0KIAogc3RhdGljIGludAogY2FsbF90cmFjZV9wcm90ZWN0ZWQoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICpvYmosIFB5RnJhbWVPYmplY3QgKmZyYW1lLAotCQkgICAgIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQorICAgICAgICAgICAgICAgICAgICAgaW50IHdoYXQsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlPYmplY3QgKnR5cGUsICp2YWx1ZSwgKnRyYWNlYmFjazsKLQlpbnQgZXJyOwotCVB5RXJyX0ZldGNoKCZ0eXBlLCAmdmFsdWUsICZ0cmFjZWJhY2spOwotCWVyciA9IGNhbGxfdHJhY2UoZnVuYywgb2JqLCBmcmFtZSwgd2hhdCwgYXJnKTsKLQlpZiAoZXJyID09IDApCi0JewotCQlQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCVB5X1hERUNSRUYodHlwZSk7Ci0JCVB5X1hERUNSRUYodmFsdWUpOwotCQlQeV9YREVDUkVGKHRyYWNlYmFjayk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgUHlPYmplY3QgKnR5cGUsICp2YWx1ZSwgKnRyYWNlYmFjazsKKyAgICBpbnQgZXJyOworICAgIFB5RXJyX0ZldGNoKCZ0eXBlLCAmdmFsdWUsICZ0cmFjZWJhY2spOworICAgIGVyciA9IGNhbGxfdHJhY2UoZnVuYywgb2JqLCBmcmFtZSwgd2hhdCwgYXJnKTsKKyAgICBpZiAoZXJyID09IDApCisgICAgeworICAgICAgICBQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X1hERUNSRUYodHlwZSk7CisgICAgICAgIFB5X1hERUNSRUYodmFsdWUpOworICAgICAgICBQeV9YREVDUkVGKHRyYWNlYmFjayk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGNhbGxfdHJhY2UoUHlfdHJhY2VmdW5jIGZ1bmMsIFB5T2JqZWN0ICpvYmosIFB5RnJhbWVPYmplY3QgKmZyYW1lLAotCSAgIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQorICAgICAgICAgICBpbnQgd2hhdCwgUHlPYmplY3QgKmFyZykKIHsKLQlyZWdpc3RlciBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBmcmFtZS0+Zl90c3RhdGU7Ci0JaW50IHJlc3VsdDsKLQlpZiAodHN0YXRlLT50cmFjaW5nKQotCQlyZXR1cm4gMDsKLQl0c3RhdGUtPnRyYWNpbmcrKzsKLQl0c3RhdGUtPnVzZV90cmFjaW5nID0gMDsKLQlyZXN1bHQgPSBmdW5jKG9iaiwgZnJhbWUsIHdoYXQsIGFyZyk7Ci0JdHN0YXRlLT51c2VfdHJhY2luZyA9ICgodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQotCQkJICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOwotCXRzdGF0ZS0+dHJhY2luZy0tOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVnaXN0ZXIgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gZnJhbWUtPmZfdHN0YXRlOworICAgIGludCByZXN1bHQ7CisgICAgaWYgKHRzdGF0ZS0+dHJhY2luZykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdHN0YXRlLT50cmFjaW5nKys7CisgICAgdHN0YXRlLT51c2VfdHJhY2luZyA9IDA7CisgICAgcmVzdWx0ID0gZnVuYyhvYmosIGZyYW1lLCB3aGF0LCBhcmcpOworICAgIHRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAoKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOworICAgIHRzdGF0ZS0+dHJhY2luZy0tOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeUV2YWxfQ2FsbFRyYWNpbmcoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmdzKQogewotCVB5RnJhbWVPYmplY3QgKmZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gZnJhbWUtPmZfdHN0YXRlOwotCWludCBzYXZlX3RyYWNpbmcgPSB0c3RhdGUtPnRyYWNpbmc7Ci0JaW50IHNhdmVfdXNlX3RyYWNpbmcgPSB0c3RhdGUtPnVzZV90cmFjaW5nOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlGcmFtZU9iamVjdCAqZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBmcmFtZS0+Zl90c3RhdGU7CisgICAgaW50IHNhdmVfdHJhY2luZyA9IHRzdGF0ZS0+dHJhY2luZzsKKyAgICBpbnQgc2F2ZV91c2VfdHJhY2luZyA9IHRzdGF0ZS0+dXNlX3RyYWNpbmc7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCXRzdGF0ZS0+dHJhY2luZyA9IDA7Ci0JdHN0YXRlLT51c2VfdHJhY2luZyA9ICgodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQotCQkJICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOwotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0JdHN0YXRlLT50cmFjaW5nID0gc2F2ZV90cmFjaW5nOwotCXRzdGF0ZS0+dXNlX3RyYWNpbmcgPSBzYXZlX3VzZV90cmFjaW5nOwotCXJldHVybiByZXN1bHQ7CisgICAgdHN0YXRlLT50cmFjaW5nID0gMDsKKyAgICB0c3RhdGUtPnVzZV90cmFjaW5nID0gKCh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpKTsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOworICAgIHRzdGF0ZS0+dHJhY2luZyA9IHNhdmVfdHJhY2luZzsKKyAgICB0c3RhdGUtPnVzZV90cmFjaW5nID0gc2F2ZV91c2VfdHJhY2luZzsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBTZWUgT2JqZWN0cy9sbm90YWJfbm90ZXMudHh0IGZvciBhIGRlc2NyaXB0aW9uIG9mIGhvdyB0cmFjaW5nIHdvcmtzLiAqLwogc3RhdGljIGludAogbWF5YmVfY2FsbF9saW5lX3RyYWNlKFB5X3RyYWNlZnVuYyBmdW5jLCBQeU9iamVjdCAqb2JqLAotCQkgICAgICBQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50ICppbnN0cl9sYiwgaW50ICppbnN0cl91YiwKLQkJICAgICAgaW50ICppbnN0cl9wcmV2KQorICAgICAgICAgICAgICAgICAgICAgIFB5RnJhbWVPYmplY3QgKmZyYW1lLCBpbnQgKmluc3RyX2xiLCBpbnQgKmluc3RyX3ViLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5zdHJfcHJldikKIHsKLQlpbnQgcmVzdWx0ID0gMDsKLQlpbnQgbGluZSA9IGZyYW1lLT5mX2xpbmVubzsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbGluZSA9IGZyYW1lLT5mX2xpbmVubzsKIAotICAgICAgICAvKiBJZiB0aGUgbGFzdCBpbnN0cnVjdGlvbiBleGVjdXRlZCBpc24ndCBpbiB0aGUgY3VycmVudAotICAgICAgICAgICBpbnN0cnVjdGlvbiB3aW5kb3csIHJlc2V0IHRoZSB3aW5kb3cuCi0gICAgICAgICovCi0JaWYgKGZyYW1lLT5mX2xhc3RpIDwgKmluc3RyX2xiIHx8IGZyYW1lLT5mX2xhc3RpID49ICppbnN0cl91YikgewotCQlQeUFkZHJQYWlyIGJvdW5kczsKLQkJbGluZSA9IF9QeUNvZGVfQ2hlY2tMaW5lTnVtYmVyKGZyYW1lLT5mX2NvZGUsIGZyYW1lLT5mX2xhc3RpLAotCQkJCQkgICAgICAgJmJvdW5kcyk7Ci0JCSppbnN0cl9sYiA9IGJvdW5kcy5hcF9sb3dlcjsKLQkJKmluc3RyX3ViID0gYm91bmRzLmFwX3VwcGVyOwotCX0KLQkvKiBJZiB0aGUgbGFzdCBpbnN0cnVjdGlvbiBmYWxscyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIG9yIGlmCi0gICAgICAgICAgIGl0IHJlcHJlc2VudHMgYSBqdW1wIGJhY2t3YXJkcywgdXBkYXRlIHRoZSBmcmFtZSdzIGxpbmUKLSAgICAgICAgICAgbnVtYmVyIGFuZCBjYWxsIHRoZSB0cmFjZSBmdW5jdGlvbi4gKi8KLQlpZiAoZnJhbWUtPmZfbGFzdGkgPT0gKmluc3RyX2xiIHx8IGZyYW1lLT5mX2xhc3RpIDwgKmluc3RyX3ByZXYpIHsKLQkJZnJhbWUtPmZfbGluZW5vID0gbGluZTsKLQkJcmVzdWx0ID0gY2FsbF90cmFjZShmdW5jLCBvYmosIGZyYW1lLCBQeVRyYWNlX0xJTkUsIFB5X05vbmUpOwotCX0KLQkqaW5zdHJfcHJldiA9IGZyYW1lLT5mX2xhc3RpOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogSWYgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gZXhlY3V0ZWQgaXNuJ3QgaW4gdGhlIGN1cnJlbnQKKyAgICAgICBpbnN0cnVjdGlvbiB3aW5kb3csIHJlc2V0IHRoZSB3aW5kb3cuCisgICAgKi8KKyAgICBpZiAoZnJhbWUtPmZfbGFzdGkgPCAqaW5zdHJfbGIgfHwgZnJhbWUtPmZfbGFzdGkgPj0gKmluc3RyX3ViKSB7CisgICAgICAgIFB5QWRkclBhaXIgYm91bmRzOworICAgICAgICBsaW5lID0gX1B5Q29kZV9DaGVja0xpbmVOdW1iZXIoZnJhbWUtPmZfY29kZSwgZnJhbWUtPmZfbGFzdGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICAgICAgKmluc3RyX2xiID0gYm91bmRzLmFwX2xvd2VyOworICAgICAgICAqaW5zdHJfdWIgPSBib3VuZHMuYXBfdXBwZXI7CisgICAgfQorICAgIC8qIElmIHRoZSBsYXN0IGluc3RydWN0aW9uIGZhbGxzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUgb3IgaWYKKyAgICAgICBpdCByZXByZXNlbnRzIGEganVtcCBiYWNrd2FyZHMsIHVwZGF0ZSB0aGUgZnJhbWUncyBsaW5lCisgICAgICAgbnVtYmVyIGFuZCBjYWxsIHRoZSB0cmFjZSBmdW5jdGlvbi4gKi8KKyAgICBpZiAoZnJhbWUtPmZfbGFzdGkgPT0gKmluc3RyX2xiIHx8IGZyYW1lLT5mX2xhc3RpIDwgKmluc3RyX3ByZXYpIHsKKyAgICAgICAgZnJhbWUtPmZfbGluZW5vID0gbGluZTsKKyAgICAgICAgcmVzdWx0ID0gY2FsbF90cmFjZShmdW5jLCBvYmosIGZyYW1lLCBQeVRyYWNlX0xJTkUsIFB5X05vbmUpOworICAgIH0KKyAgICAqaW5zdHJfcHJldiA9IGZyYW1lLT5mX2xhc3RpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHZvaWQKIFB5RXZhbF9TZXRQcm9maWxlKFB5X3RyYWNlZnVuYyBmdW5jLCBQeU9iamVjdCAqYXJnKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlPYmplY3QgKnRlbXAgPSB0c3RhdGUtPmNfcHJvZmlsZW9iajsKLQlQeV9YSU5DUkVGKGFyZyk7Ci0JdHN0YXRlLT5jX3Byb2ZpbGVmdW5jID0gTlVMTDsKLQl0c3RhdGUtPmNfcHJvZmlsZW9iaiA9IE5VTEw7Ci0JLyogTXVzdCBtYWtlIHN1cmUgdGhhdCB0cmFjaW5nIGlzIG5vdCBpZ25vcmVkIGlmICd0ZW1wJyBpcyBmcmVlZCAqLwotCXRzdGF0ZS0+dXNlX3RyYWNpbmcgPSB0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEw7Ci0JUHlfWERFQ1JFRih0ZW1wKTsKLQl0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgPSBmdW5jOwotCXRzdGF0ZS0+Y19wcm9maWxlb2JqID0gYXJnOwotCS8qIEZsYWcgdGhhdCB0cmFjaW5nIG9yIHByb2ZpbGluZyBpcyB0dXJuZWQgb24gKi8KLQl0c3RhdGUtPnVzZV90cmFjaW5nID0gKGZ1bmMgIT0gTlVMTCkgfHwgKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeU9iamVjdCAqdGVtcCA9IHRzdGF0ZS0+Y19wcm9maWxlb2JqOworICAgIFB5X1hJTkNSRUYoYXJnKTsKKyAgICB0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgPSBOVUxMOworICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqID0gTlVMTDsKKyAgICAvKiBNdXN0IG1ha2Ugc3VyZSB0aGF0IHRyYWNpbmcgaXMgbm90IGlnbm9yZWQgaWYgJ3RlbXAnIGlzIGZyZWVkICovCisgICAgdHN0YXRlLT51c2VfdHJhY2luZyA9IHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTDsKKyAgICBQeV9YREVDUkVGKHRlbXApOworICAgIHRzdGF0ZS0+Y19wcm9maWxlZnVuYyA9IGZ1bmM7CisgICAgdHN0YXRlLT5jX3Byb2ZpbGVvYmogPSBhcmc7CisgICAgLyogRmxhZyB0aGF0IHRyYWNpbmcgb3IgcHJvZmlsaW5nIGlzIHR1cm5lZCBvbiAqLworICAgIHRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAoZnVuYyAhPSBOVUxMKSB8fCAodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKTsKIH0KIAogdm9pZAogUHlFdmFsX1NldFRyYWNlKFB5X3RyYWNlZnVuYyBmdW5jLCBQeU9iamVjdCAqYXJnKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlPYmplY3QgKnRlbXAgPSB0c3RhdGUtPmNfdHJhY2VvYmo7Ci0JX1B5X1RyYWNpbmdQb3NzaWJsZSArPSAoZnVuYyAhPSBOVUxMKSAtICh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpOwotCVB5X1hJTkNSRUYoYXJnKTsKLQl0c3RhdGUtPmNfdHJhY2VmdW5jID0gTlVMTDsKLQl0c3RhdGUtPmNfdHJhY2VvYmogPSBOVUxMOwotCS8qIE11c3QgbWFrZSBzdXJlIHRoYXQgcHJvZmlsaW5nIGlzIG5vdCBpZ25vcmVkIGlmICd0ZW1wJyBpcyBmcmVlZCAqLwotCXRzdGF0ZS0+dXNlX3RyYWNpbmcgPSB0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTDsKLQlQeV9YREVDUkVGKHRlbXApOwotCXRzdGF0ZS0+Y190cmFjZWZ1bmMgPSBmdW5jOwotCXRzdGF0ZS0+Y190cmFjZW9iaiA9IGFyZzsKLQkvKiBGbGFnIHRoYXQgdHJhY2luZyBvciBwcm9maWxpbmcgaXMgdHVybmVkIG9uICovCi0JdHN0YXRlLT51c2VfdHJhY2luZyA9ICgoZnVuYyAhPSBOVUxMKQotCQkJICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlPYmplY3QgKnRlbXAgPSB0c3RhdGUtPmNfdHJhY2VvYmo7CisgICAgX1B5X1RyYWNpbmdQb3NzaWJsZSArPSAoZnVuYyAhPSBOVUxMKSAtICh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpOworICAgIFB5X1hJTkNSRUYoYXJnKTsKKyAgICB0c3RhdGUtPmNfdHJhY2VmdW5jID0gTlVMTDsKKyAgICB0c3RhdGUtPmNfdHJhY2VvYmogPSBOVUxMOworICAgIC8qIE11c3QgbWFrZSBzdXJlIHRoYXQgcHJvZmlsaW5nIGlzIG5vdCBpZ25vcmVkIGlmICd0ZW1wJyBpcyBmcmVlZCAqLworICAgIHRzdGF0ZS0+dXNlX3RyYWNpbmcgPSB0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTDsKKyAgICBQeV9YREVDUkVGKHRlbXApOworICAgIHRzdGF0ZS0+Y190cmFjZWZ1bmMgPSBmdW5jOworICAgIHRzdGF0ZS0+Y190cmFjZW9iaiA9IGFyZzsKKyAgICAvKiBGbGFnIHRoYXQgdHJhY2luZyBvciBwcm9maWxpbmcgaXMgdHVybmVkIG9uICovCisgICAgdHN0YXRlLT51c2VfdHJhY2luZyA9ICgoZnVuYyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RXZhbF9HZXRCdWlsdGlucyh2b2lkKQogewotCVB5RnJhbWVPYmplY3QgKmN1cnJlbnRfZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKLQlpZiAoY3VycmVudF9mcmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwLT5idWlsdGluczsKLQllbHNlCi0JCXJldHVybiBjdXJyZW50X2ZyYW1lLT5mX2J1aWx0aW5zOworICAgIFB5RnJhbWVPYmplY3QgKmN1cnJlbnRfZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKKyAgICBpZiAoY3VycmVudF9mcmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwLT5idWlsdGluczsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBjdXJyZW50X2ZyYW1lLT5mX2J1aWx0aW5zOwogfQogCiBQeU9iamVjdCAqCiBQeUV2YWxfR2V0TG9jYWxzKHZvaWQpCiB7Ci0JUHlGcmFtZU9iamVjdCAqY3VycmVudF9mcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOwotCWlmIChjdXJyZW50X2ZyYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5RnJhbWVfRmFzdFRvTG9jYWxzKGN1cnJlbnRfZnJhbWUpOwotCXJldHVybiBjdXJyZW50X2ZyYW1lLT5mX2xvY2FsczsKKyAgICBQeUZyYW1lT2JqZWN0ICpjdXJyZW50X2ZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7CisgICAgaWYgKGN1cnJlbnRfZnJhbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlGcmFtZV9GYXN0VG9Mb2NhbHMoY3VycmVudF9mcmFtZSk7CisgICAgcmV0dXJuIGN1cnJlbnRfZnJhbWUtPmZfbG9jYWxzOwogfQogCiBQeU9iamVjdCAqCiBQeUV2YWxfR2V0R2xvYmFscyh2b2lkKQogewotCVB5RnJhbWVPYmplY3QgKmN1cnJlbnRfZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKLQlpZiAoY3VycmVudF9mcmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBjdXJyZW50X2ZyYW1lLT5mX2dsb2JhbHM7CisgICAgUHlGcmFtZU9iamVjdCAqY3VycmVudF9mcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOworICAgIGlmIChjdXJyZW50X2ZyYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRfZnJhbWUtPmZfZ2xvYmFsczsKIH0KIAogUHlGcmFtZU9iamVjdCAqCiBQeUV2YWxfR2V0RnJhbWUodm9pZCkKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCXJldHVybiBfUHlUaHJlYWRTdGF0ZV9HZXRGcmFtZSh0c3RhdGUpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgcmV0dXJuIF9QeVRocmVhZFN0YXRlX0dldEZyYW1lKHRzdGF0ZSk7CiB9CiAKIGludAogUHlFdmFsX0dldFJlc3RyaWN0ZWQodm9pZCkKIHsKLQlQeUZyYW1lT2JqZWN0ICpjdXJyZW50X2ZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7Ci0JcmV0dXJuIGN1cnJlbnRfZnJhbWUgPT0gTlVMTCA/IDAgOiBQeUZyYW1lX0lzUmVzdHJpY3RlZChjdXJyZW50X2ZyYW1lKTsKKyAgICBQeUZyYW1lT2JqZWN0ICpjdXJyZW50X2ZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7CisgICAgcmV0dXJuIGN1cnJlbnRfZnJhbWUgPT0gTlVMTCA/IDAgOiBQeUZyYW1lX0lzUmVzdHJpY3RlZChjdXJyZW50X2ZyYW1lKTsKIH0KIAogaW50CiBQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKFB5Q29tcGlsZXJGbGFncyAqY2YpCiB7Ci0JUHlGcmFtZU9iamVjdCAqY3VycmVudF9mcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOwotCWludCByZXN1bHQgPSBjZi0+Y2ZfZmxhZ3MgIT0gMDsKKyAgICBQeUZyYW1lT2JqZWN0ICpjdXJyZW50X2ZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7CisgICAgaW50IHJlc3VsdCA9IGNmLT5jZl9mbGFncyAhPSAwOwogCi0JaWYgKGN1cnJlbnRfZnJhbWUgIT0gTlVMTCkgewotCQljb25zdCBpbnQgY29kZWZsYWdzID0gY3VycmVudF9mcmFtZS0+Zl9jb2RlLT5jb19mbGFnczsKLQkJY29uc3QgaW50IGNvbXBpbGVyZmxhZ3MgPSBjb2RlZmxhZ3MgJiBQeUNGX01BU0s7Ci0JCWlmIChjb21waWxlcmZsYWdzKSB7Ci0JCQlyZXN1bHQgPSAxOwotCQkJY2YtPmNmX2ZsYWdzIHw9IGNvbXBpbGVyZmxhZ3M7Ci0JCX0KKyAgICBpZiAoY3VycmVudF9mcmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IGludCBjb2RlZmxhZ3MgPSBjdXJyZW50X2ZyYW1lLT5mX2NvZGUtPmNvX2ZsYWdzOworICAgICAgICBjb25zdCBpbnQgY29tcGlsZXJmbGFncyA9IGNvZGVmbGFncyAmIFB5Q0ZfTUFTSzsKKyAgICAgICAgaWYgKGNvbXBpbGVyZmxhZ3MpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICBjZi0+Y2ZfZmxhZ3MgfD0gY29tcGlsZXJmbGFnczsKKyAgICAgICAgfQogI2lmIDAgLyogZnV0dXJlIGtleXdvcmQgKi8KLQkJaWYgKGNvZGVmbGFncyAmIENPX0dFTkVSQVRPUl9BTExPV0VEKSB7Ci0JCQlyZXN1bHQgPSAxOwotCQkJY2YtPmNmX2ZsYWdzIHw9IENPX0dFTkVSQVRPUl9BTExPV0VEOwotCQl9CisgICAgICAgIGlmIChjb2RlZmxhZ3MgJiBDT19HRU5FUkFUT1JfQUxMT1dFRCkgeworICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgIGNmLT5jZl9mbGFncyB8PSBDT19HRU5FUkFUT1JfQUxMT1dFRDsKKyAgICAgICAgfQogI2VuZGlmCi0JfQotCXJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGludAogUHlfRmx1c2hMaW5lKHZvaWQpCiB7Ci0JUHlPYmplY3QgKmYgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOwotCWlmIChmID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmICghUHlGaWxlX1NvZnRTcGFjZShmLCAwKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmKTsKKyAgICBQeU9iamVjdCAqZiA9IFB5U3lzX0dldE9iamVjdCgic3Rkb3V0Iik7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFQeUZpbGVfU29mdFNwYWNlKGYsIDApKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIGYpOwogfQogCiAKQEAgLTM4NTYsMTk3ICszODU2LDE5NyBAQAogUHlPYmplY3QgKgogUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoYXJnID09IE5VTEwpIHsKLQkJYXJnID0gUHlUdXBsZV9OZXcoMCk7Ci0JCWlmIChhcmcgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmcpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZ3VtZW50IGxpc3QgbXVzdCBiZSBhIHR1cGxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRihhcmcpOworICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICBhcmcgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBsaXN0IG11c3QgYmUgYSB0dXBsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYoYXJnKTsKIAotCWlmIChrdyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa3cpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImtleXdvcmQgbGlzdCBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOwotCQlQeV9ERUNSRUYoYXJnKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChrdyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa3cpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZCBsaXN0IG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7CisgICAgICAgIFB5X0RFQ1JFRihhcmcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZywga3cpOwotCVB5X0RFQ1JFRihhcmcpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmcsIGt3KTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBjb25zdCBjaGFyICoKIFB5RXZhbF9HZXRGdW5jTmFtZShQeU9iamVjdCAqZnVuYykKIHsKLQlpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykpCi0JCXJldHVybiBQeUV2YWxfR2V0RnVuY05hbWUoUHlNZXRob2RfR0VUX0ZVTkNUSU9OKGZ1bmMpKTsKLQllbHNlIGlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKQotCQlyZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoKChQeUZ1bmN0aW9uT2JqZWN0KilmdW5jKS0+ZnVuY19uYW1lKTsKLQllbHNlIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkKLQkJcmV0dXJuICgoUHlDRnVuY3Rpb25PYmplY3QqKWZ1bmMpLT5tX21sLT5tbF9uYW1lOwotCWVsc2UgaWYgKFB5Q2xhc3NfQ2hlY2soZnVuYykpCi0JCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZygoKFB5Q2xhc3NPYmplY3QqKWZ1bmMpLT5jbF9uYW1lKTsKLQllbHNlIGlmIChQeUluc3RhbmNlX0NoZWNrKGZ1bmMpKSB7Ci0JCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZygKLQkJCSgoUHlJbnN0YW5jZU9iamVjdCopZnVuYyktPmluX2NsYXNzLT5jbF9uYW1lKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gZnVuYy0+b2JfdHlwZS0+dHBfbmFtZTsKLQl9CisgICAgaWYgKFB5TWV0aG9kX0NoZWNrKGZ1bmMpKQorICAgICAgICByZXR1cm4gUHlFdmFsX0dldEZ1bmNOYW1lKFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKSk7CisgICAgZWxzZSBpZiAoUHlGdW5jdGlvbl9DaGVjayhmdW5jKSkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKCgoUHlGdW5jdGlvbk9iamVjdCopZnVuYyktPmZ1bmNfbmFtZSk7CisgICAgZWxzZSBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykpCisgICAgICAgIHJldHVybiAoKFB5Q0Z1bmN0aW9uT2JqZWN0KilmdW5jKS0+bV9tbC0+bWxfbmFtZTsKKyAgICBlbHNlIGlmIChQeUNsYXNzX0NoZWNrKGZ1bmMpKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoKChQeUNsYXNzT2JqZWN0KilmdW5jKS0+Y2xfbmFtZSk7CisgICAgZWxzZSBpZiAoUHlJbnN0YW5jZV9DaGVjayhmdW5jKSkgeworICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoCisgICAgICAgICAgICAoKFB5SW5zdGFuY2VPYmplY3QqKWZ1bmMpLT5pbl9jbGFzcy0+Y2xfbmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZ1bmMtPm9iX3R5cGUtPnRwX25hbWU7CisgICAgfQogfQogCiBjb25zdCBjaGFyICoKIFB5RXZhbF9HZXRGdW5jRGVzYyhQeU9iamVjdCAqZnVuYykKIHsKLQlpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykpCi0JCXJldHVybiAiKCkiOwotCWVsc2UgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCi0JCXJldHVybiAiKCkiOwotCWVsc2UgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKQotCQlyZXR1cm4gIigpIjsKLQllbHNlIGlmIChQeUNsYXNzX0NoZWNrKGZ1bmMpKQotCQlyZXR1cm4gIiBjb25zdHJ1Y3RvciI7Ci0JZWxzZSBpZiAoUHlJbnN0YW5jZV9DaGVjayhmdW5jKSkgewotCQlyZXR1cm4gIiBpbnN0YW5jZSI7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuICIgb2JqZWN0IjsKLQl9CisgICAgaWYgKFB5TWV0aG9kX0NoZWNrKGZ1bmMpKQorICAgICAgICByZXR1cm4gIigpIjsKKyAgICBlbHNlIGlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKQorICAgICAgICByZXR1cm4gIigpIjsKKyAgICBlbHNlIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkKKyAgICAgICAgcmV0dXJuICIoKSI7CisgICAgZWxzZSBpZiAoUHlDbGFzc19DaGVjayhmdW5jKSkKKyAgICAgICAgcmV0dXJuICIgY29uc3RydWN0b3IiOworICAgIGVsc2UgaWYgKFB5SW5zdGFuY2VfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgcmV0dXJuICIgaW5zdGFuY2UiOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiIG9iamVjdCI7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogZXJyX2FyZ3MoUHlPYmplY3QgKmZ1bmMsIGludCBmbGFncywgaW50IG5hcmdzKQogewotCWlmIChmbGFncyAmIE1FVEhfTk9BUkdTKQotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJS4yMDBzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglZCBnaXZlbikiLAotCQkJICAgICAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopZnVuYyktPm1fbWwtPm1sX25hbWUsCi0JCQkgICAgIG5hcmdzKTsKLQllbHNlCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIlLjIwMHMoKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAoJWQgZ2l2ZW4pIiwKLQkJCSAgICAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWZ1bmMpLT5tX21sLT5tbF9uYW1lLAotCQkJICAgICBuYXJncyk7CisgICAgaWYgKGZsYWdzICYgTUVUSF9OT0FSR1MpCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWZ1bmMpLT5tX21sLT5tbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgbmFyZ3MpOworICAgIGVsc2UKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICgoUHlDRnVuY3Rpb25PYmplY3QgKilmdW5jKS0+bV9tbC0+bWxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIG5hcmdzKTsKIH0KIAogI2RlZmluZSBDX1RSQUNFKHgsIGNhbGwpIFwKIGlmICh0c3RhdGUtPnVzZV90cmFjaW5nICYmIHRzdGF0ZS0+Y19wcm9maWxlZnVuYykgeyBcCi0JaWYgKGNhbGxfdHJhY2UodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLCBcCi0JCXRzdGF0ZS0+Y19wcm9maWxlb2JqLCBcCi0JCXRzdGF0ZS0+ZnJhbWUsIFB5VHJhY2VfQ19DQUxMLCBcCi0JCWZ1bmMpKSB7IFwKLQkJeCA9IE5VTEw7IFwKLQl9IFwKLQllbHNlIHsgXAotCQl4ID0gY2FsbDsgXAotCQlpZiAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpIHsgXAotCQkJaWYgKHggPT0gTlVMTCkgeyBcCi0JCQkJY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLCBcCi0JCQkJCXRzdGF0ZS0+Y19wcm9maWxlb2JqLCBcCi0JCQkJCXRzdGF0ZS0+ZnJhbWUsIFB5VHJhY2VfQ19FWENFUFRJT04sIFwKLQkJCQkJZnVuYyk7IFwKLQkJCQkvKiBYWFggc2hvdWxkIHBhc3MgKHR5cGUsIHZhbHVlLCB0YikgKi8gXAotCQkJfSBlbHNlIHsgXAotCQkJCWlmIChjYWxsX3RyYWNlKHRzdGF0ZS0+Y19wcm9maWxlZnVuYywgXAotCQkJCQl0c3RhdGUtPmNfcHJvZmlsZW9iaiwgXAotCQkJCQl0c3RhdGUtPmZyYW1lLCBQeVRyYWNlX0NfUkVUVVJOLCBcCi0JCQkJCWZ1bmMpKSB7IFwKLQkJCQkJUHlfREVDUkVGKHgpOyBcCi0JCQkJCXggPSBOVUxMOyBcCi0JCQkJfSBcCi0JCQl9IFwKLQkJfSBcCi0JfSBcCisgICAgaWYgKGNhbGxfdHJhY2UodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLCBcCisgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqLCBcCisgICAgICAgIHRzdGF0ZS0+ZnJhbWUsIFB5VHJhY2VfQ19DQUxMLCBcCisgICAgICAgIGZ1bmMpKSB7IFwKKyAgICAgICAgeCA9IE5VTEw7IFwKKyAgICB9IFwKKyAgICBlbHNlIHsgXAorICAgICAgICB4ID0gY2FsbDsgXAorICAgICAgICBpZiAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpIHsgXAorICAgICAgICAgICAgaWYgKHggPT0gTlVMTCkgeyBcCisgICAgICAgICAgICAgICAgY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLCBcCisgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqLCBcCisgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+ZnJhbWUsIFB5VHJhY2VfQ19FWENFUFRJT04sIFwKKyAgICAgICAgICAgICAgICAgICAgZnVuYyk7IFwKKyAgICAgICAgICAgICAgICAvKiBYWFggc2hvdWxkIHBhc3MgKHR5cGUsIHZhbHVlLCB0YikgKi8gXAorICAgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICAgIGlmIChjYWxsX3RyYWNlKHRzdGF0ZS0+Y19wcm9maWxlZnVuYywgXAorICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmNfcHJvZmlsZW9iaiwgXAorICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmZyYW1lLCBQeVRyYWNlX0NfUkVUVVJOLCBcCisgICAgICAgICAgICAgICAgICAgIGZ1bmMpKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHgpOyBcCisgICAgICAgICAgICAgICAgICAgIHggPSBOVUxMOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfSBcCiB9IGVsc2UgeyBcCi0JeCA9IGNhbGw7IFwKLQl9CisgICAgeCA9IGNhbGw7IFwKKyAgICB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2Z1bmN0aW9uKFB5T2JqZWN0ICoqKnBwX3N0YWNrLCBpbnQgb3BhcmcKICNpZmRlZiBXSVRIX1RTQwotCQksIHVpbnQ2NCogcGludHIwLCB1aW50NjQqIHBpbnRyMQorICAgICAgICAgICAgICAgICwgdWludDY0KiBwaW50cjAsIHVpbnQ2NCogcGludHIxCiAjZW5kaWYKLQkJKQorICAgICAgICAgICAgICAgICkKIHsKLQlpbnQgbmEgPSBvcGFyZyAmIDB4ZmY7Ci0JaW50IG5rID0gKG9wYXJnPj44KSAmIDB4ZmY7Ci0JaW50IG4gPSBuYSArIDIgKiBuazsKLQlQeU9iamVjdCAqKnBmdW5jID0gKCpwcF9zdGFjaykgLSBuIC0gMTsKLQlQeU9iamVjdCAqZnVuYyA9ICpwZnVuYzsKLQlQeU9iamVjdCAqeCwgKnc7CisgICAgaW50IG5hID0gb3BhcmcgJiAweGZmOworICAgIGludCBuayA9IChvcGFyZz4+OCkgJiAweGZmOworICAgIGludCBuID0gbmEgKyAyICogbms7CisgICAgUHlPYmplY3QgKipwZnVuYyA9ICgqcHBfc3RhY2spIC0gbiAtIDE7CisgICAgUHlPYmplY3QgKmZ1bmMgPSAqcGZ1bmM7CisgICAgUHlPYmplY3QgKngsICp3OwogCi0JLyogQWx3YXlzIGRpc3BhdGNoIFB5Q0Z1bmN0aW9uIGZpcnN0LCBiZWNhdXNlIHRoZXNlIGFyZQotCSAgIHByZXN1bWVkIHRvIGJlIHRoZSBtb3N0IGZyZXF1ZW50IGNhbGxhYmxlIG9iamVjdC4KLQkqLwotCWlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSAmJiBuayA9PSAwKSB7Ci0JCWludCBmbGFncyA9IFB5Q0Z1bmN0aW9uX0dFVF9GTEFHUyhmdW5jKTsKLQkJUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICAvKiBBbHdheXMgZGlzcGF0Y2ggUHlDRnVuY3Rpb24gZmlyc3QsIGJlY2F1c2UgdGhlc2UgYXJlCisgICAgICAgcHJlc3VtZWQgdG8gYmUgdGhlIG1vc3QgZnJlcXVlbnQgY2FsbGFibGUgb2JqZWN0LgorICAgICovCisgICAgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpICYmIG5rID09IDApIHsKKyAgICAgICAgaW50IGZsYWdzID0gUHlDRnVuY3Rpb25fR0VUX0ZMQUdTKGZ1bmMpOworICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwogCi0JCVBDQUxMKFBDQUxMX0NGVU5DVElPTik7Ci0JCWlmIChmbGFncyAmIChNRVRIX05PQVJHUyB8IE1FVEhfTykpIHsKLQkJCVB5Q0Z1bmN0aW9uIG1ldGggPSBQeUNGdW5jdGlvbl9HRVRfRlVOQ1RJT04oZnVuYyk7Ci0JCQlQeU9iamVjdCAqc2VsZiA9IFB5Q0Z1bmN0aW9uX0dFVF9TRUxGKGZ1bmMpOwotCQkJaWYgKGZsYWdzICYgTUVUSF9OT0FSR1MgJiYgbmEgPT0gMCkgewotCQkJCUNfVFJBQ0UoeCwgKCptZXRoKShzZWxmLE5VTEwpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZsYWdzICYgTUVUSF9PICYmIG5hID09IDEpIHsKLQkJCQlQeU9iamVjdCAqYXJnID0gRVhUX1BPUCgqcHBfc3RhY2spOwotCQkJCUNfVFJBQ0UoeCwgKCptZXRoKShzZWxmLGFyZykpOwotCQkJCVB5X0RFQ1JFRihhcmcpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZXJyX2FyZ3MoZnVuYywgZmxhZ3MsIG5hKTsKLQkJCQl4ID0gTlVMTDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVB5T2JqZWN0ICpjYWxsYXJnczsKLQkJCWNhbGxhcmdzID0gbG9hZF9hcmdzKHBwX3N0YWNrLCBuYSk7Ci0JCQlSRUFEX1RJTUVTVEFNUCgqcGludHIwKTsKLQkJCUNfVFJBQ0UoeCwgUHlDRnVuY3Rpb25fQ2FsbChmdW5jLGNhbGxhcmdzLE5VTEwpKTsKLQkJCVJFQURfVElNRVNUQU1QKCpwaW50cjEpOwotCQkJUHlfWERFQ1JFRihjYWxsYXJncyk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykgJiYgUHlNZXRob2RfR0VUX1NFTEYoZnVuYykgIT0gTlVMTCkgewotCQkJLyogb3B0aW1pemUgYWNjZXNzIHRvIGJvdW5kIG1ldGhvZHMgKi8KLQkJCVB5T2JqZWN0ICpzZWxmID0gUHlNZXRob2RfR0VUX1NFTEYoZnVuYyk7Ci0JCQlQQ0FMTChQQ0FMTF9NRVRIT0QpOwotCQkJUENBTEwoUENBTExfQk9VTkRfTUVUSE9EKTsKLQkJCVB5X0lOQ1JFRihzZWxmKTsKLQkJCWZ1bmMgPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oZnVuYyk7Ci0JCQlQeV9JTkNSRUYoZnVuYyk7Ci0JCQlQeV9ERUNSRUYoKnBmdW5jKTsKLQkJCSpwZnVuYyA9IHNlbGY7Ci0JCQluYSsrOwotCQkJbisrOwotCQl9IGVsc2UKLQkJCVB5X0lOQ1JFRihmdW5jKTsKLQkJUkVBRF9USU1FU1RBTVAoKnBpbnRyMCk7Ci0JCWlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKQotCQkJeCA9IGZhc3RfZnVuY3Rpb24oZnVuYywgcHBfc3RhY2ssIG4sIG5hLCBuayk7Ci0JCWVsc2UKLQkJCXggPSBkb19jYWxsKGZ1bmMsIHBwX3N0YWNrLCBuYSwgbmspOwotCQlSRUFEX1RJTUVTVEFNUCgqcGludHIxKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCX0KKyAgICAgICAgUENBTEwoUENBTExfQ0ZVTkNUSU9OKTsKKyAgICAgICAgaWYgKGZsYWdzICYgKE1FVEhfTk9BUkdTIHwgTUVUSF9PKSkgeworICAgICAgICAgICAgUHlDRnVuY3Rpb24gbWV0aCA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihmdW5jKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzZWxmID0gUHlDRnVuY3Rpb25fR0VUX1NFTEYoZnVuYyk7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNRVRIX05PQVJHUyAmJiBuYSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ19UUkFDRSh4LCAoKm1ldGgpKHNlbGYsTlVMTCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBNRVRIX08gJiYgbmEgPT0gMSkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmcgPSBFWFRfUE9QKCpwcF9zdGFjayk7CisgICAgICAgICAgICAgICAgQ19UUkFDRSh4LCAoKm1ldGgpKHNlbGYsYXJnKSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJfYXJncyhmdW5jLCBmbGFncywgbmEpOworICAgICAgICAgICAgICAgIHggPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKmNhbGxhcmdzOworICAgICAgICAgICAgY2FsbGFyZ3MgPSBsb2FkX2FyZ3MocHBfc3RhY2ssIG5hKTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKCpwaW50cjApOworICAgICAgICAgICAgQ19UUkFDRSh4LCBQeUNGdW5jdGlvbl9DYWxsKGZ1bmMsY2FsbGFyZ3MsTlVMTCkpOworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoKnBpbnRyMSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGNhbGxhcmdzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChQeU1ldGhvZF9DaGVjayhmdW5jKSAmJiBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiBvcHRpbWl6ZSBhY2Nlc3MgdG8gYm91bmQgbWV0aG9kcyAqLworICAgICAgICAgICAgUHlPYmplY3QgKnNlbGYgPSBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKTsKKyAgICAgICAgICAgIFBDQUxMKFBDQUxMX01FVEhPRCk7CisgICAgICAgICAgICBQQ0FMTChQQ0FMTF9CT1VORF9NRVRIT0QpOworICAgICAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICAgICAgZnVuYyA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRigqcGZ1bmMpOworICAgICAgICAgICAgKnBmdW5jID0gc2VsZjsKKyAgICAgICAgICAgIG5hKys7CisgICAgICAgICAgICBuKys7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgICAgICBSRUFEX1RJTUVTVEFNUCgqcGludHIwKTsKKyAgICAgICAgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCisgICAgICAgICAgICB4ID0gZmFzdF9mdW5jdGlvbihmdW5jLCBwcF9zdGFjaywgbiwgbmEsIG5rKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeCA9IGRvX2NhbGwoZnVuYywgcHBfc3RhY2ssIG5hLCBuayk7CisgICAgICAgIFJFQURfVElNRVNUQU1QKCpwaW50cjEpOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgfQogCi0JLyogQ2xlYXIgdGhlIHN0YWNrIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBBbHNvIHJlbW92ZXMKLSAgICAgICAgICAgdGhlIGFyZ3VtZW50cyBpbiBjYXNlIHRoZXkgd2VyZW4ndCBjb25zdW1lZCBhbHJlYWR5Ci0gICAgICAgICAgIChmYXN0X2Z1bmN0aW9uKCkgYW5kIGVycl9hcmdzKCkgbGVhdmUgdGhlbSBvbiB0aGUgc3RhY2spLgotCSAqLwotCXdoaWxlICgoKnBwX3N0YWNrKSA+IHBmdW5jKSB7Ci0JCXcgPSBFWFRfUE9QKCpwcF9zdGFjayk7Ci0JCVB5X0RFQ1JFRih3KTsKLQkJUENBTEwoUENBTExfUE9QKTsKLQl9Ci0JcmV0dXJuIHg7CisgICAgLyogQ2xlYXIgdGhlIHN0YWNrIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBBbHNvIHJlbW92ZXMKKyAgICAgICB0aGUgYXJndW1lbnRzIGluIGNhc2UgdGhleSB3ZXJlbid0IGNvbnN1bWVkIGFscmVhZHkKKyAgICAgICAoZmFzdF9mdW5jdGlvbigpIGFuZCBlcnJfYXJncygpIGxlYXZlIHRoZW0gb24gdGhlIHN0YWNrKS4KKyAgICAgKi8KKyAgICB3aGlsZSAoKCpwcF9zdGFjaykgPiBwZnVuYykgeworICAgICAgICB3ID0gRVhUX1BPUCgqcHBfc3RhY2spOworICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgIFBDQUxMKFBDQUxMX1BPUCk7CisgICAgfQorICAgIHJldHVybiB4OwogfQogCiAvKiBUaGUgZmFzdF9mdW5jdGlvbigpIGZ1bmN0aW9uIG9wdGltaXplIGNhbGxzIGZvciB3aGljaCBubyBhcmd1bWVudApAQCAtNDA2MSwyNzMgKzQwNjEsMjczIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmFzdF9mdW5jdGlvbihQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKioqcHBfc3RhY2ssIGludCBuLCBpbnQgbmEsIGludCBuaykKIHsKLQlQeUNvZGVPYmplY3QgKmNvID0gKFB5Q29kZU9iamVjdCAqKVB5RnVuY3Rpb25fR0VUX0NPREUoZnVuYyk7Ci0JUHlPYmplY3QgKmdsb2JhbHMgPSBQeUZ1bmN0aW9uX0dFVF9HTE9CQUxTKGZ1bmMpOwotCVB5T2JqZWN0ICphcmdkZWZzID0gUHlGdW5jdGlvbl9HRVRfREVGQVVMVFMoZnVuYyk7Ci0JUHlPYmplY3QgKipkID0gTlVMTDsKLQlpbnQgbmQgPSAwOworICAgIFB5Q29kZU9iamVjdCAqY28gPSAoUHlDb2RlT2JqZWN0ICopUHlGdW5jdGlvbl9HRVRfQ09ERShmdW5jKTsKKyAgICBQeU9iamVjdCAqZ2xvYmFscyA9IFB5RnVuY3Rpb25fR0VUX0dMT0JBTFMoZnVuYyk7CisgICAgUHlPYmplY3QgKmFyZ2RlZnMgPSBQeUZ1bmN0aW9uX0dFVF9ERUZBVUxUUyhmdW5jKTsKKyAgICBQeU9iamVjdCAqKmQgPSBOVUxMOworICAgIGludCBuZCA9IDA7CiAKLQlQQ0FMTChQQ0FMTF9GVU5DVElPTik7Ci0JUENBTEwoUENBTExfRkFTVF9GVU5DVElPTik7Ci0JaWYgKGFyZ2RlZnMgPT0gTlVMTCAmJiBjby0+Y29fYXJnY291bnQgPT0gbiAmJiBuaz09MCAmJgotCSAgICBjby0+Y29fZmxhZ3MgPT0gKENPX09QVElNSVpFRCB8IENPX05FV0xPQ0FMUyB8IENPX05PRlJFRSkpIHsKLQkJUHlGcmFtZU9iamVjdCAqZjsKLQkJUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7Ci0JCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JCVB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipzdGFjazsKLQkJaW50IGk7CisgICAgUENBTEwoUENBTExfRlVOQ1RJT04pOworICAgIFBDQUxMKFBDQUxMX0ZBU1RfRlVOQ1RJT04pOworICAgIGlmIChhcmdkZWZzID09IE5VTEwgJiYgY28tPmNvX2FyZ2NvdW50ID09IG4gJiYgbms9PTAgJiYKKyAgICAgICAgY28tPmNvX2ZsYWdzID09IChDT19PUFRJTUlaRUQgfCBDT19ORVdMT0NBTFMgfCBDT19OT0ZSRUUpKSB7CisgICAgICAgIFB5RnJhbWVPYmplY3QgKmY7CisgICAgICAgIFB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOworICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgICAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqc3RhY2s7CisgICAgICAgIGludCBpOwogCi0JCVBDQUxMKFBDQUxMX0ZBU1RFUl9GVU5DVElPTik7Ci0JCWFzc2VydChnbG9iYWxzICE9IE5VTEwpOwotCQkvKiBYWFggUGVyaGFwcyB3ZSBzaG91bGQgY3JlYXRlIGEgc3BlY2lhbGl6ZWQKLQkJICAgUHlGcmFtZV9OZXcoKSB0aGF0IGRvZXNuJ3QgdGFrZSBsb2NhbHMsIGJ1dCBkb2VzCi0JCSAgIHRha2UgYnVpbHRpbnMgd2l0aG91dCBzYW5pdHkgY2hlY2tpbmcgdGhlbS4KLQkJKi8KLQkJYXNzZXJ0KHRzdGF0ZSAhPSBOVUxMKTsKLQkJZiA9IFB5RnJhbWVfTmV3KHRzdGF0ZSwgY28sIGdsb2JhbHMsIE5VTEwpOwotCQlpZiAoZiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIFBDQUxMKFBDQUxMX0ZBU1RFUl9GVU5DVElPTik7CisgICAgICAgIGFzc2VydChnbG9iYWxzICE9IE5VTEwpOworICAgICAgICAvKiBYWFggUGVyaGFwcyB3ZSBzaG91bGQgY3JlYXRlIGEgc3BlY2lhbGl6ZWQKKyAgICAgICAgICAgUHlGcmFtZV9OZXcoKSB0aGF0IGRvZXNuJ3QgdGFrZSBsb2NhbHMsIGJ1dCBkb2VzCisgICAgICAgICAgIHRha2UgYnVpbHRpbnMgd2l0aG91dCBzYW5pdHkgY2hlY2tpbmcgdGhlbS4KKyAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KHRzdGF0ZSAhPSBOVUxMKTsKKyAgICAgICAgZiA9IFB5RnJhbWVfTmV3KHRzdGF0ZSwgY28sIGdsb2JhbHMsIE5VTEwpOworICAgICAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKLQkJc3RhY2sgPSAoKnBwX3N0YWNrKSAtIG47CisgICAgICAgIGZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CisgICAgICAgIHN0YWNrID0gKCpwcF9zdGFjaykgLSBuOwogCi0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCVB5X0lOQ1JFRigqc3RhY2spOwotCQkJZmFzdGxvY2Fsc1tpXSA9ICpzdGFjaysrOwotCQl9Ci0JCXJldHZhbCA9IFB5RXZhbF9FdmFsRnJhbWVFeChmLDApOwotCQkrK3RzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOwotCQlQeV9ERUNSRUYoZik7Ci0JCS0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCWlmIChhcmdkZWZzICE9IE5VTEwpIHsKLQkJZCA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ2RlZnMsIDApOwotCQluZCA9IFB5X1NJWkUoYXJnZGVmcyk7Ci0JfQotCXJldHVybiBQeUV2YWxfRXZhbENvZGVFeChjbywgZ2xvYmFscywKLQkJCQkgKFB5T2JqZWN0ICopTlVMTCwgKCpwcF9zdGFjayktbiwgbmEsCi0JCQkJICgqcHBfc3RhY2spLTIqbmssIG5rLCBkLCBuZCwKLQkJCQkgUHlGdW5jdGlvbl9HRVRfQ0xPU1VSRShmdW5jKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRigqc3RhY2spOworICAgICAgICAgICAgZmFzdGxvY2Fsc1tpXSA9ICpzdGFjaysrOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IFB5RXZhbF9FdmFsRnJhbWVFeChmLDApOworICAgICAgICArK3RzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOworICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgICAgIC0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIGlmIChhcmdkZWZzICE9IE5VTEwpIHsKKyAgICAgICAgZCA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ2RlZnMsIDApOworICAgICAgICBuZCA9IFB5X1NJWkUoYXJnZGVmcyk7CisgICAgfQorICAgIHJldHVybiBQeUV2YWxfRXZhbENvZGVFeChjbywgZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopTlVMTCwgKCpwcF9zdGFjayktbiwgbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcHBfc3RhY2spLTIqbmssIG5rLCBkLCBuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9HRVRfQ0xPU1VSRShmdW5jKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1cGRhdGVfa2V5d29yZF9hcmdzKFB5T2JqZWN0ICpvcmlnX2t3ZGljdCwgaW50IG5rLCBQeU9iamVjdCAqKipwcF9zdGFjaywKICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZ1bmMpCiB7Ci0JUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7Ci0JaWYgKG9yaWdfa3dkaWN0ID09IE5VTEwpCi0JCWt3ZGljdCA9IFB5RGljdF9OZXcoKTsKLQllbHNlIHsKLQkJa3dkaWN0ID0gUHlEaWN0X0NvcHkob3JpZ19rd2RpY3QpOwotCQlQeV9ERUNSRUYob3JpZ19rd2RpY3QpOwotCX0KLQlpZiAoa3dkaWN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgtLW5rID49IDApIHsKLQkJaW50IGVycjsKLQkJUHlPYmplY3QgKnZhbHVlID0gRVhUX1BPUCgqcHBfc3RhY2spOwotCQlQeU9iamVjdCAqa2V5ID0gRVhUX1BPUCgqcHBfc3RhY2spOwotCQlpZiAoUHlEaWN0X0dldEl0ZW0oa3dkaWN0LCBrZXkpICE9IE5VTEwpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiJS4yMDBzJXMgZ290IG11bHRpcGxlIHZhbHVlcyAiCi0JCQkJICAgICAiZm9yIGtleXdvcmQgYXJndW1lbnQgJyUuMjAwcyciLAotCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAotCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAotCQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcoa2V5KSk7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCQlQeV9ERUNSRUYoa3dkaWN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVyciA9IFB5RGljdF9TZXRJdGVtKGt3ZGljdCwga2V5LCB2YWx1ZSk7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlQeV9ERUNSRUYodmFsdWUpOwotCQlpZiAoZXJyKSB7Ci0JCQlQeV9ERUNSRUYoa3dkaWN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBrd2RpY3Q7CisgICAgUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7CisgICAgaWYgKG9yaWdfa3dkaWN0ID09IE5VTEwpCisgICAgICAgIGt3ZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBlbHNlIHsKKyAgICAgICAga3dkaWN0ID0gUHlEaWN0X0NvcHkob3JpZ19rd2RpY3QpOworICAgICAgICBQeV9ERUNSRUYob3JpZ19rd2RpY3QpOworICAgIH0KKyAgICBpZiAoa3dkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdoaWxlICgtLW5rID49IDApIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgUHlPYmplY3QgKnZhbHVlID0gRVhUX1BPUCgqcHBfc3RhY2spOworICAgICAgICBQeU9iamVjdCAqa2V5ID0gRVhUX1BPUCgqcHBfc3RhY2spOworICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW0oa3dkaWN0LCBrZXkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyVzIGdvdCBtdWx0aXBsZSB2YWx1ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Iga2V5d29yZCBhcmd1bWVudCAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRGdW5jRGVzYyhmdW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhrZXkpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrd2RpY3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oa3dkaWN0LCBrZXksIHZhbHVlKTsKKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrd2RpY3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGt3ZGljdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHVwZGF0ZV9zdGFyX2FyZ3MoaW50IG5zdGFjaywgaW50IG5zdGFyLCBQeU9iamVjdCAqc3RhcmFyZywKLQkJIFB5T2JqZWN0ICoqKnBwX3N0YWNrKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKipwcF9zdGFjaykKIHsKLQlQeU9iamVjdCAqY2FsbGFyZ3MsICp3OworICAgIFB5T2JqZWN0ICpjYWxsYXJncywgKnc7CiAKLQljYWxsYXJncyA9IFB5VHVwbGVfTmV3KG5zdGFjayArIG5zdGFyKTsKLQlpZiAoY2FsbGFyZ3MgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG5zdGFyKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgbnN0YXI7IGkrKykgewotCQkJUHlPYmplY3QgKmEgPSBQeVR1cGxlX0dFVF9JVEVNKHN0YXJhcmcsIGkpOwotCQkJUHlfSU5DUkVGKGEpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgbnN0YWNrICsgaSwgYSk7Ci0JCX0KLQl9Ci0Jd2hpbGUgKC0tbnN0YWNrID49IDApIHsKLQkJdyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgbnN0YWNrLCB3KTsKLQl9Ci0JcmV0dXJuIGNhbGxhcmdzOworICAgIGNhbGxhcmdzID0gUHlUdXBsZV9OZXcobnN0YWNrICsgbnN0YXIpOworICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobnN0YXIpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuc3RhcjsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqYSA9IFB5VHVwbGVfR0VUX0lURU0oc3RhcmFyZywgaSk7CisgICAgICAgICAgICBQeV9JTkNSRUYoYSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBuc3RhY2sgKyBpLCBhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoLS1uc3RhY2sgPj0gMCkgeworICAgICAgICB3ID0gRVhUX1BPUCgqcHBfc3RhY2spOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBuc3RhY2ssIHcpOworICAgIH0KKyAgICByZXR1cm4gY2FsbGFyZ3M7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkX2FyZ3MoUHlPYmplY3QgKioqcHBfc3RhY2ssIGludCBuYSkKIHsKLQlQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KG5hKTsKLQlQeU9iamVjdCAqdzsKKyAgICBQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KG5hKTsKKyAgICBQeU9iamVjdCAqdzsKIAotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgtLW5hID49IDApIHsKLQkJdyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShhcmdzLCBuYSwgdyk7Ci0JfQotCXJldHVybiBhcmdzOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdoaWxlICgtLW5hID49IDApIHsKKyAgICAgICAgdyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCBuYSwgdyk7CisgICAgfQorICAgIHJldHVybiBhcmdzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9fY2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKioqcHBfc3RhY2ssIGludCBuYSwgaW50IG5rKQogewotCVB5T2JqZWN0ICpjYWxsYXJncyA9IE5VTEw7Ci0JUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNhbGxhcmdzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqa3dkaWN0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCWlmIChuayA+IDApIHsKLQkJa3dkaWN0ID0gdXBkYXRlX2tleXdvcmRfYXJncyhOVUxMLCBuaywgcHBfc3RhY2ssIGZ1bmMpOwotCQlpZiAoa3dkaWN0ID09IE5VTEwpCi0JCQlnb3RvIGNhbGxfZmFpbDsKLQl9Ci0JY2FsbGFyZ3MgPSBsb2FkX2FyZ3MocHBfc3RhY2ssIG5hKTsKLQlpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKLQkJZ290byBjYWxsX2ZhaWw7CisgICAgaWYgKG5rID4gMCkgeworICAgICAgICBrd2RpY3QgPSB1cGRhdGVfa2V5d29yZF9hcmdzKE5VTEwsIG5rLCBwcF9zdGFjaywgZnVuYyk7CisgICAgICAgIGlmIChrd2RpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gY2FsbF9mYWlsOworICAgIH0KKyAgICBjYWxsYXJncyA9IGxvYWRfYXJncyhwcF9zdGFjaywgbmEpOworICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKQorICAgICAgICBnb3RvIGNhbGxfZmFpbDsKICNpZmRlZiBDQUxMX1BST0ZJTEUKLQkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHRvIGxvb2sgYXQgdGhlIHR5cGUgb2YgZnVuYyB0bwotCSAgIHVwZGF0ZSB0aGUgY2FsbCBzdGF0cyBwcm9wZXJseS4gIERvIGl0IGhlcmUgc28gYXMgdG8gYXZvaWQKLQkgICBleHBvc2luZyB0aGUgY2FsbCBzdGF0cyBtYWNoaW5lcnkgb3V0c2lkZSBjZXZhbC5jCi0JKi8KLQlpZiAoUHlGdW5jdGlvbl9DaGVjayhmdW5jKSkKLQkJUENBTEwoUENBTExfRlVOQ1RJT04pOwotCWVsc2UgaWYgKFB5TWV0aG9kX0NoZWNrKGZ1bmMpKQotCQlQQ0FMTChQQ0FMTF9NRVRIT0QpOwotCWVsc2UgaWYgKFB5VHlwZV9DaGVjayhmdW5jKSkKLQkJUENBTEwoUENBTExfVFlQRSk7Ci0JZWxzZSBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykpCi0JCVBDQUxMKFBDQUxMX0NGVU5DVElPTik7Ci0JZWxzZQotCQlQQ0FMTChQQ0FMTF9PVEhFUik7CisgICAgLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB0byBsb29rIGF0IHRoZSB0eXBlIG9mIGZ1bmMgdG8KKyAgICAgICB1cGRhdGUgdGhlIGNhbGwgc3RhdHMgcHJvcGVybHkuICBEbyBpdCBoZXJlIHNvIGFzIHRvIGF2b2lkCisgICAgICAgZXhwb3NpbmcgdGhlIGNhbGwgc3RhdHMgbWFjaGluZXJ5IG91dHNpZGUgY2V2YWwuYworICAgICovCisgICAgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCisgICAgICAgIFBDQUxMKFBDQUxMX0ZVTkNUSU9OKTsKKyAgICBlbHNlIGlmIChQeU1ldGhvZF9DaGVjayhmdW5jKSkKKyAgICAgICAgUENBTEwoUENBTExfTUVUSE9EKTsKKyAgICBlbHNlIGlmIChQeVR5cGVfQ2hlY2soZnVuYykpCisgICAgICAgIFBDQUxMKFBDQUxMX1RZUEUpOworICAgIGVsc2UgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKQorICAgICAgICBQQ0FMTChQQ0FMTF9DRlVOQ1RJT04pOworICAgIGVsc2UKKyAgICAgICAgUENBTEwoUENBTExfT1RIRVIpOwogI2VuZGlmCi0JaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKSB7Ci0JCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JCUNfVFJBQ0UocmVzdWx0LCBQeUNGdW5jdGlvbl9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpKTsKLQl9Ci0JZWxzZQotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpOworICAgIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkgeworICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgICAgICBDX1RSQUNFKHJlc3VsdCwgUHlDRnVuY3Rpb25fQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KTsKICBjYWxsX2ZhaWw6Ci0JUHlfWERFQ1JFRihjYWxsYXJncyk7Ci0JUHlfWERFQ1JFRihrd2RpY3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihjYWxsYXJncyk7CisgICAgUHlfWERFQ1JFRihrd2RpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBleHRfZG9fY2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKioqcHBfc3RhY2ssIGludCBmbGFncywgaW50IG5hLCBpbnQgbmspCiB7Ci0JaW50IG5zdGFyID0gMDsKLQlQeU9iamVjdCAqY2FsbGFyZ3MgPSBOVUxMOwotCVB5T2JqZWN0ICpzdGFyYXJnID0gTlVMTDsKLQlQeU9iamVjdCAqa3dkaWN0ID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBpbnQgbnN0YXIgPSAwOworICAgIFB5T2JqZWN0ICpjYWxsYXJncyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnN0YXJhcmcgPSBOVUxMOworICAgIFB5T2JqZWN0ICprd2RpY3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JaWYgKGZsYWdzICYgQ0FMTF9GTEFHX0tXKSB7Ci0JCWt3ZGljdCA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKLQkJaWYgKCFQeURpY3RfQ2hlY2soa3dkaWN0KSkgewotCQkJUHlPYmplY3QgKmQ7Ci0JCQlkID0gUHlEaWN0X05ldygpOwotCQkJaWYgKGQgPT0gTlVMTCkKLQkJCQlnb3RvIGV4dF9jYWxsX2ZhaWw7Ci0JCQlpZiAoUHlEaWN0X1VwZGF0ZShkLCBrd2RpY3QpICE9IDApIHsKLQkJCQlQeV9ERUNSRUYoZCk7Ci0JCQkJLyogUHlEaWN0X1VwZGF0ZSByYWlzZXMgYXR0cmlidXRlCi0JCQkJICogZXJyb3IgKHBlcmNvbGF0ZWQgZnJvbSBhbiBhdHRlbXB0Ci0JCQkJICogdG8gZ2V0ICdrZXlzJyBhdHRyaWJ1dGUpIGluc3RlYWQgb2YKLQkJCQkgKiBhIHR5cGUgZXJyb3IgaWYgaXRzIHNlY29uZCBhcmd1bWVudAotCQkJCSAqIGlzIG5vdCBhIG1hcHBpbmcuCi0JCQkJICovCi0JCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7Ci0JCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkgICAgICIlLjIwMHMlLjIwMHMgYXJndW1lbnQgYWZ0ZXIgKiogIgotCQkJCQkJICAgICAibXVzdCBiZSBhIG1hcHBpbmcsIG5vdCAlLjIwMHMiLAotCQkJCQkJICAgICBQeUV2YWxfR2V0RnVuY05hbWUoZnVuYyksCi0JCQkJCQkgICAgIFB5RXZhbF9HZXRGdW5jRGVzYyhmdW5jKSwKLQkJCQkJCSAgICAga3dkaWN0LT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCQl9Ci0JCQkJZ290byBleHRfY2FsbF9mYWlsOwotCQkJfQotCQkJUHlfREVDUkVGKGt3ZGljdCk7Ci0JCQlrd2RpY3QgPSBkOwotCQl9Ci0JfQotCWlmIChmbGFncyAmIENBTExfRkxBR19WQVIpIHsKLQkJc3RhcmFyZyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKHN0YXJhcmcpKSB7Ci0JCQlQeU9iamVjdCAqdCA9IE5VTEw7Ci0JCQl0ID0gUHlTZXF1ZW5jZV9UdXBsZShzdGFyYXJnKTsKLQkJCWlmICh0ID09IE5VTEwpIHsKLQkJCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKSB7Ci0JCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkgICAgICIlLjIwMHMlLjIwMHMgYXJndW1lbnQgYWZ0ZXIgKiAiCi0JCQkJCQkgICAgICJtdXN0IGJlIGEgc2VxdWVuY2UsIG5vdCAlMjAwcyIsCi0JCQkJCQkgICAgIFB5RXZhbF9HZXRGdW5jTmFtZShmdW5jKSwKLQkJCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAotCQkJCQkJICAgICBzdGFyYXJnLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCQl9Ci0JCQkJZ290byBleHRfY2FsbF9mYWlsOwotCQkJfQotCQkJUHlfREVDUkVGKHN0YXJhcmcpOwotCQkJc3RhcmFyZyA9IHQ7Ci0JCX0KLQkJbnN0YXIgPSBQeVR1cGxlX0dFVF9TSVpFKHN0YXJhcmcpOwotCX0KLQlpZiAobmsgPiAwKSB7Ci0JCWt3ZGljdCA9IHVwZGF0ZV9rZXl3b3JkX2FyZ3Moa3dkaWN0LCBuaywgcHBfc3RhY2ssIGZ1bmMpOwotCQlpZiAoa3dkaWN0ID09IE5VTEwpCi0JCQlnb3RvIGV4dF9jYWxsX2ZhaWw7Ci0JfQotCWNhbGxhcmdzID0gdXBkYXRlX3N0YXJfYXJncyhuYSwgbnN0YXIsIHN0YXJhcmcsIHBwX3N0YWNrKTsKLQlpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKLQkJZ290byBleHRfY2FsbF9mYWlsOworICAgIGlmIChmbGFncyAmIENBTExfRkxBR19LVykgeworICAgICAgICBrd2RpY3QgPSBFWFRfUE9QKCpwcF9zdGFjayk7CisgICAgICAgIGlmICghUHlEaWN0X0NoZWNrKGt3ZGljdCkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpkOworICAgICAgICAgICAgZCA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgICAgIGlmIChkID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBleHRfY2FsbF9mYWlsOworICAgICAgICAgICAgaWYgKFB5RGljdF9VcGRhdGUoZCwga3dkaWN0KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGQpOworICAgICAgICAgICAgICAgIC8qIFB5RGljdF9VcGRhdGUgcmFpc2VzIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAqIGVycm9yIChwZXJjb2xhdGVkIGZyb20gYW4gYXR0ZW1wdAorICAgICAgICAgICAgICAgICAqIHRvIGdldCAna2V5cycgYXR0cmlidXRlKSBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICogYSB0eXBlIGVycm9yIGlmIGl0cyBzZWNvbmQgYXJndW1lbnQKKyAgICAgICAgICAgICAgICAgKiBpcyBub3QgYSBtYXBwaW5nLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyUuMjAwcyBhcmd1bWVudCBhZnRlciAqKiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBhIG1hcHBpbmcsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dkaWN0LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBleHRfY2FsbF9mYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGt3ZGljdCk7CisgICAgICAgICAgICBrd2RpY3QgPSBkOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmbGFncyAmIENBTExfRkxBR19WQVIpIHsKKyAgICAgICAgc3RhcmFyZyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHN0YXJhcmcpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdCA9IE5VTEw7CisgICAgICAgICAgICB0ID0gUHlTZXF1ZW5jZV9UdXBsZShzdGFyYXJnKTsKKyAgICAgICAgICAgIGlmICh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzJS4yMDBzIGFyZ3VtZW50IGFmdGVyICogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgYSBzZXF1ZW5jZSwgbm90ICUyMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRGdW5jTmFtZShmdW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRGdW5jRGVzYyhmdW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJhcmctPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIGV4dF9jYWxsX2ZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcmFyZyk7CisgICAgICAgICAgICBzdGFyYXJnID0gdDsKKyAgICAgICAgfQorICAgICAgICBuc3RhciA9IFB5VHVwbGVfR0VUX1NJWkUoc3RhcmFyZyk7CisgICAgfQorICAgIGlmIChuayA+IDApIHsKKyAgICAgICAga3dkaWN0ID0gdXBkYXRlX2tleXdvcmRfYXJncyhrd2RpY3QsIG5rLCBwcF9zdGFjaywgZnVuYyk7CisgICAgICAgIGlmIChrd2RpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXh0X2NhbGxfZmFpbDsKKyAgICB9CisgICAgY2FsbGFyZ3MgPSB1cGRhdGVfc3Rhcl9hcmdzKG5hLCBuc3Rhciwgc3RhcmFyZywgcHBfc3RhY2spOworICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKQorICAgICAgICBnb3RvIGV4dF9jYWxsX2ZhaWw7CiAjaWZkZWYgQ0FMTF9QUk9GSUxFCi0JLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB0byBsb29rIGF0IHRoZSB0eXBlIG9mIGZ1bmMgdG8KLQkgICB1cGRhdGUgdGhlIGNhbGwgc3RhdHMgcHJvcGVybHkuICBEbyBpdCBoZXJlIHNvIGFzIHRvIGF2b2lkCi0JICAgZXhwb3NpbmcgdGhlIGNhbGwgc3RhdHMgbWFjaGluZXJ5IG91dHNpZGUgY2V2YWwuYwotCSovCi0JaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCi0JCVBDQUxMKFBDQUxMX0ZVTkNUSU9OKTsKLQllbHNlIGlmIChQeU1ldGhvZF9DaGVjayhmdW5jKSkKLQkJUENBTEwoUENBTExfTUVUSE9EKTsKLQllbHNlIGlmIChQeVR5cGVfQ2hlY2soZnVuYykpCi0JCVBDQUxMKFBDQUxMX1RZUEUpOwotCWVsc2UgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKQotCQlQQ0FMTChQQ0FMTF9DRlVOQ1RJT04pOwotCWVsc2UKLQkJUENBTEwoUENBTExfT1RIRVIpOworICAgIC8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgdG8gbG9vayBhdCB0aGUgdHlwZSBvZiBmdW5jIHRvCisgICAgICAgdXBkYXRlIHRoZSBjYWxsIHN0YXRzIHByb3Blcmx5LiAgRG8gaXQgaGVyZSBzbyBhcyB0byBhdm9pZAorICAgICAgIGV4cG9zaW5nIHRoZSBjYWxsIHN0YXRzIG1hY2hpbmVyeSBvdXRzaWRlIGNldmFsLmMKKyAgICAqLworICAgIGlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKQorICAgICAgICBQQ0FMTChQQ0FMTF9GVU5DVElPTik7CisgICAgZWxzZSBpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykpCisgICAgICAgIFBDQUxMKFBDQUxMX01FVEhPRCk7CisgICAgZWxzZSBpZiAoUHlUeXBlX0NoZWNrKGZ1bmMpKQorICAgICAgICBQQ0FMTChQQ0FMTF9UWVBFKTsKKyAgICBlbHNlIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkKKyAgICAgICAgUENBTEwoUENBTExfQ0ZVTkNUSU9OKTsKKyAgICBlbHNlCisgICAgICAgIFBDQUxMKFBDQUxMX09USEVSKTsKICNlbmRpZgotCWlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkgewotCQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCQlDX1RSQUNFKHJlc3VsdCwgUHlDRnVuY3Rpb25fQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KSk7Ci0JfQotCWVsc2UKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KTsKKyAgICBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykpIHsKKyAgICAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICAgICAgQ19UUkFDRShyZXN1bHQsIFB5Q0Z1bmN0aW9uX0NhbGwoZnVuYywgY2FsbGFyZ3MsIGt3ZGljdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgY2FsbGFyZ3MsIGt3ZGljdCk7CiBleHRfY2FsbF9mYWlsOgotCVB5X1hERUNSRUYoY2FsbGFyZ3MpOwotCVB5X1hERUNSRUYoa3dkaWN0KTsKLQlQeV9YREVDUkVGKHN0YXJhcmcpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihjYWxsYXJncyk7CisgICAgUHlfWERFQ1JFRihrd2RpY3QpOworICAgIFB5X1hERUNSRUYoc3RhcmFyZyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogRXh0cmFjdCBhIHNsaWNlIGluZGV4IGZyb20gYSBQeUludCBvciBQeUxvbmcgb3IgYW4gb2JqZWN0IHdpdGggdGhlCkBAIC00MzQzLDkzICs0MzQzLDkzIEBACiBpbnQKIF9QeUV2YWxfU2xpY2VJbmRleChQeU9iamVjdCAqdiwgUHlfc3NpemVfdCAqcGkpCiB7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlQeV9zc2l6ZV90IHg7Ci0JCWlmIChQeUludF9DaGVjayh2KSkgewotCQkJLyogWFhYKG5ub3J3aXR6KTogSSB0aGluayBQeUludF9BU19MT05HIGlzIGNvcnJlY3QsCi0JCQkgICBob3dldmVyLCBpdCBsb29rcyBsaWtlIGl0IHNob3VsZCBiZSBBc1NzaXplX3QuCi0JCQkgICBUaGVyZSBzaG91bGQgYmUgYSBjb21tZW50IGhlcmUgZXhwbGFpbmluZyB3aHkuCi0JCQkqLwotCQkJeCA9IFB5SW50X0FTX0xPTkcodik7Ci0JCX0KLQkJZWxzZSBpZiAoUHlJbmRleF9DaGVjayh2KSkgewotCQkJeCA9IFB5TnVtYmVyX0FzU3NpemVfdCh2LCBOVUxMKTsKLQkJCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yICIKLQkJCQkJIk5vbmUgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkqcGkgPSB4OwotCX0KLQlyZXR1cm4gMTsKKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIFB5X3NzaXplX3QgeDsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgICAgICAvKiBYWFgobm5vcndpdHopOiBJIHRoaW5rIFB5SW50X0FTX0xPTkcgaXMgY29ycmVjdCwKKyAgICAgICAgICAgICAgIGhvd2V2ZXIsIGl0IGxvb2tzIGxpa2UgaXQgc2hvdWxkIGJlIEFzU3NpemVfdC4KKyAgICAgICAgICAgICAgIFRoZXJlIHNob3VsZCBiZSBhIGNvbW1lbnQgaGVyZSBleHBsYWluaW5nIHdoeS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICB4ID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChQeUluZGV4X0NoZWNrKHYpKSB7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfQXNTc2l6ZV90KHYsIE5VTEwpOworICAgICAgICAgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbmUgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAqcGkgPSB4OworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogI3VuZGVmIElTSU5ERVgKICNkZWZpbmUgSVNJTkRFWCh4KSAoKHgpID09IE5VTEwgfHwgXAotCQkgICAgUHlJbnRfQ2hlY2soeCkgfHwgUHlMb25nX0NoZWNrKHgpIHx8IFB5SW5kZXhfQ2hlY2soeCkpCisgICAgICAgICAgICAgICAgICAgIFB5SW50X0NoZWNrKHgpIHx8IFB5TG9uZ19DaGVjayh4KSB8fCBQeUluZGV4X0NoZWNrKHgpKQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXBwbHlfc2xpY2UoUHlPYmplY3QgKnUsIFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykgLyogcmV0dXJuIHVbdjp3XSAqLwogewotCVB5VHlwZU9iamVjdCAqdHAgPSB1LT5vYl90eXBlOwotCVB5U2VxdWVuY2VNZXRob2RzICpzcSA9IHRwLT50cF9hc19zZXF1ZW5jZTsKKyAgICBQeVR5cGVPYmplY3QgKnRwID0gdS0+b2JfdHlwZTsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqc3EgPSB0cC0+dHBfYXNfc2VxdWVuY2U7CiAKLQlpZiAoc3EgJiYgc3EtPnNxX3NsaWNlICYmIElTSU5ERVgodikgJiYgSVNJTkRFWCh3KSkgewotCQlQeV9zc2l6ZV90IGlsb3cgPSAwLCBpaGlnaCA9IFBZX1NTSVpFX1RfTUFYOwotCQlpZiAoIV9QeUV2YWxfU2xpY2VJbmRleCh2LCAmaWxvdykpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgodywgJmloaWdoKSkKLQkJCXJldHVybiBOVUxMOwotCQlyZXR1cm4gUHlTZXF1ZW5jZV9HZXRTbGljZSh1LCBpbG93LCBpaGlnaCk7Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqc2xpY2UgPSBQeVNsaWNlX05ldyh2LCB3LCBOVUxMKTsKLQkJaWYgKHNsaWNlICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9HZXRJdGVtKHUsIHNsaWNlKTsKLQkJCVB5X0RFQ1JFRihzbGljZSk7Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc3EgJiYgc3EtPnNxX3NsaWNlICYmIElTSU5ERVgodikgJiYgSVNJTkRFWCh3KSkgeworICAgICAgICBQeV9zc2l6ZV90IGlsb3cgPSAwLCBpaGlnaCA9IFBZX1NTSVpFX1RfTUFYOworICAgICAgICBpZiAoIV9QeUV2YWxfU2xpY2VJbmRleCh2LCAmaWxvdykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgodywgJmloaWdoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gUHlTZXF1ZW5jZV9HZXRTbGljZSh1LCBpbG93LCBpaGlnaCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqc2xpY2UgPSBQeVNsaWNlX05ldyh2LCB3LCBOVUxMKTsKKyAgICAgICAgaWYgKHNsaWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9HZXRJdGVtKHUsIHNsaWNlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzbGljZSk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIGludAogYXNzaWduX3NsaWNlKFB5T2JqZWN0ICp1LCBQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5T2JqZWN0ICp4KQotCS8qIHVbdjp3XSA9IHggKi8KKyAgICAvKiB1W3Y6d10gPSB4ICovCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IHUtPm9iX3R5cGU7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKnNxID0gdHAtPnRwX2FzX3NlcXVlbmNlOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSB1LT5vYl90eXBlOworICAgIFB5U2VxdWVuY2VNZXRob2RzICpzcSA9IHRwLT50cF9hc19zZXF1ZW5jZTsKIAotCWlmIChzcSAmJiBzcS0+c3FfYXNzX3NsaWNlICYmIElTSU5ERVgodikgJiYgSVNJTkRFWCh3KSkgewotCQlQeV9zc2l6ZV90IGlsb3cgPSAwLCBpaGlnaCA9IFBZX1NTSVpFX1RfTUFYOwotCQlpZiAoIV9QeUV2YWxfU2xpY2VJbmRleCh2LCAmaWxvdykpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmICghX1B5RXZhbF9TbGljZUluZGV4KHcsICZpaGlnaCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmICh4ID09IE5VTEwpCi0JCQlyZXR1cm4gUHlTZXF1ZW5jZV9EZWxTbGljZSh1LCBpbG93LCBpaGlnaCk7Ci0JCWVsc2UKLQkJCXJldHVybiBQeVNlcXVlbmNlX1NldFNsaWNlKHUsIGlsb3csIGloaWdoLCB4KTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpzbGljZSA9IFB5U2xpY2VfTmV3KHYsIHcsIE5VTEwpOwotCQlpZiAoc2xpY2UgIT0gTlVMTCkgewotCQkJaW50IHJlczsKLQkJCWlmICh4ICE9IE5VTEwpCi0JCQkJcmVzID0gUHlPYmplY3RfU2V0SXRlbSh1LCBzbGljZSwgeCk7Ci0JCQllbHNlCi0JCQkJcmVzID0gUHlPYmplY3RfRGVsSXRlbSh1LCBzbGljZSk7Ci0JCQlQeV9ERUNSRUYoc2xpY2UpOwotCQkJcmV0dXJuIHJlczsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChzcSAmJiBzcS0+c3FfYXNzX3NsaWNlICYmIElTSU5ERVgodikgJiYgSVNJTkRFWCh3KSkgeworICAgICAgICBQeV9zc2l6ZV90IGlsb3cgPSAwLCBpaGlnaCA9IFBZX1NTSVpFX1RfTUFYOworICAgICAgICBpZiAoIV9QeUV2YWxfU2xpY2VJbmRleCh2LCAmaWxvdykpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICghX1B5RXZhbF9TbGljZUluZGV4KHcsICZpaGlnaCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gUHlTZXF1ZW5jZV9EZWxTbGljZSh1LCBpbG93LCBpaGlnaCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeVNlcXVlbmNlX1NldFNsaWNlKHUsIGlsb3csIGloaWdoLCB4KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpzbGljZSA9IFB5U2xpY2VfTmV3KHYsIHcsIE5VTEwpOworICAgICAgICBpZiAoc2xpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfU2V0SXRlbSh1LCBzbGljZSwgeCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfRGVsSXRlbSh1LCBzbGljZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2xpY2UpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiAjZGVmaW5lIFB5M2tFeGNlcHRpb25DbGFzc19DaGVjayh4KSAgICAgXApAQCAtNDQzNyw0MTYgKzQ0MzcsNDE2IEBACiAgICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoKFB5VHlwZU9iamVjdCopKHgpLCBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTKSkKIAogI2RlZmluZSBDQU5OT1RfQ0FUQ0hfTVNHICJjYXRjaGluZyBjbGFzc2VzIHRoYXQgZG9uJ3QgaW5oZXJpdCBmcm9tICIgXAotCQkJICJCYXNlRXhjZXB0aW9uIGlzIG5vdCBhbGxvd2VkIGluIDMueCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzZUV4Y2VwdGlvbiBpcyBub3QgYWxsb3dlZCBpbiAzLngiCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbXBfb3V0Y29tZShpbnQgb3AsIHJlZ2lzdGVyIFB5T2JqZWN0ICp2LCByZWdpc3RlciBQeU9iamVjdCAqdykKIHsKLQlpbnQgcmVzID0gMDsKLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBQeUNtcF9JUzoKLQkJcmVzID0gKHYgPT0gdyk7Ci0JCWJyZWFrOwotCWNhc2UgUHlDbXBfSVNfTk9UOgotCQlyZXMgPSAodiAhPSB3KTsKLQkJYnJlYWs7Ci0JY2FzZSBQeUNtcF9JTjoKLQkJcmVzID0gUHlTZXF1ZW5jZV9Db250YWlucyh3LCB2KTsKLQkJaWYgKHJlcyA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJYnJlYWs7Ci0JY2FzZSBQeUNtcF9OT1RfSU46Ci0JCXJlcyA9IFB5U2VxdWVuY2VfQ29udGFpbnModywgdik7Ci0JCWlmIChyZXMgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlcyA9ICFyZXM7Ci0JCWJyZWFrOwotCWNhc2UgUHlDbXBfRVhDX01BVENIOgotCQlpZiAoUHlUdXBsZV9DaGVjayh3KSkgewotCQkJUHlfc3NpemVfdCBpLCBsZW5ndGg7Ci0JCQlsZW5ndGggPSBQeVR1cGxlX1NpemUodyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHsKLQkJCQlQeU9iamVjdCAqZXhjID0gUHlUdXBsZV9HRVRfSVRFTSh3LCBpKTsKLQkJCQlpZiAoUHlTdHJpbmdfQ2hlY2soZXhjKSkgewotCQkJCQlpbnQgcmV0X3ZhbDsKLQkJCQkJcmV0X3ZhbCA9IFB5RXJyX1dhcm5FeCgKLQkJCQkJCVB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkJCSJjYXRjaGluZyBvZiBzdHJpbmcgIgotCQkJCQkJImV4Y2VwdGlvbnMgaXMgZGVwcmVjYXRlZCIsIDEpOwotCQkJCQlpZiAocmV0X3ZhbCA8IDApCi0JCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoUHlfUHkza1dhcm5pbmdGbGFnICAmJgotCQkJCQkgIVB5VHVwbGVfQ2hlY2soZXhjKSAmJgotCQkJCQkgIVB5M2tFeGNlcHRpb25DbGFzc19DaGVjayhleGMpKQotCQkJCXsKLQkJCQkJaW50IHJldF92YWw7Ci0JCQkJCXJldF92YWwgPSBQeUVycl9XYXJuRXgoCi0JCQkJCQlQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkJCQlDQU5OT1RfQ0FUQ0hfTVNHLCAxKTsKLQkJCQkJaWYgKHJldF92YWwgPCAwKQotCQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFB5U3RyaW5nX0NoZWNrKHcpKSB7Ci0JCQkJaW50IHJldF92YWw7Ci0JCQkJcmV0X3ZhbCA9IFB5RXJyX1dhcm5FeCgKLQkJCQkJCVB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkJCSJjYXRjaGluZyBvZiBzdHJpbmcgIgotCQkJCQkJImV4Y2VwdGlvbnMgaXMgZGVwcmVjYXRlZCIsIDEpOwotCQkJCWlmIChyZXRfdmFsIDwgMCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQllbHNlIGlmIChQeV9QeTNrV2FybmluZ0ZsYWcgICYmCi0JCQkJICFQeVR1cGxlX0NoZWNrKHcpICYmCi0JCQkJICFQeTNrRXhjZXB0aW9uQ2xhc3NfQ2hlY2sodykpCi0JCQl7Ci0JCQkJaW50IHJldF92YWw7Ci0JCQkJcmV0X3ZhbCA9IFB5RXJyX1dhcm5FeCgKLQkJCQkJUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCQlDQU5OT1RfQ0FUQ0hfTVNHLCAxKTsKLQkJCQlpZiAocmV0X3ZhbCA8IDApCi0JCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCXJlcyA9IFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyh2LCB3KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKHYsIHcsIG9wKTsKLQl9Ci0JdiA9IHJlcyA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQlQeV9JTkNSRUYodik7Ci0JcmV0dXJuIHY7CisgICAgaW50IHJlcyA9IDA7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUHlDbXBfSVM6CisgICAgICAgIHJlcyA9ICh2ID09IHcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5Q21wX0lTX05PVDoKKyAgICAgICAgcmVzID0gKHYgIT0gdyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlDbXBfSU46CisgICAgICAgIHJlcyA9IFB5U2VxdWVuY2VfQ29udGFpbnModywgdik7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlDbXBfTk9UX0lOOgorICAgICAgICByZXMgPSBQeVNlcXVlbmNlX0NvbnRhaW5zKHcsIHYpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXMgPSAhcmVzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFB5Q21wX0VYQ19NQVRDSDoKKyAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2sodykpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaSwgbGVuZ3RoOworICAgICAgICAgICAgbGVuZ3RoID0gUHlUdXBsZV9TaXplKHcpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKmV4YyA9IFB5VHVwbGVfR0VUX0lURU0odywgaSk7CisgICAgICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGV4YykpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldF92YWw7CisgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBQeUVycl9XYXJuRXgoCisgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2F0Y2hpbmcgb2Ygc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb25zIGlzIGRlcHJlY2F0ZWQiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldF92YWwgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhUHlUdXBsZV9DaGVjayhleGMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIVB5M2tFeGNlcHRpb25DbGFzc19DaGVjayhleGMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldF92YWw7CisgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBQeUVycl9XYXJuRXgoCisgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBDQU5OT1RfQ0FUQ0hfTVNHLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldF92YWwgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHcpKSB7CisgICAgICAgICAgICAgICAgaW50IHJldF92YWw7CisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IFB5RXJyX1dhcm5FeCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2F0Y2hpbmcgb2Ygc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnMgaXMgZGVwcmVjYXRlZCIsIDEpOworICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChQeV9QeTNrV2FybmluZ0ZsYWcgICYmCisgICAgICAgICAgICAgICAgICAgICAhUHlUdXBsZV9DaGVjayh3KSAmJgorICAgICAgICAgICAgICAgICAgICAgIVB5M2tFeGNlcHRpb25DbGFzc19DaGVjayh3KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gUHlFcnJfV2FybkV4KAorICAgICAgICAgICAgICAgICAgICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIENBTk5PVF9DQVRDSF9NU0csIDEpOworICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKHYsIHcpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUodiwgdywgb3ApOworICAgIH0KKyAgICB2ID0gcmVzID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgIFB5X0lOQ1JFRih2KTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcG9ydF9mcm9tKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeU9iamVjdCAqeDsKKyAgICBQeU9iamVjdCAqeDsKIAotCXggPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOwotCWlmICh4ID09IE5VTEwgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJICAgICAiY2Fubm90IGltcG9ydCBuYW1lICUuMjMwcyIsCi0JCQkgICAgIFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpKTsKLQl9Ci0JcmV0dXJuIHg7CisgICAgeCA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZSk7CisgICAgaWYgKHggPT0gTlVMTCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGltcG9ydCBuYW1lICUuMjMwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSk7CisgICAgfQorICAgIHJldHVybiB4OwogfQogCiBzdGF0aWMgaW50CiBpbXBvcnRfYWxsX2Zyb20oUHlPYmplY3QgKmxvY2FscywgUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKmFsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgIl9fYWxsX18iKTsKLQlQeU9iamVjdCAqZGljdCwgKm5hbWUsICp2YWx1ZTsKLQlpbnQgc2tpcF9sZWFkaW5nX3VuZGVyc2NvcmVzID0gMDsKLQlpbnQgcG9zLCBlcnI7CisgICAgUHlPYmplY3QgKmFsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgIl9fYWxsX18iKTsKKyAgICBQeU9iamVjdCAqZGljdCwgKm5hbWUsICp2YWx1ZTsKKyAgICBpbnQgc2tpcF9sZWFkaW5nX3VuZGVyc2NvcmVzID0gMDsKKyAgICBpbnQgcG9zLCBlcnI7CiAKLQlpZiAoYWxsID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiAtMTsgLyogVW5leHBlY3RlZCBlcnJvciAqLwotCQlQeUVycl9DbGVhcigpOwotCQlkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCAiX19kaWN0X18iKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkiZnJvbS1pbXBvcnQtKiBvYmplY3QgaGFzIG5vIF9fZGljdF9fIGFuZCBubyBfX2FsbF9fIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYWxsID0gUHlNYXBwaW5nX0tleXMoZGljdCk7Ci0JCVB5X0RFQ1JFRihkaWN0KTsKLQkJaWYgKGFsbCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlza2lwX2xlYWRpbmdfdW5kZXJzY29yZXMgPSAxOwotCX0KKyAgICBpZiAoYWxsID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsgLyogVW5leHBlY3RlZCBlcnJvciAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCAiX19kaWN0X18iKTsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAiZnJvbS1pbXBvcnQtKiBvYmplY3QgaGFzIG5vIF9fZGljdF9fIGFuZCBubyBfX2FsbF9fIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYWxsID0gUHlNYXBwaW5nX0tleXMoZGljdCk7CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgaWYgKGFsbCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBza2lwX2xlYWRpbmdfdW5kZXJzY29yZXMgPSAxOworICAgIH0KIAotCWZvciAocG9zID0gMCwgZXJyID0gMDsgOyBwb3MrKykgewotCQluYW1lID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFsbCwgcG9zKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0luZGV4RXJyb3IpKQotCQkJCWVyciA9IC0xOwotCQkJZWxzZQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc2tpcF9sZWFkaW5nX3VuZGVyc2NvcmVzICYmCi0JCSAgICBQeVN0cmluZ19DaGVjayhuYW1lKSAmJgotCQkgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpWzBdID09ICdfJykKLQkJewotCQkJUHlfREVDUkVGKG5hbWUpOwotCQkJY29udGludWU7Ci0JCX0KLQkJdmFsdWUgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOwotCQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJCWVyciA9IC0xOwotCQllbHNlIGlmIChQeURpY3RfQ2hlY2tFeGFjdChsb2NhbHMpKQotCQkJZXJyID0gUHlEaWN0X1NldEl0ZW0obG9jYWxzLCBuYW1lLCB2YWx1ZSk7Ci0JCWVsc2UKLQkJCWVyciA9IFB5T2JqZWN0X1NldEl0ZW0obG9jYWxzLCBuYW1lLCB2YWx1ZSk7Ci0JCVB5X0RFQ1JFRihuYW1lKTsKLQkJUHlfWERFQ1JFRih2YWx1ZSk7Ci0JCWlmIChlcnIgIT0gMCkKLQkJCWJyZWFrOwotCX0KLQlQeV9ERUNSRUYoYWxsKTsKLQlyZXR1cm4gZXJyOworICAgIGZvciAocG9zID0gMCwgZXJyID0gMDsgOyBwb3MrKykgeworICAgICAgICBuYW1lID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFsbCwgcG9zKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0luZGV4RXJyb3IpKQorICAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2tpcF9sZWFkaW5nX3VuZGVyc2NvcmVzICYmCisgICAgICAgICAgICBQeVN0cmluZ19DaGVjayhuYW1lKSAmJgorICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpWzBdID09ICdfJykKKyAgICAgICAgeworICAgICAgICAgICAgUHlfREVDUkVGKG5hbWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWUgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOworICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICBlbHNlIGlmIChQeURpY3RfQ2hlY2tFeGFjdChsb2NhbHMpKQorICAgICAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0obG9jYWxzLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X1NldEl0ZW0obG9jYWxzLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICAgICAgUHlfWERFQ1JFRih2YWx1ZSk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBQeV9ERUNSRUYoYWxsKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbGRfY2xhc3MoUHlPYmplY3QgKm1ldGhvZHMsIFB5T2JqZWN0ICpiYXNlcywgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKm1ldGFjbGFzcyA9IE5VTEwsICpyZXN1bHQsICpiYXNlOworICAgIFB5T2JqZWN0ICptZXRhY2xhc3MgPSBOVUxMLCAqcmVzdWx0LCAqYmFzZTsKIAotCWlmIChQeURpY3RfQ2hlY2sobWV0aG9kcykpCi0JCW1ldGFjbGFzcyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1ldGhvZHMsICJfX21ldGFjbGFzc19fIik7Ci0JaWYgKG1ldGFjbGFzcyAhPSBOVUxMKQotCQlQeV9JTkNSRUYobWV0YWNsYXNzKTsKLQllbHNlIGlmIChQeVR1cGxlX0NoZWNrKGJhc2VzKSAmJiBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKSA+IDApIHsKLQkJYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIDApOwotCQltZXRhY2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGJhc2UsICJfX2NsYXNzX18iKTsKLQkJaWYgKG1ldGFjbGFzcyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJbWV0YWNsYXNzID0gKFB5T2JqZWN0ICopYmFzZS0+b2JfdHlwZTsKLQkJCVB5X0lOQ1JFRihtZXRhY2xhc3MpOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqZyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7Ci0JCWlmIChnICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGcpKQotCQkJbWV0YWNsYXNzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZywgIl9fbWV0YWNsYXNzX18iKTsKLQkJaWYgKG1ldGFjbGFzcyA9PSBOVUxMKQotCQkJbWV0YWNsYXNzID0gKFB5T2JqZWN0ICopICZQeUNsYXNzX1R5cGU7Ci0JCVB5X0lOQ1JFRihtZXRhY2xhc3MpOwotCX0KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKG1ldGFjbGFzcywgbmFtZSwgYmFzZXMsIG1ldGhvZHMsCi0JCQkJCSAgICAgIE5VTEwpOwotCVB5X0RFQ1JFRihtZXRhY2xhc3MpOwotCWlmIChyZXN1bHQgPT0gTlVMTCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpIHsKLQkJLyogQSB0eXBlIGVycm9yIGhlcmUgbGlrZWx5IG1lYW5zIHRoYXQgdGhlIHVzZXIgcGFzc2VkCi0JCSAgIGluIGEgYmFzZSB0aGF0IHdhcyBub3QgYSBjbGFzcyAoc3VjaCB0aGUgcmFuZG9tIG1vZHVsZQotCQkgICBpbnN0ZWFkIG9mIHRoZSByYW5kb20ucmFuZG9tIHR5cGUpLiAgSGVscCB0aGVtIG91dCB3aXRoCi0JCSAgIGJ5IGF1Z21lbnRpbmcgdGhlIGVycm9yIG1lc3NhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uLiovCisgICAgaWYgKFB5RGljdF9DaGVjayhtZXRob2RzKSkKKyAgICAgICAgbWV0YWNsYXNzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobWV0aG9kcywgIl9fbWV0YWNsYXNzX18iKTsKKyAgICBpZiAobWV0YWNsYXNzICE9IE5VTEwpCisgICAgICAgIFB5X0lOQ1JFRihtZXRhY2xhc3MpOworICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soYmFzZXMpICYmIFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpID4gMCkgeworICAgICAgICBiYXNlID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgMCk7CisgICAgICAgIG1ldGFjbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoYmFzZSwgIl9fY2xhc3NfXyIpOworICAgICAgICBpZiAobWV0YWNsYXNzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBtZXRhY2xhc3MgPSAoUHlPYmplY3QgKiliYXNlLT5vYl90eXBlOworICAgICAgICAgICAgUHlfSU5DUkVGKG1ldGFjbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpnID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKKyAgICAgICAgaWYgKGcgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soZykpCisgICAgICAgICAgICBtZXRhY2xhc3MgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhnLCAiX19tZXRhY2xhc3NfXyIpOworICAgICAgICBpZiAobWV0YWNsYXNzID09IE5VTEwpCisgICAgICAgICAgICBtZXRhY2xhc3MgPSAoUHlPYmplY3QgKikgJlB5Q2xhc3NfVHlwZTsKKyAgICAgICAgUHlfSU5DUkVGKG1ldGFjbGFzcyk7CisgICAgfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobWV0YWNsYXNzLCBuYW1lLCBiYXNlcywgbWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIFB5X0RFQ1JFRihtZXRhY2xhc3MpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpIHsKKyAgICAgICAgLyogQSB0eXBlIGVycm9yIGhlcmUgbGlrZWx5IG1lYW5zIHRoYXQgdGhlIHVzZXIgcGFzc2VkCisgICAgICAgICAgIGluIGEgYmFzZSB0aGF0IHdhcyBub3QgYSBjbGFzcyAoc3VjaCB0aGUgcmFuZG9tIG1vZHVsZQorICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSByYW5kb20ucmFuZG9tIHR5cGUpLiAgSGVscCB0aGVtIG91dCB3aXRoCisgICAgICAgICAgIGJ5IGF1Z21lbnRpbmcgdGhlIGVycm9yIG1lc3NhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uLiovCiAKLQkJUHlPYmplY3QgKnB0eXBlLCAqcHZhbHVlLCAqcHRyYWNlYmFjazsKKyAgICAgICAgUHlPYmplY3QgKnB0eXBlLCAqcHZhbHVlLCAqcHRyYWNlYmFjazsKIAotCQlQeUVycl9GZXRjaCgmcHR5cGUsICZwdmFsdWUsICZwdHJhY2ViYWNrKTsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKHB2YWx1ZSkpIHsKLQkJCVB5T2JqZWN0ICpuZXdtc2c7Ci0JCQluZXdtc2cgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAotCQkJCSJFcnJvciB3aGVuIGNhbGxpbmcgdGhlIG1ldGFjbGFzcyBiYXNlc1xuIgotCQkJCSIgICAgJXMiLAotCQkJCVB5U3RyaW5nX0FTX1NUUklORyhwdmFsdWUpKTsKLQkJCWlmIChuZXdtc2cgIT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihwdmFsdWUpOwotCQkJCXB2YWx1ZSA9IG5ld21zZzsKLQkJCX0KLQkJfQotCQlQeUVycl9SZXN0b3JlKHB0eXBlLCBwdmFsdWUsIHB0cmFjZWJhY2spOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICBQeUVycl9GZXRjaCgmcHR5cGUsICZwdmFsdWUsICZwdHJhY2ViYWNrKTsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHB2YWx1ZSkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuZXdtc2c7CisgICAgICAgICAgICBuZXdtc2cgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAorICAgICAgICAgICAgICAgICJFcnJvciB3aGVuIGNhbGxpbmcgdGhlIG1ldGFjbGFzcyBiYXNlc1xuIgorICAgICAgICAgICAgICAgICIgICAgJXMiLAorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhwdmFsdWUpKTsKKyAgICAgICAgICAgIGlmIChuZXdtc2cgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwdmFsdWUpOworICAgICAgICAgICAgICAgIHB2YWx1ZSA9IG5ld21zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeUVycl9SZXN0b3JlKHB0eXBlLCBwdmFsdWUsIHB0cmFjZWJhY2spOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBleGVjX3N0YXRlbWVudChQeUZyYW1lT2JqZWN0ICpmLCBQeU9iamVjdCAqcHJvZywgUHlPYmplY3QgKmdsb2JhbHMsCi0JICAgICAgIFB5T2JqZWN0ICpsb2NhbHMpCisgICAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzKQogewotCWludCBuOwotCVB5T2JqZWN0ICp2OwotCWludCBwbGFpbiA9IDA7CisgICAgaW50IG47CisgICAgUHlPYmplY3QgKnY7CisgICAgaW50IHBsYWluID0gMDsKIAotCWlmIChQeVR1cGxlX0NoZWNrKHByb2cpICYmIGdsb2JhbHMgPT0gUHlfTm9uZSAmJiBsb2NhbHMgPT0gUHlfTm9uZSAmJgotCSAgICAoKG4gPSBQeVR1cGxlX1NpemUocHJvZykpID09IDIgfHwgbiA9PSAzKSkgewotCQkvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGhhY2sgKi8KLQkJZ2xvYmFscyA9IFB5VHVwbGVfR2V0SXRlbShwcm9nLCAxKTsKLQkJaWYgKG4gPT0gMykKLQkJCWxvY2FscyA9IFB5VHVwbGVfR2V0SXRlbShwcm9nLCAyKTsKLQkJcHJvZyA9IFB5VHVwbGVfR2V0SXRlbShwcm9nLCAwKTsKLQl9Ci0JaWYgKGdsb2JhbHMgPT0gUHlfTm9uZSkgewotCQlnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKLQkJaWYgKGxvY2FscyA9PSBQeV9Ob25lKSB7Ci0JCQlsb2NhbHMgPSBQeUV2YWxfR2V0TG9jYWxzKCk7Ci0JCQlwbGFpbiA9IDE7Ci0JCX0KLQkJaWYgKCFnbG9iYWxzIHx8ICFsb2NhbHMpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJImdsb2JhbHMgYW5kIGxvY2FscyBjYW5ub3QgYmUgTlVMTCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWVsc2UgaWYgKGxvY2FscyA9PSBQeV9Ob25lKQotCQlsb2NhbHMgPSBnbG9iYWxzOwotCWlmICghUHlTdHJpbmdfQ2hlY2socHJvZykgJiYKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhwcm9nKSAmJiBnbG9iYWxzID09IFB5X05vbmUgJiYgbG9jYWxzID09IFB5X05vbmUgJiYKKyAgICAgICAgKChuID0gUHlUdXBsZV9TaXplKHByb2cpKSA9PSAyIHx8IG4gPT0gMykpIHsKKyAgICAgICAgLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eSBoYWNrICovCisgICAgICAgIGdsb2JhbHMgPSBQeVR1cGxlX0dldEl0ZW0ocHJvZywgMSk7CisgICAgICAgIGlmIChuID09IDMpCisgICAgICAgICAgICBsb2NhbHMgPSBQeVR1cGxlX0dldEl0ZW0ocHJvZywgMik7CisgICAgICAgIHByb2cgPSBQeVR1cGxlX0dldEl0ZW0ocHJvZywgMCk7CisgICAgfQorICAgIGlmIChnbG9iYWxzID09IFB5X05vbmUpIHsKKyAgICAgICAgZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7CisgICAgICAgIGlmIChsb2NhbHMgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgbG9jYWxzID0gUHlFdmFsX0dldExvY2FscygpOworICAgICAgICAgICAgcGxhaW4gPSAxOworICAgICAgICB9CisgICAgICAgIGlmICghZ2xvYmFscyB8fCAhbG9jYWxzKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdsb2JhbHMgYW5kIGxvY2FscyBjYW5ub3QgYmUgTlVMTCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGxvY2FscyA9PSBQeV9Ob25lKQorICAgICAgICBsb2NhbHMgPSBnbG9iYWxzOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2socHJvZykgJiYKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JICAgICFQeVVuaWNvZGVfQ2hlY2socHJvZykgJiYKKyAgICAgICAgIVB5VW5pY29kZV9DaGVjayhwcm9nKSAmJgogI2VuZGlmCi0JICAgICFQeUNvZGVfQ2hlY2socHJvZykgJiYKLQkgICAgIVB5RmlsZV9DaGVjayhwcm9nKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImV4ZWM6IGFyZyAxIG11c3QgYmUgYSBzdHJpbmcsIGZpbGUsIG9yIGNvZGUgb2JqZWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFQeURpY3RfQ2hlY2soZ2xvYmFscykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICJleGVjOiBhcmcgMiBtdXN0IGJlIGEgZGljdGlvbmFyeSBvciBOb25lIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFQeU1hcHBpbmdfQ2hlY2sobG9jYWxzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgImV4ZWM6IGFyZyAzIG11c3QgYmUgYSBtYXBwaW5nIG9yIE5vbmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpCi0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iLCBmLT5mX2J1aWx0aW5zKTsKLQlpZiAoUHlDb2RlX0NoZWNrKHByb2cpKSB7Ci0JCWlmIChQeUNvZGVfR2V0TnVtRnJlZSgoUHlDb2RlT2JqZWN0ICopcHJvZykgPiAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkiY29kZSBvYmplY3QgcGFzc2VkIHRvIGV4ZWMgbWF5IG5vdCBjb250YWluIGZyZWUgdmFyaWFibGVzIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdiA9IFB5RXZhbF9FdmFsQ29kZSgoUHlDb2RlT2JqZWN0ICopIHByb2csIGdsb2JhbHMsIGxvY2Fscyk7Ci0JfQotCWVsc2UgaWYgKFB5RmlsZV9DaGVjayhwcm9nKSkgewotCQlGSUxFICpmcCA9IFB5RmlsZV9Bc0ZpbGUocHJvZyk7Ci0JCWNoYXIgKm5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhQeUZpbGVfTmFtZShwcm9nKSk7Ci0JCVB5Q29tcGlsZXJGbGFncyBjZjsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJY2YuY2ZfZmxhZ3MgPSAwOwotCQlpZiAoUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpKQotCQkJdiA9IFB5UnVuX0ZpbGVGbGFncyhmcCwgbmFtZSwgUHlfZmlsZV9pbnB1dCwgZ2xvYmFscywKLQkJCQkJICAgIGxvY2FscywgJmNmKTsKLQkJZWxzZQotCQkJdiA9IFB5UnVuX0ZpbGUoZnAsIG5hbWUsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsCi0JCQkJICAgICAgIGxvY2Fscyk7Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqdG1wID0gTlVMTDsKLQkJY2hhciAqc3RyOwotCQlQeUNvbXBpbGVyRmxhZ3MgY2Y7Ci0JCWNmLmNmX2ZsYWdzID0gMDsKKyAgICAgICAgIVB5Q29kZV9DaGVjayhwcm9nKSAmJgorICAgICAgICAhUHlGaWxlX0NoZWNrKHByb2cpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiZXhlYzogYXJnIDEgbXVzdCBiZSBhIHN0cmluZywgZmlsZSwgb3IgY29kZSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5RGljdF9DaGVjayhnbG9iYWxzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImV4ZWM6IGFyZyAyIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9yIE5vbmUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5TWFwcGluZ19DaGVjayhsb2NhbHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiZXhlYzogYXJnIDMgbXVzdCBiZSBhIG1hcHBpbmcgb3IgTm9uZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIikgPT0gTlVMTCkKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIsIGYtPmZfYnVpbHRpbnMpOworICAgIGlmIChQeUNvZGVfQ2hlY2socHJvZykpIHsKKyAgICAgICAgaWYgKFB5Q29kZV9HZXROdW1GcmVlKChQeUNvZGVPYmplY3QgKilwcm9nKSA+IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICJjb2RlIG9iamVjdCBwYXNzZWQgdG8gZXhlYyBtYXkgbm90IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB2ID0gUHlFdmFsX0V2YWxDb2RlKChQeUNvZGVPYmplY3QgKikgcHJvZywgZ2xvYmFscywgbG9jYWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlGaWxlX0NoZWNrKHByb2cpKSB7CisgICAgICAgIEZJTEUgKmZwID0gUHlGaWxlX0FzRmlsZShwcm9nKTsKKyAgICAgICAgY2hhciAqbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKFB5RmlsZV9OYW1lKHByb2cpKTsKKyAgICAgICAgUHlDb21waWxlckZsYWdzIGNmOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjZi5jZl9mbGFncyA9IDA7CisgICAgICAgIGlmIChQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKCZjZikpCisgICAgICAgICAgICB2ID0gUHlSdW5fRmlsZUZsYWdzKGZwLCBuYW1lLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHMsICZjZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHYgPSBQeVJ1bl9GaWxlKGZwLCBuYW1lLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICp0bXAgPSBOVUxMOworICAgICAgICBjaGFyICpzdHI7CisgICAgICAgIFB5Q29tcGlsZXJGbGFncyBjZjsKKyAgICAgICAgY2YuY2ZfZmxhZ3MgPSAwOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhwcm9nKSkgewotCQkJdG1wID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhwcm9nKTsKLQkJCWlmICh0bXAgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlwcm9nID0gdG1wOwotCQkJY2YuY2ZfZmxhZ3MgfD0gUHlDRl9TT1VSQ0VfSVNfVVRGODsKLQkJfQorICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHByb2cpKSB7CisgICAgICAgICAgICB0bXAgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHByb2cpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHByb2cgPSB0bXA7CisgICAgICAgICAgICBjZi5jZl9mbGFncyB8PSBQeUNGX1NPVVJDRV9JU19VVEY4OworICAgICAgICB9CiAjZW5kaWYKLQkJaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShwcm9nLCAmc3RyLCBOVUxMKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKSkKLQkJCXYgPSBQeVJ1bl9TdHJpbmdGbGFncyhzdHIsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsCi0JCQkJCSAgICAgIGxvY2FscywgJmNmKTsKLQkJZWxzZQotCQkJdiA9IFB5UnVuX1N0cmluZyhzdHIsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsIGxvY2Fscyk7Ci0JCVB5X1hERUNSRUYodG1wKTsKLQl9Ci0JaWYgKHBsYWluKQotCQlQeUZyYW1lX0xvY2Fsc1RvRmFzdChmLCAwKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiAwOworICAgICAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHByb2csICZzdHIsIE5VTEwpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpKQorICAgICAgICAgICAgdiA9IFB5UnVuX1N0cmluZ0ZsYWdzKHN0ciwgUHlfZmlsZV9pbnB1dCwgZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHMsICZjZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHYgPSBQeVJ1bl9TdHJpbmcoc3RyLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLCBsb2NhbHMpOworICAgICAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgfQorICAgIGlmIChwbGFpbikKKyAgICAgICAgUHlGcmFtZV9Mb2NhbHNUb0Zhc3QoZiwgMCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIGZvcm1hdF9leGNfY2hlY2tfYXJnKFB5T2JqZWN0ICpleGMsIGNoYXIgKmZvcm1hdF9zdHIsIFB5T2JqZWN0ICpvYmopCiB7Ci0JY2hhciAqb2JqX3N0cjsKKyAgICBjaGFyICpvYmpfc3RyOwogCi0JaWYgKCFvYmopCi0JCXJldHVybjsKKyAgICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuOwogCi0Jb2JqX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iaik7Ci0JaWYgKCFvYmpfc3RyKQotCQlyZXR1cm47CisgICAgb2JqX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iaik7CisgICAgaWYgKCFvYmpfc3RyKQorICAgICAgICByZXR1cm47CiAKLQlQeUVycl9Gb3JtYXQoZXhjLCBmb3JtYXRfc3RyLCBvYmpfc3RyKTsKKyAgICBQeUVycl9Gb3JtYXQoZXhjLCBmb3JtYXRfc3RyLCBvYmpfc3RyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19jb25jYXRlbmF0ZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsCi0JCSAgIFB5RnJhbWVPYmplY3QgKmYsIHVuc2lnbmVkIGNoYXIgKm5leHRfaW5zdHIpCisgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqZiwgdW5zaWduZWQgY2hhciAqbmV4dF9pbnN0cikKIHsKLQkvKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgJ3ZhcmlhYmxlICs9IGV4cHInIHdoZW4gYm90aCBhcmd1bWVudHMKLQkgICBhcmUgc3RyaW5ncy4gKi8KLQlQeV9zc2l6ZV90IHZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7Ci0JUHlfc3NpemVfdCB3X2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHcpOwotCVB5X3NzaXplX3QgbmV3X2xlbiA9IHZfbGVuICsgd19sZW47Ci0JaWYgKG5ld19sZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJzdHJpbmdzIGFyZSB0b28gbGFyZ2UgdG8gY29uY2F0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgJ3ZhcmlhYmxlICs9IGV4cHInIHdoZW4gYm90aCBhcmd1bWVudHMKKyAgICAgICBhcmUgc3RyaW5ncy4gKi8KKyAgICBQeV9zc2l6ZV90IHZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisgICAgUHlfc3NpemVfdCB3X2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHcpOworICAgIFB5X3NzaXplX3QgbmV3X2xlbiA9IHZfbGVuICsgd19sZW47CisgICAgaWYgKG5ld19sZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ3MgYXJlIHRvbyBsYXJnZSB0byBjb25jYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHYtPm9iX3JlZmNudCA9PSAyKSB7Ci0JCS8qIEluIHRoZSBjb21tb24gY2FzZSwgdGhlcmUgYXJlIDIgcmVmZXJlbmNlcyB0byB0aGUgdmFsdWUKLQkJICogc3RvcmVkIGluICd2YXJpYWJsZScgd2hlbiB0aGUgKz0gaXMgcGVyZm9ybWVkOiBvbmUgb24gdGhlCi0JCSAqIHZhbHVlIHN0YWNrIChpbiAndicpIGFuZCBvbmUgc3RpbGwgc3RvcmVkIGluIHRoZQotCQkgKiAndmFyaWFibGUnLiAgV2UgdHJ5IHRvIGRlbGV0ZSB0aGUgdmFyaWFibGUgbm93IHRvIHJlZHVjZQotCQkgKiB0aGUgcmVmY250IHRvIDEuCi0JCSAqLwotCQlzd2l0Y2ggKCpuZXh0X2luc3RyKSB7Ci0JCWNhc2UgU1RPUkVfRkFTVDoKLQkJewotCQkJaW50IG9wYXJnID0gUEVFS0FSRygpOwotCQkJUHlPYmplY3QgKipmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwotCQkJaWYgKEdFVExPQ0FMKG9wYXJnKSA9PSB2KQotCQkJCVNFVExPQ0FMKG9wYXJnLCBOVUxMKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU1RPUkVfREVSRUY6Ci0JCXsKLQkJCVB5T2JqZWN0ICoqZnJlZXZhcnMgPSAoZi0+Zl9sb2NhbHNwbHVzICsKLQkJCQkJICAgICAgIGYtPmZfY29kZS0+Y29fbmxvY2Fscyk7Ci0JCQlQeU9iamVjdCAqYyA9IGZyZWV2YXJzW1BFRUtBUkcoKV07Ci0JCQlpZiAoUHlDZWxsX0dFVChjKSA9PSB2KQotCQkJCVB5Q2VsbF9TZXQoYywgTlVMTCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNUT1JFX05BTUU6Ci0JCXsKLQkJCVB5T2JqZWN0ICpuYW1lcyA9IGYtPmZfY29kZS0+Y29fbmFtZXM7Ci0JCQlQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIFBFRUtBUkcoKSk7Ci0JCQlQeU9iamVjdCAqbG9jYWxzID0gZi0+Zl9sb2NhbHM7Ci0JCQlpZiAoUHlEaWN0X0NoZWNrRXhhY3QobG9jYWxzKSAmJgotCQkJICAgIFB5RGljdF9HZXRJdGVtKGxvY2FscywgbmFtZSkgPT0gdikgewotCQkJCWlmIChQeURpY3RfRGVsSXRlbShsb2NhbHMsIG5hbWUpICE9IDApIHsKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQl9Ci0JfQorICAgIGlmICh2LT5vYl9yZWZjbnQgPT0gMikgeworICAgICAgICAvKiBJbiB0aGUgY29tbW9uIGNhc2UsIHRoZXJlIGFyZSAyIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlCisgICAgICAgICAqIHN0b3JlZCBpbiAndmFyaWFibGUnIHdoZW4gdGhlICs9IGlzIHBlcmZvcm1lZDogb25lIG9uIHRoZQorICAgICAgICAgKiB2YWx1ZSBzdGFjayAoaW4gJ3YnKSBhbmQgb25lIHN0aWxsIHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICogJ3ZhcmlhYmxlJy4gIFdlIHRyeSB0byBkZWxldGUgdGhlIHZhcmlhYmxlIG5vdyB0byByZWR1Y2UKKyAgICAgICAgICogdGhlIHJlZmNudCB0byAxLgorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoICgqbmV4dF9pbnN0cikgeworICAgICAgICBjYXNlIFNUT1JFX0ZBU1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvcGFyZyA9IFBFRUtBUkcoKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKKyAgICAgICAgICAgIGlmIChHRVRMT0NBTChvcGFyZykgPT0gdikKKyAgICAgICAgICAgICAgICBTRVRMT0NBTChvcGFyZywgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNUT1JFX0RFUkVGOgorICAgICAgICB7CisgICAgICAgICAgICBQeU9iamVjdCAqKmZyZWV2YXJzID0gKGYtPmZfbG9jYWxzcGx1cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfY29kZS0+Y29fbmxvY2Fscyk7CisgICAgICAgICAgICBQeU9iamVjdCAqYyA9IGZyZWV2YXJzW1BFRUtBUkcoKV07CisgICAgICAgICAgICBpZiAoUHlDZWxsX0dFVChjKSA9PSB2KQorICAgICAgICAgICAgICAgIFB5Q2VsbF9TZXQoYywgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNUT1JFX05BTUU6CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcyA9IGYtPmZfY29kZS0+Y29fbmFtZXM7CisgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIFBFRUtBUkcoKSk7CisgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzID0gZi0+Zl9sb2NhbHM7CisgICAgICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QobG9jYWxzKSAmJgorICAgICAgICAgICAgICAgIFB5RGljdF9HZXRJdGVtKGxvY2FscywgbmFtZSkgPT0gdikgeworICAgICAgICAgICAgICAgIGlmIChQeURpY3RfRGVsSXRlbShsb2NhbHMsIG5hbWUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKHYtPm9iX3JlZmNudCA9PSAxICYmICFQeVN0cmluZ19DSEVDS19JTlRFUk5FRCh2KSkgewotCQkvKiBOb3cgd2Ugb3duIHRoZSBsYXN0IHJlZmVyZW5jZSB0byAndicsIHNvIHdlIGNhbiByZXNpemUgaXQKLQkJICogaW4tcGxhY2UuCi0JCSAqLwotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgbmV3X2xlbikgIT0gMCkgewotCQkJLyogWFhYIGlmIF9QeVN0cmluZ19SZXNpemUoKSBmYWlscywgJ3YnIGhhcyBiZWVuCi0JCQkgKiBkZWFsbG9jYXRlZCBzbyBpdCBjYW5ub3QgYmUgcHV0IGJhY2sgaW50bwotCQkJICogJ3ZhcmlhYmxlJy4gIFRoZSBNZW1vcnlFcnJvciBpcyByYWlzZWQgd2hlbiB0aGVyZQotCQkJICogaXMgbm8gdmFsdWUgaW4gJ3ZhcmlhYmxlJywgd2hpY2ggbWlnaHQgKHZlcnkKLQkJCSAqIHJlbW90ZWx5KSBiZSBhIGNhdXNlIG9mIGluY29tcGF0aWJpbGl0aWVzLgotCQkJICovCi0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiBjb3B5ICd3JyBpbnRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgYXJlYSBvZiAndicgKi8KLQkJbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyh2KSArIHZfbGVuLAotCQkgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHcpLCB3X2xlbik7Ci0JCXJldHVybiB2OwotCX0KLQllbHNlIHsKLQkJLyogV2hlbiBpbi1wbGFjZSByZXNpemluZyBpcyBub3QgYW4gb3B0aW9uLiAqLwotCQlQeVN0cmluZ19Db25jYXQoJnYsIHcpOwotCQlyZXR1cm4gdjsKLQl9CisgICAgaWYgKHYtPm9iX3JlZmNudCA9PSAxICYmICFQeVN0cmluZ19DSEVDS19JTlRFUk5FRCh2KSkgeworICAgICAgICAvKiBOb3cgd2Ugb3duIHRoZSBsYXN0IHJlZmVyZW5jZSB0byAndicsIHNvIHdlIGNhbiByZXNpemUgaXQKKyAgICAgICAgICogaW4tcGxhY2UuCisgICAgICAgICAqLworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgbmV3X2xlbikgIT0gMCkgeworICAgICAgICAgICAgLyogWFhYIGlmIF9QeVN0cmluZ19SZXNpemUoKSBmYWlscywgJ3YnIGhhcyBiZWVuCisgICAgICAgICAgICAgKiBkZWFsbG9jYXRlZCBzbyBpdCBjYW5ub3QgYmUgcHV0IGJhY2sgaW50bworICAgICAgICAgICAgICogJ3ZhcmlhYmxlJy4gIFRoZSBNZW1vcnlFcnJvciBpcyByYWlzZWQgd2hlbiB0aGVyZQorICAgICAgICAgICAgICogaXMgbm8gdmFsdWUgaW4gJ3ZhcmlhYmxlJywgd2hpY2ggbWlnaHQgKHZlcnkKKyAgICAgICAgICAgICAqIHJlbW90ZWx5KSBiZSBhIGNhdXNlIG9mIGluY29tcGF0aWJpbGl0aWVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvKiBjb3B5ICd3JyBpbnRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgYXJlYSBvZiAndicgKi8KKyAgICAgICAgbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyh2KSArIHZfbGVuLAorICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHcpLCB3X2xlbik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogV2hlbiBpbi1wbGFjZSByZXNpemluZyBpcyBub3QgYW4gb3B0aW9uLiAqLworICAgICAgICBQeVN0cmluZ19Db25jYXQoJnYsIHcpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKICNpZmRlZiBEWU5BTUlDX0VYRUNVVElPTl9QUk9GSUxFCkBAIC00ODU0LDQwICs0ODU0LDQwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJyYXkobG9uZyBhWzI1Nl0pCiB7Ci0JaW50IGk7Ci0JUHlPYmplY3QgKmwgPSBQeUxpc3RfTmV3KDI1Nik7Ci0JaWYgKGwgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp4ID0gUHlJbnRfRnJvbUxvbmcoYVtpXSk7Ci0JCWlmICh4ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihsKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKGwsIGksIHgpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCWFbaV0gPSAwOwotCXJldHVybiBsOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICpsID0gUHlMaXN0X05ldygyNTYpOworICAgIGlmIChsID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqeCA9IFB5SW50X0Zyb21Mb25nKGFbaV0pOworICAgICAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU2V0SXRlbShsLCBpLCB4KTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBhW2ldID0gMDsKKyAgICByZXR1cm4gbDsKIH0KIAogUHlPYmplY3QgKgogX1B5X0dldERYUHJvZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAjaWZuZGVmIERYUEFJUlMKLQlyZXR1cm4gZ2V0YXJyYXkoZHhwKTsKKyAgICByZXR1cm4gZ2V0YXJyYXkoZHhwKTsKICNlbHNlCi0JaW50IGk7Ci0JUHlPYmplY3QgKmwgPSBQeUxpc3RfTmV3KDI1Nyk7Ci0JaWYgKGwgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IDI1NzsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp4ID0gZ2V0YXJyYXkoZHhwYWlyc1tpXSk7Ci0JCWlmICh4ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihsKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKGwsIGksIHgpOwotCX0KLQlyZXR1cm4gbDsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqbCA9IFB5TGlzdF9OZXcoMjU3KTsKKyAgICBpZiAobCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU3OyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnggPSBnZXRhcnJheShkeHBhaXJzW2ldKTsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGwpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NldEl0ZW0obCwgaSwgeCk7CisgICAgfQorICAgIHJldHVybiBsOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9jb2RlY3MuYyBiL1B5dGhvbi9jb2RlY3MuYwppbmRleCAzODQ5Y2Y5Li41N2JkMGY0IDEwMDY0NAotLS0gYS9QeXRob24vY29kZWNzLmMKKysrIGIvUHl0aG9uL2NvZGVjcy5jCkBAIC0xNCw3ICsxNCw3IEBACiAvKiAtLS0gQ29kZWMgUmVnaXN0cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyogSW1wb3J0IHRoZSBzdGFuZGFyZCBlbmNvZGluZ3MgcGFja2FnZSB3aGljaCB3aWxsIHJlZ2lzdGVyIHRoZSBmaXJzdAotICAgY29kZWMgc2VhcmNoIGZ1bmN0aW9uLiAKKyAgIGNvZGVjIHNlYXJjaCBmdW5jdGlvbi4KIAogICAgVGhpcyBpcyBkb25lIGluIGEgbGF6eSB3YXkgc28gdGhhdCB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbiBkb2VzCiAgICBub3QgZG93bmdyYWRlIHN0YXJ0dXAgdGltZSBvZiBzY3JpcHRzIG5vdCBuZWVkaW5nIGl0LgpAQCAtMzAsMTQgKzMwLDE0IEBACiB7CiAgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CiAgICAgaWYgKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGggPT0gTlVMTCAmJiBfUHlDb2RlY1JlZ2lzdHJ5X0luaXQoKSkKLQlnb3RvIG9uRXJyb3I7CisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICBpZiAoc2VhcmNoX2Z1bmN0aW9uID09IE5VTEwpIHsKLQlQeUVycl9CYWRBcmd1bWVudCgpOwotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIH0KICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soc2VhcmNoX2Z1bmN0aW9uKSkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JZ290byBvbkVycm9yOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogICAgIHJldHVybiBQeUxpc3RfQXBwZW5kKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGgsIHNlYXJjaF9mdW5jdGlvbik7CiAKQEAgLTU1LDE1ICs1NSwxNSBAQAogICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKICAgICBjaGFyICpwOwogICAgIFB5T2JqZWN0ICp2OwotICAgIAorCiAgICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzdHJpbmcgaXMgdG9vIGxhcmdlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic3RyaW5nIGlzIHRvbyBsYXJnZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0JCisKICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKICAgICBpZiAodiA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICBwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpOwogICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICByZWdpc3RlciBjaGFyIGNoID0gc3RyaW5nW2ldOwpAQCAtNzEsNyArNzEsNyBAQAogICAgICAgICAgICAgY2ggPSAnLSc7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGNoID0gdG9sb3dlcihQeV9DSEFSTUFTSyhjaCkpOwotCXBbaV0gPSBjaDsKKyAgICAgICAgcFtpXSA9IGNoOwogICAgIH0KICAgICByZXR1cm4gdjsKIH0KQEAgLTgzLDcgKzgzLDcgQEAKICAgIGNoYXJhY3RlcnMuIFRoaXMgbWFrZXMgZW5jb2RpbmdzIGxvb2tlZCB1cCB0aHJvdWdoIHRoaXMgbWVjaGFuaXNtCiAgICBlZmZlY3RpdmVseSBjYXNlLWluc2Vuc2l0aXZlLgogCi0gICBJZiBubyBjb2RlYyBpcyBmb3VuZCwgYSBMb29rdXBFcnJvciBpcyBzZXQgYW5kIE5VTEwgcmV0dXJuZWQuIAorICAgSWYgbm8gY29kZWMgaXMgZm91bmQsIGEgTG9va3VwRXJyb3IgaXMgc2V0IGFuZCBOVUxMIHJldHVybmVkLgogCiAgICBBcyBzaWRlIGVmZmVjdCwgdGhpcyB0cmllcyB0byBsb2FkIHRoZSBlbmNvZGluZ3MgcGFja2FnZSwgaWYgbm90CiAgICB5ZXQgZG9uZS4gVGhpcyBpcyBwYXJ0IG9mIHRoZSBsYXp5IGxvYWQgc3RyYXRlZ3kgZm9yIHRoZSBlbmNvZGluZ3MKQEAgLTk4LDcyICs5OCw3MiBAQAogICAgIFB5X3NzaXplX3QgaSwgbGVuOwogCiAgICAgaWYgKGVuY29kaW5nID09IE5VTEwpIHsKLQlQeUVycl9CYWRBcmd1bWVudCgpOwotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIH0KIAogICAgIGludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICBpZiAoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCA9PSBOVUxMICYmIF9QeUNvZGVjUmVnaXN0cnlfSW5pdCgpKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogCiAgICAgLyogQ29udmVydCB0aGUgZW5jb2RpbmcgdG8gYSBub3JtYWxpemVkIFB5dGhvbiBzdHJpbmc6IGFsbAogICAgICAgIGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLCBzcGFjZXMgYW5kIGh5cGhlbnMgYXJlCiAgICAgICAgcmVwbGFjZWQgd2l0aCB1bmRlcnNjb3Jlcy4gKi8KICAgICB2ID0gbm9ybWFsaXplc3RyaW5nKGVuY29kaW5nKTsKICAgICBpZiAodiA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJnYpOwogCiAgICAgLyogRmlyc3QsIHRyeSB0byBsb29rdXAgdGhlIG5hbWUgaW4gdGhlIHJlZ2lzdHJ5IGRpY3Rpb25hcnkgKi8KICAgICByZXN1bHQgPSBQeURpY3RfR2V0SXRlbShpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSwgdik7CiAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIAorCiAgICAgLyogTmV4dCwgc2NhbiB0aGUgc2VhcmNoIGZ1bmN0aW9ucyBpbiBvcmRlciBvZiByZWdpc3RyYXRpb24gKi8KICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMSk7CiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7CisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsMCx2KTsKIAogICAgIGxlbiA9IFB5TGlzdF9TaXplKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGgpOwogICAgIGlmIChsZW4gPCAwKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIGlmIChsZW4gPT0gMCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Mb29rdXBFcnJvciwKLQkJCSJubyBjb2RlYyBzZWFyY2ggZnVuY3Rpb25zIHJlZ2lzdGVyZWQ6ICIKLQkJCSJjYW4ndCBmaW5kIGVuY29kaW5nIik7Ci0JZ290byBvbkVycm9yOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTG9va3VwRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm8gY29kZWMgc2VhcmNoIGZ1bmN0aW9ucyByZWdpc3RlcmVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZmluZCBlbmNvZGluZyIpOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JCi0JZnVuYyA9IFB5TGlzdF9HZXRJdGVtKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGgsIGkpOwotCWlmIChmdW5jID09IE5VTEwpCi0JICAgIGdvdG8gb25FcnJvcjsKLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JICAgIGdvdG8gb25FcnJvcjsKLQlpZiAocmVzdWx0ID09IFB5X05vbmUpIHsKLQkgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAoIVB5VHVwbGVfQ2hlY2socmVzdWx0KSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJlc3VsdCkgIT0gNCkgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICJjb2RlYyBzZWFyY2ggZnVuY3Rpb25zIG11c3QgcmV0dXJuIDQtdHVwbGVzIik7Ci0JICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotCSAgICBnb3RvIG9uRXJyb3I7Ci0JfQotCWJyZWFrOworICAgICAgICBQeU9iamVjdCAqZnVuYzsKKworICAgICAgICBmdW5jID0gUHlMaXN0X0dldEl0ZW0oaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCwgaSk7CisgICAgICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgIGlmIChyZXN1bHQgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2socmVzdWx0KSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJlc3VsdCkgIT0gNCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29kZWMgc2VhcmNoIGZ1bmN0aW9ucyBtdXN0IHJldHVybiA0LXR1cGxlcyIpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmIChpID09IGxlbikgewotCS8qIFhYWCBQZXJoYXBzIHdlIHNob3VsZCBjYWNoZSBtaXNzZXMgdG9vID8gKi8KLQlQeUVycl9Gb3JtYXQoUHlFeGNfTG9va3VwRXJyb3IsCisgICAgICAgIC8qIFhYWCBQZXJoYXBzIHdlIHNob3VsZCBjYWNoZSBtaXNzZXMgdG9vID8gKi8KKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0xvb2t1cEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgInVua25vd24gZW5jb2Rpbmc6ICVzIiwgZW5jb2RpbmcpOwotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIH0KIAogICAgIC8qIENhY2hlIGFuZCByZXR1cm4gdGhlIHJlc3VsdCAqLwpAQCAtMTc4LDI0ICsxNzgsMjQgQEAKIAogc3RhdGljCiBQeU9iamVjdCAqYXJnc190dXBsZShQeU9iamVjdCAqb2JqZWN0LAotCQkgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqYXJnczsKLSAgICAKKwogICAgIGFyZ3MgPSBQeVR1cGxlX05ldygxICsgKGVycm9ycyAhPSBOVUxMKSk7CiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfSU5DUkVGKG9iamVjdCk7CiAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLDAsb2JqZWN0KTsKICAgICBpZiAoZXJyb3JzKSB7Ci0JUHlPYmplY3QgKnY7Ci0JCi0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZXJyb3JzKTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JICAgIFB5X0RFQ1JFRihhcmdzKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCVB5VHVwbGVfU0VUX0lURU0oYXJncywgMSwgdik7CisgICAgICAgIFB5T2JqZWN0ICp2OworCisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGVycm9ycyk7CisgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMSwgdik7CiAgICAgfQogICAgIHJldHVybiBhcmdzOwogfQpAQCAtMjEwLDcgKzIxMCw3IEBACiAKICAgICBjb2RlY3MgPSBfUHlDb2RlY19Mb29rdXAoZW5jb2RpbmcpOwogICAgIGlmIChjb2RlY3MgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oY29kZWNzLCBpbmRleCk7CiAgICAgUHlfREVDUkVGKGNvZGVjcyk7CiAgICAgUHlfSU5DUkVGKHYpOwpAQCAtMjIxLDIyICsyMjEsMjIgQEAKIAogc3RhdGljCiBQeU9iamVjdCAqY29kZWNfZ2V0aW5jcmVtZW50YWxjb2RlYyhjb25zdCBjaGFyICplbmNvZGluZywKLQkJCQkgICAgY29uc3QgY2hhciAqZXJyb3JzLAotCQkJCSAgICBjb25zdCBjaGFyICphdHRybmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF0dHJuYW1lKQogewogICAgIFB5T2JqZWN0ICpjb2RlY3MsICpyZXQsICppbmNjb2RlYzsKIAogICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7CiAgICAgaWYgKGNvZGVjcyA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpbmNjb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29kZWNzLCBhdHRybmFtZSk7CiAgICAgUHlfREVDUkVGKGNvZGVjcyk7CiAgICAgaWYgKGluY2NvZGVjID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChlcnJvcnMpCi0JcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGluY2NvZGVjLCAicyIsIGVycm9ycyk7CisgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihpbmNjb2RlYywgInMiLCBlcnJvcnMpOwogICAgIGVsc2UKLQlyZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oaW5jY29kZWMsIE5VTEwpOworICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oaW5jY29kZWMsIE5VTEwpOwogICAgIFB5X0RFQ1JFRihpbmNjb2RlYyk7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTI0NSwyOSArMjQ1LDI5IEBACiAKIHN0YXRpYwogUHlPYmplY3QgKmNvZGVjX2dldHN0cmVhbWNvZGVjKGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJICAgICAgIFB5T2JqZWN0ICpzdHJlYW0sCi0JCQkgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLAotCQkJICAgICAgIGNvbnN0IGludCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXgpCiB7CiAgICAgUHlPYmplY3QgKmNvZGVjcywgKnN0cmVhbWNvZGVjLCAqY29kZWNjbHM7CiAKICAgICBjb2RlY3MgPSBfUHlDb2RlY19Mb29rdXAoZW5jb2RpbmcpOwogICAgIGlmIChjb2RlY3MgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBjb2RlY2NscyA9IFB5VHVwbGVfR0VUX0lURU0oY29kZWNzLCBpbmRleCk7CiAgICAgaWYgKGVycm9ycyAhPSBOVUxMKQotCXN0cmVhbWNvZGVjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNvZGVjY2xzLCAiT3MiLCBzdHJlYW0sIGVycm9ycyk7CisgICAgICAgIHN0cmVhbWNvZGVjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNvZGVjY2xzLCAiT3MiLCBzdHJlYW0sIGVycm9ycyk7CiAgICAgZWxzZQotCXN0cmVhbWNvZGVjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNvZGVjY2xzLCAiTyIsIHN0cmVhbSk7CisgICAgICAgIHN0cmVhbWNvZGVjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNvZGVjY2xzLCAiTyIsIHN0cmVhbSk7CiAgICAgUHlfREVDUkVGKGNvZGVjcyk7CiAgICAgcmV0dXJuIHN0cmVhbWNvZGVjOwogfQogCi0vKiBDb252ZW5pZW5jZSBBUElzIHRvIHF1ZXJ5IHRoZSBDb2RlYyByZWdpc3RyeS4gCi0gICAKKy8qIENvbnZlbmllbmNlIEFQSXMgdG8gcXVlcnkgdGhlIENvZGVjIHJlZ2lzdHJ5LgorCiAgICBBbGwgQVBJcyByZXR1cm4gYSBjb2RlYyBvYmplY3Qgd2l0aCBpbmNyZW1lbnRlZCByZWZjb3VudC4KLSAgIAorCiAgKi8KIAogUHlPYmplY3QgKlB5Q29kZWNfRW5jb2Rlcihjb25zdCBjaGFyICplbmNvZGluZykKQEAgLTI4MSwyNyArMjgxLDI3IEBACiB9CiAKIFB5T2JqZWN0ICpQeUNvZGVjX0luY3JlbWVudGFsRW5jb2Rlcihjb25zdCBjaGFyICplbmNvZGluZywKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgcmV0dXJuIGNvZGVjX2dldGluY3JlbWVudGFsY29kZWMoZW5jb2RpbmcsIGVycm9ycywgImluY3JlbWVudGFsZW5jb2RlciIpOwogfQogCiBQeU9iamVjdCAqUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIoY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkJICAgICBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIHJldHVybiBjb2RlY19nZXRpbmNyZW1lbnRhbGNvZGVjKGVuY29kaW5nLCBlcnJvcnMsICJpbmNyZW1lbnRhbGRlY29kZXIiKTsKIH0KIAogUHlPYmplY3QgKlB5Q29kZWNfU3RyZWFtUmVhZGVyKGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJICAgICAgIFB5T2JqZWN0ICpzdHJlYW0sCi0JCQkgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIHJldHVybiBjb2RlY19nZXRzdHJlYW1jb2RlYyhlbmNvZGluZywgc3RyZWFtLCBlcnJvcnMsIDIpOwogfQogCiBQeU9iamVjdCAqUHlDb2RlY19TdHJlYW1Xcml0ZXIoY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkgICAgICAgUHlPYmplY3QgKnN0cmVhbSwKLQkJCSAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgcmV0dXJuIGNvZGVjX2dldHN0cmVhbWNvZGVjKGVuY29kaW5nLCBzdHJlYW0sIGVycm9ycywgMyk7CiB9CkBAIC0zMTIsOCArMzEyLDggQEAKICAgIGVycm9ycyBpcyBwYXNzZWQgdG8gdGhlIGVuY29kZXIgZmFjdG9yeSBhcyBhcmd1bWVudCBpZiBub24tTlVMTC4gKi8KIAogUHlPYmplY3QgKlB5Q29kZWNfRW5jb2RlKFB5T2JqZWN0ICpvYmplY3QsCi0JCQkgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqZW5jb2RlciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmFyZ3MgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKQEAgLTMyMSwyMSArMzIxLDIxIEBACiAKICAgICBlbmNvZGVyID0gUHlDb2RlY19FbmNvZGVyKGVuY29kaW5nKTsKICAgICBpZiAoZW5jb2RlciA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogCiAgICAgYXJncyA9IGFyZ3NfdHVwbGUob2JqZWN0LCBlcnJvcnMpOwogICAgIGlmIChhcmdzID09IE5VTEwpCi0JZ290byBvbkVycm9yOwotICAgIAorICAgICAgICBnb3RvIG9uRXJyb3I7CisKICAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChlbmNvZGVyLGFyZ3MpOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7CisgICAgICAgIGdvdG8gb25FcnJvcjsKIAotICAgIGlmICghUHlUdXBsZV9DaGVjayhyZXN1bHQpIHx8IAotCVB5VHVwbGVfR0VUX1NJWkUocmVzdWx0KSAhPSAyKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJlbmNvZGVyIG11c3QgcmV0dXJuIGEgdHVwbGUgKG9iamVjdCxpbnRlZ2VyKSIpOwotCWdvdG8gb25FcnJvcjsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2socmVzdWx0KSB8fAorICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKHJlc3VsdCkgIT0gMikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kZXIgbXVzdCByZXR1cm4gYSB0dXBsZSAob2JqZWN0LGludGVnZXIpIik7CisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LDApOwogICAgIFB5X0lOQ1JFRih2KTsKQEAgLTM0NSw3ICszNDUsNyBAQAogICAgIFB5X0RFQ1JFRihlbmNvZGVyKTsKICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICByZXR1cm4gdjsKLQkKKwogIG9uRXJyb3I6CiAgICAgUHlfWERFQ1JFRihyZXN1bHQpOwogICAgIFB5X1hERUNSRUYoYXJncyk7CkBAIC0zNTksOCArMzU5LDggQEAKICAgIGVycm9ycyBpcyBwYXNzZWQgdG8gdGhlIGRlY29kZXIgZmFjdG9yeSBhcyBhcmd1bWVudCBpZiBub24tTlVMTC4gKi8KIAogUHlPYmplY3QgKlB5Q29kZWNfRGVjb2RlKFB5T2JqZWN0ICpvYmplY3QsCi0JCQkgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqZGVjb2RlciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmFyZ3MgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKQEAgLTM2OCwyMCArMzY4LDIwIEBACiAKICAgICBkZWNvZGVyID0gUHlDb2RlY19EZWNvZGVyKGVuY29kaW5nKTsKICAgICBpZiAoZGVjb2RlciA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogCiAgICAgYXJncyA9IGFyZ3NfdHVwbGUob2JqZWN0LCBlcnJvcnMpOwogICAgIGlmIChhcmdzID09IE5VTEwpCi0JZ290byBvbkVycm9yOwotICAgIAorICAgICAgICBnb3RvIG9uRXJyb3I7CisKICAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChkZWNvZGVyLGFyZ3MpOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7Ci0gICAgaWYgKCFQeVR1cGxlX0NoZWNrKHJlc3VsdCkgfHwgCi0JUHlUdXBsZV9HRVRfU0laRShyZXN1bHQpICE9IDIpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImRlY29kZXIgbXVzdCByZXR1cm4gYSB0dXBsZSAob2JqZWN0LGludGVnZXIpIik7Ci0JZ290byBvbkVycm9yOworICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHJlc3VsdCkgfHwKKyAgICAgICAgUHlUdXBsZV9HRVRfU0laRShyZXN1bHQpICE9IDIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZWNvZGVyIG11c3QgcmV0dXJuIGEgdHVwbGUgKG9iamVjdCxpbnRlZ2VyKSIpOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogICAgIHYgPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwwKTsKICAgICBQeV9JTkNSRUYodik7CkBAIC0zOTEsNyArMzkxLDcgQEAKICAgICBQeV9ERUNSRUYoZGVjb2Rlcik7CiAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgcmV0dXJuIHY7Ci0JCisKICBvbkVycm9yOgogICAgIFB5X1hERUNSRUYoYXJncyk7CiAgICAgUHlfWERFQ1JFRihkZWNvZGVyKTsKQEAgLTQwOSwxMyArNDA5LDEzIEBACiB7CiAgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CiAgICAgaWYgKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGggPT0gTlVMTCAmJiBfUHlDb2RlY1JlZ2lzdHJ5X0luaXQoKSkKLQlyZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZXJyb3IpKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhhbmRsZXIgbXVzdCBiZSBjYWxsYWJsZSIpOwotCXJldHVybiAtMTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhhbmRsZXIgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyhpbnRlcnAtPmNvZGVjX2Vycm9yX3JlZ2lzdHJ5LAotCSAgICAJCQkoY2hhciAqKW5hbWUsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiluYW1lLCBlcnJvcik7CiB9CiAKIC8qIExvb2t1cCB0aGUgZXJyb3IgaGFuZGxpbmcgY2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZCB1bmRlciB0aGUKQEAgLTQyNywxNSArNDI3LDE1IEBACiAKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICBpZiAoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCA9PSBOVUxMICYmIF9QeUNvZGVjUmVnaXN0cnlfSW5pdCgpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChuYW1lPT1OVUxMKQotCW5hbWUgPSAic3RyaWN0IjsKKyAgICAgICAgbmFtZSA9ICJzdHJpY3QiOwogICAgIGhhbmRsZXIgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhpbnRlcnAtPmNvZGVjX2Vycm9yX3JlZ2lzdHJ5LCAoY2hhciAqKW5hbWUpOwogICAgIGlmICghaGFuZGxlcikKLQlQeUVycl9Gb3JtYXQoUHlFeGNfTG9va3VwRXJyb3IsICJ1bmtub3duIGVycm9yIGhhbmRsZXIgbmFtZSAnJS40MDBzJyIsIG5hbWUpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfTG9va3VwRXJyb3IsICJ1bmtub3duIGVycm9yIGhhbmRsZXIgbmFtZSAnJS40MDBzJyIsIG5hbWUpOwogICAgIGVsc2UKLQlQeV9JTkNSRUYoaGFuZGxlcik7CisgICAgICAgIFB5X0lOQ1JFRihoYW5kbGVyKTsKICAgICByZXR1cm4gaGFuZGxlcjsKIH0KIApAQCAtNDQzLDE4ICs0NDMsMTggQEAKIHsKICAgICBQeU9iamVjdCAqdHlwZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXhjLCAiX19jbGFzc19fIik7CiAgICAgaWYgKHR5cGUgIT0gTlVMTCkgewotCVB5T2JqZWN0ICpuYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0eXBlLCAiX19uYW1lX18iKTsKLQlQeV9ERUNSRUYodHlwZSk7Ci0JaWYgKG5hbWUgIT0gTlVMTCkgewotCSAgICBQeU9iamVjdCAqc3RyaW5nID0gUHlPYmplY3RfU3RyKG5hbWUpOwotCSAgICBQeV9ERUNSRUYobmFtZSk7Ci0JICAgIGlmIChzdHJpbmcgIT0gTlVMTCkgewotCSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJS40MDBzIGluIGVycm9yIGNhbGxiYWNrIiwKLQkJICAgIFB5U3RyaW5nX0FTX1NUUklORyhzdHJpbmcpKTsKLQkgICAgICAgIFB5X0RFQ1JFRihzdHJpbmcpOwotCSAgICB9Ci0JfQorICAgICAgICBQeU9iamVjdCAqbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodHlwZSwgIl9fbmFtZV9fIik7CisgICAgICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKnN0cmluZyA9IFB5T2JqZWN0X1N0cihuYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJS40MDBzIGluIGVycm9yIGNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0cmluZykpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdHJpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCkBAIC00NjMsNyArNDYzLDcgQEAKICAgICBpZiAoUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayhleGMpKQogICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyhleGMpLCBleGMpOwogICAgIGVsc2UKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgbXVzdCBwYXNzIGV4Y2VwdGlvbiBpbnN0YW5jZSIpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgbXVzdCBwYXNzIGV4Y2VwdGlvbiBpbnN0YW5jZSIpOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC00NzMsMjAgKzQ3MywyMCBAQAogewogICAgIFB5X3NzaXplX3QgZW5kOwogICAgIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKGV4YywgUHlFeGNfVW5pY29kZUVuY29kZUVycm9yKSkgewotCWlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBlbHNlIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKGV4YywgUHlFeGNfVW5pY29kZURlY29kZUVycm9yKSkgewotCWlmIChQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBlbHNlIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKGV4YywgUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yKSkgewotCWlmIChQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBlbHNlIHsKLQl3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOwotCXJldHVybiBOVUxMOworICAgICAgICB3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgLyogb3VjaDogcGFzc2luZyBOVUxMLCAwLCBwb3MgZ2l2ZXMgTm9uZSBpbnN0ZWFkIG9mIHUnJyAqLwogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIodSNuKSIsICZlbmQsIDAsIGVuZCk7CkBAIC01MDEsMTU1ICs1MDEsMTU1IEBACiAgICAgUHlfc3NpemVfdCBpOwogCiAgICAgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UoZXhjLCBQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IpKSB7Ci0JUHlPYmplY3QgKnJlczsKLQlQeV9VTklDT0RFICpwOwotCWlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydChleGMsICZzdGFydCkpCi0JICAgIHJldHVybiBOVUxMOwotCWlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JcmVzID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGVuZC1zdGFydCk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQlmb3IgKHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXMpLCBpID0gc3RhcnQ7Ci0JICAgIGk8ZW5kOyArK3AsICsraSkKLQkgICAgKnAgPSAnPyc7Ci0JcmVzdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoT24pIiwgcmVzLCBlbmQpOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiByZXN0dXBsZTsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgUHlfVU5JQ09ERSAqcDsKKyAgICAgICAgaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kKGV4YywgJmVuZCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGVuZC1zdGFydCk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3IgKHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXMpLCBpID0gc3RhcnQ7CisgICAgICAgICAgICBpPGVuZDsgKytwLCArK2kpCisgICAgICAgICAgICAqcCA9ICc/JzsKKyAgICAgICAgcmVzdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoT24pIiwgcmVzLCBlbmQpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlc3R1cGxlOwogICAgIH0KICAgICBlbHNlIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKGV4YywgUHlFeGNfVW5pY29kZURlY29kZUVycm9yKSkgewotCVB5X1VOSUNPREUgcmVzID0gUHlfVU5JQ09ERV9SRVBMQUNFTUVOVF9DSEFSQUNURVI7Ci0JaWYgKFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHUjbikiLCAmcmVzLCAxLCBlbmQpOworICAgICAgICBQeV9VTklDT0RFIHJlcyA9IFB5X1VOSUNPREVfUkVQTEFDRU1FTlRfQ0hBUkFDVEVSOworICAgICAgICBpZiAoUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kKGV4YywgJmVuZCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIih1I24pIiwgJnJlcywgMSwgZW5kKTsKICAgICB9CiAgICAgZWxzZSBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZShleGMsIFB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvcikpIHsKLQlQeU9iamVjdCAqcmVzOwotCVB5X1VOSUNPREUgKnA7Ci0JaWYgKFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlyZXMgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgZW5kLXN0YXJ0KTsKLQlpZiAocmVzID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCWZvciAocCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlcyksIGkgPSBzdGFydDsKLQkgICAgaTxlbmQ7ICsrcCwgKytpKQotCSAgICAqcCA9IFB5X1VOSUNPREVfUkVQTEFDRU1FTlRfQ0hBUkFDVEVSOwotCXJlc3R1cGxlID0gUHlfQnVpbGRWYWx1ZSgiKE9uKSIsIHJlcywgZW5kKTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gcmVzdHVwbGU7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIFB5X1VOSUNPREUgKnA7CisgICAgICAgIGlmIChQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRTdGFydChleGMsICZzdGFydCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZChleGMsICZlbmQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlcyA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBlbmQtc3RhcnQpOworICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yIChwID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzKSwgaSA9IHN0YXJ0OworICAgICAgICAgICAgaTxlbmQ7ICsrcCwgKytpKQorICAgICAgICAgICAgKnAgPSBQeV9VTklDT0RFX1JFUExBQ0VNRU5UX0NIQVJBQ1RFUjsKKyAgICAgICAgcmVzdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoT24pIiwgcmVzLCBlbmQpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlc3R1cGxlOwogICAgIH0KICAgICBlbHNlIHsKLQl3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOwotCXJldHVybiBOVUxMOworICAgICAgICB3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAKIFB5T2JqZWN0ICpQeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzKFB5T2JqZWN0ICpleGMpCiB7CiAgICAgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UoZXhjLCBQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IpKSB7Ci0JUHlPYmplY3QgKnJlc3R1cGxlOwotCVB5T2JqZWN0ICpvYmplY3Q7Ci0JUHlfc3NpemVfdCBzdGFydDsKLQlQeV9zc2l6ZV90IGVuZDsKLQlQeU9iamVjdCAqcmVzOwotCVB5X1VOSUNPREUgKnA7Ci0JUHlfVU5JQ09ERSAqc3RhcnRwOwotCVB5X1VOSUNPREUgKm91dHA7Ci0JaW50IHJlc3NpemU7Ci0JaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlpZiAoIShvYmplY3QgPSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QoZXhjKSkpCi0JICAgIHJldHVybiBOVUxMOwotCXN0YXJ0cCA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iamVjdCk7Ci0JZm9yIChwID0gc3RhcnRwK3N0YXJ0LCByZXNzaXplID0gMDsgcCA8IHN0YXJ0cCtlbmQ7ICsrcCkgewotCSAgICBpZiAoKnA8MTApCi0JCXJlc3NpemUgKz0gMisxKzE7Ci0JICAgIGVsc2UgaWYgKCpwPDEwMCkKLQkJcmVzc2l6ZSArPSAyKzIrMTsKLQkgICAgZWxzZSBpZiAoKnA8MTAwMCkKLQkJcmVzc2l6ZSArPSAyKzMrMTsKLQkgICAgZWxzZSBpZiAoKnA8MTAwMDApCi0JCXJlc3NpemUgKz0gMis0KzE7CisgICAgICAgIFB5T2JqZWN0ICpyZXN0dXBsZTsKKyAgICAgICAgUHlPYmplY3QgKm9iamVjdDsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydDsKKyAgICAgICAgUHlfc3NpemVfdCBlbmQ7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIFB5X1VOSUNPREUgKnA7CisgICAgICAgIFB5X1VOSUNPREUgKnN0YXJ0cDsKKyAgICAgICAgUHlfVU5JQ09ERSAqb3V0cDsKKyAgICAgICAgaW50IHJlc3NpemU7CisgICAgICAgIGlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydChleGMsICZzdGFydCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghKG9iamVjdCA9IFB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdChleGMpKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzdGFydHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmplY3QpOworICAgICAgICBmb3IgKHAgPSBzdGFydHArc3RhcnQsIHJlc3NpemUgPSAwOyBwIDwgc3RhcnRwK2VuZDsgKytwKSB7CisgICAgICAgICAgICBpZiAoKnA8MTApCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAyKzErMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMCkKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrMisxOworICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMCkKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrMysxOworICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMDApCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAyKzQrMTsKICNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCi0JICAgIGVsc2UKLQkJcmVzc2l6ZSArPSAyKzUrMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrNSsxOwogI2Vsc2UKLQkgICAgZWxzZSBpZiAoKnA8MTAwMDAwKQotCQlyZXNzaXplICs9IDIrNSsxOwotCSAgICBlbHNlIGlmICgqcDwxMDAwMDAwKQotCQlyZXNzaXplICs9IDIrNisxOwotCSAgICBlbHNlCi0JCXJlc3NpemUgKz0gMis3KzE7CisgICAgICAgICAgICBlbHNlIGlmICgqcDwxMDAwMDApCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAyKzUrMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwMDApCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAyKzYrMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrNysxOwogI2VuZGlmCi0JfQotCS8qIGFsbG9jYXRlIHJlcGxhY2VtZW50ICovCi0JcmVzID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIHJlc3NpemUpOwotCWlmIChyZXMgPT0gTlVMTCkgewotCSAgICBQeV9ERUNSRUYob2JqZWN0KTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCS8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICovCi0JZm9yIChwID0gc3RhcnRwK3N0YXJ0LCBvdXRwID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzKTsKLQkgICAgcCA8IHN0YXJ0cCtlbmQ7ICsrcCkgewotCSAgICBQeV9VTklDT0RFIGMgPSAqcDsKLQkgICAgaW50IGRpZ2l0czsKLQkgICAgaW50IGJhc2U7Ci0JICAgICpvdXRwKysgPSAnJic7Ci0JICAgICpvdXRwKysgPSAnIyc7Ci0JICAgIGlmICgqcDwxMCkgewotCQlkaWdpdHMgPSAxOwotCQliYXNlID0gMTsKLQkgICAgfQotCSAgICBlbHNlIGlmICgqcDwxMDApIHsKLQkJZGlnaXRzID0gMjsKLQkJYmFzZSA9IDEwOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCpwPDEwMDApIHsKLQkJZGlnaXRzID0gMzsKLQkJYmFzZSA9IDEwMDsKLQkgICAgfQotCSAgICBlbHNlIGlmICgqcDwxMDAwMCkgewotCQlkaWdpdHMgPSA0OwotCQliYXNlID0gMTAwMDsKLQkgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGFsbG9jYXRlIHJlcGxhY2VtZW50ICovCisgICAgICAgIHJlcyA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCByZXNzaXplKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYob2JqZWN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICovCisgICAgICAgIGZvciAocCA9IHN0YXJ0cCtzdGFydCwgb3V0cCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlcyk7CisgICAgICAgICAgICBwIDwgc3RhcnRwK2VuZDsgKytwKSB7CisgICAgICAgICAgICBQeV9VTklDT0RFIGMgPSAqcDsKKyAgICAgICAgICAgIGludCBkaWdpdHM7CisgICAgICAgICAgICBpbnQgYmFzZTsKKyAgICAgICAgICAgICpvdXRwKysgPSAnJic7CisgICAgICAgICAgICAqb3V0cCsrID0gJyMnOworICAgICAgICAgICAgaWYgKCpwPDEwKSB7CisgICAgICAgICAgICAgICAgZGlnaXRzID0gMTsKKyAgICAgICAgICAgICAgICBiYXNlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMCkgeworICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDI7CisgICAgICAgICAgICAgICAgYmFzZSA9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMCkgeworICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDM7CisgICAgICAgICAgICAgICAgYmFzZSA9IDEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwKSB7CisgICAgICAgICAgICAgICAgZGlnaXRzID0gNDsKKyAgICAgICAgICAgICAgICBiYXNlID0gMTAwMDsKKyAgICAgICAgICAgIH0KICNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCi0JICAgIGVsc2UgewotCQlkaWdpdHMgPSA1OwotCQliYXNlID0gMTAwMDA7Ci0JICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDU7CisgICAgICAgICAgICAgICAgYmFzZSA9IDEwMDAwOworICAgICAgICAgICAgfQogI2Vsc2UKLQkgICAgZWxzZSBpZiAoKnA8MTAwMDAwKSB7Ci0JCWRpZ2l0cyA9IDU7Ci0JCWJhc2UgPSAxMDAwMDsKLQkgICAgfQotCSAgICBlbHNlIGlmICgqcDwxMDAwMDAwKSB7Ci0JCWRpZ2l0cyA9IDY7Ci0JCWJhc2UgPSAxMDAwMDA7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWRpZ2l0cyA9IDc7Ci0JCWJhc2UgPSAxMDAwMDAwOwotCSAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgqcDwxMDAwMDApIHsKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSA1OworICAgICAgICAgICAgICAgIGJhc2UgPSAxMDAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwMDApIHsKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSA2OworICAgICAgICAgICAgICAgIGJhc2UgPSAxMDAwMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSA3OworICAgICAgICAgICAgICAgIGJhc2UgPSAxMDAwMDAwOworICAgICAgICAgICAgfQogI2VuZGlmCi0JICAgIHdoaWxlIChkaWdpdHMtLT4wKSB7Ci0JCSpvdXRwKysgPSAnMCcgKyBjL2Jhc2U7Ci0JCWMgJT0gYmFzZTsKLQkJYmFzZSAvPSAxMDsKLQkgICAgfQotCSAgICAqb3V0cCsrID0gJzsnOwotCX0KLQlyZXN0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPbikiLCByZXMsIGVuZCk7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JUHlfREVDUkVGKG9iamVjdCk7Ci0JcmV0dXJuIHJlc3R1cGxlOworICAgICAgICAgICAgd2hpbGUgKGRpZ2l0cy0tPjApIHsKKyAgICAgICAgICAgICAgICAqb3V0cCsrID0gJzAnICsgYy9iYXNlOworICAgICAgICAgICAgICAgIGMgJT0gYmFzZTsKKyAgICAgICAgICAgICAgICBiYXNlIC89IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dHArKyA9ICc7JzsKKyAgICAgICAgfQorICAgICAgICByZXN0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPbikiLCByZXMsIGVuZCk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICBQeV9ERUNSRUYob2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIHJlc3R1cGxlOwogICAgIH0KICAgICBlbHNlIHsKLQl3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOwotCXJldHVybiBOVUxMOworICAgICAgICB3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAKQEAgLTY2MSw3MiArNjYxLDcyIEBACiBQeU9iamVjdCAqUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzKFB5T2JqZWN0ICpleGMpCiB7CiAgICAgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UoZXhjLCBQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IpKSB7Ci0JUHlPYmplY3QgKnJlc3R1cGxlOwotCVB5T2JqZWN0ICpvYmplY3Q7Ci0JUHlfc3NpemVfdCBzdGFydDsKLQlQeV9zc2l6ZV90IGVuZDsKLQlQeU9iamVjdCAqcmVzOwotCVB5X1VOSUNPREUgKnA7Ci0JUHlfVU5JQ09ERSAqc3RhcnRwOwotCVB5X1VOSUNPREUgKm91dHA7Ci0JaW50IHJlc3NpemU7Ci0JaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlpZiAoIShvYmplY3QgPSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QoZXhjKSkpCi0JICAgIHJldHVybiBOVUxMOwotCXN0YXJ0cCA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iamVjdCk7Ci0JZm9yIChwID0gc3RhcnRwK3N0YXJ0LCByZXNzaXplID0gMDsgcCA8IHN0YXJ0cCtlbmQ7ICsrcCkgeworICAgICAgICBQeU9iamVjdCAqcmVzdHVwbGU7CisgICAgICAgIFB5T2JqZWN0ICpvYmplY3Q7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQ7CisgICAgICAgIFB5X3NzaXplX3QgZW5kOworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBQeV9VTklDT0RFICpwOworICAgICAgICBQeV9VTklDT0RFICpzdGFydHA7CisgICAgICAgIFB5X1VOSUNPREUgKm91dHA7CisgICAgICAgIGludCByZXNzaXplOworICAgICAgICBpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQoZXhjLCAmc3RhcnQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIShvYmplY3QgPSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QoZXhjKSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc3RhcnRwID0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqZWN0KTsKKyAgICAgICAgZm9yIChwID0gc3RhcnRwK3N0YXJ0LCByZXNzaXplID0gMDsgcCA8IHN0YXJ0cCtlbmQ7ICsrcCkgewogI2lmZGVmIFB5X1VOSUNPREVfV0lERQotCSAgICBpZiAoKnAgPj0gMHgwMDAxMDAwMCkKLQkJcmVzc2l6ZSArPSAxKzErODsKLQkgICAgZWxzZQorICAgICAgICAgICAgaWYgKCpwID49IDB4MDAwMTAwMDApCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAxKzErODsKKyAgICAgICAgICAgIGVsc2UKICNlbmRpZgotCSAgICBpZiAoKnAgPj0gMHgxMDApIHsKLQkJcmVzc2l6ZSArPSAxKzErNDsKLQkgICAgfQotCSAgICBlbHNlCi0JCXJlc3NpemUgKz0gMSsxKzI7Ci0JfQotCXJlcyA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCByZXNzaXplKTsKLQlpZiAocmVzPT1OVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQlmb3IgKHAgPSBzdGFydHArc3RhcnQsIG91dHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXMpOwotCSAgICBwIDwgc3RhcnRwK2VuZDsgKytwKSB7Ci0JICAgIFB5X1VOSUNPREUgYyA9ICpwOwotCSAgICAqb3V0cCsrID0gJ1xcJzsKKyAgICAgICAgICAgIGlmICgqcCA+PSAweDEwMCkgeworICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gMSsxKzQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAxKzErMjsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgcmVzc2l6ZSk7CisgICAgICAgIGlmIChyZXM9PU5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yIChwID0gc3RhcnRwK3N0YXJ0LCBvdXRwID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzKTsKKyAgICAgICAgICAgIHAgPCBzdGFydHArZW5kOyArK3ApIHsKKyAgICAgICAgICAgIFB5X1VOSUNPREUgYyA9ICpwOworICAgICAgICAgICAgKm91dHArKyA9ICdcXCc7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCi0JICAgIGlmIChjID49IDB4MDAwMTAwMDApIHsKLQkJKm91dHArKyA9ICdVJzsKLQkJKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MjgpJjB4Zl07Ci0JCSpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjI0KSYweGZdOwotCQkqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj4yMCkmMHhmXTsKLQkJKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MTYpJjB4Zl07Ci0JCSpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjEyKSYweGZdOwotCQkqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj44KSYweGZdOwotCSAgICB9Ci0JICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChjID49IDB4MDAwMTAwMDApIHsKKyAgICAgICAgICAgICAgICAqb3V0cCsrID0gJ1UnOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjI4KSYweGZdOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjI0KSYweGZdOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjIwKSYweGZdOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjE2KSYweGZdOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjEyKSYweGZdOworICAgICAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjgpJjB4Zl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCiAjZW5kaWYKLQkgICAgaWYgKGMgPj0gMHgxMDApIHsKLQkJKm91dHArKyA9ICd1JzsKLQkJKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MTIpJjB4Zl07Ci0JCSpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjgpJjB4Zl07Ci0JICAgIH0KLQkgICAgZWxzZQotCQkqb3V0cCsrID0gJ3gnOwotCSAgICAqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj40KSYweGZdOwotCSAgICAqb3V0cCsrID0gaGV4ZGlnaXRzW2MmMHhmXTsKLQl9CisgICAgICAgICAgICBpZiAoYyA+PSAweDEwMCkgeworICAgICAgICAgICAgICAgICpvdXRwKysgPSAndSc7CisgICAgICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MTIpJjB4Zl07CisgICAgICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+OCkmMHhmXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqb3V0cCsrID0gJ3gnOworICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+NCkmMHhmXTsKKyAgICAgICAgICAgICpvdXRwKysgPSBoZXhkaWdpdHNbYyYweGZdOworICAgICAgICB9CiAKLQlyZXN0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPbikiLCByZXMsIGVuZCk7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JUHlfREVDUkVGKG9iamVjdCk7Ci0JcmV0dXJuIHJlc3R1cGxlOworICAgICAgICByZXN0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPbikiLCByZXMsIGVuZCk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICBQeV9ERUNSRUYob2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIHJlc3R1cGxlOwogICAgIH0KICAgICBlbHNlIHsKLQl3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOwotCXJldHVybiBOVUxMOworICAgICAgICB3cm9uZ19leGNlcHRpb25fdHlwZShleGMpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAjZW5kaWYKQEAgLTc2NSw2MyArNzY1LDYzIEBACiBzdGF0aWMgaW50IF9QeUNvZGVjUmVnaXN0cnlfSW5pdCh2b2lkKQogewogICAgIHN0YXRpYyBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JUHlNZXRob2REZWYgZGVmOworICAgICAgICBjaGFyICpuYW1lOworICAgICAgICBQeU1ldGhvZERlZiBkZWY7CiAgICAgfSBtZXRob2RzW10gPQogICAgIHsKLQl7Ci0JICAgICJzdHJpY3QiLAotCSAgICB7Ci0JCSJzdHJpY3RfZXJyb3JzIiwKLQkJc3RyaWN0X2Vycm9ycywKLQkJTUVUSF9PLAotCQlQeURvY19TVFIoIkltcGxlbWVudHMgdGhlICdzdHJpY3QnIGVycm9yIGhhbmRsaW5nLCB3aGljaCAiCi0JCQkgICJyYWlzZXMgYSBVbmljb2RlRXJyb3Igb24gY29kaW5nIGVycm9ycy4iKQotCSAgICB9Ci0JfSwKKyAgICAgICAgeworICAgICAgICAgICAgInN0cmljdCIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgInN0cmljdF9lcnJvcnMiLAorICAgICAgICAgICAgICAgIHN0cmljdF9lcnJvcnMsCisgICAgICAgICAgICAgICAgTUVUSF9PLAorICAgICAgICAgICAgICAgIFB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ3N0cmljdCcgZXJyb3IgaGFuZGxpbmcsIHdoaWNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJhaXNlcyBhIFVuaWNvZGVFcnJvciBvbiBjb2RpbmcgZXJyb3JzLiIpCisgICAgICAgICAgICB9CisgICAgICAgIH0sCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCXsKLQkgICAgImlnbm9yZSIsCi0JICAgIHsKLQkJImlnbm9yZV9lcnJvcnMiLAotCQlpZ25vcmVfZXJyb3JzLAotCQlNRVRIX08sCi0JCVB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ2lnbm9yZScgZXJyb3IgaGFuZGxpbmcsIHdoaWNoICIKLQkJCSAgImlnbm9yZXMgbWFsZm9ybWVkIGRhdGEgYW5kIGNvbnRpbnVlcy4iKQotCSAgICB9Ci0JfSwKLQl7Ci0JICAgICJyZXBsYWNlIiwKLQkgICAgewotCQkicmVwbGFjZV9lcnJvcnMiLAotCQlyZXBsYWNlX2Vycm9ycywKLQkJTUVUSF9PLAotCQlQeURvY19TVFIoIkltcGxlbWVudHMgdGhlICdyZXBsYWNlJyBlcnJvciBoYW5kbGluZywgd2hpY2ggIgotCQkJICAicmVwbGFjZXMgbWFsZm9ybWVkIGRhdGEgd2l0aCBhIHJlcGxhY2VtZW50IG1hcmtlci4iKQotCSAgICB9Ci0JfSwKLQl7Ci0JICAgICJ4bWxjaGFycmVmcmVwbGFjZSIsCi0JICAgIHsKLQkJInhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycyIsCi0JCXhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycywKLQkJTUVUSF9PLAotCQlQeURvY19TVFIoIkltcGxlbWVudHMgdGhlICd4bWxjaGFycmVmcmVwbGFjZScgZXJyb3IgaGFuZGxpbmcsICIKLQkJCSAgIndoaWNoIHJlcGxhY2VzIGFuIHVuZW5jb2RhYmxlIGNoYXJhY3RlciB3aXRoIHRoZSAiCi0JCQkgICJhcHByb3ByaWF0ZSBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZS4iKQotCSAgICB9Ci0JfSwKLQl7Ci0JICAgICJiYWNrc2xhc2hyZXBsYWNlIiwKLQkgICAgewotCQkiYmFja3NsYXNocmVwbGFjZV9lcnJvcnMiLAotCQliYWNrc2xhc2hyZXBsYWNlX2Vycm9ycywKLQkJTUVUSF9PLAotCQlQeURvY19TVFIoIkltcGxlbWVudHMgdGhlICdiYWNrc2xhc2hyZXBsYWNlJyBlcnJvciBoYW5kbGluZywgIgotCQkJICAid2hpY2ggcmVwbGFjZXMgYW4gdW5lbmNvZGFibGUgY2hhcmFjdGVyIHdpdGggYSAiCi0JCQkgICJiYWNrc2xhc2hlZCBlc2NhcGUgc2VxdWVuY2UuIikKLQkgICAgfQotCX0KKyAgICAgICAgeworICAgICAgICAgICAgImlnbm9yZSIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImlnbm9yZV9lcnJvcnMiLAorICAgICAgICAgICAgICAgIGlnbm9yZV9lcnJvcnMsCisgICAgICAgICAgICAgICAgTUVUSF9PLAorICAgICAgICAgICAgICAgIFB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ2lnbm9yZScgZXJyb3IgaGFuZGxpbmcsIHdoaWNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZXMgbWFsZm9ybWVkIGRhdGEgYW5kIGNvbnRpbnVlcy4iKQorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAicmVwbGFjZSIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgInJlcGxhY2VfZXJyb3JzIiwKKyAgICAgICAgICAgICAgICByZXBsYWNlX2Vycm9ycywKKyAgICAgICAgICAgICAgICBNRVRIX08sCisgICAgICAgICAgICAgICAgUHlEb2NfU1RSKCJJbXBsZW1lbnRzIHRoZSAncmVwbGFjZScgZXJyb3IgaGFuZGxpbmcsIHdoaWNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2VzIG1hbGZvcm1lZCBkYXRhIHdpdGggYSByZXBsYWNlbWVudCBtYXJrZXIuIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInhtbGNoYXJyZWZyZXBsYWNlIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAieG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzIiwKKyAgICAgICAgICAgICAgICB4bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgICAgICAgTUVUSF9PLAorICAgICAgICAgICAgICAgIFB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ3htbGNoYXJyZWZyZXBsYWNlJyBlcnJvciBoYW5kbGluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggcmVwbGFjZXMgYW4gdW5lbmNvZGFibGUgY2hhcmFjdGVyIHdpdGggdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcHJvcHJpYXRlIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlLiIpCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJiYWNrc2xhc2hyZXBsYWNlIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiYmFja3NsYXNocmVwbGFjZV9lcnJvcnMiLAorICAgICAgICAgICAgICAgIGJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICAgICAgIE1FVEhfTywKKyAgICAgICAgICAgICAgICBQeURvY19TVFIoIkltcGxlbWVudHMgdGhlICdiYWNrc2xhc2hyZXBsYWNlJyBlcnJvciBoYW5kbGluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggcmVwbGFjZXMgYW4gdW5lbmNvZGFibGUgY2hhcmFjdGVyIHdpdGggYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrc2xhc2hlZCBlc2NhcGUgc2VxdWVuY2UuIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAgICAgfTsKIApAQCAtODMwLDQyICs4MzAsNDIgQEAKICAgICB1bnNpZ25lZCBpOwogCiAgICAgaWYgKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGggIT0gTlVMTCkKLQlyZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDA7CiAKICAgICBpbnRlcnAtPmNvZGVjX3NlYXJjaF9wYXRoID0gUHlMaXN0X05ldygwKTsKICAgICBpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSA9IFB5RGljdF9OZXcoKTsKICAgICBpbnRlcnAtPmNvZGVjX2Vycm9yX3JlZ2lzdHJ5ID0gUHlEaWN0X05ldygpOwogCiAgICAgaWYgKGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkpIHsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG1ldGhvZHMpL3NpemVvZihtZXRob2RzWzBdKTsgKytpKSB7Ci0JICAgIFB5T2JqZWN0ICpmdW5jID0gUHlDRnVuY3Rpb25fTmV3KCZtZXRob2RzW2ldLmRlZiwgTlVMTCk7Ci0JICAgIGludCByZXM7Ci0JICAgIGlmICghZnVuYykKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBjb2RlYyBlcnJvciByZWdpc3RyeSIpOwotCSAgICByZXMgPSBQeUNvZGVjX1JlZ2lzdGVyRXJyb3IobWV0aG9kc1tpXS5uYW1lLCBmdW5jKTsKLQkgICAgUHlfREVDUkVGKGZ1bmMpOwotCSAgICBpZiAocmVzKQotCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIGNvZGVjIGVycm9yIHJlZ2lzdHJ5Iik7Ci0JfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG1ldGhvZHMpL3NpemVvZihtZXRob2RzWzBdKTsgKytpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldygmbWV0aG9kc1tpXS5kZWYsIE5VTEwpOworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIGlmICghZnVuYykKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIGNvZGVjIGVycm9yIHJlZ2lzdHJ5Iik7CisgICAgICAgICAgICByZXMgPSBQeUNvZGVjX1JlZ2lzdGVyRXJyb3IobWV0aG9kc1tpXS5uYW1lLCBmdW5jKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBjb2RlYyBlcnJvciByZWdpc3RyeSIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGggPT0gTlVMTCB8fAotCWludGVycC0+Y29kZWNfc2VhcmNoX2NhY2hlID09IE5VTEwgfHwKLQlpbnRlcnAtPmNvZGVjX2Vycm9yX3JlZ2lzdHJ5ID09IE5VTEwpCi0JUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBjb2RlYyByZWdpc3RyeSIpOworICAgICAgICBpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSA9PSBOVUxMIHx8CisgICAgICAgIGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBjb2RlYyByZWdpc3RyeSIpOwogCiAgICAgbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwoImVuY29kaW5ncyIsIE5VTEwsIE5VTEwsIE5VTEwsIDApOwogICAgIGlmIChtb2QgPT0gTlVMTCkgewotCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkgewotCSAgICAvKiBJZ25vcmUgSW1wb3J0RXJyb3JzLi4uIHRoaXMgaXMgZG9uZSBzbyB0aGF0Ci0JICAgICAgIGRpc3RyaWJ1dGlvbnMgY2FuIGRpc2FibGUgdGhlIGVuY29kaW5ncyBwYWNrYWdlLiBOb3RlCi0JICAgICAgIHRoYXQgb3RoZXIgZXJyb3JzIGFyZSBub3QgbWFza2VkLCBlLmcuIFN5c3RlbUVycm9ycwotCSAgICAgICByYWlzZWQgdG8gaW5mb3JtIHRoZSB1c2VyIG9mIGFuIGVycm9yIGluIHRoZSBQeXRob24KLQkgICAgICAgY29uZmlndXJhdGlvbiBhcmUgc3RpbGwgcmVwb3J0ZWQgYmFjayB0byB0aGUgdXNlci4gKi8KLQkgICAgUHlFcnJfQ2xlYXIoKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7CisgICAgICAgICAgICAvKiBJZ25vcmUgSW1wb3J0RXJyb3JzLi4uIHRoaXMgaXMgZG9uZSBzbyB0aGF0CisgICAgICAgICAgICAgICBkaXN0cmlidXRpb25zIGNhbiBkaXNhYmxlIHRoZSBlbmNvZGluZ3MgcGFja2FnZS4gTm90ZQorICAgICAgICAgICAgICAgdGhhdCBvdGhlciBlcnJvcnMgYXJlIG5vdCBtYXNrZWQsIGUuZy4gU3lzdGVtRXJyb3JzCisgICAgICAgICAgICAgICByYWlzZWQgdG8gaW5mb3JtIHRoZSB1c2VyIG9mIGFuIGVycm9yIGluIHRoZSBQeXRob24KKyAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gYXJlIHN0aWxsIHJlcG9ydGVkIGJhY2sgdG8gdGhlIHVzZXIuICovCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBQeV9ERUNSRUYobW9kKTsKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL1B5dGhvbi9jb21waWxlLmMgYi9QeXRob24vY29tcGlsZS5jCmluZGV4IDkwY2YwNjUuLmE4NTcxZDIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb21waWxlLmMKKysrIGIvUHl0aG9uL2NvbXBpbGUuYwpAQCAtNSwxMCArNSwxMCBAQAogICogUHlDb2RlT2JqZWN0LiAgVGhlIGNvbXBpbGVyIG1ha2VzIHNldmVyYWwgcGFzc2VzIHRvIGJ1aWxkIHRoZSBjb2RlCiAgKiBvYmplY3Q6CiAgKiAgIDEuIENoZWNrcyBmb3IgZnV0dXJlIHN0YXRlbWVudHMuICBTZWUgZnV0dXJlLmMKLSAqICAgMi4gQnVpbGRzIGEgc3ltYm9sIHRhYmxlLglTZWUgc3ltdGFibGUuYy4KKyAqICAgMi4gQnVpbGRzIGEgc3ltYm9sIHRhYmxlLiAgU2VlIHN5bXRhYmxlLmMuCiAgKiAgIDMuIEdlbmVyYXRlIGNvZGUgZm9yIGJhc2ljIGJsb2Nrcy4gIFNlZSBjb21waWxlcl9tb2QoKSBpbiB0aGlzIGZpbGUuCiAgKiAgIDQuIEFzc2VtYmxlIHRoZSBiYXNpYyBibG9ja3MgaW50byBmaW5hbCBjb2RlLiAgU2VlIGFzc2VtYmxlKCkgaW4KLSAqCXRoaXMgZmlsZS4JIAorICogICAgICB0aGlzIGZpbGUuCiAgKiAgIDUuIE9wdGltaXplIHRoZSBieXRlIGNvZGUgKHBlZXBob2xlIG9wdGltaXphdGlvbnMpLiAgU2VlIHBlZXBob2xlLmMKICAqCiAgKiBOb3RlIHRoYXQgY29tcGlsZXJfbW9kKCkgc3VnZ2VzdHMgbW9kdWxlLCBidXQgdGhlIG1vZHVsZSBhc3QgdHlwZQpAQCAtNDQsMzcgKzQ0LDM3IEBACiAjZGVmaW5lIENPTVBfRElDVENPTVAgMgogCiBzdHJ1Y3QgaW5zdHIgewotCXVuc2lnbmVkIGlfamFicyA6IDE7Ci0JdW5zaWduZWQgaV9qcmVsIDogMTsKLQl1bnNpZ25lZCBpX2hhc2FyZyA6IDE7Ci0JdW5zaWduZWQgY2hhciBpX29wY29kZTsKLQlpbnQgaV9vcGFyZzsKLQlzdHJ1Y3QgYmFzaWNibG9ja18gKmlfdGFyZ2V0OyAvKiB0YXJnZXQgYmxvY2sgKGlmIGp1bXAgaW5zdHJ1Y3Rpb24pICovCi0JaW50IGlfbGluZW5vOworICAgIHVuc2lnbmVkIGlfamFicyA6IDE7CisgICAgdW5zaWduZWQgaV9qcmVsIDogMTsKKyAgICB1bnNpZ25lZCBpX2hhc2FyZyA6IDE7CisgICAgdW5zaWduZWQgY2hhciBpX29wY29kZTsKKyAgICBpbnQgaV9vcGFyZzsKKyAgICBzdHJ1Y3QgYmFzaWNibG9ja18gKmlfdGFyZ2V0OyAvKiB0YXJnZXQgYmxvY2sgKGlmIGp1bXAgaW5zdHJ1Y3Rpb24pICovCisgICAgaW50IGlfbGluZW5vOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgYmFzaWNibG9ja18gewogICAgIC8qIEVhY2ggYmFzaWNibG9jayBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgaXMgbGlua2VkIHZpYSBiX2xpc3QgaW4gdGhlCiAgICAgICAgcmV2ZXJzZSBvcmRlciB0aGF0IHRoZSBibG9jayBhcmUgYWxsb2NhdGVkLiAgYl9saXN0IHBvaW50cyB0byB0aGUgbmV4dAogICAgICAgIGJsb2NrLCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBiX25leHQsIHdoaWNoIGlzIG5leHQgYnkgY29udHJvbCBmbG93LiAqLwotCXN0cnVjdCBiYXNpY2Jsb2NrXyAqYl9saXN0OwotCS8qIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdXNlZCAqLwotCWludCBiX2l1c2VkOwotCS8qIGxlbmd0aCBvZiBpbnN0cnVjdGlvbiBhcnJheSAoYl9pbnN0cikgKi8KLQlpbnQgYl9pYWxsb2M7Ci0JLyogcG9pbnRlciB0byBhbiBhcnJheSBvZiBpbnN0cnVjdGlvbnMsIGluaXRpYWxseSBOVUxMICovCi0Jc3RydWN0IGluc3RyICpiX2luc3RyOwotCS8qIElmIGJfbmV4dCBpcyBub24tTlVMTCwgaXQgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0Ci0JICAgYmxvY2sgcmVhY2hlZCBieSBub3JtYWwgY29udHJvbCBmbG93LiAqLwotCXN0cnVjdCBiYXNpY2Jsb2NrXyAqYl9uZXh0OwotCS8qIGJfc2VlbiBpcyB1c2VkIHRvIHBlcmZvcm0gYSBERlMgb2YgYmFzaWNibG9ja3MuICovCi0JdW5zaWduZWQgYl9zZWVuIDogMTsKLQkvKiBiX3JldHVybiBpcyB0cnVlIGlmIGEgUkVUVVJOX1ZBTFVFIG9wY29kZSBpcyBpbnNlcnRlZC4gKi8KLQl1bnNpZ25lZCBiX3JldHVybiA6IDE7Ci0JLyogZGVwdGggb2Ygc3RhY2sgdXBvbiBlbnRyeSBvZiBibG9jaywgY29tcHV0ZWQgYnkgc3RhY2tkZXB0aCgpICovCi0JaW50IGJfc3RhcnRkZXB0aDsKLQkvKiBpbnN0cnVjdGlvbiBvZmZzZXQgZm9yIGJsb2NrLCBjb21wdXRlZCBieSBhc3NlbWJsZV9qdW1wX29mZnNldHMoKSAqLwotCWludCBiX29mZnNldDsKKyAgICBzdHJ1Y3QgYmFzaWNibG9ja18gKmJfbGlzdDsKKyAgICAvKiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHVzZWQgKi8KKyAgICBpbnQgYl9pdXNlZDsKKyAgICAvKiBsZW5ndGggb2YgaW5zdHJ1Y3Rpb24gYXJyYXkgKGJfaW5zdHIpICovCisgICAgaW50IGJfaWFsbG9jOworICAgIC8qIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW5zdHJ1Y3Rpb25zLCBpbml0aWFsbHkgTlVMTCAqLworICAgIHN0cnVjdCBpbnN0ciAqYl9pbnN0cjsKKyAgICAvKiBJZiBiX25leHQgaXMgbm9uLU5VTEwsIGl0IGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dAorICAgICAgIGJsb2NrIHJlYWNoZWQgYnkgbm9ybWFsIGNvbnRyb2wgZmxvdy4gKi8KKyAgICBzdHJ1Y3QgYmFzaWNibG9ja18gKmJfbmV4dDsKKyAgICAvKiBiX3NlZW4gaXMgdXNlZCB0byBwZXJmb3JtIGEgREZTIG9mIGJhc2ljYmxvY2tzLiAqLworICAgIHVuc2lnbmVkIGJfc2VlbiA6IDE7CisgICAgLyogYl9yZXR1cm4gaXMgdHJ1ZSBpZiBhIFJFVFVSTl9WQUxVRSBvcGNvZGUgaXMgaW5zZXJ0ZWQuICovCisgICAgdW5zaWduZWQgYl9yZXR1cm4gOiAxOworICAgIC8qIGRlcHRoIG9mIHN0YWNrIHVwb24gZW50cnkgb2YgYmxvY2ssIGNvbXB1dGVkIGJ5IHN0YWNrZGVwdGgoKSAqLworICAgIGludCBiX3N0YXJ0ZGVwdGg7CisgICAgLyogaW5zdHJ1Y3Rpb24gb2Zmc2V0IGZvciBibG9jaywgY29tcHV0ZWQgYnkgYXNzZW1ibGVfanVtcF9vZmZzZXRzKCkgKi8KKyAgICBpbnQgYl9vZmZzZXQ7CiB9IGJhc2ljYmxvY2s7CiAKIC8qIGZibG9ja2luZm8gdHJhY2tzIHRoZSBjdXJyZW50IGZyYW1lIGJsb2NrLgpAQCAtODcsNjMgKzg3LDYzIEBACiBlbnVtIGZibG9ja3R5cGUgeyBMT09QLCBFWENFUFQsIEZJTkFMTFlfVFJZLCBGSU5BTExZX0VORCB9OwogCiBzdHJ1Y3QgZmJsb2NraW5mbyB7Ci0JZW51bSBmYmxvY2t0eXBlIGZiX3R5cGU7Ci0JYmFzaWNibG9jayAqZmJfYmxvY2s7CisgICAgZW51bSBmYmxvY2t0eXBlIGZiX3R5cGU7CisgICAgYmFzaWNibG9jayAqZmJfYmxvY2s7CiB9OwogCiAvKiBUaGUgZm9sbG93aW5nIGl0ZW1zIGNoYW5nZSBvbiBlbnRyeSBhbmQgZXhpdCBvZiBjb2RlIGJsb2Nrcy4KICAgIFRoZXkgbXVzdCBiZSBzYXZlZCBhbmQgcmVzdG9yZWQgd2hlbiByZXR1cm5pbmcgdG8gYSBibG9jay4KICovCiBzdHJ1Y3QgY29tcGlsZXJfdW5pdCB7Ci0JUHlTVEVudHJ5T2JqZWN0ICp1X3N0ZTsKKyAgICBQeVNURW50cnlPYmplY3QgKnVfc3RlOwogCi0JUHlPYmplY3QgKnVfbmFtZTsKLQkvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgZGljdHMgdGhhdCBtYXAgb2JqZWN0cyB0bwotCSAgIHRoZSBpbmRleCBvZiB0aGVtIGluIGNvX1hYWC4JIFRoZSBpbmRleCBpcyB1c2VkIGFzCi0JICAgdGhlIGFyZ3VtZW50IGZvciBvcGNvZGVzIHRoYXQgcmVmZXIgdG8gdGhvc2UgY29sbGVjdGlvbnMuCi0JKi8KLQlQeU9iamVjdCAqdV9jb25zdHM7ICAgIC8qIGFsbCBjb25zdGFudHMgKi8KLQlQeU9iamVjdCAqdV9uYW1lczsgICAgIC8qIGFsbCBuYW1lcyAqLwotCVB5T2JqZWN0ICp1X3Zhcm5hbWVzOyAgLyogbG9jYWwgdmFyaWFibGVzICovCi0JUHlPYmplY3QgKnVfY2VsbHZhcnM7ICAvKiBjZWxsIHZhcmlhYmxlcyAqLwotCVB5T2JqZWN0ICp1X2ZyZWV2YXJzOyAgLyogZnJlZSB2YXJpYWJsZXMgKi8KKyAgICBQeU9iamVjdCAqdV9uYW1lOworICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBkaWN0cyB0aGF0IG1hcCBvYmplY3RzIHRvCisgICAgICAgdGhlIGluZGV4IG9mIHRoZW0gaW4gY29fWFhYLiAgICAgIFRoZSBpbmRleCBpcyB1c2VkIGFzCisgICAgICAgdGhlIGFyZ3VtZW50IGZvciBvcGNvZGVzIHRoYXQgcmVmZXIgdG8gdGhvc2UgY29sbGVjdGlvbnMuCisgICAgKi8KKyAgICBQeU9iamVjdCAqdV9jb25zdHM7ICAgIC8qIGFsbCBjb25zdGFudHMgKi8KKyAgICBQeU9iamVjdCAqdV9uYW1lczsgICAgIC8qIGFsbCBuYW1lcyAqLworICAgIFB5T2JqZWN0ICp1X3Zhcm5hbWVzOyAgLyogbG9jYWwgdmFyaWFibGVzICovCisgICAgUHlPYmplY3QgKnVfY2VsbHZhcnM7ICAvKiBjZWxsIHZhcmlhYmxlcyAqLworICAgIFB5T2JqZWN0ICp1X2ZyZWV2YXJzOyAgLyogZnJlZSB2YXJpYWJsZXMgKi8KIAotCVB5T2JqZWN0ICp1X3ByaXZhdGU7CS8qIGZvciBwcml2YXRlIG5hbWUgbWFuZ2xpbmcgKi8KKyAgICBQeU9iamVjdCAqdV9wcml2YXRlOyAgICAgICAgLyogZm9yIHByaXZhdGUgbmFtZSBtYW5nbGluZyAqLwogCi0JaW50IHVfYXJnY291bnQ7CSAgIC8qIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGJsb2NrICovIAotCS8qIFBvaW50ZXIgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2NrLiAgQnkgZm9sbG93aW5nIGJfbGlzdAotCSAgIG1lbWJlcnMsIHlvdSBjYW4gcmVhY2ggYWxsIGVhcmx5IGFsbG9jYXRlZCBibG9ja3MuICovCi0JYmFzaWNibG9jayAqdV9ibG9ja3M7Ci0JYmFzaWNibG9jayAqdV9jdXJibG9jazsgLyogcG9pbnRlciB0byBjdXJyZW50IGJsb2NrICovCisgICAgaW50IHVfYXJnY291bnQ7ICAgICAgICAvKiBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBibG9jayAqLworICAgIC8qIFBvaW50ZXIgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2NrLiAgQnkgZm9sbG93aW5nIGJfbGlzdAorICAgICAgIG1lbWJlcnMsIHlvdSBjYW4gcmVhY2ggYWxsIGVhcmx5IGFsbG9jYXRlZCBibG9ja3MuICovCisgICAgYmFzaWNibG9jayAqdV9ibG9ja3M7CisgICAgYmFzaWNibG9jayAqdV9jdXJibG9jazsgLyogcG9pbnRlciB0byBjdXJyZW50IGJsb2NrICovCiAKLQlpbnQgdV9uZmJsb2NrczsKLQlzdHJ1Y3QgZmJsb2NraW5mbyB1X2ZibG9ja1tDT19NQVhCTE9DS1NdOworICAgIGludCB1X25mYmxvY2tzOworICAgIHN0cnVjdCBmYmxvY2tpbmZvIHVfZmJsb2NrW0NPX01BWEJMT0NLU107CiAKLQlpbnQgdV9maXJzdGxpbmVubzsgLyogdGhlIGZpcnN0IGxpbmVubyBvZiB0aGUgYmxvY2sgKi8KLQlpbnQgdV9saW5lbm87CSAgIC8qIHRoZSBsaW5lbm8gZm9yIHRoZSBjdXJyZW50IHN0bXQgKi8KLQlib29sIHVfbGluZW5vX3NldDsgLyogYm9vbGVhbiB0byBpbmRpY2F0ZSB3aGV0aGVyIGluc3RyCi0JCQkgICAgICBoYXMgYmVlbiBnZW5lcmF0ZWQgd2l0aCBjdXJyZW50IGxpbmVubyAqLworICAgIGludCB1X2ZpcnN0bGluZW5vOyAvKiB0aGUgZmlyc3QgbGluZW5vIG9mIHRoZSBibG9jayAqLworICAgIGludCB1X2xpbmVubzsgICAgICAgICAgLyogdGhlIGxpbmVubyBmb3IgdGhlIGN1cnJlbnQgc3RtdCAqLworICAgIGJvb2wgdV9saW5lbm9fc2V0OyAvKiBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgaW5zdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gZ2VuZXJhdGVkIHdpdGggY3VycmVudCBsaW5lbm8gKi8KIH07CiAKLS8qIFRoaXMgc3RydWN0IGNhcHR1cmVzIHRoZSBnbG9iYWwgc3RhdGUgb2YgYSBjb21waWxhdGlvbi4gIAorLyogVGhpcyBzdHJ1Y3QgY2FwdHVyZXMgdGhlIGdsb2JhbCBzdGF0ZSBvZiBhIGNvbXBpbGF0aW9uLgogCiBUaGUgdSBwb2ludGVyIHBvaW50cyB0byB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LCB3aGlsZSB1bml0cwotZm9yIGVuY2xvc2luZyBibG9ja3MgYXJlIHN0b3JlZCBpbiBjX3N0YWNrLglUaGUgdSBhbmQgY19zdGFjayBhcmUKK2ZvciBlbmNsb3NpbmcgYmxvY2tzIGFyZSBzdG9yZWQgaW4gY19zdGFjay4gICAgIFRoZSB1IGFuZCBjX3N0YWNrIGFyZQogbWFuYWdlZCBieSBjb21waWxlcl9lbnRlcl9zY29wZSgpIGFuZCBjb21waWxlcl9leGl0X3Njb3BlKCkuCiAqLwogCiBzdHJ1Y3QgY29tcGlsZXIgewotCWNvbnN0IGNoYXIgKmNfZmlsZW5hbWU7Ci0Jc3RydWN0IHN5bXRhYmxlICpjX3N0OwotCVB5RnV0dXJlRmVhdHVyZXMgKmNfZnV0dXJlOyAvKiBwb2ludGVyIHRvIG1vZHVsZSdzIF9fZnV0dXJlX18gKi8KLQlQeUNvbXBpbGVyRmxhZ3MgKmNfZmxhZ3M7CisgICAgY29uc3QgY2hhciAqY19maWxlbmFtZTsKKyAgICBzdHJ1Y3Qgc3ltdGFibGUgKmNfc3Q7CisgICAgUHlGdXR1cmVGZWF0dXJlcyAqY19mdXR1cmU7IC8qIHBvaW50ZXIgdG8gbW9kdWxlJ3MgX19mdXR1cmVfXyAqLworICAgIFB5Q29tcGlsZXJGbGFncyAqY19mbGFnczsKIAotCWludCBjX2ludGVyYWN0aXZlOwkgLyogdHJ1ZSBpZiBpbiBpbnRlcmFjdGl2ZSBtb2RlICovCi0JaW50IGNfbmVzdGxldmVsOworICAgIGludCBjX2ludGVyYWN0aXZlOyAgICAgICAgICAgLyogdHJ1ZSBpZiBpbiBpbnRlcmFjdGl2ZSBtb2RlICovCisgICAgaW50IGNfbmVzdGxldmVsOwogCi0Jc3RydWN0IGNvbXBpbGVyX3VuaXQgKnU7IC8qIGNvbXBpbGVyIHN0YXRlIGZvciBjdXJyZW50IGJsb2NrICovCi0JUHlPYmplY3QgKmNfc3RhY2s7CSAvKiBQeXRob24gbGlzdCBob2xkaW5nIGNvbXBpbGVyX3VuaXQgcHRycyAqLwotCVB5QXJlbmEgKmNfYXJlbmE7CSAvKiBwb2ludGVyIHRvIG1lbW9yeSBhbGxvY2F0aW9uIGFyZW5hICovCisgICAgc3RydWN0IGNvbXBpbGVyX3VuaXQgKnU7IC8qIGNvbXBpbGVyIHN0YXRlIGZvciBjdXJyZW50IGJsb2NrICovCisgICAgUHlPYmplY3QgKmNfc3RhY2s7ICAgICAgICAgICAvKiBQeXRob24gbGlzdCBob2xkaW5nIGNvbXBpbGVyX3VuaXQgcHRycyAqLworICAgIFB5QXJlbmEgKmNfYXJlbmE7ICAgICAgICAgICAgLyogcG9pbnRlciB0byBtZW1vcnkgYWxsb2NhdGlvbiBhcmVuYSAqLwogfTsKIAogc3RhdGljIGludCBjb21waWxlcl9lbnRlcl9zY29wZShzdHJ1Y3QgY29tcGlsZXIgKiwgaWRlbnRpZmllciwgdm9pZCAqLCBpbnQpOwpAQCAtMTY0LDEyICsxNjQsMTIgQEAKIHN0YXRpYyBpbnQgY29tcGlsZXJfdmlzaXRfZXhwcihzdHJ1Y3QgY29tcGlsZXIgKiwgZXhwcl90eSk7CiBzdGF0aWMgaW50IGNvbXBpbGVyX2F1Z2Fzc2lnbihzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSk7CiBzdGF0aWMgaW50IGNvbXBpbGVyX3Zpc2l0X3NsaWNlKHN0cnVjdCBjb21waWxlciAqLCBzbGljZV90eSwKLQkJCQlleHByX2NvbnRleHRfdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByX2NvbnRleHRfdHkpOwogCiBzdGF0aWMgaW50IGNvbXBpbGVyX3B1c2hfZmJsb2NrKHN0cnVjdCBjb21waWxlciAqLCBlbnVtIGZibG9ja3R5cGUsCi0JCQkJYmFzaWNibG9jayAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNibG9jayAqKTsKIHN0YXRpYyB2b2lkIGNvbXBpbGVyX3BvcF9mYmxvY2soc3RydWN0IGNvbXBpbGVyICosIGVudW0gZmJsb2NrdHlwZSwKLQkJCQliYXNpY2Jsb2NrICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY2Jsb2NrICopOwogLyogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgbG9vcCBvbiB0aGUgZmJsb2NrIHN0YWNrLiAqLwogc3RhdGljIGludCBjb21waWxlcl9pbl9sb29wKHN0cnVjdCBjb21waWxlciAqKTsKIApAQCAtMTg2LDE3MiArMTg2LDE3MiBAQAogUHlPYmplY3QgKgogX1B5X01hbmdsZShQeU9iamVjdCAqcHJpdmF0ZW9iaiwgUHlPYmplY3QgKmlkZW50KQogewotCS8qIE5hbWUgbWFuZ2xpbmc6IF9fcHJpdmF0ZSBiZWNvbWVzIF9jbGFzc25hbWVfX3ByaXZhdGUuCi0JICAgVGhpcyBpcyBpbmRlcGVuZGVudCBmcm9tIGhvdyB0aGUgbmFtZSBpcyB1c2VkLiAqLwotCWNvbnN0IGNoYXIgKnAsICpuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoaWRlbnQpOwotCWNoYXIgKmJ1ZmZlcjsKLQlzaXplX3QgbmxlbiwgcGxlbjsKLQlpZiAocHJpdmF0ZW9iaiA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhwcml2YXRlb2JqKSB8fAotCSAgICBuYW1lID09IE5VTEwgfHwgbmFtZVswXSAhPSAnXycgfHwgbmFtZVsxXSAhPSAnXycpIHsKLQkJUHlfSU5DUkVGKGlkZW50KTsKLQkJcmV0dXJuIGlkZW50OwotCX0KLQlwID0gUHlTdHJpbmdfQXNTdHJpbmcocHJpdmF0ZW9iaik7Ci0JbmxlbiA9IHN0cmxlbihuYW1lKTsKLQkvKiBEb24ndCBtYW5nbGUgX19pZF9fIG9yIG5hbWVzIHdpdGggZG90cy4KKyAgICAvKiBOYW1lIG1hbmdsaW5nOiBfX3ByaXZhdGUgYmVjb21lcyBfY2xhc3NuYW1lX19wcml2YXRlLgorICAgICAgIFRoaXMgaXMgaW5kZXBlbmRlbnQgZnJvbSBob3cgdGhlIG5hbWUgaXMgdXNlZC4gKi8KKyAgICBjb25zdCBjaGFyICpwLCAqbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGlkZW50KTsKKyAgICBjaGFyICpidWZmZXI7CisgICAgc2l6ZV90IG5sZW4sIHBsZW47CisgICAgaWYgKHByaXZhdGVvYmogPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2socHJpdmF0ZW9iaikgfHwKKyAgICAgICAgbmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gIT0gJ18nIHx8IG5hbWVbMV0gIT0gJ18nKSB7CisgICAgICAgIFB5X0lOQ1JFRihpZGVudCk7CisgICAgICAgIHJldHVybiBpZGVudDsKKyAgICB9CisgICAgcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHByaXZhdGVvYmopOworICAgIG5sZW4gPSBzdHJsZW4obmFtZSk7CisgICAgLyogRG9uJ3QgbWFuZ2xlIF9faWRfXyBvciBuYW1lcyB3aXRoIGRvdHMuCiAKLQkgICBUaGUgb25seSB0aW1lIGEgbmFtZSB3aXRoIGEgZG90IGNhbiBvY2N1ciBpcyB3aGVuCi0JICAgd2UgYXJlIGNvbXBpbGluZyBhbiBpbXBvcnQgc3RhdGVtZW50IHRoYXQgaGFzIGEgCi0JICAgcGFja2FnZSBuYW1lLgorICAgICAgIFRoZSBvbmx5IHRpbWUgYSBuYW1lIHdpdGggYSBkb3QgY2FuIG9jY3VyIGlzIHdoZW4KKyAgICAgICB3ZSBhcmUgY29tcGlsaW5nIGFuIGltcG9ydCBzdGF0ZW1lbnQgdGhhdCBoYXMgYQorICAgICAgIHBhY2thZ2UgbmFtZS4KIAotCSAgIFRPRE8oamh5bHRvbik6IERlY2lkZSB3aGV0aGVyIHdlIHdhbnQgdG8gc3VwcG9ydAotCSAgIG1hbmdsaW5nIG9mIHRoZSBtb2R1bGUgbmFtZSwgZS5nLiBfX00uWC4KLQkqLwotCWlmICgobmFtZVtubGVuLTFdID09ICdfJyAmJiBuYW1lW25sZW4tMl0gPT0gJ18nKSAKLQkgICAgfHwgc3RyY2hyKG5hbWUsICcuJykpIHsKLQkJUHlfSU5DUkVGKGlkZW50KTsKLQkJcmV0dXJuIGlkZW50OyAvKiBEb24ndCBtYW5nbGUgX193aGF0ZXZlcl9fICovCi0JfQotCS8qIFN0cmlwIGxlYWRpbmcgdW5kZXJzY29yZXMgZnJvbSBjbGFzcyBuYW1lICovCi0Jd2hpbGUgKCpwID09ICdfJykKLQkJcCsrOwotCWlmICgqcCA9PSAnXDAnKSB7Ci0JCVB5X0lOQ1JFRihpZGVudCk7Ci0JCXJldHVybiBpZGVudDsgLyogRG9uJ3QgbWFuZ2xlIGlmIGNsYXNzIGlzIGp1c3QgdW5kZXJzY29yZXMgKi8KLQl9Ci0JcGxlbiA9IHN0cmxlbihwKTsKKyAgICAgICBUT0RPKGpoeWx0b24pOiBEZWNpZGUgd2hldGhlciB3ZSB3YW50IHRvIHN1cHBvcnQKKyAgICAgICBtYW5nbGluZyBvZiB0aGUgbW9kdWxlIG5hbWUsIGUuZy4gX19NLlguCisgICAgKi8KKyAgICBpZiAoKG5hbWVbbmxlbi0xXSA9PSAnXycgJiYgbmFtZVtubGVuLTJdID09ICdfJykKKyAgICAgICAgfHwgc3RyY2hyKG5hbWUsICcuJykpIHsKKyAgICAgICAgUHlfSU5DUkVGKGlkZW50KTsKKyAgICAgICAgcmV0dXJuIGlkZW50OyAvKiBEb24ndCBtYW5nbGUgX193aGF0ZXZlcl9fICovCisgICAgfQorICAgIC8qIFN0cmlwIGxlYWRpbmcgdW5kZXJzY29yZXMgZnJvbSBjbGFzcyBuYW1lICovCisgICAgd2hpbGUgKCpwID09ICdfJykKKyAgICAgICAgcCsrOworICAgIGlmICgqcCA9PSAnXDAnKSB7CisgICAgICAgIFB5X0lOQ1JFRihpZGVudCk7CisgICAgICAgIHJldHVybiBpZGVudDsgLyogRG9uJ3QgbWFuZ2xlIGlmIGNsYXNzIGlzIGp1c3QgdW5kZXJzY29yZXMgKi8KKyAgICB9CisgICAgcGxlbiA9IHN0cmxlbihwKTsKIAotCWFzc2VydCgxIDw9IFBZX1NTSVpFX1RfTUFYIC0gbmxlbik7Ci0JYXNzZXJ0KDEgKyBubGVuIDw9IFBZX1NTSVpFX1RfTUFYIC0gcGxlbik7CisgICAgYXNzZXJ0KDEgPD0gUFlfU1NJWkVfVF9NQVggLSBubGVuKTsKKyAgICBhc3NlcnQoMSArIG5sZW4gPD0gUFlfU1NJWkVfVF9NQVggLSBwbGVuKTsKIAotCWlkZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMSArIG5sZW4gKyBwbGVuKTsKLQlpZiAoIWlkZW50KQotCQlyZXR1cm4gMDsKLQkvKiBpZGVudCA9ICJfIiArIHBbOnBsZW5dICsgbmFtZSAjIGkuZS4gMStwbGVuK25sZW4gYnl0ZXMgKi8KLQlidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoaWRlbnQpOwotCWJ1ZmZlclswXSA9ICdfJzsKLQlzdHJuY3B5KGJ1ZmZlcisxLCBwLCBwbGVuKTsKLQlzdHJjcHkoYnVmZmVyKzErcGxlbiwgbmFtZSk7Ci0JcmV0dXJuIGlkZW50OworICAgIGlkZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMSArIG5sZW4gKyBwbGVuKTsKKyAgICBpZiAoIWlkZW50KQorICAgICAgICByZXR1cm4gMDsKKyAgICAvKiBpZGVudCA9ICJfIiArIHBbOnBsZW5dICsgbmFtZSAjIGkuZS4gMStwbGVuK25sZW4gYnl0ZXMgKi8KKyAgICBidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoaWRlbnQpOworICAgIGJ1ZmZlclswXSA9ICdfJzsKKyAgICBzdHJuY3B5KGJ1ZmZlcisxLCBwLCBwbGVuKTsKKyAgICBzdHJjcHkoYnVmZmVyKzErcGxlbiwgbmFtZSk7CisgICAgcmV0dXJuIGlkZW50OwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9pbml0KHN0cnVjdCBjb21waWxlciAqYykKIHsKLQltZW1zZXQoYywgMCwgc2l6ZW9mKHN0cnVjdCBjb21waWxlcikpOworICAgIG1lbXNldChjLCAwLCBzaXplb2Yoc3RydWN0IGNvbXBpbGVyKSk7CiAKLQljLT5jX3N0YWNrID0gUHlMaXN0X05ldygwKTsKLQlpZiAoIWMtPmNfc3RhY2spCi0JCXJldHVybiAwOworICAgIGMtPmNfc3RhY2sgPSBQeUxpc3RfTmV3KDApOworICAgIGlmICghYy0+Y19zdGFjaykKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogUHlDb2RlT2JqZWN0ICoKIFB5QVNUX0NvbXBpbGUobW9kX3R5IG1vZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsCi0JICAgICAgUHlBcmVuYSAqYXJlbmEpCisgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKQogewotCXN0cnVjdCBjb21waWxlciBjOwotCVB5Q29kZU9iamVjdCAqY28gPSBOVUxMOwotCVB5Q29tcGlsZXJGbGFncyBsb2NhbF9mbGFnczsKLQlpbnQgbWVyZ2VkOworICAgIHN0cnVjdCBjb21waWxlciBjOworICAgIFB5Q29kZU9iamVjdCAqY28gPSBOVUxMOworICAgIFB5Q29tcGlsZXJGbGFncyBsb2NhbF9mbGFnczsKKyAgICBpbnQgbWVyZ2VkOwogCi0JaWYgKCFfX2RvY19fKSB7Ci0JCV9fZG9jX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RvY19fIik7Ci0JCWlmICghX19kb2NfXykKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIV9fZG9jX18pIHsKKyAgICAgICAgX19kb2NfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZG9jX18iKTsKKyAgICAgICAgaWYgKCFfX2RvY19fKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCFjb21waWxlcl9pbml0KCZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYy5jX2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JYy5jX2FyZW5hID0gYXJlbmE7Ci0JYy5jX2Z1dHVyZSA9IFB5RnV0dXJlX0Zyb21BU1QobW9kLCBmaWxlbmFtZSk7Ci0JaWYgKGMuY19mdXR1cmUgPT0gTlVMTCkKLQkJZ290byBmaW5hbGx5OwotCWlmICghZmxhZ3MpIHsKLQkJbG9jYWxfZmxhZ3MuY2ZfZmxhZ3MgPSAwOwotCQlmbGFncyA9ICZsb2NhbF9mbGFnczsKLQl9Ci0JbWVyZ2VkID0gYy5jX2Z1dHVyZS0+ZmZfZmVhdHVyZXMgfCBmbGFncy0+Y2ZfZmxhZ3M7Ci0JYy5jX2Z1dHVyZS0+ZmZfZmVhdHVyZXMgPSBtZXJnZWQ7Ci0JZmxhZ3MtPmNmX2ZsYWdzID0gbWVyZ2VkOwotCWMuY19mbGFncyA9IGZsYWdzOwotCWMuY19uZXN0bGV2ZWwgPSAwOworICAgIGlmICghY29tcGlsZXJfaW5pdCgmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGMuY19maWxlbmFtZSA9IGZpbGVuYW1lOworICAgIGMuY19hcmVuYSA9IGFyZW5hOworICAgIGMuY19mdXR1cmUgPSBQeUZ1dHVyZV9Gcm9tQVNUKG1vZCwgZmlsZW5hbWUpOworICAgIGlmIChjLmNfZnV0dXJlID09IE5VTEwpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBpZiAoIWZsYWdzKSB7CisgICAgICAgIGxvY2FsX2ZsYWdzLmNmX2ZsYWdzID0gMDsKKyAgICAgICAgZmxhZ3MgPSAmbG9jYWxfZmxhZ3M7CisgICAgfQorICAgIG1lcmdlZCA9IGMuY19mdXR1cmUtPmZmX2ZlYXR1cmVzIHwgZmxhZ3MtPmNmX2ZsYWdzOworICAgIGMuY19mdXR1cmUtPmZmX2ZlYXR1cmVzID0gbWVyZ2VkOworICAgIGZsYWdzLT5jZl9mbGFncyA9IG1lcmdlZDsKKyAgICBjLmNfZmxhZ3MgPSBmbGFnczsKKyAgICBjLmNfbmVzdGxldmVsID0gMDsKIAotCWMuY19zdCA9IFB5U3ltdGFibGVfQnVpbGQobW9kLCBmaWxlbmFtZSwgYy5jX2Z1dHVyZSk7Ci0JaWYgKGMuY19zdCA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIm5vIHN5bXRhYmxlIik7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgYy5jX3N0ID0gUHlTeW10YWJsZV9CdWlsZChtb2QsIGZpbGVuYW1lLCBjLmNfZnV0dXJlKTsKKyAgICBpZiAoYy5jX3N0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAibm8gc3ltdGFibGUiKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWNvID0gY29tcGlsZXJfbW9kKCZjLCBtb2QpOworICAgIGNvID0gY29tcGlsZXJfbW9kKCZjLCBtb2QpOwogCiAgZmluYWxseToKLQljb21waWxlcl9mcmVlKCZjKTsKLQlhc3NlcnQoY28gfHwgUHlFcnJfT2NjdXJyZWQoKSk7Ci0JcmV0dXJuIGNvOworICAgIGNvbXBpbGVyX2ZyZWUoJmMpOworICAgIGFzc2VydChjbyB8fCBQeUVycl9PY2N1cnJlZCgpKTsKKyAgICByZXR1cm4gY287CiB9CiAKIFB5Q29kZU9iamVjdCAqCiBQeU5vZGVfQ29tcGlsZShzdHJ1Y3QgX25vZGUgKm4sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewotCVB5Q29kZU9iamVjdCAqY28gPSBOVUxMOwotCW1vZF90eSBtb2Q7Ci0JUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCWlmICghYXJlbmEpCi0JCXJldHVybiBOVUxMOwotCW1vZCA9IFB5QVNUX0Zyb21Ob2RlKG4sIE5VTEwsIGZpbGVuYW1lLCBhcmVuYSk7Ci0JaWYgKG1vZCkKLQkJY28gPSBQeUFTVF9Db21waWxlKG1vZCwgZmlsZW5hbWUsIE5VTEwsIGFyZW5hKTsKLQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwotCXJldHVybiBjbzsKKyAgICBQeUNvZGVPYmplY3QgKmNvID0gTlVMTDsKKyAgICBtb2RfdHkgbW9kOworICAgIFB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKKyAgICBpZiAoIWFyZW5hKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtb2QgPSBQeUFTVF9Gcm9tTm9kZShuLCBOVUxMLCBmaWxlbmFtZSwgYXJlbmEpOworICAgIGlmIChtb2QpCisgICAgICAgIGNvID0gUHlBU1RfQ29tcGlsZShtb2QsIGZpbGVuYW1lLCBOVUxMLCBhcmVuYSk7CisgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICByZXR1cm4gY287CiB9CiAKIHN0YXRpYyB2b2lkCiBjb21waWxlcl9mcmVlKHN0cnVjdCBjb21waWxlciAqYykKIHsKLQlpZiAoYy0+Y19zdCkKLQkJUHlTeW10YWJsZV9GcmVlKGMtPmNfc3QpOwotCWlmIChjLT5jX2Z1dHVyZSkKLQkJUHlPYmplY3RfRnJlZShjLT5jX2Z1dHVyZSk7Ci0JUHlfREVDUkVGKGMtPmNfc3RhY2spOworICAgIGlmIChjLT5jX3N0KQorICAgICAgICBQeVN5bXRhYmxlX0ZyZWUoYy0+Y19zdCk7CisgICAgaWYgKGMtPmNfZnV0dXJlKQorICAgICAgICBQeU9iamVjdF9GcmVlKGMtPmNfZnV0dXJlKTsKKyAgICBQeV9ERUNSRUYoYy0+Y19zdGFjayk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0MmRpY3QoUHlPYmplY3QgKmxpc3QpCiB7Ci0JUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICp2LCAqazsKLQlQeU9iamVjdCAqZGljdCA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIWRpY3QpIHJldHVybiBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqdiwgKms7CisgICAgUHlPYmplY3QgKmRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFkaWN0KSByZXR1cm4gTlVMTDsKIAotCW4gPSBQeUxpc3RfU2l6ZShsaXN0KTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXYgPSBQeUludF9Gcm9tTG9uZyhpKTsKLQkJaWYgKCF2KSB7Ci0JCQlQeV9ERUNSRUYoZGljdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlrID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOwotCQlrID0gUHlUdXBsZV9QYWNrKDIsIGssIGstPm9iX3R5cGUpOwotCQlpZiAoayA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtKGRpY3QsIGssIHYpIDwgMCkgewotCQkJUHlfWERFQ1JFRihrKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRihkaWN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRihrKTsKLQkJUHlfREVDUkVGKHYpOwotCX0KLQlyZXR1cm4gZGljdDsKKyAgICBuID0gUHlMaXN0X1NpemUobGlzdCk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgIGlmICghdikgeworICAgICAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgayA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgayA9IFB5VHVwbGVfUGFjaygyLCBrLCBrLT5vYl90eXBlKTsKKyAgICAgICAgaWYgKGsgPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbShkaWN0LCBrLCB2KSA8IDApIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoayk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoayk7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CisgICAgcmV0dXJuIGRpY3Q7CiB9CiAKIC8qIFJldHVybiBuZXcgZGljdCBjb250YWluaW5nIG5hbWVzIGZyb20gc3JjIHRoYXQgbWF0Y2ggc2NvcGUocykuCiAKIHNyYyBpcyBhIHN5bWJvbCB0YWJsZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIHNjb3BlIG9mIGEgbmFtZSBtYXRjaGVzCi1laXRoZXIgc2NvcGVfdHlwZSBvciBmbGFnIGlzIHNldCwgaW5zZXJ0IGl0IGludG8gdGhlIG5ldyBkaWN0LglUaGUKK2VpdGhlciBzY29wZV90eXBlIG9yIGZsYWcgaXMgc2V0LCBpbnNlcnQgaXQgaW50byB0aGUgbmV3IGRpY3QuICBUaGUKIHZhbHVlcyBhcmUgaW50ZWdlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCBhbmQgaW5jcmVhc2luZyBieSBvbmUgZm9yCiBlYWNoIGtleS4KICovCkBAIC0zNTksMTc5ICszNTksMTc5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGljdGJ5dHlwZShQeU9iamVjdCAqc3JjLCBpbnQgc2NvcGVfdHlwZSwgaW50IGZsYWcsIGludCBvZmZzZXQpCiB7Ci0JUHlfc3NpemVfdCBwb3MgPSAwLCBpID0gb2Zmc2V0LCBzY29wZTsKLQlQeU9iamVjdCAqaywgKnYsICpkZXN0ID0gUHlEaWN0X05ldygpOworICAgIFB5X3NzaXplX3QgcG9zID0gMCwgaSA9IG9mZnNldCwgc2NvcGU7CisgICAgUHlPYmplY3QgKmssICp2LCAqZGVzdCA9IFB5RGljdF9OZXcoKTsKIAotCWFzc2VydChvZmZzZXQgPj0gMCk7Ci0JaWYgKGRlc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KG9mZnNldCA+PSAwKTsKKyAgICBpZiAoZGVzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXdoaWxlIChQeURpY3RfTmV4dChzcmMsICZwb3MsICZrLCAmdikpIHsKLQkJLyogWFhYIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGEgbWFjcm8gaW4gc3ltdGFibGUuaCAqLwotCQlhc3NlcnQoUHlJbnRfQ2hlY2sodikpOwotCQlzY29wZSA9IChQeUludF9BU19MT05HKHYpID4+IFNDT1BFX09GRikgJiBTQ09QRV9NQVNLOworICAgIHdoaWxlIChQeURpY3RfTmV4dChzcmMsICZwb3MsICZrLCAmdikpIHsKKyAgICAgICAgLyogWFhYIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGEgbWFjcm8gaW4gc3ltdGFibGUuaCAqLworICAgICAgICBhc3NlcnQoUHlJbnRfQ2hlY2sodikpOworICAgICAgICBzY29wZSA9IChQeUludF9BU19MT05HKHYpID4+IFNDT1BFX09GRikgJiBTQ09QRV9NQVNLOwogCi0JCWlmIChzY29wZSA9PSBzY29wZV90eXBlIHx8IFB5SW50X0FTX0xPTkcodikgJiBmbGFnKSB7Ci0JCQlQeU9iamVjdCAqdHVwbGUsICppdGVtID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGRlc3QpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaSsrOwotCQkJdHVwbGUgPSBQeVR1cGxlX1BhY2soMiwgaywgay0+b2JfdHlwZSk7Ci0JCQlpZiAoIXR1cGxlIHx8IFB5RGljdF9TZXRJdGVtKGRlc3QsIHR1cGxlLCBpdGVtKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJUHlfREVDUkVGKGRlc3QpOwotCQkJCVB5X1hERUNSRUYodHVwbGUpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJUHlfREVDUkVGKHR1cGxlKTsKLQkJfQotCX0KLQlyZXR1cm4gZGVzdDsKKyAgICAgICAgaWYgKHNjb3BlID09IHNjb3BlX3R5cGUgfHwgUHlJbnRfQVNfTE9ORyh2KSAmIGZsYWcpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp0dXBsZSwgKml0ZW0gPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGVzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB0dXBsZSA9IFB5VHVwbGVfUGFjaygyLCBrLCBrLT5vYl90eXBlKTsKKyAgICAgICAgICAgIGlmICghdHVwbGUgfHwgUHlEaWN0X1NldEl0ZW0oZGVzdCwgdHVwbGUsIGl0ZW0pIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGVzdCk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0dXBsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYodHVwbGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXN0OwogfQogCiBzdGF0aWMgdm9pZAogY29tcGlsZXJfdW5pdF9jaGVjayhzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdSkKIHsKLQliYXNpY2Jsb2NrICpibG9jazsKLQlmb3IgKGJsb2NrID0gdS0+dV9ibG9ja3M7IGJsb2NrICE9IE5VTEw7IGJsb2NrID0gYmxvY2stPmJfbGlzdCkgewotCQlhc3NlcnQoKHZvaWQgKilibG9jayAhPSAodm9pZCAqKTB4Y2JjYmNiY2IpOwotCQlhc3NlcnQoKHZvaWQgKilibG9jayAhPSAodm9pZCAqKTB4ZmJmYmZiZmIpOwotCQlhc3NlcnQoKHZvaWQgKilibG9jayAhPSAodm9pZCAqKTB4ZGJkYmRiZGIpOwotCQlpZiAoYmxvY2stPmJfaW5zdHIgIT0gTlVMTCkgewotCQkJYXNzZXJ0KGJsb2NrLT5iX2lhbGxvYyA+IDApOwotCQkJYXNzZXJ0KGJsb2NrLT5iX2l1c2VkID4gMCk7Ci0JCQlhc3NlcnQoYmxvY2stPmJfaWFsbG9jID49IGJsb2NrLT5iX2l1c2VkKTsKLQkJfQotCQllbHNlIHsKLQkJCWFzc2VydCAoYmxvY2stPmJfaXVzZWQgPT0gMCk7Ci0JCQlhc3NlcnQgKGJsb2NrLT5iX2lhbGxvYyA9PSAwKTsKLQkJfQotCX0KKyAgICBiYXNpY2Jsb2NrICpibG9jazsKKyAgICBmb3IgKGJsb2NrID0gdS0+dV9ibG9ja3M7IGJsb2NrICE9IE5VTEw7IGJsb2NrID0gYmxvY2stPmJfbGlzdCkgeworICAgICAgICBhc3NlcnQoKHZvaWQgKilibG9jayAhPSAodm9pZCAqKTB4Y2JjYmNiY2IpOworICAgICAgICBhc3NlcnQoKHZvaWQgKilibG9jayAhPSAodm9pZCAqKTB4ZmJmYmZiZmIpOworICAgICAgICBhc3NlcnQoKHZvaWQgKilibG9jayAhPSAodm9pZCAqKTB4ZGJkYmRiZGIpOworICAgICAgICBpZiAoYmxvY2stPmJfaW5zdHIgIT0gTlVMTCkgeworICAgICAgICAgICAgYXNzZXJ0KGJsb2NrLT5iX2lhbGxvYyA+IDApOworICAgICAgICAgICAgYXNzZXJ0KGJsb2NrLT5iX2l1c2VkID4gMCk7CisgICAgICAgICAgICBhc3NlcnQoYmxvY2stPmJfaWFsbG9jID49IGJsb2NrLT5iX2l1c2VkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydCAoYmxvY2stPmJfaXVzZWQgPT0gMCk7CisgICAgICAgICAgICBhc3NlcnQgKGJsb2NrLT5iX2lhbGxvYyA9PSAwKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVyX3VuaXRfZnJlZShzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdSkKIHsKLQliYXNpY2Jsb2NrICpiLCAqbmV4dDsKKyAgICBiYXNpY2Jsb2NrICpiLCAqbmV4dDsKIAotCWNvbXBpbGVyX3VuaXRfY2hlY2sodSk7Ci0JYiA9IHUtPnVfYmxvY2tzOwotCXdoaWxlIChiICE9IE5VTEwpIHsKLQkJaWYgKGItPmJfaW5zdHIpCi0JCQlQeU9iamVjdF9GcmVlKCh2b2lkICopYi0+Yl9pbnN0cik7Ci0JCW5leHQgPSBiLT5iX2xpc3Q7Ci0JCVB5T2JqZWN0X0ZyZWUoKHZvaWQgKiliKTsKLQkJYiA9IG5leHQ7Ci0JfQotCVB5X0NMRUFSKHUtPnVfc3RlKTsKLQlQeV9DTEVBUih1LT51X25hbWUpOwotCVB5X0NMRUFSKHUtPnVfY29uc3RzKTsKLQlQeV9DTEVBUih1LT51X25hbWVzKTsKLQlQeV9DTEVBUih1LT51X3Zhcm5hbWVzKTsKLQlQeV9DTEVBUih1LT51X2ZyZWV2YXJzKTsKLQlQeV9DTEVBUih1LT51X2NlbGx2YXJzKTsKLQlQeV9DTEVBUih1LT51X3ByaXZhdGUpOwotCVB5T2JqZWN0X0ZyZWUodSk7CisgICAgY29tcGlsZXJfdW5pdF9jaGVjayh1KTsKKyAgICBiID0gdS0+dV9ibG9ja3M7CisgICAgd2hpbGUgKGIgIT0gTlVMTCkgeworICAgICAgICBpZiAoYi0+Yl9pbnN0cikKKyAgICAgICAgICAgIFB5T2JqZWN0X0ZyZWUoKHZvaWQgKiliLT5iX2luc3RyKTsKKyAgICAgICAgbmV4dCA9IGItPmJfbGlzdDsKKyAgICAgICAgUHlPYmplY3RfRnJlZSgodm9pZCAqKWIpOworICAgICAgICBiID0gbmV4dDsKKyAgICB9CisgICAgUHlfQ0xFQVIodS0+dV9zdGUpOworICAgIFB5X0NMRUFSKHUtPnVfbmFtZSk7CisgICAgUHlfQ0xFQVIodS0+dV9jb25zdHMpOworICAgIFB5X0NMRUFSKHUtPnVfbmFtZXMpOworICAgIFB5X0NMRUFSKHUtPnVfdmFybmFtZXMpOworICAgIFB5X0NMRUFSKHUtPnVfZnJlZXZhcnMpOworICAgIFB5X0NMRUFSKHUtPnVfY2VsbHZhcnMpOworICAgIFB5X0NMRUFSKHUtPnVfcHJpdmF0ZSk7CisgICAgUHlPYmplY3RfRnJlZSh1KTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfZW50ZXJfc2NvcGUoc3RydWN0IGNvbXBpbGVyICpjLCBpZGVudGlmaWVyIG5hbWUsIHZvaWQgKmtleSwKLQkJICAgICBpbnQgbGluZW5vKQorICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVubykKIHsKLQlzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdTsKKyAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdTsKIAotCXUgPSAoc3RydWN0IGNvbXBpbGVyX3VuaXQgKilQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKAotCQkJCQkJc3RydWN0IGNvbXBpbGVyX3VuaXQpKTsKLQlpZiAoIXUpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW1lbXNldCh1LCAwLCBzaXplb2Yoc3RydWN0IGNvbXBpbGVyX3VuaXQpKTsKLQl1LT51X2FyZ2NvdW50ID0gMDsKLQl1LT51X3N0ZSA9IFB5U3ltdGFibGVfTG9va3VwKGMtPmNfc3QsIGtleSk7Ci0JaWYgKCF1LT51X3N0ZSkgewotCQljb21waWxlcl91bml0X2ZyZWUodSk7Ci0JCXJldHVybiAwOwotCX0KLQlQeV9JTkNSRUYobmFtZSk7Ci0JdS0+dV9uYW1lID0gbmFtZTsKLQl1LT51X3Zhcm5hbWVzID0gbGlzdDJkaWN0KHUtPnVfc3RlLT5zdGVfdmFybmFtZXMpOwotCXUtPnVfY2VsbHZhcnMgPSBkaWN0Ynl0eXBlKHUtPnVfc3RlLT5zdGVfc3ltYm9scywgQ0VMTCwgMCwgMCk7Ci0JaWYgKCF1LT51X3Zhcm5hbWVzIHx8ICF1LT51X2NlbGx2YXJzKSB7Ci0JCWNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIHUgPSAoc3RydWN0IGNvbXBpbGVyX3VuaXQgKilQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCkpOworICAgIGlmICghdSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbWVtc2V0KHUsIDAsIHNpemVvZihzdHJ1Y3QgY29tcGlsZXJfdW5pdCkpOworICAgIHUtPnVfYXJnY291bnQgPSAwOworICAgIHUtPnVfc3RlID0gUHlTeW10YWJsZV9Mb29rdXAoYy0+Y19zdCwga2V5KTsKKyAgICBpZiAoIXUtPnVfc3RlKSB7CisgICAgICAgIGNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICB1LT51X25hbWUgPSBuYW1lOworICAgIHUtPnVfdmFybmFtZXMgPSBsaXN0MmRpY3QodS0+dV9zdGUtPnN0ZV92YXJuYW1lcyk7CisgICAgdS0+dV9jZWxsdmFycyA9IGRpY3RieXR5cGUodS0+dV9zdGUtPnN0ZV9zeW1ib2xzLCBDRUxMLCAwLCAwKTsKKyAgICBpZiAoIXUtPnVfdmFybmFtZXMgfHwgIXUtPnVfY2VsbHZhcnMpIHsKKyAgICAgICAgY29tcGlsZXJfdW5pdF9mcmVlKHUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQl1LT51X2ZyZWV2YXJzID0gZGljdGJ5dHlwZSh1LT51X3N0ZS0+c3RlX3N5bWJvbHMsIEZSRUUsIERFRl9GUkVFX0NMQVNTLAotCQkJCSAgIFB5RGljdF9TaXplKHUtPnVfY2VsbHZhcnMpKTsKLQlpZiAoIXUtPnVfZnJlZXZhcnMpIHsKLQkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgdS0+dV9mcmVldmFycyA9IGRpY3RieXR5cGUodS0+dV9zdGUtPnN0ZV9zeW1ib2xzLCBGUkVFLCBERUZfRlJFRV9DTEFTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeURpY3RfU2l6ZSh1LT51X2NlbGx2YXJzKSk7CisgICAgaWYgKCF1LT51X2ZyZWV2YXJzKSB7CisgICAgICAgIGNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JdS0+dV9ibG9ja3MgPSBOVUxMOwotCXUtPnVfbmZibG9ja3MgPSAwOwotCXUtPnVfZmlyc3RsaW5lbm8gPSBsaW5lbm87Ci0JdS0+dV9saW5lbm8gPSAwOwotCXUtPnVfbGluZW5vX3NldCA9IGZhbHNlOwotCXUtPnVfY29uc3RzID0gUHlEaWN0X05ldygpOwotCWlmICghdS0+dV9jb25zdHMpIHsKLQkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JdS0+dV9uYW1lcyA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIXUtPnVfbmFtZXMpIHsKLQkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgdS0+dV9ibG9ja3MgPSBOVUxMOworICAgIHUtPnVfbmZibG9ja3MgPSAwOworICAgIHUtPnVfZmlyc3RsaW5lbm8gPSBsaW5lbm87CisgICAgdS0+dV9saW5lbm8gPSAwOworICAgIHUtPnVfbGluZW5vX3NldCA9IGZhbHNlOworICAgIHUtPnVfY29uc3RzID0gUHlEaWN0X05ldygpOworICAgIGlmICghdS0+dV9jb25zdHMpIHsKKyAgICAgICAgY29tcGlsZXJfdW5pdF9mcmVlKHUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdS0+dV9uYW1lcyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIXUtPnVfbmFtZXMpIHsKKyAgICAgICAgY29tcGlsZXJfdW5pdF9mcmVlKHUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQl1LT51X3ByaXZhdGUgPSBOVUxMOworICAgIHUtPnVfcHJpdmF0ZSA9IE5VTEw7CiAKLQkvKiBQdXNoIHRoZSBvbGQgY29tcGlsZXJfdW5pdCBvbiB0aGUgc3RhY2suICovCi0JaWYgKGMtPnUpIHsKLQkJUHlPYmplY3QgKmNhcHN1bGUgPSBQeUNhcHN1bGVfTmV3KGMtPnUsIENPTVBJTEVSX0NBUFNVTEVfTkFNRV9DT01QSUxFUl9VTklULCBOVUxMKTsKLQkJaWYgKCFjYXBzdWxlIHx8IFB5TGlzdF9BcHBlbmQoYy0+Y19zdGFjaywgY2Fwc3VsZSkgPCAwKSB7Ci0JCQlQeV9YREVDUkVGKGNhcHN1bGUpOwotCQkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJUHlfREVDUkVGKGNhcHN1bGUpOwotCQl1LT51X3ByaXZhdGUgPSBjLT51LT51X3ByaXZhdGU7Ci0JCVB5X1hJTkNSRUYodS0+dV9wcml2YXRlKTsKLQl9Ci0JYy0+dSA9IHU7CisgICAgLyogUHVzaCB0aGUgb2xkIGNvbXBpbGVyX3VuaXQgb24gdGhlIHN0YWNrLiAqLworICAgIGlmIChjLT51KSB7CisgICAgICAgIFB5T2JqZWN0ICpjYXBzdWxlID0gUHlDYXBzdWxlX05ldyhjLT51LCBDT01QSUxFUl9DQVBTVUxFX05BTUVfQ09NUElMRVJfVU5JVCwgTlVMTCk7CisgICAgICAgIGlmICghY2Fwc3VsZSB8fCBQeUxpc3RfQXBwZW5kKGMtPmNfc3RhY2ssIGNhcHN1bGUpIDwgMCkgeworICAgICAgICAgICAgUHlfWERFQ1JFRihjYXBzdWxlKTsKKyAgICAgICAgICAgIGNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihjYXBzdWxlKTsKKyAgICAgICAgdS0+dV9wcml2YXRlID0gYy0+dS0+dV9wcml2YXRlOworICAgICAgICBQeV9YSU5DUkVGKHUtPnVfcHJpdmF0ZSk7CisgICAgfQorICAgIGMtPnUgPSB1OwogCi0JYy0+Y19uZXN0bGV2ZWwrKzsKLQlpZiAoY29tcGlsZXJfdXNlX25ld19ibG9jayhjKSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICBjLT5jX25lc3RsZXZlbCsrOworICAgIGlmIChjb21waWxlcl91c2VfbmV3X2Jsb2NrKGMpID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkCiBjb21waWxlcl9leGl0X3Njb3BlKHN0cnVjdCBjb21waWxlciAqYykKIHsKLQlpbnQgbjsKLQlQeU9iamVjdCAqY2Fwc3VsZTsKKyAgICBpbnQgbjsKKyAgICBQeU9iamVjdCAqY2Fwc3VsZTsKIAotCWMtPmNfbmVzdGxldmVsLS07Ci0JY29tcGlsZXJfdW5pdF9mcmVlKGMtPnUpOwotCS8qIFJlc3RvcmUgYy0+dSB0byB0aGUgcGFyZW50IHVuaXQuICovCi0JbiA9IFB5TGlzdF9HRVRfU0laRShjLT5jX3N0YWNrKSAtIDE7Ci0JaWYgKG4gPj0gMCkgewotCQljYXBzdWxlID0gUHlMaXN0X0dFVF9JVEVNKGMtPmNfc3RhY2ssIG4pOwotCQljLT51ID0gKHN0cnVjdCBjb21waWxlcl91bml0ICopUHlDYXBzdWxlX0dldFBvaW50ZXIoY2Fwc3VsZSwgQ09NUElMRVJfQ0FQU1VMRV9OQU1FX0NPTVBJTEVSX1VOSVQpOwotCQlhc3NlcnQoYy0+dSk7Ci0JCS8qIHdlIGFyZSBkZWxldGluZyBmcm9tIGEgbGlzdCBzbyB0aGlzIHJlYWxseSBzaG91bGRuJ3QgZmFpbCAqLwotCQlpZiAoUHlTZXF1ZW5jZV9EZWxJdGVtKGMtPmNfc3RhY2ssIG4pIDwgMCkKLQkJCVB5X0ZhdGFsRXJyb3IoImNvbXBpbGVyX2V4aXRfc2NvcGUoKSIpOwotCQljb21waWxlcl91bml0X2NoZWNrKGMtPnUpOwotCX0KLQllbHNlCi0JCWMtPnUgPSBOVUxMOworICAgIGMtPmNfbmVzdGxldmVsLS07CisgICAgY29tcGlsZXJfdW5pdF9mcmVlKGMtPnUpOworICAgIC8qIFJlc3RvcmUgYy0+dSB0byB0aGUgcGFyZW50IHVuaXQuICovCisgICAgbiA9IFB5TGlzdF9HRVRfU0laRShjLT5jX3N0YWNrKSAtIDE7CisgICAgaWYgKG4gPj0gMCkgeworICAgICAgICBjYXBzdWxlID0gUHlMaXN0X0dFVF9JVEVNKGMtPmNfc3RhY2ssIG4pOworICAgICAgICBjLT51ID0gKHN0cnVjdCBjb21waWxlcl91bml0ICopUHlDYXBzdWxlX0dldFBvaW50ZXIoY2Fwc3VsZSwgQ09NUElMRVJfQ0FQU1VMRV9OQU1FX0NPTVBJTEVSX1VOSVQpOworICAgICAgICBhc3NlcnQoYy0+dSk7CisgICAgICAgIC8qIHdlIGFyZSBkZWxldGluZyBmcm9tIGEgbGlzdCBzbyB0aGlzIHJlYWxseSBzaG91bGRuJ3QgZmFpbCAqLworICAgICAgICBpZiAoUHlTZXF1ZW5jZV9EZWxJdGVtKGMtPmNfc3RhY2ssIG4pIDwgMCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNvbXBpbGVyX2V4aXRfc2NvcGUoKSIpOworICAgICAgICBjb21waWxlcl91bml0X2NoZWNrKGMtPnUpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGMtPnUgPSBOVUxMOwogCiB9CiAKQEAgLTU0Miw1MCArNTQyLDUwIEBACiBzdGF0aWMgYmFzaWNibG9jayAqCiBjb21waWxlcl9uZXdfYmxvY2soc3RydWN0IGNvbXBpbGVyICpjKQogewotCWJhc2ljYmxvY2sgKmI7Ci0Jc3RydWN0IGNvbXBpbGVyX3VuaXQgKnU7CisgICAgYmFzaWNibG9jayAqYjsKKyAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdTsKIAotCXUgPSBjLT51OwotCWIgPSAoYmFzaWNibG9jayAqKVB5T2JqZWN0X01hbGxvYyhzaXplb2YoYmFzaWNibG9jaykpOwotCWlmIChiID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbXNldCgodm9pZCAqKWIsIDAsIHNpemVvZihiYXNpY2Jsb2NrKSk7Ci0JLyogRXh0ZW5kIHRoZSBzaW5nbHkgbGlua2VkIGxpc3Qgb2YgYmxvY2tzIHdpdGggbmV3IGJsb2NrLiAqLwotCWItPmJfbGlzdCA9IHUtPnVfYmxvY2tzOwotCXUtPnVfYmxvY2tzID0gYjsKLQlyZXR1cm4gYjsKKyAgICB1ID0gYy0+dTsKKyAgICBiID0gKGJhc2ljYmxvY2sgKilQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKGJhc2ljYmxvY2spKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQoKHZvaWQgKiliLCAwLCBzaXplb2YoYmFzaWNibG9jaykpOworICAgIC8qIEV4dGVuZCB0aGUgc2luZ2x5IGxpbmtlZCBsaXN0IG9mIGJsb2NrcyB3aXRoIG5ldyBibG9jay4gKi8KKyAgICBiLT5iX2xpc3QgPSB1LT51X2Jsb2NrczsKKyAgICB1LT51X2Jsb2NrcyA9IGI7CisgICAgcmV0dXJuIGI7CiB9CiAKIHN0YXRpYyBiYXNpY2Jsb2NrICoKIGNvbXBpbGVyX3VzZV9uZXdfYmxvY2soc3RydWN0IGNvbXBpbGVyICpjKQogewotCWJhc2ljYmxvY2sgKmJsb2NrID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChibG9jayA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQljLT51LT51X2N1cmJsb2NrID0gYmxvY2s7Ci0JcmV0dXJuIGJsb2NrOworICAgIGJhc2ljYmxvY2sgKmJsb2NrID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChibG9jayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjLT51LT51X2N1cmJsb2NrID0gYmxvY2s7CisgICAgcmV0dXJuIGJsb2NrOwogfQogCiBzdGF0aWMgYmFzaWNibG9jayAqCiBjb21waWxlcl9uZXh0X2Jsb2NrKHN0cnVjdCBjb21waWxlciAqYykKIHsKLQliYXNpY2Jsb2NrICpibG9jayA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZiAoYmxvY2sgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYy0+dS0+dV9jdXJibG9jay0+Yl9uZXh0ID0gYmxvY2s7Ci0JYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOwotCXJldHVybiBibG9jazsKKyAgICBiYXNpY2Jsb2NrICpibG9jayA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZiAoYmxvY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYy0+dS0+dV9jdXJibG9jay0+Yl9uZXh0ID0gYmxvY2s7CisgICAgYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOworICAgIHJldHVybiBibG9jazsKIH0KIAogc3RhdGljIGJhc2ljYmxvY2sgKgogY29tcGlsZXJfdXNlX25leHRfYmxvY2soc3RydWN0IGNvbXBpbGVyICpjLCBiYXNpY2Jsb2NrICpibG9jaykKIHsKLQlhc3NlcnQoYmxvY2sgIT0gTlVMTCk7Ci0JYy0+dS0+dV9jdXJibG9jay0+Yl9uZXh0ID0gYmxvY2s7Ci0JYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOwotCXJldHVybiBibG9jazsKKyAgICBhc3NlcnQoYmxvY2sgIT0gTlVMTCk7CisgICAgYy0+dS0+dV9jdXJibG9jay0+Yl9uZXh0ID0gYmxvY2s7CisgICAgYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOworICAgIHJldHVybiBibG9jazsKIH0KIAogLyogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IGluc3RydWN0aW9uIGluIHRoZSBjdXJyZW50IGJsb2NrJ3MKQEAgLTU5Niw0NCArNTk2LDQ0IEBACiBzdGF0aWMgaW50CiBjb21waWxlcl9uZXh0X2luc3RyKHN0cnVjdCBjb21waWxlciAqYywgYmFzaWNibG9jayAqYikKIHsKLQlhc3NlcnQoYiAhPSBOVUxMKTsKLQlpZiAoYi0+Yl9pbnN0ciA9PSBOVUxMKSB7Ci0JCWItPmJfaW5zdHIgPSAoc3RydWN0IGluc3RyICopUHlPYmplY3RfTWFsbG9jKAotCQkJCSBzaXplb2Yoc3RydWN0IGluc3RyKSAqIERFRkFVTFRfQkxPQ0tfU0laRSk7Ci0JCWlmIChiLT5iX2luc3RyID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYi0+Yl9pYWxsb2MgPSBERUZBVUxUX0JMT0NLX1NJWkU7Ci0JCW1lbXNldCgoY2hhciAqKWItPmJfaW5zdHIsIDAsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGluc3RyKSAqIERFRkFVTFRfQkxPQ0tfU0laRSk7Ci0JfQotCWVsc2UgaWYgKGItPmJfaXVzZWQgPT0gYi0+Yl9pYWxsb2MpIHsKLQkJc3RydWN0IGluc3RyICp0bXA7Ci0JCXNpemVfdCBvbGRzaXplLCBuZXdzaXplOwotCQlvbGRzaXplID0gYi0+Yl9pYWxsb2MgKiBzaXplb2Yoc3RydWN0IGluc3RyKTsKLQkJbmV3c2l6ZSA9IG9sZHNpemUgPDwgMTsKKyAgICBhc3NlcnQoYiAhPSBOVUxMKTsKKyAgICBpZiAoYi0+Yl9pbnN0ciA9PSBOVUxMKSB7CisgICAgICAgIGItPmJfaW5zdHIgPSAoc3RydWN0IGluc3RyICopUHlPYmplY3RfTWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW5zdHIpICogREVGQVVMVF9CTE9DS19TSVpFKTsKKyAgICAgICAgaWYgKGItPmJfaW5zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBiLT5iX2lhbGxvYyA9IERFRkFVTFRfQkxPQ0tfU0laRTsKKyAgICAgICAgbWVtc2V0KChjaGFyICopYi0+Yl9pbnN0ciwgMCwKKyAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW5zdHIpICogREVGQVVMVF9CTE9DS19TSVpFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYi0+Yl9pdXNlZCA9PSBiLT5iX2lhbGxvYykgeworICAgICAgICBzdHJ1Y3QgaW5zdHIgKnRtcDsKKyAgICAgICAgc2l6ZV90IG9sZHNpemUsIG5ld3NpemU7CisgICAgICAgIG9sZHNpemUgPSBiLT5iX2lhbGxvYyAqIHNpemVvZihzdHJ1Y3QgaW5zdHIpOworICAgICAgICBuZXdzaXplID0gb2xkc2l6ZSA8PCAxOwogCi0JCWlmIChvbGRzaXplID4gKFBZX1NJWkVfTUFYID4+IDEpKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIGlmIChvbGRzaXplID4gKFBZX1NJWkVfTUFYID4+IDEpKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJaWYgKG5ld3NpemUgPT0gMCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQliLT5iX2lhbGxvYyA8PD0gMTsKLQkJdG1wID0gKHN0cnVjdCBpbnN0ciAqKVB5T2JqZWN0X1JlYWxsb2MoCi0JCQkJCQkodm9pZCAqKWItPmJfaW5zdHIsIG5ld3NpemUpOwotCQlpZiAodG1wID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYi0+Yl9pbnN0ciA9IHRtcDsKLQkJbWVtc2V0KChjaGFyICopYi0+Yl9pbnN0ciArIG9sZHNpemUsIDAsIG5ld3NpemUgLSBvbGRzaXplKTsKLQl9Ci0JcmV0dXJuIGItPmJfaXVzZWQrKzsKKyAgICAgICAgaWYgKG5ld3NpemUgPT0gMCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBiLT5iX2lhbGxvYyA8PD0gMTsKKyAgICAgICAgdG1wID0gKHN0cnVjdCBpbnN0ciAqKVB5T2JqZWN0X1JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiliLT5iX2luc3RyLCBuZXdzaXplKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGItPmJfaW5zdHIgPSB0bXA7CisgICAgICAgIG1lbXNldCgoY2hhciAqKWItPmJfaW5zdHIgKyBvbGRzaXplLCAwLCBuZXdzaXplIC0gb2xkc2l6ZSk7CisgICAgfQorICAgIHJldHVybiBiLT5iX2l1c2VkKys7CiB9CiAKIC8qIFNldCB0aGUgaV9saW5lbm8gbWVtYmVyIG9mIHRoZSBpbnN0cnVjdGlvbiBhdCBvZmZzZXQgb2ZmIGlmIHRoZQpAQCAtNjUxLDI0NiArNjUxLDI0NiBAQAogc3RhdGljIHZvaWQKIGNvbXBpbGVyX3NldF9saW5lbm8oc3RydWN0IGNvbXBpbGVyICpjLCBpbnQgb2ZmKQogewotCWJhc2ljYmxvY2sgKmI7Ci0JaWYgKGMtPnUtPnVfbGluZW5vX3NldCkKLQkJcmV0dXJuOwotCWMtPnUtPnVfbGluZW5vX3NldCA9IHRydWU7Ci0JYiA9IGMtPnUtPnVfY3VyYmxvY2s7Ci0JYi0+Yl9pbnN0cltvZmZdLmlfbGluZW5vID0gYy0+dS0+dV9saW5lbm87CisgICAgYmFzaWNibG9jayAqYjsKKyAgICBpZiAoYy0+dS0+dV9saW5lbm9fc2V0KQorICAgICAgICByZXR1cm47CisgICAgYy0+dS0+dV9saW5lbm9fc2V0ID0gdHJ1ZTsKKyAgICBiID0gYy0+dS0+dV9jdXJibG9jazsKKyAgICBiLT5iX2luc3RyW29mZl0uaV9saW5lbm8gPSBjLT51LT51X2xpbmVubzsKIH0KIAogc3RhdGljIGludAogb3Bjb2RlX3N0YWNrX2VmZmVjdChpbnQgb3Bjb2RlLCBpbnQgb3BhcmcpCiB7Ci0Jc3dpdGNoIChvcGNvZGUpIHsKLQkJY2FzZSBQT1BfVE9QOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIFJPVF9UV086Ci0JCWNhc2UgUk9UX1RIUkVFOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgRFVQX1RPUDoKLQkJCXJldHVybiAxOwotCQljYXNlIFJPVF9GT1VSOgotCQkJcmV0dXJuIDA7CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBQT1BfVE9QOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIFJPVF9UV086CisgICAgICAgIGNhc2UgUk9UX1RIUkVFOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgRFVQX1RPUDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFJPVF9GT1VSOgorICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJY2FzZSBVTkFSWV9QT1NJVElWRToKLQkJY2FzZSBVTkFSWV9ORUdBVElWRToKLQkJY2FzZSBVTkFSWV9OT1Q6Ci0JCWNhc2UgVU5BUllfQ09OVkVSVDoKLQkJY2FzZSBVTkFSWV9JTlZFUlQ6Ci0JCQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBVTkFSWV9QT1NJVElWRToKKyAgICAgICAgY2FzZSBVTkFSWV9ORUdBVElWRToKKyAgICAgICAgY2FzZSBVTkFSWV9OT1Q6CisgICAgICAgIGNhc2UgVU5BUllfQ09OVkVSVDoKKyAgICAgICAgY2FzZSBVTkFSWV9JTlZFUlQ6CisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQljYXNlIFNFVF9BREQ6Ci0JCWNhc2UgTElTVF9BUFBFTkQ6Ci0JCQlyZXR1cm4gLTE7CisgICAgICAgIGNhc2UgU0VUX0FERDoKKyAgICAgICAgY2FzZSBMSVNUX0FQUEVORDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQljYXNlIE1BUF9BREQ6Ci0JCQlyZXR1cm4gLTI7CisgICAgICAgIGNhc2UgTUFQX0FERDoKKyAgICAgICAgICAgIHJldHVybiAtMjsKIAotCQljYXNlIEJJTkFSWV9QT1dFUjoKLQkJY2FzZSBCSU5BUllfTVVMVElQTFk6Ci0JCWNhc2UgQklOQVJZX0RJVklERToKLQkJY2FzZSBCSU5BUllfTU9EVUxPOgotCQljYXNlIEJJTkFSWV9BREQ6Ci0JCWNhc2UgQklOQVJZX1NVQlRSQUNUOgotCQljYXNlIEJJTkFSWV9TVUJTQ1I6Ci0JCWNhc2UgQklOQVJZX0ZMT09SX0RJVklERToKLQkJY2FzZSBCSU5BUllfVFJVRV9ESVZJREU6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgSU5QTEFDRV9GTE9PUl9ESVZJREU6Ci0JCWNhc2UgSU5QTEFDRV9UUlVFX0RJVklERToKLQkJCXJldHVybiAtMTsKKyAgICAgICAgY2FzZSBCSU5BUllfUE9XRVI6CisgICAgICAgIGNhc2UgQklOQVJZX01VTFRJUExZOgorICAgICAgICBjYXNlIEJJTkFSWV9ESVZJREU6CisgICAgICAgIGNhc2UgQklOQVJZX01PRFVMTzoKKyAgICAgICAgY2FzZSBCSU5BUllfQUREOgorICAgICAgICBjYXNlIEJJTkFSWV9TVUJUUkFDVDoKKyAgICAgICAgY2FzZSBCSU5BUllfU1VCU0NSOgorICAgICAgICBjYXNlIEJJTkFSWV9GTE9PUl9ESVZJREU6CisgICAgICAgIGNhc2UgQklOQVJZX1RSVUVfRElWSURFOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIElOUExBQ0VfRkxPT1JfRElWSURFOgorICAgICAgICBjYXNlIElOUExBQ0VfVFJVRV9ESVZJREU6CisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJY2FzZSBTTElDRSswOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgU0xJQ0UrMToKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBTTElDRSsyOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIFNMSUNFKzM6Ci0JCQlyZXR1cm4gLTI7CisgICAgICAgIGNhc2UgU0xJQ0UrMDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIFNMSUNFKzE6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgU0xJQ0UrMjoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBTTElDRSszOgorICAgICAgICAgICAgcmV0dXJuIC0yOwogCi0JCWNhc2UgU1RPUkVfU0xJQ0UrMDoKLQkJCXJldHVybiAtMjsKLQkJY2FzZSBTVE9SRV9TTElDRSsxOgotCQkJcmV0dXJuIC0zOwotCQljYXNlIFNUT1JFX1NMSUNFKzI6Ci0JCQlyZXR1cm4gLTM7Ci0JCWNhc2UgU1RPUkVfU0xJQ0UrMzoKLQkJCXJldHVybiAtNDsKKyAgICAgICAgY2FzZSBTVE9SRV9TTElDRSswOgorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICBjYXNlIFNUT1JFX1NMSUNFKzE6CisgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgIGNhc2UgU1RPUkVfU0xJQ0UrMjoKKyAgICAgICAgICAgIHJldHVybiAtMzsKKyAgICAgICAgY2FzZSBTVE9SRV9TTElDRSszOgorICAgICAgICAgICAgcmV0dXJuIC00OwogCi0JCWNhc2UgREVMRVRFX1NMSUNFKzA6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgREVMRVRFX1NMSUNFKzE6Ci0JCQlyZXR1cm4gLTI7Ci0JCWNhc2UgREVMRVRFX1NMSUNFKzI6Ci0JCQlyZXR1cm4gLTI7Ci0JCWNhc2UgREVMRVRFX1NMSUNFKzM6Ci0JCQlyZXR1cm4gLTM7CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzA6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzE6CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzI6CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzM6CisgICAgICAgICAgICByZXR1cm4gLTM7CiAKLQkJY2FzZSBJTlBMQUNFX0FERDoKLQkJY2FzZSBJTlBMQUNFX1NVQlRSQUNUOgotCQljYXNlIElOUExBQ0VfTVVMVElQTFk6Ci0JCWNhc2UgSU5QTEFDRV9ESVZJREU6Ci0JCWNhc2UgSU5QTEFDRV9NT0RVTE86Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgU1RPUkVfU1VCU0NSOgotCQkJcmV0dXJuIC0zOwotCQljYXNlIFNUT1JFX01BUDoKLQkJCXJldHVybiAtMjsKLQkJY2FzZSBERUxFVEVfU1VCU0NSOgotCQkJcmV0dXJuIC0yOworICAgICAgICBjYXNlIElOUExBQ0VfQUREOgorICAgICAgICBjYXNlIElOUExBQ0VfU1VCVFJBQ1Q6CisgICAgICAgIGNhc2UgSU5QTEFDRV9NVUxUSVBMWToKKyAgICAgICAgY2FzZSBJTlBMQUNFX0RJVklERToKKyAgICAgICAgY2FzZSBJTlBMQUNFX01PRFVMTzoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBTVE9SRV9TVUJTQ1I6CisgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgIGNhc2UgU1RPUkVfTUFQOgorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICBjYXNlIERFTEVURV9TVUJTQ1I6CisgICAgICAgICAgICByZXR1cm4gLTI7CiAKLQkJY2FzZSBCSU5BUllfTFNISUZUOgotCQljYXNlIEJJTkFSWV9SU0hJRlQ6Ci0JCWNhc2UgQklOQVJZX0FORDoKLQkJY2FzZSBCSU5BUllfWE9SOgotCQljYXNlIEJJTkFSWV9PUjoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBJTlBMQUNFX1BPV0VSOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIEdFVF9JVEVSOgotCQkJcmV0dXJuIDA7CisgICAgICAgIGNhc2UgQklOQVJZX0xTSElGVDoKKyAgICAgICAgY2FzZSBCSU5BUllfUlNISUZUOgorICAgICAgICBjYXNlIEJJTkFSWV9BTkQ6CisgICAgICAgIGNhc2UgQklOQVJZX1hPUjoKKyAgICAgICAgY2FzZSBCSU5BUllfT1I6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgSU5QTEFDRV9QT1dFUjoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBHRVRfSVRFUjoKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWNhc2UgUFJJTlRfRVhQUjoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBQUklOVF9JVEVNOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIFBSSU5UX05FV0xJTkU6Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBQUklOVF9JVEVNX1RPOgotCQkJcmV0dXJuIC0yOwotCQljYXNlIFBSSU5UX05FV0xJTkVfVE86Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgSU5QTEFDRV9MU0hJRlQ6Ci0JCWNhc2UgSU5QTEFDRV9SU0hJRlQ6Ci0JCWNhc2UgSU5QTEFDRV9BTkQ6Ci0JCWNhc2UgSU5QTEFDRV9YT1I6Ci0JCWNhc2UgSU5QTEFDRV9PUjoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBCUkVBS19MT09QOgotCQkJcmV0dXJuIDA7Ci0JICAgICAgICBjYXNlIFNFVFVQX1dJVEg6Ci0JCQlyZXR1cm4gNDsKLQkJY2FzZSBXSVRIX0NMRUFOVVA6Ci0JCQlyZXR1cm4gLTE7IC8qIFhYWCBTb21ldGltZXMgbW9yZSAqLwotCQljYXNlIExPQURfTE9DQUxTOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgUkVUVVJOX1ZBTFVFOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIElNUE9SVF9TVEFSOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIEVYRUNfU1RNVDoKLQkJCXJldHVybiAtMzsKLQkJY2FzZSBZSUVMRF9WQUxVRToKLQkJCXJldHVybiAwOworICAgICAgICBjYXNlIFBSSU5UX0VYUFI6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgUFJJTlRfSVRFTToKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBQUklOVF9ORVdMSU5FOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgUFJJTlRfSVRFTV9UTzoKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgY2FzZSBQUklOVF9ORVdMSU5FX1RPOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIElOUExBQ0VfTFNISUZUOgorICAgICAgICBjYXNlIElOUExBQ0VfUlNISUZUOgorICAgICAgICBjYXNlIElOUExBQ0VfQU5EOgorICAgICAgICBjYXNlIElOUExBQ0VfWE9SOgorICAgICAgICBjYXNlIElOUExBQ0VfT1I6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgQlJFQUtfTE9PUDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIFNFVFVQX1dJVEg6CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgY2FzZSBXSVRIX0NMRUFOVVA6CisgICAgICAgICAgICByZXR1cm4gLTE7IC8qIFhYWCBTb21ldGltZXMgbW9yZSAqLworICAgICAgICBjYXNlIExPQURfTE9DQUxTOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgUkVUVVJOX1ZBTFVFOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIElNUE9SVF9TVEFSOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIEVYRUNfU1RNVDoKKyAgICAgICAgICAgIHJldHVybiAtMzsKKyAgICAgICAgY2FzZSBZSUVMRF9WQUxVRToKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWNhc2UgUE9QX0JMT0NLOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgRU5EX0ZJTkFMTFk6Ci0JCQlyZXR1cm4gLTM7IC8qIG9yIC0xIG9yIC0yIGlmIG5vIGV4Y2VwdGlvbiBvY2N1cnJlZCBvcgotCQkJCSAgICAgIHJldHVybi9icmVhay9jb250aW51ZSAqLwotCQljYXNlIEJVSUxEX0NMQVNTOgotCQkJcmV0dXJuIC0yOworICAgICAgICBjYXNlIFBPUF9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIEVORF9GSU5BTExZOgorICAgICAgICAgICAgcmV0dXJuIC0zOyAvKiBvciAtMSBvciAtMiBpZiBubyBleGNlcHRpb24gb2NjdXJyZWQgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuL2JyZWFrL2NvbnRpbnVlICovCisgICAgICAgIGNhc2UgQlVJTERfQ0xBU1M6CisgICAgICAgICAgICByZXR1cm4gLTI7CiAKLQkJY2FzZSBTVE9SRV9OQU1FOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIERFTEVURV9OQU1FOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgVU5QQUNLX1NFUVVFTkNFOgotCQkJcmV0dXJuIG9wYXJnLTE7Ci0JCWNhc2UgRk9SX0lURVI6Ci0JCQlyZXR1cm4gMTsgLyogb3IgLTEsIGF0IGVuZCBvZiBpdGVyYXRvciAqLworICAgICAgICBjYXNlIFNUT1JFX05BTUU6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgREVMRVRFX05BTUU6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBVTlBBQ0tfU0VRVUVOQ0U6CisgICAgICAgICAgICByZXR1cm4gb3BhcmctMTsKKyAgICAgICAgY2FzZSBGT1JfSVRFUjoKKyAgICAgICAgICAgIHJldHVybiAxOyAvKiBvciAtMSwgYXQgZW5kIG9mIGl0ZXJhdG9yICovCiAKLQkJY2FzZSBTVE9SRV9BVFRSOgotCQkJcmV0dXJuIC0yOwotCQljYXNlIERFTEVURV9BVFRSOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIFNUT1JFX0dMT0JBTDoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBERUxFVEVfR0xPQkFMOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgRFVQX1RPUFg6Ci0JCQlyZXR1cm4gb3Bhcmc7Ci0JCWNhc2UgTE9BRF9DT05TVDoKLQkJCXJldHVybiAxOwotCQljYXNlIExPQURfTkFNRToKLQkJCXJldHVybiAxOwotCQljYXNlIEJVSUxEX1RVUExFOgotCQljYXNlIEJVSUxEX0xJU1Q6Ci0JCWNhc2UgQlVJTERfU0VUOgotCQkJcmV0dXJuIDEtb3Bhcmc7Ci0JCWNhc2UgQlVJTERfTUFQOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgTE9BRF9BVFRSOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgQ09NUEFSRV9PUDoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBJTVBPUlRfTkFNRToKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBJTVBPUlRfRlJPTToKLQkJCXJldHVybiAxOworICAgICAgICBjYXNlIFNUT1JFX0FUVFI6CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGNhc2UgREVMRVRFX0FUVFI6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgU1RPUkVfR0xPQkFMOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIERFTEVURV9HTE9CQUw6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBEVVBfVE9QWDoKKyAgICAgICAgICAgIHJldHVybiBvcGFyZzsKKyAgICAgICAgY2FzZSBMT0FEX0NPTlNUOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgTE9BRF9OQU1FOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgQlVJTERfVFVQTEU6CisgICAgICAgIGNhc2UgQlVJTERfTElTVDoKKyAgICAgICAgY2FzZSBCVUlMRF9TRVQ6CisgICAgICAgICAgICByZXR1cm4gMS1vcGFyZzsKKyAgICAgICAgY2FzZSBCVUlMRF9NQVA6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBMT0FEX0FUVFI6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBDT01QQVJFX09QOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIElNUE9SVF9OQU1FOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIElNUE9SVF9GUk9NOgorICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJY2FzZSBKVU1QX0ZPUldBUkQ6Ci0JCWNhc2UgSlVNUF9JRl9UUlVFX09SX1BPUDogIC8qIC0xIGlmIGp1bXAgbm90IHRha2VuICovCi0JCWNhc2UgSlVNUF9JRl9GQUxTRV9PUl9QT1A6ICAvKiAgIiIgKi8KLQkJY2FzZSBKVU1QX0FCU09MVVRFOgotCQkJcmV0dXJuIDA7CisgICAgICAgIGNhc2UgSlVNUF9GT1JXQVJEOgorICAgICAgICBjYXNlIEpVTVBfSUZfVFJVRV9PUl9QT1A6ICAvKiAtMSBpZiBqdW1wIG5vdCB0YWtlbiAqLworICAgICAgICBjYXNlIEpVTVBfSUZfRkFMU0VfT1JfUE9QOiAgLyogICIiICovCisgICAgICAgIGNhc2UgSlVNUF9BQlNPTFVURToKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWNhc2UgUE9QX0pVTVBfSUZfRkFMU0U6Ci0JCWNhc2UgUE9QX0pVTVBfSUZfVFJVRToKLQkJCXJldHVybiAtMTsKKyAgICAgICAgY2FzZSBQT1BfSlVNUF9JRl9GQUxTRToKKyAgICAgICAgY2FzZSBQT1BfSlVNUF9JRl9UUlVFOgorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWNhc2UgTE9BRF9HTE9CQUw6Ci0JCQlyZXR1cm4gMTsKKyAgICAgICAgY2FzZSBMT0FEX0dMT0JBTDoKKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCWNhc2UgQ09OVElOVUVfTE9PUDoKLQkJCXJldHVybiAwOwotCQljYXNlIFNFVFVQX0xPT1A6Ci0JCWNhc2UgU0VUVVBfRVhDRVBUOgotCQljYXNlIFNFVFVQX0ZJTkFMTFk6Ci0JCQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBDT05USU5VRV9MT09QOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKKyAgICAgICAgY2FzZSBTRVRVUF9FWENFUFQ6CisgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWNhc2UgTE9BRF9GQVNUOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgU1RPUkVfRkFTVDoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBERUxFVEVfRkFTVDoKLQkJCXJldHVybiAwOworICAgICAgICBjYXNlIExPQURfRkFTVDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFNUT1JFX0ZBU1Q6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgREVMRVRFX0ZBU1Q6CisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQljYXNlIFJBSVNFX1ZBUkFSR1M6Ci0JCQlyZXR1cm4gLW9wYXJnOworICAgICAgICBjYXNlIFJBSVNFX1ZBUkFSR1M6CisgICAgICAgICAgICByZXR1cm4gLW9wYXJnOwogI2RlZmluZSBOQVJHUyhvKSAoKChvKSAlIDI1NikgKyAyKigobykgLyAyNTYpKQotCQljYXNlIENBTExfRlVOQ1RJT046Ci0JCQlyZXR1cm4gLU5BUkdTKG9wYXJnKTsKLQkJY2FzZSBDQUxMX0ZVTkNUSU9OX1ZBUjoKLQkJY2FzZSBDQUxMX0ZVTkNUSU9OX0tXOgotCQkJcmV0dXJuIC1OQVJHUyhvcGFyZyktMTsKLQkJY2FzZSBDQUxMX0ZVTkNUSU9OX1ZBUl9LVzoKLQkJCXJldHVybiAtTkFSR1Mob3BhcmcpLTI7CisgICAgICAgIGNhc2UgQ0FMTF9GVU5DVElPTjoKKyAgICAgICAgICAgIHJldHVybiAtTkFSR1Mob3BhcmcpOworICAgICAgICBjYXNlIENBTExfRlVOQ1RJT05fVkFSOgorICAgICAgICBjYXNlIENBTExfRlVOQ1RJT05fS1c6CisgICAgICAgICAgICByZXR1cm4gLU5BUkdTKG9wYXJnKS0xOworICAgICAgICBjYXNlIENBTExfRlVOQ1RJT05fVkFSX0tXOgorICAgICAgICAgICAgcmV0dXJuIC1OQVJHUyhvcGFyZyktMjsKICN1bmRlZiBOQVJHUwotCQljYXNlIE1BS0VfRlVOQ1RJT046Ci0JCQlyZXR1cm4gLW9wYXJnOwotCQljYXNlIEJVSUxEX1NMSUNFOgotCQkJaWYgKG9wYXJnID09IDMpCi0JCQkJcmV0dXJuIC0yOwotCQkJZWxzZQotCQkJCXJldHVybiAtMTsKKyAgICAgICAgY2FzZSBNQUtFX0ZVTkNUSU9OOgorICAgICAgICAgICAgcmV0dXJuIC1vcGFyZzsKKyAgICAgICAgY2FzZSBCVUlMRF9TTElDRToKKyAgICAgICAgICAgIGlmIChvcGFyZyA9PSAzKQorICAgICAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJY2FzZSBNQUtFX0NMT1NVUkU6Ci0JCQlyZXR1cm4gLW9wYXJnLTE7Ci0JCWNhc2UgTE9BRF9DTE9TVVJFOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgTE9BRF9ERVJFRjoKLQkJCXJldHVybiAxOwotCQljYXNlIFNUT1JFX0RFUkVGOgotCQkJcmV0dXJuIC0xOwotCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsICJvcGNvZGUgPSAlZFxuIiwgb3Bjb2RlKTsKLQkJCVB5X0ZhdGFsRXJyb3IoIm9wY29kZV9zdGFja19lZmZlY3QoKSIpOworICAgICAgICBjYXNlIE1BS0VfQ0xPU1VSRToKKyAgICAgICAgICAgIHJldHVybiAtb3BhcmctMTsKKyAgICAgICAgY2FzZSBMT0FEX0NMT1NVUkU6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBMT0FEX0RFUkVGOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgU1RPUkVfREVSRUY6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm9wY29kZSA9ICVkXG4iLCBvcGNvZGUpOworICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigib3Bjb2RlX3N0YWNrX2VmZmVjdCgpIik7CiAKLQl9Ci0JcmV0dXJuIDA7IC8qIG5vdCByZWFjaGFibGUgKi8KKyAgICB9CisgICAgcmV0dXJuIDA7IC8qIG5vdCByZWFjaGFibGUgKi8KIH0KIAogLyogQWRkIGFuIG9wY29kZSB3aXRoIG5vIGFyZ3VtZW50LgpAQCAtOTAwLDExNiArOTAwLDExNiBAQAogc3RhdGljIGludAogY29tcGlsZXJfYWRkb3Aoc3RydWN0IGNvbXBpbGVyICpjLCBpbnQgb3Bjb2RlKQogewotCWJhc2ljYmxvY2sgKmI7Ci0Jc3RydWN0IGluc3RyICppOwotCWludCBvZmY7Ci0Jb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKLQlpZiAob2ZmIDwgMCkKLQkJcmV0dXJuIDA7Ci0JYiA9IGMtPnUtPnVfY3VyYmxvY2s7Ci0JaSA9ICZiLT5iX2luc3RyW29mZl07Ci0JaS0+aV9vcGNvZGUgPSBvcGNvZGU7Ci0JaS0+aV9oYXNhcmcgPSAwOwotCWlmIChvcGNvZGUgPT0gUkVUVVJOX1ZBTFVFKQotCQliLT5iX3JldHVybiA9IDE7Ci0JY29tcGlsZXJfc2V0X2xpbmVubyhjLCBvZmYpOwotCXJldHVybiAxOworICAgIGJhc2ljYmxvY2sgKmI7CisgICAgc3RydWN0IGluc3RyICppOworICAgIGludCBvZmY7CisgICAgb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKKyAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYiA9IGMtPnUtPnVfY3VyYmxvY2s7CisgICAgaSA9ICZiLT5iX2luc3RyW29mZl07CisgICAgaS0+aV9vcGNvZGUgPSBvcGNvZGU7CisgICAgaS0+aV9oYXNhcmcgPSAwOworICAgIGlmIChvcGNvZGUgPT0gUkVUVVJOX1ZBTFVFKQorICAgICAgICBiLT5iX3JldHVybiA9IDE7CisgICAgY29tcGlsZXJfc2V0X2xpbmVubyhjLCBvZmYpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9hZGRfbyhzdHJ1Y3QgY29tcGlsZXIgKmMsIFB5T2JqZWN0ICpkaWN0LCBQeU9iamVjdCAqbykKIHsKLQlQeU9iamVjdCAqdCwgKnY7Ci0JUHlfc3NpemVfdCBhcmc7Ci0JZG91YmxlIGQ7CisgICAgUHlPYmplY3QgKnQsICp2OworICAgIFB5X3NzaXplX3QgYXJnOworICAgIGRvdWJsZSBkOwogCi0JLyogbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB0eXBlcyBhcmVuJ3QgY29lcmNlZCAoZS5nLiwgaW50IGFuZCBsb25nKSAqLwotICAgICAgICAvKiBfYW5kXyB0byBkaXN0aW5ndWlzaCAwLjAgZnJvbSAtMC4wIGUuZy4gb24gSUVFRSBwbGF0Zm9ybXMgKi8KLSAgICAgICAgaWYgKFB5RmxvYXRfQ2hlY2sobykpIHsKLQkJZCA9IFB5RmxvYXRfQVNfRE9VQkxFKG8pOwotCQkvKiBhbGwgd2UgbmVlZCBpcyB0byBtYWtlIHRoZSB0dXBsZSBkaWZmZXJlbnQgaW4gZWl0aGVyIHRoZSAwLjAKLQkJICogb3IgLTAuMCBjYXNlIGZyb20gYWxsIG90aGVycywganVzdCB0byBhdm9pZCB0aGUgImNvZXJjaW9uIi4KLQkJICovCi0JCWlmIChkID09IDAuMCAmJiBjb3B5c2lnbigxLjAsIGQpIDwgMC4wKQotCQkJdCA9IFB5VHVwbGVfUGFjaygzLCBvLCBvLT5vYl90eXBlLCBQeV9Ob25lKTsKLQkJZWxzZQotCQkJdCA9IFB5VHVwbGVfUGFjaygyLCBvLCBvLT5vYl90eXBlKTsKLQl9CisgICAgLyogbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB0eXBlcyBhcmVuJ3QgY29lcmNlZCAoZS5nLiwgaW50IGFuZCBsb25nKSAqLworICAgIC8qIF9hbmRfIHRvIGRpc3Rpbmd1aXNoIDAuMCBmcm9tIC0wLjAgZS5nLiBvbiBJRUVFIHBsYXRmb3JtcyAqLworICAgIGlmIChQeUZsb2F0X0NoZWNrKG8pKSB7CisgICAgICAgIGQgPSBQeUZsb2F0X0FTX0RPVUJMRShvKTsKKyAgICAgICAgLyogYWxsIHdlIG5lZWQgaXMgdG8gbWFrZSB0aGUgdHVwbGUgZGlmZmVyZW50IGluIGVpdGhlciB0aGUgMC4wCisgICAgICAgICAqIG9yIC0wLjAgY2FzZSBmcm9tIGFsbCBvdGhlcnMsIGp1c3QgdG8gYXZvaWQgdGhlICJjb2VyY2lvbiIuCisgICAgICAgICAqLworICAgICAgICBpZiAoZCA9PSAwLjAgJiYgY29weXNpZ24oMS4wLCBkKSA8IDAuMCkKKyAgICAgICAgICAgIHQgPSBQeVR1cGxlX1BhY2soMywgbywgby0+b2JfdHlwZSwgUHlfTm9uZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHQgPSBQeVR1cGxlX1BhY2soMiwgbywgby0+b2JfdHlwZSk7CisgICAgfQogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQllbHNlIGlmIChQeUNvbXBsZXhfQ2hlY2sobykpIHsKLQkJUHlfY29tcGxleCB6OwotCQlpbnQgcmVhbF9uZWd6ZXJvLCBpbWFnX25lZ3plcm87Ci0JCS8qIEZvciB0aGUgY29tcGxleCBjYXNlIHdlIG11c3QgbWFrZSBjb21wbGV4KHgsIDAuKQotCQkgICBkaWZmZXJlbnQgZnJvbSBjb21wbGV4KHgsIC0wLikgYW5kIGNvbXBsZXgoMC4sIHkpCi0JCSAgIGRpZmZlcmVudCBmcm9tIGNvbXBsZXgoLTAuLCB5KSwgZm9yIGFueSB4IGFuZCB5LgotCQkgICBBbGwgZm91ciBjb21wbGV4IHplcm9zIG11c3QgYmUgZGlzdGluZ3Vpc2hlZC4qLwotCQl6ID0gUHlDb21wbGV4X0FzQ0NvbXBsZXgobyk7Ci0JCXJlYWxfbmVnemVybyA9IHoucmVhbCA9PSAwLjAgJiYgY29weXNpZ24oMS4wLCB6LnJlYWwpIDwgMC4wOwotCQlpbWFnX25lZ3plcm8gPSB6LmltYWcgPT0gMC4wICYmIGNvcHlzaWduKDEuMCwgei5pbWFnKSA8IDAuMDsKLQkJaWYgKHJlYWxfbmVnemVybyAmJiBpbWFnX25lZ3plcm8pIHsKLQkJCXQgPSBQeVR1cGxlX1BhY2soNSwgbywgby0+b2JfdHlwZSwKLQkJCQkJIFB5X05vbmUsIFB5X05vbmUsIFB5X05vbmUpOwotCQl9Ci0JCWVsc2UgaWYgKGltYWdfbmVnemVybykgewotCQkJdCA9IFB5VHVwbGVfUGFjayg0LCBvLCBvLT5vYl90eXBlLCBQeV9Ob25lLCBQeV9Ob25lKTsKLQkJfQotCQllbHNlIGlmIChyZWFsX25lZ3plcm8pIHsKLQkJCXQgPSBQeVR1cGxlX1BhY2soMywgbywgby0+b2JfdHlwZSwgUHlfTm9uZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0ID0gUHlUdXBsZV9QYWNrKDIsIG8sIG8tPm9iX3R5cGUpOwotCQl9CisgICAgZWxzZSBpZiAoUHlDb21wbGV4X0NoZWNrKG8pKSB7CisgICAgICAgIFB5X2NvbXBsZXggejsKKyAgICAgICAgaW50IHJlYWxfbmVnemVybywgaW1hZ19uZWd6ZXJvOworICAgICAgICAvKiBGb3IgdGhlIGNvbXBsZXggY2FzZSB3ZSBtdXN0IG1ha2UgY29tcGxleCh4LCAwLikKKyAgICAgICAgICAgZGlmZmVyZW50IGZyb20gY29tcGxleCh4LCAtMC4pIGFuZCBjb21wbGV4KDAuLCB5KQorICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSBjb21wbGV4KC0wLiwgeSksIGZvciBhbnkgeCBhbmQgeS4KKyAgICAgICAgICAgQWxsIGZvdXIgY29tcGxleCB6ZXJvcyBtdXN0IGJlIGRpc3Rpbmd1aXNoZWQuKi8KKyAgICAgICAgeiA9IFB5Q29tcGxleF9Bc0NDb21wbGV4KG8pOworICAgICAgICByZWFsX25lZ3plcm8gPSB6LnJlYWwgPT0gMC4wICYmIGNvcHlzaWduKDEuMCwgei5yZWFsKSA8IDAuMDsKKyAgICAgICAgaW1hZ19uZWd6ZXJvID0gei5pbWFnID09IDAuMCAmJiBjb3B5c2lnbigxLjAsIHouaW1hZykgPCAwLjA7CisgICAgICAgIGlmIChyZWFsX25lZ3plcm8gJiYgaW1hZ19uZWd6ZXJvKSB7CisgICAgICAgICAgICB0ID0gUHlUdXBsZV9QYWNrKDUsIG8sIG8tPm9iX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsIFB5X05vbmUsIFB5X05vbmUpOwogICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGltYWdfbmVnemVybykgeworICAgICAgICAgICAgdCA9IFB5VHVwbGVfUGFjayg0LCBvLCBvLT5vYl90eXBlLCBQeV9Ob25lLCBQeV9Ob25lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChyZWFsX25lZ3plcm8pIHsKKyAgICAgICAgICAgIHQgPSBQeVR1cGxlX1BhY2soMywgbywgby0+b2JfdHlwZSwgUHlfTm9uZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0ID0gUHlUdXBsZV9QYWNrKDIsIG8sIG8tPm9iX3R5cGUpOworICAgICAgICB9CisgICAgfQogI2VuZGlmIC8qIFdJVEhPVVRfQ09NUExFWCAqLwotCWVsc2UgewotCQl0ID0gUHlUdXBsZV9QYWNrKDIsIG8sIG8tPm9iX3R5cGUpOwotICAgICAgICB9Ci0JaWYgKHQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGVsc2UgeworICAgICAgICB0ID0gUHlUdXBsZV9QYWNrKDIsIG8sIG8tPm9iX3R5cGUpOworICAgIH0KKyAgICBpZiAodCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQl2ID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgdCk7Ci0JaWYgKCF2KSB7Ci0JCWFyZyA9IFB5RGljdF9TaXplKGRpY3QpOwotCQl2ID0gUHlJbnRfRnJvbUxvbmcoYXJnKTsKLQkJaWYgKCF2KSB7Ci0JCQlQeV9ERUNSRUYodCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIHQsIHYpIDwgMCkgewotCQkJUHlfREVDUkVGKHQpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0RFQ1JFRih2KTsKLQl9Ci0JZWxzZQotCQlhcmcgPSBQeUludF9Bc0xvbmcodik7Ci0JUHlfREVDUkVGKHQpOwotCXJldHVybiBhcmc7CisgICAgdiA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIHQpOworICAgIGlmICghdikgeworICAgICAgICBhcmcgPSBQeURpY3RfU2l6ZShkaWN0KTsKKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKGFyZyk7CisgICAgICAgIGlmICghdikgeworICAgICAgICAgICAgUHlfREVDUkVGKHQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShkaWN0LCB0LCB2KSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgYXJnID0gUHlJbnRfQXNMb25nKHYpOworICAgIFB5X0RFQ1JFRih0KTsKKyAgICByZXR1cm4gYXJnOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9hZGRvcF9vKHN0cnVjdCBjb21waWxlciAqYywgaW50IG9wY29kZSwgUHlPYmplY3QgKmRpY3QsCi0JCSAgICAgUHlPYmplY3QgKm8pCisgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbykKIHsKICAgICBpbnQgYXJnID0gY29tcGlsZXJfYWRkX28oYywgZGljdCwgbyk7CiAgICAgaWYgKGFyZyA8IDApCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAgICAgcmV0dXJuIGNvbXBpbGVyX2FkZG9wX2koYywgb3Bjb2RlLCBhcmcpOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9hZGRvcF9uYW1lKHN0cnVjdCBjb21waWxlciAqYywgaW50IG9wY29kZSwgUHlPYmplY3QgKmRpY3QsCi0JCSAgICBQeU9iamVjdCAqbykKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8pCiB7CiAgICAgaW50IGFyZzsKICAgICBQeU9iamVjdCAqbWFuZ2xlZCA9IF9QeV9NYW5nbGUoYy0+dS0+dV9wcml2YXRlLCBvKTsKICAgICBpZiAoIW1hbmdsZWQpCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAgICAgYXJnID0gY29tcGlsZXJfYWRkX28oYywgZGljdCwgbWFuZ2xlZCk7CiAgICAgUHlfREVDUkVGKG1hbmdsZWQpOwogICAgIGlmIChhcmcgPCAwKQotCXJldHVybiAwOworICAgIHJldHVybiAwOwogICAgIHJldHVybiBjb21waWxlcl9hZGRvcF9pKGMsIG9wY29kZSwgYXJnKTsKIH0KIApAQCAtMTAyMCw0MyArMTAyMCw0MyBAQAogc3RhdGljIGludAogY29tcGlsZXJfYWRkb3BfaShzdHJ1Y3QgY29tcGlsZXIgKmMsIGludCBvcGNvZGUsIGludCBvcGFyZykKIHsKLQlzdHJ1Y3QgaW5zdHIgKmk7Ci0JaW50IG9mZjsKLQlvZmYgPSBjb21waWxlcl9uZXh0X2luc3RyKGMsIGMtPnUtPnVfY3VyYmxvY2spOwotCWlmIChvZmYgPCAwKQotCQlyZXR1cm4gMDsKLQlpID0gJmMtPnUtPnVfY3VyYmxvY2stPmJfaW5zdHJbb2ZmXTsKLQlpLT5pX29wY29kZSA9IG9wY29kZTsKLQlpLT5pX29wYXJnID0gb3Bhcmc7Ci0JaS0+aV9oYXNhcmcgPSAxOwotCWNvbXBpbGVyX3NldF9saW5lbm8oYywgb2ZmKTsKLQlyZXR1cm4gMTsKKyAgICBzdHJ1Y3QgaW5zdHIgKmk7CisgICAgaW50IG9mZjsKKyAgICBvZmYgPSBjb21waWxlcl9uZXh0X2luc3RyKGMsIGMtPnUtPnVfY3VyYmxvY2spOworICAgIGlmIChvZmYgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpID0gJmMtPnUtPnVfY3VyYmxvY2stPmJfaW5zdHJbb2ZmXTsKKyAgICBpLT5pX29wY29kZSA9IG9wY29kZTsKKyAgICBpLT5pX29wYXJnID0gb3Bhcmc7CisgICAgaS0+aV9oYXNhcmcgPSAxOworICAgIGNvbXBpbGVyX3NldF9saW5lbm8oYywgb2ZmKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfYWRkb3BfaihzdHJ1Y3QgY29tcGlsZXIgKmMsIGludCBvcGNvZGUsIGJhc2ljYmxvY2sgKmIsIGludCBhYnNvbHV0ZSkKIHsKLQlzdHJ1Y3QgaW5zdHIgKmk7Ci0JaW50IG9mZjsKKyAgICBzdHJ1Y3QgaW5zdHIgKmk7CisgICAgaW50IG9mZjsKIAotCWFzc2VydChiICE9IE5VTEwpOwotCW9mZiA9IGNvbXBpbGVyX25leHRfaW5zdHIoYywgYy0+dS0+dV9jdXJibG9jayk7Ci0JaWYgKG9mZiA8IDApCi0JCXJldHVybiAwOwotCWkgPSAmYy0+dS0+dV9jdXJibG9jay0+Yl9pbnN0cltvZmZdOwotCWktPmlfb3Bjb2RlID0gb3Bjb2RlOwotCWktPmlfdGFyZ2V0ID0gYjsKLQlpLT5pX2hhc2FyZyA9IDE7Ci0JaWYgKGFic29sdXRlKQotCQlpLT5pX2phYnMgPSAxOwotCWVsc2UKLQkJaS0+aV9qcmVsID0gMTsKLQljb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7Ci0JcmV0dXJuIDE7CisgICAgYXNzZXJ0KGIgIT0gTlVMTCk7CisgICAgb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKKyAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaSA9ICZjLT51LT51X2N1cmJsb2NrLT5iX2luc3RyW29mZl07CisgICAgaS0+aV9vcGNvZGUgPSBvcGNvZGU7CisgICAgaS0+aV90YXJnZXQgPSBiOworICAgIGktPmlfaGFzYXJnID0gMTsKKyAgICBpZiAoYWJzb2x1dGUpCisgICAgICAgIGktPmlfamFicyA9IDE7CisgICAgZWxzZQorICAgICAgICBpLT5pX2pyZWwgPSAxOworICAgIGNvbXBpbGVyX3NldF9saW5lbm8oYywgb2ZmKTsKKyAgICByZXR1cm4gMTsKIH0KIAotLyogVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTkVXX0JMT0NLIGFuZCBORVhUX0JMT0NLIGlzIHN1YnRsZS4JKEknZAotICAgbGlrZSB0byBmaW5kIGJldHRlciBuYW1lcy4pCU5FV19CTE9DSygpIGNyZWF0ZXMgYSBuZXcgYmxvY2sgYW5kIHNldHMKKy8qIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE5FV19CTE9DSyBhbmQgTkVYVF9CTE9DSyBpcyBzdWJ0bGUuICAoSSdkCisgICBsaWtlIHRvIGZpbmQgYmV0dGVyIG5hbWVzLikgIE5FV19CTE9DSygpIGNyZWF0ZXMgYSBuZXcgYmxvY2sgYW5kIHNldHMKICAgIGl0IGFzIHRoZSBjdXJyZW50IGJsb2NrLiAgTkVYVF9CTE9DSygpIGFsc28gY3JlYXRlcyBhbiBpbXBsaWNpdCBqdW1wCiAgICBmcm9tIHRoZSBjdXJyZW50IGJsb2NrIHRvIHRoZSBuZXcgYmxvY2suCiAqLwpAQCAtMTA2Nyw1MCArMTA2Nyw1MCBAQAogCiAKICNkZWZpbmUgTkVXX0JMT0NLKEMpIHsgXAotCWlmIChjb21waWxlcl91c2VfbmV3X2Jsb2NrKChDKSkgPT0gTlVMTCkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmIChjb21waWxlcl91c2VfbmV3X2Jsb2NrKChDKSkgPT0gTlVMTCkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAjZGVmaW5lIE5FWFRfQkxPQ0soQykgeyBcCi0JaWYgKGNvbXBpbGVyX25leHRfYmxvY2soKEMpKSA9PSBOVUxMKSBcCi0JCXJldHVybiAwOyBcCisgICAgaWYgKGNvbXBpbGVyX25leHRfYmxvY2soKEMpKSA9PSBOVUxMKSBcCisgICAgICAgIHJldHVybiAwOyBcCiB9CiAKICNkZWZpbmUgQURET1AoQywgT1ApIHsgXAotCWlmICghY29tcGlsZXJfYWRkb3AoKEMpLCAoT1ApKSkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3AoKEMpLCAoT1ApKSkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAjZGVmaW5lIEFERE9QX0lOX1NDT1BFKEMsIE9QKSB7IFwKLQlpZiAoIWNvbXBpbGVyX2FkZG9wKChDKSwgKE9QKSkpIHsgXAotCQljb21waWxlcl9leGl0X3Njb3BlKGMpOyBcCi0JCXJldHVybiAwOyBcCi0JfSBcCisgICAgaWYgKCFjb21waWxlcl9hZGRvcCgoQyksIChPUCkpKSB7IFwKKyAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAogfQogCiAjZGVmaW5lIEFERE9QX08oQywgT1AsIE8sIFRZUEUpIHsgXAotCWlmICghY29tcGlsZXJfYWRkb3BfbygoQyksIChPUCksIChDKS0+dS0+dV8gIyMgVFlQRSwgKE8pKSkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3BfbygoQyksIChPUCksIChDKS0+dS0+dV8gIyMgVFlQRSwgKE8pKSkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAjZGVmaW5lIEFERE9QX05BTUUoQywgT1AsIE8sIFRZUEUpIHsgXAotCWlmICghY29tcGlsZXJfYWRkb3BfbmFtZSgoQyksIChPUCksIChDKS0+dS0+dV8gIyMgVFlQRSwgKE8pKSkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3BfbmFtZSgoQyksIChPUCksIChDKS0+dS0+dV8gIyMgVFlQRSwgKE8pKSkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAjZGVmaW5lIEFERE9QX0koQywgT1AsIE8pIHsgXAotCWlmICghY29tcGlsZXJfYWRkb3BfaSgoQyksIChPUCksIChPKSkpIFwKLQkJcmV0dXJuIDA7IFwKKyAgICBpZiAoIWNvbXBpbGVyX2FkZG9wX2koKEMpLCAoT1ApLCAoTykpKSBcCisgICAgICAgIHJldHVybiAwOyBcCiB9CiAKICNkZWZpbmUgQURET1BfSkFCUyhDLCBPUCwgTykgeyBcCi0JaWYgKCFjb21waWxlcl9hZGRvcF9qKChDKSwgKE9QKSwgKE8pLCAxKSkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3BfaigoQyksIChPUCksIChPKSwgMSkpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAogI2RlZmluZSBBRERPUF9KUkVMKEMsIE9QLCBPKSB7IFwKLQlpZiAoIWNvbXBpbGVyX2FkZG9wX2ooKEMpLCAoT1ApLCAoTyksIDApKSBcCi0JCXJldHVybiAwOyBcCisgICAgaWYgKCFjb21waWxlcl9hZGRvcF9qKChDKSwgKE9QKSwgKE8pLCAwKSkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAvKiBWSVNJVCBhbmQgVklTSVRfU0VRIHRha2VzIGFuIEFTREwgdHlwZSBhcyB0aGVpciBzZWNvbmQgYXJndW1lbnQuICBUaGV5IHVzZQpAQCAtMTExOCw0OSArMTExOCw0OSBAQAogKi8KIAogI2RlZmluZSBWSVNJVChDLCBUWVBFLCBWKSB7XAotCWlmICghY29tcGlsZXJfdmlzaXRfICMjIFRZUEUoKEMpLCAoVikpKSBcCi0JCXJldHVybiAwOyBcCisgICAgaWYgKCFjb21waWxlcl92aXNpdF8gIyMgVFlQRSgoQyksIChWKSkpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAogI2RlZmluZSBWSVNJVF9JTl9TQ09QRShDLCBUWVBFLCBWKSB7XAotCWlmICghY29tcGlsZXJfdmlzaXRfICMjIFRZUEUoKEMpLCAoVikpKSB7IFwKLQkJY29tcGlsZXJfZXhpdF9zY29wZShjKTsgXAotCQlyZXR1cm4gMDsgXAotCX0gXAorICAgIGlmICghY29tcGlsZXJfdmlzaXRfICMjIFRZUEUoKEMpLCAoVikpKSB7IFwKKyAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAogfQogCiAjZGVmaW5lIFZJU0lUX1NMSUNFKEMsIFYsIENUWCkge1wKLQlpZiAoIWNvbXBpbGVyX3Zpc2l0X3NsaWNlKChDKSwgKFYpLCAoQ1RYKSkpIFwKLQkJcmV0dXJuIDA7IFwKKyAgICBpZiAoIWNvbXBpbGVyX3Zpc2l0X3NsaWNlKChDKSwgKFYpLCAoQ1RYKSkpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAogI2RlZmluZSBWSVNJVF9TRVEoQywgVFlQRSwgU0VRKSB7IFwKLQlpbnQgX2k7IFwKLQlhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAotCWZvciAoX2kgPSAwOyBfaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBfaSsrKSB7IFwKLQkJVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIF9pKTsgXAotCQlpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgZWx0KSkgXAotCQkJcmV0dXJuIDA7IFwKLQl9IFwKKyAgICBpbnQgX2k7IFwKKyAgICBhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAorICAgIGZvciAoX2kgPSAwOyBfaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBfaSsrKSB7IFwKKyAgICAgICAgVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIF9pKTsgXAorICAgICAgICBpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgZWx0KSkgXAorICAgICAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKIH0KIAogI2RlZmluZSBWSVNJVF9TRVFfSU5fU0NPUEUoQywgVFlQRSwgU0VRKSB7IFwKLQlpbnQgX2k7IFwKLQlhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAotCWZvciAoX2kgPSAwOyBfaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBfaSsrKSB7IFwKLQkJVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIF9pKTsgXAotCQlpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgZWx0KSkgeyBcCi0JCQljb21waWxlcl9leGl0X3Njb3BlKGMpOyBcCi0JCQlyZXR1cm4gMDsgXAotCQl9IFwKLQl9IFwKKyAgICBpbnQgX2k7IFwKKyAgICBhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAorICAgIGZvciAoX2kgPSAwOyBfaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBfaSsrKSB7IFwKKyAgICAgICAgVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIF9pKTsgXAorICAgICAgICBpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgZWx0KSkgeyBcCisgICAgICAgICAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOyBcCisgICAgICAgICAgICByZXR1cm4gMDsgXAorICAgICAgICB9IFwKKyAgICB9IFwKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfaXNkb2NzdHJpbmcoc3RtdF90eSBzKQogewogICAgIGlmIChzLT5raW5kICE9IEV4cHJfa2luZCkKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKICAgICByZXR1cm4gcy0+di5FeHByLnZhbHVlLT5raW5kID09IFN0cl9raW5kOwogfQogCkBAIC0xMTY5LDY3ICsxMTY5LDY3IEBACiBzdGF0aWMgaW50CiBjb21waWxlcl9ib2R5KHN0cnVjdCBjb21waWxlciAqYywgYXNkbF9zZXEgKnN0bXRzKQogewotCWludCBpID0gMDsKLQlzdG10X3R5IHN0OworICAgIGludCBpID0gMDsKKyAgICBzdG10X3R5IHN0OwogCi0JaWYgKCFhc2RsX3NlcV9MRU4oc3RtdHMpKQotCQlyZXR1cm4gMTsKLQlzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzdG10cywgMCk7Ci0JaWYgKGNvbXBpbGVyX2lzZG9jc3RyaW5nKHN0KSAmJiBQeV9PcHRpbWl6ZUZsYWcgPCAyKSB7Ci0JCS8qIGRvbid0IGdlbmVyYXRlIGRvY3N0cmluZ3MgaWYgLU9PICovCi0JCWkgPSAxOwotCQlWSVNJVChjLCBleHByLCBzdC0+di5FeHByLnZhbHVlKTsKLQkJaWYgKCFjb21waWxlcl9uYW1lb3AoYywgX19kb2NfXywgU3RvcmUpKQotCQkJcmV0dXJuIDA7Ci0JfQotCWZvciAoOyBpIDwgYXNkbF9zZXFfTEVOKHN0bXRzKTsgaSsrKQotCSAgICBWSVNJVChjLCBzdG10LCAoc3RtdF90eSlhc2RsX3NlcV9HRVQoc3RtdHMsIGkpKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIWFzZGxfc2VxX0xFTihzdG10cykpCisgICAgICAgIHJldHVybiAxOworICAgIHN0ID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHN0bXRzLCAwKTsKKyAgICBpZiAoY29tcGlsZXJfaXNkb2NzdHJpbmcoc3QpICYmIFB5X09wdGltaXplRmxhZyA8IDIpIHsKKyAgICAgICAgLyogZG9uJ3QgZ2VuZXJhdGUgZG9jc3RyaW5ncyBpZiAtT08gKi8KKyAgICAgICAgaSA9IDE7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHN0LT52LkV4cHIudmFsdWUpOworICAgICAgICBpZiAoIWNvbXBpbGVyX25hbWVvcChjLCBfX2RvY19fLCBTdG9yZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yICg7IGkgPCBhc2RsX3NlcV9MRU4oc3RtdHMpOyBpKyspCisgICAgICAgIFZJU0lUKGMsIHN0bXQsIChzdG10X3R5KWFzZGxfc2VxX0dFVChzdG10cywgaSkpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlDb2RlT2JqZWN0ICoKIGNvbXBpbGVyX21vZChzdHJ1Y3QgY29tcGlsZXIgKmMsIG1vZF90eSBtb2QpCiB7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKLQlpbnQgYWRkTm9uZSA9IDE7Ci0Jc3RhdGljIFB5T2JqZWN0ICptb2R1bGU7Ci0JaWYgKCFtb2R1bGUpIHsKLQkJbW9kdWxlID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiPG1vZHVsZT4iKTsKLQkJaWYgKCFtb2R1bGUpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogVXNlIDAgZm9yIGZpcnN0bGluZW5vIGluaXRpYWxseSwgd2lsbCBmaXh1cCBpbiBhc3NlbWJsZSgpLiAqLwotCWlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbW9kdWxlLCBtb2QsIDApKQotCQlyZXR1cm4gTlVMTDsKLQlzd2l0Y2ggKG1vZC0+a2luZCkgewotCWNhc2UgTW9kdWxlX2tpbmQ6IAotCQlpZiAoIWNvbXBpbGVyX2JvZHkoYywgbW9kLT52Lk1vZHVsZS5ib2R5KSkgewotCQkJY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSW50ZXJhY3RpdmVfa2luZDoKLQkJYy0+Y19pbnRlcmFjdGl2ZSA9IDE7Ci0JCVZJU0lUX1NFUV9JTl9TQ09QRShjLCBzdG10LCAKLQkJCQkJbW9kLT52LkludGVyYWN0aXZlLmJvZHkpOwotCQlicmVhazsKLQljYXNlIEV4cHJlc3Npb25fa2luZDoKLQkJVklTSVRfSU5fU0NPUEUoYywgZXhwciwgbW9kLT52LkV4cHJlc3Npb24uYm9keSk7Ci0JCWFkZE5vbmUgPSAwOwotCQlicmVhazsKLQljYXNlIFN1aXRlX2tpbmQ6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkic3VpdGUgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIpOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgICJtb2R1bGUga2luZCAlZCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIiwKLQkJCSAgICAgbW9kLT5raW5kKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNvID0gYXNzZW1ibGUoYywgYWRkTm9uZSk7Ci0JY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQlyZXR1cm4gY287CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKKyAgICBpbnQgYWRkTm9uZSA9IDE7CisgICAgc3RhdGljIFB5T2JqZWN0ICptb2R1bGU7CisgICAgaWYgKCFtb2R1bGUpIHsKKyAgICAgICAgbW9kdWxlID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiPG1vZHVsZT4iKTsKKyAgICAgICAgaWYgKCFtb2R1bGUpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogVXNlIDAgZm9yIGZpcnN0bGluZW5vIGluaXRpYWxseSwgd2lsbCBmaXh1cCBpbiBhc3NlbWJsZSgpLiAqLworICAgIGlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbW9kdWxlLCBtb2QsIDApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzd2l0Y2ggKG1vZC0+a2luZCkgeworICAgIGNhc2UgTW9kdWxlX2tpbmQ6CisgICAgICAgIGlmICghY29tcGlsZXJfYm9keShjLCBtb2QtPnYuTW9kdWxlLmJvZHkpKSB7CisgICAgICAgICAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRlcmFjdGl2ZV9raW5kOgorICAgICAgICBjLT5jX2ludGVyYWN0aXZlID0gMTsKKyAgICAgICAgVklTSVRfU0VRX0lOX1NDT1BFKGMsIHN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC0+di5JbnRlcmFjdGl2ZS5ib2R5KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFeHByZXNzaW9uX2tpbmQ6CisgICAgICAgIFZJU0lUX0lOX1NDT1BFKGMsIGV4cHIsIG1vZC0+di5FeHByZXNzaW9uLmJvZHkpOworICAgICAgICBhZGROb25lID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTdWl0ZV9raW5kOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3VpdGUgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibW9kdWxlIGtpbmQgJWQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsCisgICAgICAgICAgICAgICAgICAgICBtb2QtPmtpbmQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY28gPSBhc3NlbWJsZShjLCBhZGROb25lKTsKKyAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgIHJldHVybiBjbzsKIH0KIAogLyogVGhlIHRlc3QgZm9yIExPQ0FMIG11c3QgY29tZSBiZWZvcmUgdGhlIHRlc3QgZm9yIEZSRUUgaW4gb3JkZXIgdG8KQEAgLTEyNDAsMjQgKzEyNDAsMjQgQEAKIHN0YXRpYyBpbnQKIGdldF9yZWZfdHlwZShzdHJ1Y3QgY29tcGlsZXIgKmMsIFB5T2JqZWN0ICpuYW1lKQogewotCWludCBzY29wZSA9IFB5U1RfR2V0U2NvcGUoYy0+dS0+dV9zdGUsIG5hbWUpOwotCWlmIChzY29wZSA9PSAwKSB7Ci0JICAgIGNoYXIgYnVmWzM1MF07Ci0JICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgInVua25vd24gc2NvcGUgZm9yICUuMTAwcyBpbiAlLjEwMHMoJXMpIGluICVzXG4iCi0JCQkgICJzeW1ib2xzOiAlc1xubG9jYWxzOiAlc1xuZ2xvYmFsczogJXMiLAotCQkJICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksIAotCQkJICBQeVN0cmluZ19BU19TVFJJTkcoYy0+dS0+dV9uYW1lKSwgCi0JCQkgIFB5T2JqZWN0X1JFUFIoYy0+dS0+dV9zdGUtPnN0ZV9pZCksCi0JCQkgIGMtPmNfZmlsZW5hbWUsCi0JCQkgIFB5T2JqZWN0X1JFUFIoYy0+dS0+dV9zdGUtPnN0ZV9zeW1ib2xzKSwKLQkJCSAgUHlPYmplY3RfUkVQUihjLT51LT51X3Zhcm5hbWVzKSwKLQkJCSAgUHlPYmplY3RfUkVQUihjLT51LT51X25hbWVzKQotCQkpOwotCSAgICBQeV9GYXRhbEVycm9yKGJ1Zik7Ci0JfQorICAgIGludCBzY29wZSA9IFB5U1RfR2V0U2NvcGUoYy0+dS0+dV9zdGUsIG5hbWUpOworICAgIGlmIChzY29wZSA9PSAwKSB7CisgICAgICAgIGNoYXIgYnVmWzM1MF07CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBzY29wZSBmb3IgJS4xMDBzIGluICUuMTAwcyglcykgaW4gJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAic3ltYm9sczogJXNcbmxvY2FsczogJXNcbmdsb2JhbHM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGMtPnUtPnVfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfUkVQUihjLT51LT51X3N0ZS0+c3RlX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICBjLT5jX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JFUFIoYy0+dS0+dV9zdGUtPnN0ZV9zeW1ib2xzKSwKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdF9SRVBSKGMtPnUtPnVfdmFybmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JFUFIoYy0+dS0+dV9uYW1lcykKKyAgICAgICAgKTsKKyAgICAgICAgUHlfRmF0YWxFcnJvcihidWYpOworICAgIH0KIAotCXJldHVybiBzY29wZTsKKyAgICByZXR1cm4gc2NvcGU7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTEyNjYsNTA1ICsxMjY2LDUwNSBAQAogICAgIFB5T2JqZWN0ICprLCAqdjsKICAgICBrID0gUHlUdXBsZV9QYWNrKDIsIG5hbWUsIG5hbWUtPm9iX3R5cGUpOwogICAgIGlmIChrID09IE5VTEwpCi0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKICAgICB2ID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgayk7CiAgICAgUHlfREVDUkVGKGspOwogICAgIGlmICh2ID09IE5VTEwpCi0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKICAgICByZXR1cm4gUHlJbnRfQVNfTE9ORyh2KTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfbWFrZV9jbG9zdXJlKHN0cnVjdCBjb21waWxlciAqYywgUHlDb2RlT2JqZWN0ICpjbywgaW50IGFyZ3MpCiB7Ci0JaW50IGksIGZyZWUgPSBQeUNvZGVfR2V0TnVtRnJlZShjbyk7Ci0JaWYgKGZyZWUgPT0gMCkgewotCSAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIChQeU9iamVjdCopY28sIGNvbnN0cyk7Ci0JICAgIEFERE9QX0koYywgTUFLRV9GVU5DVElPTiwgYXJncyk7Ci0JICAgIHJldHVybiAxOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgZnJlZTsgKytpKSB7Ci0JCS8qIEJ5cGFzcyBjb21fYWRkb3BfdmFybmFtZSBiZWNhdXNlIGl0IHdpbGwgZ2VuZXJhdGUKLQkJICAgTE9BRF9ERVJFRiBidXQgTE9BRF9DTE9TVVJFIGlzIG5lZWRlZC4gCi0JCSovCi0JCVB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fZnJlZXZhcnMsIGkpOwotCQlpbnQgYXJnLCByZWZ0eXBlOworICAgIGludCBpLCBmcmVlID0gUHlDb2RlX0dldE51bUZyZWUoY28pOworICAgIGlmIChmcmVlID09IDApIHsKKyAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCAoUHlPYmplY3QqKWNvLCBjb25zdHMpOworICAgICAgICBBRERPUF9JKGMsIE1BS0VfRlVOQ1RJT04sIGFyZ3MpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGZyZWU7ICsraSkgeworICAgICAgICAvKiBCeXBhc3MgY29tX2FkZG9wX3Zhcm5hbWUgYmVjYXVzZSBpdCB3aWxsIGdlbmVyYXRlCisgICAgICAgICAgIExPQURfREVSRUYgYnV0IExPQURfQ0xPU1VSRSBpcyBuZWVkZWQuCisgICAgICAgICovCisgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fZnJlZXZhcnMsIGkpOworICAgICAgICBpbnQgYXJnLCByZWZ0eXBlOwogCi0JCS8qIFNwZWNpYWwgY2FzZTogSWYgYSBjbGFzcyBjb250YWlucyBhIG1ldGhvZCB3aXRoIGEKLQkJICAgZnJlZSB2YXJpYWJsZSB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgbWV0aG9kLAotCQkgICB0aGUgbmFtZSB3aWxsIGJlIGNvbnNpZGVyZWQgZnJlZSAqYW5kKiBsb2NhbCBpbiB0aGUKLQkJICAgY2xhc3MuICBJdCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgY2xvc3VyZSwgYXMKLQkJICAgd2VsbCBhcyBieSB0aGUgbm9ybWFsIG5hbWUgbG9vb2t1cCBsb2dpYy4KLQkJKi8KLQkJcmVmdHlwZSA9IGdldF9yZWZfdHlwZShjLCBuYW1lKTsKLQkJaWYgKHJlZnR5cGUgPT0gQ0VMTCkKLQkJCWFyZyA9IGNvbXBpbGVyX2xvb2t1cF9hcmcoYy0+dS0+dV9jZWxsdmFycywgbmFtZSk7Ci0JCWVsc2UgLyogKHJlZnR5cGUgPT0gRlJFRSkgKi8KLQkJCWFyZyA9IGNvbXBpbGVyX2xvb2t1cF9hcmcoYy0+dS0+dV9mcmVldmFycywgbmFtZSk7Ci0JCWlmIChhcmcgPT0gLTEpIHsKLQkJCXByaW50ZigibG9va3VwICVzIGluICVzICVkICVkXG4iCi0JCQkJImZyZWV2YXJzIG9mICVzOiAlc1xuIiwKLQkJCQlQeU9iamVjdF9SRVBSKG5hbWUpLCAKLQkJCQlQeVN0cmluZ19BU19TVFJJTkcoYy0+dS0+dV9uYW1lKSwgCi0JCQkJcmVmdHlwZSwgYXJnLAotCQkJCVB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fbmFtZSksCi0JCQkJUHlPYmplY3RfUkVQUihjby0+Y29fZnJlZXZhcnMpKTsKLQkJCVB5X0ZhdGFsRXJyb3IoImNvbXBpbGVyX21ha2VfY2xvc3VyZSgpIik7Ci0JCX0KLQkJQURET1BfSShjLCBMT0FEX0NMT1NVUkUsIGFyZyk7Ci0JfQotCUFERE9QX0koYywgQlVJTERfVFVQTEUsIGZyZWUpOwotCUFERE9QX08oYywgTE9BRF9DT05TVCwgKFB5T2JqZWN0KiljbywgY29uc3RzKTsKLQlBRERPUF9JKGMsIE1BS0VfQ0xPU1VSRSwgYXJncyk7Ci0JcmV0dXJuIDE7CisgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogSWYgYSBjbGFzcyBjb250YWlucyBhIG1ldGhvZCB3aXRoIGEKKyAgICAgICAgICAgZnJlZSB2YXJpYWJsZSB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgbWV0aG9kLAorICAgICAgICAgICB0aGUgbmFtZSB3aWxsIGJlIGNvbnNpZGVyZWQgZnJlZSAqYW5kKiBsb2NhbCBpbiB0aGUKKyAgICAgICAgICAgY2xhc3MuICBJdCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgY2xvc3VyZSwgYXMKKyAgICAgICAgICAgd2VsbCBhcyBieSB0aGUgbm9ybWFsIG5hbWUgbG9vb2t1cCBsb2dpYy4KKyAgICAgICAgKi8KKyAgICAgICAgcmVmdHlwZSA9IGdldF9yZWZfdHlwZShjLCBuYW1lKTsKKyAgICAgICAgaWYgKHJlZnR5cGUgPT0gQ0VMTCkKKyAgICAgICAgICAgIGFyZyA9IGNvbXBpbGVyX2xvb2t1cF9hcmcoYy0+dS0+dV9jZWxsdmFycywgbmFtZSk7CisgICAgICAgIGVsc2UgLyogKHJlZnR5cGUgPT0gRlJFRSkgKi8KKyAgICAgICAgICAgIGFyZyA9IGNvbXBpbGVyX2xvb2t1cF9hcmcoYy0+dS0+dV9mcmVldmFycywgbmFtZSk7CisgICAgICAgIGlmIChhcmcgPT0gLTEpIHsKKyAgICAgICAgICAgIHByaW50ZigibG9va3VwICVzIGluICVzICVkICVkXG4iCisgICAgICAgICAgICAgICAgImZyZWV2YXJzIG9mICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBQeU9iamVjdF9SRVBSKG5hbWUpLAorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhjLT51LT51X25hbWUpLAorICAgICAgICAgICAgICAgIHJlZnR5cGUsIGFyZywKKyAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoY28tPmNvX25hbWUpLAorICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JFUFIoY28tPmNvX2ZyZWV2YXJzKSk7CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjb21waWxlcl9tYWtlX2Nsb3N1cmUoKSIpOworICAgICAgICB9CisgICAgICAgIEFERE9QX0koYywgTE9BRF9DTE9TVVJFLCBhcmcpOworICAgIH0KKyAgICBBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBmcmVlKTsKKyAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIChQeU9iamVjdCopY28sIGNvbnN0cyk7CisgICAgQURET1BfSShjLCBNQUtFX0NMT1NVUkUsIGFyZ3MpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9kZWNvcmF0b3JzKHN0cnVjdCBjb21waWxlciAqYywgYXNkbF9zZXEqIGRlY29zKQogewotCWludCBpOworICAgIGludCBpOwogCi0JaWYgKCFkZWNvcykKLQkJcmV0dXJuIDE7CisgICAgaWYgKCFkZWNvcykKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGRlY29zKTsgaSsrKSB7Ci0JCVZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChkZWNvcywgaSkpOwotCX0KLQlyZXR1cm4gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGRlY29zKTsgaSsrKSB7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChkZWNvcywgaSkpOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfYXJndW1lbnRzKHN0cnVjdCBjb21waWxlciAqYywgYXJndW1lbnRzX3R5IGFyZ3MpCiB7Ci0JaW50IGk7Ci0JaW50IG4gPSBhc2RsX3NlcV9MRU4oYXJncy0+YXJncyk7Ci0JLyogQ29ycmVjdGx5IGhhbmRsZSBuZXN0ZWQgYXJndW1lbnQgbGlzdHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWV4cHJfdHkgYXJnID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGFyZ3MtPmFyZ3MsIGkpOwotCQlpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQpIHsKLQkJCVB5T2JqZWN0ICppZCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIi4lZCIsIGkpOwotCQkJaWYgKGlkID09IE5VTEwpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmICghY29tcGlsZXJfbmFtZW9wKGMsIGlkLCBMb2FkKSkgewotCQkJCVB5X0RFQ1JFRihpZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoaWQpOwotCQkJVklTSVQoYywgZXhwciwgYXJnKTsKLQkJfQotCX0KLQlyZXR1cm4gMTsKKyAgICBpbnQgaTsKKyAgICBpbnQgbiA9IGFzZGxfc2VxX0xFTihhcmdzLT5hcmdzKTsKKyAgICAvKiBDb3JyZWN0bHkgaGFuZGxlIG5lc3RlZCBhcmd1bWVudCBsaXN0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZXhwcl90eSBhcmcgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoYXJncy0+YXJncywgaSk7CisgICAgICAgIGlmIChhcmctPmtpbmQgPT0gVHVwbGVfa2luZCkgeworICAgICAgICAgICAgUHlPYmplY3QgKmlkID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiLiVkIiwgaSk7CisgICAgICAgICAgICBpZiAoaWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjb21waWxlcl9uYW1lb3AoYywgaWQsIExvYWQpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihpZCk7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBhcmcpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9mdW5jdGlvbihzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5T2JqZWN0ICpmaXJzdF9jb25zdCA9IFB5X05vbmU7Ci0JYXJndW1lbnRzX3R5IGFyZ3MgPSBzLT52LkZ1bmN0aW9uRGVmLmFyZ3M7Ci0JYXNkbF9zZXEqIGRlY29zID0gcy0+di5GdW5jdGlvbkRlZi5kZWNvcmF0b3JfbGlzdDsKLQlzdG10X3R5IHN0OwotCWludCBpLCBuLCBkb2NzdHJpbmc7CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKKyAgICBQeU9iamVjdCAqZmlyc3RfY29uc3QgPSBQeV9Ob25lOworICAgIGFyZ3VtZW50c190eSBhcmdzID0gcy0+di5GdW5jdGlvbkRlZi5hcmdzOworICAgIGFzZGxfc2VxKiBkZWNvcyA9IHMtPnYuRnVuY3Rpb25EZWYuZGVjb3JhdG9yX2xpc3Q7CisgICAgc3RtdF90eSBzdDsKKyAgICBpbnQgaSwgbiwgZG9jc3RyaW5nOwogCi0JYXNzZXJ0KHMtPmtpbmQgPT0gRnVuY3Rpb25EZWZfa2luZCk7CisgICAgYXNzZXJ0KHMtPmtpbmQgPT0gRnVuY3Rpb25EZWZfa2luZCk7CiAKLQlpZiAoIWNvbXBpbGVyX2RlY29yYXRvcnMoYywgZGVjb3MpKQotCQlyZXR1cm4gMDsKLQlpZiAoYXJncy0+ZGVmYXVsdHMpCi0JCVZJU0lUX1NFUShjLCBleHByLCBhcmdzLT5kZWZhdWx0cyk7Ci0JaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBzLT52LkZ1bmN0aW9uRGVmLm5hbWUsICh2b2lkICopcywKLQkJCQkgIHMtPmxpbmVubykpCi0JCXJldHVybiAwOworICAgIGlmICghY29tcGlsZXJfZGVjb3JhdG9ycyhjLCBkZWNvcykpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhcmdzLT5kZWZhdWx0cykKKyAgICAgICAgVklTSVRfU0VRKGMsIGV4cHIsIGFyZ3MtPmRlZmF1bHRzKTsKKyAgICBpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIHMtPnYuRnVuY3Rpb25EZWYubmFtZSwgKHZvaWQgKilzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZW5vKSkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzLT52LkZ1bmN0aW9uRGVmLmJvZHksIDApOwotCWRvY3N0cmluZyA9IGNvbXBpbGVyX2lzZG9jc3RyaW5nKHN0KTsKLQlpZiAoZG9jc3RyaW5nICYmIFB5X09wdGltaXplRmxhZyA8IDIpCi0JICAgIGZpcnN0X2NvbnN0ID0gc3QtPnYuRXhwci52YWx1ZS0+di5TdHIuczsKLQlpZiAoY29tcGlsZXJfYWRkX28oYywgYy0+dS0+dV9jb25zdHMsIGZpcnN0X2NvbnN0KSA8IDApCSB7Ci0JICAgIGNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7Ci0JICAgIHJldHVybiAwOwotCX0KKyAgICBzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzLT52LkZ1bmN0aW9uRGVmLmJvZHksIDApOworICAgIGRvY3N0cmluZyA9IGNvbXBpbGVyX2lzZG9jc3RyaW5nKHN0KTsKKyAgICBpZiAoZG9jc3RyaW5nICYmIFB5X09wdGltaXplRmxhZyA8IDIpCisgICAgICAgIGZpcnN0X2NvbnN0ID0gc3QtPnYuRXhwci52YWx1ZS0+di5TdHIuczsKKyAgICBpZiAoY29tcGlsZXJfYWRkX28oYywgYy0+dS0+dV9jb25zdHMsIGZpcnN0X2NvbnN0KSA8IDApICAgICAgeworICAgICAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiB1bnBhY2sgbmVzdGVkIGFyZ3VtZW50cyAqLwotCWNvbXBpbGVyX2FyZ3VtZW50cyhjLCBhcmdzKTsKKyAgICAvKiB1bnBhY2sgbmVzdGVkIGFyZ3VtZW50cyAqLworICAgIGNvbXBpbGVyX2FyZ3VtZW50cyhjLCBhcmdzKTsKIAotCWMtPnUtPnVfYXJnY291bnQgPSBhc2RsX3NlcV9MRU4oYXJncy0+YXJncyk7Ci0JbiA9IGFzZGxfc2VxX0xFTihzLT52LkZ1bmN0aW9uRGVmLmJvZHkpOwotCS8qIGlmIHRoZXJlIHdhcyBhIGRvY3N0cmluZywgd2UgbmVlZCB0byBza2lwIHRoZSBmaXJzdCBzdGF0ZW1lbnQgKi8KLQlmb3IgKGkgPSBkb2NzdHJpbmc7IGkgPCBuOyBpKyspIHsKLQkJc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQocy0+di5GdW5jdGlvbkRlZi5ib2R5LCBpKTsKLQkJVklTSVRfSU5fU0NPUEUoYywgc3RtdCwgc3QpOwotCX0KLQljbyA9IGFzc2VtYmxlKGMsIDEpOwotCWNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7Ci0JaWYgKGNvID09IE5VTEwpCi0JCXJldHVybiAwOworICAgIGMtPnUtPnVfYXJnY291bnQgPSBhc2RsX3NlcV9MRU4oYXJncy0+YXJncyk7CisgICAgbiA9IGFzZGxfc2VxX0xFTihzLT52LkZ1bmN0aW9uRGVmLmJvZHkpOworICAgIC8qIGlmIHRoZXJlIHdhcyBhIGRvY3N0cmluZywgd2UgbmVlZCB0byBza2lwIHRoZSBmaXJzdCBzdGF0ZW1lbnQgKi8KKyAgICBmb3IgKGkgPSBkb2NzdHJpbmc7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQocy0+di5GdW5jdGlvbkRlZi5ib2R5LCBpKTsKKyAgICAgICAgVklTSVRfSU5fU0NPUEUoYywgc3RtdCwgc3QpOworICAgIH0KKyAgICBjbyA9IGFzc2VtYmxlKGMsIDEpOworICAgIGNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7CisgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCi0JY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBhc2RsX3NlcV9MRU4oYXJncy0+ZGVmYXVsdHMpKTsKLQlQeV9ERUNSRUYoY28pOworICAgIGNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKSk7CisgICAgUHlfREVDUkVGKGNvKTsKIAotCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oZGVjb3MpOyBpKyspIHsKLQkJQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCAxKTsKLQl9CisgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihkZWNvcyk7IGkrKykgeworICAgICAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDEpOworICAgIH0KIAotCXJldHVybiBjb21waWxlcl9uYW1lb3AoYywgcy0+di5GdW5jdGlvbkRlZi5uYW1lLCBTdG9yZSk7CisgICAgcmV0dXJuIGNvbXBpbGVyX25hbWVvcChjLCBzLT52LkZ1bmN0aW9uRGVmLm5hbWUsIFN0b3JlKTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfY2xhc3Moc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JaW50IG4sIGk7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKLQlQeU9iamVjdCAqc3RyOwotCWFzZGxfc2VxKiBkZWNvcyA9IHMtPnYuQ2xhc3NEZWYuZGVjb3JhdG9yX2xpc3Q7Ci0JCi0JaWYgKCFjb21waWxlcl9kZWNvcmF0b3JzKGMsIGRlY29zKSkKLQkJcmV0dXJuIDA7CisgICAgaW50IG4sIGk7CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKKyAgICBQeU9iamVjdCAqc3RyOworICAgIGFzZGxfc2VxKiBkZWNvcyA9IHMtPnYuQ2xhc3NEZWYuZGVjb3JhdG9yX2xpc3Q7CiAKLQkvKiBwdXNoIGNsYXNzIG5hbWUgb24gc3RhY2ssIG5lZWRlZCBieSBCVUlMRF9DTEFTUyAqLwotCUFERE9QX08oYywgTE9BRF9DT05TVCwgcy0+di5DbGFzc0RlZi5uYW1lLCBjb25zdHMpOwotCS8qIHB1c2ggdGhlIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyBvbiB0aGUgc3RhY2sgKi8KLQluID0gYXNkbF9zZXFfTEVOKHMtPnYuQ2xhc3NEZWYuYmFzZXMpOwotCWlmIChuID4gMCkKLQkJVklTSVRfU0VRKGMsIGV4cHIsIHMtPnYuQ2xhc3NEZWYuYmFzZXMpOwotCUFERE9QX0koYywgQlVJTERfVFVQTEUsIG4pOwotCWlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgcy0+di5DbGFzc0RlZi5uYW1lLCAodm9pZCAqKXMsCi0JCQkJICBzLT5saW5lbm8pKQotCQlyZXR1cm4gMDsKLQlQeV9YREVDUkVGKGMtPnUtPnVfcHJpdmF0ZSk7Ci0JYy0+dS0+dV9wcml2YXRlID0gcy0+di5DbGFzc0RlZi5uYW1lOwotCVB5X0lOQ1JFRihjLT51LT51X3ByaXZhdGUpOwotCXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbmFtZV9fIik7Ci0JaWYgKCFzdHIgfHwgIWNvbXBpbGVyX25hbWVvcChjLCBzdHIsIExvYWQpKSB7Ci0JCVB5X1hERUNSRUYoc3RyKTsKLQkJY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQkJcmV0dXJuIDA7Ci0JfQotCQotCVB5X0RFQ1JFRihzdHIpOwotCXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbW9kdWxlX18iKTsKLQlpZiAoIXN0ciB8fCAhY29tcGlsZXJfbmFtZW9wKGMsIHN0ciwgU3RvcmUpKSB7Ci0JCVB5X1hERUNSRUYoc3RyKTsKLQkJY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQkJcmV0dXJuIDA7Ci0JfQotCVB5X0RFQ1JFRihzdHIpOworICAgIGlmICghY29tcGlsZXJfZGVjb3JhdG9ycyhjLCBkZWNvcykpCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCFjb21waWxlcl9ib2R5KGMsIHMtPnYuQ2xhc3NEZWYuYm9keSkpIHsKLQkJY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIHB1c2ggY2xhc3MgbmFtZSBvbiBzdGFjaywgbmVlZGVkIGJ5IEJVSUxEX0NMQVNTICovCisgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBzLT52LkNsYXNzRGVmLm5hbWUsIGNvbnN0cyk7CisgICAgLyogcHVzaCB0aGUgdHVwbGUgb2YgYmFzZSBjbGFzc2VzIG9uIHRoZSBzdGFjayAqLworICAgIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5DbGFzc0RlZi5iYXNlcyk7CisgICAgaWYgKG4gPiAwKQorICAgICAgICBWSVNJVF9TRVEoYywgZXhwciwgcy0+di5DbGFzc0RlZi5iYXNlcyk7CisgICAgQURET1BfSShjLCBCVUlMRF9UVVBMRSwgbik7CisgICAgaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBzLT52LkNsYXNzRGVmLm5hbWUsICh2b2lkICopcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVubykpCisgICAgICAgIHJldHVybiAwOworICAgIFB5X1hERUNSRUYoYy0+dS0+dV9wcml2YXRlKTsKKyAgICBjLT51LT51X3ByaXZhdGUgPSBzLT52LkNsYXNzRGVmLm5hbWU7CisgICAgUHlfSU5DUkVGKGMtPnUtPnVfcHJpdmF0ZSk7CisgICAgc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uYW1lX18iKTsKKyAgICBpZiAoIXN0ciB8fCAhY29tcGlsZXJfbmFtZW9wKGMsIHN0ciwgTG9hZCkpIHsKKyAgICAgICAgUHlfWERFQ1JFRihzdHIpOworICAgICAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlBRERPUF9JTl9TQ09QRShjLCBMT0FEX0xPQ0FMUyk7Ci0JQURET1BfSU5fU0NPUEUoYywgUkVUVVJOX1ZBTFVFKTsKLQljbyA9IGFzc2VtYmxlKGMsIDEpOwotCWNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7Ci0JaWYgKGNvID09IE5VTEwpCi0JCXJldHVybiAwOworICAgIFB5X0RFQ1JFRihzdHIpOworICAgIHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbW9kdWxlX18iKTsKKyAgICBpZiAoIXN0ciB8fCAhY29tcGlsZXJfbmFtZW9wKGMsIHN0ciwgU3RvcmUpKSB7CisgICAgICAgIFB5X1hERUNSRUYoc3RyKTsKKyAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFB5X0RFQ1JFRihzdHIpOwogCi0JY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCAwKTsKLQlQeV9ERUNSRUYoY28pOworICAgIGlmICghY29tcGlsZXJfYm9keShjLCBzLT52LkNsYXNzRGVmLmJvZHkpKSB7CisgICAgICAgIGNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCUFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgMCk7Ci0JQURET1AoYywgQlVJTERfQ0xBU1MpOwotCS8qIGFwcGx5IGRlY29yYXRvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGRlY29zKTsgaSsrKSB7Ci0JCUFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgMSk7Ci0JfQotCWlmICghY29tcGlsZXJfbmFtZW9wKGMsIHMtPnYuQ2xhc3NEZWYubmFtZSwgU3RvcmUpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICBBRERPUF9JTl9TQ09QRShjLCBMT0FEX0xPQ0FMUyk7CisgICAgQURET1BfSU5fU0NPUEUoYywgUkVUVVJOX1ZBTFVFKTsKKyAgICBjbyA9IGFzc2VtYmxlKGMsIDEpOworICAgIGNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7CisgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCAwKTsKKyAgICBQeV9ERUNSRUYoY28pOworCisgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCAwKTsKKyAgICBBRERPUChjLCBCVUlMRF9DTEFTUyk7CisgICAgLyogYXBwbHkgZGVjb3JhdG9ycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oZGVjb3MpOyBpKyspIHsKKyAgICAgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCAxKTsKKyAgICB9CisgICAgaWYgKCFjb21waWxlcl9uYW1lb3AoYywgcy0+di5DbGFzc0RlZi5uYW1lLCBTdG9yZSkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9pZmV4cChzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKIHsKLQliYXNpY2Jsb2NrICplbmQsICpuZXh0OwotCQotCWFzc2VydChlLT5raW5kID09IElmRXhwX2tpbmQpOwotCWVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZiAoZW5kID09IE5VTEwpCi0JCXJldHVybiAwOwotCW5leHQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWYgKG5leHQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JVklTSVQoYywgZXhwciwgZS0+di5JZkV4cC50ZXN0KTsKLQlBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX0ZBTFNFLCBuZXh0KTsKLQlWSVNJVChjLCBleHByLCBlLT52LklmRXhwLmJvZHkpOwotCUFERE9QX0pSRUwoYywgSlVNUF9GT1JXQVJELCBlbmQpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIG5leHQpOwotCVZJU0lUKGMsIGV4cHIsIGUtPnYuSWZFeHAub3JlbHNlKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwotCXJldHVybiAxOworICAgIGJhc2ljYmxvY2sgKmVuZCwgKm5leHQ7CisKKyAgICBhc3NlcnQoZS0+a2luZCA9PSBJZkV4cF9raW5kKTsKKyAgICBlbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGVuZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuZXh0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuSWZFeHAudGVzdCk7CisgICAgQURET1BfSkFCUyhjLCBQT1BfSlVNUF9JRl9GQUxTRSwgbmV4dCk7CisgICAgVklTSVQoYywgZXhwciwgZS0+di5JZkV4cC5ib2R5KTsKKyAgICBBRERPUF9KUkVMKGMsIEpVTVBfRk9SV0FSRCwgZW5kKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBuZXh0KTsKKyAgICBWSVNJVChjLCBleHByLCBlLT52LklmRXhwLm9yZWxzZSk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfbGFtYmRhKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCVB5Q29kZU9iamVjdCAqY287Ci0Jc3RhdGljIGlkZW50aWZpZXIgbmFtZTsKLQlhcmd1bWVudHNfdHkgYXJncyA9IGUtPnYuTGFtYmRhLmFyZ3M7Ci0JYXNzZXJ0KGUtPmtpbmQgPT0gTGFtYmRhX2tpbmQpOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgc3RhdGljIGlkZW50aWZpZXIgbmFtZTsKKyAgICBhcmd1bWVudHNfdHkgYXJncyA9IGUtPnYuTGFtYmRhLmFyZ3M7CisgICAgYXNzZXJ0KGUtPmtpbmQgPT0gTGFtYmRhX2tpbmQpOwogCi0JaWYgKCFuYW1lKSB7Ci0JCW5hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCI8bGFtYmRhPiIpOwotCQlpZiAoIW5hbWUpCi0JCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKCFuYW1lKSB7CisgICAgICAgIG5hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCI8bGFtYmRhPiIpOworICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAoYXJncy0+ZGVmYXVsdHMpCi0JCVZJU0lUX1NFUShjLCBleHByLCBhcmdzLT5kZWZhdWx0cyk7Ci0JaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBuYW1lLCAodm9pZCAqKWUsIGUtPmxpbmVubykpCi0JCXJldHVybiAwOworICAgIGlmIChhcmdzLT5kZWZhdWx0cykKKyAgICAgICAgVklTSVRfU0VRKGMsIGV4cHIsIGFyZ3MtPmRlZmF1bHRzKTsKKyAgICBpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIG5hbWUsICh2b2lkICopZSwgZS0+bGluZW5vKSkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiB1bnBhY2sgbmVzdGVkIGFyZ3VtZW50cyAqLwotCWNvbXBpbGVyX2FyZ3VtZW50cyhjLCBhcmdzKTsKKyAgICAvKiB1bnBhY2sgbmVzdGVkIGFyZ3VtZW50cyAqLworICAgIGNvbXBpbGVyX2FyZ3VtZW50cyhjLCBhcmdzKTsKIAotCS8qIE1ha2UgTm9uZSB0aGUgZmlyc3QgY29uc3RhbnQsIHNvIHRoZSBsYW1iZGEgY2FuJ3QgaGF2ZSBhCi0JICAgZG9jc3RyaW5nLiAqLwotCWlmIChjb21waWxlcl9hZGRfbyhjLCBjLT51LT51X2NvbnN0cywgUHlfTm9uZSkgPCAwKQotCQlyZXR1cm4gMDsKLQkKLQljLT51LT51X2FyZ2NvdW50ID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmFyZ3MpOwotCVZJU0lUX0lOX1NDT1BFKGMsIGV4cHIsIGUtPnYuTGFtYmRhLmJvZHkpOwotCWlmIChjLT51LT51X3N0ZS0+c3RlX2dlbmVyYXRvcikgewotCQlBRERPUF9JTl9TQ09QRShjLCBQT1BfVE9QKTsKLQl9Ci0JZWxzZSB7Ci0JCUFERE9QX0lOX1NDT1BFKGMsIFJFVFVSTl9WQUxVRSk7Ci0JfQotCWNvID0gYXNzZW1ibGUoYywgMSk7Ci0JY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQlpZiAoY28gPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisgICAgLyogTWFrZSBOb25lIHRoZSBmaXJzdCBjb25zdGFudCwgc28gdGhlIGxhbWJkYSBjYW4ndCBoYXZlIGEKKyAgICAgICBkb2NzdHJpbmcuICovCisgICAgaWYgKGNvbXBpbGVyX2FkZF9vKGMsIGMtPnUtPnVfY29uc3RzLCBQeV9Ob25lKSA8IDApCisgICAgICAgIHJldHVybiAwOwogCi0JY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBhc2RsX3NlcV9MRU4oYXJncy0+ZGVmYXVsdHMpKTsKLQlQeV9ERUNSRUYoY28pOworICAgIGMtPnUtPnVfYXJnY291bnQgPSBhc2RsX3NlcV9MRU4oYXJncy0+YXJncyk7CisgICAgVklTSVRfSU5fU0NPUEUoYywgZXhwciwgZS0+di5MYW1iZGEuYm9keSk7CisgICAgaWYgKGMtPnUtPnVfc3RlLT5zdGVfZ2VuZXJhdG9yKSB7CisgICAgICAgIEFERE9QX0lOX1NDT1BFKGMsIFBPUF9UT1ApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgQURET1BfSU5fU0NPUEUoYywgUkVUVVJOX1ZBTFVFKTsKKyAgICB9CisgICAgY28gPSBhc3NlbWJsZShjLCAxKTsKKyAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAotCXJldHVybiAxOworICAgIGNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKSk7CisgICAgUHlfREVDUkVGKGNvKTsKKworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9wcmludChzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKLQlpbnQgaSwgbjsKLQlib29sIGRlc3Q7CisgICAgaW50IGksIG47CisgICAgYm9vbCBkZXN0OwogCi0JYXNzZXJ0KHMtPmtpbmQgPT0gUHJpbnRfa2luZCk7Ci0JbiA9IGFzZGxfc2VxX0xFTihzLT52LlByaW50LnZhbHVlcyk7Ci0JZGVzdCA9IGZhbHNlOwotCWlmIChzLT52LlByaW50LmRlc3QpIHsKLQkJVklTSVQoYywgZXhwciwgcy0+di5QcmludC5kZXN0KTsKLQkJZGVzdCA9IHRydWU7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZXhwcl90eSBlID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMtPnYuUHJpbnQudmFsdWVzLCBpKTsKLQkJaWYgKGRlc3QpIHsKLQkJCUFERE9QKGMsIERVUF9UT1ApOwotCQkJVklTSVQoYywgZXhwciwgZSk7Ci0JCQlBRERPUChjLCBST1RfVFdPKTsKLQkJCUFERE9QKGMsIFBSSU5UX0lURU1fVE8pOwotCQl9Ci0JCWVsc2UgewotCQkJVklTSVQoYywgZXhwciwgZSk7Ci0JCQlBRERPUChjLCBQUklOVF9JVEVNKTsKLQkJfQotCX0KLQlpZiAocy0+di5QcmludC5ubCkgewotCQlpZiAoZGVzdCkKLQkJCUFERE9QKGMsIFBSSU5UX05FV0xJTkVfVE8pCi0JCWVsc2UKLQkJCUFERE9QKGMsIFBSSU5UX05FV0xJTkUpCi0JfQotCWVsc2UgaWYgKGRlc3QpCi0JCUFERE9QKGMsIFBPUF9UT1ApOwotCXJldHVybiAxOworICAgIGFzc2VydChzLT5raW5kID09IFByaW50X2tpbmQpOworICAgIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5QcmludC52YWx1ZXMpOworICAgIGRlc3QgPSBmYWxzZTsKKyAgICBpZiAocy0+di5QcmludC5kZXN0KSB7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuUHJpbnQuZGVzdCk7CisgICAgICAgIGRlc3QgPSB0cnVlOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGV4cHJfdHkgZSA9IChleHByX3R5KWFzZGxfc2VxX0dFVChzLT52LlByaW50LnZhbHVlcywgaSk7CisgICAgICAgIGlmIChkZXN0KSB7CisgICAgICAgICAgICBBRERPUChjLCBEVVBfVE9QKTsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUpOworICAgICAgICAgICAgQURET1AoYywgUk9UX1RXTyk7CisgICAgICAgICAgICBBRERPUChjLCBQUklOVF9JVEVNX1RPKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUpOworICAgICAgICAgICAgQURET1AoYywgUFJJTlRfSVRFTSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPnYuUHJpbnQubmwpIHsKKyAgICAgICAgaWYgKGRlc3QpCisgICAgICAgICAgICBBRERPUChjLCBQUklOVF9ORVdMSU5FX1RPKQorICAgICAgICBlbHNlCisgICAgICAgICAgICBBRERPUChjLCBQUklOVF9ORVdMSU5FKQorICAgIH0KKyAgICBlbHNlIGlmIChkZXN0KQorICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfaWYoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JYmFzaWNibG9jayAqZW5kLCAqbmV4dDsKLQlpbnQgY29uc3RhbnQ7Ci0JYXNzZXJ0KHMtPmtpbmQgPT0gSWZfa2luZCk7Ci0JZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChlbmQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JCi0JY29uc3RhbnQgPSBleHByX2NvbnN0YW50KHMtPnYuSWYudGVzdCk7Ci0JLyogY29uc3RhbnQgPSAwOiAiaWYgMCIKLQkgKiBjb25zdGFudCA9IDE6ICJpZiAxIiwgImlmIDIiLCAuLi4KLQkgKiBjb25zdGFudCA9IC0xOiByZXN0ICovCi0JaWYgKGNvbnN0YW50ID09IDApIHsKLQkJaWYgKHMtPnYuSWYub3JlbHNlKQotCQkJVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYub3JlbHNlKTsKLQl9IGVsc2UgaWYgKGNvbnN0YW50ID09IDEpIHsKLQkJVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYuYm9keSk7Ci0JfSBlbHNlIHsKLQkJaWYgKHMtPnYuSWYub3JlbHNlKSB7Ci0JCQluZXh0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCQkJaWYgKG5leHQgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gMDsKLQkJfQotCQllbHNlCi0JCQluZXh0ID0gZW5kOwotCQlWSVNJVChjLCBleHByLCBzLT52LklmLnRlc3QpOwotCQlBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX0ZBTFNFLCBuZXh0KTsKLQkJVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYuYm9keSk7Ci0JCUFERE9QX0pSRUwoYywgSlVNUF9GT1JXQVJELCBlbmQpOwotCQlpZiAocy0+di5JZi5vcmVsc2UpIHsKLQkJCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIG5leHQpOwotCQkJVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYub3JlbHNlKTsKLQkJfQotCX0KLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwotCXJldHVybiAxOworICAgIGJhc2ljYmxvY2sgKmVuZCwgKm5leHQ7CisgICAgaW50IGNvbnN0YW50OworICAgIGFzc2VydChzLT5raW5kID09IElmX2tpbmQpOworICAgIGVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZiAoZW5kID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgY29uc3RhbnQgPSBleHByX2NvbnN0YW50KHMtPnYuSWYudGVzdCk7CisgICAgLyogY29uc3RhbnQgPSAwOiAiaWYgMCIKKyAgICAgKiBjb25zdGFudCA9IDE6ICJpZiAxIiwgImlmIDIiLCAuLi4KKyAgICAgKiBjb25zdGFudCA9IC0xOiByZXN0ICovCisgICAgaWYgKGNvbnN0YW50ID09IDApIHsKKyAgICAgICAgaWYgKHMtPnYuSWYub3JlbHNlKQorICAgICAgICAgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYub3JlbHNlKTsKKyAgICB9IGVsc2UgaWYgKGNvbnN0YW50ID09IDEpIHsKKyAgICAgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYuYm9keSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPnYuSWYub3JlbHNlKSB7CisgICAgICAgICAgICBuZXh0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgICAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBuZXh0ID0gZW5kOworICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LklmLnRlc3QpOworICAgICAgICBBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX0ZBTFNFLCBuZXh0KTsKKyAgICAgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYuYm9keSk7CisgICAgICAgIEFERE9QX0pSRUwoYywgSlVNUF9GT1JXQVJELCBlbmQpOworICAgICAgICBpZiAocy0+di5JZi5vcmVsc2UpIHsKKyAgICAgICAgICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIG5leHQpOworICAgICAgICAgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYub3JlbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9mb3Ioc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JYmFzaWNibG9jayAqc3RhcnQsICpjbGVhbnVwLCAqZW5kOworICAgIGJhc2ljYmxvY2sgKnN0YXJ0LCAqY2xlYW51cCwgKmVuZDsKIAotCXN0YXJ0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWNsZWFudXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChzdGFydCA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMIHx8IGNsZWFudXAgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JQURET1BfSlJFTChjLCBTRVRVUF9MT09QLCBlbmQpOwotCWlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgTE9PUCwgc3RhcnQpKQotCQlyZXR1cm4gMDsKLQlWSVNJVChjLCBleHByLCBzLT52LkZvci5pdGVyKTsKLQlBRERPUChjLCBHRVRfSVRFUik7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc3RhcnQpOwotCUFERE9QX0pSRUwoYywgRk9SX0lURVIsIGNsZWFudXApOwotCVZJU0lUKGMsIGV4cHIsIHMtPnYuRm9yLnRhcmdldCk7Ci0JVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuRm9yLmJvZHkpOwotCUFERE9QX0pBQlMoYywgSlVNUF9BQlNPTFVURSwgc3RhcnQpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGNsZWFudXApOwotCUFERE9QKGMsIFBPUF9CTE9DSyk7Ci0JY29tcGlsZXJfcG9wX2ZibG9jayhjLCBMT09QLCBzdGFydCk7Ci0JVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuRm9yLm9yZWxzZSk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKLQlyZXR1cm4gMTsKKyAgICBzdGFydCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBjbGVhbnVwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZiAoc3RhcnQgPT0gTlVMTCB8fCBlbmQgPT0gTlVMTCB8fCBjbGVhbnVwID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIEFERE9QX0pSRUwoYywgU0VUVVBfTE9PUCwgZW5kKTsKKyAgICBpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIExPT1AsIHN0YXJ0KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgVklTSVQoYywgZXhwciwgcy0+di5Gb3IuaXRlcik7CisgICAgQURET1AoYywgR0VUX0lURVIpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIHN0YXJ0KTsKKyAgICBBRERPUF9KUkVMKGMsIEZPUl9JVEVSLCBjbGVhbnVwKTsKKyAgICBWSVNJVChjLCBleHByLCBzLT52LkZvci50YXJnZXQpOworICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LkZvci5ib2R5KTsKKyAgICBBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIHN0YXJ0KTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBjbGVhbnVwKTsKKyAgICBBRERPUChjLCBQT1BfQkxPQ0spOworICAgIGNvbXBpbGVyX3BvcF9mYmxvY2soYywgTE9PUCwgc3RhcnQpOworICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LkZvci5vcmVsc2UpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3doaWxlKHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCWJhc2ljYmxvY2sgKmxvb3AsICpvcmVsc2UsICplbmQsICphbmNob3IgPSBOVUxMOwotCWludCBjb25zdGFudCA9IGV4cHJfY29uc3RhbnQocy0+di5XaGlsZS50ZXN0KTsKKyAgICBiYXNpY2Jsb2NrICpsb29wLCAqb3JlbHNlLCAqZW5kLCAqYW5jaG9yID0gTlVMTDsKKyAgICBpbnQgY29uc3RhbnQgPSBleHByX2NvbnN0YW50KHMtPnYuV2hpbGUudGVzdCk7CiAKLQlpZiAoY29uc3RhbnQgPT0gMCkgewotCQlpZiAocy0+di5XaGlsZS5vcmVsc2UpCi0JCQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5XaGlsZS5vcmVsc2UpOwotCQlyZXR1cm4gMTsKLQl9Ci0JbG9vcCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQllbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWYgKGNvbnN0YW50ID09IC0xKSB7Ci0JCWFuY2hvciA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQkJaWYgKGFuY2hvciA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JfQotCWlmIChsb29wID09IE5VTEwgfHwgZW5kID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmIChzLT52LldoaWxlLm9yZWxzZSkgewotCQlvcmVsc2UgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JCWlmIChvcmVsc2UgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCX0KLQllbHNlCi0JCW9yZWxzZSA9IE5VTEw7CisgICAgaWYgKGNvbnN0YW50ID09IDApIHsKKyAgICAgICAgaWYgKHMtPnYuV2hpbGUub3JlbHNlKQorICAgICAgICAgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuV2hpbGUub3JlbHNlKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGxvb3AgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChjb25zdGFudCA9PSAtMSkgeworICAgICAgICBhbmNob3IgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgICAgIGlmIChhbmNob3IgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAobG9vcCA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocy0+di5XaGlsZS5vcmVsc2UpIHsKKyAgICAgICAgb3JlbHNlID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgICAgICBpZiAob3JlbHNlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBvcmVsc2UgPSBOVUxMOwogCi0JQURET1BfSlJFTChjLCBTRVRVUF9MT09QLCBlbmQpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGxvb3ApOwotCWlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgTE9PUCwgbG9vcCkpCi0JCXJldHVybiAwOwotCWlmIChjb25zdGFudCA9PSAtMSkgewotCQlWSVNJVChjLCBleHByLCBzLT52LldoaWxlLnRlc3QpOwotCQlBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX0ZBTFNFLCBhbmNob3IpOwotCX0KLQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5XaGlsZS5ib2R5KTsKLQlBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIGxvb3ApOworICAgIEFERE9QX0pSRUwoYywgU0VUVVBfTE9PUCwgZW5kKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBsb29wKTsKKyAgICBpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIExPT1AsIGxvb3ApKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoY29uc3RhbnQgPT0gLTEpIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5XaGlsZS50ZXN0KTsKKyAgICAgICAgQURET1BfSkFCUyhjLCBQT1BfSlVNUF9JRl9GQUxTRSwgYW5jaG9yKTsKKyAgICB9CisgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuV2hpbGUuYm9keSk7CisgICAgQURET1BfSkFCUyhjLCBKVU1QX0FCU09MVVRFLCBsb29wKTsKIAotCS8qIFhYWCBzaG91bGQgdGhlIHR3byBQT1AgaW5zdHJ1Y3Rpb25zIGJlIGluIGEgc2VwYXJhdGUgYmxvY2sKLQkgICBpZiB0aGVyZSBpcyBubyBlbHNlIGNsYXVzZSA/Ci0JKi8KKyAgICAvKiBYWFggc2hvdWxkIHRoZSB0d28gUE9QIGluc3RydWN0aW9ucyBiZSBpbiBhIHNlcGFyYXRlIGJsb2NrCisgICAgICAgaWYgdGhlcmUgaXMgbm8gZWxzZSBjbGF1c2UgPworICAgICovCiAKLQlpZiAoY29uc3RhbnQgPT0gLTEpIHsKLQkJY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgYW5jaG9yKTsKLQkJQURET1AoYywgUE9QX0JMT0NLKTsKLQl9Ci0JY29tcGlsZXJfcG9wX2ZibG9jayhjLCBMT09QLCBsb29wKTsKLQlpZiAob3JlbHNlICE9IE5VTEwpIC8qIHdoYXQgaWYgb3JlbHNlIGlzIGp1c3QgcGFzcz8gKi8KLQkJVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuV2hpbGUub3JlbHNlKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOworICAgIGlmIChjb25zdGFudCA9PSAtMSkgeworICAgICAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBhbmNob3IpOworICAgICAgICBBRERPUChjLCBQT1BfQkxPQ0spOworICAgIH0KKyAgICBjb21waWxlcl9wb3BfZmJsb2NrKGMsIExPT1AsIGxvb3ApOworICAgIGlmIChvcmVsc2UgIT0gTlVMTCkgLyogd2hhdCBpZiBvcmVsc2UgaXMganVzdCBwYXNzPyAqLworICAgICAgICBWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5XaGlsZS5vcmVsc2UpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfY29udGludWUoc3RydWN0IGNvbXBpbGVyICpjKQogewotCXN0YXRpYyBjb25zdCBjaGFyIExPT1BfRVJST1JfTVNHW10gPSAiJ2NvbnRpbnVlJyBub3QgcHJvcGVybHkgaW4gbG9vcCI7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgSU5fRklOQUxMWV9FUlJPUl9NU0dbXSA9IAotCQkJIidjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZSI7Ci0JaW50IGk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgTE9PUF9FUlJPUl9NU0dbXSA9ICInY29udGludWUnIG5vdCBwcm9wZXJseSBpbiBsb29wIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBJTl9GSU5BTExZX0VSUk9SX01TR1tdID0KKyAgICAgICAgICAgICAgICAgICAgIidjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZSI7CisgICAgaW50IGk7CiAKLQlpZiAoIWMtPnUtPnVfbmZibG9ja3MpCi0JCXJldHVybiBjb21waWxlcl9lcnJvcihjLCBMT09QX0VSUk9SX01TRyk7Ci0JaSA9IGMtPnUtPnVfbmZibG9ja3MgLSAxOwotCXN3aXRjaCAoYy0+dS0+dV9mYmxvY2tbaV0uZmJfdHlwZSkgewotCWNhc2UgTE9PUDoKLQkJQURET1BfSkFCUyhjLCBKVU1QX0FCU09MVVRFLCBjLT51LT51X2ZibG9ja1tpXS5mYl9ibG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgRVhDRVBUOgotCWNhc2UgRklOQUxMWV9UUlk6Ci0JCXdoaWxlICgtLWkgPj0gMCAmJiBjLT51LT51X2ZibG9ja1tpXS5mYl90eXBlICE9IExPT1ApIHsKLQkJCS8qIFByZXZlbnQgY29udGludWUgYW55d2hlcmUgdW5kZXIgYSBmaW5hbGx5Ci0JCQkgICAgICBldmVuIGlmIGhpZGRlbiBpbiBhIHN1Yi10cnkgb3IgZXhjZXB0LiAqLwotCQkJaWYgKGMtPnUtPnVfZmJsb2NrW2ldLmZiX3R5cGUgPT0gRklOQUxMWV9FTkQpCi0JCQkJcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsIElOX0ZJTkFMTFlfRVJST1JfTVNHKTsKLQkJfQotCQlpZiAoaSA9PSAtMSkKLQkJCXJldHVybiBjb21waWxlcl9lcnJvcihjLCBMT09QX0VSUk9SX01TRyk7Ci0JCUFERE9QX0pBQlMoYywgQ09OVElOVUVfTE9PUCwgYy0+dS0+dV9mYmxvY2tbaV0uZmJfYmxvY2spOwotCQlicmVhazsKLQljYXNlIEZJTkFMTFlfRU5EOgotCQlyZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgSU5fRklOQUxMWV9FUlJPUl9NU0cpOwotCX0KKyAgICBpZiAoIWMtPnUtPnVfbmZibG9ja3MpCisgICAgICAgIHJldHVybiBjb21waWxlcl9lcnJvcihjLCBMT09QX0VSUk9SX01TRyk7CisgICAgaSA9IGMtPnUtPnVfbmZibG9ja3MgLSAxOworICAgIHN3aXRjaCAoYy0+dS0+dV9mYmxvY2tbaV0uZmJfdHlwZSkgeworICAgIGNhc2UgTE9PUDoKKyAgICAgICAgQURET1BfSkFCUyhjLCBKVU1QX0FCU09MVVRFLCBjLT51LT51X2ZibG9ja1tpXS5mYl9ibG9jayk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVhDRVBUOgorICAgIGNhc2UgRklOQUxMWV9UUlk6CisgICAgICAgIHdoaWxlICgtLWkgPj0gMCAmJiBjLT51LT51X2ZibG9ja1tpXS5mYl90eXBlICE9IExPT1ApIHsKKyAgICAgICAgICAgIC8qIFByZXZlbnQgY29udGludWUgYW55d2hlcmUgdW5kZXIgYSBmaW5hbGx5CisgICAgICAgICAgICAgICAgICBldmVuIGlmIGhpZGRlbiBpbiBhIHN1Yi10cnkgb3IgZXhjZXB0LiAqLworICAgICAgICAgICAgaWYgKGMtPnUtPnVfZmJsb2NrW2ldLmZiX3R5cGUgPT0gRklOQUxMWV9FTkQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsIElOX0ZJTkFMTFlfRVJST1JfTVNHKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlcl9lcnJvcihjLCBMT09QX0VSUk9SX01TRyk7CisgICAgICAgIEFERE9QX0pBQlMoYywgQ09OVElOVUVfTE9PUCwgYy0+dS0+dV9mYmxvY2tbaV0uZmJfYmxvY2spOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZJTkFMTFlfRU5EOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgSU5fRklOQUxMWV9FUlJPUl9NU0cpOworICAgIH0KIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiAvKiBDb2RlIGdlbmVyYXRlZCBmb3IgInRyeTogPGJvZHk+IGZpbmFsbHk6IDxmaW5hbGJvZHk+IiBpcyBhcyBmb2xsb3dzOgotICAgCi0JCVNFVFVQX0ZJTkFMTFkJTAotCQk8Y29kZSBmb3IgYm9keT4KLQkJUE9QX0JMT0NLCi0JCUxPQURfQ09OU1QJPE5vbmU+Ci0JTDoJPGNvZGUgZm9yIGZpbmFsYm9keT4KLQkJRU5EX0ZJTkFMTFkKLSAgIAorCisgICAgICAgIFNFVFVQX0ZJTkFMTFkgICAgICAgICAgIEwKKyAgICAgICAgPGNvZGUgZm9yIGJvZHk+CisgICAgICAgIFBPUF9CTE9DSworICAgICAgICBMT0FEX0NPTlNUICAgICAgICAgICAgICA8Tm9uZT4KKyAgICBMOiAgICAgICAgICA8Y29kZSBmb3IgZmluYWxib2R5PgorICAgICAgICBFTkRfRklOQUxMWQorCiAgICBUaGUgc3BlY2lhbCBpbnN0cnVjdGlvbnMgdXNlIHRoZSBibG9jayBzdGFjay4gIEVhY2ggYmxvY2sKICAgIHN0YWNrIGVudHJ5IGNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGNyZWF0ZWQgaXQgKGhlcmUKICAgIFNFVFVQX0ZJTkFMTFkpLCB0aGUgbGV2ZWwgb2YgdGhlIHZhbHVlIHN0YWNrIGF0IHRoZSB0aW1lIHRoZQogICAgYmxvY2sgc3RhY2sgZW50cnkgd2FzIGNyZWF0ZWQsIGFuZCBhIGxhYmVsIChoZXJlIEwpLgotICAgCisKICAgIFNFVFVQX0ZJTkFMTFk6Ci0JUHVzaGVzIHRoZSBjdXJyZW50IHZhbHVlIHN0YWNrIGxldmVsIGFuZCB0aGUgbGFiZWwKLQlvbnRvIHRoZSBibG9jayBzdGFjay4KKyAgICBQdXNoZXMgdGhlIGN1cnJlbnQgdmFsdWUgc3RhY2sgbGV2ZWwgYW5kIHRoZSBsYWJlbAorICAgIG9udG8gdGhlIGJsb2NrIHN0YWNrLgogICAgUE9QX0JMT0NLOgotCVBvcHMgZW4gZW50cnkgZnJvbSB0aGUgYmxvY2sgc3RhY2ssIGFuZCBwb3BzIHRoZSB2YWx1ZQotCXN0YWNrIHVudGlsIGl0cyBsZXZlbCBpcyB0aGUgc2FtZSBhcyBpbmRpY2F0ZWQgb24gdGhlCi0JYmxvY2sgc3RhY2suICAoVGhlIGxhYmVsIGlzIGlnbm9yZWQuKQorICAgIFBvcHMgZW4gZW50cnkgZnJvbSB0aGUgYmxvY2sgc3RhY2ssIGFuZCBwb3BzIHRoZSB2YWx1ZQorICAgIHN0YWNrIHVudGlsIGl0cyBsZXZlbCBpcyB0aGUgc2FtZSBhcyBpbmRpY2F0ZWQgb24gdGhlCisgICAgYmxvY2sgc3RhY2suICAoVGhlIGxhYmVsIGlzIGlnbm9yZWQuKQogICAgRU5EX0ZJTkFMTFk6Ci0JUG9wcyBhIHZhcmlhYmxlIG51bWJlciBvZiBlbnRyaWVzIGZyb20gdGhlICp2YWx1ZSogc3RhY2sKLQlhbmQgcmUtcmFpc2VzIHRoZSBleGNlcHRpb24gdGhleSBzcGVjaWZ5LiAgVGhlIG51bWJlciBvZgotCWVudHJpZXMgcG9wcGVkIGRlcGVuZHMgb24gdGhlIChwc2V1ZG8pIGV4Y2VwdGlvbiB0eXBlLgotICAgCisgICAgUG9wcyBhIHZhcmlhYmxlIG51bWJlciBvZiBlbnRyaWVzIGZyb20gdGhlICp2YWx1ZSogc3RhY2sKKyAgICBhbmQgcmUtcmFpc2VzIHRoZSBleGNlcHRpb24gdGhleSBzcGVjaWZ5LiAgVGhlIG51bWJlciBvZgorICAgIGVudHJpZXMgcG9wcGVkIGRlcGVuZHMgb24gdGhlIChwc2V1ZG8pIGV4Y2VwdGlvbiB0eXBlLgorCiAgICBUaGUgYmxvY2sgc3RhY2sgaXMgdW53b3VuZCB3aGVuIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQ6CiAgICB3aGVuIGEgU0VUVVBfRklOQUxMWSBlbnRyeSBpcyBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBpcyBwdXNoZWQKICAgIG9udG8gdGhlIHZhbHVlIHN0YWNrIChhbmQgdGhlIGV4Y2VwdGlvbiBjb25kaXRpb24gaXMgY2xlYXJlZCksCkBAIC0xNzc1LDI5ICsxNzc1LDI5IEBACiBzdGF0aWMgaW50CiBjb21waWxlcl90cnlfZmluYWxseShzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKLQliYXNpY2Jsb2NrICpib2R5LCAqZW5kOwotCWJvZHkgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChib2R5ID09IE5VTEwgfHwgZW5kID09IE5VTEwpCi0JCXJldHVybiAwOworICAgIGJhc2ljYmxvY2sgKmJvZHksICplbmQ7CisgICAgYm9keSA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBlbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGJvZHkgPT0gTlVMTCB8fCBlbmQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlBRERPUF9KUkVMKGMsIFNFVFVQX0ZJTkFMTFksIGVuZCk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgYm9keSk7Ci0JaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBGSU5BTExZX1RSWSwgYm9keSkpCi0JCXJldHVybiAwOwotCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LlRyeUZpbmFsbHkuYm9keSk7Ci0JQURET1AoYywgUE9QX0JMT0NLKTsKLQljb21waWxlcl9wb3BfZmJsb2NrKGMsIEZJTkFMTFlfVFJZLCBib2R5KTsKKyAgICBBRERPUF9KUkVMKGMsIFNFVFVQX0ZJTkFMTFksIGVuZCk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgYm9keSk7CisgICAgaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBGSU5BTExZX1RSWSwgYm9keSkpCisgICAgICAgIHJldHVybiAwOworICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LlRyeUZpbmFsbHkuYm9keSk7CisgICAgQURET1AoYywgUE9QX0JMT0NLKTsKKyAgICBjb21waWxlcl9wb3BfZmJsb2NrKGMsIEZJTkFMTFlfVFJZLCBib2R5KTsKIAotCUFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwotCWlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgRklOQUxMWV9FTkQsIGVuZCkpCi0JCXJldHVybiAwOwotCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LlRyeUZpbmFsbHkuZmluYWxib2R5KTsKLQlBRERPUChjLCBFTkRfRklOQUxMWSk7Ci0JY29tcGlsZXJfcG9wX2ZibG9jayhjLCBGSU5BTExZX0VORCwgZW5kKTsKKyAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKKyAgICBpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIEZJTkFMTFlfRU5ELCBlbmQpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5UcnlGaW5hbGx5LmZpbmFsYm9keSk7CisgICAgQURET1AoYywgRU5EX0ZJTkFMTFkpOworICAgIGNvbXBpbGVyX3BvcF9mYmxvY2soYywgRklOQUxMWV9FTkQsIGVuZCk7CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogLyoKQEAgLTE4MDUsODUzICsxODA1LDg1MyBAQAogICAgKFRoZSBjb250ZW50cyBvZiB0aGUgdmFsdWUgc3RhY2sgaXMgc2hvd24gaW4gW10sIHdpdGggdGhlIHRvcAogICAgYXQgdGhlIHJpZ2h0OyAndGInIGlzIHRyYWNlLWJhY2sgaW5mbywgJ3ZhbCcgdGhlIGV4Y2VwdGlvbidzCiAgICBhc3NvY2lhdGVkIHZhbHVlLCBhbmQgJ2V4YycgdGhlIGV4Y2VwdGlvbi4pCi0gICAKLSAgIFZhbHVlIHN0YWNrCQlMYWJlbAlJbnN0cnVjdGlvbglBcmd1bWVudAotICAgW10JCQkJU0VUVVBfRVhDRVBUCUwxCi0gICBbXQkJCQk8Y29kZSBmb3IgUz4KLSAgIFtdCQkJCVBPUF9CTE9DSwotICAgW10JCQkJSlVNUF9GT1JXQVJECUwwCi0gICAKLSAgIFt0YiwgdmFsLCBleGNdCUwxOglEVVAJCQkJKQotICAgW3RiLCB2YWwsIGV4YywgZXhjXQkJPGV2YWx1YXRlIEUxPgkJCSkKLSAgIFt0YiwgdmFsLCBleGMsIGV4YywgRTFdCUNPTVBBUkVfT1AJRVhDX01BVENICSkgb25seSBpZiBFMQotICAgW3RiLCB2YWwsIGV4YywgMS1vci0wXQlQT1BfSlVNUF9JRl9GQUxTRQlMMgkpCi0gICBbdGIsIHZhbCwgZXhjXQkJUE9QCi0gICBbdGIsIHZhbF0JCQk8YXNzaWduIHRvIFYxPgkob3IgUE9QIGlmIG5vIFYxKQotICAgW3RiXQkJCQlQT1AKLSAgIFtdCQkJCTxjb2RlIGZvciBTMT4KLQkJCQlKVU1QX0ZPUldBUkQJTDAKLSAgIAotICAgW3RiLCB2YWwsIGV4Y10JTDI6CURVUAorCisgICBWYWx1ZSBzdGFjayAgICAgICAgICBMYWJlbCAgIEluc3RydWN0aW9uICAgICBBcmd1bWVudAorICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRVUF9FWENFUFQgICAgTDEKKyAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGUgZm9yIFM+CisgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPUF9CTE9DSworICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBKVU1QX0ZPUldBUkQgICAgTDAKKworICAgW3RiLCB2YWwsIGV4Y10gICAgICAgTDE6ICAgICBEVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgIFt0YiwgdmFsLCBleGMsIGV4Y10gICAgICAgICAgPGV2YWx1YXRlIEUxPiAgICAgICAgICAgICAgICAgICApCisgICBbdGIsIHZhbCwgZXhjLCBleGMsIEUxXSAgICAgIENPTVBBUkVfT1AgICAgICBFWENfTUFUQ0ggICAgICAgKSBvbmx5IGlmIEUxCisgICBbdGIsIHZhbCwgZXhjLCAxLW9yLTBdICAgICAgIFBPUF9KVU1QX0lGX0ZBTFNFICAgICAgIEwyICAgICAgKQorICAgW3RiLCB2YWwsIGV4Y10gICAgICAgICAgICAgICBQT1AKKyAgIFt0YiwgdmFsXSAgICAgICAgICAgICAgICAgICAgPGFzc2lnbiB0byBWMT4gIChvciBQT1AgaWYgbm8gVjEpCisgICBbdGJdICAgICAgICAgICAgICAgICAgICAgICAgIFBPUAorICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBmb3IgUzE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpVTVBfRk9SV0FSRCAgICBMMAorCisgICBbdGIsIHZhbCwgZXhjXSAgICAgICBMMjogICAgIERVUAogICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5ldGMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogCi0gICBbdGIsIHZhbCwgZXhjXQlMbisxOglFTkRfRklOQUxMWQkjIHJlLXJhaXNlIGV4Y2VwdGlvbgotICAgCi0gICBbXQkJCUwwOgk8bmV4dCBzdGF0ZW1lbnQ+Ci0gICAKKyAgIFt0YiwgdmFsLCBleGNdICAgICAgIExuKzE6ICAgRU5EX0ZJTkFMTFkgICAgICMgcmUtcmFpc2UgZXhjZXB0aW9uCisKKyAgIFtdICAgICAgICAgICAgICAgICAgIEwwOiAgICAgPG5leHQgc3RhdGVtZW50PgorCiAgICBPZiBjb3Vyc2UsIHBhcnRzIGFyZSBub3QgZ2VuZXJhdGVkIGlmIFZpIG9yIEVpIGlzIG5vdCBwcmVzZW50LgogKi8KIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3RyeV9leGNlcHQoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JYmFzaWNibG9jayAqYm9keSwgKm9yZWxzZSwgKmV4Y2VwdCwgKmVuZDsKLQlpbnQgaSwgbjsKKyAgICBiYXNpY2Jsb2NrICpib2R5LCAqb3JlbHNlLCAqZXhjZXB0LCAqZW5kOworICAgIGludCBpLCBuOwogCi0JYm9keSA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlleGNlcHQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0Jb3JlbHNlID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZiAoYm9keSA9PSBOVUxMIHx8IGV4Y2VwdCA9PSBOVUxMIHx8IG9yZWxzZSA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlBRERPUF9KUkVMKGMsIFNFVFVQX0VYQ0VQVCwgZXhjZXB0KTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBib2R5KTsKLQlpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIEVYQ0VQVCwgYm9keSkpCi0JCXJldHVybiAwOwotCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LlRyeUV4Y2VwdC5ib2R5KTsKLQlBRERPUChjLCBQT1BfQkxPQ0spOwotCWNvbXBpbGVyX3BvcF9mYmxvY2soYywgRVhDRVBULCBib2R5KTsKLQlBRERPUF9KUkVMKGMsIEpVTVBfRk9SV0FSRCwgb3JlbHNlKTsKLQluID0gYXNkbF9zZXFfTEVOKHMtPnYuVHJ5RXhjZXB0LmhhbmRsZXJzKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBleGNlcHQpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZXhjZXB0aGFuZGxlcl90eSBoYW5kbGVyID0gKGV4Y2VwdGhhbmRsZXJfdHkpYXNkbF9zZXFfR0VUKAotCQkJCQkJcy0+di5UcnlFeGNlcHQuaGFuZGxlcnMsIGkpOwotCQlpZiAoIWhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci50eXBlICYmIGkgPCBuLTEpCi0JCSAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgImRlZmF1bHQgJ2V4Y2VwdDonIG11c3QgYmUgbGFzdCIpOwotCQljLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKLQkJYy0+dS0+dV9saW5lbm8gPSBoYW5kbGVyLT5saW5lbm87Ci0JCWV4Y2VwdCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQkJaWYgKGV4Y2VwdCA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChoYW5kbGVyLT52LkV4Y2VwdEhhbmRsZXIudHlwZSkgewotCQkJQURET1AoYywgRFVQX1RPUCk7Ci0JCQlWSVNJVChjLCBleHByLCBoYW5kbGVyLT52LkV4Y2VwdEhhbmRsZXIudHlwZSk7Ci0JCQlBRERPUF9JKGMsIENPTVBBUkVfT1AsIFB5Q21wX0VYQ19NQVRDSCk7Ci0JCQlBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX0ZBTFNFLCBleGNlcHQpOwotCQl9Ci0JCUFERE9QKGMsIFBPUF9UT1ApOwotCQlpZiAoaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLm5hbWUpIHsKLQkJCVZJU0lUKGMsIGV4cHIsIGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci5uYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCUFERE9QKGMsIFBPUF9UT1ApOwotCQl9Ci0JCUFERE9QKGMsIFBPUF9UT1ApOwotCQlWSVNJVF9TRVEoYywgc3RtdCwgaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLmJvZHkpOwotCQlBRERPUF9KUkVMKGMsIEpVTVBfRk9SV0FSRCwgZW5kKTsKLQkJY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZXhjZXB0KTsKLQl9Ci0JQURET1AoYywgRU5EX0ZJTkFMTFkpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIG9yZWxzZSk7Ci0JVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuVHJ5RXhjZXB0Lm9yZWxzZSk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKLQlyZXR1cm4gMTsKKyAgICBib2R5ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGV4Y2VwdCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBvcmVsc2UgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChib2R5ID09IE5VTEwgfHwgZXhjZXB0ID09IE5VTEwgfHwgb3JlbHNlID09IE5VTEwgfHwgZW5kID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIEFERE9QX0pSRUwoYywgU0VUVVBfRVhDRVBULCBleGNlcHQpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGJvZHkpOworICAgIGlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgRVhDRVBULCBib2R5KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuVHJ5RXhjZXB0LmJvZHkpOworICAgIEFERE9QKGMsIFBPUF9CTE9DSyk7CisgICAgY29tcGlsZXJfcG9wX2ZibG9jayhjLCBFWENFUFQsIGJvZHkpOworICAgIEFERE9QX0pSRUwoYywgSlVNUF9GT1JXQVJELCBvcmVsc2UpOworICAgIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5UcnlFeGNlcHQuaGFuZGxlcnMpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGV4Y2VwdCk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBleGNlcHRoYW5kbGVyX3R5IGhhbmRsZXIgPSAoZXhjZXB0aGFuZGxlcl90eSlhc2RsX3NlcV9HRVQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+di5UcnlFeGNlcHQuaGFuZGxlcnMsIGkpOworICAgICAgICBpZiAoIWhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci50eXBlICYmIGkgPCBuLTEpCisgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgImRlZmF1bHQgJ2V4Y2VwdDonIG11c3QgYmUgbGFzdCIpOworICAgICAgICBjLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKKyAgICAgICAgYy0+dS0+dV9saW5lbm8gPSBoYW5kbGVyLT5saW5lbm87CisgICAgICAgIGV4Y2VwdCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICAgICAgaWYgKGV4Y2VwdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChoYW5kbGVyLT52LkV4Y2VwdEhhbmRsZXIudHlwZSkgeworICAgICAgICAgICAgQURET1AoYywgRFVQX1RPUCk7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBoYW5kbGVyLT52LkV4Y2VwdEhhbmRsZXIudHlwZSk7CisgICAgICAgICAgICBBRERPUF9JKGMsIENPTVBBUkVfT1AsIFB5Q21wX0VYQ19NQVRDSCk7CisgICAgICAgICAgICBBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX0ZBTFNFLCBleGNlcHQpOworICAgICAgICB9CisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICBpZiAoaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLm5hbWUpIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICB9CisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICBWSVNJVF9TRVEoYywgc3RtdCwgaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLmJvZHkpOworICAgICAgICBBRERPUF9KUkVMKGMsIEpVTVBfRk9SV0FSRCwgZW5kKTsKKyAgICAgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZXhjZXB0KTsKKyAgICB9CisgICAgQURET1AoYywgRU5EX0ZJTkFMTFkpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIG9yZWxzZSk7CisgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuVHJ5RXhjZXB0Lm9yZWxzZSk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfaW1wb3J0X2FzKHN0cnVjdCBjb21waWxlciAqYywgaWRlbnRpZmllciBuYW1lLCBpZGVudGlmaWVyIGFzbmFtZSkKIHsKLQkvKiBUaGUgSU1QT1JUX05BTUUgb3Bjb2RlIHdhcyBhbHJlYWR5IGdlbmVyYXRlZC4gIFRoaXMgZnVuY3Rpb24KLQkgICBtZXJlbHkgbmVlZHMgdG8gYmluZCB0aGUgcmVzdWx0IHRvIGEgbmFtZS4KKyAgICAvKiBUaGUgSU1QT1JUX05BTUUgb3Bjb2RlIHdhcyBhbHJlYWR5IGdlbmVyYXRlZC4gIFRoaXMgZnVuY3Rpb24KKyAgICAgICBtZXJlbHkgbmVlZHMgdG8gYmluZCB0aGUgcmVzdWx0IHRvIGEgbmFtZS4KIAotCSAgIElmIHRoZXJlIGlzIGEgZG90IGluIG5hbWUsIHdlIG5lZWQgdG8gc3BsaXQgaXQgYW5kIGVtaXQgYSAKLQkgICBMT0FEX0FUVFIgZm9yIGVhY2ggbmFtZS4KLQkqLwotCWNvbnN0IGNoYXIgKnNyYyA9IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKTsKLQljb25zdCBjaGFyICpkb3QgPSBzdHJjaHIoc3JjLCAnLicpOwotCWlmIChkb3QpIHsKLQkJLyogQ29uc3VtZSB0aGUgYmFzZSBtb2R1bGUgbmFtZSB0byBnZXQgdGhlIGZpcnN0IGF0dHJpYnV0ZSAqLwotCQlzcmMgPSBkb3QgKyAxOwotCQl3aGlsZSAoZG90KSB7Ci0JCQkvKiBOQiBzcmMgaXMgb25seSBkZWZpbmVkIHdoZW4gZG90ICE9IE5VTEwgKi8KLQkJCVB5T2JqZWN0ICphdHRyOwotCQkJZG90ID0gc3RyY2hyKHNyYywgJy4nKTsKLQkJCWF0dHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzcmMsIAotCQkJCQkgICAgZG90ID8gZG90IC0gc3JjIDogc3RybGVuKHNyYykpOwotCQkJaWYgKCFhdHRyKQotCQkJCXJldHVybiAtMTsKLQkJCUFERE9QX08oYywgTE9BRF9BVFRSLCBhdHRyLCBuYW1lcyk7Ci0JCQlQeV9ERUNSRUYoYXR0cik7Ci0JCQlzcmMgPSBkb3QgKyAxOwotCQl9Ci0JfQotCXJldHVybiBjb21waWxlcl9uYW1lb3AoYywgYXNuYW1lLCBTdG9yZSk7CisgICAgICAgSWYgdGhlcmUgaXMgYSBkb3QgaW4gbmFtZSwgd2UgbmVlZCB0byBzcGxpdCBpdCBhbmQgZW1pdCBhCisgICAgICAgTE9BRF9BVFRSIGZvciBlYWNoIG5hbWUuCisgICAgKi8KKyAgICBjb25zdCBjaGFyICpzcmMgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZSk7CisgICAgY29uc3QgY2hhciAqZG90ID0gc3RyY2hyKHNyYywgJy4nKTsKKyAgICBpZiAoZG90KSB7CisgICAgICAgIC8qIENvbnN1bWUgdGhlIGJhc2UgbW9kdWxlIG5hbWUgdG8gZ2V0IHRoZSBmaXJzdCBhdHRyaWJ1dGUgKi8KKyAgICAgICAgc3JjID0gZG90ICsgMTsKKyAgICAgICAgd2hpbGUgKGRvdCkgeworICAgICAgICAgICAgLyogTkIgc3JjIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGRvdCAhPSBOVUxMICovCisgICAgICAgICAgICBQeU9iamVjdCAqYXR0cjsKKyAgICAgICAgICAgIGRvdCA9IHN0cmNocihzcmMsICcuJyk7CisgICAgICAgICAgICBhdHRyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3QgPyBkb3QgLSBzcmMgOiBzdHJsZW4oc3JjKSk7CisgICAgICAgICAgICBpZiAoIWF0dHIpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0FUVFIsIGF0dHIsIG5hbWVzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhdHRyKTsKKyAgICAgICAgICAgIHNyYyA9IGRvdCArIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvbXBpbGVyX25hbWVvcChjLCBhc25hbWUsIFN0b3JlKTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfaW1wb3J0KHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCS8qIFRoZSBJbXBvcnQgbm9kZSBzdG9yZXMgYSBtb2R1bGUgbmFtZSBsaWtlIGEuYi5jIGFzIGEgc2luZ2xlCi0JICAgc3RyaW5nLiAgVGhpcyBpcyBjb252ZW5pZW50IGZvciBhbGwgY2FzZXMgZXhjZXB0Ci0JICAgICBpbXBvcnQgYS5iLmMgYXMgZAotCSAgIHdoZXJlIHdlIG5lZWQgdG8gcGFyc2UgdGhhdCBzdHJpbmcgdG8gZXh0cmFjdCB0aGUgaW5kaXZpZHVhbAotCSAgIG1vZHVsZSBuYW1lcy4gIAotCSAgIFhYWCBQZXJoYXBzIGNoYW5nZSB0aGUgcmVwcmVzZW50YXRpb24gdG8gbWFrZSB0aGlzIGNhc2Ugc2ltcGxlcj8KLQkgKi8KLQlpbnQgaSwgbiA9IGFzZGxfc2VxX0xFTihzLT52LkltcG9ydC5uYW1lcyk7CisgICAgLyogVGhlIEltcG9ydCBub2RlIHN0b3JlcyBhIG1vZHVsZSBuYW1lIGxpa2UgYS5iLmMgYXMgYSBzaW5nbGUKKyAgICAgICBzdHJpbmcuICBUaGlzIGlzIGNvbnZlbmllbnQgZm9yIGFsbCBjYXNlcyBleGNlcHQKKyAgICAgICAgIGltcG9ydCBhLmIuYyBhcyBkCisgICAgICAgd2hlcmUgd2UgbmVlZCB0byBwYXJzZSB0aGF0IHN0cmluZyB0byBleHRyYWN0IHRoZSBpbmRpdmlkdWFsCisgICAgICAgbW9kdWxlIG5hbWVzLgorICAgICAgIFhYWCBQZXJoYXBzIGNoYW5nZSB0aGUgcmVwcmVzZW50YXRpb24gdG8gbWFrZSB0aGlzIGNhc2Ugc2ltcGxlcj8KKyAgICAgKi8KKyAgICBpbnQgaSwgbiA9IGFzZGxfc2VxX0xFTihzLT52LkltcG9ydC5uYW1lcyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWFsaWFzX3R5IGFsaWFzID0gKGFsaWFzX3R5KWFzZGxfc2VxX0dFVChzLT52LkltcG9ydC5uYW1lcywgaSk7Ci0JCWludCByOwotCQlQeU9iamVjdCAqbGV2ZWw7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBhbGlhc190eSBhbGlhcyA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQocy0+di5JbXBvcnQubmFtZXMsIGkpOworICAgICAgICBpbnQgcjsKKyAgICAgICAgUHlPYmplY3QgKmxldmVsOwogCi0JCWlmIChjLT5jX2ZsYWdzICYmIChjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQpKQotCQkJbGV2ZWwgPSBQeUludF9Gcm9tTG9uZygwKTsKLQkJZWxzZQotCQkJbGV2ZWwgPSBQeUludF9Gcm9tTG9uZygtMSk7CisgICAgICAgIGlmIChjLT5jX2ZsYWdzICYmIChjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQpKQorICAgICAgICAgICAgbGV2ZWwgPSBQeUludF9Gcm9tTG9uZygwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGV2ZWwgPSBQeUludF9Gcm9tTG9uZygtMSk7CiAKLQkJaWYgKGxldmVsID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKGxldmVsID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIGxldmVsLCBjb25zdHMpOwotCQlQeV9ERUNSRUYobGV2ZWwpOwotCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7Ci0JCUFERE9QX05BTUUoYywgSU1QT1JUX05BTUUsIGFsaWFzLT5uYW1lLCBuYW1lcyk7CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgbGV2ZWwsIGNvbnN0cyk7CisgICAgICAgIFB5X0RFQ1JFRihsZXZlbCk7CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKKyAgICAgICAgQURET1BfTkFNRShjLCBJTVBPUlRfTkFNRSwgYWxpYXMtPm5hbWUsIG5hbWVzKTsKIAotCQlpZiAoYWxpYXMtPmFzbmFtZSkgewotCQkJciA9IGNvbXBpbGVyX2ltcG9ydF9hcyhjLCBhbGlhcy0+bmFtZSwgYWxpYXMtPmFzbmFtZSk7Ci0JCQlpZiAoIXIpCi0JCQkgICAgcmV0dXJuIHI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZGVudGlmaWVyIHRtcCA9IGFsaWFzLT5uYW1lOwotCQkJY29uc3QgY2hhciAqYmFzZSA9IFB5U3RyaW5nX0FTX1NUUklORyhhbGlhcy0+bmFtZSk7Ci0JCQljaGFyICpkb3QgPSBzdHJjaHIoYmFzZSwgJy4nKTsKLQkJCWlmIChkb3QpCi0JCQkJdG1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYmFzZSwgCi0JCQkJCQkJCSBkb3QgLSBiYXNlKTsKLQkJCXIgPSBjb21waWxlcl9uYW1lb3AoYywgdG1wLCBTdG9yZSk7Ci0JCQlpZiAoZG90KSB7Ci0JCQkJUHlfREVDUkVGKHRtcCk7Ci0JCQl9Ci0JCQlpZiAoIXIpCi0JCQkJcmV0dXJuIHI7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgICAgIGlmIChhbGlhcy0+YXNuYW1lKSB7CisgICAgICAgICAgICByID0gY29tcGlsZXJfaW1wb3J0X2FzKGMsIGFsaWFzLT5uYW1lLCBhbGlhcy0+YXNuYW1lKTsKKyAgICAgICAgICAgIGlmICghcikKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlkZW50aWZpZXIgdG1wID0gYWxpYXMtPm5hbWU7CisgICAgICAgICAgICBjb25zdCBjaGFyICpiYXNlID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFsaWFzLT5uYW1lKTsKKyAgICAgICAgICAgIGNoYXIgKmRvdCA9IHN0cmNocihiYXNlLCAnLicpOworICAgICAgICAgICAgaWYgKGRvdCkKKyAgICAgICAgICAgICAgICB0bXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdCAtIGJhc2UpOworICAgICAgICAgICAgciA9IGNvbXBpbGVyX25hbWVvcChjLCB0bXAsIFN0b3JlKTsKKyAgICAgICAgICAgIGlmIChkb3QpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcikKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfZnJvbV9pbXBvcnQoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JaW50IGksIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5JbXBvcnRGcm9tLm5hbWVzKTsKKyAgICBpbnQgaSwgbiA9IGFzZGxfc2VxX0xFTihzLT52LkltcG9ydEZyb20ubmFtZXMpOwogCi0JUHlPYmplY3QgKm5hbWVzID0gUHlUdXBsZV9OZXcobik7Ci0JUHlPYmplY3QgKmxldmVsOwotCXN0YXRpYyBQeU9iamVjdCAqZW1wdHlfc3RyaW5nOworICAgIFB5T2JqZWN0ICpuYW1lcyA9IFB5VHVwbGVfTmV3KG4pOworICAgIFB5T2JqZWN0ICpsZXZlbDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmVtcHR5X3N0cmluZzsKIAotCWlmICghZW1wdHlfc3RyaW5nKSB7Ci0JCWVtcHR5X3N0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCQlpZiAoIWVtcHR5X3N0cmluZykKLQkJCXJldHVybiAwOwotCX0KLQkKLQlpZiAoIW5hbWVzKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoIWVtcHR5X3N0cmluZykgeworICAgICAgICBlbXB0eV9zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKCFlbXB0eV9zdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAocy0+di5JbXBvcnRGcm9tLmxldmVsID09IDAgJiYgYy0+Y19mbGFncyAmJgotCSAgICAhKGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgQ09fRlVUVVJFX0FCU09MVVRFX0lNUE9SVCkpCi0JCWxldmVsID0gUHlJbnRfRnJvbUxvbmcoLTEpOwotCWVsc2UKLQkJbGV2ZWwgPSBQeUludF9Gcm9tTG9uZyhzLT52LkltcG9ydEZyb20ubGV2ZWwpOworICAgIGlmICghbmFtZXMpCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCFsZXZlbCkgewotCQlQeV9ERUNSRUYobmFtZXMpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKHMtPnYuSW1wb3J0RnJvbS5sZXZlbCA9PSAwICYmIGMtPmNfZmxhZ3MgJiYKKyAgICAgICAgIShjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQpKQorICAgICAgICBsZXZlbCA9IFB5SW50X0Zyb21Mb25nKC0xKTsKKyAgICBlbHNlCisgICAgICAgIGxldmVsID0gUHlJbnRfRnJvbUxvbmcocy0+di5JbXBvcnRGcm9tLmxldmVsKTsKIAotCS8qIGJ1aWxkIHVwIHRoZSBuYW1lcyAqLwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJYWxpYXNfdHkgYWxpYXMgPSAoYWxpYXNfdHkpYXNkbF9zZXFfR0VUKHMtPnYuSW1wb3J0RnJvbS5uYW1lcywgaSk7Ci0JCVB5X0lOQ1JFRihhbGlhcy0+bmFtZSk7Ci0JCVB5VHVwbGVfU0VUX0lURU0obmFtZXMsIGksIGFsaWFzLT5uYW1lKTsKLQl9CisgICAgaWYgKCFsZXZlbCkgeworICAgICAgICBQeV9ERUNSRUYobmFtZXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAocy0+bGluZW5vID4gYy0+Y19mdXR1cmUtPmZmX2xpbmVubyAmJiBzLT52LkltcG9ydEZyb20ubW9kdWxlICYmIAotCSAgICAhc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhzLT52LkltcG9ydEZyb20ubW9kdWxlKSwgIl9fZnV0dXJlX18iKSkgewotCQlQeV9ERUNSRUYobGV2ZWwpOwotCQlQeV9ERUNSRUYobmFtZXMpOwotCQlyZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgImZyb20gX19mdXR1cmVfXyBpbXBvcnRzIG11c3Qgb2NjdXIgIgotCQkJCSAgICAgICJhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIik7Ci0JfQorICAgIC8qIGJ1aWxkIHVwIHRoZSBuYW1lcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgYWxpYXNfdHkgYWxpYXMgPSAoYWxpYXNfdHkpYXNkbF9zZXFfR0VUKHMtPnYuSW1wb3J0RnJvbS5uYW1lcywgaSk7CisgICAgICAgIFB5X0lOQ1JFRihhbGlhcy0+bmFtZSk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmFtZXMsIGksIGFsaWFzLT5uYW1lKTsKKyAgICB9CiAKLQlBRERPUF9PKGMsIExPQURfQ09OU1QsIGxldmVsLCBjb25zdHMpOwotCVB5X0RFQ1JFRihsZXZlbCk7Ci0JQURET1BfTyhjLCBMT0FEX0NPTlNULCBuYW1lcywgY29uc3RzKTsKLQlQeV9ERUNSRUYobmFtZXMpOwotCWlmIChzLT52LkltcG9ydEZyb20ubW9kdWxlKSB7Ci0JCUFERE9QX05BTUUoYywgSU1QT1JUX05BTUUsIHMtPnYuSW1wb3J0RnJvbS5tb2R1bGUsIG5hbWVzKTsKLQl9Ci0JZWxzZSB7Ci0JCUFERE9QX05BTUUoYywgSU1QT1JUX05BTUUsIGVtcHR5X3N0cmluZywgbmFtZXMpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWFsaWFzX3R5IGFsaWFzID0gKGFsaWFzX3R5KWFzZGxfc2VxX0dFVChzLT52LkltcG9ydEZyb20ubmFtZXMsIGkpOwotCQlpZGVudGlmaWVyIHN0b3JlX25hbWU7CisgICAgaWYgKHMtPmxpbmVubyA+IGMtPmNfZnV0dXJlLT5mZl9saW5lbm8gJiYgcy0+di5JbXBvcnRGcm9tLm1vZHVsZSAmJgorICAgICAgICAhc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhzLT52LkltcG9ydEZyb20ubW9kdWxlKSwgIl9fZnV0dXJlX18iKSkgeworICAgICAgICBQeV9ERUNSRUYobGV2ZWwpOworICAgICAgICBQeV9ERUNSRUYobmFtZXMpOworICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgImZyb20gX19mdXR1cmVfXyBpbXBvcnRzIG11c3Qgb2NjdXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUiKTsKKyAgICB9CiAKLQkJaWYgKGkgPT0gMCAmJiAqUHlTdHJpbmdfQVNfU1RSSU5HKGFsaWFzLT5uYW1lKSA9PSAnKicpIHsKLQkJCWFzc2VydChuID09IDEpOwotCQkJQURET1AoYywgSU1QT1JUX1NUQVIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJICAgIAotCQlBRERPUF9OQU1FKGMsIElNUE9SVF9GUk9NLCBhbGlhcy0+bmFtZSwgbmFtZXMpOwotCQlzdG9yZV9uYW1lID0gYWxpYXMtPm5hbWU7Ci0JCWlmIChhbGlhcy0+YXNuYW1lKQotCQkJc3RvcmVfbmFtZSA9IGFsaWFzLT5hc25hbWU7CisgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBsZXZlbCwgY29uc3RzKTsKKyAgICBQeV9ERUNSRUYobGV2ZWwpOworICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgbmFtZXMsIGNvbnN0cyk7CisgICAgUHlfREVDUkVGKG5hbWVzKTsKKyAgICBpZiAocy0+di5JbXBvcnRGcm9tLm1vZHVsZSkgeworICAgICAgICBBRERPUF9OQU1FKGMsIElNUE9SVF9OQU1FLCBzLT52LkltcG9ydEZyb20ubW9kdWxlLCBuYW1lcyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBBRERPUF9OQU1FKGMsIElNUE9SVF9OQU1FLCBlbXB0eV9zdHJpbmcsIG5hbWVzKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBhbGlhc190eSBhbGlhcyA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQocy0+di5JbXBvcnRGcm9tLm5hbWVzLCBpKTsKKyAgICAgICAgaWRlbnRpZmllciBzdG9yZV9uYW1lOwogCi0JCWlmICghY29tcGlsZXJfbmFtZW9wKGMsIHN0b3JlX25hbWUsIFN0b3JlKSkgewotCQkJUHlfREVDUkVGKG5hbWVzKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCS8qIHJlbW92ZSBpbXBvcnRlZCBtb2R1bGUgKi8KLQlBRERPUChjLCBQT1BfVE9QKTsKLQlyZXR1cm4gMTsKKyAgICAgICAgaWYgKGkgPT0gMCAmJiAqUHlTdHJpbmdfQVNfU1RSSU5HKGFsaWFzLT5uYW1lKSA9PSAnKicpIHsKKyAgICAgICAgICAgIGFzc2VydChuID09IDEpOworICAgICAgICAgICAgQURET1AoYywgSU1QT1JUX1NUQVIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBBRERPUF9OQU1FKGMsIElNUE9SVF9GUk9NLCBhbGlhcy0+bmFtZSwgbmFtZXMpOworICAgICAgICBzdG9yZV9uYW1lID0gYWxpYXMtPm5hbWU7CisgICAgICAgIGlmIChhbGlhcy0+YXNuYW1lKQorICAgICAgICAgICAgc3RvcmVfbmFtZSA9IGFsaWFzLT5hc25hbWU7CisKKyAgICAgICAgaWYgKCFjb21waWxlcl9uYW1lb3AoYywgc3RvcmVfbmFtZSwgU3RvcmUpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobmFtZXMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogcmVtb3ZlIGltcG9ydGVkIG1vZHVsZSAqLworICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9hc3NlcnQoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICphc3NlcnRpb25fZXJyb3IgPSBOVUxMOwotCWJhc2ljYmxvY2sgKmVuZDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmFzc2VydGlvbl9lcnJvciA9IE5VTEw7CisgICAgYmFzaWNibG9jayAqZW5kOwogCi0JaWYgKFB5X09wdGltaXplRmxhZykKLQkJcmV0dXJuIDE7Ci0JaWYgKGFzc2VydGlvbl9lcnJvciA9PSBOVUxMKSB7Ci0JCWFzc2VydGlvbl9lcnJvciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIkFzc2VydGlvbkVycm9yIik7Ci0JCWlmIChhc3NlcnRpb25fZXJyb3IgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCX0KLQlpZiAocy0+di5Bc3NlcnQudGVzdC0+a2luZCA9PSBUdXBsZV9raW5kICYmCi0JICAgIGFzZGxfc2VxX0xFTihzLT52LkFzc2VydC50ZXN0LT52LlR1cGxlLmVsdHMpID4gMCkgewotCQljb25zdCBjaGFyKiBtc2cgPQotCQkJImFzc2VydGlvbiBpcyBhbHdheXMgdHJ1ZSwgcGVyaGFwcyByZW1vdmUgcGFyZW50aGVzZXM/IjsKLQkJaWYgKFB5RXJyX1dhcm5FeHBsaWNpdChQeUV4Y19TeW50YXhXYXJuaW5nLCBtc2csIGMtPmNfZmlsZW5hbWUsCi0JCQkJICAgICAgIGMtPnUtPnVfbGluZW5vLCBOVUxMLCBOVUxMKSA9PSAtMSkKLQkJCXJldHVybiAwOwotCX0KLQlWSVNJVChjLCBleHByLCBzLT52LkFzc2VydC50ZXN0KTsKLQllbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWYgKGVuZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX1RSVUUsIGVuZCk7Ci0JQURET1BfTyhjLCBMT0FEX0dMT0JBTCwgYXNzZXJ0aW9uX2Vycm9yLCBuYW1lcyk7Ci0JaWYgKHMtPnYuQXNzZXJ0Lm1zZykgewotCQlWSVNJVChjLCBleHByLCBzLT52LkFzc2VydC5tc2cpOwotCQlBRERPUF9JKGMsIFJBSVNFX1ZBUkFSR1MsIDIpOwotCX0KLQllbHNlIHsKLQkJQURET1BfSShjLCBSQUlTRV9WQVJBUkdTLCAxKTsKLQl9Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoUHlfT3B0aW1pemVGbGFnKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoYXNzZXJ0aW9uX2Vycm9yID09IE5VTEwpIHsKKyAgICAgICAgYXNzZXJ0aW9uX2Vycm9yID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiQXNzZXJ0aW9uRXJyb3IiKTsKKyAgICAgICAgaWYgKGFzc2VydGlvbl9lcnJvciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChzLT52LkFzc2VydC50ZXN0LT5raW5kID09IFR1cGxlX2tpbmQgJiYKKyAgICAgICAgYXNkbF9zZXFfTEVOKHMtPnYuQXNzZXJ0LnRlc3QtPnYuVHVwbGUuZWx0cykgPiAwKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIG1zZyA9CisgICAgICAgICAgICAiYXNzZXJ0aW9uIGlzIGFsd2F5cyB0cnVlLCBwZXJoYXBzIHJlbW92ZSBwYXJlbnRoZXNlcz8iOworICAgICAgICBpZiAoUHlFcnJfV2FybkV4cGxpY2l0KFB5RXhjX1N5bnRheFdhcm5pbmcsIG1zZywgYy0+Y19maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT51LT51X2xpbmVubywgTlVMTCwgTlVMTCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVklTSVQoYywgZXhwciwgcy0+di5Bc3NlcnQudGVzdCk7CisgICAgZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChlbmQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgQURET1BfSkFCUyhjLCBQT1BfSlVNUF9JRl9UUlVFLCBlbmQpOworICAgIEFERE9QX08oYywgTE9BRF9HTE9CQUwsIGFzc2VydGlvbl9lcnJvciwgbmFtZXMpOworICAgIGlmIChzLT52LkFzc2VydC5tc2cpIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5Bc3NlcnQubXNnKTsKKyAgICAgICAgQURET1BfSShjLCBSQUlTRV9WQVJBUkdTLCAyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEFERE9QX0koYywgUkFJU0VfVkFSQVJHUywgMSk7CisgICAgfQorICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3Zpc2l0X3N0bXQoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JaW50IGksIG47CisgICAgaW50IGksIG47CiAKLQkvKiBBbHdheXMgYXNzaWduIGEgbGluZW5vIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uIGZvciBhIHN0bXQuICovCi0JYy0+dS0+dV9saW5lbm8gPSBzLT5saW5lbm87Ci0JYy0+dS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7CisgICAgLyogQWx3YXlzIGFzc2lnbiBhIGxpbmVubyB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiBmb3IgYSBzdG10LiAqLworICAgIGMtPnUtPnVfbGluZW5vID0gcy0+bGluZW5vOworICAgIGMtPnUtPnVfbGluZW5vX3NldCA9IGZhbHNlOwogCi0Jc3dpdGNoIChzLT5raW5kKSB7Ci0JY2FzZSBGdW5jdGlvbkRlZl9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfZnVuY3Rpb24oYywgcyk7Ci0JY2FzZSBDbGFzc0RlZl9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfY2xhc3MoYywgcyk7Ci0JY2FzZSBSZXR1cm5fa2luZDoKLQkJaWYgKGMtPnUtPnVfc3RlLT5zdGVfdHlwZSAhPSBGdW5jdGlvbkJsb2NrKQotCQkJcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICIncmV0dXJuJyBvdXRzaWRlIGZ1bmN0aW9uIik7Ci0JCWlmIChzLT52LlJldHVybi52YWx1ZSkgewotCQkJVklTSVQoYywgZXhwciwgcy0+di5SZXR1cm4udmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJCUFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKLQkJQURET1AoYywgUkVUVVJOX1ZBTFVFKTsKLQkJYnJlYWs7Ci0JY2FzZSBEZWxldGVfa2luZDoKLQkJVklTSVRfU0VRKGMsIGV4cHIsIHMtPnYuRGVsZXRlLnRhcmdldHMpCi0JCWJyZWFrOwotCWNhc2UgQXNzaWduX2tpbmQ6Ci0JCW4gPSBhc2RsX3NlcV9MRU4ocy0+di5Bc3NpZ24udGFyZ2V0cyk7Ci0JCVZJU0lUKGMsIGV4cHIsIHMtPnYuQXNzaWduLnZhbHVlKTsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJaWYgKGkgPCBuIC0gMSkKLQkJCQlBRERPUChjLCBEVVBfVE9QKTsKLQkJCVZJU0lUKGMsIGV4cHIsCi0JCQkgICAgICAoZXhwcl90eSlhc2RsX3NlcV9HRVQocy0+di5Bc3NpZ24udGFyZ2V0cywgaSkpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQXVnQXNzaWduX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9hdWdhc3NpZ24oYywgcyk7Ci0JY2FzZSBQcmludF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfcHJpbnQoYywgcyk7Ci0JY2FzZSBGb3Jfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2ZvcihjLCBzKTsKLQljYXNlIFdoaWxlX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl93aGlsZShjLCBzKTsKLQljYXNlIElmX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9pZihjLCBzKTsKLQljYXNlIFJhaXNlX2tpbmQ6Ci0JCW4gPSAwOwotCQlpZiAocy0+di5SYWlzZS50eXBlKSB7Ci0JCQlWSVNJVChjLCBleHByLCBzLT52LlJhaXNlLnR5cGUpOwotCQkJbisrOwotCQkJaWYgKHMtPnYuUmFpc2UuaW5zdCkgewotCQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuUmFpc2UuaW5zdCk7Ci0JCQkJbisrOwotCQkJCWlmIChzLT52LlJhaXNlLnRiYWNrKSB7Ci0JCQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuUmFpc2UudGJhY2spOwotCQkJCQluKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUFERE9QX0koYywgUkFJU0VfVkFSQVJHUywgbik7Ci0JCWJyZWFrOwotCWNhc2UgVHJ5RXhjZXB0X2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl90cnlfZXhjZXB0KGMsIHMpOwotCWNhc2UgVHJ5RmluYWxseV9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfdHJ5X2ZpbmFsbHkoYywgcyk7Ci0JY2FzZSBBc3NlcnRfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2Fzc2VydChjLCBzKTsKLQljYXNlIEltcG9ydF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfaW1wb3J0KGMsIHMpOwotCWNhc2UgSW1wb3J0RnJvbV9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfZnJvbV9pbXBvcnQoYywgcyk7Ci0JY2FzZSBFeGVjX2tpbmQ6Ci0JCVZJU0lUKGMsIGV4cHIsIHMtPnYuRXhlYy5ib2R5KTsKLQkJaWYgKHMtPnYuRXhlYy5nbG9iYWxzKSB7Ci0JCQlWSVNJVChjLCBleHByLCBzLT52LkV4ZWMuZ2xvYmFscyk7Ci0JCQlpZiAocy0+di5FeGVjLmxvY2FscykgewotCQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuRXhlYy5sb2NhbHMpOwotCQkJfSBlbHNlIHsKLQkJCQlBRERPUChjLCBEVVBfVE9QKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKLQkJCUFERE9QKGMsIERVUF9UT1ApOwotCQl9Ci0JCUFERE9QKGMsIEVYRUNfU1RNVCk7Ci0JCWJyZWFrOwotCWNhc2UgR2xvYmFsX2tpbmQ6Ci0JCWJyZWFrOwotCWNhc2UgRXhwcl9raW5kOgotCQlpZiAoYy0+Y19pbnRlcmFjdGl2ZSAmJiBjLT5jX25lc3RsZXZlbCA8PSAxKSB7Ci0JCQlWSVNJVChjLCBleHByLCBzLT52LkV4cHIudmFsdWUpOwotCQkJQURET1AoYywgUFJJTlRfRVhQUik7Ci0JCX0KLQkJZWxzZSBpZiAocy0+di5FeHByLnZhbHVlLT5raW5kICE9IFN0cl9raW5kICYmCi0JCQkgcy0+di5FeHByLnZhbHVlLT5raW5kICE9IE51bV9raW5kKSB7Ci0JCQlWSVNJVChjLCBleHByLCBzLT52LkV4cHIudmFsdWUpOwotCQkJQURET1AoYywgUE9QX1RPUCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBQYXNzX2tpbmQ6Ci0JCWJyZWFrOwotCWNhc2UgQnJlYWtfa2luZDoKLQkJaWYgKCFjb21waWxlcl9pbl9sb29wKGMpKQotCQkJcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICInYnJlYWsnIG91dHNpZGUgbG9vcCIpOwotCQlBRERPUChjLCBCUkVBS19MT09QKTsKLQkJYnJlYWs7Ci0JY2FzZSBDb250aW51ZV9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfY29udGludWUoYyk7Ci0JY2FzZSBXaXRoX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl93aXRoKGMsIHMpOwotCX0KLQlyZXR1cm4gMTsKKyAgICBzd2l0Y2ggKHMtPmtpbmQpIHsKKyAgICBjYXNlIEZ1bmN0aW9uRGVmX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9mdW5jdGlvbihjLCBzKTsKKyAgICBjYXNlIENsYXNzRGVmX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9jbGFzcyhjLCBzKTsKKyAgICBjYXNlIFJldHVybl9raW5kOgorICAgICAgICBpZiAoYy0+dS0+dV9zdGUtPnN0ZV90eXBlICE9IEZ1bmN0aW9uQmxvY2spCisgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgIidyZXR1cm4nIG91dHNpZGUgZnVuY3Rpb24iKTsKKyAgICAgICAgaWYgKHMtPnYuUmV0dXJuLnZhbHVlKSB7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LlJldHVybi52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOworICAgICAgICBBRERPUChjLCBSRVRVUk5fVkFMVUUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERlbGV0ZV9raW5kOgorICAgICAgICBWSVNJVF9TRVEoYywgZXhwciwgcy0+di5EZWxldGUudGFyZ2V0cykKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBc3NpZ25fa2luZDoKKyAgICAgICAgbiA9IGFzZGxfc2VxX0xFTihzLT52LkFzc2lnbi50YXJnZXRzKTsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5Bc3NpZ24udmFsdWUpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA8IG4gLSAxKQorICAgICAgICAgICAgICAgIEFERE9QKGMsIERVUF9UT1ApOworICAgICAgICAgICAgVklTSVQoYywgZXhwciwKKyAgICAgICAgICAgICAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChzLT52LkFzc2lnbi50YXJnZXRzLCBpKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBdWdBc3NpZ25fa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2F1Z2Fzc2lnbihjLCBzKTsKKyAgICBjYXNlIFByaW50X2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9wcmludChjLCBzKTsKKyAgICBjYXNlIEZvcl9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfZm9yKGMsIHMpOworICAgIGNhc2UgV2hpbGVfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX3doaWxlKGMsIHMpOworICAgIGNhc2UgSWZfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2lmKGMsIHMpOworICAgIGNhc2UgUmFpc2Vfa2luZDoKKyAgICAgICAgbiA9IDA7CisgICAgICAgIGlmIChzLT52LlJhaXNlLnR5cGUpIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuUmFpc2UudHlwZSk7CisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICBpZiAocy0+di5SYWlzZS5pbnN0KSB7CisgICAgICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5SYWlzZS5pbnN0KTsKKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgaWYgKHMtPnYuUmFpc2UudGJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5SYWlzZS50YmFjayk7CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQURET1BfSShjLCBSQUlTRV9WQVJBUkdTLCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUcnlFeGNlcHRfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX3RyeV9leGNlcHQoYywgcyk7CisgICAgY2FzZSBUcnlGaW5hbGx5X2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl90cnlfZmluYWxseShjLCBzKTsKKyAgICBjYXNlIEFzc2VydF9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfYXNzZXJ0KGMsIHMpOworICAgIGNhc2UgSW1wb3J0X2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9pbXBvcnQoYywgcyk7CisgICAgY2FzZSBJbXBvcnRGcm9tX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9mcm9tX2ltcG9ydChjLCBzKTsKKyAgICBjYXNlIEV4ZWNfa2luZDoKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5FeGVjLmJvZHkpOworICAgICAgICBpZiAocy0+di5FeGVjLmdsb2JhbHMpIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuRXhlYy5nbG9iYWxzKTsKKyAgICAgICAgICAgIGlmIChzLT52LkV4ZWMubG9jYWxzKSB7CisgICAgICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5FeGVjLmxvY2Fscyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFERE9QKGMsIERVUF9UT1ApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOworICAgICAgICAgICAgQURET1AoYywgRFVQX1RPUCk7CisgICAgICAgIH0KKyAgICAgICAgQURET1AoYywgRVhFQ19TVE1UKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHbG9iYWxfa2luZDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFeHByX2tpbmQ6CisgICAgICAgIGlmIChjLT5jX2ludGVyYWN0aXZlICYmIGMtPmNfbmVzdGxldmVsIDw9IDEpIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuRXhwci52YWx1ZSk7CisgICAgICAgICAgICBBRERPUChjLCBQUklOVF9FWFBSKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzLT52LkV4cHIudmFsdWUtPmtpbmQgIT0gU3RyX2tpbmQgJiYKKyAgICAgICAgICAgICAgICAgcy0+di5FeHByLnZhbHVlLT5raW5kICE9IE51bV9raW5kKSB7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkV4cHIudmFsdWUpOworICAgICAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYXNzX2tpbmQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQnJlYWtfa2luZDoKKyAgICAgICAgaWYgKCFjb21waWxlcl9pbl9sb29wKGMpKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICInYnJlYWsnIG91dHNpZGUgbG9vcCIpOworICAgICAgICBBRERPUChjLCBCUkVBS19MT09QKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb250aW51ZV9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfY29udGludWUoYyk7CisgICAgY2FzZSBXaXRoX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl93aXRoKGMsIHMpOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogdW5hcnlvcCh1bmFyeW9wX3R5IG9wKQogewotCXN3aXRjaCAob3ApIHsKLQljYXNlIEludmVydDoKLQkJcmV0dXJuIFVOQVJZX0lOVkVSVDsKLQljYXNlIE5vdDoKLQkJcmV0dXJuIFVOQVJZX05PVDsKLQljYXNlIFVBZGQ6Ci0JCXJldHVybiBVTkFSWV9QT1NJVElWRTsKLQljYXNlIFVTdWI6Ci0JCXJldHVybiBVTkFSWV9ORUdBVElWRTsKLQlkZWZhdWx0OgotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkidW5hcnkgb3AgJWQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsIG9wKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIEludmVydDoKKyAgICAgICAgcmV0dXJuIFVOQVJZX0lOVkVSVDsKKyAgICBjYXNlIE5vdDoKKyAgICAgICAgcmV0dXJuIFVOQVJZX05PVDsKKyAgICBjYXNlIFVBZGQ6CisgICAgICAgIHJldHVybiBVTkFSWV9QT1NJVElWRTsKKyAgICBjYXNlIFVTdWI6CisgICAgICAgIHJldHVybiBVTkFSWV9ORUdBVElWRTsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAidW5hcnkgb3AgJWQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsIG9wKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBiaW5vcChzdHJ1Y3QgY29tcGlsZXIgKmMsIG9wZXJhdG9yX3R5IG9wKQogewotCXN3aXRjaCAob3ApIHsKLQljYXNlIEFkZDoKLQkJcmV0dXJuIEJJTkFSWV9BREQ7Ci0JY2FzZSBTdWI6Ci0JCXJldHVybiBCSU5BUllfU1VCVFJBQ1Q7Ci0JY2FzZSBNdWx0OgotCQlyZXR1cm4gQklOQVJZX01VTFRJUExZOwotCWNhc2UgRGl2OgotCQlpZiAoYy0+Y19mbGFncyAmJiBjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9ESVZJU0lPTikKLQkJCXJldHVybiBCSU5BUllfVFJVRV9ESVZJREU7Ci0JCWVsc2UKLQkJCXJldHVybiBCSU5BUllfRElWSURFOwotCWNhc2UgTW9kOgotCQlyZXR1cm4gQklOQVJZX01PRFVMTzsKLQljYXNlIFBvdzoKLQkJcmV0dXJuIEJJTkFSWV9QT1dFUjsKLQljYXNlIExTaGlmdDoKLQkJcmV0dXJuIEJJTkFSWV9MU0hJRlQ7Ci0JY2FzZSBSU2hpZnQ6Ci0JCXJldHVybiBCSU5BUllfUlNISUZUOwotCWNhc2UgQml0T3I6Ci0JCXJldHVybiBCSU5BUllfT1I7Ci0JY2FzZSBCaXRYb3I6Ci0JCXJldHVybiBCSU5BUllfWE9SOwotCWNhc2UgQml0QW5kOgotCQlyZXR1cm4gQklOQVJZX0FORDsKLQljYXNlIEZsb29yRGl2OgotCQlyZXR1cm4gQklOQVJZX0ZMT09SX0RJVklERTsKLQlkZWZhdWx0OgotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkiYmluYXJ5IG9wICVkIHNob3VsZCBub3QgYmUgcG9zc2libGUiLCBvcCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBBZGQ6CisgICAgICAgIHJldHVybiBCSU5BUllfQUREOworICAgIGNhc2UgU3ViOgorICAgICAgICByZXR1cm4gQklOQVJZX1NVQlRSQUNUOworICAgIGNhc2UgTXVsdDoKKyAgICAgICAgcmV0dXJuIEJJTkFSWV9NVUxUSVBMWTsKKyAgICBjYXNlIERpdjoKKyAgICAgICAgaWYgKGMtPmNfZmxhZ3MgJiYgYy0+Y19mbGFncy0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfRElWSVNJT04pCisgICAgICAgICAgICByZXR1cm4gQklOQVJZX1RSVUVfRElWSURFOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gQklOQVJZX0RJVklERTsKKyAgICBjYXNlIE1vZDoKKyAgICAgICAgcmV0dXJuIEJJTkFSWV9NT0RVTE87CisgICAgY2FzZSBQb3c6CisgICAgICAgIHJldHVybiBCSU5BUllfUE9XRVI7CisgICAgY2FzZSBMU2hpZnQ6CisgICAgICAgIHJldHVybiBCSU5BUllfTFNISUZUOworICAgIGNhc2UgUlNoaWZ0OgorICAgICAgICByZXR1cm4gQklOQVJZX1JTSElGVDsKKyAgICBjYXNlIEJpdE9yOgorICAgICAgICByZXR1cm4gQklOQVJZX09SOworICAgIGNhc2UgQml0WG9yOgorICAgICAgICByZXR1cm4gQklOQVJZX1hPUjsKKyAgICBjYXNlIEJpdEFuZDoKKyAgICAgICAgcmV0dXJuIEJJTkFSWV9BTkQ7CisgICAgY2FzZSBGbG9vckRpdjoKKyAgICAgICAgcmV0dXJuIEJJTkFSWV9GTE9PUl9ESVZJREU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgImJpbmFyeSBvcCAlZCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIiwgb3ApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGNtcG9wKGNtcG9wX3R5IG9wKQogewotCXN3aXRjaCAob3ApIHsKLQljYXNlIEVxOgotCQlyZXR1cm4gUHlDbXBfRVE7Ci0JY2FzZSBOb3RFcToKLQkJcmV0dXJuIFB5Q21wX05FOwotCWNhc2UgTHQ6Ci0JCXJldHVybiBQeUNtcF9MVDsKLQljYXNlIEx0RToKLQkJcmV0dXJuIFB5Q21wX0xFOwotCWNhc2UgR3Q6Ci0JCXJldHVybiBQeUNtcF9HVDsKLQljYXNlIEd0RToKLQkJcmV0dXJuIFB5Q21wX0dFOwotCWNhc2UgSXM6Ci0JCXJldHVybiBQeUNtcF9JUzsKLQljYXNlIElzTm90OgotCQlyZXR1cm4gUHlDbXBfSVNfTk9UOwotCWNhc2UgSW46Ci0JCXJldHVybiBQeUNtcF9JTjsKLQljYXNlIE5vdEluOgotCQlyZXR1cm4gUHlDbXBfTk9UX0lOOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBQeUNtcF9CQUQ7Ci0JfQorICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIEVxOgorICAgICAgICByZXR1cm4gUHlDbXBfRVE7CisgICAgY2FzZSBOb3RFcToKKyAgICAgICAgcmV0dXJuIFB5Q21wX05FOworICAgIGNhc2UgTHQ6CisgICAgICAgIHJldHVybiBQeUNtcF9MVDsKKyAgICBjYXNlIEx0RToKKyAgICAgICAgcmV0dXJuIFB5Q21wX0xFOworICAgIGNhc2UgR3Q6CisgICAgICAgIHJldHVybiBQeUNtcF9HVDsKKyAgICBjYXNlIEd0RToKKyAgICAgICAgcmV0dXJuIFB5Q21wX0dFOworICAgIGNhc2UgSXM6CisgICAgICAgIHJldHVybiBQeUNtcF9JUzsKKyAgICBjYXNlIElzTm90OgorICAgICAgICByZXR1cm4gUHlDbXBfSVNfTk9UOworICAgIGNhc2UgSW46CisgICAgICAgIHJldHVybiBQeUNtcF9JTjsKKyAgICBjYXNlIE5vdEluOgorICAgICAgICByZXR1cm4gUHlDbXBfTk9UX0lOOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBQeUNtcF9CQUQ7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBpbnBsYWNlX2Jpbm9wKHN0cnVjdCBjb21waWxlciAqYywgb3BlcmF0b3JfdHkgb3ApCiB7Ci0Jc3dpdGNoIChvcCkgewotCWNhc2UgQWRkOgotCQlyZXR1cm4gSU5QTEFDRV9BREQ7Ci0JY2FzZSBTdWI6Ci0JCXJldHVybiBJTlBMQUNFX1NVQlRSQUNUOwotCWNhc2UgTXVsdDoKLQkJcmV0dXJuIElOUExBQ0VfTVVMVElQTFk7Ci0JY2FzZSBEaXY6Ci0JCWlmIChjLT5jX2ZsYWdzICYmIGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgQ09fRlVUVVJFX0RJVklTSU9OKQotCQkJcmV0dXJuIElOUExBQ0VfVFJVRV9ESVZJREU7Ci0JCWVsc2UKLQkJCXJldHVybiBJTlBMQUNFX0RJVklERTsKLQljYXNlIE1vZDoKLQkJcmV0dXJuIElOUExBQ0VfTU9EVUxPOwotCWNhc2UgUG93OgotCQlyZXR1cm4gSU5QTEFDRV9QT1dFUjsKLQljYXNlIExTaGlmdDoKLQkJcmV0dXJuIElOUExBQ0VfTFNISUZUOwotCWNhc2UgUlNoaWZ0OgotCQlyZXR1cm4gSU5QTEFDRV9SU0hJRlQ7Ci0JY2FzZSBCaXRPcjoKLQkJcmV0dXJuIElOUExBQ0VfT1I7Ci0JY2FzZSBCaXRYb3I6Ci0JCXJldHVybiBJTlBMQUNFX1hPUjsKLQljYXNlIEJpdEFuZDoKLQkJcmV0dXJuIElOUExBQ0VfQU5EOwotCWNhc2UgRmxvb3JEaXY6Ci0JCXJldHVybiBJTlBMQUNFX0ZMT09SX0RJVklERTsKLQlkZWZhdWx0OgotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkiaW5wbGFjZSBiaW5hcnkgb3AgJWQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsIG9wKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIEFkZDoKKyAgICAgICAgcmV0dXJuIElOUExBQ0VfQUREOworICAgIGNhc2UgU3ViOgorICAgICAgICByZXR1cm4gSU5QTEFDRV9TVUJUUkFDVDsKKyAgICBjYXNlIE11bHQ6CisgICAgICAgIHJldHVybiBJTlBMQUNFX01VTFRJUExZOworICAgIGNhc2UgRGl2OgorICAgICAgICBpZiAoYy0+Y19mbGFncyAmJiBjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9ESVZJU0lPTikKKyAgICAgICAgICAgIHJldHVybiBJTlBMQUNFX1RSVUVfRElWSURFOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gSU5QTEFDRV9ESVZJREU7CisgICAgY2FzZSBNb2Q6CisgICAgICAgIHJldHVybiBJTlBMQUNFX01PRFVMTzsKKyAgICBjYXNlIFBvdzoKKyAgICAgICAgcmV0dXJuIElOUExBQ0VfUE9XRVI7CisgICAgY2FzZSBMU2hpZnQ6CisgICAgICAgIHJldHVybiBJTlBMQUNFX0xTSElGVDsKKyAgICBjYXNlIFJTaGlmdDoKKyAgICAgICAgcmV0dXJuIElOUExBQ0VfUlNISUZUOworICAgIGNhc2UgQml0T3I6CisgICAgICAgIHJldHVybiBJTlBMQUNFX09SOworICAgIGNhc2UgQml0WG9yOgorICAgICAgICByZXR1cm4gSU5QTEFDRV9YT1I7CisgICAgY2FzZSBCaXRBbmQ6CisgICAgICAgIHJldHVybiBJTlBMQUNFX0FORDsKKyAgICBjYXNlIEZsb29yRGl2OgorICAgICAgICByZXR1cm4gSU5QTEFDRV9GTE9PUl9ESVZJREU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgImlucGxhY2UgYmluYXJ5IG9wICVkIHNob3VsZCBub3QgYmUgcG9zc2libGUiLCBvcCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfbmFtZW9wKHN0cnVjdCBjb21waWxlciAqYywgaWRlbnRpZmllciBuYW1lLCBleHByX2NvbnRleHRfdHkgY3R4KQogewotCWludCBvcCwgc2NvcGUsIGFyZzsKLQllbnVtIHsgT1BfRkFTVCwgT1BfR0xPQkFMLCBPUF9ERVJFRiwgT1BfTkFNRSB9IG9wdHlwZTsKKyAgICBpbnQgb3AsIHNjb3BlLCBhcmc7CisgICAgZW51bSB7IE9QX0ZBU1QsIE9QX0dMT0JBTCwgT1BfREVSRUYsIE9QX05BTUUgfSBvcHR5cGU7CiAKLQlQeU9iamVjdCAqZGljdCA9IGMtPnUtPnVfbmFtZXM7Ci0JUHlPYmplY3QgKm1hbmdsZWQ7Ci0JLyogWFhYIEF1Z1N0b3JlIGlzbid0IHVzZWQgYW55d2hlcmUhICovCisgICAgUHlPYmplY3QgKmRpY3QgPSBjLT51LT51X25hbWVzOworICAgIFB5T2JqZWN0ICptYW5nbGVkOworICAgIC8qIFhYWCBBdWdTdG9yZSBpc24ndCB1c2VkIGFueXdoZXJlISAqLwogCi0JbWFuZ2xlZCA9IF9QeV9NYW5nbGUoYy0+dS0+dV9wcml2YXRlLCBuYW1lKTsKLQlpZiAoIW1hbmdsZWQpCi0JCXJldHVybiAwOworICAgIG1hbmdsZWQgPSBfUHlfTWFuZ2xlKGMtPnUtPnVfcHJpdmF0ZSwgbmFtZSk7CisgICAgaWYgKCFtYW5nbGVkKQorICAgICAgICByZXR1cm4gMDsKIAotCW9wID0gMDsKLQlvcHR5cGUgPSBPUF9OQU1FOwotCXNjb3BlID0gUHlTVF9HZXRTY29wZShjLT51LT51X3N0ZSwgbWFuZ2xlZCk7Ci0Jc3dpdGNoIChzY29wZSkgewotCWNhc2UgRlJFRToKLQkJZGljdCA9IGMtPnUtPnVfZnJlZXZhcnM7Ci0JCW9wdHlwZSA9IE9QX0RFUkVGOwotCQlicmVhazsKLQljYXNlIENFTEw6Ci0JCWRpY3QgPSBjLT51LT51X2NlbGx2YXJzOwotCQlvcHR5cGUgPSBPUF9ERVJFRjsKLQkJYnJlYWs7Ci0JY2FzZSBMT0NBTDoKLQkJaWYgKGMtPnUtPnVfc3RlLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrKQotCQkJb3B0eXBlID0gT1BfRkFTVDsKLQkJYnJlYWs7Ci0JY2FzZSBHTE9CQUxfSU1QTElDSVQ6Ci0JCWlmIChjLT51LT51X3N0ZS0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jayAmJgotCQkJIWMtPnUtPnVfc3RlLT5zdGVfdW5vcHRpbWl6ZWQpCi0JCQlvcHR5cGUgPSBPUF9HTE9CQUw7Ci0JCWJyZWFrOwotCWNhc2UgR0xPQkFMX0VYUExJQ0lUOgotCQlvcHR5cGUgPSBPUF9HTE9CQUw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIHNjb3BlIGNhbiBiZSAwICovCi0JCWJyZWFrOwotCX0KKyAgICBvcCA9IDA7CisgICAgb3B0eXBlID0gT1BfTkFNRTsKKyAgICBzY29wZSA9IFB5U1RfR2V0U2NvcGUoYy0+dS0+dV9zdGUsIG1hbmdsZWQpOworICAgIHN3aXRjaCAoc2NvcGUpIHsKKyAgICBjYXNlIEZSRUU6CisgICAgICAgIGRpY3QgPSBjLT51LT51X2ZyZWV2YXJzOworICAgICAgICBvcHR5cGUgPSBPUF9ERVJFRjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDRUxMOgorICAgICAgICBkaWN0ID0gYy0+dS0+dV9jZWxsdmFyczsKKyAgICAgICAgb3B0eXBlID0gT1BfREVSRUY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE9DQUw6CisgICAgICAgIGlmIChjLT51LT51X3N0ZS0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jaykKKyAgICAgICAgICAgIG9wdHlwZSA9IE9QX0ZBU1Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xPQkFMX0lNUExJQ0lUOgorICAgICAgICBpZiAoYy0+dS0+dV9zdGUtPnN0ZV90eXBlID09IEZ1bmN0aW9uQmxvY2sgJiYKKyAgICAgICAgICAgICFjLT51LT51X3N0ZS0+c3RlX3Vub3B0aW1pemVkKQorICAgICAgICAgICAgb3B0eXBlID0gT1BfR0xPQkFMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMT0JBTF9FWFBMSUNJVDoKKyAgICAgICAgb3B0eXBlID0gT1BfR0xPQkFMOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBzY29wZSBjYW4gYmUgMCAqLworICAgICAgICBicmVhazsKKyAgICB9CiAKLQkvKiBYWFggTGVhdmUgYXNzZXJ0IGhlcmUsIGJ1dCBoYW5kbGUgX19kb2NfXyBhbmQgdGhlIGxpa2UgYmV0dGVyICovCi0JYXNzZXJ0KHNjb3BlIHx8IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKVswXSA9PSAnXycpOworICAgIC8qIFhYWCBMZWF2ZSBhc3NlcnQgaGVyZSwgYnV0IGhhbmRsZSBfX2RvY19fIGFuZCB0aGUgbGlrZSBiZXR0ZXIgKi8KKyAgICBhc3NlcnQoc2NvcGUgfHwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpWzBdID09ICdfJyk7CiAKLQlzd2l0Y2ggKG9wdHlwZSkgewotCWNhc2UgT1BfREVSRUY6Ci0JCXN3aXRjaCAoY3R4KSB7Ci0JCWNhc2UgTG9hZDogb3AgPSBMT0FEX0RFUkVGOyBicmVhazsKLQkJY2FzZSBTdG9yZTogb3AgPSBTVE9SRV9ERVJFRjsgYnJlYWs7Ci0JCWNhc2UgQXVnTG9hZDoKLQkJY2FzZSBBdWdTdG9yZToKLQkJCWJyZWFrOwotCQljYXNlIERlbDoKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeW50YXhFcnJvciwKLQkJCQkgICAgICJjYW4gbm90IGRlbGV0ZSB2YXJpYWJsZSAnJXMnIHJlZmVyZW5jZWQgIgotCQkJCSAgICAgImluIG5lc3RlZCBzY29wZSIsCi0JCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwotCQkJUHlfREVDUkVGKG1hbmdsZWQpOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgUGFyYW06Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJwYXJhbSBpbnZhbGlkIGZvciBkZXJlZiB2YXJpYWJsZSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBPUF9GQVNUOgotCQlzd2l0Y2ggKGN0eCkgewotCQljYXNlIExvYWQ6IG9wID0gTE9BRF9GQVNUOyBicmVhazsKLQkJY2FzZSBTdG9yZTogb3AgPSBTVE9SRV9GQVNUOyBicmVhazsKLQkJY2FzZSBEZWw6IG9wID0gREVMRVRFX0ZBU1Q7IGJyZWFrOwotCQljYXNlIEF1Z0xvYWQ6Ci0JCWNhc2UgQXVnU3RvcmU6Ci0JCQlicmVhazsKLQkJY2FzZSBQYXJhbToKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJInBhcmFtIGludmFsaWQgZm9yIGxvY2FsIHZhcmlhYmxlIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlBRERPUF9PKGMsIG9wLCBtYW5nbGVkLCB2YXJuYW1lcyk7Ci0JCVB5X0RFQ1JFRihtYW5nbGVkKTsKLQkJcmV0dXJuIDE7Ci0JY2FzZSBPUF9HTE9CQUw6Ci0JCXN3aXRjaCAoY3R4KSB7Ci0JCWNhc2UgTG9hZDogb3AgPSBMT0FEX0dMT0JBTDsgYnJlYWs7Ci0JCWNhc2UgU3RvcmU6IG9wID0gU1RPUkVfR0xPQkFMOyBicmVhazsKLQkJY2FzZSBEZWw6IG9wID0gREVMRVRFX0dMT0JBTDsgYnJlYWs7Ci0JCWNhc2UgQXVnTG9hZDoKLQkJY2FzZSBBdWdTdG9yZToKLQkJCWJyZWFrOwotCQljYXNlIFBhcmFtOgotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkicGFyYW0gaW52YWxpZCBmb3IgZ2xvYmFsIHZhcmlhYmxlIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIE9QX05BTUU6Ci0JCXN3aXRjaCAoY3R4KSB7Ci0JCWNhc2UgTG9hZDogb3AgPSBMT0FEX05BTUU7IGJyZWFrOwotCQljYXNlIFN0b3JlOiBvcCA9IFNUT1JFX05BTUU7IGJyZWFrOwotCQljYXNlIERlbDogb3AgPSBERUxFVEVfTkFNRTsgYnJlYWs7Ci0JCWNhc2UgQXVnTG9hZDoKLQkJY2FzZSBBdWdTdG9yZToKLQkJCWJyZWFrOwotCQljYXNlIFBhcmFtOgotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkicGFyYW0gaW52YWxpZCBmb3IgbmFtZSB2YXJpYWJsZSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorICAgIHN3aXRjaCAob3B0eXBlKSB7CisgICAgY2FzZSBPUF9ERVJFRjoKKyAgICAgICAgc3dpdGNoIChjdHgpIHsKKyAgICAgICAgY2FzZSBMb2FkOiBvcCA9IExPQURfREVSRUY7IGJyZWFrOworICAgICAgICBjYXNlIFN0b3JlOiBvcCA9IFNUT1JFX0RFUkVGOyBicmVhazsKKyAgICAgICAgY2FzZSBBdWdMb2FkOgorICAgICAgICBjYXNlIEF1Z1N0b3JlOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGVsOgorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4gbm90IGRlbGV0ZSB2YXJpYWJsZSAnJXMnIHJlZmVyZW5jZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBuZXN0ZWQgc2NvcGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CisgICAgICAgICAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBQYXJhbToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0gaW52YWxpZCBmb3IgZGVyZWYgdmFyaWFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BfRkFTVDoKKyAgICAgICAgc3dpdGNoIChjdHgpIHsKKyAgICAgICAgY2FzZSBMb2FkOiBvcCA9IExPQURfRkFTVDsgYnJlYWs7CisgICAgICAgIGNhc2UgU3RvcmU6IG9wID0gU1RPUkVfRkFTVDsgYnJlYWs7CisgICAgICAgIGNhc2UgRGVsOiBvcCA9IERFTEVURV9GQVNUOyBicmVhazsKKyAgICAgICAgY2FzZSBBdWdMb2FkOgorICAgICAgICBjYXNlIEF1Z1N0b3JlOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGFyYW06CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIGludmFsaWQgZm9yIGxvY2FsIHZhcmlhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBBRERPUF9PKGMsIG9wLCBtYW5nbGVkLCB2YXJuYW1lcyk7CisgICAgICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBPUF9HTE9CQUw6CisgICAgICAgIHN3aXRjaCAoY3R4KSB7CisgICAgICAgIGNhc2UgTG9hZDogb3AgPSBMT0FEX0dMT0JBTDsgYnJlYWs7CisgICAgICAgIGNhc2UgU3RvcmU6IG9wID0gU1RPUkVfR0xPQkFMOyBicmVhazsKKyAgICAgICAgY2FzZSBEZWw6IG9wID0gREVMRVRFX0dMT0JBTDsgYnJlYWs7CisgICAgICAgIGNhc2UgQXVnTG9hZDoKKyAgICAgICAgY2FzZSBBdWdTdG9yZToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBhcmFtOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbSBpbnZhbGlkIGZvciBnbG9iYWwgdmFyaWFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BfTkFNRToKKyAgICAgICAgc3dpdGNoIChjdHgpIHsKKyAgICAgICAgY2FzZSBMb2FkOiBvcCA9IExPQURfTkFNRTsgYnJlYWs7CisgICAgICAgIGNhc2UgU3RvcmU6IG9wID0gU1RPUkVfTkFNRTsgYnJlYWs7CisgICAgICAgIGNhc2UgRGVsOiBvcCA9IERFTEVURV9OQU1FOyBicmVhazsKKyAgICAgICAgY2FzZSBBdWdMb2FkOgorICAgICAgICBjYXNlIEF1Z1N0b3JlOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGFyYW06CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIGludmFsaWQgZm9yIG5hbWUgdmFyaWFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCWFzc2VydChvcCk7Ci0JYXJnID0gY29tcGlsZXJfYWRkX28oYywgZGljdCwgbWFuZ2xlZCk7Ci0JUHlfREVDUkVGKG1hbmdsZWQpOwotCWlmIChhcmcgPCAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gY29tcGlsZXJfYWRkb3BfaShjLCBvcCwgYXJnKTsKKyAgICBhc3NlcnQob3ApOworICAgIGFyZyA9IGNvbXBpbGVyX2FkZF9vKGMsIGRpY3QsIG1hbmdsZWQpOworICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKKyAgICBpZiAoYXJnIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNvbXBpbGVyX2FkZG9wX2koYywgb3AsIGFyZyk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2Jvb2xvcChzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKIHsKLQliYXNpY2Jsb2NrICplbmQ7Ci0JaW50IGp1bXBpLCBpLCBuOwotCWFzZGxfc2VxICpzOworICAgIGJhc2ljYmxvY2sgKmVuZDsKKyAgICBpbnQganVtcGksIGksIG47CisgICAgYXNkbF9zZXEgKnM7CiAKLQlhc3NlcnQoZS0+a2luZCA9PSBCb29sT3Bfa2luZCk7Ci0JaWYgKGUtPnYuQm9vbE9wLm9wID09IEFuZCkKLQkJanVtcGkgPSBKVU1QX0lGX0ZBTFNFX09SX1BPUDsKLQllbHNlCi0JCWp1bXBpID0gSlVNUF9JRl9UUlVFX09SX1BPUDsKLQllbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWYgKGVuZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlzID0gZS0+di5Cb29sT3AudmFsdWVzOwotCW4gPSBhc2RsX3NlcV9MRU4ocykgLSAxOwotCWFzc2VydChuID49IDApOwotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMsIGkpKTsKLQkJQURET1BfSkFCUyhjLCBqdW1waSwgZW5kKTsKLQl9Ci0JVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMsIG4pKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwotCXJldHVybiAxOworICAgIGFzc2VydChlLT5raW5kID09IEJvb2xPcF9raW5kKTsKKyAgICBpZiAoZS0+di5Cb29sT3Aub3AgPT0gQW5kKQorICAgICAgICBqdW1waSA9IEpVTVBfSUZfRkFMU0VfT1JfUE9QOworICAgIGVsc2UKKyAgICAgICAganVtcGkgPSBKVU1QX0lGX1RSVUVfT1JfUE9QOworICAgIGVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZiAoZW5kID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHMgPSBlLT52LkJvb2xPcC52YWx1ZXM7CisgICAgbiA9IGFzZGxfc2VxX0xFTihzKSAtIDE7CisgICAgYXNzZXJ0KG4gPj0gMCk7CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQocywgaSkpOworICAgICAgICBBRERPUF9KQUJTKGMsIGp1bXBpLCBlbmQpOworICAgIH0KKyAgICBWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQocywgbikpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2xpc3Qoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0JaW50IG4gPSBhc2RsX3NlcV9MRU4oZS0+di5MaXN0LmVsdHMpOwotCWlmIChlLT52Lkxpc3QuY3R4ID09IFN0b3JlKSB7Ci0JCUFERE9QX0koYywgVU5QQUNLX1NFUVVFTkNFLCBuKTsKLQl9Ci0JVklTSVRfU0VRKGMsIGV4cHIsIGUtPnYuTGlzdC5lbHRzKTsKLQlpZiAoZS0+di5MaXN0LmN0eCA9PSBMb2FkKSB7Ci0JCUFERE9QX0koYywgQlVJTERfTElTVCwgbik7Ci0JfQotCXJldHVybiAxOworICAgIGludCBuID0gYXNkbF9zZXFfTEVOKGUtPnYuTGlzdC5lbHRzKTsKKyAgICBpZiAoZS0+di5MaXN0LmN0eCA9PSBTdG9yZSkgeworICAgICAgICBBRERPUF9JKGMsIFVOUEFDS19TRVFVRU5DRSwgbik7CisgICAgfQorICAgIFZJU0lUX1NFUShjLCBleHByLCBlLT52Lkxpc3QuZWx0cyk7CisgICAgaWYgKGUtPnYuTGlzdC5jdHggPT0gTG9hZCkgeworICAgICAgICBBRERPUF9JKGMsIEJVSUxEX0xJU1QsIG4pOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfdHVwbGUoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0JaW50IG4gPSBhc2RsX3NlcV9MRU4oZS0+di5UdXBsZS5lbHRzKTsKLQlpZiAoZS0+di5UdXBsZS5jdHggPT0gU3RvcmUpIHsKLQkJQURET1BfSShjLCBVTlBBQ0tfU0VRVUVOQ0UsIG4pOwotCX0KLQlWSVNJVF9TRVEoYywgZXhwciwgZS0+di5UdXBsZS5lbHRzKTsKLQlpZiAoZS0+di5UdXBsZS5jdHggPT0gTG9hZCkgewotCQlBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBuKTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaW50IG4gPSBhc2RsX3NlcV9MRU4oZS0+di5UdXBsZS5lbHRzKTsKKyAgICBpZiAoZS0+di5UdXBsZS5jdHggPT0gU3RvcmUpIHsKKyAgICAgICAgQURET1BfSShjLCBVTlBBQ0tfU0VRVUVOQ0UsIG4pOworICAgIH0KKyAgICBWSVNJVF9TRVEoYywgZXhwciwgZS0+di5UdXBsZS5lbHRzKTsKKyAgICBpZiAoZS0+di5UdXBsZS5jdHggPT0gTG9hZCkgeworICAgICAgICBBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBuKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2NvbXBhcmUoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0JaW50IGksIG47Ci0JYmFzaWNibG9jayAqY2xlYW51cCA9IE5VTEw7CisgICAgaW50IGksIG47CisgICAgYmFzaWNibG9jayAqY2xlYW51cCA9IE5VTEw7CiAKLQkvKiBYWFggdGhlIGxvZ2ljIGNhbiBiZSBjbGVhbmVkIHVwIGZvciAxIG9yIG11bHRpcGxlIGNvbXBhcmlzb25zICovCi0JVklTSVQoYywgZXhwciwgZS0+di5Db21wYXJlLmxlZnQpOwotCW4gPSBhc2RsX3NlcV9MRU4oZS0+di5Db21wYXJlLm9wcyk7Ci0JYXNzZXJ0KG4gPiAwKTsKLQlpZiAobiA+IDEpIHsKLQkJY2xlYW51cCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQkJaWYgKGNsZWFudXAgPT0gTlVMTCkKLQkJICAgIHJldHVybiAwOwotCQlWSVNJVChjLCBleHByLCAKLQkJCShleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIDApKTsKLQl9Ci0JZm9yIChpID0gMTsgaSA8IG47IGkrKykgewotCQlBRERPUChjLCBEVVBfVE9QKTsKLQkJQURET1AoYywgUk9UX1RIUkVFKTsKLQkJQURET1BfSShjLCBDT01QQVJFX09QLAotCQkJY21wb3AoKGNtcG9wX3R5KShhc2RsX3NlcV9HRVQoCi0JCQkJCQkgIGUtPnYuQ29tcGFyZS5vcHMsIGkgLSAxKSkpKTsKLQkJQURET1BfSkFCUyhjLCBKVU1QX0lGX0ZBTFNFX09SX1BPUCwgY2xlYW51cCk7Ci0JCU5FWFRfQkxPQ0soYyk7Ci0JCWlmIChpIDwgKG4gLSAxKSkKLQkJICAgIFZJU0lUKGMsIGV4cHIsIAotCQkJICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIGkpKTsKLQl9Ci0JVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5jb21wYXJhdG9ycywgbiAtIDEpKTsKLQlBRERPUF9JKGMsIENPTVBBUkVfT1AsCi0JICAgICAgIGNtcG9wKChjbXBvcF90eSkoYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5vcHMsIG4gLSAxKSkpKTsKLQlpZiAobiA+IDEpIHsKLQkJYmFzaWNibG9jayAqZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCQlpZiAoZW5kID09IE5VTEwpCi0JCSAgICByZXR1cm4gMDsKLQkJQURET1BfSlJFTChjLCBKVU1QX0ZPUldBUkQsIGVuZCk7Ci0JCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGNsZWFudXApOwotCQlBRERPUChjLCBST1RfVFdPKTsKLQkJQURET1AoYywgUE9QX1RPUCk7Ci0JCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7Ci0JfQotCXJldHVybiAxOworICAgIC8qIFhYWCB0aGUgbG9naWMgY2FuIGJlIGNsZWFuZWQgdXAgZm9yIDEgb3IgbXVsdGlwbGUgY29tcGFyaXNvbnMgKi8KKyAgICBWSVNJVChjLCBleHByLCBlLT52LkNvbXBhcmUubGVmdCk7CisgICAgbiA9IGFzZGxfc2VxX0xFTihlLT52LkNvbXBhcmUub3BzKTsKKyAgICBhc3NlcnQobiA+IDApOworICAgIGlmIChuID4gMSkgeworICAgICAgICBjbGVhbnVwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgICAgICBpZiAoY2xlYW51cCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsCisgICAgICAgICAgICAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5Db21wYXJlLmNvbXBhcmF0b3JzLCAwKSk7CisgICAgfQorICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgQURET1AoYywgRFVQX1RPUCk7CisgICAgICAgIEFERE9QKGMsIFJPVF9USFJFRSk7CisgICAgICAgIEFERE9QX0koYywgQ09NUEFSRV9PUCwKKyAgICAgICAgICAgIGNtcG9wKChjbXBvcF90eSkoYXNkbF9zZXFfR0VUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LkNvbXBhcmUub3BzLCBpIC0gMSkpKSk7CisgICAgICAgIEFERE9QX0pBQlMoYywgSlVNUF9JRl9GQUxTRV9PUl9QT1AsIGNsZWFudXApOworICAgICAgICBORVhUX0JMT0NLKGMpOworICAgICAgICBpZiAoaSA8IChuIC0gMSkpCisgICAgICAgICAgICBWSVNJVChjLCBleHByLAorICAgICAgICAgICAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIGkpKTsKKyAgICB9CisgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5jb21wYXJhdG9ycywgbiAtIDEpKTsKKyAgICBBRERPUF9JKGMsIENPTVBBUkVfT1AsCisgICAgICAgICAgIGNtcG9wKChjbXBvcF90eSkoYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5vcHMsIG4gLSAxKSkpKTsKKyAgICBpZiAobiA+IDEpIHsKKyAgICAgICAgYmFzaWNibG9jayAqZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgICAgICBpZiAoZW5kID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQURET1BfSlJFTChjLCBKVU1QX0ZPUldBUkQsIGVuZCk7CisgICAgICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGNsZWFudXApOworICAgICAgICBBRERPUChjLCBST1RfVFdPKTsKKyAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9jYWxsKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCWludCBuLCBjb2RlID0gMDsKKyAgICBpbnQgbiwgY29kZSA9IDA7CiAKLQlWSVNJVChjLCBleHByLCBlLT52LkNhbGwuZnVuYyk7Ci0JbiA9IGFzZGxfc2VxX0xFTihlLT52LkNhbGwuYXJncyk7Ci0JVklTSVRfU0VRKGMsIGV4cHIsIGUtPnYuQ2FsbC5hcmdzKTsKLQlpZiAoZS0+di5DYWxsLmtleXdvcmRzKSB7Ci0JCVZJU0lUX1NFUShjLCBrZXl3b3JkLCBlLT52LkNhbGwua2V5d29yZHMpOwotCQluIHw9IGFzZGxfc2VxX0xFTihlLT52LkNhbGwua2V5d29yZHMpIDw8IDg7Ci0JfQotCWlmIChlLT52LkNhbGwuc3RhcmFyZ3MpIHsKLQkJVklTSVQoYywgZXhwciwgZS0+di5DYWxsLnN0YXJhcmdzKTsKLQkJY29kZSB8PSAxOwotCX0KLQlpZiAoZS0+di5DYWxsLmt3YXJncykgewotCQlWSVNJVChjLCBleHByLCBlLT52LkNhbGwua3dhcmdzKTsKLQkJY29kZSB8PSAyOwotCX0KLQlzd2l0Y2ggKGNvZGUpIHsKLQljYXNlIDA6Ci0JCUFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgbik7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OX1ZBUiwgbik7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OX0tXLCBuKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlBRERPUF9JKGMsIENBTExfRlVOQ1RJT05fVkFSX0tXLCBuKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAxOworICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuQ2FsbC5mdW5jKTsKKyAgICBuID0gYXNkbF9zZXFfTEVOKGUtPnYuQ2FsbC5hcmdzKTsKKyAgICBWSVNJVF9TRVEoYywgZXhwciwgZS0+di5DYWxsLmFyZ3MpOworICAgIGlmIChlLT52LkNhbGwua2V5d29yZHMpIHsKKyAgICAgICAgVklTSVRfU0VRKGMsIGtleXdvcmQsIGUtPnYuQ2FsbC5rZXl3b3Jkcyk7CisgICAgICAgIG4gfD0gYXNkbF9zZXFfTEVOKGUtPnYuQ2FsbC5rZXl3b3JkcykgPDwgODsKKyAgICB9CisgICAgaWYgKGUtPnYuQ2FsbC5zdGFyYXJncykgeworICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LkNhbGwuc3RhcmFyZ3MpOworICAgICAgICBjb2RlIHw9IDE7CisgICAgfQorICAgIGlmIChlLT52LkNhbGwua3dhcmdzKSB7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuQ2FsbC5rd2FyZ3MpOworICAgICAgICBjb2RlIHw9IDI7CisgICAgfQorICAgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT05fVkFSLCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT05fS1csIG4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIEFERE9QX0koYywgQ0FMTF9GVU5DVElPTl9WQVJfS1csIG4pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2xpc3Rjb21wX2dlbmVyYXRvcihzdHJ1Y3QgY29tcGlsZXIgKmMsIGFzZGxfc2VxICpnZW5lcmF0b3JzLAotCQkJICAgIGludCBnZW5faW5kZXgsIGV4cHJfdHkgZWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnZW5faW5kZXgsIGV4cHJfdHkgZWx0KQogewotCS8qIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBpdGVyYXRvciwgdGhlbiBlYWNoIG9mIHRoZSBpZnMsCi0JICAgYW5kIHRoZW4gd3JpdGUgdG8gdGhlIGVsZW1lbnQgKi8KKyAgICAvKiBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgaXRlcmF0b3IsIHRoZW4gZWFjaCBvZiB0aGUgaWZzLAorICAgICAgIGFuZCB0aGVuIHdyaXRlIHRvIHRoZSBlbGVtZW50ICovCiAKLQljb21wcmVoZW5zaW9uX3R5IGw7Ci0JYmFzaWNibG9jayAqc3RhcnQsICphbmNob3IsICpza2lwLCAqaWZfY2xlYW51cDsKLQlpbnQgaSwgbjsKKyAgICBjb21wcmVoZW5zaW9uX3R5IGw7CisgICAgYmFzaWNibG9jayAqc3RhcnQsICphbmNob3IsICpza2lwLCAqaWZfY2xlYW51cDsKKyAgICBpbnQgaSwgbjsKIAotCXN0YXJ0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCXNraXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWZfY2xlYW51cCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlhbmNob3IgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgc3RhcnQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgc2tpcCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZl9jbGVhbnVwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGFuY2hvciA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKIAotCWlmIChzdGFydCA9PSBOVUxMIHx8IHNraXAgPT0gTlVMTCB8fCBpZl9jbGVhbnVwID09IE5VTEwgfHwKLQkJYW5jaG9yID09IE5VTEwpCi0JICAgIHJldHVybiAwOworICAgIGlmIChzdGFydCA9PSBOVUxMIHx8IHNraXAgPT0gTlVMTCB8fCBpZl9jbGVhbnVwID09IE5VTEwgfHwKKyAgICAgICAgYW5jaG9yID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCi0JbCA9IChjb21wcmVoZW5zaW9uX3R5KWFzZGxfc2VxX0dFVChnZW5lcmF0b3JzLCBnZW5faW5kZXgpOwotCVZJU0lUKGMsIGV4cHIsIGwtPml0ZXIpOwotCUFERE9QKGMsIEdFVF9JVEVSKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBzdGFydCk7Ci0JQURET1BfSlJFTChjLCBGT1JfSVRFUiwgYW5jaG9yKTsKLQlORVhUX0JMT0NLKGMpOwotCVZJU0lUKGMsIGV4cHIsIGwtPnRhcmdldCk7CisgICAgbCA9IChjb21wcmVoZW5zaW9uX3R5KWFzZGxfc2VxX0dFVChnZW5lcmF0b3JzLCBnZW5faW5kZXgpOworICAgIFZJU0lUKGMsIGV4cHIsIGwtPml0ZXIpOworICAgIEFERE9QKGMsIEdFVF9JVEVSKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBzdGFydCk7CisgICAgQURET1BfSlJFTChjLCBGT1JfSVRFUiwgYW5jaG9yKTsKKyAgICBORVhUX0JMT0NLKGMpOworICAgIFZJU0lUKGMsIGV4cHIsIGwtPnRhcmdldCk7CiAKLQkvKiBYWFggdGhpcyBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLi4uYSBsb3QhICovCi0JbiA9IGFzZGxfc2VxX0xFTihsLT5pZnMpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZXhwcl90eSBlID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGwtPmlmcywgaSk7Ci0JCVZJU0lUKGMsIGV4cHIsIGUpOwotCQlBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX0ZBTFNFLCBpZl9jbGVhbnVwKTsKLQkJTkVYVF9CTE9DSyhjKTsKLQl9IAorICAgIC8qIFhYWCB0aGlzIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAuLi5hIGxvdCEgKi8KKyAgICBuID0gYXNkbF9zZXFfTEVOKGwtPmlmcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBleHByX3R5IGUgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQobC0+aWZzLCBpKTsKKyAgICAgICAgVklTSVQoYywgZXhwciwgZSk7CisgICAgICAgIEFERE9QX0pBQlMoYywgUE9QX0pVTVBfSUZfRkFMU0UsIGlmX2NsZWFudXApOworICAgICAgICBORVhUX0JMT0NLKGMpOworICAgIH0KIAotCWlmICgrK2dlbl9pbmRleCA8IGFzZGxfc2VxX0xFTihnZW5lcmF0b3JzKSkKLQkgICAgaWYgKCFjb21waWxlcl9saXN0Y29tcF9nZW5lcmF0b3IoYywgZ2VuZXJhdG9ycywgZ2VuX2luZGV4LCBlbHQpKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoKytnZW5faW5kZXggPCBhc2RsX3NlcV9MRU4oZ2VuZXJhdG9ycykpCisgICAgICAgIGlmICghY29tcGlsZXJfbGlzdGNvbXBfZ2VuZXJhdG9yKGMsIGdlbmVyYXRvcnMsIGdlbl9pbmRleCwgZWx0KSkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBvbmx5IGFwcGVuZCBhZnRlciB0aGUgbGFzdCBmb3IgZ2VuZXJhdG9yICovCi0JaWYgKGdlbl9pbmRleCA+PSBhc2RsX3NlcV9MRU4oZ2VuZXJhdG9ycykpIHsKLQkgICAgVklTSVQoYywgZXhwciwgZWx0KTsKLQkgICAgQURET1BfSShjLCBMSVNUX0FQUEVORCwgZ2VuX2luZGV4KzEpOworICAgIC8qIG9ubHkgYXBwZW5kIGFmdGVyIHRoZSBsYXN0IGZvciBnZW5lcmF0b3IgKi8KKyAgICBpZiAoZ2VuX2luZGV4ID49IGFzZGxfc2VxX0xFTihnZW5lcmF0b3JzKSkgeworICAgICAgICBWSVNJVChjLCBleHByLCBlbHQpOworICAgICAgICBBRERPUF9JKGMsIExJU1RfQVBQRU5ELCBnZW5faW5kZXgrMSk7CiAKLQkgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc2tpcCk7Ci0JfQotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGlmX2NsZWFudXApOwotCUFERE9QX0pBQlMoYywgSlVNUF9BQlNPTFVURSwgc3RhcnQpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGFuY2hvcik7Ci0JCi0JcmV0dXJuIDE7CisgICAgICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIHNraXApOworICAgIH0KKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBpZl9jbGVhbnVwKTsKKyAgICBBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIHN0YXJ0KTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBhbmNob3IpOworCisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2xpc3Rjb21wKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCWFzc2VydChlLT5raW5kID09IExpc3RDb21wX2tpbmQpOwotCUFERE9QX0koYywgQlVJTERfTElTVCwgMCk7Ci0JcmV0dXJuIGNvbXBpbGVyX2xpc3Rjb21wX2dlbmVyYXRvcihjLCBlLT52Lkxpc3RDb21wLmdlbmVyYXRvcnMsIDAsCi0JCQkJCSAgIGUtPnYuTGlzdENvbXAuZWx0KTsKKyAgICBhc3NlcnQoZS0+a2luZCA9PSBMaXN0Q29tcF9raW5kKTsKKyAgICBBRERPUF9JKGMsIEJVSUxEX0xJU1QsIDApOworICAgIHJldHVybiBjb21waWxlcl9saXN0Y29tcF9nZW5lcmF0b3IoYywgZS0+di5MaXN0Q29tcC5nZW5lcmF0b3JzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5MaXN0Q29tcC5lbHQpOwogfQogCiAvKiBEaWN0IGFuZCBzZXQgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvciBleHByZXNzaW9ucyB3b3JrIGJ5IGNyZWF0aW5nIGEKQEAgLTI2NzAsMjA0ICsyNjcwLDIwNCBAQAogKi8KIAogc3RhdGljIGludAotY29tcGlsZXJfY29tcHJlaGVuc2lvbl9nZW5lcmF0b3Ioc3RydWN0IGNvbXBpbGVyICpjLCAKLQkJCQkgYXNkbF9zZXEgKmdlbmVyYXRvcnMsIGludCBnZW5faW5kZXgsIAotCQkJCSBleHByX3R5IGVsdCwgZXhwcl90eSB2YWwsIGludCB0eXBlKQorY29tcGlsZXJfY29tcHJlaGVuc2lvbl9nZW5lcmF0b3Ioc3RydWN0IGNvbXBpbGVyICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmdlbmVyYXRvcnMsIGludCBnZW5faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGVsdCwgZXhwcl90eSB2YWwsIGludCB0eXBlKQogewotCS8qIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBpdGVyYXRvciwgdGhlbiBlYWNoIG9mIHRoZSBpZnMsCi0JICAgYW5kIHRoZW4gd3JpdGUgdG8gdGhlIGVsZW1lbnQgKi8KKyAgICAvKiBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgaXRlcmF0b3IsIHRoZW4gZWFjaCBvZiB0aGUgaWZzLAorICAgICAgIGFuZCB0aGVuIHdyaXRlIHRvIHRoZSBlbGVtZW50ICovCiAKLQljb21wcmVoZW5zaW9uX3R5IGdlbjsKLQliYXNpY2Jsb2NrICpzdGFydCwgKmFuY2hvciwgKnNraXAsICppZl9jbGVhbnVwOwotCWludCBpLCBuOworICAgIGNvbXByZWhlbnNpb25fdHkgZ2VuOworICAgIGJhc2ljYmxvY2sgKnN0YXJ0LCAqYW5jaG9yLCAqc2tpcCwgKmlmX2NsZWFudXA7CisgICAgaW50IGksIG47CiAKLQlzdGFydCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlza2lwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmX2NsZWFudXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JYW5jaG9yID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIHN0YXJ0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIHNraXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWZfY2xlYW51cCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBhbmNob3IgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CiAKLQlpZiAoc3RhcnQgPT0gTlVMTCB8fCBza2lwID09IE5VTEwgfHwgaWZfY2xlYW51cCA9PSBOVUxMIHx8Ci0JICAgIGFuY2hvciA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoc3RhcnQgPT0gTlVMTCB8fCBza2lwID09IE5VTEwgfHwgaWZfY2xlYW51cCA9PSBOVUxMIHx8CisgICAgICAgIGFuY2hvciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAotCWdlbiA9IChjb21wcmVoZW5zaW9uX3R5KWFzZGxfc2VxX0dFVChnZW5lcmF0b3JzLCBnZW5faW5kZXgpOwotCQotCWlmIChnZW5faW5kZXggPT0gMCkgewotCQkvKiBSZWNlaXZlIG91dGVybW9zdCBpdGVyIGFzIGFuIGltcGxpY2l0IGFyZ3VtZW50ICovCi0JCWMtPnUtPnVfYXJnY291bnQgPSAxOwotCQlBRERPUF9JKGMsIExPQURfRkFTVCwgMCk7Ci0JfQotCWVsc2UgewotCQkvKiBTdWItaXRlciAtIGNhbGN1bGF0ZSBvbiB0aGUgZmx5ICovCi0JCVZJU0lUKGMsIGV4cHIsIGdlbi0+aXRlcik7Ci0JCUFERE9QKGMsIEdFVF9JVEVSKTsKLQl9Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc3RhcnQpOwotCUFERE9QX0pSRUwoYywgRk9SX0lURVIsIGFuY2hvcik7Ci0JTkVYVF9CTE9DSyhjKTsKLQlWSVNJVChjLCBleHByLCBnZW4tPnRhcmdldCk7CisgICAgZ2VuID0gKGNvbXByZWhlbnNpb25fdHkpYXNkbF9zZXFfR0VUKGdlbmVyYXRvcnMsIGdlbl9pbmRleCk7CiAKLQkvKiBYWFggdGhpcyBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLi4uYSBsb3QhICovCi0JbiA9IGFzZGxfc2VxX0xFTihnZW4tPmlmcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlleHByX3R5IGUgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZ2VuLT5pZnMsIGkpOwotCQlWSVNJVChjLCBleHByLCBlKTsKLQkJQURET1BfSkFCUyhjLCBQT1BfSlVNUF9JRl9GQUxTRSwgaWZfY2xlYW51cCk7Ci0JCU5FWFRfQkxPQ0soYyk7Ci0JfQorICAgIGlmIChnZW5faW5kZXggPT0gMCkgeworICAgICAgICAvKiBSZWNlaXZlIG91dGVybW9zdCBpdGVyIGFzIGFuIGltcGxpY2l0IGFyZ3VtZW50ICovCisgICAgICAgIGMtPnUtPnVfYXJnY291bnQgPSAxOworICAgICAgICBBRERPUF9JKGMsIExPQURfRkFTVCwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBTdWItaXRlciAtIGNhbGN1bGF0ZSBvbiB0aGUgZmx5ICovCisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGdlbi0+aXRlcik7CisgICAgICAgIEFERE9QKGMsIEdFVF9JVEVSKTsKKyAgICB9CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc3RhcnQpOworICAgIEFERE9QX0pSRUwoYywgRk9SX0lURVIsIGFuY2hvcik7CisgICAgTkVYVF9CTE9DSyhjKTsKKyAgICBWSVNJVChjLCBleHByLCBnZW4tPnRhcmdldCk7CiAKLQlpZiAoKytnZW5faW5kZXggPCBhc2RsX3NlcV9MRU4oZ2VuZXJhdG9ycykpCi0JCWlmICghY29tcGlsZXJfY29tcHJlaGVuc2lvbl9nZW5lcmF0b3IoYywgCi0JCQkJCQkgICAgICBnZW5lcmF0b3JzLCBnZW5faW5kZXgsCi0JCQkJCQkgICAgICBlbHQsIHZhbCwgdHlwZSkpCi0JCXJldHVybiAwOworICAgIC8qIFhYWCB0aGlzIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAuLi5hIGxvdCEgKi8KKyAgICBuID0gYXNkbF9zZXFfTEVOKGdlbi0+aWZzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGV4cHJfdHkgZSA9IChleHByX3R5KWFzZGxfc2VxX0dFVChnZW4tPmlmcywgaSk7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUpOworICAgICAgICBBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX0ZBTFNFLCBpZl9jbGVhbnVwKTsKKyAgICAgICAgTkVYVF9CTE9DSyhjKTsKKyAgICB9CiAKLQkvKiBvbmx5IGFwcGVuZCBhZnRlciB0aGUgbGFzdCBmb3IgZ2VuZXJhdG9yICovCi0JaWYgKGdlbl9pbmRleCA+PSBhc2RsX3NlcV9MRU4oZ2VuZXJhdG9ycykpIHsKLQkJLyogY29tcHJlaGVuc2lvbiBzcGVjaWZpYyBjb2RlICovCi0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIENPTVBfR0VORVhQOgotCQkJVklTSVQoYywgZXhwciwgZWx0KTsKLQkJCUFERE9QKGMsIFlJRUxEX1ZBTFVFKTsKLQkJCUFERE9QKGMsIFBPUF9UT1ApOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09NUF9TRVRDT01QOgotCQkJVklTSVQoYywgZXhwciwgZWx0KTsKLQkJCUFERE9QX0koYywgU0VUX0FERCwgZ2VuX2luZGV4ICsgMSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDT01QX0RJQ1RDT01QOgotCQkJLyogV2l0aCAnZFtrXSA9IHYnLCB2IGlzIGV2YWx1YXRlZCBiZWZvcmUgaywgc28gd2UgZG8KLQkJCSAgIHRoZSBzYW1lLiAqLwotCQkJVklTSVQoYywgZXhwciwgdmFsKTsKLQkJCVZJU0lUKGMsIGV4cHIsIGVsdCk7Ci0JCQlBRERPUF9JKGMsIE1BUF9BREQsIGdlbl9pbmRleCArIDEpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMDsKLQkJfQorICAgIGlmICgrK2dlbl9pbmRleCA8IGFzZGxfc2VxX0xFTihnZW5lcmF0b3JzKSkKKyAgICAgICAgaWYgKCFjb21waWxlcl9jb21wcmVoZW5zaW9uX2dlbmVyYXRvcihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcnMsIGdlbl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHQsIHZhbCwgdHlwZSkpCisgICAgICAgIHJldHVybiAwOwogCi0JCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIHNraXApOwotCX0KLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBpZl9jbGVhbnVwKTsKLQlBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIHN0YXJ0KTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBhbmNob3IpOworICAgIC8qIG9ubHkgYXBwZW5kIGFmdGVyIHRoZSBsYXN0IGZvciBnZW5lcmF0b3IgKi8KKyAgICBpZiAoZ2VuX2luZGV4ID49IGFzZGxfc2VxX0xFTihnZW5lcmF0b3JzKSkgeworICAgICAgICAvKiBjb21wcmVoZW5zaW9uIHNwZWNpZmljIGNvZGUgKi8KKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgQ09NUF9HRU5FWFA6CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBlbHQpOworICAgICAgICAgICAgQURET1AoYywgWUlFTERfVkFMVUUpOworICAgICAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT01QX1NFVENPTVA6CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBlbHQpOworICAgICAgICAgICAgQURET1BfSShjLCBTRVRfQURELCBnZW5faW5kZXggKyAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENPTVBfRElDVENPTVA6CisgICAgICAgICAgICAvKiBXaXRoICdkW2tdID0gdicsIHYgaXMgZXZhbHVhdGVkIGJlZm9yZSBrLCBzbyB3ZSBkbworICAgICAgICAgICAgICAgdGhlIHNhbWUuICovCisgICAgICAgICAgICBWSVNJVChjLCBleHByLCB2YWwpOworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZWx0KTsKKyAgICAgICAgICAgIEFERE9QX0koYywgTUFQX0FERCwgZ2VuX2luZGV4ICsgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAKLQlyZXR1cm4gMTsKKyAgICAgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc2tpcCk7CisgICAgfQorICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGlmX2NsZWFudXApOworICAgIEFERE9QX0pBQlMoYywgSlVNUF9BQlNPTFVURSwgc3RhcnQpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGFuY2hvcik7CisKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfY29tcHJlaGVuc2lvbihzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSwgaW50IHR5cGUsIGlkZW50aWZpZXIgbmFtZSwKLQkJICAgICAgIGFzZGxfc2VxICpnZW5lcmF0b3JzLCBleHByX3R5IGVsdCwgZXhwcl90eSB2YWwpCisgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpnZW5lcmF0b3JzLCBleHByX3R5IGVsdCwgZXhwcl90eSB2YWwpCiB7Ci0JUHlDb2RlT2JqZWN0ICpjbyA9IE5VTEw7Ci0JZXhwcl90eSBvdXRlcm1vc3RfaXRlcjsKKyAgICBQeUNvZGVPYmplY3QgKmNvID0gTlVMTDsKKyAgICBleHByX3R5IG91dGVybW9zdF9pdGVyOwogCi0Jb3V0ZXJtb3N0X2l0ZXIgPSAoKGNvbXByZWhlbnNpb25fdHkpCi0JCQkgIGFzZGxfc2VxX0dFVChnZW5lcmF0b3JzLCAwKSktPml0ZXI7CisgICAgb3V0ZXJtb3N0X2l0ZXIgPSAoKGNvbXByZWhlbnNpb25fdHkpCisgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXFfR0VUKGdlbmVyYXRvcnMsIDApKS0+aXRlcjsKIAotCWlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbmFtZSwgKHZvaWQgKillLCBlLT5saW5lbm8pKQotCQlnb3RvIGVycm9yOwotCQotCWlmICh0eXBlICE9IENPTVBfR0VORVhQKSB7Ci0JCWludCBvcDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgQ09NUF9TRVRDT01QOgotCQkJb3AgPSBCVUlMRF9TRVQ7Ci0JCQlicmVhazsKLQkJY2FzZSBDT01QX0RJQ1RDT01QOgotCQkJb3AgPSBCVUlMRF9NQVA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkgICAgICJ1bmtub3duIGNvbXByZWhlbnNpb24gdHlwZSAlZCIsIHR5cGUpOwotCQkJZ290byBlcnJvcl9pbl9zY29wZTsKLQkJfQorICAgIGlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbmFtZSwgKHZvaWQgKillLCBlLT5saW5lbm8pKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JCUFERE9QX0koYywgb3AsIDApOwotCX0KLQkKLQlpZiAoIWNvbXBpbGVyX2NvbXByZWhlbnNpb25fZ2VuZXJhdG9yKGMsIGdlbmVyYXRvcnMsIDAsIGVsdCwKLQkJCQkJICAgICAgdmFsLCB0eXBlKSkKLQkJZ290byBlcnJvcl9pbl9zY29wZTsKLQkKLQlpZiAodHlwZSAhPSBDT01QX0dFTkVYUCkgewotCQlBRERPUChjLCBSRVRVUk5fVkFMVUUpOwotCX0KKyAgICBpZiAodHlwZSAhPSBDT01QX0dFTkVYUCkgeworICAgICAgICBpbnQgb3A7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIENPTVBfU0VUQ09NUDoKKyAgICAgICAgICAgIG9wID0gQlVJTERfU0VUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ09NUF9ESUNUQ09NUDoKKyAgICAgICAgICAgIG9wID0gQlVJTERfTUFQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gY29tcHJlaGVuc2lvbiB0eXBlICVkIiwgdHlwZSk7CisgICAgICAgICAgICBnb3RvIGVycm9yX2luX3Njb3BlOworICAgICAgICB9CiAKLQljbyA9IGFzc2VtYmxlKGMsIDEpOwotCWNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7Ci0JaWYgKGNvID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7CisgICAgICAgIEFERE9QX0koYywgb3AsIDApOworICAgIH0KIAotCWlmICghY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCAwKSkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoY28pOworICAgIGlmICghY29tcGlsZXJfY29tcHJlaGVuc2lvbl9nZW5lcmF0b3IoYywgZ2VuZXJhdG9ycywgMCwgZWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCB0eXBlKSkKKyAgICAgICAgZ290byBlcnJvcl9pbl9zY29wZTsKIAotCVZJU0lUKGMsIGV4cHIsIG91dGVybW9zdF9pdGVyKTsKLQlBRERPUChjLCBHRVRfSVRFUik7Ci0JQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCAxKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAodHlwZSAhPSBDT01QX0dFTkVYUCkgeworICAgICAgICBBRERPUChjLCBSRVRVUk5fVkFMVUUpOworICAgIH0KKworICAgIGNvID0gYXNzZW1ibGUoYywgMSk7CisgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKKyAgICBpZiAoY28gPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIGlmICghY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCAwKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoY28pOworCisgICAgVklTSVQoYywgZXhwciwgb3V0ZXJtb3N0X2l0ZXIpOworICAgIEFERE9QKGMsIEdFVF9JVEVSKTsKKyAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDEpOworICAgIHJldHVybiAxOwogZXJyb3JfaW5fc2NvcGU6Ci0JY29tcGlsZXJfZXhpdF9zY29wZShjKTsKKyAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOwogZXJyb3I6Ci0JUHlfWERFQ1JFRihjbyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfWERFQ1JFRihjbyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2dlbmV4cChzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKIHsKLQlzdGF0aWMgaWRlbnRpZmllciBuYW1lOwotCWlmICghbmFtZSkgewotCQluYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPGdlbmV4cHI+Iik7Ci0JCWlmICghbmFtZSkKLQkJCXJldHVybiAwOwotCX0KLQlhc3NlcnQoZS0+a2luZCA9PSBHZW5lcmF0b3JFeHBfa2luZCk7Ci0JcmV0dXJuIGNvbXBpbGVyX2NvbXByZWhlbnNpb24oYywgZSwgQ09NUF9HRU5FWFAsIG5hbWUsCi0JCQkJICAgICAgZS0+di5HZW5lcmF0b3JFeHAuZ2VuZXJhdG9ycywKLQkJCQkgICAgICBlLT52LkdlbmVyYXRvckV4cC5lbHQsIE5VTEwpOworICAgIHN0YXRpYyBpZGVudGlmaWVyIG5hbWU7CisgICAgaWYgKCFuYW1lKSB7CisgICAgICAgIG5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8Z2VuZXhwcj4iKTsKKyAgICAgICAgaWYgKCFuYW1lKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFzc2VydChlLT5raW5kID09IEdlbmVyYXRvckV4cF9raW5kKTsKKyAgICByZXR1cm4gY29tcGlsZXJfY29tcHJlaGVuc2lvbihjLCBlLCBDT01QX0dFTkVYUCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LkdlbmVyYXRvckV4cC5nZW5lcmF0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPnYuR2VuZXJhdG9yRXhwLmVsdCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3NldGNvbXAoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0Jc3RhdGljIGlkZW50aWZpZXIgbmFtZTsKLQlpZiAoIW5hbWUpIHsKLQkJbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxzZXRjb21wPiIpOwotCQlpZiAoIW5hbWUpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JYXNzZXJ0KGUtPmtpbmQgPT0gU2V0Q29tcF9raW5kKTsKLQlyZXR1cm4gY29tcGlsZXJfY29tcHJlaGVuc2lvbihjLCBlLCBDT01QX1NFVENPTVAsIG5hbWUsCi0JCQkJICAgICAgZS0+di5TZXRDb21wLmdlbmVyYXRvcnMsCi0JCQkJICAgICAgZS0+di5TZXRDb21wLmVsdCwgTlVMTCk7CisgICAgc3RhdGljIGlkZW50aWZpZXIgbmFtZTsKKyAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxzZXRjb21wPiIpOworICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXNzZXJ0KGUtPmtpbmQgPT0gU2V0Q29tcF9raW5kKTsKKyAgICByZXR1cm4gY29tcGlsZXJfY29tcHJlaGVuc2lvbihjLCBlLCBDT01QX1NFVENPTVAsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5TZXRDb21wLmdlbmVyYXRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5TZXRDb21wLmVsdCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2RpY3Rjb21wKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCXN0YXRpYyBpZGVudGlmaWVyIG5hbWU7Ci0JaWYgKCFuYW1lKSB7Ci0JCW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8ZGljdGNvbXA+Iik7Ci0JCWlmICghbmFtZSkKLQkJCXJldHVybiAwOwotCX0KLQlhc3NlcnQoZS0+a2luZCA9PSBEaWN0Q29tcF9raW5kKTsKLQlyZXR1cm4gY29tcGlsZXJfY29tcHJlaGVuc2lvbihjLCBlLCBDT01QX0RJQ1RDT01QLCBuYW1lLAotCQkJCSAgICAgIGUtPnYuRGljdENvbXAuZ2VuZXJhdG9ycywKLQkJCQkgICAgICBlLT52LkRpY3RDb21wLmtleSwgZS0+di5EaWN0Q29tcC52YWx1ZSk7CisgICAgc3RhdGljIGlkZW50aWZpZXIgbmFtZTsKKyAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxkaWN0Y29tcD4iKTsKKyAgICAgICAgaWYgKCFuYW1lKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFzc2VydChlLT5raW5kID09IERpY3RDb21wX2tpbmQpOworICAgIHJldHVybiBjb21waWxlcl9jb21wcmVoZW5zaW9uKGMsIGUsIENPTVBfRElDVENPTVAsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5EaWN0Q29tcC5nZW5lcmF0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPnYuRGljdENvbXAua2V5LCBlLT52LkRpY3RDb21wLnZhbHVlKTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfdmlzaXRfa2V5d29yZChzdHJ1Y3QgY29tcGlsZXIgKmMsIGtleXdvcmRfdHkgaykKIHsKLQlBRERPUF9PKGMsIExPQURfQ09OU1QsIGstPmFyZywgY29uc3RzKTsKLQlWSVNJVChjLCBleHByLCBrLT52YWx1ZSk7Ci0JcmV0dXJuIDE7CisgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBrLT5hcmcsIGNvbnN0cyk7CisgICAgVklTSVQoYywgZXhwciwgay0+dmFsdWUpOworICAgIHJldHVybiAxOwogfQogCi0vKiBUZXN0IHdoZXRoZXIgZXhwcmVzc2lvbiBpcyBjb25zdGFudC4JIEZvciBjb25zdGFudHMsIHJlcG9ydAorLyogVGVzdCB3aGV0aGVyIGV4cHJlc3Npb24gaXMgY29uc3RhbnQuICBGb3IgY29uc3RhbnRzLCByZXBvcnQKICAgIHdoZXRoZXIgdGhleSBhcmUgdHJ1ZSBvciBmYWxzZS4KIAogICAgUmV0dXJuIHZhbHVlczogMSBmb3IgdHJ1ZSwgMCBmb3IgZmFsc2UsIC0xIGZvciBub24tY29uc3RhbnQuCkBAIC0yODc2LDMzICsyODc2LDMzIEBACiBzdGF0aWMgaW50CiBleHByX2NvbnN0YW50KGV4cHJfdHkgZSkKIHsKLQlzd2l0Y2ggKGUtPmtpbmQpIHsKLQljYXNlIE51bV9raW5kOgotCQlyZXR1cm4gUHlPYmplY3RfSXNUcnVlKGUtPnYuTnVtLm4pOwotCWNhc2UgU3RyX2tpbmQ6Ci0JCXJldHVybiBQeU9iamVjdF9Jc1RydWUoZS0+di5TdHIucyk7Ci0JY2FzZSBOYW1lX2tpbmQ6Ci0JCS8qIF9fZGVidWdfXyBpcyBub3QgYXNzaWduYWJsZSwgc28gd2UgY2FuIG9wdGltaXplCi0JCSAqIGl0IGF3YXkgaW4gaWYgYW5kIHdoaWxlIHN0YXRlbWVudHMgKi8KLQkJaWYgKHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcoZS0+di5OYW1lLmlkKSwKLQkJCSAgICJfX2RlYnVnX18iKSA9PSAwKQotCQkJICAgcmV0dXJuICEgUHlfT3B0aW1pemVGbGFnOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQlkZWZhdWx0OgotCQlyZXR1cm4gLTE7Ci0JfQorICAgIHN3aXRjaCAoZS0+a2luZCkgeworICAgIGNhc2UgTnVtX2tpbmQ6CisgICAgICAgIHJldHVybiBQeU9iamVjdF9Jc1RydWUoZS0+di5OdW0ubik7CisgICAgY2FzZSBTdHJfa2luZDoKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0lzVHJ1ZShlLT52LlN0ci5zKTsKKyAgICBjYXNlIE5hbWVfa2luZDoKKyAgICAgICAgLyogX19kZWJ1Z19fIGlzIG5vdCBhc3NpZ25hYmxlLCBzbyB3ZSBjYW4gb3B0aW1pemUKKyAgICAgICAgICogaXQgYXdheSBpbiBpZiBhbmQgd2hpbGUgc3RhdGVtZW50cyAqLworICAgICAgICBpZiAoc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhlLT52Lk5hbWUuaWQpLAorICAgICAgICAgICAgICAgICAgICJfX2RlYnVnX18iKSA9PSAwKQorICAgICAgICAgICAgICAgICAgIHJldHVybiAhIFB5X09wdGltaXplRmxhZzsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogLyoKICAgIEltcGxlbWVudHMgdGhlIHdpdGggc3RhdGVtZW50IGZyb20gUEVQIDM0My4KIAotICAgVGhlIHNlbWFudGljcyBvdXRsaW5lZCBpbiB0aGF0IFBFUCBhcmUgYXMgZm9sbG93czogIAorICAgVGhlIHNlbWFudGljcyBvdXRsaW5lZCBpbiB0aGF0IFBFUCBhcmUgYXMgZm9sbG93czoKIAogICAgd2l0aCBFWFBSIGFzIFZBUjoKICAgICAgICBCTE9DSwotICAKKwogICAgSXQgaXMgaW1wbGVtZW50ZWQgcm91Z2hseSBhczoKLSAgCisKICAgIGNvbnRleHQgPSBFWFBSCiAgICBleGl0ID0gY29udGV4dC5fX2V4aXRfXyAgIyBub3QgY2FsbGluZyBpdAogICAgdmFsdWUgPSBjb250ZXh0Ll9fZW50ZXJfXygpCkBAIC0yOTExLDkgKzI5MTEsOSBAQAogICAgICAgIEJMT0NLCiAgICBmaW5hbGx5OgogICAgICAgIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkOgotCSAgIGV4YyA9IGNvcHkgb2YgKGV4Y2VwdGlvbiwgaW5zdGFuY2UsIHRyYWNlYmFjaykKKyAgICAgICBleGMgPSBjb3B5IG9mIChleGNlcHRpb24sIGluc3RhbmNlLCB0cmFjZWJhY2spCiAgICAgICAgZWxzZToKLQkgICBleGMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICBleGMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKICAgICAgICBleGl0KCpleGMpCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTI5MjYsNyArMjkyNiw3IEBACiAgICAgYmxvY2sgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CiAgICAgZmluYWxseSA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKICAgICBpZiAoIWJsb2NrIHx8ICFmaW5hbGx5KQotCXJldHVybiAwOworICAgIHJldHVybiAwOwogCiAgICAgLyogRXZhbHVhdGUgRVhQUiAqLwogICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuV2l0aC5jb250ZXh0X2V4cHIpOwpAQCAtMjkzOCwxNSArMjkzOCwxNSBAQAogICAgICAgIGZ1bmN0aW9ucyB0aGUgc2FtZSBhcyBTRVRVUF9GSU5BTExZIGV4Y2VwdCB0aGF0IGV4Y2VwdGlvbnMgYXJlCiAgICAgICAgbm9ybWFsaXplZC4gKi8KICAgICBpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIEZJTkFMTFlfVFJZLCBibG9jaykpIHsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBpZiAocy0+di5XaXRoLm9wdGlvbmFsX3ZhcnMpIHsKLSAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5XaXRoLm9wdGlvbmFsX3ZhcnMpOworICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuV2l0aC5vcHRpb25hbF92YXJzKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIC8qIERpc2NhcmQgcmVzdWx0IGZyb20gY29udGV4dC5fX2VudGVyX18oKSAqLwotICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICAvKiBEaXNjYXJkIHJlc3VsdCBmcm9tIGNvbnRleHQuX19lbnRlcl9fKCkgKi8KKyAgICBBRERPUChjLCBQT1BfVE9QKTsKICAgICB9CiAKICAgICAvKiBCTE9DSyBjb2RlICovCkBAIC0yOTU5LDcgKzI5NTksNyBAQAogICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKICAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBmaW5hbGx5KTsKICAgICBpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIEZJTkFMTFlfRU5ELCBmaW5hbGx5KSkKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIAogICAgIC8qIEZpbmFsbHkgYmxvY2sgc3RhcnRzOyBjb250ZXh0Ll9fZXhpdF9fIGlzIG9uIHRoZSBzdGFjayB1bmRlcgogICAgICAgIHRoZSBleGNlcHRpb24gb3IgcmV0dXJuIGluZm9ybWF0aW9uLiBKdXN0IGlzc3VlIG91ciBtYWdpYwpAQCAtMjk3NSwyMjYgKzI5NzUsMjI2IEBACiBzdGF0aWMgaW50CiBjb21waWxlcl92aXNpdF9leHByKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCWludCBpLCBuOworICAgIGludCBpLCBuOwogCi0JLyogSWYgZXhwciBlIGhhcyBhIGRpZmZlcmVudCBsaW5lIG51bWJlciB0aGFuIHRoZSBsYXN0IGV4cHIvc3RtdCwKLQkgICBzZXQgYSBuZXcgbGluZSBudW1iZXIgZm9yIHRoZSBuZXh0IGluc3RydWN0aW9uLgotCSovCi0JaWYgKGUtPmxpbmVubyA+IGMtPnUtPnVfbGluZW5vKSB7Ci0JCWMtPnUtPnVfbGluZW5vID0gZS0+bGluZW5vOwotCQljLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKLQl9Ci0Jc3dpdGNoIChlLT5raW5kKSB7Ci0JY2FzZSBCb29sT3Bfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2Jvb2xvcChjLCBlKTsKLQljYXNlIEJpbk9wX2tpbmQ6Ci0JCVZJU0lUKGMsIGV4cHIsIGUtPnYuQmluT3AubGVmdCk7Ci0JCVZJU0lUKGMsIGV4cHIsIGUtPnYuQmluT3AucmlnaHQpOwotCQlBRERPUChjLCBiaW5vcChjLCBlLT52LkJpbk9wLm9wKSk7Ci0JCWJyZWFrOwotCWNhc2UgVW5hcnlPcF9raW5kOgotCQlWSVNJVChjLCBleHByLCBlLT52LlVuYXJ5T3Aub3BlcmFuZCk7Ci0JCUFERE9QKGMsIHVuYXJ5b3AoZS0+di5VbmFyeU9wLm9wKSk7Ci0JCWJyZWFrOwotCWNhc2UgTGFtYmRhX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9sYW1iZGEoYywgZSk7Ci0JY2FzZSBJZkV4cF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfaWZleHAoYywgZSk7Ci0JY2FzZSBEaWN0X2tpbmQ6Ci0JCW4gPSBhc2RsX3NlcV9MRU4oZS0+di5EaWN0LnZhbHVlcyk7Ci0JCUFERE9QX0koYywgQlVJTERfTUFQLCAobj4weEZGRkYgPyAweEZGRkYgOiBuKSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCVZJU0lUKGMsIGV4cHIsIAotCQkJCShleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3QudmFsdWVzLCBpKSk7Ci0JCQlWSVNJVChjLCBleHByLCAKLQkJCQkoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5EaWN0LmtleXMsIGkpKTsKLQkJCUFERE9QKGMsIFNUT1JFX01BUCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTZXRfa2luZDoKLQkJbiA9IGFzZGxfc2VxX0xFTihlLT52LlNldC5lbHRzKTsKLQkJVklTSVRfU0VRKGMsIGV4cHIsIGUtPnYuU2V0LmVsdHMpOwotCQlBRERPUF9JKGMsIEJVSUxEX1NFVCwgbik7Ci0JCWJyZWFrOwotCWNhc2UgTGlzdENvbXBfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2xpc3Rjb21wKGMsIGUpOwotCWNhc2UgU2V0Q29tcF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfc2V0Y29tcChjLCBlKTsKLQljYXNlIERpY3RDb21wX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9kaWN0Y29tcChjLCBlKTsKLQljYXNlIEdlbmVyYXRvckV4cF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfZ2VuZXhwKGMsIGUpOwotCWNhc2UgWWllbGRfa2luZDoKLQkJaWYgKGMtPnUtPnVfc3RlLT5zdGVfdHlwZSAhPSBGdW5jdGlvbkJsb2NrKQotCQkJcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICIneWllbGQnIG91dHNpZGUgZnVuY3Rpb24iKTsKLQkJaWYgKGUtPnYuWWllbGQudmFsdWUpIHsKLQkJCVZJU0lUKGMsIGV4cHIsIGUtPnYuWWllbGQudmFsdWUpOwotCQl9Ci0JCWVsc2UgewotCQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOwotCQl9Ci0JCUFERE9QKGMsIFlJRUxEX1ZBTFVFKTsKLQkJYnJlYWs7Ci0JY2FzZSBDb21wYXJlX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9jb21wYXJlKGMsIGUpOwotCWNhc2UgQ2FsbF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfY2FsbChjLCBlKTsKLQljYXNlIFJlcHJfa2luZDoKLQkJVklTSVQoYywgZXhwciwgZS0+di5SZXByLnZhbHVlKTsKLQkJQURET1AoYywgVU5BUllfQ09OVkVSVCk7Ci0JCWJyZWFrOwotCWNhc2UgTnVtX2tpbmQ6Ci0JCUFERE9QX08oYywgTE9BRF9DT05TVCwgZS0+di5OdW0ubiwgY29uc3RzKTsKLQkJYnJlYWs7Ci0JY2FzZSBTdHJfa2luZDoKLQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52LlN0ci5zLCBjb25zdHMpOwotCQlicmVhazsKLQkvKiBUaGUgZm9sbG93aW5nIGV4cHJzIGNhbiBiZSBhc3NpZ25tZW50IHRhcmdldHMuICovCi0JY2FzZSBBdHRyaWJ1dGVfa2luZDoKLQkJaWYgKGUtPnYuQXR0cmlidXRlLmN0eCAhPSBBdWdTdG9yZSkKLQkJCVZJU0lUKGMsIGV4cHIsIGUtPnYuQXR0cmlidXRlLnZhbHVlKTsKLQkJc3dpdGNoIChlLT52LkF0dHJpYnV0ZS5jdHgpIHsKLQkJY2FzZSBBdWdMb2FkOgotCQkJQURET1AoYywgRFVQX1RPUCk7Ci0JCQkvKiBGYWxsIHRocm91Z2ggdG8gbG9hZCAqLwotCQljYXNlIExvYWQ6Ci0JCQlBRERPUF9OQU1FKGMsIExPQURfQVRUUiwgZS0+di5BdHRyaWJ1dGUuYXR0ciwgbmFtZXMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQXVnU3RvcmU6Ci0JCQlBRERPUChjLCBST1RfVFdPKTsKLQkJCS8qIEZhbGwgdGhyb3VnaCB0byBzYXZlICovCi0JCWNhc2UgU3RvcmU6Ci0JCQlBRERPUF9OQU1FKGMsIFNUT1JFX0FUVFIsIGUtPnYuQXR0cmlidXRlLmF0dHIsIG5hbWVzKTsKLQkJCWJyZWFrOwotCQljYXNlIERlbDoKLQkJCUFERE9QX05BTUUoYywgREVMRVRFX0FUVFIsIGUtPnYuQXR0cmlidXRlLmF0dHIsIG5hbWVzKTsKLQkJCWJyZWFrOwotCQljYXNlIFBhcmFtOgotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkicGFyYW0gaW52YWxpZCBpbiBhdHRyaWJ1dGUgZXhwcmVzc2lvbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTdWJzY3JpcHRfa2luZDoKLQkJc3dpdGNoIChlLT52LlN1YnNjcmlwdC5jdHgpIHsKLQkJY2FzZSBBdWdMb2FkOgotCQkJVklTSVQoYywgZXhwciwgZS0+di5TdWJzY3JpcHQudmFsdWUpOwotCQkJVklTSVRfU0xJQ0UoYywgZS0+di5TdWJzY3JpcHQuc2xpY2UsIEF1Z0xvYWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTG9hZDoKLQkJCVZJU0lUKGMsIGV4cHIsIGUtPnYuU3Vic2NyaXB0LnZhbHVlKTsKLQkJCVZJU0lUX1NMSUNFKGMsIGUtPnYuU3Vic2NyaXB0LnNsaWNlLCBMb2FkKTsKLQkJCWJyZWFrOwotCQljYXNlIEF1Z1N0b3JlOgotCQkJVklTSVRfU0xJQ0UoYywgZS0+di5TdWJzY3JpcHQuc2xpY2UsIEF1Z1N0b3JlKTsKLQkJCWJyZWFrOwotCQljYXNlIFN0b3JlOgotCQkJVklTSVQoYywgZXhwciwgZS0+di5TdWJzY3JpcHQudmFsdWUpOwotCQkJVklTSVRfU0xJQ0UoYywgZS0+di5TdWJzY3JpcHQuc2xpY2UsIFN0b3JlKTsKLQkJCWJyZWFrOwotCQljYXNlIERlbDoKLQkJCVZJU0lUKGMsIGV4cHIsIGUtPnYuU3Vic2NyaXB0LnZhbHVlKTsKLQkJCVZJU0lUX1NMSUNFKGMsIGUtPnYuU3Vic2NyaXB0LnNsaWNlLCBEZWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUGFyYW06Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJInBhcmFtIGludmFsaWQgaW4gc3Vic2NyaXB0IGV4cHJlc3Npb24iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgTmFtZV9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfbmFtZW9wKGMsIGUtPnYuTmFtZS5pZCwgZS0+di5OYW1lLmN0eCk7Ci0JLyogY2hpbGQgbm9kZXMgb2YgTGlzdCBhbmQgVHVwbGUgd2lsbCBoYXZlIGV4cHJfY29udGV4dCBzZXQgKi8KLQljYXNlIExpc3Rfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2xpc3QoYywgZSk7Ci0JY2FzZSBUdXBsZV9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfdHVwbGUoYywgZSk7Ci0JfQotCXJldHVybiAxOworICAgIC8qIElmIGV4cHIgZSBoYXMgYSBkaWZmZXJlbnQgbGluZSBudW1iZXIgdGhhbiB0aGUgbGFzdCBleHByL3N0bXQsCisgICAgICAgc2V0IGEgbmV3IGxpbmUgbnVtYmVyIGZvciB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KKyAgICAqLworICAgIGlmIChlLT5saW5lbm8gPiBjLT51LT51X2xpbmVubykgeworICAgICAgICBjLT51LT51X2xpbmVubyA9IGUtPmxpbmVubzsKKyAgICAgICAgYy0+dS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7CisgICAgfQorICAgIHN3aXRjaCAoZS0+a2luZCkgeworICAgIGNhc2UgQm9vbE9wX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9ib29sb3AoYywgZSk7CisgICAgY2FzZSBCaW5PcF9raW5kOgorICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LkJpbk9wLmxlZnQpOworICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LkJpbk9wLnJpZ2h0KTsKKyAgICAgICAgQURET1AoYywgYmlub3AoYywgZS0+di5CaW5PcC5vcCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFVuYXJ5T3Bfa2luZDoKKyAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5VbmFyeU9wLm9wZXJhbmQpOworICAgICAgICBBRERPUChjLCB1bmFyeW9wKGUtPnYuVW5hcnlPcC5vcCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExhbWJkYV9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfbGFtYmRhKGMsIGUpOworICAgIGNhc2UgSWZFeHBfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2lmZXhwKGMsIGUpOworICAgIGNhc2UgRGljdF9raW5kOgorICAgICAgICBuID0gYXNkbF9zZXFfTEVOKGUtPnYuRGljdC52YWx1ZXMpOworICAgICAgICBBRERPUF9JKGMsIEJVSUxEX01BUCwgKG4+MHhGRkZGID8gMHhGRkZGIDogbikpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLAorICAgICAgICAgICAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3QudmFsdWVzLCBpKSk7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLAorICAgICAgICAgICAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3Qua2V5cywgaSkpOworICAgICAgICAgICAgQURET1AoYywgU1RPUkVfTUFQKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldF9raW5kOgorICAgICAgICBuID0gYXNkbF9zZXFfTEVOKGUtPnYuU2V0LmVsdHMpOworICAgICAgICBWSVNJVF9TRVEoYywgZXhwciwgZS0+di5TZXQuZWx0cyk7CisgICAgICAgIEFERE9QX0koYywgQlVJTERfU0VULCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMaXN0Q29tcF9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfbGlzdGNvbXAoYywgZSk7CisgICAgY2FzZSBTZXRDb21wX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9zZXRjb21wKGMsIGUpOworICAgIGNhc2UgRGljdENvbXBfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2RpY3Rjb21wKGMsIGUpOworICAgIGNhc2UgR2VuZXJhdG9yRXhwX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9nZW5leHAoYywgZSk7CisgICAgY2FzZSBZaWVsZF9raW5kOgorICAgICAgICBpZiAoYy0+dS0+dV9zdGUtPnN0ZV90eXBlICE9IEZ1bmN0aW9uQmxvY2spCisgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgIid5aWVsZCcgb3V0c2lkZSBmdW5jdGlvbiIpOworICAgICAgICBpZiAoZS0+di5ZaWVsZC52YWx1ZSkgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5ZaWVsZC52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7CisgICAgICAgIH0KKyAgICAgICAgQURET1AoYywgWUlFTERfVkFMVUUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBhcmVfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2NvbXBhcmUoYywgZSk7CisgICAgY2FzZSBDYWxsX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9jYWxsKGMsIGUpOworICAgIGNhc2UgUmVwcl9raW5kOgorICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LlJlcHIudmFsdWUpOworICAgICAgICBBRERPUChjLCBVTkFSWV9DT05WRVJUKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOdW1fa2luZDoKKyAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52Lk51bS5uLCBjb25zdHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFN0cl9raW5kOgorICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuU3RyLnMsIGNvbnN0cyk7CisgICAgICAgIGJyZWFrOworICAgIC8qIFRoZSBmb2xsb3dpbmcgZXhwcnMgY2FuIGJlIGFzc2lnbm1lbnQgdGFyZ2V0cy4gKi8KKyAgICBjYXNlIEF0dHJpYnV0ZV9raW5kOgorICAgICAgICBpZiAoZS0+di5BdHRyaWJ1dGUuY3R4ICE9IEF1Z1N0b3JlKQorICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5BdHRyaWJ1dGUudmFsdWUpOworICAgICAgICBzd2l0Y2ggKGUtPnYuQXR0cmlidXRlLmN0eCkgeworICAgICAgICBjYXNlIEF1Z0xvYWQ6CisgICAgICAgICAgICBBRERPUChjLCBEVVBfVE9QKTsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBsb2FkICovCisgICAgICAgIGNhc2UgTG9hZDoKKyAgICAgICAgICAgIEFERE9QX05BTUUoYywgTE9BRF9BVFRSLCBlLT52LkF0dHJpYnV0ZS5hdHRyLCBuYW1lcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBdWdTdG9yZToKKyAgICAgICAgICAgIEFERE9QKGMsIFJPVF9UV08pOworICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvIHNhdmUgKi8KKyAgICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAgICAgIEFERE9QX05BTUUoYywgU1RPUkVfQVRUUiwgZS0+di5BdHRyaWJ1dGUuYXR0ciwgbmFtZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGVsOgorICAgICAgICAgICAgQURET1BfTkFNRShjLCBERUxFVEVfQVRUUiwgZS0+di5BdHRyaWJ1dGUuYXR0ciwgbmFtZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGFyYW06CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIGludmFsaWQgaW4gYXR0cmlidXRlIGV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU3Vic2NyaXB0X2tpbmQ6CisgICAgICAgIHN3aXRjaCAoZS0+di5TdWJzY3JpcHQuY3R4KSB7CisgICAgICAgIGNhc2UgQXVnTG9hZDoKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuU3Vic2NyaXB0LnZhbHVlKTsKKyAgICAgICAgICAgIFZJU0lUX1NMSUNFKGMsIGUtPnYuU3Vic2NyaXB0LnNsaWNlLCBBdWdMb2FkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExvYWQ6CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LlN1YnNjcmlwdC52YWx1ZSk7CisgICAgICAgICAgICBWSVNJVF9TTElDRShjLCBlLT52LlN1YnNjcmlwdC5zbGljZSwgTG9hZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBdWdTdG9yZToKKyAgICAgICAgICAgIFZJU0lUX1NMSUNFKGMsIGUtPnYuU3Vic2NyaXB0LnNsaWNlLCBBdWdTdG9yZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuU3Vic2NyaXB0LnZhbHVlKTsKKyAgICAgICAgICAgIFZJU0lUX1NMSUNFKGMsIGUtPnYuU3Vic2NyaXB0LnNsaWNlLCBTdG9yZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEZWw6CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LlN1YnNjcmlwdC52YWx1ZSk7CisgICAgICAgICAgICBWSVNJVF9TTElDRShjLCBlLT52LlN1YnNjcmlwdC5zbGljZSwgRGVsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBhcmFtOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICJwYXJhbSBpbnZhbGlkIGluIHN1YnNjcmlwdCBleHByZXNzaW9uIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE5hbWVfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX25hbWVvcChjLCBlLT52Lk5hbWUuaWQsIGUtPnYuTmFtZS5jdHgpOworICAgIC8qIGNoaWxkIG5vZGVzIG9mIExpc3QgYW5kIFR1cGxlIHdpbGwgaGF2ZSBleHByX2NvbnRleHQgc2V0ICovCisgICAgY2FzZSBMaXN0X2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9saXN0KGMsIGUpOworICAgIGNhc2UgVHVwbGVfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX3R1cGxlKGMsIGUpOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfYXVnYXNzaWduKHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCWV4cHJfdHkgZSA9IHMtPnYuQXVnQXNzaWduLnRhcmdldDsKLQlleHByX3R5IGF1Z2U7CisgICAgZXhwcl90eSBlID0gcy0+di5BdWdBc3NpZ24udGFyZ2V0OworICAgIGV4cHJfdHkgYXVnZTsKIAotCWFzc2VydChzLT5raW5kID09IEF1Z0Fzc2lnbl9raW5kKTsKKyAgICBhc3NlcnQocy0+a2luZCA9PSBBdWdBc3NpZ25fa2luZCk7CiAKLQlzd2l0Y2ggKGUtPmtpbmQpIHsKLQljYXNlIEF0dHJpYnV0ZV9raW5kOgotCQlhdWdlID0gQXR0cmlidXRlKGUtPnYuQXR0cmlidXRlLnZhbHVlLCBlLT52LkF0dHJpYnV0ZS5hdHRyLAotCQkJCSBBdWdMb2FkLCBlLT5saW5lbm8sIGUtPmNvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwotCQlpZiAoYXVnZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIDA7Ci0JCVZJU0lUKGMsIGV4cHIsIGF1Z2UpOwotCQlWSVNJVChjLCBleHByLCBzLT52LkF1Z0Fzc2lnbi52YWx1ZSk7Ci0JCUFERE9QKGMsIGlucGxhY2VfYmlub3AoYywgcy0+di5BdWdBc3NpZ24ub3ApKTsKLQkJYXVnZS0+di5BdHRyaWJ1dGUuY3R4ID0gQXVnU3RvcmU7Ci0JCVZJU0lUKGMsIGV4cHIsIGF1Z2UpOwotCQlicmVhazsKLQljYXNlIFN1YnNjcmlwdF9raW5kOgotCQlhdWdlID0gU3Vic2NyaXB0KGUtPnYuU3Vic2NyaXB0LnZhbHVlLCBlLT52LlN1YnNjcmlwdC5zbGljZSwKLQkJCQkgQXVnTG9hZCwgZS0+bGluZW5vLCBlLT5jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKLQkJaWYgKGF1Z2UgPT0gTlVMTCkKLQkJICAgIHJldHVybiAwOwotCQlWSVNJVChjLCBleHByLCBhdWdlKTsKLQkJVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOwotCQlBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7Ci0JCWF1Z2UtPnYuU3Vic2NyaXB0LmN0eCA9IEF1Z1N0b3JlOwotCQlWSVNJVChjLCBleHByLCBhdWdlKTsKLQkJYnJlYWs7Ci0JY2FzZSBOYW1lX2tpbmQ6Ci0JCWlmICghY29tcGlsZXJfbmFtZW9wKGMsIGUtPnYuTmFtZS5pZCwgTG9hZCkpCi0JCSAgICByZXR1cm4gMDsKLQkJVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOwotCQlBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7Ci0JCXJldHVybiBjb21waWxlcl9uYW1lb3AoYywgZS0+di5OYW1lLmlkLCBTdG9yZSk7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAKLQkJCSJpbnZhbGlkIG5vZGUgdHlwZSAoJWQpIGZvciBhdWdtZW50ZWQgYXNzaWdubWVudCIsCi0JCQllLT5raW5kKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIHN3aXRjaCAoZS0+a2luZCkgeworICAgIGNhc2UgQXR0cmlidXRlX2tpbmQ6CisgICAgICAgIGF1Z2UgPSBBdHRyaWJ1dGUoZS0+di5BdHRyaWJ1dGUudmFsdWUsIGUtPnYuQXR0cmlidXRlLmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXVnTG9hZCwgZS0+bGluZW5vLCBlLT5jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgaWYgKGF1Z2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVChjLCBleHByLCBhdWdlKTsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOworICAgICAgICBBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7CisgICAgICAgIGF1Z2UtPnYuQXR0cmlidXRlLmN0eCA9IEF1Z1N0b3JlOworICAgICAgICBWSVNJVChjLCBleHByLCBhdWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTdWJzY3JpcHRfa2luZDoKKyAgICAgICAgYXVnZSA9IFN1YnNjcmlwdChlLT52LlN1YnNjcmlwdC52YWx1ZSwgZS0+di5TdWJzY3JpcHQuc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXVnTG9hZCwgZS0+bGluZW5vLCBlLT5jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgaWYgKGF1Z2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVChjLCBleHByLCBhdWdlKTsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOworICAgICAgICBBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7CisgICAgICAgIGF1Z2UtPnYuU3Vic2NyaXB0LmN0eCA9IEF1Z1N0b3JlOworICAgICAgICBWSVNJVChjLCBleHByLCBhdWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOYW1lX2tpbmQ6CisgICAgICAgIGlmICghY29tcGlsZXJfbmFtZW9wKGMsIGUtPnYuTmFtZS5pZCwgTG9hZCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOworICAgICAgICBBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7CisgICAgICAgIHJldHVybiBjb21waWxlcl9uYW1lb3AoYywgZS0+di5OYW1lLmlkLCBTdG9yZSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgImludmFsaWQgbm9kZSB0eXBlICglZCkgZm9yIGF1Z21lbnRlZCBhc3NpZ25tZW50IiwKKyAgICAgICAgICAgIGUtPmtpbmQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3B1c2hfZmJsb2NrKHN0cnVjdCBjb21waWxlciAqYywgZW51bSBmYmxvY2t0eXBlIHQsIGJhc2ljYmxvY2sgKmIpCiB7Ci0Jc3RydWN0IGZibG9ja2luZm8gKmY7Ci0JaWYgKGMtPnUtPnVfbmZibG9ja3MgPj0gQ09fTUFYQkxPQ0tTKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkidG9vIG1hbnkgc3RhdGljYWxseSBuZXN0ZWQgYmxvY2tzIik7Ci0JCXJldHVybiAwOwotCX0KLQlmID0gJmMtPnUtPnVfZmJsb2NrW2MtPnUtPnVfbmZibG9ja3MrK107Ci0JZi0+ZmJfdHlwZSA9IHQ7Ci0JZi0+ZmJfYmxvY2sgPSBiOwotCXJldHVybiAxOworICAgIHN0cnVjdCBmYmxvY2tpbmZvICpmOworICAgIGlmIChjLT51LT51X25mYmxvY2tzID49IENPX01BWEJMT0NLUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidG9vIG1hbnkgc3RhdGljYWxseSBuZXN0ZWQgYmxvY2tzIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmID0gJmMtPnUtPnVfZmJsb2NrW2MtPnUtPnVfbmZibG9ja3MrK107CisgICAgZi0+ZmJfdHlwZSA9IHQ7CisgICAgZi0+ZmJfYmxvY2sgPSBiOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogY29tcGlsZXJfcG9wX2ZibG9jayhzdHJ1Y3QgY29tcGlsZXIgKmMsIGVudW0gZmJsb2NrdHlwZSB0LCBiYXNpY2Jsb2NrICpiKQogewotCXN0cnVjdCBjb21waWxlcl91bml0ICp1ID0gYy0+dTsKLQlhc3NlcnQodS0+dV9uZmJsb2NrcyA+IDApOwotCXUtPnVfbmZibG9ja3MtLTsKLQlhc3NlcnQodS0+dV9mYmxvY2tbdS0+dV9uZmJsb2Nrc10uZmJfdHlwZSA9PSB0KTsKLQlhc3NlcnQodS0+dV9mYmxvY2tbdS0+dV9uZmJsb2Nrc10uZmJfYmxvY2sgPT0gYik7CisgICAgc3RydWN0IGNvbXBpbGVyX3VuaXQgKnUgPSBjLT51OworICAgIGFzc2VydCh1LT51X25mYmxvY2tzID4gMCk7CisgICAgdS0+dV9uZmJsb2Nrcy0tOworICAgIGFzc2VydCh1LT51X2ZibG9ja1t1LT51X25mYmxvY2tzXS5mYl90eXBlID09IHQpOworICAgIGFzc2VydCh1LT51X2ZibG9ja1t1LT51X25mYmxvY2tzXS5mYl9ibG9jayA9PSBiKTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfaW5fbG9vcChzdHJ1Y3QgY29tcGlsZXIgKmMpIHsKLQlpbnQgaTsKLQlzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdSA9IGMtPnU7Ci0JZm9yIChpID0gMDsgaSA8IHUtPnVfbmZibG9ja3M7ICsraSkgewotCQlpZiAodS0+dV9mYmxvY2tbaV0uZmJfdHlwZSA9PSBMT09QKQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgIGludCBpOworICAgIHN0cnVjdCBjb21waWxlcl91bml0ICp1ID0gYy0+dTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdS0+dV9uZmJsb2NrczsgKytpKSB7CisgICAgICAgIGlmICh1LT51X2ZibG9ja1tpXS5mYl90eXBlID09IExPT1ApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAvKiBSYWlzZXMgYSBTeW50YXhFcnJvciBhbmQgcmV0dXJucyAwLgogICAgSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcsIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiBtYXkgYmUgcmFpc2VkLgpAQCAtMzIwMywyMDUgKzMyMDMsMjA1IEBACiBzdGF0aWMgaW50CiBjb21waWxlcl9lcnJvcihzdHJ1Y3QgY29tcGlsZXIgKmMsIGNvbnN0IGNoYXIgKmVycnN0cikKIHsKLQlQeU9iamVjdCAqbG9jOwotCVB5T2JqZWN0ICp1ID0gTlVMTCwgKnYgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsb2M7CisgICAgUHlPYmplY3QgKnUgPSBOVUxMLCAqdiA9IE5VTEw7CiAKLQlsb2MgPSBQeUVycl9Qcm9ncmFtVGV4dChjLT5jX2ZpbGVuYW1lLCBjLT51LT51X2xpbmVubyk7Ci0JaWYgKCFsb2MpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlsb2MgPSBQeV9Ob25lOwotCX0KLQl1ID0gUHlfQnVpbGRWYWx1ZSgiKHppT08pIiwgYy0+Y19maWxlbmFtZSwgYy0+dS0+dV9saW5lbm8sCi0JCQkgIFB5X05vbmUsIGxvYyk7Ci0JaWYgKCF1KQotCQlnb3RvIGV4aXQ7Ci0JdiA9IFB5X0J1aWxkVmFsdWUoIih6TykiLCBlcnJzdHIsIHUpOwotCWlmICghdikKLQkJZ290byBleGl0OwotCVB5RXJyX1NldE9iamVjdChQeUV4Y19TeW50YXhFcnJvciwgdik7CisgICAgbG9jID0gUHlFcnJfUHJvZ3JhbVRleHQoYy0+Y19maWxlbmFtZSwgYy0+dS0+dV9saW5lbm8pOworICAgIGlmICghbG9jKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgbG9jID0gUHlfTm9uZTsKKyAgICB9CisgICAgdSA9IFB5X0J1aWxkVmFsdWUoIih6aU9PKSIsIGMtPmNfZmlsZW5hbWUsIGMtPnUtPnVfbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsIGxvYyk7CisgICAgaWYgKCF1KQorICAgICAgICBnb3RvIGV4aXQ7CisgICAgdiA9IFB5X0J1aWxkVmFsdWUoIih6TykiLCBlcnJzdHIsIHUpOworICAgIGlmICghdikKKyAgICAgICAgZ290byBleGl0OworICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19TeW50YXhFcnJvciwgdik7CiAgZXhpdDoKLQlQeV9ERUNSRUYobG9jKTsKLQlQeV9YREVDUkVGKHUpOwotCVB5X1hERUNSRUYodik7Ci0JcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKGxvYyk7CisgICAgUHlfWERFQ1JFRih1KTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1jb21waWxlcl9oYW5kbGVfc3Vic2NyKHN0cnVjdCBjb21waWxlciAqYywgY29uc3QgY2hhciAqa2luZCwgCi0JCSAgICAgICBleHByX2NvbnRleHRfdHkgY3R4KSAKK2NvbXBpbGVyX2hhbmRsZV9zdWJzY3Ioc3RydWN0IGNvbXBpbGVyICpjLCBjb25zdCBjaGFyICpraW5kLAorICAgICAgICAgICAgICAgICAgICAgICBleHByX2NvbnRleHRfdHkgY3R4KQogewotCWludCBvcCA9IDA7CisgICAgaW50IG9wID0gMDsKIAotCS8qIFhYWCB0aGlzIGNvZGUgaXMgZHVwbGljYXRlZCAqLwotCXN3aXRjaCAoY3R4KSB7Ci0JCWNhc2UgQXVnTG9hZDogLyogZmFsbCB0aHJvdWdoIHRvIExvYWQgKi8KLQkJY2FzZSBMb2FkOiAgICBvcCA9IEJJTkFSWV9TVUJTQ1I7IGJyZWFrOwotCQljYXNlIEF1Z1N0b3JlOi8qIGZhbGwgdGhyb3VnaCB0byBTdG9yZSAqLwotCQljYXNlIFN0b3JlOiAgIG9wID0gU1RPUkVfU1VCU0NSOyBicmVhazsKLQkJY2FzZSBEZWw6ICAgICBvcCA9IERFTEVURV9TVUJTQ1I7IGJyZWFrOwotCQljYXNlIFBhcmFtOgotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAKLQkJCQkgICAgICJpbnZhbGlkICVzIGtpbmQgJWQgaW4gc3Vic2NyaXB0XG4iLCAKLQkJCQkgICAgIGtpbmQsIGN0eCk7Ci0JCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGN0eCA9PSBBdWdMb2FkKSB7Ci0JCUFERE9QX0koYywgRFVQX1RPUFgsIDIpOwotCX0KLQllbHNlIGlmIChjdHggPT0gQXVnU3RvcmUpIHsKLQkJQURET1AoYywgUk9UX1RIUkVFKTsKLQl9Ci0JQURET1AoYywgb3ApOwotCXJldHVybiAxOworICAgIC8qIFhYWCB0aGlzIGNvZGUgaXMgZHVwbGljYXRlZCAqLworICAgIHN3aXRjaCAoY3R4KSB7CisgICAgICAgIGNhc2UgQXVnTG9hZDogLyogZmFsbCB0aHJvdWdoIHRvIExvYWQgKi8KKyAgICAgICAgY2FzZSBMb2FkOiAgICBvcCA9IEJJTkFSWV9TVUJTQ1I7IGJyZWFrOworICAgICAgICBjYXNlIEF1Z1N0b3JlOi8qIGZhbGwgdGhyb3VnaCB0byBTdG9yZSAqLworICAgICAgICBjYXNlIFN0b3JlOiAgIG9wID0gU1RPUkVfU1VCU0NSOyBicmVhazsKKyAgICAgICAgY2FzZSBEZWw6ICAgICBvcCA9IERFTEVURV9TVUJTQ1I7IGJyZWFrOworICAgICAgICBjYXNlIFBhcmFtOgorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkICVzIGtpbmQgJWQgaW4gc3Vic2NyaXB0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQsIGN0eCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGN0eCA9PSBBdWdMb2FkKSB7CisgICAgICAgIEFERE9QX0koYywgRFVQX1RPUFgsIDIpOworICAgIH0KKyAgICBlbHNlIGlmIChjdHggPT0gQXVnU3RvcmUpIHsKKyAgICAgICAgQURET1AoYywgUk9UX1RIUkVFKTsKKyAgICB9CisgICAgQURET1AoYywgb3ApOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9zbGljZShzdHJ1Y3QgY29tcGlsZXIgKmMsIHNsaWNlX3R5IHMsIGV4cHJfY29udGV4dF90eSBjdHgpCiB7Ci0JaW50IG4gPSAyOwotCWFzc2VydChzLT5raW5kID09IFNsaWNlX2tpbmQpOworICAgIGludCBuID0gMjsKKyAgICBhc3NlcnQocy0+a2luZCA9PSBTbGljZV9raW5kKTsKIAotCS8qIG9ubHkgaGFuZGxlcyB0aGUgY2FzZXMgd2hlcmUgQlVJTERfU0xJQ0UgaXMgZW1pdHRlZCAqLwotCWlmIChzLT52LlNsaWNlLmxvd2VyKSB7Ci0JCVZJU0lUKGMsIGV4cHIsIHMtPnYuU2xpY2UubG93ZXIpOwotCX0KLQllbHNlIHsKLQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOwotCX0KLQkJCi0JaWYgKHMtPnYuU2xpY2UudXBwZXIpIHsKLQkJVklTSVQoYywgZXhwciwgcy0+di5TbGljZS51cHBlcik7Ci0JfQotCWVsc2UgewotCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7Ci0JfQorICAgIC8qIG9ubHkgaGFuZGxlcyB0aGUgY2FzZXMgd2hlcmUgQlVJTERfU0xJQ0UgaXMgZW1pdHRlZCAqLworICAgIGlmIChzLT52LlNsaWNlLmxvd2VyKSB7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuU2xpY2UubG93ZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOworICAgIH0KIAotCWlmIChzLT52LlNsaWNlLnN0ZXApIHsKLQkJbisrOwotCQlWSVNJVChjLCBleHByLCBzLT52LlNsaWNlLnN0ZXApOwotCX0KLQlBRERPUF9JKGMsIEJVSUxEX1NMSUNFLCBuKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAocy0+di5TbGljZS51cHBlcikgeworICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LlNsaWNlLnVwcGVyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKKyAgICB9CisKKyAgICBpZiAocy0+di5TbGljZS5zdGVwKSB7CisgICAgICAgIG4rKzsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5TbGljZS5zdGVwKTsKKyAgICB9CisgICAgQURET1BfSShjLCBCVUlMRF9TTElDRSwgbik7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3NpbXBsZV9zbGljZShzdHJ1Y3QgY29tcGlsZXIgKmMsIHNsaWNlX3R5IHMsIGV4cHJfY29udGV4dF90eSBjdHgpCiB7Ci0JaW50IG9wID0gMCwgc2xpY2Vfb2Zmc2V0ID0gMCwgc3RhY2tfY291bnQgPSAwOworICAgIGludCBvcCA9IDAsIHNsaWNlX29mZnNldCA9IDAsIHN0YWNrX2NvdW50ID0gMDsKIAotCWFzc2VydChzLT52LlNsaWNlLnN0ZXAgPT0gTlVMTCk7Ci0JaWYgKHMtPnYuU2xpY2UubG93ZXIpIHsKLQkJc2xpY2Vfb2Zmc2V0Kys7Ci0JCXN0YWNrX2NvdW50Kys7Ci0JCWlmIChjdHggIT0gQXVnU3RvcmUpIAotCQkJVklTSVQoYywgZXhwciwgcy0+di5TbGljZS5sb3dlcik7Ci0JfQotCWlmIChzLT52LlNsaWNlLnVwcGVyKSB7Ci0JCXNsaWNlX29mZnNldCArPSAyOwotCQlzdGFja19jb3VudCsrOwotCQlpZiAoY3R4ICE9IEF1Z1N0b3JlKSAKLQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuU2xpY2UudXBwZXIpOwotCX0KKyAgICBhc3NlcnQocy0+di5TbGljZS5zdGVwID09IE5VTEwpOworICAgIGlmIChzLT52LlNsaWNlLmxvd2VyKSB7CisgICAgICAgIHNsaWNlX29mZnNldCsrOworICAgICAgICBzdGFja19jb3VudCsrOworICAgICAgICBpZiAoY3R4ICE9IEF1Z1N0b3JlKQorICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5TbGljZS5sb3dlcik7CisgICAgfQorICAgIGlmIChzLT52LlNsaWNlLnVwcGVyKSB7CisgICAgICAgIHNsaWNlX29mZnNldCArPSAyOworICAgICAgICBzdGFja19jb3VudCsrOworICAgICAgICBpZiAoY3R4ICE9IEF1Z1N0b3JlKQorICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5TbGljZS51cHBlcik7CisgICAgfQogCi0JaWYgKGN0eCA9PSBBdWdMb2FkKSB7Ci0JCXN3aXRjaCAoc3RhY2tfY291bnQpIHsKLQkJY2FzZSAwOiBBRERPUChjLCBEVVBfVE9QKTsgYnJlYWs7Ci0JCWNhc2UgMTogQURET1BfSShjLCBEVVBfVE9QWCwgMik7IGJyZWFrOwotCQljYXNlIDI6IEFERE9QX0koYywgRFVQX1RPUFgsIDMpOyBicmVhazsKLQkJfQotCX0KLQllbHNlIGlmIChjdHggPT0gQXVnU3RvcmUpIHsKLQkJc3dpdGNoIChzdGFja19jb3VudCkgewotCQljYXNlIDA6IEFERE9QKGMsIFJPVF9UV08pOyBicmVhazsKLQkJY2FzZSAxOiBBRERPUChjLCBST1RfVEhSRUUpOyBicmVhazsKLQkJY2FzZSAyOiBBRERPUChjLCBST1RfRk9VUik7IGJyZWFrOwotCQl9Ci0JfQorICAgIGlmIChjdHggPT0gQXVnTG9hZCkgeworICAgICAgICBzd2l0Y2ggKHN0YWNrX2NvdW50KSB7CisgICAgICAgIGNhc2UgMDogQURET1AoYywgRFVQX1RPUCk7IGJyZWFrOworICAgICAgICBjYXNlIDE6IEFERE9QX0koYywgRFVQX1RPUFgsIDIpOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiBBRERPUF9JKGMsIERVUF9UT1BYLCAzKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoY3R4ID09IEF1Z1N0b3JlKSB7CisgICAgICAgIHN3aXRjaCAoc3RhY2tfY291bnQpIHsKKyAgICAgICAgY2FzZSAwOiBBRERPUChjLCBST1RfVFdPKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTogQURET1AoYywgUk9UX1RIUkVFKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjogQURET1AoYywgUk9UX0ZPVVIpOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KIAotCXN3aXRjaCAoY3R4KSB7Ci0JY2FzZSBBdWdMb2FkOiAvKiBmYWxsIHRocm91Z2ggdG8gTG9hZCAqLwotCWNhc2UgTG9hZDogb3AgPSBTTElDRTsgYnJlYWs7Ci0JY2FzZSBBdWdTdG9yZTovKiBmYWxsIHRocm91Z2ggdG8gU3RvcmUgKi8KLQljYXNlIFN0b3JlOiBvcCA9IFNUT1JFX1NMSUNFOyBicmVhazsKLQljYXNlIERlbDogb3AgPSBERUxFVEVfU0xJQ0U7IGJyZWFrOwotCWNhc2UgUGFyYW06Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJwYXJhbSBpbnZhbGlkIGluIHNpbXBsZSBzbGljZSIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgc3dpdGNoIChjdHgpIHsKKyAgICBjYXNlIEF1Z0xvYWQ6IC8qIGZhbGwgdGhyb3VnaCB0byBMb2FkICovCisgICAgY2FzZSBMb2FkOiBvcCA9IFNMSUNFOyBicmVhazsKKyAgICBjYXNlIEF1Z1N0b3JlOi8qIGZhbGwgdGhyb3VnaCB0byBTdG9yZSAqLworICAgIGNhc2UgU3RvcmU6IG9wID0gU1RPUkVfU0xJQ0U7IGJyZWFrOworICAgIGNhc2UgRGVsOiBvcCA9IERFTEVURV9TTElDRTsgYnJlYWs7CisgICAgY2FzZSBQYXJhbToKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0gaW52YWxpZCBpbiBzaW1wbGUgc2xpY2UiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JQURET1AoYywgb3AgKyBzbGljZV9vZmZzZXQpOwotCXJldHVybiAxOworICAgIEFERE9QKGMsIG9wICsgc2xpY2Vfb2Zmc2V0KTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAotY29tcGlsZXJfdmlzaXRfbmVzdGVkX3NsaWNlKHN0cnVjdCBjb21waWxlciAqYywgc2xpY2VfdHkgcywgCi0JCQkgICAgZXhwcl9jb250ZXh0X3R5IGN0eCkKK2NvbXBpbGVyX3Zpc2l0X25lc3RlZF9zbGljZShzdHJ1Y3QgY29tcGlsZXIgKmMsIHNsaWNlX3R5IHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eCkKIHsKLQlzd2l0Y2ggKHMtPmtpbmQpIHsKLQljYXNlIEVsbGlwc2lzX2tpbmQ6Ci0JCUFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfRWxsaXBzaXMsIGNvbnN0cyk7Ci0JCWJyZWFrOwotCWNhc2UgU2xpY2Vfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX3NsaWNlKGMsIHMsIGN0eCk7Ci0JY2FzZSBJbmRleF9raW5kOgotCQlWSVNJVChjLCBleHByLCBzLT52LkluZGV4LnZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBFeHRTbGljZV9raW5kOgotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiZXh0ZW5kZWQgc2xpY2UgaW52YWxpZCBpbiBuZXN0ZWQgc2xpY2UiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIHN3aXRjaCAocy0+a2luZCkgeworICAgIGNhc2UgRWxsaXBzaXNfa2luZDoKKyAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9FbGxpcHNpcywgY29uc3RzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTbGljZV9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfc2xpY2UoYywgcywgY3R4KTsKKyAgICBjYXNlIEluZGV4X2tpbmQ6CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuSW5kZXgudmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEV4dFNsaWNlX2tpbmQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVuZGVkIHNsaWNlIGludmFsaWQgaW4gbmVzdGVkIHNsaWNlIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfdmlzaXRfc2xpY2Uoc3RydWN0IGNvbXBpbGVyICpjLCBzbGljZV90eSBzLCBleHByX2NvbnRleHRfdHkgY3R4KQogewotCWNoYXIgKiBraW5kbmFtZSA9IE5VTEw7Ci0Jc3dpdGNoIChzLT5raW5kKSB7Ci0JY2FzZSBJbmRleF9raW5kOgotCQlraW5kbmFtZSA9ICJpbmRleCI7Ci0JCWlmIChjdHggIT0gQXVnU3RvcmUpIHsKLQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuSW5kZXgudmFsdWUpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgRWxsaXBzaXNfa2luZDoKLQkJa2luZG5hbWUgPSAiZWxsaXBzaXMiOwotCQlpZiAoY3R4ICE9IEF1Z1N0b3JlKSB7Ci0JCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X0VsbGlwc2lzLCBjb25zdHMpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU2xpY2Vfa2luZDoKLQkJa2luZG5hbWUgPSAic2xpY2UiOwotCQlpZiAoIXMtPnYuU2xpY2Uuc3RlcCkgCi0JCQlyZXR1cm4gY29tcGlsZXJfc2ltcGxlX3NsaWNlKGMsIHMsIGN0eCk7Ci0JCWlmIChjdHggIT0gQXVnU3RvcmUpIHsKLQkJCWlmICghY29tcGlsZXJfc2xpY2UoYywgcywgY3R4KSkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEV4dFNsaWNlX2tpbmQ6Ci0JCWtpbmRuYW1lID0gImV4dGVuZGVkIHNsaWNlIjsKLQkJaWYgKGN0eCAhPSBBdWdTdG9yZSkgewotCQkJaW50IGksIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5FeHRTbGljZS5kaW1zKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlzbGljZV90eSBzdWIgPSAoc2xpY2VfdHkpYXNkbF9zZXFfR0VUKAotCQkJCQlzLT52LkV4dFNsaWNlLmRpbXMsIGkpOwotCQkJCWlmICghY29tcGlsZXJfdmlzaXRfbmVzdGVkX3NsaWNlKGMsIHN1YiwgY3R4KSkKLQkJCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBuKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgICJpbnZhbGlkIHN1YnNjcmlwdCBraW5kICVkIiwgcy0+a2luZCk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gY29tcGlsZXJfaGFuZGxlX3N1YnNjcihjLCBraW5kbmFtZSwgY3R4KTsKKyAgICBjaGFyICoga2luZG5hbWUgPSBOVUxMOworICAgIHN3aXRjaCAocy0+a2luZCkgeworICAgIGNhc2UgSW5kZXhfa2luZDoKKyAgICAgICAga2luZG5hbWUgPSAiaW5kZXgiOworICAgICAgICBpZiAoY3R4ICE9IEF1Z1N0b3JlKSB7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkluZGV4LnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVsbGlwc2lzX2tpbmQ6CisgICAgICAgIGtpbmRuYW1lID0gImVsbGlwc2lzIjsKKyAgICAgICAgaWYgKGN0eCAhPSBBdWdTdG9yZSkgeworICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9FbGxpcHNpcywgY29uc3RzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFNsaWNlX2tpbmQ6CisgICAgICAgIGtpbmRuYW1lID0gInNsaWNlIjsKKyAgICAgICAgaWYgKCFzLT52LlNsaWNlLnN0ZXApCisgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfc2ltcGxlX3NsaWNlKGMsIHMsIGN0eCk7CisgICAgICAgIGlmIChjdHggIT0gQXVnU3RvcmUpIHsKKyAgICAgICAgICAgIGlmICghY29tcGlsZXJfc2xpY2UoYywgcywgY3R4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEV4dFNsaWNlX2tpbmQ6CisgICAgICAgIGtpbmRuYW1lID0gImV4dGVuZGVkIHNsaWNlIjsKKyAgICAgICAgaWYgKGN0eCAhPSBBdWdTdG9yZSkgeworICAgICAgICAgICAgaW50IGksIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5FeHRTbGljZS5kaW1zKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzbGljZV90eSBzdWIgPSAoc2xpY2VfdHkpYXNkbF9zZXFfR0VUKAorICAgICAgICAgICAgICAgICAgICBzLT52LkV4dFNsaWNlLmRpbXMsIGkpOworICAgICAgICAgICAgICAgIGlmICghY29tcGlsZXJfdmlzaXRfbmVzdGVkX3NsaWNlKGMsIHN1YiwgY3R4KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBuKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBzdWJzY3JpcHQga2luZCAlZCIsIHMtPmtpbmQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGNvbXBpbGVyX2hhbmRsZV9zdWJzY3IoYywga2luZG5hbWUsIGN0eCk7CiB9CiAKIApAQCAtMzQxNCw3MyArMzQxNCw3MyBAQAogKi8KIAogc3RydWN0IGFzc2VtYmxlciB7Ci0JUHlPYmplY3QgKmFfYnl0ZWNvZGU7ICAvKiBzdHJpbmcgY29udGFpbmluZyBieXRlY29kZSAqLwotCWludCBhX29mZnNldDsJICAgICAgIC8qIG9mZnNldCBpbnRvIGJ5dGVjb2RlICovCi0JaW50IGFfbmJsb2NrczsJICAgICAgIC8qIG51bWJlciBvZiByZWFjaGFibGUgYmxvY2tzICovCi0JYmFzaWNibG9jayAqKmFfcG9zdG9yZGVyOyAvKiBsaXN0IG9mIGJsb2NrcyBpbiBkZnMgcG9zdG9yZGVyICovCi0JUHlPYmplY3QgKmFfbG5vdGFiOyAgICAvKiBzdHJpbmcgY29udGFpbmluZyBsbm90YWIgKi8KLQlpbnQgYV9sbm90YWJfb2ZmOyAgICAgIC8qIG9mZnNldCBpbnRvIGxub3RhYiAqLwotCWludCBhX2xpbmVubzsJICAgICAgIC8qIGxhc3QgbGluZW5vIG9mIGVtaXR0ZWQgaW5zdHJ1Y3Rpb24gKi8KLQlpbnQgYV9saW5lbm9fb2ZmOyAgICAgIC8qIGJ5dGVjb2RlIG9mZnNldCBvZiBsYXN0IGxpbmVubyAqLworICAgIFB5T2JqZWN0ICphX2J5dGVjb2RlOyAgLyogc3RyaW5nIGNvbnRhaW5pbmcgYnl0ZWNvZGUgKi8KKyAgICBpbnQgYV9vZmZzZXQ7ICAgICAgICAgICAgICAvKiBvZmZzZXQgaW50byBieXRlY29kZSAqLworICAgIGludCBhX25ibG9ja3M7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZWFjaGFibGUgYmxvY2tzICovCisgICAgYmFzaWNibG9jayAqKmFfcG9zdG9yZGVyOyAvKiBsaXN0IG9mIGJsb2NrcyBpbiBkZnMgcG9zdG9yZGVyICovCisgICAgUHlPYmplY3QgKmFfbG5vdGFiOyAgICAvKiBzdHJpbmcgY29udGFpbmluZyBsbm90YWIgKi8KKyAgICBpbnQgYV9sbm90YWJfb2ZmOyAgICAgIC8qIG9mZnNldCBpbnRvIGxub3RhYiAqLworICAgIGludCBhX2xpbmVubzsgICAgICAgICAgICAgIC8qIGxhc3QgbGluZW5vIG9mIGVtaXR0ZWQgaW5zdHJ1Y3Rpb24gKi8KKyAgICBpbnQgYV9saW5lbm9fb2ZmOyAgICAgIC8qIGJ5dGVjb2RlIG9mZnNldCBvZiBsYXN0IGxpbmVubyAqLwogfTsKIAogc3RhdGljIHZvaWQKIGRmcyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGJhc2ljYmxvY2sgKmIsIHN0cnVjdCBhc3NlbWJsZXIgKmEpCiB7Ci0JaW50IGk7Ci0Jc3RydWN0IGluc3RyICppbnN0ciA9IE5VTEw7CisgICAgaW50IGk7CisgICAgc3RydWN0IGluc3RyICppbnN0ciA9IE5VTEw7CiAKLQlpZiAoYi0+Yl9zZWVuKQotCQlyZXR1cm47Ci0JYi0+Yl9zZWVuID0gMTsKLQlpZiAoYi0+Yl9uZXh0ICE9IE5VTEwpCi0JCWRmcyhjLCBiLT5iX25leHQsIGEpOwotCWZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspIHsKLQkJaW5zdHIgPSAmYi0+Yl9pbnN0cltpXTsKLQkJaWYgKGluc3RyLT5pX2pyZWwgfHwgaW5zdHItPmlfamFicykKLQkJCWRmcyhjLCBpbnN0ci0+aV90YXJnZXQsIGEpOwotCX0KLQlhLT5hX3Bvc3RvcmRlclthLT5hX25ibG9ja3MrK10gPSBiOworICAgIGlmIChiLT5iX3NlZW4pCisgICAgICAgIHJldHVybjsKKyAgICBiLT5iX3NlZW4gPSAxOworICAgIGlmIChiLT5iX25leHQgIT0gTlVMTCkKKyAgICAgICAgZGZzKGMsIGItPmJfbmV4dCwgYSk7CisgICAgZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykgeworICAgICAgICBpbnN0ciA9ICZiLT5iX2luc3RyW2ldOworICAgICAgICBpZiAoaW5zdHItPmlfanJlbCB8fCBpbnN0ci0+aV9qYWJzKQorICAgICAgICAgICAgZGZzKGMsIGluc3RyLT5pX3RhcmdldCwgYSk7CisgICAgfQorICAgIGEtPmFfcG9zdG9yZGVyW2EtPmFfbmJsb2NrcysrXSA9IGI7CiB9CiAKIHN0YXRpYyBpbnQKIHN0YWNrZGVwdGhfd2FsayhzdHJ1Y3QgY29tcGlsZXIgKmMsIGJhc2ljYmxvY2sgKmIsIGludCBkZXB0aCwgaW50IG1heGRlcHRoKQogewotCWludCBpLCB0YXJnZXRfZGVwdGg7Ci0Jc3RydWN0IGluc3RyICppbnN0cjsKLQlpZiAoYi0+Yl9zZWVuIHx8IGItPmJfc3RhcnRkZXB0aCA+PSBkZXB0aCkKLQkJcmV0dXJuIG1heGRlcHRoOwotCWItPmJfc2VlbiA9IDE7Ci0JYi0+Yl9zdGFydGRlcHRoID0gZGVwdGg7Ci0JZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykgewotCQlpbnN0ciA9ICZiLT5iX2luc3RyW2ldOwotCQlkZXB0aCArPSBvcGNvZGVfc3RhY2tfZWZmZWN0KGluc3RyLT5pX29wY29kZSwgaW5zdHItPmlfb3BhcmcpOwotCQlpZiAoZGVwdGggPiBtYXhkZXB0aCkKLQkJCW1heGRlcHRoID0gZGVwdGg7Ci0JCWFzc2VydChkZXB0aCA+PSAwKTsgLyogaW52YWxpZCBjb2RlIG9yIGJ1ZyBpbiBzdGFja2RlcHRoKCkgKi8KLQkJaWYgKGluc3RyLT5pX2pyZWwgfHwgaW5zdHItPmlfamFicykgewotCQkJdGFyZ2V0X2RlcHRoID0gZGVwdGg7Ci0JCQlpZiAoaW5zdHItPmlfb3Bjb2RlID09IEZPUl9JVEVSKSB7Ci0JCQkJdGFyZ2V0X2RlcHRoID0gZGVwdGgtMjsKLQkJCX0gZWxzZSBpZiAoaW5zdHItPmlfb3Bjb2RlID09IFNFVFVQX0ZJTkFMTFkgfHwKLQkJCQkgICBpbnN0ci0+aV9vcGNvZGUgPT0gU0VUVVBfRVhDRVBUKSB7Ci0JCQkJdGFyZ2V0X2RlcHRoID0gZGVwdGgrMzsKLQkJCQlpZiAodGFyZ2V0X2RlcHRoID4gbWF4ZGVwdGgpCi0JCQkJCW1heGRlcHRoID0gdGFyZ2V0X2RlcHRoOwotCQkJfQotCQkJbWF4ZGVwdGggPSBzdGFja2RlcHRoX3dhbGsoYywgaW5zdHItPmlfdGFyZ2V0LAotCQkJCQkJICAgdGFyZ2V0X2RlcHRoLCBtYXhkZXB0aCk7Ci0JCQlpZiAoaW5zdHItPmlfb3Bjb2RlID09IEpVTVBfQUJTT0xVVEUgfHwKLQkJCSAgICBpbnN0ci0+aV9vcGNvZGUgPT0gSlVNUF9GT1JXQVJEKSB7Ci0JCQkJZ290byBvdXQ7IC8qIHJlbWFpbmluZyBjb2RlIGlzIGRlYWQgKi8KLQkJCX0KLQkJfQotCX0KLQlpZiAoYi0+Yl9uZXh0KQotCQltYXhkZXB0aCA9IHN0YWNrZGVwdGhfd2FsayhjLCBiLT5iX25leHQsIGRlcHRoLCBtYXhkZXB0aCk7CisgICAgaW50IGksIHRhcmdldF9kZXB0aDsKKyAgICBzdHJ1Y3QgaW5zdHIgKmluc3RyOworICAgIGlmIChiLT5iX3NlZW4gfHwgYi0+Yl9zdGFydGRlcHRoID49IGRlcHRoKQorICAgICAgICByZXR1cm4gbWF4ZGVwdGg7CisgICAgYi0+Yl9zZWVuID0gMTsKKyAgICBiLT5iX3N0YXJ0ZGVwdGggPSBkZXB0aDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYi0+Yl9pdXNlZDsgaSsrKSB7CisgICAgICAgIGluc3RyID0gJmItPmJfaW5zdHJbaV07CisgICAgICAgIGRlcHRoICs9IG9wY29kZV9zdGFja19lZmZlY3QoaW5zdHItPmlfb3Bjb2RlLCBpbnN0ci0+aV9vcGFyZyk7CisgICAgICAgIGlmIChkZXB0aCA+IG1heGRlcHRoKQorICAgICAgICAgICAgbWF4ZGVwdGggPSBkZXB0aDsKKyAgICAgICAgYXNzZXJ0KGRlcHRoID49IDApOyAvKiBpbnZhbGlkIGNvZGUgb3IgYnVnIGluIHN0YWNrZGVwdGgoKSAqLworICAgICAgICBpZiAoaW5zdHItPmlfanJlbCB8fCBpbnN0ci0+aV9qYWJzKSB7CisgICAgICAgICAgICB0YXJnZXRfZGVwdGggPSBkZXB0aDsKKyAgICAgICAgICAgIGlmIChpbnN0ci0+aV9vcGNvZGUgPT0gRk9SX0lURVIpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRfZGVwdGggPSBkZXB0aC0yOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0ci0+aV9vcGNvZGUgPT0gU0VUVVBfRklOQUxMWSB8fAorICAgICAgICAgICAgICAgICAgICAgICBpbnN0ci0+aV9vcGNvZGUgPT0gU0VUVVBfRVhDRVBUKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0X2RlcHRoID0gZGVwdGgrMzsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0X2RlcHRoID4gbWF4ZGVwdGgpCisgICAgICAgICAgICAgICAgICAgIG1heGRlcHRoID0gdGFyZ2V0X2RlcHRoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF4ZGVwdGggPSBzdGFja2RlcHRoX3dhbGsoYywgaW5zdHItPmlfdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2RlcHRoLCBtYXhkZXB0aCk7CisgICAgICAgICAgICBpZiAoaW5zdHItPmlfb3Bjb2RlID09IEpVTVBfQUJTT0xVVEUgfHwKKyAgICAgICAgICAgICAgICBpbnN0ci0+aV9vcGNvZGUgPT0gSlVNUF9GT1JXQVJEKSB7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7IC8qIHJlbWFpbmluZyBjb2RlIGlzIGRlYWQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYi0+Yl9uZXh0KQorICAgICAgICBtYXhkZXB0aCA9IHN0YWNrZGVwdGhfd2FsayhjLCBiLT5iX25leHQsIGRlcHRoLCBtYXhkZXB0aCk7CiBvdXQ6Ci0JYi0+Yl9zZWVuID0gMDsKLQlyZXR1cm4gbWF4ZGVwdGg7CisgICAgYi0+Yl9zZWVuID0gMDsKKyAgICByZXR1cm4gbWF4ZGVwdGg7CiB9CiAKIC8qIEZpbmQgdGhlIGZsb3cgcGF0aCB0aGF0IG5lZWRzIHRoZSBsYXJnZXN0IHN0YWNrLiAgV2UgYXNzdW1lIHRoYXQKQEAgLTM0ODksNDkgKzM0ODksNDkgQEAKIHN0YXRpYyBpbnQKIHN0YWNrZGVwdGgoc3RydWN0IGNvbXBpbGVyICpjKQogewotCWJhc2ljYmxvY2sgKmIsICplbnRyeWJsb2NrOwotCWVudHJ5YmxvY2sgPSBOVUxMOwotCWZvciAoYiA9IGMtPnUtPnVfYmxvY2tzOyBiICE9IE5VTEw7IGIgPSBiLT5iX2xpc3QpIHsKLQkJYi0+Yl9zZWVuID0gMDsKLQkJYi0+Yl9zdGFydGRlcHRoID0gSU5UX01JTjsKLQkJZW50cnlibG9jayA9IGI7Ci0JfQotCWlmICghZW50cnlibG9jaykKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHN0YWNrZGVwdGhfd2FsayhjLCBlbnRyeWJsb2NrLCAwLCAwKTsKKyAgICBiYXNpY2Jsb2NrICpiLCAqZW50cnlibG9jazsKKyAgICBlbnRyeWJsb2NrID0gTlVMTDsKKyAgICBmb3IgKGIgPSBjLT51LT51X2Jsb2NrczsgYiAhPSBOVUxMOyBiID0gYi0+Yl9saXN0KSB7CisgICAgICAgIGItPmJfc2VlbiA9IDA7CisgICAgICAgIGItPmJfc3RhcnRkZXB0aCA9IElOVF9NSU47CisgICAgICAgIGVudHJ5YmxvY2sgPSBiOworICAgIH0KKyAgICBpZiAoIWVudHJ5YmxvY2spCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzdGFja2RlcHRoX3dhbGsoYywgZW50cnlibG9jaywgMCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQKIGFzc2VtYmxlX2luaXQoc3RydWN0IGFzc2VtYmxlciAqYSwgaW50IG5ibG9ja3MsIGludCBmaXJzdGxpbmVubykKIHsKLQltZW1zZXQoYSwgMCwgc2l6ZW9mKHN0cnVjdCBhc3NlbWJsZXIpKTsKLQlhLT5hX2xpbmVubyA9IGZpcnN0bGluZW5vOwotCWEtPmFfYnl0ZWNvZGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBERUZBVUxUX0NPREVfU0laRSk7Ci0JaWYgKCFhLT5hX2J5dGVjb2RlKQotCQlyZXR1cm4gMDsKLQlhLT5hX2xub3RhYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIERFRkFVTFRfTE5PVEFCX1NJWkUpOwotCWlmICghYS0+YV9sbm90YWIpCi0JCXJldHVybiAwOwotCWlmIChuYmxvY2tzID4gUFlfU0laRV9NQVggLyBzaXplb2YoYmFzaWNibG9jayAqKSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gMDsKLQl9Ci0JYS0+YV9wb3N0b3JkZXIgPSAoYmFzaWNibG9jayAqKilQeU9iamVjdF9NYWxsb2MoCi0JCQkJCSAgICBzaXplb2YoYmFzaWNibG9jayAqKSAqIG5ibG9ja3MpOwotCWlmICghYS0+YV9wb3N0b3JkZXIpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIG1lbXNldChhLCAwLCBzaXplb2Yoc3RydWN0IGFzc2VtYmxlcikpOworICAgIGEtPmFfbGluZW5vID0gZmlyc3RsaW5lbm87CisgICAgYS0+YV9ieXRlY29kZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIERFRkFVTFRfQ09ERV9TSVpFKTsKKyAgICBpZiAoIWEtPmFfYnl0ZWNvZGUpCisgICAgICAgIHJldHVybiAwOworICAgIGEtPmFfbG5vdGFiID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgREVGQVVMVF9MTk9UQUJfU0laRSk7CisgICAgaWYgKCFhLT5hX2xub3RhYikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKG5ibG9ja3MgPiBQWV9TSVpFX01BWCAvIHNpemVvZihiYXNpY2Jsb2NrICopKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhLT5hX3Bvc3RvcmRlciA9IChiYXNpY2Jsb2NrICoqKVB5T2JqZWN0X01hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmFzaWNibG9jayAqKSAqIG5ibG9ja3MpOworICAgIGlmICghYS0+YV9wb3N0b3JkZXIpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogYXNzZW1ibGVfZnJlZShzdHJ1Y3QgYXNzZW1ibGVyICphKQogewotCVB5X1hERUNSRUYoYS0+YV9ieXRlY29kZSk7Ci0JUHlfWERFQ1JFRihhLT5hX2xub3RhYik7Ci0JaWYgKGEtPmFfcG9zdG9yZGVyKQotCQlQeU9iamVjdF9GcmVlKGEtPmFfcG9zdG9yZGVyKTsKKyAgICBQeV9YREVDUkVGKGEtPmFfYnl0ZWNvZGUpOworICAgIFB5X1hERUNSRUYoYS0+YV9sbm90YWIpOworICAgIGlmIChhLT5hX3Bvc3RvcmRlcikKKyAgICAgICAgUHlPYmplY3RfRnJlZShhLT5hX3Bvc3RvcmRlcik7CiB9CiAKIC8qIFJldHVybiB0aGUgc2l6ZSBvZiBhIGJhc2ljIGJsb2NrIGluIGJ5dGVzLiAqLwpAQCAtMzUzOSwyMiArMzUzOSwyMiBAQAogc3RhdGljIGludAogaW5zdHJzaXplKHN0cnVjdCBpbnN0ciAqaW5zdHIpCiB7Ci0JaWYgKCFpbnN0ci0+aV9oYXNhcmcpCi0JCXJldHVybiAxOwkvKiAxIGJ5dGUgZm9yIHRoZSBvcGNvZGUqLwotCWlmIChpbnN0ci0+aV9vcGFyZyA+IDB4ZmZmZikKLQkJcmV0dXJuIDY7CS8qIDEgKG9wY29kZSkgKyAxIChFWFRFTkRFRF9BUkcgb3Bjb2RlKSArIDIgKG9wYXJnKSArIDIob3BhcmcgZXh0ZW5kZWQpICovCi0JcmV0dXJuIDM7IAkJLyogMSAob3Bjb2RlKSArIDIgKG9wYXJnKSAqLworICAgIGlmICghaW5zdHItPmlfaGFzYXJnKQorICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAvKiAxIGJ5dGUgZm9yIHRoZSBvcGNvZGUqLworICAgIGlmIChpbnN0ci0+aV9vcGFyZyA+IDB4ZmZmZikKKyAgICAgICAgcmV0dXJuIDY7ICAgICAgICAgICAgICAgLyogMSAob3Bjb2RlKSArIDEgKEVYVEVOREVEX0FSRyBvcGNvZGUpICsgMiAob3BhcmcpICsgMihvcGFyZyBleHRlbmRlZCkgKi8KKyAgICByZXR1cm4gMzsgICAgICAgICAgICAgICAgICAgLyogMSAob3Bjb2RlKSArIDIgKG9wYXJnKSAqLwogfQogCiBzdGF0aWMgaW50CiBibG9ja3NpemUoYmFzaWNibG9jayAqYikKIHsKLQlpbnQgaTsKLQlpbnQgc2l6ZSA9IDA7CisgICAgaW50IGk7CisgICAgaW50IHNpemUgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykKLQkJc2l6ZSArPSBpbnN0cnNpemUoJmItPmJfaW5zdHJbaV0pOwotCXJldHVybiBzaXplOworICAgIGZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspCisgICAgICAgIHNpemUgKz0gaW5zdHJzaXplKCZiLT5iX2luc3RyW2ldKTsKKyAgICByZXR1cm4gc2l6ZTsKIH0KIAogLyogQXBwZW5kcyBhIHBhaXIgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSBudW1iZXIgdGFibGUsIGFfbG5vdGFiLCByZXByZXNlbnRpbmcKQEAgLTM1NjQsOTQgKzM1NjQsOTQgQEAKIHN0YXRpYyBpbnQKIGFzc2VtYmxlX2xub3RhYihzdHJ1Y3QgYXNzZW1ibGVyICphLCBzdHJ1Y3QgaW5zdHIgKmkpCiB7Ci0JaW50IGRfYnl0ZWNvZGUsIGRfbGluZW5vOwotCWludCBsZW47Ci0JdW5zaWduZWQgY2hhciAqbG5vdGFiOworICAgIGludCBkX2J5dGVjb2RlLCBkX2xpbmVubzsKKyAgICBpbnQgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmxub3RhYjsKIAotCWRfYnl0ZWNvZGUgPSBhLT5hX29mZnNldCAtIGEtPmFfbGluZW5vX29mZjsKLQlkX2xpbmVubyA9IGktPmlfbGluZW5vIC0gYS0+YV9saW5lbm87CisgICAgZF9ieXRlY29kZSA9IGEtPmFfb2Zmc2V0IC0gYS0+YV9saW5lbm9fb2ZmOworICAgIGRfbGluZW5vID0gaS0+aV9saW5lbm8gLSBhLT5hX2xpbmVubzsKIAotCWFzc2VydChkX2J5dGVjb2RlID49IDApOwotCWFzc2VydChkX2xpbmVubyA+PSAwKTsKKyAgICBhc3NlcnQoZF9ieXRlY29kZSA+PSAwKTsKKyAgICBhc3NlcnQoZF9saW5lbm8gPj0gMCk7CiAKLQlpZihkX2J5dGVjb2RlID09IDAgJiYgZF9saW5lbm8gPT0gMCkKLQkJcmV0dXJuIDE7CisgICAgaWYoZF9ieXRlY29kZSA9PSAwICYmIGRfbGluZW5vID09IDApCisgICAgICAgIHJldHVybiAxOwogCi0JaWYgKGRfYnl0ZWNvZGUgPiAyNTUpIHsKLQkJaW50IGosIG5ieXRlcywgbmNvZGVzID0gZF9ieXRlY29kZSAvIDI1NTsKLQkJbmJ5dGVzID0gYS0+YV9sbm90YWJfb2ZmICsgMiAqIG5jb2RlczsKLQkJbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoYS0+YV9sbm90YWIpOwotCQlpZiAobmJ5dGVzID49IGxlbikgewotCQkJaWYgKChsZW4gPD0gSU5UX01BWCAvIDIpICYmIChsZW4gKiAyIDwgbmJ5dGVzKSkKLQkJCQlsZW4gPSBuYnl0ZXM7Ci0JCQllbHNlIGlmIChsZW4gPD0gSU5UX01BWCAvIDIpCi0JCQkJbGVuICo9IDI7Ci0JCQllbHNlIHsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmEtPmFfbG5vdGFiLCBsZW4pIDwgMCkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKQotCQkJICAgUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKLQkJZm9yIChqID0gMDsgaiA8IG5jb2RlczsgaisrKSB7Ci0JCQkqbG5vdGFiKysgPSAyNTU7Ci0JCQkqbG5vdGFiKysgPSAwOwotCQl9Ci0JCWRfYnl0ZWNvZGUgLT0gbmNvZGVzICogMjU1OwotCQlhLT5hX2xub3RhYl9vZmYgKz0gbmNvZGVzICogMjsKLQl9Ci0JYXNzZXJ0KGRfYnl0ZWNvZGUgPD0gMjU1KTsKLQlpZiAoZF9saW5lbm8gPiAyNTUpIHsKLQkJaW50IGosIG5ieXRlcywgbmNvZGVzID0gZF9saW5lbm8gLyAyNTU7Ci0JCW5ieXRlcyA9IGEtPmFfbG5vdGFiX29mZiArIDIgKiBuY29kZXM7Ci0JCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGEtPmFfbG5vdGFiKTsKLQkJaWYgKG5ieXRlcyA+PSBsZW4pIHsKLQkJCWlmICgobGVuIDw9IElOVF9NQVggLyAyKSAmJiBsZW4gKiAyIDwgbmJ5dGVzKQotCQkJCWxlbiA9IG5ieXRlczsKLQkJCWVsc2UgaWYgKGxlbiA8PSBJTlRfTUFYIC8gMikKLQkJCQlsZW4gKj0gMjsKLQkJCWVsc2UgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS0+YV9sbm90YWIsIGxlbikgPCAwKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCWxub3RhYiA9ICh1bnNpZ25lZCBjaGFyICopCi0JCQkgICBQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOwotCQkqbG5vdGFiKysgPSBkX2J5dGVjb2RlOwotCQkqbG5vdGFiKysgPSAyNTU7Ci0JCWRfYnl0ZWNvZGUgPSAwOwotCQlmb3IgKGogPSAxOyBqIDwgbmNvZGVzOyBqKyspIHsKLQkJCSpsbm90YWIrKyA9IDA7Ci0JCQkqbG5vdGFiKysgPSAyNTU7Ci0JCX0KLQkJZF9saW5lbm8gLT0gbmNvZGVzICogMjU1OwotCQlhLT5hX2xub3RhYl9vZmYgKz0gbmNvZGVzICogMjsKLQl9CisgICAgaWYgKGRfYnl0ZWNvZGUgPiAyNTUpIHsKKyAgICAgICAgaW50IGosIG5ieXRlcywgbmNvZGVzID0gZF9ieXRlY29kZSAvIDI1NTsKKyAgICAgICAgbmJ5dGVzID0gYS0+YV9sbm90YWJfb2ZmICsgMiAqIG5jb2RlczsKKyAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoYS0+YV9sbm90YWIpOworICAgICAgICBpZiAobmJ5dGVzID49IGxlbikgeworICAgICAgICAgICAgaWYgKChsZW4gPD0gSU5UX01BWCAvIDIpICYmIChsZW4gKiAyIDwgbmJ5dGVzKSkKKyAgICAgICAgICAgICAgICBsZW4gPSBuYnl0ZXM7CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPD0gSU5UX01BWCAvIDIpCisgICAgICAgICAgICAgICAgbGVuICo9IDI7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJmEtPmFfbG5vdGFiLCBsZW4pIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKQorICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2xub3RhYikgKyBhLT5hX2xub3RhYl9vZmY7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuY29kZXM7IGorKykgeworICAgICAgICAgICAgKmxub3RhYisrID0gMjU1OworICAgICAgICAgICAgKmxub3RhYisrID0gMDsKKyAgICAgICAgfQorICAgICAgICBkX2J5dGVjb2RlIC09IG5jb2RlcyAqIDI1NTsKKyAgICAgICAgYS0+YV9sbm90YWJfb2ZmICs9IG5jb2RlcyAqIDI7CisgICAgfQorICAgIGFzc2VydChkX2J5dGVjb2RlIDw9IDI1NSk7CisgICAgaWYgKGRfbGluZW5vID4gMjU1KSB7CisgICAgICAgIGludCBqLCBuYnl0ZXMsIG5jb2RlcyA9IGRfbGluZW5vIC8gMjU1OworICAgICAgICBuYnl0ZXMgPSBhLT5hX2xub3RhYl9vZmYgKyAyICogbmNvZGVzOworICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShhLT5hX2xub3RhYik7CisgICAgICAgIGlmIChuYnl0ZXMgPj0gbGVuKSB7CisgICAgICAgICAgICBpZiAoKGxlbiA8PSBJTlRfTUFYIC8gMikgJiYgbGVuICogMiA8IG5ieXRlcykKKyAgICAgICAgICAgICAgICBsZW4gPSBuYnl0ZXM7CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPD0gSU5UX01BWCAvIDIpCisgICAgICAgICAgICAgICAgbGVuICo9IDI7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJmEtPmFfbG5vdGFiLCBsZW4pIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKQorICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2xub3RhYikgKyBhLT5hX2xub3RhYl9vZmY7CisgICAgICAgICpsbm90YWIrKyA9IGRfYnl0ZWNvZGU7CisgICAgICAgICpsbm90YWIrKyA9IDI1NTsKKyAgICAgICAgZF9ieXRlY29kZSA9IDA7CisgICAgICAgIGZvciAoaiA9IDE7IGogPCBuY29kZXM7IGorKykgeworICAgICAgICAgICAgKmxub3RhYisrID0gMDsKKyAgICAgICAgICAgICpsbm90YWIrKyA9IDI1NTsKKyAgICAgICAgfQorICAgICAgICBkX2xpbmVubyAtPSBuY29kZXMgKiAyNTU7CisgICAgICAgIGEtPmFfbG5vdGFiX29mZiArPSBuY29kZXMgKiAyOworICAgIH0KIAotCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGEtPmFfbG5vdGFiKTsKLQlpZiAoYS0+YV9sbm90YWJfb2ZmICsgMiA+PSBsZW4pIHsKLQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmEtPmFfbG5vdGFiLCBsZW4gKiAyKSA8IDApCi0JCQlyZXR1cm4gMDsKLQl9Ci0JbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikKLQkJCVB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2xub3RhYikgKyBhLT5hX2xub3RhYl9vZmY7CisgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoYS0+YV9sbm90YWIpOworICAgIGlmIChhLT5hX2xub3RhYl9vZmYgKyAyID49IGxlbikgeworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS0+YV9sbm90YWIsIGxlbiAqIDIpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKQorICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOwogCi0JYS0+YV9sbm90YWJfb2ZmICs9IDI7Ci0JaWYgKGRfYnl0ZWNvZGUpIHsKLQkJKmxub3RhYisrID0gZF9ieXRlY29kZTsKLQkJKmxub3RhYisrID0gZF9saW5lbm87Ci0JfQotCWVsc2UgewkvKiBGaXJzdCBsaW5lIG9mIGEgYmxvY2s7IGRlZiBzdG10LCBldGMuICovCi0JCSpsbm90YWIrKyA9IDA7Ci0JCSpsbm90YWIrKyA9IGRfbGluZW5vOwotCX0KLQlhLT5hX2xpbmVubyA9IGktPmlfbGluZW5vOwotCWEtPmFfbGluZW5vX29mZiA9IGEtPmFfb2Zmc2V0OwotCXJldHVybiAxOworICAgIGEtPmFfbG5vdGFiX29mZiArPSAyOworICAgIGlmIChkX2J5dGVjb2RlKSB7CisgICAgICAgICpsbm90YWIrKyA9IGRfYnl0ZWNvZGU7CisgICAgICAgICpsbm90YWIrKyA9IGRfbGluZW5vOworICAgIH0KKyAgICBlbHNlIHsgICAgICAvKiBGaXJzdCBsaW5lIG9mIGEgYmxvY2s7IGRlZiBzdG10LCBldGMuICovCisgICAgICAgICpsbm90YWIrKyA9IDA7CisgICAgICAgICpsbm90YWIrKyA9IGRfbGluZW5vOworICAgIH0KKyAgICBhLT5hX2xpbmVubyA9IGktPmlfbGluZW5vOworICAgIGEtPmFfbGluZW5vX29mZiA9IGEtPmFfb2Zmc2V0OworICAgIHJldHVybiAxOwogfQogCiAvKiBhc3NlbWJsZV9lbWl0KCkKQEAgLTM2NjIsMjI2ICszNjYyLDIyNiBAQAogc3RhdGljIGludAogYXNzZW1ibGVfZW1pdChzdHJ1Y3QgYXNzZW1ibGVyICphLCBzdHJ1Y3QgaW5zdHIgKmkpCiB7Ci0JaW50IHNpemUsIGFyZyA9IDAsIGV4dCA9IDA7Ci0JUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShhLT5hX2J5dGVjb2RlKTsKLQljaGFyICpjb2RlOworICAgIGludCBzaXplLCBhcmcgPSAwLCBleHQgPSAwOworICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoYS0+YV9ieXRlY29kZSk7CisgICAgY2hhciAqY29kZTsKIAotCXNpemUgPSBpbnN0cnNpemUoaSk7Ci0JaWYgKGktPmlfaGFzYXJnKSB7Ci0JCWFyZyA9IGktPmlfb3Bhcmc7Ci0JCWV4dCA9IGFyZyA+PiAxNjsKLQl9Ci0JaWYgKGktPmlfbGluZW5vICYmICFhc3NlbWJsZV9sbm90YWIoYSwgaSkpCi0JCXJldHVybiAwOwotCWlmIChhLT5hX29mZnNldCArIHNpemUgPj0gbGVuKSB7Ci0JCWlmIChsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmEtPmFfYnl0ZWNvZGUsIGxlbiAqIDIpIDwgMCkKLQkJICAgIHJldHVybiAwOwotCX0KLQljb2RlID0gUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfYnl0ZWNvZGUpICsgYS0+YV9vZmZzZXQ7Ci0JYS0+YV9vZmZzZXQgKz0gc2l6ZTsKLQlpZiAoc2l6ZSA9PSA2KSB7Ci0JCWFzc2VydChpLT5pX2hhc2FyZyk7Ci0JCSpjb2RlKysgPSAoY2hhcilFWFRFTkRFRF9BUkc7Ci0JCSpjb2RlKysgPSBleHQgJiAweGZmOwotCQkqY29kZSsrID0gZXh0ID4+IDg7Ci0JCWFyZyAmPSAweGZmZmY7Ci0JfQotCSpjb2RlKysgPSBpLT5pX29wY29kZTsKLQlpZiAoaS0+aV9oYXNhcmcpIHsKLQkJYXNzZXJ0KHNpemUgPT0gMyB8fCBzaXplID09IDYpOwotCQkqY29kZSsrID0gYXJnICYgMHhmZjsKLQkJKmNvZGUrKyA9IGFyZyA+PiA4OwotCX0KLQlyZXR1cm4gMTsKKyAgICBzaXplID0gaW5zdHJzaXplKGkpOworICAgIGlmIChpLT5pX2hhc2FyZykgeworICAgICAgICBhcmcgPSBpLT5pX29wYXJnOworICAgICAgICBleHQgPSBhcmcgPj4gMTY7CisgICAgfQorICAgIGlmIChpLT5pX2xpbmVubyAmJiAhYXNzZW1ibGVfbG5vdGFiKGEsIGkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYS0+YV9vZmZzZXQgKyBzaXplID49IGxlbikgeworICAgICAgICBpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLyAyKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZhLT5hX2J5dGVjb2RlLCBsZW4gKiAyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29kZSA9IFB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2J5dGVjb2RlKSArIGEtPmFfb2Zmc2V0OworICAgIGEtPmFfb2Zmc2V0ICs9IHNpemU7CisgICAgaWYgKHNpemUgPT0gNikgeworICAgICAgICBhc3NlcnQoaS0+aV9oYXNhcmcpOworICAgICAgICAqY29kZSsrID0gKGNoYXIpRVhURU5ERURfQVJHOworICAgICAgICAqY29kZSsrID0gZXh0ICYgMHhmZjsKKyAgICAgICAgKmNvZGUrKyA9IGV4dCA+PiA4OworICAgICAgICBhcmcgJj0gMHhmZmZmOworICAgIH0KKyAgICAqY29kZSsrID0gaS0+aV9vcGNvZGU7CisgICAgaWYgKGktPmlfaGFzYXJnKSB7CisgICAgICAgIGFzc2VydChzaXplID09IDMgfHwgc2l6ZSA9PSA2KTsKKyAgICAgICAgKmNvZGUrKyA9IGFyZyAmIDB4ZmY7CisgICAgICAgICpjb2RlKysgPSBhcmcgPj4gODsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkCiBhc3NlbWJsZV9qdW1wX29mZnNldHMoc3RydWN0IGFzc2VtYmxlciAqYSwgc3RydWN0IGNvbXBpbGVyICpjKQogewotCWJhc2ljYmxvY2sgKmI7Ci0JaW50IGJzaXplLCB0b3RzaXplLCBleHRlbmRlZF9hcmdfY291bnQgPSAwLCBsYXN0X2V4dGVuZGVkX2FyZ19jb3VudDsKLQlpbnQgaTsKKyAgICBiYXNpY2Jsb2NrICpiOworICAgIGludCBic2l6ZSwgdG90c2l6ZSwgZXh0ZW5kZWRfYXJnX2NvdW50ID0gMCwgbGFzdF9leHRlbmRlZF9hcmdfY291bnQ7CisgICAgaW50IGk7CiAKLQkvKiBDb21wdXRlIHRoZSBzaXplIG9mIGVhY2ggYmxvY2sgYW5kIGZpeHVwIGp1bXAgYXJncy4KLQkgICBSZXBsYWNlIGJsb2NrIHBvaW50ZXIgd2l0aCBwb3NpdGlvbiBpbiBieXRlY29kZS4gKi8KLQlkbyB7Ci0JCXRvdHNpemUgPSAwOwotCQlmb3IgKGkgPSBhLT5hX25ibG9ja3MgLSAxOyBpID49IDA7IGktLSkgewotCQkJYiA9IGEtPmFfcG9zdG9yZGVyW2ldOwotCQkJYnNpemUgPSBibG9ja3NpemUoYik7Ci0JCQliLT5iX29mZnNldCA9IHRvdHNpemU7Ci0JCQl0b3RzaXplICs9IGJzaXplOwotCQl9Ci0JCWxhc3RfZXh0ZW5kZWRfYXJnX2NvdW50ID0gZXh0ZW5kZWRfYXJnX2NvdW50OwotCQlleHRlbmRlZF9hcmdfY291bnQgPSAwOwotCQlmb3IgKGIgPSBjLT51LT51X2Jsb2NrczsgYiAhPSBOVUxMOyBiID0gYi0+Yl9saXN0KSB7Ci0JCQlic2l6ZSA9IGItPmJfb2Zmc2V0OwotCQkJZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykgewotCQkJCXN0cnVjdCBpbnN0ciAqaW5zdHIgPSAmYi0+Yl9pbnN0cltpXTsKLQkJCQkvKiBSZWxhdGl2ZSBqdW1wcyBhcmUgY29tcHV0ZWQgcmVsYXRpdmUgdG8KLQkJCQkgICB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBhZnRlciBmZXRjaGluZwotCQkJCSAgIHRoZSBqdW1wIGluc3RydWN0aW9uLgotCQkJCSovCi0JCQkJYnNpemUgKz0gaW5zdHJzaXplKGluc3RyKTsKLQkJCQlpZiAoaW5zdHItPmlfamFicykKLQkJCQkJaW5zdHItPmlfb3BhcmcgPSBpbnN0ci0+aV90YXJnZXQtPmJfb2Zmc2V0OwotCQkJCWVsc2UgaWYgKGluc3RyLT5pX2pyZWwpIHsKLQkJCQkJaW50IGRlbHRhID0gaW5zdHItPmlfdGFyZ2V0LT5iX29mZnNldCAtIGJzaXplOwotCQkJCQlpbnN0ci0+aV9vcGFyZyA9IGRlbHRhOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChpbnN0ci0+aV9vcGFyZyA+IDB4ZmZmZikKLQkJCQkJZXh0ZW5kZWRfYXJnX2NvdW50Kys7Ci0JCQl9Ci0JCX0KKyAgICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIGVhY2ggYmxvY2sgYW5kIGZpeHVwIGp1bXAgYXJncy4KKyAgICAgICBSZXBsYWNlIGJsb2NrIHBvaW50ZXIgd2l0aCBwb3NpdGlvbiBpbiBieXRlY29kZS4gKi8KKyAgICBkbyB7CisgICAgICAgIHRvdHNpemUgPSAwOworICAgICAgICBmb3IgKGkgPSBhLT5hX25ibG9ja3MgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYiA9IGEtPmFfcG9zdG9yZGVyW2ldOworICAgICAgICAgICAgYnNpemUgPSBibG9ja3NpemUoYik7CisgICAgICAgICAgICBiLT5iX29mZnNldCA9IHRvdHNpemU7CisgICAgICAgICAgICB0b3RzaXplICs9IGJzaXplOworICAgICAgICB9CisgICAgICAgIGxhc3RfZXh0ZW5kZWRfYXJnX2NvdW50ID0gZXh0ZW5kZWRfYXJnX2NvdW50OworICAgICAgICBleHRlbmRlZF9hcmdfY291bnQgPSAwOworICAgICAgICBmb3IgKGIgPSBjLT51LT51X2Jsb2NrczsgYiAhPSBOVUxMOyBiID0gYi0+Yl9saXN0KSB7CisgICAgICAgICAgICBic2l6ZSA9IGItPmJfb2Zmc2V0OworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykgeworICAgICAgICAgICAgICAgIHN0cnVjdCBpbnN0ciAqaW5zdHIgPSAmYi0+Yl9pbnN0cltpXTsKKyAgICAgICAgICAgICAgICAvKiBSZWxhdGl2ZSBqdW1wcyBhcmUgY29tcHV0ZWQgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAgICAgICB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBhZnRlciBmZXRjaGluZworICAgICAgICAgICAgICAgICAgIHRoZSBqdW1wIGluc3RydWN0aW9uLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYnNpemUgKz0gaW5zdHJzaXplKGluc3RyKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdHItPmlfamFicykKKyAgICAgICAgICAgICAgICAgICAgaW5zdHItPmlfb3BhcmcgPSBpbnN0ci0+aV90YXJnZXQtPmJfb2Zmc2V0OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluc3RyLT5pX2pyZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gaW5zdHItPmlfdGFyZ2V0LT5iX29mZnNldCAtIGJzaXplOworICAgICAgICAgICAgICAgICAgICBpbnN0ci0+aV9vcGFyZyA9IGRlbHRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChpbnN0ci0+aV9vcGFyZyA+IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfYXJnX2NvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCS8qIFhYWDogVGhpcyBpcyBhbiBhd2Z1bCBoYWNrIHRoYXQgY291bGQgaHVydCBwZXJmb3JtYW5jZSwgYnV0Ci0JCW9uIHRoZSBicmlnaHQgc2lkZSBpdCBzaG91bGQgd29yayB1bnRpbCB3ZSBjb21lIHVwCi0JCXdpdGggYSBiZXR0ZXIgc29sdXRpb24uCisgICAgLyogWFhYOiBUaGlzIGlzIGFuIGF3ZnVsIGhhY2sgdGhhdCBjb3VsZCBodXJ0IHBlcmZvcm1hbmNlLCBidXQKKyAgICAgICAgb24gdGhlIGJyaWdodCBzaWRlIGl0IHNob3VsZCB3b3JrIHVudGlsIHdlIGNvbWUgdXAKKyAgICAgICAgd2l0aCBhIGJldHRlciBzb2x1dGlvbi4KIAotCQlUaGUgaXNzdWUgaXMgdGhhdCBpbiB0aGUgZmlyc3QgbG9vcCBibG9ja3NpemUoKSBpcyBjYWxsZWQKLQkJd2hpY2ggY2FsbHMgaW5zdHJzaXplKCkgd2hpY2ggcmVxdWlyZXMgaV9vcGFyZyBiZSBzZXQKLQkJYXBwcm9wcmlhdGVseS4JVGhlcmUgaXMgYSBib290c3RyYXAgcHJvYmxlbSBiZWNhdXNlCi0JCWlfb3BhcmcgaXMgY2FsY3VsYXRlZCBpbiB0aGUgc2Vjb25kIGxvb3AgYWJvdmUuCisgICAgICAgIFRoZSBpc3N1ZSBpcyB0aGF0IGluIHRoZSBmaXJzdCBsb29wIGJsb2Nrc2l6ZSgpIGlzIGNhbGxlZAorICAgICAgICB3aGljaCBjYWxscyBpbnN0cnNpemUoKSB3aGljaCByZXF1aXJlcyBpX29wYXJnIGJlIHNldAorICAgICAgICBhcHByb3ByaWF0ZWx5LiAgICAgICAgICBUaGVyZSBpcyBhIGJvb3RzdHJhcCBwcm9ibGVtIGJlY2F1c2UKKyAgICAgICAgaV9vcGFyZyBpcyBjYWxjdWxhdGVkIGluIHRoZSBzZWNvbmQgbG9vcCBhYm92ZS4KIAotCQlTbyB3ZSBsb29wIHVudGlsIHdlIHN0b3Agc2VlaW5nIG5ldyBFWFRFTkRFRF9BUkdzLgotCQlUaGUgb25seSBFWFRFTkRFRF9BUkdzIHRoYXQgY291bGQgYmUgcG9wcGluZyB1cCBhcmUKLQkJb25lcyBpbiBqdW1wIGluc3RydWN0aW9ucy4gIFNvIHRoaXMgc2hvdWxkIGNvbnZlcmdlCi0JCWZhaXJseSBxdWlja2x5LgotCSovCi0JfSB3aGlsZSAobGFzdF9leHRlbmRlZF9hcmdfY291bnQgIT0gZXh0ZW5kZWRfYXJnX2NvdW50KTsKKyAgICAgICAgU28gd2UgbG9vcCB1bnRpbCB3ZSBzdG9wIHNlZWluZyBuZXcgRVhURU5ERURfQVJHcy4KKyAgICAgICAgVGhlIG9ubHkgRVhURU5ERURfQVJHcyB0aGF0IGNvdWxkIGJlIHBvcHBpbmcgdXAgYXJlCisgICAgICAgIG9uZXMgaW4ganVtcCBpbnN0cnVjdGlvbnMuICBTbyB0aGlzIHNob3VsZCBjb252ZXJnZQorICAgICAgICBmYWlybHkgcXVpY2tseS4KKyAgICAqLworICAgIH0gd2hpbGUgKGxhc3RfZXh0ZW5kZWRfYXJnX2NvdW50ICE9IGV4dGVuZGVkX2FyZ19jb3VudCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2tleXNfaW5vcmRlcihQeU9iamVjdCAqZGljdCwgaW50IG9mZnNldCkKIHsKLQlQeU9iamVjdCAqdHVwbGUsICprLCAqdjsKLQlQeV9zc2l6ZV90IGksIHBvcyA9IDAsIHNpemUgPSBQeURpY3RfU2l6ZShkaWN0KTsKKyAgICBQeU9iamVjdCAqdHVwbGUsICprLCAqdjsKKyAgICBQeV9zc2l6ZV90IGksIHBvcyA9IDAsIHNpemUgPSBQeURpY3RfU2l6ZShkaWN0KTsKIAotCXR1cGxlID0gUHlUdXBsZV9OZXcoc2l6ZSk7Ci0JaWYgKHR1cGxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlIChQeURpY3RfTmV4dChkaWN0LCAmcG9zLCAmaywgJnYpKSB7Ci0JCWkgPSBQeUludF9BU19MT05HKHYpOwotCQkvKiBUaGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeSBhcmUgdHVwbGVzLiAoc2VlIGNvbXBpbGVyX2FkZF9vKQotCQkgICBUaGUgb2JqZWN0IHdlIHdhbnQgaXMgYWx3YXlzIGZpcnN0LCB0aG91Z2guICovCi0JCWsgPSBQeVR1cGxlX0dFVF9JVEVNKGssIDApOwotCQlQeV9JTkNSRUYoayk7Ci0JCWFzc2VydCgoaSAtIG9mZnNldCkgPCBzaXplKTsKLQkJYXNzZXJ0KChpIC0gb2Zmc2V0KSA+PSAwKTsKLQkJUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgaSAtIG9mZnNldCwgayk7Ci0JfQotCXJldHVybiB0dXBsZTsKKyAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KHNpemUpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aGlsZSAoUHlEaWN0X05leHQoZGljdCwgJnBvcywgJmssICZ2KSkgeworICAgICAgICBpID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgLyogVGhlIGtleXMgb2YgdGhlIGRpY3Rpb25hcnkgYXJlIHR1cGxlcy4gKHNlZSBjb21waWxlcl9hZGRfbykKKyAgICAgICAgICAgVGhlIG9iamVjdCB3ZSB3YW50IGlzIGFsd2F5cyBmaXJzdCwgdGhvdWdoLiAqLworICAgICAgICBrID0gUHlUdXBsZV9HRVRfSVRFTShrLCAwKTsKKyAgICAgICAgUHlfSU5DUkVGKGspOworICAgICAgICBhc3NlcnQoKGkgLSBvZmZzZXQpIDwgc2l6ZSk7CisgICAgICAgIGFzc2VydCgoaSAtIG9mZnNldCkgPj0gMCk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIGkgLSBvZmZzZXQsIGspOworICAgIH0KKyAgICByZXR1cm4gdHVwbGU7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXB1dGVfY29kZV9mbGFncyhzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7Ci0JUHlTVEVudHJ5T2JqZWN0ICpzdGUgPSBjLT51LT51X3N0ZTsKLQlpbnQgZmxhZ3MgPSAwLCBuOwotCWlmIChzdGUtPnN0ZV90eXBlICE9IE1vZHVsZUJsb2NrKQotCQlmbGFncyB8PSBDT19ORVdMT0NBTFM7Ci0JaWYgKHN0ZS0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jaykgewotCQlpZiAoIXN0ZS0+c3RlX3Vub3B0aW1pemVkKQotCQkJZmxhZ3MgfD0gQ09fT1BUSU1JWkVEOwotCQlpZiAoc3RlLT5zdGVfbmVzdGVkKQotCQkJZmxhZ3MgfD0gQ09fTkVTVEVEOwotCQlpZiAoc3RlLT5zdGVfZ2VuZXJhdG9yKQotCQkJZmxhZ3MgfD0gQ09fR0VORVJBVE9SOwotCQlpZiAoc3RlLT5zdGVfdmFyYXJncykKLQkJCWZsYWdzIHw9IENPX1ZBUkFSR1M7Ci0JCWlmIChzdGUtPnN0ZV92YXJrZXl3b3JkcykKLQkJCWZsYWdzIHw9IENPX1ZBUktFWVdPUkRTOwotCX0KKyAgICBQeVNURW50cnlPYmplY3QgKnN0ZSA9IGMtPnUtPnVfc3RlOworICAgIGludCBmbGFncyA9IDAsIG47CisgICAgaWYgKHN0ZS0+c3RlX3R5cGUgIT0gTW9kdWxlQmxvY2spCisgICAgICAgIGZsYWdzIHw9IENPX05FV0xPQ0FMUzsKKyAgICBpZiAoc3RlLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrKSB7CisgICAgICAgIGlmICghc3RlLT5zdGVfdW5vcHRpbWl6ZWQpCisgICAgICAgICAgICBmbGFncyB8PSBDT19PUFRJTUlaRUQ7CisgICAgICAgIGlmIChzdGUtPnN0ZV9uZXN0ZWQpCisgICAgICAgICAgICBmbGFncyB8PSBDT19ORVNURUQ7CisgICAgICAgIGlmIChzdGUtPnN0ZV9nZW5lcmF0b3IpCisgICAgICAgICAgICBmbGFncyB8PSBDT19HRU5FUkFUT1I7CisgICAgICAgIGlmIChzdGUtPnN0ZV92YXJhcmdzKQorICAgICAgICAgICAgZmxhZ3MgfD0gQ09fVkFSQVJHUzsKKyAgICAgICAgaWYgKHN0ZS0+c3RlX3ZhcmtleXdvcmRzKQorICAgICAgICAgICAgZmxhZ3MgfD0gQ09fVkFSS0VZV09SRFM7CisgICAgfQogCi0JLyogKE9ubHkpIGluaGVyaXQgY29tcGlsZXJmbGFncyBpbiBQeUNGX01BU0sgKi8KLQlmbGFncyB8PSAoYy0+Y19mbGFncy0+Y2ZfZmxhZ3MgJiBQeUNGX01BU0spOworICAgIC8qIChPbmx5KSBpbmhlcml0IGNvbXBpbGVyZmxhZ3MgaW4gUHlDRl9NQVNLICovCisgICAgZmxhZ3MgfD0gKGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgUHlDRl9NQVNLKTsKIAotCW4gPSBQeURpY3RfU2l6ZShjLT51LT51X2ZyZWV2YXJzKTsKLQlpZiAobiA8IDApCi0JICAgIHJldHVybiAtMTsKLQlpZiAobiA9PSAwKSB7Ci0JICAgIG4gPSBQeURpY3RfU2l6ZShjLT51LT51X2NlbGx2YXJzKTsKLQkgICAgaWYgKG4gPCAwKQotCQlyZXR1cm4gLTE7Ci0JICAgIGlmIChuID09IDApIHsKLQkJZmxhZ3MgfD0gQ09fTk9GUkVFOwotCSAgICB9Ci0JfQorICAgIG4gPSBQeURpY3RfU2l6ZShjLT51LT51X2ZyZWV2YXJzKTsKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIG4gPSBQeURpY3RfU2l6ZShjLT51LT51X2NlbGx2YXJzKTsKKyAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgZmxhZ3MgfD0gQ09fTk9GUkVFOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIGZsYWdzOworICAgIHJldHVybiBmbGFnczsKIH0KIAogc3RhdGljIFB5Q29kZU9iamVjdCAqCiBtYWtlY29kZShzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0cnVjdCBhc3NlbWJsZXIgKmEpCiB7Ci0JUHlPYmplY3QgKnRtcDsKLQlQeUNvZGVPYmplY3QgKmNvID0gTlVMTDsKLQlQeU9iamVjdCAqY29uc3RzID0gTlVMTDsKLQlQeU9iamVjdCAqbmFtZXMgPSBOVUxMOwotCVB5T2JqZWN0ICp2YXJuYW1lcyA9IE5VTEw7Ci0JUHlPYmplY3QgKmZpbGVuYW1lID0gTlVMTDsKLQlQeU9iamVjdCAqbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmZyZWV2YXJzID0gTlVMTDsKLQlQeU9iamVjdCAqY2VsbHZhcnMgPSBOVUxMOwotCVB5T2JqZWN0ICpieXRlY29kZSA9IE5VTEw7Ci0JaW50IG5sb2NhbHMsIGZsYWdzOworICAgIFB5T2JqZWN0ICp0bXA7CisgICAgUHlDb2RlT2JqZWN0ICpjbyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNvbnN0cyA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5hbWVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdmFybmFtZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmaWxlbmFtZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5hbWUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmcmVldmFycyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNlbGx2YXJzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYnl0ZWNvZGUgPSBOVUxMOworICAgIGludCBubG9jYWxzLCBmbGFnczsKIAotCXRtcCA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfY29uc3RzLCAwKTsKLQlpZiAoIXRtcCkKLQkJZ290byBlcnJvcjsKLQljb25zdHMgPSBQeVNlcXVlbmNlX0xpc3QodG1wKTsgLyogb3B0aW1pemVfY29kZSByZXF1aXJlcyBhIGxpc3QgKi8KLQlQeV9ERUNSRUYodG1wKTsKKyAgICB0bXAgPSBkaWN0X2tleXNfaW5vcmRlcihjLT51LT51X2NvbnN0cywgMCk7CisgICAgaWYgKCF0bXApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgY29uc3RzID0gUHlTZXF1ZW5jZV9MaXN0KHRtcCk7IC8qIG9wdGltaXplX2NvZGUgcmVxdWlyZXMgYSBsaXN0ICovCisgICAgUHlfREVDUkVGKHRtcCk7CiAKLQluYW1lcyA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfbmFtZXMsIDApOwotCXZhcm5hbWVzID0gZGljdF9rZXlzX2lub3JkZXIoYy0+dS0+dV92YXJuYW1lcywgMCk7Ci0JaWYgKCFjb25zdHMgfHwgIW5hbWVzIHx8ICF2YXJuYW1lcykKLQkJZ290byBlcnJvcjsKLSAgICAgIAotCWNlbGx2YXJzID0gZGljdF9rZXlzX2lub3JkZXIoYy0+dS0+dV9jZWxsdmFycywgMCk7Ci0JaWYgKCFjZWxsdmFycykKLQkgICAgZ290byBlcnJvcjsKLQlmcmVldmFycyA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfZnJlZXZhcnMsIFB5VHVwbGVfU2l6ZShjZWxsdmFycykpOwotCWlmICghZnJlZXZhcnMpCi0JICAgIGdvdG8gZXJyb3I7Ci0JZmlsZW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGMtPmNfZmlsZW5hbWUpOwotCWlmICghZmlsZW5hbWUpCi0JCWdvdG8gZXJyb3I7CisgICAgbmFtZXMgPSBkaWN0X2tleXNfaW5vcmRlcihjLT51LT51X25hbWVzLCAwKTsKKyAgICB2YXJuYW1lcyA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfdmFybmFtZXMsIDApOworICAgIGlmICghY29uc3RzIHx8ICFuYW1lcyB8fCAhdmFybmFtZXMpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlubG9jYWxzID0gUHlEaWN0X1NpemUoYy0+dS0+dV92YXJuYW1lcyk7Ci0JZmxhZ3MgPSBjb21wdXRlX2NvZGVfZmxhZ3MoYyk7Ci0JaWYgKGZsYWdzIDwgMCkKLQkJZ290byBlcnJvcjsKKyAgICBjZWxsdmFycyA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfY2VsbHZhcnMsIDApOworICAgIGlmICghY2VsbHZhcnMpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZnJlZXZhcnMgPSBkaWN0X2tleXNfaW5vcmRlcihjLT51LT51X2ZyZWV2YXJzLCBQeVR1cGxlX1NpemUoY2VsbHZhcnMpKTsKKyAgICBpZiAoIWZyZWV2YXJzKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGZpbGVuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjLT5jX2ZpbGVuYW1lKTsKKyAgICBpZiAoIWZpbGVuYW1lKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JYnl0ZWNvZGUgPSBQeUNvZGVfT3B0aW1pemUoYS0+YV9ieXRlY29kZSwgY29uc3RzLCBuYW1lcywgYS0+YV9sbm90YWIpOwotCWlmICghYnl0ZWNvZGUpCi0JCWdvdG8gZXJyb3I7CisgICAgbmxvY2FscyA9IFB5RGljdF9TaXplKGMtPnUtPnVfdmFybmFtZXMpOworICAgIGZsYWdzID0gY29tcHV0ZV9jb2RlX2ZsYWdzKGMpOworICAgIGlmIChmbGFncyA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQl0bXAgPSBQeUxpc3RfQXNUdXBsZShjb25zdHMpOyAvKiBQeUNvZGVfTmV3IHJlcXVpcmVzIGEgdHVwbGUgKi8KLQlpZiAoIXRtcCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoY29uc3RzKTsKLQljb25zdHMgPSB0bXA7CisgICAgYnl0ZWNvZGUgPSBQeUNvZGVfT3B0aW1pemUoYS0+YV9ieXRlY29kZSwgY29uc3RzLCBuYW1lcywgYS0+YV9sbm90YWIpOworICAgIGlmICghYnl0ZWNvZGUpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQljbyA9IFB5Q29kZV9OZXcoYy0+dS0+dV9hcmdjb3VudCwgbmxvY2Fscywgc3RhY2tkZXB0aChjKSwgZmxhZ3MsCi0JCQlieXRlY29kZSwgY29uc3RzLCBuYW1lcywgdmFybmFtZXMsCi0JCQlmcmVldmFycywgY2VsbHZhcnMsCi0JCQlmaWxlbmFtZSwgYy0+dS0+dV9uYW1lLAotCQkJYy0+dS0+dV9maXJzdGxpbmVubywKLQkJCWEtPmFfbG5vdGFiKTsKKyAgICB0bXAgPSBQeUxpc3RfQXNUdXBsZShjb25zdHMpOyAvKiBQeUNvZGVfTmV3IHJlcXVpcmVzIGEgdHVwbGUgKi8KKyAgICBpZiAoIXRtcCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoY29uc3RzKTsKKyAgICBjb25zdHMgPSB0bXA7CisKKyAgICBjbyA9IFB5Q29kZV9OZXcoYy0+dS0+dV9hcmdjb3VudCwgbmxvY2Fscywgc3RhY2tkZXB0aChjKSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGJ5dGVjb2RlLCBjb25zdHMsIG5hbWVzLCB2YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgZnJlZXZhcnMsIGNlbGx2YXJzLAorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgYy0+dS0+dV9uYW1lLAorICAgICAgICAgICAgICAgICAgICBjLT51LT51X2ZpcnN0bGluZW5vLAorICAgICAgICAgICAgICAgICAgICBhLT5hX2xub3RhYik7CiAgZXJyb3I6Ci0JUHlfWERFQ1JFRihjb25zdHMpOwotCVB5X1hERUNSRUYobmFtZXMpOwotCVB5X1hERUNSRUYodmFybmFtZXMpOwotCVB5X1hERUNSRUYoZmlsZW5hbWUpOwotCVB5X1hERUNSRUYobmFtZSk7Ci0JUHlfWERFQ1JFRihmcmVldmFycyk7Ci0JUHlfWERFQ1JFRihjZWxsdmFycyk7Ci0JUHlfWERFQ1JFRihieXRlY29kZSk7Ci0JcmV0dXJuIGNvOworICAgIFB5X1hERUNSRUYoY29uc3RzKTsKKyAgICBQeV9YREVDUkVGKG5hbWVzKTsKKyAgICBQeV9YREVDUkVGKHZhcm5hbWVzKTsKKyAgICBQeV9YREVDUkVGKGZpbGVuYW1lKTsKKyAgICBQeV9YREVDUkVGKG5hbWUpOworICAgIFB5X1hERUNSRUYoZnJlZXZhcnMpOworICAgIFB5X1hERUNSRUYoY2VsbHZhcnMpOworICAgIFB5X1hERUNSRUYoYnl0ZWNvZGUpOworICAgIHJldHVybiBjbzsKIH0KIAogCkBAIC0zODkwLDkwICszODkwLDkwIEBACiBzdGF0aWMgdm9pZAogZHVtcF9pbnN0cihjb25zdCBzdHJ1Y3QgaW5zdHIgKmkpCiB7Ci0JY29uc3QgY2hhciAqanJlbCA9IGktPmlfanJlbCA/ICJqcmVsICIgOiAiIjsKLQljb25zdCBjaGFyICpqYWJzID0gaS0+aV9qYWJzID8gImphYnMgIiA6ICIiOwotCWNoYXIgYXJnWzEyOF07CisgICAgY29uc3QgY2hhciAqanJlbCA9IGktPmlfanJlbCA/ICJqcmVsICIgOiAiIjsKKyAgICBjb25zdCBjaGFyICpqYWJzID0gaS0+aV9qYWJzID8gImphYnMgIiA6ICIiOworICAgIGNoYXIgYXJnWzEyOF07CiAKLQkqYXJnID0gJ1wwJzsKLQlpZiAoaS0+aV9oYXNhcmcpCi0JCXNwcmludGYoYXJnLCAiYXJnOiAlZCAiLCBpLT5pX29wYXJnKTsKKyAgICAqYXJnID0gJ1wwJzsKKyAgICBpZiAoaS0+aV9oYXNhcmcpCisgICAgICAgIHNwcmludGYoYXJnLCAiYXJnOiAlZCAiLCBpLT5pX29wYXJnKTsKIAotCWZwcmludGYoc3RkZXJyLCAibGluZTogJWQsIG9wY29kZTogJWQgJXMlcyVzXG4iLCAKLQkJCWktPmlfbGluZW5vLCBpLT5pX29wY29kZSwgYXJnLCBqYWJzLCBqcmVsKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImxpbmU6ICVkLCBvcGNvZGU6ICVkICVzJXMlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaS0+aV9saW5lbm8sIGktPmlfb3Bjb2RlLCBhcmcsIGphYnMsIGpyZWwpOwogfQogCiBzdGF0aWMgdm9pZAogZHVtcF9iYXNpY2Jsb2NrKGNvbnN0IGJhc2ljYmxvY2sgKmIpCiB7Ci0JY29uc3QgY2hhciAqc2VlbiA9IGItPmJfc2VlbiA/ICJzZWVuICIgOiAiIjsKLQljb25zdCBjaGFyICpiX3JldHVybiA9IGItPmJfcmV0dXJuID8gInJldHVybiAiIDogIiI7Ci0JZnByaW50ZihzdGRlcnIsICJ1c2VkOiAlZCwgZGVwdGg6ICVkLCBvZmZzZXQ6ICVkICVzJXNcbiIsCi0JCWItPmJfaXVzZWQsIGItPmJfc3RhcnRkZXB0aCwgYi0+Yl9vZmZzZXQsIHNlZW4sIGJfcmV0dXJuKTsKLQlpZiAoYi0+Yl9pbnN0cikgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykgewotCQkJZnByaW50ZihzdGRlcnIsICIgIFslMDJkXSAiLCBpKTsKLQkJCWR1bXBfaW5zdHIoYi0+Yl9pbnN0ciArIGkpOwotCQl9Ci0JfQorICAgIGNvbnN0IGNoYXIgKnNlZW4gPSBiLT5iX3NlZW4gPyAic2VlbiAiIDogIiI7CisgICAgY29uc3QgY2hhciAqYl9yZXR1cm4gPSBiLT5iX3JldHVybiA/ICJyZXR1cm4gIiA6ICIiOworICAgIGZwcmludGYoc3RkZXJyLCAidXNlZDogJWQsIGRlcHRoOiAlZCwgb2Zmc2V0OiAlZCAlcyVzXG4iLAorICAgICAgICBiLT5iX2l1c2VkLCBiLT5iX3N0YXJ0ZGVwdGgsIGItPmJfb2Zmc2V0LCBzZWVuLCBiX3JldHVybik7CisgICAgaWYgKGItPmJfaW5zdHIpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBbJTAyZF0gIiwgaSk7CisgICAgICAgICAgICBkdW1wX2luc3RyKGItPmJfaW5zdHIgKyBpKTsKKyAgICAgICAgfQorICAgIH0KIH0KICNlbmRpZgogCiBzdGF0aWMgUHlDb2RlT2JqZWN0ICoKIGFzc2VtYmxlKHN0cnVjdCBjb21waWxlciAqYywgaW50IGFkZE5vbmUpCiB7Ci0JYmFzaWNibG9jayAqYiwgKmVudHJ5YmxvY2s7Ci0Jc3RydWN0IGFzc2VtYmxlciBhOwotCWludCBpLCBqLCBuYmxvY2tzOwotCVB5Q29kZU9iamVjdCAqY28gPSBOVUxMOworICAgIGJhc2ljYmxvY2sgKmIsICplbnRyeWJsb2NrOworICAgIHN0cnVjdCBhc3NlbWJsZXIgYTsKKyAgICBpbnQgaSwgaiwgbmJsb2NrczsKKyAgICBQeUNvZGVPYmplY3QgKmNvID0gTlVMTDsKIAotCS8qIE1ha2Ugc3VyZSBldmVyeSBibG9jayB0aGF0IGZhbGxzIG9mZiB0aGUgZW5kIHJldHVybnMgTm9uZS4KLQkgICBYWFggTkVYVF9CTE9DSygpIGlzbid0IHF1aXRlIHJpZ2h0LCBiZWNhdXNlIGlmIHRoZSBsYXN0Ci0JICAgYmxvY2sgZW5kcyB3aXRoIGEganVtcCBvciByZXR1cm4gYl9uZXh0IHNob3VsZG4ndCBzZXQuCi0JICovCi0JaWYgKCFjLT51LT51X2N1cmJsb2NrLT5iX3JldHVybikgewotCQlORVhUX0JMT0NLKGMpOwotCQlpZiAoYWRkTm9uZSkKLQkJCUFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKLQkJQURET1AoYywgUkVUVVJOX1ZBTFVFKTsKLQl9CisgICAgLyogTWFrZSBzdXJlIGV2ZXJ5IGJsb2NrIHRoYXQgZmFsbHMgb2ZmIHRoZSBlbmQgcmV0dXJucyBOb25lLgorICAgICAgIFhYWCBORVhUX0JMT0NLKCkgaXNuJ3QgcXVpdGUgcmlnaHQsIGJlY2F1c2UgaWYgdGhlIGxhc3QKKyAgICAgICBibG9jayBlbmRzIHdpdGggYSBqdW1wIG9yIHJldHVybiBiX25leHQgc2hvdWxkbid0IHNldC4KKyAgICAgKi8KKyAgICBpZiAoIWMtPnUtPnVfY3VyYmxvY2stPmJfcmV0dXJuKSB7CisgICAgICAgIE5FWFRfQkxPQ0soYyk7CisgICAgICAgIGlmIChhZGROb25lKQorICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOworICAgICAgICBBRERPUChjLCBSRVRVUk5fVkFMVUUpOworICAgIH0KIAotCW5ibG9ja3MgPSAwOwotCWVudHJ5YmxvY2sgPSBOVUxMOwotCWZvciAoYiA9IGMtPnUtPnVfYmxvY2tzOyBiICE9IE5VTEw7IGIgPSBiLT5iX2xpc3QpIHsKLQkJbmJsb2NrcysrOwotCQllbnRyeWJsb2NrID0gYjsgCi0JfQorICAgIG5ibG9ja3MgPSAwOworICAgIGVudHJ5YmxvY2sgPSBOVUxMOworICAgIGZvciAoYiA9IGMtPnUtPnVfYmxvY2tzOyBiICE9IE5VTEw7IGIgPSBiLT5iX2xpc3QpIHsKKyAgICAgICAgbmJsb2NrcysrOworICAgICAgICBlbnRyeWJsb2NrID0gYjsKKyAgICB9CiAKLQkvKiBTZXQgZmlyc3RsaW5lbm8gaWYgaXQgd2Fzbid0IGV4cGxpY2l0bHkgc2V0LiAqLwotCWlmICghYy0+dS0+dV9maXJzdGxpbmVubykgewotCQlpZiAoZW50cnlibG9jayAmJiBlbnRyeWJsb2NrLT5iX2luc3RyKQotCQkJYy0+dS0+dV9maXJzdGxpbmVubyA9IGVudHJ5YmxvY2stPmJfaW5zdHItPmlfbGluZW5vOwotCQllbHNlCi0JCQljLT51LT51X2ZpcnN0bGluZW5vID0gMTsKLQl9Ci0JaWYgKCFhc3NlbWJsZV9pbml0KCZhLCBuYmxvY2tzLCBjLT51LT51X2ZpcnN0bGluZW5vKSkKLQkJZ290byBlcnJvcjsKLQlkZnMoYywgZW50cnlibG9jaywgJmEpOworICAgIC8qIFNldCBmaXJzdGxpbmVubyBpZiBpdCB3YXNuJ3QgZXhwbGljaXRseSBzZXQuICovCisgICAgaWYgKCFjLT51LT51X2ZpcnN0bGluZW5vKSB7CisgICAgICAgIGlmIChlbnRyeWJsb2NrICYmIGVudHJ5YmxvY2stPmJfaW5zdHIpCisgICAgICAgICAgICBjLT51LT51X2ZpcnN0bGluZW5vID0gZW50cnlibG9jay0+Yl9pbnN0ci0+aV9saW5lbm87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGMtPnUtPnVfZmlyc3RsaW5lbm8gPSAxOworICAgIH0KKyAgICBpZiAoIWFzc2VtYmxlX2luaXQoJmEsIG5ibG9ja3MsIGMtPnUtPnVfZmlyc3RsaW5lbm8pKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGRmcyhjLCBlbnRyeWJsb2NrLCAmYSk7CiAKLQkvKiBDYW4ndCBtb2RpZnkgdGhlIGJ5dGVjb2RlIGFmdGVyIGNvbXB1dGluZyBqdW1wIG9mZnNldHMuICovCi0JYXNzZW1ibGVfanVtcF9vZmZzZXRzKCZhLCBjKTsKKyAgICAvKiBDYW4ndCBtb2RpZnkgdGhlIGJ5dGVjb2RlIGFmdGVyIGNvbXB1dGluZyBqdW1wIG9mZnNldHMuICovCisgICAgYXNzZW1ibGVfanVtcF9vZmZzZXRzKCZhLCBjKTsKIAotCS8qIEVtaXQgY29kZSBpbiByZXZlcnNlIHBvc3RvcmRlciBmcm9tIGRmcy4gKi8KLQlmb3IgKGkgPSBhLmFfbmJsb2NrcyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCWIgPSBhLmFfcG9zdG9yZGVyW2ldOwotCQlmb3IgKGogPSAwOyBqIDwgYi0+Yl9pdXNlZDsgaisrKQotCQkJaWYgKCFhc3NlbWJsZV9lbWl0KCZhLCAmYi0+Yl9pbnN0cltqXSkpCi0JCQkJZ290byBlcnJvcjsKLQl9CisgICAgLyogRW1pdCBjb2RlIGluIHJldmVyc2UgcG9zdG9yZGVyIGZyb20gZGZzLiAqLworICAgIGZvciAoaSA9IGEuYV9uYmxvY2tzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgYiA9IGEuYV9wb3N0b3JkZXJbaV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBiLT5iX2l1c2VkOyBqKyspCisgICAgICAgICAgICBpZiAoIWFzc2VtYmxlX2VtaXQoJmEsICZiLT5iX2luc3RyW2pdKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZhLmFfbG5vdGFiLCBhLmFfbG5vdGFiX29mZikgPCAwKQotCQlnb3RvIGVycm9yOwotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZhLmFfYnl0ZWNvZGUsIGEuYV9vZmZzZXQpIDwgMCkKLQkJZ290byBlcnJvcjsKKyAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS5hX2xub3RhYiwgYS5hX2xub3RhYl9vZmYpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS5hX2J5dGVjb2RlLCBhLmFfb2Zmc2V0KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQljbyA9IG1ha2Vjb2RlKGMsICZhKTsKKyAgICBjbyA9IG1ha2Vjb2RlKGMsICZhKTsKICBlcnJvcjoKLQlhc3NlbWJsZV9mcmVlKCZhKTsKLQlyZXR1cm4gY287CisgICAgYXNzZW1ibGVfZnJlZSgmYSk7CisgICAgcmV0dXJuIGNvOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2R5bmxvYWRfYWl4LmMgYi9QeXRob24vZHlubG9hZF9haXguYwppbmRleCA3YTYwNGYyLi44ZDU2ZDdkIDEwMDY0NAotLS0gYS9QeXRob24vZHlubG9hZF9haXguYworKysgYi9QeXRob24vZHlubG9hZF9haXguYwpAQCAtNCwxMCArNCwxMCBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgImltcG9ydGRsLmgiCiAKLSNpbmNsdWRlIDxjdHlwZS5oPgkvKiAgZm9yIGlzZGlnaXQoKQkgICovCi0jaW5jbHVkZSA8ZXJybm8uaD4JLyogIGZvciBnbG9iYWwgZXJybm8gICAgICAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgkvKiAgZm9yIHN0cmVycm9yKCkgICAgICAgICovCi0jaW5jbHVkZSA8c3RkbGliLmg+CS8qICBmb3IgbWFsbG9jKCksIGZyZWUoKSAgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPiAgICAgIC8qICBmb3IgaXNkaWdpdCgpICAgICAgICAgKi8KKyNpbmNsdWRlIDxlcnJuby5oPiAgICAgIC8qICBmb3IgZ2xvYmFsIGVycm5vICAgICAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgIC8qICBmb3Igc3RyZXJyb3IoKSAgICAgICAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgIC8qICBmb3IgbWFsbG9jKCksIGZyZWUoKSAgKi8KICNpbmNsdWRlIDxzeXMvbGRyLmg+CiAKIApAQCAtMjIsODUgKzIyLDg1IEBACiBleHRlcm4gY2hhciAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7CiAKIHR5cGVkZWYgc3RydWN0IE1vZHVsZSB7Ci0Jc3RydWN0IE1vZHVsZSAqbmV4dDsKLQl2b2lkICAgICAgICAgICplbnRyeTsKKyAgICBzdHJ1Y3QgTW9kdWxlICpuZXh0OworICAgIHZvaWQgICAgICAgICAgKmVudHJ5OwogfSBNb2R1bGUsICpNb2R1bGVQdHI7CiAKIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiW10gPSB7Ci0JeyIuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JeyJtb2R1bGUuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JezAsIDB9CisgICAgeyIuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyJtb2R1bGUuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgezAsIDB9CiB9OwogCiBzdGF0aWMgaW50CiBhaXhfZ2V0b2xkbW9kdWxlcyh2b2lkICoqbW9kbGlzdHB0cikKIHsKLQlyZWdpc3RlciBNb2R1bGVQdHIgICAgICAgbW9kcHRyLCBwcmV2bW9kcHRyOwotCXJlZ2lzdGVyIHN0cnVjdCBsZF9pbmZvICAqbGRpcHRyOwotCXJlZ2lzdGVyIGNoYXIgICAgICAgICAgICAqbGRpYnVmOwotCXJlZ2lzdGVyIGludCAgICAgICAgICAgICBlcnJmbGFnLCBidWZzaXplID0gMTAyNDsKLQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgICAgb2Zmc2V0OwotCWNoYXIgKnByb2duYW1lID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKLQkKLQkvKgotCS0tIEdldCB0aGUgbGlzdCBvZiBsb2FkZWQgbW9kdWxlcyBpbnRvIGxkX2luZm8gc3RydWN0dXJlcy4KLQkqLwotCWlmICgobGRpYnVmID0gbWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl3aGlsZSAoKGVycmZsYWcgPSBsb2FkcXVlcnkoTF9HRVRJTkZPLCBsZGlidWYsIGJ1ZnNpemUpKSA9PSAtMQotCSAgICAgICAmJiBlcnJubyA9PSBFTk9NRU0pIHsKLQkJZnJlZShsZGlidWYpOwotCQlidWZzaXplICs9IDEwMjQ7Ci0JCWlmICgobGRpYnVmID0gbWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JaWYgKGVycmZsYWcgPT0gLTEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qCi0JLS0gTWFrZSB0aGUgbW9kdWxlcyBsaXN0IGZyb20gdGhlIGxkX2luZm8gc3RydWN0dXJlcy4KLQkqLwotCWxkaXB0ciA9IChzdHJ1Y3QgbGRfaW5mbyAqKWxkaWJ1ZjsKLQlwcmV2bW9kcHRyID0gTlVMTDsKLQlkbyB7Ci0JCWlmIChzdHJzdHIocHJvZ25hbWUsIGxkaXB0ci0+bGRpbmZvX2ZpbGVuYW1lKSA9PSBOVUxMICYmCi0JCSAgICBzdHJzdHIobGRpcHRyLT5sZGluZm9fZmlsZW5hbWUsICJweXRob24iKSA9PSBOVUxMKSB7Ci0JCQkvKgotCQkJLS0gRXh0cmFjdCBvbmx5IHRoZSBtb2R1bGVzIGJlbG9uZ2luZyB0byB0aGUgbWFpbgotCQkJLS0gZXhlY3V0YWJsZSArIHRob3NlIGNvbnRhaW5pbmcgInB5dGhvbiIgYXMgYQotCQkJLS0gc3Vic3RyaW5nIChsaWtlIHRoZSAicHl0aG9uW3ZlcnNpb25dIiBiaW5hcnkgb3IKLQkJCS0tICJsaWJweXRob25bdmVyc2lvbl0uYSIgaW4gY2FzZSBpdCdzIGEgc2hhcmVkIGxpYikuCi0JCQkqLwotCQkJb2Zmc2V0ID0gKHVuc2lnbmVkIGludClsZGlwdHItPmxkaW5mb19uZXh0OwotCQkJbGRpcHRyID0gKHN0cnVjdCBsZF9pbmZvICopKChjaGFyKilsZGlwdHIgKyBvZmZzZXQpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKChtb2RwdHIgPSAoTW9kdWxlUHRyKW1hbGxvYyhzaXplb2YoTW9kdWxlKSkpID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCXdoaWxlICgqbW9kbGlzdHB0cikgewotCQkJCW1vZHB0ciA9IChNb2R1bGVQdHIpKm1vZGxpc3RwdHI7Ci0JCQkJKm1vZGxpc3RwdHIgPSAodm9pZCAqKW1vZHB0ci0+bmV4dDsKLQkJCQlmcmVlKG1vZHB0cik7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbW9kcHRyLT5lbnRyeSA9IGxkaXB0ci0+bGRpbmZvX2RhdGFvcmc7Ci0JCW1vZHB0ci0+bmV4dCAgPSBOVUxMOwotCQlpZiAocHJldm1vZHB0ciA9PSBOVUxMKQotCQkJKm1vZGxpc3RwdHIgPSAodm9pZCAqKW1vZHB0cjsKLQkJZWxzZQotCQkJcHJldm1vZHB0ci0+bmV4dCA9IG1vZHB0cjsKLQkJcHJldm1vZHB0ciA9IG1vZHB0cjsKLQkJb2Zmc2V0ID0gKHVuc2lnbmVkIGludClsZGlwdHItPmxkaW5mb19uZXh0OwotCQlsZGlwdHIgPSAoc3RydWN0IGxkX2luZm8gKikoKGNoYXIqKWxkaXB0ciArIG9mZnNldCk7Ci0JfSB3aGlsZSAob2Zmc2V0KTsKLQlmcmVlKGxkaWJ1Zik7Ci0JcmV0dXJuIDA7CisgICAgcmVnaXN0ZXIgTW9kdWxlUHRyICAgICAgIG1vZHB0ciwgcHJldm1vZHB0cjsKKyAgICByZWdpc3RlciBzdHJ1Y3QgbGRfaW5mbyAgKmxkaXB0cjsKKyAgICByZWdpc3RlciBjaGFyICAgICAgICAgICAgKmxkaWJ1ZjsKKyAgICByZWdpc3RlciBpbnQgICAgICAgICAgICAgZXJyZmxhZywgYnVmc2l6ZSA9IDEwMjQ7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50ICAgIG9mZnNldDsKKyAgICBjaGFyICpwcm9nbmFtZSA9IFB5X0dldFByb2dyYW1OYW1lKCk7CisKKyAgICAvKgorICAgIC0tIEdldCB0aGUgbGlzdCBvZiBsb2FkZWQgbW9kdWxlcyBpbnRvIGxkX2luZm8gc3RydWN0dXJlcy4KKyAgICAqLworICAgIGlmICgobGRpYnVmID0gbWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB3aGlsZSAoKGVycmZsYWcgPSBsb2FkcXVlcnkoTF9HRVRJTkZPLCBsZGlidWYsIGJ1ZnNpemUpKSA9PSAtMQorICAgICAgICAgICAmJiBlcnJubyA9PSBFTk9NRU0pIHsKKyAgICAgICAgZnJlZShsZGlidWYpOworICAgICAgICBidWZzaXplICs9IDEwMjQ7CisgICAgICAgIGlmICgobGRpYnVmID0gbWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVycmZsYWcgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qCisgICAgLS0gTWFrZSB0aGUgbW9kdWxlcyBsaXN0IGZyb20gdGhlIGxkX2luZm8gc3RydWN0dXJlcy4KKyAgICAqLworICAgIGxkaXB0ciA9IChzdHJ1Y3QgbGRfaW5mbyAqKWxkaWJ1ZjsKKyAgICBwcmV2bW9kcHRyID0gTlVMTDsKKyAgICBkbyB7CisgICAgICAgIGlmIChzdHJzdHIocHJvZ25hbWUsIGxkaXB0ci0+bGRpbmZvX2ZpbGVuYW1lKSA9PSBOVUxMICYmCisgICAgICAgICAgICBzdHJzdHIobGRpcHRyLT5sZGluZm9fZmlsZW5hbWUsICJweXRob24iKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgLS0gRXh0cmFjdCBvbmx5IHRoZSBtb2R1bGVzIGJlbG9uZ2luZyB0byB0aGUgbWFpbgorICAgICAgICAgICAgLS0gZXhlY3V0YWJsZSArIHRob3NlIGNvbnRhaW5pbmcgInB5dGhvbiIgYXMgYQorICAgICAgICAgICAgLS0gc3Vic3RyaW5nIChsaWtlIHRoZSAicHl0aG9uW3ZlcnNpb25dIiBiaW5hcnkgb3IKKyAgICAgICAgICAgIC0tICJsaWJweXRob25bdmVyc2lvbl0uYSIgaW4gY2FzZSBpdCdzIGEgc2hhcmVkIGxpYikuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGludClsZGlwdHItPmxkaW5mb19uZXh0OworICAgICAgICAgICAgbGRpcHRyID0gKHN0cnVjdCBsZF9pbmZvICopKChjaGFyKilsZGlwdHIgKyBvZmZzZXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtb2RwdHIgPSAoTW9kdWxlUHRyKW1hbGxvYyhzaXplb2YoTW9kdWxlKSkpID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHdoaWxlICgqbW9kbGlzdHB0cikgeworICAgICAgICAgICAgICAgIG1vZHB0ciA9IChNb2R1bGVQdHIpKm1vZGxpc3RwdHI7CisgICAgICAgICAgICAgICAgKm1vZGxpc3RwdHIgPSAodm9pZCAqKW1vZHB0ci0+bmV4dDsKKyAgICAgICAgICAgICAgICBmcmVlKG1vZHB0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbW9kcHRyLT5lbnRyeSA9IGxkaXB0ci0+bGRpbmZvX2RhdGFvcmc7CisgICAgICAgIG1vZHB0ci0+bmV4dCAgPSBOVUxMOworICAgICAgICBpZiAocHJldm1vZHB0ciA9PSBOVUxMKQorICAgICAgICAgICAgKm1vZGxpc3RwdHIgPSAodm9pZCAqKW1vZHB0cjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJldm1vZHB0ci0+bmV4dCA9IG1vZHB0cjsKKyAgICAgICAgcHJldm1vZHB0ciA9IG1vZHB0cjsKKyAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGludClsZGlwdHItPmxkaW5mb19uZXh0OworICAgICAgICBsZGlwdHIgPSAoc3RydWN0IGxkX2luZm8gKikoKGNoYXIqKWxkaXB0ciArIG9mZnNldCk7CisgICAgfSB3aGlsZSAob2Zmc2V0KTsKKyAgICBmcmVlKGxkaWJ1Zik7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMTA4LDc2ICsxMDgsNzYgQEAKIGFpeF9sb2FkZXJyb3IoY29uc3QgY2hhciAqcGF0aG5hbWUpCiB7CiAKLQljaGFyICptZXNzYWdlWzEwMjRdLCBlcnJidWZbMTAyNF07Ci0JcmVnaXN0ZXIgaW50IGksajsKKyAgICBjaGFyICptZXNzYWdlWzEwMjRdLCBlcnJidWZbMTAyNF07CisgICAgcmVnaXN0ZXIgaW50IGksajsKIAotCXN0cnVjdCBlcnJ0YWIgeyAKLQkJaW50IGVyck5vOwotCQljaGFyICplcnJzdHI7Ci0JfSBsb2FkX2VycnRhYltdID0gewotCQl7TF9FUlJPUl9UT09NQU5ZLAkidG9vIG1hbnkgZXJyb3JzLCByZXN0IHNraXBwZWQuIn0sCi0JCXtMX0VSUk9SX05PTElCLAkJImNhbid0IGxvYWQgbGlicmFyeToifSwKLQkJe0xfRVJST1JfVU5ERUYsCQkiY2FuJ3QgZmluZCBzeW1ib2wgaW4gbGlicmFyeToifSwKLQkJe0xfRVJST1JfUkxEQkFELAotCQkgIlJMRCBpbmRleCBvdXQgb2YgcmFuZ2Ugb3IgYmFkIHJlbG9jYXRpb24gdHlwZToifSwKLQkJe0xfRVJST1JfRk9STUFULAkibm90IGEgdmFsaWQsIGV4ZWN1dGFibGUgeGNvZmYgZmlsZToifSwKLQkJe0xfRVJST1JfTUVNQkVSLAotCQkgImZpbGUgbm90IGFuIGFyY2hpdmUgb3IgZG9lcyBub3QgY29udGFpbiByZXF1ZXN0ZWQgbWVtYmVyOiJ9LAotCQl7TF9FUlJPUl9UWVBFLAkJInN5bWJvbCB0YWJsZSBtaXNtYXRjaDoifSwKLQkJe0xfRVJST1JfQUxJR04sCQkidGV4dCBhbGlnbm1lbnQgaW4gZmlsZSBpcyB3cm9uZy4ifSwKLQkJe0xfRVJST1JfU1lTVEVNLAkiU3lzdGVtIGVycm9yOiJ9LAotCQl7TF9FUlJPUl9FUlJOTywJCU5VTEx9Ci0JfTsKKyAgICBzdHJ1Y3QgZXJydGFiIHsKKyAgICAgICAgaW50IGVyck5vOworICAgICAgICBjaGFyICplcnJzdHI7CisgICAgfSBsb2FkX2VycnRhYltdID0geworICAgICAgICB7TF9FUlJPUl9UT09NQU5ZLCAgICAgICAgICAgICAgICJ0b28gbWFueSBlcnJvcnMsIHJlc3Qgc2tpcHBlZC4ifSwKKyAgICAgICAge0xfRVJST1JfTk9MSUIsICAgICAgICAgICAgICAgICAiY2FuJ3QgbG9hZCBsaWJyYXJ5OiJ9LAorICAgICAgICB7TF9FUlJPUl9VTkRFRiwgICAgICAgICAgICAgICAgICJjYW4ndCBmaW5kIHN5bWJvbCBpbiBsaWJyYXJ5OiJ9LAorICAgICAgICB7TF9FUlJPUl9STERCQUQsCisgICAgICAgICAiUkxEIGluZGV4IG91dCBvZiByYW5nZSBvciBiYWQgcmVsb2NhdGlvbiB0eXBlOiJ9LAorICAgICAgICB7TF9FUlJPUl9GT1JNQVQsICAgICAgICAgICAgICAgICJub3QgYSB2YWxpZCwgZXhlY3V0YWJsZSB4Y29mZiBmaWxlOiJ9LAorICAgICAgICB7TF9FUlJPUl9NRU1CRVIsCisgICAgICAgICAiZmlsZSBub3QgYW4gYXJjaGl2ZSBvciBkb2VzIG5vdCBjb250YWluIHJlcXVlc3RlZCBtZW1iZXI6In0sCisgICAgICAgIHtMX0VSUk9SX1RZUEUsICAgICAgICAgICAgICAgICAgInN5bWJvbCB0YWJsZSBtaXNtYXRjaDoifSwKKyAgICAgICAge0xfRVJST1JfQUxJR04sICAgICAgICAgICAgICAgICAidGV4dCBhbGlnbm1lbnQgaW4gZmlsZSBpcyB3cm9uZy4ifSwKKyAgICAgICAge0xfRVJST1JfU1lTVEVNLCAgICAgICAgICAgICAgICAiU3lzdGVtIGVycm9yOiJ9LAorICAgICAgICB7TF9FUlJPUl9FUlJOTywgICAgICAgICAgICAgICAgIE5VTEx9CisgICAgfTsKIAotI2RlZmluZSBMT0FEX0VSUlRBQl9MRU4JKHNpemVvZihsb2FkX2VycnRhYikvc2l6ZW9mKGxvYWRfZXJydGFiWzBdKSkKKyNkZWZpbmUgTE9BRF9FUlJUQUJfTEVOIChzaXplb2YobG9hZF9lcnJ0YWIpL3NpemVvZihsb2FkX2VycnRhYlswXSkpCiAjZGVmaW5lIEVSUkJVRl9BUFBFTkQocykgc3RybmNhdChlcnJidWYsIHMsIHNpemVvZihlcnJidWYpLXN0cmxlbihlcnJidWYpLTEpCiAKLQlQeU9TX3NucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJmcm9tIG1vZHVsZSAlLjIwMHMgIiwgcGF0aG5hbWUpOworICAgIFB5T1Nfc25wcmludGYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgImZyb20gbW9kdWxlICUuMjAwcyAiLCBwYXRobmFtZSk7CiAKLQlpZiAoIWxvYWRxdWVyeShMX0dFVE1FU1NBR0VTLCAmbWVzc2FnZVswXSwgc2l6ZW9mKG1lc3NhZ2UpKSkgewotCQlFUlJCVUZfQVBQRU5EKHN0cmVycm9yKGVycm5vKSk7Ci0JCUVSUkJVRl9BUFBFTkQoIlxuIik7Ci0JfQotCWZvcihpID0gMDsgbWVzc2FnZVtpXSAmJiAqbWVzc2FnZVtpXTsgaSsrKSB7Ci0JCWludCBuZXJyID0gYXRvaShtZXNzYWdlW2ldKTsKLQkJZm9yIChqPTA7IGo8TE9BRF9FUlJUQUJfTEVOIDsgaisrKSB7Ci0JCSAgICBpZiAobmVyciA9PSBsb2FkX2VycnRhYltqXS5lcnJObyAmJiBsb2FkX2VycnRhYltqXS5lcnJzdHIpCi0JCQlFUlJCVUZfQVBQRU5EKGxvYWRfZXJydGFiW2pdLmVycnN0cik7Ci0JCX0KLQkJd2hpbGUgKGlzZGlnaXQoUHlfQ0hBUk1BU0soKm1lc3NhZ2VbaV0pKSkgbWVzc2FnZVtpXSsrIDsgCi0JCUVSUkJVRl9BUFBFTkQobWVzc2FnZVtpXSk7Ci0JCUVSUkJVRl9BUFBFTkQoIlxuIik7Ci0JfQotCWVycmJ1ZltzdHJsZW4oZXJyYnVmKS0xXSA9ICdcMCc7CS8qIHRyaW0gb2ZmIGxhc3QgbmV3bGluZSAqLwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgZXJyYnVmKTsgCi0JcmV0dXJuOyAKKyAgICBpZiAoIWxvYWRxdWVyeShMX0dFVE1FU1NBR0VTLCAmbWVzc2FnZVswXSwgc2l6ZW9mKG1lc3NhZ2UpKSkgeworICAgICAgICBFUlJCVUZfQVBQRU5EKHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIEVSUkJVRl9BUFBFTkQoIlxuIik7CisgICAgfQorICAgIGZvcihpID0gMDsgbWVzc2FnZVtpXSAmJiAqbWVzc2FnZVtpXTsgaSsrKSB7CisgICAgICAgIGludCBuZXJyID0gYXRvaShtZXNzYWdlW2ldKTsKKyAgICAgICAgZm9yIChqPTA7IGo8TE9BRF9FUlJUQUJfTEVOIDsgaisrKSB7CisgICAgICAgICAgICBpZiAobmVyciA9PSBsb2FkX2VycnRhYltqXS5lcnJObyAmJiBsb2FkX2VycnRhYltqXS5lcnJzdHIpCisgICAgICAgICAgICBFUlJCVUZfQVBQRU5EKGxvYWRfZXJydGFiW2pdLmVycnN0cik7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGlzZGlnaXQoUHlfQ0hBUk1BU0soKm1lc3NhZ2VbaV0pKSkgbWVzc2FnZVtpXSsrIDsKKyAgICAgICAgRVJSQlVGX0FQUEVORChtZXNzYWdlW2ldKTsKKyAgICAgICAgRVJSQlVGX0FQUEVORCgiXG4iKTsKKyAgICB9CisgICAgZXJyYnVmW3N0cmxlbihlcnJidWYpLTFdID0gJ1wwJzsgICAgICAgICAgICAvKiB0cmltIG9mZiBsYXN0IG5ld2xpbmUgKi8KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGVycmJ1Zik7CisgICAgcmV0dXJuOwogfQogCiAKIGRsX2Z1bmNwdHIgX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKGNvbnN0IGNoYXIgKmZxbmFtZSwgY29uc3QgY2hhciAqc2hvcnRuYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JZGxfZnVuY3B0ciBwOworICAgIGRsX2Z1bmNwdHIgcDsKIAotCS8qCi0JLS0gSW52b2tlIGxvYWQoKSB3aXRoIExfTk9BVVRPREVGRVIgbGVhdmluZyB0aGUgaW1wb3J0ZWQgc3ltYm9scwotCS0tIG9mIHRoZSBzaGFyZWQgbW9kdWxlIHVucmVzb2x2ZWQuIFRodXMgd2UgaGF2ZSB0byByZXNvbHZlIHRoZW0KLQktLSBleHBsaWNpdGx5IHdpdGggbG9hZGJpbmQuIFRoZSBuZXcgbW9kdWxlIGlzIGxvYWRlZCwgdGhlbiB3ZQotCS0tIHJlc29sdmUgaXRzIHN5bWJvbHMgdXNpbmcgdGhlIGxpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgbW9kdWxlcwotCS0tIChvbmx5IHRob3NlIHRoYXQgYmVsb25nIHRvIHRoZSBweXRob24gZXhlY3V0YWJsZSkuIEdldCB0aGVzZQotCS0tIHdpdGggbG9hZHF1ZXJ5KExfR0VUSU5GTykuCi0JKi8KKyAgICAvKgorICAgIC0tIEludm9rZSBsb2FkKCkgd2l0aCBMX05PQVVUT0RFRkVSIGxlYXZpbmcgdGhlIGltcG9ydGVkIHN5bWJvbHMKKyAgICAtLSBvZiB0aGUgc2hhcmVkIG1vZHVsZSB1bnJlc29sdmVkLiBUaHVzIHdlIGhhdmUgdG8gcmVzb2x2ZSB0aGVtCisgICAgLS0gZXhwbGljaXRseSB3aXRoIGxvYWRiaW5kLiBUaGUgbmV3IG1vZHVsZSBpcyBsb2FkZWQsIHRoZW4gd2UKKyAgICAtLSByZXNvbHZlIGl0cyBzeW1ib2xzIHVzaW5nIHRoZSBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIG1vZHVsZXMKKyAgICAtLSAob25seSB0aG9zZSB0aGF0IGJlbG9uZyB0byB0aGUgcHl0aG9uIGV4ZWN1dGFibGUpLiBHZXQgdGhlc2UKKyAgICAtLSB3aXRoIGxvYWRxdWVyeShMX0dFVElORk8pLgorICAgICovCiAKLQlzdGF0aWMgdm9pZCAqc3RhdGljbW9kbGlzdHB0ciA9IE5VTEw7CisgICAgc3RhdGljIHZvaWQgKnN0YXRpY21vZGxpc3RwdHIgPSBOVUxMOwogCi0JaWYgKCFzdGF0aWNtb2RsaXN0cHRyKQotCQlpZiAoYWl4X2dldG9sZG1vZHVsZXMoJnN0YXRpY21vZGxpc3RwdHIpID09IC0xKQotCQkJcmV0dXJuIE5VTEw7Ci0JcCA9IChkbF9mdW5jcHRyKSBhaXhfbG9hZCgoY2hhciAqKXBhdGhuYW1lLCBMX05PQVVUT0RFRkVSLCAwKTsKLQlpZiAocCA9PSBOVUxMKSB7Ci0JCWFpeF9sb2FkZXJyb3IocGF0aG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFzdGF0aWNtb2RsaXN0cHRyKQorICAgICAgICBpZiAoYWl4X2dldG9sZG1vZHVsZXMoJnN0YXRpY21vZGxpc3RwdHIpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IChkbF9mdW5jcHRyKSBhaXhfbG9hZCgoY2hhciAqKXBhdGhuYW1lLCBMX05PQVVUT0RFRkVSLCAwKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIGFpeF9sb2FkZXJyb3IocGF0aG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gcDsKKyAgICByZXR1cm4gcDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX2F0aGVvcy5jIGIvUHl0aG9uL2R5bmxvYWRfYXRoZW9zLmMKaW5kZXggNmY0ZGY3My4uNjVlNDEzNiAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfYXRoZW9zLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfYXRoZW9zLmMKQEAgLTksMzkgKzksMzkgQEAKIAogCiBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYltdID0gewotCXsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXswLCAwfQorICAgIHsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQl2b2lkICpwOwotCWludCBsaWI7Ci0JY2hhciBmdW5jbmFtZVsyNThdOworICAgIHZvaWQgKnA7CisgICAgaW50IGxpYjsKKyAgICBjaGFyIGZ1bmNuYW1lWzI1OF07CiAKLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCXByaW50ZigibG9hZF9saWJyYXJ5ICVzXG4iLCBwYXRobmFtZSk7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBwcmludGYoImxvYWRfbGlicmFyeSAlc1xuIiwgcGF0aG5hbWUpOwogCi0JbGliID0gbG9hZF9saWJyYXJ5KHBhdGhuYW1lLCAwKTsKLQlpZiAobGliIDwgMCkgewotCQljaGFyIGJ1Zls1MTJdOwotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlwZXJyb3IocGF0aG5hbWUpOwotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJGYWlsZWQgdG8gbG9hZCAlLjIwMHM6ICUuMjAwcyIsCi0JCQkgICAgICBwYXRobmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBidWYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJcHJpbnRmKCJnZXRfc3ltYm9sX2FkZHJlc3MgJXNcbiIsIGZ1bmNuYW1lKTsKLQlpZiAoZ2V0X3N5bWJvbF9hZGRyZXNzKGxpYiwgZnVuY25hbWUsIC0xLCAmcCkgPCAwKSB7Ci0JCXAgPSBOVUxMOwotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlwZXJyb3IoZnVuY25hbWUpOwotCX0KKyAgICBsaWIgPSBsb2FkX2xpYnJhcnkocGF0aG5hbWUsIDApOworICAgIGlmIChsaWIgPCAwKSB7CisgICAgICAgIGNoYXIgYnVmWzUxMl07CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIHBlcnJvcihwYXRobmFtZSk7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkZhaWxlZCB0byBsb2FkICUuMjAwczogJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgcHJpbnRmKCJnZXRfc3ltYm9sX2FkZHJlc3MgJXNcbiIsIGZ1bmNuYW1lKTsKKyAgICBpZiAoZ2V0X3N5bWJvbF9hZGRyZXNzKGxpYiwgZnVuY25hbWUsIC0xLCAmcCkgPCAwKSB7CisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBwZXJyb3IoZnVuY25hbWUpOworICAgIH0KIAotCXJldHVybiAoZGxfZnVuY3B0cikgcDsKKyAgICByZXR1cm4gKGRsX2Z1bmNwdHIpIHA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF9iZW9zLmMgYi9QeXRob24vZHlubG9hZF9iZW9zLmMKaW5kZXggNWIwNWQ2Yi4uZjVjYTFlYyAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfYmVvcy5jCisrKyBiL1B5dGhvbi9keW5sb2FkX2Jlb3MuYwpAQCAtOSw5ICs5LDkgQEAKICNpbmNsdWRlICJpbXBvcnRkbC5oIgogCiBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYltdID0gewotCXsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXswLCAwfQorICAgIHsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogI2lmIGRlZmluZWQoTUFYUEFUSExFTikgJiYgIWRlZmluZWQoX1NZU19QQVJBTV9IKQpAQCAtNTIsMTMgKzUyLDEzIEBACiAgKi8KIHN0YXRpYyB2b2lkIGJlb3NfbnVrZV9keW4oIFB5T2JqZWN0ICppdGVtICkKIHsKLQlzdGF0dXNfdCByZXR2YWw7CisgICAgc3RhdHVzX3QgcmV0dmFsOwogCi0JaWYoIGl0ZW0gKSB7Ci0JCWltYWdlX2lkIGlkID0gKGltYWdlX2lkKVB5SW50X0FzTG9uZyggaXRlbSApOwotCQkKLQkJcmV0dmFsID0gdW5sb2FkX2FkZF9vbiggaWQgKTsKLQl9CisgICAgaWYoIGl0ZW0gKSB7CisgICAgICAgIGltYWdlX2lkIGlkID0gKGltYWdlX2lkKVB5SW50X0FzTG9uZyggaXRlbSApOworCisgICAgICAgIHJldHZhbCA9IHVubG9hZF9hZGRfb24oIGlkICk7CisgICAgfQogfQogCiAvKiBhdGV4aXQoKSBoYW5kbGVyIHRoYXQnbGwgY2FsbCB1bmxvYWRfYWRkX29uKCkgZm9yIGV2ZXJ5IGl0ZW0gaW4gdGhlCkBAIC02NiwzMSArNjYsMzEgQEAKICAqLwogc3RhdGljIHZvaWQgYmVvc19jbGVhbnVwX2R5biggdm9pZCApCiB7Ci0JaWYoIGJlb3NfZHluX2ltYWdlcyApIHsKLQkJaW50IGlkeDsKLQkJaW50IGxpc3Rfc2l6ZTsKLQkJUHlPYmplY3QgKmlkX2xpc3Q7CisgICAgaWYoIGJlb3NfZHluX2ltYWdlcyApIHsKKyAgICAgICAgaW50IGlkeDsKKyAgICAgICAgaW50IGxpc3Rfc2l6ZTsKKyAgICAgICAgUHlPYmplY3QgKmlkX2xpc3Q7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlQeVRocmVhZF9hY3F1aXJlX2xvY2soIGJlb3NfZHluX2xvY2ssIDEgKTsKKyAgICAgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCBiZW9zX2R5bl9sb2NrLCAxICk7CiAjZW5kaWYKIAotCQlpZF9saXN0ID0gUHlEaWN0X1ZhbHVlcyggYmVvc19keW5faW1hZ2VzICk7CisgICAgICAgIGlkX2xpc3QgPSBQeURpY3RfVmFsdWVzKCBiZW9zX2R5bl9pbWFnZXMgKTsKIAotCQlsaXN0X3NpemUgPSBQeUxpc3RfU2l6ZSggaWRfbGlzdCApOwotCQlmb3IoIGlkeCA9IDA7IGlkeCA8IGxpc3Rfc2l6ZTsgaWR4KysgKSB7Ci0JCQlQeU9iamVjdCAqdGhlX2l0ZW07Ci0JCQkKLQkJCXRoZV9pdGVtID0gUHlMaXN0X0dldEl0ZW0oIGlkX2xpc3QsIGlkeCApOwotCQkJYmVvc19udWtlX2R5biggdGhlX2l0ZW0gKTsKLQkJfQorICAgICAgICBsaXN0X3NpemUgPSBQeUxpc3RfU2l6ZSggaWRfbGlzdCApOworICAgICAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IGxpc3Rfc2l6ZTsgaWR4KysgKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdGhlX2l0ZW07CiAKLQkJUHlEaWN0X0NsZWFyKCBiZW9zX2R5bl9pbWFnZXMgKTsKKyAgICAgICAgICAgIHRoZV9pdGVtID0gUHlMaXN0X0dldEl0ZW0oIGlkX2xpc3QsIGlkeCApOworICAgICAgICAgICAgYmVvc19udWtlX2R5biggdGhlX2l0ZW0gKTsKKyAgICAgICAgfQorCisgICAgICAgIFB5RGljdF9DbGVhciggYmVvc19keW5faW1hZ2VzICk7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlQeVRocmVhZF9mcmVlX2xvY2soIGJlb3NfZHluX2xvY2sgKTsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKCBiZW9zX2R5bl9sb2NrICk7CiAjZW5kaWYKLQl9CisgICAgfQogfQogCiAvKgpAQCAtOTgsMjAgKzk4LDIwIEBACiAgKi8KIHN0YXRpYyB2b2lkIGJlb3NfaW5pdF9keW4oIHZvaWQgKQogewotCS8qIFdlJ3JlIHByb3RlY3RlZCBmcm9tIGEgcmFjZSBjb25kaXRpb24gaGVyZSBieSB0aGUgYXRvbWljIGluaXRfY291bnQKLQkgKiB2YXJpYWJsZS4KLQkgKi8KLQlzdGF0aWMgaW50MzIgaW5pdF9jb3VudCA9IDA7Ci0JaW50MzIgdmFsOworICAgIC8qIFdlJ3JlIHByb3RlY3RlZCBmcm9tIGEgcmFjZSBjb25kaXRpb24gaGVyZSBieSB0aGUgYXRvbWljIGluaXRfY291bnQKKyAgICAgKiB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50MzIgaW5pdF9jb3VudCA9IDA7CisgICAgaW50MzIgdmFsOwogCi0JdmFsID0gYXRvbWljX2FkZCggJmluaXRfY291bnQsIDEgKTsKLQlpZiggYmVvc19keW5faW1hZ2VzID09IE5VTEwgJiYgdmFsID09IDAgKSB7Ci0JCWJlb3NfZHluX2ltYWdlcyA9IFB5RGljdF9OZXcoKTsKKyAgICB2YWwgPSBhdG9taWNfYWRkKCAmaW5pdF9jb3VudCwgMSApOworICAgIGlmKCBiZW9zX2R5bl9pbWFnZXMgPT0gTlVMTCAmJiB2YWwgPT0gMCApIHsKKyAgICAgICAgYmVvc19keW5faW1hZ2VzID0gUHlEaWN0X05ldygpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCWJlb3NfZHluX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgICAgIGJlb3NfZHluX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CiAjZW5kaWYKLQkJYXRleGl0KCBiZW9zX2NsZWFudXBfZHluICk7Ci0JfQorICAgICAgICBhdGV4aXQoIGJlb3NfY2xlYW51cF9keW4gKTsKKyAgICB9CiB9CiAKIC8qCkBAIC0xMjIsMTMzICsxMjIsMTMzIEBACiAgKi8KIHN0YXRpYyB2b2lkIGJlb3NfYWRkX2R5biggY2hhciAqbmFtZSwgaW1hZ2VfaWQgaWQgKQogewotCWludCByZXR2YWw7Ci0JUHlPYmplY3QgKnB5X2lkOworICAgIGludCByZXR2YWw7CisgICAgUHlPYmplY3QgKnB5X2lkOwogCi0JaWYoIGJlb3NfZHluX2ltYWdlcyA9PSBOVUxMICkgewotCQliZW9zX2luaXRfZHluKCk7Ci0JfQorICAgIGlmKCBiZW9zX2R5bl9pbWFnZXMgPT0gTlVMTCApIHsKKyAgICAgICAgYmVvc19pbml0X2R5bigpOworICAgIH0KIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JcmV0dmFsID0gUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCBiZW9zX2R5bl9sb2NrLCAxICk7CisgICAgcmV0dmFsID0gUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCBiZW9zX2R5bl9sb2NrLCAxICk7CiAjZW5kaWYKIAotCS8qIElmIHRoZXJlJ3MgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCB0aGlzIGtleSBpbiB0aGUgZGljdGlvbmFyeSwKLQkgKiB3ZSdyZSBkb2luZyBhIHJlbG9hZCgpLCBzbyBsZXQncyBudWtlIGl0LgotCSAqLwotCXB5X2lkID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoIGJlb3NfZHluX2ltYWdlcywgbmFtZSApOwotCWlmKCBweV9pZCApIHsKLQkJYmVvc19udWtlX2R5biggcHlfaWQgKTsKLQkJcmV0dmFsID0gUHlEaWN0X0RlbEl0ZW1TdHJpbmcoIGJlb3NfZHluX2ltYWdlcywgbmFtZSApOwotCX0KKyAgICAvKiBJZiB0aGVyZSdzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggdGhpcyBrZXkgaW4gdGhlIGRpY3Rpb25hcnksCisgICAgICogd2UncmUgZG9pbmcgYSByZWxvYWQoKSwgc28gbGV0J3MgbnVrZSBpdC4KKyAgICAgKi8KKyAgICBweV9pZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKCBiZW9zX2R5bl9pbWFnZXMsIG5hbWUgKTsKKyAgICBpZiggcHlfaWQgKSB7CisgICAgICAgIGJlb3NfbnVrZV9keW4oIHB5X2lkICk7CisgICAgICAgIHJldHZhbCA9IFB5RGljdF9EZWxJdGVtU3RyaW5nKCBiZW9zX2R5bl9pbWFnZXMsIG5hbWUgKTsKKyAgICB9CiAKLQlweV9pZCA9IFB5SW50X0Zyb21Mb25nKCAobG9uZylpZCApOwotCWlmKCBweV9pZCApIHsKLQkJcmV0dmFsID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoIGJlb3NfZHluX2ltYWdlcywgbmFtZSwgcHlfaWQgKTsKLQl9CisgICAgcHlfaWQgPSBQeUludF9Gcm9tTG9uZyggKGxvbmcpaWQgKTsKKyAgICBpZiggcHlfaWQgKSB7CisgICAgICAgIHJldHZhbCA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKCBiZW9zX2R5bl9pbWFnZXMsIG5hbWUsIHB5X2lkICk7CisgICAgfQogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soIGJlb3NfZHluX2xvY2sgKTsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soIGJlb3NfZHluX2xvY2sgKTsKICNlbmRpZgogfQogCiAKIAogZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlkbF9mdW5jcHRyIHA7Ci0JaW1hZ2VfaWQgdGhlX2lkOwotCXN0YXR1c190IHJldHZhbDsKLQljaGFyIGZ1bGxwYXRoW1BBVEhfTUFYXTsKLQljaGFyIGZ1bmNuYW1lWzI1OF07CisgICAgZGxfZnVuY3B0ciBwOworICAgIGltYWdlX2lkIHRoZV9pZDsKKyAgICBzdGF0dXNfdCByZXR2YWw7CisgICAgY2hhciBmdWxscGF0aFtQQVRIX01BWF07CisgICAgY2hhciBmdW5jbmFtZVsyNThdOwogCi0JaWYoIFB5X1ZlcmJvc2VGbGFnICkgewotCQlwcmludGYoICJsb2FkX2FkZF9vbiggJXMgKVxuIiwgcGF0aG5hbWUgKTsKLQl9CisgICAgaWYoIFB5X1ZlcmJvc2VGbGFnICkgeworICAgICAgICBwcmludGYoICJsb2FkX2FkZF9vbiggJXMgKVxuIiwgcGF0aG5hbWUgKTsKKyAgICB9CiAKLQkvKiBIbW0sIHRoaXMgb2xkIGJ1ZyBhcHBlYXJzIHRvIGhhdmUgcmVnZW5lcmF0ZWQgaXRzZWxmOyBpZiB0aGUKLQkgKiBwYXRoIGlzbid0IGFic29sdXRlLCBsb2FkX2FkZF9vbigpIHdpbGwgZmFpbC4gIFJlcG9ydGVkIHRvIEJlCi0JICogQXByaWwgMjEsIDE5OTguCi0JICovCi0JaWYoIHBhdGhuYW1lWzBdICE9ICcvJyApIHsKLQkJKHZvaWQpZ2V0Y3dkKCBmdWxscGF0aCwgUEFUSF9NQVggKTsKLQkJKHZvaWQpc3RybmNhdCggZnVsbHBhdGgsICIvIiwgUEFUSF9NQVggKTsKLQkJKHZvaWQpc3RybmNhdCggZnVsbHBhdGgsIHBhdGhuYW1lLCBQQVRIX01BWCApOwotCQkJCi0JCWlmKCBQeV9WZXJib3NlRmxhZyApIHsKLQkJCXByaW50ZiggImxvYWRfYWRkX29uKCAlcyApXG4iLCBmdWxscGF0aCApOwotCQl9Ci0JfSBlbHNlIHsKLQkJKHZvaWQpc3RyY3B5KCBmdWxscGF0aCwgcGF0aG5hbWUgKTsKLQl9CisgICAgLyogSG1tLCB0aGlzIG9sZCBidWcgYXBwZWFycyB0byBoYXZlIHJlZ2VuZXJhdGVkIGl0c2VsZjsgaWYgdGhlCisgICAgICogcGF0aCBpc24ndCBhYnNvbHV0ZSwgbG9hZF9hZGRfb24oKSB3aWxsIGZhaWwuICBSZXBvcnRlZCB0byBCZQorICAgICAqIEFwcmlsIDIxLCAxOTk4LgorICAgICAqLworICAgIGlmKCBwYXRobmFtZVswXSAhPSAnLycgKSB7CisgICAgICAgICh2b2lkKWdldGN3ZCggZnVsbHBhdGgsIFBBVEhfTUFYICk7CisgICAgICAgICh2b2lkKXN0cm5jYXQoIGZ1bGxwYXRoLCAiLyIsIFBBVEhfTUFYICk7CisgICAgICAgICh2b2lkKXN0cm5jYXQoIGZ1bGxwYXRoLCBwYXRobmFtZSwgUEFUSF9NQVggKTsKIAotCXRoZV9pZCA9IGxvYWRfYWRkX29uKCBmdWxscGF0aCApOwotCWlmKCB0aGVfaWQgPCBCX05PX0VSUk9SICkgewotCQkvKiBJdCdzIHRvbyBiYWQgbG9hZF9hZGRfb24oKSBkb2Vzbid0IHNldCBlcnJubyBvciBzb21ldGhpbmcuLi4KLQkJICovCi0JCWNoYXIgYnVmZlsyNTZdOyAgLyogaGF0ZSBoYXJkLWNvZGVkIHN0cmluZyBzaXplcy4uLiAqLworICAgICAgICBpZiggUHlfVmVyYm9zZUZsYWcgKSB7CisgICAgICAgICAgICBwcmludGYoICJsb2FkX2FkZF9vbiggJXMgKVxuIiwgZnVsbHBhdGggKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICh2b2lkKXN0cmNweSggZnVsbHBhdGgsIHBhdGhuYW1lICk7CisgICAgfQogCi0JCWlmKCBQeV9WZXJib3NlRmxhZyApIHsKLQkJCXByaW50ZiggImxvYWRfYWRkX29uKCAlcyApIGZhaWxlZCIsIGZ1bGxwYXRoICk7Ci0JCX0KKyAgICB0aGVfaWQgPSBsb2FkX2FkZF9vbiggZnVsbHBhdGggKTsKKyAgICBpZiggdGhlX2lkIDwgQl9OT19FUlJPUiApIHsKKyAgICAgICAgLyogSXQncyB0b28gYmFkIGxvYWRfYWRkX29uKCkgZG9lc24ndCBzZXQgZXJybm8gb3Igc29tZXRoaW5nLi4uCisgICAgICAgICAqLworICAgICAgICBjaGFyIGJ1ZmZbMjU2XTsgIC8qIGhhdGUgaGFyZC1jb2RlZCBzdHJpbmcgc2l6ZXMuLi4gKi8KIAotCQlpZiggdGhlX2lkID09IEJfRVJST1IgKQotCQkJUHlPU19zbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLAotCQkJCSAgICAgICAiQmVPUzogRmFpbGVkIHRvIGxvYWQgJS4yMDBzIiwKLQkJCQkgICAgICAgZnVsbHBhdGggKTsKLQkJZWxzZQotCQkJUHlPU19zbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLCAKLQkJCQkgICAgICAgIlVua25vd24gZXJyb3IgbG9hZGluZyAlLjIwMHMiLCAKLQkJCQkgICAgICAgZnVsbHBhdGggKTsKKyAgICAgICAgaWYoIFB5X1ZlcmJvc2VGbGFnICkgeworICAgICAgICAgICAgcHJpbnRmKCAibG9hZF9hZGRfb24oICVzICkgZmFpbGVkIiwgZnVsbHBhdGggKTsKKyAgICAgICAgfQogCi0JCVB5RXJyX1NldFN0cmluZyggUHlFeGNfSW1wb3J0RXJyb3IsIGJ1ZmYgKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBpZiggdGhlX2lkID09IEJfRVJST1IgKQorICAgICAgICAgICAgUHlPU19zbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlT1M6IEZhaWxlZCB0byBsb2FkICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKCBidWZmLCBzaXplb2YoYnVmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBlcnJvciBsb2FkaW5nICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCApOwogCi0JUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOwotCWlmKCBQeV9WZXJib3NlRmxhZyApIHsKLQkJcHJpbnRmKCAiZ2V0X2ltYWdlX3N5bWJvbCggJXMgKVxuIiwgZnVuY25hbWUgKTsKLQl9CisgICAgICAgIFB5RXJyX1NldFN0cmluZyggUHlFeGNfSW1wb3J0RXJyb3IsIGJ1ZmYgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dmFsID0gZ2V0X2ltYWdlX3N5bWJvbCggdGhlX2lkLCBmdW5jbmFtZSwgQl9TWU1CT0xfVFlQRV9URVhULCAmcCApOwotCWlmKCByZXR2YWwgIT0gQl9OT19FUlJPUiB8fCBwID09IE5VTEwgKSB7Ci0JCS8qIFRoYXQncyBiYWQsIHdlIGNhbid0IGZpbmQgdGhhdCBzeW1ib2wgaW4gdGhlIG1vZHVsZS4uLgotCQkgKi8KLQkJY2hhciBidWZmWzI1Nl07ICAvKiBoYXRlIGhhcmQtY29kZWQgc3RyaW5nIHNpemVzLi4uICovCisgICAgUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOworICAgIGlmKCBQeV9WZXJib3NlRmxhZyApIHsKKyAgICAgICAgcHJpbnRmKCAiZ2V0X2ltYWdlX3N5bWJvbCggJXMgKVxuIiwgZnVuY25hbWUgKTsKKyAgICB9CiAKLQkJaWYoIFB5X1ZlcmJvc2VGbGFnICkgewotCQkJcHJpbnRmKCAiZ2V0X2ltYWdlX3N5bWJvbCggJXMgKSBmYWlsZWQiLCBmdW5jbmFtZSApOwotCQl9CisgICAgcmV0dmFsID0gZ2V0X2ltYWdlX3N5bWJvbCggdGhlX2lkLCBmdW5jbmFtZSwgQl9TWU1CT0xfVFlQRV9URVhULCAmcCApOworICAgIGlmKCByZXR2YWwgIT0gQl9OT19FUlJPUiB8fCBwID09IE5VTEwgKSB7CisgICAgICAgIC8qIFRoYXQncyBiYWQsIHdlIGNhbid0IGZpbmQgdGhhdCBzeW1ib2wgaW4gdGhlIG1vZHVsZS4uLgorICAgICAgICAgKi8KKyAgICAgICAgY2hhciBidWZmWzI1Nl07ICAvKiBoYXRlIGhhcmQtY29kZWQgc3RyaW5nIHNpemVzLi4uICovCiAKLQkJc3dpdGNoKCByZXR2YWwgKSB7Ci0JCWNhc2UgQl9CQURfSU1BR0VfSUQ6Ci0JCQlQeU9TX3NucHJpbnRmKCBidWZmLCBzaXplb2YoYnVmZiksCi0JCQkgICAgICAgImNhbid0IGxvYWQgaW5pdCBmdW5jdGlvbiBmb3IgZHluYW1pYyBtb2R1bGU6ICIKLQkJICAgICAgICAgICAgICAgIkludmFsaWQgaW1hZ2UgSUQgZm9yICUuMTgwcyIsIGZ1bGxwYXRoICk7Ci0JCQlicmVhazsKLQkJY2FzZSBCX0JBRF9JTkRFWDoKLQkJCVB5T1Nfc25wcmludGYoIGJ1ZmYsIHNpemVvZihidWZmKSwKLQkJCSAgICAgICAiY2FuJ3QgbG9hZCBpbml0IGZ1bmN0aW9uIGZvciBkeW5hbWljIG1vZHVsZTogIgotCQkgICAgICAgICAgICAgICAiQmFkIGluZGV4IGZvciAlLjE4MHMiLCBmdW5jbmFtZSApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlQeU9TX3NucHJpbnRmKCBidWZmLCBzaXplb2YoYnVmZiksCi0JCQkgICAgICAgImNhbid0IGxvYWQgaW5pdCBmdW5jdGlvbiBmb3IgZHluYW1pYyBtb2R1bGU6ICIKLQkJICAgICAgICAgICAgICAgIlVua25vd24gZXJyb3IgbG9va2luZyB1cCAlLjE4MHMiLCBmdW5jbmFtZSApOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaWYoIFB5X1ZlcmJvc2VGbGFnICkgeworICAgICAgICAgICAgcHJpbnRmKCAiZ2V0X2ltYWdlX3N5bWJvbCggJXMgKSBmYWlsZWQiLCBmdW5jbmFtZSApOworICAgICAgICB9CiAKLQkJcmV0dmFsID0gdW5sb2FkX2FkZF9vbiggdGhlX2lkICk7CisgICAgICAgIHN3aXRjaCggcmV0dmFsICkgeworICAgICAgICBjYXNlIEJfQkFEX0lNQUdFX0lEOgorICAgICAgICAgICAgUHlPU19zbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLAorICAgICAgICAgICAgICAgICAgICJjYW4ndCBsb2FkIGluaXQgZnVuY3Rpb24gZm9yIGR5bmFtaWMgbW9kdWxlOiAiCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW1hZ2UgSUQgZm9yICUuMTgwcyIsIGZ1bGxwYXRoICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCX0JBRF9JTkRFWDoKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoIGJ1ZmYsIHNpemVvZihidWZmKSwKKyAgICAgICAgICAgICAgICAgICAiY2FuJ3QgbG9hZCBpbml0IGZ1bmN0aW9uIGZvciBkeW5hbWljIG1vZHVsZTogIgorICAgICAgICAgICAgICAgICAgICJCYWQgaW5kZXggZm9yICUuMTgwcyIsIGZ1bmNuYW1lICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoIGJ1ZmYsIHNpemVvZihidWZmKSwKKyAgICAgICAgICAgICAgICAgICAiY2FuJ3QgbG9hZCBpbml0IGZ1bmN0aW9uIGZvciBkeW5hbWljIG1vZHVsZTogIgorICAgICAgICAgICAgICAgICAgICJVbmtub3duIGVycm9yIGxvb2tpbmcgdXAgJS4xODBzIiwgZnVuY25hbWUgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJUHlFcnJfU2V0U3RyaW5nKCBQeUV4Y19JbXBvcnRFcnJvciwgYnVmZiApOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIHJldHZhbCA9IHVubG9hZF9hZGRfb24oIHRoZV9pZCApOwogCi0JLyogU2F2ZSB0aGUgbW9kdWxlIG5hbWUgYW5kIGltYWdlIElEIGZvciBsYXRlciBzbyB3ZSBjYW4gY2xlYW4gdXAKLQkgKiBncmFjZWZ1bGx5LgotCSAqLwotCWJlb3NfYWRkX2R5biggZnFuYW1lLCB0aGVfaWQgKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKCBQeUV4Y19JbXBvcnRFcnJvciwgYnVmZiApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gcDsKKyAgICAvKiBTYXZlIHRoZSBtb2R1bGUgbmFtZSBhbmQgaW1hZ2UgSUQgZm9yIGxhdGVyIHNvIHdlIGNhbiBjbGVhbiB1cAorICAgICAqIGdyYWNlZnVsbHkuCisgICAgICovCisgICAgYmVvc19hZGRfZHluKCBmcW5hbWUsIHRoZV9pZCApOworCisgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF9ocHV4LmMgYi9QeXRob24vZHlubG9hZF9ocHV4LmMKaW5kZXggZmVjMDgyNi4uYzZjZTE2ZSAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfaHB1eC5jCisrKyBiL1B5dGhvbi9keW5sb2FkX2hwdXguYwpAQCAtMTQsNDUgKzE0LDQ1IEBACiAjZW5kaWYKIAogY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXSA9IHsKLQl7U0hMSUJfRVhULCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JeyJtb2R1bGUiU0hMSUJfRVhULCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JezAsIDB9CisgICAge1NITElCX0VYVCwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlIlNITElCX0VYVCwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlkbF9mdW5jcHRyIHA7Ci0Jc2hsX3QgbGliOwotCWludCBmbGFnczsKLQljaGFyIGZ1bmNuYW1lWzI1OF07CisgICAgZGxfZnVuY3B0ciBwOworICAgIHNobF90IGxpYjsKKyAgICBpbnQgZmxhZ3M7CisgICAgY2hhciBmdW5jbmFtZVsyNThdOwogCi0JZmxhZ3MgPSBCSU5EX0ZJUlNUIHwgQklORF9ERUZFUlJFRDsKLQlpZiAoUHlfVmVyYm9zZUZsYWcpIHsKLQkJZmxhZ3MgPSBCSU5EX0ZJUlNUIHwgQklORF9JTU1FRElBVEUgfAotCQkJQklORF9OT05GQVRBTCB8IEJJTkRfVkVSQk9TRTsKLQkJcHJpbnRmKCJzaGxfbG9hZCAlc1xuIixwYXRobmFtZSk7Ci0JfQotCWxpYiA9IHNobF9sb2FkKHBhdGhuYW1lLCBmbGFncywgMCk7Ci0JLyogWFhYIENodWNrIEJsYWtlIG9uY2Ugd3JvdGUgdGhhdCAwIHNob3VsZCBiZSBCSU5EX05PU1RBUlQ/ICovCi0JaWYgKGxpYiA9PSBOVUxMKSB7Ci0JCWNoYXIgYnVmWzI1Nl07Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCXBlcnJvcihwYXRobmFtZSk7Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkZhaWxlZCB0byBsb2FkICUuMjAwcyIsCi0JCQkgICAgICBwYXRobmFtZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgYnVmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksIEZVTkNOQU1FX1BBVFRFUk4sIHNob3J0bmFtZSk7Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlwcmludGYoInNobF9maW5kc3ltICVzXG4iLCBmdW5jbmFtZSk7Ci0JaWYgKHNobF9maW5kc3ltKCZsaWIsIGZ1bmNuYW1lLCBUWVBFX1VOREVGSU5FRCwgKHZvaWQgKikgJnApID09IC0xKSB7Ci0JCXNobF91bmxvYWQobGliKTsKLQkJcCA9IE5VTEw7Ci0JfQotCWlmIChwID09IE5VTEwgJiYgUHlfVmVyYm9zZUZsYWcpCi0JCXBlcnJvcihmdW5jbmFtZSk7CisgICAgZmxhZ3MgPSBCSU5EX0ZJUlNUIHwgQklORF9ERUZFUlJFRDsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpIHsKKyAgICAgICAgZmxhZ3MgPSBCSU5EX0ZJUlNUIHwgQklORF9JTU1FRElBVEUgfAorICAgICAgICAgICAgQklORF9OT05GQVRBTCB8IEJJTkRfVkVSQk9TRTsKKyAgICAgICAgcHJpbnRmKCJzaGxfbG9hZCAlc1xuIixwYXRobmFtZSk7CisgICAgfQorICAgIGxpYiA9IHNobF9sb2FkKHBhdGhuYW1lLCBmbGFncywgMCk7CisgICAgLyogWFhYIENodWNrIEJsYWtlIG9uY2Ugd3JvdGUgdGhhdCAwIHNob3VsZCBiZSBCSU5EX05PU1RBUlQ/ICovCisgICAgaWYgKGxpYiA9PSBOVUxMKSB7CisgICAgICAgIGNoYXIgYnVmWzI1Nl07CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIHBlcnJvcihwYXRobmFtZSk7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkZhaWxlZCB0byBsb2FkICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGJ1Zik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeU9TX3NucHJpbnRmKGZ1bmNuYW1lLCBzaXplb2YoZnVuY25hbWUpLCBGVU5DTkFNRV9QQVRURVJOLCBzaG9ydG5hbWUpOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgcHJpbnRmKCJzaGxfZmluZHN5bSAlc1xuIiwgZnVuY25hbWUpOworICAgIGlmIChzaGxfZmluZHN5bSgmbGliLCBmdW5jbmFtZSwgVFlQRV9VTkRFRklORUQsICh2b2lkICopICZwKSA9PSAtMSkgeworICAgICAgICBzaGxfdW5sb2FkKGxpYik7CisgICAgICAgIHAgPSBOVUxMOworICAgIH0KKyAgICBpZiAocCA9PSBOVUxMICYmIFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBwZXJyb3IoZnVuY25hbWUpOwogCi0JcmV0dXJuIHA7CisgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF9uZXh0LmMgYi9QeXRob24vZHlubG9hZF9uZXh0LmMKaW5kZXggMjdkZjM1Ni4uN2U2MWI1ZCAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfbmV4dC5jCisrKyBiL1B5dGhvbi9keW5sb2FkX25leHQuYwpAQCAtOSw5ICs5LDkgQEAKICNpbmNsdWRlIDxtYWNoLW8vZHlsZC5oPgogCiBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYltdID0gewotCXsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXswLCAwfQorICAgIHsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogLyoKQEAgLTI5LDg2ICsyOSw4NiBAQAogI2RlZmluZSBMSU5LT1BUSU9OUyBOU0xJTktNT0RVTEVfT1BUSU9OX0JJTkROT1d8TlNMSU5LTU9EVUxFX09QVElPTl9SRVRVUk5fT05fRVJST1IKICNlbHNlCiAjZGVmaW5lIExJTktPUFRJT05TIE5TTElOS01PRFVMRV9PUFRJT05fQklORE5PV3wgXAotCU5TTElOS01PRFVMRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SfE5TTElOS01PRFVMRV9PUFRJT05fUFJJVkFURQorICAgIE5TTElOS01PRFVMRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SfE5TTElOS01PRFVMRV9PUFRJT05fUFJJVkFURQogI2VuZGlmCiBkbF9mdW5jcHRyIF9QeUltcG9ydF9HZXREeW5Mb2FkRnVuYyhjb25zdCBjaGFyICpmcW5hbWUsIGNvbnN0IGNoYXIgKnNob3J0bmFtZSwKLQkJCQkJY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlkbF9mdW5jcHRyIHAgPSBOVUxMOwotCWNoYXIgZnVuY25hbWVbMjU4XTsKLQlOU09iamVjdEZpbGVJbWFnZVJldHVybkNvZGUgcmM7Ci0JTlNPYmplY3RGaWxlSW1hZ2UgaW1hZ2U7Ci0JTlNNb2R1bGUgbmV3TW9kdWxlOwotCU5TU3ltYm9sIHRoZVN5bTsKLQljb25zdCBjaGFyICplcnJTdHJpbmc7Ci0JY2hhciBlcnJCdWZbNTEyXTsKKyAgICBkbF9mdW5jcHRyIHAgPSBOVUxMOworICAgIGNoYXIgZnVuY25hbWVbMjU4XTsKKyAgICBOU09iamVjdEZpbGVJbWFnZVJldHVybkNvZGUgcmM7CisgICAgTlNPYmplY3RGaWxlSW1hZ2UgaW1hZ2U7CisgICAgTlNNb2R1bGUgbmV3TW9kdWxlOworICAgIE5TU3ltYm9sIHRoZVN5bTsKKyAgICBjb25zdCBjaGFyICplcnJTdHJpbmc7CisgICAgY2hhciBlcnJCdWZbNTEyXTsKIAotCVB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksICJfaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CisgICAgUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgIl9pbml0JS4yMDBzIiwgc2hvcnRuYW1lKTsKIAogI2lmZGVmIFVTRV9EWUxEX0dMT0JBTF9OQU1FU1BBQ0UKLQlpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkKGZ1bmNuYW1lKSkgewotCQl0aGVTeW0gPSBOU0xvb2t1cEFuZEJpbmRTeW1ib2woZnVuY25hbWUpOwotCQlwID0gKGRsX2Z1bmNwdHIpTlNBZGRyZXNzT2ZTeW1ib2wodGhlU3ltKTsKLQkJcmV0dXJuIHA7Ci0JfQorICAgIGlmIChOU0lzU3ltYm9sTmFtZURlZmluZWQoZnVuY25hbWUpKSB7CisgICAgICAgIHRoZVN5bSA9IE5TTG9va3VwQW5kQmluZFN5bWJvbChmdW5jbmFtZSk7CisgICAgICAgIHAgPSAoZGxfZnVuY3B0cilOU0FkZHJlc3NPZlN5bWJvbCh0aGVTeW0pOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CiAjZW5kaWYKLQlyYyA9IE5TQ3JlYXRlT2JqZWN0RmlsZUltYWdlRnJvbUZpbGUocGF0aG5hbWUsICZpbWFnZSk7Ci0Jc3dpdGNoKHJjKSB7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VGYWlsdXJlOgotCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlRm9ybWF0OgotCQkJLyogZm9yIHRoZXNlIGEgbWVzc2FnZSBpcyBwcmludGVkIG9uIHN0ZGVyciBieSBkeWxkICovCi0JCQllcnJTdHJpbmcgPSAiQ2FuJ3QgY3JlYXRlIG9iamVjdCBmaWxlIGltYWdlIjsKLQkJYnJlYWs7Ci0JCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VTdWNjZXNzOgotCQkJZXJyU3RyaW5nID0gTlVMTDsKLQkJCWJyZWFrOwotCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlSW5hcHByb3ByaWF0ZUZpbGU6Ci0JCQllcnJTdHJpbmcgPSAiSW5hcHByb3ByaWF0ZSBmaWxlIHR5cGUgZm9yIGR5bmFtaWMgbG9hZGluZyI7Ci0JCQlicmVhazsKLQkJY2FzZSBOU09iamVjdEZpbGVJbWFnZUFyY2g6Ci0JCQllcnJTdHJpbmcgPSAiV3JvbmcgQ1BVIHR5cGUgaW4gb2JqZWN0IGZpbGUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VBY2Nlc3M6Ci0JCQllcnJTdHJpbmcgPSAiQ2FuJ3QgcmVhZCBvYmplY3QgZmlsZSAobm8gYWNjZXNzKSI7Ci0JCQlicmVhazsKLQl9Ci0JaWYgKGVyclN0cmluZyA9PSBOVUxMKSB7Ci0JCW5ld01vZHVsZSA9IE5TTGlua01vZHVsZShpbWFnZSwgcGF0aG5hbWUsIExJTktPUFRJT05TKTsKLQkJaWYgKG5ld01vZHVsZSA9PSBOVUxMKSB7Ci0JCQlpbnQgZXJyTm87Ci0JCQljb25zdCBjaGFyICpmaWxlTmFtZSwgKm1vcmVFcnJvclN0cjsKLQkJCU5TTGlua0VkaXRFcnJvcnMgYzsKLQkJCU5TTGlua0VkaXRFcnJvciggJmMsICZlcnJObywgJmZpbGVOYW1lLCAmbW9yZUVycm9yU3RyICk7Ci0JCQlQeU9TX3NucHJpbnRmKGVyckJ1ZiwgNTEyLCAiRmFpbHVyZSBsaW5raW5nIG5ldyBtb2R1bGU6ICVzOiAlcyIsIAotCQkJCQlmaWxlTmFtZSwgbW9yZUVycm9yU3RyKTsKLQkJCWVyclN0cmluZyA9IGVyckJ1ZjsKLQkJfQotCX0KLQlpZiAoZXJyU3RyaW5nICE9IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJTdHJpbmcpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcmMgPSBOU0NyZWF0ZU9iamVjdEZpbGVJbWFnZUZyb21GaWxlKHBhdGhuYW1lLCAmaW1hZ2UpOworICAgIHN3aXRjaChyYykgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlRmFpbHVyZToKKyAgICAgICAgY2FzZSBOU09iamVjdEZpbGVJbWFnZUZvcm1hdDoKKyAgICAgICAgICAgIC8qIGZvciB0aGVzZSBhIG1lc3NhZ2UgaXMgcHJpbnRlZCBvbiBzdGRlcnIgYnkgZHlsZCAqLworICAgICAgICAgICAgZXJyU3RyaW5nID0gIkNhbid0IGNyZWF0ZSBvYmplY3QgZmlsZSBpbWFnZSI7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlU3VjY2VzczoKKyAgICAgICAgICAgIGVyclN0cmluZyA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOU09iamVjdEZpbGVJbWFnZUluYXBwcm9wcmlhdGVGaWxlOgorICAgICAgICAgICAgZXJyU3RyaW5nID0gIkluYXBwcm9wcmlhdGUgZmlsZSB0eXBlIGZvciBkeW5hbWljIGxvYWRpbmciOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTlNPYmplY3RGaWxlSW1hZ2VBcmNoOgorICAgICAgICAgICAgZXJyU3RyaW5nID0gIldyb25nIENQVSB0eXBlIGluIG9iamVjdCBmaWxlIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlQWNjZXNzOgorICAgICAgICAgICAgZXJyU3RyaW5nID0gIkNhbid0IHJlYWQgb2JqZWN0IGZpbGUgKG5vIGFjY2VzcykiOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChlcnJTdHJpbmcgPT0gTlVMTCkgeworICAgICAgICBuZXdNb2R1bGUgPSBOU0xpbmtNb2R1bGUoaW1hZ2UsIHBhdGhuYW1lLCBMSU5LT1BUSU9OUyk7CisgICAgICAgIGlmIChuZXdNb2R1bGUgPT0gTlVMTCkgeworICAgICAgICAgICAgaW50IGVyck5vOworICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsICptb3JlRXJyb3JTdHI7CisgICAgICAgICAgICBOU0xpbmtFZGl0RXJyb3JzIGM7CisgICAgICAgICAgICBOU0xpbmtFZGl0RXJyb3IoICZjLCAmZXJyTm8sICZmaWxlTmFtZSwgJm1vcmVFcnJvclN0ciApOworICAgICAgICAgICAgUHlPU19zbnByaW50ZihlcnJCdWYsIDUxMiwgIkZhaWx1cmUgbGlua2luZyBuZXcgbW9kdWxlOiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLCBtb3JlRXJyb3JTdHIpOworICAgICAgICAgICAgZXJyU3RyaW5nID0gZXJyQnVmOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlcnJTdHJpbmcgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGVyclN0cmluZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNpZmRlZiBVU0VfRFlMRF9HTE9CQUxfTkFNRVNQQUNFCi0JaWYgKCFOU0lzU3ltYm9sTmFtZURlZmluZWQoZnVuY25hbWUpKSB7Ci0JCS8qIFVubGlua01vZHVsZSgpIGlzbid0IGltcGxlbWVudGVkIGluIGN1cnJlbnQgdmVyc2lvbnMsIGJ1dCBjYWxsaW5nIGl0IGRvZXMgbm8gaGFybSAqLwotCQkvKiBOU1VuTGlua01vZHVsZShuZXdNb2R1bGUsIEZBTFNFKTsgcmVtb3ZlZDogY2F1c2VzIHByb2JsZW1zIGZvciBPYmpDIGNvZGUgKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSAiTG9hZGVkIG1vZHVsZSBkb2VzIG5vdCBjb250YWluIHN5bWJvbCAlLjIwMHMiLAotCQkJCSBmdW5jbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl0aGVTeW0gPSBOU0xvb2t1cEFuZEJpbmRTeW1ib2woZnVuY25hbWUpOworICAgIGlmICghTlNJc1N5bWJvbE5hbWVEZWZpbmVkKGZ1bmNuYW1lKSkgeworICAgICAgICAvKiBVbmxpbmtNb2R1bGUoKSBpc24ndCBpbXBsZW1lbnRlZCBpbiBjdXJyZW50IHZlcnNpb25zLCBidXQgY2FsbGluZyBpdCBkb2VzIG5vIGhhcm0gKi8KKyAgICAgICAgLyogTlNVbkxpbmtNb2R1bGUobmV3TW9kdWxlLCBGQUxTRSk7IHJlbW92ZWQ6IGNhdXNlcyBwcm9ibGVtcyBmb3IgT2JqQyBjb2RlICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTG9hZGVkIG1vZHVsZSBkb2VzIG5vdCBjb250YWluIHN5bWJvbCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHRoZVN5bSA9IE5TTG9va3VwQW5kQmluZFN5bWJvbChmdW5jbmFtZSk7CiAjZWxzZQotCXRoZVN5bSA9IE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUobmV3TW9kdWxlLCBmdW5jbmFtZSk7Ci0JaWYgKCB0aGVTeW0gPT0gTlVMTCApIHsKLQkJLyogTlNVbkxpbmtNb2R1bGUobmV3TW9kdWxlLCBGQUxTRSk7IHJlbW92ZWQ6IGNhdXNlcyBwcm9ibGVtcyBmb3IgT2JqQyBjb2RlICovCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkgIkxvYWRlZCBtb2R1bGUgZG9lcyBub3QgY29udGFpbiBzeW1ib2wgJS4yMDBzIiwKLQkJCQkgZnVuY25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgdGhlU3ltID0gTlNMb29rdXBTeW1ib2xJbk1vZHVsZShuZXdNb2R1bGUsIGZ1bmNuYW1lKTsKKyAgICBpZiAoIHRoZVN5bSA9PSBOVUxMICkgeworICAgICAgICAvKiBOU1VuTGlua01vZHVsZShuZXdNb2R1bGUsIEZBTFNFKTsgcmVtb3ZlZDogY2F1c2VzIHByb2JsZW1zIGZvciBPYmpDIGNvZGUgKi8KKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJMb2FkZWQgbW9kdWxlIGRvZXMgbm90IGNvbnRhaW4gc3ltYm9sICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlwID0gKGRsX2Z1bmNwdHIpTlNBZGRyZXNzT2ZTeW1ib2wodGhlU3ltKTsKLQlyZXR1cm4gcDsKKyAgICBwID0gKGRsX2Z1bmNwdHIpTlNBZGRyZXNzT2ZTeW1ib2wodGhlU3ltKTsKKyAgICByZXR1cm4gcDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX29zMi5jIGIvUHl0aG9uL2R5bmxvYWRfb3MyLmMKaW5kZXggZDY2MGUyNy4uZTNmZGI3MCAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfb3MyLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfb3MyLmMKQEAgLTEwLDM3ICsxMCwzNyBAQAogCiAKIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiW10gPSB7Ci0JeyIucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsiLmRsbCIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7MCwgMH0KKyAgICB7Ii5weWQiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyIuZGxsIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlkbF9mdW5jcHRyIHA7Ci0JQVBJUkVUICByYzsKLQlITU9EVUxFIGhETEw7Ci0JY2hhciBmYWlscmVhc29uWzI1Nl07Ci0JY2hhciBmdW5jbmFtZVsyNThdOworICAgIGRsX2Z1bmNwdHIgcDsKKyAgICBBUElSRVQgIHJjOworICAgIEhNT0RVTEUgaERMTDsKKyAgICBjaGFyIGZhaWxyZWFzb25bMjU2XTsKKyAgICBjaGFyIGZ1bmNuYW1lWzI1OF07CiAKLQlyYyA9IERvc0xvYWRNb2R1bGUoZmFpbHJlYXNvbiwKLQkJCSAgIHNpemVvZihmYWlscmVhc29uKSwKLQkJCSAgIHBhdGhuYW1lLAotCQkJICAgJmhETEwpOworICAgIHJjID0gRG9zTG9hZE1vZHVsZShmYWlscmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmFpbHJlYXNvbiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAmaERMTCk7CiAKLQlpZiAocmMgIT0gTk9fRVJST1IpIHsKLQkJY2hhciBlcnJCdWZbMjU2XTsKLQkJUHlPU19zbnByaW50ZihlcnJCdWYsIHNpemVvZihlcnJCdWYpLAotCQkJICAgICAgIkRMTCBsb2FkIGZhaWxlZCwgcmMgPSAlZDogJS4yMDBzIiwKLQkJCSAgICAgIHJjLCBmYWlscmVhc29uKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJCdWYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGNoYXIgZXJyQnVmWzI1Nl07CisgICAgICAgIFB5T1Nfc25wcmludGYoZXJyQnVmLCBzaXplb2YoZXJyQnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRExMIGxvYWQgZmFpbGVkLCByYyA9ICVkOiAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgIHJjLCBmYWlscmVhc29uKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJCdWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeU9TX3NucHJpbnRmKGZ1bmNuYW1lLCBzaXplb2YoZnVuY25hbWUpLCAiaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7Ci0JcmMgPSBEb3NRdWVyeVByb2NBZGRyKGhETEwsIDBMLCBmdW5jbmFtZSwgJnApOwotCWlmIChyYyAhPSBOT19FUlJPUikKLQkJcCA9IE5VTEw7IC8qIFNpZ25pZnkgRmFpbHVyZSB0byBBY3F1aXJlIEVudHJ5cG9pbnQgKi8KLQlyZXR1cm4gcDsKKyAgICBQeU9TX3NucHJpbnRmKGZ1bmNuYW1lLCBzaXplb2YoZnVuY25hbWUpLCAiaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CisgICAgcmMgPSBEb3NRdWVyeVByb2NBZGRyKGhETEwsIDBMLCBmdW5jbmFtZSwgJnApOworICAgIGlmIChyYyAhPSBOT19FUlJPUikKKyAgICAgICAgcCA9IE5VTEw7IC8qIFNpZ25pZnkgRmFpbHVyZSB0byBBY3F1aXJlIEVudHJ5cG9pbnQgKi8KKyAgICByZXR1cm4gcDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX3NobGliLmMgYi9QeXRob24vZHlubG9hZF9zaGxpYi5jCmluZGV4IGYxMmE5M2MuLjE3ZWJhYjEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9keW5sb2FkX3NobGliLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfc2hsaWIuYwpAQCAtMzMsMTExICszMywxMTEgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXSA9IHsKICNpZmRlZiBfX0NZR1dJTl9fCi0JeyIuZGxsIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsibW9kdWxlLmRsbCIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Ii5kbGwiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyJtb2R1bGUuZGxsIiwgInJiIiwgQ19FWFRFTlNJT059LAogI2Vsc2UKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKQotCXsiLnB5ZCIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7Ii5kbGwiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyIucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiLmRsbCIsICJyYiIsIENfRVhURU5TSU9OfSwKICNlbHNlCiAjaWZkZWYgX19WTVMKLSAgICAgICAgeyIuZXhlIiwgInJiIiwgQ19FWFRFTlNJT059LAotICAgICAgICB7Ii5FWEUiLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0gICAgICAgIHsibW9kdWxlLmV4ZSIsICJyYiIsIENfRVhURU5TSU9OfSwKLSAgICAgICAgeyJNT0RVTEUuRVhFIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiLmV4ZSIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Ii5FWEUiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyJtb2R1bGUuZXhlIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiTU9EVUxFLkVYRSIsICJyYiIsIENfRVhURU5TSU9OfSwKICNlbHNlCi0JeyIuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JeyJtb2R1bGUuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyIuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyJtb2R1bGUuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCiAjZW5kaWYKICNlbmRpZgogI2VuZGlmCi0JezAsIDB9CisgICAgezAsIDB9CiB9OwogCiBzdGF0aWMgc3RydWN0IHsKLQlkZXZfdCBkZXY7CisgICAgZGV2X3QgZGV2OwogI2lmZGVmIF9fVk1TCi0JaW5vX3QgaW5vWzNdOworICAgIGlub190IGlub1szXTsKICNlbHNlCi0JaW5vX3QgaW5vOworICAgIGlub190IGlubzsKICNlbmRpZgotCXZvaWQgKmhhbmRsZTsKKyAgICB2b2lkICpoYW5kbGU7CiB9IGhhbmRsZXNbMTI4XTsKIHN0YXRpYyBpbnQgbmhhbmRsZXMgPSAwOwogCiAKIGRsX2Z1bmNwdHIgX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKGNvbnN0IGNoYXIgKmZxbmFtZSwgY29uc3QgY2hhciAqc2hvcnRuYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JZGxfZnVuY3B0ciBwOwotCXZvaWQgKmhhbmRsZTsKLQljaGFyIGZ1bmNuYW1lWzI1OF07Ci0JY2hhciBwYXRoYnVmWzI2MF07Ci0gICAgICAgIGludCBkbG9wZW5mbGFncz0wOworICAgIGRsX2Z1bmNwdHIgcDsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgY2hhciBmdW5jbmFtZVsyNThdOworICAgIGNoYXIgcGF0aGJ1ZlsyNjBdOworICAgIGludCBkbG9wZW5mbGFncz0wOwogCi0JaWYgKHN0cmNocihwYXRobmFtZSwgJy8nKSA9PSBOVUxMKSB7Ci0JCS8qIFByZWZpeCBiYXJlIGZpbGVuYW1lIHdpdGggIi4vIiAqLwotCQlQeU9TX3NucHJpbnRmKHBhdGhidWYsIHNpemVvZihwYXRoYnVmKSwgIi4vJS0uMjU1cyIsIHBhdGhuYW1lKTsKLQkJcGF0aG5hbWUgPSBwYXRoYnVmOwotCX0KKyAgICBpZiAoc3RyY2hyKHBhdGhuYW1lLCAnLycpID09IE5VTEwpIHsKKyAgICAgICAgLyogUHJlZml4IGJhcmUgZmlsZW5hbWUgd2l0aCAiLi8iICovCisgICAgICAgIFB5T1Nfc25wcmludGYocGF0aGJ1Ziwgc2l6ZW9mKHBhdGhidWYpLCAiLi8lLS4yNTVzIiwgcGF0aG5hbWUpOworICAgICAgICBwYXRobmFtZSA9IHBhdGhidWY7CisgICAgfQogCi0JUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgCi0JCSAgICAgIExFQURfVU5ERVJTQ09SRSAiaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CisgICAgUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwKKyAgICAgICAgICAgICAgICAgIExFQURfVU5ERVJTQ09SRSAiaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CiAKLQlpZiAoZnAgIT0gTlVMTCkgewotCQlpbnQgaTsKLQkJc3RydWN0IHN0YXQgc3RhdGI7Ci0JCWZzdGF0KGZpbGVubyhmcCksICZzdGF0Yik7Ci0JCWZvciAoaSA9IDA7IGkgPCBuaGFuZGxlczsgaSsrKSB7Ci0JCQlpZiAoc3RhdGIuc3RfZGV2ID09IGhhbmRsZXNbaV0uZGV2ICYmCi0JCQkgICAgc3RhdGIuc3RfaW5vID09IGhhbmRsZXNbaV0uaW5vKSB7Ci0JCQkJcCA9IChkbF9mdW5jcHRyKSBkbHN5bShoYW5kbGVzW2ldLmhhbmRsZSwKLQkJCQkJCSAgICAgICBmdW5jbmFtZSk7Ci0JCQkJcmV0dXJuIHA7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5oYW5kbGVzIDwgMTI4KSB7Ci0JCQloYW5kbGVzW25oYW5kbGVzXS5kZXYgPSBzdGF0Yi5zdF9kZXY7CisgICAgaWYgKGZwICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHN0cnVjdCBzdGF0IHN0YXRiOworICAgICAgICBmc3RhdChmaWxlbm8oZnApLCAmc3RhdGIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmhhbmRsZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHN0YXRiLnN0X2RldiA9PSBoYW5kbGVzW2ldLmRldiAmJgorICAgICAgICAgICAgICAgIHN0YXRiLnN0X2lubyA9PSBoYW5kbGVzW2ldLmlubykgeworICAgICAgICAgICAgICAgIHAgPSAoZGxfZnVuY3B0cikgZGxzeW0oaGFuZGxlc1tpXS5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5oYW5kbGVzIDwgMTI4KSB7CisgICAgICAgICAgICBoYW5kbGVzW25oYW5kbGVzXS5kZXYgPSBzdGF0Yi5zdF9kZXY7CiAjaWZkZWYgX19WTVMKLQkJCWhhbmRsZXNbbmhhbmRsZXNdLmlub1swXSA9IHN0YXRiLnN0X2lub1swXTsKLQkJCWhhbmRsZXNbbmhhbmRsZXNdLmlub1sxXSA9IHN0YXRiLnN0X2lub1sxXTsKLQkJCWhhbmRsZXNbbmhhbmRsZXNdLmlub1syXSA9IHN0YXRiLnN0X2lub1syXTsKKyAgICAgICAgICAgIGhhbmRsZXNbbmhhbmRsZXNdLmlub1swXSA9IHN0YXRiLnN0X2lub1swXTsKKyAgICAgICAgICAgIGhhbmRsZXNbbmhhbmRsZXNdLmlub1sxXSA9IHN0YXRiLnN0X2lub1sxXTsKKyAgICAgICAgICAgIGhhbmRsZXNbbmhhbmRsZXNdLmlub1syXSA9IHN0YXRiLnN0X2lub1syXTsKICNlbHNlCi0JCQloYW5kbGVzW25oYW5kbGVzXS5pbm8gPSBzdGF0Yi5zdF9pbm87CisgICAgICAgICAgICBoYW5kbGVzW25oYW5kbGVzXS5pbm8gPSBzdGF0Yi5zdF9pbm87CiAjZW5kaWYKLQkJfQotCX0KKyAgICAgICAgfQorICAgIH0KIAogI2lmICEoZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykpCi0gICAgICAgIGRsb3BlbmZsYWdzID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwLT5kbG9wZW5mbGFnczsKKyAgICBkbG9wZW5mbGFncyA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycC0+ZGxvcGVuZmxhZ3M7CiAjZW5kaWYKIAotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImRsb3BlbihcIiVzXCIsICV4KTtcbiIsIHBhdGhuYW1lLCAKLQkJCQkgIGRsb3BlbmZsYWdzKTsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJkbG9wZW4oXCIlc1wiLCAleCk7XG4iLCBwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGxvcGVuZmxhZ3MpOwogCiAjaWZkZWYgX19WTVMKLQkvKiBWTVMgY3VycmVudGx5IGRvbid0IGFsbG93IGEgcGF0aG5hbWUsIHVzZSBhIGxvZ2ljYWwgbmFtZSBpbnN0ZWFkICovCi0JLyogQ29uY2F0ZW5hdGUgJ3B5dGhvbl9tb2R1bGVfJyBhbmQgc2hvcnRuYW1lICovCi0JLyogc28gImltcG9ydCB2bXMuYmFyIiB3aWxsIHVzZSB0aGUgbG9naWNhbCBweXRob25fbW9kdWxlX2JhciAqLwotCS8qIEFzIEMgbW9kdWxlIHVzZSBvbmx5IG9uZSBuYW1lIHNwYWNlIHRoaXMgaXMgcHJvYmFibHkgbm90IGEgKi8KLQkvKiBpbXBvcnRhbnQgbGltaXRhdGlvbiAqLwotCVB5T1Nfc25wcmludGYocGF0aGJ1Ziwgc2l6ZW9mKHBhdGhidWYpLCAicHl0aG9uX21vZHVsZV8lLS4yMDBzIiwgCi0JCSAgICAgIHNob3J0bmFtZSk7Ci0JcGF0aG5hbWUgPSBwYXRoYnVmOworICAgIC8qIFZNUyBjdXJyZW50bHkgZG9uJ3QgYWxsb3cgYSBwYXRobmFtZSwgdXNlIGEgbG9naWNhbCBuYW1lIGluc3RlYWQgKi8KKyAgICAvKiBDb25jYXRlbmF0ZSAncHl0aG9uX21vZHVsZV8nIGFuZCBzaG9ydG5hbWUgKi8KKyAgICAvKiBzbyAiaW1wb3J0IHZtcy5iYXIiIHdpbGwgdXNlIHRoZSBsb2dpY2FsIHB5dGhvbl9tb2R1bGVfYmFyICovCisgICAgLyogQXMgQyBtb2R1bGUgdXNlIG9ubHkgb25lIG5hbWUgc3BhY2UgdGhpcyBpcyBwcm9iYWJseSBub3QgYSAqLworICAgIC8qIGltcG9ydGFudCBsaW1pdGF0aW9uICovCisgICAgUHlPU19zbnByaW50ZihwYXRoYnVmLCBzaXplb2YocGF0aGJ1ZiksICJweXRob25fbW9kdWxlXyUtLjIwMHMiLAorICAgICAgICAgICAgICAgICAgc2hvcnRuYW1lKTsKKyAgICBwYXRobmFtZSA9IHBhdGhidWY7CiAjZW5kaWYKIAotCWhhbmRsZSA9IGRsb3BlbihwYXRobmFtZSwgZGxvcGVuZmxhZ3MpOworICAgIGhhbmRsZSA9IGRsb3BlbihwYXRobmFtZSwgZGxvcGVuZmxhZ3MpOwogCi0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCWNvbnN0IGNoYXIgKmVycm9yID0gZGxlcnJvcigpOwotCQlpZiAoZXJyb3IgPT0gTlVMTCkKLQkJCWVycm9yID0gInVua25vd24gZGxvcGVuKCkgZXJyb3IiOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChmcCAhPSBOVUxMICYmIG5oYW5kbGVzIDwgMTI4KQotCQloYW5kbGVzW25oYW5kbGVzKytdLmhhbmRsZSA9IGhhbmRsZTsKLQlwID0gKGRsX2Z1bmNwdHIpIGRsc3ltKGhhbmRsZSwgZnVuY25hbWUpOwotCXJldHVybiBwOworICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBjb25zdCBjaGFyICplcnJvciA9IGRsZXJyb3IoKTsKKyAgICAgICAgaWYgKGVycm9yID09IE5VTEwpCisgICAgICAgICAgICBlcnJvciA9ICJ1bmtub3duIGRsb3BlbigpIGVycm9yIjsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZnAgIT0gTlVMTCAmJiBuaGFuZGxlcyA8IDEyOCkKKyAgICAgICAgaGFuZGxlc1tuaGFuZGxlcysrXS5oYW5kbGUgPSBoYW5kbGU7CisgICAgcCA9IChkbF9mdW5jcHRyKSBkbHN5bShoYW5kbGUsIGZ1bmNuYW1lKTsKKyAgICByZXR1cm4gcDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX3dpbi5jIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKaW5kZXggOTA3YTVhMy4uNGU1NTU1ZSAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfd2luLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKQEAgLTE3LDExICsxNywxMSBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYltdID0gewogI2lmZGVmIF9ERUJVRwotCXsiX2QucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiX2QucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAogI2Vsc2UKLQl7Ii5weWQiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyIucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAogI2VuZGlmCi0JezAsIDB9CisgICAgezAsIDB9CiB9OwogCiAKQEAgLTI5LDE4ICsyOSwxOCBAQAogICAgQyBSVEwgaW1wbGVtZW50YXRpb25zICovCiAKIHN0YXRpYyBpbnQgc3RyY2FzZWNtcCAoY2hhciAqc3RyaW5nMSwgY2hhciAqc3RyaW5nMikKLXsgCi0JaW50IGZpcnN0LCBzZWNvbmQ7Cit7CisgICAgaW50IGZpcnN0LCBzZWNvbmQ7CiAKLQlkbyB7Ci0JCWZpcnN0ICA9IHRvbG93ZXIoKnN0cmluZzEpOwotCQlzZWNvbmQgPSB0b2xvd2VyKCpzdHJpbmcyKTsKLQkJc3RyaW5nMSsrOwotCQlzdHJpbmcyKys7Ci0JfSB3aGlsZSAoZmlyc3QgJiYgZmlyc3QgPT0gc2Vjb25kKTsKKyAgICBkbyB7CisgICAgICAgIGZpcnN0ICA9IHRvbG93ZXIoKnN0cmluZzEpOworICAgICAgICBzZWNvbmQgPSB0b2xvd2VyKCpzdHJpbmcyKTsKKyAgICAgICAgc3RyaW5nMSsrOworICAgICAgICBzdHJpbmcyKys7CisgICAgfSB3aGlsZSAoZmlyc3QgJiYgZmlyc3QgPT0gc2Vjb25kKTsKIAotCXJldHVybiAoZmlyc3QgLSBzZWNvbmQpOwotfSAKKyAgICByZXR1cm4gKGZpcnN0IC0gc2Vjb25kKTsKK30KIAogCiAvKiBGdW5jdGlvbiB0byByZXR1cm4gdGhlIG5hbWUgb2YgdGhlICJweXRob24iIERMTCB0aGF0IHRoZSBzdXBwbGllZCBtb2R1bGUKQEAgLTY2LDIwOSArNjYsMjA5IEBACiAKIHN0YXRpYyBjaGFyICpHZXRQeXRob25JbXBvcnQgKEhJTlNUQU5DRSBoTW9kdWxlKQogewotCXVuc2lnbmVkIGNoYXIgKmRsbGJhc2UsICppbXBvcnRfZGF0YSwgKmltcG9ydF9uYW1lOwotCURXT1JEIHBlX29mZnNldCwgb3B0X29mZnNldDsKLQlXT1JEIG9wdF9tYWdpYzsKLQlpbnQgbnVtX2RpY3Rfb2ZmLCBpbXBvcnRfb2ZmOworICAgIHVuc2lnbmVkIGNoYXIgKmRsbGJhc2UsICppbXBvcnRfZGF0YSwgKmltcG9ydF9uYW1lOworICAgIERXT1JEIHBlX29mZnNldCwgb3B0X29mZnNldDsKKyAgICBXT1JEIG9wdF9tYWdpYzsKKyAgICBpbnQgbnVtX2RpY3Rfb2ZmLCBpbXBvcnRfb2ZmOwogCi0JLyogU2FmZXR5IGNoZWNrIGlucHV0ICovCi0JaWYgKGhNb2R1bGUgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogU2FmZXR5IGNoZWNrIGlucHV0ICovCisgICAgaWYgKGhNb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBNb2R1bGUgaW5zdGFuY2UgaXMgYWxzbyB0aGUgYmFzZSBsb2FkIGFkZHJlc3MuICBGaXJzdCBwb3J0aW9uIG9mCi0JICAgbWVtb3J5IGlzIHRoZSBNUy1ET1MgbG9hZGVyLCB3aGljaCBob2xkcyB0aGUgb2Zmc2V0IHRvIHRoZSBQRQotCSAgIGhlYWRlciAoZnJvbSB0aGUgbG9hZCBiYXNlKSBhdCAweDNDICovCi0JZGxsYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopaE1vZHVsZTsKLQlwZV9vZmZzZXQgPSBEV09SRF9BVChkbGxiYXNlICsgMHgzQyk7CisgICAgLyogTW9kdWxlIGluc3RhbmNlIGlzIGFsc28gdGhlIGJhc2UgbG9hZCBhZGRyZXNzLiAgRmlyc3QgcG9ydGlvbiBvZgorICAgICAgIG1lbW9yeSBpcyB0aGUgTVMtRE9TIGxvYWRlciwgd2hpY2ggaG9sZHMgdGhlIG9mZnNldCB0byB0aGUgUEUKKyAgICAgICBoZWFkZXIgKGZyb20gdGhlIGxvYWQgYmFzZSkgYXQgMHgzQyAqLworICAgIGRsbGJhc2UgPSAodW5zaWduZWQgY2hhciAqKWhNb2R1bGU7CisgICAgcGVfb2Zmc2V0ID0gRFdPUkRfQVQoZGxsYmFzZSArIDB4M0MpOwogCi0JLyogVGhlIFBFIHNpZ25hdHVyZSBtdXN0IGJlICJQRVwwXDAiICovCi0JaWYgKG1lbWNtcChkbGxiYXNlK3BlX29mZnNldCwiUEVcMFwwIiw0KSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogVGhlIFBFIHNpZ25hdHVyZSBtdXN0IGJlICJQRVwwXDAiICovCisgICAgaWYgKG1lbWNtcChkbGxiYXNlK3BlX29mZnNldCwiUEVcMFwwIiw0KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBGb2xsb3dpbmcgdGhlIFBFIHNpZ25hdHVyZSBpcyB0aGUgc3RhbmRhcmQgQ09GRiBoZWFkZXIgKDIwCi0JICAgYnl0ZXMpIGFuZCB0aGVuIHRoZSBvcHRpb25hbCBoZWFkZXIuICBUaGUgb3B0aW9uYWwgaGVhZGVyIHN0YXJ0cwotCSAgIHdpdGggYSBtYWdpYyB2YWx1ZSBvZiAweDEwQiBmb3IgUEUzMiBvciAweDIwQiBmb3IgUEUzMisgKFBFMzIrCi0JICAgdXNlcyA2NC1iaXRzIGZvciBzb21lIGZpZWxkcykuICBJdCBtaWdodCBhbHNvIGJlIDB4MTA3IGZvciBhIFJPTQotCSAgIGltYWdlLCBidXQgd2UgZG9uJ3QgcHJvY2VzcyB0aGF0IGhlcmUuCisgICAgLyogRm9sbG93aW5nIHRoZSBQRSBzaWduYXR1cmUgaXMgdGhlIHN0YW5kYXJkIENPRkYgaGVhZGVyICgyMAorICAgICAgIGJ5dGVzKSBhbmQgdGhlbiB0aGUgb3B0aW9uYWwgaGVhZGVyLiAgVGhlIG9wdGlvbmFsIGhlYWRlciBzdGFydHMKKyAgICAgICB3aXRoIGEgbWFnaWMgdmFsdWUgb2YgMHgxMEIgZm9yIFBFMzIgb3IgMHgyMEIgZm9yIFBFMzIrIChQRTMyKworICAgICAgIHVzZXMgNjQtYml0cyBmb3Igc29tZSBmaWVsZHMpLiAgSXQgbWlnaHQgYWxzbyBiZSAweDEwNyBmb3IgYSBST00KKyAgICAgICBpbWFnZSwgYnV0IHdlIGRvbid0IHByb2Nlc3MgdGhhdCBoZXJlLgogCi0JICAgVGhlIG9wdGlvbmFsIGhlYWRlciBlbmRzIHdpdGggYSBkYXRhIGRpY3Rpb25hcnkgdGhhdCBkaXJlY3RseQotCSAgIHBvaW50cyB0byBjZXJ0YWluIHR5cGVzIG9mIGRhdGEsIGFtb25nIHRoZW0gdGhlIGltcG9ydCBlbnRyaWVzCi0JICAgKGluIHRoZSBzZWNvbmQgdGFibGUgZW50cnkpLiBCYXNlZCBvbiB0aGUgaGVhZGVyIHR5cGUsIHdlCi0JICAgZGV0ZXJtaW5lIG9mZnNldHMgZm9yIHRoZSBkYXRhIGRpY3Rpb25hcnkgY291bnQgYW5kIHRoZSBlbnRyeQotCSAgIHdpdGhpbiB0aGUgZGljdGlvbmFyeSBwb2ludGluZyB0byB0aGUgaW1wb3J0cy4gKi8KKyAgICAgICBUaGUgb3B0aW9uYWwgaGVhZGVyIGVuZHMgd2l0aCBhIGRhdGEgZGljdGlvbmFyeSB0aGF0IGRpcmVjdGx5CisgICAgICAgcG9pbnRzIHRvIGNlcnRhaW4gdHlwZXMgb2YgZGF0YSwgYW1vbmcgdGhlbSB0aGUgaW1wb3J0IGVudHJpZXMKKyAgICAgICAoaW4gdGhlIHNlY29uZCB0YWJsZSBlbnRyeSkuIEJhc2VkIG9uIHRoZSBoZWFkZXIgdHlwZSwgd2UKKyAgICAgICBkZXRlcm1pbmUgb2Zmc2V0cyBmb3IgdGhlIGRhdGEgZGljdGlvbmFyeSBjb3VudCBhbmQgdGhlIGVudHJ5CisgICAgICAgd2l0aGluIHRoZSBkaWN0aW9uYXJ5IHBvaW50aW5nIHRvIHRoZSBpbXBvcnRzLiAqLwogCi0Jb3B0X29mZnNldCA9IHBlX29mZnNldCArIDQgKyAyMDsKLQlvcHRfbWFnaWMgPSBXT1JEX0FUKGRsbGJhc2Urb3B0X29mZnNldCk7Ci0JaWYgKG9wdF9tYWdpYyA9PSAweDEwQikgewotCQkvKiBQRTMyICovCi0JCW51bV9kaWN0X29mZiA9IDkyOwotCQlpbXBvcnRfb2ZmICAgPSAxMDQ7Ci0JfSBlbHNlIGlmIChvcHRfbWFnaWMgPT0gMHgyMEIpIHsKLQkJLyogUEUzMisgKi8KLQkJbnVtX2RpY3Rfb2ZmID0gMTA4OwotCQlpbXBvcnRfb2ZmICAgPSAxMjA7Ci0JfSBlbHNlIHsKLQkJLyogVW5zdXBwb3J0ZWQgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG9wdF9vZmZzZXQgPSBwZV9vZmZzZXQgKyA0ICsgMjA7CisgICAgb3B0X21hZ2ljID0gV09SRF9BVChkbGxiYXNlK29wdF9vZmZzZXQpOworICAgIGlmIChvcHRfbWFnaWMgPT0gMHgxMEIpIHsKKyAgICAgICAgLyogUEUzMiAqLworICAgICAgICBudW1fZGljdF9vZmYgPSA5MjsKKyAgICAgICAgaW1wb3J0X29mZiAgID0gMTA0OworICAgIH0gZWxzZSBpZiAob3B0X21hZ2ljID09IDB4MjBCKSB7CisgICAgICAgIC8qIFBFMzIrICovCisgICAgICAgIG51bV9kaWN0X29mZiA9IDEwODsKKyAgICAgICAgaW1wb3J0X29mZiAgID0gMTIwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFVuc3VwcG9ydGVkICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIE5vdyBpZiBhbiBpbXBvcnQgdGFibGUgZXhpc3RzLCBvZmZzZXQgdG8gaXQgYW5kIHdhbGsgdGhlIGxpc3Qgb2YKLQkgICBpbXBvcnRzLiAgVGhlIGltcG9ydCB0YWJsZSBpcyBhbiBhcnJheSAoZW5kaW5nIHdoZW4gYW4gZW50cnkgaGFzCi0JICAgZW1wdHkgdmFsdWVzKSBvZiBzdHJ1Y3R1cmVzICgyMCBieXRlcyBlYWNoKSwgd2hpY2ggY29udGFpbnMgKGF0Ci0JICAgb2Zmc2V0IDEyKSBhIHJlbGF0aXZlIGFkZHJlc3MgKHRvIHRoZSBtb2R1bGUgYmFzZSkgYXQgd2hpY2ggYQotCSAgIHN0cmluZyBjb25zdGFudCBob2xkaW5nIHRoZSBpbXBvcnQgbmFtZSBpcyBsb2NhdGVkLiAqLworICAgIC8qIE5vdyBpZiBhbiBpbXBvcnQgdGFibGUgZXhpc3RzLCBvZmZzZXQgdG8gaXQgYW5kIHdhbGsgdGhlIGxpc3Qgb2YKKyAgICAgICBpbXBvcnRzLiAgVGhlIGltcG9ydCB0YWJsZSBpcyBhbiBhcnJheSAoZW5kaW5nIHdoZW4gYW4gZW50cnkgaGFzCisgICAgICAgZW1wdHkgdmFsdWVzKSBvZiBzdHJ1Y3R1cmVzICgyMCBieXRlcyBlYWNoKSwgd2hpY2ggY29udGFpbnMgKGF0CisgICAgICAgb2Zmc2V0IDEyKSBhIHJlbGF0aXZlIGFkZHJlc3MgKHRvIHRoZSBtb2R1bGUgYmFzZSkgYXQgd2hpY2ggYQorICAgICAgIHN0cmluZyBjb25zdGFudCBob2xkaW5nIHRoZSBpbXBvcnQgbmFtZSBpcyBsb2NhdGVkLiAqLwogCi0JaWYgKERXT1JEX0FUKGRsbGJhc2UgKyBvcHRfb2Zmc2V0ICsgbnVtX2RpY3Rfb2ZmKSA+PSAyKSB7Ci0JCS8qIFdlIGhhdmUgYXQgbGVhc3QgMiB0YWJsZXMgLSB0aGUgaW1wb3J0IHRhYmxlIGlzIHRoZSBzZWNvbmQKLQkJICAgb25lLiAgQnV0IHN0aWxsIGl0IG1heSBiZSB0aGF0IHRoZSB0YWJsZSBzaXplIGlzIHplcm8gKi8KLQkJaWYgKDAgPT0gRFdPUkRfQVQoZGxsYmFzZSArIG9wdF9vZmZzZXQgKyBpbXBvcnRfb2ZmICsgc2l6ZW9mKERXT1JEKSkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaW1wb3J0X2RhdGEgPSBkbGxiYXNlICsgRFdPUkRfQVQoZGxsYmFzZSArCi0JCQkJCQkgb3B0X29mZnNldCArCi0JCQkJCQkgaW1wb3J0X29mZik7Ci0JCXdoaWxlIChEV09SRF9BVChpbXBvcnRfZGF0YSkpIHsKLQkJCWltcG9ydF9uYW1lID0gZGxsYmFzZSArIERXT1JEX0FUKGltcG9ydF9kYXRhKzEyKTsKLQkJCWlmIChzdHJsZW4oaW1wb3J0X25hbWUpID49IDYgJiYKLQkJCSAgICAhc3RybmNtcChpbXBvcnRfbmFtZSwicHl0aG9uIiw2KSkgewotCQkJCWNoYXIgKnBjaDsKKyAgICBpZiAoRFdPUkRfQVQoZGxsYmFzZSArIG9wdF9vZmZzZXQgKyBudW1fZGljdF9vZmYpID49IDIpIHsKKyAgICAgICAgLyogV2UgaGF2ZSBhdCBsZWFzdCAyIHRhYmxlcyAtIHRoZSBpbXBvcnQgdGFibGUgaXMgdGhlIHNlY29uZAorICAgICAgICAgICBvbmUuICBCdXQgc3RpbGwgaXQgbWF5IGJlIHRoYXQgdGhlIHRhYmxlIHNpemUgaXMgemVybyAqLworICAgICAgICBpZiAoMCA9PSBEV09SRF9BVChkbGxiYXNlICsgb3B0X29mZnNldCArIGltcG9ydF9vZmYgKyBzaXplb2YoRFdPUkQpKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpbXBvcnRfZGF0YSA9IGRsbGJhc2UgKyBEV09SRF9BVChkbGxiYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9vZmYpOworICAgICAgICB3aGlsZSAoRFdPUkRfQVQoaW1wb3J0X2RhdGEpKSB7CisgICAgICAgICAgICBpbXBvcnRfbmFtZSA9IGRsbGJhc2UgKyBEV09SRF9BVChpbXBvcnRfZGF0YSsxMik7CisgICAgICAgICAgICBpZiAoc3RybGVuKGltcG9ydF9uYW1lKSA+PSA2ICYmCisgICAgICAgICAgICAgICAgIXN0cm5jbXAoaW1wb3J0X25hbWUsInB5dGhvbiIsNikpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpwY2g7CiAKLQkJCQkvKiBFbnN1cmUgcHl0aG9uIHByZWZpeCBpcyBmb2xsb3dlZCBvbmx5Ci0JCQkJICAgYnkgbnVtYmVycyB0byB0aGUgZW5kIG9mIHRoZSBiYXNlbmFtZSAqLwotCQkJCXBjaCA9IGltcG9ydF9uYW1lICsgNjsKKyAgICAgICAgICAgICAgICAvKiBFbnN1cmUgcHl0aG9uIHByZWZpeCBpcyBmb2xsb3dlZCBvbmx5CisgICAgICAgICAgICAgICAgICAgYnkgbnVtYmVycyB0byB0aGUgZW5kIG9mIHRoZSBiYXNlbmFtZSAqLworICAgICAgICAgICAgICAgIHBjaCA9IGltcG9ydF9uYW1lICsgNjsKICNpZmRlZiBfREVCVUcKLQkJCQl3aGlsZSAoKnBjaCAmJiBwY2hbMF0gIT0gJ18nICYmIHBjaFsxXSAhPSAnZCcgJiYgcGNoWzJdICE9ICcuJykgeworICAgICAgICAgICAgICAgIHdoaWxlICgqcGNoICYmIHBjaFswXSAhPSAnXycgJiYgcGNoWzFdICE9ICdkJyAmJiBwY2hbMl0gIT0gJy4nKSB7CiAjZWxzZQotCQkJCXdoaWxlICgqcGNoICYmICpwY2ggIT0gJy4nKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCpwY2ggJiYgKnBjaCAhPSAnLicpIHsKICNlbmRpZgotCQkJCQlpZiAoKnBjaCA+PSAnMCcgJiYgKnBjaCA8PSAnOScpIHsKLQkJCQkJCXBjaCsrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcGNoID0gTlVMTDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCSAgICAKLQkJCQlpZiAocGNoKSB7Ci0JCQkJCS8qIEZvdW5kIGl0IC0gcmV0dXJuIHRoZSBuYW1lICovCi0JCQkJCXJldHVybiBpbXBvcnRfbmFtZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbXBvcnRfZGF0YSArPSAyMDsKLQkJfQotCX0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCpwY2ggPj0gJzAnICYmICpwY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2grKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KIAotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGlmIChwY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRm91bmQgaXQgLSByZXR1cm4gdGhlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydF9uYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltcG9ydF9kYXRhICs9IDIwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIAogZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlkbF9mdW5jcHRyIHA7Ci0JY2hhciBmdW5jbmFtZVsyNThdLCAqaW1wb3J0X3B5dGhvbjsKKyAgICBkbF9mdW5jcHRyIHA7CisgICAgY2hhciBmdW5jbmFtZVsyNThdLCAqaW1wb3J0X3B5dGhvbjsKIAotCVB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksICJpbml0JS4yMDBzIiwgc2hvcnRuYW1lKTsKKyAgICBQeU9TX3NucHJpbnRmKGZ1bmNuYW1lLCBzaXplb2YoZnVuY25hbWUpLCAiaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CiAKLQl7Ci0JCUhJTlNUQU5DRSBoRExMID0gTlVMTDsKLQkJY2hhciBwYXRoYnVmWzI2MF07Ci0JCUxQVFNUUiBkdW1teTsKLQkJdW5zaWduZWQgaW50IG9sZF9tb2RlOwotCQlVTE9OR19QVFIgY29va2llID0gMDsKLQkJLyogV2UgdXNlIExvYWRMaWJyYXJ5RXggc28gV2luZG93cyBsb29rcyBmb3IgZGVwZW5kZW50IERMTHMgCi0JCSAgICBpbiBkaXJlY3Rvcnkgb2YgcGF0aG5hbWUgZmlyc3QuICBIb3dldmVyLCBXaW5kb3dzOTUKLQkJICAgIGNhbiBzb21ldGltZXMgbm90IHdvcmsgY29ycmVjdGx5IHVubGVzcyB0aGUgYWJzb2x1dGUKLQkJICAgIHBhdGggaXMgdXNlZC4gIElmIEdldEZ1bGxQYXRoTmFtZSgpIGZhaWxzLCB0aGUgTG9hZExpYnJhcnkKLQkJICAgIHdpbGwgY2VydGFpbmx5IGZhaWwgdG9vLCBzbyB1c2UgaXRzIGVycm9yIGNvZGUgKi8KKyAgICB7CisgICAgICAgIEhJTlNUQU5DRSBoRExMID0gTlVMTDsKKyAgICAgICAgY2hhciBwYXRoYnVmWzI2MF07CisgICAgICAgIExQVFNUUiBkdW1teTsKKyAgICAgICAgdW5zaWduZWQgaW50IG9sZF9tb2RlOworICAgICAgICBVTE9OR19QVFIgY29va2llID0gMDsKKyAgICAgICAgLyogV2UgdXNlIExvYWRMaWJyYXJ5RXggc28gV2luZG93cyBsb29rcyBmb3IgZGVwZW5kZW50IERMTHMKKyAgICAgICAgICAgIGluIGRpcmVjdG9yeSBvZiBwYXRobmFtZSBmaXJzdC4gIEhvd2V2ZXIsIFdpbmRvd3M5NQorICAgICAgICAgICAgY2FuIHNvbWV0aW1lcyBub3Qgd29yayBjb3JyZWN0bHkgdW5sZXNzIHRoZSBhYnNvbHV0ZQorICAgICAgICAgICAgcGF0aCBpcyB1c2VkLiAgSWYgR2V0RnVsbFBhdGhOYW1lKCkgZmFpbHMsIHRoZSBMb2FkTGlicmFyeQorICAgICAgICAgICAgd2lsbCBjZXJ0YWlubHkgZmFpbCB0b28sIHNvIHVzZSBpdHMgZXJyb3IgY29kZSAqLwogCi0JCS8qIERvbid0IGRpc3BsYXkgYSBtZXNzYWdlIGJveCB3aGVuIFB5dGhvbiBjYW4ndCBsb2FkIGEgRExMICovCi0JCW9sZF9tb2RlID0gU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMpOworICAgICAgICAvKiBEb24ndCBkaXNwbGF5IGEgbWVzc2FnZSBib3ggd2hlbiBQeXRob24gY2FuJ3QgbG9hZCBhIERMTCAqLworICAgICAgICBvbGRfbW9kZSA9IFNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTKTsKIAotCQlpZiAoR2V0RnVsbFBhdGhOYW1lKHBhdGhuYW1lLAotCQkJCSAgICBzaXplb2YocGF0aGJ1ZiksCi0JCQkJICAgIHBhdGhidWYsCi0JCQkJICAgICZkdW1teSkpIHsKLQkJCVVMT05HX1BUUiBjb29raWUgPSBfUHlfQWN0aXZhdGVBY3RDdHgoKTsKLQkJCS8qIFhYWCBUaGlzIGNhbGwgZG9lc24ndCBleGlzdCBpbiBXaW5kb3dzIENFICovCi0JCQloRExMID0gTG9hZExpYnJhcnlFeChwYXRobmFtZSwgTlVMTCwKLQkJCQkJICAgICBMT0FEX1dJVEhfQUxURVJFRF9TRUFSQ0hfUEFUSCk7Ci0JCQlfUHlfRGVhY3RpdmF0ZUFjdEN0eChjb29raWUpOwotCQl9CisgICAgICAgIGlmIChHZXRGdWxsUGF0aE5hbWUocGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhdGhidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15KSkgeworICAgICAgICAgICAgVUxPTkdfUFRSIGNvb2tpZSA9IF9QeV9BY3RpdmF0ZUFjdEN0eCgpOworICAgICAgICAgICAgLyogWFhYIFRoaXMgY2FsbCBkb2Vzbid0IGV4aXN0IGluIFdpbmRvd3MgQ0UgKi8KKyAgICAgICAgICAgIGhETEwgPSBMb2FkTGlicmFyeUV4KHBhdGhuYW1lLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9BRF9XSVRIX0FMVEVSRURfU0VBUkNIX1BBVEgpOworICAgICAgICAgICAgX1B5X0RlYWN0aXZhdGVBY3RDdHgoY29va2llKTsKKyAgICAgICAgfQogCi0JCS8qIHJlc3RvcmUgb2xkIGVycm9yIG1vZGUgc2V0dGluZ3MgKi8KLQkJU2V0RXJyb3JNb2RlKG9sZF9tb2RlKTsKKyAgICAgICAgLyogcmVzdG9yZSBvbGQgZXJyb3IgbW9kZSBzZXR0aW5ncyAqLworICAgICAgICBTZXRFcnJvck1vZGUob2xkX21vZGUpOwogCi0JCWlmIChoRExMPT1OVUxMKXsKLQkJCWNoYXIgZXJyQnVmWzI1Nl07Ci0JCQl1bnNpZ25lZCBpbnQgZXJyb3JDb2RlOworICAgICAgICBpZiAoaERMTD09TlVMTCl7CisgICAgICAgICAgICBjaGFyIGVyckJ1ZlsyNTZdOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGVycm9yQ29kZTsKIAotCQkJLyogR2V0IGFuIGVycm9yIHN0cmluZyBmcm9tIFdpbjMyIGVycm9yIGNvZGUgKi8KLQkJCWNoYXIgdGhlSW5mb1syNTZdOyAvKiBQb2ludGVyIHRvIGVycm9yIHRleHQKLQkJCQkJICAgICAgZnJvbSBzeXN0ZW0gKi8KLQkJCWludCB0aGVMZW5ndGg7IC8qIExlbmd0aCBvZiBlcnJvciB0ZXh0ICovCisgICAgICAgICAgICAvKiBHZXQgYW4gZXJyb3Igc3RyaW5nIGZyb20gV2luMzIgZXJyb3IgY29kZSAqLworICAgICAgICAgICAgY2hhciB0aGVJbmZvWzI1Nl07IC8qIFBvaW50ZXIgdG8gZXJyb3IgdGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gc3lzdGVtICovCisgICAgICAgICAgICBpbnQgdGhlTGVuZ3RoOyAvKiBMZW5ndGggb2YgZXJyb3IgdGV4dCAqLwogCi0JCQllcnJvckNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGVycm9yQ29kZSA9IEdldExhc3RFcnJvcigpOwogCi0JCQl0aGVMZW5ndGggPSBGb3JtYXRNZXNzYWdlKAotCQkJCUZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKLQkJCQlGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywgLyogZmxhZ3MgKi8KLQkJCQlOVUxMLCAvKiBtZXNzYWdlIHNvdXJjZSAqLwotCQkJCWVycm9yQ29kZSwgLyogdGhlIG1lc3NhZ2UgKGVycm9yKSBJRCAqLwotCQkJCTAsIC8qIGRlZmF1bHQgbGFuZ3VhZ2UgZW52aXJvbm1lbnQgKi8KLQkJCQkoTFBUU1RSKSB0aGVJbmZvLCAvKiB0aGUgYnVmZmVyICovCi0JCQkJc2l6ZW9mKHRoZUluZm8pLCAvKiB0aGUgYnVmZmVyIHNpemUgKi8KLQkJCQlOVUxMKTsgLyogbm8gYWRkaXRpb25hbCBmb3JtYXQgYXJncy4gKi8KKyAgICAgICAgICAgIHRoZUxlbmd0aCA9IEZvcm1hdE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLCAvKiBmbGFncyAqLworICAgICAgICAgICAgICAgIE5VTEwsIC8qIG1lc3NhZ2Ugc291cmNlICovCisgICAgICAgICAgICAgICAgZXJyb3JDb2RlLCAvKiB0aGUgbWVzc2FnZSAoZXJyb3IpIElEICovCisgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCBsYW5ndWFnZSBlbnZpcm9ubWVudCAqLworICAgICAgICAgICAgICAgIChMUFRTVFIpIHRoZUluZm8sIC8qIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBzaXplb2YodGhlSW5mbyksIC8qIHRoZSBidWZmZXIgc2l6ZSAqLworICAgICAgICAgICAgICAgIE5VTEwpOyAvKiBubyBhZGRpdGlvbmFsIGZvcm1hdCBhcmdzLiAqLwogCi0JCQkvKiBQcm9ibGVtOiBjb3VsZCBub3QgZ2V0IHRoZSBlcnJvciBtZXNzYWdlLgotCQkJICAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiBpZiBjYWxsZWQgY29ycmVjdGx5LiAqLwotCQkJaWYgKHRoZUxlbmd0aCA9PSAwKSB7Ci0JCQkJUHlPU19zbnByaW50ZihlcnJCdWYsIHNpemVvZihlcnJCdWYpLAotCQkJCSAgICAgICJETEwgbG9hZCBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkIiwKLQkJCQkJICAgICAgZXJyb3JDb2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2l6ZV90IGxlbjsKLQkJCQkvKiBGb3Igc29tZSByZWFzb24gYSBcclxuCi0JCQkJICAgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQgKi8KLQkJCQlpZiAodGhlTGVuZ3RoID49IDIgJiYKLQkJCQkgICAgdGhlSW5mb1t0aGVMZW5ndGgtMl0gPT0gJ1xyJyAmJgotCQkJCSAgICB0aGVJbmZvW3RoZUxlbmd0aC0xXSA9PSAnXG4nKSB7Ci0JCQkJCXRoZUxlbmd0aCAtPSAyOwotCQkJCQl0aGVJbmZvW3RoZUxlbmd0aF0gPSAnXDAnOwotCQkJCX0KLQkJCQlzdHJjcHkoZXJyQnVmLCAiRExMIGxvYWQgZmFpbGVkOiAiKTsKLQkJCQlsZW4gPSBzdHJsZW4oZXJyQnVmKTsKLQkJCQlzdHJuY3B5KGVyckJ1ZitsZW4sIHRoZUluZm8sCi0JCQkJCXNpemVvZihlcnJCdWYpLWxlbik7Ci0JCQkJZXJyQnVmW3NpemVvZihlcnJCdWYpLTFdID0gJ1wwJzsKLQkJCX0KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgZXJyQnVmKTsKLQkJCXJldHVybiBOVUxMOwotCQl9IGVsc2UgewotCQkJY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgICAgIC8qIFByb2JsZW06IGNvdWxkIG5vdCBnZXQgdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICAgICAgICAgICBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGlmIGNhbGxlZCBjb3JyZWN0bHkuICovCisgICAgICAgICAgICBpZiAodGhlTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGVyckJ1Ziwgc2l6ZW9mKGVyckJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgIkRMTCBsb2FkIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuOworICAgICAgICAgICAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBhIFxyXG4KKyAgICAgICAgICAgICAgICAgICBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dCAqLworICAgICAgICAgICAgICAgIGlmICh0aGVMZW5ndGggPj0gMiAmJgorICAgICAgICAgICAgICAgICAgICB0aGVJbmZvW3RoZUxlbmd0aC0yXSA9PSAnXHInICYmCisgICAgICAgICAgICAgICAgICAgIHRoZUluZm9bdGhlTGVuZ3RoLTFdID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhlTGVuZ3RoIC09IDI7CisgICAgICAgICAgICAgICAgICAgIHRoZUluZm9bdGhlTGVuZ3RoXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmNweShlcnJCdWYsICJETEwgbG9hZCBmYWlsZWQ6ICIpOworICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihlcnJCdWYpOworICAgICAgICAgICAgICAgIHN0cm5jcHkoZXJyQnVmK2xlbiwgdGhlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVyckJ1ZiktbGVuKTsKKyAgICAgICAgICAgICAgICBlcnJCdWZbc2l6ZW9mKGVyckJ1ZiktMV0gPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJCdWYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOwogCiAjaWZkZWYgX0RFQlVHCi0JCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJweXRob24lZCVkX2QuZGxsIiwKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgInB5dGhvbiVkJWRfZC5kbGwiLAogI2Vsc2UKLQkJCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgInB5dGhvbiVkJWQuZGxsIiwKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgInB5dGhvbiVkJWQuZGxsIiwKICNlbmRpZgotCQkJCSAgICAgIFBZX01BSk9SX1ZFUlNJT04sUFlfTUlOT1JfVkVSU0lPTik7Ci0JCQlpbXBvcnRfcHl0aG9uID0gR2V0UHl0aG9uSW1wb3J0KGhETEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICBQWV9NQUpPUl9WRVJTSU9OLFBZX01JTk9SX1ZFUlNJT04pOworICAgICAgICAgICAgaW1wb3J0X3B5dGhvbiA9IEdldFB5dGhvbkltcG9ydChoRExMKTsKIAotCQkJaWYgKGltcG9ydF9weXRob24gJiYKLQkJCSAgICBzdHJjYXNlY21wKGJ1ZmZlcixpbXBvcnRfcHl0aG9uKSkgewotCQkJCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCQkJICAgICAgIk1vZHVsZSB1c2Ugb2YgJS4xNTBzIGNvbmZsaWN0cyAiCi0JCQkJCSAgICAgICJ3aXRoIHRoaXMgdmVyc2lvbiBvZiBQeXRob24uIiwKLQkJCQkJICAgICAgaW1wb3J0X3B5dGhvbik7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLGJ1ZmZlcik7Ci0JCQkJRnJlZUxpYnJhcnkoaERMTCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJcCA9IEdldFByb2NBZGRyZXNzKGhETEwsIGZ1bmNuYW1lKTsKLQl9CisgICAgICAgICAgICBpZiAoaW1wb3J0X3B5dGhvbiAmJgorICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAoYnVmZmVyLGltcG9ydF9weXRob24pKSB7CisgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vZHVsZSB1c2Ugb2YgJS4xNTBzIGNvbmZsaWN0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB0aGlzIHZlcnNpb24gb2YgUHl0aG9uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRfcHl0aG9uKTsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBGcmVlTGlicmFyeShoRExMKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwID0gR2V0UHJvY0FkZHJlc3MoaERMTCwgZnVuY25hbWUpOworICAgIH0KIAotCXJldHVybiBwOworICAgIHJldHVybiBwOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Vycm9ycy5jIGIvUHl0aG9uL2Vycm9ycy5jCmluZGV4IDJkNDc3NzkuLjQyOTRmMmYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9lcnJvcnMuYworKysgYi9QeXRob24vZXJyb3JzLmMKQEAgLTI0LDExNSArMjQsMTE1IEBACiB2b2lkCiBQeUVycl9SZXN0b3JlKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIFB5T2JqZWN0ICp0cmFjZWJhY2spCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqb2xkdHlwZSwgKm9sZHZhbHVlLCAqb2xkdHJhY2ViYWNrOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlPYmplY3QgKm9sZHR5cGUsICpvbGR2YWx1ZSwgKm9sZHRyYWNlYmFjazsKIAotCWlmICh0cmFjZWJhY2sgIT0gTlVMTCAmJiAhUHlUcmFjZUJhY2tfQ2hlY2sodHJhY2ViYWNrKSkgewotCQkvKiBYWFggU2hvdWxkIG5ldmVyIGhhcHBlbiAtLSBmYXRhbCBlcnJvciBpbnN0ZWFkPyAqLwotCQkvKiBXZWxsLCBpdCBjb3VsZCBiZSBOb25lLiAqLwotCQlQeV9ERUNSRUYodHJhY2ViYWNrKTsKLQkJdHJhY2ViYWNrID0gTlVMTDsKLQl9CisgICAgaWYgKHRyYWNlYmFjayAhPSBOVUxMICYmICFQeVRyYWNlQmFja19DaGVjayh0cmFjZWJhY2spKSB7CisgICAgICAgIC8qIFhYWCBTaG91bGQgbmV2ZXIgaGFwcGVuIC0tIGZhdGFsIGVycm9yIGluc3RlYWQ/ICovCisgICAgICAgIC8qIFdlbGwsIGl0IGNvdWxkIGJlIE5vbmUuICovCisgICAgICAgIFB5X0RFQ1JFRih0cmFjZWJhY2spOworICAgICAgICB0cmFjZWJhY2sgPSBOVUxMOworICAgIH0KIAotCS8qIFNhdmUgdGhlc2UgaW4gbG9jYWxzIHRvIHNhZmVndWFyZCBhZ2FpbnN0IHJlY3Vyc2l2ZQotCSAgIGludm9jYXRpb24gdGhyb3VnaCBQeV9YREVDUkVGICovCi0Jb2xkdHlwZSA9IHRzdGF0ZS0+Y3VyZXhjX3R5cGU7Ci0Jb2xkdmFsdWUgPSB0c3RhdGUtPmN1cmV4Y192YWx1ZTsKLQlvbGR0cmFjZWJhY2sgPSB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2s7CisgICAgLyogU2F2ZSB0aGVzZSBpbiBsb2NhbHMgdG8gc2FmZWd1YXJkIGFnYWluc3QgcmVjdXJzaXZlCisgICAgICAgaW52b2NhdGlvbiB0aHJvdWdoIFB5X1hERUNSRUYgKi8KKyAgICBvbGR0eXBlID0gdHN0YXRlLT5jdXJleGNfdHlwZTsKKyAgICBvbGR2YWx1ZSA9IHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlOworICAgIG9sZHRyYWNlYmFjayA9IHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjazsKIAotCXRzdGF0ZS0+Y3VyZXhjX3R5cGUgPSB0eXBlOwotCXRzdGF0ZS0+Y3VyZXhjX3ZhbHVlID0gdmFsdWU7Ci0JdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID0gdHJhY2ViYWNrOworICAgIHRzdGF0ZS0+Y3VyZXhjX3R5cGUgPSB0eXBlOworICAgIHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlID0gdmFsdWU7CisgICAgdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID0gdHJhY2ViYWNrOwogCi0JUHlfWERFQ1JFRihvbGR0eXBlKTsKLQlQeV9YREVDUkVGKG9sZHZhbHVlKTsKLQlQeV9YREVDUkVGKG9sZHRyYWNlYmFjayk7CisgICAgUHlfWERFQ1JFRihvbGR0eXBlKTsKKyAgICBQeV9YREVDUkVGKG9sZHZhbHVlKTsKKyAgICBQeV9YREVDUkVGKG9sZHRyYWNlYmFjayk7CiB9CiAKIHZvaWQKIFB5RXJyX1NldE9iamVjdChQeU9iamVjdCAqZXhjZXB0aW9uLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlfWElOQ1JFRihleGNlcHRpb24pOwotCVB5X1hJTkNSRUYodmFsdWUpOwotCVB5RXJyX1Jlc3RvcmUoZXhjZXB0aW9uLCB2YWx1ZSwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgUHlfWElOQ1JFRihleGNlcHRpb24pOworICAgIFB5X1hJTkNSRUYodmFsdWUpOworICAgIFB5RXJyX1Jlc3RvcmUoZXhjZXB0aW9uLCB2YWx1ZSwgKFB5T2JqZWN0ICopTlVMTCk7CiB9CiAKIHZvaWQKIFB5RXJyX1NldE5vbmUoUHlPYmplY3QgKmV4Y2VwdGlvbikKIHsKLQlQeUVycl9TZXRPYmplY3QoZXhjZXB0aW9uLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBQeUVycl9TZXRPYmplY3QoZXhjZXB0aW9uLCAoUHlPYmplY3QgKilOVUxMKTsKIH0KIAogdm9pZAogUHlFcnJfU2V0U3RyaW5nKFB5T2JqZWN0ICpleGNlcHRpb24sIGNvbnN0IGNoYXIgKnN0cmluZykKIHsKLQlQeU9iamVjdCAqdmFsdWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHN0cmluZyk7Ci0JUHlFcnJfU2V0T2JqZWN0KGV4Y2VwdGlvbiwgdmFsdWUpOwotCVB5X1hERUNSRUYodmFsdWUpOworICAgIFB5T2JqZWN0ICp2YWx1ZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyaW5nKTsKKyAgICBQeUVycl9TZXRPYmplY3QoZXhjZXB0aW9uLCB2YWx1ZSk7CisgICAgUHlfWERFQ1JFRih2YWx1ZSk7CiB9CiAKIAogUHlPYmplY3QgKgogUHlFcnJfT2NjdXJyZWQodm9pZCkKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CiAKLQlyZXR1cm4gdHN0YXRlLT5jdXJleGNfdHlwZTsKKyAgICByZXR1cm4gdHN0YXRlLT5jdXJleGNfdHlwZTsKIH0KIAogCiBpbnQKIFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhQeU9iamVjdCAqZXJyLCBQeU9iamVjdCAqZXhjKQogewotCWlmIChlcnIgPT0gTlVMTCB8fCBleGMgPT0gTlVMTCkgewotCQkvKiBtYXliZSBjYXVzZWQgYnkgImltcG9ydCBleGNlcHRpb25zIiB0aGF0IGZhaWxlZCBlYXJseSBvbiAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5VHVwbGVfQ2hlY2soZXhjKSkgewotCQlQeV9zc2l6ZV90IGksIG47Ci0JCW4gPSBQeVR1cGxlX1NpemUoZXhjKTsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJLyogVGVzdCByZWN1cnNpdmVseSAqLwotCQkgICAgIGlmIChQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoCi0JCQkgICAgIGVyciwgUHlUdXBsZV9HRVRfSVRFTShleGMsIGkpKSkKLQkJICAgICB7Ci0JCQkgICAgIHJldHVybiAxOwotCQkgICAgIH0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JLyogZXJyIG1pZ2h0IGJlIGFuIGluc3RhbmNlLCBzbyBjaGVjayBpdHMgY2xhc3MuICovCi0JaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2soZXJyKSkKLQkJZXJyID0gUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyhlcnIpOworICAgIGlmIChlcnIgPT0gTlVMTCB8fCBleGMgPT0gTlVMTCkgeworICAgICAgICAvKiBtYXliZSBjYXVzZWQgYnkgImltcG9ydCBleGNlcHRpb25zIiB0aGF0IGZhaWxlZCBlYXJseSBvbiAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soZXhjKSkgeworICAgICAgICBQeV9zc2l6ZV90IGksIG47CisgICAgICAgIG4gPSBQeVR1cGxlX1NpemUoZXhjKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgLyogVGVzdCByZWN1cnNpdmVseSAqLworICAgICAgICAgICAgIGlmIChQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoCisgICAgICAgICAgICAgICAgIGVyciwgUHlUdXBsZV9HRVRfSVRFTShleGMsIGkpKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogZXJyIG1pZ2h0IGJlIGFuIGluc3RhbmNlLCBzbyBjaGVjayBpdHMgY2xhc3MuICovCisgICAgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2soZXJyKSkKKyAgICAgICAgZXJyID0gUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyhlcnIpOwogCi0JaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2soZXJyKSAmJiBQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGV4YykpIHsKLQkJaW50IHJlcyA9IDAsIHJlY2xpbWl0OwotCQlQeU9iamVjdCAqZXhjZXB0aW9uLCAqdmFsdWUsICp0YjsKLQkJUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbiwgJnZhbHVlLCAmdGIpOwotCQkvKiBUZW1wb3JhcmlseSBidW1wIHRoZSByZWN1cnNpb24gbGltaXQsIHNvIHRoYXQgaW4gdGhlIG1vc3QKLQkJICAgY29tbW9uIGNhc2UgUHlPYmplY3RfSXNTdWJjbGFzcyB3aWxsIG5vdCByYWlzZSBhIHJlY3Vyc2lvbgotCQkgICBlcnJvciB3ZSBoYXZlIHRvIGlnbm9yZSBhbnl3YXkuICovCi0JCXJlY2xpbWl0ID0gUHlfR2V0UmVjdXJzaW9uTGltaXQoKTsKLQkJUHlfU2V0UmVjdXJzaW9uTGltaXQocmVjbGltaXQgKyA1KTsKLQkJcmVzID0gUHlPYmplY3RfSXNTdWJjbGFzcyhlcnIsIGV4Yyk7Ci0JCVB5X1NldFJlY3Vyc2lvbkxpbWl0KHJlY2xpbWl0KTsKLQkJLyogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBmYWlsLCBzbyBwcmludCB0aGUgZXJyb3IgaGVyZSAqLwotCQlpZiAocmVzID09IC0xKSB7Ci0JCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoZXJyKTsKLQkJCXJlcyA9IDA7Ci0JCX0KLQkJUHlFcnJfUmVzdG9yZShleGNlcHRpb24sIHZhbHVlLCB0Yik7Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIGlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGVycikgJiYgUHlFeGNlcHRpb25DbGFzc19DaGVjayhleGMpKSB7CisgICAgICAgIGludCByZXMgPSAwLCByZWNsaW1pdDsKKyAgICAgICAgUHlPYmplY3QgKmV4Y2VwdGlvbiwgKnZhbHVlLCAqdGI7CisgICAgICAgIFB5RXJyX0ZldGNoKCZleGNlcHRpb24sICZ2YWx1ZSwgJnRiKTsKKyAgICAgICAgLyogVGVtcG9yYXJpbHkgYnVtcCB0aGUgcmVjdXJzaW9uIGxpbWl0LCBzbyB0aGF0IGluIHRoZSBtb3N0CisgICAgICAgICAgIGNvbW1vbiBjYXNlIFB5T2JqZWN0X0lzU3ViY2xhc3Mgd2lsbCBub3QgcmFpc2UgYSByZWN1cnNpb24KKyAgICAgICAgICAgZXJyb3Igd2UgaGF2ZSB0byBpZ25vcmUgYW55d2F5LiAqLworICAgICAgICByZWNsaW1pdCA9IFB5X0dldFJlY3Vyc2lvbkxpbWl0KCk7CisgICAgICAgIFB5X1NldFJlY3Vyc2lvbkxpbWl0KHJlY2xpbWl0ICsgNSk7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoZXJyLCBleGMpOworICAgICAgICBQeV9TZXRSZWN1cnNpb25MaW1pdChyZWNsaW1pdCk7CisgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgZmFpbCwgc28gcHJpbnQgdGhlIGVycm9yIGhlcmUgKi8KKyAgICAgICAgaWYgKHJlcyA9PSAtMSkgeworICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGVycik7CisgICAgICAgICAgICByZXMgPSAwOworICAgICAgICB9CisgICAgICAgIFB5RXJyX1Jlc3RvcmUoZXhjZXB0aW9uLCB2YWx1ZSwgdGIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCXJldHVybiBlcnIgPT0gZXhjOworICAgIHJldHVybiBlcnIgPT0gZXhjOwogfQogCiAKIGludAogUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeU9iamVjdCAqZXhjKQogewotCXJldHVybiBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoUHlFcnJfT2NjdXJyZWQoKSwgZXhjKTsKKyAgICByZXR1cm4gUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKFB5RXJyX09jY3VycmVkKCksIGV4Yyk7CiB9CiAKIApAQCAtMTQyLDEyMyArMTQyLDEyMyBAQAogdm9pZAogUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKFB5T2JqZWN0ICoqZXhjLCBQeU9iamVjdCAqKnZhbCwgUHlPYmplY3QgKip0YikKIHsKLQlQeU9iamVjdCAqdHlwZSA9ICpleGM7Ci0JUHlPYmplY3QgKnZhbHVlID0gKnZhbDsKLQlQeU9iamVjdCAqaW5jbGFzcyA9IE5VTEw7Ci0JUHlPYmplY3QgKmluaXRpYWxfdGIgPSBOVUxMOwotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnR5cGUgPSAqZXhjOworICAgIFB5T2JqZWN0ICp2YWx1ZSA9ICp2YWw7CisgICAgUHlPYmplY3QgKmluY2xhc3MgPSBOVUxMOworICAgIFB5T2JqZWN0ICppbml0aWFsX3RiID0gTlVMTDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBOVUxMOwogCi0JaWYgKHR5cGUgPT0gTlVMTCkgewotCQkvKiBUaGVyZSB3YXMgbm8gZXhjZXB0aW9uLCBzbyBub3RoaW5nIHRvIGRvLiAqLwotCQlyZXR1cm47Ci0JfQorICAgIGlmICh0eXBlID09IE5VTEwpIHsKKyAgICAgICAgLyogVGhlcmUgd2FzIG5vIGV4Y2VwdGlvbiwgc28gbm90aGluZyB0byBkby4gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCS8qIElmIFB5RXJyX1NldE5vbmUoKSB3YXMgdXNlZCwgdGhlIHZhbHVlIHdpbGwgaGF2ZSBiZWVuIGFjdHVhbGx5Ci0JICAgc2V0IHRvIE5VTEwuCi0JKi8KLQlpZiAoIXZhbHVlKSB7Ci0JCXZhbHVlID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQl9CisgICAgLyogSWYgUHlFcnJfU2V0Tm9uZSgpIHdhcyB1c2VkLCB0aGUgdmFsdWUgd2lsbCBoYXZlIGJlZW4gYWN0dWFsbHkKKyAgICAgICBzZXQgdG8gTlVMTC4KKyAgICAqLworICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgdmFsdWUgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIH0KIAotCWlmIChQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHZhbHVlKSkKLQkJaW5jbGFzcyA9IFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2xhc3ModmFsdWUpOworICAgIGlmIChQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHZhbHVlKSkKKyAgICAgICAgaW5jbGFzcyA9IFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2xhc3ModmFsdWUpOwogCi0JLyogTm9ybWFsaXplIHRoZSBleGNlcHRpb24gc28gdGhhdCBpZiB0aGUgdHlwZSBpcyBhIGNsYXNzLCB0aGUKLQkgICB2YWx1ZSB3aWxsIGJlIGFuIGluc3RhbmNlLgotCSovCi0JaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwZSkpIHsKLQkJLyogaWYgdGhlIHZhbHVlIHdhcyBub3QgYW4gaW5zdGFuY2UsIG9yIGlzIG5vdCBhbiBpbnN0YW5jZQotCQkgICB3aG9zZSBjbGFzcyBpcyAob3IgaXMgZGVyaXZlZCBmcm9tKSB0eXBlLCB0aGVuIHVzZSB0aGUKLQkJICAgdmFsdWUgYXMgYW4gYXJndW1lbnQgdG8gaW5zdGFudGlhdGlvbiBvZiB0aGUgdHlwZQotCQkgICBjbGFzcy4KLQkJKi8KLQkJaWYgKCFpbmNsYXNzIHx8ICFQeU9iamVjdF9Jc1N1YmNsYXNzKGluY2xhc3MsIHR5cGUpKSB7Ci0JCQlQeU9iamVjdCAqYXJncywgKnJlczsKKyAgICAvKiBOb3JtYWxpemUgdGhlIGV4Y2VwdGlvbiBzbyB0aGF0IGlmIHRoZSB0eXBlIGlzIGEgY2xhc3MsIHRoZQorICAgICAgIHZhbHVlIHdpbGwgYmUgYW4gaW5zdGFuY2UuCisgICAgKi8KKyAgICBpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0eXBlKSkgeworICAgICAgICAvKiBpZiB0aGUgdmFsdWUgd2FzIG5vdCBhbiBpbnN0YW5jZSwgb3IgaXMgbm90IGFuIGluc3RhbmNlCisgICAgICAgICAgIHdob3NlIGNsYXNzIGlzIChvciBpcyBkZXJpdmVkIGZyb20pIHR5cGUsIHRoZW4gdXNlIHRoZQorICAgICAgICAgICB2YWx1ZSBhcyBhbiBhcmd1bWVudCB0byBpbnN0YW50aWF0aW9uIG9mIHRoZSB0eXBlCisgICAgICAgICAgIGNsYXNzLgorICAgICAgICAqLworICAgICAgICBpZiAoIWluY2xhc3MgfHwgIVB5T2JqZWN0X0lzU3ViY2xhc3MoaW5jbGFzcywgdHlwZSkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOwogCi0JCQlpZiAodmFsdWUgPT0gUHlfTm9uZSkKLQkJCQlhcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0JCQllbHNlIGlmIChQeVR1cGxlX0NoZWNrKHZhbHVlKSkgewotCQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQkJYXJncyA9IHZhbHVlOwotCQkJfQotCQkJZWxzZQotCQkJCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdmFsdWUpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICAgICAgZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIGFyZ3MgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHZhbHVlKTsKIAotCQkJaWYgKGFyZ3MgPT0gTlVMTCkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdCh0eXBlLCBhcmdzKTsKLQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJCWlmIChyZXMgPT0gTlVMTCkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJdmFsdWUgPSByZXM7Ci0JCX0KLQkJLyogaWYgdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4YWN0bHkgbWF0Y2ggdGhlCi0JCSAgIGNsYXNzIG9mIHRoZSB0eXBlLCBiZWxpZXZlIHRoZSBpbnN0YW5jZQotCQkqLwotCQllbHNlIGlmIChpbmNsYXNzICE9IHR5cGUpIHsKLSAJCQlQeV9ERUNSRUYodHlwZSk7Ci0JCQl0eXBlID0gaW5jbGFzczsKLQkJCVB5X0lOQ1JFRih0eXBlKTsKLQkJfQotCX0KLQkqZXhjID0gdHlwZTsKLQkqdmFsID0gdmFsdWU7Ci0JcmV0dXJuOworICAgICAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdCh0eXBlLCBhcmdzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgdmFsdWUgPSByZXM7CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4YWN0bHkgbWF0Y2ggdGhlCisgICAgICAgICAgIGNsYXNzIG9mIHRoZSB0eXBlLCBiZWxpZXZlIHRoZSBpbnN0YW5jZQorICAgICAgICAqLworICAgICAgICBlbHNlIGlmIChpbmNsYXNzICE9IHR5cGUpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICAgICAgICAgIHR5cGUgPSBpbmNsYXNzOworICAgICAgICAgICAgUHlfSU5DUkVGKHR5cGUpOworICAgICAgICB9CisgICAgfQorICAgICpleGMgPSB0eXBlOworICAgICp2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm47CiBmaW5hbGx5OgotCVB5X0RFQ1JFRih0eXBlKTsKLQlQeV9ERUNSRUYodmFsdWUpOwotCS8qIElmIHRoZSBuZXcgZXhjZXB0aW9uIGRvZXNuJ3Qgc2V0IGEgdHJhY2ViYWNrIGFuZCB0aGUgb2xkCi0JICAgZXhjZXB0aW9uIGhhZCBhIHRyYWNlYmFjaywgdXNlIHRoZSBvbGQgdHJhY2ViYWNrIGZvciB0aGUKLQkgICBuZXcgZXhjZXB0aW9uLiAgSXQncyBiZXR0ZXIgdGhhbiBub3RoaW5nLgotCSovCi0JaW5pdGlhbF90YiA9ICp0YjsKLQlQeUVycl9GZXRjaChleGMsIHZhbCwgdGIpOwotCWlmIChpbml0aWFsX3RiICE9IE5VTEwpIHsKLQkJaWYgKCp0YiA9PSBOVUxMKQotCQkJKnRiID0gaW5pdGlhbF90YjsKLQkJZWxzZQotCQkJUHlfREVDUkVGKGluaXRpYWxfdGIpOwotCX0KLQkvKiBub3JtYWxpemUgcmVjdXJzaXZlbHkgKi8KLQl0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCWlmICgrK3RzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoID4gUHlfR2V0UmVjdXJzaW9uTGltaXQoKSkgewotCSAgICAtLXRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOwotCSAgICAvKiB0aHJvdyBhd2F5IHRoZSBvbGQgZXhjZXB0aW9uLi4uICovCi0JICAgIFB5X0RFQ1JFRigqZXhjKTsKLQkgICAgUHlfREVDUkVGKCp2YWwpOwotCSAgICAvKiAuLi4gYW5kIHVzZSB0aGUgcmVjdXJzaW9uIGVycm9yIGluc3RlYWQgKi8KLQkgICAgKmV4YyA9IFB5RXhjX1J1bnRpbWVFcnJvcjsKLQkgICAgKnZhbCA9IFB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdDsKLQkgICAgUHlfSU5DUkVGKCpleGMpOwotCSAgICBQeV9JTkNSRUYoKnZhbCk7Ci0JICAgIC8qIGp1c3Qga2VlcGluZyB0aGUgb2xkIHRyYWNlYmFjayAqLwotCSAgICByZXR1cm47Ci0JfQotCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbihleGMsIHZhbCwgdGIpOwotCS0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgUHlfREVDUkVGKHR5cGUpOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgLyogSWYgdGhlIG5ldyBleGNlcHRpb24gZG9lc24ndCBzZXQgYSB0cmFjZWJhY2sgYW5kIHRoZSBvbGQKKyAgICAgICBleGNlcHRpb24gaGFkIGEgdHJhY2ViYWNrLCB1c2UgdGhlIG9sZCB0cmFjZWJhY2sgZm9yIHRoZQorICAgICAgIG5ldyBleGNlcHRpb24uICBJdCdzIGJldHRlciB0aGFuIG5vdGhpbmcuCisgICAgKi8KKyAgICBpbml0aWFsX3RiID0gKnRiOworICAgIFB5RXJyX0ZldGNoKGV4YywgdmFsLCB0Yik7CisgICAgaWYgKGluaXRpYWxfdGIgIT0gTlVMTCkgeworICAgICAgICBpZiAoKnRiID09IE5VTEwpCisgICAgICAgICAgICAqdGIgPSBpbml0aWFsX3RiOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9ERUNSRUYoaW5pdGlhbF90Yik7CisgICAgfQorICAgIC8qIG5vcm1hbGl6ZSByZWN1cnNpdmVseSAqLworICAgIHRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgaWYgKCsrdHN0YXRlLT5yZWN1cnNpb25fZGVwdGggPiBQeV9HZXRSZWN1cnNpb25MaW1pdCgpKSB7CisgICAgICAgIC0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgICAgIC8qIHRocm93IGF3YXkgdGhlIG9sZCBleGNlcHRpb24uLi4gKi8KKyAgICAgICAgUHlfREVDUkVGKCpleGMpOworICAgICAgICBQeV9ERUNSRUYoKnZhbCk7CisgICAgICAgIC8qIC4uLiBhbmQgdXNlIHRoZSByZWN1cnNpb24gZXJyb3IgaW5zdGVhZCAqLworICAgICAgICAqZXhjID0gUHlFeGNfUnVudGltZUVycm9yOworICAgICAgICAqdmFsID0gUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0OworICAgICAgICBQeV9JTkNSRUYoKmV4Yyk7CisgICAgICAgIFB5X0lOQ1JFRigqdmFsKTsKKyAgICAgICAgLyoganVzdCBrZWVwaW5nIHRoZSBvbGQgdHJhY2ViYWNrICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKGV4YywgdmFsLCB0Yik7CisgICAgLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKIH0KIAogCiB2b2lkCiBQeUVycl9GZXRjaChQeU9iamVjdCAqKnBfdHlwZSwgUHlPYmplY3QgKipwX3ZhbHVlLCBQeU9iamVjdCAqKnBfdHJhY2ViYWNrKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKIAotCSpwX3R5cGUgPSB0c3RhdGUtPmN1cmV4Y190eXBlOwotCSpwX3ZhbHVlID0gdHN0YXRlLT5jdXJleGNfdmFsdWU7Ci0JKnBfdHJhY2ViYWNrID0gdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrOworICAgICpwX3R5cGUgPSB0c3RhdGUtPmN1cmV4Y190eXBlOworICAgICpwX3ZhbHVlID0gdHN0YXRlLT5jdXJleGNfdmFsdWU7CisgICAgKnBfdHJhY2ViYWNrID0gdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrOwogCi0JdHN0YXRlLT5jdXJleGNfdHlwZSA9IE5VTEw7Ci0JdHN0YXRlLT5jdXJleGNfdmFsdWUgPSBOVUxMOwotCXRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjayA9IE5VTEw7CisgICAgdHN0YXRlLT5jdXJleGNfdHlwZSA9IE5VTEw7CisgICAgdHN0YXRlLT5jdXJleGNfdmFsdWUgPSBOVUxMOworICAgIHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjayA9IE5VTEw7CiB9CiAKIHZvaWQKIFB5RXJyX0NsZWFyKHZvaWQpCiB7Ci0JUHlFcnJfUmVzdG9yZShOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBQeUVycl9SZXN0b3JlKE5VTEwsIE5VTEwsIE5VTEwpOwogfQogCiAvKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gc2V0IGEgdHlwZSBlcnJvciBleGNlcHRpb24gYW5kIHJldHVybiAwICovCkBAIC0yNjYsMjU4ICsyNjYsMjU4IEBACiBpbnQKIFB5RXJyX0JhZEFyZ3VtZW50KHZvaWQpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJiYWQgYXJndW1lbnQgdHlwZSBmb3IgYnVpbHQtaW4gb3BlcmF0aW9uIik7Ci0JcmV0dXJuIDA7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImJhZCBhcmd1bWVudCB0eXBlIGZvciBidWlsdC1pbiBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlPYmplY3QgKgogUHlFcnJfTm9NZW1vcnkodm9pZCkKIHsKLQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19NZW1vcnlFcnJvcikpCi0JCS8qIGFscmVhZHkgY3VycmVudCAqLwotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19NZW1vcnlFcnJvcikpCisgICAgICAgIC8qIGFscmVhZHkgY3VycmVudCAqLworICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIHJhaXNlIHRoZSBwcmUtYWxsb2NhdGVkIGluc3RhbmNlIGlmIGl0IHN0aWxsIGV4aXN0cyAqLwotCWlmIChQeUV4Y19NZW1vcnlFcnJvckluc3QpCi0JCVB5RXJyX1NldE9iamVjdChQeUV4Y19NZW1vcnlFcnJvciwgUHlFeGNfTWVtb3J5RXJyb3JJbnN0KTsKLQllbHNlCi0JCS8qIHRoaXMgd2lsbCBwcm9iYWJseSBmYWlsIHNpbmNlIHRoZXJlJ3Mgbm8gbWVtb3J5IGFuZCBoZWUsCi0JCSAgIGhlZSwgd2UgaGF2ZSB0byBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzCi0JCSovCi0JCVB5RXJyX1NldE5vbmUoUHlFeGNfTWVtb3J5RXJyb3IpOworICAgIC8qIHJhaXNlIHRoZSBwcmUtYWxsb2NhdGVkIGluc3RhbmNlIGlmIGl0IHN0aWxsIGV4aXN0cyAqLworICAgIGlmIChQeUV4Y19NZW1vcnlFcnJvckluc3QpCisgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19NZW1vcnlFcnJvciwgUHlFeGNfTWVtb3J5RXJyb3JJbnN0KTsKKyAgICBlbHNlCisgICAgICAgIC8qIHRoaXMgd2lsbCBwcm9iYWJseSBmYWlsIHNpbmNlIHRoZXJlJ3Mgbm8gbWVtb3J5IGFuZCBoZWUsCisgICAgICAgICAgIGhlZSwgd2UgaGF2ZSB0byBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzCisgICAgICAgICovCisgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfTWVtb3J5RXJyb3IpOwogCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChQeU9iamVjdCAqZXhjLCBQeU9iamVjdCAqZmlsZW5hbWVPYmplY3QpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JY2hhciAqczsKLQlpbnQgaSA9IGVycm5vOworICAgIFB5T2JqZWN0ICp2OworICAgIGNoYXIgKnM7CisgICAgaW50IGkgPSBlcnJubzsKICNpZmRlZiBQTEFOOQotCWNoYXIgZXJyYnVmW0VSUk1BWF07CisgICAgY2hhciBlcnJidWZbRVJSTUFYXTsKICNlbmRpZgogI2lmZGVmIE1TX1dJTkRPV1MKLQljaGFyICpzX2J1ZiA9IE5VTEw7Ci0JY2hhciBzX3NtYWxsX2J1ZlsyOF07IC8qIFJvb20gZm9yICJXaW5kb3dzIEVycm9yIDB4RkZGRkZGRkYiICovCisgICAgY2hhciAqc19idWYgPSBOVUxMOworICAgIGNoYXIgc19zbWFsbF9idWZbMjhdOyAvKiBSb29tIGZvciAiV2luZG93cyBFcnJvciAweEZGRkZGRkZGIiAqLwogI2VuZGlmCiAjaWZkZWYgRUlOVFIKLQlpZiAoaSA9PSBFSU5UUiAmJiBQeUVycl9DaGVja1NpZ25hbHMoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGkgPT0gRUlOVFIgJiYgUHlFcnJfQ2hlY2tTaWduYWxzKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiAjaWZkZWYgUExBTjkKLQlyZXJyc3RyKGVycmJ1Ziwgc2l6ZW9mIGVycmJ1Zik7Ci0JcyA9IGVycmJ1ZjsKKyAgICByZXJyc3RyKGVycmJ1Ziwgc2l6ZW9mIGVycmJ1Zik7CisgICAgcyA9IGVycmJ1ZjsKICNlbHNlCi0JaWYgKGkgPT0gMCkKLQkJcyA9ICJFcnJvciI7IC8qIFNvbWV0aW1lcyBlcnJubyBkaWRuJ3QgZ2V0IHNldCAqLwotCWVsc2UKKyAgICBpZiAoaSA9PSAwKQorICAgICAgICBzID0gIkVycm9yIjsgLyogU29tZXRpbWVzIGVycm5vIGRpZG4ndCBnZXQgc2V0ICovCisgICAgZWxzZQogI2lmbmRlZiBNU19XSU5ET1dTCi0JCXMgPSBzdHJlcnJvcihpKTsKKyAgICAgICAgcyA9IHN0cmVycm9yKGkpOwogI2Vsc2UKLQl7Ci0JCS8qIE5vdGUgdGhhdCB0aGUgV2luMzIgZXJyb3JzIGRvIG5vdCBsaW5ldXAgd2l0aCB0aGUKLQkJICAgZXJybm8gZXJyb3IuICBTbyBpZiB0aGUgZXJyb3IgaXMgaW4gdGhlIE1TVkMgZXJyb3IKLQkJICAgdGFibGUsIHdlIHVzZSBpdCwgb3RoZXJ3aXNlIHdlIGFzc3VtZSBpdCByZWFsbHkgX2lzXwotCQkgICBhIFdpbjMyIGVycm9yIGNvZGUKLQkJKi8KLQkJaWYgKGkgPiAwICYmIGkgPCBfc3lzX25lcnIpIHsKLQkJCXMgPSBfc3lzX2Vycmxpc3RbaV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgbGVuID0gRm9ybWF0TWVzc2FnZSgKLQkJCQlGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAotCQkJCUZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKLQkJCQlGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKLQkJCQlOVUxMLAkvKiBubyBtZXNzYWdlIHNvdXJjZSAqLwotCQkJCWksCi0JCQkJTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsCi0JCQkJCSAgIFNVQkxBTkdfREVGQVVMVCksCi0JCQkJICAgICAgICAgICAvKiBEZWZhdWx0IGxhbmd1YWdlICovCi0JCQkJKExQVFNUUikgJnNfYnVmLAotCQkJCTAsCS8qIHNpemUgbm90IHVzZWQgKi8KLQkJCQlOVUxMKTsJLyogbm8gYXJncyAqLwotCQkJaWYgKGxlbj09MCkgewotCQkJCS8qIE9ubHkgZXZlciBzZWVuIHRoaXMgaW4gb3V0LW9mLW1lbQotCQkJCSAgIHNpdHVhdGlvbnMgKi8KLQkJCQlzcHJpbnRmKHNfc21hbGxfYnVmLCAiV2luZG93cyBFcnJvciAweCVYIiwgaSk7Ci0JCQkJcyA9IHNfc21hbGxfYnVmOwotCQkJCXNfYnVmID0gTlVMTDsKLQkJCX0gZWxzZSB7Ci0JCQkJcyA9IHNfYnVmOwotCQkJCS8qIHJlbW92ZSB0cmFpbGluZyBjci9sZiBhbmQgZG90cyAqLwotCQkJCXdoaWxlIChsZW4gPiAwICYmIChzW2xlbi0xXSA8PSAnICcgfHwgc1tsZW4tMV0gPT0gJy4nKSkKLQkJCQkJc1stLWxlbl0gPSAnXDAnOwotCQkJfQotCQl9Ci0JfQorICAgIHsKKyAgICAgICAgLyogTm90ZSB0aGF0IHRoZSBXaW4zMiBlcnJvcnMgZG8gbm90IGxpbmV1cCB3aXRoIHRoZQorICAgICAgICAgICBlcnJubyBlcnJvci4gIFNvIGlmIHRoZSBlcnJvciBpcyBpbiB0aGUgTVNWQyBlcnJvcgorICAgICAgICAgICB0YWJsZSwgd2UgdXNlIGl0LCBvdGhlcndpc2Ugd2UgYXNzdW1lIGl0IHJlYWxseSBfaXNfCisgICAgICAgICAgIGEgV2luMzIgZXJyb3IgY29kZQorICAgICAgICAqLworICAgICAgICBpZiAoaSA+IDAgJiYgaSA8IF9zeXNfbmVycikgeworICAgICAgICAgICAgcyA9IF9zeXNfZXJybGlzdFtpXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBGb3JtYXRNZXNzYWdlKAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8CisgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAorICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIG5vIG1lc3NhZ2Ugc291cmNlICovCisgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQkxBTkdfREVGQVVMVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IGxhbmd1YWdlICovCisgICAgICAgICAgICAgICAgKExQVFNUUikgJnNfYnVmLAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgbm90IHVzZWQgKi8KKyAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgICAgICAgICAvKiBubyBhcmdzICovCisgICAgICAgICAgICBpZiAobGVuPT0wKSB7CisgICAgICAgICAgICAgICAgLyogT25seSBldmVyIHNlZW4gdGhpcyBpbiBvdXQtb2YtbWVtCisgICAgICAgICAgICAgICAgICAgc2l0dWF0aW9ucyAqLworICAgICAgICAgICAgICAgIHNwcmludGYoc19zbWFsbF9idWYsICJXaW5kb3dzIEVycm9yIDB4JVgiLCBpKTsKKyAgICAgICAgICAgICAgICBzID0gc19zbWFsbF9idWY7CisgICAgICAgICAgICAgICAgc19idWYgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzID0gc19idWY7CisgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHRyYWlsaW5nIGNyL2xmIGFuZCBkb3RzICovCisgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDAgJiYgKHNbbGVuLTFdIDw9ICcgJyB8fCBzW2xlbi0xXSA9PSAnLicpKQorICAgICAgICAgICAgICAgICAgICBzWy0tbGVuXSA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYgLyogVW5peC9XaW5kb3dzICovCiAjZW5kaWYgLyogUExBTiA5Ki8KLQlpZiAoZmlsZW5hbWVPYmplY3QgIT0gTlVMTCkKLQkJdiA9IFB5X0J1aWxkVmFsdWUoIihpc08pIiwgaSwgcywgZmlsZW5hbWVPYmplY3QpOwotCWVsc2UKLQkJdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBpLCBzKTsKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCVB5RXJyX1NldE9iamVjdChleGMsIHYpOwotCQlQeV9ERUNSRUYodik7Ci0JfQorICAgIGlmIChmaWxlbmFtZU9iamVjdCAhPSBOVUxMKQorICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzTykiLCBpLCBzLCBmaWxlbmFtZU9iamVjdCk7CisgICAgZWxzZQorICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGksIHMpOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KGV4Yywgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiAjaWZkZWYgTVNfV0lORE9XUwotCUxvY2FsRnJlZShzX2J1Zik7CisgICAgTG9jYWxGcmVlKHNfYnVmKTsKICNlbmRpZgotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiAKIFB5T2JqZWN0ICoKIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShQeU9iamVjdCAqZXhjLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlQeU9iamVjdCAqbmFtZSA9IGZpbGVuYW1lID8gUHlTdHJpbmdfRnJvbVN0cmluZyhmaWxlbmFtZSkgOiBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QoZXhjLCBuYW1lKTsKLQlQeV9YREVDUkVGKG5hbWUpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKm5hbWUgPSBmaWxlbmFtZSA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpIDogTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywgbmFtZSk7CisgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAjaWZkZWYgTVNfV0lORE9XUwogUHlPYmplY3QgKgogUHlFcnJfU2V0RnJvbUVycm5vV2l0aFVuaWNvZGVGaWxlbmFtZShQeU9iamVjdCAqZXhjLCBjb25zdCBQeV9VTklDT0RFICpmaWxlbmFtZSkKIHsKLQlQeU9iamVjdCAqbmFtZSA9IGZpbGVuYW1lID8KLQkgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Gcm9tVW5pY29kZShmaWxlbmFtZSwgd2NzbGVuKGZpbGVuYW1lKSkgOgotCSAgICAgICAgICAgICAgICAgTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywgbmFtZSk7Ci0JUHlfWERFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPworICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0Zyb21Vbmljb2RlKGZpbGVuYW1lLCB3Y3NsZW4oZmlsZW5hbWUpKSA6CisgICAgICAgICAgICAgTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywgbmFtZSk7CisgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogUHlPYmplY3QgKgogUHlFcnJfU2V0RnJvbUVycm5vKFB5T2JqZWN0ICpleGMpCiB7Ci0JcmV0dXJuIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChleGMsIE5VTEwpOworICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QoZXhjLCBOVUxMKTsKIH0KIAogI2lmZGVmIE1TX1dJTkRPV1MKIC8qIFdpbmRvd3Mgc3BlY2lmaWMgZXJyb3IgY29kZSBoYW5kbGluZyAqLwogUHlPYmplY3QgKlB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KAotCVB5T2JqZWN0ICpleGMsCi0JaW50IGllcnIsCi0JUHlPYmplY3QgKmZpbGVuYW1lT2JqZWN0KQorICAgIFB5T2JqZWN0ICpleGMsCisgICAgaW50IGllcnIsCisgICAgUHlPYmplY3QgKmZpbGVuYW1lT2JqZWN0KQogewotCWludCBsZW47Ci0JY2hhciAqczsKLQljaGFyICpzX2J1ZiA9IE5VTEw7IC8qIEZyZWUgdmlhIExvY2FsRnJlZSAqLwotCWNoYXIgc19zbWFsbF9idWZbMjhdOyAvKiBSb29tIGZvciAiV2luZG93cyBFcnJvciAweEZGRkZGRkZGIiAqLwotCVB5T2JqZWN0ICp2OwotCURXT1JEIGVyciA9IChEV09SRClpZXJyOwotCWlmIChlcnI9PTApIGVyciA9IEdldExhc3RFcnJvcigpOwotCWxlbiA9IEZvcm1hdE1lc3NhZ2UoCi0JCS8qIEVycm9yIEFQSSBlcnJvciAqLwotCQlGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAotCQlGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8Ci0JCUZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAotCQlOVUxMLAkvKiBubyBtZXNzYWdlIHNvdXJjZSAqLwotCQllcnIsCi0JCU1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLAotCQlTVUJMQU5HX0RFRkFVTFQpLCAvKiBEZWZhdWx0IGxhbmd1YWdlICovCi0JCShMUFRTVFIpICZzX2J1ZiwKLQkJMCwJLyogc2l6ZSBub3QgdXNlZCAqLwotCQlOVUxMKTsJLyogbm8gYXJncyAqLwotCWlmIChsZW49PTApIHsKLQkJLyogT25seSBzZWVuIHRoaXMgaW4gb3V0IG9mIG1lbSBzaXR1YXRpb25zICovCi0JCXNwcmludGYoc19zbWFsbF9idWYsICJXaW5kb3dzIEVycm9yIDB4JVgiLCBlcnIpOwotCQlzID0gc19zbWFsbF9idWY7Ci0JCXNfYnVmID0gTlVMTDsKLQl9IGVsc2UgewotCQlzID0gc19idWY7Ci0JCS8qIHJlbW92ZSB0cmFpbGluZyBjci9sZiBhbmQgZG90cyAqLwotCQl3aGlsZSAobGVuID4gMCAmJiAoc1tsZW4tMV0gPD0gJyAnIHx8IHNbbGVuLTFdID09ICcuJykpCi0JCQlzWy0tbGVuXSA9ICdcMCc7Ci0JfQotCWlmIChmaWxlbmFtZU9iamVjdCAhPSBOVUxMKQotCQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzTykiLCBlcnIsIHMsIGZpbGVuYW1lT2JqZWN0KTsKLQllbHNlCi0JCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJyLCBzKTsKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCVB5RXJyX1NldE9iamVjdChleGMsIHYpOwotCQlQeV9ERUNSRUYodik7Ci0JfQotCUxvY2FsRnJlZShzX2J1Zik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaW50IGxlbjsKKyAgICBjaGFyICpzOworICAgIGNoYXIgKnNfYnVmID0gTlVMTDsgLyogRnJlZSB2aWEgTG9jYWxGcmVlICovCisgICAgY2hhciBzX3NtYWxsX2J1ZlsyOF07IC8qIFJvb20gZm9yICJXaW5kb3dzIEVycm9yIDB4RkZGRkZGRkYiICovCisgICAgUHlPYmplY3QgKnY7CisgICAgRFdPUkQgZXJyID0gKERXT1JEKWllcnI7CisgICAgaWYgKGVycj09MCkgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgbGVuID0gRm9ybWF0TWVzc2FnZSgKKyAgICAgICAgLyogRXJyb3IgQVBJIGVycm9yICovCisgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8CisgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKKyAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCisgICAgICAgIE5VTEwsICAgICAgICAgICAvKiBubyBtZXNzYWdlIHNvdXJjZSAqLworICAgICAgICBlcnIsCisgICAgICAgIE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLAorICAgICAgICBTVUJMQU5HX0RFRkFVTFQpLCAvKiBEZWZhdWx0IGxhbmd1YWdlICovCisgICAgICAgIChMUFRTVFIpICZzX2J1ZiwKKyAgICAgICAgMCwgICAgICAgICAgICAgIC8qIHNpemUgbm90IHVzZWQgKi8KKyAgICAgICAgTlVMTCk7ICAgICAgICAgIC8qIG5vIGFyZ3MgKi8KKyAgICBpZiAobGVuPT0wKSB7CisgICAgICAgIC8qIE9ubHkgc2VlbiB0aGlzIGluIG91dCBvZiBtZW0gc2l0dWF0aW9ucyAqLworICAgICAgICBzcHJpbnRmKHNfc21hbGxfYnVmLCAiV2luZG93cyBFcnJvciAweCVYIiwgZXJyKTsKKyAgICAgICAgcyA9IHNfc21hbGxfYnVmOworICAgICAgICBzX2J1ZiA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcyA9IHNfYnVmOworICAgICAgICAvKiByZW1vdmUgdHJhaWxpbmcgY3IvbGYgYW5kIGRvdHMgKi8KKyAgICAgICAgd2hpbGUgKGxlbiA+IDAgJiYgKHNbbGVuLTFdIDw9ICcgJyB8fCBzW2xlbi0xXSA9PSAnLicpKQorICAgICAgICAgICAgc1stLWxlbl0gPSAnXDAnOworICAgIH0KKyAgICBpZiAoZmlsZW5hbWVPYmplY3QgIT0gTlVMTCkKKyAgICAgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihpc08pIiwgZXJyLCBzLCBmaWxlbmFtZU9iamVjdCk7CisgICAgZWxzZQorICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGVyciwgcyk7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoZXhjLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICBMb2NhbEZyZWUoc19idWYpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoCi0JUHlPYmplY3QgKmV4YywKLQlpbnQgaWVyciwKLQljb25zdCBjaGFyICpmaWxlbmFtZSkKKyAgICBQeU9iamVjdCAqZXhjLAorICAgIGludCBpZXJyLAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewotCVB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKSA6IE5VTEw7Ci0JUHlPYmplY3QgKnJldCA9IFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVyciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JUHlfWERFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcmV0OworICAgIFB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKSA6IE5VTEw7CisgICAgUHlPYmplY3QgKnJldCA9IFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBQeU9iamVjdCAqUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoVW5pY29kZUZpbGVuYW1lKAotCVB5T2JqZWN0ICpleGMsCi0JaW50IGllcnIsCi0JY29uc3QgUHlfVU5JQ09ERSAqZmlsZW5hbWUpCisgICAgUHlPYmplY3QgKmV4YywKKyAgICBpbnQgaWVyciwKKyAgICBjb25zdCBQeV9VTklDT0RFICpmaWxlbmFtZSkKIHsKLQlQeU9iamVjdCAqbmFtZSA9IGZpbGVuYW1lID8KLQkgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Gcm9tVW5pY29kZShmaWxlbmFtZSwgd2NzbGVuKGZpbGVuYW1lKSkgOgotCSAgICAgICAgICAgICAgICAgTlVMTDsKLQlQeU9iamVjdCAqcmV0ID0gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoZXhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZXJyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQlQeV9YREVDUkVGKG5hbWUpOwotCXJldHVybiByZXQ7CisgICAgUHlPYmplY3QgKm5hbWUgPSBmaWxlbmFtZSA/CisgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoZmlsZW5hbWUsIHdjc2xlbihmaWxlbmFtZSkpIDoKKyAgICAgICAgICAgICBOVUxMOworICAgIFB5T2JqZWN0ICpyZXQgPSBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdChleGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIFB5X1hERUNSRUYobmFtZSk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlPYmplY3QgKlB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKFB5T2JqZWN0ICpleGMsIGludCBpZXJyKQogewotCXJldHVybiBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZShleGMsIGllcnIsIE5VTEwpOworICAgIHJldHVybiBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZShleGMsIGllcnIsIE5VTEwpOwogfQogCiBQeU9iamVjdCAqUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoaW50IGllcnIpCiB7Ci0JcmV0dXJuIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJCSAgICAgIGllcnIsIE5VTEwpOworICAgIHJldHVybiBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZShQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllcnIsIE5VTEwpOwogfQogUHlPYmplY3QgKlB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKAotCWludCBpZXJyLAotCWNvbnN0IGNoYXIgKmZpbGVuYW1lKQorICAgIGludCBpZXJyLAorICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewotCVB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKSA6IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KAotCQkJCQkJICAgICAgUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCQkJICAgICAgaWVyciwgbmFtZSk7Ci0JUHlfWERFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKSA6IE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllcnIsIG5hbWUpOworICAgIFB5X1hERUNSRUYobmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlPYmplY3QgKlB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aFVuaWNvZGVGaWxlbmFtZSgKLQlpbnQgaWVyciwKLQljb25zdCBQeV9VTklDT0RFICpmaWxlbmFtZSkKKyAgICBpbnQgaWVyciwKKyAgICBjb25zdCBQeV9VTklDT0RFICpmaWxlbmFtZSkKIHsKLQlQeU9iamVjdCAqbmFtZSA9IGZpbGVuYW1lID8KLQkgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Gcm9tVW5pY29kZShmaWxlbmFtZSwgd2NzbGVuKGZpbGVuYW1lKSkgOgotCSAgICAgICAgICAgICAgICAgTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoCi0JCQkJCQkgICAgICBQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCQkgICAgICBpZXJyLCBuYW1lKTsKLQlQeV9YREVDUkVGKG5hbWUpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKm5hbWUgPSBmaWxlbmFtZSA/CisgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoZmlsZW5hbWUsIHdjc2xlbihmaWxlbmFtZSkpIDoKKyAgICAgICAgICAgICBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZXJyLCBuYW1lKTsKKyAgICBQeV9YREVDUkVGKG5hbWUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiB2b2lkCiBfUHlFcnJfQmFkSW50ZXJuYWxDYWxsKGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKQogewotCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJICAgICAiJXM6JWQ6IGJhZCBhcmd1bWVudCB0byBpbnRlcm5hbCBmdW5jdGlvbiIsCi0JCSAgICAgZmlsZW5hbWUsIGxpbmVubyk7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAiJXM6JWQ6IGJhZCBhcmd1bWVudCB0byBpbnRlcm5hbCBmdW5jdGlvbiIsCisgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm8pOwogfQogCiAvKiBSZW1vdmUgdGhlIHByZXByb2Nlc3NvciBtYWNybyBmb3IgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCkgc28gdGhhdCB3ZSBjYW4KQEAgLTUyNiw4ICs1MjYsOCBAQAogdm9pZAogUHlFcnJfQmFkSW50ZXJuYWxDYWxsKHZvaWQpCiB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkgICAgICJiYWQgYXJndW1lbnQgdG8gaW50ZXJuYWwgZnVuY3Rpb24iKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICJiYWQgYXJndW1lbnQgdG8gaW50ZXJuYWwgZnVuY3Rpb24iKTsKIH0KICNkZWZpbmUgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCkgX1B5RXJyX0JhZEludGVybmFsQ2FsbChfX0ZJTEVfXywgX19MSU5FX18pCiAKQEAgLTUzNiwyMCArNTM2LDIwIEBACiBQeU9iamVjdCAqCiBQeUVycl9Gb3JtYXQoUHlPYmplY3QgKmV4Y2VwdGlvbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YXJnczsKLQlQeU9iamVjdCogc3RyaW5nOworICAgIHZhX2xpc3QgdmFyZ3M7CisgICAgUHlPYmplY3QqIHN0cmluZzsKIAogI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKLQl2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKKyAgICB2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKICNlbHNlCi0JdmFfc3RhcnQodmFyZ3MpOworICAgIHZhX3N0YXJ0KHZhcmdzKTsKICNlbmRpZgogCi0Jc3RyaW5nID0gUHlTdHJpbmdfRnJvbUZvcm1hdFYoZm9ybWF0LCB2YXJncyk7Ci0JUHlFcnJfU2V0T2JqZWN0KGV4Y2VwdGlvbiwgc3RyaW5nKTsKLQlQeV9YREVDUkVGKHN0cmluZyk7Ci0JdmFfZW5kKHZhcmdzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBzdHJpbmcgPSBQeVN0cmluZ19Gcm9tRm9ybWF0Vihmb3JtYXQsIHZhcmdzKTsKKyAgICBQeUVycl9TZXRPYmplY3QoZXhjZXB0aW9uLCBzdHJpbmcpOworICAgIFB5X1hERUNSRUYoc3RyaW5nKTsKKyAgICB2YV9lbmQodmFyZ3MpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTU1Nyw1MSArNTU3LDUxIEBACiBQeU9iamVjdCAqCiBQeUVycl9OZXdFeGNlcHRpb24oY2hhciAqbmFtZSwgUHlPYmplY3QgKmJhc2UsIFB5T2JqZWN0ICpkaWN0KQogewotCWNoYXIgKmRvdDsKLQlQeU9iamVjdCAqbW9kdWxlbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmNsYXNzbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKm15ZGljdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmJhc2VzID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlkb3QgPSBzdHJyY2hyKG5hbWUsICcuJyk7Ci0JaWYgKGRvdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSJQeUVycl9OZXdFeGNlcHRpb246IG5hbWUgbXVzdCBiZSBtb2R1bGUuY2xhc3MiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChiYXNlID09IE5VTEwpCi0JCWJhc2UgPSBQeUV4Y19FeGNlcHRpb247Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlkaWN0ID0gbXlkaWN0ID0gUHlEaWN0X05ldygpOwotCQlpZiAoZGljdCA9PSBOVUxMKQotCQkJZ290byBmYWlsdXJlOwotCX0KLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fbW9kdWxlX18iKSA9PSBOVUxMKSB7Ci0JCW1vZHVsZW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuYW1lLAotCQkJCQkJICAgICAoUHlfc3NpemVfdCkoZG90LW5hbWUpKTsKLQkJaWYgKG1vZHVsZW5hbWUgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbHVyZTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX21vZHVsZV9fIiwgbW9kdWxlbmFtZSkgIT0gMCkKLQkJCWdvdG8gZmFpbHVyZTsKLQl9Ci0JaWYgKFB5VHVwbGVfQ2hlY2soYmFzZSkpIHsKLQkJYmFzZXMgPSBiYXNlOwotCQkvKiBJTkNSRUYgYXMgd2UgY3JlYXRlIGEgbmV3IHJlZiBpbiB0aGUgZWxzZSBicmFuY2ggKi8KLQkJUHlfSU5DUkVGKGJhc2VzKTsKLQl9IGVsc2UgewotCQliYXNlcyA9IFB5VHVwbGVfUGFjaygxLCBiYXNlKTsKLQkJaWYgKGJhc2VzID09IE5VTEwpCi0JCQlnb3RvIGZhaWx1cmU7Ci0JfQotCS8qIENyZWF0ZSBhIHJlYWwgbmV3LXN0eWxlIGNsYXNzLiAqLwotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikmUHlUeXBlX1R5cGUsICJzT08iLAotCQkJCSAgICAgICBkb3QrMSwgYmFzZXMsIGRpY3QpOworICAgIGNoYXIgKmRvdDsKKyAgICBQeU9iamVjdCAqbW9kdWxlbmFtZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNsYXNzbmFtZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm15ZGljdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmJhc2VzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBkb3QgPSBzdHJyY2hyKG5hbWUsICcuJyk7CisgICAgaWYgKGRvdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJQeUVycl9OZXdFeGNlcHRpb246IG5hbWUgbXVzdCBiZSBtb2R1bGUuY2xhc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChiYXNlID09IE5VTEwpCisgICAgICAgIGJhc2UgPSBQeUV4Y19FeGNlcHRpb247CisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBkaWN0ID0gbXlkaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fbW9kdWxlX18iKSA9PSBOVUxMKSB7CisgICAgICAgIG1vZHVsZW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QpKGRvdC1uYW1lKSk7CisgICAgICAgIGlmIChtb2R1bGVuYW1lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19tb2R1bGVfXyIsIG1vZHVsZW5hbWUpICE9IDApCisgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICAgIGlmIChQeVR1cGxlX0NoZWNrKGJhc2UpKSB7CisgICAgICAgIGJhc2VzID0gYmFzZTsKKyAgICAgICAgLyogSU5DUkVGIGFzIHdlIGNyZWF0ZSBhIG5ldyByZWYgaW4gdGhlIGVsc2UgYnJhbmNoICovCisgICAgICAgIFB5X0lOQ1JFRihiYXNlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmFzZXMgPSBQeVR1cGxlX1BhY2soMSwgYmFzZSk7CisgICAgICAgIGlmIChiYXNlcyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKyAgICAvKiBDcmVhdGUgYSByZWFsIG5ldy1zdHlsZSBjbGFzcy4gKi8KKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopJlB5VHlwZV9UeXBlLCAic09PIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90KzEsIGJhc2VzLCBkaWN0KTsKICAgZmFpbHVyZToKLQlQeV9YREVDUkVGKGJhc2VzKTsKLQlQeV9YREVDUkVGKG15ZGljdCk7Ci0JUHlfWERFQ1JFRihjbGFzc25hbWUpOwotCVB5X1hERUNSRUYobW9kdWxlbmFtZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGJhc2VzKTsKKyAgICBQeV9YREVDUkVGKG15ZGljdCk7CisgICAgUHlfWERFQ1JFRihjbGFzc25hbWUpOworICAgIFB5X1hERUNSRUYobW9kdWxlbmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCkBAIC02MDksMzIgKzYwOSwzMiBAQAogUHlPYmplY3QgKgogUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYyhjaGFyICpuYW1lLCBjaGFyICpkb2MsIFB5T2JqZWN0ICpiYXNlLCBQeU9iamVjdCAqZGljdCkKIHsKLQlpbnQgcmVzdWx0OwotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCVB5T2JqZWN0ICpteWRpY3QgPSBOVUxMOyAvKiBwb2ludHMgdG8gdGhlIGRpY3Qgb25seSBpZiB3ZSBjcmVhdGUgaXQgKi8KLQlQeU9iamVjdCAqZG9jb2JqOworICAgIGludCByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm15ZGljdCA9IE5VTEw7IC8qIHBvaW50cyB0byB0aGUgZGljdCBvbmx5IGlmIHdlIGNyZWF0ZSBpdCAqLworICAgIFB5T2JqZWN0ICpkb2NvYmo7CiAKLQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCWRpY3QgPSBteWRpY3QgPSBQeURpY3RfTmV3KCk7Ci0JCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgZGljdCA9IG15ZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoZG9jICE9IE5VTEwpIHsKLQkJZG9jb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2MpOwotCQlpZiAoZG9jb2JqID09IE5VTEwpCi0JCQlnb3RvIGZhaWx1cmU7Ci0JCXJlc3VsdCA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RvY19fIiwgZG9jb2JqKTsKLQkJUHlfREVDUkVGKGRvY29iaik7Ci0JCWlmIChyZXN1bHQgPCAwKQotCQkJZ290byBmYWlsdXJlOwotCX0KKyAgICBpZiAoZG9jICE9IE5VTEwpIHsKKyAgICAgICAgZG9jb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2MpOworICAgICAgICBpZiAoZG9jb2JqID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgICAgIHJlc3VsdCA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RvY19fIiwgZG9jb2JqKTsKKyAgICAgICAgUHlfREVDUkVGKGRvY29iaik7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsdXJlOworICAgIH0KIAotCXJldCA9IFB5RXJyX05ld0V4Y2VwdGlvbihuYW1lLCBiYXNlLCBkaWN0KTsKKyAgICByZXQgPSBQeUVycl9OZXdFeGNlcHRpb24obmFtZSwgYmFzZSwgZGljdCk7CiAgIGZhaWx1cmU6Ci0JUHlfWERFQ1JFRihteWRpY3QpOwotCXJldHVybiByZXQ7CisgICAgUHlfWERFQ1JFRihteWRpY3QpOworICAgIHJldHVybiByZXQ7CiB9CiAKIApAQCAtNjQzLDUyICs2NDMsNTIgQEAKIHZvaWQKIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0ICpmLCAqdCwgKnYsICp0YjsKLQlQeUVycl9GZXRjaCgmdCwgJnYsICZ0Yik7Ci0JZiA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7Ci0JaWYgKGYgIT0gTlVMTCkgewotCQlQeUZpbGVfV3JpdGVTdHJpbmcoIkV4Y2VwdGlvbiAiLCBmKTsKLQkJaWYgKHQpIHsKLQkJCVB5T2JqZWN0KiBtb2R1bGVOYW1lOwotCQkJY2hhciogY2xhc3NOYW1lOwotCQkJYXNzZXJ0KFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodCkpOwotCQkJY2xhc3NOYW1lID0gUHlFeGNlcHRpb25DbGFzc19OYW1lKHQpOwotCQkJaWYgKGNsYXNzTmFtZSAhPSBOVUxMKSB7Ci0JCQkJY2hhciAqZG90ID0gc3RycmNocihjbGFzc05hbWUsICcuJyk7Ci0JCQkJaWYgKGRvdCAhPSBOVUxMKQotCQkJCQljbGFzc05hbWUgPSBkb3QrMTsKLQkJCX0KKyAgICBQeU9iamVjdCAqZiwgKnQsICp2LCAqdGI7CisgICAgUHlFcnJfRmV0Y2goJnQsICZ2LCAmdGIpOworICAgIGYgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOworICAgIGlmIChmICE9IE5VTEwpIHsKKyAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCJFeGNlcHRpb24gIiwgZik7CisgICAgICAgIGlmICh0KSB7CisgICAgICAgICAgICBQeU9iamVjdCogbW9kdWxlTmFtZTsKKyAgICAgICAgICAgIGNoYXIqIGNsYXNzTmFtZTsKKyAgICAgICAgICAgIGFzc2VydChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHQpKTsKKyAgICAgICAgICAgIGNsYXNzTmFtZSA9IFB5RXhjZXB0aW9uQ2xhc3NfTmFtZSh0KTsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNoYXIgKmRvdCA9IHN0cnJjaHIoY2xhc3NOYW1lLCAnLicpOworICAgICAgICAgICAgICAgIGlmIChkb3QgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gZG90KzE7CisgICAgICAgICAgICB9CiAKLQkJCW1vZHVsZU5hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHQsICJfX21vZHVsZV9fIik7Ci0JCQlpZiAobW9kdWxlTmFtZSA9PSBOVUxMKQotCQkJCVB5RmlsZV9Xcml0ZVN0cmluZygiPHVua25vd24+IiwgZik7Ci0JCQllbHNlIHsKLQkJCQljaGFyKiBtb2RzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhtb2R1bGVOYW1lKTsKLQkJCQlpZiAobW9kc3RyICYmCi0JCQkJICAgIHN0cmNtcChtb2RzdHIsICJleGNlcHRpb25zIikgIT0gMCkKLQkJCQl7Ci0JCQkJCVB5RmlsZV9Xcml0ZVN0cmluZyhtb2RzdHIsIGYpOwotCQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoIi4iLCBmKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2xhc3NOYW1lID09IE5VTEwpCi0JCQkJUHlGaWxlX1dyaXRlU3RyaW5nKCI8dW5rbm93bj4iLCBmKTsKLQkJCWVsc2UKLQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoY2xhc3NOYW1lLCBmKTsKLQkJCWlmICh2ICYmIHYgIT0gUHlfTm9uZSkgewotCQkJCVB5RmlsZV9Xcml0ZVN0cmluZygiOiAiLCBmKTsKLQkJCQlQeUZpbGVfV3JpdGVPYmplY3QodiwgZiwgMCk7Ci0JCQl9Ci0JCQlQeV9YREVDUkVGKG1vZHVsZU5hbWUpOwotCQl9Ci0JCVB5RmlsZV9Xcml0ZVN0cmluZygiIGluICIsIGYpOwotCQlQeUZpbGVfV3JpdGVPYmplY3Qob2JqLCBmLCAwKTsKLQkJUHlGaWxlX1dyaXRlU3RyaW5nKCIgaWdub3JlZFxuIiwgZik7Ci0JCVB5RXJyX0NsZWFyKCk7IC8qIEp1c3QgaW4gY2FzZSAqLwotCX0KLQlQeV9YREVDUkVGKHQpOwotCVB5X1hERUNSRUYodik7Ci0JUHlfWERFQ1JFRih0Yik7CisgICAgICAgICAgICBtb2R1bGVOYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0LCAiX19tb2R1bGVfXyIpOworICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIjx1bmtub3duPiIsIGYpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhciogbW9kc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcobW9kdWxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG1vZHN0ciAmJgorICAgICAgICAgICAgICAgICAgICBzdHJjbXAobW9kc3RyLCAiZXhjZXB0aW9ucyIpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcobW9kc3RyLCBmKTsKKyAgICAgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCIuIiwgZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiPHVua25vd24+IiwgZik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKGNsYXNzTmFtZSwgZik7CisgICAgICAgICAgICBpZiAodiAmJiB2ICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIjogIiwgZik7CisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlT2JqZWN0KHYsIGYsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRihtb2R1bGVOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIiBpbiAiLCBmKTsKKyAgICAgICAgUHlGaWxlX1dyaXRlT2JqZWN0KG9iaiwgZiwgMCk7CisgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiIGlnbm9yZWRcbiIsIGYpOworICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBKdXN0IGluIGNhc2UgKi8KKyAgICB9CisgICAgUHlfWERFQ1JFRih0KTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIFB5X1hERUNSRUYodGIpOwogfQogCiBleHRlcm4gUHlPYmplY3QgKlB5TW9kdWxlX0dldFdhcm5pbmdzTW9kdWxlKHZvaWQpOwpAQCAtNzAxLDU5ICs3MDEsNTkgQEAKIHZvaWQKIFB5RXJyX1N5bnRheExvY2F0aW9uKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKQogewotCVB5T2JqZWN0ICpleGMsICp2LCAqdGIsICp0bXA7CisgICAgUHlPYmplY3QgKmV4YywgKnYsICp0YiwgKnRtcDsKIAotCS8qIGFkZCBhdHRyaWJ1dGVzIGZvciB0aGUgbGluZSBudW1iZXIgYW5kIGZpbGVuYW1lIGZvciB0aGUgZXJyb3IgKi8KLQlQeUVycl9GZXRjaCgmZXhjLCAmdiwgJnRiKTsKLQlQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJmV4YywgJnYsICZ0Yik7Ci0JLyogWFhYIGNoZWNrIHRoYXQgaXQgaXMsIGluZGVlZCwgYSBzeW50YXggZXJyb3IuIEl0IG1pZ2h0IG5vdAotCSAqIGJlLCB0aG91Z2guICovCi0JdG1wID0gUHlJbnRfRnJvbUxvbmcobGluZW5vKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZSB7Ci0JCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJsaW5lbm8iLCB0bXApKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlfREVDUkVGKHRtcCk7Ci0JfQotCWlmIChmaWxlbmFtZSAhPSBOVUxMKSB7Ci0JCXRtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOwotCQlpZiAodG1wID09IE5VTEwpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlIHsKLQkJCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJmaWxlbmFtZSIsIHRtcCkpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCVB5X0RFQ1JFRih0bXApOwotCQl9CisgICAgLyogYWRkIGF0dHJpYnV0ZXMgZm9yIHRoZSBsaW5lIG51bWJlciBhbmQgZmlsZW5hbWUgZm9yIHRoZSBlcnJvciAqLworICAgIFB5RXJyX0ZldGNoKCZleGMsICZ2LCAmdGIpOworICAgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmZXhjLCAmdiwgJnRiKTsKKyAgICAvKiBYWFggY2hlY2sgdGhhdCBpdCBpcywgaW5kZWVkLCBhIHN5bnRheCBlcnJvci4gSXQgbWlnaHQgbm90CisgICAgICogYmUsIHRob3VnaC4gKi8KKyAgICB0bXAgPSBQeUludF9Gcm9tTG9uZyhsaW5lbm8pOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgImxpbmVubyIsIHRtcCkpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICB9CisgICAgaWYgKGZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgdG1wID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmaWxlbmFtZSk7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgImZpbGVuYW1lIiwgdG1wKSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIH0KIAotCQl0bXAgPSBQeUVycl9Qcm9ncmFtVGV4dChmaWxlbmFtZSwgbGluZW5vKTsKLQkJaWYgKHRtcCkgewotCQkJaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgInRleHQiLCB0bXApKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeV9ERUNSRUYodG1wKTsKLQkJfQotCX0KLQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAib2Zmc2V0IiwgUHlfTm9uZSkpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JaWYgKGV4YyAhPSBQeUV4Y19TeW50YXhFcnJvcikgewotCQlpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodiwgIm1zZyIpKSB7Ci0JCQl0bXAgPSBQeU9iamVjdF9TdHIodik7Ci0JCQlpZiAodG1wKSB7Ci0JCQkJaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgIm1zZyIsIHRtcCkpCi0JCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJUHlfREVDUkVGKHRtcCk7Ci0JCQl9IGVsc2UgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHYsICJwcmludF9maWxlX2FuZF9saW5lIikpIHsKLQkJCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJwcmludF9maWxlX2FuZF9saW5lIiwKLQkJCQkJCSAgIFB5X05vbmUpKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQl9Ci0JUHlFcnJfUmVzdG9yZShleGMsIHYsIHRiKTsKKyAgICAgICAgdG1wID0gUHlFcnJfUHJvZ3JhbVRleHQoZmlsZW5hbWUsIGxpbmVubyk7CisgICAgICAgIGlmICh0bXApIHsKKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJ0ZXh0IiwgdG1wKSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgIm9mZnNldCIsIFB5X05vbmUpKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGlmIChleGMgIT0gUHlFeGNfU3ludGF4RXJyb3IpIHsKKyAgICAgICAgaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHYsICJtc2ciKSkgeworICAgICAgICAgICAgdG1wID0gUHlPYmplY3RfU3RyKHYpOworICAgICAgICAgICAgaWYgKHRtcCkgeworICAgICAgICAgICAgICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJtc2ciLCB0bXApKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghUHlPYmplY3RfSGFzQXR0clN0cmluZyh2LCAicHJpbnRfZmlsZV9hbmRfbGluZSIpKSB7CisgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAicHJpbnRfZmlsZV9hbmRfbGluZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIFB5RXJyX1Jlc3RvcmUoZXhjLCB2LCB0Yik7CiB9CiAKIC8qIGNvbV9mZXRjaF9wcm9ncmFtX3RleHQgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIGxpbmUgb2YgdGV4dCB0aGF0CkBAIC03NjcsMzYgKzc2NywzNiBAQAogUHlPYmplY3QgKgogUHlFcnJfUHJvZ3JhbVRleHQoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pCiB7Ci0JRklMRSAqZnA7Ci0JaW50IGk7Ci0JY2hhciBsaW5lYnVmWzEwMDBdOworICAgIEZJTEUgKmZwOworICAgIGludCBpOworICAgIGNoYXIgbGluZWJ1ZlsxMDAwXTsKIAotCWlmIChmaWxlbmFtZSA9PSBOVUxMIHx8ICpmaWxlbmFtZSA9PSAnXDAnIHx8IGxpbmVubyA8PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIgUFlfU1RESU9URVhUTU9ERSk7Ci0JaWYgKGZwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBsaW5lbm87IGkrKykgewotCQljaGFyICpwTGFzdENoYXIgPSAmbGluZWJ1ZltzaXplb2YobGluZWJ1ZikgLSAyXTsKLQkJZG8gewotCQkJKnBMYXN0Q2hhciA9ICdcMCc7Ci0JCQlpZiAoUHlfVW5pdmVyc2FsTmV3bGluZUZnZXRzKGxpbmVidWYsIHNpemVvZiBsaW5lYnVmLCBmcCwgTlVMTCkgPT0gTlVMTCkKLQkJCQlicmVhazsKLQkJCS8qIGZnZXRzIHJlYWQgKnNvbWV0aGluZyo7IGlmIGl0IGRpZG4ndCBnZXQgYXMKLQkJCSAgIGZhciBhcyBwTGFzdENoYXIsIGl0IG11c3QgaGF2ZSBmb3VuZCBhIG5ld2xpbmUKLQkJCSAgIG9yIGhpdCB0aGUgZW5kIG9mIHRoZSBmaWxlOyBpZiBwTGFzdENoYXIgaXMgXG4sCi0JCQkgICBpdCBvYnZpb3VzbHkgZm91bmQgYSBuZXdsaW5lOyBlbHNlIHdlIGhhdmVuJ3QKLQkJCSAgIHlldCBzZWVuIGEgbmV3bGluZSwgc28gbXVzdCBjb250aW51ZSAqLwotCQl9IHdoaWxlICgqcExhc3RDaGFyICE9ICdcMCcgJiYgKnBMYXN0Q2hhciAhPSAnXG4nKTsKLQl9Ci0JZmNsb3NlKGZwKTsKLQlpZiAoaSA9PSBsaW5lbm8pIHsKLQkJY2hhciAqcCA9IGxpbmVidWY7Ci0JCXdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXDAxNCcpCi0JCQlwKys7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHApOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCB8fCAqZmlsZW5hbWUgPT0gJ1wwJyB8fCBsaW5lbm8gPD0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiIFBZX1NURElPVEVYVE1PREUpOworICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGluZW5vOyBpKyspIHsKKyAgICAgICAgY2hhciAqcExhc3RDaGFyID0gJmxpbmVidWZbc2l6ZW9mKGxpbmVidWYpIC0gMl07CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICpwTGFzdENoYXIgPSAnXDAnOworICAgICAgICAgICAgaWYgKFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhsaW5lYnVmLCBzaXplb2YgbGluZWJ1ZiwgZnAsIE5VTEwpID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBmZ2V0cyByZWFkICpzb21ldGhpbmcqOyBpZiBpdCBkaWRuJ3QgZ2V0IGFzCisgICAgICAgICAgICAgICBmYXIgYXMgcExhc3RDaGFyLCBpdCBtdXN0IGhhdmUgZm91bmQgYSBuZXdsaW5lCisgICAgICAgICAgICAgICBvciBoaXQgdGhlIGVuZCBvZiB0aGUgZmlsZTsgaWYgcExhc3RDaGFyIGlzIFxuLAorICAgICAgICAgICAgICAgaXQgb2J2aW91c2x5IGZvdW5kIGEgbmV3bGluZTsgZWxzZSB3ZSBoYXZlbid0CisgICAgICAgICAgICAgICB5ZXQgc2VlbiBhIG5ld2xpbmUsIHNvIG11c3QgY29udGludWUgKi8KKyAgICAgICAgfSB3aGlsZSAoKnBMYXN0Q2hhciAhPSAnXDAnICYmICpwTGFzdENoYXIgIT0gJ1xuJyk7CisgICAgfQorICAgIGZjbG9zZShmcCk7CisgICAgaWYgKGkgPT0gbGluZW5vKSB7CisgICAgICAgIGNoYXIgKnAgPSBsaW5lYnVmOworICAgICAgICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJ1wwMTQnKQorICAgICAgICAgICAgcCsrOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhwKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Zyb3plbi5jIGIvUHl0aG9uL2Zyb3plbi5jCmluZGV4IDk0NmQ2MjYuLmFlN2U5YTQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mcm96ZW4uYworKysgYi9QeXRob24vZnJvemVuLmMKQEAgLTEyLDI0ICsxMiwyNCBAQAogICAgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGZyb20gTV9fX21haW5fXy5jLiAqLwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBNX19faGVsbG9fX1tdID0gewotCTk5LDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLAotCTAsMTE1LDksMCwwLDAsMTAwLDAsMCw3MSw3MiwxMDAsMSwwLDgzLDQwLAotCTIsMCwwLDAsMTE1LDE0LDAsMCwwLDcyLDEwMSwxMDgsMTA4LDExMSwzMiwxMTksCi0JMTExLDExNCwxMDgsMTAwLDQ2LDQ2LDQ2LDc4LDQwLDAsMCwwLDAsNDAsMCwwLAotCTAsMCw0MCwwLDAsMCwwLDQwLDAsMCwwLDAsMTE1LDgsMCwwLAotCTAsMTA0LDEwMSwxMDgsMTA4LDExMSw0NiwxMTIsMTIxLDExNSwxLDAsMCwwLDYzLDEsCi0JMCwwLDAsMTE1LDAsMCwwLDAsCisgICAgOTksMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCisgICAgMCwxMTUsOSwwLDAsMCwxMDAsMCwwLDcxLDcyLDEwMCwxLDAsODMsNDAsCisgICAgMiwwLDAsMCwxMTUsMTQsMCwwLDAsNzIsMTAxLDEwOCwxMDgsMTExLDMyLDExOSwKKyAgICAxMTEsMTE0LDEwOCwxMDAsNDYsNDYsNDYsNzgsNDAsMCwwLDAsMCw0MCwwLDAsCisgICAgMCwwLDQwLDAsMCwwLDAsNDAsMCwwLDAsMCwxMTUsOCwwLDAsCisgICAgMCwxMDQsMTAxLDEwOCwxMDgsMTExLDQ2LDExMiwxMjEsMTE1LDEsMCwwLDAsNjMsMSwKKyAgICAwLDAsMCwxMTUsMCwwLDAsMCwKIH07CiAKICNkZWZpbmUgU0laRSAoaW50KXNpemVvZihNX19faGVsbG9fXykKIAogc3RhdGljIHN0cnVjdCBfZnJvemVuIF9QeUltcG9ydF9Gcm96ZW5Nb2R1bGVzW10gPSB7Ci0JLyogVGVzdCBtb2R1bGUgKi8KLQl7Il9faGVsbG9fXyIsIE1fX19oZWxsb19fLCBTSVpFfSwKLQkvKiBUZXN0IHBhY2thZ2UgKG5lZ2F0aXZlIHNpemUgaW5kaWNhdGVzIHBhY2thZ2UtbmVzcykgKi8KLQl7Il9fcGhlbGxvX18iLCBNX19faGVsbG9fXywgLVNJWkV9LAotCXsiX19waGVsbG9fXy5zcGFtIiwgTV9fX2hlbGxvX18sIFNJWkV9LAotCXswLCAwLCAwfSAvKiBzZW50aW5lbCAqLworICAgIC8qIFRlc3QgbW9kdWxlICovCisgICAgeyJfX2hlbGxvX18iLCBNX19faGVsbG9fXywgU0laRX0sCisgICAgLyogVGVzdCBwYWNrYWdlIChuZWdhdGl2ZSBzaXplIGluZGljYXRlcyBwYWNrYWdlLW5lc3MpICovCisgICAgeyJfX3BoZWxsb19fIiwgTV9fX2hlbGxvX18sIC1TSVpFfSwKKyAgICB7Il9fcGhlbGxvX18uc3BhbSIsIE1fX19oZWxsb19fLCBTSVpFfSwKKyAgICB7MCwgMCwgMH0gLyogc2VudGluZWwgKi8KIH07CiAKIC8qIEVtYmVkZGluZyBhcHBzIG1heSBjaGFuZ2UgdGhpcyBwb2ludGVyIHRvIHBvaW50IHRvIHRoZWlyIGZhdm9yaXRlCmRpZmYgLS1naXQgYS9QeXRob24vZnJvemVubWFpbi5jIGIvUHl0aG9uL2Zyb3plbm1haW4uYwppbmRleCAzOTdmMDQ2Li5kMzFkYTA3IDEwMDY0NAotLS0gYS9QeXRob24vZnJvemVubWFpbi5jCisrKyBiL1B5dGhvbi9mcm96ZW5tYWluLmMKQEAgLTE0LDU1ICsxNCw1NSBAQAogaW50CiBQeV9Gcm96ZW5NYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQljaGFyICpwOwotCWludCBuLCBzdHM7Ci0JaW50IGluc3BlY3QgPSAwOwotCWludCB1bmJ1ZmZlcmVkID0gMDsKKyAgICBjaGFyICpwOworICAgIGludCBuLCBzdHM7CisgICAgaW50IGluc3BlY3QgPSAwOworICAgIGludCB1bmJ1ZmZlcmVkID0gMDsKIAotCVB5X0Zyb3plbkZsYWcgPSAxOyAvKiBTdXBwcmVzcyBlcnJvcnMgZnJvbSBnZXRwYXRoLmMgKi8KKyAgICBQeV9Gcm96ZW5GbGFnID0gMTsgLyogU3VwcHJlc3MgZXJyb3JzIGZyb20gZ2V0cGF0aC5jICovCiAKLQlpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTklOU1BFQ1QiKSkgJiYgKnAgIT0gJ1wwJykKLQkJaW5zcGVjdCA9IDE7Ci0JaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05VTkJVRkZFUkVEIikpICYmICpwICE9ICdcMCcpCi0JCXVuYnVmZmVyZWQgPSAxOworICAgIGlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OSU5TUEVDVCIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICBpbnNwZWN0ID0gMTsKKyAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTlVOQlVGRkVSRUQiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgdW5idWZmZXJlZCA9IDE7CiAKLQlpZiAodW5idWZmZXJlZCkgewotCQlzZXRidWYoc3RkaW4sIChjaGFyICopTlVMTCk7Ci0JCXNldGJ1ZihzdGRvdXQsIChjaGFyICopTlVMTCk7Ci0JCXNldGJ1ZihzdGRlcnIsIChjaGFyICopTlVMTCk7Ci0JfQorICAgIGlmICh1bmJ1ZmZlcmVkKSB7CisgICAgICAgIHNldGJ1ZihzdGRpbiwgKGNoYXIgKilOVUxMKTsKKyAgICAgICAgc2V0YnVmKHN0ZG91dCwgKGNoYXIgKilOVUxMKTsKKyAgICAgICAgc2V0YnVmKHN0ZGVyciwgKGNoYXIgKilOVUxMKTsKKyAgICB9CiAKICNpZmRlZiBNU19XSU5ET1dTCi0JUHlJbml0RnJvemVuRXh0ZW5zaW9ucygpOworICAgIFB5SW5pdEZyb3plbkV4dGVuc2lvbnMoKTsKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCi0JUHlfU2V0UHJvZ3JhbU5hbWUoYXJndlswXSk7Ci0JUHlfSW5pdGlhbGl6ZSgpOworICAgIFB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOworICAgIFB5X0luaXRpYWxpemUoKTsKICNpZmRlZiBNU19XSU5ET1dTCi0JUHlXaW5GcmVlemVfRXhlSW5pdCgpOworICAgIFB5V2luRnJlZXplX0V4ZUluaXQoKTsKICNlbmRpZgogCi0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlmcHJpbnRmKHN0ZGVyciwgIlB5dGhvbiAlc1xuJXNcbiIsCi0JCQlQeV9HZXRWZXJzaW9uKCksIFB5X0dldENvcHlyaWdodCgpKTsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUHl0aG9uICVzXG4lc1xuIiwKKyAgICAgICAgICAgIFB5X0dldFZlcnNpb24oKSwgUHlfR2V0Q29weXJpZ2h0KCkpOwogCi0JUHlTeXNfU2V0QXJndihhcmdjLCBhcmd2KTsKKyAgICBQeVN5c19TZXRBcmd2KGFyZ2MsIGFyZ3YpOwogCi0JbiA9IFB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZSgiX19tYWluX18iKTsKLQlpZiAobiA9PSAwKQotCQlQeV9GYXRhbEVycm9yKCJfX21haW5fXyBub3QgZnJvemVuIik7Ci0JaWYgKG4gPCAwKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXN0cyA9IDE7Ci0JfQotCWVsc2UKLQkJc3RzID0gMDsKKyAgICBuID0gUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlKCJfX21haW5fXyIpOworICAgIGlmIChuID09IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIl9fbWFpbl9fIG5vdCBmcm96ZW4iKTsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgc3RzID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzdHMgPSAwOwogCi0JaWYgKGluc3BlY3QgJiYgaXNhdHR5KChpbnQpZmlsZW5vKHN0ZGluKSkpCi0JCXN0cyA9IFB5UnVuX0FueUZpbGUoc3RkaW4sICI8c3RkaW4+IikgIT0gMDsKKyAgICBpZiAoaW5zcGVjdCAmJiBpc2F0dHkoKGludClmaWxlbm8oc3RkaW4pKSkKKyAgICAgICAgc3RzID0gUHlSdW5fQW55RmlsZShzdGRpbiwgIjxzdGRpbj4iKSAhPSAwOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCVB5V2luRnJlZXplX0V4ZVRlcm0oKTsKKyAgICBQeVdpbkZyZWV6ZV9FeGVUZXJtKCk7CiAjZW5kaWYKLQlQeV9GaW5hbGl6ZSgpOwotCXJldHVybiBzdHM7CisgICAgUHlfRmluYWxpemUoKTsKKyAgICByZXR1cm4gc3RzOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Z1dHVyZS5jIGIvUHl0aG9uL2Z1dHVyZS5jCmluZGV4IDUzMmE3ZmQuLjk2YmU3NTcgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mdXR1cmUuYworKysgYi9QeXRob24vZnV0dXJlLmMKQEAgLTE0LDEyOSArMTQsMTI5IEBACiBzdGF0aWMgaW50CiBmdXR1cmVfY2hlY2tfZmVhdHVyZXMoUHlGdXR1cmVGZWF0dXJlcyAqZmYsIHN0bXRfdHkgcywgY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0JaW50IGk7Ci0JYXNkbF9zZXEgKm5hbWVzOworICAgIGludCBpOworICAgIGFzZGxfc2VxICpuYW1lczsKIAotCWFzc2VydChzLT5raW5kID09IEltcG9ydEZyb21fa2luZCk7CisgICAgYXNzZXJ0KHMtPmtpbmQgPT0gSW1wb3J0RnJvbV9raW5kKTsKIAotCW5hbWVzID0gcy0+di5JbXBvcnRGcm9tLm5hbWVzOwotCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4obmFtZXMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhbGlhc190eSBuYW1lID0gKGFsaWFzX3R5KWFzZGxfc2VxX0dFVChuYW1lcywgaSk7Ci0JCWNvbnN0IGNoYXIgKmZlYXR1cmUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lLT5uYW1lKTsKLQkJaWYgKCFmZWF0dXJlKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX05FU1RFRF9TQ09QRVMpID09IDApIHsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfR0VORVJBVE9SUykgPT0gMCkgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9ESVZJU0lPTikgPT0gMCkgewotCQkJZmYtPmZmX2ZlYXR1cmVzIHw9IENPX0ZVVFVSRV9ESVZJU0lPTjsKLQkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX0FCU09MVVRFX0lNUE9SVCkgPT0gMCkgewotCQkJZmYtPmZmX2ZlYXR1cmVzIHw9IENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQ7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9XSVRIX1NUQVRFTUVOVCkgPT0gMCkgewotCQkJZmYtPmZmX2ZlYXR1cmVzIHw9IENPX0ZVVFVSRV9XSVRIX1NUQVRFTUVOVDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX1BSSU5UX0ZVTkNUSU9OKSA9PSAwKSB7Ci0JCQlmZi0+ZmZfZmVhdHVyZXMgfD0gQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OOwotCQl9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfVU5JQ09ERV9MSVRFUkFMUykgPT0gMCkgewotCQkJZmYtPmZmX2ZlYXR1cmVzIHw9IENPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTOwotCQl9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCAiYnJhY2VzIikgPT0gMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAotCQkJCQkibm90IGEgY2hhbmNlIik7Ci0JCQlQeUVycl9TeW50YXhMb2NhdGlvbihmaWxlbmFtZSwgcy0+bGluZW5vKTsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLAotCQkJCSAgICAgVU5ERUZJTkVEX0ZVVFVSRV9GRUFUVVJFLCBmZWF0dXJlKTsKLQkJCVB5RXJyX1N5bnRheExvY2F0aW9uKGZpbGVuYW1lLCBzLT5saW5lbm8pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgbmFtZXMgPSBzLT52LkltcG9ydEZyb20ubmFtZXM7CisgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihuYW1lcyk7IGkrKykgeworICAgICAgICBhbGlhc190eSBuYW1lID0gKGFsaWFzX3R5KWFzZGxfc2VxX0dFVChuYW1lcywgaSk7CisgICAgICAgIGNvbnN0IGNoYXIgKmZlYXR1cmUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lLT5uYW1lKTsKKyAgICAgICAgaWYgKCFmZWF0dXJlKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX05FU1RFRF9TQ09QRVMpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfR0VORVJBVE9SUykgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9ESVZJU0lPTikgPT0gMCkgeworICAgICAgICAgICAgZmYtPmZmX2ZlYXR1cmVzIHw9IENPX0ZVVFVSRV9ESVZJU0lPTjsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX0FCU09MVVRFX0lNUE9SVCkgPT0gMCkgeworICAgICAgICAgICAgZmYtPmZmX2ZlYXR1cmVzIHw9IENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQ7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9XSVRIX1NUQVRFTUVOVCkgPT0gMCkgeworICAgICAgICAgICAgZmYtPmZmX2ZlYXR1cmVzIHw9IENPX0ZVVFVSRV9XSVRIX1NUQVRFTUVOVDsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX1BSSU5UX0ZVTkNUSU9OKSA9PSAwKSB7CisgICAgICAgICAgICBmZi0+ZmZfZmVhdHVyZXMgfD0gQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfVU5JQ09ERV9MSVRFUkFMUykgPT0gMCkgeworICAgICAgICAgICAgZmYtPmZmX2ZlYXR1cmVzIHw9IENPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCAiYnJhY2VzIikgPT0gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYSBjaGFuY2UiKTsKKyAgICAgICAgICAgIFB5RXJyX1N5bnRheExvY2F0aW9uKGZpbGVuYW1lLCBzLT5saW5lbm8pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgVU5ERUZJTkVEX0ZVVFVSRV9GRUFUVVJFLCBmZWF0dXJlKTsKKyAgICAgICAgICAgIFB5RXJyX1N5bnRheExvY2F0aW9uKGZpbGVuYW1lLCBzLT5saW5lbm8pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGZ1dHVyZV9wYXJzZShQeUZ1dHVyZUZlYXR1cmVzICpmZiwgbW9kX3R5IG1vZCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0JaW50IGksIGZvdW5kX2RvY3N0cmluZyA9IDAsIGRvbmUgPSAwLCBwcmV2X2xpbmUgPSAwOworICAgIGludCBpLCBmb3VuZF9kb2NzdHJpbmcgPSAwLCBkb25lID0gMCwgcHJldl9saW5lID0gMDsKIAotCXN0YXRpYyBQeU9iamVjdCAqZnV0dXJlOwotCWlmICghZnV0dXJlKSB7Ci0JCWZ1dHVyZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZnV0dXJlX18iKTsKLQkJaWYgKCFmdXR1cmUpCi0JCQlyZXR1cm4gMDsKLQl9CisgICAgc3RhdGljIFB5T2JqZWN0ICpmdXR1cmU7CisgICAgaWYgKCFmdXR1cmUpIHsKKyAgICAgICAgZnV0dXJlID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19mdXR1cmVfXyIpOworICAgICAgICBpZiAoIWZ1dHVyZSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmICghKG1vZC0+a2luZCA9PSBNb2R1bGVfa2luZCB8fCBtb2QtPmtpbmQgPT0gSW50ZXJhY3RpdmVfa2luZCkpCi0JCXJldHVybiAxOworICAgIGlmICghKG1vZC0+a2luZCA9PSBNb2R1bGVfa2luZCB8fCBtb2QtPmtpbmQgPT0gSW50ZXJhY3RpdmVfa2luZCkpCisgICAgICAgIHJldHVybiAxOwogCi0JLyogQSBzdWJzZXF1ZW50IHBhc3Mgd2lsbCBkZXRlY3QgZnV0dXJlIGltcG9ydHMgdGhhdCBkb24ndAotCSAgIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiAgVGhlcmUncyBvbmUgY2FzZSwKLQkgICBob3dldmVyLCB0aGF0IGlzIGVhc2llciB0byBoYW5kbGUgaGVyZTogQSBzZXJpZXMgb2YgaW1wb3J0cwotCSAgIGpvaW5lZCBieSBzZW1pLWNvbG9ucywgd2hlcmUgdGhlIGZpcnN0IGltcG9ydCBpcyBhIGZ1dHVyZQotCSAgIHN0YXRlbWVudCBidXQgc29tZSBzdWJzZXF1ZW50IGltcG9ydCBoYXMgdGhlIGZ1dHVyZSBmb3JtCi0JICAgYnV0IGlzIHByZWNlZGVkIGJ5IGEgcmVndWxhciBpbXBvcnQuCi0JKi8KLQkgICAKKyAgICAvKiBBIHN1YnNlcXVlbnQgcGFzcyB3aWxsIGRldGVjdCBmdXR1cmUgaW1wb3J0cyB0aGF0IGRvbid0CisgICAgICAgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBUaGVyZSdzIG9uZSBjYXNlLAorICAgICAgIGhvd2V2ZXIsIHRoYXQgaXMgZWFzaWVyIHRvIGhhbmRsZSBoZXJlOiBBIHNlcmllcyBvZiBpbXBvcnRzCisgICAgICAgam9pbmVkIGJ5IHNlbWktY29sb25zLCB3aGVyZSB0aGUgZmlyc3QgaW1wb3J0IGlzIGEgZnV0dXJlCisgICAgICAgc3RhdGVtZW50IGJ1dCBzb21lIHN1YnNlcXVlbnQgaW1wb3J0IGhhcyB0aGUgZnV0dXJlIGZvcm0KKyAgICAgICBidXQgaXMgcHJlY2VkZWQgYnkgYSByZWd1bGFyIGltcG9ydC4KKyAgICAqLwogCi0JZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihtb2QtPnYuTW9kdWxlLmJvZHkpOyBpKyspIHsKLQkJc3RtdF90eSBzID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKG1vZC0+di5Nb2R1bGUuYm9keSwgaSk7CiAKLQkJaWYgKGRvbmUgJiYgcy0+bGluZW5vID4gcHJldl9saW5lKQotCQkJcmV0dXJuIDE7Ci0JCXByZXZfbGluZSA9IHMtPmxpbmVubzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKG1vZC0+di5Nb2R1bGUuYm9keSk7IGkrKykgeworICAgICAgICBzdG10X3R5IHMgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQobW9kLT52Lk1vZHVsZS5ib2R5LCBpKTsKIAotCQkvKiBUaGUgdGVzdHMgYmVsb3cgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIHVubGVzcyBpdCBpcwotCQkgICBzdGlsbCBwb3NzaWJsZSB0byBmaW5kIGEgZnV0dXJlIHN0YXRlbWVudC4gIFRoZSBvbmx5IHRoaW5ncwotCQkgICB0aGF0IGNhbiBwcmVjZWRlIGEgZnV0dXJlIHN0YXRlbWVudCBhcmUgYW5vdGhlciBmdXR1cmUKLQkJICAgc3RhdGVtZW50IGFuZCBhIGRvYyBzdHJpbmcuCi0JCSovCisgICAgICAgIGlmIChkb25lICYmIHMtPmxpbmVubyA+IHByZXZfbGluZSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBwcmV2X2xpbmUgPSBzLT5saW5lbm87CiAKLQkJaWYgKHMtPmtpbmQgPT0gSW1wb3J0RnJvbV9raW5kKSB7Ci0JCQlpZiAocy0+di5JbXBvcnRGcm9tLm1vZHVsZSA9PSBmdXR1cmUpIHsKLQkJCQlpZiAoZG9uZSkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsCi0JCQkJCQkJRVJSX0xBVEVfRlVUVVJFKTsKLQkJCQkJUHlFcnJfU3ludGF4TG9jYXRpb24oZmlsZW5hbWUsIAotCQkJCQkJCSAgICAgcy0+bGluZW5vKTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCWlmICghZnV0dXJlX2NoZWNrX2ZlYXR1cmVzKGZmLCBzLCBmaWxlbmFtZSkpCi0JCQkJCXJldHVybiAwOwotCQkJCWZmLT5mZl9saW5lbm8gPSBzLT5saW5lbm87Ci0JCQl9Ci0JCQllbHNlCi0JCQkJZG9uZSA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAocy0+a2luZCA9PSBFeHByX2tpbmQgJiYgIWZvdW5kX2RvY3N0cmluZykgewotCQkJZXhwcl90eSBlID0gcy0+di5FeHByLnZhbHVlOwotCQkJaWYgKGUtPmtpbmQgIT0gU3RyX2tpbmQpCi0JCQkJZG9uZSA9IDE7Ci0JCQllbHNlCi0JCQkJZm91bmRfZG9jc3RyaW5nID0gMTsKLQkJfQotCQllbHNlCi0JCQlkb25lID0gMTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgICAgIC8qIFRoZSB0ZXN0cyBiZWxvdyB3aWxsIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gdW5sZXNzIGl0IGlzCisgICAgICAgICAgIHN0aWxsIHBvc3NpYmxlIHRvIGZpbmQgYSBmdXR1cmUgc3RhdGVtZW50LiAgVGhlIG9ubHkgdGhpbmdzCisgICAgICAgICAgIHRoYXQgY2FuIHByZWNlZGUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZSBhbm90aGVyIGZ1dHVyZQorICAgICAgICAgICBzdGF0ZW1lbnQgYW5kIGEgZG9jIHN0cmluZy4KKyAgICAgICAgKi8KKworICAgICAgICBpZiAocy0+a2luZCA9PSBJbXBvcnRGcm9tX2tpbmQpIHsKKyAgICAgICAgICAgIGlmIChzLT52LkltcG9ydEZyb20ubW9kdWxlID09IGZ1dHVyZSkgeworICAgICAgICAgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9MQVRFX0ZVVFVSRSk7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1N5bnRheExvY2F0aW9uKGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lbm8pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFmdXR1cmVfY2hlY2tfZmVhdHVyZXMoZmYsIHMsIGZpbGVuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgZmYtPmZmX2xpbmVubyA9IHMtPmxpbmVubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzLT5raW5kID09IEV4cHJfa2luZCAmJiAhZm91bmRfZG9jc3RyaW5nKSB7CisgICAgICAgICAgICBleHByX3R5IGUgPSBzLT52LkV4cHIudmFsdWU7CisgICAgICAgICAgICBpZiAoZS0+a2luZCAhPSBTdHJfa2luZCkKKyAgICAgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3VuZF9kb2NzdHJpbmcgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRvbmUgPSAxOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogCiBQeUZ1dHVyZUZlYXR1cmVzICoKIFB5RnV0dXJlX0Zyb21BU1QobW9kX3R5IG1vZCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0JUHlGdXR1cmVGZWF0dXJlcyAqZmY7CisgICAgUHlGdXR1cmVGZWF0dXJlcyAqZmY7CiAKLQlmZiA9IChQeUZ1dHVyZUZlYXR1cmVzICopUHlPYmplY3RfTWFsbG9jKHNpemVvZihQeUZ1dHVyZUZlYXR1cmVzKSk7Ci0JaWYgKGZmID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZmLT5mZl9mZWF0dXJlcyA9IDA7Ci0JZmYtPmZmX2xpbmVubyA9IC0xOworICAgIGZmID0gKFB5RnV0dXJlRmVhdHVyZXMgKilQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKFB5RnV0dXJlRmVhdHVyZXMpKTsKKyAgICBpZiAoZmYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZmYtPmZmX2ZlYXR1cmVzID0gMDsKKyAgICBmZi0+ZmZfbGluZW5vID0gLTE7CiAKLQlpZiAoIWZ1dHVyZV9wYXJzZShmZiwgbW9kLCBmaWxlbmFtZSkpIHsKLQkJUHlPYmplY3RfRnJlZShmZik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gZmY7CisgICAgaWYgKCFmdXR1cmVfcGFyc2UoZmYsIG1vZCwgZmlsZW5hbWUpKSB7CisgICAgICAgIFB5T2JqZWN0X0ZyZWUoZmYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGZmOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dldGFyZ3MuYyBiL1B5dGhvbi9nZXRhcmdzLmMKaW5kZXggNTAyZTljZC4uN2MzZTlmYSAxMDA2NDQKLS0tIGEvUHl0aG9uL2dldGFyZ3MuYworKysgYi9QeXRob24vZ2V0YXJncy5jCkBAIC03LDE2ICs3LDE2IEBACiAKIAogI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgCitleHRlcm4gIkMiIHsKICNlbmRpZgogaW50IFB5QXJnX1BhcnNlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKIGludCBQeUFyZ19QYXJzZVR1cGxlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKIGludCBQeUFyZ19WYVBhcnNlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CiAKIGludCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKLQkJCQljb25zdCBjaGFyICosIGNoYXIgKiosIC4uLik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgLi4uKTsKIGludCBQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3JkcyhQeU9iamVjdCAqLCBQeU9iamVjdCAqLAotCQkJCWNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCk7CiAKICNpZmRlZiBIQVZFX0RFQ0xTUEVDX0RMTAogLyogRXhwb3J0IGZ1bmN0aW9ucyAqLwpAQCAtMzcsMTAzICszNywxMDMgQEAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyBpbnQgdmdldGFyZ3MxKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCAqLCBpbnQpOwogc3RhdGljIHZvaWQgc2V0ZXJyb3IoaW50LCBjb25zdCBjaGFyICosIGludCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgY2hhciAqY29udmVydGl0ZW0oUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsIGludCAqLCAKK3N0YXRpYyBjaGFyICpjb252ZXJ0aXRlbShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwgaW50ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBzaXplX3QsIFB5T2JqZWN0ICoqKTsKIHN0YXRpYyBjaGFyICpjb252ZXJ0dHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsCi0JCQkgIGludCAqLCBjaGFyICosIHNpemVfdCwgaW50LCBQeU9iamVjdCAqKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqLCBjaGFyICosIHNpemVfdCwgaW50LCBQeU9iamVjdCAqKik7CiBzdGF0aWMgY2hhciAqY29udmVydHNpbXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwgY2hhciAqLAotCQkJICAgc2l6ZV90LCBQeU9iamVjdCAqKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QsIFB5T2JqZWN0ICoqKTsKIHN0YXRpYyBQeV9zc2l6ZV90IGNvbnZlcnRidWZmZXIoUHlPYmplY3QgKiwgdm9pZCAqKnAsIGNoYXIgKiopOwogc3RhdGljIGludCBnZXRidWZmZXIoUHlPYmplY3QgKiwgUHlfYnVmZmVyICosIGNoYXIqKik7CiAKIHN0YXRpYyBpbnQgdmdldGFyZ3NrZXl3b3JkcyhQeU9iamVjdCAqLCBQeU9iamVjdCAqLAotCQkJICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQpOwogc3RhdGljIGNoYXIgKnNraXBpdGVtKGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50KTsKIAogaW50CiBQeUFyZ19QYXJzZShQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JaW50IHJldHZhbDsKLQl2YV9saXN0IHZhOwotCQotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCXJldHZhbCA9IHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZ2YSwgRkxBR19DT01QQVQpOwotCXZhX2VuZCh2YSk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICBpbnQgcmV0dmFsOworICAgIHZhX2xpc3QgdmE7CisKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICByZXR2YWwgPSB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmdmEsIEZMQUdfQ09NUEFUKTsKKyAgICB2YV9lbmQodmEpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIGludAogX1B5QXJnX1BhcnNlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQlpbnQgcmV0dmFsOwotCXZhX2xpc3QgdmE7Ci0JCi0JdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JcmV0dmFsID0gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJnZhLCBGTEFHX0NPTVBBVHxGTEFHX1NJWkVfVCk7Ci0JdmFfZW5kKHZhKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIGludCByZXR2YWw7CisgICAgdmFfbGlzdCB2YTsKKworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIHJldHZhbCA9IHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZ2YSwgRkxBR19DT01QQVR8RkxBR19TSVpFX1QpOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogCiBpbnQKIFB5QXJnX1BhcnNlVHVwbGUoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotCWludCByZXR2YWw7Ci0JdmFfbGlzdCB2YTsKLQkKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQlyZXR2YWwgPSB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmdmEsIDApOwotCXZhX2VuZCh2YSk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICBpbnQgcmV0dmFsOworICAgIHZhX2xpc3QgdmE7CisKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICByZXR2YWwgPSB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmdmEsIDApOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogaW50CiBfUHlBcmdfUGFyc2VUdXBsZV9TaXplVChQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JaW50IHJldHZhbDsKLQl2YV9saXN0IHZhOwotCQotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCXJldHZhbCA9IHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZ2YSwgRkxBR19TSVpFX1QpOwotCXZhX2VuZCh2YSk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICBpbnQgcmV0dmFsOworICAgIHZhX2xpc3QgdmE7CisKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICByZXR2YWwgPSB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmdmEsIEZMQUdfU0laRV9UKTsKKyAgICB2YV9lbmQodmEpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIAogaW50CiBQeUFyZ19WYVBhcnNlKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmEpCiB7Ci0JdmFfbGlzdCBsdmE7CisgICAgdmFfbGlzdCBsdmE7CiAKICNpZmRlZiBWQV9MSVNUX0lTX0FSUkFZCi0JbWVtY3B5KGx2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CisgICAgbWVtY3B5KGx2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CiAjZWxzZQogI2lmZGVmIF9fdmFfY29weQotCV9fdmFfY29weShsdmEsIHZhKTsKKyAgICBfX3ZhX2NvcHkobHZhLCB2YSk7CiAjZWxzZQotCWx2YSA9IHZhOworICAgIGx2YSA9IHZhOwogI2VuZGlmCiAjZW5kaWYKIAotCXJldHVybiB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmbHZhLCAwKTsKKyAgICByZXR1cm4gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJmx2YSwgMCk7CiB9CiAKIGludAogX1B5QXJnX1ZhUGFyc2VfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKIHsKLQl2YV9saXN0IGx2YTsKKyAgICB2YV9saXN0IGx2YTsKIAogI2lmZGVmIFZBX0xJU1RfSVNfQVJSQVkKLQltZW1jcHkobHZhLCB2YSwgc2l6ZW9mKHZhX2xpc3QpKTsKKyAgICBtZW1jcHkobHZhLCB2YSwgc2l6ZW9mKHZhX2xpc3QpKTsKICNlbHNlCiAjaWZkZWYgX192YV9jb3B5Ci0JX192YV9jb3B5KGx2YSwgdmEpOworICAgIF9fdmFfY29weShsdmEsIHZhKTsKICNlbHNlCi0JbHZhID0gdmE7CisgICAgbHZhID0gdmE7CiAjZW5kaWYKICNlbmRpZgogCi0JcmV0dXJuIHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZsdmEsIEZMQUdfU0laRV9UKTsKKyAgICByZXR1cm4gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJmx2YSwgRkxBR19TSVpFX1QpOwogfQogCiAKQEAgLTE0NSwyMjEgKzE0NSwyMjEgQEAKIHN0YXRpYyB2b2lkCiBjbGVhbnVwX3B0cihQeU9iamVjdCAqc2VsZikKIHsKLQl2b2lkICpwdHIgPSBQeUNhcHN1bGVfR2V0UG9pbnRlcihzZWxmLCBHRVRBUkdTX0NBUFNVTEVfTkFNRV9DTEVBTlVQX1BUUik7Ci0JaWYgKHB0cikgewotCSAgUHlNZW1fRlJFRShwdHIpOwotCX0KKyAgICB2b2lkICpwdHIgPSBQeUNhcHN1bGVfR2V0UG9pbnRlcihzZWxmLCBHRVRBUkdTX0NBUFNVTEVfTkFNRV9DTEVBTlVQX1BUUik7CisgICAgaWYgKHB0cikgeworICAgICAgUHlNZW1fRlJFRShwdHIpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGNsZWFudXBfYnVmZmVyKFB5T2JqZWN0ICpzZWxmKQogewotCVB5X2J1ZmZlciAqcHRyID0gKFB5X2J1ZmZlciAqKVB5Q2Fwc3VsZV9HZXRQb2ludGVyKHNlbGYsIEdFVEFSR1NfQ0FQU1VMRV9OQU1FX0NMRUFOVVBfQlVGRkVSKTsKLQlpZiAocHRyKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UocHRyKTsKLQl9CisgICAgUHlfYnVmZmVyICpwdHIgPSAoUHlfYnVmZmVyICopUHlDYXBzdWxlX0dldFBvaW50ZXIoc2VsZiwgR0VUQVJHU19DQVBTVUxFX05BTUVfQ0xFQU5VUF9CVUZGRVIpOworICAgIGlmIChwdHIpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZShwdHIpOworICAgIH0KIH0KIAogc3RhdGljIGludAogYWRkY2xlYW51cCh2b2lkICpwdHIsIFB5T2JqZWN0ICoqZnJlZWxpc3QsIFB5Q2Fwc3VsZV9EZXN0cnVjdG9yIGRlc3RyKQogewotCVB5T2JqZWN0ICpjb2JqOwotCWNvbnN0IGNoYXIgKm5hbWU7CisgICAgUHlPYmplY3QgKmNvYmo7CisgICAgY29uc3QgY2hhciAqbmFtZTsKIAotCWlmICghKmZyZWVsaXN0KSB7Ci0JCSpmcmVlbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmICghKmZyZWVsaXN0KSB7Ci0JCQlkZXN0cihwdHIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgIGlmICghKmZyZWVsaXN0KSB7CisgICAgICAgICpmcmVlbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgICAgIGlmICghKmZyZWVsaXN0KSB7CisgICAgICAgICAgICBkZXN0cihwdHIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGRlc3RyID09IGNsZWFudXBfcHRyKSB7Ci0JCW5hbWUgPSBHRVRBUkdTX0NBUFNVTEVfTkFNRV9DTEVBTlVQX1BUUjsKLQl9IGVsc2UgaWYgKGRlc3RyID09IGNsZWFudXBfYnVmZmVyKSB7Ci0JCW5hbWUgPSBHRVRBUkdTX0NBUFNVTEVfTkFNRV9DTEVBTlVQX0JVRkZFUjsKLQl9IGVsc2UgewotCQlyZXR1cm4gLTE7Ci0JfQotCWNvYmogPSBQeUNhcHN1bGVfTmV3KHB0ciwgbmFtZSwgZGVzdHIpOwotCWlmICghY29iaikgewotCQlkZXN0cihwdHIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChQeUxpc3RfQXBwZW5kKCpmcmVlbGlzdCwgY29iaikpIHsKLQkJUHlfREVDUkVGKGNvYmopOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChkZXN0ciA9PSBjbGVhbnVwX3B0cikgeworICAgICAgICBuYW1lID0gR0VUQVJHU19DQVBTVUxFX05BTUVfQ0xFQU5VUF9QVFI7CisgICAgfSBlbHNlIGlmIChkZXN0ciA9PSBjbGVhbnVwX2J1ZmZlcikgeworICAgICAgICBuYW1lID0gR0VUQVJHU19DQVBTVUxFX05BTUVfQ0xFQU5VUF9CVUZGRVI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjb2JqID0gUHlDYXBzdWxlX05ldyhwdHIsIG5hbWUsIGRlc3RyKTsKKyAgICBpZiAoIWNvYmopIHsKKyAgICAgICAgZGVzdHIocHRyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoUHlMaXN0X0FwcGVuZCgqZnJlZWxpc3QsIGNvYmopKSB7CiAgICAgICAgIFB5X0RFQ1JFRihjb2JqKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9ERUNSRUYoY29iaik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGNsZWFucmV0dXJuKGludCByZXR2YWwsIFB5T2JqZWN0ICpmcmVlbGlzdCkKIHsKLQlpZiAoZnJlZWxpc3QgJiYgcmV0dmFsICE9IDApIHsKLQkJLyogV2Ugd2VyZSBzdWNjZXNzZnVsLCByZXNldCB0aGUgZGVzdHJ1Y3RvcnMgc28gdGhhdCB0aGV5Ci0JCSAgIGRvbid0IGdldCBjYWxsZWQuICovCi0JCVB5X3NzaXplX3QgbGVuID0gUHlMaXN0X0dFVF9TSVpFKGZyZWVsaXN0KSwgaTsKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJUHlDYXBzdWxlX1NldERlc3RydWN0b3IoUHlMaXN0X0dFVF9JVEVNKGZyZWVsaXN0LCBpKSwgTlVMTCk7Ci0JfQotCVB5X1hERUNSRUYoZnJlZWxpc3QpOwotCXJldHVybiByZXR2YWw7CisgICAgaWYgKGZyZWVsaXN0ICYmIHJldHZhbCAhPSAwKSB7CisgICAgICAgIC8qIFdlIHdlcmUgc3VjY2Vzc2Z1bCwgcmVzZXQgdGhlIGRlc3RydWN0b3JzIHNvIHRoYXQgdGhleQorICAgICAgICAgICBkb24ndCBnZXQgY2FsbGVkLiAqLworICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5TGlzdF9HRVRfU0laRShmcmVlbGlzdCksIGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgIFB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yKFB5TGlzdF9HRVRfSVRFTShmcmVlbGlzdCwgaSksIE5VTEwpOworICAgIH0KKyAgICBQeV9YREVDUkVGKGZyZWVsaXN0KTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAKIHN0YXRpYyBpbnQKIHZnZXRhcmdzMShQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZmxhZ3MpCiB7Ci0JY2hhciBtc2didWZbMjU2XTsKLQlpbnQgbGV2ZWxzWzMyXTsKLQljb25zdCBjaGFyICpmbmFtZSA9IE5VTEw7Ci0JY29uc3QgY2hhciAqbWVzc2FnZSA9IE5VTEw7Ci0JaW50IG1pbiA9IC0xOwotCWludCBtYXggPSAwOwotCWludCBsZXZlbCA9IDA7Ci0JaW50IGVuZGZtdCA9IDA7Ci0JY29uc3QgY2hhciAqZm9ybWF0c2F2ZSA9IGZvcm1hdDsKLQlQeV9zc2l6ZV90IGksIGxlbjsKLQljaGFyICptc2c7Ci0JUHlPYmplY3QgKmZyZWVsaXN0ID0gTlVMTDsKLQlpbnQgY29tcGF0ID0gZmxhZ3MgJiBGTEFHX0NPTVBBVDsKKyAgICBjaGFyIG1zZ2J1ZlsyNTZdOworICAgIGludCBsZXZlbHNbMzJdOworICAgIGNvbnN0IGNoYXIgKmZuYW1lID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICptZXNzYWdlID0gTlVMTDsKKyAgICBpbnQgbWluID0gLTE7CisgICAgaW50IG1heCA9IDA7CisgICAgaW50IGxldmVsID0gMDsKKyAgICBpbnQgZW5kZm10ID0gMDsKKyAgICBjb25zdCBjaGFyICpmb3JtYXRzYXZlID0gZm9ybWF0OworICAgIFB5X3NzaXplX3QgaSwgbGVuOworICAgIGNoYXIgKm1zZzsKKyAgICBQeU9iamVjdCAqZnJlZWxpc3QgPSBOVUxMOworICAgIGludCBjb21wYXQgPSBmbGFncyAmIEZMQUdfQ09NUEFUOwogCi0JYXNzZXJ0KGNvbXBhdCB8fCAoYXJncyAhPSAoUHlPYmplY3QqKU5VTEwpKTsKLQlmbGFncyA9IGZsYWdzICYgfkZMQUdfQ09NUEFUOworICAgIGFzc2VydChjb21wYXQgfHwgKGFyZ3MgIT0gKFB5T2JqZWN0KilOVUxMKSk7CisgICAgZmxhZ3MgPSBmbGFncyAmIH5GTEFHX0NPTVBBVDsKIAotCXdoaWxlIChlbmRmbXQgPT0gMCkgewotCQlpbnQgYyA9ICpmb3JtYXQrKzsKLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgJygnOgotCQkJaWYgKGxldmVsID09IDApCi0JCQkJbWF4Kys7Ci0JCQlsZXZlbCsrOwotCQkJaWYgKGxldmVsID49IDMwKQotCQkJCVB5X0ZhdGFsRXJyb3IoInRvbyBtYW55IHR1cGxlIG5lc3RpbmcgbGV2ZWxzICIKLQkJCQkJICAgICAgImluIGFyZ3VtZW50IGZvcm1hdCBzdHJpbmciKTsKLQkJCWJyZWFrOwotCQljYXNlICcpJzoKLQkJCWlmIChsZXZlbCA9PSAwKQotCQkJCVB5X0ZhdGFsRXJyb3IoImV4Y2VzcyAnKScgaW4gZ2V0YXJncyBmb3JtYXQiKTsKLQkJCWVsc2UKLQkJCQlsZXZlbC0tOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1wwJzoKLQkJCWVuZGZtdCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnOic6Ci0JCQlmbmFtZSA9IGZvcm1hdDsKLQkJCWVuZGZtdCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnOyc6Ci0JCQltZXNzYWdlID0gZm9ybWF0OwotCQkJZW5kZm10ID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKGxldmVsID09IDApIHsKLQkJCQlpZiAoYyA9PSAnTycpCi0JCQkJCW1heCsrOwotCQkJCWVsc2UgaWYgKGlzYWxwaGEoUHlfQ0hBUk1BU0soYykpKSB7Ci0JCQkJCWlmIChjICE9ICdlJykgLyogc2tpcCBlbmNvZGVkICovCi0JCQkJCQltYXgrKzsKLQkJCQl9IGVsc2UgaWYgKGMgPT0gJ3wnKQotCQkJCQltaW4gPSBtYXg7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KLQkKLQlpZiAobGV2ZWwgIT0gMCkKLQkJUHlfRmF0YWxFcnJvcigvKiAnKCcgKi8gIm1pc3NpbmcgJyknIGluIGdldGFyZ3MgZm9ybWF0Iik7Ci0JCi0JaWYgKG1pbiA8IDApCi0JCW1pbiA9IG1heDsKLQkKLQlmb3JtYXQgPSBmb3JtYXRzYXZlOwotCQotCWlmIChjb21wYXQpIHsKLQkJaWYgKG1heCA9PSAwKSB7Ci0JCQlpZiAoYXJncyA9PSBOVUxMKQotCQkJCXJldHVybiAxOwotCQkJUHlPU19zbnByaW50Zihtc2didWYsIHNpemVvZihtc2didWYpLAotCQkJCSAgICAgICIlLjIwMHMlcyB0YWtlcyBubyBhcmd1bWVudHMiLAotCQkJCSAgICAgIGZuYW1lPT1OVUxMID8gImZ1bmN0aW9uIiA6IGZuYW1lLAotCQkJCSAgICAgIGZuYW1lPT1OVUxMID8gIiIgOiAiKCkiKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG1zZ2J1Zik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQllbHNlIGlmIChtaW4gPT0gMSAmJiBtYXggPT0gMSkgewotCQkJaWYgKGFyZ3MgPT0gTlVMTCkgewotCQkJCVB5T1Nfc25wcmludGYobXNnYnVmLCBzaXplb2YobXNnYnVmKSwKLQkJCQkgICAgICAiJS4yMDBzJXMgdGFrZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50IiwKLQkJCQkJICAgICAgZm5hbWU9PU5VTEwgPyAiZnVuY3Rpb24iIDogZm5hbWUsCi0JCQkJCSAgICAgIGZuYW1lPT1OVUxMID8gIiIgOiAiKCkiKTsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtc2didWYpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJbXNnID0gY29udmVydGl0ZW0oYXJncywgJmZvcm1hdCwgcF92YSwgZmxhZ3MsIGxldmVscywgCi0JCQkJCSAgbXNnYnVmLCBzaXplb2YobXNnYnVmKSwgJmZyZWVsaXN0KTsKLQkJCWlmIChtc2cgPT0gTlVMTCkKLQkJCQlyZXR1cm4gY2xlYW5yZXR1cm4oMSwgZnJlZWxpc3QpOwotCQkJc2V0ZXJyb3IobGV2ZWxzWzBdLCBtc2csIGxldmVscysxLCBmbmFtZSwgbWVzc2FnZSk7Ci0JCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQl9Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJICAgICJvbGQgc3R5bGUgZ2V0YXJncyBmb3JtYXQgdXNlcyBuZXcgZmVhdHVyZXMiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCQotCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCSAgICAibmV3IHN0eWxlIGdldGFyZ3MgZm9ybWF0IGJ1dCBhcmd1bWVudCBpcyBub3QgYSB0dXBsZSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JbGVuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQkKLQlpZiAobGVuIDwgbWluIHx8IG1heCA8IGxlbikgewotCQlpZiAobWVzc2FnZSA9PSBOVUxMKSB7Ci0JCQlQeU9TX3NucHJpbnRmKG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksCi0JCQkJICAgICAgIiUuMTUwcyVzIHRha2VzICVzICVkIGFyZ3VtZW50JXMgIgotCQkJCSAgICAgICIoJWxkIGdpdmVuKSIsCi0JCQkJICAgICAgZm5hbWU9PU5VTEwgPyAiZnVuY3Rpb24iIDogZm5hbWUsCi0JCQkJICAgICAgZm5hbWU9PU5VTEwgPyAiIiA6ICIoKSIsCi0JCQkJICAgICAgbWluPT1tYXggPyAiZXhhY3RseSIKLQkJCQkgICAgICA6IGxlbiA8IG1pbiA/ICJhdCBsZWFzdCIgOiAiYXQgbW9zdCIsCi0JCQkJICAgICAgbGVuIDwgbWluID8gbWluIDogbWF4LAotCQkJCSAgICAgIChsZW4gPCBtaW4gPyBtaW4gOiBtYXgpID09IDEgPyAiIiA6ICJzIiwKLQkJCQkgICAgICBQeV9TQUZFX0RPV05DQVNUKGxlbiwgUHlfc3NpemVfdCwgbG9uZykpOwotCQkJbWVzc2FnZSA9IG1zZ2J1ZjsKLQkJfQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtZXNzYWdlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlpZiAoKmZvcm1hdCA9PSAnfCcpCi0JCQlmb3JtYXQrKzsKLQkJbXNnID0gY29udmVydGl0ZW0oUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKSwgJmZvcm1hdCwgcF92YSwKLQkJCQkgIGZsYWdzLCBsZXZlbHMsIG1zZ2J1ZiwgCi0JCQkJICBzaXplb2YobXNnYnVmKSwgJmZyZWVsaXN0KTsKLQkJaWYgKG1zZykgewotCQkJc2V0ZXJyb3IoaSsxLCBtc2csIGxldmVscywgZm5hbWUsIG1zZyk7Ci0JCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQl9Ci0JfQorICAgIHdoaWxlIChlbmRmbXQgPT0gMCkgeworICAgICAgICBpbnQgYyA9ICpmb3JtYXQrKzsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgJygnOgorICAgICAgICAgICAgaWYgKGxldmVsID09IDApCisgICAgICAgICAgICAgICAgbWF4Kys7CisgICAgICAgICAgICBsZXZlbCsrOworICAgICAgICAgICAgaWYgKGxldmVsID49IDMwKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoInRvbyBtYW55IHR1cGxlIG5lc3RpbmcgbGV2ZWxzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBhcmd1bWVudCBmb3JtYXQgc3RyaW5nIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMCkKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJleGNlc3MgJyknIGluIGdldGFyZ3MgZm9ybWF0Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICBlbmRmbXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzonOgorICAgICAgICAgICAgZm5hbWUgPSBmb3JtYXQ7CisgICAgICAgICAgICBlbmRmbXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzsnOgorICAgICAgICAgICAgbWVzc2FnZSA9IGZvcm1hdDsKKyAgICAgICAgICAgIGVuZGZtdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ08nKQorICAgICAgICAgICAgICAgICAgICBtYXgrKzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpc2FscGhhKFB5X0NIQVJNQVNLKGMpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSAnZScpIC8qIHNraXAgZW5jb2RlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICd8JykKKyAgICAgICAgICAgICAgICAgICAgbWluID0gbWF4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoKmZvcm1hdCAhPSAnXDAnICYmICFpc2FscGhhKFB5X0NIQVJNQVNLKCpmb3JtYXQpKSAmJgotCSAgICAqZm9ybWF0ICE9ICcoJyAmJgotCSAgICAqZm9ybWF0ICE9ICd8JyAmJiAqZm9ybWF0ICE9ICc6JyAmJiAqZm9ybWF0ICE9ICc7JykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgICJiYWQgZm9ybWF0IHN0cmluZzogJS4yMDBzIiwgZm9ybWF0c2F2ZSk7Ci0JCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JfQotCQotCXJldHVybiBjbGVhbnJldHVybigxLCBmcmVlbGlzdCk7CisgICAgaWYgKGxldmVsICE9IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoLyogJygnICovICJtaXNzaW5nICcpJyBpbiBnZXRhcmdzIGZvcm1hdCIpOworCisgICAgaWYgKG1pbiA8IDApCisgICAgICAgIG1pbiA9IG1heDsKKworICAgIGZvcm1hdCA9IGZvcm1hdHNhdmU7CisKKyAgICBpZiAoY29tcGF0KSB7CisgICAgICAgIGlmIChtYXggPT0gMCkgeworICAgICAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYobXNnYnVmLCBzaXplb2YobXNnYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyVzIHRha2VzIG5vIGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lPT1OVUxMID8gImZ1bmN0aW9uIiA6IGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZT09TlVMTCA/ICIiIDogIigpIik7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtc2didWYpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobWluID09IDEgJiYgbWF4ID09IDEpIHsKKyAgICAgICAgICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksCisgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyVzIHRha2VzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lPT1OVUxMID8gImZ1bmN0aW9uIiA6IGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZT09TlVMTCA/ICIiIDogIigpIik7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbXNnYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZyA9IGNvbnZlcnRpdGVtKGFyZ3MsICZmb3JtYXQsIHBfdmEsIGZsYWdzLCBsZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2didWYsIHNpemVvZihtc2didWYpLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigxLCBmcmVlbGlzdCk7CisgICAgICAgICAgICBzZXRlcnJvcihsZXZlbHNbMF0sIG1zZywgbGV2ZWxzKzEsIGZuYW1lLCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgIm9sZCBzdHlsZSBnZXRhcmdzIGZvcm1hdCB1c2VzIG5ldyBmZWF0dXJlcyIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgIm5ldyBzdHlsZSBnZXRhcmdzIGZvcm1hdCBidXQgYXJndW1lbnQgaXMgbm90IGEgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbGVuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKworICAgIGlmIChsZW4gPCBtaW4gfHwgbWF4IDwgbGVuKSB7CisgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYobXNnYnVmLCBzaXplb2YobXNnYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMTUwcyVzIHRha2VzICVzICVkIGFyZ3VtZW50JXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiKCVsZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZT09TlVMTCA/ICJmdW5jdGlvbiIgOiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWU9PU5VTEwgPyAiIiA6ICIoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj09bWF4ID8gImV4YWN0bHkiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGVuIDwgbWluID8gImF0IGxlYXN0IiA6ICJhdCBtb3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIDwgbWluID8gbWluIDogbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuIDwgbWluID8gbWluIDogbWF4KSA9PSAxID8gIiIgOiAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1NBRkVfRE9XTkNBU1QobGVuLCBQeV9zc2l6ZV90LCBsb25nKSk7CisgICAgICAgICAgICBtZXNzYWdlID0gbXNnYnVmOworICAgICAgICB9CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG1lc3NhZ2UpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKCpmb3JtYXQgPT0gJ3wnKQorICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIG1zZyA9IGNvbnZlcnRpdGVtKFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSksICZmb3JtYXQsIHBfdmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBsZXZlbHMsIG1zZ2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1zZ2J1ZiksICZmcmVlbGlzdCk7CisgICAgICAgIGlmIChtc2cpIHsKKyAgICAgICAgICAgIHNldGVycm9yKGkrMSwgbXNnLCBsZXZlbHMsIGZuYW1lLCBtc2cpOworICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgqZm9ybWF0ICE9ICdcMCcgJiYgIWlzYWxwaGEoUHlfQ0hBUk1BU0soKmZvcm1hdCkpICYmCisgICAgICAgICpmb3JtYXQgIT0gJygnICYmCisgICAgICAgICpmb3JtYXQgIT0gJ3wnICYmICpmb3JtYXQgIT0gJzonICYmICpmb3JtYXQgIT0gJzsnKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJiYWQgZm9ybWF0IHN0cmluZzogJS4yMDBzIiwgZm9ybWF0c2F2ZSk7CisgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgfQorCisgICAgcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKIH0KIAogCkBAIC0zNjgsMzcgKzM2OCwzNyBAQAogc2V0ZXJyb3IoaW50IGlhcmcsIGNvbnN0IGNoYXIgKm1zZywgaW50ICpsZXZlbHMsIGNvbnN0IGNoYXIgKmZuYW1lLAogICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSkKIHsKLQljaGFyIGJ1Zls1MTJdOwotCWludCBpOwotCWNoYXIgKnAgPSBidWY7CisgICAgY2hhciBidWZbNTEyXTsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpwID0gYnVmOwogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybjsKLQllbHNlIGlmIChtZXNzYWdlID09IE5VTEwpIHsKLQkJaWYgKGZuYW1lICE9IE5VTEwpIHsKLQkJCVB5T1Nfc25wcmludGYocCwgc2l6ZW9mKGJ1ZiksICIlLjIwMHMoKSAiLCBmbmFtZSk7Ci0JCQlwICs9IHN0cmxlbihwKTsKLQkJfQotCQlpZiAoaWFyZyAhPSAwKSB7Ci0JCQlQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLAotCQkJCSAgICAgICJhcmd1bWVudCAlZCIsIGlhcmcpOwotCQkJaSA9IDA7Ci0JCQlwICs9IHN0cmxlbihwKTsKLQkJCXdoaWxlIChsZXZlbHNbaV0gPiAwICYmIGkgPCAzMiAmJiAoaW50KShwLWJ1ZikgPCAyMjApIHsKLQkJCQlQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLAotCQkJCQkgICAgICAiLCBpdGVtICVkIiwgbGV2ZWxzW2ldLTEpOwotCQkJCXAgKz0gc3RybGVuKHApOwotCQkJCWkrKzsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVB5T1Nfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAocCAtIGJ1ZiksICJhcmd1bWVudCIpOwotCQkJcCArPSBzdHJsZW4ocCk7Ci0JCX0KLQkJUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChwIC0gYnVmKSwgIiAlLjI1NnMiLCBtc2cpOwotCQltZXNzYWdlID0gYnVmOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtZXNzYWdlKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIGVsc2UgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICBpZiAoZm5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSwgIiUuMjAwcygpICIsIGZuYW1lKTsKKyAgICAgICAgICAgIHAgKz0gc3RybGVuKHApOworICAgICAgICB9CisgICAgICAgIGlmIChpYXJnICE9IDApIHsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAocCAtIGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCAlZCIsIGlhcmcpOworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBwICs9IHN0cmxlbihwKTsKKyAgICAgICAgICAgIHdoaWxlIChsZXZlbHNbaV0gPiAwICYmIGkgPCAzMiAmJiAoaW50KShwLWJ1ZikgPCAyMjApIHsKKyAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgaXRlbSAlZCIsIGxldmVsc1tpXS0xKTsKKyAgICAgICAgICAgICAgICBwICs9IHN0cmxlbihwKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLCAiYXJndW1lbnQiKTsKKyAgICAgICAgICAgIHAgKz0gc3RybGVuKHApOworICAgICAgICB9CisgICAgICAgIFB5T1Nfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAocCAtIGJ1ZiksICIgJS4yNTZzIiwgbXNnKTsKKyAgICAgICAgbWVzc2FnZSA9IGJ1ZjsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbWVzc2FnZSk7CiB9CiAKIApAQCAtNDE0LDgzICs0MTQsODMgQEAKICAgICAgICpwX3ZhIGlzIHVuZGVmaW5lZCwKICAgICAgICpsZXZlbHMgaXMgYSAwLXRlcm1pbmF0ZWQgbGlzdCBvZiBpdGVtIG51bWJlcnMsCiAgICAgICAqbXNnYnVmIGNvbnRhaW5zIGFuIGVycm9yIG1lc3NhZ2UsIHdob3NlIGZvcm1hdCBpczoKLSAgICAgICAgICJtdXN0IGJlIDx0eXBlbmFtZTE+LCBub3QgPHR5cGVuYW1lMj4iLCB3aGVyZToKLSAgICAgICAgICAgIDx0eXBlbmFtZTE+IGlzIHRoZSBuYW1lIG9mIHRoZSBleHBlY3RlZCB0eXBlLCBhbmQKLSAgICAgICAgICAgIDx0eXBlbmFtZTI+IGlzIHRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgdHlwZSwKKyAgICAgIm11c3QgYmUgPHR5cGVuYW1lMT4sIG5vdCA8dHlwZW5hbWUyPiIsIHdoZXJlOgorICAgICAgICA8dHlwZW5hbWUxPiBpcyB0aGUgbmFtZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZSwgYW5kCisgICAgICAgIDx0eXBlbmFtZTI+IGlzIHRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgdHlwZSwKICAgICAgIGFuZCBtc2didWYgaXMgcmV0dXJuZWQuCiAqLwogCiBzdGF0aWMgY2hhciAqCiBjb252ZXJ0dHVwbGUoUHlPYmplY3QgKmFyZywgY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgaW50ICpsZXZlbHMsIGNoYXIgKm1zZ2J1Ziwgc2l6ZV90IGJ1ZnNpemUsIGludCB0b3BsZXZlbCwgCisgICAgICAgICAgICAgaW50ICpsZXZlbHMsIGNoYXIgKm1zZ2J1Ziwgc2l6ZV90IGJ1ZnNpemUsIGludCB0b3BsZXZlbCwKICAgICAgICAgICAgICBQeU9iamVjdCAqKmZyZWVsaXN0KQogewotCWludCBsZXZlbCA9IDA7Ci0JaW50IG4gPSAwOwotCWNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKLQlpbnQgaTsKLQkKLQlmb3IgKDs7KSB7Ci0JCWludCBjID0gKmZvcm1hdCsrOwotCQlpZiAoYyA9PSAnKCcpIHsKLQkJCWlmIChsZXZlbCA9PSAwKQotCQkJCW4rKzsKLQkJCWxldmVsKys7Ci0JCX0KLQkJZWxzZSBpZiAoYyA9PSAnKScpIHsKLQkJCWlmIChsZXZlbCA9PSAwKQotCQkJCWJyZWFrOwotCQkJbGV2ZWwtLTsKLQkJfQotCQllbHNlIGlmIChjID09ICc6JyB8fCBjID09ICc7JyB8fCBjID09ICdcMCcpCi0JCQlicmVhazsKLQkJZWxzZSBpZiAobGV2ZWwgPT0gMCAmJiBpc2FscGhhKFB5X0NIQVJNQVNLKGMpKSkKLQkJCW4rKzsKLQl9Ci0JCi0JaWYgKCFQeVNlcXVlbmNlX0NoZWNrKGFyZykgfHwgUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQlsZXZlbHNbMF0gPSAwOwotCQlQeU9TX3NucHJpbnRmKG1zZ2J1ZiwgYnVmc2l6ZSwKLQkJCSAgICAgIHRvcGxldmVsID8gImV4cGVjdGVkICVkIGFyZ3VtZW50cywgbm90ICUuNTBzIiA6Ci0JCQkgICAgICAgICAgICAgICJtdXN0IGJlICVkLWl0ZW0gc2VxdWVuY2UsIG5vdCAlLjUwcyIsCi0JCQkgICAgICBuLCAKLQkJCSAgICAgIGFyZyA9PSBQeV9Ob25lID8gIk5vbmUiIDogYXJnLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIG1zZ2J1ZjsKLQl9Ci0JCi0JaWYgKChpID0gUHlTZXF1ZW5jZV9TaXplKGFyZykpICE9IG4pIHsKLQkJbGV2ZWxzWzBdID0gMDsKLQkJUHlPU19zbnByaW50Zihtc2didWYsIGJ1ZnNpemUsCi0JCQkgICAgICB0b3BsZXZlbCA/ICJleHBlY3RlZCAlZCBhcmd1bWVudHMsIG5vdCAlZCIgOgotCQkJICAgICAgICAgICAgICJtdXN0IGJlIHNlcXVlbmNlIG9mIGxlbmd0aCAlZCwgbm90ICVkIiwKLQkJCSAgICAgIG4sIGkpOwotCQlyZXR1cm4gbXNnYnVmOwotCX0KKyAgICBpbnQgbGV2ZWwgPSAwOworICAgIGludCBuID0gMDsKKyAgICBjb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7CisgICAgaW50IGk7CiAKLQlmb3JtYXQgPSAqcF9mb3JtYXQ7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQljaGFyICptc2c7Ci0JCVB5T2JqZWN0ICppdGVtOwotCQlpdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFyZywgaSk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlsZXZlbHNbMF0gPSBpKzE7Ci0JCQlsZXZlbHNbMV0gPSAwOwotCQkJc3RybmNweShtc2didWYsICJpcyBub3QgcmV0cmlldmFibGUiLCBidWZzaXplKTsKLQkJCXJldHVybiBtc2didWY7Ci0JCX0KLQkJbXNnID0gY29udmVydGl0ZW0oaXRlbSwgJmZvcm1hdCwgcF92YSwgZmxhZ3MsIGxldmVscysxLCAKLQkJCQkgIG1zZ2J1ZiwgYnVmc2l6ZSwgZnJlZWxpc3QpOwotCQkvKiBQeVNlcXVlbmNlX0dldEl0ZW0gY2FsbHMgdHAtPnNxX2l0ZW0sIHdoaWNoIElOQ1JFRnMgKi8KLQkJUHlfWERFQ1JFRihpdGVtKTsKLQkJaWYgKG1zZyAhPSBOVUxMKSB7Ci0JCQlsZXZlbHNbMF0gPSBpKzE7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGMgPSAqZm9ybWF0Kys7CisgICAgICAgIGlmIChjID09ICcoJykgeworICAgICAgICAgICAgaWYgKGxldmVsID09IDApCisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09ICcpJykgeworICAgICAgICAgICAgaWYgKGxldmVsID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBsZXZlbC0tOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJzonIHx8IGMgPT0gJzsnIHx8IGMgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlIGlmIChsZXZlbCA9PSAwICYmIGlzYWxwaGEoUHlfQ0hBUk1BU0soYykpKQorICAgICAgICAgICAgbisrOworICAgIH0KIAotCSpwX2Zvcm1hdCA9IGZvcm1hdDsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5U2VxdWVuY2VfQ2hlY2soYXJnKSB8fCBQeVN0cmluZ19DaGVjayhhcmcpKSB7CisgICAgICAgIGxldmVsc1swXSA9IDA7CisgICAgICAgIFB5T1Nfc25wcmludGYobXNnYnVmLCBidWZzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHRvcGxldmVsID8gImV4cGVjdGVkICVkIGFyZ3VtZW50cywgbm90ICUuNTBzIiA6CisgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgJWQtaXRlbSBzZXF1ZW5jZSwgbm90ICUuNTBzIiwKKyAgICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgICBhcmcgPT0gUHlfTm9uZSA/ICJOb25lIiA6IGFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBtc2didWY7CisgICAgfQorCisgICAgaWYgKChpID0gUHlTZXF1ZW5jZV9TaXplKGFyZykpICE9IG4pIHsKKyAgICAgICAgbGV2ZWxzWzBdID0gMDsKKyAgICAgICAgUHlPU19zbnByaW50Zihtc2didWYsIGJ1ZnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgdG9wbGV2ZWwgPyAiZXhwZWN0ZWQgJWQgYXJndW1lbnRzLCBub3QgJWQiIDoKKyAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHNlcXVlbmNlIG9mIGxlbmd0aCAlZCwgbm90ICVkIiwKKyAgICAgICAgICAgICAgICAgIG4sIGkpOworICAgICAgICByZXR1cm4gbXNnYnVmOworICAgIH0KKworICAgIGZvcm1hdCA9ICpwX2Zvcm1hdDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGNoYXIgKm1zZzsKKyAgICAgICAgUHlPYmplY3QgKml0ZW07CisgICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXJnLCBpKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGxldmVsc1swXSA9IGkrMTsKKyAgICAgICAgICAgIGxldmVsc1sxXSA9IDA7CisgICAgICAgICAgICBzdHJuY3B5KG1zZ2J1ZiwgImlzIG5vdCByZXRyaWV2YWJsZSIsIGJ1ZnNpemUpOworICAgICAgICAgICAgcmV0dXJuIG1zZ2J1ZjsKKyAgICAgICAgfQorICAgICAgICBtc2cgPSBjb252ZXJ0aXRlbShpdGVtLCAmZm9ybWF0LCBwX3ZhLCBmbGFncywgbGV2ZWxzKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2J1ZiwgYnVmc2l6ZSwgZnJlZWxpc3QpOworICAgICAgICAvKiBQeVNlcXVlbmNlX0dldEl0ZW0gY2FsbHMgdHAtPnNxX2l0ZW0sIHdoaWNoIElOQ1JFRnMgKi8KKyAgICAgICAgUHlfWERFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKG1zZyAhPSBOVUxMKSB7CisgICAgICAgICAgICBsZXZlbHNbMF0gPSBpKzE7CisgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICB9CisgICAgfQorCisgICAgKnBfZm9ybWF0ID0gZm9ybWF0OworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTUwMCw0MyArNTAwLDQzIEBACiBjb252ZXJ0aXRlbShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgIGludCAqbGV2ZWxzLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBQeU9iamVjdCAqKmZyZWVsaXN0KQogewotCWNoYXIgKm1zZzsKLQljb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7Ci0JCi0JaWYgKCpmb3JtYXQgPT0gJygnIC8qICcpJyAqLykgewotCQlmb3JtYXQrKzsKLQkJbXNnID0gY29udmVydHR1cGxlKGFyZywgJmZvcm1hdCwgcF92YSwgZmxhZ3MsIGxldmVscywgbXNnYnVmLCAKLQkJCQkgICBidWZzaXplLCAwLCBmcmVlbGlzdCk7Ci0JCWlmIChtc2cgPT0gTlVMTCkKLQkJCWZvcm1hdCsrOwotCX0KLQllbHNlIHsKLQkJbXNnID0gY29udmVydHNpbXBsZShhcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLCAKLQkJCQkgICAgbXNnYnVmLCBidWZzaXplLCBmcmVlbGlzdCk7Ci0JCWlmIChtc2cgIT0gTlVMTCkKLQkJCWxldmVsc1swXSA9IDA7Ci0JfQotCWlmIChtc2cgPT0gTlVMTCkKLQkJKnBfZm9ybWF0ID0gZm9ybWF0OwotCXJldHVybiBtc2c7CisgICAgY2hhciAqbXNnOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKKworICAgIGlmICgqZm9ybWF0ID09ICcoJyAvKiAnKScgKi8pIHsKKyAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIG1zZyA9IGNvbnZlcnR0dXBsZShhcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLCBsZXZlbHMsIG1zZ2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUsIDAsIGZyZWVsaXN0KTsKKyAgICAgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtc2cgPSBjb252ZXJ0c2ltcGxlKGFyZywgJmZvcm1hdCwgcF92YSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnYnVmLCBidWZzaXplLCBmcmVlbGlzdCk7CisgICAgICAgIGlmIChtc2cgIT0gTlVMTCkKKyAgICAgICAgICAgIGxldmVsc1swXSA9IDA7CisgICAgfQorICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICAgICAgKnBfZm9ybWF0ID0gZm9ybWF0OworICAgIHJldHVybiBtc2c7CiB9CiAKIAogCiAjZGVmaW5lIFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpIFwKLSAgICAgICAgX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKGFyZywgTlVMTCkKKyAgICBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcoYXJnLCBOVUxMKQogCiAvKiBGb3JtYXQgYW4gZXJyb3IgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgY29udmVydHNpbXBsZSgpLiAqLwogCiBzdGF0aWMgY2hhciAqCiBjb252ZXJ0ZXJyKGNvbnN0IGNoYXIgKmV4cGVjdGVkLCBQeU9iamVjdCAqYXJnLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplKQogewotCWFzc2VydChleHBlY3RlZCAhPSBOVUxMKTsKLQlhc3NlcnQoYXJnICE9IE5VTEwpOyAKLQlQeU9TX3NucHJpbnRmKG1zZ2J1ZiwgYnVmc2l6ZSwKLQkJICAgICAgIm11c3QgYmUgJS41MHMsIG5vdCAlLjUwcyIsIGV4cGVjdGVkLAotCQkgICAgICBhcmcgPT0gUHlfTm9uZSA/ICJOb25lIiA6IGFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIG1zZ2J1ZjsKKyAgICBhc3NlcnQoZXhwZWN0ZWQgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGFyZyAhPSBOVUxMKTsKKyAgICBQeU9TX3NucHJpbnRmKG1zZ2J1ZiwgYnVmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICJtdXN0IGJlICUuNTBzLCBub3QgJS41MHMiLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgIGFyZyA9PSBQeV9Ob25lID8gIk5vbmUiIDogYXJnLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gbXNnYnVmOwogfQogCiAjZGVmaW5lIENPTlZfVU5JQ09ERSAiKHVuaWNvZGUgY29udmVyc2lvbiBlcnJvcikiCkBAIC01NDYsMTIgKzU0NiwxMiBAQAogc3RhdGljIGludAogZmxvYXRfYXJndW1lbnRfd2FybmluZyhQeU9iamVjdCAqYXJnKQogewotCWlmIChQeUZsb2F0X0NoZWNrKGFyZykgJiYKLQkgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCSAgICAgICAiaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IGZsb2F0IiApKQotCQlyZXR1cm4gMTsKLQllbHNlCi0JCXJldHVybiAwOworICAgIGlmIChQeUZsb2F0X0NoZWNrKGFyZykgJiYKKyAgICAgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIgKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKIH0KIAogLyogZXhwbGljaXRseSBjaGVjayBmb3IgZmxvYXQgYXJndW1lbnRzIHdoZW4gaW50ZWdlcnMgYXJlIGV4cGVjdGVkLiAgUmFpc2VzCkBAIC01NTksMTMgKzU1OSwxMyBAQAogc3RhdGljIGludAogZmxvYXRfYXJndW1lbnRfZXJyb3IoUHlPYmplY3QgKmFyZykKIHsKLQlpZiAoUHlGbG9hdF9DaGVjayhhcmcpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gMDsKKyAgICBpZiAoUHlGbG9hdF9DaGVjayhhcmcpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IGZsb2F0Iik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOwogfQogCiAvKiBDb252ZXJ0IGEgbm9uLXR1cGxlIGFyZ3VtZW50LiAgUmV0dXJuIE5VTEwgaWYgY29udmVyc2lvbiB3ZW50IE9LLApAQCAtNTgxLDgyNiArNTgxLDgyNiBAQAogY29udmVydHNpbXBsZShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgICAgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSwgUHlPYmplY3QgKipmcmVlbGlzdCkKIHsKLQkvKiBGb3IgIyBjb2RlcyAqLwotI2RlZmluZSBGRVRDSF9TSVpFCWludCAqcT1OVUxMO1B5X3NzaXplX3QgKnEyPU5VTEw7XAotCWlmIChmbGFncyAmIEZMQUdfU0laRV9UKSBxMj12YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QqKTsgXAotCWVsc2UgcT12YV9hcmcoKnBfdmEsIGludCopOworICAgIC8qIEZvciAjIGNvZGVzICovCisjZGVmaW5lIEZFVENIX1NJWkUgICAgICBpbnQgKnE9TlVMTDtQeV9zc2l6ZV90ICpxMj1OVUxMO1wKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfVCkgcTI9dmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90Kik7IFwKKyAgICBlbHNlIHE9dmFfYXJnKCpwX3ZhLCBpbnQqKTsKICNkZWZpbmUgU1RPUkVfU0laRShzKSAgIGlmIChmbGFncyAmIEZMQUdfU0laRV9UKSAqcTI9czsgZWxzZSAqcT1zOwogI2RlZmluZSBCVUZGRVJfTEVOICAgICAgKChmbGFncyAmIEZMQUdfU0laRV9UKSA/ICpxMjoqcSkKIAotCWNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKLQljaGFyIGMgPSAqZm9ybWF0Kys7CisgICAgY29uc3QgY2hhciAqZm9ybWF0ID0gKnBfZm9ybWF0OworICAgIGNoYXIgYyA9ICpmb3JtYXQrKzsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JUHlPYmplY3QgKnVhcmc7CisgICAgUHlPYmplY3QgKnVhcmc7CiAjZW5kaWYKLQkKLQlzd2l0Y2ggKGMpIHsKLQkKLQljYXNlICdiJzogeyAvKiB1bnNpZ25lZCBieXRlIC0tIHZlcnkgc2hvcnQgaW50ICovCi0JCWNoYXIgKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7Ci0JCWxvbmcgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxiPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzTG9uZyhhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Yj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UgaWYgKGl2YWwgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJ1bnNpZ25lZCBieXRlIGludGVnZXIgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGI+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWVsc2UgaWYgKGl2YWwgPiBVQ0hBUl9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInVuc2lnbmVkIGJ5dGUgaW50ZWdlciBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOwotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Yj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkJZWxzZQotCQkJKnAgPSAodW5zaWduZWQgY2hhcikgaXZhbDsKLQkJYnJlYWs7Ci0JfQotCQotCWNhc2UgJ0InOiB7LyogYnl0ZSBzaXplZCBiaXRmaWVsZCAtIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZAotCQkgICAgICB2YWx1ZXMgYWxsb3dlZCAqLyAgCi0JCWNoYXIgKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7Ci0JCWxvbmcgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxCPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Qj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UKLQkJCSpwID0gKHVuc2lnbmVkIGNoYXIpIGl2YWw7Ci0JCWJyZWFrOwotCX0KLQkKLQljYXNlICdoJzogey8qIHNpZ25lZCBzaG9ydCBpbnQgKi8KLQkJc2hvcnQgKnAgPSB2YV9hcmcoKnBfdmEsIHNob3J0ICopOwotCQlsb25nIGl2YWw7Ci0JCWlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWl2YWwgPSBQeUludF9Bc0xvbmcoYXJnKTsKLQkJaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQllbHNlIGlmIChpdmFsIDwgU0hSVF9NSU4pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInNpZ25lZCBzaG9ydCBpbnRlZ2VyIGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7Ci0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxoPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJfQotCQllbHNlIGlmIChpdmFsID4gU0hSVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInNpZ25lZCBzaG9ydCBpbnRlZ2VyIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7Ci0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxoPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJfQotCQllbHNlCi0JCQkqcCA9IChzaG9ydCkgaXZhbDsKLQkJYnJlYWs7Ci0JfQotCQotCWNhc2UgJ0gnOiB7IC8qIHNob3J0IGludCBzaXplZCBiaXRmaWVsZCwgYm90aCBzaWduZWQgYW5kCi0JCSAgICAgICB1bnNpZ25lZCBhbGxvd2VkICovIAotCQl1bnNpZ25lZCBzaG9ydCAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgc2hvcnQgKik7Ci0JCWxvbmcgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxIPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8SD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UKLQkJCSpwID0gKHVuc2lnbmVkIHNob3J0KSBpdmFsOwotCQlicmVhazsKLQl9CiAKLQljYXNlICdpJzogey8qIHNpZ25lZCBpbnQgKi8KLQkJaW50ICpwID0gdmFfYXJnKCpwX3ZhLCBpbnQgKik7Ci0JCWxvbmcgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxpPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzTG9uZyhhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UgaWYgKGl2YWwgPiBJTlRfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkic2lnbmVkIGludGVnZXIgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWVsc2UgaWYgKGl2YWwgPCBJTlRfTUlOKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkic2lnbmVkIGludGVnZXIgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWVsc2UKLQkJCSpwID0gaXZhbDsKLQkJYnJlYWs7Ci0JfQorICAgIHN3aXRjaCAoYykgewogCi0JY2FzZSAnSSc6IHsgLyogaW50IHNpemVkIGJpdGZpZWxkLCBib3RoIHNpZ25lZCBhbmQKLQkJICAgICAgIHVuc2lnbmVkIGFsbG93ZWQgKi8gCi0JCXVuc2lnbmVkIGludCAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgaW50ICopOwotCQl1bnNpZ25lZCBpbnQgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxJPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9ICh1bnNpZ25lZCBpbnQpUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7Ci0JCWlmIChpdmFsID09ICh1bnNpZ25lZCBpbnQpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQllbHNlCi0JCQkqcCA9IGl2YWw7Ci0JCWJyZWFrOwotCX0KLQkKLQljYXNlICduJzogLyogUHlfc3NpemVfdCAqLworICAgIGNhc2UgJ2InOiB7IC8qIHVuc2lnbmVkIGJ5dGUgLS0gdmVyeSBzaG9ydCBpbnQgKi8KKyAgICAgICAgY2hhciAqcCA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKKyAgICAgICAgbG9uZyBpdmFsOworICAgICAgICBpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGI+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpdmFsID0gUHlJbnRfQXNMb25nKGFyZyk7CisgICAgICAgIGlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxiPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgZWxzZSBpZiAoaXZhbCA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgInVuc2lnbmVkIGJ5dGUgaW50ZWdlciBpcyBsZXNzIHRoYW4gbWluaW11bSIpOworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Yj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXZhbCA+IFVDSEFSX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAidW5zaWduZWQgYnl0ZSBpbnRlZ2VyIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7CisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxiPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9ICh1bnNpZ25lZCBjaGFyKSBpdmFsOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlICdCJzogey8qIGJ5dGUgc2l6ZWQgYml0ZmllbGQgLSBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQKKyAgICAgICAgICAgICAgICAgIHZhbHVlcyBhbGxvd2VkICovCisgICAgICAgIGNoYXIgKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7CisgICAgICAgIGxvbmcgaXZhbDsKKyAgICAgICAgaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxCPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaXZhbCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOworICAgICAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Qj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwID0gKHVuc2lnbmVkIGNoYXIpIGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ2gnOiB7Lyogc2lnbmVkIHNob3J0IGludCAqLworICAgICAgICBzaG9ydCAqcCA9IHZhX2FyZygqcF92YSwgc2hvcnQgKik7CisgICAgICAgIGxvbmcgaXZhbDsKKyAgICAgICAgaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxoPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaXZhbCA9IFB5SW50X0FzTG9uZyhhcmcpOworICAgICAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKGl2YWwgPCBTSFJUX01JTikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAic2lnbmVkIHNob3J0IGludGVnZXIgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl2YWwgPiBTSFJUX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAic2lnbmVkIHNob3J0IGludGVnZXIgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwID0gKHNob3J0KSBpdmFsOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlICdIJzogeyAvKiBzaG9ydCBpbnQgc2l6ZWQgYml0ZmllbGQsIGJvdGggc2lnbmVkIGFuZAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFsbG93ZWQgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgKnAgPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIHNob3J0ICopOworICAgICAgICBsb25nIGl2YWw7CisgICAgICAgIGlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8SD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGl2YWwgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soYXJnKTsKKyAgICAgICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9ICh1bnNpZ25lZCBzaG9ydCkgaXZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSAnaSc6IHsvKiBzaWduZWQgaW50ICovCisgICAgICAgIGludCAqcCA9IHZhX2FyZygqcF92YSwgaW50ICopOworICAgICAgICBsb25nIGl2YWw7CisgICAgICAgIGlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGl2YWwgPSBQeUludF9Bc0xvbmcoYXJnKTsKKyAgICAgICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBlbHNlIGlmIChpdmFsID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgInNpZ25lZCBpbnRlZ2VyIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7CisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxpPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdmFsIDwgSU5UX01JTikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgInNpZ25lZCBpbnRlZ2VyIGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7CisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxpPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9IGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ0knOiB7IC8qIGludCBzaXplZCBiaXRmaWVsZCwgYm90aCBzaWduZWQgYW5kCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYWxsb3dlZCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgKnAgPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIGludCAqKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGl2YWw7CisgICAgICAgIGlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8ST4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGl2YWwgPSAodW5zaWduZWQgaW50KVB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOworICAgICAgICBpZiAoaXZhbCA9PSAodW5zaWduZWQgaW50KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxJPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnAgPSBpdmFsOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlICduJzogLyogUHlfc3NpemVfdCAqLwogI2lmIFNJWkVPRl9TSVpFX1QgIT0gU0laRU9GX0xPTkcKLQl7Ci0JCVB5X3NzaXplX3QgKnAgPSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QgKik7Ci0JCVB5X3NzaXplX3QgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxuPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzU3NpemVfdChhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8bj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCSpwID0gaXZhbDsKLQkJYnJlYWs7Ci0JfQorICAgIHsKKyAgICAgICAgUHlfc3NpemVfdCAqcCA9IHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCAqKTsKKyAgICAgICAgUHlfc3NpemVfdCBpdmFsOworICAgICAgICBpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPG4+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpdmFsID0gUHlJbnRfQXNTc2l6ZV90KGFyZyk7CisgICAgICAgIGlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxuPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgKnAgPSBpdmFsOworICAgICAgICBicmVhazsKKyAgICB9CiAjZW5kaWYKLQkvKiBGYWxsIHRocm91Z2ggZnJvbSAnbicgdG8gJ2wnIGlmIFB5X3NzaXplX3QgaXMgaW50ICovCi0JY2FzZSAnbCc6IHsvKiBsb25nIGludCAqLwotCQlsb25nICpwID0gdmFfYXJnKCpwX3ZhLCBsb25nICopOwotCQlsb25nIGl2YWw7Ci0JCWlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8bD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWl2YWwgPSBQeUludF9Bc0xvbmcoYXJnKTsKLQkJaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGw+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQllbHNlCi0JCQkqcCA9IGl2YWw7Ci0JCWJyZWFrOwotCX0KKyAgICAvKiBGYWxsIHRocm91Z2ggZnJvbSAnbicgdG8gJ2wnIGlmIFB5X3NzaXplX3QgaXMgaW50ICovCisgICAgY2FzZSAnbCc6IHsvKiBsb25nIGludCAqLworICAgICAgICBsb25nICpwID0gdmFfYXJnKCpwX3ZhLCBsb25nICopOworICAgICAgICBsb25nIGl2YWw7CisgICAgICAgIGlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8bD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGl2YWwgPSBQeUludF9Bc0xvbmcoYXJnKTsKKyAgICAgICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGw+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9IGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCWNhc2UgJ2snOiB7IC8qIGxvbmcgc2l6ZWQgYml0ZmllbGQgKi8KLQkJdW5zaWduZWQgbG9uZyAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgbG9uZyAqKTsKLQkJdW5zaWduZWQgbG9uZyBpdmFsOwotCQlpZiAoUHlJbnRfQ2hlY2soYXJnKSkKLQkJCWl2YWwgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soYXJnKTsKLQkJZWxzZSBpZiAoUHlMb25nX0NoZWNrKGFyZykpCi0JCQlpdmFsID0gUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayhhcmcpOwotCQllbHNlCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxrPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJKnAgPSBpdmFsOwotCQlicmVhazsKLQl9Ci0JCisgICAgY2FzZSAnayc6IHsgLyogbG9uZyBzaXplZCBiaXRmaWVsZCAqLworICAgICAgICB1bnNpZ25lZCBsb25nICpwID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBsb25nICopOworICAgICAgICB1bnNpZ25lZCBsb25nIGl2YWw7CisgICAgICAgIGlmIChQeUludF9DaGVjayhhcmcpKQorICAgICAgICAgICAgaXZhbCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOworICAgICAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkKKyAgICAgICAgICAgIGl2YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGs+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAqcCA9IGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JY2FzZSAnTCc6IHsvKiBQWV9MT05HX0xPTkcgKi8KLQkJUFlfTE9OR19MT05HICpwID0gdmFfYXJnKCAqcF92YSwgUFlfTE9OR19MT05HICogKTsKLQkJUFlfTE9OR19MT05HIGl2YWw7Ci0JCWlmIChmbG9hdF9hcmd1bWVudF93YXJuaW5nKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigibG9uZzxMPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKGFyZyk7Ci0JCWlmIChpdmFsID09IChQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSApIHsKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJsb25nPEw+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9IGVsc2UgewotCQkJKnAgPSBpdmFsOwotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICBjYXNlICdMJzogey8qIFBZX0xPTkdfTE9ORyAqLworICAgICAgICBQWV9MT05HX0xPTkcgKnAgPSB2YV9hcmcoICpwX3ZhLCBQWV9MT05HX0xPTkcgKiApOworICAgICAgICBQWV9MT05HX0xPTkcgaXZhbDsKKyAgICAgICAgaWYgKGZsb2F0X2FyZ3VtZW50X3dhcm5pbmcoYXJnKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJsb25nPEw+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpdmFsID0gUHlMb25nX0FzTG9uZ0xvbmcoYXJnKTsKKyAgICAgICAgaWYgKGl2YWwgPT0gKFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpICkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImxvbmc8TD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcCA9IGl2YWw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JY2FzZSAnSyc6IHsgLyogbG9uZyBsb25nIHNpemVkIGJpdGZpZWxkICovCi0JCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgUFlfTE9OR19MT05HICopOwotCQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgaXZhbDsKLQkJaWYgKFB5SW50X0NoZWNrKGFyZykpCi0JCQlpdmFsID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7Ci0JCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhhcmcpKQotCQkJaXZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKGFyZyk7Ci0JCWVsc2UKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEs+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkqcCA9IGl2YWw7Ci0JCWJyZWFrOwotCX0KKyAgICBjYXNlICdLJzogeyAvKiBsb25nIGxvbmcgc2l6ZWQgYml0ZmllbGQgKi8KKyAgICAgICAgdW5zaWduZWQgUFlfTE9OR19MT05HICpwID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKik7CisgICAgICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBpdmFsOworICAgICAgICBpZiAoUHlJbnRfQ2hlY2soYXJnKSkKKyAgICAgICAgICAgIGl2YWwgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soYXJnKTsKKyAgICAgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKGFyZykpCisgICAgICAgICAgICBpdmFsID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soYXJnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Sz4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICpwID0gaXZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQogI2VuZGlmCi0JCi0JY2FzZSAnZic6IHsvKiBmbG9hdCAqLwotCQlmbG9hdCAqcCA9IHZhX2FyZygqcF92YSwgZmxvYXQgKik7Ci0JCWRvdWJsZSBkdmFsID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJmbG9hdDxmPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJZWxzZQotCQkJKnAgPSAoZmxvYXQpIGR2YWw7Ci0JCWJyZWFrOwotCX0KLQkKLQljYXNlICdkJzogey8qIGRvdWJsZSAqLwotCQlkb3VibGUgKnAgPSB2YV9hcmcoKnBfdmEsIGRvdWJsZSAqKTsKLQkJZG91YmxlIGR2YWwgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImZsb2F0PGQ+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQllbHNlCi0JCQkqcCA9IGR2YWw7Ci0JCWJyZWFrOwotCX0KLQkKKworICAgIGNhc2UgJ2YnOiB7LyogZmxvYXQgKi8KKyAgICAgICAgZmxvYXQgKnAgPSB2YV9hcmcoKnBfdmEsIGZsb2F0ICopOworICAgICAgICBkb3VibGUgZHZhbCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiZmxvYXQ8Zj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwID0gKGZsb2F0KSBkdmFsOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlICdkJzogey8qIGRvdWJsZSAqLworICAgICAgICBkb3VibGUgKnAgPSB2YV9hcmcoKnBfdmEsIGRvdWJsZSAqKTsKKyAgICAgICAgZG91YmxlIGR2YWwgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImZsb2F0PGQ+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9IGR2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKwogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQljYXNlICdEJzogey8qIGNvbXBsZXggZG91YmxlICovCi0JCVB5X2NvbXBsZXggKnAgPSB2YV9hcmcoKnBfdmEsIFB5X2NvbXBsZXggKik7Ci0JCVB5X2NvbXBsZXggY3ZhbDsKLQkJY3ZhbCA9IFB5Q29tcGxleF9Bc0NDb21wbGV4KGFyZyk7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImNvbXBsZXg8RD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UKLQkJCSpwID0gY3ZhbDsKLQkJYnJlYWs7Ci0JfQorICAgIGNhc2UgJ0QnOiB7LyogY29tcGxleCBkb3VibGUgKi8KKyAgICAgICAgUHlfY29tcGxleCAqcCA9IHZhX2FyZygqcF92YSwgUHlfY29tcGxleCAqKTsKKyAgICAgICAgUHlfY29tcGxleCBjdmFsOworICAgICAgICBjdmFsID0gUHlDb21wbGV4X0FzQ0NvbXBsZXgoYXJnKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiY29tcGxleDxEPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnAgPSBjdmFsOworICAgICAgICBicmVhazsKKyAgICB9CiAjZW5kaWYgLyogV0lUSE9VVF9DT01QTEVYICovCi0JCi0JY2FzZSAnYyc6IHsvKiBjaGFyICovCi0JCWNoYXIgKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7Ci0JCWlmIChQeVN0cmluZ19DaGVjayhhcmcpICYmIFB5U3RyaW5nX1NpemUoYXJnKSA9PSAxKQotCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKVswXTsKLQkJZWxzZQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImNoYXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWJyZWFrOwotCX0KLQkKLQljYXNlICdzJzogey8qIHN0cmluZyAqLwotCQlpZiAoKmZvcm1hdCA9PSAnKicpIHsKLQkJCVB5X2J1ZmZlciAqcCA9IChQeV9idWZmZXIgKil2YV9hcmcoKnBfdmEsIFB5X2J1ZmZlciAqKTsKIAotCQkJaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKLQkJCQlQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBhcmcsCi0JCQkJCQkgIFB5U3RyaW5nX0FTX1NUUklORyhhcmcpLCBQeVN0cmluZ19HRVRfU0laRShhcmcpLAotCQkJCQkJICAxLCAwKTsKLQkJCX0KLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJCXVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKLQkJCQlpZiAodWFyZyA9PSBOVUxMKQotCQkJCQlyZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCi0JCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJUHlCdWZmZXJfRmlsbEluZm8ocCwgYXJnLAotCQkJCQkJICBQeVN0cmluZ19BU19TVFJJTkcodWFyZyksIFB5U3RyaW5nX0dFVF9TSVpFKHVhcmcpLAotCQkJCQkJICAxLCAwKTsKLQkJCX0KLSNlbmRpZgotCQkJZWxzZSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KLQkJCQljaGFyICpidWY7Ci0JCQkJaWYgKGdldGJ1ZmZlcihhcmcsIHAsICZidWYpIDwgMCkKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoYWRkY2xlYW51cChwLCBmcmVlbGlzdCwgY2xlYW51cF9idWZmZXIpKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCSIoY2xlYW51cCBwcm9ibGVtKSIsCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCWZvcm1hdCsrOwotCQl9IGVsc2UgaWYgKCpmb3JtYXQgPT0gJyMnKSB7Ci0JCQl2b2lkICoqcCA9ICh2b2lkICoqKXZhX2FyZygqcF92YSwgY2hhciAqKik7Ci0JCQlGRVRDSF9TSVpFOwotCQkJCi0JCQlpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQkJCSpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyk7Ci0JCQkJU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRShhcmcpKTsKLQkJCX0KLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJCXVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKLQkJCQlpZiAodWFyZyA9PSBOVUxMKQotCQkJCQlyZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCi0JCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcodWFyZyk7Ci0JCQkJU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRSh1YXJnKSk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWVsc2UgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCi0JCQkJY2hhciAqYnVmOwotCQkJCVB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7Ci0JCQkJaWYgKGNvdW50IDwgMCkKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJU1RPUkVfU0laRShjb3VudCk7Ci0JCQl9Ci0JCQlmb3JtYXQrKzsKLQkJfSBlbHNlIHsKLQkJCWNoYXIgKipwID0gdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLQkJCQotCQkJaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpCi0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJCXVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKLQkJCQlpZiAodWFyZyA9PSBOVUxMKQotCQkJCQlyZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCi0JCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcodWFyZyk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWVsc2UKLQkJCQlyZXR1cm4gY29udmVydGVycigic3RyaW5nIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJaWYgKChQeV9zc2l6ZV90KXN0cmxlbigqcCkgIT0gUHlTdHJpbmdfU2l6ZShhcmcpKQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmcgd2l0aG91dCBudWxsIGJ5dGVzIiwKLQkJCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICBjYXNlICdjJzogey8qIGNoYXIgKi8KKyAgICAgICAgY2hhciAqcCA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykgJiYgUHlTdHJpbmdfU2l6ZShhcmcpID09IDEpCisgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpWzBdOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiY2hhciIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JY2FzZSAneic6IHsvKiBzdHJpbmcsIG1heSBiZSBOVUxMIChOb25lKSAqLwotCQlpZiAoKmZvcm1hdCA9PSAnKicpIHsKLQkJCVB5X2J1ZmZlciAqcCA9IChQeV9idWZmZXIgKil2YV9hcmcoKnBfdmEsIFB5X2J1ZmZlciAqKTsKKyAgICBjYXNlICdzJzogey8qIHN0cmluZyAqLworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnKicpIHsKKyAgICAgICAgICAgIFB5X2J1ZmZlciAqcCA9IChQeV9idWZmZXIgKil2YV9hcmcoKnBfdmEsIFB5X2J1ZmZlciAqKTsKIAotCQkJaWYgKGFyZyA9PSBQeV9Ob25lKQotCQkJCVB5QnVmZmVyX0ZpbGxJbmZvKHAsIE5VTEwsIE5VTEwsIDAsIDEsIDApOwotCQkJZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQkJCVB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywKLQkJCQkJCSAgUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyksIFB5U3RyaW5nX0dFVF9TSVpFKGFyZyksCi0JCQkJCQkgIDEsIDApOwotCQkJfQorICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyksIFB5U3RyaW5nX0dFVF9TSVpFKGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCk7CisgICAgICAgICAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKLQkJCQl1YXJnID0gVU5JQ09ERV9ERUZBVUxUX0VOQ09ESU5HKGFyZyk7Ci0JCQkJaWYgKHVhcmcgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoQ09OVl9VTklDT0RFLAotCQkJCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJCVB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywKLQkJCQkJCSAgUHlTdHJpbmdfQVNfU1RSSU5HKHVhcmcpLCBQeVN0cmluZ19HRVRfU0laRSh1YXJnKSwKLQkJCQkJCSAgMSwgMCk7Ci0JCQl9CisgICAgICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgIHVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAodWFyZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHVhcmcpLCBQeVN0cmluZ19HRVRfU0laRSh1YXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwKTsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJZWxzZSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KLQkJCQljaGFyICpidWY7Ci0JCQkJaWYgKGdldGJ1ZmZlcihhcmcsIHAsICZidWYpIDwgMCkKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoYWRkY2xlYW51cChwLCBmcmVlbGlzdCwgY2xlYW51cF9idWZmZXIpKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCSIoY2xlYW51cCBwcm9ibGVtKSIsCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCWZvcm1hdCsrOwotCQl9IGVsc2UgaWYgKCpmb3JtYXQgPT0gJyMnKSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KLQkJCXZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLQkJCUZFVENIX1NJWkU7Ci0JCQkKLQkJCWlmIChhcmcgPT0gUHlfTm9uZSkgewotCQkJCSpwID0gMDsKLQkJCQlTVE9SRV9TSVpFKDApOwotCQkJfQotCQkJZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQkJCSpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyk7Ci0JCQkJU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRShhcmcpKTsKLQkJCX0KLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJCXVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKLQkJCQlpZiAodWFyZyA9PSBOVUxMKQotCQkJCQlyZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCi0JCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcodWFyZyk7Ci0JCQkJU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRSh1YXJnKSk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWVsc2UgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCi0JCQkJY2hhciAqYnVmOwotCQkJCVB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7Ci0JCQkJaWYgKGNvdW50IDwgMCkKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJU1RPUkVfU0laRShjb3VudCk7Ci0JCQl9Ci0JCQlmb3JtYXQrKzsKLQkJfSBlbHNlIHsKLQkJCWNoYXIgKipwID0gdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLQkJCQotCQkJaWYgKGFyZyA9PSBQeV9Ob25lKQotCQkJCSpwID0gMDsKLQkJCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpCi0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJCXVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKLQkJCQlpZiAodWFyZyA9PSBOVUxMKQotCQkJCQlyZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCi0JCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcodWFyZyk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWVsc2UKLQkJCQlyZXR1cm4gY29udmVydGVycigic3RyaW5nIG9yIE5vbmUiLCAKLQkJCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJaWYgKCpmb3JtYXQgPT0gJyMnKSB7Ci0JCQkJRkVUQ0hfU0laRTsKLQkJCQlhc3NlcnQoMCk7IC8qIFhYWCByZWR1bmRhbnQgd2l0aCBpZi1jYXNlICovCi0JCQkJaWYgKGFyZyA9PSBQeV9Ob25lKQotCQkJCQkqcSA9IDA7Ci0JCQkJZWxzZQotCQkJCQkqcSA9IFB5U3RyaW5nX1NpemUoYXJnKTsKLQkJCQlmb3JtYXQrKzsKLQkJCX0KLQkJCWVsc2UgaWYgKCpwICE9IE5VTEwgJiYKLQkJCQkgKFB5X3NzaXplX3Qpc3RybGVuKCpwKSAhPSBQeVN0cmluZ19TaXplKGFyZykpCi0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCSJzdHJpbmcgd2l0aG91dCBudWxsIGJ5dGVzIG9yIE5vbmUiLCAKLQkJCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQkKLQljYXNlICdlJzogey8qIGVuY29kZWQgc3RyaW5nICovCi0JCWNoYXIgKipidWZmZXI7Ci0JCWNvbnN0IGNoYXIgKmVuY29kaW5nOwotCQlQeU9iamVjdCAqczsKLQkJUHlfc3NpemVfdCBzaXplOwotCQlpbnQgcmVjb2RlX3N0cmluZ3M7CisgICAgICAgICAgICBlbHNlIHsgLyogYW55IGJ1ZmZlci1saWtlIG9iamVjdCAqLworICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0YnVmZmVyKGFyZywgcCwgJmJ1ZikgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihidWYsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRjbGVhbnVwKHAsIGZyZWVsaXN0LCBjbGVhbnVwX2J1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAgICAgIihjbGVhbnVwIHByb2JsZW0pIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoKmZvcm1hdCA9PSAnIycpIHsKKyAgICAgICAgICAgIHZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKKyAgICAgICAgICAgIEZFVENIX1NJWkU7CiAKLQkJLyogR2V0ICdlJyBwYXJhbWV0ZXI6IHRoZSBlbmNvZGluZyBuYW1lICovCi0JCWVuY29kaW5nID0gKGNvbnN0IGNoYXIgKil2YV9hcmcoKnBfdmEsIGNvbnN0IGNoYXIgKik7CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgICpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyk7CisgICAgICAgICAgICAgICAgU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRShhcmcpKTsKKyAgICAgICAgICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWlmIChlbmNvZGluZyA9PSBOVUxMKQotCQkJZW5jb2RpbmcgPSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCk7CisgICAgICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgIHVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAodWFyZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKTsKKyAgICAgICAgICAgICAgICBTVE9SRV9TSVpFKFB5U3RyaW5nX0dFVF9TSVpFKHVhcmcpKTsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJCi0JCS8qIEdldCBvdXRwdXQgYnVmZmVyIHBhcmFtZXRlcjoKLQkJICAgJ3MnIChyZWNvZGUgYWxsIG9iamVjdHMgdmlhIFVuaWNvZGUpIG9yCi0JCSAgICd0JyAob25seSByZWNvZGUgbm9uLXN0cmluZyBvYmplY3RzKSAKLQkJKi8KLQkJaWYgKCpmb3JtYXQgPT0gJ3MnKQotCQkJcmVjb2RlX3N0cmluZ3MgPSAxOwotCQllbHNlIGlmICgqZm9ybWF0ID09ICd0JykKLQkJCXJlY29kZV9zdHJpbmdzID0gMDsKLQkJZWxzZQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJIih1bmtub3duIHBhcnNlciBtYXJrZXIgY29tYmluYXRpb24pIiwKLQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWJ1ZmZlciA9IChjaGFyICoqKXZhX2FyZygqcF92YSwgY2hhciAqKik7Ci0JCWZvcm1hdCsrOwotCQlpZiAoYnVmZmVyID09IE5VTEwpCi0JCQlyZXR1cm4gY29udmVydGVycigiKGJ1ZmZlciBpcyBOVUxMKSIsIAotCQkJCQkgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQotCQkvKiBFbmNvZGUgb2JqZWN0ICovCi0JCWlmICghcmVjb2RlX3N0cmluZ3MgJiYgUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQkJcyA9IGFyZzsKLQkJCVB5X0lOQ1JFRihzKTsKLQkJfQotCQllbHNlIHsKLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCSAgICAJUHlPYmplY3QgKnU7CisgICAgICAgICAgICBlbHNlIHsgLyogYW55IGJ1ZmZlci1saWtlIG9iamVjdCAqLworICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGNvdW50ID0gY29udmVydGJ1ZmZlcihhcmcsIHAsICZidWYpOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKGJ1ZiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgICAgIFNUT1JFX1NJWkUoY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyICoqcCA9IHZhX2FyZygqcF92YSwgY2hhciAqKik7CiAKLQkJCS8qIENvbnZlcnQgb2JqZWN0IHRvIFVuaWNvZGUgKi8KLQkJCXUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChhcmcpOwotCQkJaWYgKHUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkJInN0cmluZyBvciB1bmljb2RlIG9yIHRleHQgYnVmZmVyIiwgCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQotCQkJLyogRW5jb2RlIG9iamVjdDsgdXNlIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcgKi8KLQkJCXMgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHUsCi0JCQkJCQkgICAgICBlbmNvZGluZywKLQkJCQkJCSAgICAgIE5VTEwpOwotCQkJUHlfREVDUkVGKHUpOwotCQkJaWYgKHMgPT0gTlVMTCkKLQkJCQlyZXR1cm4gY29udmVydGVycigiKGVuY29kaW5nIGZhaWxlZCkiLAotCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHMpKSB7Ci0JCQkJUHlfREVDUkVGKHMpOwotCQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCQkiKGVuY29kZXIgZmFpbGVkIHRvIHJldHVybiBhIHN0cmluZykiLAotCQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkKKyAgICAgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpOworI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKKyAgICAgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICAgICAgdWFyZyA9IFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpOworICAgICAgICAgICAgICAgIGlmICh1YXJnID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKENPTlZfVU5JQ09ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgICAgICpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHVhcmcpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoInN0cmluZyIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIGlmICgoUHlfc3NpemVfdClzdHJsZW4oKnApICE9IFB5U3RyaW5nX1NpemUoYXJnKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigic3RyaW5nIHdpdGhvdXQgbnVsbCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ3onOiB7Lyogc3RyaW5nLCBtYXkgYmUgTlVMTCAoTm9uZSkgKi8KKyAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyonKSB7CisgICAgICAgICAgICBQeV9idWZmZXIgKnAgPSAoUHlfYnVmZmVyICopdmFfYXJnKCpwX3ZhLCBQeV9idWZmZXIgKik7CisKKyAgICAgICAgICAgIGlmIChhcmcgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBOVUxMLCBOVUxMLCAwLCAxLCAwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyksIFB5U3RyaW5nX0dFVF9TSVpFKGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCk7CisgICAgICAgICAgICB9CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorICAgICAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICB1YXJnID0gVU5JQ09ERV9ERUZBVUxUX0VOQ09ESU5HKGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKHVhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoQ09OVl9VTklDT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICAgICAgUHlCdWZmZXJfRmlsbEluZm8ocCwgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKSwgUHlTdHJpbmdfR0VUX1NJWkUodWFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGVsc2UgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCisgICAgICAgICAgICAgICAgY2hhciAqYnVmOworICAgICAgICAgICAgICAgIGlmIChnZXRidWZmZXIoYXJnLCBwLCAmYnVmKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKGJ1ZiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZGNsZWFudXAocCwgZnJlZWxpc3QsIGNsZWFudXBfYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAiKGNsZWFudXAgcHJvYmxlbSkiLAorICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfSBlbHNlIGlmICgqZm9ybWF0ID09ICcjJykgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCisgICAgICAgICAgICB2b2lkICoqcCA9ICh2b2lkICoqKXZhX2FyZygqcF92YSwgY2hhciAqKik7CisgICAgICAgICAgICBGRVRDSF9TSVpFOworCisgICAgICAgICAgICBpZiAoYXJnID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICAqcCA9IDA7CisgICAgICAgICAgICAgICAgU1RPUkVfU0laRSgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpOworICAgICAgICAgICAgICAgIFNUT1JFX1NJWkUoUHlTdHJpbmdfR0VUX1NJWkUoYXJnKSk7CisgICAgICAgICAgICB9CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorICAgICAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICB1YXJnID0gVU5JQ09ERV9ERUZBVUxUX0VOQ09ESU5HKGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKHVhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoQ09OVl9VTklDT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICAgICAgKnAgPSBQeVN0cmluZ19BU19TVFJJTkcodWFyZyk7CisgICAgICAgICAgICAgICAgU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRSh1YXJnKSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGVsc2UgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCisgICAgICAgICAgICAgICAgY2hhciAqYnVmOworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICAgICAgU1RPUkVfU0laRShjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKipwID0gdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKKworICAgICAgICAgICAgaWYgKGFyZyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgICpwID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpCisgICAgICAgICAgICAgICAgKnAgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgIHVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAodWFyZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmcgb3IgTm9uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgRkVUQ0hfU0laRTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoMCk7IC8qIFhYWCByZWR1bmRhbnQgd2l0aCBpZi1jYXNlICovCisgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgICAgICAqcSA9IDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqcSA9IFB5U3RyaW5nX1NpemUoYXJnKTsKKyAgICAgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpwICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KXN0cmxlbigqcCkgIT0gUHlTdHJpbmdfU2l6ZShhcmcpKQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAic3RyaW5nIHdpdGhvdXQgbnVsbCBieXRlcyBvciBOb25lIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ2UnOiB7LyogZW5jb2RlZCBzdHJpbmcgKi8KKyAgICAgICAgY2hhciAqKmJ1ZmZlcjsKKyAgICAgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CisgICAgICAgIFB5T2JqZWN0ICpzOworICAgICAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgICAgIGludCByZWNvZGVfc3RyaW5nczsKKworICAgICAgICAvKiBHZXQgJ2UnIHBhcmFtZXRlcjogdGhlIGVuY29kaW5nIG5hbWUgKi8KKyAgICAgICAgZW5jb2RpbmcgPSAoY29uc3QgY2hhciAqKXZhX2FyZygqcF92YSwgY29uc3QgY2hhciAqKTsKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKQorICAgICAgICAgICAgZW5jb2RpbmcgPSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCk7CisjZW5kaWYKKworICAgICAgICAvKiBHZXQgb3V0cHV0IGJ1ZmZlciBwYXJhbWV0ZXI6CisgICAgICAgICAgICdzJyAocmVjb2RlIGFsbCBvYmplY3RzIHZpYSBVbmljb2RlKSBvcgorICAgICAgICAgICAndCcgKG9ubHkgcmVjb2RlIG5vbi1zdHJpbmcgb2JqZWN0cykKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCpmb3JtYXQgPT0gJ3MnKQorICAgICAgICAgICAgcmVjb2RlX3N0cmluZ3MgPSAxOworICAgICAgICBlbHNlIGlmICgqZm9ybWF0ID09ICd0JykKKyAgICAgICAgICAgIHJlY29kZV9zdHJpbmdzID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgIih1bmtub3duIHBhcnNlciBtYXJrZXIgY29tYmluYXRpb24pIiwKKyAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGJ1ZmZlciA9IChjaGFyICoqKXZhX2FyZygqcF92YSwgY2hhciAqKik7CisgICAgICAgIGZvcm1hdCsrOworICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiKGJ1ZmZlciBpcyBOVUxMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisKKyAgICAgICAgLyogRW5jb2RlIG9iamVjdCAqLworICAgICAgICBpZiAoIXJlY29kZV9zdHJpbmdzICYmIFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgIHMgPSBhcmc7CisgICAgICAgICAgICBQeV9JTkNSRUYocyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorICAgICAgICAgICAgUHlPYmplY3QgKnU7CisKKyAgICAgICAgICAgIC8qIENvbnZlcnQgb2JqZWN0IHRvIFVuaWNvZGUgKi8KKyAgICAgICAgICAgIHUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChhcmcpOworICAgICAgICAgICAgaWYgKHUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAgICAgInN0cmluZyBvciB1bmljb2RlIG9yIHRleHQgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworCisgICAgICAgICAgICAvKiBFbmNvZGUgb2JqZWN0OyB1c2UgZGVmYXVsdCBlcnJvciBoYW5kbGluZyAqLworICAgICAgICAgICAgcyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIoZW5jb2RpbmcgZmFpbGVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhzKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAgICAgIihlbmNvZGVyIGZhaWxlZCB0byByZXR1cm4gYSBzdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgfQogI2Vsc2UKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmc8ZT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigic3RyaW5nPGU+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogI2VuZGlmCi0JCX0KLQkJc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHMpOworICAgICAgICB9CisgICAgICAgIHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShzKTsKIAotCQkvKiBXcml0ZSBvdXRwdXQ7IG91dHB1dCBpcyBndWFyYW50ZWVkIHRvIGJlIDAtdGVybWluYXRlZCAqLwotCQlpZiAoKmZvcm1hdCA9PSAnIycpIHsgCi0JCQkvKiBVc2luZyBidWZmZXIgbGVuZ3RoIHBhcmFtZXRlciAnIyc6Ci0JCQkJICAgCi0JCQkgICAtIGlmICpidWZmZXIgaXMgTlVMTCwgYSBuZXcgYnVmZmVyIG9mIHRoZQotCQkJICAgbmVlZGVkIHNpemUgaXMgYWxsb2NhdGVkIGFuZCB0aGUgZGF0YQotCQkJICAgY29waWVkIGludG8gaXQ7ICpidWZmZXIgaXMgdXBkYXRlZCB0byBwb2ludAotCQkJICAgdG8gdGhlIG5ldyBidWZmZXI7IHRoZSBjYWxsZXIgaXMKLQkJCSAgIHJlc3BvbnNpYmxlIGZvciBQeU1lbV9GcmVlKClpbmcgaXQgYWZ0ZXIKLQkJCSAgIHVzYWdlIAorICAgICAgICAvKiBXcml0ZSBvdXRwdXQ7IG91dHB1dCBpcyBndWFyYW50ZWVkIHRvIGJlIDAtdGVybWluYXRlZCAqLworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnIycpIHsKKyAgICAgICAgICAgIC8qIFVzaW5nIGJ1ZmZlciBsZW5ndGggcGFyYW1ldGVyICcjJzoKIAotCQkJICAgLSBpZiAqYnVmZmVyIGlzIG5vdCBOVUxMLCB0aGUgZGF0YSBpcwotCQkJICAgY29waWVkIHRvICpidWZmZXI7ICpidWZmZXJfbGVuIGhhcyB0byBiZQotCQkJICAgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgb24gaW5wdXQ7Ci0JCQkgICBidWZmZXIgb3ZlcmZsb3cgaXMgc2lnbmFsbGVkIHdpdGggYW4gZXJyb3I7Ci0JCQkgICBidWZmZXIgaGFzIHRvIHByb3ZpZGUgZW5vdWdoIHJvb20gZm9yIHRoZQotCQkJICAgZW5jb2RlZCBzdHJpbmcgcGx1cyB0aGUgdHJhaWxpbmcgMC1ieXRlCi0JCQkgICAKLQkJCSAgIC0gaW4gYm90aCBjYXNlcywgKmJ1ZmZlcl9sZW4gaXMgdXBkYXRlZCB0bwotCQkJICAgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAvZXhjbHVkaW5nLyB0aGUKLQkJCSAgIHRyYWlsaW5nIDAtYnl0ZSAKLQkJCSAgIAotCQkJKi8KLQkJCUZFVENIX1NJWkU7CisgICAgICAgICAgICAgICAtIGlmICpidWZmZXIgaXMgTlVMTCwgYSBuZXcgYnVmZmVyIG9mIHRoZQorICAgICAgICAgICAgICAgbmVlZGVkIHNpemUgaXMgYWxsb2NhdGVkIGFuZCB0aGUgZGF0YQorICAgICAgICAgICAgICAgY29waWVkIGludG8gaXQ7ICpidWZmZXIgaXMgdXBkYXRlZCB0byBwb2ludAorICAgICAgICAgICAgICAgdG8gdGhlIG5ldyBidWZmZXI7IHRoZSBjYWxsZXIgaXMKKyAgICAgICAgICAgICAgIHJlc3BvbnNpYmxlIGZvciBQeU1lbV9GcmVlKClpbmcgaXQgYWZ0ZXIKKyAgICAgICAgICAgICAgIHVzYWdlCiAKLQkJCWZvcm1hdCsrOwotCQkJaWYgKHEgPT0gTlVMTCAmJiBxMiA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHMpOwotCQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCQkiKGJ1ZmZlcl9sZW4gaXMgTlVMTCkiLAotCQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoKmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJKmJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBzaXplICsgMSk7Ci0JCQkJaWYgKCpidWZmZXIgPT0gTlVMTCkgewotCQkJCQlQeV9ERUNSRUYocyk7Ci0JCQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCQkJIihtZW1vcnkgZXJyb3IpIiwKLQkJCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQl9Ci0JCQkJaWYgKGFkZGNsZWFudXAoKmJ1ZmZlciwgZnJlZWxpc3QsIGNsZWFudXBfcHRyKSkgewotCQkJCQlQeV9ERUNSRUYocyk7Ci0JCQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCQkJIihjbGVhbnVwIHByb2JsZW0pIiwKLQkJCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChzaXplICsgMSA+IEJVRkZFUl9MRU4pIHsKLQkJCQkJUHlfREVDUkVGKHMpOwotCQkJCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkJCSIoYnVmZmVyIG92ZXJmbG93KSIsIAotCQkJCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJCX0KLQkJCX0KLQkJCW1lbWNweSgqYnVmZmVyLAotCQkJICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzKSwKLQkJCSAgICAgICBzaXplICsgMSk7Ci0JCQlTVE9SRV9TSVpFKHNpemUpOwotCQl9IGVsc2UgewotCQkJLyogVXNpbmcgYSAwLXRlcm1pbmF0ZWQgYnVmZmVyOgotCQkJCSAgIAotCQkJICAgLSB0aGUgZW5jb2RlZCBzdHJpbmcgaGFzIHRvIGJlIDAtdGVybWluYXRlZAotCQkJICAgZm9yIHRoaXMgdmFyaWFudCB0byB3b3JrOyBpZiBpdCBpcyBub3QsIGFuCi0JCQkgICBlcnJvciByYWlzZWQgCisgICAgICAgICAgICAgICAtIGlmICpidWZmZXIgaXMgbm90IE5VTEwsIHRoZSBkYXRhIGlzCisgICAgICAgICAgICAgICBjb3BpZWQgdG8gKmJ1ZmZlcjsgKmJ1ZmZlcl9sZW4gaGFzIHRvIGJlCisgICAgICAgICAgICAgICBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBvbiBpbnB1dDsKKyAgICAgICAgICAgICAgIGJ1ZmZlciBvdmVyZmxvdyBpcyBzaWduYWxsZWQgd2l0aCBhbiBlcnJvcjsKKyAgICAgICAgICAgICAgIGJ1ZmZlciBoYXMgdG8gcHJvdmlkZSBlbm91Z2ggcm9vbSBmb3IgdGhlCisgICAgICAgICAgICAgICBlbmNvZGVkIHN0cmluZyBwbHVzIHRoZSB0cmFpbGluZyAwLWJ5dGUKIAotCQkJICAgLSBhIG5ldyBidWZmZXIgb2YgdGhlIG5lZWRlZCBzaXplIGlzCi0JCQkgICBhbGxvY2F0ZWQgYW5kIHRoZSBkYXRhIGNvcGllZCBpbnRvIGl0OwotCQkJICAgKmJ1ZmZlciBpcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBuZXcKLQkJCSAgIGJ1ZmZlcjsgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKLQkJCSAgIFB5TWVtX0ZyZWUoKWluZyBpdCBhZnRlciB1c2FnZQorICAgICAgICAgICAgICAgLSBpbiBib3RoIGNhc2VzLCAqYnVmZmVyX2xlbiBpcyB1cGRhdGVkIHRvCisgICAgICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIC9leGNsdWRpbmcvIHRoZQorICAgICAgICAgICAgICAgdHJhaWxpbmcgMC1ieXRlCiAKLQkJCSovCi0JCQlpZiAoKFB5X3NzaXplX3Qpc3RybGVuKFB5U3RyaW5nX0FTX1NUUklORyhzKSkKLQkJCQkJCQkJIT0gc2l6ZSkgewotCQkJCVB5X0RFQ1JFRihzKTsKLQkJCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkJImVuY29kZWQgc3RyaW5nIHdpdGhvdXQgTlVMTCBieXRlcyIsCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCSpidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgc2l6ZSArIDEpOwotCQkJaWYgKCpidWZmZXIgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihzKTsKLQkJCQlyZXR1cm4gY29udmVydGVycigiKG1lbW9yeSBlcnJvcikiLAotCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoYWRkY2xlYW51cCgqYnVmZmVyLCBmcmVlbGlzdCwgY2xlYW51cF9wdHIpKSB7Ci0JCQkJUHlfREVDUkVGKHMpOwotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCIoY2xlYW51cCBwcm9ibGVtKSIsCi0JCQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQltZW1jcHkoKmJ1ZmZlciwKLQkJCSAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocyksCi0JCQkgICAgICAgc2l6ZSArIDEpOwotCQl9Ci0JCVB5X0RFQ1JFRihzKTsKLQkJYnJlYWs7Ci0JfQorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEZFVENIX1NJWkU7CisKKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgaWYgKHEgPT0gTlVMTCAmJiBxMiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAiKGJ1ZmZlcl9sZW4gaXMgTlVMTCkiLAorICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKmJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBzaXplICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAgICAgIihtZW1vcnkgZXJyb3IpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFkZGNsZWFudXAoKmJ1ZmZlciwgZnJlZWxpc3QsIGNsZWFudXBfcHRyKSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAgICAgIihjbGVhbnVwIHByb2JsZW0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzaXplICsgMSA+IEJVRkZFUl9MRU4pIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAgICAgICAgICIoYnVmZmVyIG92ZXJmbG93KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KCpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHMpLAorICAgICAgICAgICAgICAgICAgIHNpemUgKyAxKTsKKyAgICAgICAgICAgIFNUT1JFX1NJWkUoc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBVc2luZyBhIDAtdGVybWluYXRlZCBidWZmZXI6CisKKyAgICAgICAgICAgICAgIC0gdGhlIGVuY29kZWQgc3RyaW5nIGhhcyB0byBiZSAwLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgIGZvciB0aGlzIHZhcmlhbnQgdG8gd29yazsgaWYgaXQgaXMgbm90LCBhbgorICAgICAgICAgICAgICAgZXJyb3IgcmFpc2VkCisKKyAgICAgICAgICAgICAgIC0gYSBuZXcgYnVmZmVyIG9mIHRoZSBuZWVkZWQgc2l6ZSBpcworICAgICAgICAgICAgICAgYWxsb2NhdGVkIGFuZCB0aGUgZGF0YSBjb3BpZWQgaW50byBpdDsKKyAgICAgICAgICAgICAgICpidWZmZXIgaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV3CisgICAgICAgICAgICAgICBidWZmZXI7IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICAgICAgICAgICBQeU1lbV9GcmVlKClpbmcgaXQgYWZ0ZXIgdXNhZ2UKKworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgoUHlfc3NpemVfdClzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgICAgICJlbmNvZGVkIHN0cmluZyB3aXRob3V0IE5VTEwgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqYnVmZmVyID0gUHlNZW1fTkVXKGNoYXIsIHNpemUgKyAxKTsKKyAgICAgICAgICAgIGlmICgqYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoIihtZW1vcnkgZXJyb3IpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkY2xlYW51cCgqYnVmZmVyLCBmcmVlbGlzdCwgY2xlYW51cF9wdHIpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIoY2xlYW51cCBwcm9ibGVtKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweSgqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzKSwKKyAgICAgICAgICAgICAgICAgICBzaXplICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICBicmVhazsKKyAgICB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JY2FzZSAndSc6IHsvKiByYXcgdW5pY29kZSBidWZmZXIgKFB5X1VOSUNPREUgKikgKi8KLQkJaWYgKCpmb3JtYXQgPT0gJyMnKSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KLQkJCXZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLQkJCUZFVENIX1NJWkU7Ci0JCQlpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKLQkJCSAgICAJKnAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmcpOwotCQkJCVNUT1JFX1NJWkUoUHlVbmljb2RlX0dFVF9TSVpFKGFyZykpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoImNhbm5vdCBjb252ZXJ0IHJhdyBidWZmZXJzIiwKLQkJCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJfQotCQkJZm9ybWF0Kys7Ci0JCX0gZWxzZSB7Ci0JCQlQeV9VTklDT0RFICoqcCA9IHZhX2FyZygqcF92YSwgUHlfVU5JQ09ERSAqKik7Ci0JCQlpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpCi0JCQkJKnAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmcpOwotCQkJZWxzZQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCJ1bmljb2RlIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICBjYXNlICd1Jzogey8qIHJhdyB1bmljb2RlIGJ1ZmZlciAoUHlfVU5JQ09ERSAqKSAqLworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnIycpIHsgLyogYW55IGJ1ZmZlci1saWtlIG9iamVjdCAqLworICAgICAgICAgICAgdm9pZCAqKnAgPSAodm9pZCAqKil2YV9hcmcoKnBfdmEsIGNoYXIgKiopOworICAgICAgICAgICAgRkVUQ0hfU0laRTsKKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgICpwID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYXJnKTsKKyAgICAgICAgICAgICAgICBTVE9SRV9TSVpFKFB5VW5pY29kZV9HRVRfU0laRShhcmcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJjYW5ub3QgY29udmVydCByYXcgYnVmZmVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeV9VTklDT0RFICoqcCA9IHZhX2FyZygqcF92YSwgUHlfVU5JQ09ERSAqKik7CisgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpCisgICAgICAgICAgICAgICAgKnAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJ1bmljb2RlIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KICNlbmRpZgogCi0JY2FzZSAnUyc6IHsgLyogc3RyaW5nIG9iamVjdCAqLwotCQlQeU9iamVjdCAqKnAgPSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpCi0JCQkqcCA9IGFyZzsKLQkJZWxzZQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoInN0cmluZyIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJYnJlYWs7Ci0JfQotCQorICAgIGNhc2UgJ1MnOiB7IC8qIHN0cmluZyBvYmplY3QgKi8KKyAgICAgICAgUHlPYmplY3QgKipwID0gdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhhcmcpKQorICAgICAgICAgICAgKnAgPSBhcmc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmciLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQljYXNlICdVJzogeyAvKiBVbmljb2RlIG9iamVjdCAqLwotCQlQeU9iamVjdCAqKnAgPSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKLQkJaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKQotCQkJKnAgPSBhcmc7Ci0JCWVsc2UKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJ1bmljb2RlIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlicmVhazsKLQl9CisgICAgY2FzZSAnVSc6IHsgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICAgICAgUHlPYmplY3QgKipwID0gdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkKKyAgICAgICAgICAgICpwID0gYXJnOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigidW5pY29kZSIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogI2VuZGlmCi0JCi0JY2FzZSAnTyc6IHsgLyogb2JqZWN0ICovCi0JCVB5VHlwZU9iamVjdCAqdHlwZTsKLQkJUHlPYmplY3QgKipwOwotCQlpZiAoKmZvcm1hdCA9PSAnIScpIHsKLQkJCXR5cGUgPSB2YV9hcmcoKnBfdmEsIFB5VHlwZU9iamVjdCopOwotCQkJcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQkJZm9ybWF0Kys7Ci0JCQlpZiAoUHlUeXBlX0lzU3VidHlwZShhcmctPm9iX3R5cGUsIHR5cGUpKQotCQkJCSpwID0gYXJnOwotCQkJZWxzZQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKHR5cGUtPnRwX25hbWUsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKIAotCQl9Ci0JCWVsc2UgaWYgKCpmb3JtYXQgPT0gJz8nKSB7Ci0JCQlpbnF1aXJ5IHByZWQgPSB2YV9hcmcoKnBfdmEsIGlucXVpcnkpOwotCQkJcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQkJZm9ybWF0Kys7Ci0JCQlpZiAoKCpwcmVkKShhcmcpKSAKLQkJCQkqcCA9IGFyZzsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gY29udmVydGVycigiKHVuc3BlY2lmaWVkKSIsIAotCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJCi0JCX0KLQkJZWxzZSBpZiAoKmZvcm1hdCA9PSAnJicpIHsKLQkJCXR5cGVkZWYgaW50ICgqY29udmVydGVyKShQeU9iamVjdCAqLCB2b2lkICopOwotCQkJY29udmVydGVyIGNvbnZlcnQgPSB2YV9hcmcoKnBfdmEsIGNvbnZlcnRlcik7Ci0JCQl2b2lkICphZGRyID0gdmFfYXJnKCpwX3ZhLCB2b2lkICopOwotCQkJZm9ybWF0Kys7Ci0JCQlpZiAoISAoKmNvbnZlcnQpKGFyZywgYWRkcikpCi0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoIih1bnNwZWNpZmllZCkiLCAKLQkJCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWVsc2UgewotCQkJcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQkJKnAgPSBhcmc7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCQkKLQkJCi0JY2FzZSAndyc6IHsgLyogbWVtb3J5IGJ1ZmZlciwgcmVhZC13cml0ZSBhY2Nlc3MgKi8KLQkJdm9pZCAqKnAgPSB2YV9hcmcoKnBfdmEsIHZvaWQgKiopOwotCQl2b2lkICpyZXM7Ci0JCVB5QnVmZmVyUHJvY3MgKnBiID0gYXJnLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JCVB5X3NzaXplX3QgY291bnQ7CisgICAgY2FzZSAnTyc6IHsgLyogb2JqZWN0ICovCisgICAgICAgIFB5VHlwZU9iamVjdCAqdHlwZTsKKyAgICAgICAgUHlPYmplY3QgKipwOworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnIScpIHsKKyAgICAgICAgICAgIHR5cGUgPSB2YV9hcmcoKnBfdmEsIFB5VHlwZU9iamVjdCopOworICAgICAgICAgICAgcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICBpZiAoUHlUeXBlX0lzU3VidHlwZShhcmctPm9iX3R5cGUsIHR5cGUpKQorICAgICAgICAgICAgICAgICpwID0gYXJnOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKHR5cGUtPnRwX25hbWUsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKIAotCQlpZiAocGIgJiYgcGItPmJmX3JlbGVhc2VidWZmZXIgJiYgKmZvcm1hdCAhPSAnKicpCi0JCQkvKiBCdWZmZXIgbXVzdCBiZSByZWxlYXNlZCwgeWV0IGNhbGxlciBkb2VzIG5vdCB1c2UKLQkJCSAgIHRoZSBQeV9idWZmZXIgcHJvdG9jb2wuICovCi0JCQlyZXR1cm4gY29udmVydGVycigicGlubmVkIGJ1ZmZlciIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqZm9ybWF0ID09ICc/JykgeworICAgICAgICAgICAgaW5xdWlyeSBwcmVkID0gdmFfYXJnKCpwX3ZhLCBpbnF1aXJ5KTsKKyAgICAgICAgICAgIHAgPSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgaWYgKCgqcHJlZCkoYXJnKSkKKyAgICAgICAgICAgICAgICAqcCA9IGFyZzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiKHVuc3BlY2lmaWVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogCi0JCWlmIChwYiAmJiBwYi0+YmZfZ2V0YnVmZmVyICYmICpmb3JtYXQgPT0gJyonKSB7Ci0JCQkvKiBDYWxsZXIgaXMgaW50ZXJlc3RlZCBpbiBQeV9idWZmZXIsIGFuZCB0aGUgb2JqZWN0Ci0JCQkgICBzdXBwb3J0cyBpdCBkaXJlY3RseS4gKi8KLQkJCWZvcm1hdCsrOwotCQkJaWYgKHBiLT5iZl9nZXRidWZmZXIoYXJnLCAoUHlfYnVmZmVyKilwLCBQeUJVRl9XUklUQUJMRSkgPCAwKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlyZXR1cm4gY29udmVydGVycigicmVhZC13cml0ZSBidWZmZXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoYWRkY2xlYW51cChwLCBmcmVlbGlzdCwgY2xlYW51cF9idWZmZXIpKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCSIoY2xlYW51cCBwcm9ibGVtKSIsCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCWlmICghUHlCdWZmZXJfSXNDb250aWd1b3VzKChQeV9idWZmZXIqKXAsICdDJykpCi0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoImNvbnRpZ3VvdXMgYnVmZmVyIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqZm9ybWF0ID09ICcmJykgeworICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpjb252ZXJ0ZXIpKFB5T2JqZWN0ICosIHZvaWQgKik7CisgICAgICAgICAgICBjb252ZXJ0ZXIgY29udmVydCA9IHZhX2FyZygqcF92YSwgY29udmVydGVyKTsKKyAgICAgICAgICAgIHZvaWQgKmFkZHIgPSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIGlmICghICgqY29udmVydCkoYXJnLCBhZGRyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiKHVuc3BlY2lmaWVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgKnAgPSBhcmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JCWlmIChwYiA9PSBOVUxMIHx8Ci0JCSAgICBwYi0+YmZfZ2V0d3JpdGVidWZmZXIgPT0gTlVMTCB8fAotCQkgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpCi0JCQlyZXR1cm4gY29udmVydGVycigicmVhZC13cml0ZSBidWZmZXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWlmICgoKnBiLT5iZl9nZXRzZWdjb3VudCkoYXJnLCBOVUxMKSAhPSAxKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoInNpbmdsZS1zZWdtZW50IHJlYWQtd3JpdGUgYnVmZmVyIiwgCi0JCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlpZiAoKGNvdW50ID0gcGItPmJmX2dldHdyaXRlYnVmZmVyKGFyZywgMCwgJnJlcykpIDwgMCkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCIodW5zcGVjaWZpZWQpIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlpZiAoKmZvcm1hdCA9PSAnKicpIHsKLQkJCVB5QnVmZmVyX0ZpbGxJbmZvKChQeV9idWZmZXIqKXAsIGFyZywgcmVzLCBjb3VudCwgMSwgMCk7Ci0JCQlmb3JtYXQrKzsKLQkJfQotCQllbHNlIHsKLQkJCSpwID0gcmVzOwotCQkJaWYgKCpmb3JtYXQgPT0gJyMnKSB7Ci0JCQkJRkVUQ0hfU0laRTsKLQkJCQlTVE9SRV9TSVpFKGNvdW50KTsKLQkJCQlmb3JtYXQrKzsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0JCQotCWNhc2UgJ3QnOiB7IC8qIDgtYml0IGNoYXJhY3RlciBidWZmZXIsIHJlYWQtb25seSBhY2Nlc3MgKi8KLQkJY2hhciAqKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOwotCQlQeUJ1ZmZlclByb2NzICpwYiA9IGFyZy0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCQlQeV9zc2l6ZV90IGNvdW50OwotCQkKLQkJaWYgKCpmb3JtYXQrKyAhPSAnIycpCi0JCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkiaW52YWxpZCB1c2Ugb2YgJ3QnIGZvcm1hdCBjaGFyYWN0ZXIiLCAKLQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUoYXJnLT5vYl90eXBlLAotCQkJCSAgICAgICBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUikgfHwKLQkJICAgIHBiID09IE5VTEwgfHwgcGItPmJmX2dldGNoYXJidWZmZXIgPT0gTlVMTCB8fAotCQkgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpCi0JCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkic3RyaW5nIG9yIHJlYWQtb25seSBjaGFyYWN0ZXIgYnVmZmVyIiwKLQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CiAKLQkJaWYgKHBiLT5iZl9nZXRzZWdjb3VudChhcmcsIE5VTEwpICE9IDEpCi0JCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkic3RyaW5nIG9yIHNpbmdsZS1zZWdtZW50IHJlYWQtb25seSBidWZmZXIiLAotCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICBjYXNlICd3JzogeyAvKiBtZW1vcnkgYnVmZmVyLCByZWFkLXdyaXRlIGFjY2VzcyAqLworICAgICAgICB2b2lkICoqcCA9IHZhX2FyZygqcF92YSwgdm9pZCAqKik7CisgICAgICAgIHZvaWQgKnJlczsKKyAgICAgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSBhcmctPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICAgICAgUHlfc3NpemVfdCBjb3VudDsKIAotCQlpZiAocGItPmJmX3JlbGVhc2VidWZmZXIpCi0JCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkic3RyaW5nIG9yIHBpbm5lZCBidWZmZXIiLAotCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaWYgKHBiICYmIHBiLT5iZl9yZWxlYXNlYnVmZmVyICYmICpmb3JtYXQgIT0gJyonKQorICAgICAgICAgICAgLyogQnVmZmVyIG11c3QgYmUgcmVsZWFzZWQsIHlldCBjYWxsZXIgZG9lcyBub3QgdXNlCisgICAgICAgICAgICAgICB0aGUgUHlfYnVmZmVyIHByb3RvY29sLiAqLworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoInBpbm5lZCBidWZmZXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CiAKLQkJY291bnQgPSBwYi0+YmZfZ2V0Y2hhcmJ1ZmZlcihhcmcsIDAsIHApOwotCQlpZiAoY291bnQgPCAwKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoIih1bnNwZWNpZmllZCkiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCXsKLQkJCUZFVENIX1NJWkU7Ci0JCQlTVE9SRV9TSVpFKGNvdW50KTsKLQkJfQotCQlicmVhazsKLQl9CisgICAgICAgIGlmIChwYiAmJiBwYi0+YmZfZ2V0YnVmZmVyICYmICpmb3JtYXQgPT0gJyonKSB7CisgICAgICAgICAgICAvKiBDYWxsZXIgaXMgaW50ZXJlc3RlZCBpbiBQeV9idWZmZXIsIGFuZCB0aGUgb2JqZWN0CisgICAgICAgICAgICAgICBzdXBwb3J0cyBpdCBkaXJlY3RseS4gKi8KKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgaWYgKHBiLT5iZl9nZXRidWZmZXIoYXJnLCAoUHlfYnVmZmVyKilwLCBQeUJVRl9XUklUQUJMRSkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigicmVhZC13cml0ZSBidWZmZXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkY2xlYW51cChwLCBmcmVlbGlzdCwgY2xlYW51cF9idWZmZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgICAgICIoY2xlYW51cCBwcm9ibGVtKSIsCisgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghUHlCdWZmZXJfSXNDb250aWd1b3VzKChQeV9idWZmZXIqKXAsICdDJykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImNvbnRpZ3VvdXMgYnVmZmVyIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCWRlZmF1bHQ6Ci0JCXJldHVybiBjb252ZXJ0ZXJyKCJpbXBvc3NpYmxlPGJhZCBmb3JtYXQgY2hhcj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCi0JfQotCQotCSpwX2Zvcm1hdCA9IGZvcm1hdDsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHBiID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBiLT5iZl9nZXR3cml0ZWJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJyZWFkLXdyaXRlIGJ1ZmZlciIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaWYgKCgqcGItPmJmX2dldHNlZ2NvdW50KShhcmcsIE5VTEwpICE9IDEpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigic2luZ2xlLXNlZ21lbnQgcmVhZC13cml0ZSBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpZiAoKGNvdW50ID0gcGItPmJmX2dldHdyaXRlYnVmZmVyKGFyZywgMCwgJnJlcykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIodW5zcGVjaWZpZWQpIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnKicpIHsKKyAgICAgICAgICAgIFB5QnVmZmVyX0ZpbGxJbmZvKChQeV9idWZmZXIqKXAsIGFyZywgcmVzLCBjb3VudCwgMSwgMCk7CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICpwID0gcmVzOworICAgICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgRkVUQ0hfU0laRTsKKyAgICAgICAgICAgICAgICBTVE9SRV9TSVpFKGNvdW50KTsKKyAgICAgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlICd0JzogeyAvKiA4LWJpdCBjaGFyYWN0ZXIgYnVmZmVyLCByZWFkLW9ubHkgYWNjZXNzICovCisgICAgICAgIGNoYXIgKipwID0gdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKKyAgICAgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSBhcmctPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICAgICAgUHlfc3NpemVfdCBjb3VudDsKKworICAgICAgICBpZiAoKmZvcm1hdCsrICE9ICcjJykKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICJpbnZhbGlkIHVzZSBvZiAndCcgZm9ybWF0IGNoYXJhY3RlciIsCisgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKGFyZy0+b2JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUikgfHwKKyAgICAgICAgICAgIHBiID09IE5VTEwgfHwgcGItPmJmX2dldGNoYXJidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAic3RyaW5nIG9yIHJlYWQtb25seSBjaGFyYWN0ZXIgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisKKyAgICAgICAgaWYgKHBiLT5iZl9nZXRzZWdjb3VudChhcmcsIE5VTEwpICE9IDEpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAic3RyaW5nIG9yIHNpbmdsZS1zZWdtZW50IHJlYWQtb25seSBidWZmZXIiLAorICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKworICAgICAgICBpZiAocGItPmJmX3JlbGVhc2VidWZmZXIpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAic3RyaW5nIG9yIHBpbm5lZCBidWZmZXIiLAorICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKworICAgICAgICBjb3VudCA9IHBiLT5iZl9nZXRjaGFyYnVmZmVyKGFyZywgMCwgcCk7CisgICAgICAgIGlmIChjb3VudCA8IDApCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiKHVuc3BlY2lmaWVkKSIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgeworICAgICAgICAgICAgRkVUQ0hfU0laRTsKKyAgICAgICAgICAgIFNUT1JFX1NJWkUoY291bnQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbXBvc3NpYmxlPGJhZCBmb3JtYXQgY2hhcj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisKKyAgICB9CisKKyAgICAqcF9mb3JtYXQgPSBmb3JtYXQ7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBjb252ZXJ0YnVmZmVyKFB5T2JqZWN0ICphcmcsIHZvaWQgKipwLCBjaGFyICoqZXJybXNnKQogewotCVB5QnVmZmVyUHJvY3MgKnBiID0gYXJnLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JUHlfc3NpemVfdCBjb3VudDsKLQlpZiAocGIgPT0gTlVMTCB8fAotCSAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMIHx8Ci0JICAgIHBiLT5iZl9yZWxlYXNlYnVmZmVyICE9IE5VTEwpIHsKLQkJKmVycm1zZyA9ICJzdHJpbmcgb3IgcmVhZC1vbmx5IGJ1ZmZlciI7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCgqcGItPmJmX2dldHNlZ2NvdW50KShhcmcsIE5VTEwpICE9IDEpIHsKLQkJKmVycm1zZyA9ICJzdHJpbmcgb3Igc2luZ2xlLXNlZ21lbnQgcmVhZC1vbmx5IGJ1ZmZlciI7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKChjb3VudCA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKGFyZywgMCwgcCkpIDwgMCkgewotCQkqZXJybXNnID0gIih1bnNwZWNpZmllZCkiOwotCX0KLQlyZXR1cm4gY291bnQ7CisgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSBhcmctPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICBQeV9zc2l6ZV90IGNvdW50OworICAgIGlmIChwYiA9PSBOVUxMIHx8CisgICAgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgfHwKKyAgICAgICAgcGItPmJmX3JlbGVhc2VidWZmZXIgIT0gTlVMTCkgeworICAgICAgICAqZXJybXNnID0gInN0cmluZyBvciByZWFkLW9ubHkgYnVmZmVyIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKCpwYi0+YmZfZ2V0c2VnY291bnQpKGFyZywgTlVMTCkgIT0gMSkgeworICAgICAgICAqZXJybXNnID0gInN0cmluZyBvciBzaW5nbGUtc2VnbWVudCByZWFkLW9ubHkgYnVmZmVyIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKGNvdW50ID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikoYXJnLCAwLCBwKSkgPCAwKSB7CisgICAgICAgICplcnJtc2cgPSAiKHVuc3BlY2lmaWVkKSI7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIGludAogZ2V0YnVmZmVyKFB5T2JqZWN0ICphcmcsIFB5X2J1ZmZlciAqdmlldywgY2hhciAqKmVycm1zZykKIHsKLQl2b2lkICpidWY7Ci0JUHlfc3NpemVfdCBjb3VudDsKLQlQeUJ1ZmZlclByb2NzICpwYiA9IGFyZy0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCWlmIChwYiA9PSBOVUxMKSB7Ci0JCSplcnJtc2cgPSAic3RyaW5nIG9yIGJ1ZmZlciI7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHBiLT5iZl9nZXRidWZmZXIpIHsKLQkJaWYgKHBiLT5iZl9nZXRidWZmZXIoYXJnLCB2aWV3LCAwKSA8IDApIHsKLQkJCSplcnJtc2cgPSAiY29udmVydGlibGUgdG8gYSBidWZmZXIiOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICghUHlCdWZmZXJfSXNDb250aWd1b3VzKHZpZXcsICdDJykpIHsKLQkJCSplcnJtc2cgPSAiY29udGlndW91cyBidWZmZXIiOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiAwOwotCX0KKyAgICB2b2lkICpidWY7CisgICAgUHlfc3NpemVfdCBjb3VudDsKKyAgICBQeUJ1ZmZlclByb2NzICpwYiA9IGFyZy0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgIGlmIChwYiA9PSBOVUxMKSB7CisgICAgICAgICplcnJtc2cgPSAic3RyaW5nIG9yIGJ1ZmZlciI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHBiLT5iZl9nZXRidWZmZXIpIHsKKyAgICAgICAgaWYgKHBiLT5iZl9nZXRidWZmZXIoYXJnLCB2aWV3LCAwKSA8IDApIHsKKyAgICAgICAgICAgICplcnJtc2cgPSAiY29udmVydGlibGUgdG8gYSBidWZmZXIiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICghUHlCdWZmZXJfSXNDb250aWd1b3VzKHZpZXcsICdDJykpIHsKKyAgICAgICAgICAgICplcnJtc2cgPSAiY29udGlndW91cyBidWZmZXIiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWNvdW50ID0gY29udmVydGJ1ZmZlcihhcmcsICZidWYsIGVycm1zZyk7Ci0JaWYgKGNvdW50IDwgMCkgewotCQkqZXJybXNnID0gImNvbnZlcnRpYmxlIHRvIGEgYnVmZmVyIjsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQlQeUJ1ZmZlcl9GaWxsSW5mbyh2aWV3LCBOVUxMLCBidWYsIGNvdW50LCAxLCAwKTsKLQlyZXR1cm4gMDsKKyAgICBjb3VudCA9IGNvbnZlcnRidWZmZXIoYXJnLCAmYnVmLCBlcnJtc2cpOworICAgIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgKmVycm1zZyA9ICJjb252ZXJ0aWJsZSB0byBhIGJ1ZmZlciI7CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisgICAgUHlCdWZmZXJfRmlsbEluZm8odmlldywgTlVMTCwgYnVmLCBjb3VudCwgMSwgMCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFN1cHBvcnQgZm9yIGtleXdvcmQgYXJndW1lbnRzIGRvbmF0ZWQgYnkKQEAgLTE0MDksNDg3ICsxNDA5LDQ4NyBAQAogLyogUmV0dXJuIGZhbHNlICgwKSBmb3IgZXJyb3IsIGVsc2UgdHJ1ZS4gKi8KIGludAogUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICphcmdzLAotCQkJICAgIFB5T2JqZWN0ICprZXl3b3JkcywKLQkJCSAgICBjb25zdCBjaGFyICpmb3JtYXQsIAotCQkJICAgIGNoYXIgKiprd2xpc3QsIC4uLikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiprd2xpc3QsIC4uLikKIHsKLQlpbnQgcmV0dmFsOwotCXZhX2xpc3QgdmE7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IHZhOwogCi0JaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8Ci0JICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAotCSAgICBmb3JtYXQgPT0gTlVMTCB8fAotCSAgICBrd2xpc3QgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8CisgICAgICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAorICAgICAgICBmb3JtYXQgPT0gTlVMTCB8fAorICAgICAgICBrd2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQl2YV9zdGFydCh2YSwga3dsaXN0KTsKLQlyZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsIGt3bGlzdCwgJnZhLCAwKTsJCi0JdmFfZW5kKHZhKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIHZhX3N0YXJ0KHZhLCBrd2xpc3QpOworICAgIHJldHZhbCA9IHZnZXRhcmdza2V5d29yZHMoYXJncywga2V5d29yZHMsIGZvcm1hdCwga3dsaXN0LCAmdmEsIDApOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogaW50CiBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUKFB5T2JqZWN0ICphcmdzLAotCQkJCSAgUHlPYmplY3QgKmtleXdvcmRzLAotCQkJCSAgY29uc3QgY2hhciAqZm9ybWF0LCAKLQkJCQkgIGNoYXIgKiprd2xpc3QsIC4uLikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiprd2xpc3QsIC4uLikKIHsKLQlpbnQgcmV0dmFsOwotCXZhX2xpc3QgdmE7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IHZhOwogCi0JaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8Ci0JICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAotCSAgICBmb3JtYXQgPT0gTlVMTCB8fAotCSAgICBrd2xpc3QgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8CisgICAgICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAorICAgICAgICBmb3JtYXQgPT0gTlVMTCB8fAorICAgICAgICBrd2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQl2YV9zdGFydCh2YSwga3dsaXN0KTsKLQlyZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsIAotCQkJCSAga3dsaXN0LCAmdmEsIEZMQUdfU0laRV9UKTsKLQl2YV9lbmQodmEpOwotCXJldHVybiByZXR2YWw7CisgICAgdmFfc3RhcnQodmEsIGt3bGlzdCk7CisgICAgcmV0dmFsID0gdmdldGFyZ3NrZXl3b3JkcyhhcmdzLCBrZXl3b3JkcywgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmdmEsIEZMQUdfU0laRV9UKTsKKyAgICB2YV9lbmQodmEpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIAogaW50CiBQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3JkcyhQeU9iamVjdCAqYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprZXl3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqa3dsaXN0LCB2YV9saXN0IHZhKQogewotCWludCByZXR2YWw7Ci0JdmFfbGlzdCBsdmE7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IGx2YTsKIAotCWlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAotCSAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKLQkgICAgZm9ybWF0ID09IE5VTEwgfHwKLQkgICAga3dsaXN0ID09IE5VTEwpCi0JewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAorICAgICAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKKyAgICAgICAgZm9ybWF0ID09IE5VTEwgfHwKKyAgICAgICAga3dsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAjaWZkZWYgVkFfTElTVF9JU19BUlJBWQotCW1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOworICAgIG1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOwogI2Vsc2UKICNpZmRlZiBfX3ZhX2NvcHkKLQlfX3ZhX2NvcHkobHZhLCB2YSk7CisgICAgX192YV9jb3B5KGx2YSwgdmEpOwogI2Vsc2UKLQlsdmEgPSB2YTsKKyAgICBsdmEgPSB2YTsKICNlbmRpZgogI2VuZGlmCiAKLQlyZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsIGt3bGlzdCwgJmx2YSwgMCk7CQotCXJldHVybiByZXR2YWw7CisgICAgcmV0dmFsID0gdmdldGFyZ3NrZXl3b3JkcyhhcmdzLCBrZXl3b3JkcywgZm9ybWF0LCBrd2xpc3QsICZsdmEsIDApOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIGludAogX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUKFB5T2JqZWN0ICphcmdzLAotCQkJCSAgICBQeU9iamVjdCAqa2V5d29yZHMsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgCi0JCQkJICAgIGNoYXIgKiprd2xpc3QsIHZhX2xpc3QgdmEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqa3dsaXN0LCB2YV9saXN0IHZhKQogewotCWludCByZXR2YWw7Ci0JdmFfbGlzdCBsdmE7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IGx2YTsKIAotCWlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAotCSAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKLQkgICAgZm9ybWF0ID09IE5VTEwgfHwKLQkgICAga3dsaXN0ID09IE5VTEwpCi0JewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAorICAgICAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKKyAgICAgICAgZm9ybWF0ID09IE5VTEwgfHwKKyAgICAgICAga3dsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAjaWZkZWYgVkFfTElTVF9JU19BUlJBWQotCW1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOworICAgIG1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOwogI2Vsc2UKICNpZmRlZiBfX3ZhX2NvcHkKLQlfX3ZhX2NvcHkobHZhLCB2YSk7CisgICAgX192YV9jb3B5KGx2YSwgdmEpOwogI2Vsc2UKLQlsdmEgPSB2YTsKKyAgICBsdmEgPSB2YTsKICNlbmRpZgogI2VuZGlmCiAKLQlyZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsIAotCQkJCSAga3dsaXN0LCAmbHZhLCBGTEFHX1NJWkVfVCk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZsdmEsIEZMQUdfU0laRV9UKTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAjZGVmaW5lIElTX0VORF9PRl9GT1JNQVQoYykgKGMgPT0gJ1wwJyB8fCBjID09ICc7JyB8fCBjID09ICc6JykKIAogc3RhdGljIGludAogdmdldGFyZ3NrZXl3b3JkcyhQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmtleXdvcmRzLCBjb25zdCBjaGFyICpmb3JtYXQsCi0JICAgICAgICAgY2hhciAqKmt3bGlzdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzKQorICAgICAgICAgICAgICAgICBjaGFyICoqa3dsaXN0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZmxhZ3MpCiB7Ci0JY2hhciBtc2didWZbNTEyXTsKLQlpbnQgbGV2ZWxzWzMyXTsKLQljb25zdCBjaGFyICpmbmFtZSwgKm1zZywgKmN1c3RvbV9tc2csICprZXl3b3JkOwotCWludCBtaW4gPSBJTlRfTUFYOwotCWludCBpLCBsZW4sIG5hcmdzLCBua2V5d29yZHM7Ci0JUHlPYmplY3QgKmZyZWVsaXN0ID0gTlVMTCwgKmN1cnJlbnRfYXJnOworICAgIGNoYXIgbXNnYnVmWzUxMl07CisgICAgaW50IGxldmVsc1szMl07CisgICAgY29uc3QgY2hhciAqZm5hbWUsICptc2csICpjdXN0b21fbXNnLCAqa2V5d29yZDsKKyAgICBpbnQgbWluID0gSU5UX01BWDsKKyAgICBpbnQgaSwgbGVuLCBuYXJncywgbmtleXdvcmRzOworICAgIFB5T2JqZWN0ICpmcmVlbGlzdCA9IE5VTEwsICpjdXJyZW50X2FyZzsKIAotCWFzc2VydChhcmdzICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0JYXNzZXJ0KGtleXdvcmRzID09IE5VTEwgfHwgUHlEaWN0X0NoZWNrKGtleXdvcmRzKSk7Ci0JYXNzZXJ0KGZvcm1hdCAhPSBOVUxMKTsKLQlhc3NlcnQoa3dsaXN0ICE9IE5VTEwpOwotCWFzc2VydChwX3ZhICE9IE5VTEwpOworICAgIGFzc2VydChhcmdzICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgYXNzZXJ0KGtleXdvcmRzID09IE5VTEwgfHwgUHlEaWN0X0NoZWNrKGtleXdvcmRzKSk7CisgICAgYXNzZXJ0KGZvcm1hdCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoa3dsaXN0ICE9IE5VTEwpOworICAgIGFzc2VydChwX3ZhICE9IE5VTEwpOwogCi0JLyogZ3JhYiB0aGUgZnVuY3Rpb24gbmFtZSBvciBjdXN0b20gZXJyb3IgbXNnIGZpcnN0IChtdXR1YWxseSBleGNsdXNpdmUpICovCi0JZm5hbWUgPSBzdHJjaHIoZm9ybWF0LCAnOicpOwotCWlmIChmbmFtZSkgewotCQlmbmFtZSsrOwotCQljdXN0b21fbXNnID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCWN1c3RvbV9tc2cgPSBzdHJjaHIoZm9ybWF0LCc7Jyk7Ci0JCWlmIChjdXN0b21fbXNnKQotCQkJY3VzdG9tX21zZysrOwotCX0KKyAgICAvKiBncmFiIHRoZSBmdW5jdGlvbiBuYW1lIG9yIGN1c3RvbSBlcnJvciBtc2cgZmlyc3QgKG11dHVhbGx5IGV4Y2x1c2l2ZSkgKi8KKyAgICBmbmFtZSA9IHN0cmNocihmb3JtYXQsICc6Jyk7CisgICAgaWYgKGZuYW1lKSB7CisgICAgICAgIGZuYW1lKys7CisgICAgICAgIGN1c3RvbV9tc2cgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY3VzdG9tX21zZyA9IHN0cmNocihmb3JtYXQsJzsnKTsKKyAgICAgICAgaWYgKGN1c3RvbV9tc2cpCisgICAgICAgICAgICBjdXN0b21fbXNnKys7CisgICAgfQogCi0JLyogc2NhbiBrd2xpc3QgYW5kIGdldCBncmVhdGVzdCBwb3NzaWJsZSBuYnIgb2YgYXJncyAqLwotCWZvciAobGVuPTA7IGt3bGlzdFtsZW5dOyBsZW4rKykKLQkJY29udGludWU7CisgICAgLyogc2NhbiBrd2xpc3QgYW5kIGdldCBncmVhdGVzdCBwb3NzaWJsZSBuYnIgb2YgYXJncyAqLworICAgIGZvciAobGVuPTA7IGt3bGlzdFtsZW5dOyBsZW4rKykKKyAgICAgICAgY29udGludWU7CiAKLQluYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JbmtleXdvcmRzID0gKGtleXdvcmRzID09IE5VTEwpID8gMCA6IFB5RGljdF9TaXplKGtleXdvcmRzKTsKLQlpZiAobmFyZ3MgKyBua2V5d29yZHMgPiBsZW4pIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiVzJXMgdGFrZXMgYXQgbW9zdCAlZCAiCi0JCQkgICAgICJhcmd1bWVudCVzICglZCBnaXZlbikiLAotCQkJICAgICAoZm5hbWUgPT0gTlVMTCkgPyAiZnVuY3Rpb24iIDogZm5hbWUsCi0JCQkgICAgIChmbmFtZSA9PSBOVUxMKSA/ICIiIDogIigpIiwKLQkJCSAgICAgbGVuLAotCQkJICAgICAobGVuID09IDEpID8gIiIgOiAicyIsCi0JCQkgICAgIG5hcmdzICsgbmtleXdvcmRzKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIG5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBua2V5d29yZHMgPSAoa2V5d29yZHMgPT0gTlVMTCkgPyAwIDogUHlEaWN0X1NpemUoa2V5d29yZHMpOworICAgIGlmIChuYXJncyArIG5rZXl3b3JkcyA+IGxlbikgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMlcyB0YWtlcyBhdCBtb3N0ICVkICIKKyAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCVzICglZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgKGZuYW1lID09IE5VTEwpID8gImZ1bmN0aW9uIiA6IGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgKGZuYW1lID09IE5VTEwpID8gIiIgOiAiKCkiLAorICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgKGxlbiA9PSAxKSA/ICIiIDogInMiLAorICAgICAgICAgICAgICAgICAgICAgbmFyZ3MgKyBua2V5d29yZHMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBjb252ZXJ0IHR1cGxlIGFyZ3MgYW5kIGtleXdvcmQgYXJncyBpbiBzYW1lIGxvb3AsIHVzaW5nIGt3bGlzdCB0byBkcml2ZSBwcm9jZXNzICovCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWtleXdvcmQgPSBrd2xpc3RbaV07Ci0JCWlmICgqZm9ybWF0ID09ICd8JykgewotCQkJbWluID0gaTsKLQkJCWZvcm1hdCsrOwotCQl9Ci0JCWlmIChJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSAgICAgIk1vcmUga2V5d29yZCBsaXN0IGVudHJpZXMgKCVkKSB0aGFuICIKLQkJCQkgICAgICJmb3JtYXQgc3BlY2lmaWVycyAoJWQpIiwgbGVuLCBpKTsKLQkJCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JCX0KLQkJY3VycmVudF9hcmcgPSBOVUxMOwotCQlpZiAobmtleXdvcmRzKSB7Ci0JCQljdXJyZW50X2FyZyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGtleXdvcmRzLCBrZXl3b3JkKTsKLQkJfQotCQlpZiAoY3VycmVudF9hcmcpIHsKLQkJCS0tbmtleXdvcmRzOwotCQkJaWYgKGkgPCBuYXJncykgewotCQkJCS8qIGFyZyBwcmVzZW50IGluIHR1cGxlIGFuZCBpbiBkaWN0ICovCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICAgICAiQXJndW1lbnQgZ2l2ZW4gYnkgbmFtZSAoJyVzJykgIgotCQkJCQkgICAgICJhbmQgcG9zaXRpb24gKCVkKSIsCi0JCQkJCSAgICAga2V5d29yZCwgaSsxKTsKLQkJCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG5rZXl3b3JkcyAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKLQkJZWxzZSBpZiAoaSA8IG5hcmdzKQotCQkJY3VycmVudF9hcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQkJCi0JCWlmIChjdXJyZW50X2FyZykgewotCQkJbXNnID0gY29udmVydGl0ZW0oY3VycmVudF9hcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLAotCQkJCWxldmVscywgbXNnYnVmLCBzaXplb2YobXNnYnVmKSwgJmZyZWVsaXN0KTsKLQkJCWlmIChtc2cpIHsKLQkJCQlzZXRlcnJvcihpKzEsIG1zZywgbGV2ZWxzLCBmbmFtZSwgY3VzdG9tX21zZyk7Ci0JCQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9CisgICAgLyogY29udmVydCB0dXBsZSBhcmdzIGFuZCBrZXl3b3JkIGFyZ3MgaW4gc2FtZSBsb29wLCB1c2luZyBrd2xpc3QgdG8gZHJpdmUgcHJvY2VzcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBrZXl3b3JkID0ga3dsaXN0W2ldOworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnfCcpIHsKKyAgICAgICAgICAgIG1pbiA9IGk7CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTW9yZSBrZXl3b3JkIGxpc3QgZW50cmllcyAoJWQpIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgc3BlY2lmaWVycyAoJWQpIiwgbGVuLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudF9hcmcgPSBOVUxMOworICAgICAgICBpZiAobmtleXdvcmRzKSB7CisgICAgICAgICAgICBjdXJyZW50X2FyZyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGtleXdvcmRzLCBrZXl3b3JkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudF9hcmcpIHsKKyAgICAgICAgICAgIC0tbmtleXdvcmRzOworICAgICAgICAgICAgaWYgKGkgPCBuYXJncykgeworICAgICAgICAgICAgICAgIC8qIGFyZyBwcmVzZW50IGluIHR1cGxlIGFuZCBpbiBkaWN0ICovCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50IGdpdmVuIGJ5IG5hbWUgKCclcycpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBwb3NpdGlvbiAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5rZXl3b3JkcyAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgZWxzZSBpZiAoaSA8IG5hcmdzKQorICAgICAgICAgICAgY3VycmVudF9hcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwogCi0JCWlmIChpIDwgbWluKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiUmVxdWlyZWQgYXJndW1lbnQgIgotCQkJCSAgICAgIiclcycgKHBvcyAlZCkgbm90IGZvdW5kIiwKLQkJCQkgICAgIGtleXdvcmQsIGkrMSk7Ci0JCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQl9Ci0JCS8qIGN1cnJlbnQgY29kZSByZXBvcnRzIHN1Y2Nlc3Mgd2hlbiBhbGwgcmVxdWlyZWQgYXJncwotCQkgKiBmdWxmaWxsZWQgYW5kIG5vIGtleXdvcmQgYXJncyBsZWZ0LCB3aXRoIG5vIGZ1cnRoZXIKLQkJICogdmFsaWRhdGlvbi4gWFhYIE1heWJlIHNraXAgdGhpcyBpbiBkZWJ1ZyBidWlsZCA/Ci0JCSAqLwotCQlpZiAoIW5rZXl3b3JkcykKLQkJCXJldHVybiBjbGVhbnJldHVybigxLCBmcmVlbGlzdCk7CisgICAgICAgIGlmIChjdXJyZW50X2FyZykgeworICAgICAgICAgICAgbXNnID0gY29udmVydGl0ZW0oY3VycmVudF9hcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLAorICAgICAgICAgICAgICAgIGxldmVscywgbXNnYnVmLCBzaXplb2YobXNnYnVmKSwgJmZyZWVsaXN0KTsKKyAgICAgICAgICAgIGlmIChtc2cpIHsKKyAgICAgICAgICAgICAgICBzZXRlcnJvcihpKzEsIG1zZywgbGV2ZWxzLCBmbmFtZSwgY3VzdG9tX21zZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJLyogV2UgYXJlIGludG8gb3B0aW9uYWwgYXJncywgc2tpcCB0aHJ1IHRvIGFueSByZW1haW5pbmcKLQkJICoga2V5d29yZCBhcmdzICovCi0JCW1zZyA9IHNraXBpdGVtKCZmb3JtYXQsIHBfdmEsIGZsYWdzKTsKLQkJaWYgKG1zZykgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwgIiVzOiAnJXMnIiwgbXNnLAotCQkJCSAgICAgZm9ybWF0KTsKLQkJCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JCX0KLQl9CisgICAgICAgIGlmIChpIDwgbWluKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiUmVxdWlyZWQgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIChwb3MgJWQpIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgLyogY3VycmVudCBjb2RlIHJlcG9ydHMgc3VjY2VzcyB3aGVuIGFsbCByZXF1aXJlZCBhcmdzCisgICAgICAgICAqIGZ1bGZpbGxlZCBhbmQgbm8ga2V5d29yZCBhcmdzIGxlZnQsIHdpdGggbm8gZnVydGhlcgorICAgICAgICAgKiB2YWxpZGF0aW9uLiBYWFggTWF5YmUgc2tpcCB0aGlzIGluIGRlYnVnIGJ1aWxkID8KKyAgICAgICAgICovCisgICAgICAgIGlmICghbmtleXdvcmRzKQorICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKIAotCWlmICghSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSAmJiAqZm9ybWF0ICE9ICd8JykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJIm1vcmUgYXJndW1lbnQgc3BlY2lmaWVycyB0aGFuIGtleXdvcmQgbGlzdCBlbnRyaWVzICIKLQkJCSIocmVtYWluaW5nIGZvcm1hdDonJXMnKSIsIGZvcm1hdCk7Ci0JCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JfQorICAgICAgICAvKiBXZSBhcmUgaW50byBvcHRpb25hbCBhcmdzLCBza2lwIHRocnUgdG8gYW55IHJlbWFpbmluZworICAgICAgICAgKiBrZXl3b3JkIGFyZ3MgKi8KKyAgICAgICAgbXNnID0gc2tpcGl0ZW0oJmZvcm1hdCwgcF92YSwgZmxhZ3MpOworICAgICAgICBpZiAobXNnKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLCAiJXM6ICclcyciLCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGV4dHJhbmVvdXMga2V5d29yZCBhcmd1bWVudHMgKi8KLQlpZiAobmtleXdvcmRzID4gMCkgewotCQlQeU9iamVjdCAqa2V5LCAqdmFsdWU7Ci0JCVB5X3NzaXplX3QgcG9zID0gMDsKLQkJd2hpbGUgKFB5RGljdF9OZXh0KGtleXdvcmRzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCQlpbnQgbWF0Y2ggPSAwOwotCQkJY2hhciAqa3M7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKGtleSkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkJICAgICAgICAia2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzIik7Ci0JCQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKLQkJCX0KLQkJCWtzID0gUHlTdHJpbmdfQXNTdHJpbmcoa2V5KTsKLQkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmICghc3RyY21wKGtzLCBrd2xpc3RbaV0pKSB7Ci0JCQkJCW1hdGNoID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFtYXRjaCkgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSAgICAgIiclcycgaXMgYW4gaW52YWxpZCBrZXl3b3JkICIKLQkJCQkJICAgICAiYXJndW1lbnQgZm9yIHRoaXMgZnVuY3Rpb24iLAotCQkJCQkgICAgIGtzKTsKLQkJCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQkJfQotCQl9Ci0JfQorICAgIGlmICghSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSAmJiAqZm9ybWF0ICE9ICd8JykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgIm1vcmUgYXJndW1lbnQgc3BlY2lmaWVycyB0aGFuIGtleXdvcmQgbGlzdCBlbnRyaWVzICIKKyAgICAgICAgICAgICIocmVtYWluaW5nIGZvcm1hdDonJXMnKSIsIGZvcm1hdCk7CisgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgfQogCi0JcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKKyAgICAvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGV4dHJhbmVvdXMga2V5d29yZCBhcmd1bWVudHMgKi8KKyAgICBpZiAobmtleXdvcmRzID4gMCkgeworICAgICAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KGtleXdvcmRzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBpbnQgbWF0Y2ggPSAwOworICAgICAgICAgICAgY2hhciAqa3M7CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGtleSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtzID0gUHlTdHJpbmdfQXNTdHJpbmcoa2V5KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGtzLCBrd2xpc3RbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtYXRjaCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGlzIGFuIGludmFsaWQga2V5d29yZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBmb3IgdGhpcyBmdW5jdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKIH0KIAogCiBzdGF0aWMgY2hhciAqCiBza2lwaXRlbShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncykKIHsKLQljb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7Ci0JY2hhciBjID0gKmZvcm1hdCsrOwotCQotCXN3aXRjaCAoYykgeworICAgIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKKyAgICBjaGFyIGMgPSAqZm9ybWF0Kys7CiAKLQkvKiBzaW1wbGUgY29kZXMKLQkgKiBUaGUgaW5kaXZpZHVhbCB0eXBlcyAoc2Vjb25kIGFyZyBvZiB2YV9hcmcpIGFyZSBpcnJlbGV2YW50ICovCisgICAgc3dpdGNoIChjKSB7CiAKLQljYXNlICdiJzogLyogYnl0ZSAtLSB2ZXJ5IHNob3J0IGludCAqLwotCWNhc2UgJ0InOiAvKiBieXRlIGFzIGJpdGZpZWxkICovCi0JY2FzZSAnaCc6IC8qIHNob3J0IGludCAqLwotCWNhc2UgJ0gnOiAvKiBzaG9ydCBpbnQgYXMgYml0ZmllbGQgKi8KLQljYXNlICdpJzogLyogaW50ICovCi0JY2FzZSAnSSc6IC8qIGludCBzaXplZCBiaXRmaWVsZCAqLwotCWNhc2UgJ2wnOiAvKiBsb25nIGludCAqLwotCWNhc2UgJ2snOiAvKiBsb25nIGludCBzaXplZCBiaXRmaWVsZCAqLworICAgIC8qIHNpbXBsZSBjb2RlcworICAgICAqIFRoZSBpbmRpdmlkdWFsIHR5cGVzIChzZWNvbmQgYXJnIG9mIHZhX2FyZykgYXJlIGlycmVsZXZhbnQgKi8KKworICAgIGNhc2UgJ2InOiAvKiBieXRlIC0tIHZlcnkgc2hvcnQgaW50ICovCisgICAgY2FzZSAnQic6IC8qIGJ5dGUgYXMgYml0ZmllbGQgKi8KKyAgICBjYXNlICdoJzogLyogc2hvcnQgaW50ICovCisgICAgY2FzZSAnSCc6IC8qIHNob3J0IGludCBhcyBiaXRmaWVsZCAqLworICAgIGNhc2UgJ2knOiAvKiBpbnQgKi8KKyAgICBjYXNlICdJJzogLyogaW50IHNpemVkIGJpdGZpZWxkICovCisgICAgY2FzZSAnbCc6IC8qIGxvbmcgaW50ICovCisgICAgY2FzZSAnayc6IC8qIGxvbmcgaW50IHNpemVkIGJpdGZpZWxkICovCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQljYXNlICdMJzogLyogUFlfTE9OR19MT05HICovCi0JY2FzZSAnSyc6IC8qIFBZX0xPTkdfTE9ORyBzaXplZCBiaXRmaWVsZCAqLworICAgIGNhc2UgJ0wnOiAvKiBQWV9MT05HX0xPTkcgKi8KKyAgICBjYXNlICdLJzogLyogUFlfTE9OR19MT05HIHNpemVkIGJpdGZpZWxkICovCiAjZW5kaWYKLQljYXNlICdmJzogLyogZmxvYXQgKi8KLQljYXNlICdkJzogLyogZG91YmxlICovCisgICAgY2FzZSAnZic6IC8qIGZsb2F0ICovCisgICAgY2FzZSAnZCc6IC8qIGRvdWJsZSAqLwogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQljYXNlICdEJzogLyogY29tcGxleCBkb3VibGUgKi8KKyAgICBjYXNlICdEJzogLyogY29tcGxleCBkb3VibGUgKi8KICNlbmRpZgotCWNhc2UgJ2MnOiAvKiBjaGFyICovCi0JCXsKLQkJCSh2b2lkKSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7Ci0JCQlicmVhazsKLQkJfQorICAgIGNhc2UgJ2MnOiAvKiBjaGFyICovCisgICAgICAgIHsKKyAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JY2FzZSAnbic6IC8qIFB5X3NzaXplX3QgKi8KLQkJewotCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCAqKTsKLQkJCWJyZWFrOwotCQl9Ci0JCi0JLyogc3RyaW5nIGNvZGVzICovCi0JCQotCWNhc2UgJ2UnOiAvKiBzdHJpbmcgd2l0aCBlbmNvZGluZyAqLwotCQl7Ci0JCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOwotCQkJaWYgKCEoKmZvcm1hdCA9PSAncycgfHwgKmZvcm1hdCA9PSAndCcpKQotCQkJCS8qIGFmdGVyICdlJywgb25seSAncycgYW5kICd0JyBpcyBhbGxvd2VkICovCi0JCQkJZ290byBlcnI7Ci0JCQlmb3JtYXQrKzsKLQkJCS8qIGV4cGxpY2l0IGZhbGx0aHJvdWdoIHRvIHN0cmluZyBjYXNlcyAqLwotCQl9Ci0JCi0JY2FzZSAncyc6IC8qIHN0cmluZyAqLwotCWNhc2UgJ3onOiAvKiBzdHJpbmcgb3IgTm9uZSAqLworICAgIGNhc2UgJ24nOiAvKiBQeV9zc2l6ZV90ICovCisgICAgICAgIHsKKyAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QgKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgLyogc3RyaW5nIGNvZGVzICovCisKKyAgICBjYXNlICdlJzogLyogc3RyaW5nIHdpdGggZW5jb2RpbmcgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgY29uc3QgY2hhciAqKTsKKyAgICAgICAgICAgIGlmICghKCpmb3JtYXQgPT0gJ3MnIHx8ICpmb3JtYXQgPT0gJ3QnKSkKKyAgICAgICAgICAgICAgICAvKiBhZnRlciAnZScsIG9ubHkgJ3MnIGFuZCAndCcgaXMgYWxsb3dlZCAqLworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICAvKiBleHBsaWNpdCBmYWxsdGhyb3VnaCB0byBzdHJpbmcgY2FzZXMgKi8KKyAgICAgICAgfQorCisgICAgY2FzZSAncyc6IC8qIHN0cmluZyAqLworICAgIGNhc2UgJ3onOiAvKiBzdHJpbmcgb3IgTm9uZSAqLwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQljYXNlICd1JzogLyogdW5pY29kZSBzdHJpbmcgKi8KKyAgICBjYXNlICd1JzogLyogdW5pY29kZSBzdHJpbmcgKi8KICNlbmRpZgotCWNhc2UgJ3QnOiAvKiBidWZmZXIsIHJlYWQtb25seSAqLwotCWNhc2UgJ3cnOiAvKiBidWZmZXIsIHJlYWQtd3JpdGUgKi8KLQkJewotCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgY2hhciAqKik7Ci0JCQlpZiAoKmZvcm1hdCA9PSAnIycpIHsKLQkJCQlpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfVCkKLQkJCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCAqKTsKLQkJCQllbHNlCi0JCQkJCSh2b2lkKSB2YV9hcmcoKnBfdmEsIGludCAqKTsKLQkJCQlmb3JtYXQrKzsKLQkJCX0gZWxzZSBpZiAoKGMgPT0gJ3MnIHx8IGMgPT0gJ3onKSAmJiAqZm9ybWF0ID09ICcqJykgewotCQkJCWZvcm1hdCsrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KKyAgICBjYXNlICd0JzogLyogYnVmZmVyLCByZWFkLW9ubHkgKi8KKyAgICBjYXNlICd3JzogLyogYnVmZmVyLCByZWFkLXdyaXRlICovCisgICAgICAgIHsKKyAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOworICAgICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QgKik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBpbnQgKik7CisgICAgICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChjID09ICdzJyB8fCBjID09ICd6JykgJiYgKmZvcm1hdCA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkvKiBvYmplY3QgY29kZXMgKi8KKyAgICAvKiBvYmplY3QgY29kZXMgKi8KIAotCWNhc2UgJ1MnOiAvKiBzdHJpbmcgb2JqZWN0ICovCisgICAgY2FzZSAnUyc6IC8qIHN0cmluZyBvYmplY3QgKi8KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JY2FzZSAnVSc6IC8qIHVuaWNvZGUgc3RyaW5nIG9iamVjdCAqLworICAgIGNhc2UgJ1UnOiAvKiB1bmljb2RlIHN0cmluZyBvYmplY3QgKi8KICNlbmRpZgotCQl7Ci0JCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7Ci0JCQlicmVhazsKLQkJfQotCQotCWNhc2UgJ08nOiAvKiBvYmplY3QgKi8KLQkJewotCQkJaWYgKCpmb3JtYXQgPT0gJyEnKSB7Ci0JCQkJZm9ybWF0Kys7Ci0JCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgUHlUeXBlT2JqZWN0Kik7Ci0JCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQkJfQotCQkJZWxzZSBpZiAoKmZvcm1hdCA9PSAnJicpIHsKLQkJCQl0eXBlZGVmIGludCAoKmNvbnZlcnRlcikoUHlPYmplY3QgKiwgdm9pZCAqKTsKLQkJCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCBjb252ZXJ0ZXIpOwotCQkJCSh2b2lkKSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7Ci0JCQkJZm9ybWF0Kys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQorICAgICAgICB7CisgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JY2FzZSAnKCc6CS8qIGJ5cGFzcyB0dXBsZSwgbm90IGhhbmRsZWQgYXQgYWxsIHByZXZpb3VzbHkgKi8KLQkJewotCQkJY2hhciAqbXNnOwotCQkJZm9yICg7OykgewotCQkJCWlmICgqZm9ybWF0PT0nKScpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpKQotCQkJCQlyZXR1cm4gIlVubWF0Y2hlZCBsZWZ0IHBhcmVuIGluIGZvcm1hdCAiCi0JCQkJCSAgICAgICAic3RyaW5nIjsKLQkJCQltc2cgPSBza2lwaXRlbSgmZm9ybWF0LCBwX3ZhLCBmbGFncyk7Ci0JCQkJaWYgKG1zZykKLQkJCQkJcmV0dXJuIG1zZzsKLQkJCX0KLQkJCWZvcm1hdCsrOwotCQkJYnJlYWs7Ci0JCX0KKyAgICBjYXNlICdPJzogLyogb2JqZWN0ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqZm9ybWF0ID09ICchJykgeworICAgICAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5VHlwZU9iamVjdCopOworICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpmb3JtYXQgPT0gJyYnKSB7CisgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpjb252ZXJ0ZXIpKFB5T2JqZWN0ICosIHZvaWQgKik7CisgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgY29udmVydGVyKTsKKyAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCB2b2lkICopOworICAgICAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCWNhc2UgJyknOgotCQlyZXR1cm4gIlVubWF0Y2hlZCByaWdodCBwYXJlbiBpbiBmb3JtYXQgc3RyaW5nIjsKKyAgICBjYXNlICcoJzogICAgICAgICAgIC8qIGJ5cGFzcyB0dXBsZSwgbm90IGhhbmRsZWQgYXQgYWxsIHByZXZpb3VzbHkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqbXNnOworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIGlmICgqZm9ybWF0PT0nKScpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVubWF0Y2hlZCBsZWZ0IHBhcmVuIGluIGZvcm1hdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIjsKKyAgICAgICAgICAgICAgICBtc2cgPSBza2lwaXRlbSgmZm9ybWF0LCBwX3ZhLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKG1zZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCWRlZmF1bHQ6CisgICAgY2FzZSAnKSc6CisgICAgICAgIHJldHVybiAiVW5tYXRjaGVkIHJpZ2h0IHBhcmVuIGluIGZvcm1hdCBzdHJpbmciOworCisgICAgZGVmYXVsdDoKIGVycjoKLQkJcmV0dXJuICJpbXBvc3NpYmxlPGJhZCBmb3JtYXQgY2hhcj4iOwotCQotCX0KKyAgICAgICAgcmV0dXJuICJpbXBvc3NpYmxlPGJhZCBmb3JtYXQgY2hhcj4iOwogCi0JKnBfZm9ybWF0ID0gZm9ybWF0OwotCXJldHVybiBOVUxMOworICAgIH0KKworICAgICpwX2Zvcm1hdCA9IGZvcm1hdDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCiBpbnQKIFB5QXJnX1VucGFja1R1cGxlKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpuYW1lLCBQeV9zc2l6ZV90IG1pbiwgUHlfc3NpemVfdCBtYXgsIC4uLikKIHsKLQlQeV9zc2l6ZV90IGksIGw7Ci0JUHlPYmplY3QgKipvOwotCXZhX2xpc3QgdmFyZ3M7CisgICAgUHlfc3NpemVfdCBpLCBsOworICAgIFB5T2JqZWN0ICoqbzsKKyAgICB2YV9saXN0IHZhcmdzOwogCiAjaWZkZWYgSEFWRV9TVERBUkdfUFJPVE9UWVBFUwotCXZhX3N0YXJ0KHZhcmdzLCBtYXgpOworICAgIHZhX3N0YXJ0KHZhcmdzLCBtYXgpOwogI2Vsc2UKLQl2YV9zdGFydCh2YXJncyk7CisgICAgdmFfc3RhcnQodmFyZ3MpOwogI2VuZGlmCiAKLQlhc3NlcnQobWluID49IDApOwotCWFzc2VydChtaW4gPD0gbWF4KTsKLQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkgICAgIlB5QXJnX1VucGFja1R1cGxlKCkgYXJndW1lbnQgbGlzdCBpcyBub3QgYSB0dXBsZSIpOwotCQlyZXR1cm4gMDsKLQl9CQotCWwgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCWlmIChsIDwgbWluKSB7Ci0JCWlmIChuYW1lICE9IE5VTEwpCi0JCQlQeUVycl9Gb3JtYXQoCi0JCQkgICAgUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICIlcyBleHBlY3RlZCAlcyV6ZCBhcmd1bWVudHMsIGdvdCAlemQiLCAKLQkJCSAgICBuYW1lLCAobWluID09IG1heCA/ICIiIDogImF0IGxlYXN0ICIpLCBtaW4sIGwpOwotCQllbHNlCi0JCQlQeUVycl9Gb3JtYXQoCi0JCQkgICAgUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICJ1bnBhY2tlZCB0dXBsZSBzaG91bGQgaGF2ZSAlcyV6ZCBlbGVtZW50cywiCi0JCQkgICAgIiBidXQgaGFzICV6ZCIsIAotCQkJICAgIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbGVhc3QgIiksIG1pbiwgbCk7Ci0JCXZhX2VuZCh2YXJncyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAobCA+IG1heCkgewotCQlpZiAobmFtZSAhPSBOVUxMKQotCQkJUHlFcnJfRm9ybWF0KAotCQkJICAgIFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAiJXMgZXhwZWN0ZWQgJXMlemQgYXJndW1lbnRzLCBnb3QgJXpkIiwgCi0JCQkgICAgbmFtZSwgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBtb3N0ICIpLCBtYXgsIGwpOwotCQllbHNlCi0JCQlQeUVycl9Gb3JtYXQoCi0JCQkgICAgUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICJ1bnBhY2tlZCB0dXBsZSBzaG91bGQgaGF2ZSAlcyV6ZCBlbGVtZW50cywiCi0JCQkgICAgIiBidXQgaGFzICV6ZCIsIAotCQkJICAgIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbW9zdCAiKSwgbWF4LCBsKTsKLQkJdmFfZW5kKHZhcmdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKLQkJbyA9IHZhX2FyZyh2YXJncywgUHlPYmplY3QgKiopOwotCQkqbyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JfQotCXZhX2VuZCh2YXJncyk7Ci0JcmV0dXJuIDE7CisgICAgYXNzZXJ0KG1pbiA+PSAwKTsKKyAgICBhc3NlcnQobWluIDw9IG1heCk7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJQeUFyZ19VbnBhY2tUdXBsZSgpIGFyZ3VtZW50IGxpc3QgaXMgbm90IGEgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGwgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIGlmIChsIDwgbWluKSB7CisgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICIlcyBleHBlY3RlZCAlcyV6ZCBhcmd1bWVudHMsIGdvdCAlemQiLAorICAgICAgICAgICAgICAgIG5hbWUsIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbGVhc3QgIiksIG1pbiwgbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgInVucGFja2VkIHR1cGxlIHNob3VsZCBoYXZlICVzJXpkIGVsZW1lbnRzLCIKKyAgICAgICAgICAgICAgICAiIGJ1dCBoYXMgJXpkIiwKKyAgICAgICAgICAgICAgICAobWluID09IG1heCA/ICIiIDogImF0IGxlYXN0ICIpLCBtaW4sIGwpOworICAgICAgICB2YV9lbmQodmFyZ3MpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGwgPiBtYXgpIHsKKyAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIiVzIGV4cGVjdGVkICVzJXpkIGFyZ3VtZW50cywgZ290ICV6ZCIsCisgICAgICAgICAgICAgICAgbmFtZSwgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBtb3N0ICIpLCBtYXgsIGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJ1bnBhY2tlZCB0dXBsZSBzaG91bGQgaGF2ZSAlcyV6ZCBlbGVtZW50cywiCisgICAgICAgICAgICAgICAgIiBidXQgaGFzICV6ZCIsCisgICAgICAgICAgICAgICAgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBtb3N0ICIpLCBtYXgsIGwpOworICAgICAgICB2YV9lbmQodmFyZ3MpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworICAgICAgICBvID0gdmFfYXJnKHZhcmdzLCBQeU9iamVjdCAqKik7CisgICAgICAgICpvID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICB9CisgICAgdmFfZW5kKHZhcmdzKTsKKyAgICByZXR1cm4gMTsKIH0KIAogCiAvKiBGb3IgdHlwZSBjb25zdHJ1Y3RvcnMgdGhhdCBkb24ndCB0YWtlIGtleXdvcmQgYXJncwogICoKLSAqIFNldHMgYSBUeXBlRXJyb3IgYW5kIHJldHVybnMgMCBpZiB0aGUga3dkcyBkaWN0IGlzIAorICogU2V0cyBhIFR5cGVFcnJvciBhbmQgcmV0dXJucyAwIGlmIHRoZSBrd2RzIGRpY3QgaXMKICAqIG5vdCBlbXB0eSwgcmV0dXJucyAxIG90aGVyd2lzZQogICovCiBpbnQKIF9QeUFyZ19Ob0tleXdvcmRzKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBQeU9iamVjdCAqa3cpCiB7Ci0JaWYgKGt3ID09IE5VTEwpCi0JCXJldHVybiAxOwotCWlmICghUHlEaWN0X0NoZWNrRXhhY3Qoa3cpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5RGljdF9TaXplKGt3KSA9PSAwKQotCQlyZXR1cm4gMTsKLQkKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMgZG9lcyBub3QgdGFrZSBrZXl3b3JkIGFyZ3VtZW50cyIsIAotCQkJZnVuY25hbWUpOwotCXJldHVybiAwOworICAgIGlmIChrdyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoIVB5RGljdF9DaGVja0V4YWN0KGt3KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChQeURpY3RfU2l6ZShrdykgPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMgZG9lcyBub3QgdGFrZSBrZXl3b3JkIGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lKTsKKyAgICByZXR1cm4gMDsKIH0KICNpZmRlZiBfX2NwbHVzcGx1cwogfTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9nZXRjd2QuYyBiL1B5dGhvbi9nZXRjd2QuYwppbmRleCAzNmZjZDVjLi40NGRjOWU2IDEwMDY0NAotLS0gYS9QeXRob24vZ2V0Y3dkLmMKKysrIGIvUHl0aG9uL2dldGN3ZC5jCkBAIC0yNiwyNCArMjYsMjQgQEAKIGNoYXIgKgogZ2V0Y3dkKGNoYXIgKmJ1ZiwgaW50IHNpemUpCiB7Ci0JY2hhciBsb2NhbGJ1ZltNQVhQQVRITEVOKzFdOwotCWNoYXIgKnJldDsKKyAgICBjaGFyIGxvY2FsYnVmW01BWFBBVEhMRU4rMV07CisgICAgY2hhciAqcmV0OwogCi0JaWYgKHNpemUgPD0gMCkgewotCQllcnJubyA9IEVJTlZBTDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldCA9IGdldHdkKGxvY2FsYnVmKTsKLQlpZiAocmV0ICE9IE5VTEwgJiYgc3RybGVuKGxvY2FsYnVmKSA+PSAoc2l6ZV90KXNpemUpIHsKLQkJZXJybm8gPSBFUkFOR0U7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocmV0ID09IE5VTEwpIHsKLQkJZXJybm8gPSBFQUNDRVM7IC8qIE1vc3QgbGlrZWx5IGVycm9yICovCi0JCXJldHVybiBOVUxMOwotCX0KLQlzdHJuY3B5KGJ1ZiwgbG9jYWxidWYsIHNpemUpOwotCXJldHVybiBidWY7CisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldCA9IGdldHdkKGxvY2FsYnVmKTsKKyAgICBpZiAocmV0ICE9IE5VTEwgJiYgc3RybGVuKGxvY2FsYnVmKSA+PSAoc2l6ZV90KXNpemUpIHsKKyAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICAgICAgZXJybm8gPSBFQUNDRVM7IC8qIE1vc3QgbGlrZWx5IGVycm9yICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJuY3B5KGJ1ZiwgbG9jYWxidWYsIHNpemUpOworICAgIHJldHVybiBidWY7CiB9CiAKICNlbHNlIC8qICFIQVZFX0dFVFdEICovCkBAIC01NywyNiArNTcsMjYgQEAKIGNoYXIgKgogZ2V0Y3dkKGNoYXIgKmJ1ZiwgaW50IHNpemUpCiB7Ci0JRklMRSAqZnA7Ci0JY2hhciAqcDsKLQlpZiAoc2l6ZSA8PSAwKSB7Ci0JCWVycm5vID0gRUlOVkFMOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKChmcCA9IHBvcGVuKFBXRF9DTUQsICJyIikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChmZ2V0cyhidWYsIHNpemUsIGZwKSA9PSBOVUxMIHx8IHBjbG9zZShmcCkgIT0gMCkgewotCQllcnJubyA9IEVBQ0NFUzsgLyogTW9zdCBsaWtlbHkgZXJyb3IgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAocCA9IGJ1ZjsgKnAgIT0gJ1xuJzsgcCsrKSB7Ci0JCWlmICgqcCA9PSAnXDAnKSB7Ci0JCQllcnJubyA9IEVSQU5HRTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCSpwID0gJ1wwJzsKLQlyZXR1cm4gYnVmOworICAgIEZJTEUgKmZwOworICAgIGNoYXIgKnA7CisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgoZnAgPSBwb3BlbihQV0RfQ01ELCAiciIpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZmdldHMoYnVmLCBzaXplLCBmcCkgPT0gTlVMTCB8fCBwY2xvc2UoZnApICE9IDApIHsKKyAgICAgICAgZXJybm8gPSBFQUNDRVM7IC8qIE1vc3QgbGlrZWx5IGVycm9yICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKHAgPSBidWY7ICpwICE9ICdcbic7IHArKykgeworICAgICAgICBpZiAoKnAgPT0gJ1wwJykgeworICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICAqcCA9ICdcMCc7CisgICAgcmV0dXJuIGJ1ZjsKIH0KIAogI2VuZGlmIC8qICFIQVZFX0dFVFdEICovCmRpZmYgLS1naXQgYS9QeXRob24vZ2V0b3B0LmMgYi9QeXRob24vZ2V0b3B0LmMKaW5kZXggMjQ3NjAwYi4uMDkzYzNkYSAxMDA2NDQKLS0tIGEvUHl0aG9uL2dldG9wdC5jCisrKyBiL1B5dGhvbi9nZXRvcHQuYwpAQCAtNyw4ICs3LDggQEAKICAqCiAgKiAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAogICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKICAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYW5kCiAgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgbm90aWNlIGFwcGVhciB1bm1vZGlmaWVkIGluIGFsbCBjb3BpZXMuCiAgKgpAQCAtNDAsODQgKzQwLDg0IEBACiAKIGludCBfUHlPU19HZXRPcHQoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICpvcHRzdHJpbmcpCiB7Ci0Jc3RhdGljIGNoYXIgKm9wdF9wdHIgPSAiIjsKLQljaGFyICpwdHI7Ci0JaW50IG9wdGlvbjsKKyAgICBzdGF0aWMgY2hhciAqb3B0X3B0ciA9ICIiOworICAgIGNoYXIgKnB0cjsKKyAgICBpbnQgb3B0aW9uOwogCi0JaWYgKCpvcHRfcHRyID09ICdcMCcpIHsKKyAgICBpZiAoKm9wdF9wdHIgPT0gJ1wwJykgewogCi0JCWlmIChfUHlPU19vcHRpbmQgPj0gYXJnYykKLQkJCXJldHVybiAtMTsKKyAgICAgICAgaWYgKF9QeU9TX29wdGluZCA+PSBhcmdjKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogI2lmZGVmIE1TX1dJTkRPV1MKLQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi8/IikgPT0gMCkgewotCQkJKytfUHlPU19vcHRpbmQ7Ci0JCQlyZXR1cm4gJ2gnOwotCQl9CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICIvPyIpID09IDApIHsKKyAgICAgICAgICAgICsrX1B5T1Nfb3B0aW5kOworICAgICAgICAgICAgcmV0dXJuICdoJzsKKyAgICAgICAgfQogI2VuZGlmCiAKLQkJZWxzZSBpZiAoYXJndltfUHlPU19vcHRpbmRdWzBdICE9ICctJyB8fAotCQkgICAgICAgICBhcmd2W19QeU9TX29wdGluZF1bMV0gPT0gJ1wwJyAvKiBsb25lIGRhc2ggKi8gKQotCQkJcmV0dXJuIC0xOworICAgICAgICBlbHNlIGlmIChhcmd2W19QeU9TX29wdGluZF1bMF0gIT0gJy0nIHx8CisgICAgICAgICAgICAgICAgIGFyZ3ZbX1B5T1Nfb3B0aW5kXVsxXSA9PSAnXDAnIC8qIGxvbmUgZGFzaCAqLyApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi0tIikgPT0gMCkgewotCQkJKytfUHlPU19vcHRpbmQ7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi0tIikgPT0gMCkgeworICAgICAgICAgICAgKytfUHlPU19vcHRpbmQ7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQllbHNlIGlmIChzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLS1oZWxwIikgPT0gMCkgewotCQkJKytfUHlPU19vcHRpbmQ7Ci0JCQlyZXR1cm4gJ2gnOwotCQl9CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICItLWhlbHAiKSA9PSAwKSB7CisgICAgICAgICAgICArK19QeU9TX29wdGluZDsKKyAgICAgICAgICAgIHJldHVybiAnaCc7CisgICAgICAgIH0KIAotCQllbHNlIGlmIChzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLS12ZXJzaW9uIikgPT0gMCkgewotCQkJKytfUHlPU19vcHRpbmQ7Ci0JCQlyZXR1cm4gJ1YnOwotCQl9CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICItLXZlcnNpb24iKSA9PSAwKSB7CisgICAgICAgICAgICArK19QeU9TX29wdGluZDsKKyAgICAgICAgICAgIHJldHVybiAnVic7CisgICAgICAgIH0KIAogCi0JCW9wdF9wdHIgPSAmYXJndltfUHlPU19vcHRpbmQrK11bMV07IAotCX0KKyAgICAgICAgb3B0X3B0ciA9ICZhcmd2W19QeU9TX29wdGluZCsrXVsxXTsKKyAgICB9CiAKLQlpZiAoIChvcHRpb24gPSAqb3B0X3B0cisrKSA9PSAnXDAnKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCAob3B0aW9uID0gKm9wdF9wdHIrKykgPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKG9wdGlvbiA9PSAnSicpIHsKLQkJZnByaW50ZihzdGRlcnIsICItSiBpcyByZXNlcnZlZCBmb3IgSnl0aG9uXG4iKTsKLQkJcmV0dXJuICdfJzsKLQl9CisgICAgaWYgKG9wdGlvbiA9PSAnSicpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICItSiBpcyByZXNlcnZlZCBmb3IgSnl0aG9uXG4iKTsKKyAgICAgICAgcmV0dXJuICdfJzsKKyAgICB9CiAKLQlpZiAob3B0aW9uID09ICdYJykgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJICAiLVggaXMgcmVzZXJ2ZWQgZm9yIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGFyZ3VtZW50c1xuIik7Ci0JCXJldHVybiAnXyc7Ci0JfQorICAgIGlmIChvcHRpb24gPT0gJ1gnKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICItWCBpcyByZXNlcnZlZCBmb3IgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuICdfJzsKKyAgICB9CiAKLQlpZiAoKHB0ciA9IHN0cmNocihvcHRzdHJpbmcsIG9wdGlvbikpID09IE5VTEwpIHsKLQkJaWYgKF9QeU9TX29wdGVycikKLQkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb246IC0lY1xuIiwgb3B0aW9uKTsKKyAgICBpZiAoKHB0ciA9IHN0cmNocihvcHRzdHJpbmcsIG9wdGlvbikpID09IE5VTEwpIHsKKyAgICAgICAgaWYgKF9QeU9TX29wdGVycikKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb246IC0lY1xuIiwgb3B0aW9uKTsKIAotCQlyZXR1cm4gJ18nOwotCX0KKyAgICAgICAgcmV0dXJuICdfJzsKKyAgICB9CiAKLQlpZiAoKihwdHIgKyAxKSA9PSAnOicpIHsKLQkJaWYgKCpvcHRfcHRyICE9ICdcMCcpIHsKLQkJCV9QeU9TX29wdGFyZyAgPSBvcHRfcHRyOwotCQkJb3B0X3B0ciA9ICIiOwotCQl9CisgICAgaWYgKCoocHRyICsgMSkgPT0gJzonKSB7CisgICAgICAgIGlmICgqb3B0X3B0ciAhPSAnXDAnKSB7CisgICAgICAgICAgICBfUHlPU19vcHRhcmcgID0gb3B0X3B0cjsKKyAgICAgICAgICAgIG9wdF9wdHIgPSAiIjsKKyAgICAgICAgfQogCi0JCWVsc2UgewotCQkJaWYgKF9QeU9TX29wdGluZCA+PSBhcmdjKSB7Ci0JCQkJaWYgKF9QeU9TX29wdGVycikKLQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkgICAgIkFyZ3VtZW50IGV4cGVjdGVkIGZvciB0aGUgLSVjIG9wdGlvblxuIiwgb3B0aW9uKTsKLQkJCQlyZXR1cm4gJ18nOwotCQkJfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChfUHlPU19vcHRpbmQgPj0gYXJnYykgeworICAgICAgICAgICAgICAgIGlmIChfUHlPU19vcHRlcnIpCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJBcmd1bWVudCBleHBlY3RlZCBmb3IgdGhlIC0lYyBvcHRpb25cbiIsIG9wdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuICdfJzsKKyAgICAgICAgICAgIH0KIAotCQkJX1B5T1Nfb3B0YXJnID0gYXJndltfUHlPU19vcHRpbmQrK107Ci0JCX0KLQl9CisgICAgICAgICAgICBfUHlPU19vcHRhcmcgPSBhcmd2W19QeU9TX29wdGluZCsrXTsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBvcHRpb247CisgICAgcmV0dXJuIG9wdGlvbjsKIH0KIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9QeXRob24vaW1wb3J0LmMgYi9QeXRob24vaW1wb3J0LmMKaW5kZXggYTVlMjNlOC4uN2FiZTY3OSAxMDA2NDQKLS0tIGEvUHl0aG9uL2ltcG9ydC5jCisrKyBiL1B5dGhvbi9pbXBvcnQuYwpAQCAtNjcsMTMgKzY3LDEzIEBACiAgICAgICAgUHl0aG9uIDIuNWIzOiA2MjEwMSAoZml4IHdyb25nIGNvZGU6IGZvciB4LCBpbiAuLi4pCiAgICAgICAgUHl0aG9uIDIuNWIzOiA2MjExMSAoZml4IHdyb25nIGNvZGU6IHggKz0geWllbGQpCiAgICAgICAgUHl0aG9uIDIuNWMxOiA2MjEyMSAoZml4IHdyb25nIGxub3RhYiB3aXRoIGZvciBsb29wcyBhbmQKLSAgICAgICAJCQkgICAgc3RvcmluZyBjb25zdGFudHMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmluZyBjb25zdGFudHMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQpCiAgICAgICAgUHl0aG9uIDIuNWMyOiA2MjEzMSAoZml4IHdyb25nIGNvZGU6IGZvciB4LCBpbiAuLi4gaW4gbGlzdGNvbXAvZ2VuZXhwKQogICAgICAgIFB5dGhvbiAyLjZhMDogNjIxNTEgKHBlZXBob2xlIG9wdGltaXphdGlvbnMgYW5kIFNUT1JFX01BUCBvcGNvZGUpCiAgICAgICAgUHl0aG9uIDIuNmExOiA2MjE2MSAoV0lUSF9DTEVBTlVQIG9wdGltaXphdGlvbikKICAgICAgICBQeXRob24gMi43YTA6IDYyMTcxIChvcHRpbWl6ZSBsaXN0IGNvbXByZWhlbnNpb25zL2NoYW5nZSBMSVNUX0FQUEVORCkKICAgICAgICBQeXRob24gMi43YTA6IDYyMTgxIChvcHRpbWl6ZSBjb25kaXRpb25hbCBicmFuY2hlczoKLQkJCSAgICBpbnRyb2R1Y2UgUE9QX0pVTVBfSUZfRkFMU0UgYW5kIFBPUF9KVU1QX0lGX1RSVUUpCisgICAgICAgICAgICAgICAgaW50cm9kdWNlIFBPUF9KVU1QX0lGX0ZBTFNFIGFuZCBQT1BfSlVNUF9JRl9UUlVFKQogICAgICAgIFB5dGhvbiAyLjdhMCAgNjIxOTEgKGludHJvZHVjZSBTRVRVUF9XSVRIKQogICAgICAgIFB5dGhvbiAyLjdhMCAgNjIyMDEgKGludHJvZHVjZSBCVUlMRF9TRVQpCiAgICAgICAgUHl0aG9uIDIuN2EwICA2MjIxMSAoaW50cm9kdWNlIE1BUF9BREQgYW5kIFNFVF9BREQpCkBAIC05OSwxOCArOTksMTggQEAKIAogI2lmZGVmIFJJU0NPUwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X1N0YW5kYXJkRmlsZXRhYltdID0gewotCXsiL3B5IiwgIlUiLCBQWV9TT1VSQ0V9LAotCXsiL3B5YyIsICJyYiIsIFBZX0NPTVBJTEVEfSwKLQl7MCwgMH0KKyAgICB7Ii9weSIsICJVIiwgUFlfU09VUkNFfSwKKyAgICB7Ii9weWMiLCAicmIiLCBQWV9DT01QSUxFRH0sCisgICAgezAsIDB9CiB9OwogI2Vsc2UKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWJbXSA9IHsKLQl7Ii5weSIsICJVIiwgUFlfU09VUkNFfSwKKyAgICB7Ii5weSIsICJVIiwgUFlfU09VUkNFfSwKICNpZmRlZiBNU19XSU5ET1dTCi0JeyIucHl3IiwgIlUiLCBQWV9TT1VSQ0V9LAorICAgIHsiLnB5dyIsICJVIiwgUFlfU09VUkNFfSwKICNlbmRpZgotCXsiLnB5YyIsICJyYiIsIFBZX0NPTVBJTEVEfSwKLQl7MCwgMH0KKyAgICB7Ii5weWMiLCAicmIiLCBQWV9DT01QSUxFRH0sCisgICAgezAsIDB9CiB9OwogI2VuZGlmCiAKQEAgLTEyMCwxMzEgKzEyMCwxMzEgQEAKIHZvaWQKIF9QeUltcG9ydF9Jbml0KHZvaWQpCiB7Ci0JY29uc3Qgc3RydWN0IGZpbGVkZXNjciAqc2NhbjsKLQlzdHJ1Y3QgZmlsZWRlc2NyICpmaWxldGFiOwotCWludCBjb3VudEQgPSAwOwotCWludCBjb3VudFMgPSAwOworICAgIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgKnNjYW47CisgICAgc3RydWN0IGZpbGVkZXNjciAqZmlsZXRhYjsKKyAgICBpbnQgY291bnREID0gMDsKKyAgICBpbnQgY291bnRTID0gMDsKIAotCS8qIHByZXBhcmUgX1B5SW1wb3J0X0ZpbGV0YWI6IGNvcHkgZW50cmllcyBmcm9tCi0JICAgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiIGFuZCBfUHlJbXBvcnRfU3RhbmRhcmRGaWxldGFiLgotCSAqLworICAgIC8qIHByZXBhcmUgX1B5SW1wb3J0X0ZpbGV0YWI6IGNvcHkgZW50cmllcyBmcm9tCisgICAgICAgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiIGFuZCBfUHlJbXBvcnRfU3RhbmRhcmRGaWxldGFiLgorICAgICAqLwogI2lmZGVmIEhBVkVfRFlOQU1JQ19MT0FESU5HCi0JZm9yIChzY2FuID0gX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiOyBzY2FuLT5zdWZmaXggIT0gTlVMTDsgKytzY2FuKQotCQkrK2NvdW50RDsKKyAgICBmb3IgKHNjYW4gPSBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWI7IHNjYW4tPnN1ZmZpeCAhPSBOVUxMOyArK3NjYW4pCisgICAgICAgICsrY291bnREOwogI2VuZGlmCi0JZm9yIChzY2FuID0gX1B5SW1wb3J0X1N0YW5kYXJkRmlsZXRhYjsgc2Nhbi0+c3VmZml4ICE9IE5VTEw7ICsrc2NhbikKLQkJKytjb3VudFM7Ci0JZmlsZXRhYiA9IFB5TWVtX05FVyhzdHJ1Y3QgZmlsZWRlc2NyLCBjb3VudEQgKyBjb3VudFMgKyAxKTsKLQlpZiAoZmlsZXRhYiA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGltcG9ydCBmaWxlIHRhYmxlLiIpOworICAgIGZvciAoc2NhbiA9IF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWI7IHNjYW4tPnN1ZmZpeCAhPSBOVUxMOyArK3NjYW4pCisgICAgICAgICsrY291bnRTOworICAgIGZpbGV0YWIgPSBQeU1lbV9ORVcoc3RydWN0IGZpbGVkZXNjciwgY291bnREICsgY291bnRTICsgMSk7CisgICAgaWYgKGZpbGV0YWIgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBpbXBvcnQgZmlsZSB0YWJsZS4iKTsKICNpZmRlZiBIQVZFX0RZTkFNSUNfTE9BRElORwotCW1lbWNweShmaWxldGFiLCBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWIsCi0JICAgICAgIGNvdW50RCAqIHNpemVvZihzdHJ1Y3QgZmlsZWRlc2NyKSk7CisgICAgbWVtY3B5KGZpbGV0YWIsIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYiwKKyAgICAgICAgICAgY291bnREICogc2l6ZW9mKHN0cnVjdCBmaWxlZGVzY3IpKTsKICNlbmRpZgotCW1lbWNweShmaWxldGFiICsgY291bnRELCBfUHlJbXBvcnRfU3RhbmRhcmRGaWxldGFiLAotCSAgICAgICBjb3VudFMgKiBzaXplb2Yoc3RydWN0IGZpbGVkZXNjcikpOwotCWZpbGV0YWJbY291bnREICsgY291bnRTXS5zdWZmaXggPSBOVUxMOworICAgIG1lbWNweShmaWxldGFiICsgY291bnRELCBfUHlJbXBvcnRfU3RhbmRhcmRGaWxldGFiLAorICAgICAgICAgICBjb3VudFMgKiBzaXplb2Yoc3RydWN0IGZpbGVkZXNjcikpOworICAgIGZpbGV0YWJbY291bnREICsgY291bnRTXS5zdWZmaXggPSBOVUxMOwogCi0JX1B5SW1wb3J0X0ZpbGV0YWIgPSBmaWxldGFiOworICAgIF9QeUltcG9ydF9GaWxldGFiID0gZmlsZXRhYjsKIAotCWlmIChQeV9PcHRpbWl6ZUZsYWcpIHsKLQkJLyogUmVwbGFjZSAiLnB5YyIgd2l0aCAiLnB5byIgaW4gX1B5SW1wb3J0X0ZpbGV0YWIgKi8KLQkJZm9yICg7IGZpbGV0YWItPnN1ZmZpeCAhPSBOVUxMOyBmaWxldGFiKyspIHsKKyAgICBpZiAoUHlfT3B0aW1pemVGbGFnKSB7CisgICAgICAgIC8qIFJlcGxhY2UgIi5weWMiIHdpdGggIi5weW8iIGluIF9QeUltcG9ydF9GaWxldGFiICovCisgICAgICAgIGZvciAoOyBmaWxldGFiLT5zdWZmaXggIT0gTlVMTDsgZmlsZXRhYisrKSB7CiAjaWZuZGVmIFJJU0NPUwotCQkJaWYgKHN0cmNtcChmaWxldGFiLT5zdWZmaXgsICIucHljIikgPT0gMCkKLQkJCQlmaWxldGFiLT5zdWZmaXggPSAiLnB5byI7CisgICAgICAgICAgICBpZiAoc3RyY21wKGZpbGV0YWItPnN1ZmZpeCwgIi5weWMiKSA9PSAwKQorICAgICAgICAgICAgICAgIGZpbGV0YWItPnN1ZmZpeCA9ICIucHlvIjsKICNlbHNlCi0JCQlpZiAoc3RyY21wKGZpbGV0YWItPnN1ZmZpeCwgIi9weWMiKSA9PSAwKQotCQkJCWZpbGV0YWItPnN1ZmZpeCA9ICIvcHlvIjsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoZmlsZXRhYi0+c3VmZml4LCAiL3B5YyIpID09IDApCisgICAgICAgICAgICAgICAgZmlsZXRhYi0+c3VmZml4ID0gIi9weW8iOwogI2VuZGlmCi0JCX0KLQl9CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoUHlfVW5pY29kZUZsYWcpIHsKLQkJLyogRml4IHRoZSBweWNfbWFnaWMgc28gdGhhdCBieXRlIGNvbXBpbGVkIGNvZGUgY3JlYXRlZAotCQkgICB1c2luZyB0aGUgYWxsLVVuaWNvZGUgbWV0aG9kIGRvZXNuJ3QgaW50ZXJmZXJlIHdpdGgKLQkJICAgY29kZSBjcmVhdGVkIGluIG5vcm1hbCBvcGVyYXRpb24gbW9kZS4gKi8KLQkJcHljX21hZ2ljID0gTUFHSUMgKyAxOwotCX0KKyAgICBpZiAoUHlfVW5pY29kZUZsYWcpIHsKKyAgICAgICAgLyogRml4IHRoZSBweWNfbWFnaWMgc28gdGhhdCBieXRlIGNvbXBpbGVkIGNvZGUgY3JlYXRlZAorICAgICAgICAgICB1c2luZyB0aGUgYWxsLVVuaWNvZGUgbWV0aG9kIGRvZXNuJ3QgaW50ZXJmZXJlIHdpdGgKKyAgICAgICAgICAgY29kZSBjcmVhdGVkIGluIG5vcm1hbCBvcGVyYXRpb24gbW9kZS4gKi8KKyAgICAgICAgcHljX21hZ2ljID0gTUFHSUMgKyAxOworICAgIH0KIH0KIAogdm9pZAogX1B5SW1wb3J0SG9va3NfSW5pdCh2b2lkKQogewotCVB5T2JqZWN0ICp2LCAqcGF0aF9ob29rcyA9IE5VTEwsICp6aW1waW1wb3J0OwotCWludCBlcnIgPSAwOworICAgIFB5T2JqZWN0ICp2LCAqcGF0aF9ob29rcyA9IE5VTEwsICp6aW1waW1wb3J0OworICAgIGludCBlcnIgPSAwOwogCi0JLyogYWRkaW5nIHN5cy5wYXRoX2hvb2tzIGFuZCBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSwgc2V0dGluZyB1cAotCSAgIHppcGltcG9ydCAqLwotCWlmIChQeVR5cGVfUmVhZHkoJlB5TnVsbEltcG9ydGVyX1R5cGUpIDwgMCkKLQkJZ290byBlcnJvcjsKKyAgICAvKiBhZGRpbmcgc3lzLnBhdGhfaG9va3MgYW5kIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLCBzZXR0aW5nIHVwCisgICAgICAgemlwaW1wb3J0ICovCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlOdWxsSW1wb3J0ZXJfVHlwZSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlQeVN5c19Xcml0ZVN0ZGVycigiIyBpbnN0YWxsaW5nIHppcGltcG9ydCBob29rXG4iKTsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIGluc3RhbGxpbmcgemlwaW1wb3J0IGhvb2tcbiIpOwogCi0JdiA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKLQllcnIgPSBQeVN5c19TZXRPYmplY3QoIm1ldGFfcGF0aCIsIHYpOwotCVB5X0RFQ1JFRih2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycm9yOwotCXYgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKLQllcnIgPSBQeVN5c19TZXRPYmplY3QoInBhdGhfaW1wb3J0ZXJfY2FjaGUiLCB2KTsKLQlQeV9ERUNSRUYodik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJvcjsKLQlwYXRoX2hvb2tzID0gUHlMaXN0X05ldygwKTsKLQlpZiAocGF0aF9ob29rcyA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCWVyciA9IFB5U3lzX1NldE9iamVjdCgicGF0aF9ob29rcyIsIHBhdGhfaG9va3MpOwotCWlmIChlcnIpIHsKKyAgICB2ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGVyciA9IFB5U3lzX1NldE9iamVjdCgibWV0YV9wYXRoIiwgdik7CisgICAgUHlfREVDUkVGKHYpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgdiA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGVyciA9IFB5U3lzX1NldE9iamVjdCgicGF0aF9pbXBvcnRlcl9jYWNoZSIsIHYpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHBhdGhfaG9va3MgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChwYXRoX2hvb2tzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZXJyID0gUHlTeXNfU2V0T2JqZWN0KCJwYXRoX2hvb2tzIiwgcGF0aF9ob29rcyk7CisgICAgaWYgKGVycikgewogICBlcnJvcjoKLQkJUHlFcnJfUHJpbnQoKTsKLQkJUHlfRmF0YWxFcnJvcigiaW5pdGlhbGl6aW5nIHN5cy5tZXRhX3BhdGgsIHN5cy5wYXRoX2hvb2tzLCAiCi0JCQkgICAgICAicGF0aF9pbXBvcnRlcl9jYWNoZSwgb3IgTnVsbEltcG9ydGVyIGZhaWxlZCIKLQkJCSAgICAgICk7Ci0JfQorICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICBQeV9GYXRhbEVycm9yKCJpbml0aWFsaXppbmcgc3lzLm1ldGFfcGF0aCwgc3lzLnBhdGhfaG9va3MsICIKKyAgICAgICAgICAgICAgICAgICAgICAicGF0aF9pbXBvcnRlcl9jYWNoZSwgb3IgTnVsbEltcG9ydGVyIGZhaWxlZCIKKyAgICAgICAgICAgICAgICAgICAgICApOworICAgIH0KIAotCXppbXBpbXBvcnQgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInppcGltcG9ydCIpOwotCWlmICh6aW1waW1wb3J0ID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsgLyogTm8gemlwIGltcG9ydCBtb2R1bGUgLS0gb2theSAqLwotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiIyBjYW4ndCBpbXBvcnQgemlwaW1wb3J0XG4iKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICp6aXBpbXBvcnRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoemltcGltcG9ydCwKLQkJCQkJCQkgICAgICAgInppcGltcG9ydGVyIik7Ci0JCVB5X0RFQ1JFRih6aW1waW1wb3J0KTsKLQkJaWYgKHppcGltcG9ydGVyID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7IC8qIE5vIHppcGltcG9ydGVyIG9iamVjdCAtLSBva2F5ICovCi0JCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQkJUHlTeXNfV3JpdGVTdGRlcnIoCi0JCQkJICAgICIjIGNhbid0IGltcG9ydCB6aXBpbXBvcnQuemlwaW1wb3J0ZXJcbiIpOwotCQl9Ci0JCWVsc2UgewotCQkJLyogc3lzLnBhdGhfaG9va3MuYXBwZW5kKHppcGltcG9ydGVyKSAqLwotCQkJZXJyID0gUHlMaXN0X0FwcGVuZChwYXRoX2hvb2tzLCB6aXBpbXBvcnRlcik7Ci0JCQlQeV9ERUNSRUYoemlwaW1wb3J0ZXIpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIGVycm9yOwotCQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJCVB5U3lzX1dyaXRlU3RkZXJyKAotCQkJCQkiIyBpbnN0YWxsZWQgemlwaW1wb3J0IGhvb2tcbiIpOwotCQl9Ci0JfQotCVB5X0RFQ1JFRihwYXRoX2hvb2tzKTsKKyAgICB6aW1waW1wb3J0ID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJ6aXBpbXBvcnQiKTsKKyAgICBpZiAoemltcGltcG9ydCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIE5vIHppcCBpbXBvcnQgbW9kdWxlIC0tIG9rYXkgKi8KKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2FuJ3QgaW1wb3J0IHppcGltcG9ydFxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqemlwaW1wb3J0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHppbXBpbXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInppcGltcG9ydGVyIik7CisgICAgICAgIFB5X0RFQ1JFRih6aW1waW1wb3J0KTsKKyAgICAgICAgaWYgKHppcGltcG9ydGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIE5vIHppcGltcG9ydGVyIG9iamVjdCAtLSBva2F5ICovCisgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoCisgICAgICAgICAgICAgICAgICAgICIjIGNhbid0IGltcG9ydCB6aXBpbXBvcnQuemlwaW1wb3J0ZXJcbiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogc3lzLnBhdGhfaG9va3MuYXBwZW5kKHppcGltcG9ydGVyKSAqLworICAgICAgICAgICAgZXJyID0gUHlMaXN0X0FwcGVuZChwYXRoX2hvb2tzLCB6aXBpbXBvcnRlcik7CisgICAgICAgICAgICBQeV9ERUNSRUYoemlwaW1wb3J0ZXIpOworICAgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKAorICAgICAgICAgICAgICAgICAgICAiIyBpbnN0YWxsZWQgemlwaW1wb3J0IGhvb2tcbiIpOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihwYXRoX2hvb2tzKTsKIH0KIAogdm9pZAogX1B5SW1wb3J0X0Zpbmkodm9pZCkKIHsKLQlQeV9YREVDUkVGKGV4dGVuc2lvbnMpOwotCWV4dGVuc2lvbnMgPSBOVUxMOwotCVB5TWVtX0RFTChfUHlJbXBvcnRfRmlsZXRhYik7Ci0JX1B5SW1wb3J0X0ZpbGV0YWIgPSBOVUxMOworICAgIFB5X1hERUNSRUYoZXh0ZW5zaW9ucyk7CisgICAgZXh0ZW5zaW9ucyA9IE5VTEw7CisgICAgUHlNZW1fREVMKF9QeUltcG9ydF9GaWxldGFiKTsKKyAgICBfUHlJbXBvcnRfRmlsZXRhYiA9IE5VTEw7CiB9CiAKIApAQCAtMjYzLDQyICsyNjMsNDIgQEAKIHZvaWQKIF9QeUltcG9ydF9BY3F1aXJlTG9jayh2b2lkKQogewotCWxvbmcgbWUgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7Ci0JaWYgKG1lID09IC0xKQotCQlyZXR1cm47IC8qIFRvbyBiYWQgKi8KLQlpZiAoaW1wb3J0X2xvY2sgPT0gTlVMTCkgewotCQlpbXBvcnRfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKLQkJaWYgKGltcG9ydF9sb2NrID09IE5VTEwpCi0JCQlyZXR1cm47ICAvKiBOb3RoaW5nIG11Y2ggd2UgY2FuIGRvLiAqLwotCX0KLQlpZiAoaW1wb3J0X2xvY2tfdGhyZWFkID09IG1lKSB7Ci0JCWltcG9ydF9sb2NrX2xldmVsKys7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGltcG9ydF9sb2NrX3RocmVhZCAhPSAtMSB8fCAhUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGltcG9ydF9sb2NrLCAwKSkKLQl7Ci0JCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7Ci0JCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbXBvcnRfbG9jaywgMSk7Ci0JCVB5RXZhbF9SZXN0b3JlVGhyZWFkKHRzdGF0ZSk7Ci0JfQotCWltcG9ydF9sb2NrX3RocmVhZCA9IG1lOwotCWltcG9ydF9sb2NrX2xldmVsID0gMTsKKyAgICBsb25nIG1lID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIGlmIChtZSA9PSAtMSkKKyAgICAgICAgcmV0dXJuOyAvKiBUb28gYmFkICovCisgICAgaWYgKGltcG9ydF9sb2NrID09IE5VTEwpIHsKKyAgICAgICAgaW1wb3J0X2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgICAgIGlmIChpbXBvcnRfbG9jayA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuOyAgLyogTm90aGluZyBtdWNoIHdlIGNhbiBkby4gKi8KKyAgICB9CisgICAgaWYgKGltcG9ydF9sb2NrX3RocmVhZCA9PSBtZSkgeworICAgICAgICBpbXBvcnRfbG9ja19sZXZlbCsrOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpbXBvcnRfbG9ja190aHJlYWQgIT0gLTEgfHwgIVB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbXBvcnRfbG9jaywgMCkpCisgICAgeworICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOworICAgICAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soaW1wb3J0X2xvY2ssIDEpOworICAgICAgICBQeUV2YWxfUmVzdG9yZVRocmVhZCh0c3RhdGUpOworICAgIH0KKyAgICBpbXBvcnRfbG9ja190aHJlYWQgPSBtZTsKKyAgICBpbXBvcnRfbG9ja19sZXZlbCA9IDE7CiB9CiAKIGludAogX1B5SW1wb3J0X1JlbGVhc2VMb2NrKHZvaWQpCiB7Ci0JbG9uZyBtZSA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQlpZiAobWUgPT0gLTEgfHwgaW1wb3J0X2xvY2sgPT0gTlVMTCkKLQkJcmV0dXJuIDA7IC8qIFRvbyBiYWQgKi8KLQlpZiAoaW1wb3J0X2xvY2tfdGhyZWFkICE9IG1lKQotCQlyZXR1cm4gLTE7Ci0JaW1wb3J0X2xvY2tfbGV2ZWwtLTsKLQlpZiAoaW1wb3J0X2xvY2tfbGV2ZWwgPT0gMCkgewotCQlpbXBvcnRfbG9ja190aHJlYWQgPSAtMTsKLQkJUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGltcG9ydF9sb2NrKTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgbG9uZyBtZSA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBpZiAobWUgPT0gLTEgfHwgaW1wb3J0X2xvY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7IC8qIFRvbyBiYWQgKi8KKyAgICBpZiAoaW1wb3J0X2xvY2tfdGhyZWFkICE9IG1lKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW1wb3J0X2xvY2tfbGV2ZWwtLTsKKyAgICBpZiAoaW1wb3J0X2xvY2tfbGV2ZWwgPT0gMCkgeworICAgICAgICBpbXBvcnRfbG9ja190aHJlYWQgPSAtMTsKKyAgICAgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGltcG9ydF9sb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gUHlPU19BZnRlckZvcmsgdG8gZW5zdXJlIHRoYXQgbmV3bHkKQEAgLTMwOSwxMCArMzA5LDEwIEBACiB2b2lkCiBfUHlJbXBvcnRfUmVJbml0TG9jayh2b2lkKQogewotIAlpZiAoaW1wb3J0X2xvY2sgIT0gTlVMTCkKLSAJCWltcG9ydF9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotIAlpbXBvcnRfbG9ja190aHJlYWQgPSAtMTsKLSAJaW1wb3J0X2xvY2tfbGV2ZWwgPSAwOworICAgIGlmIChpbXBvcnRfbG9jayAhPSBOVUxMKQorICAgICAgICBpbXBvcnRfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBpbXBvcnRfbG9ja190aHJlYWQgPSAtMTsKKyAgICBpbXBvcnRfbG9ja19sZXZlbCA9IDA7CiB9CiAKICNlbmRpZgpAQCAtMzIxLDkgKzMyMSw5IEBACiBpbXBfbG9ja19oZWxkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewogI2lmZGVmIFdJVEhfVEhSRUFECi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhpbXBvcnRfbG9ja190aHJlYWQgIT0gLTEpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoaW1wb3J0X2xvY2tfdGhyZWFkICE9IC0xKTsKICNlbHNlCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogI2VuZGlmCiB9CiAKQEAgLTMzMSwzMiArMzMxLDMyIEBACiBpbXBfYWNxdWlyZV9sb2NrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewogI2lmZGVmIFdJVEhfVEhSRUFECi0JX1B5SW1wb3J0X0FjcXVpcmVMb2NrKCk7CisgICAgX1B5SW1wb3J0X0FjcXVpcmVMb2NrKCk7CiAjZW5kaWYKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX3JlbGVhc2VfbG9jayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChfUHlJbXBvcnRfUmVsZWFzZUxvY2soKSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkibm90IGhvbGRpbmcgdGhlIGltcG9ydCBsb2NrIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoX1B5SW1wb3J0X1JlbGVhc2VMb2NrKCkgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IGhvbGRpbmcgdGhlIGltcG9ydCBsb2NrIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyB2b2lkCiBpbXBfbW9kdWxlc19yZWxvYWRpbmdfY2xlYXIodm9pZCkKIHsKLQlQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR2V0KCktPmludGVycDsKLQlpZiAoaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyAhPSBOVUxMKQotCQlQeURpY3RfQ2xlYXIoaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyk7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dldCgpLT5pbnRlcnA7CisgICAgaWYgKGludGVycC0+bW9kdWxlc19yZWxvYWRpbmcgIT0gTlVMTCkKKyAgICAgICAgUHlEaWN0X0NsZWFyKGludGVycC0+bW9kdWxlc19yZWxvYWRpbmcpOwogfQogCiAvKiBIZWxwZXIgZm9yIHN5cyAqLwpAQCAtMzY0LDI5ICszNjQsMjkgQEAKIFB5T2JqZWN0ICoKIFB5SW1wb3J0X0dldE1vZHVsZURpY3Qodm9pZCkKIHsKLQlQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKLQlpZiAoaW50ZXJwLT5tb2R1bGVzID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5SW1wb3J0X0dldE1vZHVsZURpY3Q6IG5vIG1vZHVsZSBkaWN0aW9uYXJ5ISIpOwotCXJldHVybiBpbnRlcnAtPm1vZHVsZXM7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CisgICAgaWYgKGludGVycC0+bW9kdWxlcyA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeUltcG9ydF9HZXRNb2R1bGVEaWN0OiBubyBtb2R1bGUgZGljdGlvbmFyeSEiKTsKKyAgICByZXR1cm4gaW50ZXJwLT5tb2R1bGVzOwogfQogCiAKIC8qIExpc3Qgb2YgbmFtZXMgdG8gY2xlYXIgaW4gc3lzICovCiBzdGF0aWMgY2hhciogc3lzX2RlbGV0ZXNbXSA9IHsKLQkicGF0aCIsICJhcmd2IiwgInBzMSIsICJwczIiLCAiZXhpdGZ1bmMiLAotCSJleGNfdHlwZSIsICJleGNfdmFsdWUiLCAiZXhjX3RyYWNlYmFjayIsCi0JImxhc3RfdHlwZSIsICJsYXN0X3ZhbHVlIiwgImxhc3RfdHJhY2ViYWNrIiwKLQkicGF0aF9ob29rcyIsICJwYXRoX2ltcG9ydGVyX2NhY2hlIiwgIm1ldGFfcGF0aCIsCi0JLyogbWlzYyBzdHVmZiAqLwotCSJmbGFncyIsICJmbG9hdF9pbmZvIiwKLQlOVUxMCisgICAgInBhdGgiLCAiYXJndiIsICJwczEiLCAicHMyIiwgImV4aXRmdW5jIiwKKyAgICAiZXhjX3R5cGUiLCAiZXhjX3ZhbHVlIiwgImV4Y190cmFjZWJhY2siLAorICAgICJsYXN0X3R5cGUiLCAibGFzdF92YWx1ZSIsICJsYXN0X3RyYWNlYmFjayIsCisgICAgInBhdGhfaG9va3MiLCAicGF0aF9pbXBvcnRlcl9jYWNoZSIsICJtZXRhX3BhdGgiLAorICAgIC8qIG1pc2Mgc3R1ZmYgKi8KKyAgICAiZmxhZ3MiLCAiZmxvYXRfaW5mbyIsCisgICAgTlVMTAogfTsKIAogc3RhdGljIGNoYXIqIHN5c19maWxlc1tdID0gewotCSJzdGRpbiIsICJfX3N0ZGluX18iLAotCSJzdGRvdXQiLCAiX19zdGRvdXRfXyIsCi0JInN0ZGVyciIsICJfX3N0ZGVycl9fIiwKLQlOVUxMCisgICAgInN0ZGluIiwgIl9fc3RkaW5fXyIsCisgICAgInN0ZG91dCIsICJfX3N0ZG91dF9fIiwKKyAgICAic3RkZXJyIiwgIl9fc3RkZXJyX18iLAorICAgIE5VTEwKIH07CiAKIApAQCAtMzk1LDEzMiArMzk1LDEzMiBAQAogdm9pZAogUHlJbXBvcnRfQ2xlYW51cCh2b2lkKQogewotCVB5X3NzaXplX3QgcG9zLCBuZG9uZTsKLQljaGFyICpuYW1lOwotCVB5T2JqZWN0ICprZXksICp2YWx1ZSwgKmRpY3Q7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7Ci0JUHlPYmplY3QgKm1vZHVsZXMgPSBpbnRlcnAtPm1vZHVsZXM7CisgICAgUHlfc3NpemVfdCBwb3MsIG5kb25lOworICAgIGNoYXIgKm5hbWU7CisgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlLCAqZGljdDsKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKKyAgICBQeU9iamVjdCAqbW9kdWxlcyA9IGludGVycC0+bW9kdWxlczsKIAotCWlmIChtb2R1bGVzID09IE5VTEwpCi0JCXJldHVybjsgLyogQWxyZWFkeSBkb25lICovCisgICAgaWYgKG1vZHVsZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOyAvKiBBbHJlYWR5IGRvbmUgKi8KIAotCS8qIERlbGV0ZSBzb21lIHNwZWNpYWwgdmFyaWFibGVzIGZpcnN0LiAgVGhlc2UgYXJlIGNvbW1vbgotCSAgIHBsYWNlcyB3aGVyZSB1c2VyIHZhbHVlcyBoaWRlIGFuZCBwZW9wbGUgY29tcGxhaW4gd2hlbiB0aGVpcgotCSAgIGRlc3RydWN0b3JzIGZhaWwuICBTaW5jZSB0aGUgbW9kdWxlcyBjb250YWluaW5nIHRoZW0gYXJlCi0JICAgZGVsZXRlZCAqbGFzdCogb2YgYWxsLCB0aGV5IHdvdWxkIGNvbWUgdG9vIGxhdGUgaW4gdGhlIG5vcm1hbAotCSAgIGRlc3RydWN0aW9uIG9yZGVyLiAgU2lnaC4gKi8KKyAgICAvKiBEZWxldGUgc29tZSBzcGVjaWFsIHZhcmlhYmxlcyBmaXJzdC4gIFRoZXNlIGFyZSBjb21tb24KKyAgICAgICBwbGFjZXMgd2hlcmUgdXNlciB2YWx1ZXMgaGlkZSBhbmQgcGVvcGxlIGNvbXBsYWluIHdoZW4gdGhlaXIKKyAgICAgICBkZXN0cnVjdG9ycyBmYWlsLiAgU2luY2UgdGhlIG1vZHVsZXMgY29udGFpbmluZyB0aGVtIGFyZQorICAgICAgIGRlbGV0ZWQgKmxhc3QqIG9mIGFsbCwgdGhleSB3b3VsZCBjb21lIHRvbyBsYXRlIGluIHRoZSBub3JtYWwKKyAgICAgICBkZXN0cnVjdGlvbiBvcmRlci4gIFNpZ2guICovCiAKLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX2J1aWx0aW5fXyIpOwotCWlmICh2YWx1ZSAhPSBOVUxMICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgewotCQlkaWN0ID0gUHlNb2R1bGVfR2V0RGljdCh2YWx1ZSk7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFyIF9fYnVpbHRpbl9fLl9cbiIpOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiXyIsIFB5X05vbmUpOwotCX0KLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJzeXMiKTsKLQlpZiAodmFsdWUgIT0gTlVMTCAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKLQkJY2hhciAqKnA7Ci0JCVB5T2JqZWN0ICp2OwotCQlkaWN0ID0gUHlNb2R1bGVfR2V0RGljdCh2YWx1ZSk7Ci0JCWZvciAocCA9IHN5c19kZWxldGVzOyAqcCAhPSBOVUxMOyBwKyspIHsKLQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQlQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhciBzeXMuJXNcbiIsICpwKTsKLQkJCVB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICpwLCBQeV9Ob25lKTsKLQkJfQotCQlmb3IgKHAgPSBzeXNfZmlsZXM7ICpwICE9IE5VTEw7IHArPTIpIHsKLQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQlQeVN5c19Xcml0ZVN0ZGVycigiIyByZXN0b3JlIHN5cy4lc1xuIiwgKnApOwotCQkJdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICoocCsxKSk7Ci0JCQlpZiAodiA9PSBOVUxMKQotCQkJCXYgPSBQeV9Ob25lOwotCQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgKnAsIHYpOwotCQl9Ci0JfQorICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fYnVpbHRpbl9fIik7CisgICAgaWYgKHZhbHVlICE9IE5VTEwgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KHZhbHVlKTsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYXIgX19idWlsdGluX18uX1xuIik7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfIiwgUHlfTm9uZSk7CisgICAgfQorICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgInN5cyIpOworICAgIGlmICh2YWx1ZSAhPSBOVUxMICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBjaGFyICoqcDsKKyAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgIGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KHZhbHVlKTsKKyAgICAgICAgZm9yIChwID0gc3lzX2RlbGV0ZXM7ICpwICE9IE5VTEw7IHArKykgeworICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFyIHN5cy4lc1xuIiwgKnApOworICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgKnAsIFB5X05vbmUpOworICAgICAgICB9CisgICAgICAgIGZvciAocCA9IHN5c19maWxlczsgKnAgIT0gTlVMTDsgcCs9MikgeworICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIHJlc3RvcmUgc3lzLiVzXG4iLCAqcCk7CisgICAgICAgICAgICB2ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgKihwKzEpKTsKKyAgICAgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICAgICAgdiA9IFB5X05vbmU7CisgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAqcCwgdik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBGaXJzdCwgZGVsZXRlIF9fbWFpbl9fICovCi0JdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCAiX19tYWluX18iKTsKLQlpZiAodmFsdWUgIT0gTlVMTCAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYW51cCBfX21haW5fX1xuIik7Ci0JCV9QeU1vZHVsZV9DbGVhcih2YWx1ZSk7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX21haW5fXyIsIFB5X05vbmUpOwotCX0KKyAgICAvKiBGaXJzdCwgZGVsZXRlIF9fbWFpbl9fICovCisgICAgdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCAiX19tYWluX18iKTsKKyAgICBpZiAodmFsdWUgIT0gTlVMTCAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYW51cCBfX21haW5fX1xuIik7CisgICAgICAgIF9QeU1vZHVsZV9DbGVhcih2YWx1ZSk7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX21haW5fXyIsIFB5X05vbmUpOworICAgIH0KIAotCS8qIFRoZSBzcGVjaWFsIHRyZWF0bWVudCBvZiBfX2J1aWx0aW5fXyBoZXJlIGlzIGJlY2F1c2UgZXZlbgotCSAgIHdoZW4gaXQncyBub3QgcmVmZXJlbmNlZCBhcyBhIG1vZHVsZSwgaXRzIGRpY3Rpb25hcnkgaXMKLQkgICByZWZlcmVuY2VkIGJ5IGFsbW9zdCBldmVyeSBtb2R1bGUncyBfX2J1aWx0aW5zX18uICBTaW5jZQotCSAgIGRlbGV0aW5nIGEgbW9kdWxlIGNsZWFycyBpdHMgZGljdGlvbmFyeSAoZXZlbiBpZiB0aGVyZSBhcmUKLQkgICByZWZlcmVuY2VzIGxlZnQgdG8gaXQpLCB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgX19idWlsdGluX18KLQkgICBtb2R1bGUgbGFzdC4gIExpa2V3aXNlLCB3ZSBkb24ndCBkZWxldGUgc3lzIHVudGlsIHRoZSB2ZXJ5Ci0JICAgZW5kIGJlY2F1c2UgaXQgaXMgaW1wbGljaXRseSByZWZlcmVuY2VkIChlLmcuIGJ5IHByaW50KS4KKyAgICAvKiBUaGUgc3BlY2lhbCB0cmVhdG1lbnQgb2YgX19idWlsdGluX18gaGVyZSBpcyBiZWNhdXNlIGV2ZW4KKyAgICAgICB3aGVuIGl0J3Mgbm90IHJlZmVyZW5jZWQgYXMgYSBtb2R1bGUsIGl0cyBkaWN0aW9uYXJ5IGlzCisgICAgICAgcmVmZXJlbmNlZCBieSBhbG1vc3QgZXZlcnkgbW9kdWxlJ3MgX19idWlsdGluc19fLiAgU2luY2UKKyAgICAgICBkZWxldGluZyBhIG1vZHVsZSBjbGVhcnMgaXRzIGRpY3Rpb25hcnkgKGV2ZW4gaWYgdGhlcmUgYXJlCisgICAgICAgcmVmZXJlbmNlcyBsZWZ0IHRvIGl0KSwgd2UgbmVlZCB0byBkZWxldGUgdGhlIF9fYnVpbHRpbl9fCisgICAgICAgbW9kdWxlIGxhc3QuICBMaWtld2lzZSwgd2UgZG9uJ3QgZGVsZXRlIHN5cyB1bnRpbCB0aGUgdmVyeQorICAgICAgIGVuZCBiZWNhdXNlIGl0IGlzIGltcGxpY2l0bHkgcmVmZXJlbmNlZCAoZS5nLiBieSBwcmludCkuCiAKLQkgICBBbHNvIG5vdGUgdGhhdCB3ZSAnZGVsZXRlJyBtb2R1bGVzIGJ5IHJlcGxhY2luZyB0aGVpciBlbnRyeQotCSAgIGluIHRoZSBtb2R1bGVzIGRpY3Qgd2l0aCBOb25lLCByYXRoZXIgdGhhbiByZWFsbHkgZGVsZXRpbmcKLQkgICB0aGVtOyB0aGlzIGF2b2lkcyBhIHJlaGFzaCBvZiB0aGUgbW9kdWxlcyBkaWN0aW9uYXJ5IGFuZAotCSAgIGFsc28gbWFya3MgdGhlbSBhcyAibm9uIGV4aXN0ZW50IiBzbyB0aGV5IHdvbid0IGJlCi0JICAgcmUtaW1wb3J0ZWQuICovCisgICAgICAgQWxzbyBub3RlIHRoYXQgd2UgJ2RlbGV0ZScgbW9kdWxlcyBieSByZXBsYWNpbmcgdGhlaXIgZW50cnkKKyAgICAgICBpbiB0aGUgbW9kdWxlcyBkaWN0IHdpdGggTm9uZSwgcmF0aGVyIHRoYW4gcmVhbGx5IGRlbGV0aW5nCisgICAgICAgdGhlbTsgdGhpcyBhdm9pZHMgYSByZWhhc2ggb2YgdGhlIG1vZHVsZXMgZGljdGlvbmFyeSBhbmQKKyAgICAgICBhbHNvIG1hcmtzIHRoZW0gYXMgIm5vbiBleGlzdGVudCIgc28gdGhleSB3b24ndCBiZQorICAgICAgIHJlLWltcG9ydGVkLiAqLwogCi0JLyogTmV4dCwgcmVwZWF0ZWRseSBkZWxldGUgbW9kdWxlcyB3aXRoIGEgcmVmZXJlbmNlIGNvdW50IG9mCi0JICAgb25lIChza2lwcGluZyBfX2J1aWx0aW5fXyBhbmQgc3lzKSBhbmQgZGVsZXRlIHRoZW0gKi8KLQlkbyB7Ci0JCW5kb25lID0gMDsKLQkJcG9zID0gMDsKLQkJd2hpbGUgKFB5RGljdF9OZXh0KG1vZHVsZXMsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKLQkJCWlmICh2YWx1ZS0+b2JfcmVmY250ICE9IDEpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoUHlTdHJpbmdfQ2hlY2soa2V5KSAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKLQkJCQluYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGtleSk7Ci0JCQkJaWYgKHN0cmNtcChuYW1lLCAiX19idWlsdGluX18iKSA9PSAwKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoc3RyY21wKG5hbWUsICJzeXMiKSA9PSAwKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQkJCVB5U3lzX1dyaXRlU3RkZXJyKAotCQkJCQkJIiMgY2xlYW51cFsxXSAlc1xuIiwgbmFtZSk7Ci0JCQkJX1B5TW9kdWxlX0NsZWFyKHZhbHVlKTsKLQkJCQlQeURpY3RfU2V0SXRlbShtb2R1bGVzLCBrZXksIFB5X05vbmUpOwotCQkJCW5kb25lKys7Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlIChuZG9uZSA+IDApOworICAgIC8qIE5leHQsIHJlcGVhdGVkbHkgZGVsZXRlIG1vZHVsZXMgd2l0aCBhIHJlZmVyZW5jZSBjb3VudCBvZgorICAgICAgIG9uZSAoc2tpcHBpbmcgX19idWlsdGluX18gYW5kIHN5cykgYW5kIGRlbGV0ZSB0aGVtICovCisgICAgZG8geworICAgICAgICBuZG9uZSA9IDA7CisgICAgICAgIHBvcyA9IDA7CisgICAgICAgIHdoaWxlIChQeURpY3RfTmV4dChtb2R1bGVzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBpZiAodmFsdWUtPm9iX3JlZmNudCAhPSAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGtleSkgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhrZXkpOworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZSwgIl9fYnVpbHRpbl9fIikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAic3lzIikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigKKyAgICAgICAgICAgICAgICAgICAgICAgICIjIGNsZWFudXBbMV0gJXNcbiIsIG5hbWUpOworICAgICAgICAgICAgICAgIF9QeU1vZHVsZV9DbGVhcih2YWx1ZSk7CisgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW0obW9kdWxlcywga2V5LCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICBuZG9uZSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAobmRvbmUgPiAwKTsKIAotCS8qIE5leHQsIGRlbGV0ZSBhbGwgbW9kdWxlcyAoc3RpbGwgc2tpcHBpbmcgX19idWlsdGluX18gYW5kIHN5cykgKi8KLQlwb3MgPSAwOwotCXdoaWxlIChQeURpY3RfTmV4dChtb2R1bGVzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCWlmIChQeVN0cmluZ19DaGVjayhrZXkpICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgewotCQkJbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhrZXkpOwotCQkJaWYgKHN0cmNtcChuYW1lLCAiX19idWlsdGluX18iKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHN0cmNtcChuYW1lLCAic3lzIikgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQlQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhbnVwWzJdICVzXG4iLCBuYW1lKTsKLQkJCV9QeU1vZHVsZV9DbGVhcih2YWx1ZSk7Ci0JCQlQeURpY3RfU2V0SXRlbShtb2R1bGVzLCBrZXksIFB5X05vbmUpOwotCQl9Ci0JfQorICAgIC8qIE5leHQsIGRlbGV0ZSBhbGwgbW9kdWxlcyAoc3RpbGwgc2tpcHBpbmcgX19idWlsdGluX18gYW5kIHN5cykgKi8KKyAgICBwb3MgPSAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChtb2R1bGVzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhrZXkpICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhrZXkpOworICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAiX19idWlsdGluX18iKSA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAic3lzIikgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhbnVwWzJdICVzXG4iLCBuYW1lKTsKKyAgICAgICAgICAgIF9QeU1vZHVsZV9DbGVhcih2YWx1ZSk7CisgICAgICAgICAgICBQeURpY3RfU2V0SXRlbShtb2R1bGVzLCBrZXksIFB5X05vbmUpOworICAgICAgICB9CisgICAgfQogCi0JLyogTmV4dCwgZGVsZXRlIHN5cyBhbmQgX19idWlsdGluX18gKGluIHRoYXQgb3JkZXIpICovCi0JdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCAic3lzIik7Ci0JaWYgKHZhbHVlICE9IE5VTEwgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFudXAgc3lzXG4iKTsKLQkJX1B5TW9kdWxlX0NsZWFyKHZhbHVlKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlcywgInN5cyIsIFB5X05vbmUpOwotCX0KLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX2J1aWx0aW5fXyIpOwotCWlmICh2YWx1ZSAhPSBOVUxMICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgewotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhbnVwIF9fYnVpbHRpbl9fXG4iKTsKLQkJX1B5TW9kdWxlX0NsZWFyKHZhbHVlKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fYnVpbHRpbl9fIiwgUHlfTm9uZSk7Ci0JfQorICAgIC8qIE5leHQsIGRlbGV0ZSBzeXMgYW5kIF9fYnVpbHRpbl9fIChpbiB0aGF0IG9yZGVyKSAqLworICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgInN5cyIpOworICAgIGlmICh2YWx1ZSAhPSBOVUxMICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhbnVwIHN5c1xuIik7CisgICAgICAgIF9QeU1vZHVsZV9DbGVhcih2YWx1ZSk7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJzeXMiLCBQeV9Ob25lKTsKKyAgICB9CisgICAgdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCAiX19idWlsdGluX18iKTsKKyAgICBpZiAodmFsdWUgIT0gTlVMTCAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYW51cCBfX2J1aWx0aW5fX1xuIik7CisgICAgICAgIF9QeU1vZHVsZV9DbGVhcih2YWx1ZSk7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX2J1aWx0aW5fXyIsIFB5X05vbmUpOworICAgIH0KIAotCS8qIEZpbmFsbHksIGNsZWFyIGFuZCBkZWxldGUgdGhlIG1vZHVsZXMgZGlyZWN0b3J5ICovCi0JUHlEaWN0X0NsZWFyKG1vZHVsZXMpOwotCWludGVycC0+bW9kdWxlcyA9IE5VTEw7Ci0JUHlfREVDUkVGKG1vZHVsZXMpOwotCVB5X0NMRUFSKGludGVycC0+bW9kdWxlc19yZWxvYWRpbmcpOworICAgIC8qIEZpbmFsbHksIGNsZWFyIGFuZCBkZWxldGUgdGhlIG1vZHVsZXMgZGlyZWN0b3J5ICovCisgICAgUHlEaWN0X0NsZWFyKG1vZHVsZXMpOworICAgIGludGVycC0+bW9kdWxlcyA9IE5VTEw7CisgICAgUHlfREVDUkVGKG1vZHVsZXMpOworICAgIFB5X0NMRUFSKGludGVycC0+bW9kdWxlc19yZWxvYWRpbmcpOwogfQogCiAKQEAgLTUyOSw3ICs1MjksNyBAQAogbG9uZwogUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIodm9pZCkKIHsKLQlyZXR1cm4gcHljX21hZ2ljOworICAgIHJldHVybiBweWNfbWFnaWM7CiB9CiAKIApAQCAtNTQ2LDUxICs1NDYsNTEgQEAKIFB5T2JqZWN0ICoKIF9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbihjaGFyICpuYW1lLCBjaGFyICpmaWxlbmFtZSkKIHsKLQlQeU9iamVjdCAqbW9kdWxlcywgKm1vZCwgKmRpY3QsICpjb3B5OwotCWlmIChleHRlbnNpb25zID09IE5VTEwpIHsKLQkJZXh0ZW5zaW9ucyA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKGV4dGVuc2lvbnMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQltb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOwotCW1vZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpOwotCWlmIChtb2QgPT0gTlVMTCB8fCAhUHlNb2R1bGVfQ2hlY2sobW9kKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCSAgIl9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbjogbW9kdWxlICUuMjAwcyBub3QgbG9hZGVkIiwgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2QpOwotCWlmIChkaWN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWNvcHkgPSBQeURpY3RfQ29weShkaWN0KTsKLQlpZiAoY29weSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhleHRlbnNpb25zLCBmaWxlbmFtZSwgY29weSk7Ci0JUHlfREVDUkVGKGNvcHkpOwotCXJldHVybiBjb3B5OworICAgIFB5T2JqZWN0ICptb2R1bGVzLCAqbW9kLCAqZGljdCwgKmNvcHk7CisgICAgaWYgKGV4dGVuc2lvbnMgPT0gTlVMTCkgeworICAgICAgICBleHRlbnNpb25zID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoZXh0ZW5zaW9ucyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisgICAgbW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSk7CisgICAgaWYgKG1vZCA9PSBOVUxMIHx8ICFQeU1vZHVsZV9DaGVjayhtb2QpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAiX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uOiBtb2R1bGUgJS4yMDBzIG5vdCBsb2FkZWQiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZCk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY29weSA9IFB5RGljdF9Db3B5KGRpY3QpOworICAgIGlmIChjb3B5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGV4dGVuc2lvbnMsIGZpbGVuYW1lLCBjb3B5KTsKKyAgICBQeV9ERUNSRUYoY29weSk7CisgICAgcmV0dXJuIGNvcHk7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uKGNoYXIgKm5hbWUsIGNoYXIgKmZpbGVuYW1lKQogewotCVB5T2JqZWN0ICpkaWN0LCAqbW9kLCAqbWRpY3Q7Ci0JaWYgKGV4dGVuc2lvbnMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZGljdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGV4dGVuc2lvbnMsIGZpbGVuYW1lKTsKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltb2QgPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7Ci0JaWYgKG1vZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKLQlpZiAobWRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5RGljdF9VcGRhdGUobWRpY3QsIGRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCVB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBwcmV2aW91c2x5IGxvYWRlZCAoJXMpXG4iLAotCQkJbmFtZSwgZmlsZW5hbWUpOwotCXJldHVybiBtb2Q7CisgICAgUHlPYmplY3QgKmRpY3QsICptb2QsICptZGljdDsKKyAgICBpZiAoZXh0ZW5zaW9ucyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkaWN0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZXh0ZW5zaW9ucywgZmlsZW5hbWUpOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1vZCA9IFB5SW1wb3J0X0FkZE1vZHVsZShuYW1lKTsKKyAgICBpZiAobW9kID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1kaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2QpOworICAgIGlmIChtZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1VwZGF0ZShtZGljdCwgZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIHByZXZpb3VzbHkgbG9hZGVkICglcylcbiIsCisgICAgICAgICAgICBuYW1lLCBmaWxlbmFtZSk7CisgICAgcmV0dXJuIG1vZDsKIH0KIAogCkBAIC02MDMsMzQgKzYwMywzNCBAQAogUHlPYmplY3QgKgogUHlJbXBvcnRfQWRkTW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisgICAgUHlPYmplY3QgKm07CiAKLQlpZiAoKG0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKSkgIT0gTlVMTCAmJgotCSAgICBQeU1vZHVsZV9DaGVjayhtKSkKLQkJcmV0dXJuIG07Ci0JbSA9IFB5TW9kdWxlX05ldyhuYW1lKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSwgbSkgIT0gMCkgewotCQlQeV9ERUNSRUYobSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYobSk7IC8qIFllcywgaXQgc3RpbGwgZXhpc3RzLCBpbiBtb2R1bGVzISAqLworICAgIGlmICgobSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpKSAhPSBOVUxMICYmCisgICAgICAgIFB5TW9kdWxlX0NoZWNrKG0pKQorICAgICAgICByZXR1cm4gbTsKKyAgICBtID0gUHlNb2R1bGVfTmV3KG5hbWUpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lLCBtKSAhPSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihtKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRihtKTsgLyogWWVzLCBpdCBzdGlsbCBleGlzdHMsIGluIG1vZHVsZXMhICovCiAKLQlyZXR1cm4gbTsKKyAgICByZXR1cm4gbTsKIH0KIAogLyogUmVtb3ZlIG5hbWUgZnJvbSBzeXMubW9kdWxlcywgaWYgaXQncyB0aGVyZS4gKi8KIHN0YXRpYyB2b2lkCiByZW1vdmVfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7Ci0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAoUHlEaWN0X0RlbEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJpbXBvcnQ6ICBkZWxldGluZyBleGlzdGluZyBrZXkgaW4iCi0JCQkgICAgICAic3lzLm1vZHVsZXMgZmFpbGVkIik7CisgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlEaWN0X0RlbEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJpbXBvcnQ6ICBkZWxldGluZyBleGlzdGluZyBrZXkgaW4iCisgICAgICAgICAgICAgICAgICAgICAgInN5cy5tb2R1bGVzIGZhaWxlZCIpOwogfQogCiAvKiBFeGVjdXRlIGEgY29kZSBvYmplY3QgaW4gYSBtb2R1bGUgYW5kIHJldHVybiB0aGUgbW9kdWxlIG9iamVjdApAQCAtNjQzLDYwICs2NDMsNjAgQEAKIFB5T2JqZWN0ICoKIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlKGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpjbykKIHsKLQlyZXR1cm4gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChuYW1lLCBjbywgKGNoYXIgKilOVUxMKTsKKyAgICByZXR1cm4gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChuYW1lLCBjbywgKGNoYXIgKilOVUxMKTsKIH0KIAogUHlPYmplY3QgKgogUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChjaGFyICpuYW1lLCBQeU9iamVjdCAqY28sIGNoYXIgKnBhdGhuYW1lKQogewotCVB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOwotCVB5T2JqZWN0ICptLCAqZCwgKnY7CisgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisgICAgUHlPYmplY3QgKm0sICpkLCAqdjsKIAotCW0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogSWYgdGhlIG1vZHVsZSBpcyBiZWluZyByZWxvYWRlZCwgd2UgZ2V0IHRoZSBvbGQgbW9kdWxlIGJhY2sKLQkgICBhbmQgcmUtdXNlIGl0cyBkaWN0IHRvIGV4ZWMgdGhlIG5ldyBjb2RlLiAqLwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiX19idWlsdGluc19fIikgPT0gTlVMTCkgewotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fYnVpbHRpbnNfXyIsCi0JCQkJCSBQeUV2YWxfR2V0QnVpbHRpbnMoKSkgIT0gMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCS8qIFJlbWVtYmVyIHRoZSBmaWxlbmFtZSBhcyB0aGUgX19maWxlX18gYXR0cmlidXRlICovCi0JdiA9IE5VTEw7Ci0JaWYgKHBhdGhuYW1lICE9IE5VTEwpIHsKLQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocGF0aG5hbWUpOwotCQlpZiAodiA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JaWYgKHYgPT0gTlVMTCkgewotCQl2ID0gKChQeUNvZGVPYmplY3QgKiljbyktPmNvX2ZpbGVuYW1lOwotCQlQeV9JTkNSRUYodik7Ci0JfQotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19maWxlX18iLCB2KSAhPSAwKQotCQlQeUVycl9DbGVhcigpOyAvKiBOb3QgaW1wb3J0YW50IGVub3VnaCB0byByZXBvcnQgKi8KLQlQeV9ERUNSRUYodik7CisgICAgbSA9IFB5SW1wb3J0X0FkZE1vZHVsZShuYW1lKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBJZiB0aGUgbW9kdWxlIGlzIGJlaW5nIHJlbG9hZGVkLCB3ZSBnZXQgdGhlIG9sZCBtb2R1bGUgYmFjaworICAgICAgIGFuZCByZS11c2UgaXRzIGRpY3QgdG8gZXhlYyB0aGUgbmV3IGNvZGUuICovCisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19idWlsdGluc19fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRCdWlsdGlucygpKSAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgLyogUmVtZW1iZXIgdGhlIGZpbGVuYW1lIGFzIHRoZSBfX2ZpbGVfXyBhdHRyaWJ1dGUgKi8KKyAgICB2ID0gTlVMTDsKKyAgICBpZiAocGF0aG5hbWUgIT0gTlVMTCkgeworICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwYXRobmFtZSk7CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIHYgPSAoKFB5Q29kZU9iamVjdCAqKWNvKS0+Y29fZmlsZW5hbWU7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICB9CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIsIHYpICE9IDApCisgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIE5vdCBpbXBvcnRhbnQgZW5vdWdoIHRvIHJlcG9ydCAqLworICAgIFB5X0RFQ1JFRih2KTsKIAotCXYgPSBQeUV2YWxfRXZhbENvZGUoKFB5Q29kZU9iamVjdCAqKWNvLCBkLCBkKTsKLQlpZiAodiA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih2KTsKKyAgICB2ID0gUHlFdmFsX0V2YWxDb2RlKChQeUNvZGVPYmplY3QgKiljbywgZCwgZCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYodik7CiAKLQlpZiAoKG0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKSkgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJMb2FkZWQgbW9kdWxlICUuMjAwcyBub3QgZm91bmQgaW4gc3lzLm1vZHVsZXMiLAotCQkJICAgICBuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgobSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJMb2FkZWQgbW9kdWxlICUuMjAwcyBub3QgZm91bmQgaW4gc3lzLm1vZHVsZXMiLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihtKTsKKyAgICBQeV9JTkNSRUYobSk7CiAKLQlyZXR1cm4gbTsKKyAgICByZXR1cm4gbTsKIAogICBlcnJvcjoKLQlyZW1vdmVfbW9kdWxlKG5hbWUpOwotCXJldHVybiBOVUxMOworICAgIHJlbW92ZV9tb2R1bGUobmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtNzA4LDIxICs3MDgsMjEgQEAKIHN0YXRpYyBjaGFyICoKIG1ha2VfY29tcGlsZWRfcGF0aG5hbWUoY2hhciAqcGF0aG5hbWUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKIHsKLQlzaXplX3QgbGVuID0gc3RybGVuKHBhdGhuYW1lKTsKLQlpZiAobGVuKzIgPiBidWZsZW4pCi0JCXJldHVybiBOVUxMOworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4ocGF0aG5hbWUpOworICAgIGlmIChsZW4rMiA+IGJ1ZmxlbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNpZmRlZiBNU19XSU5ET1dTCi0JLyogVHJlYXQgLnB5dyBhcyBpZiBpdCB3ZXJlIC5weS4gIFRoZSBjYXNlIG9mICIucHl3IiBtdXN0IG1hdGNoCi0JICAgdGhhdCB1c2VkIGluIF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWIuICovCi0JaWYgKGxlbiA+PSA0ICYmIHN0cmNtcCgmcGF0aG5hbWVbbGVuLTRdLCAiLnB5dyIpID09IDApCi0JCS0tbGVuOwkvKiBwcmV0ZW5kICd3JyBpc24ndCB0aGVyZSAqLworICAgIC8qIFRyZWF0IC5weXcgYXMgaWYgaXQgd2VyZSAucHkuICBUaGUgY2FzZSBvZiAiLnB5dyIgbXVzdCBtYXRjaAorICAgICAgIHRoYXQgdXNlZCBpbiBfUHlJbXBvcnRfU3RhbmRhcmRGaWxldGFiLiAqLworICAgIGlmIChsZW4gPj0gNCAmJiBzdHJjbXAoJnBhdGhuYW1lW2xlbi00XSwgIi5weXciKSA9PSAwKQorICAgICAgICAtLWxlbjsgICAgICAgICAgLyogcHJldGVuZCAndycgaXNuJ3QgdGhlcmUgKi8KICNlbmRpZgotCW1lbWNweShidWYsIHBhdGhuYW1lLCBsZW4pOwotCWJ1ZltsZW5dID0gUHlfT3B0aW1pemVGbGFnID8gJ28nIDogJ2MnOwotCWJ1ZltsZW4rMV0gPSAnXDAnOworICAgIG1lbWNweShidWYsIHBhdGhuYW1lLCBsZW4pOworICAgIGJ1ZltsZW5dID0gUHlfT3B0aW1pemVGbGFnID8gJ28nIDogJ2MnOworICAgIGJ1ZltsZW4rMV0gPSAnXDAnOwogCi0JcmV0dXJuIGJ1ZjsKKyAgICByZXR1cm4gYnVmOwogfQogCiAKQEAgLTczNiwzMCArNzM2LDMwIEBACiBzdGF0aWMgRklMRSAqCiBjaGVja19jb21waWxlZF9tb2R1bGUoY2hhciAqcGF0aG5hbWUsIHRpbWVfdCBtdGltZSwgY2hhciAqY3BhdGhuYW1lKQogewotCUZJTEUgKmZwOwotCWxvbmcgbWFnaWM7Ci0JbG9uZyBweWNfbXRpbWU7CisgICAgRklMRSAqZnA7CisgICAgbG9uZyBtYWdpYzsKKyAgICBsb25nIHB5Y19tdGltZTsKIAotCWZwID0gZm9wZW4oY3BhdGhuYW1lLCAicmIiKTsKLQlpZiAoZnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWFnaWMgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7Ci0JaWYgKG1hZ2ljICE9IHB5Y19tYWdpYykgewotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiIyAlcyBoYXMgYmFkIG1hZ2ljXG4iLCBjcGF0aG5hbWUpOwotCQlmY2xvc2UoZnApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcHljX210aW1lID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOwotCWlmIChweWNfbXRpbWUgIT0gbXRpbWUpIHsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgJXMgaGFzIGJhZCBtdGltZVxuIiwgY3BhdGhuYW1lKTsKLQkJZmNsb3NlKGZwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgJXMgbWF0Y2hlcyAlc1xuIiwgY3BhdGhuYW1lLCBwYXRobmFtZSk7Ci0JcmV0dXJuIGZwOworICAgIGZwID0gZm9wZW4oY3BhdGhuYW1lLCAicmIiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFnaWMgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7CisgICAgaWYgKG1hZ2ljICE9IHB5Y19tYWdpYykgeworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyAlcyBoYXMgYmFkIG1hZ2ljXG4iLCBjcGF0aG5hbWUpOworICAgICAgICBmY2xvc2UoZnApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcHljX210aW1lID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOworICAgIGlmIChweWNfbXRpbWUgIT0gbXRpbWUpIHsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgJXMgaGFzIGJhZCBtdGltZVxuIiwgY3BhdGhuYW1lKTsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgJXMgbWF0Y2hlcyAlc1xuIiwgY3BhdGhuYW1lLCBwYXRobmFtZSk7CisgICAgcmV0dXJuIGZwOwogfQogCiAKQEAgLTc2OCwxOCArNzY4LDE4IEBACiBzdGF0aWMgUHlDb2RlT2JqZWN0ICoKIHJlYWRfY29tcGlsZWRfbW9kdWxlKGNoYXIgKmNwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JUHlPYmplY3QgKmNvOworICAgIFB5T2JqZWN0ICpjbzsKIAotCWNvID0gUHlNYXJzaGFsX1JlYWRMYXN0T2JqZWN0RnJvbUZpbGUoZnApOwotCWlmIChjbyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5Q29kZV9DaGVjayhjbykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJICAgICAiTm9uLWNvZGUgb2JqZWN0IGluICUuMjAwcyIsIGNwYXRobmFtZSk7Ci0JCVB5X0RFQ1JFRihjbyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5Q29kZU9iamVjdCAqKWNvOworICAgIGNvID0gUHlNYXJzaGFsX1JlYWRMYXN0T2JqZWN0RnJvbUZpbGUoZnApOworICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5Q29kZV9DaGVjayhjbykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIk5vbi1jb2RlIG9iamVjdCBpbiAlLjIwMHMiLCBjcGF0aG5hbWUpOworICAgICAgICBQeV9ERUNSRUYoY28pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeUNvZGVPYmplY3QgKiljbzsKIH0KIAogCkBAIC03ODksMjcgKzc4OSwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxvYWRfY29tcGlsZWRfbW9kdWxlKGNoYXIgKm5hbWUsIGNoYXIgKmNwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JbG9uZyBtYWdpYzsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5T2JqZWN0ICptOworICAgIGxvbmcgbWFnaWM7CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKKyAgICBQeU9iamVjdCAqbTsKIAotCW1hZ2ljID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOwotCWlmIChtYWdpYyAhPSBweWNfbWFnaWMpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJICAgICAiQmFkIG1hZ2ljIG51bWJlciBpbiAlLjIwMHMiLCBjcGF0aG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKHZvaWQpIFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQljbyA9IHJlYWRfY29tcGlsZWRfbW9kdWxlKGNwYXRobmFtZSwgZnApOwotCWlmIChjbyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCVB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBwcmVjb21waWxlZCBmcm9tICVzXG4iLAotCQkJbmFtZSwgY3BhdGhuYW1lKTsKLQltID0gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChuYW1lLCAoUHlPYmplY3QgKiljbywgY3BhdGhuYW1lKTsKLQlQeV9ERUNSRUYoY28pOworICAgIG1hZ2ljID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOworICAgIGlmIChtYWdpYyAhPSBweWNfbWFnaWMpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkJhZCBtYWdpYyBudW1iZXIgaW4gJS4yMDBzIiwgY3BhdGhuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICh2b2lkKSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7CisgICAgY28gPSByZWFkX2NvbXBpbGVkX21vZHVsZShjcGF0aG5hbWUsIGZwKTsKKyAgICBpZiAoY28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgcHJlY29tcGlsZWQgZnJvbSAlc1xuIiwKKyAgICAgICAgICAgIG5hbWUsIGNwYXRobmFtZSk7CisgICAgbSA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgobmFtZSwgKFB5T2JqZWN0ICopY28sIGNwYXRobmFtZSk7CisgICAgUHlfREVDUkVGKGNvKTsKIAotCXJldHVybiBtOworICAgIHJldHVybiBtOwogfQogCiAvKiBQYXJzZSBhIHNvdXJjZSBmaWxlIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBvYmplY3QgKi8KQEAgLTgxNywyMiArODE3LDIyIEBACiBzdGF0aWMgUHlDb2RlT2JqZWN0ICoKIHBhcnNlX3NvdXJjZV9tb2R1bGUoY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQogewotCVB5Q29kZU9iamVjdCAqY28gPSBOVUxMOwotCW1vZF90eSBtb2Q7Ci0JUHlDb21waWxlckZsYWdzIGZsYWdzOwotCVB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKLQlpZiAoYXJlbmEgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlDb2RlT2JqZWN0ICpjbyA9IE5VTEw7CisgICAgbW9kX3R5IG1vZDsKKyAgICBQeUNvbXBpbGVyRmxhZ3MgZmxhZ3M7CisgICAgUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOworICAgIGlmIChhcmVuYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZsYWdzLmNmX2ZsYWdzID0gMDsKKyAgICBmbGFncy5jZl9mbGFncyA9IDA7CiAKLQltb2QgPSBQeVBhcnNlcl9BU1RGcm9tRmlsZShmcCwgcGF0aG5hbWUsIFB5X2ZpbGVfaW5wdXQsIDAsIDAsICZmbGFncywKLQkJCQkgICBOVUxMLCBhcmVuYSk7Ci0JaWYgKG1vZCkgewotCQljbyA9IFB5QVNUX0NvbXBpbGUobW9kLCBwYXRobmFtZSwgTlVMTCwgYXJlbmEpOwotCX0KLQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwotCXJldHVybiBjbzsKKyAgICBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tRmlsZShmcCwgcGF0aG5hbWUsIFB5X2ZpbGVfaW5wdXQsIDAsIDAsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBhcmVuYSk7CisgICAgaWYgKG1vZCkgeworICAgICAgICBjbyA9IFB5QVNUX0NvbXBpbGUobW9kLCBwYXRobmFtZSwgTlVMTCwgYXJlbmEpOworICAgIH0KKyAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgIHJldHVybiBjbzsKIH0KIAogCkBAIC04NDIsMzAgKzg0MiwzMCBAQAogb3Blbl9leGNsdXNpdmUoY2hhciAqZmlsZW5hbWUsIG1vZGVfdCBtb2RlKQogewogI2lmIGRlZmluZWQoT19FWENMKSYmZGVmaW5lZChPX0NSRUFUKSYmZGVmaW5lZChPX1dST05MWSkmJmRlZmluZWQoT19UUlVOQykKLQkvKiBVc2UgT19FWENMIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlbiBhbm90aGVyIHByb2Nlc3MgdHJpZXMgdG8KLQkgICB3cml0ZSB0aGUgc2FtZSBmaWxlLiAgV2hlbiB0aGF0IGhhcHBlbnMsIG91ciBvcGVuKCkgY2FsbCBmYWlscywKLQkgICB3aGljaCBpcyBqdXN0IGZpbmUgKHNpbmNlIGl0J3Mgb25seSBhIGNhY2hlKS4KLQkgICBYWFggSWYgdGhlIGZpbGUgZXhpc3RzIGFuZCBpcyB3cml0YWJsZSBidXQgdGhlIGRpcmVjdG9yeSBpcyBub3QKLQkgICB3cml0YWJsZSwgdGhlIGZpbGUgd2lsbCBuZXZlciBiZSB3cml0dGVuLiAgT2ggd2VsbC4KLQkqLwotCWludCBmZDsKLQkodm9pZCkgdW5saW5rKGZpbGVuYW1lKTsKLQlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fRVhDTHxPX0NSRUFUfE9fV1JPTkxZfE9fVFJVTkMKKyAgICAvKiBVc2UgT19FWENMIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlbiBhbm90aGVyIHByb2Nlc3MgdHJpZXMgdG8KKyAgICAgICB3cml0ZSB0aGUgc2FtZSBmaWxlLiAgV2hlbiB0aGF0IGhhcHBlbnMsIG91ciBvcGVuKCkgY2FsbCBmYWlscywKKyAgICAgICB3aGljaCBpcyBqdXN0IGZpbmUgKHNpbmNlIGl0J3Mgb25seSBhIGNhY2hlKS4KKyAgICAgICBYWFggSWYgdGhlIGZpbGUgZXhpc3RzIGFuZCBpcyB3cml0YWJsZSBidXQgdGhlIGRpcmVjdG9yeSBpcyBub3QKKyAgICAgICB3cml0YWJsZSwgdGhlIGZpbGUgd2lsbCBuZXZlciBiZSB3cml0dGVuLiAgT2ggd2VsbC4KKyAgICAqLworICAgIGludCBmZDsKKyAgICAodm9pZCkgdW5saW5rKGZpbGVuYW1lKTsKKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fRVhDTHxPX0NSRUFUfE9fV1JPTkxZfE9fVFJVTkMKICNpZmRlZiBPX0JJTkFSWQotCQkJCXxPX0JJTkFSWSAgIC8qIG5lY2Vzc2FyeSBmb3IgV2luZG93cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxPX0JJTkFSWSAgIC8qIG5lY2Vzc2FyeSBmb3IgV2luZG93cyAqLwogI2VuZGlmCiAjaWZkZWYgX19WTVMKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbW9kZSwgImN0eHQ9YmluIiwgInNocj1uaWwiCisgICAgICAgICAgICAsIG1vZGUsICJjdHh0PWJpbiIsICJzaHI9bmlsIgogI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbW9kZQorICAgICAgICAgICAgLCBtb2RlCiAjZW5kaWYKLQkJICApOwotCWlmIChmZCA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBmZG9wZW4oZmQsICJ3YiIpOworICAgICAgICAgICk7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGZkb3BlbihmZCwgIndiIik7CiAjZWxzZQotCS8qIEJlc3Qgd2UgY2FuIGRvIC0tIG9uIFdpbmRvd3MgdGhpcyBjYW4ndCBoYXBwZW4gYW55d2F5ICovCi0JcmV0dXJuIGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKKyAgICAvKiBCZXN0IHdlIGNhbiBkbyAtLSBvbiBXaW5kb3dzIHRoaXMgY2FuJ3QgaGFwcGVuIGFueXdheSAqLworICAgIHJldHVybiBmb3BlbihmaWxlbmFtZSwgIndiIik7CiAjZW5kaWYKIH0KIApAQCAtODc4LDg1ICs4NzgsODUgQEAKIHN0YXRpYyB2b2lkCiB3cml0ZV9jb21waWxlZF9tb2R1bGUoUHlDb2RlT2JqZWN0ICpjbywgY2hhciAqY3BhdGhuYW1lLCBzdHJ1Y3Qgc3RhdCAqc3Jjc3RhdCkKIHsKLQlGSUxFICpmcDsKLQl0aW1lX3QgbXRpbWUgPSBzcmNzdGF0LT5zdF9tdGltZTsKKyAgICBGSUxFICpmcDsKKyAgICB0aW1lX3QgbXRpbWUgPSBzcmNzdGF0LT5zdF9tdGltZTsKICNpZmRlZiBNU19XSU5ET1dTICAgLyogc2luY2UgV2luZG93cyB1c2VzIGRpZmZlcmVudCBwZXJtaXNzaW9ucyAgKi8KLQltb2RlX3QgbW9kZSA9IHNyY3N0YXQtPnN0X21vZGUgJiB+U19JRVhFQzsKKyAgICBtb2RlX3QgbW9kZSA9IHNyY3N0YXQtPnN0X21vZGUgJiB+U19JRVhFQzsKICNlbHNlCi0JbW9kZV90IG1vZGUgPSBzcmNzdGF0LT5zdF9tb2RlICYgflNfSVhVU1IgJiB+U19JWEdSUCAmIH5TX0lYT1RIOworICAgIG1vZGVfdCBtb2RlID0gc3Jjc3RhdC0+c3RfbW9kZSAmIH5TX0lYVVNSICYgflNfSVhHUlAgJiB+U19JWE9USDsKICNlbmRpZgogCi0JZnAgPSBvcGVuX2V4Y2x1c2l2ZShjcGF0aG5hbWUsIG1vZGUpOwotCWlmIChmcCA9PSBOVUxMKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKAotCQkJCSIjIGNhbid0IGNyZWF0ZSAlc1xuIiwgY3BhdGhuYW1lKTsKLQkJcmV0dXJuOwotCX0KLQlQeU1hcnNoYWxfV3JpdGVMb25nVG9GaWxlKHB5Y19tYWdpYywgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7Ci0JLyogRmlyc3Qgd3JpdGUgYSAwIGZvciBtdGltZSAqLwotCVB5TWFyc2hhbF9Xcml0ZUxvbmdUb0ZpbGUoMEwsIGZwLCBQeV9NQVJTSEFMX1ZFUlNJT04pOwotCVB5TWFyc2hhbF9Xcml0ZU9iamVjdFRvRmlsZSgoUHlPYmplY3QgKiljbywgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7Ci0JaWYgKGZmbHVzaChmcCkgIT0gMCB8fCBmZXJyb3IoZnApKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIGNhbid0IHdyaXRlICVzXG4iLCBjcGF0aG5hbWUpOwotCQkvKiBEb24ndCBrZWVwIHBhcnRpYWwgZmlsZSAqLwotCQlmY2xvc2UoZnApOwotCQkodm9pZCkgdW5saW5rKGNwYXRobmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0JLyogTm93IHdyaXRlIHRoZSB0cnVlIG10aW1lICovCi0JZnNlZWsoZnAsIDRMLCAwKTsKLQlhc3NlcnQobXRpbWUgPCBMT05HX01BWCk7Ci0JUHlNYXJzaGFsX1dyaXRlTG9uZ1RvRmlsZSgobG9uZyltdGltZSwgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7Ci0JZmZsdXNoKGZwKTsKLQlmY2xvc2UoZnApOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgd3JvdGUgJXNcbiIsIGNwYXRobmFtZSk7CisgICAgZnAgPSBvcGVuX2V4Y2x1c2l2ZShjcGF0aG5hbWUsIG1vZGUpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKAorICAgICAgICAgICAgICAgICIjIGNhbid0IGNyZWF0ZSAlc1xuIiwgY3BhdGhuYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQeU1hcnNoYWxfV3JpdGVMb25nVG9GaWxlKHB5Y19tYWdpYywgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7CisgICAgLyogRmlyc3Qgd3JpdGUgYSAwIGZvciBtdGltZSAqLworICAgIFB5TWFyc2hhbF9Xcml0ZUxvbmdUb0ZpbGUoMEwsIGZwLCBQeV9NQVJTSEFMX1ZFUlNJT04pOworICAgIFB5TWFyc2hhbF9Xcml0ZU9iamVjdFRvRmlsZSgoUHlPYmplY3QgKiljbywgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7CisgICAgaWYgKGZmbHVzaChmcCkgIT0gMCB8fCBmZXJyb3IoZnApKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIGNhbid0IHdyaXRlICVzXG4iLCBjcGF0aG5hbWUpOworICAgICAgICAvKiBEb24ndCBrZWVwIHBhcnRpYWwgZmlsZSAqLworICAgICAgICBmY2xvc2UoZnApOworICAgICAgICAodm9pZCkgdW5saW5rKGNwYXRobmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogTm93IHdyaXRlIHRoZSB0cnVlIG10aW1lICovCisgICAgZnNlZWsoZnAsIDRMLCAwKTsKKyAgICBhc3NlcnQobXRpbWUgPCBMT05HX01BWCk7CisgICAgUHlNYXJzaGFsX1dyaXRlTG9uZ1RvRmlsZSgobG9uZyltdGltZSwgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7CisgICAgZmZsdXNoKGZwKTsKKyAgICBmY2xvc2UoZnApOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgd3JvdGUgJXNcbiIsIGNwYXRobmFtZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiB1cGRhdGVfY29kZV9maWxlbmFtZXMoUHlDb2RlT2JqZWN0ICpjbywgUHlPYmplY3QgKm9sZG5hbWUsIFB5T2JqZWN0ICpuZXduYW1lKQogewotCVB5T2JqZWN0ICpjb25zdGFudHMsICp0bXA7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICpjb25zdGFudHMsICp0bXA7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JaWYgKCFfUHlTdHJpbmdfRXEoY28tPmNvX2ZpbGVuYW1lLCBvbGRuYW1lKSkKLQkJcmV0dXJuOworICAgIGlmICghX1B5U3RyaW5nX0VxKGNvLT5jb19maWxlbmFtZSwgb2xkbmFtZSkpCisgICAgICAgIHJldHVybjsKIAotCXRtcCA9IGNvLT5jb19maWxlbmFtZTsKLQljby0+Y29fZmlsZW5hbWUgPSBuZXduYW1lOwotCVB5X0lOQ1JFRihjby0+Y29fZmlsZW5hbWUpOwotCVB5X0RFQ1JFRih0bXApOworICAgIHRtcCA9IGNvLT5jb19maWxlbmFtZTsKKyAgICBjby0+Y29fZmlsZW5hbWUgPSBuZXduYW1lOworICAgIFB5X0lOQ1JFRihjby0+Y29fZmlsZW5hbWUpOworICAgIFB5X0RFQ1JFRih0bXApOwogCi0JY29uc3RhbnRzID0gY28tPmNvX2NvbnN0czsKLQluID0gUHlUdXBsZV9HRVRfU0laRShjb25zdGFudHMpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJdG1wID0gUHlUdXBsZV9HRVRfSVRFTShjb25zdGFudHMsIGkpOwotCQlpZiAoUHlDb2RlX0NoZWNrKHRtcCkpCi0JCQl1cGRhdGVfY29kZV9maWxlbmFtZXMoKFB5Q29kZU9iamVjdCAqKXRtcCwKLQkJCQkJICAgICAgb2xkbmFtZSwgbmV3bmFtZSk7Ci0JfQorICAgIGNvbnN0YW50cyA9IGNvLT5jb19jb25zdHM7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoY29uc3RhbnRzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHRtcCA9IFB5VHVwbGVfR0VUX0lURU0oY29uc3RhbnRzLCBpKTsKKyAgICAgICAgaWYgKFB5Q29kZV9DaGVjayh0bXApKQorICAgICAgICAgICAgdXBkYXRlX2NvZGVfZmlsZW5hbWVzKChQeUNvZGVPYmplY3QgKil0bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkbmFtZSwgbmV3bmFtZSk7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiB1cGRhdGVfY29tcGlsZWRfbW9kdWxlKFB5Q29kZU9iamVjdCAqY28sIGNoYXIgKnBhdGhuYW1lKQogewotCVB5T2JqZWN0ICpvbGRuYW1lLCAqbmV3bmFtZTsKKyAgICBQeU9iamVjdCAqb2xkbmFtZSwgKm5ld25hbWU7CiAKLQlpZiAoc3RyY21wKFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19maWxlbmFtZSksIHBhdGhuYW1lKSA9PSAwKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoc3RyY21wKFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19maWxlbmFtZSksIHBhdGhuYW1lKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKIAotCW5ld25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHBhdGhuYW1lKTsKLQlpZiAobmV3bmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgbmV3bmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocGF0aG5hbWUpOworICAgIGlmIChuZXduYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCW9sZG5hbWUgPSBjby0+Y29fZmlsZW5hbWU7Ci0JUHlfSU5DUkVGKG9sZG5hbWUpOwotCXVwZGF0ZV9jb2RlX2ZpbGVuYW1lcyhjbywgb2xkbmFtZSwgbmV3bmFtZSk7Ci0JUHlfREVDUkVGKG9sZG5hbWUpOwotCVB5X0RFQ1JFRihuZXduYW1lKTsKLQlyZXR1cm4gMTsKKyAgICBvbGRuYW1lID0gY28tPmNvX2ZpbGVuYW1lOworICAgIFB5X0lOQ1JFRihvbGRuYW1lKTsKKyAgICB1cGRhdGVfY29kZV9maWxlbmFtZXMoY28sIG9sZG5hbWUsIG5ld25hbWUpOworICAgIFB5X0RFQ1JFRihvbGRuYW1lKTsKKyAgICBQeV9ERUNSRUYobmV3bmFtZSk7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIExvYWQgYSBzb3VyY2UgbW9kdWxlIGZyb20gYSBnaXZlbiBmaWxlIGFuZCByZXR1cm4gaXRzIG1vZHVsZQpAQCAtOTY2LDY5ICs5NjYsNjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkX3NvdXJjZV9tb2R1bGUoY2hhciAqbmFtZSwgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQogewotCXN0cnVjdCBzdGF0IHN0OwotCUZJTEUgKmZwYzsKLQljaGFyIGJ1ZltNQVhQQVRITEVOKzFdOwotCWNoYXIgKmNwYXRobmFtZTsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5T2JqZWN0ICptOworICAgIHN0cnVjdCBzdGF0IHN0OworICAgIEZJTEUgKmZwYzsKKyAgICBjaGFyIGJ1ZltNQVhQQVRITEVOKzFdOworICAgIGNoYXIgKmNwYXRobmFtZTsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIFB5T2JqZWN0ICptOwogCi0JaWYgKGZzdGF0KGZpbGVubyhmcCksICZzdCkgIT0gMCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgICAidW5hYmxlIHRvIGdldCBmaWxlIHN0YXR1cyBmcm9tICclcyciLAotCQkJICAgICBwYXRobmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZnN0YXQoZmlsZW5vKGZwKSwgJnN0KSAhPSAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGdldCBmaWxlIHN0YXR1cyBmcm9tICclcyciLAorICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjaWYgU0laRU9GX1RJTUVfVCA+IDQKLQkvKiBQeXRob24ncyAucHljIHRpbWVzdGFtcCBoYW5kbGluZyBwcmVzdW1lcyB0aGF0IHRoZSB0aW1lc3RhbXAgZml0cwotCSAgIGluIDQgYnl0ZXMuIFRoaXMgd2lsbCBiZSBmaW5lIHVudGlsIHNvbWV0aW1lIGluIHRoZSB5ZWFyIDIwMzgsCi0JICAgd2hlbiBhIDQtYnl0ZSBzaWduZWQgdGltZV90IHdpbGwgb3ZlcmZsb3cuCi0JICovCi0JaWYgKHN0LnN0X210aW1lID4+IDMyKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJIm1vZGlmaWNhdGlvbiB0aW1lIG92ZXJmbG93cyBhIDQgYnl0ZSBmaWVsZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogUHl0aG9uJ3MgLnB5YyB0aW1lc3RhbXAgaGFuZGxpbmcgcHJlc3VtZXMgdGhhdCB0aGUgdGltZXN0YW1wIGZpdHMKKyAgICAgICBpbiA0IGJ5dGVzLiBUaGlzIHdpbGwgYmUgZmluZSB1bnRpbCBzb21ldGltZSBpbiB0aGUgeWVhciAyMDM4LAorICAgICAgIHdoZW4gYSA0LWJ5dGUgc2lnbmVkIHRpbWVfdCB3aWxsIG92ZXJmbG93LgorICAgICAqLworICAgIGlmIChzdC5zdF9tdGltZSA+PiAzMikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJtb2RpZmljYXRpb24gdGltZSBvdmVyZmxvd3MgYSA0IGJ5dGUgZmllbGQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JY3BhdGhuYW1lID0gbWFrZV9jb21waWxlZF9wYXRobmFtZShwYXRobmFtZSwgYnVmLAotCQkJCQkgICAoc2l6ZV90KU1BWFBBVEhMRU4gKyAxKTsKLQlpZiAoY3BhdGhuYW1lICE9IE5VTEwgJiYKLQkgICAgKGZwYyA9IGNoZWNrX2NvbXBpbGVkX21vZHVsZShwYXRobmFtZSwgc3Quc3RfbXRpbWUsIGNwYXRobmFtZSkpKSB7Ci0JCWNvID0gcmVhZF9jb21waWxlZF9tb2R1bGUoY3BhdGhuYW1lLCBmcGMpOwotCQlmY2xvc2UoZnBjKTsKLQkJaWYgKGNvID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKHVwZGF0ZV9jb21waWxlZF9tb2R1bGUoY28sIHBhdGhuYW1lKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIHByZWNvbXBpbGVkIGZyb20gJXNcbiIsCi0JCQkJbmFtZSwgY3BhdGhuYW1lKTsKLQkJcGF0aG5hbWUgPSBjcGF0aG5hbWU7Ci0JfQotCWVsc2UgewotCQljbyA9IHBhcnNlX3NvdXJjZV9tb2R1bGUocGF0aG5hbWUsIGZwKTsKLQkJaWYgKGNvID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGZyb20gJXNcbiIsCi0JCQkJbmFtZSwgcGF0aG5hbWUpOwotCQlpZiAoY3BhdGhuYW1lKSB7Ci0JCQlQeU9iamVjdCAqcm8gPSBQeVN5c19HZXRPYmplY3QoImRvbnRfd3JpdGVfYnl0ZWNvZGUiKTsKLQkJCWlmIChybyA9PSBOVUxMIHx8ICFQeU9iamVjdF9Jc1RydWUocm8pKQotCQkJCXdyaXRlX2NvbXBpbGVkX21vZHVsZShjbywgY3BhdGhuYW1lLCAmc3QpOwotCQl9Ci0JfQotCW0gPSBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KG5hbWUsIChQeU9iamVjdCAqKWNvLCBwYXRobmFtZSk7Ci0JUHlfREVDUkVGKGNvKTsKKyAgICBjcGF0aG5hbWUgPSBtYWtlX2NvbXBpbGVkX3BhdGhuYW1lKHBhdGhuYW1lLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KU1BWFBBVEhMRU4gKyAxKTsKKyAgICBpZiAoY3BhdGhuYW1lICE9IE5VTEwgJiYKKyAgICAgICAgKGZwYyA9IGNoZWNrX2NvbXBpbGVkX21vZHVsZShwYXRobmFtZSwgc3Quc3RfbXRpbWUsIGNwYXRobmFtZSkpKSB7CisgICAgICAgIGNvID0gcmVhZF9jb21waWxlZF9tb2R1bGUoY3BhdGhuYW1lLCBmcGMpOworICAgICAgICBmY2xvc2UoZnBjKTsKKyAgICAgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHVwZGF0ZV9jb21waWxlZF9tb2R1bGUoY28sIHBhdGhuYW1lKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIHByZWNvbXBpbGVkIGZyb20gJXNcbiIsCisgICAgICAgICAgICAgICAgbmFtZSwgY3BhdGhuYW1lKTsKKyAgICAgICAgcGF0aG5hbWUgPSBjcGF0aG5hbWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjbyA9IHBhcnNlX3NvdXJjZV9tb2R1bGUocGF0aG5hbWUsIGZwKTsKKyAgICAgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGZyb20gJXNcbiIsCisgICAgICAgICAgICAgICAgbmFtZSwgcGF0aG5hbWUpOworICAgICAgICBpZiAoY3BhdGhuYW1lKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqcm8gPSBQeVN5c19HZXRPYmplY3QoImRvbnRfd3JpdGVfYnl0ZWNvZGUiKTsKKyAgICAgICAgICAgIGlmIChybyA9PSBOVUxMIHx8ICFQeU9iamVjdF9Jc1RydWUocm8pKQorICAgICAgICAgICAgICAgIHdyaXRlX2NvbXBpbGVkX21vZHVsZShjbywgY3BhdGhuYW1lLCAmc3QpOworICAgICAgICB9CisgICAgfQorICAgIG0gPSBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KG5hbWUsIChQeU9iamVjdCAqKWNvLCBwYXRobmFtZSk7CisgICAgUHlfREVDUkVGKGNvKTsKIAotCXJldHVybiBtOworICAgIHJldHVybiBtOwogfQogCiAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyBQeU9iamVjdCAqbG9hZF9tb2R1bGUoY2hhciAqLCBGSUxFICosIGNoYXIgKiwgaW50LCBQeU9iamVjdCAqKTsKIHN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyICpmaW5kX21vZHVsZShjaGFyICosIGNoYXIgKiwgUHlPYmplY3QgKiwKLQkJCQkgICAgIGNoYXIgKiwgc2l6ZV90LCBGSUxFICoqLCBQeU9iamVjdCAqKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBzaXplX3QsIEZJTEUgKiosIFB5T2JqZWN0ICoqKTsKIHN0YXRpYyBzdHJ1Y3QgX2Zyb3plbiAqZmluZF9mcm96ZW4oY2hhciAqbmFtZSk7CiAKIC8qIExvYWQgYSBwYWNrYWdlIGFuZCByZXR1cm4gaXRzIG1vZHVsZSBvYmplY3QgV0lUSCBJTkNSRU1FTlRFRApAQCAtMTAzNyw1NCArMTAzNyw1NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxvYWRfcGFja2FnZShjaGFyICpuYW1lLCBjaGFyICpwYXRobmFtZSkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JUHlPYmplY3QgKmZpbGUgPSBOVUxMOwotCVB5T2JqZWN0ICpwYXRoID0gTlVMTDsKLQlpbnQgZXJyOwotCWNoYXIgYnVmW01BWFBBVEhMRU4rMV07Ci0JRklMRSAqZnAgPSBOVUxMOwotCXN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CisgICAgUHlPYmplY3QgKmZpbGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpwYXRoID0gTlVMTDsKKyAgICBpbnQgZXJyOworICAgIGNoYXIgYnVmW01BWFBBVEhMRU4rMV07CisgICAgRklMRSAqZnAgPSBOVUxMOworICAgIHN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKIAotCW0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgZGlyZWN0b3J5ICVzXG4iLAotCQkJbmFtZSwgcGF0aG5hbWUpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWZpbGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHBhdGhuYW1lKTsKLQlpZiAoZmlsZSA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCXBhdGggPSBQeV9CdWlsZFZhbHVlKCJbT10iLCBmaWxlKTsKLQlpZiAocGF0aCA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCWVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIsIGZpbGUpOwotCWlmIChlcnIgPT0gMCkKLQkJZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fcGF0aF9fIiwgcGF0aCk7Ci0JaWYgKGVyciAhPSAwKQotCQlnb3RvIGVycm9yOwotCWJ1ZlswXSA9ICdcMCc7Ci0JZmRwID0gZmluZF9tb2R1bGUobmFtZSwgIl9faW5pdF9fIiwgcGF0aCwgYnVmLCBzaXplb2YoYnVmKSwgJmZwLCBOVUxMKTsKLQlpZiAoZmRwID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJUHlfSU5DUkVGKG0pOwotCQl9Ci0JCWVsc2UKLQkJCW0gPSBOVUxMOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCW0gPSBsb2FkX21vZHVsZShuYW1lLCBmcCwgYnVmLCBmZHAtPnR5cGUsIE5VTEwpOwotCWlmIChmcCAhPSBOVUxMKQotCQlmY2xvc2UoZnApOwotCWdvdG8gY2xlYW51cDsKKyAgICBtID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGRpcmVjdG9yeSAlc1xuIiwKKyAgICAgICAgICAgIG5hbWUsIHBhdGhuYW1lKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBmaWxlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwYXRobmFtZSk7CisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBwYXRoID0gUHlfQnVpbGRWYWx1ZSgiW09dIiwgZmlsZSk7CisgICAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBlcnIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19maWxlX18iLCBmaWxlKTsKKyAgICBpZiAoZXJyID09IDApCisgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX3BhdGhfXyIsIHBhdGgpOworICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBidWZbMF0gPSAnXDAnOworICAgIGZkcCA9IGZpbmRfbW9kdWxlKG5hbWUsICJfX2luaXRfXyIsIHBhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZmcCwgTlVMTCk7CisgICAgaWYgKGZkcCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBtID0gTlVMTDsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyAgICBtID0gbG9hZF9tb2R1bGUobmFtZSwgZnAsIGJ1ZiwgZmRwLT50eXBlLCBOVUxMKTsKKyAgICBpZiAoZnAgIT0gTlVMTCkKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICBnb3RvIGNsZWFudXA7CiAKICAgZXJyb3I6Ci0gIAltID0gTlVMTDsKKyAgICBtID0gTlVMTDsKICAgY2xlYW51cDoKLQlQeV9YREVDUkVGKHBhdGgpOwotCVB5X1hERUNSRUYoZmlsZSk7Ci0JcmV0dXJuIG07CisgICAgUHlfWERFQ1JFRihwYXRoKTsKKyAgICBQeV9YREVDUkVGKGZpbGUpOworICAgIHJldHVybiBtOwogfQogCiAKQEAgLTEwOTMsMTYgKzEwOTMsMTYgQEAKIHN0YXRpYyBpbnQKIGlzX2J1aWx0aW4oY2hhciAqbmFtZSkKIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7Ci0JCWlmIChzdHJjbXAobmFtZSwgUHlJbXBvcnRfSW5pdHRhYltpXS5uYW1lKSA9PSAwKSB7Ci0JCQlpZiAoUHlJbXBvcnRfSW5pdHRhYltpXS5pbml0ZnVuYyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgUHlJbXBvcnRfSW5pdHRhYltpXS5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoUHlJbXBvcnRfSW5pdHRhYltpXS5pbml0ZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0xMTE2LDcyICsxMTE2LDcyIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcGF0aF9pbXBvcnRlcihQeU9iamVjdCAqcGF0aF9pbXBvcnRlcl9jYWNoZSwgUHlPYmplY3QgKnBhdGhfaG9va3MsCi0JCSAgUHlPYmplY3QgKnApCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcCkKIHsKLQlQeU9iamVjdCAqaW1wb3J0ZXI7Ci0JUHlfc3NpemVfdCBqLCBuaG9va3M7CisgICAgUHlPYmplY3QgKmltcG9ydGVyOworICAgIFB5X3NzaXplX3Qgaiwgbmhvb2tzOwogCi0JLyogVGhlc2UgY29uZGl0aW9ucyBhcmUgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5OiAqLwotCWFzc2VydChQeUxpc3RfQ2hlY2socGF0aF9ob29rcykpOwotCWFzc2VydChQeURpY3RfQ2hlY2socGF0aF9pbXBvcnRlcl9jYWNoZSkpOworICAgIC8qIFRoZXNlIGNvbmRpdGlvbnMgYXJlIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eTogKi8KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKHBhdGhfaG9va3MpKTsKKyAgICBhc3NlcnQoUHlEaWN0X0NoZWNrKHBhdGhfaW1wb3J0ZXJfY2FjaGUpKTsKIAotCW5ob29rcyA9IFB5TGlzdF9TaXplKHBhdGhfaG9va3MpOwotCWlmIChuaG9va3MgPCAwKQotCQlyZXR1cm4gTlVMTDsgLyogU2hvdWxkbid0IGhhcHBlbiAqLworICAgIG5ob29rcyA9IFB5TGlzdF9TaXplKHBhdGhfaG9va3MpOworICAgIGlmIChuaG9va3MgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsgLyogU2hvdWxkbid0IGhhcHBlbiAqLwogCi0JaW1wb3J0ZXIgPSBQeURpY3RfR2V0SXRlbShwYXRoX2ltcG9ydGVyX2NhY2hlLCBwKTsKLQlpZiAoaW1wb3J0ZXIgIT0gTlVMTCkKLQkJcmV0dXJuIGltcG9ydGVyOworICAgIGltcG9ydGVyID0gUHlEaWN0X0dldEl0ZW0ocGF0aF9pbXBvcnRlcl9jYWNoZSwgcCk7CisgICAgaWYgKGltcG9ydGVyICE9IE5VTEwpCisgICAgICAgIHJldHVybiBpbXBvcnRlcjsKIAotCS8qIHNldCBwYXRoX2ltcG9ydGVyX2NhY2hlW3BdIHRvIE5vbmUgdG8gYXZvaWQgcmVjdXJzaW9uICovCi0JaWYgKFB5RGljdF9TZXRJdGVtKHBhdGhfaW1wb3J0ZXJfY2FjaGUsIHAsIFB5X05vbmUpICE9IDApCi0JCXJldHVybiBOVUxMOworICAgIC8qIHNldCBwYXRoX2ltcG9ydGVyX2NhY2hlW3BdIHRvIE5vbmUgdG8gYXZvaWQgcmVjdXJzaW9uICovCisgICAgaWYgKFB5RGljdF9TZXRJdGVtKHBhdGhfaW1wb3J0ZXJfY2FjaGUsIHAsIFB5X05vbmUpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChqID0gMDsgaiA8IG5ob29rczsgaisrKSB7Ci0JCVB5T2JqZWN0ICpob29rID0gUHlMaXN0X0dldEl0ZW0ocGF0aF9ob29rcywgaik7Ci0JCWlmIChob29rID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaW1wb3J0ZXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGhvb2ssIHAsIE5VTEwpOwotCQlpZiAoaW1wb3J0ZXIgIT0gTlVMTCkKLQkJCWJyZWFrOworICAgIGZvciAoaiA9IDA7IGogPCBuaG9va3M7IGorKykgeworICAgICAgICBQeU9iamVjdCAqaG9vayA9IFB5TGlzdF9HZXRJdGVtKHBhdGhfaG9va3MsIGopOworICAgICAgICBpZiAoaG9vayA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGltcG9ydGVyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhob29rLCBwLCBOVUxMKTsKKyAgICAgICAgaWYgKGltcG9ydGVyICE9IE5VTEwpCisgICAgICAgICAgICBicmVhazsKIAotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeUVycl9DbGVhcigpOwotCX0KLQlpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgewotCQlpbXBvcnRlciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCi0JCQkoUHlPYmplY3QgKikmUHlOdWxsSW1wb3J0ZXJfVHlwZSwgcCwgTlVMTAotCQkpOwotCQlpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlyZXR1cm4gUHlfTm9uZTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoaW1wb3J0ZXIgIT0gTlVMTCkgewotCQlpbnQgZXJyID0gUHlEaWN0X1NldEl0ZW0ocGF0aF9pbXBvcnRlcl9jYWNoZSwgcCwgaW1wb3J0ZXIpOwotCQlQeV9ERUNSRUYoaW1wb3J0ZXIpOwotCQlpZiAoZXJyICE9IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGltcG9ydGVyOworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgeworICAgICAgICBpbXBvcnRlciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCisgICAgICAgICAgICAoUHlPYmplY3QgKikmUHlOdWxsSW1wb3J0ZXJfVHlwZSwgcCwgTlVMTAorICAgICAgICApOworICAgICAgICBpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW1wb3J0ZXIgIT0gTlVMTCkgeworICAgICAgICBpbnQgZXJyID0gUHlEaWN0X1NldEl0ZW0ocGF0aF9pbXBvcnRlcl9jYWNoZSwgcCwgaW1wb3J0ZXIpOworICAgICAgICBQeV9ERUNSRUYoaW1wb3J0ZXIpOworICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGltcG9ydGVyOwogfQogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopCiBQeUltcG9ydF9HZXRJbXBvcnRlcihQeU9iamVjdCAqcGF0aCkgewotICAgICAgICBQeU9iamVjdCAqaW1wb3J0ZXI9TlVMTCwgKnBhdGhfaW1wb3J0ZXJfY2FjaGU9TlVMTCwgKnBhdGhfaG9va3M9TlVMTDsKKyAgICBQeU9iamVjdCAqaW1wb3J0ZXI9TlVMTCwgKnBhdGhfaW1wb3J0ZXJfY2FjaGU9TlVMTCwgKnBhdGhfaG9va3M9TlVMTDsKIAotCWlmICgocGF0aF9pbXBvcnRlcl9jYWNoZSA9IFB5U3lzX0dldE9iamVjdCgicGF0aF9pbXBvcnRlcl9jYWNoZSIpKSkgewotCQlpZiAoKHBhdGhfaG9va3MgPSBQeVN5c19HZXRPYmplY3QoInBhdGhfaG9va3MiKSkpIHsKLQkJCWltcG9ydGVyID0gZ2V0X3BhdGhfaW1wb3J0ZXIocGF0aF9pbXBvcnRlcl9jYWNoZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9ob29rcywgcGF0aCk7Ci0JCX0KLQl9Ci0JUHlfWElOQ1JFRihpbXBvcnRlcik7IC8qIGdldF9wYXRoX2ltcG9ydGVyIHJldHVybnMgYSBib3Jyb3dlZCByZWZlcmVuY2UgKi8KLQlyZXR1cm4gaW1wb3J0ZXI7CisgICAgaWYgKChwYXRoX2ltcG9ydGVyX2NhY2hlID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoX2ltcG9ydGVyX2NhY2hlIikpKSB7CisgICAgICAgIGlmICgocGF0aF9ob29rcyA9IFB5U3lzX0dldE9iamVjdCgicGF0aF9ob29rcyIpKSkgeworICAgICAgICAgICAgaW1wb3J0ZXIgPSBnZXRfcGF0aF9pbXBvcnRlcihwYXRoX2ltcG9ydGVyX2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2hvb2tzLCBwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9YSU5DUkVGKGltcG9ydGVyKTsgLyogZ2V0X3BhdGhfaW1wb3J0ZXIgcmV0dXJucyBhIGJvcnJvd2VkIHJlZmVyZW5jZSAqLworICAgIHJldHVybiBpbXBvcnRlcjsKIH0KIAogLyogU2VhcmNoIHRoZSBwYXRoIChkZWZhdWx0IHN5cy5wYXRoKSBmb3IgYSBtb2R1bGUuICBSZXR1cm4gdGhlCkBAIC0xMTkwLDcgKzExOTAsNyBAQAogCiAjaWZkZWYgTVNfQ09SRURMTAogZXh0ZXJuIEZJTEUgKlB5V2luX0ZpbmRSZWdpc3RlcmVkTW9kdWxlKGNvbnN0IGNoYXIgKiwgc3RydWN0IGZpbGVkZXNjciAqKiwKLQkJCQkJY2hhciAqLCBQeV9zc2l6ZV90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIFB5X3NzaXplX3QpOwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgY2FzZV9vayhjaGFyICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNoYXIgKik7CkBAIC0xMTk5LDMxOSArMTE5OSwzMTkgQEAKIAogc3RhdGljIHN0cnVjdCBmaWxlZGVzY3IgKgogZmluZF9tb2R1bGUoY2hhciAqZnVsbG5hbWUsIGNoYXIgKnN1Ym5hbWUsIFB5T2JqZWN0ICpwYXRoLCBjaGFyICpidWYsCi0JICAgIHNpemVfdCBidWZsZW4sIEZJTEUgKipwX2ZwLCBQeU9iamVjdCAqKnBfbG9hZGVyKQorICAgICAgICAgICAgc2l6ZV90IGJ1ZmxlbiwgRklMRSAqKnBfZnAsIFB5T2JqZWN0ICoqcF9sb2FkZXIpCiB7Ci0JUHlfc3NpemVfdCBpLCBucGF0aDsKLQlzaXplX3QgbGVuLCBuYW1lbGVuOwotCXN0cnVjdCBmaWxlZGVzY3IgKmZkcCA9IE5VTEw7Ci0JY2hhciAqZmlsZW1vZGU7Ci0JRklMRSAqZnAgPSBOVUxMOwotCVB5T2JqZWN0ICpwYXRoX2hvb2tzLCAqcGF0aF9pbXBvcnRlcl9jYWNoZTsKKyAgICBQeV9zc2l6ZV90IGksIG5wYXRoOworICAgIHNpemVfdCBsZW4sIG5hbWVsZW47CisgICAgc3RydWN0IGZpbGVkZXNjciAqZmRwID0gTlVMTDsKKyAgICBjaGFyICpmaWxlbW9kZTsKKyAgICBGSUxFICpmcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnBhdGhfaG9va3MsICpwYXRoX2ltcG9ydGVyX2NhY2hlOwogI2lmbmRlZiBSSVNDT1MKLQlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CiAjZW5kaWYKLQlzdGF0aWMgc3RydWN0IGZpbGVkZXNjciBmZF9mcm96ZW4gPSB7IiIsICIiLCBQWV9GUk9aRU59OwotCXN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyIGZkX2J1aWx0aW4gPSB7IiIsICIiLCBDX0JVSUxUSU59OwotCXN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyIGZkX3BhY2thZ2UgPSB7IiIsICIiLCBQS0dfRElSRUNUT1JZfTsKLQljaGFyIG5hbWVbTUFYUEFUSExFTisxXTsKKyAgICBzdGF0aWMgc3RydWN0IGZpbGVkZXNjciBmZF9mcm96ZW4gPSB7IiIsICIiLCBQWV9GUk9aRU59OworICAgIHN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyIGZkX2J1aWx0aW4gPSB7IiIsICIiLCBDX0JVSUxUSU59OworICAgIHN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyIGZkX3BhY2thZ2UgPSB7IiIsICIiLCBQS0dfRElSRUNUT1JZfTsKKyAgICBjaGFyIG5hbWVbTUFYUEFUSExFTisxXTsKICNpZiBkZWZpbmVkKFBZT1NfT1MyKQotCXNpemVfdCBzYXZlZF9sZW47Ci0Jc2l6ZV90IHNhdmVkX25hbWVsZW47Ci0JY2hhciAqc2F2ZWRfYnVmID0gTlVMTDsKKyAgICBzaXplX3Qgc2F2ZWRfbGVuOworICAgIHNpemVfdCBzYXZlZF9uYW1lbGVuOworICAgIGNoYXIgKnNhdmVkX2J1ZiA9IE5VTEw7CiAjZW5kaWYKLQlpZiAocF9sb2FkZXIgIT0gTlVMTCkKLQkJKnBfbG9hZGVyID0gTlVMTDsKKyAgICBpZiAocF9sb2FkZXIgIT0gTlVMTCkKKyAgICAgICAgKnBfbG9hZGVyID0gTlVMTDsKIAotCWlmIChzdHJsZW4oc3VibmFtZSkgPiBNQVhQQVRITEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJtb2R1bGUgbmFtZSBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RyY3B5KG5hbWUsIHN1Ym5hbWUpOworICAgIGlmIChzdHJsZW4oc3VibmFtZSkgPiBNQVhQQVRITEVOKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSBuYW1lIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJjcHkobmFtZSwgc3VibmFtZSk7CiAKLQkvKiBzeXMubWV0YV9wYXRoIGltcG9ydCBob29rICovCi0JaWYgKHBfbG9hZGVyICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKm1ldGFfcGF0aDsKKyAgICAvKiBzeXMubWV0YV9wYXRoIGltcG9ydCBob29rICovCisgICAgaWYgKHBfbG9hZGVyICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKm1ldGFfcGF0aDsKIAotCQltZXRhX3BhdGggPSBQeVN5c19HZXRPYmplY3QoIm1ldGFfcGF0aCIpOwotCQlpZiAobWV0YV9wYXRoID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhtZXRhX3BhdGgpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkJCSJzeXMubWV0YV9wYXRoIG11c3QgYmUgYSBsaXN0IG9mICIKLQkJCQkJImltcG9ydCBob29rcyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfSU5DUkVGKG1ldGFfcGF0aCk7ICAvKiB6YXAgZ3VhcmQgKi8KLQkJbnBhdGggPSBQeUxpc3RfU2l6ZShtZXRhX3BhdGgpOwotCQlmb3IgKGkgPSAwOyBpIDwgbnBhdGg7IGkrKykgewotCQkJUHlPYmplY3QgKmxvYWRlcjsKLQkJCVB5T2JqZWN0ICpob29rID0gUHlMaXN0X0dldEl0ZW0obWV0YV9wYXRoLCBpKTsKLQkJCWxvYWRlciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoaG9vaywgImZpbmRfbW9kdWxlIiwKLQkJCQkJCSAgICAgInNPIiwgZnVsbG5hbWUsCi0JCQkJCQkgICAgIHBhdGggIT0gTlVMTCA/Ci0JCQkJCQkgICAgIHBhdGggOiBQeV9Ob25lKTsKLQkJCWlmIChsb2FkZXIgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihtZXRhX3BhdGgpOwotCQkJCXJldHVybiBOVUxMOyAgLyogdHJ1ZSBlcnJvciAqLwotCQkJfQotCQkJaWYgKGxvYWRlciAhPSBQeV9Ob25lKSB7Ci0JCQkJLyogYSBsb2FkZXIgd2FzIGZvdW5kICovCi0JCQkJKnBfbG9hZGVyID0gbG9hZGVyOwotCQkJCVB5X0RFQ1JFRihtZXRhX3BhdGgpOwotCQkJCXJldHVybiAmaW1wb3J0aG9va2Rlc2NyOwotCQkJfQotCQkJUHlfREVDUkVGKGxvYWRlcik7Ci0JCX0KLQkJUHlfREVDUkVGKG1ldGFfcGF0aCk7Ci0JfQorICAgICAgICBtZXRhX3BhdGggPSBQeVN5c19HZXRPYmplY3QoIm1ldGFfcGF0aCIpOworICAgICAgICBpZiAobWV0YV9wYXRoID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhtZXRhX3BhdGgpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5cy5tZXRhX3BhdGggbXVzdCBiZSBhIGxpc3Qgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgaG9va3MiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihtZXRhX3BhdGgpOyAgLyogemFwIGd1YXJkICovCisgICAgICAgIG5wYXRoID0gUHlMaXN0X1NpemUobWV0YV9wYXRoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5wYXRoOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpsb2FkZXI7CisgICAgICAgICAgICBQeU9iamVjdCAqaG9vayA9IFB5TGlzdF9HZXRJdGVtKG1ldGFfcGF0aCwgaSk7CisgICAgICAgICAgICBsb2FkZXIgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGhvb2ssICJmaW5kX21vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzTyIsIGZ1bGxuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoICE9IE5VTEwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoIDogUHlfTm9uZSk7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWV0YV9wYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgIC8qIHRydWUgZXJyb3IgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIC8qIGEgbG9hZGVyIHdhcyBmb3VuZCAqLworICAgICAgICAgICAgICAgICpwX2xvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWV0YV9wYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJmltcG9ydGhvb2tkZXNjcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihsb2FkZXIpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihtZXRhX3BhdGgpOworICAgIH0KIAotCWlmIChwYXRoICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2socGF0aCkpIHsKLQkJLyogVGhlIG9ubHkgdHlwZSBvZiBzdWJtb2R1bGUgYWxsb3dlZCBpbnNpZGUgYSAiZnJvemVuIgotCQkgICBwYWNrYWdlIGFyZSBvdGhlciBmcm96ZW4gbW9kdWxlcyBvciBwYWNrYWdlcy4gKi8KLQkJaWYgKFB5U3RyaW5nX1NpemUocGF0aCkgKyAxICsgc3RybGVuKG5hbWUpID49IChzaXplX3QpYnVmbGVuKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkJCSJmdWxsIGZyb3plbiBtb2R1bGUgbmFtZSB0b28gbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3RyY3B5KGJ1ZiwgUHlTdHJpbmdfQXNTdHJpbmcocGF0aCkpOwotCQlzdHJjYXQoYnVmLCAiLiIpOwotCQlzdHJjYXQoYnVmLCBuYW1lKTsKLQkJc3RyY3B5KG5hbWUsIGJ1Zik7Ci0JCWlmIChmaW5kX2Zyb3plbihuYW1lKSAhPSBOVUxMKSB7Ci0JCQlzdHJjcHkoYnVmLCBuYW1lKTsKLQkJCXJldHVybiAmZmRfZnJvemVuOwotCQl9Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIk5vIGZyb3plbiBzdWJtb2R1bGUgbmFtZWQgJS4yMDBzIiwgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocGF0aCA9PSBOVUxMKSB7Ci0JCWlmIChpc19idWlsdGluKG5hbWUpKSB7Ci0JCQlzdHJjcHkoYnVmLCBuYW1lKTsKLQkJCXJldHVybiAmZmRfYnVpbHRpbjsKLQkJfQotCQlpZiAoKGZpbmRfZnJvemVuKG5hbWUpKSAhPSBOVUxMKSB7Ci0JCQlzdHJjcHkoYnVmLCBuYW1lKTsKLQkJCXJldHVybiAmZmRfZnJvemVuOwotCQl9CisgICAgaWYgKHBhdGggIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhwYXRoKSkgeworICAgICAgICAvKiBUaGUgb25seSB0eXBlIG9mIHN1Ym1vZHVsZSBhbGxvd2VkIGluc2lkZSBhICJmcm96ZW4iCisgICAgICAgICAgIHBhY2thZ2UgYXJlIG90aGVyIGZyb3plbiBtb2R1bGVzIG9yIHBhY2thZ2VzLiAqLworICAgICAgICBpZiAoUHlTdHJpbmdfU2l6ZShwYXRoKSArIDEgKyBzdHJsZW4obmFtZSkgPj0gKHNpemVfdClidWZsZW4pIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVsbCBmcm96ZW4gbW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0cmNweShidWYsIFB5U3RyaW5nX0FzU3RyaW5nKHBhdGgpKTsKKyAgICAgICAgc3RyY2F0KGJ1ZiwgIi4iKTsKKyAgICAgICAgc3RyY2F0KGJ1ZiwgbmFtZSk7CisgICAgICAgIHN0cmNweShuYW1lLCBidWYpOworICAgICAgICBpZiAoZmluZF9mcm96ZW4obmFtZSkgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gJmZkX2Zyb3plbjsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTm8gZnJvemVuIHN1Ym1vZHVsZSBuYW1lZCAlLjIwMHMiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwYXRoID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGlzX2J1aWx0aW4obmFtZSkpIHsKKyAgICAgICAgICAgIHN0cmNweShidWYsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuICZmZF9idWlsdGluOworICAgICAgICB9CisgICAgICAgIGlmICgoZmluZF9mcm96ZW4obmFtZSkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0cmNweShidWYsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuICZmZF9mcm96ZW47CisgICAgICAgIH0KIAogI2lmZGVmIE1TX0NPUkVETEwKLQkJZnAgPSBQeVdpbl9GaW5kUmVnaXN0ZXJlZE1vZHVsZShuYW1lLCAmZmRwLCBidWYsIGJ1Zmxlbik7Ci0JCWlmIChmcCAhPSBOVUxMKSB7Ci0JCQkqcF9mcCA9IGZwOwotCQkJcmV0dXJuIGZkcDsKLQkJfQorICAgICAgICBmcCA9IFB5V2luX0ZpbmRSZWdpc3RlcmVkTW9kdWxlKG5hbWUsICZmZHAsIGJ1ZiwgYnVmbGVuKTsKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpwX2ZwID0gZnA7CisgICAgICAgICAgICByZXR1cm4gZmRwOworICAgICAgICB9CiAjZW5kaWYKLQkJcGF0aCA9IFB5U3lzX0dldE9iamVjdCgicGF0aCIpOwotCX0KLQlpZiAocGF0aCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2socGF0aCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSJzeXMucGF0aCBtdXN0IGJlIGEgbGlzdCBvZiBkaXJlY3RvcnkgbmFtZXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBwYXRoID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoIik7CisgICAgfQorICAgIGlmIChwYXRoID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhwYXRoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3lzLnBhdGggbXVzdCBiZSBhIGxpc3Qgb2YgZGlyZWN0b3J5IG5hbWVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXBhdGhfaG9va3MgPSBQeVN5c19HZXRPYmplY3QoInBhdGhfaG9va3MiKTsKLQlpZiAocGF0aF9ob29rcyA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2socGF0aF9ob29rcykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSJzeXMucGF0aF9ob29rcyBtdXN0IGJlIGEgbGlzdCBvZiAiCi0JCQkJImltcG9ydCBob29rcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGF0aF9pbXBvcnRlcl9jYWNoZSA9IFB5U3lzX0dldE9iamVjdCgicGF0aF9pbXBvcnRlcl9jYWNoZSIpOwotCWlmIChwYXRoX2ltcG9ydGVyX2NhY2hlID09IE5VTEwgfHwKLQkgICAgIVB5RGljdF9DaGVjayhwYXRoX2ltcG9ydGVyX2NhY2hlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkJInN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlIG11c3QgYmUgYSBkaWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBwYXRoX2hvb2tzID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoX2hvb2tzIik7CisgICAgaWYgKHBhdGhfaG9va3MgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHBhdGhfaG9va3MpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzeXMucGF0aF9ob29rcyBtdXN0IGJlIGEgbGlzdCBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IGhvb2tzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwYXRoX2ltcG9ydGVyX2NhY2hlID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoX2ltcG9ydGVyX2NhY2hlIik7CisgICAgaWYgKHBhdGhfaW1wb3J0ZXJfY2FjaGUgPT0gTlVMTCB8fAorICAgICAgICAhUHlEaWN0X0NoZWNrKHBhdGhfaW1wb3J0ZXJfY2FjaGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSBtdXN0IGJlIGEgZGljdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlucGF0aCA9IFB5TGlzdF9TaXplKHBhdGgpOwotCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7Ci0JZm9yIChpID0gMDsgaSA8IG5wYXRoOyBpKyspIHsKLQkJUHlPYmplY3QgKmNvcHkgPSBOVUxMOwotCQlQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKHBhdGgsIGkpOwotCQlpZiAoIXYpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBucGF0aCA9IFB5TGlzdF9TaXplKHBhdGgpOworICAgIG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgZm9yIChpID0gMDsgaSA8IG5wYXRoOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmNvcHkgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKHBhdGgsIGkpOworICAgICAgICBpZiAoIXYpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKLQkJCWNvcHkgPSBQeVVuaWNvZGVfRW5jb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKHYpLAotCQkJCVB5VW5pY29kZV9HRVRfU0laRSh2KSwgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywgTlVMTCk7Ci0JCQlpZiAoY29weSA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJdiA9IGNvcHk7Ci0JCX0KLQkJZWxzZQorICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICBjb3B5ID0gUHlVbmljb2RlX0VuY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSwKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUodiksIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsIE5VTEwpOworICAgICAgICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHYgPSBjb3B5OworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZgotCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKQotCQkJY29udGludWU7Ci0JCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCQlpZiAobGVuICsgMiArIG5hbWVsZW4gKyBNQVhTVUZGSVhTSVpFID49IGJ1ZmxlbikgewotCQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJCWNvbnRpbnVlOyAvKiBUb28gbG9uZyAqLwotCQl9Ci0JCXN0cmNweShidWYsIFB5U3RyaW5nX0FTX1NUUklORyh2KSk7Ci0JCWlmIChzdHJsZW4oYnVmKSAhPSBsZW4pIHsKLQkJCVB5X1hERUNSRUYoY29weSk7Ci0JCQljb250aW51ZTsgLyogdiBjb250YWlucyAnXDAnICovCi0JCX0KKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKyAgICAgICAgaWYgKGxlbiArIDIgKyBuYW1lbGVuICsgTUFYU1VGRklYU0laRSA+PSBidWZsZW4pIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoY29weSk7CisgICAgICAgICAgICBjb250aW51ZTsgLyogVG9vIGxvbmcgKi8KKyAgICAgICAgfQorICAgICAgICBzdHJjcHkoYnVmLCBQeVN0cmluZ19BU19TVFJJTkcodikpOworICAgICAgICBpZiAoc3RybGVuKGJ1ZikgIT0gbGVuKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOworICAgICAgICAgICAgY29udGludWU7IC8qIHYgY29udGFpbnMgJ1wwJyAqLworICAgICAgICB9CiAKLQkJLyogc3lzLnBhdGhfaG9va3MgaW1wb3J0IGhvb2sgKi8KLQkJaWYgKHBfbG9hZGVyICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICppbXBvcnRlcjsKKyAgICAgICAgLyogc3lzLnBhdGhfaG9va3MgaW1wb3J0IGhvb2sgKi8KKyAgICAgICAgaWYgKHBfbG9hZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppbXBvcnRlcjsKIAotCQkJaW1wb3J0ZXIgPSBnZXRfcGF0aF9pbXBvcnRlcihwYXRoX2ltcG9ydGVyX2NhY2hlLAotCQkJCQkJICAgICBwYXRoX2hvb2tzLCB2KTsKLQkJCWlmIChpbXBvcnRlciA9PSBOVUxMKSB7Ci0JCQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCS8qIE5vdGU6IGltcG9ydGVyIGlzIGEgYm9ycm93ZWQgcmVmZXJlbmNlICovCi0JCQlpZiAoaW1wb3J0ZXIgIT0gUHlfTm9uZSkgewotCQkJCVB5T2JqZWN0ICpsb2FkZXI7Ci0JCQkJbG9hZGVyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChpbXBvcnRlciwKLQkJCQkJCQkgICAgICJmaW5kX21vZHVsZSIsCi0JCQkJCQkJICAgICAicyIsIGZ1bGxuYW1lKTsKLQkJCQlQeV9YREVDUkVGKGNvcHkpOwotCQkJCWlmIChsb2FkZXIgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIE5VTEw7ICAvKiBlcnJvciAqLwotCQkJCWlmIChsb2FkZXIgIT0gUHlfTm9uZSkgewotCQkJCQkvKiBhIGxvYWRlciB3YXMgZm91bmQgKi8KLQkJCQkJKnBfbG9hZGVyID0gbG9hZGVyOwotCQkJCQlyZXR1cm4gJmltcG9ydGhvb2tkZXNjcjsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKGxvYWRlcik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJLyogbm8gaG9vayB3YXMgZm91bmQsIHVzZSBidWlsdGluIGltcG9ydCAqLworICAgICAgICAgICAgaW1wb3J0ZXIgPSBnZXRfcGF0aF9pbXBvcnRlcihwYXRoX2ltcG9ydGVyX2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2hvb2tzLCB2KTsKKyAgICAgICAgICAgIGlmIChpbXBvcnRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdGU6IGltcG9ydGVyIGlzIGEgYm9ycm93ZWQgcmVmZXJlbmNlICovCisgICAgICAgICAgICBpZiAoaW1wb3J0ZXIgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpsb2FkZXI7CisgICAgICAgICAgICAgICAgbG9hZGVyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChpbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5kX21vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicyIsIGZ1bGxuYW1lKTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAvKiBlcnJvciAqLworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBhIGxvYWRlciB3YXMgZm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgKnBfbG9hZGVyID0gbG9hZGVyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gJmltcG9ydGhvb2tkZXNjcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxvYWRlcik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbm8gaG9vayB3YXMgZm91bmQsIHVzZSBidWlsdGluIGltcG9ydCAqLwogCi0JCWlmIChsZW4gPiAwICYmIGJ1ZltsZW4tMV0gIT0gU0VQCisgICAgICAgIGlmIChsZW4gPiAwICYmIGJ1ZltsZW4tMV0gIT0gU0VQCiAjaWZkZWYgQUxUU0VQCi0JCSAgICAmJiBidWZbbGVuLTFdICE9IEFMVFNFUAorICAgICAgICAgICAgJiYgYnVmW2xlbi0xXSAhPSBBTFRTRVAKICNlbmRpZgotCQkgICAgKQotCQkJYnVmW2xlbisrXSA9IFNFUDsKLQkJc3RyY3B5KGJ1ZitsZW4sIG5hbWUpOwotCQlsZW4gKz0gbmFtZWxlbjsKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGJ1ZltsZW4rK10gPSBTRVA7CisgICAgICAgIHN0cmNweShidWYrbGVuLCBuYW1lKTsKKyAgICAgICAgbGVuICs9IG5hbWVsZW47CiAKLQkJLyogQ2hlY2sgZm9yIHBhY2thZ2UgaW1wb3J0IChidWYgaG9sZHMgYSBkaXJlY3RvcnkgbmFtZSwKLQkJICAgYW5kIHRoZXJlJ3MgYW4gX19pbml0X18gbW9kdWxlIGluIHRoYXQgZGlyZWN0b3J5ICovCisgICAgICAgIC8qIENoZWNrIGZvciBwYWNrYWdlIGltcG9ydCAoYnVmIGhvbGRzIGEgZGlyZWN0b3J5IG5hbWUsCisgICAgICAgICAgIGFuZCB0aGVyZSdzIGFuIF9faW5pdF9fIG1vZHVsZSBpbiB0aGF0IGRpcmVjdG9yeSAqLwogI2lmZGVmIEhBVkVfU1RBVAotCQlpZiAoc3RhdChidWYsICZzdGF0YnVmKSA9PSAwICYmICAgICAgICAgLyogaXQgZXhpc3RzICovCi0JCSAgICBTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkgJiYgICAgICAgICAvKiBpdCdzIGEgZGlyZWN0b3J5ICovCi0JCSAgICBjYXNlX29rKGJ1ZiwgbGVuLCBuYW1lbGVuLCBuYW1lKSkgeyAvKiBjYXNlIG1hdGNoZXMgKi8KLQkJCWlmIChmaW5kX2luaXRfbW9kdWxlKGJ1ZikpIHsgLyogYW5kIGhhcyBfX2luaXRfXy5weSAqLwotCQkJCVB5X1hERUNSRUYoY29weSk7Ci0JCQkJcmV0dXJuICZmZF9wYWNrYWdlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2hhciB3YXJuc3RyW01BWFBBVEhMRU4rODBdOwotCQkJCXNwcmludGYod2FybnN0ciwgIk5vdCBpbXBvcnRpbmcgZGlyZWN0b3J5ICIKLQkJCQkJIiclLipzJzogbWlzc2luZyBfX2luaXRfXy5weSIsCi0JCQkJCU1BWFBBVEhMRU4sIGJ1Zik7Ci0JCQkJaWYgKFB5RXJyX1dhcm4oUHlFeGNfSW1wb3J0V2FybmluZywKLQkJCQkJICAgICAgIHdhcm5zdHIpKSB7Ci0JCQkJCVB5X1hERUNSRUYoY29weSk7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICBpZiAoc3RhdChidWYsICZzdGF0YnVmKSA9PSAwICYmICAgICAgICAgLyogaXQgZXhpc3RzICovCisgICAgICAgICAgICBTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkgJiYgICAgICAgICAvKiBpdCdzIGEgZGlyZWN0b3J5ICovCisgICAgICAgICAgICBjYXNlX29rKGJ1ZiwgbGVuLCBuYW1lbGVuLCBuYW1lKSkgeyAvKiBjYXNlIG1hdGNoZXMgKi8KKyAgICAgICAgICAgIGlmIChmaW5kX2luaXRfbW9kdWxlKGJ1ZikpIHsgLyogYW5kIGhhcyBfX2luaXRfXy5weSAqLworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoY29weSk7CisgICAgICAgICAgICAgICAgcmV0dXJuICZmZF9wYWNrYWdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhciB3YXJuc3RyW01BWFBBVEhMRU4rODBdOworICAgICAgICAgICAgICAgIHNwcmludGYod2FybnN0ciwgIk5vdCBpbXBvcnRpbmcgZGlyZWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgICAgIiclLipzJzogbWlzc2luZyBfX2luaXRfXy5weSIsCisgICAgICAgICAgICAgICAgICAgIE1BWFBBVEhMRU4sIGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfSW1wb3J0V2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuc3RyKSkgeworICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbHNlCi0JCS8qIFhYWCBIb3cgYXJlIHlvdSBnb2luZyB0byB0ZXN0IGZvciBkaXJlY3Rvcmllcz8gKi8KKyAgICAgICAgLyogWFhYIEhvdyBhcmUgeW91IGdvaW5nIHRvIHRlc3QgZm9yIGRpcmVjdG9yaWVzPyAqLwogI2lmZGVmIFJJU0NPUwotCQlpZiAoaXNkaXIoYnVmKSAmJgotCQkgICAgY2FzZV9vayhidWYsIGxlbiwgbmFtZWxlbiwgbmFtZSkpIHsKLQkJCWlmIChmaW5kX2luaXRfbW9kdWxlKGJ1ZikpIHsKLQkJCQlQeV9YREVDUkVGKGNvcHkpOwotCQkJCXJldHVybiAmZmRfcGFja2FnZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNoYXIgd2FybnN0cltNQVhQQVRITEVOKzgwXTsKLQkJCQlzcHJpbnRmKHdhcm5zdHIsICJOb3QgaW1wb3J0aW5nIGRpcmVjdG9yeSAiCi0JCQkJCSInJS4qcyc6IG1pc3NpbmcgX19pbml0X18ucHkiLAotCQkJCQlNQVhQQVRITEVOLCBidWYpOwotCQkJCWlmIChQeUVycl9XYXJuKFB5RXhjX0ltcG9ydFdhcm5pbmcsCi0JCQkJCSAgICAgICB3YXJuc3RyKSkgewotCQkJCQlQeV9YREVDUkVGKGNvcHkpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCX0KKyAgICAgICAgaWYgKGlzZGlyKGJ1ZikgJiYKKyAgICAgICAgICAgIGNhc2Vfb2soYnVmLCBsZW4sIG5hbWVsZW4sIG5hbWUpKSB7CisgICAgICAgICAgICBpZiAoZmluZF9pbml0X21vZHVsZShidWYpKSB7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJmZkX3BhY2thZ2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFyIHdhcm5zdHJbTUFYUEFUSExFTis4MF07CisgICAgICAgICAgICAgICAgc3ByaW50Zih3YXJuc3RyLCAiTm90IGltcG9ydGluZyBkaXJlY3RvcnkgIgorICAgICAgICAgICAgICAgICAgICAiJyUuKnMnOiBtaXNzaW5nIF9faW5pdF9fLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgTUFYUEFUSExFTiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19JbXBvcnRXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5zdHIpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoY29weSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAjZW5kaWYKICNpZiBkZWZpbmVkKFBZT1NfT1MyKQotCQkvKiB0YWtlIGEgc25hcHNob3Qgb2YgdGhlIG1vZHVsZSBzcGVjIGZvciByZXN0b3JhdGlvbgotCQkgKiBhZnRlciB0aGUgOCBjaGFyYWN0ZXIgRExMIGhhY2tlcnkKLQkJICovCi0JCXNhdmVkX2J1ZiA9IHN0cmR1cChidWYpOwotCQlzYXZlZF9sZW4gPSBsZW47Ci0JCXNhdmVkX25hbWVsZW4gPSBuYW1lbGVuOworICAgICAgICAvKiB0YWtlIGEgc25hcHNob3Qgb2YgdGhlIG1vZHVsZSBzcGVjIGZvciByZXN0b3JhdGlvbgorICAgICAgICAgKiBhZnRlciB0aGUgOCBjaGFyYWN0ZXIgRExMIGhhY2tlcnkKKyAgICAgICAgICovCisgICAgICAgIHNhdmVkX2J1ZiA9IHN0cmR1cChidWYpOworICAgICAgICBzYXZlZF9sZW4gPSBsZW47CisgICAgICAgIHNhdmVkX25hbWVsZW4gPSBuYW1lbGVuOwogI2VuZGlmIC8qIFBZT1NfT1MyICovCi0JCWZvciAoZmRwID0gX1B5SW1wb3J0X0ZpbGV0YWI7IGZkcC0+c3VmZml4ICE9IE5VTEw7IGZkcCsrKSB7CisgICAgICAgIGZvciAoZmRwID0gX1B5SW1wb3J0X0ZpbGV0YWI7IGZkcC0+c3VmZml4ICE9IE5VTEw7IGZkcCsrKSB7CiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChIQVZFX0RZTkFNSUNfTE9BRElORykKLQkJCS8qIE9TLzIgbGltaXRzIERMTHMgdG8gOCBjaGFyYWN0ZXIgbmFtZXMgKHcvbwotCQkJICAgZXh0ZW5zaW9uKQotCQkJICogc28gaWYgdGhlIG5hbWUgaXMgbG9uZ2VyIHRoYW4gdGhhdCBhbmQgaXRzIGEKLQkJCSAqIGR5bmFtaWNhbGx5IGxvYWRlZCBtb2R1bGUgd2UncmUgZ29pbmcgdG8gdHJ5LAotCQkJICogdHJ1bmNhdGUgdGhlIG5hbWUgYmVmb3JlIHRyeWluZwotCQkJICovCi0JCQlpZiAoc3RybGVuKHN1Ym5hbWUpID4gOCkgewotCQkJCS8qIGlzIHRoaXMgYW4gYXR0ZW1wdCB0byBsb2FkIGEgQyBleHRlbnNpb24/ICovCi0JCQkJY29uc3Qgc3RydWN0IGZpbGVkZXNjciAqc2NhbjsKLQkJCQlzY2FuID0gX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiOwotCQkJCXdoaWxlIChzY2FuLT5zdWZmaXggIT0gTlVMTCkgewotCQkJCQlpZiAoIXN0cmNtcChzY2FuLT5zdWZmaXgsIGZkcC0+c3VmZml4KSkKLQkJCQkJCWJyZWFrOwotCQkJCQllbHNlCi0JCQkJCQlzY2FuKys7Ci0JCQkJfQotCQkJCWlmIChzY2FuLT5zdWZmaXggIT0gTlVMTCkgewotCQkJCQkvKiB5ZXMsIHNvIHRydW5jYXRlIHRoZSBuYW1lICovCi0JCQkJCW5hbWVsZW4gPSA4OwotCQkJCQlsZW4gLT0gc3RybGVuKHN1Ym5hbWUpIC0gbmFtZWxlbjsKLQkJCQkJYnVmW2xlbl0gPSAnXDAnOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIC8qIE9TLzIgbGltaXRzIERMTHMgdG8gOCBjaGFyYWN0ZXIgbmFtZXMgKHcvbworICAgICAgICAgICAgICAgZXh0ZW5zaW9uKQorICAgICAgICAgICAgICogc28gaWYgdGhlIG5hbWUgaXMgbG9uZ2VyIHRoYW4gdGhhdCBhbmQgaXRzIGEKKyAgICAgICAgICAgICAqIGR5bmFtaWNhbGx5IGxvYWRlZCBtb2R1bGUgd2UncmUgZ29pbmcgdG8gdHJ5LAorICAgICAgICAgICAgICogdHJ1bmNhdGUgdGhlIG5hbWUgYmVmb3JlIHRyeWluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoc3RybGVuKHN1Ym5hbWUpID4gOCkgeworICAgICAgICAgICAgICAgIC8qIGlzIHRoaXMgYW4gYXR0ZW1wdCB0byBsb2FkIGEgQyBleHRlbnNpb24/ICovCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZpbGVkZXNjciAqc2NhbjsKKyAgICAgICAgICAgICAgICBzY2FuID0gX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiOworICAgICAgICAgICAgICAgIHdoaWxlIChzY2FuLT5zdWZmaXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChzY2FuLT5zdWZmaXgsIGZkcC0+c3VmZml4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzY2FuLT5zdWZmaXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvKiB5ZXMsIHNvIHRydW5jYXRlIHRoZSBuYW1lICovCisgICAgICAgICAgICAgICAgICAgIG5hbWVsZW4gPSA4OworICAgICAgICAgICAgICAgICAgICBsZW4gLT0gc3RybGVuKHN1Ym5hbWUpIC0gbmFtZWxlbjsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAnXDAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICNlbmRpZiAvKiBQWU9TX09TMiAqLwotCQkJc3RyY3B5KGJ1ZitsZW4sIGZkcC0+c3VmZml4KTsKLQkJCWlmIChQeV9WZXJib3NlRmxhZyA+IDEpCi0JCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgdHJ5aW5nICVzXG4iLCBidWYpOwotCQkJZmlsZW1vZGUgPSBmZHAtPm1vZGU7Ci0JCQlpZiAoZmlsZW1vZGVbMF0gPT0gJ1UnKQotCQkJCWZpbGVtb2RlID0gInIiIFBZX1NURElPVEVYVE1PREU7Ci0JCQlmcCA9IGZvcGVuKGJ1ZiwgZmlsZW1vZGUpOwotCQkJaWYgKGZwICE9IE5VTEwpIHsKLQkJCQlpZiAoY2FzZV9vayhidWYsIGxlbiwgbmFtZWxlbiwgbmFtZSkpCi0JCQkJCWJyZWFrOwotCQkJCWVsc2UgewkgLyogY29udGludWUgc2VhcmNoICovCi0JCQkJCWZjbG9zZShmcCk7Ci0JCQkJCWZwID0gTlVMTDsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBzdHJjcHkoYnVmK2xlbiwgZmRwLT5zdWZmaXgpOworICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyB0cnlpbmcgJXNcbiIsIGJ1Zik7CisgICAgICAgICAgICBmaWxlbW9kZSA9IGZkcC0+bW9kZTsKKyAgICAgICAgICAgIGlmIChmaWxlbW9kZVswXSA9PSAnVScpCisgICAgICAgICAgICAgICAgZmlsZW1vZGUgPSAiciIgUFlfU1RESU9URVhUTU9ERTsKKyAgICAgICAgICAgIGZwID0gZm9wZW4oYnVmLCBmaWxlbW9kZSk7CisgICAgICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChjYXNlX29rKGJ1ZiwgbGVuLCBuYW1lbGVuLCBuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpbnVlIHNlYXJjaCAqLworICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZnApOworICAgICAgICAgICAgICAgICAgICBmcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogI2lmIGRlZmluZWQoUFlPU19PUzIpCi0JCQkvKiByZXN0b3JlIHRoZSBzYXZlZCBzbmFwc2hvdCAqLwotCQkJc3RyY3B5KGJ1Ziwgc2F2ZWRfYnVmKTsKLQkJCWxlbiA9IHNhdmVkX2xlbjsKLQkJCW5hbWVsZW4gPSBzYXZlZF9uYW1lbGVuOworICAgICAgICAgICAgLyogcmVzdG9yZSB0aGUgc2F2ZWQgc25hcHNob3QgKi8KKyAgICAgICAgICAgIHN0cmNweShidWYsIHNhdmVkX2J1Zik7CisgICAgICAgICAgICBsZW4gPSBzYXZlZF9sZW47CisgICAgICAgICAgICBuYW1lbGVuID0gc2F2ZWRfbmFtZWxlbjsKICNlbmRpZgotCQl9CisgICAgICAgIH0KICNpZiBkZWZpbmVkKFBZT1NfT1MyKQotCQkvKiBkb24ndCBuZWVkL3dhbnQgdGhlIG1vZHVsZSBuYW1lIHNuYXBzaG90IGFueW1vcmUgKi8KLQkJaWYgKHNhdmVkX2J1ZikKLQkJewotCQkJZnJlZShzYXZlZF9idWYpOwotCQkJc2F2ZWRfYnVmID0gTlVMTDsKLQkJfQorICAgICAgICAvKiBkb24ndCBuZWVkL3dhbnQgdGhlIG1vZHVsZSBuYW1lIHNuYXBzaG90IGFueW1vcmUgKi8KKyAgICAgICAgaWYgKHNhdmVkX2J1ZikKKyAgICAgICAgeworICAgICAgICAgICAgZnJlZShzYXZlZF9idWYpOworICAgICAgICAgICAgc2F2ZWRfYnVmID0gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JCVB5X1hERUNSRUYoY29weSk7Ci0JCWlmIChmcCAhPSBOVUxMKQotCQkJYnJlYWs7Ci0JfQotCWlmIChmcCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIk5vIG1vZHVsZSBuYW1lZCAlLjIwMHMiLCBuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSpwX2ZwID0gZnA7Ci0JcmV0dXJuIGZkcDsKKyAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIk5vIG1vZHVsZSBuYW1lZCAlLjIwMHMiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICpwX2ZwID0gZnA7CisgICAgcmV0dXJuIGZkcDsKIH0KIAogLyogSGVscGVycyBmb3IgbWFpbi5jCkBAIC0xNTE5LDE1ICsxNTE5LDE1IEBACiAgKi8KIHN0cnVjdCBmaWxlZGVzY3IgKgogX1B5SW1wb3J0X0ZpbmRNb2R1bGUoY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnBhdGgsIGNoYXIgKmJ1ZiwKLQkgICAgc2l6ZV90IGJ1ZmxlbiwgRklMRSAqKnBfZnAsIFB5T2JqZWN0ICoqcF9sb2FkZXIpCisgICAgICAgICAgICBzaXplX3QgYnVmbGVuLCBGSUxFICoqcF9mcCwgUHlPYmplY3QgKipwX2xvYWRlcikKIHsKLQlyZXR1cm4gZmluZF9tb2R1bGUoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmFtZSwgcGF0aCwKLQkJCSAgIGJ1ZiwgYnVmbGVuLCBwX2ZwLCBwX2xvYWRlcik7CisgICAgcmV0dXJuIGZpbmRfbW9kdWxlKChjaGFyICopIG5hbWUsIChjaGFyICopIG5hbWUsIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmbGVuLCBwX2ZwLCBwX2xvYWRlcik7CiB9CiAKIFB5QVBJX0ZVTkMoaW50KSBfUHlJbXBvcnRfSXNTY3JpcHQoc3RydWN0IGZpbGVkZXNjciAqIGZkKQogewotCXJldHVybiBmZC0+dHlwZSA9PSBQWV9TT1VSQ0UgfHwgZmQtPnR5cGUgPT0gUFlfQ09NUElMRUQ7CisgICAgcmV0dXJuIGZkLT50eXBlID09IFBZX1NPVVJDRSB8fCBmZC0+dHlwZSA9PSBQWV9DT01QSUxFRDsKIH0KIAogLyogY2FzZV9vayhjaGFyKiBidWYsIFB5X3NzaXplX3QgbGVuLCBQeV9zc2l6ZV90IG5hbWVsZW4sIGNoYXIqIG5hbWUpCkBAIC0xNTg2LDEyOCArMTU4NiwxMjggQEAKIAogLyogTVNfV0lORE9XUyAqLwogI2lmIGRlZmluZWQoTVNfV0lORE9XUykKLQlXSU4zMl9GSU5EX0RBVEEgZGF0YTsKLQlIQU5ETEUgaDsKKyAgICBXSU4zMl9GSU5EX0RBVEEgZGF0YTsKKyAgICBIQU5ETEUgaDsKIAotCWlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCi0JCXJldHVybiAxOworICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCisgICAgICAgIHJldHVybiAxOwogCi0JaCA9IEZpbmRGaXJzdEZpbGUoYnVmLCAmZGF0YSk7Ci0JaWYgKGggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX05hbWVFcnJvciwKLQkJICAiQ2FuJ3QgZmluZCBmaWxlIGZvciBtb2R1bGUgJS4xMDBzXG4oZmlsZW5hbWUgJS4zMDBzKSIsCi0JCSAgbmFtZSwgYnVmKTsKLQkJcmV0dXJuIDA7Ci0JfQotCUZpbmRDbG9zZShoKTsKLQlyZXR1cm4gc3RybmNtcChkYXRhLmNGaWxlTmFtZSwgbmFtZSwgbmFtZWxlbikgPT0gMDsKKyAgICBoID0gRmluZEZpcnN0RmlsZShidWYsICZkYXRhKTsKKyAgICBpZiAoaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfTmFtZUVycm9yLAorICAgICAgICAgICJDYW4ndCBmaW5kIGZpbGUgZm9yIG1vZHVsZSAlLjEwMHNcbihmaWxlbmFtZSAlLjMwMHMpIiwKKyAgICAgICAgICBuYW1lLCBidWYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgRmluZENsb3NlKGgpOworICAgIHJldHVybiBzdHJuY21wKGRhdGEuY0ZpbGVOYW1lLCBuYW1lLCBuYW1lbGVuKSA9PSAwOwogCiAvKiBESkdQUCAqLwogI2VsaWYgZGVmaW5lZChESkdQUCkKLQlzdHJ1Y3QgZmZibGsgZmZibGs7Ci0JaW50IGRvbmU7CisgICAgc3RydWN0IGZmYmxrIGZmYmxrOworICAgIGludCBkb25lOwogCi0JaWYgKFB5X0dFVEVOVigiUFlUSE9OQ0FTRU9LIikgIT0gTlVMTCkKLQkJcmV0dXJuIDE7CisgICAgaWYgKFB5X0dFVEVOVigiUFlUSE9OQ0FTRU9LIikgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlkb25lID0gZmluZGZpcnN0KGJ1ZiwgJmZmYmxrLCBGQV9BUkNIfEZBX1JET05MWXxGQV9ISURERU58RkFfRElSRUMpOwotCWlmIChkb25lKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19OYW1lRXJyb3IsCi0JCSAgIkNhbid0IGZpbmQgZmlsZSBmb3IgbW9kdWxlICUuMTAwc1xuKGZpbGVuYW1lICUuMzAwcykiLAotCQkgIG5hbWUsIGJ1Zik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gc3RybmNtcChmZmJsay5mZl9uYW1lLCBuYW1lLCBuYW1lbGVuKSA9PSAwOworICAgIGRvbmUgPSBmaW5kZmlyc3QoYnVmLCAmZmZibGssIEZBX0FSQ0h8RkFfUkRPTkxZfEZBX0hJRERFTnxGQV9ESVJFQyk7CisgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX05hbWVFcnJvciwKKyAgICAgICAgICAiQ2FuJ3QgZmluZCBmaWxlIGZvciBtb2R1bGUgJS4xMDBzXG4oZmlsZW5hbWUgJS4zMDBzKSIsCisgICAgICAgICAgbmFtZSwgYnVmKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBzdHJuY21wKGZmYmxrLmZmX25hbWUsIG5hbWUsIG5hbWVsZW4pID09IDA7CiAKIC8qIG5ldy1mYW5nbGVkIG1hY2ludG9zaCAobWFjb3N4KSBvciBDeWd3aW4gKi8KICNlbGlmIChkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSkgJiYgZGVmaW5lZChIQVZFX0RJUkVOVF9IKQotCURJUiAqZGlycDsKLQlzdHJ1Y3QgZGlyZW50ICpkcDsKLQljaGFyIGRpcm5hbWVbTUFYUEFUSExFTiArIDFdOwotCWNvbnN0IGludCBkaXJsZW4gPSBsZW4gLSBuYW1lbGVuIC0gMTsgLyogZG9uJ3Qgd2FudCB0cmFpbGluZyBTRVAgKi8KKyAgICBESVIgKmRpcnA7CisgICAgc3RydWN0IGRpcmVudCAqZHA7CisgICAgY2hhciBkaXJuYW1lW01BWFBBVEhMRU4gKyAxXTsKKyAgICBjb25zdCBpbnQgZGlybGVuID0gbGVuIC0gbmFtZWxlbiAtIDE7IC8qIGRvbid0IHdhbnQgdHJhaWxpbmcgU0VQICovCiAKLQlpZiAoUHlfR0VURU5WKCJQWVRIT05DQVNFT0siKSAhPSBOVUxMKQotCQlyZXR1cm4gMTsKKyAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05DQVNFT0siKSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gMTsKIAotCS8qIENvcHkgdGhlIGRpciBjb21wb25lbnQgaW50byBkaXJuYW1lOyBzdWJzdGl0dXRlICIuIiBpZiBlbXB0eSAqLwotCWlmIChkaXJsZW4gPD0gMCkgewotCQlkaXJuYW1lWzBdID0gJy4nOwotCQlkaXJuYW1lWzFdID0gJ1wwJzsKLQl9Ci0JZWxzZSB7Ci0JCWFzc2VydChkaXJsZW4gPD0gTUFYUEFUSExFTik7Ci0JCW1lbWNweShkaXJuYW1lLCBidWYsIGRpcmxlbik7Ci0JCWRpcm5hbWVbZGlybGVuXSA9ICdcMCc7Ci0JfQotCS8qIE9wZW4gdGhlIGRpcmVjdG9yeSBhbmQgc2VhcmNoIHRoZSBlbnRyaWVzIGZvciBhbiBleGFjdCBtYXRjaC4gKi8KLQlkaXJwID0gb3BlbmRpcihkaXJuYW1lKTsKLQlpZiAoZGlycCkgewotCQljaGFyICpuYW1lV2l0aEV4dCA9IGJ1ZiArIGxlbiAtIG5hbWVsZW47Ci0JCXdoaWxlICgoZHAgPSByZWFkZGlyKGRpcnApKSAhPSBOVUxMKSB7Ci0JCQljb25zdCBpbnQgdGhpc2xlbiA9CisgICAgLyogQ29weSB0aGUgZGlyIGNvbXBvbmVudCBpbnRvIGRpcm5hbWU7IHN1YnN0aXR1dGUgIi4iIGlmIGVtcHR5ICovCisgICAgaWYgKGRpcmxlbiA8PSAwKSB7CisgICAgICAgIGRpcm5hbWVbMF0gPSAnLic7CisgICAgICAgIGRpcm5hbWVbMV0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KGRpcmxlbiA8PSBNQVhQQVRITEVOKTsKKyAgICAgICAgbWVtY3B5KGRpcm5hbWUsIGJ1ZiwgZGlybGVuKTsKKyAgICAgICAgZGlybmFtZVtkaXJsZW5dID0gJ1wwJzsKKyAgICB9CisgICAgLyogT3BlbiB0aGUgZGlyZWN0b3J5IGFuZCBzZWFyY2ggdGhlIGVudHJpZXMgZm9yIGFuIGV4YWN0IG1hdGNoLiAqLworICAgIGRpcnAgPSBvcGVuZGlyKGRpcm5hbWUpOworICAgIGlmIChkaXJwKSB7CisgICAgICAgIGNoYXIgKm5hbWVXaXRoRXh0ID0gYnVmICsgbGVuIC0gbmFtZWxlbjsKKyAgICAgICAgd2hpbGUgKChkcCA9IHJlYWRkaXIoZGlycCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB0aGlzbGVuID0KICNpZmRlZiBfRElSRU5UX0hBVkVfRF9OQU1FTEVOCi0JCQkJCQlkcC0+ZF9uYW1sZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcC0+ZF9uYW1sZW47CiAjZWxzZQotCQkJCQkJc3RybGVuKGRwLT5kX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGRwLT5kX25hbWUpOwogI2VuZGlmCi0JCQlpZiAodGhpc2xlbiA+PSBuYW1lbGVuICYmCi0JCQkgICAgc3RyY21wKGRwLT5kX25hbWUsIG5hbWVXaXRoRXh0KSA9PSAwKSB7Ci0JCQkJKHZvaWQpY2xvc2VkaXIoZGlycCk7Ci0JCQkJcmV0dXJuIDE7IC8qIEZvdW5kICovCi0JCQl9Ci0JCX0KLQkJKHZvaWQpY2xvc2VkaXIoZGlycCk7Ci0JfQotCXJldHVybiAwIDsgLyogTm90IGZvdW5kICovCisgICAgICAgICAgICBpZiAodGhpc2xlbiA+PSBuYW1lbGVuICYmCisgICAgICAgICAgICAgICAgc3RyY21wKGRwLT5kX25hbWUsIG5hbWVXaXRoRXh0KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpY2xvc2VkaXIoZGlycCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIEZvdW5kICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpY2xvc2VkaXIoZGlycCk7CisgICAgfQorICAgIHJldHVybiAwIDsgLyogTm90IGZvdW5kICovCiAKIC8qIFJJU0MgT1MgKi8KICNlbGlmIGRlZmluZWQoUklTQ09TKQotCWNoYXIgY2Fub25bTUFYUEFUSExFTisxXTsgLyogYnVmZmVyIGZvciB0aGUgY2Fub25pY2FsIGZvcm0gb2YgdGhlIHBhdGggKi8KLQljaGFyIGJ1ZjJbTUFYUEFUSExFTisyXTsKLQljaGFyICpuYW1lV2l0aEV4dCA9IGJ1ZitsZW4tbmFtZWxlbjsKLQlpbnQgY2Fub25sZW47Ci0Jb3NfZXJyb3IgKmU7CisgICAgY2hhciBjYW5vbltNQVhQQVRITEVOKzFdOyAvKiBidWZmZXIgZm9yIHRoZSBjYW5vbmljYWwgZm9ybSBvZiB0aGUgcGF0aCAqLworICAgIGNoYXIgYnVmMltNQVhQQVRITEVOKzJdOworICAgIGNoYXIgKm5hbWVXaXRoRXh0ID0gYnVmK2xlbi1uYW1lbGVuOworICAgIGludCBjYW5vbmxlbjsKKyAgICBvc19lcnJvciAqZTsKIAotCWlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCi0JCXJldHVybiAxOworICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCisgICAgICAgIHJldHVybiAxOwogCi0JLyogd29ya2Fyb3VuZDoKLQkgICBhcHBlbmQgd2lsZGNhcmQsIG90aGVyd2lzZSBjYXNlIG9mIGZpbGVuYW1lIHdvdWxkbid0IGJlIHRvdWNoZWQgKi8KLQlzdHJjcHkoYnVmMiwgYnVmKTsKLQlzdHJjYXQoYnVmMiwgIioiKTsKKyAgICAvKiB3b3JrYXJvdW5kOgorICAgICAgIGFwcGVuZCB3aWxkY2FyZCwgb3RoZXJ3aXNlIGNhc2Ugb2YgZmlsZW5hbWUgd291bGRuJ3QgYmUgdG91Y2hlZCAqLworICAgIHN0cmNweShidWYyLCBidWYpOworICAgIHN0cmNhdChidWYyLCAiKiIpOwogCi0JZSA9IHhvc2ZzY29udHJvbF9jYW5vbmljYWxpc2VfcGF0aChidWYyLGNhbm9uLDAsMCxNQVhQQVRITEVOKzEsJmNhbm9ubGVuKTsKLQljYW5vbmxlbiA9IE1BWFBBVEhMRU4rMS1jYW5vbmxlbjsKLQlpZiAoZSB8fCBjYW5vbmxlbjw9MCB8fCBjYW5vbmxlbj4oTUFYUEFUSExFTisxKSApCi0JCXJldHVybiAwOwotCWlmIChzdHJjbXAobmFtZVdpdGhFeHQsIGNhbm9uK2Nhbm9ubGVuLXN0cmxlbihuYW1lV2l0aEV4dCkpPT0wKQotCQlyZXR1cm4gMTsgLyogbWF0Y2ggKi8KKyAgICBlID0geG9zZnNjb250cm9sX2Nhbm9uaWNhbGlzZV9wYXRoKGJ1ZjIsY2Fub24sMCwwLE1BWFBBVEhMRU4rMSwmY2Fub25sZW4pOworICAgIGNhbm9ubGVuID0gTUFYUEFUSExFTisxLWNhbm9ubGVuOworICAgIGlmIChlIHx8IGNhbm9ubGVuPD0wIHx8IGNhbm9ubGVuPihNQVhQQVRITEVOKzEpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHN0cmNtcChuYW1lV2l0aEV4dCwgY2Fub24rY2Fub25sZW4tc3RybGVuKG5hbWVXaXRoRXh0KSk9PTApCisgICAgICAgIHJldHVybiAxOyAvKiBtYXRjaCAqLwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKIC8qIE9TLzIgKi8KICNlbGlmIGRlZmluZWQoUFlPU19PUzIpCi0JSERJUiBoZGlyID0gMTsKLQlVTE9ORyBzcmNoY250ID0gMTsKLQlGSUxFRklOREJVRjMgZmZidWY7Ci0JQVBJUkVUIHJjOworICAgIEhESVIgaGRpciA9IDE7CisgICAgVUxPTkcgc3JjaGNudCA9IDE7CisgICAgRklMRUZJTkRCVUYzIGZmYnVmOworICAgIEFQSVJFVCByYzsKIAotCWlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCi0JCXJldHVybiAxOworICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCisgICAgICAgIHJldHVybiAxOwogCi0JcmMgPSBEb3NGaW5kRmlyc3QoYnVmLAotCQkJICAmaGRpciwKLQkJCSAgRklMRV9SRUFET05MWSB8IEZJTEVfSElEREVOIHwgRklMRV9TWVNURU0gfCBGSUxFX0RJUkVDVE9SWSwKLQkJCSAgJmZmYnVmLCBzaXplb2YoZmZidWYpLAotCQkJICAmc3JjaGNudCwKLQkJCSAgRklMX1NUQU5EQVJEKTsKLQlpZiAocmMgIT0gTk9fRVJST1IpCi0JCXJldHVybiAwOwotCXJldHVybiBzdHJuY21wKGZmYnVmLmFjaE5hbWUsIG5hbWUsIG5hbWVsZW4pID09IDA7CisgICAgcmMgPSBEb3NGaW5kRmlyc3QoYnVmLAorICAgICAgICAgICAgICAgICAgICAgICZoZGlyLAorICAgICAgICAgICAgICAgICAgICAgIEZJTEVfUkVBRE9OTFkgfCBGSUxFX0hJRERFTiB8IEZJTEVfU1lTVEVNIHwgRklMRV9ESVJFQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgJmZmYnVmLCBzaXplb2YoZmZidWYpLAorICAgICAgICAgICAgICAgICAgICAgICZzcmNoY250LAorICAgICAgICAgICAgICAgICAgICAgIEZJTF9TVEFOREFSRCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc3RybmNtcChmZmJ1Zi5hY2hOYW1lLCBuYW1lLCBuYW1lbGVuKSA9PSAwOwogCiAvKiBhc3N1bWluZyBpdCdzIGEgY2FzZS1zZW5zaXRpdmUgZmlsZXN5c3RlbSwgc28gdGhlcmUncyBub3RoaW5nIHRvIGRvISAqLwogI2Vsc2UKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIAogI2VuZGlmCiB9CkBAIC0xNzE4LDQ2ICsxNzE4LDQ2IEBACiBzdGF0aWMgaW50CiBmaW5kX2luaXRfbW9kdWxlKGNoYXIgKmJ1ZikKIHsKLQljb25zdCBzaXplX3Qgc2F2ZV9sZW4gPSBzdHJsZW4oYnVmKTsKLQlzaXplX3QgaSA9IHNhdmVfbGVuOwotCWNoYXIgKnBuYW1lOyAgLyogcG9pbnRlciB0byBzdGFydCBvZiBfX2luaXRfXyAqLwotCXN0cnVjdCBzdGF0IHN0YXRidWY7CisgICAgY29uc3Qgc2l6ZV90IHNhdmVfbGVuID0gc3RybGVuKGJ1Zik7CisgICAgc2l6ZV90IGkgPSBzYXZlX2xlbjsKKyAgICBjaGFyICpwbmFtZTsgIC8qIHBvaW50ZXIgdG8gc3RhcnQgb2YgX19pbml0X18gKi8KKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwogCi0vKglGb3IgY2FsbGluZyBjYXNlX29rKGJ1ZiwgbGVuLCBuYW1lbGVuLCBuYW1lKToKLSAqCS9hL2IvYy9kL2UvZi9nL2gvaS9qL2svc29tZV9sb25nX21vZHVsZV9uYW1lLnB5XDAKLSAqCV4gICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICBeICAgIF4KLSAqCXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0gYnVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqCXwtLS0tLS0tLS0tLS0tLS0tLS0tIGxlbiAtLS0tLS0tLS0tLS0tLS0tLS18Ci0gKgkgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0gbmFtZSAtLS0tLS0tfAotICoJICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0gbmFtZWxlbiAtLS0tLXwKKy8qICAgICAgRm9yIGNhbGxpbmcgY2FzZV9vayhidWYsIGxlbiwgbmFtZWxlbiwgbmFtZSk6CisgKiAgICAgIC9hL2IvYy9kL2UvZi9nL2gvaS9qL2svc29tZV9sb25nX21vZHVsZV9uYW1lLnB5XDAKKyAqICAgICAgXiAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgIF4gICAgXgorICogICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJ1ZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tIGxlbiAtLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0tLSBuYW1lIC0tLS0tLS18CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0tIG5hbWVsZW4gLS0tLS18CiAgKi8KLQlpZiAoc2F2ZV9sZW4gKyAxMyA+PSBNQVhQQVRITEVOKQotCQlyZXR1cm4gMDsKLQlidWZbaSsrXSA9IFNFUDsKLQlwbmFtZSA9IGJ1ZiArIGk7Ci0Jc3RyY3B5KHBuYW1lLCAiX19pbml0X18ucHkiKTsKLQlpZiAoc3RhdChidWYsICZzdGF0YnVmKSA9PSAwKSB7Ci0JCWlmIChjYXNlX29rKGJ1ZiwKLQkJCSAgICBzYXZlX2xlbiArIDksCS8qIGxlbigiL19faW5pdF9fIikgKi8KLQkJICAgICAgICAgICAgOCwgICAJCS8qIGxlbigiX19pbml0X18iKSAqLwotCQkgICAgICAgICAgICBwbmFtZSkpIHsKLQkJCWJ1ZltzYXZlX2xlbl0gPSAnXDAnOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JaSArPSBzdHJsZW4ocG5hbWUpOwotCXN0cmNweShidWYraSwgUHlfT3B0aW1pemVGbGFnID8gIm8iIDogImMiKTsKLQlpZiAoc3RhdChidWYsICZzdGF0YnVmKSA9PSAwKSB7Ci0JCWlmIChjYXNlX29rKGJ1ZiwKLQkJCSAgICBzYXZlX2xlbiArIDksCS8qIGxlbigiL19faW5pdF9fIikgKi8KLQkJICAgICAgICAgICAgOCwgICAJCS8qIGxlbigiX19pbml0X18iKSAqLwotCQkgICAgICAgICAgICBwbmFtZSkpIHsKLQkJCWJ1ZltzYXZlX2xlbl0gPSAnXDAnOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JYnVmW3NhdmVfbGVuXSA9ICdcMCc7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNhdmVfbGVuICsgMTMgPj0gTUFYUEFUSExFTikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnVmW2krK10gPSBTRVA7CisgICAgcG5hbWUgPSBidWYgKyBpOworICAgIHN0cmNweShwbmFtZSwgIl9faW5pdF9fLnB5Iik7CisgICAgaWYgKHN0YXQoYnVmLCAmc3RhdGJ1ZikgPT0gMCkgeworICAgICAgICBpZiAoY2FzZV9vayhidWYsCisgICAgICAgICAgICAgICAgICAgIHNhdmVfbGVuICsgOSwgICAgICAgICAgICAgICAvKiBsZW4oIi9fX2luaXRfXyIpICovCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW4oIl9faW5pdF9fIikgKi8KKyAgICAgICAgICAgICAgICBwbmFtZSkpIHsKKyAgICAgICAgICAgIGJ1ZltzYXZlX2xlbl0gPSAnXDAnOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaSArPSBzdHJsZW4ocG5hbWUpOworICAgIHN0cmNweShidWYraSwgUHlfT3B0aW1pemVGbGFnID8gIm8iIDogImMiKTsKKyAgICBpZiAoc3RhdChidWYsICZzdGF0YnVmKSA9PSAwKSB7CisgICAgICAgIGlmIChjYXNlX29rKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV9sZW4gKyA5LCAgICAgICAgICAgICAgIC8qIGxlbigiL19faW5pdF9fIikgKi8KKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbigiX19pbml0X18iKSAqLworICAgICAgICAgICAgICAgIHBuYW1lKSkgeworICAgICAgICAgICAgYnVmW3NhdmVfbGVuXSA9ICdcMCc7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBidWZbc2F2ZV9sZW5dID0gJ1wwJzsKKyAgICByZXR1cm4gMDsKIH0KIAogI2Vsc2UKQEAgLTE3NjUsMzAgKzE3NjUsMzAgQEAKICNpZmRlZiBSSVNDT1MKIHN0YXRpYyBpbnQKIGZpbmRfaW5pdF9tb2R1bGUoYnVmKQotCWNoYXIgKmJ1ZjsKKyAgICBjaGFyICpidWY7CiB7Ci0JaW50IHNhdmVfbGVuID0gc3RybGVuKGJ1Zik7Ci0JaW50IGkgPSBzYXZlX2xlbjsKKyAgICBpbnQgc2F2ZV9sZW4gPSBzdHJsZW4oYnVmKTsKKyAgICBpbnQgaSA9IHNhdmVfbGVuOwogCi0JaWYgKHNhdmVfbGVuICsgMTMgPj0gTUFYUEFUSExFTikKLQkJcmV0dXJuIDA7Ci0JYnVmW2krK10gPSBTRVA7Ci0Jc3RyY3B5KGJ1ZitpLCAiX19pbml0X18vcHkiKTsKLQlpZiAoaXNmaWxlKGJ1ZikpIHsKLQkJYnVmW3NhdmVfbGVuXSA9ICdcMCc7Ci0JCXJldHVybiAxOwotCX0KKyAgICBpZiAoc2F2ZV9sZW4gKyAxMyA+PSBNQVhQQVRITEVOKQorICAgICAgICByZXR1cm4gMDsKKyAgICBidWZbaSsrXSA9IFNFUDsKKyAgICBzdHJjcHkoYnVmK2ksICJfX2luaXRfXy9weSIpOworICAgIGlmIChpc2ZpbGUoYnVmKSkgeworICAgICAgICBidWZbc2F2ZV9sZW5dID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogCi0JaWYgKFB5X09wdGltaXplRmxhZykKLQkJc3RyY3B5KGJ1ZitpLCAibyIpOwotCWVsc2UKLQkJc3RyY3B5KGJ1ZitpLCAiYyIpOwotCWlmIChpc2ZpbGUoYnVmKSkgewotCQlidWZbc2F2ZV9sZW5dID0gJ1wwJzsKLQkJcmV0dXJuIDE7Ci0JfQotCWJ1ZltzYXZlX2xlbl0gPSAnXDAnOwotCXJldHVybiAwOworICAgIGlmIChQeV9PcHRpbWl6ZUZsYWcpCisgICAgICAgIHN0cmNweShidWYraSwgIm8iKTsKKyAgICBlbHNlCisgICAgICAgIHN0cmNweShidWYraSwgImMiKTsKKyAgICBpZiAoaXNmaWxlKGJ1ZikpIHsKKyAgICAgICAgYnVmW3NhdmVfbGVuXSA9ICdcMCc7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBidWZbc2F2ZV9sZW5dID0gJ1wwJzsKKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKlJJU0NPUyovCiAKQEAgLTE4MDMsOTMgKzE4MDMsOTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkX21vZHVsZShjaGFyICpuYW1lLCBGSUxFICpmcCwgY2hhciAqcGF0aG5hbWUsIGludCB0eXBlLCBQeU9iamVjdCAqbG9hZGVyKQogewotCVB5T2JqZWN0ICptb2R1bGVzOwotCVB5T2JqZWN0ICptOwotCWludCBlcnI7CisgICAgUHlPYmplY3QgKm1vZHVsZXM7CisgICAgUHlPYmplY3QgKm07CisgICAgaW50IGVycjsKIAotCS8qIEZpcnN0IGNoZWNrIHRoYXQgdGhlcmUncyBhbiBvcGVuIGZpbGUgKGlmIHdlIG5lZWQgb25lKSAgKi8KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFBZX1NPVVJDRToKLQljYXNlIFBZX0NPTVBJTEVEOgotCQlpZiAoZnAgPT0gTlVMTCkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAiZmlsZSBvYmplY3QgcmVxdWlyZWQgZm9yIGltcG9ydCAodHlwZSBjb2RlICVkKSIsCi0JCQkJICAgICB0eXBlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIC8qIEZpcnN0IGNoZWNrIHRoYXQgdGhlcmUncyBhbiBvcGVuIGZpbGUgKGlmIHdlIG5lZWQgb25lKSAgKi8KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFBZX1NPVVJDRToKKyAgICBjYXNlIFBZX0NPTVBJTEVEOgorICAgICAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAiZmlsZSBvYmplY3QgcmVxdWlyZWQgZm9yIGltcG9ydCAodHlwZSBjb2RlICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXN3aXRjaCAodHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgewogCi0JY2FzZSBQWV9TT1VSQ0U6Ci0JCW0gPSBsb2FkX3NvdXJjZV9tb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKLQkJYnJlYWs7CisgICAgY2FzZSBQWV9TT1VSQ0U6CisgICAgICAgIG0gPSBsb2FkX3NvdXJjZV9tb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFBZX0NPTVBJTEVEOgotCQltID0gbG9hZF9jb21waWxlZF9tb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKLQkJYnJlYWs7CisgICAgY2FzZSBQWV9DT01QSUxFRDoKKyAgICAgICAgbSA9IGxvYWRfY29tcGlsZWRfbW9kdWxlKG5hbWUsIHBhdGhuYW1lLCBmcCk7CisgICAgICAgIGJyZWFrOwogCiAjaWZkZWYgSEFWRV9EWU5BTUlDX0xPQURJTkcKLQljYXNlIENfRVhURU5TSU9OOgotCQltID0gX1B5SW1wb3J0X0xvYWREeW5hbWljTW9kdWxlKG5hbWUsIHBhdGhuYW1lLCBmcCk7Ci0JCWJyZWFrOworICAgIGNhc2UgQ19FWFRFTlNJT046CisgICAgICAgIG0gPSBfUHlJbXBvcnRfTG9hZER5bmFtaWNNb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKKyAgICAgICAgYnJlYWs7CiAjZW5kaWYKIAotCWNhc2UgUEtHX0RJUkVDVE9SWToKLQkJbSA9IGxvYWRfcGFja2FnZShuYW1lLCBwYXRobmFtZSk7Ci0JCWJyZWFrOworICAgIGNhc2UgUEtHX0RJUkVDVE9SWToKKyAgICAgICAgbSA9IGxvYWRfcGFja2FnZShuYW1lLCBwYXRobmFtZSk7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBDX0JVSUxUSU46Ci0JY2FzZSBQWV9GUk9aRU46Ci0JCWlmIChwYXRobmFtZSAhPSBOVUxMICYmIHBhdGhuYW1lWzBdICE9ICdcMCcpCi0JCQluYW1lID0gcGF0aG5hbWU7Ci0JCWlmICh0eXBlID09IENfQlVJTFRJTikKLQkJCWVyciA9IGluaXRfYnVpbHRpbihuYW1lKTsKLQkJZWxzZQotCQkJZXJyID0gUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlKG5hbWUpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoZXJyID09IDApIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkgICAgICJQdXJwb3J0ZWQgJXMgbW9kdWxlICUuMjAwcyBub3QgZm91bmQiLAotCQkJCSAgICAgdHlwZSA9PSBDX0JVSUxUSU4gPwotCQkJCQkJImJ1aWx0aW4iIDogImZyb3plbiIsCi0JCQkJICAgICBuYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7Ci0JCW0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKTsKLQkJaWYgKG0gPT0gTlVMTCkgewotCQkJUHlFcnJfRm9ybWF0KAotCQkJCVB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSIlcyBtb2R1bGUgJS4yMDBzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZCIsCi0JCQkJdHlwZSA9PSBDX0JVSUxUSU4gPwotCQkJCQkiYnVpbHRpbiIgOiAiZnJvemVuIiwKLQkJCQluYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0lOQ1JFRihtKTsKLQkJYnJlYWs7CisgICAgY2FzZSBDX0JVSUxUSU46CisgICAgY2FzZSBQWV9GUk9aRU46CisgICAgICAgIGlmIChwYXRobmFtZSAhPSBOVUxMICYmIHBhdGhuYW1lWzBdICE9ICdcMCcpCisgICAgICAgICAgICBuYW1lID0gcGF0aG5hbWU7CisgICAgICAgIGlmICh0eXBlID09IENfQlVJTFRJTikKKyAgICAgICAgICAgIGVyciA9IGluaXRfYnVpbHRpbihuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJyID0gUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlKG5hbWUpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiUHVycG9ydGVkICVzIG1vZHVsZSAlLjIwMHMgbm90IGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IENfQlVJTFRJTiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVpbHRpbiIgOiAiZnJvemVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisgICAgICAgIG0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKTsKKyAgICAgICAgaWYgKG0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgICAgIFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICIlcyBtb2R1bGUgJS4yMDBzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZCIsCisgICAgICAgICAgICAgICAgdHlwZSA9PSBDX0JVSUxUSU4gPworICAgICAgICAgICAgICAgICAgICAiYnVpbHRpbiIgOiAiZnJvemVuIiwKKyAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihtKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIElNUF9IT09LOiB7Ci0JCWlmIChsb2FkZXIgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCQkiaW1wb3J0IGhvb2sgd2l0aG91dCBsb2FkZXIiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW0gPSBQeU9iamVjdF9DYWxsTWV0aG9kKGxvYWRlciwgImxvYWRfbW9kdWxlIiwgInMiLCBuYW1lKTsKLQkJYnJlYWs7Ci0JfQorICAgIGNhc2UgSU1QX0hPT0s6IHsKKyAgICAgICAgaWYgKGxvYWRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBob29rIHdpdGhvdXQgbG9hZGVyIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBtID0gUHlPYmplY3RfQ2FsbE1ldGhvZChsb2FkZXIsICJsb2FkX21vZHVsZSIsICJzIiwgbmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIkRvbid0IGtub3cgaG93IHRvIGltcG9ydCAlLjIwMHMgKHR5cGUgY29kZSAlZCkiLAotCQkJICAgICAgbmFtZSwgdHlwZSk7Ci0JCW0gPSBOVUxMOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJEb24ndCBrbm93IGhvdyB0byBpbXBvcnQgJS4yMDBzICh0eXBlIGNvZGUgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0eXBlKTsKKyAgICAgICAgbSA9IE5VTEw7CiAKLQl9CisgICAgfQogCi0JcmV0dXJuIG07CisgICAgcmV0dXJuIG07CiB9CiAKIApAQCAtMTkwMCwzMCArMTkwMCwzMCBAQAogc3RhdGljIGludAogaW5pdF9idWlsdGluKGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IF9pbml0dGFiICpwOworICAgIHN0cnVjdCBfaW5pdHRhYiAqcDsKIAotCWlmIChfUHlJbXBvcnRfRmluZEV4dGVuc2lvbihuYW1lLCBuYW1lKSAhPSBOVUxMKQotCQlyZXR1cm4gMTsKKyAgICBpZiAoX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24obmFtZSwgbmFtZSkgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlmb3IgKHAgPSBQeUltcG9ydF9Jbml0dGFiOyBwLT5uYW1lICE9IE5VTEw7IHArKykgewotCQlpZiAoc3RyY21wKG5hbWUsIHAtPm5hbWUpID09IDApIHsKLQkJCWlmIChwLT5pbml0ZnVuYyA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSAgICAiQ2Fubm90IHJlLWluaXQgaW50ZXJuYWwgbW9kdWxlICUuMjAwcyIsCi0JCQkJICAgIG5hbWUpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQlQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgYnVpbHRpblxuIiwgbmFtZSk7Ci0JCQkoKnAtPmluaXRmdW5jKSgpOwotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKF9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbihuYW1lLCBuYW1lKSA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCXJldHVybiAwOworICAgIGZvciAocCA9IFB5SW1wb3J0X0luaXR0YWI7IHAtPm5hbWUgIT0gTlVMTDsgcCsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgcC0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKHAtPmluaXRmdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmUtaW5pdCBpbnRlcm5hbCBtb2R1bGUgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBidWlsdGluXG4iLCBuYW1lKTsKKyAgICAgICAgICAgICgqcC0+aW5pdGZ1bmMpKCk7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKG5hbWUsIG5hbWUpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMTkzMiwzOSArMTkzMiwzOSBAQAogc3RhdGljIHN0cnVjdCBfZnJvemVuICoKIGZpbmRfZnJvemVuKGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IF9mcm96ZW4gKnA7CisgICAgc3RydWN0IF9mcm96ZW4gKnA7CiAKLQlmb3IgKHAgPSBQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzOyA7IHArKykgewotCQlpZiAocC0+bmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChzdHJjbXAocC0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gcDsKKyAgICBmb3IgKHAgPSBQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzOyA7IHArKykgeworICAgICAgICBpZiAocC0+bmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzdHJjbXAocC0+bmFtZSwgbmFtZSkgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9mcm96ZW5fb2JqZWN0KGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IF9mcm96ZW4gKnAgPSBmaW5kX2Zyb3plbihuYW1lKTsKLQlpbnQgc2l6ZTsKKyAgICBzdHJ1Y3QgX2Zyb3plbiAqcCA9IGZpbmRfZnJvemVuKG5hbWUpOworICAgIGludCBzaXplOwogCi0JaWYgKHAgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJObyBzdWNoIGZyb3plbiBvYmplY3QgbmFtZWQgJS4yMDBzIiwKLQkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocC0+Y29kZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIkV4Y2x1ZGVkIGZyb3plbiBvYmplY3QgbmFtZWQgJS4yMDBzIiwKLQkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzaXplID0gcC0+c2l6ZTsKLQlpZiAoc2l6ZSA8IDApCi0JCXNpemUgPSAtc2l6ZTsKLQlyZXR1cm4gUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKChjaGFyICopcC0+Y29kZSwgc2l6ZSk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTm8gc3VjaCBmcm96ZW4gb2JqZWN0IG5hbWVkICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwLT5jb2RlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkV4Y2x1ZGVkIGZyb3plbiBvYmplY3QgbmFtZWQgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2l6ZSA9IHAtPnNpemU7CisgICAgaWYgKHNpemUgPCAwKQorICAgICAgICBzaXplID0gLXNpemU7CisgICAgcmV0dXJuIFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZygoY2hhciAqKXAtPmNvZGUsIHNpemUpOwogfQogCiAvKiBJbml0aWFsaXplIGEgZnJvemVuIG1vZHVsZS4KQEAgLTE5NzUsNjEgKzE5NzUsNjEgQEAKIGludAogUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlKGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IF9mcm96ZW4gKnAgPSBmaW5kX2Zyb3plbihuYW1lKTsKLQlQeU9iamVjdCAqY287Ci0JUHlPYmplY3QgKm07Ci0JaW50IGlzcGFja2FnZTsKLQlpbnQgc2l6ZTsKKyAgICBzdHJ1Y3QgX2Zyb3plbiAqcCA9IGZpbmRfZnJvemVuKG5hbWUpOworICAgIFB5T2JqZWN0ICpjbzsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBpbnQgaXNwYWNrYWdlOworICAgIGludCBzaXplOwogCi0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHAtPmNvZGUgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJFeGNsdWRlZCBmcm96ZW4gb2JqZWN0IG5hbWVkICUuMjAwcyIsCi0JCQkgICAgIG5hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNpemUgPSBwLT5zaXplOwotCWlzcGFja2FnZSA9IChzaXplIDwgMCk7Ci0JaWYgKGlzcGFja2FnZSkKLQkJc2l6ZSA9IC1zaXplOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGZyb3plbiVzXG4iLAotCQkJbmFtZSwgaXNwYWNrYWdlID8gIiBwYWNrYWdlIiA6ICIiKTsKLQljbyA9IFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZygoY2hhciAqKXAtPmNvZGUsIHNpemUpOwotCWlmIChjbyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFQeUNvZGVfQ2hlY2soY28pKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJmcm96ZW4gb2JqZWN0ICUuMjAwcyBpcyBub3QgYSBjb2RlIG9iamVjdCIsCi0JCQkgICAgIG5hbWUpOwotCQlnb3RvIGVycl9yZXR1cm47Ci0JfQotCWlmIChpc3BhY2thZ2UpIHsKLQkJLyogU2V0IF9fcGF0aF9fIHRvIHRoZSBwYWNrYWdlIG5hbWUgKi8KLQkJUHlPYmplY3QgKmQsICpzOwotCQlpbnQgZXJyOwotCQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOwotCQlpZiAobSA9PSBOVUxMKQotCQkJZ290byBlcnJfcmV0dXJuOwotCQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQkJcyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobmFtZSk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlnb3RvIGVycl9yZXR1cm47Ci0JCWVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX3BhdGhfXyIsIHMpOwotCQlQeV9ERUNSRUYocyk7Ci0JCWlmIChlcnIgIT0gMCkKLQkJCWdvdG8gZXJyX3JldHVybjsKLQl9Ci0JbSA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgobmFtZSwgY28sICI8ZnJvemVuPiIpOwotCWlmIChtID09IE5VTEwpCi0JCWdvdG8gZXJyX3JldHVybjsKLQlQeV9ERUNSRUYoY28pOwotCVB5X0RFQ1JFRihtKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocC0+Y29kZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJFeGNsdWRlZCBmcm96ZW4gb2JqZWN0IG5hbWVkICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzaXplID0gcC0+c2l6ZTsKKyAgICBpc3BhY2thZ2UgPSAoc2l6ZSA8IDApOworICAgIGlmIChpc3BhY2thZ2UpCisgICAgICAgIHNpemUgPSAtc2l6ZTsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBmcm96ZW4lc1xuIiwKKyAgICAgICAgICAgIG5hbWUsIGlzcGFja2FnZSA/ICIgcGFja2FnZSIgOiAiIik7CisgICAgY28gPSBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcoKGNoYXIgKilwLT5jb2RlLCBzaXplKTsKKyAgICBpZiAoY28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlDb2RlX0NoZWNrKGNvKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImZyb3plbiBvYmplY3QgJS4yMDBzIGlzIG5vdCBhIGNvZGUgb2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICBnb3RvIGVycl9yZXR1cm47CisgICAgfQorICAgIGlmIChpc3BhY2thZ2UpIHsKKyAgICAgICAgLyogU2V0IF9fcGF0aF9fIHRvIHRoZSBwYWNrYWdlIG5hbWUgKi8KKyAgICAgICAgUHlPYmplY3QgKmQsICpzOworICAgICAgICBpbnQgZXJyOworICAgICAgICBtID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOworICAgICAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJfcmV0dXJuOworICAgICAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICAgICAgcyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobmFtZSk7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycl9yZXR1cm47CisgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX3BhdGhfXyIsIHMpOworICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyX3JldHVybjsKKyAgICB9CisgICAgbSA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgobmFtZSwgY28sICI8ZnJvemVuPiIpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyX3JldHVybjsKKyAgICBQeV9ERUNSRUYoY28pOworICAgIFB5X0RFQ1JFRihtKTsKKyAgICByZXR1cm4gMTsKIGVycl9yZXR1cm46Ci0JUHlfREVDUkVGKGNvKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKGNvKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIApAQCAtMjAzOSwxNSArMjAzOSwxNSBAQAogUHlPYmplY3QgKgogUHlJbXBvcnRfSW1wb3J0TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKnBuYW1lOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnBuYW1lOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlwbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7Ci0JaWYgKHBuYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IFB5SW1wb3J0X0ltcG9ydChwbmFtZSk7Ci0JUHlfREVDUkVGKHBuYW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHBuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKKyAgICBpZiAocG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlJbXBvcnRfSW1wb3J0KHBuYW1lKTsKKyAgICBQeV9ERUNSRUYocG5hbWUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEltcG9ydCBhIG1vZHVsZSB3aXRob3V0IGJsb2NraW5nCkBAIC0yMDYyLDEzNyArMjA2MiwxMzcgQEAKIFB5T2JqZWN0ICoKIFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soY29uc3QgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICptb2R1bGVzOwotCWxvbmcgbWU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqbW9kdWxlczsKKyAgICBsb25nIG1lOwogCi0JLyogVHJ5IHRvIGdldCB0aGUgbW9kdWxlIGZyb20gc3lzLm1vZHVsZXNbbmFtZV0gKi8KLQltb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOwotCWlmIChtb2R1bGVzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIFRyeSB0byBnZXQgdGhlIG1vZHVsZSBmcm9tIHN5cy5tb2R1bGVzW25hbWVdICovCisgICAgbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKyAgICBpZiAobW9kdWxlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpOwotCWlmIChyZXN1bHQgIT0gTlVMTCkgewotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQorICAgIHJlc3VsdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQogI2lmZGVmIFdJVEhfVEhSRUFECi0JLyogY2hlY2sgdGhlIGltcG9ydCBsb2NrCi0JICogbWUgbWlnaHQgYmUgLTEgYnV0IEkgaWdub3JlIHRoZSBlcnJvciBoZXJlLCB0aGUgbG9jayBmdW5jdGlvbgotCSAqIHRha2VzIGNhcmUgb2YgdGhlIHByb2JsZW0gKi8KLQltZSA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQlpZiAoaW1wb3J0X2xvY2tfdGhyZWFkID09IC0xIHx8IGltcG9ydF9sb2NrX3RocmVhZCA9PSBtZSkgewotCQkvKiBubyB0aHJlYWQgb3IgbWUgaXMgaG9sZGluZyB0aGUgbG9jayAqLwotCQlyZXR1cm4gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKG5hbWUpOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJICAgICAiRmFpbGVkIHRvIGltcG9ydCAlLjIwMHMgYmVjYXVzZSB0aGUgaW1wb3J0IGxvY2siCi0JCQkgICAgICJpcyBoZWxkIGJ5IGFub3RoZXIgdGhyZWFkLiIsCi0JCQkgICAgIG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogY2hlY2sgdGhlIGltcG9ydCBsb2NrCisgICAgICogbWUgbWlnaHQgYmUgLTEgYnV0IEkgaWdub3JlIHRoZSBlcnJvciBoZXJlLCB0aGUgbG9jayBmdW5jdGlvbgorICAgICAqIHRha2VzIGNhcmUgb2YgdGhlIHByb2JsZW0gKi8KKyAgICBtZSA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBpZiAoaW1wb3J0X2xvY2tfdGhyZWFkID09IC0xIHx8IGltcG9ydF9sb2NrX3RocmVhZCA9PSBtZSkgeworICAgICAgICAvKiBubyB0aHJlYWQgb3IgbWUgaXMgaG9sZGluZyB0aGUgbG9jayAqLworICAgICAgICByZXR1cm4gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKG5hbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbXBvcnQgJS4yMDBzIGJlY2F1c2UgdGhlIGltcG9ydCBsb2NrIgorICAgICAgICAgICAgICAgICAgICAgImlzIGhlbGQgYnkgYW5vdGhlciB0aHJlYWQuIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZWxzZQotCXJldHVybiBQeUltcG9ydF9JbXBvcnRNb2R1bGUobmFtZSk7CisgICAgcmV0dXJuIFB5SW1wb3J0X0ltcG9ydE1vZHVsZShuYW1lKTsKICNlbmRpZgogfQogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgaGVscGVyIHJvdXRpbmVzICovCiBzdGF0aWMgUHlPYmplY3QgKmdldF9wYXJlbnQoUHlPYmplY3QgKmdsb2JhbHMsIGNoYXIgKmJ1ZiwKLQkJCSAgICBQeV9zc2l6ZV90ICpwX2J1ZmxlbiwgaW50IGxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpwX2J1ZmxlbiwgaW50IGxldmVsKTsKIHN0YXRpYyBQeU9iamVjdCAqbG9hZF9uZXh0KFB5T2JqZWN0ICptb2QsIFB5T2JqZWN0ICphbHRtb2QsCi0JCQkgICBjaGFyICoqcF9uYW1lLCBjaGFyICpidWYsIFB5X3NzaXplX3QgKnBfYnVmbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipwX25hbWUsIGNoYXIgKmJ1ZiwgUHlfc3NpemVfdCAqcF9idWZsZW4pOwogc3RhdGljIGludCBtYXJrX21pc3MoY2hhciAqbmFtZSk7CiBzdGF0aWMgaW50IGVuc3VyZV9mcm9tbGlzdChQeU9iamVjdCAqbW9kLCBQeU9iamVjdCAqZnJvbWxpc3QsCi0JCQkgICBjaGFyICpidWYsIFB5X3NzaXplX3QgYnVmbGVuLCBpbnQgcmVjdXJzaXZlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZiwgUHlfc3NpemVfdCBidWZsZW4sIGludCByZWN1cnNpdmUpOwogc3RhdGljIFB5T2JqZWN0ICogaW1wb3J0X3N1Ym1vZHVsZShQeU9iamVjdCAqbW9kLCBjaGFyICpuYW1lLCBjaGFyICpmdWxsbmFtZSk7CiAKIC8qIFRoZSBNYWdudW0gT3B1cyBvZiBkb3R0ZWQtbmFtZSBpbXBvcnQgOi0pICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBvcnRfbW9kdWxlX2xldmVsKGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLAotCQkgICAgUHlPYmplY3QgKmZyb21saXN0LCBpbnQgbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpmcm9tbGlzdCwgaW50IGxldmVsKQogewotCWNoYXIgYnVmW01BWFBBVEhMRU4rMV07Ci0JUHlfc3NpemVfdCBidWZsZW4gPSAwOwotCVB5T2JqZWN0ICpwYXJlbnQsICpoZWFkLCAqbmV4dCwgKnRhaWw7CisgICAgY2hhciBidWZbTUFYUEFUSExFTisxXTsKKyAgICBQeV9zc2l6ZV90IGJ1ZmxlbiA9IDA7CisgICAgUHlPYmplY3QgKnBhcmVudCwgKmhlYWQsICpuZXh0LCAqdGFpbDsKIAotCWlmIChzdHJjaHIobmFtZSwgJy8nKSAhPSBOVUxMCisgICAgaWYgKHN0cmNocihuYW1lLCAnLycpICE9IE5VTEwKICNpZmRlZiBNU19XSU5ET1dTCi0JICAgIHx8IHN0cmNocihuYW1lLCAnXFwnKSAhPSBOVUxMCisgICAgICAgIHx8IHN0cmNocihuYW1lLCAnXFwnKSAhPSBOVUxMCiAjZW5kaWYKLQkJKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkiSW1wb3J0IGJ5IGZpbGVuYW1lIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbXBvcnQgYnkgZmlsZW5hbWUgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcGFyZW50ID0gZ2V0X3BhcmVudChnbG9iYWxzLCBidWYsICZidWZsZW4sIGxldmVsKTsKLQlpZiAocGFyZW50ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHBhcmVudCA9IGdldF9wYXJlbnQoZ2xvYmFscywgYnVmLCAmYnVmbGVuLCBsZXZlbCk7CisgICAgaWYgKHBhcmVudCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWhlYWQgPSBsb2FkX25leHQocGFyZW50LCBQeV9Ob25lLCAmbmFtZSwgYnVmLCAmYnVmbGVuKTsKLQlpZiAoaGVhZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBoZWFkID0gbG9hZF9uZXh0KHBhcmVudCwgUHlfTm9uZSwgJm5hbWUsIGJ1ZiwgJmJ1Zmxlbik7CisgICAgaWYgKGhlYWQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl0YWlsID0gaGVhZDsKLQlQeV9JTkNSRUYodGFpbCk7Ci0Jd2hpbGUgKG5hbWUpIHsKLQkJbmV4dCA9IGxvYWRfbmV4dCh0YWlsLCB0YWlsLCAmbmFtZSwgYnVmLCAmYnVmbGVuKTsKLQkJUHlfREVDUkVGKHRhaWwpOwotCQlpZiAobmV4dCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoaGVhZCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQl0YWlsID0gbmV4dDsKLQl9Ci0JaWYgKHRhaWwgPT0gUHlfTm9uZSkgewotCQkvKiBJZiB0YWlsIGlzIFB5X05vbmUsIGJvdGggZ2V0X3BhcmVudCBhbmQgbG9hZF9uZXh0IGZvdW5kCi0JCSAgIGFuIGVtcHR5IG1vZHVsZSBuYW1lOiBzb21lb25lIGNhbGxlZCBfX2ltcG9ydF9fKCIiKSBvcgotCQkgICBkb2N0b3JlZCBmYXVsdHkgYnl0ZWNvZGUgKi8KLQkJUHlfREVDUkVGKHRhaWwpOwotCQlQeV9ERUNSRUYoaGVhZCk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJFbXB0eSBtb2R1bGUgbmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgdGFpbCA9IGhlYWQ7CisgICAgUHlfSU5DUkVGKHRhaWwpOworICAgIHdoaWxlIChuYW1lKSB7CisgICAgICAgIG5leHQgPSBsb2FkX25leHQodGFpbCwgdGFpbCwgJm5hbWUsIGJ1ZiwgJmJ1Zmxlbik7CisgICAgICAgIFB5X0RFQ1JFRih0YWlsKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGhlYWQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdGFpbCA9IG5leHQ7CisgICAgfQorICAgIGlmICh0YWlsID09IFB5X05vbmUpIHsKKyAgICAgICAgLyogSWYgdGFpbCBpcyBQeV9Ob25lLCBib3RoIGdldF9wYXJlbnQgYW5kIGxvYWRfbmV4dCBmb3VuZAorICAgICAgICAgICBhbiBlbXB0eSBtb2R1bGUgbmFtZTogc29tZW9uZSBjYWxsZWQgX19pbXBvcnRfXygiIikgb3IKKyAgICAgICAgICAgZG9jdG9yZWQgZmF1bHR5IGJ5dGVjb2RlICovCisgICAgICAgIFB5X0RFQ1JFRih0YWlsKTsKKyAgICAgICAgUHlfREVDUkVGKGhlYWQpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFbXB0eSBtb2R1bGUgbmFtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZnJvbWxpc3QgIT0gTlVMTCkgewotCQlpZiAoZnJvbWxpc3QgPT0gUHlfTm9uZSB8fCAhUHlPYmplY3RfSXNUcnVlKGZyb21saXN0KSkKLQkJCWZyb21saXN0ID0gTlVMTDsKLQl9CisgICAgaWYgKGZyb21saXN0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGZyb21saXN0ID09IFB5X05vbmUgfHwgIVB5T2JqZWN0X0lzVHJ1ZShmcm9tbGlzdCkpCisgICAgICAgICAgICBmcm9tbGlzdCA9IE5VTEw7CisgICAgfQogCi0JaWYgKGZyb21saXN0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHRhaWwpOwotCQlyZXR1cm4gaGVhZDsKLQl9CisgICAgaWYgKGZyb21saXN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHRhaWwpOworICAgICAgICByZXR1cm4gaGVhZDsKKyAgICB9CiAKLQlQeV9ERUNSRUYoaGVhZCk7Ci0JaWYgKCFlbnN1cmVfZnJvbWxpc3QodGFpbCwgZnJvbWxpc3QsIGJ1ZiwgYnVmbGVuLCAwKSkgewotCQlQeV9ERUNSRUYodGFpbCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9ERUNSRUYoaGVhZCk7CisgICAgaWYgKCFlbnN1cmVfZnJvbWxpc3QodGFpbCwgZnJvbWxpc3QsIGJ1ZiwgYnVmbGVuLCAwKSkgeworICAgICAgICBQeV9ERUNSRUYodGFpbCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiB0YWlsOworICAgIHJldHVybiB0YWlsOwogfQogCiBQeU9iamVjdCAqCiBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbChjaGFyICpuYW1lLCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscywKLQkJCSBQeU9iamVjdCAqZnJvbWxpc3QsIGludCBsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZnJvbWxpc3QsIGludCBsZXZlbCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCV9QeUltcG9ydF9BY3F1aXJlTG9jaygpOwotCXJlc3VsdCA9IGltcG9ydF9tb2R1bGVfbGV2ZWwobmFtZSwgZ2xvYmFscywgbG9jYWxzLCBmcm9tbGlzdCwgbGV2ZWwpOwotCWlmIChfUHlJbXBvcnRfUmVsZWFzZUxvY2soKSA8IDApIHsKLQkJUHlfWERFQ1JFRihyZXN1bHQpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJub3QgaG9sZGluZyB0aGUgaW1wb3J0IGxvY2siKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBfUHlJbXBvcnRfQWNxdWlyZUxvY2soKTsKKyAgICByZXN1bHQgPSBpbXBvcnRfbW9kdWxlX2xldmVsKG5hbWUsIGdsb2JhbHMsIGxvY2FscywgZnJvbWxpc3QsIGxldmVsKTsKKyAgICBpZiAoX1B5SW1wb3J0X1JlbGVhc2VMb2NrKCkgPCAwKSB7CisgICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgaG9sZGluZyB0aGUgaW1wb3J0IGxvY2siKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFJldHVybiB0aGUgcGFja2FnZSB0aGF0IGFuIGltcG9ydCBpcyBiZWluZyBwZXJmb3JtZWQgaW4uICBJZiBnbG9iYWxzIGNvbWVzCkBAIC0yMjA5LDQwMCArMjIwOSw0MDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcGFyZW50KFB5T2JqZWN0ICpnbG9iYWxzLCBjaGFyICpidWYsIFB5X3NzaXplX3QgKnBfYnVmbGVuLCBpbnQgbGV2ZWwpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpuYW1lc3RyID0gTlVMTDsKLQlzdGF0aWMgUHlPYmplY3QgKnBhdGhzdHIgPSBOVUxMOwotCXN0YXRpYyBQeU9iamVjdCAqcGtnc3RyID0gTlVMTDsKLQlQeU9iamVjdCAqcGtnbmFtZSwgKm1vZG5hbWUsICptb2RwYXRoLCAqbW9kdWxlcywgKnBhcmVudDsKLQlpbnQgb3JpZ19sZXZlbCA9IGxldmVsOworICAgIHN0YXRpYyBQeU9iamVjdCAqbmFtZXN0ciA9IE5VTEw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpwYXRoc3RyID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnBrZ3N0ciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnBrZ25hbWUsICptb2RuYW1lLCAqbW9kcGF0aCwgKm1vZHVsZXMsICpwYXJlbnQ7CisgICAgaW50IG9yaWdfbGV2ZWwgPSBsZXZlbDsKIAotCWlmIChnbG9iYWxzID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhnbG9iYWxzKSB8fCAhbGV2ZWwpCi0JCXJldHVybiBQeV9Ob25lOworICAgIGlmIChnbG9iYWxzID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhnbG9iYWxzKSB8fCAhbGV2ZWwpCisgICAgICAgIHJldHVybiBQeV9Ob25lOwogCi0JaWYgKG5hbWVzdHIgPT0gTlVMTCkgewotCQluYW1lc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uYW1lX18iKTsKLQkJaWYgKG5hbWVzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAocGF0aHN0ciA9PSBOVUxMKSB7Ci0JCXBhdGhzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3BhdGhfXyIpOwotCQlpZiAocGF0aHN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChwa2dzdHIgPT0gTlVMTCkgewotCQlwa2dzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3BhY2thZ2VfXyIpOwotCQlpZiAocGtnc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG5hbWVzdHIgPT0gTlVMTCkgeworICAgICAgICBuYW1lc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uYW1lX18iKTsKKyAgICAgICAgaWYgKG5hbWVzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocGF0aHN0ciA9PSBOVUxMKSB7CisgICAgICAgIHBhdGhzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3BhdGhfXyIpOworICAgICAgICBpZiAocGF0aHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwa2dzdHIgPT0gTlVMTCkgeworICAgICAgICBwa2dzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3BhY2thZ2VfXyIpOworICAgICAgICBpZiAocGtnc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkqYnVmID0gJ1wwJzsKLQkqcF9idWZsZW4gPSAwOwotCXBrZ25hbWUgPSBQeURpY3RfR2V0SXRlbShnbG9iYWxzLCBwa2dzdHIpOworICAgICpidWYgPSAnXDAnOworICAgICpwX2J1ZmxlbiA9IDA7CisgICAgcGtnbmFtZSA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIHBrZ3N0cik7CiAKLQlpZiAoKHBrZ25hbWUgIT0gTlVMTCkgJiYgKHBrZ25hbWUgIT0gUHlfTm9uZSkpIHsKLQkJLyogX19wYWNrYWdlX18gaXMgc2V0LCBzbyB1c2UgaXQgKi8KLQkJUHlfc3NpemVfdCBsZW47Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2socGtnbmFtZSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiX19wYWNrYWdlX18gc2V0IHRvIG5vbi1zdHJpbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHBrZ25hbWUpOwotCQlpZiAobGVuID09IDApIHsKLQkJCWlmIChsZXZlbCA+IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIkF0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgaW4gbm9uLXBhY2thZ2UiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXJldHVybiBQeV9Ob25lOwotCQl9Ci0JCWlmIChsZW4gPiBNQVhQQVRITEVOKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIlBhY2thZ2UgbmFtZSB0b28gbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3RyY3B5KGJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHBrZ25hbWUpKTsKLQl9IGVsc2UgewotCQkvKiBfX3BhY2thZ2VfXyBub3Qgc2V0LCBzbyBmaWd1cmUgaXQgb3V0IGFuZCBzZXQgaXQgKi8KLQkJbW9kbmFtZSA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIG5hbWVzdHIpOwotCQlpZiAobW9kbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhtb2RuYW1lKSkKLQkJCXJldHVybiBQeV9Ob25lOworICAgIGlmICgocGtnbmFtZSAhPSBOVUxMKSAmJiAocGtnbmFtZSAhPSBQeV9Ob25lKSkgeworICAgICAgICAvKiBfX3BhY2thZ2VfXyBpcyBzZXQsIHNvIHVzZSBpdCAqLworICAgICAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhwa2duYW1lKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fcGFja2FnZV9fIHNldCB0byBub24tc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShwa2duYW1lKTsKKyAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGluIG5vbi1wYWNrYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuID4gTUFYUEFUSExFTikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhY2thZ2UgbmFtZSB0b28gbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KGJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHBrZ25hbWUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBfX3BhY2thZ2VfXyBub3Qgc2V0LCBzbyBmaWd1cmUgaXQgb3V0IGFuZCBzZXQgaXQgKi8KKyAgICAgICAgbW9kbmFtZSA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIG5hbWVzdHIpOworICAgICAgICBpZiAobW9kbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhtb2RuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOwogCi0JCW1vZHBhdGggPSBQeURpY3RfR2V0SXRlbShnbG9iYWxzLCBwYXRoc3RyKTsKLQkJaWYgKG1vZHBhdGggIT0gTlVMTCkgewotCQkJLyogX19wYXRoX18gaXMgc2V0LCBzbyBtb2RuYW1lIGlzIGFscmVhZHkgdGhlIHBhY2thZ2UgbmFtZSAqLwotCQkJUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShtb2RuYW1lKTsKLQkJCWludCBlcnJvcjsKLQkJCWlmIChsZW4gPiBNQVhQQVRITEVOKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiTW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXN0cmNweShidWYsIFB5U3RyaW5nX0FTX1NUUklORyhtb2RuYW1lKSk7Ci0JCQllcnJvciA9IFB5RGljdF9TZXRJdGVtKGdsb2JhbHMsIHBrZ3N0ciwgbW9kbmFtZSk7Ci0JCQlpZiAoZXJyb3IpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJDb3VsZCBub3Qgc2V0IF9fcGFja2FnZV9fIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBOb3JtYWwgbW9kdWxlLCBzbyB3b3JrIG91dCB0aGUgcGFja2FnZSBuYW1lIGlmIGFueSAqLwotCQkJY2hhciAqc3RhcnQgPSBQeVN0cmluZ19BU19TVFJJTkcobW9kbmFtZSk7Ci0JCQljaGFyICpsYXN0ZG90ID0gc3RycmNocihzdGFydCwgJy4nKTsKLQkJCXNpemVfdCBsZW47Ci0JCQlpbnQgZXJyb3I7Ci0JCQlpZiAobGFzdGRvdCA9PSBOVUxMICYmIGxldmVsID4gMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBpbiBub24tcGFja2FnZSIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKGxhc3Rkb3QgPT0gTlVMTCkgewotCQkJCWVycm9yID0gUHlEaWN0X1NldEl0ZW0oZ2xvYmFscywgcGtnc3RyLCBQeV9Ob25lKTsKLQkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiQ291bGQgbm90IHNldCBfX3BhY2thZ2VfXyIpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJcmV0dXJuIFB5X05vbmU7Ci0JCQl9Ci0JCQlsZW4gPSBsYXN0ZG90IC0gc3RhcnQ7Ci0JCQlpZiAobGVuID49IE1BWFBBVEhMRU4pIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJNb2R1bGUgbmFtZSB0b28gbG9uZyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJc3RybmNweShidWYsIHN0YXJ0LCBsZW4pOwotCQkJYnVmW2xlbl0gPSAnXDAnOwotCQkJcGtnbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKLQkJCWlmIChwa2duYW1lID09IE5VTEwpIHsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWVycm9yID0gUHlEaWN0X1NldEl0ZW0oZ2xvYmFscywgcGtnc3RyLCBwa2duYW1lKTsKLQkJCVB5X0RFQ1JFRihwa2duYW1lKTsKLQkJCWlmIChlcnJvcikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJIkNvdWxkIG5vdCBzZXQgX19wYWNrYWdlX18iKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQl3aGlsZSAoLS1sZXZlbCA+IDApIHsKLQkJY2hhciAqZG90ID0gc3RycmNocihidWYsICcuJyk7Ci0JCWlmIChkb3QgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIkF0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgYmV5b25kICIKLQkJCQkidG9wbGV2ZWwgcGFja2FnZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJKmRvdCA9ICdcMCc7Ci0JfQotCSpwX2J1ZmxlbiA9IHN0cmxlbihidWYpOworICAgICAgICBtb2RwYXRoID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgcGF0aHN0cik7CisgICAgICAgIGlmIChtb2RwYXRoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIF9fcGF0aF9fIGlzIHNldCwgc28gbW9kbmFtZSBpcyBhbHJlYWR5IHRoZSBwYWNrYWdlIG5hbWUgKi8KKyAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUobW9kbmFtZSk7CisgICAgICAgICAgICBpbnQgZXJyb3I7CisgICAgICAgICAgICBpZiAobGVuID4gTUFYUEFUSExFTikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmNweShidWYsIFB5U3RyaW5nX0FTX1NUUklORyhtb2RuYW1lKSk7CisgICAgICAgICAgICBlcnJvciA9IFB5RGljdF9TZXRJdGVtKGdsb2JhbHMsIHBrZ3N0ciwgbW9kbmFtZSk7CisgICAgICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgX19wYWNrYWdlX18iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vcm1hbCBtb2R1bGUsIHNvIHdvcmsgb3V0IHRoZSBwYWNrYWdlIG5hbWUgaWYgYW55ICovCisgICAgICAgICAgICBjaGFyICpzdGFydCA9IFB5U3RyaW5nX0FTX1NUUklORyhtb2RuYW1lKTsKKyAgICAgICAgICAgIGNoYXIgKmxhc3Rkb3QgPSBzdHJyY2hyKHN0YXJ0LCAnLicpOworICAgICAgICAgICAgc2l6ZV90IGxlbjsKKyAgICAgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgICAgIGlmIChsYXN0ZG90ID09IE5VTEwgJiYgbGV2ZWwgPiAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGluIG5vbi1wYWNrYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdGRvdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBQeURpY3RfU2V0SXRlbShnbG9iYWxzLCBwa2dzdHIsIFB5X05vbmUpOworICAgICAgICAgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IF9fcGFja2FnZV9fIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbiA9IGxhc3Rkb3QgLSBzdGFydDsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gTUFYUEFUSExFTikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm5jcHkoYnVmLCBzdGFydCwgbGVuKTsKKyAgICAgICAgICAgIGJ1ZltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIHBrZ25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgICAgICAgICBpZiAocGtnbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvciA9IFB5RGljdF9TZXRJdGVtKGdsb2JhbHMsIHBrZ3N0ciwgcGtnbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocGtnbmFtZSk7CisgICAgICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgX19wYWNrYWdlX18iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoLS1sZXZlbCA+IDApIHsKKyAgICAgICAgY2hhciAqZG90ID0gc3RycmNocihidWYsICcuJyk7CisgICAgICAgIGlmIChkb3QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgYmV5b25kICIKKyAgICAgICAgICAgICAgICAidG9wbGV2ZWwgcGFja2FnZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKmRvdCA9ICdcMCc7CisgICAgfQorICAgICpwX2J1ZmxlbiA9IHN0cmxlbihidWYpOwogCi0JbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQlwYXJlbnQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBidWYpOwotCWlmIChwYXJlbnQgPT0gTlVMTCkgewotCQlpZiAob3JpZ19sZXZlbCA8IDEpIHsKLQkJCVB5T2JqZWN0ICplcnJfbXNnID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgKLQkJCQkiUGFyZW50IG1vZHVsZSAnJS4yMDBzJyBub3QgZm91bmQgIgotCQkJCSJ3aGlsZSBoYW5kbGluZyBhYnNvbHV0ZSBpbXBvcnQiLCBidWYpOwotCQkJaWYgKGVycl9tc2cgPT0gTlVMTCkgewotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKCFQeUVycl9XYXJuRXgoUHlFeGNfUnVudGltZVdhcm5pbmcsCi0JCQkJCVB5U3RyaW5nX0FzU3RyaW5nKGVycl9tc2cpLCAxKSkgewotCQkJCSpidWYgPSAnXDAnOwotCQkJCSpwX2J1ZmxlbiA9IDA7Ci0JCQkJcGFyZW50ID0gUHlfTm9uZTsKLQkJCX0KLQkJCVB5X0RFQ1JFRihlcnJfbXNnKTsKLQkJfSBlbHNlIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiUGFyZW50IG1vZHVsZSAnJS4yMDBzJyBub3QgbG9hZGVkLCAiCi0JCQkJImNhbm5vdCBwZXJmb3JtIHJlbGF0aXZlIGltcG9ydCIsIGJ1Zik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHBhcmVudDsKLQkvKiBXZSBleHBlY3QsIGJ1dCBjYW4ndCBndWFyYW50ZWUsIGlmIHBhcmVudCAhPSBOb25lLCB0aGF0OgotCSAgIC0gcGFyZW50Ll9fbmFtZV9fID09IGJ1ZgotCSAgIC0gcGFyZW50Ll9fZGljdF9fIGlzIGdsb2JhbHMKLQkgICBJZiB0aGlzIGlzIHZpb2xhdGVkLi4uICBXaG8gY2FyZXM/ICovCisgICAgbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKyAgICBwYXJlbnQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBidWYpOworICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgeworICAgICAgICBpZiAob3JpZ19sZXZlbCA8IDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICplcnJfbXNnID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgKKyAgICAgICAgICAgICAgICAiUGFyZW50IG1vZHVsZSAnJS4yMDBzJyBub3QgZm91bmQgIgorICAgICAgICAgICAgICAgICJ3aGlsZSBoYW5kbGluZyBhYnNvbHV0ZSBpbXBvcnQiLCBidWYpOworICAgICAgICAgICAgaWYgKGVycl9tc2cgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFQeUVycl9XYXJuRXgoUHlFeGNfUnVudGltZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoZXJyX21zZyksIDEpKSB7CisgICAgICAgICAgICAgICAgKmJ1ZiA9ICdcMCc7CisgICAgICAgICAgICAgICAgKnBfYnVmbGVuID0gMDsKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBQeV9Ob25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGVycl9tc2cpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICJQYXJlbnQgbW9kdWxlICclLjIwMHMnIG5vdCBsb2FkZWQsICIKKyAgICAgICAgICAgICAgICAiY2Fubm90IHBlcmZvcm0gcmVsYXRpdmUgaW1wb3J0IiwgYnVmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGFyZW50OworICAgIC8qIFdlIGV4cGVjdCwgYnV0IGNhbid0IGd1YXJhbnRlZSwgaWYgcGFyZW50ICE9IE5vbmUsIHRoYXQ6CisgICAgICAgLSBwYXJlbnQuX19uYW1lX18gPT0gYnVmCisgICAgICAgLSBwYXJlbnQuX19kaWN0X18gaXMgZ2xvYmFscworICAgICAgIElmIHRoaXMgaXMgdmlvbGF0ZWQuLi4gIFdobyBjYXJlcz8gKi8KIH0KIAogLyogYWx0bW9kIGlzIGVpdGhlciBOb25lIG9yIHNhbWUgYXMgbW9kICovCiBzdGF0aWMgUHlPYmplY3QgKgogbG9hZF9uZXh0KFB5T2JqZWN0ICptb2QsIFB5T2JqZWN0ICphbHRtb2QsIGNoYXIgKipwX25hbWUsIGNoYXIgKmJ1ZiwKLQkgIFB5X3NzaXplX3QgKnBfYnVmbGVuKQorICAgICAgICAgIFB5X3NzaXplX3QgKnBfYnVmbGVuKQogewotCWNoYXIgKm5hbWUgPSAqcF9uYW1lOwotCWNoYXIgKmRvdCA9IHN0cmNocihuYW1lLCAnLicpOwotCXNpemVfdCBsZW47Ci0JY2hhciAqcDsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKm5hbWUgPSAqcF9uYW1lOworICAgIGNoYXIgKmRvdCA9IHN0cmNocihuYW1lLCAnLicpOworICAgIHNpemVfdCBsZW47CisgICAgY2hhciAqcDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKHN0cmxlbihuYW1lKSA9PSAwKSB7Ci0JCS8qIGNvbXBsZXRlbHkgZW1wdHkgbW9kdWxlIG5hbWUgc2hvdWxkIG9ubHkgaGFwcGVuIGluCi0JCSAgICdmcm9tIC4gaW1wb3J0JyAob3IgJ19faW1wb3J0X18oIiIpJykqLwotCQlQeV9JTkNSRUYobW9kKTsKLQkJKnBfbmFtZSA9IE5VTEw7Ci0JCXJldHVybiBtb2Q7Ci0JfQorICAgIGlmIChzdHJsZW4obmFtZSkgPT0gMCkgeworICAgICAgICAvKiBjb21wbGV0ZWx5IGVtcHR5IG1vZHVsZSBuYW1lIHNob3VsZCBvbmx5IGhhcHBlbiBpbgorICAgICAgICAgICAnZnJvbSAuIGltcG9ydCcgKG9yICdfX2ltcG9ydF9fKCIiKScpKi8KKyAgICAgICAgUHlfSU5DUkVGKG1vZCk7CisgICAgICAgICpwX25hbWUgPSBOVUxMOworICAgICAgICByZXR1cm4gbW9kOworICAgIH0KIAotCWlmIChkb3QgPT0gTlVMTCkgewotCQkqcF9uYW1lID0gTlVMTDsKLQkJbGVuID0gc3RybGVuKG5hbWUpOwotCX0KLQllbHNlIHsKLQkJKnBfbmFtZSA9IGRvdCsxOwotCQlsZW4gPSBkb3QtbmFtZTsKLQl9Ci0JaWYgKGxlbiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJFbXB0eSBtb2R1bGUgbmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGRvdCA9PSBOVUxMKSB7CisgICAgICAgICpwX25hbWUgPSBOVUxMOworICAgICAgICBsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqcF9uYW1lID0gZG90KzE7CisgICAgICAgIGxlbiA9IGRvdC1uYW1lOworICAgIH0KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiRW1wdHkgbW9kdWxlIG5hbWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcCA9IGJ1ZiArICpwX2J1ZmxlbjsKLQlpZiAocCAhPSBidWYpCi0JCSpwKysgPSAnLic7Ci0JaWYgKHArbGVuLWJ1ZiA+PSBNQVhQQVRITEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJNb2R1bGUgbmFtZSB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RybmNweShwLCBuYW1lLCBsZW4pOwotCXBbbGVuXSA9ICdcMCc7Ci0JKnBfYnVmbGVuID0gcCtsZW4tYnVmOworICAgIHAgPSBidWYgKyAqcF9idWZsZW47CisgICAgaWYgKHAgIT0gYnVmKQorICAgICAgICAqcCsrID0gJy4nOworICAgIGlmIChwK2xlbi1idWYgPj0gTUFYUEFUSExFTikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNb2R1bGUgbmFtZSB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RybmNweShwLCBuYW1lLCBsZW4pOworICAgIHBbbGVuXSA9ICdcMCc7CisgICAgKnBfYnVmbGVuID0gcCtsZW4tYnVmOwogCi0JcmVzdWx0ID0gaW1wb3J0X3N1Ym1vZHVsZShtb2QsIHAsIGJ1Zik7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob25lICYmIGFsdG1vZCAhPSBtb2QpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCS8qIEhlcmUsIGFsdG1vZCBtdXN0IGJlIE5vbmUgYW5kIG1vZCBtdXN0IG5vdCBiZSBOb25lICovCi0JCXJlc3VsdCA9IGltcG9ydF9zdWJtb2R1bGUoYWx0bW9kLCBwLCBwKTsKLQkJaWYgKHJlc3VsdCAhPSBOVUxMICYmIHJlc3VsdCAhPSBQeV9Ob25lKSB7Ci0JCQlpZiAobWFya19taXNzKGJ1ZikgIT0gMCkgewotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJc3RybmNweShidWYsIG5hbWUsIGxlbik7Ci0JCQlidWZbbGVuXSA9ICdcMCc7Ci0JCQkqcF9idWZsZW4gPSBsZW47Ci0JCX0KLQl9Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBpbXBvcnRfc3VibW9kdWxlKG1vZCwgcCwgYnVmKTsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vbmUgJiYgYWx0bW9kICE9IG1vZCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgLyogSGVyZSwgYWx0bW9kIG11c3QgYmUgTm9uZSBhbmQgbW9kIG11c3Qgbm90IGJlIE5vbmUgKi8KKyAgICAgICAgcmVzdWx0ID0gaW1wb3J0X3N1Ym1vZHVsZShhbHRtb2QsIHAsIHApOworICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgcmVzdWx0ICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGlmIChtYXJrX21pc3MoYnVmKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJuY3B5KGJ1ZiwgbmFtZSwgbGVuKTsKKyAgICAgICAgICAgIGJ1ZltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICpwX2J1ZmxlbiA9IGxlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlc3VsdCA9PSBQeV9Ob25lKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJObyBtb2R1bGUgbmFtZWQgJS4yMDBzIiwgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocmVzdWx0ID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJObyBtb2R1bGUgbmFtZWQgJS4yMDBzIiwgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludAogbWFya19taXNzKGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7Ci0JcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUsIFB5X05vbmUpOworICAgIFB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOworICAgIHJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lLCBQeV9Ob25lKTsKIH0KIAogc3RhdGljIGludAogZW5zdXJlX2Zyb21saXN0KFB5T2JqZWN0ICptb2QsIFB5T2JqZWN0ICpmcm9tbGlzdCwgY2hhciAqYnVmLCBQeV9zc2l6ZV90IGJ1ZmxlbiwKLQkJaW50IHJlY3Vyc2l2ZSkKKyAgICAgICAgICAgICAgICBpbnQgcmVjdXJzaXZlKQogewotCWludCBpOworICAgIGludCBpOwogCi0JaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG1vZCwgIl9fcGF0aF9fIikpCi0JCXJldHVybiAxOworICAgIGlmICghUHlPYmplY3RfSGFzQXR0clN0cmluZyhtb2QsICJfX3BhdGhfXyIpKQorICAgICAgICByZXR1cm4gMTsKIAotCWZvciAoaSA9IDA7IDsgaSsrKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGZyb21saXN0LCBpKTsKLQkJaW50IGhhc2l0OwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbmRleEVycm9yKSkgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiSXRlbSBpbiBgYGZyb20gbGlzdCcnIG5vdCBhIHN0cmluZyIpOwotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKVswXSA9PSAnKicpIHsKLQkJCVB5T2JqZWN0ICphbGw7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkvKiBTZWUgaWYgdGhlIHBhY2thZ2UgZGVmaW5lcyBfX2FsbF9fICovCi0JCQlpZiAocmVjdXJzaXZlKQotCQkJCWNvbnRpbnVlOyAvKiBBdm9pZCBlbmRsZXNzIHJlY3Vyc2lvbiAqLwotCQkJYWxsID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsICJfX2FsbF9fIik7Ci0JCQlpZiAoYWxsID09IE5VTEwpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UgewotCQkJCWludCByZXQgPSBlbnN1cmVfZnJvbWxpc3QobW9kLCBhbGwsIGJ1ZiwgYnVmbGVuLCAxKTsKLQkJCQlQeV9ERUNSRUYoYWxsKTsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQloYXNpdCA9IFB5T2JqZWN0X0hhc0F0dHIobW9kLCBpdGVtKTsKLQkJaWYgKCFoYXNpdCkgewotCQkJY2hhciAqc3VibmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKTsKLQkJCVB5T2JqZWN0ICpzdWJtb2Q7Ci0JCQljaGFyICpwOwotCQkJaWYgKGJ1ZmxlbiArIHN0cmxlbihzdWJuYW1lKSA+PSBNQVhQQVRITEVOKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiTW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlwID0gYnVmICsgYnVmbGVuOwotCQkJKnArKyA9ICcuJzsKLQkJCXN0cmNweShwLCBzdWJuYW1lKTsKLQkJCXN1Ym1vZCA9IGltcG9ydF9zdWJtb2R1bGUobW9kLCBzdWJuYW1lLCBidWYpOwotCQkJUHlfWERFQ1JFRihzdWJtb2QpOwotCQkJaWYgKHN1Ym1vZCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9CisgICAgZm9yIChpID0gMDsgOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oZnJvbWxpc3QsIGkpOworICAgICAgICBpbnQgaGFzaXQ7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0luZGV4RXJyb3IpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkl0ZW0gaW4gYGBmcm9tIGxpc3QnJyBub3QgYSBzdHJpbmciKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChQeVN0cmluZ19BU19TVFJJTkcoaXRlbSlbMF0gPT0gJyonKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqYWxsOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgLyogU2VlIGlmIHRoZSBwYWNrYWdlIGRlZmluZXMgX19hbGxfXyAqLworICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogQXZvaWQgZW5kbGVzcyByZWN1cnNpb24gKi8KKyAgICAgICAgICAgIGFsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiX19hbGxfXyIpOworICAgICAgICAgICAgaWYgKGFsbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gZW5zdXJlX2Zyb21saXN0KG1vZCwgYWxsLCBidWYsIGJ1ZmxlbiwgMSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFsbCk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaGFzaXQgPSBQeU9iamVjdF9IYXNBdHRyKG1vZCwgaXRlbSk7CisgICAgICAgIGlmICghaGFzaXQpIHsKKyAgICAgICAgICAgIGNoYXIgKnN1Ym5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoaXRlbSk7CisgICAgICAgICAgICBQeU9iamVjdCAqc3VibW9kOworICAgICAgICAgICAgY2hhciAqcDsKKyAgICAgICAgICAgIGlmIChidWZsZW4gKyBzdHJsZW4oc3VibmFtZSkgPj0gTUFYUEFUSExFTikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwID0gYnVmICsgYnVmbGVuOworICAgICAgICAgICAgKnArKyA9ICcuJzsKKyAgICAgICAgICAgIHN0cmNweShwLCBzdWJuYW1lKTsKKyAgICAgICAgICAgIHN1Ym1vZCA9IGltcG9ydF9zdWJtb2R1bGUobW9kLCBzdWJuYW1lLCBidWYpOworICAgICAgICAgICAgUHlfWERFQ1JFRihzdWJtb2QpOworICAgICAgICAgICAgaWYgKHN1Ym1vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CiAKLQkvKiBOT1RSRUFDSEVEICovCisgICAgLyogTk9UUkVBQ0hFRCAqLwogfQogCiBzdGF0aWMgaW50CiBhZGRfc3VibW9kdWxlKFB5T2JqZWN0ICptb2QsIFB5T2JqZWN0ICpzdWJtb2QsIGNoYXIgKmZ1bGxuYW1lLCBjaGFyICpzdWJuYW1lLAotCSAgICAgIFB5T2JqZWN0ICptb2R1bGVzKQorICAgICAgICAgICAgICBQeU9iamVjdCAqbW9kdWxlcykKIHsKLQlpZiAobW9kID09IFB5X05vbmUpCi0JCXJldHVybiAxOwotCS8qIElycmVzcGVjdGl2ZSBvZiB0aGUgc3VjY2VzcyBvZiB0aGlzIGxvYWQsIG1ha2UgYQotCSAgIHJlZmVyZW5jZSB0byBpdCBpbiB0aGUgcGFyZW50IHBhY2thZ2UgbW9kdWxlLiAgQSBjb3B5IGdldHMKLQkgICBzYXZlZCBpbiB0aGUgbW9kdWxlcyBkaWN0aW9uYXJ5IHVuZGVyIHRoZSBmdWxsIG5hbWUsIHNvIGdldCBhCi0JICAgcmVmZXJlbmNlIGZyb20gdGhlcmUsIGlmIG5lZWQgYmUuICAoVGhlIGV4Y2VwdGlvbiBpcyB3aGVuIHRoZQotCSAgIGxvYWQgZmFpbGVkIHdpdGggYSBTeW50YXhFcnJvciAtLSB0aGVuIHRoZXJlJ3Mgbm8gdHJhY2UgaW4KLQkgICBzeXMubW9kdWxlcy4gIEluIHRoYXQgY2FzZSwgb2YgY291cnNlLCBkbyBub3RoaW5nIGV4dHJhLikgKi8KLQlpZiAoc3VibW9kID09IE5VTEwpIHsKLQkJc3VibW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgZnVsbG5hbWUpOwotCQlpZiAoc3VibW9kID09IE5VTEwpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5TW9kdWxlX0NoZWNrKG1vZCkpIHsKLQkJLyogV2UgY2FuJ3QgdXNlIHNldGF0dHIgaGVyZSBzaW5jZSBpdCBjYW4gZ2l2ZSBhCi0JCSAqIHNwdXJpb3VzIHdhcm5pbmcgaWYgdGhlIHN1Ym1vZHVsZSBuYW1lIHNoYWRvd3MgYQotCQkgKiBidWlsdGluIG5hbWUgKi8KLQkJUHlPYmplY3QgKmRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZCk7Ci0JCWlmICghZGljdCkKLQkJCXJldHVybiAwOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgc3VibmFtZSwgc3VibW9kKSA8IDApCi0JCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKG1vZCwgc3VibmFtZSwgc3VibW9kKSA8IDApCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKG1vZCA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gMTsKKyAgICAvKiBJcnJlc3BlY3RpdmUgb2YgdGhlIHN1Y2Nlc3Mgb2YgdGhpcyBsb2FkLCBtYWtlIGEKKyAgICAgICByZWZlcmVuY2UgdG8gaXQgaW4gdGhlIHBhcmVudCBwYWNrYWdlIG1vZHVsZS4gIEEgY29weSBnZXRzCisgICAgICAgc2F2ZWQgaW4gdGhlIG1vZHVsZXMgZGljdGlvbmFyeSB1bmRlciB0aGUgZnVsbCBuYW1lLCBzbyBnZXQgYQorICAgICAgIHJlZmVyZW5jZSBmcm9tIHRoZXJlLCBpZiBuZWVkIGJlLiAgKFRoZSBleGNlcHRpb24gaXMgd2hlbiB0aGUKKyAgICAgICBsb2FkIGZhaWxlZCB3aXRoIGEgU3ludGF4RXJyb3IgLS0gdGhlbiB0aGVyZSdzIG5vIHRyYWNlIGluCisgICAgICAgc3lzLm1vZHVsZXMuICBJbiB0aGF0IGNhc2UsIG9mIGNvdXJzZSwgZG8gbm90aGluZyBleHRyYS4pICovCisgICAgaWYgKHN1Ym1vZCA9PSBOVUxMKSB7CisgICAgICAgIHN1Ym1vZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIGZ1bGxuYW1lKTsKKyAgICAgICAgaWYgKHN1Ym1vZCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChQeU1vZHVsZV9DaGVjayhtb2QpKSB7CisgICAgICAgIC8qIFdlIGNhbid0IHVzZSBzZXRhdHRyIGhlcmUgc2luY2UgaXQgY2FuIGdpdmUgYQorICAgICAgICAgKiBzcHVyaW91cyB3YXJuaW5nIGlmIHRoZSBzdWJtb2R1bGUgbmFtZSBzaGFkb3dzIGEKKyAgICAgICAgICogYnVpbHRpbiBuYW1lICovCisgICAgICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2QpOworICAgICAgICBpZiAoIWRpY3QpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIHN1Ym5hbWUsIHN1Ym1vZCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhtb2QsIHN1Ym5hbWUsIHN1Ym1vZCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wb3J0X3N1Ym1vZHVsZShQeU9iamVjdCAqbW9kLCBjaGFyICpzdWJuYW1lLCBjaGFyICpmdWxsbmFtZSkKIHsKLQlQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQlQeU9iamVjdCAqbSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisgICAgUHlPYmplY3QgKm0gPSBOVUxMOwogCi0JLyogUmVxdWlyZToKLQkgICBpZiBtb2QgPT0gTm9uZTogc3VibmFtZSA9PSBmdWxsbmFtZQotCSAgIGVsc2U6IG1vZC5fX25hbWVfXyArICIuIiArIHN1Ym5hbWUgPT0gZnVsbG5hbWUKLQkqLworICAgIC8qIFJlcXVpcmU6CisgICAgICAgaWYgbW9kID09IE5vbmU6IHN1Ym5hbWUgPT0gZnVsbG5hbWUKKyAgICAgICBlbHNlOiBtb2QuX19uYW1lX18gKyAiLiIgKyBzdWJuYW1lID09IGZ1bGxuYW1lCisgICAgKi8KIAotCWlmICgobSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIGZ1bGxuYW1lKSkgIT0gTlVMTCkgewotCQlQeV9JTkNSRUYobSk7Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqcGF0aCwgKmxvYWRlciA9IE5VTEw7Ci0JCWNoYXIgYnVmW01BWFBBVEhMRU4rMV07Ci0JCXN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKLQkJRklMRSAqZnAgPSBOVUxMOworICAgIGlmICgobSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIGZ1bGxuYW1lKSkgIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYobSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqcGF0aCwgKmxvYWRlciA9IE5VTEw7CisgICAgICAgIGNoYXIgYnVmW01BWFBBVEhMRU4rMV07CisgICAgICAgIHN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKKyAgICAgICAgRklMRSAqZnAgPSBOVUxMOwogCi0JCWlmIChtb2QgPT0gUHlfTm9uZSkKLQkJCXBhdGggPSBOVUxMOwotCQllbHNlIHsKLQkJCXBhdGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIl9fcGF0aF9fIik7Ci0JCQlpZiAocGF0aCA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJcmV0dXJuIFB5X05vbmU7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKG1vZCA9PSBQeV9Ob25lKQorICAgICAgICAgICAgcGF0aCA9IE5VTEw7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcGF0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiX19wYXRoX18iKTsKKyAgICAgICAgICAgIGlmIChwYXRoID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWJ1ZlswXSA9ICdcMCc7Ci0JCWZkcCA9IGZpbmRfbW9kdWxlKGZ1bGxuYW1lLCBzdWJuYW1lLCBwYXRoLCBidWYsIE1BWFBBVEhMRU4rMSwKLQkJCQkgICZmcCwgJmxvYWRlcik7Ci0JCVB5X1hERUNSRUYocGF0aCk7Ci0JCWlmIChmZHAgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQltID0gbG9hZF9tb2R1bGUoZnVsbG5hbWUsIGZwLCBidWYsIGZkcC0+dHlwZSwgbG9hZGVyKTsKLQkJUHlfWERFQ1JFRihsb2FkZXIpOwotCQlpZiAoZnApCi0JCQlmY2xvc2UoZnApOwotCQlpZiAoIWFkZF9zdWJtb2R1bGUobW9kLCBtLCBmdWxsbmFtZSwgc3VibmFtZSwgbW9kdWxlcykpIHsKLQkJCVB5X1hERUNSRUYobSk7Ci0JCQltID0gTlVMTDsKLQkJfQotCX0KKyAgICAgICAgYnVmWzBdID0gJ1wwJzsKKyAgICAgICAgZmRwID0gZmluZF9tb2R1bGUoZnVsbG5hbWUsIHN1Ym5hbWUsIHBhdGgsIGJ1ZiwgTUFYUEFUSExFTisxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnAsICZsb2FkZXIpOworICAgICAgICBQeV9YREVDUkVGKHBhdGgpOworICAgICAgICBpZiAoZmRwID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbXBvcnRFcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgbSA9IGxvYWRfbW9kdWxlKGZ1bGxuYW1lLCBmcCwgYnVmLCBmZHAtPnR5cGUsIGxvYWRlcik7CisgICAgICAgIFB5X1hERUNSRUYobG9hZGVyKTsKKyAgICAgICAgaWYgKGZwKQorICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgaWYgKCFhZGRfc3VibW9kdWxlKG1vZCwgbSwgZnVsbG5hbWUsIHN1Ym5hbWUsIG1vZHVsZXMpKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKG0pOworICAgICAgICAgICAgbSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gbTsKKyAgICByZXR1cm4gbTsKIH0KIAogCkBAIC0yNjEyLDk2ICsyNjEyLDk2IEBACiBQeU9iamVjdCAqCiBQeUltcG9ydF9SZWxvYWRNb2R1bGUoUHlPYmplY3QgKm0pCiB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dldCgpLT5pbnRlcnA7Ci0JUHlPYmplY3QgKm1vZHVsZXNfcmVsb2FkaW5nID0gaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZzsKLQlQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQlQeU9iamVjdCAqcGF0aCA9IE5VTEwsICpsb2FkZXIgPSBOVUxMLCAqZXhpc3RpbmdfbSA9IE5VTEw7Ci0JY2hhciAqbmFtZSwgKnN1Ym5hbWU7Ci0JY2hhciBidWZbTUFYUEFUSExFTisxXTsKLQlzdHJ1Y3QgZmlsZWRlc2NyICpmZHA7Ci0JRklMRSAqZnAgPSBOVUxMOwotCVB5T2JqZWN0ICpuZXdtOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HZXQoKS0+aW50ZXJwOworICAgIFB5T2JqZWN0ICptb2R1bGVzX3JlbG9hZGluZyA9IGludGVycC0+bW9kdWxlc19yZWxvYWRpbmc7CisgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisgICAgUHlPYmplY3QgKnBhdGggPSBOVUxMLCAqbG9hZGVyID0gTlVMTCwgKmV4aXN0aW5nX20gPSBOVUxMOworICAgIGNoYXIgKm5hbWUsICpzdWJuYW1lOworICAgIGNoYXIgYnVmW01BWFBBVEhMRU4rMV07CisgICAgc3RydWN0IGZpbGVkZXNjciAqZmRwOworICAgIEZJTEUgKmZwID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbmV3bTsKIAotCWlmIChtb2R1bGVzX3JlbG9hZGluZyA9PSBOVUxMKSB7Ci0JCVB5X0ZhdGFsRXJyb3IoIlB5SW1wb3J0X1JlbG9hZE1vZHVsZTogIgotCQkJICAgICAgIm5vIG1vZHVsZXNfcmVsb2FkaW5nIGRpY3Rpb25hcnkhIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAobW9kdWxlc19yZWxvYWRpbmcgPT0gTlVMTCkgeworICAgICAgICBQeV9GYXRhbEVycm9yKCJQeUltcG9ydF9SZWxvYWRNb2R1bGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAibm8gbW9kdWxlc19yZWxvYWRpbmcgZGljdGlvbmFyeSEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKG0gPT0gTlVMTCB8fCAhUHlNb2R1bGVfQ2hlY2sobSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkicmVsb2FkKCkgYXJndW1lbnQgbXVzdCBiZSBtb2R1bGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5hbWUgPSBQeU1vZHVsZV9HZXROYW1lKG0pOwotCWlmIChuYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChtICE9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgInJlbG9hZCgpOiBtb2R1bGUgJS4yMDBzIG5vdCBpbiBzeXMubW9kdWxlcyIsCi0JCQkgICAgIG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXhpc3RpbmdfbSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXNfcmVsb2FkaW5nLCBuYW1lKTsKLQlpZiAoZXhpc3RpbmdfbSAhPSBOVUxMKSB7Ci0JCS8qIER1ZSB0byBhIHJlY3Vyc2l2ZSByZWxvYWQsIHRoaXMgbW9kdWxlIGlzIGFscmVhZHkKLQkJICAgYmVpbmcgcmVsb2FkZWQuICovCi0JCVB5X0lOQ1JFRihleGlzdGluZ19tKTsKLQkJcmV0dXJuIGV4aXN0aW5nX207Ci0gCX0KLSAJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXNfcmVsb2FkaW5nLCBuYW1lLCBtKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChtID09IE5VTEwgfHwgIVB5TW9kdWxlX0NoZWNrKG0pKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVsb2FkKCkgYXJndW1lbnQgbXVzdCBiZSBtb2R1bGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5hbWUgPSBQeU1vZHVsZV9HZXROYW1lKG0pOworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtICE9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJyZWxvYWQoKTogbW9kdWxlICUuMjAwcyBub3QgaW4gc3lzLm1vZHVsZXMiLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBleGlzdGluZ19tID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlc19yZWxvYWRpbmcsIG5hbWUpOworICAgIGlmIChleGlzdGluZ19tICE9IE5VTEwpIHsKKyAgICAgICAgLyogRHVlIHRvIGEgcmVjdXJzaXZlIHJlbG9hZCwgdGhpcyBtb2R1bGUgaXMgYWxyZWFkeQorICAgICAgICAgICBiZWluZyByZWxvYWRlZC4gKi8KKyAgICAgICAgUHlfSU5DUkVGKGV4aXN0aW5nX20pOworICAgICAgICByZXR1cm4gZXhpc3RpbmdfbTsKKyAgICB9CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXNfcmVsb2FkaW5nLCBuYW1lLCBtKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3VibmFtZSA9IHN0cnJjaHIobmFtZSwgJy4nKTsKLQlpZiAoc3VibmFtZSA9PSBOVUxMKQotCQlzdWJuYW1lID0gbmFtZTsKLQllbHNlIHsKLQkJUHlPYmplY3QgKnBhcmVudG5hbWUsICpwYXJlbnQ7Ci0JCXBhcmVudG5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuYW1lLCAoc3VibmFtZS1uYW1lKSk7Ci0JCWlmIChwYXJlbnRuYW1lID09IE5VTEwpIHsKLQkJCWltcF9tb2R1bGVzX3JlbG9hZGluZ19jbGVhcigpOwotCQkJcmV0dXJuIE5VTEw7Ci0gICAgICAgIAl9Ci0JCXBhcmVudCA9IFB5RGljdF9HZXRJdGVtKG1vZHVsZXMsIHBhcmVudG5hbWUpOwotCQlpZiAocGFyZW50ID09IE5VTEwpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAicmVsb2FkKCk6IHBhcmVudCAlLjIwMHMgbm90IGluIHN5cy5tb2R1bGVzIiwKLQkJCSAgICBQeVN0cmluZ19BU19TVFJJTkcocGFyZW50bmFtZSkpOwotCQkJUHlfREVDUkVGKHBhcmVudG5hbWUpOwotCQkJaW1wX21vZHVsZXNfcmVsb2FkaW5nX2NsZWFyKCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYocGFyZW50bmFtZSk7Ci0JCXN1Ym5hbWUrKzsKLQkJcGF0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcocGFyZW50LCAiX19wYXRoX18iKTsKLQkJaWYgKHBhdGggPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWJ1ZlswXSA9ICdcMCc7Ci0JZmRwID0gZmluZF9tb2R1bGUobmFtZSwgc3VibmFtZSwgcGF0aCwgYnVmLCBNQVhQQVRITEVOKzEsICZmcCwgJmxvYWRlcik7Ci0JUHlfWERFQ1JFRihwYXRoKTsKKyAgICBzdWJuYW1lID0gc3RycmNocihuYW1lLCAnLicpOworICAgIGlmIChzdWJuYW1lID09IE5VTEwpCisgICAgICAgIHN1Ym5hbWUgPSBuYW1lOworICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqcGFyZW50bmFtZSwgKnBhcmVudDsKKyAgICAgICAgcGFyZW50bmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG5hbWUsIChzdWJuYW1lLW5hbWUpKTsKKyAgICAgICAgaWYgKHBhcmVudG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgaW1wX21vZHVsZXNfcmVsb2FkaW5nX2NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBwYXJlbnQgPSBQeURpY3RfR2V0SXRlbShtb2R1bGVzLCBwYXJlbnRuYW1lKTsKKyAgICAgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgInJlbG9hZCgpOiBwYXJlbnQgJS4yMDBzIG5vdCBpbiBzeXMubW9kdWxlcyIsCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHBhcmVudG5hbWUpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwYXJlbnRuYW1lKTsKKyAgICAgICAgICAgIGltcF9tb2R1bGVzX3JlbG9hZGluZ19jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHBhcmVudG5hbWUpOworICAgICAgICBzdWJuYW1lKys7CisgICAgICAgIHBhdGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHBhcmVudCwgIl9fcGF0aF9fIik7CisgICAgICAgIGlmIChwYXRoID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBidWZbMF0gPSAnXDAnOworICAgIGZkcCA9IGZpbmRfbW9kdWxlKG5hbWUsIHN1Ym5hbWUsIHBhdGgsIGJ1ZiwgTUFYUEFUSExFTisxLCAmZnAsICZsb2FkZXIpOworICAgIFB5X1hERUNSRUYocGF0aCk7CiAKLQlpZiAoZmRwID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRihsb2FkZXIpOwotCQlpbXBfbW9kdWxlc19yZWxvYWRpbmdfY2xlYXIoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChmZHAgPT0gTlVMTCkgeworICAgICAgICBQeV9YREVDUkVGKGxvYWRlcik7CisgICAgICAgIGltcF9tb2R1bGVzX3JlbG9hZGluZ19jbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQluZXdtID0gbG9hZF9tb2R1bGUobmFtZSwgZnAsIGJ1ZiwgZmRwLT50eXBlLCBsb2FkZXIpOwotCVB5X1hERUNSRUYobG9hZGVyKTsKKyAgICBuZXdtID0gbG9hZF9tb2R1bGUobmFtZSwgZnAsIGJ1ZiwgZmRwLT50eXBlLCBsb2FkZXIpOworICAgIFB5X1hERUNSRUYobG9hZGVyKTsKIAotCWlmIChmcCkKLQkJZmNsb3NlKGZwKTsKLQlpZiAobmV3bSA9PSBOVUxMKSB7Ci0JCS8qIGxvYWRfbW9kdWxlIHByb2JhYmx5IHJlbW92ZWQgbmFtZSBmcm9tIG1vZHVsZXMgYmVjYXVzZSBvZgotCQkgKiB0aGUgZXJyb3IuICBQdXQgYmFjayB0aGUgb3JpZ2luYWwgbW9kdWxlIG9iamVjdC4gIFdlJ3JlCi0JCSAqIGdvaW5nIHRvIHJldHVybiBOVUxMIGluIHRoaXMgY2FzZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIKLQkJICogcmVwbGFjaW5nIG5hbWUgc3VjY2VlZHMsIHNvIHRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KLQkJICovCi0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUsIG0pOwotCX0KLQlpbXBfbW9kdWxlc19yZWxvYWRpbmdfY2xlYXIoKTsKLQlyZXR1cm4gbmV3bTsKKyAgICBpZiAoZnApCisgICAgICAgIGZjbG9zZShmcCk7CisgICAgaWYgKG5ld20gPT0gTlVMTCkgeworICAgICAgICAvKiBsb2FkX21vZHVsZSBwcm9iYWJseSByZW1vdmVkIG5hbWUgZnJvbSBtb2R1bGVzIGJlY2F1c2Ugb2YKKyAgICAgICAgICogdGhlIGVycm9yLiAgUHV0IGJhY2sgdGhlIG9yaWdpbmFsIG1vZHVsZSBvYmplY3QuICBXZSdyZQorICAgICAgICAgKiBnb2luZyB0byByZXR1cm4gTlVMTCBpbiB0aGlzIGNhc2UgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCisgICAgICAgICAqIHJlcGxhY2luZyBuYW1lIHN1Y2NlZWRzLCBzbyB0aGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCisgICAgICAgICAqLworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lLCBtKTsKKyAgICB9CisgICAgaW1wX21vZHVsZXNfcmVsb2FkaW5nX2NsZWFyKCk7CisgICAgcmV0dXJuIG5ld207CiB9CiAKIApAQCAtMjcxNyw2OCArMjcxNyw2OCBAQAogUHlPYmplY3QgKgogUHlJbXBvcnRfSW1wb3J0KFB5T2JqZWN0ICptb2R1bGVfbmFtZSkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKnNpbGx5X2xpc3QgPSBOVUxMOwotCXN0YXRpYyBQeU9iamVjdCAqYnVpbHRpbnNfc3RyID0gTlVMTDsKLQlzdGF0aWMgUHlPYmplY3QgKmltcG9ydF9zdHIgPSBOVUxMOwotCVB5T2JqZWN0ICpnbG9iYWxzID0gTlVMTDsKLQlQeU9iamVjdCAqaW1wb3J0ID0gTlVMTDsKLQlQeU9iamVjdCAqYnVpbHRpbnMgPSBOVUxMOwotCVB5T2JqZWN0ICpyID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnNpbGx5X2xpc3QgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqYnVpbHRpbnNfc3RyID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmltcG9ydF9zdHIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpnbG9iYWxzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaW1wb3J0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYnVpbHRpbnMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyID0gTlVMTDsKIAotCS8qIEluaXRpYWxpemUgY29uc3RhbnQgc3RyaW5nIG9iamVjdHMgKi8KLQlpZiAoc2lsbHlfbGlzdCA9PSBOVUxMKSB7Ci0JCWltcG9ydF9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2ltcG9ydF9fIik7Ci0JCWlmIChpbXBvcnRfc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJYnVpbHRpbnNfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19idWlsdGluc19fIik7Ci0JCWlmIChidWlsdGluc19zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlzaWxseV9saXN0ID0gUHlfQnVpbGRWYWx1ZSgiW3NdIiwgIl9fZG9jX18iKTsKLQkJaWYgKHNpbGx5X2xpc3QgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBJbml0aWFsaXplIGNvbnN0YW50IHN0cmluZyBvYmplY3RzICovCisgICAgaWYgKHNpbGx5X2xpc3QgPT0gTlVMTCkgeworICAgICAgICBpbXBvcnRfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbXBvcnRfXyIpOworICAgICAgICBpZiAoaW1wb3J0X3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJ1aWx0aW5zX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fYnVpbHRpbnNfXyIpOworICAgICAgICBpZiAoYnVpbHRpbnNfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc2lsbHlfbGlzdCA9IFB5X0J1aWxkVmFsdWUoIltzXSIsICJfX2RvY19fIik7CisgICAgICAgIGlmIChzaWxseV9saXN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBHZXQgdGhlIGJ1aWx0aW5zIGZyb20gY3VycmVudCBnbG9iYWxzICovCi0JZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7Ci0JaWYgKGdsb2JhbHMgIT0gTlVMTCkgewotCSAgICAgICAgUHlfSU5DUkVGKGdsb2JhbHMpOwotCQlidWlsdGlucyA9IFB5T2JqZWN0X0dldEl0ZW0oZ2xvYmFscywgYnVpbHRpbnNfc3RyKTsKLQkJaWYgKGJ1aWx0aW5zID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQl9Ci0JZWxzZSB7Ci0JCS8qIE5vIGdsb2JhbHMgLS0gdXNlIHN0YW5kYXJkIGJ1aWx0aW5zLCBhbmQgZmFrZSBnbG9iYWxzICovCi0JCWJ1aWx0aW5zID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwoIl9fYnVpbHRpbl9fIiwKLQkJCQkJCSAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIDApOwotCQlpZiAoYnVpbHRpbnMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlnbG9iYWxzID0gUHlfQnVpbGRWYWx1ZSgie09PfSIsIGJ1aWx0aW5zX3N0ciwgYnVpbHRpbnMpOwotCQlpZiAoZ2xvYmFscyA9PSBOVUxMKQotCQkJZ290byBlcnI7Ci0JfQorICAgIC8qIEdldCB0aGUgYnVpbHRpbnMgZnJvbSBjdXJyZW50IGdsb2JhbHMgKi8KKyAgICBnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKKyAgICBpZiAoZ2xvYmFscyAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihnbG9iYWxzKTsKKyAgICAgICAgYnVpbHRpbnMgPSBQeU9iamVjdF9HZXRJdGVtKGdsb2JhbHMsIGJ1aWx0aW5zX3N0cik7CisgICAgICAgIGlmIChidWlsdGlucyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBObyBnbG9iYWxzIC0tIHVzZSBzdGFuZGFyZCBidWlsdGlucywgYW5kIGZha2UgZ2xvYmFscyAqLworICAgICAgICBidWlsdGlucyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsKCJfX2J1aWx0aW5fXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCk7CisgICAgICAgIGlmIChidWlsdGlucyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdsb2JhbHMgPSBQeV9CdWlsZFZhbHVlKCJ7T099IiwgYnVpbHRpbnNfc3RyLCBidWlsdGlucyk7CisgICAgICAgIGlmIChnbG9iYWxzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CiAKLQkvKiBHZXQgdGhlIF9faW1wb3J0X18gZnVuY3Rpb24gZnJvbSB0aGUgYnVpbHRpbnMgKi8KLQlpZiAoUHlEaWN0X0NoZWNrKGJ1aWx0aW5zKSkgewotCQlpbXBvcnQgPSBQeU9iamVjdF9HZXRJdGVtKGJ1aWx0aW5zLCBpbXBvcnRfc3RyKTsKLQkJaWYgKGltcG9ydCA9PSBOVUxMKQotCQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBpbXBvcnRfc3RyKTsKLQl9Ci0JZWxzZQotCQlpbXBvcnQgPSBQeU9iamVjdF9HZXRBdHRyKGJ1aWx0aW5zLCBpbXBvcnRfc3RyKTsKLQlpZiAoaW1wb3J0ID09IE5VTEwpCi0JCWdvdG8gZXJyOworICAgIC8qIEdldCB0aGUgX19pbXBvcnRfXyBmdW5jdGlvbiBmcm9tIHRoZSBidWlsdGlucyAqLworICAgIGlmIChQeURpY3RfQ2hlY2soYnVpbHRpbnMpKSB7CisgICAgICAgIGltcG9ydCA9IFB5T2JqZWN0X0dldEl0ZW0oYnVpbHRpbnMsIGltcG9ydF9zdHIpOworICAgICAgICBpZiAoaW1wb3J0ID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGltcG9ydF9zdHIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGltcG9ydCA9IFB5T2JqZWN0X0dldEF0dHIoYnVpbHRpbnMsIGltcG9ydF9zdHIpOworICAgIGlmIChpbXBvcnQgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnI7CiAKLQkvKiBDYWxsIHRoZSBfX2ltcG9ydF9fIGZ1bmN0aW9uIHdpdGggdGhlIHByb3BlciBhcmd1bWVudCBsaXN0Ci0JICogQWx3YXlzIHVzZSBhYnNvbHV0ZSBpbXBvcnQgaGVyZS4gKi8KLQlyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGltcG9ydCwgIk9PT09pIiwgbW9kdWxlX25hbWUsIGdsb2JhbHMsCi0JCQkJICBnbG9iYWxzLCBzaWxseV9saXN0LCAwLCBOVUxMKTsKKyAgICAvKiBDYWxsIHRoZSBfX2ltcG9ydF9fIGZ1bmN0aW9uIHdpdGggdGhlIHByb3BlciBhcmd1bWVudCBsaXN0CisgICAgICogQWx3YXlzIHVzZSBhYnNvbHV0ZSBpbXBvcnQgaGVyZS4gKi8KKyAgICByID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGltcG9ydCwgIk9PT09pIiwgbW9kdWxlX25hbWUsIGdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzLCBzaWxseV9saXN0LCAwLCBOVUxMKTsKIAogICBlcnI6Ci0JUHlfWERFQ1JFRihnbG9iYWxzKTsKLQlQeV9YREVDUkVGKGJ1aWx0aW5zKTsKLQlQeV9YREVDUkVGKGltcG9ydCk7CisgICAgUHlfWERFQ1JFRihnbG9iYWxzKTsKKyAgICBQeV9YREVDUkVGKGJ1aWx0aW5zKTsKKyAgICBQeV9YREVDUkVGKGltcG9ydCk7CiAKLQlyZXR1cm4gcjsKKyAgICByZXR1cm4gcjsKIH0KIAogCkBAIC0yNzg5LDE5MiArMjc4OSwxOTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfZ2V0X21hZ2ljKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCWNoYXIgYnVmWzRdOworICAgIGNoYXIgYnVmWzRdOwogCi0JYnVmWzBdID0gKGNoYXIpICgocHljX21hZ2ljID4+ICAwKSAmIDB4ZmYpOwotCWJ1ZlsxXSA9IChjaGFyKSAoKHB5Y19tYWdpYyA+PiAgOCkgJiAweGZmKTsKLQlidWZbMl0gPSAoY2hhcikgKChweWNfbWFnaWMgPj4gMTYpICYgMHhmZik7Ci0JYnVmWzNdID0gKGNoYXIpICgocHljX21hZ2ljID4+IDI0KSAmIDB4ZmYpOworICAgIGJ1ZlswXSA9IChjaGFyKSAoKHB5Y19tYWdpYyA+PiAgMCkgJiAweGZmKTsKKyAgICBidWZbMV0gPSAoY2hhcikgKChweWNfbWFnaWMgPj4gIDgpICYgMHhmZik7CisgICAgYnVmWzJdID0gKGNoYXIpICgocHljX21hZ2ljID4+IDE2KSAmIDB4ZmYpOworICAgIGJ1ZlszXSA9IChjaGFyKSAoKHB5Y19tYWdpYyA+PiAyNCkgJiAweGZmKTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIDQpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIDQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2dldF9zdWZmaXhlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKLQlQeU9iamVjdCAqbGlzdDsKLQlzdHJ1Y3QgZmlsZWRlc2NyICpmZHA7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgc3RydWN0IGZpbGVkZXNjciAqZmRwOwogCi0JbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChmZHAgPSBfUHlJbXBvcnRfRmlsZXRhYjsgZmRwLT5zdWZmaXggIT0gTlVMTDsgZmRwKyspIHsKLQkJUHlPYmplY3QgKml0ZW0gPSBQeV9CdWlsZFZhbHVlKCJzc2kiLAotCQkJCSAgICAgICBmZHAtPnN1ZmZpeCwgZmRwLT5tb2RlLCBmZHAtPnR5cGUpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYobGlzdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKSA8IDApIHsKLQkJCVB5X0RFQ1JFRihsaXN0KTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChmZHAgPSBfUHlJbXBvcnRfRmlsZXRhYjsgZmRwLT5zdWZmaXggIT0gTlVMTDsgZmRwKyspIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeV9CdWlsZFZhbHVlKCJzc2kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkcC0+c3VmZml4LCBmZHAtPm1vZGUsIGZkcC0+dHlwZSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KKyAgICByZXR1cm4gbGlzdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZmluZF9tb2R1bGUoY2hhciAqbmFtZSwgUHlPYmplY3QgKnBhdGgpCiB7Ci0JZXh0ZXJuIGludCBmY2xvc2UoRklMRSAqKTsKLQlQeU9iamVjdCAqZm9iLCAqcmV0OwotCXN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKLQljaGFyIHBhdGhuYW1lW01BWFBBVEhMRU4rMV07Ci0JRklMRSAqZnAgPSBOVUxMOworICAgIGV4dGVybiBpbnQgZmNsb3NlKEZJTEUgKik7CisgICAgUHlPYmplY3QgKmZvYiwgKnJldDsKKyAgICBzdHJ1Y3QgZmlsZWRlc2NyICpmZHA7CisgICAgY2hhciBwYXRobmFtZVtNQVhQQVRITEVOKzFdOworICAgIEZJTEUgKmZwID0gTlVMTDsKIAotCXBhdGhuYW1lWzBdID0gJ1wwJzsKLQlpZiAocGF0aCA9PSBQeV9Ob25lKQotCQlwYXRoID0gTlVMTDsKLQlmZHAgPSBmaW5kX21vZHVsZShOVUxMLCBuYW1lLCBwYXRoLCBwYXRobmFtZSwgTUFYUEFUSExFTisxLCAmZnAsIE5VTEwpOwotCWlmIChmZHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGZwICE9IE5VTEwpIHsKLQkJZm9iID0gUHlGaWxlX0Zyb21GaWxlKGZwLCBwYXRobmFtZSwgZmRwLT5tb2RlLCBmY2xvc2UpOwotCQlpZiAoZm9iID09IE5VTEwpIHsKLQkJCWZjbG9zZShmcCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQllbHNlIHsKLQkJZm9iID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKGZvYik7Ci0JfQotCXJldCA9IFB5X0J1aWxkVmFsdWUoIk9zKHNzaSkiLAotCQkgICAgICBmb2IsIHBhdGhuYW1lLCBmZHAtPnN1ZmZpeCwgZmRwLT5tb2RlLCBmZHAtPnR5cGUpOwotCVB5X0RFQ1JFRihmb2IpOwotCXJldHVybiByZXQ7CisgICAgcGF0aG5hbWVbMF0gPSAnXDAnOworICAgIGlmIChwYXRoID09IFB5X05vbmUpCisgICAgICAgIHBhdGggPSBOVUxMOworICAgIGZkcCA9IGZpbmRfbW9kdWxlKE5VTEwsIG5hbWUsIHBhdGgsIHBhdGhuYW1lLCBNQVhQQVRITEVOKzEsICZmcCwgTlVMTCk7CisgICAgaWYgKGZkcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZnAgIT0gTlVMTCkgeworICAgICAgICBmb2IgPSBQeUZpbGVfRnJvbUZpbGUoZnAsIHBhdGhuYW1lLCBmZHAtPm1vZGUsIGZjbG9zZSk7CisgICAgICAgIGlmIChmb2IgPT0gTlVMTCkgeworICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb2IgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoZm9iKTsKKyAgICB9CisgICAgcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT3Moc3NpKSIsCisgICAgICAgICAgICAgICAgICBmb2IsIHBhdGhuYW1lLCBmZHAtPnN1ZmZpeCwgZmRwLT5tb2RlLCBmZHAtPnR5cGUpOworICAgIFB5X0RFQ1JFRihmb2IpOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfZmluZF9tb2R1bGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JUHlPYmplY3QgKnBhdGggPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xPOmZpbmRfbW9kdWxlIiwgJm5hbWUsICZwYXRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGNhbGxfZmluZF9tb2R1bGUobmFtZSwgcGF0aCk7CisgICAgY2hhciAqbmFtZTsKKyAgICBQeU9iamVjdCAqcGF0aCA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfE86ZmluZF9tb2R1bGUiLCAmbmFtZSwgJnBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gY2FsbF9maW5kX21vZHVsZShuYW1lLCBwYXRoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9pbml0X2J1aWx0aW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JaW50IHJldDsKLQlQeU9iamVjdCAqbTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aW5pdF9idWlsdGluIiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXQgPSBpbml0X2J1aWx0aW4obmFtZSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChyZXQgPT0gMCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOwotCVB5X1hJTkNSRUYobSk7Ci0JcmV0dXJuIG07CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgcmV0OworICAgIFB5T2JqZWN0ICptOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbml0X2J1aWx0aW4iLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldCA9IGluaXRfYnVpbHRpbihuYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIG0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7CisgICAgUHlfWElOQ1JFRihtKTsKKyAgICByZXR1cm4gbTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9pbml0X2Zyb3plbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgcmV0OwotCVB5T2JqZWN0ICptOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbml0X2Zyb3plbiIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0ID0gUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlKG5hbWUpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocmV0ID09IDApIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JbSA9IFB5SW1wb3J0X0FkZE1vZHVsZShuYW1lKTsKLQlQeV9YSU5DUkVGKG0pOwotCXJldHVybiBtOworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IHJldDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aW5pdF9mcm96ZW4iLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldCA9IFB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZShuYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIG0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7CisgICAgUHlfWElOQ1JFRihtKTsKKyAgICByZXR1cm4gbTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9nZXRfZnJvemVuX29iamVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKKyAgICBjaGFyICpuYW1lOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldF9mcm96ZW5fb2JqZWN0IiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gZ2V0X2Zyb3plbl9vYmplY3QobmFtZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldF9mcm96ZW5fb2JqZWN0IiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gZ2V0X2Zyb3plbl9vYmplY3QobmFtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfaXNfYnVpbHRpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aXNfYnVpbHRpbiIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGlzX2J1aWx0aW4obmFtZSkpOworICAgIGNoYXIgKm5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmlzX2J1aWx0aW4iLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpc19idWlsdGluKG5hbWUpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9pc19mcm96ZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0Jc3RydWN0IF9mcm96ZW4gKnA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmlzX2Zyb3plbiIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcCA9IGZpbmRfZnJvemVuKG5hbWUpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpIChwID09IE5VTEwgPyAwIDogcC0+c2l6ZSkpOworICAgIGNoYXIgKm5hbWU7CisgICAgc3RydWN0IF9mcm96ZW4gKnA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmlzX2Zyb3plbiIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IGZpbmRfZnJvemVuKG5hbWUpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpIChwID09IE5VTEwgPyAwIDogcC0+c2l6ZSkpOwogfQogCiBzdGF0aWMgRklMRSAqCiBnZXRfZmlsZShjaGFyICpwYXRobmFtZSwgUHlPYmplY3QgKmZvYiwgY2hhciAqbW9kZSkKIHsKLQlGSUxFICpmcDsKLQlpZiAoZm9iID09IE5VTEwpIHsKLQkJaWYgKG1vZGVbMF0gPT0gJ1UnKQotCQkJbW9kZSA9ICJyIiBQWV9TVERJT1RFWFRNT0RFOwotCQlmcCA9IGZvcGVuKHBhdGhuYW1lLCBtb2RlKTsKLQkJaWYgKGZwID09IE5VTEwpCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JfQotCWVsc2UgewotCQlmcCA9IFB5RmlsZV9Bc0ZpbGUoZm9iKTsKLQkJaWYgKGZwID09IE5VTEwpCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJImJhZC9jbG9zZWQgZmlsZSBvYmplY3QiKTsKLQl9Ci0JcmV0dXJuIGZwOworICAgIEZJTEUgKmZwOworICAgIGlmIChmb2IgPT0gTlVMTCkgeworICAgICAgICBpZiAobW9kZVswXSA9PSAnVScpCisgICAgICAgICAgICBtb2RlID0gInIiIFBZX1NURElPVEVYVE1PREU7CisgICAgICAgIGZwID0gZm9wZW4ocGF0aG5hbWUsIG1vZGUpOworICAgICAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZwID0gUHlGaWxlX0FzRmlsZShmb2IpOworICAgICAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQvY2xvc2VkIGZpbGUgb2JqZWN0Iik7CisgICAgfQorICAgIHJldHVybiBmcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9sb2FkX2NvbXBpbGVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWNoYXIgKnBhdGhuYW1lOwotCVB5T2JqZWN0ICpmb2IgPSBOVUxMOwotCVB5T2JqZWN0ICptOwotCUZJTEUgKmZwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3N8TyE6bG9hZF9jb21waWxlZCIsICZuYW1lLCAmcGF0aG5hbWUsCi0JCQkgICAgICAmUHlGaWxlX1R5cGUsICZmb2IpKQotCQlyZXR1cm4gTlVMTDsKLQlmcCA9IGdldF9maWxlKHBhdGhuYW1lLCBmb2IsICJyYiIpOwotCWlmIChmcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltID0gbG9hZF9jb21waWxlZF9tb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKLQlpZiAoZm9iID09IE5VTEwpCi0JCWZjbG9zZShmcCk7Ci0JcmV0dXJuIG07CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICpwYXRobmFtZTsKKyAgICBQeU9iamVjdCAqZm9iID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBGSUxFICpmcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzfE8hOmxvYWRfY29tcGlsZWQiLCAmbmFtZSwgJnBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlGaWxlX1R5cGUsICZmb2IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcCA9IGdldF9maWxlKHBhdGhuYW1lLCBmb2IsICJyYiIpOworICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtID0gbG9hZF9jb21waWxlZF9tb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKKyAgICBpZiAoZm9iID09IE5VTEwpCisgICAgICAgIGZjbG9zZShmcCk7CisgICAgcmV0dXJuIG07CiB9CiAKICNpZmRlZiBIQVZFX0RZTkFNSUNfTE9BRElORwpAQCAtMjk4MiwyMSArMjk4MiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9sb2FkX2R5bmFtaWMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqcGF0aG5hbWU7Ci0JUHlPYmplY3QgKmZvYiA9IE5VTEw7Ci0JUHlPYmplY3QgKm07Ci0JRklMRSAqZnAgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3N8TyE6bG9hZF9keW5hbWljIiwgJm5hbWUsICZwYXRobmFtZSwKLQkJCSAgICAgICZQeUZpbGVfVHlwZSwgJmZvYikpCi0JCXJldHVybiBOVUxMOwotCWlmIChmb2IpIHsKLQkJZnAgPSBnZXRfZmlsZShwYXRobmFtZSwgZm9iLCAiciIpOwotCQlpZiAoZnAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQltID0gX1B5SW1wb3J0X0xvYWREeW5hbWljTW9kdWxlKG5hbWUsIHBhdGhuYW1lLCBmcCk7Ci0JcmV0dXJuIG07CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICpwYXRobmFtZTsKKyAgICBQeU9iamVjdCAqZm9iID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBGSUxFICpmcCA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xPITpsb2FkX2R5bmFtaWMiLCAmbmFtZSwgJnBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlGaWxlX1R5cGUsICZmb2IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZm9iKSB7CisgICAgICAgIGZwID0gZ2V0X2ZpbGUocGF0aG5hbWUsIGZvYiwgInIiKTsKKyAgICAgICAgaWYgKGZwID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbSA9IF9QeUltcG9ydF9Mb2FkRHluYW1pY01vZHVsZShuYW1lLCBwYXRobmFtZSwgZnApOworICAgIHJldHVybiBtOwogfQogCiAjZW5kaWYgLyogSEFWRV9EWU5BTUlDX0xPQURJTkcgKi8KQEAgLTMwMDQsODcgKzMwMDQsODcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfbG9hZF9zb3VyY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqcGF0aG5hbWU7Ci0JUHlPYmplY3QgKmZvYiA9IE5VTEw7Ci0JUHlPYmplY3QgKm07Ci0JRklMRSAqZnA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xPITpsb2FkX3NvdXJjZSIsICZuYW1lLCAmcGF0aG5hbWUsCi0JCQkgICAgICAmUHlGaWxlX1R5cGUsICZmb2IpKQotCQlyZXR1cm4gTlVMTDsKLQlmcCA9IGdldF9maWxlKHBhdGhuYW1lLCBmb2IsICJyIik7Ci0JaWYgKGZwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW0gPSBsb2FkX3NvdXJjZV9tb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKLQlpZiAoZm9iID09IE5VTEwpCi0JCWZjbG9zZShmcCk7Ci0JcmV0dXJuIG07CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICpwYXRobmFtZTsKKyAgICBQeU9iamVjdCAqZm9iID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBGSUxFICpmcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzfE8hOmxvYWRfc291cmNlIiwgJm5hbWUsICZwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5RmlsZV9UeXBlLCAmZm9iKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZnAgPSBnZXRfZmlsZShwYXRobmFtZSwgZm9iLCAiciIpOworICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtID0gbG9hZF9zb3VyY2VfbW9kdWxlKG5hbWUsIHBhdGhuYW1lLCBmcCk7CisgICAgaWYgKGZvYiA9PSBOVUxMKQorICAgICAgICBmY2xvc2UoZnApOworICAgIHJldHVybiBtOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2xvYWRfbW9kdWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCVB5T2JqZWN0ICpmb2I7Ci0JY2hhciAqcGF0aG5hbWU7Ci0JY2hhciAqc3VmZml4OyAvKiBVbnVzZWQgKi8KLQljaGFyICptb2RlOwotCWludCB0eXBlOwotCUZJTEUgKmZwOworICAgIGNoYXIgKm5hbWU7CisgICAgUHlPYmplY3QgKmZvYjsKKyAgICBjaGFyICpwYXRobmFtZTsKKyAgICBjaGFyICpzdWZmaXg7IC8qIFVudXNlZCAqLworICAgIGNoYXIgKm1vZGU7CisgICAgaW50IHR5cGU7CisgICAgRklMRSAqZnA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPcyhzc2kpOmxvYWRfbW9kdWxlIiwKLQkJCSAgICAgICZuYW1lLCAmZm9iLCAmcGF0aG5hbWUsCi0JCQkgICAgICAmc3VmZml4LCAmbW9kZSwgJnR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKm1vZGUpIHsKLQkJLyogTW9kZSBtdXN0IHN0YXJ0IHdpdGggJ3InIG9yICdVJyBhbmQgbXVzdCBub3QgY29udGFpbiAnKycuCi0JCSAgIEltcGxpY2l0IGluIHRoaXMgdGVzdCBpcyB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBtb2RlCi0JCSAgIG1heSBjb250YWluIG90aGVyIG1vZGlmaWVycyBsaWtlICdiJyBvciAndCcuICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzT3Moc3NpKTpsb2FkX21vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCAmZm9iLCAmcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWZmaXgsICZtb2RlLCAmdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgqbW9kZSkgeworICAgICAgICAvKiBNb2RlIG11c3Qgc3RhcnQgd2l0aCAncicgb3IgJ1UnIGFuZCBtdXN0IG5vdCBjb250YWluICcrJy4KKyAgICAgICAgICAgSW1wbGljaXQgaW4gdGhpcyB0ZXN0IGlzIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIG1vZGUKKyAgICAgICAgICAgbWF5IGNvbnRhaW4gb3RoZXIgbW9kaWZpZXJzIGxpa2UgJ2InIG9yICd0Jy4gKi8KIAotCQlpZiAoISgqbW9kZSA9PSAncicgfHwgKm1vZGUgPT0gJ1UnKSB8fCBzdHJjaHIobW9kZSwgJysnKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgICAiaW52YWxpZCBmaWxlIG9wZW4gbW9kZSAlLjIwMHMiLCBtb2RlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWlmIChmb2IgPT0gUHlfTm9uZSkKLQkJZnAgPSBOVUxMOwotCWVsc2UgewotCQlpZiAoIVB5RmlsZV9DaGVjayhmb2IpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibG9hZF9tb2R1bGUgYXJnIzIgc2hvdWxkIGJlIGEgZmlsZSBvciBOb25lIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmcCA9IGdldF9maWxlKHBhdGhuYW1lLCBmb2IsIG1vZGUpOwotCQlpZiAoZnAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbG9hZF9tb2R1bGUobmFtZSwgZnAsIHBhdGhuYW1lLCB0eXBlLCBOVUxMKTsKKyAgICAgICAgaWYgKCEoKm1vZGUgPT0gJ3InIHx8ICptb2RlID09ICdVJykgfHwgc3RyY2hyKG1vZGUsICcrJykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGZpbGUgb3BlbiBtb2RlICUuMjAwcyIsIG1vZGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZvYiA9PSBQeV9Ob25lKQorICAgICAgICBmcCA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIGlmICghUHlGaWxlX0NoZWNrKGZvYikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJsb2FkX21vZHVsZSBhcmcjMiBzaG91bGQgYmUgYSBmaWxlIG9yIE5vbmUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZwID0gZ2V0X2ZpbGUocGF0aG5hbWUsIGZvYiwgbW9kZSk7CisgICAgICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBsb2FkX21vZHVsZShuYW1lLCBmcCwgcGF0aG5hbWUsIHR5cGUsIE5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2xvYWRfcGFja2FnZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQljaGFyICpwYXRobmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOmxvYWRfcGFja2FnZSIsICZuYW1lLCAmcGF0aG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbG9hZF9wYWNrYWdlKG5hbWUsIHBhdGhuYW1lKTsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKnBhdGhuYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6bG9hZF9wYWNrYWdlIiwgJm5hbWUsICZwYXRobmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBsb2FkX3BhY2thZ2UobmFtZSwgcGF0aG5hbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX25ld19tb2R1bGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOm5ld19tb2R1bGUiLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeU1vZHVsZV9OZXcobmFtZSk7CisgICAgY2hhciAqbmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6bmV3X21vZHVsZSIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TW9kdWxlX05ldyhuYW1lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9yZWxvYWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCXJldHVybiBQeUltcG9ydF9SZWxvYWRNb2R1bGUodik7CisgICAgcmV0dXJuIFB5SW1wb3J0X1JlbG9hZE1vZHVsZSh2KTsKIH0KIAogCkBAIC0zMTQzLDQwICszMTQzLDQwIEBACiBPbiBwbGF0Zm9ybXMgd2l0aG91dCB0aHJlYWRzLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGltcF9tZXRob2RzW10gPSB7Ci0JeyJyZWxvYWQiLAkgaW1wX3JlbG9hZCwJICAgTUVUSF9PLAkgZG9jX3JlbG9hZH0sCi0JeyJmaW5kX21vZHVsZSIsCSBpbXBfZmluZF9tb2R1bGUsICBNRVRIX1ZBUkFSR1MsIGRvY19maW5kX21vZHVsZX0sCi0JeyJnZXRfbWFnaWMiLAkgaW1wX2dldF9tYWdpYywJICAgTUVUSF9OT0FSR1MsICBkb2NfZ2V0X21hZ2ljfSwKLQl7ImdldF9zdWZmaXhlcyIsIGltcF9nZXRfc3VmZml4ZXMsIE1FVEhfTk9BUkdTLCAgZG9jX2dldF9zdWZmaXhlc30sCi0JeyJsb2FkX21vZHVsZSIsCSBpbXBfbG9hZF9tb2R1bGUsICBNRVRIX1ZBUkFSR1MsIGRvY19sb2FkX21vZHVsZX0sCi0JeyJuZXdfbW9kdWxlIiwJIGltcF9uZXdfbW9kdWxlLCAgIE1FVEhfVkFSQVJHUywgZG9jX25ld19tb2R1bGV9LAotCXsibG9ja19oZWxkIiwJIGltcF9sb2NrX2hlbGQsCSAgIE1FVEhfTk9BUkdTLCAgZG9jX2xvY2tfaGVsZH0sCi0JeyJhY3F1aXJlX2xvY2siLCBpbXBfYWNxdWlyZV9sb2NrLCBNRVRIX05PQVJHUywgIGRvY19hY3F1aXJlX2xvY2t9LAotCXsicmVsZWFzZV9sb2NrIiwgaW1wX3JlbGVhc2VfbG9jaywgTUVUSF9OT0FSR1MsICBkb2NfcmVsZWFzZV9sb2NrfSwKLQkvKiBUaGUgcmVzdCBhcmUgb2Jzb2xldGUgKi8KLQl7ImdldF9mcm96ZW5fb2JqZWN0IiwJaW1wX2dldF9mcm96ZW5fb2JqZWN0LAlNRVRIX1ZBUkFSR1N9LAotCXsiaW5pdF9idWlsdGluIiwJaW1wX2luaXRfYnVpbHRpbiwJTUVUSF9WQVJBUkdTfSwKLQl7ImluaXRfZnJvemVuIiwJCWltcF9pbml0X2Zyb3plbiwJTUVUSF9WQVJBUkdTfSwKLQl7ImlzX2J1aWx0aW4iLAkJaW1wX2lzX2J1aWx0aW4sCQlNRVRIX1ZBUkFSR1N9LAotCXsiaXNfZnJvemVuIiwJCWltcF9pc19mcm96ZW4sCQlNRVRIX1ZBUkFSR1N9LAotCXsibG9hZF9jb21waWxlZCIsCWltcF9sb2FkX2NvbXBpbGVkLAlNRVRIX1ZBUkFSR1N9LAorICAgIHsicmVsb2FkIiwgICAgICAgICAgIGltcF9yZWxvYWQsICAgICAgIE1FVEhfTywgICAgICAgZG9jX3JlbG9hZH0sCisgICAgeyJmaW5kX21vZHVsZSIsICAgICAgaW1wX2ZpbmRfbW9kdWxlLCAgTUVUSF9WQVJBUkdTLCBkb2NfZmluZF9tb2R1bGV9LAorICAgIHsiZ2V0X21hZ2ljIiwgICAgICAgIGltcF9nZXRfbWFnaWMsICAgIE1FVEhfTk9BUkdTLCAgZG9jX2dldF9tYWdpY30sCisgICAgeyJnZXRfc3VmZml4ZXMiLCBpbXBfZ2V0X3N1ZmZpeGVzLCBNRVRIX05PQVJHUywgIGRvY19nZXRfc3VmZml4ZXN9LAorICAgIHsibG9hZF9tb2R1bGUiLCAgICAgIGltcF9sb2FkX21vZHVsZSwgIE1FVEhfVkFSQVJHUywgZG9jX2xvYWRfbW9kdWxlfSwKKyAgICB7Im5ld19tb2R1bGUiLCAgICAgICBpbXBfbmV3X21vZHVsZSwgICBNRVRIX1ZBUkFSR1MsIGRvY19uZXdfbW9kdWxlfSwKKyAgICB7ImxvY2tfaGVsZCIsICAgICAgICBpbXBfbG9ja19oZWxkLCAgICBNRVRIX05PQVJHUywgIGRvY19sb2NrX2hlbGR9LAorICAgIHsiYWNxdWlyZV9sb2NrIiwgaW1wX2FjcXVpcmVfbG9jaywgTUVUSF9OT0FSR1MsICBkb2NfYWNxdWlyZV9sb2NrfSwKKyAgICB7InJlbGVhc2VfbG9jayIsIGltcF9yZWxlYXNlX2xvY2ssIE1FVEhfTk9BUkdTLCAgZG9jX3JlbGVhc2VfbG9ja30sCisgICAgLyogVGhlIHJlc3QgYXJlIG9ic29sZXRlICovCisgICAgeyJnZXRfZnJvemVuX29iamVjdCIsICAgICAgIGltcF9nZXRfZnJvemVuX29iamVjdCwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJpbml0X2J1aWx0aW4iLCAgICAgICAgICAgIGltcF9pbml0X2J1aWx0aW4sICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJpbml0X2Zyb3plbiIsICAgICAgICAgICAgIGltcF9pbml0X2Zyb3plbiwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJpc19idWlsdGluIiwgICAgICAgICAgICAgIGltcF9pc19idWlsdGluLCAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJpc19mcm96ZW4iLCAgICAgICAgICAgICAgIGltcF9pc19mcm96ZW4sICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJsb2FkX2NvbXBpbGVkIiwgICAgICAgICAgIGltcF9sb2FkX2NvbXBpbGVkLCAgICAgIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgSEFWRV9EWU5BTUlDX0xPQURJTkcKLQl7ImxvYWRfZHluYW1pYyIsCWltcF9sb2FkX2R5bmFtaWMsCU1FVEhfVkFSQVJHU30sCisgICAgeyJsb2FkX2R5bmFtaWMiLCAgICAgICAgICAgIGltcF9sb2FkX2R5bmFtaWMsICAgICAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKLQl7ImxvYWRfcGFja2FnZSIsCWltcF9sb2FkX3BhY2thZ2UsCU1FVEhfVkFSQVJHU30sCi0JeyJsb2FkX3NvdXJjZSIsCQlpbXBfbG9hZF9zb3VyY2UsCU1FVEhfVkFSQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJsb2FkX3BhY2thZ2UiLCAgICAgICAgICAgIGltcF9sb2FkX3BhY2thZ2UsICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJsb2FkX3NvdXJjZSIsICAgICAgICAgICAgIGltcF9sb2FkX3NvdXJjZSwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIGludAogc2V0aW50KFB5T2JqZWN0ICpkLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JaW50IGVycjsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgZXJyOwogCi0JdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKXZhbHVlKTsKLQllcnIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKLQlQeV9YREVDUkVGKHYpOwotCXJldHVybiBlcnI7CisgICAgdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKXZhbHVlKTsKKyAgICBlcnIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIHJldHVybiBlcnI7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTMxODYsMTU1ICszMTg2LDE1NSBAQAogc3RhdGljIGludAogTnVsbEltcG9ydGVyX2luaXQoTnVsbEltcG9ydGVyICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JY2hhciAqcGF0aDsKLQlQeV9zc2l6ZV90IHBhdGhsZW47CisgICAgY2hhciAqcGF0aDsKKyAgICBQeV9zc2l6ZV90IHBhdGhsZW47CiAKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJOdWxsSW1wb3J0ZXIoKSIsIGt3ZHMpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiTnVsbEltcG9ydGVyKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOk51bGxJbXBvcnRlciIsCi0JCQkgICAgICAmcGF0aCkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6TnVsbEltcG9ydGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlwYXRobGVuID0gc3RybGVuKHBhdGgpOwotCWlmIChwYXRobGVuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiZW1wdHkgcGF0aG5hbWUiKTsKLQkJcmV0dXJuIC0xOwotCX0gZWxzZSB7CisgICAgcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKyAgICBpZiAocGF0aGxlbiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgImVtcHR5IHBhdGhuYW1lIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgewogI2lmbmRlZiBSSVNDT1MKICNpZm5kZWYgTVNfV0lORE9XUwotCQlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotCQlpbnQgcnY7CisgICAgICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgICAgICAgIGludCBydjsKIAotCQlydiA9IHN0YXQocGF0aCwgJnN0YXRidWYpOwotCQlpZiAocnYgPT0gMCkgewotCQkJLyogaXQgZXhpc3RzICovCi0JCQlpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7Ci0JCQkJLyogaXQncyBhIGRpcmVjdG9yeSAqLwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkJCSJleGlzdGluZyBkaXJlY3RvcnkiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcnYgPSBzdGF0KHBhdGgsICZzdGF0YnVmKTsKKyAgICAgICAgaWYgKHJ2ID09IDApIHsKKyAgICAgICAgICAgIC8qIGl0IGV4aXN0cyAqLworICAgICAgICAgICAgaWYgKFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSkgeworICAgICAgICAgICAgICAgIC8qIGl0J3MgYSBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGlzdGluZyBkaXJlY3RvcnkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbHNlIC8qIE1TX1dJTkRPV1MgKi8KLQkJRFdPUkQgcnY7Ci0JCS8qIHNlZSBpc3N1ZTEyOTMgYW5kIGlzc3VlMzY3NzoKLQkJICogc3RhdCgpIG9uIFdpbmRvd3MgZG9lc24ndCByZWNvZ25pc2UgcGF0aHMgbGlrZQotCQkgKiAiZTpcXHNoYXJlZFxcIiBhbmQgIlxcXFx3aGl0ZXJhYi1jMnpubGhcXHNoYXJlZCIgYXMgZGlycy4KLQkJICovCi0JCXJ2ID0gR2V0RmlsZUF0dHJpYnV0ZXNBKHBhdGgpOwotCQlpZiAocnYgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKLQkJCS8qIGl0IGV4aXN0cyAqLwotCQkJaWYgKHJ2ICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7Ci0JCQkJLyogaXQncyBhIGRpcmVjdG9yeSAqLwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkJCSJleGlzdGluZyBkaXJlY3RvcnkiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KKyAgICAgICAgRFdPUkQgcnY7CisgICAgICAgIC8qIHNlZSBpc3N1ZTEyOTMgYW5kIGlzc3VlMzY3NzoKKyAgICAgICAgICogc3RhdCgpIG9uIFdpbmRvd3MgZG9lc24ndCByZWNvZ25pc2UgcGF0aHMgbGlrZQorICAgICAgICAgKiAiZTpcXHNoYXJlZFxcIiBhbmQgIlxcXFx3aGl0ZXJhYi1jMnpubGhcXHNoYXJlZCIgYXMgZGlycy4KKyAgICAgICAgICovCisgICAgICAgIHJ2ID0gR2V0RmlsZUF0dHJpYnV0ZXNBKHBhdGgpOworICAgICAgICBpZiAocnYgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKKyAgICAgICAgICAgIC8qIGl0IGV4aXN0cyAqLworICAgICAgICAgICAgaWYgKHJ2ICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7CisgICAgICAgICAgICAgICAgLyogaXQncyBhIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGRpcmVjdG9yeSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAjZWxzZSAvKiBSSVNDT1MgKi8KLQkJaWYgKG9iamVjdF9leGlzdHMocGF0aCkpIHsKLQkJCS8qIGl0IGV4aXN0cyAqLwotCQkJaWYgKGlzZGlyKHBhdGgpKSB7Ci0JCQkJLyogaXQncyBhIGRpcmVjdG9yeSAqLwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkJCSJleGlzdGluZyBkaXJlY3RvcnkiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKG9iamVjdF9leGlzdHMocGF0aCkpIHsKKyAgICAgICAgICAgIC8qIGl0IGV4aXN0cyAqLworICAgICAgICAgICAgaWYgKGlzZGlyKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgLyogaXQncyBhIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGRpcmVjdG9yeSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCi0JfQotCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIE51bGxJbXBvcnRlcl9maW5kX21vZHVsZShOdWxsSW1wb3J0ZXIgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgTnVsbEltcG9ydGVyX21ldGhvZHNbXSA9IHsKLQl7ImZpbmRfbW9kdWxlIiwgKFB5Q0Z1bmN0aW9uKU51bGxJbXBvcnRlcl9maW5kX21vZHVsZSwgTUVUSF9WQVJBUkdTLAotCSAiQWx3YXlzIHJldHVybiBOb25lIgotCX0sCi0Je05VTEx9ICAvKiBTZW50aW5lbCAqLworICAgIHsiZmluZF9tb2R1bGUiLCAoUHlDRnVuY3Rpb24pTnVsbEltcG9ydGVyX2ZpbmRfbW9kdWxlLCBNRVRIX1ZBUkFSR1MsCisgICAgICJBbHdheXMgcmV0dXJuIE5vbmUiCisgICAgfSwKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCiB9OwogCiAKIFB5VHlwZU9iamVjdCBQeU51bGxJbXBvcnRlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpbXAuTnVsbEltcG9ydGVyIiwgICAgICAgIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKE51bGxJbXBvcnRlciksICAgICAgLyp0cF9iYXNpY3NpemUqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgLyp0cF9mbGFncyovCi0JIk51bGwgaW1wb3J0ZXIgb2JqZWN0IiwgICAgLyogdHBfZG9jICovCi0JMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCi0JMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCi0JMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KLQkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLQlOdWxsSW1wb3J0ZXJfbWV0aG9kcywgICAgICAvKiB0cF9tZXRob2RzICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylOdWxsSW1wb3J0ZXJfaW5pdCwgICAgICAvKiB0cF9pbml0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KLQlQeVR5cGVfR2VuZXJpY05ldyAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaW1wLk51bGxJbXBvcnRlciIsICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihOdWxsSW1wb3J0ZXIpLCAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJOdWxsIGltcG9ydGVyIG9iamVjdCIsICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgTnVsbEltcG9ydGVyX21ldGhvZHMsICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2MpTnVsbEltcG9ydGVyX2luaXQsICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlUeXBlX0dlbmVyaWNOZXcgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0aW1wKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5TnVsbEltcG9ydGVyX1R5cGUpIDwgMCkKLQkJZ290byBmYWlsdXJlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5TnVsbEltcG9ydGVyX1R5cGUpIDwgMCkKKyAgICAgICAgZ290byBmYWlsdXJlOwogCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJpbXAiLCBpbXBfbWV0aG9kcywgZG9jX2ltcCwKLQkJCSAgIE5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJZ290byBmYWlsdXJlOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWlmIChkID09IE5VTEwpCi0JCWdvdG8gZmFpbHVyZTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoImltcCIsIGltcF9tZXRob2RzLCBkb2NfaW1wLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWx1cmU7CiAKLQlpZiAoc2V0aW50KGQsICJTRUFSQ0hfRVJST1IiLCBTRUFSQ0hfRVJST1IpIDwgMCkgZ290byBmYWlsdXJlOwotCWlmIChzZXRpbnQoZCwgIlBZX1NPVVJDRSIsIFBZX1NPVVJDRSkgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiUFlfQ09NUElMRUQiLCBQWV9DT01QSUxFRCkgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiQ19FWFRFTlNJT04iLCBDX0VYVEVOU0lPTikgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiUFlfUkVTT1VSQ0UiLCBQWV9SRVNPVVJDRSkgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiUEtHX0RJUkVDVE9SWSIsIFBLR19ESVJFQ1RPUlkpIDwgMCkgZ290byBmYWlsdXJlOwotCWlmIChzZXRpbnQoZCwgIkNfQlVJTFRJTiIsIENfQlVJTFRJTikgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiUFlfRlJPWkVOIiwgUFlfRlJPWkVOKSA8IDApIGdvdG8gZmFpbHVyZTsKLQlpZiAoc2V0aW50KGQsICJQWV9DT0RFUkVTT1VSQ0UiLCBQWV9DT0RFUkVTT1VSQ0UpIDwgMCkgZ290byBmYWlsdXJlOwotCWlmIChzZXRpbnQoZCwgIklNUF9IT09LIiwgSU1QX0hPT0spIDwgMCkgZ290byBmYWlsdXJlOworICAgIGlmIChzZXRpbnQoZCwgIlNFQVJDSF9FUlJPUiIsIFNFQVJDSF9FUlJPUikgPCAwKSBnb3RvIGZhaWx1cmU7CisgICAgaWYgKHNldGludChkLCAiUFlfU09VUkNFIiwgUFlfU09VUkNFKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJQWV9DT01QSUxFRCIsIFBZX0NPTVBJTEVEKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJDX0VYVEVOU0lPTiIsIENfRVhURU5TSU9OKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJQWV9SRVNPVVJDRSIsIFBZX1JFU09VUkNFKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJQS0dfRElSRUNUT1JZIiwgUEtHX0RJUkVDVE9SWSkgPCAwKSBnb3RvIGZhaWx1cmU7CisgICAgaWYgKHNldGludChkLCAiQ19CVUlMVElOIiwgQ19CVUlMVElOKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJQWV9GUk9aRU4iLCBQWV9GUk9aRU4pIDwgMCkgZ290byBmYWlsdXJlOworICAgIGlmIChzZXRpbnQoZCwgIlBZX0NPREVSRVNPVVJDRSIsIFBZX0NPREVSRVNPVVJDRSkgPCAwKSBnb3RvIGZhaWx1cmU7CisgICAgaWYgKHNldGludChkLCAiSU1QX0hPT0siLCBJTVBfSE9PSykgPCAwKSBnb3RvIGZhaWx1cmU7CiAKLQlQeV9JTkNSRUYoJlB5TnVsbEltcG9ydGVyX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTnVsbEltcG9ydGVyIiwgKFB5T2JqZWN0ICopJlB5TnVsbEltcG9ydGVyX1R5cGUpOworICAgIFB5X0lOQ1JFRigmUHlOdWxsSW1wb3J0ZXJfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJOdWxsSW1wb3J0ZXIiLCAoUHlPYmplY3QgKikmUHlOdWxsSW1wb3J0ZXJfVHlwZSk7CiAgIGZhaWx1cmU6Ci0JOworICAgIDsKIH0KIAogCkBAIC0zMzQ4LDMxICszMzQ4LDMxIEBACiBpbnQKIFB5SW1wb3J0X0V4dGVuZEluaXR0YWIoc3RydWN0IF9pbml0dGFiICpuZXd0YWIpCiB7Ci0Jc3RhdGljIHN0cnVjdCBfaW5pdHRhYiAqb3VyX2NvcHkgPSBOVUxMOwotCXN0cnVjdCBfaW5pdHRhYiAqcDsKLQlpbnQgaSwgbjsKKyAgICBzdGF0aWMgc3RydWN0IF9pbml0dGFiICpvdXJfY29weSA9IE5VTEw7CisgICAgc3RydWN0IF9pbml0dGFiICpwOworICAgIGludCBpLCBuOwogCi0JLyogQ291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGJvdGggdGFibGVzICovCi0JZm9yIChuID0gMDsgbmV3dGFiW25dLm5hbWUgIT0gTlVMTDsgbisrKQotCQk7Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIDA7IC8qIE5vdGhpbmcgdG8gZG8gKi8KLQlmb3IgKGkgPSAwOyBQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotCQk7CisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGJvdGggdGFibGVzICovCisgICAgZm9yIChuID0gMDsgbmV3dGFiW25dLm5hbWUgIT0gTlVMTDsgbisrKQorICAgICAgICA7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7IC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICBmb3IgKGkgPSAwOyBQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICA7CiAKLQkvKiBBbGxvY2F0ZSBuZXcgbWVtb3J5IGZvciB0aGUgY29tYmluZWQgdGFibGUgKi8KLQlwID0gb3VyX2NvcHk7Ci0JUHlNZW1fUkVTSVpFKHAsIHN0cnVjdCBfaW5pdHRhYiwgaStuKzEpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICAvKiBBbGxvY2F0ZSBuZXcgbWVtb3J5IGZvciB0aGUgY29tYmluZWQgdGFibGUgKi8KKyAgICBwID0gb3VyX2NvcHk7CisgICAgUHlNZW1fUkVTSVpFKHAsIHN0cnVjdCBfaW5pdHRhYiwgaStuKzEpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCS8qIENvcHkgdGhlIHRhYmxlcyBpbnRvIHRoZSBuZXcgbWVtb3J5ICovCi0JaWYgKG91cl9jb3B5ICE9IFB5SW1wb3J0X0luaXR0YWIpCi0JCW1lbWNweShwLCBQeUltcG9ydF9Jbml0dGFiLCAoaSsxKSAqIHNpemVvZihzdHJ1Y3QgX2luaXR0YWIpKTsKLQlQeUltcG9ydF9Jbml0dGFiID0gb3VyX2NvcHkgPSBwOwotCW1lbWNweShwK2ksIG5ld3RhYiwgKG4rMSkgKiBzaXplb2Yoc3RydWN0IF9pbml0dGFiKSk7CisgICAgLyogQ29weSB0aGUgdGFibGVzIGludG8gdGhlIG5ldyBtZW1vcnkgKi8KKyAgICBpZiAob3VyX2NvcHkgIT0gUHlJbXBvcnRfSW5pdHRhYikKKyAgICAgICAgbWVtY3B5KHAsIFB5SW1wb3J0X0luaXR0YWIsIChpKzEpICogc2l6ZW9mKHN0cnVjdCBfaW5pdHRhYikpOworICAgIFB5SW1wb3J0X0luaXR0YWIgPSBvdXJfY29weSA9IHA7CisgICAgbWVtY3B5KHAraSwgbmV3dGFiLCAobisxKSAqIHNpemVvZihzdHJ1Y3QgX2luaXR0YWIpKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAvKiBTaG9ydGhhbmQgdG8gYWRkIGEgc2luZ2xlIGVudHJ5IGdpdmVuIGEgbmFtZSBhbmQgYSBmdW5jdGlvbiAqLwpAQCAtMzM4MCwxNCArMzM4MCwxNCBAQAogaW50CiBQeUltcG9ydF9BcHBlbmRJbml0dGFiKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKCppbml0ZnVuYykodm9pZCkpCiB7Ci0Jc3RydWN0IF9pbml0dGFiIG5ld3RhYlsyXTsKKyAgICBzdHJ1Y3QgX2luaXR0YWIgbmV3dGFiWzJdOwogCi0JbWVtc2V0KG5ld3RhYiwgJ1wwJywgc2l6ZW9mIG5ld3RhYik7CisgICAgbWVtc2V0KG5ld3RhYiwgJ1wwJywgc2l6ZW9mIG5ld3RhYik7CiAKLQluZXd0YWJbMF0ubmFtZSA9IChjaGFyICopbmFtZTsKLQluZXd0YWJbMF0uaW5pdGZ1bmMgPSBpbml0ZnVuYzsKKyAgICBuZXd0YWJbMF0ubmFtZSA9IChjaGFyICopbmFtZTsKKyAgICBuZXd0YWJbMF0uaW5pdGZ1bmMgPSBpbml0ZnVuYzsKIAotCXJldHVybiBQeUltcG9ydF9FeHRlbmRJbml0dGFiKG5ld3RhYik7CisgICAgcmV0dXJuIFB5SW1wb3J0X0V4dGVuZEluaXR0YWIobmV3dGFiKTsKIH0KIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9QeXRob24vaW1wb3J0ZGwuYyBiL1B5dGhvbi9pbXBvcnRkbC5jCmluZGV4IDljMzI1ZTQuLjE0YzliZTggMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnRkbC5jCisrKyBiL1B5dGhvbi9pbXBvcnRkbC5jCkBAIC0xMyw2NiArMTMsNjYgQEAKICNpbmNsdWRlICJpbXBvcnRkbC5oIgogCiBleHRlcm4gZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJICAgY29uc3QgY2hhciAqc2hvcnRuYW1lLAotCQkJCQkgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNob3J0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApOwogCiAKIAogUHlPYmplY3QgKgogX1B5SW1wb3J0X0xvYWREeW5hbWljTW9kdWxlKGNoYXIgKm5hbWUsIGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlQeU9iamVjdCAqbTsKLQljaGFyICpsYXN0ZG90LCAqc2hvcnRuYW1lLCAqcGFja2FnZWNvbnRleHQsICpvbGRjb250ZXh0OwotCWRsX2Z1bmNwdHIgcDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBjaGFyICpsYXN0ZG90LCAqc2hvcnRuYW1lLCAqcGFja2FnZWNvbnRleHQsICpvbGRjb250ZXh0OworICAgIGRsX2Z1bmNwdHIgcDsKIAotCWlmICgobSA9IF9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uKG5hbWUsIHBhdGhuYW1lKSkgIT0gTlVMTCkgewotCQlQeV9JTkNSRUYobSk7Ci0JCXJldHVybiBtOwotCX0KLQlsYXN0ZG90ID0gc3RycmNocihuYW1lLCAnLicpOwotCWlmIChsYXN0ZG90ID09IE5VTEwpIHsKLQkJcGFja2FnZWNvbnRleHQgPSBOVUxMOwotCQlzaG9ydG5hbWUgPSBuYW1lOwotCX0KLQllbHNlIHsKLQkJcGFja2FnZWNvbnRleHQgPSBuYW1lOwotCQlzaG9ydG5hbWUgPSBsYXN0ZG90KzE7Ci0JfQorICAgIGlmICgobSA9IF9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uKG5hbWUsIHBhdGhuYW1lKSkgIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYobSk7CisgICAgICAgIHJldHVybiBtOworICAgIH0KKyAgICBsYXN0ZG90ID0gc3RycmNocihuYW1lLCAnLicpOworICAgIGlmIChsYXN0ZG90ID09IE5VTEwpIHsKKyAgICAgICAgcGFja2FnZWNvbnRleHQgPSBOVUxMOworICAgICAgICBzaG9ydG5hbWUgPSBuYW1lOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcGFja2FnZWNvbnRleHQgPSBuYW1lOworICAgICAgICBzaG9ydG5hbWUgPSBsYXN0ZG90KzE7CisgICAgfQogCi0JcCA9IF9QeUltcG9ydF9HZXREeW5Mb2FkRnVuYyhuYW1lLCBzaG9ydG5hbWUsIHBhdGhuYW1lLCBmcCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChwID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkgICAiZHluYW1pYyBtb2R1bGUgZG9lcyBub3QgZGVmaW5lIGluaXQgZnVuY3Rpb24gKGluaXQlLjIwMHMpIiwKLQkJCSAgICAgc2hvcnRuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgICBvbGRjb250ZXh0ID0gX1B5X1BhY2thZ2VDb250ZXh0OwotCV9QeV9QYWNrYWdlQ29udGV4dCA9IHBhY2thZ2Vjb250ZXh0OwotCSgqcCkoKTsKLQlfUHlfUGFja2FnZUNvbnRleHQgPSBvbGRjb250ZXh0OwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBwID0gX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKG5hbWUsIHNob3J0bmFtZSwgcGF0aG5hbWUsIGZwKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICJkeW5hbWljIG1vZHVsZSBkb2VzIG5vdCBkZWZpbmUgaW5pdCBmdW5jdGlvbiAoaW5pdCUuMjAwcykiLAorICAgICAgICAgICAgICAgICAgICAgc2hvcnRuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9sZGNvbnRleHQgPSBfUHlfUGFja2FnZUNvbnRleHQ7CisgICAgX1B5X1BhY2thZ2VDb250ZXh0ID0gcGFja2FnZWNvbnRleHQ7CisgICAgKCpwKSgpOworICAgIF9QeV9QYWNrYWdlQ29udGV4dCA9IG9sZGNvbnRleHQ7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKSwgbmFtZSk7Ci0JaWYgKG0gPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJImR5bmFtaWMgbW9kdWxlIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogUmVtZW1iZXIgdGhlIGZpbGVuYW1lIGFzIHRoZSBfX2ZpbGVfXyBhdHRyaWJ1dGUgKi8KLQlpZiAoUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fZmlsZV9fIiwgcGF0aG5hbWUpIDwgMCkKLQkJUHlFcnJfQ2xlYXIoKTsgLyogTm90IGltcG9ydGFudCBlbm91Z2ggdG8gcmVwb3J0ICovCisgICAgbSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKSwgbmFtZSk7CisgICAgaWYgKG0gPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZHluYW1pYyBtb2R1bGUgbm90IGluaXRpYWxpemVkIHByb3Blcmx5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBSZW1lbWJlciB0aGUgZmlsZW5hbWUgYXMgdGhlIF9fZmlsZV9fIGF0dHJpYnV0ZSAqLworICAgIGlmIChQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiX19maWxlX18iLCBwYXRobmFtZSkgPCAwKQorICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBOb3QgaW1wb3J0YW50IGVub3VnaCB0byByZXBvcnQgKi8KIAotCWlmIChfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24obmFtZSwgcGF0aG5hbWUpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoCi0JCQkiaW1wb3J0ICVzICMgZHluYW1pY2FsbHkgbG9hZGVkIGZyb20gJXNcbiIsCi0JCQluYW1lLCBwYXRobmFtZSk7Ci0JUHlfSU5DUkVGKG0pOwotCXJldHVybiBtOworICAgIGlmIChfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24obmFtZSwgcGF0aG5hbWUpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoCisgICAgICAgICAgICAiaW1wb3J0ICVzICMgZHluYW1pY2FsbHkgbG9hZGVkIGZyb20gJXNcbiIsCisgICAgICAgICAgICBuYW1lLCBwYXRobmFtZSk7CisgICAgUHlfSU5DUkVGKG0pOworICAgIHJldHVybiBtOwogfQogCiAjZW5kaWYgLyogSEFWRV9EWU5BTUlDX0xPQURJTkcgKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnRkbC5oIGIvUHl0aG9uL2ltcG9ydGRsLmgKaW5kZXggNWEyZDQ1Yy4uYjRkMjFiZSAxMDA2NDQKLS0tIGEvUHl0aG9uL2ltcG9ydGRsLmgKKysrIGIvUHl0aG9uL2ltcG9ydGRsLmgKQEAgLTgsMjggKzgsMjggQEAKIAogLyogRGVmaW5pdGlvbnMgZm9yIGR5bmFtaWMgbG9hZGluZyBvZiBleHRlbnNpb24gbW9kdWxlcyAqLwogZW51bSBmaWxldHlwZSB7Ci0JU0VBUkNIX0VSUk9SLAotCVBZX1NPVVJDRSwKLQlQWV9DT01QSUxFRCwKLQlDX0VYVEVOU0lPTiwKLQlQWV9SRVNPVVJDRSwgLyogTWFjIG9ubHkgKi8KLQlQS0dfRElSRUNUT1JZLAotCUNfQlVJTFRJTiwKLQlQWV9GUk9aRU4sCi0JUFlfQ09ERVJFU09VUkNFLCAvKiBNYWMgb25seSAqLwotCUlNUF9IT09LCisgICAgU0VBUkNIX0VSUk9SLAorICAgIFBZX1NPVVJDRSwKKyAgICBQWV9DT01QSUxFRCwKKyAgICBDX0VYVEVOU0lPTiwKKyAgICBQWV9SRVNPVVJDRSwgLyogTWFjIG9ubHkgKi8KKyAgICBQS0dfRElSRUNUT1JZLAorICAgIENfQlVJTFRJTiwKKyAgICBQWV9GUk9aRU4sCisgICAgUFlfQ09ERVJFU09VUkNFLCAvKiBNYWMgb25seSAqLworICAgIElNUF9IT09LCiB9OwogCiBzdHJ1Y3QgZmlsZWRlc2NyIHsKLQljaGFyICpzdWZmaXg7Ci0JY2hhciAqbW9kZTsKLQllbnVtIGZpbGV0eXBlIHR5cGU7CisgICAgY2hhciAqc3VmZml4OworICAgIGNoYXIgKm1vZGU7CisgICAgZW51bSBmaWxldHlwZSB0eXBlOwogfTsKIGV4dGVybiBzdHJ1Y3QgZmlsZWRlc2NyICogX1B5SW1wb3J0X0ZpbGV0YWI7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXTsKIAogZXh0ZXJuIFB5T2JqZWN0ICpfUHlJbXBvcnRfTG9hZER5bmFtaWNNb2R1bGUoY2hhciAqbmFtZSwgY2hhciAqcGF0aG5hbWUsCi0JCQkJCSAgICAgRklMRSAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKik7CiAKIC8qIE1heCBsZW5ndGggb2YgbW9kdWxlIHN1ZmZpeCBzZWFyY2hlZCBmb3IgLS0gYWNjb21tb2RhdGVzICJtb2R1bGUuc2xiIiAqLwogI2RlZmluZSBNQVhTVUZGSVhTSVpFIDEyCmRpZmYgLS1naXQgYS9QeXRob24vbWFjdG9vbGJveGdsdWUuYyBiL1B5dGhvbi9tYWN0b29sYm94Z2x1ZS5jCmluZGV4IDQwMzdkNDcuLjkyYmYzZTggMTAwNjQ0Ci0tLSBhL1B5dGhvbi9tYWN0b29sYm94Z2x1ZS5jCisrKyBiL1B5dGhvbi9tYWN0b29sYm94Z2x1ZS5jCkBAIC00LDEwICs0LDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKIAotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAotZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBTdGljaHRpbmcgTWF0aGVtYXRpc2NoCiBDZW50cnVtIG9yIENXSSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bwogZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCkBAIC0yNSw0NSArMjUsNDUgQEAKIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInB5bWFjdG9vbGJveC5oIgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgkvKiBmb3IgbnRvaGwsIGh0b25sICovCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+ICAvKiBmb3IgbnRvaGwsIGh0b25sICovCiAKIAogLyogTGlrZSBzdHJlcnJvcigpIGJ1dCBmb3IgTWFjIE9TIGVycm9yIG51bWJlcnMgKi8KIGNoYXIgKgogUHlNYWNfU3RyRXJyb3IoaW50IGVycikKIHsKLQlzdGF0aWMgY2hhciBidWZbMjU2XTsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqcnY7CisgICAgc3RhdGljIGNoYXIgYnVmWzI1Nl07CisgICAgUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKnJ2OwogCi0JbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIk1hY09TIik7Ci0JaWYgKCFtKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5RXJyX1ByaW50KCk7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJ2ID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCXJ2ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChtLCAiR2V0RXJyb3JTdHJpbmciLCAiaSIsIGVycik7Ci0JCWlmICghcnYpCi0JCQlQeUVycl9DbGVhcigpOwotCX0KLQlpZiAoIXJ2KSB7Ci0JCWJ1ZlswXSA9ICdcMCc7Ci0JfQotCWVsc2UgewotCQljaGFyICppbnB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLQkJaWYgKCFpbnB1dCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWJ1ZlswXSA9ICdcMCc7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJuY3B5KGJ1ZiwgaW5wdXQsIHNpemVvZihidWYpIC0gMSk7Ci0JCQlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9ICdcMCc7Ci0JCX0KLQkJUHlfREVDUkVGKHJ2KTsKLQl9Ci0JUHlfWERFQ1JFRihtKTsKLQlyZXR1cm4gYnVmOworICAgIG0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJNYWNPUyIpOworICAgIGlmICghbSkgeworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBydiA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBydiA9IFB5T2JqZWN0X0NhbGxNZXRob2QobSwgIkdldEVycm9yU3RyaW5nIiwgImkiLCBlcnIpOworICAgICAgICBpZiAoIXJ2KQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgaWYgKCFydikgeworICAgICAgICBidWZbMF0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2hhciAqaW5wdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgICAgIGlmICghaW5wdXQpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBidWZbMF0gPSAnXDAnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RybmNweShidWYsIGlucHV0LCBzaXplb2YoYnVmKSAtIDEpOworICAgICAgICAgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgfQorICAgIFB5X1hERUNSRUYobSk7CisgICAgcmV0dXJuIGJ1ZjsKIH0KIAogLyogRXhjZXB0aW9uIG9iamVjdCBzaGFyZWQgYnkgYWxsIE1hYyBzcGVjaWZpYyBtb2R1bGVzIGZvciBNYWMgT1MgZXJyb3JzICovCkBAIC03MywzNiArNzMsMzYgQEAKIFB5T2JqZWN0ICoKIFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKHZvaWQpCiB7Ci0JaWYgKFB5TWFjX09TRXJyRXhjZXB0aW9uID09IE5VTEwpCi0JCVB5TWFjX09TRXJyRXhjZXB0aW9uID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJNYWNPUy5FcnJvciIsIE5VTEwsIE5VTEwpOwotCXJldHVybiBQeU1hY19PU0VyckV4Y2VwdGlvbjsKKyAgICBpZiAoUHlNYWNfT1NFcnJFeGNlcHRpb24gPT0gTlVMTCkKKyAgICAgICAgUHlNYWNfT1NFcnJFeGNlcHRpb24gPSBQeUVycl9OZXdFeGNlcHRpb24oIk1hY09TLkVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIFB5TWFjX09TRXJyRXhjZXB0aW9uOwogfQogCiAvKiBTZXQgYSBNQUMtc3BlY2lmaWMgZXJyb3IgZnJvbSBlcnJubywgYW5kIHJldHVybiBOVUxMOyByZXR1cm4gTm9uZSBpZiBubyBlcnJvciAqLwotUHlPYmplY3QgKiAKK1B5T2JqZWN0ICoKIFB5RXJyX01hYyhQeU9iamVjdCAqZW9iaiwgaW50IGVycikKIHsKLQljaGFyICptc2c7Ci0JUHlPYmplY3QgKnY7Ci0JCi0JaWYgKGVyciA9PSAwICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCWlmIChlcnIgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbXNnID0gUHlNYWNfU3RyRXJyb3IoZXJyKTsKLQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGVyciwgbXNnKTsKLQlQeUVycl9TZXRPYmplY3QoZW9iaiwgdik7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiBOVUxMOworICAgIGNoYXIgKm1zZzsKKyAgICBQeU9iamVjdCAqdjsKKworICAgIGlmIChlcnIgPT0gMCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICBpZiAoZXJyID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1zZyA9IFB5TWFjX1N0ckVycm9yKGVycik7CisgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnIsIG1zZyk7CisgICAgUHlFcnJfU2V0T2JqZWN0KGVvYmosIHYpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogQ2FsbCBQeUVycl9NYWMgd2l0aCBQeU1hY19PU0VyckV4Y2VwdGlvbiAqLwogUHlPYmplY3QgKgogUHlNYWNfRXJyb3IoT1NFcnIgZXJyKQogewotCXJldHVybiBQeUVycl9NYWMoUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKSwgZXJyKTsKKyAgICByZXR1cm4gUHlFcnJfTWFjKFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCksIGVycik7CiB9CiAKIApAQCAtMTEwLDQ5ICsxMTAsNDkgQEAKIE9TRXJyCiBQeU1hY19HZXRGdWxsUGF0aG5hbWUoRlNTcGVjICpmc3MsIGNoYXIgKnBhdGgsIGludCBsZW4pCiB7Ci0JUHlPYmplY3QgKmZzLCAqZXhjOwotCVB5T2JqZWN0ICpydiA9IE5VTEw7Ci0JY2hhciAqaW5wdXQ7Ci0JT1NFcnIgZXJyID0gbm9FcnI7CisgICAgUHlPYmplY3QgKmZzLCAqZXhjOworICAgIFB5T2JqZWN0ICpydiA9IE5VTEw7CisgICAgY2hhciAqaW5wdXQ7CisgICAgT1NFcnIgZXJyID0gbm9FcnI7CiAKLQkqcGF0aCA9ICdcMCc7CisgICAgKnBhdGggPSAnXDAnOwogCi0JZnMgPSBQeU1hY19CdWlsZEZTU3BlYyhmc3MpOwotCWlmICghZnMpCi0JCWdvdG8gZXJyb3I7CisgICAgZnMgPSBQeU1hY19CdWlsZEZTU3BlYyhmc3MpOworICAgIGlmICghZnMpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlydiA9IFB5T2JqZWN0X0NhbGxNZXRob2QoZnMsICJhc19wYXRobmFtZSIsICIiKTsKLQlpZiAoIXJ2KQotCQlnb3RvIGVycm9yOworICAgIHJ2ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChmcywgImFzX3BhdGhuYW1lIiwgIiIpOworICAgIGlmICghcnYpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlpbnB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLQlpZiAoIWlucHV0KQotCQlnb3RvIGVycm9yOworICAgIGlucHV0ID0gUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIGlmICghaW5wdXQpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlzdHJuY3B5KHBhdGgsIGlucHV0LCBsZW4gLSAxKTsKLQlwYXRoW2xlbiAtIDFdID0gJ1wwJzsKKyAgICBzdHJuY3B5KHBhdGgsIGlucHV0LCBsZW4gLSAxKTsKKyAgICBwYXRoW2xlbiAtIDFdID0gJ1wwJzsKIAotCVB5X1hERUNSRUYocnYpOwotCVB5X1hERUNSRUYoZnMpOwotCXJldHVybiBlcnI7CisgICAgUHlfWERFQ1JFRihydik7CisgICAgUHlfWERFQ1JFRihmcyk7CisgICAgcmV0dXJuIGVycjsKIAogICBlcnJvcjoKLQlleGMgPSBQeUVycl9PY2N1cnJlZCgpOwotCWlmIChleGMgICYmIFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhleGMsCi0JCQkJCQlQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpKSkgewotCQlQeU9iamVjdCAqYXJncyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXhjLCAiYXJncyIpOwotCQlpZiAoYXJncykgewotCQkJY2hhciAqaWdub3JlOwotCQkJUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXMiLCAmZXJyLCAmaWdub3JlKTsKLQkJCVB5X1hERUNSRUYoYXJncyk7Ci0JCX0KLQl9Ci0JaWYgKGVyciA9PSBub0VycikKLQkJZXJyID0gLTE7Ci0JUHlFcnJfQ2xlYXIoKTsKLQlQeV9YREVDUkVGKHJ2KTsKLQlQeV9YREVDUkVGKGZzKTsKLQlyZXR1cm4gZXJyOworICAgIGV4YyA9IFB5RXJyX09jY3VycmVkKCk7CisgICAgaWYgKGV4YyAgJiYgUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKGV4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKSkpIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGV4YywgImFyZ3MiKTsKKyAgICAgICAgaWYgKGFyZ3MpIHsKKyAgICAgICAgICAgIGNoYXIgKmlnbm9yZTsKKyAgICAgICAgICAgIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzIiwgJmVyciwgJmlnbm9yZSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGFyZ3MpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlcnIgPT0gbm9FcnIpCisgICAgICAgIGVyciA9IC0xOworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgUHlfWERFQ1JFRihydik7CisgICAgUHlfWERFQ1JFRihmcyk7CisgICAgcmV0dXJuIGVycjsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIApAQCAtMTYwLDMwICsxNjAsMzAgQEAKIGludAogUHlNYWNfR2V0T1NUeXBlKFB5T2JqZWN0ICp2LCBPU1R5cGUgKnByKQogewotCXVpbnQzMl90IHRtcDsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpIHx8IFB5U3RyaW5nX1NpemUodikgIT0gNCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJIk9TVHlwZSBhcmcgbXVzdCBiZSBzdHJpbmcgb2YgNCBjaGFycyIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JbWVtY3B5KChjaGFyICopJnRtcCwgUHlTdHJpbmdfQXNTdHJpbmcodiksIDQpOwotCSpwciA9IChPU1R5cGUpbnRvaGwodG1wKTsKLQlyZXR1cm4gMTsKKyAgICB1aW50MzJfdCB0bXA7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCBQeVN0cmluZ19TaXplKHYpICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJPU1R5cGUgYXJnIG11c3QgYmUgc3RyaW5nIG9mIDQgY2hhcnMiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG1lbWNweSgoY2hhciAqKSZ0bXAsIFB5U3RyaW5nX0FzU3RyaW5nKHYpLCA0KTsKKyAgICAqcHIgPSAoT1NUeXBlKW50b2hsKHRtcCk7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIENvbnZlcnQgYW4gT1NUeXBlIHZhbHVlIHRvIGEgNC1jaGFyIHN0cmluZyBvYmplY3QgKi8KIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkT1NUeXBlKE9TVHlwZSB0KQogewotCXVpbnQzMl90IHRtcCA9IGh0b25sKCh1aW50MzJfdCl0KTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmdG1wLCA0KTsKKyAgICB1aW50MzJfdCB0bXAgPSBodG9ubCgodWludDMyX3QpdCk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnRtcCwgNCk7CiB9CiAKIC8qIENvbnZlcnQgYW4gTnVtVmVyc2lvbiB2YWx1ZSB0byBhIDQtZWxlbWVudCB0dXBsZSAqLwogUHlPYmplY3QgKgogUHlNYWNfQnVpbGROdW1WZXJzaW9uKE51bVZlcnNpb24gdCkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGhoaGgpIiwgdC5tYWpvclJldiwgdC5taW5vckFuZEJ1Z1JldiwgdC5zdGFnZSwgdC5ub25SZWxSZXYpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGhoaCkiLCB0Lm1ham9yUmV2LCB0Lm1pbm9yQW5kQnVnUmV2LCB0LnN0YWdlLCB0Lm5vblJlbFJldik7CiB9CiAKIApAQCAtMTkxLDM2ICsxOTEsMzYgQEAKIGludAogUHlNYWNfR2V0U3RyMjU1KFB5T2JqZWN0ICp2LCBTdHIyNTUgcGJ1ZikKIHsKLQlpbnQgbGVuOwotCWlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgKGxlbiA9IFB5U3RyaW5nX1NpemUodikpID4gMjU1KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiU3RyMjU1IGFyZyBtdXN0IGJlIHN0cmluZyBvZiBhdCBtb3N0IDI1NSBjaGFycyIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcGJ1ZlswXSA9IGxlbjsKLQltZW1jcHkoKGNoYXIgKikocGJ1ZisxKSwgUHlTdHJpbmdfQXNTdHJpbmcodiksIGxlbik7Ci0JcmV0dXJuIDE7CisgICAgaW50IGxlbjsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpIHx8IChsZW4gPSBQeVN0cmluZ19TaXplKHYpKSA+IDI1NSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIlN0cjI1NSBhcmcgbXVzdCBiZSBzdHJpbmcgb2YgYXQgbW9zdCAyNTUgY2hhcnMiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHBidWZbMF0gPSBsZW47CisgICAgbWVtY3B5KChjaGFyICopKHBidWYrMSksIFB5U3RyaW5nX0FzU3RyaW5nKHYpLCBsZW4pOworICAgIHJldHVybiAxOwogfQogCiAvKiBDb252ZXJ0IGEgU3RyMjU1IHRvIGEgUHl0aG9uIHN0cmluZyBvYmplY3QgKi8KIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkU3RyMjU1KFN0cjI1NSBzKQogewotCWlmICggcyA9PSBOVUxMICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJTdHIyNTUgcG9pbnRlciBpcyBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc1sxXSwgKGludClzWzBdKTsKKyAgICBpZiAoIHMgPT0gTlVMTCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiU3RyMjU1IHBvaW50ZXIgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNbMV0sIChpbnQpc1swXSk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkT3B0U3RyMjU1KFN0cjI1NSBzKQogewotCWlmICggcyA9PSBOVUxMICkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc1sxXSwgKGludClzWzBdKTsKKyAgICBpZiAoIHMgPT0gTlVMTCApIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNbMV0sIChpbnQpc1swXSk7CiB9CiAKIApAQCAtMjMyLDE0ICsyMzIsMTQgQEAKIGludAogUHlNYWNfR2V0UmVjdChQeU9iamVjdCAqdiwgUmVjdCAqcikKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihoaGhoKSIsICZyLT5sZWZ0LCAmci0+dG9wLCAmci0+cmlnaHQsICZyLT5ib3R0b20pOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGhoaGgpIiwgJnItPmxlZnQsICZyLT50b3AsICZyLT5yaWdodCwgJnItPmJvdHRvbSk7CiB9CiAKIC8qIENvbnZlcnQgYSBSZWN0IHRvIGEgUHl0aG9uIG9iamVjdCAqLwogUHlPYmplY3QgKgogUHlNYWNfQnVpbGRSZWN0KFJlY3QgKnIpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihoaGhoKSIsIHItPmxlZnQsIHItPnRvcCwgci0+cmlnaHQsIHItPmJvdHRvbSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihoaGhoKSIsIHItPmxlZnQsIHItPnRvcCwgci0+cmlnaHQsIHItPmJvdHRvbSk7CiB9CiAKIApAQCAtMjUwLDE0ICsyNTAsMTQgQEAKIGludAogUHlNYWNfR2V0UG9pbnQoUHlPYmplY3QgKnYsIFBvaW50ICpwKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGhoKSIsICZwLT5oLCAmcC0+dik7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaGgpIiwgJnAtPmgsICZwLT52KTsKIH0KIAogLyogQ29udmVydCBhIFBvaW50IHRvIGEgUHl0aG9uIG9iamVjdCAqLwogUHlPYmplY3QgKgogUHlNYWNfQnVpbGRQb2ludChQb2ludCBwKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGgpIiwgcC5oLCBwLnYpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGgpIiwgcC5oLCBwLnYpOwogfQogCiAKQEAgLTI2Niw3MyArMjY2LDczIEBACiBpbnQKIFB5TWFjX0dldEV2ZW50UmVjb3JkKFB5T2JqZWN0ICp2LCBFdmVudFJlY29yZCAqZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihIa2soaGgpSCkiLAotCSAgICAgICAgICAgICAgICAgICAmZS0+d2hhdCwKLQkgICAgICAgICAgICAgICAgICAgJmUtPm1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICZlLT53aGVuLAotCSAgICAgICAgICAgICAgICAgICAmZS0+d2hlcmUuaCwKLQkgICAgICAgICAgICAgICAgICAgJmUtPndoZXJlLnYsICAgICAgICAgICAgICAgICAgIAotCSAgICAgICAgICAgICAgICAgICAmZS0+bW9kaWZpZXJzKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihIa2soaGgpSCkiLAorICAgICAgICAgICAgICAgICAgICAgICAmZS0+d2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmUtPm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICZlLT53aGVuLAorICAgICAgICAgICAgICAgICAgICAgICAmZS0+d2hlcmUuaCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmUtPndoZXJlLnYsCisgICAgICAgICAgICAgICAgICAgICAgICZlLT5tb2RpZmllcnMpOwogfQogCiAvKiBDb252ZXJ0IGEgUmVjdCB0byBhbiBFdmVudFJlY29yZCBvYmplY3QgKi8KIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQoRXZlbnRSZWNvcmQgKmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihobGwoaGgpaCkiLAotCSAgICAgICAgICAgICAgICAgICAgIGUtPndoYXQsCi0JICAgICAgICAgICAgICAgICAgICAgZS0+bWVzc2FnZSwKLQkgICAgICAgICAgICAgICAgICAgICBlLT53aGVuLAotCSAgICAgICAgICAgICAgICAgICAgIGUtPndoZXJlLmgsCi0JICAgICAgICAgICAgICAgICAgICAgZS0+d2hlcmUudiwKLQkgICAgICAgICAgICAgICAgICAgICBlLT5tb2RpZmllcnMpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGxsKGhoKWgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLT53aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGUtPm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgZS0+d2hlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLT53aGVyZS5oLAorICAgICAgICAgICAgICAgICAgICAgICAgIGUtPndoZXJlLnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZS0+bW9kaWZpZXJzKTsKIH0KIAogLyogQ29udmVydCBQeXRob24gb2JqZWN0IHRvIEZpeGVkICovCiBpbnQKIFB5TWFjX0dldEZpeGVkKFB5T2JqZWN0ICp2LCBGaXhlZCAqZikKIHsKLQlkb3VibGUgZDsKLQkKLQlpZiggIVB5QXJnX1BhcnNlKHYsICJkIiwgJmQpKQotCQlyZXR1cm4gMDsKLQkqZiA9IChGaXhlZCkoZCAqIDB4MTAwMDApOwotCXJldHVybiAxOworICAgIGRvdWJsZSBkOworCisgICAgaWYoICFQeUFyZ19QYXJzZSh2LCAiZCIsICZkKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgKmYgPSAoRml4ZWQpKGQgKiAweDEwMDAwKTsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogQ29udmVydCBhIEZpeGVkIHRvIGEgUHl0aG9uIG9iamVjdCAqLwogUHlPYmplY3QgKgogUHlNYWNfQnVpbGRGaXhlZChGaXhlZCBmKQogewotCWRvdWJsZSBkOwotCQotCWQgPSBmOwotCWQgPSBkIC8gMHgxMDAwMDsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZCIsIGQpOworICAgIGRvdWJsZSBkOworCisgICAgZCA9IGY7CisgICAgZCA9IGQgLyAweDEwMDAwOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJkIiwgZCk7CiB9CiAKIC8qIENvbnZlcnQgd2lkZSB0by9mcm9tIFB5dGhvbiBpbnQgb3IgKGhpLCBsbykgdHVwbGUuIFhYWFggU2hvdWxkIHVzZSBQeXRob24gbG9uZ3MgKi8KIGludAogUHlNYWNfR2V0d2lkZShQeU9iamVjdCAqdiwgd2lkZSAqcnYpCiB7Ci0JaWYgKFB5SW50X0NoZWNrKHYpKSB7Ci0JCXJ2LT5oaSA9IDA7Ci0JCXJ2LT5sbyA9IFB5SW50X0FzTG9uZyh2KTsKLQkJaWYoIHJ2LT5sbyAmIDB4ODAwMDAwMDAgKQotCQkJcnYtPmhpID0gLTE7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihraykiLCAmcnYtPmhpLCAmcnYtPmxvKTsKKyAgICBpZiAoUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgcnYtPmhpID0gMDsKKyAgICAgICAgcnYtPmxvID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICBpZiggcnYtPmxvICYgMHg4MDAwMDAwMCApCisgICAgICAgICAgICBydi0+aGkgPSAtMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGtrKSIsICZydi0+aGksICZydi0+bG8pOwogfQogCiAKIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkd2lkZSh3aWRlICp3KQogewotCWlmICggKHctPmhpID09IDAgJiYgKHctPmxvICYgMHg4MDAwMDAwMCkgPT0gMCkgfHwKLQkgICAgICh3LT5oaSA9PSAtMSAmJiAody0+bG8gJiAweDgwMDAwMDAwKSApICkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHctPmxvKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGxsKSIsIHctPmhpLCB3LT5sbyk7CisgICAgaWYgKCAody0+aGkgPT0gMCAmJiAody0+bG8gJiAweDgwMDAwMDAwKSA9PSAwKSB8fAorICAgICAgICAgKHctPmhpID09IC0xICYmICh3LT5sbyAmIDB4ODAwMDAwMDApICkgKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcody0+bG8pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobGwpIiwgdy0+aGksIHctPmxvKTsKIH0KIAogI2lmZGVmIFVTRV9UT09MQk9YX09CSkVDVF9HTFVFCkBAIC0zNTgsOCArMzU4LDggQEAKICAgICBpZiAoIVB5TWFjR2x1ZVB0cl8jI3JvdXRpbmVuYW1lKSB7IFwKICAgICAgICBpZiAoIVB5SW1wb3J0X0ltcG9ydE1vZHVsZShtb2R1bGUpKSByZXR1cm4gTlVMTDsgXAogICAgICAgIGlmICghUHlNYWNHbHVlUHRyXyMjcm91dGluZW5hbWUpIHsgXAotICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJNb2R1bGUgZGlkIG5vdCBwcm92aWRlIHJvdXRpbmU6ICIgbW9kdWxlICI6ICIgI3JvdXRpbmVuYW1lKTsgXAotICAgICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgIk1vZHVsZSBkaWQgbm90IHByb3ZpZGUgcm91dGluZTogIiBtb2R1bGUgIjogIiAjcm91dGluZW5hbWUpOyBcCisgICAgICAgcmV0dXJuIE5VTEw7IFwKICAgICAgICB9IFwKICAgICB9IFwKICAgICByZXR1cm4gKCpQeU1hY0dsdWVQdHJfIyNyb3V0aW5lbmFtZSkoY29iaik7IFwKQEAgLTM3Miw4ICszNzIsOCBAQAogICAgIGlmICghUHlNYWNHbHVlUHRyXyMjcm91dGluZW5hbWUpIHsgXAogICAgICAgIGlmICghUHlJbXBvcnRfSW1wb3J0TW9kdWxlKG1vZHVsZSkpIHJldHVybiAwOyBcCiAgICAgICAgaWYgKCFQeU1hY0dsdWVQdHJfIyNyb3V0aW5lbmFtZSkgeyBcCi0gICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgIk1vZHVsZSBkaWQgbm90IHByb3ZpZGUgcm91dGluZTogIiBtb2R1bGUgIjogIiAjcm91dGluZW5hbWUpOyBcCi0gICAgICAgICAgIHJldHVybiAwOyBcCisgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiTW9kdWxlIGRpZCBub3QgcHJvdmlkZSByb3V0aW5lOiAiIG1vZHVsZSAiOiAiICNyb3V0aW5lbmFtZSk7IFwKKyAgICAgICByZXR1cm4gMDsgXAogICAgICAgIH0gXAogICAgIH0gXAogICAgIHJldHVybiAoKlB5TWFjR2x1ZVB0cl8jI3JvdXRpbmVuYW1lKShweW9iaiwgY29iaik7IFwKZGlmZiAtLWdpdCBhL1B5dGhvbi9tYXJzaGFsLmMgYi9QeXRob24vbWFyc2hhbC5jCmluZGV4IDE0ZjcxMzQuLmZhY2EwMjcgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9tYXJzaGFsLmMKKysrIGIvUHl0aG9uL21hcnNoYWwuYwpAQCAtMTksMzAgKzE5LDMwIEBACiAgKi8KICNkZWZpbmUgTUFYX01BUlNIQUxfU1RBQ0tfREVQVEggMjAwMAogCi0jZGVmaW5lIFRZUEVfTlVMTAkJJzAnCi0jZGVmaW5lIFRZUEVfTk9ORQkJJ04nCi0jZGVmaW5lIFRZUEVfRkFMU0UJCSdGJwotI2RlZmluZSBUWVBFX1RSVUUJCSdUJwotI2RlZmluZSBUWVBFX1NUT1BJVEVSCQknUycKLSNkZWZpbmUgVFlQRV9FTExJUFNJUyAgIAknLicKLSNkZWZpbmUgVFlQRV9JTlQJCSdpJwotI2RlZmluZSBUWVBFX0lOVDY0CQknSScKLSNkZWZpbmUgVFlQRV9GTE9BVAkJJ2YnCi0jZGVmaW5lIFRZUEVfQklOQVJZX0ZMT0FUCSdnJwotI2RlZmluZSBUWVBFX0NPTVBMRVgJCSd4JwotI2RlZmluZSBUWVBFX0JJTkFSWV9DT01QTEVYCSd5JwotI2RlZmluZSBUWVBFX0xPTkcJCSdsJwotI2RlZmluZSBUWVBFX1NUUklORwkJJ3MnCi0jZGVmaW5lIFRZUEVfSU5URVJORUQJCSd0JwotI2RlZmluZSBUWVBFX1NUUklOR1JFRgkJJ1InCi0jZGVmaW5lIFRZUEVfVFVQTEUJCScoJwotI2RlZmluZSBUWVBFX0xJU1QJCSdbJwotI2RlZmluZSBUWVBFX0RJQ1QJCSd7JwotI2RlZmluZSBUWVBFX0NPREUJCSdjJwotI2RlZmluZSBUWVBFX1VOSUNPREUJCSd1JwotI2RlZmluZSBUWVBFX1VOS05PV04JCSc/JwotI2RlZmluZSBUWVBFX1NFVAkJJzwnCi0jZGVmaW5lIFRZUEVfRlJPWkVOU0VUICAJJz4nCisjZGVmaW5lIFRZUEVfTlVMTCAgICAgICAgICAgICAgICcwJworI2RlZmluZSBUWVBFX05PTkUgICAgICAgICAgICAgICAnTicKKyNkZWZpbmUgVFlQRV9GQUxTRSAgICAgICAgICAgICAgJ0YnCisjZGVmaW5lIFRZUEVfVFJVRSAgICAgICAgICAgICAgICdUJworI2RlZmluZSBUWVBFX1NUT1BJVEVSICAgICAgICAgICAnUycKKyNkZWZpbmUgVFlQRV9FTExJUFNJUyAgICAgICAgICAgJy4nCisjZGVmaW5lIFRZUEVfSU5UICAgICAgICAgICAgICAgICdpJworI2RlZmluZSBUWVBFX0lOVDY0ICAgICAgICAgICAgICAnSScKKyNkZWZpbmUgVFlQRV9GTE9BVCAgICAgICAgICAgICAgJ2YnCisjZGVmaW5lIFRZUEVfQklOQVJZX0ZMT0FUICAgICAgICdnJworI2RlZmluZSBUWVBFX0NPTVBMRVggICAgICAgICAgICAneCcKKyNkZWZpbmUgVFlQRV9CSU5BUllfQ09NUExFWCAgICAgJ3knCisjZGVmaW5lIFRZUEVfTE9ORyAgICAgICAgICAgICAgICdsJworI2RlZmluZSBUWVBFX1NUUklORyAgICAgICAgICAgICAncycKKyNkZWZpbmUgVFlQRV9JTlRFUk5FRCAgICAgICAgICAgJ3QnCisjZGVmaW5lIFRZUEVfU1RSSU5HUkVGICAgICAgICAgICdSJworI2RlZmluZSBUWVBFX1RVUExFICAgICAgICAgICAgICAnKCcKKyNkZWZpbmUgVFlQRV9MSVNUICAgICAgICAgICAgICAgJ1snCisjZGVmaW5lIFRZUEVfRElDVCAgICAgICAgICAgICAgICd7JworI2RlZmluZSBUWVBFX0NPREUgICAgICAgICAgICAgICAnYycKKyNkZWZpbmUgVFlQRV9VTklDT0RFICAgICAgICAgICAgJ3UnCisjZGVmaW5lIFRZUEVfVU5LTk9XTiAgICAgICAgICAgICc/JworI2RlZmluZSBUWVBFX1NFVCAgICAgICAgICAgICAgICAnPCcKKyNkZWZpbmUgVFlQRV9GUk9aRU5TRVQgICAgICAgICAgJz4nCiAKICNkZWZpbmUgV0ZFUlJfT0sgMAogI2RlZmluZSBXRkVSUl9VTk1BUlNIQUxMQUJMRSAxCkBAIC01MCw3OSArNTAsNzkgQEAKICNkZWZpbmUgV0ZFUlJfTk9NRU1PUlkgMwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JRklMRSAqZnA7Ci0JaW50IGVycm9yOyAgLyogc2VlIFdGRVJSXyogdmFsdWVzICovCi0JaW50IGRlcHRoOwotCS8qIElmIGZwID09IE5VTEwsIHRoZSBmb2xsb3dpbmcgYXJlIHZhbGlkOiAqLwotCVB5T2JqZWN0ICpzdHI7Ci0JY2hhciAqcHRyOwotCWNoYXIgKmVuZDsKLQlQeU9iamVjdCAqc3RyaW5nczsgLyogZGljdCBvbiBtYXJzaGFsLCBsaXN0IG9uIHVubWFyc2hhbCAqLwotCWludCB2ZXJzaW9uOworICAgIEZJTEUgKmZwOworICAgIGludCBlcnJvcjsgIC8qIHNlZSBXRkVSUl8qIHZhbHVlcyAqLworICAgIGludCBkZXB0aDsKKyAgICAvKiBJZiBmcCA9PSBOVUxMLCB0aGUgZm9sbG93aW5nIGFyZSB2YWxpZDogKi8KKyAgICBQeU9iamVjdCAqc3RyOworICAgIGNoYXIgKnB0cjsKKyAgICBjaGFyICplbmQ7CisgICAgUHlPYmplY3QgKnN0cmluZ3M7IC8qIGRpY3Qgb24gbWFyc2hhbCwgbGlzdCBvbiB1bm1hcnNoYWwgKi8KKyAgICBpbnQgdmVyc2lvbjsKIH0gV0ZJTEU7CiAKICNkZWZpbmUgd19ieXRlKGMsIHApIGlmICgoKHApLT5mcCkpIHB1dGMoKGMpLCAocCktPmZwKTsgXAotCQkgICAgICBlbHNlIGlmICgocCktPnB0ciAhPSAocCktPmVuZCkgKihwKS0+cHRyKysgPSAoYyk7IFwKLQkJCSAgIGVsc2Ugd19tb3JlKGMsIHApCisgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHApLT5wdHIgIT0gKHApLT5lbmQpICoocCktPnB0cisrID0gKGMpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHdfbW9yZShjLCBwKQogCiBzdGF0aWMgdm9pZAogd19tb3JlKGludCBjLCBXRklMRSAqcCkKIHsKLQlQeV9zc2l6ZV90IHNpemUsIG5ld3NpemU7Ci0JaWYgKHAtPnN0ciA9PSBOVUxMKQotCQlyZXR1cm47IC8qIEFuIGVycm9yIGFscmVhZHkgb2NjdXJyZWQgKi8KLQlzaXplID0gUHlTdHJpbmdfU2l6ZShwLT5zdHIpOwotCW5ld3NpemUgPSBzaXplICsgc2l6ZSArIDEwMjQ7Ci0JaWYgKG5ld3NpemUgPiAzMioxMDI0KjEwMjQpIHsKLQkJbmV3c2l6ZSA9IHNpemUgKyAoc2l6ZSA+PiAzKTsJLyogMTIuNSUgb3ZlcmFsbG9jYXRpb24gKi8KLQl9Ci0JaWYgKF9QeVN0cmluZ19SZXNpemUoJnAtPnN0ciwgbmV3c2l6ZSkgIT0gMCkgewotCQlwLT5wdHIgPSBwLT5lbmQgPSBOVUxMOwotCX0KLQllbHNlIHsKLQkJcC0+cHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXAtPnN0cikgKyBzaXplOwotCQlwLT5lbmQgPQotCQkJUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXAtPnN0cikgKyBuZXdzaXplOwotCQkqcC0+cHRyKysgPSBQeV9TQUZFX0RPV05DQVNUKGMsIGludCwgY2hhcik7Ci0JfQorICAgIFB5X3NzaXplX3Qgc2l6ZSwgbmV3c2l6ZTsKKyAgICBpZiAocC0+c3RyID09IE5VTEwpCisgICAgICAgIHJldHVybjsgLyogQW4gZXJyb3IgYWxyZWFkeSBvY2N1cnJlZCAqLworICAgIHNpemUgPSBQeVN0cmluZ19TaXplKHAtPnN0cik7CisgICAgbmV3c2l6ZSA9IHNpemUgKyBzaXplICsgMTAyNDsKKyAgICBpZiAobmV3c2l6ZSA+IDMyKjEwMjQqMTAyNCkgeworICAgICAgICBuZXdzaXplID0gc2l6ZSArIChzaXplID4+IDMpOyAgICAgICAgICAgLyogMTIuNSUgb3ZlcmFsbG9jYXRpb24gKi8KKyAgICB9CisgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnAtPnN0ciwgbmV3c2l6ZSkgIT0gMCkgeworICAgICAgICBwLT5wdHIgPSBwLT5lbmQgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcC0+cHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXAtPnN0cikgKyBzaXplOworICAgICAgICBwLT5lbmQgPQorICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXAtPnN0cikgKyBuZXdzaXplOworICAgICAgICAqcC0+cHRyKysgPSBQeV9TQUZFX0RPV05DQVNUKGMsIGludCwgY2hhcik7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogd19zdHJpbmcoY2hhciAqcywgaW50IG4sIFdGSUxFICpwKQogewotCWlmIChwLT5mcCAhPSBOVUxMKSB7Ci0JCWZ3cml0ZShzLCAxLCBuLCBwLT5mcCk7Ci0JfQotCWVsc2UgewotCQl3aGlsZSAoLS1uID49IDApIHsKLQkJCXdfYnl0ZSgqcywgcCk7Ci0JCQlzKys7Ci0JCX0KLQl9CisgICAgaWYgKHAtPmZwICE9IE5VTEwpIHsKKyAgICAgICAgZndyaXRlKHMsIDEsIG4sIHAtPmZwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHdoaWxlICgtLW4gPj0gMCkgeworICAgICAgICAgICAgd19ieXRlKCpzLCBwKTsKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIHdfc2hvcnQoaW50IHgsIFdGSUxFICpwKQogewotCXdfYnl0ZSgoY2hhcikoIHggICAgICAmIDB4ZmYpLCBwKTsKLQl3X2J5dGUoKGNoYXIpKCh4Pj4gOCkgJiAweGZmKSwgcCk7CisgICAgd19ieXRlKChjaGFyKSggeCAgICAgICYgMHhmZiksIHApOworICAgIHdfYnl0ZSgoY2hhcikoKHg+PiA4KSAmIDB4ZmYpLCBwKTsKIH0KIAogc3RhdGljIHZvaWQKIHdfbG9uZyhsb25nIHgsIFdGSUxFICpwKQogewotCXdfYnl0ZSgoY2hhcikoIHggICAgICAmIDB4ZmYpLCBwKTsKLQl3X2J5dGUoKGNoYXIpKCh4Pj4gOCkgJiAweGZmKSwgcCk7Ci0Jd19ieXRlKChjaGFyKSgoeD4+MTYpICYgMHhmZiksIHApOwotCXdfYnl0ZSgoY2hhcikoKHg+PjI0KSAmIDB4ZmYpLCBwKTsKKyAgICB3X2J5dGUoKGNoYXIpKCB4ICAgICAgJiAweGZmKSwgcCk7CisgICAgd19ieXRlKChjaGFyKSgoeD4+IDgpICYgMHhmZiksIHApOworICAgIHdfYnl0ZSgoY2hhcikoKHg+PjE2KSAmIDB4ZmYpLCBwKTsKKyAgICB3X2J5dGUoKGNoYXIpKCh4Pj4yNCkgJiAweGZmKSwgcCk7CiB9CiAKICNpZiBTSVpFT0ZfTE9ORyA+IDQKIHN0YXRpYyB2b2lkCiB3X2xvbmc2NChsb25nIHgsIFdGSUxFICpwKQogewotCXdfbG9uZyh4LCBwKTsKLQl3X2xvbmcoeD4+MzIsIHApOworICAgIHdfbG9uZyh4LCBwKTsKKyAgICB3X2xvbmcoeD4+MzIsIHApOwogfQogI2VuZGlmCiAKQEAgLTE0MSwzMzcgKzE0MSwzMzcgQEAKIHN0YXRpYyB2b2lkCiB3X1B5TG9uZyhjb25zdCBQeUxvbmdPYmplY3QgKm9iLCBXRklMRSAqcCkKIHsKLQlQeV9zc2l6ZV90IGksIGosIG4sIGw7Ci0JZGlnaXQgZDsKKyAgICBQeV9zc2l6ZV90IGksIGosIG4sIGw7CisgICAgZGlnaXQgZDsKIAotCXdfYnl0ZShUWVBFX0xPTkcsIHApOwotCWlmIChQeV9TSVpFKG9iKSA9PSAwKSB7Ci0JCXdfbG9uZygobG9uZykwLCBwKTsKLQkJcmV0dXJuOwotCX0KKyAgICB3X2J5dGUoVFlQRV9MT05HLCBwKTsKKyAgICBpZiAoUHlfU0laRShvYikgPT0gMCkgeworICAgICAgICB3X2xvbmcoKGxvbmcpMCwgcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQkvKiBzZXQgbCB0byBudW1iZXIgb2YgYmFzZSBQeUxvbmdfTUFSU0hBTF9CQVNFIGRpZ2l0cyAqLwotCW4gPSBBQlMoUHlfU0laRShvYikpOwotCWwgPSAobi0xKSAqIFB5TG9uZ19NQVJTSEFMX1JBVElPOwotCWQgPSBvYi0+b2JfZGlnaXRbbi0xXTsKLQlhc3NlcnQoZCAhPSAwKTsgLyogYSBQeUxvbmcgaXMgYWx3YXlzIG5vcm1hbGl6ZWQgKi8KLQlkbyB7Ci0JCWQgPj49IFB5TG9uZ19NQVJTSEFMX1NISUZUOwotCQlsKys7Ci0JfSB3aGlsZSAoZCAhPSAwKTsKLQl3X2xvbmcoKGxvbmcpKFB5X1NJWkUob2IpID4gMCA/IGwgOiAtbCksIHApOworICAgIC8qIHNldCBsIHRvIG51bWJlciBvZiBiYXNlIFB5TG9uZ19NQVJTSEFMX0JBU0UgZGlnaXRzICovCisgICAgbiA9IEFCUyhQeV9TSVpFKG9iKSk7CisgICAgbCA9IChuLTEpICogUHlMb25nX01BUlNIQUxfUkFUSU87CisgICAgZCA9IG9iLT5vYl9kaWdpdFtuLTFdOworICAgIGFzc2VydChkICE9IDApOyAvKiBhIFB5TG9uZyBpcyBhbHdheXMgbm9ybWFsaXplZCAqLworICAgIGRvIHsKKyAgICAgICAgZCA+Pj0gUHlMb25nX01BUlNIQUxfU0hJRlQ7CisgICAgICAgIGwrKzsKKyAgICB9IHdoaWxlIChkICE9IDApOworICAgIHdfbG9uZygobG9uZykoUHlfU0laRShvYikgPiAwID8gbCA6IC1sKSwgcCk7CiAKLQlmb3IgKGk9MDsgaSA8IG4tMTsgaSsrKSB7Ci0JCWQgPSBvYi0+b2JfZGlnaXRbaV07Ci0JCWZvciAoaj0wOyBqIDwgUHlMb25nX01BUlNIQUxfUkFUSU87IGorKykgewotCQkJd19zaG9ydChkICYgUHlMb25nX01BUlNIQUxfTUFTSywgcCk7Ci0JCQlkID4+PSBQeUxvbmdfTUFSU0hBTF9TSElGVDsKLQkJfQotCQlhc3NlcnQgKGQgPT0gMCk7Ci0JfQotCWQgPSBvYi0+b2JfZGlnaXRbbi0xXTsKLQlkbyB7Ci0JCXdfc2hvcnQoZCAmIFB5TG9uZ19NQVJTSEFMX01BU0ssIHApOwotCQlkID4+PSBQeUxvbmdfTUFSU0hBTF9TSElGVDsKLQl9IHdoaWxlIChkICE9IDApOworICAgIGZvciAoaT0wOyBpIDwgbi0xOyBpKyspIHsKKyAgICAgICAgZCA9IG9iLT5vYl9kaWdpdFtpXTsKKyAgICAgICAgZm9yIChqPTA7IGogPCBQeUxvbmdfTUFSU0hBTF9SQVRJTzsgaisrKSB7CisgICAgICAgICAgICB3X3Nob3J0KGQgJiBQeUxvbmdfTUFSU0hBTF9NQVNLLCBwKTsKKyAgICAgICAgICAgIGQgPj49IFB5TG9uZ19NQVJTSEFMX1NISUZUOworICAgICAgICB9CisgICAgICAgIGFzc2VydCAoZCA9PSAwKTsKKyAgICB9CisgICAgZCA9IG9iLT5vYl9kaWdpdFtuLTFdOworICAgIGRvIHsKKyAgICAgICAgd19zaG9ydChkICYgUHlMb25nX01BUlNIQUxfTUFTSywgcCk7CisgICAgICAgIGQgPj49IFB5TG9uZ19NQVJTSEFMX1NISUZUOworICAgIH0gd2hpbGUgKGQgIT0gMCk7CiB9CiAKIHN0YXRpYyB2b2lkCiB3X29iamVjdChQeU9iamVjdCAqdiwgV0ZJTEUgKnApCiB7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCXAtPmRlcHRoKys7CisgICAgcC0+ZGVwdGgrKzsKIAotCWlmIChwLT5kZXB0aCA+IE1BWF9NQVJTSEFMX1NUQUNLX0RFUFRIKSB7Ci0JCXAtPmVycm9yID0gV0ZFUlJfTkVTVEVEVE9PREVFUDsKLQl9Ci0JZWxzZSBpZiAodiA9PSBOVUxMKSB7Ci0JCXdfYnl0ZShUWVBFX05VTEwsIHApOwotCX0KLQllbHNlIGlmICh2ID09IFB5X05vbmUpIHsKLQkJd19ieXRlKFRZUEVfTk9ORSwgcCk7Ci0JfQotCWVsc2UgaWYgKHYgPT0gUHlFeGNfU3RvcEl0ZXJhdGlvbikgewotCQl3X2J5dGUoVFlQRV9TVE9QSVRFUiwgcCk7Ci0JfQotCWVsc2UgaWYgKHYgPT0gUHlfRWxsaXBzaXMpIHsKLQkgICAgICAgIHdfYnl0ZShUWVBFX0VMTElQU0lTLCBwKTsKLQl9Ci0JZWxzZSBpZiAodiA9PSBQeV9GYWxzZSkgewotCSAgICAgICAgd19ieXRlKFRZUEVfRkFMU0UsIHApOwotCX0KLQllbHNlIGlmICh2ID09IFB5X1RydWUpIHsKLQkgICAgICAgIHdfYnl0ZShUWVBFX1RSVUUsIHApOwotCX0KLQllbHNlIGlmIChQeUludF9DaGVja0V4YWN0KHYpKSB7Ci0JCWxvbmcgeCA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopdik7CisgICAgaWYgKHAtPmRlcHRoID4gTUFYX01BUlNIQUxfU1RBQ0tfREVQVEgpIHsKKyAgICAgICAgcC0+ZXJyb3IgPSBXRkVSUl9ORVNURURUT09ERUVQOworICAgIH0KKyAgICBlbHNlIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgd19ieXRlKFRZUEVfTlVMTCwgcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHYgPT0gUHlfTm9uZSkgeworICAgICAgICB3X2J5dGUoVFlQRV9OT05FLCBwKTsKKyAgICB9CisgICAgZWxzZSBpZiAodiA9PSBQeUV4Y19TdG9wSXRlcmF0aW9uKSB7CisgICAgICAgIHdfYnl0ZShUWVBFX1NUT1BJVEVSLCBwKTsKKyAgICB9CisgICAgZWxzZSBpZiAodiA9PSBQeV9FbGxpcHNpcykgeworICAgICAgICB3X2J5dGUoVFlQRV9FTExJUFNJUywgcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHYgPT0gUHlfRmFsc2UpIHsKKyAgICAgICAgd19ieXRlKFRZUEVfRkFMU0UsIHApOworICAgIH0KKyAgICBlbHNlIGlmICh2ID09IFB5X1RydWUpIHsKKyAgICAgICAgd19ieXRlKFRZUEVfVFJVRSwgcCk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgbG9uZyB4ID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKil2KTsKICNpZiBTSVpFT0ZfTE9ORyA+IDQKLQkJbG9uZyB5ID0gUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVChsb25nLCB4LCAzMSk7Ci0JCWlmICh5ICYmIHkgIT0gLTEpIHsKLQkJCXdfYnl0ZShUWVBFX0lOVDY0LCBwKTsKLQkJCXdfbG9uZzY0KHgsIHApOwotCQl9Ci0JCWVsc2UKKyAgICAgICAgbG9uZyB5ID0gUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVChsb25nLCB4LCAzMSk7CisgICAgICAgIGlmICh5ICYmIHkgIT0gLTEpIHsKKyAgICAgICAgICAgIHdfYnl0ZShUWVBFX0lOVDY0LCBwKTsKKyAgICAgICAgICAgIHdfbG9uZzY0KHgsIHApOworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZgotCQkJewotCQkJd19ieXRlKFRZUEVfSU5ULCBwKTsKLQkJCXdfbG9uZyh4LCBwKTsKLQkJfQotCX0KLQllbHNlIGlmIChQeUxvbmdfQ2hlY2tFeGFjdCh2KSkgewotCQlQeUxvbmdPYmplY3QgKm9iID0gKFB5TG9uZ09iamVjdCAqKXY7Ci0JCXdfUHlMb25nKG9iLCBwKTsKLQl9Ci0JZWxzZSBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KHYpKSB7Ci0JCWlmIChwLT52ZXJzaW9uID4gMSkgewotCQkJdW5zaWduZWQgY2hhciBidWZbOF07Ci0JCQlpZiAoX1B5RmxvYXRfUGFjazgoUHlGbG9hdF9Bc0RvdWJsZSh2KSwgCi0JCQkJCSAgIGJ1ZiwgMSkgPCAwKSB7Ci0JCQkJcC0+ZXJyb3IgPSBXRkVSUl9VTk1BUlNIQUxMQUJMRTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl3X2J5dGUoVFlQRV9CSU5BUllfRkxPQVQsIHApOwotCQkJd19zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFyICpidWYgPSBQeU9TX2RvdWJsZV90b19zdHJpbmcoUHlGbG9hdF9BU19ET1VCTEUodiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnLCAxNywgMCwgTlVMTCk7Ci0JCQlpZiAoIWJ1ZikgewotCQkJCXAtPmVycm9yID0gV0ZFUlJfTk9NRU1PUlk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbiA9IHN0cmxlbihidWYpOwotCQkJd19ieXRlKFRZUEVfRkxPQVQsIHApOwotCQkJd19ieXRlKChpbnQpbiwgcCk7Ci0JCQl3X3N0cmluZyhidWYsIChpbnQpbiwgcCk7Ci0JCQlQeU1lbV9GcmVlKGJ1Zik7Ci0JCX0KLQl9CisgICAgICAgICAgICB7CisgICAgICAgICAgICB3X2J5dGUoVFlQRV9JTlQsIHApOworICAgICAgICAgICAgd19sb25nKHgsIHApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIFB5TG9uZ09iamVjdCAqb2IgPSAoUHlMb25nT2JqZWN0ICopdjsKKyAgICAgICAgd19QeUxvbmcob2IsIHApOworICAgIH0KKyAgICBlbHNlIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgaWYgKHAtPnZlcnNpb24gPiAxKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKyAgICAgICAgICAgIGlmIChfUHlGbG9hdF9QYWNrOChQeUZsb2F0X0FzRG91YmxlKHYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcC0+ZXJyb3IgPSBXRkVSUl9VTk1BUlNIQUxMQUJMRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3X2J5dGUoVFlQRV9CSU5BUllfRkxPQVQsIHApOworICAgICAgICAgICAgd19zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICpidWYgPSBQeU9TX2RvdWJsZV90b19zdHJpbmcoUHlGbG9hdF9BU19ET1VCTEUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnLCAxNywgMCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIWJ1ZikgeworICAgICAgICAgICAgICAgIHAtPmVycm9yID0gV0ZFUlJfTk9NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IHN0cmxlbihidWYpOworICAgICAgICAgICAgd19ieXRlKFRZUEVfRkxPQVQsIHApOworICAgICAgICAgICAgd19ieXRlKChpbnQpbiwgcCk7CisgICAgICAgICAgICB3X3N0cmluZyhidWYsIChpbnQpbiwgcCk7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgICAgIH0KKyAgICB9CiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCWVsc2UgaWYgKFB5Q29tcGxleF9DaGVja0V4YWN0KHYpKSB7Ci0JCWlmIChwLT52ZXJzaW9uID4gMSkgewotCQkJdW5zaWduZWQgY2hhciBidWZbOF07Ci0JCQlpZiAoX1B5RmxvYXRfUGFjazgoUHlDb21wbGV4X1JlYWxBc0RvdWJsZSh2KSwKLQkJCQkJICAgYnVmLCAxKSA8IDApIHsKLQkJCQlwLT5lcnJvciA9IFdGRVJSX1VOTUFSU0hBTExBQkxFOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXdfYnl0ZShUWVBFX0JJTkFSWV9DT01QTEVYLCBwKTsKLQkJCXdfc3RyaW5nKChjaGFyKilidWYsIDgsIHApOwotCQkJaWYgKF9QeUZsb2F0X1BhY2s4KFB5Q29tcGxleF9JbWFnQXNEb3VibGUodiksIAotCQkJCQkgICBidWYsIDEpIDwgMCkgewotCQkJCXAtPmVycm9yID0gV0ZFUlJfVU5NQVJTSEFMTEFCTEU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJd19zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFyICpidWY7Ci0JCQl3X2J5dGUoVFlQRV9DT01QTEVYLCBwKTsKLQkJCWJ1ZiA9IFB5T1NfZG91YmxlX3RvX3N0cmluZyhQeUNvbXBsZXhfUmVhbEFzRG91YmxlKHYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJywgMTcsIDAsIE5VTEwpOwotCQkJaWYgKCFidWYpIHsKLQkJCQlwLT5lcnJvciA9IFdGRVJSX05PTUVNT1JZOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCW4gPSBzdHJsZW4oYnVmKTsKLQkJCXdfYnl0ZSgoaW50KW4sIHApOwotCQkJd19zdHJpbmcoYnVmLCAoaW50KW4sIHApOwotCQkJUHlNZW1fRnJlZShidWYpOwotCQkJYnVmID0gUHlPU19kb3VibGVfdG9fc3RyaW5nKFB5Q29tcGxleF9JbWFnQXNEb3VibGUodiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnLCAxNywgMCwgTlVMTCk7Ci0JCQlpZiAoIWJ1ZikgewotCQkJCXAtPmVycm9yID0gV0ZFUlJfTk9NRU1PUlk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbiA9IHN0cmxlbihidWYpOwotCQkJd19ieXRlKChpbnQpbiwgcCk7Ci0JCQl3X3N0cmluZyhidWYsIChpbnQpbiwgcCk7Ci0JCQlQeU1lbV9GcmVlKGJ1Zik7Ci0JCX0KLQl9CisgICAgZWxzZSBpZiAoUHlDb21wbGV4X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgaWYgKHAtPnZlcnNpb24gPiAxKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKyAgICAgICAgICAgIGlmIChfUHlGbG9hdF9QYWNrOChQeUNvbXBsZXhfUmVhbEFzRG91YmxlKHYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcC0+ZXJyb3IgPSBXRkVSUl9VTk1BUlNIQUxMQUJMRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3X2J5dGUoVFlQRV9CSU5BUllfQ09NUExFWCwgcCk7CisgICAgICAgICAgICB3X3N0cmluZygoY2hhciopYnVmLCA4LCBwKTsKKyAgICAgICAgICAgIGlmIChfUHlGbG9hdF9QYWNrOChQeUNvbXBsZXhfSW1hZ0FzRG91YmxlKHYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcC0+ZXJyb3IgPSBXRkVSUl9VTk1BUlNIQUxMQUJMRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3X3N0cmluZygoY2hhciopYnVmLCA4LCBwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgIHdfYnl0ZShUWVBFX0NPTVBMRVgsIHApOworICAgICAgICAgICAgYnVmID0gUHlPU19kb3VibGVfdG9fc3RyaW5nKFB5Q29tcGxleF9SZWFsQXNEb3VibGUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnLCAxNywgMCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIWJ1ZikgeworICAgICAgICAgICAgICAgIHAtPmVycm9yID0gV0ZFUlJfTk9NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IHN0cmxlbihidWYpOworICAgICAgICAgICAgd19ieXRlKChpbnQpbiwgcCk7CisgICAgICAgICAgICB3X3N0cmluZyhidWYsIChpbnQpbiwgcCk7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgICAgICAgICBidWYgPSBQeU9TX2RvdWJsZV90b19zdHJpbmcoUHlDb21wbGV4X0ltYWdBc0RvdWJsZSh2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycsIDE3LCAwLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghYnVmKSB7CisgICAgICAgICAgICAgICAgcC0+ZXJyb3IgPSBXRkVSUl9OT01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gc3RybGVuKGJ1Zik7CisgICAgICAgICAgICB3X2J5dGUoKGludCluLCBwKTsKKyAgICAgICAgICAgIHdfc3RyaW5nKGJ1ZiwgKGludCluLCBwKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgotCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikpIHsKLQkJaWYgKHAtPnN0cmluZ3MgJiYgUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQodikpIHsKLQkJCVB5T2JqZWN0ICpvID0gUHlEaWN0X0dldEl0ZW0ocC0+c3RyaW5ncywgdik7Ci0JCQlpZiAobykgewotCQkJCWxvbmcgdyA9IFB5SW50X0FzTG9uZyhvKTsKLQkJCQl3X2J5dGUoVFlQRV9TVFJJTkdSRUYsIHApOwotCQkJCXdfbG9uZyh3LCBwKTsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgb2s7Ci0JCQkJbyA9IFB5SW50X0Zyb21Tc2l6ZV90KFB5RGljdF9TaXplKHAtPnN0cmluZ3MpKTsKLQkJCQlvayA9IG8gJiYKLQkJCQkgICAgIFB5RGljdF9TZXRJdGVtKHAtPnN0cmluZ3MsIHYsIG8pID49IDA7Ci0JCQkJUHlfWERFQ1JFRihvKTsKLQkJCQlpZiAoIW9rKSB7Ci0JCQkJCXAtPmRlcHRoLS07Ci0JCQkJCXAtPmVycm9yID0gV0ZFUlJfVU5NQVJTSEFMTEFCTEU7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJd19ieXRlKFRZUEVfSU5URVJORUQsIHApOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJd19ieXRlKFRZUEVfU1RSSU5HLCBwKTsKLQkJfQotCQluID0gUHlTdHJpbmdfR0VUX1NJWkUodik7Ci0JCWlmIChuID4gSU5UX01BWCkgewotCQkJLyogaHVnZSBzdHJpbmdzIGFyZSBub3Qgc3VwcG9ydGVkICovCi0JCQlwLT5kZXB0aC0tOwotCQkJcC0+ZXJyb3IgPSBXRkVSUl9VTk1BUlNIQUxMQUJMRTsKLQkJCXJldHVybjsKLQkJfQotCQl3X2xvbmcoKGxvbmcpbiwgcCk7Ci0JCXdfc3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyh2KSwgKGludCluLCBwKTsKLQl9CisgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBpZiAocC0+c3RyaW5ncyAmJiBQeVN0cmluZ19DSEVDS19JTlRFUk5FRCh2KSkgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBQeURpY3RfR2V0SXRlbShwLT5zdHJpbmdzLCB2KTsKKyAgICAgICAgICAgIGlmIChvKSB7CisgICAgICAgICAgICAgICAgbG9uZyB3ID0gUHlJbnRfQXNMb25nKG8pOworICAgICAgICAgICAgICAgIHdfYnl0ZShUWVBFX1NUUklOR1JFRiwgcCk7CisgICAgICAgICAgICAgICAgd19sb25nKHcsIHApOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCBvazsKKyAgICAgICAgICAgICAgICBvID0gUHlJbnRfRnJvbVNzaXplX3QoUHlEaWN0X1NpemUocC0+c3RyaW5ncykpOworICAgICAgICAgICAgICAgIG9rID0gbyAmJgorICAgICAgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW0ocC0+c3RyaW5ncywgdiwgbykgPj0gMDsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKG8pOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgcC0+ZGVwdGgtLTsKKyAgICAgICAgICAgICAgICAgICAgcC0+ZXJyb3IgPSBXRkVSUl9VTk1BUlNIQUxMQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3X2J5dGUoVFlQRV9JTlRFUk5FRCwgcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3X2J5dGUoVFlQRV9TVFJJTkcsIHApOworICAgICAgICB9CisgICAgICAgIG4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKyAgICAgICAgaWYgKG4gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICAvKiBodWdlIHN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgICAgICAgIHAtPmRlcHRoLS07CisgICAgICAgICAgICBwLT5lcnJvciA9IFdGRVJSX1VOTUFSU0hBTExBQkxFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKKyAgICAgICAgd19zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCAoaW50KW4sIHApOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3QodikpIHsKLQkgICAgICAgIFB5T2JqZWN0ICp1dGY4OwotCQl1dGY4ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyh2KTsKLQkJaWYgKHV0ZjggPT0gTlVMTCkgewotCQkJcC0+ZGVwdGgtLTsKLQkJCXAtPmVycm9yID0gV0ZFUlJfVU5NQVJTSEFMTEFCTEU7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd19ieXRlKFRZUEVfVU5JQ09ERSwgcCk7Ci0JCW4gPSBQeVN0cmluZ19HRVRfU0laRSh1dGY4KTsKLQkJaWYgKG4gPiBJTlRfTUFYKSB7Ci0JCQlwLT5kZXB0aC0tOwotCQkJcC0+ZXJyb3IgPSBXRkVSUl9VTk1BUlNIQUxMQUJMRTsKLQkJCXJldHVybjsKLQkJfQotCQl3X2xvbmcoKGxvbmcpbiwgcCk7Ci0JCXdfc3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyh1dGY4KSwgKGludCluLCBwKTsKLQkJUHlfREVDUkVGKHV0ZjgpOwotCX0KKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeU9iamVjdCAqdXRmODsKKyAgICAgICAgdXRmOCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcodik7CisgICAgICAgIGlmICh1dGY4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHAtPmRlcHRoLS07CisgICAgICAgICAgICBwLT5lcnJvciA9IFdGRVJSX1VOTUFSU0hBTExBQkxFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdfYnl0ZShUWVBFX1VOSUNPREUsIHApOworICAgICAgICBuID0gUHlTdHJpbmdfR0VUX1NJWkUodXRmOCk7CisgICAgICAgIGlmIChuID4gSU5UX01BWCkgeworICAgICAgICAgICAgcC0+ZGVwdGgtLTsKKyAgICAgICAgICAgIHAtPmVycm9yID0gV0ZFUlJfVU5NQVJTSEFMTEFCTEU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd19sb25nKChsb25nKW4sIHApOworICAgICAgICB3X3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodXRmOCksIChpbnQpbiwgcCk7CisgICAgICAgIFB5X0RFQ1JFRih1dGY4KTsKKyAgICB9CiAjZW5kaWYKLQllbHNlIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QodikpIHsKLQkJd19ieXRlKFRZUEVfVFVQTEUsIHApOwotCQluID0gUHlUdXBsZV9TaXplKHYpOwotCQl3X2xvbmcoKGxvbmcpbiwgcCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXdfb2JqZWN0KFB5VHVwbGVfR0VUX0lURU0odiwgaSksIHApOwotCQl9Ci0JfQotCWVsc2UgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHYpKSB7Ci0JCXdfYnl0ZShUWVBFX0xJU1QsIHApOwotCQluID0gUHlMaXN0X0dFVF9TSVpFKHYpOwotCQl3X2xvbmcoKGxvbmcpbiwgcCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXdfb2JqZWN0KFB5TGlzdF9HRVRfSVRFTSh2LCBpKSwgcCk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoUHlEaWN0X0NoZWNrRXhhY3QodikpIHsKLQkJUHlfc3NpemVfdCBwb3M7Ci0JCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKLQkJd19ieXRlKFRZUEVfRElDVCwgcCk7Ci0JCS8qIFRoaXMgb25lIGlzIE5VTEwgb2JqZWN0IHRlcm1pbmF0ZWQhICovCi0JCXBvcyA9IDA7Ci0JCXdoaWxlIChQeURpY3RfTmV4dCh2LCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCQl3X29iamVjdChrZXksIHApOwotCQkJd19vYmplY3QodmFsdWUsIHApOwotCQl9Ci0JCXdfb2JqZWN0KChQeU9iamVjdCAqKU5VTEwsIHApOwotCX0KLQllbHNlIGlmIChQeUFueVNldF9DaGVja0V4YWN0KHYpKSB7Ci0JCVB5T2JqZWN0ICp2YWx1ZSwgKml0OworICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICB3X2J5dGUoVFlQRV9UVVBMRSwgcCk7CisgICAgICAgIG4gPSBQeVR1cGxlX1NpemUodik7CisgICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgd19vYmplY3QoUHlUdXBsZV9HRVRfSVRFTSh2LCBpKSwgcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgd19ieXRlKFRZUEVfTElTVCwgcCk7CisgICAgICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUodik7CisgICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgd19vYmplY3QoUHlMaXN0X0dFVF9JVEVNKHYsIGkpLCBwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChQeURpY3RfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeV9zc2l6ZV90IHBvczsKKyAgICAgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgICAgICB3X2J5dGUoVFlQRV9ESUNULCBwKTsKKyAgICAgICAgLyogVGhpcyBvbmUgaXMgTlVMTCBvYmplY3QgdGVybWluYXRlZCEgKi8KKyAgICAgICAgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KHYsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIHdfb2JqZWN0KGtleSwgcCk7CisgICAgICAgICAgICB3X29iamVjdCh2YWx1ZSwgcCk7CisgICAgICAgIH0KKyAgICAgICAgd19vYmplY3QoKFB5T2JqZWN0ICopTlVMTCwgcCk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5QW55U2V0X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgUHlPYmplY3QgKnZhbHVlLCAqaXQ7CiAKLQkJaWYgKFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmUHlTZXRfVHlwZSkpCi0JCQl3X2J5dGUoVFlQRV9TRVQsIHApOwotCQllbHNlCi0JCQl3X2J5dGUoVFlQRV9GUk9aRU5TRVQsIHApOwotCQluID0gUHlPYmplY3RfU2l6ZSh2KTsKLQkJaWYgKG4gPT0gLTEpIHsKLQkJCXAtPmRlcHRoLS07Ci0JCQlwLT5lcnJvciA9IFdGRVJSX1VOTUFSU0hBTExBQkxFOwotCQkJcmV0dXJuOwotCQl9Ci0JCXdfbG9uZygobG9uZyluLCBwKTsKLQkJaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOwotCQlpZiAoaXQgPT0gTlVMTCkgewotCQkJcC0+ZGVwdGgtLTsKLQkJCXAtPmVycm9yID0gV0ZFUlJfVU5NQVJTSEFMTEFCTEU7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd2hpbGUgKCh2YWx1ZSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQkJd19vYmplY3QodmFsdWUsIHApOwotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJfQotCQlQeV9ERUNSRUYoaXQpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJcC0+ZGVwdGgtLTsKLQkJCXAtPmVycm9yID0gV0ZFUlJfVU5NQVJTSEFMTEFCTEU7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoUHlDb2RlX0NoZWNrKHYpKSB7Ci0JCVB5Q29kZU9iamVjdCAqY28gPSAoUHlDb2RlT2JqZWN0ICopdjsKLQkJd19ieXRlKFRZUEVfQ09ERSwgcCk7Ci0JCXdfbG9uZyhjby0+Y29fYXJnY291bnQsIHApOwotCQl3X2xvbmcoY28tPmNvX25sb2NhbHMsIHApOwotCQl3X2xvbmcoY28tPmNvX3N0YWNrc2l6ZSwgcCk7Ci0JCXdfbG9uZyhjby0+Y29fZmxhZ3MsIHApOwotCQl3X29iamVjdChjby0+Y29fY29kZSwgcCk7Ci0JCXdfb2JqZWN0KGNvLT5jb19jb25zdHMsIHApOwotCQl3X29iamVjdChjby0+Y29fbmFtZXMsIHApOwotCQl3X29iamVjdChjby0+Y29fdmFybmFtZXMsIHApOwotCQl3X29iamVjdChjby0+Y29fZnJlZXZhcnMsIHApOwotCQl3X29iamVjdChjby0+Y29fY2VsbHZhcnMsIHApOwotCQl3X29iamVjdChjby0+Y29fZmlsZW5hbWUsIHApOwotCQl3X29iamVjdChjby0+Y29fbmFtZSwgcCk7Ci0JCXdfbG9uZyhjby0+Y29fZmlyc3RsaW5lbm8sIHApOwotCQl3X29iamVjdChjby0+Y29fbG5vdGFiLCBwKTsKLQl9Ci0JZWxzZSBpZiAoUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyKHYpKSB7Ci0JCS8qIFdyaXRlIHVua25vd24gYnVmZmVyLXN0eWxlIG9iamVjdHMgYXMgYSBzdHJpbmcgKi8KLQkJY2hhciAqczsKLQkJUHlCdWZmZXJQcm9jcyAqcGIgPSB2LT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JCXdfYnl0ZShUWVBFX1NUUklORywgcCk7Ci0JCW4gPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKSh2LCAwLCAodm9pZCAqKikmcyk7Ci0JCWlmIChuID4gSU5UX01BWCkgewotCQkJcC0+ZGVwdGgtLTsKLQkJCXAtPmVycm9yID0gV0ZFUlJfVU5NQVJTSEFMTEFCTEU7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd19sb25nKChsb25nKW4sIHApOwotCQl3X3N0cmluZyhzLCAoaW50KW4sIHApOwotCX0KLQllbHNlIHsKLQkJd19ieXRlKFRZUEVfVU5LTk9XTiwgcCk7Ci0JCXAtPmVycm9yID0gV0ZFUlJfVU5NQVJTSEFMTEFCTEU7Ci0JfQorICAgICAgICBpZiAoUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQeVNldF9UeXBlKSkKKyAgICAgICAgICAgIHdfYnl0ZShUWVBFX1NFVCwgcCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdfYnl0ZShUWVBFX0ZST1pFTlNFVCwgcCk7CisgICAgICAgIG4gPSBQeU9iamVjdF9TaXplKHYpOworICAgICAgICBpZiAobiA9PSAtMSkgeworICAgICAgICAgICAgcC0+ZGVwdGgtLTsKKyAgICAgICAgICAgIHAtPmVycm9yID0gV0ZFUlJfVU5NQVJTSEFMTEFCTEU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd19sb25nKChsb25nKW4sIHApOworICAgICAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBwLT5kZXB0aC0tOworICAgICAgICAgICAgcC0+ZXJyb3IgPSBXRkVSUl9VTk1BUlNIQUxMQUJMRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKHZhbHVlID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICB3X29iamVjdCh2YWx1ZSwgcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBwLT5kZXB0aC0tOworICAgICAgICAgICAgcC0+ZXJyb3IgPSBXRkVSUl9VTk1BUlNIQUxMQUJMRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChQeUNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgUHlDb2RlT2JqZWN0ICpjbyA9IChQeUNvZGVPYmplY3QgKil2OworICAgICAgICB3X2J5dGUoVFlQRV9DT0RFLCBwKTsKKyAgICAgICAgd19sb25nKGNvLT5jb19hcmdjb3VudCwgcCk7CisgICAgICAgIHdfbG9uZyhjby0+Y29fbmxvY2FscywgcCk7CisgICAgICAgIHdfbG9uZyhjby0+Y29fc3RhY2tzaXplLCBwKTsKKyAgICAgICAgd19sb25nKGNvLT5jb19mbGFncywgcCk7CisgICAgICAgIHdfb2JqZWN0KGNvLT5jb19jb2RlLCBwKTsKKyAgICAgICAgd19vYmplY3QoY28tPmNvX2NvbnN0cywgcCk7CisgICAgICAgIHdfb2JqZWN0KGNvLT5jb19uYW1lcywgcCk7CisgICAgICAgIHdfb2JqZWN0KGNvLT5jb192YXJuYW1lcywgcCk7CisgICAgICAgIHdfb2JqZWN0KGNvLT5jb19mcmVldmFycywgcCk7CisgICAgICAgIHdfb2JqZWN0KGNvLT5jb19jZWxsdmFycywgcCk7CisgICAgICAgIHdfb2JqZWN0KGNvLT5jb19maWxlbmFtZSwgcCk7CisgICAgICAgIHdfb2JqZWN0KGNvLT5jb19uYW1lLCBwKTsKKyAgICAgICAgd19sb25nKGNvLT5jb19maXJzdGxpbmVubywgcCk7CisgICAgICAgIHdfb2JqZWN0KGNvLT5jb19sbm90YWIsIHApOworICAgIH0KKyAgICBlbHNlIGlmIChQeU9iamVjdF9DaGVja1JlYWRCdWZmZXIodikpIHsKKyAgICAgICAgLyogV3JpdGUgdW5rbm93biBidWZmZXItc3R5bGUgb2JqZWN0cyBhcyBhIHN0cmluZyAqLworICAgICAgICBjaGFyICpzOworICAgICAgICBQeUJ1ZmZlclByb2NzICpwYiA9IHYtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICAgICAgd19ieXRlKFRZUEVfU1RSSU5HLCBwKTsKKyAgICAgICAgbiA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKHYsIDAsICh2b2lkICoqKSZzKTsKKyAgICAgICAgaWYgKG4gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBwLT5kZXB0aC0tOworICAgICAgICAgICAgcC0+ZXJyb3IgPSBXRkVSUl9VTk1BUlNIQUxMQUJMRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3X2xvbmcoKGxvbmcpbiwgcCk7CisgICAgICAgIHdfc3RyaW5nKHMsIChpbnQpbiwgcCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB3X2J5dGUoVFlQRV9VTktOT1dOLCBwKTsKKyAgICAgICAgcC0+ZXJyb3IgPSBXRkVSUl9VTk1BUlNIQUxMQUJMRTsKKyAgICB9CiAgICBleGl0OgotCXAtPmRlcHRoLS07CisgICAgcC0+ZGVwdGgtLTsKIH0KIAogLyogdmVyc2lvbiBjdXJyZW50bHkgaGFzIG5vIGVmZmVjdCBmb3Igd3JpdGluZyBsb25ncy4gKi8KIHZvaWQKIFB5TWFyc2hhbF9Xcml0ZUxvbmdUb0ZpbGUobG9uZyB4LCBGSUxFICpmcCwgaW50IHZlcnNpb24pCiB7Ci0JV0ZJTEUgd2Y7Ci0Jd2YuZnAgPSBmcDsKLQl3Zi5lcnJvciA9IFdGRVJSX09LOwotCXdmLmRlcHRoID0gMDsKLQl3Zi5zdHJpbmdzID0gTlVMTDsKLQl3Zi52ZXJzaW9uID0gdmVyc2lvbjsKLQl3X2xvbmcoeCwgJndmKTsKKyAgICBXRklMRSB3ZjsKKyAgICB3Zi5mcCA9IGZwOworICAgIHdmLmVycm9yID0gV0ZFUlJfT0s7CisgICAgd2YuZGVwdGggPSAwOworICAgIHdmLnN0cmluZ3MgPSBOVUxMOworICAgIHdmLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIHdfbG9uZyh4LCAmd2YpOwogfQogCiB2b2lkCiBQeU1hcnNoYWxfV3JpdGVPYmplY3RUb0ZpbGUoUHlPYmplY3QgKngsIEZJTEUgKmZwLCBpbnQgdmVyc2lvbikKIHsKLQlXRklMRSB3ZjsKLQl3Zi5mcCA9IGZwOwotCXdmLmVycm9yID0gV0ZFUlJfT0s7Ci0Jd2YuZGVwdGggPSAwOwotCXdmLnN0cmluZ3MgPSAodmVyc2lvbiA+IDApID8gUHlEaWN0X05ldygpIDogTlVMTDsKLQl3Zi52ZXJzaW9uID0gdmVyc2lvbjsKLQl3X29iamVjdCh4LCAmd2YpOwotCVB5X1hERUNSRUYod2Yuc3RyaW5ncyk7CisgICAgV0ZJTEUgd2Y7CisgICAgd2YuZnAgPSBmcDsKKyAgICB3Zi5lcnJvciA9IFdGRVJSX09LOworICAgIHdmLmRlcHRoID0gMDsKKyAgICB3Zi5zdHJpbmdzID0gKHZlcnNpb24gPiAwKSA/IFB5RGljdF9OZXcoKSA6IE5VTEw7CisgICAgd2YudmVyc2lvbiA9IHZlcnNpb247CisgICAgd19vYmplY3QoeCwgJndmKTsKKyAgICBQeV9YREVDUkVGKHdmLnN0cmluZ3MpOwogfQogCiB0eXBlZGVmIFdGSUxFIFJGSUxFOyAvKiBTYW1lIHN0cnVjdCB3aXRoIGRpZmZlcmVudCBpbnZhcmlhbnRzICovCkBAIC00ODMsNDkgKzQ4Myw0OSBAQAogc3RhdGljIGludAogcl9zdHJpbmcoY2hhciAqcywgaW50IG4sIFJGSUxFICpwKQogewotCWlmIChwLT5mcCAhPSBOVUxMKQotCQkvKiBUaGUgcmVzdWx0IGZpdHMgaW50byBpbnQgYmVjYXVzZSBpdCBtdXN0IGJlIDw9bi4gKi8KLQkJcmV0dXJuIChpbnQpZnJlYWQocywgMSwgbiwgcC0+ZnApOwotCWlmIChwLT5lbmQgLSBwLT5wdHIgPCBuKQotCQluID0gKGludCkocC0+ZW5kIC0gcC0+cHRyKTsKLQltZW1jcHkocywgcC0+cHRyLCBuKTsKLQlwLT5wdHIgKz0gbjsKLQlyZXR1cm4gbjsKKyAgICBpZiAocC0+ZnAgIT0gTlVMTCkKKyAgICAgICAgLyogVGhlIHJlc3VsdCBmaXRzIGludG8gaW50IGJlY2F1c2UgaXQgbXVzdCBiZSA8PW4uICovCisgICAgICAgIHJldHVybiAoaW50KWZyZWFkKHMsIDEsIG4sIHAtPmZwKTsKKyAgICBpZiAocC0+ZW5kIC0gcC0+cHRyIDwgbikKKyAgICAgICAgbiA9IChpbnQpKHAtPmVuZCAtIHAtPnB0cik7CisgICAgbWVtY3B5KHMsIHAtPnB0ciwgbik7CisgICAgcC0+cHRyICs9IG47CisgICAgcmV0dXJuIG47CiB9CiAKIHN0YXRpYyBpbnQKIHJfc2hvcnQoUkZJTEUgKnApCiB7Ci0JcmVnaXN0ZXIgc2hvcnQgeDsKLQl4ID0gcl9ieXRlKHApOwotCXggfD0gcl9ieXRlKHApIDw8IDg7Ci0JLyogU2lnbi1leHRlbnNpb24sIGluIGNhc2Ugc2hvcnQgZ3JlYXRlciB0aGFuIDE2IGJpdHMgKi8KLQl4IHw9IC0oeCAmIDB4ODAwMCk7Ci0JcmV0dXJuIHg7CisgICAgcmVnaXN0ZXIgc2hvcnQgeDsKKyAgICB4ID0gcl9ieXRlKHApOworICAgIHggfD0gcl9ieXRlKHApIDw8IDg7CisgICAgLyogU2lnbi1leHRlbnNpb24sIGluIGNhc2Ugc2hvcnQgZ3JlYXRlciB0aGFuIDE2IGJpdHMgKi8KKyAgICB4IHw9IC0oeCAmIDB4ODAwMCk7CisgICAgcmV0dXJuIHg7CiB9CiAKIHN0YXRpYyBsb25nCiByX2xvbmcoUkZJTEUgKnApCiB7Ci0JcmVnaXN0ZXIgbG9uZyB4OwotCXJlZ2lzdGVyIEZJTEUgKmZwID0gcC0+ZnA7Ci0JaWYgKGZwKSB7Ci0JCXggPSBnZXRjKGZwKTsKLQkJeCB8PSAobG9uZylnZXRjKGZwKSA8PCA4OwotCQl4IHw9IChsb25nKWdldGMoZnApIDw8IDE2OwotCQl4IHw9IChsb25nKWdldGMoZnApIDw8IDI0OwotCX0KLQllbHNlIHsKLQkJeCA9IHJzX2J5dGUocCk7Ci0JCXggfD0gKGxvbmcpcnNfYnl0ZShwKSA8PCA4OwotCQl4IHw9IChsb25nKXJzX2J5dGUocCkgPDwgMTY7Ci0JCXggfD0gKGxvbmcpcnNfYnl0ZShwKSA8PCAyNDsKLQl9CisgICAgcmVnaXN0ZXIgbG9uZyB4OworICAgIHJlZ2lzdGVyIEZJTEUgKmZwID0gcC0+ZnA7CisgICAgaWYgKGZwKSB7CisgICAgICAgIHggPSBnZXRjKGZwKTsKKyAgICAgICAgeCB8PSAobG9uZylnZXRjKGZwKSA8PCA4OworICAgICAgICB4IHw9IChsb25nKWdldGMoZnApIDw8IDE2OworICAgICAgICB4IHw9IChsb25nKWdldGMoZnApIDw8IDI0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgeCA9IHJzX2J5dGUocCk7CisgICAgICAgIHggfD0gKGxvbmcpcnNfYnl0ZShwKSA8PCA4OworICAgICAgICB4IHw9IChsb25nKXJzX2J5dGUocCkgPDwgMTY7CisgICAgICAgIHggfD0gKGxvbmcpcnNfYnl0ZShwKSA8PCAyNDsKKyAgICB9CiAjaWYgU0laRU9GX0xPTkcgPiA0Ci0JLyogU2lnbiBleHRlbnNpb24gZm9yIDY0LWJpdCBtYWNoaW5lcyAqLwotCXggfD0gLSh4ICYgMHg4MDAwMDAwMEwpOworICAgIC8qIFNpZ24gZXh0ZW5zaW9uIGZvciA2NC1iaXQgbWFjaGluZXMgKi8KKyAgICB4IHw9IC0oeCAmIDB4ODAwMDAwMDBMKTsKICNlbmRpZgotCXJldHVybiB4OworICAgIHJldHVybiB4OwogfQogCiAvKiByX2xvbmc2NCBkZWFscyB3aXRoIHRoZSBUWVBFX0lOVDY0IGNvZGUuICBPbiBhIG1hY2hpbmUgd2l0aApAQCAtNTM4LDU3MCArNTM4LDU3MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJfbG9uZzY0KFJGSUxFICpwKQogewotCWxvbmcgbG80ID0gcl9sb25nKHApOwotCWxvbmcgaGk0ID0gcl9sb25nKHApOworICAgIGxvbmcgbG80ID0gcl9sb25nKHApOworICAgIGxvbmcgaGk0ID0gcl9sb25nKHApOwogI2lmIFNJWkVPRl9MT05HID4gNAotCWxvbmcgeCA9IChoaTQgPDwgMzIpIHwgKGxvNCAmIDB4RkZGRkZGRkZMKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgbG9uZyB4ID0gKGhpNCA8PCAzMikgfCAobG80ICYgMHhGRkZGRkZGRkwpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKICNlbHNlCi0JdW5zaWduZWQgY2hhciBidWZbOF07Ci0JaW50IG9uZSA9IDE7Ci0JaW50IGlzX2xpdHRsZV9lbmRpYW4gPSAoaW50KSooY2hhciopJm9uZTsKLQlpZiAoaXNfbGl0dGxlX2VuZGlhbikgewotCQltZW1jcHkoYnVmLCAmbG80LCA0KTsKLQkJbWVtY3B5KGJ1Zis0LCAmaGk0LCA0KTsKLQl9Ci0JZWxzZSB7Ci0JCW1lbWNweShidWYsICZoaTQsIDQpOwotCQltZW1jcHkoYnVmKzQsICZsbzQsIDQpOwotCX0KLQlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KGJ1ZiwgOCwgaXNfbGl0dGxlX2VuZGlhbiwgMSk7CisgICAgdW5zaWduZWQgY2hhciBidWZbOF07CisgICAgaW50IG9uZSA9IDE7CisgICAgaW50IGlzX2xpdHRsZV9lbmRpYW4gPSAoaW50KSooY2hhciopJm9uZTsKKyAgICBpZiAoaXNfbGl0dGxlX2VuZGlhbikgeworICAgICAgICBtZW1jcHkoYnVmLCAmbG80LCA0KTsKKyAgICAgICAgbWVtY3B5KGJ1Zis0LCAmaGk0LCA0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG1lbWNweShidWYsICZoaTQsIDQpOworICAgICAgICBtZW1jcHkoYnVmKzQsICZsbzQsIDQpOworICAgIH0KKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KGJ1ZiwgOCwgaXNfbGl0dGxlX2VuZGlhbiwgMSk7CiAjZW5kaWYKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJfUHlMb25nKFJGSUxFICpwKQogewotCVB5TG9uZ09iamVjdCAqb2I7Ci0JaW50IHNpemUsIGksIGosIG1kLCBzaG9ydHNfaW5fdG9wX2RpZ2l0OwotCWxvbmcgbjsKLQlkaWdpdCBkOworICAgIFB5TG9uZ09iamVjdCAqb2I7CisgICAgaW50IHNpemUsIGksIGosIG1kLCBzaG9ydHNfaW5fdG9wX2RpZ2l0OworICAgIGxvbmcgbjsKKyAgICBkaWdpdCBkOwogCi0JbiA9IHJfbG9uZyhwKTsKLQlpZiAobiA9PSAwKQotCQlyZXR1cm4gKFB5T2JqZWN0ICopX1B5TG9uZ19OZXcoMCk7Ci0JaWYgKG4gPCAtSU5UX01BWCB8fCBuID4gSU5UX01BWCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgICAiYmFkIG1hcnNoYWwgZGF0YSAobG9uZyBzaXplIG91dCBvZiByYW5nZSkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG4gPSByX2xvbmcocCk7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKV9QeUxvbmdfTmV3KDApOworICAgIGlmIChuIDwgLUlOVF9NQVggfHwgbiA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJiYWQgbWFyc2hhbCBkYXRhIChsb25nIHNpemUgb3V0IG9mIHJhbmdlKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzaXplID0gMSArIChBQlMobikgLSAxKSAvIFB5TG9uZ19NQVJTSEFMX1JBVElPOwotCXNob3J0c19pbl90b3BfZGlnaXQgPSAxICsgKEFCUyhuKSAtIDEpICUgUHlMb25nX01BUlNIQUxfUkFUSU87Ci0Jb2IgPSBfUHlMb25nX05ldyhzaXplKTsKLQlpZiAob2IgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfU0laRShvYikgPSBuID4gMCA/IHNpemUgOiAtc2l6ZTsKKyAgICBzaXplID0gMSArIChBQlMobikgLSAxKSAvIFB5TG9uZ19NQVJTSEFMX1JBVElPOworICAgIHNob3J0c19pbl90b3BfZGlnaXQgPSAxICsgKEFCUyhuKSAtIDEpICUgUHlMb25nX01BUlNIQUxfUkFUSU87CisgICAgb2IgPSBfUHlMb25nX05ldyhzaXplKTsKKyAgICBpZiAob2IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfU0laRShvYikgPSBuID4gMCA/IHNpemUgOiAtc2l6ZTsKIAotCWZvciAoaSA9IDA7IGkgPCBzaXplLTE7IGkrKykgewotCQlkID0gMDsKLQkJZm9yIChqPTA7IGogPCBQeUxvbmdfTUFSU0hBTF9SQVRJTzsgaisrKSB7Ci0JCQltZCA9IHJfc2hvcnQocCk7Ci0JCQlpZiAobWQgPCAwIHx8IG1kID4gUHlMb25nX01BUlNIQUxfQkFTRSkKLQkJCQlnb3RvIGJhZF9kaWdpdDsKLQkJCWQgKz0gKGRpZ2l0KW1kIDw8IGoqUHlMb25nX01BUlNIQUxfU0hJRlQ7Ci0JCX0KLQkJb2ItPm9iX2RpZ2l0W2ldID0gZDsKLQl9Ci0JZCA9IDA7Ci0JZm9yIChqPTA7IGogPCBzaG9ydHNfaW5fdG9wX2RpZ2l0OyBqKyspIHsKLQkJbWQgPSByX3Nob3J0KHApOwotCQlpZiAobWQgPCAwIHx8IG1kID4gUHlMb25nX01BUlNIQUxfQkFTRSkKLQkJCWdvdG8gYmFkX2RpZ2l0OwotCQkvKiB0b3Btb3N0IG1hcnNoYWwgZGlnaXQgc2hvdWxkIGJlIG5vbnplcm8gKi8KLQkJaWYgKG1kID09IDAgJiYgaiA9PSBzaG9ydHNfaW5fdG9wX2RpZ2l0IC0gMSkgewotCQkJUHlfREVDUkVGKG9iKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJiYWQgbWFyc2hhbCBkYXRhICh1bm5vcm1hbGl6ZWQgbG9uZyBkYXRhKSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZCArPSAoZGlnaXQpbWQgPDwgaipQeUxvbmdfTUFSU0hBTF9TSElGVDsKLQl9Ci0JLyogdG9wIGRpZ2l0IHNob3VsZCBiZSBub256ZXJvLCBlbHNlIHRoZSByZXN1bHRpbmcgUHlMb25nIHdvbid0IGJlCi0JICAgbm9ybWFsaXplZCAqLwotCW9iLT5vYl9kaWdpdFtzaXplLTFdID0gZDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopb2I7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemUtMTsgaSsrKSB7CisgICAgICAgIGQgPSAwOworICAgICAgICBmb3IgKGo9MDsgaiA8IFB5TG9uZ19NQVJTSEFMX1JBVElPOyBqKyspIHsKKyAgICAgICAgICAgIG1kID0gcl9zaG9ydChwKTsKKyAgICAgICAgICAgIGlmIChtZCA8IDAgfHwgbWQgPiBQeUxvbmdfTUFSU0hBTF9CQVNFKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkX2RpZ2l0OworICAgICAgICAgICAgZCArPSAoZGlnaXQpbWQgPDwgaipQeUxvbmdfTUFSU0hBTF9TSElGVDsKKyAgICAgICAgfQorICAgICAgICBvYi0+b2JfZGlnaXRbaV0gPSBkOworICAgIH0KKyAgICBkID0gMDsKKyAgICBmb3IgKGo9MDsgaiA8IHNob3J0c19pbl90b3BfZGlnaXQ7IGorKykgeworICAgICAgICBtZCA9IHJfc2hvcnQocCk7CisgICAgICAgIGlmIChtZCA8IDAgfHwgbWQgPiBQeUxvbmdfTUFSU0hBTF9CQVNFKQorICAgICAgICAgICAgZ290byBiYWRfZGlnaXQ7CisgICAgICAgIC8qIHRvcG1vc3QgbWFyc2hhbCBkaWdpdCBzaG91bGQgYmUgbm9uemVybyAqLworICAgICAgICBpZiAobWQgPT0gMCAmJiBqID09IHNob3J0c19pbl90b3BfZGlnaXQgLSAxKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYob2IpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImJhZCBtYXJzaGFsIGRhdGEgKHVubm9ybWFsaXplZCBsb25nIGRhdGEpIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBkICs9IChkaWdpdCltZCA8PCBqKlB5TG9uZ19NQVJTSEFMX1NISUZUOworICAgIH0KKyAgICAvKiB0b3AgZGlnaXQgc2hvdWxkIGJlIG5vbnplcm8sIGVsc2UgdGhlIHJlc3VsdGluZyBQeUxvbmcgd29uJ3QgYmUKKyAgICAgICBub3JtYWxpemVkICovCisgICAgb2ItPm9iX2RpZ2l0W3NpemUtMV0gPSBkOworICAgIHJldHVybiAoUHlPYmplY3QgKilvYjsKICAgYmFkX2RpZ2l0OgotCVB5X0RFQ1JFRihvYik7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkiYmFkIG1hcnNoYWwgZGF0YSAoZGlnaXQgb3V0IG9mIHJhbmdlIGluIGxvbmcpIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKG9iKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImJhZCBtYXJzaGFsIGRhdGEgKGRpZ2l0IG91dCBvZiByYW5nZSBpbiBsb25nKSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiByX29iamVjdChSRklMRSAqcCkKIHsKLQkvKiBOVUxMIGlzIGEgdmFsaWQgcmV0dXJuIHZhbHVlLCBpdCBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFucyB0aGF0Ci0JICAgYW4gZXhjZXB0aW9uIGlzIHNldC4gKi8KLQlQeU9iamVjdCAqdiwgKnYyOwotCWxvbmcgaSwgbjsKLQlpbnQgdHlwZSA9IHJfYnl0ZShwKTsKLQlQeU9iamVjdCAqcmV0dmFsOworICAgIC8qIE5VTEwgaXMgYSB2YWxpZCByZXR1cm4gdmFsdWUsIGl0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW5zIHRoYXQKKyAgICAgICBhbiBleGNlcHRpb24gaXMgc2V0LiAqLworICAgIFB5T2JqZWN0ICp2LCAqdjI7CisgICAgbG9uZyBpLCBuOworICAgIGludCB0eXBlID0gcl9ieXRlKHApOworICAgIFB5T2JqZWN0ICpyZXR2YWw7CiAKLQlwLT5kZXB0aCsrOworICAgIHAtPmRlcHRoKys7CiAKLQlpZiAocC0+ZGVwdGggPiBNQVhfTUFSU0hBTF9TVEFDS19ERVBUSCkgewotCQlwLT5kZXB0aC0tOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInJlY3Vyc2lvbiBsaW1pdCBleGNlZWRlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHAtPmRlcHRoID4gTUFYX01BUlNIQUxfU1RBQ0tfREVQVEgpIHsKKyAgICAgICAgcC0+ZGVwdGgtLTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJyZWN1cnNpb24gbGltaXQgZXhjZWVkZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3dpdGNoICh0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CiAKLQljYXNlIEVPRjoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCSJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJcmV0dmFsID0gTlVMTDsKLQkJYnJlYWs7CisgICAgY2FzZSBFT0Y6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfTlVMTDoKLQkJcmV0dmFsID0gTlVMTDsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX05VTEw6CisgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX05PTkU6Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dmFsID0gUHlfTm9uZTsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX05PTkU6CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfU1RPUElURVI6Ci0JCVB5X0lOQ1JFRihQeUV4Y19TdG9wSXRlcmF0aW9uKTsKLQkJcmV0dmFsID0gUHlFeGNfU3RvcEl0ZXJhdGlvbjsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX1NUT1BJVEVSOgorICAgICAgICBQeV9JTkNSRUYoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgICAgIHJldHZhbCA9IFB5RXhjX1N0b3BJdGVyYXRpb247CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX0VMTElQU0lTOgotCQlQeV9JTkNSRUYoUHlfRWxsaXBzaXMpOwotCQlyZXR2YWwgPSBQeV9FbGxpcHNpczsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX0VMTElQU0lTOgorICAgICAgICBQeV9JTkNSRUYoUHlfRWxsaXBzaXMpOworICAgICAgICByZXR2YWwgPSBQeV9FbGxpcHNpczsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfRkFMU0U6Ci0JCVB5X0lOQ1JFRihQeV9GYWxzZSk7Ci0JCXJldHZhbCA9IFB5X0ZhbHNlOwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfRkFMU0U6CisgICAgICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgICAgIHJldHZhbCA9IFB5X0ZhbHNlOworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9UUlVFOgotCQlQeV9JTkNSRUYoUHlfVHJ1ZSk7Ci0JCXJldHZhbCA9IFB5X1RydWU7Ci0JCWJyZWFrOworICAgIGNhc2UgVFlQRV9UUlVFOgorICAgICAgICBQeV9JTkNSRUYoUHlfVHJ1ZSk7CisgICAgICAgIHJldHZhbCA9IFB5X1RydWU7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX0lOVDoKLQkJcmV0dmFsID0gUHlJbnRfRnJvbUxvbmcocl9sb25nKHApKTsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX0lOVDoKKyAgICAgICAgcmV0dmFsID0gUHlJbnRfRnJvbUxvbmcocl9sb25nKHApKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfSU5UNjQ6Ci0JCXJldHZhbCA9IHJfbG9uZzY0KHApOwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfSU5UNjQ6CisgICAgICAgIHJldHZhbCA9IHJfbG9uZzY0KHApOworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9MT05HOgotCQlyZXR2YWwgPSByX1B5TG9uZyhwKTsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX0xPTkc6CisgICAgICAgIHJldHZhbCA9IHJfUHlMb25nKHApOworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9GTE9BVDoKLQkJewotCQkJY2hhciBidWZbMjU2XTsKLQkJCWRvdWJsZSBkeDsKLQkJCW4gPSByX2J5dGUocCk7Ci0JCQlpZiAobiA9PSBFT0YgfHwgcl9zdHJpbmcoYnVmLCAoaW50KW4sIHApICE9IG4pIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCi0JCQkJCSJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnVmW25dID0gJ1wwJzsKLQkJCWR4ID0gUHlPU19zdHJpbmdfdG9fZG91YmxlKGJ1ZiwgTlVMTCwgTlVMTCk7Ci0JCQlpZiAoZHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHZhbCA9IFB5RmxvYXRfRnJvbURvdWJsZShkeCk7Ci0JCQlicmVhazsKLQkJfQorICAgIGNhc2UgVFlQRV9GTE9BVDoKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKKyAgICAgICAgICAgIGRvdWJsZSBkeDsKKyAgICAgICAgICAgIG4gPSByX2J5dGUocCk7CisgICAgICAgICAgICBpZiAobiA9PSBFT0YgfHwgcl9zdHJpbmcoYnVmLCAoaW50KW4sIHApICE9IG4pIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmW25dID0gJ1wwJzsKKyAgICAgICAgICAgIGR4ID0gUHlPU19zdHJpbmdfdG9fZG91YmxlKGJ1ZiwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoZHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHZhbCA9IFB5RmxvYXRfRnJvbURvdWJsZShkeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JY2FzZSBUWVBFX0JJTkFSWV9GTE9BVDoKLQkJewotCQkJdW5zaWduZWQgY2hhciBidWZbOF07Ci0JCQlkb3VibGUgeDsKLQkJCWlmIChyX3N0cmluZygoY2hhciopYnVmLCA4LCBwKSAhPSA4KSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXggPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7Ci0JCQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dmFsID0gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICBjYXNlIFRZUEVfQklOQVJZX0ZMT0FUOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKyAgICAgICAgICAgIGRvdWJsZSB4OworICAgICAgICAgICAgaWYgKHJfc3RyaW5nKChjaGFyKilidWYsIDgsIHApICE9IDgpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeCA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKKyAgICAgICAgICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR2YWwgPSBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCWNhc2UgVFlQRV9DT01QTEVYOgotCQl7Ci0JCQljaGFyIGJ1ZlsyNTZdOwotCQkJUHlfY29tcGxleCBjOwotCQkJbiA9IHJfYnl0ZShwKTsKLQkJCWlmIChuID09IEVPRiB8fCByX3N0cmluZyhidWYsIChpbnQpbiwgcCkgIT0gbikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkJIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOwotCQkJCXJldHZhbCA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlidWZbbl0gPSAnXDAnOwotCQkJYy5yZWFsID0gUHlPU19zdHJpbmdfdG9fZG91YmxlKGJ1ZiwgTlVMTCwgTlVMTCk7Ci0JCQlpZiAoYy5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCXJldHZhbCA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQluID0gcl9ieXRlKHApOwotCQkJaWYgKG4gPT0gRU9GIHx8IHJfc3RyaW5nKGJ1ZiwgKGludCluLCBwKSAhPSBuKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJ1ZltuXSA9ICdcMCc7Ci0JCQljLmltYWcgPSBQeU9TX3N0cmluZ190b19kb3VibGUoYnVmLCBOVUxMLCBOVUxMKTsKLQkJCWlmIChjLmltYWcgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHZhbCA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7Ci0JCQlicmVhazsKLQkJfQorICAgIGNhc2UgVFlQRV9DT01QTEVYOgorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOworICAgICAgICAgICAgUHlfY29tcGxleCBjOworICAgICAgICAgICAgbiA9IHJfYnl0ZShwKTsKKyAgICAgICAgICAgIGlmIChuID09IEVPRiB8fCByX3N0cmluZyhidWYsIChpbnQpbiwgcCkgIT0gbikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZbbl0gPSAnXDAnOworICAgICAgICAgICAgYy5yZWFsID0gUHlPU19zdHJpbmdfdG9fZG91YmxlKGJ1ZiwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoYy5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gcl9ieXRlKHApOworICAgICAgICAgICAgaWYgKG4gPT0gRU9GIHx8IHJfc3RyaW5nKGJ1ZiwgKGludCluLCBwKSAhPSBuKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAorICAgICAgICAgICAgICAgICAgICAiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZltuXSA9ICdcMCc7CisgICAgICAgICAgICBjLmltYWcgPSBQeU9TX3N0cmluZ190b19kb3VibGUoYnVmLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChjLmltYWcgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHZhbCA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JY2FzZSBUWVBFX0JJTkFSWV9DT01QTEVYOgotCQl7Ci0JCQl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKLQkJCVB5X2NvbXBsZXggYzsKLQkJCWlmIChyX3N0cmluZygoY2hhciopYnVmLCA4LCBwKSAhPSA4KSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWMucmVhbCA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKLQkJCWlmIChjLnJlYWwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChyX3N0cmluZygoY2hhciopYnVmLCA4LCBwKSAhPSA4KSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWMuaW1hZyA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKLQkJCWlmIChjLmltYWcgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHZhbCA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7Ci0JCQlicmVhazsKLQkJfQorICAgIGNhc2UgVFlQRV9CSU5BUllfQ09NUExFWDoKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBidWZbOF07CisgICAgICAgICAgICBQeV9jb21wbGV4IGM7CisgICAgICAgICAgICBpZiAocl9zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCkgIT0gOCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLnJlYWwgPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CisgICAgICAgICAgICBpZiAoYy5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocl9zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCkgIT0gOCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLmltYWcgPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CisgICAgICAgICAgICBpZiAoYy5pbWFnID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR2YWwgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICNlbmRpZgogCi0JY2FzZSBUWVBFX0lOVEVSTkVEOgotCWNhc2UgVFlQRV9TVFJJTkc6Ci0JCW4gPSByX2xvbmcocCk7Ci0JCWlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIChzdHJpbmcgc2l6ZSBvdXQgb2YgcmFuZ2UpIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbik7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAocl9zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCAoaW50KW4sIHApICE9IG4pIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkJIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0eXBlID09IFRZUEVfSU5URVJORUQpIHsKLQkJCVB5U3RyaW5nX0ludGVybkluUGxhY2UoJnYpOwotCQkJaWYgKFB5TGlzdF9BcHBlbmQocC0+c3RyaW5ncywgdikgPCAwKSB7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfSU5URVJORUQ6CisgICAgY2FzZSBUWVBFX1NUUklORzoKKyAgICAgICAgbiA9IHJfbG9uZyhwKTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEgKHN0cmluZyBzaXplIG91dCBvZiByYW5nZSkiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyX3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodiksIChpbnQpbiwgcCkgIT0gbikgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSA9PSBUWVBFX0lOVEVSTkVEKSB7CisgICAgICAgICAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZ2KTsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHAtPnN0cmluZ3MsIHYpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfU1RSSU5HUkVGOgotCQluID0gcl9sb25nKHApOwotCQlpZiAobiA8IDAgfHwgbiA+PSBQeUxpc3RfR0VUX1NJWkUocC0+c3RyaW5ncykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSAoc3RyaW5nIHJlZiBvdXQgb2YgcmFuZ2UpIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJdiA9IFB5TGlzdF9HRVRfSVRFTShwLT5zdHJpbmdzLCBuKTsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfU1RSSU5HUkVGOgorICAgICAgICBuID0gcl9sb25nKHApOworICAgICAgICBpZiAobiA8IDAgfHwgbiA+PSBQeUxpc3RfR0VUX1NJWkUocC0+c3RyaW5ncykpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSAoc3RyaW5nIHJlZiBvdXQgb2YgcmFuZ2UpIik7CisgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdiA9IFB5TGlzdF9HRVRfSVRFTShwLT5zdHJpbmdzLCBuKTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR2YWwgPSB2OworICAgICAgICBicmVhazsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQljYXNlIFRZUEVfVU5JQ09ERToKLQkgICAgewotCQljaGFyICpidWZmZXI7CisgICAgY2FzZSBUWVBFX1VOSUNPREU6CisgICAgICAgIHsKKyAgICAgICAgY2hhciAqYnVmZmVyOwogCi0JCW4gPSByX2xvbmcocCk7Ci0JCWlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhICh1bmljb2RlIHNpemUgb3V0IG9mIHJhbmdlKSIpOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBuKTsKLQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQlyZXR2YWwgPSBQeUVycl9Ob01lbW9yeSgpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJfc3RyaW5nKGJ1ZmZlciwgKGludCluLCBwKSAhPSBuKSB7Ci0JCQlQeU1lbV9ERUwoYnVmZmVyKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJdiA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KGJ1ZmZlciwgbiwgTlVMTCk7Ci0JCVB5TWVtX0RFTChidWZmZXIpOwotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKLQkgICAgfQorICAgICAgICBuID0gcl9sb25nKHApOworICAgICAgICBpZiAobiA8IDAgfHwgbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSAodW5pY29kZSBzaXplIG91dCBvZiByYW5nZSkiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgbik7CisgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dmFsID0gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyX3N0cmluZyhidWZmZXIsIChpbnQpbiwgcCkgIT0gbikgeworICAgICAgICAgICAgUHlNZW1fREVMKGJ1ZmZlcik7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHYgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChidWZmZXIsIG4sIE5VTEwpOworICAgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKKyAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICNlbmRpZgogCi0JY2FzZSBUWVBFX1RVUExFOgotCQluID0gcl9sb25nKHApOwotCQlpZiAobiA8IDAgfHwgbiA+IElOVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSAodHVwbGUgc2l6ZSBvdXQgb2YgcmFuZ2UpIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJdiA9IFB5VHVwbGVfTmV3KChpbnQpbik7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl2MiA9IHJfb2JqZWN0KHApOwotCQkJaWYgKCB2MiA9PSBOVUxMICkgewotCQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEgZm9yIHR1cGxlIik7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCXYgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUHlUdXBsZV9TRVRfSVRFTSh2LCAoaW50KWksIHYyKTsKLQkJfQotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfVFVQTEU6CisgICAgICAgIG4gPSByX2xvbmcocCk7CisgICAgICAgIGlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhICh0dXBsZSBzaXplIG91dCBvZiByYW5nZSkiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2ID0gUHlUdXBsZV9OZXcoKGludCluKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHYyID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAoIHYyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgb2JqZWN0IGluIG1hcnNoYWwgZGF0YSBmb3IgdHVwbGUiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIChpbnQpaSwgdjIpOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IHY7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX0xJU1Q6Ci0JCW4gPSByX2xvbmcocCk7Ci0JCWlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIChsaXN0IHNpemUgb3V0IG9mIHJhbmdlKSIpOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXYgPSBQeUxpc3RfTmV3KChpbnQpbik7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl2MiA9IHJfb2JqZWN0KHApOwotCQkJaWYgKCB2MiA9PSBOVUxMICkgewotCQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEgZm9yIGxpc3QiKTsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJdiA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlQeUxpc3RfU0VUX0lURU0odiwgKGludClpLCB2Mik7Ci0JCX0KLQkJcmV0dmFsID0gdjsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX0xJU1Q6CisgICAgICAgIG4gPSByX2xvbmcocCk7CisgICAgICAgIGlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIChsaXN0IHNpemUgb3V0IG9mIHJhbmdlKSIpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHYgPSBQeUxpc3RfTmV3KChpbnQpbik7CisgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB2MiA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKCB2MiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEgZm9yIGxpc3QiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0odiwgKGludClpLCB2Mik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfRElDVDoKLQkJdiA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKHYgPT0gTlVMTCkgewotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWZvciAoOzspIHsKLQkJCVB5T2JqZWN0ICprZXksICp2YWw7Ci0JCQlrZXkgPSByX29iamVjdChwKTsKLQkJCWlmIChrZXkgPT0gTlVMTCkKLQkJCQlicmVhazsKLQkJCXZhbCA9IHJfb2JqZWN0KHApOwotCQkJaWYgKHZhbCAhPSBOVUxMKQotCQkJCVB5RGljdF9TZXRJdGVtKHYsIGtleSwgdmFsKTsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJUHlfWERFQ1JFRih2YWwpOwotCQl9Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQl2ID0gTlVMTDsKLQkJfQotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfRElDVDoKKyAgICAgICAgdiA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICprZXksICp2YWw7CisgICAgICAgICAgICBrZXkgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHZhbCA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKHZhbCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtKHYsIGtleSwgdmFsKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgUHlfWERFQ1JFRih2YWwpOworICAgICAgICB9CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR2YWwgPSB2OworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9TRVQ6Ci0JY2FzZSBUWVBFX0ZST1pFTlNFVDoKLQkJbiA9IHJfbG9uZyhwKTsKLQkJaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEgKHNldCBzaXplIG91dCBvZiByYW5nZSkiKTsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotICAgICAgICAgICAgICAgIHYgPSAodHlwZSA9PSBUWVBFX1NFVCkgPyBQeVNldF9OZXcoTlVMTCkgOiBQeUZyb3plblNldF9OZXcoTlVMTCk7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl2MiA9IHJfb2JqZWN0KHApOwotCQkJaWYgKCB2MiA9PSBOVUxMICkgewotCQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEgZm9yIHNldCIpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQl2ID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChQeVNldF9BZGQodiwgdjIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYyKTsKLQkJfQotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfU0VUOgorICAgIGNhc2UgVFlQRV9GUk9aRU5TRVQ6CisgICAgICAgIG4gPSByX2xvbmcocCk7CisgICAgICAgIGlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIChzZXQgc2l6ZSBvdXQgb2YgcmFuZ2UpIik7CisgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdiA9ICh0eXBlID09IFRZUEVfU0VUKSA/IFB5U2V0X05ldyhOVUxMKSA6IFB5RnJvemVuU2V0X05ldyhOVUxMKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHYyID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAoIHYyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgb2JqZWN0IGluIG1hcnNoYWwgZGF0YSBmb3Igc2V0Iik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5U2V0X0FkZCh2LCB2MikgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYyKTsKKyAgICAgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2Mik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfQ09ERToKLQkJaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImNhbm5vdCB1bm1hcnNoYWwgY29kZSBvYmplY3RzIGluICIKLQkJCQkicmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZSIpOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgewotCQkJaW50IGFyZ2NvdW50OwotCQkJaW50IG5sb2NhbHM7Ci0JCQlpbnQgc3RhY2tzaXplOwotCQkJaW50IGZsYWdzOwotCQkJUHlPYmplY3QgKmNvZGUgPSBOVUxMOwotCQkJUHlPYmplY3QgKmNvbnN0cyA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqbmFtZXMgPSBOVUxMOwotCQkJUHlPYmplY3QgKnZhcm5hbWVzID0gTlVMTDsKLQkJCVB5T2JqZWN0ICpmcmVldmFycyA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqY2VsbHZhcnMgPSBOVUxMOwotCQkJUHlPYmplY3QgKmZpbGVuYW1lID0gTlVMTDsKLQkJCVB5T2JqZWN0ICpuYW1lID0gTlVMTDsKLQkJCWludCBmaXJzdGxpbmVubzsKLQkJCVB5T2JqZWN0ICpsbm90YWIgPSBOVUxMOwotCQkJCi0JCQl2ID0gTlVMTDsKKyAgICBjYXNlIFRZUEVfQ09ERToKKyAgICAgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgImNhbm5vdCB1bm1hcnNoYWwgY29kZSBvYmplY3RzIGluICIKKyAgICAgICAgICAgICAgICAicmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZSIpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IGFyZ2NvdW50OworICAgICAgICAgICAgaW50IG5sb2NhbHM7CisgICAgICAgICAgICBpbnQgc3RhY2tzaXplOworICAgICAgICAgICAgaW50IGZsYWdzOworICAgICAgICAgICAgUHlPYmplY3QgKmNvZGUgPSBOVUxMOworICAgICAgICAgICAgUHlPYmplY3QgKmNvbnN0cyA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqbmFtZXMgPSBOVUxMOworICAgICAgICAgICAgUHlPYmplY3QgKnZhcm5hbWVzID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmcmVldmFycyA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqY2VsbHZhcnMgPSBOVUxMOworICAgICAgICAgICAgUHlPYmplY3QgKmZpbGVuYW1lID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gTlVMTDsKKyAgICAgICAgICAgIGludCBmaXJzdGxpbmVubzsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpsbm90YWIgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFggaWdub3JlIGxvbmctPmludCBvdmVyZmxvd3MgZm9yIG5vdyAqLwotCQkJYXJnY291bnQgPSAoaW50KXJfbG9uZyhwKTsKLQkJCW5sb2NhbHMgPSAoaW50KXJfbG9uZyhwKTsKLQkJCXN0YWNrc2l6ZSA9IChpbnQpcl9sb25nKHApOwotCQkJZmxhZ3MgPSAoaW50KXJfbG9uZyhwKTsKLQkJCWNvZGUgPSByX29iamVjdChwKTsKLQkJCWlmIChjb2RlID09IE5VTEwpCi0JCQkJZ290byBjb2RlX2Vycm9yOwotCQkJY29uc3RzID0gcl9vYmplY3QocCk7Ci0JCQlpZiAoY29uc3RzID09IE5VTEwpCi0JCQkJZ290byBjb2RlX2Vycm9yOwotCQkJbmFtZXMgPSByX29iamVjdChwKTsKLQkJCWlmIChuYW1lcyA9PSBOVUxMKQotCQkJCWdvdG8gY29kZV9lcnJvcjsKLQkJCXZhcm5hbWVzID0gcl9vYmplY3QocCk7Ci0JCQlpZiAodmFybmFtZXMgPT0gTlVMTCkKLQkJCQlnb3RvIGNvZGVfZXJyb3I7Ci0JCQlmcmVldmFycyA9IHJfb2JqZWN0KHApOwotCQkJaWYgKGZyZWV2YXJzID09IE5VTEwpCi0JCQkJZ290byBjb2RlX2Vycm9yOwotCQkJY2VsbHZhcnMgPSByX29iamVjdChwKTsKLQkJCWlmIChjZWxsdmFycyA9PSBOVUxMKQotCQkJCWdvdG8gY29kZV9lcnJvcjsKLQkJCWZpbGVuYW1lID0gcl9vYmplY3QocCk7Ci0JCQlpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLQkJCQlnb3RvIGNvZGVfZXJyb3I7Ci0JCQluYW1lID0gcl9vYmplY3QocCk7Ci0JCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJCWdvdG8gY29kZV9lcnJvcjsKLQkJCWZpcnN0bGluZW5vID0gKGludClyX2xvbmcocCk7Ci0JCQlsbm90YWIgPSByX29iamVjdChwKTsKLQkJCWlmIChsbm90YWIgPT0gTlVMTCkKLQkJCQlnb3RvIGNvZGVfZXJyb3I7CisgICAgICAgICAgICB2ID0gTlVMTDsKIAotCQkJdiA9IChQeU9iamVjdCAqKSBQeUNvZGVfTmV3KAotCQkJCQlhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywKLQkJCQkJY29kZSwgY29uc3RzLCBuYW1lcywgdmFybmFtZXMsCi0JCQkJCWZyZWV2YXJzLCBjZWxsdmFycywgZmlsZW5hbWUsIG5hbWUsCi0JCQkJCWZpcnN0bGluZW5vLCBsbm90YWIpOworICAgICAgICAgICAgLyogWFhYIGlnbm9yZSBsb25nLT5pbnQgb3ZlcmZsb3dzIGZvciBub3cgKi8KKyAgICAgICAgICAgIGFyZ2NvdW50ID0gKGludClyX2xvbmcocCk7CisgICAgICAgICAgICBubG9jYWxzID0gKGludClyX2xvbmcocCk7CisgICAgICAgICAgICBzdGFja3NpemUgPSAoaW50KXJfbG9uZyhwKTsKKyAgICAgICAgICAgIGZsYWdzID0gKGludClyX2xvbmcocCk7CisgICAgICAgICAgICBjb2RlID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAoY29kZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gY29kZV9lcnJvcjsKKyAgICAgICAgICAgIGNvbnN0cyA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKGNvbnN0cyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gY29kZV9lcnJvcjsKKyAgICAgICAgICAgIG5hbWVzID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAobmFtZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGNvZGVfZXJyb3I7CisgICAgICAgICAgICB2YXJuYW1lcyA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKHZhcm5hbWVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBjb2RlX2Vycm9yOworICAgICAgICAgICAgZnJlZXZhcnMgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgIGlmIChmcmVldmFycyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gY29kZV9lcnJvcjsKKyAgICAgICAgICAgIGNlbGx2YXJzID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAoY2VsbHZhcnMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGNvZGVfZXJyb3I7CisgICAgICAgICAgICBmaWxlbmFtZSA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBjb2RlX2Vycm9yOworICAgICAgICAgICAgbmFtZSA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGNvZGVfZXJyb3I7CisgICAgICAgICAgICBmaXJzdGxpbmVubyA9IChpbnQpcl9sb25nKHApOworICAgICAgICAgICAgbG5vdGFiID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAobG5vdGFiID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBjb2RlX2Vycm9yOwogCi0JCSAgY29kZV9lcnJvcjoKLQkJCVB5X1hERUNSRUYoY29kZSk7Ci0JCQlQeV9YREVDUkVGKGNvbnN0cyk7Ci0JCQlQeV9YREVDUkVGKG5hbWVzKTsKLQkJCVB5X1hERUNSRUYodmFybmFtZXMpOwotCQkJUHlfWERFQ1JFRihmcmVldmFycyk7Ci0JCQlQeV9YREVDUkVGKGNlbGx2YXJzKTsKLQkJCVB5X1hERUNSRUYoZmlsZW5hbWUpOwotCQkJUHlfWERFQ1JFRihuYW1lKTsKLQkJCVB5X1hERUNSRUYobG5vdGFiKTsKKyAgICAgICAgICAgIHYgPSAoUHlPYmplY3QgKikgUHlDb2RlX05ldygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLCBjb25zdHMsIG5hbWVzLCB2YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVldmFycywgY2VsbHZhcnMsIGZpbGVuYW1lLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0bGluZW5vLCBsbm90YWIpOwogCi0JCX0KLQkJcmV0dmFsID0gdjsKLQkJYnJlYWs7CisgICAgICAgICAgY29kZV9lcnJvcjoKKyAgICAgICAgICAgIFB5X1hERUNSRUYoY29kZSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGNvbnN0cyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKG5hbWVzKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodmFybmFtZXMpOworICAgICAgICAgICAgUHlfWERFQ1JFRihmcmVldmFycyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGNlbGx2YXJzKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoZmlsZW5hbWUpOworICAgICAgICAgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYobG5vdGFiKTsKIAotCWRlZmF1bHQ6Ci0JCS8qIEJvZ3VzIGRhdGEgZ290IHdyaXR0ZW4sIHdoaWNoIGlzbid0IGlkZWFsLgotCQkgICBUaGlzIHdpbGwgbGV0IHlvdSBrZWVwIHdvcmtpbmcgYW5kIHJlY292ZXIuICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSAodW5rbm93biB0eXBlIGNvZGUpIik7Ci0JCXJldHZhbCA9IE5VTEw7Ci0JCWJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IHY7CisgICAgICAgIGJyZWFrOwogCi0JfQotCXAtPmRlcHRoLS07Ci0JcmV0dXJuIHJldHZhbDsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBCb2d1cyBkYXRhIGdvdCB3cml0dGVuLCB3aGljaCBpc24ndCBpZGVhbC4KKyAgICAgICAgICAgVGhpcyB3aWxsIGxldCB5b3Uga2VlcCB3b3JraW5nIGFuZCByZWNvdmVyLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEgKHVua25vd24gdHlwZSBjb2RlKSIpOworICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICBicmVhazsKKworICAgIH0KKyAgICBwLT5kZXB0aC0tOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZWFkX29iamVjdChSRklMRSAqcCkKIHsKLQlQeU9iamVjdCAqdjsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlhYWCByZWFkb2JqZWN0IGNhbGxlZCB3aXRoIGV4Y2VwdGlvbiBzZXRcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdiA9IHJfb2JqZWN0KHApOwotCWlmICh2ID09IE5VTEwgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEgZm9yIG9iamVjdCIpOwotCXJldHVybiB2OworICAgIFB5T2JqZWN0ICp2OworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWFhYIHJlYWRvYmplY3QgY2FsbGVkIHdpdGggZXhjZXB0aW9uIHNldFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2ID0gcl9vYmplY3QocCk7CisgICAgaWYgKHYgPT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk5VTEwgb2JqZWN0IGluIG1hcnNoYWwgZGF0YSBmb3Igb2JqZWN0Iik7CisgICAgcmV0dXJuIHY7CiB9CiAKIGludAogUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKEZJTEUgKmZwKQogewotCVJGSUxFIHJmOwotCWFzc2VydChmcCk7Ci0JcmYuZnAgPSBmcDsKLQlyZi5zdHJpbmdzID0gTlVMTDsKLQlyZi5lbmQgPSByZi5wdHIgPSBOVUxMOwotCXJldHVybiByX3Nob3J0KCZyZik7CisgICAgUkZJTEUgcmY7CisgICAgYXNzZXJ0KGZwKTsKKyAgICByZi5mcCA9IGZwOworICAgIHJmLnN0cmluZ3MgPSBOVUxMOworICAgIHJmLmVuZCA9IHJmLnB0ciA9IE5VTEw7CisgICAgcmV0dXJuIHJfc2hvcnQoJnJmKTsKIH0KIAogbG9uZwogUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoRklMRSAqZnApCiB7Ci0JUkZJTEUgcmY7Ci0JcmYuZnAgPSBmcDsKLQlyZi5zdHJpbmdzID0gTlVMTDsKLQlyZi5wdHIgPSByZi5lbmQgPSBOVUxMOwotCXJldHVybiByX2xvbmcoJnJmKTsKKyAgICBSRklMRSByZjsKKyAgICByZi5mcCA9IGZwOworICAgIHJmLnN0cmluZ3MgPSBOVUxMOworICAgIHJmLnB0ciA9IHJmLmVuZCA9IE5VTEw7CisgICAgcmV0dXJuIHJfbG9uZygmcmYpOwogfQogCiAjaWZkZWYgSEFWRV9GU1RBVApAQCAtMTEwOSwxMSArMTEwOSwxMSBAQAogc3RhdGljIG9mZl90CiBnZXRmaWxlc2l6ZShGSUxFICpmcCkKIHsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQlpZiAoZnN0YXQoZmlsZW5vKGZwKSwgJnN0KSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0JZWxzZQotCQlyZXR1cm4gc3Quc3Rfc2l6ZTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBpZiAoZnN0YXQoZmlsZW5vKGZwKSwgJnN0KSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gc3Quc3Rfc2l6ZTsKIH0KICNlbmRpZgogCkBAIC0xMTI5LDI3ICsxMTI5LDI3IEBACiAvKiBSRUFTT05BQkxFX0ZJTEVfTElNSVQgaXMgYnkgZGVmbiBzb21ldGhpbmcgYmlnIGVub3VnaCBmb3IgVGtpbnRlci5weWMuICovCiAjZGVmaW5lIFJFQVNPTkFCTEVfRklMRV9MSU1JVCAoMUwgPDwgMTgpCiAjaWZkZWYgSEFWRV9GU1RBVAotCW9mZl90IGZpbGVzaXplOwotCWZpbGVzaXplID0gZ2V0ZmlsZXNpemUoZnApOwotCWlmIChmaWxlc2l6ZSA+IDAgJiYgZmlsZXNpemUgPD0gUkVBU09OQUJMRV9GSUxFX0xJTUlUKSB7Ci0JCWNoYXIqIHBCdWYgPSAoY2hhciAqKVB5TWVtX01BTExPQyhmaWxlc2l6ZSk7Ci0JCWlmIChwQnVmICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0KiB2OwotCQkJc2l6ZV90IG47Ci0JCQkvKiBmaWxlc2l6ZSBtdXN0IGZpdCBpbnRvIGFuIGludCwgYmVjYXVzZSBpdAotCQkJICAgaXMgc21hbGxlciB0aGFuIFJFQVNPTkFCTEVfRklMRV9MSU1JVCAqLwotCQkJbiA9IGZyZWFkKHBCdWYsIDEsIChpbnQpZmlsZXNpemUsIGZwKTsKLQkJCXYgPSBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcocEJ1Ziwgbik7Ci0JCQlQeU1lbV9GUkVFKHBCdWYpOwotCQkJcmV0dXJuIHY7Ci0JCX0KKyAgICBvZmZfdCBmaWxlc2l6ZTsKKyAgICBmaWxlc2l6ZSA9IGdldGZpbGVzaXplKGZwKTsKKyAgICBpZiAoZmlsZXNpemUgPiAwICYmIGZpbGVzaXplIDw9IFJFQVNPTkFCTEVfRklMRV9MSU1JVCkgeworICAgICAgICBjaGFyKiBwQnVmID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoZmlsZXNpemUpOworICAgICAgICBpZiAocEJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeU9iamVjdCogdjsKKyAgICAgICAgICAgIHNpemVfdCBuOworICAgICAgICAgICAgLyogZmlsZXNpemUgbXVzdCBmaXQgaW50byBhbiBpbnQsIGJlY2F1c2UgaXQKKyAgICAgICAgICAgICAgIGlzIHNtYWxsZXIgdGhhbiBSRUFTT05BQkxFX0ZJTEVfTElNSVQgKi8KKyAgICAgICAgICAgIG4gPSBmcmVhZChwQnVmLCAxLCAoaW50KWZpbGVzaXplLCBmcCk7CisgICAgICAgICAgICB2ID0gUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKHBCdWYsIG4pOworICAgICAgICAgICAgUHlNZW1fRlJFRShwQnVmKTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CiAKLQl9CisgICAgfQogI2VuZGlmCi0JLyogV2UgZG9uJ3QgaGF2ZSBmc3RhdCwgb3Igd2UgZG8gYnV0IHRoZSBmaWxlIGlzIGxhcmdlciB0aGFuCi0JICogUkVBU09OQUJMRV9GSUxFX0xJTUlUIG9yIG1hbGxvYyBmYWlsZWQgLS0gcmVhZCBhIGJ5dGUgYXQgYSB0aW1lLgotCSAqLwotCXJldHVybiBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21GaWxlKGZwKTsKKyAgICAvKiBXZSBkb24ndCBoYXZlIGZzdGF0LCBvciB3ZSBkbyBidXQgdGhlIGZpbGUgaXMgbGFyZ2VyIHRoYW4KKyAgICAgKiBSRUFTT05BQkxFX0ZJTEVfTElNSVQgb3IgbWFsbG9jIGZhaWxlZCAtLSByZWFkIGEgYnl0ZSBhdCBhIHRpbWUuCisgICAgICovCisgICAgcmV0dXJuIFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbUZpbGUoZnApOwogCiAjdW5kZWYgUkVBU09OQUJMRV9GSUxFX0xJTUlUCiB9CkBAIC0xMTU3LDgzICsxMTU3LDgzIEBACiBQeU9iamVjdCAqCiBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21GaWxlKEZJTEUgKmZwKQogewotCVJGSUxFIHJmOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JcmYuZnAgPSBmcDsKLQlyZi5zdHJpbmdzID0gUHlMaXN0X05ldygwKTsKLQlyZi5kZXB0aCA9IDA7Ci0JcmYucHRyID0gcmYuZW5kID0gTlVMTDsKLQlyZXN1bHQgPSByX29iamVjdCgmcmYpOwotCVB5X0RFQ1JFRihyZi5zdHJpbmdzKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFJGSUxFIHJmOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgcmYuZnAgPSBmcDsKKyAgICByZi5zdHJpbmdzID0gUHlMaXN0X05ldygwKTsKKyAgICByZi5kZXB0aCA9IDA7CisgICAgcmYucHRyID0gcmYuZW5kID0gTlVMTDsKKyAgICByZXN1bHQgPSByX29iamVjdCgmcmYpOworICAgIFB5X0RFQ1JFRihyZi5zdHJpbmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcoY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbikKIHsKLQlSRklMRSByZjsKLQlQeU9iamVjdCAqcmVzdWx0OwotCXJmLmZwID0gTlVMTDsKLQlyZi5wdHIgPSBzdHI7Ci0JcmYuZW5kID0gc3RyICsgbGVuOwotCXJmLnN0cmluZ3MgPSBQeUxpc3RfTmV3KDApOwotCXJmLmRlcHRoID0gMDsKLQlyZXN1bHQgPSByX29iamVjdCgmcmYpOwotCVB5X0RFQ1JFRihyZi5zdHJpbmdzKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFJGSUxFIHJmOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgcmYuZnAgPSBOVUxMOworICAgIHJmLnB0ciA9IHN0cjsKKyAgICByZi5lbmQgPSBzdHIgKyBsZW47CisgICAgcmYuc3RyaW5ncyA9IFB5TGlzdF9OZXcoMCk7CisgICAgcmYuZGVwdGggPSAwOworICAgIHJlc3VsdCA9IHJfb2JqZWN0KCZyZik7CisgICAgUHlfREVDUkVGKHJmLnN0cmluZ3MpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyB2b2lkCiBzZXRfZXJyb3IoaW50IGVycm9yKQogewotCXN3aXRjaCAoZXJyb3IpIHsKLQljYXNlIFdGRVJSX05PTUVNT1JZOgotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlicmVhazsKLQljYXNlIFdGRVJSX1VOTUFSU0hBTExBQkxFOgotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInVubWFyc2hhbGxhYmxlIG9iamVjdCIpOwotCQlicmVhazsKLQljYXNlIFdGRVJSX05FU1RFRFRPT0RFRVA6Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkib2JqZWN0IHRvbyBkZWVwbHkgbmVzdGVkIHRvIG1hcnNoYWwiKTsKLQkJYnJlYWs7Ci0JfQorICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICBjYXNlIFdGRVJSX05PTUVNT1JZOgorICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdGRVJSX1VOTUFSU0hBTExBQkxFOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInVubWFyc2hhbGxhYmxlIG9iamVjdCIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdGRVJSX05FU1RFRFRPT0RFRVA6CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAib2JqZWN0IHRvbyBkZWVwbHkgbmVzdGVkIHRvIG1hcnNoYWwiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogfQogCiBQeU9iamVjdCAqCiBQeU1hcnNoYWxfV3JpdGVPYmplY3RUb1N0cmluZyhQeU9iamVjdCAqeCwgaW50IHZlcnNpb24pCiB7Ci0JV0ZJTEUgd2Y7Ci0Jd2YuZnAgPSBOVUxMOwotCXdmLnN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgNTApOwotCWlmICh3Zi5zdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2YucHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXdmLnN0cik7Ci0Jd2YuZW5kID0gd2YucHRyICsgUHlTdHJpbmdfU2l6ZSh3Zi5zdHIpOwotCXdmLmVycm9yID0gV0ZFUlJfT0s7Ci0Jd2YuZGVwdGggPSAwOwotCXdmLnZlcnNpb24gPSB2ZXJzaW9uOwotCXdmLnN0cmluZ3MgPSAodmVyc2lvbiA+IDApID8gUHlEaWN0X05ldygpIDogTlVMTDsKLQl3X29iamVjdCh4LCAmd2YpOwotCVB5X1hERUNSRUYod2Yuc3RyaW5ncyk7Ci0JaWYgKHdmLnN0ciAhPSBOVUxMKSB7Ci0JCWNoYXIgKmJhc2UgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopd2Yuc3RyKTsKLQkJaWYgKHdmLnB0ciAtIGJhc2UgPiBQWV9TU0laRV9UX01BWCkgewotCQkJUHlfREVDUkVGKHdmLnN0cik7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJInRvbyBtdWNoIG1hcnNoYWxsIGRhdGEgZm9yIGEgc3RyaW5nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmd2Yuc3RyLCAoUHlfc3NpemVfdCkod2YucHRyIC0gYmFzZSkpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh3Zi5lcnJvciAhPSBXRkVSUl9PSykgewotCQlQeV9YREVDUkVGKHdmLnN0cik7Ci0JCXNldF9lcnJvcih3Zi5lcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gd2Yuc3RyOworICAgIFdGSUxFIHdmOworICAgIHdmLmZwID0gTlVMTDsKKyAgICB3Zi5zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIDUwKTsKKyAgICBpZiAod2Yuc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdmLnB0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKil3Zi5zdHIpOworICAgIHdmLmVuZCA9IHdmLnB0ciArIFB5U3RyaW5nX1NpemUod2Yuc3RyKTsKKyAgICB3Zi5lcnJvciA9IFdGRVJSX09LOworICAgIHdmLmRlcHRoID0gMDsKKyAgICB3Zi52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB3Zi5zdHJpbmdzID0gKHZlcnNpb24gPiAwKSA/IFB5RGljdF9OZXcoKSA6IE5VTEw7CisgICAgd19vYmplY3QoeCwgJndmKTsKKyAgICBQeV9YREVDUkVGKHdmLnN0cmluZ3MpOworICAgIGlmICh3Zi5zdHIgIT0gTlVMTCkgeworICAgICAgICBjaGFyICpiYXNlID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXdmLnN0cik7CisgICAgICAgIGlmICh3Zi5wdHIgLSBiYXNlID4gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3Zi5zdHIpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvbyBtdWNoIG1hcnNoYWxsIGRhdGEgZm9yIGEgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmd2Yuc3RyLCAoUHlfc3NpemVfdCkod2YucHRyIC0gYmFzZSkpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh3Zi5lcnJvciAhPSBXRkVSUl9PSykgeworICAgICAgICBQeV9YREVDUkVGKHdmLnN0cik7CisgICAgICAgIHNldF9lcnJvcih3Zi5lcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gd2Yuc3RyOwogfQogCiAvKiBBbmQgYW4gaW50ZXJmYWNlIGZvciBQeXRob24gcHJvZ3JhbXMuLi4gKi8KQEAgLTEyNDEsMzIgKzEyNDEsMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXJzaGFsX2R1bXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVdGSUxFIHdmOwotCVB5T2JqZWN0ICp4OwotCVB5T2JqZWN0ICpmOwotCWludCB2ZXJzaW9uID0gUHlfTUFSU0hBTF9WRVJTSU9OOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098aTpkdW1wIiwgJngsICZmLCAmdmVyc2lvbikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlGaWxlX0NoZWNrKGYpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1hcnNoYWwuZHVtcCgpIDJuZCBhcmcgbXVzdCBiZSBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl3Zi5mcCA9IFB5RmlsZV9Bc0ZpbGUoZik7Ci0Jd2Yuc3RyID0gTlVMTDsKLQl3Zi5wdHIgPSB3Zi5lbmQgPSBOVUxMOwotCXdmLmVycm9yID0gV0ZFUlJfT0s7Ci0Jd2YuZGVwdGggPSAwOwotCXdmLnN0cmluZ3MgPSAodmVyc2lvbiA+IDApID8gUHlEaWN0X05ldygpIDogMDsKLQl3Zi52ZXJzaW9uID0gdmVyc2lvbjsKLQl3X29iamVjdCh4LCAmd2YpOwotCVB5X1hERUNSRUYod2Yuc3RyaW5ncyk7Ci0JaWYgKHdmLmVycm9yICE9IFdGRVJSX09LKSB7Ci0JCXNldF9lcnJvcih3Zi5lcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgV0ZJTEUgd2Y7CisgICAgUHlPYmplY3QgKng7CisgICAgUHlPYmplY3QgKmY7CisgICAgaW50IHZlcnNpb24gPSBQeV9NQVJTSEFMX1ZFUlNJT047CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xpOmR1bXAiLCAmeCwgJmYsICZ2ZXJzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUZpbGVfQ2hlY2soZikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXJzaGFsLmR1bXAoKSAybmQgYXJnIG11c3QgYmUgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgd2YuZnAgPSBQeUZpbGVfQXNGaWxlKGYpOworICAgIHdmLnN0ciA9IE5VTEw7CisgICAgd2YucHRyID0gd2YuZW5kID0gTlVMTDsKKyAgICB3Zi5lcnJvciA9IFdGRVJSX09LOworICAgIHdmLmRlcHRoID0gMDsKKyAgICB3Zi5zdHJpbmdzID0gKHZlcnNpb24gPiAwKSA/IFB5RGljdF9OZXcoKSA6IDA7CisgICAgd2YudmVyc2lvbiA9IHZlcnNpb247CisgICAgd19vYmplY3QoeCwgJndmKTsKKyAgICBQeV9YREVDUkVGKHdmLnN0cmluZ3MpOworICAgIGlmICh3Zi5lcnJvciAhPSBXRkVSUl9PSykgeworICAgICAgICBzZXRfZXJyb3Iod2YuZXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZHVtcF9kb2MsCkBAIC0xMjg2LDE5ICsxMjg2LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWFyc2hhbF9sb2FkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqZikKIHsKLQlSRklMRSByZjsKLQlQeU9iamVjdCAqcmVzdWx0OwotCWlmICghUHlGaWxlX0NoZWNrKGYpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1hcnNoYWwubG9hZCgpIGFyZyBtdXN0IGJlIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJmLmZwID0gUHlGaWxlX0FzRmlsZShmKTsKLQlyZi5zdHJpbmdzID0gUHlMaXN0X05ldygwKTsKLQlyZi5kZXB0aCA9IDA7Ci0JcmVzdWx0ID0gcmVhZF9vYmplY3QoJnJmKTsKLQlQeV9ERUNSRUYocmYuc3RyaW5ncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBSRklMRSByZjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGlmICghUHlGaWxlX0NoZWNrKGYpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWFyc2hhbC5sb2FkKCkgYXJnIG11c3QgYmUgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmYuZnAgPSBQeUZpbGVfQXNGaWxlKGYpOworICAgIHJmLnN0cmluZ3MgPSBQeUxpc3RfTmV3KDApOworICAgIHJmLmRlcHRoID0gMDsKKyAgICByZXN1bHQgPSByZWFkX29iamVjdCgmcmYpOworICAgIFB5X0RFQ1JFRihyZi5zdHJpbmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIobG9hZF9kb2MsCkBAIC0xMzE3LDExICsxMzE3LDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWFyc2hhbF9kdW1wcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKng7Ci0JaW50IHZlcnNpb24gPSBQeV9NQVJTSEFMX1ZFUlNJT047Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6ZHVtcHMiLCAmeCwgJnZlcnNpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlNYXJzaGFsX1dyaXRlT2JqZWN0VG9TdHJpbmcoeCwgdmVyc2lvbik7CisgICAgUHlPYmplY3QgKng7CisgICAgaW50IHZlcnNpb24gPSBQeV9NQVJTSEFMX1ZFUlNJT047CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6ZHVtcHMiLCAmeCwgJnZlcnNpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlNYXJzaGFsX1dyaXRlT2JqZWN0VG9TdHJpbmcoeCwgdmVyc2lvbik7CiB9CiAKIFB5RG9jX1NUUlZBUihkdW1wc19kb2MsCkBAIC0xMzM4LDIwICsxMzM4LDIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWFyc2hhbF9sb2FkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUkZJTEUgcmY7Ci0JY2hhciAqczsKLQlQeV9zc2l6ZV90IG47Ci0JUHlPYmplY3QqIHJlc3VsdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmxvYWRzIiwgJnMsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmYuZnAgPSBOVUxMOwotCXJmLnB0ciA9IHM7Ci0JcmYuZW5kID0gcyArIG47Ci0JcmYuc3RyaW5ncyA9IFB5TGlzdF9OZXcoMCk7Ci0JcmYuZGVwdGggPSAwOwotCXJlc3VsdCA9IHJlYWRfb2JqZWN0KCZyZik7Ci0JUHlfREVDUkVGKHJmLnN0cmluZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgUkZJTEUgcmY7CisgICAgY2hhciAqczsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlPYmplY3QqIHJlc3VsdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmxvYWRzIiwgJnMsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmYuZnAgPSBOVUxMOworICAgIHJmLnB0ciA9IHM7CisgICAgcmYuZW5kID0gcyArIG47CisgICAgcmYuc3RyaW5ncyA9IFB5TGlzdF9OZXcoMCk7CisgICAgcmYuZGVwdGggPSAwOworICAgIHJlc3VsdCA9IHJlYWRfb2JqZWN0KCZyZik7CisgICAgUHlfREVDUkVGKHJmLnN0cmluZ3MpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihsb2Fkc19kb2MsCkBAIC0xMzYyLDExICsxMzYyLDExIEBACiBpZ25vcmVkLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgbWFyc2hhbF9tZXRob2RzW10gPSB7Ci0JeyJkdW1wIiwJbWFyc2hhbF9kdW1wLAlNRVRIX1ZBUkFSR1MsCWR1bXBfZG9jfSwKLQl7ImxvYWQiLAltYXJzaGFsX2xvYWQsCU1FVEhfTywJCWxvYWRfZG9jfSwKLQl7ImR1bXBzIiwJbWFyc2hhbF9kdW1wcywJTUVUSF9WQVJBUkdTLAlkdW1wc19kb2N9LAotCXsibG9hZHMiLAltYXJzaGFsX2xvYWRzLAlNRVRIX1ZBUkFSR1MsCWxvYWRzX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImR1bXAiLCAgICAgICAgICAgIG1hcnNoYWxfZHVtcCwgICBNRVRIX1ZBUkFSR1MsICAgZHVtcF9kb2N9LAorICAgIHsibG9hZCIsICAgICAgICAgICAgbWFyc2hhbF9sb2FkLCAgIE1FVEhfTywgICAgICAgICBsb2FkX2RvY30sCisgICAgeyJkdW1wcyIsICAgICAgICAgICBtYXJzaGFsX2R1bXBzLCAgTUVUSF9WQVJBUkdTLCAgIGR1bXBzX2RvY30sCisgICAgeyJsb2FkcyIsICAgICAgICAgICBtYXJzaGFsX2xvYWRzLCAgTUVUSF9WQVJBUkdTLCAgIGxvYWRzX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihtYXJzaGFsX2RvYywKQEAgLTE0MDIsOSArMTQwMiw5IEBACiBQeU1PRElOSVRfRlVOQwogUHlNYXJzaGFsX0luaXQodm9pZCkKIHsKLQlQeU9iamVjdCAqbW9kID0gUHlfSW5pdE1vZHVsZTMoIm1hcnNoYWwiLCBtYXJzaGFsX21ldGhvZHMsCi0JCW1hcnNoYWxfZG9jKTsKLQlpZiAobW9kID09IE5VTEwpCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2QsICJ2ZXJzaW9uIiwgUHlfTUFSU0hBTF9WRVJTSU9OKTsKKyAgICBQeU9iamVjdCAqbW9kID0gUHlfSW5pdE1vZHVsZTMoIm1hcnNoYWwiLCBtYXJzaGFsX21ldGhvZHMsCisgICAgICAgIG1hcnNoYWxfZG9jKTsKKyAgICBpZiAobW9kID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2QsICJ2ZXJzaW9uIiwgUHlfTUFSU0hBTF9WRVJTSU9OKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9tb2RzdXBwb3J0LmMgYi9QeXRob24vbW9kc3VwcG9ydC5jCmluZGV4IGQ1NDE1OGYuLjZlZTQ4ZjMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9tb2RzdXBwb3J0LmMKKysrIGIvUHl0aG9uL21vZHN1cHBvcnQuYwpAQCAtMzAsNzYgKzMwLDc2IEBACiAKIFB5T2JqZWN0ICoKIFB5X0luaXRNb2R1bGU0KGNvbnN0IGNoYXIgKm5hbWUsIFB5TWV0aG9kRGVmICptZXRob2RzLCBjb25zdCBjaGFyICpkb2MsCi0JICAgICAgIFB5T2JqZWN0ICpwYXNzdGhyb3VnaCwgaW50IG1vZHVsZV9hcGlfdmVyc2lvbikKKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICpwYXNzdGhyb3VnaCwgaW50IG1vZHVsZV9hcGlfdmVyc2lvbikKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp2LCAqbjsKLQlQeU1ldGhvZERlZiAqbWw7Ci0JaWYgKCFQeV9Jc0luaXRpYWxpemVkKCkpCi0JICAgIFB5X0ZhdGFsRXJyb3IoIkludGVycHJldGVyIG5vdCBpbml0aWFsaXplZCAodmVyc2lvbiBtaXNtYXRjaD8pIik7Ci0JaWYgKG1vZHVsZV9hcGlfdmVyc2lvbiAhPSBQWVRIT05fQVBJX1ZFUlNJT04pIHsKLQkJY2hhciBtZXNzYWdlWzUxMl07Ci0JCVB5T1Nfc25wcmludGYobWVzc2FnZSwgc2l6ZW9mKG1lc3NhZ2UpLCAKLQkJCSAgICAgIGFwaV92ZXJzaW9uX3dhcm5pbmcsIG5hbWUsIAotCQkJICAgICAgUFlUSE9OX0FQSV9WRVJTSU9OLCBuYW1lLCAKLQkJCSAgICAgIG1vZHVsZV9hcGlfdmVyc2lvbik7Ci0JCWlmIChQeUVycl9XYXJuKFB5RXhjX1J1bnRpbWVXYXJuaW5nLCBtZXNzYWdlKSkgCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogTWFrZSBzdXJlIG5hbWUgaXMgZnVsbHkgcXVhbGlmaWVkLgorICAgIFB5T2JqZWN0ICptLCAqZCwgKnYsICpuOworICAgIFB5TWV0aG9kRGVmICptbDsKKyAgICBpZiAoIVB5X0lzSW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiSW50ZXJwcmV0ZXIgbm90IGluaXRpYWxpemVkICh2ZXJzaW9uIG1pc21hdGNoPykiKTsKKyAgICBpZiAobW9kdWxlX2FwaV92ZXJzaW9uICE9IFBZVEhPTl9BUElfVkVSU0lPTikgeworICAgICAgICBjaGFyIG1lc3NhZ2VbNTEyXTsKKyAgICAgICAgUHlPU19zbnByaW50ZihtZXNzYWdlLCBzaXplb2YobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgYXBpX3ZlcnNpb25fd2FybmluZywgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBQWVRIT05fQVBJX1ZFUlNJT04sIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX2FwaV92ZXJzaW9uKTsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsIG1lc3NhZ2UpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIE1ha2Ugc3VyZSBuYW1lIGlzIGZ1bGx5IHF1YWxpZmllZC4KIAotCSAgIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrOiB3aGVuIHRoZSBzaGFyZWQgbGlicmFyeSBpcyBsb2FkZWQsCi0JICAgdGhlIG1vZHVsZSBuYW1lIGlzICJwYWNrYWdlLm1vZHVsZSIsIGJ1dCB0aGUgbW9kdWxlIGNhbGxzCi0JICAgUHlfSW5pdE1vZHVsZSooKSB3aXRoIGp1c3QgIm1vZHVsZSIgZm9yIHRoZSBuYW1lLiAgVGhlIHNoYXJlZAotCSAgIGxpYnJhcnkgbG9hZGVyIHNxdWlycmVscyBhd2F5IHRoZSB0cnVlIG5hbWUgb2YgdGhlIG1vZHVsZSBpbgotCSAgIF9QeV9QYWNrYWdlQ29udGV4dCwgYW5kIFB5X0luaXRNb2R1bGUqKCkgd2lsbCBzdWJzdGl0dXRlIHRoaXMKLQkgICAoaWYgdGhlIG5hbWUgYWN0dWFsbHkgbWF0Y2hlcykuCi0JKi8KLQlpZiAoX1B5X1BhY2thZ2VDb250ZXh0ICE9IE5VTEwpIHsKLQkJY2hhciAqcCA9IHN0cnJjaHIoX1B5X1BhY2thZ2VDb250ZXh0LCAnLicpOwotCQlpZiAocCAhPSBOVUxMICYmIHN0cmNtcChuYW1lLCBwKzEpID09IDApIHsKLQkJCW5hbWUgPSBfUHlfUGFja2FnZUNvbnRleHQ7Ci0JCQlfUHlfUGFja2FnZUNvbnRleHQgPSBOVUxMOwotCQl9Ci0JfQotCWlmICgobSA9IFB5SW1wb3J0X0FkZE1vZHVsZShuYW1lKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JaWYgKG1ldGhvZHMgIT0gTlVMTCkgewotCQluID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKLQkJaWYgKG4gPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlmb3IgKG1sID0gbWV0aG9kczsgbWwtPm1sX25hbWUgIT0gTlVMTDsgbWwrKykgewotCQkJaWYgKChtbC0+bWxfZmxhZ3MgJiBNRVRIX0NMQVNTKSB8fAotCQkJICAgIChtbC0+bWxfZmxhZ3MgJiBNRVRIX1NUQVRJQykpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJtb2R1bGUgZnVuY3Rpb25zIGNhbm5vdCBzZXQiCi0JCQkJCQkiIE1FVEhfQ0xBU1Mgb3IgTUVUSF9TVEFUSUMiKTsKLQkJCQlQeV9ERUNSRUYobik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQl2ID0gUHlDRnVuY3Rpb25fTmV3RXgobWwsIHBhc3N0aHJvdWdoLCBuKTsKLQkJCWlmICh2ID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYobik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbWwtPm1sX25hbWUsIHYpICE9IDApIHsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJUHlfREVDUkVGKG4pOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQl9Ci0JCVB5X0RFQ1JFRihuKTsKLQl9Ci0JaWYgKGRvYyAhPSBOVUxMKSB7Ci0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGRvYyk7Ci0JCWlmICh2ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fZG9jX18iLCB2KSAhPSAwKSB7Ci0JCQlQeV9YREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfREVDUkVGKHYpOwotCX0KLQlyZXR1cm4gbTsKKyAgICAgICBUaGlzIGlzIGEgYml0IG9mIGEgaGFjazogd2hlbiB0aGUgc2hhcmVkIGxpYnJhcnkgaXMgbG9hZGVkLAorICAgICAgIHRoZSBtb2R1bGUgbmFtZSBpcyAicGFja2FnZS5tb2R1bGUiLCBidXQgdGhlIG1vZHVsZSBjYWxscworICAgICAgIFB5X0luaXRNb2R1bGUqKCkgd2l0aCBqdXN0ICJtb2R1bGUiIGZvciB0aGUgbmFtZS4gIFRoZSBzaGFyZWQKKyAgICAgICBsaWJyYXJ5IGxvYWRlciBzcXVpcnJlbHMgYXdheSB0aGUgdHJ1ZSBuYW1lIG9mIHRoZSBtb2R1bGUgaW4KKyAgICAgICBfUHlfUGFja2FnZUNvbnRleHQsIGFuZCBQeV9Jbml0TW9kdWxlKigpIHdpbGwgc3Vic3RpdHV0ZSB0aGlzCisgICAgICAgKGlmIHRoZSBuYW1lIGFjdHVhbGx5IG1hdGNoZXMpLgorICAgICovCisgICAgaWYgKF9QeV9QYWNrYWdlQ29udGV4dCAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKnAgPSBzdHJyY2hyKF9QeV9QYWNrYWdlQ29udGV4dCwgJy4nKTsKKyAgICAgICAgaWYgKHAgIT0gTlVMTCAmJiBzdHJjbXAobmFtZSwgcCsxKSA9PSAwKSB7CisgICAgICAgICAgICBuYW1lID0gX1B5X1BhY2thZ2VDb250ZXh0OworICAgICAgICAgICAgX1B5X1BhY2thZ2VDb250ZXh0ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKG0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGlmIChtZXRob2RzICE9IE5VTEwpIHsKKyAgICAgICAgbiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7CisgICAgICAgIGlmIChuID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yIChtbCA9IG1ldGhvZHM7IG1sLT5tbF9uYW1lICE9IE5VTEw7IG1sKyspIHsKKyAgICAgICAgICAgIGlmICgobWwtPm1sX2ZsYWdzICYgTUVUSF9DTEFTUykgfHwKKyAgICAgICAgICAgICAgICAobWwtPm1sX2ZsYWdzICYgTUVUSF9TVEFUSUMpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgZnVuY3Rpb25zIGNhbm5vdCBzZXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTUVUSF9DTEFTUyBvciBNRVRIX1NUQVRJQyIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHYgPSBQeUNGdW5jdGlvbl9OZXdFeChtbCwgcGFzc3Rocm91Z2gsIG4pOworICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBtbC0+bWxfbmFtZSwgdikgIT0gMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKG4pOworICAgIH0KKyAgICBpZiAoZG9jICE9IE5VTEwpIHsKKyAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19kb2NfXyIsIHYpICE9IDApIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQorICAgIHJldHVybiBtOwogfQogCiAKQEAgLTEwOCw0MSArMTA4LDQxIEBACiBzdGF0aWMgaW50CiBjb3VudGZvcm1hdChjb25zdCBjaGFyICpmb3JtYXQsIGludCBlbmRjaGFyKQogewotCWludCBjb3VudCA9IDA7Ci0JaW50IGxldmVsID0gMDsKLQl3aGlsZSAobGV2ZWwgPiAwIHx8ICpmb3JtYXQgIT0gZW5kY2hhcikgewotCQlzd2l0Y2ggKCpmb3JtYXQpIHsKLQkJY2FzZSAnXDAnOgotCQkJLyogUHJlbWF0dXJlIGVuZCAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkidW5tYXRjaGVkIHBhcmVuIGluIGZvcm1hdCIpOwotCQkJcmV0dXJuIC0xOwotCQljYXNlICcoJzoKLQkJY2FzZSAnWyc6Ci0JCWNhc2UgJ3snOgotCQkJaWYgKGxldmVsID09IDApCi0JCQkJY291bnQrKzsKLQkJCWxldmVsKys7Ci0JCQlicmVhazsKLQkJY2FzZSAnKSc6Ci0JCWNhc2UgJ10nOgotCQljYXNlICd9JzoKLQkJCWxldmVsLS07Ci0JCQlicmVhazsKLQkJY2FzZSAnIyc6Ci0JCWNhc2UgJyYnOgotCQljYXNlICcsJzoKLQkJY2FzZSAnOic6Ci0JCWNhc2UgJyAnOgotCQljYXNlICdcdCc6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmIChsZXZlbCA9PSAwKQotCQkJCWNvdW50Kys7Ci0JCX0KLQkJZm9ybWF0Kys7Ci0JfQotCXJldHVybiBjb3VudDsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGludCBsZXZlbCA9IDA7CisgICAgd2hpbGUgKGxldmVsID4gMCB8fCAqZm9ybWF0ICE9IGVuZGNoYXIpIHsKKyAgICAgICAgc3dpdGNoICgqZm9ybWF0KSB7CisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIC8qIFByZW1hdHVyZSBlbmQgKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5tYXRjaGVkIHBhcmVuIGluIGZvcm1hdCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlICcoJzoKKyAgICAgICAgY2FzZSAnWyc6CisgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgaWYgKGxldmVsID09IDApCisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnKSc6CisgICAgICAgIGNhc2UgJ10nOgorICAgICAgICBjYXNlICd9JzoKKyAgICAgICAgICAgIGxldmVsLS07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnIyc6CisgICAgICAgIGNhc2UgJyYnOgorICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgY2FzZSAnOic6CisgICAgICAgIGNhc2UgJyAnOgorICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0Kys7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKIH0KIAogCkBAIC0xNTgsNDg2ICsxNTgsNDg2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZG9fbWtkaWN0KGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGVuZGNoYXIsIGludCBuLCBpbnQgZmxhZ3MpCiB7Ci0JUHlPYmplY3QgKmQ7Ci0JaW50IGk7Ci0JaW50IGl0ZW1mYWlsZWQgPSAwOwotCWlmIChuIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChkID0gUHlEaWN0X05ldygpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgYmFpbCBpbW1lZGlhdGVseSBvbiBlcnJvciBhcyB0aGlzIHdpbGwgbGVhawotCSAgIHJlZmNvdW50cyBvbiBhbnkgJ04nIGFyZ3VtZW50cy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSs9IDIpIHsKLQkJUHlPYmplY3QgKmssICp2OwotCQlpbnQgZXJyOwotCQlrID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOwotCQlpZiAoayA9PSBOVUxMKSB7Ci0JCQlpdGVtZmFpbGVkID0gMTsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCWsgPSBQeV9Ob25lOwotCQl9Ci0JCXYgPSBkb19ta3ZhbHVlKHBfZm9ybWF0LCBwX3ZhLCBmbGFncyk7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCWl0ZW1mYWlsZWQgPSAxOwotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJdiA9IFB5X05vbmU7Ci0JCX0KLQkJZXJyID0gUHlEaWN0X1NldEl0ZW0oZCwgaywgdik7Ci0JCVB5X0RFQ1JFRihrKTsKLQkJUHlfREVDUkVGKHYpOwotCQlpZiAoZXJyIDwgMCB8fCBpdGVtZmFpbGVkKSB7Ci0JCQlQeV9ERUNSRUYoZCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlpZiAoZCAhPSBOVUxMICYmICoqcF9mb3JtYXQgIT0gZW5kY2hhcikgewotCQlQeV9ERUNSRUYoZCk7Ci0JCWQgPSBOVUxMOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIlVubWF0Y2hlZCBwYXJlbiBpbiBmb3JtYXQiKTsKLQl9Ci0JZWxzZSBpZiAoZW5kY2hhcikKLQkJKysqcF9mb3JtYXQ7Ci0JcmV0dXJuIGQ7CisgICAgUHlPYmplY3QgKmQ7CisgICAgaW50IGk7CisgICAgaW50IGl0ZW1mYWlsZWQgPSAwOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkID0gUHlEaWN0X05ldygpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgYmFpbCBpbW1lZGlhdGVseSBvbiBlcnJvciBhcyB0aGlzIHdpbGwgbGVhaworICAgICAgIHJlZmNvdW50cyBvbiBhbnkgJ04nIGFyZ3VtZW50cy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSs9IDIpIHsKKyAgICAgICAgUHlPYmplY3QgKmssICp2OworICAgICAgICBpbnQgZXJyOworICAgICAgICBrID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOworICAgICAgICBpZiAoayA9PSBOVUxMKSB7CisgICAgICAgICAgICBpdGVtZmFpbGVkID0gMTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIGsgPSBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIHYgPSBkb19ta3ZhbHVlKHBfZm9ybWF0LCBwX3ZhLCBmbGFncyk7CisgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGl0ZW1mYWlsZWQgPSAxOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgdiA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oZCwgaywgdik7CisgICAgICAgIFB5X0RFQ1JFRihrKTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICBpZiAoZXJyIDwgMCB8fCBpdGVtZmFpbGVkKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZCAhPSBOVUxMICYmICoqcF9mb3JtYXQgIT0gZW5kY2hhcikgeworICAgICAgICBQeV9ERUNSRUYoZCk7CisgICAgICAgIGQgPSBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5tYXRjaGVkIHBhcmVuIGluIGZvcm1hdCIpOworICAgIH0KKyAgICBlbHNlIGlmIChlbmRjaGFyKQorICAgICAgICArKypwX2Zvcm1hdDsKKyAgICByZXR1cm4gZDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRvX21rbGlzdChjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBlbmRjaGFyLCBpbnQgbiwgaW50IGZsYWdzKQogewotCVB5T2JqZWN0ICp2OwotCWludCBpOwotCWludCBpdGVtZmFpbGVkID0gMDsKLQlpZiAobiA8IDApCi0JCXJldHVybiBOVUxMOwotCXYgPSBQeUxpc3RfTmV3KG4pOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCS8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBiYWlsIGltbWVkaWF0ZWx5IG9uIGVycm9yIGFzIHRoaXMgd2lsbCBsZWFrCi0JICAgcmVmY291bnRzIG9uIGFueSAnTicgYXJndW1lbnRzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKncgPSBkb19ta3ZhbHVlKHBfZm9ybWF0LCBwX3ZhLCBmbGFncyk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCWl0ZW1mYWlsZWQgPSAxOwotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJdyA9IFB5X05vbmU7Ci0JCX0KLQkJUHlMaXN0X1NFVF9JVEVNKHYsIGksIHcpOwotCX0KKyAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgaTsKKyAgICBpbnQgaXRlbWZhaWxlZCA9IDA7CisgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2ID0gUHlMaXN0X05ldyhuKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgYmFpbCBpbW1lZGlhdGVseSBvbiBlcnJvciBhcyB0aGlzIHdpbGwgbGVhaworICAgICAgIHJlZmNvdW50cyBvbiBhbnkgJ04nIGFyZ3VtZW50cy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOworICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpdGVtZmFpbGVkID0gMTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHcgPSBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIFB5TGlzdF9TRVRfSVRFTSh2LCBpLCB3KTsKKyAgICB9CiAKLQlpZiAoaXRlbWZhaWxlZCkgewotCQkvKiBkb19ta3ZhbHVlKCkgc2hvdWxkIGhhdmUgYWxyZWFkeSBzZXQgYW4gZXJyb3IgKi8KLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCoqcF9mb3JtYXQgIT0gZW5kY2hhcikgewotCQlQeV9ERUNSRUYodik7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiVW5tYXRjaGVkIHBhcmVuIGluIGZvcm1hdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGVuZGNoYXIpCi0JCSsrKnBfZm9ybWF0OwotCXJldHVybiB2OworICAgIGlmIChpdGVtZmFpbGVkKSB7CisgICAgICAgIC8qIGRvX21rdmFsdWUoKSBzaG91bGQgaGF2ZSBhbHJlYWR5IHNldCBhbiBlcnJvciAqLworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoKipwX2Zvcm1hdCAhPSBlbmRjaGFyKSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVubWF0Y2hlZCBwYXJlbiBpbiBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChlbmRjaGFyKQorICAgICAgICArKypwX2Zvcm1hdDsKKyAgICByZXR1cm4gdjsKIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIHN0YXRpYyBpbnQKIF91c3RybGVuKFB5X1VOSUNPREUgKnUpCiB7Ci0JaW50IGkgPSAwOwotCVB5X1VOSUNPREUgKnYgPSB1OwotCXdoaWxlICgqdiAhPSAwKSB7IGkrKzsgdisrOyB9IAotCXJldHVybiBpOworICAgIGludCBpID0gMDsKKyAgICBQeV9VTklDT0RFICp2ID0gdTsKKyAgICB3aGlsZSAoKnYgIT0gMCkgeyBpKys7IHYrKzsgfQorICAgIHJldHVybiBpOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb19ta3R1cGxlKGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGVuZGNoYXIsIGludCBuLCBpbnQgZmxhZ3MpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JaW50IGk7Ci0JaW50IGl0ZW1mYWlsZWQgPSAwOwotCWlmIChuIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCh2ID0gUHlUdXBsZV9OZXcobikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCS8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBiYWlsIGltbWVkaWF0ZWx5IG9uIGVycm9yIGFzIHRoaXMgd2lsbCBsZWFrCi0JICAgcmVmY291bnRzIG9uIGFueSAnTicgYXJndW1lbnRzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKncgPSBkb19ta3ZhbHVlKHBfZm9ybWF0LCBwX3ZhLCBmbGFncyk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCWl0ZW1mYWlsZWQgPSAxOwotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJdyA9IFB5X05vbmU7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTSh2LCBpLCB3KTsKLQl9Ci0JaWYgKGl0ZW1mYWlsZWQpIHsKLQkJLyogZG9fbWt2YWx1ZSgpIHNob3VsZCBoYXZlIGFscmVhZHkgc2V0IGFuIGVycm9yICovCi0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgqKnBfZm9ybWF0ICE9IGVuZGNoYXIpIHsKLQkJUHlfREVDUkVGKHYpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIlVubWF0Y2hlZCBwYXJlbiBpbiBmb3JtYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChlbmRjaGFyKQotCQkrKypwX2Zvcm1hdDsKLQlyZXR1cm4gdjsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgaTsKKyAgICBpbnQgaXRlbWZhaWxlZCA9IDA7CisgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHYgPSBQeVR1cGxlX05ldyhuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogTm90ZSB0aGF0IHdlIGNhbid0IGJhaWwgaW1tZWRpYXRlbHkgb24gZXJyb3IgYXMgdGhpcyB3aWxsIGxlYWsKKyAgICAgICByZWZjb3VudHMgb24gYW55ICdOJyBhcmd1bWVudHMuICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdyA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEsIGZsYWdzKTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgaXRlbWZhaWxlZCA9IDE7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICB3ID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIGksIHcpOworICAgIH0KKyAgICBpZiAoaXRlbWZhaWxlZCkgeworICAgICAgICAvKiBkb19ta3ZhbHVlKCkgc2hvdWxkIGhhdmUgYWxyZWFkeSBzZXQgYW4gZXJyb3IgKi8KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCoqcF9mb3JtYXQgIT0gZW5kY2hhcikgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbm1hdGNoZWQgcGFyZW4gaW4gZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZW5kY2hhcikKKyAgICAgICAgKysqcF9mb3JtYXQ7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb19ta3ZhbHVlKGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzKQogewotCWZvciAoOzspIHsKLQkJc3dpdGNoICgqKCpwX2Zvcm1hdCkrKykgewotCQljYXNlICcoJzoKLQkJCXJldHVybiBkb19ta3R1cGxlKHBfZm9ybWF0LCBwX3ZhLCAnKScsCi0JCQkJCSAgY291bnRmb3JtYXQoKnBfZm9ybWF0LCAnKScpLCBmbGFncyk7CisgICAgZm9yICg7OykgeworICAgICAgICBzd2l0Y2ggKCooKnBfZm9ybWF0KSsrKSB7CisgICAgICAgIGNhc2UgJygnOgorICAgICAgICAgICAgcmV0dXJuIGRvX21rdHVwbGUocF9mb3JtYXQsIHBfdmEsICcpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Zm9ybWF0KCpwX2Zvcm1hdCwgJyknKSwgZmxhZ3MpOwogCi0JCWNhc2UgJ1snOgotCQkJcmV0dXJuIGRvX21rbGlzdChwX2Zvcm1hdCwgcF92YSwgJ10nLAotCQkJCQkgY291bnRmb3JtYXQoKnBfZm9ybWF0LCAnXScpLCBmbGFncyk7CisgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgcmV0dXJuIGRvX21rbGlzdChwX2Zvcm1hdCwgcF92YSwgJ10nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICddJyksIGZsYWdzKTsKIAotCQljYXNlICd7JzoKLQkJCXJldHVybiBkb19ta2RpY3QocF9mb3JtYXQsIHBfdmEsICd9JywKLQkJCQkJIGNvdW50Zm9ybWF0KCpwX2Zvcm1hdCwgJ30nKSwgZmxhZ3MpOworICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgIHJldHVybiBkb19ta2RpY3QocF9mb3JtYXQsIHBfdmEsICd9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRmb3JtYXQoKnBfZm9ybWF0LCAnfScpLCBmbGFncyk7CiAKLQkJY2FzZSAnYic6Ci0JCWNhc2UgJ0InOgotCQljYXNlICdoJzoKLQkJY2FzZSAnaSc6Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdmFfYXJnKCpwX3ZhLCBpbnQpKTsKLQkJCQotCQljYXNlICdIJzoKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIGludCkpOworICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgY2FzZSAnQic6CisgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl2YV9hcmcoKnBfdmEsIGludCkpOwogCi0JCWNhc2UgJ0knOgotCQl7Ci0JCQl1bnNpZ25lZCBpbnQgbjsKLQkJCW4gPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIGludCk7Ci0JCQlpZiAobiA+ICh1bnNpZ25lZCBsb25nKVB5SW50X0dldE1heCgpKQotCQkJCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyluKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobik7Ci0JCX0KLQkJCi0JCWNhc2UgJ24nOgorICAgICAgICBjYXNlICdIJzoKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIGludCkpOworCisgICAgICAgIGNhc2UgJ0knOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICAgICAgICAgIG4gPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIGludCk7CisgICAgICAgICAgICBpZiAobiA+ICh1bnNpZ25lZCBsb25nKVB5SW50X0dldE1heCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyluKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobik7CisgICAgICAgIH0KKworICAgICAgICBjYXNlICduJzoKICNpZiBTSVpFT0ZfU0laRV9UIT1TSVpFT0ZfTE9ORwotCQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCkpOworICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCkpOwogI2VuZGlmCi0JCQkvKiBGYWxsIHRocm91Z2ggZnJvbSAnbicgdG8gJ2wnIGlmIFB5X3NzaXplX3QgaXMgbG9uZyAqLwotCQljYXNlICdsJzoKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YV9hcmcoKnBfdmEsIGxvbmcpKTsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCBmcm9tICduJyB0byAnbCcgaWYgUHlfc3NpemVfdCBpcyBsb25nICovCisgICAgICAgIGNhc2UgJ2wnOgorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhX2FyZygqcF92YSwgbG9uZykpOwogCi0JCWNhc2UgJ2snOgotCQl7Ci0JCQl1bnNpZ25lZCBsb25nIG47Ci0JCQluID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBsb25nKTsKLQkJCWlmIChuID4gKHVuc2lnbmVkIGxvbmcpUHlJbnRfR2V0TWF4KCkpCi0JCQkJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKG4pOwotCQkJZWxzZQotCQkJCXJldHVybiBQeUludF9Gcm9tTG9uZyhuKTsKLQkJfQorICAgICAgICBjYXNlICdrJzoKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuOworICAgICAgICAgICAgbiA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgbG9uZyk7CisgICAgICAgICAgICBpZiAobiA+ICh1bnNpZ25lZCBsb25nKVB5SW50X0dldE1heCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhuKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobik7CisgICAgICAgIH0KIAogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCWNhc2UgJ0wnOgotCQkJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORyl2YV9hcmcoKnBfdmEsIFBZX0xPTkdfTE9ORykpOworICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpdmFfYXJnKCpwX3ZhLCBQWV9MT05HX0xPTkcpKTsKIAotCQljYXNlICdLJzoKLQkJCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORyl2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORykpOworICAgICAgICBjYXNlICdLJzoKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORyl2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORykpOwogI2VuZGlmCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQljYXNlICd1JzoKLQkJewotCQkJUHlPYmplY3QgKnY7Ci0JCQlQeV9VTklDT0RFICp1ID0gdmFfYXJnKCpwX3ZhLCBQeV9VTklDT0RFICopOwotCQkJUHlfc3NpemVfdCBuOwkKLQkJCWlmICgqKnBfZm9ybWF0ID09ICcjJykgewotCQkJCSsrKnBfZm9ybWF0OwotCQkJCWlmIChmbGFncyAmIEZMQUdfU0laRV9UKQotCQkJCQluID0gdmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90KTsKLQkJCQllbHNlCi0JCQkJCW4gPSB2YV9hcmcoKnBfdmEsIGludCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbiA9IC0xOwotCQkJaWYgKHUgPT0gTlVMTCkgewotCQkJCXYgPSBQeV9Ob25lOwotCQkJCVB5X0lOQ1JFRih2KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChuIDwgMCkKLQkJCQkJbiA9IF91c3RybGVuKHUpOwotCQkJCXYgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUodSwgbik7Ci0JCQl9Ci0JCQlyZXR1cm4gdjsKLQkJfQorICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgeworICAgICAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgICAgICBQeV9VTklDT0RFICp1ID0gdmFfYXJnKCpwX3ZhLCBQeV9VTklDT0RFICopOworICAgICAgICAgICAgUHlfc3NpemVfdCBuOworICAgICAgICAgICAgaWYgKCoqcF9mb3JtYXQgPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgKysqcF9mb3JtYXQ7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpCisgICAgICAgICAgICAgICAgICAgIG4gPSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbiA9IHZhX2FyZygqcF92YSwgaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuID0gLTE7CisgICAgICAgICAgICBpZiAodSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdiA9IFB5X05vbmU7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgICAgICBuID0gX3VzdHJsZW4odSk7CisgICAgICAgICAgICAgICAgdiA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZSh1LCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CiAjZW5kaWYKLQkJY2FzZSAnZic6Ci0JCWNhc2UgJ2QnOgotCQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgKLQkJCQkoZG91YmxlKXZhX2FyZygqcF92YSwgdmFfZG91YmxlKSk7CisgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoCisgICAgICAgICAgICAgICAgKGRvdWJsZSl2YV9hcmcoKnBfdmEsIHZhX2RvdWJsZSkpOwogCiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCQljYXNlICdEJzoKLQkJCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KAotCQkJCSooKFB5X2NvbXBsZXggKil2YV9hcmcoKnBfdmEsIFB5X2NvbXBsZXggKikpKTsKKyAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleCgKKyAgICAgICAgICAgICAgICAqKChQeV9jb21wbGV4ICopdmFfYXJnKCpwX3ZhLCBQeV9jb21wbGV4ICopKSk7CiAjZW5kaWYgLyogV0lUSE9VVF9DT01QTEVYICovCiAKLQkJY2FzZSAnYyc6Ci0JCXsKLQkJCWNoYXIgcFsxXTsKLQkJCXBbMF0gPSAoY2hhcil2YV9hcmcoKnBfdmEsIGludCk7Ci0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocCwgMSk7Ci0JCX0KKyAgICAgICAgY2FzZSAnYyc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgcFsxXTsKKyAgICAgICAgICAgIHBbMF0gPSAoY2hhcil2YV9hcmcoKnBfdmEsIGludCk7CisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocCwgMSk7CisgICAgICAgIH0KIAotCQljYXNlICdzJzoKLQkJY2FzZSAneic6Ci0JCXsKLQkJCVB5T2JqZWN0ICp2OwotCQkJY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjaGFyICopOwotCQkJUHlfc3NpemVfdCBuOwotCQkJaWYgKCoqcF9mb3JtYXQgPT0gJyMnKSB7Ci0JCQkJKysqcF9mb3JtYXQ7Ci0JCQkJaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpCi0JCQkJCW4gPSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QpOwotCQkJCWVsc2UKLQkJCQkJbiA9IHZhX2FyZygqcF92YSwgaW50KTsKLQkJCX0KLQkJCWVsc2UKLQkJCQluID0gLTE7Ci0JCQlpZiAoc3RyID09IE5VTEwpIHsKLQkJCQl2ID0gUHlfTm9uZTsKLQkJCQlQeV9JTkNSRUYodik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobiA8IDApIHsKLQkJCQkJc2l6ZV90IG0gPSBzdHJsZW4oc3RyKTsKLQkJCQkJaWYgKG0gPiBQWV9TU0laRV9UX01BWCkgewotCQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCQkJInN0cmluZyB0b28gbG9uZyBmb3IgUHl0aG9uIHN0cmluZyIpOwotCQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJCX0KLQkJCQkJbiA9IChQeV9zc2l6ZV90KW07Ci0JCQkJfQotCQkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdHIsIG4pOwotCQkJfQotCQkJcmV0dXJuIHY7Ci0JCX0KKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgIGNhc2UgJ3onOgorICAgICAgICB7CisgICAgICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgICAgIGNoYXIgKnN0ciA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbjsKKyAgICAgICAgICAgIGlmICgqKnBfZm9ybWF0ID09ICcjJykgeworICAgICAgICAgICAgICAgICsrKnBfZm9ybWF0OworICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZMQUdfU0laRV9UKQorICAgICAgICAgICAgICAgICAgICBuID0gdmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG4gPSB2YV9hcmcoKnBfdmEsIGludCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbiA9IC0xOworICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdiA9IFB5X05vbmU7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtID0gc3RybGVuKHN0cik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtID4gUFlfU1NJWkVfVF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgdG9vIGxvbmcgZm9yIFB5dGhvbiBzdHJpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG4gPSAoUHlfc3NpemVfdCltOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyLCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CiAKLQkJY2FzZSAnTic6Ci0JCWNhc2UgJ1MnOgotCQljYXNlICdPJzoKLQkJaWYgKCoqcF9mb3JtYXQgPT0gJyYnKSB7Ci0JCQl0eXBlZGVmIFB5T2JqZWN0ICooKmNvbnZlcnRlcikodm9pZCAqKTsKLQkJCWNvbnZlcnRlciBmdW5jID0gdmFfYXJnKCpwX3ZhLCBjb252ZXJ0ZXIpOwotCQkJdm9pZCAqYXJnID0gdmFfYXJnKCpwX3ZhLCB2b2lkICopOwotCQkJKysqcF9mb3JtYXQ7Ci0JCQlyZXR1cm4gKCpmdW5jKShhcmcpOwotCQl9Ci0JCWVsc2UgewotCQkJUHlPYmplY3QgKnY7Ci0JCQl2ID0gdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKTsKLQkJCWlmICh2ICE9IE5VTEwpIHsKLQkJCQlpZiAoKigqcF9mb3JtYXQgLSAxKSAhPSAnTicpCi0JCQkJCVB5X0lOQ1JFRih2KTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJCS8qIElmIGEgTlVMTCB3YXMgcGFzc2VkCi0JCQkJICogYmVjYXVzZSBhIGNhbGwgdGhhdCBzaG91bGQKLQkJCQkgKiBoYXZlIGNvbnN0cnVjdGVkIGEgdmFsdWUKLQkJCQkgKiBmYWlsZWQsIHRoYXQncyBPSywgYW5kIHdlCi0JCQkJICogcGFzcyB0aGUgZXJyb3Igb247IGJ1dCBpZgotCQkJCSAqIG5vIGVycm9yIG9jY3VycmVkIGl0J3Mgbm90Ci0JCQkJICogY2xlYXIgdGhhdCB0aGUgY2FsbGVyIGtuZXcKLQkJCQkgKiB3aGF0IHNoZSB3YXMgZG9pbmcuICovCi0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkiTlVMTCBvYmplY3QgcGFzc2VkIHRvIFB5X0J1aWxkVmFsdWUiKTsKLQkJCXJldHVybiB2OwotCQl9CisgICAgICAgIGNhc2UgJ04nOgorICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgY2FzZSAnTyc6CisgICAgICAgIGlmICgqKnBfZm9ybWF0ID09ICcmJykgeworICAgICAgICAgICAgdHlwZWRlZiBQeU9iamVjdCAqKCpjb252ZXJ0ZXIpKHZvaWQgKik7CisgICAgICAgICAgICBjb252ZXJ0ZXIgZnVuYyA9IHZhX2FyZygqcF92YSwgY29udmVydGVyKTsKKyAgICAgICAgICAgIHZvaWQgKmFyZyA9IHZhX2FyZygqcF92YSwgdm9pZCAqKTsKKyAgICAgICAgICAgICsrKnBfZm9ybWF0OworICAgICAgICAgICAgcmV0dXJuICgqZnVuYykoYXJnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICAgICAgdiA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKik7CisgICAgICAgICAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKCooKnBfZm9ybWF0IC0gMSkgIT0gJ04nKQorICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAvKiBJZiBhIE5VTEwgd2FzIHBhc3NlZAorICAgICAgICAgICAgICAgICAqIGJlY2F1c2UgYSBjYWxsIHRoYXQgc2hvdWxkCisgICAgICAgICAgICAgICAgICogaGF2ZSBjb25zdHJ1Y3RlZCBhIHZhbHVlCisgICAgICAgICAgICAgICAgICogZmFpbGVkLCB0aGF0J3MgT0ssIGFuZCB3ZQorICAgICAgICAgICAgICAgICAqIHBhc3MgdGhlIGVycm9yIG9uOyBidXQgaWYKKyAgICAgICAgICAgICAgICAgKiBubyBlcnJvciBvY2N1cnJlZCBpdCdzIG5vdAorICAgICAgICAgICAgICAgICAqIGNsZWFyIHRoYXQgdGhlIGNhbGxlciBrbmV3CisgICAgICAgICAgICAgICAgICogd2hhdCBzaGUgd2FzIGRvaW5nLiAqLworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIk5VTEwgb2JqZWN0IHBhc3NlZCB0byBQeV9CdWlsZFZhbHVlIik7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQogCi0JCWNhc2UgJzonOgotCQljYXNlICcsJzoKLQkJY2FzZSAnICc6Ci0JCWNhc2UgJ1x0JzoKLQkJCWJyZWFrOworICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgY2FzZSAnLCc6CisgICAgICAgIGNhc2UgJyAnOgorICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICBicmVhazsKIAotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJiYWQgZm9ybWF0IGNoYXIgcGFzc2VkIHRvIFB5X0J1aWxkVmFsdWUiKTsKLQkJCXJldHVybiBOVUxMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICJiYWQgZm9ybWF0IGNoYXIgcGFzc2VkIHRvIFB5X0J1aWxkVmFsdWUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCX0KLQl9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIAogUHlPYmplY3QgKgogUHlfQnVpbGRWYWx1ZShjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOwotCVB5T2JqZWN0KiByZXR2YWw7Ci0JdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JcmV0dmFsID0gdmFfYnVpbGRfdmFsdWUoZm9ybWF0LCB2YSwgMCk7Ci0JdmFfZW5kKHZhKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIHZhX2xpc3QgdmE7CisgICAgUHlPYmplY3QqIHJldHZhbDsKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICByZXR2YWwgPSB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCAwKTsKKyAgICB2YV9lbmQodmEpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeV9CdWlsZFZhbHVlX1NpemVUKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7Ci0JUHlPYmplY3QqIHJldHZhbDsKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQlyZXR2YWwgPSB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCBGTEFHX1NJWkVfVCk7Ci0JdmFfZW5kKHZhKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIHZhX2xpc3QgdmE7CisgICAgUHlPYmplY3QqIHJldHZhbDsKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICByZXR2YWwgPSB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCBGTEFHX1NJWkVfVCk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBQeU9iamVjdCAqCiBQeV9WYUJ1aWxkVmFsdWUoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQogewotCXJldHVybiB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCAwKTsKKyAgICByZXR1cm4gdmFfYnVpbGRfdmFsdWUoZm9ybWF0LCB2YSwgMCk7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQogewotCXJldHVybiB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCBGTEFHX1NJWkVfVCk7CisgICAgcmV0dXJuIHZhX2J1aWxkX3ZhbHVlKGZvcm1hdCwgdmEsIEZMQUdfU0laRV9UKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHZhX2J1aWxkX3ZhbHVlKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSwgaW50IGZsYWdzKQogewotCWNvbnN0IGNoYXIgKmYgPSBmb3JtYXQ7Ci0JaW50IG4gPSBjb3VudGZvcm1hdChmLCAnXDAnKTsKLQl2YV9saXN0IGx2YTsKKyAgICBjb25zdCBjaGFyICpmID0gZm9ybWF0OworICAgIGludCBuID0gY291bnRmb3JtYXQoZiwgJ1wwJyk7CisgICAgdmFfbGlzdCBsdmE7CiAKICNpZmRlZiBWQV9MSVNUX0lTX0FSUkFZCi0JbWVtY3B5KGx2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CisgICAgbWVtY3B5KGx2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CiAjZWxzZQogI2lmZGVmIF9fdmFfY29weQotCV9fdmFfY29weShsdmEsIHZhKTsKKyAgICBfX3ZhX2NvcHkobHZhLCB2YSk7CiAjZWxzZQotCWx2YSA9IHZhOworICAgIGx2YSA9IHZhOwogI2VuZGlmCiAjZW5kaWYKIAotCWlmIChuIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG4gPT0gMCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlpZiAobiA9PSAxKQotCQlyZXR1cm4gZG9fbWt2YWx1ZSgmZiwgJmx2YSwgZmxhZ3MpOwotCXJldHVybiBkb19ta3R1cGxlKCZmLCAmbHZhLCAnXDAnLCBuLCBmbGFncyk7CisgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGlmIChuID09IDEpCisgICAgICAgIHJldHVybiBkb19ta3ZhbHVlKCZmLCAmbHZhLCBmbGFncyk7CisgICAgcmV0dXJuIGRvX21rdHVwbGUoJmYsICZsdmEsICdcMCcsIG4sIGZsYWdzKTsKIH0KIAogCiBQeU9iamVjdCAqCiBQeUV2YWxfQ2FsbEZ1bmN0aW9uKFB5T2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmFyZ3M7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKnJlczsKKyAgICB2YV9saXN0IHZhcmdzOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQl2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKKyAgICB2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKIAotCWFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YXJncyk7Ci0JdmFfZW5kKHZhcmdzKTsKKyAgICBhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmFyZ3MpOworICAgIHZhX2VuZCh2YXJncyk7CiAKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KG9iaiwgYXJncyk7Ci0JUHlfREVDUkVGKGFyZ3MpOworICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KG9iaiwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKIFB5T2JqZWN0ICoKIFB5RXZhbF9DYWxsTWV0aG9kKFB5T2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm1ldGhvZG5hbWUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmFyZ3M7Ci0JUHlPYmplY3QgKm1ldGg7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKnJlczsKKyAgICB2YV9saXN0IHZhcmdzOworICAgIFB5T2JqZWN0ICptZXRoOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQltZXRoID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosIG1ldGhvZG5hbWUpOwotCWlmIChtZXRoID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG1ldGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgbWV0aG9kbmFtZSk7CisgICAgaWYgKG1ldGggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKKyAgICB2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKIAotCWFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YXJncyk7Ci0JdmFfZW5kKHZhcmdzKTsKKyAgICBhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmFyZ3MpOworICAgIHZhX2VuZCh2YXJncyk7CiAKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihtZXRoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG1ldGgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChtZXRoLCBhcmdzKTsKLQlQeV9ERUNSRUYobWV0aCk7Ci0JUHlfREVDUkVGKGFyZ3MpOworICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KG1ldGgsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihtZXRoKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIGludAogUHlNb2R1bGVfQWRkT2JqZWN0KFB5T2JqZWN0ICptLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqbykKIHsKLQlQeU9iamVjdCAqZGljdDsKLQlpZiAoIVB5TW9kdWxlX0NoZWNrKG0pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgIlB5TW9kdWxlX0FkZE9iamVjdCgpIG5lZWRzIG1vZHVsZSBhcyBmaXJzdCBhcmciKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIW8pIHsKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIlB5TW9kdWxlX0FkZE9iamVjdCgpIG5lZWRzIG5vbi1OVUxMIHZhbHVlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgaWYgKCFQeU1vZHVsZV9DaGVjayhtKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiUHlNb2R1bGVfQWRkT2JqZWN0KCkgbmVlZHMgbW9kdWxlIGFzIGZpcnN0IGFyZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghbykgeworICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeU1vZHVsZV9BZGRPYmplY3QoKSBuZWVkcyBub24tTlVMTCB2YWx1ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JZGljdCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQkvKiBJbnRlcm5hbCBlcnJvciAtLSBtb2R1bGVzIG11c3QgaGF2ZSBhIGRpY3QhICovCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgIm1vZHVsZSAnJXMnIGhhcyBubyBfX2RpY3RfXyIsCi0JCQkgICAgIFB5TW9kdWxlX0dldE5hbWUobSkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBuYW1lLCBvKSkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihvKTsKLQlyZXR1cm4gMDsKKyAgICBkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIC8qIEludGVybmFsIGVycm9yIC0tIG1vZHVsZXMgbXVzdCBoYXZlIGEgZGljdCEgKi8KKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAibW9kdWxlICclcycgaGFzIG5vIF9fZGljdF9fIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5TW9kdWxlX0dldE5hbWUobSkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBuYW1lLCBvKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihvKTsKKyAgICByZXR1cm4gMDsKIH0KIAotaW50IAoraW50CiBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChQeU9iamVjdCAqbSwgY29uc3QgY2hhciAqbmFtZSwgbG9uZyB2YWx1ZSkKIHsKLQlQeU9iamVjdCAqbyA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKLQlpZiAoIW8pCi0JCXJldHVybiAtMTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sIG5hbWUsIG8pID09IDApCi0JCXJldHVybiAwOwotCVB5X0RFQ1JFRihvKTsKLQlyZXR1cm4gLTE7CisgICAgUHlPYmplY3QgKm8gPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CisgICAgaWYgKCFvKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCBuYW1lLCBvKSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYobyk7CisgICAgcmV0dXJuIC0xOwogfQogCi1pbnQgCitpbnQKIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KFB5T2JqZWN0ICptLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqbyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsdWUpOwotCWlmICghbykKLQkJcmV0dXJuIC0xOwotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgbmFtZSwgbykgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JUHlfREVDUkVGKG8pOwotCXJldHVybiAtMTsKKyAgICBQeU9iamVjdCAqbyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsdWUpOworICAgIGlmICghbykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgbmFtZSwgbykgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKG8pOworICAgIHJldHVybiAtMTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9teXNucHJpbnRmLmMgYi9QeXRob24vbXlzbnByaW50Zi5jCmluZGV4IDMxNzM4NjMuLjM5ZTNmZjEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9teXNucHJpbnRmLmMKKysrIGIvUHl0aG9uL215c25wcmludGYuYwpAQCAtMjAsMjAgKzIwLDIwIEBACiAKICAgIFJldHVybiB2YWx1ZSAocnYpOgogCi0JV2hlbiAwIDw9IHJ2IDwgc2l6ZSwgdGhlIG91dHB1dCBjb252ZXJzaW9uIHdhcyB1bmV4Y2VwdGlvbmFsLCBhbmQKLQlydiBjaGFyYWN0ZXJzIHdlcmUgd3JpdHRlbiB0byBzdHIgKGV4Y2x1ZGluZyBhIHRyYWlsaW5nIFwwIGJ5dGUgYXQKLQlzdHJbcnZdKS4KKyAgICBXaGVuIDAgPD0gcnYgPCBzaXplLCB0aGUgb3V0cHV0IGNvbnZlcnNpb24gd2FzIHVuZXhjZXB0aW9uYWwsIGFuZAorICAgIHJ2IGNoYXJhY3RlcnMgd2VyZSB3cml0dGVuIHRvIHN0ciAoZXhjbHVkaW5nIGEgdHJhaWxpbmcgXDAgYnl0ZSBhdAorICAgIHN0cltydl0pLgogCi0JV2hlbiBydiA+PSBzaXplLCBvdXRwdXQgY29udmVyc2lvbiB3YXMgdHJ1bmNhdGVkLCBhbmQgYSBidWZmZXIgb2YKLQlzaXplIHJ2KzEgd291bGQgaGF2ZSBiZWVuIG5lZWRlZCB0byBhdm9pZCB0cnVuY2F0aW9uLiAgc3RyW3NpemUtMV0KLQlpcyBcMCBpbiB0aGlzIGNhc2UuCisgICAgV2hlbiBydiA+PSBzaXplLCBvdXRwdXQgY29udmVyc2lvbiB3YXMgdHJ1bmNhdGVkLCBhbmQgYSBidWZmZXIgb2YKKyAgICBzaXplIHJ2KzEgd291bGQgaGF2ZSBiZWVuIG5lZWRlZCB0byBhdm9pZCB0cnVuY2F0aW9uLiAgc3RyW3NpemUtMV0KKyAgICBpcyBcMCBpbiB0aGlzIGNhc2UuCiAKLQlXaGVuIHJ2IDwgMCwgInNvbWV0aGluZyBiYWQgaGFwcGVuZWQiLiAgc3RyW3NpemUtMV0gaXMgXDAgaW4gdGhpcwotCWNhc2UgdG9vLCBidXQgdGhlIHJlc3Qgb2Ygc3RyIGlzIHVucmVsaWFibGUuICBJdCBjb3VsZCBiZSB0aGF0Ci0JYW4gZXJyb3IgaW4gZm9ybWF0IGNvZGVzIHdhcyBkZXRlY3RlZCBieSBsaWJjLCBvciBvbiBwbGF0Zm9ybXMKLQl3aXRoIGEgbm9uLUM5OSB2c25wcmludGYgc2ltcGx5IHRoYXQgdGhlIGJ1ZmZlciB3YXNuJ3QgYmlnIGVub3VnaAotCXRvIGF2b2lkIHRydW5jYXRpb24sIG9yIG9uIHBsYXRmb3JtcyB3aXRob3V0IGFueSB2c25wcmludGYgdGhhdAotCVB5TWVtX01hbGxvYyBjb3VsZG4ndCBvYnRhaW4gc3BhY2UgZm9yIGEgdGVtcCBidWZmZXIuCisgICAgV2hlbiBydiA8IDAsICJzb21ldGhpbmcgYmFkIGhhcHBlbmVkIi4gIHN0cltzaXplLTFdIGlzIFwwIGluIHRoaXMKKyAgICBjYXNlIHRvbywgYnV0IHRoZSByZXN0IG9mIHN0ciBpcyB1bnJlbGlhYmxlLiAgSXQgY291bGQgYmUgdGhhdAorICAgIGFuIGVycm9yIGluIGZvcm1hdCBjb2RlcyB3YXMgZGV0ZWN0ZWQgYnkgbGliYywgb3Igb24gcGxhdGZvcm1zCisgICAgd2l0aCBhIG5vbi1DOTkgdnNucHJpbnRmIHNpbXBseSB0aGF0IHRoZSBidWZmZXIgd2Fzbid0IGJpZyBlbm91Z2gKKyAgICB0byBhdm9pZCB0cnVuY2F0aW9uLCBvciBvbiBwbGF0Zm9ybXMgd2l0aG91dCBhbnkgdnNucHJpbnRmIHRoYXQKKyAgICBQeU1lbV9NYWxsb2MgY291bGRuJ3Qgb2J0YWluIHNwYWNlIGZvciBhIHRlbXAgYnVmZmVyLgogCiAgICBDQVVUSU9OOiAgVW5saWtlIEM5OSwgc3RyICE9IE5VTEwgYW5kIHNpemUgPiAwIGFyZSByZXF1aXJlZC4KICovCkBAIC00MSw2NSArNDEsNjUgQEAKIGludAogUHlPU19zbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjb25zdCAgY2hhciAgKmZvcm1hdCwgLi4uKQogewotCWludCByYzsKLQl2YV9saXN0IHZhOworICAgIGludCByYzsKKyAgICB2YV9saXN0IHZhOwogCi0JdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JcmMgPSBQeU9TX3ZzbnByaW50ZihzdHIsIHNpemUsIGZvcm1hdCwgdmEpOwotCXZhX2VuZCh2YSk7Ci0JcmV0dXJuIHJjOworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIHJjID0gUHlPU192c25wcmludGYoc3RyLCBzaXplLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworICAgIHJldHVybiByYzsKIH0KIAogaW50CiBQeU9TX3ZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICAqZm9ybWF0LCB2YV9saXN0IHZhKQogewotCWludCBsZW47ICAvKiAjIGJ5dGVzIHdyaXR0ZW4sIGV4Y2x1ZGluZyBcMCAqLworICAgIGludCBsZW47ICAvKiAjIGJ5dGVzIHdyaXR0ZW4sIGV4Y2x1ZGluZyBcMCAqLwogI2lmZGVmIEhBVkVfU05QUklOVEYKICNkZWZpbmUgX1B5T1NfdnNucHJpbnRmX0VYVFJBX1NQQUNFIDEKICNlbHNlCiAjZGVmaW5lIF9QeU9TX3ZzbnByaW50Zl9FWFRSQV9TUEFDRSA1MTIKLQljaGFyICpidWZmZXI7CisgICAgY2hhciAqYnVmZmVyOwogI2VuZGlmCi0JYXNzZXJ0KHN0ciAhPSBOVUxMKTsKLQlhc3NlcnQoc2l6ZSA+IDApOwotCWFzc2VydChmb3JtYXQgIT0gTlVMTCk7Ci0JLyogV2UgdGFrZSBhIHNpemVfdCBhcyBpbnB1dCBidXQgcmV0dXJuIGFuIGludC4gIFNhbml0eSBjaGVjawotCSAqIG91ciBpbnB1dCBzbyB0aGF0IGl0IHdvbid0IGNhdXNlIGFuIG92ZXJmbG93IGluIHRoZQotICAgICAgICAgKiB2c25wcmludGYgcmV0dXJuIHZhbHVlIG9yIHRoZSBidWZmZXIgbWFsbG9jIHNpemUuICAqLwotCWlmIChzaXplID4gSU5UX01BWCAtIF9QeU9TX3ZzbnByaW50Zl9FWFRSQV9TUEFDRSkgewotCQlsZW4gPSAtNjY2OwotCQlnb3RvIERvbmU7Ci0JfQorICAgIGFzc2VydChzdHIgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHNpemUgPiAwKTsKKyAgICBhc3NlcnQoZm9ybWF0ICE9IE5VTEwpOworICAgIC8qIFdlIHRha2UgYSBzaXplX3QgYXMgaW5wdXQgYnV0IHJldHVybiBhbiBpbnQuICBTYW5pdHkgY2hlY2sKKyAgICAgKiBvdXIgaW5wdXQgc28gdGhhdCBpdCB3b24ndCBjYXVzZSBhbiBvdmVyZmxvdyBpbiB0aGUKKyAgICAgKiB2c25wcmludGYgcmV0dXJuIHZhbHVlIG9yIHRoZSBidWZmZXIgbWFsbG9jIHNpemUuICAqLworICAgIGlmIChzaXplID4gSU5UX01BWCAtIF9QeU9TX3ZzbnByaW50Zl9FWFRSQV9TUEFDRSkgeworICAgICAgICBsZW4gPSAtNjY2OworICAgICAgICBnb3RvIERvbmU7CisgICAgfQogCiAjaWZkZWYgSEFWRV9TTlBSSU5URgotCWxlbiA9IHZzbnByaW50ZihzdHIsIHNpemUsIGZvcm1hdCwgdmEpOworICAgIGxlbiA9IHZzbnByaW50ZihzdHIsIHNpemUsIGZvcm1hdCwgdmEpOwogI2Vsc2UKLQkvKiBFbXVsYXRlIGl0LiAqLwotCWJ1ZmZlciA9IFB5TWVtX01BTExPQyhzaXplICsgX1B5T1NfdnNucHJpbnRmX0VYVFJBX1NQQUNFKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJbGVuID0gLTY2NjsKLQkJZ290byBEb25lOwotCX0KKyAgICAvKiBFbXVsYXRlIGl0LiAqLworICAgIGJ1ZmZlciA9IFB5TWVtX01BTExPQyhzaXplICsgX1B5T1NfdnNucHJpbnRmX0VYVFJBX1NQQUNFKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgbGVuID0gLTY2NjsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KIAotCWxlbiA9IHZzcHJpbnRmKGJ1ZmZlciwgZm9ybWF0LCB2YSk7Ci0JaWYgKGxlbiA8IDApCi0JCS8qIGlnbm9yZSB0aGUgZXJyb3IgKi87CisgICAgbGVuID0gdnNwcmludGYoYnVmZmVyLCBmb3JtYXQsIHZhKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgLyogaWdub3JlIHRoZSBlcnJvciAqLzsKIAotCWVsc2UgaWYgKChzaXplX3QpbGVuID49IHNpemUgKyBfUHlPU192c25wcmludGZfRVhUUkFfU1BBQ0UpCi0JCVB5X0ZhdGFsRXJyb3IoIkJ1ZmZlciBvdmVyZmxvdyBpbiBQeU9TX3NucHJpbnRmL1B5T1NfdnNucHJpbnRmIik7CisgICAgZWxzZSBpZiAoKHNpemVfdClsZW4gPj0gc2l6ZSArIF9QeU9TX3ZzbnByaW50Zl9FWFRSQV9TUEFDRSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQnVmZmVyIG92ZXJmbG93IGluIFB5T1Nfc25wcmludGYvUHlPU192c25wcmludGYiKTsKIAotCWVsc2UgewotCQljb25zdCBzaXplX3QgdG9fY29weSA9IChzaXplX3QpbGVuIDwgc2l6ZSA/Ci0JCQkJCShzaXplX3QpbGVuIDogc2l6ZSAtIDE7Ci0JCWFzc2VydCh0b19jb3B5IDwgc2l6ZSk7Ci0JCW1lbWNweShzdHIsIGJ1ZmZlciwgdG9fY29weSk7Ci0JCXN0clt0b19jb3B5XSA9ICdcMCc7Ci0JfQotCVB5TWVtX0ZSRUUoYnVmZmVyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHRvX2NvcHkgPSAoc2l6ZV90KWxlbiA8IHNpemUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KWxlbiA6IHNpemUgLSAxOworICAgICAgICBhc3NlcnQodG9fY29weSA8IHNpemUpOworICAgICAgICBtZW1jcHkoc3RyLCBidWZmZXIsIHRvX2NvcHkpOworICAgICAgICBzdHJbdG9fY29weV0gPSAnXDAnOworICAgIH0KKyAgICBQeU1lbV9GUkVFKGJ1ZmZlcik7CiAjZW5kaWYKIERvbmU6Ci0JaWYgKHNpemUgPiAwKQotCQlzdHJbc2l6ZS0xXSA9ICdcMCc7Ci0JcmV0dXJuIGxlbjsKKyAgICBpZiAoc2l6ZSA+IDApCisgICAgICAgIHN0cltzaXplLTFdID0gJ1wwJzsKKyAgICByZXR1cm4gbGVuOwogI3VuZGVmIF9QeU9TX3ZzbnByaW50Zl9FWFRSQV9TUEFDRQogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL215c3RydG91bC5jIGIvUHl0aG9uL215c3RydG91bC5jCmluZGV4IGViZDQ2OGMuLmMzNWJlODEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9teXN0cnRvdWwuYworKysgYi9QeXRob24vbXlzdHJ0b3VsLmMKQEAgLTE4LDQzICsxOCw0MyBAQAogICogaSAqIGJhc2UgZG9lc24ndCBvdmVyZmxvdyB1bnNpZ25lZCBsb25nLgogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzbWFsbG1heFtdID0gewotCTAsIC8qIGJhc2VzIDAgYW5kIDEgYXJlIGludmFsaWQgKi8KLQkwLAotCVVMT05HX01BWCAvIDIsCi0JVUxPTkdfTUFYIC8gMywKLQlVTE9OR19NQVggLyA0LAotCVVMT05HX01BWCAvIDUsCi0JVUxPTkdfTUFYIC8gNiwKLQlVTE9OR19NQVggLyA3LAotCVVMT05HX01BWCAvIDgsCi0JVUxPTkdfTUFYIC8gOSwKLQlVTE9OR19NQVggLyAxMCwKLQlVTE9OR19NQVggLyAxMSwKLQlVTE9OR19NQVggLyAxMiwKLQlVTE9OR19NQVggLyAxMywKLQlVTE9OR19NQVggLyAxNCwKLQlVTE9OR19NQVggLyAxNSwKLQlVTE9OR19NQVggLyAxNiwKLQlVTE9OR19NQVggLyAxNywKLQlVTE9OR19NQVggLyAxOCwKLQlVTE9OR19NQVggLyAxOSwKLQlVTE9OR19NQVggLyAyMCwKLQlVTE9OR19NQVggLyAyMSwKLQlVTE9OR19NQVggLyAyMiwKLQlVTE9OR19NQVggLyAyMywKLQlVTE9OR19NQVggLyAyNCwKLQlVTE9OR19NQVggLyAyNSwKLQlVTE9OR19NQVggLyAyNiwKLQlVTE9OR19NQVggLyAyNywKLQlVTE9OR19NQVggLyAyOCwKLQlVTE9OR19NQVggLyAyOSwKLQlVTE9OR19NQVggLyAzMCwKLQlVTE9OR19NQVggLyAzMSwKLQlVTE9OR19NQVggLyAzMiwKLQlVTE9OR19NQVggLyAzMywKLQlVTE9OR19NQVggLyAzNCwKLQlVTE9OR19NQVggLyAzNSwKLQlVTE9OR19NQVggLyAzNiwKKyAgICAwLCAvKiBiYXNlcyAwIGFuZCAxIGFyZSBpbnZhbGlkICovCisgICAgMCwKKyAgICBVTE9OR19NQVggLyAyLAorICAgIFVMT05HX01BWCAvIDMsCisgICAgVUxPTkdfTUFYIC8gNCwKKyAgICBVTE9OR19NQVggLyA1LAorICAgIFVMT05HX01BWCAvIDYsCisgICAgVUxPTkdfTUFYIC8gNywKKyAgICBVTE9OR19NQVggLyA4LAorICAgIFVMT05HX01BWCAvIDksCisgICAgVUxPTkdfTUFYIC8gMTAsCisgICAgVUxPTkdfTUFYIC8gMTEsCisgICAgVUxPTkdfTUFYIC8gMTIsCisgICAgVUxPTkdfTUFYIC8gMTMsCisgICAgVUxPTkdfTUFYIC8gMTQsCisgICAgVUxPTkdfTUFYIC8gMTUsCisgICAgVUxPTkdfTUFYIC8gMTYsCisgICAgVUxPTkdfTUFYIC8gMTcsCisgICAgVUxPTkdfTUFYIC8gMTgsCisgICAgVUxPTkdfTUFYIC8gMTksCisgICAgVUxPTkdfTUFYIC8gMjAsCisgICAgVUxPTkdfTUFYIC8gMjEsCisgICAgVUxPTkdfTUFYIC8gMjIsCisgICAgVUxPTkdfTUFYIC8gMjMsCisgICAgVUxPTkdfTUFYIC8gMjQsCisgICAgVUxPTkdfTUFYIC8gMjUsCisgICAgVUxPTkdfTUFYIC8gMjYsCisgICAgVUxPTkdfTUFYIC8gMjcsCisgICAgVUxPTkdfTUFYIC8gMjgsCisgICAgVUxPTkdfTUFYIC8gMjksCisgICAgVUxPTkdfTUFYIC8gMzAsCisgICAgVUxPTkdfTUFYIC8gMzEsCisgICAgVUxPTkdfTUFYIC8gMzIsCisgICAgVUxPTkdfTUFYIC8gMzMsCisgICAgVUxPTkdfTUFYIC8gMzQsCisgICAgVUxPTkdfTUFYIC8gMzUsCisgICAgVUxPTkdfTUFYIC8gMzYsCiB9OwogCiAvKiBtYXhpbXVtIGRpZ2l0cyB0aGF0IGNhbid0IGV2ZXIgb3ZlcmZsb3cgZm9yIGJhc2VzIDIgdGhyb3VnaCAzNiwKQEAgLTYzLDIyMyArNjMsMjIzIEBACiAgKi8KICNpZiBTSVpFT0ZfTE9ORyA9PSA0CiBzdGF0aWMgaW50IGRpZ2l0bGltaXRbXSA9IHsKLQkwLCAgMCwgMzIsIDIwLCAxNiwgMTMsIDEyLCAxMSwgMTAsIDEwLCAgLyogIDAgLSAgOSAqLwotCTksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICAvKiAxMCAtIDE5ICovCi0JNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIC8qIDIwIC0gMjkgKi8KLQk2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2fTsgICAgICAgICAgICAgLyogMzAgLSAzNiAqLworICAgIDAsICAwLCAzMiwgMjAsIDE2LCAxMywgMTIsIDExLCAxMCwgMTAsICAvKiAgMCAtICA5ICovCisgICAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIC8qIDEwIC0gMTkgKi8KKyAgICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgLyogMjAgLSAyOSAqLworICAgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDZ9OyAgICAgICAgICAgICAvKiAzMCAtIDM2ICovCiAjZWxpZiBTSVpFT0ZfTE9ORyA9PSA4CiAvKiBbaW50KG1hdGguZmxvb3IobWF0aC5sb2coMioqNjQsIGkpKSkgZm9yIGkgaW4gcmFuZ2UoMiwgMzcpXSAqLwogc3RhdGljIGludCBkaWdpdGxpbWl0W10gPSB7Ci0JIDAsICAgMCwgNjQsIDQwLCAzMiwgMjcsIDI0LCAyMiwgMjEsIDIwLCAgLyogIDAgLSAgOSAqLwotCTE5LCAgMTgsIDE3LCAxNywgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgIC8qIDEwIC0gMTkgKi8KLQkxNCwgIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsICAvKiAyMCAtIDI5ICovCi0JMTMsICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyfTsgICAgICAgICAgICAgLyogMzAgLSAzNiAqLworICAgICAgICAgMCwgICAwLCA2NCwgNDAsIDMyLCAyNywgMjQsIDIyLCAyMSwgMjAsICAvKiAgMCAtICA5ICovCisgICAgMTksICAxOCwgMTcsIDE3LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAgLyogMTAgLSAxOSAqLworICAgIDE0LCAgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgIC8qIDIwIC0gMjkgKi8KKyAgICAxMywgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTJ9OyAgICAgICAgICAgICAvKiAzMCAtIDM2ICovCiAjZWxzZQogI2Vycm9yICJOZWVkIHRhYmxlIGZvciBTSVpFT0ZfTE9ORyIKICNlbmRpZgogCiAvKgotKioJc3RydG91bAotKioJCVRoaXMgaXMgYSBnZW5lcmFsIHB1cnBvc2Ugcm91dGluZSBmb3IgY29udmVydGluZwotKioJCWFuIGFzY2lpIHN0cmluZyB0byBhbiBpbnRlZ2VyIGluIGFuIGFyYml0cmFyeSBiYXNlLgotKioJCUxlYWRpbmcgd2hpdGUgc3BhY2UgaXMgaWdub3JlZC4gIElmICdiYXNlJyBpcyB6ZXJvCi0qKgkJaXQgbG9va3MgZm9yIGEgbGVhZGluZyAwLCAwYiwgMEIsIDBvLCAwTywgMHggb3IgMFgKLSoqCQl0byB0ZWxsIHdoaWNoIGJhc2UuICBJZiB0aGVzZSBhcmUgYWJzZW50IGl0IGRlZmF1bHRzCi0qKgkJdG8gMTAuIEJhc2UgbXVzdCBiZSAwIG9yIGJldHdlZW4gMiBhbmQgMzYgKGluY2x1c2l2ZSkuCi0qKgkJSWYgJ3B0cicgaXMgbm9uLU5VTEwgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0bwotKioJCXRoZSBlbmQgb2YgdGhlIHNjYW4uCi0qKgkJRXJyb3JzIGR1ZSB0byBiYWQgcG9pbnRlcnMgd2lsbCBwcm9iYWJseSByZXN1bHQgaW4KLSoqCQlleGNlcHRpb25zIC0gd2UgZG9uJ3QgY2hlY2sgZm9yIHRoZW0uCisqKiAgICAgIHN0cnRvdWwKKyoqICAgICAgICAgICAgICBUaGlzIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIHJvdXRpbmUgZm9yIGNvbnZlcnRpbmcKKyoqICAgICAgICAgICAgICBhbiBhc2NpaSBzdHJpbmcgdG8gYW4gaW50ZWdlciBpbiBhbiBhcmJpdHJhcnkgYmFzZS4KKyoqICAgICAgICAgICAgICBMZWFkaW5nIHdoaXRlIHNwYWNlIGlzIGlnbm9yZWQuICBJZiAnYmFzZScgaXMgemVybworKiogICAgICAgICAgICAgIGl0IGxvb2tzIGZvciBhIGxlYWRpbmcgMCwgMGIsIDBCLCAwbywgME8sIDB4IG9yIDBYCisqKiAgICAgICAgICAgICAgdG8gdGVsbCB3aGljaCBiYXNlLiAgSWYgdGhlc2UgYXJlIGFic2VudCBpdCBkZWZhdWx0cworKiogICAgICAgICAgICAgIHRvIDEwLiBCYXNlIG11c3QgYmUgMCBvciBiZXR3ZWVuIDIgYW5kIDM2IChpbmNsdXNpdmUpLgorKiogICAgICAgICAgICAgIElmICdwdHInIGlzIG5vbi1OVUxMIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8KKyoqICAgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBzY2FuLgorKiogICAgICAgICAgICAgIEVycm9ycyBkdWUgdG8gYmFkIHBvaW50ZXJzIHdpbGwgcHJvYmFibHkgcmVzdWx0IGluCisqKiAgICAgICAgICAgICAgZXhjZXB0aW9ucyAtIHdlIGRvbid0IGNoZWNrIGZvciB0aGVtLgogKi8KIHVuc2lnbmVkIGxvbmcKIFB5T1Nfc3RydG91bChyZWdpc3RlciBjaGFyICpzdHIsIGNoYXIgKipwdHIsIGludCBiYXNlKQogewotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsgLyogcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiAqLwotCXJlZ2lzdGVyIGludCBjOwkgCS8qIGN1cnJlbnQgaW5wdXQgY2hhcmFjdGVyICovCi0JcmVnaXN0ZXIgaW50IG92bGltaXQ7IAkvKiByZXF1aXJlZCBkaWdpdHMgdG8gb3ZlcmZsb3cgKi8KKyAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7IC8qIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gKi8KKyAgICByZWdpc3RlciBpbnQgYzsgICAgICAgICAgICAgLyogY3VycmVudCBpbnB1dCBjaGFyYWN0ZXIgKi8KKyAgICByZWdpc3RlciBpbnQgb3ZsaW1pdDsgICAgICAgLyogcmVxdWlyZWQgZGlnaXRzIHRvIG92ZXJmbG93ICovCiAKLQkvKiBza2lwIGxlYWRpbmcgd2hpdGUgc3BhY2UgKi8KLQl3aGlsZSAoKnN0ciAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzdHIpKSkKLQkJKytzdHI7CisgICAgLyogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCisgICAgd2hpbGUgKCpzdHIgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCisgICAgICAgICsrc3RyOwogCi0JLyogY2hlY2sgZm9yIGxlYWRpbmcgMCBvciAweCBmb3IgYXV0by1iYXNlIG9yIGJhc2UgMTYgKi8KLQlzd2l0Y2ggKGJhc2UpIHsKLQljYXNlIDA6CQkvKiBsb29rIGZvciBsZWFkaW5nIDAsIDBiLCAwbyBvciAweCAqLwotCQlpZiAoKnN0ciA9PSAnMCcpIHsKLQkJCSsrc3RyOwotCQkJaWYgKCpzdHIgPT0gJ3gnIHx8ICpzdHIgPT0gJ1gnKSB7Ci0JCQkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMHggKi8KLQkJCQlpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDE2KSB7Ci0JCQkJCWlmIChwdHIpCi0JCQkJCQkqcHRyID0gc3RyOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJKytzdHI7Ci0JCQkJYmFzZSA9IDE2OwotCQkJfSBlbHNlIGlmICgqc3RyID09ICdvJyB8fCAqc3RyID09ICdPJykgewotCQkJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDBvICovCi0JCQkJaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSA4KSB7Ci0JCQkJCWlmIChwdHIpCi0JCQkJCQkqcHRyID0gc3RyOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJKytzdHI7Ci0JCQkJYmFzZSA9IDg7Ci0JCQl9IGVsc2UgaWYgKCpzdHIgPT0gJ2InIHx8ICpzdHIgPT0gJ0InKSB7Ci0JCQkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMGIgKi8KLQkJCQlpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDIpIHsKLQkJCQkJaWYgKHB0cikKLQkJCQkJCSpwdHIgPSBzdHI7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQkrK3N0cjsKLQkJCQliYXNlID0gMjsKLQkJCX0gZWxzZSB7Ci0JCQkJYmFzZSA9IDg7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJYmFzZSA9IDEwOwotCQlicmVhazsKKyAgICAvKiBjaGVjayBmb3IgbGVhZGluZyAwIG9yIDB4IGZvciBhdXRvLWJhc2Ugb3IgYmFzZSAxNiAqLworICAgIHN3aXRjaCAoYmFzZSkgeworICAgIGNhc2UgMDogICAgICAgICAgICAgLyogbG9vayBmb3IgbGVhZGluZyAwLCAwYiwgMG8gb3IgMHggKi8KKyAgICAgICAgaWYgKCpzdHIgPT0gJzAnKSB7CisgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgICAgIGlmICgqc3RyID09ICd4JyB8fCAqc3RyID09ICdYJykgeworICAgICAgICAgICAgICAgIC8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDB4ICovCisgICAgICAgICAgICAgICAgaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAxNikgeworICAgICAgICAgICAgICAgICAgICBpZiAocHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9IHN0cjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrc3RyOworICAgICAgICAgICAgICAgIGJhc2UgPSAxNjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKnN0ciA9PSAnbycgfHwgKnN0ciA9PSAnTycpIHsKKyAgICAgICAgICAgICAgICAvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAwbyAqLworICAgICAgICAgICAgICAgIGlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gOCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9IHN0cjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrc3RyOworICAgICAgICAgICAgICAgIGJhc2UgPSA4OworICAgICAgICAgICAgfSBlbHNlIGlmICgqc3RyID09ICdiJyB8fCAqc3RyID09ICdCJykgeworICAgICAgICAgICAgICAgIC8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDBiICovCisgICAgICAgICAgICAgICAgaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gc3RyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytzdHI7CisgICAgICAgICAgICAgICAgYmFzZSA9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJhc2UgPSA4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJhc2UgPSAxMDsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIDI6CS8qIHNraXAgbGVhZGluZyAwYiBvciAwQiAqLwotCQlpZiAoKnN0ciA9PSAnMCcpIHsKLQkJCSsrc3RyOwotCQkJaWYgKCpzdHIgPT0gJ2InIHx8ICpzdHIgPT0gJ0InKSB7Ci0JCQkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMGIgKi8KLQkJCQlpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDIpIHsKLQkJCQkJaWYgKHB0cikKLQkJCQkJCSpwdHIgPSBzdHI7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQkrK3N0cjsKLQkJCX0KLQkJfQotCQlicmVhazsKKyAgICBjYXNlIDI6ICAgICAvKiBza2lwIGxlYWRpbmcgMGIgb3IgMEIgKi8KKyAgICAgICAgaWYgKCpzdHIgPT0gJzAnKSB7CisgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgICAgIGlmICgqc3RyID09ICdiJyB8fCAqc3RyID09ICdCJykgeworICAgICAgICAgICAgICAgIC8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDBiICovCisgICAgICAgICAgICAgICAgaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gc3RyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytzdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIDg6CS8qIHNraXAgbGVhZGluZyAwbyBvciAwTyAqLwotCQlpZiAoKnN0ciA9PSAnMCcpIHsKLQkJCSsrc3RyOwotCQkJaWYgKCpzdHIgPT0gJ28nIHx8ICpzdHIgPT0gJ08nKSB7Ci0JCQkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMG8gKi8KLQkJCQlpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDgpIHsKLQkJCQkJaWYgKHB0cikKLQkJCQkJCSpwdHIgPSBzdHI7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQkrK3N0cjsKLQkJCX0KLQkJfQotCQlicmVhazsKKyAgICBjYXNlIDg6ICAgICAvKiBza2lwIGxlYWRpbmcgMG8gb3IgME8gKi8KKyAgICAgICAgaWYgKCpzdHIgPT0gJzAnKSB7CisgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgICAgIGlmICgqc3RyID09ICdvJyB8fCAqc3RyID09ICdPJykgeworICAgICAgICAgICAgICAgIC8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDBvICovCisgICAgICAgICAgICAgICAgaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSA4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gc3RyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytzdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIDE2OgkvKiBza2lwIGxlYWRpbmcgMHggb3IgMFggKi8KLQkJaWYgKCpzdHIgPT0gJzAnKSB7Ci0JCQkrK3N0cjsKLQkJCWlmICgqc3RyID09ICd4JyB8fCAqc3RyID09ICdYJykgewotCQkJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDB4ICovCi0JCQkJaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAxNikgewotCQkJCQlpZiAocHRyKQotCQkJCQkJKnB0ciA9IHN0cjsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCSsrc3RyOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICBjYXNlIDE2OiAgICAgICAgICAgIC8qIHNraXAgbGVhZGluZyAweCBvciAwWCAqLworICAgICAgICBpZiAoKnN0ciA9PSAnMCcpIHsKKyAgICAgICAgICAgICsrc3RyOworICAgICAgICAgICAgaWYgKCpzdHIgPT0gJ3gnIHx8ICpzdHIgPT0gJ1gnKSB7CisgICAgICAgICAgICAgICAgLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMHggKi8KKyAgICAgICAgICAgICAgICBpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gc3RyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytzdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JLyogY2F0Y2ggc2lsbHkgYmFzZXMgKi8KLQlpZiAoYmFzZSA8IDIgfHwgYmFzZSA+IDM2KSB7Ci0JCWlmIChwdHIpCi0JCQkqcHRyID0gc3RyOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogY2F0Y2ggc2lsbHkgYmFzZXMgKi8KKyAgICBpZiAoYmFzZSA8IDIgfHwgYmFzZSA+IDM2KSB7CisgICAgICAgIGlmIChwdHIpCisgICAgICAgICAgICAqcHRyID0gc3RyOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBza2lwIGxlYWRpbmcgemVyb2VzICovCi0Jd2hpbGUgKCpzdHIgPT0gJzAnKQotCQkrK3N0cjsKKyAgICAvKiBza2lwIGxlYWRpbmcgemVyb2VzICovCisgICAgd2hpbGUgKCpzdHIgPT0gJzAnKQorICAgICAgICArK3N0cjsKIAotCS8qIGJhc2UgaXMgZ3VhcmFudGVlZCB0byBiZSBpbiBbMiwgMzZdIGF0IHRoaXMgcG9pbnQgKi8KLQlvdmxpbWl0ID0gZGlnaXRsaW1pdFtiYXNlXTsKKyAgICAvKiBiYXNlIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW4gWzIsIDM2XSBhdCB0aGlzIHBvaW50ICovCisgICAgb3ZsaW1pdCA9IGRpZ2l0bGltaXRbYmFzZV07CiAKLQkvKiBkbyB0aGUgY29udmVyc2lvbiB1bnRpbCBub24tZGlnaXQgY2hhcmFjdGVyIGVuY291bnRlcmVkICovCi0Jd2hpbGUgKChjID0gX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzdHIpXSkgPCBiYXNlKSB7Ci0JCWlmIChvdmxpbWl0ID4gMCkgLyogbm8gb3ZlcmZsb3cgY2hlY2sgcmVxdWlyZWQgKi8KLQkJCXJlc3VsdCA9IHJlc3VsdCAqIGJhc2UgKyBjOwotCQllbHNlIHsgLyogcmVxdWlyZXMgb3ZlcmZsb3cgY2hlY2sgKi8KLQkJCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdGVtcF9yZXN1bHQ7CisgICAgLyogZG8gdGhlIGNvbnZlcnNpb24gdW50aWwgbm9uLWRpZ2l0IGNoYXJhY3RlciBlbmNvdW50ZXJlZCAqLworICAgIHdoaWxlICgoYyA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc3RyKV0pIDwgYmFzZSkgeworICAgICAgICBpZiAob3ZsaW1pdCA+IDApIC8qIG5vIG92ZXJmbG93IGNoZWNrIHJlcXVpcmVkICovCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKiBiYXNlICsgYzsKKyAgICAgICAgZWxzZSB7IC8qIHJlcXVpcmVzIG92ZXJmbG93IGNoZWNrICovCisgICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHRlbXBfcmVzdWx0OwogCi0JCQlpZiAob3ZsaW1pdCA8IDApIC8qIGd1YXJhbnRlZWQgb3ZlcmZsb3cgKi8KLQkJCQlnb3RvIG92ZXJmbG93ZWQ7CisgICAgICAgICAgICBpZiAob3ZsaW1pdCA8IDApIC8qIGd1YXJhbnRlZWQgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93ZWQ7CiAKLQkJCS8qIHRoZXJlIGNvdWxkIGJlIGFuIG92ZXJmbG93ICovCi0JCQkvKiBjaGVjayBvdmVyZmxvdyBqdXN0IGZyb20gc2hpZnRpbmcgKi8KLQkJCWlmIChyZXN1bHQgPiBzbWFsbG1heFtiYXNlXSkKLQkJCQlnb3RvIG92ZXJmbG93ZWQ7CisgICAgICAgICAgICAvKiB0aGVyZSBjb3VsZCBiZSBhbiBvdmVyZmxvdyAqLworICAgICAgICAgICAgLyogY2hlY2sgb3ZlcmZsb3cganVzdCBmcm9tIHNoaWZ0aW5nICovCisgICAgICAgICAgICBpZiAocmVzdWx0ID4gc21hbGxtYXhbYmFzZV0pCisgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvd2VkOwogCi0JCQlyZXN1bHQgKj0gYmFzZTsKKyAgICAgICAgICAgIHJlc3VsdCAqPSBiYXNlOwogCi0JCQkvKiBjaGVjayBvdmVyZmxvdyBmcm9tIHRoZSBkaWdpdCdzIHZhbHVlICovCi0JCQl0ZW1wX3Jlc3VsdCA9IHJlc3VsdCArIGM7Ci0JCQlpZiAodGVtcF9yZXN1bHQgPCByZXN1bHQpCi0JCQkJZ290byBvdmVyZmxvd2VkOworICAgICAgICAgICAgLyogY2hlY2sgb3ZlcmZsb3cgZnJvbSB0aGUgZGlnaXQncyB2YWx1ZSAqLworICAgICAgICAgICAgdGVtcF9yZXN1bHQgPSByZXN1bHQgKyBjOworICAgICAgICAgICAgaWYgKHRlbXBfcmVzdWx0IDwgcmVzdWx0KQorICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3dlZDsKIAotCQkJcmVzdWx0ID0gdGVtcF9yZXN1bHQ7Ci0JCX0KKyAgICAgICAgICAgIHJlc3VsdCA9IHRlbXBfcmVzdWx0OworICAgICAgICB9CiAKLQkJKytzdHI7Ci0JCS0tb3ZsaW1pdDsKLQl9CisgICAgICAgICsrc3RyOworICAgICAgICAtLW92bGltaXQ7CisgICAgfQogCi0JLyogc2V0IHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIHNjYW5uZWQgKi8KLQlpZiAocHRyKQotCQkqcHRyID0gc3RyOworICAgIC8qIHNldCBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBsYXN0IGNoYXJhY3RlciBzY2FubmVkICovCisgICAgaWYgKHB0cikKKyAgICAgICAgKnB0ciA9IHN0cjsKIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogb3ZlcmZsb3dlZDoKLQlpZiAocHRyKSB7Ci0JCS8qIHNwb29sIHRocm91Z2ggcmVtYWluaW5nIGRpZ2l0IGNoYXJhY3RlcnMgKi8KLQkJd2hpbGUgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc3RyKV0gPCBiYXNlKQotCQkJKytzdHI7Ci0JCSpwdHIgPSBzdHI7Ci0JfQotCWVycm5vID0gRVJBTkdFOwotCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKKyAgICBpZiAocHRyKSB7CisgICAgICAgIC8qIHNwb29sIHRocm91Z2ggcmVtYWluaW5nIGRpZ2l0IGNoYXJhY3RlcnMgKi8KKyAgICAgICAgd2hpbGUgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc3RyKV0gPCBiYXNlKQorICAgICAgICAgICAgKytzdHI7CisgICAgICAgICpwdHIgPSBzdHI7CisgICAgfQorICAgIGVycm5vID0gRVJBTkdFOworICAgIHJldHVybiAodW5zaWduZWQgbG9uZyktMTsKIH0KIAogLyogQ2hlY2tpbmcgZm9yIG92ZXJmbG93IGluIFB5T1Nfc3RydG9sIGlzIGEgUElUQTsgc2VlIGNvbW1lbnRzCiAgKiBhYm91dCBQWV9BQlNfTE9OR19NSU4gaW4gbG9uZ29iamVjdC5jLgogICovCi0jZGVmaW5lIFBZX0FCU19MT05HX01JTgkJKDAtKHVuc2lnbmVkIGxvbmcpTE9OR19NSU4pCisjZGVmaW5lIFBZX0FCU19MT05HX01JTiAgICAgICAgICgwLSh1bnNpZ25lZCBsb25nKUxPTkdfTUlOKQogCiBsb25nCiBQeU9TX3N0cnRvbChjaGFyICpzdHIsIGNoYXIgKipwdHIsIGludCBiYXNlKQogewotCWxvbmcgcmVzdWx0OwotCXVuc2lnbmVkIGxvbmcgdXJlc3VsdDsKLQljaGFyIHNpZ247CisgICAgbG9uZyByZXN1bHQ7CisgICAgdW5zaWduZWQgbG9uZyB1cmVzdWx0OworICAgIGNoYXIgc2lnbjsKIAotCXdoaWxlICgqc3RyICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnN0cikpKQotCQlzdHIrKzsKKyAgICB3aGlsZSAoKnN0ciAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzdHIpKSkKKyAgICAgICAgc3RyKys7CiAKLQlzaWduID0gKnN0cjsKLQlpZiAoc2lnbiA9PSAnKycgfHwgc2lnbiA9PSAnLScpCi0JCXN0cisrOworICAgIHNpZ24gPSAqc3RyOworICAgIGlmIChzaWduID09ICcrJyB8fCBzaWduID09ICctJykKKyAgICAgICAgc3RyKys7CiAKLQl1cmVzdWx0ID0gUHlPU19zdHJ0b3VsKHN0ciwgcHRyLCBiYXNlKTsKKyAgICB1cmVzdWx0ID0gUHlPU19zdHJ0b3VsKHN0ciwgcHRyLCBiYXNlKTsKIAotCWlmICh1cmVzdWx0IDw9ICh1bnNpZ25lZCBsb25nKUxPTkdfTUFYKSB7Ci0JCXJlc3VsdCA9IChsb25nKXVyZXN1bHQ7Ci0JCWlmIChzaWduID09ICctJykKLQkJCXJlc3VsdCA9IC1yZXN1bHQ7Ci0JfQotCWVsc2UgaWYgKHNpZ24gPT0gJy0nICYmIHVyZXN1bHQgPT0gUFlfQUJTX0xPTkdfTUlOKSB7Ci0JCXJlc3VsdCA9IExPTkdfTUlOOwotCX0KLQllbHNlIHsKLQkJZXJybm8gPSBFUkFOR0U7Ci0JCXJlc3VsdCA9IExPTkdfTUFYOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICh1cmVzdWx0IDw9ICh1bnNpZ25lZCBsb25nKUxPTkdfTUFYKSB7CisgICAgICAgIHJlc3VsdCA9IChsb25nKXVyZXN1bHQ7CisgICAgICAgIGlmIChzaWduID09ICctJykKKyAgICAgICAgICAgIHJlc3VsdCA9IC1yZXN1bHQ7CisgICAgfQorICAgIGVsc2UgaWYgKHNpZ24gPT0gJy0nICYmIHVyZXN1bHQgPT0gUFlfQUJTX0xPTkdfTUlOKSB7CisgICAgICAgIHJlc3VsdCA9IExPTkdfTUlOOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgICAgIHJlc3VsdCA9IExPTkdfTUFYOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3BlZXBob2xlLmMgYi9QeXRob24vcGVlcGhvbGUuYwppbmRleCBmYmM4MWZmLi4zMTNlYjQzIDEwMDY0NAotLS0gYS9QeXRob24vcGVlcGhvbGUuYworKysgYi9QeXRob24vcGVlcGhvbGUuYwpAQCAtMTIsNjUxICsxMiw2NTEgQEAKICNpbmNsdWRlICJvcGNvZGUuaCIKIAogI2RlZmluZSBHRVRBUkcoYXJyLCBpKSAoKGludCkoKGFycltpKzJdPDw4KSArIGFycltpKzFdKSkKLSNkZWZpbmUgVU5DT05ESVRJT05BTF9KVU1QKG9wKQkob3A9PUpVTVBfQUJTT0xVVEUgfHwgb3A9PUpVTVBfRk9SV0FSRCkKKyNkZWZpbmUgVU5DT05ESVRJT05BTF9KVU1QKG9wKSAgKG9wPT1KVU1QX0FCU09MVVRFIHx8IG9wPT1KVU1QX0ZPUldBUkQpCiAjZGVmaW5lIENPTkRJVElPTkFMX0pVTVAob3ApIChvcD09UE9QX0pVTVBfSUZfRkFMU0UgfHwgb3A9PVBPUF9KVU1QX0lGX1RSVUUgXAotCXx8IG9wPT1KVU1QX0lGX0ZBTFNFX09SX1BPUCB8fCBvcD09SlVNUF9JRl9UUlVFX09SX1BPUCkKKyAgICB8fCBvcD09SlVNUF9JRl9GQUxTRV9PUl9QT1AgfHwgb3A9PUpVTVBfSUZfVFJVRV9PUl9QT1ApCiAjZGVmaW5lIEFCU09MVVRFX0pVTVAob3ApIChvcD09SlVNUF9BQlNPTFVURSB8fCBvcD09Q09OVElOVUVfTE9PUCBcCi0JfHwgb3A9PVBPUF9KVU1QX0lGX0ZBTFNFIHx8IG9wPT1QT1BfSlVNUF9JRl9UUlVFIFwKLQl8fCBvcD09SlVNUF9JRl9GQUxTRV9PUl9QT1AgfHwgb3A9PUpVTVBfSUZfVFJVRV9PUl9QT1ApCisgICAgfHwgb3A9PVBPUF9KVU1QX0lGX0ZBTFNFIHx8IG9wPT1QT1BfSlVNUF9JRl9UUlVFIFwKKyAgICB8fCBvcD09SlVNUF9JRl9GQUxTRV9PUl9QT1AgfHwgb3A9PUpVTVBfSUZfVFJVRV9PUl9QT1ApCiAjZGVmaW5lIEpVTVBTX09OX1RSVUUob3ApIChvcD09UE9QX0pVTVBfSUZfVFJVRSB8fCBvcD09SlVNUF9JRl9UUlVFX09SX1BPUCkKICNkZWZpbmUgR0VUSlVNUFRHVChhcnIsIGkpIChHRVRBUkcoYXJyLGkpICsgKEFCU09MVVRFX0pVTVAoYXJyW2ldKSA/IDAgOiBpKzMpKQogI2RlZmluZSBTRVRBUkcoYXJyLCBpLCB2YWwpIGFycltpKzJdID0gdmFsPj44OyBhcnJbaSsxXSA9IHZhbCAmIDI1NQogI2RlZmluZSBDT0RFU0laRShvcCkgIChIQVNfQVJHKG9wKSA/IDMgOiAxKQogI2RlZmluZSBJU0JBU0lDQkxPQ0soYmxvY2tzLCBzdGFydCwgYnl0ZXMpIFwKLQkoYmxvY2tzW3N0YXJ0XT09YmxvY2tzW3N0YXJ0K2J5dGVzLTFdKQorICAgIChibG9ja3Nbc3RhcnRdPT1ibG9ja3Nbc3RhcnQrYnl0ZXMtMV0pCiAKIC8qIFJlcGxhY2UgTE9BRF9DT05TVCBjMS4gTE9BRF9DT05TVCBjMiAuLi4gTE9BRF9DT05TVCBjbiBCVUlMRF9UVVBMRSBuCi0gICB3aXRoCSAgIExPQURfQ09OU1QgKGMxLCBjMiwgLi4uIGNuKS4KKyAgIHdpdGggICAgTE9BRF9DT05TVCAoYzEsIGMyLCAuLi4gY24pLgogICAgVGhlIGNvbnN0cyB0YWJsZSBtdXN0IHN0aWxsIGJlIGluIGxpc3QgZm9ybSBzbyB0aGF0IHRoZQogICAgbmV3IGNvbnN0YW50IChjMSwgYzIsIC4uLiBjbikgY2FuIGJlIGFwcGVuZGVkLgogICAgQ2FsbGVkIHdpdGggY29kZXN0ciBwb2ludGluZyB0byB0aGUgZmlyc3QgTE9BRF9DT05TVC4KLSAgIEJhaWxzIG91dCB3aXRoIG5vIGNoYW5nZSBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgTE9BRF9DT05TVHMgaXMgbWlzc2luZy4gCisgICBCYWlscyBvdXQgd2l0aCBubyBjaGFuZ2UgaWYgb25lIG9yIG1vcmUgb2YgdGhlIExPQURfQ09OU1RzIGlzIG1pc3NpbmcuCiAgICBBbHNvIHdvcmtzIGZvciBCVUlMRF9MSVNUIHdoZW4gZm9sbG93ZWQgYnkgYW4gImluIiBvciAibm90IGluIiB0ZXN0LgogKi8KIHN0YXRpYyBpbnQKIHR1cGxlX29mX2NvbnN0YW50cyh1bnNpZ25lZCBjaGFyICpjb2Rlc3RyLCBQeV9zc2l6ZV90IG4sIFB5T2JqZWN0ICpjb25zdHMpCiB7Ci0JUHlPYmplY3QgKm5ld2NvbnN0LCAqY29uc3RhbnQ7Ci0JUHlfc3NpemVfdCBpLCBhcmcsIGxlbl9jb25zdHM7CisgICAgUHlPYmplY3QgKm5ld2NvbnN0LCAqY29uc3RhbnQ7CisgICAgUHlfc3NpemVfdCBpLCBhcmcsIGxlbl9jb25zdHM7CiAKLQkvKiBQcmUtY29uZGl0aW9ucyAqLwotCWFzc2VydChQeUxpc3RfQ2hlY2tFeGFjdChjb25zdHMpKTsKLQlhc3NlcnQoY29kZXN0cltuKjNdID09IEJVSUxEX1RVUExFIHx8IGNvZGVzdHJbbiozXSA9PSBCVUlMRF9MSVNUKTsKLQlhc3NlcnQoR0VUQVJHKGNvZGVzdHIsIChuKjMpKSA9PSBuKTsKLQlmb3IgKGk9MCA7IGk8biA7IGkrKykKLQkJYXNzZXJ0KGNvZGVzdHJbaSozXSA9PSBMT0FEX0NPTlNUKTsKKyAgICAvKiBQcmUtY29uZGl0aW9ucyAqLworICAgIGFzc2VydChQeUxpc3RfQ2hlY2tFeGFjdChjb25zdHMpKTsKKyAgICBhc3NlcnQoY29kZXN0cltuKjNdID09IEJVSUxEX1RVUExFIHx8IGNvZGVzdHJbbiozXSA9PSBCVUlMRF9MSVNUKTsKKyAgICBhc3NlcnQoR0VUQVJHKGNvZGVzdHIsIChuKjMpKSA9PSBuKTsKKyAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykKKyAgICAgICAgYXNzZXJ0KGNvZGVzdHJbaSozXSA9PSBMT0FEX0NPTlNUKTsKIAotCS8qIEJ1aWxkdXAgbmV3IHR1cGxlIG9mIGNvbnN0YW50cyAqLwotCW5ld2NvbnN0ID0gUHlUdXBsZV9OZXcobik7Ci0JaWYgKG5ld2NvbnN0ID09IE5VTEwpCi0JCXJldHVybiAwOwotCWxlbl9jb25zdHMgPSBQeUxpc3RfR0VUX1NJWkUoY29uc3RzKTsKLQlmb3IgKGk9MCA7IGk8biA7IGkrKykgewotCQlhcmcgPSBHRVRBUkcoY29kZXN0ciwgKGkqMykpOwotCQlhc3NlcnQoYXJnIDwgbGVuX2NvbnN0cyk7Ci0JCWNvbnN0YW50ID0gUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgYXJnKTsKLQkJUHlfSU5DUkVGKGNvbnN0YW50KTsKLQkJUHlUdXBsZV9TRVRfSVRFTShuZXdjb25zdCwgaSwgY29uc3RhbnQpOwotCX0KKyAgICAvKiBCdWlsZHVwIG5ldyB0dXBsZSBvZiBjb25zdGFudHMgKi8KKyAgICBuZXdjb25zdCA9IFB5VHVwbGVfTmV3KG4pOworICAgIGlmIChuZXdjb25zdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CisgICAgZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKKyAgICAgICAgYXJnID0gR0VUQVJHKGNvZGVzdHIsIChpKjMpKTsKKyAgICAgICAgYXNzZXJ0KGFyZyA8IGxlbl9jb25zdHMpOworICAgICAgICBjb25zdGFudCA9IFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIGFyZyk7CisgICAgICAgIFB5X0lOQ1JFRihjb25zdGFudCk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3Y29uc3QsIGksIGNvbnN0YW50KTsKKyAgICB9CiAKLQkvKiBBcHBlbmQgZm9sZGVkIGNvbnN0YW50IG9udG8gY29uc3RzICovCi0JaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBuZXdjb25zdCkpIHsKLQkJUHlfREVDUkVGKG5ld2NvbnN0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCVB5X0RFQ1JFRihuZXdjb25zdCk7CisgICAgLyogQXBwZW5kIGZvbGRlZCBjb25zdGFudCBvbnRvIGNvbnN0cyAqLworICAgIGlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgbmV3Y29uc3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeV9ERUNSRUYobmV3Y29uc3QpOwogCi0JLyogV3JpdGUgTk9QcyBvdmVyIG9sZCBMT0FEX0NPTlNUUyBhbmQKLQkgICBhZGQgYSBuZXcgTE9BRF9DT05TVCBuZXdjb25zdCBvbiB0b3Agb2YgdGhlIEJVSUxEX1RVUExFIG4gKi8KLQltZW1zZXQoY29kZXN0ciwgTk9QLCBuKjMpOwotCWNvZGVzdHJbbiozXSA9IExPQURfQ09OU1Q7Ci0JU0VUQVJHKGNvZGVzdHIsIChuKjMpLCBsZW5fY29uc3RzKTsKLQlyZXR1cm4gMTsKKyAgICAvKiBXcml0ZSBOT1BzIG92ZXIgb2xkIExPQURfQ09OU1RTIGFuZAorICAgICAgIGFkZCBhIG5ldyBMT0FEX0NPTlNUIG5ld2NvbnN0IG9uIHRvcCBvZiB0aGUgQlVJTERfVFVQTEUgbiAqLworICAgIG1lbXNldChjb2Rlc3RyLCBOT1AsIG4qMyk7CisgICAgY29kZXN0cltuKjNdID0gTE9BRF9DT05TVDsKKyAgICBTRVRBUkcoY29kZXN0ciwgKG4qMyksIGxlbl9jb25zdHMpOworICAgIHJldHVybiAxOwogfQogCiAvKiBSZXBsYWNlIExPQURfQ09OU1QgYzEuIExPQURfQ09OU1QgYzIgQklOT1AKLSAgIHdpdGgJICAgTE9BRF9DT05TVCBiaW5vcChjMSxjMikKKyAgIHdpdGggICAgTE9BRF9DT05TVCBiaW5vcChjMSxjMikKICAgIFRoZSBjb25zdHMgdGFibGUgbXVzdCBzdGlsbCBiZSBpbiBsaXN0IGZvcm0gc28gdGhhdCB0aGUKICAgIG5ldyBjb25zdGFudCBjYW4gYmUgYXBwZW5kZWQuCi0gICBDYWxsZWQgd2l0aCBjb2Rlc3RyIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBMT0FEX0NPTlNULiAKLSAgIEFiYW5kb25zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpZiB0aGUgZm9sZGluZyBmYWlscyAoaS5lLiAgMSsnYScpLiAgCisgICBDYWxsZWQgd2l0aCBjb2Rlc3RyIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBMT0FEX0NPTlNULgorICAgQWJhbmRvbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlmIHRoZSBmb2xkaW5nIGZhaWxzIChpLmUuICAxKydhJykuCiAgICBJZiB0aGUgbmV3IGNvbnN0YW50IGlzIGEgc2VxdWVuY2UsIG9ubHkgZm9sZHMgd2hlbiB0aGUgc2l6ZQotICAgaXMgYmVsb3cgYSB0aHJlc2hvbGQgdmFsdWUuCVRoYXQga2VlcHMgcHljIGZpbGVzIGZyb20KLSAgIGJlY29taW5nIGxhcmdlIGluIHRoZSBwcmVzZW5jZSBvZiBjb2RlIGxpa2U6CSAoTm9uZSwpKjEwMDAuCisgICBpcyBiZWxvdyBhIHRocmVzaG9sZCB2YWx1ZS4gIFRoYXQga2VlcHMgcHljIGZpbGVzIGZyb20KKyAgIGJlY29taW5nIGxhcmdlIGluIHRoZSBwcmVzZW5jZSBvZiBjb2RlIGxpa2U6ICAoTm9uZSwpKjEwMDAuCiAqLwogc3RhdGljIGludAogZm9sZF9iaW5vcHNfb25fY29uc3RhbnRzKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5T2JqZWN0ICpjb25zdHMpCiB7Ci0JUHlPYmplY3QgKm5ld2NvbnN0LCAqdiwgKnc7Ci0JUHlfc3NpemVfdCBsZW5fY29uc3RzLCBzaXplOwotCWludCBvcGNvZGU7CisgICAgUHlPYmplY3QgKm5ld2NvbnN0LCAqdiwgKnc7CisgICAgUHlfc3NpemVfdCBsZW5fY29uc3RzLCBzaXplOworICAgIGludCBvcGNvZGU7CiAKLQkvKiBQcmUtY29uZGl0aW9ucyAqLwotCWFzc2VydChQeUxpc3RfQ2hlY2tFeGFjdChjb25zdHMpKTsKLQlhc3NlcnQoY29kZXN0clswXSA9PSBMT0FEX0NPTlNUKTsKLQlhc3NlcnQoY29kZXN0clszXSA9PSBMT0FEX0NPTlNUKTsKKyAgICAvKiBQcmUtY29uZGl0aW9ucyAqLworICAgIGFzc2VydChQeUxpc3RfQ2hlY2tFeGFjdChjb25zdHMpKTsKKyAgICBhc3NlcnQoY29kZXN0clswXSA9PSBMT0FEX0NPTlNUKTsKKyAgICBhc3NlcnQoY29kZXN0clszXSA9PSBMT0FEX0NPTlNUKTsKIAotCS8qIENyZWF0ZSBuZXcgY29uc3RhbnQgKi8KLQl2ID0gUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgR0VUQVJHKGNvZGVzdHIsIDApKTsKLQl3ID0gUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgR0VUQVJHKGNvZGVzdHIsIDMpKTsKLQlvcGNvZGUgPSBjb2Rlc3RyWzZdOwotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JCWNhc2UgQklOQVJZX1BPV0VSOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9Qb3dlcih2LCB3LCBQeV9Ob25lKTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9NVUxUSVBMWToKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfTXVsdGlwbHkodiwgdyk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfRElWSURFOgotCQkJLyogQ2Fubm90IGZvbGQgdGhpcyBvcGVyYXRpb24gc3RhdGljYWxseSBzaW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBjYW4gZGVwZW5kIG9uIHRoZSBydW4tdGltZSBwcmVzZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIC1RbmV3IGZsYWcgKi8KLQkJCXJldHVybiAwOwotCQljYXNlIEJJTkFSWV9UUlVFX0RJVklERToKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfVHJ1ZURpdmlkZSh2LCB3KTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9GTE9PUl9ESVZJREU6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX0Zsb29yRGl2aWRlKHYsIHcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX01PRFVMTzoKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfUmVtYWluZGVyKHYsIHcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX0FERDoKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfQWRkKHYsIHcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX1NVQlRSQUNUOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9TdWJ0cmFjdCh2LCB3KTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9TVUJTQ1I6Ci0JCQluZXdjb25zdCA9IFB5T2JqZWN0X0dldEl0ZW0odiwgdyk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfTFNISUZUOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9Mc2hpZnQodiwgdyk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfUlNISUZUOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9Sc2hpZnQodiwgdyk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfQU5EOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9BbmQodiwgdyk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfWE9SOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9Yb3Iodiwgdyk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfT1I6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX09yKHYsIHcpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBDYWxsZWQgd2l0aCBhbiB1bmtub3duIG9wY29kZSAqLwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJICAgICAidW5leHBlY3RlZCBiaW5hcnkgb3BlcmF0aW9uICVkIG9uIGEgY29uc3RhbnQiLAotCQkJCSAgICAgb3Bjb2RlKTsKLQkJCXJldHVybiAwOwotCX0KLQlpZiAobmV3Y29uc3QgPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc2l6ZSA9IFB5T2JqZWN0X1NpemUobmV3Y29uc3QpOwotCWlmIChzaXplID09IC0xKQotCQlQeUVycl9DbGVhcigpOwotCWVsc2UgaWYgKHNpemUgPiAyMCkgewotCQlQeV9ERUNSRUYobmV3Y29uc3QpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogQ3JlYXRlIG5ldyBjb25zdGFudCAqLworICAgIHYgPSBQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBHRVRBUkcoY29kZXN0ciwgMCkpOworICAgIHcgPSBQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBHRVRBUkcoY29kZXN0ciwgMykpOworICAgIG9wY29kZSA9IGNvZGVzdHJbNl07CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBCSU5BUllfUE9XRVI6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX1Bvd2VyKHYsIHcsIFB5X05vbmUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX01VTFRJUExZOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9NdWx0aXBseSh2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9ESVZJREU6CisgICAgICAgICAgICAvKiBDYW5ub3QgZm9sZCB0aGlzIG9wZXJhdGlvbiBzdGF0aWNhbGx5IHNpbmNlCisgICAgICAgICAgICAgICB0aGUgcmVzdWx0IGNhbiBkZXBlbmQgb24gdGhlIHJ1bi10aW1lIHByZXNlbmNlCisgICAgICAgICAgICAgICBvZiB0aGUgLVFuZXcgZmxhZyAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgQklOQVJZX1RSVUVfRElWSURFOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9UcnVlRGl2aWRlKHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX0ZMT09SX0RJVklERToKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfRmxvb3JEaXZpZGUodiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfTU9EVUxPOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9SZW1haW5kZXIodiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfQUREOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9BZGQodiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfU1VCVFJBQ1Q6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX1N1YnRyYWN0KHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX1NVQlNDUjoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlPYmplY3RfR2V0SXRlbSh2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9MU0hJRlQ6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX0xzaGlmdCh2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9SU0hJRlQ6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX1JzaGlmdCh2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9BTkQ6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX0FuZCh2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9YT1I6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX1hvcih2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9PUjoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfT3Iodiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIENhbGxlZCB3aXRoIGFuIHVua25vd24gb3Bjb2RlICovCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIGJpbmFyeSBvcGVyYXRpb24gJWQgb24gYSBjb25zdGFudCIsCisgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChuZXdjb25zdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaXplID0gUHlPYmplY3RfU2l6ZShuZXdjb25zdCk7CisgICAgaWYgKHNpemUgPT0gLTEpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgZWxzZSBpZiAoc2l6ZSA+IDIwKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFwcGVuZCBmb2xkZWQgY29uc3RhbnQgaW50byBjb25zdHMgdGFibGUgKi8KLQlsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7Ci0JaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBuZXdjb25zdCkpIHsKLQkJUHlfREVDUkVGKG5ld2NvbnN0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCVB5X0RFQ1JFRihuZXdjb25zdCk7CisgICAgLyogQXBwZW5kIGZvbGRlZCBjb25zdGFudCBpbnRvIGNvbnN0cyB0YWJsZSAqLworICAgIGxlbl9jb25zdHMgPSBQeUxpc3RfR0VUX1NJWkUoY29uc3RzKTsKKyAgICBpZiAoUHlMaXN0X0FwcGVuZChjb25zdHMsIG5ld2NvbnN0KSkgeworICAgICAgICBQeV9ERUNSRUYobmV3Y29uc3QpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKIAotCS8qIFdyaXRlIE5PUCBOT1AgTk9QIE5PUCBMT0FEX0NPTlNUIG5ld2NvbnN0ICovCi0JbWVtc2V0KGNvZGVzdHIsIE5PUCwgNCk7Ci0JY29kZXN0cls0XSA9IExPQURfQ09OU1Q7Ci0JU0VUQVJHKGNvZGVzdHIsIDQsIGxlbl9jb25zdHMpOwotCXJldHVybiAxOworICAgIC8qIFdyaXRlIE5PUCBOT1AgTk9QIE5PUCBMT0FEX0NPTlNUIG5ld2NvbnN0ICovCisgICAgbWVtc2V0KGNvZGVzdHIsIE5PUCwgNCk7CisgICAgY29kZXN0cls0XSA9IExPQURfQ09OU1Q7CisgICAgU0VUQVJHKGNvZGVzdHIsIDQsIGxlbl9jb25zdHMpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBmb2xkX3VuYXJ5b3BzX29uX2NvbnN0YW50cyh1bnNpZ25lZCBjaGFyICpjb2Rlc3RyLCBQeU9iamVjdCAqY29uc3RzKQogewotCVB5T2JqZWN0ICpuZXdjb25zdD1OVUxMLCAqdjsKLQlQeV9zc2l6ZV90IGxlbl9jb25zdHM7Ci0JaW50IG9wY29kZTsKKyAgICBQeU9iamVjdCAqbmV3Y29uc3Q9TlVMTCwgKnY7CisgICAgUHlfc3NpemVfdCBsZW5fY29uc3RzOworICAgIGludCBvcGNvZGU7CiAKLQkvKiBQcmUtY29uZGl0aW9ucyAqLwotCWFzc2VydChQeUxpc3RfQ2hlY2tFeGFjdChjb25zdHMpKTsKLQlhc3NlcnQoY29kZXN0clswXSA9PSBMT0FEX0NPTlNUKTsKKyAgICAvKiBQcmUtY29uZGl0aW9ucyAqLworICAgIGFzc2VydChQeUxpc3RfQ2hlY2tFeGFjdChjb25zdHMpKTsKKyAgICBhc3NlcnQoY29kZXN0clswXSA9PSBMT0FEX0NPTlNUKTsKIAotCS8qIENyZWF0ZSBuZXcgY29uc3RhbnQgKi8KLQl2ID0gUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgR0VUQVJHKGNvZGVzdHIsIDApKTsKLQlvcGNvZGUgPSBjb2Rlc3RyWzNdOwotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JCWNhc2UgVU5BUllfTkVHQVRJVkU6Ci0JCQkvKiBQcmVzZXJ2ZSB0aGUgc2lnbiBvZiAtMC4wICovCi0JCQlpZiAoUHlPYmplY3RfSXNUcnVlKHYpID09IDEpCi0JCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9OZWdhdGl2ZSh2KTsKLQkJCWJyZWFrOwotCQljYXNlIFVOQVJZX0NPTlZFUlQ6Ci0JCQluZXdjb25zdCA9IFB5T2JqZWN0X1JlcHIodik7Ci0JCQlicmVhazsKLQkJY2FzZSBVTkFSWV9JTlZFUlQ6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX0ludmVydCh2KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyogQ2FsbGVkIHdpdGggYW4gdW5rbm93biBvcGNvZGUgKi8KLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSAgICAgInVuZXhwZWN0ZWQgdW5hcnkgb3BlcmF0aW9uICVkIG9uIGEgY29uc3RhbnQiLAotCQkJCSAgICAgb3Bjb2RlKTsKLQkJCXJldHVybiAwOwotCX0KLQlpZiAobmV3Y29uc3QgPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogQ3JlYXRlIG5ldyBjb25zdGFudCAqLworICAgIHYgPSBQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBHRVRBUkcoY29kZXN0ciwgMCkpOworICAgIG9wY29kZSA9IGNvZGVzdHJbM107CisgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgY2FzZSBVTkFSWV9ORUdBVElWRToKKyAgICAgICAgICAgIC8qIFByZXNlcnZlIHRoZSBzaWduIG9mIC0wLjAgKi8KKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9Jc1RydWUodikgPT0gMSkKKyAgICAgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX05lZ2F0aXZlKHYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVU5BUllfQ09OVkVSVDoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlPYmplY3RfUmVwcih2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVOQVJZX0lOVkVSVDoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfSW52ZXJ0KHYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBDYWxsZWQgd2l0aCBhbiB1bmtub3duIG9wY29kZSAqLworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCB1bmFyeSBvcGVyYXRpb24gJWQgb24gYSBjb25zdGFudCIsCisgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChuZXdjb25zdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFwcGVuZCBmb2xkZWQgY29uc3RhbnQgaW50byBjb25zdHMgdGFibGUgKi8KLQlsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7Ci0JaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBuZXdjb25zdCkpIHsKLQkJUHlfREVDUkVGKG5ld2NvbnN0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCVB5X0RFQ1JFRihuZXdjb25zdCk7CisgICAgLyogQXBwZW5kIGZvbGRlZCBjb25zdGFudCBpbnRvIGNvbnN0cyB0YWJsZSAqLworICAgIGxlbl9jb25zdHMgPSBQeUxpc3RfR0VUX1NJWkUoY29uc3RzKTsKKyAgICBpZiAoUHlMaXN0X0FwcGVuZChjb25zdHMsIG5ld2NvbnN0KSkgeworICAgICAgICBQeV9ERUNSRUYobmV3Y29uc3QpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKIAotCS8qIFdyaXRlIE5PUCBMT0FEX0NPTlNUIG5ld2NvbnN0ICovCi0JY29kZXN0clswXSA9IE5PUDsKLQljb2Rlc3RyWzFdID0gTE9BRF9DT05TVDsKLQlTRVRBUkcoY29kZXN0ciwgMSwgbGVuX2NvbnN0cyk7Ci0JcmV0dXJuIDE7CisgICAgLyogV3JpdGUgTk9QIExPQURfQ09OU1QgbmV3Y29uc3QgKi8KKyAgICBjb2Rlc3RyWzBdID0gTk9QOworICAgIGNvZGVzdHJbMV0gPSBMT0FEX0NPTlNUOworICAgIFNFVEFSRyhjb2Rlc3RyLCAxLCBsZW5fY29uc3RzKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCAqCiBtYXJrYmxvY2tzKHVuc2lnbmVkIGNoYXIgKmNvZGUsIFB5X3NzaXplX3QgbGVuKQogewotCXVuc2lnbmVkIGludCAqYmxvY2tzID0gKHVuc2lnbmVkIGludCAqKVB5TWVtX01hbGxvYyhsZW4qc2l6ZW9mKGludCkpOwotCWludCBpLGosIG9wY29kZSwgYmxvY2tjbnQgPSAwOworICAgIHVuc2lnbmVkIGludCAqYmxvY2tzID0gKHVuc2lnbmVkIGludCAqKVB5TWVtX01hbGxvYyhsZW4qc2l6ZW9mKGludCkpOworICAgIGludCBpLGosIG9wY29kZSwgYmxvY2tjbnQgPSAwOwogCi0JaWYgKGJsb2NrcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltZW1zZXQoYmxvY2tzLCAwLCBsZW4qc2l6ZW9mKGludCkpOworICAgIGlmIChibG9ja3MgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtc2V0KGJsb2NrcywgMCwgbGVuKnNpemVvZihpbnQpKTsKIAotCS8qIE1hcmsgbGFiZWxzIGluIHRoZSBmaXJzdCBwYXNzICovCi0JZm9yIChpPTAgOyBpPGxlbiA7IGkrPUNPREVTSVpFKG9wY29kZSkpIHsKLQkJb3Bjb2RlID0gY29kZVtpXTsKLQkJc3dpdGNoIChvcGNvZGUpIHsKLQkJCWNhc2UgRk9SX0lURVI6Ci0JCQljYXNlIEpVTVBfRk9SV0FSRDoKLQkJCWNhc2UgSlVNUF9JRl9GQUxTRV9PUl9QT1A6Ci0JCQljYXNlIEpVTVBfSUZfVFJVRV9PUl9QT1A6Ci0JCQljYXNlIFBPUF9KVU1QX0lGX0ZBTFNFOgotCQkJY2FzZSBQT1BfSlVNUF9JRl9UUlVFOgotCQkJY2FzZSBKVU1QX0FCU09MVVRFOgotCQkJY2FzZSBDT05USU5VRV9MT09QOgotCQkJY2FzZSBTRVRVUF9MT09QOgotCQkJY2FzZSBTRVRVUF9FWENFUFQ6Ci0JCQljYXNlIFNFVFVQX0ZJTkFMTFk6Ci0JCQljYXNlIFNFVFVQX1dJVEg6Ci0JCQkJaiA9IEdFVEpVTVBUR1QoY29kZSwgaSk7Ci0JCQkJYmxvY2tzW2pdID0gMTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQkvKiBCdWlsZCBibG9jayBudW1iZXJzIGluIHRoZSBzZWNvbmQgcGFzcyAqLwotCWZvciAoaT0wIDsgaTxsZW4gOyBpKyspIHsKLQkJYmxvY2tjbnQgKz0gYmxvY2tzW2ldOwkvKiBpbmNyZW1lbnQgYmxvY2tjbnQgb3ZlciBsYWJlbHMgKi8KLQkJYmxvY2tzW2ldID0gYmxvY2tjbnQ7Ci0JfQotCXJldHVybiBibG9ja3M7CisgICAgLyogTWFyayBsYWJlbHMgaW4gdGhlIGZpcnN0IHBhc3MgKi8KKyAgICBmb3IgKGk9MCA7IGk8bGVuIDsgaSs9Q09ERVNJWkUob3Bjb2RlKSkgeworICAgICAgICBvcGNvZGUgPSBjb2RlW2ldOworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBGT1JfSVRFUjoKKyAgICAgICAgICAgIGNhc2UgSlVNUF9GT1JXQVJEOgorICAgICAgICAgICAgY2FzZSBKVU1QX0lGX0ZBTFNFX09SX1BPUDoKKyAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9UUlVFX09SX1BPUDoKKyAgICAgICAgICAgIGNhc2UgUE9QX0pVTVBfSUZfRkFMU0U6CisgICAgICAgICAgICBjYXNlIFBPUF9KVU1QX0lGX1RSVUU6CisgICAgICAgICAgICBjYXNlIEpVTVBfQUJTT0xVVEU6CisgICAgICAgICAgICBjYXNlIENPTlRJTlVFX0xPT1A6CisgICAgICAgICAgICBjYXNlIFNFVFVQX0xPT1A6CisgICAgICAgICAgICBjYXNlIFNFVFVQX0VYQ0VQVDoKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfV0lUSDoKKyAgICAgICAgICAgICAgICBqID0gR0VUSlVNUFRHVChjb2RlLCBpKTsKKyAgICAgICAgICAgICAgICBibG9ja3Nbal0gPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIC8qIEJ1aWxkIGJsb2NrIG51bWJlcnMgaW4gdGhlIHNlY29uZCBwYXNzICovCisgICAgZm9yIChpPTAgOyBpPGxlbiA7IGkrKykgeworICAgICAgICBibG9ja2NudCArPSBibG9ja3NbaV07ICAgICAgICAgIC8qIGluY3JlbWVudCBibG9ja2NudCBvdmVyIGxhYmVscyAqLworICAgICAgICBibG9ja3NbaV0gPSBibG9ja2NudDsKKyAgICB9CisgICAgcmV0dXJuIGJsb2NrczsKIH0KIAogLyogUGVyZm9ybSBiYXNpYyBwZWVwaG9sZSBvcHRpbWl6YXRpb25zIHRvIGNvbXBvbmVudHMgb2YgYSBjb2RlIG9iamVjdC4KLSAgIFRoZSBjb25zdHMgb2JqZWN0IHNob3VsZCBzdGlsbCBiZSBpbiBsaXN0IGZvcm0gdG8gYWxsb3cgbmV3IGNvbnN0YW50cyAKKyAgIFRoZSBjb25zdHMgb2JqZWN0IHNob3VsZCBzdGlsbCBiZSBpbiBsaXN0IGZvcm0gdG8gYWxsb3cgbmV3IGNvbnN0YW50cwogICAgdG8gYmUgYXBwZW5kZWQuCiAKICAgIFRvIGtlZXAgdGhlIG9wdGltaXplciBzaW1wbGUsIGl0IGJhaWxzIG91dCAoZG9lcyBub3RoaW5nKSBmb3IgY29kZQotICAgY29udGFpbmluZyBleHRlbmRlZCBhcmd1bWVudHMgb3IgdGhhdCBoYXMgYSBsZW5ndGggb3ZlciAzMiw3MDAuICBUaGF0IAotICAgYWxsb3dzIHVzIHRvIGF2b2lkIG92ZXJmbG93IGFuZCBzaWduIGlzc3Vlcy4JIExpa2V3aXNlLCBpdCBiYWlscyB3aGVuCisgICBjb250YWluaW5nIGV4dGVuZGVkIGFyZ3VtZW50cyBvciB0aGF0IGhhcyBhIGxlbmd0aCBvdmVyIDMyLDcwMC4gIFRoYXQKKyAgIGFsbG93cyB1cyB0byBhdm9pZCBvdmVyZmxvdyBhbmQgc2lnbiBpc3N1ZXMuICBMaWtld2lzZSwgaXQgYmFpbHMgd2hlbgogICAgdGhlIGxpbmVubyB0YWJsZSBoYXMgY29tcGxleCBlbmNvZGluZyBmb3IgZ2FwcyA+PSAyNTUuCiAKICAgIE9wdGltaXphdGlvbnMgYXJlIHJlc3RyaWN0ZWQgdG8gc2ltcGxlIHRyYW5zZm9ybWF0aW9ucyBvY2N1cmluZyB3aXRoaW4gYQotICAgc2luZ2xlIGJhc2ljIGJsb2NrLglBbGwgdHJhbnNmb3JtYXRpb25zIGtlZXAgdGhlIGNvZGUgc2l6ZSB0aGUgc2FtZSBvciAKLSAgIHNtYWxsZXIuICBGb3IgdGhvc2UgdGhhdCByZWR1Y2Ugc2l6ZSwgdGhlIGdhcHMgYXJlIGluaXRpYWxseSBmaWxsZWQgd2l0aCAKLSAgIE5PUHMuICBMYXRlciB0aG9zZSBOT1BzIGFyZSByZW1vdmVkIGFuZCB0aGUganVtcCBhZGRyZXNzZXMgcmV0YXJnZXRlZCBpbiAKKyAgIHNpbmdsZSBiYXNpYyBibG9jay4gIEFsbCB0cmFuc2Zvcm1hdGlvbnMga2VlcCB0aGUgY29kZSBzaXplIHRoZSBzYW1lIG9yCisgICBzbWFsbGVyLiAgRm9yIHRob3NlIHRoYXQgcmVkdWNlIHNpemUsIHRoZSBnYXBzIGFyZSBpbml0aWFsbHkgZmlsbGVkIHdpdGgKKyAgIE5PUHMuICBMYXRlciB0aG9zZSBOT1BzIGFyZSByZW1vdmVkIGFuZCB0aGUganVtcCBhZGRyZXNzZXMgcmV0YXJnZXRlZCBpbgogICAgYSBzaW5nbGUgcGFzcy4gIExpbmUgbnVtYmVyaW5nIGlzIGFkanVzdGVkIGFjY29yZGluZ2x5LiAqLwogCiBQeU9iamVjdCAqCiBQeUNvZGVfT3B0aW1pemUoUHlPYmplY3QgKmNvZGUsIFB5T2JqZWN0KiBjb25zdHMsIFB5T2JqZWN0ICpuYW1lcywKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbGluZW5vX29iaikKIHsKLQlQeV9zc2l6ZV90IGksIGosIGNvZGVsZW47Ci0JaW50IG5vcHMsIGgsIGFkajsKLQlpbnQgdGd0LCB0Z3R0Z3QsIG9wY29kZTsKLQl1bnNpZ25lZCBjaGFyICpjb2Rlc3RyID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyICpsaW5lbm87Ci0JaW50ICphZGRybWFwID0gTlVMTDsKLQlpbnQgbmV3X2xpbmUsIGN1bV9vcmlnX2xpbmUsIGxhc3RfbGluZSwgdGFic2l6OwotCWludCBjdW1sYz0wLCBsYXN0bGM9MDsJLyogQ291bnQgcnVucyBvZiBjb25zZWN1dGl2ZSBMT0FEX0NPTlNUcyAqLwotCXVuc2lnbmVkIGludCAqYmxvY2tzID0gTlVMTDsKLQljaGFyICpuYW1lOworICAgIFB5X3NzaXplX3QgaSwgaiwgY29kZWxlbjsKKyAgICBpbnQgbm9wcywgaCwgYWRqOworICAgIGludCB0Z3QsIHRndHRndCwgb3Bjb2RlOworICAgIHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIgPSBOVUxMOworICAgIHVuc2lnbmVkIGNoYXIgKmxpbmVubzsKKyAgICBpbnQgKmFkZHJtYXAgPSBOVUxMOworICAgIGludCBuZXdfbGluZSwgY3VtX29yaWdfbGluZSwgbGFzdF9saW5lLCB0YWJzaXo7CisgICAgaW50IGN1bWxjPTAsIGxhc3RsYz0wOyAgICAgIC8qIENvdW50IHJ1bnMgb2YgY29uc2VjdXRpdmUgTE9BRF9DT05TVHMgKi8KKyAgICB1bnNpZ25lZCBpbnQgKmJsb2NrcyA9IE5VTEw7CisgICAgY2hhciAqbmFtZTsKIAotCS8qIEJhaWwgb3V0IGlmIGFuIGV4Y2VwdGlvbiBpcyBzZXQgKi8KLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBleGl0RXJyb3I7CisgICAgLyogQmFpbCBvdXQgaWYgYW4gZXhjZXB0aW9uIGlzIHNldCAqLworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIGV4aXRFcnJvcjsKIAotCS8qIEJ5cGFzcyBvcHRpbWl6YXRpb24gd2hlbiB0aGUgbGluZW5vIHRhYmxlIGlzIHRvbyBjb21wbGV4ICovCi0JYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGxpbmVub19vYmopKTsKLQlsaW5lbm8gPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQVNfU1RSSU5HKGxpbmVub19vYmopOwotCXRhYnNpeiA9IFB5U3RyaW5nX0dFVF9TSVpFKGxpbmVub19vYmopOwotCWlmIChtZW1jaHIobGluZW5vLCAyNTUsIHRhYnNpeikgIT0gTlVMTCkKLQkJZ290byBleGl0VW5jaGFuZ2VkOworICAgIC8qIEJ5cGFzcyBvcHRpbWl6YXRpb24gd2hlbiB0aGUgbGluZW5vIHRhYmxlIGlzIHRvbyBjb21wbGV4ICovCisgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGxpbmVub19vYmopKTsKKyAgICBsaW5lbm8gPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQVNfU1RSSU5HKGxpbmVub19vYmopOworICAgIHRhYnNpeiA9IFB5U3RyaW5nX0dFVF9TSVpFKGxpbmVub19vYmopOworICAgIGlmIChtZW1jaHIobGluZW5vLCAyNTUsIHRhYnNpeikgIT0gTlVMTCkKKyAgICAgICAgZ290byBleGl0VW5jaGFuZ2VkOwogCi0JLyogQXZvaWQgc2l0dWF0aW9ucyB3aGVyZSBqdW1wIHJldGFyZ2V0aW5nIGNvdWxkIG92ZXJmbG93ICovCi0JYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGNvZGUpKTsKLQljb2RlbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoY29kZSk7Ci0JaWYgKGNvZGVsZW4gPiAzMjcwMCkKLQkJZ290byBleGl0VW5jaGFuZ2VkOworICAgIC8qIEF2b2lkIHNpdHVhdGlvbnMgd2hlcmUganVtcCByZXRhcmdldGluZyBjb3VsZCBvdmVyZmxvdyAqLworICAgIGFzc2VydChQeVN0cmluZ19DaGVjayhjb2RlKSk7CisgICAgY29kZWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGNvZGUpOworICAgIGlmIChjb2RlbGVuID4gMzI3MDApCisgICAgICAgIGdvdG8gZXhpdFVuY2hhbmdlZDsKIAotCS8qIE1ha2UgYSBtb2RpZmlhYmxlIGNvcHkgb2YgdGhlIGNvZGUgc3RyaW5nICovCi0JY29kZXN0ciA9ICh1bnNpZ25lZCBjaGFyICopUHlNZW1fTWFsbG9jKGNvZGVsZW4pOwotCWlmIChjb2Rlc3RyID09IE5VTEwpCi0JCWdvdG8gZXhpdEVycm9yOwotCWNvZGVzdHIgPSAodW5zaWduZWQgY2hhciAqKW1lbWNweShjb2Rlc3RyLCAKLQkJCQkJICBQeVN0cmluZ19BU19TVFJJTkcoY29kZSksIGNvZGVsZW4pOworICAgIC8qIE1ha2UgYSBtb2RpZmlhYmxlIGNvcHkgb2YgdGhlIGNvZGUgc3RyaW5nICovCisgICAgY29kZXN0ciA9ICh1bnNpZ25lZCBjaGFyICopUHlNZW1fTWFsbG9jKGNvZGVsZW4pOworICAgIGlmIChjb2Rlc3RyID09IE5VTEwpCisgICAgICAgIGdvdG8gZXhpdEVycm9yOworICAgIGNvZGVzdHIgPSAodW5zaWduZWQgY2hhciAqKW1lbWNweShjb2Rlc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoY29kZSksIGNvZGVsZW4pOwogCi0JLyogVmVyaWZ5IHRoYXQgUkVUVVJOX1ZBTFVFIHRlcm1pbmF0ZXMgdGhlIGNvZGVzdHJpbmcuCVRoaXMgYWxsb3dzCi0JICAgdGhlIHZhcmlvdXMgdHJhbnNmb3JtYXRpb24gcGF0dGVybnMgdG8gbG9vayBhaGVhZCBzZXZlcmFsCi0JICAgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgYWRkaXRpb25hbCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIG5vdAotCSAgIGxvb2tpbmcgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGNvZGUgc3RyaW5nLgotCSovCi0JaWYgKGNvZGVzdHJbY29kZWxlbi0xXSAhPSBSRVRVUk5fVkFMVUUpCi0JCWdvdG8gZXhpdFVuY2hhbmdlZDsKKyAgICAvKiBWZXJpZnkgdGhhdCBSRVRVUk5fVkFMVUUgdGVybWluYXRlcyB0aGUgY29kZXN0cmluZy4gICAgICBUaGlzIGFsbG93cworICAgICAgIHRoZSB2YXJpb3VzIHRyYW5zZm9ybWF0aW9uIHBhdHRlcm5zIHRvIGxvb2sgYWhlYWQgc2V2ZXJhbAorICAgICAgIGluc3RydWN0aW9ucyB3aXRob3V0IGFkZGl0aW9uYWwgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBub3QKKyAgICAgICBsb29raW5nIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBjb2RlIHN0cmluZy4KKyAgICAqLworICAgIGlmIChjb2Rlc3RyW2NvZGVsZW4tMV0gIT0gUkVUVVJOX1ZBTFVFKQorICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7CiAKLQkvKiBNYXBwaW5nIHRvIG5ldyBqdW1wIHRhcmdldHMgYWZ0ZXIgTk9QcyBhcmUgcmVtb3ZlZCAqLwotCWFkZHJtYXAgPSAoaW50ICopUHlNZW1fTWFsbG9jKGNvZGVsZW4gKiBzaXplb2YoaW50KSk7Ci0JaWYgKGFkZHJtYXAgPT0gTlVMTCkKLQkJZ290byBleGl0RXJyb3I7CisgICAgLyogTWFwcGluZyB0byBuZXcganVtcCB0YXJnZXRzIGFmdGVyIE5PUHMgYXJlIHJlbW92ZWQgKi8KKyAgICBhZGRybWFwID0gKGludCAqKVB5TWVtX01hbGxvYyhjb2RlbGVuICogc2l6ZW9mKGludCkpOworICAgIGlmIChhZGRybWFwID09IE5VTEwpCisgICAgICAgIGdvdG8gZXhpdEVycm9yOwogCi0JYmxvY2tzID0gbWFya2Jsb2Nrcyhjb2Rlc3RyLCBjb2RlbGVuKTsKLQlpZiAoYmxvY2tzID09IE5VTEwpCi0JCWdvdG8gZXhpdEVycm9yOwotCWFzc2VydChQeUxpc3RfQ2hlY2soY29uc3RzKSk7CisgICAgYmxvY2tzID0gbWFya2Jsb2Nrcyhjb2Rlc3RyLCBjb2RlbGVuKTsKKyAgICBpZiAoYmxvY2tzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXhpdEVycm9yOworICAgIGFzc2VydChQeUxpc3RfQ2hlY2soY29uc3RzKSk7CiAKLQlmb3IgKGk9MCA7IGk8Y29kZWxlbiA7IGkgKz0gQ09ERVNJWkUoY29kZXN0cltpXSkpIHsKLQkgIHJlb3B0aW1pemVfY3VycmVudDoKLQkJb3Bjb2RlID0gY29kZXN0cltpXTsKKyAgICBmb3IgKGk9MCA7IGk8Y29kZWxlbiA7IGkgKz0gQ09ERVNJWkUoY29kZXN0cltpXSkpIHsKKyAgICAgIHJlb3B0aW1pemVfY3VycmVudDoKKyAgICAgICAgb3Bjb2RlID0gY29kZXN0cltpXTsKIAotCQlsYXN0bGMgPSBjdW1sYzsKLQkJY3VtbGMgPSAwOworICAgICAgICBsYXN0bGMgPSBjdW1sYzsKKyAgICAgICAgY3VtbGMgPSAwOwogCi0JCXN3aXRjaCAob3Bjb2RlKSB7Ci0JCQkvKiBSZXBsYWNlIFVOQVJZX05PVCBQT1BfSlVNUF9JRl9GQUxTRSAKLQkJCSAgIHdpdGggICAgUE9QX0pVTVBfSUZfVFJVRSAqLwotCQkJY2FzZSBVTkFSWV9OT1Q6Ci0JCQkJaWYgKGNvZGVzdHJbaSsxXSAhPSBQT1BfSlVNUF9JRl9GQUxTRQotCQkJCSAgICB8fCAhSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDQpKQotCQkJCQljb250aW51ZTsKLQkJCQlqID0gR0VUQVJHKGNvZGVzdHIsIGkrMSk7Ci0JCQkJY29kZXN0cltpXSA9IFBPUF9KVU1QX0lGX1RSVUU7Ci0JCQkJU0VUQVJHKGNvZGVzdHIsIGksIGopOwotCQkJCWNvZGVzdHJbaSszXSA9IE5PUDsKLQkJCQlnb3RvIHJlb3B0aW1pemVfY3VycmVudDsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIC8qIFJlcGxhY2UgVU5BUllfTk9UIFBPUF9KVU1QX0lGX0ZBTFNFCisgICAgICAgICAgICAgICB3aXRoICAgIFBPUF9KVU1QX0lGX1RSVUUgKi8KKyAgICAgICAgICAgIGNhc2UgVU5BUllfTk9UOgorICAgICAgICAgICAgICAgIGlmIChjb2Rlc3RyW2krMV0gIT0gUE9QX0pVTVBfSUZfRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgfHwgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw0KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKzEpOworICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBQT1BfSlVNUF9JRl9UUlVFOworICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCBqKTsKKyAgICAgICAgICAgICAgICBjb2Rlc3RyW2krM10gPSBOT1A7CisgICAgICAgICAgICAgICAgZ290byByZW9wdGltaXplX2N1cnJlbnQ7CiAKLQkJCQkvKiBub3QgYSBpcyBiIC0tPiAgYSBpcyBub3QgYgotCQkJCSAgIG5vdCBhIGluIGIgLS0+ICBhIG5vdCBpbiBiCi0JCQkJICAgbm90IGEgaXMgbm90IGIgLS0+ICBhIGlzIGIKLQkJCQkgICBub3QgYSBub3QgaW4gYiAtLT4gIGEgaW4gYgotCQkJCSovCi0JCQljYXNlIENPTVBBUkVfT1A6Ci0JCQkJaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKLQkJCQlpZiAoaiA8IDYgIHx8ICBqID4gOSAgfHwKLQkJCQkgICAgY29kZXN0cltpKzNdICE9IFVOQVJZX05PVCAgfHwgCi0JCQkJICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVNFVEFSRyhjb2Rlc3RyLCBpLCAoal4xKSk7Ci0JCQkJY29kZXN0cltpKzNdID0gTk9QOwotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIC8qIG5vdCBhIGlzIGIgLS0+ICBhIGlzIG5vdCBiCisgICAgICAgICAgICAgICAgICAgbm90IGEgaW4gYiAtLT4gIGEgbm90IGluIGIKKyAgICAgICAgICAgICAgICAgICBub3QgYSBpcyBub3QgYiAtLT4gIGEgaXMgYgorICAgICAgICAgICAgICAgICAgIG5vdCBhIG5vdCBpbiBiIC0tPiAgYSBpbiBiCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNhc2UgQ09NUEFSRV9PUDoKKyAgICAgICAgICAgICAgICBqID0gR0VUQVJHKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIGlmIChqIDwgNiAgfHwgIGogPiA5ICB8fAorICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2krM10gIT0gVU5BUllfTk9UICB8fAorICAgICAgICAgICAgICAgICAgICAhSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDQpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgKGpeMSkpOworICAgICAgICAgICAgICAgIGNvZGVzdHJbaSszXSA9IE5PUDsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJCS8qIFJlcGxhY2UgTE9BRF9HTE9CQUwvTE9BRF9OQU1FIE5vbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBMT0FEX0NPTlNUIE5vbmUgKi8KLQkJCWNhc2UgTE9BRF9OQU1FOgotCQkJY2FzZSBMT0FEX0dMT0JBTDoKLQkJCQlqID0gR0VUQVJHKGNvZGVzdHIsIGkpOwotCQkJCW5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhQeVR1cGxlX0dFVF9JVEVNKG5hbWVzLCBqKSk7Ci0JCQkJaWYgKG5hbWUgPT0gTlVMTCAgfHwgIHN0cmNtcChuYW1lLCAiTm9uZSIpICE9IDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWZvciAoaj0wIDsgaiA8IFB5TGlzdF9HRVRfU0laRShjb25zdHMpIDsgaisrKSB7Ci0JCQkJCWlmIChQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBqKSA9PSBQeV9Ob25lKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChqID09IFB5TGlzdF9HRVRfU0laRShjb25zdHMpKSB7Ci0JCQkJCWlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgUHlfTm9uZSkgPT0gLTEpCi0JCQkJCSAgICAgICAgZ290byBleGl0RXJyb3I7Ci0JCQkJfQotCQkJCWFzc2VydChQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBqKSA9PSBQeV9Ob25lKTsKLQkJCQljb2Rlc3RyW2ldID0gTE9BRF9DT05TVDsKLQkJCQlTRVRBUkcoY29kZXN0ciwgaSwgaik7Ci0JCQkJY3VtbGMgPSBsYXN0bGMgKyAxOwotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UgTE9BRF9HTE9CQUwvTE9BRF9OQU1FIE5vbmUKKyAgICAgICAgICAgICAgICAgICB3aXRoIExPQURfQ09OU1QgTm9uZSAqLworICAgICAgICAgICAgY2FzZSBMT0FEX05BTUU6CisgICAgICAgICAgICBjYXNlIExPQURfR0xPQkFMOgorICAgICAgICAgICAgICAgIGogPSBHRVRBUkcoY29kZXN0ciwgaSk7CisgICAgICAgICAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKFB5VHVwbGVfR0VUX0lURU0obmFtZXMsIGopKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMICB8fCAgc3RyY21wKG5hbWUsICJOb25lIikgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZm9yIChqPTAgOyBqIDwgUHlMaXN0X0dFVF9TSVpFKGNvbnN0cykgOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIGopID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogPT0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBQeV9Ob25lKSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdEVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgaikgPT0gUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IExPQURfQ09OU1Q7CisgICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIGopOworICAgICAgICAgICAgICAgIGN1bWxjID0gbGFzdGxjICsgMTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJCS8qIFNraXAgb3ZlciBMT0FEX0NPTlNUIHRydWVjb25zdAotCQkJCSAgIFBPUF9KVU1QX0lGX0ZBTFNFIHh4LiBUaGlzIGltcHJvdmVzCi0JCQkJICAgIndoaWxlIDEiIHBlcmZvcm1hbmNlLiAqLwotCQkJY2FzZSBMT0FEX0NPTlNUOgotCQkJCWN1bWxjID0gbGFzdGxjICsgMTsKLQkJCQlqID0gR0VUQVJHKGNvZGVzdHIsIGkpOwotCQkJCWlmIChjb2Rlc3RyW2krM10gIT0gUE9QX0pVTVBfSUZfRkFMU0UgIHx8Ci0JCQkJICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNikgIHx8Ci0JCQkJICAgICFQeU9iamVjdF9Jc1RydWUoUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgaikpKQotCQkJCQljb250aW51ZTsKLQkJCQltZW1zZXQoY29kZXN0citpLCBOT1AsIDYpOwotCQkJCWN1bWxjID0gMDsKLQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAvKiBTa2lwIG92ZXIgTE9BRF9DT05TVCB0cnVlY29uc3QKKyAgICAgICAgICAgICAgICAgICBQT1BfSlVNUF9JRl9GQUxTRSB4eC4gVGhpcyBpbXByb3ZlcworICAgICAgICAgICAgICAgICAgICJ3aGlsZSAxIiBwZXJmb3JtYW5jZS4gKi8KKyAgICAgICAgICAgIGNhc2UgTE9BRF9DT05TVDoKKyAgICAgICAgICAgICAgICBjdW1sYyA9IGxhc3RsYyArIDE7CisgICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzNdICE9IFBPUF9KVU1QX0lGX0ZBTFNFICB8fAorICAgICAgICAgICAgICAgICAgICAhSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDYpICB8fAorICAgICAgICAgICAgICAgICAgICAhUHlPYmplY3RfSXNUcnVlKFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIGopKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSwgTk9QLCA2KTsKKyAgICAgICAgICAgICAgICBjdW1sYyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCQkvKiBUcnkgdG8gZm9sZCB0dXBsZXMgb2YgY29uc3RhbnRzIChpbmNsdWRlcyBhIGNhc2UgZm9yIGxpc3RzCi0JCQkJICAgd2hpY2ggYXJlIG9ubHkgdXNlZCBmb3IgImluIiBhbmQgIm5vdCBpbiIgdGVzdHMpLgotCQkJCSAgIFNraXAgb3ZlciBCVUlMRF9TRVFOIDEgVU5QQUNLX1NFUU4gMS4KLQkJCQkgICBSZXBsYWNlIEJVSUxEX1NFUU4gMiBVTlBBQ0tfU0VRTiAyIHdpdGggUk9UMi4KLQkJCQkgICBSZXBsYWNlIEJVSUxEX1NFUU4gMyBVTlBBQ0tfU0VRTiAzIHdpdGggUk9UMyBST1QyLiAqLwotCQkJY2FzZSBCVUlMRF9UVVBMRToKLQkJCWNhc2UgQlVJTERfTElTVDoKLQkJCQlqID0gR0VUQVJHKGNvZGVzdHIsIGkpOwotCQkJCWggPSBpIC0gMyAqIGo7Ci0JCQkJaWYgKGggPj0gMCAgJiYKLQkJCQkgICAgaiA8PSBsYXN0bGMJICYmCi0JCQkJICAgICgob3Bjb2RlID09IEJVSUxEX1RVUExFICYmIAotCQkJCSAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIDMqKGorMSkpKSB8fAotCQkJCSAgICAgKG9wY29kZSA9PSBCVUlMRF9MSVNUICYmIAotCQkJCSAgICAgIGNvZGVzdHJbaSszXT09Q09NUEFSRV9PUCAmJiAKLQkJCQkgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBoLCAzKihqKzIpKSAmJgotCQkJCSAgICAgIChHRVRBUkcoY29kZXN0cixpKzMpPT02IHx8Ci0JCQkJICAgICAgIEdFVEFSRyhjb2Rlc3RyLGkrMyk9PTcpKSkgJiYKLQkJCQkgICAgdHVwbGVfb2ZfY29uc3RhbnRzKCZjb2Rlc3RyW2hdLCBqLCBjb25zdHMpKSB7Ci0JCQkJCWFzc2VydChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpOwotCQkJCQljdW1sYyA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY29kZXN0cltpKzNdICE9IFVOUEFDS19TRVFVRU5DRSAgfHwKLQkJCQkgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw2KSB8fAotCQkJCSAgICBqICE9IEdFVEFSRyhjb2Rlc3RyLCBpKzMpKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoaiA9PSAxKSB7Ci0JCQkJCW1lbXNldChjb2Rlc3RyK2ksIE5PUCwgNik7Ci0JCQkJfSBlbHNlIGlmIChqID09IDIpIHsKLQkJCQkJY29kZXN0cltpXSA9IFJPVF9UV087Ci0JCQkJCW1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCA1KTsKLQkJCQl9IGVsc2UgaWYgKGogPT0gMykgewotCQkJCQljb2Rlc3RyW2ldID0gUk9UX1RIUkVFOwotCQkJCQljb2Rlc3RyW2krMV0gPSBST1RfVFdPOwotCQkJCQltZW1zZXQoY29kZXN0citpKzIsIE5PUCwgNCk7Ci0JCQkJfQotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIC8qIFRyeSB0byBmb2xkIHR1cGxlcyBvZiBjb25zdGFudHMgKGluY2x1ZGVzIGEgY2FzZSBmb3IgbGlzdHMKKyAgICAgICAgICAgICAgICAgICB3aGljaCBhcmUgb25seSB1c2VkIGZvciAiaW4iIGFuZCAibm90IGluIiB0ZXN0cykuCisgICAgICAgICAgICAgICAgICAgU2tpcCBvdmVyIEJVSUxEX1NFUU4gMSBVTlBBQ0tfU0VRTiAxLgorICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgQlVJTERfU0VRTiAyIFVOUEFDS19TRVFOIDIgd2l0aCBST1QyLgorICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgQlVJTERfU0VRTiAzIFVOUEFDS19TRVFOIDMgd2l0aCBST1QzIFJPVDIuICovCisgICAgICAgICAgICBjYXNlIEJVSUxEX1RVUExFOgorICAgICAgICAgICAgY2FzZSBCVUlMRF9MSVNUOgorICAgICAgICAgICAgICAgIGogPSBHRVRBUkcoY29kZXN0ciwgaSk7CisgICAgICAgICAgICAgICAgaCA9IGkgLSAzICogajsKKyAgICAgICAgICAgICAgICBpZiAoaCA+PSAwICAmJgorICAgICAgICAgICAgICAgICAgICBqIDw9IGxhc3RsYyAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgICgob3Bjb2RlID09IEJVSUxEX1RVUExFICYmCisgICAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgMyooaisxKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAob3Bjb2RlID09IEJVSUxEX0xJU1QgJiYKKyAgICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2krM109PUNPTVBBUkVfT1AgJiYKKyAgICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBoLCAzKihqKzIpKSAmJgorICAgICAgICAgICAgICAgICAgICAgIChHRVRBUkcoY29kZXN0cixpKzMpPT02IHx8CisgICAgICAgICAgICAgICAgICAgICAgIEdFVEFSRyhjb2Rlc3RyLGkrMyk9PTcpKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgdHVwbGVfb2ZfY29uc3RhbnRzKCZjb2Rlc3RyW2hdLCBqLCBjb25zdHMpKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpOworICAgICAgICAgICAgICAgICAgICBjdW1sYyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzNdICE9IFVOUEFDS19TRVFVRU5DRSAgfHwKKyAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw2KSB8fAorICAgICAgICAgICAgICAgICAgICBqICE9IEdFVEFSRyhjb2Rlc3RyLCBpKzMpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoaiA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2ksIE5PUCwgNik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IFJPVF9UV087CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCA1KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGogPT0gMykgeworICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gUk9UX1RIUkVFOworICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2krMV0gPSBST1RfVFdPOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0citpKzIsIE5PUCwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQkJLyogRm9sZCBiaW5hcnkgb3BzIG9uIGNvbnN0YW50cy4KLQkJCQkgICBMT0FEX0NPTlNUIGMxIExPQURfQ09OU1QgYzIgQklOT1AgLS0+ICBMT0FEX0NPTlNUIGJpbm9wKGMxLGMyKSAqLwotCQkJY2FzZSBCSU5BUllfUE9XRVI6Ci0JCQljYXNlIEJJTkFSWV9NVUxUSVBMWToKLQkJCWNhc2UgQklOQVJZX1RSVUVfRElWSURFOgotCQkJY2FzZSBCSU5BUllfRkxPT1JfRElWSURFOgotCQkJY2FzZSBCSU5BUllfTU9EVUxPOgotCQkJY2FzZSBCSU5BUllfQUREOgotCQkJY2FzZSBCSU5BUllfU1VCVFJBQ1Q6Ci0JCQljYXNlIEJJTkFSWV9TVUJTQ1I6Ci0JCQljYXNlIEJJTkFSWV9MU0hJRlQ6Ci0JCQljYXNlIEJJTkFSWV9SU0hJRlQ6Ci0JCQljYXNlIEJJTkFSWV9BTkQ6Ci0JCQljYXNlIEJJTkFSWV9YT1I6Ci0JCQljYXNlIEJJTkFSWV9PUjoKLQkJCQlpZiAobGFzdGxjID49IDIJICYmCi0JCQkJICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGktNiwgNykgICYmCi0JCQkJICAgIGZvbGRfYmlub3BzX29uX2NvbnN0YW50cygmY29kZXN0cltpLTZdLCBjb25zdHMpKSB7Ci0JCQkJCWkgLT0gMjsKLQkJCQkJYXNzZXJ0KGNvZGVzdHJbaV0gPT0gTE9BRF9DT05TVCk7Ci0JCQkJCWN1bWxjID0gMTsKLQkJCQl9Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgLyogRm9sZCBiaW5hcnkgb3BzIG9uIGNvbnN0YW50cy4KKyAgICAgICAgICAgICAgICAgICBMT0FEX0NPTlNUIGMxIExPQURfQ09OU1QgYzIgQklOT1AgLS0+ICBMT0FEX0NPTlNUIGJpbm9wKGMxLGMyKSAqLworICAgICAgICAgICAgY2FzZSBCSU5BUllfUE9XRVI6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9NVUxUSVBMWToKKyAgICAgICAgICAgIGNhc2UgQklOQVJZX1RSVUVfRElWSURFOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfRkxPT1JfRElWSURFOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfTU9EVUxPOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfQUREOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfU1VCVFJBQ1Q6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9TVUJTQ1I6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9MU0hJRlQ6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9SU0hJRlQ6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9BTkQ6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9YT1I6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9PUjoKKyAgICAgICAgICAgICAgICBpZiAobGFzdGxjID49IDIgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBpLTYsIDcpICAmJgorICAgICAgICAgICAgICAgICAgICBmb2xkX2Jpbm9wc19vbl9jb25zdGFudHMoJmNvZGVzdHJbaS02XSwgY29uc3RzKSkgeworICAgICAgICAgICAgICAgICAgICBpIC09IDI7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpOworICAgICAgICAgICAgICAgICAgICBjdW1sYyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQkJLyogRm9sZCB1bmFyeSBvcHMgb24gY29uc3RhbnRzLgotCQkJCSAgIExPQURfQ09OU1QgYzEgIFVOQVJZX09QIC0tPglMT0FEX0NPTlNUIHVuYXJ5X29wKGMpICovCi0JCQljYXNlIFVOQVJZX05FR0FUSVZFOgotCQkJY2FzZSBVTkFSWV9DT05WRVJUOgotCQkJY2FzZSBVTkFSWV9JTlZFUlQ6Ci0JCQkJaWYgKGxhc3RsYyA+PSAxCSAmJgotCQkJCSAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBpLTMsIDQpICAmJgotCQkJCSAgICBmb2xkX3VuYXJ5b3BzX29uX2NvbnN0YW50cygmY29kZXN0cltpLTNdLCBjb25zdHMpKQl7Ci0JCQkJCWkgLT0gMjsKLQkJCQkJYXNzZXJ0KGNvZGVzdHJbaV0gPT0gTE9BRF9DT05TVCk7Ci0JCQkJCWN1bWxjID0gMTsKLQkJCQl9Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgLyogRm9sZCB1bmFyeSBvcHMgb24gY29uc3RhbnRzLgorICAgICAgICAgICAgICAgICAgIExPQURfQ09OU1QgYzEgIFVOQVJZX09QIC0tPiAgICAgICAgICAgICAgICAgIExPQURfQ09OU1QgdW5hcnlfb3AoYykgKi8KKyAgICAgICAgICAgIGNhc2UgVU5BUllfTkVHQVRJVkU6CisgICAgICAgICAgICBjYXNlIFVOQVJZX0NPTlZFUlQ6CisgICAgICAgICAgICBjYXNlIFVOQVJZX0lOVkVSVDoKKyAgICAgICAgICAgICAgICBpZiAobGFzdGxjID49IDEgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBpLTMsIDQpICAmJgorICAgICAgICAgICAgICAgICAgICBmb2xkX3VuYXJ5b3BzX29uX2NvbnN0YW50cygmY29kZXN0cltpLTNdLCBjb25zdHMpKSAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaSAtPSAyOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsKKyAgICAgICAgICAgICAgICAgICAgY3VtbGMgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJCS8qIFNpbXBsaWZ5IGNvbmRpdGlvbmFsIGp1bXAgdG8gY29uZGl0aW9uYWwganVtcCB3aGVyZSB0aGUKLQkJCQkgICByZXN1bHQgb2YgdGhlIGZpcnN0IHRlc3QgaW1wbGllcyB0aGUgc3VjY2VzcyBvZiBhIHNpbWlsYXIKLQkJCQkgICB0ZXN0IG9yIHRoZSBmYWlsdXJlIG9mIHRoZSBvcHBvc2l0ZSB0ZXN0LgotCQkJCSAgIEFyaXNlcyBpbiBjb2RlIGxpa2U6Ci0JCQkJICAgImlmIGEgYW5kIGI6IgotCQkJCSAgICJpZiBhIG9yIGI6IgotCQkJCSAgICJhIGFuZCBiIG9yIGMiCi0JCQkJICAgIihhIGFuZCBiKSBhbmQgYyIKLQkJCQkgICB4OkpVTVBfSUZfRkFMU0VfT1JfUE9QIHkgICB5OkpVTVBfSUZfRkFMU0VfT1JfUE9QIHoKLQkJCQkgICAgICAtLT4gIHg6SlVNUF9JRl9GQUxTRV9PUl9QT1AgegotCQkJCSAgIHg6SlVNUF9JRl9GQUxTRV9PUl9QT1AgeSAgIHk6SlVNUF9JRl9UUlVFX09SX1BPUCB6Ci0JCQkJICAgICAgLS0+ICB4OlBPUF9KVU1QX0lGX0ZBTFNFIHkrMwotCQkJCSAgIHdoZXJlIHkrMyBpcyB0aGUgaW5zdHJ1Y3Rpb24gZm9sbG93aW5nIHRoZSBzZWNvbmQgdGVzdC4KLQkJCQkqLwotCQkJY2FzZSBKVU1QX0lGX0ZBTFNFX09SX1BPUDoKLQkJCWNhc2UgSlVNUF9JRl9UUlVFX09SX1BPUDoKLQkJCQl0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOwotCQkJCWogPSBjb2Rlc3RyW3RndF07Ci0JCQkJaWYgKENPTkRJVElPTkFMX0pVTVAoaikpIHsKLQkJCQkJLyogTk9URTogYWxsIHBvc3NpYmxlIGp1bXBzIGhlcmUgYXJlCi0JCQkJCSAgIGFic29sdXRlISAqLwotCQkJCQlpZiAoSlVNUFNfT05fVFJVRShqKSA9PSBKVU1QU19PTl9UUlVFKG9wY29kZSkpIHsKLQkJCQkJCS8qIFRoZSBzZWNvbmQganVtcCB3aWxsIGJlCi0JCQkJCQkgICB0YWtlbiBpZmYgdGhlIGZpcnN0IGlzLiAqLwotCQkJCQkJdGd0dGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpOwotCQkJCQkJLyogVGhlIGN1cnJlbnQgb3Bjb2RlIGluaGVyaXRzCi0JCQkJCQkgICBpdHMgdGFyZ2V0J3Mgc3RhY2sgYmVoYXZpb3VyICovCi0JCQkJCQljb2Rlc3RyW2ldID0gajsKLQkJCQkJCVNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3R0Z3QpOwotCQkJCQkJZ290byByZW9wdGltaXplX2N1cnJlbnQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiBUaGUgc2Vjb25kIGp1bXAgaXMgbm90IHRha2VuCi0JCQkJCQkgICBpZiB0aGUgZmlyc3QgaXMgKHNvIGp1bXAgcGFzdAotCQkJCQkJICAgaXQpLCBhbmQgYWxsIGNvbmRpdGlvbmFsCi0JCQkJCQkgICBqdW1wcyBwb3AgdGhlaXIgYXJndW1lbnQgd2hlbgotCQkJCQkJICAgdGhleSdyZSBub3QgdGFrZW4gKHNvIGNoYW5nZQotCQkJCQkJICAgdGhlIGZpcnN0IGp1bXAgdG8gcG9wIGl0cwotCQkJCQkJICAgYXJndW1lbnQgd2hlbiBpdCdzIHRha2VuKS4gKi8KLQkJCQkJCWlmIChKVU1QU19PTl9UUlVFKG9wY29kZSkpCi0JCQkJCQkJY29kZXN0cltpXSA9IFBPUF9KVU1QX0lGX1RSVUU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJY29kZXN0cltpXSA9IFBPUF9KVU1QX0lGX0ZBTFNFOwotCQkJCQkJU0VUQVJHKGNvZGVzdHIsIGksICh0Z3QgKyAzKSk7Ci0JCQkJCQlnb3RvIHJlb3B0aW1pemVfY3VycmVudDsKLQkJCQkJfQotCQkJCX0KLQkJCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIC8qIFNpbXBsaWZ5IGNvbmRpdGlvbmFsIGp1bXAgdG8gY29uZGl0aW9uYWwganVtcCB3aGVyZSB0aGUKKyAgICAgICAgICAgICAgICAgICByZXN1bHQgb2YgdGhlIGZpcnN0IHRlc3QgaW1wbGllcyB0aGUgc3VjY2VzcyBvZiBhIHNpbWlsYXIKKyAgICAgICAgICAgICAgICAgICB0ZXN0IG9yIHRoZSBmYWlsdXJlIG9mIHRoZSBvcHBvc2l0ZSB0ZXN0LgorICAgICAgICAgICAgICAgICAgIEFyaXNlcyBpbiBjb2RlIGxpa2U6CisgICAgICAgICAgICAgICAgICAgImlmIGEgYW5kIGI6IgorICAgICAgICAgICAgICAgICAgICJpZiBhIG9yIGI6IgorICAgICAgICAgICAgICAgICAgICJhIGFuZCBiIG9yIGMiCisgICAgICAgICAgICAgICAgICAgIihhIGFuZCBiKSBhbmQgYyIKKyAgICAgICAgICAgICAgICAgICB4OkpVTVBfSUZfRkFMU0VfT1JfUE9QIHkgICB5OkpVTVBfSUZfRkFMU0VfT1JfUE9QIHoKKyAgICAgICAgICAgICAgICAgICAgICAtLT4gIHg6SlVNUF9JRl9GQUxTRV9PUl9QT1AgegorICAgICAgICAgICAgICAgICAgIHg6SlVNUF9JRl9GQUxTRV9PUl9QT1AgeSAgIHk6SlVNUF9JRl9UUlVFX09SX1BPUCB6CisgICAgICAgICAgICAgICAgICAgICAgLS0+ICB4OlBPUF9KVU1QX0lGX0ZBTFNFIHkrMworICAgICAgICAgICAgICAgICAgIHdoZXJlIHkrMyBpcyB0aGUgaW5zdHJ1Y3Rpb24gZm9sbG93aW5nIHRoZSBzZWNvbmQgdGVzdC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgY2FzZSBKVU1QX0lGX0ZBTFNFX09SX1BPUDoKKyAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9UUlVFX09SX1BPUDoKKyAgICAgICAgICAgICAgICB0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIGogPSBjb2Rlc3RyW3RndF07CisgICAgICAgICAgICAgICAgaWYgKENPTkRJVElPTkFMX0pVTVAoaikpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTk9URTogYWxsIHBvc3NpYmxlIGp1bXBzIGhlcmUgYXJlCisgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlISAqLworICAgICAgICAgICAgICAgICAgICBpZiAoSlVNUFNfT05fVFJVRShqKSA9PSBKVU1QU19PTl9UUlVFKG9wY29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBzZWNvbmQganVtcCB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlbiBpZmYgdGhlIGZpcnN0IGlzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGd0dGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpOworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgb3Bjb2RlIGluaGVyaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMgdGFyZ2V0J3Mgc3RhY2sgYmVoYXZpb3VyICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3R0Z3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZW9wdGltaXplX2N1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2Vjb25kIGp1bXAgaXMgbm90IHRha2VuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgZmlyc3QgaXMgKHNvIGp1bXAgcGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQpLCBhbmQgYWxsIGNvbmRpdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1wcyBwb3AgdGhlaXIgYXJndW1lbnQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhleSdyZSBub3QgdGFrZW4gKHNvIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpcnN0IGp1bXAgdG8gcG9wIGl0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQgd2hlbiBpdCdzIHRha2VuKS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKVU1QU19PTl9UUlVFKG9wY29kZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IFBPUF9KVU1QX0lGX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IFBPUF9KVU1QX0lGX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksICh0Z3QgKyAzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlb3B0aW1pemVfY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwogCi0JCQkJLyogUmVwbGFjZSBqdW1wcyB0byB1bmNvbmRpdGlvbmFsIGp1bXBzICovCi0JCQljYXNlIFBPUF9KVU1QX0lGX0ZBTFNFOgotCQkJY2FzZSBQT1BfSlVNUF9JRl9UUlVFOgotCQkJY2FzZSBGT1JfSVRFUjoKLQkJCWNhc2UgSlVNUF9GT1JXQVJEOgotCQkJY2FzZSBKVU1QX0FCU09MVVRFOgotCQkJY2FzZSBDT05USU5VRV9MT09QOgotCQkJY2FzZSBTRVRVUF9MT09QOgotCQkJY2FzZSBTRVRVUF9FWENFUFQ6Ci0JCQljYXNlIFNFVFVQX0ZJTkFMTFk6Ci0JCQljYXNlIFNFVFVQX1dJVEg6Ci0JCQkJdGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCBpKTsKLQkJCQkvKiBSZXBsYWNlIEpVTVBfKiB0byBhIFJFVFVSTiBpbnRvIGp1c3QgYSBSRVRVUk4gKi8KLQkJCQlpZiAoVU5DT05ESVRJT05BTF9KVU1QKG9wY29kZSkgJiYKLQkJCQkgICAgY29kZXN0clt0Z3RdID09IFJFVFVSTl9WQUxVRSkgewotCQkJCQljb2Rlc3RyW2ldID0gUkVUVVJOX1ZBTFVFOwotCQkJCQltZW1zZXQoY29kZXN0citpKzEsIE5PUCwgMik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoIVVOQ09ORElUSU9OQUxfSlVNUChjb2Rlc3RyW3RndF0pKQotCQkJCQljb250aW51ZTsKLQkJCQl0Z3R0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIHRndCk7Ci0JCQkJaWYgKG9wY29kZSA9PSBKVU1QX0ZPUldBUkQpIC8qIEpNUF9BQlMgY2FuIGdvIGJhY2t3YXJkcyAqLwotCQkJCQlvcGNvZGUgPSBKVU1QX0FCU09MVVRFOwotCQkJCWlmICghQUJTT0xVVEVfSlVNUChvcGNvZGUpKQotCQkJCQl0Z3R0Z3QgLT0gaSArIDM7ICAgICAvKiBDYWxjIHJlbGF0aXZlIGp1bXAgYWRkciAqLwotCQkJCWlmICh0Z3R0Z3QgPCAwKQkJICAvKiBObyBiYWNrd2FyZCByZWxhdGl2ZSBqdW1wcyAqLwotCQkJCQljb250aW51ZTsKLQkJCQljb2Rlc3RyW2ldID0gb3Bjb2RlOwotCQkJCVNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3R0Z3QpOwotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UganVtcHMgdG8gdW5jb25kaXRpb25hbCBqdW1wcyAqLworICAgICAgICAgICAgY2FzZSBQT1BfSlVNUF9JRl9GQUxTRToKKyAgICAgICAgICAgIGNhc2UgUE9QX0pVTVBfSUZfVFJVRToKKyAgICAgICAgICAgIGNhc2UgRk9SX0lURVI6CisgICAgICAgICAgICBjYXNlIEpVTVBfRk9SV0FSRDoKKyAgICAgICAgICAgIGNhc2UgSlVNUF9BQlNPTFVURToKKyAgICAgICAgICAgIGNhc2UgQ09OVElOVUVfTE9PUDoKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfRVhDRVBUOgorICAgICAgICAgICAgY2FzZSBTRVRVUF9GSU5BTExZOgorICAgICAgICAgICAgY2FzZSBTRVRVUF9XSVRIOgorICAgICAgICAgICAgICAgIHRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgaSk7CisgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBKVU1QXyogdG8gYSBSRVRVUk4gaW50byBqdXN0IGEgUkVUVVJOICovCisgICAgICAgICAgICAgICAgaWYgKFVOQ09ORElUSU9OQUxfSlVNUChvcGNvZGUpICYmCisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbdGd0XSA9PSBSRVRVUk5fVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IFJFVFVSTl9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFVTkNPTkRJVElPTkFMX0pVTVAoY29kZXN0clt0Z3RdKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgdGd0dGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpOworICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gSlVNUF9GT1JXQVJEKSAvKiBKTVBfQUJTIGNhbiBnbyBiYWNrd2FyZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgb3Bjb2RlID0gSlVNUF9BQlNPTFVURTsKKyAgICAgICAgICAgICAgICBpZiAoIUFCU09MVVRFX0pVTVAob3Bjb2RlKSkKKyAgICAgICAgICAgICAgICAgICAgdGd0dGd0IC09IGkgKyAzOyAgICAgLyogQ2FsYyByZWxhdGl2ZSBqdW1wIGFkZHIgKi8KKyAgICAgICAgICAgICAgICBpZiAodGd0dGd0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBiYWNrd2FyZCByZWxhdGl2ZSBqdW1wcyAqLworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gb3Bjb2RlOworICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3R0Z3QpOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQljYXNlIEVYVEVOREVEX0FSRzoKLQkJCQlnb3RvIGV4aXRVbmNoYW5nZWQ7CisgICAgICAgICAgICBjYXNlIEVYVEVOREVEX0FSRzoKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7CiAKLQkJCQkvKiBSZXBsYWNlIFJFVFVSTiBMT0FEX0NPTlNUIE5vbmUgUkVUVVJOIHdpdGgganVzdCBSRVRVUk4gKi8KLQkJCQkvKiBSZW1vdmUgdW5yZWFjaGFibGUgSlVNUHMgYWZ0ZXIgUkVUVVJOICovCi0JCQljYXNlIFJFVFVSTl9WQUxVRToKLQkJCQlpZiAoaSs0ID49IGNvZGVsZW4pCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjb2Rlc3RyW2krNF0gPT0gUkVUVVJOX1ZBTFVFICYmCi0JCQkJICAgIElTQkFTSUNCTE9DSyhibG9ja3MsaSw1KSkKLQkJCQkJbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDQpOwotCQkJCWVsc2UgaWYgKFVOQ09ORElUSU9OQUxfSlVNUChjb2Rlc3RyW2krMV0pICYmCi0JCQkJICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDQpKQotCQkJCQltZW1zZXQoY29kZXN0citpKzEsIE5PUCwgMyk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBSRVRVUk4gTE9BRF9DT05TVCBOb25lIFJFVFVSTiB3aXRoIGp1c3QgUkVUVVJOICovCisgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHVucmVhY2hhYmxlIEpVTVBzIGFmdGVyIFJFVFVSTiAqLworICAgICAgICAgICAgY2FzZSBSRVRVUk5fVkFMVUU6CisgICAgICAgICAgICAgICAgaWYgKGkrNCA+PSBjb2RlbGVuKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzRdID09IFJFVFVSTl9WQUxVRSAmJgorICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLGksNSkpCisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCA0KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChVTkNPTkRJVElPTkFMX0pVTVAoY29kZXN0cltpKzFdKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsaSw0KSkKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogCi0JLyogRml4dXAgbGluZW5vdGFiICovCi0JZm9yIChpPTAsIG5vcHM9MCA7IGk8Y29kZWxlbiA7IGkgKz0gQ09ERVNJWkUoY29kZXN0cltpXSkpIHsKLQkJYWRkcm1hcFtpXSA9IGkgLSBub3BzOwotCQlpZiAoY29kZXN0cltpXSA9PSBOT1ApCi0JCQlub3BzKys7Ci0JfQotCWN1bV9vcmlnX2xpbmUgPSAwOwotCWxhc3RfbGluZSA9IDA7Ci0JZm9yIChpPTAgOyBpIDwgdGFic2l6IDsgaSs9MikgewotCQljdW1fb3JpZ19saW5lICs9IGxpbmVub1tpXTsKLQkJbmV3X2xpbmUgPSBhZGRybWFwW2N1bV9vcmlnX2xpbmVdOwotCQlhc3NlcnQgKG5ld19saW5lIC0gbGFzdF9saW5lIDwgMjU1KTsKLQkJbGluZW5vW2ldID0oKHVuc2lnbmVkIGNoYXIpKG5ld19saW5lIC0gbGFzdF9saW5lKSk7Ci0JCWxhc3RfbGluZSA9IG5ld19saW5lOwotCX0KKyAgICAvKiBGaXh1cCBsaW5lbm90YWIgKi8KKyAgICBmb3IgKGk9MCwgbm9wcz0wIDsgaTxjb2RlbGVuIDsgaSArPSBDT0RFU0laRShjb2Rlc3RyW2ldKSkgeworICAgICAgICBhZGRybWFwW2ldID0gaSAtIG5vcHM7CisgICAgICAgIGlmIChjb2Rlc3RyW2ldID09IE5PUCkKKyAgICAgICAgICAgIG5vcHMrKzsKKyAgICB9CisgICAgY3VtX29yaWdfbGluZSA9IDA7CisgICAgbGFzdF9saW5lID0gMDsKKyAgICBmb3IgKGk9MCA7IGkgPCB0YWJzaXogOyBpKz0yKSB7CisgICAgICAgIGN1bV9vcmlnX2xpbmUgKz0gbGluZW5vW2ldOworICAgICAgICBuZXdfbGluZSA9IGFkZHJtYXBbY3VtX29yaWdfbGluZV07CisgICAgICAgIGFzc2VydCAobmV3X2xpbmUgLSBsYXN0X2xpbmUgPCAyNTUpOworICAgICAgICBsaW5lbm9baV0gPSgodW5zaWduZWQgY2hhcikobmV3X2xpbmUgLSBsYXN0X2xpbmUpKTsKKyAgICAgICAgbGFzdF9saW5lID0gbmV3X2xpbmU7CisgICAgfQogCi0JLyogUmVtb3ZlIE5PUHMgYW5kIGZpeHVwIGp1bXAgdGFyZ2V0cyAqLwotCWZvciAoaT0wLCBoPTAgOyBpPGNvZGVsZW4gOyApIHsKLQkJb3Bjb2RlID0gY29kZXN0cltpXTsKLQkJc3dpdGNoIChvcGNvZGUpIHsKLQkJCWNhc2UgTk9QOgotCQkJCWkrKzsKLQkJCQljb250aW51ZTsKKyAgICAvKiBSZW1vdmUgTk9QcyBhbmQgZml4dXAganVtcCB0YXJnZXRzICovCisgICAgZm9yIChpPTAsIGg9MCA7IGk8Y29kZWxlbiA7ICkgeworICAgICAgICBvcGNvZGUgPSBjb2Rlc3RyW2ldOworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBOT1A6CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCQljYXNlIEpVTVBfQUJTT0xVVEU6Ci0JCQljYXNlIENPTlRJTlVFX0xPT1A6Ci0JCQljYXNlIFBPUF9KVU1QX0lGX0ZBTFNFOgotCQkJY2FzZSBQT1BfSlVNUF9JRl9UUlVFOgotCQkJY2FzZSBKVU1QX0lGX0ZBTFNFX09SX1BPUDoKLQkJCWNhc2UgSlVNUF9JRl9UUlVFX09SX1BPUDoKLQkJCQlqID0gYWRkcm1hcFtHRVRBUkcoY29kZXN0ciwgaSldOwotCQkJCVNFVEFSRyhjb2Rlc3RyLCBpLCBqKTsKLQkJCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSlVNUF9BQlNPTFVURToKKyAgICAgICAgICAgIGNhc2UgQ09OVElOVUVfTE9PUDoKKyAgICAgICAgICAgIGNhc2UgUE9QX0pVTVBfSUZfRkFMU0U6CisgICAgICAgICAgICBjYXNlIFBPUF9KVU1QX0lGX1RSVUU6CisgICAgICAgICAgICBjYXNlIEpVTVBfSUZfRkFMU0VfT1JfUE9QOgorICAgICAgICAgICAgY2FzZSBKVU1QX0lGX1RSVUVfT1JfUE9QOgorICAgICAgICAgICAgICAgIGogPSBhZGRybWFwW0dFVEFSRyhjb2Rlc3RyLCBpKV07CisgICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIGopOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQljYXNlIEZPUl9JVEVSOgotCQkJY2FzZSBKVU1QX0ZPUldBUkQ6Ci0JCQljYXNlIFNFVFVQX0xPT1A6Ci0JCQljYXNlIFNFVFVQX0VYQ0VQVDoKLQkJCWNhc2UgU0VUVVBfRklOQUxMWToKLQkJCWNhc2UgU0VUVVBfV0lUSDoKLQkJCQlqID0gYWRkcm1hcFtHRVRBUkcoY29kZXN0ciwgaSkgKyBpICsgM10gLSBhZGRybWFwW2ldIC0gMzsKLQkJCQlTRVRBUkcoY29kZXN0ciwgaSwgaik7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJYWRqID0gQ09ERVNJWkUob3Bjb2RlKTsKLQkJd2hpbGUgKGFkai0tKQotCQkJY29kZXN0cltoKytdID0gY29kZXN0cltpKytdOwotCX0KLQlhc3NlcnQoaCArIG5vcHMgPT0gY29kZWxlbik7CisgICAgICAgICAgICBjYXNlIEZPUl9JVEVSOgorICAgICAgICAgICAgY2FzZSBKVU1QX0ZPUldBUkQ6CisgICAgICAgICAgICBjYXNlIFNFVFVQX0xPT1A6CisgICAgICAgICAgICBjYXNlIFNFVFVQX0VYQ0VQVDoKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfV0lUSDoKKyAgICAgICAgICAgICAgICBqID0gYWRkcm1hcFtHRVRBUkcoY29kZXN0ciwgaSkgKyBpICsgM10gLSBhZGRybWFwW2ldIC0gMzsKKyAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgaik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYWRqID0gQ09ERVNJWkUob3Bjb2RlKTsKKyAgICAgICAgd2hpbGUgKGFkai0tKQorICAgICAgICAgICAgY29kZXN0cltoKytdID0gY29kZXN0cltpKytdOworICAgIH0KKyAgICBhc3NlcnQoaCArIG5vcHMgPT0gY29kZWxlbik7CiAKLQljb2RlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKiljb2Rlc3RyLCBoKTsKLQlQeU1lbV9GcmVlKGFkZHJtYXApOwotCVB5TWVtX0ZyZWUoY29kZXN0cik7Ci0JUHlNZW1fRnJlZShibG9ja3MpOwotCXJldHVybiBjb2RlOworICAgIGNvZGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKWNvZGVzdHIsIGgpOworICAgIFB5TWVtX0ZyZWUoYWRkcm1hcCk7CisgICAgUHlNZW1fRnJlZShjb2Rlc3RyKTsKKyAgICBQeU1lbV9GcmVlKGJsb2Nrcyk7CisgICAgcmV0dXJuIGNvZGU7CiAKICBleGl0RXJyb3I6Ci0JY29kZSA9IE5VTEw7CisgICAgY29kZSA9IE5VTEw7CiAKICBleGl0VW5jaGFuZ2VkOgotCWlmIChibG9ja3MgIT0gTlVMTCkKLQkJUHlNZW1fRnJlZShibG9ja3MpOwotCWlmIChhZGRybWFwICE9IE5VTEwpCi0JCVB5TWVtX0ZyZWUoYWRkcm1hcCk7Ci0JaWYgKGNvZGVzdHIgIT0gTlVMTCkKLQkJUHlNZW1fRnJlZShjb2Rlc3RyKTsKLQlQeV9YSU5DUkVGKGNvZGUpOwotCXJldHVybiBjb2RlOworICAgIGlmIChibG9ja3MgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRnJlZShibG9ja3MpOworICAgIGlmIChhZGRybWFwICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZyZWUoYWRkcm1hcCk7CisgICAgaWYgKGNvZGVzdHIgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRnJlZShjb2Rlc3RyKTsKKyAgICBQeV9YSU5DUkVGKGNvZGUpOworICAgIHJldHVybiBjb2RlOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5YXJlbmEuYyBiL1B5dGhvbi9weWFyZW5hLmMKaW5kZXggZjRjYzQ3NC4uMmQ2MzYzOCAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5YXJlbmEuYworKysgYi9QeXRob24vcHlhcmVuYS5jCkBAIC0xMiwzMiArMTIsMzIgQEAKICovCiAKICNkZWZpbmUgREVGQVVMVF9CTE9DS19TSVpFIDgxOTIKLSNkZWZpbmUgQUxJR05NRU5UCQk4Ci0jZGVmaW5lIEFMSUdOTUVOVF9NQVNLCQkoQUxJR05NRU5UIC0gMSkKLSNkZWZpbmUgUk9VTkRVUCh4KQkJKCgoeCkgKyBBTElHTk1FTlRfTUFTSykgJiB+QUxJR05NRU5UX01BU0spCisjZGVmaW5lIEFMSUdOTUVOVCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQUxJR05NRU5UX01BU0sgICAgICAgICAgKEFMSUdOTUVOVCAtIDEpCisjZGVmaW5lIFJPVU5EVVAoeCkgICAgICAgICAgICAgICgoKHgpICsgQUxJR05NRU5UX01BU0spICYgfkFMSUdOTUVOVF9NQVNLKQogCiB0eXBlZGVmIHN0cnVjdCBfYmxvY2sgewotCS8qIFRvdGFsIG51bWJlciBvZiBieXRlcyBvd25lZCBieSB0aGlzIGJsb2NrIGF2YWlsYWJsZSB0byBwYXNzIG91dC4KLQkgKiBSZWFkLW9ubHkgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uICBUaGUgZmlyc3Qgc3VjaCBieXRlIHN0YXJ0cyBhdAotCSAqIGFiX21lbS4KLQkgKi8KLQlzaXplX3QgYWJfc2l6ZTsKKyAgICAvKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgb3duZWQgYnkgdGhpcyBibG9jayBhdmFpbGFibGUgdG8gcGFzcyBvdXQuCisgICAgICogUmVhZC1vbmx5IGFmdGVyIGluaXRpYWxpemF0aW9uLiAgVGhlIGZpcnN0IHN1Y2ggYnl0ZSBzdGFydHMgYXQKKyAgICAgKiBhYl9tZW0uCisgICAgICovCisgICAgc2l6ZV90IGFiX3NpemU7CiAKLQkvKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSBwYXNzZWQgb3V0LiAgVGhlIG5leHQgYnl0ZSBhdmFpbGFibGUKLQkgKiB0byBwYXNzIG91dCBzdGFydHMgYXQgYWJfbWVtICsgYWJfb2Zmc2V0LgotCSAqLwotCXNpemVfdCBhYl9vZmZzZXQ7CisgICAgLyogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIGFscmVhZHkgcGFzc2VkIG91dC4gIFRoZSBuZXh0IGJ5dGUgYXZhaWxhYmxlCisgICAgICogdG8gcGFzcyBvdXQgc3RhcnRzIGF0IGFiX21lbSArIGFiX29mZnNldC4KKyAgICAgKi8KKyAgICBzaXplX3QgYWJfb2Zmc2V0OwogCi0JLyogQW4gYXJlbmEgbWFpbnRhaW5zIGEgc2luZ2x5LWxpbmtlZCwgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YKLQkgKiBhbGwgYmxvY2tzIG93bmVkIGJ5IHRoZSBhcmVuYS4gIFRoZXNlIGFyZSBsaW5rZWQgdmlhIHRoZQotCSAqIGFiX25leHQgbWVtYmVyLgotCSAqLwotCXN0cnVjdCBfYmxvY2sgKmFiX25leHQ7CisgICAgLyogQW4gYXJlbmEgbWFpbnRhaW5zIGEgc2luZ2x5LWxpbmtlZCwgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YKKyAgICAgKiBhbGwgYmxvY2tzIG93bmVkIGJ5IHRoZSBhcmVuYS4gIFRoZXNlIGFyZSBsaW5rZWQgdmlhIHRoZQorICAgICAqIGFiX25leHQgbWVtYmVyLgorICAgICAqLworICAgIHN0cnVjdCBfYmxvY2sgKmFiX25leHQ7CiAKLQkvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCBhbGxvY2F0YWJsZSBieXRlIG93bmVkIGJ5IHRoaXMgYmxvY2suICBSZWFkLQotCSAqIG9ubHkgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCi0JICovCi0Jdm9pZCAqYWJfbWVtOworICAgIC8qIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGFsbG9jYXRhYmxlIGJ5dGUgb3duZWQgYnkgdGhpcyBibG9jay4gIFJlYWQtCisgICAgICogb25seSBhZnRlciBpbml0aWFsaXphdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkICphYl9tZW07CiB9IGJsb2NrOwogCiAvKiBUaGUgYXJlbmEgbWFuYWdlcyB0d28ga2luZHMgb2YgbWVtb3J5LCBibG9ja3Mgb2YgcmF3IG1lbW9yeQpAQCAtNDYsMTc1ICs0NiwxNzUgQEAKICovCiAKIHN0cnVjdCBfYXJlbmEgewotICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCBibG9jayBhbGxvY2F0ZWQgZm9yIHRoZSBhcmVuYSwgbmV2ZXIgTlVMTC4KLSAgICAgICAgICAgSXQgaXMgdXNlZCBvbmx5IHRvIGZpbmQgdGhlIGZpcnN0IGJsb2NrIHdoZW4gdGhlIGFyZW5hIGlzCi0gICAgICAgICAgIGJlaW5nIGZyZWVkLgotICAgICAgICAgKi8KLQlibG9jayAqYV9oZWFkOworICAgIC8qIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGJsb2NrIGFsbG9jYXRlZCBmb3IgdGhlIGFyZW5hLCBuZXZlciBOVUxMLgorICAgICAgIEl0IGlzIHVzZWQgb25seSB0byBmaW5kIHRoZSBmaXJzdCBibG9jayB3aGVuIHRoZSBhcmVuYSBpcworICAgICAgIGJlaW5nIGZyZWVkLgorICAgICAqLworICAgIGJsb2NrICphX2hlYWQ7CiAKLSAgICAgICAgLyogUG9pbnRlciB0byB0aGUgYmxvY2sgY3VycmVudGx5IHVzZWQgZm9yIGFsbG9jYXRpb24uICBJdCdzCi0gICAgICAgICAgIGFiX25leHQgZmllbGQgc2hvdWxkIGJlIE5VTEwuICBJZiBpdCBpcyBub3QtbnVsbCBhZnRlciBhCi0gICAgICAgICAgIGNhbGwgdG8gYmxvY2tfYWxsb2MoKSwgaXQgbWVhbnMgYSBuZXcgYmxvY2sgaGFzIGJlZW4gYWxsb2NhdGVkCi0gICAgICAgICAgIGFuZCBhX2N1ciBzaG91bGQgYmUgcmVzZXQgdG8gcG9pbnQgaXQuCi0gICAgICAgICAqLwotCWJsb2NrICphX2N1cjsKKyAgICAvKiBQb2ludGVyIHRvIHRoZSBibG9jayBjdXJyZW50bHkgdXNlZCBmb3IgYWxsb2NhdGlvbi4gIEl0J3MKKyAgICAgICBhYl9uZXh0IGZpZWxkIHNob3VsZCBiZSBOVUxMLiAgSWYgaXQgaXMgbm90LW51bGwgYWZ0ZXIgYQorICAgICAgIGNhbGwgdG8gYmxvY2tfYWxsb2MoKSwgaXQgbWVhbnMgYSBuZXcgYmxvY2sgaGFzIGJlZW4gYWxsb2NhdGVkCisgICAgICAgYW5kIGFfY3VyIHNob3VsZCBiZSByZXNldCB0byBwb2ludCBpdC4KKyAgICAgKi8KKyAgICBibG9jayAqYV9jdXI7CiAKLSAgICAgICAgLyogQSBQeXRob24gbGlzdCBvYmplY3QgY29udGFpbmluZyByZWZlcmVuY2VzIHRvIGFsbCB0aGUgUHlPYmplY3QKLSAgICAgICAgICAgcG9pbnRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXJlYS4gIFRoZXkgd2lsbCBiZSBERUNSRUZlZAotICAgICAgICAgICB3aGVuIHRoZSBhcmVuYSBpcyBmcmVlZC4KLSAgICAgICAgKi8KLSAgICAgICAgUHlPYmplY3QgKmFfb2JqZWN0czsKKyAgICAvKiBBIFB5dGhvbiBsaXN0IG9iamVjdCBjb250YWluaW5nIHJlZmVyZW5jZXMgdG8gYWxsIHRoZSBQeU9iamVjdAorICAgICAgIHBvaW50ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFyZWEuICBUaGV5IHdpbGwgYmUgREVDUkVGZWQKKyAgICAgICB3aGVuIHRoZSBhcmVuYSBpcyBmcmVlZC4KKyAgICAqLworICAgIFB5T2JqZWN0ICphX29iamVjdHM7CiAKICNpZiBkZWZpbmVkKFB5X0RFQlVHKQotICAgICAgICAvKiBEZWJ1ZyBvdXRwdXQgKi8KLSAgICAgICAgc2l6ZV90IHRvdGFsX2FsbG9jczsKLSAgICAgICAgc2l6ZV90IHRvdGFsX3NpemU7Ci0gICAgICAgIHNpemVfdCB0b3RhbF9ibG9ja3M7Ci0gICAgICAgIHNpemVfdCB0b3RhbF9ibG9ja19zaXplOwotICAgICAgICBzaXplX3QgdG90YWxfYmlnX2Jsb2NrczsKKyAgICAvKiBEZWJ1ZyBvdXRwdXQgKi8KKyAgICBzaXplX3QgdG90YWxfYWxsb2NzOworICAgIHNpemVfdCB0b3RhbF9zaXplOworICAgIHNpemVfdCB0b3RhbF9ibG9ja3M7CisgICAgc2l6ZV90IHRvdGFsX2Jsb2NrX3NpemU7CisgICAgc2l6ZV90IHRvdGFsX2JpZ19ibG9ja3M7CiAjZW5kaWYKIH07CiAKIHN0YXRpYyBibG9jayAqCiBibG9ja19uZXcoc2l6ZV90IHNpemUpCiB7Ci0JLyogQWxsb2NhdGUgaGVhZGVyIGFuZCBibG9jayBhcyBvbmUgdW5pdC4KLQkgICBhYl9tZW0gcG9pbnRzIGp1c3QgcGFzdCBoZWFkZXIuICovCi0JYmxvY2sgKmIgPSAoYmxvY2sgKiltYWxsb2Moc2l6ZW9mKGJsb2NrKSArIHNpemUpOwotCWlmICghYikKLQkJcmV0dXJuIE5VTEw7Ci0JYi0+YWJfc2l6ZSA9IHNpemU7Ci0JYi0+YWJfbWVtID0gKHZvaWQgKikoYiArIDEpOwotCWItPmFiX25leHQgPSBOVUxMOwotCWItPmFiX29mZnNldCA9IFJPVU5EVVAoKFB5X3VpbnRwdHJfdCkoYi0+YWJfbWVtKSkgLSAKLQkgIChQeV91aW50cHRyX3QpKGItPmFiX21lbSk7Ci0JcmV0dXJuIGI7CisgICAgLyogQWxsb2NhdGUgaGVhZGVyIGFuZCBibG9jayBhcyBvbmUgdW5pdC4KKyAgICAgICBhYl9tZW0gcG9pbnRzIGp1c3QgcGFzdCBoZWFkZXIuICovCisgICAgYmxvY2sgKmIgPSAoYmxvY2sgKiltYWxsb2Moc2l6ZW9mKGJsb2NrKSArIHNpemUpOworICAgIGlmICghYikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYi0+YWJfc2l6ZSA9IHNpemU7CisgICAgYi0+YWJfbWVtID0gKHZvaWQgKikoYiArIDEpOworICAgIGItPmFiX25leHQgPSBOVUxMOworICAgIGItPmFiX29mZnNldCA9IFJPVU5EVVAoKFB5X3VpbnRwdHJfdCkoYi0+YWJfbWVtKSkgLQorICAgICAgKFB5X3VpbnRwdHJfdCkoYi0+YWJfbWVtKTsKKyAgICByZXR1cm4gYjsKIH0KIAogc3RhdGljIHZvaWQKIGJsb2NrX2ZyZWUoYmxvY2sgKmIpIHsKLQl3aGlsZSAoYikgewotCQlibG9jayAqbmV4dCA9IGItPmFiX25leHQ7Ci0JCWZyZWUoYik7Ci0JCWIgPSBuZXh0OwotCX0KKyAgICB3aGlsZSAoYikgeworICAgICAgICBibG9jayAqbmV4dCA9IGItPmFiX25leHQ7CisgICAgICAgIGZyZWUoYik7CisgICAgICAgIGIgPSBuZXh0OworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgKgogYmxvY2tfYWxsb2MoYmxvY2sgKmIsIHNpemVfdCBzaXplKQogewotCXZvaWQgKnA7Ci0JYXNzZXJ0KGIpOwotCXNpemUgPSBST1VORFVQKHNpemUpOwotCWlmIChiLT5hYl9vZmZzZXQgKyBzaXplID4gYi0+YWJfc2l6ZSkgewotCQkvKiBJZiB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1vcmUgbWVtb3J5IHRoYW4gd2lsbCBmaXQgaW4KLQkJICAgdGhlIGRlZmF1bHQgYmxvY2ssIGFsbG9jYXRlIGEgb25lLW9mZiBibG9jayB0aGF0IGlzCi0JCSAgIGV4YWN0bHkgdGhlIHJpZ2h0IHNpemUuICovCi0JCS8qIFRPRE8oamh5bHRvbik6IFRoaW5rIGFib3V0IHNwYWNlIHdhc3RlIGF0IGVuZCBvZiBibG9jayAqLwotCQlibG9jayAqbmV3YmwgPSBibG9ja19uZXcoCi0JCQkJc2l6ZSA8IERFRkFVTFRfQkxPQ0tfU0laRSA/Ci0JCQkJREVGQVVMVF9CTE9DS19TSVpFIDogc2l6ZSk7Ci0JCWlmICghbmV3YmwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJYXNzZXJ0KCFiLT5hYl9uZXh0KTsKLQkJYi0+YWJfbmV4dCA9IG5ld2JsOwotCQliID0gbmV3Ymw7Ci0JfQorICAgIHZvaWQgKnA7CisgICAgYXNzZXJ0KGIpOworICAgIHNpemUgPSBST1VORFVQKHNpemUpOworICAgIGlmIChiLT5hYl9vZmZzZXQgKyBzaXplID4gYi0+YWJfc2l6ZSkgeworICAgICAgICAvKiBJZiB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1vcmUgbWVtb3J5IHRoYW4gd2lsbCBmaXQgaW4KKyAgICAgICAgICAgdGhlIGRlZmF1bHQgYmxvY2ssIGFsbG9jYXRlIGEgb25lLW9mZiBibG9jayB0aGF0IGlzCisgICAgICAgICAgIGV4YWN0bHkgdGhlIHJpZ2h0IHNpemUuICovCisgICAgICAgIC8qIFRPRE8oamh5bHRvbik6IFRoaW5rIGFib3V0IHNwYWNlIHdhc3RlIGF0IGVuZCBvZiBibG9jayAqLworICAgICAgICBibG9jayAqbmV3YmwgPSBibG9ja19uZXcoCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplIDwgREVGQVVMVF9CTE9DS19TSVpFID8KKyAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQkxPQ0tfU0laRSA6IHNpemUpOworICAgICAgICBpZiAoIW5ld2JsKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGFzc2VydCghYi0+YWJfbmV4dCk7CisgICAgICAgIGItPmFiX25leHQgPSBuZXdibDsKKyAgICAgICAgYiA9IG5ld2JsOworICAgIH0KIAotCWFzc2VydChiLT5hYl9vZmZzZXQgKyBzaXplIDw9IGItPmFiX3NpemUpOwotCXAgPSAodm9pZCAqKSgoKGNoYXIgKiliLT5hYl9tZW0pICsgYi0+YWJfb2Zmc2V0KTsKLQliLT5hYl9vZmZzZXQgKz0gc2l6ZTsKLQlyZXR1cm4gcDsKKyAgICBhc3NlcnQoYi0+YWJfb2Zmc2V0ICsgc2l6ZSA8PSBiLT5hYl9zaXplKTsKKyAgICBwID0gKHZvaWQgKikoKChjaGFyICopYi0+YWJfbWVtKSArIGItPmFiX29mZnNldCk7CisgICAgYi0+YWJfb2Zmc2V0ICs9IHNpemU7CisgICAgcmV0dXJuIHA7CiB9CiAKIFB5QXJlbmEgKgogUHlBcmVuYV9OZXcoKQogewotCVB5QXJlbmEqIGFyZW5hID0gKFB5QXJlbmEgKiltYWxsb2Moc2l6ZW9mKFB5QXJlbmEpKTsKLQlpZiAoIWFyZW5hKQotCQlyZXR1cm4gKFB5QXJlbmEqKVB5RXJyX05vTWVtb3J5KCk7CisgICAgUHlBcmVuYSogYXJlbmEgPSAoUHlBcmVuYSAqKW1hbGxvYyhzaXplb2YoUHlBcmVuYSkpOworICAgIGlmICghYXJlbmEpCisgICAgICAgIHJldHVybiAoUHlBcmVuYSopUHlFcnJfTm9NZW1vcnkoKTsKIAotCWFyZW5hLT5hX2hlYWQgPSBibG9ja19uZXcoREVGQVVMVF9CTE9DS19TSVpFKTsKLQlhcmVuYS0+YV9jdXIgPSBhcmVuYS0+YV9oZWFkOwotICAgICAgICBpZiAoIWFyZW5hLT5hX2hlYWQpIHsKLSAgICAgICAgICAgICAgICBmcmVlKCh2b2lkICopYXJlbmEpOwotICAgICAgICAgICAgICAgIHJldHVybiAoUHlBcmVuYSopUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgfQotICAgICAgICBhcmVuYS0+YV9vYmplY3RzID0gUHlMaXN0X05ldygwKTsKLSAgICAgICAgaWYgKCFhcmVuYS0+YV9vYmplY3RzKSB7Ci0gICAgICAgICAgICAgICAgYmxvY2tfZnJlZShhcmVuYS0+YV9oZWFkKTsKLSAgICAgICAgICAgICAgICBmcmVlKCh2b2lkICopYXJlbmEpOwotICAgICAgICAgICAgICAgIHJldHVybiAoUHlBcmVuYSopUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgfQorICAgIGFyZW5hLT5hX2hlYWQgPSBibG9ja19uZXcoREVGQVVMVF9CTE9DS19TSVpFKTsKKyAgICBhcmVuYS0+YV9jdXIgPSBhcmVuYS0+YV9oZWFkOworICAgIGlmICghYXJlbmEtPmFfaGVhZCkgeworICAgICAgICBmcmVlKCh2b2lkICopYXJlbmEpOworICAgICAgICByZXR1cm4gKFB5QXJlbmEqKVB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIGFyZW5hLT5hX29iamVjdHMgPSBQeUxpc3RfTmV3KDApOworICAgIGlmICghYXJlbmEtPmFfb2JqZWN0cykgeworICAgICAgICBibG9ja19mcmVlKGFyZW5hLT5hX2hlYWQpOworICAgICAgICBmcmVlKCh2b2lkICopYXJlbmEpOworICAgICAgICByZXR1cm4gKFB5QXJlbmEqKVB5RXJyX05vTWVtb3J5KCk7CisgICAgfQogI2lmIGRlZmluZWQoUHlfREVCVUcpCi0gICAgICAgIGFyZW5hLT50b3RhbF9hbGxvY3MgPSAwOwotICAgICAgICBhcmVuYS0+dG90YWxfc2l6ZSA9IDA7Ci0gICAgICAgIGFyZW5hLT50b3RhbF9ibG9ja3MgPSAxOwotICAgICAgICBhcmVuYS0+dG90YWxfYmxvY2tfc2l6ZSA9IERFRkFVTFRfQkxPQ0tfU0laRTsKLSAgICAgICAgYXJlbmEtPnRvdGFsX2JpZ19ibG9ja3MgPSAwOworICAgIGFyZW5hLT50b3RhbF9hbGxvY3MgPSAwOworICAgIGFyZW5hLT50b3RhbF9zaXplID0gMDsKKyAgICBhcmVuYS0+dG90YWxfYmxvY2tzID0gMTsKKyAgICBhcmVuYS0+dG90YWxfYmxvY2tfc2l6ZSA9IERFRkFVTFRfQkxPQ0tfU0laRTsKKyAgICBhcmVuYS0+dG90YWxfYmlnX2Jsb2NrcyA9IDA7CiAjZW5kaWYKLQlyZXR1cm4gYXJlbmE7CisgICAgcmV0dXJuIGFyZW5hOwogfQogCiB2b2lkCiBQeUFyZW5hX0ZyZWUoUHlBcmVuYSAqYXJlbmEpCiB7Ci0gICAgICAgIGludCByOwotCWFzc2VydChhcmVuYSk7CisgICAgaW50IHI7CisgICAgYXNzZXJ0KGFyZW5hKTsKICNpZiBkZWZpbmVkKFB5X0RFQlVHKQotICAgICAgICAvKgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAiYWxsb2M9JWQgc2l6ZT0lZCBibG9ja3M9JWQgYmxvY2tfc2l6ZT0lZCBiaWc9JWQgb2JqZWN0cz0lZFxuIiwKLSAgICAgICAgICAgICAgICBhcmVuYS0+dG90YWxfYWxsb2NzLCBhcmVuYS0+dG90YWxfc2l6ZSwgYXJlbmEtPnRvdGFsX2Jsb2NrcywKLSAgICAgICAgICAgICAgICBhcmVuYS0+dG90YWxfYmxvY2tfc2l6ZSwgYXJlbmEtPnRvdGFsX2JpZ19ibG9ja3MsCi0gICAgICAgICAgICAgICAgUHlMaXN0X1NpemUoYXJlbmEtPmFfb2JqZWN0cykpOwotICAgICAgICAqLworICAgIC8qCisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICJhbGxvYz0lZCBzaXplPSVkIGJsb2Nrcz0lZCBibG9ja19zaXplPSVkIGJpZz0lZCBvYmplY3RzPSVkXG4iLAorICAgICAgICBhcmVuYS0+dG90YWxfYWxsb2NzLCBhcmVuYS0+dG90YWxfc2l6ZSwgYXJlbmEtPnRvdGFsX2Jsb2NrcywKKyAgICAgICAgYXJlbmEtPnRvdGFsX2Jsb2NrX3NpemUsIGFyZW5hLT50b3RhbF9iaWdfYmxvY2tzLAorICAgICAgICBQeUxpc3RfU2l6ZShhcmVuYS0+YV9vYmplY3RzKSk7CisgICAgKi8KICNlbmRpZgotCWJsb2NrX2ZyZWUoYXJlbmEtPmFfaGVhZCk7Ci0JLyogVGhpcyBwcm9wZXJ0eSBub3JtYWxseSBob2xkcywgZXhjZXB0IHdoZW4gdGhlIGNvZGUgYmVpbmcgY29tcGlsZWQKLQkgICBpcyBzeXMuZ2V0b2JqZWN0cygwKSwgaW4gd2hpY2ggY2FzZSB0aGVyZSB3aWxsIGJlIHR3byByZWZlcmVuY2VzLgotICAgICAgICBhc3NlcnQoYXJlbmEtPmFfb2JqZWN0cy0+b2JfcmVmY250ID09IDEpOwotCSovCisgICAgYmxvY2tfZnJlZShhcmVuYS0+YV9oZWFkKTsKKyAgICAvKiBUaGlzIHByb3BlcnR5IG5vcm1hbGx5IGhvbGRzLCBleGNlcHQgd2hlbiB0aGUgY29kZSBiZWluZyBjb21waWxlZAorICAgICAgIGlzIHN5cy5nZXRvYmplY3RzKDApLCBpbiB3aGljaCBjYXNlIHRoZXJlIHdpbGwgYmUgdHdvIHJlZmVyZW5jZXMuCisgICAgYXNzZXJ0KGFyZW5hLT5hX29iamVjdHMtPm9iX3JlZmNudCA9PSAxKTsKKyAgICAqLwogCi0gICAgICAgIC8qIENsZWFyIGFsbCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdC4gIFRoaXMgaXMgbmVjZXNzYXJ5Ci0gICAgICAgICAgIHRvIGd1YXJhbnRlZSB0aGF0IHRoZXkgd2lsbCBiZSBERUNSRUZlZC4gKi8KLSAgICAgICAgciA9IFB5TGlzdF9TZXRTbGljZShhcmVuYS0+YV9vYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFB5TGlzdF9HRVRfU0laRShhcmVuYS0+YV9vYmplY3RzKSwgTlVMTCk7Ci0gICAgICAgIGFzc2VydChyID09IDApOwotICAgICAgICBhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKGFyZW5hLT5hX29iamVjdHMpID09IDApOwotICAgICAgICBQeV9ERUNSRUYoYXJlbmEtPmFfb2JqZWN0cyk7Ci0JZnJlZShhcmVuYSk7CisgICAgLyogQ2xlYXIgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0LiAgVGhpcyBpcyBuZWNlc3NhcnkKKyAgICAgICB0byBndWFyYW50ZWUgdGhhdCB0aGV5IHdpbGwgYmUgREVDUkVGZWQuICovCisgICAgciA9IFB5TGlzdF9TZXRTbGljZShhcmVuYS0+YV9vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgUHlMaXN0X0dFVF9TSVpFKGFyZW5hLT5hX29iamVjdHMpLCBOVUxMKTsKKyAgICBhc3NlcnQociA9PSAwKTsKKyAgICBhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKGFyZW5hLT5hX29iamVjdHMpID09IDApOworICAgIFB5X0RFQ1JFRihhcmVuYS0+YV9vYmplY3RzKTsKKyAgICBmcmVlKGFyZW5hKTsKIH0KIAogdm9pZCAqCiBQeUFyZW5hX01hbGxvYyhQeUFyZW5hICphcmVuYSwgc2l6ZV90IHNpemUpCiB7Ci0Jdm9pZCAqcCA9IGJsb2NrX2FsbG9jKGFyZW5hLT5hX2N1ciwgc2l6ZSk7Ci0JaWYgKCFwKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB2b2lkICpwID0gYmxvY2tfYWxsb2MoYXJlbmEtPmFfY3VyLCBzaXplKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogI2lmIGRlZmluZWQoUHlfREVCVUcpCi0gICAgICAgIGFyZW5hLT50b3RhbF9hbGxvY3MrKzsKLSAgICAgICAgYXJlbmEtPnRvdGFsX3NpemUgKz0gc2l6ZTsKKyAgICBhcmVuYS0+dG90YWxfYWxsb2NzKys7CisgICAgYXJlbmEtPnRvdGFsX3NpemUgKz0gc2l6ZTsKICNlbmRpZgotCS8qIFJlc2V0IGN1ciBpZiB3ZSBhbGxvY2F0ZWQgYSBuZXcgYmxvY2suICovCi0JaWYgKGFyZW5hLT5hX2N1ci0+YWJfbmV4dCkgewotCQlhcmVuYS0+YV9jdXIgPSBhcmVuYS0+YV9jdXItPmFiX25leHQ7CisgICAgLyogUmVzZXQgY3VyIGlmIHdlIGFsbG9jYXRlZCBhIG5ldyBibG9jay4gKi8KKyAgICBpZiAoYXJlbmEtPmFfY3VyLT5hYl9uZXh0KSB7CisgICAgICAgIGFyZW5hLT5hX2N1ciA9IGFyZW5hLT5hX2N1ci0+YWJfbmV4dDsKICNpZiBkZWZpbmVkKFB5X0RFQlVHKQotICAgICAgICAgICAgICAgIGFyZW5hLT50b3RhbF9ibG9ja3MrKzsKLSAgICAgICAgICAgICAgICBhcmVuYS0+dG90YWxfYmxvY2tfc2l6ZSArPSBhcmVuYS0+YV9jdXItPmFiX3NpemU7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZW5hLT5hX2N1ci0+YWJfc2l6ZSA+IERFRkFVTFRfQkxPQ0tfU0laRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsrYXJlbmEtPnRvdGFsX2JpZ19ibG9ja3M7CisgICAgICAgIGFyZW5hLT50b3RhbF9ibG9ja3MrKzsKKyAgICAgICAgYXJlbmEtPnRvdGFsX2Jsb2NrX3NpemUgKz0gYXJlbmEtPmFfY3VyLT5hYl9zaXplOworICAgICAgICBpZiAoYXJlbmEtPmFfY3VyLT5hYl9zaXplID4gREVGQVVMVF9CTE9DS19TSVpFKQorICAgICAgICAgICAgKythcmVuYS0+dG90YWxfYmlnX2Jsb2NrczsKICNlbmRpZgotCX0KLQlyZXR1cm4gcDsKKyAgICB9CisgICAgcmV0dXJuIHA7CiB9CiAKIGludAogUHlBcmVuYV9BZGRQeU9iamVjdChQeUFyZW5hICphcmVuYSwgUHlPYmplY3QgKm9iaikKIHsKLSAgICAgICAgaW50IHIgPSBQeUxpc3RfQXBwZW5kKGFyZW5hLT5hX29iamVjdHMsIG9iaik7Ci0gICAgICAgIGlmIChyID49IDApIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcjsKKyAgICBpbnQgciA9IFB5TGlzdF9BcHBlbmQoYXJlbmEtPmFfb2JqZWN0cywgb2JqKTsKKyAgICBpZiAociA+PSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgIH0KKyAgICByZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weW1hdGguYyBiL1B5dGhvbi9weW1hdGguYwppbmRleCA4MzEwNWYyLi44MjdhNzczIDEwMDY0NAotLS0gYS9QeXRob24vcHltYXRoLmMKKysrIGIvUHl0aG9uL3B5bWF0aC5jCkBAIC03LDkgKzcsOSBAQAogICAgdGh1cyByb3VuZGluZyBmcm9tIGV4dGVuZGVkIHByZWNpc2lvbiB0byBkb3VibGUgcHJlY2lzaW9uLiAqLwogZG91YmxlIF9QeV9mb3JjZV9kb3VibGUoZG91YmxlIHgpCiB7Ci0Jdm9sYXRpbGUgZG91YmxlIHk7Ci0JeSA9IHg7Ci0JcmV0dXJuIHk7CisgICAgdm9sYXRpbGUgZG91YmxlIHk7CisgICAgeSA9IHg7CisgICAgcmV0dXJuIHk7CiB9CiAjZW5kaWYKIApAQCAtMzQsMjEgKzM0LDIxIEBACiAjaWZuZGVmIEhBVkVfSFlQT1QKIGRvdWJsZSBoeXBvdChkb3VibGUgeCwgZG91YmxlIHkpCiB7Ci0JZG91YmxlIHl4OworICAgIGRvdWJsZSB5eDsKIAotCXggPSBmYWJzKHgpOwotCXkgPSBmYWJzKHkpOwotCWlmICh4IDwgeSkgewotCQlkb3VibGUgdGVtcCA9IHg7Ci0JCXggPSB5OwotCQl5ID0gdGVtcDsKLQl9Ci0JaWYgKHggPT0gMC4pCi0JCXJldHVybiAwLjsKLQllbHNlIHsKLQkJeXggPSB5L3g7Ci0JCXJldHVybiB4KnNxcnQoMS4reXgqeXgpOwotCX0KKyAgICB4ID0gZmFicyh4KTsKKyAgICB5ID0gZmFicyh5KTsKKyAgICBpZiAoeCA8IHkpIHsKKyAgICAgICAgZG91YmxlIHRlbXAgPSB4OworICAgICAgICB4ID0geTsKKyAgICAgICAgeSA9IHRlbXA7CisgICAgfQorICAgIGlmICh4ID09IDAuKQorICAgICAgICByZXR1cm4gMC47CisgICAgZWxzZSB7CisgICAgICAgIHl4ID0geS94OworICAgICAgICByZXR1cm4geCpzcXJ0KDEuK3l4Knl4KTsKKyAgICB9CiB9CiAjZW5kaWYgLyogSEFWRV9IWVBPVCAqLwogCkBAIC01NiwxMiArNTYsMTIgQEAKIGRvdWJsZQogY29weXNpZ24oZG91YmxlIHgsIGRvdWJsZSB5KQogewotCS8qIHVzZSBhdGFuMiB0byBkaXN0aW5ndWlzaCAtMC4gZnJvbSAwLiAqLwotCWlmICh5ID4gMC4gfHwgKHkgPT0gMC4gJiYgYXRhbjIoeSwgLTEuKSA+IDAuKSkgewotCQlyZXR1cm4gZmFicyh4KTsKLQl9IGVsc2UgewotCQlyZXR1cm4gLWZhYnMoeCk7Ci0JfQorICAgIC8qIHVzZSBhdGFuMiB0byBkaXN0aW5ndWlzaCAtMC4gZnJvbSAwLiAqLworICAgIGlmICh5ID4gMC4gfHwgKHkgPT0gMC4gJiYgYXRhbjIoeSwgLTEuKSA+IDAuKSkgeworICAgICAgICByZXR1cm4gZmFicyh4KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLWZhYnMoeCk7CisgICAgfQogfQogI2VuZGlmIC8qIEhBVkVfQ09QWVNJR04gKi8KIApAQCAtNzMsNyArNzMsNyBAQAogICAgIGFic3ggPSBmYWJzKHgpOwogICAgIHkgPSBmbG9vcihhYnN4KTsKICAgICBpZiAoYWJzeCAtIHkgPj0gMC41KQotICAgICAgICB5ICs9IDEuMDsKKyAgICB5ICs9IDEuMDsKICAgICByZXR1cm4gY29weXNpZ24oeSwgeCk7CiB9CiAjZW5kaWYgLyogSEFWRV9ST1VORCAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5c3RhdGUuYyBiL1B5dGhvbi9weXN0YXRlLmMKaW5kZXggMzQzYTk3Yi4uNWFmYzAxYSAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5c3RhdGUuYworKysgYi9QeXRob24vcHlzdGF0ZS5jCkBAIC01OCw5MiArNTgsOTIgQEAKIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqCiBQeUludGVycHJldGVyU3RhdGVfTmV3KHZvaWQpCiB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSAoUHlJbnRlcnByZXRlclN0YXRlICopCi0JCQkJICAgICBtYWxsb2Moc2l6ZW9mKFB5SW50ZXJwcmV0ZXJTdGF0ZSkpOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFsbG9jKHNpemVvZihQeUludGVycHJldGVyU3RhdGUpKTsKIAotCWlmIChpbnRlcnAgIT0gTlVMTCkgewotCQlIRUFEX0lOSVQoKTsKKyAgICBpZiAoaW50ZXJwICE9IE5VTEwpIHsKKyAgICAgICAgSEVBRF9JTklUKCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJaWYgKGhlYWRfbXV0ZXggPT0gTlVMTCkKLQkJCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdGhyZWFkcyBmb3IgaW50ZXJwcmV0ZXIiKTsKKyAgICAgICAgaWYgKGhlYWRfbXV0ZXggPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdGhyZWFkcyBmb3IgaW50ZXJwcmV0ZXIiKTsKICNlbmRpZgotCQlpbnRlcnAtPm1vZHVsZXMgPSBOVUxMOwotCQlpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nID0gTlVMTDsKLQkJaW50ZXJwLT5zeXNkaWN0ID0gTlVMTDsKLQkJaW50ZXJwLT5idWlsdGlucyA9IE5VTEw7Ci0JCWludGVycC0+dHN0YXRlX2hlYWQgPSBOVUxMOwotCQlpbnRlcnAtPmNvZGVjX3NlYXJjaF9wYXRoID0gTlVMTDsKLQkJaW50ZXJwLT5jb2RlY19zZWFyY2hfY2FjaGUgPSBOVUxMOwotCQlpbnRlcnAtPmNvZGVjX2Vycm9yX3JlZ2lzdHJ5ID0gTlVMTDsKKyAgICAgICAgaW50ZXJwLT5tb2R1bGVzID0gTlVMTDsKKyAgICAgICAgaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyA9IE5VTEw7CisgICAgICAgIGludGVycC0+c3lzZGljdCA9IE5VTEw7CisgICAgICAgIGludGVycC0+YnVpbHRpbnMgPSBOVUxMOworICAgICAgICBpbnRlcnAtPnRzdGF0ZV9oZWFkID0gTlVMTDsKKyAgICAgICAgaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCA9IE5VTEw7CisgICAgICAgIGludGVycC0+Y29kZWNfc2VhcmNoX2NhY2hlID0gTlVMTDsKKyAgICAgICAgaW50ZXJwLT5jb2RlY19lcnJvcl9yZWdpc3RyeSA9IE5VTEw7CiAjaWZkZWYgSEFWRV9ETE9QRU4KICNpZmRlZiBSVExEX05PVwotICAgICAgICAgICAgICAgIGludGVycC0+ZGxvcGVuZmxhZ3MgPSBSVExEX05PVzsKKyAgICAgICAgaW50ZXJwLT5kbG9wZW5mbGFncyA9IFJUTERfTk9XOwogI2Vsc2UKLQkJaW50ZXJwLT5kbG9wZW5mbGFncyA9IFJUTERfTEFaWTsKKyAgICAgICAgaW50ZXJwLT5kbG9wZW5mbGFncyA9IFJUTERfTEFaWTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgV0lUSF9UU0MKLQkJaW50ZXJwLT50c2NkdW1wID0gMDsKKyAgICAgICAgaW50ZXJwLT50c2NkdW1wID0gMDsKICNlbmRpZgogCi0JCUhFQURfTE9DSygpOwotCQlpbnRlcnAtPm5leHQgPSBpbnRlcnBfaGVhZDsKLQkJaW50ZXJwX2hlYWQgPSBpbnRlcnA7Ci0JCUhFQURfVU5MT0NLKCk7Ci0JfQorICAgICAgICBIRUFEX0xPQ0soKTsKKyAgICAgICAgaW50ZXJwLT5uZXh0ID0gaW50ZXJwX2hlYWQ7CisgICAgICAgIGludGVycF9oZWFkID0gaW50ZXJwOworICAgICAgICBIRUFEX1VOTE9DSygpOworICAgIH0KIAotCXJldHVybiBpbnRlcnA7CisgICAgcmV0dXJuIGludGVycDsKIH0KIAogCiB2b2lkCiBQeUludGVycHJldGVyU3RhdGVfQ2xlYXIoUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnApCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqcDsKLQlIRUFEX0xPQ0soKTsKLQlmb3IgKHAgPSBpbnRlcnAtPnRzdGF0ZV9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQlQeVRocmVhZFN0YXRlX0NsZWFyKHApOwotCUhFQURfVU5MT0NLKCk7Ci0JUHlfQ0xFQVIoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCk7Ci0JUHlfQ0xFQVIoaW50ZXJwLT5jb2RlY19zZWFyY2hfY2FjaGUpOwotCVB5X0NMRUFSKGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkpOwotCVB5X0NMRUFSKGludGVycC0+bW9kdWxlcyk7Ci0JUHlfQ0xFQVIoaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyk7Ci0JUHlfQ0xFQVIoaW50ZXJwLT5zeXNkaWN0KTsKLQlQeV9DTEVBUihpbnRlcnAtPmJ1aWx0aW5zKTsKKyAgICBQeVRocmVhZFN0YXRlICpwOworICAgIEhFQURfTE9DSygpOworICAgIGZvciAocCA9IGludGVycC0+dHN0YXRlX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisgICAgICAgIFB5VGhyZWFkU3RhdGVfQ2xlYXIocCk7CisgICAgSEVBRF9VTkxPQ0soKTsKKyAgICBQeV9DTEVBUihpbnRlcnAtPmNvZGVjX3NlYXJjaF9wYXRoKTsKKyAgICBQeV9DTEVBUihpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSk7CisgICAgUHlfQ0xFQVIoaW50ZXJwLT5jb2RlY19lcnJvcl9yZWdpc3RyeSk7CisgICAgUHlfQ0xFQVIoaW50ZXJwLT5tb2R1bGVzKTsKKyAgICBQeV9DTEVBUihpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nKTsKKyAgICBQeV9DTEVBUihpbnRlcnAtPnN5c2RpY3QpOworICAgIFB5X0NMRUFSKGludGVycC0+YnVpbHRpbnMpOwogfQogCiAKIHN0YXRpYyB2b2lkCiB6YXB0aHJlYWRzKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKQogewotCVB5VGhyZWFkU3RhdGUgKnA7Ci0JLyogTm8gbmVlZCB0byBsb2NrIHRoZSBtdXRleCBoZXJlIGJlY2F1c2UgdGhpcyBzaG91bGQgb25seSBoYXBwZW4KLQkgICB3aGVuIHRoZSB0aHJlYWRzIGFyZSBhbGwgcmVhbGx5IGRlYWQgKFhYWCBmYW1vdXMgbGFzdCB3b3JkcykuICovCi0Jd2hpbGUgKChwID0gaW50ZXJwLT50c3RhdGVfaGVhZCkgIT0gTlVMTCkgewotCQlQeVRocmVhZFN0YXRlX0RlbGV0ZShwKTsKLQl9CisgICAgUHlUaHJlYWRTdGF0ZSAqcDsKKyAgICAvKiBObyBuZWVkIHRvIGxvY2sgdGhlIG11dGV4IGhlcmUgYmVjYXVzZSB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbgorICAgICAgIHdoZW4gdGhlIHRocmVhZHMgYXJlIGFsbCByZWFsbHkgZGVhZCAoWFhYIGZhbW91cyBsYXN0IHdvcmRzKS4gKi8KKyAgICB3aGlsZSAoKHAgPSBpbnRlcnAtPnRzdGF0ZV9oZWFkKSAhPSBOVUxMKSB7CisgICAgICAgIFB5VGhyZWFkU3RhdGVfRGVsZXRlKHApOworICAgIH0KIH0KIAogCiB2b2lkCiBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqKnA7Ci0JemFwdGhyZWFkcyhpbnRlcnApOwotCUhFQURfTE9DSygpOwotCWZvciAocCA9ICZpbnRlcnBfaGVhZDsgOyBwID0gJigqcCktPm5leHQpIHsKLQkJaWYgKCpwID09IE5VTEwpCi0JCQlQeV9GYXRhbEVycm9yKAotCQkJCSJQeUludGVycHJldGVyU3RhdGVfRGVsZXRlOiBpbnZhbGlkIGludGVycCIpOwotCQlpZiAoKnAgPT0gaW50ZXJwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpbnRlcnAtPnRzdGF0ZV9oZWFkICE9IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGU6IHJlbWFpbmluZyB0aHJlYWRzIik7Ci0JKnAgPSBpbnRlcnAtPm5leHQ7Ci0JSEVBRF9VTkxPQ0soKTsKLQlmcmVlKGludGVycCk7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICoqcDsKKyAgICB6YXB0aHJlYWRzKGludGVycCk7CisgICAgSEVBRF9MT0NLKCk7CisgICAgZm9yIChwID0gJmludGVycF9oZWFkOyA7IHAgPSAmKCpwKS0+bmV4dCkgeworICAgICAgICBpZiAoKnAgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgIlB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGU6IGludmFsaWQgaW50ZXJwIik7CisgICAgICAgIGlmICgqcCA9PSBpbnRlcnApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGludGVycC0+dHN0YXRlX2hlYWQgIT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZTogcmVtYWluaW5nIHRocmVhZHMiKTsKKyAgICAqcCA9IGludGVycC0+bmV4dDsKKyAgICBIRUFEX1VOTE9DSygpOworICAgIGZyZWUoaW50ZXJwKTsKIH0KIAogCkBAIC0xNTEsMTA0ICsxNTEsMTA0IEBACiBzdGF0aWMgc3RydWN0IF9mcmFtZSAqCiB0aHJlYWRzdGF0ZV9nZXRmcmFtZShQeVRocmVhZFN0YXRlICpzZWxmKQogewotCXJldHVybiBzZWxmLT5mcmFtZTsKKyAgICByZXR1cm4gc2VsZi0+ZnJhbWU7CiB9CiAKIHN0YXRpYyBQeVRocmVhZFN0YXRlICoKIG5ld190aHJlYWRzdGF0ZShQeUludGVycHJldGVyU3RhdGUgKmludGVycCwgaW50IGluaXQpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gKFB5VGhyZWFkU3RhdGUgKiltYWxsb2Moc2l6ZW9mKFB5VGhyZWFkU3RhdGUpKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSAoUHlUaHJlYWRTdGF0ZSAqKW1hbGxvYyhzaXplb2YoUHlUaHJlYWRTdGF0ZSkpOwogCi0JaWYgKF9QeVRocmVhZFN0YXRlX0dldEZyYW1lID09IE5VTEwpCi0JCV9QeVRocmVhZFN0YXRlX0dldEZyYW1lID0gdGhyZWFkc3RhdGVfZ2V0ZnJhbWU7CisgICAgaWYgKF9QeVRocmVhZFN0YXRlX0dldEZyYW1lID09IE5VTEwpCisgICAgICAgIF9QeVRocmVhZFN0YXRlX0dldEZyYW1lID0gdGhyZWFkc3RhdGVfZ2V0ZnJhbWU7CiAKLQlpZiAodHN0YXRlICE9IE5VTEwpIHsKLQkJdHN0YXRlLT5pbnRlcnAgPSBpbnRlcnA7CisgICAgaWYgKHRzdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIHRzdGF0ZS0+aW50ZXJwID0gaW50ZXJwOwogCi0JCXRzdGF0ZS0+ZnJhbWUgPSBOVUxMOwotCQl0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aCA9IDA7Ci0JCXRzdGF0ZS0+dHJhY2luZyA9IDA7Ci0JCXRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAwOwotCQl0c3RhdGUtPnRpY2tfY291bnRlciA9IDA7Ci0JCXRzdGF0ZS0+Z2lsc3RhdGVfY291bnRlciA9IDA7Ci0JCXRzdGF0ZS0+YXN5bmNfZXhjID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5mcmFtZSA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoID0gMDsKKyAgICAgICAgdHN0YXRlLT50cmFjaW5nID0gMDsKKyAgICAgICAgdHN0YXRlLT51c2VfdHJhY2luZyA9IDA7CisgICAgICAgIHRzdGF0ZS0+dGlja19jb3VudGVyID0gMDsKKyAgICAgICAgdHN0YXRlLT5naWxzdGF0ZV9jb3VudGVyID0gMDsKKyAgICAgICAgdHN0YXRlLT5hc3luY19leGMgPSBOVUxMOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCXRzdGF0ZS0+dGhyZWFkX2lkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgICAgICB0c3RhdGUtPnRocmVhZF9pZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKICNlbHNlCi0JCXRzdGF0ZS0+dGhyZWFkX2lkID0gMDsKKyAgICAgICAgdHN0YXRlLT50aHJlYWRfaWQgPSAwOwogI2VuZGlmCiAKLQkJdHN0YXRlLT5kaWN0ID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5kaWN0ID0gTlVMTDsKIAotCQl0c3RhdGUtPmN1cmV4Y190eXBlID0gTlVMTDsKLQkJdHN0YXRlLT5jdXJleGNfdmFsdWUgPSBOVUxMOwotCQl0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPSBOVUxMOworICAgICAgICB0c3RhdGUtPmN1cmV4Y190eXBlID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5jdXJleGNfdmFsdWUgPSBOVUxMOworICAgICAgICB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPSBOVUxMOwogCi0JCXRzdGF0ZS0+ZXhjX3R5cGUgPSBOVUxMOwotCQl0c3RhdGUtPmV4Y192YWx1ZSA9IE5VTEw7Ci0JCXRzdGF0ZS0+ZXhjX3RyYWNlYmFjayA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+ZXhjX3R5cGUgPSBOVUxMOworICAgICAgICB0c3RhdGUtPmV4Y192YWx1ZSA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayA9IE5VTEw7CiAKLQkJdHN0YXRlLT5jX3Byb2ZpbGVmdW5jID0gTlVMTDsKLQkJdHN0YXRlLT5jX3RyYWNlZnVuYyA9IE5VTEw7Ci0JCXRzdGF0ZS0+Y19wcm9maWxlb2JqID0gTlVMTDsKLQkJdHN0YXRlLT5jX3RyYWNlb2JqID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5jX3Byb2ZpbGVmdW5jID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5jX3RyYWNlZnVuYyA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5jX3RyYWNlb2JqID0gTlVMTDsKIAotCQlpZiAoaW5pdCkKLQkJCV9QeVRocmVhZFN0YXRlX0luaXQodHN0YXRlKTsKKyAgICAgICAgaWYgKGluaXQpCisgICAgICAgICAgICBfUHlUaHJlYWRTdGF0ZV9Jbml0KHRzdGF0ZSk7CiAKLQkJSEVBRF9MT0NLKCk7Ci0JCXRzdGF0ZS0+bmV4dCA9IGludGVycC0+dHN0YXRlX2hlYWQ7Ci0JCWludGVycC0+dHN0YXRlX2hlYWQgPSB0c3RhdGU7Ci0JCUhFQURfVU5MT0NLKCk7Ci0JfQorICAgICAgICBIRUFEX0xPQ0soKTsKKyAgICAgICAgdHN0YXRlLT5uZXh0ID0gaW50ZXJwLT50c3RhdGVfaGVhZDsKKyAgICAgICAgaW50ZXJwLT50c3RhdGVfaGVhZCA9IHRzdGF0ZTsKKyAgICAgICAgSEVBRF9VTkxPQ0soKTsKKyAgICB9CiAKLQlyZXR1cm4gdHN0YXRlOworICAgIHJldHVybiB0c3RhdGU7CiB9CiAKIFB5VGhyZWFkU3RhdGUgKgogUHlUaHJlYWRTdGF0ZV9OZXcoUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnApCiB7Ci0JcmV0dXJuIG5ld190aHJlYWRzdGF0ZShpbnRlcnAsIDEpOworICAgIHJldHVybiBuZXdfdGhyZWFkc3RhdGUoaW50ZXJwLCAxKTsKIH0KIAogUHlUaHJlYWRTdGF0ZSAqCiBfUHlUaHJlYWRTdGF0ZV9QcmVhbGxvYyhQeUludGVycHJldGVyU3RhdGUgKmludGVycCkKIHsKLQlyZXR1cm4gbmV3X3RocmVhZHN0YXRlKGludGVycCwgMCk7CisgICAgcmV0dXJuIG5ld190aHJlYWRzdGF0ZShpbnRlcnAsIDApOwogfQogCiB2b2lkCiBfUHlUaHJlYWRTdGF0ZV9Jbml0KFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCV9QeUdJTFN0YXRlX05vdGVUaHJlYWRTdGF0ZSh0c3RhdGUpOworICAgIF9QeUdJTFN0YXRlX05vdGVUaHJlYWRTdGF0ZSh0c3RhdGUpOwogI2VuZGlmCiB9CiAKIHZvaWQKIFB5VGhyZWFkU3RhdGVfQ2xlYXIoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotCWlmIChQeV9WZXJib3NlRmxhZyAmJiB0c3RhdGUtPmZyYW1lICE9IE5VTEwpCi0JCWZwcmludGYoc3RkZXJyLAotCQkgICJQeVRocmVhZFN0YXRlX0NsZWFyOiB3YXJuaW5nOiB0aHJlYWQgc3RpbGwgaGFzIGEgZnJhbWVcbiIpOworICAgIGlmIChQeV9WZXJib3NlRmxhZyAmJiB0c3RhdGUtPmZyYW1lICE9IE5VTEwpCisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICJQeVRocmVhZFN0YXRlX0NsZWFyOiB3YXJuaW5nOiB0aHJlYWQgc3RpbGwgaGFzIGEgZnJhbWVcbiIpOwogCi0JUHlfQ0xFQVIodHN0YXRlLT5mcmFtZSk7CisgICAgUHlfQ0xFQVIodHN0YXRlLT5mcmFtZSk7CiAKLQlQeV9DTEVBUih0c3RhdGUtPmRpY3QpOwotCVB5X0NMRUFSKHRzdGF0ZS0+YXN5bmNfZXhjKTsKKyAgICBQeV9DTEVBUih0c3RhdGUtPmRpY3QpOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+YXN5bmNfZXhjKTsKIAotCVB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3R5cGUpOwotCVB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlKTsKLQlQeV9DTEVBUih0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2spOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3R5cGUpOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlKTsKKyAgICBQeV9DTEVBUih0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2spOwogCi0JUHlfQ0xFQVIodHN0YXRlLT5leGNfdHlwZSk7Ci0JUHlfQ0xFQVIodHN0YXRlLT5leGNfdmFsdWUpOwotCVB5X0NMRUFSKHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayk7CisgICAgUHlfQ0xFQVIodHN0YXRlLT5leGNfdHlwZSk7CisgICAgUHlfQ0xFQVIodHN0YXRlLT5leGNfdmFsdWUpOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayk7CiAKLQl0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgPSBOVUxMOwotCXRzdGF0ZS0+Y190cmFjZWZ1bmMgPSBOVUxMOwotCVB5X0NMRUFSKHRzdGF0ZS0+Y19wcm9maWxlb2JqKTsKLQlQeV9DTEVBUih0c3RhdGUtPmNfdHJhY2VvYmopOworICAgIHRzdGF0ZS0+Y19wcm9maWxlZnVuYyA9IE5VTEw7CisgICAgdHN0YXRlLT5jX3RyYWNlZnVuYyA9IE5VTEw7CisgICAgUHlfQ0xFQVIodHN0YXRlLT5jX3Byb2ZpbGVvYmopOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+Y190cmFjZW9iaik7CiB9CiAKIApAQCAtMjU2LDUwICsyNTYsNTAgQEAKIHN0YXRpYyB2b2lkCiB0c3RhdGVfZGVsZXRlX2NvbW1vbihQeVRocmVhZFN0YXRlICp0c3RhdGUpCiB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnA7Ci0JUHlUaHJlYWRTdGF0ZSAqKnA7Ci0JUHlUaHJlYWRTdGF0ZSAqcHJldl9wID0gTlVMTDsKLQlpZiAodHN0YXRlID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBOVUxMIHRzdGF0ZSIpOwotCWludGVycCA9IHRzdGF0ZS0+aW50ZXJwOwotCWlmIChpbnRlcnAgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IE5VTEwgaW50ZXJwIik7Ci0JSEVBRF9MT0NLKCk7Ci0JZm9yIChwID0gJmludGVycC0+dHN0YXRlX2hlYWQ7IDsgcCA9ICYoKnApLT5uZXh0KSB7Ci0JCWlmICgqcCA9PSBOVUxMKQotCQkJUHlfRmF0YWxFcnJvcigKLQkJCQkiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IGludmFsaWQgdHN0YXRlIik7Ci0JCWlmICgqcCA9PSB0c3RhdGUpCi0JCQlicmVhazsKLQkJLyogU2FuaXR5IGNoZWNrLiAgVGhlc2Ugc3RhdGVzIHNob3VsZCBuZXZlciBoYXBwZW4gYnV0IGlmCi0JCSAqIHRoZXkgZG8gd2UgbXVzdCBhYm9ydC4gIE90aGVyd2lzZSB3ZSdsbCBlbmQgdXAgc3Bpbm5pbmcgaW4KLQkJICogaW4gYSB0aWdodCBsb29wIHdpdGggdGhlIGxvY2sgaGVsZC4gIEEgc2ltaWxhciBjaGVjayBpcyBkb25lCi0JCSAqIGluIHRocmVhZC5jIGZpbmRfa2V5KCkuICAqLwotCQlpZiAoKnAgPT0gcHJldl9wKQotCQkJUHlfRmF0YWxFcnJvcigKLQkJCQkiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IHNtYWxsIGNpcmN1bGFyIGxpc3QoISkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIHRzdGF0ZSBub3QgZm91bmQuIik7Ci0JCXByZXZfcCA9ICpwOwotCQlpZiAoKCpwKS0+bmV4dCA9PSBpbnRlcnAtPnRzdGF0ZV9oZWFkKQotCQkJUHlfRmF0YWxFcnJvcigKLQkJCQkiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IGNpcmN1bGFyIGxpc3QoISkgYW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRzdGF0ZSBub3QgZm91bmQuIik7Ci0JfQotCSpwID0gdHN0YXRlLT5uZXh0OwotCUhFQURfVU5MT0NLKCk7Ci0JZnJlZSh0c3RhdGUpOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOworICAgIFB5VGhyZWFkU3RhdGUgKipwOworICAgIFB5VGhyZWFkU3RhdGUgKnByZXZfcCA9IE5VTEw7CisgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeVRocmVhZFN0YXRlX0RlbGV0ZTogTlVMTCB0c3RhdGUiKTsKKyAgICBpbnRlcnAgPSB0c3RhdGUtPmludGVycDsKKyAgICBpZiAoaW50ZXJwID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBOVUxMIGludGVycCIpOworICAgIEhFQURfTE9DSygpOworICAgIGZvciAocCA9ICZpbnRlcnAtPnRzdGF0ZV9oZWFkOyA7IHAgPSAmKCpwKS0+bmV4dCkgeworICAgICAgICBpZiAoKnAgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBpbnZhbGlkIHRzdGF0ZSIpOworICAgICAgICBpZiAoKnAgPT0gdHN0YXRlKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIFNhbml0eSBjaGVjay4gIFRoZXNlIHN0YXRlcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJ1dCBpZgorICAgICAgICAgKiB0aGV5IGRvIHdlIG11c3QgYWJvcnQuICBPdGhlcndpc2Ugd2UnbGwgZW5kIHVwIHNwaW5uaW5nIGluCisgICAgICAgICAqIGluIGEgdGlnaHQgbG9vcCB3aXRoIHRoZSBsb2NrIGhlbGQuICBBIHNpbWlsYXIgY2hlY2sgaXMgZG9uZQorICAgICAgICAgKiBpbiB0aHJlYWQuYyBmaW5kX2tleSgpLiAgKi8KKyAgICAgICAgaWYgKCpwID09IHByZXZfcCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBzbWFsbCBjaXJjdWxhciBsaXN0KCEpIgorICAgICAgICAgICAgICAgICIgYW5kIHRzdGF0ZSBub3QgZm91bmQuIik7CisgICAgICAgIHByZXZfcCA9ICpwOworICAgICAgICBpZiAoKCpwKS0+bmV4dCA9PSBpbnRlcnAtPnRzdGF0ZV9oZWFkKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigKKyAgICAgICAgICAgICAgICAiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IGNpcmN1bGFyIGxpc3QoISkgYW5kIgorICAgICAgICAgICAgICAgICIgdHN0YXRlIG5vdCBmb3VuZC4iKTsKKyAgICB9CisgICAgKnAgPSB0c3RhdGUtPm5leHQ7CisgICAgSEVBRF9VTkxPQ0soKTsKKyAgICBmcmVlKHRzdGF0ZSk7CiB9CiAKIAogdm9pZAogUHlUaHJlYWRTdGF0ZV9EZWxldGUoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotCWlmICh0c3RhdGUgPT0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudCkKLQkJUHlfRmF0YWxFcnJvcigiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IHRzdGF0ZSBpcyBzdGlsbCBjdXJyZW50Iik7Ci0JdHN0YXRlX2RlbGV0ZV9jb21tb24odHN0YXRlKTsKKyAgICBpZiAodHN0YXRlID09IF9QeVRocmVhZFN0YXRlX0N1cnJlbnQpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiB0c3RhdGUgaXMgc3RpbGwgY3VycmVudCIpOworICAgIHRzdGF0ZV9kZWxldGVfY29tbW9uKHRzdGF0ZSk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoYXV0b1RMU2tleSAmJiBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpID09IHRzdGF0ZSkKLQkJUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShhdXRvVExTa2V5KTsKKyAgICBpZiAoYXV0b1RMU2tleSAmJiBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpID09IHRzdGF0ZSkKKyAgICAgICAgUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShhdXRvVExTa2V5KTsKICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwogfQogCkBAIC0zMDgsMTUgKzMwOCwxNSBAQAogdm9pZAogUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50KCkKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OwotCWlmICh0c3RhdGUgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigKLQkJCSJQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQ6IG5vIGN1cnJlbnQgdHN0YXRlIik7Ci0JX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9IE5VTEw7Ci0JdHN0YXRlX2RlbGV0ZV9jb21tb24odHN0YXRlKTsKLQlpZiAoYXV0b1RMU2tleSAmJiBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpID09IHRzdGF0ZSkKLQkJUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShhdXRvVExTa2V5KTsKLQlQeUV2YWxfUmVsZWFzZUxvY2soKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigKKyAgICAgICAgICAgICJQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQ6IG5vIGN1cnJlbnQgdHN0YXRlIik7CisgICAgX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9IE5VTEw7CisgICAgdHN0YXRlX2RlbGV0ZV9jb21tb24odHN0YXRlKTsKKyAgICBpZiAoYXV0b1RMU2tleSAmJiBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpID09IHRzdGF0ZSkKKyAgICAgICAgUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShhdXRvVExTa2V5KTsKKyAgICBQeUV2YWxfUmVsZWFzZUxvY2soKTsKIH0KICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwogCkBAIC0zMjQsMzYgKzMyNCwzNiBAQAogUHlUaHJlYWRTdGF0ZSAqCiBQeVRocmVhZFN0YXRlX0dldCh2b2lkKQogewotCWlmIChfUHlUaHJlYWRTdGF0ZV9DdXJyZW50ID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfR2V0OiBubyBjdXJyZW50IHRocmVhZCIpOworICAgIGlmIChfUHlUaHJlYWRTdGF0ZV9DdXJyZW50ID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfR2V0OiBubyBjdXJyZW50IHRocmVhZCIpOwogCi0JcmV0dXJuIF9QeVRocmVhZFN0YXRlX0N1cnJlbnQ7CisgICAgcmV0dXJuIF9QeVRocmVhZFN0YXRlX0N1cnJlbnQ7CiB9CiAKIAogUHlUaHJlYWRTdGF0ZSAqCiBQeVRocmVhZFN0YXRlX1N3YXAoUHlUaHJlYWRTdGF0ZSAqbmV3dHMpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqb2xkdHMgPSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OworICAgIFB5VGhyZWFkU3RhdGUgKm9sZHRzID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKIAotCV9QeVRocmVhZFN0YXRlX0N1cnJlbnQgPSBuZXd0czsKLQkvKiBJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGZvciBtb3JlIHRoYW4gb25lIHRocmVhZCBzdGF0ZQotCSAgIHRvIGJlIHVzZWQgZm9yIGEgdGhyZWFkLiAgQ2hlY2sgdGhpcyB0aGUgYmVzdCB3ZSBjYW4gaW4gZGVidWcKLQkgICBidWlsZHMuCi0JKi8KKyAgICBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50ID0gbmV3dHM7CisgICAgLyogSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBmb3IgbW9yZSB0aGFuIG9uZSB0aHJlYWQgc3RhdGUKKyAgICAgICB0byBiZSB1c2VkIGZvciBhIHRocmVhZC4gIENoZWNrIHRoaXMgdGhlIGJlc3Qgd2UgY2FuIGluIGRlYnVnCisgICAgICAgYnVpbGRzLgorICAgICovCiAjaWYgZGVmaW5lZChQeV9ERUJVRykgJiYgZGVmaW5lZChXSVRIX1RIUkVBRCkKLQlpZiAobmV3dHMpIHsKLQkJLyogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gUHlFdmFsX1Jlc3RvcmVUaHJlYWQoKS4gU2ltaWxhcgotCQkgICB0byBpdCwgd2UgbmVlZCB0byBlbnN1cmUgZXJybm8gZG9lc24ndCBjaGFuZ2UuCi0JCSovCi0JCWludCBlcnIgPSBlcnJubzsKLQkJUHlUaHJlYWRTdGF0ZSAqY2hlY2sgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOwotCQlpZiAoY2hlY2sgJiYgY2hlY2stPmludGVycCA9PSBuZXd0cy0+aW50ZXJwICYmIGNoZWNrICE9IG5ld3RzKQotCQkJUHlfRmF0YWxFcnJvcigiSW52YWxpZCB0aHJlYWQgc3RhdGUgZm9yIHRoaXMgdGhyZWFkIik7Ci0JCWVycm5vID0gZXJyOwotCX0KKyAgICBpZiAobmV3dHMpIHsKKyAgICAgICAgLyogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gUHlFdmFsX1Jlc3RvcmVUaHJlYWQoKS4gU2ltaWxhcgorICAgICAgICAgICB0byBpdCwgd2UgbmVlZCB0byBlbnN1cmUgZXJybm8gZG9lc24ndCBjaGFuZ2UuCisgICAgICAgICovCisgICAgICAgIGludCBlcnIgPSBlcnJubzsKKyAgICAgICAgUHlUaHJlYWRTdGF0ZSAqY2hlY2sgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOworICAgICAgICBpZiAoY2hlY2sgJiYgY2hlY2stPmludGVycCA9PSBuZXd0cy0+aW50ZXJwICYmIGNoZWNrICE9IG5ld3RzKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiSW52YWxpZCB0aHJlYWQgc3RhdGUgZm9yIHRoaXMgdGhyZWFkIik7CisgICAgICAgIGVycm5vID0gZXJyOworICAgIH0KICNlbmRpZgotCXJldHVybiBvbGR0czsKKyAgICByZXR1cm4gb2xkdHM7CiB9CiAKIC8qIEFuIGV4dGVuc2lvbiBtZWNoYW5pc20gdG8gc3RvcmUgYXJiaXRyYXJ5IGFkZGl0aW9uYWwgcGVyLXRocmVhZCBzdGF0ZS4KQEAgLTM2NSwxNiArMzY1LDE2IEBACiBQeU9iamVjdCAqCiBQeVRocmVhZFN0YXRlX0dldERpY3Qodm9pZCkKIHsKLQlpZiAoX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChfUHlUaHJlYWRTdGF0ZV9DdXJyZW50LT5kaWN0ID09IE5VTEwpIHsKLQkJUHlPYmplY3QgKmQ7Ci0JCV9QeVRocmVhZFN0YXRlX0N1cnJlbnQtPmRpY3QgPSBkID0gUHlEaWN0X05ldygpOwotCQlpZiAoZCA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JcmV0dXJuIF9QeVRocmVhZFN0YXRlX0N1cnJlbnQtPmRpY3Q7CisgICAgaWYgKF9QeVRocmVhZFN0YXRlX0N1cnJlbnQtPmRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqZDsKKyAgICAgICAgX1B5VGhyZWFkU3RhdGVfQ3VycmVudC0+ZGljdCA9IGQgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChkID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gX1B5VGhyZWFkU3RhdGVfQ3VycmVudC0+ZGljdDsKIH0KIAogCkBAIC0zODgsMzYgKzM4OCwzNiBAQAogCiBpbnQKIFB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMobG9uZyBpZCwgUHlPYmplY3QgKmV4YykgewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSB0c3RhdGUtPmludGVycDsKLQlQeVRocmVhZFN0YXRlICpwOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSB0c3RhdGUtPmludGVycDsKKyAgICBQeVRocmVhZFN0YXRlICpwOwogCi0JLyogQWx0aG91Z2ggdGhlIEdJTCBpcyBoZWxkLCBhIGZldyBDIEFQSSBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZAotCSAqIHdpdGhvdXQgdGhlIEdJTCBoZWxkLCBhbmQgaW4gcGFydGljdWxhciBzb21lIHRoYXQgY3JlYXRlIGFuZAotCSAqIGRlc3Ryb3kgdGhyZWFkIGFuZCBpbnRlcnByZXRlciBzdGF0ZXMuICBUaG9zZSBjYW4gbXV0YXRlIHRoZQotCSAqIGxpc3Qgb2YgdGhyZWFkIHN0YXRlcyB3ZSdyZSB0cmF2ZXJzaW5nLCBzbyB0byBwcmV2ZW50IHRoYXQgd2UgbG9jawotCSAqIGhlYWRfbXV0ZXggZm9yIHRoZSBkdXJhdGlvbi4KLQkgKi8KLQlIRUFEX0xPQ0soKTsKLQlmb3IgKHAgPSBpbnRlcnAtPnRzdGF0ZV9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KSB7Ci0JCWlmIChwLT50aHJlYWRfaWQgPT0gaWQpIHsKLQkJCS8qIFRyaWNreTogIHdlIG5lZWQgdG8gZGVjcmVmIHRoZSBjdXJyZW50IHZhbHVlCi0JCQkgKiAoaWYgYW55KSBpbiBwLT5hc3luY19leGMsIGJ1dCB0aGF0IGNhbiBpbiB0dXJuCi0JCQkgKiBhbGxvdyBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgdG8gcnVuLCBpbmNsdWRpbmcKLQkJCSAqIHBlcmhhcHMgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbi4gIFRvIHByZXZlbnQKLQkJCSAqIGRlYWRsb2NrLCB3ZSBuZWVkIHRvIHJlbGVhc2UgaGVhZF9tdXRleCBiZWZvcmUKLQkJCSAqIHRoZSBkZWNyZWYuCi0JCQkgKi8KLQkJCVB5T2JqZWN0ICpvbGRfZXhjID0gcC0+YXN5bmNfZXhjOwotCQkJUHlfWElOQ1JFRihleGMpOwotCQkJcC0+YXN5bmNfZXhjID0gZXhjOwotCQkJSEVBRF9VTkxPQ0soKTsKLQkJCVB5X1hERUNSRUYob2xkX2V4Yyk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlIRUFEX1VOTE9DSygpOwotCXJldHVybiAwOworICAgIC8qIEFsdGhvdWdoIHRoZSBHSUwgaXMgaGVsZCwgYSBmZXcgQyBBUEkgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQKKyAgICAgKiB3aXRob3V0IHRoZSBHSUwgaGVsZCwgYW5kIGluIHBhcnRpY3VsYXIgc29tZSB0aGF0IGNyZWF0ZSBhbmQKKyAgICAgKiBkZXN0cm95IHRocmVhZCBhbmQgaW50ZXJwcmV0ZXIgc3RhdGVzLiAgVGhvc2UgY2FuIG11dGF0ZSB0aGUKKyAgICAgKiBsaXN0IG9mIHRocmVhZCBzdGF0ZXMgd2UncmUgdHJhdmVyc2luZywgc28gdG8gcHJldmVudCB0aGF0IHdlIGxvY2sKKyAgICAgKiBoZWFkX211dGV4IGZvciB0aGUgZHVyYXRpb24uCisgICAgICovCisgICAgSEVBRF9MT0NLKCk7CisgICAgZm9yIChwID0gaW50ZXJwLT50c3RhdGVfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgeworICAgICAgICBpZiAocC0+dGhyZWFkX2lkID09IGlkKSB7CisgICAgICAgICAgICAvKiBUcmlja3k6ICB3ZSBuZWVkIHRvIGRlY3JlZiB0aGUgY3VycmVudCB2YWx1ZQorICAgICAgICAgICAgICogKGlmIGFueSkgaW4gcC0+YXN5bmNfZXhjLCBidXQgdGhhdCBjYW4gaW4gdHVybgorICAgICAgICAgICAgICogYWxsb3cgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIHRvIHJ1biwgaW5jbHVkaW5nCisgICAgICAgICAgICAgKiBwZXJoYXBzIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uICBUbyBwcmV2ZW50CisgICAgICAgICAgICAgKiBkZWFkbG9jaywgd2UgbmVlZCB0byByZWxlYXNlIGhlYWRfbXV0ZXggYmVmb3JlCisgICAgICAgICAgICAgKiB0aGUgZGVjcmVmLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBQeU9iamVjdCAqb2xkX2V4YyA9IHAtPmFzeW5jX2V4YzsKKyAgICAgICAgICAgIFB5X1hJTkNSRUYoZXhjKTsKKyAgICAgICAgICAgIHAtPmFzeW5jX2V4YyA9IGV4YzsKKyAgICAgICAgICAgIEhFQURfVU5MT0NLKCk7CisgICAgICAgICAgICBQeV9YREVDUkVGKG9sZF9leGMpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgSEVBRF9VTkxPQ0soKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC00MjcsMjIgKzQyNywyMiBAQAogUHlJbnRlcnByZXRlclN0YXRlICoKIFB5SW50ZXJwcmV0ZXJTdGF0ZV9IZWFkKHZvaWQpCiB7Ci0JcmV0dXJuIGludGVycF9oZWFkOworICAgIHJldHVybiBpbnRlcnBfaGVhZDsKIH0KIAogUHlJbnRlcnByZXRlclN0YXRlICoKIFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXh0KFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKSB7Ci0JcmV0dXJuIGludGVycC0+bmV4dDsKKyAgICByZXR1cm4gaW50ZXJwLT5uZXh0OwogfQogCiBQeVRocmVhZFN0YXRlICoKIFB5SW50ZXJwcmV0ZXJTdGF0ZV9UaHJlYWRIZWFkKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKSB7Ci0JcmV0dXJuIGludGVycC0+dHN0YXRlX2hlYWQ7CisgICAgcmV0dXJuIGludGVycC0+dHN0YXRlX2hlYWQ7CiB9CiAKIFB5VGhyZWFkU3RhdGUgKgogUHlUaHJlYWRTdGF0ZV9OZXh0KFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkgewotCXJldHVybiB0c3RhdGUtPm5leHQ7CisgICAgcmV0dXJuIHRzdGF0ZS0+bmV4dDsKIH0KIAogLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHN5cy5fY3VycmVudF9mcmFtZXMoKS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUKQEAgLTQ1Myw0NCArNDUzLDQ0IEBACiBQeU9iamVjdCAqCiBfUHlUaHJlYWRfQ3VycmVudEZyYW1lcyh2b2lkKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppOwogCi0JcmVzdWx0ID0gUHlEaWN0X05ldygpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlEaWN0X05ldygpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBmb3IgaSBpbiBhbGwgaW50ZXJwcmV0ZXJzOgotCSAqICAgICBmb3IgdCBpbiBhbGwgb2YgaSdzIHRocmVhZCBzdGF0ZXM6Ci0JICogICAgICAgICAgaWYgdCdzIGZyYW1lIGlzbid0IE5VTEwsIG1hcCB0J3MgaWQgdG8gaXRzIGZyYW1lCi0JICogQmVjYXVzZSB0aGVzZSBsaXN0cyBjYW4gbXV0dXRlIGV2ZW4gd2hlbiB0aGUgR0lMIGlzIGhlbGQsIHdlCi0JICogbmVlZCB0byBncmFiIGhlYWRfbXV0ZXggZm9yIHRoZSBkdXJhdGlvbi4KLQkgKi8KLQlIRUFEX0xPQ0soKTsKLQlmb3IgKGkgPSBpbnRlcnBfaGVhZDsgaSAhPSBOVUxMOyBpID0gaS0+bmV4dCkgewotCQlQeVRocmVhZFN0YXRlICp0OwotCQlmb3IgKHQgPSBpLT50c3RhdGVfaGVhZDsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkgewotCQkJUHlPYmplY3QgKmlkOwotCQkJaW50IHN0YXQ7Ci0JCQlzdHJ1Y3QgX2ZyYW1lICpmcmFtZSA9IHQtPmZyYW1lOwotCQkJaWYgKGZyYW1lID09IE5VTEwpCi0JCQkJY29udGludWU7Ci0JCQlpZCA9IFB5SW50X0Zyb21Mb25nKHQtPnRocmVhZF9pZCk7Ci0JCQlpZiAoaWQgPT0gTlVMTCkKLQkJCQlnb3RvIEZhaWw7Ci0JCQlzdGF0ID0gUHlEaWN0X1NldEl0ZW0ocmVzdWx0LCBpZCwgKFB5T2JqZWN0ICopZnJhbWUpOwotCQkJUHlfREVDUkVGKGlkKTsKLQkJCWlmIChzdGF0IDwgMCkKLQkJCQlnb3RvIEZhaWw7Ci0JCX0KLQl9Ci0JSEVBRF9VTkxPQ0soKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIGZvciBpIGluIGFsbCBpbnRlcnByZXRlcnM6CisgICAgICogICAgIGZvciB0IGluIGFsbCBvZiBpJ3MgdGhyZWFkIHN0YXRlczoKKyAgICAgKiAgICAgICAgICBpZiB0J3MgZnJhbWUgaXNuJ3QgTlVMTCwgbWFwIHQncyBpZCB0byBpdHMgZnJhbWUKKyAgICAgKiBCZWNhdXNlIHRoZXNlIGxpc3RzIGNhbiBtdXR1dGUgZXZlbiB3aGVuIHRoZSBHSUwgaXMgaGVsZCwgd2UKKyAgICAgKiBuZWVkIHRvIGdyYWIgaGVhZF9tdXRleCBmb3IgdGhlIGR1cmF0aW9uLgorICAgICAqLworICAgIEhFQURfTE9DSygpOworICAgIGZvciAoaSA9IGludGVycF9oZWFkOyBpICE9IE5VTEw7IGkgPSBpLT5uZXh0KSB7CisgICAgICAgIFB5VGhyZWFkU3RhdGUgKnQ7CisgICAgICAgIGZvciAodCA9IGktPnRzdGF0ZV9oZWFkOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaWQ7CisgICAgICAgICAgICBpbnQgc3RhdDsKKyAgICAgICAgICAgIHN0cnVjdCBfZnJhbWUgKmZyYW1lID0gdC0+ZnJhbWU7CisgICAgICAgICAgICBpZiAoZnJhbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlkID0gUHlJbnRfRnJvbUxvbmcodC0+dGhyZWFkX2lkKTsKKyAgICAgICAgICAgIGlmIChpZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIHN0YXQgPSBQeURpY3RfU2V0SXRlbShyZXN1bHQsIGlkLCAoUHlPYmplY3QgKilmcmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaWQpOworICAgICAgICAgICAgaWYgKHN0YXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBIRUFEX1VOTE9DSygpOworICAgIHJldHVybiByZXN1bHQ7CiAKICBGYWlsOgotIAlIRUFEX1VOTE9DSygpOwotIAlQeV9ERUNSRUYocmVzdWx0KTsKLSAJcmV0dXJuIE5VTEw7CisgICAgSEVBRF9VTkxPQ0soKTsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogUHl0aG9uICJhdXRvIHRocmVhZCBzdGF0ZSIgQVBJLiAqLwpAQCAtNTA3LDEyICs1MDcsMTIgQEAKIHN0YXRpYyBpbnQKIFB5VGhyZWFkU3RhdGVfSXNDdXJyZW50KFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIHsKLQkvKiBNdXN0IGJlIHRoZSB0c3RhdGUgZm9yIHRoaXMgdGhyZWFkICovCi0JYXNzZXJ0KFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCk9PXRzdGF0ZSk7Ci0JLyogT24gV2luZG93cyBhdCBsZWFzdCwgc2ltcGxlIHJlYWRzIGFuZCB3cml0ZXMgdG8gMzIgYml0IHZhbHVlcwotCSAgIGFyZSBhdG9taWMuCi0JKi8KLQlyZXR1cm4gdHN0YXRlID09IF9QeVRocmVhZFN0YXRlX0N1cnJlbnQ7CisgICAgLyogTXVzdCBiZSB0aGUgdHN0YXRlIGZvciB0aGlzIHRocmVhZCAqLworICAgIGFzc2VydChQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpPT10c3RhdGUpOworICAgIC8qIE9uIFdpbmRvd3MgYXQgbGVhc3QsIHNpbXBsZSByZWFkcyBhbmQgd3JpdGVzIHRvIDMyIGJpdCB2YWx1ZXMKKyAgICAgICBhcmUgYXRvbWljLgorICAgICovCisgICAgcmV0dXJuIHRzdGF0ZSA9PSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OwogfQogCiAvKiBJbnRlcm5hbCBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gZnVuY3Rpb25zIGNhbGxlZCBieQpAQCAtNTIxLDIxICs1MjEsMjEgQEAKIHZvaWQKIF9QeUdJTFN0YXRlX0luaXQoUHlJbnRlcnByZXRlclN0YXRlICppLCBQeVRocmVhZFN0YXRlICp0KQogewotCWFzc2VydChpICYmIHQpOyAvKiBtdXN0IGluaXQgd2l0aCB2YWxpZCBzdGF0ZXMgKi8KLQlhdXRvVExTa2V5ID0gUHlUaHJlYWRfY3JlYXRlX2tleSgpOwotCWF1dG9JbnRlcnByZXRlclN0YXRlID0gaTsKLQlhc3NlcnQoUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KSA9PSBOVUxMKTsKLQlhc3NlcnQodC0+Z2lsc3RhdGVfY291bnRlciA9PSAwKTsKKyAgICBhc3NlcnQoaSAmJiB0KTsgLyogbXVzdCBpbml0IHdpdGggdmFsaWQgc3RhdGVzICovCisgICAgYXV0b1RMU2tleSA9IFB5VGhyZWFkX2NyZWF0ZV9rZXkoKTsKKyAgICBhdXRvSW50ZXJwcmV0ZXJTdGF0ZSA9IGk7CisgICAgYXNzZXJ0KFB5VGhyZWFkX2dldF9rZXlfdmFsdWUoYXV0b1RMU2tleSkgPT0gTlVMTCk7CisgICAgYXNzZXJ0KHQtPmdpbHN0YXRlX2NvdW50ZXIgPT0gMCk7CiAKLQlfUHlHSUxTdGF0ZV9Ob3RlVGhyZWFkU3RhdGUodCk7CisgICAgX1B5R0lMU3RhdGVfTm90ZVRocmVhZFN0YXRlKHQpOwogfQogCiB2b2lkCiBfUHlHSUxTdGF0ZV9GaW5pKHZvaWQpCiB7Ci0JUHlUaHJlYWRfZGVsZXRlX2tleShhdXRvVExTa2V5KTsKLQlhdXRvVExTa2V5ID0gMDsKLQlhdXRvSW50ZXJwcmV0ZXJTdGF0ZSA9IE5VTEw7CisgICAgUHlUaHJlYWRfZGVsZXRlX2tleShhdXRvVExTa2V5KTsKKyAgICBhdXRvVExTa2V5ID0gMDsKKyAgICBhdXRvSW50ZXJwcmV0ZXJTdGF0ZSA9IE5VTEw7CiB9CiAKIC8qIFdoZW4gYSB0aHJlYWQgc3RhdGUgaXMgY3JlYXRlZCBmb3IgYSB0aHJlYWQgYnkgc29tZSBtZWNoYW5pc20gb3RoZXIgdGhhbgpAQCAtNTQ2LDExMyArNTQ2LDExMyBAQAogc3RhdGljIHZvaWQKIF9QeUdJTFN0YXRlX05vdGVUaHJlYWRTdGF0ZShQeVRocmVhZFN0YXRlKiB0c3RhdGUpCiB7Ci0JLyogSWYgYXV0b1RMU2tleSBpcyAwLCB0aGlzIG11c3QgYmUgdGhlIHZlcnkgZmlyc3QgdGhyZWFkc3RhdGUgY3JlYXRlZAotCSAgIGluIFB5X0luaXRpYWxpemUoKS4gIERvbid0IGRvIGFueXRoaW5nIGZvciBub3cgKHdlJ2xsIGJlIGJhY2sgaGVyZQotCSAgIHdoZW4gX1B5R0lMU3RhdGVfSW5pdCBpcyBjYWxsZWQpLiAqLwotCWlmICghYXV0b1RMU2tleSkKLQkJcmV0dXJuOworICAgIC8qIElmIGF1dG9UTFNrZXkgaXMgMCwgdGhpcyBtdXN0IGJlIHRoZSB2ZXJ5IGZpcnN0IHRocmVhZHN0YXRlIGNyZWF0ZWQKKyAgICAgICBpbiBQeV9Jbml0aWFsaXplKCkuICBEb24ndCBkbyBhbnl0aGluZyBmb3Igbm93ICh3ZSdsbCBiZSBiYWNrIGhlcmUKKyAgICAgICB3aGVuIF9QeUdJTFN0YXRlX0luaXQgaXMgY2FsbGVkKS4gKi8KKyAgICBpZiAoIWF1dG9UTFNrZXkpCisgICAgICAgIHJldHVybjsKIAotCS8qIFN0aWNrIHRoZSB0aHJlYWQgc3RhdGUgZm9yIHRoaXMgdGhyZWFkIGluIHRocmVhZCBsb2NhbCBzdG9yYWdlLgorICAgIC8qIFN0aWNrIHRoZSB0aHJlYWQgc3RhdGUgZm9yIHRoaXMgdGhyZWFkIGluIHRocmVhZCBsb2NhbCBzdG9yYWdlLgogCi0JICAgVGhlIG9ubHkgc2l0dWF0aW9uIHdoZXJlIHlvdSBjYW4gbGVnaXRpbWF0ZWx5IGhhdmUgbW9yZSB0aGFuIG9uZQotCSAgIHRocmVhZCBzdGF0ZSBmb3IgYW4gT1MgbGV2ZWwgdGhyZWFkIGlzIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCi0JICAgaW50ZXJwcmV0ZXJzLCB3aGVuOgorICAgICAgIFRoZSBvbmx5IHNpdHVhdGlvbiB3aGVyZSB5b3UgY2FuIGxlZ2l0aW1hdGVseSBoYXZlIG1vcmUgdGhhbiBvbmUKKyAgICAgICB0aHJlYWQgc3RhdGUgZm9yIGFuIE9TIGxldmVsIHRocmVhZCBpcyB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZQorICAgICAgIGludGVycHJldGVycywgd2hlbjoKIAotCSAgICAgICBhKSBZb3Ugc2hvdWxkbid0IHJlYWxseSBiZSB1c2luZyB0aGUgUHlHSUxTdGF0ZV8gQVBJcyBhbnl3YXksCi0JICAgICAgICAgIGFuZDoKKyAgICAgICAgICAgYSkgWW91IHNob3VsZG4ndCByZWFsbHkgYmUgdXNpbmcgdGhlIFB5R0lMU3RhdGVfIEFQSXMgYW55d2F5LAorICAgICAgICAgIGFuZDoKIAotCSAgICAgICBiKSBUaGUgc2xpZ2h0bHkgb2RkIHdheSBQeVRocmVhZF9zZXRfa2V5X3ZhbHVlIHdvcmtzIChzZWUKLQkgICAgICAgICAgY29tbWVudHMgYnkgaXRzIGltcGxlbWVudGF0aW9uKSBtZWFucyB0aGF0IHRoZSBmaXJzdCB0aHJlYWQKLQkgICAgICAgICAgc3RhdGUgY3JlYXRlZCBmb3IgdGhhdCBnaXZlbiBPUyBsZXZlbCB0aHJlYWQgd2lsbCAid2luIiwKLQkgICAgICAgICAgd2hpY2ggc2VlbXMgcmVhc29uYWJsZSBiZWhhdmlvdXIuCi0JKi8KLQlpZiAoUHlUaHJlYWRfc2V0X2tleV92YWx1ZShhdXRvVExTa2V5LCAodm9pZCAqKXRzdGF0ZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgYXV0b1RMU2tleSBtYXBwaW5nIik7CisgICAgICAgICAgIGIpIFRoZSBzbGlnaHRseSBvZGQgd2F5IFB5VGhyZWFkX3NldF9rZXlfdmFsdWUgd29ya3MgKHNlZQorICAgICAgICAgIGNvbW1lbnRzIGJ5IGl0cyBpbXBsZW1lbnRhdGlvbikgbWVhbnMgdGhhdCB0aGUgZmlyc3QgdGhyZWFkCisgICAgICAgICAgc3RhdGUgY3JlYXRlZCBmb3IgdGhhdCBnaXZlbiBPUyBsZXZlbCB0aHJlYWQgd2lsbCAid2luIiwKKyAgICAgICAgICB3aGljaCBzZWVtcyByZWFzb25hYmxlIGJlaGF2aW91ci4KKyAgICAqLworICAgIGlmIChQeVRocmVhZF9zZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXksICh2b2lkICopdHN0YXRlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBhdXRvVExTa2V5IG1hcHBpbmciKTsKIAotCS8qIFB5R0lMU3RhdGVfUmVsZWFzZSBtdXN0IG5vdCB0cnkgdG8gZGVsZXRlIHRoaXMgdGhyZWFkIHN0YXRlLiAqLwotCXRzdGF0ZS0+Z2lsc3RhdGVfY291bnRlciA9IDE7CisgICAgLyogUHlHSUxTdGF0ZV9SZWxlYXNlIG11c3Qgbm90IHRyeSB0byBkZWxldGUgdGhpcyB0aHJlYWQgc3RhdGUuICovCisgICAgdHN0YXRlLT5naWxzdGF0ZV9jb3VudGVyID0gMTsKIH0KIAogLyogVGhlIHB1YmxpYyBmdW5jdGlvbnMgKi8KIFB5VGhyZWFkU3RhdGUgKgogUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUodm9pZCkKIHsKLQlpZiAoYXV0b0ludGVycHJldGVyU3RhdGUgPT0gTlVMTCB8fCBhdXRvVExTa2V5ID09IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoUHlUaHJlYWRTdGF0ZSAqKVB5VGhyZWFkX2dldF9rZXlfdmFsdWUoYXV0b1RMU2tleSk7CisgICAgaWYgKGF1dG9JbnRlcnByZXRlclN0YXRlID09IE5VTEwgfHwgYXV0b1RMU2tleSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFB5VGhyZWFkU3RhdGUgKilQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpOwogfQogCiBQeUdJTFN0YXRlX1NUQVRFCiBQeUdJTFN0YXRlX0Vuc3VyZSh2b2lkKQogewotCWludCBjdXJyZW50OwotCVB5VGhyZWFkU3RhdGUgKnRjdXI7Ci0JLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBhdXRvLWluaXQgUHl0aG9uIGhlcmUgLSBhcGFydCBmcm9tCi0JICAgcG90ZW50aWFsIHJhY2VzIHdpdGggMiB0aHJlYWRzIGF1dG8taW5pdGlhbGl6aW5nLCBwZXAtMzExCi0JICAgc3BlbGxzIG91dCBvdGhlciBpc3N1ZXMuICBFbWJlZGRlcnMgYXJlIGV4cGVjdGVkIHRvIGhhdmUKLQkgICBjYWxsZWQgUHlfSW5pdGlhbGl6ZSgpIGFuZCB1c3VhbGx5IFB5RXZhbF9Jbml0VGhyZWFkcygpLgotCSovCi0JYXNzZXJ0KGF1dG9JbnRlcnByZXRlclN0YXRlKTsgLyogUHlfSW5pdGlhbGl6ZSgpIGhhc24ndCBiZWVuIGNhbGxlZCEgKi8KLQl0Y3VyID0gKFB5VGhyZWFkU3RhdGUgKilQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpOwotCWlmICh0Y3VyID09IE5VTEwpIHsKLQkJLyogQ3JlYXRlIGEgbmV3IHRocmVhZCBzdGF0ZSBmb3IgdGhpcyB0aHJlYWQgKi8KLQkJdGN1ciA9IFB5VGhyZWFkU3RhdGVfTmV3KGF1dG9JbnRlcnByZXRlclN0YXRlKTsKLQkJaWYgKHRjdXIgPT0gTlVMTCkKLQkJCVB5X0ZhdGFsRXJyb3IoIkNvdWxkbid0IGNyZWF0ZSB0aHJlYWQtc3RhdGUgZm9yIG5ldyB0aHJlYWQiKTsKLQkJLyogVGhpcyBpcyBvdXIgdGhyZWFkIHN0YXRlISAgV2UnbGwgbmVlZCB0byBkZWxldGUgaXQgaW4gdGhlCi0JCSAgIG1hdGNoaW5nIGNhbGwgdG8gUHlHSUxTdGF0ZV9SZWxlYXNlKCkuICovCi0JCXRjdXItPmdpbHN0YXRlX2NvdW50ZXIgPSAwOwotCQljdXJyZW50ID0gMDsgLyogbmV3IHRocmVhZCBzdGF0ZSBpcyBuZXZlciBjdXJyZW50ICovCi0JfQotCWVsc2UKLQkJY3VycmVudCA9IFB5VGhyZWFkU3RhdGVfSXNDdXJyZW50KHRjdXIpOwotCWlmIChjdXJyZW50ID09IDApCi0JCVB5RXZhbF9SZXN0b3JlVGhyZWFkKHRjdXIpOwotCS8qIFVwZGF0ZSBvdXIgY291bnRlciBpbiB0aGUgdGhyZWFkLXN0YXRlIC0gbm8gbmVlZCBmb3IgbG9ja3M6Ci0JICAgLSB0Y3VyIHdpbGwgcmVtYWluIHZhbGlkIGFzIHdlIGhvbGQgdGhlIEdJTC4KLQkgICAtIHRoZSBjb3VudGVyIGlzIHNhZmUgYXMgd2UgYXJlIHRoZSBvbmx5IHRocmVhZCAiYWxsb3dlZCIKLQkgICAgIHRvIG1vZGlmeSB0aGlzIHZhbHVlCi0JKi8KLQkrK3RjdXItPmdpbHN0YXRlX2NvdW50ZXI7Ci0JcmV0dXJuIGN1cnJlbnQgPyBQeUdJTFN0YXRlX0xPQ0tFRCA6IFB5R0lMU3RhdGVfVU5MT0NLRUQ7CisgICAgaW50IGN1cnJlbnQ7CisgICAgUHlUaHJlYWRTdGF0ZSAqdGN1cjsKKyAgICAvKiBOb3RlIHRoYXQgd2UgZG8gbm90IGF1dG8taW5pdCBQeXRob24gaGVyZSAtIGFwYXJ0IGZyb20KKyAgICAgICBwb3RlbnRpYWwgcmFjZXMgd2l0aCAyIHRocmVhZHMgYXV0by1pbml0aWFsaXppbmcsIHBlcC0zMTEKKyAgICAgICBzcGVsbHMgb3V0IG90aGVyIGlzc3Vlcy4gIEVtYmVkZGVycyBhcmUgZXhwZWN0ZWQgdG8gaGF2ZQorICAgICAgIGNhbGxlZCBQeV9Jbml0aWFsaXplKCkgYW5kIHVzdWFsbHkgUHlFdmFsX0luaXRUaHJlYWRzKCkuCisgICAgKi8KKyAgICBhc3NlcnQoYXV0b0ludGVycHJldGVyU3RhdGUpOyAvKiBQeV9Jbml0aWFsaXplKCkgaGFzbid0IGJlZW4gY2FsbGVkISAqLworICAgIHRjdXIgPSAoUHlUaHJlYWRTdGF0ZSAqKVB5VGhyZWFkX2dldF9rZXlfdmFsdWUoYXV0b1RMU2tleSk7CisgICAgaWYgKHRjdXIgPT0gTlVMTCkgeworICAgICAgICAvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIHN0YXRlIGZvciB0aGlzIHRocmVhZCAqLworICAgICAgICB0Y3VyID0gUHlUaHJlYWRTdGF0ZV9OZXcoYXV0b0ludGVycHJldGVyU3RhdGUpOworICAgICAgICBpZiAodGN1ciA9PSBOVUxMKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHRocmVhZC1zdGF0ZSBmb3IgbmV3IHRocmVhZCIpOworICAgICAgICAvKiBUaGlzIGlzIG91ciB0aHJlYWQgc3RhdGUhICBXZSdsbCBuZWVkIHRvIGRlbGV0ZSBpdCBpbiB0aGUKKyAgICAgICAgICAgbWF0Y2hpbmcgY2FsbCB0byBQeUdJTFN0YXRlX1JlbGVhc2UoKS4gKi8KKyAgICAgICAgdGN1ci0+Z2lsc3RhdGVfY291bnRlciA9IDA7CisgICAgICAgIGN1cnJlbnQgPSAwOyAvKiBuZXcgdGhyZWFkIHN0YXRlIGlzIG5ldmVyIGN1cnJlbnQgKi8KKyAgICB9CisgICAgZWxzZQorICAgICAgICBjdXJyZW50ID0gUHlUaHJlYWRTdGF0ZV9Jc0N1cnJlbnQodGN1cik7CisgICAgaWYgKGN1cnJlbnQgPT0gMCkKKyAgICAgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQodGN1cik7CisgICAgLyogVXBkYXRlIG91ciBjb3VudGVyIGluIHRoZSB0aHJlYWQtc3RhdGUgLSBubyBuZWVkIGZvciBsb2NrczoKKyAgICAgICAtIHRjdXIgd2lsbCByZW1haW4gdmFsaWQgYXMgd2UgaG9sZCB0aGUgR0lMLgorICAgICAgIC0gdGhlIGNvdW50ZXIgaXMgc2FmZSBhcyB3ZSBhcmUgdGhlIG9ubHkgdGhyZWFkICJhbGxvd2VkIgorICAgICAgICAgdG8gbW9kaWZ5IHRoaXMgdmFsdWUKKyAgICAqLworICAgICsrdGN1ci0+Z2lsc3RhdGVfY291bnRlcjsKKyAgICByZXR1cm4gY3VycmVudCA/IFB5R0lMU3RhdGVfTE9DS0VEIDogUHlHSUxTdGF0ZV9VTkxPQ0tFRDsKIH0KIAogdm9pZAogUHlHSUxTdGF0ZV9SZWxlYXNlKFB5R0lMU3RhdGVfU1RBVEUgb2xkc3RhdGUpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdGN1ciA9IChQeVRocmVhZFN0YXRlICopUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvVExTa2V5KTsKLQlpZiAodGN1ciA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJhdXRvLXJlbGVhc2luZyB0aHJlYWQtc3RhdGUsICIKLQkJICAgICAgICAgICAgICAiYnV0IG5vIHRocmVhZC1zdGF0ZSBmb3IgdGhpcyB0aHJlYWQiKTsKLQkvKiBXZSBtdXN0IGhvbGQgdGhlIEdJTCBhbmQgaGF2ZSBvdXIgdGhyZWFkIHN0YXRlIGN1cnJlbnQgKi8KLQkvKiBYWFggLSByZW1vdmUgdGhlIGNoZWNrIC0gdGhlIGFzc2VydCBzaG91bGQgYmUgZmluZSwKLQkgICBidXQgd2hpbGUgdGhpcyBpcyB2ZXJ5IG5ldyAoQXByaWwgMjAwMyksIHRoZSBleHRyYSBjaGVjawotCSAgIGJ5IHJlbGVhc2Utb25seSB1c2VycyBjYW4ndCBodXJ0LgotCSovCi0JaWYgKCEgUHlUaHJlYWRTdGF0ZV9Jc0N1cnJlbnQodGN1cikpCi0JCVB5X0ZhdGFsRXJyb3IoIlRoaXMgdGhyZWFkIHN0YXRlIG11c3QgYmUgY3VycmVudCB3aGVuIHJlbGVhc2luZyIpOwotCWFzc2VydChQeVRocmVhZFN0YXRlX0lzQ3VycmVudCh0Y3VyKSk7Ci0JLS10Y3VyLT5naWxzdGF0ZV9jb3VudGVyOwotCWFzc2VydCh0Y3VyLT5naWxzdGF0ZV9jb3VudGVyID49IDApOyAvKiBpbGxlZ2FsIGNvdW50ZXIgdmFsdWUgKi8KKyAgICBQeVRocmVhZFN0YXRlICp0Y3VyID0gKFB5VGhyZWFkU3RhdGUgKilQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RMU2tleSk7CisgICAgaWYgKHRjdXIgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiYXV0by1yZWxlYXNpbmcgdGhyZWFkLXN0YXRlLCAiCisgICAgICAgICAgICAgICAgICAgICAgImJ1dCBubyB0aHJlYWQtc3RhdGUgZm9yIHRoaXMgdGhyZWFkIik7CisgICAgLyogV2UgbXVzdCBob2xkIHRoZSBHSUwgYW5kIGhhdmUgb3VyIHRocmVhZCBzdGF0ZSBjdXJyZW50ICovCisgICAgLyogWFhYIC0gcmVtb3ZlIHRoZSBjaGVjayAtIHRoZSBhc3NlcnQgc2hvdWxkIGJlIGZpbmUsCisgICAgICAgYnV0IHdoaWxlIHRoaXMgaXMgdmVyeSBuZXcgKEFwcmlsIDIwMDMpLCB0aGUgZXh0cmEgY2hlY2sKKyAgICAgICBieSByZWxlYXNlLW9ubHkgdXNlcnMgY2FuJ3QgaHVydC4KKyAgICAqLworICAgIGlmICghIFB5VGhyZWFkU3RhdGVfSXNDdXJyZW50KHRjdXIpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJUaGlzIHRocmVhZCBzdGF0ZSBtdXN0IGJlIGN1cnJlbnQgd2hlbiByZWxlYXNpbmciKTsKKyAgICBhc3NlcnQoUHlUaHJlYWRTdGF0ZV9Jc0N1cnJlbnQodGN1cikpOworICAgIC0tdGN1ci0+Z2lsc3RhdGVfY291bnRlcjsKKyAgICBhc3NlcnQodGN1ci0+Z2lsc3RhdGVfY291bnRlciA+PSAwKTsgLyogaWxsZWdhbCBjb3VudGVyIHZhbHVlICovCiAKLQkvKiBJZiB3ZSdyZSBnb2luZyB0byBkZXN0cm95IHRoaXMgdGhyZWFkLXN0YXRlLCB3ZSBtdXN0Ci0JICogY2xlYXIgaXQgd2hpbGUgdGhlIEdJTCBpcyBoZWxkLCBhcyBkZXN0cnVjdG9ycyBtYXkgcnVuLgotCSAqLwotCWlmICh0Y3VyLT5naWxzdGF0ZV9jb3VudGVyID09IDApIHsKLQkJLyogY2FuJ3QgaGF2ZSBiZWVuIGxvY2tlZCB3aGVuIHdlIGNyZWF0ZWQgaXQgKi8KLQkJYXNzZXJ0KG9sZHN0YXRlID09IFB5R0lMU3RhdGVfVU5MT0NLRUQpOwotCQlQeVRocmVhZFN0YXRlX0NsZWFyKHRjdXIpOwotCQkvKiBEZWxldGUgdGhlIHRocmVhZC1zdGF0ZS4gIE5vdGUgdGhpcyByZWxlYXNlcyB0aGUgR0lMIHRvbyEKLQkJICogSXQncyB2aXRhbCB0aGF0IHRoZSBHSUwgYmUgaGVsZCBoZXJlLCB0byBhdm9pZCBzaHV0ZG93bgotCQkgKiByYWNlczsgc2VlIGJ1Z3MgMjI1NjczIGFuZCAxMDYxOTY4ICh0aGF0IG5hc3R5IGJ1ZyBoYXMgYQotCQkgKiBoYWJpdCBvZiBjb21pbmcgYmFjaykuCi0JCSAqLwotCQlQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQoKTsKLQl9Ci0JLyogUmVsZWFzZSB0aGUgbG9jayBpZiBuZWNlc3NhcnkgKi8KLQllbHNlIGlmIChvbGRzdGF0ZSA9PSBQeUdJTFN0YXRlX1VOTE9DS0VEKQotCQlQeUV2YWxfU2F2ZVRocmVhZCgpOworICAgIC8qIElmIHdlJ3JlIGdvaW5nIHRvIGRlc3Ryb3kgdGhpcyB0aHJlYWQtc3RhdGUsIHdlIG11c3QKKyAgICAgKiBjbGVhciBpdCB3aGlsZSB0aGUgR0lMIGlzIGhlbGQsIGFzIGRlc3RydWN0b3JzIG1heSBydW4uCisgICAgICovCisgICAgaWYgKHRjdXItPmdpbHN0YXRlX2NvdW50ZXIgPT0gMCkgeworICAgICAgICAvKiBjYW4ndCBoYXZlIGJlZW4gbG9ja2VkIHdoZW4gd2UgY3JlYXRlZCBpdCAqLworICAgICAgICBhc3NlcnQob2xkc3RhdGUgPT0gUHlHSUxTdGF0ZV9VTkxPQ0tFRCk7CisgICAgICAgIFB5VGhyZWFkU3RhdGVfQ2xlYXIodGN1cik7CisgICAgICAgIC8qIERlbGV0ZSB0aGUgdGhyZWFkLXN0YXRlLiAgTm90ZSB0aGlzIHJlbGVhc2VzIHRoZSBHSUwgdG9vIQorICAgICAgICAgKiBJdCdzIHZpdGFsIHRoYXQgdGhlIEdJTCBiZSBoZWxkIGhlcmUsIHRvIGF2b2lkIHNodXRkb3duCisgICAgICAgICAqIHJhY2VzOyBzZWUgYnVncyAyMjU2NzMgYW5kIDEwNjE5NjggKHRoYXQgbmFzdHkgYnVnIGhhcyBhCisgICAgICAgICAqIGhhYml0IG9mIGNvbWluZyBiYWNrKS4KKyAgICAgICAgICovCisgICAgICAgIFB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudCgpOworICAgIH0KKyAgICAvKiBSZWxlYXNlIHRoZSBsb2NrIGlmIG5lY2Vzc2FyeSAqLworICAgIGVsc2UgaWYgKG9sZHN0YXRlID09IFB5R0lMU3RhdGVfVU5MT0NLRUQpCisgICAgICAgIFB5RXZhbF9TYXZlVGhyZWFkKCk7CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5c3RyY21wLmMgYi9QeXRob24vcHlzdHJjbXAuYwppbmRleCA4NDI5NWU3Li5mOWMyMjc3IDEwMDY0NAotLS0gYS9QeXRob24vcHlzdHJjbXAuYworKysgYi9QeXRob24vcHlzdHJjbXAuYwpAQCAtNiwyMSArNiwyMSBAQAogaW50CiBQeU9TX215c3RybmljbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuIDA7Ci0Jd2hpbGUgKCgtLXNpemUgPiAwKSAmJgotCSAgICAgICAodG9sb3dlcigodW5zaWduZWQpKnMxKSA9PSB0b2xvd2VyKCh1bnNpZ25lZCkqczIpKSkgewotCQlpZiAoISpzMSsrIHx8ICEqczIrKykKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gdG9sb3dlcigodW5zaWduZWQpKnMxKSAtIHRvbG93ZXIoKHVuc2lnbmVkKSpzMik7CisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgd2hpbGUgKCgtLXNpemUgPiAwKSAmJgorICAgICAgICAgICAodG9sb3dlcigodW5zaWduZWQpKnMxKSA9PSB0b2xvd2VyKCh1bnNpZ25lZCkqczIpKSkgeworICAgICAgICBpZiAoISpzMSsrIHx8ICEqczIrKykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdG9sb3dlcigodW5zaWduZWQpKnMxKSAtIHRvbG93ZXIoKHVuc2lnbmVkKSpzMik7CiB9CiAKIGludAogUHlPU19teXN0cmljbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQogewotCXdoaWxlICgqczEgJiYgKHRvbG93ZXIoKHVuc2lnbmVkKSpzMSsrKSA9PSB0b2xvd2VyKCh1bnNpZ25lZCkqczIrKykpKSB7Ci0JCTsKLQl9Ci0JcmV0dXJuICh0b2xvd2VyKCh1bnNpZ25lZCkqczEpIC0gdG9sb3dlcigodW5zaWduZWQpKnMyKSk7CisgICAgd2hpbGUgKCpzMSAmJiAodG9sb3dlcigodW5zaWduZWQpKnMxKyspID09IHRvbG93ZXIoKHVuc2lnbmVkKSpzMisrKSkpIHsKKyAgICAgICAgOworICAgIH0KKyAgICByZXR1cm4gKHRvbG93ZXIoKHVuc2lnbmVkKSpzMSkgLSB0b2xvd2VyKCh1bnNpZ25lZCkqczIpKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0cnRvZC5jIGIvUHl0aG9uL3B5c3RydG9kLmMKaW5kZXggOTA5ZTAyMS4uODU5YWY0MyAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5c3RydG9kLmMKKysrIGIvUHl0aG9uL3B5c3RydG9kLmMKQEAgLTksMTEgKzksMTEgQEAKIHN0YXRpYyBpbnQKIGNhc2VfaW5zZW5zaXRpdmVfbWF0Y2goY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKIHsKLQl3aGlsZSgqdCAmJiBQeV9UT0xPV0VSKCpzKSA9PSAqdCkgewotCQlzKys7Ci0JCXQrKzsKLQl9Ci0JcmV0dXJuICp0ID8gMCA6IDE7CisgICAgd2hpbGUoKnQgJiYgUHlfVE9MT1dFUigqcykgPT0gKnQpIHsKKyAgICAgICAgcysrOworICAgICAgICB0Kys7CisgICAgfQorICAgIHJldHVybiAqdCA/IDAgOiAxOwogfQogCiAvKiBfUHlfcGFyc2VfaW5mX29yX25hbjogQXR0ZW1wdCB0byBwYXJzZSBhIHN0cmluZyBvZiB0aGUgZm9ybSAibmFuIiwgImluZiIgb3IKQEAgLTI1LDM2ICsyNSwzNiBAQAogZG91YmxlCiBfUHlfcGFyc2VfaW5mX29yX25hbihjb25zdCBjaGFyICpwLCBjaGFyICoqZW5kcHRyKQogewotCWRvdWJsZSByZXR2YWw7Ci0JY29uc3QgY2hhciAqczsKLQlpbnQgbmVnYXRlID0gMDsKKyAgICBkb3VibGUgcmV0dmFsOworICAgIGNvbnN0IGNoYXIgKnM7CisgICAgaW50IG5lZ2F0ZSA9IDA7CiAKLQlzID0gcDsKLQlpZiAoKnMgPT0gJy0nKSB7Ci0JCW5lZ2F0ZSA9IDE7Ci0JCXMrKzsKLQl9Ci0JZWxzZSBpZiAoKnMgPT0gJysnKSB7Ci0JCXMrKzsKLQl9Ci0JaWYgKGNhc2VfaW5zZW5zaXRpdmVfbWF0Y2gocywgImluZiIpKSB7Ci0JCXMgKz0gMzsKLQkJaWYgKGNhc2VfaW5zZW5zaXRpdmVfbWF0Y2gocywgImluaXR5IikpCi0JCQlzICs9IDU7Ci0JCXJldHZhbCA9IG5lZ2F0ZSA/IC1QeV9IVUdFX1ZBTCA6IFB5X0hVR0VfVkFMOwotCX0KKyAgICBzID0gcDsKKyAgICBpZiAoKnMgPT0gJy0nKSB7CisgICAgICAgIG5lZ2F0ZSA9IDE7CisgICAgICAgIHMrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoKnMgPT0gJysnKSB7CisgICAgICAgIHMrKzsKKyAgICB9CisgICAgaWYgKGNhc2VfaW5zZW5zaXRpdmVfbWF0Y2gocywgImluZiIpKSB7CisgICAgICAgIHMgKz0gMzsKKyAgICAgICAgaWYgKGNhc2VfaW5zZW5zaXRpdmVfbWF0Y2gocywgImluaXR5IikpCisgICAgICAgICAgICBzICs9IDU7CisgICAgICAgIHJldHZhbCA9IG5lZ2F0ZSA/IC1QeV9IVUdFX1ZBTCA6IFB5X0hVR0VfVkFMOworICAgIH0KICNpZmRlZiBQeV9OQU4KLQllbHNlIGlmIChjYXNlX2luc2Vuc2l0aXZlX21hdGNoKHMsICJuYW4iKSkgewotCQlzICs9IDM7Ci0JCXJldHZhbCA9IG5lZ2F0ZSA/IC1QeV9OQU4gOiBQeV9OQU47Ci0JfQorICAgIGVsc2UgaWYgKGNhc2VfaW5zZW5zaXRpdmVfbWF0Y2gocywgIm5hbiIpKSB7CisgICAgICAgIHMgKz0gMzsKKyAgICAgICAgcmV0dmFsID0gbmVnYXRlID8gLVB5X05BTiA6IFB5X05BTjsKKyAgICB9CiAjZW5kaWYKLQllbHNlIHsKLQkJcyA9IHA7Ci0JCXJldHZhbCA9IC0xLjA7Ci0JfQotCSplbmRwdHIgPSAoY2hhciAqKXM7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICBlbHNlIHsKKyAgICAgICAgcyA9IHA7CisgICAgICAgIHJldHZhbCA9IC0xLjA7CisgICAgfQorICAgICplbmRwdHIgPSAoY2hhciAqKXM7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogLyoqCkBAIC02Miw3ICs2Miw3IEBACiAgKiBAbnB0cjogICAgdGhlIHN0cmluZyB0byBjb252ZXJ0IHRvIGEgbnVtZXJpYyB2YWx1ZS4KICAqIEBlbmRwdHI6ICBpZiBub24tJU5VTEwsIGl0IHJldHVybnMgdGhlIGNoYXJhY3RlciBhZnRlcgogICogICAgICAgICAgIHRoZSBsYXN0IGNoYXJhY3RlciB1c2VkIGluIHRoZSBjb252ZXJzaW9uLgotICogCisgKgogICogQ29udmVydHMgYSBzdHJpbmcgdG8gYSAjZ2RvdWJsZSB2YWx1ZS4KICAqIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBsaWtlIHRoZSBzdGFuZGFyZCBzdHJ0b2QoKSBmdW5jdGlvbgogICogZG9lcyBpbiB0aGUgQyBsb2NhbGUuIEl0IGRvZXMgdGhpcyB3aXRob3V0IGFjdHVhbGx5CkBAIC03OSw3ICs3OSw3IEBACiAgKiBzdG9yZWQgaW4gJWVycm5vLiBJZiB0aGUgY29ycmVjdCB2YWx1ZSB3b3VsZCBjYXVzZSB1bmRlcmZsb3csCiAgKiB6ZXJvIGlzIHJldHVybmVkIGFuZCAlRVJBTkdFIGlzIHN0b3JlZCBpbiAlZXJybm8uCiAgKiBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscywgJUVOT01FTSBpcyBzdG9yZWQgaW4gJWVycm5vLgotICogCisgKgogICogVGhpcyBmdW5jdGlvbiByZXNldHMgJWVycm5vIGJlZm9yZSBjYWxsaW5nIHN0cnRvZCgpIHNvIHRoYXQKICAqIHlvdSBjYW4gcmVsaWFibHkgZGV0ZWN0IG92ZXJmbG93IGFuZCB1bmRlcmZsb3cuCiAgKgpAQCAtOTEsMjMgKzkxLDIzIEBACiBkb3VibGUKIF9QeU9TX2FzY2lpX3N0cnRvZChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyKQogewotCWRvdWJsZSByZXN1bHQ7Ci0JX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fSEVBREVSOworICAgIGRvdWJsZSByZXN1bHQ7CisgICAgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fSEVBREVSOwogCi0JYXNzZXJ0KG5wdHIgIT0gTlVMTCk7Ci0JLyogU2V0IGVycm5vIHRvIHplcm8sIHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHplcm8gcmVzdWx0cwotCSAgIGFuZCB1bmRlcmZsb3dzICovCi0JZXJybm8gPSAwOworICAgIGFzc2VydChucHRyICE9IE5VTEwpOworICAgIC8qIFNldCBlcnJubyB0byB6ZXJvLCBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB6ZXJvIHJlc3VsdHMKKyAgICAgICBhbmQgdW5kZXJmbG93cyAqLworICAgIGVycm5vID0gMDsKIAotCV9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX1NUQVJUOwotCXJlc3VsdCA9IF9QeV9kZ19zdHJ0b2QobnB0ciwgZW5kcHRyKTsKLQlfUHlfU0VUXzUzQklUX1BSRUNJU0lPTl9FTkQ7CisgICAgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fU1RBUlQ7CisgICAgcmVzdWx0ID0gX1B5X2RnX3N0cnRvZChucHRyLCBlbmRwdHIpOworICAgIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX0VORDsKIAotCWlmICgqZW5kcHRyID09IG5wdHIpCi0JCS8qIHN0cmluZyBtaWdodCByZXByZXNlbnQgYW4gaW5mIG9yIG5hbiAqLwotCQlyZXN1bHQgPSBfUHlfcGFyc2VfaW5mX29yX25hbihucHRyLCBlbmRwdHIpOworICAgIGlmICgqZW5kcHRyID09IG5wdHIpCisgICAgICAgIC8qIHN0cmluZyBtaWdodCByZXByZXNlbnQgYW4gaW5mIG9yIG5hbiAqLworICAgICAgICByZXN1bHQgPSBfUHlfcGFyc2VfaW5mX29yX25hbihucHRyLCBlbmRwdHIpOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogCiB9CiAKQEAgLTEyNCwxNDggKzEyNCwxNDggQEAKIGRvdWJsZQogX1B5T1NfYXNjaWlfc3RydG9kKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIpCiB7Ci0JY2hhciAqZmFpbF9wb3M7Ci0JZG91YmxlIHZhbCA9IC0xLjA7Ci0Jc3RydWN0IGxjb252ICpsb2NhbGVfZGF0YTsKLQljb25zdCBjaGFyICpkZWNpbWFsX3BvaW50OwotCXNpemVfdCBkZWNpbWFsX3BvaW50X2xlbjsKLQljb25zdCBjaGFyICpwLCAqZGVjaW1hbF9wb2ludF9wb3M7Ci0JY29uc3QgY2hhciAqZW5kID0gTlVMTDsgLyogU2lsZW5jZSBnY2MgKi8KLQljb25zdCBjaGFyICpkaWdpdHNfcG9zID0gTlVMTDsKLQlpbnQgbmVnYXRlID0gMDsKKyAgICBjaGFyICpmYWlsX3BvczsKKyAgICBkb3VibGUgdmFsID0gLTEuMDsKKyAgICBzdHJ1Y3QgbGNvbnYgKmxvY2FsZV9kYXRhOworICAgIGNvbnN0IGNoYXIgKmRlY2ltYWxfcG9pbnQ7CisgICAgc2l6ZV90IGRlY2ltYWxfcG9pbnRfbGVuOworICAgIGNvbnN0IGNoYXIgKnAsICpkZWNpbWFsX3BvaW50X3BvczsKKyAgICBjb25zdCBjaGFyICplbmQgPSBOVUxMOyAvKiBTaWxlbmNlIGdjYyAqLworICAgIGNvbnN0IGNoYXIgKmRpZ2l0c19wb3MgPSBOVUxMOworICAgIGludCBuZWdhdGUgPSAwOwogCi0JYXNzZXJ0KG5wdHIgIT0gTlVMTCk7CisgICAgYXNzZXJ0KG5wdHIgIT0gTlVMTCk7CiAKLQlmYWlsX3BvcyA9IE5VTEw7CisgICAgZmFpbF9wb3MgPSBOVUxMOwogCi0JbG9jYWxlX2RhdGEgPSBsb2NhbGVjb252KCk7Ci0JZGVjaW1hbF9wb2ludCA9IGxvY2FsZV9kYXRhLT5kZWNpbWFsX3BvaW50OwotCWRlY2ltYWxfcG9pbnRfbGVuID0gc3RybGVuKGRlY2ltYWxfcG9pbnQpOworICAgIGxvY2FsZV9kYXRhID0gbG9jYWxlY29udigpOworICAgIGRlY2ltYWxfcG9pbnQgPSBsb2NhbGVfZGF0YS0+ZGVjaW1hbF9wb2ludDsKKyAgICBkZWNpbWFsX3BvaW50X2xlbiA9IHN0cmxlbihkZWNpbWFsX3BvaW50KTsKIAotCWFzc2VydChkZWNpbWFsX3BvaW50X2xlbiAhPSAwKTsKKyAgICBhc3NlcnQoZGVjaW1hbF9wb2ludF9sZW4gIT0gMCk7CiAKLQlkZWNpbWFsX3BvaW50X3BvcyA9IE5VTEw7CisgICAgZGVjaW1hbF9wb2ludF9wb3MgPSBOVUxMOwogCi0JLyogUGFyc2UgaW5maW5pdGllcyBhbmQgbmFucyAqLwotCXZhbCA9IF9QeV9wYXJzZV9pbmZfb3JfbmFuKG5wdHIsIGVuZHB0cik7Ci0JaWYgKCplbmRwdHIgIT0gbnB0cikKLQkJcmV0dXJuIHZhbDsKKyAgICAvKiBQYXJzZSBpbmZpbml0aWVzIGFuZCBuYW5zICovCisgICAgdmFsID0gX1B5X3BhcnNlX2luZl9vcl9uYW4obnB0ciwgZW5kcHRyKTsKKyAgICBpZiAoKmVuZHB0ciAhPSBucHRyKQorICAgICAgICByZXR1cm4gdmFsOwogCi0JLyogU2V0IGVycm5vIHRvIHplcm8sIHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHplcm8gcmVzdWx0cwotCSAgIGFuZCB1bmRlcmZsb3dzICovCi0JZXJybm8gPSAwOworICAgIC8qIFNldCBlcnJubyB0byB6ZXJvLCBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB6ZXJvIHJlc3VsdHMKKyAgICAgICBhbmQgdW5kZXJmbG93cyAqLworICAgIGVycm5vID0gMDsKIAotCS8qIFdlIHByb2Nlc3MgdGhlIG9wdGlvbmFsIHNpZ24gbWFudWFsbHksIHRoZW4gcGFzcyB0aGUgcmVtYWluZGVyIHRvCi0JICAgdGhlIHN5c3RlbSBzdHJ0b2QuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcmVzdWx0IG9mIGFuIHVuZGVyZmxvdwotCSAgIGhhcyB0aGUgY29ycmVjdCBzaWduLiAoYnVnICMxNzI1KSAgKi8KLQlwID0gbnB0cjsKLQkvKiBQcm9jZXNzIGxlYWRpbmcgc2lnbiwgaWYgcHJlc2VudCAqLwotCWlmICgqcCA9PSAnLScpIHsKLQkJbmVnYXRlID0gMTsKLQkJcCsrOwotCX0KLQllbHNlIGlmICgqcCA9PSAnKycpIHsKLQkJcCsrOwotCX0KKyAgICAvKiBXZSBwcm9jZXNzIHRoZSBvcHRpb25hbCBzaWduIG1hbnVhbGx5LCB0aGVuIHBhc3MgdGhlIHJlbWFpbmRlciB0bworICAgICAgIHRoZSBzeXN0ZW0gc3RydG9kLiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHJlc3VsdCBvZiBhbiB1bmRlcmZsb3cKKyAgICAgICBoYXMgdGhlIGNvcnJlY3Qgc2lnbi4gKGJ1ZyAjMTcyNSkgICovCisgICAgcCA9IG5wdHI7CisgICAgLyogUHJvY2VzcyBsZWFkaW5nIHNpZ24sIGlmIHByZXNlbnQgKi8KKyAgICBpZiAoKnAgPT0gJy0nKSB7CisgICAgICAgIG5lZ2F0ZSA9IDE7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgZWxzZSBpZiAoKnAgPT0gJysnKSB7CisgICAgICAgIHArKzsKKyAgICB9CiAKLQkvKiBTb21lIHBsYXRmb3JtIHN0cnRvZHMgYWNjZXB0IGhleCBmbG9hdHM7IFB5dGhvbiBzaG91bGRuJ3QgKGF0IHRoZQotCSAgIG1vbWVudCksIHNvIHdlIGNoZWNrIGV4cGxpY2l0bHkgZm9yIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCAnMHgnLiAqLwotCWlmICgqcCA9PSAnMCcgJiYgKCoocCsxKSA9PSAneCcgfHwgKihwKzEpID09ICdYJykpCi0JCWdvdG8gaW52YWxpZF9zdHJpbmc7CisgICAgLyogU29tZSBwbGF0Zm9ybSBzdHJ0b2RzIGFjY2VwdCBoZXggZmxvYXRzOyBQeXRob24gc2hvdWxkbid0IChhdCB0aGUKKyAgICAgICBtb21lbnQpLCBzbyB3ZSBjaGVjayBleHBsaWNpdGx5IGZvciBzdHJpbmdzIHN0YXJ0aW5nIHdpdGggJzB4Jy4gKi8KKyAgICBpZiAoKnAgPT0gJzAnICYmICgqKHArMSkgPT0gJ3gnIHx8ICoocCsxKSA9PSAnWCcpKQorICAgICAgICBnb3RvIGludmFsaWRfc3RyaW5nOwogCi0JLyogQ2hlY2sgdGhhdCB3aGF0J3MgbGVmdCBiZWdpbnMgd2l0aCBhIGRpZ2l0IG9yIGRlY2ltYWwgcG9pbnQgKi8KLQlpZiAoIVB5X0lTRElHSVQoKnApICYmICpwICE9ICcuJykKLQkJZ290byBpbnZhbGlkX3N0cmluZzsKKyAgICAvKiBDaGVjayB0aGF0IHdoYXQncyBsZWZ0IGJlZ2lucyB3aXRoIGEgZGlnaXQgb3IgZGVjaW1hbCBwb2ludCAqLworICAgIGlmICghUHlfSVNESUdJVCgqcCkgJiYgKnAgIT0gJy4nKQorICAgICAgICBnb3RvIGludmFsaWRfc3RyaW5nOwogCi0JZGlnaXRzX3BvcyA9IHA7Ci0JaWYgKGRlY2ltYWxfcG9pbnRbMF0gIT0gJy4nIHx8Ci0JICAgIGRlY2ltYWxfcG9pbnRbMV0gIT0gMCkKLQl7Ci0JCS8qIExvb2sgZm9yIGEgJy4nIGluIHRoZSBpbnB1dDsgaWYgcHJlc2VudCwgaXQnbGwgbmVlZCB0byBiZQotCQkgICBzd2FwcGVkIGZvciB0aGUgY3VycmVudCBsb2NhbGUncyBkZWNpbWFsIHBvaW50IGJlZm9yZSB3ZQotCQkgICBjYWxsIHN0cnRvZC4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBmaW5kIHRoZSBjdXJyZW50Ci0JCSAgIGxvY2FsZSdzIGRlY2ltYWwgcG9pbnQgdGhlbiB0aGUgaW5wdXQgaXMgaW52YWxpZC4gKi8KLQkJd2hpbGUgKFB5X0lTRElHSVQoKnApKQotCQkJcCsrOworICAgIGRpZ2l0c19wb3MgPSBwOworICAgIGlmIChkZWNpbWFsX3BvaW50WzBdICE9ICcuJyB8fAorICAgICAgICBkZWNpbWFsX3BvaW50WzFdICE9IDApCisgICAgeworICAgICAgICAvKiBMb29rIGZvciBhICcuJyBpbiB0aGUgaW5wdXQ7IGlmIHByZXNlbnQsIGl0J2xsIG5lZWQgdG8gYmUKKyAgICAgICAgICAgc3dhcHBlZCBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgZGVjaW1hbCBwb2ludCBiZWZvcmUgd2UKKyAgICAgICAgICAgY2FsbCBzdHJ0b2QuICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgZmluZCB0aGUgY3VycmVudAorICAgICAgICAgICBsb2NhbGUncyBkZWNpbWFsIHBvaW50IHRoZW4gdGhlIGlucHV0IGlzIGludmFsaWQuICovCisgICAgICAgIHdoaWxlIChQeV9JU0RJR0lUKCpwKSkKKyAgICAgICAgICAgIHArKzsKIAotCQlpZiAoKnAgPT0gJy4nKQotCQl7Ci0JCQlkZWNpbWFsX3BvaW50X3BvcyA9IHArKzsKKyAgICAgICAgaWYgKCpwID09ICcuJykKKyAgICAgICAgeworICAgICAgICAgICAgZGVjaW1hbF9wb2ludF9wb3MgPSBwKys7CiAKLQkJCS8qIGxvY2F0ZSBlbmQgb2YgbnVtYmVyICovCi0JCQl3aGlsZSAoUHlfSVNESUdJVCgqcCkpCi0JCQkJcCsrOworICAgICAgICAgICAgLyogbG9jYXRlIGVuZCBvZiBudW1iZXIgKi8KKyAgICAgICAgICAgIHdoaWxlIChQeV9JU0RJR0lUKCpwKSkKKyAgICAgICAgICAgICAgICBwKys7CiAKLQkJCWlmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKQotCQkJCXArKzsKLQkJCWlmICgqcCA9PSAnKycgfHwgKnAgPT0gJy0nKQotCQkJCXArKzsKLQkJCXdoaWxlIChQeV9JU0RJR0lUKCpwKSkKLQkJCQlwKys7Ci0JCQllbmQgPSBwOwotCQl9Ci0JCWVsc2UgaWYgKHN0cm5jbXAocCwgZGVjaW1hbF9wb2ludCwgZGVjaW1hbF9wb2ludF9sZW4pID09IDApCi0JCQkvKiBQeXRob24gYnVnICMxNDE3Njk5ICovCi0JCQlnb3RvIGludmFsaWRfc3RyaW5nOwotCQkvKiBGb3IgdGhlIG90aGVyIGNhc2VzLCB3ZSBuZWVkIG5vdCBjb252ZXJ0IHRoZSBkZWNpbWFsCi0JCSAgIHBvaW50ICovCi0JfQorICAgICAgICAgICAgaWYgKCpwID09ICdlJyB8fCAqcCA9PSAnRScpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgd2hpbGUgKFB5X0lTRElHSVQoKnApKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGVuZCA9IHA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RybmNtcChwLCBkZWNpbWFsX3BvaW50LCBkZWNpbWFsX3BvaW50X2xlbikgPT0gMCkKKyAgICAgICAgICAgIC8qIFB5dGhvbiBidWcgIzE0MTc2OTkgKi8KKyAgICAgICAgICAgIGdvdG8gaW52YWxpZF9zdHJpbmc7CisgICAgICAgIC8qIEZvciB0aGUgb3RoZXIgY2FzZXMsIHdlIG5lZWQgbm90IGNvbnZlcnQgdGhlIGRlY2ltYWwKKyAgICAgICAgICAgcG9pbnQgKi8KKyAgICB9CiAKLQlpZiAoZGVjaW1hbF9wb2ludF9wb3MpIHsKLQkJY2hhciAqY29weSwgKmM7Ci0JCS8qIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGlucHV0LCB3aXRoIHRoZSAnLicgY29udmVydGVkIHRvIHRoZQotCQkgICBsb2NhbGUtc3BlY2lmaWMgZGVjaW1hbCBwb2ludCAqLwotCQljb3B5ID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoZW5kIC0gZGlnaXRzX3BvcyArCi0JCQkJCSAgICAxICsgZGVjaW1hbF9wb2ludF9sZW4pOwotCQlpZiAoY29weSA9PSBOVUxMKSB7Ci0JCQkqZW5kcHRyID0gKGNoYXIgKilucHRyOwotCQkJZXJybm8gPSBFTk9NRU07Ci0JCQlyZXR1cm4gdmFsOwotCQl9CisgICAgaWYgKGRlY2ltYWxfcG9pbnRfcG9zKSB7CisgICAgICAgIGNoYXIgKmNvcHksICpjOworICAgICAgICAvKiBDcmVhdGUgYSBjb3B5IG9mIHRoZSBpbnB1dCwgd2l0aCB0aGUgJy4nIGNvbnZlcnRlZCB0byB0aGUKKyAgICAgICAgICAgbG9jYWxlLXNwZWNpZmljIGRlY2ltYWwgcG9pbnQgKi8KKyAgICAgICAgY29weSA9IChjaGFyICopUHlNZW1fTUFMTE9DKGVuZCAtIGRpZ2l0c19wb3MgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSArIGRlY2ltYWxfcG9pbnRfbGVuKTsKKyAgICAgICAgaWYgKGNvcHkgPT0gTlVMTCkgeworICAgICAgICAgICAgKmVuZHB0ciA9IChjaGFyICopbnB0cjsKKyAgICAgICAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQogCi0JCWMgPSBjb3B5OwotCQltZW1jcHkoYywgZGlnaXRzX3BvcywgZGVjaW1hbF9wb2ludF9wb3MgLSBkaWdpdHNfcG9zKTsKLQkJYyArPSBkZWNpbWFsX3BvaW50X3BvcyAtIGRpZ2l0c19wb3M7Ci0JCW1lbWNweShjLCBkZWNpbWFsX3BvaW50LCBkZWNpbWFsX3BvaW50X2xlbik7Ci0JCWMgKz0gZGVjaW1hbF9wb2ludF9sZW47Ci0JCW1lbWNweShjLCBkZWNpbWFsX3BvaW50X3BvcyArIDEsCi0JCSAgICAgICBlbmQgLSAoZGVjaW1hbF9wb2ludF9wb3MgKyAxKSk7Ci0JCWMgKz0gZW5kIC0gKGRlY2ltYWxfcG9pbnRfcG9zICsgMSk7Ci0JCSpjID0gMDsKKyAgICAgICAgYyA9IGNvcHk7CisgICAgICAgIG1lbWNweShjLCBkaWdpdHNfcG9zLCBkZWNpbWFsX3BvaW50X3BvcyAtIGRpZ2l0c19wb3MpOworICAgICAgICBjICs9IGRlY2ltYWxfcG9pbnRfcG9zIC0gZGlnaXRzX3BvczsKKyAgICAgICAgbWVtY3B5KGMsIGRlY2ltYWxfcG9pbnQsIGRlY2ltYWxfcG9pbnRfbGVuKTsKKyAgICAgICAgYyArPSBkZWNpbWFsX3BvaW50X2xlbjsKKyAgICAgICAgbWVtY3B5KGMsIGRlY2ltYWxfcG9pbnRfcG9zICsgMSwKKyAgICAgICAgICAgICAgIGVuZCAtIChkZWNpbWFsX3BvaW50X3BvcyArIDEpKTsKKyAgICAgICAgYyArPSBlbmQgLSAoZGVjaW1hbF9wb2ludF9wb3MgKyAxKTsKKyAgICAgICAgKmMgPSAwOwogCi0JCXZhbCA9IHN0cnRvZChjb3B5LCAmZmFpbF9wb3MpOworICAgICAgICB2YWwgPSBzdHJ0b2QoY29weSwgJmZhaWxfcG9zKTsKIAotCQlpZiAoZmFpbF9wb3MpCi0JCXsKLQkJCWlmIChmYWlsX3BvcyA+IGRlY2ltYWxfcG9pbnRfcG9zKQotCQkJCWZhaWxfcG9zID0gKGNoYXIgKilkaWdpdHNfcG9zICsKLQkJCQkJKGZhaWxfcG9zIC0gY29weSkgLQotCQkJCQkoZGVjaW1hbF9wb2ludF9sZW4gLSAxKTsKLQkJCWVsc2UKLQkJCQlmYWlsX3BvcyA9IChjaGFyICopZGlnaXRzX3BvcyArCi0JCQkJCShmYWlsX3BvcyAtIGNvcHkpOwotCQl9CisgICAgICAgIGlmIChmYWlsX3BvcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZhaWxfcG9zID4gZGVjaW1hbF9wb2ludF9wb3MpCisgICAgICAgICAgICAgICAgZmFpbF9wb3MgPSAoY2hhciAqKWRpZ2l0c19wb3MgKworICAgICAgICAgICAgICAgICAgICAoZmFpbF9wb3MgLSBjb3B5KSAtCisgICAgICAgICAgICAgICAgICAgIChkZWNpbWFsX3BvaW50X2xlbiAtIDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZhaWxfcG9zID0gKGNoYXIgKilkaWdpdHNfcG9zICsKKyAgICAgICAgICAgICAgICAgICAgKGZhaWxfcG9zIC0gY29weSk7CisgICAgICAgIH0KIAotCQlQeU1lbV9GUkVFKGNvcHkpOworICAgICAgICBQeU1lbV9GUkVFKGNvcHkpOwogCi0JfQotCWVsc2UgewotCQl2YWwgPSBzdHJ0b2QoZGlnaXRzX3BvcywgJmZhaWxfcG9zKTsKLQl9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB2YWwgPSBzdHJ0b2QoZGlnaXRzX3BvcywgJmZhaWxfcG9zKTsKKyAgICB9CiAKLQlpZiAoZmFpbF9wb3MgPT0gZGlnaXRzX3BvcykKLQkJZ290byBpbnZhbGlkX3N0cmluZzsKKyAgICBpZiAoZmFpbF9wb3MgPT0gZGlnaXRzX3BvcykKKyAgICAgICAgZ290byBpbnZhbGlkX3N0cmluZzsKIAotCWlmIChuZWdhdGUgJiYgZmFpbF9wb3MgIT0gbnB0cikKLQkJdmFsID0gLXZhbDsKLQkqZW5kcHRyID0gZmFpbF9wb3M7CisgICAgaWYgKG5lZ2F0ZSAmJiBmYWlsX3BvcyAhPSBucHRyKQorICAgICAgICB2YWwgPSAtdmFsOworICAgICplbmRwdHIgPSBmYWlsX3BvczsKIAotCXJldHVybiB2YWw7CisgICAgcmV0dXJuIHZhbDsKIAogICBpbnZhbGlkX3N0cmluZzoKLQkqZW5kcHRyID0gKGNoYXIqKW5wdHI7Ci0JZXJybm8gPSBFSU5WQUw7Ci0JcmV0dXJuIC0xLjA7CisgICAgKmVuZHB0ciA9IChjaGFyKilucHRyOworICAgIGVycm5vID0gRUlOVkFMOworICAgIHJldHVybiAtMS4wOwogfQogCiAjZW5kaWYKQEAgLTI3NSwyNyArMjc1LDI3IEBACiBkb3VibGUKIFB5T1NfYXNjaWlfc3RydG9kKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIpCiB7Ci0JY2hhciAqZmFpbF9wb3M7Ci0JY29uc3QgY2hhciAqcDsKLQlkb3VibGUgeDsKKyAgICBjaGFyICpmYWlsX3BvczsKKyAgICBjb25zdCBjaGFyICpwOworICAgIGRvdWJsZSB4OwogCi0JaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkgIlB5T1NfYXNjaWlfc3RydG9kIGFuZCBQeU9TX2FzY2lpX2F0b2YgYXJlICIKLQkJCSAiZGVwcmVjYXRlZC4gIFVzZSBQeU9TX3N0cmluZ190b19kb3VibGUgIgotCQkJICJpbnN0ZWFkLiIsIDEpIDwgMCkKLQkJcmV0dXJuIC0xLjA7CisgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAiUHlPU19hc2NpaV9zdHJ0b2QgYW5kIFB5T1NfYXNjaWlfYXRvZiBhcmUgIgorICAgICAgICAgICAgICAgICAgICAgImRlcHJlY2F0ZWQuICBVc2UgUHlPU19zdHJpbmdfdG9fZG91YmxlICIKKyAgICAgICAgICAgICAgICAgICAgICJpbnN0ZWFkLiIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xLjA7CiAKLQkvKiBfUHlPU19hc2NpaV9zdHJ0b2QgYWxyZWFkeSBkb2VzIGV2ZXJ5dGhpbmcgdGhhdCB3ZSB3YW50LAotCSAgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgcGFyc2UgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0JcCA9IG5wdHI7Ci0Jd2hpbGUgKFB5X0lTU1BBQ0UoKnApKQotCQlwKys7Ci0JeCA9IF9QeU9TX2FzY2lpX3N0cnRvZChwLCAmZmFpbF9wb3MpOwotCWlmIChmYWlsX3BvcyA9PSBwKQotCQlmYWlsX3BvcyA9IChjaGFyICopbnB0cjsKLQlpZiAoZW5kcHRyKQotCQkqZW5kcHRyID0gKGNoYXIgKilmYWlsX3BvczsKLQlyZXR1cm4geDsKKyAgICAvKiBfUHlPU19hc2NpaV9zdHJ0b2QgYWxyZWFkeSBkb2VzIGV2ZXJ5dGhpbmcgdGhhdCB3ZSB3YW50LAorICAgICAgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgcGFyc2UgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgICAgcCA9IG5wdHI7CisgICAgd2hpbGUgKFB5X0lTU1BBQ0UoKnApKQorICAgICAgICBwKys7CisgICAgeCA9IF9QeU9TX2FzY2lpX3N0cnRvZChwLCAmZmFpbF9wb3MpOworICAgIGlmIChmYWlsX3BvcyA9PSBwKQorICAgICAgICBmYWlsX3BvcyA9IChjaGFyICopbnB0cjsKKyAgICBpZiAoZW5kcHRyKQorICAgICAgICAqZW5kcHRyID0gKGNoYXIgKilmYWlsX3BvczsKKyAgICByZXR1cm4geDsKIH0KIAogLyogUHlPU19hc2NpaV9zdHJ0b2QgaXMgREVQUkVDQVRFRCBpbiBQeXRob24gMi43IGFuZCAzLjEgKi8KQEAgLTMwMyw3ICszMDMsNyBAQAogZG91YmxlCiBQeU9TX2FzY2lpX2F0b2YoY29uc3QgY2hhciAqbnB0cikKIHsKLQlyZXR1cm4gUHlPU19hc2NpaV9zdHJ0b2QobnB0ciwgTlVMTCk7CisgICAgcmV0dXJuIFB5T1NfYXNjaWlfc3RydG9kKG5wdHIsIE5VTEwpOwogfQogCiAvKiBQeU9TX3N0cmluZ190b19kb3VibGUgaXMgdGhlIHJlY29tbWVuZGVkIHJlcGxhY2VtZW50IGZvciB0aGUgZGVwcmVjYXRlZApAQCAtMzM0LDM5ICszMzQsMzkgQEAKIAogZG91YmxlCiBQeU9TX3N0cmluZ190b19kb3VibGUoY29uc3QgY2hhciAqcywKLQkJICAgICAgY2hhciAqKmVuZHB0ciwKLQkJICAgICAgUHlPYmplY3QgKm92ZXJmbG93X2V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqZW5kcHRyLAorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvdmVyZmxvd19leGNlcHRpb24pCiB7Ci0JZG91YmxlIHgsIHJlc3VsdD0tMS4wOwotCWNoYXIgKmZhaWxfcG9zOworICAgIGRvdWJsZSB4LCByZXN1bHQ9LTEuMDsKKyAgICBjaGFyICpmYWlsX3BvczsKIAotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJQeU9TX3N0cmluZ190b19kb3VibGUiLCByZXR1cm4gLTEuMCkKLQl4ID0gX1B5T1NfYXNjaWlfc3RydG9kKHMsICZmYWlsX3Bvcyk7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoeCkKKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiUHlPU19zdHJpbmdfdG9fZG91YmxlIiwgcmV0dXJuIC0xLjApCisgICAgeCA9IF9QeU9TX2FzY2lpX3N0cnRvZChzLCAmZmFpbF9wb3MpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHgpCiAKLQlpZiAoZXJybm8gPT0gRU5PTUVNKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWZhaWxfcG9zID0gKGNoYXIgKilzOwotCX0KLQllbHNlIGlmICghZW5kcHRyICYmIChmYWlsX3BvcyA9PSBzIHx8ICpmYWlsX3BvcyAhPSAnXDAnKSkKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICAiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGZsb2F0OiAiCi0JCQkgICAgICAiJS4yMDBzIiwgcyk7Ci0JZWxzZSBpZiAoZmFpbF9wb3MgPT0gcykKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICAiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGZsb2F0OiAiCi0JCQkgICAgICAiJS4yMDBzIiwgcyk7Ci0JZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFICYmIGZhYnMoeCkgPj0gMS4wICYmIG92ZXJmbG93X2V4Y2VwdGlvbikKLQkJUHlFcnJfRm9ybWF0KG92ZXJmbG93X2V4Y2VwdGlvbiwKLQkJCSAgICAgICJ2YWx1ZSB0b28gbGFyZ2UgdG8gY29udmVydCB0byBmbG9hdDogIgotCQkJICAgICAgIiUuMjAwcyIsIHMpOwotCWVsc2UKLQkJcmVzdWx0ID0geDsKKyAgICBpZiAoZXJybm8gPT0gRU5PTUVNKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGZhaWxfcG9zID0gKGNoYXIgKilzOworICAgIH0KKyAgICBlbHNlIGlmICghZW5kcHRyICYmIChmYWlsX3BvcyA9PSBzIHx8ICpmYWlsX3BvcyAhPSAnXDAnKSkKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byBmbG9hdDogIgorICAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMiLCBzKTsKKyAgICBlbHNlIGlmIChmYWlsX3BvcyA9PSBzKQorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGZsb2F0OiAiCisgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyIsIHMpOworICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSAmJiBmYWJzKHgpID49IDEuMCAmJiBvdmVyZmxvd19leGNlcHRpb24pCisgICAgICAgIFB5RXJyX0Zvcm1hdChvdmVyZmxvd19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIGZsb2F0OiAiCisgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyIsIHMpOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0geDsKIAotCWlmIChlbmRwdHIgIT0gTlVMTCkKLQkJKmVuZHB0ciA9IGZhaWxfcG9zOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKGVuZHB0ciAhPSBOVUxMKQorICAgICAgICAqZW5kcHRyID0gZmFpbF9wb3M7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogR2l2ZW4gYSBzdHJpbmcgdGhhdCBtYXkgaGF2ZSBhIGRlY2ltYWwgcG9pbnQgaW4gdGhlIGN1cnJlbnQKQEAgLTM3NSwzMCArMzc1LDMwIEBACiBQeV9MT0NBTF9JTkxJTkUodm9pZCkKIGNoYW5nZV9kZWNpbWFsX2Zyb21fbG9jYWxlX3RvX2RvdChjaGFyKiBidWZmZXIpCiB7Ci0Jc3RydWN0IGxjb252ICpsb2NhbGVfZGF0YSA9IGxvY2FsZWNvbnYoKTsKLQljb25zdCBjaGFyICpkZWNpbWFsX3BvaW50ID0gbG9jYWxlX2RhdGEtPmRlY2ltYWxfcG9pbnQ7CisgICAgc3RydWN0IGxjb252ICpsb2NhbGVfZGF0YSA9IGxvY2FsZWNvbnYoKTsKKyAgICBjb25zdCBjaGFyICpkZWNpbWFsX3BvaW50ID0gbG9jYWxlX2RhdGEtPmRlY2ltYWxfcG9pbnQ7CiAKLQlpZiAoZGVjaW1hbF9wb2ludFswXSAhPSAnLicgfHwgZGVjaW1hbF9wb2ludFsxXSAhPSAwKSB7Ci0JCXNpemVfdCBkZWNpbWFsX3BvaW50X2xlbiA9IHN0cmxlbihkZWNpbWFsX3BvaW50KTsKKyAgICBpZiAoZGVjaW1hbF9wb2ludFswXSAhPSAnLicgfHwgZGVjaW1hbF9wb2ludFsxXSAhPSAwKSB7CisgICAgICAgIHNpemVfdCBkZWNpbWFsX3BvaW50X2xlbiA9IHN0cmxlbihkZWNpbWFsX3BvaW50KTsKIAotCQlpZiAoKmJ1ZmZlciA9PSAnKycgfHwgKmJ1ZmZlciA9PSAnLScpCi0JCQlidWZmZXIrKzsKLQkJd2hpbGUgKFB5X0lTRElHSVQoKmJ1ZmZlcikpCi0JCQlidWZmZXIrKzsKLQkJaWYgKHN0cm5jbXAoYnVmZmVyLCBkZWNpbWFsX3BvaW50LCBkZWNpbWFsX3BvaW50X2xlbikgPT0gMCkgewotCQkJKmJ1ZmZlciA9ICcuJzsKLQkJCWJ1ZmZlcisrOwotCQkJaWYgKGRlY2ltYWxfcG9pbnRfbGVuID4gMSkgewotCQkJCS8qIGJ1ZmZlciBuZWVkcyB0byBnZXQgc21hbGxlciAqLwotCQkJCXNpemVfdCByZXN0X2xlbiA9IHN0cmxlbihidWZmZXIgKwotCQkJCQkJICAgICAoZGVjaW1hbF9wb2ludF9sZW4gLSAxKSk7Ci0JCQkJbWVtbW92ZShidWZmZXIsCi0JCQkJCWJ1ZmZlciArIChkZWNpbWFsX3BvaW50X2xlbiAtIDEpLAotCQkJCQlyZXN0X2xlbik7Ci0JCQkJYnVmZmVyW3Jlc3RfbGVuXSA9IDA7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIGlmICgqYnVmZmVyID09ICcrJyB8fCAqYnVmZmVyID09ICctJykKKyAgICAgICAgICAgIGJ1ZmZlcisrOworICAgICAgICB3aGlsZSAoUHlfSVNESUdJVCgqYnVmZmVyKSkKKyAgICAgICAgICAgIGJ1ZmZlcisrOworICAgICAgICBpZiAoc3RybmNtcChidWZmZXIsIGRlY2ltYWxfcG9pbnQsIGRlY2ltYWxfcG9pbnRfbGVuKSA9PSAwKSB7CisgICAgICAgICAgICAqYnVmZmVyID0gJy4nOworICAgICAgICAgICAgYnVmZmVyKys7CisgICAgICAgICAgICBpZiAoZGVjaW1hbF9wb2ludF9sZW4gPiAxKSB7CisgICAgICAgICAgICAgICAgLyogYnVmZmVyIG5lZWRzIHRvIGdldCBzbWFsbGVyICovCisgICAgICAgICAgICAgICAgc2l6ZV90IHJlc3RfbGVuID0gc3RybGVuKGJ1ZmZlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2ltYWxfcG9pbnRfbGVuIC0gMSkpOworICAgICAgICAgICAgICAgIG1lbW1vdmUoYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyAoZGVjaW1hbF9wb2ludF9sZW4gLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgcmVzdF9sZW4pOworICAgICAgICAgICAgICAgIGJ1ZmZlcltyZXN0X2xlbl0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiAKQEAgLTQxMyw2NSArNDEzLDY1IEBACiBQeV9MT0NBTF9JTkxJTkUodm9pZCkKIGVuc3VyZV9taW5pbXVtX2V4cG9uZW50X2xlbmd0aChjaGFyKiBidWZmZXIsIHNpemVfdCBidWZfc2l6ZSkKIHsKLQljaGFyICpwID0gc3RycGJyayhidWZmZXIsICJlRSIpOwotCWlmIChwICYmICgqKHAgKyAxKSA9PSAnLScgfHwgKihwICsgMSkgPT0gJysnKSkgewotCQljaGFyICpzdGFydCA9IHAgKyAyOwotCQlpbnQgZXhwb25lbnRfZGlnaXRfY250ID0gMDsKLQkJaW50IGxlYWRpbmdfemVyb19jbnQgPSAwOwotCQlpbnQgaW5fbGVhZGluZ196ZXJvcyA9IDE7Ci0JCWludCBzaWduaWZpY2FudF9kaWdpdF9jbnQ7CisgICAgY2hhciAqcCA9IHN0cnBicmsoYnVmZmVyLCAiZUUiKTsKKyAgICBpZiAocCAmJiAoKihwICsgMSkgPT0gJy0nIHx8ICoocCArIDEpID09ICcrJykpIHsKKyAgICAgICAgY2hhciAqc3RhcnQgPSBwICsgMjsKKyAgICAgICAgaW50IGV4cG9uZW50X2RpZ2l0X2NudCA9IDA7CisgICAgICAgIGludCBsZWFkaW5nX3plcm9fY250ID0gMDsKKyAgICAgICAgaW50IGluX2xlYWRpbmdfemVyb3MgPSAxOworICAgICAgICBpbnQgc2lnbmlmaWNhbnRfZGlnaXRfY250OwogCi0JCS8qIFNraXAgb3ZlciB0aGUgZXhwb25lbnQgYW5kIHRoZSBzaWduLiAqLwotCQlwICs9IDI7CisgICAgICAgIC8qIFNraXAgb3ZlciB0aGUgZXhwb25lbnQgYW5kIHRoZSBzaWduLiAqLworICAgICAgICBwICs9IDI7CiAKLQkJLyogRmluZCB0aGUgZW5kIG9mIHRoZSBleHBvbmVudCwga2VlcGluZyB0cmFjayBvZiBsZWFkaW5nCi0JCSAgIHplcm9zLiAqLwotCQl3aGlsZSAoKnAgJiYgUHlfSVNESUdJVCgqcCkpIHsKLQkJCWlmIChpbl9sZWFkaW5nX3plcm9zICYmICpwID09ICcwJykKLQkJCQkrK2xlYWRpbmdfemVyb19jbnQ7Ci0JCQlpZiAoKnAgIT0gJzAnKQotCQkJCWluX2xlYWRpbmdfemVyb3MgPSAwOwotCQkJKytwOwotCQkJKytleHBvbmVudF9kaWdpdF9jbnQ7Ci0JCX0KKyAgICAgICAgLyogRmluZCB0aGUgZW5kIG9mIHRoZSBleHBvbmVudCwga2VlcGluZyB0cmFjayBvZiBsZWFkaW5nCisgICAgICAgICAgIHplcm9zLiAqLworICAgICAgICB3aGlsZSAoKnAgJiYgUHlfSVNESUdJVCgqcCkpIHsKKyAgICAgICAgICAgIGlmIChpbl9sZWFkaW5nX3plcm9zICYmICpwID09ICcwJykKKyAgICAgICAgICAgICAgICArK2xlYWRpbmdfemVyb19jbnQ7CisgICAgICAgICAgICBpZiAoKnAgIT0gJzAnKQorICAgICAgICAgICAgICAgIGluX2xlYWRpbmdfemVyb3MgPSAwOworICAgICAgICAgICAgKytwOworICAgICAgICAgICAgKytleHBvbmVudF9kaWdpdF9jbnQ7CisgICAgICAgIH0KIAotCQlzaWduaWZpY2FudF9kaWdpdF9jbnQgPSBleHBvbmVudF9kaWdpdF9jbnQgLSBsZWFkaW5nX3plcm9fY250OwotCQlpZiAoZXhwb25lbnRfZGlnaXRfY250ID09IE1JTl9FWFBPTkVOVF9ESUdJVFMpIHsKLQkJCS8qIElmIHRoZXJlIGFyZSAyIGV4YWN0bHkgZGlnaXRzLCB3ZSdyZSBkb25lLAotCQkJICAgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZXkgY29udGFpbiAqLwotCQl9Ci0JCWVsc2UgaWYgKGV4cG9uZW50X2RpZ2l0X2NudCA+IE1JTl9FWFBPTkVOVF9ESUdJVFMpIHsKLQkJCWludCBleHRyYV96ZXJvc19jbnQ7CisgICAgICAgIHNpZ25pZmljYW50X2RpZ2l0X2NudCA9IGV4cG9uZW50X2RpZ2l0X2NudCAtIGxlYWRpbmdfemVyb19jbnQ7CisgICAgICAgIGlmIChleHBvbmVudF9kaWdpdF9jbnQgPT0gTUlOX0VYUE9ORU5UX0RJR0lUUykgeworICAgICAgICAgICAgLyogSWYgdGhlcmUgYXJlIDIgZXhhY3RseSBkaWdpdHMsIHdlJ3JlIGRvbmUsCisgICAgICAgICAgICAgICByZWdhcmRsZXNzIG9mIHdoYXQgdGhleSBjb250YWluICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXhwb25lbnRfZGlnaXRfY250ID4gTUlOX0VYUE9ORU5UX0RJR0lUUykgeworICAgICAgICAgICAgaW50IGV4dHJhX3plcm9zX2NudDsKIAotCQkJLyogVGhlcmUgYXJlIG1vcmUgdGhhbiAyIGRpZ2l0cyBpbiB0aGUgZXhwb25lbnQuICBTZWUKLQkJCSAgIGlmIHdlIGNhbiBkZWxldGUgc29tZSBvZiB0aGUgbGVhZGluZyB6ZXJvcyAqLwotCQkJaWYgKHNpZ25pZmljYW50X2RpZ2l0X2NudCA8IE1JTl9FWFBPTkVOVF9ESUdJVFMpCi0JCQkJc2lnbmlmaWNhbnRfZGlnaXRfY250ID0gTUlOX0VYUE9ORU5UX0RJR0lUUzsKLQkJCWV4dHJhX3plcm9zX2NudCA9IGV4cG9uZW50X2RpZ2l0X2NudCAtCi0JCQkJc2lnbmlmaWNhbnRfZGlnaXRfY250OworICAgICAgICAgICAgLyogVGhlcmUgYXJlIG1vcmUgdGhhbiAyIGRpZ2l0cyBpbiB0aGUgZXhwb25lbnQuICBTZWUKKyAgICAgICAgICAgICAgIGlmIHdlIGNhbiBkZWxldGUgc29tZSBvZiB0aGUgbGVhZGluZyB6ZXJvcyAqLworICAgICAgICAgICAgaWYgKHNpZ25pZmljYW50X2RpZ2l0X2NudCA8IE1JTl9FWFBPTkVOVF9ESUdJVFMpCisgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnRfZGlnaXRfY250ID0gTUlOX0VYUE9ORU5UX0RJR0lUUzsKKyAgICAgICAgICAgIGV4dHJhX3plcm9zX2NudCA9IGV4cG9uZW50X2RpZ2l0X2NudCAtCisgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnRfZGlnaXRfY250OwogCi0JCQkvKiBEZWxldGUgZXh0cmFfemVyb3NfY250IHdvcnRoIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUKLQkJCSAgIGZyb250IG9mIHRoZSBleHBvbmVudCAqLwotCQkJYXNzZXJ0KGV4dHJhX3plcm9zX2NudCA+PSAwKTsKKyAgICAgICAgICAgIC8qIERlbGV0ZSBleHRyYV96ZXJvc19jbnQgd29ydGggb2YgY2hhcmFjdGVycyBmcm9tIHRoZQorICAgICAgICAgICAgICAgZnJvbnQgb2YgdGhlIGV4cG9uZW50ICovCisgICAgICAgICAgICBhc3NlcnQoZXh0cmFfemVyb3NfY250ID49IDApOwogCi0JCQkvKiBBZGQgb25lIHRvIHNpZ25pZmljYW50X2RpZ2l0X2NudCB0byBjb3B5IHRoZQotCQkJICAgdHJhaWxpbmcgMCBieXRlLCB0aHVzIHNldHRpbmcgdGhlIGxlbmd0aCAqLwotCQkJbWVtbW92ZShzdGFydCwKLQkJCQlzdGFydCArIGV4dHJhX3plcm9zX2NudCwKLQkJCQlzaWduaWZpY2FudF9kaWdpdF9jbnQgKyAxKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIElmIHRoZXJlIGFyZSBmZXdlciB0aGFuIDIgZGlnaXRzLCBhZGQgemVyb3MKLQkJCSAgIHVudGlsIHRoZXJlIGFyZSAyLCBpZiB0aGVyZSdzIGVub3VnaCByb29tICovCi0JCQlpbnQgemVyb3MgPSBNSU5fRVhQT05FTlRfRElHSVRTIC0gZXhwb25lbnRfZGlnaXRfY250OwotCQkJaWYgKHN0YXJ0ICsgemVyb3MgKyBleHBvbmVudF9kaWdpdF9jbnQgKyAxCi0JCQkgICAgICA8IGJ1ZmZlciArIGJ1Zl9zaXplKSB7Ci0JCQkJbWVtbW92ZShzdGFydCArIHplcm9zLCBzdGFydCwKLQkJCQkJZXhwb25lbnRfZGlnaXRfY250ICsgMSk7Ci0JCQkJbWVtc2V0KHN0YXJ0LCAnMCcsIHplcm9zKTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIC8qIEFkZCBvbmUgdG8gc2lnbmlmaWNhbnRfZGlnaXRfY250IHRvIGNvcHkgdGhlCisgICAgICAgICAgICAgICB0cmFpbGluZyAwIGJ5dGUsIHRodXMgc2V0dGluZyB0aGUgbGVuZ3RoICovCisgICAgICAgICAgICBtZW1tb3ZlKHN0YXJ0LAorICAgICAgICAgICAgICAgIHN0YXJ0ICsgZXh0cmFfemVyb3NfY250LAorICAgICAgICAgICAgICAgIHNpZ25pZmljYW50X2RpZ2l0X2NudCArIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogSWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gMiBkaWdpdHMsIGFkZCB6ZXJvcworICAgICAgICAgICAgICAgdW50aWwgdGhlcmUgYXJlIDIsIGlmIHRoZXJlJ3MgZW5vdWdoIHJvb20gKi8KKyAgICAgICAgICAgIGludCB6ZXJvcyA9IE1JTl9FWFBPTkVOVF9ESUdJVFMgLSBleHBvbmVudF9kaWdpdF9jbnQ7CisgICAgICAgICAgICBpZiAoc3RhcnQgKyB6ZXJvcyArIGV4cG9uZW50X2RpZ2l0X2NudCArIDEKKyAgICAgICAgICAgICAgICAgIDwgYnVmZmVyICsgYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKHN0YXJ0ICsgemVyb3MsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBleHBvbmVudF9kaWdpdF9jbnQgKyAxKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoc3RhcnQsICcwJywgemVyb3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiAvKiBSZW1vdmUgdHJhaWxpbmcgemVyb3MgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgZnJvbSBhIG51bWVyaWMgc3RyaW5nOyBhbHNvCkBAIC00ODEsNDAgKzQ4MSw0MCBAQAogUHlfTE9DQUxfSU5MSU5FKHZvaWQpCiByZW1vdmVfdHJhaWxpbmdfemVyb3MoY2hhciAqYnVmZmVyKQogewotCWNoYXIgKm9sZF9mcmFjdGlvbl9lbmQsICpuZXdfZnJhY3Rpb25fZW5kLCAqZW5kLCAqcDsKKyAgICBjaGFyICpvbGRfZnJhY3Rpb25fZW5kLCAqbmV3X2ZyYWN0aW9uX2VuZCwgKmVuZCwgKnA7CiAKLQlwID0gYnVmZmVyOwotCWlmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKQotCQkvKiBTa2lwIGxlYWRpbmcgc2lnbiwgaWYgcHJlc2VudCAqLwotCQkrK3A7Ci0Jd2hpbGUgKFB5X0lTRElHSVQoKnApKQotCQkrK3A7CisgICAgcCA9IGJ1ZmZlcjsKKyAgICBpZiAoKnAgPT0gJy0nIHx8ICpwID09ICcrJykKKyAgICAgICAgLyogU2tpcCBsZWFkaW5nIHNpZ24sIGlmIHByZXNlbnQgKi8KKyAgICAgICAgKytwOworICAgIHdoaWxlIChQeV9JU0RJR0lUKCpwKSkKKyAgICAgICAgKytwOwogCi0JLyogaWYgdGhlcmUncyBubyBkZWNpbWFsIHBvaW50IHRoZXJlJ3Mgbm90aGluZyB0byBkbyAqLwotCWlmICgqcCsrICE9ICcuJykKLQkJcmV0dXJuOworICAgIC8qIGlmIHRoZXJlJ3Mgbm8gZGVjaW1hbCBwb2ludCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gKi8KKyAgICBpZiAoKnArKyAhPSAnLicpCisgICAgICAgIHJldHVybjsKIAotCS8qIHNjYW4gYW55IGRpZ2l0cyBhZnRlciB0aGUgcG9pbnQgKi8KLQl3aGlsZSAoUHlfSVNESUdJVCgqcCkpCi0JCSsrcDsKLQlvbGRfZnJhY3Rpb25fZW5kID0gcDsKKyAgICAvKiBzY2FuIGFueSBkaWdpdHMgYWZ0ZXIgdGhlIHBvaW50ICovCisgICAgd2hpbGUgKFB5X0lTRElHSVQoKnApKQorICAgICAgICArK3A7CisgICAgb2xkX2ZyYWN0aW9uX2VuZCA9IHA7CiAKLQkvKiBzY2FuIHVwIHRvIGVuZGluZyAnXDAnICovCi0Jd2hpbGUgKCpwICE9ICdcMCcpCi0JCXArKzsKLQkvKiArMSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBtb3ZlIHRoZSBudWxsIGJ5dGUgYXMgd2VsbCAqLwotCWVuZCA9IHArMTsKKyAgICAvKiBzY2FuIHVwIHRvIGVuZGluZyAnXDAnICovCisgICAgd2hpbGUgKCpwICE9ICdcMCcpCisgICAgICAgIHArKzsKKyAgICAvKiArMSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBtb3ZlIHRoZSBudWxsIGJ5dGUgYXMgd2VsbCAqLworICAgIGVuZCA9IHArMTsKIAotCS8qIHNjYW4gYmFjayBmcm9tIGZyYWN0aW9uX2VuZCwgbG9va2luZyBmb3IgcmVtb3ZhYmxlIHplcm9zICovCi0JcCA9IG9sZF9mcmFjdGlvbl9lbmQ7Ci0Jd2hpbGUgKCoocC0xKSA9PSAnMCcpCi0JCS0tcDsKLQkvKiBhbmQgcmVtb3ZlIHBvaW50IGlmIHdlJ3ZlIGdvdCB0aGF0IGZhciAqLwotCWlmICgqKHAtMSkgPT0gJy4nKQotCQktLXA7Ci0JbmV3X2ZyYWN0aW9uX2VuZCA9IHA7CisgICAgLyogc2NhbiBiYWNrIGZyb20gZnJhY3Rpb25fZW5kLCBsb29raW5nIGZvciByZW1vdmFibGUgemVyb3MgKi8KKyAgICBwID0gb2xkX2ZyYWN0aW9uX2VuZDsKKyAgICB3aGlsZSAoKihwLTEpID09ICcwJykKKyAgICAgICAgLS1wOworICAgIC8qIGFuZCByZW1vdmUgcG9pbnQgaWYgd2UndmUgZ290IHRoYXQgZmFyICovCisgICAgaWYgKCoocC0xKSA9PSAnLicpCisgICAgICAgIC0tcDsKKyAgICBuZXdfZnJhY3Rpb25fZW5kID0gcDsKIAotCW1lbW1vdmUobmV3X2ZyYWN0aW9uX2VuZCwgb2xkX2ZyYWN0aW9uX2VuZCwgZW5kLW9sZF9mcmFjdGlvbl9lbmQpOworICAgIG1lbW1vdmUobmV3X2ZyYWN0aW9uX2VuZCwgb2xkX2ZyYWN0aW9uX2VuZCwgZW5kLW9sZF9mcmFjdGlvbl9lbmQpOwogfQogCiAvKiBFbnN1cmUgdGhhdCBidWZmZXIgaGFzIGEgZGVjaW1hbCBwb2ludCBpbiBpdC4gIFRoZSBkZWNpbWFsIHBvaW50IHdpbGwgbm90CkBAIC01MjcsOTEgKzUyNyw5MSBAQAogUHlfTE9DQUxfSU5MSU5FKGNoYXIgKikKIGVuc3VyZV9kZWNpbWFsX3BvaW50KGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGJ1Zl9zaXplLCBpbnQgcHJlY2lzaW9uKQogewotCWludCBkaWdpdF9jb3VudCwgaW5zZXJ0X2NvdW50ID0gMCwgY29udmVydF90b19leHAgPSAwOwotCWNoYXIgKmNoYXJzX3RvX2luc2VydCwgKmRpZ2l0c19zdGFydDsKKyAgICBpbnQgZGlnaXRfY291bnQsIGluc2VydF9jb3VudCA9IDAsIGNvbnZlcnRfdG9fZXhwID0gMDsKKyAgICBjaGFyICpjaGFyc190b19pbnNlcnQsICpkaWdpdHNfc3RhcnQ7CiAKLQkvKiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBub24tZGlnaXQgY2hhcmFjdGVyICovCi0JY2hhciAqcCA9IGJ1ZmZlcjsKLQlpZiAoKnAgPT0gJy0nIHx8ICpwID09ICcrJykKLQkJLyogU2tpcCBsZWFkaW5nIHNpZ24sIGlmIHByZXNlbnQuICBJIHRoaW5rIHRoaXMgY291bGQgb25seQotCQkgICBldmVyIGJlICctJywgYnV0IGl0IGNhbid0IGh1cnQgdG8gY2hlY2sgZm9yIGJvdGguICovCi0JCSsrcDsKLQlkaWdpdHNfc3RhcnQgPSBwOwotCXdoaWxlICgqcCAmJiBQeV9JU0RJR0lUKCpwKSkKLQkJKytwOwotCWRpZ2l0X2NvdW50ID0gUHlfU0FGRV9ET1dOQ0FTVChwIC0gZGlnaXRzX3N0YXJ0LCBQeV9zc2l6ZV90LCBpbnQpOworICAgIC8qIHNlYXJjaCBmb3IgdGhlIGZpcnN0IG5vbi1kaWdpdCBjaGFyYWN0ZXIgKi8KKyAgICBjaGFyICpwID0gYnVmZmVyOworICAgIGlmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKQorICAgICAgICAvKiBTa2lwIGxlYWRpbmcgc2lnbiwgaWYgcHJlc2VudC4gIEkgdGhpbmsgdGhpcyBjb3VsZCBvbmx5CisgICAgICAgICAgIGV2ZXIgYmUgJy0nLCBidXQgaXQgY2FuJ3QgaHVydCB0byBjaGVjayBmb3IgYm90aC4gKi8KKyAgICAgICAgKytwOworICAgIGRpZ2l0c19zdGFydCA9IHA7CisgICAgd2hpbGUgKCpwICYmIFB5X0lTRElHSVQoKnApKQorICAgICAgICArK3A7CisgICAgZGlnaXRfY291bnQgPSBQeV9TQUZFX0RPV05DQVNUKHAgLSBkaWdpdHNfc3RhcnQsIFB5X3NzaXplX3QsIGludCk7CiAKLQlpZiAoKnAgPT0gJy4nKSB7Ci0JCWlmIChQeV9JU0RJR0lUKCoocCsxKSkpIHsKLQkJCS8qIE5vdGhpbmcgdG8gZG8sIHdlIGFscmVhZHkgaGF2ZSBhIGRlY2ltYWwKLQkJCSAgIHBvaW50IGFuZCBhIGRpZ2l0IGFmdGVyIGl0ICovCi0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBXZSBoYXZlIGEgZGVjaW1hbCBwb2ludCwgYnV0IG5vIGZvbGxvd2luZwotCQkJICAgZGlnaXQuICBJbnNlcnQgYSB6ZXJvIGFmdGVyIHRoZSBkZWNpbWFsLiAqLwotCQkJLyogY2FuJ3QgZXZlciBnZXQgaGVyZSB2aWEgUHlPU19kb3VibGVfdG9fc3RyaW5nICovCi0JCQlhc3NlcnQocHJlY2lzaW9uID09IC0xKTsKLQkJCSsrcDsKLQkJCWNoYXJzX3RvX2luc2VydCA9ICIwIjsKLQkJCWluc2VydF9jb3VudCA9IDE7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoISgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKSkgewotCQkvKiBEb24ndCBhZGQgIi4wIiBpZiB3ZSBoYXZlIGFuIGV4cG9uZW50LiAqLwotCQlpZiAoZGlnaXRfY291bnQgPT0gcHJlY2lzaW9uKSB7Ci0JCQkvKiBpc3N1ZSA1ODY0OiBkb24ndCBhZGQgYSB0cmFpbGluZyAuMCBpbiB0aGUgY2FzZQotCQkJICAgd2hlcmUgdGhlICclZyctZm9ybWF0dGVkIHJlc3VsdCBhbHJlYWR5IGhhcyBhcyBtYW55Ci0JCQkgICBzaWduaWZpY2FudCBkaWdpdHMgYXMgd2VyZSByZXF1ZXN0ZWQuICBTd2l0Y2ggdG8KLQkJCSAgIGV4cG9uZW50aWFsIG5vdGF0aW9uIGluc3RlYWQuICovCi0JCQljb252ZXJ0X3RvX2V4cCA9IDE7Ci0JCQkvKiBubyBleHBvbmVudCwgbm8gcG9pbnQsIGFuZCB3ZSBzaG91bGRuJ3QgbGFuZCBoZXJlCi0JCQkgICBmb3IgaW5mcyBhbmQgbmFucywgc28gd2UgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZQotCQkJICAgc3RyaW5nLiAqLwotCQkJYXNzZXJ0KCpwID09ICdcMCcpOwotCQl9Ci0JCWVsc2UgewotCQkJYXNzZXJ0KHByZWNpc2lvbiA9PSAtMSB8fCBkaWdpdF9jb3VudCA8IHByZWNpc2lvbik7Ci0JCQljaGFyc190b19pbnNlcnQgPSAiLjAiOwotCQkJaW5zZXJ0X2NvdW50ID0gMjsKLQkJfQotCX0KLQlpZiAoaW5zZXJ0X2NvdW50KSB7Ci0JCXNpemVfdCBidWZfbGVuID0gc3RybGVuKGJ1ZmZlcik7Ci0JCWlmIChidWZfbGVuICsgaW5zZXJ0X2NvdW50ICsgMSA+PSBidWZfc2l6ZSkgewotCQkJLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGluIHRoZSBidWZmZXIKLQkJCSAgIGZvciB0aGUgYWRkaXRpb25hbCB0ZXh0LCBqdXN0IHNraXAgaXQuICBJdCdzCi0JCQkgICBub3Qgd29ydGggZ2VuZXJhdGluZyBhbiBlcnJvciBvdmVyLiAqLwotCQl9Ci0JCWVsc2UgewotCQkJbWVtbW92ZShwICsgaW5zZXJ0X2NvdW50LCBwLAotCQkJCWJ1ZmZlciArIHN0cmxlbihidWZmZXIpIC0gcCArIDEpOwotCQkJbWVtY3B5KHAsIGNoYXJzX3RvX2luc2VydCwgaW5zZXJ0X2NvdW50KTsKLQkJfQotCX0KLQlpZiAoY29udmVydF90b19leHApIHsKLQkJaW50IHdyaXR0ZW47Ci0JCXNpemVfdCBidWZfYXZhaWw7Ci0JCXAgPSBkaWdpdHNfc3RhcnQ7Ci0JCS8qIGluc2VydCBkZWNpbWFsIHBvaW50ICovCi0JCWFzc2VydChkaWdpdF9jb3VudCA+PSAxKTsKLQkJbWVtbW92ZShwKzIsIHArMSwgZGlnaXRfY291bnQpOyAvKiBzYWZlLCBidXQgb3ZlcndyaXRlcyBudWwgKi8KLQkJcFsxXSA9ICcuJzsKLQkJcCArPSBkaWdpdF9jb3VudCsxOwotCQlhc3NlcnQocCA8PSBidWZfc2l6ZStidWZmZXIpOwotCQlidWZfYXZhaWwgPSBidWZfc2l6ZStidWZmZXItcDsKLQkJaWYgKGJ1Zl9hdmFpbCA9PSAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCS8qIEFkZCBleHBvbmVudC4gIEl0J3Mgb2theSB0byB1c2UgbG93ZXIgY2FzZSAnZSc6IHdlIG9ubHkKLQkJICAgYXJyaXZlIGhlcmUgYXMgYSByZXN1bHQgb2YgdXNpbmcgdGhlIGVtcHR5IGZvcm1hdCBjb2RlIG9yCi0JCSAgIHJlcHIvc3RyIGJ1aWx0aW5zIGFuZCB0aG9zZSBuZXZlciB3YW50IGFuIHVwcGVyIGNhc2UgJ0UnICovCi0JCXdyaXR0ZW4gPSBQeU9TX3NucHJpbnRmKHAsIGJ1Zl9hdmFpbCwgImUlKy4wMmQiLCBkaWdpdF9jb3VudC0xKTsKLQkJaWYgKCEoMCA8PSB3cml0dGVuICYmCi0JCSAgICAgIHdyaXR0ZW4gPCBQeV9TQUZFX0RPV05DQVNUKGJ1Zl9hdmFpbCwgc2l6ZV90LCBpbnQpKSkKLQkJCS8qIG91dHB1dCB0cnVuY2F0ZWQsIG9yIHNvbWV0aGluZyBlbHNlIGJhZCBoYXBwZW5lZCAqLwotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlbW92ZV90cmFpbGluZ196ZXJvcyhidWZmZXIpOwotCX0KLQlyZXR1cm4gYnVmZmVyOworICAgIGlmICgqcCA9PSAnLicpIHsKKyAgICAgICAgaWYgKFB5X0lTRElHSVQoKihwKzEpKSkgeworICAgICAgICAgICAgLyogTm90aGluZyB0byBkbywgd2UgYWxyZWFkeSBoYXZlIGEgZGVjaW1hbAorICAgICAgICAgICAgICAgcG9pbnQgYW5kIGEgZGlnaXQgYWZ0ZXIgaXQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIFdlIGhhdmUgYSBkZWNpbWFsIHBvaW50LCBidXQgbm8gZm9sbG93aW5nCisgICAgICAgICAgICAgICBkaWdpdC4gIEluc2VydCBhIHplcm8gYWZ0ZXIgdGhlIGRlY2ltYWwuICovCisgICAgICAgICAgICAvKiBjYW4ndCBldmVyIGdldCBoZXJlIHZpYSBQeU9TX2RvdWJsZV90b19zdHJpbmcgKi8KKyAgICAgICAgICAgIGFzc2VydChwcmVjaXNpb24gPT0gLTEpOworICAgICAgICAgICAgKytwOworICAgICAgICAgICAgY2hhcnNfdG9faW5zZXJ0ID0gIjAiOworICAgICAgICAgICAgaW5zZXJ0X2NvdW50ID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghKCpwID09ICdlJyB8fCAqcCA9PSAnRScpKSB7CisgICAgICAgIC8qIERvbid0IGFkZCAiLjAiIGlmIHdlIGhhdmUgYW4gZXhwb25lbnQuICovCisgICAgICAgIGlmIChkaWdpdF9jb3VudCA9PSBwcmVjaXNpb24pIHsKKyAgICAgICAgICAgIC8qIGlzc3VlIDU4NjQ6IGRvbid0IGFkZCBhIHRyYWlsaW5nIC4wIGluIHRoZSBjYXNlCisgICAgICAgICAgICAgICB3aGVyZSB0aGUgJyVnJy1mb3JtYXR0ZWQgcmVzdWx0IGFscmVhZHkgaGFzIGFzIG1hbnkKKyAgICAgICAgICAgICAgIHNpZ25pZmljYW50IGRpZ2l0cyBhcyB3ZXJlIHJlcXVlc3RlZC4gIFN3aXRjaCB0bworICAgICAgICAgICAgICAgZXhwb25lbnRpYWwgbm90YXRpb24gaW5zdGVhZC4gKi8KKyAgICAgICAgICAgIGNvbnZlcnRfdG9fZXhwID0gMTsKKyAgICAgICAgICAgIC8qIG5vIGV4cG9uZW50LCBubyBwb2ludCwgYW5kIHdlIHNob3VsZG4ndCBsYW5kIGhlcmUKKyAgICAgICAgICAgICAgIGZvciBpbmZzIGFuZCBuYW5zLCBzbyB3ZSBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAgICAgICBzdHJpbmcuICovCisgICAgICAgICAgICBhc3NlcnQoKnAgPT0gJ1wwJyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQocHJlY2lzaW9uID09IC0xIHx8IGRpZ2l0X2NvdW50IDwgcHJlY2lzaW9uKTsKKyAgICAgICAgICAgIGNoYXJzX3RvX2luc2VydCA9ICIuMCI7CisgICAgICAgICAgICBpbnNlcnRfY291bnQgPSAyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbnNlcnRfY291bnQpIHsKKyAgICAgICAgc2l6ZV90IGJ1Zl9sZW4gPSBzdHJsZW4oYnVmZmVyKTsKKyAgICAgICAgaWYgKGJ1Zl9sZW4gKyBpbnNlcnRfY291bnQgKyAxID49IGJ1Zl9zaXplKSB7CisgICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgZm9yIHRoZSBhZGRpdGlvbmFsIHRleHQsIGp1c3Qgc2tpcCBpdC4gIEl0J3MKKyAgICAgICAgICAgICAgIG5vdCB3b3J0aCBnZW5lcmF0aW5nIGFuIGVycm9yIG92ZXIuICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtZW1tb3ZlKHAgKyBpbnNlcnRfY291bnQsIHAsCisgICAgICAgICAgICAgICAgYnVmZmVyICsgc3RybGVuKGJ1ZmZlcikgLSBwICsgMSk7CisgICAgICAgICAgICBtZW1jcHkocCwgY2hhcnNfdG9faW5zZXJ0LCBpbnNlcnRfY291bnQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb252ZXJ0X3RvX2V4cCkgeworICAgICAgICBpbnQgd3JpdHRlbjsKKyAgICAgICAgc2l6ZV90IGJ1Zl9hdmFpbDsKKyAgICAgICAgcCA9IGRpZ2l0c19zdGFydDsKKyAgICAgICAgLyogaW5zZXJ0IGRlY2ltYWwgcG9pbnQgKi8KKyAgICAgICAgYXNzZXJ0KGRpZ2l0X2NvdW50ID49IDEpOworICAgICAgICBtZW1tb3ZlKHArMiwgcCsxLCBkaWdpdF9jb3VudCk7IC8qIHNhZmUsIGJ1dCBvdmVyd3JpdGVzIG51bCAqLworICAgICAgICBwWzFdID0gJy4nOworICAgICAgICBwICs9IGRpZ2l0X2NvdW50KzE7CisgICAgICAgIGFzc2VydChwIDw9IGJ1Zl9zaXplK2J1ZmZlcik7CisgICAgICAgIGJ1Zl9hdmFpbCA9IGJ1Zl9zaXplK2J1ZmZlci1wOworICAgICAgICBpZiAoYnVmX2F2YWlsID09IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgLyogQWRkIGV4cG9uZW50LiAgSXQncyBva2F5IHRvIHVzZSBsb3dlciBjYXNlICdlJzogd2Ugb25seQorICAgICAgICAgICBhcnJpdmUgaGVyZSBhcyBhIHJlc3VsdCBvZiB1c2luZyB0aGUgZW1wdHkgZm9ybWF0IGNvZGUgb3IKKyAgICAgICAgICAgcmVwci9zdHIgYnVpbHRpbnMgYW5kIHRob3NlIG5ldmVyIHdhbnQgYW4gdXBwZXIgY2FzZSAnRScgKi8KKyAgICAgICAgd3JpdHRlbiA9IFB5T1Nfc25wcmludGYocCwgYnVmX2F2YWlsLCAiZSUrLjAyZCIsIGRpZ2l0X2NvdW50LTEpOworICAgICAgICBpZiAoISgwIDw9IHdyaXR0ZW4gJiYKKyAgICAgICAgICAgICAgd3JpdHRlbiA8IFB5X1NBRkVfRE9XTkNBU1QoYnVmX2F2YWlsLCBzaXplX3QsIGludCkpKQorICAgICAgICAgICAgLyogb3V0cHV0IHRydW5jYXRlZCwgb3Igc29tZXRoaW5nIGVsc2UgYmFkIGhhcHBlbmVkICovCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVtb3ZlX3RyYWlsaW5nX3plcm9zKGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBidWZmZXI7CiB9CiAKIC8qIHNlZSBGT1JNQVRCVUZMRU4gaW4gdW5pY29kZW9iamVjdC5jICovCkBAIC02MjIsMTQgKzYyMiwxNCBAQAogICogQGJ1ZmZlcjogQSBidWZmZXIgdG8gcGxhY2UgdGhlIHJlc3VsdGluZyBzdHJpbmcgaW4KICAqIEBidWZfc2l6ZTogVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLgogICogQGZvcm1hdDogVGhlIHByaW50ZigpLXN0eWxlIGZvcm1hdCB0byB1c2UgZm9yIHRoZQotICogICAgICAgICAgY29kZSB0byB1c2UgZm9yIGNvbnZlcnRpbmcuIAorICogICAgICAgICAgY29kZSB0byB1c2UgZm9yIGNvbnZlcnRpbmcuCiAgKiBAZDogVGhlICNnZG91YmxlIHRvIGNvbnZlcnQKICAqCiAgKiBDb252ZXJ0cyBhICNnZG91YmxlIHRvIGEgc3RyaW5nLCB1c2luZyB0aGUgJy4nIGFzCiAgKiBkZWNpbWFsIHBvaW50LiBUbyBmb3JtYXQgdGhlIG51bWJlciB5b3UgcGFzcyBpbgogICogYSBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nLiBBbGxvd2VkIGNvbnZlcnNpb24KICAqIHNwZWNpZmllcnMgYXJlICdlJywgJ0UnLCAnZicsICdGJywgJ2cnLCAnRycsIGFuZCAnWicuCi0gKiAKKyAqCiAgKiAnWicgaXMgdGhlIHNhbWUgYXMgJ2cnLCBleGNlcHQgaXQgYWx3YXlzIGhhcyBhIGRlY2ltYWwgYW5kCiAgKiAgICAgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIHRoZSBkZWNpbWFsLgogICoKQEAgLTYzNyw5NyArNjM3LDk3IEBACiAgKiBPbiBmYWlsdXJlIHJldHVybnMgTlVMTCBidXQgZG9lcyBub3Qgc2V0IGFueSBQeXRob24gZXhjZXB0aW9uLgogICoqLwogY2hhciAqCi1fUHlPU19hc2NpaV9mb3JtYXRkKGNoYXIgICAgICAgKmJ1ZmZlciwgCi0JCSAgIHNpemVfdCAgICAgIGJ1Zl9zaXplLCAKLQkJICAgY29uc3QgY2hhciAqZm9ybWF0LCAKLQkJICAgZG91YmxlICAgICAgZCwgCi0JCSAgIGludCAgICAgICAgIHByZWNpc2lvbikKK19QeU9TX2FzY2lpX2Zvcm1hdGQoY2hhciAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgIGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICBkLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHByZWNpc2lvbikKIHsKLQljaGFyIGZvcm1hdF9jaGFyOwotCXNpemVfdCBmb3JtYXRfbGVuID0gc3RybGVuKGZvcm1hdCk7CisgICAgY2hhciBmb3JtYXRfY2hhcjsKKyAgICBzaXplX3QgZm9ybWF0X2xlbiA9IHN0cmxlbihmb3JtYXQpOwogCi0JLyogSXNzdWUgMjI2NDogY29kZSAnWicgcmVxdWlyZXMgY29weWluZyB0aGUgZm9ybWF0LiAgJ1onIGlzICdnJywgYnV0Ci0JICAgYWxzbyB3aXRoIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgcGFzdCB0aGUgZGVjaW1hbC4gKi8KLQljaGFyIHRtcF9mb3JtYXRbRkxPQVRfRk9STUFUQlVGTEVOXTsKKyAgICAvKiBJc3N1ZSAyMjY0OiBjb2RlICdaJyByZXF1aXJlcyBjb3B5aW5nIHRoZSBmb3JtYXQuICAnWicgaXMgJ2cnLCBidXQKKyAgICAgICBhbHNvIHdpdGggYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBwYXN0IHRoZSBkZWNpbWFsLiAqLworICAgIGNoYXIgdG1wX2Zvcm1hdFtGTE9BVF9GT1JNQVRCVUZMRU5dOwogCi0JLyogVGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBmb3JtYXQgc3RyaW5nIG11c3QgYmUgdGhlIGZvcm1hdCBjaGFyICovCi0JZm9ybWF0X2NoYXIgPSBmb3JtYXRbZm9ybWF0X2xlbiAtIDFdOworICAgIC8qIFRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgZm9ybWF0IHN0cmluZyBtdXN0IGJlIHRoZSBmb3JtYXQgY2hhciAqLworICAgIGZvcm1hdF9jaGFyID0gZm9ybWF0W2Zvcm1hdF9sZW4gLSAxXTsKIAotCWlmIChmb3JtYXRbMF0gIT0gJyUnKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZm9ybWF0WzBdICE9ICclJykKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBJJ20gbm90IHN1cmUgd2h5IHRoaXMgdGVzdCBpcyBoZXJlLiAgSXQncyBlbnN1cmluZyB0aGF0IHRoZSBmb3JtYXQKLQkgICBzdHJpbmcgYWZ0ZXIgdGhlIGZpcnN0IGNoYXJhY3RlciBkb2Vzbid0IGhhdmUgYSBzaW5nbGUgcXVvdGUsIGEKLQkgICBsb3dlcmNhc2UgbCwgb3IgYSBwZXJjZW50LiBUaGlzIGlzIHRoZSByZXZlcnNlIG9mIHRoZSBjb21tZW50ZWQtb3V0Ci0JICAgdGVzdCBhYm91dCAxMCBsaW5lcyBhZ28uICovCi0JaWYgKHN0cnBicmsoZm9ybWF0ICsgMSwgIidsJSIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBJJ20gbm90IHN1cmUgd2h5IHRoaXMgdGVzdCBpcyBoZXJlLiAgSXQncyBlbnN1cmluZyB0aGF0IHRoZSBmb3JtYXQKKyAgICAgICBzdHJpbmcgYWZ0ZXIgdGhlIGZpcnN0IGNoYXJhY3RlciBkb2Vzbid0IGhhdmUgYSBzaW5nbGUgcXVvdGUsIGEKKyAgICAgICBsb3dlcmNhc2UgbCwgb3IgYSBwZXJjZW50LiBUaGlzIGlzIHRoZSByZXZlcnNlIG9mIHRoZSBjb21tZW50ZWQtb3V0CisgICAgICAgdGVzdCBhYm91dCAxMCBsaW5lcyBhZ28uICovCisgICAgaWYgKHN0cnBicmsoZm9ybWF0ICsgMSwgIidsJSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEFsc28gY3VyaW91cyBhYm91dCB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgaXQgYWNjZXB0cyBmb3JtYXQgc3RyaW5ncwotCSAgIGxpa2UgIiV4ZyIsIHdoaWNoIGFyZSBpbnZhbGlkIGZvciBmbG9hdHMuICBJbiBnZW5lcmFsLCB0aGUKLQkgICBpbnRlcmZhY2UgdG8gdGhpcyBmdW5jdGlvbiBpcyBub3QgdmVyeSBnb29kLCBidXQgY2hhbmdpbmcgaXQgaXMKLQkgICBkaWZmaWN1bHQgYmVjYXVzZSBpdCdzIGEgcHVibGljIEFQSS4gKi8KKyAgICAvKiBBbHNvIGN1cmlvdXMgYWJvdXQgdGhpcyBmdW5jdGlvbiBpcyB0aGF0IGl0IGFjY2VwdHMgZm9ybWF0IHN0cmluZ3MKKyAgICAgICBsaWtlICIleGciLCB3aGljaCBhcmUgaW52YWxpZCBmb3IgZmxvYXRzLiAgSW4gZ2VuZXJhbCwgdGhlCisgICAgICAgaW50ZXJmYWNlIHRvIHRoaXMgZnVuY3Rpb24gaXMgbm90IHZlcnkgZ29vZCwgYnV0IGNoYW5naW5nIGl0IGlzCisgICAgICAgZGlmZmljdWx0IGJlY2F1c2UgaXQncyBhIHB1YmxpYyBBUEkuICovCiAKLQlpZiAoIShmb3JtYXRfY2hhciA9PSAnZScgfHwgZm9ybWF0X2NoYXIgPT0gJ0UnIHx8IAotCSAgICAgIGZvcm1hdF9jaGFyID09ICdmJyB8fCBmb3JtYXRfY2hhciA9PSAnRicgfHwgCi0JICAgICAgZm9ybWF0X2NoYXIgPT0gJ2cnIHx8IGZvcm1hdF9jaGFyID09ICdHJyB8fAotCSAgICAgIGZvcm1hdF9jaGFyID09ICdaJykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghKGZvcm1hdF9jaGFyID09ICdlJyB8fCBmb3JtYXRfY2hhciA9PSAnRScgfHwKKyAgICAgICAgICBmb3JtYXRfY2hhciA9PSAnZicgfHwgZm9ybWF0X2NoYXIgPT0gJ0YnIHx8CisgICAgICAgICAgZm9ybWF0X2NoYXIgPT0gJ2cnIHx8IGZvcm1hdF9jaGFyID09ICdHJyB8fAorICAgICAgICAgIGZvcm1hdF9jaGFyID09ICdaJykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogTWFwICdaJyBmb3JtYXRfY2hhciB0byAnZycsIGJ5IGNvcHlpbmcgdGhlIGZvcm1hdCBzdHJpbmcgYW5kCi0JICAgcmVwbGFjaW5nIHRoZSBmaW5hbCBjaGFyIHdpdGggYSAnZycgKi8KLQlpZiAoZm9ybWF0X2NoYXIgPT0gJ1onKSB7Ci0JCWlmIChmb3JtYXRfbGVuICsgMSA+PSBzaXplb2YodG1wX2Zvcm1hdCkpIHsKLQkJCS8qIFRoZSBmb3JtYXQgd29uJ3QgZml0IGluIG91ciBjb3B5LiAgRXJyb3Igb3V0LiAgSW4KLQkJCSAgIHByYWN0aWNlLCB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGFuZCB3aWxsIGJlCi0JCQkgICBkZXRlY3RlZCBieSByZXR1cm5pbmcgTlVMTCAqLwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3RyY3B5KHRtcF9mb3JtYXQsIGZvcm1hdCk7Ci0JCXRtcF9mb3JtYXRbZm9ybWF0X2xlbiAtIDFdID0gJ2cnOwotCQlmb3JtYXQgPSB0bXBfZm9ybWF0OwotCX0KKyAgICAvKiBNYXAgJ1onIGZvcm1hdF9jaGFyIHRvICdnJywgYnkgY29weWluZyB0aGUgZm9ybWF0IHN0cmluZyBhbmQKKyAgICAgICByZXBsYWNpbmcgdGhlIGZpbmFsIGNoYXIgd2l0aCBhICdnJyAqLworICAgIGlmIChmb3JtYXRfY2hhciA9PSAnWicpIHsKKyAgICAgICAgaWYgKGZvcm1hdF9sZW4gKyAxID49IHNpemVvZih0bXBfZm9ybWF0KSkgeworICAgICAgICAgICAgLyogVGhlIGZvcm1hdCB3b24ndCBmaXQgaW4gb3VyIGNvcHkuICBFcnJvciBvdXQuICBJbgorICAgICAgICAgICAgICAgcHJhY3RpY2UsIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gYW5kIHdpbGwgYmUKKyAgICAgICAgICAgICAgIGRldGVjdGVkIGJ5IHJldHVybmluZyBOVUxMICovCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkodG1wX2Zvcm1hdCwgZm9ybWF0KTsKKyAgICAgICAgdG1wX2Zvcm1hdFtmb3JtYXRfbGVuIC0gMV0gPSAnZyc7CisgICAgICAgIGZvcm1hdCA9IHRtcF9mb3JtYXQ7CisgICAgfQogCiAKLQkvKiBIYXZlIFB5T1Nfc25wcmludGYgZG8gdGhlIGhhcmQgd29yayAqLwotCVB5T1Nfc25wcmludGYoYnVmZmVyLCBidWZfc2l6ZSwgZm9ybWF0LCBkKTsKKyAgICAvKiBIYXZlIFB5T1Nfc25wcmludGYgZG8gdGhlIGhhcmQgd29yayAqLworICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBidWZfc2l6ZSwgZm9ybWF0LCBkKTsKIAotCS8qIERvIHZhcmlvdXMgZml4dXBzIG9uIHRoZSByZXR1cm4gc3RyaW5nICovCisgICAgLyogRG8gdmFyaW91cyBmaXh1cHMgb24gdGhlIHJldHVybiBzdHJpbmcgKi8KIAotCS8qIEdldCB0aGUgY3VycmVudCBsb2NhbGUsIGFuZCBmaW5kIHRoZSBkZWNpbWFsIHBvaW50IHN0cmluZy4KLQkgICBDb252ZXJ0IHRoYXQgc3RyaW5nIGJhY2sgdG8gYSBkb3QuICovCi0JY2hhbmdlX2RlY2ltYWxfZnJvbV9sb2NhbGVfdG9fZG90KGJ1ZmZlcik7CisgICAgLyogR2V0IHRoZSBjdXJyZW50IGxvY2FsZSwgYW5kIGZpbmQgdGhlIGRlY2ltYWwgcG9pbnQgc3RyaW5nLgorICAgICAgIENvbnZlcnQgdGhhdCBzdHJpbmcgYmFjayB0byBhIGRvdC4gKi8KKyAgICBjaGFuZ2VfZGVjaW1hbF9mcm9tX2xvY2FsZV90b19kb3QoYnVmZmVyKTsKIAotCS8qIElmIGFuIGV4cG9uZW50IGV4aXN0cywgZW5zdXJlIHRoYXQgdGhlIGV4cG9uZW50IGlzIGF0IGxlYXN0Ci0JICAgTUlOX0VYUE9ORU5UX0RJR0lUUyBkaWdpdHMsIHByb3ZpZGluZyB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaAotCSAgIGZvciB0aGUgZXh0cmEgemVyb3MuICBBbHNvLCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuCi0JICAgTUlOX0VYUE9ORU5UX0RJR0lUUywgcmVtb3ZlIGFzIG1hbnkgemVyb3MgYXMgcG9zc2libGUgdW50aWwgd2UgZ2V0Ci0JICAgYmFjayB0byBNSU5fRVhQT05FTlRfRElHSVRTICovCi0JZW5zdXJlX21pbmltdW1fZXhwb25lbnRfbGVuZ3RoKGJ1ZmZlciwgYnVmX3NpemUpOworICAgIC8qIElmIGFuIGV4cG9uZW50IGV4aXN0cywgZW5zdXJlIHRoYXQgdGhlIGV4cG9uZW50IGlzIGF0IGxlYXN0CisgICAgICAgTUlOX0VYUE9ORU5UX0RJR0lUUyBkaWdpdHMsIHByb3ZpZGluZyB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaAorICAgICAgIGZvciB0aGUgZXh0cmEgemVyb3MuICBBbHNvLCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuCisgICAgICAgTUlOX0VYUE9ORU5UX0RJR0lUUywgcmVtb3ZlIGFzIG1hbnkgemVyb3MgYXMgcG9zc2libGUgdW50aWwgd2UgZ2V0CisgICAgICAgYmFjayB0byBNSU5fRVhQT05FTlRfRElHSVRTICovCisgICAgZW5zdXJlX21pbmltdW1fZXhwb25lbnRfbGVuZ3RoKGJ1ZmZlciwgYnVmX3NpemUpOwogCi0JLyogSWYgZm9ybWF0X2NoYXIgaXMgJ1onLCBtYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyCi0JICAgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgKGFuZCBtYWtlIHN1cmUgd2UgaGF2ZSBhIGRlY2ltYWwgcG9pbnQpOwotCSAgIGFsc28gc3dpdGNoIHRvIGV4cG9uZW50aWFsIG5vdGF0aW9uIGluIHNvbWUgZWRnZSBjYXNlcyB3aGVyZSB0aGUKLQkgICBleHRyYSBjaGFyYWN0ZXIgd291bGQgcHJvZHVjZSBtb3JlIHNpZ25pZmljYW50IGRpZ2l0cyB0aGF0IHdlCi0JICAgcmVhbGx5IHdhbnQuICovCi0JaWYgKGZvcm1hdF9jaGFyID09ICdaJykKLQkJYnVmZmVyID0gZW5zdXJlX2RlY2ltYWxfcG9pbnQoYnVmZmVyLCBidWZfc2l6ZSwgcHJlY2lzaW9uKTsKKyAgICAvKiBJZiBmb3JtYXRfY2hhciBpcyAnWicsIG1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIKKyAgICAgICBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCAoYW5kIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGVjaW1hbCBwb2ludCk7CisgICAgICAgYWxzbyBzd2l0Y2ggdG8gZXhwb25lbnRpYWwgbm90YXRpb24gaW4gc29tZSBlZGdlIGNhc2VzIHdoZXJlIHRoZQorICAgICAgIGV4dHJhIGNoYXJhY3RlciB3b3VsZCBwcm9kdWNlIG1vcmUgc2lnbmlmaWNhbnQgZGlnaXRzIHRoYXQgd2UKKyAgICAgICByZWFsbHkgd2FudC4gKi8KKyAgICBpZiAoZm9ybWF0X2NoYXIgPT0gJ1onKQorICAgICAgICBidWZmZXIgPSBlbnN1cmVfZGVjaW1hbF9wb2ludChidWZmZXIsIGJ1Zl9zaXplLCBwcmVjaXNpb24pOwogCi0JcmV0dXJuIGJ1ZmZlcjsKKyAgICByZXR1cm4gYnVmZmVyOwogfQogCiBjaGFyICoKLVB5T1NfYXNjaWlfZm9ybWF0ZChjaGFyICAgICAgICpidWZmZXIsIAotCQkgICBzaXplX3QgICAgICBidWZfc2l6ZSwgCi0JCSAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgCi0JCSAgIGRvdWJsZSAgICAgIGQpCitQeU9TX2FzY2lpX2Zvcm1hdGQoY2hhciAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgIGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICBkKQogewotCWlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJICJQeU9TX2FzY2lpX2Zvcm1hdGQgaXMgZGVwcmVjYXRlZCwgIgotCQkJICJ1c2UgUHlPU19kb3VibGVfdG9fc3RyaW5nIGluc3RlYWQiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgIlB5T1NfYXNjaWlfZm9ybWF0ZCBpcyBkZXByZWNhdGVkLCAiCisgICAgICAgICAgICAgICAgICAgICAidXNlIFB5T1NfZG91YmxlX3RvX3N0cmluZyBpbnN0ZWFkIiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBfUHlPU19hc2NpaV9mb3JtYXRkKGJ1ZmZlciwgYnVmX3NpemUsIGZvcm1hdCwgZCwgLTEpOworICAgIHJldHVybiBfUHlPU19hc2NpaV9mb3JtYXRkKGJ1ZmZlciwgYnVmX3NpemUsIGZvcm1hdCwgZCwgLTEpOwogfQogCiAjaWZkZWYgUFlfTk9fU0hPUlRfRkxPQVRfUkVQUgpAQCAtNzQwLDE0NiArNzQwLDE0NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdHlwZSkKIHsKLQljaGFyIGZvcm1hdFszMl07Ci0JUHlfc3NpemVfdCBidWZzaXplOwotCWNoYXIgKmJ1ZjsKLQlpbnQgdCwgZXhwOwotCWludCB1cHBlciA9IDA7CisgICAgY2hhciBmb3JtYXRbMzJdOworICAgIFB5X3NzaXplX3QgYnVmc2l6ZTsKKyAgICBjaGFyICpidWY7CisgICAgaW50IHQsIGV4cDsKKyAgICBpbnQgdXBwZXIgPSAwOwogCi0JLyogVmFsaWRhdGUgZm9ybWF0X2NvZGUsIGFuZCBtYXAgdXBwZXIgYW5kIGxvd2VyIGNhc2UgKi8KLQlzd2l0Y2ggKGZvcm1hdF9jb2RlKSB7Ci0JY2FzZSAnZSc6ICAgICAgICAgIC8qIGV4cG9uZW50ICovCi0JY2FzZSAnZic6ICAgICAgICAgIC8qIGZpeGVkICovCi0JY2FzZSAnZyc6ICAgICAgICAgIC8qIGdlbmVyYWwgKi8KLQkJYnJlYWs7Ci0JY2FzZSAnRSc6Ci0JCXVwcGVyID0gMTsKLQkJZm9ybWF0X2NvZGUgPSAnZSc7Ci0JCWJyZWFrOwotCWNhc2UgJ0YnOgotCQl1cHBlciA9IDE7Ci0JCWZvcm1hdF9jb2RlID0gJ2YnOwotCQlicmVhazsKLQljYXNlICdHJzoKLQkJdXBwZXIgPSAxOwotCQlmb3JtYXRfY29kZSA9ICdnJzsKLQkJYnJlYWs7Ci0JY2FzZSAncic6ICAgICAgICAgIC8qIHJlcHIgZm9ybWF0ICovCi0JCS8qIFN1cHBsaWVkIHByZWNpc2lvbiBpcyB1bnVzZWQsIG11c3QgYmUgMC4gKi8KLQkJaWYgKHByZWNpc2lvbiAhPSAwKSB7Ci0JCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIFRoZSByZXByKCkgcHJlY2lzaW9uICgxNyBzaWduaWZpY2FudCBkZWNpbWFsIGRpZ2l0cykgaXMgdGhlCi0JCSAgIG1pbmltYWwgbnVtYmVyIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGVub3VnaCBwcmVjaXNpb24KLQkJICAgc28gdGhhdCBpZiB0aGUgbnVtYmVyIGlzIHJlYWQgYmFjayBpbiB0aGUgZXhhY3Qgc2FtZSBiaW5hcnkKLQkJICAgdmFsdWUgaXMgcmVjcmVhdGVkLiAgVGhpcyBpcyB0cnVlIGZvciBJRUVFIGZsb2F0aW5nIHBvaW50Ci0JCSAgIGJ5IGRlc2lnbiwgYW5kIGFsc28gaGFwcGVucyB0byB3b3JrIGZvciBhbGwgb3RoZXIgbW9kZXJuCi0JCSAgIGhhcmR3YXJlLiAqLwotCQlwcmVjaXNpb24gPSAxNzsKLQkJZm9ybWF0X2NvZGUgPSAnZyc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogVmFsaWRhdGUgZm9ybWF0X2NvZGUsIGFuZCBtYXAgdXBwZXIgYW5kIGxvd2VyIGNhc2UgKi8KKyAgICBzd2l0Y2ggKGZvcm1hdF9jb2RlKSB7CisgICAgY2FzZSAnZSc6ICAgICAgICAgIC8qIGV4cG9uZW50ICovCisgICAgY2FzZSAnZic6ICAgICAgICAgIC8qIGZpeGVkICovCisgICAgY2FzZSAnZyc6ICAgICAgICAgIC8qIGdlbmVyYWwgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnRSc6CisgICAgICAgIHVwcGVyID0gMTsKKyAgICAgICAgZm9ybWF0X2NvZGUgPSAnZSc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ0YnOgorICAgICAgICB1cHBlciA9IDE7CisgICAgICAgIGZvcm1hdF9jb2RlID0gJ2YnOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdHJzoKKyAgICAgICAgdXBwZXIgPSAxOworICAgICAgICBmb3JtYXRfY29kZSA9ICdnJzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6ICAgICAgICAgIC8qIHJlcHIgZm9ybWF0ICovCisgICAgICAgIC8qIFN1cHBsaWVkIHByZWNpc2lvbiBpcyB1bnVzZWQsIG11c3QgYmUgMC4gKi8KKyAgICAgICAgaWYgKHByZWNpc2lvbiAhPSAwKSB7CisgICAgICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIFRoZSByZXByKCkgcHJlY2lzaW9uICgxNyBzaWduaWZpY2FudCBkZWNpbWFsIGRpZ2l0cykgaXMgdGhlCisgICAgICAgICAgIG1pbmltYWwgbnVtYmVyIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGVub3VnaCBwcmVjaXNpb24KKyAgICAgICAgICAgc28gdGhhdCBpZiB0aGUgbnVtYmVyIGlzIHJlYWQgYmFjayBpbiB0aGUgZXhhY3Qgc2FtZSBiaW5hcnkKKyAgICAgICAgICAgdmFsdWUgaXMgcmVjcmVhdGVkLiAgVGhpcyBpcyB0cnVlIGZvciBJRUVFIGZsb2F0aW5nIHBvaW50CisgICAgICAgICAgIGJ5IGRlc2lnbiwgYW5kIGFsc28gaGFwcGVucyB0byB3b3JrIGZvciBhbGwgb3RoZXIgbW9kZXJuCisgICAgICAgICAgIGhhcmR3YXJlLiAqLworICAgICAgICBwcmVjaXNpb24gPSAxNzsKKyAgICAgICAgZm9ybWF0X2NvZGUgPSAnZyc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBIZXJlJ3MgYSBxdWljay1hbmQtZGlydHkgY2FsY3VsYXRpb24gdG8gZmlndXJlIG91dCBob3cgYmlnIGEgYnVmZmVyCi0JICAgd2UgbmVlZC4gIEluIGdlbmVyYWwsIGZvciBhIGZpbml0ZSBmbG9hdCB3ZSBuZWVkOgorICAgIC8qIEhlcmUncyBhIHF1aWNrLWFuZC1kaXJ0eSBjYWxjdWxhdGlvbiB0byBmaWd1cmUgb3V0IGhvdyBiaWcgYSBidWZmZXIKKyAgICAgICB3ZSBuZWVkLiAgSW4gZ2VuZXJhbCwgZm9yIGEgZmluaXRlIGZsb2F0IHdlIG5lZWQ6CiAKLQkgICAgIDEgYnl0ZSBmb3IgZWFjaCBkaWdpdCBvZiB0aGUgZGVjaW1hbCBzaWduaWZpY2FuZCwgYW5kCisgICAgICAgICAxIGJ5dGUgZm9yIGVhY2ggZGlnaXQgb2YgdGhlIGRlY2ltYWwgc2lnbmlmaWNhbmQsIGFuZAogCi0JICAgICAxIGZvciBhIHBvc3NpYmxlIHNpZ24KLQkgICAgIDEgZm9yIGEgcG9zc2libGUgZGVjaW1hbCBwb2ludAotCSAgICAgMiBmb3IgYSBwb3NzaWJsZSBbZUVdWystXQotCSAgICAgMSBmb3IgZWFjaCBkaWdpdCBvZiB0aGUgZXhwb25lbnQ7ICBpZiB3ZSBhbGxvdyAxOSBkaWdpdHMKLQkgICAgICAgdG90YWwgdGhlbiB3ZSdyZSBzYWZlIHVwIHRvIGV4cG9uZW50cyBvZiAyKio2My4KLQkgICAgIDEgZm9yIHRoZSB0cmFpbGluZyBudWwgYnl0ZQorICAgICAgICAgMSBmb3IgYSBwb3NzaWJsZSBzaWduCisgICAgICAgICAxIGZvciBhIHBvc3NpYmxlIGRlY2ltYWwgcG9pbnQKKyAgICAgICAgIDIgZm9yIGEgcG9zc2libGUgW2VFXVsrLV0KKyAgICAgICAgIDEgZm9yIGVhY2ggZGlnaXQgb2YgdGhlIGV4cG9uZW50OyAgaWYgd2UgYWxsb3cgMTkgZGlnaXRzCisgICAgICAgICAgIHRvdGFsIHRoZW4gd2UncmUgc2FmZSB1cCB0byBleHBvbmVudHMgb2YgMioqNjMuCisgICAgICAgICAxIGZvciB0aGUgdHJhaWxpbmcgbnVsIGJ5dGUKIAotCSAgIFRoaXMgZ2l2ZXMgYSB0b3RhbCBvZiAyNCArIHRoZSBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBzaWduaWZpY2FuZCwKLQkgICBhbmQgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIHNpZ25pZmljYW5kIGlzOgorICAgICAgIFRoaXMgZ2l2ZXMgYSB0b3RhbCBvZiAyNCArIHRoZSBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBzaWduaWZpY2FuZCwKKyAgICAgICBhbmQgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIHNpZ25pZmljYW5kIGlzOgogCi0JICAgICBmb3IgJ2cnIGZvcm1hdDogYXQgbW9zdCBwcmVjaXNpb24sIGV4Y2VwdCBwb3NzaWJseQotCSAgICAgICB3aGVuIHByZWNpc2lvbiA9PSAwLCB3aGVuIGl0J3MgMS4KLQkgICAgIGZvciAnZScgZm9ybWF0OiBwcmVjaXNpb24rMQotCSAgICAgZm9yICdmJyBmb3JtYXQ6IHByZWNpc2lvbiBkaWdpdHMgYWZ0ZXIgdGhlIHBvaW50LCBhdCBsZWFzdCAxCi0JICAgICAgIGJlZm9yZS4gIFRvIGZpZ3VyZSBvdXQgaG93IG1hbnkgZGlnaXRzIGFwcGVhciBiZWZvcmUgdGhlIHBvaW50Ci0JICAgICAgIHdlIGhhdmUgdG8gZXhhbWluZSB0aGUgc2l6ZSBvZiB0aGUgbnVtYmVyLiAgSWYgZmFicyh2YWwpIDwgMS4wCi0JICAgICAgIHRoZW4gdGhlcmUgd2lsbCBiZSBvbmx5IG9uZSBkaWdpdCBiZWZvcmUgdGhlIHBvaW50LiAgSWYKLQkgICAgICAgZmFicyh2YWwpID49IDEuMCwgdGhlbiB0aGVyZSBhcmUgYXQgbW9zdAorICAgICAgICAgZm9yICdnJyBmb3JtYXQ6IGF0IG1vc3QgcHJlY2lzaW9uLCBleGNlcHQgcG9zc2libHkKKyAgICAgICAgICAgd2hlbiBwcmVjaXNpb24gPT0gMCwgd2hlbiBpdCdzIDEuCisgICAgICAgICBmb3IgJ2UnIGZvcm1hdDogcHJlY2lzaW9uKzEKKyAgICAgICAgIGZvciAnZicgZm9ybWF0OiBwcmVjaXNpb24gZGlnaXRzIGFmdGVyIHRoZSBwb2ludCwgYXQgbGVhc3QgMQorICAgICAgICAgICBiZWZvcmUuICBUbyBmaWd1cmUgb3V0IGhvdyBtYW55IGRpZ2l0cyBhcHBlYXIgYmVmb3JlIHRoZSBwb2ludAorICAgICAgICAgICB3ZSBoYXZlIHRvIGV4YW1pbmUgdGhlIHNpemUgb2YgdGhlIG51bWJlci4gIElmIGZhYnModmFsKSA8IDEuMAorICAgICAgICAgICB0aGVuIHRoZXJlIHdpbGwgYmUgb25seSBvbmUgZGlnaXQgYmVmb3JlIHRoZSBwb2ludC4gIElmCisgICAgICAgICAgIGZhYnModmFsKSA+PSAxLjAsIHRoZW4gdGhlcmUgYXJlIGF0IG1vc3QKIAotCSAgICAgICAgIDErZmxvb3IobG9nMTAoY2VpbGluZyhmYWJzKHZhbCkpKSkKKyAgICAgICAgIDErZmxvb3IobG9nMTAoY2VpbGluZyhmYWJzKHZhbCkpKSkKIAotCSAgICAgICBkaWdpdHMgYmVmb3JlIHRoZSBwb2ludCAod2hlcmUgdGhlICdjZWlsaW5nJyBhbGxvd3MgZm9yIHRoZQotCSAgICAgICBwb3NzaWJpbGl0eSB0aGF0IHRoZSByb3VuZGluZyByb3VuZHMgdGhlIGludGVnZXIgcGFydCBvZiB2YWwKLQkgICAgICAgdXApLiAgQSBzYWZlIHVwcGVyIGJvdW5kIGZvciB0aGUgYWJvdmUgcXVhbnRpdHkgaXMKLQkgICAgICAgMStmbG9vcihleHAvMyksIHdoZXJlIGV4cCBpcyB0aGUgdW5pcXVlIGludGVnZXIgc3VjaCB0aGF0IDAuNQotCSAgICAgICA8PSBmYWJzKHZhbCkvMioqZXhwIDwgMS4wLiAgVGhpcyBleHAgY2FuIGJlIG9idGFpbmVkIGZyb20KLQkgICAgICAgZnJleHAuCisgICAgICAgICAgIGRpZ2l0cyBiZWZvcmUgdGhlIHBvaW50ICh3aGVyZSB0aGUgJ2NlaWxpbmcnIGFsbG93cyBmb3IgdGhlCisgICAgICAgICAgIHBvc3NpYmlsaXR5IHRoYXQgdGhlIHJvdW5kaW5nIHJvdW5kcyB0aGUgaW50ZWdlciBwYXJ0IG9mIHZhbAorICAgICAgICAgICB1cCkuICBBIHNhZmUgdXBwZXIgYm91bmQgZm9yIHRoZSBhYm92ZSBxdWFudGl0eSBpcworICAgICAgICAgICAxK2Zsb29yKGV4cC8zKSwgd2hlcmUgZXhwIGlzIHRoZSB1bmlxdWUgaW50ZWdlciBzdWNoIHRoYXQgMC41CisgICAgICAgICAgIDw9IGZhYnModmFsKS8yKipleHAgPCAxLjAuICBUaGlzIGV4cCBjYW4gYmUgb2J0YWluZWQgZnJvbQorICAgICAgICAgICBmcmV4cC4KIAotCSAgIFNvIHdlIGFsbG93IHJvb20gZm9yIHByZWNpc2lvbisxIGRpZ2l0cyBmb3IgYWxsIGZvcm1hdHMsIHBsdXMgYW4KLQkgICBleHRyYSBmbG9vcihleHAvMykgZGlnaXRzIGZvciAnZicgZm9ybWF0LgorICAgICAgIFNvIHdlIGFsbG93IHJvb20gZm9yIHByZWNpc2lvbisxIGRpZ2l0cyBmb3IgYWxsIGZvcm1hdHMsIHBsdXMgYW4KKyAgICAgICBleHRyYSBmbG9vcihleHAvMykgZGlnaXRzIGZvciAnZicgZm9ybWF0LgogCi0JKi8KKyAgICAqLwogCi0JaWYgKFB5X0lTX05BTih2YWwpIHx8IFB5X0lTX0lORklOSVRZKHZhbCkpCi0JCS8qIDMgZm9yICdpbmYnLyduYW4nLCAxIGZvciBzaWduLCAxIGZvciAnXDAnICovCi0JCWJ1ZnNpemUgPSA1OwotCWVsc2UgewotCQlidWZzaXplID0gMjUgKyBwcmVjaXNpb247Ci0JCWlmIChmb3JtYXRfY29kZSA9PSAnZicgJiYgZmFicyh2YWwpID49IDEuMCkgewotCQkJZnJleHAodmFsLCAmZXhwKTsKLQkJCWJ1ZnNpemUgKz0gZXhwLzM7Ci0JCX0KLQl9CisgICAgaWYgKFB5X0lTX05BTih2YWwpIHx8IFB5X0lTX0lORklOSVRZKHZhbCkpCisgICAgICAgIC8qIDMgZm9yICdpbmYnLyduYW4nLCAxIGZvciBzaWduLCAxIGZvciAnXDAnICovCisgICAgICAgIGJ1ZnNpemUgPSA1OworICAgIGVsc2UgeworICAgICAgICBidWZzaXplID0gMjUgKyBwcmVjaXNpb247CisgICAgICAgIGlmIChmb3JtYXRfY29kZSA9PSAnZicgJiYgZmFicyh2YWwpID49IDEuMCkgeworICAgICAgICAgICAgZnJleHAodmFsLCAmZXhwKTsKKyAgICAgICAgICAgIGJ1ZnNpemUgKz0gZXhwLzM7CisgICAgICAgIH0KKyAgICB9CiAKLQlidWYgPSBQeU1lbV9NYWxsb2MoYnVmc2l6ZSk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBidWYgPSBQeU1lbV9NYWxsb2MoYnVmc2l6ZSk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEhhbmRsZSBuYW4gYW5kIGluZi4gKi8KLQlpZiAoUHlfSVNfTkFOKHZhbCkpIHsKLQkJc3RyY3B5KGJ1ZiwgIm5hbiIpOwotCQl0ID0gUHlfRFRTVF9OQU47Ci0JfSBlbHNlIGlmIChQeV9JU19JTkZJTklUWSh2YWwpKSB7Ci0JCWlmIChjb3B5c2lnbigxLiwgdmFsKSA9PSAxLikKLQkJCXN0cmNweShidWYsICJpbmYiKTsKLQkJZWxzZQotCQkJc3RyY3B5KGJ1ZiwgIi1pbmYiKTsKLQkJdCA9IFB5X0RUU1RfSU5GSU5JVEU7Ci0JfSBlbHNlIHsKLQkJdCA9IFB5X0RUU1RfRklOSVRFOwotCQlpZiAoZmxhZ3MgJiBQeV9EVFNGX0FERF9ET1RfMCkKLQkJCWZvcm1hdF9jb2RlID0gJ1onOworICAgIC8qIEhhbmRsZSBuYW4gYW5kIGluZi4gKi8KKyAgICBpZiAoUHlfSVNfTkFOKHZhbCkpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgIm5hbiIpOworICAgICAgICB0ID0gUHlfRFRTVF9OQU47CisgICAgfSBlbHNlIGlmIChQeV9JU19JTkZJTklUWSh2YWwpKSB7CisgICAgICAgIGlmIChjb3B5c2lnbigxLiwgdmFsKSA9PSAxLikKKyAgICAgICAgICAgIHN0cmNweShidWYsICJpbmYiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgIi1pbmYiKTsKKyAgICAgICAgdCA9IFB5X0RUU1RfSU5GSU5JVEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdCA9IFB5X0RUU1RfRklOSVRFOworICAgICAgICBpZiAoZmxhZ3MgJiBQeV9EVFNGX0FERF9ET1RfMCkKKyAgICAgICAgICAgIGZvcm1hdF9jb2RlID0gJ1onOwogCi0JCVB5T1Nfc25wcmludGYoZm9ybWF0LCBzaXplb2YoZm9ybWF0KSwgIiUlJXMuJWklYyIsCi0JCQkgICAgICAoZmxhZ3MgJiBQeV9EVFNGX0FMVCA/ICIjIiA6ICIiKSwgcHJlY2lzaW9uLAotCQkJICAgICAgZm9ybWF0X2NvZGUpOwotCQlfUHlPU19hc2NpaV9mb3JtYXRkKGJ1ZiwgYnVmc2l6ZSwgZm9ybWF0LCB2YWwsIHByZWNpc2lvbik7Ci0JfQorICAgICAgICBQeU9TX3NucHJpbnRmKGZvcm1hdCwgc2l6ZW9mKGZvcm1hdCksICIlJSVzLiVpJWMiLAorICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFB5X0RUU0ZfQUxUID8gIiMiIDogIiIpLCBwcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X2NvZGUpOworICAgICAgICBfUHlPU19hc2NpaV9mb3JtYXRkKGJ1ZiwgYnVmc2l6ZSwgZm9ybWF0LCB2YWwsIHByZWNpc2lvbik7CisgICAgfQogCi0JLyogQWRkIHNpZ24gd2hlbiByZXF1ZXN0ZWQuICBJdCdzIGNvbnZlbmllbnQgKGVzcC4gd2hlbiBmb3JtYXR0aW5nCi0JIGNvbXBsZXggbnVtYmVycykgdG8gaW5jbHVkZSBhIHNpZ24gZXZlbiBmb3IgaW5mIGFuZCBuYW4uICovCi0JaWYgKGZsYWdzICYgUHlfRFRTRl9TSUdOICYmIGJ1ZlswXSAhPSAnLScpIHsKLQkJc2l6ZV90IGxlbiA9IHN0cmxlbihidWYpOwotCQkvKiB0aGUgYnVmc2l6ZSBjYWxjdWxhdGlvbnMgYWJvdmUgc2hvdWxkIGVuc3VyZSB0aGF0IHdlJ3ZlIGdvdAotCQkgICBzcGFjZSB0byBhZGQgYSBzaWduICovCi0JCWFzc2VydCgoc2l6ZV90KWJ1ZnNpemUgPj0gbGVuKzIpOwotCQltZW1tb3ZlKGJ1ZisxLCBidWYsIGxlbisxKTsKLQkJYnVmWzBdID0gJysnOwotCX0KLQlpZiAodXBwZXIpIHsKLQkJLyogQ29udmVydCB0byB1cHBlciBjYXNlLiAqLwotCQljaGFyICpwMTsKLQkJZm9yIChwMSA9IGJ1ZjsgKnAxOyBwMSsrKQotCQkJKnAxID0gUHlfVE9VUFBFUigqcDEpOwotCX0KKyAgICAvKiBBZGQgc2lnbiB3aGVuIHJlcXVlc3RlZC4gIEl0J3MgY29udmVuaWVudCAoZXNwLiB3aGVuIGZvcm1hdHRpbmcKKyAgICAgY29tcGxleCBudW1iZXJzKSB0byBpbmNsdWRlIGEgc2lnbiBldmVuIGZvciBpbmYgYW5kIG5hbi4gKi8KKyAgICBpZiAoZmxhZ3MgJiBQeV9EVFNGX1NJR04gJiYgYnVmWzBdICE9ICctJykgeworICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKGJ1Zik7CisgICAgICAgIC8qIHRoZSBidWZzaXplIGNhbGN1bGF0aW9ucyBhYm92ZSBzaG91bGQgZW5zdXJlIHRoYXQgd2UndmUgZ290CisgICAgICAgICAgIHNwYWNlIHRvIGFkZCBhIHNpZ24gKi8KKyAgICAgICAgYXNzZXJ0KChzaXplX3QpYnVmc2l6ZSA+PSBsZW4rMik7CisgICAgICAgIG1lbW1vdmUoYnVmKzEsIGJ1ZiwgbGVuKzEpOworICAgICAgICBidWZbMF0gPSAnKyc7CisgICAgfQorICAgIGlmICh1cHBlcikgeworICAgICAgICAvKiBDb252ZXJ0IHRvIHVwcGVyIGNhc2UuICovCisgICAgICAgIGNoYXIgKnAxOworICAgICAgICBmb3IgKHAxID0gYnVmOyAqcDE7IHAxKyspCisgICAgICAgICAgICAqcDEgPSBQeV9UT1VQUEVSKCpwMSk7CisgICAgfQogCi0JaWYgKHR5cGUpCi0JCSp0eXBlID0gdDsKLQlyZXR1cm4gYnVmOworICAgIGlmICh0eXBlKQorICAgICAgICAqdHlwZSA9IHQ7CisgICAgcmV0dXJuIGJ1ZjsKIH0KIAogI2Vsc2UKQEAgLTg5NCwxNCArODk0LDE0IEBACiAKIC8qIFRoZSBsZW5ndGhzIG9mIHRoZXNlIGFyZSBrbm93biB0byB0aGUgY29kZSBiZWxvdywgc28gZG9uJ3QgY2hhbmdlIHRoZW0gKi8KIHN0YXRpYyBjaGFyICpsY19mbG9hdF9zdHJpbmdzW10gPSB7Ci0JImluZiIsCi0JIm5hbiIsCi0JImUiLAorICAgICJpbmYiLAorICAgICJuYW4iLAorICAgICJlIiwKIH07CiBzdGF0aWMgY2hhciAqdWNfZmxvYXRfc3RyaW5nc1tdID0gewotCSJJTkYiLAotCSJOQU4iLAotCSJFIiwKKyAgICAiSU5GIiwKKyAgICAiTkFOIiwKKyAgICAiRSIsCiB9OwogCiAKQEAgLTkyNSw5ICs5MjUsOSBAQAogICAgICAgIGJlIG5vbnplcm8uCiAgICAgIHR5cGUsIGlmIG5vbi1OVUxMLCB3aWxsIGJlIHNldCB0byBvbmUgb2YgdGhlc2UgY29uc3RhbnRzIHRvIGlkZW50aWZ5CiAgICAgICAgdGhlIHR5cGUgb2YgdGhlICdkJyBhcmd1bWVudDoKLSAgICAgICAgIFB5X0RUU1RfRklOSVRFCi0gICAgICAgICBQeV9EVFNUX0lORklOSVRFCi0gICAgICAgICBQeV9EVFNUX05BTgorICAgICBQeV9EVFNUX0ZJTklURQorICAgICBQeV9EVFNUX0lORklOSVRFCisgICAgIFB5X0RUU1RfTkFOCiAKICAgIFJldHVybnMgYSBQeU1lbV9NYWxsb2MnZCBibG9jayBvZiBtZW1vcnkgY29udGFpbmluZyB0aGUgcmVzdWx0aW5nIHN0cmluZywKICAgICBvciBOVUxMIG9uIGVycm9yLiBJZiBOVUxMIGlzIHJldHVybmVkLCB0aGUgUHl0aG9uIGVycm9yIGhhcyBiZWVuIHNldC4KQEAgLTkzNSwzMTUgKzkzNSwzMTUgQEAKIAogc3RhdGljIGNoYXIgKgogZm9ybWF0X2Zsb2F0X3Nob3J0KGRvdWJsZSBkLCBjaGFyIGZvcm1hdF9jb2RlLAotCQkgICBpbnQgbW9kZSwgUHlfc3NpemVfdCBwcmVjaXNpb24sCi0JCSAgIGludCBhbHdheXNfYWRkX3NpZ24sIGludCBhZGRfZG90XzBfaWZfaW50ZWdlciwKLQkJICAgaW50IHVzZV9hbHRfZm9ybWF0dGluZywgY2hhciAqKmZsb2F0X3N0cmluZ3MsIGludCAqdHlwZSkKKyAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgUHlfc3NpemVfdCBwcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgaW50IGFsd2F5c19hZGRfc2lnbiwgaW50IGFkZF9kb3RfMF9pZl9pbnRlZ2VyLAorICAgICAgICAgICAgICAgICAgIGludCB1c2VfYWx0X2Zvcm1hdHRpbmcsIGNoYXIgKipmbG9hdF9zdHJpbmdzLCBpbnQgKnR5cGUpCiB7Ci0JY2hhciAqYnVmID0gTlVMTDsKLQljaGFyICpwID0gTlVMTDsKLQlQeV9zc2l6ZV90IGJ1ZnNpemUgPSAwOwotCWNoYXIgKmRpZ2l0cywgKmRpZ2l0c19lbmQ7Ci0JaW50IGRlY3B0X2FzX2ludCwgc2lnbiwgZXhwX2xlbiwgZXhwID0gMCwgdXNlX2V4cCA9IDA7Ci0JUHlfc3NpemVfdCBkZWNwdCwgZGlnaXRzX2xlbiwgdmRpZ2l0c19zdGFydCwgdmRpZ2l0c19lbmQ7Ci0JX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fSEVBREVSOworICAgIGNoYXIgKmJ1ZiA9IE5VTEw7CisgICAgY2hhciAqcCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBidWZzaXplID0gMDsKKyAgICBjaGFyICpkaWdpdHMsICpkaWdpdHNfZW5kOworICAgIGludCBkZWNwdF9hc19pbnQsIHNpZ24sIGV4cF9sZW4sIGV4cCA9IDAsIHVzZV9leHAgPSAwOworICAgIFB5X3NzaXplX3QgZGVjcHQsIGRpZ2l0c19sZW4sIHZkaWdpdHNfc3RhcnQsIHZkaWdpdHNfZW5kOworICAgIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX0hFQURFUjsKIAotCS8qIF9QeV9kZ19kdG9hIHJldHVybnMgYSBkaWdpdCBzdHJpbmcgKG5vIGRlY2ltYWwgcG9pbnQgb3IgZXhwb25lbnQpLgotCSAgIE11c3QgYmUgbWF0Y2hlZCBieSBhIGNhbGwgdG8gX1B5X2RnX2ZyZWVkdG9hLiAqLwotCV9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX1NUQVJUOwotCWRpZ2l0cyA9IF9QeV9kZ19kdG9hKGQsIG1vZGUsIHByZWNpc2lvbiwgJmRlY3B0X2FzX2ludCwgJnNpZ24sCi0JCQkgICAgICZkaWdpdHNfZW5kKTsKLQlfUHlfU0VUXzUzQklUX1BSRUNJU0lPTl9FTkQ7CisgICAgLyogX1B5X2RnX2R0b2EgcmV0dXJucyBhIGRpZ2l0IHN0cmluZyAobm8gZGVjaW1hbCBwb2ludCBvciBleHBvbmVudCkuCisgICAgICAgTXVzdCBiZSBtYXRjaGVkIGJ5IGEgY2FsbCB0byBfUHlfZGdfZnJlZWR0b2EuICovCisgICAgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fU1RBUlQ7CisgICAgZGlnaXRzID0gX1B5X2RnX2R0b2EoZCwgbW9kZSwgcHJlY2lzaW9uLCAmZGVjcHRfYXNfaW50LCAmc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGlnaXRzX2VuZCk7CisgICAgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fRU5EOwogCi0JZGVjcHQgPSAoUHlfc3NpemVfdClkZWNwdF9hc19pbnQ7Ci0JaWYgKGRpZ2l0cyA9PSBOVUxMKSB7Ci0JCS8qIFRoZSBvbmx5IGZhaWx1cmUgbW9kZSBpcyBubyBtZW1vcnkuICovCi0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JYXNzZXJ0KGRpZ2l0c19lbmQgIT0gTlVMTCAmJiBkaWdpdHNfZW5kID49IGRpZ2l0cyk7Ci0JZGlnaXRzX2xlbiA9IGRpZ2l0c19lbmQgLSBkaWdpdHM7CisgICAgZGVjcHQgPSAoUHlfc3NpemVfdClkZWNwdF9hc19pbnQ7CisgICAgaWYgKGRpZ2l0cyA9PSBOVUxMKSB7CisgICAgICAgIC8qIFRoZSBvbmx5IGZhaWx1cmUgbW9kZSBpcyBubyBtZW1vcnkuICovCisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgYXNzZXJ0KGRpZ2l0c19lbmQgIT0gTlVMTCAmJiBkaWdpdHNfZW5kID49IGRpZ2l0cyk7CisgICAgZGlnaXRzX2xlbiA9IGRpZ2l0c19lbmQgLSBkaWdpdHM7CiAKLQlpZiAoZGlnaXRzX2xlbiAmJiAhUHlfSVNESUdJVChkaWdpdHNbMF0pKSB7Ci0JCS8qIEluZmluaXRpZXMgYW5kIG5hbnMgaGVyZTsgYWRhcHQgR2F5J3Mgb3V0cHV0LAotCQkgICBzbyBjb252ZXJ0IEluZmluaXR5IHRvIGluZiBhbmQgTmFOIHRvIG5hbiwgYW5kCi0JCSAgIGlnbm9yZSBzaWduIG9mIG5hbi4gVGhlbiByZXR1cm4uICovCisgICAgaWYgKGRpZ2l0c19sZW4gJiYgIVB5X0lTRElHSVQoZGlnaXRzWzBdKSkgeworICAgICAgICAvKiBJbmZpbml0aWVzIGFuZCBuYW5zIGhlcmU7IGFkYXB0IEdheSdzIG91dHB1dCwKKyAgICAgICAgICAgc28gY29udmVydCBJbmZpbml0eSB0byBpbmYgYW5kIE5hTiB0byBuYW4sIGFuZAorICAgICAgICAgICBpZ25vcmUgc2lnbiBvZiBuYW4uIFRoZW4gcmV0dXJuLiAqLwogCi0JCS8qIGlnbm9yZSB0aGUgYWN0dWFsIHNpZ24gb2YgYSBuYW4gKi8KLQkJaWYgKGRpZ2l0c1swXSA9PSAnbicgfHwgZGlnaXRzWzBdID09ICdOJykKLQkJCXNpZ24gPSAwOworICAgICAgICAvKiBpZ25vcmUgdGhlIGFjdHVhbCBzaWduIG9mIGEgbmFuICovCisgICAgICAgIGlmIChkaWdpdHNbMF0gPT0gJ24nIHx8IGRpZ2l0c1swXSA9PSAnTicpCisgICAgICAgICAgICBzaWduID0gMDsKIAotCQkvKiBXZSBvbmx5IG5lZWQgNSBieXRlcyB0byBob2xkIHRoZSByZXN1bHQgIitpbmZcMCIgLiAqLwotCQlidWZzaXplID0gNTsgLyogVXNlZCBsYXRlciBpbiBhbiBhc3NlcnQuICovCi0JCWJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKGJ1ZnNpemUpOwotCQlpZiAoYnVmID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJcCA9IGJ1ZjsKKyAgICAgICAgLyogV2Ugb25seSBuZWVkIDUgYnl0ZXMgdG8gaG9sZCB0aGUgcmVzdWx0ICIraW5mXDAiIC4gKi8KKyAgICAgICAgYnVmc2l6ZSA9IDU7IC8qIFVzZWQgbGF0ZXIgaW4gYW4gYXNzZXJ0LiAqLworICAgICAgICBidWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhidWZzaXplKTsKKyAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIHAgPSBidWY7CiAKLQkJaWYgKHNpZ24gPT0gMSkgewotCQkJKnArKyA9ICctJzsKLQkJfQotCQllbHNlIGlmIChhbHdheXNfYWRkX3NpZ24pIHsKLQkJCSpwKysgPSAnKyc7Ci0JCX0KLQkJaWYgKGRpZ2l0c1swXSA9PSAnaScgfHwgZGlnaXRzWzBdID09ICdJJykgewotCQkJc3RybmNweShwLCBmbG9hdF9zdHJpbmdzW09GU19JTkZdLCAzKTsKLQkJCXAgKz0gMzsKKyAgICAgICAgaWYgKHNpZ24gPT0gMSkgeworICAgICAgICAgICAgKnArKyA9ICctJzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhbHdheXNfYWRkX3NpZ24pIHsKKyAgICAgICAgICAgICpwKysgPSAnKyc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpZ2l0c1swXSA9PSAnaScgfHwgZGlnaXRzWzBdID09ICdJJykgeworICAgICAgICAgICAgc3RybmNweShwLCBmbG9hdF9zdHJpbmdzW09GU19JTkZdLCAzKTsKKyAgICAgICAgICAgIHAgKz0gMzsKIAotCQkJaWYgKHR5cGUpCi0JCQkJKnR5cGUgPSBQeV9EVFNUX0lORklOSVRFOwotCQl9Ci0JCWVsc2UgaWYgKGRpZ2l0c1swXSA9PSAnbicgfHwgZGlnaXRzWzBdID09ICdOJykgewotCQkJc3RybmNweShwLCBmbG9hdF9zdHJpbmdzW09GU19OQU5dLCAzKTsKLQkJCXAgKz0gMzsKKyAgICAgICAgICAgIGlmICh0eXBlKQorICAgICAgICAgICAgICAgICp0eXBlID0gUHlfRFRTVF9JTkZJTklURTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkaWdpdHNbMF0gPT0gJ24nIHx8IGRpZ2l0c1swXSA9PSAnTicpIHsKKyAgICAgICAgICAgIHN0cm5jcHkocCwgZmxvYXRfc3RyaW5nc1tPRlNfTkFOXSwgMyk7CisgICAgICAgICAgICBwICs9IDM7CiAKLQkJCWlmICh0eXBlKQotCQkJCSp0eXBlID0gUHlfRFRTVF9OQU47Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBzaG91bGRuJ3QgZ2V0IGhlcmU6IEdheSdzIGNvZGUgc2hvdWxkIGFsd2F5cyByZXR1cm4KLQkJCSAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIGEgZGlnaXQsIGFuICdJJywgIG9yICdOJyAqLwotCQkJc3RybmNweShwLCAiRVJSIiwgMyk7Ci0JCQlwICs9IDM7Ci0JCQlhc3NlcnQoMCk7Ci0JCX0KLQkJZ290byBleGl0OwotCX0KKyAgICAgICAgICAgIGlmICh0eXBlKQorICAgICAgICAgICAgICAgICp0eXBlID0gUHlfRFRTVF9OQU47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBzaG91bGRuJ3QgZ2V0IGhlcmU6IEdheSdzIGNvZGUgc2hvdWxkIGFsd2F5cyByZXR1cm4KKyAgICAgICAgICAgICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIGEgZGlnaXQsIGFuICdJJywgIG9yICdOJyAqLworICAgICAgICAgICAgc3RybmNweShwLCAiRVJSIiwgMyk7CisgICAgICAgICAgICBwICs9IDM7CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBleGl0OworICAgIH0KIAotCS8qIFRoZSByZXN1bHQgbXVzdCBiZSBmaW5pdGUgKG5vdCBpbmYgb3IgbmFuKS4gKi8KLQlpZiAodHlwZSkKLQkJKnR5cGUgPSBQeV9EVFNUX0ZJTklURTsKKyAgICAvKiBUaGUgcmVzdWx0IG11c3QgYmUgZmluaXRlIChub3QgaW5mIG9yIG5hbikuICovCisgICAgaWYgKHR5cGUpCisgICAgICAgICp0eXBlID0gUHlfRFRTVF9GSU5JVEU7CiAKIAotCS8qIFdlIGdvdCBkaWdpdHMgYmFjaywgZm9ybWF0IHRoZW0uICBXZSBtYXkgbmVlZCB0byBwYWQgJ2RpZ2l0cycKLQkgICBlaXRoZXIgb24gdGhlIGxlZnQgb3IgcmlnaHQgKG9yIGJvdGgpIHdpdGggZXh0cmEgemVyb3MsIHNvIGluCi0JICAgZ2VuZXJhbCB0aGUgcmVzdWx0aW5nIHN0cmluZyBoYXMgdGhlIGZvcm0KKyAgICAvKiBXZSBnb3QgZGlnaXRzIGJhY2ssIGZvcm1hdCB0aGVtLiAgV2UgbWF5IG5lZWQgdG8gcGFkICdkaWdpdHMnCisgICAgICAgZWl0aGVyIG9uIHRoZSBsZWZ0IG9yIHJpZ2h0IChvciBib3RoKSB3aXRoIGV4dHJhIHplcm9zLCBzbyBpbgorICAgICAgIGdlbmVyYWwgdGhlIHJlc3VsdGluZyBzdHJpbmcgaGFzIHRoZSBmb3JtCiAKLQkgICAgIFs8c2lnbj5dPHplcm9zPjxkaWdpdHM+PHplcm9zPls8ZXhwb25lbnQ+XQorICAgICAgICAgWzxzaWduPl08emVyb3M+PGRpZ2l0cz48emVyb3M+WzxleHBvbmVudD5dCiAKLQkgICB3aGVyZSBlaXRoZXIgb2YgdGhlIDx6ZXJvcz4gcGllY2VzIGNvdWxkIGJlIGVtcHR5LCBhbmQgdGhlcmUncyBhCi0JICAgZGVjaW1hbCBwb2ludCB0aGF0IGNvdWxkIGFwcGVhciBlaXRoZXIgaW4gPGRpZ2l0cz4gb3IgaW4gdGhlCi0JICAgbGVhZGluZyBvciB0cmFpbGluZyA8emVyb3M+LgorICAgICAgIHdoZXJlIGVpdGhlciBvZiB0aGUgPHplcm9zPiBwaWVjZXMgY291bGQgYmUgZW1wdHksIGFuZCB0aGVyZSdzIGEKKyAgICAgICBkZWNpbWFsIHBvaW50IHRoYXQgY291bGQgYXBwZWFyIGVpdGhlciBpbiA8ZGlnaXRzPiBvciBpbiB0aGUKKyAgICAgICBsZWFkaW5nIG9yIHRyYWlsaW5nIDx6ZXJvcz4uCiAKLQkgICBJbWFnaW5lIGFuIGluZmluaXRlICd2aXJ0dWFsJyBzdHJpbmcgdmRpZ2l0cywgY29uc2lzdGluZyBvZiB0aGUKLQkgICBzdHJpbmcgJ2RpZ2l0cycgKHN0YXJ0aW5nIGF0IGluZGV4IDApIHBhZGRlZCBvbiBib3RoIHRoZSBsZWZ0IGFuZAotCSAgIHJpZ2h0IHdpdGggaW5maW5pdGUgc3RyaW5ncyBvZiB6ZXJvcy4gIFdlIHdhbnQgdG8gb3V0cHV0IGEgc2xpY2UKKyAgICAgICBJbWFnaW5lIGFuIGluZmluaXRlICd2aXJ0dWFsJyBzdHJpbmcgdmRpZ2l0cywgY29uc2lzdGluZyBvZiB0aGUKKyAgICAgICBzdHJpbmcgJ2RpZ2l0cycgKHN0YXJ0aW5nIGF0IGluZGV4IDApIHBhZGRlZCBvbiBib3RoIHRoZSBsZWZ0IGFuZAorICAgICAgIHJpZ2h0IHdpdGggaW5maW5pdGUgc3RyaW5ncyBvZiB6ZXJvcy4gIFdlIHdhbnQgdG8gb3V0cHV0IGEgc2xpY2UKIAotCSAgICAgdmRpZ2l0c1t2ZGlnaXRzX3N0YXJ0IDogdmRpZ2l0c19lbmRdCisgICAgICAgICB2ZGlnaXRzW3ZkaWdpdHNfc3RhcnQgOiB2ZGlnaXRzX2VuZF0KIAotCSAgIG9mIHRoaXMgdmlydHVhbCBzdHJpbmcuICBUaHVzIGlmIHZkaWdpdHNfc3RhcnQgPCAwIHRoZW4gd2UnbGwgZW5kCi0JICAgdXAgcHJvZHVjaW5nIHNvbWUgbGVhZGluZyB6ZXJvczsgaWYgdmRpZ2l0c19lbmQgPiBkaWdpdHNfbGVuIHRoZXJlCi0JICAgd2lsbCBiZSB0cmFpbGluZyB6ZXJvcyBpbiB0aGUgb3V0cHV0LiAgVGhlIG5leHQgc2VjdGlvbiBvZiBjb2RlCi0JICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSBhbiBleHBvbmVudCBvciBub3QsIGZpZ3VyZXMgb3V0IHRoZQotCSAgIHBvc2l0aW9uICdkZWNwdCcgb2YgdGhlIGRlY2ltYWwgcG9pbnQsIGFuZCBjb21wdXRlcyAndmRpZ2l0c19zdGFydCcKLQkgICBhbmQgJ3ZkaWdpdHNfZW5kJy4gKi8KLQl2ZGlnaXRzX2VuZCA9IGRpZ2l0c19sZW47Ci0Jc3dpdGNoIChmb3JtYXRfY29kZSkgewotCWNhc2UgJ2UnOgotCQl1c2VfZXhwID0gMTsKLQkJdmRpZ2l0c19lbmQgPSBwcmVjaXNpb247Ci0JCWJyZWFrOwotCWNhc2UgJ2YnOgotCQl2ZGlnaXRzX2VuZCA9IGRlY3B0ICsgcHJlY2lzaW9uOwotCQlicmVhazsKLQljYXNlICdnJzoKLQkJaWYgKGRlY3B0IDw9IC00IHx8IGRlY3B0ID4KLQkJICAgIChhZGRfZG90XzBfaWZfaW50ZWdlciA/IHByZWNpc2lvbi0xIDogcHJlY2lzaW9uKSkKLQkJCXVzZV9leHAgPSAxOwotCQlpZiAodXNlX2FsdF9mb3JtYXR0aW5nKQotCQkJdmRpZ2l0c19lbmQgPSBwcmVjaXNpb247Ci0JCWJyZWFrOwotCWNhc2UgJ3InOgotCQkvKiBjb252ZXJ0IHRvIGV4cG9uZW50aWFsIGZvcm1hdCBhdCAxZTE2LiAgV2UgdXNlZCB0byBjb252ZXJ0Ci0JCSAgIGF0IDFlMTcsIGJ1dCB0aGF0IGdpdmVzIG9kZC1sb29raW5nIHJlc3VsdHMgZm9yIHNvbWUgdmFsdWVzCi0JCSAgIHdoZW4gYSAxNi1kaWdpdCAnc2hvcnRlc3QnIHJlcHIgaXMgcGFkZGVkIHdpdGggYm9ndXMgemVyb3MuCi0JCSAgIEZvciBleGFtcGxlLCByZXByKDJlMTYrOCkgd291bGQgZ2l2ZSAyMDAwMDAwMDAwMDAwMDAxMC4wOwotCQkgICB0aGUgdHJ1ZSB2YWx1ZSBpcyAyMDAwMDAwMDAwMDAwMDAwOC4wLiAqLwotCQlpZiAoZGVjcHQgPD0gLTQgfHwgZGVjcHQgPiAxNikKLQkJCXVzZV9leHAgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJZ290byBleGl0OwotCX0KKyAgICAgICBvZiB0aGlzIHZpcnR1YWwgc3RyaW5nLiAgVGh1cyBpZiB2ZGlnaXRzX3N0YXJ0IDwgMCB0aGVuIHdlJ2xsIGVuZAorICAgICAgIHVwIHByb2R1Y2luZyBzb21lIGxlYWRpbmcgemVyb3M7IGlmIHZkaWdpdHNfZW5kID4gZGlnaXRzX2xlbiB0aGVyZQorICAgICAgIHdpbGwgYmUgdHJhaWxpbmcgemVyb3MgaW4gdGhlIG91dHB1dC4gIFRoZSBuZXh0IHNlY3Rpb24gb2YgY29kZQorICAgICAgIGRldGVybWluZXMgd2hldGhlciB0byB1c2UgYW4gZXhwb25lbnQgb3Igbm90LCBmaWd1cmVzIG91dCB0aGUKKyAgICAgICBwb3NpdGlvbiAnZGVjcHQnIG9mIHRoZSBkZWNpbWFsIHBvaW50LCBhbmQgY29tcHV0ZXMgJ3ZkaWdpdHNfc3RhcnQnCisgICAgICAgYW5kICd2ZGlnaXRzX2VuZCcuICovCisgICAgdmRpZ2l0c19lbmQgPSBkaWdpdHNfbGVuOworICAgIHN3aXRjaCAoZm9ybWF0X2NvZGUpIHsKKyAgICBjYXNlICdlJzoKKyAgICAgICAgdXNlX2V4cCA9IDE7CisgICAgICAgIHZkaWdpdHNfZW5kID0gcHJlY2lzaW9uOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdmJzoKKyAgICAgICAgdmRpZ2l0c19lbmQgPSBkZWNwdCArIHByZWNpc2lvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZyc6CisgICAgICAgIGlmIChkZWNwdCA8PSAtNCB8fCBkZWNwdCA+CisgICAgICAgICAgICAoYWRkX2RvdF8wX2lmX2ludGVnZXIgPyBwcmVjaXNpb24tMSA6IHByZWNpc2lvbikpCisgICAgICAgICAgICB1c2VfZXhwID0gMTsKKyAgICAgICAgaWYgKHVzZV9hbHRfZm9ybWF0dGluZykKKyAgICAgICAgICAgIHZkaWdpdHNfZW5kID0gcHJlY2lzaW9uOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdyJzoKKyAgICAgICAgLyogY29udmVydCB0byBleHBvbmVudGlhbCBmb3JtYXQgYXQgMWUxNi4gIFdlIHVzZWQgdG8gY29udmVydAorICAgICAgICAgICBhdCAxZTE3LCBidXQgdGhhdCBnaXZlcyBvZGQtbG9va2luZyByZXN1bHRzIGZvciBzb21lIHZhbHVlcworICAgICAgICAgICB3aGVuIGEgMTYtZGlnaXQgJ3Nob3J0ZXN0JyByZXByIGlzIHBhZGRlZCB3aXRoIGJvZ3VzIHplcm9zLgorICAgICAgICAgICBGb3IgZXhhbXBsZSwgcmVwcigyZTE2KzgpIHdvdWxkIGdpdmUgMjAwMDAwMDAwMDAwMDAwMTAuMDsKKyAgICAgICAgICAgdGhlIHRydWUgdmFsdWUgaXMgMjAwMDAwMDAwMDAwMDAwMDguMC4gKi8KKyAgICAgICAgaWYgKGRlY3B0IDw9IC00IHx8IGRlY3B0ID4gMTYpCisgICAgICAgICAgICB1c2VfZXhwID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAKLQkvKiBpZiB1c2luZyBhbiBleHBvbmVudCwgcmVzZXQgZGVjaW1hbCBwb2ludCBwb3NpdGlvbiB0byAxIGFuZCBhZGp1c3QKLQkgICBleHBvbmVudCBhY2NvcmRpbmdseS4qLwotCWlmICh1c2VfZXhwKSB7Ci0JCWV4cCA9IGRlY3B0IC0gMTsKLQkJZGVjcHQgPSAxOwotCX0KLQkvKiBlbnN1cmUgdmRpZ2l0c19zdGFydCA8IGRlY3B0IDw9IHZkaWdpdHNfZW5kLCBvciB2ZGlnaXRzX3N0YXJ0IDwKLQkgICBkZWNwdCA8IHZkaWdpdHNfZW5kIGlmIGFkZF9kb3RfMF9pZl9pbnRlZ2VyIGFuZCBubyBleHBvbmVudCAqLwotCXZkaWdpdHNfc3RhcnQgPSBkZWNwdCA8PSAwID8gZGVjcHQtMSA6IDA7Ci0JaWYgKCF1c2VfZXhwICYmIGFkZF9kb3RfMF9pZl9pbnRlZ2VyKQotCQl2ZGlnaXRzX2VuZCA9IHZkaWdpdHNfZW5kID4gZGVjcHQgPyB2ZGlnaXRzX2VuZCA6IGRlY3B0ICsgMTsKLQllbHNlCi0JCXZkaWdpdHNfZW5kID0gdmRpZ2l0c19lbmQgPiBkZWNwdCA/IHZkaWdpdHNfZW5kIDogZGVjcHQ7CisgICAgLyogaWYgdXNpbmcgYW4gZXhwb25lbnQsIHJlc2V0IGRlY2ltYWwgcG9pbnQgcG9zaXRpb24gdG8gMSBhbmQgYWRqdXN0CisgICAgICAgZXhwb25lbnQgYWNjb3JkaW5nbHkuKi8KKyAgICBpZiAodXNlX2V4cCkgeworICAgICAgICBleHAgPSBkZWNwdCAtIDE7CisgICAgICAgIGRlY3B0ID0gMTsKKyAgICB9CisgICAgLyogZW5zdXJlIHZkaWdpdHNfc3RhcnQgPCBkZWNwdCA8PSB2ZGlnaXRzX2VuZCwgb3IgdmRpZ2l0c19zdGFydCA8CisgICAgICAgZGVjcHQgPCB2ZGlnaXRzX2VuZCBpZiBhZGRfZG90XzBfaWZfaW50ZWdlciBhbmQgbm8gZXhwb25lbnQgKi8KKyAgICB2ZGlnaXRzX3N0YXJ0ID0gZGVjcHQgPD0gMCA/IGRlY3B0LTEgOiAwOworICAgIGlmICghdXNlX2V4cCAmJiBhZGRfZG90XzBfaWZfaW50ZWdlcikKKyAgICAgICAgdmRpZ2l0c19lbmQgPSB2ZGlnaXRzX2VuZCA+IGRlY3B0ID8gdmRpZ2l0c19lbmQgOiBkZWNwdCArIDE7CisgICAgZWxzZQorICAgICAgICB2ZGlnaXRzX2VuZCA9IHZkaWdpdHNfZW5kID4gZGVjcHQgPyB2ZGlnaXRzX2VuZCA6IGRlY3B0OwogCi0JLyogZG91YmxlIGNoZWNrIGluZXF1YWxpdGllcyAqLwotCWFzc2VydCh2ZGlnaXRzX3N0YXJ0IDw9IDAgJiYKLQkgICAgICAgMCA8PSBkaWdpdHNfbGVuICYmCi0JICAgICAgIGRpZ2l0c19sZW4gPD0gdmRpZ2l0c19lbmQpOwotCS8qIGRlY2ltYWwgcG9pbnQgc2hvdWxkIGJlIGluICh2ZGlnaXRzX3N0YXJ0LCB2ZGlnaXRzX2VuZF0gKi8KLQlhc3NlcnQodmRpZ2l0c19zdGFydCA8IGRlY3B0ICYmIGRlY3B0IDw9IHZkaWdpdHNfZW5kKTsKKyAgICAvKiBkb3VibGUgY2hlY2sgaW5lcXVhbGl0aWVzICovCisgICAgYXNzZXJ0KHZkaWdpdHNfc3RhcnQgPD0gMCAmJgorICAgICAgICAgICAwIDw9IGRpZ2l0c19sZW4gJiYKKyAgICAgICAgICAgZGlnaXRzX2xlbiA8PSB2ZGlnaXRzX2VuZCk7CisgICAgLyogZGVjaW1hbCBwb2ludCBzaG91bGQgYmUgaW4gKHZkaWdpdHNfc3RhcnQsIHZkaWdpdHNfZW5kXSAqLworICAgIGFzc2VydCh2ZGlnaXRzX3N0YXJ0IDwgZGVjcHQgJiYgZGVjcHQgPD0gdmRpZ2l0c19lbmQpOwogCi0JLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBob3cgbXVjaCBtZW1vcnkgd2UgbmVlZC4gVGhpcyBtaWdodCBiZSBhIGZldwotCSAgIGNoYXJzIHRvbyBsb25nLCBidXQgbm8gYmlnIGRlYWwuICovCi0JYnVmc2l6ZSA9Ci0JCS8qIHNpZ24sIGRlY2ltYWwgcG9pbnQgYW5kIHRyYWlsaW5nIDAgYnl0ZSAqLwotCQkzICsKKyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGhvdyBtdWNoIG1lbW9yeSB3ZSBuZWVkLiBUaGlzIG1pZ2h0IGJlIGEgZmV3CisgICAgICAgY2hhcnMgdG9vIGxvbmcsIGJ1dCBubyBiaWcgZGVhbC4gKi8KKyAgICBidWZzaXplID0KKyAgICAgICAgLyogc2lnbiwgZGVjaW1hbCBwb2ludCBhbmQgdHJhaWxpbmcgMCBieXRlICovCisgICAgICAgIDMgKwogCi0JCS8qIHRvdGFsIGRpZ2l0IGNvdW50IChpbmNsdWRpbmcgemVybyBwYWRkaW5nIG9uIGJvdGggc2lkZXMpICovCi0JCSh2ZGlnaXRzX2VuZCAtIHZkaWdpdHNfc3RhcnQpICsKKyAgICAgICAgLyogdG90YWwgZGlnaXQgY291bnQgKGluY2x1ZGluZyB6ZXJvIHBhZGRpbmcgb24gYm90aCBzaWRlcykgKi8KKyAgICAgICAgKHZkaWdpdHNfZW5kIC0gdmRpZ2l0c19zdGFydCkgKwogCi0JCS8qIGV4cG9uZW50ICJlKzEwMCIsIG1heCAzIG51bWVyaWNhbCBkaWdpdHMgKi8KLQkJKHVzZV9leHAgPyA1IDogMCk7CisgICAgICAgIC8qIGV4cG9uZW50ICJlKzEwMCIsIG1heCAzIG51bWVyaWNhbCBkaWdpdHMgKi8KKyAgICAgICAgKHVzZV9leHAgPyA1IDogMCk7CiAKLQkvKiBOb3cgYWxsb2NhdGUgdGhlIG1lbW9yeSBhbmQgaW5pdGlhbGl6ZSBwIHRvIHBvaW50IHRvIHRoZSBzdGFydCBvZgotCSAgIGl0LiAqLwotCWJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKGJ1ZnNpemUpOwotCWlmIChidWYgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXAgPSBidWY7CisgICAgLyogTm93IGFsbG9jYXRlIHRoZSBtZW1vcnkgYW5kIGluaXRpYWxpemUgcCB0byBwb2ludCB0byB0aGUgc3RhcnQgb2YKKyAgICAgICBpdC4gKi8KKyAgICBidWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhidWZzaXplKTsKKyAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBwID0gYnVmOwogCi0JLyogQWRkIGEgbmVnYXRpdmUgc2lnbiBpZiBuZWdhdGl2ZSwgYW5kIGEgcGx1cyBzaWduIGlmIG5vbi1uZWdhdGl2ZQotCSAgIGFuZCBhbHdheXNfYWRkX3NpZ24gaXMgdHJ1ZS4gKi8KLQlpZiAoc2lnbiA9PSAxKQotCQkqcCsrID0gJy0nOwotCWVsc2UgaWYgKGFsd2F5c19hZGRfc2lnbikKLQkJKnArKyA9ICcrJzsKKyAgICAvKiBBZGQgYSBuZWdhdGl2ZSBzaWduIGlmIG5lZ2F0aXZlLCBhbmQgYSBwbHVzIHNpZ24gaWYgbm9uLW5lZ2F0aXZlCisgICAgICAgYW5kIGFsd2F5c19hZGRfc2lnbiBpcyB0cnVlLiAqLworICAgIGlmIChzaWduID09IDEpCisgICAgICAgICpwKysgPSAnLSc7CisgICAgZWxzZSBpZiAoYWx3YXlzX2FkZF9zaWduKQorICAgICAgICAqcCsrID0gJysnOwogCi0JLyogbm90ZSB0aGF0IGV4YWN0bHkgb25lIG9mIHRoZSB0aHJlZSAnaWYnIGNvbmRpdGlvbnMgaXMgdHJ1ZSwKLQkgICBzbyB3ZSBpbmNsdWRlIGV4YWN0bHkgb25lIGRlY2ltYWwgcG9pbnQgKi8KLQkvKiBaZXJvIHBhZGRpbmcgb24gbGVmdCBvZiBkaWdpdCBzdHJpbmcgKi8KLQlpZiAoZGVjcHQgPD0gMCkgewotCQltZW1zZXQocCwgJzAnLCBkZWNwdC12ZGlnaXRzX3N0YXJ0KTsKLQkJcCArPSBkZWNwdCAtIHZkaWdpdHNfc3RhcnQ7Ci0JCSpwKysgPSAnLic7Ci0JCW1lbXNldChwLCAnMCcsIDAtZGVjcHQpOwotCQlwICs9IDAtZGVjcHQ7Ci0JfQotCWVsc2UgewotCQltZW1zZXQocCwgJzAnLCAwLXZkaWdpdHNfc3RhcnQpOwotCQlwICs9IDAgLSB2ZGlnaXRzX3N0YXJ0OwotCX0KKyAgICAvKiBub3RlIHRoYXQgZXhhY3RseSBvbmUgb2YgdGhlIHRocmVlICdpZicgY29uZGl0aW9ucyBpcyB0cnVlLAorICAgICAgIHNvIHdlIGluY2x1ZGUgZXhhY3RseSBvbmUgZGVjaW1hbCBwb2ludCAqLworICAgIC8qIFplcm8gcGFkZGluZyBvbiBsZWZ0IG9mIGRpZ2l0IHN0cmluZyAqLworICAgIGlmIChkZWNwdCA8PSAwKSB7CisgICAgICAgIG1lbXNldChwLCAnMCcsIGRlY3B0LXZkaWdpdHNfc3RhcnQpOworICAgICAgICBwICs9IGRlY3B0IC0gdmRpZ2l0c19zdGFydDsKKyAgICAgICAgKnArKyA9ICcuJzsKKyAgICAgICAgbWVtc2V0KHAsICcwJywgMC1kZWNwdCk7CisgICAgICAgIHAgKz0gMC1kZWNwdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG1lbXNldChwLCAnMCcsIDAtdmRpZ2l0c19zdGFydCk7CisgICAgICAgIHAgKz0gMCAtIHZkaWdpdHNfc3RhcnQ7CisgICAgfQogCi0JLyogRGlnaXRzLCB3aXRoIGluY2x1ZGVkIGRlY2ltYWwgcG9pbnQgKi8KLQlpZiAoMCA8IGRlY3B0ICYmIGRlY3B0IDw9IGRpZ2l0c19sZW4pIHsKLQkJc3RybmNweShwLCBkaWdpdHMsIGRlY3B0LTApOwotCQlwICs9IGRlY3B0LTA7Ci0JCSpwKysgPSAnLic7Ci0JCXN0cm5jcHkocCwgZGlnaXRzK2RlY3B0LCBkaWdpdHNfbGVuLWRlY3B0KTsKLQkJcCArPSBkaWdpdHNfbGVuLWRlY3B0OwotCX0KLQllbHNlIHsKLQkJc3RybmNweShwLCBkaWdpdHMsIGRpZ2l0c19sZW4pOwotCQlwICs9IGRpZ2l0c19sZW47Ci0JfQorICAgIC8qIERpZ2l0cywgd2l0aCBpbmNsdWRlZCBkZWNpbWFsIHBvaW50ICovCisgICAgaWYgKDAgPCBkZWNwdCAmJiBkZWNwdCA8PSBkaWdpdHNfbGVuKSB7CisgICAgICAgIHN0cm5jcHkocCwgZGlnaXRzLCBkZWNwdC0wKTsKKyAgICAgICAgcCArPSBkZWNwdC0wOworICAgICAgICAqcCsrID0gJy4nOworICAgICAgICBzdHJuY3B5KHAsIGRpZ2l0cytkZWNwdCwgZGlnaXRzX2xlbi1kZWNwdCk7CisgICAgICAgIHAgKz0gZGlnaXRzX2xlbi1kZWNwdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0cm5jcHkocCwgZGlnaXRzLCBkaWdpdHNfbGVuKTsKKyAgICAgICAgcCArPSBkaWdpdHNfbGVuOworICAgIH0KIAotCS8qIEFuZCB6ZXJvcyBvbiB0aGUgcmlnaHQgKi8KLQlpZiAoZGlnaXRzX2xlbiA8IGRlY3B0KSB7Ci0JCW1lbXNldChwLCAnMCcsIGRlY3B0LWRpZ2l0c19sZW4pOwotCQlwICs9IGRlY3B0LWRpZ2l0c19sZW47Ci0JCSpwKysgPSAnLic7Ci0JCW1lbXNldChwLCAnMCcsIHZkaWdpdHNfZW5kLWRlY3B0KTsKLQkJcCArPSB2ZGlnaXRzX2VuZC1kZWNwdDsKLQl9Ci0JZWxzZSB7Ci0JCW1lbXNldChwLCAnMCcsIHZkaWdpdHNfZW5kLWRpZ2l0c19sZW4pOwotCQlwICs9IHZkaWdpdHNfZW5kLWRpZ2l0c19sZW47Ci0JfQorICAgIC8qIEFuZCB6ZXJvcyBvbiB0aGUgcmlnaHQgKi8KKyAgICBpZiAoZGlnaXRzX2xlbiA8IGRlY3B0KSB7CisgICAgICAgIG1lbXNldChwLCAnMCcsIGRlY3B0LWRpZ2l0c19sZW4pOworICAgICAgICBwICs9IGRlY3B0LWRpZ2l0c19sZW47CisgICAgICAgICpwKysgPSAnLic7CisgICAgICAgIG1lbXNldChwLCAnMCcsIHZkaWdpdHNfZW5kLWRlY3B0KTsKKyAgICAgICAgcCArPSB2ZGlnaXRzX2VuZC1kZWNwdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG1lbXNldChwLCAnMCcsIHZkaWdpdHNfZW5kLWRpZ2l0c19sZW4pOworICAgICAgICBwICs9IHZkaWdpdHNfZW5kLWRpZ2l0c19sZW47CisgICAgfQogCi0JLyogRGVsZXRlIGEgdHJhaWxpbmcgZGVjaW1hbCBwdCB1bmxlc3MgdXNpbmcgYWx0ZXJuYXRpdmUgZm9ybWF0dGluZy4gKi8KLQlpZiAocFstMV0gPT0gJy4nICYmICF1c2VfYWx0X2Zvcm1hdHRpbmcpCi0JCXAtLTsKKyAgICAvKiBEZWxldGUgYSB0cmFpbGluZyBkZWNpbWFsIHB0IHVubGVzcyB1c2luZyBhbHRlcm5hdGl2ZSBmb3JtYXR0aW5nLiAqLworICAgIGlmIChwWy0xXSA9PSAnLicgJiYgIXVzZV9hbHRfZm9ybWF0dGluZykKKyAgICAgICAgcC0tOwogCi0JLyogTm93IHRoYXQgd2UndmUgZG9uZSB6ZXJvIHBhZGRpbmcsIGFkZCBhbiBleHBvbmVudCBpZiBuZWVkZWQuICovCi0JaWYgKHVzZV9leHApIHsKLQkJKnArKyA9IGZsb2F0X3N0cmluZ3NbT0ZTX0VdWzBdOwotCQlleHBfbGVuID0gc3ByaW50ZihwLCAiJSsuMDJkIiwgZXhwKTsKLQkJcCArPSBleHBfbGVuOwotCX0KKyAgICAvKiBOb3cgdGhhdCB3ZSd2ZSBkb25lIHplcm8gcGFkZGluZywgYWRkIGFuIGV4cG9uZW50IGlmIG5lZWRlZC4gKi8KKyAgICBpZiAodXNlX2V4cCkgeworICAgICAgICAqcCsrID0gZmxvYXRfc3RyaW5nc1tPRlNfRV1bMF07CisgICAgICAgIGV4cF9sZW4gPSBzcHJpbnRmKHAsICIlKy4wMmQiLCBleHApOworICAgICAgICBwICs9IGV4cF9sZW47CisgICAgfQogICBleGl0OgotCWlmIChidWYpIHsKLQkJKnAgPSAnXDAnOwotCQkvKiBJdCdzIHRvbyBsYXRlIGlmIHRoaXMgZmFpbHMsIGFzIHdlJ3ZlIGFscmVhZHkgc3RlcHBlZCBvbgotCQkgICBtZW1vcnkgdGhhdCBpc24ndCBvdXJzLiBCdXQgaXQncyBhbiBva2F5IGRlYnVnZ2luZyB0ZXN0LiAqLwotCQlhc3NlcnQocC1idWYgPCBidWZzaXplKTsKLQl9Ci0JaWYgKGRpZ2l0cykKLQkJX1B5X2RnX2ZyZWVkdG9hKGRpZ2l0cyk7CisgICAgaWYgKGJ1ZikgeworICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgIC8qIEl0J3MgdG9vIGxhdGUgaWYgdGhpcyBmYWlscywgYXMgd2UndmUgYWxyZWFkeSBzdGVwcGVkIG9uCisgICAgICAgICAgIG1lbW9yeSB0aGF0IGlzbid0IG91cnMuIEJ1dCBpdCdzIGFuIG9rYXkgZGVidWdnaW5nIHRlc3QuICovCisgICAgICAgIGFzc2VydChwLWJ1ZiA8IGJ1ZnNpemUpOworICAgIH0KKyAgICBpZiAoZGlnaXRzKQorICAgICAgICBfUHlfZGdfZnJlZWR0b2EoZGlnaXRzKTsKIAotCXJldHVybiBidWY7CisgICAgcmV0dXJuIGJ1ZjsKIH0KIAogCiBQeUFQSV9GVU5DKGNoYXIgKikgUHlPU19kb3VibGVfdG9fc3RyaW5nKGRvdWJsZSB2YWwsCi0JCQkJCSBjaGFyIGZvcm1hdF9jb2RlLAotCQkJCQkgaW50IHByZWNpc2lvbiwKLQkJCQkJIGludCBmbGFncywKLQkJCQkJIGludCAqdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmb3JtYXRfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnR5cGUpCiB7Ci0JY2hhciAqKmZsb2F0X3N0cmluZ3MgPSBsY19mbG9hdF9zdHJpbmdzOwotCWludCBtb2RlOworICAgIGNoYXIgKipmbG9hdF9zdHJpbmdzID0gbGNfZmxvYXRfc3RyaW5nczsKKyAgICBpbnQgbW9kZTsKIAotCS8qIFZhbGlkYXRlIGZvcm1hdF9jb2RlLCBhbmQgbWFwIHVwcGVyIGFuZCBsb3dlciBjYXNlLiBDb21wdXRlIHRoZQotCSAgIG1vZGUgYW5kIG1ha2UgYW55IGFkanVzdG1lbnRzIGFzIG5lZWRlZC4gKi8KLQlzd2l0Y2ggKGZvcm1hdF9jb2RlKSB7Ci0JLyogZXhwb25lbnQgKi8KLQljYXNlICdFJzoKLQkJZmxvYXRfc3RyaW5ncyA9IHVjX2Zsb2F0X3N0cmluZ3M7Ci0JCWZvcm1hdF9jb2RlID0gJ2UnOwotCQkvKiBGYWxsIHRocm91Z2guICovCi0JY2FzZSAnZSc6Ci0JCW1vZGUgPSAyOwotCQlwcmVjaXNpb24rKzsKLQkJYnJlYWs7CisgICAgLyogVmFsaWRhdGUgZm9ybWF0X2NvZGUsIGFuZCBtYXAgdXBwZXIgYW5kIGxvd2VyIGNhc2UuIENvbXB1dGUgdGhlCisgICAgICAgbW9kZSBhbmQgbWFrZSBhbnkgYWRqdXN0bWVudHMgYXMgbmVlZGVkLiAqLworICAgIHN3aXRjaCAoZm9ybWF0X2NvZGUpIHsKKyAgICAvKiBleHBvbmVudCAqLworICAgIGNhc2UgJ0UnOgorICAgICAgICBmbG9hdF9zdHJpbmdzID0gdWNfZmxvYXRfc3RyaW5nczsKKyAgICAgICAgZm9ybWF0X2NvZGUgPSAnZSc7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4gKi8KKyAgICBjYXNlICdlJzoKKyAgICAgICAgbW9kZSA9IDI7CisgICAgICAgIHByZWNpc2lvbisrOworICAgICAgICBicmVhazsKIAotCS8qIGZpeGVkICovCi0JY2FzZSAnRic6Ci0JCWZsb2F0X3N0cmluZ3MgPSB1Y19mbG9hdF9zdHJpbmdzOwotCQlmb3JtYXRfY29kZSA9ICdmJzsKLQkJLyogRmFsbCB0aHJvdWdoLiAqLwotCWNhc2UgJ2YnOgotCQltb2RlID0gMzsKLQkJYnJlYWs7CisgICAgLyogZml4ZWQgKi8KKyAgICBjYXNlICdGJzoKKyAgICAgICAgZmxvYXRfc3RyaW5ncyA9IHVjX2Zsb2F0X3N0cmluZ3M7CisgICAgICAgIGZvcm1hdF9jb2RlID0gJ2YnOworICAgICAgICAvKiBGYWxsIHRocm91Z2guICovCisgICAgY2FzZSAnZic6CisgICAgICAgIG1vZGUgPSAzOworICAgICAgICBicmVhazsKIAotCS8qIGdlbmVyYWwgKi8KLQljYXNlICdHJzoKLQkJZmxvYXRfc3RyaW5ncyA9IHVjX2Zsb2F0X3N0cmluZ3M7Ci0JCWZvcm1hdF9jb2RlID0gJ2cnOwotCQkvKiBGYWxsIHRocm91Z2guICovCi0JY2FzZSAnZyc6Ci0JCW1vZGUgPSAyOwotCQkvKiBwcmVjaXNpb24gMCBtYWtlcyBubyBzZW5zZSBmb3IgJ2cnIGZvcm1hdDsgaW50ZXJwcmV0IGFzIDEgKi8KLQkJaWYgKHByZWNpc2lvbiA9PSAwKQotCQkJcHJlY2lzaW9uID0gMTsKLQkJYnJlYWs7CisgICAgLyogZ2VuZXJhbCAqLworICAgIGNhc2UgJ0cnOgorICAgICAgICBmbG9hdF9zdHJpbmdzID0gdWNfZmxvYXRfc3RyaW5nczsKKyAgICAgICAgZm9ybWF0X2NvZGUgPSAnZyc7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4gKi8KKyAgICBjYXNlICdnJzoKKyAgICAgICAgbW9kZSA9IDI7CisgICAgICAgIC8qIHByZWNpc2lvbiAwIG1ha2VzIG5vIHNlbnNlIGZvciAnZycgZm9ybWF0OyBpbnRlcnByZXQgYXMgMSAqLworICAgICAgICBpZiAocHJlY2lzaW9uID09IDApCisgICAgICAgICAgICBwcmVjaXNpb24gPSAxOworICAgICAgICBicmVhazsKIAotCS8qIHJlcHIgZm9ybWF0ICovCi0JY2FzZSAncic6Ci0JCW1vZGUgPSAwOwotCQkvKiBTdXBwbGllZCBwcmVjaXNpb24gaXMgdW51c2VkLCBtdXN0IGJlIDAuICovCi0JCWlmIChwcmVjaXNpb24gIT0gMCkgewotCQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlicmVhazsKKyAgICAvKiByZXByIGZvcm1hdCAqLworICAgIGNhc2UgJ3InOgorICAgICAgICBtb2RlID0gMDsKKyAgICAgICAgLyogU3VwcGxpZWQgcHJlY2lzaW9uIGlzIHVudXNlZCwgbXVzdCBiZSAwLiAqLworICAgICAgICBpZiAocHJlY2lzaW9uICE9IDApIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLQlkZWZhdWx0OgotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gZm9ybWF0X2Zsb2F0X3Nob3J0KHZhbCwgZm9ybWF0X2NvZGUsIG1vZGUsIHByZWNpc2lvbiwKLQkJCQkgIGZsYWdzICYgUHlfRFRTRl9TSUdOLAotCQkJCSAgZmxhZ3MgJiBQeV9EVFNGX0FERF9ET1RfMCwKLQkJCQkgIGZsYWdzICYgUHlfRFRTRl9BTFQsCi0JCQkJICBmbG9hdF9zdHJpbmdzLCB0eXBlKTsKKyAgICByZXR1cm4gZm9ybWF0X2Zsb2F0X3Nob3J0KHZhbCwgZm9ybWF0X2NvZGUsIG1vZGUsIHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgUHlfRFRTRl9TSUdOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBQeV9EVFNGX0FERF9ET1RfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgUHlfRFRTRl9BTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdF9zdHJpbmdzLCB0eXBlKTsKIH0KICNlbmRpZiAvKiBpZmRlZiBQWV9OT19TSE9SVF9GTE9BVF9SRVBSICovCmRpZmYgLS1naXQgYS9QeXRob24vcHl0aG9ucnVuLmMgYi9QeXRob24vcHl0aG9ucnVuLmMKaW5kZXggNzFhNTNlYS4uZjIwMzYxOCAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5dGhvbnJ1bi5jCisrKyBiL1B5dGhvbi9weXRob25ydW4uYwpAQCAtNDAsOSArNDAsOSBAQAogI2lmbmRlZiBQeV9SRUZfREVCVUcKICNkZWZpbmUgUFJJTlRfVE9UQUxfUkVGUygpCiAjZWxzZSAvKiBQeV9SRUZfREVCVUcgKi8KLSNkZWZpbmUgUFJJTlRfVE9UQUxfUkVGUygpIGZwcmludGYoc3RkZXJyLAkJCQlcCi0JCQkJICAgIlslIiBQWV9GT1JNQVRfU0laRV9UICJkIHJlZnNdXG4iLAlcCi0JCQkJICAgX1B5X0dldFJlZlRvdGFsKCkpCisjZGVmaW5lIFBSSU5UX1RPVEFMX1JFRlMoKSBmcHJpbnRmKHN0ZGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIlslIiBQWV9GT1JNQVRfU0laRV9UICJkIHJlZnNdXG4iLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgX1B5X0dldFJlZlRvdGFsKCkpCiAjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCkBAIC01Nyw5ICs1Nyw5IEBACiBzdGF0aWMgdm9pZCBpbml0bWFpbih2b2lkKTsKIHN0YXRpYyB2b2lkIGluaXRzaXRlKHZvaWQpOwogc3RhdGljIFB5T2JqZWN0ICpydW5fbW9kKG1vZF90eSwgY29uc3QgY2hhciAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqLAotCQkJICBQeUNvbXBpbGVyRmxhZ3MgKiwgUHlBcmVuYSAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICosIFB5QXJlbmEgKik7CiBzdGF0aWMgUHlPYmplY3QgKnJ1bl9weWNfZmlsZShGSUxFICosIGNvbnN0IGNoYXIgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKLQkJCSAgICAgIFB5Q29tcGlsZXJGbGFncyAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqKTsKIHN0YXRpYyB2b2lkIGVycl9pbnB1dChwZXJyZGV0YWlsICopOwogc3RhdGljIHZvaWQgaW5pdHNpZ3Modm9pZCk7CiBzdGF0aWMgdm9pZCB3YWl0X2Zvcl90aHJlYWRfc2h1dGRvd24odm9pZCk7CkBAIC05NSw3ICs5NSw3IEBACiBQeU9iamVjdCAqCiBQeU1vZHVsZV9HZXRXYXJuaW5nc01vZHVsZSh2b2lkKQogewotCXJldHVybiBQeUltcG9ydF9JbXBvcnRNb2R1bGUoIndhcm5pbmdzIik7CisgICAgcmV0dXJuIFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgid2FybmluZ3MiKTsKIH0KIAogc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CkBAIC0xMDUsNyArMTA1LDcgQEAKIGludAogUHlfSXNJbml0aWFsaXplZCh2b2lkKQogewotCXJldHVybiBpbml0aWFsaXplZDsKKyAgICByZXR1cm4gaW5pdGlhbGl6ZWQ7CiB9CiAKIC8qIEdsb2JhbCBpbml0aWFsaXphdGlvbnMuICBDYW4gYmUgdW5kb25lIGJ5IFB5X0ZpbmFsaXplKCkuICBEb24ndApAQCAtMTIzLDI1MSArMTIzLDI1MSBAQAogc3RhdGljIGludAogYWRkX2ZsYWcoaW50IGZsYWcsIGNvbnN0IGNoYXIgKmVudnMpCiB7Ci0JaW50IGVudiA9IGF0b2koZW52cyk7Ci0JaWYgKGZsYWcgPCBlbnYpCi0JCWZsYWcgPSBlbnY7Ci0JaWYgKGZsYWcgPCAxKQotCQlmbGFnID0gMTsKLQlyZXR1cm4gZmxhZzsKKyAgICBpbnQgZW52ID0gYXRvaShlbnZzKTsKKyAgICBpZiAoZmxhZyA8IGVudikKKyAgICAgICAgZmxhZyA9IGVudjsKKyAgICBpZiAoZmxhZyA8IDEpCisgICAgICAgIGZsYWcgPSAxOworICAgIHJldHVybiBmbGFnOwogfQogCiB2b2lkCiBQeV9Jbml0aWFsaXplRXgoaW50IGluc3RhbGxfc2lncykKIHsKLQlQeUludGVycHJldGVyU3RhdGUgKmludGVycDsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGU7Ci0JUHlPYmplY3QgKmJpbW9kLCAqc3lzbW9kOwotCWNoYXIgKnA7Ci0JY2hhciAqaWNvZGVzZXQgPSBOVUxMOyAvKiBPbiBXaW5kb3dzLCBpbnB1dCBjb2Rlc2V0IG1heSB0aGVvcmV0aWNhbGx5Ci0JCQkgICAgICAgICAgZGlmZmVyIGZyb20gb3V0cHV0IGNvZGVzZXQuICovCi0JY2hhciAqY29kZXNldCA9IE5VTEw7Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKLQlpbnQgZnJlZV9jb2Rlc2V0ID0gMDsKLQlpbnQgb3ZlcnJpZGRlbiA9IDA7Ci0JUHlPYmplY3QgKnN5c19zdHJlYW0sICpzeXNfaXNhdHR5OworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBQeU9iamVjdCAqYmltb2QsICpzeXNtb2Q7CisgICAgY2hhciAqcDsKKyAgICBjaGFyICppY29kZXNldCA9IE5VTEw7IC8qIE9uIFdpbmRvd3MsIGlucHV0IGNvZGVzZXQgbWF5IHRoZW9yZXRpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlciBmcm9tIG91dHB1dCBjb2Rlc2V0LiAqLworICAgIGNoYXIgKmNvZGVzZXQgPSBOVUxMOworICAgIGNoYXIgKmVycm9ycyA9IE5VTEw7CisgICAgaW50IGZyZWVfY29kZXNldCA9IDA7CisgICAgaW50IG92ZXJyaWRkZW4gPSAwOworICAgIFB5T2JqZWN0ICpzeXNfc3RyZWFtLCAqc3lzX2lzYXR0eTsKICNpZiBkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpICYmIGRlZmluZWQoSEFWRV9MQU5HSU5GT19IKSAmJiBkZWZpbmVkKENPREVTRVQpCi0JY2hhciAqc2F2ZWRfbG9jYWxlLCAqbG9jX2NvZGVzZXQ7CisgICAgY2hhciAqc2F2ZWRfbG9jYWxlLCAqbG9jX2NvZGVzZXQ7CiAjZW5kaWYKICNpZmRlZiBNU19XSU5ET1dTCi0JY2hhciBpYnVmWzEyOF07Ci0JY2hhciBidWZbMTI4XTsKKyAgICBjaGFyIGlidWZbMTI4XTsKKyAgICBjaGFyIGJ1ZlsxMjhdOwogI2VuZGlmCi0JZXh0ZXJuIHZvaWQgX1B5X1JlYWR5VHlwZXModm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgX1B5X1JlYWR5VHlwZXModm9pZCk7CiAKLQlpZiAoaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQlpbml0aWFsaXplZCA9IDE7CisgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisgICAgaW5pdGlhbGl6ZWQgPSAxOwogCi0JaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05ERUJVRyIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9EZWJ1Z0ZsYWcgPSBhZGRfZmxhZyhQeV9EZWJ1Z0ZsYWcsIHApOwotCWlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OVkVSQk9TRSIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9WZXJib3NlRmxhZyA9IGFkZF9mbGFnKFB5X1ZlcmJvc2VGbGFnLCBwKTsKLQlpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTk9QVElNSVpFIikpICYmICpwICE9ICdcMCcpCi0JCVB5X09wdGltaXplRmxhZyA9IGFkZF9mbGFnKFB5X09wdGltaXplRmxhZywgcCk7Ci0JaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05ET05UV1JJVEVCWVRFQ09ERSIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9Eb250V3JpdGVCeXRlY29kZUZsYWcgPSBhZGRfZmxhZyhQeV9Eb250V3JpdGVCeXRlY29kZUZsYWcsIHApOworICAgIGlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OREVCVUciKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfRGVidWdGbGFnID0gYWRkX2ZsYWcoUHlfRGVidWdGbGFnLCBwKTsKKyAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTlZFUkJPU0UiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfVmVyYm9zZUZsYWcgPSBhZGRfZmxhZyhQeV9WZXJib3NlRmxhZywgcCk7CisgICAgaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05PUFRJTUlaRSIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICBQeV9PcHRpbWl6ZUZsYWcgPSBhZGRfZmxhZyhQeV9PcHRpbWl6ZUZsYWcsIHApOworICAgIGlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9ORE9OVFdSSVRFQllURUNPREUiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnID0gYWRkX2ZsYWcoUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnLCBwKTsKIAotCWludGVycCA9IFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcoKTsKLQlpZiAoaW50ZXJwID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IG1ha2UgZmlyc3QgaW50ZXJwcmV0ZXIiKTsKKyAgICBpbnRlcnAgPSBQeUludGVycHJldGVyU3RhdGVfTmV3KCk7CisgICAgaWYgKGludGVycCA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBtYWtlIGZpcnN0IGludGVycHJldGVyIik7CiAKLQl0c3RhdGUgPSBQeVRocmVhZFN0YXRlX05ldyhpbnRlcnApOwotCWlmICh0c3RhdGUgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgbWFrZSBmaXJzdCB0aHJlYWQiKTsKLQkodm9pZCkgUHlUaHJlYWRTdGF0ZV9Td2FwKHRzdGF0ZSk7CisgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9OZXcoaW50ZXJwKTsKKyAgICBpZiAodHN0YXRlID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IG1ha2UgZmlyc3QgdGhyZWFkIik7CisgICAgKHZvaWQpIFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpOwogCi0JX1B5X1JlYWR5VHlwZXMoKTsKKyAgICBfUHlfUmVhZHlUeXBlcygpOwogCi0JaWYgKCFfUHlGcmFtZV9Jbml0KCkpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXQgZnJhbWVzIik7CisgICAgaWYgKCFfUHlGcmFtZV9Jbml0KCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXQgZnJhbWVzIik7CiAKLQlpZiAoIV9QeUludF9Jbml0KCkpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXQgaW50cyIpOworICAgIGlmICghX1B5SW50X0luaXQoKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdCBpbnRzIik7CiAKLQlpZiAoIV9QeUxvbmdfSW5pdCgpKQotCQlQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0IGxvbmdzIik7CisgICAgaWYgKCFfUHlMb25nX0luaXQoKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdCBsb25ncyIpOwogCi0JaWYgKCFQeUJ5dGVBcnJheV9Jbml0KCkpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXQgYnl0ZWFycmF5Iik7CisgICAgaWYgKCFQeUJ5dGVBcnJheV9Jbml0KCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXQgYnl0ZWFycmF5Iik7CiAKLQlfUHlGbG9hdF9Jbml0KCk7CisgICAgX1B5RmxvYXRfSW5pdCgpOwogCi0JaW50ZXJwLT5tb2R1bGVzID0gUHlEaWN0X05ldygpOwotCWlmIChpbnRlcnAtPm1vZHVsZXMgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgbWFrZSBtb2R1bGVzIGRpY3Rpb25hcnkiKTsKLQlpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nID0gUHlEaWN0X05ldygpOwotCWlmIChpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IG1ha2UgbW9kdWxlc19yZWxvYWRpbmcgZGljdGlvbmFyeSIpOworICAgIGludGVycC0+bW9kdWxlcyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoaW50ZXJwLT5tb2R1bGVzID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IG1ha2UgbW9kdWxlcyBkaWN0aW9uYXJ5Iik7CisgICAgaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBtYWtlIG1vZHVsZXNfcmVsb2FkaW5nIGRpY3Rpb25hcnkiKTsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkvKiBJbml0IFVuaWNvZGUgaW1wbGVtZW50YXRpb247IHJlbGllcyBvbiB0aGUgY29kZWMgcmVnaXN0cnkgKi8KLQlfUHlVbmljb2RlX0luaXQoKTsKKyAgICAvKiBJbml0IFVuaWNvZGUgaW1wbGVtZW50YXRpb247IHJlbGllcyBvbiB0aGUgY29kZWMgcmVnaXN0cnkgKi8KKyAgICBfUHlVbmljb2RlX0luaXQoKTsKICNlbmRpZgogCi0JYmltb2QgPSBfUHlCdWlsdGluX0luaXQoKTsKLQlpZiAoYmltb2QgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdGlhbGl6ZSBfX2J1aWx0aW5fXyIpOwotCWludGVycC0+YnVpbHRpbnMgPSBQeU1vZHVsZV9HZXREaWN0KGJpbW9kKTsKLQlpZiAoaW50ZXJwLT5idWlsdGlucyA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIGJ1aWx0aW5zIGRpY3QiKTsKLQlQeV9JTkNSRUYoaW50ZXJwLT5idWlsdGlucyk7CisgICAgYmltb2QgPSBfUHlCdWlsdGluX0luaXQoKTsKKyAgICBpZiAoYmltb2QgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdGlhbGl6ZSBfX2J1aWx0aW5fXyIpOworICAgIGludGVycC0+YnVpbHRpbnMgPSBQeU1vZHVsZV9HZXREaWN0KGJpbW9kKTsKKyAgICBpZiAoaW50ZXJwLT5idWlsdGlucyA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIGJ1aWx0aW5zIGRpY3QiKTsKKyAgICBQeV9JTkNSRUYoaW50ZXJwLT5idWlsdGlucyk7CiAKLQlzeXNtb2QgPSBfUHlTeXNfSW5pdCgpOwotCWlmIChzeXNtb2QgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdGlhbGl6ZSBzeXMiKTsKLQlpbnRlcnAtPnN5c2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KHN5c21vZCk7Ci0JaWYgKGludGVycC0+c3lzZGljdCA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIHN5cyBkaWN0Iik7Ci0JUHlfSU5DUkVGKGludGVycC0+c3lzZGljdCk7Ci0JX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKCJzeXMiLCAic3lzIik7Ci0JUHlTeXNfU2V0UGF0aChQeV9HZXRQYXRoKCkpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGludGVycC0+c3lzZGljdCwgIm1vZHVsZXMiLAotCQkJICAgICBpbnRlcnAtPm1vZHVsZXMpOworICAgIHN5c21vZCA9IF9QeVN5c19Jbml0KCk7CisgICAgaWYgKHN5c21vZCA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIHN5cyIpOworICAgIGludGVycC0+c3lzZGljdCA9IFB5TW9kdWxlX0dldERpY3Qoc3lzbW9kKTsKKyAgICBpZiAoaW50ZXJwLT5zeXNkaWN0ID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXRpYWxpemUgc3lzIGRpY3QiKTsKKyAgICBQeV9JTkNSRUYoaW50ZXJwLT5zeXNkaWN0KTsKKyAgICBfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oInN5cyIsICJzeXMiKTsKKyAgICBQeVN5c19TZXRQYXRoKFB5X0dldFBhdGgoKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoaW50ZXJwLT5zeXNkaWN0LCAibW9kdWxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwLT5tb2R1bGVzKTsKIAotCV9QeUltcG9ydF9Jbml0KCk7CisgICAgX1B5SW1wb3J0X0luaXQoKTsKIAotCS8qIGluaXRpYWxpemUgYnVpbHRpbiBleGNlcHRpb25zICovCi0JX1B5RXhjX0luaXQoKTsKLQlfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oImV4Y2VwdGlvbnMiLCAiZXhjZXB0aW9ucyIpOworICAgIC8qIGluaXRpYWxpemUgYnVpbHRpbiBleGNlcHRpb25zICovCisgICAgX1B5RXhjX0luaXQoKTsKKyAgICBfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oImV4Y2VwdGlvbnMiLCAiZXhjZXB0aW9ucyIpOwogCi0JLyogcGhhc2UgMiBvZiBidWlsdGlucyAqLwotCV9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbigiX19idWlsdGluX18iLCAiX19idWlsdGluX18iKTsKKyAgICAvKiBwaGFzZSAyIG9mIGJ1aWx0aW5zICovCisgICAgX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKCJfX2J1aWx0aW5fXyIsICJfX2J1aWx0aW5fXyIpOwogCi0JX1B5SW1wb3J0SG9va3NfSW5pdCgpOworICAgIF9QeUltcG9ydEhvb2tzX0luaXQoKTsKIAotCWlmIChpbnN0YWxsX3NpZ3MpCi0JCWluaXRzaWdzKCk7IC8qIFNpZ25hbCBoYW5kbGluZyBzdHVmZiwgaW5jbHVkaW5nIGluaXRpbnRyKCkgKi8KKyAgICBpZiAoaW5zdGFsbF9zaWdzKQorICAgICAgICBpbml0c2lncygpOyAvKiBTaWduYWwgaGFuZGxpbmcgc3R1ZmYsIGluY2x1ZGluZyBpbml0aW50cigpICovCiAKLQkvKiBJbml0aWFsaXplIHdhcm5pbmdzLiAqLwotCV9QeVdhcm5pbmdzX0luaXQoKTsKLQlpZiAoUHlTeXNfSGFzV2Fybk9wdGlvbnMoKSkgewotCQlQeU9iamVjdCAqd2FybmluZ3NfbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJ3YXJuaW5ncyIpOwotCQlpZiAoIXdhcm5pbmdzX21vZHVsZSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X1hERUNSRUYod2FybmluZ3NfbW9kdWxlKTsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB3YXJuaW5ncy4gKi8KKyAgICBfUHlXYXJuaW5nc19Jbml0KCk7CisgICAgaWYgKFB5U3lzX0hhc1dhcm5PcHRpb25zKCkpIHsKKyAgICAgICAgUHlPYmplY3QgKndhcm5pbmdzX21vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgid2FybmluZ3MiKTsKKyAgICAgICAgaWYgKCF3YXJuaW5nc19tb2R1bGUpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9YREVDUkVGKHdhcm5pbmdzX21vZHVsZSk7CisgICAgfQogCi0JaW5pdG1haW4oKTsgLyogTW9kdWxlIF9fbWFpbl9fICovCisgICAgaW5pdG1haW4oKTsgLyogTW9kdWxlIF9fbWFpbl9fICovCiAKLQkvKiBhdXRvLXRocmVhZC1zdGF0ZSBBUEksIGlmIGF2YWlsYWJsZSAqLworICAgIC8qIGF1dG8tdGhyZWFkLXN0YXRlIEFQSSwgaWYgYXZhaWxhYmxlICovCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlfUHlHSUxTdGF0ZV9Jbml0KGludGVycCwgdHN0YXRlKTsKKyAgICBfUHlHSUxTdGF0ZV9Jbml0KGludGVycCwgdHN0YXRlKTsKICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwogCi0JaWYgKCFQeV9Ob1NpdGVGbGFnKQotCQlpbml0c2l0ZSgpOyAvKiBNb2R1bGUgc2l0ZSAqLworICAgIGlmICghUHlfTm9TaXRlRmxhZykKKyAgICAgICAgaW5pdHNpdGUoKTsgLyogTW9kdWxlIHNpdGUgKi8KIAotCWlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OSU9FTkNPRElORyIpKSAmJiAqcCAhPSAnXDAnKSB7Ci0JCXAgPSBpY29kZXNldCA9IGNvZGVzZXQgPSBzdHJkdXAocCk7Ci0JCWZyZWVfY29kZXNldCA9IDE7Ci0JCWVycm9ycyA9IHN0cmNocihwLCAnOicpOwotCQlpZiAoZXJyb3JzKSB7Ci0JCQkqZXJyb3JzID0gJ1wwJzsKLQkJCWVycm9ycysrOwotCQl9Ci0JCW92ZXJyaWRkZW4gPSAxOwotCX0KKyAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTklPRU5DT0RJTkciKSkgJiYgKnAgIT0gJ1wwJykgeworICAgICAgICBwID0gaWNvZGVzZXQgPSBjb2Rlc2V0ID0gc3RyZHVwKHApOworICAgICAgICBmcmVlX2NvZGVzZXQgPSAxOworICAgICAgICBlcnJvcnMgPSBzdHJjaHIocCwgJzonKTsKKyAgICAgICAgaWYgKGVycm9ycykgeworICAgICAgICAgICAgKmVycm9ycyA9ICdcMCc7CisgICAgICAgICAgICBlcnJvcnMrKzsKKyAgICAgICAgfQorICAgICAgICBvdmVycmlkZGVuID0gMTsKKyAgICB9CiAKICNpZiBkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpICYmIGRlZmluZWQoSEFWRV9MQU5HSU5GT19IKSAmJiBkZWZpbmVkKENPREVTRVQpCi0JLyogT24gVW5peCwgc2V0IHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZyBhY2NvcmRpbmcgdG8gdGhlCi0JICAgdXNlcidzIHByZWZlcmVuY2UsIGlmIHRoZSBDT0RFU0VUIG5hbWVzIGEgd2VsbC1rbm93bgotCSAgIFB5dGhvbiBjb2RlYywgYW5kIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgaXNuJ3QKLQkgICBpbml0aWFsaXplZCBieSBvdGhlciBtZWFucy4gQWxzbyBzZXQgdGhlIGVuY29kaW5nIG9mCi0JICAgc3RkaW4gYW5kIHN0ZG91dCBpZiB0aGVzZSBhcmUgdGVybWluYWxzLCB1bmxlc3Mgb3ZlcnJpZGRlbi4gICovCisgICAgLyogT24gVW5peCwgc2V0IHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZyBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgdXNlcidzIHByZWZlcmVuY2UsIGlmIHRoZSBDT0RFU0VUIG5hbWVzIGEgd2VsbC1rbm93bgorICAgICAgIFB5dGhvbiBjb2RlYywgYW5kIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgaXNuJ3QKKyAgICAgICBpbml0aWFsaXplZCBieSBvdGhlciBtZWFucy4gQWxzbyBzZXQgdGhlIGVuY29kaW5nIG9mCisgICAgICAgc3RkaW4gYW5kIHN0ZG91dCBpZiB0aGVzZSBhcmUgdGVybWluYWxzLCB1bmxlc3Mgb3ZlcnJpZGRlbi4gICovCiAKLQlpZiAoIW92ZXJyaWRkZW4gfHwgIVB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpIHsKLQkJc2F2ZWRfbG9jYWxlID0gc3RyZHVwKHNldGxvY2FsZShMQ19DVFlQRSwgTlVMTCkpOwotCQlzZXRsb2NhbGUoTENfQ1RZUEUsICIiKTsKLQkJbG9jX2NvZGVzZXQgPSBubF9sYW5naW5mbyhDT0RFU0VUKTsKLQkJaWYgKGxvY19jb2Rlc2V0ICYmICpsb2NfY29kZXNldCkgewotCQkJUHlPYmplY3QgKmVuYyA9IFB5Q29kZWNfRW5jb2Rlcihsb2NfY29kZXNldCk7Ci0JCQlpZiAoZW5jKSB7Ci0JCQkJbG9jX2NvZGVzZXQgPSBzdHJkdXAobG9jX2NvZGVzZXQpOwotCQkJCVB5X0RFQ1JFRihlbmMpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19Mb29rdXBFcnJvcikpIHsKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQkJbG9jX2NvZGVzZXQgPSBOVUxMOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVB5RXJyX1ByaW50KCk7Ci0JCQkJCWV4aXQoMSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UKLQkJCWxvY19jb2Rlc2V0ID0gTlVMTDsKLQkJc2V0bG9jYWxlKExDX0NUWVBFLCBzYXZlZF9sb2NhbGUpOwotCQlmcmVlKHNhdmVkX2xvY2FsZSk7CisgICAgaWYgKCFvdmVycmlkZGVuIHx8ICFQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nKSB7CisgICAgICAgIHNhdmVkX2xvY2FsZSA9IHN0cmR1cChzZXRsb2NhbGUoTENfQ1RZUEUsIE5VTEwpKTsKKyAgICAgICAgc2V0bG9jYWxlKExDX0NUWVBFLCAiIik7CisgICAgICAgIGxvY19jb2Rlc2V0ID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7CisgICAgICAgIGlmIChsb2NfY29kZXNldCAmJiAqbG9jX2NvZGVzZXQpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICplbmMgPSBQeUNvZGVjX0VuY29kZXIobG9jX2NvZGVzZXQpOworICAgICAgICAgICAgaWYgKGVuYykgeworICAgICAgICAgICAgICAgIGxvY19jb2Rlc2V0ID0gc3RyZHVwKGxvY19jb2Rlc2V0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZW5jKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfTG9va3VwRXJyb3IpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGxvY19jb2Rlc2V0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBsb2NfY29kZXNldCA9IE5VTEw7CisgICAgICAgIHNldGxvY2FsZShMQ19DVFlQRSwgc2F2ZWRfbG9jYWxlKTsKKyAgICAgICAgZnJlZShzYXZlZF9sb2NhbGUpOwogCi0JCWlmICghb3ZlcnJpZGRlbikgewotCQkJY29kZXNldCA9IGljb2Rlc2V0ID0gbG9jX2NvZGVzZXQ7Ci0JCQlmcmVlX2NvZGVzZXQgPSAxOwotCQl9CisgICAgICAgIGlmICghb3ZlcnJpZGRlbikgeworICAgICAgICAgICAgY29kZXNldCA9IGljb2Rlc2V0ID0gbG9jX2NvZGVzZXQ7CisgICAgICAgICAgICBmcmVlX2NvZGVzZXQgPSAxOworICAgICAgICB9CiAKLQkJLyogSW5pdGlhbGl6ZSBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIGZyb20KLQkJICAgbG9jYWxlIGV2ZW4gaWYgUFlUSE9OSU9FTkNPRElORyBpcyBzZXQuICovCi0JCWlmICghUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZykgewotCQkJUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyA9IGxvY19jb2Rlc2V0OwotCQkJaWYgKCFvdmVycmlkZGVuKQotCQkJCWZyZWVfY29kZXNldCA9IDA7Ci0JCX0KLQl9CisgICAgICAgIC8qIEluaXRpYWxpemUgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyBmcm9tCisgICAgICAgICAgIGxvY2FsZSBldmVuIGlmIFBZVEhPTklPRU5DT0RJTkcgaXMgc2V0LiAqLworICAgICAgICBpZiAoIVB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpIHsKKyAgICAgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgPSBsb2NfY29kZXNldDsKKyAgICAgICAgICAgIGlmICghb3ZlcnJpZGRlbikKKyAgICAgICAgICAgICAgICBmcmVlX2NvZGVzZXQgPSAwOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBNU19XSU5ET1dTCi0JaWYgKCFvdmVycmlkZGVuKSB7Ci0JCWljb2Rlc2V0ID0gaWJ1ZjsKLQkJY29kZXNldCA9IGJ1ZjsKLQkJc3ByaW50ZihpYnVmLCAiY3AlZCIsIEdldENvbnNvbGVDUCgpKTsKLQkJc3ByaW50ZihidWYsICJjcCVkIiwgR2V0Q29uc29sZU91dHB1dENQKCkpOwotCX0KKyAgICBpZiAoIW92ZXJyaWRkZW4pIHsKKyAgICAgICAgaWNvZGVzZXQgPSBpYnVmOworICAgICAgICBjb2Rlc2V0ID0gYnVmOworICAgICAgICBzcHJpbnRmKGlidWYsICJjcCVkIiwgR2V0Q29uc29sZUNQKCkpOworICAgICAgICBzcHJpbnRmKGJ1ZiwgImNwJWQiLCBHZXRDb25zb2xlT3V0cHV0Q1AoKSk7CisgICAgfQogI2VuZGlmCiAKLQlpZiAoY29kZXNldCkgewotCQlzeXNfc3RyZWFtID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRpbiIpOwotCQlzeXNfaXNhdHR5ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzeXNfc3RyZWFtLCAiaXNhdHR5IiwgIiIpOwotCQlpZiAoIXN5c19pc2F0dHkpCi0JCQlQeUVycl9DbGVhcigpOwotCQlpZiAoKG92ZXJyaWRkZW4gfHwKLQkJICAgICAoc3lzX2lzYXR0eSAmJiBQeU9iamVjdF9Jc1RydWUoc3lzX2lzYXR0eSkpKSAmJgotCQkgICBQeUZpbGVfQ2hlY2soc3lzX3N0cmVhbSkpIHsKLQkJCWlmICghUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKHN5c19zdHJlYW0sIGljb2Rlc2V0LCBlcnJvcnMpKQotCQkJCVB5X0ZhdGFsRXJyb3IoIkNhbm5vdCBzZXQgY29kZXNldCBvZiBzdGRpbiIpOwotCQl9Ci0JCVB5X1hERUNSRUYoc3lzX2lzYXR0eSk7CisgICAgaWYgKGNvZGVzZXQpIHsKKyAgICAgICAgc3lzX3N0cmVhbSA9IFB5U3lzX0dldE9iamVjdCgic3RkaW4iKTsKKyAgICAgICAgc3lzX2lzYXR0eSA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3lzX3N0cmVhbSwgImlzYXR0eSIsICIiKTsKKyAgICAgICAgaWYgKCFzeXNfaXNhdHR5KQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKChvdmVycmlkZGVuIHx8CisgICAgICAgICAgICAgKHN5c19pc2F0dHkgJiYgUHlPYmplY3RfSXNUcnVlKHN5c19pc2F0dHkpKSkgJiYKKyAgICAgICAgICAgUHlGaWxlX0NoZWNrKHN5c19zdHJlYW0pKSB7CisgICAgICAgICAgICBpZiAoIVB5RmlsZV9TZXRFbmNvZGluZ0FuZEVycm9ycyhzeXNfc3RyZWFtLCBpY29kZXNldCwgZXJyb3JzKSkKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW5ub3Qgc2V0IGNvZGVzZXQgb2Ygc3RkaW4iKTsKKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKHN5c19pc2F0dHkpOwogCi0JCXN5c19zdHJlYW0gPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOwotCQlzeXNfaXNhdHR5ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzeXNfc3RyZWFtLCAiaXNhdHR5IiwgIiIpOwotCQlpZiAoIXN5c19pc2F0dHkpCi0JCQlQeUVycl9DbGVhcigpOwotCQlpZiAoKG92ZXJyaWRkZW4gfHwKLQkJICAgICAoc3lzX2lzYXR0eSAmJiBQeU9iamVjdF9Jc1RydWUoc3lzX2lzYXR0eSkpKSAmJgotCQkgICBQeUZpbGVfQ2hlY2soc3lzX3N0cmVhbSkpIHsKLQkJCWlmICghUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKHN5c19zdHJlYW0sIGNvZGVzZXQsIGVycm9ycykpCi0JCQkJUHlfRmF0YWxFcnJvcigiQ2Fubm90IHNldCBjb2Rlc2V0IG9mIHN0ZG91dCIpOwotCQl9Ci0JCVB5X1hERUNSRUYoc3lzX2lzYXR0eSk7CisgICAgICAgIHN5c19zdHJlYW0gPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOworICAgICAgICBzeXNfaXNhdHR5ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzeXNfc3RyZWFtLCAiaXNhdHR5IiwgIiIpOworICAgICAgICBpZiAoIXN5c19pc2F0dHkpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoKG92ZXJyaWRkZW4gfHwKKyAgICAgICAgICAgICAoc3lzX2lzYXR0eSAmJiBQeU9iamVjdF9Jc1RydWUoc3lzX2lzYXR0eSkpKSAmJgorICAgICAgICAgICBQeUZpbGVfQ2hlY2soc3lzX3N0cmVhbSkpIHsKKyAgICAgICAgICAgIGlmICghUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKHN5c19zdHJlYW0sIGNvZGVzZXQsIGVycm9ycykpCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2Fubm90IHNldCBjb2Rlc2V0IG9mIHN0ZG91dCIpOworICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYoc3lzX2lzYXR0eSk7CiAKLQkJc3lzX3N0cmVhbSA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7Ci0JCXN5c19pc2F0dHkgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHN5c19zdHJlYW0sICJpc2F0dHkiLCAiIik7Ci0JCWlmICghc3lzX2lzYXR0eSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWlmKChvdmVycmlkZGVuIHx8Ci0JCSAgICAoc3lzX2lzYXR0eSAmJiBQeU9iamVjdF9Jc1RydWUoc3lzX2lzYXR0eSkpKSAmJgotCQkgICBQeUZpbGVfQ2hlY2soc3lzX3N0cmVhbSkpIHsKLQkJCWlmICghUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKHN5c19zdHJlYW0sIGNvZGVzZXQsIGVycm9ycykpCi0JCQkJUHlfRmF0YWxFcnJvcigiQ2Fubm90IHNldCBjb2Rlc2V0IG9mIHN0ZGVyciIpOwotCQl9Ci0JCVB5X1hERUNSRUYoc3lzX2lzYXR0eSk7CisgICAgICAgIHN5c19zdHJlYW0gPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOworICAgICAgICBzeXNfaXNhdHR5ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzeXNfc3RyZWFtLCAiaXNhdHR5IiwgIiIpOworICAgICAgICBpZiAoIXN5c19pc2F0dHkpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZigob3ZlcnJpZGRlbiB8fAorICAgICAgICAgICAgKHN5c19pc2F0dHkgJiYgUHlPYmplY3RfSXNUcnVlKHN5c19pc2F0dHkpKSkgJiYKKyAgICAgICAgICAgUHlGaWxlX0NoZWNrKHN5c19zdHJlYW0pKSB7CisgICAgICAgICAgICBpZiAoIVB5RmlsZV9TZXRFbmNvZGluZ0FuZEVycm9ycyhzeXNfc3RyZWFtLCBjb2Rlc2V0LCBlcnJvcnMpKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbm5vdCBzZXQgY29kZXNldCBvZiBzdGRlcnIiKTsKKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKHN5c19pc2F0dHkpOwogCi0JCWlmIChmcmVlX2NvZGVzZXQpCi0JCQlmcmVlKGNvZGVzZXQpOwotCX0KKyAgICAgICAgaWYgKGZyZWVfY29kZXNldCkKKyAgICAgICAgICAgIGZyZWUoY29kZXNldCk7CisgICAgfQogfQogCiB2b2lkCiBQeV9Jbml0aWFsaXplKHZvaWQpCiB7Ci0JUHlfSW5pdGlhbGl6ZUV4KDEpOworICAgIFB5X0luaXRpYWxpemVFeCgxKTsKIH0KIAogCkBAIC0zOTIsMTU5ICszOTIsMTU5IEBACiB2b2lkCiBQeV9GaW5hbGl6ZSh2b2lkKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOwotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CiAKLQlpZiAoIWluaXRpYWxpemVkKQotCQlyZXR1cm47CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOwogCi0Jd2FpdF9mb3JfdGhyZWFkX3NodXRkb3duKCk7CisgICAgd2FpdF9mb3JfdGhyZWFkX3NodXRkb3duKCk7CiAKLQkvKiBUaGUgaW50ZXJwcmV0ZXIgaXMgc3RpbGwgZW50aXJlbHkgaW50YWN0IGF0IHRoaXMgcG9pbnQsIGFuZCB0aGUKLQkgKiBleGl0IGZ1bmNzIG1heSBiZSByZWx5aW5nIG9uIHRoYXQuICBJbiBwYXJ0aWN1bGFyLCBpZiBzb21lIHRocmVhZAotCSAqIG9yIGV4aXQgZnVuYyBpcyBzdGlsbCB3YWl0aW5nIHRvIGRvIGFuIGltcG9ydCwgdGhlIGltcG9ydCBtYWNoaW5lcnkKLQkgKiBleHBlY3RzIFB5X0lzSW5pdGlhbGl6ZWQoKSB0byByZXR1cm4gdHJ1ZS4gIFNvIGRvbid0IHNheSB0aGUKLQkgKiBpbnRlcnByZXRlciBpcyB1bmluaXRpYWxpemVkIHVudGlsIGFmdGVyIHRoZSBleGl0IGZ1bmNzIGhhdmUgcnVuLgotCSAqIE5vdGUgdGhhdCBUaHJlYWRpbmcucHkgdXNlcyBhbiBleGl0IGZ1bmMgdG8gZG8gYSBqb2luIG9uIGFsbCB0aGUKLQkgKiB0aHJlYWRzIGNyZWF0ZWQgdGhydSBpdCwgc28gdGhpcyBhbHNvIHByb3RlY3RzIHBlbmRpbmcgaW1wb3J0cyBpbgotCSAqIHRoZSB0aHJlYWRzIGNyZWF0ZWQgdmlhIFRocmVhZGluZy4KLQkgKi8KLQljYWxsX3N5c19leGl0ZnVuYygpOwotCWluaXRpYWxpemVkID0gMDsKKyAgICAvKiBUaGUgaW50ZXJwcmV0ZXIgaXMgc3RpbGwgZW50aXJlbHkgaW50YWN0IGF0IHRoaXMgcG9pbnQsIGFuZCB0aGUKKyAgICAgKiBleGl0IGZ1bmNzIG1heSBiZSByZWx5aW5nIG9uIHRoYXQuICBJbiBwYXJ0aWN1bGFyLCBpZiBzb21lIHRocmVhZAorICAgICAqIG9yIGV4aXQgZnVuYyBpcyBzdGlsbCB3YWl0aW5nIHRvIGRvIGFuIGltcG9ydCwgdGhlIGltcG9ydCBtYWNoaW5lcnkKKyAgICAgKiBleHBlY3RzIFB5X0lzSW5pdGlhbGl6ZWQoKSB0byByZXR1cm4gdHJ1ZS4gIFNvIGRvbid0IHNheSB0aGUKKyAgICAgKiBpbnRlcnByZXRlciBpcyB1bmluaXRpYWxpemVkIHVudGlsIGFmdGVyIHRoZSBleGl0IGZ1bmNzIGhhdmUgcnVuLgorICAgICAqIE5vdGUgdGhhdCBUaHJlYWRpbmcucHkgdXNlcyBhbiBleGl0IGZ1bmMgdG8gZG8gYSBqb2luIG9uIGFsbCB0aGUKKyAgICAgKiB0aHJlYWRzIGNyZWF0ZWQgdGhydSBpdCwgc28gdGhpcyBhbHNvIHByb3RlY3RzIHBlbmRpbmcgaW1wb3J0cyBpbgorICAgICAqIHRoZSB0aHJlYWRzIGNyZWF0ZWQgdmlhIFRocmVhZGluZy4KKyAgICAgKi8KKyAgICBjYWxsX3N5c19leGl0ZnVuYygpOworICAgIGluaXRpYWxpemVkID0gMDsKIAotCS8qIEdldCBjdXJyZW50IHRocmVhZCBzdGF0ZSBhbmQgaW50ZXJwcmV0ZXIgcG9pbnRlciAqLwotCXRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JaW50ZXJwID0gdHN0YXRlLT5pbnRlcnA7CisgICAgLyogR2V0IGN1cnJlbnQgdGhyZWFkIHN0YXRlIGFuZCBpbnRlcnByZXRlciBwb2ludGVyICovCisgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBpbnRlcnAgPSB0c3RhdGUtPmludGVycDsKIAotCS8qIERpc2FibGUgc2lnbmFsIGhhbmRsaW5nICovCi0JUHlPU19GaW5pSW50ZXJydXB0cygpOworICAgIC8qIERpc2FibGUgc2lnbmFsIGhhbmRsaW5nICovCisgICAgUHlPU19GaW5pSW50ZXJydXB0cygpOwogCi0JLyogQ2xlYXIgdHlwZSBsb29rdXAgY2FjaGUgKi8KLQlQeVR5cGVfQ2xlYXJDYWNoZSgpOworICAgIC8qIENsZWFyIHR5cGUgbG9va3VwIGNhY2hlICovCisgICAgUHlUeXBlX0NsZWFyQ2FjaGUoKTsKIAotCS8qIENvbGxlY3QgZ2FyYmFnZS4gIFRoaXMgbWF5IGNhbGwgZmluYWxpemVyczsgaXQncyBuaWNlIHRvIGNhbGwgdGhlc2UKLQkgKiBiZWZvcmUgYWxsIG1vZHVsZXMgYXJlIGRlc3Ryb3llZC4KLQkgKiBYWFggSWYgYSBfX2RlbF9fIG9yIHdlYWtyZWYgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIGhlcmUsIGFuZCB0cmllcyB0bwotCSAqIFhYWCBpbXBvcnQgYSBtb2R1bGUsIGJhZCB0aGluZ3MgY2FuIGhhcHBlbiwgYmVjYXVzZSBQeXRob24gbm8KLQkgKiBYWFggbG9uZ2VyIGJlbGlldmVzIGl0J3MgaW5pdGlhbGl6ZWQuCi0JICogWFhYICAgICBGYXRhbCBQeXRob24gZXJyb3I6IEludGVycHJldGVyIG5vdCBpbml0aWFsaXplZCAodmVyc2lvbiBtaXNtYXRjaD8pCi0JICogWFhYIGlzIGVhc3kgdG8gcHJvdm9rZSB0aGF0IHdheS4gIEkndmUgYWxzbyBzZWVuLCBlLmcuLAotCSAqIFhYWCAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbnMuSW1wb3J0RXJyb3I6ICdObyBtb2R1bGUgbmFtZWQgc2hhJwotCSAqIFhYWCAgICAgICAgIGluIDxmdW5jdGlvbiBjYWxsYmFjayBhdCAweDAwOEY1NzE4PiBpZ25vcmVkCi0JICogWFhYIGJ1dCBJJ20gdW5jbGVhciBvbiBleGFjdGx5IGhvdyB0aGF0IG9uZSBoYXBwZW5zLiAgSW4gYW55IGNhc2UsCi0JICogWFhYIEkgaGF2ZW4ndCBzZWVuIGEgcmVhbC1saWZlIHJlcG9ydCBvZiBlaXRoZXIgb2YgdGhlc2UuCi0JICovCi0JUHlHQ19Db2xsZWN0KCk7CisgICAgLyogQ29sbGVjdCBnYXJiYWdlLiAgVGhpcyBtYXkgY2FsbCBmaW5hbGl6ZXJzOyBpdCdzIG5pY2UgdG8gY2FsbCB0aGVzZQorICAgICAqIGJlZm9yZSBhbGwgbW9kdWxlcyBhcmUgZGVzdHJveWVkLgorICAgICAqIFhYWCBJZiBhIF9fZGVsX18gb3Igd2Vha3JlZiBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgaGVyZSwgYW5kIHRyaWVzIHRvCisgICAgICogWFhYIGltcG9ydCBhIG1vZHVsZSwgYmFkIHRoaW5ncyBjYW4gaGFwcGVuLCBiZWNhdXNlIFB5dGhvbiBubworICAgICAqIFhYWCBsb25nZXIgYmVsaWV2ZXMgaXQncyBpbml0aWFsaXplZC4KKyAgICAgKiBYWFggICAgIEZhdGFsIFB5dGhvbiBlcnJvcjogSW50ZXJwcmV0ZXIgbm90IGluaXRpYWxpemVkICh2ZXJzaW9uIG1pc21hdGNoPykKKyAgICAgKiBYWFggaXMgZWFzeSB0byBwcm92b2tlIHRoYXQgd2F5LiAgSSd2ZSBhbHNvIHNlZW4sIGUuZy4sCisgICAgICogWFhYICAgICBFeGNlcHRpb24gZXhjZXB0aW9ucy5JbXBvcnRFcnJvcjogJ05vIG1vZHVsZSBuYW1lZCBzaGEnCisgICAgICogWFhYICAgICAgICAgaW4gPGZ1bmN0aW9uIGNhbGxiYWNrIGF0IDB4MDA4RjU3MTg+IGlnbm9yZWQKKyAgICAgKiBYWFggYnV0IEknbSB1bmNsZWFyIG9uIGV4YWN0bHkgaG93IHRoYXQgb25lIGhhcHBlbnMuICBJbiBhbnkgY2FzZSwKKyAgICAgKiBYWFggSSBoYXZlbid0IHNlZW4gYSByZWFsLWxpZmUgcmVwb3J0IG9mIGVpdGhlciBvZiB0aGVzZS4KKyAgICAgKi8KKyAgICBQeUdDX0NvbGxlY3QoKTsKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkvKiBXaXRoIENPVU5UX0FMTE9DUywgaXQgaGVscHMgdG8gcnVuIEdDIG11bHRpcGxlIHRpbWVzOgotCSAgIGVhY2ggY29sbGVjdGlvbiBtaWdodCByZWxlYXNlIHNvbWUgdHlwZXMgZnJvbSB0aGUgdHlwZQotCSAgIGxpc3QsIHNvIHRoZXkgYmVjb21lIGdhcmJhZ2UuICovCi0Jd2hpbGUgKFB5R0NfQ29sbGVjdCgpID4gMCkKLQkJLyogbm90aGluZyAqLzsKKyAgICAvKiBXaXRoIENPVU5UX0FMTE9DUywgaXQgaGVscHMgdG8gcnVuIEdDIG11bHRpcGxlIHRpbWVzOgorICAgICAgIGVhY2ggY29sbGVjdGlvbiBtaWdodCByZWxlYXNlIHNvbWUgdHlwZXMgZnJvbSB0aGUgdHlwZQorICAgICAgIGxpc3QsIHNvIHRoZXkgYmVjb21lIGdhcmJhZ2UuICovCisgICAgd2hpbGUgKFB5R0NfQ29sbGVjdCgpID4gMCkKKyAgICAgICAgLyogbm90aGluZyAqLzsKICNlbmRpZgogCi0JLyogRGVzdHJveSBhbGwgbW9kdWxlcyAqLwotCVB5SW1wb3J0X0NsZWFudXAoKTsKKyAgICAvKiBEZXN0cm95IGFsbCBtb2R1bGVzICovCisgICAgUHlJbXBvcnRfQ2xlYW51cCgpOwogCi0JLyogQ29sbGVjdCBmaW5hbCBnYXJiYWdlLiAgVGhpcyBkaXNwb3NlcyBvZiBjeWNsZXMgY3JlYXRlZCBieQotCSAqIG5ldy1zdHlsZSBjbGFzcyBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGUuCi0JICogWFhYIFRoaXMgaXMgZGlzYWJsZWQgYmVjYXVzZSBpdCBjYXVzZWQgdG9vIG1hbnkgcHJvYmxlbXMuICBJZgotCSAqIFhYWCBhIF9fZGVsX18gb3Igd2Vha3JlZiBjYWxsYmFjayB0cmlnZ2VycyBoZXJlLCBQeXRob24gY29kZSBoYXMKLQkgKiBYWFggYSBoYXJkIHRpbWUgcnVubmluZywgYmVjYXVzZSBldmVuIHRoZSBzeXMgbW9kdWxlIGhhcyBiZWVuCi0JICogWFhYIGNsZWFyZWQgb3V0IChzeXMuc3Rkb3V0IGlzIGdvbmUsIHN5cy5leGNlcHRob29rIGlzIGdvbmUsIGV0YykuCi0JICogWFhYIE9uZSBzeW1wdG9tIGlzIGEgc2VxdWVuY2Ugb2YgaW5mb3JtYXRpb24tZnJlZSBtZXNzYWdlcwotCSAqIFhYWCBjb21pbmcgZnJvbSB0aHJlYWRzIChpZiBhIF9fZGVsX18gb3IgY2FsbGJhY2sgaXMgaW52b2tlZCwKLQkgKiBYWFggb3RoZXIgdGhyZWFkcyBjYW4gZXhlY3V0ZSB0b28sIGFuZCBhbnkgZXhjZXB0aW9uIHRoZXkgZW5jb3VudGVyCi0JICogWFhYIHRyaWdnZXJzIGEgY29tZWR5IG9mIGVycm9ycyBhcyBzdWJzeXN0ZW0gYWZ0ZXIgc3Vic3lzdGVtCi0JICogWFhYIGZhaWxzIHRvIGZpbmQgd2hhdCBpdCAqZXhwZWN0cyogdG8gZmluZCBpbiBzeXMgdG8gaGVscCByZXBvcnQKLQkgKiBYWFggdGhlIGV4Y2VwdGlvbiBhbmQgY29uc2VxdWVudCB1bmV4cGVjdGVkIGZhaWx1cmVzKS4gIEkndmUgYWxzbwotCSAqIFhYWCBzZWVuIHNlZ2ZhdWx0cyB0aGVuLCBhZnRlciBhZGRpbmcgcHJpbnQgc3RhdGVtZW50cyB0byB0aGUKLQkgKiBYWFggUHl0aG9uIGNvZGUgZ2V0dGluZyBjYWxsZWQuCi0JICovCisgICAgLyogQ29sbGVjdCBmaW5hbCBnYXJiYWdlLiAgVGhpcyBkaXNwb3NlcyBvZiBjeWNsZXMgY3JlYXRlZCBieQorICAgICAqIG5ldy1zdHlsZSBjbGFzcyBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGUuCisgICAgICogWFhYIFRoaXMgaXMgZGlzYWJsZWQgYmVjYXVzZSBpdCBjYXVzZWQgdG9vIG1hbnkgcHJvYmxlbXMuICBJZgorICAgICAqIFhYWCBhIF9fZGVsX18gb3Igd2Vha3JlZiBjYWxsYmFjayB0cmlnZ2VycyBoZXJlLCBQeXRob24gY29kZSBoYXMKKyAgICAgKiBYWFggYSBoYXJkIHRpbWUgcnVubmluZywgYmVjYXVzZSBldmVuIHRoZSBzeXMgbW9kdWxlIGhhcyBiZWVuCisgICAgICogWFhYIGNsZWFyZWQgb3V0IChzeXMuc3Rkb3V0IGlzIGdvbmUsIHN5cy5leGNlcHRob29rIGlzIGdvbmUsIGV0YykuCisgICAgICogWFhYIE9uZSBzeW1wdG9tIGlzIGEgc2VxdWVuY2Ugb2YgaW5mb3JtYXRpb24tZnJlZSBtZXNzYWdlcworICAgICAqIFhYWCBjb21pbmcgZnJvbSB0aHJlYWRzIChpZiBhIF9fZGVsX18gb3IgY2FsbGJhY2sgaXMgaW52b2tlZCwKKyAgICAgKiBYWFggb3RoZXIgdGhyZWFkcyBjYW4gZXhlY3V0ZSB0b28sIGFuZCBhbnkgZXhjZXB0aW9uIHRoZXkgZW5jb3VudGVyCisgICAgICogWFhYIHRyaWdnZXJzIGEgY29tZWR5IG9mIGVycm9ycyBhcyBzdWJzeXN0ZW0gYWZ0ZXIgc3Vic3lzdGVtCisgICAgICogWFhYIGZhaWxzIHRvIGZpbmQgd2hhdCBpdCAqZXhwZWN0cyogdG8gZmluZCBpbiBzeXMgdG8gaGVscCByZXBvcnQKKyAgICAgKiBYWFggdGhlIGV4Y2VwdGlvbiBhbmQgY29uc2VxdWVudCB1bmV4cGVjdGVkIGZhaWx1cmVzKS4gIEkndmUgYWxzbworICAgICAqIFhYWCBzZWVuIHNlZ2ZhdWx0cyB0aGVuLCBhZnRlciBhZGRpbmcgcHJpbnQgc3RhdGVtZW50cyB0byB0aGUKKyAgICAgKiBYWFggUHl0aG9uIGNvZGUgZ2V0dGluZyBjYWxsZWQuCisgICAgICovCiAjaWYgMAotCVB5R0NfQ29sbGVjdCgpOworICAgIFB5R0NfQ29sbGVjdCgpOwogI2VuZGlmCiAKLQkvKiBEZXN0cm95IHRoZSBkYXRhYmFzZSB1c2VkIGJ5IF9QeUltcG9ydF97Rml4dXAsRmluZH1FeHRlbnNpb24gKi8KLQlfUHlJbXBvcnRfRmluaSgpOworICAgIC8qIERlc3Ryb3kgdGhlIGRhdGFiYXNlIHVzZWQgYnkgX1B5SW1wb3J0X3tGaXh1cCxGaW5kfUV4dGVuc2lvbiAqLworICAgIF9QeUltcG9ydF9GaW5pKCk7CiAKLQkvKiBEZWJ1Z2dpbmcgc3R1ZmYgKi8KKyAgICAvKiBEZWJ1Z2dpbmcgc3R1ZmYgKi8KICNpZmRlZiBDT1VOVF9BTExPQ1MKLQlkdW1wX2NvdW50cyhzdGRvdXQpOworICAgIGR1bXBfY291bnRzKHN0ZG91dCk7CiAjZW5kaWYKIAotCVBSSU5UX1RPVEFMX1JFRlMoKTsKKyAgICBQUklOVF9UT1RBTF9SRUZTKCk7CiAKICNpZmRlZiBQeV9UUkFDRV9SRUZTCi0JLyogRGlzcGxheSBhbGwgb2JqZWN0cyBzdGlsbCBhbGl2ZSAtLSB0aGlzIGNhbiBpbnZva2UgYXJiaXRyYXJ5Ci0JICogX19yZXByX18gb3ZlcnJpZGVzLCBzbyByZXF1aXJlcyBhIG1vc3RseS1pbnRhY3QgaW50ZXJwcmV0ZXIuCi0JICogQWxhcywgYSBsb3Qgb2Ygc3R1ZmYgbWF5IHN0aWxsIGJlIGFsaXZlIG5vdyB0aGF0IHdpbGwgYmUgY2xlYW5lZAotCSAqIHVwIGxhdGVyLgotCSAqLwotCWlmIChQeV9HRVRFTlYoIlBZVEhPTkRVTVBSRUZTIikpCi0JCV9QeV9QcmludFJlZmVyZW5jZXMoc3RkZXJyKTsKKyAgICAvKiBEaXNwbGF5IGFsbCBvYmplY3RzIHN0aWxsIGFsaXZlIC0tIHRoaXMgY2FuIGludm9rZSBhcmJpdHJhcnkKKyAgICAgKiBfX3JlcHJfXyBvdmVycmlkZXMsIHNvIHJlcXVpcmVzIGEgbW9zdGx5LWludGFjdCBpbnRlcnByZXRlci4KKyAgICAgKiBBbGFzLCBhIGxvdCBvZiBzdHVmZiBtYXkgc3RpbGwgYmUgYWxpdmUgbm93IHRoYXQgd2lsbCBiZSBjbGVhbmVkCisgICAgICogdXAgbGF0ZXIuCisgICAgICovCisgICAgaWYgKFB5X0dFVEVOVigiUFlUSE9ORFVNUFJFRlMiKSkKKyAgICAgICAgX1B5X1ByaW50UmVmZXJlbmNlcyhzdGRlcnIpOwogI2VuZGlmIC8qIFB5X1RSQUNFX1JFRlMgKi8KIAotCS8qIENsZWFyIGludGVycHJldGVyIHN0YXRlICovCi0JUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyKGludGVycCk7CisgICAgLyogQ2xlYXIgaW50ZXJwcmV0ZXIgc3RhdGUgKi8KKyAgICBQeUludGVycHJldGVyU3RhdGVfQ2xlYXIoaW50ZXJwKTsKIAotCS8qIE5vdyB3ZSBkZWNyZWYgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzLiAgQWZ0ZXIgdGhpcyBwb2ludCBub3RoaW5nCi0JICAgY2FuIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIFRoYXQncyBva2F5LCBiZWNhdXNlIGVhY2ggRmluaSgpIG1ldGhvZAotCSAgIGJlbG93IGhhcyBiZWVuIGNoZWNrZWQgdG8gbWFrZSBzdXJlIG5vIGV4Y2VwdGlvbnMgYXJlIGV2ZXIKLQkgICByYWlzZWQuCi0JKi8KKyAgICAvKiBOb3cgd2UgZGVjcmVmIHRoZSBleGNlcHRpb24gY2xhc3Nlcy4gIEFmdGVyIHRoaXMgcG9pbnQgbm90aGluZworICAgICAgIGNhbiByYWlzZSBhbiBleGNlcHRpb24uICBUaGF0J3Mgb2theSwgYmVjYXVzZSBlYWNoIEZpbmkoKSBtZXRob2QKKyAgICAgICBiZWxvdyBoYXMgYmVlbiBjaGVja2VkIHRvIG1ha2Ugc3VyZSBubyBleGNlcHRpb25zIGFyZSBldmVyCisgICAgICAgcmFpc2VkLgorICAgICovCiAKLQlfUHlFeGNfRmluaSgpOworICAgIF9QeUV4Y19GaW5pKCk7CiAKLQkvKiBDbGVhbnVwIGF1dG8tdGhyZWFkLXN0YXRlICovCisgICAgLyogQ2xlYW51cCBhdXRvLXRocmVhZC1zdGF0ZSAqLwogI2lmZGVmIFdJVEhfVEhSRUFECi0JX1B5R0lMU3RhdGVfRmluaSgpOworICAgIF9QeUdJTFN0YXRlX0ZpbmkoKTsKICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwogCi0JLyogRGVsZXRlIGN1cnJlbnQgdGhyZWFkICovCi0JUHlUaHJlYWRTdGF0ZV9Td2FwKE5VTEwpOwotCVB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGUoaW50ZXJwKTsKKyAgICAvKiBEZWxldGUgY3VycmVudCB0aHJlYWQgKi8KKyAgICBQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7CisgICAgUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShpbnRlcnApOwogCi0JLyogU3VuZHJ5IGZpbmFsaXplcnMgKi8KLQlQeU1ldGhvZF9GaW5pKCk7Ci0JUHlGcmFtZV9GaW5pKCk7Ci0JUHlDRnVuY3Rpb25fRmluaSgpOwotCVB5VHVwbGVfRmluaSgpOwotCVB5TGlzdF9GaW5pKCk7Ci0JUHlTZXRfRmluaSgpOwotCVB5U3RyaW5nX0ZpbmkoKTsKLQlQeUJ5dGVBcnJheV9GaW5pKCk7Ci0JUHlJbnRfRmluaSgpOwotCVB5RmxvYXRfRmluaSgpOwotCVB5RGljdF9GaW5pKCk7CisgICAgLyogU3VuZHJ5IGZpbmFsaXplcnMgKi8KKyAgICBQeU1ldGhvZF9GaW5pKCk7CisgICAgUHlGcmFtZV9GaW5pKCk7CisgICAgUHlDRnVuY3Rpb25fRmluaSgpOworICAgIFB5VHVwbGVfRmluaSgpOworICAgIFB5TGlzdF9GaW5pKCk7CisgICAgUHlTZXRfRmluaSgpOworICAgIFB5U3RyaW5nX0ZpbmkoKTsKKyAgICBQeUJ5dGVBcnJheV9GaW5pKCk7CisgICAgUHlJbnRfRmluaSgpOworICAgIFB5RmxvYXRfRmluaSgpOworICAgIFB5RGljdF9GaW5pKCk7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JLyogQ2xlYW51cCBVbmljb2RlIGltcGxlbWVudGF0aW9uICovCi0JX1B5VW5pY29kZV9GaW5pKCk7CisgICAgLyogQ2xlYW51cCBVbmljb2RlIGltcGxlbWVudGF0aW9uICovCisgICAgX1B5VW5pY29kZV9GaW5pKCk7CiAjZW5kaWYKIAotCS8qIFhYWCBTdGlsbCBhbGxvY2F0ZWQ6Ci0JICAgLSB2YXJpb3VzIHN0YXRpYyBhZC1ob2MgcG9pbnRlcnMgdG8gaW50ZXJuZWQgc3RyaW5ncwotCSAgIC0gaW50IGFuZCBmbG9hdCBmcmVlIGxpc3QgYmxvY2tzCi0JICAgLSB3aGF0ZXZlciB2YXJpb3VzIG1vZHVsZXMgYW5kIGxpYnJhcmllcyBhbGxvY2F0ZQotCSovCisgICAgLyogWFhYIFN0aWxsIGFsbG9jYXRlZDoKKyAgICAgICAtIHZhcmlvdXMgc3RhdGljIGFkLWhvYyBwb2ludGVycyB0byBpbnRlcm5lZCBzdHJpbmdzCisgICAgICAgLSBpbnQgYW5kIGZsb2F0IGZyZWUgbGlzdCBibG9ja3MKKyAgICAgICAtIHdoYXRldmVyIHZhcmlvdXMgbW9kdWxlcyBhbmQgbGlicmFyaWVzIGFsbG9jYXRlCisgICAgKi8KIAotCVB5R3JhbW1hcl9SZW1vdmVBY2NlbGVyYXRvcnMoJl9QeVBhcnNlcl9HcmFtbWFyKTsKKyAgICBQeUdyYW1tYXJfUmVtb3ZlQWNjZWxlcmF0b3JzKCZfUHlQYXJzZXJfR3JhbW1hcik7CiAKICNpZmRlZiBQeV9UUkFDRV9SRUZTCi0JLyogRGlzcGxheSBhZGRyZXNzZXMgKCYgcmVmY250cykgb2YgYWxsIG9iamVjdHMgc3RpbGwgYWxpdmUuCi0JICogQW4gYWRkcmVzcyBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZSByZXByIG9mIHRoZSBvYmplY3QsIHByaW50ZWQKLQkgKiBhYm92ZSBieSBfUHlfUHJpbnRSZWZlcmVuY2VzLgotCSAqLwotCWlmIChQeV9HRVRFTlYoIlBZVEhPTkRVTVBSRUZTIikpCi0JCV9QeV9QcmludFJlZmVyZW5jZUFkZHJlc3NlcyhzdGRlcnIpOworICAgIC8qIERpc3BsYXkgYWRkcmVzc2VzICgmIHJlZmNudHMpIG9mIGFsbCBvYmplY3RzIHN0aWxsIGFsaXZlLgorICAgICAqIEFuIGFkZHJlc3MgY2FuIGJlIHVzZWQgdG8gZmluZCB0aGUgcmVwciBvZiB0aGUgb2JqZWN0LCBwcmludGVkCisgICAgICogYWJvdmUgYnkgX1B5X1ByaW50UmVmZXJlbmNlcy4KKyAgICAgKi8KKyAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05EVU1QUkVGUyIpKQorICAgICAgICBfUHlfUHJpbnRSZWZlcmVuY2VBZGRyZXNzZXMoc3RkZXJyKTsKICNlbmRpZiAvKiBQeV9UUkFDRV9SRUZTICovCiAjaWZkZWYgUFlNQUxMT0NfREVCVUcKLQlpZiAoUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpKQotCQlfUHlPYmplY3RfRGVidWdNYWxsb2NTdGF0cygpOworICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIikpCisgICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKCk7CiAjZW5kaWYKIAotCWNhbGxfbGxfZXhpdGZ1bmNzKCk7CisgICAgY2FsbF9sbF9leGl0ZnVuY3MoKTsKIH0KIAogLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGludGVycHJldGVyIGFuZCB0aHJlYWQsIGFuZCByZXR1cm4gdGhlCkBAIC01NjMsNjUgKzU2Myw2NSBAQAogUHlUaHJlYWRTdGF0ZSAqCiBQeV9OZXdJbnRlcnByZXRlcih2b2lkKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOwotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSwgKnNhdmVfdHN0YXRlOwotCVB5T2JqZWN0ICpiaW1vZCwgKnN5c21vZDsKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUsICpzYXZlX3RzdGF0ZTsKKyAgICBQeU9iamVjdCAqYmltb2QsICpzeXNtb2Q7CiAKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeV9GYXRhbEVycm9yKCJQeV9OZXdJbnRlcnByZXRlcjogY2FsbCBQeV9Jbml0aWFsaXplIGZpcnN0Iik7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfTmV3SW50ZXJwcmV0ZXI6IGNhbGwgUHlfSW5pdGlhbGl6ZSBmaXJzdCIpOwogCi0JaW50ZXJwID0gUHlJbnRlcnByZXRlclN0YXRlX05ldygpOwotCWlmIChpbnRlcnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaW50ZXJwID0gUHlJbnRlcnByZXRlclN0YXRlX05ldygpOworICAgIGlmIChpbnRlcnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl0c3RhdGUgPSBQeVRocmVhZFN0YXRlX05ldyhpbnRlcnApOwotCWlmICh0c3RhdGUgPT0gTlVMTCkgewotCQlQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX05ldyhpbnRlcnApOworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkgeworICAgICAgICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNhdmVfdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9Td2FwKHRzdGF0ZSk7CisgICAgc2F2ZV90c3RhdGUgPSBQeVRocmVhZFN0YXRlX1N3YXAodHN0YXRlKTsKIAotCS8qIFhYWCBUaGUgZm9sbG93aW5nIGlzIGxheCBpbiBlcnJvciBjaGVja2luZyAqLworICAgIC8qIFhYWCBUaGUgZm9sbG93aW5nIGlzIGxheCBpbiBlcnJvciBjaGVja2luZyAqLwogCi0JaW50ZXJwLT5tb2R1bGVzID0gUHlEaWN0X05ldygpOwotCWludGVycC0+bW9kdWxlc19yZWxvYWRpbmcgPSBQeURpY3RfTmV3KCk7CisgICAgaW50ZXJwLT5tb2R1bGVzID0gUHlEaWN0X05ldygpOworICAgIGludGVycC0+bW9kdWxlc19yZWxvYWRpbmcgPSBQeURpY3RfTmV3KCk7CiAKLQliaW1vZCA9IF9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uKCJfX2J1aWx0aW5fXyIsICJfX2J1aWx0aW5fXyIpOwotCWlmIChiaW1vZCAhPSBOVUxMKSB7Ci0JCWludGVycC0+YnVpbHRpbnMgPSBQeU1vZHVsZV9HZXREaWN0KGJpbW9kKTsKLQkJaWYgKGludGVycC0+YnVpbHRpbnMgPT0gTlVMTCkKLQkJCWdvdG8gaGFuZGxlX2Vycm9yOwotCQlQeV9JTkNSRUYoaW50ZXJwLT5idWlsdGlucyk7Ci0JfQotCXN5c21vZCA9IF9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uKCJzeXMiLCAic3lzIik7Ci0JaWYgKGJpbW9kICE9IE5VTEwgJiYgc3lzbW9kICE9IE5VTEwpIHsKLQkJaW50ZXJwLT5zeXNkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChzeXNtb2QpOwotCQlpZiAoaW50ZXJwLT5zeXNkaWN0ID09IE5VTEwpCi0JCQlnb3RvIGhhbmRsZV9lcnJvcjsKLQkJUHlfSU5DUkVGKGludGVycC0+c3lzZGljdCk7Ci0JCVB5U3lzX1NldFBhdGgoUHlfR2V0UGF0aCgpKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoaW50ZXJwLT5zeXNkaWN0LCAibW9kdWxlcyIsCi0JCQkJICAgICBpbnRlcnAtPm1vZHVsZXMpOwotCQlfUHlJbXBvcnRIb29rc19Jbml0KCk7Ci0JCWluaXRtYWluKCk7Ci0JCWlmICghUHlfTm9TaXRlRmxhZykKLQkJCWluaXRzaXRlKCk7Ci0JfQorICAgIGJpbW9kID0gX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24oIl9fYnVpbHRpbl9fIiwgIl9fYnVpbHRpbl9fIik7CisgICAgaWYgKGJpbW9kICE9IE5VTEwpIHsKKyAgICAgICAgaW50ZXJwLT5idWlsdGlucyA9IFB5TW9kdWxlX0dldERpY3QoYmltb2QpOworICAgICAgICBpZiAoaW50ZXJwLT5idWlsdGlucyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7CisgICAgICAgIFB5X0lOQ1JFRihpbnRlcnAtPmJ1aWx0aW5zKTsKKyAgICB9CisgICAgc3lzbW9kID0gX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24oInN5cyIsICJzeXMiKTsKKyAgICBpZiAoYmltb2QgIT0gTlVMTCAmJiBzeXNtb2QgIT0gTlVMTCkgeworICAgICAgICBpbnRlcnAtPnN5c2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KHN5c21vZCk7CisgICAgICAgIGlmIChpbnRlcnAtPnN5c2RpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOworICAgICAgICBQeV9JTkNSRUYoaW50ZXJwLT5zeXNkaWN0KTsKKyAgICAgICAgUHlTeXNfU2V0UGF0aChQeV9HZXRQYXRoKCkpOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhpbnRlcnAtPnN5c2RpY3QsICJtb2R1bGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwLT5tb2R1bGVzKTsKKyAgICAgICAgX1B5SW1wb3J0SG9va3NfSW5pdCgpOworICAgICAgICBpbml0bWFpbigpOworICAgICAgICBpZiAoIVB5X05vU2l0ZUZsYWcpCisgICAgICAgICAgICBpbml0c2l0ZSgpOworICAgIH0KIAotCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIHRzdGF0ZTsKKyAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiB0c3RhdGU7CiAKIGhhbmRsZV9lcnJvcjoKLQkvKiBPb3BzLCBpdCBkaWRuJ3Qgd29yay4gIFVuZG8gaXQgYWxsLiAqLworICAgIC8qIE9vcHMsIGl0IGRpZG4ndCB3b3JrLiAgVW5kbyBpdCBhbGwuICovCiAKLQlQeUVycl9QcmludCgpOwotCVB5VGhyZWFkU3RhdGVfQ2xlYXIodHN0YXRlKTsKLQlQeVRocmVhZFN0YXRlX1N3YXAoc2F2ZV90c3RhdGUpOwotCVB5VGhyZWFkU3RhdGVfRGVsZXRlKHRzdGF0ZSk7Ci0JUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShpbnRlcnApOworICAgIFB5RXJyX1ByaW50KCk7CisgICAgUHlUaHJlYWRTdGF0ZV9DbGVhcih0c3RhdGUpOworICAgIFB5VGhyZWFkU3RhdGVfU3dhcChzYXZlX3RzdGF0ZSk7CisgICAgUHlUaHJlYWRTdGF0ZV9EZWxldGUodHN0YXRlKTsKKyAgICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogRGVsZXRlIGFuIGludGVycHJldGVyIGFuZCBpdHMgbGFzdCB0aHJlYWQuICBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlCkBAIC02MzksMTkgKzYzOSwxOSBAQAogdm9pZAogUHlfRW5kSW50ZXJwcmV0ZXIoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gdHN0YXRlLT5pbnRlcnA7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSB0c3RhdGUtPmludGVycDsKIAotCWlmICh0c3RhdGUgIT0gUHlUaHJlYWRTdGF0ZV9HRVQoKSkKLQkJUHlfRmF0YWxFcnJvcigiUHlfRW5kSW50ZXJwcmV0ZXI6IHRocmVhZCBpcyBub3QgY3VycmVudCIpOwotCWlmICh0c3RhdGUtPmZyYW1lICE9IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0VuZEludGVycHJldGVyOiB0aHJlYWQgc3RpbGwgaGFzIGEgZnJhbWUiKTsKLQlpZiAodHN0YXRlICE9IGludGVycC0+dHN0YXRlX2hlYWQgfHwgdHN0YXRlLT5uZXh0ICE9IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0VuZEludGVycHJldGVyOiBub3QgdGhlIGxhc3QgdGhyZWFkIik7CisgICAgaWYgKHRzdGF0ZSAhPSBQeVRocmVhZFN0YXRlX0dFVCgpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9FbmRJbnRlcnByZXRlcjogdGhyZWFkIGlzIG5vdCBjdXJyZW50Iik7CisgICAgaWYgKHRzdGF0ZS0+ZnJhbWUgIT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfRW5kSW50ZXJwcmV0ZXI6IHRocmVhZCBzdGlsbCBoYXMgYSBmcmFtZSIpOworICAgIGlmICh0c3RhdGUgIT0gaW50ZXJwLT50c3RhdGVfaGVhZCB8fCB0c3RhdGUtPm5leHQgIT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfRW5kSW50ZXJwcmV0ZXI6IG5vdCB0aGUgbGFzdCB0aHJlYWQiKTsKIAotCVB5SW1wb3J0X0NsZWFudXAoKTsKLQlQeUludGVycHJldGVyU3RhdGVfQ2xlYXIoaW50ZXJwKTsKLQlQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7Ci0JUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShpbnRlcnApOworICAgIFB5SW1wb3J0X0NsZWFudXAoKTsKKyAgICBQeUludGVycHJldGVyU3RhdGVfQ2xlYXIoaW50ZXJwKTsKKyAgICBQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7CisgICAgUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShpbnRlcnApOwogfQogCiBzdGF0aWMgY2hhciAqcHJvZ25hbWUgPSAicHl0aG9uIjsKQEAgLTY1OSwxNCArNjU5LDE0IEBACiB2b2lkCiBQeV9TZXRQcm9ncmFtTmFtZShjaGFyICpwbikKIHsKLQlpZiAocG4gJiYgKnBuKQotCQlwcm9nbmFtZSA9IHBuOworICAgIGlmIChwbiAmJiAqcG4pCisgICAgICAgIHByb2duYW1lID0gcG47CiB9CiAKIGNoYXIgKgogUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCkKIHsKLQlyZXR1cm4gcHJvZ25hbWU7CisgICAgcmV0dXJuIHByb2duYW1lOwogfQogCiBzdGF0aWMgY2hhciAqZGVmYXVsdF9ob21lID0gTlVMTDsKQEAgLTY3NCwxNiArNjc0LDE2IEBACiB2b2lkCiBQeV9TZXRQeXRob25Ib21lKGNoYXIgKmhvbWUpCiB7Ci0JZGVmYXVsdF9ob21lID0gaG9tZTsKKyAgICBkZWZhdWx0X2hvbWUgPSBob21lOwogfQogCiBjaGFyICoKIFB5X0dldFB5dGhvbkhvbWUodm9pZCkKIHsKLQljaGFyICpob21lID0gZGVmYXVsdF9ob21lOwotCWlmIChob21lID09IE5VTEwgJiYgIVB5X0lnbm9yZUVudmlyb25tZW50RmxhZykKLQkJaG9tZSA9IFB5X0dFVEVOVigiUFlUSE9OSE9NRSIpOwotCXJldHVybiBob21lOworICAgIGNoYXIgKmhvbWUgPSBkZWZhdWx0X2hvbWU7CisgICAgaWYgKGhvbWUgPT0gTlVMTCAmJiAhUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnKQorICAgICAgICBob21lID0gUHlfR0VURU5WKCJQWVRIT05IT01FIik7CisgICAgcmV0dXJuIGhvbWU7CiB9CiAKIC8qIENyZWF0ZSBfX21haW5fXyBtb2R1bGUgKi8KQEAgLTY5MSwxOCArNjkxLDE4IEBACiBzdGF0aWMgdm9pZAogaW5pdG1haW4odm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JbSA9IFB5SW1wb3J0X0FkZE1vZHVsZSgiX19tYWluX18iKTsKLQlpZiAobSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBjcmVhdGUgX19tYWluX18gbW9kdWxlIik7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpiaW1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiX19idWlsdGluX18iKTsKLQkJaWYgKGJpbW9kID09IE5VTEwgfHwKLQkJICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2J1aWx0aW5zX18iLCBiaW1vZCkgIT0gMCkKLQkJCVB5X0ZhdGFsRXJyb3IoImNhbid0IGFkZCBfX2J1aWx0aW5zX18gdG8gX19tYWluX18iKTsKLQkJUHlfWERFQ1JFRihiaW1vZCk7Ci0JfQorICAgIFB5T2JqZWN0ICptLCAqZDsKKyAgICBtID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGNyZWF0ZSBfX21haW5fXyBtb2R1bGUiKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmJpbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJfX2J1aWx0aW5fXyIpOworICAgICAgICBpZiAoYmltb2QgPT0gTlVMTCB8fAorICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fYnVpbHRpbnNfXyIsIGJpbW9kKSAhPSAwKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiY2FuJ3QgYWRkIF9fYnVpbHRpbnNfXyB0byBfX21haW5fXyIpOworICAgICAgICBQeV9YREVDUkVGKGJpbW9kKTsKKyAgICB9CiB9CiAKIC8qIEltcG9ydCB0aGUgc2l0ZSBtb2R1bGUgKG5vdCBpbnRvIF9fbWFpbl9fIHRob3VnaCkgKi8KQEAgLTcxMCwxNDggKzcxMCwxNDggQEAKIHN0YXRpYyB2b2lkCiBpbml0c2l0ZSh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCW0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInNpdGUiKTsKLQlpZiAobSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCVB5X0ZpbmFsaXplKCk7Ci0JCWV4aXQoMSk7Ci0JfQotCWVsc2UgewotCQlQeV9ERUNSRUYobSk7Ci0JfQorICAgIFB5T2JqZWN0ICptOworICAgIG0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInNpdGUiKTsKKyAgICBpZiAobSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIFB5X0ZpbmFsaXplKCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9ERUNSRUYobSk7CisgICAgfQogfQogCiAvKiBQYXJzZSBpbnB1dCBmcm9tIGEgZmlsZSBhbmQgZXhlY3V0ZSBpdCAqLwogCiBpbnQKIFB5UnVuX0FueUZpbGVFeEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGNsb3NlaXQsCi0JCSAgICAgUHlDb21waWxlckZsYWdzICpmbGFncykKKyAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiB7Ci0JaWYgKGZpbGVuYW1lID09IE5VTEwpCi0JCWZpbGVuYW1lID0gIj8/PyI7Ci0JaWYgKFB5X0ZkSXNJbnRlcmFjdGl2ZShmcCwgZmlsZW5hbWUpKSB7Ci0JCWludCBlcnIgPSBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncyhmcCwgZmlsZW5hbWUsIGZsYWdzKTsKLQkJaWYgKGNsb3NlaXQpCi0JCQlmY2xvc2UoZnApOwotCQlyZXR1cm4gZXJyOwotCX0KLQllbHNlCi0JCXJldHVybiBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhmcCwgZmlsZW5hbWUsIGNsb3NlaXQsIGZsYWdzKTsKKyAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgZmlsZW5hbWUgPSAiPz8/IjsKKyAgICBpZiAoUHlfRmRJc0ludGVyYWN0aXZlKGZwLCBmaWxlbmFtZSkpIHsKKyAgICAgICAgaW50IGVyciA9IFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzKGZwLCBmaWxlbmFtZSwgZmxhZ3MpOworICAgICAgICBpZiAoY2xvc2VpdCkKKyAgICAgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKGZwLCBmaWxlbmFtZSwgY2xvc2VpdCwgZmxhZ3MpOwogfQogCiBpbnQKIFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlQeU9iamVjdCAqdjsKLQlpbnQgcmV0OwotCVB5Q29tcGlsZXJGbGFncyBsb2NhbF9mbGFnczsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgcmV0OworICAgIFB5Q29tcGlsZXJGbGFncyBsb2NhbF9mbGFnczsKIAotCWlmIChmbGFncyA9PSBOVUxMKSB7Ci0JCWZsYWdzID0gJmxvY2FsX2ZsYWdzOwotCQlsb2NhbF9mbGFncy5jZl9mbGFncyA9IDA7Ci0JfQotCXYgPSBQeVN5c19HZXRPYmplY3QoInBzMSIpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlTeXNfU2V0T2JqZWN0KCJwczEiLCB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPj4+ICIpKTsKLQkJUHlfWERFQ1JFRih2KTsKLQl9Ci0JdiA9IFB5U3lzX0dldE9iamVjdCgicHMyIik7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeVN5c19TZXRPYmplY3QoInBzMiIsIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIuLi4gIikpOwotCQlQeV9YREVDUkVGKHYpOwotCX0KLQlmb3IgKDs7KSB7Ci0JCXJldCA9IFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoZnAsIGZpbGVuYW1lLCBmbGFncyk7Ci0JCVBSSU5UX1RPVEFMX1JFRlMoKTsKLQkJaWYgKHJldCA9PSBFX0VPRikKLQkJCXJldHVybiAwOwotCQkvKgotCQlpZiAocmV0ID09IEVfTk9NRU0pCi0JCQlyZXR1cm4gLTE7Ci0JCSovCi0JfQorICAgIGlmIChmbGFncyA9PSBOVUxMKSB7CisgICAgICAgIGZsYWdzID0gJmxvY2FsX2ZsYWdzOworICAgICAgICBsb2NhbF9mbGFncy5jZl9mbGFncyA9IDA7CisgICAgfQorICAgIHYgPSBQeVN5c19HZXRPYmplY3QoInBzMSIpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlTeXNfU2V0T2JqZWN0KCJwczEiLCB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPj4+ICIpKTsKKyAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICB9CisgICAgdiA9IFB5U3lzX0dldE9iamVjdCgicHMyIik7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeVN5c19TZXRPYmplY3QoInBzMiIsIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIuLi4gIikpOworICAgICAgICBQeV9YREVDUkVGKHYpOworICAgIH0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHJldCA9IFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoZnAsIGZpbGVuYW1lLCBmbGFncyk7CisgICAgICAgIFBSSU5UX1RPVEFMX1JFRlMoKTsKKyAgICAgICAgaWYgKHJldCA9PSBFX0VPRikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAvKgorICAgICAgICBpZiAocmV0ID09IEVfTk9NRU0pCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICovCisgICAgfQogfQogCiAjaWYgMAogLyogY29tcHV0ZSBwYXJzZXIgZmxhZ3MgYmFzZWQgb24gY29tcGlsZXIgZmxhZ3MgKi8KICNkZWZpbmUgUEFSU0VSX0ZMQUdTKGZsYWdzKSBcCi0JKChmbGFncykgPyAoKCgoZmxhZ3MpLT5jZl9mbGFncyAmIFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQpID8gXAotCQkgICAgICBQeVBBUlNFX0RPTlRfSU1QTFlfREVERU5UIDogMCkpIDogMCkKKyAgICAoKGZsYWdzKSA/ICgoKChmbGFncyktPmNmX2ZsYWdzICYgUHlDRl9ET05UX0lNUExZX0RFREVOVCkgPyBcCisgICAgICAgICAgICAgICAgICBQeVBBUlNFX0RPTlRfSU1QTFlfREVERU5UIDogMCkpIDogMCkKICNlbmRpZgogI2lmIDEKIC8qIEtlZXAgYW4gZXhhbXBsZSBvZiBmbGFncyB3aXRoIGZ1dHVyZSBrZXl3b3JkIHN1cHBvcnQuICovCiAjZGVmaW5lIFBBUlNFUl9GTEFHUyhmbGFncykgXAotCSgoZmxhZ3MpID8gKCgoKGZsYWdzKS0+Y2ZfZmxhZ3MgJiBQeUNGX0RPTlRfSU1QTFlfREVERU5UKSA/IFwKLQkJICAgICAgUHlQQVJTRV9ET05UX0lNUExZX0RFREVOVCA6IDApIFwKLQkJICAgIHwgKCgoZmxhZ3MpLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTikgPyBcCi0JCSAgICAgICBQeVBBUlNFX1BSSU5UX0lTX0ZVTkNUSU9OIDogMCkgXAotCQkgICAgfCAoKChmbGFncyktPmNmX2ZsYWdzICYgQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFMpID8gXAotCQkgICAgICAgUHlQQVJTRV9VTklDT0RFX0xJVEVSQUxTIDogMCkgXAotCQkgICAgKSA6IDApCisgICAgKChmbGFncykgPyAoKCgoZmxhZ3MpLT5jZl9mbGFncyAmIFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQpID8gXAorICAgICAgICAgICAgICAgICAgUHlQQVJTRV9ET05UX0lNUExZX0RFREVOVCA6IDApIFwKKyAgICAgICAgICAgICAgICB8ICgoKGZsYWdzKS0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT04pID8gXAorICAgICAgICAgICAgICAgICAgIFB5UEFSU0VfUFJJTlRfSVNfRlVOQ1RJT04gOiAwKSBcCisgICAgICAgICAgICAgICAgfCAoKChmbGFncyktPmNmX2ZsYWdzICYgQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFMpID8gXAorICAgICAgICAgICAgICAgICAgIFB5UEFSU0VfVU5JQ09ERV9MSVRFUkFMUyA6IDApIFwKKyAgICAgICAgICAgICAgICApIDogMCkKICNlbmRpZgogCiBpbnQKIFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewotCVB5T2JqZWN0ICptLCAqZCwgKnYsICp3OwotCW1vZF90eSBtb2Q7Ci0JUHlBcmVuYSAqYXJlbmE7Ci0JY2hhciAqcHMxID0gIiIsICpwczIgPSAiIjsKLQlpbnQgZXJyY29kZSA9IDA7CisgICAgUHlPYmplY3QgKm0sICpkLCAqdiwgKnc7CisgICAgbW9kX3R5IG1vZDsKKyAgICBQeUFyZW5hICphcmVuYTsKKyAgICBjaGFyICpwczEgPSAiIiwgKnBzMiA9ICIiOworICAgIGludCBlcnJjb2RlID0gMDsKIAotCXYgPSBQeVN5c19HZXRPYmplY3QoInBzMSIpOwotCWlmICh2ICE9IE5VTEwpIHsKLQkJdiA9IFB5T2JqZWN0X1N0cih2KTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKQotCQkJcHMxID0gUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JfQotCXcgPSBQeVN5c19HZXRPYmplY3QoInBzMiIpOwotCWlmICh3ICE9IE5VTEwpIHsKLQkJdyA9IFB5T2JqZWN0X1N0cih3KTsKLQkJaWYgKHcgPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHcpKQotCQkJcHMyID0gUHlTdHJpbmdfQXNTdHJpbmcodyk7Ci0JfQotCWFyZW5hID0gUHlBcmVuYV9OZXcoKTsKLQlpZiAoYXJlbmEgPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKHYpOwotCQlQeV9YREVDUkVGKHcpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1vZCA9IFB5UGFyc2VyX0FTVEZyb21GaWxlKGZwLCBmaWxlbmFtZSwKLQkJCQkgICBQeV9zaW5nbGVfaW5wdXQsIHBzMSwgcHMyLAotCQkJCSAgIGZsYWdzLCAmZXJyY29kZSwgYXJlbmEpOwotCVB5X1hERUNSRUYodik7Ci0JUHlfWERFQ1JFRih3KTsKLQlpZiAobW9kID09IE5VTEwpIHsKLQkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQkJaWYgKGVycmNvZGUgPT0gRV9FT0YpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlyZXR1cm4gRV9FT0Y7Ci0JCX0KLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwotCWlmIChtID09IE5VTEwpIHsKLQkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQl2ID0gcnVuX21vZChtb2QsIGZpbGVuYW1lLCBkLCBkLCBmbGFncywgYXJlbmEpOwotCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9QcmludCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X0RFQ1JFRih2KTsKLQlpZiAoUHlfRmx1c2hMaW5lKCkpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIDA7CisgICAgdiA9IFB5U3lzX0dldE9iamVjdCgicHMxIik7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICB2ID0gUHlPYmplY3RfU3RyKHYpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sodikpCisgICAgICAgICAgICBwczEgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICB9CisgICAgdyA9IFB5U3lzX0dldE9iamVjdCgicHMyIik7CisgICAgaWYgKHcgIT0gTlVMTCkgeworICAgICAgICB3ID0gUHlPYmplY3RfU3RyKHcpOworICAgICAgICBpZiAodyA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sodykpCisgICAgICAgICAgICBwczIgPSBQeVN0cmluZ19Bc1N0cmluZyh3KTsKKyAgICB9CisgICAgYXJlbmEgPSBQeUFyZW5hX05ldygpOworICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgIFB5X1hERUNSRUYodyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbW9kID0gUHlQYXJzZXJfQVNURnJvbUZpbGUoZnAsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NpbmdsZV9pbnB1dCwgcHMxLCBwczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZlcnJjb2RlLCBhcmVuYSk7CisgICAgUHlfWERFQ1JFRih2KTsKKyAgICBQeV9YREVDUkVGKHcpOworICAgIGlmIChtb2QgPT0gTlVMTCkgeworICAgICAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgICAgICBpZiAoZXJyY29kZSA9PSBFX0VPRikgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBFX0VPRjsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG0gPSBQeUltcG9ydF9BZGRNb2R1bGUoIl9fbWFpbl9fIik7CisgICAgaWYgKG0gPT0gTlVMTCkgeworICAgICAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIHYgPSBydW5fbW9kKG1vZCwgZmlsZW5hbWUsIGQsIGQsIGZsYWdzLCBhcmVuYSk7CisgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIGlmIChQeV9GbHVzaExpbmUoKSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogQ2hlY2sgd2hldGhlciBhIGZpbGUgbWF5YmUgYSBweWMgZmlsZTogTG9vayBhdCB0aGUgZXh0ZW5zaW9uLApAQCAtODYwLDYyNCArODYwLDYyNCBAQAogc3RhdGljIGludAogbWF5YmVfcHljX2ZpbGUoRklMRSAqZnAsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBleHQsIGludCBjbG9zZWl0KQogewotCWlmIChzdHJjbXAoZXh0LCAiLnB5YyIpID09IDAgfHwgc3RyY21wKGV4dCwgIi5weW8iKSA9PSAwKQotCQlyZXR1cm4gMTsKKyAgICBpZiAoc3RyY21wKGV4dCwgIi5weWMiKSA9PSAwIHx8IHN0cmNtcChleHQsICIucHlvIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQkvKiBPbmx5IGxvb2sgaW50byB0aGUgZmlsZSBpZiB3ZSBhcmUgYWxsb3dlZCB0byBjbG9zZSBpdCwgc2luY2UKLQkgICBpdCB0aGVuIHNob3VsZCBhbHNvIGJlIHNlZWthYmxlLiAqLwotCWlmIChjbG9zZWl0KSB7Ci0JCS8qIFJlYWQgb25seSB0d28gYnl0ZXMgb2YgdGhlIG1hZ2ljLiBJZiB0aGUgZmlsZSB3YXMgb3BlbmVkIGluCi0JCSAgIHRleHQgbW9kZSwgdGhlIGJ5dGVzIDMgYW5kIDQgb2YgdGhlIG1hZ2ljIChcclxuKSBtaWdodCBub3QKLQkJICAgYmUgcmVhZCBhcyB0aGV5IGFyZSBvbiBkaXNrLiAqLwotCQl1bnNpZ25lZCBpbnQgaGFsZm1hZ2ljID0gUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIoKSAmIDB4RkZGRjsKLQkJdW5zaWduZWQgY2hhciBidWZbMl07Ci0JCS8qIE1lc3M6ICBJbiBjYXNlIG9mIC14LCB0aGUgc3RyZWFtIGlzIE5PVCBhdCBpdHMgc3RhcnQgbm93LAotCQkgICBhbmQgdW5nZXRjKCkgd2FzIHVzZWQgdG8gcHVzaCBiYWNrIHRoZSBmaXJzdCBuZXdsaW5lLAotCQkgICB3aGljaCBtYWtlcyB0aGUgY3VycmVudCBzdHJlYW0gcG9zaXRpb24gZm9ybWFsbHkgdW5kZWZpbmVkLAotCQkgICBhbmQgYSB4LXBsYXRmb3JtIG5pZ2h0bWFyZS4KLQkJICAgVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSBubyBkaXJlY3Qgd2F5IHRvIGtub3cgd2hldGhlciAteAotCQkgICB3YXMgc3BlY2lmaWVkLiAgU28gd2UgdXNlIGEgdGVycmlibGUgaGFjazogIGlmIHRoZSBjdXJyZW50Ci0JCSAgIHN0cmVhbSBwb3NpdGlvbiBpcyBub3QgMCwgd2UgYXNzdW1lIC14IHdhcyBzcGVjaWZpZWQsIGFuZAotCQkgICBnaXZlIHVwLiAgQnVnIDEzMjg1MCBvbiBTb3VyY2VGb3JnZSBzcGVsbHMgb3V0IHRoZQotCQkgICBob3BlbGVzc25lc3Mgb2YgdHJ5aW5nIGFueXRoaW5nIGVsc2UgKGZzZWVrIGFuZCBmdGVsbAotCQkgICBkb24ndCB3b3JrIHByZWRpY3RhYmx5IHgtcGxhdGZvcm0gZm9yIHRleHQtbW9kZSBmaWxlcykuCi0JCSovCi0JCWludCBpc3B5YyA9IDA7Ci0JCWlmIChmdGVsbChmcCkgPT0gMCkgewotCQkJaWYgKGZyZWFkKGJ1ZiwgMSwgMiwgZnApID09IDIgJiYKLQkJCSAgICAoKHVuc2lnbmVkIGludClidWZbMV08PDggfCBidWZbMF0pID09IGhhbGZtYWdpYykKLQkJCQlpc3B5YyA9IDE7Ci0JCQlyZXdpbmQoZnApOwotCQl9Ci0JCXJldHVybiBpc3B5YzsKLQl9Ci0JcmV0dXJuIDA7CisgICAgLyogT25seSBsb29rIGludG8gdGhlIGZpbGUgaWYgd2UgYXJlIGFsbG93ZWQgdG8gY2xvc2UgaXQsIHNpbmNlCisgICAgICAgaXQgdGhlbiBzaG91bGQgYWxzbyBiZSBzZWVrYWJsZS4gKi8KKyAgICBpZiAoY2xvc2VpdCkgeworICAgICAgICAvKiBSZWFkIG9ubHkgdHdvIGJ5dGVzIG9mIHRoZSBtYWdpYy4gSWYgdGhlIGZpbGUgd2FzIG9wZW5lZCBpbgorICAgICAgICAgICB0ZXh0IG1vZGUsIHRoZSBieXRlcyAzIGFuZCA0IG9mIHRoZSBtYWdpYyAoXHJcbikgbWlnaHQgbm90CisgICAgICAgICAgIGJlIHJlYWQgYXMgdGhleSBhcmUgb24gZGlzay4gKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGhhbGZtYWdpYyA9IFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKCkgJiAweEZGRkY7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmWzJdOworICAgICAgICAvKiBNZXNzOiAgSW4gY2FzZSBvZiAteCwgdGhlIHN0cmVhbSBpcyBOT1QgYXQgaXRzIHN0YXJ0IG5vdywKKyAgICAgICAgICAgYW5kIHVuZ2V0YygpIHdhcyB1c2VkIHRvIHB1c2ggYmFjayB0aGUgZmlyc3QgbmV3bGluZSwKKyAgICAgICAgICAgd2hpY2ggbWFrZXMgdGhlIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uIGZvcm1hbGx5IHVuZGVmaW5lZCwKKyAgICAgICAgICAgYW5kIGEgeC1wbGF0Zm9ybSBuaWdodG1hcmUuCisgICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHdlIGhhdmUgbm8gZGlyZWN0IHdheSB0byBrbm93IHdoZXRoZXIgLXgKKyAgICAgICAgICAgd2FzIHNwZWNpZmllZC4gIFNvIHdlIHVzZSBhIHRlcnJpYmxlIGhhY2s6ICBpZiB0aGUgY3VycmVudAorICAgICAgICAgICBzdHJlYW0gcG9zaXRpb24gaXMgbm90IDAsIHdlIGFzc3VtZSAteCB3YXMgc3BlY2lmaWVkLCBhbmQKKyAgICAgICAgICAgZ2l2ZSB1cC4gIEJ1ZyAxMzI4NTAgb24gU291cmNlRm9yZ2Ugc3BlbGxzIG91dCB0aGUKKyAgICAgICAgICAgaG9wZWxlc3NuZXNzIG9mIHRyeWluZyBhbnl0aGluZyBlbHNlIChmc2VlayBhbmQgZnRlbGwKKyAgICAgICAgICAgZG9uJ3Qgd29yayBwcmVkaWN0YWJseSB4LXBsYXRmb3JtIGZvciB0ZXh0LW1vZGUgZmlsZXMpLgorICAgICAgICAqLworICAgICAgICBpbnQgaXNweWMgPSAwOworICAgICAgICBpZiAoZnRlbGwoZnApID09IDApIHsKKyAgICAgICAgICAgIGlmIChmcmVhZChidWYsIDEsIDIsIGZwKSA9PSAyICYmCisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBpbnQpYnVmWzFdPDw4IHwgYnVmWzBdKSA9PSBoYWxmbWFnaWMpCisgICAgICAgICAgICAgICAgaXNweWMgPSAxOworICAgICAgICAgICAgcmV3aW5kKGZwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNweWM7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGNsb3NlaXQsCi0JCQlQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp2OwotCWNvbnN0IGNoYXIgKmV4dDsKLQlpbnQgc2V0X2ZpbGVfbmFtZSA9IDAsIHJldCwgbGVuOworICAgIFB5T2JqZWN0ICptLCAqZCwgKnY7CisgICAgY29uc3QgY2hhciAqZXh0OworICAgIGludCBzZXRfZmlsZV9uYW1lID0gMCwgcmV0LCBsZW47CiAKLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIikgPT0gTlVMTCkgewotCQlQeU9iamVjdCAqZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOwotCQlpZiAoZiA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIiwgZikgPCAwKSB7Ci0JCQlQeV9ERUNSRUYoZik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc2V0X2ZpbGVfbmFtZSA9IDE7Ci0JCVB5X0RFQ1JFRihmKTsKLQl9Ci0JbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKLQlleHQgPSBmaWxlbmFtZSArIGxlbiAtIChsZW4gPiA0ID8gNCA6IDApOwotCWlmIChtYXliZV9weWNfZmlsZShmcCwgZmlsZW5hbWUsIGV4dCwgY2xvc2VpdCkpIHsKLQkJLyogVHJ5IHRvIHJ1biBhIHB5YyBmaWxlLiBGaXJzdCwgcmUtb3BlbiBpbiBiaW5hcnkgKi8KLQkJaWYgKGNsb3NlaXQpCi0JCQlmY2xvc2UoZnApOwotCQlpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSA9PSBOVUxMKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgInB5dGhvbjogQ2FuJ3QgcmVvcGVuIC5weWMgZmlsZVxuIik7Ci0JCQlyZXQgPSAtMTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQkvKiBUdXJuIG9uIG9wdGltaXphdGlvbiBpZiBhIC5weW8gZmlsZSBpcyBnaXZlbiAqLwotCQlpZiAoc3RyY21wKGV4dCwgIi5weW8iKSA9PSAwKQotCQkJUHlfT3B0aW1pemVGbGFnID0gMTsKLQkJdiA9IHJ1bl9weWNfZmlsZShmcCwgZmlsZW5hbWUsIGQsIGQsIGZsYWdzKTsKLQl9IGVsc2UgewotCQl2ID0gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIGZpbGVuYW1lLCBQeV9maWxlX2lucHV0LCBkLCBkLAotCQkJCSAgICAgIGNsb3NlaXQsIGZsYWdzKTsKLQl9Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9QcmludCgpOwotCQlyZXQgPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQlQeV9ERUNSRUYodik7Ci0JaWYgKFB5X0ZsdXNoTGluZSgpKQotCQlQeUVycl9DbGVhcigpOwotCXJldCA9IDA7CisgICAgbSA9IFB5SW1wb3J0X0FkZE1vZHVsZSgiX19tYWluX18iKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIpID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKTsKKyAgICAgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIsIGYpIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGYpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNldF9maWxlX25hbWUgPSAxOworICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgfQorICAgIGxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CisgICAgZXh0ID0gZmlsZW5hbWUgKyBsZW4gLSAobGVuID4gNCA/IDQgOiAwKTsKKyAgICBpZiAobWF5YmVfcHljX2ZpbGUoZnAsIGZpbGVuYW1lLCBleHQsIGNsb3NlaXQpKSB7CisgICAgICAgIC8qIFRyeSB0byBydW4gYSBweWMgZmlsZS4gRmlyc3QsIHJlLW9wZW4gaW4gYmluYXJ5ICovCisgICAgICAgIGlmIChjbG9zZWl0KQorICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgaWYgKChmcCA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJweXRob246IENhbid0IHJlb3BlbiAucHljIGZpbGVcbiIpOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgICAgLyogVHVybiBvbiBvcHRpbWl6YXRpb24gaWYgYSAucHlvIGZpbGUgaXMgZ2l2ZW4gKi8KKyAgICAgICAgaWYgKHN0cmNtcChleHQsICIucHlvIikgPT0gMCkKKyAgICAgICAgICAgIFB5X09wdGltaXplRmxhZyA9IDE7CisgICAgICAgIHYgPSBydW5fcHljX2ZpbGUoZnAsIGZpbGVuYW1lLCBkLCBkLCBmbGFncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdiA9IFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBmaWxlbmFtZSwgUHlfZmlsZV9pbnB1dCwgZCwgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlaXQsIGZsYWdzKTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBQeV9ERUNSRUYodik7CisgICAgaWYgKFB5X0ZsdXNoTGluZSgpKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIHJldCA9IDA7CiAgIGRvbmU6Ci0JaWYgKHNldF9maWxlX25hbWUgJiYgUHlEaWN0X0RlbEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIikpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIHJldDsKKyAgICBpZiAoc2V0X2ZpbGVfbmFtZSAmJiBQeURpY3RfRGVsSXRlbVN0cmluZyhkLCAiX19maWxlX18iKSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBpbnQKIFB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKmNvbW1hbmQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqdjsKLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQl2ID0gUHlSdW5fU3RyaW5nRmxhZ3MoY29tbWFuZCwgUHlfZmlsZV9pbnB1dCwgZCwgZCwgZmxhZ3MpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9ERUNSRUYodik7Ci0JaWYgKFB5X0ZsdXNoTGluZSgpKQotCQlQeUVycl9DbGVhcigpOwotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICptLCAqZCwgKnY7CisgICAgbSA9IFB5SW1wb3J0X0FkZE1vZHVsZSgiX19tYWluX18iKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgdiA9IFB5UnVuX1N0cmluZ0ZsYWdzKGNvbW1hbmQsIFB5X2ZpbGVfaW5wdXQsIGQsIGQsIGZsYWdzKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIGlmIChQeV9GbHVzaExpbmUoKSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogcGFyc2Vfc3ludGF4X2Vycm9yKFB5T2JqZWN0ICplcnIsIFB5T2JqZWN0ICoqbWVzc2FnZSwgY29uc3QgY2hhciAqKmZpbGVuYW1lLAotCQkgICBpbnQgKmxpbmVubywgaW50ICpvZmZzZXQsIGNvbnN0IGNoYXIgKip0ZXh0KQorICAgICAgICAgICAgICAgICAgIGludCAqbGluZW5vLCBpbnQgKm9mZnNldCwgY29uc3QgY2hhciAqKnRleHQpCiB7Ci0JbG9uZyBob2xkOwotCVB5T2JqZWN0ICp2OworICAgIGxvbmcgaG9sZDsKKyAgICBQeU9iamVjdCAqdjsKIAotCS8qIG9sZCBzdHlsZSBlcnJvcnMgKi8KLQlpZiAoUHlUdXBsZV9DaGVjayhlcnIpKQotCQlyZXR1cm4gUHlBcmdfUGFyc2VUdXBsZShlcnIsICJPKHppaXopIiwgbWVzc2FnZSwgZmlsZW5hbWUsCi0JCQkJCWxpbmVubywgb2Zmc2V0LCB0ZXh0KTsKKyAgICAvKiBvbGQgc3R5bGUgZXJyb3JzICovCisgICAgaWYgKFB5VHVwbGVfQ2hlY2soZXJyKSkKKyAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUoZXJyLCAiTyh6aWl6KSIsIG1lc3NhZ2UsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIG9mZnNldCwgdGV4dCk7CiAKLQkvKiBuZXcgc3R5bGUgZXJyb3JzLiAgYGVycicgaXMgYW4gaW5zdGFuY2UgKi8KKyAgICAvKiBuZXcgc3R5bGUgZXJyb3JzLiAgYGVycicgaXMgYW4gaW5zdGFuY2UgKi8KIAotCWlmICghICh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJtc2ciKSkpCi0JCWdvdG8gZmluYWxseTsKLQkqbWVzc2FnZSA9IHY7CisgICAgaWYgKCEgKHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGVyciwgIm1zZyIpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgICptZXNzYWdlID0gdjsKIAotCWlmICghKHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGVyciwgImZpbGVuYW1lIikpKQotCQlnb3RvIGZpbmFsbHk7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQkJKmZpbGVuYW1lID0gTlVMTDsKLQllbHNlIGlmICghICgqZmlsZW5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyh2KSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJmaWxlbmFtZSIpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgICAgICpmaWxlbmFtZSA9IE5VTEw7CisgICAgZWxzZSBpZiAoISAoKmZpbGVuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcodikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlQeV9ERUNSRUYodik7Ci0JaWYgKCEodiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAibGluZW5vIikpKQotCQlnb3RvIGZpbmFsbHk7Ci0JaG9sZCA9IFB5SW50X0FzTG9uZyh2KTsKLQlQeV9ERUNSRUYodik7Ci0JdiA9IE5VTEw7Ci0JaWYgKGhvbGQgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCWdvdG8gZmluYWxseTsKLQkqbGluZW5vID0gKGludClob2xkOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJsaW5lbm8iKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBob2xkID0gUHlJbnRfQXNMb25nKHYpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICB2ID0gTlVMTDsKKyAgICBpZiAoaG9sZCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgICpsaW5lbm8gPSAoaW50KWhvbGQ7CiAKLQlpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJvZmZzZXQiKSkpCi0JCWdvdG8gZmluYWxseTsKLQlpZiAodiA9PSBQeV9Ob25lKSB7Ci0JCSpvZmZzZXQgPSAtMTsKLQkJUHlfREVDUkVGKHYpOwotCQl2ID0gTlVMTDsKLQl9IGVsc2UgewotCQlob2xkID0gUHlJbnRfQXNMb25nKHYpOwotCQlQeV9ERUNSRUYodik7Ci0JCXYgPSBOVUxMOwotCQlpZiAoaG9sZCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gZmluYWxseTsKLQkJKm9mZnNldCA9IChpbnQpaG9sZDsKLQl9CisgICAgaWYgKCEodiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAib2Zmc2V0IikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeworICAgICAgICAqb2Zmc2V0ID0gLTE7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgdiA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaG9sZCA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgaWYgKGhvbGQgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICpvZmZzZXQgPSAoaW50KWhvbGQ7CisgICAgfQogCi0JaWYgKCEodiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAidGV4dCIpKSkKLQkJZ290byBmaW5hbGx5OwotCWlmICh2ID09IFB5X05vbmUpCi0JCSp0ZXh0ID0gTlVMTDsKLQllbHNlIGlmICghICgqdGV4dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpKSkKLQkJZ290byBmaW5hbGx5OwotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJ0ZXh0IikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICAgICAgKnRleHQgPSBOVUxMOworICAgIGVsc2UgaWYgKCEgKCp0ZXh0ID0gUHlTdHJpbmdfQXNTdHJpbmcodikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiAxOwogCiBmaW5hbGx5OgotCVB5X1hERUNSRUYodik7Ci0JcmV0dXJuIDA7CisgICAgUHlfWERFQ1JFRih2KTsKKyAgICByZXR1cm4gMDsKIH0KIAogdm9pZAogUHlFcnJfUHJpbnQodm9pZCkKIHsKLQlQeUVycl9QcmludEV4KDEpOworICAgIFB5RXJyX1ByaW50RXgoMSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBwcmludF9lcnJvcl90ZXh0KFB5T2JqZWN0ICpmLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICp0ZXh0KQogewotCWNoYXIgKm5sOwotCWlmIChvZmZzZXQgPj0gMCkgewotCQlpZiAob2Zmc2V0ID4gMCAmJiBvZmZzZXQgPT0gKGludClzdHJsZW4odGV4dCkpCi0JCQlvZmZzZXQtLTsKLQkJZm9yICg7OykgewotCQkJbmwgPSBzdHJjaHIodGV4dCwgJ1xuJyk7Ci0JCQlpZiAobmwgPT0gTlVMTCB8fCBubC10ZXh0ID49IG9mZnNldCkKLQkJCQlicmVhazsKLQkJCW9mZnNldCAtPSAoaW50KShubCsxLXRleHQpOwotCQkJdGV4dCA9IG5sKzE7Ci0JCX0KLQkJd2hpbGUgKCp0ZXh0ID09ICcgJyB8fCAqdGV4dCA9PSAnXHQnKSB7Ci0JCQl0ZXh0Kys7Ci0JCQlvZmZzZXQtLTsKLQkJfQotCX0KLQlQeUZpbGVfV3JpdGVTdHJpbmcoIiAgICAiLCBmKTsKLQlQeUZpbGVfV3JpdGVTdHJpbmcodGV4dCwgZik7Ci0JaWYgKCp0ZXh0ID09ICdcMCcgfHwgdGV4dFtzdHJsZW4odGV4dCktMV0gIT0gJ1xuJykKLQkJUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIGYpOwotCWlmIChvZmZzZXQgPT0gLTEpCi0JCXJldHVybjsKLQlQeUZpbGVfV3JpdGVTdHJpbmcoIiAgICAiLCBmKTsKLQlvZmZzZXQtLTsKLQl3aGlsZSAob2Zmc2V0ID4gMCkgewotCQlQeUZpbGVfV3JpdGVTdHJpbmcoIiAiLCBmKTsKLQkJb2Zmc2V0LS07Ci0JfQotCVB5RmlsZV9Xcml0ZVN0cmluZygiXlxuIiwgZik7CisgICAgY2hhciAqbmw7CisgICAgaWYgKG9mZnNldCA+PSAwKSB7CisgICAgICAgIGlmIChvZmZzZXQgPiAwICYmIG9mZnNldCA9PSAoaW50KXN0cmxlbih0ZXh0KSkKKyAgICAgICAgICAgIG9mZnNldC0tOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBubCA9IHN0cmNocih0ZXh0LCAnXG4nKTsKKyAgICAgICAgICAgIGlmIChubCA9PSBOVUxMIHx8IG5sLXRleHQgPj0gb2Zmc2V0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgb2Zmc2V0IC09IChpbnQpKG5sKzEtdGV4dCk7CisgICAgICAgICAgICB0ZXh0ID0gbmwrMTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKnRleHQgPT0gJyAnIHx8ICp0ZXh0ID09ICdcdCcpIHsKKyAgICAgICAgICAgIHRleHQrKzsKKyAgICAgICAgICAgIG9mZnNldC0tOworICAgICAgICB9CisgICAgfQorICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiICAgICIsIGYpOworICAgIFB5RmlsZV9Xcml0ZVN0cmluZyh0ZXh0LCBmKTsKKyAgICBpZiAoKnRleHQgPT0gJ1wwJyB8fCB0ZXh0W3N0cmxlbih0ZXh0KS0xXSAhPSAnXG4nKQorICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIlxuIiwgZik7CisgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgcmV0dXJuOworICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiICAgICIsIGYpOworICAgIG9mZnNldC0tOworICAgIHdoaWxlIChvZmZzZXQgPiAwKSB7CisgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiICIsIGYpOworICAgICAgICBvZmZzZXQtLTsKKyAgICB9CisgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCJeXG4iLCBmKTsKIH0KIAogc3RhdGljIHZvaWQKIGhhbmRsZV9zeXN0ZW1fZXhpdCh2b2lkKQogewotCVB5T2JqZWN0ICpleGNlcHRpb24sICp2YWx1ZSwgKnRiOwotCWludCBleGl0Y29kZSA9IDA7CisgICAgUHlPYmplY3QgKmV4Y2VwdGlvbiwgKnZhbHVlLCAqdGI7CisgICAgaW50IGV4aXRjb2RlID0gMDsKIAotCWlmIChQeV9JbnNwZWN0RmxhZykKLQkJLyogRG9uJ3QgZXhpdCBpZiAtaSBmbGFnIHdhcyBnaXZlbi4gVGhpcyBmbGFnIGlzIHNldCB0byAwCi0JCSAqIHdoZW4gZW50ZXJpbmcgaW50ZXJhY3RpdmUgbW9kZSBmb3IgaW5zcGVjdGluZy4gKi8KLQkJcmV0dXJuOworICAgIGlmIChQeV9JbnNwZWN0RmxhZykKKyAgICAgICAgLyogRG9uJ3QgZXhpdCBpZiAtaSBmbGFnIHdhcyBnaXZlbi4gVGhpcyBmbGFnIGlzIHNldCB0byAwCisgICAgICAgICAqIHdoZW4gZW50ZXJpbmcgaW50ZXJhY3RpdmUgbW9kZSBmb3IgaW5zcGVjdGluZy4gKi8KKyAgICAgICAgcmV0dXJuOwogCi0JUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbiwgJnZhbHVlLCAmdGIpOwotCWlmIChQeV9GbHVzaExpbmUoKSkKLQkJUHlFcnJfQ2xlYXIoKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQlpZiAodmFsdWUgPT0gTlVMTCB8fCB2YWx1ZSA9PSBQeV9Ob25lKQotCQlnb3RvIGRvbmU7Ci0JaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodmFsdWUpKSB7Ci0JCS8qIFRoZSBlcnJvciBjb2RlIHNob3VsZCBiZSBpbiB0aGUgYGNvZGUnIGF0dHJpYnV0ZS4gKi8KLQkJUHlPYmplY3QgKmNvZGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiY29kZSIpOwotCQlpZiAoY29kZSkgewotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCXZhbHVlID0gY29kZTsKLQkJCWlmICh2YWx1ZSA9PSBQeV9Ob25lKQotCQkJCWdvdG8gZG9uZTsKLQkJfQotCQkvKiBJZiB3ZSBmYWlsZWQgdG8gZGlnIG91dCB0aGUgJ2NvZGUnIGF0dHJpYnV0ZSwKLQkJICAganVzdCBsZXQgdGhlIGVsc2UgY2xhdXNlIGJlbG93IHByaW50IHRoZSBlcnJvci4gKi8KLQl9Ci0JaWYgKFB5SW50X0NoZWNrKHZhbHVlKSkKLQkJZXhpdGNvZGUgPSAoaW50KVB5SW50X0FzTG9uZyh2YWx1ZSk7Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0X1ByaW50KHZhbHVlLCBzdGRlcnIsIFB5X1BSSU5UX1JBVyk7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJcbiIpOwotCQlleGl0Y29kZSA9IDE7Ci0JfQorICAgIFB5RXJyX0ZldGNoKCZleGNlcHRpb24sICZ2YWx1ZSwgJnRiKTsKKyAgICBpZiAoUHlfRmx1c2hMaW5lKCkpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgdmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgZ290byBkb25lOworICAgIGlmIChQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAvKiBUaGUgZXJyb3IgY29kZSBzaG91bGQgYmUgaW4gdGhlIGBjb2RlJyBhdHRyaWJ1dGUuICovCisgICAgICAgIFB5T2JqZWN0ICpjb2RlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgImNvZGUiKTsKKyAgICAgICAgaWYgKGNvZGUpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICB2YWx1ZSA9IGNvZGU7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgd2UgZmFpbGVkIHRvIGRpZyBvdXQgdGhlICdjb2RlJyBhdHRyaWJ1dGUsCisgICAgICAgICAgIGp1c3QgbGV0IHRoZSBlbHNlIGNsYXVzZSBiZWxvdyBwcmludCB0aGUgZXJyb3IuICovCisgICAgfQorICAgIGlmIChQeUludF9DaGVjayh2YWx1ZSkpCisgICAgICAgIGV4aXRjb2RlID0gKGludClQeUludF9Bc0xvbmcodmFsdWUpOworICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdF9QcmludCh2YWx1ZSwgc3RkZXJyLCBQeV9QUklOVF9SQVcpOworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiXG4iKTsKKyAgICAgICAgZXhpdGNvZGUgPSAxOworICAgIH0KICBkb25lOgotCS8qIFJlc3RvcmUgYW5kIGNsZWFyIHRoZSBleGNlcHRpb24gaW5mbywgaW4gb3JkZXIgdG8gcHJvcGVybHkgZGVjcmVmCi0JICogdGhlIGV4Y2VwdGlvbiwgdmFsdWUsIGFuZCB0cmFjZWJhY2suCSBJZiB3ZSBqdXN0IGV4aXQgaW5zdGVhZCwKLQkgKiB0aGVzZSBsZWFrLCB3aGljaCBjb25mdXNlcyBQWVRIT05EVU1QUkVGUyBvdXRwdXQsIGFuZCBtYXkgcHJldmVudAotCSAqIHNvbWUgZmluYWxpemVycyBmcm9tIHJ1bm5pbmcuCi0JICovCi0JUHlFcnJfUmVzdG9yZShleGNlcHRpb24sIHZhbHVlLCB0Yik7Ci0JUHlFcnJfQ2xlYXIoKTsKLQlQeV9FeGl0KGV4aXRjb2RlKTsKLQkvKiBOT1RSRUFDSEVEICovCisgICAgLyogUmVzdG9yZSBhbmQgY2xlYXIgdGhlIGV4Y2VwdGlvbiBpbmZvLCBpbiBvcmRlciB0byBwcm9wZXJseSBkZWNyZWYKKyAgICAgKiB0aGUgZXhjZXB0aW9uLCB2YWx1ZSwgYW5kIHRyYWNlYmFjay4gICAgICBJZiB3ZSBqdXN0IGV4aXQgaW5zdGVhZCwKKyAgICAgKiB0aGVzZSBsZWFrLCB3aGljaCBjb25mdXNlcyBQWVRIT05EVU1QUkVGUyBvdXRwdXQsIGFuZCBtYXkgcHJldmVudAorICAgICAqIHNvbWUgZmluYWxpemVycyBmcm9tIHJ1bm5pbmcuCisgICAgICovCisgICAgUHlFcnJfUmVzdG9yZShleGNlcHRpb24sIHZhbHVlLCB0Yik7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9FeGl0KGV4aXRjb2RlKTsKKyAgICAvKiBOT1RSRUFDSEVEICovCiB9CiAKIHZvaWQKIFB5RXJyX1ByaW50RXgoaW50IHNldF9zeXNfbGFzdF92YXJzKQogewotCVB5T2JqZWN0ICpleGNlcHRpb24sICp2LCAqdGIsICpob29rOworICAgIFB5T2JqZWN0ICpleGNlcHRpb24sICp2LCAqdGIsICpob29rOwogCi0JaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3lzdGVtRXhpdCkpIHsKLQkJaGFuZGxlX3N5c3RlbV9leGl0KCk7Ci0JfQotCVB5RXJyX0ZldGNoKCZleGNlcHRpb24sICZ2LCAmdGIpOwotCWlmIChleGNlcHRpb24gPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmZXhjZXB0aW9uLCAmdiwgJnRiKTsKLQlpZiAoZXhjZXB0aW9uID09IE5VTEwpCi0JCXJldHVybjsKLQkvKiBOb3cgd2Uga25vdyB2ICE9IE5VTEwgdG9vICovCi0JaWYgKHNldF9zeXNfbGFzdF92YXJzKSB7Ci0JCVB5U3lzX1NldE9iamVjdCgibGFzdF90eXBlIiwgZXhjZXB0aW9uKTsKLQkJUHlTeXNfU2V0T2JqZWN0KCJsYXN0X3ZhbHVlIiwgdik7Ci0JCVB5U3lzX1NldE9iamVjdCgibGFzdF90cmFjZWJhY2siLCB0Yik7Ci0JfQotCWhvb2sgPSBQeVN5c19HZXRPYmplY3QoImV4Y2VwdGhvb2siKTsKLQlpZiAoaG9vaykgewotCQlQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfUGFjaygzLAotCQkgICAgZXhjZXB0aW9uLCB2LCB0YiA/IHRiIDogUHlfTm9uZSk7Ci0JCVB5T2JqZWN0ICpyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChob29rLCBhcmdzKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCQlQeU9iamVjdCAqZXhjZXB0aW9uMiwgKnYyLCAqdGIyOwotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3lzdGVtRXhpdCkpIHsKLQkJCQloYW5kbGVfc3lzdGVtX2V4aXQoKTsKLQkJCX0KLQkJCVB5RXJyX0ZldGNoKCZleGNlcHRpb24yLCAmdjIsICZ0YjIpOwotCQkJUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGNlcHRpb24yLCAmdjIsICZ0YjIpOwotCQkJLyogSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBmb3IgZXhjZXB0aW9uMiBvciB2MgotCQkJICAgdG8gYmUgTlVMTC4gSG93ZXZlciBQeUVycl9EaXNwbGF5KCkgY2FuJ3QKLQkJCSAgIHRvbGVyYXRlIE5VTExzLCBzbyBqdXN0IGJlIHNhZmUuICovCi0JCQlpZiAoZXhjZXB0aW9uMiA9PSBOVUxMKSB7Ci0JCQkJZXhjZXB0aW9uMiA9IFB5X05vbmU7Ci0JCQkJUHlfSU5DUkVGKGV4Y2VwdGlvbjIpOwotCQkJfQotCQkJaWYgKHYyID09IE5VTEwpIHsKLQkJCQl2MiA9IFB5X05vbmU7Ci0JCQkJUHlfSU5DUkVGKHYyKTsKLQkJCX0KLQkJCWlmIChQeV9GbHVzaExpbmUoKSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJZmZsdXNoKHN0ZG91dCk7Ci0JCQlQeVN5c19Xcml0ZVN0ZGVycigiRXJyb3IgaW4gc3lzLmV4Y2VwdGhvb2s6XG4iKTsKLQkJCVB5RXJyX0Rpc3BsYXkoZXhjZXB0aW9uMiwgdjIsIHRiMik7Ci0JCQlQeVN5c19Xcml0ZVN0ZGVycigiXG5PcmlnaW5hbCBleGNlcHRpb24gd2FzOlxuIik7Ci0JCQlQeUVycl9EaXNwbGF5KGV4Y2VwdGlvbiwgdiwgdGIpOwotCQkJUHlfREVDUkVGKGV4Y2VwdGlvbjIpOwotCQkJUHlfREVDUkVGKHYyKTsKLQkJCVB5X1hERUNSRUYodGIyKTsKLQkJfQotCQlQeV9YREVDUkVGKHJlc3VsdCk7Ci0JCVB5X1hERUNSRUYoYXJncyk7Ci0JfSBlbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoInN5cy5leGNlcHRob29rIGlzIG1pc3NpbmdcbiIpOwotCQlQeUVycl9EaXNwbGF5KGV4Y2VwdGlvbiwgdiwgdGIpOwotCX0KLQlQeV9YREVDUkVGKGV4Y2VwdGlvbik7Ci0JUHlfWERFQ1JFRih2KTsKLQlQeV9YREVDUkVGKHRiKTsKKyAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkgeworICAgICAgICBoYW5kbGVfc3lzdGVtX2V4aXQoKTsKKyAgICB9CisgICAgUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbiwgJnYsICZ0Yik7CisgICAgaWYgKGV4Y2VwdGlvbiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGNlcHRpb24sICZ2LCAmdGIpOworICAgIGlmIChleGNlcHRpb24gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIC8qIE5vdyB3ZSBrbm93IHYgIT0gTlVMTCB0b28gKi8KKyAgICBpZiAoc2V0X3N5c19sYXN0X3ZhcnMpIHsKKyAgICAgICAgUHlTeXNfU2V0T2JqZWN0KCJsYXN0X3R5cGUiLCBleGNlcHRpb24pOworICAgICAgICBQeVN5c19TZXRPYmplY3QoImxhc3RfdmFsdWUiLCB2KTsKKyAgICAgICAgUHlTeXNfU2V0T2JqZWN0KCJsYXN0X3RyYWNlYmFjayIsIHRiKTsKKyAgICB9CisgICAgaG9vayA9IFB5U3lzX0dldE9iamVjdCgiZXhjZXB0aG9vayIpOworICAgIGlmIChob29rKSB7CisgICAgICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9QYWNrKDMsCisgICAgICAgICAgICBleGNlcHRpb24sIHYsIHRiID8gdGIgOiBQeV9Ob25lKTsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGhvb2ssIGFyZ3MpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpleGNlcHRpb24yLCAqdjIsICp0YjI7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkgeworICAgICAgICAgICAgICAgIGhhbmRsZV9zeXN0ZW1fZXhpdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbjIsICZ2MiwgJnRiMik7CisgICAgICAgICAgICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJmV4Y2VwdGlvbjIsICZ2MiwgJnRiMik7CisgICAgICAgICAgICAvKiBJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGZvciBleGNlcHRpb24yIG9yIHYyCisgICAgICAgICAgICAgICB0byBiZSBOVUxMLiBIb3dldmVyIFB5RXJyX0Rpc3BsYXkoKSBjYW4ndAorICAgICAgICAgICAgICAgdG9sZXJhdGUgTlVMTHMsIHNvIGp1c3QgYmUgc2FmZS4gKi8KKyAgICAgICAgICAgIGlmIChleGNlcHRpb24yID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24yID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZXhjZXB0aW9uMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodjIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHYyID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5X0ZsdXNoTGluZSgpKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFcnJvciBpbiBzeXMuZXhjZXB0aG9vazpcbiIpOworICAgICAgICAgICAgUHlFcnJfRGlzcGxheShleGNlcHRpb24yLCB2MiwgdGIyKTsKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJcbk9yaWdpbmFsIGV4Y2VwdGlvbiB3YXM6XG4iKTsKKyAgICAgICAgICAgIFB5RXJyX0Rpc3BsYXkoZXhjZXB0aW9uLCB2LCB0Yik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXhjZXB0aW9uMik7CisgICAgICAgICAgICBQeV9ERUNSRUYodjIpOworICAgICAgICAgICAgUHlfWERFQ1JFRih0YjIpOworICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigic3lzLmV4Y2VwdGhvb2sgaXMgbWlzc2luZ1xuIik7CisgICAgICAgIFB5RXJyX0Rpc3BsYXkoZXhjZXB0aW9uLCB2LCB0Yik7CisgICAgfQorICAgIFB5X1hERUNSRUYoZXhjZXB0aW9uKTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIFB5X1hERUNSRUYodGIpOwogfQogCiB2b2lkCiBQeUVycl9EaXNwbGF5KFB5T2JqZWN0ICpleGNlcHRpb24sIFB5T2JqZWN0ICp2YWx1ZSwgUHlPYmplY3QgKnRiKQogewotCWludCBlcnIgPSAwOwotCVB5T2JqZWN0ICpmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKLQlQeV9JTkNSRUYodmFsdWUpOwotCWlmIChmID09IE5VTEwpCi0JCWZwcmludGYoc3RkZXJyLCAibG9zdCBzeXMuc3RkZXJyXG4iKTsKLQllbHNlIHsKLQkJaWYgKFB5X0ZsdXNoTGluZSgpKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZmZsdXNoKHN0ZG91dCk7Ci0JCWlmICh0YiAmJiB0YiAhPSBQeV9Ob25lKQotCQkJZXJyID0gUHlUcmFjZUJhY2tfUHJpbnQodGIsIGYpOwotCQlpZiAoZXJyID09IDAgJiYKLQkJICAgIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodmFsdWUsICJwcmludF9maWxlX2FuZF9saW5lIikpCi0JCXsKLQkJCVB5T2JqZWN0ICptZXNzYWdlOwotCQkJY29uc3QgY2hhciAqZmlsZW5hbWUsICp0ZXh0OwotCQkJaW50IGxpbmVubywgb2Zmc2V0OwotCQkJaWYgKCFwYXJzZV9zeW50YXhfZXJyb3IodmFsdWUsICZtZXNzYWdlLCAmZmlsZW5hbWUsCi0JCQkJCQkmbGluZW5vLCAmb2Zmc2V0LCAmdGV4dCkpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UgewotCQkJCWNoYXIgYnVmWzEwXTsKLQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoIiAgRmlsZSBcIiIsIGYpOwotCQkJCWlmIChmaWxlbmFtZSA9PSBOVUxMKQotCQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoIjxzdHJpbmc+IiwgZik7Ci0JCQkJZWxzZQotCQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoZmlsZW5hbWUsIGYpOwotCQkJCVB5RmlsZV9Xcml0ZVN0cmluZygiXCIsIGxpbmUgIiwgZik7Ci0JCQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBsaW5lbm8pOwotCQkJCVB5RmlsZV9Xcml0ZVN0cmluZyhidWYsIGYpOwotCQkJCVB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmKTsKLQkJCQlpZiAodGV4dCAhPSBOVUxMKQotCQkJCQlwcmludF9lcnJvcl90ZXh0KGYsIG9mZnNldCwgdGV4dCk7Ci0JCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCQl2YWx1ZSA9IG1lc3NhZ2U7Ci0JCQkJLyogQ2FuJ3QgYmUgYm90aGVyZWQgdG8gY2hlY2sgYWxsIHRob3NlCi0JCQkJICAgUHlGaWxlX1dyaXRlU3RyaW5nKCkgY2FsbHMgKi8KLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJZXJyID0gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVycikgewotCQkJLyogRG9uJ3QgZG8gYW55dGhpbmcgZWxzZSAqLwotCQl9Ci0JCWVsc2UgaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2soZXhjZXB0aW9uKSkgewotCQkJUHlPYmplY3QqIG1vZHVsZU5hbWU7Ci0JCQljaGFyKiBjbGFzc05hbWUgPSBQeUV4Y2VwdGlvbkNsYXNzX05hbWUoZXhjZXB0aW9uKTsKLQkJCWlmIChjbGFzc05hbWUgIT0gTlVMTCkgewotCQkJCWNoYXIgKmRvdCA9IHN0cnJjaHIoY2xhc3NOYW1lLCAnLicpOwotCQkJCWlmIChkb3QgIT0gTlVMTCkKLQkJCQkJY2xhc3NOYW1lID0gZG90KzE7Ci0JCQl9CisgICAgaW50IGVyciA9IDA7CisgICAgUHlPYmplY3QgKmYgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJsb3N0IHN5cy5zdGRlcnJcbiIpOworICAgIGVsc2UgeworICAgICAgICBpZiAoUHlfRmx1c2hMaW5lKCkpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgaWYgKHRiICYmIHRiICE9IFB5X05vbmUpCisgICAgICAgICAgICBlcnIgPSBQeVRyYWNlQmFja19QcmludCh0YiwgZik7CisgICAgICAgIGlmIChlcnIgPT0gMCAmJgorICAgICAgICAgICAgUHlPYmplY3RfSGFzQXR0clN0cmluZyh2YWx1ZSwgInByaW50X2ZpbGVfYW5kX2xpbmUiKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlPYmplY3QgKm1lc3NhZ2U7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgKnRleHQ7CisgICAgICAgICAgICBpbnQgbGluZW5vLCBvZmZzZXQ7CisgICAgICAgICAgICBpZiAoIXBhcnNlX3N5bnRheF9lcnJvcih2YWx1ZSwgJm1lc3NhZ2UsICZmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW5lbm8sICZvZmZzZXQsICZ0ZXh0KSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZbMTBdOworICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiICBGaWxlIFwiIiwgZik7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiPHN0cmluZz4iLCBmKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZyhmaWxlbmFtZSwgZik7CisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCJcIiwgbGluZSAiLCBmKTsKKyAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZCIsIGxpbmVubyk7CisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKGJ1ZiwgZik7CisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIGYpOworICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yX3RleHQoZiwgb2Zmc2V0LCB0ZXh0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIHZhbHVlID0gbWVzc2FnZTsKKyAgICAgICAgICAgICAgICAvKiBDYW4ndCBiZSBib3RoZXJlZCB0byBjaGVjayBhbGwgdGhvc2UKKyAgICAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoKSBjYWxscyAqLworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAvKiBEb24ndCBkbyBhbnl0aGluZyBlbHNlICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayhleGNlcHRpb24pKSB7CisgICAgICAgICAgICBQeU9iamVjdCogbW9kdWxlTmFtZTsKKyAgICAgICAgICAgIGNoYXIqIGNsYXNzTmFtZSA9IFB5RXhjZXB0aW9uQ2xhc3NfTmFtZShleGNlcHRpb24pOworICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2hhciAqZG90ID0gc3RycmNocihjbGFzc05hbWUsICcuJyk7CisgICAgICAgICAgICAgICAgaWYgKGRvdCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBkb3QrMTsKKyAgICAgICAgICAgIH0KIAotCQkJbW9kdWxlTmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXhjZXB0aW9uLCAiX19tb2R1bGVfXyIpOwotCQkJaWYgKG1vZHVsZU5hbWUgPT0gTlVMTCkKLQkJCQllcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIjx1bmtub3duPiIsIGYpOwotCQkJZWxzZSB7Ci0JCQkJY2hhciogbW9kc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcobW9kdWxlTmFtZSk7Ci0JCQkJaWYgKG1vZHN0ciAmJiBzdHJjbXAobW9kc3RyLCAiZXhjZXB0aW9ucyIpKQotCQkJCXsKLQkJCQkJZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKG1vZHN0ciwgZik7Ci0JCQkJCWVyciArPSBQeUZpbGVfV3JpdGVTdHJpbmcoIi4iLCBmKTsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKG1vZHVsZU5hbWUpOwotCQkJfQotCQkJaWYgKGVyciA9PSAwKSB7Ci0JCQkJaWYgKGNsYXNzTmFtZSA9PSBOVUxMKQotCQkJCSAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiPHVua25vd24+IiwgZik7Ci0JCQkJZWxzZQotCQkJCSAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZyhjbGFzc05hbWUsIGYpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCWVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChleGNlcHRpb24sIGYsIFB5X1BSSU5UX1JBVyk7Ci0JCWlmIChlcnIgPT0gMCAmJiAodmFsdWUgIT0gUHlfTm9uZSkpIHsKLQkJCVB5T2JqZWN0ICpzID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKLQkJCS8qIG9ubHkgcHJpbnQgY29sb24gaWYgdGhlIHN0cigpIG9mIHRoZQotCQkJICAgb2JqZWN0IGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nCi0JCQkqLwotCQkJaWYgKHMgPT0gTlVMTCkKLQkJCQllcnIgPSAtMTsKLQkJCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhzKSB8fAotCQkJCSBQeVN0cmluZ19HRVRfU0laRShzKSAhPSAwKQotCQkJCWVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiOiAiLCBmKTsKLQkJCWlmIChlcnIgPT0gMCkKLQkJCSAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHMsIGYsIFB5X1BSSU5UX1JBVyk7Ci0JCQlQeV9YREVDUkVGKHMpOwotCQl9Ci0JCS8qIHRyeSB0byB3cml0ZSBhIG5ld2xpbmUgaW4gYW55IGNhc2UgKi8KLQkJZXJyICs9IFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmKTsKLQl9Ci0JUHlfREVDUkVGKHZhbHVlKTsKLQkvKiBJZiBhbiBlcnJvciBoYXBwZW5lZCBoZXJlLCBkb24ndCBzaG93IGl0LgotCSAgIFhYWCBUaGlzIGlzIHdyb25nLCBidXQgdG9vIG1hbnkgY2FsbGVycyByZWx5IG9uIHRoaXMgYmVoYXZpb3IuICovCi0JaWYgKGVyciAhPSAwKQotCQlQeUVycl9DbGVhcigpOworICAgICAgICAgICAgbW9kdWxlTmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXhjZXB0aW9uLCAiX19tb2R1bGVfXyIpOworICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIjx1bmtub3duPiIsIGYpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhciogbW9kc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcobW9kdWxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG1vZHN0ciAmJiBzdHJjbXAobW9kc3RyLCAiZXhjZXB0aW9ucyIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKG1vZHN0ciwgZik7CisgICAgICAgICAgICAgICAgICAgIGVyciArPSBQeUZpbGVfV3JpdGVTdHJpbmcoIi4iLCBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG1vZHVsZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiPHVua25vd24+IiwgZik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZyhjbGFzc05hbWUsIGYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChleGNlcHRpb24sIGYsIFB5X1BSSU5UX1JBVyk7CisgICAgICAgIGlmIChlcnIgPT0gMCAmJiAodmFsdWUgIT0gUHlfTm9uZSkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKKyAgICAgICAgICAgIC8qIG9ubHkgcHJpbnQgY29sb24gaWYgdGhlIHN0cigpIG9mIHRoZQorICAgICAgICAgICAgICAgb2JqZWN0IGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhzKSB8fAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUocykgIT0gMCkKKyAgICAgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIjogIiwgZik7CisgICAgICAgICAgICBpZiAoZXJyID09IDApCisgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChzLCBmLCBQeV9QUklOVF9SQVcpOworICAgICAgICAgICAgUHlfWERFQ1JFRihzKTsKKyAgICAgICAgfQorICAgICAgICAvKiB0cnkgdG8gd3JpdGUgYSBuZXdsaW5lIGluIGFueSBjYXNlICovCisgICAgICAgIGVyciArPSBQeUZpbGVfV3JpdGVTdHJpbmcoIlxuIiwgZik7CisgICAgfQorICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgLyogSWYgYW4gZXJyb3IgaGFwcGVuZWQgaGVyZSwgZG9uJ3Qgc2hvdyBpdC4KKyAgICAgICBYWFggVGhpcyBpcyB3cm9uZywgYnV0IHRvbyBtYW55IGNhbGxlcnMgcmVseSBvbiB0aGlzIGJlaGF2aW9yLiAqLworICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIH0KIAogUHlPYmplY3QgKgogUHlSdW5fU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqc3RyLCBpbnQgc3RhcnQsIFB5T2JqZWN0ICpnbG9iYWxzLAotCQkgIFB5T2JqZWN0ICpsb2NhbHMsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCW1vZF90eSBtb2Q7Ci0JUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCWlmIChhcmVuYSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBtb2RfdHkgbW9kOworICAgIFB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKKyAgICBpZiAoYXJlbmEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQltb2QgPSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKHN0ciwgIjxzdHJpbmc+Iiwgc3RhcnQsIGZsYWdzLCBhcmVuYSk7Ci0JaWYgKG1vZCAhPSBOVUxMKQotCQlyZXQgPSBydW5fbW9kKG1vZCwgIjxzdHJpbmc+IiwgZ2xvYmFscywgbG9jYWxzLCBmbGFncywgYXJlbmEpOwotCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JcmV0dXJuIHJldDsKKyAgICBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKHN0ciwgIjxzdHJpbmc+Iiwgc3RhcnQsIGZsYWdzLCBhcmVuYSk7CisgICAgaWYgKG1vZCAhPSBOVUxMKQorICAgICAgICByZXQgPSBydW5fbW9kKG1vZCwgIjxzdHJpbmc+IiwgZ2xvYmFscywgbG9jYWxzLCBmbGFncywgYXJlbmEpOworICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlPYmplY3QgKgogUHlSdW5fRmlsZUV4RmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsIFB5T2JqZWN0ICpnbG9iYWxzLAotCQkgIFB5T2JqZWN0ICpsb2NhbHMsIGludCBjbG9zZWl0LCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmxvY2FscywgaW50IGNsb3NlaXQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiB7Ci0JUHlPYmplY3QgKnJldDsKLQltb2RfdHkgbW9kOwotCVB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKLQlpZiAoYXJlbmEgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKnJldDsKKyAgICBtb2RfdHkgbW9kOworICAgIFB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKKyAgICBpZiAoYXJlbmEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQltb2QgPSBQeVBhcnNlcl9BU1RGcm9tRmlsZShmcCwgZmlsZW5hbWUsIHN0YXJ0LCAwLCAwLAotCQkJCSAgIGZsYWdzLCBOVUxMLCBhcmVuYSk7Ci0JaWYgKGNsb3NlaXQpCi0JCWZjbG9zZShmcCk7Ci0JaWYgKG1vZCA9PSBOVUxMKSB7Ci0JCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXQgPSBydW5fbW9kKG1vZCwgZmlsZW5hbWUsIGdsb2JhbHMsIGxvY2FscywgZmxhZ3MsIGFyZW5hKTsKLQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwotCXJldHVybiByZXQ7CisgICAgbW9kID0gUHlQYXJzZXJfQVNURnJvbUZpbGUoZnAsIGZpbGVuYW1lLCBzdGFydCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgTlVMTCwgYXJlbmEpOworICAgIGlmIChjbG9zZWl0KQorICAgICAgICBmY2xvc2UoZnApOworICAgIGlmIChtb2QgPT0gTlVMTCkgeworICAgICAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0ID0gcnVuX21vZChtb2QsIGZpbGVuYW1lLCBnbG9iYWxzLCBsb2NhbHMsIGZsYWdzLCBhcmVuYSk7CisgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcnVuX21vZChtb2RfdHkgbW9kLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMsCi0JIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsIFB5QXJlbmEgKmFyZW5hKQorICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncywgUHlBcmVuYSAqYXJlbmEpCiB7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKLQlQeU9iamVjdCAqdjsKLQljbyA9IFB5QVNUX0NvbXBpbGUobW9kLCBmaWxlbmFtZSwgZmxhZ3MsIGFyZW5hKTsKLQlpZiAoY28gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdiA9IFB5RXZhbF9FdmFsQ29kZShjbywgZ2xvYmFscywgbG9jYWxzKTsKLQlQeV9ERUNSRUYoY28pOwotCXJldHVybiB2OworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgUHlPYmplY3QgKnY7CisgICAgY28gPSBQeUFTVF9Db21waWxlKG1vZCwgZmlsZW5hbWUsIGZsYWdzLCBhcmVuYSk7CisgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYgPSBQeUV2YWxfRXZhbENvZGUoY28sIGdsb2JhbHMsIGxvY2Fscyk7CisgICAgUHlfREVDUkVGKGNvKTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJ1bl9weWNfZmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIFB5T2JqZWN0ICpnbG9iYWxzLAotCSAgICAgUHlPYmplY3QgKmxvY2FscywgUHlDb21waWxlckZsYWdzICpmbGFncykKKyAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewotCVB5Q29kZU9iamVjdCAqY287Ci0JUHlPYmplY3QgKnY7Ci0JbG9uZyBtYWdpYzsKLQlsb25nIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKHZvaWQpOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgUHlPYmplY3QgKnY7CisgICAgbG9uZyBtYWdpYzsKKyAgICBsb25nIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKHZvaWQpOwogCi0JbWFnaWMgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7Ci0JaWYgKG1hZ2ljICE9IFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJCYWQgbWFnaWMgbnVtYmVyIGluIC5weWMgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKHZvaWQpIFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQl2ID0gUHlNYXJzaGFsX1JlYWRMYXN0T2JqZWN0RnJvbUZpbGUoZnApOwotCWZjbG9zZShmcCk7Ci0JaWYgKHYgPT0gTlVMTCB8fCAhUHlDb2RlX0NoZWNrKHYpKSB7Ci0JCVB5X1hERUNSRUYodik7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAiQmFkIGNvZGUgb2JqZWN0IGluIC5weWMgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JY28gPSAoUHlDb2RlT2JqZWN0ICopdjsKLQl2ID0gUHlFdmFsX0V2YWxDb2RlKGNvLCBnbG9iYWxzLCBsb2NhbHMpOwotCWlmICh2ICYmIGZsYWdzKQotCQlmbGFncy0+Y2ZfZmxhZ3MgfD0gKGNvLT5jb19mbGFncyAmIFB5Q0ZfTUFTSyk7Ci0JUHlfREVDUkVGKGNvKTsKLQlyZXR1cm4gdjsKKyAgICBtYWdpYyA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKKyAgICBpZiAobWFnaWMgIT0gUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJCYWQgbWFnaWMgbnVtYmVyIGluIC5weWMgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgKHZvaWQpIFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKKyAgICB2ID0gUHlNYXJzaGFsX1JlYWRMYXN0T2JqZWN0RnJvbUZpbGUoZnApOworICAgIGZjbG9zZShmcCk7CisgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlDb2RlX0NoZWNrKHYpKSB7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIkJhZCBjb2RlIG9iamVjdCBpbiAucHljIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNvID0gKFB5Q29kZU9iamVjdCAqKXY7CisgICAgdiA9IFB5RXZhbF9FdmFsQ29kZShjbywgZ2xvYmFscywgbG9jYWxzKTsKKyAgICBpZiAodiAmJiBmbGFncykKKyAgICAgICAgZmxhZ3MtPmNmX2ZsYWdzIHw9IChjby0+Y29fZmxhZ3MgJiBQeUNGX01BU0spOworICAgIFB5X0RFQ1JFRihjbyk7CisgICAgcmV0dXJuIHY7CiB9CiAKIFB5T2JqZWN0ICoKIFB5X0NvbXBpbGVTdHJpbmdGbGFncyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsCi0JCSAgICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlQeUNvZGVPYmplY3QgKmNvOwotCW1vZF90eSBtb2Q7Ci0JUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCWlmIChhcmVuYSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIG1vZF90eSBtb2Q7CisgICAgUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOworICAgIGlmIChhcmVuYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoc3RyLCBmaWxlbmFtZSwgc3RhcnQsIGZsYWdzLCBhcmVuYSk7Ci0JaWYgKG1vZCA9PSBOVUxMKSB7Ci0JCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZmxhZ3MgJiYgKGZsYWdzLT5jZl9mbGFncyAmIFB5Q0ZfT05MWV9BU1QpKSB7Ci0JCVB5T2JqZWN0ICpyZXN1bHQgPSBQeUFTVF9tb2Qyb2JqKG1vZCk7Ci0JCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCWNvID0gUHlBU1RfQ29tcGlsZShtb2QsIGZpbGVuYW1lLCBmbGFncywgYXJlbmEpOwotCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWNvOworICAgIG1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoc3RyLCBmaWxlbmFtZSwgc3RhcnQsIGZsYWdzLCBhcmVuYSk7CisgICAgaWYgKG1vZCA9PSBOVUxMKSB7CisgICAgICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiYgKGZsYWdzLT5jZl9mbGFncyAmIFB5Q0ZfT05MWV9BU1QpKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeUFTVF9tb2Qyb2JqKG1vZCk7CisgICAgICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGNvID0gUHlBU1RfQ29tcGlsZShtb2QsIGZpbGVuYW1lLCBmbGFncywgYXJlbmEpOworICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNvOwogfQogCiBzdHJ1Y3Qgc3ltdGFibGUgKgogUHlfU3ltdGFibGVTdHJpbmcoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0KQogewotCXN0cnVjdCBzeW10YWJsZSAqc3Q7Ci0JbW9kX3R5IG1vZDsKLQlQeUNvbXBpbGVyRmxhZ3MgZmxhZ3M7Ci0JUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCWlmIChhcmVuYSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzdHJ1Y3Qgc3ltdGFibGUgKnN0OworICAgIG1vZF90eSBtb2Q7CisgICAgUHlDb21waWxlckZsYWdzIGZsYWdzOworICAgIFB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKKyAgICBpZiAoYXJlbmEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmbGFncy5jZl9mbGFncyA9IDA7CisgICAgZmxhZ3MuY2ZfZmxhZ3MgPSAwOwogCi0JbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyhzdHIsIGZpbGVuYW1lLCBzdGFydCwgJmZsYWdzLCBhcmVuYSk7Ci0JaWYgKG1vZCA9PSBOVUxMKSB7Ci0JCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzdCA9IFB5U3ltdGFibGVfQnVpbGQobW9kLCBmaWxlbmFtZSwgMCk7Ci0JUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQlyZXR1cm4gc3Q7CisgICAgbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyhzdHIsIGZpbGVuYW1lLCBzdGFydCwgJmZsYWdzLCBhcmVuYSk7CisgICAgaWYgKG1vZCA9PSBOVUxMKSB7CisgICAgICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdCA9IFB5U3ltdGFibGVfQnVpbGQobW9kLCBmaWxlbmFtZSwgMCk7CisgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICByZXR1cm4gc3Q7CiB9CiAKIC8qIFByZWZlcnJlZCBhY2Nlc3MgdG8gcGFyc2VyIGlzIHRocm91Z2ggQVNULiAqLwogbW9kX3R5CiBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsCi0JCSAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBQeUFyZW5hICphcmVuYSkKKyAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncywgUHlBcmVuYSAqYXJlbmEpCiB7Ci0JbW9kX3R5IG1vZDsKLQlQeUNvbXBpbGVyRmxhZ3MgbG9jYWxmbGFnczsKLQlwZXJyZGV0YWlsIGVycjsKLQlpbnQgaWZsYWdzID0gUEFSU0VSX0ZMQUdTKGZsYWdzKTsKKyAgICBtb2RfdHkgbW9kOworICAgIFB5Q29tcGlsZXJGbGFncyBsb2NhbGZsYWdzOworICAgIHBlcnJkZXRhaWwgZXJyOworICAgIGludCBpZmxhZ3MgPSBQQVJTRVJfRkxBR1MoZmxhZ3MpOwogCi0Jbm9kZSAqbiA9IFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZUV4KHMsIGZpbGVuYW1lLAotCQkJCQkmX1B5UGFyc2VyX0dyYW1tYXIsIHN0YXJ0LCAmZXJyLAotCQkJCQkmaWZsYWdzKTsKLQlpZiAoZmxhZ3MgPT0gTlVMTCkgewotCQlsb2NhbGZsYWdzLmNmX2ZsYWdzID0gMDsKLQkJZmxhZ3MgPSAmbG9jYWxmbGFnczsKLQl9Ci0JaWYgKG4pIHsKLQkJZmxhZ3MtPmNmX2ZsYWdzIHw9IGlmbGFncyAmIFB5Q0ZfTUFTSzsKLQkJbW9kID0gUHlBU1RfRnJvbU5vZGUobiwgZmxhZ3MsIGZpbGVuYW1lLCBhcmVuYSk7Ci0JCVB5Tm9kZV9GcmVlKG4pOwotCQlyZXR1cm4gbW9kOwotCX0KLQllbHNlIHsKLQkJZXJyX2lucHV0KCZlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbm9kZSAqbiA9IFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZUV4KHMsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9QeVBhcnNlcl9HcmFtbWFyLCBzdGFydCwgJmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZmxhZ3MpOworICAgIGlmIChmbGFncyA9PSBOVUxMKSB7CisgICAgICAgIGxvY2FsZmxhZ3MuY2ZfZmxhZ3MgPSAwOworICAgICAgICBmbGFncyA9ICZsb2NhbGZsYWdzOworICAgIH0KKyAgICBpZiAobikgeworICAgICAgICBmbGFncy0+Y2ZfZmxhZ3MgfD0gaWZsYWdzICYgUHlDRl9NQVNLOworICAgICAgICBtb2QgPSBQeUFTVF9Gcm9tTm9kZShuLCBmbGFncywgZmlsZW5hbWUsIGFyZW5hKTsKKyAgICAgICAgUHlOb2RlX0ZyZWUobik7CisgICAgICAgIHJldHVybiBtb2Q7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlcnJfaW5wdXQoJmVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogbW9kX3R5CiBQeVBhcnNlcl9BU1RGcm9tRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCwgY2hhciAqcHMxLAotCQkgICAgIGNoYXIgKnBzMiwgUHlDb21waWxlckZsYWdzICpmbGFncywgaW50ICplcnJjb2RlLAotCQkgICAgIFB5QXJlbmEgKmFyZW5hKQorICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHMyLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBpbnQgKmVycmNvZGUsCisgICAgICAgICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSkKIHsKLQltb2RfdHkgbW9kOwotCVB5Q29tcGlsZXJGbGFncyBsb2NhbGZsYWdzOwotCXBlcnJkZXRhaWwgZXJyOwotCWludCBpZmxhZ3MgPSBQQVJTRVJfRkxBR1MoZmxhZ3MpOworICAgIG1vZF90eSBtb2Q7CisgICAgUHlDb21waWxlckZsYWdzIGxvY2FsZmxhZ3M7CisgICAgcGVycmRldGFpbCBlcnI7CisgICAgaW50IGlmbGFncyA9IFBBUlNFUl9GTEFHUyhmbGFncyk7CiAKLQlub2RlICpuID0gUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3NFeChmcCwgZmlsZW5hbWUsICZfUHlQYXJzZXJfR3JhbW1hciwKLQkJCQlzdGFydCwgcHMxLCBwczIsICZlcnIsICZpZmxhZ3MpOwotCWlmIChmbGFncyA9PSBOVUxMKSB7Ci0JCWxvY2FsZmxhZ3MuY2ZfZmxhZ3MgPSAwOwotCQlmbGFncyA9ICZsb2NhbGZsYWdzOwotCX0KLQlpZiAobikgewotCQlmbGFncy0+Y2ZfZmxhZ3MgfD0gaWZsYWdzICYgUHlDRl9NQVNLOwotCQltb2QgPSBQeUFTVF9Gcm9tTm9kZShuLCBmbGFncywgZmlsZW5hbWUsIGFyZW5hKTsKLQkJUHlOb2RlX0ZyZWUobik7Ci0JCXJldHVybiBtb2Q7Ci0JfQotCWVsc2UgewotCQllcnJfaW5wdXQoJmVycik7Ci0JCWlmIChlcnJjb2RlKQotCQkJKmVycmNvZGUgPSBlcnIuZXJyb3I7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBub2RlICpuID0gUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3NFeChmcCwgZmlsZW5hbWUsICZfUHlQYXJzZXJfR3JhbW1hciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgcHMxLCBwczIsICZlcnIsICZpZmxhZ3MpOworICAgIGlmIChmbGFncyA9PSBOVUxMKSB7CisgICAgICAgIGxvY2FsZmxhZ3MuY2ZfZmxhZ3MgPSAwOworICAgICAgICBmbGFncyA9ICZsb2NhbGZsYWdzOworICAgIH0KKyAgICBpZiAobikgeworICAgICAgICBmbGFncy0+Y2ZfZmxhZ3MgfD0gaWZsYWdzICYgUHlDRl9NQVNLOworICAgICAgICBtb2QgPSBQeUFTVF9Gcm9tTm9kZShuLCBmbGFncywgZmlsZW5hbWUsIGFyZW5hKTsKKyAgICAgICAgUHlOb2RlX0ZyZWUobik7CisgICAgICAgIHJldHVybiBtb2Q7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlcnJfaW5wdXQoJmVycik7CisgICAgICAgIGlmIChlcnJjb2RlKQorICAgICAgICAgICAgKmVycmNvZGUgPSBlcnIuZXJyb3I7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogLyogU2ltcGxpZmllZCBpbnRlcmZhY2UgdG8gcGFyc2VmaWxlIC0tIHJldHVybiBub2RlIG9yIHNldCBleGNlcHRpb24gKi8KQEAgLTE0ODUsMTMgKzE0ODUsMTMgQEAKIG5vZGUgKgogUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQsIGludCBmbGFncykKIHsKLQlwZXJyZGV0YWlsIGVycjsKLQlub2RlICpuID0gUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3MoZnAsIGZpbGVuYW1lLCAmX1B5UGFyc2VyX0dyYW1tYXIsCi0JCQkJCSAgc3RhcnQsIE5VTEwsIE5VTEwsICZlcnIsIGZsYWdzKTsKLQlpZiAobiA9PSBOVUxMKQotCQllcnJfaW5wdXQoJmVycik7CisgICAgcGVycmRldGFpbCBlcnI7CisgICAgbm9kZSAqbiA9IFB5UGFyc2VyX1BhcnNlRmlsZUZsYWdzKGZwLCBmaWxlbmFtZSwgJl9QeVBhcnNlcl9HcmFtbWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgTlVMTCwgTlVMTCwgJmVyciwgZmxhZ3MpOworICAgIGlmIChuID09IE5VTEwpCisgICAgICAgIGVycl9pbnB1dCgmZXJyKTsKIAotCXJldHVybiBuOworICAgIHJldHVybiBuOwogfQogCiAvKiBTaW1wbGlmaWVkIGludGVyZmFjZSB0byBwYXJzZXN0cmluZyAtLSByZXR1cm4gbm9kZSBvciBzZXQgZXhjZXB0aW9uICovCkBAIC0xNDk5LDMwICsxNDk5LDMwIEBACiBub2RlICoKIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqc3RyLCBpbnQgc3RhcnQsIGludCBmbGFncykKIHsKLQlwZXJyZGV0YWlsIGVycjsKLQlub2RlICpuID0gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFncyhzdHIsICZfUHlQYXJzZXJfR3JhbW1hciwKLQkJCQkJICAgIHN0YXJ0LCAmZXJyLCBmbGFncyk7Ci0JaWYgKG4gPT0gTlVMTCkKLQkJZXJyX2lucHV0KCZlcnIpOwotCXJldHVybiBuOworICAgIHBlcnJkZXRhaWwgZXJyOworICAgIG5vZGUgKm4gPSBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzKHN0ciwgJl9QeVBhcnNlcl9HcmFtbWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCAmZXJyLCBmbGFncyk7CisgICAgaWYgKG4gPT0gTlVMTCkKKyAgICAgICAgZXJyX2lucHV0KCZlcnIpOworICAgIHJldHVybiBuOwogfQogCiBub2RlICoKIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZShjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJCQlpbnQgc3RhcnQsIGludCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBmbGFncykKIHsKLQlwZXJyZGV0YWlsIGVycjsKLQlub2RlICpuID0gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHN0ciwgZmlsZW5hbWUsCi0JCQkJJl9QeVBhcnNlcl9HcmFtbWFyLCBzdGFydCwgJmVyciwgZmxhZ3MpOwotCWlmIChuID09IE5VTEwpCi0JCWVycl9pbnB1dCgmZXJyKTsKLQlyZXR1cm4gbjsKKyAgICBwZXJyZGV0YWlsIGVycjsKKyAgICBub2RlICpuID0gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHN0ciwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9QeVBhcnNlcl9HcmFtbWFyLCBzdGFydCwgJmVyciwgZmxhZ3MpOworICAgIGlmIChuID09IE5VTEwpCisgICAgICAgIGVycl9pbnB1dCgmZXJyKTsKKyAgICByZXR1cm4gbjsKIH0KIAogbm9kZSAqCiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZpbGVuYW1lKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCkKIHsKLQlyZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHN0ciwgZmlsZW5hbWUsIHN0YXJ0LCAwKTsKKyAgICByZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHN0ciwgZmlsZW5hbWUsIHN0YXJ0LCAwKTsKIH0KIAogLyogTWF5IHdhbnQgdG8gbW92ZSBhIG1vcmUgZ2VuZXJhbGl6ZWQgZm9ybSBvZiB0aGlzIHRvIHBhcnNldG9rLmMgb3IKQEAgLTE1MzEsNyArMTUzMSw3IEBACiB2b2lkCiBQeVBhcnNlcl9TZXRFcnJvcihwZXJyZGV0YWlsICplcnIpCiB7Ci0JZXJyX2lucHV0KGVycik7CisgICAgZXJyX2lucHV0KGVycik7CiB9CiAKIC8qIFNldCB0aGUgZXJyb3IgYXBwcm9wcmlhdGUgdG8gdGhlIGdpdmVuIGlucHV0IGVycm9yIGNvZGUgKHNlZSBlcnJjb2RlLmgpICovCkBAIC0xNTM5LDk4ICsxNTM5LDk4IEBACiBzdGF0aWMgdm9pZAogZXJyX2lucHV0KHBlcnJkZXRhaWwgKmVycikKIHsKLQlQeU9iamVjdCAqdiwgKncsICplcnJ0eXBlOwotCVB5T2JqZWN0KiB1ID0gTlVMTDsKLQljaGFyICptc2cgPSBOVUxMOwotCWVycnR5cGUgPSBQeUV4Y19TeW50YXhFcnJvcjsKLQlzd2l0Y2ggKGVyci0+ZXJyb3IpIHsKLQljYXNlIEVfRVJST1I6Ci0JCXJldHVybjsKLQljYXNlIEVfU1lOVEFYOgotCQllcnJ0eXBlID0gUHlFeGNfSW5kZW50YXRpb25FcnJvcjsKLQkJaWYgKGVyci0+ZXhwZWN0ZWQgPT0gSU5ERU5UKQotCQkJbXNnID0gImV4cGVjdGVkIGFuIGluZGVudGVkIGJsb2NrIjsKLQkJZWxzZSBpZiAoZXJyLT50b2tlbiA9PSBJTkRFTlQpCi0JCQltc2cgPSAidW5leHBlY3RlZCBpbmRlbnQiOwotCQllbHNlIGlmIChlcnItPnRva2VuID09IERFREVOVCkKLQkJCW1zZyA9ICJ1bmV4cGVjdGVkIHVuaW5kZW50IjsKLQkJZWxzZSB7Ci0JCQllcnJ0eXBlID0gUHlFeGNfU3ludGF4RXJyb3I7Ci0JCQltc2cgPSAiaW52YWxpZCBzeW50YXgiOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgRV9UT0tFTjoKLQkJbXNnID0gImludmFsaWQgdG9rZW4iOwotCQlicmVhazsKLQljYXNlIEVfRU9GUzoKLQkJbXNnID0gIkVPRiB3aGlsZSBzY2FubmluZyB0cmlwbGUtcXVvdGVkIHN0cmluZyBsaXRlcmFsIjsKLQkJYnJlYWs7Ci0JY2FzZSBFX0VPTFM6Ci0JCW1zZyA9ICJFT0wgd2hpbGUgc2Nhbm5pbmcgc3RyaW5nIGxpdGVyYWwiOwotCQlicmVhazsKLQljYXNlIEVfSU5UUjoKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19LZXlib2FyZEludGVycnVwdCk7Ci0JCWdvdG8gY2xlYW51cDsKLQljYXNlIEVfTk9NRU06Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gY2xlYW51cDsKLQljYXNlIEVfRU9GOgotCQltc2cgPSAidW5leHBlY3RlZCBFT0Ygd2hpbGUgcGFyc2luZyI7Ci0JCWJyZWFrOwotCWNhc2UgRV9UQUJTUEFDRToKLQkJZXJydHlwZSA9IFB5RXhjX1RhYkVycm9yOwotCQltc2cgPSAiaW5jb25zaXN0ZW50IHVzZSBvZiB0YWJzIGFuZCBzcGFjZXMgaW4gaW5kZW50YXRpb24iOwotCQlicmVhazsKLQljYXNlIEVfT1ZFUkZMT1c6Ci0JCW1zZyA9ICJleHByZXNzaW9uIHRvbyBsb25nIjsKLQkJYnJlYWs7Ci0JY2FzZSBFX0RFREVOVDoKLQkJZXJydHlwZSA9IFB5RXhjX0luZGVudGF0aW9uRXJyb3I7Ci0JCW1zZyA9ICJ1bmluZGVudCBkb2VzIG5vdCBtYXRjaCBhbnkgb3V0ZXIgaW5kZW50YXRpb24gbGV2ZWwiOwotCQlicmVhazsKLQljYXNlIEVfVE9PREVFUDoKLQkJZXJydHlwZSA9IFB5RXhjX0luZGVudGF0aW9uRXJyb3I7Ci0JCW1zZyA9ICJ0b28gbWFueSBsZXZlbHMgb2YgaW5kZW50YXRpb24iOwotCQlicmVhazsKLQljYXNlIEVfREVDT0RFOiB7Ci0JCVB5T2JqZWN0ICp0eXBlLCAqdmFsdWUsICp0YjsKLQkJUHlFcnJfRmV0Y2goJnR5cGUsICZ2YWx1ZSwgJnRiKTsKLQkJaWYgKHZhbHVlICE9IE5VTEwpIHsKLQkJCXUgPSBQeU9iamVjdF9TdHIodmFsdWUpOwotCQkJaWYgKHUgIT0gTlVMTCkgewotCQkJCW1zZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHUpOwotCQkJfQotCQl9Ci0JCWlmIChtc2cgPT0gTlVMTCkKLQkJCW1zZyA9ICJ1bmtub3duIGRlY29kZSBlcnJvciI7Ci0JCVB5X1hERUNSRUYodHlwZSk7Ci0JCVB5X1hERUNSRUYodmFsdWUpOwotCQlQeV9YREVDUkVGKHRiKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgRV9MSU5FQ09OVDoKLQkJbXNnID0gInVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3RlciI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCAiZXJyb3I9JWRcbiIsIGVyci0+ZXJyb3IpOwotCQltc2cgPSAidW5rbm93biBwYXJzaW5nIGVycm9yIjsKLQkJYnJlYWs7Ci0JfQotCXYgPSBQeV9CdWlsZFZhbHVlKCIoemlpeikiLCBlcnItPmZpbGVuYW1lLAotCQkJICBlcnItPmxpbmVubywgZXJyLT5vZmZzZXQsIGVyci0+dGV4dCk7Ci0JdyA9IE5VTEw7Ci0JaWYgKHYgIT0gTlVMTCkKLQkJdyA9IFB5X0J1aWxkVmFsdWUoIihzTykiLCBtc2csIHYpOwotCVB5X1hERUNSRUYodSk7Ci0JUHlfWERFQ1JFRih2KTsKLQlQeUVycl9TZXRPYmplY3QoZXJydHlwZSwgdyk7Ci0JUHlfWERFQ1JFRih3KTsKKyAgICBQeU9iamVjdCAqdiwgKncsICplcnJ0eXBlOworICAgIFB5T2JqZWN0KiB1ID0gTlVMTDsKKyAgICBjaGFyICptc2cgPSBOVUxMOworICAgIGVycnR5cGUgPSBQeUV4Y19TeW50YXhFcnJvcjsKKyAgICBzd2l0Y2ggKGVyci0+ZXJyb3IpIHsKKyAgICBjYXNlIEVfRVJST1I6CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEVfU1lOVEFYOgorICAgICAgICBlcnJ0eXBlID0gUHlFeGNfSW5kZW50YXRpb25FcnJvcjsKKyAgICAgICAgaWYgKGVyci0+ZXhwZWN0ZWQgPT0gSU5ERU5UKQorICAgICAgICAgICAgbXNnID0gImV4cGVjdGVkIGFuIGluZGVudGVkIGJsb2NrIjsKKyAgICAgICAgZWxzZSBpZiAoZXJyLT50b2tlbiA9PSBJTkRFTlQpCisgICAgICAgICAgICBtc2cgPSAidW5leHBlY3RlZCBpbmRlbnQiOworICAgICAgICBlbHNlIGlmIChlcnItPnRva2VuID09IERFREVOVCkKKyAgICAgICAgICAgIG1zZyA9ICJ1bmV4cGVjdGVkIHVuaW5kZW50IjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBlcnJ0eXBlID0gUHlFeGNfU3ludGF4RXJyb3I7CisgICAgICAgICAgICBtc2cgPSAiaW52YWxpZCBzeW50YXgiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRV9UT0tFTjoKKyAgICAgICAgbXNnID0gImludmFsaWQgdG9rZW4iOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfRU9GUzoKKyAgICAgICAgbXNnID0gIkVPRiB3aGlsZSBzY2FubmluZyB0cmlwbGUtcXVvdGVkIHN0cmluZyBsaXRlcmFsIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFX0VPTFM6CisgICAgICAgIG1zZyA9ICJFT0wgd2hpbGUgc2Nhbm5pbmcgc3RyaW5nIGxpdGVyYWwiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfSU5UUjoKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19LZXlib2FyZEludGVycnVwdCk7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBjYXNlIEVfTk9NRU06CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBjYXNlIEVfRU9GOgorICAgICAgICBtc2cgPSAidW5leHBlY3RlZCBFT0Ygd2hpbGUgcGFyc2luZyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRV9UQUJTUEFDRToKKyAgICAgICAgZXJydHlwZSA9IFB5RXhjX1RhYkVycm9yOworICAgICAgICBtc2cgPSAiaW5jb25zaXN0ZW50IHVzZSBvZiB0YWJzIGFuZCBzcGFjZXMgaW4gaW5kZW50YXRpb24iOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfT1ZFUkZMT1c6CisgICAgICAgIG1zZyA9ICJleHByZXNzaW9uIHRvbyBsb25nIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFX0RFREVOVDoKKyAgICAgICAgZXJydHlwZSA9IFB5RXhjX0luZGVudGF0aW9uRXJyb3I7CisgICAgICAgIG1zZyA9ICJ1bmluZGVudCBkb2VzIG5vdCBtYXRjaCBhbnkgb3V0ZXIgaW5kZW50YXRpb24gbGV2ZWwiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfVE9PREVFUDoKKyAgICAgICAgZXJydHlwZSA9IFB5RXhjX0luZGVudGF0aW9uRXJyb3I7CisgICAgICAgIG1zZyA9ICJ0b28gbWFueSBsZXZlbHMgb2YgaW5kZW50YXRpb24iOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfREVDT0RFOiB7CisgICAgICAgIFB5T2JqZWN0ICp0eXBlLCAqdmFsdWUsICp0YjsKKyAgICAgICAgUHlFcnJfRmV0Y2goJnR5cGUsICZ2YWx1ZSwgJnRiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHUgPSBQeU9iamVjdF9TdHIodmFsdWUpOworICAgICAgICAgICAgaWYgKHUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1zZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICAgICAgICAgIG1zZyA9ICJ1bmtub3duIGRlY29kZSBlcnJvciI7CisgICAgICAgIFB5X1hERUNSRUYodHlwZSk7CisgICAgICAgIFB5X1hERUNSRUYodmFsdWUpOworICAgICAgICBQeV9YREVDUkVGKHRiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRV9MSU5FQ09OVDoKKyAgICAgICAgbXNnID0gInVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3RlciI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I9JWRcbiIsIGVyci0+ZXJyb3IpOworICAgICAgICBtc2cgPSAidW5rbm93biBwYXJzaW5nIGVycm9yIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoemlpeikiLCBlcnItPmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGVyci0+bGluZW5vLCBlcnItPm9mZnNldCwgZXJyLT50ZXh0KTsKKyAgICB3ID0gTlVMTDsKKyAgICBpZiAodiAhPSBOVUxMKQorICAgICAgICB3ID0gUHlfQnVpbGRWYWx1ZSgiKHNPKSIsIG1zZywgdik7CisgICAgUHlfWERFQ1JFRih1KTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIFB5RXJyX1NldE9iamVjdChlcnJ0eXBlLCB3KTsKKyAgICBQeV9YREVDUkVGKHcpOwogY2xlYW51cDoKLQlpZiAoZXJyLT50ZXh0ICE9IE5VTEwpIHsKLQkJUHlPYmplY3RfRlJFRShlcnItPnRleHQpOwotCQllcnItPnRleHQgPSBOVUxMOwotCX0KKyAgICBpZiAoZXJyLT50ZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3RfRlJFRShlcnItPnRleHQpOworICAgICAgICBlcnItPnRleHQgPSBOVUxMOworICAgIH0KIH0KIAogLyogUHJpbnQgZmF0YWwgZXJyb3IgbWVzc2FnZSBhbmQgYWJvcnQgKi8KQEAgLTE2MzgsMzAgKzE2MzgsMzAgQEAKIHZvaWQKIFB5X0ZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKQogewotCWZwcmludGYoc3RkZXJyLCAiRmF0YWwgUHl0aG9uIGVycm9yOiAlc1xuIiwgbXNnKTsKLQlmZmx1c2goc3RkZXJyKTsgLyogaXQgaGVscHMgaW4gV2luZG93cyBkZWJ1ZyBidWlsZCAqLworICAgIGZwcmludGYoc3RkZXJyLCAiRmF0YWwgUHl0aG9uIGVycm9yOiAlc1xuIiwgbXNnKTsKKyAgICBmZmx1c2goc3RkZXJyKTsgLyogaXQgaGVscHMgaW4gV2luZG93cyBkZWJ1ZyBidWlsZCAqLwogCiAjaWZkZWYgTVNfV0lORE9XUwotCXsKLQkJc2l6ZV90IGxlbiA9IHN0cmxlbihtc2cpOwotCQlXQ0hBUiogYnVmZmVyOwotCQlzaXplX3QgaTsKKyAgICB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4obXNnKTsKKyAgICAgICAgV0NIQVIqIGJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IGk7CiAKLQkJLyogQ29udmVydCB0aGUgbWVzc2FnZSB0byB3Y2hhcl90LiBUaGlzIHVzZXMgYSBzaW1wbGUgb25lLXRvLW9uZQotCQljb252ZXJzaW9uLCBhc3N1bWluZyB0aGF0IHRoZSB0aGlzIGVycm9yIG1lc3NhZ2UgYWN0dWFsbHkgdXNlcyBBU0NJSQotCQlvbmx5LiBJZiB0aGlzIGNlYXNlcyB0byBiZSB0cnVlLCB3ZSB3aWxsIGhhdmUgdG8gY29udmVydC4gKi8KLQkJYnVmZmVyID0gYWxsb2NhKCAobGVuKzEpICogKHNpemVvZiAqYnVmZmVyKSk7Ci0JCWZvciggaT0wOyBpPD1sZW47ICsraSkKLQkJCWJ1ZmZlcltpXSA9IG1zZ1tpXTsKLQkJT3V0cHV0RGVidWdTdHJpbmdXKEwiRmF0YWwgUHl0aG9uIGVycm9yOiAiKTsKLQkJT3V0cHV0RGVidWdTdHJpbmdXKGJ1ZmZlcik7Ci0JCU91dHB1dERlYnVnU3RyaW5nVyhMIlxuIik7Ci0JfQorICAgICAgICAvKiBDb252ZXJ0IHRoZSBtZXNzYWdlIHRvIHdjaGFyX3QuIFRoaXMgdXNlcyBhIHNpbXBsZSBvbmUtdG8tb25lCisgICAgICAgIGNvbnZlcnNpb24sIGFzc3VtaW5nIHRoYXQgdGhlIHRoaXMgZXJyb3IgbWVzc2FnZSBhY3R1YWxseSB1c2VzIEFTQ0lJCisgICAgICAgIG9ubHkuIElmIHRoaXMgY2Vhc2VzIHRvIGJlIHRydWUsIHdlIHdpbGwgaGF2ZSB0byBjb252ZXJ0LiAqLworICAgICAgICBidWZmZXIgPSBhbGxvY2EoIChsZW4rMSkgKiAoc2l6ZW9mICpidWZmZXIpKTsKKyAgICAgICAgZm9yKCBpPTA7IGk8PWxlbjsgKytpKQorICAgICAgICAgICAgYnVmZmVyW2ldID0gbXNnW2ldOworICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZ1coTCJGYXRhbCBQeXRob24gZXJyb3I6ICIpOworICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZ1coYnVmZmVyKTsKKyAgICAgICAgT3V0cHV0RGVidWdTdHJpbmdXKEwiXG4iKTsKKyAgICB9CiAjaWZkZWYgX0RFQlVHCi0JRGVidWdCcmVhaygpOworICAgIERlYnVnQnJlYWsoKTsKICNlbmRpZgogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KLQlhYm9ydCgpOworICAgIGFib3J0KCk7CiB9CiAKIC8qIENsZWFuIHVwIGFuZCBleGl0ICovCkBAIC0xNjc4LDIxICsxNjc4LDIxIEBACiB3YWl0X2Zvcl90aHJlYWRfc2h1dGRvd24odm9pZCkKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqdGhyZWFkaW5nID0gUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcodHN0YXRlLT5pbnRlcnAtPm1vZHVsZXMsCi0JCQkJCQkgICAgICAidGhyZWFkaW5nIik7Ci0JaWYgKHRocmVhZGluZyA9PSBOVUxMKSB7Ci0JCS8qIHRocmVhZGluZyBub3QgaW1wb3J0ZWQgKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuOwotCX0KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRocmVhZGluZywgIl9zaHV0ZG93biIsICIiKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZSh0aHJlYWRpbmcpOwotCWVsc2UKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JUHlfREVDUkVGKHRocmVhZGluZyk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICp0aHJlYWRpbmcgPSBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZyh0c3RhdGUtPmludGVycC0+bW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZGluZyIpOworICAgIGlmICh0aHJlYWRpbmcgPT0gTlVMTCkgeworICAgICAgICAvKiB0aHJlYWRpbmcgbm90IGltcG9ydGVkICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0aHJlYWRpbmcsICJfc2h1dGRvd24iLCAiIik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUodGhyZWFkaW5nKTsKKyAgICBlbHNlCisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRih0aHJlYWRpbmcpOwogI2VuZGlmCiB9CiAKQEAgLTE3MDIsNjYgKzE3MDIsNjYgQEAKIAogaW50IFB5X0F0RXhpdCh2b2lkICgqZnVuYykodm9pZCkpCiB7Ci0JaWYgKG5leGl0ZnVuY3MgPj0gTkVYSVRGVU5DUykKLQkJcmV0dXJuIC0xOwotCWV4aXRmdW5jc1tuZXhpdGZ1bmNzKytdID0gZnVuYzsKLQlyZXR1cm4gMDsKKyAgICBpZiAobmV4aXRmdW5jcyA+PSBORVhJVEZVTkNTKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZXhpdGZ1bmNzW25leGl0ZnVuY3MrK10gPSBmdW5jOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogY2FsbF9zeXNfZXhpdGZ1bmModm9pZCkKIHsKLQlQeU9iamVjdCAqZXhpdGZ1bmMgPSBQeVN5c19HZXRPYmplY3QoImV4aXRmdW5jIik7CisgICAgUHlPYmplY3QgKmV4aXRmdW5jID0gUHlTeXNfR2V0T2JqZWN0KCJleGl0ZnVuYyIpOwogCi0JaWYgKGV4aXRmdW5jKSB7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCVB5X0lOQ1JFRihleGl0ZnVuYyk7Ci0JCVB5U3lzX1NldE9iamVjdCgiZXhpdGZ1bmMiLCAoUHlPYmplY3QgKilOVUxMKTsKLQkJcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZXhpdGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOwotCQlpZiAocmVzID09IE5VTEwpIHsKLQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkgewotCQkJCVB5U3lzX1dyaXRlU3RkZXJyKCJFcnJvciBpbiBzeXMuZXhpdGZ1bmM6XG4iKTsKLQkJCX0KLQkJCVB5RXJyX1ByaW50KCk7Ci0JCX0KLQkJUHlfREVDUkVGKGV4aXRmdW5jKTsKLQl9CisgICAgaWYgKGV4aXRmdW5jKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIFB5X0lOQ1JFRihleGl0ZnVuYyk7CisgICAgICAgIFB5U3lzX1NldE9iamVjdCgiZXhpdGZ1bmMiLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZXhpdGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkgeworICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFcnJvciBpbiBzeXMuZXhpdGZ1bmM6XG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGV4aXRmdW5jKTsKKyAgICB9CiAKLQlpZiAoUHlfRmx1c2hMaW5lKCkpCi0JCVB5RXJyX0NsZWFyKCk7CisgICAgaWYgKFB5X0ZsdXNoTGluZSgpKQorICAgICAgICBQeUVycl9DbGVhcigpOwogfQogCiBzdGF0aWMgdm9pZAogY2FsbF9sbF9leGl0ZnVuY3Modm9pZCkKIHsKLQl3aGlsZSAobmV4aXRmdW5jcyA+IDApCi0JCSgqZXhpdGZ1bmNzWy0tbmV4aXRmdW5jc10pKCk7CisgICAgd2hpbGUgKG5leGl0ZnVuY3MgPiAwKQorICAgICAgICAoKmV4aXRmdW5jc1stLW5leGl0ZnVuY3NdKSgpOwogCi0JZmZsdXNoKHN0ZG91dCk7Ci0JZmZsdXNoKHN0ZGVycik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZmZsdXNoKHN0ZGVycik7CiB9CiAKIHZvaWQKIFB5X0V4aXQoaW50IHN0cykKIHsKLQlQeV9GaW5hbGl6ZSgpOworICAgIFB5X0ZpbmFsaXplKCk7CiAKLQlleGl0KHN0cyk7CisgICAgZXhpdChzdHMpOwogfQogCiBzdGF0aWMgdm9pZAogaW5pdHNpZ3Modm9pZCkKIHsKICNpZmRlZiBTSUdQSVBFCi0JUHlPU19zZXRzaWcoU0lHUElQRSwgU0lHX0lHTik7CisgICAgUHlPU19zZXRzaWcoU0lHUElQRSwgU0lHX0lHTik7CiAjZW5kaWYKICNpZmRlZiBTSUdYRloKLQlQeU9TX3NldHNpZyhTSUdYRlosIFNJR19JR04pOworICAgIFB5T1Nfc2V0c2lnKFNJR1hGWiwgU0lHX0lHTik7CiAjZW5kaWYKICNpZmRlZiBTSUdYRlNaCi0JUHlPU19zZXRzaWcoU0lHWEZTWiwgU0lHX0lHTik7CisgICAgUHlPU19zZXRzaWcoU0lHWEZTWiwgU0lHX0lHTik7CiAjZW5kaWYKLQlQeU9TX0luaXRJbnRlcnJ1cHRzKCk7IC8qIE1heSBpbXBseSBpbml0c2lnbmFsKCkgKi8KKyAgICBQeU9TX0luaXRJbnRlcnJ1cHRzKCk7IC8qIE1heSBpbXBseSBpbml0c2lnbmFsKCkgKi8KIH0KIAogCkBAIC0xNzc0LDEzICsxNzc0LDEzIEBACiBpbnQKIFB5X0ZkSXNJbnRlcmFjdGl2ZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0JaWYgKGlzYXR0eSgoaW50KWZpbGVubyhmcCkpKQotCQlyZXR1cm4gMTsKLQlpZiAoIVB5X0ludGVyYWN0aXZlRmxhZykKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIChmaWxlbmFtZSA9PSBOVUxMKSB8fAotCSAgICAgICAoc3RyY21wKGZpbGVuYW1lLCAiPHN0ZGluPiIpID09IDApIHx8Ci0JICAgICAgIChzdHJjbXAoZmlsZW5hbWUsICI/Pz8iKSA9PSAwKTsKKyAgICBpZiAoaXNhdHR5KChpbnQpZmlsZW5vKGZwKSkpCisgICAgICAgIHJldHVybiAxOworICAgIGlmICghUHlfSW50ZXJhY3RpdmVGbGFnKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gKGZpbGVuYW1lID09IE5VTEwpIHx8CisgICAgICAgICAgIChzdHJjbXAoZmlsZW5hbWUsICI8c3RkaW4+IikgPT0gMCkgfHwKKyAgICAgICAgICAgKHN0cmNtcChmaWxlbmFtZSwgIj8/PyIpID09IDApOwogfQogCiAKQEAgLTE3OTgsMjEgKzE3OTgsMjEgQEAKIGludAogUHlPU19DaGVja1N0YWNrKHZvaWQpCiB7Ci0JX190cnkgewotCQkvKiBhbGxvY2EgdGhyb3dzIGEgc3RhY2sgb3ZlcmZsb3cgZXhjZXB0aW9uIGlmIHRoZXJlJ3MKLQkJICAgbm90IGVub3VnaCBzcGFjZSBsZWZ0IG9uIHRoZSBzdGFjayAqLwotCQlhbGxvY2EoUFlPU19TVEFDS19NQVJHSU4gKiBzaXplb2Yodm9pZCopKTsKLQkJcmV0dXJuIDA7Ci0JfSBfX2V4Y2VwdCAoR2V0RXhjZXB0aW9uQ29kZSgpID09IFNUQVRVU19TVEFDS19PVkVSRkxPVyA/Ci0JCSAgICAgICAgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiA6Ci0JCSAgICAgICAgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCkgewotCQlpbnQgZXJyY29kZSA9IF9yZXNldHN0a29mbHcoKTsKLQkJaWYgKGVycmNvZGUgPT0gMCkKLQkJewotCQkJUHlfRmF0YWxFcnJvcigiQ291bGQgbm90IHJlc2V0IHRoZSBzdGFjayEiKTsKLQkJfQotCX0KLQlyZXR1cm4gMTsKKyAgICBfX3RyeSB7CisgICAgICAgIC8qIGFsbG9jYSB0aHJvd3MgYSBzdGFjayBvdmVyZmxvdyBleGNlcHRpb24gaWYgdGhlcmUncworICAgICAgICAgICBub3QgZW5vdWdoIHNwYWNlIGxlZnQgb24gdGhlIHN0YWNrICovCisgICAgICAgIGFsbG9jYShQWU9TX1NUQUNLX01BUkdJTiAqIHNpemVvZih2b2lkKikpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IF9fZXhjZXB0IChHZXRFeGNlcHRpb25Db2RlKCkgPT0gU1RBVFVTX1NUQUNLX09WRVJGTE9XID8KKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiA6CisgICAgICAgICAgICBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIKSB7CisgICAgICAgIGludCBlcnJjb2RlID0gX3Jlc2V0c3Rrb2ZsdygpOworICAgICAgICBpZiAoZXJyY29kZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJDb3VsZCBub3QgcmVzZXQgdGhlIHN0YWNrISIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiAjZW5kaWYgLyogV0lOMzIgJiYgX01TQ19WRVIgKi8KQEAgLTE4MjgsMzMgKzE4MjgsMzMgQEAKIFB5T1NfZ2V0c2lnKGludCBzaWcpCiB7CiAjaWZkZWYgSEFWRV9TSUdBQ1RJT04KLQlzdHJ1Y3Qgc2lnYWN0aW9uIGNvbnRleHQ7Ci0JaWYgKHNpZ2FjdGlvbihzaWcsIE5VTEwsICZjb250ZXh0KSA9PSAtMSkKLQkJcmV0dXJuIFNJR19FUlI7Ci0JcmV0dXJuIGNvbnRleHQuc2FfaGFuZGxlcjsKKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIGNvbnRleHQ7CisgICAgaWYgKHNpZ2FjdGlvbihzaWcsIE5VTEwsICZjb250ZXh0KSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFNJR19FUlI7CisgICAgcmV0dXJuIGNvbnRleHQuc2FfaGFuZGxlcjsKICNlbHNlCi0JUHlPU19zaWdoYW5kbGVyX3QgaGFuZGxlcjsKKyAgICBQeU9TX3NpZ2hhbmRsZXJfdCBoYW5kbGVyOwogLyogU3BlY2lhbCBzaWduYWwgaGFuZGxpbmcgZm9yIHRoZSBzZWN1cmUgQ1JUIGluIFZpc3VhbCBTdHVkaW8gMjAwNSAqLwogI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE0MDAKLQlzd2l0Y2ggKHNpZykgewotCS8qIE9ubHkgdGhlc2Ugc2lnbmFscyBhcmUgdmFsaWQgKi8KLQljYXNlIFNJR0lOVDoKLQljYXNlIFNJR0lMTDoKLQljYXNlIFNJR0ZQRToKLQljYXNlIFNJR1NFR1Y6Ci0JY2FzZSBTSUdURVJNOgotCWNhc2UgU0lHQlJFQUs6Ci0JY2FzZSBTSUdBQlJUOgotCQlicmVhazsKLQkvKiBEb24ndCBjYWxsIHNpZ25hbCgpIHdpdGggb3RoZXIgdmFsdWVzIG9yIGl0IHdpbGwgYXNzZXJ0ICovCi0JZGVmYXVsdDoKLQkJcmV0dXJuIFNJR19FUlI7Ci0JfQorICAgIHN3aXRjaCAoc2lnKSB7CisgICAgLyogT25seSB0aGVzZSBzaWduYWxzIGFyZSB2YWxpZCAqLworICAgIGNhc2UgU0lHSU5UOgorICAgIGNhc2UgU0lHSUxMOgorICAgIGNhc2UgU0lHRlBFOgorICAgIGNhc2UgU0lHU0VHVjoKKyAgICBjYXNlIFNJR1RFUk06CisgICAgY2FzZSBTSUdCUkVBSzoKKyAgICBjYXNlIFNJR0FCUlQ6CisgICAgICAgIGJyZWFrOworICAgIC8qIERvbid0IGNhbGwgc2lnbmFsKCkgd2l0aCBvdGhlciB2YWx1ZXMgb3IgaXQgd2lsbCBhc3NlcnQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gU0lHX0VSUjsKKyAgICB9CiAjZW5kaWYgLyogX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTQwMCAqLwotCWhhbmRsZXIgPSBzaWduYWwoc2lnLCBTSUdfSUdOKTsKLQlpZiAoaGFuZGxlciAhPSBTSUdfRVJSKQotCQlzaWduYWwoc2lnLCBoYW5kbGVyKTsKLQlyZXR1cm4gaGFuZGxlcjsKKyAgICBoYW5kbGVyID0gc2lnbmFsKHNpZywgU0lHX0lHTik7CisgICAgaWYgKGhhbmRsZXIgIT0gU0lHX0VSUikKKyAgICAgICAgc2lnbmFsKHNpZywgaGFuZGxlcik7CisgICAgcmV0dXJuIGhhbmRsZXI7CiAjZW5kaWYKIH0KIApAQCAtMTg2MiwyNCArMTg2MiwyNCBAQAogUHlPU19zZXRzaWcoaW50IHNpZywgUHlPU19zaWdoYW5kbGVyX3QgaGFuZGxlcikKIHsKICNpZmRlZiBIQVZFX1NJR0FDVElPTgotCS8qIFNvbWUgY29kZSBpbiBNb2R1bGVzL3NpZ25hbG1vZHVsZS5jIGRlcGVuZHMgb24gc2lnYWN0aW9uKCkgYmVpbmcKLQkgKiB1c2VkIGhlcmUgaWYgSEFWRV9TSUdBQ1RJT04gaXMgZGVmaW5lZC4gIEZpeCB0aGF0IGlmIHRoaXMgY29kZQotCSAqIGNoYW5nZXMgdG8gaW52YWxpZGF0ZSB0aGF0IGFzc3VtcHRpb24uCi0JICovCi0Jc3RydWN0IHNpZ2FjdGlvbiBjb250ZXh0LCBvY29udGV4dDsKLQljb250ZXh0LnNhX2hhbmRsZXIgPSBoYW5kbGVyOwotCXNpZ2VtcHR5c2V0KCZjb250ZXh0LnNhX21hc2spOwotCWNvbnRleHQuc2FfZmxhZ3MgPSAwOwotCWlmIChzaWdhY3Rpb24oc2lnLCAmY29udGV4dCwgJm9jb250ZXh0KSA9PSAtMSkKLQkJcmV0dXJuIFNJR19FUlI7Ci0JcmV0dXJuIG9jb250ZXh0LnNhX2hhbmRsZXI7CisgICAgLyogU29tZSBjb2RlIGluIE1vZHVsZXMvc2lnbmFsbW9kdWxlLmMgZGVwZW5kcyBvbiBzaWdhY3Rpb24oKSBiZWluZworICAgICAqIHVzZWQgaGVyZSBpZiBIQVZFX1NJR0FDVElPTiBpcyBkZWZpbmVkLiAgRml4IHRoYXQgaWYgdGhpcyBjb2RlCisgICAgICogY2hhbmdlcyB0byBpbnZhbGlkYXRlIHRoYXQgYXNzdW1wdGlvbi4KKyAgICAgKi8KKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIGNvbnRleHQsIG9jb250ZXh0OworICAgIGNvbnRleHQuc2FfaGFuZGxlciA9IGhhbmRsZXI7CisgICAgc2lnZW1wdHlzZXQoJmNvbnRleHQuc2FfbWFzayk7CisgICAgY29udGV4dC5zYV9mbGFncyA9IDA7CisgICAgaWYgKHNpZ2FjdGlvbihzaWcsICZjb250ZXh0LCAmb2NvbnRleHQpID09IC0xKQorICAgICAgICByZXR1cm4gU0lHX0VSUjsKKyAgICByZXR1cm4gb2NvbnRleHQuc2FfaGFuZGxlcjsKICNlbHNlCi0JUHlPU19zaWdoYW5kbGVyX3Qgb2xkaGFuZGxlcjsKLQlvbGRoYW5kbGVyID0gc2lnbmFsKHNpZywgaGFuZGxlcik7CisgICAgUHlPU19zaWdoYW5kbGVyX3Qgb2xkaGFuZGxlcjsKKyAgICBvbGRoYW5kbGVyID0gc2lnbmFsKHNpZywgaGFuZGxlcik7CiAjaWZkZWYgSEFWRV9TSUdJTlRFUlJVUFQKLQlzaWdpbnRlcnJ1cHQoc2lnLCAxKTsKKyAgICBzaWdpbnRlcnJ1cHQoc2lnLCAxKTsKICNlbmRpZgotCXJldHVybiBvbGRoYW5kbGVyOworICAgIHJldHVybiBvbGRoYW5kbGVyOwogI2VuZGlmCiB9CiAKQEAgLTE4ODksNzEgKzE4ODksNzEgQEAKIFB5QVBJX0ZVTkMobm9kZSAqKQogUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0KQogewotCXJldHVybiBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncyhmcCwgZmlsZW5hbWUsIHN0YXJ0LCAwKTsKKyAgICByZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoZnAsIGZpbGVuYW1lLCBzdGFydCwgMCk7CiB9CiAKICN1bmRlZiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZwogUHlBUElfRlVOQyhub2RlICopCiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzdGFydCkKIHsKLQlyZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhzdHIsIHN0YXJ0LCAwKTsKKyAgICByZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhzdHIsIHN0YXJ0LCAwKTsKIH0KIAogI3VuZGVmIFB5UnVuX0FueUZpbGUKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fQW55RmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIE5VTEwpOworICAgIHJldHVybiBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgTlVMTCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9BbnlGaWxlRXgKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fQW55RmlsZUV4KEZJTEUgKmZwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgY2xvc2VpdCkKIHsKLQlyZXR1cm4gUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIGNsb3NlaXQsIE5VTEwpOworICAgIHJldHVybiBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgY2xvc2VpdCwgTlVMTCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9BbnlGaWxlRmxhZ3MKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fQW55RmlsZUZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpuYW1lLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewotCXJldHVybiBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgZmxhZ3MpOworICAgIHJldHVybiBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgZmxhZ3MpOwogfQogCiAjdW5kZWYgUHlSdW5fRmlsZQogUHlBUElfRlVOQyhQeU9iamVjdCAqKQogUHlSdW5fRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqcCwgaW50IHMsIFB5T2JqZWN0ICpnLCBQeU9iamVjdCAqbCkKIHsKLQlyZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIE5VTEwpOworICAgIHJldHVybiBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgMCwgTlVMTCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9GaWxlRXgKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikKIFB5UnVuX0ZpbGVFeChGSUxFICpmcCwgY29uc3QgY2hhciAqcCwgaW50IHMsIFB5T2JqZWN0ICpnLCBQeU9iamVjdCAqbCwgaW50IGMpCiB7Ci0JcmV0dXJuIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCBjLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIGMsIE5VTEwpOwogfQogCiAjdW5kZWYgUHlSdW5fRmlsZUZsYWdzCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopCiBQeVJ1bl9GaWxlRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnAsIGludCBzLCBQeU9iamVjdCAqZywgUHlPYmplY3QgKmwsCi0JCVB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlyZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIGZsYWdzKTsKKyAgICByZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIGZsYWdzKTsKIH0KIAogI3VuZGVmIFB5UnVuX1NpbXBsZUZpbGUKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fU2ltcGxlRmlsZShGSUxFICpmLCBjb25zdCBjaGFyICpwKQogewotCXJldHVybiBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhmLCBwLCAwLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgMCwgTlVMTCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9TaW1wbGVGaWxlRXgKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fU2ltcGxlRmlsZUV4KEZJTEUgKmYsIGNvbnN0IGNoYXIgKnAsIGludCBjKQogewotCXJldHVybiBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhmLCBwLCBjLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgYywgTlVMTCk7CiB9CiAKIApAQCAtMTk2MSwzNSArMTk2MSwzNSBAQAogUHlBUElfRlVOQyhQeU9iamVjdCAqKQogUHlSdW5fU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHMsIFB5T2JqZWN0ICpnLCBQeU9iamVjdCAqbCkKIHsKLQlyZXR1cm4gUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBzLCBnLCBsLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBzLCBnLCBsLCBOVUxMKTsKIH0KIAogI3VuZGVmIFB5UnVuX1NpbXBsZVN0cmluZwogUHlBUElfRlVOQyhpbnQpCiBQeVJ1bl9TaW1wbGVTdHJpbmcoY29uc3QgY2hhciAqcykKIHsKLQlyZXR1cm4gUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MocywgTlVMTCk7CisgICAgcmV0dXJuIFB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzKHMsIE5VTEwpOwogfQogCiAjdW5kZWYgUHlfQ29tcGlsZVN0cmluZwogUHlBUElfRlVOQyhQeU9iamVjdCAqKQogUHlfQ29tcGlsZVN0cmluZyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnAsIGludCBzKQogewotCXJldHVybiBQeV9Db21waWxlU3RyaW5nRmxhZ3Moc3RyLCBwLCBzLCBOVUxMKTsKKyAgICByZXR1cm4gUHlfQ29tcGlsZVN0cmluZ0ZsYWdzKHN0ciwgcCwgcywgTlVMTCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9JbnRlcmFjdGl2ZU9uZQogUHlBUElfRlVOQyhpbnQpCiBQeVJ1bl9JbnRlcmFjdGl2ZU9uZShGSUxFICpmLCBjb25zdCBjaGFyICpwKQogewotCXJldHVybiBQeVJ1bl9JbnRlcmFjdGl2ZU9uZUZsYWdzKGYsIHAsIE5VTEwpOworICAgIHJldHVybiBQeVJ1bl9JbnRlcmFjdGl2ZU9uZUZsYWdzKGYsIHAsIE5VTEwpOwogfQogCiAjdW5kZWYgUHlSdW5fSW50ZXJhY3RpdmVMb29wCiBQeUFQSV9GVU5DKGludCkKIFB5UnVuX0ludGVyYWN0aXZlTG9vcChGSUxFICpmLCBjb25zdCBjaGFyICpwKQogewotCXJldHVybiBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncyhmLCBwLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoZiwgcCwgTlVMTCk7CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N0cnRvZC5jIGIvUHl0aG9uL3N0cnRvZC5jCmluZGV4IDc0OGYzN2IuLmVlNTU4OTggMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zdHJ0b2QuYworKysgYi9QeXRob24vc3RydG9kLmMKQEAgLTI1LDkgKzI1LDkgQEAKIAogICAgIFRoZXJlIGFyZSB0d28gcmVhc29ucyB3aHkgdGhpcyBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIG5ldDoKICAgICAoYSkgc29tZSBVTklYIHN5c3RlbXMgZG8gbm90IHlldCBoYXZlIHN0cnRvZCgpLCBvciBkbyBub3QgaGF2ZSBpdAotICAgICAgICBhdmFpbGFibGUgaW4gdGhlIEJTRCAidW5pdmVyc2UiIChidXQgdGhleSBkbyBoYXZlIGF0b2YoKSkuCisgICAgYXZhaWxhYmxlIGluIHRoZSBCU0QgInVuaXZlcnNlIiAoYnV0IHRoZXkgZG8gaGF2ZSBhdG9mKCkpLgogICAgIChiKSBzb21lIG9mIHRoZSBVTklYIHN5c3RlbXMgdGhhdCAqZG8qIGhhdmUgaXQgZ2V0IGl0IHdyb25nLgotCShzb21lIGNyYXNoIHdpdGggbGFyZ2UgYXJndW1lbnRzLCBzb21lIGFzc2lnbiB0aGUgd3JvbmcgKnB0ciB2YWx1ZSkuCisgICAgKHNvbWUgY3Jhc2ggd2l0aCBsYXJnZSBhcmd1bWVudHMsIHNvbWUgYXNzaWduIHRoZSB3cm9uZyAqcHRyIHZhbHVlKS4KICAgICBUaGVyZSBpcyBhIHJlYXNvbiB3aHkgKndlKiBhcmUgcHJvdmlkaW5nIGl0OiB3ZSBuZWVkIGEgY29ycmVjdCB2ZXJzaW9uCiAgICAgb2Ygc3RydG9kKCksIGFuZCBpZiB3ZSBnaXZlIHRoaXMgb25lIGF3YXkgbWF5YmUgc29tZW9uZSB3aWxsIGxvb2sgZm9yCiAgICAgbWlzdGFrZXMgaW4gaXQgYW5kIGZpeCB0aGVtIGZvciB1cyAoOi0pLgpAQCAtMzUsOCArMzUsOCBAQAogCiAvKiAgVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIG1hY2hpbmUtc3BlY2lmaWMuICBNRHtNSU4sTUFYfUVYUFQgYXJlCiAgICAgaW50ZWdlcnMgYW5kIE1Ee01JTixNQVh9RlJBQyBhcmUgc3RyaW5ncyBzdWNoIHRoYXQKLQkwLiR7TURNQVhGUkFDfWUke01ETUFYRVhQVH0gaXMgdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBkb3VibGUsCi0JMC4ke01ETUlORlJBQ31lJHtNRE1JTkVYUFR9IGlzIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlICt2ZSBkb3VibGUKKyAgICAwLiR7TURNQVhGUkFDfWUke01ETUFYRVhQVH0gaXMgdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBkb3VibGUsCisgICAgMC4ke01ETUlORlJBQ31lJHtNRE1JTkVYUFR9IGlzIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlICt2ZSBkb3VibGUKICAgICBNRHtNSU4sTUFYfUZSQUMgbXVzdCBub3QgaGF2ZSBhbnkgdHJhaWxpbmcgemVyb3MuCiAgICAgVGhlIHZhbHVlcyBoZXJlIGFyZSBmb3IgSUVFRS03NTQgNjQtYml0IGZsb2F0cy4KICAgICBJdCBpcyBub3QgcGVyZmVjdGx5IGNsZWFyIHRvIG1lIHdoZXRoZXIgYW4gSUVFRSBpbmZpbml0eSBzaG91bGQgYmUKQEAgLTQ3LDExMyArNDcsMTEzIEBACiAgICAgSSBkbyBrbm93IGFib3V0IDx2YWx1ZXMuaD4sIGJ1dCB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBmaWxlIGlzIHRoYXQKICAgICB3ZSBjYW4ndCBhbHdheXMgdHJ1c3QgdGhhdCBzdHVmZiB0byBiZSB0aGVyZSBvciB0byBiZSBjb3JyZWN0LgogKi8KLXN0YXRpYwlpbnQJTURNSU5FWFBUCT0gLTMyMzsKLXN0YXRpYwljaGFyCU1ETUlORlJBQ1tdCT0gIjQ5NDA2NTY0NTg0MTI0NjU0NCI7Ci1zdGF0aWMJZG91YmxlCVpFUk8JCT0gMC4wOworc3RhdGljICBpbnQgICAgIE1ETUlORVhQVCAgICAgICA9IC0zMjM7CitzdGF0aWMgIGNoYXIgICAgTURNSU5GUkFDW10gICAgID0gIjQ5NDA2NTY0NTg0MTI0NjU0NCI7CitzdGF0aWMgIGRvdWJsZSAgWkVSTyAgICAgICAgICAgID0gMC4wOwogCi1zdGF0aWMJaW50CU1ETUFYRVhQVAk9IDMwOTsKLXN0YXRpYwljaGFyCU1ETUFYRlJBQ1tdCT0gIjE3OTc2OTMxMzQ4NjIzMTU3IjsKLXN0YXRpYwlkb3VibGUJSFVHRQkJPSAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4Oworc3RhdGljICBpbnQgICAgIE1ETUFYRVhQVCAgICAgICA9IDMwOTsKK3N0YXRpYyAgY2hhciAgICBNRE1BWEZSQUNbXSAgICAgPSAiMTc5NzY5MzEzNDg2MjMxNTciOworc3RhdGljICBkb3VibGUgIEhVR0UgICAgICAgICAgICA9IDEuNzk3NjkzMTM0ODYyMzE1N2UzMDg7CiAKLWV4dGVybglkb3VibGUJYXRvZihjb25zdCBjaGFyICopOwkJLyogT25seSBjYWxsZWQgd2hlbiByZXN1bHQga25vd24gdG8gYmUgb2sgKi8KK2V4dGVybiAgZG91YmxlICBhdG9mKGNvbnN0IGNoYXIgKik7ICAgICAgICAgICAgIC8qIE9ubHkgY2FsbGVkIHdoZW4gcmVzdWx0IGtub3duIHRvIGJlIG9rICovCiAKICNpZmRlZiBIQVZFX0VSUk5PX0gKICNpbmNsdWRlIDxlcnJuby5oPgogI2VuZGlmCi1leHRlcm4JaW50CWVycm5vOworZXh0ZXJuICBpbnQgICAgIGVycm5vOwogCiBkb3VibGUgc3RydG9kKGNoYXIgKnN0ciwgY2hhciAqKnB0cikKIHsKLQlpbnQgc2lnbiwgc2NhbGUsIGRvdHNlZW47Ci0JaW50IGVzaWduLCBleHB0OwotCWNoYXIgKnNhdmU7Ci0JcmVnaXN0ZXIgY2hhciAqc3AsICpkcDsKLQlyZWdpc3RlciBpbnQgYzsKLQljaGFyICpidWZvcmcsICpidWZsaW07Ci0JY2hhciBidWZmZXJbNjRdOwkJLyogNDUtZGlnaXQgc2lnbmlmaWNhbnQgKyAqLwotCQkJCQkvKiAxMy1kaWdpdCBleHBvbmVudCAqLwotCXNwID0gc3RyOwotCXdoaWxlICgqc3AgPT0gJyAnKSBzcCsrOwotCXNpZ24gPSAxOwotCWlmICgqc3AgPT0gJy0nKSBzaWduIC09IDIsIHNwKys7Ci0JZG90c2VlbiA9IDAsIHNjYWxlID0gMDsKLQlkcCA9IGJ1ZmZlcjsKLQkqZHArKyA9ICcwJzsgKmRwKysgPSAnLic7Ci0JYnVmb3JnID0gZHAsIGJ1ZmxpbSA9IGJ1ZmZlcis0ODsKLQlmb3IgKHNhdmUgPSBzcDsgKGMgPSAqc3ApOyBzcCsrKQotCSAgICBpZiAoYyA9PSAnLicpIHsKLQkJaWYgKGRvdHNlZW4pIGJyZWFrOwotCQlkb3RzZWVuKys7Ci0JICAgIH0gZWxzZQotCSAgICBpZiAoKHVuc2lnbmVkKShjLScwJykgPiAodW5zaWduZWQpKCc5Jy0nMCcpKSB7Ci0JCWJyZWFrOwotCSAgICB9IGVsc2UKLQkgICAgaWYgKGMgPT0gJzAnKSB7Ci0JCWlmIChkcCAhPSBidWZvcmcpIHsKLQkJICAgIC8qIFRoaXMgaXMgbm90IHRoZSBmaXJzdCBkaWdpdCwgc28gd2Ugd2FudCB0byBrZWVwIGl0ICovCi0JCSAgICBpZiAoZHAgPCBidWZsaW0pICpkcCsrID0gYzsKLQkJICAgIGlmICghZG90c2Vlbikgc2NhbGUrKzsKLQkJfSBlbHNlIHsKLQkJICAgIC8qIE5vIG5vbi16ZXJvIGRpZ2l0cyBzZWVuIHlldCAqLwotCQkgICAgLyogSWYgYSAuIGhhcyBiZWVuIHNlZW4sIHNjYWxlIG11c3QgYmUgYWRqdXN0ZWQgKi8KLQkJICAgIGlmIChkb3RzZWVuKSBzY2FsZS0tOwotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIFRoaXMgaXMgYSBub256ZXJvIGRpZ2l0LCBzbyB3ZSB3YW50IHRvIGtlZXAgaXQgKi8KLQkJaWYgKGRwIDwgYnVmbGltKSAqZHArKyA9IGM7Ci0JCS8qIElmIGl0IHByZWNlZGVzIGEgLiwgc2NhbGUgbXVzdCBiZSBhZGp1c3RlZCAqLwotCQlpZiAoIWRvdHNlZW4pIHNjYWxlKys7Ci0JICAgIH0KLQlpZiAoc3AgPT0gc2F2ZSkgewotCSAgICBpZiAocHRyKSAqcHRyID0gc3RyOwotCSAgICBlcnJubyA9IEVET007CQkvKiB3aGF0IHNob3VsZCB0aGlzIGJlPyAqLwotCSAgICByZXR1cm4gWkVSTzsKLQl9CisgICAgaW50IHNpZ24sIHNjYWxlLCBkb3RzZWVuOworICAgIGludCBlc2lnbiwgZXhwdDsKKyAgICBjaGFyICpzYXZlOworICAgIHJlZ2lzdGVyIGNoYXIgKnNwLCAqZHA7CisgICAgcmVnaXN0ZXIgaW50IGM7CisgICAgY2hhciAqYnVmb3JnLCAqYnVmbGltOworICAgIGNoYXIgYnVmZmVyWzY0XTsgICAgICAgICAgICAgICAgICAgIC8qIDQ1LWRpZ2l0IHNpZ25pZmljYW50ICsgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogMTMtZGlnaXQgZXhwb25lbnQgKi8KKyAgICBzcCA9IHN0cjsKKyAgICB3aGlsZSAoKnNwID09ICcgJykgc3ArKzsKKyAgICBzaWduID0gMTsKKyAgICBpZiAoKnNwID09ICctJykgc2lnbiAtPSAyLCBzcCsrOworICAgIGRvdHNlZW4gPSAwLCBzY2FsZSA9IDA7CisgICAgZHAgPSBidWZmZXI7CisgICAgKmRwKysgPSAnMCc7ICpkcCsrID0gJy4nOworICAgIGJ1Zm9yZyA9IGRwLCBidWZsaW0gPSBidWZmZXIrNDg7CisgICAgZm9yIChzYXZlID0gc3A7IChjID0gKnNwKTsgc3ArKykKKyAgICAgICAgaWYgKGMgPT0gJy4nKSB7CisgICAgICAgIGlmIChkb3RzZWVuKSBicmVhazsKKyAgICAgICAgZG90c2VlbisrOworICAgICAgICB9IGVsc2UKKyAgICAgICAgaWYgKCh1bnNpZ25lZCkoYy0nMCcpID4gKHVuc2lnbmVkKSgnOSctJzAnKSkgeworICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIGlmIChjID09ICcwJykgeworICAgICAgICBpZiAoZHAgIT0gYnVmb3JnKSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIG5vdCB0aGUgZmlyc3QgZGlnaXQsIHNvIHdlIHdhbnQgdG8ga2VlcCBpdCAqLworICAgICAgICAgICAgaWYgKGRwIDwgYnVmbGltKSAqZHArKyA9IGM7CisgICAgICAgICAgICBpZiAoIWRvdHNlZW4pIHNjYWxlKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBObyBub24temVybyBkaWdpdHMgc2VlbiB5ZXQgKi8KKyAgICAgICAgICAgIC8qIElmIGEgLiBoYXMgYmVlbiBzZWVuLCBzY2FsZSBtdXN0IGJlIGFkanVzdGVkICovCisgICAgICAgICAgICBpZiAoZG90c2Vlbikgc2NhbGUtLTsKKyAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGlzIGlzIGEgbm9uemVybyBkaWdpdCwgc28gd2Ugd2FudCB0byBrZWVwIGl0ICovCisgICAgICAgIGlmIChkcCA8IGJ1ZmxpbSkgKmRwKysgPSBjOworICAgICAgICAvKiBJZiBpdCBwcmVjZWRlcyBhIC4sIHNjYWxlIG11c3QgYmUgYWRqdXN0ZWQgKi8KKyAgICAgICAgaWYgKCFkb3RzZWVuKSBzY2FsZSsrOworICAgICAgICB9CisgICAgaWYgKHNwID09IHNhdmUpIHsKKyAgICAgICAgaWYgKHB0cikgKnB0ciA9IHN0cjsKKyAgICAgICAgZXJybm8gPSBFRE9NOyAgICAgICAgICAgICAgICAgICAvKiB3aGF0IHNob3VsZCB0aGlzIGJlPyAqLworICAgICAgICByZXR1cm4gWkVSTzsKKyAgICB9CiAKLQl3aGlsZSAoZHAgPiBidWZvcmcgJiYgZHBbLTFdID09ICcwJykgLS1kcDsKLQlpZiAoZHAgPT0gYnVmb3JnKSAqZHArKyA9ICcwJzsKLQkqZHAgPSAnXDAnOwotCS8qICBOb3cgdGhlIGNvbnRlbnRzIG9mIGJ1ZmZlciBhcmUKLQkgICAgKy0tKy0tLS0tLS0tKy0rLS0tLS0tLS0rCi0JICAgIHwwLnxmcmFjdGlvbnxcfGxlZnRvdmVyfAotCSAgICArLS0rLS0tLS0tLS0rLSstLS0tLS0tLSsKLQkJCSBeZHAgcG9pbnRzIGhlcmUKLQkgICAgd2hlcmUgZnJhY3Rpb24gYmVnaW5zIHdpdGggMCBpZmYgaXQgaXMgIjAiLCBhbmQgaGFzIGF0IG1vc3QKLQkgICAgNDUgZGlnaXRzIGluIGl0LCBhbmQgbGVmdG92ZXIgaXMgYXQgbGVhc3QgMTYgY2hhcmFjdGVycy4KLQkqLwotCXNhdmUgPSBzcCwgZXhwdCA9IDAsIGVzaWduID0gMTsKLQlkbyB7Ci0JICAgIGMgPSAqc3ArKzsKLQkgICAgaWYgKGMgIT0gJ2UnICYmIGMgIT0gJ0UnKSBicmVhazsKLQkgICAgYyA9ICpzcCsrOwotCSAgICBpZiAoYyA9PSAnLScpIGVzaWduIC09IDIsIGMgPSAqc3ArKzsgZWxzZQotCSAgICBpZiAoYyA9PSAnKycgLyogfHwgYyA9PSAnICcgKi8gKSBjID0gKnNwKys7Ci0JICAgIGlmICgodW5zaWduZWQpKGMtJzAnKSA+ICh1bnNpZ25lZCkoJzknLScwJykpIGJyZWFrOwotCSAgICB3aGlsZSAoYyA9PSAnMCcpIGMgPSAqc3ArKzsKLQkgICAgZm9yICg7ICh1bnNpZ25lZCkoYy0nMCcpIDw9ICh1bnNpZ25lZCkoJzknLScwJyk7IGMgPSAqc3ArKykKLQkJZXhwdCA9IGV4cHQqMTAgKyBjLScwJzsKLQkgICAgaWYgKGVzaWduIDwgMCkgZXhwdCA9IC1leHB0OwotCSAgICBzYXZlID0gc3AtMTsKLQl9IHdoaWxlICgwKTsKLQlpZiAocHRyKSAqcHRyID0gc2F2ZTsKLQlleHB0ICs9IHNjYWxlOwotCS8qICBOb3cgdGhlIG51bWJlciBpcyBzaWduKjAuZnJhY3Rpb24qMTAqKmV4cHQgICovCi0JZXJybm8gPSBFUkFOR0U7Ci0JaWYgKGV4cHQgPiBNRE1BWEVYUFQpIHsKLQkgICAgcmV0dXJuIEhVR0Uqc2lnbjsKLQl9IGVsc2UKLQlpZiAoZXhwdCA9PSBNRE1BWEVYUFQpIHsKLQkgICAgaWYgKHN0cmNtcChidWZvcmcsIE1ETUFYRlJBQykgPiAwKSByZXR1cm4gSFVHRSpzaWduOwotCX0gZWxzZQotCWlmIChleHB0IDwgTURNSU5FWFBUKSB7Ci0JICAgIHJldHVybiBaRVJPKnNpZ247Ci0JfSBlbHNlCi0JaWYgKGV4cHQgPT0gTURNSU5FWFBUKSB7Ci0JICAgIGlmIChzdHJjbXAoYnVmb3JnLCBNRE1JTkZSQUMpIDwgMCkgcmV0dXJuIFpFUk8qc2lnbjsKLQl9Ci0JLyogIFdlIGhhdmUgbm93IGVzdGFibGlzaGVkIHRoYXQgdGhlIG51bWJlciBjYW4gYmUgICovCi0JLyogIHJlcHJlc2VudGVkIHdpdGhvdXQgb3ZlcmZsb3cgb3IgdW5kZXJmbG93ICAqLwotCSh2b2lkKSBzcHJpbnRmKGRwLCAiRSVkIiwgZXhwdCk7Ci0JZXJybm8gPSAwOwotCXJldHVybiBhdG9mKGJ1ZmZlcikqc2lnbjsKKyAgICB3aGlsZSAoZHAgPiBidWZvcmcgJiYgZHBbLTFdID09ICcwJykgLS1kcDsKKyAgICBpZiAoZHAgPT0gYnVmb3JnKSAqZHArKyA9ICcwJzsKKyAgICAqZHAgPSAnXDAnOworICAgIC8qICBOb3cgdGhlIGNvbnRlbnRzIG9mIGJ1ZmZlciBhcmUKKyAgICAgICAgKy0tKy0tLS0tLS0tKy0rLS0tLS0tLS0rCisgICAgICAgIHwwLnxmcmFjdGlvbnxcfGxlZnRvdmVyfAorICAgICAgICArLS0rLS0tLS0tLS0rLSstLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgIF5kcCBwb2ludHMgaGVyZQorICAgICAgICB3aGVyZSBmcmFjdGlvbiBiZWdpbnMgd2l0aCAwIGlmZiBpdCBpcyAiMCIsIGFuZCBoYXMgYXQgbW9zdAorICAgICAgICA0NSBkaWdpdHMgaW4gaXQsIGFuZCBsZWZ0b3ZlciBpcyBhdCBsZWFzdCAxNiBjaGFyYWN0ZXJzLgorICAgICovCisgICAgc2F2ZSA9IHNwLCBleHB0ID0gMCwgZXNpZ24gPSAxOworICAgIGRvIHsKKyAgICAgICAgYyA9ICpzcCsrOworICAgICAgICBpZiAoYyAhPSAnZScgJiYgYyAhPSAnRScpIGJyZWFrOworICAgICAgICBjID0gKnNwKys7CisgICAgICAgIGlmIChjID09ICctJykgZXNpZ24gLT0gMiwgYyA9ICpzcCsrOyBlbHNlCisgICAgICAgIGlmIChjID09ICcrJyAvKiB8fCBjID09ICcgJyAqLyApIGMgPSAqc3ArKzsKKyAgICAgICAgaWYgKCh1bnNpZ25lZCkoYy0nMCcpID4gKHVuc2lnbmVkKSgnOSctJzAnKSkgYnJlYWs7CisgICAgICAgIHdoaWxlIChjID09ICcwJykgYyA9ICpzcCsrOworICAgICAgICBmb3IgKDsgKHVuc2lnbmVkKShjLScwJykgPD0gKHVuc2lnbmVkKSgnOSctJzAnKTsgYyA9ICpzcCsrKQorICAgICAgICBleHB0ID0gZXhwdCoxMCArIGMtJzAnOworICAgICAgICBpZiAoZXNpZ24gPCAwKSBleHB0ID0gLWV4cHQ7CisgICAgICAgIHNhdmUgPSBzcC0xOworICAgIH0gd2hpbGUgKDApOworICAgIGlmIChwdHIpICpwdHIgPSBzYXZlOworICAgIGV4cHQgKz0gc2NhbGU7CisgICAgLyogIE5vdyB0aGUgbnVtYmVyIGlzIHNpZ24qMC5mcmFjdGlvbioxMCoqZXhwdCAgKi8KKyAgICBlcnJubyA9IEVSQU5HRTsKKyAgICBpZiAoZXhwdCA+IE1ETUFYRVhQVCkgeworICAgICAgICByZXR1cm4gSFVHRSpzaWduOworICAgIH0gZWxzZQorICAgIGlmIChleHB0ID09IE1ETUFYRVhQVCkgeworICAgICAgICBpZiAoc3RyY21wKGJ1Zm9yZywgTURNQVhGUkFDKSA+IDApIHJldHVybiBIVUdFKnNpZ247CisgICAgfSBlbHNlCisgICAgaWYgKGV4cHQgPCBNRE1JTkVYUFQpIHsKKyAgICAgICAgcmV0dXJuIFpFUk8qc2lnbjsKKyAgICB9IGVsc2UKKyAgICBpZiAoZXhwdCA9PSBNRE1JTkVYUFQpIHsKKyAgICAgICAgaWYgKHN0cmNtcChidWZvcmcsIE1ETUlORlJBQykgPCAwKSByZXR1cm4gWkVSTypzaWduOworICAgIH0KKyAgICAvKiAgV2UgaGF2ZSBub3cgZXN0YWJsaXNoZWQgdGhhdCB0aGUgbnVtYmVyIGNhbiBiZSAgKi8KKyAgICAvKiAgcmVwcmVzZW50ZWQgd2l0aG91dCBvdmVyZmxvdyBvciB1bmRlcmZsb3cgICovCisgICAgKHZvaWQpIHNwcmludGYoZHAsICJFJWQiLCBleHB0KTsKKyAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIGF0b2YoYnVmZmVyKSpzaWduOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N0cnVjdG1lbWJlci5jIGIvUHl0aG9uL3N0cnVjdG1lbWJlci5jCmluZGV4IGFjNzViZjAuLmUzNDdiNTEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zdHJ1Y3RtZW1iZXIuYworKysgYi9QeXRob24vc3RydWN0bWVtYmVyLmMKQEAgLTgsMzU2ICs4LDM1NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RtZW1iZXJzKHN0cnVjdCBtZW1iZXJsaXN0ICptbGlzdCkKIHsKLQlpbnQgaSwgbjsKLQlQeU9iamVjdCAqdjsKLQlmb3IgKG4gPSAwOyBtbGlzdFtuXS5uYW1lICE9IE5VTEw7IG4rKykKLQkJOwotCXYgPSBQeUxpc3RfTmV3KG4pOwotCWlmICh2ICE9IE5VTEwpIHsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJCVB5TGlzdF9TZXRJdGVtKHYsIGksCi0JCQkJICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcobWxpc3RbaV0ubmFtZSkpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJdiA9IE5VTEw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeUxpc3RfU29ydCh2KTsKLQkJfQotCX0KLQlyZXR1cm4gdjsKKyAgICBpbnQgaSwgbjsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBmb3IgKG4gPSAwOyBtbGlzdFtuXS5uYW1lICE9IE5VTEw7IG4rKykKKyAgICAgICAgOworICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKHYsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKG1saXN0W2ldLm5hbWUpKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlMaXN0X1NvcnQodik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHY7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TWVtYmVyX0dldChjb25zdCBjaGFyICphZGRyLCBzdHJ1Y3QgbWVtYmVybGlzdCAqbWxpc3QsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IG1lbWJlcmxpc3QgKmw7CisgICAgc3RydWN0IG1lbWJlcmxpc3QgKmw7CiAKLQlpZiAoc3RyY21wKG5hbWUsICJfX21lbWJlcnNfXyIpID09IDApCi0JCXJldHVybiBsaXN0bWVtYmVycyhtbGlzdCk7Ci0JZm9yIChsID0gbWxpc3Q7IGwtPm5hbWUgIT0gTlVMTDsgbCsrKSB7Ci0JCWlmIChzdHJjbXAobC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJUHlNZW1iZXJEZWYgY29weTsKLQkJCWNvcHkubmFtZSA9IGwtPm5hbWU7Ci0JCQljb3B5LnR5cGUgPSBsLT50eXBlOwotCQkJY29weS5vZmZzZXQgPSBsLT5vZmZzZXQ7Ci0JCQljb3B5LmZsYWdzID0gbC0+ZmxhZ3M7Ci0JCQljb3B5LmRvYyA9IE5VTEw7Ci0JCQlyZXR1cm4gUHlNZW1iZXJfR2V0T25lKGFkZHIsICZjb3B5KTsKLQkJfQotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCXJldHVybiBOVUxMOworICAgIGlmIChzdHJjbXAobmFtZSwgIl9fbWVtYmVyc19fIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIGxpc3RtZW1iZXJzKG1saXN0KTsKKyAgICBmb3IgKGwgPSBtbGlzdDsgbC0+bmFtZSAhPSBOVUxMOyBsKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChsLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBQeU1lbWJlckRlZiBjb3B5OworICAgICAgICAgICAgY29weS5uYW1lID0gbC0+bmFtZTsKKyAgICAgICAgICAgIGNvcHkudHlwZSA9IGwtPnR5cGU7CisgICAgICAgICAgICBjb3B5Lm9mZnNldCA9IGwtPm9mZnNldDsKKyAgICAgICAgICAgIGNvcHkuZmxhZ3MgPSBsLT5mbGFnczsKKyAgICAgICAgICAgIGNvcHkuZG9jID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBQeU1lbWJlcl9HZXRPbmUoYWRkciwgJmNvcHkpOworICAgICAgICB9CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TWVtYmVyX0dldE9uZShjb25zdCBjaGFyICphZGRyLCBQeU1lbWJlckRlZiAqbCkKIHsKLQlQeU9iamVjdCAqdjsKLQlpZiAoKGwtPmZsYWdzICYgUkVBRF9SRVNUUklDVEVEKSAmJgotCSAgICBQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJyZXN0cmljdGVkIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYWRkciArPSBsLT5vZmZzZXQ7Ci0Jc3dpdGNoIChsLT50eXBlKSB7Ci0JY2FzZSBUX0JPT0w6Ci0JCXYgPSBQeUJvb2xfRnJvbUxvbmcoKihjaGFyKilhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX0JZVEU6Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygqKGNoYXIqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfVUJZVEU6Ci0JCXYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKHVuc2lnbmVkIGNoYXIqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfU0hPUlQ6Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygqKHNob3J0KilhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX1VTSE9SVDoKLQkJdiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCoodW5zaWduZWQgc2hvcnQqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfSU5UOgotCQl2ID0gUHlJbnRfRnJvbUxvbmcoKihpbnQqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfVUlOVDoKLQkJdiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCoodW5zaWduZWQgaW50KilhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX0xPTkc6Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygqKGxvbmcqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfVUxPTkc6Ci0JCXYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKHVuc2lnbmVkIGxvbmcqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfUFlTU0laRVQ6Ci0JCXYgPSBQeUludF9Gcm9tU3NpemVfdCgqKFB5X3NzaXplX3QqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfRkxPQVQ6Ci0JCXYgPSBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSkqKGZsb2F0KilhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX0RPVUJMRToKLQkJdiA9IFB5RmxvYXRfRnJvbURvdWJsZSgqKGRvdWJsZSopYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgVF9TVFJJTkc6Ci0JCWlmICgqKGNoYXIqKilhZGRyID09IE5VTEwpIHsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXYgPSBQeV9Ob25lOwotCQl9Ci0JCWVsc2UKLQkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCooY2hhcioqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfU1RSSU5HX0lOUExBQ0U6Ci0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyKilhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX0NIQVI6Ci0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopYWRkciwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgVF9PQkpFQ1Q6Ci0JCXYgPSAqKFB5T2JqZWN0ICoqKWFkZHI7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQl2ID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKHYpOwotCQlicmVhazsKLQljYXNlIFRfT0JKRUNUX0VYOgotCQl2ID0gKihQeU9iamVjdCAqKilhZGRyOwotCQlpZiAodiA9PSBOVUxMKQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBsLT5uYW1lKTsKLQkJUHlfWElOQ1JFRih2KTsKLQkJYnJlYWs7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKChsLT5mbGFncyAmIFJFQURfUkVTVFJJQ1RFRCkgJiYKKyAgICAgICAgUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicmVzdHJpY3RlZCBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFkZHIgKz0gbC0+b2Zmc2V0OworICAgIHN3aXRjaCAobC0+dHlwZSkgeworICAgIGNhc2UgVF9CT09MOgorICAgICAgICB2ID0gUHlCb29sX0Zyb21Mb25nKCooY2hhciopYWRkcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9CWVRFOgorICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKihjaGFyKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1VCWVRFOgorICAgICAgICB2ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKih1bnNpZ25lZCBjaGFyKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1NIT1JUOgorICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKihzaG9ydCopYWRkcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9VU0hPUlQ6CisgICAgICAgIHYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKHVuc2lnbmVkIHNob3J0KilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0lOVDoKKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKCooaW50KilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1VJTlQ6CisgICAgICAgIHYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKHVuc2lnbmVkIGludCopYWRkcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9MT05HOgorICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKihsb25nKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1VMT05HOgorICAgICAgICB2ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKih1bnNpZ25lZCBsb25nKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1BZU1NJWkVUOgorICAgICAgICB2ID0gUHlJbnRfRnJvbVNzaXplX3QoKihQeV9zc2l6ZV90KilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0ZMT0FUOgorICAgICAgICB2ID0gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpKihmbG9hdCopYWRkcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9ET1VCTEU6CisgICAgICAgIHYgPSBQeUZsb2F0X0Zyb21Eb3VibGUoKihkb3VibGUqKWFkZHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgICBpZiAoKihjaGFyKiopYWRkciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICB2ID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygqKGNoYXIqKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1NUUklOR19JTlBMQUNFOgorICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygoY2hhciopYWRkcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9DSEFSOgorICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKWFkZHIsIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfT0JKRUNUOgorICAgICAgICB2ID0gKihQeU9iamVjdCAqKilhZGRyOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgdiA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX09CSkVDVF9FWDoKKyAgICAgICAgdiA9ICooUHlPYmplY3QgKiopYWRkcjsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbC0+bmFtZSk7CisgICAgICAgIFB5X1hJTkNSRUYodik7CisgICAgICAgIGJyZWFrOwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JY2FzZSBUX0xPTkdMT05HOgotCQl2ID0gUHlMb25nX0Zyb21Mb25nTG9uZygqKFBZX0xPTkdfTE9ORyAqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfVUxPTkdMT05HOgotCQl2ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKCoodW5zaWduZWQgUFlfTE9OR19MT05HICopYWRkcik7Ci0JCWJyZWFrOworICAgIGNhc2UgVF9MT05HTE9ORzoKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKihQWV9MT05HX0xPTkcgKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1VMT05HTE9ORzoKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKWFkZHIpOworICAgICAgICBicmVhazsKICNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLwotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgImJhZCBtZW1iZXJkZXNjciB0eXBlIik7Ci0JCXYgPSBOVUxMOwotCX0KLQlyZXR1cm4gdjsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJiYWQgbWVtYmVyZGVzY3IgdHlwZSIpOworICAgICAgICB2ID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHY7CiB9CiAKIGludAogUHlNZW1iZXJfU2V0KGNoYXIgKmFkZHIsIHN0cnVjdCBtZW1iZXJsaXN0ICptbGlzdCwgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0Jc3RydWN0IG1lbWJlcmxpc3QgKmw7CisgICAgc3RydWN0IG1lbWJlcmxpc3QgKmw7CiAKLQlmb3IgKGwgPSBtbGlzdDsgbC0+bmFtZSAhPSBOVUxMOyBsKyspIHsKLQkJaWYgKHN0cmNtcChsLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlQeU1lbWJlckRlZiBjb3B5OwotCQkJY29weS5uYW1lID0gbC0+bmFtZTsKLQkJCWNvcHkudHlwZSA9IGwtPnR5cGU7Ci0JCQljb3B5Lm9mZnNldCA9IGwtPm9mZnNldDsKLQkJCWNvcHkuZmxhZ3MgPSBsLT5mbGFnczsKLQkJCWNvcHkuZG9jID0gTlVMTDsKLQkJCXJldHVybiBQeU1lbWJlcl9TZXRPbmUoYWRkciwgJmNvcHksIHYpOwotCQl9Ci0JfQorICAgIGZvciAobCA9IG1saXN0OyBsLT5uYW1lICE9IE5VTEw7IGwrKykgeworICAgICAgICBpZiAoc3RyY21wKGwtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIFB5TWVtYmVyRGVmIGNvcHk7CisgICAgICAgICAgICBjb3B5Lm5hbWUgPSBsLT5uYW1lOworICAgICAgICAgICAgY29weS50eXBlID0gbC0+dHlwZTsKKyAgICAgICAgICAgIGNvcHkub2Zmc2V0ID0gbC0+b2Zmc2V0OworICAgICAgICAgICAgY29weS5mbGFncyA9IGwtPmZsYWdzOworICAgICAgICAgICAgY29weS5kb2MgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIFB5TWVtYmVyX1NldE9uZShhZGRyLCAmY29weSwgdik7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworICAgIHJldHVybiAtMTsKIH0KIAotI2RlZmluZSBXQVJOKG1zZykJCQkJCVwKLSAgICBkbyB7CQkJCQkJXAotCWlmIChQeUVycl9XYXJuKFB5RXhjX1J1bnRpbWVXYXJuaW5nLCBtc2cpIDwgMCkJXAotCQlyZXR1cm4gLTE7CQkJCVwKKyNkZWZpbmUgV0FSTihtc2cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsIG1zZykgPCAwKSAgICAgIFwKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKIGludAogUHlNZW1iZXJfU2V0T25lKGNoYXIgKmFkZHIsIFB5TWVtYmVyRGVmICpsLCBQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqb2xkdjsKKyAgICBQeU9iamVjdCAqb2xkdjsKIAotCWFkZHIgKz0gbC0+b2Zmc2V0OworICAgIGFkZHIgKz0gbC0+b2Zmc2V0OwogCi0JaWYgKChsLT5mbGFncyAmIFJFQURPTkxZKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZWFkb25seSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKGwtPmZsYWdzICYgUFlfV1JJVEVfUkVTVFJJQ1RFRCkgJiYgUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicmVzdHJpY3RlZCBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCWlmIChsLT50eXBlID09IFRfT0JKRUNUX0VYKSB7Ci0JCQkvKiBDaGVjayBpZiB0aGUgYXR0cmlidXRlIGlzIHNldC4gKi8KLQkJCWlmICgqKFB5T2JqZWN0ICoqKWFkZHIgPT0gTlVMTCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbC0+bmFtZSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGwtPnR5cGUgIT0gVF9PQkpFQ1QpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJjYW4ndCBkZWxldGUgbnVtZXJpYy9jaGFyIGF0dHJpYnV0ZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCXN3aXRjaCAobC0+dHlwZSkgewotCWNhc2UgVF9CT09MOnsKLQkJaWYgKCFQeUJvb2xfQ2hlY2sodikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJhdHRyaWJ1dGUgdmFsdWUgdHlwZSBtdXN0IGJlIGJvb2wiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAodiA9PSBQeV9UcnVlKQotCQkJKihjaGFyKilhZGRyID0gKGNoYXIpIDE7Ci0JCWVsc2UKLQkJCSooY2hhciopYWRkciA9IChjaGFyKSAwOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9CWVRFOnsKLQkJbG9uZyBsb25nX3ZhbCA9IFB5SW50X0FzTG9uZyh2KTsKLQkJaWYgKChsb25nX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJKihjaGFyKilhZGRyID0gKGNoYXIpbG9uZ192YWw7Ci0JCS8qIFhYWDogRm9yIGNvbXBhdGliaWxpdHksIG9ubHkgd2FybiBhYm91dCB0cnVuY2F0aW9ucwotCQkgICBmb3Igbm93LiAqLwotCQlpZiAoKGxvbmdfdmFsID4gQ0hBUl9NQVgpIHx8IChsb25nX3ZhbCA8IENIQVJfTUlOKSkKLQkJCVdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gY2hhciIpOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9VQllURTp7Ci0JCWxvbmcgbG9uZ192YWwgPSBQeUludF9Bc0xvbmcodik7Ci0JCWlmICgobG9uZ192YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCSoodW5zaWduZWQgY2hhciopYWRkciA9ICh1bnNpZ25lZCBjaGFyKWxvbmdfdmFsOwotCQlpZiAoKGxvbmdfdmFsID4gVUNIQVJfTUFYKSB8fCAobG9uZ192YWwgPCAwKSkKLQkJCVdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gdW5zaWduZWQgY2hhciIpOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9TSE9SVDp7Ci0JCWxvbmcgbG9uZ192YWwgPSBQeUludF9Bc0xvbmcodik7Ci0JCWlmICgobG9uZ192YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCSooc2hvcnQqKWFkZHIgPSAoc2hvcnQpbG9uZ192YWw7Ci0JCWlmICgobG9uZ192YWwgPiBTSFJUX01BWCkgfHwgKGxvbmdfdmFsIDwgU0hSVF9NSU4pKQotCQkJV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byBzaG9ydCIpOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9VU0hPUlQ6ewotCQlsb25nIGxvbmdfdmFsID0gUHlJbnRfQXNMb25nKHYpOwotCQlpZiAoKGxvbmdfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQkqKHVuc2lnbmVkIHNob3J0KilhZGRyID0gKHVuc2lnbmVkIHNob3J0KWxvbmdfdmFsOwotCQlpZiAoKGxvbmdfdmFsID4gVVNIUlRfTUFYKSB8fCAobG9uZ192YWwgPCAwKSkKLQkJCVdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gdW5zaWduZWQgc2hvcnQiKTsKLQkJYnJlYWs7Ci0JCX0KLSAgCWNhc2UgVF9JTlQ6ewotCQlsb25nIGxvbmdfdmFsID0gUHlJbnRfQXNMb25nKHYpOwotCQlpZiAoKGxvbmdfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQkqKGludCAqKWFkZHIgPSAoaW50KWxvbmdfdmFsOwotCQlpZiAoKGxvbmdfdmFsID4gSU5UX01BWCkgfHwgKGxvbmdfdmFsIDwgSU5UX01JTikpCi0JCQlXQVJOKCJUcnVuY2F0aW9uIG9mIHZhbHVlIHRvIGludCIpOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9VSU5UOnsKLQkJdW5zaWduZWQgbG9uZyB1bG9uZ192YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7Ci0JCWlmICgodWxvbmdfdmFsID09ICh1bnNpZ25lZCBsb25nKS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkvKiBYWFg6IEZvciBjb21wYXRpYmlsaXR5LCBhY2NlcHQgbmVnYXRpdmUgaW50IHZhbHVlcwotCQkJICAgYXMgd2VsbC4gKi8KLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQl1bG9uZ192YWwgPSBQeUxvbmdfQXNMb25nKHYpOwotCQkJaWYgKCh1bG9uZ192YWwgPT0gKHVuc2lnbmVkIGxvbmcpLTEpICYmCi0JCQkgICAgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQkqKHVuc2lnbmVkIGludCAqKWFkZHIgPSAodW5zaWduZWQgaW50KXVsb25nX3ZhbDsKLQkJCVdBUk4oIldyaXRpbmcgbmVnYXRpdmUgdmFsdWUgaW50byB1bnNpZ25lZCBmaWVsZCIpOwotCQl9IGVsc2UKLQkJCSoodW5zaWduZWQgaW50ICopYWRkciA9ICh1bnNpZ25lZCBpbnQpdWxvbmdfdmFsOwotCQlpZiAodWxvbmdfdmFsID4gVUlOVF9NQVgpCi0JCQlXQVJOKCJUcnVuY2F0aW9uIG9mIHZhbHVlIHRvIHVuc2lnbmVkIGludCIpOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9MT05HOnsKLQkJKihsb25nKilhZGRyID0gUHlMb25nX0FzTG9uZyh2KTsKLQkJaWYgKCgqKGxvbmcqKWFkZHIgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX1VMT05HOnsKLQkJKih1bnNpZ25lZCBsb25nKilhZGRyID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOwotCQlpZiAoKCoodW5zaWduZWQgbG9uZyopYWRkciA9PSAodW5zaWduZWQgbG9uZyktMSkKLQkJICAgICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCS8qIFhYWDogRm9yIGNvbXBhdGliaWxpdHksIGFjY2VwdCBuZWdhdGl2ZSBpbnQgdmFsdWVzCi0JCQkgICBhcyB3ZWxsLiAqLwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCSoodW5zaWduZWQgbG9uZyopYWRkciA9IFB5TG9uZ19Bc0xvbmcodik7Ci0JCQlpZiAoKCoodW5zaWduZWQgbG9uZyopYWRkciA9PSAodW5zaWduZWQgbG9uZyktMSkKLQkJCSAgICAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKLQkJCVdBUk4oIldyaXRpbmcgbmVnYXRpdmUgdmFsdWUgaW50byB1bnNpZ25lZCBmaWVsZCIpOwotCQl9Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX1BZU1NJWkVUOnsKLQkJKihQeV9zc2l6ZV90KilhZGRyID0gUHlJbnRfQXNTc2l6ZV90KHYpOwotCQlpZiAoKCooUHlfc3NpemVfdCopYWRkciA9PSAoUHlfc3NpemVfdCktMSkKLQkJICAgICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9GTE9BVDp7Ci0JCWRvdWJsZSBkb3VibGVfdmFsID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQkJaWYgKChkb3VibGVfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQkqKGZsb2F0KilhZGRyID0gKGZsb2F0KWRvdWJsZV92YWw7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX0RPVUJMRToKLQkJKihkb3VibGUqKWFkZHIgPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCQlpZiAoKCooZG91YmxlKilhZGRyID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQljYXNlIFRfT0JKRUNUOgotCWNhc2UgVF9PQkpFQ1RfRVg6Ci0JCVB5X1hJTkNSRUYodik7Ci0JCW9sZHYgPSAqKFB5T2JqZWN0ICoqKWFkZHI7Ci0JCSooUHlPYmplY3QgKiopYWRkciA9IHY7Ci0JCVB5X1hERUNSRUYob2xkdik7Ci0JCWJyZWFrOwotCWNhc2UgVF9DSEFSOgotCQlpZiAoUHlTdHJpbmdfQ2hlY2sodikgJiYgUHlTdHJpbmdfU2l6ZSh2KSA9PSAxKSB7Ci0JCQkqKGNoYXIqKWFkZHIgPSBQeVN0cmluZ19Bc1N0cmluZyh2KVswXTsKLQkJfQotCQllbHNlIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUX1NUUklORzoKLQljYXNlIFRfU1RSSU5HX0lOUExBQ0U6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZWFkb25seSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOworICAgIGlmICgobC0+ZmxhZ3MgJiBSRUFET05MWSkpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVhZG9ubHkgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChsLT5mbGFncyAmIFBZX1dSSVRFX1JFU1RSSUNURUQpICYmIFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInJlc3RyaWN0ZWQgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBpZiAobC0+dHlwZSA9PSBUX09CSkVDVF9FWCkgeworICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBpcyBzZXQuICovCisgICAgICAgICAgICBpZiAoKihQeU9iamVjdCAqKilhZGRyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIGwtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsLT50eXBlICE9IFRfT0JKRUNUKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgbnVtZXJpYy9jaGFyIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIHN3aXRjaCAobC0+dHlwZSkgeworICAgIGNhc2UgVF9CT09MOnsKKyAgICAgICAgaWYgKCFQeUJvb2xfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSB2YWx1ZSB0eXBlIG11c3QgYmUgYm9vbCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICh2ID09IFB5X1RydWUpCisgICAgICAgICAgICAqKGNoYXIqKWFkZHIgPSAoY2hhcikgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKihjaGFyKilhZGRyID0gKGNoYXIpIDA7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX0JZVEU6eworICAgICAgICBsb25nIGxvbmdfdmFsID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICBpZiAoKGxvbmdfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqKGNoYXIqKWFkZHIgPSAoY2hhcilsb25nX3ZhbDsKKyAgICAgICAgLyogWFhYOiBGb3IgY29tcGF0aWJpbGl0eSwgb25seSB3YXJuIGFib3V0IHRydW5jYXRpb25zCisgICAgICAgICAgIGZvciBub3cuICovCisgICAgICAgIGlmICgobG9uZ192YWwgPiBDSEFSX01BWCkgfHwgKGxvbmdfdmFsIDwgQ0hBUl9NSU4pKQorICAgICAgICAgICAgV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byBjaGFyIik7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX1VCWVRFOnsKKyAgICAgICAgbG9uZyBsb25nX3ZhbCA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgaWYgKChsb25nX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKih1bnNpZ25lZCBjaGFyKilhZGRyID0gKHVuc2lnbmVkIGNoYXIpbG9uZ192YWw7CisgICAgICAgIGlmICgobG9uZ192YWwgPiBVQ0hBUl9NQVgpIHx8IChsb25nX3ZhbCA8IDApKQorICAgICAgICAgICAgV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byB1bnNpZ25lZCBjaGFyIik7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX1NIT1JUOnsKKyAgICAgICAgbG9uZyBsb25nX3ZhbCA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgaWYgKChsb25nX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKihzaG9ydCopYWRkciA9IChzaG9ydClsb25nX3ZhbDsKKyAgICAgICAgaWYgKChsb25nX3ZhbCA+IFNIUlRfTUFYKSB8fCAobG9uZ192YWwgPCBTSFJUX01JTikpCisgICAgICAgICAgICBXQVJOKCJUcnVuY2F0aW9uIG9mIHZhbHVlIHRvIHNob3J0Iik7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX1VTSE9SVDp7CisgICAgICAgIGxvbmcgbG9uZ192YWwgPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgIGlmICgobG9uZ192YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICoodW5zaWduZWQgc2hvcnQqKWFkZHIgPSAodW5zaWduZWQgc2hvcnQpbG9uZ192YWw7CisgICAgICAgIGlmICgobG9uZ192YWwgPiBVU0hSVF9NQVgpIHx8IChsb25nX3ZhbCA8IDApKQorICAgICAgICAgICAgV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byB1bnNpZ25lZCBzaG9ydCIpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9JTlQ6eworICAgICAgICBsb25nIGxvbmdfdmFsID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICBpZiAoKGxvbmdfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqKGludCAqKWFkZHIgPSAoaW50KWxvbmdfdmFsOworICAgICAgICBpZiAoKGxvbmdfdmFsID4gSU5UX01BWCkgfHwgKGxvbmdfdmFsIDwgSU5UX01JTikpCisgICAgICAgICAgICBXQVJOKCJUcnVuY2F0aW9uIG9mIHZhbHVlIHRvIGludCIpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9VSU5UOnsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB1bG9uZ192YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7CisgICAgICAgIGlmICgodWxvbmdfdmFsID09ICh1bnNpZ25lZCBsb25nKS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAvKiBYWFg6IEZvciBjb21wYXRpYmlsaXR5LCBhY2NlcHQgbmVnYXRpdmUgaW50IHZhbHVlcworICAgICAgICAgICAgICAgYXMgd2VsbC4gKi8KKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICB1bG9uZ192YWwgPSBQeUxvbmdfQXNMb25nKHYpOworICAgICAgICAgICAgaWYgKCh1bG9uZ192YWwgPT0gKHVuc2lnbmVkIGxvbmcpLTEpICYmCisgICAgICAgICAgICAgICAgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAqKHVuc2lnbmVkIGludCAqKWFkZHIgPSAodW5zaWduZWQgaW50KXVsb25nX3ZhbDsKKyAgICAgICAgICAgIFdBUk4oIldyaXRpbmcgbmVnYXRpdmUgdmFsdWUgaW50byB1bnNpZ25lZCBmaWVsZCIpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICoodW5zaWduZWQgaW50ICopYWRkciA9ICh1bnNpZ25lZCBpbnQpdWxvbmdfdmFsOworICAgICAgICBpZiAodWxvbmdfdmFsID4gVUlOVF9NQVgpCisgICAgICAgICAgICBXQVJOKCJUcnVuY2F0aW9uIG9mIHZhbHVlIHRvIHVuc2lnbmVkIGludCIpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9MT05HOnsKKyAgICAgICAgKihsb25nKilhZGRyID0gUHlMb25nX0FzTG9uZyh2KTsKKyAgICAgICAgaWYgKCgqKGxvbmcqKWFkZHIgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX1VMT05HOnsKKyAgICAgICAgKih1bnNpZ25lZCBsb25nKilhZGRyID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOworICAgICAgICBpZiAoKCoodW5zaWduZWQgbG9uZyopYWRkciA9PSAodW5zaWduZWQgbG9uZyktMSkKKyAgICAgICAgICAgICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIC8qIFhYWDogRm9yIGNvbXBhdGliaWxpdHksIGFjY2VwdCBuZWdhdGl2ZSBpbnQgdmFsdWVzCisgICAgICAgICAgICAgICBhcyB3ZWxsLiAqLworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICoodW5zaWduZWQgbG9uZyopYWRkciA9IFB5TG9uZ19Bc0xvbmcodik7CisgICAgICAgICAgICBpZiAoKCoodW5zaWduZWQgbG9uZyopYWRkciA9PSAodW5zaWduZWQgbG9uZyktMSkKKyAgICAgICAgICAgICAgICAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIFdBUk4oIldyaXRpbmcgbmVnYXRpdmUgdmFsdWUgaW50byB1bnNpZ25lZCBmaWVsZCIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX1BZU1NJWkVUOnsKKyAgICAgICAgKihQeV9zc2l6ZV90KilhZGRyID0gUHlJbnRfQXNTc2l6ZV90KHYpOworICAgICAgICBpZiAoKCooUHlfc3NpemVfdCopYWRkciA9PSAoUHlfc3NpemVfdCktMSkKKyAgICAgICAgICAgICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX0ZMT0FUOnsKKyAgICAgICAgZG91YmxlIGRvdWJsZV92YWwgPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgICAgICBpZiAoKGRvdWJsZV92YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICooZmxvYXQqKWFkZHIgPSAoZmxvYXQpZG91YmxlX3ZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIFRfRE9VQkxFOgorICAgICAgICAqKGRvdWJsZSopYWRkciA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgICAgIGlmICgoKihkb3VibGUqKWFkZHIgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9PQkpFQ1Q6CisgICAgY2FzZSBUX09CSkVDVF9FWDoKKyAgICAgICAgUHlfWElOQ1JFRih2KTsKKyAgICAgICAgb2xkdiA9ICooUHlPYmplY3QgKiopYWRkcjsKKyAgICAgICAgKihQeU9iamVjdCAqKilhZGRyID0gdjsKKyAgICAgICAgUHlfWERFQ1JFRihvbGR2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0NIQVI6CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSAmJiBQeVN0cmluZ19TaXplKHYpID09IDEpIHsKKyAgICAgICAgICAgICooY2hhciopYWRkciA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpWzBdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgIGNhc2UgVF9TVFJJTkdfSU5QTEFDRToKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlYWRvbmx5IGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLTE7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQljYXNlIFRfTE9OR0xPTkc6ewotCQlQWV9MT05HX0xPTkcgdmFsdWU7Ci0JCSooUFlfTE9OR19MT05HKilhZGRyID0gdmFsdWUgPSBQeUxvbmdfQXNMb25nTG9uZyh2KTsKLQkJaWYgKCh2YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJYnJlYWs7Ci0JCX0KLQljYXNlIFRfVUxPTkdMT05HOnsKLQkJdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbHVlOwotCQkvKiA/Pz8gUHlMb25nX0FzTG9uZ0xvbmcgYWNjZXB0cyBhbiBpbnQsIGJ1dCBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nCi0JCQlkb2Vzbid0ID8/PyAqLwotCQlpZiAoUHlMb25nX0NoZWNrKHYpKQotCQkJKih1bnNpZ25lZCBQWV9MT05HX0xPTkcqKWFkZHIgPSB2YWx1ZSA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodik7Ci0JCWVsc2UKLQkJCSoodW5zaWduZWQgUFlfTE9OR19MT05HKilhZGRyID0gdmFsdWUgPSBQeUludF9Bc0xvbmcodik7Ci0JCWlmICgodmFsdWUgPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJYnJlYWs7Ci0JCX0KKyAgICBjYXNlIFRfTE9OR0xPTkc6eworICAgICAgICBQWV9MT05HX0xPTkcgdmFsdWU7CisgICAgICAgICooUFlfTE9OR19MT05HKilhZGRyID0gdmFsdWUgPSBQeUxvbmdfQXNMb25nTG9uZyh2KTsKKyAgICAgICAgaWYgKCh2YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIFRfVUxPTkdMT05HOnsKKyAgICAgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbHVlOworICAgICAgICAvKiA/Pz8gUHlMb25nX0FzTG9uZ0xvbmcgYWNjZXB0cyBhbiBpbnQsIGJ1dCBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nCisgICAgICAgICAgICBkb2Vzbid0ID8/PyAqLworICAgICAgICBpZiAoUHlMb25nX0NoZWNrKHYpKQorICAgICAgICAgICAgKih1bnNpZ25lZCBQWV9MT05HX0xPTkcqKWFkZHIgPSB2YWx1ZSA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICoodW5zaWduZWQgUFlfTE9OR19MT05HKilhZGRyID0gdmFsdWUgPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgIGlmICgodmFsdWUgPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSAgICAgImJhZCBtZW1iZXJkZXNjciB0eXBlIGZvciAlcyIsIGwtPm5hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJiYWQgbWVtYmVyZGVzY3IgdHlwZSBmb3IgJXMiLCBsLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9zeW10YWJsZS5jIGIvUHl0aG9uL3N5bXRhYmxlLmMKaW5kZXggMGM0NjNhMi4uMGRhMmZhZiAxMDA2NDQKLS0tIGEvUHl0aG9uL3N5bXRhYmxlLmMKKysrIGIvUHl0aG9uL3N5bXRhYmxlLmMKQEAgLTE5LDE0OSArMTksMTQ5IEBACiAKIHN0YXRpYyBQeVNURW50cnlPYmplY3QgKgogc3RlX25ldyhzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBpZGVudGlmaWVyIG5hbWUsIF9QeV9ibG9ja190eSBibG9jaywKLQkgICAgICB2b2lkICprZXksIGludCBsaW5lbm8pCisgICAgICAgICAgICAgIHZvaWQgKmtleSwgaW50IGxpbmVubykKIHsKLQlQeVNURW50cnlPYmplY3QgKnN0ZSA9IE5VTEw7Ci0JUHlPYmplY3QgKms7CisgICAgUHlTVEVudHJ5T2JqZWN0ICpzdGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICprOwogCi0JayA9IFB5TG9uZ19Gcm9tVm9pZFB0cihrZXkpOwotCWlmIChrID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQlzdGUgPSBQeU9iamVjdF9OZXcoUHlTVEVudHJ5T2JqZWN0LCAmUHlTVEVudHJ5X1R5cGUpOwotCWlmIChzdGUgPT0gTlVMTCkKLQkJZ290byBmYWlsOwotCXN0ZS0+c3RlX3RhYmxlID0gc3Q7Ci0Jc3RlLT5zdGVfaWQgPSBrOworICAgIGsgPSBQeUxvbmdfRnJvbVZvaWRQdHIoa2V5KTsKKyAgICBpZiAoayA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgc3RlID0gUHlPYmplY3RfTmV3KFB5U1RFbnRyeU9iamVjdCwgJlB5U1RFbnRyeV9UeXBlKTsKKyAgICBpZiAoc3RlID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBzdGUtPnN0ZV90YWJsZSA9IHN0OworICAgIHN0ZS0+c3RlX2lkID0gazsKIAotCXN0ZS0+c3RlX25hbWUgPSBuYW1lOwotCVB5X0lOQ1JFRihuYW1lKTsKKyAgICBzdGUtPnN0ZV9uYW1lID0gbmFtZTsKKyAgICBQeV9JTkNSRUYobmFtZSk7CiAKLQlzdGUtPnN0ZV9zeW1ib2xzID0gTlVMTDsKLQlzdGUtPnN0ZV92YXJuYW1lcyA9IE5VTEw7Ci0Jc3RlLT5zdGVfY2hpbGRyZW4gPSBOVUxMOworICAgIHN0ZS0+c3RlX3N5bWJvbHMgPSBOVUxMOworICAgIHN0ZS0+c3RlX3Zhcm5hbWVzID0gTlVMTDsKKyAgICBzdGUtPnN0ZV9jaGlsZHJlbiA9IE5VTEw7CiAKLQlzdGUtPnN0ZV9zeW1ib2xzID0gUHlEaWN0X05ldygpOwotCWlmIChzdGUtPnN0ZV9zeW1ib2xzID09IE5VTEwpCi0JICAgIGdvdG8gZmFpbDsKKyAgICBzdGUtPnN0ZV9zeW1ib2xzID0gUHlEaWN0X05ldygpOworICAgIGlmIChzdGUtPnN0ZV9zeW1ib2xzID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKIAotCXN0ZS0+c3RlX3Zhcm5hbWVzID0gUHlMaXN0X05ldygwKTsKLQlpZiAoc3RlLT5zdGVfdmFybmFtZXMgPT0gTlVMTCkKLQkgICAgZ290byBmYWlsOworICAgIHN0ZS0+c3RlX3Zhcm5hbWVzID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoc3RlLT5zdGVfdmFybmFtZXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOwogCi0Jc3RlLT5zdGVfY2hpbGRyZW4gPSBQeUxpc3RfTmV3KDApOwotCWlmIChzdGUtPnN0ZV9jaGlsZHJlbiA9PSBOVUxMKQotCSAgICBnb3RvIGZhaWw7CisgICAgc3RlLT5zdGVfY2hpbGRyZW4gPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChzdGUtPnN0ZV9jaGlsZHJlbiA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CiAKLQlzdGUtPnN0ZV90eXBlID0gYmxvY2s7Ci0Jc3RlLT5zdGVfdW5vcHRpbWl6ZWQgPSAwOwotCXN0ZS0+c3RlX25lc3RlZCA9IDA7Ci0Jc3RlLT5zdGVfZnJlZSA9IDA7Ci0Jc3RlLT5zdGVfdmFyYXJncyA9IDA7Ci0Jc3RlLT5zdGVfdmFya2V5d29yZHMgPSAwOwotCXN0ZS0+c3RlX29wdF9saW5lbm8gPSAwOwotCXN0ZS0+c3RlX2xpbmVubyA9IGxpbmVubzsKKyAgICBzdGUtPnN0ZV90eXBlID0gYmxvY2s7CisgICAgc3RlLT5zdGVfdW5vcHRpbWl6ZWQgPSAwOworICAgIHN0ZS0+c3RlX25lc3RlZCA9IDA7CisgICAgc3RlLT5zdGVfZnJlZSA9IDA7CisgICAgc3RlLT5zdGVfdmFyYXJncyA9IDA7CisgICAgc3RlLT5zdGVfdmFya2V5d29yZHMgPSAwOworICAgIHN0ZS0+c3RlX29wdF9saW5lbm8gPSAwOworICAgIHN0ZS0+c3RlX2xpbmVubyA9IGxpbmVubzsKIAotCWlmIChzdC0+c3RfY3VyICE9IE5VTEwgJiYKLQkgICAgKHN0LT5zdF9jdXItPnN0ZV9uZXN0ZWQgfHwKLQkgICAgIHN0LT5zdF9jdXItPnN0ZV90eXBlID09IEZ1bmN0aW9uQmxvY2spKQotCQlzdGUtPnN0ZV9uZXN0ZWQgPSAxOwotCXN0ZS0+c3RlX2NoaWxkX2ZyZWUgPSAwOwotCXN0ZS0+c3RlX2dlbmVyYXRvciA9IDA7Ci0Jc3RlLT5zdGVfcmV0dXJuc192YWx1ZSA9IDA7CisgICAgaWYgKHN0LT5zdF9jdXIgIT0gTlVMTCAmJgorICAgICAgICAoc3QtPnN0X2N1ci0+c3RlX25lc3RlZCB8fAorICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jaykpCisgICAgICAgIHN0ZS0+c3RlX25lc3RlZCA9IDE7CisgICAgc3RlLT5zdGVfY2hpbGRfZnJlZSA9IDA7CisgICAgc3RlLT5zdGVfZ2VuZXJhdG9yID0gMDsKKyAgICBzdGUtPnN0ZV9yZXR1cm5zX3ZhbHVlID0gMDsKIAotCWlmIChQeURpY3RfU2V0SXRlbShzdC0+c3Rfc3ltYm9scywgc3RlLT5zdGVfaWQsIChQeU9iamVjdCAqKXN0ZSkgPCAwKQotCSAgICBnb3RvIGZhaWw7Ci0JCi0JcmV0dXJuIHN0ZTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc3QtPnN0X3N5bWJvbHMsIHN0ZS0+c3RlX2lkLCAoUHlPYmplY3QgKilzdGUpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcmV0dXJuIHN0ZTsKICBmYWlsOgotCVB5X1hERUNSRUYoc3RlKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKHN0ZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdGVfcmVwcihQeVNURW50cnlPYmplY3QgKnN0ZSkKIHsKLQljaGFyIGJ1ZlsyNTZdOworICAgIGNoYXIgYnVmWzI1Nl07CiAKLQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSAgICAgICI8c3ltdGFibGUgZW50cnkgJS4xMDBzKCVsZCksIGxpbmUgJWQ+IiwKLQkJICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ZS0+c3RlX25hbWUpLAotCQkgICAgICBQeUludF9BU19MT05HKHN0ZS0+c3RlX2lkKSwgc3RlLT5zdGVfbGluZW5vKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICI8c3ltdGFibGUgZW50cnkgJS4xMDBzKCVsZCksIGxpbmUgJWQ+IiwKKyAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzdGUtPnN0ZV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgIFB5SW50X0FTX0xPTkcoc3RlLT5zdGVfaWQpLCBzdGUtPnN0ZV9saW5lbm8pOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyB2b2lkCiBzdGVfZGVhbGxvYyhQeVNURW50cnlPYmplY3QgKnN0ZSkKIHsKLQlzdGUtPnN0ZV90YWJsZSA9IE5VTEw7Ci0JUHlfWERFQ1JFRihzdGUtPnN0ZV9pZCk7Ci0JUHlfWERFQ1JFRihzdGUtPnN0ZV9uYW1lKTsKLQlQeV9YREVDUkVGKHN0ZS0+c3RlX3N5bWJvbHMpOwotCVB5X1hERUNSRUYoc3RlLT5zdGVfdmFybmFtZXMpOwotCVB5X1hERUNSRUYoc3RlLT5zdGVfY2hpbGRyZW4pOwotCVB5T2JqZWN0X0RlbChzdGUpOworICAgIHN0ZS0+c3RlX3RhYmxlID0gTlVMTDsKKyAgICBQeV9YREVDUkVGKHN0ZS0+c3RlX2lkKTsKKyAgICBQeV9YREVDUkVGKHN0ZS0+c3RlX25hbWUpOworICAgIFB5X1hERUNSRUYoc3RlLT5zdGVfc3ltYm9scyk7CisgICAgUHlfWERFQ1JFRihzdGUtPnN0ZV92YXJuYW1lcyk7CisgICAgUHlfWERFQ1JFRihzdGUtPnN0ZV9jaGlsZHJlbik7CisgICAgUHlPYmplY3RfRGVsKHN0ZSk7CiB9CiAKICNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKFB5U1RFbnRyeU9iamVjdCwgeCkKIAogc3RhdGljIFB5TWVtYmVyRGVmIHN0ZV9tZW1iZXJsaXN0W10gPSB7Ci0JeyJpZCIsICAgICAgIFRfT0JKRUNULCBPRkYoc3RlX2lkKSwgUkVBRE9OTFl9LAotCXsibmFtZSIsICAgICBUX09CSkVDVCwgT0ZGKHN0ZV9uYW1lKSwgUkVBRE9OTFl9LAotCXsic3ltYm9scyIsICBUX09CSkVDVCwgT0ZGKHN0ZV9zeW1ib2xzKSwgUkVBRE9OTFl9LAotCXsidmFybmFtZXMiLCBUX09CSkVDVCwgT0ZGKHN0ZV92YXJuYW1lcyksIFJFQURPTkxZfSwKLQl7ImNoaWxkcmVuIiwgVF9PQkpFQ1QsIE9GRihzdGVfY2hpbGRyZW4pLCBSRUFET05MWX0sCi0gICAgICAgIHsib3B0aW1pemVkIixUX0lOVCwgICAgT0ZGKHN0ZV91bm9wdGltaXplZCksIFJFQURPTkxZfSwKLQl7Im5lc3RlZCIsICAgVF9JTlQsICAgIE9GRihzdGVfbmVzdGVkKSwgUkVBRE9OTFl9LAotCXsidHlwZSIsICAgICBUX0lOVCwgICAgT0ZGKHN0ZV90eXBlKSwgUkVBRE9OTFl9LAotCXsibGluZW5vIiwgICBUX0lOVCwgICAgT0ZGKHN0ZV9saW5lbm8pLCBSRUFET05MWX0sCi0Je05VTEx9CisgICAgeyJpZCIsICAgICAgIFRfT0JKRUNULCBPRkYoc3RlX2lkKSwgUkVBRE9OTFl9LAorICAgIHsibmFtZSIsICAgICBUX09CSkVDVCwgT0ZGKHN0ZV9uYW1lKSwgUkVBRE9OTFl9LAorICAgIHsic3ltYm9scyIsICBUX09CSkVDVCwgT0ZGKHN0ZV9zeW1ib2xzKSwgUkVBRE9OTFl9LAorICAgIHsidmFybmFtZXMiLCBUX09CSkVDVCwgT0ZGKHN0ZV92YXJuYW1lcyksIFJFQURPTkxZfSwKKyAgICB7ImNoaWxkcmVuIiwgVF9PQkpFQ1QsIE9GRihzdGVfY2hpbGRyZW4pLCBSRUFET05MWX0sCisgICAgeyJvcHRpbWl6ZWQiLFRfSU5ULCAgICBPRkYoc3RlX3Vub3B0aW1pemVkKSwgUkVBRE9OTFl9LAorICAgIHsibmVzdGVkIiwgICBUX0lOVCwgICAgT0ZGKHN0ZV9uZXN0ZWQpLCBSRUFET05MWX0sCisgICAgeyJ0eXBlIiwgICAgIFRfSU5ULCAgICBPRkYoc3RlX3R5cGUpLCBSRUFET05MWX0sCisgICAgeyJsaW5lbm8iLCAgIFRfSU5ULCAgICBPRkYoc3RlX2xpbmVubyksIFJFQURPTkxZfSwKKyAgICB7TlVMTH0KIH07CiAKIFB5VHlwZU9iamVjdCBQeVNURW50cnlfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJzeW10YWJsZSBlbnRyeSIsCi0Jc2l6ZW9mKFB5U1RFbnRyeU9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilzdGVfZGVhbGxvYywgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwotCTAsCQkJICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylzdGVfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlzdGVfbWVtYmVybGlzdCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JMCwJCQkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInN5bXRhYmxlIGVudHJ5IiwKKyAgICBzaXplb2YoUHlTVEVudHJ5T2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKXN0ZV9kZWFsbG9jLCAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpc3RlX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHN0ZV9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogc3RhdGljIGludCBzeW10YWJsZV9hbmFseXplKHN0cnVjdCBzeW10YWJsZSAqc3QpOwogc3RhdGljIGludCBzeW10YWJsZV93YXJuKHN0cnVjdCBzeW10YWJsZSAqc3QsIGNoYXIgKm1zZywgaW50IGxpbmVubyk7Ci1zdGF0aWMgaW50IHN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0cnVjdCBzeW10YWJsZSAqc3QsIGlkZW50aWZpZXIgbmFtZSwgCi0JCQkJX1B5X2Jsb2NrX3R5IGJsb2NrLCB2b2lkICphc3QsIGludCBsaW5lbm8pOworc3RhdGljIGludCBzeW10YWJsZV9lbnRlcl9ibG9jayhzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBpZGVudGlmaWVyIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9ibG9ja190eSBibG9jaywgdm9pZCAqYXN0LCBpbnQgbGluZW5vKTsKIHN0YXRpYyBpbnQgc3ltdGFibGVfZXhpdF9ibG9jayhzdHJ1Y3Qgc3ltdGFibGUgKnN0LCB2b2lkICphc3QpOwogc3RhdGljIGludCBzeW10YWJsZV92aXNpdF9zdG10KHN0cnVjdCBzeW10YWJsZSAqc3QsIHN0bXRfdHkgcyk7CiBzdGF0aWMgaW50IHN5bXRhYmxlX3Zpc2l0X2V4cHIoc3RydWN0IHN5bXRhYmxlICpzdCwgZXhwcl90eSBzKTsKQEAgLTE4MCwxMCArMTgwLDEwIEBACiAKIAogc3RhdGljIGlkZW50aWZpZXIgdG9wID0gTlVMTCwgbGFtYmRhID0gTlVMTCwgZ2VuZXhwciA9IE5VTEwsIHNldGNvbXAgPSBOVUxMLAotCWRpY3Rjb21wID0gTlVMTDsKKyAgICBkaWN0Y29tcCA9IE5VTEw7CiAKICNkZWZpbmUgR0VUX0lERU5USUZJRVIoVkFSKSBcCi0JKChWQVIpID8gKFZBUikgOiAoKFZBUikgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCMgVkFSKSkpCisgICAgKChWQVIpID8gKFZBUikgOiAoKFZBUikgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCMgVkFSKSkpCiAKICNkZWZpbmUgRFVQTElDQVRFX0FSR1VNRU5UIFwKICJkdXBsaWNhdGUgYXJndW1lbnQgJyVzJyBpbiBmdW5jdGlvbiBkZWZpbml0aW9uIgpAQCAtMTkxLDEzNCArMTkxLDEzNCBAQAogc3RhdGljIHN0cnVjdCBzeW10YWJsZSAqCiBzeW10YWJsZV9uZXcodm9pZCkKIHsKLQlzdHJ1Y3Qgc3ltdGFibGUgKnN0OworICAgIHN0cnVjdCBzeW10YWJsZSAqc3Q7CiAKLQlzdCA9IChzdHJ1Y3Qgc3ltdGFibGUgKilQeU1lbV9NYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW10YWJsZSkpOwotCWlmIChzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzdCA9IChzdHJ1Y3Qgc3ltdGFibGUgKilQeU1lbV9NYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW10YWJsZSkpOworICAgIGlmIChzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0LT5zdF9maWxlbmFtZSA9IE5VTEw7Ci0Jc3QtPnN0X3N5bWJvbHMgPSBOVUxMOworICAgIHN0LT5zdF9maWxlbmFtZSA9IE5VTEw7CisgICAgc3QtPnN0X3N5bWJvbHMgPSBOVUxMOwogCi0JaWYgKChzdC0+c3Rfc3RhY2sgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQotCQlnb3RvIGZhaWw7Ci0JaWYgKChzdC0+c3Rfc3ltYm9scyA9IFB5RGljdF9OZXcoKSkgPT0gTlVMTCkKLQkJZ290byBmYWlsOyAKLQlzdC0+c3RfY3VyID0gTlVMTDsKLQlzdC0+c3RfcHJpdmF0ZSA9IE5VTEw7Ci0JcmV0dXJuIHN0OworICAgIGlmICgoc3QtPnN0X3N0YWNrID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmICgoc3QtPnN0X3N5bWJvbHMgPSBQeURpY3RfTmV3KCkpID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBzdC0+c3RfY3VyID0gTlVMTDsKKyAgICBzdC0+c3RfcHJpdmF0ZSA9IE5VTEw7CisgICAgcmV0dXJuIHN0OwogIGZhaWw6Ci0JUHlTeW10YWJsZV9GcmVlKHN0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeVN5bXRhYmxlX0ZyZWUoc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdHJ1Y3Qgc3ltdGFibGUgKgogUHlTeW10YWJsZV9CdWlsZChtb2RfdHkgbW9kLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlGdXR1cmVGZWF0dXJlcyAqZnV0dXJlKQogewotCXN0cnVjdCBzeW10YWJsZSAqc3QgPSBzeW10YWJsZV9uZXcoKTsKLQlhc2RsX3NlcSAqc2VxOwotCWludCBpOworICAgIHN0cnVjdCBzeW10YWJsZSAqc3QgPSBzeW10YWJsZV9uZXcoKTsKKyAgICBhc2RsX3NlcSAqc2VxOworICAgIGludCBpOwogCi0JaWYgKHN0ID09IE5VTEwpCi0JCXJldHVybiBzdDsKLQlzdC0+c3RfZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQlzdC0+c3RfZnV0dXJlID0gZnV0dXJlOwotCWlmICghR0VUX0lERU5USUZJRVIodG9wKSB8fAotCSAgICAhc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIHRvcCwgTW9kdWxlQmxvY2ssICh2b2lkICopbW9kLCAwKSkgewotCQlQeVN5bXRhYmxlX0ZyZWUoc3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBzdDsKKyAgICBzdC0+c3RfZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgICBzdC0+c3RfZnV0dXJlID0gZnV0dXJlOworICAgIGlmICghR0VUX0lERU5USUZJRVIodG9wKSB8fAorICAgICAgICAhc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIHRvcCwgTW9kdWxlQmxvY2ssICh2b2lkICopbW9kLCAwKSkgeworICAgICAgICBQeVN5bXRhYmxlX0ZyZWUoc3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzdC0+c3RfdG9wID0gc3QtPnN0X2N1cjsKLQlzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgPSBPUFRfVE9QTEVWRUw7Ci0JLyogQW55IG90aGVyIHRvcC1sZXZlbCBpbml0aWFsaXphdGlvbj8gKi8KLQlzd2l0Y2ggKG1vZC0+a2luZCkgewotCWNhc2UgTW9kdWxlX2tpbmQ6Ci0JCXNlcSA9IG1vZC0+di5Nb2R1bGUuYm9keTsKLQkJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspCi0JCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X3N0bXQoc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSkpKQotCQkJCWdvdG8gZXJyb3I7Ci0JCWJyZWFrOwotCWNhc2UgRXhwcmVzc2lvbl9raW5kOgotCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X2V4cHIoc3QsIG1vZC0+di5FeHByZXNzaW9uLmJvZHkpKQotCQkJZ290byBlcnJvcjsKLQkJYnJlYWs7Ci0JY2FzZSBJbnRlcmFjdGl2ZV9raW5kOgotCQlzZXEgPSBtb2QtPnYuSW50ZXJhY3RpdmUuYm9keTsKLQkJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspCi0JCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X3N0bXQoc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSkpKQotCQkJCWdvdG8gZXJyb3I7Ci0JCWJyZWFrOwotCWNhc2UgU3VpdGVfa2luZDoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkidGhpcyBjb21waWxlciBkb2VzIG5vdCBoYW5kbGUgU3VpdGVzIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWlmICghc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgKHZvaWQgKiltb2QpKSB7Ci0JCVB5U3ltdGFibGVfRnJlZShzdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc3ltdGFibGVfYW5hbHl6ZShzdCkpCi0JCXJldHVybiBzdDsKLQlQeVN5bXRhYmxlX0ZyZWUoc3QpOwotCXJldHVybiBOVUxMOworICAgIHN0LT5zdF90b3AgPSBzdC0+c3RfY3VyOworICAgIHN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCA9IE9QVF9UT1BMRVZFTDsKKyAgICAvKiBBbnkgb3RoZXIgdG9wLWxldmVsIGluaXRpYWxpemF0aW9uPyAqLworICAgIHN3aXRjaCAobW9kLT5raW5kKSB7CisgICAgY2FzZSBNb2R1bGVfa2luZDoKKyAgICAgICAgc2VxID0gbW9kLT52Lk1vZHVsZS5ib2R5OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykKKyAgICAgICAgICAgIGlmICghc3ltdGFibGVfdmlzaXRfc3RtdChzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzdG10X3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEV4cHJlc3Npb25fa2luZDoKKyAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF9leHByKHN0LCBtb2QtPnYuRXhwcmVzc2lvbi5ib2R5KSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSW50ZXJhY3RpdmVfa2luZDoKKyAgICAgICAgc2VxID0gbW9kLT52LkludGVyYWN0aXZlLmJvZHk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKQorICAgICAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF9zdG10KHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSkpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU3VpdGVfa2luZDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGNvbXBpbGVyIGRvZXMgbm90IGhhbmRsZSBTdWl0ZXMiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKCFzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKW1vZCkpIHsKKyAgICAgICAgUHlTeW10YWJsZV9GcmVlKHN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzeW10YWJsZV9hbmFseXplKHN0KSkKKyAgICAgICAgcmV0dXJuIHN0OworICAgIFB5U3ltdGFibGVfRnJlZShzdCk7CisgICAgcmV0dXJuIE5VTEw7CiAgZXJyb3I6Ci0JKHZvaWQpIHN5bXRhYmxlX2V4aXRfYmxvY2soc3QsICh2b2lkICopbW9kKTsKLQlQeVN5bXRhYmxlX0ZyZWUoc3QpOwotCXJldHVybiBOVUxMOworICAgICh2b2lkKSBzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKW1vZCk7CisgICAgUHlTeW10YWJsZV9GcmVlKHN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogdm9pZAogUHlTeW10YWJsZV9GcmVlKHN0cnVjdCBzeW10YWJsZSAqc3QpCiB7Ci0JUHlfWERFQ1JFRihzdC0+c3Rfc3ltYm9scyk7Ci0JUHlfWERFQ1JFRihzdC0+c3Rfc3RhY2spOwotCVB5TWVtX0ZyZWUoKHZvaWQgKilzdCk7CisgICAgUHlfWERFQ1JFRihzdC0+c3Rfc3ltYm9scyk7CisgICAgUHlfWERFQ1JFRihzdC0+c3Rfc3RhY2spOworICAgIFB5TWVtX0ZyZWUoKHZvaWQgKilzdCk7CiB9CiAKIFB5U1RFbnRyeU9iamVjdCAqCiBQeVN5bXRhYmxlX0xvb2t1cChzdHJ1Y3Qgc3ltdGFibGUgKnN0LCB2b2lkICprZXkpCiB7Ci0JUHlPYmplY3QgKmssICp2OworICAgIFB5T2JqZWN0ICprLCAqdjsKIAotCWsgPSBQeUxvbmdfRnJvbVZvaWRQdHIoa2V5KTsKLQlpZiAoayA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gUHlEaWN0X0dldEl0ZW0oc3QtPnN0X3N5bWJvbHMsIGspOwotCWlmICh2KSB7Ci0JCWFzc2VydChQeVNURW50cnlfQ2hlY2sodikpOwotCQlQeV9JTkNSRUYodik7Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCi0JCQkJInVua25vd24gc3ltYm9sIHRhYmxlIGVudHJ5Iik7Ci0JfQorICAgIGsgPSBQeUxvbmdfRnJvbVZvaWRQdHIoa2V5KTsKKyAgICBpZiAoayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2ID0gUHlEaWN0X0dldEl0ZW0oc3QtPnN0X3N5bWJvbHMsIGspOworICAgIGlmICh2KSB7CisgICAgICAgIGFzc2VydChQeVNURW50cnlfQ2hlY2sodikpOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBzeW1ib2wgdGFibGUgZW50cnkiKTsKKyAgICB9CiAKLQlQeV9ERUNSRUYoayk7Ci0JcmV0dXJuIChQeVNURW50cnlPYmplY3QgKil2OworICAgIFB5X0RFQ1JFRihrKTsKKyAgICByZXR1cm4gKFB5U1RFbnRyeU9iamVjdCAqKXY7CiB9CiAKLWludCAKK2ludAogUHlTVF9HZXRTY29wZShQeVNURW50cnlPYmplY3QgKnN0ZSwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKnYgPSBQeURpY3RfR2V0SXRlbShzdGUtPnN0ZV9zeW1ib2xzLCBuYW1lKTsKLQlpZiAoIXYpCi0JCXJldHVybiAwOwotCWFzc2VydChQeUludF9DaGVjayh2KSk7Ci0JcmV0dXJuIChQeUludF9BU19MT05HKHYpID4+IFNDT1BFX09GRikgJiBTQ09QRV9NQVNLOworICAgIFB5T2JqZWN0ICp2ID0gUHlEaWN0X0dldEl0ZW0oc3RlLT5zdGVfc3ltYm9scywgbmFtZSk7CisgICAgaWYgKCF2KQorICAgICAgICByZXR1cm4gMDsKKyAgICBhc3NlcnQoUHlJbnRfQ2hlY2sodikpOworICAgIHJldHVybiAoUHlJbnRfQVNfTE9ORyh2KSA+PiBTQ09QRV9PRkYpICYgU0NPUEVfTUFTSzsKIH0KIAogCiAvKiBBbmFseXplIHJhdyBzeW1ib2wgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHNjb3BlIG9mIGVhY2ggbmFtZS4KIAogICAgVGhlIG5leHQgc2V2ZXJhbCBmdW5jdGlvbnMgYXJlIGhlbHBlcnMgZm9yIFB5U3ltdGFibGVfQW5hbHl6ZSgpLAotICAgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIGEgbmFtZSBpcyBsb2NhbCwgZ2xvYmFsLCBvciBmcmVlLiAgSW4gYWRkaXRpb24sIAorICAgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIGEgbmFtZSBpcyBsb2NhbCwgZ2xvYmFsLCBvciBmcmVlLiAgSW4gYWRkaXRpb24sCiAgICBpdCBkZXRlcm1pbmVzIHdoaWNoIGxvY2FsIHZhcmlhYmxlcyBhcmUgY2VsbCB2YXJpYWJsZXM7IHRoZXkgcHJvdmlkZQotICAgYmluZGluZ3MgdGhhdCBhcmUgdXNlZCBmb3IgZnJlZSB2YXJpYWJsZXMgaW4gZW5jbG9zZWQgYmxvY2tzLiAgCisgICBiaW5kaW5ncyB0aGF0IGFyZSB1c2VkIGZvciBmcmVlIHZhcmlhYmxlcyBpbiBlbmNsb3NlZCBibG9ja3MuCiAKLSAgIFRoZXJlIGFyZSBhbHNvIHR3byBraW5kcyBvZiBmcmVlIHZhcmlhYmxlcywgaW1wbGljaXQgYW5kIGV4cGxpY2l0LiAgQW4gCisgICBUaGVyZSBhcmUgYWxzbyB0d28ga2luZHMgb2YgZnJlZSB2YXJpYWJsZXMsIGltcGxpY2l0IGFuZCBleHBsaWNpdC4gIEFuCiAgICBleHBsaWNpdCBnbG9iYWwgaXMgZGVjbGFyZWQgd2l0aCB0aGUgZ2xvYmFsIHN0YXRlbWVudC4gIEFuIGltcGxpY2l0CiAgICBnbG9iYWwgaXMgYSBmcmVlIHZhcmlhYmxlIGZvciB3aGljaCB0aGUgY29tcGlsZXIgaGFzIGZvdW5kIG5vIGJpbmRpbmcKICAgIGluIGFuIGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS4gIFRoZSBpbXBsaWNpdCBnbG9iYWwgaXMgZWl0aGVyIGEgZ2xvYmFsCkBAIC0zMjgsMzUgKzMyOCwzNSBAQAogICAgaXMgdHJlYXRlZCBhcyBhIGxvY2FsLgogCiAgICBUaGUgc3ltYm9sIHRhYmxlIHJlcXVpcmVzIHR3byBwYXNzZXMgdG8gZGV0ZXJtaW5lIHRoZSBzY29wZSBvZiBlYWNoIG5hbWUuCi0gICBUaGUgZmlyc3QgcGFzcyBjb2xsZWN0cyByYXcgZmFjdHMgZnJvbSB0aGUgQVNUOiB0aGUgbmFtZSBpcyBhIHBhcmFtZXRlciAKKyAgIFRoZSBmaXJzdCBwYXNzIGNvbGxlY3RzIHJhdyBmYWN0cyBmcm9tIHRoZSBBU1Q6IHRoZSBuYW1lIGlzIGEgcGFyYW1ldGVyCiAgICBoZXJlLCB0aGUgbmFtZSBpcyB1c2VkIGJ5IG5vdCBkZWZpbmVkIGhlcmUsIGV0Yy4gIFRoZSBzZWNvbmQgcGFzcyBhbmFseXplcwogICAgdGhlc2UgZmFjdHMgZHVyaW5nIGEgcGFzcyBvdmVyIHRoZSBQeVNURW50cnlPYmplY3RzIGNyZWF0ZWQgZHVyaW5nIHBhc3MgMS4KIAogICAgV2hlbiBhIGZ1bmN0aW9uIGlzIGVudGVyZWQgZHVyaW5nIHRoZSBzZWNvbmQgcGFzcywgdGhlIHBhcmVudCBwYXNzZXMKLSAgIHRoZSBzZXQgb2YgYWxsIG5hbWUgYmluZGluZ3MgdmlzaWJsZSB0byBpdHMgY2hpbGRyZW4uICBUaGVzZSBiaW5kaW5ncyAKKyAgIHRoZSBzZXQgb2YgYWxsIG5hbWUgYmluZGluZ3MgdmlzaWJsZSB0byBpdHMgY2hpbGRyZW4uICBUaGVzZSBiaW5kaW5ncwogICAgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YXJpYWJsZSBpcyBmcmVlIG9yIGFuIGltcGxpY2l0IGdsb2JhbC4KICAgIEFmdGVyIGRvaW5nIHRoZSBsb2NhbCBhbmFseXNpcywgaXQgYW5hbHl6ZXMgZWFjaCBvZiBpdHMgY2hpbGQgYmxvY2tzCi0gICB1c2luZyBhbiB1cGRhdGVkIHNldCBvZiBuYW1lIGJpbmRpbmdzLiAgCisgICB1c2luZyBhbiB1cGRhdGVkIHNldCBvZiBuYW1lIGJpbmRpbmdzLgogCi0gICBUaGUgY2hpbGRyZW4gdXBkYXRlIHRoZSBmcmVlIHZhcmlhYmxlIHNldC4gIElmIGEgbG9jYWwgdmFyaWFibGUgaXMgZnJlZSAKLSAgIGluIGEgY2hpbGQsIHRoZSB2YXJpYWJsZSBpcyBtYXJrZWQgYXMgYSBjZWxsLiAgVGhlIGN1cnJlbnQgZnVuY3Rpb24gbXVzdCAKLSAgIHByb3ZpZGUgcnVudGltZSBzdG9yYWdlIGZvciB0aGUgdmFyaWFibGUgdGhhdCBtYXkgb3V0bGl2ZSB0aGUgZnVuY3Rpb24ncyAKKyAgIFRoZSBjaGlsZHJlbiB1cGRhdGUgdGhlIGZyZWUgdmFyaWFibGUgc2V0LiAgSWYgYSBsb2NhbCB2YXJpYWJsZSBpcyBmcmVlCisgICBpbiBhIGNoaWxkLCB0aGUgdmFyaWFibGUgaXMgbWFya2VkIGFzIGEgY2VsbC4gIFRoZSBjdXJyZW50IGZ1bmN0aW9uIG11c3QKKyAgIHByb3ZpZGUgcnVudGltZSBzdG9yYWdlIGZvciB0aGUgdmFyaWFibGUgdGhhdCBtYXkgb3V0bGl2ZSB0aGUgZnVuY3Rpb24ncwogICAgZnJhbWUuICBDZWxsIHZhcmlhYmxlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBmcmVlIHNldCBiZWZvcmUgdGhlIGFuYWx5emUKICAgIGZ1bmN0aW9uIHJldHVybnMgdG8gaXRzIHBhcmVudC4KLSAgIAorCiAgICBUaGUgc2V0cyBvZiBib3VuZCBhbmQgZnJlZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGFzIGRpY3Rpb25hcmllcwogICAgbWFwcGluZyBzdHJpbmdzIHRvIE5vbmUuCiAqLwogCiAjZGVmaW5lIFNFVF9TQ09QRShESUNULCBOQU1FLCBJKSB7IFwKLQlQeU9iamVjdCAqbyA9IFB5SW50X0Zyb21Mb25nKEkpOyBcCi0JaWYgKCFvKSBcCi0JCXJldHVybiAwOyBcCi0JaWYgKFB5RGljdF9TZXRJdGVtKChESUNUKSwgKE5BTUUpLCBvKSA8IDApIHsgXAotCQlQeV9ERUNSRUYobyk7IFwKLQkJcmV0dXJuIDA7IFwKLQl9IFwKLQlQeV9ERUNSRUYobyk7IFwKKyAgICBQeU9iamVjdCAqbyA9IFB5SW50X0Zyb21Mb25nKEkpOyBcCisgICAgaWYgKCFvKSBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgaWYgKFB5RGljdF9TZXRJdGVtKChESUNUKSwgKE5BTUUpLCBvKSA8IDApIHsgXAorICAgICAgICBQeV9ERUNSRUYobyk7IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKKyAgICBQeV9ERUNSRUYobyk7IFwKIH0KIAogLyogRGVjaWRlIG9uIHNjb3BlIG9mIG5hbWUsIGdpdmVuIGZsYWdzLgpAQCAtMzY2LDY5ICszNjYsNjkgQEAKICAgIGdsb2JhbC4gIEEgbmFtZSB0aGF0IHdhcyBnbG9iYWwgY2FuIGJlIGNoYW5nZWQgdG8gbG9jYWwuCiAqLwogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogYW5hbHl6ZV9uYW1lKFB5U1RFbnRyeU9iamVjdCAqc3RlLCBQeU9iamVjdCAqZGljdCwgUHlPYmplY3QgKm5hbWUsIGxvbmcgZmxhZ3MsCi0JICAgICBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpsb2NhbCwgUHlPYmplY3QgKmZyZWUsIAotCSAgICAgUHlPYmplY3QgKmdsb2JhbCkKKyAgICAgICAgICAgICBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpsb2NhbCwgUHlPYmplY3QgKmZyZWUsCisgICAgICAgICAgICAgUHlPYmplY3QgKmdsb2JhbCkKIHsKLQlpZiAoZmxhZ3MgJiBERUZfR0xPQkFMKSB7Ci0JCWlmIChmbGFncyAmIERFRl9QQVJBTSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLAotCQkJCSAgICAgIm5hbWUgJyVzJyBpcyBsb2NhbCBhbmQgZ2xvYmFsIiwKLQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JCQlQeUVycl9TeW50YXhMb2NhdGlvbihzdGUtPnN0ZV90YWJsZS0+c3RfZmlsZW5hbWUsCi0JCQkJCSAgICAgc3RlLT5zdGVfbGluZW5vKTsKLQkJCQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJU0VUX1NDT1BFKGRpY3QsIG5hbWUsIEdMT0JBTF9FWFBMSUNJVCk7Ci0JCWlmIChQeURpY3RfU2V0SXRlbShnbG9iYWwsIG5hbWUsIFB5X05vbmUpIDwgMCkKLQkJCXJldHVybiAwOwotCQlpZiAoYm91bmQgJiYgUHlEaWN0X0dldEl0ZW0oYm91bmQsIG5hbWUpKSB7Ci0JCQlpZiAoUHlEaWN0X0RlbEl0ZW0oYm91bmQsIG5hbWUpIDwgMCkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGZsYWdzICYgREVGX0JPVU5EKSB7Ci0JCVNFVF9TQ09QRShkaWN0LCBuYW1lLCBMT0NBTCk7Ci0JCWlmIChQeURpY3RfU2V0SXRlbShsb2NhbCwgbmFtZSwgUHlfTm9uZSkgPCAwKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChQeURpY3RfR2V0SXRlbShnbG9iYWwsIG5hbWUpKSB7Ci0JCQlpZiAoUHlEaWN0X0RlbEl0ZW0oZ2xvYmFsLCBuYW1lKSA8IDApCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCS8qIElmIGFuIGVuY2xvc2luZyBibG9jayBoYXMgYSBiaW5kaW5nIGZvciB0aGlzIG5hbWUsIGl0Ci0JICAgaXMgYSBmcmVlIHZhcmlhYmxlIHJhdGhlciB0aGFuIGEgZ2xvYmFsIHZhcmlhYmxlLgotCSAgIE5vdGUgdGhhdCBoYXZpbmcgYSBub24tTlVMTCBib3VuZCBpbXBsaWVzIHRoYXQgdGhlIGJsb2NrCi0JICAgaXMgbmVzdGVkLgotCSovCi0JaWYgKGJvdW5kICYmIFB5RGljdF9HZXRJdGVtKGJvdW5kLCBuYW1lKSkgewotCQlTRVRfU0NPUEUoZGljdCwgbmFtZSwgRlJFRSk7Ci0JCXN0ZS0+c3RlX2ZyZWUgPSAxOwotCQlpZiAoUHlEaWN0X1NldEl0ZW0oZnJlZSwgbmFtZSwgUHlfTm9uZSkgPCAwKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAxOwotCX0KLQkvKiBJZiBhIHBhcmVudCBoYXMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGVuIGNhbGwgaXQgZ2xvYmFsCi0JICAgZXhwbGljaXQ/ICBJdCBjb3VsZCBhbHNvIGJlIGdsb2JhbCBpbXBsaWNpdC4KLQkgKi8KLQllbHNlIGlmIChnbG9iYWwgJiYgUHlEaWN0X0dldEl0ZW0oZ2xvYmFsLCBuYW1lKSkgewotCQlTRVRfU0NPUEUoZGljdCwgbmFtZSwgR0xPQkFMX0lNUExJQ0lUKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgewotCQlpZiAoc3RlLT5zdGVfbmVzdGVkKQotCQkJc3RlLT5zdGVfZnJlZSA9IDE7Ci0JCVNFVF9TQ09QRShkaWN0LCBuYW1lLCBHTE9CQUxfSU1QTElDSVQpOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLwotCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgImZhaWxlZCB0byBzZXQgc2NvcGUgZm9yICVzIiwKLQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwotCXJldHVybiAwOworICAgIGlmIChmbGFncyAmIERFRl9HTE9CQUwpIHsKKyAgICAgICAgaWYgKGZsYWdzICYgREVGX1BBUkFNKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUgJyVzJyBpcyBsb2NhbCBhbmQgZ2xvYmFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3RlLT5zdGVfdGFibGUtPnN0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlLT5zdGVfbGluZW5vKTsKKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgU0VUX1NDT1BFKGRpY3QsIG5hbWUsIEdMT0JBTF9FWFBMSUNJVCk7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShnbG9iYWwsIG5hbWUsIFB5X05vbmUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoYm91bmQgJiYgUHlEaWN0X0dldEl0ZW0oYm91bmQsIG5hbWUpKSB7CisgICAgICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oYm91bmQsIG5hbWUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgREVGX0JPVU5EKSB7CisgICAgICAgIFNFVF9TQ09QRShkaWN0LCBuYW1lLCBMT0NBTCk7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShsb2NhbCwgbmFtZSwgUHlfTm9uZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbShnbG9iYWwsIG5hbWUpKSB7CisgICAgICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oZ2xvYmFsLCBuYW1lKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIC8qIElmIGFuIGVuY2xvc2luZyBibG9jayBoYXMgYSBiaW5kaW5nIGZvciB0aGlzIG5hbWUsIGl0CisgICAgICAgaXMgYSBmcmVlIHZhcmlhYmxlIHJhdGhlciB0aGFuIGEgZ2xvYmFsIHZhcmlhYmxlLgorICAgICAgIE5vdGUgdGhhdCBoYXZpbmcgYSBub24tTlVMTCBib3VuZCBpbXBsaWVzIHRoYXQgdGhlIGJsb2NrCisgICAgICAgaXMgbmVzdGVkLgorICAgICovCisgICAgaWYgKGJvdW5kICYmIFB5RGljdF9HZXRJdGVtKGJvdW5kLCBuYW1lKSkgeworICAgICAgICBTRVRfU0NPUEUoZGljdCwgbmFtZSwgRlJFRSk7CisgICAgICAgIHN0ZS0+c3RlX2ZyZWUgPSAxOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZnJlZSwgbmFtZSwgUHlfTm9uZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvKiBJZiBhIHBhcmVudCBoYXMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGVuIGNhbGwgaXQgZ2xvYmFsCisgICAgICAgZXhwbGljaXQ/ICBJdCBjb3VsZCBhbHNvIGJlIGdsb2JhbCBpbXBsaWNpdC4KKyAgICAgKi8KKyAgICBlbHNlIGlmIChnbG9iYWwgJiYgUHlEaWN0X0dldEl0ZW0oZ2xvYmFsLCBuYW1lKSkgeworICAgICAgICBTRVRfU0NPUEUoZGljdCwgbmFtZSwgR0xPQkFMX0lNUExJQ0lUKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoc3RlLT5zdGVfbmVzdGVkKQorICAgICAgICAgICAgc3RlLT5zdGVfZnJlZSA9IDE7CisgICAgICAgIFNFVF9TQ09QRShkaWN0LCBuYW1lLCBHTE9CQUxfSU1QTElDSVQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgImZhaWxlZCB0byBzZXQgc2NvcGUgZm9yICVzIiwKKyAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICByZXR1cm4gMDsKIH0KIAogI3VuZGVmIFNFVF9TQ09QRQpAQCAtNDQ0LDE1MiArNDQ0LDE1MiBAQAogc3RhdGljIGludAogYW5hbHl6ZV9jZWxscyhQeU9iamVjdCAqc2NvcGUsIFB5T2JqZWN0ICpmcmVlKQogewotICAgICAgICBQeU9iamVjdCAqbmFtZSwgKnYsICp3OwotCWludCBzdWNjZXNzID0gMDsKLQlQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgUHlPYmplY3QgKm5hbWUsICp2LCAqdzsKKyAgICBpbnQgc3VjY2VzcyA9IDA7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCi0JdyA9IFB5SW50X0Zyb21Mb25nKENFTEwpOwotCWlmICghdykKLQkJcmV0dXJuIDA7Ci0Jd2hpbGUgKFB5RGljdF9OZXh0KHNjb3BlLCAmcG9zLCAmbmFtZSwgJnYpKSB7Ci0JCWxvbmcgZmxhZ3M7Ci0JCWFzc2VydChQeUludF9DaGVjayh2KSk7Ci0JCWZsYWdzID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJaWYgKGZsYWdzICE9IExPQ0FMKQotCQkJY29udGludWU7Ci0JCWlmICghUHlEaWN0X0dldEl0ZW0oZnJlZSwgbmFtZSkpCi0JCQljb250aW51ZTsKLQkJLyogUmVwbGFjZSBMT0NBTCB3aXRoIENFTEwgZm9yIHRoaXMgbmFtZSwgYW5kIHJlbW92ZQotCQkgICBmcm9tIGZyZWUuIEl0IGlzIHNhZmUgdG8gcmVwbGFjZSB0aGUgdmFsdWUgb2YgbmFtZSAKLQkJICAgaW4gdGhlIGRpY3QsIGJlY2F1c2UgaXQgd2lsbCBub3QgY2F1c2UgYSByZXNpemUuCi0JCSAqLwotCQlpZiAoUHlEaWN0X1NldEl0ZW0oc2NvcGUsIG5hbWUsIHcpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmICghUHlEaWN0X0RlbEl0ZW0oZnJlZSwgbmFtZSkgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9Ci0Jc3VjY2VzcyA9IDE7CisgICAgdyA9IFB5SW50X0Zyb21Mb25nKENFTEwpOworICAgIGlmICghdykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KHNjb3BlLCAmcG9zLCAmbmFtZSwgJnYpKSB7CisgICAgICAgIGxvbmcgZmxhZ3M7CisgICAgICAgIGFzc2VydChQeUludF9DaGVjayh2KSk7CisgICAgICAgIGZsYWdzID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgaWYgKGZsYWdzICE9IExPQ0FMKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICghUHlEaWN0X0dldEl0ZW0oZnJlZSwgbmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLyogUmVwbGFjZSBMT0NBTCB3aXRoIENFTEwgZm9yIHRoaXMgbmFtZSwgYW5kIHJlbW92ZQorICAgICAgICAgICBmcm9tIGZyZWUuIEl0IGlzIHNhZmUgdG8gcmVwbGFjZSB0aGUgdmFsdWUgb2YgbmFtZQorICAgICAgICAgICBpbiB0aGUgZGljdCwgYmVjYXVzZSBpdCB3aWxsIG5vdCBjYXVzZSBhIHJlc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzY29wZSwgbmFtZSwgdykgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKCFQeURpY3RfRGVsSXRlbShmcmVlLCBuYW1lKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzdWNjZXNzID0gMTsKICBlcnJvcjoKLQlQeV9ERUNSRUYodyk7Ci0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgUHlfREVDUkVGKHcpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiAvKiBDaGVjayBmb3IgaWxsZWdhbCBzdGF0ZW1lbnRzIGluIHVub3B0aW1pemVkIG5hbWVzcGFjZXMgKi8KIHN0YXRpYyBpbnQKIGNoZWNrX3Vub3B0aW1pemVkKGNvbnN0IFB5U1RFbnRyeU9iamVjdCogc3RlKSB7Ci0JY2hhciBidWZbMzAwXTsKLQljb25zdCBjaGFyKiB0cmFpbGVyOworICAgIGNoYXIgYnVmWzMwMF07CisgICAgY29uc3QgY2hhciogdHJhaWxlcjsKIAotCWlmIChzdGUtPnN0ZV90eXBlICE9IEZ1bmN0aW9uQmxvY2sgfHwgIXN0ZS0+c3RlX3Vub3B0aW1pemVkCi0JICAgIHx8ICEoc3RlLT5zdGVfZnJlZSB8fCBzdGUtPnN0ZV9jaGlsZF9mcmVlKSkKLQkJcmV0dXJuIDE7CisgICAgaWYgKHN0ZS0+c3RlX3R5cGUgIT0gRnVuY3Rpb25CbG9jayB8fCAhc3RlLT5zdGVfdW5vcHRpbWl6ZWQKKyAgICAgICAgfHwgIShzdGUtPnN0ZV9mcmVlIHx8IHN0ZS0+c3RlX2NoaWxkX2ZyZWUpKQorICAgICAgICByZXR1cm4gMTsKIAotCXRyYWlsZXIgPSAoc3RlLT5zdGVfY2hpbGRfZnJlZSA/IAotCQkgICAgICAgImNvbnRhaW5zIGEgbmVzdGVkIGZ1bmN0aW9uIHdpdGggZnJlZSB2YXJpYWJsZXMiIDoKLQkJCSAgICAgICAiaXMgYSBuZXN0ZWQgZnVuY3Rpb24iKTsKKyAgICB0cmFpbGVyID0gKHN0ZS0+c3RlX2NoaWxkX2ZyZWUgPworICAgICAgICAgICAgICAgICAgICJjb250YWlucyBhIG5lc3RlZCBmdW5jdGlvbiB3aXRoIGZyZWUgdmFyaWFibGVzIiA6CisgICAgICAgICAgICAgICAgICAgImlzIGEgbmVzdGVkIGZ1bmN0aW9uIik7CiAKLQlzd2l0Y2ggKHN0ZS0+c3RlX3Vub3B0aW1pemVkKSB7Ci0JY2FzZSBPUFRfVE9QTEVWRUw6IC8qIGV4ZWMgLyBpbXBvcnQgKiBhdCB0b3AtbGV2ZWwgaXMgZmluZSAqLwotCWNhc2UgT1BUX0VYRUM6IC8qIHF1YWxpZmllZCBleGVjIGlzIGZpbmUgKi8KLQkJcmV0dXJuIDE7Ci0JY2FzZSBPUFRfSU1QT1JUX1NUQVI6Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgCi0JCQkgICAgICAiaW1wb3J0ICogaXMgbm90IGFsbG93ZWQgaW4gZnVuY3Rpb24gJyUuMTAwcycgIgotCQkJICAgICAgImJlY2F1c2UgaXQgJXMiLAotCQkJICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ZS0+c3RlX25hbWUpLCB0cmFpbGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBPUFRfQkFSRV9FWEVDOgotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkgICAgICAidW5xdWFsaWZpZWQgZXhlYyBpcyBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiAiCi0JCQkgICAgICAiJyUuMTAwcycgaXQgJXMiLAotCQkJICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ZS0+c3RlX25hbWUpLCB0cmFpbGVyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAKLQkJCSAgICAgICJmdW5jdGlvbiAnJS4xMDBzJyB1c2VzIGltcG9ydCAqIGFuZCBiYXJlIGV4ZWMsICIKLQkJCSAgICAgICJ3aGljaCBhcmUgaWxsZWdhbCBiZWNhdXNlIGl0ICVzIiwKLQkJCSAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzdGUtPnN0ZV9uYW1lKSwgdHJhaWxlcik7Ci0JCWJyZWFrOwotCX0KKyAgICBzd2l0Y2ggKHN0ZS0+c3RlX3Vub3B0aW1pemVkKSB7CisgICAgY2FzZSBPUFRfVE9QTEVWRUw6IC8qIGV4ZWMgLyBpbXBvcnQgKiBhdCB0b3AtbGV2ZWwgaXMgZmluZSAqLworICAgIGNhc2UgT1BUX0VYRUM6IC8qIHF1YWxpZmllZCBleGVjIGlzIGZpbmUgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBPUFRfSU1QT1JUX1NUQVI6CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0ICogaXMgbm90IGFsbG93ZWQgaW4gZnVuY3Rpb24gJyUuMTAwcycgIgorICAgICAgICAgICAgICAgICAgICAgICJiZWNhdXNlIGl0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RlLT5zdGVfbmFtZSksIHRyYWlsZXIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QVF9CQVJFX0VYRUM6CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAidW5xdWFsaWZpZWQgZXhlYyBpcyBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgIiclLjEwMHMnIGl0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RlLT5zdGVfbmFtZSksIHRyYWlsZXIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uICclLjEwMHMnIHVzZXMgaW1wb3J0ICogYW5kIGJhcmUgZXhlYywgIgorICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBhcmUgaWxsZWdhbCBiZWNhdXNlIGl0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RlLT5zdGVfbmFtZSksIHRyYWlsZXIpOworICAgICAgICBicmVhazsKKyAgICB9CiAKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsIGJ1Zik7Ci0JUHlFcnJfU3ludGF4TG9jYXRpb24oc3RlLT5zdGVfdGFibGUtPnN0X2ZpbGVuYW1lLCAKLQkJCSAgICAgc3RlLT5zdGVfb3B0X2xpbmVubyk7Ci0JcmV0dXJuIDA7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLCBidWYpOworICAgIFB5RXJyX1N5bnRheExvY2F0aW9uKHN0ZS0+c3RlX3RhYmxlLT5zdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGUtPnN0ZV9vcHRfbGluZW5vKTsKKyAgICByZXR1cm4gMDsKIH0KIAotLyogRW50ZXIgdGhlIGZpbmFsIHNjb3BlIGluZm9ybWF0aW9uIGludG8gdGhlIHN0X3N5bWJvbHMgZGljdC4gCi0gKiAKKy8qIEVudGVyIHRoZSBmaW5hbCBzY29wZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBzdF9zeW1ib2xzIGRpY3QuCisgKgogICogQWxsIGFyZ3VtZW50cyBhcmUgZGljdHMuICBNb2RpZmllcyBzeW1ib2xzLCBvdGhlcnMgYXJlIHJlYWQtb25seS4KICovCiBzdGF0aWMgaW50Ci11cGRhdGVfc3ltYm9scyhQeU9iamVjdCAqc3ltYm9scywgUHlPYmplY3QgKnNjb3BlLCAKK3VwZGF0ZV9zeW1ib2xzKFB5T2JqZWN0ICpzeW1ib2xzLCBQeU9iamVjdCAqc2NvcGUsCiAgICAgICAgICAgICAgICBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpmcmVlLCBpbnQgY2xhc3NmbGFnKQogewotCVB5T2JqZWN0ICpuYW1lLCAqdiwgKnUsICp3LCAqZnJlZV92YWx1ZSA9IE5VTEw7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5T2JqZWN0ICpuYW1lLCAqdiwgKnUsICp3LCAqZnJlZV92YWx1ZSA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCi0Jd2hpbGUgKFB5RGljdF9OZXh0KHN5bWJvbHMsICZwb3MsICZuYW1lLCAmdikpIHsKLQkJbG9uZyBpLCBmbGFnczsKLQkJYXNzZXJ0KFB5SW50X0NoZWNrKHYpKTsKLQkJZmxhZ3MgPSBQeUludF9BU19MT05HKHYpOwotCQl3ID0gUHlEaWN0X0dldEl0ZW0oc2NvcGUsIG5hbWUpOwotCQlhc3NlcnQodyAmJiBQeUludF9DaGVjayh3KSk7Ci0JCWkgPSBQeUludF9BU19MT05HKHcpOwotCQlmbGFncyB8PSAoaSA8PCBTQ09QRV9PRkYpOwotCQl1ID0gUHlJbnRfRnJvbUxvbmcoZmxhZ3MpOwotCQlpZiAoIXUpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKFB5RGljdF9TZXRJdGVtKHN5bWJvbHMsIG5hbWUsIHUpIDwgMCkgewotCQkJUHlfREVDUkVGKHUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJUHlfREVDUkVGKHUpOwotCX0KLQotICAgICAgICBmcmVlX3ZhbHVlID0gUHlJbnRfRnJvbUxvbmcoRlJFRSA8PCBTQ09QRV9PRkYpOwotICAgICAgICBpZiAoIWZyZWVfdmFsdWUpCi0JCXJldHVybiAwOwotCi0gICAgICAgIC8qIGFkZCBhIGZyZWUgdmFyaWFibGUgd2hlbiBpdCdzIG9ubHkgdXNlIGlzIGZvciBjcmVhdGluZyBhIGNsb3N1cmUgKi8KLSAgICAgICAgcG9zID0gMDsKLQl3aGlsZSAoUHlEaWN0X05leHQoZnJlZSwgJnBvcywgJm5hbWUsICZ2KSkgewotCQlQeU9iamVjdCAqbyA9IFB5RGljdF9HZXRJdGVtKHN5bWJvbHMsIG5hbWUpOwotCi0JCWlmIChvKSB7Ci0JCQkvKiBJdCBjb3VsZCBiZSBhIGZyZWUgdmFyaWFibGUgaW4gYSBtZXRob2Qgb2YKLQkJCSAgIHRoZSBjbGFzcyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgbG9jYWwKLQkJCSAgIG9yIGdsb2JhbCBpbiB0aGUgY2xhc3Mgc2NvcGUuCi0JCQkqLwotCQkJaWYgIChjbGFzc2ZsYWcgJiYgCi0JCQkgICAgIFB5SW50X0FTX0xPTkcobykgJiAoREVGX0JPVU5EIHwgREVGX0dMT0JBTCkpIHsKLQkJCQlsb25nIGkgPSBQeUludF9BU19MT05HKG8pIHwgREVGX0ZSRUVfQ0xBU1M7Ci0JCQkJbyA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQkJCWlmICghbykgewotCQkJCQlQeV9ERUNSRUYoZnJlZV92YWx1ZSk7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQlpZiAoUHlEaWN0X1NldEl0ZW0oc3ltYm9scywgbmFtZSwgbykgPCAwKSB7Ci0JCQkJCVB5X0RFQ1JFRihvKTsKLQkJCQkJUHlfREVDUkVGKGZyZWVfdmFsdWUpOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKG8pOwotCQkJfQotCQkJLyogZWxzZSBpdCdzIG5vdCBmcmVlLCBwcm9iYWJseSBhIGNlbGwgKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghUHlEaWN0X0dldEl0ZW0oYm91bmQsIG5hbWUpKQotCQkJY29udGludWU7ICAgICAgIC8qIGl0J3MgYSBnbG9iYWwgKi8KLQotCQlpZiAoUHlEaWN0X1NldEl0ZW0oc3ltYm9scywgbmFtZSwgZnJlZV92YWx1ZSkgPCAwKSB7Ci0JCQlQeV9ERUNSRUYoZnJlZV92YWx1ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQorICAgIHdoaWxlIChQeURpY3RfTmV4dChzeW1ib2xzLCAmcG9zLCAmbmFtZSwgJnYpKSB7CisgICAgICAgIGxvbmcgaSwgZmxhZ3M7CisgICAgICAgIGFzc2VydChQeUludF9DaGVjayh2KSk7CisgICAgICAgIGZsYWdzID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgdyA9IFB5RGljdF9HZXRJdGVtKHNjb3BlLCBuYW1lKTsKKyAgICAgICAgYXNzZXJ0KHcgJiYgUHlJbnRfQ2hlY2sodykpOworICAgICAgICBpID0gUHlJbnRfQVNfTE9ORyh3KTsKKyAgICAgICAgZmxhZ3MgfD0gKGkgPDwgU0NPUEVfT0ZGKTsKKyAgICAgICAgdSA9IFB5SW50X0Zyb21Mb25nKGZsYWdzKTsKKyAgICAgICAgaWYgKCF1KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzeW1ib2xzLCBuYW1lLCB1KSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihmcmVlX3ZhbHVlKTsKLQlyZXR1cm4gMTsKLX0gICAKKyAgICAgICAgUHlfREVDUkVGKHUpOworICAgIH0KKworICAgIGZyZWVfdmFsdWUgPSBQeUludF9Gcm9tTG9uZyhGUkVFIDw8IFNDT1BFX09GRik7CisgICAgaWYgKCFmcmVlX3ZhbHVlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGFkZCBhIGZyZWUgdmFyaWFibGUgd2hlbiBpdCdzIG9ubHkgdXNlIGlzIGZvciBjcmVhdGluZyBhIGNsb3N1cmUgKi8KKyAgICBwb3MgPSAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChmcmVlLCAmcG9zLCAmbmFtZSwgJnYpKSB7CisgICAgICAgIFB5T2JqZWN0ICpvID0gUHlEaWN0X0dldEl0ZW0oc3ltYm9scywgbmFtZSk7CisKKyAgICAgICAgaWYgKG8pIHsKKyAgICAgICAgICAgIC8qIEl0IGNvdWxkIGJlIGEgZnJlZSB2YXJpYWJsZSBpbiBhIG1ldGhvZCBvZgorICAgICAgICAgICAgICAgdGhlIGNsYXNzIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBsb2NhbAorICAgICAgICAgICAgICAgb3IgZ2xvYmFsIGluIHRoZSBjbGFzcyBzY29wZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAgKGNsYXNzZmxhZyAmJgorICAgICAgICAgICAgICAgICBQeUludF9BU19MT05HKG8pICYgKERFRl9CT1VORCB8IERFRl9HTE9CQUwpKSB7CisgICAgICAgICAgICAgICAgbG9uZyBpID0gUHlJbnRfQVNfTE9ORyhvKSB8IERFRl9GUkVFX0NMQVNTOworICAgICAgICAgICAgICAgIG8gPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgICAgICAgICBpZiAoIW8pIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZyZWVfdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHN5bWJvbHMsIG5hbWUsIG8pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobyk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmcmVlX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGVsc2UgaXQncyBub3QgZnJlZSwgcHJvYmFibHkgYSBjZWxsICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5RGljdF9HZXRJdGVtKGJvdW5kLCBuYW1lKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAvKiBpdCdzIGEgZ2xvYmFsICovCisKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHN5bWJvbHMsIG5hbWUsIGZyZWVfdmFsdWUpIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZyZWVfdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKGZyZWVfdmFsdWUpOworICAgIHJldHVybiAxOworfQogCiAvKiBNYWtlIGZpbmFsIHN5bWJvbCB0YWJsZSBkZWNpc2lvbnMgZm9yIGJsb2NrIG9mIHN0ZS4KIApAQCAtNjEyLDE5OSArNjEyLDE5OSBAQAogKi8KIAogc3RhdGljIGludAotYW5hbHl6ZV9jaGlsZF9ibG9jayhQeVNURW50cnlPYmplY3QgKmVudHJ5LCBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpmcmVlLCAKLQkJICAgIFB5T2JqZWN0ICpnbG9iYWwsIFB5T2JqZWN0KiBjaGlsZF9mcmVlKTsKK2FuYWx5emVfY2hpbGRfYmxvY2soUHlTVEVudHJ5T2JqZWN0ICplbnRyeSwgUHlPYmplY3QgKmJvdW5kLCBQeU9iamVjdCAqZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmdsb2JhbCwgUHlPYmplY3QqIGNoaWxkX2ZyZWUpOwogCiBzdGF0aWMgaW50Ci1hbmFseXplX2Jsb2NrKFB5U1RFbnRyeU9iamVjdCAqc3RlLCBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpmcmVlLCAKLQkgICAgICBQeU9iamVjdCAqZ2xvYmFsKQorYW5hbHl6ZV9ibG9jayhQeVNURW50cnlPYmplY3QgKnN0ZSwgUHlPYmplY3QgKmJvdW5kLCBQeU9iamVjdCAqZnJlZSwKKyAgICAgICAgICAgICAgUHlPYmplY3QgKmdsb2JhbCkKIHsKLQlQeU9iamVjdCAqbmFtZSwgKnYsICpsb2NhbCA9IE5VTEwsICpzY29wZSA9IE5VTEw7Ci0JUHlPYmplY3QgKm5ld2JvdW5kID0gTlVMTCwgKm5ld2dsb2JhbCA9IE5VTEw7Ci0JUHlPYmplY3QgKm5ld2ZyZWUgPSBOVUxMLCAqYWxsZnJlZSA9IE5VTEw7Ci0JaW50IGksIHN1Y2Nlc3MgPSAwOwotCVB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeU9iamVjdCAqbmFtZSwgKnYsICpsb2NhbCA9IE5VTEwsICpzY29wZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5ld2JvdW5kID0gTlVMTCwgKm5ld2dsb2JhbCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5ld2ZyZWUgPSBOVUxMLCAqYWxsZnJlZSA9IE5VTEw7CisgICAgaW50IGksIHN1Y2Nlc3MgPSAwOworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAotCWxvY2FsID0gUHlEaWN0X05ldygpOyAgLyogY29sbGVjdCBuZXcgbmFtZXMgYm91bmQgaW4gYmxvY2sgKi8KLQlpZiAoIWxvY2FsKQotCQlnb3RvIGVycm9yOwotCXNjb3BlID0gUHlEaWN0X05ldygpOyAvKiBjb2xsZWN0IHNjb3BlcyBkZWZpbmVkIGZvciBlYWNoIG5hbWUgKi8KLQlpZiAoIXNjb3BlKQotCQlnb3RvIGVycm9yOworICAgIGxvY2FsID0gUHlEaWN0X05ldygpOyAgLyogY29sbGVjdCBuZXcgbmFtZXMgYm91bmQgaW4gYmxvY2sgKi8KKyAgICBpZiAoIWxvY2FsKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHNjb3BlID0gUHlEaWN0X05ldygpOyAvKiBjb2xsZWN0IHNjb3BlcyBkZWZpbmVkIGZvciBlYWNoIG5hbWUgKi8KKyAgICBpZiAoIXNjb3BlKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JLyogQWxsb2NhdGUgbmV3IGdsb2JhbCBhbmQgYm91bmQgdmFyaWFibGUgZGljdGlvbmFyaWVzLiAgVGhlc2UKLQkgICBkaWN0aW9uYXJpZXMgaG9sZCB0aGUgbmFtZXMgdmlzaWJsZSBpbiBuZXN0ZWQgYmxvY2tzLiAgRm9yCi0JICAgQ2xhc3NCbG9ja3MsIHRoZSBib3VuZCBhbmQgZ2xvYmFsIG5hbWVzIGFyZSBpbml0aWFsaXplZAotCSAgIGJlZm9yZSBhbmFseXppbmcgbmFtZXMsIGJlY2F1c2UgY2xhc3MgYmluZGluZ3MgYXJlbid0Ci0JICAgdmlzaWJsZSBpbiBtZXRob2RzLiAgRm9yIG90aGVyIGJsb2NrcywgdGhleSBhcmUgaW5pdGlhbGl6ZWQKLQkgICBhZnRlciBuYW1lcyBhcmUgYW5hbHl6ZWQuCi0JICovCisgICAgLyogQWxsb2NhdGUgbmV3IGdsb2JhbCBhbmQgYm91bmQgdmFyaWFibGUgZGljdGlvbmFyaWVzLiAgVGhlc2UKKyAgICAgICBkaWN0aW9uYXJpZXMgaG9sZCB0aGUgbmFtZXMgdmlzaWJsZSBpbiBuZXN0ZWQgYmxvY2tzLiAgRm9yCisgICAgICAgQ2xhc3NCbG9ja3MsIHRoZSBib3VuZCBhbmQgZ2xvYmFsIG5hbWVzIGFyZSBpbml0aWFsaXplZAorICAgICAgIGJlZm9yZSBhbmFseXppbmcgbmFtZXMsIGJlY2F1c2UgY2xhc3MgYmluZGluZ3MgYXJlbid0CisgICAgICAgdmlzaWJsZSBpbiBtZXRob2RzLiAgRm9yIG90aGVyIGJsb2NrcywgdGhleSBhcmUgaW5pdGlhbGl6ZWQKKyAgICAgICBhZnRlciBuYW1lcyBhcmUgYW5hbHl6ZWQuCisgICAgICovCiAKLQkvKiBUT0RPKGpoeWx0b24pOiBQYWNrYWdlIHRoZXNlIGRpY3RzIGluIGEgc3RydWN0IHNvIHRoYXQgd2UKLQkgICBjYW4gd3JpdGUgcmVhc29uYWJsZSBoZWxwZXIgZnVuY3Rpb25zPwotCSovCi0JbmV3Z2xvYmFsID0gUHlEaWN0X05ldygpOwotCWlmICghbmV3Z2xvYmFsKQotCQlnb3RvIGVycm9yOwotCW5ld2JvdW5kID0gUHlEaWN0X05ldygpOwotCWlmICghbmV3Ym91bmQpCi0JCWdvdG8gZXJyb3I7Ci0JbmV3ZnJlZSA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIW5ld2ZyZWUpCi0JCWdvdG8gZXJyb3I7CisgICAgLyogVE9ETyhqaHlsdG9uKTogUGFja2FnZSB0aGVzZSBkaWN0cyBpbiBhIHN0cnVjdCBzbyB0aGF0IHdlCisgICAgICAgY2FuIHdyaXRlIHJlYXNvbmFibGUgaGVscGVyIGZ1bmN0aW9ucz8KKyAgICAqLworICAgIG5ld2dsb2JhbCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIW5ld2dsb2JhbCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBuZXdib3VuZCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIW5ld2JvdW5kKQorICAgICAgICBnb3RvIGVycm9yOworICAgIG5ld2ZyZWUgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFuZXdmcmVlKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JaWYgKHN0ZS0+c3RlX3R5cGUgPT0gQ2xhc3NCbG9jaykgewotCQlpZiAoUHlEaWN0X1VwZGF0ZShuZXdnbG9iYWwsIGdsb2JhbCkgPCAwKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKGJvdW5kKQotCQkJaWYgKFB5RGljdF9VcGRhdGUobmV3Ym91bmQsIGJvdW5kKSA8IDApCi0JCQkJZ290byBlcnJvcjsKLQl9CisgICAgaWYgKHN0ZS0+c3RlX3R5cGUgPT0gQ2xhc3NCbG9jaykgeworICAgICAgICBpZiAoUHlEaWN0X1VwZGF0ZShuZXdnbG9iYWwsIGdsb2JhbCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGJvdW5kKQorICAgICAgICAgICAgaWYgKFB5RGljdF9VcGRhdGUobmV3Ym91bmQsIGJvdW5kKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQl3aGlsZSAoUHlEaWN0X05leHQoc3RlLT5zdGVfc3ltYm9scywgJnBvcywgJm5hbWUsICZ2KSkgewotCQlsb25nIGZsYWdzID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJaWYgKCFhbmFseXplX25hbWUoc3RlLCBzY29wZSwgbmFtZSwgZmxhZ3MsCi0JCQkJICBib3VuZCwgbG9jYWwsIGZyZWUsIGdsb2JhbCkpCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICB3aGlsZSAoUHlEaWN0X05leHQoc3RlLT5zdGVfc3ltYm9scywgJnBvcywgJm5hbWUsICZ2KSkgeworICAgICAgICBsb25nIGZsYWdzID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgaWYgKCFhbmFseXplX25hbWUoc3RlLCBzY29wZSwgbmFtZSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kLCBsb2NhbCwgZnJlZSwgZ2xvYmFsKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JaWYgKHN0ZS0+c3RlX3R5cGUgIT0gQ2xhc3NCbG9jaykgewotCQlpZiAoc3RlLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrKSB7Ci0JCQlpZiAoUHlEaWN0X1VwZGF0ZShuZXdib3VuZCwgbG9jYWwpIDwgMCkKLQkJCQlnb3RvIGVycm9yOwotCQl9Ci0JCWlmIChib3VuZCkgewotCQkJaWYgKFB5RGljdF9VcGRhdGUobmV3Ym91bmQsIGJvdW5kKSA8IDApCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCQlpZiAoUHlEaWN0X1VwZGF0ZShuZXdnbG9iYWwsIGdsb2JhbCkgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgaWYgKHN0ZS0+c3RlX3R5cGUgIT0gQ2xhc3NCbG9jaykgeworICAgICAgICBpZiAoc3RlLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrKSB7CisgICAgICAgICAgICBpZiAoUHlEaWN0X1VwZGF0ZShuZXdib3VuZCwgbG9jYWwpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChib3VuZCkgeworICAgICAgICAgICAgaWYgKFB5RGljdF9VcGRhdGUobmV3Ym91bmQsIGJvdW5kKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlEaWN0X1VwZGF0ZShuZXdnbG9iYWwsIGdsb2JhbCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBSZWN1cnNpdmVseSBjYWxsIGFuYWx5emVfYmxvY2soKSBvbiBlYWNoIGNoaWxkIGJsb2NrLgorICAgIC8qIFJlY3Vyc2l2ZWx5IGNhbGwgYW5hbHl6ZV9ibG9jaygpIG9uIGVhY2ggY2hpbGQgYmxvY2suCiAKLQkgICBuZXdib3VuZCwgbmV3Z2xvYmFsIG5vdyBjb250YWluIHRoZSBuYW1lcyB2aXNpYmxlIGluCi0JICAgbmVzdGVkIGJsb2Nrcy4gIFRoZSBmcmVlIHZhcmlhYmxlcyBpbiB0aGUgY2hpbGRyZW4gd2lsbAotCSAgIGJlIGNvbGxlY3RlZCBpbiBhbGxmcmVlLgotCSovCi0JYWxsZnJlZSA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIWFsbGZyZWUpIAotCQlnb3RvIGVycm9yOwotCWZvciAoaSA9IDA7IGkgPCBQeUxpc3RfR0VUX1NJWkUoc3RlLT5zdGVfY2hpbGRyZW4pOyArK2kpIHsKLQkJUHlPYmplY3QgKmMgPSBQeUxpc3RfR0VUX0lURU0oc3RlLT5zdGVfY2hpbGRyZW4sIGkpOwotCQlQeVNURW50cnlPYmplY3QqIGVudHJ5OwotCQlhc3NlcnQoYyAmJiBQeVNURW50cnlfQ2hlY2soYykpOwotCQllbnRyeSA9IChQeVNURW50cnlPYmplY3QqKWM7Ci0JCWlmICghYW5hbHl6ZV9jaGlsZF9ibG9jayhlbnRyeSwgbmV3Ym91bmQsIG5ld2ZyZWUsIG5ld2dsb2JhbCwKLQkJCQkJIGFsbGZyZWUpKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKGVudHJ5LT5zdGVfZnJlZSB8fCBlbnRyeS0+c3RlX2NoaWxkX2ZyZWUpCi0JCQlzdGUtPnN0ZV9jaGlsZF9mcmVlID0gMTsKLQl9CisgICAgICAgbmV3Ym91bmQsIG5ld2dsb2JhbCBub3cgY29udGFpbiB0aGUgbmFtZXMgdmlzaWJsZSBpbgorICAgICAgIG5lc3RlZCBibG9ja3MuICBUaGUgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIGNoaWxkcmVuIHdpbGwKKyAgICAgICBiZSBjb2xsZWN0ZWQgaW4gYWxsZnJlZS4KKyAgICAqLworICAgIGFsbGZyZWUgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFhbGxmcmVlKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGZvciAoaSA9IDA7IGkgPCBQeUxpc3RfR0VUX1NJWkUoc3RlLT5zdGVfY2hpbGRyZW4pOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKmMgPSBQeUxpc3RfR0VUX0lURU0oc3RlLT5zdGVfY2hpbGRyZW4sIGkpOworICAgICAgICBQeVNURW50cnlPYmplY3QqIGVudHJ5OworICAgICAgICBhc3NlcnQoYyAmJiBQeVNURW50cnlfQ2hlY2soYykpOworICAgICAgICBlbnRyeSA9IChQeVNURW50cnlPYmplY3QqKWM7CisgICAgICAgIGlmICghYW5hbHl6ZV9jaGlsZF9ibG9jayhlbnRyeSwgbmV3Ym91bmQsIG5ld2ZyZWUsIG5ld2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbGZyZWUpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGVudHJ5LT5zdGVfZnJlZSB8fCBlbnRyeS0+c3RlX2NoaWxkX2ZyZWUpCisgICAgICAgICAgICBzdGUtPnN0ZV9jaGlsZF9mcmVlID0gMTsKKyAgICB9CiAKLQlpZiAoUHlEaWN0X1VwZGF0ZShuZXdmcmVlLCBhbGxmcmVlKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JaWYgKHN0ZS0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jayAmJiAhYW5hbHl6ZV9jZWxscyhzY29wZSwgbmV3ZnJlZSkpCi0JCWdvdG8gZXJyb3I7Ci0JaWYgKCF1cGRhdGVfc3ltYm9scyhzdGUtPnN0ZV9zeW1ib2xzLCBzY29wZSwgYm91bmQsIG5ld2ZyZWUsCi0JCQkgICAgc3RlLT5zdGVfdHlwZSA9PSBDbGFzc0Jsb2NrKSkKLQkJZ290byBlcnJvcjsKLQlpZiAoIWNoZWNrX3Vub3B0aW1pemVkKHN0ZSkpCi0JCWdvdG8gZXJyb3I7CisgICAgaWYgKFB5RGljdF9VcGRhdGUobmV3ZnJlZSwgYWxsZnJlZSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmIChzdGUtPnN0ZV90eXBlID09IEZ1bmN0aW9uQmxvY2sgJiYgIWFuYWx5emVfY2VsbHMoc2NvcGUsIG5ld2ZyZWUpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmICghdXBkYXRlX3N5bWJvbHMoc3RlLT5zdGVfc3ltYm9scywgc2NvcGUsIGJvdW5kLCBuZXdmcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RlLT5zdGVfdHlwZSA9PSBDbGFzc0Jsb2NrKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoIWNoZWNrX3Vub3B0aW1pemVkKHN0ZSkpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlpZiAoUHlEaWN0X1VwZGF0ZShmcmVlLCBuZXdmcmVlKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0Jc3VjY2VzcyA9IDE7CisgICAgaWYgKFB5RGljdF9VcGRhdGUoZnJlZSwgbmV3ZnJlZSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHN1Y2Nlc3MgPSAxOwogIGVycm9yOgotCVB5X1hERUNSRUYobG9jYWwpOwotCVB5X1hERUNSRUYoc2NvcGUpOwotCVB5X1hERUNSRUYobmV3Ym91bmQpOwotCVB5X1hERUNSRUYobmV3Z2xvYmFsKTsKLQlQeV9YREVDUkVGKG5ld2ZyZWUpOwotCVB5X1hERUNSRUYoYWxsZnJlZSk7Ci0JaWYgKCFzdWNjZXNzKQotCQlhc3NlcnQoUHlFcnJfT2NjdXJyZWQoKSk7Ci0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgUHlfWERFQ1JFRihsb2NhbCk7CisgICAgUHlfWERFQ1JFRihzY29wZSk7CisgICAgUHlfWERFQ1JFRihuZXdib3VuZCk7CisgICAgUHlfWERFQ1JFRihuZXdnbG9iYWwpOworICAgIFB5X1hERUNSRUYobmV3ZnJlZSk7CisgICAgUHlfWERFQ1JFRihhbGxmcmVlKTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIGFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAogc3RhdGljIGludAotYW5hbHl6ZV9jaGlsZF9ibG9jayhQeVNURW50cnlPYmplY3QgKmVudHJ5LCBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpmcmVlLCAKLQkJICAgIFB5T2JqZWN0ICpnbG9iYWwsIFB5T2JqZWN0KiBjaGlsZF9mcmVlKQorYW5hbHl6ZV9jaGlsZF9ibG9jayhQeVNURW50cnlPYmplY3QgKmVudHJ5LCBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpmcmVlLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZ2xvYmFsLCBQeU9iamVjdCogY2hpbGRfZnJlZSkKIHsKLQlQeU9iamVjdCAqdGVtcF9ib3VuZCA9IE5VTEwsICp0ZW1wX2dsb2JhbCA9IE5VTEwsICp0ZW1wX2ZyZWUgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0ZW1wX2JvdW5kID0gTlVMTCwgKnRlbXBfZ2xvYmFsID0gTlVMTCwgKnRlbXBfZnJlZSA9IE5VTEw7CiAKLQkvKiBDb3B5IHRoZSBib3VuZCBhbmQgZ2xvYmFsIGRpY3Rpb25hcmllcy4KKyAgICAvKiBDb3B5IHRoZSBib3VuZCBhbmQgZ2xvYmFsIGRpY3Rpb25hcmllcy4KIAotCSAgIFRoZXNlIGRpY3Rpb25hcnkgYXJlIHVzZWQgYnkgYWxsIGJsb2NrcyBlbmNsb3NlZCBieSB0aGUKLQkgICBjdXJyZW50IGJsb2NrLiAgVGhlIGFuYWx5emVfYmxvY2soKSBjYWxsIG1vZGlmaWVzIHRoZXNlCi0JICAgZGljdGlvbmFyaWVzLgorICAgICAgIFRoZXNlIGRpY3Rpb25hcnkgYXJlIHVzZWQgYnkgYWxsIGJsb2NrcyBlbmNsb3NlZCBieSB0aGUKKyAgICAgICBjdXJyZW50IGJsb2NrLiAgVGhlIGFuYWx5emVfYmxvY2soKSBjYWxsIG1vZGlmaWVzIHRoZXNlCisgICAgICAgZGljdGlvbmFyaWVzLgogCi0JKi8KLQl0ZW1wX2JvdW5kID0gUHlEaWN0X05ldygpOwotCWlmICghdGVtcF9ib3VuZCkKLQkJZ290byBlcnJvcjsKLQlpZiAoUHlEaWN0X1VwZGF0ZSh0ZW1wX2JvdW5kLCBib3VuZCkgPCAwKQotCQlnb3RvIGVycm9yOwotCXRlbXBfZnJlZSA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIXRlbXBfZnJlZSkKLQkJZ290byBlcnJvcjsKLQlpZiAoUHlEaWN0X1VwZGF0ZSh0ZW1wX2ZyZWUsIGZyZWUpIDwgMCkKLQkJZ290byBlcnJvcjsKLQl0ZW1wX2dsb2JhbCA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIXRlbXBfZ2xvYmFsKQotCQlnb3RvIGVycm9yOwotCWlmIChQeURpY3RfVXBkYXRlKHRlbXBfZ2xvYmFsLCBnbG9iYWwpIDwgMCkKLQkJZ290byBlcnJvcjsKKyAgICAqLworICAgIHRlbXBfYm91bmQgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCF0ZW1wX2JvdW5kKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmIChQeURpY3RfVXBkYXRlKHRlbXBfYm91bmQsIGJvdW5kKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgdGVtcF9mcmVlID0gUHlEaWN0X05ldygpOworICAgIGlmICghdGVtcF9mcmVlKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmIChQeURpY3RfVXBkYXRlKHRlbXBfZnJlZSwgZnJlZSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHRlbXBfZ2xvYmFsID0gUHlEaWN0X05ldygpOworICAgIGlmICghdGVtcF9nbG9iYWwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKFB5RGljdF9VcGRhdGUodGVtcF9nbG9iYWwsIGdsb2JhbCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JaWYgKCFhbmFseXplX2Jsb2NrKGVudHJ5LCB0ZW1wX2JvdW5kLCB0ZW1wX2ZyZWUsIHRlbXBfZ2xvYmFsKSkKLQkJZ290byBlcnJvcjsKLQlpZiAoUHlEaWN0X1VwZGF0ZShjaGlsZF9mcmVlLCB0ZW1wX2ZyZWUpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYodGVtcF9ib3VuZCk7Ci0JUHlfREVDUkVGKHRlbXBfZnJlZSk7Ci0JUHlfREVDUkVGKHRlbXBfZ2xvYmFsKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIWFuYWx5emVfYmxvY2soZW50cnksIHRlbXBfYm91bmQsIHRlbXBfZnJlZSwgdGVtcF9nbG9iYWwpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmIChQeURpY3RfVXBkYXRlKGNoaWxkX2ZyZWUsIHRlbXBfZnJlZSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih0ZW1wX2JvdW5kKTsKKyAgICBQeV9ERUNSRUYodGVtcF9mcmVlKTsKKyAgICBQeV9ERUNSRUYodGVtcF9nbG9iYWwpOworICAgIHJldHVybiAxOwogIGVycm9yOgotCVB5X1hERUNSRUYodGVtcF9ib3VuZCk7Ci0JUHlfWERFQ1JFRih0ZW1wX2ZyZWUpOwotCVB5X1hERUNSRUYodGVtcF9nbG9iYWwpOwotCXJldHVybiAwOworICAgIFB5X1hERUNSRUYodGVtcF9ib3VuZCk7CisgICAgUHlfWERFQ1JFRih0ZW1wX2ZyZWUpOworICAgIFB5X1hERUNSRUYodGVtcF9nbG9iYWwpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBzeW10YWJsZV9hbmFseXplKHN0cnVjdCBzeW10YWJsZSAqc3QpCiB7Ci0JUHlPYmplY3QgKmZyZWUsICpnbG9iYWw7Ci0JaW50IHI7CisgICAgUHlPYmplY3QgKmZyZWUsICpnbG9iYWw7CisgICAgaW50IHI7CiAKLQlmcmVlID0gUHlEaWN0X05ldygpOwotCWlmICghZnJlZSkKLQkgICAgcmV0dXJuIDA7Ci0JZ2xvYmFsID0gUHlEaWN0X05ldygpOwotCWlmICghZ2xvYmFsKSB7Ci0JICAgIFB5X0RFQ1JFRihmcmVlKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCXIgPSBhbmFseXplX2Jsb2NrKHN0LT5zdF90b3AsIE5VTEwsIGZyZWUsIGdsb2JhbCk7Ci0JUHlfREVDUkVGKGZyZWUpOwotCVB5X0RFQ1JFRihnbG9iYWwpOwotCXJldHVybiByOworICAgIGZyZWUgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFmcmVlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBnbG9iYWwgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFnbG9iYWwpIHsKKyAgICAgICAgUHlfREVDUkVGKGZyZWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgciA9IGFuYWx5emVfYmxvY2soc3QtPnN0X3RvcCwgTlVMTCwgZnJlZSwgZ2xvYmFsKTsKKyAgICBQeV9ERUNSRUYoZnJlZSk7CisgICAgUHlfREVDUkVGKGdsb2JhbCk7CisgICAgcmV0dXJuIHI7CiB9CiAKIAogc3RhdGljIGludAogc3ltdGFibGVfd2FybihzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBjaGFyICptc2csIGludCBsaW5lbm8pCiB7Ci0JaWYgKFB5RXJyX1dhcm5FeHBsaWNpdChQeUV4Y19TeW50YXhXYXJuaW5nLCBtc2csIHN0LT5zdF9maWxlbmFtZSwKLQkJCSAgICAgICBsaW5lbm8sIE5VTEwsIE5VTEwpIDwgMCkJewotCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeW50YXhXYXJuaW5nKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLCBtc2cpOwotCQkJUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLCAKLQkJCQkJICAgICBzdC0+c3RfY3VyLT5zdGVfbGluZW5vKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKFB5RXJyX1dhcm5FeHBsaWNpdChQeUV4Y19TeW50YXhXYXJuaW5nLCBtc2csIHN0LT5zdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgTlVMTCwgTlVMTCkgPCAwKSAgICAgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeW50YXhXYXJuaW5nKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLCBtc2cpOworICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX2xpbmVubyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiAvKiBzeW10YWJsZV9lbnRlcl9ibG9jaygpIGdldHMgYSByZWZlcmVuY2UgdmlhIHN0ZV9uZXcuCkBAIC04MTUsNzM5ICs4MTUsNzM5IEBACiBzdGF0aWMgaW50CiBzeW10YWJsZV9leGl0X2Jsb2NrKHN0cnVjdCBzeW10YWJsZSAqc3QsIHZvaWQgKmFzdCkKIHsKLQlQeV9zc2l6ZV90IGVuZDsKKyAgICBQeV9zc2l6ZV90IGVuZDsKIAotCVB5X0NMRUFSKHN0LT5zdF9jdXIpOwotCWVuZCA9IFB5TGlzdF9HRVRfU0laRShzdC0+c3Rfc3RhY2spIC0gMTsKLQlpZiAoZW5kID49IDApIHsKLQkJc3QtPnN0X2N1ciA9IChQeVNURW50cnlPYmplY3QgKilQeUxpc3RfR0VUX0lURU0oc3QtPnN0X3N0YWNrLCAKLQkJCQkJCQkJZW5kKTsKLQkJaWYgKHN0LT5zdF9jdXIgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCQlQeV9JTkNSRUYoc3QtPnN0X2N1cik7Ci0JCWlmIChQeVNlcXVlbmNlX0RlbEl0ZW0oc3QtPnN0X3N0YWNrLCBlbmQpIDwgMCkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICBQeV9DTEVBUihzdC0+c3RfY3VyKTsKKyAgICBlbmQgPSBQeUxpc3RfR0VUX1NJWkUoc3QtPnN0X3N0YWNrKSAtIDE7CisgICAgaWYgKGVuZCA+PSAwKSB7CisgICAgICAgIHN0LT5zdF9jdXIgPSAoUHlTVEVudHJ5T2JqZWN0ICopUHlMaXN0X0dFVF9JVEVNKHN0LT5zdF9zdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKTsKKyAgICAgICAgaWYgKHN0LT5zdF9jdXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBQeV9JTkNSRUYoc3QtPnN0X2N1cik7CisgICAgICAgIGlmIChQeVNlcXVlbmNlX0RlbEl0ZW0oc3QtPnN0X3N0YWNrLCBlbmQpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAotc3ltdGFibGVfZW50ZXJfYmxvY2soc3RydWN0IHN5bXRhYmxlICpzdCwgaWRlbnRpZmllciBuYW1lLCBfUHlfYmxvY2tfdHkgYmxvY2ssIAotCQkgICAgIHZvaWQgKmFzdCwgaW50IGxpbmVubykKK3N5bXRhYmxlX2VudGVyX2Jsb2NrKHN0cnVjdCBzeW10YWJsZSAqc3QsIGlkZW50aWZpZXIgbmFtZSwgX1B5X2Jsb2NrX3R5IGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXN0LCBpbnQgbGluZW5vKQogewotCVB5U1RFbnRyeU9iamVjdCAqcHJldiA9IE5VTEw7CisgICAgUHlTVEVudHJ5T2JqZWN0ICpwcmV2ID0gTlVMTDsKIAotCWlmIChzdC0+c3RfY3VyKSB7Ci0JCXByZXYgPSBzdC0+c3RfY3VyOwotCQlpZiAoUHlMaXN0X0FwcGVuZChzdC0+c3Rfc3RhY2ssIChQeU9iamVjdCAqKXN0LT5zdF9jdXIpIDwgMCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJUHlfREVDUkVGKHN0LT5zdF9jdXIpOwotCX0KLQlzdC0+c3RfY3VyID0gc3RlX25ldyhzdCwgbmFtZSwgYmxvY2ssIGFzdCwgbGluZW5vKTsKLQlpZiAoc3QtPnN0X2N1ciA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlpZiAobmFtZSA9PSBHRVRfSURFTlRJRklFUih0b3ApKQotCQlzdC0+c3RfZ2xvYmFsID0gc3QtPnN0X2N1ci0+c3RlX3N5bWJvbHM7Ci0JaWYgKHByZXYpIHsKLQkJaWYgKFB5TGlzdF9BcHBlbmQocHJldi0+c3RlX2NoaWxkcmVuLCAKLQkJCQkgIChQeU9iamVjdCAqKXN0LT5zdF9jdXIpIDwgMCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKHN0LT5zdF9jdXIpIHsKKyAgICAgICAgcHJldiA9IHN0LT5zdF9jdXI7CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHN0LT5zdF9zdGFjaywgKFB5T2JqZWN0ICopc3QtPnN0X2N1cikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoc3QtPnN0X2N1cik7CisgICAgfQorICAgIHN0LT5zdF9jdXIgPSBzdGVfbmV3KHN0LCBuYW1lLCBibG9jaywgYXN0LCBsaW5lbm8pOworICAgIGlmIChzdC0+c3RfY3VyID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChuYW1lID09IEdFVF9JREVOVElGSUVSKHRvcCkpCisgICAgICAgIHN0LT5zdF9nbG9iYWwgPSBzdC0+c3RfY3VyLT5zdGVfc3ltYm9sczsKKyAgICBpZiAocHJldikgeworICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChwcmV2LT5zdGVfY2hpbGRyZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXN0LT5zdF9jdXIpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBsb25nCiBzeW10YWJsZV9sb29rdXAoc3RydWN0IHN5bXRhYmxlICpzdCwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKm87Ci0JUHlPYmplY3QgKm1hbmdsZWQgPSBfUHlfTWFuZ2xlKHN0LT5zdF9wcml2YXRlLCBuYW1lKTsKLQlpZiAoIW1hbmdsZWQpCi0JCXJldHVybiAwOwotCW8gPSBQeURpY3RfR2V0SXRlbShzdC0+c3RfY3VyLT5zdGVfc3ltYm9scywgbWFuZ2xlZCk7Ci0JUHlfREVDUkVGKG1hbmdsZWQpOwotCWlmICghbykKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIFB5SW50X0FzTG9uZyhvKTsKKyAgICBQeU9iamVjdCAqbzsKKyAgICBQeU9iamVjdCAqbWFuZ2xlZCA9IF9QeV9NYW5nbGUoc3QtPnN0X3ByaXZhdGUsIG5hbWUpOworICAgIGlmICghbWFuZ2xlZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbyA9IFB5RGljdF9HZXRJdGVtKHN0LT5zdF9jdXItPnN0ZV9zeW1ib2xzLCBtYW5nbGVkKTsKKyAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgaWYgKCFvKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gUHlJbnRfQXNMb25nKG8pOwogfQogCiBzdGF0aWMgaW50Ci1zeW10YWJsZV9hZGRfZGVmKHN0cnVjdCBzeW10YWJsZSAqc3QsIFB5T2JqZWN0ICpuYW1lLCBpbnQgZmxhZykgCitzeW10YWJsZV9hZGRfZGVmKHN0cnVjdCBzeW10YWJsZSAqc3QsIFB5T2JqZWN0ICpuYW1lLCBpbnQgZmxhZykKIHsKLQlQeU9iamVjdCAqbzsKLQlQeU9iamVjdCAqZGljdDsKLQlsb25nIHZhbDsKLQlQeU9iamVjdCAqbWFuZ2xlZCA9IF9QeV9NYW5nbGUoc3QtPnN0X3ByaXZhdGUsIG5hbWUpOworICAgIFB5T2JqZWN0ICpvOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIGxvbmcgdmFsOworICAgIFB5T2JqZWN0ICptYW5nbGVkID0gX1B5X01hbmdsZShzdC0+c3RfcHJpdmF0ZSwgbmFtZSk7CiAKLQlpZiAoIW1hbmdsZWQpCi0JCXJldHVybiAwOwotCWRpY3QgPSBzdC0+c3RfY3VyLT5zdGVfc3ltYm9sczsKLQlpZiAoKG8gPSBQeURpY3RfR2V0SXRlbShkaWN0LCBtYW5nbGVkKSkpIHsKLQkgICAgdmFsID0gUHlJbnRfQVNfTE9ORyhvKTsKLQkgICAgaWYgKChmbGFnICYgREVGX1BBUkFNKSAmJiAodmFsICYgREVGX1BBUkFNKSkgewotCQkgICAgLyogSXMgaXQgYmV0dGVyIHRvIHVzZSAnbWFuZ2xlZCcgb3IgJ25hbWUnIGhlcmU/ICovCi0JCSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsIERVUExJQ0FURV9BUkdVTUVOVCwKLQkJCQkgUHlTdHJpbmdfQXNTdHJpbmcobmFtZSkpOwotCQkgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAotCQkJCSAgICAgICBzdC0+c3RfY3VyLT5zdGVfbGluZW5vKTsKLQkJICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgICAgdmFsIHw9IGZsYWc7Ci0JfSBlbHNlCi0JICAgIHZhbCA9IGZsYWc7Ci0JbyA9IFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgaWYgKCFtYW5nbGVkKQorICAgICAgICByZXR1cm4gMDsKKyAgICBkaWN0ID0gc3QtPnN0X2N1ci0+c3RlX3N5bWJvbHM7CisgICAgaWYgKChvID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgbWFuZ2xlZCkpKSB7CisgICAgICAgIHZhbCA9IFB5SW50X0FTX0xPTkcobyk7CisgICAgICAgIGlmICgoZmxhZyAmIERFRl9QQVJBTSkgJiYgKHZhbCAmIERFRl9QQVJBTSkpIHsKKyAgICAgICAgICAgIC8qIElzIGl0IGJldHRlciB0byB1c2UgJ21hbmdsZWQnIG9yICduYW1lJyBoZXJlPyAqLworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLCBEVVBMSUNBVEVfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcobmFtZSkpOworICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5zdF9jdXItPnN0ZV9saW5lbm8pOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICB2YWwgfD0gZmxhZzsKKyAgICB9IGVsc2UKKyAgICAgICAgdmFsID0gZmxhZzsKKyAgICBvID0gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBtYW5nbGVkLCBvKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKG8pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeV9ERUNSRUYobyk7CisKKyAgICBpZiAoZmxhZyAmIERFRl9QQVJBTSkgeworICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChzdC0+c3RfY3VyLT5zdGVfdmFybmFtZXMsIG1hbmdsZWQpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfSBlbHNlICAgICAgaWYgKGZsYWcgJiBERUZfR0xPQkFMKSB7CisgICAgICAgIC8qIFhYWCBuZWVkIHRvIHVwZGF0ZSBERUZfR0xPQkFMIGZvciBvdGhlciBmbGFncyB0b287CisgICAgICAgICAgIHBlcmhhcHMgb25seSBERUZfRlJFRV9HTE9CQUwgKi8KKyAgICAgICAgdmFsID0gZmxhZzsKKyAgICAgICAgaWYgKChvID0gUHlEaWN0X0dldEl0ZW0oc3QtPnN0X2dsb2JhbCwgbWFuZ2xlZCkpKSB7CisgICAgICAgICAgICB2YWwgfD0gUHlJbnRfQVNfTE9ORyhvKTsKKyAgICAgICAgfQorICAgICAgICBvID0gUHlJbnRfRnJvbUxvbmcodmFsKTsKICAgICAgICAgaWYgKG8gPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcjsKLQlpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgbWFuZ2xlZCwgbykgPCAwKSB7Ci0JCVB5X0RFQ1JFRihvKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JUHlfREVDUkVGKG8pOwotCi0JaWYgKGZsYWcgJiBERUZfUEFSQU0pIHsKLQkJaWYgKFB5TGlzdF9BcHBlbmQoc3QtPnN0X2N1ci0+c3RlX3Zhcm5hbWVzLCBtYW5nbGVkKSA8IDApCi0JCQlnb3RvIGVycm9yOwotCX0gZWxzZQlpZiAoZmxhZyAmIERFRl9HTE9CQUwpIHsKLQkJLyogWFhYIG5lZWQgdG8gdXBkYXRlIERFRl9HTE9CQUwgZm9yIG90aGVyIGZsYWdzIHRvbzsKLQkJICAgcGVyaGFwcyBvbmx5IERFRl9GUkVFX0dMT0JBTCAqLwotCQl2YWwgPSBmbGFnOwotCQlpZiAoKG8gPSBQeURpY3RfR2V0SXRlbShzdC0+c3RfZ2xvYmFsLCBtYW5nbGVkKSkpIHsKLQkJCXZhbCB8PSBQeUludF9BU19MT05HKG8pOwotCQl9Ci0JCW8gPSBQeUludF9Gcm9tTG9uZyh2YWwpOwotCQlpZiAobyA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKFB5RGljdF9TZXRJdGVtKHN0LT5zdF9nbG9iYWwsIG1hbmdsZWQsIG8pIDwgMCkgewotCQkJUHlfREVDUkVGKG8pOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlQeV9ERUNSRUYobyk7Ci0JfQotCVB5X0RFQ1JFRihtYW5nbGVkKTsKLQlyZXR1cm4gMTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzdC0+c3RfZ2xvYmFsLCBtYW5nbGVkLCBvKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKG8pOworICAgIH0KKyAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgcmV0dXJuIDE7CiAKIGVycm9yOgotCVB5X0RFQ1JFRihtYW5nbGVkKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFZJU0lULCBWSVNJVF9TRVEgYW5kIFZJU1RfU0VRX1RBSUwgdGFrZSBhbiBBU0RMIHR5cGUgYXMgdGhlaXIgc2Vjb25kIGFyZ3VtZW50LgogICAgVGhleSB1c2UgdGhlIEFTREwgbmFtZSB0byBzeW50aGVzaXplIHRoZSBuYW1lIG9mIHRoZSBDIHR5cGUgYW5kIHRoZSB2aXNpdAotICAgZnVuY3Rpb24uIAotICAgCisgICBmdW5jdGlvbi4KKwogICAgVklTSVRfU0VRX1RBSUwgcGVybWl0cyB0aGUgc3RhcnQgb2YgYW4gQVNETCBzZXF1ZW5jZSB0byBiZSBza2lwcGVkLCB3aGljaCBpcwogICAgdXNlZnVsIGlmIHRoZSBmaXJzdCBub2RlIGluIHRoZSBzZXF1ZW5jZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudC4KICovCiAKICNkZWZpbmUgVklTSVQoU1QsIFRZUEUsIFYpIFwKLQlpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIChWKSkpIFwKLQkJcmV0dXJuIDA7IAorICAgIGlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgKFYpKSkgXAorICAgICAgICByZXR1cm4gMDsKIAogI2RlZmluZSBWSVNJVF9JTl9CTE9DSyhTVCwgVFlQRSwgViwgUykgXAotCWlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgKFYpKSkgeyBcCi0JCXN5bXRhYmxlX2V4aXRfYmxvY2soKFNUKSwgKFMpKTsgXAotCQlyZXR1cm4gMDsgXAotCX0KKyAgICBpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIChWKSkpIHsgXAorICAgICAgICBzeW10YWJsZV9leGl0X2Jsb2NrKChTVCksIChTKSk7IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9CiAKICNkZWZpbmUgVklTSVRfU0VRKFNULCBUWVBFLCBTRVEpIHsgXAotCWludCBpOyBcCi0JYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKLQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgeyBcCi0JCVRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAotCQlpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIGVsdCkpIFwKLQkJCXJldHVybiAwOyBcCi0JfSBcCisgICAgaW50IGk7IFwKKyAgICBhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAorICAgIGZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7IFwKKyAgICAgICAgVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCisgICAgICAgIGlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgZWx0KSkgXAorICAgICAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKIH0KIAogI2RlZmluZSBWSVNJVF9TRVFfSU5fQkxPQ0soU1QsIFRZUEUsIFNFUSwgUykgeyBcCi0JaW50IGk7IFwKLQlhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAotCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7IFwKLQkJVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCi0JCWlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgZWx0KSkgeyBcCi0JCQlzeW10YWJsZV9leGl0X2Jsb2NrKChTVCksIChTKSk7IFwKLQkJCXJldHVybiAwOyBcCi0JCX0gXAotCX0gXAorICAgIGludCBpOyBcCisgICAgYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgeyBcCisgICAgICAgIFRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAorICAgICAgICBpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIGVsdCkpIHsgXAorICAgICAgICAgICAgc3ltdGFibGVfZXhpdF9ibG9jaygoU1QpLCAoUykpOyBcCisgICAgICAgICAgICByZXR1cm4gMDsgXAorICAgICAgICB9IFwKKyAgICB9IFwKIH0KIAogI2RlZmluZSBWSVNJVF9TRVFfVEFJTChTVCwgVFlQRSwgU0VRLCBTVEFSVCkgeyBcCi0JaW50IGk7IFwKLQlhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAotCWZvciAoaSA9IChTVEFSVCk7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7IFwKLQkJVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCi0JCWlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgZWx0KSkgXAotCQkJcmV0dXJuIDA7IFwKLQl9IFwKKyAgICBpbnQgaTsgXAorICAgIGFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCisgICAgZm9yIChpID0gKFNUQVJUKTsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAorICAgICAgICBUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKKyAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSBcCisgICAgICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAogfQogCiAjZGVmaW5lIFZJU0lUX1NFUV9UQUlMX0lOX0JMT0NLKFNULCBUWVBFLCBTRVEsIFNUQVJULCBTKSB7IFwKLQlpbnQgaTsgXAotCWFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCi0JZm9yIChpID0gKFNUQVJUKTsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAotCQlUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKLQkJaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSB7IFwKLQkJCXN5bXRhYmxlX2V4aXRfYmxvY2soKFNUKSwgKFMpKTsgXAotCQkJcmV0dXJuIDA7IFwKLQkJfSBcCi0JfSBcCisgICAgaW50IGk7IFwKKyAgICBhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAorICAgIGZvciAoaSA9IChTVEFSVCk7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7IFwKKyAgICAgICAgVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCisgICAgICAgIGlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgZWx0KSkgeyBcCisgICAgICAgICAgICBzeW10YWJsZV9leGl0X2Jsb2NrKChTVCksIChTKSk7IFwKKyAgICAgICAgICAgIHJldHVybiAwOyBcCisgICAgICAgIH0gXAorICAgIH0gXAogfQogCiBzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9zdG10KHN0cnVjdCBzeW10YWJsZSAqc3QsIHN0bXRfdHkgcykKIHsKLQlzd2l0Y2ggKHMtPmtpbmQpIHsKLSAgICAgICAgY2FzZSBGdW5jdGlvbkRlZl9raW5kOgotCQlpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIHMtPnYuRnVuY3Rpb25EZWYubmFtZSwgREVGX0xPQ0FMKSkKLQkJCXJldHVybiAwOwotCQlpZiAocy0+di5GdW5jdGlvbkRlZi5hcmdzLT5kZWZhdWx0cykKLQkJCVZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5GdW5jdGlvbkRlZi5hcmdzLT5kZWZhdWx0cyk7Ci0JCWlmIChzLT52LkZ1bmN0aW9uRGVmLmRlY29yYXRvcl9saXN0KQotCQkJVklTSVRfU0VRKHN0LCBleHByLCBzLT52LkZ1bmN0aW9uRGVmLmRlY29yYXRvcl9saXN0KTsKLQkJaWYgKCFzeW10YWJsZV9lbnRlcl9ibG9jayhzdCwgcy0+di5GdW5jdGlvbkRlZi5uYW1lLCAKLQkJCQkJICBGdW5jdGlvbkJsb2NrLCAodm9pZCAqKXMsIHMtPmxpbmVubykpCi0JCQlyZXR1cm4gMDsKLQkJVklTSVRfSU5fQkxPQ0soc3QsIGFyZ3VtZW50cywgcy0+di5GdW5jdGlvbkRlZi5hcmdzLCBzKTsKLQkJVklTSVRfU0VRX0lOX0JMT0NLKHN0LCBzdG10LCBzLT52LkZ1bmN0aW9uRGVmLmJvZHksIHMpOwotCQlpZiAoIXN5bXRhYmxlX2V4aXRfYmxvY2soc3QsIHMpKQotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIENsYXNzRGVmX2tpbmQ6IHsKLQkJUHlPYmplY3QgKnRtcDsKLQkJaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBzLT52LkNsYXNzRGVmLm5hbWUsIERFRl9MT0NBTCkpCi0JCQlyZXR1cm4gMDsKLQkJVklTSVRfU0VRKHN0LCBleHByLCBzLT52LkNsYXNzRGVmLmJhc2VzKTsKLQkJaWYgKHMtPnYuQ2xhc3NEZWYuZGVjb3JhdG9yX2xpc3QpCi0JCQlWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuQ2xhc3NEZWYuZGVjb3JhdG9yX2xpc3QpOwotCQlpZiAoIXN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0LCBzLT52LkNsYXNzRGVmLm5hbWUsIENsYXNzQmxvY2ssIAotCQkJCQkgICh2b2lkICopcywgcy0+bGluZW5vKSkKLQkJCXJldHVybiAwOwotCQl0bXAgPSBzdC0+c3RfcHJpdmF0ZTsKLQkJc3QtPnN0X3ByaXZhdGUgPSBzLT52LkNsYXNzRGVmLm5hbWU7Ci0JCVZJU0lUX1NFUV9JTl9CTE9DSyhzdCwgc3RtdCwgcy0+di5DbGFzc0RlZi5ib2R5LCBzKTsKLQkJc3QtPnN0X3ByaXZhdGUgPSB0bXA7Ci0JCWlmICghc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgcykpCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0JfQotICAgICAgICBjYXNlIFJldHVybl9raW5kOgotCQlpZiAocy0+di5SZXR1cm4udmFsdWUpIHsKLQkJCVZJU0lUKHN0LCBleHByLCBzLT52LlJldHVybi52YWx1ZSk7Ci0JCQlzdC0+c3RfY3VyLT5zdGVfcmV0dXJuc192YWx1ZSA9IDE7Ci0JCQlpZiAoc3QtPnN0X2N1ci0+c3RlX2dlbmVyYXRvcikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKLQkJCQkJUkVUVVJOX1ZBTF9JTl9HRU5FUkFUT1IpOwotCQkJICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbihzdC0+c3RfZmlsZW5hbWUsCi0JCQkJICAgICAgICAgICAgIHMtPmxpbmVubyk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgRGVsZXRlX2tpbmQ6Ci0JCVZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5EZWxldGUudGFyZ2V0cyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEFzc2lnbl9raW5kOgotCQlWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuQXNzaWduLnRhcmdldHMpOwotCQlWSVNJVChzdCwgZXhwciwgcy0+di5Bc3NpZ24udmFsdWUpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBBdWdBc3NpZ25fa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuQXVnQXNzaWduLnRhcmdldCk7Ci0JCVZJU0lUKHN0LCBleHByLCBzLT52LkF1Z0Fzc2lnbi52YWx1ZSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFByaW50X2tpbmQ6Ci0JCWlmIChzLT52LlByaW50LmRlc3QpCi0JCQlWSVNJVChzdCwgZXhwciwgcy0+di5QcmludC5kZXN0KTsKLQkJVklTSVRfU0VRKHN0LCBleHByLCBzLT52LlByaW50LnZhbHVlcyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEZvcl9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgcy0+di5Gb3IudGFyZ2V0KTsKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuRm9yLml0ZXIpOwotCQlWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuRm9yLmJvZHkpOwotCQlpZiAocy0+di5Gb3Iub3JlbHNlKQotCQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LkZvci5vcmVsc2UpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBXaGlsZV9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgcy0+di5XaGlsZS50ZXN0KTsKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LldoaWxlLmJvZHkpOwotCQlpZiAocy0+di5XaGlsZS5vcmVsc2UpCi0JCQlWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuV2hpbGUub3JlbHNlKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgSWZfa2luZDoKLQkJLyogWFhYIGlmIDA6IGFuZCBsb29rdXBfeWllbGQoKSBoYWNrcyAqLwotCQlWSVNJVChzdCwgZXhwciwgcy0+di5JZi50ZXN0KTsKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LklmLmJvZHkpOwotCQlpZiAocy0+di5JZi5vcmVsc2UpCi0JCQlWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuSWYub3JlbHNlKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgUmFpc2Vfa2luZDoKLQkJaWYgKHMtPnYuUmFpc2UudHlwZSkgewotCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuUmFpc2UudHlwZSk7Ci0JCQlpZiAocy0+di5SYWlzZS5pbnN0KSB7Ci0JCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuUmFpc2UuaW5zdCk7Ci0JCQkJaWYgKHMtPnYuUmFpc2UudGJhY2spCi0JCQkJCVZJU0lUKHN0LCBleHByLCBzLT52LlJhaXNlLnRiYWNrKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLSAgICAgICAgY2FzZSBUcnlFeGNlcHRfa2luZDoKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LlRyeUV4Y2VwdC5ib2R5KTsKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LlRyeUV4Y2VwdC5vcmVsc2UpOwotCQlWSVNJVF9TRVEoc3QsIGV4Y2VwdGhhbmRsZXIsIHMtPnYuVHJ5RXhjZXB0LmhhbmRsZXJzKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgVHJ5RmluYWxseV9raW5kOgotCQlWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuVHJ5RmluYWxseS5ib2R5KTsKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LlRyeUZpbmFsbHkuZmluYWxib2R5KTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgQXNzZXJ0X2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBzLT52LkFzc2VydC50ZXN0KTsKLQkJaWYgKHMtPnYuQXNzZXJ0Lm1zZykKLQkJCVZJU0lUKHN0LCBleHByLCBzLT52LkFzc2VydC5tc2cpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBJbXBvcnRfa2luZDoKLQkJVklTSVRfU0VRKHN0LCBhbGlhcywgcy0+di5JbXBvcnQubmFtZXMpOwotCQkvKiBYWFggRG9uJ3QgaGF2ZSB0aGUgbGluZW5vIGF2YWlsYWJsZSBpbnNpZGUKLQkJICAgdmlzaXRfYWxpYXMgKi8KLQkJaWYgKHN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCAmJiAhc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8pCi0JCQlzdC0+c3RfY3VyLT5zdGVfb3B0X2xpbmVubyA9IHMtPmxpbmVubzsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgSW1wb3J0RnJvbV9raW5kOgotCQlWSVNJVF9TRVEoc3QsIGFsaWFzLCBzLT52LkltcG9ydEZyb20ubmFtZXMpOwotCQkvKiBYWFggRG9uJ3QgaGF2ZSB0aGUgbGluZW5vIGF2YWlsYWJsZSBpbnNpZGUKLQkJICAgdmlzaXRfYWxpYXMgKi8KLQkJaWYgKHN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCAmJiAhc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8pCi0JCQlzdC0+c3RfY3VyLT5zdGVfb3B0X2xpbmVubyA9IHMtPmxpbmVubzsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgRXhlY19raW5kOgotCQlWSVNJVChzdCwgZXhwciwgcy0+di5FeGVjLmJvZHkpOwotCQlpZiAoIXN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vKQotCQkJc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8gPSBzLT5saW5lbm87Ci0JCWlmIChzLT52LkV4ZWMuZ2xvYmFscykgewotCQkJc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkIHw9IE9QVF9FWEVDOwotCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuRXhlYy5nbG9iYWxzKTsKLQkJCWlmIChzLT52LkV4ZWMubG9jYWxzKSAKLQkJCQlWSVNJVChzdCwgZXhwciwgcy0+di5FeGVjLmxvY2Fscyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgfD0gT1BUX0JBUkVfRVhFQzsKLQkJfQotCQlicmVhazsKLSAgICAgICAgY2FzZSBHbG9iYWxfa2luZDogewotCQlpbnQgaTsKLQkJYXNkbF9zZXEgKnNlcSA9IHMtPnYuR2xvYmFsLm5hbWVzOwotCQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgewotCQkJaWRlbnRpZmllciBuYW1lID0gKGlkZW50aWZpZXIpYXNkbF9zZXFfR0VUKHNlcSwgaSk7Ci0JCQljaGFyICpjX25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZSk7Ci0JCQlsb25nIGN1ciA9IHN5bXRhYmxlX2xvb2t1cChzdCwgbmFtZSk7Ci0JCQlpZiAoY3VyIDwgMCkKLQkJCQlyZXR1cm4gMDsKLQkJCWlmIChjdXIgJiAoREVGX0xPQ0FMIHwgVVNFKSkgewotCQkJCWNoYXIgYnVmWzI1Nl07Ci0JCQkJaWYgKGN1ciAmIERFRl9MT0NBTCkgCi0JCQkJCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCQkJCSAgICAgIEdMT0JBTF9BRlRFUl9BU1NJR04sCi0JCQkJCQkgICAgICBjX25hbWUpOwotCQkJCWVsc2UKLQkJCQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJCQkJICAgICAgR0xPQkFMX0FGVEVSX1VTRSwKLQkJCQkJCSAgICAgIGNfbmFtZSk7Ci0JCQkJaWYgKCFzeW10YWJsZV93YXJuKHN0LCBidWYsIHMtPmxpbmVubykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQkJCX0KLQkJCWlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgbmFtZSwgREVGX0dMT0JBTCkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotICAgICAgICBjYXNlIEV4cHJfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuRXhwci52YWx1ZSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFBhc3Nfa2luZDoKLSAgICAgICAgY2FzZSBCcmVha19raW5kOgotICAgICAgICBjYXNlIENvbnRpbnVlX2tpbmQ6Ci0JCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLwotCQlicmVhazsKLSAgICAgICAgY2FzZSBXaXRoX2tpbmQ6Ci0gICAgICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuV2l0aC5jb250ZXh0X2V4cHIpOwotICAgICAgICAgICAgICAgIGlmIChzLT52LldpdGgub3B0aW9uYWxfdmFycykgewotICAgICAgICAgICAgICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuV2l0aC5vcHRpb25hbF92YXJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LldpdGguYm9keSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JfQotCXJldHVybiAxOworICAgIHN3aXRjaCAocy0+a2luZCkgeworICAgIGNhc2UgRnVuY3Rpb25EZWZfa2luZDoKKyAgICAgICAgaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBzLT52LkZ1bmN0aW9uRGVmLm5hbWUsIERFRl9MT0NBTCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHMtPnYuRnVuY3Rpb25EZWYuYXJncy0+ZGVmYXVsdHMpCisgICAgICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuRnVuY3Rpb25EZWYuYXJncy0+ZGVmYXVsdHMpOworICAgICAgICBpZiAocy0+di5GdW5jdGlvbkRlZi5kZWNvcmF0b3JfbGlzdCkKKyAgICAgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5GdW5jdGlvbkRlZi5kZWNvcmF0b3JfbGlzdCk7CisgICAgICAgIGlmICghc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIHMtPnYuRnVuY3Rpb25EZWYubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkJsb2NrLCAodm9pZCAqKXMsIHMtPmxpbmVubykpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgVklTSVRfSU5fQkxPQ0soc3QsIGFyZ3VtZW50cywgcy0+di5GdW5jdGlvbkRlZi5hcmdzLCBzKTsKKyAgICAgICAgVklTSVRfU0VRX0lOX0JMT0NLKHN0LCBzdG10LCBzLT52LkZ1bmN0aW9uRGVmLmJvZHksIHMpOworICAgICAgICBpZiAoIXN5bXRhYmxlX2V4aXRfYmxvY2soc3QsIHMpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ2xhc3NEZWZfa2luZDogeworICAgICAgICBQeU9iamVjdCAqdG1wOworICAgICAgICBpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIHMtPnYuQ2xhc3NEZWYubmFtZSwgREVGX0xPQ0FMKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuQ2xhc3NEZWYuYmFzZXMpOworICAgICAgICBpZiAocy0+di5DbGFzc0RlZi5kZWNvcmF0b3JfbGlzdCkKKyAgICAgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5DbGFzc0RlZi5kZWNvcmF0b3JfbGlzdCk7CisgICAgICAgIGlmICghc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIHMtPnYuQ2xhc3NEZWYubmFtZSwgQ2xhc3NCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXMsIHMtPmxpbmVubykpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdG1wID0gc3QtPnN0X3ByaXZhdGU7CisgICAgICAgIHN0LT5zdF9wcml2YXRlID0gcy0+di5DbGFzc0RlZi5uYW1lOworICAgICAgICBWSVNJVF9TRVFfSU5fQkxPQ0soc3QsIHN0bXQsIHMtPnYuQ2xhc3NEZWYuYm9keSwgcyk7CisgICAgICAgIHN0LT5zdF9wcml2YXRlID0gdG1wOworICAgICAgICBpZiAoIXN5bXRhYmxlX2V4aXRfYmxvY2soc3QsIHMpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFJldHVybl9raW5kOgorICAgICAgICBpZiAocy0+di5SZXR1cm4udmFsdWUpIHsKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LlJldHVybi52YWx1ZSk7CisgICAgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfcmV0dXJuc192YWx1ZSA9IDE7CisgICAgICAgICAgICBpZiAoc3QtPnN0X2N1ci0+c3RlX2dlbmVyYXRvcikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTF9JTl9HRU5FUkFUT1IpOworICAgICAgICAgICAgICAgIFB5RXJyX1N5bnRheExvY2F0aW9uKHN0LT5zdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZW5vKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIERlbGV0ZV9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuRGVsZXRlLnRhcmdldHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFzc2lnbl9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuQXNzaWduLnRhcmdldHMpOworICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5Bc3NpZ24udmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEF1Z0Fzc2lnbl9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5BdWdBc3NpZ24udGFyZ2V0KTsKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuQXVnQXNzaWduLnZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQcmludF9raW5kOgorICAgICAgICBpZiAocy0+di5QcmludC5kZXN0KQorICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuUHJpbnQuZGVzdCk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5QcmludC52YWx1ZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvcl9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5Gb3IudGFyZ2V0KTsKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuRm9yLml0ZXIpOworICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuRm9yLmJvZHkpOworICAgICAgICBpZiAocy0+di5Gb3Iub3JlbHNlKQorICAgICAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LkZvci5vcmVsc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdoaWxlX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LldoaWxlLnRlc3QpOworICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuV2hpbGUuYm9keSk7CisgICAgICAgIGlmIChzLT52LldoaWxlLm9yZWxzZSkKKyAgICAgICAgICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5XaGlsZS5vcmVsc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElmX2tpbmQ6CisgICAgICAgIC8qIFhYWCBpZiAwOiBhbmQgbG9va3VwX3lpZWxkKCkgaGFja3MgKi8KKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuSWYudGVzdCk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5JZi5ib2R5KTsKKyAgICAgICAgaWYgKHMtPnYuSWYub3JlbHNlKQorICAgICAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LklmLm9yZWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUmFpc2Vfa2luZDoKKyAgICAgICAgaWYgKHMtPnYuUmFpc2UudHlwZSkgeworICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuUmFpc2UudHlwZSk7CisgICAgICAgICAgICBpZiAocy0+di5SYWlzZS5pbnN0KSB7CisgICAgICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuUmFpc2UuaW5zdCk7CisgICAgICAgICAgICAgICAgaWYgKHMtPnYuUmFpc2UudGJhY2spCisgICAgICAgICAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LlJhaXNlLnRiYWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRyeUV4Y2VwdF9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuVHJ5RXhjZXB0LmJvZHkpOworICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuVHJ5RXhjZXB0Lm9yZWxzZSk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhjZXB0aGFuZGxlciwgcy0+di5UcnlFeGNlcHQuaGFuZGxlcnMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRyeUZpbmFsbHlfa2luZDoKKyAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LlRyeUZpbmFsbHkuYm9keSk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5UcnlGaW5hbGx5LmZpbmFsYm9keSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQXNzZXJ0X2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkFzc2VydC50ZXN0KTsKKyAgICAgICAgaWYgKHMtPnYuQXNzZXJ0Lm1zZykKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkFzc2VydC5tc2cpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEltcG9ydF9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGFsaWFzLCBzLT52LkltcG9ydC5uYW1lcyk7CisgICAgICAgIC8qIFhYWCBEb24ndCBoYXZlIHRoZSBsaW5lbm8gYXZhaWxhYmxlIGluc2lkZQorICAgICAgICAgICB2aXNpdF9hbGlhcyAqLworICAgICAgICBpZiAoc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkICYmICFzdC0+c3RfY3VyLT5zdGVfb3B0X2xpbmVubykKKyAgICAgICAgICAgIHN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vID0gcy0+bGluZW5vOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEltcG9ydEZyb21fa2luZDoKKyAgICAgICAgVklTSVRfU0VRKHN0LCBhbGlhcywgcy0+di5JbXBvcnRGcm9tLm5hbWVzKTsKKyAgICAgICAgLyogWFhYIERvbid0IGhhdmUgdGhlIGxpbmVubyBhdmFpbGFibGUgaW5zaWRlCisgICAgICAgICAgIHZpc2l0X2FsaWFzICovCisgICAgICAgIGlmIChzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgJiYgIXN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vKQorICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8gPSBzLT5saW5lbm87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXhlY19raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5FeGVjLmJvZHkpOworICAgICAgICBpZiAoIXN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vKQorICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8gPSBzLT5saW5lbm87CisgICAgICAgIGlmIChzLT52LkV4ZWMuZ2xvYmFscykgeworICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkIHw9IE9QVF9FWEVDOworICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuRXhlYy5nbG9iYWxzKTsKKyAgICAgICAgICAgIGlmIChzLT52LkV4ZWMubG9jYWxzKQorICAgICAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkV4ZWMubG9jYWxzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCB8PSBPUFRfQkFSRV9FWEVDOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR2xvYmFsX2tpbmQ6IHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGFzZGxfc2VxICpzZXEgPSBzLT52Lkdsb2JhbC5uYW1lczsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsKKyAgICAgICAgICAgIGlkZW50aWZpZXIgbmFtZSA9IChpZGVudGlmaWVyKWFzZGxfc2VxX0dFVChzZXEsIGkpOworICAgICAgICAgICAgY2hhciAqY19uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpOworICAgICAgICAgICAgbG9uZyBjdXIgPSBzeW10YWJsZV9sb29rdXAoc3QsIG5hbWUpOworICAgICAgICAgICAgaWYgKGN1ciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAoY3VyICYgKERFRl9MT0NBTCB8IFVTRSkpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOworICAgICAgICAgICAgICAgIGlmIChjdXIgJiBERUZfTE9DQUwpCisgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQUZURVJfQVNTSUdOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfbmFtZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0FGVEVSX1VTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX25hbWUpOworICAgICAgICAgICAgICAgIGlmICghc3ltdGFibGVfd2FybihzdCwgYnVmLCBzLT5saW5lbm8pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgbmFtZSwgREVGX0dMT0JBTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRXhwcl9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYXNzX2tpbmQ6CisgICAgY2FzZSBCcmVha19raW5kOgorICAgIGNhc2UgQ29udGludWVfa2luZDoKKyAgICAgICAgLyogbm90aGluZyB0byBkbyBoZXJlICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV2l0aF9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5XaXRoLmNvbnRleHRfZXhwcik7CisgICAgICAgIGlmIChzLT52LldpdGgub3B0aW9uYWxfdmFycykgeworICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuV2l0aC5vcHRpb25hbF92YXJzKTsKKyAgICAgICAgfQorICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuV2l0aC5ib2R5KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogc3ltdGFibGVfdmlzaXRfZXhwcihzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBleHByX3R5IGUpCiB7Ci0Jc3dpdGNoIChlLT5raW5kKSB7Ci0gICAgICAgIGNhc2UgQm9vbE9wX2tpbmQ6Ci0JCVZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5Cb29sT3AudmFsdWVzKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgQmluT3Bfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuQmluT3AubGVmdCk7Ci0JCVZJU0lUKHN0LCBleHByLCBlLT52LkJpbk9wLnJpZ2h0KTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgVW5hcnlPcF9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgZS0+di5VbmFyeU9wLm9wZXJhbmQpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBMYW1iZGFfa2luZDogewotCQlpZiAoIUdFVF9JREVOVElGSUVSKGxhbWJkYSkpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKGUtPnYuTGFtYmRhLmFyZ3MtPmRlZmF1bHRzKQotCQkJVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkxhbWJkYS5hcmdzLT5kZWZhdWx0cyk7Ci0JCWlmICghc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQmxvY2ssICh2b2lkICopZSwgZS0+bGluZW5vKSkKLQkJCXJldHVybiAwOwotCQlWSVNJVF9JTl9CTE9DSyhzdCwgYXJndW1lbnRzLCBlLT52LkxhbWJkYS5hcmdzLCAodm9pZCopZSk7Ci0JCVZJU0lUX0lOX0JMT0NLKHN0LCBleHByLCBlLT52LkxhbWJkYS5ib2R5LCAodm9pZCopZSk7Ci0JCWlmICghc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgKHZvaWQgKillKSkKLQkJCXJldHVybiAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBJZkV4cF9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgZS0+di5JZkV4cC50ZXN0KTsKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuSWZFeHAuYm9keSk7Ci0JCVZJU0lUKHN0LCBleHByLCBlLT52LklmRXhwLm9yZWxzZSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIERpY3Rfa2luZDoKLQkJVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkRpY3Qua2V5cyk7Ci0JCVZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5EaWN0LnZhbHVlcyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNldF9raW5kOgotCQlWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuU2V0LmVsdHMpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBMaXN0Q29tcF9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgZS0+di5MaXN0Q29tcC5lbHQpOwotCQlWSVNJVF9TRVEoc3QsIGNvbXByZWhlbnNpb24sIGUtPnYuTGlzdENvbXAuZ2VuZXJhdG9ycyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEdlbmVyYXRvckV4cF9raW5kOgotCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X2dlbmV4cChzdCwgZSkpCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTZXRDb21wX2tpbmQ6Ci0JCWlmICghc3ltdGFibGVfdmlzaXRfc2V0Y29tcChzdCwgZSkpCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0JY2FzZSBEaWN0Q29tcF9raW5kOgotCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X2RpY3Rjb21wKHN0LCBlKSkKLQkJCXJldHVybiAwOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBZaWVsZF9raW5kOgotCQlpZiAoZS0+di5ZaWVsZC52YWx1ZSkKLQkJCVZJU0lUKHN0LCBleHByLCBlLT52LllpZWxkLnZhbHVlKTsKLSAgICAgICAgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfZ2VuZXJhdG9yID0gMTsKLQkJaWYgKHN0LT5zdF9jdXItPnN0ZV9yZXR1cm5zX3ZhbHVlKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsCi0JCQkJUkVUVVJOX1ZBTF9JTl9HRU5FUkFUT1IpOwotCQkgICAgICAgIFB5RXJyX1N5bnRheExvY2F0aW9uKHN0LT5zdF9maWxlbmFtZSwKLQkJCSAgICAgICAgICAgICBlLT5saW5lbm8pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29tcGFyZV9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgZS0+di5Db21wYXJlLmxlZnQpOwotCQlWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuQ29tcGFyZS5jb21wYXJhdG9ycyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIENhbGxfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuQ2FsbC5mdW5jKTsKLQkJVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkNhbGwuYXJncyk7Ci0JCVZJU0lUX1NFUShzdCwga2V5d29yZCwgZS0+di5DYWxsLmtleXdvcmRzKTsKLQkJaWYgKGUtPnYuQ2FsbC5zdGFyYXJncykKLQkJCVZJU0lUKHN0LCBleHByLCBlLT52LkNhbGwuc3RhcmFyZ3MpOwotCQlpZiAoZS0+di5DYWxsLmt3YXJncykKLQkJCVZJU0lUKHN0LCBleHByLCBlLT52LkNhbGwua3dhcmdzKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgUmVwcl9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgZS0+di5SZXByLnZhbHVlKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgTnVtX2tpbmQ6Ci0gICAgICAgIGNhc2UgU3RyX2tpbmQ6Ci0JCS8qIE5vdGhpbmcgdG8gZG8gaGVyZS4gKi8KLQkJYnJlYWs7Ci0JLyogVGhlIGZvbGxvd2luZyBleHBycyBjYW4gYmUgYXNzaWdubWVudCB0YXJnZXRzLiAqLwotICAgICAgICBjYXNlIEF0dHJpYnV0ZV9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgZS0+di5BdHRyaWJ1dGUudmFsdWUpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTdWJzY3JpcHRfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuU3Vic2NyaXB0LnZhbHVlKTsKLQkJVklTSVQoc3QsIHNsaWNlLCBlLT52LlN1YnNjcmlwdC5zbGljZSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIE5hbWVfa2luZDoKLQkJaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBlLT52Lk5hbWUuaWQsIAotCQkJCSAgICAgIGUtPnYuTmFtZS5jdHggPT0gTG9hZCA/IFVTRSA6IERFRl9MT0NBTCkpCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0JLyogY2hpbGQgbm9kZXMgb2YgTGlzdCBhbmQgVHVwbGUgd2lsbCBoYXZlIGV4cHJfY29udGV4dCBzZXQgKi8KLSAgICAgICAgY2FzZSBMaXN0X2tpbmQ6Ci0JCVZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5MaXN0LmVsdHMpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBUdXBsZV9raW5kOgotCQlWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuVHVwbGUuZWx0cyk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMTsKKyAgICBzd2l0Y2ggKGUtPmtpbmQpIHsKKyAgICBjYXNlIEJvb2xPcF9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuQm9vbE9wLnZhbHVlcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQmluT3Bfa2luZDoKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuQmluT3AubGVmdCk7CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkJpbk9wLnJpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBVbmFyeU9wX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LlVuYXJ5T3Aub3BlcmFuZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTGFtYmRhX2tpbmQ6IHsKKyAgICAgICAgaWYgKCFHRVRfSURFTlRJRklFUihsYW1iZGEpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChlLT52LkxhbWJkYS5hcmdzLT5kZWZhdWx0cykKKyAgICAgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5MYW1iZGEuYXJncy0+ZGVmYXVsdHMpOworICAgICAgICBpZiAoIXN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0LCBsYW1iZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25CbG9jaywgKHZvaWQgKillLCBlLT5saW5lbm8pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIFZJU0lUX0lOX0JMT0NLKHN0LCBhcmd1bWVudHMsIGUtPnYuTGFtYmRhLmFyZ3MsICh2b2lkKillKTsKKyAgICAgICAgVklTSVRfSU5fQkxPQ0soc3QsIGV4cHIsIGUtPnYuTGFtYmRhLmJvZHksICh2b2lkKillKTsKKyAgICAgICAgaWYgKCFzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKWUpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIElmRXhwX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LklmRXhwLnRlc3QpOworICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5JZkV4cC5ib2R5KTsKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuSWZFeHAub3JlbHNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEaWN0X2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5EaWN0LmtleXMpOworICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuRGljdC52YWx1ZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldF9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuU2V0LmVsdHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExpc3RDb21wX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52Lkxpc3RDb21wLmVsdCk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgY29tcHJlaGVuc2lvbiwgZS0+di5MaXN0Q29tcC5nZW5lcmF0b3JzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHZW5lcmF0b3JFeHBfa2luZDoKKyAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF9nZW5leHAoc3QsIGUpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0Q29tcF9raW5kOgorICAgICAgICBpZiAoIXN5bXRhYmxlX3Zpc2l0X3NldGNvbXAoc3QsIGUpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRGljdENvbXBfa2luZDoKKyAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF9kaWN0Y29tcChzdCwgZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBZaWVsZF9raW5kOgorICAgICAgICBpZiAoZS0+di5ZaWVsZC52YWx1ZSkKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LllpZWxkLnZhbHVlKTsKKyAgICAgICAgc3QtPnN0X2N1ci0+c3RlX2dlbmVyYXRvciA9IDE7CisgICAgICAgIGlmIChzdC0+c3RfY3VyLT5zdGVfcmV0dXJuc192YWx1ZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgIFJFVFVSTl9WQUxfSU5fR0VORVJBVE9SKTsKKyAgICAgICAgICAgIFB5RXJyX1N5bnRheExvY2F0aW9uKHN0LT5zdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLT5saW5lbm8pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21wYXJlX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkNvbXBhcmUubGVmdCk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5Db21wYXJlLmNvbXBhcmF0b3JzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDYWxsX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkNhbGwuZnVuYyk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5DYWxsLmFyZ3MpOworICAgICAgICBWSVNJVF9TRVEoc3QsIGtleXdvcmQsIGUtPnYuQ2FsbC5rZXl3b3Jkcyk7CisgICAgICAgIGlmIChlLT52LkNhbGwuc3RhcmFyZ3MpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5DYWxsLnN0YXJhcmdzKTsKKyAgICAgICAgaWYgKGUtPnYuQ2FsbC5rd2FyZ3MpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5DYWxsLmt3YXJncyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUmVwcl9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5SZXByLnZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOdW1fa2luZDoKKyAgICBjYXNlIFN0cl9raW5kOgorICAgICAgICAvKiBOb3RoaW5nIHRvIGRvIGhlcmUuICovCisgICAgICAgIGJyZWFrOworICAgIC8qIFRoZSBmb2xsb3dpbmcgZXhwcnMgY2FuIGJlIGFzc2lnbm1lbnQgdGFyZ2V0cy4gKi8KKyAgICBjYXNlIEF0dHJpYnV0ZV9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5BdHRyaWJ1dGUudmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFN1YnNjcmlwdF9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5TdWJzY3JpcHQudmFsdWUpOworICAgICAgICBWSVNJVChzdCwgc2xpY2UsIGUtPnYuU3Vic2NyaXB0LnNsaWNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOYW1lX2tpbmQ6CisgICAgICAgIGlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgZS0+di5OYW1lLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5OYW1lLmN0eCA9PSBMb2FkID8gVVNFIDogREVGX0xPQ0FMKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBicmVhazsKKyAgICAvKiBjaGlsZCBub2RlcyBvZiBMaXN0IGFuZCBUdXBsZSB3aWxsIGhhdmUgZXhwcl9jb250ZXh0IHNldCAqLworICAgIGNhc2UgTGlzdF9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuTGlzdC5lbHRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUdXBsZV9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuVHVwbGUuZWx0cyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogc3ltdGFibGVfaW1wbGljaXRfYXJnKHN0cnVjdCBzeW10YWJsZSAqc3QsIGludCBwb3MpCiB7Ci0JUHlPYmplY3QgKmlkID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiLiVkIiwgcG9zKTsKLQlpZiAoaWQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBpZCwgREVGX1BBUkFNKSkgewotCQlQeV9ERUNSRUYoaWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlfREVDUkVGKGlkKTsKLQlyZXR1cm4gMTsKKyAgICBQeU9iamVjdCAqaWQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCIuJWQiLCBwb3MpOworICAgIGlmIChpZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIGlkLCBERUZfUEFSQU0pKSB7CisgICAgICAgIFB5X0RFQ1JFRihpZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeV9ERUNSRUYoaWQpOworICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogc3ltdGFibGVfdmlzaXRfcGFyYW1zKHN0cnVjdCBzeW10YWJsZSAqc3QsIGFzZGxfc2VxICphcmdzLCBpbnQgdG9wbGV2ZWwpCiB7Ci0JaW50IGk7Ci0JCi0gICAgICAgIC8qIGdvIHRocm91Z2ggYWxsIHRoZSB0b3BsZXZlbCBhcmd1bWVudHMgZmlyc3QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGFyZ3MpOyBpKyspIHsKLQkJZXhwcl90eSBhcmcgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoYXJncywgaSk7Ci0JCWlmIChhcmctPmtpbmQgPT0gTmFtZV9raW5kKSB7Ci0JCQlhc3NlcnQoYXJnLT52Lk5hbWUuY3R4ID09IFBhcmFtIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZy0+di5OYW1lLmN0eCA9PSBTdG9yZSAmJiAhdG9wbGV2ZWwpKTsKLQkJCWlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgYXJnLT52Lk5hbWUuaWQsIERFRl9QQVJBTSkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSBpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQpIHsKLQkJCWFzc2VydChhcmctPnYuVHVwbGUuY3R4ID09IFN0b3JlKTsKLQkJCWlmICh0b3BsZXZlbCkgewotCQkJCWlmICghc3ltdGFibGVfaW1wbGljaXRfYXJnKHN0LCBpKSkKLQkJCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAotCQkJCQkiaW52YWxpZCBleHByZXNzaW9uIGluIHBhcmFtZXRlciBsaXN0Iik7Ci0JCSAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAotCQkJCSAgICAgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfbGluZW5vKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQorICAgIGludCBpOwogCi0JaWYgKCF0b3BsZXZlbCkgewotCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X3BhcmFtc19uZXN0ZWQoc3QsIGFyZ3MpKQotCQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIGdvIHRocm91Z2ggYWxsIHRoZSB0b3BsZXZlbCBhcmd1bWVudHMgZmlyc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGFyZ3MpOyBpKyspIHsKKyAgICAgICAgZXhwcl90eSBhcmcgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoYXJncywgaSk7CisgICAgICAgIGlmIChhcmctPmtpbmQgPT0gTmFtZV9raW5kKSB7CisgICAgICAgICAgICBhc3NlcnQoYXJnLT52Lk5hbWUuY3R4ID09IFBhcmFtIHx8CisgICAgICAgICAgICAgICAgICAgKGFyZy0+di5OYW1lLmN0eCA9PSBTdG9yZSAmJiAhdG9wbGV2ZWwpKTsKKyAgICAgICAgICAgIGlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgYXJnLT52Lk5hbWUuaWQsIERFRl9QQVJBTSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQpIHsKKyAgICAgICAgICAgIGFzc2VydChhcmctPnYuVHVwbGUuY3R4ID09IFN0b3JlKTsKKyAgICAgICAgICAgIGlmICh0b3BsZXZlbCkgeworICAgICAgICAgICAgICAgIGlmICghc3ltdGFibGVfaW1wbGljaXRfYXJnKHN0LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgZXhwcmVzc2lvbiBpbiBwYXJhbWV0ZXIgbGlzdCIpOworICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX2xpbmVubyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAxOworICAgIGlmICghdG9wbGV2ZWwpIHsKKyAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF9wYXJhbXNfbmVzdGVkKHN0LCBhcmdzKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9wYXJhbXNfbmVzdGVkKHN0cnVjdCBzeW10YWJsZSAqc3QsIGFzZGxfc2VxICphcmdzKQogewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oYXJncyk7IGkrKykgewotCQlleHByX3R5IGFyZyA9IChleHByX3R5KWFzZGxfc2VxX0dFVChhcmdzLCBpKTsKLQkJaWYgKGFyZy0+a2luZCA9PSBUdXBsZV9raW5kICYmCi0JCSAgICAhc3ltdGFibGVfdmlzaXRfcGFyYW1zKHN0LCBhcmctPnYuVHVwbGUuZWx0cywgMCkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcmV0dXJuIDE7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihhcmdzKTsgaSsrKSB7CisgICAgICAgIGV4cHJfdHkgYXJnID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGFyZ3MsIGkpOworICAgICAgICBpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQgJiYKKyAgICAgICAgICAgICFzeW10YWJsZV92aXNpdF9wYXJhbXMoc3QsIGFyZy0+di5UdXBsZS5lbHRzLCAwKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogc3ltdGFibGVfdmlzaXRfYXJndW1lbnRzKHN0cnVjdCBzeW10YWJsZSAqc3QsIGFyZ3VtZW50c190eSBhKQogewotCS8qIHNraXAgZGVmYXVsdCBhcmd1bWVudHMgaW5zaWRlIGZ1bmN0aW9uIGJsb2NrCi0JICAgWFhYIHNob3VsZCBhc3QgYmUgZGlmZmVyZW50PwotCSovCi0JaWYgKGEtPmFyZ3MgJiYgIXN5bXRhYmxlX3Zpc2l0X3BhcmFtcyhzdCwgYS0+YXJncywgMSkpCi0JCXJldHVybiAwOwotCWlmIChhLT52YXJhcmcpIHsKLQkJaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBhLT52YXJhcmcsIERFRl9QQVJBTSkpCi0JCQlyZXR1cm4gMDsKLQkJc3QtPnN0X2N1ci0+c3RlX3ZhcmFyZ3MgPSAxOwotCX0KLQlpZiAoYS0+a3dhcmcpIHsKLQkJaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBhLT5rd2FyZywgREVGX1BBUkFNKSkKLQkJCXJldHVybiAwOwotCQlzdC0+c3RfY3VyLT5zdGVfdmFya2V5d29yZHMgPSAxOwotCX0KLQlpZiAoYS0+YXJncyAmJiAhc3ltdGFibGVfdmlzaXRfcGFyYW1zX25lc3RlZChzdCwgYS0+YXJncykpCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgIC8qIHNraXAgZGVmYXVsdCBhcmd1bWVudHMgaW5zaWRlIGZ1bmN0aW9uIGJsb2NrCisgICAgICAgWFhYIHNob3VsZCBhc3QgYmUgZGlmZmVyZW50PworICAgICovCisgICAgaWYgKGEtPmFyZ3MgJiYgIXN5bXRhYmxlX3Zpc2l0X3BhcmFtcyhzdCwgYS0+YXJncywgMSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhLT52YXJhcmcpIHsKKyAgICAgICAgaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBhLT52YXJhcmcsIERFRl9QQVJBTSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3QtPnN0X2N1ci0+c3RlX3ZhcmFyZ3MgPSAxOworICAgIH0KKyAgICBpZiAoYS0+a3dhcmcpIHsKKyAgICAgICAgaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBhLT5rd2FyZywgREVGX1BBUkFNKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzdC0+c3RfY3VyLT5zdGVfdmFya2V5d29yZHMgPSAxOworICAgIH0KKyAgICBpZiAoYS0+YXJncyAmJiAhc3ltdGFibGVfdmlzaXRfcGFyYW1zX25lc3RlZChzdCwgYS0+YXJncykpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9leGNlcHRoYW5kbGVyKHN0cnVjdCBzeW10YWJsZSAqc3QsIGV4Y2VwdGhhbmRsZXJfdHkgZWgpCiB7Ci0JaWYgKGVoLT52LkV4Y2VwdEhhbmRsZXIudHlwZSkKLQkJVklTSVQoc3QsIGV4cHIsIGVoLT52LkV4Y2VwdEhhbmRsZXIudHlwZSk7Ci0JaWYgKGVoLT52LkV4Y2VwdEhhbmRsZXIubmFtZSkKLQkJVklTSVQoc3QsIGV4cHIsIGVoLT52LkV4Y2VwdEhhbmRsZXIubmFtZSk7Ci0JVklTSVRfU0VRKHN0LCBzdG10LCBlaC0+di5FeGNlcHRIYW5kbGVyLmJvZHkpOwotCXJldHVybiAxOworICAgIGlmIChlaC0+di5FeGNlcHRIYW5kbGVyLnR5cGUpCisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlaC0+di5FeGNlcHRIYW5kbGVyLnR5cGUpOworICAgIGlmIChlaC0+di5FeGNlcHRIYW5kbGVyLm5hbWUpCisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlaC0+di5FeGNlcHRIYW5kbGVyLm5hbWUpOworICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgZWgtPnYuRXhjZXB0SGFuZGxlci5ib2R5KTsKKyAgICByZXR1cm4gMTsKIH0KIAogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogc3ltdGFibGVfdmlzaXRfYWxpYXMoc3RydWN0IHN5bXRhYmxlICpzdCwgYWxpYXNfdHkgYSkKIHsKLQkvKiBDb21wdXRlIHN0b3JlX25hbWUsIHRoZSBuYW1lIGFjdHVhbGx5IGJvdW5kIGJ5IHRoZSBpbXBvcnQKLQkgICBvcGVyYXRpb24uICBJdCBpcyBkaWZlcmVudCB0aGFuIGEtPm5hbWUgd2hlbiBhLT5uYW1lIGlzIGEKLQkgICBkb3R0ZWQgcGFja2FnZSBuYW1lIChlLmcuIHNwYW0uZWdncykgCi0JKi8KLQlQeU9iamVjdCAqc3RvcmVfbmFtZTsKLQlQeU9iamVjdCAqbmFtZSA9IChhLT5hc25hbWUgPT0gTlVMTCkgPyBhLT5uYW1lIDogYS0+YXNuYW1lOwotCWNvbnN0IGNoYXIgKmJhc2UgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZSk7Ci0JY2hhciAqZG90ID0gc3RyY2hyKGJhc2UsICcuJyk7Ci0JaWYgKGRvdCkgewotCQlzdG9yZV9uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYmFzZSwgZG90IC0gYmFzZSk7Ci0JCWlmICghc3RvcmVfbmFtZSkKLQkJCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJc3RvcmVfbmFtZSA9IG5hbWU7Ci0JCVB5X0lOQ1JFRihzdG9yZV9uYW1lKTsKLQl9Ci0JaWYgKHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobmFtZSksICIqIikpIHsKLQkJaW50IHIgPSBzeW10YWJsZV9hZGRfZGVmKHN0LCBzdG9yZV9uYW1lLCBERUZfSU1QT1JUKTsgCi0JCVB5X0RFQ1JFRihzdG9yZV9uYW1lKTsKLQkJcmV0dXJuIHI7Ci0JfQotCWVsc2UgewotICAgICAgICAgICAgaWYgKHN0LT5zdF9jdXItPnN0ZV90eXBlICE9IE1vZHVsZUJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGxpbmVubyA9IHN0LT5zdF9jdXItPnN0ZV9saW5lbm87Ci0gICAgICAgICAgICAgICAgaWYgKCFzeW10YWJsZV93YXJuKHN0LCBJTVBPUlRfU1RBUl9XQVJOSU5HLCBsaW5lbm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdG9yZV9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0JCX0KLSAgICAgICAgICAgIH0KLQkgICAgc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkIHw9IE9QVF9JTVBPUlRfU1RBUjsKLQkgICAgUHlfREVDUkVGKHN0b3JlX25hbWUpOwotCSAgICByZXR1cm4gMTsKLQl9CisgICAgLyogQ29tcHV0ZSBzdG9yZV9uYW1lLCB0aGUgbmFtZSBhY3R1YWxseSBib3VuZCBieSB0aGUgaW1wb3J0CisgICAgICAgb3BlcmF0aW9uLiAgSXQgaXMgZGlmZXJlbnQgdGhhbiBhLT5uYW1lIHdoZW4gYS0+bmFtZSBpcyBhCisgICAgICAgZG90dGVkIHBhY2thZ2UgbmFtZSAoZS5nLiBzcGFtLmVnZ3MpCisgICAgKi8KKyAgICBQeU9iamVjdCAqc3RvcmVfbmFtZTsKKyAgICBQeU9iamVjdCAqbmFtZSA9IChhLT5hc25hbWUgPT0gTlVMTCkgPyBhLT5uYW1lIDogYS0+YXNuYW1lOworICAgIGNvbnN0IGNoYXIgKmJhc2UgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZSk7CisgICAgY2hhciAqZG90ID0gc3RyY2hyKGJhc2UsICcuJyk7CisgICAgaWYgKGRvdCkgeworICAgICAgICBzdG9yZV9uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYmFzZSwgZG90IC0gYmFzZSk7CisgICAgICAgIGlmICghc3RvcmVfbmFtZSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RvcmVfbmFtZSA9IG5hbWU7CisgICAgICAgIFB5X0lOQ1JFRihzdG9yZV9uYW1lKTsKKyAgICB9CisgICAgaWYgKHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobmFtZSksICIqIikpIHsKKyAgICAgICAgaW50IHIgPSBzeW10YWJsZV9hZGRfZGVmKHN0LCBzdG9yZV9uYW1lLCBERUZfSU1QT1JUKTsKKyAgICAgICAgUHlfREVDUkVGKHN0b3JlX25hbWUpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzdC0+c3RfY3VyLT5zdGVfdHlwZSAhPSBNb2R1bGVCbG9jaykgeworICAgICAgICBpbnQgbGluZW5vID0gc3QtPnN0X2N1ci0+c3RlX2xpbmVubzsKKyAgICAgICAgaWYgKCFzeW10YWJsZV93YXJuKHN0LCBJTVBPUlRfU1RBUl9XQVJOSU5HLCBsaW5lbm8pKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RvcmVfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCB8PSBPUFRfSU1QT1JUX1NUQVI7CisgICAgICAgIFB5X0RFQ1JFRihzdG9yZV9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogfQogCiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9jb21wcmVoZW5zaW9uKHN0cnVjdCBzeW10YWJsZSAqc3QsIGNvbXByZWhlbnNpb25fdHkgbGMpCiB7Ci0JVklTSVQoc3QsIGV4cHIsIGxjLT50YXJnZXQpOwotCVZJU0lUKHN0LCBleHByLCBsYy0+aXRlcik7Ci0JVklTSVRfU0VRKHN0LCBleHByLCBsYy0+aWZzKTsKLQlyZXR1cm4gMTsKKyAgICBWSVNJVChzdCwgZXhwciwgbGMtPnRhcmdldCk7CisgICAgVklTSVQoc3QsIGV4cHIsIGxjLT5pdGVyKTsKKyAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGxjLT5pZnMpOworICAgIHJldHVybiAxOwogfQogCiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9rZXl3b3JkKHN0cnVjdCBzeW10YWJsZSAqc3QsIGtleXdvcmRfdHkgaykKIHsKLQlWSVNJVChzdCwgZXhwciwgay0+dmFsdWUpOwotCXJldHVybiAxOworICAgIFZJU0lUKHN0LCBleHByLCBrLT52YWx1ZSk7CisgICAgcmV0dXJuIDE7CiB9CiAKIAotc3RhdGljIGludCAKK3N0YXRpYyBpbnQKIHN5bXRhYmxlX3Zpc2l0X3NsaWNlKHN0cnVjdCBzeW10YWJsZSAqc3QsIHNsaWNlX3R5IHMpCiB7Ci0Jc3dpdGNoIChzLT5raW5kKSB7Ci0JY2FzZSBTbGljZV9raW5kOgotCQlpZiAocy0+di5TbGljZS5sb3dlcikKLQkJCVZJU0lUKHN0LCBleHByLCBzLT52LlNsaWNlLmxvd2VyKQotCQlpZiAocy0+di5TbGljZS51cHBlcikKLQkJCVZJU0lUKHN0LCBleHByLCBzLT52LlNsaWNlLnVwcGVyKQotCQlpZiAocy0+di5TbGljZS5zdGVwKQotCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuU2xpY2Uuc3RlcCkKLQkJYnJlYWs7Ci0JY2FzZSBFeHRTbGljZV9raW5kOgotCQlWSVNJVF9TRVEoc3QsIHNsaWNlLCBzLT52LkV4dFNsaWNlLmRpbXMpCi0JCWJyZWFrOwotCWNhc2UgSW5kZXhfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuSW5kZXgudmFsdWUpCi0JCWJyZWFrOwotCWNhc2UgRWxsaXBzaXNfa2luZDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAxOworICAgIHN3aXRjaCAocy0+a2luZCkgeworICAgIGNhc2UgU2xpY2Vfa2luZDoKKyAgICAgICAgaWYgKHMtPnYuU2xpY2UubG93ZXIpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5TbGljZS5sb3dlcikKKyAgICAgICAgaWYgKHMtPnYuU2xpY2UudXBwZXIpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5TbGljZS51cHBlcikKKyAgICAgICAgaWYgKHMtPnYuU2xpY2Uuc3RlcCkKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LlNsaWNlLnN0ZXApCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXh0U2xpY2Vfa2luZDoKKyAgICAgICAgVklTSVRfU0VRKHN0LCBzbGljZSwgcy0+di5FeHRTbGljZS5kaW1zKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEluZGV4X2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkluZGV4LnZhbHVlKQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVsbGlwc2lzX2tpbmQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogc3ltdGFibGVfbmV3X3RtcG5hbWUoc3RydWN0IHN5bXRhYmxlICpzdCkKIHsKLQljaGFyIHRtcG5hbWVbMjU2XTsKLQlpZGVudGlmaWVyIHRtcDsKKyAgICBjaGFyIHRtcG5hbWVbMjU2XTsKKyAgICBpZGVudGlmaWVyIHRtcDsKIAotCVB5T1Nfc25wcmludGYodG1wbmFtZSwgc2l6ZW9mKHRtcG5hbWUpLCAiX1slZF0iLAotCQkgICAgICArK3N0LT5zdF9jdXItPnN0ZV90bXBuYW1lKTsKLQl0bXAgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKHRtcG5hbWUpOwotCWlmICghdG1wKQotCQlyZXR1cm4gMDsKLQlpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIHRtcCwgREVGX0xPQ0FMKSkKLQkJcmV0dXJuIDA7Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIDE7CisgICAgUHlPU19zbnByaW50Zih0bXBuYW1lLCBzaXplb2YodG1wbmFtZSksICJfWyVkXSIsCisgICAgICAgICAgICAgICAgICArK3N0LT5zdF9jdXItPnN0ZV90bXBuYW1lKTsKKyAgICB0bXAgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKHRtcG5hbWUpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIHRtcCwgREVGX0xPQ0FMKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV9oYW5kbGVfY29tcHJlaGVuc2lvbihzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBleHByX3R5IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIHNjb3BlX25hbWUsIGFzZGxfc2VxICpnZW5lcmF0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBlbHQsIGV4cHJfdHkgdmFsdWUpCiB7Ci0JaW50IGlzX2dlbmVyYXRvciA9IChlLT5raW5kID09IEdlbmVyYXRvckV4cF9raW5kKTsKLQlpbnQgbmVlZHNfdG1wID0gIWlzX2dlbmVyYXRvcjsKLQljb21wcmVoZW5zaW9uX3R5IG91dGVybW9zdCA9ICgoY29tcHJlaGVuc2lvbl90eSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcV9HRVQoZ2VuZXJhdG9ycywgMCkpOwotCS8qIE91dGVybW9zdCBpdGVyYXRvciBpcyBldmFsdWF0ZWQgaW4gY3VycmVudCBzY29wZSAqLwotCVZJU0lUKHN0LCBleHByLCBvdXRlcm1vc3QtPml0ZXIpOwotCS8qIENyZWF0ZSBjb21wcmVoZW5zaW9uIHNjb3BlIGZvciB0aGUgcmVzdCAqLwotCWlmICghc2NvcGVfbmFtZSB8fAotCSAgICAhc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIHNjb3BlX25hbWUsIEZ1bmN0aW9uQmxvY2ssICh2b2lkICopZSwgMCkpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCXN0LT5zdF9jdXItPnN0ZV9nZW5lcmF0b3IgPSBpc19nZW5lcmF0b3I7Ci0JLyogT3V0ZXJtb3N0IGl0ZXIgaXMgcmVjZWl2ZWQgYXMgYW4gYXJndW1lbnQgKi8KLQlpZiAoIXN5bXRhYmxlX2ltcGxpY2l0X2FyZyhzdCwgMCkpIHsKLQkJc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgKHZvaWQgKillKTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIEFsbG9jYXRlIHRlbXBvcmFyeSBuYW1lIGlmIG5lZWRlZCAqLwotCWlmIChuZWVkc190bXAgJiYgIXN5bXRhYmxlX25ld190bXBuYW1lKHN0KSkgewotCQlzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JVklTSVRfSU5fQkxPQ0soc3QsIGV4cHIsIG91dGVybW9zdC0+dGFyZ2V0LCAodm9pZCopZSk7Ci0JVklTSVRfU0VRX0lOX0JMT0NLKHN0LCBleHByLCBvdXRlcm1vc3QtPmlmcywgKHZvaWQqKWUpOwotCVZJU0lUX1NFUV9UQUlMX0lOX0JMT0NLKHN0LCBjb21wcmVoZW5zaW9uLAotCQkJCWdlbmVyYXRvcnMsIDEsICh2b2lkKillKTsKLQlpZiAodmFsdWUpCi0JCVZJU0lUX0lOX0JMT0NLKHN0LCBleHByLCB2YWx1ZSwgKHZvaWQqKWUpOwotCVZJU0lUX0lOX0JMT0NLKHN0LCBleHByLCBlbHQsICh2b2lkKillKTsKLQlyZXR1cm4gc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgKHZvaWQgKillKTsKKyAgICBpbnQgaXNfZ2VuZXJhdG9yID0gKGUtPmtpbmQgPT0gR2VuZXJhdG9yRXhwX2tpbmQpOworICAgIGludCBuZWVkc190bXAgPSAhaXNfZ2VuZXJhdG9yOworICAgIGNvbXByZWhlbnNpb25fdHkgb3V0ZXJtb3N0ID0gKChjb21wcmVoZW5zaW9uX3R5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXFfR0VUKGdlbmVyYXRvcnMsIDApKTsKKyAgICAvKiBPdXRlcm1vc3QgaXRlcmF0b3IgaXMgZXZhbHVhdGVkIGluIGN1cnJlbnQgc2NvcGUgKi8KKyAgICBWSVNJVChzdCwgZXhwciwgb3V0ZXJtb3N0LT5pdGVyKTsKKyAgICAvKiBDcmVhdGUgY29tcHJlaGVuc2lvbiBzY29wZSBmb3IgdGhlIHJlc3QgKi8KKyAgICBpZiAoIXNjb3BlX25hbWUgfHwKKyAgICAgICAgIXN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0LCBzY29wZV9uYW1lLCBGdW5jdGlvbkJsb2NrLCAodm9pZCAqKWUsIDApKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzdC0+c3RfY3VyLT5zdGVfZ2VuZXJhdG9yID0gaXNfZ2VuZXJhdG9yOworICAgIC8qIE91dGVybW9zdCBpdGVyIGlzIHJlY2VpdmVkIGFzIGFuIGFyZ3VtZW50ICovCisgICAgaWYgKCFzeW10YWJsZV9pbXBsaWNpdF9hcmcoc3QsIDApKSB7CisgICAgICAgIHN5bXRhYmxlX2V4aXRfYmxvY2soc3QsICh2b2lkICopZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgbmFtZSBpZiBuZWVkZWQgKi8KKyAgICBpZiAobmVlZHNfdG1wICYmICFzeW10YWJsZV9uZXdfdG1wbmFtZShzdCkpIHsKKyAgICAgICAgc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgKHZvaWQgKillKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFZJU0lUX0lOX0JMT0NLKHN0LCBleHByLCBvdXRlcm1vc3QtPnRhcmdldCwgKHZvaWQqKWUpOworICAgIFZJU0lUX1NFUV9JTl9CTE9DSyhzdCwgZXhwciwgb3V0ZXJtb3N0LT5pZnMsICh2b2lkKillKTsKKyAgICBWSVNJVF9TRVFfVEFJTF9JTl9CTE9DSyhzdCwgY29tcHJlaGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3JzLCAxLCAodm9pZCopZSk7CisgICAgaWYgKHZhbHVlKQorICAgICAgICBWSVNJVF9JTl9CTE9DSyhzdCwgZXhwciwgdmFsdWUsICh2b2lkKillKTsKKyAgICBWSVNJVF9JTl9CTE9DSyhzdCwgZXhwciwgZWx0LCAodm9pZCopZSk7CisgICAgcmV0dXJuIHN5bXRhYmxlX2V4aXRfYmxvY2soc3QsICh2b2lkICopZSk7CiB9CiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9nZW5leHAoc3RydWN0IHN5bXRhYmxlICpzdCwgZXhwcl90eSBlKQogewotCXJldHVybiBzeW10YWJsZV9oYW5kbGVfY29tcHJlaGVuc2lvbihzdCwgZSwgR0VUX0lERU5USUZJRVIoZ2VuZXhwciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LkdlbmVyYXRvckV4cC5nZW5lcmF0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5HZW5lcmF0b3JFeHAuZWx0LCBOVUxMKTsKKyAgICByZXR1cm4gc3ltdGFibGVfaGFuZGxlX2NvbXByZWhlbnNpb24oc3QsIGUsIEdFVF9JREVOVElGSUVSKGdlbmV4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LkdlbmVyYXRvckV4cC5nZW5lcmF0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LkdlbmVyYXRvckV4cC5lbHQsIE5VTEwpOwogfQogCiBzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9zZXRjb21wKHN0cnVjdCBzeW10YWJsZSAqc3QsIGV4cHJfdHkgZSkKIHsKLQlyZXR1cm4gc3ltdGFibGVfaGFuZGxlX2NvbXByZWhlbnNpb24oc3QsIGUsIEdFVF9JREVOVElGSUVSKHNldGNvbXApLAotCQkJCQkgICAgIGUtPnYuU2V0Q29tcC5nZW5lcmF0b3JzLAotCQkJCQkgICAgIGUtPnYuU2V0Q29tcC5lbHQsIE5VTEwpOworICAgIHJldHVybiBzeW10YWJsZV9oYW5kbGVfY29tcHJlaGVuc2lvbihzdCwgZSwgR0VUX0lERU5USUZJRVIoc2V0Y29tcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPnYuU2V0Q29tcC5nZW5lcmF0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LlNldENvbXAuZWx0LCBOVUxMKTsKIH0KIAogc3RhdGljIGludAogc3ltdGFibGVfdmlzaXRfZGljdGNvbXAoc3RydWN0IHN5bXRhYmxlICpzdCwgZXhwcl90eSBlKQogewotCXJldHVybiBzeW10YWJsZV9oYW5kbGVfY29tcHJlaGVuc2lvbihzdCwgZSwgR0VUX0lERU5USUZJRVIoZGljdGNvbXApLAotCQkJCQkgICAgIGUtPnYuRGljdENvbXAuZ2VuZXJhdG9ycywKLQkJCQkJICAgICBlLT52LkRpY3RDb21wLmtleSwKLQkJCQkJICAgICBlLT52LkRpY3RDb21wLnZhbHVlKTsKKyAgICByZXR1cm4gc3ltdGFibGVfaGFuZGxlX2NvbXByZWhlbnNpb24oc3QsIGUsIEdFVF9JREVOVElGSUVSKGRpY3Rjb21wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5EaWN0Q29tcC5nZW5lcmF0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LkRpY3RDb21wLmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5EaWN0Q29tcC52YWx1ZSk7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vc3lzbW9kdWxlLmMgYi9QeXRob24vc3lzbW9kdWxlLmMKaW5kZXggMjdlYWFkMS4uN2NmYTE1ZCAxMDA2NDQKLS0tIGEvUHl0aG9uL3N5c21vZHVsZS5jCisrKyBiL1B5dGhvbi9zeXNtb2R1bGUuYwpAQCAtNDksNzggKzQ5LDc4IEBACiBQeU9iamVjdCAqCiBQeVN5c19HZXRPYmplY3QoY2hhciAqbmFtZSkKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5T2JqZWN0ICpzZCA9IHRzdGF0ZS0+aW50ZXJwLT5zeXNkaWN0OwotCWlmIChzZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2QsIG5hbWUpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlPYmplY3QgKnNkID0gdHN0YXRlLT5pbnRlcnAtPnN5c2RpY3Q7CisgICAgaWYgKHNkID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeURpY3RfR2V0SXRlbVN0cmluZyhzZCwgbmFtZSk7CiB9CiAKIEZJTEUgKgogUHlTeXNfR2V0RmlsZShjaGFyICpuYW1lLCBGSUxFICpkZWYpCiB7Ci0JRklMRSAqZnAgPSBOVUxMOwotCVB5T2JqZWN0ICp2ID0gUHlTeXNfR2V0T2JqZWN0KG5hbWUpOwotCWlmICh2ICE9IE5VTEwgJiYgUHlGaWxlX0NoZWNrKHYpKQotCQlmcCA9IFB5RmlsZV9Bc0ZpbGUodik7Ci0JaWYgKGZwID09IE5VTEwpCi0JCWZwID0gZGVmOwotCXJldHVybiBmcDsKKyAgICBGSUxFICpmcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnYgPSBQeVN5c19HZXRPYmplY3QobmFtZSk7CisgICAgaWYgKHYgIT0gTlVMTCAmJiBQeUZpbGVfQ2hlY2sodikpCisgICAgICAgIGZwID0gUHlGaWxlX0FzRmlsZSh2KTsKKyAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICAgICAgZnAgPSBkZWY7CisgICAgcmV0dXJuIGZwOwogfQogCiBpbnQKIFB5U3lzX1NldE9iamVjdChjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5T2JqZWN0ICpzZCA9IHRzdGF0ZS0+aW50ZXJwLT5zeXNkaWN0OwotCWlmICh2ID09IE5VTEwpIHsKLQkJaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHNkLCBuYW1lKSA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXJldHVybiBQeURpY3RfRGVsSXRlbVN0cmluZyhzZCwgbmFtZSk7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKHNkLCBuYW1lLCB2KTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICpzZCA9IHRzdGF0ZS0+aW50ZXJwLT5zeXNkaWN0OworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHNkLCBuYW1lKSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeURpY3RfRGVsSXRlbVN0cmluZyhzZCwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKHNkLCBuYW1lLCB2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19kaXNwbGF5aG9vayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm8pCiB7Ci0JUHlPYmplY3QgKm91dGY7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7Ci0JUHlPYmplY3QgKm1vZHVsZXMgPSBpbnRlcnAtPm1vZHVsZXM7Ci0JUHlPYmplY3QgKmJ1aWx0aW5zID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fYnVpbHRpbl9fIik7CisgICAgUHlPYmplY3QgKm91dGY7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CisgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBpbnRlcnAtPm1vZHVsZXM7CisgICAgUHlPYmplY3QgKmJ1aWx0aW5zID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fYnVpbHRpbl9fIik7CiAKLQlpZiAoYnVpbHRpbnMgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibG9zdCBfX2J1aWx0aW5fXyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGJ1aWx0aW5zID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImxvc3QgX19idWlsdGluX18iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogUHJpbnQgdmFsdWUgZXhjZXB0IGlmIE5vbmUgKi8KLQkvKiBBZnRlciBwcmludGluZywgYWxzbyBhc3NpZ24gdG8gJ18nICovCi0JLyogQmVmb3JlLCBzZXQgJ18nIHRvIE5vbmUgdG8gYXZvaWQgcmVjdXJzaW9uICovCi0JaWYgKG8gPT0gUHlfTm9uZSkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhidWlsdGlucywgIl8iLCBQeV9Ob25lKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlfRmx1c2hMaW5lKCkgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3V0ZiA9IFB5U3lzX0dldE9iamVjdCgic3Rkb3V0Iik7Ci0JaWYgKG91dGYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibG9zdCBzeXMuc3Rkb3V0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlGaWxlX1dyaXRlT2JqZWN0KG8sIG91dGYsIDApICE9IDApCi0JCXJldHVybiBOVUxMOwotCVB5RmlsZV9Tb2Z0U3BhY2Uob3V0ZiwgMSk7Ci0JaWYgKFB5X0ZsdXNoTGluZSgpICE9IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKGJ1aWx0aW5zLCAiXyIsIG8pICE9IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAvKiBQcmludCB2YWx1ZSBleGNlcHQgaWYgTm9uZSAqLworICAgIC8qIEFmdGVyIHByaW50aW5nLCBhbHNvIGFzc2lnbiB0byAnXycgKi8KKyAgICAvKiBCZWZvcmUsIHNldCAnXycgdG8gTm9uZSB0byBhdm9pZCByZWN1cnNpb24gKi8KKyAgICBpZiAobyA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKGJ1aWx0aW5zLCAiXyIsIFB5X05vbmUpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeV9GbHVzaExpbmUoKSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdXRmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKKyAgICBpZiAob3V0ZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJsb3N0IHN5cy5zdGRvdXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUZpbGVfV3JpdGVPYmplY3Qobywgb3V0ZiwgMCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlGaWxlX1NvZnRTcGFjZShvdXRmLCAxKTsKKyAgICBpZiAoUHlfRmx1c2hMaW5lKCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoYnVpbHRpbnMsICJfIiwgbykgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZGlzcGxheWhvb2tfZG9jLApAQCAtMTMyLDEyICsxMzIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZXhjZXB0aG9vayhQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JUHlPYmplY3QgKmV4YywgKnZhbHVlLCAqdGI7Ci0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZXhjZXB0aG9vayIsIDMsIDMsICZleGMsICZ2YWx1ZSwgJnRiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlFcnJfRGlzcGxheShleGMsIHZhbHVlLCB0Yik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5T2JqZWN0ICpleGMsICp2YWx1ZSwgKnRiOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImV4Y2VwdGhvb2siLCAzLCAzLCAmZXhjLCAmdmFsdWUsICZ0YikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX0Rpc3BsYXkoZXhjLCB2YWx1ZSwgdGIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGV4Y2VwdGhvb2tfZG9jLApAQCAtMTQ5LDE0ICsxNDksMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZXhjX2luZm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwotCXRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoCi0JCSIoT09PKSIsCi0JCXRzdGF0ZS0+ZXhjX3R5cGUgIT0gTlVMTCA/IHRzdGF0ZS0+ZXhjX3R5cGUgOiBQeV9Ob25lLAotCQl0c3RhdGUtPmV4Y192YWx1ZSAhPSBOVUxMID8gdHN0YXRlLT5leGNfdmFsdWUgOiBQeV9Ob25lLAotCQl0c3RhdGUtPmV4Y190cmFjZWJhY2sgIT0gTlVMTCA/Ci0JCQl0c3RhdGUtPmV4Y190cmFjZWJhY2sgOiBQeV9Ob25lKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CisgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgKKyAgICAgICAgIihPT08pIiwKKyAgICAgICAgdHN0YXRlLT5leGNfdHlwZSAhPSBOVUxMID8gdHN0YXRlLT5leGNfdHlwZSA6IFB5X05vbmUsCisgICAgICAgIHRzdGF0ZS0+ZXhjX3ZhbHVlICE9IE5VTEwgPyB0c3RhdGUtPmV4Y192YWx1ZSA6IFB5X05vbmUsCisgICAgICAgIHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayAhPSBOVUxMID8KKyAgICAgICAgICAgIHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayA6IFB5X05vbmUpOwogfQogCiBQeURvY19TVFJWQVIoZXhjX2luZm9fZG9jLApAQCAtMTY5LDI5ICsxNjksMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZXhjX2NsZWFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKLQlQeU9iamVjdCAqdG1wX3R5cGUsICp0bXBfdmFsdWUsICp0bXBfdGI7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworICAgIFB5T2JqZWN0ICp0bXBfdHlwZSwgKnRtcF92YWx1ZSwgKnRtcF90YjsKIAotCWlmIChQeUVycl9XYXJuUHkzaygic3lzLmV4Y19jbGVhcigpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCi0JCQkgICAidXNlIGV4Y2VwdCBjbGF1c2VzIiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInN5cy5leGNfY2xlYXIoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgorICAgICAgICAgICAgICAgICAgICAgICAidXNlIGV4Y2VwdCBjbGF1c2VzIiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JdG1wX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOwotCXRtcF92YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOwotCXRtcF90YiA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKLQl0c3RhdGUtPmV4Y190eXBlID0gTlVMTDsKLQl0c3RhdGUtPmV4Y192YWx1ZSA9IE5VTEw7Ci0JdHN0YXRlLT5leGNfdHJhY2ViYWNrID0gTlVMTDsKLQlQeV9YREVDUkVGKHRtcF90eXBlKTsKLQlQeV9YREVDUkVGKHRtcF92YWx1ZSk7Ci0JUHlfWERFQ1JFRih0bXBfdGIpOwotCS8qIEZvciBiL3cgY29tcGF0aWJpbGl0eSAqLwotCVB5U3lzX1NldE9iamVjdCgiZXhjX3R5cGUiLCBQeV9Ob25lKTsKLQlQeVN5c19TZXRPYmplY3QoImV4Y192YWx1ZSIsIFB5X05vbmUpOwotCVB5U3lzX1NldE9iamVjdCgiZXhjX3RyYWNlYmFjayIsIFB5X05vbmUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIHRtcF90eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKKyAgICB0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKKyAgICB0bXBfdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7CisgICAgdHN0YXRlLT5leGNfdHlwZSA9IE5VTEw7CisgICAgdHN0YXRlLT5leGNfdmFsdWUgPSBOVUxMOworICAgIHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayA9IE5VTEw7CisgICAgUHlfWERFQ1JFRih0bXBfdHlwZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdmFsdWUpOworICAgIFB5X1hERUNSRUYodG1wX3RiKTsKKyAgICAvKiBGb3IgYi93IGNvbXBhdGliaWxpdHkgKi8KKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y190eXBlIiwgUHlfTm9uZSk7CisgICAgUHlTeXNfU2V0T2JqZWN0KCJleGNfdmFsdWUiLCBQeV9Ob25lKTsKKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y190cmFjZWJhY2siLCBQeV9Ob25lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihleGNfY2xlYXJfZG9jLApAQCAtMjA2LDEyICsyMDYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZXhpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmV4aXRfY29kZSA9IDA7Ci0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZXhpdCIsIDAsIDEsICZleGl0X2NvZGUpKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBSYWlzZSBTeXN0ZW1FeGl0IHNvIGNhbGxlcnMgbWF5IGNhdGNoIGl0IG9yIGNsZWFuIHVwLiAqLwotCVB5RXJyX1NldE9iamVjdChQeUV4Y19TeXN0ZW1FeGl0LCBleGl0X2NvZGUpOwotCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICpleGl0X2NvZGUgPSAwOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImV4aXQiLCAwLCAxLCAmZXhpdF9jb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogUmFpc2UgU3lzdGVtRXhpdCBzbyBjYWxsZXJzIG1heSBjYXRjaCBpdCBvciBjbGVhbiB1cC4gKi8KKyAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfU3lzdGVtRXhpdCwgZXhpdF9jb2RlKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGV4aXRfZG9jLApAQCAtMjI5LDcgKzIyOSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2dldGRlZmF1bHRlbmNvZGluZyhQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCkpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKSk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRkZWZhdWx0ZW5jb2RpbmdfZG9jLApAQCAtMjQyLDEzICsyNDIsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfc2V0ZGVmYXVsdGVuY29kaW5nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICplbmNvZGluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6c2V0ZGVmYXVsdGVuY29kaW5nIiwgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpKQotCSAgICAJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNoYXIgKmVuY29kaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzZXRkZWZhdWx0ZW5jb2RpbmciLCAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldGRlZmF1bHRlbmNvZGluZ19kb2MsCkBAIC0yNjAsMTAgKzI2MCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXRmaWxlc3lzdGVtZW5jb2RpbmcoUHlPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZykKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZ2V0ZmlsZXN5c3RlbWVuY29kaW5nX2RvYywKQEAgLTI4NCwxMTYgKzI4NCwxMTYgQEAKIHN0YXRpYyBpbnQKIHRyYWNlX2luaXQodm9pZCkKIHsKLQlzdGF0aWMgY2hhciAqd2hhdG5hbWVzWzddID0geyJjYWxsIiwgImV4Y2VwdGlvbiIsICJsaW5lIiwgInJldHVybiIsCi0JCQkJCSJjX2NhbGwiLCAiY19leGNlcHRpb24iLCAiY19yZXR1cm4ifTsKLQlQeU9iamVjdCAqbmFtZTsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7Ci0JCWlmICh3aGF0c3RyaW5nc1tpXSA9PSBOVUxMKSB7Ci0JCQluYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyh3aGF0bmFtZXNbaV0pOwotCQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQl3aGF0c3RyaW5nc1tpXSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgfQotCX0KLQlyZXR1cm4gMDsKKyAgICBzdGF0aWMgY2hhciAqd2hhdG5hbWVzWzddID0geyJjYWxsIiwgImV4Y2VwdGlvbiIsICJsaW5lIiwgInJldHVybiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY19jYWxsIiwgImNfZXhjZXB0aW9uIiwgImNfcmV0dXJuIn07CisgICAgUHlPYmplY3QgKm5hbWU7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDc7ICsraSkgeworICAgICAgICBpZiAod2hhdHN0cmluZ3NbaV0gPT0gTlVMTCkgeworICAgICAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcod2hhdG5hbWVzW2ldKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgd2hhdHN0cmluZ3NbaV0gPSBuYW1lOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX3RyYW1wb2xpbmUoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlLCBQeU9iamVjdCogY2FsbGJhY2ssCi0JCVB5RnJhbWVPYmplY3QgKmZyYW1lLCBpbnQgd2hhdCwgUHlPYmplY3QgKmFyZykKKyAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50IHdoYXQsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlPYmplY3QgKmFyZ3MgPSBQeVR1cGxlX05ldygzKTsKLQlQeU9iamVjdCAqd2hhdHN0cjsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMyk7CisgICAgUHlPYmplY3QgKndoYXRzdHI7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihmcmFtZSk7Ci0Jd2hhdHN0ciA9IHdoYXRzdHJpbmdzW3doYXRdOwotCVB5X0lOQ1JFRih3aGF0c3RyKTsKLQlpZiAoYXJnID09IE5VTEwpCi0JCWFyZyA9IFB5X05vbmU7Ci0JUHlfSU5DUkVGKGFyZyk7Ci0JUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCAoUHlPYmplY3QgKilmcmFtZSk7Ci0JUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAxLCB3aGF0c3RyKTsKLQlQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDIsIGFyZyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKGZyYW1lKTsKKyAgICB3aGF0c3RyID0gd2hhdHN0cmluZ3Nbd2hhdF07CisgICAgUHlfSU5DUkVGKHdoYXRzdHIpOworICAgIGlmIChhcmcgPT0gTlVMTCkKKyAgICAgICAgYXJnID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoYXJnKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDAsIChQeU9iamVjdCAqKWZyYW1lKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDEsIHdoYXRzdHIpOworICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMiwgYXJnKTsKIAotCS8qIGNhbGwgdGhlIFB5dGhvbi1sZXZlbCBmdW5jdGlvbiAqLwotCVB5RnJhbWVfRmFzdFRvTG9jYWxzKGZyYW1lKTsKLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChjYWxsYmFjaywgYXJncyk7Ci0JUHlGcmFtZV9Mb2NhbHNUb0Zhc3QoZnJhbWUsIDEpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJUHlUcmFjZUJhY2tfSGVyZShmcmFtZSk7CisgICAgLyogY2FsbCB0aGUgUHl0aG9uLWxldmVsIGZ1bmN0aW9uICovCisgICAgUHlGcmFtZV9GYXN0VG9Mb2NhbHMoZnJhbWUpOworICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNhbGxiYWNrLCBhcmdzKTsKKyAgICBQeUZyYW1lX0xvY2Fsc1RvRmFzdChmcmFtZSwgMSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICBQeVRyYWNlQmFja19IZXJlKGZyYW1lKTsKIAotCS8qIGNsZWFudXAgKi8KLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBjbGVhbnVwICovCisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQKIHByb2ZpbGVfdHJhbXBvbGluZShQeU9iamVjdCAqc2VsZiwgUHlGcmFtZU9iamVjdCAqZnJhbWUsCi0JCSAgIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQorICAgICAgICAgICAgICAgICAgIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IGZyYW1lLT5mX3RzdGF0ZTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IGZyYW1lLT5mX3RzdGF0ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKGFyZyA9PSBOVUxMKQotCQlhcmcgPSBQeV9Ob25lOwotCXJlc3VsdCA9IGNhbGxfdHJhbXBvbGluZSh0c3RhdGUsIHNlbGYsIGZyYW1lLCB3aGF0LCBhcmcpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlQeUV2YWxfU2V0UHJvZmlsZShOVUxMLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgIGFyZyA9IFB5X05vbmU7CisgICAgcmVzdWx0ID0gY2FsbF90cmFtcG9saW5lKHRzdGF0ZSwgc2VsZiwgZnJhbWUsIHdoYXQsIGFyZyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXZhbF9TZXRQcm9maWxlKE5VTEwsIE5VTEwpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiB0cmFjZV90cmFtcG9saW5lKFB5T2JqZWN0ICpzZWxmLCBQeUZyYW1lT2JqZWN0ICpmcmFtZSwKLQkJIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQorICAgICAgICAgICAgICAgICBpbnQgd2hhdCwgUHlPYmplY3QgKmFyZykKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBmcmFtZS0+Zl90c3RhdGU7Ci0JUHlPYmplY3QgKmNhbGxiYWNrOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gZnJhbWUtPmZfdHN0YXRlOworICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKHdoYXQgPT0gUHlUcmFjZV9DQUxMKQotCQljYWxsYmFjayA9IHNlbGY7Ci0JZWxzZQotCQljYWxsYmFjayA9IGZyYW1lLT5mX3RyYWNlOwotCWlmIChjYWxsYmFjayA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXN1bHQgPSBjYWxsX3RyYW1wb2xpbmUodHN0YXRlLCBjYWxsYmFjaywgZnJhbWUsIHdoYXQsIGFyZyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5RXZhbF9TZXRUcmFjZShOVUxMLCBOVUxMKTsKLQkJUHlfWERFQ1JFRihmcmFtZS0+Zl90cmFjZSk7Ci0JCWZyYW1lLT5mX3RyYWNlID0gTlVMTDsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmVzdWx0ICE9IFB5X05vbmUpIHsKLQkJUHlPYmplY3QgKnRlbXAgPSBmcmFtZS0+Zl90cmFjZTsKLQkJZnJhbWUtPmZfdHJhY2UgPSBOVUxMOwotCQlQeV9YREVDUkVGKHRlbXApOwotCQlmcmFtZS0+Zl90cmFjZSA9IHJlc3VsdDsKLQl9Ci0JZWxzZSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAod2hhdCA9PSBQeVRyYWNlX0NBTEwpCisgICAgICAgIGNhbGxiYWNrID0gc2VsZjsKKyAgICBlbHNlCisgICAgICAgIGNhbGxiYWNrID0gZnJhbWUtPmZfdHJhY2U7CisgICAgaWYgKGNhbGxiYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHJlc3VsdCA9IGNhbGxfdHJhbXBvbGluZSh0c3RhdGUsIGNhbGxiYWNrLCBmcmFtZSwgd2hhdCwgYXJnKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFdmFsX1NldFRyYWNlKE5VTEwsIE5VTEwpOworICAgICAgICBQeV9YREVDUkVGKGZyYW1lLT5mX3RyYWNlKTsKKyAgICAgICAgZnJhbWUtPmZfdHJhY2UgPSBOVUxMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyZXN1bHQgIT0gUHlfTm9uZSkgeworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IGZyYW1lLT5mX3RyYWNlOworICAgICAgICBmcmFtZS0+Zl90cmFjZSA9IE5VTEw7CisgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgICAgIGZyYW1lLT5mX3RyYWNlID0gcmVzdWx0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX3NldHRyYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAodHJhY2VfaW5pdCgpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYXJncyA9PSBQeV9Ob25lKQotCQlQeUV2YWxfU2V0VHJhY2UoTlVMTCwgTlVMTCk7Ci0JZWxzZQotCQlQeUV2YWxfU2V0VHJhY2UodHJhY2VfdHJhbXBvbGluZSwgYXJncyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICh0cmFjZV9pbml0KCkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhcmdzID09IFB5X05vbmUpCisgICAgICAgIFB5RXZhbF9TZXRUcmFjZShOVUxMLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICAgIFB5RXZhbF9TZXRUcmFjZSh0cmFjZV90cmFtcG9saW5lLCBhcmdzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXR0cmFjZV9kb2MsCkBAIC00MDYsMTMgKzQwNiwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXR0cmFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqdGVtcCA9IHRzdGF0ZS0+Y190cmFjZW9iajsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICp0ZW1wID0gdHN0YXRlLT5jX3RyYWNlb2JqOwogCi0JaWYgKHRlbXAgPT0gTlVMTCkKLQkJdGVtcCA9IFB5X05vbmU7Ci0JUHlfSU5DUkVGKHRlbXApOwotCXJldHVybiB0ZW1wOworICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIHRlbXAgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRih0ZW1wKTsKKyAgICByZXR1cm4gdGVtcDsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHRyYWNlX2RvYywKQEAgLTQyNSwxNCArNDI1LDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX3NldHByb2ZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICh0cmFjZV9pbml0KCkgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCWlmIChhcmdzID09IFB5X05vbmUpCi0JCVB5RXZhbF9TZXRQcm9maWxlKE5VTEwsIE5VTEwpOwotCWVsc2UKLQkJUHlFdmFsX1NldFByb2ZpbGUocHJvZmlsZV90cmFtcG9saW5lLCBhcmdzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHRyYWNlX2luaXQoKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZ3MgPT0gUHlfTm9uZSkKKyAgICAgICAgUHlFdmFsX1NldFByb2ZpbGUoTlVMTCwgTlVMTCk7CisgICAgZWxzZQorICAgICAgICBQeUV2YWxfU2V0UHJvZmlsZShwcm9maWxlX3RyYW1wb2xpbmUsIGFyZ3MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldHByb2ZpbGVfZG9jLApAQCAtNDQ1LDEzICs0NDUsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0cHJvZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqdGVtcCA9IHRzdGF0ZS0+Y19wcm9maWxlb2JqOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlPYmplY3QgKnRlbXAgPSB0c3RhdGUtPmNfcHJvZmlsZW9iajsKIAotCWlmICh0ZW1wID09IE5VTEwpCi0JCXRlbXAgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRih0ZW1wKTsKLQlyZXR1cm4gdGVtcDsKKyAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICB0ZW1wID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYodGVtcCk7CisgICAgcmV0dXJuIHRlbXA7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRwcm9maWxlX2RvYywKQEAgLTQ2NCwxMCArNDY0LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX3NldGNoZWNraW50ZXJ2YWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRjaGVja2ludGVydmFsIiwgJl9QeV9DaGVja0ludGVydmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRjaGVja2ludGVydmFsIiwgJl9QeV9DaGVja0ludGVydmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2V0Y2hlY2tpbnRlcnZhbF9kb2MsCkBAIC00ODAsNyArNDgwLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0Y2hlY2tpbnRlcnZhbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKF9QeV9DaGVja0ludGVydmFsKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoX1B5X0NoZWNrSW50ZXJ2YWwpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0Y2hlY2tpbnRlcnZhbF9kb2MsCkBAIC00OTEsMTcgKzQ5MSwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19zZXR0c2NkdW1wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYm9vbDsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgIGludCBib29sOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0dHNjZHVtcCIsICZib29sKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGJvb2wpCi0JCXRzdGF0ZS0+aW50ZXJwLT50c2NkdW1wID0gMTsKLQllbHNlCi0JCXRzdGF0ZS0+aW50ZXJwLT50c2NkdW1wID0gMDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldHRzY2R1bXAiLCAmYm9vbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChib29sKQorICAgICAgICB0c3RhdGUtPmludGVycC0+dHNjZHVtcCA9IDE7CisgICAgZWxzZQorICAgICAgICB0c3RhdGUtPmludGVycC0+dHNjZHVtcCA9IDA7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogCiB9CiAKQEAgLTUxNywxNyArNTE3LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX3NldHJlY3Vyc2lvbmxpbWl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbmV3X2xpbWl0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRyZWN1cnNpb25saW1pdCIsICZuZXdfbGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobmV3X2xpbWl0IDw9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInJlY3Vyc2lvbiBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9TZXRSZWN1cnNpb25MaW1pdChuZXdfbGltaXQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbnQgbmV3X2xpbWl0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRyZWN1cnNpb25saW1pdCIsICZuZXdfbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobmV3X2xpbWl0IDw9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVjdXJzaW9uIGxpbWl0IG11c3QgYmUgcG9zaXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1NldFJlY3Vyc2lvbkxpbWl0KG5ld19saW1pdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2V0cmVjdXJzaW9ubGltaXRfZG9jLApAQCAtNTQyLDcgKzU0Miw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2dldHJlY3Vyc2lvbmxpbWl0KFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9HZXRSZWN1cnNpb25MaW1pdCgpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfR2V0UmVjdXJzaW9uTGltaXQoKSk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRyZWN1cnNpb25saW1pdF9kb2MsCkBAIC01NzAsNTIgKzU3MCw1MiBAQAogc3RhdGljIFB5VHlwZU9iamVjdCBXaW5kb3dzVmVyc2lvblR5cGUgPSB7MCwgMCwgMCwgMCwgMCwgMH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0ZpZWxkIHdpbmRvd3NfdmVyc2lvbl9maWVsZHNbXSA9IHsKLQl7Im1ham9yIiwgIk1ham9yIHZlcnNpb24gbnVtYmVyIn0sCi0JeyJtaW5vciIsICJNaW5vciB2ZXJzaW9uIG51bWJlciJ9LAotCXsiYnVpbGQiLCAiQnVpbGQgbnVtYmVyIn0sCi0JeyJwbGF0Zm9ybSIsICJPcGVyYXRpbmcgc3lzdGVtIHBsYXRmb3JtIn0sCi0JeyJzZXJ2aWNlX3BhY2siLCAiTGF0ZXN0IFNlcnZpY2UgUGFjayBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSJ9LAotCXsic2VydmljZV9wYWNrX21ham9yIiwgIlNlcnZpY2UgUGFjayBtYWpvciB2ZXJzaW9uIG51bWJlciJ9LAotCXsic2VydmljZV9wYWNrX21pbm9yIiwgIlNlcnZpY2UgUGFjayBtaW5vciB2ZXJzaW9uIG51bWJlciJ9LAotCXsic3VpdGVfbWFzayIsICJCaXQgbWFzayBpZGVudGlmeWluZyBhdmFpbGFibGUgcHJvZHVjdCBzdWl0ZXMifSwKLQl7InByb2R1Y3RfdHlwZSIsICJTeXN0ZW0gcHJvZHVjdCB0eXBlIn0sCi0JezB9CisgICAgeyJtYWpvciIsICJNYWpvciB2ZXJzaW9uIG51bWJlciJ9LAorICAgIHsibWlub3IiLCAiTWlub3IgdmVyc2lvbiBudW1iZXIifSwKKyAgICB7ImJ1aWxkIiwgIkJ1aWxkIG51bWJlciJ9LAorICAgIHsicGxhdGZvcm0iLCAiT3BlcmF0aW5nIHN5c3RlbSBwbGF0Zm9ybSJ9LAorICAgIHsic2VydmljZV9wYWNrIiwgIkxhdGVzdCBTZXJ2aWNlIFBhY2sgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0ifSwKKyAgICB7InNlcnZpY2VfcGFja19tYWpvciIsICJTZXJ2aWNlIFBhY2sgbWFqb3IgdmVyc2lvbiBudW1iZXIifSwKKyAgICB7InNlcnZpY2VfcGFja19taW5vciIsICJTZXJ2aWNlIFBhY2sgbWlub3IgdmVyc2lvbiBudW1iZXIifSwKKyAgICB7InN1aXRlX21hc2siLCAiQml0IG1hc2sgaWRlbnRpZnlpbmcgYXZhaWxhYmxlIHByb2R1Y3Qgc3VpdGVzIn0sCisgICAgeyJwcm9kdWN0X3R5cGUiLCAiU3lzdGVtIHByb2R1Y3QgdHlwZSJ9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyB3aW5kb3dzX3ZlcnNpb25fZGVzYyA9IHsKLQkic3lzLmdldHdpbmRvd3N2ZXJzaW9uIiwgIC8qIG5hbWUgKi8KLQlnZXR3aW5kb3dzdmVyc2lvbl9kb2MsICAgIC8qIGRvYyAqLwotCXdpbmRvd3NfdmVyc2lvbl9maWVsZHMsICAgLyogZmllbGRzICovCi0JNSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHRoZSBmaXJzdCA1IGl0ZW1zIGFyZSBhY2Nlc3NpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGluZGV4aW5nLCB0aGUgcmVzdCBhcmUgbmFtZSBvbmx5ICovCisgICAgInN5cy5nZXR3aW5kb3dzdmVyc2lvbiIsICAvKiBuYW1lICovCisgICAgZ2V0d2luZG93c3ZlcnNpb25fZG9jLCAgICAvKiBkb2MgKi8KKyAgICB3aW5kb3dzX3ZlcnNpb25fZmllbGRzLCAgIC8qIGZpZWxkcyAqLworICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHRoZSBmaXJzdCA1IGl0ZW1zIGFyZSBhY2Nlc3NpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgaW5kZXhpbmcsIHRoZSByZXN0IGFyZSBuYW1lIG9ubHkgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0d2luZG93c3ZlcnNpb24oUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnZlcnNpb247Ci0JaW50IHBvcyA9IDA7Ci0JT1NWRVJTSU9OSU5GT0VYIHZlcjsKLQl2ZXIuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZih2ZXIpOwotCWlmICghR2V0VmVyc2lvbkV4KChPU1ZFUlNJT05JTkZPKikgJnZlcikpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICBQeU9iamVjdCAqdmVyc2lvbjsKKyAgICBpbnQgcG9zID0gMDsKKyAgICBPU1ZFUlNJT05JTkZPRVggdmVyOworICAgIHZlci5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKHZlcik7CisgICAgaWYgKCFHZXRWZXJzaW9uRXgoKE9TVkVSU0lPTklORk8qKSAmdmVyKSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwogCi0JdmVyc2lvbiA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZXaW5kb3dzVmVyc2lvblR5cGUpOwotCWlmICh2ZXJzaW9uID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHZlcnNpb24gPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmV2luZG93c1ZlcnNpb25UeXBlKTsKKyAgICBpZiAodmVyc2lvbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci5kd01ham9yVmVyc2lvbikpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci5kd01pbm9yVmVyc2lvbikpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci5kd0J1aWxkTnVtYmVyKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2ZXJzaW9uLCBwb3MrKywgUHlJbnRfRnJvbUxvbmcodmVyLmR3UGxhdGZvcm1JZCkpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5U3RyaW5nX0Zyb21TdHJpbmcodmVyLnN6Q1NEVmVyc2lvbikpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci53U2VydmljZVBhY2tNYWpvcikpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci53U2VydmljZVBhY2tNaW5vcikpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci53U3VpdGVNYXNrKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2ZXJzaW9uLCBwb3MrKywgUHlJbnRfRnJvbUxvbmcodmVyLndQcm9kdWN0VHlwZSkpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci5kd01ham9yVmVyc2lvbikpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci5kd01pbm9yVmVyc2lvbikpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci5kd0J1aWxkTnVtYmVyKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2ZXJzaW9uLCBwb3MrKywgUHlJbnRfRnJvbUxvbmcodmVyLmR3UGxhdGZvcm1JZCkpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5U3RyaW5nX0Zyb21TdHJpbmcodmVyLnN6Q1NEVmVyc2lvbikpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci53U2VydmljZVBhY2tNYWpvcikpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci53U2VydmljZVBhY2tNaW5vcikpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbiwgcG9zKyssIFB5SW50X0Zyb21Mb25nKHZlci53U3VpdGVNYXNrKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2ZXJzaW9uLCBwb3MrKywgUHlJbnRfRnJvbUxvbmcodmVyLndQcm9kdWN0VHlwZSkpOwogCi0JcmV0dXJuIHZlcnNpb247CisgICAgcmV0dXJuIHZlcnNpb247CiB9CiAKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCkBAIC02MjQsMTUgKzYyNCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19zZXRkbG9wZW5mbGFncyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG5ld192YWw7Ci0gICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldGRsb3BlbmZsYWdzIiwgJm5ld192YWwpKQotCQlyZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKCF0c3RhdGUpCi0JCXJldHVybiBOVUxMOwotICAgICAgICB0c3RhdGUtPmludGVycC0+ZGxvcGVuZmxhZ3MgPSBuZXdfdmFsOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbnQgbmV3X3ZhbDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRkbG9wZW5mbGFncyIsICZuZXdfdmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCF0c3RhdGUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHRzdGF0ZS0+aW50ZXJwLT5kbG9wZW5mbGFncyA9IG5ld192YWw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2V0ZGxvcGVuZmxhZ3NfZG9jLApAQCAtNjUwLDEwICs2NTAsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0ZGxvcGVuZmxhZ3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotICAgICAgICBpZiAoIXRzdGF0ZSkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh0c3RhdGUtPmludGVycC0+ZGxvcGVuZmxhZ3MpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgaWYgKCF0c3RhdGUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh0c3RhdGUtPmludGVycC0+ZGxvcGVuZmxhZ3MpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0ZGxvcGVuZmxhZ3NfZG9jLApAQCAtNjYyLDcgKzY2Miw3IEBACiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZsYWdzIHRoYXQgYXJlIHVzZWQgZm9yIGRsb3BlbiBjYWxscy5cblwKIFRoZSBmbGFnIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB0aGUgY3R5cGVzIGFuZCBETEZDTiBtb2R1bGVzLiIpOwogCi0jZW5kaWYJLyogSEFWRV9ETE9QRU4gKi8KKyNlbmRpZiAgLyogSEFWRV9ETE9QRU4gKi8KIAogI2lmZGVmIFVTRV9NQUxMT1BUCiAvKiBMaW5rIHdpdGggLWxtYWxsb2MgKG9yIC1sbXBjKSBvbiBhbiBTR0kgKi8KQEAgLTY3MSw3NSArNjcxLDc1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX21kZWJ1ZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZsYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOm1kZWJ1ZyIsICZmbGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWFsbG9wdChNX0RFQlVHLCBmbGFnKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IGZsYWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOm1kZWJ1ZyIsICZmbGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFsbG9wdChNX0RFQlVHLCBmbGFnKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYgLyogVVNFX01BTExPUFQgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXRzaXplb2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlzdGF0aWMgUHlPYmplY3QgKnN0cl9fc2l6ZW9mX18gPSBOVUxMLCAqZ2NfaGVhZF9zaXplID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im9iamVjdCIsICJkZWZhdWx0IiwgMH07Ci0JUHlPYmplY3QgKm8sICpkZmx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnN0cl9fc2l6ZW9mX18gPSBOVUxMLCAqZ2NfaGVhZF9zaXplID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im9iamVjdCIsICJkZWZhdWx0IiwgMH07CisgICAgUHlPYmplY3QgKm8sICpkZmx0ID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86Z2V0c2l6ZW9mIiwKLQkJCQkJIGt3bGlzdCwgJm8sICZkZmx0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98TzpnZXRzaXplb2YiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm8sICZkZmx0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgLyogSW5pdGlhbGl6ZSBzdGF0aWMgdmFyaWFibGUgZm9yIEdDIGhlYWQgc2l6ZSAqLwotCWlmIChnY19oZWFkX3NpemUgPT0gTlVMTCkgewotCQlnY19oZWFkX3NpemUgPSBQeUludF9Gcm9tU3NpemVfdChzaXplb2YoUHlHQ19IZWFkKSk7Ci0JCWlmIChnY19oZWFkX3NpemUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBJbml0aWFsaXplIHN0YXRpYyB2YXJpYWJsZSBmb3IgR0MgaGVhZCBzaXplICovCisgICAgaWYgKGdjX2hlYWRfc2l6ZSA9PSBOVUxMKSB7CisgICAgICAgIGdjX2hlYWRfc2l6ZSA9IFB5SW50X0Zyb21Tc2l6ZV90KHNpemVvZihQeUdDX0hlYWQpKTsKKyAgICAgICAgaWYgKGdjX2hlYWRfc2l6ZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogTWFrZSBzdXJlIHRoZSB0eXBlIGlzIGluaXRpYWxpemVkLiBmbG9hdCBnZXRzIGluaXRpYWxpemVkIGxhdGUgKi8KLQlpZiAoUHlUeXBlX1JlYWR5KFB5X1RZUEUobykpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogTWFrZSBzdXJlIHRoZSB0eXBlIGlzIGluaXRpYWxpemVkLiBmbG9hdCBnZXRzIGluaXRpYWxpemVkIGxhdGUgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KFB5X1RZUEUobykpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBJbnN0YW5jZSBvZiBvbGQtc3R5bGUgY2xhc3MgKi8KLQlpZiAoUHlJbnN0YW5jZV9DaGVjayhvKSkKLQkJcmVzID0gUHlJbnRfRnJvbVNzaXplX3QoUHlJbnN0YW5jZV9UeXBlLnRwX2Jhc2ljc2l6ZSk7Ci0JLyogYWxsIG90aGVyIG9iamVjdHMgKi8KLQllbHNlIHsKLQkJUHlPYmplY3QgKm1ldGhvZCA9IF9QeU9iamVjdF9Mb29rdXBTcGVjaWFsKG8sICJfX3NpemVvZl9fIiwKLQkJCQkJCQkgICAmc3RyX19zaXplb2ZfXyk7Ci0JCWlmIChtZXRob2QgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSAgICAgIlR5cGUgJS4xMDBzIGRvZXNuJ3QgZGVmaW5lIF9fc2l6ZW9mX18iLAotCQkJCQkgICAgIFB5X1RZUEUobyktPnRwX25hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtZXRob2QsIE5VTEwpOwotCQkJUHlfREVDUkVGKG1ldGhvZCk7Ci0JCX0KLQl9Ci0JCi0JLyogSGFzIGEgZGVmYXVsdCB2YWx1ZSBiZWVuIGdpdmVuPyAqLwotCWlmICgocmVzID09IE5VTEwpICYmIChkZmx0ICE9IE5VTEwpICYmCi0JICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLQl7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X0lOQ1JFRihkZmx0KTsKLQkJcmV0dXJuIGRmbHQ7Ci0JfQotCWVsc2UgaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gcmVzOworICAgIC8qIEluc3RhbmNlIG9mIG9sZC1zdHlsZSBjbGFzcyAqLworICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKG8pKQorICAgICAgICByZXMgPSBQeUludF9Gcm9tU3NpemVfdChQeUluc3RhbmNlX1R5cGUudHBfYmFzaWNzaXplKTsKKyAgICAvKiBhbGwgb3RoZXIgb2JqZWN0cyAqLworICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqbWV0aG9kID0gX1B5T2JqZWN0X0xvb2t1cFNwZWNpYWwobywgIl9fc2l6ZW9mX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cl9fc2l6ZW9mX18pOworICAgICAgICBpZiAobWV0aG9kID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHlwZSAlLjEwMHMgZG9lc24ndCBkZWZpbmUgX19zaXplb2ZfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUobyktPnRwX25hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtZXRob2QsIE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKG1ldGhvZCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBhZGQgZ2NfaGVhZCBzaXplICovCi0JaWYgKFB5T2JqZWN0X0lTX0dDKG8pKSB7Ci0JCVB5T2JqZWN0ICp0bXAgPSByZXM7Ci0JCXJlcyA9IFB5TnVtYmVyX0FkZCh0bXAsIGdjX2hlYWRfc2l6ZSk7Ci0JCVB5X0RFQ1JFRih0bXApOwotCX0KLQlyZXR1cm4gcmVzOworICAgIC8qIEhhcyBhIGRlZmF1bHQgdmFsdWUgYmVlbiBnaXZlbj8gKi8KKyAgICBpZiAoKHJlcyA9PSBOVUxMKSAmJiAoZGZsdCAhPSBOVUxMKSAmJgorICAgICAgICBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisgICAgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9JTkNSRUYoZGZsdCk7CisgICAgICAgIHJldHVybiBkZmx0OworICAgIH0KKyAgICBlbHNlIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIC8qIGFkZCBnY19oZWFkIHNpemUgKi8KKyAgICBpZiAoUHlPYmplY3RfSVNfR0MobykpIHsKKyAgICAgICAgUHlPYmplY3QgKnRtcCA9IHJlczsKKyAgICAgICAgcmVzID0gUHlOdW1iZXJfQWRkKHRtcCwgZ2NfaGVhZF9zaXplKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRzaXplb2ZfZG9jLApAQCAtNzUwLDE0ICs3NTAsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0cmVmY291bnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGFyZy0+b2JfcmVmY250KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoYXJnLT5vYl9yZWZjbnQpOwogfQogCiAjaWZkZWYgUHlfUkVGX0RFQlVHCiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2dldHRvdGFscmVmY291bnQoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KF9QeV9HZXRSZWZUb3RhbCgpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoX1B5X0dldFJlZlRvdGFsKCkpOwogfQogI2VuZGlmIC8qIFB5X1JFRl9ERUJVRyAqLwogCkBAIC03NzMsOSArNzczLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0Y291bnRzKFB5T2JqZWN0ICpzZWxmKQogewotCWV4dGVybiBQeU9iamVjdCAqZ2V0X2NvdW50cyh2b2lkKTsKKyAgICBleHRlcm4gUHlPYmplY3QgKmdldF9jb3VudHModm9pZCk7CiAKLQlyZXR1cm4gZ2V0X2NvdW50cygpOworICAgIHJldHVybiBnZXRfY291bnRzKCk7CiB9CiAjZW5kaWYKIApAQCAtNzk0LDIzICs3OTQsMjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0ZnJhbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5RnJhbWVPYmplY3QgKmYgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5mcmFtZTsKLQlpbnQgZGVwdGggPSAtMTsKKyAgICBQeUZyYW1lT2JqZWN0ICpmID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+ZnJhbWU7CisgICAgaW50IGRlcHRoID0gLTE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOl9nZXRmcmFtZSIsICZkZXB0aCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X2dldGZyYW1lIiwgJmRlcHRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoZGVwdGggPiAwICYmIGYgIT0gTlVMTCkgewotCQlmID0gZi0+Zl9iYWNrOwotCQktLWRlcHRoOwotCX0KLQlpZiAoZiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjYWxsIHN0YWNrIGlzIG5vdCBkZWVwIGVub3VnaCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGYpOwotCXJldHVybiAoUHlPYmplY3QqKWY7CisgICAgd2hpbGUgKGRlcHRoID4gMCAmJiBmICE9IE5VTEwpIHsKKyAgICAgICAgZiA9IGYtPmZfYmFjazsKKyAgICAgICAgLS1kZXB0aDsKKyAgICB9CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsIHN0YWNrIGlzIG5vdCBkZWVwIGVub3VnaCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKGYpOworICAgIHJldHVybiAoUHlPYmplY3QqKWY7CiB9CiAKIFB5RG9jX1NUUlZBUihjdXJyZW50X2ZyYW1lc19kb2MsCkBAIC04MjUsNyArODI1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfY3VycmVudF9mcmFtZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JcmV0dXJuIF9QeVRocmVhZF9DdXJyZW50RnJhbWVzKCk7CisgICAgcmV0dXJuIF9QeVRocmVhZF9DdXJyZW50RnJhbWVzKCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjYWxsX3RyYWNpbmdfZG9jLApAQCAtODM5LDEwICs4MzksMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfY2FsbF90cmFjaW5nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZnVuYywgKmZ1bmNhcmdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08hOmNhbGxfdHJhY2luZyIsICZmdW5jLCAmUHlUdXBsZV9UeXBlLCAmZnVuY2FyZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gX1B5RXZhbF9DYWxsVHJhY2luZyhmdW5jLCBmdW5jYXJncyk7CisgICAgUHlPYmplY3QgKmZ1bmMsICpmdW5jYXJnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PITpjYWxsX3RyYWNpbmciLCAmZnVuYywgJlB5VHVwbGVfVHlwZSwgJmZ1bmNhcmdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIF9QeUV2YWxfQ2FsbFRyYWNpbmcoZnVuYywgZnVuY2FyZ3MpOwogfQogCiBQeURvY19TVFJWQVIoY2FsbHN0YXRzX2RvYywKQEAgLTg4OSw4ICs4ODksOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19jbGVhcl90eXBlX2NhY2hlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlQeVR5cGVfQ2xlYXJDYWNoZSgpOwotCVB5X1JFVFVSTl9OT05FOworICAgIFB5VHlwZV9DbGVhckNhY2hlKCk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihzeXNfY2xlYXJfdHlwZV9jYWNoZV9fZG9jX18sCkBAIC04OTksMTA1ICs4OTksMTA1IEBACiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIHN5c19tZXRob2RzW10gPSB7Ci0JLyogTWlnaHQgYXMgd2VsbCBrZWVwIHRoaXMgaW4gYWxwaGFiZXRpYyBvcmRlciAqLwotCXsiY2FsbHN0YXRzIiwgKFB5Q0Z1bmN0aW9uKVB5RXZhbF9HZXRDYWxsU3RhdHMsIE1FVEhfTk9BUkdTLAotCSBjYWxsc3RhdHNfZG9jfSwKLQl7Il9jbGVhcl90eXBlX2NhY2hlIiwJc3lzX2NsZWFyX3R5cGVfY2FjaGUsCSAgTUVUSF9OT0FSR1MsCi0JIHN5c19jbGVhcl90eXBlX2NhY2hlX19kb2NfX30sCi0JeyJfY3VycmVudF9mcmFtZXMiLCBzeXNfY3VycmVudF9mcmFtZXMsIE1FVEhfTk9BUkdTLAotCSBjdXJyZW50X2ZyYW1lc19kb2N9LAotCXsiZGlzcGxheWhvb2siLAlzeXNfZGlzcGxheWhvb2ssIE1FVEhfTywgZGlzcGxheWhvb2tfZG9jfSwKLQl7ImV4Y19pbmZvIiwJc3lzX2V4Y19pbmZvLCBNRVRIX05PQVJHUywgZXhjX2luZm9fZG9jfSwKLQl7ImV4Y19jbGVhciIsCXN5c19leGNfY2xlYXIsIE1FVEhfTk9BUkdTLCBleGNfY2xlYXJfZG9jfSwKLQl7ImV4Y2VwdGhvb2siLAlzeXNfZXhjZXB0aG9vaywgTUVUSF9WQVJBUkdTLCBleGNlcHRob29rX2RvY30sCi0JeyJleGl0IiwJc3lzX2V4aXQsIE1FVEhfVkFSQVJHUywgZXhpdF9kb2N9LAorICAgIC8qIE1pZ2h0IGFzIHdlbGwga2VlcCB0aGlzIGluIGFscGhhYmV0aWMgb3JkZXIgKi8KKyAgICB7ImNhbGxzdGF0cyIsIChQeUNGdW5jdGlvbilQeUV2YWxfR2V0Q2FsbFN0YXRzLCBNRVRIX05PQVJHUywKKyAgICAgY2FsbHN0YXRzX2RvY30sCisgICAgeyJfY2xlYXJfdHlwZV9jYWNoZSIsICAgICAgIHN5c19jbGVhcl90eXBlX2NhY2hlLCAgICAgTUVUSF9OT0FSR1MsCisgICAgIHN5c19jbGVhcl90eXBlX2NhY2hlX19kb2NfX30sCisgICAgeyJfY3VycmVudF9mcmFtZXMiLCBzeXNfY3VycmVudF9mcmFtZXMsIE1FVEhfTk9BUkdTLAorICAgICBjdXJyZW50X2ZyYW1lc19kb2N9LAorICAgIHsiZGlzcGxheWhvb2siLCAgICAgc3lzX2Rpc3BsYXlob29rLCBNRVRIX08sIGRpc3BsYXlob29rX2RvY30sCisgICAgeyJleGNfaW5mbyIsICAgICAgICBzeXNfZXhjX2luZm8sIE1FVEhfTk9BUkdTLCBleGNfaW5mb19kb2N9LAorICAgIHsiZXhjX2NsZWFyIiwgICAgICAgc3lzX2V4Y19jbGVhciwgTUVUSF9OT0FSR1MsIGV4Y19jbGVhcl9kb2N9LAorICAgIHsiZXhjZXB0aG9vayIsICAgICAgc3lzX2V4Y2VwdGhvb2ssIE1FVEhfVkFSQVJHUywgZXhjZXB0aG9va19kb2N9LAorICAgIHsiZXhpdCIsICAgICAgICAgICAgc3lzX2V4aXQsIE1FVEhfVkFSQVJHUywgZXhpdF9kb2N9LAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQl7ImdldGRlZmF1bHRlbmNvZGluZyIsIChQeUNGdW5jdGlvbilzeXNfZ2V0ZGVmYXVsdGVuY29kaW5nLAotCSBNRVRIX05PQVJHUywgZ2V0ZGVmYXVsdGVuY29kaW5nX2RvY30sCisgICAgeyJnZXRkZWZhdWx0ZW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pc3lzX2dldGRlZmF1bHRlbmNvZGluZywKKyAgICAgTUVUSF9OT0FSR1MsIGdldGRlZmF1bHRlbmNvZGluZ19kb2N9LAogI2VuZGlmCiAjaWZkZWYgSEFWRV9ETE9QRU4KLQl7ImdldGRsb3BlbmZsYWdzIiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXRkbG9wZW5mbGFncywgTUVUSF9OT0FSR1MsCi0JIGdldGRsb3BlbmZsYWdzX2RvY30sCisgICAgeyJnZXRkbG9wZW5mbGFncyIsIChQeUNGdW5jdGlvbilzeXNfZ2V0ZGxvcGVuZmxhZ3MsIE1FVEhfTk9BUkdTLAorICAgICBnZXRkbG9wZW5mbGFnc19kb2N9LAogI2VuZGlmCiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JeyJnZXRjb3VudHMiLAkoUHlDRnVuY3Rpb24pc3lzX2dldGNvdW50cywgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0Y291bnRzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXN5c19nZXRjb3VudHMsIE1FVEhfTk9BUkdTfSwKICNlbmRpZgogI2lmZGVmIERZTkFNSUNfRVhFQ1VUSU9OX1BST0ZJTEUKLQl7ImdldGR4cCIsCV9QeV9HZXREWFByb2ZpbGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRkeHAiLCAgICAgICAgICBfUHlfR2V0RFhQcm9maWxlLCBNRVRIX1ZBUkFSR1N9LAogI2VuZGlmCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCXsiZ2V0ZmlsZXN5c3RlbWVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXRmaWxlc3lzdGVtZW5jb2RpbmcsCi0JIE1FVEhfTk9BUkdTLCBnZXRmaWxlc3lzdGVtZW5jb2RpbmdfZG9jfSwKKyAgICB7ImdldGZpbGVzeXN0ZW1lbmNvZGluZyIsIChQeUNGdW5jdGlvbilzeXNfZ2V0ZmlsZXN5c3RlbWVuY29kaW5nLAorICAgICBNRVRIX05PQVJHUywgZ2V0ZmlsZXN5c3RlbWVuY29kaW5nX2RvY30sCiAjZW5kaWYKICNpZmRlZiBQeV9UUkFDRV9SRUZTCi0JeyJnZXRvYmplY3RzIiwJX1B5X0dldE9iamVjdHMsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRvYmplY3RzIiwgICAgICBfUHlfR2V0T2JqZWN0cywgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgogI2lmZGVmIFB5X1JFRl9ERUJVRwotCXsiZ2V0dG90YWxyZWZjb3VudCIsIChQeUNGdW5jdGlvbilzeXNfZ2V0dG90YWxyZWZjb3VudCwgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0dG90YWxyZWZjb3VudCIsIChQeUNGdW5jdGlvbilzeXNfZ2V0dG90YWxyZWZjb3VudCwgTUVUSF9OT0FSR1N9LAogI2VuZGlmCi0JeyJnZXRyZWZjb3VudCIsCShQeUNGdW5jdGlvbilzeXNfZ2V0cmVmY291bnQsIE1FVEhfTywgZ2V0cmVmY291bnRfZG9jfSwKLQl7ImdldHJlY3Vyc2lvbmxpbWl0IiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXRyZWN1cnNpb25saW1pdCwgTUVUSF9OT0FSR1MsCi0JIGdldHJlY3Vyc2lvbmxpbWl0X2RvY30sCi0JeyJnZXRzaXplb2YiLCAgIChQeUNGdW5jdGlvbilzeXNfZ2V0c2l6ZW9mLAotCSBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBnZXRzaXplb2ZfZG9jfSwKLQl7Il9nZXRmcmFtZSIsIHN5c19nZXRmcmFtZSwgTUVUSF9WQVJBUkdTLCBnZXRmcmFtZV9kb2N9LAorICAgIHsiZ2V0cmVmY291bnQiLCAgICAgKFB5Q0Z1bmN0aW9uKXN5c19nZXRyZWZjb3VudCwgTUVUSF9PLCBnZXRyZWZjb3VudF9kb2N9LAorICAgIHsiZ2V0cmVjdXJzaW9ubGltaXQiLCAoUHlDRnVuY3Rpb24pc3lzX2dldHJlY3Vyc2lvbmxpbWl0LCBNRVRIX05PQVJHUywKKyAgICAgZ2V0cmVjdXJzaW9ubGltaXRfZG9jfSwKKyAgICB7ImdldHNpemVvZiIsICAgKFB5Q0Z1bmN0aW9uKXN5c19nZXRzaXplb2YsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGdldHNpemVvZl9kb2N9LAorICAgIHsiX2dldGZyYW1lIiwgc3lzX2dldGZyYW1lLCBNRVRIX1ZBUkFSR1MsIGdldGZyYW1lX2RvY30sCiAjaWZkZWYgTVNfV0lORE9XUwotCXsiZ2V0d2luZG93c3ZlcnNpb24iLCAoUHlDRnVuY3Rpb24pc3lzX2dldHdpbmRvd3N2ZXJzaW9uLCBNRVRIX05PQVJHUywKLQkgZ2V0d2luZG93c3ZlcnNpb25fZG9jfSwKKyAgICB7ImdldHdpbmRvd3N2ZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXR3aW5kb3dzdmVyc2lvbiwgTUVUSF9OT0FSR1MsCisgICAgIGdldHdpbmRvd3N2ZXJzaW9uX2RvY30sCiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogI2lmZGVmIFVTRV9NQUxMT1BUCi0JeyJtZGVidWciLAlzeXNfbWRlYnVnLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsibWRlYnVnIiwgICAgICAgICAgc3lzX21kZWJ1ZywgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQl7InNldGRlZmF1bHRlbmNvZGluZyIsIHN5c19zZXRkZWZhdWx0ZW5jb2RpbmcsIE1FVEhfVkFSQVJHUywKLQkgc2V0ZGVmYXVsdGVuY29kaW5nX2RvY30sCisgICAgeyJzZXRkZWZhdWx0ZW5jb2RpbmciLCBzeXNfc2V0ZGVmYXVsdGVuY29kaW5nLCBNRVRIX1ZBUkFSR1MsCisgICAgIHNldGRlZmF1bHRlbmNvZGluZ19kb2N9LAogI2VuZGlmCi0JeyJzZXRjaGVja2ludGVydmFsIiwJc3lzX3NldGNoZWNraW50ZXJ2YWwsIE1FVEhfVkFSQVJHUywKLQkgc2V0Y2hlY2tpbnRlcnZhbF9kb2N9LAotCXsiZ2V0Y2hlY2tpbnRlcnZhbCIsCXN5c19nZXRjaGVja2ludGVydmFsLCBNRVRIX05PQVJHUywKLQkgZ2V0Y2hlY2tpbnRlcnZhbF9kb2N9LAorICAgIHsic2V0Y2hlY2tpbnRlcnZhbCIsICAgICAgICBzeXNfc2V0Y2hlY2tpbnRlcnZhbCwgTUVUSF9WQVJBUkdTLAorICAgICBzZXRjaGVja2ludGVydmFsX2RvY30sCisgICAgeyJnZXRjaGVja2ludGVydmFsIiwgICAgICAgIHN5c19nZXRjaGVja2ludGVydmFsLCBNRVRIX05PQVJHUywKKyAgICAgZ2V0Y2hlY2tpbnRlcnZhbF9kb2N9LAogI2lmZGVmIEhBVkVfRExPUEVOCi0JeyJzZXRkbG9wZW5mbGFncyIsIHN5c19zZXRkbG9wZW5mbGFncywgTUVUSF9WQVJBUkdTLAotCSBzZXRkbG9wZW5mbGFnc19kb2N9LAorICAgIHsic2V0ZGxvcGVuZmxhZ3MiLCBzeXNfc2V0ZGxvcGVuZmxhZ3MsIE1FVEhfVkFSQVJHUywKKyAgICAgc2V0ZGxvcGVuZmxhZ3NfZG9jfSwKICNlbmRpZgotCXsic2V0cHJvZmlsZSIsCXN5c19zZXRwcm9maWxlLCBNRVRIX08sIHNldHByb2ZpbGVfZG9jfSwKLQl7ImdldHByb2ZpbGUiLAlzeXNfZ2V0cHJvZmlsZSwgTUVUSF9OT0FSR1MsIGdldHByb2ZpbGVfZG9jfSwKLQl7InNldHJlY3Vyc2lvbmxpbWl0Iiwgc3lzX3NldHJlY3Vyc2lvbmxpbWl0LCBNRVRIX1ZBUkFSR1MsCi0JIHNldHJlY3Vyc2lvbmxpbWl0X2RvY30sCisgICAgeyJzZXRwcm9maWxlIiwgICAgICBzeXNfc2V0cHJvZmlsZSwgTUVUSF9PLCBzZXRwcm9maWxlX2RvY30sCisgICAgeyJnZXRwcm9maWxlIiwgICAgICBzeXNfZ2V0cHJvZmlsZSwgTUVUSF9OT0FSR1MsIGdldHByb2ZpbGVfZG9jfSwKKyAgICB7InNldHJlY3Vyc2lvbmxpbWl0Iiwgc3lzX3NldHJlY3Vyc2lvbmxpbWl0LCBNRVRIX1ZBUkFSR1MsCisgICAgIHNldHJlY3Vyc2lvbmxpbWl0X2RvY30sCiAjaWZkZWYgV0lUSF9UU0MKLQl7InNldHRzY2R1bXAiLCBzeXNfc2V0dHNjZHVtcCwgTUVUSF9WQVJBUkdTLCBzZXR0c2NkdW1wX2RvY30sCisgICAgeyJzZXR0c2NkdW1wIiwgc3lzX3NldHRzY2R1bXAsIE1FVEhfVkFSQVJHUywgc2V0dHNjZHVtcF9kb2N9LAogI2VuZGlmCi0JeyJzZXR0cmFjZSIsCXN5c19zZXR0cmFjZSwgTUVUSF9PLCBzZXR0cmFjZV9kb2N9LAotCXsiZ2V0dHJhY2UiLAlzeXNfZ2V0dHJhY2UsIE1FVEhfTk9BUkdTLCBnZXR0cmFjZV9kb2N9LAotCXsiY2FsbF90cmFjaW5nIiwgc3lzX2NhbGxfdHJhY2luZywgTUVUSF9WQVJBUkdTLCBjYWxsX3RyYWNpbmdfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsic2V0dHJhY2UiLCAgICAgICAgc3lzX3NldHRyYWNlLCBNRVRIX08sIHNldHRyYWNlX2RvY30sCisgICAgeyJnZXR0cmFjZSIsICAgICAgICBzeXNfZ2V0dHJhY2UsIE1FVEhfTk9BUkdTLCBnZXR0cmFjZV9kb2N9LAorICAgIHsiY2FsbF90cmFjaW5nIiwgc3lzX2NhbGxfdHJhY2luZywgTUVUSF9WQVJBUkdTLCBjYWxsX3RyYWNpbmdfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfYnVpbHRpbl9tb2R1bGVfbmFtZXModm9pZCkKIHsKLQlQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaW50IGk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgUHlJbXBvcnRfSW5pdHRhYltpXS5uYW1lICE9IE5VTEw7IGkrKykgewotCQlQeU9iamVjdCAqbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoCi0JCQlQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCVB5TGlzdF9BcHBlbmQobGlzdCwgbmFtZSk7Ci0JCVB5X0RFQ1JFRihuYW1lKTsKLQl9Ci0JaWYgKFB5TGlzdF9Tb3J0KGxpc3QpICE9IDApIHsKLQkJUHlfREVDUkVGKGxpc3QpOwotCQlsaXN0ID0gTlVMTDsKLQl9Ci0JaWYgKGxpc3QpIHsKLQkJUHlPYmplY3QgKnYgPSBQeUxpc3RfQXNUdXBsZShsaXN0KTsKLQkJUHlfREVDUkVGKGxpc3QpOwotCQlsaXN0ID0gdjsKLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgUHlPYmplY3QgKmxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgIGludCBpOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IFB5SW1wb3J0X0luaXR0YWJbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKAorICAgICAgICAgICAgUHlJbXBvcnRfSW5pdHRhYltpXS5uYW1lKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBQeUxpc3RfQXBwZW5kKGxpc3QsIG5hbWUpOworICAgICAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgfQorICAgIGlmIChQeUxpc3RfU29ydChsaXN0KSAhPSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgbGlzdCA9IE5VTEw7CisgICAgfQorICAgIGlmIChsaXN0KSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlMaXN0X0FzVHVwbGUobGlzdCk7CisgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgbGlzdCA9IHY7CisgICAgfQorICAgIHJldHVybiBsaXN0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKndhcm5vcHRpb25zID0gTlVMTDsKQEAgLTEwMDUsMjcgKzEwMDUsMjcgQEAKIHZvaWQKIFB5U3lzX1Jlc2V0V2Fybk9wdGlvbnModm9pZCkKIHsKLQlpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHdhcm5vcHRpb25zKSkKLQkJcmV0dXJuOwotCVB5TGlzdF9TZXRTbGljZSh3YXJub3B0aW9ucywgMCwgUHlMaXN0X0dFVF9TSVpFKHdhcm5vcHRpb25zKSwgTlVMTCk7CisgICAgaWYgKHdhcm5vcHRpb25zID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh3YXJub3B0aW9ucykpCisgICAgICAgIHJldHVybjsKKyAgICBQeUxpc3RfU2V0U2xpY2Uod2Fybm9wdGlvbnMsIDAsIFB5TGlzdF9HRVRfU0laRSh3YXJub3B0aW9ucyksIE5VTEwpOwogfQogCiB2b2lkCiBQeVN5c19BZGRXYXJuT3B0aW9uKGNoYXIgKnMpCiB7Ci0JUHlPYmplY3QgKnN0cjsKKyAgICBQeU9iamVjdCAqc3RyOwogCi0JaWYgKHdhcm5vcHRpb25zID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh3YXJub3B0aW9ucykpIHsKLQkJUHlfWERFQ1JFRih3YXJub3B0aW9ucyk7Ci0JCXdhcm5vcHRpb25zID0gUHlMaXN0X05ldygwKTsKLQkJaWYgKHdhcm5vcHRpb25zID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JfQotCXN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7Ci0JaWYgKHN0ciAhPSBOVUxMKSB7Ci0JCVB5TGlzdF9BcHBlbmQod2Fybm9wdGlvbnMsIHN0cik7Ci0JCVB5X0RFQ1JFRihzdHIpOwotCX0KKyAgICBpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHdhcm5vcHRpb25zKSkgeworICAgICAgICBQeV9YREVDUkVGKHdhcm5vcHRpb25zKTsKKyAgICAgICAgd2Fybm9wdGlvbnMgPSBQeUxpc3RfTmV3KDApOworICAgICAgICBpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgUHlMaXN0X0FwcGVuZCh3YXJub3B0aW9ucywgc3RyKTsKKyAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgfQogfQogCiBpbnQKQEAgLTExNTQsNjkgKzExNTQsNjkgQEAKIHN0YXRpYyB2b2lkCiBzdm52ZXJzaW9uX2luaXQodm9pZCkKIHsKLQljb25zdCBjaGFyICpweXRob24sICpicl9zdGFydCwgKmJyX2VuZCwgKmJyX2VuZDIsICpzdm52ZXJzaW9uOwotCVB5X3NzaXplX3QgbGVuOwotCWludCBpc3RhZzsKKyAgICBjb25zdCBjaGFyICpweXRob24sICpicl9zdGFydCwgKmJyX2VuZCwgKmJyX2VuZDIsICpzdm52ZXJzaW9uOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGludCBpc3RhZzsKIAotCWlmIChzdm5faW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKKyAgICBpZiAoc3ZuX2luaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CiAKLQlweXRob24gPSBzdHJzdHIoaGVhZHVybCwgIi9weXRob24vIik7Ci0JaWYgKCFweXRob24pIHsKLQkJLyogWFhYIHF1aWNrIGhhY2sgdG8gZ2V0IGJ6ciB3b3JraW5nICovCi0JCSpwYXRjaGxldmVsX3JldmlzaW9uID0gJ1wwJzsKLQkJc3RyY3B5KGJyYW5jaCwgIiIpOwotCQlzdHJjcHkoc2hvcnRicmFuY2gsICJ1bmtub3duIik7Ci0JCXN2bl9yZXZpc2lvbiA9ICIiOwotCQlyZXR1cm47Ci0JCS8qIFB5X0ZhdGFsRXJyb3IoInN1YnZlcnNpb24ga2V5d29yZHMgbWlzc2luZyIpOyAqLwotCX0KKyAgICBweXRob24gPSBzdHJzdHIoaGVhZHVybCwgIi9weXRob24vIik7CisgICAgaWYgKCFweXRob24pIHsKKyAgICAgICAgLyogWFhYIHF1aWNrIGhhY2sgdG8gZ2V0IGJ6ciB3b3JraW5nICovCisgICAgICAgICpwYXRjaGxldmVsX3JldmlzaW9uID0gJ1wwJzsKKyAgICAgICAgc3RyY3B5KGJyYW5jaCwgIiIpOworICAgICAgICBzdHJjcHkoc2hvcnRicmFuY2gsICJ1bmtub3duIik7CisgICAgICAgIHN2bl9yZXZpc2lvbiA9ICIiOworICAgICAgICByZXR1cm47CisgICAgICAgIC8qIFB5X0ZhdGFsRXJyb3IoInN1YnZlcnNpb24ga2V5d29yZHMgbWlzc2luZyIpOyAqLworICAgIH0KIAotCWJyX3N0YXJ0ID0gcHl0aG9uICsgODsKLQlicl9lbmQgPSBzdHJjaHIoYnJfc3RhcnQsICcvJyk7Ci0JYXNzZXJ0KGJyX2VuZCk7CisgICAgYnJfc3RhcnQgPSBweXRob24gKyA4OworICAgIGJyX2VuZCA9IHN0cmNocihicl9zdGFydCwgJy8nKTsKKyAgICBhc3NlcnQoYnJfZW5kKTsKIAotCS8qIFdvcmtzIGV2ZW4gZm9yIHRydW5rLAotCSAgIGFzIHdlIGFyZSBpbiB0cnVuay9QeXRob24vc3lzbW9kdWxlLmMgKi8KLQlicl9lbmQyID0gc3RyY2hyKGJyX2VuZCsxLCAnLycpOworICAgIC8qIFdvcmtzIGV2ZW4gZm9yIHRydW5rLAorICAgICAgIGFzIHdlIGFyZSBpbiB0cnVuay9QeXRob24vc3lzbW9kdWxlLmMgKi8KKyAgICBicl9lbmQyID0gc3RyY2hyKGJyX2VuZCsxLCAnLycpOwogCi0JaXN0YWcgPSBzdHJuY21wKGJyX3N0YXJ0LCAidGFncyIsIDQpID09IDA7Ci0JaWYgKHN0cm5jbXAoYnJfc3RhcnQsICJ0cnVuayIsIDUpID09IDApIHsKLQkJc3RyY3B5KGJyYW5jaCwgInRydW5rIik7Ci0JCXN0cmNweShzaG9ydGJyYW5jaCwgInRydW5rIik7CisgICAgaXN0YWcgPSBzdHJuY21wKGJyX3N0YXJ0LCAidGFncyIsIDQpID09IDA7CisgICAgaWYgKHN0cm5jbXAoYnJfc3RhcnQsICJ0cnVuayIsIDUpID09IDApIHsKKyAgICAgICAgc3RyY3B5KGJyYW5jaCwgInRydW5rIik7CisgICAgICAgIHN0cmNweShzaG9ydGJyYW5jaCwgInRydW5rIik7CiAKLQl9Ci0JZWxzZSBpZiAoaXN0YWcgfHwgc3RybmNtcChicl9zdGFydCwgImJyYW5jaGVzIiwgOCkgPT0gMCkgewotCQlsZW4gPSBicl9lbmQyIC0gYnJfc3RhcnQ7Ci0JCXN0cm5jcHkoYnJhbmNoLCBicl9zdGFydCwgbGVuKTsKLQkJYnJhbmNoW2xlbl0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlIGlmIChpc3RhZyB8fCBzdHJuY21wKGJyX3N0YXJ0LCAiYnJhbmNoZXMiLCA4KSA9PSAwKSB7CisgICAgICAgIGxlbiA9IGJyX2VuZDIgLSBicl9zdGFydDsKKyAgICAgICAgc3RybmNweShicmFuY2gsIGJyX3N0YXJ0LCBsZW4pOworICAgICAgICBicmFuY2hbbGVuXSA9ICdcMCc7CiAKLQkJbGVuID0gYnJfZW5kMiAtIChicl9lbmQgKyAxKTsKLQkJc3RybmNweShzaG9ydGJyYW5jaCwgYnJfZW5kICsgMSwgbGVuKTsKLQkJc2hvcnRicmFuY2hbbGVuXSA9ICdcMCc7Ci0JfQotCWVsc2UgewotCQlQeV9GYXRhbEVycm9yKCJiYWQgSGVhZFVSTCIpOyAKLQkJcmV0dXJuOwotCX0KKyAgICAgICAgbGVuID0gYnJfZW5kMiAtIChicl9lbmQgKyAxKTsKKyAgICAgICAgc3RybmNweShzaG9ydGJyYW5jaCwgYnJfZW5kICsgMSwgbGVuKTsKKyAgICAgICAgc2hvcnRicmFuY2hbbGVuXSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9GYXRhbEVycm9yKCJiYWQgSGVhZFVSTCIpOworICAgICAgICByZXR1cm47CisgICAgfQogCiAKLQlzdm52ZXJzaW9uID0gX1B5X3N2bnZlcnNpb24oKTsKLQlpZiAoc3RyY21wKHN2bnZlcnNpb24sICJVbnZlcnNpb25lZCBkaXJlY3RvcnkiKSAhPSAwICYmIHN0cmNtcChzdm52ZXJzaW9uLCAiZXhwb3J0ZWQiKSAhPSAwKQotCQlzdm5fcmV2aXNpb24gPSBzdm52ZXJzaW9uOwotCWVsc2UgaWYgKGlzdGFnKSB7Ci0JCWxlbiA9IHN0cmxlbihfcGF0Y2hsZXZlbF9yZXZpc2lvbik7Ci0JCWFzc2VydChsZW4gPj0gMTMpOwotCQlhc3NlcnQobGVuIDwgKHNpemVvZihwYXRjaGxldmVsX3JldmlzaW9uKSArIDEzKSk7Ci0JCXN0cm5jcHkocGF0Y2hsZXZlbF9yZXZpc2lvbiwgX3BhdGNobGV2ZWxfcmV2aXNpb24gKyAxMSwKLQkJCWxlbiAtIDEzKTsKLQkJcGF0Y2hsZXZlbF9yZXZpc2lvbltsZW4gLSAxM10gPSAnXDAnOwotCQlzdm5fcmV2aXNpb24gPSBwYXRjaGxldmVsX3JldmlzaW9uOwotCX0KLQllbHNlCi0JCXN2bl9yZXZpc2lvbiA9ICIiOworICAgIHN2bnZlcnNpb24gPSBfUHlfc3ZudmVyc2lvbigpOworICAgIGlmIChzdHJjbXAoc3ZudmVyc2lvbiwgIlVudmVyc2lvbmVkIGRpcmVjdG9yeSIpICE9IDAgJiYgc3RyY21wKHN2bnZlcnNpb24sICJleHBvcnRlZCIpICE9IDApCisgICAgICAgIHN2bl9yZXZpc2lvbiA9IHN2bnZlcnNpb247CisgICAgZWxzZSBpZiAoaXN0YWcpIHsKKyAgICAgICAgbGVuID0gc3RybGVuKF9wYXRjaGxldmVsX3JldmlzaW9uKTsKKyAgICAgICAgYXNzZXJ0KGxlbiA+PSAxMyk7CisgICAgICAgIGFzc2VydChsZW4gPCAoc2l6ZW9mKHBhdGNobGV2ZWxfcmV2aXNpb24pICsgMTMpKTsKKyAgICAgICAgc3RybmNweShwYXRjaGxldmVsX3JldmlzaW9uLCBfcGF0Y2hsZXZlbF9yZXZpc2lvbiArIDExLAorICAgICAgICAgICAgbGVuIC0gMTMpOworICAgICAgICBwYXRjaGxldmVsX3JldmlzaW9uW2xlbiAtIDEzXSA9ICdcMCc7CisgICAgICAgIHN2bl9yZXZpc2lvbiA9IHBhdGNobGV2ZWxfcmV2aXNpb247CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3ZuX3JldmlzaW9uID0gIiI7CiAKLQlzdm5faW5pdGlhbGl6ZWQgPSAxOworICAgIHN2bl9pbml0aWFsaXplZCA9IDE7CiB9CiAKIC8qIFJldHVybiBzdm52ZXJzaW9uIG91dHB1dCBpZiBhdmFpbGFibGUuCkBAIC0xMjI1LDE1ICsxMjI1LDE1IEBACiBjb25zdCBjaGFyKgogUHlfU3VidmVyc2lvblJldmlzaW9uKCkKIHsKLQlzdm52ZXJzaW9uX2luaXQoKTsKLQlyZXR1cm4gc3ZuX3JldmlzaW9uOworICAgIHN2bnZlcnNpb25faW5pdCgpOworICAgIHJldHVybiBzdm5fcmV2aXNpb247CiB9CiAKIGNvbnN0IGNoYXIqCiBQeV9TdWJ2ZXJzaW9uU2hvcnRCcmFuY2goKQogewotCXN2bnZlcnNpb25faW5pdCgpOwotCXJldHVybiBzaG9ydGJyYW5jaDsKKyAgICBzdm52ZXJzaW9uX2luaXQoKTsKKyAgICByZXR1cm4gc2hvcnRicmFuY2g7CiB9CiAKIApAQCAtMTI0NSw3OSArMTI0NSw3OSBAQAogc3RhdGljIFB5VHlwZU9iamVjdCBGbGFnc1R5cGUgPSB7MCwgMCwgMCwgMCwgMCwgMH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0ZpZWxkIGZsYWdzX2ZpZWxkc1tdID0gewotCXsiZGVidWciLAkJIi1kIn0sCi0JeyJweTNrX3dhcm5pbmciLAkiLTMifSwKLQl7ImRpdmlzaW9uX3dhcm5pbmciLAkiLVEifSwKLQl7ImRpdmlzaW9uX25ldyIsCSItUW5ldyJ9LAotCXsiaW5zcGVjdCIsCQkiLWkifSwKLQl7ImludGVyYWN0aXZlIiwJCSItaSJ9LAotCXsib3B0aW1pemUiLAkJIi1PIG9yIC1PTyJ9LAotCXsiZG9udF93cml0ZV9ieXRlY29kZSIsCSItQiJ9LAotCXsibm9fdXNlcl9zaXRlIiwJIi1zIn0sCi0JeyJub19zaXRlIiwJCSItUyJ9LAotCXsiaWdub3JlX2Vudmlyb25tZW50IiwJIi1FIn0sCi0JeyJ0YWJjaGVjayIsCQkiLXQgb3IgLXR0In0sCi0JeyJ2ZXJib3NlIiwJCSItdiJ9LAorICAgIHsiZGVidWciLCAgICAgICAgICAgICAgICAgICAiLWQifSwKKyAgICB7InB5M2tfd2FybmluZyIsICAgICAgICAgICAgIi0zIn0sCisgICAgeyJkaXZpc2lvbl93YXJuaW5nIiwgICAgICAgICItUSJ9LAorICAgIHsiZGl2aXNpb25fbmV3IiwgICAgICAgICAgICAiLVFuZXcifSwKKyAgICB7Imluc3BlY3QiLCAgICAgICAgICAgICAgICAgIi1pIn0sCisgICAgeyJpbnRlcmFjdGl2ZSIsICAgICAgICAgICAgICItaSJ9LAorICAgIHsib3B0aW1pemUiLCAgICAgICAgICAgICAgICAiLU8gb3IgLU9PIn0sCisgICAgeyJkb250X3dyaXRlX2J5dGVjb2RlIiwgICAgICItQiJ9LAorICAgIHsibm9fdXNlcl9zaXRlIiwgICAgICAgICAgICAiLXMifSwKKyAgICB7Im5vX3NpdGUiLCAgICAgICAgICAgICAgICAgIi1TIn0sCisgICAgeyJpZ25vcmVfZW52aXJvbm1lbnQiLCAgICAgICItRSJ9LAorICAgIHsidGFiY2hlY2siLCAgICAgICAgICAgICAgICAiLXQgb3IgLXR0In0sCisgICAgeyJ2ZXJib3NlIiwgICAgICAgICAgICAgICAgICItdiJ9LAogI2lmZGVmIFJJU0NPUwotCXsicmlzY29zX3dpbXAiLAkJIj8/PyJ9LAorICAgIHsicmlzY29zX3dpbXAiLCAgICAgICAgICAgICAiPz8/In0sCiAjZW5kaWYKLQkvKiB7InVuYnVmZmVyZWQiLAkJIi11In0sICovCi0JeyJ1bmljb2RlIiwJCSItVSJ9LAotCS8qIHsic2tpcF9maXJzdCIsCQkiLXgifSwgKi8KLQl7ImJ5dGVzX3dhcm5pbmciLCAiLWIifSwKLQl7MH0KKyAgICAvKiB7InVuYnVmZmVyZWQiLCAgICAgICAgICAgICAgICAgICAiLXUifSwgKi8KKyAgICB7InVuaWNvZGUiLCAgICAgICAgICAgICAgICAgIi1VIn0sCisgICAgLyogeyJza2lwX2ZpcnN0IiwgICAgICAgICAgICAgICAgICAgIi14In0sICovCisgICAgeyJieXRlc193YXJuaW5nIiwgIi1iIn0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9EZXNjIGZsYWdzX2Rlc2MgPSB7Ci0JInN5cy5mbGFncyIsCS8qIG5hbWUgKi8KLQlmbGFnc19fZG9jX18sCS8qIGRvYyAqLwotCWZsYWdzX2ZpZWxkcywJLyogZmllbGRzICovCisgICAgInN5cy5mbGFncyIsICAgICAgICAvKiBuYW1lICovCisgICAgZmxhZ3NfX2RvY19fLCAgICAgICAvKiBkb2MgKi8KKyAgICBmbGFnc19maWVsZHMsICAgICAgIC8qIGZpZWxkcyAqLwogI2lmZGVmIFJJU0NPUwotCTE2CisgICAgMTYKICNlbHNlCi0JMTUKKyAgICAxNQogI2VuZGlmCiB9OwogCiBzdGF0aWMgUHlPYmplY3QqCiBtYWtlX2ZsYWdzKHZvaWQpCiB7Ci0JaW50IHBvcyA9IDA7Ci0JUHlPYmplY3QgKnNlcTsKKyAgICBpbnQgcG9zID0gMDsKKyAgICBQeU9iamVjdCAqc2VxOwogCi0Jc2VxID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJkZsYWdzVHlwZSk7Ci0JaWYgKHNlcSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZXEgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmRmxhZ3NUeXBlKTsKKyAgICBpZiAoc2VxID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjZGVmaW5lIFNldEZsYWcoZmxhZykgXAotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0oc2VxLCBwb3MrKywgUHlJbnRfRnJvbUxvbmcoZmxhZykpCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShzZXEsIHBvcysrLCBQeUludF9Gcm9tTG9uZyhmbGFnKSkKIAotCVNldEZsYWcoUHlfRGVidWdGbGFnKTsKLQlTZXRGbGFnKFB5X1B5M2tXYXJuaW5nRmxhZyk7Ci0JU2V0RmxhZyhQeV9EaXZpc2lvbldhcm5pbmdGbGFnKTsKLQlTZXRGbGFnKF9QeV9RbmV3RmxhZyk7Ci0JU2V0RmxhZyhQeV9JbnNwZWN0RmxhZyk7Ci0JU2V0RmxhZyhQeV9JbnRlcmFjdGl2ZUZsYWcpOwotCVNldEZsYWcoUHlfT3B0aW1pemVGbGFnKTsKLQlTZXRGbGFnKFB5X0RvbnRXcml0ZUJ5dGVjb2RlRmxhZyk7Ci0JU2V0RmxhZyhQeV9Ob1VzZXJTaXRlRGlyZWN0b3J5KTsKLQlTZXRGbGFnKFB5X05vU2l0ZUZsYWcpOwotCVNldEZsYWcoUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnKTsKLQlTZXRGbGFnKFB5X1RhYmNoZWNrRmxhZyk7Ci0JU2V0RmxhZyhQeV9WZXJib3NlRmxhZyk7CisgICAgU2V0RmxhZyhQeV9EZWJ1Z0ZsYWcpOworICAgIFNldEZsYWcoUHlfUHkza1dhcm5pbmdGbGFnKTsKKyAgICBTZXRGbGFnKFB5X0RpdmlzaW9uV2FybmluZ0ZsYWcpOworICAgIFNldEZsYWcoX1B5X1FuZXdGbGFnKTsKKyAgICBTZXRGbGFnKFB5X0luc3BlY3RGbGFnKTsKKyAgICBTZXRGbGFnKFB5X0ludGVyYWN0aXZlRmxhZyk7CisgICAgU2V0RmxhZyhQeV9PcHRpbWl6ZUZsYWcpOworICAgIFNldEZsYWcoUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnKTsKKyAgICBTZXRGbGFnKFB5X05vVXNlclNpdGVEaXJlY3RvcnkpOworICAgIFNldEZsYWcoUHlfTm9TaXRlRmxhZyk7CisgICAgU2V0RmxhZyhQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWcpOworICAgIFNldEZsYWcoUHlfVGFiY2hlY2tGbGFnKTsKKyAgICBTZXRGbGFnKFB5X1ZlcmJvc2VGbGFnKTsKICNpZmRlZiBSSVNDT1MKLQlTZXRGbGFnKFB5X1JJU0NPU1dpbXBGbGFnKTsKKyAgICBTZXRGbGFnKFB5X1JJU0NPU1dpbXBGbGFnKTsKICNlbmRpZgotCS8qIFNldEZsYWcoc2F3X3VuYnVmZmVyZWRfZmxhZyk7ICovCi0JU2V0RmxhZyhQeV9Vbmljb2RlRmxhZyk7Ci0JLyogU2V0RmxhZyhza2lwZmlyc3RsaW5lKTsgKi8KKyAgICAvKiBTZXRGbGFnKHNhd191bmJ1ZmZlcmVkX2ZsYWcpOyAqLworICAgIFNldEZsYWcoUHlfVW5pY29kZUZsYWcpOworICAgIC8qIFNldEZsYWcoc2tpcGZpcnN0bGluZSk7ICovCiAgICAgU2V0RmxhZyhQeV9CeXRlc1dhcm5pbmdGbGFnKTsKICN1bmRlZiBTZXRGbGFnCiAKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHNlcTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHNlcTsKIH0KIAogUHlEb2NfU1RSVkFSKHZlcnNpb25faW5mb19fZG9jX18sCkBAIC0xMzI4LDQyOCArMTMyOCw0MjggQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgVmVyc2lvbkluZm9UeXBlID0gezAsIDAsIDAsIDAsIDAsIDB9OwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCB2ZXJzaW9uX2luZm9fZmllbGRzW10gPSB7Ci0JeyJtYWpvciIsICJNYWpvciByZWxlYXNlIG51bWJlciJ9LAotCXsibWlub3IiLCAiTWlub3IgcmVsZWFzZSBudW1iZXIifSwKLQl7Im1pY3JvIiwgIlBhdGNoIHJlbGVhc2UgbnVtYmVyIn0sCi0JeyJyZWxlYXNlbGV2ZWwiLCAiJ2FscGhhJywgJ2JldGEnLCAnY2FuZGlkYXRlJywgb3IgJ3JlbGVhc2UnIn0sCi0JeyJzZXJpYWwiLCAiU2VyaWFsIHJlbGVhc2UgbnVtYmVyIn0sCi0JezB9CisgICAgeyJtYWpvciIsICJNYWpvciByZWxlYXNlIG51bWJlciJ9LAorICAgIHsibWlub3IiLCAiTWlub3IgcmVsZWFzZSBudW1iZXIifSwKKyAgICB7Im1pY3JvIiwgIlBhdGNoIHJlbGVhc2UgbnVtYmVyIn0sCisgICAgeyJyZWxlYXNlbGV2ZWwiLCAiJ2FscGhhJywgJ2JldGEnLCAnY2FuZGlkYXRlJywgb3IgJ3JlbGVhc2UnIn0sCisgICAgeyJzZXJpYWwiLCAiU2VyaWFsIHJlbGVhc2UgbnVtYmVyIn0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9EZXNjIHZlcnNpb25faW5mb19kZXNjID0gewotCSJzeXMudmVyc2lvbl9pbmZvIiwgICAgIC8qIG5hbWUgKi8KLQl2ZXJzaW9uX2luZm9fX2RvY19fLCAgICAvKiBkb2MgKi8KLQl2ZXJzaW9uX2luZm9fZmllbGRzLCAgICAvKiBmaWVsZHMgKi8KLQk1CisgICAgInN5cy52ZXJzaW9uX2luZm8iLCAgICAgLyogbmFtZSAqLworICAgIHZlcnNpb25faW5mb19fZG9jX18sICAgIC8qIGRvYyAqLworICAgIHZlcnNpb25faW5mb19maWVsZHMsICAgIC8qIGZpZWxkcyAqLworICAgIDUKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlX3ZlcnNpb25faW5mbyh2b2lkKQogewotCVB5T2JqZWN0ICp2ZXJzaW9uX2luZm87Ci0JY2hhciAqczsKLQlpbnQgcG9zID0gMDsKKyAgICBQeU9iamVjdCAqdmVyc2lvbl9pbmZvOworICAgIGNoYXIgKnM7CisgICAgaW50IHBvcyA9IDA7CiAKLQl2ZXJzaW9uX2luZm8gPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmVmVyc2lvbkluZm9UeXBlKTsKLQlpZiAodmVyc2lvbl9pbmZvID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHZlcnNpb25faW5mbyA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZWZXJzaW9uSW5mb1R5cGUpOworICAgIGlmICh2ZXJzaW9uX2luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKgotCSAqIFRoZXNlIHJlbGVhc2UgbGV2ZWwgY2hlY2tzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYW5kIGNvdmVyCi0JICogdGhlIGZpZWxkLCBzbyBkb24ndCBnZXQgdG9vIGZhbmN5IHdpdGggdGhlIHByZS1wcm9jZXNzb3IhCi0JICovCisgICAgLyoKKyAgICAgKiBUaGVzZSByZWxlYXNlIGxldmVsIGNoZWNrcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGFuZCBjb3ZlcgorICAgICAqIHRoZSBmaWVsZCwgc28gZG9uJ3QgZ2V0IHRvbyBmYW5jeSB3aXRoIHRoZSBwcmUtcHJvY2Vzc29yIQorICAgICAqLwogI2lmIFBZX1JFTEVBU0VfTEVWRUwgPT0gUFlfUkVMRUFTRV9MRVZFTF9BTFBIQQotCXMgPSAiYWxwaGEiOworICAgIHMgPSAiYWxwaGEiOwogI2VsaWYgUFlfUkVMRUFTRV9MRVZFTCA9PSBQWV9SRUxFQVNFX0xFVkVMX0JFVEEKLQlzID0gImJldGEiOworICAgIHMgPSAiYmV0YSI7CiAjZWxpZiBQWV9SRUxFQVNFX0xFVkVMID09IFBZX1JFTEVBU0VfTEVWRUxfR0FNTUEKLQlzID0gImNhbmRpZGF0ZSI7CisgICAgcyA9ICJjYW5kaWRhdGUiOwogI2VsaWYgUFlfUkVMRUFTRV9MRVZFTCA9PSBQWV9SRUxFQVNFX0xFVkVMX0ZJTkFMCi0JcyA9ICJmaW5hbCI7CisgICAgcyA9ICJmaW5hbCI7CiAjZW5kaWYKIAogI2RlZmluZSBTZXRJbnRJdGVtKGZsYWcpIFwKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHZlcnNpb25faW5mbywgcG9zKyssIFB5SW50X0Zyb21Mb25nKGZsYWcpKQorICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbl9pbmZvLCBwb3MrKywgUHlJbnRfRnJvbUxvbmcoZmxhZykpCiAjZGVmaW5lIFNldFN0ckl0ZW0oZmxhZykgXAotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odmVyc2lvbl9pbmZvLCBwb3MrKywgUHlTdHJpbmdfRnJvbVN0cmluZyhmbGFnKSkKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHZlcnNpb25faW5mbywgcG9zKyssIFB5U3RyaW5nX0Zyb21TdHJpbmcoZmxhZykpCiAKLQlTZXRJbnRJdGVtKFBZX01BSk9SX1ZFUlNJT04pOwotCVNldEludEl0ZW0oUFlfTUlOT1JfVkVSU0lPTik7Ci0JU2V0SW50SXRlbShQWV9NSUNST19WRVJTSU9OKTsKLQlTZXRTdHJJdGVtKHMpOwotCVNldEludEl0ZW0oUFlfUkVMRUFTRV9TRVJJQUwpOworICAgIFNldEludEl0ZW0oUFlfTUFKT1JfVkVSU0lPTik7CisgICAgU2V0SW50SXRlbShQWV9NSU5PUl9WRVJTSU9OKTsKKyAgICBTZXRJbnRJdGVtKFBZX01JQ1JPX1ZFUlNJT04pOworICAgIFNldFN0ckl0ZW0ocyk7CisgICAgU2V0SW50SXRlbShQWV9SRUxFQVNFX1NFUklBTCk7CiAjdW5kZWYgU2V0SW50SXRlbQogI3VuZGVmIFNldFN0ckl0ZW0KIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X0NMRUFSKHZlcnNpb25faW5mbyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gdmVyc2lvbl9pbmZvOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0NMRUFSKHZlcnNpb25faW5mbyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gdmVyc2lvbl9pbmZvOwogfQogCiBQeU9iamVjdCAqCiBfUHlTeXNfSW5pdCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqdiwgKnN5c2RpY3Q7Ci0JUHlPYmplY3QgKnN5c2luLCAqc3lzb3V0LCAqc3lzZXJyOwotCWNoYXIgKnM7CisgICAgUHlPYmplY3QgKm0sICp2LCAqc3lzZGljdDsKKyAgICBQeU9iamVjdCAqc3lzaW4sICpzeXNvdXQsICpzeXNlcnI7CisgICAgY2hhciAqczsKIAotCW0gPSBQeV9Jbml0TW9kdWxlMygic3lzIiwgc3lzX21ldGhvZHMsIHN5c19kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXN5c2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotI2RlZmluZSBTRVRfU1lTX0ZST01fU1RSSU5HKGtleSwgdmFsdWUpCQkJXAotCXYgPSB2YWx1ZTsJCQkJCVwKLQlpZiAodiAhPSBOVUxMKQkJCQkJXAotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCBrZXksIHYpOwlcCi0JUHlfWERFQ1JFRih2KQorICAgIG0gPSBQeV9Jbml0TW9kdWxlMygic3lzIiwgc3lzX21ldGhvZHMsIHN5c19kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN5c2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworI2RlZmluZSBTRVRfU1lTX0ZST01fU1RSSU5HKGtleSwgdmFsdWUpICAgICAgICAgICAgICAgICBcCisgICAgdiA9IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodiAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCBrZXksIHYpOyAgICAgICAgICBcCisgICAgUHlfWERFQ1JFRih2KQogCi0JLyogQ2hlY2sgdGhhdCBzdGRpbiBpcyBub3QgYSBkaXJlY3RvcnkKLQlVc2luZyBzaGVsbCByZWRpcmVjdGlvbiwgeW91IGNhbiByZWRpcmVjdCBzdGRpbiB0byBhIGRpcmVjdG9yeSwKLQljcmFzaGluZyB0aGUgUHl0aG9uIGludGVycHJldGVyLiBDYXRjaCB0aGlzIGNvbW1vbiBtaXN0YWtlIGhlcmUKLQlhbmQgb3V0cHV0IGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UuIE5vdGUgdGhhdCB1bmRlciBNUyBXaW5kb3dzLAotCXRoZSBzaGVsbCBhbHJlYWR5IHByZXZlbnRzIHRoYXQuICovCisgICAgLyogQ2hlY2sgdGhhdCBzdGRpbiBpcyBub3QgYSBkaXJlY3RvcnkKKyAgICBVc2luZyBzaGVsbCByZWRpcmVjdGlvbiwgeW91IGNhbiByZWRpcmVjdCBzdGRpbiB0byBhIGRpcmVjdG9yeSwKKyAgICBjcmFzaGluZyB0aGUgUHl0aG9uIGludGVycHJldGVyLiBDYXRjaCB0aGlzIGNvbW1vbiBtaXN0YWtlIGhlcmUKKyAgICBhbmQgb3V0cHV0IGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UuIE5vdGUgdGhhdCB1bmRlciBNUyBXaW5kb3dzLAorICAgIHRoZSBzaGVsbCBhbHJlYWR5IHByZXZlbnRzIHRoYXQuICovCiAjaWYgIWRlZmluZWQoTVNfV0lORE9XUykKLQl7Ci0JCXN0cnVjdCBzdGF0IHNiOwotCQlpZiAoZnN0YXQoZmlsZW5vKHN0ZGluKSwgJnNiKSA9PSAwICYmCi0JCSAgICBTX0lTRElSKHNiLnN0X21vZGUpKSB7Ci0JCQkvKiBUaGVyZSdzIG5vdGhpbmcgbW9yZSB3ZSBjYW4gZG8uICovCi0JCQkvKiBQeV9GYXRhbEVycm9yKCkgd2lsbCBjb3JlIGR1bXAsIHNvIGp1c3QgZXhpdC4gKi8KLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCJQeXRob24gZXJyb3I6IDxzdGRpbj4gaXMgYSBkaXJlY3RvcnksIGNhbm5vdCBjb250aW51ZVxuIik7Ci0JCQlleGl0KEVYSVRfRkFJTFVSRSk7Ci0JCX0KLQl9CisgICAgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgICAgICAgaWYgKGZzdGF0KGZpbGVubyhzdGRpbiksICZzYikgPT0gMCAmJgorICAgICAgICAgICAgU19JU0RJUihzYi5zdF9tb2RlKSkgeworICAgICAgICAgICAgLyogVGhlcmUncyBub3RoaW5nIG1vcmUgd2UgY2FuIGRvLiAqLworICAgICAgICAgICAgLyogUHlfRmF0YWxFcnJvcigpIHdpbGwgY29yZSBkdW1wLCBzbyBqdXN0IGV4aXQuICovCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiUHl0aG9uIGVycm9yOiA8c3RkaW4+IGlzIGEgZGlyZWN0b3J5LCBjYW5ub3QgY29udGludWVcbiIpOworICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKLQkvKiBDbG9zaW5nIHRoZSBzdGFuZGFyZCBGSUxFKiBpZiBzeXMuc3RkKiBnb2VzIGF3YXlzIGNhdXNlcyBwcm9ibGVtcwotCSAqIGZvciBlbWJlZGRlZCBQeXRob24gdXNhZ2VzLiBDbG9zaW5nIHRoZW0gd2hlbiBzb21lYm9keSBleHBsaWNpdGx5Ci0JICogaW52b2tlcyAuY2xvc2UoKSBtaWdodCBiZSBwb3NzaWJsZSwgYnV0IHRoZSBGQVEgcHJvbWlzZXMgdGhleSBnZXQKLQkgKiBuZXZlciBjbG9zZWQuIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgdG8gZ2V0IHdyaXRlIGVycm9ycyB3aGVuCi0JICogd3JpdGluZyBmYWlscyAoZS5nLiBiZWNhdXNlIHN0ZG91dCBpcyByZWRpcmVjdGVkKSwgc28gd2UgZmx1c2ggdGhlCi0JICogc3RyZWFtcyBhbmQgY2hlY2sgZm9yIGVycm9ycyBiZWZvcmUgdGhlIGZpbGUgb2JqZWN0cyBhcmUgZGVsZXRlZC4KLQkgKiBPbiBPUyBYLCBmZmx1c2goKWluZyBzdGRpbiBjYXVzZXMgYW4gZXJyb3IsIHNvIHdlIGV4ZW1wdCBzdGRpbgotCSAqIGZyb20gdGhhdCBwcm9jZWR1cmUuCi0JICovCi0Jc3lzaW4gPSBQeUZpbGVfRnJvbUZpbGUoc3RkaW4sICI8c3RkaW4+IiwgInIiLCBOVUxMKTsKLQlzeXNvdXQgPSBQeUZpbGVfRnJvbUZpbGUoc3Rkb3V0LCAiPHN0ZG91dD4iLCAidyIsIF9jaGVja19hbmRfZmx1c2gpOwotCXN5c2VyciA9IFB5RmlsZV9Gcm9tRmlsZShzdGRlcnIsICI8c3RkZXJyPiIsICJ3IiwgX2NoZWNrX2FuZF9mbHVzaCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIC8qIENsb3NpbmcgdGhlIHN0YW5kYXJkIEZJTEUqIGlmIHN5cy5zdGQqIGdvZXMgYXdheXMgY2F1c2VzIHByb2JsZW1zCisgICAgICogZm9yIGVtYmVkZGVkIFB5dGhvbiB1c2FnZXMuIENsb3NpbmcgdGhlbSB3aGVuIHNvbWVib2R5IGV4cGxpY2l0bHkKKyAgICAgKiBpbnZva2VzIC5jbG9zZSgpIG1pZ2h0IGJlIHBvc3NpYmxlLCBidXQgdGhlIEZBUSBwcm9taXNlcyB0aGV5IGdldAorICAgICAqIG5ldmVyIGNsb3NlZC4gSG93ZXZlciwgd2Ugc3RpbGwgbmVlZCB0byBnZXQgd3JpdGUgZXJyb3JzIHdoZW4KKyAgICAgKiB3cml0aW5nIGZhaWxzIChlLmcuIGJlY2F1c2Ugc3Rkb3V0IGlzIHJlZGlyZWN0ZWQpLCBzbyB3ZSBmbHVzaCB0aGUKKyAgICAgKiBzdHJlYW1zIGFuZCBjaGVjayBmb3IgZXJyb3JzIGJlZm9yZSB0aGUgZmlsZSBvYmplY3RzIGFyZSBkZWxldGVkLgorICAgICAqIE9uIE9TIFgsIGZmbHVzaCgpaW5nIHN0ZGluIGNhdXNlcyBhbiBlcnJvciwgc28gd2UgZXhlbXB0IHN0ZGluCisgICAgICogZnJvbSB0aGF0IHByb2NlZHVyZS4KKyAgICAgKi8KKyAgICBzeXNpbiA9IFB5RmlsZV9Gcm9tRmlsZShzdGRpbiwgIjxzdGRpbj4iLCAiciIsIE5VTEwpOworICAgIHN5c291dCA9IFB5RmlsZV9Gcm9tRmlsZShzdGRvdXQsICI8c3Rkb3V0PiIsICJ3IiwgX2NoZWNrX2FuZF9mbHVzaCk7CisgICAgc3lzZXJyID0gUHlGaWxlX0Zyb21GaWxlKHN0ZGVyciwgIjxzdGRlcnI+IiwgInciLCBfY2hlY2tfYW5kX2ZsdXNoKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAic3RkaW4iLCBzeXNpbik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgInN0ZG91dCIsIHN5c291dCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgInN0ZGVyciIsIHN5c2Vycik7Ci0JLyogTWFrZSBiYWNrdXAgY29waWVzIGZvciBjbGVhbnVwICovCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fc3RkaW5fXyIsIHN5c2luKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiX19zdGRvdXRfXyIsIHN5c291dCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fc3RkZXJyX18iLCBzeXNlcnIpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJfX2Rpc3BsYXlob29rX18iLAotCQkJICAgICBQeURpY3RfR2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiZGlzcGxheWhvb2siKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fZXhjZXB0aG9va19fIiwKLQkJCSAgICAgUHlEaWN0X0dldEl0ZW1TdHJpbmcoc3lzZGljdCwgImV4Y2VwdGhvb2siKSk7Ci0JUHlfWERFQ1JFRihzeXNpbik7Ci0JUHlfWERFQ1JFRihzeXNvdXQpOwotCVB5X1hERUNSRUYoc3lzZXJyKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAic3RkaW4iLCBzeXNpbik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgInN0ZG91dCIsIHN5c291dCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgInN0ZGVyciIsIHN5c2Vycik7CisgICAgLyogTWFrZSBiYWNrdXAgY29waWVzIGZvciBjbGVhbnVwICovCisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fc3RkaW5fXyIsIHN5c2luKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiX19zdGRvdXRfXyIsIHN5c291dCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fc3RkZXJyX18iLCBzeXNlcnIpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJfX2Rpc3BsYXlob29rX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5RGljdF9HZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJkaXNwbGF5aG9vayIpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiX19leGNlcHRob29rX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5RGljdF9HZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJleGNlcHRob29rIikpOworICAgIFB5X1hERUNSRUYoc3lzaW4pOworICAgIFB5X1hERUNSRUYoc3lzb3V0KTsKKyAgICBQeV9YREVDUkVGKHN5c2Vycik7CiAKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJ2ZXJzaW9uIiwKLQkJCSAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRWZXJzaW9uKCkpKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJoZXh2ZXJzaW9uIiwKLQkJCSAgICAgUHlJbnRfRnJvbUxvbmcoUFlfVkVSU0lPTl9IRVgpKTsKLQlzdm52ZXJzaW9uX2luaXQoKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJzdWJ2ZXJzaW9uIiwKLQkJCSAgICAgUHlfQnVpbGRWYWx1ZSgiKHNzeikiLCAiQ1B5dGhvbiIsIGJyYW5jaCwKLQkJCQkJICBzdm5fcmV2aXNpb24pKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJkb250X3dyaXRlX2J5dGVjb2RlIiwKLQkJCSAgICAgUHlCb29sX0Zyb21Mb25nKFB5X0RvbnRXcml0ZUJ5dGVjb2RlRmxhZykpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImFwaV92ZXJzaW9uIiwKLQkJCSAgICBQeUludF9Gcm9tTG9uZyhQWVRIT05fQVBJX1ZFUlNJT04pKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJjb3B5cmlnaHQiLAotCQkJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0Q29weXJpZ2h0KCkpKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJwbGF0Zm9ybSIsCi0JCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQbGF0Zm9ybSgpKSk7Ci0JU0VUX1NZU19GUk9NX1NUUklORygiZXhlY3V0YWJsZSIsCi0JCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQcm9ncmFtRnVsbFBhdGgoKSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoInByZWZpeCIsCi0JCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQcmVmaXgoKSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImV4ZWNfcHJlZml4IiwKLQkJICAgCSAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldEV4ZWNQcmVmaXgoKSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoIm1heHNpemUiLAotCQkJICAgIFB5SW50X0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUFYKSk7Ci0JU0VUX1NZU19GUk9NX1NUUklORygibWF4aW50IiwKLQkJCSAgICBQeUludF9Gcm9tTG9uZyhQeUludF9HZXRNYXgoKSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoInB5M2t3YXJuaW5nIiwKLQkJCSAgICBQeUJvb2xfRnJvbUxvbmcoUHlfUHkza1dhcm5pbmdGbGFnKSk7Ci0JU0VUX1NZU19GUk9NX1NUUklORygiZmxvYXRfaW5mbyIsCi0JCQkgICAgUHlGbG9hdF9HZXRJbmZvKCkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImxvbmdfaW5mbyIsCi0JCQkgICAgUHlMb25nX0dldEluZm8oKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygidmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRWZXJzaW9uKCkpKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJoZXh2ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZyhQWV9WRVJTSU9OX0hFWCkpOworICAgIHN2bnZlcnNpb25faW5pdCgpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoInN1YnZlcnNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIihzc3opIiwgIkNQeXRob24iLCBicmFuY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2bl9yZXZpc2lvbikpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImRvbnRfd3JpdGVfYnl0ZWNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qm9vbF9Gcm9tTG9uZyhQeV9Eb250V3JpdGVCeXRlY29kZUZsYWcpKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJhcGlfdmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZyhQWVRIT05fQVBJX1ZFUlNJT04pKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJjb3B5cmlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRDb3B5cmlnaHQoKSkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoInBsYXRmb3JtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0UGxhdGZvcm0oKSkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImV4ZWN1dGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQcm9ncmFtRnVsbFBhdGgoKSkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoInByZWZpeCIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldFByZWZpeCgpKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygiZXhlY19wcmVmaXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRFeGVjUHJlZml4KCkpKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJtYXhzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUFYKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygibWF4aW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKFB5SW50X0dldE1heCgpKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygicHkza3dhcm5pbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlCb29sX0Zyb21Mb25nKFB5X1B5M2tXYXJuaW5nRmxhZykpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImZsb2F0X2luZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlGbG9hdF9HZXRJbmZvKCkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImxvbmdfaW5mbyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfR2V0SW5mbygpKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JU0VUX1NZU19GUk9NX1NUUklORygibWF4dW5pY29kZSIsCi0JCQkgICAgUHlJbnRfRnJvbUxvbmcoUHlVbmljb2RlX0dldE1heCgpKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygibWF4dW5pY29kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZyhQeVVuaWNvZGVfR2V0TWF4KCkpKTsKICNlbmRpZgotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImJ1aWx0aW5fbW9kdWxlX25hbWVzIiwKLQkJCSAgICBsaXN0X2J1aWx0aW5fbW9kdWxlX25hbWVzKCkpOwotCXsKLQkJLyogQXNzdW1lcyB0aGF0IGxvbmdzIGFyZSBhdCBsZWFzdCAyIGJ5dGVzIGxvbmcuCi0JCSAgIFNob3VsZCBiZSBzYWZlISAqLwotCQl1bnNpZ25lZCBsb25nIG51bWJlciA9IDE7Ci0JCWNoYXIgKnZhbHVlOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImJ1aWx0aW5fbW9kdWxlX25hbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfYnVpbHRpbl9tb2R1bGVfbmFtZXMoKSk7CisgICAgeworICAgICAgICAvKiBBc3N1bWVzIHRoYXQgbG9uZ3MgYXJlIGF0IGxlYXN0IDIgYnl0ZXMgbG9uZy4KKyAgICAgICAgICAgU2hvdWxkIGJlIHNhZmUhICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyID0gMTsKKyAgICAgICAgY2hhciAqdmFsdWU7CiAKLQkJcyA9IChjaGFyICopICZudW1iZXI7Ci0JCWlmIChzWzBdID09IDApCi0JCQl2YWx1ZSA9ICJiaWciOwotCQllbHNlCi0JCQl2YWx1ZSA9ICJsaXR0bGUiOwotCQlTRVRfU1lTX0ZST01fU1RSSU5HKCJieXRlb3JkZXIiLAotCQkJCSAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbHVlKSk7Ci0JfQorICAgICAgICBzID0gKGNoYXIgKikgJm51bWJlcjsKKyAgICAgICAgaWYgKHNbMF0gPT0gMCkKKyAgICAgICAgICAgIHZhbHVlID0gImJpZyI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlID0gImxpdHRsZSI7CisgICAgICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImJ5dGVvcmRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyh2YWx1ZSkpOworICAgIH0KICNpZmRlZiBNU19DT1JFRExMCi0JU0VUX1NZU19GUk9NX1NUUklORygiZGxsaGFuZGxlIiwKLQkJCSAgICBQeUxvbmdfRnJvbVZvaWRQdHIoUHlXaW5fRExMaE1vZHVsZSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoIndpbnZlciIsCi0JCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeVdpbl9ETExWZXJzaW9uU3RyaW5nKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygiZGxsaGFuZGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tVm9pZFB0cihQeVdpbl9ETExoTW9kdWxlKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygid2ludmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlXaW5fRExMVmVyc2lvblN0cmluZykpOwogI2VuZGlmCi0JaWYgKHdhcm5vcHRpb25zID09IE5VTEwpIHsKLQkJd2Fybm9wdGlvbnMgPSBQeUxpc3RfTmV3KDApOwotCX0KLQllbHNlIHsKLQkJUHlfSU5DUkVGKHdhcm5vcHRpb25zKTsKLQl9Ci0JaWYgKHdhcm5vcHRpb25zICE9IE5VTEwpIHsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIndhcm5vcHRpb25zIiwgd2Fybm9wdGlvbnMpOwotCX0KKyAgICBpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCkgeworICAgICAgICB3YXJub3B0aW9ucyA9IFB5TGlzdF9OZXcoMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9JTkNSRUYod2Fybm9wdGlvbnMpOworICAgIH0KKyAgICBpZiAod2Fybm9wdGlvbnMgIT0gTlVMTCkgeworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAid2Fybm9wdGlvbnMiLCB3YXJub3B0aW9ucyk7CisgICAgfQogCi0JLyogdmVyc2lvbl9pbmZvICovCi0JaWYgKFZlcnNpb25JbmZvVHlwZS50cF9uYW1lID09IDApCi0JCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlZlcnNpb25JbmZvVHlwZSwgJnZlcnNpb25faW5mb19kZXNjKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJ2ZXJzaW9uX2luZm8iLCBtYWtlX3ZlcnNpb25faW5mbygpKTsKLQkvKiBwcmV2ZW50IHVzZXIgZnJvbSBjcmVhdGluZyBuZXcgaW5zdGFuY2VzICovCi0JVmVyc2lvbkluZm9UeXBlLnRwX2luaXQgPSBOVUxMOwotCVZlcnNpb25JbmZvVHlwZS50cF9uZXcgPSBOVUxMOworICAgIC8qIHZlcnNpb25faW5mbyAqLworICAgIGlmIChWZXJzaW9uSW5mb1R5cGUudHBfbmFtZSA9PSAwKQorICAgICAgICBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZWZXJzaW9uSW5mb1R5cGUsICZ2ZXJzaW9uX2luZm9fZGVzYyk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygidmVyc2lvbl9pbmZvIiwgbWFrZV92ZXJzaW9uX2luZm8oKSk7CisgICAgLyogcHJldmVudCB1c2VyIGZyb20gY3JlYXRpbmcgbmV3IGluc3RhbmNlcyAqLworICAgIFZlcnNpb25JbmZvVHlwZS50cF9pbml0ID0gTlVMTDsKKyAgICBWZXJzaW9uSW5mb1R5cGUudHBfbmV3ID0gTlVMTDsKIAotCS8qIGZsYWdzICovCi0JaWYgKEZsYWdzVHlwZS50cF9uYW1lID09IDApCi0JCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJkZsYWdzVHlwZSwgJmZsYWdzX2Rlc2MpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImZsYWdzIiwgbWFrZV9mbGFncygpKTsKLQkvKiBwcmV2ZW50IHVzZXIgZnJvbSBjcmVhdGluZyBuZXcgaW5zdGFuY2VzICovCi0JRmxhZ3NUeXBlLnRwX2luaXQgPSBOVUxMOwotCUZsYWdzVHlwZS50cF9uZXcgPSBOVUxMOworICAgIC8qIGZsYWdzICovCisgICAgaWYgKEZsYWdzVHlwZS50cF9uYW1lID09IDApCisgICAgICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJkZsYWdzVHlwZSwgJmZsYWdzX2Rlc2MpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImZsYWdzIiwgbWFrZV9mbGFncygpKTsKKyAgICAvKiBwcmV2ZW50IHVzZXIgZnJvbSBjcmVhdGluZyBuZXcgaW5zdGFuY2VzICovCisgICAgRmxhZ3NUeXBlLnRwX2luaXQgPSBOVUxMOworICAgIEZsYWdzVHlwZS50cF9uZXcgPSBOVUxMOwogCiAKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCi0JLyogZ2V0d2luZG93c3ZlcnNpb24gKi8KLQlpZiAoV2luZG93c1ZlcnNpb25UeXBlLnRwX25hbWUgPT0gMCkKLQkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmV2luZG93c1ZlcnNpb25UeXBlLCAmd2luZG93c192ZXJzaW9uX2Rlc2MpOwotCS8qIHByZXZlbnQgdXNlciBmcm9tIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMgKi8KLQlXaW5kb3dzVmVyc2lvblR5cGUudHBfaW5pdCA9IE5VTEw7Ci0JV2luZG93c1ZlcnNpb25UeXBlLnRwX25ldyA9IE5VTEw7CisgICAgLyogZ2V0d2luZG93c3ZlcnNpb24gKi8KKyAgICBpZiAoV2luZG93c1ZlcnNpb25UeXBlLnRwX25hbWUgPT0gMCkKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmV2luZG93c1ZlcnNpb25UeXBlLCAmd2luZG93c192ZXJzaW9uX2Rlc2MpOworICAgIC8qIHByZXZlbnQgdXNlciBmcm9tIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMgKi8KKyAgICBXaW5kb3dzVmVyc2lvblR5cGUudHBfaW5pdCA9IE5VTEw7CisgICAgV2luZG93c1ZlcnNpb25UeXBlLnRwX25ldyA9IE5VTEw7CiAjZW5kaWYKIAotCS8qIGZsb2F0IHJlcHIgc3R5bGU6IDAuMDMgKHNob3J0KSB2cyAwLjAyOTk5OTk5OTk5OTk5OTk5OSAobGVnYWN5KSAqLworICAgIC8qIGZsb2F0IHJlcHIgc3R5bGU6IDAuMDMgKHNob3J0KSB2cyAwLjAyOTk5OTk5OTk5OTk5OTk5OSAobGVnYWN5KSAqLwogI2lmbmRlZiBQWV9OT19TSE9SVF9GTE9BVF9SRVBSCi0JU0VUX1NZU19GUk9NX1NUUklORygiZmxvYXRfcmVwcl9zdHlsZSIsCi0JCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZygic2hvcnQiKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygiZmxvYXRfcmVwcl9zdHlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKCJzaG9ydCIpKTsKICNlbHNlCi0JU0VUX1NZU19GUk9NX1NUUklORygiZmxvYXRfcmVwcl9zdHlsZSIsCi0JCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZygibGVnYWN5IikpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImZsb2F0X3JlcHJfc3R5bGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZygibGVnYWN5IikpOwogI2VuZGlmCiAKICN1bmRlZiBTRVRfU1lTX0ZST01fU1RSSU5HCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBtOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ha2VwYXRob2JqZWN0KGNoYXIgKnBhdGgsIGludCBkZWxpbSkKIHsKLQlpbnQgaSwgbjsKLQljaGFyICpwOwotCVB5T2JqZWN0ICp2LCAqdzsKKyAgICBpbnQgaSwgbjsKKyAgICBjaGFyICpwOworICAgIFB5T2JqZWN0ICp2LCAqdzsKIAotCW4gPSAxOwotCXAgPSBwYXRoOwotCXdoaWxlICgocCA9IHN0cmNocihwLCBkZWxpbSkpICE9IE5VTEwpIHsKLQkJbisrOwotCQlwKys7Ci0JfQotCXYgPSBQeUxpc3RfTmV3KG4pOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IDsgaSsrKSB7Ci0JCXAgPSBzdHJjaHIocGF0aCwgZGVsaW0pOwotCQlpZiAocCA9PSBOVUxMKQotCQkJcCA9IHN0cmNocihwYXRoLCAnXDAnKTsgLyogRW5kIG9mIHN0cmluZyAqLwotCQl3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocGF0aCwgKFB5X3NzaXplX3QpIChwIC0gcGF0aCkpOwotCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeUxpc3RfU2V0SXRlbSh2LCBpLCB3KTsKLQkJaWYgKCpwID09ICdcMCcpCi0JCQlicmVhazsKLQkJcGF0aCA9IHArMTsKLQl9Ci0JcmV0dXJuIHY7CisgICAgbiA9IDE7CisgICAgcCA9IHBhdGg7CisgICAgd2hpbGUgKChwID0gc3RyY2hyKHAsIGRlbGltKSkgIT0gTlVMTCkgeworICAgICAgICBuKys7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgdiA9IFB5TGlzdF9OZXcobik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgOyBpKyspIHsKKyAgICAgICAgcCA9IHN0cmNocihwYXRoLCBkZWxpbSk7CisgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICBwID0gc3RyY2hyKHBhdGgsICdcMCcpOyAvKiBFbmQgb2Ygc3RyaW5nICovCisgICAgICAgIHcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwYXRoLCAoUHlfc3NpemVfdCkgKHAgLSBwYXRoKSk7CisgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5TGlzdF9TZXRJdGVtKHYsIGksIHcpOworICAgICAgICBpZiAoKnAgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwYXRoID0gcCsxOworICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogdm9pZAogUHlTeXNfU2V0UGF0aChjaGFyICpwYXRoKQogewotCVB5T2JqZWN0ICp2OwotCWlmICgodiA9IG1ha2VwYXRob2JqZWN0KHBhdGgsIERFTElNKSkgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgY3JlYXRlIHN5cy5wYXRoIik7Ci0JaWYgKFB5U3lzX1NldE9iamVjdCgicGF0aCIsIHYpICE9IDApCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGFzc2lnbiBzeXMucGF0aCIpOwotCVB5X0RFQ1JFRih2KTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpZiAoKHYgPSBtYWtlcGF0aG9iamVjdChwYXRoLCBERUxJTSkpID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGNyZWF0ZSBzeXMucGF0aCIpOworICAgIGlmIChQeVN5c19TZXRPYmplY3QoInBhdGgiLCB2KSAhPSAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBhc3NpZ24gc3lzLnBhdGgiKTsKKyAgICBQeV9ERUNSRUYodik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlYXJndm9iamVjdChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JUHlPYmplY3QgKmF2OwotCWlmIChhcmdjIDw9IDAgfHwgYXJndiA9PSBOVUxMKSB7Ci0JCS8qIEVuc3VyZSBhdCBsZWFzdCBvbmUgKGVtcHR5KSBhcmd1bWVudCBpcyBzZWVuICovCi0JCXN0YXRpYyBjaGFyICplbXB0eV9hcmd2WzFdID0geyIifTsKLQkJYXJndiA9IGVtcHR5X2FyZ3Y7Ci0JCWFyZ2MgPSAxOwotCX0KLQlhdiA9IFB5TGlzdF9OZXcoYXJnYyk7Ci0JaWYgKGF2ICE9IE5VTEwpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBQeU9iamVjdCAqYXY7CisgICAgaWYgKGFyZ2MgPD0gMCB8fCBhcmd2ID09IE5VTEwpIHsKKyAgICAgICAgLyogRW5zdXJlIGF0IGxlYXN0IG9uZSAoZW1wdHkpIGFyZ3VtZW50IGlzIHNlZW4gKi8KKyAgICAgICAgc3RhdGljIGNoYXIgKmVtcHR5X2FyZ3ZbMV0gPSB7IiJ9OworICAgICAgICBhcmd2ID0gZW1wdHlfYXJndjsKKyAgICAgICAgYXJnYyA9IDE7CisgICAgfQorICAgIGF2ID0gUHlMaXN0X05ldyhhcmdjKTsKKyAgICBpZiAoYXYgIT0gTlVMTCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogI2lmZGVmIF9fVk1TCi0JCQlQeU9iamVjdCAqdjsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2OwogCi0JCQkvKiBhcmd2WzBdIGlzIHRoZSBzY3JpcHQgcGF0aG5hbWUgaWYga25vd24gKi8KLQkJCWlmIChpID09IDApIHsKLQkJCQljaGFyKiBmbiA9IGRlY2MkdHJhbnNsYXRlX3Ztcyhhcmd2WzBdKTsKLQkJCQlpZiAoKGZuID09IChjaGFyICopMCkgfHwgZm4gPT0gKGNoYXIgKiktMSkKLQkJCQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYXJndlswXSk7Ci0JCQkJZWxzZQotCQkJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygKLQkJCQkJCWRlY2MkdHJhbnNsYXRlX3Ztcyhhcmd2WzBdKSk7Ci0JCQl9IGVsc2UKLQkJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2W2ldKTsKKyAgICAgICAgICAgIC8qIGFyZ3ZbMF0gaXMgdGhlIHNjcmlwdCBwYXRobmFtZSBpZiBrbm93biAqLworICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIqIGZuID0gZGVjYyR0cmFuc2xhdGVfdm1zKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGlmICgoZm4gPT0gKGNoYXIgKikwKSB8fCBmbiA9PSAoY2hhciAqKS0xKQorICAgICAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2WzBdKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjYyR0cmFuc2xhdGVfdm1zKGFyZ3ZbMF0pKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbaV0pOwogI2Vsc2UKLQkJCVB5T2JqZWN0ICp2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2W2ldKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2W2ldKTsKICNlbmRpZgotCQkJaWYgKHYgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihhdik7Ci0JCQkJYXYgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUHlMaXN0X1NldEl0ZW0oYXYsIGksIHYpOwotCQl9Ci0JfQotCXJldHVybiBhdjsKKyAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXYpOworICAgICAgICAgICAgICAgIGF2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGF2LCBpLCB2KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXY7CiB9CiAKIHZvaWQKIFB5U3lzX1NldEFyZ3YoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogI2lmIGRlZmluZWQoSEFWRV9SRUFMUEFUSCkKLQljaGFyIGZ1bGxwYXRoW01BWFBBVEhMRU5dOworICAgIGNoYXIgZnVsbHBhdGhbTUFYUEFUSExFTl07CiAjZWxpZiBkZWZpbmVkKE1TX1dJTkRPV1MpICYmICFkZWZpbmVkKE1TX1dJTkNFKQotCWNoYXIgZnVsbHBhdGhbTUFYX1BBVEhdOworICAgIGNoYXIgZnVsbHBhdGhbTUFYX1BBVEhdOwogI2VuZGlmCi0JUHlPYmplY3QgKmF2ID0gbWFrZWFyZ3ZvYmplY3QoYXJnYywgYXJndik7Ci0JUHlPYmplY3QgKnBhdGggPSBQeVN5c19HZXRPYmplY3QoInBhdGgiKTsKLQlpZiAoYXYgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBzeXMuYXJndiIpOwotCWlmIChQeVN5c19TZXRPYmplY3QoImFyZ3YiLCBhdikgIT0gMCkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgYXNzaWduIHN5cy5hcmd2Iik7Ci0JaWYgKHBhdGggIT0gTlVMTCkgewotCQljaGFyICphcmd2MCA9IGFyZ3ZbMF07Ci0JCWNoYXIgKnAgPSBOVUxMOwotCQlQeV9zc2l6ZV90IG4gPSAwOwotCQlQeU9iamVjdCAqYTsKKyAgICBQeU9iamVjdCAqYXYgPSBtYWtlYXJndm9iamVjdChhcmdjLCBhcmd2KTsKKyAgICBQeU9iamVjdCAqcGF0aCA9IFB5U3lzX0dldE9iamVjdCgicGF0aCIpOworICAgIGlmIChhdiA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIHN5cy5hcmd2Iik7CisgICAgaWYgKFB5U3lzX1NldE9iamVjdCgiYXJndiIsIGF2KSAhPSAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBhc3NpZ24gc3lzLmFyZ3YiKTsKKyAgICBpZiAocGF0aCAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKmFyZ3YwID0gYXJndlswXTsKKyAgICAgICAgY2hhciAqcCA9IE5VTEw7CisgICAgICAgIFB5X3NzaXplX3QgbiA9IDA7CisgICAgICAgIFB5T2JqZWN0ICphOwogI2lmZGVmIEhBVkVfUkVBRExJTksKLQkJY2hhciBsaW5rW01BWFBBVEhMRU4rMV07Ci0JCWNoYXIgYXJndjBjb3B5WzIqTUFYUEFUSExFTisxXTsKLQkJaW50IG5yID0gMDsKLQkJaWYgKGFyZ2MgPiAwICYmIGFyZ3YwICE9IE5VTEwgJiYgc3RyY21wKGFyZ3YwLCAiLWMiKSAhPSAwKQotCQkJbnIgPSByZWFkbGluayhhcmd2MCwgbGluaywgTUFYUEFUSExFTik7Ci0JCWlmIChuciA+IDApIHsKLQkJCS8qIEl0J3MgYSBzeW1saW5rICovCi0JCQlsaW5rW25yXSA9ICdcMCc7Ci0JCQlpZiAobGlua1swXSA9PSBTRVApCi0JCQkJYXJndjAgPSBsaW5rOyAvKiBMaW5rIHRvIGFic29sdXRlIHBhdGggKi8KLQkJCWVsc2UgaWYgKHN0cmNocihsaW5rLCBTRVApID09IE5VTEwpCi0JCQkJOyAvKiBMaW5rIHdpdGhvdXQgcGF0aCAqLwotCQkJZWxzZSB7Ci0JCQkJLyogTXVzdCBqb2luKGRpcm5hbWUoYXJndjApLCBsaW5rKSAqLwotCQkJCWNoYXIgKnEgPSBzdHJyY2hyKGFyZ3YwLCBTRVApOwotCQkJCWlmIChxID09IE5VTEwpCi0JCQkJCWFyZ3YwID0gbGluazsgLyogYXJndjAgd2l0aG91dCBwYXRoICovCi0JCQkJZWxzZSB7Ci0JCQkJCS8qIE11c3QgbWFrZSBhIGNvcHkgKi8KLQkJCQkJc3RyY3B5KGFyZ3YwY29weSwgYXJndjApOwotCQkJCQlxID0gc3RycmNocihhcmd2MGNvcHksIFNFUCk7Ci0JCQkJCXN0cmNweShxKzEsIGxpbmspOwotCQkJCQlhcmd2MCA9IGFyZ3YwY29weTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgY2hhciBsaW5rW01BWFBBVEhMRU4rMV07CisgICAgICAgIGNoYXIgYXJndjBjb3B5WzIqTUFYUEFUSExFTisxXTsKKyAgICAgICAgaW50IG5yID0gMDsKKyAgICAgICAgaWYgKGFyZ2MgPiAwICYmIGFyZ3YwICE9IE5VTEwgJiYgc3RyY21wKGFyZ3YwLCAiLWMiKSAhPSAwKQorICAgICAgICAgICAgbnIgPSByZWFkbGluayhhcmd2MCwgbGluaywgTUFYUEFUSExFTik7CisgICAgICAgIGlmIChuciA+IDApIHsKKyAgICAgICAgICAgIC8qIEl0J3MgYSBzeW1saW5rICovCisgICAgICAgICAgICBsaW5rW25yXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAobGlua1swXSA9PSBTRVApCisgICAgICAgICAgICAgICAgYXJndjAgPSBsaW5rOyAvKiBMaW5rIHRvIGFic29sdXRlIHBhdGggKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNocihsaW5rLCBTRVApID09IE5VTEwpCisgICAgICAgICAgICAgICAgOyAvKiBMaW5rIHdpdGhvdXQgcGF0aCAqLworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogTXVzdCBqb2luKGRpcm5hbWUoYXJndjApLCBsaW5rKSAqLworICAgICAgICAgICAgICAgIGNoYXIgKnEgPSBzdHJyY2hyKGFyZ3YwLCBTRVApOworICAgICAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGFyZ3YwID0gbGluazsgLyogYXJndjAgd2l0aG91dCBwYXRoICovCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIE11c3QgbWFrZSBhIGNvcHkgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGFyZ3YwY29weSwgYXJndjApOworICAgICAgICAgICAgICAgICAgICBxID0gc3RycmNocihhcmd2MGNvcHksIFNFUCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShxKzEsIGxpbmspOworICAgICAgICAgICAgICAgICAgICBhcmd2MCA9IGFyZ3YwY29weTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbmRpZiAvKiBIQVZFX1JFQURMSU5LICovCiAjaWYgU0VQID09ICdcXCcgLyogU3BlY2lhbCBjYXNlIGZvciBNUyBmaWxlbmFtZSBzeW50YXggKi8KLQkJaWYgKGFyZ2MgPiAwICYmIGFyZ3YwICE9IE5VTEwgJiYgc3RyY21wKGFyZ3YwLCAiLWMiKSAhPSAwKSB7Ci0JCQljaGFyICpxOworICAgICAgICBpZiAoYXJnYyA+IDAgJiYgYXJndjAgIT0gTlVMTCAmJiBzdHJjbXAoYXJndjAsICItYyIpICE9IDApIHsKKyAgICAgICAgICAgIGNoYXIgKnE7CiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKSAmJiAhZGVmaW5lZChNU19XSU5DRSkKLQkJCS8qIFRoaXMgY29kZSBoZXJlIHJlcGxhY2VzIHRoZSBmaXJzdCBlbGVtZW50IGluIGFyZ3Ygd2l0aCB0aGUgZnVsbAotCQkJcGF0aCB0aGF0IGl0IHJlcHJlc2VudHMuIFVuZGVyIENFLCB0aGVyZSBhcmUgbm8gcmVsYXRpdmUgcGF0aHMgc28KLQkJCXRoZSBhcmd1bWVudCBtdXN0IGJlIHRoZSBmdWxsIHBhdGggYW55d2F5LiAqLwotCQkJY2hhciAqcHRlbXA7Ci0JCQlpZiAoR2V0RnVsbFBhdGhOYW1lKGFyZ3YwLAotCQkJCQkgICBzaXplb2YoZnVsbHBhdGgpLAotCQkJCQkgICBmdWxscGF0aCwKLQkJCQkJICAgJnB0ZW1wKSkgewotCQkJCWFyZ3YwID0gZnVsbHBhdGg7Ci0JCQl9CisgICAgICAgICAgICAvKiBUaGlzIGNvZGUgaGVyZSByZXBsYWNlcyB0aGUgZmlyc3QgZWxlbWVudCBpbiBhcmd2IHdpdGggdGhlIGZ1bGwKKyAgICAgICAgICAgIHBhdGggdGhhdCBpdCByZXByZXNlbnRzLiBVbmRlciBDRSwgdGhlcmUgYXJlIG5vIHJlbGF0aXZlIHBhdGhzIHNvCisgICAgICAgICAgICB0aGUgYXJndW1lbnQgbXVzdCBiZSB0aGUgZnVsbCBwYXRoIGFueXdheS4gKi8KKyAgICAgICAgICAgIGNoYXIgKnB0ZW1wOworICAgICAgICAgICAgaWYgKEdldEZ1bGxQYXRoTmFtZShhcmd2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZnVsbHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdGVtcCkpIHsKKyAgICAgICAgICAgICAgICBhcmd2MCA9IGZ1bGxwYXRoOworICAgICAgICAgICAgfQogI2VuZGlmCi0JCQlwID0gc3RycmNocihhcmd2MCwgU0VQKTsKLQkJCS8qIFRlc3QgZm9yIGFsdGVybmF0ZSBzZXBhcmF0b3IgKi8KLQkJCXEgPSBzdHJyY2hyKHAgPyBwIDogYXJndjAsICcvJyk7Ci0JCQlpZiAocSAhPSBOVUxMKQotCQkJCXAgPSBxOwotCQkJaWYgKHAgIT0gTlVMTCkgewotCQkJCW4gPSBwICsgMSAtIGFyZ3YwOwotCQkJCWlmIChuID4gMSAmJiBwWy0xXSAhPSAnOicpCi0JCQkJCW4tLTsgLyogRHJvcCB0cmFpbGluZyBzZXBhcmF0b3IgKi8KLQkJCX0KLQkJfQorICAgICAgICAgICAgcCA9IHN0cnJjaHIoYXJndjAsIFNFUCk7CisgICAgICAgICAgICAvKiBUZXN0IGZvciBhbHRlcm5hdGUgc2VwYXJhdG9yICovCisgICAgICAgICAgICBxID0gc3RycmNocihwID8gcCA6IGFyZ3YwLCAnLycpOworICAgICAgICAgICAgaWYgKHEgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwID0gcTsKKyAgICAgICAgICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBuID0gcCArIDEgLSBhcmd2MDsKKyAgICAgICAgICAgICAgICBpZiAobiA+IDEgJiYgcFstMV0gIT0gJzonKQorICAgICAgICAgICAgICAgICAgICBuLS07IC8qIERyb3AgdHJhaWxpbmcgc2VwYXJhdG9yICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbHNlIC8qIEFsbCBvdGhlciBmaWxlbmFtZSBzeW50YXhlcyAqLwotCQlpZiAoYXJnYyA+IDAgJiYgYXJndjAgIT0gTlVMTCAmJiBzdHJjbXAoYXJndjAsICItYyIpICE9IDApIHsKKyAgICAgICAgaWYgKGFyZ2MgPiAwICYmIGFyZ3YwICE9IE5VTEwgJiYgc3RyY21wKGFyZ3YwLCAiLWMiKSAhPSAwKSB7CiAjaWYgZGVmaW5lZChIQVZFX1JFQUxQQVRIKQotCQkJaWYgKHJlYWxwYXRoKGFyZ3YwLCBmdWxscGF0aCkpIHsKLQkJCQlhcmd2MCA9IGZ1bGxwYXRoOwotCQkJfQorICAgICAgICAgICAgaWYgKHJlYWxwYXRoKGFyZ3YwLCBmdWxscGF0aCkpIHsKKyAgICAgICAgICAgICAgICBhcmd2MCA9IGZ1bGxwYXRoOworICAgICAgICAgICAgfQogI2VuZGlmCi0JCQlwID0gc3RycmNocihhcmd2MCwgU0VQKTsKLQkJfQotCQlpZiAocCAhPSBOVUxMKSB7CisgICAgICAgICAgICBwID0gc3RycmNocihhcmd2MCwgU0VQKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocCAhPSBOVUxMKSB7CiAjaWZuZGVmIFJJU0NPUwotCQkJbiA9IHAgKyAxIC0gYXJndjA7CisgICAgICAgICAgICBuID0gcCArIDEgLSBhcmd2MDsKICNlbHNlIC8qIGRvbid0IGluY2x1ZGUgdHJhaWxpbmcgc2VwYXJhdG9yICovCi0JCQluID0gcCAtIGFyZ3YwOworICAgICAgICAgICAgbiA9IHAgLSBhcmd2MDsKICNlbmRpZiAvKiBSSVNDT1MgKi8KICNpZiBTRVAgPT0gJy8nIC8qIFNwZWNpYWwgY2FzZSBmb3IgVW5peCBmaWxlbmFtZSBzeW50YXggKi8KLQkJCWlmIChuID4gMSkKLQkJCQluLS07IC8qIERyb3AgdHJhaWxpbmcgc2VwYXJhdG9yICovCisgICAgICAgICAgICBpZiAobiA+IDEpCisgICAgICAgICAgICAgICAgbi0tOyAvKiBEcm9wIHRyYWlsaW5nIHNlcGFyYXRvciAqLwogI2VuZGlmIC8qIFVuaXggKi8KLQkJfQorICAgICAgICB9CiAjZW5kaWYgLyogQWxsIG90aGVycyAqLwotCQlhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYXJndjAsIG4pOwotCQlpZiAoYSA9PSBOVUxMKQotCQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBzeXMucGF0aCBpbnNlcnRpb24iKTsKLQkJaWYgKFB5TGlzdF9JbnNlcnQocGF0aCwgMCwgYSkgPCAwKQotCQkJUHlfRmF0YWxFcnJvcigic3lzLnBhdGguaW5zZXJ0KDApIGZhaWxlZCIpOwotCQlQeV9ERUNSRUYoYSk7Ci0JfQotCVB5X0RFQ1JFRihhdik7CisgICAgICAgIGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShhcmd2MCwgbik7CisgICAgICAgIGlmIChhID09IE5VTEwpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIHN5cy5wYXRoIGluc2VydGlvbiIpOworICAgICAgICBpZiAoUHlMaXN0X0luc2VydChwYXRoLCAwLCBhKSA8IDApCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJzeXMucGF0aC5pbnNlcnQoMCkgZmFpbGVkIik7CisgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGF2KTsKIH0KIAogCkBAIC0xNzgwLDQ4ICsxNzgwLDQ4IEBACiBzdGF0aWMgdm9pZAogbXl3cml0ZShjaGFyICpuYW1lLCBGSUxFICpmcCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQogewotCVB5T2JqZWN0ICpmaWxlOwotCVB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisgICAgUHlPYmplY3QgKmZpbGU7CisgICAgUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKIAotCVB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwotCWZpbGUgPSBQeVN5c19HZXRPYmplY3QobmFtZSk7Ci0JaWYgKGZpbGUgPT0gTlVMTCB8fCBQeUZpbGVfQXNGaWxlKGZpbGUpID09IGZwKQotCQl2ZnByaW50ZihmcCwgZm9ybWF0LCB2YSk7Ci0JZWxzZSB7Ci0JCWNoYXIgYnVmZmVyWzEwMDFdOwotCQljb25zdCBpbnQgd3JpdHRlbiA9IFB5T1NfdnNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkJCQkgICBmb3JtYXQsIHZhKTsKLQkJaWYgKFB5RmlsZV9Xcml0ZVN0cmluZyhidWZmZXIsIGZpbGUpICE9IDApIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlmcHV0cyhidWZmZXIsIGZwKTsKLQkJfQotCQlpZiAod3JpdHRlbiA8IDAgfHwgKHNpemVfdCl3cml0dGVuID49IHNpemVvZihidWZmZXIpKSB7Ci0JCQljb25zdCBjaGFyICp0cnVuY2F0ZWQgPSAiLi4uIHRydW5jYXRlZCI7Ci0JCQlpZiAoUHlGaWxlX1dyaXRlU3RyaW5nKHRydW5jYXRlZCwgZmlsZSkgIT0gMCkgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJZnB1dHModHJ1bmNhdGVkLCBmcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKKyAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKKyAgICBmaWxlID0gUHlTeXNfR2V0T2JqZWN0KG5hbWUpOworICAgIGlmIChmaWxlID09IE5VTEwgfHwgUHlGaWxlX0FzRmlsZShmaWxlKSA9PSBmcCkKKyAgICAgICAgdmZwcmludGYoZnAsIGZvcm1hdCwgdmEpOworICAgIGVsc2UgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMDAxXTsKKyAgICAgICAgY29uc3QgaW50IHdyaXR0ZW4gPSBQeU9TX3ZzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdmEpOworICAgICAgICBpZiAoUHlGaWxlX1dyaXRlU3RyaW5nKGJ1ZmZlciwgZmlsZSkgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGZwdXRzKGJ1ZmZlciwgZnApOworICAgICAgICB9CisgICAgICAgIGlmICh3cml0dGVuIDwgMCB8fCAoc2l6ZV90KXdyaXR0ZW4gPj0gc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRydW5jYXRlZCA9ICIuLi4gdHJ1bmNhdGVkIjsKKyAgICAgICAgICAgIGlmIChQeUZpbGVfV3JpdGVTdHJpbmcodHJ1bmNhdGVkLCBmaWxlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBmcHV0cyh0cnVuY2F0ZWQsIGZwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOwogfQogCiB2b2lkCiBQeVN5c19Xcml0ZVN0ZG91dChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOworICAgIHZhX2xpc3QgdmE7CiAKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQlteXdyaXRlKCJzdGRvdXQiLCBzdGRvdXQsIGZvcm1hdCwgdmEpOwotCXZhX2VuZCh2YSk7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgbXl3cml0ZSgic3Rkb3V0Iiwgc3Rkb3V0LCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOwogfQogCiB2b2lkCiBQeVN5c19Xcml0ZVN0ZGVycihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOworICAgIHZhX2xpc3QgdmE7CiAKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQlteXdyaXRlKCJzdGRlcnIiLCBzdGRlcnIsIGZvcm1hdCwgdmEpOwotCXZhX2VuZCh2YSk7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgbXl3cml0ZSgic3RkZXJyIiwgc3RkZXJyLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZC5jIGIvUHl0aG9uL3RocmVhZC5jCmluZGV4IGZmNTcxZDguLjE1NzhmODIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWQuYworKysgYi9QeXRob24vdGhyZWFkLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICNlbmRpZgogCiAvKiBDaGVjayBpZiB3ZSdyZSBydW5uaW5nIG9uIEhQLVVYIGFuZCBfU0NfVEhSRUFEUyBpcyBkZWZpbmVkLiBJZiBzbywgdGhlbgotICAgZW5vdWdoIG9mIHRoZSBQb3NpeCB0aHJlYWRzIHBhY2thZ2UgaXMgaW1wbGltZW50ZWQgdG8gc3VwcG9ydCBweXRob24gCisgICBlbm91Z2ggb2YgdGhlIFBvc2l4IHRocmVhZHMgcGFja2FnZSBpcyBpbXBsaW1lbnRlZCB0byBzdXBwb3J0IHB5dGhvbgogICAgdGhyZWFkcy4KIAogICAgVGhpcyBpcyB2YWxpZCBmb3IgSFAtVVggMTEuMjMgcnVubmluZyBvbiBhbiBpYTY0IHN5c3RlbS4gSWYgbmVlZGVkLCBhZGQKQEAgLTY0LDggKzY0LDggQEAKIAogI2lmZGVmIFB5X0RFQlVHCiBzdGF0aWMgaW50IHRocmVhZF9kZWJ1ZyA9IDA7Ci0jZGVmaW5lIGRwcmludGYoYXJncykJKHZvaWQpKCh0aHJlYWRfZGVidWcgJiAxKSAmJiBwcmludGYgYXJncykKLSNkZWZpbmUgZDJwcmludGYoYXJncykJKCh0aHJlYWRfZGVidWcgJiA4KSAmJiBwcmludGYgYXJncykKKyNkZWZpbmUgZHByaW50ZihhcmdzKSAgICh2b2lkKSgodGhyZWFkX2RlYnVnICYgMSkgJiYgcHJpbnRmIGFyZ3MpCisjZGVmaW5lIGQycHJpbnRmKGFyZ3MpICAoKHRocmVhZF9kZWJ1ZyAmIDgpICYmIHByaW50ZiBhcmdzKQogI2Vsc2UKICNkZWZpbmUgZHByaW50ZihhcmdzKQogI2RlZmluZSBkMnByaW50ZihhcmdzKQpAQCAtNzksMjAgKzc5LDIwIEBACiBQeVRocmVhZF9pbml0X3RocmVhZCh2b2lkKQogewogI2lmZGVmIFB5X0RFQlVHCi0JY2hhciAqcCA9IFB5X0dFVEVOVigiUFlUSE9OVEhSRUFEREVCVUciKTsKKyAgICBjaGFyICpwID0gUHlfR0VURU5WKCJQWVRIT05USFJFQURERUJVRyIpOwogCi0JaWYgKHApIHsKLQkJaWYgKCpwKQotCQkJdGhyZWFkX2RlYnVnID0gYXRvaShwKTsKLQkJZWxzZQotCQkJdGhyZWFkX2RlYnVnID0gMTsKLQl9CisgICAgaWYgKHApIHsKKyAgICAgICAgaWYgKCpwKQorICAgICAgICAgICAgdGhyZWFkX2RlYnVnID0gYXRvaShwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyZWFkX2RlYnVnID0gMTsKKyAgICB9CiAjZW5kaWYgLyogUHlfREVCVUcgKi8KLQlpZiAoaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQlpbml0aWFsaXplZCA9IDE7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2luaXRfdGhyZWFkIGNhbGxlZFxuIikpOwotCVB5VGhyZWFkX19pbml0X3RocmVhZCgpOworICAgIGlmIChpbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworICAgIGluaXRpYWxpemVkID0gMTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfaW5pdF90aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgUHlUaHJlYWRfX2luaXRfdGhyZWFkKCk7CiB9CiAKIC8qIFN1cHBvcnQgZm9yIHJ1bnRpbWUgdGhyZWFkIHN0YWNrIHNpemUgdHVuaW5nLgpAQCAtMTU1LDIxICsxNTUsMjEgQEAKIHNpemVfdAogUHlUaHJlYWRfZ2V0X3N0YWNrc2l6ZSh2b2lkKQogewotCXJldHVybiBfcHl0aHJlYWRfc3RhY2tzaXplOworICAgIHJldHVybiBfcHl0aHJlYWRfc3RhY2tzaXplOwogfQogCiAvKiBPbmx5IHBsYXRmb3JtcyBkZWZpbmluZyBhIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKCkgbWFjcm8KICAgIGluIHRocmVhZF88cGxhdGZvcm0+Lmggc3VwcG9ydCBjaGFuZ2luZyB0aGUgc3RhY2sgc2l6ZS4KICAgIFJldHVybiAwIGlmIHN0YWNrIHNpemUgaXMgdmFsaWQsCi0gICAgICAgICAgLTEgaWYgc3RhY2sgc2l6ZSB2YWx1ZSBpcyBpbnZhbGlkLAotICAgICAgICAgIC0yIGlmIHNldHRpbmcgc3RhY2sgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkLiAqLworICAgICAgLTEgaWYgc3RhY2sgc2l6ZSB2YWx1ZSBpcyBpbnZhbGlkLAorICAgICAgLTIgaWYgc2V0dGluZyBzdGFjayBzaXplIGlzIG5vdCBzdXBwb3J0ZWQuICovCiBpbnQKIFB5VGhyZWFkX3NldF9zdGFja3NpemUoc2l6ZV90IHNpemUpCiB7CiAjaWYgZGVmaW5lZChUSFJFQURfU0VUX1NUQUNLU0laRSkKLQlyZXR1cm4gVEhSRUFEX1NFVF9TVEFDS1NJWkUoc2l6ZSk7CisgICAgcmV0dXJuIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKHNpemUpOwogI2Vsc2UKLQlyZXR1cm4gLTI7CisgICAgcmV0dXJuIC0yOwogI2VuZGlmCiB9CiAKQEAgLTIyMSwxNSArMjIxLDE1IEBACiAgKiB0byBlbmZvcmNlIGV4Y2x1c2lvbiBpbnRlcm5hbGx5LgogICovCiBzdHJ1Y3Qga2V5IHsKLQkvKiBOZXh0IHJlY29yZCBpbiB0aGUgbGlzdCwgb3IgTlVMTCBpZiB0aGlzIGlzIHRoZSBsYXN0IHJlY29yZC4gKi8KLQlzdHJ1Y3Qga2V5ICpuZXh0OworICAgIC8qIE5leHQgcmVjb3JkIGluIHRoZSBsaXN0LCBvciBOVUxMIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVjb3JkLiAqLworICAgIHN0cnVjdCBrZXkgKm5leHQ7CiAKLQkvKiBUaGUgdGhyZWFkIGlkLCBhY2NvcmRpbmcgdG8gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLiAqLwotCWxvbmcgaWQ7CisgICAgLyogVGhlIHRocmVhZCBpZCwgYWNjb3JkaW5nIHRvIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKS4gKi8KKyAgICBsb25nIGlkOwogCi0JLyogVGhlIGtleSBhbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUuICovCi0JaW50IGtleTsKLQl2b2lkICp2YWx1ZTsKKyAgICAvKiBUaGUga2V5IGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZS4gKi8KKyAgICBpbnQga2V5OworICAgIHZvaWQgKnZhbHVlOwogfTsKIAogc3RhdGljIHN0cnVjdCBrZXkgKmtleWhlYWQgPSBOVUxMOwpAQCAtMjYwLDQxICsyNjAsNDEgQEAKIHN0YXRpYyBzdHJ1Y3Qga2V5ICoKIGZpbmRfa2V5KGludCBrZXksIHZvaWQgKnZhbHVlKQogewotCXN0cnVjdCBrZXkgKnAsICpwcmV2X3A7Ci0JbG9uZyBpZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBzdHJ1Y3Qga2V5ICpwLCAqcHJldl9wOworICAgIGxvbmcgaWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CiAKLQlpZiAoIWtleW11dGV4KQotCQlyZXR1cm4gTlVMTDsKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2soa2V5bXV0ZXgsIDEpOwotCXByZXZfcCA9IE5VTEw7Ci0JZm9yIChwID0ga2V5aGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgewotCQlpZiAocC0+aWQgPT0gaWQgJiYgcC0+a2V5ID09IGtleSkKLQkJCWdvdG8gRG9uZTsKLQkJLyogU2FuaXR5IGNoZWNrLiAgVGhlc2Ugc3RhdGVzIHNob3VsZCBuZXZlciBoYXBwZW4gYnV0IGlmCi0JCSAqIHRoZXkgZG8gd2UgbXVzdCBhYm9ydC4gIE90aGVyd2lzZSB3ZSdsbCBlbmQgdXAgc3Bpbm5pbmcgaW4KLQkJICogaW4gYSB0aWdodCBsb29wIHdpdGggdGhlIGxvY2sgaGVsZC4gIEEgc2ltaWxhciBjaGVjayBpcyBkb25lCi0JCSAqIGluIHB5c3RhdGUuYyB0c3RhdGVfZGVsZXRlX2NvbW1vbigpLiAgKi8KLQkJaWYgKHAgPT0gcHJldl9wKQotCQkJUHlfRmF0YWxFcnJvcigidGxzIGZpbmRfa2V5OiBzbWFsbCBjaXJjdWxhciBsaXN0KCEpIik7Ci0JCXByZXZfcCA9IHA7Ci0JCWlmIChwLT5uZXh0ID09IGtleWhlYWQpCi0JCQlQeV9GYXRhbEVycm9yKCJ0bHMgZmluZF9rZXk6IGNpcmN1bGFyIGxpc3QoISkiKTsKLQl9Ci0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJYXNzZXJ0KHAgPT0gTlVMTCk7Ci0JCWdvdG8gRG9uZTsKLQl9Ci0JcCA9IChzdHJ1Y3Qga2V5ICopbWFsbG9jKHNpemVvZihzdHJ1Y3Qga2V5KSk7Ci0JaWYgKHAgIT0gTlVMTCkgewotCQlwLT5pZCA9IGlkOwotCQlwLT5rZXkgPSBrZXk7Ci0JCXAtPnZhbHVlID0gdmFsdWU7Ci0JCXAtPm5leHQgPSBrZXloZWFkOwotCQlrZXloZWFkID0gcDsKLQl9CisgICAgaWYgKCFrZXltdXRleCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGtleW11dGV4LCAxKTsKKyAgICBwcmV2X3AgPSBOVUxMOworICAgIGZvciAocCA9IGtleWhlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpIHsKKyAgICAgICAgaWYgKHAtPmlkID09IGlkICYmIHAtPmtleSA9PSBrZXkpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIC8qIFNhbml0eSBjaGVjay4gIFRoZXNlIHN0YXRlcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJ1dCBpZgorICAgICAgICAgKiB0aGV5IGRvIHdlIG11c3QgYWJvcnQuICBPdGhlcndpc2Ugd2UnbGwgZW5kIHVwIHNwaW5uaW5nIGluCisgICAgICAgICAqIGluIGEgdGlnaHQgbG9vcCB3aXRoIHRoZSBsb2NrIGhlbGQuICBBIHNpbWlsYXIgY2hlY2sgaXMgZG9uZQorICAgICAgICAgKiBpbiBweXN0YXRlLmMgdHN0YXRlX2RlbGV0ZV9jb21tb24oKS4gICovCisgICAgICAgIGlmIChwID09IHByZXZfcCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoInRscyBmaW5kX2tleTogc21hbGwgY2lyY3VsYXIgbGlzdCghKSIpOworICAgICAgICBwcmV2X3AgPSBwOworICAgICAgICBpZiAocC0+bmV4dCA9PSBrZXloZWFkKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigidGxzIGZpbmRfa2V5OiBjaXJjdWxhciBsaXN0KCEpIik7CisgICAgfQorICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIGFzc2VydChwID09IE5VTEwpOworICAgICAgICBnb3RvIERvbmU7CisgICAgfQorICAgIHAgPSAoc3RydWN0IGtleSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGtleSkpOworICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgcC0+aWQgPSBpZDsKKyAgICAgICAgcC0+a2V5ID0ga2V5OworICAgICAgICBwLT52YWx1ZSA9IHZhbHVlOworICAgICAgICBwLT5uZXh0ID0ga2V5aGVhZDsKKyAgICAgICAga2V5aGVhZCA9IHA7CisgICAgfQogIERvbmU6Ci0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGtleW11dGV4KTsKLQlyZXR1cm4gcDsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soa2V5bXV0ZXgpOworICAgIHJldHVybiBwOwogfQogCiAvKiBSZXR1cm4gYSBuZXcga2V5LiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9ucyBpbgpAQCAtMzA0LDMyICszMDQsMzIgQEAKIGludAogUHlUaHJlYWRfY3JlYXRlX2tleSh2b2lkKQogewotCS8qIEFsbCBwYXJ0cyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSB3cm9uZyBpZiBpdCdzIGNhbGxlZCBieSBtdWx0aXBsZQotCSAqIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkuCi0JICovCi0JaWYgKGtleW11dGV4ID09IE5VTEwpCi0JCWtleW11dGV4ID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCXJldHVybiArK25rZXlzOworICAgIC8qIEFsbCBwYXJ0cyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSB3cm9uZyBpZiBpdCdzIGNhbGxlZCBieSBtdWx0aXBsZQorICAgICAqIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkuCisgICAgICovCisgICAgaWYgKGtleW11dGV4ID09IE5VTEwpCisgICAgICAgIGtleW11dGV4ID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIHJldHVybiArK25rZXlzOwogfQogCiAvKiBGb3JnZXQgdGhlIGFzc29jaWF0aW9ucyBmb3Iga2V5IGFjcm9zcyAqYWxsKiB0aHJlYWRzLiAqLwogdm9pZAogUHlUaHJlYWRfZGVsZXRlX2tleShpbnQga2V5KQogewotCXN0cnVjdCBrZXkgKnAsICoqcTsKKyAgICBzdHJ1Y3Qga2V5ICpwLCAqKnE7CiAKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2soa2V5bXV0ZXgsIDEpOwotCXEgPSAma2V5aGVhZDsKLQl3aGlsZSAoKHAgPSAqcSkgIT0gTlVMTCkgewotCQlpZiAocC0+a2V5ID09IGtleSkgewotCQkJKnEgPSBwLT5uZXh0OwotCQkJZnJlZSgodm9pZCAqKXApOwotCQkJLyogTkIgVGhpcyBkb2VzICpub3QqIGZyZWUgcC0+dmFsdWUhICovCi0JCX0KLQkJZWxzZQotCQkJcSA9ICZwLT5uZXh0OwotCX0KLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soa2V5bXV0ZXgpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhrZXltdXRleCwgMSk7CisgICAgcSA9ICZrZXloZWFkOworICAgIHdoaWxlICgocCA9ICpxKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwLT5rZXkgPT0ga2V5KSB7CisgICAgICAgICAgICAqcSA9IHAtPm5leHQ7CisgICAgICAgICAgICBmcmVlKCh2b2lkICopcCk7CisgICAgICAgICAgICAvKiBOQiBUaGlzIGRvZXMgKm5vdCogZnJlZSBwLT52YWx1ZSEgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBxID0gJnAtPm5leHQ7CisgICAgfQorICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhrZXltdXRleCk7CiB9CiAKIC8qIENvbmZ1c2luZzogIElmIHRoZSBjdXJyZW50IHRocmVhZCBoYXMgYW4gYXNzb2NpYXRpb24gZm9yIGtleSwKQEAgLTM0MSwxNCArMzQxLDE0IEBACiBpbnQKIFB5VGhyZWFkX3NldF9rZXlfdmFsdWUoaW50IGtleSwgdm9pZCAqdmFsdWUpCiB7Ci0Jc3RydWN0IGtleSAqcDsKKyAgICBzdHJ1Y3Qga2V5ICpwOwogCi0JYXNzZXJ0KHZhbHVlICE9IE5VTEwpOwotCXAgPSBmaW5kX2tleShrZXksIHZhbHVlKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKKyAgICBhc3NlcnQodmFsdWUgIT0gTlVMTCk7CisgICAgcCA9IGZpbmRfa2V5KGtleSwgdmFsdWUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOwogfQogCiAvKiBSZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGtleSBpbiB0aGUgY3VycmVudCB0aHJlYWQsIG9yIE5VTEwKQEAgLTM1NywzNCArMzU3LDM0IEBACiB2b2lkICoKIFB5VGhyZWFkX2dldF9rZXlfdmFsdWUoaW50IGtleSkKIHsKLQlzdHJ1Y3Qga2V5ICpwID0gZmluZF9rZXkoa2V5LCBOVUxMKTsKKyAgICBzdHJ1Y3Qga2V5ICpwID0gZmluZF9rZXkoa2V5LCBOVUxMKTsKIAotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuIHAtPnZhbHVlOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHAtPnZhbHVlOwogfQogCiAvKiBGb3JnZXQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgYXNzb2NpYXRpb24gZm9yIGtleSwgaWYgYW55LiAqLwogdm9pZAogUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShpbnQga2V5KQogewotCWxvbmcgaWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7Ci0Jc3RydWN0IGtleSAqcCwgKipxOworICAgIGxvbmcgaWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgc3RydWN0IGtleSAqcCwgKipxOwogCi0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGtleW11dGV4LCAxKTsKLQlxID0gJmtleWhlYWQ7Ci0Jd2hpbGUgKChwID0gKnEpICE9IE5VTEwpIHsKLQkJaWYgKHAtPmtleSA9PSBrZXkgJiYgcC0+aWQgPT0gaWQpIHsKLQkJCSpxID0gcC0+bmV4dDsKLQkJCWZyZWUoKHZvaWQgKilwKTsKLQkJCS8qIE5CIFRoaXMgZG9lcyAqbm90KiBmcmVlIHAtPnZhbHVlISAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJcSA9ICZwLT5uZXh0OwotCX0KLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soa2V5bXV0ZXgpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhrZXltdXRleCwgMSk7CisgICAgcSA9ICZrZXloZWFkOworICAgIHdoaWxlICgocCA9ICpxKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwLT5rZXkgPT0ga2V5ICYmIHAtPmlkID09IGlkKSB7CisgICAgICAgICAgICAqcSA9IHAtPm5leHQ7CisgICAgICAgICAgICBmcmVlKCh2b2lkICopcCk7CisgICAgICAgICAgICAvKiBOQiBUaGlzIGRvZXMgKm5vdCogZnJlZSBwLT52YWx1ZSEgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHEgPSAmcC0+bmV4dDsKKyAgICB9CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGtleW11dGV4KTsKIH0KIAogLyogRm9yZ2V0IGV2ZXJ5dGhpbmcgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCB0aHJlYWQgaWQuCkBAIC0zOTUsMjcgKzM5NSwyNyBAQAogdm9pZAogUHlUaHJlYWRfUmVJbml0VExTKHZvaWQpCiB7Ci0JbG9uZyBpZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQlzdHJ1Y3Qga2V5ICpwLCAqKnE7CisgICAgbG9uZyBpZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBzdHJ1Y3Qga2V5ICpwLCAqKnE7CiAKLQlpZiAoIWtleW11dGV4KQotCQlyZXR1cm47Ci0JCi0JLyogQXMgd2l0aCBpbnRlcnByZXRlcl9sb2NrIGluIFB5RXZhbF9SZUluaXRUaHJlYWRzKCkKLQkgICB3ZSBqdXN0IGNyZWF0ZSBhIG5ldyBsb2NrIHdpdGhvdXQgZnJlZWluZyB0aGUgb2xkIG9uZSAqLwotCWtleW11dGV4ID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmICgha2V5bXV0ZXgpCisgICAgICAgIHJldHVybjsKIAotCS8qIERlbGV0ZSBhbGwga2V5cyB3aGljaCBkbyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgdGhyZWFkIGlkICovCi0JcSA9ICZrZXloZWFkOwotCXdoaWxlICgocCA9ICpxKSAhPSBOVUxMKSB7Ci0JCWlmIChwLT5pZCAhPSBpZCkgewotCQkJKnEgPSBwLT5uZXh0OwotCQkJZnJlZSgodm9pZCAqKXApOwotCQkJLyogTkIgVGhpcyBkb2VzICpub3QqIGZyZWUgcC0+dmFsdWUhICovCi0JCX0KLQkJZWxzZQotCQkJcSA9ICZwLT5uZXh0OwotCX0KKyAgICAvKiBBcyB3aXRoIGludGVycHJldGVyX2xvY2sgaW4gUHlFdmFsX1JlSW5pdFRocmVhZHMoKQorICAgICAgIHdlIGp1c3QgY3JlYXRlIGEgbmV3IGxvY2sgd2l0aG91dCBmcmVlaW5nIHRoZSBvbGQgb25lICovCisgICAga2V5bXV0ZXggPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisKKyAgICAvKiBEZWxldGUgYWxsIGtleXMgd2hpY2ggZG8gbm90IG1hdGNoIHRoZSBjdXJyZW50IHRocmVhZCBpZCAqLworICAgIHEgPSAma2V5aGVhZDsKKyAgICB3aGlsZSAoKHAgPSAqcSkgIT0gTlVMTCkgeworICAgICAgICBpZiAocC0+aWQgIT0gaWQpIHsKKyAgICAgICAgICAgICpxID0gcC0+bmV4dDsKKyAgICAgICAgICAgIGZyZWUoKHZvaWQgKilwKTsKKyAgICAgICAgICAgIC8qIE5CIFRoaXMgZG9lcyAqbm90KiBmcmVlIHAtPnZhbHVlISAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHEgPSAmcC0+bmV4dDsKKyAgICB9CiB9CiAKICNlbmRpZiAvKiBQeV9IQVZFX05BVElWRV9UTFMgKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfYXRoZW9zLmggYi9QeXRob24vdGhyZWFkX2F0aGVvcy5oCmluZGV4IDc0N2E2YTIuLjIzMDU5NGYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfYXRoZW9zLmgKKysrIGIvUHl0aG9uL3RocmVhZF9hdGhlb3MuaApAQCAtMTksOCArMTksOCBAQAogCiAvKiBVc2UgYW4gYXRvbWljIGNvdW50ZXIgYW5kIGEgc2VtYXBob3JlIGZvciBtYXhpbXVtIHNwZWVkLiAqLwogdHlwZWRlZiBzdHJ1Y3QgZmFzdG11dGV4IHsKLQlzZW1faWQgc2VtOwotCWF0b21pY190IGNvdW50OworICAgIHNlbV9pZCBzZW07CisgICAgYXRvbWljX3QgY291bnQ7CiB9IGZhc3RtdXRleF90OwogCiAKQEAgLTMzLDQ5ICszMyw0OSBAQAogCiBzdGF0aWMgaW50IGZhc3RtdXRleF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgZmFzdG11dGV4X3QgKiBtdXRleCkKIHsKLQltdXRleC0+Y291bnQgPSAwOwotCW11dGV4LT5zZW0gPSBjcmVhdGVfc2VtYXBob3JlKG5hbWUsIDAsIDApOwotCXJldHVybiAobXV0ZXgtPnNlbSA8IDApID8gLTEgOiAwOworICAgIG11dGV4LT5jb3VudCA9IDA7CisgICAgbXV0ZXgtPnNlbSA9IGNyZWF0ZV9zZW1hcGhvcmUobmFtZSwgMCwgMCk7CisgICAgcmV0dXJuIChtdXRleC0+c2VtIDwgMCkgPyAtMSA6IDA7CiB9CiAKIAogc3RhdGljIGludCBmYXN0bXV0ZXhfZGVzdHJveShmYXN0bXV0ZXhfdCAqIG11dGV4KQogewotCWlmIChmYXN0bXV0ZXhfdGltZWRsb2NrKG11dGV4LCAwKSA9PSAwIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSB7Ci0JCXJldHVybiBkZWxldGVfc2VtYXBob3JlKG11dGV4LT5zZW0pOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoZmFzdG11dGV4X3RpbWVkbG9jayhtdXRleCwgMCkgPT0gMCB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgeworICAgICAgICByZXR1cm4gZGVsZXRlX3NlbWFwaG9yZShtdXRleC0+c2VtKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludCBmYXN0bXV0ZXhfbG9jayhmYXN0bXV0ZXhfdCAqIG11dGV4KQogewotCWF0b21pY190IHByZXYgPSBhdG9taWNfYWRkKCZtdXRleC0+Y291bnQsIDEpOwotCWlmIChwcmV2ID4gMCkKLQkJcmV0dXJuIGxvY2tfc2VtYXBob3JlKG11dGV4LT5zZW0pOwotCXJldHVybiAwOworICAgIGF0b21pY190IHByZXYgPSBhdG9taWNfYWRkKCZtdXRleC0+Y291bnQsIDEpOworICAgIGlmIChwcmV2ID4gMCkKKyAgICAgICAgcmV0dXJuIGxvY2tfc2VtYXBob3JlKG11dGV4LT5zZW0pOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQgZmFzdG11dGV4X3RpbWVkbG9jayhmYXN0bXV0ZXhfdCAqIG11dGV4LCBiaWd0aW1lX3QgdGltZW91dCkKIHsKLQlhdG9taWNfdCBwcmV2ID0gYXRvbWljX2FkZCgmbXV0ZXgtPmNvdW50LCAxKTsKLQlpZiAocHJldiA+IDApCi0JCXJldHVybiBsb2NrX3NlbWFwaG9yZV94KG11dGV4LT5zZW0sIDEsIDAsIHRpbWVvdXQpOwotCXJldHVybiAwOworICAgIGF0b21pY190IHByZXYgPSBhdG9taWNfYWRkKCZtdXRleC0+Y291bnQsIDEpOworICAgIGlmIChwcmV2ID4gMCkKKyAgICAgICAgcmV0dXJuIGxvY2tfc2VtYXBob3JlX3gobXV0ZXgtPnNlbSwgMSwgMCwgdGltZW91dCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludCBmYXN0bXV0ZXhfdW5sb2NrKGZhc3RtdXRleF90ICogbXV0ZXgpCiB7Ci0JYXRvbWljX3QgcHJldiA9IGF0b21pY19hZGQoJm11dGV4LT5jb3VudCwgLTEpOwotCWlmIChwcmV2ID4gMSkKLQkJcmV0dXJuIHVubG9ja19zZW1hcGhvcmUobXV0ZXgtPnNlbSk7Ci0JcmV0dXJuIDA7CisgICAgYXRvbWljX3QgcHJldiA9IGF0b21pY19hZGQoJm11dGV4LT5jb3VudCwgLTEpOworICAgIGlmIChwcmV2ID4gMSkKKyAgICAgICAgcmV0dXJuIHVubG9ja19zZW1hcGhvcmUobXV0ZXgtPnNlbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAotI2VuZGlmCQkJCS8qIEZBU1RMT0NLICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZBU1RMT0NLICovCiAKIAogLyoKQEAgLTg0LDggKzg0LDggQEAKICAqLwogc3RhdGljIHZvaWQgUHlUaHJlYWRfX2luaXRfdGhyZWFkKHZvaWQpCiB7Ci0JLyogRG8gbm90aGluZy4gKi8KLQlyZXR1cm47CisgICAgLyogRG8gbm90aGluZy4gKi8KKyAgICByZXR1cm47CiB9CiAKIApAQCAtOTgsNDggKzk4LDQ4IEBACiAKIGxvbmcgUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh2b2lkICgqZnVuYykgKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlzdGF0dXNfdCBzdWNjZXNzID0gLTE7Ci0JdGhyZWFkX2lkIHRpZDsKLQljaGFyIG5hbWVbT1NfTkFNRV9MRU5HVEhdOwotCWF0b21pY190IHRoaXNfdGhyZWFkOworICAgIHN0YXR1c190IHN1Y2Nlc3MgPSAtMTsKKyAgICB0aHJlYWRfaWQgdGlkOworICAgIGNoYXIgbmFtZVtPU19OQU1FX0xFTkdUSF07CisgICAgYXRvbWljX3QgdGhpc190aHJlYWQ7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKIAotCXRoaXNfdGhyZWFkID0gYXRvbWljX2FkZCgmdGhyZWFkX2NvdW50LCAxKTsKLQlQeU9TX3NucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInB5dGhvbiB0aHJlYWQgKCVkKSIsIHRoaXNfdGhyZWFkKTsKKyAgICB0aGlzX3RocmVhZCA9IGF0b21pY19hZGQoJnRocmVhZF9jb3VudCwgMSk7CisgICAgUHlPU19zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJweXRob24gdGhyZWFkICglZCkiLCB0aGlzX3RocmVhZCk7CiAKLQl0aWQgPSBzcGF3bl90aHJlYWQobmFtZSwgZnVuYywgTk9STUFMX1BSSU9SSVRZLCAwLCBhcmcpOwotCWlmICh0aWQgPCAwKSB7Ci0JCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIHNwYXduX3RocmVhZCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKLQl9IGVsc2UgewotCQlzdWNjZXNzID0gcmVzdW1lX3RocmVhZCh0aWQpOwotCQlpZiAoc3VjY2VzcyA8IDApIHsKLQkJCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIHJlc3VtZV90aHJlYWQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7Ci0JCX0KLQl9CisgICAgdGlkID0gc3Bhd25fdGhyZWFkKG5hbWUsIGZ1bmMsIE5PUk1BTF9QUklPUklUWSwgMCwgYXJnKTsKKyAgICBpZiAodGlkIDwgMCkgeworICAgICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBzcGF3bl90aHJlYWQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VjY2VzcyA9IHJlc3VtZV90aHJlYWQodGlkKTsKKyAgICAgICAgaWYgKHN1Y2Nlc3MgPCAwKSB7CisgICAgICAgICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCByZXN1bWVfdGhyZWFkIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIChzdWNjZXNzIDwgMCA/IC0xIDogdGlkKTsKKyAgICByZXR1cm4gKHN1Y2Nlc3MgPCAwID8gLTEgOiB0aWQpOwogfQogCiAKIGxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCXJldHVybiBnZXRfdGhyZWFkX2lkKE5VTEwpOworICAgIHJldHVybiBnZXRfdGhyZWFkX2lkKE5VTEwpOwogfQogCiAKIHZvaWQgUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOwogCi0JLyogVGhyZWFkLXNhZmUgd2F5IHRvIHJlYWQgYSB2YXJpYWJsZSB3aXRob3V0IGEgbXV0ZXg6ICovCi0JaWYgKGF0b21pY19hZGQoJnRocmVhZF9jb3VudCwgMCkgPT0gMCkgewotCQkvKiBObyB0aHJlYWRzIGFyb3VuZCwgc28gZXhpdCBtYWluKCkuICovCi0JCWV4aXQoMCk7Ci0JfSBlbHNlIHsKLQkJLyogV2UncmUgYSB0aHJlYWQgKi8KLQkJZXhpdF90aHJlYWQoMCk7Ci0JfQorICAgIC8qIFRocmVhZC1zYWZlIHdheSB0byByZWFkIGEgdmFyaWFibGUgd2l0aG91dCBhIG11dGV4OiAqLworICAgIGlmIChhdG9taWNfYWRkKCZ0aHJlYWRfY291bnQsIDApID09IDApIHsKKyAgICAgICAgLyogTm8gdGhyZWFkcyBhcm91bmQsIHNvIGV4aXQgbWFpbigpLiAqLworICAgICAgICBleGl0KDApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFdlJ3JlIGEgdGhyZWFkICovCisgICAgICAgIGV4aXRfdGhyZWFkKDApOworICAgIH0KIH0KIAogCkBAIC0xNTMsMTA3ICsxNTMsMTA3IEBACiBQeVRocmVhZF90eXBlX2xvY2sgUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewogI2lmZGVmIEZBU1RMT0NLCi0JZmFzdG11dGV4X3QgKmxvY2s7CisgICAgZmFzdG11dGV4X3QgKmxvY2s7CiAjZWxzZQotCXNlbV9pZCBzZW1hOworICAgIHNlbV9pZCBzZW1hOwogI2VuZGlmCi0JY2hhciBuYW1lW09TX05BTUVfTEVOR1RIXTsKLQlhdG9taWNfdCB0aGlzX2xvY2s7CisgICAgY2hhciBuYW1lW09TX05BTUVfTEVOR1RIXTsKKyAgICBhdG9taWNfdCB0aGlzX2xvY2s7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKIAogI2lmZGVmIEZBU1RMT0NLCi0JbG9jayA9IChmYXN0bXV0ZXhfdCAqKSBtYWxsb2Moc2l6ZW9mKGZhc3RtdXRleF90KSk7Ci0JaWYgKGxvY2sgPT0gTlVMTCkgewotCQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBmYWlsZWQ6IG91dCBvZiBtZW1vcnlcbiIpKTsKLQkJcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIE5VTEw7Ci0JfQorICAgIGxvY2sgPSAoZmFzdG11dGV4X3QgKikgbWFsbG9jKHNpemVvZihmYXN0bXV0ZXhfdCkpOworICAgIGlmIChsb2NrID09IE5VTEwpIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgZmFpbGVkOiBvdXQgb2YgbWVtb3J5XG4iKSk7CisgICAgICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBOVUxMOworICAgIH0KICNlbmRpZgotCXRoaXNfbG9jayA9IGF0b21pY19hZGQoJmxvY2tfY291bnQsIDEpOwotCVB5T1Nfc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAicHl0aG9uIGxvY2sgKCVkKSIsIHRoaXNfbG9jayk7CisgICAgdGhpc19sb2NrID0gYXRvbWljX2FkZCgmbG9ja19jb3VudCwgMSk7CisgICAgUHlPU19zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJweXRob24gbG9jayAoJWQpIiwgdGhpc19sb2NrKTsKIAogI2lmZGVmIEZBU1RMT0NLCi0JaWYgKGZhc3RtdXRleF9jcmVhdGUobmFtZSwgbG9jaykgPCAwKSB7Ci0JCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGZhaWxlZDogJXNcbiIsCi0JCQkgc3RyZXJyb3IoZXJybm8pKSk7Ci0JCWZyZWUobG9jayk7Ci0JCWxvY2sgPSBOVUxMOwotCX0KLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpLT4gJXBcbiIsIGxvY2spKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKKyAgICBpZiAoZmFzdG11dGV4X2NyZWF0ZShuYW1lLCBsb2NrKSA8IDApIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CisgICAgICAgIGZyZWUobG9jayk7CisgICAgICAgIGxvY2sgPSBOVUxMOworICAgIH0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpLT4gJXBcbiIsIGxvY2spKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKICNlbHNlCi0Jc2VtYSA9IGNyZWF0ZV9zZW1hcGhvcmUobmFtZSwgMSwgMCk7Ci0JaWYgKHNlbWEgPCAwKSB7Ci0JCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGZhaWxlZDogJXNcbiIsCi0JCQkgc3RyZXJyb3IoZXJybm8pKSk7Ci0JCXNlbWEgPSAwOwotCX0KLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpLT4gJXBcbiIsIHNlbWEpKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgc2VtYTsKKyAgICBzZW1hID0gY3JlYXRlX3NlbWFwaG9yZShuYW1lLCAxLCAwKTsKKyAgICBpZiAoc2VtYSA8IDApIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CisgICAgICAgIHNlbWEgPSAwOworICAgIH0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpLT4gJXBcbiIsIHNlbWEpKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgc2VtYTsKICNlbmRpZgogfQogCiAKIHZvaWQgUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCWRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwogCiAjaWZkZWYgRkFTVExPQ0sKLQlpZiAoZmFzdG11dGV4X2Rlc3Ryb3koKGZhc3RtdXRleF90ICopIGxvY2spIDwgMCkgewotCQlkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBmYWlsZWQ6ICVzXG4iLCBsb2NrLAotCQkJIHN0cmVycm9yKGVycm5vKSkpOwotCX0KLQlmcmVlKGxvY2spOworICAgIGlmIChmYXN0bXV0ZXhfZGVzdHJveSgoZmFzdG11dGV4X3QgKikgbG9jaykgPCAwKSB7CisgICAgICAgIGRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGZhaWxlZDogJXNcbiIsIGxvY2ssCisgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOworICAgIH0KKyAgICBmcmVlKGxvY2spOwogI2Vsc2UKLQlpZiAoZGVsZXRlX3NlbWFwaG9yZSgoc2VtX2lkKSBsb2NrKSA8IDApIHsKLQkJZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgZmFpbGVkOiAlc1xuIiwgbG9jaywKLQkJCSBzdHJlcnJvcihlcnJubykpKTsKLQl9CisgICAgaWYgKGRlbGV0ZV9zZW1hcGhvcmUoKHNlbV9pZCkgbG9jaykgPCAwKSB7CisgICAgICAgIGRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGZhaWxlZDogJXNcbiIsIGxvY2ssCisgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOworICAgIH0KICNlbmRpZgogfQogCiAKIGludCBQeVRocmVhZF9hY3F1aXJlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2ssIGludCB3YWl0ZmxhZykKIHsKLQlpbnQgcmV0dmFsOworICAgIGludCByZXR2YWw7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLAotCQkgd2FpdGZsYWcpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLAorICAgICAgICAgICAgIHdhaXRmbGFnKSk7CiAKICNpZmRlZiBGQVNUTE9DSwotCWlmICh3YWl0ZmxhZykKLQkJcmV0dmFsID0gZmFzdG11dGV4X2xvY2soKGZhc3RtdXRleF90ICopIGxvY2spOwotCWVsc2UKLQkJcmV0dmFsID0gZmFzdG11dGV4X3RpbWVkbG9jaygoZmFzdG11dGV4X3QgKikgbG9jaywgMCk7CisgICAgaWYgKHdhaXRmbGFnKQorICAgICAgICByZXR2YWwgPSBmYXN0bXV0ZXhfbG9jaygoZmFzdG11dGV4X3QgKikgbG9jayk7CisgICAgZWxzZQorICAgICAgICByZXR2YWwgPSBmYXN0bXV0ZXhfdGltZWRsb2NrKChmYXN0bXV0ZXhfdCAqKSBsb2NrLCAwKTsKICNlbHNlCi0JaWYgKHdhaXRmbGFnKQotCQlyZXR2YWwgPSBsb2NrX3NlbWFwaG9yZSgoc2VtX2lkKSBsb2NrKTsKLQllbHNlCi0JCXJldHZhbCA9IGxvY2tfc2VtYXBob3JlX3goKHNlbV9pZCkgbG9jaywgMSwgMCwgMCk7CisgICAgaWYgKHdhaXRmbGFnKQorICAgICAgICByZXR2YWwgPSBsb2NrX3NlbWFwaG9yZSgoc2VtX2lkKSBsb2NrKTsKKyAgICBlbHNlCisgICAgICAgIHJldHZhbCA9IGxvY2tfc2VtYXBob3JlX3goKHNlbV9pZCkgbG9jaywgMSwgMCwgMCk7CiAjZW5kaWYKLQlpZiAocmV0dmFsIDwgMCkgewotCQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgZmFpbGVkOiAlc1xuIiwKLQkJCSBsb2NrLCB3YWl0ZmxhZywgc3RyZXJyb3IoZXJybm8pKSk7Ci0JfQotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKS0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywKLQkJIHJldHZhbCkpOwotCXJldHVybiByZXR2YWwgPCAwID8gMCA6IDE7CisgICAgaWYgKHJldHZhbCA8IDApIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgIGxvY2ssIHdhaXRmbGFnLCBzdHJlcnJvcihlcnJubykpKTsKKyAgICB9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLAorICAgICAgICAgICAgIHJldHZhbCkpOworICAgIHJldHVybiByZXR2YWwgPCAwID8gMCA6IDE7CiB9CiAKIAogdm9pZCBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKICNpZmRlZiBGQVNUTE9DSwotCWlmIChmYXN0bXV0ZXhfdW5sb2NrKChmYXN0bXV0ZXhfdCAqKSBsb2NrKSA8IDApIHsKLQkJZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZmFpbGVkOiAlc1xuIiwgbG9jaywKLQkJCSBzdHJlcnJvcihlcnJubykpKTsKLQl9CisgICAgaWYgKGZhc3RtdXRleF91bmxvY2soKGZhc3RtdXRleF90ICopIGxvY2spIDwgMCkgeworICAgICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBmYWlsZWQ6ICVzXG4iLCBsb2NrLAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKKyAgICB9CiAjZWxzZQotCWlmICh1bmxvY2tfc2VtYXBob3JlKChzZW1faWQpIGxvY2spIDwgMCkgewotCQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBmYWlsZWQ6ICVzXG4iLCBsb2NrLAotCQkJIHN0cmVycm9yKGVycm5vKSkpOwotCX0KKyAgICBpZiAodW5sb2NrX3NlbWFwaG9yZSgoc2VtX2lkKSBsb2NrKSA8IDApIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZmFpbGVkOiAlc1xuIiwgbG9jaywKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CisgICAgfQogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX2Jlb3MuaCBiL1B5dGhvbi90aHJlYWRfYmVvcy5oCmluZGV4IGQxMmQ1NjIuLjY1ZGM0NzAgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfYmVvcy5oCisrKyBiL1B5dGhvbi90aHJlYWRfYmVvcy5oCkBAIC03LDggKzcsOCBAQAogICogaW4gdGhlIEJlIERldmVsb3BlcidzIE5ld3NsZXR0ZXIsIElzc3VlICMyNiAoaHR0cDovL3d3dy5iZS5jb20vKS4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgYmVuYXBob3JlIHsKLQlzZW1faWQgX3NlbTsKLQlpbnQzMiAgX2F0b207CisgICAgc2VtX2lkIF9zZW07CisgICAgaW50MzIgIF9hdG9tOwogfSBiZW5hcGhvcmVfdDsKIAogc3RhdGljIHN0YXR1c190IGJlbmFwaG9yZV9jcmVhdGUoIGNvbnN0IGNoYXIgKm5hbWUsIGJlbmFwaG9yZV90ICpiZW4gKTsKQEAgLTE5LDc5ICsxOSw3OSBAQAogCiBzdGF0aWMgc3RhdHVzX3QgYmVuYXBob3JlX2NyZWF0ZSggY29uc3QgY2hhciAqbmFtZSwgYmVuYXBob3JlX3QgKmJlbiApCiB7Ci0JaWYoIGJlbiAhPSBOVUxMICkgewotCQliZW4tPl9hdG9tID0gMDsKLQkJYmVuLT5fc2VtID0gY3JlYXRlX3NlbSggMCwgbmFtZSApOwotCQkKLQkJaWYoIGJlbi0+X3NlbSA8IEJfTk9fRVJST1IgKSB7Ci0JCQlyZXR1cm4gQl9CQURfU0VNX0lEOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIEVGQVVMVDsKLQl9Ci0JCi0JcmV0dXJuIEVPSzsKKyAgICBpZiggYmVuICE9IE5VTEwgKSB7CisgICAgICAgIGJlbi0+X2F0b20gPSAwOworICAgICAgICBiZW4tPl9zZW0gPSBjcmVhdGVfc2VtKCAwLCBuYW1lICk7CisKKyAgICAgICAgaWYoIGJlbi0+X3NlbSA8IEJfTk9fRVJST1IgKSB7CisgICAgICAgICAgICByZXR1cm4gQl9CQURfU0VNX0lEOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEVGQVVMVDsKKyAgICB9CisKKyAgICByZXR1cm4gRU9LOwogfQogCiBzdGF0aWMgc3RhdHVzX3QgYmVuYXBob3JlX2Rlc3Ryb3koIGJlbmFwaG9yZV90ICpiZW4gKQogewotCWlmKCBiZW4tPl9zZW0gPj0gQl9OT19FUlJPUiApIHsKLQkJc3RhdHVzX3QgcmV0dmFsID0gYmVuYXBob3JlX3RpbWVkbG9jayggYmVuLCAwICk7Ci0JCQotCQlpZiggcmV0dmFsID09IEVPSyB8fCByZXR2YWwgPT0gRVdPVUxEQkxPQ0sgKSB7Ci0JCQlzdGF0dXNfdCBkZWxfcmV0dmFsID0gZGVsZXRlX3NlbSggYmVuLT5fc2VtICk7Ci0JCQkKLQkJCXJldHVybiBkZWxfcmV0dmFsOwotCQl9Ci0JfQorICAgIGlmKCBiZW4tPl9zZW0gPj0gQl9OT19FUlJPUiApIHsKKyAgICAgICAgc3RhdHVzX3QgcmV0dmFsID0gYmVuYXBob3JlX3RpbWVkbG9jayggYmVuLCAwICk7CiAKLQlyZXR1cm4gQl9CQURfU0VNX0lEOworICAgICAgICBpZiggcmV0dmFsID09IEVPSyB8fCByZXR2YWwgPT0gRVdPVUxEQkxPQ0sgKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBkZWxfcmV0dmFsID0gZGVsZXRlX3NlbSggYmVuLT5fc2VtICk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWxfcmV0dmFsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJfQkFEX1NFTV9JRDsKIH0KIAogc3RhdGljIHN0YXR1c190IGJlbmFwaG9yZV9sb2NrKCBiZW5hcGhvcmVfdCAqYmVuICkKIHsKLQlpbnQzMiBwcmV2ID0gYXRvbWljX2FkZCggJihiZW4tPl9hdG9tKSwgMSApOwotCQotCWlmKCBwcmV2ID4gMCApIHsKLQkJcmV0dXJuIGFjcXVpcmVfc2VtKCBiZW4tPl9zZW0gKTsKLQl9Ci0JCi0JcmV0dXJuIEVPSzsKKyAgICBpbnQzMiBwcmV2ID0gYXRvbWljX2FkZCggJihiZW4tPl9hdG9tKSwgMSApOworCisgICAgaWYoIHByZXYgPiAwICkgeworICAgICAgICByZXR1cm4gYWNxdWlyZV9zZW0oIGJlbi0+X3NlbSApOworICAgIH0KKworICAgIHJldHVybiBFT0s7CiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBiZW5hcGhvcmVfdGltZWRsb2NrKCBiZW5hcGhvcmVfdCAqYmVuLCBiaWd0aW1lX3QgbWljcm9zICkKIHsKLQlpbnQzMiBwcmV2ID0gYXRvbWljX2FkZCggJihiZW4tPl9hdG9tKSwgMSApOwotCQotCWlmKCBwcmV2ID4gMCApIHsKLQkJc3RhdHVzX3QgcmV0dmFsID0gYWNxdWlyZV9zZW1fZXRjKCBiZW4tPl9zZW0sIDEsIEJfVElNRU9VVCwgbWljcm9zICk7Ci0JCQotCQlzd2l0Y2goIHJldHZhbCApIHsKLQkJY2FzZSBCX1dPVUxEX0JMT0NLOgkvKiBGYWxsIHRocm91Z2guLi4gKi8KLQkJY2FzZSBCX1RJTUVEX09VVDoKLQkJCXJldHVybiBFV09VTERCTE9DSzsKLQkJCWJyZWFrOwotCQljYXNlIEJfT0s6Ci0JCQlyZXR1cm4gRU9LOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIEVPSzsKKyAgICBpbnQzMiBwcmV2ID0gYXRvbWljX2FkZCggJihiZW4tPl9hdG9tKSwgMSApOworCisgICAgaWYoIHByZXYgPiAwICkgeworICAgICAgICBzdGF0dXNfdCByZXR2YWwgPSBhY3F1aXJlX3NlbV9ldGMoIGJlbi0+X3NlbSwgMSwgQl9USU1FT1VULCBtaWNyb3MgKTsKKworICAgICAgICBzd2l0Y2goIHJldHZhbCApIHsKKyAgICAgICAgY2FzZSBCX1dPVUxEX0JMT0NLOiAgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICAgICAgY2FzZSBCX1RJTUVEX09VVDoKKyAgICAgICAgICAgIHJldHVybiBFV09VTERCTE9DSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJfT0s6CisgICAgICAgICAgICByZXR1cm4gRU9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRU9LOwogfQogCiBzdGF0aWMgc3RhdHVzX3QgYmVuYXBob3JlX3VubG9jayggYmVuYXBob3JlX3QgKmJlbiApCiB7Ci0JaW50MzIgcHJldiA9IGF0b21pY19hZGQoICYoYmVuLT5fYXRvbSksIC0xICk7Ci0JCi0JaWYoIHByZXYgPiAxICkgewotCQlyZXR1cm4gcmVsZWFzZV9zZW0oIGJlbi0+X3NlbSApOwotCX0KLQkKLQlyZXR1cm4gRU9LOworICAgIGludDMyIHByZXYgPSBhdG9taWNfYWRkKCAmKGJlbi0+X2F0b20pLCAtMSApOworCisgICAgaWYoIHByZXYgPiAxICkgeworICAgICAgICByZXR1cm4gcmVsZWFzZV9zZW0oIGJlbi0+X3NlbSApOworICAgIH0KKworICAgIHJldHVybiBFT0s7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk5LDggKzk5LDggQEAKICAqLwogc3RhdGljIHZvaWQgUHlUaHJlYWRfX2luaXRfdGhyZWFkKCB2b2lkICkKIHsKLQkvKiBEbyBub3RoaW5nLiAqLwotCXJldHVybjsKKyAgICAvKiBEbyBub3RoaW5nLiAqLworICAgIHJldHVybjsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTE0LDUyICsxMTQsNTIgQEAKIAogbG9uZyBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKCB2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnICkKIHsKLQlzdGF0dXNfdCBzdWNjZXNzID0gMDsKLQl0aHJlYWRfaWQgdGlkOwotCWNoYXIgbmFtZVtCX09TX05BTUVfTEVOR1RIXTsKLQlpbnQzMiB0aGlzX3RocmVhZDsKKyAgICBzdGF0dXNfdCBzdWNjZXNzID0gMDsKKyAgICB0aHJlYWRfaWQgdGlkOworICAgIGNoYXIgbmFtZVtCX09TX05BTUVfTEVOR1RIXTsKKyAgICBpbnQzMiB0aGlzX3RocmVhZDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOwogCi0JLyogV2UgYXJlIHNvIHZlcnkgdGhyZWFkLXNhZmUuLi4gKi8KLQl0aGlzX3RocmVhZCA9IGF0b21pY19hZGQoICZ0aHJlYWRfY291bnQsIDEgKTsKLQlQeU9TX3NucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwKLQkJICAgICAgInB5dGhvbiB0aHJlYWQgKCVkKSIsIHRoaXNfdGhyZWFkICk7CisgICAgLyogV2UgYXJlIHNvIHZlcnkgdGhyZWFkLXNhZmUuLi4gKi8KKyAgICB0aGlzX3RocmVhZCA9IGF0b21pY19hZGQoICZ0aHJlYWRfY291bnQsIDEgKTsKKyAgICBQeU9TX3NucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwKKyAgICAgICAgICAgICAgICAgICJweXRob24gdGhyZWFkICglZCkiLCB0aGlzX3RocmVhZCApOwogCi0JdGlkID0gc3Bhd25fdGhyZWFkKCAodGhyZWFkX2Z1bmMpZnVuYywgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgIEJfTk9STUFMX1BSSU9SSVRZLCBhcmcgKTsKLQlpZiggdGlkID4gQl9OT19FUlJPUiApIHsKLQkJc3VjY2VzcyA9IHJlc3VtZV90aHJlYWQoIHRpZCApOwotCX0KKyAgICB0aWQgPSBzcGF3bl90aHJlYWQoICh0aHJlYWRfZnVuYylmdW5jLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQl9OT1JNQUxfUFJJT1JJVFksIGFyZyApOworICAgIGlmKCB0aWQgPiBCX05PX0VSUk9SICkgeworICAgICAgICBzdWNjZXNzID0gcmVzdW1lX3RocmVhZCggdGlkICk7CisgICAgfQogCi0JcmV0dXJuICggc3VjY2VzcyA9PSBCX05PX0VSUk9SID8gdGlkIDogLTEgKTsKKyAgICByZXR1cm4gKCBzdWNjZXNzID09IEJfTk9fRVJST1IgPyB0aWQgOiAtMSApOwogfQogCiBsb25nIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoIHZvaWQgKQogewotCS8qIFByZXN1bWVkIHRvIHJldHVybiB0aGUgY3VycmVudCB0aHJlYWQncyBJRC4uLiAqLwotCXRocmVhZF9pZCB0aWQ7Ci0JdGlkID0gZmluZF90aHJlYWQoIE5VTEwgKTsKLQkKLQlyZXR1cm4gKCB0aWQgIT0gQl9OQU1FX05PVF9GT1VORCA/IHRpZCA6IC0xICk7CisgICAgLyogUHJlc3VtZWQgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIElELi4uICovCisgICAgdGhyZWFkX2lkIHRpZDsKKyAgICB0aWQgPSBmaW5kX3RocmVhZCggTlVMTCApOworCisgICAgcmV0dXJuICggdGlkICE9IEJfTkFNRV9OT1RfRk9VTkQgPyB0aWQgOiAtMSApOwogfQogCiB2b2lkIFB5VGhyZWFkX2V4aXRfdGhyZWFkKCB2b2lkICkKIHsKLQlpbnQzMiB0aHJlYWRzOworICAgIGludDMyIHRocmVhZHM7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOwogCi0JLyogVGhyZWFkLXNhZmUgd2F5IHRvIHJlYWQgYSB2YXJpYWJsZSB3aXRob3V0IGEgbXV0ZXg6ICovCi0JdGhyZWFkcyA9IGF0b21pY19hZGQoICZ0aHJlYWRfY291bnQsIDAgKTsKKyAgICAvKiBUaHJlYWQtc2FmZSB3YXkgdG8gcmVhZCBhIHZhcmlhYmxlIHdpdGhvdXQgYSBtdXRleDogKi8KKyAgICB0aHJlYWRzID0gYXRvbWljX2FkZCggJnRocmVhZF9jb3VudCwgMCApOwogCi0JaWYoIHRocmVhZHMgPT0gMCApIHsKLQkJLyogTm8gdGhyZWFkcyBhcm91bmQsIHNvIGV4aXQgbWFpbigpLiAqLwotCQlleGl0KDApOwotCX0gZWxzZSB7Ci0JCS8qIE9oLCB3ZSdyZSBhIHRocmVhZCwgbGV0J3MgdHJ5IHRvIGV4aXQgZ3JhY2VmdWxseS4uLiAqLwotCQlleGl0X3RocmVhZCggQl9OT19FUlJPUiApOwotCX0KKyAgICBpZiggdGhyZWFkcyA9PSAwICkgeworICAgICAgICAvKiBObyB0aHJlYWRzIGFyb3VuZCwgc28gZXhpdCBtYWluKCkuICovCisgICAgICAgIGV4aXQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogT2gsIHdlJ3JlIGEgdGhyZWFkLCBsZXQncyB0cnkgdG8gZXhpdCBncmFjZWZ1bGx5Li4uICovCisgICAgICAgIGV4aXRfdGhyZWFkKCBCX05PX0VSUk9SICk7CisgICAgfQogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNzAsNzkgKzE3MCw3OSBAQAogCiBQeVRocmVhZF90eXBlX2xvY2sgUHlUaHJlYWRfYWxsb2NhdGVfbG9jayggdm9pZCApCiB7Ci0JYmVuYXBob3JlX3QgKmxvY2s7Ci0Jc3RhdHVzX3QgcmV0dmFsOwotCWNoYXIgbmFtZVtCX09TX05BTUVfTEVOR1RIXTsKLQlpbnQzMiB0aGlzX2xvY2s7Ci0JCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgYmVuYXBob3JlX3QgKmxvY2s7CisgICAgc3RhdHVzX3QgcmV0dmFsOworICAgIGNoYXIgbmFtZVtCX09TX05BTUVfTEVOR1RIXTsKKyAgICBpbnQzMiB0aGlzX2xvY2s7CiAKLQlsb2NrID0gKGJlbmFwaG9yZV90ICopbWFsbG9jKCBzaXplb2YoIGJlbmFwaG9yZV90ICkgKTsKLQlpZiggbG9jayA9PSBOVUxMICkgewotCQkvKiBUT0RPOiB0aGF0J3MgYmFkLCByYWlzZSBNZW1vcnlFcnJvciAqLwotCQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaylOVUxMOwotCX0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKIAotCXRoaXNfbG9jayA9IGF0b21pY19hZGQoICZsb2NrX2NvdW50LCAxICk7Ci0JUHlPU19zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJweXRob24gbG9jayAoJWQpIiwgdGhpc19sb2NrKTsKKyAgICBsb2NrID0gKGJlbmFwaG9yZV90ICopbWFsbG9jKCBzaXplb2YoIGJlbmFwaG9yZV90ICkgKTsKKyAgICBpZiggbG9jayA9PSBOVUxMICkgeworICAgICAgICAvKiBUT0RPOiB0aGF0J3MgYmFkLCByYWlzZSBNZW1vcnlFcnJvciAqLworICAgICAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaylOVUxMOworICAgIH0KIAotCXJldHZhbCA9IGJlbmFwaG9yZV9jcmVhdGUoIG5hbWUsIGxvY2sgKTsKLQlpZiggcmV0dmFsICE9IEVPSyApIHsKLQkJLyogVE9ETzogdGhhdCdzIGJhZCwgcmFpc2UgYW4gZXhjZXB0aW9uICovCi0JCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKU5VTEw7Ci0JfQorICAgIHRoaXNfbG9jayA9IGF0b21pY19hZGQoICZsb2NrX2NvdW50LCAxICk7CisgICAgUHlPU19zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJweXRob24gbG9jayAoJWQpIiwgdGhpc19sb2NrKTsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKKyAgICByZXR2YWwgPSBiZW5hcGhvcmVfY3JlYXRlKCBuYW1lLCBsb2NrICk7CisgICAgaWYoIHJldHZhbCAhPSBFT0sgKSB7CisgICAgICAgIC8qIFRPRE86IHRoYXQncyBiYWQsIHJhaXNlIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaylOVUxMOworICAgIH0KKworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKIH0KIAogdm9pZCBQeVRocmVhZF9mcmVlX2xvY2soIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrICkKIHsKLQlzdGF0dXNfdCByZXR2YWw7CisgICAgc3RhdHVzX3QgcmV0dmFsOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JCi0JcmV0dmFsID0gYmVuYXBob3JlX2Rlc3Ryb3koIChiZW5hcGhvcmVfdCAqKWxvY2sgKTsKLQlpZiggcmV0dmFsICE9IEVPSyApIHsKLQkJLyogVE9ETzogdGhhdCdzIGJhZCwgcmFpc2UgYW4gZXhjZXB0aW9uICovCi0JCXJldHVybjsKLQl9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisKKyAgICByZXR2YWwgPSBiZW5hcGhvcmVfZGVzdHJveSggKGJlbmFwaG9yZV90ICopbG9jayApOworICAgIGlmKCByZXR2YWwgIT0gRU9LICkgeworICAgICAgICAvKiBUT0RPOiB0aGF0J3MgYmFkLCByYWlzZSBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KIH0KIAogaW50IFB5VGhyZWFkX2FjcXVpcmVfbG9jayggUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2ssIGludCB3YWl0ZmxhZyApCiB7Ci0JaW50IHN1Y2Nlc3M7Ci0Jc3RhdHVzX3QgcmV0dmFsOworICAgIGludCBzdWNjZXNzOworICAgIHN0YXR1c190IHJldHZhbDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKIAotCWlmKCB3YWl0ZmxhZyApIHsKLQkJcmV0dmFsID0gYmVuYXBob3JlX2xvY2soIChiZW5hcGhvcmVfdCAqKWxvY2sgKTsKLQl9IGVsc2UgewotCQlyZXR2YWwgPSBiZW5hcGhvcmVfdGltZWRsb2NrKCAoYmVuYXBob3JlX3QgKilsb2NrLCAwICk7Ci0JfQotCQotCWlmKCByZXR2YWwgPT0gRU9LICkgewotCQlzdWNjZXNzID0gMTsKLQl9IGVsc2UgewotCQlzdWNjZXNzID0gMDsKLQkJCi0JCS8qIFRPRE86IHRoYXQncyBiYWQsIHJhaXNlIGFuIGV4Y2VwdGlvbiAqLwotCX0KKyAgICBpZiggd2FpdGZsYWcgKSB7CisgICAgICAgIHJldHZhbCA9IGJlbmFwaG9yZV9sb2NrKCAoYmVuYXBob3JlX3QgKilsb2NrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dmFsID0gYmVuYXBob3JlX3RpbWVkbG9jayggKGJlbmFwaG9yZV90ICopbG9jaywgMCApOworICAgIH0KIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBpZiggcmV0dmFsID09IEVPSyApIHsKKyAgICAgICAgc3VjY2VzcyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VjY2VzcyA9IDA7CisKKyAgICAgICAgLyogVE9ETzogdGhhdCdzIGJhZCwgcmFpc2UgYW4gZXhjZXB0aW9uICovCisgICAgfQorCisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiB2b2lkIFB5VGhyZWFkX3JlbGVhc2VfbG9jayggUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2sgKQogewotCXN0YXR1c190IHJldHZhbDsKLQkKLQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKLQkKLQlyZXR2YWwgPSBiZW5hcGhvcmVfdW5sb2NrKCAoYmVuYXBob3JlX3QgKilsb2NrICk7Ci0JaWYoIHJldHZhbCAhPSBFT0sgKSB7Ci0JCS8qIFRPRE86IHRoYXQncyBiYWQsIHJhaXNlIGFuIGV4Y2VwdGlvbiAqLwotCQlyZXR1cm47Ci0JfQorICAgIHN0YXR1c190IHJldHZhbDsKKworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworCisgICAgcmV0dmFsID0gYmVuYXBob3JlX3VubG9jayggKGJlbmFwaG9yZV90ICopbG9jayApOworICAgIGlmKCByZXR2YWwgIT0gRU9LICkgeworICAgICAgICAvKiBUT0RPOiB0aGF0J3MgYmFkLCByYWlzZSBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfY3RocmVhZC5oIGIvUHl0aG9uL3RocmVhZF9jdGhyZWFkLmgKaW5kZXggNzE2MzQxMi4uMWIzZTM5MCAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9jdGhyZWFkLmgKKysrIGIvUHl0aG9uL3RocmVhZF9jdGhyZWFkLmgKQEAgLTE0LDEyICsxNCwxMiBAQAogUHlUaHJlYWRfX2luaXRfdGhyZWFkKHZvaWQpCiB7CiAjaWZuZGVmIEhVUkRfQ19USFJFQURTCi0JLyogUm9sYW5kIE1jR3JhdGggc2FpZCB0aGlzIHNob3VsZCBub3QgYmUgdXNlZCBzaW5jZSB0aGlzIGlzCi0JZG9uZSB3aGlsZSBsaW5raW5nIHRvIHRocmVhZHMgKi8KLQljdGhyZWFkX2luaXQoKTsgCisgICAgLyogUm9sYW5kIE1jR3JhdGggc2FpZCB0aGlzIHNob3VsZCBub3QgYmUgdXNlZCBzaW5jZSB0aGlzIGlzCisgICAgZG9uZSB3aGlsZSBsaW5raW5nIHRvIHRocmVhZHMgKi8KKyAgICBjdGhyZWFkX2luaXQoKTsKICNlbHNlCiAvKiBkbyBub3RoaW5nICovCi0JOworICAgIDsKICNlbmRpZgogfQogCkBAIC0yOSwzNCArMjksMzQgQEAKIGxvbmcKIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlpbnQgc3VjY2VzcyA9IDA7CS8qIGluaXQgbm90IG5lZWRlZCB3aGVuIFNPTEFSSVNfVEhSRUFEUyBhbmQgKi8KLQkJCQkvKiBDX1RIUkVBRFMgaW1wbGVtZW50ZWQgcHJvcGVybHkgKi8KKyAgICBpbnQgc3VjY2VzcyA9IDA7ICAgICAgICAgICAgLyogaW5pdCBub3QgbmVlZGVkIHdoZW4gU09MQVJJU19USFJFQURTIGFuZCAqLworICAgICAgICAgICAgICAgIC8qIENfVEhSRUFEUyBpbXBsZW1lbnRlZCBwcm9wZXJseSAqLwogCi0JZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLQkvKiBsb29rcyBsaWtlIHNvbGFyaXMgZGV0YWNoZXMgdGhlIHRocmVhZCB0byBuZXZlciByZWpvaW4KLQkgKiBzbyB3ZWxsIGRvIGl0IGhlcmUKLQkgKi8KLQljdGhyZWFkX2RldGFjaChjdGhyZWFkX2ZvcmsoKGN0aHJlYWRfZm5fdCkgZnVuYywgYXJnKSk7Ci0JcmV0dXJuIHN1Y2Nlc3MgPCAwID8gLTEgOiAwOworICAgIGRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgLyogbG9va3MgbGlrZSBzb2xhcmlzIGRldGFjaGVzIHRoZSB0aHJlYWQgdG8gbmV2ZXIgcmVqb2luCisgICAgICogc28gd2VsbCBkbyBpdCBoZXJlCisgICAgICovCisgICAgY3RocmVhZF9kZXRhY2goY3RocmVhZF9mb3JrKChjdGhyZWFkX2ZuX3QpIGZ1bmMsIGFyZykpOworICAgIHJldHVybiBzdWNjZXNzIDwgMCA/IC0xIDogMDsKIH0KIAogbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7Ci0JcmV0dXJuIChsb25nKSBjdGhyZWFkX3NlbGYoKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIHJldHVybiAobG9uZykgY3RocmVhZF9zZWxmKCk7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWV4aXQoMCk7Ci0JY3RocmVhZF9leGl0KDApOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBleGl0KDApOworICAgIGN0aHJlYWRfZXhpdCgwKTsKIH0KIAogLyoKQEAgLTY1LDQ4ICs2NSw0OCBAQAogUHlUaHJlYWRfdHlwZV9sb2NrCiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7Ci0JbXV0ZXhfdCBsb2NrOworICAgIG11dGV4X3QgbG9jazsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWxvY2sgPSBtdXRleF9hbGxvYygpOwotCWlmIChtdXRleF9pbml0KGxvY2spKSB7Ci0JCXBlcnJvcigibXV0ZXhfaW5pdCIpOwotCQlmcmVlKCh2b2lkICopIGxvY2spOwotCQlsb2NrID0gMDsKLQl9Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOworICAgIGxvY2sgPSBtdXRleF9hbGxvYygpOworICAgIGlmIChtdXRleF9pbml0KGxvY2spKSB7CisgICAgICAgIHBlcnJvcigibXV0ZXhfaW5pdCIpOworICAgICAgICBmcmVlKCh2b2lkICopIGxvY2spOworICAgICAgICBsb2NrID0gMDsKKyAgICB9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOwogfQogCiB2b2lkCiBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JbXV0ZXhfZnJlZShsb2NrKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBtdXRleF9mcmVlKGxvY2spOwogfQogCiBpbnQKIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCBzdWNjZXNzID0gRkFMU0U7CisgICAgaW50IHN1Y2Nlc3MgPSBGQUxTRTsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7Ci0JaWYgKHdhaXRmbGFnKSB7IAkvKiBibG9ja2luZyAqLwotCQltdXRleF9sb2NrKChtdXRleF90KWxvY2spOwotCQlzdWNjZXNzID0gVFJVRTsKLQl9IGVsc2UgewkJLyogbm9uIGJsb2NraW5nICovCi0JCXN1Y2Nlc3MgPSBtdXRleF90cnlfbG9jaygobXV0ZXhfdClsb2NrKTsKLQl9Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwotCXJldHVybiBzdWNjZXNzOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgaWYgKHdhaXRmbGFnKSB7ICAgICAgICAgICAgIC8qIGJsb2NraW5nICovCisgICAgICAgIG11dGV4X2xvY2soKG11dGV4X3QpbG9jayk7CisgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBub24gYmxvY2tpbmcgKi8KKyAgICAgICAgc3VjY2VzcyA9IG11dGV4X3RyeV9sb2NrKChtdXRleF90KWxvY2spOworICAgIH0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKLQltdXRleF91bmxvY2soKG11dGV4X3QgKWxvY2spOworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIG11dGV4X3VubG9jaygobXV0ZXhfdCApbG9jayk7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX2Zvb2Jhci5oIGIvUHl0aG9uL3RocmVhZF9mb29iYXIuaAppbmRleCAxYjk5M2QxLi5kMmI3OGM1IDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX2Zvb2Jhci5oCisrKyBiL1B5dGhvbi90aHJlYWRfZm9vYmFyLmgKQEAgLTEzLDI4ICsxMywyOCBAQAogbG9uZwogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCWludCBzdWNjZXNzID0gMDsJLyogaW5pdCBub3QgbmVlZGVkIHdoZW4gU09MQVJJU19USFJFQURTIGFuZCAqLwotCQkJCS8qIENfVEhSRUFEUyBpbXBsZW1lbnRlZCBwcm9wZXJseSAqLworICAgIGludCBzdWNjZXNzID0gMDsgICAgICAgICAgICAvKiBpbml0IG5vdCBuZWVkZWQgd2hlbiBTT0xBUklTX1RIUkVBRFMgYW5kICovCisgICAgICAgICAgICAgICAgLyogQ19USFJFQURTIGltcGxlbWVudGVkIHByb3Blcmx5ICovCiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCXJldHVybiBzdWNjZXNzIDwgMCA/IC0xIDogMDsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIHJldHVybiBzdWNjZXNzIDwgMCA/IC0xIDogMDsKIH0KIAogbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJZXhpdCgwKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgZXhpdCgwKTsKIH0KIAogLyoKQEAgLTQ0LDMyICs0NCwzMiBAQAogUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKIH0KIAogdm9pZAogUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCWRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwogfQogCiBpbnQKIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCBzdWNjZXNzOworICAgIGludCBzdWNjZXNzOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7Ci0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfbHdwLmggYi9QeXRob24vdGhyZWFkX2x3cC5oCmluZGV4IDkzZDgyOTUuLmJhN2IzN2EgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfbHdwLmgKKysrIGIvUHl0aG9uL3RocmVhZF9sd3AuaApAQCAtMywxMyArMywxMyBAQAogI2luY2x1ZGUgPGx3cC9sd3AuaD4KICNpbmNsdWRlIDxsd3Avc3RhY2tkZXAuaD4KIAotI2RlZmluZSBTVEFDS1NJWkUJMTAwMAkvKiBzdGFja3NpemUgZm9yIGEgdGhyZWFkICovCi0jZGVmaW5lIE5TVEFDS1MJCTIJLyogIyBzdGFja3MgdG8gYmUgcHV0IGluIGNhY2hlIGluaXRpYWxseSAqLworI2RlZmluZSBTVEFDS1NJWkUgICAgICAgMTAwMCAgICAvKiBzdGFja3NpemUgZm9yIGEgdGhyZWFkICovCisjZGVmaW5lIE5TVEFDS1MgICAgICAgICAyICAgICAgIC8qICMgc3RhY2tzIHRvIGJlIHB1dCBpbiBjYWNoZSBpbml0aWFsbHkgKi8KIAogc3RydWN0IGxvY2sgewotCWludCBsb2NrX2xvY2tlZDsKLQljdl90IGxvY2tfY29uZHZhcjsKLQltb25fdCBsb2NrX21vbml0b3I7CisgICAgaW50IGxvY2tfbG9ja2VkOworICAgIGN2X3QgbG9ja19jb25kdmFyOworICAgIG1vbl90IGxvY2tfbW9uaXRvcjsKIH07CiAKIApAQCAtMTgsNyArMTgsNyBAQAogICovCiBzdGF0aWMgdm9pZCBQeVRocmVhZF9faW5pdF90aHJlYWQodm9pZCkKIHsKLQlsd3Bfc2V0c3RrY2FjaGUoU1RBQ0tTSVpFLCBOU1RBQ0tTKTsKKyAgICBsd3Bfc2V0c3RrY2FjaGUoU1RBQ0tTSVpFLCBOU1RBQ0tTKTsKIH0KIAogLyoKQEAgLTI4LDMxICsyOCwzMSBAQAogCiBsb25nIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQl0aHJlYWRfdCB0aWQ7Ci0JaW50IHN1Y2Nlc3M7Ci0JZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLQlzdWNjZXNzID0gbHdwX2NyZWF0ZSgmdGlkLCBmdW5jLCBNSU5QUklPLCAwLCBsd3BfbmV3c3RrKCksIDEsIGFyZyk7Ci0JcmV0dXJuIHN1Y2Nlc3MgPCAwID8gLTEgOiAwOworICAgIHRocmVhZF90IHRpZDsKKyAgICBpbnQgc3VjY2VzczsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIHN1Y2Nlc3MgPSBsd3BfY3JlYXRlKCZ0aWQsIGZ1bmMsIE1JTlBSSU8sIDAsIGx3cF9uZXdzdGsoKSwgMSwgYXJnKTsKKyAgICByZXR1cm4gc3VjY2VzcyA8IDAgPyAtMSA6IDA7CiB9CiAKIGxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCXRocmVhZF90IHRpZDsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCWlmIChsd3Bfc2VsZigmdGlkKSA8IDApCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gdGlkLnRocmVhZF9pZDsKKyAgICB0aHJlYWRfdCB0aWQ7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBpZiAobHdwX3NlbGYoJnRpZCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHRpZC50aHJlYWRfaWQ7CiB9CiAKIHZvaWQgUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJZXhpdCgwKTsKLQlsd3BfZGVzdHJveShTRUxGKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgZXhpdCgwKTsKKyAgICBsd3BfZGVzdHJveShTRUxGKTsKIH0KIAogLyoKQEAgLTYwLDU0ICs2MCw1NCBAQAogICovCiBQeVRocmVhZF90eXBlX2xvY2sgUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewotCXN0cnVjdCBsb2NrICpsb2NrOwotCWV4dGVybiBjaGFyICptYWxsb2Moc2l6ZV90KTsKKyAgICBzdHJ1Y3QgbG9jayAqbG9jazsKKyAgICBleHRlcm4gY2hhciAqbWFsbG9jKHNpemVfdCk7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQlsb2NrID0gKHN0cnVjdCBsb2NrICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGxvY2spKTsKLQlsb2NrLT5sb2NrX2xvY2tlZCA9IDA7Ci0JKHZvaWQpIG1vbl9jcmVhdGUoJmxvY2stPmxvY2tfbW9uaXRvcik7Ci0JKHZvaWQpIGN2X2NyZWF0ZSgmbG9jay0+bG9ja19jb25kdmFyLCBsb2NrLT5sb2NrX21vbml0b3IpOwotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKKyAgICBsb2NrID0gKHN0cnVjdCBsb2NrICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGxvY2spKTsKKyAgICBsb2NrLT5sb2NrX2xvY2tlZCA9IDA7CisgICAgKHZvaWQpIG1vbl9jcmVhdGUoJmxvY2stPmxvY2tfbW9uaXRvcik7CisgICAgKHZvaWQpIGN2X2NyZWF0ZSgmbG9jay0+bG9ja19jb25kdmFyLCBsb2NrLT5sb2NrX21vbml0b3IpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKIH0KIAogdm9pZCBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JbW9uX2Rlc3Ryb3koKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19tb25pdG9yKTsKLQlmcmVlKChjaGFyICopIGxvY2spOworICAgIGRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIG1vbl9kZXN0cm95KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbW9uaXRvcik7CisgICAgZnJlZSgoY2hhciAqKSBsb2NrKTsKIH0KIAogaW50IFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCBzdWNjZXNzOworICAgIGludCBzdWNjZXNzOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKLQlzdWNjZXNzID0gMDsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOworICAgIHN1Y2Nlc3MgPSAwOwogCi0JKHZvaWQpIG1vbl9lbnRlcigoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX21vbml0b3IpOwotCWlmICh3YWl0ZmxhZykKLQkJd2hpbGUgKCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbG9ja2VkKQotCQkJY3Zfd2FpdCgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2NvbmR2YXIpOwotCWlmICghKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19sb2NrZWQpIHsKLQkJc3VjY2VzcyA9IDE7Ci0JCSgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbG9ja2VkID0gMTsKLQl9Ci0JY3ZfYnJvYWRjYXN0KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfY29uZHZhcik7Ci0JbW9uX2V4aXQoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19tb25pdG9yKTsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7Ci0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgKHZvaWQpIG1vbl9lbnRlcigoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX21vbml0b3IpOworICAgIGlmICh3YWl0ZmxhZykKKyAgICAgICAgd2hpbGUgKCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbG9ja2VkKQorICAgICAgICAgICAgY3Zfd2FpdCgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2NvbmR2YXIpOworICAgIGlmICghKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19sb2NrZWQpIHsKKyAgICAgICAgc3VjY2VzcyA9IDE7CisgICAgICAgICgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbG9ja2VkID0gMTsKKyAgICB9CisgICAgY3ZfYnJvYWRjYXN0KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfY29uZHZhcik7CisgICAgbW9uX2V4aXQoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19tb25pdG9yKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIHZvaWQgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCWRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwotCSh2b2lkKSBtb25fZW50ZXIoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19tb25pdG9yKTsKLQkoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2xvY2tlZCA9IDA7Ci0JY3ZfYnJvYWRjYXN0KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfY29uZHZhcik7Ci0JbW9uX2V4aXQoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19tb25pdG9yKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICAodm9pZCkgbW9uX2VudGVyKCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbW9uaXRvcik7CisgICAgKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19sb2NrZWQgPSAwOworICAgIGN2X2Jyb2FkY2FzdCgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2NvbmR2YXIpOworICAgIG1vbl9leGl0KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbW9uaXRvcik7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX250LmggYi9QeXRob24vdGhyZWFkX250LmgKaW5kZXggMGM1ZDE5Mi4uOTc5NmEzNCAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9udC5oCisrKyBiL1B5dGhvbi90aHJlYWRfbnQuaApAQCAtMTAsODEgKzEwLDgxIEBACiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgTlJNVVRFWCB7Ci0JTE9ORyAgIG93bmVkIDsKLQlEV09SRCAgdGhyZWFkX2lkIDsKLQlIQU5ETEUgaGV2ZW50IDsKKyAgICBMT05HICAgb3duZWQgOworICAgIERXT1JEICB0aHJlYWRfaWQgOworICAgIEhBTkRMRSBoZXZlbnQgOwogfSBOUk1VVEVYLCAqUE5STVVURVggOwogCiAKIEJPT0wKIEluaXRpYWxpemVOb25SZWN1cnNpdmVNdXRleChQTlJNVVRFWCBtdXRleCkKIHsKLQltdXRleC0+b3duZWQgPSAtMSA7ICAvKiBObyB0aHJlYWRzIGhhdmUgZW50ZXJlZCBOb25SZWN1cnNpdmVNdXRleCAqLwotCW11dGV4LT50aHJlYWRfaWQgPSAwIDsKLQltdXRleC0+aGV2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKSA7Ci0JcmV0dXJuIG11dGV4LT5oZXZlbnQgIT0gTlVMTCA7CS8qIFRSVUUgaWYgdGhlIG11dGV4IGlzIGNyZWF0ZWQgKi8KKyAgICBtdXRleC0+b3duZWQgPSAtMSA7ICAvKiBObyB0aHJlYWRzIGhhdmUgZW50ZXJlZCBOb25SZWN1cnNpdmVNdXRleCAqLworICAgIG11dGV4LT50aHJlYWRfaWQgPSAwIDsKKyAgICBtdXRleC0+aGV2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKSA7CisgICAgcmV0dXJuIG11dGV4LT5oZXZlbnQgIT0gTlVMTCA7ICAgICAgLyogVFJVRSBpZiB0aGUgbXV0ZXggaXMgY3JlYXRlZCAqLwogfQogCiBWT0lECiBEZWxldGVOb25SZWN1cnNpdmVNdXRleChQTlJNVVRFWCBtdXRleCkKIHsKLQkvKiBObyBpbi11c2UgY2hlY2sgKi8KLQlDbG9zZUhhbmRsZShtdXRleC0+aGV2ZW50KSA7Ci0JbXV0ZXgtPmhldmVudCA9IE5VTEwgOyAvKiBKdXN0IGluIGNhc2UgKi8KKyAgICAvKiBObyBpbi11c2UgY2hlY2sgKi8KKyAgICBDbG9zZUhhbmRsZShtdXRleC0+aGV2ZW50KSA7CisgICAgbXV0ZXgtPmhldmVudCA9IE5VTEwgOyAvKiBKdXN0IGluIGNhc2UgKi8KIH0KIAogRFdPUkQKIEVudGVyTm9uUmVjdXJzaXZlTXV0ZXgoUE5STVVURVggbXV0ZXgsIEJPT0wgd2FpdCkKIHsKLQkvKiBBc3N1bWUgdGhhdCB0aGUgdGhyZWFkIHdhaXRzIHN1Y2Nlc3NmdWxseSAqLwotCURXT1JEIHJldCA7CisgICAgLyogQXNzdW1lIHRoYXQgdGhlIHRocmVhZCB3YWl0cyBzdWNjZXNzZnVsbHkgKi8KKyAgICBEV09SRCByZXQgOwogCi0JLyogSW50ZXJsb2NrZWRJbmNyZW1lbnQoJm11dGV4LT5vd25lZCkgPT0gMCBtZWFucyB0aGF0IG5vIHRocmVhZCBjdXJyZW50bHkgb3ducyB0aGUgbXV0ZXggKi8KLQlpZiAoIXdhaXQpCi0JewotCQlpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoJm11dGV4LT5vd25lZCwgMCwgLTEpICE9IC0xKQotCQkJcmV0dXJuIFdBSVRfVElNRU9VVCA7Ci0JCXJldCA9IFdBSVRfT0JKRUNUXzAgOwotCX0KLQllbHNlCi0JCXJldCA9IEludGVybG9ja2VkSW5jcmVtZW50KCZtdXRleC0+b3duZWQpID8KLQkJCS8qIFNvbWUgdGhyZWFkIG93bnMgdGhlIG11dGV4LCBsZXQncyB3YWl0Li4uICovCi0JCQlXYWl0Rm9yU2luZ2xlT2JqZWN0KG11dGV4LT5oZXZlbnQsIElORklOSVRFKSA6IFdBSVRfT0JKRUNUXzAgOworICAgIC8qIEludGVybG9ja2VkSW5jcmVtZW50KCZtdXRleC0+b3duZWQpID09IDAgbWVhbnMgdGhhdCBubyB0aHJlYWQgY3VycmVudGx5IG93bnMgdGhlIG11dGV4ICovCisgICAgaWYgKCF3YWl0KQorICAgIHsKKyAgICAgICAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCZtdXRleC0+b3duZWQsIDAsIC0xKSAhPSAtMSkKKyAgICAgICAgICAgIHJldHVybiBXQUlUX1RJTUVPVVQgOworICAgICAgICByZXQgPSBXQUlUX09CSkVDVF8wIDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXQgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmbXV0ZXgtPm93bmVkKSA/CisgICAgICAgICAgICAvKiBTb21lIHRocmVhZCBvd25zIHRoZSBtdXRleCwgbGV0J3Mgd2FpdC4uLiAqLworICAgICAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChtdXRleC0+aGV2ZW50LCBJTkZJTklURSkgOiBXQUlUX09CSkVDVF8wIDsKIAotCW11dGV4LT50aHJlYWRfaWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKSA7IC8qIFdlIG93biBpdCAqLwotCXJldHVybiByZXQgOworICAgIG11dGV4LT50aHJlYWRfaWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKSA7IC8qIFdlIG93biBpdCAqLworICAgIHJldHVybiByZXQgOwogfQogCiBCT09MCiBMZWF2ZU5vblJlY3Vyc2l2ZU11dGV4KFBOUk1VVEVYIG11dGV4KQogewotCS8qIFdlIGRvbid0IG93biB0aGUgbXV0ZXggKi8KLQltdXRleC0+dGhyZWFkX2lkID0gMCA7Ci0JcmV0dXJuCi0JCUludGVybG9ja2VkRGVjcmVtZW50KCZtdXRleC0+b3duZWQpIDwgMCB8fAotCQlTZXRFdmVudChtdXRleC0+aGV2ZW50KSA7IC8qIE90aGVyIHRocmVhZHMgYXJlIHdhaXRpbmcsIHdha2Ugb25lIG9uIHRoZW0gdXAgKi8KKyAgICAvKiBXZSBkb24ndCBvd24gdGhlIG11dGV4ICovCisgICAgbXV0ZXgtPnRocmVhZF9pZCA9IDAgOworICAgIHJldHVybgorICAgICAgICBJbnRlcmxvY2tlZERlY3JlbWVudCgmbXV0ZXgtPm93bmVkKSA8IDAgfHwKKyAgICAgICAgU2V0RXZlbnQobXV0ZXgtPmhldmVudCkgOyAvKiBPdGhlciB0aHJlYWRzIGFyZSB3YWl0aW5nLCB3YWtlIG9uZSBvbiB0aGVtIHVwICovCiB9CiAKIFBOUk1VVEVYCiBBbGxvY05vblJlY3Vyc2l2ZU11dGV4KHZvaWQpCiB7Ci0JUE5STVVURVggbXV0ZXggPSAoUE5STVVURVgpbWFsbG9jKHNpemVvZihOUk1VVEVYKSkgOwotCWlmIChtdXRleCAmJiAhSW5pdGlhbGl6ZU5vblJlY3Vyc2l2ZU11dGV4KG11dGV4KSkKLQl7Ci0JCWZyZWUobXV0ZXgpIDsKLQkJbXV0ZXggPSBOVUxMIDsKLQl9Ci0JcmV0dXJuIG11dGV4IDsKKyAgICBQTlJNVVRFWCBtdXRleCA9IChQTlJNVVRFWCltYWxsb2Moc2l6ZW9mKE5STVVURVgpKSA7CisgICAgaWYgKG11dGV4ICYmICFJbml0aWFsaXplTm9uUmVjdXJzaXZlTXV0ZXgobXV0ZXgpKQorICAgIHsKKyAgICAgICAgZnJlZShtdXRleCkgOworICAgICAgICBtdXRleCA9IE5VTEwgOworICAgIH0KKyAgICByZXR1cm4gbXV0ZXggOwogfQogCiB2b2lkCiBGcmVlTm9uUmVjdXJzaXZlTXV0ZXgoUE5STVVURVggbXV0ZXgpCiB7Ci0JaWYgKG11dGV4KQotCXsKLQkJRGVsZXRlTm9uUmVjdXJzaXZlTXV0ZXgobXV0ZXgpIDsKLQkJZnJlZShtdXRleCkgOwotCX0KKyAgICBpZiAobXV0ZXgpCisgICAgeworICAgICAgICBEZWxldGVOb25SZWN1cnNpdmVNdXRleChtdXRleCkgOworICAgICAgICBmcmVlKG11dGV4KSA7CisgICAgfQogfQogCiBsb25nIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQodm9pZCk7CkBAIC0xMDIsOCArMTAyLDggQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0Jdm9pZCAoKmZ1bmMpKHZvaWQqKTsKLQl2b2lkICphcmc7CisgICAgdm9pZCAoKmZ1bmMpKHZvaWQqKTsKKyAgICB2b2lkICphcmc7CiB9IGNhbGxvYmo7CiAKIC8qIHRodW5rZXIgdG8gY2FsbCBhZGFwdCBiZXR3ZWVuIHRoZSBmdW5jdGlvbiB0eXBlIHVzZWQgYnkgdGhlIHN5c3RlbSdzCkBAIC0xMTUsNjYgKzExNSw2NiBAQAogI2VuZGlmCiBib290c3RyYXAodm9pZCAqY2FsbCkKIHsKLQljYWxsb2JqICpvYmogPSAoY2FsbG9iaiopY2FsbDsKLQl2b2lkICgqZnVuYykodm9pZCopID0gb2JqLT5mdW5jOwotCXZvaWQgKmFyZyA9IG9iai0+YXJnOwotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG9iaik7Ci0JZnVuYyhhcmcpOwotCXJldHVybiAwOworICAgIGNhbGxvYmogKm9iaiA9IChjYWxsb2JqKiljYWxsOworICAgIHZvaWQgKCpmdW5jKSh2b2lkKikgPSBvYmotPmZ1bmM7CisgICAgdm9pZCAqYXJnID0gb2JqLT5hcmc7CisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2JqKTsKKyAgICBmdW5jKGFyZyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGxvbmcKIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlIQU5ETEUgaFRocmVhZDsKLQl1bnNpZ25lZCB0aHJlYWRJRDsKLQljYWxsb2JqICpvYmo7Ci0JCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIsCi0JCSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIEhBTkRMRSBoVGhyZWFkOworICAgIHVuc2lnbmVkIHRocmVhZElEOworICAgIGNhbGxvYmogKm9iajsKIAotCW9iaiA9IChjYWxsb2JqKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKCpvYmopKTsKLQlpZiAoIW9iaikKLQkJcmV0dXJuIC0xOwotCW9iai0+ZnVuYyA9IGZ1bmM7Ci0Jb2JqLT5hcmcgPSBhcmc7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIsCisgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKworICAgIG9iaiA9IChjYWxsb2JqKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKCpvYmopKTsKKyAgICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG9iai0+ZnVuYyA9IGZ1bmM7CisgICAgb2JqLT5hcmcgPSBhcmc7CiAjaWYgZGVmaW5lZChNU19XSU5DRSkKLQloVGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKF9weXRocmVhZF9zdGFja3NpemUsIFB5X3NzaXplX3QsIFNJWkVfVCksCi0JICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXAsIG9iaiwgMCwgJnRocmVhZElEKTsKKyAgICBoVGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKF9weXRocmVhZF9zdGFja3NpemUsIFB5X3NzaXplX3QsIFNJWkVfVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXAsIG9iaiwgMCwgJnRocmVhZElEKTsKICNlbHNlCi0JaFRocmVhZCA9IChIQU5ETEUpX2JlZ2ludGhyZWFkZXgoMCwKLQkJCSAgUHlfU0FGRV9ET1dOQ0FTVChfcHl0aHJlYWRfc3RhY2tzaXplLAotCQkJCQkgICBQeV9zc2l6ZV90LCB1bnNpZ25lZCBpbnQpLAotCQkJICBib290c3RyYXAsIG9iaiwKLQkJCSAgMCwgJnRocmVhZElEKTsKKyAgICBoVGhyZWFkID0gKEhBTkRMRSlfYmVnaW50aHJlYWRleCgwLAorICAgICAgICAgICAgICAgICAgICAgIFB5X1NBRkVfRE9XTkNBU1QoX3B5dGhyZWFkX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QsIHVuc2lnbmVkIGludCksCisgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwLCBvYmosCisgICAgICAgICAgICAgICAgICAgICAgMCwgJnRocmVhZElEKTsKICNlbmRpZgotCWlmIChoVGhyZWFkID09IDApIHsKKyAgICBpZiAoaFRocmVhZCA9PSAwKSB7CiAjaWYgZGVmaW5lZChNU19XSU5DRSkKLQkJLyogU2F2ZSBlcnJvciBpbiB2YXJpYWJsZSwgdG8gcHJldmVudCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50Ci0JCSAgIGZyb20gY2xvYmJlcmluZyBpdC4gKi8KLQkJdW5zaWduZWQgZSA9IEdldExhc3RFcnJvcigpOwotCQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGZhaWxlZCwgd2luMzIgZXJyb3IgY29kZSAldVxuIiwKLQkJICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCBlKSk7CisgICAgICAgIC8qIFNhdmUgZXJyb3IgaW4gdmFyaWFibGUsIHRvIHByZXZlbnQgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudAorICAgICAgICAgICBmcm9tIGNsb2JiZXJpbmcgaXQuICovCisgICAgICAgIHVuc2lnbmVkIGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBmYWlsZWQsIHdpbjMyIGVycm9yIGNvZGUgJXVcbiIsCisgICAgICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgZSkpOwogI2Vsc2UKLQkJLyogSSd2ZSBzZWVuIGVycm5vID09IEVBR0FJTiBoZXJlLCB3aGljaCBtZWFucyAidGhlcmUgYXJlCi0JCSAqIHRvbyBtYW55IHRocmVhZHMiLgotCQkgKi8KLQkJaW50IGUgPSBlcnJubzsKLQkJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBmYWlsZWQsIGVycm5vICVkXG4iLAotCQkgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIGUpKTsKKyAgICAgICAgLyogSSd2ZSBzZWVuIGVycm5vID09IEVBR0FJTiBoZXJlLCB3aGljaCBtZWFucyAidGhlcmUgYXJlCisgICAgICAgICAqIHRvbyBtYW55IHRocmVhZHMiLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGUgPSBlcnJubzsKKyAgICAgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBmYWlsZWQsIGVycm5vICVkXG4iLAorICAgICAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIGUpKTsKICNlbmRpZgotCQl0aHJlYWRJRCA9ICh1bnNpZ25lZCktMTsKLQkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2JqKTsKLQl9Ci0JZWxzZSB7Ci0JCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgc3VjY2VlZGVkOiAlcFxuIiwKLQkJICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCAodm9pZCopaFRocmVhZCkpOwotCQlDbG9zZUhhbmRsZShoVGhyZWFkKTsKLQl9Ci0JcmV0dXJuIChsb25nKSB0aHJlYWRJRDsKKyAgICAgICAgdGhyZWFkSUQgPSAodW5zaWduZWQpLTE7CisgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG9iaik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIHN1Y2NlZWRlZDogJXBcbiIsCisgICAgICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgKHZvaWQqKWhUaHJlYWQpKTsKKyAgICAgICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CisgICAgfQorICAgIHJldHVybiAobG9uZykgdGhyZWFkSUQ7CiB9CiAKIC8qCkBAIC0xODQsMjIgKzE4NCwyMiBAQAogbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCXJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICByZXR1cm4gR2V0Q3VycmVudFRocmVhZElkKCk7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlleGl0KDApOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgZXhpdCgwKTsKICNpZiBkZWZpbmVkKE1TX1dJTkNFKQotCUV4aXRUaHJlYWQoMCk7CisgICAgRXhpdFRocmVhZCgwKTsKICNlbHNlCi0JX2VuZHRocmVhZGV4KDApOworICAgIF9lbmR0aHJlYWRleCgwKTsKICNlbmRpZgogfQogCkBAIC0yMTEsMjUgKzIxMSwyNSBAQAogUHlUaHJlYWRfdHlwZV9sb2NrCiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7Ci0JUE5STVVURVggYUxvY2s7CisgICAgUE5STVVURVggYUxvY2s7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQlhTG9jayA9IEFsbG9jTm9uUmVjdXJzaXZlTXV0ZXgoKSA7CisgICAgYUxvY2sgPSBBbGxvY05vblJlY3Vyc2l2ZU11dGV4KCkgOwogCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIGFMb2NrKSk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIGFMb2NrKSk7CiAKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgYUxvY2s7CisgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGFMb2NrOwogfQogCiB2b2lkCiBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGFMb2NrKQogewotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2spKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrKSk7CiAKLQlGcmVlTm9uUmVjdXJzaXZlTXV0ZXgoYUxvY2spIDsKKyAgICBGcmVlTm9uUmVjdXJzaXZlTXV0ZXgoYUxvY2spIDsKIH0KIAogLyoKQEAgLTI0MSwyOSArMjQxLDI5IEBACiBpbnQKIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgYUxvY2ssIGludCB3YWl0ZmxhZykKIHsKLQlpbnQgc3VjY2VzcyA7CisgICAgaW50IHN1Y2Nlc3MgOwogCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2ssIHdhaXRmbGFnKSk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2ssIHdhaXRmbGFnKSk7CiAKLQlzdWNjZXNzID0gYUxvY2sgJiYgRW50ZXJOb25SZWN1cnNpdmVNdXRleCgoUE5STVVURVgpIGFMb2NrLCAod2FpdGZsYWcgPyBJTkZJTklURSA6IDApKSA9PSBXQUlUX09CSkVDVF8wIDsKKyAgICBzdWNjZXNzID0gYUxvY2sgJiYgRW50ZXJOb25SZWN1cnNpdmVNdXRleCgoUE5STVVURVgpIGFMb2NrLCAod2FpdGZsYWcgPyBJTkZJTklURSA6IDApKSA9PSBXQUlUX09CSkVDVF8wIDsKIAotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKIAotCXJldHVybiBzdWNjZXNzOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiB2b2lkCiBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGFMb2NrKQogewotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2spKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrKSk7CiAKLQlpZiAoIShhTG9jayAmJiBMZWF2ZU5vblJlY3Vyc2l2ZU11dGV4KChQTlJNVVRFWCkgYUxvY2spKSkKLQkJZHByaW50ZigoIiVsZDogQ291bGQgbm90IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZXJyb3I6ICVsZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCBhTG9jaywgR2V0TGFzdEVycm9yKCkpKTsKKyAgICBpZiAoIShhTG9jayAmJiBMZWF2ZU5vblJlY3Vyc2l2ZU11dGV4KChQTlJNVVRFWCkgYUxvY2spKSkKKyAgICAgICAgZHByaW50ZigoIiVsZDogQ291bGQgbm90IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZXJyb3I6ICVsZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCBhTG9jaywgR2V0TGFzdEVycm9yKCkpKTsKIH0KIAogLyogbWluaW11bS9tYXhpbXVtIHRocmVhZCBzdGFjayBzaXplcyBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgVEhSRUFEX01JTl9TVEFDS1NJWkUJMHg4MDAwCQkvKiAzMmtCICovCi0jZGVmaW5lIFRIUkVBRF9NQVhfU1RBQ0tTSVpFCTB4MTAwMDAwMDAJLyogMjU2TUIgKi8KKyNkZWZpbmUgVEhSRUFEX01JTl9TVEFDS1NJWkUgICAgMHg4MDAwICAgICAgICAgIC8qIDMya0IgKi8KKyNkZWZpbmUgVEhSRUFEX01BWF9TVEFDS1NJWkUgICAgMHgxMDAwMDAwMCAgICAgIC8qIDI1Nk1CICovCiAKIC8qIHNldCB0aGUgdGhyZWFkIHN0YWNrIHNpemUuCiAgKiBSZXR1cm4gMCBpZiBzaXplIGlzIHZhbGlkLCAtMSBvdGhlcndpc2UuCkBAIC0yNzEsMjIgKzI3MSwyMiBAQAogc3RhdGljIGludAogX3B5dGhyZWFkX250X3NldF9zdGFja3NpemUoc2l6ZV90IHNpemUpCiB7Ci0JLyogc2V0IHRvIGRlZmF1bHQgKi8KLQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCV9weXRocmVhZF9zdGFja3NpemUgPSAwOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogc2V0IHRvIGRlZmF1bHQgKi8KKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIF9weXRocmVhZF9zdGFja3NpemUgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiB2YWxpZCByYW5nZT8gKi8KLQlpZiAoc2l6ZSA+PSBUSFJFQURfTUlOX1NUQUNLU0laRSAmJiBzaXplIDwgVEhSRUFEX01BWF9TVEFDS1NJWkUpIHsKLQkJX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IHNpemU7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiB2YWxpZCByYW5nZT8gKi8KKyAgICBpZiAoc2l6ZSA+PSBUSFJFQURfTUlOX1NUQUNLU0laRSAmJiBzaXplIDwgVEhSRUFEX01BWF9TVEFDS1NJWkUpIHsKKyAgICAgICAgX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IHNpemU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiB9CiAKLSNkZWZpbmUgVEhSRUFEX1NFVF9TVEFDS1NJWkUoeCkJX3B5dGhyZWFkX250X3NldF9zdGFja3NpemUoeCkKKyNkZWZpbmUgVEhSRUFEX1NFVF9TVEFDS1NJWkUoeCkgX3B5dGhyZWFkX250X3NldF9zdGFja3NpemUoeCkKIAogCiAvKiB1c2UgbmF0aXZlIFdpbmRvd3MgVExTIGZ1bmN0aW9ucyAqLwpAQCAtMjk2LDEzICsyOTYsMTMgQEAKIGludAogUHlUaHJlYWRfY3JlYXRlX2tleSh2b2lkKQogewotCXJldHVybiAoaW50KSBUbHNBbGxvYygpOworICAgIHJldHVybiAoaW50KSBUbHNBbGxvYygpOwogfQogCiB2b2lkCiBQeVRocmVhZF9kZWxldGVfa2V5KGludCBrZXkpCiB7Ci0JVGxzRnJlZShrZXkpOworICAgIFRsc0ZyZWUoa2V5KTsKIH0KIAogLyogV2UgbXVzdCBiZSBjYXJlZnVsIHRvIGVtdWxhdGUgdGhlIHN0cmFuZ2Ugc2VtYW50aWNzIGltcGxlbWVudGVkIGluIHRocmVhZC5jLApAQCAtMzExLDQyICszMTEsNDIgQEAKIGludAogUHlUaHJlYWRfc2V0X2tleV92YWx1ZShpbnQga2V5LCB2b2lkICp2YWx1ZSkKIHsKLQlCT09MIG9rOwotCXZvaWQgKm9sZHZhbHVlOworICAgIEJPT0wgb2s7CisgICAgdm9pZCAqb2xkdmFsdWU7CiAKLQlhc3NlcnQodmFsdWUgIT0gTlVMTCk7Ci0Jb2xkdmFsdWUgPSBUbHNHZXRWYWx1ZShrZXkpOwotCWlmIChvbGR2YWx1ZSAhPSBOVUxMKQotCQkvKiBpZ25vcmUgdmFsdWUgaWYgYWxyZWFkeSBzZXQgKi8KLQkJcmV0dXJuIDA7Ci0Jb2sgPSBUbHNTZXRWYWx1ZShrZXksIHZhbHVlKTsKLQlpZiAoIW9rKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgYXNzZXJ0KHZhbHVlICE9IE5VTEwpOworICAgIG9sZHZhbHVlID0gVGxzR2V0VmFsdWUoa2V5KTsKKyAgICBpZiAob2xkdmFsdWUgIT0gTlVMTCkKKyAgICAgICAgLyogaWdub3JlIHZhbHVlIGlmIGFscmVhZHkgc2V0ICovCisgICAgICAgIHJldHVybiAwOworICAgIG9rID0gVGxzU2V0VmFsdWUoa2V5LCB2YWx1ZSk7CisgICAgaWYgKCFvaykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiB2b2lkICoKIFB5VGhyZWFkX2dldF9rZXlfdmFsdWUoaW50IGtleSkKIHsKLQkvKiBiZWNhdXNlIFRMUyBpcyB1c2VkIGluIHRoZSBQeV9FTkRfQUxMT1dfVEhSRUFEIG1hY3JvLAotCSAqIGl0IGlzIG5lY2Vzc2FyeSB0byBwcmVzZXJ2ZSB0aGUgd2luZG93cyBlcnJvciBzdGF0ZSwgYmVjYXVzZQotCSAqIGl0IGlzIGFzc3VtZWQgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyB0aGUgY2FsbCB0byB0aGUgbWFjcm8uCi0JICogSWRlYWxseSwgdGhlIG1hY3JvIHNob3VsZCBiZSBmaXhlZCwgYnV0IGl0IGlzIHNpbXBsZXIgdG8KLQkgKiBkbyBpdCBoZXJlLgotCSAqLwotCURXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7Ci0Jdm9pZCAqcmVzdWx0ID0gVGxzR2V0VmFsdWUoa2V5KTsKLQlTZXRMYXN0RXJyb3IoZXJyb3IpOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogYmVjYXVzZSBUTFMgaXMgdXNlZCBpbiB0aGUgUHlfRU5EX0FMTE9XX1RIUkVBRCBtYWNybywKKyAgICAgKiBpdCBpcyBuZWNlc3NhcnkgdG8gcHJlc2VydmUgdGhlIHdpbmRvd3MgZXJyb3Igc3RhdGUsIGJlY2F1c2UKKyAgICAgKiBpdCBpcyBhc3N1bWVkIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGwgdG8gdGhlIG1hY3JvLgorICAgICAqIElkZWFsbHksIHRoZSBtYWNybyBzaG91bGQgYmUgZml4ZWQsIGJ1dCBpdCBpcyBzaW1wbGVyIHRvCisgICAgICogZG8gaXQgaGVyZS4KKyAgICAgKi8KKyAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIHZvaWQgKnJlc3VsdCA9IFRsc0dldFZhbHVlKGtleSk7CisgICAgU2V0TGFzdEVycm9yKGVycm9yKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiB2b2lkCiBQeVRocmVhZF9kZWxldGVfa2V5X3ZhbHVlKGludCBrZXkpCiB7Ci0JLyogTlVMTCBpcyB1c2VkIGFzICJrZXkgbWlzc2luZyIsIGFuZCBpdCBpcyBhbHNvIHRoZSBkZWZhdWx0Ci0JICogZ2l2ZW4gYnkgVGxzR2V0VmFsdWUoKSBpZiBub3RoaW5nIGhhcyBiZWVuIHNldCB5ZXQuCi0JICovCi0JVGxzU2V0VmFsdWUoa2V5LCBOVUxMKTsKKyAgICAvKiBOVUxMIGlzIHVzZWQgYXMgImtleSBtaXNzaW5nIiwgYW5kIGl0IGlzIGFsc28gdGhlIGRlZmF1bHQKKyAgICAgKiBnaXZlbiBieSBUbHNHZXRWYWx1ZSgpIGlmIG5vdGhpbmcgaGFzIGJlZW4gc2V0IHlldC4KKyAgICAgKi8KKyAgICBUbHNTZXRWYWx1ZShrZXksIE5VTEwpOwogfQogCiAvKiByZWluaXRpYWxpemF0aW9uIG9mIFRMUyBpcyBub3QgbmVjZXNzYXJ5IGFmdGVyIGZvcmsgd2hlbiB1c2luZwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9vczIuaCBiL1B5dGhvbi90aHJlYWRfb3MyLmgKaW5kZXggZWVlOGRlNi4uMWIyNjRiNSAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9vczIuaAorKysgYi9QeXRob24vdGhyZWFkX29zMi5oCkBAIC0xNiwxMCArMTYsMTAgQEAKIAogLyogZGVmYXVsdCB0aHJlYWQgc3RhY2sgc2l6ZSBvZiA2NGtCICovCiAjaWYgIWRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpCi0jZGVmaW5lCVRIUkVBRF9TVEFDS19TSVpFCTB4MTAwMDAKKyNkZWZpbmUgVEhSRUFEX1NUQUNLX1NJWkUgICAgICAgMHgxMDAwMAogI2VuZGlmCiAKLSNkZWZpbmUgT1MyX1NUQUNLU0laRSh4KQkoeCA/IHggOiBUSFJFQURfU1RBQ0tfU0laRSkKKyNkZWZpbmUgT1MyX1NUQUNLU0laRSh4KSAgICAgICAgKHggPyB4IDogVEhSRUFEX1NUQUNLX1NJWkUpCiAKIC8qCiAgKiBJbml0aWFsaXphdGlvbiBvZiB0aGUgQyBwYWNrYWdlLCBzaG91bGQgbm90IGJlIG5lZWRlZC4KQEAgLTM1LDExMyArMzUsMTEzIEBACiBsb25nCiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7Ci0JaW50IHRocmVhZF9pZDsKKyAgICBpbnQgdGhyZWFkX2lkOwogCi0JdGhyZWFkX2lkID0gX2JlZ2ludGhyZWFkKGZ1bmMsCi0JCQkJTlVMTCwKLQkJCQlPUzJfU1RBQ0tTSVpFKF9weXRocmVhZF9zdGFja3NpemUpLAotCQkJCWFyZyk7CisgICAgdGhyZWFkX2lkID0gX2JlZ2ludGhyZWFkKGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUzJfU1RBQ0tTSVpFKF9weXRocmVhZF9zdGFja3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyk7CiAKLQlpZiAodGhyZWFkX2lkID09IC0xKSB7Ci0JCWRwcmludGYoKCJfYmVnaW50aHJlYWQgZmFpbGVkLiByZXR1cm4gJWxkXG4iLCBlcnJubykpOwotCX0KKyAgICBpZiAodGhyZWFkX2lkID09IC0xKSB7CisgICAgICAgIGRwcmludGYoKCJfYmVnaW50aHJlYWQgZmFpbGVkLiByZXR1cm4gJWxkXG4iLCBlcnJubykpOworICAgIH0KIAotCXJldHVybiB0aHJlYWRfaWQ7CisgICAgcmV0dXJuIHRocmVhZF9pZDsKIH0KIAogbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewogI2lmICFkZWZpbmVkKFBZQ0NfR0NDKQotCVBQSUIgcGliOwotCVBUSUIgdGliOworICAgIFBQSUIgcGliOworICAgIFBUSUIgdGliOwogI2VuZGlmCiAKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKICNpZiBkZWZpbmVkKFBZQ0NfR0NDKQotCXJldHVybiBfZ2V0dGlkKCk7CisgICAgcmV0dXJuIF9nZXR0aWQoKTsKICNlbHNlCi0JRG9zR2V0SW5mb0Jsb2NrcygmdGliLCAmcGliKTsKLQlyZXR1cm4gdGliLT50aWJfcHRpYjItPnRpYjJfdWx0aWQ7CisgICAgRG9zR2V0SW5mb0Jsb2NrcygmdGliLCAmcGliKTsKKyAgICByZXR1cm4gdGliLT50aWJfcHRpYjItPnRpYjJfdWx0aWQ7CiAjZW5kaWYKIH0KIAogdm9pZAogUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIsCi0JCSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlleGl0KDApOwotCV9lbmR0aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIsCisgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgZXhpdCgwKTsKKyAgICBfZW5kdGhyZWFkKCk7CiB9CiAKIC8qCiAgKiBMb2NrIHN1cHBvcnQuICBUaGlzIGlzIGltcGxlbWVudGVkIHdpdGggYW4gZXZlbnQgc2VtYXBob3JlIGFuZCBjcml0aWNhbAotICogc2VjdGlvbnMgdG8gbWFrZSBpdCBiZWhhdmUgbW9yZSBsaWtlIGEgcG9zaXggbXV0ZXggdGhhbiBpdHMgT1MvMiAKKyAqIHNlY3Rpb25zIHRvIG1ha2UgaXQgYmVoYXZlIG1vcmUgbGlrZSBhIHBvc2l4IG11dGV4IHRoYW4gaXRzIE9TLzIKICAqIGNvdW50ZXJwYXJ0cy4KICAqLwogCiB0eXBlZGVmIHN0cnVjdCBvczJfbG9ja190IHsKLQlpbnQgaXNfc2V0OwotCUhFViBjaGFuZ2VkOworICAgIGludCBpc19zZXQ7CisgICAgSEVWIGNoYW5nZWQ7CiB9ICp0eXBlX29zMl9sb2NrOwogCi1QeVRocmVhZF90eXBlX2xvY2sgCitQeVRocmVhZF90eXBlX2xvY2sKIFB5VGhyZWFkX2FsbG9jYXRlX2xvY2sodm9pZCkKIHsKICNpZiBkZWZpbmVkKFBZQ0NfR0NDKQotCV9mbXV0ZXggKnNlbSA9IG1hbGxvYyhzaXplb2YoX2ZtdXRleCkpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7Ci0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVseFxuIiwKLQkJIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwKLQkJIChsb25nKXNlbSkpOwotCWlmIChfZm11dGV4X2NyZWF0ZShzZW0sIDApKSB7Ci0JCWZyZWUoc2VtKTsKLQkJc2VtID0gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spc2VtOworICAgIF9mbXV0ZXggKnNlbSA9IG1hbGxvYyhzaXplb2YoX2ZtdXRleCkpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVseFxuIiwKKyAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksCisgICAgICAgICAgICAgKGxvbmcpc2VtKSk7CisgICAgaWYgKF9mbXV0ZXhfY3JlYXRlKHNlbSwgMCkpIHsKKyAgICAgICAgZnJlZShzZW0pOworICAgICAgICBzZW0gPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaylzZW07CiAjZWxzZQotCUFQSVJFVCByYzsKLQl0eXBlX29zMl9sb2NrIGxvY2sgPSAodHlwZV9vczJfbG9jayltYWxsb2Moc2l6ZW9mKHN0cnVjdCBvczJfbG9ja190KSk7CisgICAgQVBJUkVUIHJjOworICAgIHR5cGVfb3MyX2xvY2sgbG9jayA9ICh0eXBlX29zMl9sb2NrKW1hbGxvYyhzaXplb2Yoc3RydWN0IG9zMl9sb2NrX3QpKTsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWxvY2stPmlzX3NldCA9IDA7CisgICAgbG9jay0+aXNfc2V0ID0gMDsKIAotCURvc0NyZWF0ZUV2ZW50U2VtKE5VTEwsICZsb2NrLT5jaGFuZ2VkLCAwLCAwKTsKKyAgICBEb3NDcmVhdGVFdmVudFNlbShOVUxMLCAmbG9jay0+Y2hhbmdlZCwgMCwgMCk7CiAKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIAotCQkgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCAKLSAgICAgICAgCSBsb2NrLT5jaGFuZ2VkKSk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLAorICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwKKyAgICAgICAgICAgICBsb2NrLT5jaGFuZ2VkKSk7CiAKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaylsb2NrOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKWxvY2s7CiAjZW5kaWYKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgYUxvY2spCiB7CiAjaWYgIWRlZmluZWQoUFlDQ19HQ0MpCi0JdHlwZV9vczJfbG9jayBsb2NrID0gKHR5cGVfb3MyX2xvY2spYUxvY2s7CisgICAgdHlwZV9vczJfbG9jayBsb2NrID0gKHR5cGVfb3MyX2xvY2spYUxvY2s7CiAjZW5kaWYKIAotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLAotCQkgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrKSk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsCisgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrKSk7CiAKICNpZiBkZWZpbmVkKFBZQ0NfR0NDKQotCWlmIChhTG9jaykgewotCQlfZm11dGV4X2Nsb3NlKChfZm11dGV4ICopYUxvY2spOwotCQlmcmVlKChfZm11dGV4ICopYUxvY2spOwotCX0KKyAgICBpZiAoYUxvY2spIHsKKyAgICAgICAgX2ZtdXRleF9jbG9zZSgoX2ZtdXRleCAqKWFMb2NrKTsKKyAgICAgICAgZnJlZSgoX2ZtdXRleCAqKWFMb2NrKTsKKyAgICB9CiAjZWxzZQotCURvc0Nsb3NlRXZlbnRTZW0obG9jay0+Y2hhbmdlZCk7Ci0JZnJlZShhTG9jayk7CisgICAgRG9zQ2xvc2VFdmVudFNlbShsb2NrLT5jaGFuZ2VkKTsKKyAgICBmcmVlKGFMb2NrKTsKICNlbmRpZgogfQogCkBAIC0xNTAsOTggKzE1MCw5OCBAQAogICoKICAqIGFuZCAwIGlmIHRoZSBsb2NrIHdhcyBub3QgYWNxdWlyZWQuCiAgKi8KLWludCAKK2ludAogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBhTG9jaywgaW50IHdhaXRmbGFnKQogewogI2lmICFkZWZpbmVkKFBZQ0NfR0NDKQotCWludCAgIGRvbmUgPSAwOwotCVVMT05HIGNvdW50OwotCVBJRCAgIHBpZCA9IDA7Ci0JVElEICAgdGlkID0gMDsKLQl0eXBlX29zMl9sb2NrIGxvY2sgPSAodHlwZV9vczJfbG9jaylhTG9jazsKKyAgICBpbnQgICBkb25lID0gMDsKKyAgICBVTE9ORyBjb3VudDsKKyAgICBQSUQgICBwaWQgPSAwOworICAgIFRJRCAgIHRpZCA9IDA7CisgICAgdHlwZV9vczJfbG9jayBsb2NrID0gKHR5cGVfb3MyX2xvY2spYUxvY2s7CiAjZW5kaWYKIAotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwKLQkJIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwKLQkJIGFMb2NrLAotCQkgd2FpdGZsYWcpKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsCisgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLAorICAgICAgICAgICAgIGFMb2NrLAorICAgICAgICAgICAgIHdhaXRmbGFnKSk7CiAKICNpZiBkZWZpbmVkKFBZQ0NfR0NDKQotCS8qIGFsd2F5cyBzdWNjZXNzZnVsIGlmIHRoZSBsb2NrIGRvZXNuJ3QgZXhpc3QgKi8KLQlpZiAoYUxvY2sgJiYKLQkgICAgX2ZtdXRleF9yZXF1ZXN0KChfZm11dGV4ICopYUxvY2ssIHdhaXRmbGFnID8gMCA6IF9GTVJfTk9XQUlUKSkKLQkJcmV0dXJuIDA7CisgICAgLyogYWx3YXlzIHN1Y2Nlc3NmdWwgaWYgdGhlIGxvY2sgZG9lc24ndCBleGlzdCAqLworICAgIGlmIChhTG9jayAmJgorICAgICAgICBfZm11dGV4X3JlcXVlc3QoKF9mbXV0ZXggKilhTG9jaywgd2FpdGZsYWcgPyAwIDogX0ZNUl9OT1dBSVQpKQorICAgICAgICByZXR1cm4gMDsKICNlbHNlCi0Jd2hpbGUgKCFkb25lKSB7Ci0JCS8qIGlmIHRoZSBsb2NrIGlzIGN1cnJlbnRseSBzZXQsIHdlIGhhdmUgdG8gd2FpdCBmb3IKLQkJICogdGhlIHN0YXRlIHRvIGNoYW5nZQotCQkgKi8KLQkJaWYgKGxvY2stPmlzX3NldCkgewotCQkJaWYgKCF3YWl0ZmxhZykKLQkJCQlyZXR1cm4gMDsKLQkJCURvc1dhaXRFdmVudFNlbShsb2NrLT5jaGFuZ2VkLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKLQkJfQorICAgIHdoaWxlICghZG9uZSkgeworICAgICAgICAvKiBpZiB0aGUgbG9jayBpcyBjdXJyZW50bHkgc2V0LCB3ZSBoYXZlIHRvIHdhaXQgZm9yCisgICAgICAgICAqIHRoZSBzdGF0ZSB0byBjaGFuZ2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChsb2NrLT5pc19zZXQpIHsKKyAgICAgICAgICAgIGlmICghd2FpdGZsYWcpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBEb3NXYWl0RXZlbnRTZW0obG9jay0+Y2hhbmdlZCwgU0VNX0lOREVGSU5JVEVfV0FJVCk7CisgICAgICAgIH0KIAotCQkvKiBlbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIHRyeSB0byBnZXQgdGhlIHNlbWFwaG9yZS4gIElmCi0JCSAqIGl0IGlzIHN0aWxsIGxvY2tlZCwgd2Ugd2lsbCB0cnkgYWdhaW4uCi0JCSAqLwotCQlpZiAoRG9zRW50ZXJDcml0U2VjKCkpCi0JCQlyZXR1cm4gMDsKKyAgICAgICAgLyogZW50ZXIgYSBjcml0aWNhbCBzZWN0aW9uIGFuZCB0cnkgdG8gZ2V0IHRoZSBzZW1hcGhvcmUuICBJZgorICAgICAgICAgKiBpdCBpcyBzdGlsbCBsb2NrZWQsIHdlIHdpbGwgdHJ5IGFnYWluLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKERvc0VudGVyQ3JpdFNlYygpKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJaWYgKCFsb2NrLT5pc19zZXQpIHsKLQkJCWxvY2stPmlzX3NldCA9IDE7Ci0JCQlEb3NSZXNldEV2ZW50U2VtKGxvY2stPmNoYW5nZWQsICZjb3VudCk7Ci0JCQlkb25lID0gMTsKLQkJfQorICAgICAgICBpZiAoIWxvY2stPmlzX3NldCkgeworICAgICAgICAgICAgbG9jay0+aXNfc2V0ID0gMTsKKyAgICAgICAgICAgIERvc1Jlc2V0RXZlbnRTZW0obG9jay0+Y2hhbmdlZCwgJmNvdW50KTsKKyAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICB9CiAKLQkJRG9zRXhpdENyaXRTZWMoKTsKLQl9CisgICAgICAgIERvc0V4aXRDcml0U2VjKCk7CisgICAgfQogI2VuZGlmCiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogdm9pZAogUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBhTG9jaykKIHsKICNpZiAhZGVmaW5lZChQWUNDX0dDQykKLQl0eXBlX29zMl9sb2NrIGxvY2sgPSAodHlwZV9vczJfbG9jaylhTG9jazsKKyAgICB0eXBlX29zMl9sb2NrIGxvY2sgPSAodHlwZV9vczJfbG9jaylhTG9jazsKICNlbmRpZgogCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsCi0JCSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksCi0JCSBhTG9jaykpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLAorICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwKKyAgICAgICAgICAgICBhTG9jaykpOwogCiAjaWYgZGVmaW5lZChQWUNDX0dDQykKLQlpZiAoYUxvY2spCi0JCV9mbXV0ZXhfcmVsZWFzZSgoX2ZtdXRleCAqKWFMb2NrKTsKKyAgICBpZiAoYUxvY2spCisgICAgICAgIF9mbXV0ZXhfcmVsZWFzZSgoX2ZtdXRleCAqKWFMb2NrKTsKICNlbHNlCi0JaWYgKCFsb2NrLT5pc19zZXQpIHsKLQkJZHByaW50ZigoIiVsZDogQ291bGQgbm90IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZXJyb3I6ICVsXG4iLAotCQkJIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwKLQkJCSBhTG9jaywKLQkJCSBHZXRMYXN0RXJyb3IoKSkpOwotCQlyZXR1cm47Ci0JfQorICAgIGlmICghbG9jay0+aXNfc2V0KSB7CisgICAgICAgIGRwcmludGYoKCIlbGQ6IENvdWxkIG5vdCBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGVycm9yOiAlbFxuIiwKKyAgICAgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLAorICAgICAgICAgICAgICAgICBhTG9jaywKKyAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCWlmIChEb3NFbnRlckNyaXRTZWMoKSkgewotCQlkcHJpbnRmKCgiJWxkOiBDb3VsZCBub3QgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBlcnJvcjogJWxcbiIsCi0JCQkgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLAotCQkJIGFMb2NrLAotCQkJIEdldExhc3RFcnJvcigpKSk7Ci0JCXJldHVybjsKLQl9CisgICAgaWYgKERvc0VudGVyQ3JpdFNlYygpKSB7CisgICAgICAgIGRwcmludGYoKCIlbGQ6IENvdWxkIG5vdCBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGVycm9yOiAlbFxuIiwKKyAgICAgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLAorICAgICAgICAgICAgICAgICBhTG9jaywKKyAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCWxvY2stPmlzX3NldCA9IDA7Ci0JRG9zUG9zdEV2ZW50U2VtKGxvY2stPmNoYW5nZWQpOworICAgIGxvY2stPmlzX3NldCA9IDA7CisgICAgRG9zUG9zdEV2ZW50U2VtKGxvY2stPmNoYW5nZWQpOwogCi0JRG9zRXhpdENyaXRTZWMoKTsKKyAgICBEb3NFeGl0Q3JpdFNlYygpOwogI2VuZGlmCiB9CiAKIC8qIG1pbmltdW0vbWF4aW11bSB0aHJlYWQgc3RhY2sgc2l6ZXMgc3VwcG9ydGVkICovCi0jZGVmaW5lIFRIUkVBRF9NSU5fU1RBQ0tTSVpFCTB4ODAwMAkJLyogMzJrQiAqLwotI2RlZmluZSBUSFJFQURfTUFYX1NUQUNLU0laRQkweDIwMDAwMDAJLyogMzJNQiAqLworI2RlZmluZSBUSFJFQURfTUlOX1NUQUNLU0laRSAgICAweDgwMDAgICAgICAgICAgLyogMzJrQiAqLworI2RlZmluZSBUSFJFQURfTUFYX1NUQUNLU0laRSAgICAweDIwMDAwMDAgICAgICAgLyogMzJNQiAqLwogCiAvKiBzZXQgdGhlIHRocmVhZCBzdGFjayBzaXplLgogICogUmV0dXJuIDAgaWYgc2l6ZSBpcyB2YWxpZCwgLTEgb3RoZXJ3aXNlLgpAQCAtMjQ5LDE5ICsyNDksMTkgQEAKIHN0YXRpYyBpbnQKIF9weXRocmVhZF9vczJfc2V0X3N0YWNrc2l6ZShzaXplX3Qgc2l6ZSkKIHsKLQkvKiBzZXQgdG8gZGVmYXVsdCAqLwotCWlmIChzaXplID09IDApIHsKLQkJX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IDA7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBzZXQgdG8gZGVmYXVsdCAqLworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIHZhbGlkIHJhbmdlPyAqLwotCWlmIChzaXplID49IFRIUkVBRF9NSU5fU1RBQ0tTSVpFICYmIHNpemUgPCBUSFJFQURfTUFYX1NUQUNLU0laRSkgewotCQlfcHl0aHJlYWRfc3RhY2tzaXplID0gc2l6ZTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIHZhbGlkIHJhbmdlPyAqLworICAgIGlmIChzaXplID49IFRIUkVBRF9NSU5fU1RBQ0tTSVpFICYmIHNpemUgPCBUSFJFQURfTUFYX1NUQUNLU0laRSkgeworICAgICAgICBfcHl0aHJlYWRfc3RhY2tzaXplID0gc2l6ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAotI2RlZmluZSBUSFJFQURfU0VUX1NUQUNLU0laRSh4KQlfcHl0aHJlYWRfb3MyX3NldF9zdGFja3NpemUoeCkKKyNkZWZpbmUgVEhSRUFEX1NFVF9TVEFDS1NJWkUoeCkgX3B5dGhyZWFkX29zMl9zZXRfc3RhY2tzaXplKHgpCmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX3B0aC5oIGIvUHl0aG9uL3RocmVhZF9wdGguaAppbmRleCBmMTFlNDg0Li44MmEwMGU3IDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX3B0aC5oCisrKyBiL1B5dGhvbi90aHJlYWRfcHRoLmgKQEAgLTMsNyArMyw3IEBACiAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvcHRoCiAgICAyMDAwLTA1LTAzIEFuZHkgRHVzdG1hbiA8YW5keUBkdXN0bWFuLm5ldD4KIAotICAgQWRhcHRlZCBmcm9tIFBvc2l4IHRocmVhZHMgaW50ZXJmYWNlIAorICAgQWRhcHRlZCBmcm9tIFBvc2l4IHRocmVhZHMgaW50ZXJmYWNlCiAgICAxMiBNYXkgMTk5NyAtLSBkYXZpZCBhcm5vbGQgPGRhdmlkYUBwb2JveC5jb20+CiAgKi8KIApAQCAtMjIsMTAgKzIyLDEwIEBACiAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgICAgICAgICAgICAgbG9ja2VkOyAvKiAwPXVubG9ja2VkLCAxPWxvY2tlZCAqLwotCS8qIGEgPGNvbmQsIG11dGV4PiBwYWlyIHRvIGhhbmRsZSBhbiBhY3F1aXJlIG9mIGEgbG9ja2VkIGxvY2sgKi8KLQlwdGhfY29uZF90ICAgbG9ja19yZWxlYXNlZDsKLQlwdGhfbXV0ZXhfdCAgbXV0OworICAgIGNoYXIgICAgICAgICAgICAgbG9ja2VkOyAvKiAwPXVubG9ja2VkLCAxPWxvY2tlZCAqLworICAgIC8qIGEgPGNvbmQsIG11dGV4PiBwYWlyIHRvIGhhbmRsZSBhbiBhY3F1aXJlIG9mIGEgbG9ja2VkIGxvY2sgKi8KKyAgICBwdGhfY29uZF90ICAgbG9ja19yZWxlYXNlZDsKKyAgICBwdGhfbXV0ZXhfdCAgbXV0OwogfSBwdGhfbG9jazsKIAogI2RlZmluZSBDSEVDS19TVEFUVVMobmFtZSkgIGlmIChzdGF0dXMgPT0gLTEpIHsgcHJpbnRmKCIlZCAiLCBzdGF0dXMpOyBwZXJyb3IobmFtZSk7IGVycm9yID0gMTsgfQpAQCAtMzgsMTAgKzM4LDEwIEBACiAKIHN0YXRpYyB2b2lkIFB5VGhyZWFkX19pbml0X3RocmVhZCh2b2lkKQogewotCXB0aF9pbml0KCk7Ci0JUHlUaHJlYWRfYXR0ciA9IHB0aF9hdHRyX25ldygpOwotCXB0aF9hdHRyX3NldChQeVRocmVhZF9hdHRyLCBQVEhfQVRUUl9TVEFDS19TSVpFLCAxPDwxOCk7Ci0JcHRoX2F0dHJfc2V0KFB5VGhyZWFkX2F0dHIsIFBUSF9BVFRSX0pPSU5BQkxFLCBGQUxTRSk7CisgICAgcHRoX2luaXQoKTsKKyAgICBQeVRocmVhZF9hdHRyID0gcHRoX2F0dHJfbmV3KCk7CisgICAgcHRoX2F0dHJfc2V0KFB5VGhyZWFkX2F0dHIsIFBUSF9BVFRSX1NUQUNLX1NJWkUsIDE8PDE4KTsKKyAgICBwdGhfYXR0cl9zZXQoUHlUaHJlYWRfYXR0ciwgUFRIX0FUVFJfSk9JTkFCTEUsIEZBTFNFKTsKIH0KIAogLyoKQEAgLTUxLDM1ICs1MSwzNSBAQAogCiBsb25nIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlwdGhfdCB0aDsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIHB0aF90IHRoOworICAgIGRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQl0aCA9IHB0aF9zcGF3bihQeVRocmVhZF9hdHRyLAotCQkJCSAodm9pZCogKCopKHZvaWQgKikpZnVuYywKLQkJCQkgKHZvaWQgKilhcmcKLQkJCQkgKTsKKyAgICB0aCA9IHB0aF9zcGF3bihQeVRocmVhZF9hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCogKCopKHZvaWQgKikpZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhcmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAotCXJldHVybiB0aDsKKyAgICByZXR1cm4gdGg7CiB9CiAKIGxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCXZvbGF0aWxlIHB0aF90IHRocmVhZGlkOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7Ci0JLyogSnVtcCB0aHJvdWdoIHNvbWUgaG9vcHMgZm9yIEFscGhhIE9TRi8xICovCi0JdGhyZWFkaWQgPSBwdGhfc2VsZigpOwotCXJldHVybiAobG9uZykgKihsb25nICopICZ0aHJlYWRpZDsKKyAgICB2b2xhdGlsZSBwdGhfdCB0aHJlYWRpZDsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIC8qIEp1bXAgdGhyb3VnaCBzb21lIGhvb3BzIGZvciBBbHBoYSBPU0YvMSAqLworICAgIHRocmVhZGlkID0gcHRoX3NlbGYoKTsKKyAgICByZXR1cm4gKGxvbmcpICoobG9uZyAqKSAmdGhyZWFkaWQ7CiB9CiAKIHZvaWQgUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkgewotCQlleGl0KDApOwotCX0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkgeworICAgICAgICBleGl0KDApOworICAgIH0KIH0KIAogLyoKQEAgLTg3LDkyICs4Nyw5MiBAQAogICovCiBQeVRocmVhZF90eXBlX2xvY2sgUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewotCXB0aF9sb2NrICpsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBwdGhfbG9jayAqbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQlsb2NrID0gKHB0aF9sb2NrICopIG1hbGxvYyhzaXplb2YocHRoX2xvY2spKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopbG9jaywgJ1wwJywgc2l6ZW9mKHB0aF9sb2NrKSk7Ci0JaWYgKGxvY2spIHsKLQkJbG9jay0+bG9ja2VkID0gMDsKLQkJc3RhdHVzID0gcHRoX211dGV4X2luaXQoJmxvY2stPm11dCk7Ci0JCUNIRUNLX1NUQVRVUygicHRoX211dGV4X2luaXQiKTsKLQkJc3RhdHVzID0gcHRoX2NvbmRfaW5pdCgmbG9jay0+bG9ja19yZWxlYXNlZCk7Ci0JCUNIRUNLX1NUQVRVUygicHRoX2NvbmRfaW5pdCIpOwotCQlpZiAoZXJyb3IpIHsKLQkJCWZyZWUoKHZvaWQgKilsb2NrKTsKLQkJCWxvY2sgPSBOVUxMOwotCQl9Ci0JfQotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKKyAgICBsb2NrID0gKHB0aF9sb2NrICopIG1hbGxvYyhzaXplb2YocHRoX2xvY2spKTsKKyAgICBtZW1zZXQoKHZvaWQgKilsb2NrLCAnXDAnLCBzaXplb2YocHRoX2xvY2spKTsKKyAgICBpZiAobG9jaykgeworICAgICAgICBsb2NrLT5sb2NrZWQgPSAwOworICAgICAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfaW5pdCgmbG9jay0+bXV0KTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfaW5pdCIpOworICAgICAgICBzdGF0dXMgPSBwdGhfY29uZF9pbml0KCZsb2NrLT5sb2NrX3JlbGVhc2VkKTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfY29uZF9pbml0Iik7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgZnJlZSgodm9pZCAqKWxvY2spOworICAgICAgICAgICAgbG9jayA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOwogfQogCiB2b2lkIFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlwdGhfbG9jayAqdGhlbG9jayA9IChwdGhfbG9jayAqKWxvY2s7CisgICAgcHRoX2xvY2sgKnRoZWxvY2sgPSAocHRoX2xvY2sgKilsb2NrOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKLQlmcmVlKCh2b2lkICopdGhlbG9jayk7CisgICAgZnJlZSgodm9pZCAqKXRoZWxvY2spOwogfQogCiBpbnQgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrLCBpbnQgd2FpdGZsYWcpCiB7Ci0JaW50IHN1Y2Nlc3M7Ci0JcHRoX2xvY2sgKnRoZWxvY2sgPSAocHRoX2xvY2sgKilsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBpbnQgc3VjY2VzczsKKyAgICBwdGhfbG9jayAqdGhlbG9jayA9IChwdGhfbG9jayAqKWxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOwogCi0Jc3RhdHVzID0gcHRoX211dGV4X2FjcXVpcmUoJnRoZWxvY2stPm11dCwgIXdhaXRmbGFnLCBOVUxMKTsKLQlDSEVDS19TVEFUVVMoInB0aF9tdXRleF9hY3F1aXJlWzFdIik7Ci0Jc3VjY2VzcyA9IHRoZWxvY2stPmxvY2tlZCA9PSAwOwotICAgICAgICBpZiAoc3VjY2VzcykgdGhlbG9jay0+bG9ja2VkID0gMTsKLSAgICAgICAgc3RhdHVzID0gcHRoX211dGV4X3JlbGVhc2UoICZ0aGVsb2NrLT5tdXQgKTsKLSAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfcmVsZWFzZVsxXSIpOworICAgIHN0YXR1cyA9IHB0aF9tdXRleF9hY3F1aXJlKCZ0aGVsb2NrLT5tdXQsICF3YWl0ZmxhZywgTlVMTCk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfYWNxdWlyZVsxXSIpOworICAgIHN1Y2Nlc3MgPSB0aGVsb2NrLT5sb2NrZWQgPT0gMDsKKyAgICBpZiAoc3VjY2VzcykgdGhlbG9jay0+bG9ja2VkID0gMTsKKyAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfcmVsZWFzZSggJnRoZWxvY2stPm11dCApOworICAgIENIRUNLX1NUQVRVUygicHRoX211dGV4X3JlbGVhc2VbMV0iKTsKIAotICAgICAgICBpZiAoICFzdWNjZXNzICYmIHdhaXRmbGFnICkgewotICAgICAgICAgICAgICAgIC8qIGNvbnRpbnVlIHRyeWluZyB1bnRpbCB3ZSBnZXQgdGhlIGxvY2sgKi8KKyAgICBpZiAoICFzdWNjZXNzICYmIHdhaXRmbGFnICkgeworICAgICAgICAvKiBjb250aW51ZSB0cnlpbmcgdW50aWwgd2UgZ2V0IHRoZSBsb2NrICovCiAKLSAgICAgICAgICAgICAgICAvKiBtdXQgbXVzdCBiZSBsb2NrZWQgYnkgbWUgLS0gcGFydCBvZiB0aGUgY29uZGl0aW9uCi0gICAgICAgICAgICAgICAgICogcHJvdG9jb2wgKi8KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfYWNxdWlyZSggJnRoZWxvY2stPm11dCwgIXdhaXRmbGFnLCBOVUxMICk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfYWNxdWlyZVsyXSIpOwotICAgICAgICAgICAgICAgIHdoaWxlICggdGhlbG9jay0+bG9ja2VkICkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcHRoX2NvbmRfYXdhaXQoJnRoZWxvY2stPmxvY2tfcmVsZWFzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlbG9jay0+bXV0LCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUygicHRoX2NvbmRfYXdhaXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhlbG9jay0+bG9ja2VkID0gMTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfcmVsZWFzZSggJnRoZWxvY2stPm11dCApOwotICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUygicHRoX211dGV4X3JlbGVhc2VbMl0iKTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gMTsKKyAgICAgICAgLyogbXV0IG11c3QgYmUgbG9ja2VkIGJ5IG1lIC0tIHBhcnQgb2YgdGhlIGNvbmRpdGlvbgorICAgICAgICAgKiBwcm90b2NvbCAqLworICAgICAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfYWNxdWlyZSggJnRoZWxvY2stPm11dCwgIXdhaXRmbGFnLCBOVUxMICk7CisgICAgICAgIENIRUNLX1NUQVRVUygicHRoX211dGV4X2FjcXVpcmVbMl0iKTsKKyAgICAgICAgd2hpbGUgKCB0aGVsb2NrLT5sb2NrZWQgKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhfY29uZF9hd2FpdCgmdGhlbG9jay0+bG9ja19yZWxlYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVsb2NrLT5tdXQsIE5VTEwpOworICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfY29uZF9hd2FpdCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChlcnJvcikgc3VjY2VzcyA9IDA7Ci0gICAgICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICAgICAgdGhlbG9jay0+bG9ja2VkID0gMTsKKyAgICAgICAgc3RhdHVzID0gcHRoX211dGV4X3JlbGVhc2UoICZ0aGVsb2NrLT5tdXQgKTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfcmVsZWFzZVsyXSIpOworICAgICAgICBzdWNjZXNzID0gMTsKKyAgICB9CisgICAgaWYgKGVycm9yKSBzdWNjZXNzID0gMDsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIHZvaWQgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotICAgICAgICBwdGhfbG9jayAqdGhlbG9jayA9IChwdGhfbG9jayAqKWxvY2s7Ci0gICAgICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBwdGhfbG9jayAqdGhlbG9jayA9IChwdGhfbG9jayAqKWxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0gICAgICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwogCi0gICAgICAgIHN0YXR1cyA9IHB0aF9tdXRleF9hY3F1aXJlKCAmdGhlbG9jay0+bXV0LCAwLCBOVUxMICk7Ci0gICAgICAgIENIRUNLX1NUQVRVUygicHRoX211dGV4X2FjcXVpcmVbM10iKTsKKyAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfYWNxdWlyZSggJnRoZWxvY2stPm11dCwgMCwgTlVMTCApOworICAgIENIRUNLX1NUQVRVUygicHRoX211dGV4X2FjcXVpcmVbM10iKTsKIAotICAgICAgICB0aGVsb2NrLT5sb2NrZWQgPSAwOworICAgIHRoZWxvY2stPmxvY2tlZCA9IDA7CiAKLSAgICAgICAgc3RhdHVzID0gcHRoX211dGV4X3JlbGVhc2UoICZ0aGVsb2NrLT5tdXQgKTsKLSAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfcmVsZWFzZVszXSIpOworICAgIHN0YXR1cyA9IHB0aF9tdXRleF9yZWxlYXNlKCAmdGhlbG9jay0+bXV0ICk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfcmVsZWFzZVszXSIpOwogCi0gICAgICAgIC8qIHdha2UgdXAgc29tZW9uZSAoYW55b25lLCBpZiBhbnkpIHdhaXRpbmcgb24gdGhlIGxvY2sgKi8KLSAgICAgICAgc3RhdHVzID0gcHRoX2NvbmRfbm90aWZ5KCAmdGhlbG9jay0+bG9ja19yZWxlYXNlZCwgMCApOwotICAgICAgICBDSEVDS19TVEFUVVMoInB0aF9jb25kX25vdGlmeSIpOworICAgIC8qIHdha2UgdXAgc29tZW9uZSAoYW55b25lLCBpZiBhbnkpIHdhaXRpbmcgb24gdGhlIGxvY2sgKi8KKyAgICBzdGF0dXMgPSBwdGhfY29uZF9ub3RpZnkoICZ0aGVsb2NrLT5sb2NrX3JlbGVhc2VkLCAwICk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfY29uZF9ub3RpZnkiKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfcHRocmVhZC5oIGIvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKaW5kZXggNDMwNWExOS4uZWY0OWEzMCAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKKysrIGIvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKQEAgLTE2LDEwICsxNiwxMCBAQAogICAgYmUgY29uZGl0aW9uYWwgb24gX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSBiZWluZyBkZWZpbmVkLiAqLwogI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKICNpZm5kZWYgVEhSRUFEX1NUQUNLX1NJWkUKLSNkZWZpbmUJVEhSRUFEX1NUQUNLX1NJWkUJMAkvKiB1c2UgZGVmYXVsdCBzdGFjayBzaXplICovCisjZGVmaW5lIFRIUkVBRF9TVEFDS19TSVpFICAgICAgIDAgICAgICAgLyogdXNlIGRlZmF1bHQgc3RhY2sgc2l6ZSAqLwogI2VuZGlmCiAvKiBmb3Igc2FmZXR5LCBlbnN1cmUgYSB2aWFibGUgbWluaW11bSBzdGFja3NpemUgKi8KLSNkZWZpbmUJVEhSRUFEX1NUQUNLX01JTgkweDgwMDAJLyogMzJrQiAqLworI2RlZmluZSBUSFJFQURfU1RBQ0tfTUlOICAgICAgICAweDgwMDAgIC8qIDMya0IgKi8KICNlbHNlICAvKiAhX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLwogI2lmZGVmIFRIUkVBRF9TVEFDS19TSVpFCiAjZXJyb3IgIlRIUkVBRF9TVEFDS19TSVpFIGRlZmluZWQgYnV0IF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgdW5kZWZpbmVkIgpAQCAtMjgsOSArMjgsOSBAQAogCiAvKiBUaGUgUE9TSVggc3BlYyBzYXlzIHRoYXQgaW1wbGVtZW50YXRpb25zIHN1cHBvcnRpbmcgdGhlIHNlbV8qCiAgICBmYW1pbHkgb2YgZnVuY3Rpb25zIG11c3QgaW5kaWNhdGUgdGhpcyBieSBkZWZpbmluZwotICAgX1BPU0lYX1NFTUFQSE9SRVMuICovICAgCisgICBfUE9TSVhfU0VNQVBIT1JFUy4gKi8KICNpZmRlZiBfUE9TSVhfU0VNQVBIT1JFUwotLyogT24gRnJlZUJTRCA0LngsIF9QT1NJWF9TRU1BUEhPUkVTIGlzIGRlZmluZWQgZW1wdHksIHNvIAorLyogT24gRnJlZUJTRCA0LngsIF9QT1NJWF9TRU1BUEhPUkVTIGlzIGRlZmluZWQgZW1wdHksIHNvCiAgICB3ZSBuZWVkIHRvIGFkZCAwIHRvIG1ha2UgaXQgd29yayB0aGVyZSBhcyB3ZWxsLiAqLwogI2lmIChfUE9TSVhfU0VNQVBIT1JFUyswKSA9PSAtMQogI2RlZmluZSBIQVZFX0JST0tFTl9QT1NJWF9TRU1BUEhPUkVTCkBAIC05OSwxMCArOTksMTAgQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JY2hhciAgICAgICAgICAgICBsb2NrZWQ7IC8qIDA9dW5sb2NrZWQsIDE9bG9ja2VkICovCi0JLyogYSA8Y29uZCwgbXV0ZXg+IHBhaXIgdG8gaGFuZGxlIGFuIGFjcXVpcmUgb2YgYSBsb2NrZWQgbG9jayAqLwotCXB0aHJlYWRfY29uZF90ICAgbG9ja19yZWxlYXNlZDsKLQlwdGhyZWFkX211dGV4X3QgIG11dDsKKyAgICBjaGFyICAgICAgICAgICAgIGxvY2tlZDsgLyogMD11bmxvY2tlZCwgMT1sb2NrZWQgKi8KKyAgICAvKiBhIDxjb25kLCBtdXRleD4gcGFpciB0byBoYW5kbGUgYW4gYWNxdWlyZSBvZiBhIGxvY2tlZCBsb2NrICovCisgICAgcHRocmVhZF9jb25kX3QgICBsb2NrX3JlbGVhc2VkOworICAgIHB0aHJlYWRfbXV0ZXhfdCAgbXV0OwogfSBwdGhyZWFkX2xvY2s7CiAKICNkZWZpbmUgQ0hFQ0tfU1RBVFVTKG5hbWUpICBpZiAoc3RhdHVzICE9IDApIHsgcGVycm9yKG5hbWUpOyBlcnJvciA9IDE7IH0KQEAgLTEyMCwxMSArMTIwLDExIEBACiBzdGF0aWMgdm9pZAogUHlUaHJlYWRfX2luaXRfdGhyZWFkKHZvaWQpCiB7Ci0JLyogRE8gQU4gSU5JVCBCWSBTVEFSVElORyBUSEUgVEhSRUFEICovCi0Jc3RhdGljIGludCBkdW1teSA9IDA7Ci0JcHRocmVhZF90IHRocmVhZDE7Ci0JcHRocmVhZF9jcmVhdGUoJnRocmVhZDEsIE5VTEwsICh2b2lkICopIF9ub29wLCAmZHVtbXkpOwotCXB0aHJlYWRfam9pbih0aHJlYWQxLCBOVUxMKTsKKyAgICAvKiBETyBBTiBJTklUIEJZIFNUQVJUSU5HIFRIRSBUSFJFQUQgKi8KKyAgICBzdGF0aWMgaW50IGR1bW15ID0gMDsKKyAgICBwdGhyZWFkX3QgdGhyZWFkMTsKKyAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkMSwgTlVMTCwgKHZvaWQgKikgX25vb3AsICZkdW1teSk7CisgICAgcHRocmVhZF9qb2luKHRocmVhZDEsIE5VTEwpOwogfQogCiAjZWxzZSAvKiAhX0hBVkVfQlNESSAqLwpAQCAtMTMzLDcgKzEzMyw3IEBACiBQeVRocmVhZF9faW5pdF90aHJlYWQodm9pZCkKIHsKICNpZiBkZWZpbmVkKF9BSVgpICYmIGRlZmluZWQoX19HTlVDX18pCi0JcHRocmVhZF9pbml0KCk7CisgICAgcHRocmVhZF9pbml0KCk7CiAjZW5kaWYKIH0KIApAQCAtMTQ3LDU5ICsxNDcsNTkgQEAKIGxvbmcKIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlwdGhyZWFkX3QgdGg7Ci0JaW50IHN0YXR1czsKKyAgICBwdGhyZWFkX3QgdGg7CisgICAgaW50IHN0YXR1czsKICNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKSB8fCBkZWZpbmVkKFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCkKLQlwdGhyZWFkX2F0dHJfdCBhdHRyczsKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyczsKICNlbmRpZgogI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpCi0Jc2l6ZV90CXRzczsKKyAgICBzaXplX3QgICAgICB0c3M7CiAjZW5kaWYKIAotCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAogI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpIHx8IGRlZmluZWQoUFRIUkVBRF9TWVNURU1fU0NIRURfU1VQUE9SVEVEKQotCWlmIChwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cnMpICE9IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAocHRocmVhZF9hdHRyX2luaXQoJmF0dHJzKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CiAjZW5kaWYKICNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKQotCXRzcyA9IChfcHl0aHJlYWRfc3RhY2tzaXplICE9IDApID8gX3B5dGhyZWFkX3N0YWNrc2l6ZQotCQkJCQkgOiBUSFJFQURfU1RBQ0tfU0laRTsKLQlpZiAodHNzICE9IDApIHsKLQkJaWYgKHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHJzLCB0c3MpICE9IDApIHsKLQkJCXB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRycyk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgdHNzID0gKF9weXRocmVhZF9zdGFja3NpemUgIT0gMCkgPyBfcHl0aHJlYWRfc3RhY2tzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUSFJFQURfU1RBQ0tfU0laRTsKKyAgICBpZiAodHNzICE9IDApIHsKKyAgICAgICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHJzLCB0c3MpICE9IDApIHsKKyAgICAgICAgICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRycyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKICNpZiBkZWZpbmVkKFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCkKLSAgICAgICAgcHRocmVhZF9hdHRyX3NldHNjb3BlKCZhdHRycywgUFRIUkVBRF9TQ09QRV9TWVNURU0pOworICAgIHB0aHJlYWRfYXR0cl9zZXRzY29wZSgmYXR0cnMsIFBUSFJFQURfU0NPUEVfU1lTVEVNKTsKICNlbmRpZgogCi0Jc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoJnRoLCAKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSgmdGgsCiAjaWYgZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkgfHwgZGVmaW5lZChQVEhSRUFEX1NZU1RFTV9TQ0hFRF9TVVBQT1JURUQpCi0JCQkJICZhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJzLAogI2Vsc2UKLQkJCQkgKHB0aHJlYWRfYXR0cl90KilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRocmVhZF9hdHRyX3QqKU5VTEwsCiAjZW5kaWYKLQkJCQkgKHZvaWQqICgqKSh2b2lkICopKWZ1bmMsCi0JCQkJICh2b2lkICopYXJnCi0JCQkJICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiAoKikodm9pZCAqKSlmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFyZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCiAjaWYgZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkgfHwgZGVmaW5lZChQVEhSRUFEX1NZU1RFTV9TQ0hFRF9TVVBQT1JURUQpCi0JcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHJzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cnMpOwogI2VuZGlmCi0JaWYgKHN0YXR1cyAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChzdGF0dXMgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICAgIHB0aHJlYWRfZGV0YWNoKHRoKTsKKyAgICBwdGhyZWFkX2RldGFjaCh0aCk7CiAKICNpZiBTSVpFT0ZfUFRIUkVBRF9UIDw9IFNJWkVPRl9MT05HCi0JcmV0dXJuIChsb25nKSB0aDsKKyAgICByZXR1cm4gKGxvbmcpIHRoOwogI2Vsc2UKLQlyZXR1cm4gKGxvbmcpICoobG9uZyAqKSAmdGg7CisgICAgcmV0dXJuIChsb25nKSAqKGxvbmcgKikgJnRoOwogI2VuZGlmCiB9CiAKQEAgLTIxMCwyOCArMjEwLDI4IEBACiAgICAgIC0gSXQgaXMgbm90IGNsZWFyIHRoYXQgdGhlICd2b2xhdGlsZScgKGZvciBBSVg/KSBhbmQgdWdseSBjYXN0aW5nIGluIHRoZQogICAgICAgIGxhdHRlciByZXR1cm4gc3RhdGVtZW50IChmb3IgQWxwaGEgT1NGLzEpIGFyZSBhbnkgbG9uZ2VyIG5lY2Vzc2FyeS4KICovCi1sb25nIAorbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCXZvbGF0aWxlIHB0aHJlYWRfdCB0aHJlYWRpZDsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCS8qIEp1bXAgdGhyb3VnaCBzb21lIGhvb3BzIGZvciBBbHBoYSBPU0YvMSAqLwotCXRocmVhZGlkID0gcHRocmVhZF9zZWxmKCk7CisgICAgdm9sYXRpbGUgcHRocmVhZF90IHRocmVhZGlkOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgLyogSnVtcCB0aHJvdWdoIHNvbWUgaG9vcHMgZm9yIEFscGhhIE9TRi8xICovCisgICAgdGhyZWFkaWQgPSBwdGhyZWFkX3NlbGYoKTsKICNpZiBTSVpFT0ZfUFRIUkVBRF9UIDw9IFNJWkVPRl9MT05HCi0JcmV0dXJuIChsb25nKSB0aHJlYWRpZDsKKyAgICByZXR1cm4gKGxvbmcpIHRocmVhZGlkOwogI2Vsc2UKLQlyZXR1cm4gKGxvbmcpICoobG9uZyAqKSAmdGhyZWFkaWQ7CisgICAgcmV0dXJuIChsb25nKSAqKGxvbmcgKikgJnRocmVhZGlkOwogI2VuZGlmCiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCWV4aXQoMCk7Ci0JfQorICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIGV4aXQoMCk7CisgICAgfQogfQogCiAjaWZkZWYgVVNFX1NFTUFQSE9SRVMKQEAgLTI0MCw0NyArMjQwLDQ3IEBACiAgKiBMb2NrIHN1cHBvcnQuCiAgKi8KIAotUHlUaHJlYWRfdHlwZV9sb2NrIAorUHlUaHJlYWRfdHlwZV9sb2NrCiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7Ci0Jc2VtX3QgKmxvY2s7Ci0JaW50IHN0YXR1cywgZXJyb3IgPSAwOworICAgIHNlbV90ICpsb2NrOworICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWxvY2sgPSAoc2VtX3QgKiltYWxsb2Moc2l6ZW9mKHNlbV90KSk7CisgICAgbG9jayA9IChzZW1fdCAqKW1hbGxvYyhzaXplb2Yoc2VtX3QpKTsKIAotCWlmIChsb2NrKSB7Ci0JCXN0YXR1cyA9IHNlbV9pbml0KGxvY2ssMCwxKTsKLQkJQ0hFQ0tfU1RBVFVTKCJzZW1faW5pdCIpOworICAgIGlmIChsb2NrKSB7CisgICAgICAgIHN0YXR1cyA9IHNlbV9pbml0KGxvY2ssMCwxKTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJzZW1faW5pdCIpOwogCi0JCWlmIChlcnJvcikgewotCQkJZnJlZSgodm9pZCAqKWxvY2spOwotCQkJbG9jayA9IE5VTEw7Ci0JCX0KLQl9CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgZnJlZSgodm9pZCAqKWxvY2spOworICAgICAgICAgICAgbG9jayA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7Ci0JcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spbG9jazsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7CisgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spbG9jazsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlzZW1fdCAqdGhlbG9jayA9IChzZW1fdCAqKWxvY2s7Ci0JaW50IHN0YXR1cywgZXJyb3IgPSAwOworICAgIHNlbV90ICp0aGVsb2NrID0gKHNlbV90ICopbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKIAotCWlmICghdGhlbG9jaykKLQkJcmV0dXJuOworICAgIGlmICghdGhlbG9jaykKKyAgICAgICAgcmV0dXJuOwogCi0Jc3RhdHVzID0gc2VtX2Rlc3Ryb3kodGhlbG9jayk7Ci0JQ0hFQ0tfU1RBVFVTKCJzZW1fZGVzdHJveSIpOworICAgIHN0YXR1cyA9IHNlbV9kZXN0cm95KHRoZWxvY2spOworICAgIENIRUNLX1NUQVRVUygic2VtX2Rlc3Ryb3kiKTsKIAotCWZyZWUoKHZvaWQgKil0aGVsb2NrKTsKKyAgICBmcmVlKCh2b2lkICopdGhlbG9jayk7CiB9CiAKIC8qCkBAIC0yOTIsNDcgKzI5Miw0NyBAQAogc3RhdGljIGludAogZml4X3N0YXR1cyhpbnQgc3RhdHVzKQogewotCXJldHVybiAoc3RhdHVzID09IC0xKSA/IGVycm5vIDogc3RhdHVzOworICAgIHJldHVybiAoc3RhdHVzID09IC0xKSA/IGVycm5vIDogc3RhdHVzOwogfQogCi1pbnQgCitpbnQKIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCBzdWNjZXNzOwotCXNlbV90ICp0aGVsb2NrID0gKHNlbV90ICopbG9jazsKLQlpbnQgc3RhdHVzLCBlcnJvciA9IDA7CisgICAgaW50IHN1Y2Nlc3M7CisgICAgc2VtX3QgKnRoZWxvY2sgPSAoc2VtX3QgKilsb2NrOworICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKIAotCWRvIHsKLQkJaWYgKHdhaXRmbGFnKQotCQkJc3RhdHVzID0gZml4X3N0YXR1cyhzZW1fd2FpdCh0aGVsb2NrKSk7Ci0JCWVsc2UKLQkJCXN0YXR1cyA9IGZpeF9zdGF0dXMoc2VtX3RyeXdhaXQodGhlbG9jaykpOwotCX0gd2hpbGUgKHN0YXR1cyA9PSBFSU5UUik7IC8qIFJldHJ5IGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsICovCisgICAgZG8geworICAgICAgICBpZiAod2FpdGZsYWcpCisgICAgICAgICAgICBzdGF0dXMgPSBmaXhfc3RhdHVzKHNlbV93YWl0KHRoZWxvY2spKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhdHVzID0gZml4X3N0YXR1cyhzZW1fdHJ5d2FpdCh0aGVsb2NrKSk7CisgICAgfSB3aGlsZSAoc3RhdHVzID09IEVJTlRSKTsgLyogUmV0cnkgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgKi8KIAotCWlmICh3YWl0ZmxhZykgewotCQlDSEVDS19TVEFUVVMoInNlbV93YWl0Iik7Ci0JfSBlbHNlIGlmIChzdGF0dXMgIT0gRUFHQUlOKSB7Ci0JCUNIRUNLX1NUQVRVUygic2VtX3RyeXdhaXQiKTsKLQl9Ci0JCi0Jc3VjY2VzcyA9IChzdGF0dXMgPT0gMCkgPyAxIDogMDsKKyAgICBpZiAod2FpdGZsYWcpIHsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJzZW1fd2FpdCIpOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEVBR0FJTikgeworICAgICAgICBDSEVDS19TVEFUVVMoInNlbV90cnl3YWl0Iik7CisgICAgfQogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwotCXJldHVybiBzdWNjZXNzOworICAgIHN1Y2Nlc3MgPSAoc3RhdHVzID09IDApID8gMSA6IDA7CisKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0Jc2VtX3QgKnRoZWxvY2sgPSAoc2VtX3QgKilsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBzZW1fdCAqdGhlbG9jayA9IChzZW1fdCAqKWxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKLQlzdGF0dXMgPSBzZW1fcG9zdCh0aGVsb2NrKTsKLQlDSEVDS19TVEFUVVMoInNlbV9wb3N0Iik7CisgICAgc3RhdHVzID0gc2VtX3Bvc3QodGhlbG9jayk7CisgICAgQ0hFQ0tfU1RBVFVTKCJzZW1fcG9zdCIpOwogfQogCiAjZWxzZSAvKiBVU0VfU0VNQVBIT1JFUyAqLwpAQCAtMzQwLDEwOSArMzQwLDEwOSBAQAogLyoKICAqIExvY2sgc3VwcG9ydC4KICAqLwotUHlUaHJlYWRfdHlwZV9sb2NrIAorUHlUaHJlYWRfdHlwZV9sb2NrCiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7Ci0JcHRocmVhZF9sb2NrICpsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBwdGhyZWFkX2xvY2sgKmxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0JbG9jayA9IChwdGhyZWFkX2xvY2sgKikgbWFsbG9jKHNpemVvZihwdGhyZWFkX2xvY2spKTsKLQlpZiAobG9jaykgewotCQltZW1zZXQoKHZvaWQgKilsb2NrLCAnXDAnLCBzaXplb2YocHRocmVhZF9sb2NrKSk7Ci0JCWxvY2stPmxvY2tlZCA9IDA7CisgICAgbG9jayA9IChwdGhyZWFkX2xvY2sgKikgbWFsbG9jKHNpemVvZihwdGhyZWFkX2xvY2spKTsKKyAgICBpZiAobG9jaykgeworICAgICAgICBtZW1zZXQoKHZvaWQgKilsb2NrLCAnXDAnLCBzaXplb2YocHRocmVhZF9sb2NrKSk7CisgICAgICAgIGxvY2stPmxvY2tlZCA9IDA7CiAKLQkJc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZsb2NrLT5tdXQsCi0JCQkJCSAgICBwdGhyZWFkX211dGV4YXR0cl9kZWZhdWx0KTsKLQkJQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X2luaXQiKTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZsb2NrLT5tdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4YXR0cl9kZWZhdWx0KTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X2luaXQiKTsKIAotCQlzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmbG9jay0+bG9ja19yZWxlYXNlZCwKLQkJCQkJICAgcHRocmVhZF9jb25kYXR0cl9kZWZhdWx0KTsKLQkJQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX2NvbmRfaW5pdCIpOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmbG9jay0+bG9ja19yZWxlYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kYXR0cl9kZWZhdWx0KTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX2NvbmRfaW5pdCIpOwogCi0JCWlmIChlcnJvcikgewotCQkJZnJlZSgodm9pZCAqKWxvY2spOwotCQkJbG9jayA9IDA7Ci0JCX0KLQl9CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgZnJlZSgodm9pZCAqKWxvY2spOworICAgICAgICAgICAgbG9jayA9IDA7CisgICAgICAgIH0KKyAgICB9CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7Ci0JcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGxvY2s7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCXB0aHJlYWRfbG9jayAqdGhlbG9jayA9IChwdGhyZWFkX2xvY2sgKilsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBwdGhyZWFkX2xvY2sgKnRoZWxvY2sgPSAocHRocmVhZF9sb2NrICopbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKIAotCXN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSggJnRoZWxvY2stPm11dCApOwotCUNIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF9kZXN0cm95Iik7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCAmdGhlbG9jay0+bXV0ICk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiKTsKIAotCXN0YXR1cyA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCAmdGhlbG9jay0+bG9ja19yZWxlYXNlZCApOwotCUNIRUNLX1NUQVRVUygicHRocmVhZF9jb25kX2Rlc3Ryb3kiKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSggJnRoZWxvY2stPmxvY2tfcmVsZWFzZWQgKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aHJlYWRfY29uZF9kZXN0cm95Iik7CiAKLQlmcmVlKCh2b2lkICopdGhlbG9jayk7CisgICAgZnJlZSgodm9pZCAqKXRoZWxvY2spOwogfQogCi1pbnQgCitpbnQKIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCBzdWNjZXNzOwotCXB0aHJlYWRfbG9jayAqdGhlbG9jayA9IChwdGhyZWFkX2xvY2sgKilsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBpbnQgc3VjY2VzczsKKyAgICBwdGhyZWFkX2xvY2sgKnRoZWxvY2sgPSAocHRocmVhZF9sb2NrICopbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CiAKLQlzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aGVsb2NrLT5tdXQgKTsKLQlDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfbG9ja1sxXSIpOwotCXN1Y2Nlc3MgPSB0aGVsb2NrLT5sb2NrZWQgPT0gMDsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aGVsb2NrLT5tdXQgKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfbG9ja1sxXSIpOworICAgIHN1Y2Nlc3MgPSB0aGVsb2NrLT5sb2NrZWQgPT0gMDsKIAotCWlmICggIXN1Y2Nlc3MgJiYgd2FpdGZsYWcgKSB7Ci0JCS8qIGNvbnRpbnVlIHRyeWluZyB1bnRpbCB3ZSBnZXQgdGhlIGxvY2sgKi8KKyAgICBpZiAoICFzdWNjZXNzICYmIHdhaXRmbGFnICkgeworICAgICAgICAvKiBjb250aW51ZSB0cnlpbmcgdW50aWwgd2UgZ2V0IHRoZSBsb2NrICovCiAKLQkJLyogbXV0IG11c3QgYmUgbG9ja2VkIGJ5IG1lIC0tIHBhcnQgb2YgdGhlIGNvbmRpdGlvbgotCQkgKiBwcm90b2NvbCAqLwotCQl3aGlsZSAoIHRoZWxvY2stPmxvY2tlZCApIHsKLQkJCXN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZ0aGVsb2NrLT5sb2NrX3JlbGVhc2VkLAotCQkJCQkJICAgJnRoZWxvY2stPm11dCk7Ci0JCQlDSEVDS19TVEFUVVMoInB0aHJlYWRfY29uZF93YWl0Iik7Ci0JCX0KLQkJc3VjY2VzcyA9IDE7Ci0JfQotCWlmIChzdWNjZXNzKSB0aGVsb2NrLT5sb2NrZWQgPSAxOwotCXN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGhlbG9jay0+bXV0ICk7Ci0JQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X3VubG9ja1sxXSIpOworICAgICAgICAvKiBtdXQgbXVzdCBiZSBsb2NrZWQgYnkgbWUgLS0gcGFydCBvZiB0aGUgY29uZGl0aW9uCisgICAgICAgICAqIHByb3RvY29sICovCisgICAgICAgIHdoaWxlICggdGhlbG9jay0+bG9ja2VkICkgeworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoJnRoZWxvY2stPmxvY2tfcmVsZWFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlbG9jay0+bXV0KTsKKyAgICAgICAgICAgIENIRUNLX1NUQVRVUygicHRocmVhZF9jb25kX3dhaXQiKTsKKyAgICAgICAgfQorICAgICAgICBzdWNjZXNzID0gMTsKKyAgICB9CisgICAgaWYgKHN1Y2Nlc3MpIHRoZWxvY2stPmxvY2tlZCA9IDE7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZ0aGVsb2NrLT5tdXQgKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfdW5sb2NrWzFdIik7CiAKLQlpZiAoZXJyb3IpIHN1Y2Nlc3MgPSAwOwotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBpZiAoZXJyb3IpIHN1Y2Nlc3MgPSAwOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlwdGhyZWFkX2xvY2sgKnRoZWxvY2sgPSAocHRocmVhZF9sb2NrICopbG9jazsKLQlpbnQgc3RhdHVzLCBlcnJvciA9IDA7CisgICAgcHRocmVhZF9sb2NrICp0aGVsb2NrID0gKHB0aHJlYWRfbG9jayAqKWxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKLQlzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aGVsb2NrLT5tdXQgKTsKLQlDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfbG9ja1szXSIpOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jayggJnRoZWxvY2stPm11dCApOworICAgIENIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF9sb2NrWzNdIik7CiAKLQl0aGVsb2NrLT5sb2NrZWQgPSAwOworICAgIHRoZWxvY2stPmxvY2tlZCA9IDA7CiAKLQlzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoZWxvY2stPm11dCApOwotCUNIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF91bmxvY2tbM10iKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoZWxvY2stPm11dCApOworICAgIENIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF91bmxvY2tbM10iKTsKIAotCS8qIHdha2UgdXAgc29tZW9uZSAoYW55b25lLCBpZiBhbnkpIHdhaXRpbmcgb24gdGhlIGxvY2sgKi8KLQlzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCAmdGhlbG9jay0+bG9ja19yZWxlYXNlZCApOwotCUNIRUNLX1NUQVRVUygicHRocmVhZF9jb25kX3NpZ25hbCIpOworICAgIC8qIHdha2UgdXAgc29tZW9uZSAoYW55b25lLCBpZiBhbnkpIHdhaXRpbmcgb24gdGhlIGxvY2sgKi8KKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCAmdGhlbG9jay0+bG9ja19yZWxlYXNlZCApOworICAgIENIRUNLX1NUQVRVUygicHRocmVhZF9jb25kX3NpZ25hbCIpOwogfQogCiAjZW5kaWYgLyogVVNFX1NFTUFQSE9SRVMgKi8KQEAgLTQ1NSwzOSArNDU1LDM5IEBACiBfcHl0aHJlYWRfcHRocmVhZF9zZXRfc3RhY2tzaXplKHNpemVfdCBzaXplKQogewogI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpCi0JcHRocmVhZF9hdHRyX3QgYXR0cnM7Ci0Jc2l6ZV90IHRzc19taW47Ci0JaW50IHJjID0gMDsKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyczsKKyAgICBzaXplX3QgdHNzX21pbjsKKyAgICBpbnQgcmMgPSAwOwogI2VuZGlmCiAKLQkvKiBzZXQgdG8gZGVmYXVsdCAqLwotCWlmIChzaXplID09IDApIHsKLQkJX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IDA7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBzZXQgdG8gZGVmYXVsdCAqLworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAogI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpCiAjaWYgZGVmaW5lZChQVEhSRUFEX1NUQUNLX01JTikKLQl0c3NfbWluID0gUFRIUkVBRF9TVEFDS19NSU4gPiBUSFJFQURfU1RBQ0tfTUlOID8gUFRIUkVBRF9TVEFDS19NSU4KLQkJCQkJCSAgICAgICA6IFRIUkVBRF9TVEFDS19NSU47CisgICAgdHNzX21pbiA9IFBUSFJFQURfU1RBQ0tfTUlOID4gVEhSRUFEX1NUQUNLX01JTiA/IFBUSFJFQURfU1RBQ0tfTUlOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRIUkVBRF9TVEFDS19NSU47CiAjZWxzZQotCXRzc19taW4gPSBUSFJFQURfU1RBQ0tfTUlOOworICAgIHRzc19taW4gPSBUSFJFQURfU1RBQ0tfTUlOOwogI2VuZGlmCi0JaWYgKHNpemUgPj0gdHNzX21pbikgewotCQkvKiB2YWxpZGF0ZSBzdGFjayBzaXplIGJ5IHNldHRpbmcgdGhyZWFkIGF0dHJpYnV0ZSAqLwotCQlpZiAocHRocmVhZF9hdHRyX2luaXQoJmF0dHJzKSA9PSAwKSB7Ci0JCQlyYyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHJzLCBzaXplKTsKLQkJCXB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRycyk7Ci0JCQlpZiAocmMgPT0gMCkgewotCQkJCV9weXRocmVhZF9zdGFja3NpemUgPSBzaXplOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAtMTsKKyAgICBpZiAoc2l6ZSA+PSB0c3NfbWluKSB7CisgICAgICAgIC8qIHZhbGlkYXRlIHN0YWNrIHNpemUgYnkgc2V0dGluZyB0aHJlYWQgYXR0cmlidXRlICovCisgICAgICAgIGlmIChwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cnMpID09IDApIHsKKyAgICAgICAgICAgIHJjID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0cnMsIHNpemUpOworICAgICAgICAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHJzKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOwogI2Vsc2UKLQlyZXR1cm4gLTI7CisgICAgcmV0dXJuIC0yOwogI2VuZGlmCiB9CiAKLSNkZWZpbmUgVEhSRUFEX1NFVF9TVEFDS1NJWkUoeCkJX3B5dGhyZWFkX3B0aHJlYWRfc2V0X3N0YWNrc2l6ZSh4KQorI2RlZmluZSBUSFJFQURfU0VUX1NUQUNLU0laRSh4KSBfcHl0aHJlYWRfcHRocmVhZF9zZXRfc3RhY2tzaXplKHgpCmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX3NnaS5oIGIvUHl0aG9uL3RocmVhZF9zZ2kuaAppbmRleCA0ZjRiMjEwLi43NzFhYjJjIDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX3NnaS5oCisrKyBiL1B5dGhvbi90aHJlYWRfc2dpLmgKQEAgLTgsNjcgKzgsNjcgQEAKICNpbmNsdWRlIDx1bG9ja3MuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogCi0jZGVmaW5lIEhEUl9TSVpFCTI2ODAJLyogc2l6ZW9mKHVzaGRyX3QpICovCi0jZGVmaW5lIE1BWFBST0MJCTEwMAkvKiBtYXggIyBvZiB0aHJlYWRzIHRoYXQgY2FuIGJlIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgSERSX1NJWkUgICAgICAgIDI2ODAgICAgLyogc2l6ZW9mKHVzaGRyX3QpICovCisjZGVmaW5lIE1BWFBST0MgICAgICAgICAxMDAgICAgIC8qIG1heCAjIG9mIHRocmVhZHMgdGhhdCBjYW4gYmUgc3RhcnRlZCAqLwogCiBzdGF0aWMgdXNwdHJfdCAqc2hhcmVkX2FyZW5hOwotc3RhdGljIHVsb2NrX3QgY291bnRfbG9jazsJLyogcHJvdGVjdGlvbiBmb3Igc29tZSB2YXJpYWJsZXMgKi8KLXN0YXRpYyB1bG9ja190IHdhaXRfbG9jazsJLyogbG9jayB1c2VkIHRvIHdhaXQgZm9yIG90aGVyIHRocmVhZHMgKi8KLXN0YXRpYyBpbnQgd2FpdGluZ19mb3JfdGhyZWFkczsJLyogcHJvdGVjdGVkIGJ5IGNvdW50X2xvY2sgKi8KLXN0YXRpYyBpbnQgbnRocmVhZHM7CQkvKiBwcm90ZWN0ZWQgYnkgY291bnRfbG9jayAqLworc3RhdGljIHVsb2NrX3QgY291bnRfbG9jazsgICAgICAvKiBwcm90ZWN0aW9uIGZvciBzb21lIHZhcmlhYmxlcyAqLworc3RhdGljIHVsb2NrX3Qgd2FpdF9sb2NrOyAgICAgICAvKiBsb2NrIHVzZWQgdG8gd2FpdCBmb3Igb3RoZXIgdGhyZWFkcyAqLworc3RhdGljIGludCB3YWl0aW5nX2Zvcl90aHJlYWRzOyAvKiBwcm90ZWN0ZWQgYnkgY291bnRfbG9jayAqLworc3RhdGljIGludCBudGhyZWFkczsgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgYnkgY291bnRfbG9jayAqLwogc3RhdGljIGludCBleGl0X3N0YXR1czsKLXN0YXRpYyBpbnQgZXhpdGluZzsJCS8qIHdlJ3JlIGFscmVhZHkgZXhpdGluZyAoZm9yIG1heWJlX2V4aXQpICovCi1zdGF0aWMgcGlkX3QgbXlfcGlkOwkJLyogUElEIG9mIG1haW4gdGhyZWFkICovCitzdGF0aWMgaW50IGV4aXRpbmc7ICAgICAgICAgICAgIC8qIHdlJ3JlIGFscmVhZHkgZXhpdGluZyAoZm9yIG1heWJlX2V4aXQpICovCitzdGF0aWMgcGlkX3QgbXlfcGlkOyAgICAgICAgICAgIC8qIFBJRCBvZiBtYWluIHRocmVhZCAqLwogc3RhdGljIHN0cnVjdCBwaWRsaXN0IHsKLQlwaWRfdCBwYXJlbnQ7Ci0JcGlkX3QgY2hpbGQ7Ci19IHBpZGxpc3RbTUFYUFJPQ107CS8qIFBJRHMgb2Ygb3RoZXIgdGhyZWFkczsgcHJvdGVjdGVkIGJ5IGNvdW50X2xvY2sgKi8KLXN0YXRpYyBpbnQgbWF4cGlkaW5kZXg7CQkvKiAjIG9mIFBJRHMgaW4gcGlkbGlzdCAqLworICAgIHBpZF90IHBhcmVudDsKKyAgICBwaWRfdCBjaGlsZDsKK30gcGlkbGlzdFtNQVhQUk9DXTsgICAgIC8qIFBJRHMgb2Ygb3RoZXIgdGhyZWFkczsgcHJvdGVjdGVkIGJ5IGNvdW50X2xvY2sgKi8KK3N0YXRpYyBpbnQgbWF4cGlkaW5kZXg7ICAgICAgICAgLyogIyBvZiBQSURzIGluIHBpZGxpc3QgKi8KIC8qCiAgKiBJbml0aWFsaXphdGlvbi4KICAqLwogc3RhdGljIHZvaWQgUHlUaHJlYWRfX2luaXRfdGhyZWFkKHZvaWQpCiB7CiAjaWZkZWYgVVNFX0RMCi0JbG9uZyBhZGRyLCBzaXplOworICAgIGxvbmcgYWRkciwgc2l6ZTsKICNlbmRpZiAvKiBVU0VfREwgKi8KIAogCiAjaWZkZWYgVVNFX0RMCi0JaWYgKChzaXplID0gdXNjb25maWcoQ09ORl9JTklUU0laRSwgNjQqMTAyNCkpIDwgMCkKLQkJcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFNJWkUgKGNoZWNrKSIpOwotCWlmICh1c2NvbmZpZyhDT05GX0lOSVRTSVpFLCBzaXplKSA8IDApCi0JCXBlcnJvcigidXNjb25maWcgLSBDT05GX0lOSVRTSVpFIChyZXNldCkiKTsKLQlhZGRyID0gKGxvbmcpIGRsX2dldHJhbmdlKHNpemUgKyBIRFJfU0laRSk7Ci0JZHByaW50ZigoInRyeWluZyB0byB1c2UgYWRkciAlcC0lcCBmb3Igc2hhcmVkIGFyZW5hXG4iLCBhZGRyLCBhZGRyK3NpemUpKTsKLQllcnJubyA9IDA7Ci0JaWYgKChhZGRyID0gdXNjb25maWcoQ09ORl9BVFRBQ0hBRERSLCBhZGRyKSkgPCAwICYmIGVycm5vICE9IDApCi0JCXBlcnJvcigidXNjb25maWcgLSBDT05GX0FUVEFDSEFERFIgKHNldCkiKTsKKyAgICBpZiAoKHNpemUgPSB1c2NvbmZpZyhDT05GX0lOSVRTSVpFLCA2NCoxMDI0KSkgPCAwKQorICAgICAgICBwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9JTklUU0laRSAoY2hlY2spIik7CisgICAgaWYgKHVzY29uZmlnKENPTkZfSU5JVFNJWkUsIHNpemUpIDwgMCkKKyAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFNJWkUgKHJlc2V0KSIpOworICAgIGFkZHIgPSAobG9uZykgZGxfZ2V0cmFuZ2Uoc2l6ZSArIEhEUl9TSVpFKTsKKyAgICBkcHJpbnRmKCgidHJ5aW5nIHRvIHVzZSBhZGRyICVwLSVwIGZvciBzaGFyZWQgYXJlbmFcbiIsIGFkZHIsIGFkZHIrc2l6ZSkpOworICAgIGVycm5vID0gMDsKKyAgICBpZiAoKGFkZHIgPSB1c2NvbmZpZyhDT05GX0FUVEFDSEFERFIsIGFkZHIpKSA8IDAgJiYgZXJybm8gIT0gMCkKKyAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfQVRUQUNIQUREUiAoc2V0KSIpOwogI2VuZGlmIC8qIFVTRV9ETCAqLwotCWlmICh1c2NvbmZpZyhDT05GX0lOSVRVU0VSUywgMTYpIDwgMCkKLQkJcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFVTRVJTIik7Ci0JbXlfcGlkID0gZ2V0cGlkKCk7CS8qIHNvIHRoYXQgd2Uga25vdyB3aGljaCBpcyB0aGUgbWFpbiB0aHJlYWQgKi8KLQlpZiAodXNjb25maWcoQ09ORl9BUkVOQVRZUEUsIFVTX1NIQVJFRE9OTFkpIDwgMCkKLQkJcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfQVJFTkFUWVBFIik7Ci0JdXNjb25maWcoQ09ORl9MT0NLVFlQRSwgVVNfREVCVUcpOyAvKiBYWFggKi8KKyAgICBpZiAodXNjb25maWcoQ09ORl9JTklUVVNFUlMsIDE2KSA8IDApCisgICAgICAgIHBlcnJvcigidXNjb25maWcgLSBDT05GX0lOSVRVU0VSUyIpOworICAgIG15X3BpZCA9IGdldHBpZCgpOyAgICAgICAgICAvKiBzbyB0aGF0IHdlIGtub3cgd2hpY2ggaXMgdGhlIG1haW4gdGhyZWFkICovCisgICAgaWYgKHVzY29uZmlnKENPTkZfQVJFTkFUWVBFLCBVU19TSEFSRURPTkxZKSA8IDApCisgICAgICAgIHBlcnJvcigidXNjb25maWcgLSBDT05GX0FSRU5BVFlQRSIpOworICAgIHVzY29uZmlnKENPTkZfTE9DS1RZUEUsIFVTX0RFQlVHKTsgLyogWFhYICovCiAjaWZkZWYgUHlfREVCVUcKLQlpZiAodGhyZWFkX2RlYnVnICYgNCkKLQkJdXNjb25maWcoQ09ORl9MT0NLVFlQRSwgVVNfREVCVUdQTFVTKTsKLQllbHNlIGlmICh0aHJlYWRfZGVidWcgJiAyKQotCQl1c2NvbmZpZyhDT05GX0xPQ0tUWVBFLCBVU19ERUJVRyk7CisgICAgaWYgKHRocmVhZF9kZWJ1ZyAmIDQpCisgICAgICAgIHVzY29uZmlnKENPTkZfTE9DS1RZUEUsIFVTX0RFQlVHUExVUyk7CisgICAgZWxzZSBpZiAodGhyZWFkX2RlYnVnICYgMikKKyAgICAgICAgdXNjb25maWcoQ09ORl9MT0NLVFlQRSwgVVNfREVCVUcpOwogI2VuZGlmIC8qIFB5X0RFQlVHICovCi0JaWYgKChzaGFyZWRfYXJlbmEgPSB1c2luaXQodG1wbmFtKDApKSkgPT0gMCkKLQkJcGVycm9yKCJ1c2luaXQiKTsKKyAgICBpZiAoKHNoYXJlZF9hcmVuYSA9IHVzaW5pdCh0bXBuYW0oMCkpKSA9PSAwKQorICAgICAgICBwZXJyb3IoInVzaW5pdCIpOwogI2lmZGVmIFVTRV9ETAotCWlmICh1c2NvbmZpZyhDT05GX0FUVEFDSEFERFIsIGFkZHIpIDwgMCkgLyogcmVzZXQgYWRkcmVzcyAqLwotCQlwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9BVFRBQ0hBRERSIChyZXNldCkiKTsKKyAgICBpZiAodXNjb25maWcoQ09ORl9BVFRBQ0hBRERSLCBhZGRyKSA8IDApIC8qIHJlc2V0IGFkZHJlc3MgKi8KKyAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfQVRUQUNIQUREUiAocmVzZXQpIik7CiAjZW5kaWYgLyogVVNFX0RMICovCi0JaWYgKChjb3VudF9sb2NrID0gdXNuZXdsb2NrKHNoYXJlZF9hcmVuYSkpID09IE5VTEwpCi0JCXBlcnJvcigidXNuZXdsb2NrIChjb3VudF9sb2NrKSIpOwotCSh2b2lkKSB1c2luaXRsb2NrKGNvdW50X2xvY2spOwotCWlmICgod2FpdF9sb2NrID0gdXNuZXdsb2NrKHNoYXJlZF9hcmVuYSkpID09IE5VTEwpCi0JCXBlcnJvcigidXNuZXdsb2NrICh3YWl0X2xvY2spIik7Ci0JZHByaW50ZigoImFyZW5hIHN0YXJ0OiAlcCwgYXJlbmEgc2l6ZTogJWxkXG4iLCAgc2hhcmVkX2FyZW5hLCAobG9uZykgdXNjb25maWcoQ09ORl9HRVRTSVpFLCBzaGFyZWRfYXJlbmEpKSk7CisgICAgaWYgKChjb3VudF9sb2NrID0gdXNuZXdsb2NrKHNoYXJlZF9hcmVuYSkpID09IE5VTEwpCisgICAgICAgIHBlcnJvcigidXNuZXdsb2NrIChjb3VudF9sb2NrKSIpOworICAgICh2b2lkKSB1c2luaXRsb2NrKGNvdW50X2xvY2spOworICAgIGlmICgod2FpdF9sb2NrID0gdXNuZXdsb2NrKHNoYXJlZF9hcmVuYSkpID09IE5VTEwpCisgICAgICAgIHBlcnJvcigidXNuZXdsb2NrICh3YWl0X2xvY2spIik7CisgICAgZHByaW50ZigoImFyZW5hIHN0YXJ0OiAlcCwgYXJlbmEgc2l6ZTogJWxkXG4iLCAgc2hhcmVkX2FyZW5hLCAobG9uZykgdXNjb25maWcoQ09ORl9HRVRTSVpFLCBzaGFyZWRfYXJlbmEpKSk7CiB9CiAKIC8qCkBAIC03NywxMzggKzc3LDEzOCBAQAogCiBzdGF0aWMgdm9pZCBjbGVhbl90aHJlYWRzKHZvaWQpCiB7Ci0JaW50IGksIGo7Ci0JcGlkX3QgbXlwaWQsIHBpZDsKKyAgICBpbnQgaSwgajsKKyAgICBwaWRfdCBteXBpZCwgcGlkOwogCi0JLyogY2xlYW4gdXAgYW55IGV4aXRlZCB0aHJlYWRzICovCi0JbXlwaWQgPSBnZXRwaWQoKTsKLQlpID0gMDsKLQl3aGlsZSAoaSA8IG1heHBpZGluZGV4KSB7Ci0JCWlmIChwaWRsaXN0W2ldLnBhcmVudCA9PSBteXBpZCAmJiAocGlkID0gcGlkbGlzdFtpXS5jaGlsZCkgPiAwKSB7Ci0JCQlwaWQgPSB3YWl0cGlkKHBpZCwgMCwgV05PSEFORyk7Ci0JCQlpZiAocGlkID4gMCkgewotCQkJCS8qIGEgdGhyZWFkIGhhcyBleGl0ZWQgKi8KLQkJCQlwaWRsaXN0W2ldID0gcGlkbGlzdFstLW1heHBpZGluZGV4XTsKLQkJCQkvKiByZW1vdmUgcmVmZXJlbmNlcyB0byBjaGlsZHJlbiBvZiBkZWFkIHByb2MgKi8KLQkJCQlmb3IgKGogPSAwOyBqIDwgbWF4cGlkaW5kZXg7IGorKykKLQkJCQkJaWYgKHBpZGxpc3Rbal0ucGFyZW50ID09IHBpZCkKLQkJCQkJCXBpZGxpc3Rbal0uY2hpbGQgPSAtMTsKLQkJCQljb250aW51ZTsgLyogZG9uJ3QgaW5jcmVtZW50IGkgKi8KLQkJCX0KLQkJfQotCQlpKys7Ci0JfQotCS8qIGNsZWFuIHVwIHRoZSBsaXN0ICovCi0JaSA9IDA7Ci0Jd2hpbGUgKGkgPCBtYXhwaWRpbmRleCkgewotCQlpZiAocGlkbGlzdFtpXS5jaGlsZCA9PSAtMSkgewotCQkJcGlkbGlzdFtpXSA9IHBpZGxpc3RbLS1tYXhwaWRpbmRleF07Ci0JCQljb250aW51ZTsgLyogZG9uJ3QgaW5jcmVtZW50IGkgKi8KLQkJfQotCQlpKys7Ci0JfQorICAgIC8qIGNsZWFuIHVwIGFueSBleGl0ZWQgdGhyZWFkcyAqLworICAgIG15cGlkID0gZ2V0cGlkKCk7CisgICAgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBtYXhwaWRpbmRleCkgeworICAgICAgICBpZiAocGlkbGlzdFtpXS5wYXJlbnQgPT0gbXlwaWQgJiYgKHBpZCA9IHBpZGxpc3RbaV0uY2hpbGQpID4gMCkgeworICAgICAgICAgICAgcGlkID0gd2FpdHBpZChwaWQsIDAsIFdOT0hBTkcpOworICAgICAgICAgICAgaWYgKHBpZCA+IDApIHsKKyAgICAgICAgICAgICAgICAvKiBhIHRocmVhZCBoYXMgZXhpdGVkICovCisgICAgICAgICAgICAgICAgcGlkbGlzdFtpXSA9IHBpZGxpc3RbLS1tYXhwaWRpbmRleF07CisgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHJlZmVyZW5jZXMgdG8gY2hpbGRyZW4gb2YgZGVhZCBwcm9jICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1heHBpZGluZGV4OyBqKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChwaWRsaXN0W2pdLnBhcmVudCA9PSBwaWQpCisgICAgICAgICAgICAgICAgICAgICAgICBwaWRsaXN0W2pdLmNoaWxkID0gLTE7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8qIGRvbid0IGluY3JlbWVudCBpICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKyAgICAvKiBjbGVhbiB1cCB0aGUgbGlzdCAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChpIDwgbWF4cGlkaW5kZXgpIHsKKyAgICAgICAgaWYgKHBpZGxpc3RbaV0uY2hpbGQgPT0gLTEpIHsKKyAgICAgICAgICAgIHBpZGxpc3RbaV0gPSBwaWRsaXN0Wy0tbWF4cGlkaW5kZXhdOworICAgICAgICAgICAgY29udGludWU7IC8qIGRvbid0IGluY3JlbWVudCBpICovCisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KIH0KIAogbG9uZyBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7CiAjaWZkZWYgVVNFX0RMCi0JbG9uZyBhZGRyLCBzaXplOwotCXN0YXRpYyBpbnQgbG9jYWxfaW5pdGlhbGl6ZWQgPSAwOworICAgIGxvbmcgYWRkciwgc2l6ZTsKKyAgICBzdGF0aWMgaW50IGxvY2FsX2luaXRpYWxpemVkID0gMDsKICNlbmRpZiAvKiBVU0VfREwgKi8KLQlpbnQgc3VjY2VzcyA9IDA7CS8qIGluaXQgbm90IG5lZWRlZCB3aGVuIFNPTEFSSVNfVEhSRUFEUyBhbmQgKi8KLQkJCQkvKiBDX1RIUkVBRFMgaW1wbGVtZW50ZWQgcHJvcGVybHkgKi8KKyAgICBpbnQgc3VjY2VzcyA9IDA7ICAgICAgICAgICAgLyogaW5pdCBub3QgbmVlZGVkIHdoZW4gU09MQVJJU19USFJFQURTIGFuZCAqLworICAgICAgICAgICAgICAgIC8qIENfVEhSRUFEUyBpbXBsZW1lbnRlZCBwcm9wZXJseSAqLwogCi0JZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLQlzd2l0Y2ggKHVzc2V0bG9jayhjb3VudF9sb2NrKSkgewotCWNhc2UgMDogcmV0dXJuIDA7Ci0JY2FzZSAtMTogcGVycm9yKCJ1c3NldGxvY2sgKGNvdW50X2xvY2spIik7Ci0JfQotCWlmIChtYXhwaWRpbmRleCA+PSBNQVhQUk9DKQotCQlzdWNjZXNzID0gLTE7Ci0JZWxzZSB7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBzd2l0Y2ggKHVzc2V0bG9jayhjb3VudF9sb2NrKSkgeworICAgIGNhc2UgMDogcmV0dXJuIDA7CisgICAgY2FzZSAtMTogcGVycm9yKCJ1c3NldGxvY2sgKGNvdW50X2xvY2spIik7CisgICAgfQorICAgIGlmIChtYXhwaWRpbmRleCA+PSBNQVhQUk9DKQorICAgICAgICBzdWNjZXNzID0gLTE7CisgICAgZWxzZSB7CiAjaWZkZWYgVVNFX0RMCi0JCWlmICghbG9jYWxfaW5pdGlhbGl6ZWQpIHsKLQkJCWlmICgoc2l6ZSA9IHVzY29uZmlnKENPTkZfSU5JVFNJWkUsIDY0KjEwMjQpKSA8IDApCi0JCQkJcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFNJWkUgKGNoZWNrKSIpOwotCQkJaWYgKHVzY29uZmlnKENPTkZfSU5JVFNJWkUsIHNpemUpIDwgMCkKLQkJCQlwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9JTklUU0laRSAocmVzZXQpIik7Ci0JCQlhZGRyID0gKGxvbmcpIGRsX2dldHJhbmdlKHNpemUgKyBIRFJfU0laRSk7Ci0JCQlkcHJpbnRmKCgidHJ5aW5nIHRvIHVzZSBhZGRyICVwLSVwIGZvciBzcHJvY1xuIiwKLQkJCQkgYWRkciwgYWRkcitzaXplKSk7Ci0JCQllcnJubyA9IDA7Ci0JCQlpZiAoKGFkZHIgPSB1c2NvbmZpZyhDT05GX0FUVEFDSEFERFIsIGFkZHIpKSA8IDAgJiYKLQkJCSAgICBlcnJubyAhPSAwKQotCQkJCXBlcnJvcigidXNjb25maWcgLSBDT05GX0FUVEFDSEFERFIgKHNldCkiKTsKLQkJfQorICAgICAgICBpZiAoIWxvY2FsX2luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBpZiAoKHNpemUgPSB1c2NvbmZpZyhDT05GX0lOSVRTSVpFLCA2NCoxMDI0KSkgPCAwKQorICAgICAgICAgICAgICAgIHBlcnJvcigidXNjb25maWcgLSBDT05GX0lOSVRTSVpFIChjaGVjaykiKTsKKyAgICAgICAgICAgIGlmICh1c2NvbmZpZyhDT05GX0lOSVRTSVpFLCBzaXplKSA8IDApCisgICAgICAgICAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFNJWkUgKHJlc2V0KSIpOworICAgICAgICAgICAgYWRkciA9IChsb25nKSBkbF9nZXRyYW5nZShzaXplICsgSERSX1NJWkUpOworICAgICAgICAgICAgZHByaW50ZigoInRyeWluZyB0byB1c2UgYWRkciAlcC0lcCBmb3Igc3Byb2NcbiIsCisgICAgICAgICAgICAgICAgICAgICBhZGRyLCBhZGRyK3NpemUpKTsKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIGlmICgoYWRkciA9IHVzY29uZmlnKENPTkZfQVRUQUNIQUREUiwgYWRkcikpIDwgMCAmJgorICAgICAgICAgICAgICAgIGVycm5vICE9IDApCisgICAgICAgICAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfQVRUQUNIQUREUiAoc2V0KSIpOworICAgICAgICB9CiAjZW5kaWYgLyogVVNFX0RMICovCi0JCWNsZWFuX3RocmVhZHMoKTsKLQkJaWYgKChzdWNjZXNzID0gc3Byb2MoZnVuYywgUFJfU0FMTCwgYXJnKSkgPCAwKQotCQkJcGVycm9yKCJzcHJvYyIpOworICAgICAgICBjbGVhbl90aHJlYWRzKCk7CisgICAgICAgIGlmICgoc3VjY2VzcyA9IHNwcm9jKGZ1bmMsIFBSX1NBTEwsIGFyZykpIDwgMCkKKyAgICAgICAgICAgIHBlcnJvcigic3Byb2MiKTsKICNpZmRlZiBVU0VfREwKLQkJaWYgKCFsb2NhbF9pbml0aWFsaXplZCkgewotCQkJaWYgKHVzY29uZmlnKENPTkZfQVRUQUNIQUREUiwgYWRkcikgPCAwKQotCQkJCS8qIHJlc2V0IGFkZHJlc3MgKi8KLQkJCQlwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9BVFRBQ0hBRERSIChyZXNldCkiKTsKLQkJCWxvY2FsX2luaXRpYWxpemVkID0gMTsKLQkJfQorICAgICAgICBpZiAoIWxvY2FsX2luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBpZiAodXNjb25maWcoQ09ORl9BVFRBQ0hBRERSLCBhZGRyKSA8IDApCisgICAgICAgICAgICAgICAgLyogcmVzZXQgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgIHBlcnJvcigidXNjb25maWcgLSBDT05GX0FUVEFDSEFERFIgKHJlc2V0KSIpOworICAgICAgICAgICAgbG9jYWxfaW5pdGlhbGl6ZWQgPSAxOworICAgICAgICB9CiAjZW5kaWYgLyogVVNFX0RMICovCi0JCWlmIChzdWNjZXNzID49IDApIHsKLQkJCW50aHJlYWRzKys7Ci0JCQlwaWRsaXN0W21heHBpZGluZGV4XS5wYXJlbnQgPSBnZXRwaWQoKTsKLQkJCXBpZGxpc3RbbWF4cGlkaW5kZXgrK10uY2hpbGQgPSBzdWNjZXNzOwotCQkJZHByaW50ZigoInBpZGxpc3RbJWRdID0gJWRcbiIsCi0JCQkJIG1heHBpZGluZGV4LTEsIHN1Y2Nlc3MpKTsKLQkJfQotCX0KLQlpZiAodXN1bnNldGxvY2soY291bnRfbG9jaykgPCAwKQotCQlwZXJyb3IoInVzdW5zZXRsb2NrIChjb3VudF9sb2NrKSIpOwotCXJldHVybiBzdWNjZXNzOworICAgICAgICBpZiAoc3VjY2VzcyA+PSAwKSB7CisgICAgICAgICAgICBudGhyZWFkcysrOworICAgICAgICAgICAgcGlkbGlzdFttYXhwaWRpbmRleF0ucGFyZW50ID0gZ2V0cGlkKCk7CisgICAgICAgICAgICBwaWRsaXN0W21heHBpZGluZGV4KytdLmNoaWxkID0gc3VjY2VzczsKKyAgICAgICAgICAgIGRwcmludGYoKCJwaWRsaXN0WyVkXSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgbWF4cGlkaW5kZXgtMSwgc3VjY2VzcykpOworICAgICAgICB9CisgICAgfQorICAgIGlmICh1c3Vuc2V0bG9jayhjb3VudF9sb2NrKSA8IDApCisgICAgICAgIHBlcnJvcigidXN1bnNldGxvY2sgKGNvdW50X2xvY2spIik7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIGxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCXJldHVybiBnZXRwaWQoKTsKKyAgICByZXR1cm4gZ2V0cGlkKCk7CiB9CiAKIHZvaWQgUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJZXhpdCgwKTsKLQlpZiAodXNzZXRsb2NrKGNvdW50X2xvY2spIDwgMCkKLQkJcGVycm9yKCJ1c3NldGxvY2sgKGNvdW50X2xvY2spIik7Ci0JbnRocmVhZHMtLTsKLQlpZiAoZ2V0cGlkKCkgPT0gbXlfcGlkKSB7Ci0JCS8qIG1haW4gdGhyZWFkOyB3YWl0IGZvciBvdGhlciB0aHJlYWRzIHRvIGV4aXQgKi8KLQkJZXhpdGluZyA9IDE7Ci0JCXdhaXRpbmdfZm9yX3RocmVhZHMgPSAxOwotCQlpZiAodXNzZXRsb2NrKHdhaXRfbG9jaykgPCAwKQotCQkJcGVycm9yKCJ1c3NldGxvY2sgKHdhaXRfbG9jaykiKTsKLQkJZm9yICg7OykgewotCQkJaWYgKG50aHJlYWRzIDwgMCkgewotCQkJCWRwcmludGYoKCJyZWFsbHkgZXhpdCAoJWQpXG4iLCBleGl0X3N0YXR1cykpOwotCQkJCWV4aXQoZXhpdF9zdGF0dXMpOwotCQkJfQotCQkJaWYgKHVzdW5zZXRsb2NrKGNvdW50X2xvY2spIDwgMCkKLQkJCQlwZXJyb3IoInVzdW5zZXRsb2NrIChjb3VudF9sb2NrKSIpOwotCQkJZHByaW50ZigoIndhaXRpbmcgZm9yIG90aGVyIHRocmVhZHMgKCVkKVxuIiwgbnRocmVhZHMpKTsKLQkJCWlmICh1c3NldGxvY2sod2FpdF9sb2NrKSA8IDApCi0JCQkJcGVycm9yKCJ1c3NldGxvY2sgKHdhaXRfbG9jaykiKTsKLQkJCWlmICh1c3NldGxvY2soY291bnRfbG9jaykgPCAwKQotCQkJCXBlcnJvcigidXNzZXRsb2NrIChjb3VudF9sb2NrKSIpOwotCQl9Ci0JfQotCS8qIG5vdCB0aGUgbWFpbiB0aHJlYWQgKi8KLQlpZiAod2FpdGluZ19mb3JfdGhyZWFkcykgewotCQlkcHJpbnRmKCgibWFpbiB0aHJlYWQgaXMgd2FpdGluZ1xuIikpOwotCQlpZiAodXN1bnNldGxvY2sod2FpdF9sb2NrKSA8IDApCi0JCQlwZXJyb3IoInVzdW5zZXRsb2NrICh3YWl0X2xvY2spIik7Ci0JfQotCWlmICh1c3Vuc2V0bG9jayhjb3VudF9sb2NrKSA8IDApCi0JCXBlcnJvcigidXN1bnNldGxvY2sgKGNvdW50X2xvY2spIik7Ci0JX2V4aXQoMCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGV4aXQoMCk7CisgICAgaWYgKHVzc2V0bG9jayhjb3VudF9sb2NrKSA8IDApCisgICAgICAgIHBlcnJvcigidXNzZXRsb2NrIChjb3VudF9sb2NrKSIpOworICAgIG50aHJlYWRzLS07CisgICAgaWYgKGdldHBpZCgpID09IG15X3BpZCkgeworICAgICAgICAvKiBtYWluIHRocmVhZDsgd2FpdCBmb3Igb3RoZXIgdGhyZWFkcyB0byBleGl0ICovCisgICAgICAgIGV4aXRpbmcgPSAxOworICAgICAgICB3YWl0aW5nX2Zvcl90aHJlYWRzID0gMTsKKyAgICAgICAgaWYgKHVzc2V0bG9jayh3YWl0X2xvY2spIDwgMCkKKyAgICAgICAgICAgIHBlcnJvcigidXNzZXRsb2NrICh3YWl0X2xvY2spIik7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGlmIChudGhyZWFkcyA8IDApIHsKKyAgICAgICAgICAgICAgICBkcHJpbnRmKCgicmVhbGx5IGV4aXQgKCVkKVxuIiwgZXhpdF9zdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBleGl0KGV4aXRfc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1c3Vuc2V0bG9jayhjb3VudF9sb2NrKSA8IDApCisgICAgICAgICAgICAgICAgcGVycm9yKCJ1c3Vuc2V0bG9jayAoY291bnRfbG9jaykiKTsKKyAgICAgICAgICAgIGRwcmludGYoKCJ3YWl0aW5nIGZvciBvdGhlciB0aHJlYWRzICglZClcbiIsIG50aHJlYWRzKSk7CisgICAgICAgICAgICBpZiAodXNzZXRsb2NrKHdhaXRfbG9jaykgPCAwKQorICAgICAgICAgICAgICAgIHBlcnJvcigidXNzZXRsb2NrICh3YWl0X2xvY2spIik7CisgICAgICAgICAgICBpZiAodXNzZXRsb2NrKGNvdW50X2xvY2spIDwgMCkKKyAgICAgICAgICAgICAgICBwZXJyb3IoInVzc2V0bG9jayAoY291bnRfbG9jaykiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBub3QgdGhlIG1haW4gdGhyZWFkICovCisgICAgaWYgKHdhaXRpbmdfZm9yX3RocmVhZHMpIHsKKyAgICAgICAgZHByaW50ZigoIm1haW4gdGhyZWFkIGlzIHdhaXRpbmdcbiIpKTsKKyAgICAgICAgaWYgKHVzdW5zZXRsb2NrKHdhaXRfbG9jaykgPCAwKQorICAgICAgICAgICAgcGVycm9yKCJ1c3Vuc2V0bG9jayAod2FpdF9sb2NrKSIpOworICAgIH0KKyAgICBpZiAodXN1bnNldGxvY2soY291bnRfbG9jaykgPCAwKQorICAgICAgICBwZXJyb3IoInVzdW5zZXRsb2NrIChjb3VudF9sb2NrKSIpOworICAgIF9leGl0KDApOwogfQogCiAvKgpAQCAtMjE2LDQ0ICsyMTYsNDQgQEAKICAqLwogUHlUaHJlYWRfdHlwZV9sb2NrIFB5VGhyZWFkX2FsbG9jYXRlX2xvY2sodm9pZCkKIHsKLQl1bG9ja190IGxvY2s7CisgICAgdWxvY2tfdCBsb2NrOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0JaWYgKChsb2NrID0gdXNuZXdsb2NrKHNoYXJlZF9hcmVuYSkpID09IE5VTEwpCi0JCXBlcnJvcigidXNuZXdsb2NrIik7Ci0JKHZvaWQpIHVzaW5pdGxvY2sobG9jayk7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOworICAgIGlmICgobG9jayA9IHVzbmV3bG9jayhzaGFyZWRfYXJlbmEpKSA9PSBOVUxMKQorICAgICAgICBwZXJyb3IoInVzbmV3bG9jayIpOworICAgICh2b2lkKSB1c2luaXRsb2NrKGxvY2spOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKIH0KIAogdm9pZCBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JdXNmcmVlbG9jaygodWxvY2tfdCkgbG9jaywgc2hhcmVkX2FyZW5hKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICB1c2ZyZWVsb2NrKCh1bG9ja190KSBsb2NrLCBzaGFyZWRfYXJlbmEpOwogfQogCiBpbnQgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrLCBpbnQgd2FpdGZsYWcpCiB7Ci0JaW50IHN1Y2Nlc3M7CisgICAgaW50IHN1Y2Nlc3M7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOwotCWVycm5vID0gMDsJCS8qIGNsZWFyIGl0IGp1c3QgaW4gY2FzZSAqLwotCWlmICh3YWl0ZmxhZykKLQkJc3VjY2VzcyA9IHVzc2V0bG9jaygodWxvY2tfdCkgbG9jayk7Ci0JZWxzZQotCQlzdWNjZXNzID0gdXNjc2V0bG9jaygodWxvY2tfdCkgbG9jaywgMSk7IC8qIFRyeSBpdCBvbmNlICovCi0JaWYgKHN1Y2Nlc3MgPCAwKQotCQlwZXJyb3Iod2FpdGZsYWcgPyAidXNzZXRsb2NrIiA6ICJ1c2NzZXRsb2NrIik7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwotCXJldHVybiBzdWNjZXNzOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGl0IGp1c3QgaW4gY2FzZSAqLworICAgIGlmICh3YWl0ZmxhZykKKyAgICAgICAgc3VjY2VzcyA9IHVzc2V0bG9jaygodWxvY2tfdCkgbG9jayk7CisgICAgZWxzZQorICAgICAgICBzdWNjZXNzID0gdXNjc2V0bG9jaygodWxvY2tfdCkgbG9jaywgMSk7IC8qIFRyeSBpdCBvbmNlICovCisgICAgaWYgKHN1Y2Nlc3MgPCAwKQorICAgICAgICBwZXJyb3Iod2FpdGZsYWcgPyAidXNzZXRsb2NrIiA6ICJ1c2NzZXRsb2NrIik7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiB2b2lkIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKLQlpZiAodXN1bnNldGxvY2soKHVsb2NrX3QpIGxvY2spIDwgMCkKLQkJcGVycm9yKCJ1c3Vuc2V0bG9jayIpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIGlmICh1c3Vuc2V0bG9jaygodWxvY2tfdCkgbG9jaykgPCAwKQorICAgICAgICBwZXJyb3IoInVzdW5zZXRsb2NrIik7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX3NvbGFyaXMuaCBiL1B5dGhvbi90aHJlYWRfc29sYXJpcy5oCmluZGV4IDU5Y2EwMDIuLjFjZTFjZmMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfc29sYXJpcy5oCisrKyBiL1B5dGhvbi90aHJlYWRfc29sYXJpcy5oCkBAIC0xNywxMTQgKzE3LDExNCBAQAogICogVGhyZWFkIHN1cHBvcnQuCiAgKi8KIHN0cnVjdCBmdW5jX2FyZyB7Ci0Jdm9pZCAoKmZ1bmMpKHZvaWQgKik7Ci0Jdm9pZCAqYXJnOworICAgIHZvaWQgKCpmdW5jKSh2b2lkICopOworICAgIHZvaWQgKmFyZzsKIH07CiAKIHN0YXRpYyB2b2lkICoKIG5ld19mdW5jKHZvaWQgKmZ1bmNhcmcpCiB7Ci0Jdm9pZCAoKmZ1bmMpKHZvaWQgKik7Ci0Jdm9pZCAqYXJnOworICAgIHZvaWQgKCpmdW5jKSh2b2lkICopOworICAgIHZvaWQgKmFyZzsKIAotCWZ1bmMgPSAoKHN0cnVjdCBmdW5jX2FyZyAqKSBmdW5jYXJnKS0+ZnVuYzsKLQlhcmcgPSAoKHN0cnVjdCBmdW5jX2FyZyAqKSBmdW5jYXJnKS0+YXJnOwotCWZyZWUoZnVuY2FyZyk7Ci0JKCpmdW5jKShhcmcpOwotCXJldHVybiAwOworICAgIGZ1bmMgPSAoKHN0cnVjdCBmdW5jX2FyZyAqKSBmdW5jYXJnKS0+ZnVuYzsKKyAgICBhcmcgPSAoKHN0cnVjdCBmdW5jX2FyZyAqKSBmdW5jYXJnKS0+YXJnOworICAgIGZyZWUoZnVuY2FyZyk7CisgICAgKCpmdW5jKShhcmcpOworICAgIHJldHVybiAwOwogfQogCiAKIGxvbmcKIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQl0aHJlYWRfdCB0aWQ7Ci0Jc3RydWN0IGZ1bmNfYXJnICpmdW5jYXJnOworICAgIHRocmVhZF90IHRpZDsKKyAgICBzdHJ1Y3QgZnVuY19hcmcgKmZ1bmNhcmc7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCWZ1bmNhcmcgPSAoc3RydWN0IGZ1bmNfYXJnICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGZ1bmNfYXJnKSk7Ci0JZnVuY2FyZy0+ZnVuYyA9IGZ1bmM7Ci0JZnVuY2FyZy0+YXJnID0gYXJnOwotCWlmICh0aHJfY3JlYXRlKDAsIDAsIG5ld19mdW5jLCBmdW5jYXJnLAotCQkgICAgICAgVEhSX0RFVEFDSEVEIHwgVEhSX05FV19MV1AsICZ0aWQpKSB7Ci0JCXBlcnJvcigidGhyX2NyZWF0ZSIpOwotCQlmcmVlKCh2b2lkICopIGZ1bmNhcmcpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiB0aWQ7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBmdW5jYXJnID0gKHN0cnVjdCBmdW5jX2FyZyAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmdW5jX2FyZykpOworICAgIGZ1bmNhcmctPmZ1bmMgPSBmdW5jOworICAgIGZ1bmNhcmctPmFyZyA9IGFyZzsKKyAgICBpZiAodGhyX2NyZWF0ZSgwLCAwLCBuZXdfZnVuYywgZnVuY2FyZywKKyAgICAgICAgICAgICAgICAgICBUSFJfREVUQUNIRUQgfCBUSFJfTkVXX0xXUCwgJnRpZCkpIHsKKyAgICAgICAgcGVycm9yKCJ0aHJfY3JlYXRlIik7CisgICAgICAgIGZyZWUoKHZvaWQgKikgZnVuY2FyZyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHRpZDsKIH0KIAogbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7Ci0JcmV0dXJuIHRocl9zZWxmKCk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICByZXR1cm4gdGhyX3NlbGYoKTsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWV4aXQoMCk7Ci0JdGhyX2V4aXQoMCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGV4aXQoMCk7CisgICAgdGhyX2V4aXQoMCk7CiB9CiAKIC8qCiAgKiBMb2NrIHN1cHBvcnQuCiAgKi8KLVB5VGhyZWFkX3R5cGVfbG9jayAKK1B5VGhyZWFkX3R5cGVfbG9jawogUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewotCW11dGV4X3QgKmxvY2s7CisgICAgbXV0ZXhfdCAqbG9jazsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWxvY2sgPSAobXV0ZXhfdCAqKSBtYWxsb2Moc2l6ZW9mKG11dGV4X3QpKTsKLQlpZiAobXV0ZXhfaW5pdChsb2NrLCBVU1lOQ19USFJFQUQsIDApKSB7Ci0JCXBlcnJvcigibXV0ZXhfaW5pdCIpOwotCQlmcmVlKCh2b2lkICopIGxvY2spOwotCQlsb2NrID0gMDsKLQl9Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOworICAgIGxvY2sgPSAobXV0ZXhfdCAqKSBtYWxsb2Moc2l6ZW9mKG11dGV4X3QpKTsKKyAgICBpZiAobXV0ZXhfaW5pdChsb2NrLCBVU1lOQ19USFJFQUQsIDApKSB7CisgICAgICAgIHBlcnJvcigibXV0ZXhfaW5pdCIpOworICAgICAgICBmcmVlKCh2b2lkICopIGxvY2spOworICAgICAgICBsb2NrID0gMDsKKyAgICB9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCWRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwotCW11dGV4X2Rlc3Ryb3koKG11dGV4X3QgKikgbG9jayk7Ci0JZnJlZSgodm9pZCAqKSBsb2NrKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBtdXRleF9kZXN0cm95KChtdXRleF90ICopIGxvY2spOworICAgIGZyZWUoKHZvaWQgKikgbG9jayk7CiB9CiAKLWludCAKK2ludAogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrLCBpbnQgd2FpdGZsYWcpCiB7Ci0JaW50IHN1Y2Nlc3M7CisgICAgaW50IHN1Y2Nlc3M7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOwotCWlmICh3YWl0ZmxhZykKLQkJc3VjY2VzcyA9IG11dGV4X2xvY2soKG11dGV4X3QgKikgbG9jayk7Ci0JZWxzZQotCQlzdWNjZXNzID0gbXV0ZXhfdHJ5bG9jaygobXV0ZXhfdCAqKSBsb2NrKTsKLQlpZiAoc3VjY2VzcyA8IDApCi0JCXBlcnJvcih3YWl0ZmxhZyA/ICJtdXRleF9sb2NrIiA6ICJtdXRleF90cnlsb2NrIik7Ci0JZWxzZQotCQlzdWNjZXNzID0gIXN1Y2Nlc3M7IC8qIHNvbGFyaXMgZG9lcyBpdCB0aGUgb3RoZXIgd2F5IHJvdW5kICovCi0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwotCXJldHVybiBzdWNjZXNzOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgaWYgKHdhaXRmbGFnKQorICAgICAgICBzdWNjZXNzID0gbXV0ZXhfbG9jaygobXV0ZXhfdCAqKSBsb2NrKTsKKyAgICBlbHNlCisgICAgICAgIHN1Y2Nlc3MgPSBtdXRleF90cnlsb2NrKChtdXRleF90ICopIGxvY2spOworICAgIGlmIChzdWNjZXNzIDwgMCkKKyAgICAgICAgcGVycm9yKHdhaXRmbGFnID8gIm11dGV4X2xvY2siIDogIm11dGV4X3RyeWxvY2siKTsKKyAgICBlbHNlCisgICAgICAgIHN1Y2Nlc3MgPSAhc3VjY2VzczsgLyogc29sYXJpcyBkb2VzIGl0IHRoZSBvdGhlciB3YXkgcm91bmQgKi8KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JaWYgKG11dGV4X3VubG9jaygobXV0ZXhfdCAqKSBsb2NrKSkKLQkJcGVycm9yKCJtdXRleF91bmxvY2siKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBpZiAobXV0ZXhfdW5sb2NrKChtdXRleF90ICopIGxvY2spKQorICAgICAgICBwZXJyb3IoIm11dGV4X3VubG9jayIpOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF93aW5jZS5oIGIvUHl0aG9uL3RocmVhZF93aW5jZS5oCmluZGV4IGY4Y2YyY2YuLjUxZGRjMDIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfd2luY2UuaAorKysgYi9QeXRob24vdGhyZWFkX3dpbmNlLmgKQEAgLTI0LDIxICsyNCwyMSBAQAogICovCiBsb25nIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlsb25nIHJ2OwotCWludCBzdWNjZXNzID0gLTE7CisgICAgbG9uZyBydjsKKyAgICBpbnQgc3VjY2VzcyA9IC0xOwogCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQlydiA9IF9iZWdpbnRocmVhZChmdW5jLCAwLCBhcmcpOyAvKiB1c2UgZGVmYXVsdCBzdGFjayBzaXplICovCi0gCi0JaWYgKHJ2ICE9IC0xKSB7Ci0JCXN1Y2Nlc3MgPSAwOwotCQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIHN1Y2NlZWRlZDpcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOwotCX0KKyAgICBydiA9IF9iZWdpbnRocmVhZChmdW5jLCAwLCBhcmcpOyAvKiB1c2UgZGVmYXVsdCBzdGFjayBzaXplICovCiAKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBpZiAocnYgIT0gLTEpIHsKKyAgICAgICAgc3VjY2VzcyA9IDA7CisgICAgICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgc3VjY2VlZGVkOlxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIC8qCkBAIC00NywxOCArNDcsMTggQEAKICAqLwogbG9uZyBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KHZvaWQpCiB7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLSAgICAgICAgCi0JcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisKKyAgICByZXR1cm4gR2V0Q3VycmVudFRocmVhZElkKCk7CiB9CiAKIHZvaWQgUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWV4aXQoMCk7Ci0JX2VuZHRocmVhZCgpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgZXhpdCgwKTsKKyAgICBfZW5kdGhyZWFkKCk7CiB9CiAKIC8qCkBAIC03MiwxMiArNzIsMTIgQEAKIAogICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwogICAgIGlmICghaW5pdGlhbGl6ZWQpCi0gICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAogICAgIGFMb2NrID0gQ3JlYXRlRXZlbnQoTlVMTCwgICAgICAgICAgIC8qIFNlY3VyaXR5IGF0dHJpYnV0ZXMgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIC8qIE1hbnVhbC1SZXNldCAgICAgICAgICAgICAgICovCi0JCQkJCQkxLCAgICAgICAgICAgICAgLyogSXMgaW5pdGlhbGx5IHNpZ25hbGxlZCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgICAgICAgICAvKiBOYW1lIG9mIGV2ZW50ICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAvKiBNYW51YWwtUmVzZXQgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgIC8qIElzIGluaXRpYWxseSBzaWduYWxsZWQgICovCisgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgLyogTmFtZSBvZiBldmVudCAgICAgICAgICAgICovCiAKICAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgYUxvY2spKTsKIApAQCAtMTA3LDIyICsxMDcsMjIgQEAKICNpZm5kZWYgREVCVUcKICAgICB3YWl0UmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChhTG9jaywgKHdhaXRmbGFnID8gSU5GSU5JVEUgOiAwKSk7CiAjZWxzZQotCS8qIFRvIGFpZCBpbiBkZWJ1Z2dpbmcsIHdlIHJlZ3VsYXJseSB3YWtlIHVwLiAgVGhpcyBhbGxvd3MgdXMgdG8KLQlicmVhayBpbnRvIHRoZSBkZWJ1Z2dlciAqLwotCXdoaWxlIChUUlVFKSB7Ci0JCXdhaXRSZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGFMb2NrLCB3YWl0ZmxhZyA/IDMwMDAgOiAwKTsKLQkJaWYgKHdhaXRmbGFnPT0wIHx8ICh3YWl0ZmxhZyAmJiB3YWl0UmVzdWx0ID09IFdBSVRfT0JKRUNUXzApKQotCQkJYnJlYWs7Ci0JfQorICAgIC8qIFRvIGFpZCBpbiBkZWJ1Z2dpbmcsIHdlIHJlZ3VsYXJseSB3YWtlIHVwLiAgVGhpcyBhbGxvd3MgdXMgdG8KKyAgICBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlciAqLworICAgIHdoaWxlIChUUlVFKSB7CisgICAgICAgIHdhaXRSZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGFMb2NrLCB3YWl0ZmxhZyA/IDMwMDAgOiAwKTsKKyAgICAgICAgaWYgKHdhaXRmbGFnPT0wIHx8ICh3YWl0ZmxhZyAmJiB3YWl0UmVzdWx0ID09IFdBSVRfT0JKRUNUXzApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogI2VuZGlmCiAKICAgICBpZiAod2FpdFJlc3VsdCAhPSBXQUlUX09CSkVDVF8wKSB7Ci0JCXN1Y2Nlc3MgPSAwOyAgICAvKiBXZSBmYWlsZWQgKi8KKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gMDsgICAgLyogV2UgZmFpbGVkICovCiAgICAgfQogCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwogCi0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIHZvaWQgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBhTG9jaykKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2spKTsKIAogICAgIGlmICghU2V0RXZlbnQoYUxvY2spKQotICAgICAgICBkcHJpbnRmKCgiJWxkOiBDb3VsZCBub3QgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBlcnJvcjogJWxcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgYUxvY2ssIEdldExhc3RFcnJvcigpKSk7CisgICAgZHByaW50ZigoIiVsZDogQ291bGQgbm90IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZXJyb3I6ICVsXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIGFMb2NrLCBHZXRMYXN0RXJyb3IoKSkpOwogfQogCiAKZGlmZiAtLWdpdCBhL1B5dGhvbi90cmFjZWJhY2suYyBiL1B5dGhvbi90cmFjZWJhY2suYwppbmRleCA1MzQ5MWVlLi5hZGZkNjZjIDEwMDY0NAotLS0gYS9QeXRob24vdHJhY2ViYWNrLmMKKysrIGIvUHl0aG9uL3RyYWNlYmFjay5jCkBAIC0xMiwyNzIgKzEyLDI3MiBAQAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoUHlUcmFjZWJhY2tPYmplY3QsIHgpCiAKIHN0YXRpYyBQeU1lbWJlckRlZiB0Yl9tZW1iZXJsaXN0W10gPSB7Ci0JeyJ0Yl9uZXh0IiwJVF9PQkpFQ1QsCU9GRih0Yl9uZXh0KSwgUkVBRE9OTFl9LAotCXsidGJfZnJhbWUiLAlUX09CSkVDVCwJT0ZGKHRiX2ZyYW1lKSwgUkVBRE9OTFl9LAotCXsidGJfbGFzdGkiLAlUX0lOVCwJCU9GRih0Yl9sYXN0aSksIFJFQURPTkxZfSwKLQl7InRiX2xpbmVubyIsCVRfSU5ULAkJT0ZGKHRiX2xpbmVubyksIFJFQURPTkxZfSwKLQl7TlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7InRiX25leHQiLCAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYodGJfbmV4dCksIFJFQURPTkxZfSwKKyAgICB7InRiX2ZyYW1lIiwgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYodGJfZnJhbWUpLCBSRUFET05MWX0sCisgICAgeyJ0Yl9sYXN0aSIsICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKHRiX2xhc3RpKSwgUkVBRE9OTFl9LAorICAgIHsidGJfbGluZW5vIiwgICAgICAgVF9JTlQsICAgICAgICAgIE9GRih0Yl9saW5lbm8pLCBSRUFET05MWX0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyB2b2lkCiB0Yl9kZWFsbG9jKFB5VHJhY2ViYWNrT2JqZWN0ICp0YikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHRiKTsKLQlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHRiKQotCVB5X1hERUNSRUYodGItPnRiX25leHQpOwotCVB5X1hERUNSRUYodGItPnRiX2ZyYW1lKTsKLQlQeU9iamVjdF9HQ19EZWwodGIpOwotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKHRiKQorICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sodGIpOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4odGIpCisgICAgUHlfWERFQ1JFRih0Yi0+dGJfbmV4dCk7CisgICAgUHlfWERFQ1JFRih0Yi0+dGJfZnJhbWUpOworICAgIFB5T2JqZWN0X0dDX0RlbCh0Yik7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQodGIpCiB9CiAKIHN0YXRpYyBpbnQKIHRiX3RyYXZlcnNlKFB5VHJhY2ViYWNrT2JqZWN0ICp0YiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQodGItPnRiX25leHQpOwotCVB5X1ZJU0lUKHRiLT50Yl9mcmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQodGItPnRiX25leHQpOworICAgIFB5X1ZJU0lUKHRiLT50Yl9mcmFtZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiB0Yl9jbGVhcihQeVRyYWNlYmFja09iamVjdCAqdGIpCiB7Ci0JUHlfQ0xFQVIodGItPnRiX25leHQpOwotCVB5X0NMRUFSKHRiLT50Yl9mcmFtZSk7CisgICAgUHlfQ0xFQVIodGItPnRiX25leHQpOworICAgIFB5X0NMRUFSKHRiLT50Yl9mcmFtZSk7CiB9CiAKIFB5VHlwZU9iamVjdCBQeVRyYWNlQmFja19UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInRyYWNlYmFjayIsCi0Jc2l6ZW9mKFB5VHJhY2ViYWNrT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKXRiX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCS8qdHBfcHJpbnQqLwotCTAsICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwotCTAsCQkvKnRwX3NldGF0dHIqLwotCTAsCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkvKnRwX3JlcHIqLwotCTAsCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkvKiB0cF9oYXNoICovCi0JMCwJCS8qIHRwX2NhbGwgKi8KLQkwLAkJLyogdHBfc3RyICovCi0JMCwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotCTAsICAgICAgICAgICAgIAkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYyl0Yl90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpdGJfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JdGJfbWVtYmVybGlzdCwJCQkgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCSAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAidHJhY2ViYWNrIiwKKyAgICBzaXplb2YoUHlUcmFjZWJhY2tPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpdGJfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyl0Yl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KXRiX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICB0Yl9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogfTsKIAogc3RhdGljIFB5VHJhY2ViYWNrT2JqZWN0ICoKIG5ld3RyYWNlYmFja29iamVjdChQeVRyYWNlYmFja09iamVjdCAqbmV4dCwgUHlGcmFtZU9iamVjdCAqZnJhbWUpCiB7Ci0JUHlUcmFjZWJhY2tPYmplY3QgKnRiOwotCWlmICgobmV4dCAhPSBOVUxMICYmICFQeVRyYWNlQmFja19DaGVjayhuZXh0KSkgfHwKLQkJCWZyYW1lID09IE5VTEwgfHwgIVB5RnJhbWVfQ2hlY2soZnJhbWUpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdGIgPSBQeU9iamVjdF9HQ19OZXcoUHlUcmFjZWJhY2tPYmplY3QsICZQeVRyYWNlQmFja19UeXBlKTsKLQlpZiAodGIgIT0gTlVMTCkgewotCQlQeV9YSU5DUkVGKG5leHQpOwotCQl0Yi0+dGJfbmV4dCA9IG5leHQ7Ci0JCVB5X1hJTkNSRUYoZnJhbWUpOwotCQl0Yi0+dGJfZnJhbWUgPSBmcmFtZTsKLQkJdGItPnRiX2xhc3RpID0gZnJhbWUtPmZfbGFzdGk7Ci0JCXRiLT50Yl9saW5lbm8gPSBQeUZyYW1lX0dldExpbmVOdW1iZXIoZnJhbWUpOwotCQlQeU9iamVjdF9HQ19UcmFjayh0Yik7Ci0JfQotCXJldHVybiB0YjsKKyAgICBQeVRyYWNlYmFja09iamVjdCAqdGI7CisgICAgaWYgKChuZXh0ICE9IE5VTEwgJiYgIVB5VHJhY2VCYWNrX0NoZWNrKG5leHQpKSB8fAorICAgICAgICAgICAgICAgICAgICBmcmFtZSA9PSBOVUxMIHx8ICFQeUZyYW1lX0NoZWNrKGZyYW1lKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHRiID0gUHlPYmplY3RfR0NfTmV3KFB5VHJhY2ViYWNrT2JqZWN0LCAmUHlUcmFjZUJhY2tfVHlwZSk7CisgICAgaWYgKHRiICE9IE5VTEwpIHsKKyAgICAgICAgUHlfWElOQ1JFRihuZXh0KTsKKyAgICAgICAgdGItPnRiX25leHQgPSBuZXh0OworICAgICAgICBQeV9YSU5DUkVGKGZyYW1lKTsKKyAgICAgICAgdGItPnRiX2ZyYW1lID0gZnJhbWU7CisgICAgICAgIHRiLT50Yl9sYXN0aSA9IGZyYW1lLT5mX2xhc3RpOworICAgICAgICB0Yi0+dGJfbGluZW5vID0gUHlGcmFtZV9HZXRMaW5lTnVtYmVyKGZyYW1lKTsKKyAgICAgICAgUHlPYmplY3RfR0NfVHJhY2sodGIpOworICAgIH0KKyAgICByZXR1cm4gdGI7CiB9CiAKIGludAogUHlUcmFjZUJhY2tfSGVyZShQeUZyYW1lT2JqZWN0ICpmcmFtZSkKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5VHJhY2ViYWNrT2JqZWN0ICpvbGR0YiA9IChQeVRyYWNlYmFja09iamVjdCAqKSB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2s7Ci0JUHlUcmFjZWJhY2tPYmplY3QgKnRiID0gbmV3dHJhY2ViYWNrb2JqZWN0KG9sZHRiLCBmcmFtZSk7Ci0JaWYgKHRiID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQl0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPSAoUHlPYmplY3QgKil0YjsKLQlQeV9YREVDUkVGKG9sZHRiKTsKLQlyZXR1cm4gMDsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5VHJhY2ViYWNrT2JqZWN0ICpvbGR0YiA9IChQeVRyYWNlYmFja09iamVjdCAqKSB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2s7CisgICAgUHlUcmFjZWJhY2tPYmplY3QgKnRiID0gbmV3dHJhY2ViYWNrb2JqZWN0KG9sZHRiLCBmcmFtZSk7CisgICAgaWYgKHRiID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPSAoUHlPYmplY3QgKil0YjsKKyAgICBQeV9YREVDUkVGKG9sZHRiKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBfUHlfRGlzcGxheVNvdXJjZUxpbmUoUHlPYmplY3QgKmYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vLCBpbnQgaW5kZW50KQogewotCWludCBlcnIgPSAwOwotCUZJTEUgKnhmcCA9IE5VTEw7Ci0JY2hhciBsaW5lYnVmWzIwMDBdOwotCWludCBpOwotCWNoYXIgbmFtZWJ1ZltNQVhQQVRITEVOKzFdOworICAgIGludCBlcnIgPSAwOworICAgIEZJTEUgKnhmcCA9IE5VTEw7CisgICAgY2hhciBsaW5lYnVmWzIwMDBdOworICAgIGludCBpOworICAgIGNoYXIgbmFtZWJ1ZltNQVhQQVRITEVOKzFdOwogCi0JaWYgKGZpbGVuYW1lID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQkvKiBUaGlzIGlzIG5lZWRlZCBieSBFbWFjcycgY29tcGlsZSBjb21tYW5kICovCisgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBUaGlzIGlzIG5lZWRlZCBieSBFbWFjcycgY29tcGlsZSBjb21tYW5kICovCiAjZGVmaW5lIEZNVCAiICBGaWxlIFwiJS41MDBzXCIsIGxpbmUgJWQsIGluICUuNTAwc1xuIgotCXhmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIgUFlfU1RESU9URVhUTU9ERSk7Ci0JaWYgKHhmcCA9PSBOVUxMKSB7Ci0JCS8qIFNlYXJjaCB0YWlsIG9mIGZpbGVuYW1lIGluIHN5cy5wYXRoIGJlZm9yZSBnaXZpbmcgdXAgKi8KLQkJUHlPYmplY3QgKnBhdGg7Ci0JCWNvbnN0IGNoYXIgKnRhaWwgPSBzdHJyY2hyKGZpbGVuYW1lLCBTRVApOwotCQlpZiAodGFpbCA9PSBOVUxMKQotCQkJdGFpbCA9IGZpbGVuYW1lOwotCQllbHNlCi0JCQl0YWlsKys7Ci0JCXBhdGggPSBQeVN5c19HZXRPYmplY3QoInBhdGgiKTsKLQkJaWYgKHBhdGggIT0gTlVMTCAmJiBQeUxpc3RfQ2hlY2socGF0aCkpIHsKLQkJCVB5X3NzaXplX3QgX25wYXRoID0gUHlMaXN0X1NpemUocGF0aCk7Ci0JCQlpbnQgbnBhdGggPSBQeV9TQUZFX0RPV05DQVNUKF9ucGF0aCwgUHlfc3NpemVfdCwgaW50KTsKLQkJCXNpemVfdCB0YWlsbGVuID0gc3RybGVuKHRhaWwpOwotCQkJZm9yIChpID0gMDsgaSA8IG5wYXRoOyBpKyspIHsKLQkJCQlQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKHBhdGgsIGkpOwotCQkJCWlmICh2ID09IE5VTEwpIHsKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChQeVN0cmluZ19DaGVjayh2KSkgewotCQkJCQlzaXplX3QgbGVuOwotCQkJCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLQkJCQkJaWYgKGxlbiArIDEgKyB0YWlsbGVuID49IE1BWFBBVEhMRU4pCi0JCQkJCQljb250aW51ZTsgLyogVG9vIGxvbmcgKi8KLQkJCQkJc3RyY3B5KG5hbWVidWYsIFB5U3RyaW5nX0FzU3RyaW5nKHYpKTsKLQkJCQkJaWYgKHN0cmxlbihuYW1lYnVmKSAhPSBsZW4pCi0JCQkJCQljb250aW51ZTsgLyogdiBjb250YWlucyAnXDAnICovCi0JCQkJCWlmIChsZW4gPiAwICYmIG5hbWVidWZbbGVuLTFdICE9IFNFUCkKLQkJCQkJCW5hbWVidWZbbGVuKytdID0gU0VQOwotCQkJCQlzdHJjcHkobmFtZWJ1ZitsZW4sIHRhaWwpOwotCQkJCQl4ZnAgPSBmb3BlbihuYW1lYnVmLCAiciIgUFlfU1RESU9URVhUTU9ERSk7Ci0JCQkJCWlmICh4ZnAgIT0gTlVMTCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgeGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIiBQWV9TVERJT1RFWFRNT0RFKTsKKyAgICBpZiAoeGZwID09IE5VTEwpIHsKKyAgICAgICAgLyogU2VhcmNoIHRhaWwgb2YgZmlsZW5hbWUgaW4gc3lzLnBhdGggYmVmb3JlIGdpdmluZyB1cCAqLworICAgICAgICBQeU9iamVjdCAqcGF0aDsKKyAgICAgICAgY29uc3QgY2hhciAqdGFpbCA9IHN0cnJjaHIoZmlsZW5hbWUsIFNFUCk7CisgICAgICAgIGlmICh0YWlsID09IE5VTEwpCisgICAgICAgICAgICB0YWlsID0gZmlsZW5hbWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRhaWwrKzsKKyAgICAgICAgcGF0aCA9IFB5U3lzX0dldE9iamVjdCgicGF0aCIpOworICAgICAgICBpZiAocGF0aCAhPSBOVUxMICYmIFB5TGlzdF9DaGVjayhwYXRoKSkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBfbnBhdGggPSBQeUxpc3RfU2l6ZShwYXRoKTsKKyAgICAgICAgICAgIGludCBucGF0aCA9IFB5X1NBRkVfRE9XTkNBU1QoX25wYXRoLCBQeV9zc2l6ZV90LCBpbnQpOworICAgICAgICAgICAgc2l6ZV90IHRhaWxsZW4gPSBzdHJsZW4odGFpbCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnBhdGg7IGkrKykgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlMaXN0X0dldEl0ZW0ocGF0aCwgaSk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW47CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOworICAgICAgICAgICAgICAgICAgICBpZiAobGVuICsgMSArIHRhaWxsZW4gPj0gTUFYUEFUSExFTikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBUb28gbG9uZyAqLworICAgICAgICAgICAgICAgICAgICBzdHJjcHkobmFtZWJ1ZiwgUHlTdHJpbmdfQXNTdHJpbmcodikpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKG5hbWVidWYpICE9IGxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiB2IGNvbnRhaW5zICdcMCcgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDAgJiYgbmFtZWJ1ZltsZW4tMV0gIT0gU0VQKQorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWJ1ZltsZW4rK10gPSBTRVA7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShuYW1lYnVmK2xlbiwgdGFpbCk7CisgICAgICAgICAgICAgICAgICAgIHhmcCA9IGZvcGVuKG5hbWVidWYsICJyIiBQWV9TVERJT1RFWFRNT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhmcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoeGZwID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIGZjbG9zZSh4ZnApOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICBpZiAoeGZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIGZjbG9zZSh4ZnApOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lbm87IGkrKykgeworICAgICAgICBjaGFyKiBwTGFzdENoYXIgPSAmbGluZWJ1ZltzaXplb2YobGluZWJ1ZiktMl07CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICpwTGFzdENoYXIgPSAnXDAnOworICAgICAgICAgICAgaWYgKFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhsaW5lYnVmLCBzaXplb2YgbGluZWJ1ZiwgeGZwLCBOVUxMKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyogZmdldHMgcmVhZCAqc29tZXRoaW5nKjsgaWYgaXQgZGlkbid0IGdldCBhcworICAgICAgICAgICAgICAgZmFyIGFzIHBMYXN0Q2hhciwgaXQgbXVzdCBoYXZlIGZvdW5kIGEgbmV3bGluZQorICAgICAgICAgICAgICAgb3IgaGl0IHRoZSBlbmQgb2YgdGhlIGZpbGU7ICAgICAgICAgICAgICBpZiBwTGFzdENoYXIgaXMgXG4sCisgICAgICAgICAgICAgICBpdCBvYnZpb3VzbHkgZm91bmQgYSBuZXdsaW5lOyBlbHNlIHdlIGhhdmVuJ3QKKyAgICAgICAgICAgICAgIHlldCBzZWVuIGEgbmV3bGluZSwgc28gbXVzdCBjb250aW51ZSAqLworICAgICAgICB9IHdoaWxlICgqcExhc3RDaGFyICE9ICdcMCcgJiYgKnBMYXN0Q2hhciAhPSAnXG4nKTsKKyAgICB9CisgICAgaWYgKGkgPT0gbGluZW5vKSB7CisgICAgICAgIGNoYXIgYnVmWzExXTsKKyAgICAgICAgY2hhciAqcCA9IGxpbmVidWY7CisgICAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXDAxNCcpCisgICAgICAgICAgICBwKys7CisKKyAgICAgICAgLyogV3JpdGUgc29tZSBzcGFjZXMgYmVmb3JlIHRoZSBsaW5lICovCisgICAgICAgIHN0cmNweShidWYsICIgICAgICAgICAgIik7CisgICAgICAgIGFzc2VydCAoc3RybGVuKGJ1ZikgPT0gMTApOworICAgICAgICB3aGlsZSAoaW5kZW50ID4gMCkgeworICAgICAgICAgICAgaWYoaW5kZW50IDwgMTApCisgICAgICAgICAgICAgICAgYnVmW2luZGVudF0gPSAnXDAnOworICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKGJ1ZiwgZik7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpbmRlbnQgLT0gMTA7CiAgICAgICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBsaW5lbm87IGkrKykgewotCQljaGFyKiBwTGFzdENoYXIgPSAmbGluZWJ1ZltzaXplb2YobGluZWJ1ZiktMl07Ci0JCWRvIHsKLQkJCSpwTGFzdENoYXIgPSAnXDAnOwotCQkJaWYgKFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhsaW5lYnVmLCBzaXplb2YgbGluZWJ1ZiwgeGZwLCBOVUxMKSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJLyogZmdldHMgcmVhZCAqc29tZXRoaW5nKjsgaWYgaXQgZGlkbid0IGdldCBhcwotCQkJICAgZmFyIGFzIHBMYXN0Q2hhciwgaXQgbXVzdCBoYXZlIGZvdW5kIGEgbmV3bGluZQotCQkJICAgb3IgaGl0IHRoZSBlbmQgb2YgdGhlIGZpbGU7CWlmIHBMYXN0Q2hhciBpcyBcbiwKLQkJCSAgIGl0IG9idmlvdXNseSBmb3VuZCBhIG5ld2xpbmU7IGVsc2Ugd2UgaGF2ZW4ndAotCQkJICAgeWV0IHNlZW4gYSBuZXdsaW5lLCBzbyBtdXN0IGNvbnRpbnVlICovCi0JCX0gd2hpbGUgKCpwTGFzdENoYXIgIT0gJ1wwJyAmJiAqcExhc3RDaGFyICE9ICdcbicpOwotCX0KLQlpZiAoaSA9PSBsaW5lbm8pIHsKLQkJY2hhciBidWZbMTFdOwotCQljaGFyICpwID0gbGluZWJ1ZjsKLQkJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICdcMDE0JykKLQkJCXArKzsKLQotCQkvKiBXcml0ZSBzb21lIHNwYWNlcyBiZWZvcmUgdGhlIGxpbmUgKi8KLQkJc3RyY3B5KGJ1ZiwgIiAgICAgICAgICAiKTsKLQkJYXNzZXJ0IChzdHJsZW4oYnVmKSA9PSAxMCk7Ci0JCXdoaWxlIChpbmRlbnQgPiAwKSB7Ci0JCQlpZihpbmRlbnQgPCAxMCkKLQkJCQlidWZbaW5kZW50XSA9ICdcMCc7Ci0JCQllcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoYnVmLCBmKTsKLQkJCWlmIChlcnIgIT0gMCkKLQkJCQlicmVhazsKLQkJCWluZGVudCAtPSAxMDsKLQkJfQotCi0JCWlmIChlcnIgPT0gMCkKLQkJCWVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZyhwLCBmKTsKLQkJaWYgKGVyciA9PSAwICYmIHN0cmNocihwLCAnXG4nKSA9PSBOVUxMKQotCQkJZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIGYpOwotCX0KLQlmY2xvc2UoeGZwKTsKLQlyZXR1cm4gZXJyOworICAgICAgICBpZiAoZXJyID09IDApCisgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcocCwgZik7CisgICAgICAgIGlmIChlcnIgPT0gMCAmJiBzdHJjaHIocCwgJ1xuJykgPT0gTlVMTCkKKyAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmKTsKKyAgICB9CisgICAgZmNsb3NlKHhmcCk7CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludAogdGJfZGlzcGxheWxpbmUoUHlPYmplY3QgKmYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vLCBjb25zdCBjaGFyICpuYW1lKQogewotCWludCBlcnIgPSAwOwotICAgICAgICBjaGFyIGxpbmVidWZbMjAwMF07CisgICAgaW50IGVyciA9IDA7CisgICAgY2hhciBsaW5lYnVmWzIwMDBdOwogCi0JaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JLyogVGhpcyBpcyBuZWVkZWQgYnkgRW1hY3MnIGNvbXBpbGUgY29tbWFuZCAqLworICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIFRoaXMgaXMgbmVlZGVkIGJ5IEVtYWNzJyBjb21waWxlIGNvbW1hbmQgKi8KICNkZWZpbmUgRk1UICIgIEZpbGUgXCIlLjUwMHNcIiwgbGluZSAlZCwgaW4gJS41MDBzXG4iCi0JUHlPU19zbnByaW50ZihsaW5lYnVmLCBzaXplb2YobGluZWJ1ZiksIEZNVCwgZmlsZW5hbWUsIGxpbmVubywgbmFtZSk7Ci0JZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKGxpbmVidWYsIGYpOwotCWlmIChlcnIgIT0gMCkKLQkJcmV0dXJuIGVycjsKLSAgICAgICAgcmV0dXJuIF9QeV9EaXNwbGF5U291cmNlTGluZShmLCBmaWxlbmFtZSwgbGluZW5vLCA0KTsKKyAgICBQeU9TX3NucHJpbnRmKGxpbmVidWYsIHNpemVvZihsaW5lYnVmKSwgRk1ULCBmaWxlbmFtZSwgbGluZW5vLCBuYW1lKTsKKyAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcobGluZWJ1ZiwgZik7CisgICAgaWYgKGVyciAhPSAwKQorICAgICAgICByZXR1cm4gZXJyOworICAgIHJldHVybiBfUHlfRGlzcGxheVNvdXJjZUxpbmUoZiwgZmlsZW5hbWUsIGxpbmVubywgNCk7CiB9CiAKIHN0YXRpYyBpbnQKIHRiX3ByaW50aW50ZXJuYWwoUHlUcmFjZWJhY2tPYmplY3QgKnRiLCBQeU9iamVjdCAqZiwgbG9uZyBsaW1pdCkKIHsKLQlpbnQgZXJyID0gMDsKLQlsb25nIGRlcHRoID0gMDsKLQlQeVRyYWNlYmFja09iamVjdCAqdGIxID0gdGI7Ci0Jd2hpbGUgKHRiMSAhPSBOVUxMKSB7Ci0JCWRlcHRoKys7Ci0JCXRiMSA9IHRiMS0+dGJfbmV4dDsKLQl9Ci0Jd2hpbGUgKHRiICE9IE5VTEwgJiYgZXJyID09IDApIHsKLQkJaWYgKGRlcHRoIDw9IGxpbWl0KSB7Ci0JCQllcnIgPSB0Yl9kaXNwbGF5bGluZShmLAotCQkJICAgIFB5U3RyaW5nX0FzU3RyaW5nKAotCQkJCSAgICB0Yi0+dGJfZnJhbWUtPmZfY29kZS0+Y29fZmlsZW5hbWUpLAotCQkJICAgIHRiLT50Yl9saW5lbm8sCi0JCQkgICAgUHlTdHJpbmdfQXNTdHJpbmcodGItPnRiX2ZyYW1lLT5mX2NvZGUtPmNvX25hbWUpKTsKLQkJfQotCQlkZXB0aC0tOwotCQl0YiA9IHRiLT50Yl9uZXh0OwotCQlpZiAoZXJyID09IDApCi0JCQllcnIgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBpbnQgZXJyID0gMDsKKyAgICBsb25nIGRlcHRoID0gMDsKKyAgICBQeVRyYWNlYmFja09iamVjdCAqdGIxID0gdGI7CisgICAgd2hpbGUgKHRiMSAhPSBOVUxMKSB7CisgICAgICAgIGRlcHRoKys7CisgICAgICAgIHRiMSA9IHRiMS0+dGJfbmV4dDsKKyAgICB9CisgICAgd2hpbGUgKHRiICE9IE5VTEwgJiYgZXJyID09IDApIHsKKyAgICAgICAgaWYgKGRlcHRoIDw9IGxpbWl0KSB7CisgICAgICAgICAgICBlcnIgPSB0Yl9kaXNwbGF5bGluZShmLAorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICB0Yi0+dGJfZnJhbWUtPmZfY29kZS0+Y29fZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgIHRiLT50Yl9saW5lbm8sCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcodGItPnRiX2ZyYW1lLT5mX2NvZGUtPmNvX25hbWUpKTsKKyAgICAgICAgfQorICAgICAgICBkZXB0aC0tOworICAgICAgICB0YiA9IHRiLT50Yl9uZXh0OworICAgICAgICBpZiAoZXJyID09IDApCisgICAgICAgICAgICBlcnIgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogaW50CiBQeVRyYWNlQmFja19QcmludChQeU9iamVjdCAqdiwgUHlPYmplY3QgKmYpCiB7Ci0JaW50IGVycjsKLQlQeU9iamVjdCAqbGltaXR2OwotCWxvbmcgbGltaXQgPSAxMDAwOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmICghUHlUcmFjZUJhY2tfQ2hlY2sodikpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbGltaXR2ID0gUHlTeXNfR2V0T2JqZWN0KCJ0cmFjZWJhY2tsaW1pdCIpOwotCWlmIChsaW1pdHYgJiYgUHlJbnRfQ2hlY2sobGltaXR2KSkgewotCQlsaW1pdCA9IFB5SW50X0FzTG9uZyhsaW1pdHYpOwotCQlpZiAobGltaXQgPD0gMCkKLQkJCXJldHVybiAwOwotCX0KLQllcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIlRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiIsIGYpOwotCWlmICghZXJyKQotCQllcnIgPSB0Yl9wcmludGludGVybmFsKChQeVRyYWNlYmFja09iamVjdCAqKXYsIGYsIGxpbWl0KTsKLQlyZXR1cm4gZXJyOworICAgIGludCBlcnI7CisgICAgUHlPYmplY3QgKmxpbWl0djsKKyAgICBsb25nIGxpbWl0ID0gMTAwMDsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIVB5VHJhY2VCYWNrX0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGxpbWl0diA9IFB5U3lzX0dldE9iamVjdCgidHJhY2ViYWNrbGltaXQiKTsKKyAgICBpZiAobGltaXR2ICYmIFB5SW50X0NoZWNrKGxpbWl0dikpIHsKKyAgICAgICAgbGltaXQgPSBQeUludF9Bc0xvbmcobGltaXR2KTsKKyAgICAgICAgaWYgKGxpbWl0IDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCJUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4iLCBmKTsKKyAgICBpZiAoIWVycikKKyAgICAgICAgZXJyID0gdGJfcHJpbnRpbnRlcm5hbCgoUHlUcmFjZWJhY2tPYmplY3QgKil2LCBmLCBsaW1pdCk7CisgICAgcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL1JJU0NPUy9Nb2R1bGVzL2NvbmZpZy5jIGIvUklTQ09TL01vZHVsZXMvY29uZmlnLmMKaW5kZXggNTRmYmM3OS4uYzQ5OGU5OCAxMDA2NDQKLS0tIGEvUklTQ09TL01vZHVsZXMvY29uZmlnLmMKKysrIGIvUklTQ09TL01vZHVsZXMvY29uZmlnLmMKQEAgLTQ5LDI1ICs0OSwyNSBAQAogCiBzdHJ1Y3QgX2luaXR0YWIgX1B5SW1wb3J0X0luaXR0YWJbXSA9IHsKIAotCXsicmlzY29zIiwgaW5pdHJpc2Nvc30sCisgICAgeyJyaXNjb3MiLCBpbml0cmlzY29zfSwKIAogLyogLS0gQURETU9EVUxFIE1BUktFUiAyIC0tICovCiAKLQkvKiBUaGlzIG1vZHVsZSAibGl2ZXMgaW4iIHdpdGggbWFyc2hhbC5jICovCi0JeyJtYXJzaGFsIiwgUHlNYXJzaGFsX0luaXR9LAorICAgIC8qIFRoaXMgbW9kdWxlICJsaXZlcyBpbiIgd2l0aCBtYXJzaGFsLmMgKi8KKyAgICB7Im1hcnNoYWwiLCBQeU1hcnNoYWxfSW5pdH0sCiAKLQkvKiBUaGlzIGxpdmVzIGl0IHdpdGggaW1wb3J0LmMgKi8KLQl7ImltcCIsIGluaXRpbXB9LAorICAgIC8qIFRoaXMgbGl2ZXMgaXQgd2l0aCBpbXBvcnQuYyAqLworICAgIHsiaW1wIiwgaW5pdGltcH0sCiAKLQkvKiBUaGVzZSBlbnRyaWVzIGFyZSBoZXJlIGZvciBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMgKi8KLQl7Il9fbWFpbl9fIiwgTlVMTH0sCi0JeyJfX2J1aWx0aW5fXyIsIE5VTEx9LAotCXsic3lzIiwgTlVMTH0sCi0JeyJleGNlcHRpb25zIiwgTlVMTH0sCisgICAgLyogVGhlc2UgZW50cmllcyBhcmUgaGVyZSBmb3Igc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzICovCisgICAgeyJfX21haW5fXyIsIE5VTEx9LAorICAgIHsiX19idWlsdGluX18iLCBOVUxMfSwKKyAgICB7InN5cyIsIE5VTEx9LAorICAgIHsiZXhjZXB0aW9ucyIsIE5VTEx9LAogCi0JLyogVGhpcyBsaXZlcyBpbiBnY21vZHVsZS5jICovCi0JeyJnYyIsIGluaXRnY30sCisgICAgLyogVGhpcyBsaXZlcyBpbiBnY21vZHVsZS5jICovCisgICAgeyJnYyIsIGluaXRnY30sCiAKLQkvKiBTZW50aW5lbCAqLwotCXswLCAwfQorICAgIC8qIFNlbnRpbmVsICovCisgICAgezAsIDB9CiB9OwpkaWZmIC0tZ2l0IGEvUklTQ09TL01vZHVsZXMvZ2V0cGF0aF9yaXNjb3MuYyBiL1JJU0NPUy9Nb2R1bGVzL2dldHBhdGhfcmlzY29zLmMKaW5kZXggY2U5NzhjNi4uMTFlOTJjMSAxMDA2NDQKLS0tIGEvUklTQ09TL01vZHVsZXMvZ2V0cGF0aF9yaXNjb3MuYworKysgYi9SSVNDT1MvTW9kdWxlcy9nZXRwYXRoX3Jpc2Nvcy5jCkBAIC01LDI0ICs1LDI0IEBACiAKIHN0YXRpYyB2b2lkCiBjYWxjdWxhdGVfcGF0aCgpCi17IAotCWNoYXIgKnB5cGF0aCA9IGdldGVudigiUHl0aG9uJFBhdGgiKTsKLQlpZiAocHlwYXRoKSB7Ci0JCWludCBwYXRobGVuID0gc3RybGVuKHB5cGF0aCk7Ci0JCW1vZHVsZV9zZWFyY2hfcGF0aCA9IG1hbGxvYyhwYXRobGVuICsgMSk7Ci0JCWlmIChtb2R1bGVfc2VhcmNoX3BhdGgpIAotCQkJc3RybmNweShtb2R1bGVfc2VhcmNoX3BhdGgsIHB5cGF0aCwgcGF0aGxlbiArIDEpOwotCQllbHNlIHsKLQkJCWZwcmludGYoc3RkZXJyLCAKLQkJCQkiTm90IGVub3VnaCBtZW1vcnkgZm9yIGR5bmFtaWMgUFlUSE9OUEFUSC5cbiIKLQkJCQkiVXNpbmcgZGVmYXVsdCBzdGF0aWMgUFlUSE9OUEFUSC5cbiIpOwotCQl9Ci0JfQotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKSAKLQkJbW9kdWxlX3NlYXJjaF9wYXRoID0gIjxQeXRob24kRGlyPi5MaWIiOwotCXByZWZpeCA9ICI8UHl0aG9uJERpcj4iOwotCWV4ZWNfcHJlZml4ID0gcHJlZml4OwotCXByb2dwYXRoID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKK3sKKyAgICBjaGFyICpweXBhdGggPSBnZXRlbnYoIlB5dGhvbiRQYXRoIik7CisgICAgaWYgKHB5cGF0aCkgeworICAgICAgICBpbnQgcGF0aGxlbiA9IHN0cmxlbihweXBhdGgpOworICAgICAgICBtb2R1bGVfc2VhcmNoX3BhdGggPSBtYWxsb2MocGF0aGxlbiArIDEpOworICAgICAgICBpZiAobW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICAgICAgc3RybmNweShtb2R1bGVfc2VhcmNoX3BhdGgsIHB5cGF0aCwgcGF0aGxlbiArIDEpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgZHluYW1pYyBQWVRIT05QQVRILlxuIgorICAgICAgICAgICAgICAgICJVc2luZyBkZWZhdWx0IHN0YXRpYyBQWVRIT05QQVRILlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9ICI8UHl0aG9uJERpcj4uTGliIjsKKyAgICBwcmVmaXggPSAiPFB5dGhvbiREaXI+IjsKKyAgICBleGVjX3ByZWZpeCA9IHByZWZpeDsKKyAgICBwcm9ncGF0aCA9IFB5X0dldFByb2dyYW1OYW1lKCk7CiB9CiAKIC8qIEV4dGVybmFsIGludGVyZmFjZSAqLwpAQCAtMzAsMzEgKzMwLDMxIEBACiBjaGFyICoKIFB5X0dldFBhdGgoKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOwotCXJldHVybiBtb2R1bGVfc2VhcmNoX3BhdGg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIG1vZHVsZV9zZWFyY2hfcGF0aDsKIH0KIAogY2hhciAqCiBQeV9HZXRQcmVmaXgoKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOwotCXJldHVybiBwcmVmaXg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIHByZWZpeDsKIH0KIAogY2hhciAqCiBQeV9HZXRFeGVjUHJlZml4KCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKLQlyZXR1cm4gZXhlY19wcmVmaXg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIGV4ZWNfcHJlZml4OwogfQogCiBjaGFyICoKIFB5X0dldFByb2dyYW1GdWxsUGF0aCgpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7Ci0JcmV0dXJuIHByb2dwYXRoOworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOworICAgIHJldHVybiBwcm9ncGF0aDsKIH0KZGlmZiAtLWdpdCBhL1JJU0NPUy9Nb2R1bGVzL3Jpc2Nvc21vZHVsZS5jIGIvUklTQ09TL01vZHVsZXMvcmlzY29zbW9kdWxlLmMKaW5kZXggM2RhYmI0ZC4uNDM4NzM4MyAxMDA2NDQKLS0tIGEvUklTQ09TL01vZHVsZXMvcmlzY29zbW9kdWxlLmMKKysrIGIvUklTQ09TL01vZHVsZXMvcmlzY29zbW9kdWxlLmMKQEAgLTE5LDEzICsxOSwxMyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKnJpc2Nvc19lcnJvcihjaGFyICpzKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PU0Vycm9yLCBzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT1NFcnJvciwgcyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqcmlzY29zX29zZXJyb3Iodm9pZCkKIHsKLQlyZXR1cm4gcmlzY29zX2Vycm9yKGUtPmVycm1lc3MpOworICAgIHJldHVybiByaXNjb3NfZXJyb3IoZS0+ZXJybWVzcyk7CiB9CiAKIApAQCAtMzUsNDAgKzM1LDQwIEBACiByaXNjb3NfcmVtb3ZlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBjaGFyICpwYXRoMTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6cmVtb3ZlIiwgJnBhdGgxKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKHJlbW92ZShwYXRoMSkpIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpyZW1vdmUiLCAmcGF0aDEpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVtb3ZlKHBhdGgxKSkgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3NfcmVuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoMSwgKnBhdGgyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6cmVuYW1lIiwgJnBhdGgxLCAmcGF0aDIpKQotICAgICAgICByZXR1cm4gTlVMTDsKLQlpZiAocmVuYW1lKHBhdGgxLHBhdGgyKSkgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqcGF0aDEsICpwYXRoMjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOnJlbmFtZSIsICZwYXRoMSwgJnBhdGgyKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVuYW1lKHBhdGgxLHBhdGgyKSkgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3Nfc3lzdGVtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpjb21tYW5kOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzeXN0ZW0iLCAmY29tbWFuZCkpIHJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzeXN0ZW0oY29tbWFuZCkpOworICAgIGNoYXIgKmNvbW1hbmQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnN5c3RlbSIsICZjb21tYW5kKSkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHN5c3RlbShjb21tYW5kKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3NfY2hkaXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhdGg7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmNoZGlyIiwgJnBhdGgpKSByZXR1cm4gTlVMTDsKLQllPXhvc2ZzY29udHJvbF9kaXIocGF0aCk7Ci0JaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNoYXIgKnBhdGg7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmNoZGlyIiwgJnBhdGgpKSByZXR1cm4gTlVMTDsKKyAgICBlPXhvc2ZzY29udHJvbF9kaXIocGF0aCk7CisgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtOTgsNDYgKzk4LDQ2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmlzY29zX2V4cGFuZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcGF0aDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwYW5kIiwgJnBhdGgpKSByZXR1cm4gTlVMTDsKLSAgICAgICAgcmV0dXJuIGNhbm9uKHBhdGgpOworICAgIGNoYXIgKnBhdGg7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV4cGFuZCIsICZwYXRoKSkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGNhbm9uKHBhdGgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmlzY29zX21rZGlyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoOworICAgIGNoYXIgKnBhdGg7CiAgICAgaW50IG1vZGU7CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfGk6bWtkaXIiLCAmcGF0aCwgJm1vZGUpKSByZXR1cm4gTlVMTDsKICAgICBlPXhvc2ZpbGVfY3JlYXRlX2RpcihwYXRoLDApOwogICAgIGlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3NfbGlzdGRpcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcGF0aCxidWZbMjU2XTsKKyAgICBjaGFyICpwYXRoLGJ1ZlsyNTZdOwogICAgIFB5T2JqZWN0ICpkLCAqdjsKICAgICBpbnQgYz0wLGNvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpsaXN0ZGlyIiwgJnBhdGgpKSByZXR1cm4gTlVMTDsKLQlkPVB5TGlzdF9OZXcoMCk7Ci0JaWYoIWQpIHJldHVybiBOVUxMOwotCWZvcig7OykKLQl7IGU9eG9zZ2JwYl9kaXJfZW50cmllcyhwYXRoLChvc2dicGJfc3RyaW5nX2xpc3QqKWJ1ZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsYywyNTYsMCwmY291bnQsJmMpOwotCSAgaWYoZSkKLQkgIHsgUHlfREVDUkVGKGQpO3JldHVybiByaXNjb3Nfb3NlcnJvcigpOwotCSAgfQotCSAgaWYoY291bnQpCi0JICB7IHY9UHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotCSAgICBpZighdikgeyBQeV9ERUNSRUYoZCk7cmV0dXJuIDA7fQotCSAgICBpZihQeUxpc3RfQXBwZW5kKGQsdikpIHtQeV9ERUNSRUYoZCk7UHlfREVDUkVGKHYpO3JldHVybiAwO30KLQkgIH0KLQkgIGlmKGM9PS0xKSBicmVhazsKLQl9Ci0JcmV0dXJuIGQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmxpc3RkaXIiLCAmcGF0aCkpIHJldHVybiBOVUxMOworICAgIGQ9UHlMaXN0X05ldygwKTsKKyAgICBpZighZCkgcmV0dXJuIE5VTEw7CisgICAgZm9yKDs7KQorICAgIHsgZT14b3NnYnBiX2Rpcl9lbnRyaWVzKHBhdGgsKG9zZ2JwYl9zdHJpbmdfbGlzdCopYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSxjLDI1NiwwLCZjb3VudCwmYyk7CisgICAgICBpZihlKQorICAgICAgeyBQeV9ERUNSRUYoZCk7cmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgICB9CisgICAgICBpZihjb3VudCkKKyAgICAgIHsgdj1QeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgICAgIGlmKCF2KSB7IFB5X0RFQ1JFRihkKTtyZXR1cm4gMDt9CisgICAgICAgIGlmKFB5TGlzdF9BcHBlbmQoZCx2KSkge1B5X0RFQ1JFRihkKTtQeV9ERUNSRUYodik7cmV0dXJuIDA7fQorICAgICAgfQorICAgICAgaWYoYz09LTEpIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZDsKIH0KIAogUHlEb2NfU1RSVkFSKHN0YXRfcmVzdWx0X19kb2NfXywKQEAgLTE1MSwxNjcgKzE1MSwxNjcgQEAKIFNlZSBvcy5zdGF0IGZvciBtb3JlIGluZm9ybWF0aW9uLiIpOwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCBzdGF0X3Jlc3VsdF9maWVsZHNbXSA9IHsKLSAgICAgICAgeyAic3RfbW9kZSIsICAicHJvdGVjdGlvbiBiaXRzIiB9LAotICAgICAgICB7ICJzdF9pbm8iLCAgICJpbm9kZSIgfSwKLSAgICAgICAgeyAic3RfZGV2IiwgICAiZGV2aWNlIiB9LAotICAgICAgICB7ICJzdF9ubGluayIsICJudW1iZXIgb2YgaGFyZCBsaW5rcyIgfSwKLSAgICAgICAgeyAic3RfdWlkIiwgICAidXNlciBJRCBvZiBvd25lciIgfSwKLSAgICAgICAgeyAic3RfZ2lkIiwgICAiZ3JvdXAgSUQgb2Ygb3duZXIiIH0sCi0gICAgICAgIHsgInN0X3NpemUiLCAgInRvdGFsIHNpemUsIGluIGJ5dGVzIiB9LAotICAgICAgICB7ICJzdF9hdGltZSIsICJ0aW1lIG9mIGxhc3QgYWNjZXNzIiB9LAotICAgICAgICB7ICJzdF9tdGltZSIsICJ0aW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uIiB9LAotICAgICAgICB7ICJzdF9jdGltZSIsICJ0aW1lIG9mIGxhc3QgY2hhbmdlIiB9LAotCXsgInN0X2Z0eXBlIiwgImZpbGUgdHlwZSIgfSwKLQl7ICJzdF9hdHRycyIsICJhdHRyaWJ1dGVzIiB9LAotCXsgInN0X29idHlwZSIsICJvYmplY3QgdHlwZSIgfSwKLQl7IDAgfQorICAgIHsgInN0X21vZGUiLCAgInByb3RlY3Rpb24gYml0cyIgfSwKKyAgICB7ICJzdF9pbm8iLCAgICJpbm9kZSIgfSwKKyAgICB7ICJzdF9kZXYiLCAgICJkZXZpY2UiIH0sCisgICAgeyAic3RfbmxpbmsiLCAibnVtYmVyIG9mIGhhcmQgbGlua3MiIH0sCisgICAgeyAic3RfdWlkIiwgICAidXNlciBJRCBvZiBvd25lciIgfSwKKyAgICB7ICJzdF9naWQiLCAgICJncm91cCBJRCBvZiBvd25lciIgfSwKKyAgICB7ICJzdF9zaXplIiwgICJ0b3RhbCBzaXplLCBpbiBieXRlcyIgfSwKKyAgICB7ICJzdF9hdGltZSIsICJ0aW1lIG9mIGxhc3QgYWNjZXNzIiB9LAorICAgIHsgInN0X210aW1lIiwgInRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24iIH0sCisgICAgeyAic3RfY3RpbWUiLCAidGltZSBvZiBsYXN0IGNoYW5nZSIgfSwKKyAgICB7ICJzdF9mdHlwZSIsICJmaWxlIHR5cGUiIH0sCisgICAgeyAic3RfYXR0cnMiLCAiYXR0cmlidXRlcyIgfSwKKyAgICB7ICJzdF9vYnR5cGUiLCAib2JqZWN0IHR5cGUiIH0sCisgICAgeyAwIH0KIH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2Mgc3RhdF9yZXN1bHRfZGVzYyA9IHsKLQkicmlzY29zLnN0YXRfcmVzdWx0IiwKLQlzdGF0X3Jlc3VsdF9fZG9jX18sCi0Jc3RhdF9yZXN1bHRfZmllbGRzLAotCTEzCisgICAgInJpc2Nvcy5zdGF0X3Jlc3VsdCIsCisgICAgc3RhdF9yZXN1bHRfX2RvY19fLAorICAgIHN0YXRfcmVzdWx0X2ZpZWxkcywKKyAgICAxMwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBTdGF0UmVzdWx0VHlwZTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJpc2Nvc19zdGF0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsJCi0JUHlPYmplY3QgKnY7Ci0JY2hhciAqcGF0aDsKLSAgICAgICAgaW50IG9iLGxlbjsKLSAgICAgICAgYml0cyB0PTA7Ci0gICAgICAgIGJpdHMgbGQsZXgsYXQsZnQsbW9kZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6c3RhdCIsICZwYXRoKSkgcmV0dXJuIE5VTEw7Ci0JZT14b3NmaWxlX3JlYWRfc3RhbXBlZF9ub19wYXRoKHBhdGgsJm9iLCZsZCwmZXgsJmxlbiwmYXQsJmZ0KTsKLQlpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKLQlzd2l0Y2ggKG9iKQotCXsgY2FzZSBvc2ZpbGVfSVNfRklMRTptb2RlPTAxMDAwMDA7YnJlYWs7ICAvKiBPQ1RBTCAqLwotCSAgY2FzZSBvc2ZpbGVfSVNfRElSOm1vZGU9MDQwMDAwO2JyZWFrOwotCSAgY2FzZSBvc2ZpbGVfSVNfSU1BR0U6bW9kZT0wMTQwMDAwO2JyZWFrOwotCSAgZGVmYXVsdDpyZXR1cm4gcmlzY29zX2Vycm9yKCJOb3QgZm91bmQiKTsKLQl9Ci0JaWYoZnQhPS0xKSB0PXVuaXh0aW1lKGxkLGV4KTsKLQltb2RlfD0oYXQmNyk8PDY7Ci0JbW9kZXw9KChhdCYxMTIpKjkpPj40OworeworICAgIFB5T2JqZWN0ICp2OworICAgIGNoYXIgKnBhdGg7CisgICAgaW50IG9iLGxlbjsKKyAgICBiaXRzIHQ9MDsKKyAgICBiaXRzIGxkLGV4LGF0LGZ0LG1vZGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnN0YXQiLCAmcGF0aCkpIHJldHVybiBOVUxMOworICAgIGU9eG9zZmlsZV9yZWFkX3N0YW1wZWRfbm9fcGF0aChwYXRoLCZvYiwmbGQsJmV4LCZsZW4sJmF0LCZmdCk7CisgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgc3dpdGNoIChvYikKKyAgICB7IGNhc2Ugb3NmaWxlX0lTX0ZJTEU6bW9kZT0wMTAwMDAwO2JyZWFrOyAgLyogT0NUQUwgKi8KKyAgICAgIGNhc2Ugb3NmaWxlX0lTX0RJUjptb2RlPTA0MDAwMDticmVhazsKKyAgICAgIGNhc2Ugb3NmaWxlX0lTX0lNQUdFOm1vZGU9MDE0MDAwMDticmVhazsKKyAgICAgIGRlZmF1bHQ6cmV0dXJuIHJpc2Nvc19lcnJvcigiTm90IGZvdW5kIik7CisgICAgfQorICAgIGlmKGZ0IT0tMSkgdD11bml4dGltZShsZCxleCk7CisgICAgbW9kZXw9KGF0JjcpPDw2OworICAgIG1vZGV8PSgoYXQmMTEyKSo5KT4+NDsKIAotCXYgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RhdFJlc3VsdFR5cGUpOworICAgIHYgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RhdFJlc3VsdFR5cGUpOwogCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAwLCAKLQkJCQkgIFB5SW50X0Zyb21Mb25nKChsb25nKSBtb2RlKSk7IC8qc3RfbW9kZSovCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X2lubyovCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAyLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X2RldiovCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAzLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X25saW5rKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDQsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfdWlkKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDUsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfZ2lkKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDYsIAotCQkJCSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGxlbikpOyAvKnN0X3NpemUqLwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNywgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHQpKTsgLypzdF9hdGltZSovCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA4LCBQeUludF9Gcm9tTG9uZygobG9uZykgdCkpOyAvKnN0X210aW1lKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDksIFB5SW50X0Zyb21Mb25nKChsb25nKSB0KSk7IC8qc3RfY3RpbWUqLwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMTAsIAotCQkJCSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZ0KSk7IC8qZmlsZSB0eXBlKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDExLCAKLQkJCQkgIFB5SW50X0Zyb21Mb25nKChsb25nKSBhdCkpOyAvKmF0dHJpYnV0ZXMqLwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMTIsIAotCQkJCSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIG9iKSk7IC8qb2JqZWN0IHR5cGUqLworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKChsb25nKSBtb2RlKSk7IC8qc3RfbW9kZSovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X2lubyovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAyLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X2RldiovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAzLCBQeUludF9Gcm9tTG9uZygobG9uZykgMCkpOyAvKnN0X25saW5rKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDQsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfdWlkKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDUsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfZ2lkKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZygobG9uZykgbGVuKSk7IC8qc3Rfc2l6ZSovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA3LCBQeUludF9Gcm9tTG9uZygobG9uZykgdCkpOyAvKnN0X2F0aW1lKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDgsIFB5SW50X0Zyb21Mb25nKChsb25nKSB0KSk7IC8qc3RfbXRpbWUqLworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgOSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHQpKTsgLypzdF9jdGltZSovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKChsb25nKSBmdCkpOyAvKmZpbGUgdHlwZSovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKChsb25nKSBhdCkpOyAvKmF0dHJpYnV0ZXMqLworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZygobG9uZykgb2IpKTsgLypvYmplY3QgdHlwZSovCiAKLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgICAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJpc2Nvc19jaG1vZChQeU9iamVjdCAqc2VsZixQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoOworICAgIGNoYXIgKnBhdGg7CiAgICAgYml0cyBtb2RlOwogICAgIGJpdHMgYXR0cjsKICAgICBhdHRyPShtb2RlJjB4NzAwKT4+ODsKICAgICBhdHRyfD0obW9kZSY3KTw8NDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpOmNobW9kIiwgJnBhdGgsKGludCopJm1vZGUpKSByZXR1cm4gTlVMTDsKLSAgICAgICAgZT14b3NmaWxlX3dyaXRlX2F0dHIocGF0aCxhdHRyKTsKLSAgICAgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2k6Y2htb2QiLCAmcGF0aCwoaW50KikmbW9kZSkpIHJldHVybiBOVUxMOworICAgIGU9eG9zZmlsZV93cml0ZV9hdHRyKHBhdGgsYXR0cik7CisgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3NfdXRpbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhdGg7Ci0JbG9uZyBhdGltZSwgbXRpbWU7Ci0JUHlPYmplY3QqIGFyZzsKKyAgICBjaGFyICpwYXRoOworICAgIGxvbmcgYXRpbWUsIG10aW1lOworICAgIFB5T2JqZWN0KiBhcmc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOnV0aW1lIiwgJnBhdGgsICZhcmcpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOnV0aW1lIiwgJnBhdGgsICZhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChhcmcgPT0gUHlfTm9uZSkgewotCQkvKiBvcHRpb25hbCB0aW1lIHZhbHVlcyBub3QgZ2l2ZW4gKi8KLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQllPXhvc2ZpbGVfc3RhbXAocGF0aCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0gICAgICAgIAlpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKLQl9Ci0JZWxzZSBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIihsbCkiLCAmYXRpbWUsICZtdGltZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidXRpbWUoKSBhcmcgMiBtdXN0IGJlIGEgdHVwbGUgKGF0aW1lLCBtdGltZSkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCSAgICAgICAgLyogY2F0YWxvZ3VlIGluZm8qLwotCSAgICAgICAgZmlsZXN3aXRjaF9vYmplY3RfdHlwZSBvYmpfdHlwZTsKLQkgICAgICAgIGJpdHMgbG9hZF9hZGRyLCBleGVjX2FkZHI7Ci0JICAgICAgICBpbnQgc2l6ZTsKLQkgICAgICAgIGZpbGVzd2l0Y2hfYXR0ciBhdHRyOworICAgIGlmIChhcmcgPT0gUHlfTm9uZSkgeworICAgICAgICAvKiBvcHRpb25hbCB0aW1lIHZhbHVlcyBub3QgZ2l2ZW4gKi8KKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBlPXhvc2ZpbGVfc3RhbXAocGF0aCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOworICAgIH0KKyAgICBlbHNlIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiKGxsKSIsICZhdGltZSwgJm10aW1lKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInV0aW1lKCkgYXJnIDIgbXVzdCBiZSBhIHR1cGxlIChhdGltZSwgbXRpbWUpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogY2F0YWxvZ3VlIGluZm8qLworICAgICAgICBmaWxlc3dpdGNoX29iamVjdF90eXBlIG9ial90eXBlOworICAgICAgICBiaXRzIGxvYWRfYWRkciwgZXhlY19hZGRyOworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgZmlsZXN3aXRjaF9hdHRyIGF0dHI7CiAKLQkJLyogcmVhZCBvbGQgY2F0YWxvZ3VlIGluZm8gKi8KLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQllPXhvc2ZpbGVfcmVhZF9ub19wYXRoKHBhdGgsICZvYmpfdHlwZSwgJmxvYWRfYWRkciwgJmV4ZWNfYWRkciwgJnNpemUsICZhdHRyKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkgICAgICAgIGlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOworICAgICAgICAvKiByZWFkIG9sZCBjYXRhbG9ndWUgaW5mbyAqLworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGU9eG9zZmlsZV9yZWFkX25vX3BhdGgocGF0aCwgJm9ial90eXBlLCAmbG9hZF9hZGRyLCAmZXhlY19hZGRyLCAmc2l6ZSwgJmF0dHIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKIAotCQkvKiBjaGVjayBpZiBsb2FkIGFuZCBleGVjIGFkZHJlc3MgcmVhbGx5IGNvbnRhaW4gZmlsZXR5cGUgYW5kIGRhdGUgKi8KLQkJaWYgKCAobG9hZF9hZGRyICYgMHhGRkYwMDAwMFUpICE9IDB4RkZGMDAwMDBVKQotCQkJcmV0dXJuIHJpc2Nvc19lcnJvcigiY2FuJ3Qgc2V0IGRhdGUgZm9yIG9iamVjdCB3aXRoIGxvYWQgYW5kIGV4ZWMgYWRkcmVzc2VzIik7CisgICAgICAgIC8qIGNoZWNrIGlmIGxvYWQgYW5kIGV4ZWMgYWRkcmVzcyByZWFsbHkgY29udGFpbiBmaWxldHlwZSBhbmQgZGF0ZSAqLworICAgICAgICBpZiAoIChsb2FkX2FkZHIgJiAweEZGRjAwMDAwVSkgIT0gMHhGRkYwMDAwMFUpCisgICAgICAgICAgICByZXR1cm4gcmlzY29zX2Vycm9yKCJjYW4ndCBzZXQgZGF0ZSBmb3Igb2JqZWN0IHdpdGggbG9hZCBhbmQgZXhlYyBhZGRyZXNzZXMiKTsKIAotCSAgICAgICAgLyogY29udmVydCBhcmd1bWVudCBtdGltZSB0byBSSVNDIE9TIGxvYWQgYW5kIGV4ZWMgYWRkcmVzcyAqLwotCSAgICAgICAgaWYoYWNvcm50aW1lKCZleGVjX2FkZHIsICZsb2FkX2FkZHIsICh0aW1lX3QpIG10aW1lKSkKLQkgICAgICAgIAlyZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKKyAgICAgICAgLyogY29udmVydCBhcmd1bWVudCBtdGltZSB0byBSSVNDIE9TIGxvYWQgYW5kIGV4ZWMgYWRkcmVzcyAqLworICAgICAgICBpZihhY29ybnRpbWUoJmV4ZWNfYWRkciwgJmxvYWRfYWRkciwgKHRpbWVfdCkgbXRpbWUpKQorICAgICAgICAgICAgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CiAKLQkJLyogd3JpdGUgbmV3IGxvYWQgYW5kIGV4ZWMgYWRkcmVzcyAqLwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWUgPSB4b3NmaWxlX3dyaXRlKHBhdGgsIGxvYWRfYWRkciwgZXhlY19hZGRyLCBhdHRyKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkgICAgICAgIGlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOwotCX0KKyAgICAgICAgLyogd3JpdGUgbmV3IGxvYWQgYW5kIGV4ZWMgYWRkcmVzcyAqLworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGUgPSB4b3NmaWxlX3dyaXRlKHBhdGgsIGxvYWRfYWRkciwgZXhlY19hZGRyLCBhdHRyKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJpc2Nvc19zZXR0eXBlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoLCpuYW1lOworICAgIGNoYXIgKnBhdGgsKm5hbWU7CiAgICAgaW50IHR5cGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaTpzZXR0eXBlIiwgJnBhdGgsJnR5cGUpKQotCXsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpOnNldHR5cGUiLCAmcGF0aCwmdHlwZSkpCisgICAgewogICAgICAgUHlFcnJfQ2xlYXIoKTsKLQkgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6c2V0dHlwZSIsICZwYXRoLCZuYW1lKSkgcmV0dXJuIE5VTEw7Ci0JICBlPXhvc2ZzY29udHJvbF9maWxlX3R5cGVfZnJvbV9zdHJpbmcobmFtZSwoYml0cyopJnR5cGUpOwotCSAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7Ci0JfQorICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpzZXR0eXBlIiwgJnBhdGgsJm5hbWUpKSByZXR1cm4gTlVMTDsKKyAgICAgIGU9eG9zZnNjb250cm9sX2ZpbGVfdHlwZV9mcm9tX3N0cmluZyhuYW1lLChiaXRzKikmdHlwZSk7CisgICAgICBpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKKyAgICB9CiAgICAgZT14b3NmaWxlX3NldF90eXBlKHBhdGgsdHlwZSk7CiAgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTM2OCw3ICszNjgsNyBAQAogICBpZiAoIWRpY3QpIHJldHVybiBOVUxMOwogICAvKiBYWFggVGhpcyBwYXJ0IGlnbm9yZXMgZXJyb3JzICovCiAgIHdoaWxlKCF4b3NfcmVhZF92YXJfdmFsKHdoaWNoLHZhbHVlLHNpemVvZih2YWx1ZSktMSwoaW50KWNvbnRleHQsCi0gICAgICAgICBvc19WQVJUWVBFX0VYUEFOREVELCZzaXplLChpbnQgKikmY29udGV4dCwwKSkKKyAgICAgb3NfVkFSVFlQRV9FWFBBTkRFRCwmc2l6ZSwoaW50ICopJmNvbnRleHQsMCkpCiAgIHsgUHlPYmplY3QgKnY7CiAgICAgdmFsdWVbc2l6ZV09J1wwJzsKICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWx1ZSk7CkBAIC0zODEsMzIgKzM4MSwzMiBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYgcmlzY29zX21ldGhvZHNbXSA9IHsKIAotCXsidW5saW5rIiwJcmlzY29zX3JlbW92ZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InVubGluayIsICAgICAgICAgIHJpc2Nvc19yZW1vdmUsIE1FVEhfVkFSQVJHU30sCiAgICAgeyJyZW1vdmUiLCAgcmlzY29zX3JlbW92ZSwgTUVUSF9WQVJBUkdTfSwKLQl7InJlbmFtZSIsCXJpc2Nvc19yZW5hbWUsIE1FVEhfVkFSQVJHU30sCi0JeyJzeXN0ZW0iLAlyaXNjb3Nfc3lzdGVtLCBNRVRIX1ZBUkFSR1N9LAotCXsicm1kaXIiLAlyaXNjb3NfcmVtb3ZlLCBNRVRIX1ZBUkFSR1N9LAotCXsiY2hkaXIiLAlyaXNjb3NfY2hkaXIsICBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0Y3dkIiwJcmlzY29zX2dldGN3ZCwgTUVUSF9OT0FSR1N9LAotCXsiZXhwYW5kIiwgIHJpc2Nvc19leHBhbmQsIE1FVEhfVkFSQVJHU30sCi0JeyJta2RpciIsCXJpc2Nvc19ta2RpciwgIE1FVEhfVkFSQVJHU30sCi0JeyJsaXN0ZGlyIiwJcmlzY29zX2xpc3RkaXIsIE1FVEhfVkFSQVJHU30sCi0JeyJzdGF0IiwJcmlzY29zX3N0YXQsICAgTUVUSF9WQVJBUkdTfSwKLQl7ImxzdGF0IiwJcmlzY29zX3N0YXQsICAgTUVUSF9WQVJBUkdTfSwKLSAgICB7ImNobW9kIiwJcmlzY29zX2NobW9kLCAgTUVUSF9WQVJBUkdTfSwKLQl7InV0aW1lIiwJcmlzY29zX3V0aW1lLCAgTUVUSF9WQVJBUkdTfSwKLQl7InNldHR5cGUiLAlyaXNjb3Nfc2V0dHlwZSwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGVudiIsICByaXNjb3NfZ2V0ZW52LCBNRVRIX1ZBUkFSR1N9LAotCXsicHV0ZW52IiwgIHJpc2Nvc19wdXRlbnYsIE1FVEhfVkFSQVJHU30sCi0JeyJkZWxlbnYiLCAgcmlzY29zX2RlbGVudiwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGVudmRpY3QiLCByaXNjb3NfZ2V0ZW52ZGljdCwgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCU5VTEx9CQkgLyogU2VudGluZWwgKi8KKyAgICB7InJlbmFtZSIsICAgICAgICAgIHJpc2Nvc19yZW5hbWUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJzeXN0ZW0iLCAgICAgICAgICByaXNjb3Nfc3lzdGVtLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicm1kaXIiLCAgICAgICAgICAgcmlzY29zX3JlbW92ZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNoZGlyIiwgICAgICAgICAgIHJpc2Nvc19jaGRpciwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRjd2QiLCAgICAgICAgICByaXNjb3NfZ2V0Y3dkLCBNRVRIX05PQVJHU30sCisgICAgeyJleHBhbmQiLCAgcmlzY29zX2V4cGFuZCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1rZGlyIiwgICAgICAgICAgIHJpc2Nvc19ta2RpciwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJsaXN0ZGlyIiwgICAgICAgICByaXNjb3NfbGlzdGRpciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InN0YXQiLCAgICAgICAgICAgIHJpc2Nvc19zdGF0LCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJsc3RhdCIsICAgICAgICAgICByaXNjb3Nfc3RhdCwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY2htb2QiLCAgIHJpc2Nvc19jaG1vZCwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGltZSIsICAgICAgICAgICByaXNjb3NfdXRpbWUsICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0dHlwZSIsICAgICAgICAgcmlzY29zX3NldHR5cGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRlbnYiLCAgcmlzY29zX2dldGVudiwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InB1dGVudiIsICByaXNjb3NfcHV0ZW52LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZGVsZW52IiwgIHJpc2Nvc19kZWxlbnYsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRlbnZkaWN0IiwgcmlzY29zX2dldGVudmRpY3QsIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgaW50CiBpbnMoUHlPYmplY3QgKm1vZHVsZSwgY2hhciAqc3ltYm9sLCBsb25nIHZhbHVlKQogewotCXJldHVybiBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsIHN5bWJvbCwgdmFsdWUpOworICAgIHJldHVybiBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsIHN5bWJvbCwgdmFsdWUpOwogfQogCiAKQEAgLTQxNCwxOTAgKzQxNCwxOTAgQEAKIGFsbF9pbnMoUHlPYmplY3QgKmQpCiB7CiAjaWZkZWYgRl9PSwotICAgICAgICBpZiAoaW5zKGQsICJGX09LIiwgKGxvbmcpRl9PSykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX09LIiwgKGxvbmcpRl9PSykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIFJfT0sKLSAgICAgICAgaWYgKGlucyhkLCAiUl9PSyIsIChsb25nKVJfT0spKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiUl9PSyIsIChsb25nKVJfT0spKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBXX09LCi0gICAgICAgIGlmIChpbnMoZCwgIldfT0siLCAobG9uZylXX09LKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIldfT0siLCAobG9uZylXX09LKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgWF9PSwotICAgICAgICBpZiAoaW5zKGQsICJYX09LIiwgKGxvbmcpWF9PSykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJYX09LIiwgKGxvbmcpWF9PSykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE5HUk9VUFNfTUFYCi0gICAgICAgIGlmIChpbnMoZCwgIk5HUk9VUFNfTUFYIiwgKGxvbmcpTkdST1VQU19NQVgpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiTkdST1VQU19NQVgiLCAobG9uZylOR1JPVVBTX01BWCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIFRNUF9NQVgKLSAgICAgICAgaWYgKGlucyhkLCAiVE1QX01BWCIsIChsb25nKVRNUF9NQVgpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiVE1QX01BWCIsIChsb25nKVRNUF9NQVgpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBXQ09OVElOVUVECi0gICAgICAgIGlmIChpbnMoZCwgIldDT05USU5VRUQiLCAobG9uZylXQ09OVElOVUVEKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIldDT05USU5VRUQiLCAobG9uZylXQ09OVElOVUVEKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgV05PSEFORwotICAgICAgICBpZiAoaW5zKGQsICJXTk9IQU5HIiwgKGxvbmcpV05PSEFORykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJXTk9IQU5HIiwgKGxvbmcpV05PSEFORykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIFdVTlRSQUNFRAotICAgICAgICBpZiAoaW5zKGQsICJXVU5UUkFDRUQiLCAobG9uZylXVU5UUkFDRUQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiV1VOVFJBQ0VEIiwgKGxvbmcpV1VOVFJBQ0VEKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19SRE9OTFkKLSAgICAgICAgaWYgKGlucyhkLCAiT19SRE9OTFkiLCAobG9uZylPX1JET05MWSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX1JET05MWSIsIChsb25nKU9fUkRPTkxZKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19XUk9OTFkKLSAgICAgICAgaWYgKGlucyhkLCAiT19XUk9OTFkiLCAobG9uZylPX1dST05MWSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX1dST05MWSIsIChsb25nKU9fV1JPTkxZKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19SRFdSCi0gICAgICAgIGlmIChpbnMoZCwgIk9fUkRXUiIsIChsb25nKU9fUkRXUikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX1JEV1IiLCAobG9uZylPX1JEV1IpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX05ERUxBWQotICAgICAgICBpZiAoaW5zKGQsICJPX05ERUxBWSIsIChsb25nKU9fTkRFTEFZKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fTkRFTEFZIiwgKGxvbmcpT19OREVMQVkpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX05PTkJMT0NLCi0gICAgICAgIGlmIChpbnMoZCwgIk9fTk9OQkxPQ0siLCAobG9uZylPX05PTkJMT0NLKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fTk9OQkxPQ0siLCAobG9uZylPX05PTkJMT0NLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19BUFBFTkQKLSAgICAgICAgaWYgKGlucyhkLCAiT19BUFBFTkQiLCAobG9uZylPX0FQUEVORCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX0FQUEVORCIsIChsb25nKU9fQVBQRU5EKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19EU1lOQwotICAgICAgICBpZiAoaW5zKGQsICJPX0RTWU5DIiwgKGxvbmcpT19EU1lOQykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX0RTWU5DIiwgKGxvbmcpT19EU1lOQykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fUlNZTkMKLSAgICAgICAgaWYgKGlucyhkLCAiT19SU1lOQyIsIChsb25nKU9fUlNZTkMpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19SU1lOQyIsIChsb25nKU9fUlNZTkMpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1NZTkMKLSAgICAgICAgaWYgKGlucyhkLCAiT19TWU5DIiwgKGxvbmcpT19TWU5DKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fU1lOQyIsIChsb25nKU9fU1lOQykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fTk9DVFRZCi0gICAgICAgIGlmIChpbnMoZCwgIk9fTk9DVFRZIiwgKGxvbmcpT19OT0NUVFkpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19OT0NUVFkiLCAobG9uZylPX05PQ1RUWSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fQ1JFQVQKLSAgICAgICAgaWYgKGlucyhkLCAiT19DUkVBVCIsIChsb25nKU9fQ1JFQVQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19DUkVBVCIsIChsb25nKU9fQ1JFQVQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX0VYQ0wKLSAgICAgICAgaWYgKGlucyhkLCAiT19FWENMIiwgKGxvbmcpT19FWENMKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fRVhDTCIsIChsb25nKU9fRVhDTCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fVFJVTkMKLSAgICAgICAgaWYgKGlucyhkLCAiT19UUlVOQyIsIChsb25nKU9fVFJVTkMpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19UUlVOQyIsIChsb25nKU9fVFJVTkMpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX0JJTkFSWQotICAgICAgICBpZiAoaW5zKGQsICJPX0JJTkFSWSIsIChsb25nKU9fQklOQVJZKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fQklOQVJZIiwgKGxvbmcpT19CSU5BUlkpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1RFWFQKLSAgICAgICAgaWYgKGlucyhkLCAiT19URVhUIiwgKGxvbmcpT19URVhUKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fVEVYVCIsIChsb25nKU9fVEVYVCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fTEFSR0VGSUxFCi0gICAgICAgIGlmIChpbnMoZCwgIk9fTEFSR0VGSUxFIiwgKGxvbmcpT19MQVJHRUZJTEUpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19MQVJHRUZJTEUiLCAobG9uZylPX0xBUkdFRklMRSkpIHJldHVybiAtMTsKICNlbmRpZgogCiAvKiBNUyBXaW5kb3dzICovCiAjaWZkZWYgT19OT0lOSEVSSVQKLQkvKiBEb24ndCBpbmhlcml0IGluIGNoaWxkIHByb2Nlc3Nlcy4gKi8KLSAgICAgICAgaWYgKGlucyhkLCAiT19OT0lOSEVSSVQiLCAobG9uZylPX05PSU5IRVJJVCkpIHJldHVybiAtMTsKKyAgICAvKiBEb24ndCBpbmhlcml0IGluIGNoaWxkIHByb2Nlc3Nlcy4gKi8KKyAgICBpZiAoaW5zKGQsICJPX05PSU5IRVJJVCIsIChsb25nKU9fTk9JTkhFUklUKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgX09fU0hPUlRfTElWRUQKLQkvKiBPcHRpbWl6ZSBmb3Igc2hvcnQgbGlmZSAoa2VlcCBpbiBtZW1vcnkpLiAqLwotCS8qIE1TIGZvcmdvdCB0byBkZWZpbmUgdGhpcyBvbmUgd2l0aCBhIG5vbi11bmRlcnNjb3JlIGZvcm0gdG9vLiAqLwotICAgICAgICBpZiAoaW5zKGQsICJPX1NIT1JUX0xJVkVEIiwgKGxvbmcpX09fU0hPUlRfTElWRUQpKSByZXR1cm4gLTE7CisgICAgLyogT3B0aW1pemUgZm9yIHNob3J0IGxpZmUgKGtlZXAgaW4gbWVtb3J5KS4gKi8KKyAgICAvKiBNUyBmb3Jnb3QgdG8gZGVmaW5lIHRoaXMgb25lIHdpdGggYSBub24tdW5kZXJzY29yZSBmb3JtIHRvby4gKi8KKyAgICBpZiAoaW5zKGQsICJPX1NIT1JUX0xJVkVEIiwgKGxvbmcpX09fU0hPUlRfTElWRUQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1RFTVBPUkFSWQotCS8qIEF1dG9tYXRpY2FsbHkgZGVsZXRlIHdoZW4gbGFzdCBoYW5kbGUgaXMgY2xvc2VkLiAqLwotICAgICAgICBpZiAoaW5zKGQsICJPX1RFTVBPUkFSWSIsIChsb25nKU9fVEVNUE9SQVJZKSkgcmV0dXJuIC0xOworICAgIC8qIEF1dG9tYXRpY2FsbHkgZGVsZXRlIHdoZW4gbGFzdCBoYW5kbGUgaXMgY2xvc2VkLiAqLworICAgIGlmIChpbnMoZCwgIk9fVEVNUE9SQVJZIiwgKGxvbmcpT19URU1QT1JBUlkpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1JBTkRPTQotCS8qIE9wdGltaXplIGZvciByYW5kb20gYWNjZXNzLiAqLwotICAgICAgICBpZiAoaW5zKGQsICJPX1JBTkRPTSIsIChsb25nKU9fUkFORE9NKSkgcmV0dXJuIC0xOworICAgIC8qIE9wdGltaXplIGZvciByYW5kb20gYWNjZXNzLiAqLworICAgIGlmIChpbnMoZCwgIk9fUkFORE9NIiwgKGxvbmcpT19SQU5ET00pKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1NFUVVFTlRJQUwKLQkvKiBPcHRpbWl6ZSBmb3Igc2VxdWVudGlhbCBhY2Nlc3MuICovCi0gICAgICAgIGlmIChpbnMoZCwgIk9fU0VRVUVOVElBTCIsIChsb25nKU9fU0VRVUVOVElBTCkpIHJldHVybiAtMTsKKyAgICAvKiBPcHRpbWl6ZSBmb3Igc2VxdWVudGlhbCBhY2Nlc3MuICovCisgICAgaWYgKGlucyhkLCAiT19TRVFVRU5USUFMIiwgKGxvbmcpT19TRVFVRU5USUFMKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKIC8qIEdOVSBleHRlbnNpb25zLiAqLwogI2lmZGVmIE9fRElSRUNUCi0gICAgICAgIC8qIERpcmVjdCBkaXNrIGFjY2Vzcy4gKi8KLSAgICAgICAgaWYgKGlucyhkLCAiT19ESVJFQ1QiLCAobG9uZylPX0RJUkVDVCkpIHJldHVybiAtMTsKKyAgICAvKiBEaXJlY3QgZGlzayBhY2Nlc3MuICovCisgICAgaWYgKGlucyhkLCAiT19ESVJFQ1QiLCAobG9uZylPX0RJUkVDVCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fRElSRUNUT1JZCi0gICAgICAgIC8qIE11c3QgYmUgYSBkaXJlY3RvcnkuCSAqLwotICAgICAgICBpZiAoaW5zKGQsICJPX0RJUkVDVE9SWSIsIChsb25nKU9fRElSRUNUT1JZKSkgcmV0dXJuIC0xOworICAgIC8qIE11c3QgYmUgYSBkaXJlY3RvcnkuICAgICAgKi8KKyAgICBpZiAoaW5zKGQsICJPX0RJUkVDVE9SWSIsIChsb25nKU9fRElSRUNUT1JZKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19OT0ZPTExPVwotICAgICAgICAvKiBEbyBub3QgZm9sbG93IGxpbmtzLgkgKi8KLSAgICAgICAgaWYgKGlucyhkLCAiT19OT0ZPTExPVyIsIChsb25nKU9fTk9GT0xMT1cpKSByZXR1cm4gLTE7CisgICAgLyogRG8gbm90IGZvbGxvdyBsaW5rcy4gICAgICAqLworICAgIGlmIChpbnMoZCwgIk9fTk9GT0xMT1ciLCAobG9uZylPX05PRk9MTE9XKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKLQkvKiBUaGVzZSBjb21lIGZyb20gc3lzZXhpdHMuaCAqLworICAgIC8qIFRoZXNlIGNvbWUgZnJvbSBzeXNleGl0cy5oICovCiAjaWZkZWYgRVhfT0sKLQlpZiAoaW5zKGQsICJFWF9PSyIsIChsb25nKUVYX09LKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX09LIiwgKGxvbmcpRVhfT0spKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfT0sgKi8KICNpZmRlZiBFWF9VU0FHRQotCWlmIChpbnMoZCwgIkVYX1VTQUdFIiwgKGxvbmcpRVhfVVNBR0UpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfVVNBR0UiLCAobG9uZylFWF9VU0FHRSkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9VU0FHRSAqLwogI2lmZGVmIEVYX0RBVEFFUlIKLQlpZiAoaW5zKGQsICJFWF9EQVRBRVJSIiwgKGxvbmcpRVhfREFUQUVSUikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9EQVRBRVJSIiwgKGxvbmcpRVhfREFUQUVSUikpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9EQVRBRVJSICovCiAjaWZkZWYgRVhfTk9JTlBVVAotCWlmIChpbnMoZCwgIkVYX05PSU5QVVQiLCAobG9uZylFWF9OT0lOUFVUKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX05PSU5QVVQiLCAobG9uZylFWF9OT0lOUFVUKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX05PSU5QVVQgKi8KICNpZmRlZiBFWF9OT1VTRVIKLQlpZiAoaW5zKGQsICJFWF9OT1VTRVIiLCAobG9uZylFWF9OT1VTRVIpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfTk9VU0VSIiwgKGxvbmcpRVhfTk9VU0VSKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX05PVVNFUiAqLwogI2lmZGVmIEVYX05PSE9TVAotCWlmIChpbnMoZCwgIkVYX05PSE9TVCIsIChsb25nKUVYX05PSE9TVCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9OT0hPU1QiLCAobG9uZylFWF9OT0hPU1QpKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfTk9IT1NUICovCiAjaWZkZWYgRVhfVU5BVkFJTEFCTEUKLQlpZiAoaW5zKGQsICJFWF9VTkFWQUlMQUJMRSIsIChsb25nKUVYX1VOQVZBSUxBQkxFKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX1VOQVZBSUxBQkxFIiwgKGxvbmcpRVhfVU5BVkFJTEFCTEUpKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfVU5BVkFJTEFCTEUgKi8KICNpZmRlZiBFWF9TT0ZUV0FSRQotCWlmIChpbnMoZCwgIkVYX1NPRlRXQVJFIiwgKGxvbmcpRVhfU09GVFdBUkUpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfU09GVFdBUkUiLCAobG9uZylFWF9TT0ZUV0FSRSkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9TT0ZUV0FSRSAqLwogI2lmZGVmIEVYX09TRVJSCi0JaWYgKGlucyhkLCAiRVhfT1NFUlIiLCAobG9uZylFWF9PU0VSUikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9PU0VSUiIsIChsb25nKUVYX09TRVJSKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX09TRVJSICovCiAjaWZkZWYgRVhfT1NGSUxFCi0JaWYgKGlucyhkLCAiRVhfT1NGSUxFIiwgKGxvbmcpRVhfT1NGSUxFKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX09TRklMRSIsIChsb25nKUVYX09TRklMRSkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9PU0ZJTEUgKi8KICNpZmRlZiBFWF9DQU5UQ1JFQVQKLQlpZiAoaW5zKGQsICJFWF9DQU5UQ1JFQVQiLCAobG9uZylFWF9DQU5UQ1JFQVQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfQ0FOVENSRUFUIiwgKGxvbmcpRVhfQ0FOVENSRUFUKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX0NBTlRDUkVBVCAqLwogI2lmZGVmIEVYX0lPRVJSCi0JaWYgKGlucyhkLCAiRVhfSU9FUlIiLCAobG9uZylFWF9JT0VSUikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9JT0VSUiIsIChsb25nKUVYX0lPRVJSKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX0lPRVJSICovCiAjaWZkZWYgRVhfVEVNUEZBSUwKLQlpZiAoaW5zKGQsICJFWF9URU1QRkFJTCIsIChsb25nKUVYX1RFTVBGQUlMKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX1RFTVBGQUlMIiwgKGxvbmcpRVhfVEVNUEZBSUwpKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfVEVNUEZBSUwgKi8KICNpZmRlZiBFWF9QUk9UT0NPTAotCWlmIChpbnMoZCwgIkVYX1BST1RPQ09MIiwgKGxvbmcpRVhfUFJPVE9DT0wpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfUFJPVE9DT0wiLCAobG9uZylFWF9QUk9UT0NPTCkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9QUk9UT0NPTCAqLwogI2lmZGVmIEVYX05PUEVSTQotCWlmIChpbnMoZCwgIkVYX05PUEVSTSIsIChsb25nKUVYX05PUEVSTSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9OT1BFUk0iLCAobG9uZylFWF9OT1BFUk0pKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfTk9QRVJNICovCiAjaWZkZWYgRVhfQ09ORklHCi0JaWYgKGlucyhkLCAiRVhfQ09ORklHIiwgKGxvbmcpRVhfQ09ORklHKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX0NPTkZJRyIsIChsb25nKUVYX0NPTkZJRykpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9DT05GSUcgKi8KICNpZmRlZiBFWF9OT1RGT1VORAotCWlmIChpbnMoZCwgIkVYX05PVEZPVU5EIiwgKGxvbmcpRVhfTk9URk9VTkQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfTk9URk9VTkQiLCAobG9uZylFWF9OT1RGT1VORCkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9OT1RGT1VORCAqLwogCi0gICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKIHZvaWQKIGluaXRyaXNjb3MoKQogewotCVB5T2JqZWN0ICptLCAqZCwgKnN0YXRfbTsKKyAgICBQeU9iamVjdCAqbSwgKmQsICpzdGF0X207CiAKLQltID0gUHlfSW5pdE1vZHVsZSgicmlzY29zIiwgcmlzY29zX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJyaXNjb3MiLCByaXNjb3NfbWV0aG9kcyk7CiAKLQlpZiAoYWxsX2lucyhtKSkKLQkJcmV0dXJuOworICAgIGlmIChhbGxfaW5zKG0pKQorICAgICAgICByZXR1cm47CiAKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKIAotCVB5X0lOQ1JFRihQeUV4Y19PU0Vycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgUHlFeGNfT1NFcnJvcik7CisgICAgUHlfSU5DUkVGKFB5RXhjX09TRXJyb3IpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBQeUV4Y19PU0Vycm9yKTsKIAotCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRSZXN1bHRUeXBlLCAmc3RhdF9yZXN1bHRfZGVzYyk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInN0YXRfcmVzdWx0IiwgKFB5T2JqZWN0KikgJlN0YXRSZXN1bHRUeXBlKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0UmVzdWx0VHlwZSwgJnN0YXRfcmVzdWx0X2Rlc2MpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJzdGF0X3Jlc3VsdCIsIChQeU9iamVjdCopICZTdGF0UmVzdWx0VHlwZSk7CiB9CmRpZmYgLS1naXQgYS9SSVNDT1MvUHl0aG9uL2R5bmxvYWRfcmlzY29zLmMgYi9SSVNDT1MvUHl0aG9uL2R5bmxvYWRfcmlzY29zLmMKaW5kZXggNmI4N2YyZC4uOGVjYjI5ZCAxMDA2NDQKLS0tIGEvUklTQ09TL1B5dGhvbi9keW5sb2FkX3Jpc2Nvcy5jCisrKyBiL1JJU0NPUy9QeXRob24vZHlubG9hZF9yaXNjb3MuYwpAQCAtMzksOCArMzksOCBAQAogCiAKIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiW10gPSB7Ci0JeyIvcHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXswLCAwfQorICAgIHsiL3B5ZCIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7MCwgMH0KIH07CiAKIHZvaWQgZHlubG9hZF9pbml0X2R1bW15KCkKQEAgLTQ4LDE2ICs0OCwxNiBAQAogfQogCiBkbF9mdW5jcHRyIF9QeUltcG9ydF9HZXREeW5Mb2FkRnVuYyhjb25zdCBjaGFyICpmcW5hbWUsIGNvbnN0IGNoYXIgKnNob3J0bmFtZSwKLQkJCQkgICAgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQogewotCWludCBlcnI7Ci0JY2hhciBlcnJzdHJbMjU2XTsKLQl2b2lkICgqaW5pdF9mdW5jdGlvbikodm9pZCk7CisgICAgaW50IGVycjsKKyAgICBjaGFyIGVycnN0clsyNTZdOworICAgIHZvaWQgKCppbml0X2Z1bmN0aW9uKSh2b2lkKTsKIAotCWVyciA9IGRsa19sb2FkX25vX2luaXQocGF0aG5hbWUsICZpbml0X2Z1bmN0aW9uKTsKLQlpZiAoZXJyKSB7Ci0JICAgIFB5T1Nfc25wcmludGYoZXJyc3RyLCBzaXplb2YoZXJyc3RyKSwgImRsayBmYWlsdXJlICVkIiwgZXJyKTsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJzdHIpOwotCX0KLQlyZXR1cm4gaW5pdF9mdW5jdGlvbjsKKyAgICBlcnIgPSBkbGtfbG9hZF9ub19pbml0KHBhdGhuYW1lLCAmaW5pdF9mdW5jdGlvbik7CisgICAgaWYgKGVycikgeworICAgICAgICBQeU9TX3NucHJpbnRmKGVycnN0ciwgc2l6ZW9mKGVycnN0ciksICJkbGsgZmFpbHVyZSAlZCIsIGVycik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgZXJyc3RyKTsKKyAgICB9CisgICAgcmV0dXJuIGluaXRfZnVuY3Rpb247CiB9CmRpZmYgLS1naXQgYS9SSVNDT1Mvc2xlZXAuYyBiL1JJU0NPUy9zbGVlcC5jCmluZGV4IGM4NWViODYuLmZmZGZmODEgMTAwNjQ0Ci0tLSBhL1JJU0NPUy9zbGVlcC5jCisrKyBiL1JJU0NPUy9zbGVlcC5jCkBAIC05LDMzICs5LDMzIEBACiAKIGludCByaXNjb3Nfc2xlZXAoZG91YmxlIGRlbGF5KQogewotCW9zX3Qgc3RhcnR0aW1lLCBlbmR0aW1lLCB0aW1lOyAvKiBtb25vdG9uaWMgdGltZXMgKGNlbnRpc2Vjb25kcykgKi8KLQlpbnQgKnBvbGx3b3JkLCByZXQ7Ci0Jb3Nib29sIGNsYWltZWQ7CisgICAgb3NfdCBzdGFydHRpbWUsIGVuZHRpbWUsIHRpbWU7IC8qIG1vbm90b25pYyB0aW1lcyAoY2VudGlzZWNvbmRzKSAqLworICAgIGludCAqcG9sbHdvcmQsIHJldDsKKyAgICBvc2Jvb2wgY2xhaW1lZDsKIAotICAgICAgICAvKiBjYWxjdWxhdGUgZW5kIHRpbWUgKi8KLQlzdGFydHRpbWUgPSBvc19yZWFkX21vbm90b25pY190aW1lKCk7Ci0JaWYgKHN0YXJ0dGltZSArIDEwMC4wKmRlbGF5ID5JTlRfTUFYKQotCQllbmR0aW1lID0gSU5UX01BWDsKLQllbHNlCi0JCWVuZHRpbWUgPSAob3NfdCkoc3RhcnR0aW1lICsgMTAwLjAqZGVsYXkpOworICAgIC8qIGNhbGN1bGF0ZSBlbmQgdGltZSAqLworICAgIHN0YXJ0dGltZSA9IG9zX3JlYWRfbW9ub3RvbmljX3RpbWUoKTsKKyAgICBpZiAoc3RhcnR0aW1lICsgMTAwLjAqZGVsYXkgPklOVF9NQVgpCisgICAgICAgIGVuZHRpbWUgPSBJTlRfTUFYOworICAgIGVsc2UKKyAgICAgICAgZW5kdGltZSA9IChvc190KShzdGFydHRpbWUgKyAxMDAuMCpkZWxheSk7CiAKLQkvKiBhbGxvY2F0ZSAoaW4gUk1BKSBhbmQgc2V0IHBvbGx3b3JkIGZvciB4dXBjYWxsX3NsZWVwICovCi0JcG9sbHdvcmQgPSBvc21vZHVsZV9hbGxvYyg0KTsKLQkqcG9sbHdvcmQgPSAxOworICAgIC8qIGFsbG9jYXRlIChpbiBSTUEpIGFuZCBzZXQgcG9sbHdvcmQgZm9yIHh1cGNhbGxfc2xlZXAgKi8KKyAgICBwb2xsd29yZCA9IG9zbW9kdWxlX2FsbG9jKDQpOworICAgICpwb2xsd29yZCA9IDE7CiAKLQl0aW1lID0gc3RhcnR0aW1lOwotCXJldCA9IDA7Ci0Jd2hpbGUgKCB0aW1lPGVuZHRpbWUgJiYgdGltZT49c3RhcnR0aW1lICkgewotCQl4dXBjYWxsX3NsZWVwIChwb2xsd29yZCwgJmNsYWltZWQpOwotCQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQl0aW1lID0gb3NfcmVhZF9tb25vdG9uaWNfdGltZSgpOwotCX0KKyAgICB0aW1lID0gc3RhcnR0aW1lOworICAgIHJldCA9IDA7CisgICAgd2hpbGUgKCB0aW1lPGVuZHRpbWUgJiYgdGltZT49c3RhcnR0aW1lICkgeworICAgICAgICB4dXBjYWxsX3NsZWVwIChwb2xsd29yZCwgJmNsYWltZWQpOworICAgICAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aW1lID0gb3NfcmVhZF9tb25vdG9uaWNfdGltZSgpOworICAgIH0KIAotCS8qIGRlYWxsb2NhdGUgcG9sbHdvcmQgKi8KLQlvc21vZHVsZV9mcmVlKHBvbGx3b3JkKTsKLQlyZXR1cm4gcmV0OworICAgIC8qIGRlYWxsb2NhdGUgcG9sbHdvcmQgKi8KKyAgICBvc21vZHVsZV9mcmVlKHBvbGx3b3JkKTsKKyAgICByZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL21zaXN1cHBvcnQuYyBiL1Rvb2xzL21zaS9tc2lzdXBwb3J0LmMKaW5kZXggZjYwYTM1Ni4uMWZkMmVlNCAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL21zaXN1cHBvcnQuYworKysgYi9Ub29scy9tc2kvbXNpc3VwcG9ydC5jCkBAIC03LDEzICs3LDEzIEBACiAgKi8KIHN0YXRpYyBVSU5UIGRlYnVnKE1TSUhBTkRMRSBoSW5zdGFsbCwgTFBDU1RSIG1zZykKIHsKLQlNU0lIQU5ETEUgaFJlYyA9IE1zaUNyZWF0ZVJlY29yZCgxKTsKLQlpZiAoIWhSZWMgfHwgTXNpUmVjb3JkU2V0U3RyaW5nQShoUmVjLCAxLCBtc2cpICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkJcmV0dXJuIEVSUk9SX0lOU1RBTExfRkFJTFVSRTsKLQl9Ci0JTXNpUHJvY2Vzc01lc3NhZ2UoaEluc3RhbGwsIElOU1RBTExNRVNTQUdFX0lORk8sIGhSZWMpOwotCU1zaUNsb3NlSGFuZGxlKGhSZWMpOwotCXJldHVybiBFUlJPUl9TVUNDRVNTOworICAgIE1TSUhBTkRMRSBoUmVjID0gTXNpQ3JlYXRlUmVjb3JkKDEpOworICAgIGlmICghaFJlYyB8fCBNc2lSZWNvcmRTZXRTdHJpbmdBKGhSZWMsIDEsIG1zZykgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gRVJST1JfSU5TVEFMTF9GQUlMVVJFOworICAgIH0KKyAgICBNc2lQcm9jZXNzTWVzc2FnZShoSW5zdGFsbCwgSU5TVEFMTE1FU1NBR0VfSU5GTywgaFJlYyk7CisgICAgTXNpQ2xvc2VIYW5kbGUoaFJlYyk7CisgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiB9CiAKIC8qIENoZWNrIHdoZXRoZXIgdGhlIFRBUkdFVERJUiBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5LgpAQCAtMjIsMjcgKzIyLDI3IEBACiBVSU5UIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX3N0ZGNhbGwgQ2hlY2tEaXIoTVNJSEFORExFIGhJbnN0YWxsKQogewogI2RlZmluZSBQU0laRSAxMDI0Ci0JV0NIQVIgd3BhdGhbUFNJWkVdOwotCWNoYXIgcGF0aFtQU0laRV07Ci0JVUlOVCByZXN1bHQ7Ci0JRFdPUkQgc2l6ZSA9IFBTSVpFOwotCURXT1JEIGF0dHJpYnV0ZXM7CisgICAgV0NIQVIgd3BhdGhbUFNJWkVdOworICAgIGNoYXIgcGF0aFtQU0laRV07CisgICAgVUlOVCByZXN1bHQ7CisgICAgRFdPUkQgc2l6ZSA9IFBTSVpFOworICAgIERXT1JEIGF0dHJpYnV0ZXM7CiAKLQkKLQlyZXN1bHQgPSBNc2lHZXRQcm9wZXJ0eVcoaEluc3RhbGwsIEwiVEFSR0VURElSIiwgd3BhdGgsICZzaXplKTsKLQlpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiByZXN1bHQ7Ci0Jd3BhdGhbc2l6ZV0gPSBMJ1wwJzsKLQlwYXRoW3NpemVdID0gTCdcMCc7CiAKLQlhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXNXKHdwYXRoKTsKLQlpZiAoYXR0cmlidXRlcyA9PSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUyB8fAotCQkhKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKSAKLQl7Ci0JCXJldHVybiBNc2lTZXRQcm9wZXJ0eUEoaEluc3RhbGwsICJUYXJnZXRFeGlzdHMiLCAiMCIpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBNc2lTZXRQcm9wZXJ0eUEoaEluc3RhbGwsICJUYXJnZXRFeGlzdHMiLCAiMSIpOwotCX0KKyAgICByZXN1bHQgPSBNc2lHZXRQcm9wZXJ0eVcoaEluc3RhbGwsIEwiVEFSR0VURElSIiwgd3BhdGgsICZzaXplKTsKKyAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgd3BhdGhbc2l6ZV0gPSBMJ1wwJzsKKyAgICBwYXRoW3NpemVdID0gTCdcMCc7CisKKyAgICBhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXNXKHdwYXRoKTsKKyAgICBpZiAoYXR0cmlidXRlcyA9PSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUyB8fAorICAgICAgICAhKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1zaVNldFByb3BlcnR5QShoSW5zdGFsbCwgIlRhcmdldEV4aXN0cyIsICIwIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE1zaVNldFByb3BlcnR5QShoSW5zdGFsbCwgIlRhcmdldEV4aXN0cyIsICIxIik7CisgICAgfQogfQogCiAvKiBVcGRhdGUgdGhlIHN0YXRlIG9mIHRoZSBSRUdJU1RSWS50Y2wgY29tcG9uZW50IGFjY29yZGluZyB0byB0aGUKQEAgLTUxLDQxICs1MSw0MSBAQAogICovCiBVSU5UIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX3N0ZGNhbGwgVXBkYXRlRWRpdElETEUoTVNJSEFORExFIGhJbnN0YWxsKQogewotCUlOU1RBTExTVEFURSBleHRfb2xkLCBleHRfbmV3LCB0Y2xfb2xkLCB0Y2xfbmV3LCByZWdfbmV3OwotCVVJTlQgcmVzdWx0OworICAgIElOU1RBTExTVEFURSBleHRfb2xkLCBleHRfbmV3LCB0Y2xfb2xkLCB0Y2xfbmV3LCByZWdfbmV3OworICAgIFVJTlQgcmVzdWx0OwogCi0JcmVzdWx0ID0gTXNpR2V0RmVhdHVyZVN0YXRlQShoSW5zdGFsbCwgIkV4dGVuc2lvbnMiLCAmZXh0X29sZCwgJmV4dF9uZXcpOwotCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIHJlc3VsdDsKLQlyZXN1bHQgPSBNc2lHZXRGZWF0dXJlU3RhdGVBKGhJbnN0YWxsLCAiVGNsVGsiLCAmdGNsX29sZCwgJnRjbF9uZXcpOwotCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBNc2lHZXRGZWF0dXJlU3RhdGVBKGhJbnN0YWxsLCAiRXh0ZW5zaW9ucyIsICZleHRfb2xkLCAmZXh0X25ldyk7CisgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIHJlc3VsdCA9IE1zaUdldEZlYXR1cmVTdGF0ZUEoaEluc3RhbGwsICJUY2xUayIsICZ0Y2xfb2xkLCAmdGNsX25ldyk7CisgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmVzdWx0OwogCi0JLyogSWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgQWJzZW50LCBhbmQgdGhlIHVzZXIgZGlkIG5vdCBzZWxlY3QKLQkgICB0aGUgZmVhdHVyZSBpbiB0aGUgVUksIEluc3RhbGxlciBhcHBhcmVudGx5IHNldHMgdGhlICJzZWxlY3RlZCIKLQkgICBzdGF0ZSB0byB1bmtub3duLiBVcGRhdGUgaXQgdG8gdGhlIGN1cnJlbnQgdmFsdWUsIHRoZW4uICovCi0JaWYgKGV4dF9uZXcgPT0gSU5TVEFMTFNUQVRFX1VOS05PV04pCi0JCWV4dF9uZXcgPSBleHRfb2xkOwotCWlmICh0Y2xfbmV3ID09IElOU1RBTExTVEFURV9VTktOT1dOKQotCQl0Y2xfbmV3ID0gdGNsX29sZDsKKyAgICAvKiBJZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBBYnNlbnQsIGFuZCB0aGUgdXNlciBkaWQgbm90IHNlbGVjdAorICAgICAgIHRoZSBmZWF0dXJlIGluIHRoZSBVSSwgSW5zdGFsbGVyIGFwcGFyZW50bHkgc2V0cyB0aGUgInNlbGVjdGVkIgorICAgICAgIHN0YXRlIHRvIHVua25vd24uIFVwZGF0ZSBpdCB0byB0aGUgY3VycmVudCB2YWx1ZSwgdGhlbi4gKi8KKyAgICBpZiAoZXh0X25ldyA9PSBJTlNUQUxMU1RBVEVfVU5LTk9XTikKKyAgICAgICAgZXh0X25ldyA9IGV4dF9vbGQ7CisgICAgaWYgKHRjbF9uZXcgPT0gSU5TVEFMTFNUQVRFX1VOS05PV04pCisgICAgICAgIHRjbF9uZXcgPSB0Y2xfb2xkOwogCi0JLy8gWFhYIGNvbnNpZGVyIGN1cnJlbnQgc3RhdGUgb2YgUkVHSVNUUlkudGNsPwotCWlmICgoKHRjbF9uZXcgPT0gSU5TVEFMTFNUQVRFX0xPQ0FMKSB8fAotCQkgKHRjbF9uZXcgPT0gSU5TVEFMTFNUQVRFX1NPVVJDRSkgfHwKLQkJICh0Y2xfbmV3ID09IElOU1RBTExTVEFURV9ERUZBVUxUKSkgJiYKLQkJKChleHRfbmV3ID09IElOU1RBTExTVEFURV9MT0NBTCkgfHwKLQkJIChleHRfbmV3ID09IElOU1RBTExTVEFURV9TT1VSQ0UpIHx8Ci0JCSAoZXh0X25ldyA9PSBJTlNUQUxMU1RBVEVfREVGQVVMVCkpKSB7Ci0JCXJlZ19uZXcgPSBJTlNUQUxMU1RBVEVfU09VUkNFOwotCX0gZWxzZSB7IAotCQlyZWdfbmV3ID0gSU5TVEFMTFNUQVRFX0FCU0VOVDsKLQl9Ci0JcmVzdWx0ID0gTXNpU2V0Q29tcG9uZW50U3RhdGVBKGhJbnN0YWxsLCAiUkVHSVNUUlkudGNsIiwgcmVnX25ldyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvLyBYWFggY29uc2lkZXIgY3VycmVudCBzdGF0ZSBvZiBSRUdJU1RSWS50Y2w/CisgICAgaWYgKCgodGNsX25ldyA9PSBJTlNUQUxMU1RBVEVfTE9DQUwpIHx8CisgICAgICAgICAgICAgKHRjbF9uZXcgPT0gSU5TVEFMTFNUQVRFX1NPVVJDRSkgfHwKKyAgICAgICAgICAgICAodGNsX25ldyA9PSBJTlNUQUxMU1RBVEVfREVGQVVMVCkpICYmCisgICAgICAgICgoZXh0X25ldyA9PSBJTlNUQUxMU1RBVEVfTE9DQUwpIHx8CisgICAgICAgICAoZXh0X25ldyA9PSBJTlNUQUxMU1RBVEVfU09VUkNFKSB8fAorICAgICAgICAgKGV4dF9uZXcgPT0gSU5TVEFMTFNUQVRFX0RFRkFVTFQpKSkgeworICAgICAgICByZWdfbmV3ID0gSU5TVEFMTFNUQVRFX1NPVVJDRTsKKyAgICB9IGVsc2UgeworICAgICAgICByZWdfbmV3ID0gSU5TVEFMTFNUQVRFX0FCU0VOVDsKKyAgICB9CisgICAgcmVzdWx0ID0gTXNpU2V0Q29tcG9uZW50U3RhdGVBKGhJbnN0YWxsLCAiUkVHSVNUUlkudGNsIiwgcmVnX25ldyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotQk9PTCBBUElFTlRSWSBEbGxNYWluKEhBTkRMRSBoTW9kdWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICBEV09SRCAgdWxfcmVhc29uX2Zvcl9jYWxsLCAKK0JPT0wgQVBJRU5UUlkgRGxsTWFpbihIQU5ETEUgaE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICBEV09SRCAgdWxfcmVhc29uX2Zvcl9jYWxsLAogICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFJlc2VydmVkKQogewogICAgIHJldHVybiBUUlVFOwo=